From 0652600959e5e3b5796fb6e8da129704ca95347a Mon Sep 17 00:00:00 2001
From: Ldc <ldc@vci.com>
Date: 星期日, 07 四月 2024 10:41:02 +0800
Subject: [PATCH] 项目上传

---
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/securityManage/SmFunction.js                                   |  884 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/WFWorkflowNodeFavItemDTO.java                                       |   66 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsUsedAttributeVO.java                                        |   90 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseLinkAddAction.js                                   |  256 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/er/css/app.5c53683c.css                          |    1 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WFWorkflowNodeFavServiceImpl.java                          |  373 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-sidebarToggle-rtl.png              |    0 
 Source/platformProject/platform2022UI/style/images/base/menu/standardGradient.png                                                         |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/ProcessNodeUseDTO.java                                              |   37 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/HKm471-B5-H.bcmap                                 |    0 
 Source/platformProject/platform2022UI/mainAdmin.html                                                                                      |  108 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/CNS-EUC-H.bcmap                                   |    0 
 Source/platformProject/platform2022UI/style/images/base/flow/mail.png                                                                     |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/plainpaste/plainpaste.js                                             |   41 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/da/viewer.properties                             |  242 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/124.gif                                             |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/60.gif                                              |    0 
 Source/platformProject/platform2022UI/style/images/base/button/importExcel.png                                                            |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/27.gif                                                          |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/WFWorkflowNodeFavDO.java                                          |  122 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/orgs/OrgPosition.js                                            |  372 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/designer.js                       |  523 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/dltable.js                                                      | 2259 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/refer/OrgDepartmentGridRefer.js                                         |   64 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/LoginServiceImpl.java                                      |  488 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/43.gif                                                          |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/compatibility/SmRoleQueryServiceI.java                        |  153 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/dropdown.js                                                     |  528 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/VciFileObjectServiceImpl.java                              |  539 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS2004-UTF32-V.bcmap                          |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/Thumbs.db                        |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/annotation-note.svg                              |   42 
 Source/platformProject/platform2022UI/style/font/loginform-icon.svg                                                                       |   42 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/alicon/iconfont.woff                                                        |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Katakana.bcmap                                    |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/UIEngineServiceImpl.java                                   | 1567 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/img/manual-task.png               |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ru/viewer.properties                             |  242 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ur/viewer.properties                             |  207 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/VciOsStatus.js                                   |  278 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/44.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-pageDown-rtl.png                   |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/108.gif                                             |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/133.gif                                             |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-sidebarToggle-rtl@2x.png           |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/es-MX/viewer.properties                          |  242 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/VciOsLifeCycle.js                                |  462 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ast/viewer.properties                            |  197 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/constant/FileTypeConstants.java                                         |   12 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/OsCodeSerialNumberDO.java                                         |   75 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/18.gif                                                          |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/B5pc-V.bcmap                                      |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/kk/viewer.properties                             |  242 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-GB1-1.bcmap                                 |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Ext-V.bcmap                                       |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ko/viewer.properties                             |  242 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/pdfobject.js                                                |  178 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/layer.old.js                                                    | 1329 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/PlatformWebApplication.java                                                 |   44 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/baidumap/map.html                                                    |   43 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-search.png                         |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/hr/viewer.properties                             |  184 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/de/viewer.properties                             |  229 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/BaseLinkModel.java                                                |  230 
 Source/platformProject/vci-platform-web/settings.xml                                                                                      |  118 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/kindeditor-all-min.js                                                        |  352 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-Korea1-1.bcmap                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/nl/viewer.properties                             |  242 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/portal/vciBaseTaskPortlet.js                                            |   94 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/annotation/VciTransactional.java                                        |   19 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS-UTF8-V.bcmap                               |    0 
 Source/platformProject/platform2022UI/jslib/yaml/js/codemirror.js                                                                         | 9803 +
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/portal/vciBaseFavPortlet.js                                             |  108 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmFunctionQueryServicePlatformImpl.java    |  688 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/VciFileVolumeDaoI.java                                              |  100 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/pagebreak/pagebreak.js                                               |   29 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/117.gif                                             |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/WFWorkflowNodeFavItemDaoImpl.java                              |  206 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/VciFileDocClassifyServiceImpl.java                         |  415 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/loading-icon.gif                                 |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/jquery.js                                                       | 10987 +
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/loading-small.png                                |    0 
 Source/platformProject/platform2022UI/style/images/base/button/in.png                                                                     |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/98.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/grabbing.cur                                     |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/nso/viewer.properties                            |  130 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/lo/viewer.properties                             |  152 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WebContextInfoFetcher.java                                 |   84 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/BdSelectInputCharDaoI.java                                          |  127 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/36.gif                                                          |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-documentProperties.png    |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/ProcessTaskVO.java                                            |  218 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/HKgccs-B5-H.bcmap                                 |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/lay.js                                                          |  418 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/VciFileDownloadServiceI.java                                    |  189 
 Source/platformProject/platform2022UI/style/images/base/button/trans.png                                                                  |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/securityManage/VciSmRole.js                                    |  535 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/WFWorkflowNodeFavItemServiceI.java                              |   99 
 Source/platformProject/platform2022UI/main.html                                                                                           |  153 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/EUC-V.bcmap                                       |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/28.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebCheckSession.js                                         |  164 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WebBtmIOServiceImpl.java                                   | 1335 
 Source/platformProject/platform2022UI/style/images/base/button/table_cleanref.png                                                         |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/pagemodel/SmRoleVO.java                                       |  113 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebAdvSearch.js                                            |  959 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/51.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/refer/OrgDutyRefer.js                                                   |   60 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WebSecretServiceImpl.java                                  |  379 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/6.gif                                               |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebUIController.java                                         |   83 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/event/End.js                      |   91 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/OsCodeRuleElementDO.java                                          |  443 
 Source/platformProject/vci-platform-web/src/main/resources/i18n/messages_zh_CN.properties                                                 |  105 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/HKdla-B5-H.bcmap                                  |    0 
 Source/platformProject/platform2022UI/platform2020UI.iml                                                                                  |    8 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-Japan1-4.bcmap                              |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/62.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/KSC-H.bcmap                                       |    0 
 Source/platformProject/platform2022UI/style/images/base/button/table_modify.png                                                           |    0 
 Source/platformProject/platform2022UI/style/images/base/index/dm_index_menu_bus.png                                                       |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebStartProcess.js                                           |  885 
 Source/platformProject/platform2022UI/index.html                                                                                          |   78 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/41.gif                                                          |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/right_icon.gif                         |    0 
 Source/platformProject/platform2022UI/style/images/base/menu/lockwindow.png                                                               |    0 
 Source/platformProject/platform2022UI/style/images/base/button/disk.png                                                                   |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/insertfile/insertfile.js                                             |  138 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GB-V.bcmap                                        |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/themes/default/default.css                                                   | 1148 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/tn/viewer.properties                             |   83 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Ext-RKSJ-H.bcmap                                  |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBpc-EUC-V.bcmap                                  |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/61.gif                                                          |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/VciOsStatusRefer.js                              |   60 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/WP-Symbol.bcmap                                   |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/42.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniGB-UTF16-V.bcmap                               |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/WFWorkflowNodeFavItemVO.java                                  |  116 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/HKm314-B5-H.bcmap                                 |    0 
 Source/platformProject/platform2022UI/jslib/vcijs/main.js                                                                                 |  291 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/clearhtml/clearhtml.js                                               |   29 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/106.gif                                             |    0 
 Source/platformProject/vci-platform-server-starter/pom.xml                                                                                |  585 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/29.gif                                                          |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/lv.gif                                 |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/constant/WebLangCodeConstant.java                                       |   33 
 Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_ADD.md                                                               |  150 
 Source/platformProject/platform2022UI/style/images/base/login/login_pw.png                                                                |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/UIDataServiceI.java                                             |  252 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/35.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/font/iconfont.eot                                                           |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/WebSecretServiceI.java                                          |  123 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/FormDataDTO.java                                                    |   31 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/fileManage/VciFileDocClassify.js                               |  266 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/1.gif                                                           |    0 
 Source/platformProject/vci-platform-web/README.md                                                                                         |   96 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsEnumItemVO.java                                             |  196 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/78-H.bcmap                                        |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/OsScanAnnotationTool.java                                          |  777 
 Source/platformProject/platform2022UI/jslib/yaml/js/js-yaml.min.js                                                                        |    2 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/131.gif                                             |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/VciOsStatusController.java                                   |  102 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/78-EUC-H.bcmap                                    |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/rm/viewer.properties                             |  242 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/71.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/annotation-insert.svg                            |   10 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/119.gif                                             |    0 
 Source/platformProject/platform2022UI/vciweb/mdm/CodeClassify.js                                                                          | 3247 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/compatibility/OrgDeptQueryServiceI.java                       |  117 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/xmlmodel/UIComponentDetailXO.java                                       |   71 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/8.gif                                               |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/plugins/controller/Sql2TableController.java                                 |   97 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/xmlmodel/UIComponentItemXO.java                                         |  806 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/build/pdf.worker.js.map                                     |    1 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/37.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseAction.js                                          |  318 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/template/html/2.html                                                 |   42 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/lg/viewer.properties                             |  112 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/OsLifeCycleServiceI.java                                        |  190 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/ProcessInstance.java                                              |   56 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-viewOutline-rtl.png                |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/OsBtmServiceI.java                                              |  125 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsLifeCycleLineBoundVO.java                                   |  113 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/mobile/upload-mobile.js                                         |  166 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/viewer.html                                             |  395 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-firstPage@2x.png          |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/orgs/vciWebPost.js                                             |  114 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/themes/common/media.gif                                                      |    0 
 Source/platformProject/platform2022UI/style/images/base/button/table_refresh.png                                                          |    0 
 Source/platformProject/platform2022UI/style/images/base/button/information.png                                                            |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmRoleQueryServiceImpl.java                |  532 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/VciMdServiceImpl.java                                      |  136 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebProBusinessData.js                                        |  228 
 Source/platformProject/vci-platform-web/src/main/resources/log4j2-spring-prod.xml                                                         |   95 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/126.gif                                             |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/34.gif                                                          |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-sidebarToggle@2x.png               |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/sq/viewer.properties                             |  233 
 Source/platformProject/platform2022UI/style/images/base/flow/gateway.png                                                                  |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsCodeRuleElementVO.java                                      |  416 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/KSC-Johab-H.bcmap                                 |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ff/viewer.properties                             |  201 
 Source/platformProject/platform2022UI/style/css/layuimodify.css                                                                           |  596 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/pl/viewer.properties                             |  179 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/23.gif                                                          |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-viewThumbnail.png                  |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/enumpck/UITreeLoadTypeEnum.java                                         |   95 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/128.gif                                             |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/48.gif                                              |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/enumpck/ResourceControlTypeEnum.java                          |  100 
 Source/platformProject/platform2022UI/config.json                                                                                         |   42 
 Source/platformProject/platform2022UI/vciweb/mdm/CodeSerialAlgorithm.js                                                                   |   86 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniGB-UTF32-V.bcmap                               |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebRefer.js                                                |  263 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UITreeTableDefineVO.java                                      |   75 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/upload.js                                                       |  616 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/plugins/controller/AuditTaskController.java                                 |  119 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/lang/en.js                                                                   |  232 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/LoginServiceI.java                                              |   39 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/lan.gif                                |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsLinkTypeAttributeVO.java                                    |  390 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/63.gif                                                          |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/portal/vciBaseCalPortlet.js                                             |   40 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/87.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/54.gif                                                          |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/constant/FrameWorkBtmTypeConstant.java                        |  215 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsLifeCycleLineEventDTO.java                                        |   91 
 Source/platformProject/platform2022UI/indexAdmin.html                                                                                     |   72 
 Source/platformProject/vci-platform-web/src/main/resources/i18n/messages.properties                                                       |  106 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/md.html                                          |   53 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsEnumVO.java                                                 |  249 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-selectTool.png            |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-spreadEven.png            |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/refer/SmWorkTypeRefer.js                                                |   59 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/33.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/join.gif                               |    0 
 Source/platformProject/platform2022UI/vciweb/mdm/CodeClassifyTemplateAttr.js                                                              | 1332 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/annotation/FlowNotifyAfter.java                                         |   18 
 Source/platformProject/platform2022UI/vciweb/mes/wrj/PmAlonePlan.js                                                                       |  441 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-Korea1-UCS2.bcmap                           |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniKS-UCS2-V.bcmap                                |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebReferClassify.js                                        |  323 
 Source/platformProject/platform2022UI/vciweb/mdm/CodeGroupExportRule.js                                                                   |  618 
 Source/platformProject/platform2022UI/vciweb/mdm/MdmEngine.js                                                                             | 1387 
 Source/platformProject/platform2022UI/style/images/base/button/comments.png                                                               |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/OsCodeGenSchemaDaoImpl.java                                    |  128 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/er/js/chunk-vendors.80f2064b.js                  |    8 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/OsAttributeDO.java                                                |  173 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsAttributeUtil.js                               |  111 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WebLoServiceImpl.java                                      |  834 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/wo/viewer.properties                             |  124 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ca/viewer.properties                             |  207 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/pagemodel/OrgDutyVO.java                                      |   68 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/fen2.gif                               |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseFileDownloadAction.js                              |  176 
 Source/platformProject/platform2022UI/style/images/base/button/trash.gif                                                                  |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/properties.gif                   |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ms/viewer.properties                             |  242 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/hui.gif                                |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/73.gif                                              |    0 
 Source/platformProject/platform2022UI/style/images/ie.png                                                                                 |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/table/table.js                                                       |  705 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/modules/layer/default/loading-0.gif                                     |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/fa/viewer.properties                             |  201 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS-UCS2-H.bcmap                               |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/as/viewer.properties                             |  167 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/2.gif                                               |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/css/style.css                                 |   91 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/treeitem-collapsed-rtl@2x.png                    |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/FormDataDTOList.java                                                |   35 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Roman.bcmap                                       |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/113.gif                                             |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/themes/default/background.png                                                |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/17.gif                                              |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/OsCodeRuleServiceImpl.java                                 |  949 
 Source/platformProject/platform2022UI/vciweb/vciAlias.js                                                                                  |  102 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdSupplierAdmittance.js                                |  366 
 Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_DEL.md                                                               |   48 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/pagemodel/MenuVO.java                                         |  262 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/alicon/alicon.css                                                           |  113 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/flash/flash.js                                                       |  161 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/redis/RedisService.java                                                 |  307 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/NWP-V.bcmap                                       |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/VciProcessDesigner.js                         |  125 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/modules/layer/default/icon-ext.png                                      |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/VciFileVolumeDaoImpl.java                                      |  182 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/VciDataBaseConnect.js                            |  356 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdUnit.js                                              |  242 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-CNS1-5.bcmap                                |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/delete.gif                             |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UIFieldSortVO.java                                            |   48 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/fileManage/VciFileStore.js                                     |  495 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsAttribute.js                                   |  162 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/68.gif                                                          |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/25.gif                                                          |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/table.old.js                                                    | 2180 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/SmFunctionController.java                                    |   98 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/fr/viewer.properties                             |  242 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/31.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/nn-NO/viewer.properties                          |  242 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/OsLinkTypeServiceImpl.java                                 |  337 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/zh_CN.gif                              |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/code/code.js                                                         |   62 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/en-US/viewer.properties                          |  242 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebReferGrid.js                                            |  344 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/ProcessUserVO.java                                            |  111 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-scrollWrapped.png         |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/WFWorkflowNodeFavVO.java                                      |  113 
 Source/platformProject/vci-platform-web/src/main/resources/codeTemplate/ui.js.vm                                                          |  608 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniKS-UTF32-H.bcmap                               |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-spreadNone@2x.png         |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/constant/WFVariablesKeyConstant.java                                    |   94 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdSupplier.js                                          |  668 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniCNS-UTF16-V.bcmap                              |    0 
 Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_EDIT.md                                                              |  173 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/SmOperationServiceImpl.java                                |  116 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/image/images/align_top.gif                                           |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-CNS1-2.bcmap                                |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/MyCanvas.js                       |  154 
 Source/platformProject/platform2022UI/style/images/base/index/dm_index_unfav.png                                                          |    0 
 Source/platformProject/platform2022UI/style/images/base/index/dm_index_notification.png                                                   |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/font/iconfont.woff2                                                         |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/65.gif                                                          |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-sidebarToggle.png                  |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WFWorkflowNodeFavController.java                             |  149 
 Source/platformProject/platform2022UI/style/images/base/flow/end.png                                                                      |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseTabViewAction.js                                   |  108 
 Source/platformProject/platform2022UI/vciweb/mes/wrj/PmSalePlanAccord.js                                                                  |  323 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/CNS2-H.bcmap                                      |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsERRelationVO.java                                           |   75 
 Source/platformProject/platform2022UI/style/css/markdown.min.css                                                                          |  230 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/46.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/89.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/52.gif                                                          |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/themes/qq/qq.css                                                             |  143 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/autoheight/autoheight.js                                             |   27 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/90msp-RKSJ-H.bcmap                                |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseViewAction.js                                      |  216 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/kindeditor-all.js                                                            | 10084 +
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/et/viewer.properties                             |  242 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/gn/viewer.properties                             |  242 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/hi-IN/viewer.properties                          |  214 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBK-EUC-V.bcmap                                   |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/eu/viewer.properties                             |  242 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/50.gif                                                          |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/bo/OsAttrOtherInfoBO.java                                               |   89 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/4.gif                                               |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/validatebox_pointer.gif                |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdCustomerSaleClassify.js                              |  254 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-CNS1-0.bcmap                                |    0 
 Source/platformProject/platform2022UI/style/css/common.css                                                                                |  168 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/kn/viewer.properties                             |  193 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/19.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/developer/logs/VciLogMonitor.js                                |  101 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.business.rule.png           |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/activate.gif                           |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/en_US.gif                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/table.js                                                        | 3008 
 Source/platformProject/platform2022UI/style/images/base/index/dm_index_exit.png                                                           |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniCNS-UCS2-H.bcmap                               |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/controller/OrgDutyQueryController.java                        |   63 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/KSCms-UHC-HW-H.bcmap                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/38.gif                                                          |    0 
 Source/platformProject/platform2022UI/style/font/loginform-icon.ttf                                                                       |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/115.gif                                             |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/75.gif                                              |    0 
 Source/platformProject/platform2022UI/style/images/base/button/up.gif                                                                     |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/alicon/iconfont.ttf                                                         |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.gateway.inclusive.png       |    0 
 Source/platformProject/platform2022UI/style/images/base/spriteRoundedIconsSmallBl.png                                                     |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/er/js/app.24d70361.js                            |  218 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsCodeEnumDTO.java                                                  |   75 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/carousel.js                                                     |  314 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/VciFileDocClassifyDaoI.java                                         |  108 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/VciProcessTemplate.js                                  |  171 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdSupplierClassify.js                                  |  384 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/grab.cur                                         |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/78-RKSJ-H.bcmap                                   |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/VciFileObjectDO.java                                              |  291 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-Japan1-UCS2.bcmap                           |    0 
 Source/platformProject/platform2022UI/jslib/metaQueryForIe8/respond.min.js                                                                |    5 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBTpc-EUC-V.bcmap                                 |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/bo/OsCodeGenAttributeBO.java                                            |  506 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-viewAttachments@2x.png             |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/21.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-zoomOut@2x.png                     |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/nb-NO/viewer.properties                          |  242 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/redis/FastJson2JsonRedisSerializer.java                                 |   71 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/58.gif                                                          |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/66.gif                                                          |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/image/images/align_right.gif                                         |    0 
 Source/platformProject/vci-platform-web/src/main/resources/properties/corba.properties                                                    |  171 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/logout.png                             |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/baidumap/index.html                                                  |   83 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseLinkEditAction.js                                  |  294 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/VciFileObjectDaoI.java                                              |  132 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdSupplierRefer.js                                     |  343 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/monitor/VciMonitorMain.js                                      |   73 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-viewAttachments.png                |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/WebLoServiceI.java                                              |  314 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/OsAttributeServiceImpl.java                                |  437 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ta/viewer.properties                             |  201 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/process.gif                      |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/controller/SmUserQueryController.java                         |  121 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-Japan1-1.bcmap                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/treeGrid.js                                                     |   21 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/event/Start.js                    |   97 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsLifeCycleVO.java                                            |  248 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/SmFavFunctionServiceI.java                                      |   35 
 Source/platformProject/platform2022UI/vciweb/mes/wrj/PmPlaneItem.js                                                                       |  359 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/68.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/11.gif                                                          |    0 
 Source/platformProject/platform2022UI/vciweb/mes/wrj/PmSalePlanTarget.js                                                                  |  395 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/ETHK-B5-V.bcmap                                   |    0 
 Source/platformProject/platform2022UI/style/css/dm-button.css                                                                             |  125 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Add-V.bcmap                                       |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebProExecuteTask.js                                         |  291 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/OsLinkTypeDO.java                                                 |  172 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/VciFileDocClassifyDO.java                                         |   75 
 Source/platformProject/platform2022UI/style/images/base/login/code.png                                                                    |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/90pv-RKSJ-H.bcmap                                 |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsCodeRuleDTO.java                                                  |  181 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/pagemodel/SmUserVO.java                                       |  393 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/HKscs-B5-H.bcmap                                  |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.gateway.exclusive.png       |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdWarehouseClassify.js                                 |  323 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/ETenms-B5-V.bcmap                                 |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/59.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniCNS-UTF8-V.bcmap                               |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/OsStatusServiceImpl.java                                   |  367 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/12.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdMaterial.js                                          | 1343 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/image/image.js                                                       |  318 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ach/viewer.properties                            |  207 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/portal/vciDefaultIndex.js                                               |   99 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/enumpck/RoleControlAreaEnum.java                              |  109 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/bo/OsCodeGenButtonBO.java                                               |   57 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/HKscs-B5-V.bcmap                                  |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebBtmTypeController.java                                    |  253 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/anchor/anchor.js                                                     |   46 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsEnum.js                                        |  168 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/draw2d/draw2d.js                              | 10427 +
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/enumpck/UIFieldTypeEnum.java                                            |  156 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/is/viewer.properties                             |  214 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/browseButton.png                       |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/5.gif                                                           |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/edit.gif                               |    0 
 Source/platformProject/platform2022UI/style/images/base/button/table_copy.png                                                             |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ne-NP/viewer.properties                          |  184 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/map/map.html                                                         |   57 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-rotateCw@2x.png           |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UITableCustomDefineVO.java                                    |   77 
 Source/platformProject/platform2022UI/style/images/base/button/tree_leaf.gif                                                              |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/OsAttributeController.java                                   |   37 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/model/SmFunctionForPlatform1.java                             |  247 
 Source/platformProject/platform2022UI/style/images/base/flow/painterBg.png                                                                |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/77.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/te/viewer.properties                             |  213 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/multiimage/images/image.png                                          |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/83.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/formulaEditor.js                                              |  466 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/constant/BtmIdConstant.java                                             |   43 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/83pv-RKSJ-H.bcmap                                 |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-pageUp-rtl.png                     |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/enumpck/UILayoutAreaTypeEnum.java                                       |  105 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebUIDataController.java                                     |  188 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsAttributeVO.java                                            |  346 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/B5-H.bcmap                                        |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniGB-UCS2-H.bcmap                                |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Add-RKSJ-H.bcmap                                  |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/UIEngineServiceI.java                                           |  215 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/er/erContent.html                                |   19 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/102.gif                                             |    0 
 Source/platformProject/vci-platform-web/src/main/resources/i18n/messages_zh_TW.properties                                                 |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/21.gif                                                          |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/bo/OsCodeGenQueryBO.java                                                |   44 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/78ms-RKSJ-V.bcmap                                 |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebPortal.js                                               |  785 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBTpc-EUC-H.bcmap                                 |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/orgs/orgsDepartment.js                                         |  362 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/be/viewer.properties                             |  242 
 Source/platformProject/platform2022UI/jslib/markdown/marked2.1.3.js                                                                       | 2986 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/23.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/66.gif                                              |    0 
 Source/platformProject/vci-platform-web/src/main/resources/md/CUSTOMER_UI.md                                                              |   37 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/90ms-RKSJ-H.bcmap                                 |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/brx/viewer.properties                            |  167 
 Source/platformProject/platform2022UI/vciweb/mdm/refer/CodeClassTemplateRefer.js                                                          |  341 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Add-H.bcmap                                       |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/RKSJ-V.bcmap                                      |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/enumpck/OsCodeProductTypeEnum.java                                      |  130 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/90.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/56.gif                                                          |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/13.gif                                                          |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/modules/layer/default/loading-1.gif                                     |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/bg/viewer.properties                             |  242 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-selectTool@2x.png         |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/texture.png                                      |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/85.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/KSCms-UHC-V.bcmap                                 |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdGoodsLocation.js                                     |  420 
 Source/platformProject/platform2022UI/jslib/vcijs/vciWebUtil.js                                                                           | 1655 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ak/viewer.properties                             |  130 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/en-ZA/viewer.properties                          |  170 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/WebHomeTaskServiceI.java                                        |   57 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/OsEnumServiceImpl.java                                     |  471 
 Source/platformProject/platform2022UI/jslib/vcijs/singleLogin.js                                                                          |  165 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.gateway.parallel.png        |    0 
 Source/platformProject/platform2022UI/vciweb/CreateAuditTask.js                                                                           |  307 
 Source/platformProject/platform2022UI/style/images/base/login/userphotowoman.png                                                          |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/0.gif                                               |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/hu/viewer.properties                             |  242 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/14.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.subprocess.collapsed.png    |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/model/SmPasswordStrategyForPlatform1.java                     |  252 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebDataRightCheck.js                                       |  164 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-lastPage.png              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/task/BaseTask.js                  |   52 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmSessionForLoginImpl.java                 |  239 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/enumpck/OsCodeDateValueTypeEnum.java                                    |  129 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UIFormItemVO.java                                             |  347 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-pageUp-rtl@2x.png                  |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/ETenms-B5-H.bcmap                                 |    3 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/lifeCycle/FileObjectLCStatus.java                                       |  125 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/query/UITreeRootQuery.java                                              |  119 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/3.gif                                                           |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsLinkTypeDTO.java                                                  |  205 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/49.gif                                                          |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/annotation-help.svg                              |   26 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/57.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/unchecked.gif                          |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-Japan1-5.bcmap                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsBtmType.js                                     |  354 
 Source/platformProject/platform2022UI/jslib/jquery/jquery-1.8.2.min.js                                                                    |    2 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebDataGrid.js                                             |  212 
 Source/platformProject/platform2022UI/style/images/base/button/table_sync.png                                                             |    0 
 Source/platformProject/platform2022UI/vciweb/mdm/refer/CodeClassTemplateAttrRefer.js                                                      |  344 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/VciFilePreviewConfigVO.java                                   |   89 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/designer.css                      |  203 
 Source/platformProject/platform2022UI/vciweb/mdm/SysIntAuthority.js                                                                       |  344 
 Source/platformProject/vci-platform-web/src/main/resources/compatibility_field_map.yml                                                    |    5 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/104.gif                                             |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/110.gif                                             |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS-UTF16-V.bcmap                              |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/WFProcessTemplateDO.java                                          |  101 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/FilePreviewBase.js                                          |  436 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/son/viewer.properties                            |  180 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/VciFileQueryController.java                                  |  215 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/92.gif                                              |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/WebProcessDaoI.java                                                 |  405 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/picture_go.png                         |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/rate.js                                                         |   78 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebProExecutingTab.js                                        |  615 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-spreadEven@2x.png         |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJISX02132004-UTF32-H.bcmap                     |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/kindeditor.js                                                                | 5889 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/map/map.js                                                           |  137 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniCNS-UTF16-H.bcmap                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/callactivity.png                 |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsCodeRuleVO.java                                             |  164 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/zh-TW/viewer.properties                          |  242 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/VciMd.js                                         |   71 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-rotateCw.png              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/90msp-RKSJ-V.bcmap                                |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.user.png                    |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsRevisionRuleDTO.java                                              |  162 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.annotation.png              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebReminder.js                                             |   89 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/64.gif                                              |    0 
 Source/platformProject/platform2022UI/style/images/base/button/comment_delete.png                                                         |    0 
 Source/platformProject/platform2022UI/style/images/base/buttonEnabled.png                                                                 |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-Japan1-6.bcmap                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.loopmarker.png              |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/OsCodeRuleDO.java                                                 |  188 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniCNS-UTF32-V.bcmap                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/help.png                               |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/controller/OrgDepartmentQueryController.java                  |   50 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS-UCS2-HW-H.bcmap                            |    0 
 Source/platformProject/platform2022UI/vciweb/mdm/refer/CodeClassifyAttrRefer.js                                                           |  354 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsWebApi.js                                      |  116 
 Source/platformProject/vci-platform-web/src/main/resources/wordTemplate/dataBaseExport.doc                                                |    0 
 Source/platformProject/platform2022UI/style/images/base/button/preview.png                                                                |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/15.gif                                                          |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/si/viewer.properties                             |  171 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/9.gif                                               |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/fileManage/VciFileList.js                                      |  329 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/CNS1-H.bcmap                                      |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/config/WebFilePreviewAutoConfig.java                                    |   66 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebProMonitor.js                                             |  458 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/lan2.gif                               |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/layer.js                                                        | 1427 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/draw2d/wz_jsgraphics.js                       | 1108 
 Source/platformProject/platform2022UI/jslib/jquery/jquery.easyui.min.js                                                                   | 17827 ++
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/71.gif                                                          |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/25.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/emoticons.js                                               |  129 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/hua.gif                                |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/deactivate.gif                         |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniGB-UTF8-V.bcmap                                |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/lifeCycle/ReleaseDataLCStatus.java                                      |  115 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/BdSelectInputCharController.java                             |  128 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-Japan1-2.bcmap                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBK2K-V.bcmap                                     |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/tree.js                                                         | 1093 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/OsLifeCycleDO.java                                                |  172 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/alicon/iconfont.svg                                                         |   98 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/WFWorkflowNodeFavItemDaoI.java                                      |  114 
 Source/platformProject/platform2022UI/jslib/vcijs/showTodo.js                                                                             |  104 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/WebProcessCommandServiceI.java                                  |  133 
 Source/platformProject/platform2022UI/style/images/base/button/unReadMsg.png                                                              |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/kindeditor-min.js                                                            |  181 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/lang/zh_CN.js                                                                |  236 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/ok.png                                 |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/redis/RedisConfig.java                                                  |   51 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/annotation-noicon.svg                            |    7 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/enumpck/UIComponentDisplayTypeEnum.java                                 |  100 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UIFormDefineVO.java                                           |  134 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebDataRightController.java                                  |  145 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/portal/vciBaseUserPortlet.js                                            |   73 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/55.gif                                              |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/WebUtil.java                                                       | 1726 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-viewOutline@2x.png                 |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/StmFunctionController.java                                   |   52 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniKS-UCS2-H.bcmap                                |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/bn-BD/viewer.properties                          |  215 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsStatusVO.java                                               |  178 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/32.gif                                                          |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdCustomerClassify.js                                  |  254 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/fy-NL/viewer.properties                          |  242 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/other/WorkFlowEndedNotice.java                                          |   81 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/VciFileObjectDaoImpl.java                                      |  255 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/WFWorkflowNodeFavDTO.java                                           |  114 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsLinkTypeVO.java                                             |  305 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UIContentVO.java                                              |  167 
 Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_VIEW.md                                                              |   75 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/other/OsMapToObjFunction.java                                           |   21 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/laytpl.js                                                       |  123 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/OsCodeRuleElementDaoImpl.java                                  |  224 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebUserTransferRefer.js                                      |  358 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/HKdlb-B5-H.bcmap                                  |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-secondaryToolbarToggle-rtl.png     |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/kok/viewer.properties                            |  167 
 Source/platformProject/platform2022UI/vciweb/mes/wrj/PmStationPlan.js                                                                     |  482 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/viewer.css                                              | 2390 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/er/erContent.js                                  |   50 
 Source/platformProject/platform2022UI/doc.html                                                                                            |   40 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniKS-UTF16-H.bcmap                               |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/9.gif                                                           |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/img/circle.png                    |    0 
 Source/platformProject/platform2022UI/style/images/base/button/attach.png                                                                 |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/loading-small@2x.png                             |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/VciFileUploadController.java                                 |  152 
 Source/platformProject/platform2022UI/jslib/jquery/jquery.layout.js                                                                       |  530 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBT-V.bcmap                                       |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBpc-EUC-H.bcmap                                  |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/40.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/filemanager/images/folder-64.gif                                     |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebProUndoTab.js                                             |  307 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebOnlineUser.js                                           |   87 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebProcessAssign.js                                          |  338 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-Japan1-0.bcmap                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebComboxStore.js                                          |  177 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/properties/WebProperties.java                                           |  278 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniKS-UTF32-V.bcmap                               |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/modules/treetable.css                                                   |   18 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/WFWorkflowNodeFavDaoImpl.java                                  |  223 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBT-H.bcmap                                       |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/47.gif                                                          |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/themes/default/default.png                                                   |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WebHomeTaskServiceImpl.java                                |  150 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/tsz/viewer.properties                            |   75 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/94.gif                                              |    0 
 Source/platformProject/platform2022UI/style/images/base/button/assignRole.png                                                             |    0 
 Source/platformProject/platform2022UI/vciweb/mdm/CodeButton.js                                                                            |  345 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/OsBtmServiceImpl.java                                      |  678 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/monitor/VciYAML.js                                             |   95 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/action.down.png                  |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/BaseLinkModelDTOList.java                                           |   37 
 Source/platformProject/vci-platform-web/src/main/resources/codeTemplate/Service.impl.java.vm                                              |  485 
 Source/platformProject/platform2022UI/style/css/layui-dojo-small.css                                                                      |  367 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/mai/viewer.properties                            |  168 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/BaseModelDTOList.java                                               |   35 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.subprocess.expanded.png     |    0 
 Source/platformProject/platform2022UI/vciweb/mdm/CodeGroupImportRule.js                                                                   |  620 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/an/viewer.properties                             |  184 
 Source/platformProject/vci-platform-web/src/main/resources/codeTemplate/Mapper.xml.vm                                                     |  160 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/bo/VciLogObjectBO.java                                                  |  183 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-download.png                       |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/VciProcessUserGroup.js                                 |  303 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/xmlmodel/UIComponentDefineXO.java                                       |  431 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseFileUploadAction.js                                |  298 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-openFile@2x.png                    |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/78ms-RKSJ-H.bcmap                                 |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/errorCustomServiceTask.png       |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-lastPage@2x.png           |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/uz/viewer.properties                             |  169 
 Source/platformProject/platform2022UI/vciweb/view/showDetail.js                                                                           |   75 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/er/js/app.24d70361.js.map                        |    1 
 Source/platformProject/platform2022UI/style/images/base/tabBottomEnabledC.gif                                                             |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/refer/SmRoleRefer.js                                                    |   63 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/ProcessInstanceVO.java                                        |   50 
 Source/platformProject/platform2022UI/style/images/base/button/comment.png                                                                |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniGB-UCS2-V.bcmap                                |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/KeyValue.java                                                 |   46 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJISX02132004-UTF32-V.bcmap                     |    0 
 Source/platformProject/vci-platform-web/src/main/resources/application-prod.yml                                                           |   71 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/dcConfig.js                                                   |   37 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.script.png                  |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsStatusDTO.java                                                    |   90 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebMenu.js                                                 |  440 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/ProcessClassifyVO.java                                        |  172 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/OsAttributeServiceI.java                                        |  115 
 Source/platformProject/platform2022UI/vciweb/mdm/CodeClassifyTempMapItem.js                                                               |  331 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsLinkType.js                                    |  254 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/DeleteDataDTO.java                                                  |  105 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/treeitem-expanded@2x.png                         |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.endevent.none.png           |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/permissions.gif                        |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/markdown.js                                      |  350 
 Source/platformProject/platform2022UI/style/images/music/message.ogg                                                                      |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/27.gif                                              |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsCodeRuleProduceDTO.java                                           |  105 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/findbarButton-next@2x.png                        |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/monitor/VciSqlTool.js                                          |  130 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/BaseLinkModelDTO.java                                               |  325 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/enumpck/OsCodeFillTypeEnum.java                                         |  135 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/securityManage/SmWorkType.js                                   |  377 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/VciMdServiceI.java                                              |   24 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/draw2d/moocanvas.js                           |  873 
 Source/platformProject/platform2022UI/style/css/easyui.css                                                                                | 3706 
 Source/platformProject/platform2022UI/jslib/jquery/jquery-migrate-1.4.1.js                                                                |  752 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UIFormReferVO.java                                            |  347 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/constant/LinkTypeIdConstant.java                                        |   14 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/multiimage/images/swfupload.swf                                      |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniCNS-UTF32-H.bcmap                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/cancel.png                             |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/53.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/96.gif                                              |    0 
 Source/platformProject/platform2022UI/style/images/menuicons/2088211.png                                                                  |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/30.gif                                                          |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/10.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/7.gif                                                           |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/compatibility/OrgDutyQueryServiceI.java                       |  102 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/constant/TokenKeyConstant.java                                          |   40 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/SmFavFunctionDO.java                                              |   57 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/OsCodeRuleDaoImpl.java                                         |  238 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebFormulaController.java                                    |   37 
 Source/platformProject/platform2022UI/jslib/yaml/js/js-yaml.js                                                                            | 3854 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/markdown.html                                    |  156 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/VciFileVolumeDO.java                                              |  260 
 Source/platformProject/platform2022UI/jslib/vcijs/login.js                                                                                |  300 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/dynamicCondition.js                                           | 1388 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.manual.png                  |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/query/UIFormQuery.java                                                  |   78 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/zoom.png                               |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/121.gif                                             |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniKS-UTF8-H.bcmap                                |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/45.gif                                                          |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/pt-BR/viewer.properties                          |  231 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/WebProcessDefineServiceI.java                                   |  347 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-menuArrows.png                     |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/RKSJ-H.bcmap                                      |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/VciFileDownloadServiceImpl.java                            |  543 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/kab/viewer.properties                            |  242 
 Source/platformProject/platform2022UI/style/images/base/login/background-access.png                                                       |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsLifeCycleLineVO.java                                        |  247 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/OsStatusServiceI.java                                           |  112 
 Source/platformProject/platform2022UI/vciweb/mes/wrj/PmGroundPlan.js                                                                      |  388 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/home/vciHomeTaskAction.js                                      |  257 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/themes/common/flash.gif                                                      |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/81.gif                                              |    0 
 Source/platformProject/platform2022UI/style/images/base/button/cancel.gif                                                                 |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/17.gif                                                          |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-viewOutline-rtl@2x.png             |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebReferStand.js                                           |  188 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/pagemodel/SmPasswordStrategyVO.java                           |  149 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/findbarButton-next-rtl.png                       |    0 
 Source/platformProject/platform2022UI/vciweb/mes/wrj/PmPlanePlan.js                                                                       |  315 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/font/iconfont.ttf                                                           |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/connection/MyOutputPort.js        |   26 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/99.gif                                              |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/FormulaServiceImpl.java                                    | 1163 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/hy-AM/viewer.properties                          |  201 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/mobile/zepto.js                                                 | 1646 
 Source/platformProject/platform2022UI/jslib/websocket/WebSocketMain.swf                                                                   |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/eo/viewer.properties                             |  242 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/WebHomeTaskActionDO.java                                          |  106 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/properties/OsDDLExportWordFieldProperties.java                          |  162 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebPortalDojoUI.js                                         |  812 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-scrollWrapped@2x.png      |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/OsCodeRuleServiceI.java                                         |  150 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/36.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-secondaryToolbarToggle.png         |    0 
 Source/platformProject/platform2022UI/style/css/login.css                                                                                 |  222 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GB-H.bcmap                                        |    4 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/br/viewer.properties                             |  242 
 Source/platformProject/vci-platform-web/src/main/resources/codeTemplate/Mapper.java.vm                                                    |  165 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciFilePreview.js                                             |   91 
 Source/platformProject/platform2022UI/style/css/dc.css                                                                                    |  113 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsCodeEnumVO.java                                             |   75 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsCodeRule.js                                    | 1216 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS2004-UTF16-H.bcmap                          |    0 
 Source/platformProject/platform2022UI/style/images/base/index/dm_index_fav.png                                                            |    0 
 Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_LINKDEL.md                                                           |   51 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/pa-IN/viewer.properties                          |  209 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsBtmTypeRefer.js                                |   70 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/compatibility/impl/OrgDeptQueryServiceImpl.java               |  401 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsDLL.js                                         |  276 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/echarts.js                                                      | 83891 ++++++++++
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBKp-EUC-V.bcmap                                  |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-rotateCcw@2x.png          |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseEditAction.js                                      |  303 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/validatebox_warning.png                |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS-UTF8-H.bcmap                               |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/or/viewer.properties                             |  167 
 Source/platformProject/platform2022UI/vciweb/mdm/SysIntBase.js                                                                            |  281 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/116.gif                                             |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/task.png                               |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/WebBoServiceI.java                                              |  634 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/ProcessOutcomeVO.java                                         |  120 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/35.gif                                                          |    0 
 Source/platformProject/vci-platform-web/src/main/resources/log4j2-spring-dev.xml                                                          |   91 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/52.gif                                              |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/DeleteLinkDataDTO.java                                              |  131 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/5.gif                                               |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/all.js                                                                  |   15 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/78-V.bcmap                                        |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/findbarButton-next.png                           |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/29.gif                                              |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/annotation/FlowNotifyWeb.java                                           |   30 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/lcstatuspck/FrameworkDataLCStatus.java                        |  115 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/edit_add.png                           |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/rw/viewer.properties                             |   81 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsBtmTypeExportDTO.java                                             |  120 
 Source/platformProject/platform2022UI/style/images/base/index/nosession.png                                                               |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/OsRevisionRuleServiceImpl.java                             |  140 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/gateway/ExclusiveGateway.js       |  101 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/OsLinkTypeServiceI.java                                         |   89 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/th/viewer.properties                             |  228 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/42.gif                                                          |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/78-EUC-V.bcmap                                    |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UIActionVO.java                                               |  194 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseRevisionAction.js                                  |  305 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/layui.mobile.css                                                        |  192 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/annotation-comment.svg                           |   16 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/csb/viewer.properties                            |  134 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/61.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/HKdlb-B5-V.bcmap                                  |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/60.gif                                                          |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/EUC-H.bcmap                                       |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/OsLifeCycleServiceImpl.java                                |  637 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/123.gif                                             |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/lang/zh_TW.js                                                                |  235 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ja/viewer.properties                             |  220 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/26.gif                                                          |    0 
 Source/platformProject/platform2022UI/style/images/base/button/table_enable.png                                                           |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ka/viewer.properties                             |  242 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-documentProperties@2x.png |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/alicon/iconfont.woff2                                                       |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-print.png                          |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-CNS1-6.bcmap                                |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/fen.gif                                |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/0.gif                                                           |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniKS-UTF16-V.bcmap                               |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ro/viewer.properties                             |  242 
 Source/platformProject/platform2022UI/jslib/jquery/jquery.cookie.js                                                                       |  117 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/BusAnnotationUtil.java                                             |   55 
 Source/platformProject/platform2022UI/vciweb/mdm/MdmApply.js                                                                              |  218 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/pagemodel/OrgDepartmentVO.java                                |  201 
 Source/platformProject/platform2022UI/style/images/base/login/background-naptune.png                                                      |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/19.gif                                                          |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.mail.png                    |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/107.gif                                             |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/45.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/build/pdf.js.map                                            |    1 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/constant/EnumIdConstant.java                                            |   60 
 Source/platformProject/platform2022UI/vciweb/mdm/MdmEngineForm.js                                                                         |  368 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/HKm471-B5-V.bcmap                                 |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/alicon/iconfont.eot                                                         |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/template/template.js                                                 |   58 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/38.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/33.gif                                                          |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS-UCS2-HW-V.bcmap                            |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/7.gif                                               |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-scrollHorizontal.png      |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/134.gif                                             |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/portal/vciBaseDevPortlet.js                                             |   74 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/tl/viewer.properties                             |  177 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/70.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-scrollHorizontal@2x.png   |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/themes/common/anchor.gif                                                     |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/ProcessTemplateVO.java                                        |  133 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsLifeCycleLineDTO.java                                             |  191 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-spreadOdd@2x.png          |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/ProcessHistoryVO.java                                         |  129 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/my/viewer.properties                             |  180 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UITreeDefineVO.java                                           |  159 
 Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_LINKADD.md                                                           |  127 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/ReferConfigVO.java                                            |  265 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-Korea1-0.bcmap                              |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/enumpck/UIComponentTypeEnum.java                                        |  110 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/118.gif                                             |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/debugger.js                                             |  619 
 Source/platformProject/platform2022UI/jslib/vcijs/adminMain.js                                                                            |  228 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/en-GB/viewer.properties                          |  184 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/all-mobile.js                                                           |   11 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/50.gif                                              |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/VciMdController.java                                         |   37 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/other/BdSelectInputCharAspect.java                                      |  182 
 Source/platformProject/platform2022UI/jslib/vcijs/browserInfo.js                                                                          |  121 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/B5pc-H.bcmap                                      |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/delegate.gif                           |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/BdSelectInputCharDTO.java                                           |   69 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/wordpaste/wordpaste.js                                               |   51 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/action.up.png                    |    0 
 Source/platformProject/vci-platform-web/src/main/resources/properties/iceClient.properties                                                |    1 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-firstPage.png             |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/sw/viewer.properties                             |  128 
 Source/platformProject/vci-platform-web/src/main/resources/application-dev.yml                                                            |   81 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-presentationMode@2x.png            |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/enumpck/OsCodeElementTypeEnum.java                                      |  155 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/LinkTypeInfoVO.java                                           |   75 
 Source/platformProject/platform2022UI/jslib/yaml/js/yaml.js                                                                               |  120 
 Source/platformProject/platform2022UI/vciweb/mdm/CodeResembleRule.js                                                                      |  354 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/CNS-EUC-V.bcmap                                   |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-Japan1-3.bcmap                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsWebMethods.js                                  |  256 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/orgs/orgJobGrade.js                                            |  362 
 Source/platformProject/vci-platform-web/src/main/resources/ehcache.xml                                                                    |   44 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/annotation/FlowNotifyBefore.java                                        |   18 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebFileManager.js                                          |  613 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/gd/viewer.properties                             |  215 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/127.gif                                             |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/63.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/78-RKSJ-V.bcmap                                   |    0 
 Source/platformProject/platform2022UI/vciweb/mdm/CodeClassifyVerifyUser.js                                                                |  265 
 Source/platformProject/platform2022UI/style/images/base/button/table_search.png                                                           |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdSelectInputChar.js                                   |  286 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/ereference.gif                   |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/40.gif                                                          |    0 
 Source/platformProject/platform2022UI/style/images/base/button/pencil_add.png                                                             |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/125.gif                                             |    0 
 Source/platformProject/platform2022UI/vciweb/mdm/CodeSelectInputChar.js                                                                   |  271 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsCodeGenSchemaVO.java                                        |  535 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/assign.gif                             |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/sat/viewer.properties                            |  134 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/image/images/align_left.gif                                          |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/media/media.js                                                       |  170 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/VciMarkdownViewer.js                             |   61 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/user_icon.png                          |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/refer/OrgDepartmentRefer.js                                             |   23 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniKS-UTF8-V.bcmap                                |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/code/prettify.js                                                     |   28 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.receive.png                 |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/left_icon.gif                          |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/securityManage/SmButton.js                                     |  276 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/util.js                                                         |  216 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/FormLinkDataDTO.java                                                |   29 
 Source/platformProject/platform2022UI/jslib/jquery/jquery-1.12.4.min.js                                                                   |    5 
 Source/platformProject/platform2022UI/style/images/base/button/printer.png                                                                |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/62.gif                                                          |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/43.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/VciUIContentViewer.bak.js                        |  933 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UITableFieldVO.java                                           |  397 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/28.gif                                                          |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebProHistory.js                                             |   96 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniCNS-UCS2-V.bcmap                               |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/compatibility/impl/OrgDutyQueryServiceImpl.java               |  147 
 Source/platformProject/vci-platform-web/src/main/resources/codeTemplate/Controller.java.vm                                                |  318 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/OsLifeCycleController.java                                   |   48 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/other/VciFileDownloadInfo.java                                          |   75 
 Source/platformProject/platform2022UI/style/images/base/button/assignUser.png                                                             |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-GB1-5.bcmap                                 |    0 
 Source/platformProject/platform2022UI/vciweb/mdm/CodeClassifyTemplate.js                                                                  |  342 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/ProcessStartConfigDTO.java                                          |  261 
 Source/platformProject/platform2022UI/style/images/base/flow/userTask.png                                                                 |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/SmOperationVO.java                                            |  160 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/WebActionServiceI.java                                          |   18 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebEnumController.java                                       |   84 
 Source/platformProject/platform2022UI/style/images/base/index/dm_index_person.png                                                         |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/132.gif                                             |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WebProcessDefineServiceImpl.java                           |  881 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebSocket.js                                               |   82 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/themes/common/blank.gif                                                      |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/img/menu_sep.png                  |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/OsCodeEnumDaoI.java                                                 |  121 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/PlatformClientUtil.java                                            |  206 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/alicon/iconfont.json                                                        |  177 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/2.gif                                                           |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/controller/SmRoleQueryController.java                         |   64 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/modify.png                             |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/paint.png                              |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/themes/common/loading.gif                                                    |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebReferDefalut.js                                         |  299 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/plugins/controller/ImageViewerController.java                               |   53 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/initTask/VciWebInitTaskComponent.java                                   |  373 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/enumpck/DataObjectEnum.java                                   |  152 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/menu.png                               |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-zoomIn@2x.png                      |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-scrollVertical.png        |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/OsBaseServiceI.java                                             |  150 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/sv-SE/viewer.properties                          |  242 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/TreeSettingVO.java                                            |  315 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/KSC-EUC-H.bcmap                                   |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/VciFileDownloadController.java                               |   88 
 Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_UI.md                                                                |   58 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/79.gif                                              |    0 
 Source/platformProject/platform2022UI/style/images/base/menu/changeorg.png                                                                |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/ResizeImage.js                    |   53 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-GB1-2.bcmap                                 |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJISPro-UCS2-V.bcmap                            |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/OsCodeSerialNumberDaoImpl.java                                 |  194 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WebInitServiceImpl.java                                    |  180 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/HKdla-B5-V.bcmap                                  |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.startevent.none.png         |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsAttributeForBtmRefer.js                        |   80 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/VciFileObjectServiceI.java                                      |  192 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/72.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/mr/viewer.properties                             |  206 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Hiragana.bcmap                                    |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/KSCms-UHC-H.bcmap                                 |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/mobile/layim-mobile-open.js                                     |   11 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/properties/VciSecurityManageProperties.java                   |   59 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsAttributeDTO.java                                                 |  249 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebScanAnnotationController.java                             |   59 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/SmFavFunctionController.java                                 |   62 
 Source/platformProject/platform2022UI/jslib/corsforie8/jquery.xdomainrequest.min.js                                                       |    7 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/112.gif                                             |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/WebBtmIOServiceI.java                                           |   50 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniGB-UTF16-H.bcmap                               |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-pageDown.png                       |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/query/UIBaseQuery.java                                                  |   48 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/lij/viewer.properties                            |  242 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/query/UIDataGridQuery.java                                              |  135 
 Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_FILEDOWNLOAD.md                                                      |   23 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/sk/viewer.properties                             |  242 
 Source/platformProject/platform2022UI/style/images/base/tabTopUnselected.png                                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-Korea1-2.bcmap                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/es-ES/viewer.properties                          |  242 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/16.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/id/viewer.properties                             |  242 
 Source/platformProject/platform2022UI/vciweb/mdm/CodeRule.js                                                                              | 1779 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/BdSelectInputCharServiceImpl.java                          |  437 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/multiimage/multiimage.js                                             | 1388 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsEnumDTO.java                                                      |  163 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.send.png                    |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsCodeGenSchemaDTO.java                                             |  536 
 Source/platformProject/vci-platform-web/src/main/resources/codeTemplate/VO.java.vm                                                        |  108 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/static.gif                                          |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-GB1-0.bcmap                                 |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/129.gif                                             |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/findbarButton-next-rtl@2x.png                    |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/49.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/annotation-key.svg                               |   11 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ar/viewer.properties                             |  242 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/bn-IN/viewer.properties                          |  177 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/bo/BtmOrLinkProcessAttributeInfo.java                                   |   99 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/treeitem-collapsed@2x.png                        |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-download@2x.png                    |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/sah/viewer.properties                            |  166 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-CNS1-3.bcmap                                |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/69.gif                                                          |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-pageDown@2x.png                    |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/pt-PT/viewer.properties                          |  242 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/en-CA/viewer.properties                          |  242 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/1.gif                                               |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/orgs/orgDuty.js                                                |  371 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/34.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebReferTree.js                                            |  283 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/es-AR/viewer.properties                          |  242 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/130.gif                                             |    0 
 Source/platformProject/vci-platform-starter/pom.xml                                                                                       |  256 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/53.gif                                                          |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/themes/qq/editor.gif                                                         |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/constant/FieldConstant.java                                             |  107 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/message.png                            |    0 
 Source/platformProject/platform2022UI/style/images/base/login/userphotoman.png                                                            |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/gl/viewer.properties                             |  168 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/hui2.gif                               |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Ext-RKSJ-V.bcmap                                  |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/sl/viewer.properties                             |  242 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/ETHK-B5-H.bcmap                                   |    0 
 Source/platformProject/vci-platform-web/src/main/resources/application.yml                                                                |    7 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsCodeRuleElementDTO.java                                           |  416 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/HelpDocument.js                                  |  364 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/LICENSE                                           |   36 
 Source/platformProject/platform2022UI/style/font/loginform-icon.eot                                                                       |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/88.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/upload.png                             |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-handTool@2x.png           |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/64.gif                                                          |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/task/UserTask.js                  |  139 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/lineheight/lineheight.js                                             |   38 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/shadow.png                                       |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/KSC-Johab-V.bcmap                                 |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseDeleteAction.js                                    |   90 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/WFWorkflowNodeFavDaoI.java                                          |  119 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Hankaku.bcmap                                     |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/WebProcessDaoImpl.java                                         | 1103 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/bo/OsCodeSerialBuildBO.java                                             |   64 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-CNS1-1.bcmap                                |    0 
 Source/platformProject/vci-platform-web/src/main/resources/codeTemplate/Service.java.vm                                                   |  183 
 Source/platformProject/platform2022UI/style/images/base/flow/service.png                                                                  |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/image/images/refresh.png                                             |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/model/SmRoleForPlatform1.java                                 |  152 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/hto/viewer.properties                            |  127 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/monitor/VciService.js                                          |  519 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/findbarButton-previous-rtl.png                   |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/enumpck/OsCodeGenJsPanelTypeEnum.java                                   |  139 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/refer/SmUserGridRefer.js                                                |   65 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/74.gif                                              |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsLifeCycleLineEventVO.java                                   |  192 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/role.gif                               |    0 
 Source/platformProject/platform2022UI/style/images/base/button/notAllow.png                                                               |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/annotation/BdSelectInput.java                                           |   37 
 Source/platformProject/platform2022UI/vciweb/mdm/SysIntInfo.js                                                                            |  524 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/VciFileUploadServiceI.java                                      |   87 
 Source/platformProject/platform2022UI/jslib/websocket/web_socket.js                                                                       |  398 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/3.gif                                               |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/OsCodeRuleElementDaoI.java                                          |  125 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/VciFileUploadServiceImpl.java                              |  759 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/action.magnifier.png             |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/interceptor/MyMVCConfig.java                                            |   25 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsBtmTypeLinkAttributesDTO.java                                     |  244 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/transferTable.js                                                |  261 
 Source/platformProject/platform2022UI/style/images/base/button/folder.png                                                                 |    0 
 Source/platformProject/platform2022UI/vciweb/mdm/CodeClassifyEnumUse.js                                                                   |  138 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/18.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/build/pdf.js                                                | 19365 ++
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/CNS1-V.bcmap                                      |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/img/grid_10.png                   |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniGB-UTF8-H.bcmap                                |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/gateway/ParallelGateway.js        |  103 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/37.gif                                                          |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Ext-H.bcmap                                       |    0 
 Source/platformProject/platform2022UI/style/images/base/login/background-classic.png                                                      |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/filemanager/images/file-64.gif                                       |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/constant/CacheKeyConstant.java                                          |   80 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/22.gif                                                          |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/query/UILinkTypeDataQuery.java                                          |  175 
 Source/platformProject/vci-platform-web/src/main/resources/codeTemplate/DTO.java.vm                                                       |  109 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJISPro-UTF8-V.bcmap                            |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS-UTF32-V.bcmap                              |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/themes/common/rm.gif                                                         |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GB-EUC-H.bcmap                                    |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebProcessDefineController.java                              |  324 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/114.gif                                             |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS2004-UTF32-H.bcmap                          |    0 
 Source/platformProject/vci-platform-web/src/main/resources/codeTemplate/Mapper.impl.java.vm                                               |  294 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/24.gif                                                          |    0 
 Source/platformProject/platform2022UI/style/images/base/tabTopSelected.png                                                                |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/filemanager/images/folder-16.gif                                     |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/it/viewer.properties                             |  157 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/100.gif                                             |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/build/pdf.compatibility.js                                  |  577 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/47.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/welcome.gif                            |    0 
 Source/platformProject/platform2022UI/style/images/base/flow/gatewayIn.png                                                                |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/90pv-RKSJ-V.bcmap                                 |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/annotation-paragraph.svg                         |   16 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/67.gif                                                          |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/task/ServiceTask.js               |  179 
 Source/platformProject/platform2022UI/style/images/base/button/down.gif                                                                   |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/BdSelectInputCharVO.java                                      |   68 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/refer/WfProcessTemplateRefer.js                                         |  330 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/modules/code.css                                                        |   23 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/af/viewer.properties                             |  184 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/39.gif                                                          |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/km/viewer.properties                             |  184 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UITableDefineVO.java                                          |  223 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/FormLinkDataDTOList.java                                            |   34 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/themes/simple/simple.css                                                     |  100 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsRevisionRuleVO.java                                         |  247 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/modules/layer/default/icon.png                                          |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBK2K-H.bcmap                                     |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/findbarButton-previous@2x.png                    |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/ProcessTask.java                                                  |  211 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/VciOsCodeRuleController.java                                 |  164 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/UIDataServiceImpl.java                                     | 2468 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/constant/FrameWorkBusLangCodeConstant.java                    |  519 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebActionController.java                                     |   33 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebProExecutePanel.js                                        |  314 
 Source/platformProject/platform2022UI/jslib/websocket/swfobject.js                                                                        |    4 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/51.gif                                                          |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebProProxy.js                                               |  225 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/32.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/template/html/3.html                                                 |   36 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/preview/preview.js                                                   |   31 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/KSC-V.bcmap                                       |    0 
 Source/platformProject/platform2022UI/style/images/base/button/out.png                                                                    |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/layedit.js                                                      |  649 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebPortalHome.js                                           |  274 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ltg/viewer.properties                            |  220 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/filemanager/filemanager.js                                           |  189 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-openFile.png                       |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/13.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-CNS1-4.bcmap                                |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-pageUp@2x.png                      |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS2004-UTF8-V.bcmap                           |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/meh/viewer.properties                            |   72 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/OsCodeBreakCodeDaoI.java                                            |  101 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/refer/SmUserReferBase.js                                                |  368 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/90ms-RKSJ-V.bcmap                                 |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/draw2d/mootools.js                            | 2409 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/filemanager/images/go-up.gif                                         |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/LoginController.java                                         |  320 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/bs/viewer.properties                             |  201 
 Source/platformProject/platform2022UI/style/images/base/menu/changepassword.png                                                           |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/6.gif                                                           |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS-UTF16-H.bcmap                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/palette.png                      |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-pageUp.png                         |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebCodeGenSchemaController.java                              |  118 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/OsCodeBreakCodeDaoImpl.java                                    |  195 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/20.gif                                                          |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/form.js                                                         | 2115 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/constant/FrameWorkDefaultValueConstant.java                   |  169 
 Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_REFRESH.md                                                           |   10 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/84.gif                                              |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/HomeTaskController.java                                      |   99 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/OsCodeBreakCodeDO.java                                            |   90 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/KSCpc-EUC-V.bcmap                                 |    0 
 Source/platformProject/platform2022UI/style/images/base/menu/changetheme.png                                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/viewer.js                                               | 13407 +
 Source/platformProject/platform2022UI/vciweb/mdm/MdmEngineInProcess.js                                                                    |  463 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/OsCodeGenSchemaServiceI.java                                    |   87 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/OsStatusDO.java                                                   |  173 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/es-CL/viewer.properties                          |  242 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/uk/viewer.properties                             |  242 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-zoomIn.png                         |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/76.gif                                              |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/BdSelectInputCharServiceI.java                                  |  138 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/101.gif                                             |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/font/iconfont.woff                                                          |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/clock.png                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/securityManage/SmPasswordStrategy.js                           |  418 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/font/iconfont.svg                                                           |  554 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/cy/viewer.properties                             |  242 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/xh/viewer.properties                             |  184 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/WFWorkflowNodeFavItemDO.java                                      |   89 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniCNS-UTF8-H.bcmap                               |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdAreaClassify.js                                      |  353 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/tree_folder_open.gif             |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/WfWorkflowHandle.js                                    |  325 
 Source/platformProject/platform2022UI/jslib/jquery/jquery.fileDownload.js                                                                 |  495 
 Source/platformProject/platform2022UI/jslib/jquery/jquery.panel.js                                                                        |  694 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/findbarButton-previous-rtl@2x.png                |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJISPro-UCS2-HW-V.bcmap                         |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/V.bcmap                                           |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GB-EUC-V.bcmap                                    |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdWarehouse.js                                         |  611 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/mobile.js                                                       |   30 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/pages.gif                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/flow.js                                                         |  176 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/SmPasswordStrategyDO.java                                         |  285 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/57.gif                                                          |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-search@2x.png                      |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/WebHomeTaskActionDTO.java                                           |   95 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/30.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/modules/layer/default/layer.old.css                                     |  182 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/VciFileDocClassifyServiceI.java                                 |  135 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/67.gif                                              |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/OsEnumServiceI.java                                             |  137 
 Source/platformProject/platform2022UI/style/css/vciproject.css                                                                            |  233 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/lang/ko.js                                                                   |  237 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/modules/layer/default/layer.css                                         |  179 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/er/js/chunk-vendors.80f2064b.js.map              |    1 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/portal/vciWebProUndoTaskPortlet.js                                      |  161 
 Source/platformProject/platform2022UI/vciweb/mdm/CodeClassifyClassifyuse.js                                                               |  150 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UILayoutVO.java                                               |  212 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/plugins/ImageView.js                                           |  147 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/el/viewer.properties                             |  242 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/10.gif                                                          |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/modules/laydate/default/laydate.css                                     |  168 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/setPassword.gif                        |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsERNodePropertyVO.java                                       |   75 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdSupplierImporttance.js                               |  367 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS2004-UTF8-H.bcmap                           |    0 
 Source/platformProject/platform2022UI/vciweb/mdm/CodeSynonym.js                                                                           |  371 
 Source/platformProject/platform2022UI/style/images/base/login/login_name.png                                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/securityManage/VciSmRightCenter.js                             |  260 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/WFWorkflowNodeFavServiceI.java                                  |  106 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBT-EUC-H.bcmap                                   |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ga-IE/viewer.properties                          |  184 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/he/viewer.properties                             |  240 
 Source/platformProject/platform2022UI/style/images/base/button/table_edit.png                                                             |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/lv/viewer.properties                             |  242 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/OsCodeSerialNumberDaoI.java                                         |  108 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Add-RKSJ-V.bcmap                                  |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-rotateCcw.png             |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/laypage.js                                                      |  342 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/enumpck/UIButtonDisplayModeEnum.java                                    |  100 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniGB-UTF32-H.bcmap                               |    0 
 Source/platformProject/platform2022UI/jslib/jquery/jquery-1.12.4.js                                                                       | 11008 +
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/zh-CN/viewer.properties                          |  242 
 Source/platformProject/vci-platform-web/pom.xml                                                                                           |  253 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-pageDown-rtl@2x.png                |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-GB1-UCS2.bcmap                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/refer/SmUserRefer.js                                                    |   34 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/4.gif                                                           |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/BdSelectInputCharDaoImpl.java                                  |  219 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdMaterialClassifyExtendAttr.js                        |  131 
 Source/platformProject/platform2022UI/style/images/base/login/login_pic.png                                                               |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/111.gif                                             |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/hsb/viewer.properties                            |  242 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/VciProcessTemplateClassify.js                          |  263 
 Source/platformProject/platform2022UI/vciweb/mes/wrj/PmSalePlan.js                                                                        |  379 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/mobile/layer-mobile.js                                          |  189 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsCodeResultVO.java                                           |   78 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/other/FlowNoticeExample.java                                            |   36 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/B5-V.bcmap                                        |    0 
 Source/platformProject/platform2022UI/style/images/base/tabContainerSprite.gif                                                            |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/compatibility/ISmFunctionQueryService.java                    |  144 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/KSCpc-EUC-H.bcmap                                 |    0 
 Source/platformProject/platform2022UI/style/images/base/button/assignOrg.png                                                              |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/93.gif                                              |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsBtmTypeDTO.java                                                   |  374 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/SmFavFunctionServiceImpl.java                              |  110 
 Source/platformProject/vci-platform-web/src/main/resources/md/VOLUME.md                                                                   |   20 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/password_icon.png                      |    0 
 Source/platformProject/platform2022UI/style/images/base/flow/start.png                                                                    |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/OsCodeRuleDaoI.java                                                 |  125 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/sr/viewer.properties                             |  220 
 Source/platformProject/platform2022UI/style/images/base/button/table_add.png                                                              |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/78.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/locale.properties                                |  369 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/103.gif                                             |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/RefreshAction.js                                       |   37 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/48.gif                                                          |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/gu-IN/viewer.properties                          |  242 
 Source/platformProject/platform2022UI/vciweb/mes/wrj/PmPlanCalulate.js                                                                    |  348 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/WFProcessClassifyDO.java                                          |  194 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/hua2.gif                               |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-secondaryToolbarToggle@2x.png      |    0 
 Source/platformProject/vci-platform-web/src/main/resources/codeTemplate/DO.java.vm                                                        |  155 
 Source/platformProject/vci-platform-web/src/main/resources/codeTemplate/PO.java.vm                                                        |  112 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS-UCS2-V.bcmap                               |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/element.js                                                      |  502 
 Source/platformProject/platform2022UI/vciweb/mes/wrj/PmSalePlanRecord.js                                                                  |  336 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/referConfig.js                                                |  839 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-handTool.png              |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/20.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-GB1-3.bcmap                                 |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/ajaxTask/SmUserUnLockTaskManager.java                         |   79 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/SmUserDO.java                                                     |  331 
 Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_TAB.md                                                               |   25 
 Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_FILEUPLOAD.md                                                        |   38 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/SmMenuController.java                                        |   37 
 Source/platformProject/platform2022UI/style/images/base/index/dm_index_system.png                                                         |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/65.gif                                              |    0 
 Source/platformProject/platform2022UI/vciweb/mdm/CodeClassifyProcessTemp.js                                                               |  276 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/22.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-viewThumbnail@2x.png               |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebOnlineUserController.java                                 |   29 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/91.gif                                              |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsERNodeVO.java                                               |   49 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/modules/layer/default/loading-2.gif                                     |    0 
 Source/platformProject/platform2022UI/style/images/base/flow/timer.png                                                                    |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/VciFileQueryServiceI.java                                       |  140 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/crh/viewer.properties                            |  217 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/weather.png                            |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/lt/viewer.properties                             |  242 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/86.gif                                              |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/OsCodeEnumDaoImpl.java                                         |  235 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBK-EUC-H.bcmap                                   |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdMaterialSelectPanel.js                               |  474 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/defaultCustomServiceTask.png     |    0 
 Source/platformProject/platform2022UI/style/images/base/flow/reference.png                                                                |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseStartWorkflowAction.js                             |  137 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/12.gif                                                          |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/img/menu.gif                      |    0 
 Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_LINKEDIT.md                                                          |  120 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/55.gif                                                          |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-spreadNone.png            |    0 
 Source/platformProject/platform2022UI/jslib/yaml/css/codemirror.css                                                                       |  350 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/build/pdf.worker.js                                         | 47057 +++++
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/findbarButton-previous.png                       |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/KSCms-UHC-HW-V.bcmap                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/cak/viewer.properties                            |  242 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-GB1-4.bcmap                                 |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/oc/viewer.properties                             |  210 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/chart_bar_edit.png                     |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/error.png                        |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/quickformat/quickformat.js                                           |   81 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/OsCodeGenSchemaDaoI.java                                            |   64 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/15.gif                                              |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsLifeCycleDTO.java                                                 |  149 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/58.gif                                              |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/bo/LoginResultBO.java                                                   |  136 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-CNS1-UCS2.bcmap                             |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-bookmark@2x.png                    |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/ETen-B5-V.bcmap                                   |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/lv2.gif                                |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/80.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/treeitem-expanded.png                            |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/license.txt                                                                  |  502 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/OsCodeGenSchemaServiceImpl.java                            |  919 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/layui.js                                                                    |  640 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UIComponentVO.java                                            |  224 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/lang/ar.js                                                                   |  233 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/BaseModelDTO.java                                                   |  150 
 Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_UPREVISION.md                                                        |  178 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/plugins/dto/AuditTaskDTO.java                                               |  137 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/56.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/vcijs/json2.js                                                                                |  489 
 Source/platformProject/platform2022UI/style/font/loginform-icon.woff                                                                      |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/connection/MyInputPort.js         |   26 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/vi/viewer.properties                             |  205 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/zu/viewer.properties                             |  131 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/query/FileImageViewerQuery.java                                         |   75 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WebLogServiceImpl.java                                     |  119 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/az/viewer.properties                             |  242 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/31.gif                                                          |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/mn/viewer.properties                             |   82 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-viewOutline.png                    |    0 
 Source/platformProject/platform2022UI/style/images/music/message.mp3                                                                      |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJISX0213-UTF32-V.bcmap                         |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsBtmTypeAttributeVO.java                                     |  404 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/transfer.js                                                     |  551 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ia/viewer.properties                             |  242 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/task/Task.js                      |  311 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/105.gif                                             |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/46.gif                                                          |    0 
 Source/platformProject/platform2022UI/style/images/base/button/schema_add.png                                                             |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/HKm314-B5-V.bcmap                                 |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/viewer.js.map                                           |    1 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WebActionServiceImpl.java                                  |   60 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/fi/viewer.properties                             |  242 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/41.gif                                              |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/ajaxTask/SmUserUnLockTask.java                                |  128 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsCodeGeneratorComp.js                           |  532 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UIButtonDefineVO.java                                         |  314 
 Source/platformProject/platform2022UI/jslib/yaml/index.html                                                                               |   67 
 Source/platformProject/platform2022UI/jslib/markdown/monokai_sublime.min.css                                                              |    1 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/VciFileVolumeServiceI.java                                      |  143 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/mk/viewer.properties                             |  145 
 Source/platformProject/platform2022UI/style/images/base/buttonHover.png                                                                   |    0 
 Source/platformProject/pom.xml                                                                                                            |   72 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/120.gif                                             |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/lcstatuspck/ReleaseDataLCStatus.java                          |  118 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/95.gif                                              |    0 
 Source/platformProject/platform2022UI/vciweb/mes/wrj/PmYearPlan.js                                                                        |  529 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebProBusinessDoc.js                                         |   44 
 Source/platformProject/platform2022UI/style/images/base/login/background-gray.png                                                         |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebProcessCommandController.java                             |  178 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS-UTF32-H.bcmap                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/H.bcmap                                           |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/VciFileVolumeServiceImpl.java                              |  406 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-bookmark.png                       |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/multiimage/images/select-files-zh_CN.png                             |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/code.js                                                         |   61 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/CNS2-V.bcmap                                      |    3 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/VciProcessProxy.js                                     |  305 
 Source/platformProject/platform2022UI/style/images/base/index/sessionRemind.png                                                           |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/SmOperationServiceI.java                                        |   20 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-zoomOut.png                        |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/tr/viewer.properties                             |  242 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/code/prettify.css                                                    |   13 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/calendar.png                           |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/39.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseLinkDeleteAction.js                                |   99 
 Source/platformProject/platform2022UI/jslib/markdown/highlight.min.js                                                                     |    1 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/securityManage/VciSmUser.js                                    | 1046 
 Source/platformProject/platform2022UI/style/images/base/layout_arrows.png                                                                 |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/query/UITreeQuery.java                                                  |  163 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/HKgccs-B5-V.bcmap                                 |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/model/OrgDeptForPlatform1.java                                |  177 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/OsCodeGenSchemaDO.java                                            |  583 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/14.gif                                                          |    0 
 Source/platformProject/vci-platform-web/src/main/resources/DefaultAttribute.json                                                          |   34 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdMaterialClassify.js                                  |  372 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/24.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/alicon/iconfont.js                                                          |    1 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-secondaryToolbarToggle-rtl@2x.png  |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/VciUIContentViewer.js                            | 1019 
 Source/platformProject/platform2022UI/style/images/base/button/mail.png                                                                   |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsCodeGenerator.js                               |  584 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/70.gif                                                          |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/link/link.js                                                         |   66 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/modules/laydate/default/font.css                                        |   16 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/treeitem-collapsed-rtl.png                       |    0 
 Source/platformProject/platform2022UI/vciweb/mdm/CodeClassifyAttribute.js                                                                 |  572 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-scrollVertical@2x.png     |    0 
 Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_WORKFLOW.md                                                          |   37 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/LoginUserDTO.java                                                   |   66 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ml/viewer.properties                             |  184 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-presentationMode.png               |    0 
 Source/platformProject/platform2022UI/jslib/vcijs/md5.js                                                                                  |  172 
 Source/platformProject/vci-platform-web/src/main/resources/excelTemplate/dataBaseExport.xls                                               |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBT-EUC-V.bcmap                                   |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/filemanager/images/file-16.gif                                       |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-spreadOdd.png             |    0 
 Source/platformProject/platform2022UI/jslib/markdown/marked.min.js                                                                        |  896 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/zam/viewer.properties                            |   90 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UITablePageVO.java                                            |   47 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/NWP-H.bcmap                                       |    0 
 Source/platformProject/platform2022UI/jslib/metaQueryForIe8/htm5.min.js                                                                   |    1 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsCodePreview.js                                 |   83 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/OsRevisionRuleServiceI.java                                     |   49 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/BatchCBO.java                                                 |  229 
 Source/platformProject/platform2022UI/README.md                                                                                           |   50 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/connection/DecoratedConnection.js |  126 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/97.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS2004-UTF16-V.bcmap                          |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/WebHomeTaskActionVO.java                                      |   94 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ku/viewer.properties                             |  146 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/ProcessNodeVO.java                                            |  109 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/timer.png                        |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ks/viewer.properties                             |  168 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/OsCodeEnumDO.java                                                 |   91 
 Source/platformProject/platform2022UI/style/images/base/button/comment_add.png                                                            |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBKp-EUC-H.bcmap                                  |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/54.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/cs/viewer.properties                             |  242 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/plugins/Sql2Table.js                                           |   86 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/11.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/vcijs/admin.js                                                                                |  285 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WebProcessCommandServiceImpl.java                          |  792 
 Source/platformProject/platform2022UI/style/images/base/button/table_disabled.png                                                         |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/compressed.tracemonkey-pldi-09.pdf                      |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/enumpck/RoleClassifyEnum.java                                 |  104 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/122.gif                                             |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/properties/VciFramworkCompatibilityProperties.java            |   80 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/download.png                           |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/homePage.png                           |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/laydate.js                                                      | 2009 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/8.gif                                                           |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/template/html/1.html                                                 |   14 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJISX0213-UTF32-H.bcmap                         |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/bo/FlowNoticeInfo.java                                                  |  137 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/82.gif                                              |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/BatchRedeployJar2Maven.java                                                 |  107 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UIFormDataVO.java                                             |   61 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/KSC-EUC-V.bcmap                                   |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/layui.css                                                               | 2203 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.service.png                 |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/save.png                               |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/pagemodel/SmFunctionVO.java                                   |  223 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseAddAction.js                                       |  246 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/59.gif                                                          |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/treeitem-collapsed.png                           |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/16.gif                                                          |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmUserQueryServiceImpl.java                |  810 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/annotation-check.svg                             |   11 
 Source/platformProject/platform2022UI/vciweb/bd/workUnit.js                                                                               |  385 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/VciFileDocClassifyDaoImpl.java                                 |  206 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebProAllProcessInfo.js                                      |  574 
 Source/platformProject/platform2022UI/vciweb/mdm/CodeKeyAttrRepeatRule.js                                                                 |  354 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ta-LK/viewer.properties                          |   77 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/annotation-newparagraph.svg                      |   11 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/WebLogServiceI.java                                             |    9 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/44.gif                                                          |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-print@2x.png                       |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/BdSelectInputCharDO.java                                          |   93 
 Source/platformProject/platform2022UI/vciweb/mdm/CodeClassifyTemplateButton.js                                                            |  305 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WFWorkflowNodeFavItemServiceImpl.java                      |  289 
 Source/platformProject/platform2022UI/jslib/corsforie8/jQuery.XDomainRequest.js                                                           |  119 
 Source/platformProject/platform2022UI/style/images/base/button/table_delete.png                                                           |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/OsLinkTypeController.java                                    |   94 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/multiimage/images/select-files-en.png                                |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsERVO.java                                                   |   49 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdCustomer.js                                          |  268 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/69.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/26.gif                                              |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-menuArrows@2x.png                  |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/baidumap/baidumap.js                                                 |   93 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/ETen-B5-H.bcmap                                   |    0 
 Source/platformProject/platform2022UI/style/images/base/login/progress-default-bg.gif                                                     |    0 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WebBoServiceImpl.java                                      | 2519 
 Source/platformProject/platform2022UI/style/images/base/flow/messages.png                                                                 |    0 
 Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/109.gif                                             |    0 
 Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/task/ManualTask.js                |  132 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/compatibility/SmUserQueryServiceI.java                        |  246 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsBtmTypeVO.java                                              |  461 
 Source/platformProject/vci-platform-web/src/main/java/com/vci/web/constant/CacheNameConstant.java                                         |   24 
 1,576 files changed, 479,458 insertions(+), 0 deletions(-)

diff --git a/Source/platformProject/platform2022UI/README.md b/Source/platformProject/platform2022UI/README.md
new file mode 100644
index 0000000..a43b9c6
--- /dev/null
+++ b/Source/platformProject/platform2022UI/README.md
@@ -0,0 +1,50 @@
+##寮�鍙戣鏄�
+1.骞冲彴绾︽潫
+- jslib 骞冲彴鐩稿叧鐨刯s锛屽寘鍚熀纭�鐨刯s锛屽拰layui鐩稿叧鐨勫熀纭�鐨勭粍浠�
+- style 杩欎釜鏄钩鍙版彁渚涚殑鏍峰紡鏂囦欢锛屼竴鑸儏鍐典笅涓嶄慨鏀广�傚鏋滃彧鏄釜鎬у寲鐨勯渶姹傦紝骞冲彴鎻愪緵涓婚鏍峰紡鏂囦欢锛屾垨鑰呭崟鐙啓鏍峰紡鏂囦欢瑕嗙洊骞冲彴鐨勫唴瀹�
+- vciweb 鎵�鏈夌殑layui缂栧啓鐨刯s鏂囦欢鍏ㄩ儴鏀惧湪杩欓噷闈€�傚彟澶栧钩鍙版彁渚涗簡platform鍜宲ortal涓や釜鏂囦欢澶圭殑js锛屽鏋滃叾涓殑js鏈夐棶棰樿鑱旂郴骞冲彴寮�鍙戜慨鏀癸紱鑷畾涔夌殑js涓嶈兘鏄痯latform鍜宲ortal鐨勬枃浠跺す
+- 骞冲彴鏇存柊锛屽钩鍙扮殑js鍦ㄥ彂甯冩柊鐗堟湰鍚庯紝浼氭湁閫氱煡锛岃涓嬭浇鍚庤鐩栫幇鍦ㄧ殑鐩稿叧鏂囦欢澶�
+
+2.椤圭洰鑷畾涔�
+  - webstyle 椤圭洰鑷繁鐨勬牱寮忔枃浠�
+  - view 椤圭洰鑷繁鐨凧s鍜宧tml鏂囦欢
+  - 鍙傜収 闇�瑕佽嚜宸卞啓鐨勫弬鐓s锛岀劧鍚庡湪vciAlias閲宺eferRegister鍔犲叆淇℃伅銆傛瘮濡�
+```
+    supplier:'platform/basedoc/BdSupplierRefer'
+```
+   鍐掑彿鍓嶉潰鏄弬鐓х殑绠�鍐欙紝鍙宠竟鏄叾鍏ㄨ矾寰勶紝浣跨敤濡備笅
+   ```
+    type: layui.vciAlias.platformRefer.supplier
+ ```
+  - 鑷繁鍐欑殑layui缁勪欢绠�鍐欙紝 鍦╲ciAlias閲岀殑alias鍔犲叆鏄犲皠锛屾瘮濡�
+  ```
+      'vciWebDialog':'frock/vciWebDialog'
+      // 宸﹁竟鏄畝鍐欑殑鍚嶅瓧锛屽彸杈规槸鍏ㄨ矾寰勶紝閰嶇疆鍚庡叾浠栧湴鏂瑰紩鐢ㄥ彧闇�瑕佸啓绠�鍐�.鑰屼笖鍙充晶鐨勮矾寰勫繀椤绘槸鍦╨ayui鐨勪富鐩綍涓�
+   ```
+  - 寤鸿鑷繁椤圭洰鐨刯s閮藉湪涓�涓枃浠跺す涓嬶紝鏂逛究琚叾浠栭」鐩殑寮曠敤銆備緥濡傞渶瑕佸紩鍏ヨ祫婧愬簱鐨勶紝鍒欓渶瑕佹妸璧勬簮搴撶殑UI椤圭洰鐨刬nvm鏂囦欢澶规嫹璐濊繃鏉ュ嵆鍙�
+
+3.閰嶇疆
+- config.json 
+  
+  ```
+    {
+	"isDebug":true, //杩欎釜鏄槸鍚︿负璋冭瘯榛樿锛屽湪寮�鍙戞ā寮忎笅蹇呴』璁剧疆
+	"jsversion":"杩欎釜鏄疛s鐨勭増鏈紝鍦ㄦ瘡娆℃洿鏂扮殑鏃跺�欐敼涓嬪�煎嵆鍙�",
+    "backPath":"榛樿鐨勫湴鍧�锛屼絾鏄娇鐢ㄥ緢灏�.杩欎釜鏄痭ginx閲岄厤缃殑鍦板潃.姣斿http://xxx:yy/gzmes/ 锛� 鍦ㄨ�侀」鐩腑鍙厤缃繖涓�",
+    "singleLoginUrl":"鍗曠偣鐧诲綍鐨勫湴鍧�锛屼竴鑸笉淇敼",
+	"title":"杩欎釜鏄爣棰�",
+	"unSecret": true,
+	"unSecretText": "涓婇潰杩欎釜灞炴�т负true鏃舵墠鏄剧ず鍦ㄧ櫥褰曢〉闈€�傛瘮濡傚唴閮�,涓ョ澶勭悊瀛樺偍鎴栦紶閫掓秹瀵嗕俊鎭�",
+	"webJsLib":"vciweb/",
+	"mainDisplay": "popup鏄脊鍑虹獥鍙o紝浣嗘槸鏈�濂借缃负none锛屽惁鍒欒繙绋嬫闈㈢殑鏃跺�欎細鍗犳弧灞忓箷",
+	"vciWebPortal":{
+		"mainConfig":{
+			"indexPageModel":"棣栭〉鐨勫湴鍧�锛岀幇鍦ㄦ殏鏃惰嚜琛岃缃紝鍚庣画鏄潬閰嶇疆鐨�",
+			"companyLogo": "鍏徃logo鐨勫湴鍧�",
+			"companyMinLogo": "鏈�灏忓寲鐨勬椂鍊欏叕鍙竘ogo",
+			"installHtml": "瀹夎璇存槑鐨勫湴鍧�锛屼粠vciweb寮�濮嬶紝鏄浉瀵逛簬main.html鐨勮矾寰勭殑"
+		}
+	},
+	"theme":"涓婚,榛樿涓鸿摑澶╃櫧浜�"
+    }
+  ```
diff --git a/Source/platformProject/platform2022UI/config.json b/Source/platformProject/platform2022UI/config.json
new file mode 100644
index 0000000..f05fb4c
--- /dev/null
+++ b/Source/platformProject/platform2022UI/config.json
@@ -0,0 +1,42 @@
+{
+	"isDebug":true,
+	"jsversion":"20200222",
+	"titleLogo": "",
+	"title":"涓埅锛堟垚閮斤級鏃犱汉鏈哄埗閫犳墽琛岀鐞�",
+	"titleFontSize": "16",
+	"compatibility":true,
+	"unSecret": false,
+	"unSecretText": "鍐呴儴,涓ョ澶勭悊瀛樺偍鎴栦紶閫掓秹瀵嗕俊鎭�",
+	"webJsLib":"vciweb/",
+	"mainDisplay": "none",
+	"backPath":"http://localhost:12000/web/",
+	"objectServicePath":"http://localhost:12000/web/",
+	"frameworkPath":"http://localhost:12000/web/",
+	"filePreviewPath": "http://dev.yunkeruida.top:8090/gzmes/vciFilePreview/",
+	"adminServicePath": "http://localhost:18079/admin/",
+	"unCorsPath": "",
+	"vciWebPortal":{
+		"mainConfig":{
+			"pageWidth1440":1440,
+			"pageWidth1280":1280,
+			"pageHeight900":900,
+			"pageHeight720":720,
+			"isShowMpm": true
+		}
+	},
+	"vciWebPortalDojoUI": {
+		"mainConfig":{
+			"pageWidth1440":1440,
+			"pageWidth1280":1280,
+			"pageHeight900":900,
+			"pageHeight720":720,
+			"isShowMpm": true
+		}
+	},
+	"OsCodeGeneratorComp":{
+		"packageName": "com.vci.mes.wrj",
+		"servicePath": "mesWrjService",
+		"user": "weidy",
+		"jsPrefix": "mes/wrj"
+	}
+}
diff --git a/Source/platformProject/platform2022UI/doc.html b/Source/platformProject/platform2022UI/doc.html
new file mode 100644
index 0000000..de6dd3c
--- /dev/null
+++ b/Source/platformProject/platform2022UI/doc.html
@@ -0,0 +1,40 @@
+
+<!DOCTYPE html>
+<html>
+<head>
+	<script src="jslib/jquery/jquery-1.8.2.min.js" type="text/javascript" charset="UTF-8"></script>
+	<script src="jslib/jquery/jquery.cookie.js" type="text/javascript" charset="UTF-8"></script>
+	<script src="jslib/jquery/jquery.fileDownload.js" type="text/javascript" charset="UTF-8"></script>
+	<!--[if lt IE 9]>
+	<script src="jslib/corsforie8/jQuery.XDomainRequest.js" type="text/javascript" charset="UTF-8"></script>
+	<script src="jslib/corsforie8/jquery.xdomainrequest.min.js" type="text/javascript" charset="UTF-8"></script>
+	<script src="jslib/metaQueryForIe8/htm5.min.js" type="text/javascript" charset="UTF-8"></script>
+	<script src="jslib/metaQueryForIe8/respond.min.js" type="text/javascript" charset="UTF-8"></script>
+	<![endif]-->
+	<script src="jslib/layui-2.2.5-debug/layui.js" type="text/javascript" charset="UTF-8"></script>
+	<script src="jslib/vcijs/browserInfo.js" type="text/javascript" charset="UTF-8"></script>
+	<script src="jslib/vcijs/vciWebUtil.js" type="text/javascript" charset="UTF-8"></script>
+	<script src="jslib/vcijs/main.js" type="text/javascript" charset="UTF-8"></script>
+
+	<link  href="jslib/layui-2.2.5-debug/css/layui.css" rel="stylesheet" type="text/css"/>
+	<link  href="jslib/layui-2.2.5-debug/alicon/alicon.css" rel="stylesheet" type="text/css"/>
+	<link href="style/css/layuimodify.css" rel="stylesheet" type="text/css"/>
+	<meta charset="UTF-8" />
+	<meta http-equiv="X-UA-Compatible" content="IE=edge" />
+	<title>寮�鍙戞枃妗�</title>
+</head>
+<BODY style="background-color: #f0f2f5">
+<noscript>浣犵殑娴忚鍣ㄦ病鏈夊惎鐢╦avascript锛屾棤娉曚娇鐢ㄦ湰绯荤粺</noscript>
+<div id="VciMd" style="margin: 20px;"></div>
+<script type="text/javascript" >
+	(function() {
+
+		layui.use(['platform/objectService/VciMd'], function () {
+			var VciMd = layui['platform/objectService/VciMd'];
+			$('#VciMd').append(VciMd.getContent());
+			VciMd.init();
+		});
+	})()
+</script>
+</BODY>
+</html>
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/index.html b/Source/platformProject/platform2022UI/index.html
new file mode 100644
index 0000000..7b52165
--- /dev/null
+++ b/Source/platformProject/platform2022UI/index.html
@@ -0,0 +1,78 @@
+
+<!DOCTYPE html>
+<html>
+<head>
+	<script src="jslib/jquery/jquery-1.8.2.min.js" type="text/javascript" charset="UTF-8"></script>
+	<script src="jslib/jquery/jquery.cookie.js" type="text/javascript" charset="UTF-8"></script>
+	<script src="jslib/jquery/jquery.fileDownload.js" type="text/javascript" charset="UTF-8"></script>
+	<!--[if lt IE 9]>
+	<script src="jslib/corsforie8/jQuery.XDomainRequest.js" type="text/javascript" charset="UTF-8"></script>
+	<script src="jslib/corsforie8/jquery.xdomainrequest.min.js" type="text/javascript" charset="UTF-8"></script>
+	<script src="jslib/metaQueryForIe8/htm5.min.js" type="text/javascript" charset="UTF-8"></script>
+	<script src="jslib/metaQueryForIe8/respond.min.js" type="text/javascript" charset="UTF-8"></script>
+	<![endif]-->
+	<script src="jslib/vcijs/browserInfo.js" type="text/javascript" charset="UTF-8"></script>
+	<script src="jslib/vcijs/md5.js" type="text/javascript" charset="UTF-8"></script>
+	<script src="jslib/vcijs/login.js" type="text/javascript" charset="UTF-8"></script>
+	<link rel="stylesheet" type="text/css" href="style/css/login.css" />
+	<meta charset="UTF-8" />
+	<meta http-equiv="X-UA-Compatible" content="IE=edge" />
+	<title></title>
+</head>
+<BODY>
+<noscript>浣犵殑娴忚鍣ㄦ病鏈夊惎鐢╦avascript锛屾棤娉曚娇鐢ㄦ湰绯荤粺</noscript>
+
+<div id="background"><img src="style/images/base/login/background-classic.png" /> </div>
+<div style="position: fixed; right:10%;left:10%;top:15%;text-align: center"><span style="font-size:60px;color:#5c6cff;font-weight:900;" id="loginTitle"></span></div>
+<div id="login" class="login css3style" ><!-- 鐧诲綍妗嗗尯鍩� -->
+	<div class="dm_login">
+		<span id="secretFlag" style="display: none; line-height: 40px;"></span>
+		<div style="clear: both">
+			<div class="login_left">
+				<img id="userPhoto" class="dm_login_user_pic"/><!-- 鐢ㄦ埛澶村儚 -->
+				<div class="dm_login_user_name"></div>
+			</div>
+			<div class="login_right">
+				<div class="loginTabs">
+					<ul class="username">
+						<li>
+							<div class="login_in_one" id="usernamediv" ><!-- 鐢ㄦ埛鍚嶆枃鏈 -->
+								<div class="login_in_one_left">
+									<img src="style/images/base/login/login_name.png" class="login_in_one_left_img1">
+								</div><!-- 宸︿晶鐨勫浘鏍� -->
+								<input type="text" name="userid"  class="cookieinput" id="userid" placeholder="璇锋偍杈撳叆鐢ㄦ埛鍚�" autocomplete="off" />
+							</div>
+						</li>
+						<li >
+							<div class="login_in_one" id="passworddiv">
+								<div class="login_in_one_left">
+									<img src="style/images/base/login/login_pw.png" class="login_in_one_left_img2">
+								</div>
+								<input type="password" name="password"  id="password"  placeholder="璇锋偍杈撳叆瀵嗙爜" autocomplete="off"/>
+							</div>
+							<div class="login_in_three" id="loginbt" class="css3style">鐧� 褰�
+							</div>
+						</li>
+					</ul>
+					<ul>
+						<li>
+							<div class="toolbar">
+								<div class="login_in_two">
+									<div class="login_in_two_left" id="isForceLoginDiv"><span><input type="checkbox" id="isForceLogin" checked="checked"></span>鏄惁寮哄埗鐧诲綍  </div>
+									<div class="login_in_two_right" id="remenberUidDiv"><span><input type="checkbox" id="remenberUid" checked="checked"></span> 璁颁綇璐︽埛</div>
+									<div class="login_in_two_right" style="display:none"><a>蹇樿瀵嗙爜?</a></div>
+								</div>
+							</div>
+						</li>
+						<li></li>
+					</ul>
+				</div>
+			</div>
+		</div>
+		<div  id="msg" class="msg" style="clear: both">&nbsp;</div>
+	</div>
+</div>
+<div class=loadbg></div>
+<div class="loading"><div class="processbar"></div><div style="position: absolute">姝e湪鐧诲綍涓紝宸茬粡鑰楁椂<span id="useTime">0</span>绉掞紝璇风◢绛�....</div></div>
+</BODY>
+</html>
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/indexAdmin.html b/Source/platformProject/platform2022UI/indexAdmin.html
new file mode 100644
index 0000000..ea7c3f7
--- /dev/null
+++ b/Source/platformProject/platform2022UI/indexAdmin.html
@@ -0,0 +1,72 @@
+
+<!DOCTYPE html>
+<html>
+<head>
+	<script src="jslib/jquery/jquery-1.8.2.min.js" type="text/javascript" charset="UTF-8"></script>
+	<script src="jslib/jquery/jquery.cookie.js" type="text/javascript" charset="UTF-8"></script>
+	<script src="jslib/jquery/jquery.fileDownload.js" type="text/javascript" charset="UTF-8"></script>
+	<!--[if lt IE 9]>
+	<script src="jslib/corsforie8/jQuery.XDomainRequest.js" type="text/javascript" charset="UTF-8"></script>
+	<script src="jslib/corsforie8/jquery.xdomainrequest.min.js" type="text/javascript" charset="UTF-8"></script>
+	<script src="jslib/metaQueryForIe8/htm5.min.js" type="text/javascript" charset="UTF-8"></script>
+	<script src="jslib/metaQueryForIe8/respond.min.js" type="text/javascript" charset="UTF-8"></script>
+	<![endif]-->
+	<script src="jslib/vcijs/browserInfo.js" type="text/javascript" charset="UTF-8"></script>
+	<script src="jslib/vcijs/md5.js" type="text/javascript" charset="UTF-8"></script>
+	<script src="jslib/vcijs/admin.js" type="text/javascript" charset="UTF-8"></script>
+	<link rel="stylesheet" type="text/css" href="style/css/login.css" />
+	<meta charset="UTF-8" />
+	<meta http-equiv="X-UA-Compatible" content="IE=edge" />
+	<title></title>
+</head>
+<BODY>
+	<noscript>浣犵殑娴忚鍣ㄦ病鏈夊惎鐢╦avascript锛屾棤娉曚娇鐢ㄦ湰绯荤粺</noscript>
+	<div id="background"><img src="style/images/base/login/background-classic.png" /> </div>
+   <div id="login" class="login css3style"  ><!-- 鐧诲綍妗嗗尯鍩� -->
+	   <div class="dm_login">
+		   <span id="secretFlag" style="display: none; line-height: 40px;"></span>
+		   <div style="clear: both">
+			   <div class="login_left">
+				   <img id="userPhoto" class="dm_login_user_pic"/><!-- 鐢ㄦ埛澶村儚 -->
+				   <div class="dm_login_user_name"></div>
+			   </div>
+			   <div class="login_right">
+				   <div class="loginTabs">
+					   <ul class="username">
+						   <li>
+							   <div class="login_in_one" id="usernamediv" ><!-- 鐢ㄦ埛鍚嶆枃鏈 -->
+								   <div class="login_in_one_left">
+									   <img src="style/images/base/login/login_name.png" class="login_in_one_left_img1">
+								   </div><!-- 宸︿晶鐨勫浘鏍� -->
+								   <input type="text" name="userid"  class="cookieinput" id="userid" placeholder="璇锋偍杈撳叆鐢ㄦ埛鍚�" autocomplete="off" />
+							   </div>
+						   </li>
+						   <li >
+							   <div class="login_in_one" id="passworddiv">
+								   <div class="login_in_one_left">
+									   <img src="style/images/base/login/login_pw.png" class="login_in_one_left_img2">
+								   </div>
+								   <input type="password" name="password"  id="password"  placeholder="璇锋偍杈撳叆瀵嗙爜" autocomplete="off"/>
+							   </div>
+							   <div class="login_in_three" id="loginbt" class="css3style">鐧� 褰�
+							   </div>
+						   </li>
+					   </ul>
+					   <ul>
+						   <li>
+							   <div class="toolbar" style="height: auto">
+								   <div class="login_in_two">
+								   </div>
+							   </div>
+						   </li>
+					   </ul>
+				   </div>
+			   </div>
+		   </div>
+		   <div  id="msg" class="msg" style="clear: both">&nbsp;</div>
+	   </div>
+   </div>
+   <div class=loadbg></div>
+	<div class="loading"><div class="processbar"></div><div style="position: absolute">姝e湪鐧诲綍涓紝宸茬粡鑰楁椂<span id="useTime">0</span>绉掞紝璇风◢绛�....</div></div>
+</BODY>
+</html>
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/corsforie8/jQuery.XDomainRequest.js b/Source/platformProject/platform2022UI/jslib/corsforie8/jQuery.XDomainRequest.js
new file mode 100644
index 0000000..beb4fb0
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/corsforie8/jQuery.XDomainRequest.js
@@ -0,0 +1,119 @@
+/*!
+ * jQuery-ajaxTransport-XDomainRequest - v1.0.4 - 2015-03-05
+ * https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest
+ * Copyright (c) 2015 Jason Moon (@JSONMOON)
+ * Licensed MIT (/blob/master/LICENSE.txt)
+ */
+(function(factory) {
+  if (typeof define === 'function' && define.amd) {
+    // AMD. Register as anonymous module.
+    define(['jquery'], factory);
+  } else if (typeof exports === 'object') {
+    // CommonJS
+    module.exports = factory(require('jquery'));
+  } else {
+    // Browser globals.
+    factory(jQuery);
+  }
+}(function($) {
+
+// Only continue if we're on IE8/IE9 with jQuery 1.5+ (contains the ajaxTransport function)
+if ($.support.cors || !$.ajaxTransport || !window.XDomainRequest) {
+  return $;
+}
+
+var httpRegEx = /^(https?:)?\/\//i;
+var getOrPostRegEx = /^get|post$/i;
+var sameSchemeRegEx = new RegExp('^(\/\/|' + location.protocol + ')', 'i');
+
+// ajaxTransport exists in jQuery 1.5+
+$.ajaxTransport('* text html xml json', function(options, userOptions, jqXHR) {
+
+  // Only continue if the request is: asynchronous, uses GET or POST method, has HTTP or HTTPS protocol, and has the same scheme as the calling page
+  if (!options.crossDomain || !options.async || !getOrPostRegEx.test(options.type) || !httpRegEx.test(options.url) || !sameSchemeRegEx.test(options.url)) {
+    return;
+  }
+
+  var xdr = null;
+
+  return {
+    send: function(headers, complete) {
+      var postData = '';
+      var userType = (userOptions.dataType || '').toLowerCase();
+
+      xdr = new XDomainRequest();
+      if (/^\d+$/.test(userOptions.timeout)) {
+        xdr.timeout = userOptions.timeout;
+      }
+
+      xdr.ontimeout = function() {
+        complete(500, 'timeout');
+      };
+
+      xdr.onload = function() {
+        var allResponseHeaders = 'Content-Length: ' + xdr.responseText.length + '\r\nContent-Type: ' + xdr.contentType;
+        var status = {
+          code: 200,
+          message: 'success'
+        };
+        var responses = {
+          text: xdr.responseText
+        };
+        try {
+          if (userType === 'html' || /text\/html/i.test(xdr.contentType)) {
+            responses.html = xdr.responseText;
+          } else if (userType === 'json' || (userType !== 'text' && /\/json/i.test(xdr.contentType))) {
+            try {
+              responses.json = $.parseJSON(xdr.responseText);
+            } catch(e) {
+              status.code = 500;
+              status.message = 'parseerror';
+              //throw 'Invalid JSON: ' + xdr.responseText;
+            }
+          } else if (userType === 'xml' || (userType !== 'text' && /\/xml/i.test(xdr.contentType))) {
+            var doc = new ActiveXObject('Microsoft.XMLDOM');
+            doc.async = false;
+            try {
+              doc.loadXML(xdr.responseText);
+            } catch(e) {
+              doc = undefined;
+            }
+            if (!doc || !doc.documentElement || doc.getElementsByTagName('parsererror').length) {
+              status.code = 500;
+              status.message = 'parseerror';
+              throw 'Invalid XML: ' + xdr.responseText;
+            }
+            responses.xml = doc;
+          }
+        } catch(parseMessage) {
+          throw parseMessage;
+        } finally {
+          complete(status.code, status.message, responses, allResponseHeaders);
+        }
+      };
+
+      // set an empty handler for 'onprogress' so requests don't get aborted
+      xdr.onprogress = function(){};
+      xdr.onerror = function() {
+        complete(500, 'error', {
+          text: xdr.responseText
+        });
+      };
+
+      if (userOptions.data) {
+        postData = ($.type(userOptions.data) === 'string') ? userOptions.data : $.param(userOptions.data);
+      }
+      xdr.open(options.type, options.url);
+      xdr.send(postData);
+    },
+    abort: function() {
+      if (xdr) {
+        xdr.abort();
+      }
+    }
+  };
+});
+
+return $;
+
+}));
diff --git a/Source/platformProject/platform2022UI/jslib/corsforie8/jquery.xdomainrequest.min.js b/Source/platformProject/platform2022UI/jslib/corsforie8/jquery.xdomainrequest.min.js
new file mode 100644
index 0000000..1b0196e
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/corsforie8/jquery.xdomainrequest.min.js
@@ -0,0 +1,7 @@
+/*!
+ * jQuery-ajaxTransport-XDomainRequest - v1.0.4 - 2015-03-05
+ * https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest
+ * Copyright (c) 2015 Jason Moon (@JSONMOON)
+ * Licensed MIT (/blob/master/LICENSE.txt)
+ */
+(function(a){if(typeof define==='function'&&define.amd){define(['jquery'],a)}else if(typeof exports==='object'){module.exports=a(require('jquery'))}else{a(jQuery)}}(function($){if($.support.cors||!$.ajaxTransport||!window.XDomainRequest){return $}var n=/^(https?:)?\/\//i;var o=/^get|post$/i;var p=new RegExp('^(\/\/|'+location.protocol+')','i');$.ajaxTransport('* text html xml json',function(j,k,l){if(!j.crossDomain||!j.async||!o.test(j.type)||!n.test(j.url)||!p.test(j.url)){return}var m=null;return{send:function(f,g){var h='';var i=(k.dataType||'').toLowerCase();m=new XDomainRequest();if(/^\d+$/.test(k.timeout)){m.timeout=k.timeout}m.ontimeout=function(){g(500,'timeout')};m.onload=function(){var a='Content-Length: '+m.responseText.length+'\r\nContent-Type: '+m.contentType;var b={code:200,message:'success'};var c={text:m.responseText};try{if(i==='html'||/text\/html/i.test(m.contentType)){c.html=m.responseText}else if(i==='json'||(i!=='text'&&/\/json/i.test(m.contentType))){try{c.json=$.parseJSON(m.responseText)}catch(e){b.code=500;b.message='parseerror'}}else if(i==='xml'||(i!=='text'&&/\/xml/i.test(m.contentType))){var d=new ActiveXObject('Microsoft.XMLDOM');d.async=false;try{d.loadXML(m.responseText)}catch(e){d=undefined}if(!d||!d.documentElement||d.getElementsByTagName('parsererror').length){b.code=500;b.message='parseerror';throw'Invalid XML: '+m.responseText;}c.xml=d}}catch(parseMessage){throw parseMessage;}finally{g(b.code,b.message,c,a)}};m.onprogress=function(){};m.onerror=function(){g(500,'error',{text:m.responseText})};if(k.data){h=($.type(k.data)==='string')?k.data:$.param(k.data)}m.open(j.type,j.url);m.send(h)},abort:function(){if(m){m.abort()}}}});return $}));
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/jquery/jquery-1.12.4.js b/Source/platformProject/platform2022UI/jslib/jquery/jquery-1.12.4.js
new file mode 100644
index 0000000..98a676d
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/jquery/jquery-1.12.4.js
@@ -0,0 +1,11008 @@
+/*!
+ * jQuery JavaScript Library v1.12.4
+ * http://jquery.com/
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2016-05-20T17:17Z
+ */
+
+(function( global, factory ) {
+
+	if ( typeof module === "object" && typeof module.exports === "object" ) {
+		// For CommonJS and CommonJS-like environments where a proper `window`
+		// is present, execute the factory and get jQuery.
+		// For environments that do not have a `window` with a `document`
+		// (such as Node.js), expose a factory as module.exports.
+		// This accentuates the need for the creation of a real `window`.
+		// e.g. var jQuery = require("jquery")(window);
+		// See ticket #14549 for more info.
+		module.exports = global.document ?
+			factory( global, true ) :
+			function( w ) {
+				if ( !w.document ) {
+					throw new Error( "jQuery requires a window with a document" );
+				}
+				return factory( w );
+			};
+	} else {
+		factory( global );
+	}
+
+// Pass this if window is not defined yet
+}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
+
+// Support: Firefox 18+
+// Can't be in strict mode, several libs including ASP.NET trace
+// the stack via arguments.caller.callee and Firefox dies if
+// you try to trace through "use strict" call chains. (#13335)
+//"use strict";
+var deletedIds = [];
+
+var document = window.document;
+
+var slice = deletedIds.slice;
+
+var concat = deletedIds.concat;
+
+var push = deletedIds.push;
+
+var indexOf = deletedIds.indexOf;
+
+var class2type = {};
+
+var toString = class2type.toString;
+
+var hasOwn = class2type.hasOwnProperty;
+
+var support = {};
+
+
+
+var
+	version = "1.12.4",
+
+	// Define a local copy of jQuery
+	jQuery = function( selector, context ) {
+
+		// The jQuery object is actually just the init constructor 'enhanced'
+		// Need init if jQuery is called (just allow error to be thrown if not included)
+		return new jQuery.fn.init( selector, context );
+	},
+
+	// Support: Android<4.1, IE<9
+	// Make sure we trim BOM and NBSP
+	rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
+
+	// Matches dashed string for camelizing
+	rmsPrefix = /^-ms-/,
+	rdashAlpha = /-([\da-z])/gi,
+
+	// Used by jQuery.camelCase as callback to replace()
+	fcamelCase = function( all, letter ) {
+		return letter.toUpperCase();
+	};
+
+jQuery.fn = jQuery.prototype = {
+
+	// The current version of jQuery being used
+	jquery: version,
+
+	constructor: jQuery,
+
+	// Start with an empty selector
+	selector: "",
+
+	// The default length of a jQuery object is 0
+	length: 0,
+
+	toArray: function() {
+		return slice.call( this );
+	},
+
+	// Get the Nth element in the matched element set OR
+	// Get the whole matched element set as a clean array
+	get: function( num ) {
+		return num != null ?
+
+			// Return just the one element from the set
+			( num < 0 ? this[ num + this.length ] : this[ num ] ) :
+
+			// Return all the elements in a clean array
+			slice.call( this );
+	},
+
+	// Take an array of elements and push it onto the stack
+	// (returning the new matched element set)
+	pushStack: function( elems ) {
+
+		// Build a new jQuery matched element set
+		var ret = jQuery.merge( this.constructor(), elems );
+
+		// Add the old object onto the stack (as a reference)
+		ret.prevObject = this;
+		ret.context = this.context;
+
+		// Return the newly-formed element set
+		return ret;
+	},
+
+	// Execute a callback for every element in the matched set.
+	each: function( callback ) {
+		return jQuery.each( this, callback );
+	},
+
+	map: function( callback ) {
+		return this.pushStack( jQuery.map( this, function( elem, i ) {
+			return callback.call( elem, i, elem );
+		} ) );
+	},
+
+	slice: function() {
+		return this.pushStack( slice.apply( this, arguments ) );
+	},
+
+	first: function() {
+		return this.eq( 0 );
+	},
+
+	last: function() {
+		return this.eq( -1 );
+	},
+
+	eq: function( i ) {
+		var len = this.length,
+			j = +i + ( i < 0 ? len : 0 );
+		return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
+	},
+
+	end: function() {
+		return this.prevObject || this.constructor();
+	},
+
+	// For internal use only.
+	// Behaves like an Array's method, not like a jQuery method.
+	push: push,
+	sort: deletedIds.sort,
+	splice: deletedIds.splice
+};
+
+jQuery.extend = jQuery.fn.extend = function() {
+	var src, copyIsArray, copy, name, options, clone,
+		target = arguments[ 0 ] || {},
+		i = 1,
+		length = arguments.length,
+		deep = false;
+
+	// Handle a deep copy situation
+	if ( typeof target === "boolean" ) {
+		deep = target;
+
+		// skip the boolean and the target
+		target = arguments[ i ] || {};
+		i++;
+	}
+
+	// Handle case when target is a string or something (possible in deep copy)
+	if ( typeof target !== "object" && !jQuery.isFunction( target ) ) {
+		target = {};
+	}
+
+	// extend jQuery itself if only one argument is passed
+	if ( i === length ) {
+		target = this;
+		i--;
+	}
+
+	for ( ; i < length; i++ ) {
+
+		// Only deal with non-null/undefined values
+		if ( ( options = arguments[ i ] ) != null ) {
+
+			// Extend the index object
+			for ( name in options ) {
+				src = target[ name ];
+				copy = options[ name ];
+
+				// Prevent never-ending loop
+				if ( target === copy ) {
+					continue;
+				}
+
+				// Recurse if we're merging plain objects or arrays
+				if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
+					( copyIsArray = jQuery.isArray( copy ) ) ) ) {
+
+					if ( copyIsArray ) {
+						copyIsArray = false;
+						clone = src && jQuery.isArray( src ) ? src : [];
+
+					} else {
+						clone = src && jQuery.isPlainObject( src ) ? src : {};
+					}
+
+					// Never move original objects, clone them
+					target[ name ] = jQuery.extend( deep, clone, copy );
+
+				// Don't bring in undefined values
+				} else if ( copy !== undefined ) {
+					target[ name ] = copy;
+				}
+			}
+		}
+	}
+
+	// Return the modified object
+	return target;
+};
+
+jQuery.extend( {
+
+	// Unique for each copy of jQuery on the page
+	expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
+
+	// Assume jQuery is ready without the ready module
+	isReady: true,
+
+	error: function( msg ) {
+		throw new Error( msg );
+	},
+
+	noop: function() {},
+
+	// See test/unit/core.js for details concerning isFunction.
+	// Since version 1.3, DOM methods and functions like alert
+	// aren't supported. They return false on IE (#2968).
+	isFunction: function( obj ) {
+		return jQuery.type( obj ) === "function";
+	},
+
+	isArray: Array.isArray || function( obj ) {
+		return jQuery.type( obj ) === "array";
+	},
+
+	isWindow: function( obj ) {
+		/* jshint eqeqeq: false */
+		return obj != null && obj == obj.window;
+	},
+
+	isNumeric: function( obj ) {
+
+		// parseFloat NaNs numeric-cast false positives (null|true|false|"")
+		// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
+		// subtraction forces infinities to NaN
+		// adding 1 corrects loss of precision from parseFloat (#15100)
+		var realStringObj = obj && obj.toString();
+		return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0;
+	},
+
+	isEmptyObject: function( obj ) {
+		var name;
+		for ( name in obj ) {
+			return false;
+		}
+		return true;
+	},
+
+	isPlainObject: function( obj ) {
+		var key;
+
+		// Must be an Object.
+		// Because of IE, we also have to check the presence of the constructor property.
+		// Make sure that DOM nodes and window objects don't pass through, as well
+		if ( !obj || jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+			return false;
+		}
+
+		try {
+
+			// Not own constructor property must be Object
+			if ( obj.constructor &&
+				!hasOwn.call( obj, "constructor" ) &&
+				!hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) {
+				return false;
+			}
+		} catch ( e ) {
+
+			// IE8,9 Will throw exceptions on certain host objects #9897
+			return false;
+		}
+
+		// Support: IE<9
+		// Handle iteration over inherited properties before own properties.
+		if ( !support.ownFirst ) {
+			for ( key in obj ) {
+				return hasOwn.call( obj, key );
+			}
+		}
+
+		// Own properties are enumerated firstly, so to speed up,
+		// if last one is own, then all properties are own.
+		for ( key in obj ) {}
+
+		return key === undefined || hasOwn.call( obj, key );
+	},
+
+	type: function( obj ) {
+		if ( obj == null ) {
+			return obj + "";
+		}
+		return typeof obj === "object" || typeof obj === "function" ?
+			class2type[ toString.call( obj ) ] || "object" :
+			typeof obj;
+	},
+
+	// Workarounds based on findings by Jim Driscoll
+	// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
+	globalEval: function( data ) {
+		if ( data && jQuery.trim( data ) ) {
+
+			// We use execScript on Internet Explorer
+			// We use an anonymous function so that context is window
+			// rather than jQuery in Firefox
+			( window.execScript || function( data ) {
+				window[ "eval" ].call( window, data ); // jscs:ignore requireDotNotation
+			} )( data );
+		}
+	},
+
+	// Convert dashed to camelCase; used by the css and data modules
+	// Microsoft forgot to hump their vendor prefix (#9572)
+	camelCase: function( string ) {
+		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+	},
+
+	nodeName: function( elem, name ) {
+		return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+	},
+
+	each: function( obj, callback ) {
+		var length, i = 0;
+
+		if ( isArrayLike( obj ) ) {
+			length = obj.length;
+			for ( ; i < length; i++ ) {
+				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
+					break;
+				}
+			}
+		} else {
+			for ( i in obj ) {
+				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
+					break;
+				}
+			}
+		}
+
+		return obj;
+	},
+
+	// Support: Android<4.1, IE<9
+	trim: function( text ) {
+		return text == null ?
+			"" :
+			( text + "" ).replace( rtrim, "" );
+	},
+
+	// results is for internal usage only
+	makeArray: function( arr, results ) {
+		var ret = results || [];
+
+		if ( arr != null ) {
+			if ( isArrayLike( Object( arr ) ) ) {
+				jQuery.merge( ret,
+					typeof arr === "string" ?
+					[ arr ] : arr
+				);
+			} else {
+				push.call( ret, arr );
+			}
+		}
+
+		return ret;
+	},
+
+	inArray: function( elem, arr, i ) {
+		var len;
+
+		if ( arr ) {
+			if ( indexOf ) {
+				return indexOf.call( arr, elem, i );
+			}
+
+			len = arr.length;
+			i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
+
+			for ( ; i < len; i++ ) {
+
+				// Skip accessing in sparse arrays
+				if ( i in arr && arr[ i ] === elem ) {
+					return i;
+				}
+			}
+		}
+
+		return -1;
+	},
+
+	merge: function( first, second ) {
+		var len = +second.length,
+			j = 0,
+			i = first.length;
+
+		while ( j < len ) {
+			first[ i++ ] = second[ j++ ];
+		}
+
+		// Support: IE<9
+		// Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists)
+		if ( len !== len ) {
+			while ( second[ j ] !== undefined ) {
+				first[ i++ ] = second[ j++ ];
+			}
+		}
+
+		first.length = i;
+
+		return first;
+	},
+
+	grep: function( elems, callback, invert ) {
+		var callbackInverse,
+			matches = [],
+			i = 0,
+			length = elems.length,
+			callbackExpect = !invert;
+
+		// Go through the array, only saving the items
+		// that pass the validator function
+		for ( ; i < length; i++ ) {
+			callbackInverse = !callback( elems[ i ], i );
+			if ( callbackInverse !== callbackExpect ) {
+				matches.push( elems[ i ] );
+			}
+		}
+
+		return matches;
+	},
+
+	// arg is for internal usage only
+	map: function( elems, callback, arg ) {
+		var length, value,
+			i = 0,
+			ret = [];
+
+		// Go through the array, translating each of the items to their new values
+		if ( isArrayLike( elems ) ) {
+			length = elems.length;
+			for ( ; i < length; i++ ) {
+				value = callback( elems[ i ], i, arg );
+
+				if ( value != null ) {
+					ret.push( value );
+				}
+			}
+
+		// Go through every key on the object,
+		} else {
+			for ( i in elems ) {
+				value = callback( elems[ i ], i, arg );
+
+				if ( value != null ) {
+					ret.push( value );
+				}
+			}
+		}
+
+		// Flatten any nested arrays
+		return concat.apply( [], ret );
+	},
+
+	// A global GUID counter for objects
+	guid: 1,
+
+	// Bind a function to a context, optionally partially applying any
+	// arguments.
+	proxy: function( fn, context ) {
+		var args, proxy, tmp;
+
+		if ( typeof context === "string" ) {
+			tmp = fn[ context ];
+			context = fn;
+			fn = tmp;
+		}
+
+		// Quick check to determine if target is callable, in the spec
+		// this throws a TypeError, but we will just return undefined.
+		if ( !jQuery.isFunction( fn ) ) {
+			return undefined;
+		}
+
+		// Simulated bind
+		args = slice.call( arguments, 2 );
+		proxy = function() {
+			return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
+		};
+
+		// Set the guid of unique handler to the same of original handler, so it can be removed
+		proxy.guid = fn.guid = fn.guid || jQuery.guid++;
+
+		return proxy;
+	},
+
+	now: function() {
+		return +( new Date() );
+	},
+
+	// jQuery.support is not used in Core but other projects attach their
+	// properties to it so it needs to exist.
+	support: support
+} );
+
+// JSHint would error on this code due to the Symbol not being defined in ES5.
+// Defining this global in .jshintrc would create a danger of using the global
+// unguarded in another place, it seems safer to just disable JSHint for these
+// three lines.
+/* jshint ignore: start */
+if ( typeof Symbol === "function" ) {
+	jQuery.fn[ Symbol.iterator ] = deletedIds[ Symbol.iterator ];
+}
+/* jshint ignore: end */
+
+// Populate the class2type map
+jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
+function( i, name ) {
+	class2type[ "[object " + name + "]" ] = name.toLowerCase();
+} );
+
+function isArrayLike( obj ) {
+
+	// Support: iOS 8.2 (not reproducible in simulator)
+	// `in` check used to prevent JIT error (gh-2145)
+	// hasOwn isn't used here due to false negatives
+	// regarding Nodelist length in IE
+	var length = !!obj && "length" in obj && obj.length,
+		type = jQuery.type( obj );
+
+	if ( type === "function" || jQuery.isWindow( obj ) ) {
+		return false;
+	}
+
+	return type === "array" || length === 0 ||
+		typeof length === "number" && length > 0 && ( length - 1 ) in obj;
+}
+var Sizzle =
+/*!
+ * Sizzle CSS Selector Engine v2.2.1
+ * http://sizzlejs.com/
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2015-10-17
+ */
+(function( window ) {
+
+var i,
+	support,
+	Expr,
+	getText,
+	isXML,
+	tokenize,
+	compile,
+	select,
+	outermostContext,
+	sortInput,
+	hasDuplicate,
+
+	// Local document vars
+	setDocument,
+	document,
+	docElem,
+	documentIsHTML,
+	rbuggyQSA,
+	rbuggyMatches,
+	matches,
+	contains,
+
+	// Instance-specific data
+	expando = "sizzle" + 1 * new Date(),
+	preferredDoc = window.document,
+	dirruns = 0,
+	done = 0,
+	classCache = createCache(),
+	tokenCache = createCache(),
+	compilerCache = createCache(),
+	sortOrder = function( a, b ) {
+		if ( a === b ) {
+			hasDuplicate = true;
+		}
+		return 0;
+	},
+
+	// General-purpose constants
+	MAX_NEGATIVE = 1 << 31,
+
+	// Instance methods
+	hasOwn = ({}).hasOwnProperty,
+	arr = [],
+	pop = arr.pop,
+	push_native = arr.push,
+	push = arr.push,
+	slice = arr.slice,
+	// Use a stripped-down indexOf as it's faster than native
+	// http://jsperf.com/thor-indexof-vs-for/5
+	indexOf = function( list, elem ) {
+		var i = 0,
+			len = list.length;
+		for ( ; i < len; i++ ) {
+			if ( list[i] === elem ) {
+				return i;
+			}
+		}
+		return -1;
+	},
+
+	booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
+
+	// Regular expressions
+
+	// http://www.w3.org/TR/css3-selectors/#whitespace
+	whitespace = "[\\x20\\t\\r\\n\\f]",
+
+	// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
+	identifier = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
+
+	// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
+	attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
+		// Operator (capture 2)
+		"*([*^$|!~]?=)" + whitespace +
+		// "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
+		"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
+		"*\\]",
+
+	pseudos = ":(" + identifier + ")(?:\\((" +
+		// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
+		// 1. quoted (capture 3; capture 4 or capture 5)
+		"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
+		// 2. simple (capture 6)
+		"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
+		// 3. anything else (capture 2)
+		".*" +
+		")\\)|)",
+
+	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+	rwhitespace = new RegExp( whitespace + "+", "g" ),
+	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
+
+	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
+	rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
+
+	rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
+
+	rpseudo = new RegExp( pseudos ),
+	ridentifier = new RegExp( "^" + identifier + "$" ),
+
+	matchExpr = {
+		"ID": new RegExp( "^#(" + identifier + ")" ),
+		"CLASS": new RegExp( "^\\.(" + identifier + ")" ),
+		"TAG": new RegExp( "^(" + identifier + "|[*])" ),
+		"ATTR": new RegExp( "^" + attributes ),
+		"PSEUDO": new RegExp( "^" + pseudos ),
+		"CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
+			"*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
+			"*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
+		"bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
+		// For use in libraries implementing .is()
+		// We use this for POS matching in `select`
+		"needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
+			whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
+	},
+
+	rinputs = /^(?:input|select|textarea|button)$/i,
+	rheader = /^h\d$/i,
+
+	rnative = /^[^{]+\{\s*\[native \w/,
+
+	// Easily-parseable/retrievable ID or TAG or CLASS selectors
+	rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
+
+	rsibling = /[+~]/,
+	rescape = /'|\\/g,
+
+	// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
+	runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
+	funescape = function( _, escaped, escapedWhitespace ) {
+		var high = "0x" + escaped - 0x10000;
+		// NaN means non-codepoint
+		// Support: Firefox<24
+		// Workaround erroneous numeric interpretation of +"0x"
+		return high !== high || escapedWhitespace ?
+			escaped :
+			high < 0 ?
+				// BMP codepoint
+				String.fromCharCode( high + 0x10000 ) :
+				// Supplemental Plane codepoint (surrogate pair)
+				String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
+	},
+
+	// Used for iframes
+	// See setDocument()
+	// Removing the function wrapper causes a "Permission Denied"
+	// error in IE
+	unloadHandler = function() {
+		setDocument();
+	};
+
+// Optimize for push.apply( _, NodeList )
+try {
+	push.apply(
+		(arr = slice.call( preferredDoc.childNodes )),
+		preferredDoc.childNodes
+	);
+	// Support: Android<4.0
+	// Detect silently failing push.apply
+	arr[ preferredDoc.childNodes.length ].nodeType;
+} catch ( e ) {
+	push = { apply: arr.length ?
+
+		// Leverage slice if possible
+		function( target, els ) {
+			push_native.apply( target, slice.call(els) );
+		} :
+
+		// Support: IE<9
+		// Otherwise append directly
+		function( target, els ) {
+			var j = target.length,
+				i = 0;
+			// Can't trust NodeList.length
+			while ( (target[j++] = els[i++]) ) {}
+			target.length = j - 1;
+		}
+	};
+}
+
+function Sizzle( selector, context, results, seed ) {
+	var m, i, elem, nid, nidselect, match, groups, newSelector,
+		newContext = context && context.ownerDocument,
+
+		// nodeType defaults to 9, since context defaults to document
+		nodeType = context ? context.nodeType : 9;
+
+	results = results || [];
+
+	// Return early from calls with invalid selector or context
+	if ( typeof selector !== "string" || !selector ||
+		nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
+
+		return results;
+	}
+
+	// Try to shortcut find operations (as opposed to filters) in HTML documents
+	if ( !seed ) {
+
+		if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
+			setDocument( context );
+		}
+		context = context || document;
+
+		if ( documentIsHTML ) {
+
+			// If the selector is sufficiently simple, try using a "get*By*" DOM method
+			// (excepting DocumentFragment context, where the methods don't exist)
+			if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
+
+				// ID selector
+				if ( (m = match[1]) ) {
+
+					// Document context
+					if ( nodeType === 9 ) {
+						if ( (elem = context.getElementById( m )) ) {
+
+							// Support: IE, Opera, Webkit
+							// TODO: identify versions
+							// getElementById can match elements by name instead of ID
+							if ( elem.id === m ) {
+								results.push( elem );
+								return results;
+							}
+						} else {
+							return results;
+						}
+
+					// Element context
+					} else {
+
+						// Support: IE, Opera, Webkit
+						// TODO: identify versions
+						// getElementById can match elements by name instead of ID
+						if ( newContext && (elem = newContext.getElementById( m )) &&
+							contains( context, elem ) &&
+							elem.id === m ) {
+
+							results.push( elem );
+							return results;
+						}
+					}
+
+				// Type selector
+				} else if ( match[2] ) {
+					push.apply( results, context.getElementsByTagName( selector ) );
+					return results;
+
+				// Class selector
+				} else if ( (m = match[3]) && support.getElementsByClassName &&
+					context.getElementsByClassName ) {
+
+					push.apply( results, context.getElementsByClassName( m ) );
+					return results;
+				}
+			}
+
+			// Take advantage of querySelectorAll
+			if ( support.qsa &&
+				!compilerCache[ selector + " " ] &&
+				(!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
+
+				if ( nodeType !== 1 ) {
+					newContext = context;
+					newSelector = selector;
+
+				// qSA looks outside Element context, which is not what we want
+				// Thanks to Andrew Dupont for this workaround technique
+				// Support: IE <=8
+				// Exclude object elements
+				} else if ( context.nodeName.toLowerCase() !== "object" ) {
+
+					// Capture the context ID, setting it first if necessary
+					if ( (nid = context.getAttribute( "id" )) ) {
+						nid = nid.replace( rescape, "\\$&" );
+					} else {
+						context.setAttribute( "id", (nid = expando) );
+					}
+
+					// Prefix every selector in the list
+					groups = tokenize( selector );
+					i = groups.length;
+					nidselect = ridentifier.test( nid ) ? "#" + nid : "[id='" + nid + "']";
+					while ( i-- ) {
+						groups[i] = nidselect + " " + toSelector( groups[i] );
+					}
+					newSelector = groups.join( "," );
+
+					// Expand context for sibling selectors
+					newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
+						context;
+				}
+
+				if ( newSelector ) {
+					try {
+						push.apply( results,
+							newContext.querySelectorAll( newSelector )
+						);
+						return results;
+					} catch ( qsaError ) {
+					} finally {
+						if ( nid === expando ) {
+							context.removeAttribute( "id" );
+						}
+					}
+				}
+			}
+		}
+	}
+
+	// All others
+	return select( selector.replace( rtrim, "$1" ), context, results, seed );
+}
+
+/**
+ * Create key-value caches of limited size
+ * @returns {function(string, object)} Returns the Object data after storing it on itself with
+ *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
+ *	deleting the oldest entry
+ */
+function createCache() {
+	var keys = [];
+
+	function cache( key, value ) {
+		// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
+		if ( keys.push( key + " " ) > Expr.cacheLength ) {
+			// Only keep the most recent entries
+			delete cache[ keys.shift() ];
+		}
+		return (cache[ key + " " ] = value);
+	}
+	return cache;
+}
+
+/**
+ * Mark a function for special use by Sizzle
+ * @param {Function} fn The function to mark
+ */
+function markFunction( fn ) {
+	fn[ expando ] = true;
+	return fn;
+}
+
+/**
+ * Support testing using an element
+ * @param {Function} fn Passed the created div and expects a boolean result
+ */
+function assert( fn ) {
+	var div = document.createElement("div");
+
+	try {
+		return !!fn( div );
+	} catch (e) {
+		return false;
+	} finally {
+		// Remove from its parent by default
+		if ( div.parentNode ) {
+			div.parentNode.removeChild( div );
+		}
+		// release memory in IE
+		div = null;
+	}
+}
+
+/**
+ * Adds the same handler for all of the specified attrs
+ * @param {String} attrs Pipe-separated list of attributes
+ * @param {Function} handler The method that will be applied
+ */
+function addHandle( attrs, handler ) {
+	var arr = attrs.split("|"),
+		i = arr.length;
+
+	while ( i-- ) {
+		Expr.attrHandle[ arr[i] ] = handler;
+	}
+}
+
+/**
+ * Checks document order of two siblings
+ * @param {Element} a
+ * @param {Element} b
+ * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
+ */
+function siblingCheck( a, b ) {
+	var cur = b && a,
+		diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
+			( ~b.sourceIndex || MAX_NEGATIVE ) -
+			( ~a.sourceIndex || MAX_NEGATIVE );
+
+	// Use IE sourceIndex if available on both nodes
+	if ( diff ) {
+		return diff;
+	}
+
+	// Check if b follows a
+	if ( cur ) {
+		while ( (cur = cur.nextSibling) ) {
+			if ( cur === b ) {
+				return -1;
+			}
+		}
+	}
+
+	return a ? 1 : -1;
+}
+
+/**
+ * Returns a function to use in pseudos for input types
+ * @param {String} type
+ */
+function createInputPseudo( type ) {
+	return function( elem ) {
+		var name = elem.nodeName.toLowerCase();
+		return name === "input" && elem.type === type;
+	};
+}
+
+/**
+ * Returns a function to use in pseudos for buttons
+ * @param {String} type
+ */
+function createButtonPseudo( type ) {
+	return function( elem ) {
+		var name = elem.nodeName.toLowerCase();
+		return (name === "input" || name === "button") && elem.type === type;
+	};
+}
+
+/**
+ * Returns a function to use in pseudos for positionals
+ * @param {Function} fn
+ */
+function createPositionalPseudo( fn ) {
+	return markFunction(function( argument ) {
+		argument = +argument;
+		return markFunction(function( seed, matches ) {
+			var j,
+				matchIndexes = fn( [], seed.length, argument ),
+				i = matchIndexes.length;
+
+			// Match elements found at the specified indexes
+			while ( i-- ) {
+				if ( seed[ (j = matchIndexes[i]) ] ) {
+					seed[j] = !(matches[j] = seed[j]);
+				}
+			}
+		});
+	});
+}
+
+/**
+ * Checks a node for validity as a Sizzle context
+ * @param {Element|Object=} context
+ * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
+ */
+function testContext( context ) {
+	return context && typeof context.getElementsByTagName !== "undefined" && context;
+}
+
+// Expose support vars for convenience
+support = Sizzle.support = {};
+
+/**
+ * Detects XML nodes
+ * @param {Element|Object} elem An element or a document
+ * @returns {Boolean} True iff elem is a non-HTML XML node
+ */
+isXML = Sizzle.isXML = function( elem ) {
+	// documentElement is verified for cases where it doesn't yet exist
+	// (such as loading iframes in IE - #4833)
+	var documentElement = elem && (elem.ownerDocument || elem).documentElement;
+	return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+/**
+ * Sets document-related variables once based on the current document
+ * @param {Element|Object} [doc] An element or document object to use to set the document
+ * @returns {Object} Returns the current document
+ */
+setDocument = Sizzle.setDocument = function( node ) {
+	var hasCompare, parent,
+		doc = node ? node.ownerDocument || node : preferredDoc;
+
+	// Return early if doc is invalid or already selected
+	if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
+		return document;
+	}
+
+	// Update global variables
+	document = doc;
+	docElem = document.documentElement;
+	documentIsHTML = !isXML( document );
+
+	// Support: IE 9-11, Edge
+	// Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
+	if ( (parent = document.defaultView) && parent.top !== parent ) {
+		// Support: IE 11
+		if ( parent.addEventListener ) {
+			parent.addEventListener( "unload", unloadHandler, false );
+
+		// Support: IE 9 - 10 only
+		} else if ( parent.attachEvent ) {
+			parent.attachEvent( "onunload", unloadHandler );
+		}
+	}
+
+	/* Attributes
+	---------------------------------------------------------------------- */
+
+	// Support: IE<8
+	// Verify that getAttribute really returns attributes and not properties
+	// (excepting IE8 booleans)
+	support.attributes = assert(function( div ) {
+		div.className = "i";
+		return !div.getAttribute("className");
+	});
+
+	/* getElement(s)By*
+	---------------------------------------------------------------------- */
+
+	// Check if getElementsByTagName("*") returns only elements
+	support.getElementsByTagName = assert(function( div ) {
+		div.appendChild( document.createComment("") );
+		return !div.getElementsByTagName("*").length;
+	});
+
+	// Support: IE<9
+	support.getElementsByClassName = rnative.test( document.getElementsByClassName );
+
+	// Support: IE<10
+	// Check if getElementById returns elements by name
+	// The broken getElementById methods don't pick up programatically-set names,
+	// so use a roundabout getElementsByName test
+	support.getById = assert(function( div ) {
+		docElem.appendChild( div ).id = expando;
+		return !document.getElementsByName || !document.getElementsByName( expando ).length;
+	});
+
+	// ID find and filter
+	if ( support.getById ) {
+		Expr.find["ID"] = function( id, context ) {
+			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
+				var m = context.getElementById( id );
+				return m ? [ m ] : [];
+			}
+		};
+		Expr.filter["ID"] = function( id ) {
+			var attrId = id.replace( runescape, funescape );
+			return function( elem ) {
+				return elem.getAttribute("id") === attrId;
+			};
+		};
+	} else {
+		// Support: IE6/7
+		// getElementById is not reliable as a find shortcut
+		delete Expr.find["ID"];
+
+		Expr.filter["ID"] =  function( id ) {
+			var attrId = id.replace( runescape, funescape );
+			return function( elem ) {
+				var node = typeof elem.getAttributeNode !== "undefined" &&
+					elem.getAttributeNode("id");
+				return node && node.value === attrId;
+			};
+		};
+	}
+
+	// Tag
+	Expr.find["TAG"] = support.getElementsByTagName ?
+		function( tag, context ) {
+			if ( typeof context.getElementsByTagName !== "undefined" ) {
+				return context.getElementsByTagName( tag );
+
+			// DocumentFragment nodes don't have gEBTN
+			} else if ( support.qsa ) {
+				return context.querySelectorAll( tag );
+			}
+		} :
+
+		function( tag, context ) {
+			var elem,
+				tmp = [],
+				i = 0,
+				// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
+				results = context.getElementsByTagName( tag );
+
+			// Filter out possible comments
+			if ( tag === "*" ) {
+				while ( (elem = results[i++]) ) {
+					if ( elem.nodeType === 1 ) {
+						tmp.push( elem );
+					}
+				}
+
+				return tmp;
+			}
+			return results;
+		};
+
+	// Class
+	Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
+		if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
+			return context.getElementsByClassName( className );
+		}
+	};
+
+	/* QSA/matchesSelector
+	---------------------------------------------------------------------- */
+
+	// QSA and matchesSelector support
+
+	// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+	rbuggyMatches = [];
+
+	// qSa(:focus) reports false when true (Chrome 21)
+	// We allow this because of a bug in IE8/9 that throws an error
+	// whenever `document.activeElement` is accessed on an iframe
+	// So, we allow :focus to pass through QSA all the time to avoid the IE error
+	// See http://bugs.jquery.com/ticket/13378
+	rbuggyQSA = [];
+
+	if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
+		// Build QSA regex
+		// Regex strategy adopted from Diego Perini
+		assert(function( div ) {
+			// Select is set to empty string on purpose
+			// This is to test IE's treatment of not explicitly
+			// setting a boolean content attribute,
+			// since its presence should be enough
+			// http://bugs.jquery.com/ticket/12359
+			docElem.appendChild( div ).innerHTML = "<a id='" + expando + "'></a>" +
+				"<select id='" + expando + "-\r\\' msallowcapture=''>" +
+				"<option selected=''></option></select>";
+
+			// Support: IE8, Opera 11-12.16
+			// Nothing should be selected when empty strings follow ^= or $= or *=
+			// The test attribute must be unknown in Opera but "safe" for WinRT
+			// http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
+			if ( div.querySelectorAll("[msallowcapture^='']").length ) {
+				rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
+			}
+
+			// Support: IE8
+			// Boolean attributes and "value" are not treated correctly
+			if ( !div.querySelectorAll("[selected]").length ) {
+				rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
+			}
+
+			// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
+			if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
+				rbuggyQSA.push("~=");
+			}
+
+			// Webkit/Opera - :checked should return selected option elements
+			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+			// IE8 throws error here and will not see later tests
+			if ( !div.querySelectorAll(":checked").length ) {
+				rbuggyQSA.push(":checked");
+			}
+
+			// Support: Safari 8+, iOS 8+
+			// https://bugs.webkit.org/show_bug.cgi?id=136851
+			// In-page `selector#id sibing-combinator selector` fails
+			if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) {
+				rbuggyQSA.push(".#.+[+~]");
+			}
+		});
+
+		assert(function( div ) {
+			// Support: Windows 8 Native Apps
+			// The type and name attributes are restricted during .innerHTML assignment
+			var input = document.createElement("input");
+			input.setAttribute( "type", "hidden" );
+			div.appendChild( input ).setAttribute( "name", "D" );
+
+			// Support: IE8
+			// Enforce case-sensitivity of name attribute
+			if ( div.querySelectorAll("[name=d]").length ) {
+				rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
+			}
+
+			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
+			// IE8 throws error here and will not see later tests
+			if ( !div.querySelectorAll(":enabled").length ) {
+				rbuggyQSA.push( ":enabled", ":disabled" );
+			}
+
+			// Opera 10-11 does not throw on post-comma invalid pseudos
+			div.querySelectorAll("*,:x");
+			rbuggyQSA.push(",.*:");
+		});
+	}
+
+	if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
+		docElem.webkitMatchesSelector ||
+		docElem.mozMatchesSelector ||
+		docElem.oMatchesSelector ||
+		docElem.msMatchesSelector) )) ) {
+
+		assert(function( div ) {
+			// Check to see if it's possible to do matchesSelector
+			// on a disconnected node (IE 9)
+			support.disconnectedMatch = matches.call( div, "div" );
+
+			// This should fail with an exception
+			// Gecko does not error, returns false instead
+			matches.call( div, "[s!='']:x" );
+			rbuggyMatches.push( "!=", pseudos );
+		});
+	}
+
+	rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
+	rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
+
+	/* Contains
+	---------------------------------------------------------------------- */
+	hasCompare = rnative.test( docElem.compareDocumentPosition );
+
+	// Element contains another
+	// Purposefully self-exclusive
+	// As in, an element does not contain itself
+	contains = hasCompare || rnative.test( docElem.contains ) ?
+		function( a, b ) {
+			var adown = a.nodeType === 9 ? a.documentElement : a,
+				bup = b && b.parentNode;
+			return a === bup || !!( bup && bup.nodeType === 1 && (
+				adown.contains ?
+					adown.contains( bup ) :
+					a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
+			));
+		} :
+		function( a, b ) {
+			if ( b ) {
+				while ( (b = b.parentNode) ) {
+					if ( b === a ) {
+						return true;
+					}
+				}
+			}
+			return false;
+		};
+
+	/* Sorting
+	---------------------------------------------------------------------- */
+
+	// Document order sorting
+	sortOrder = hasCompare ?
+	function( a, b ) {
+
+		// Flag for duplicate removal
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+		}
+
+		// Sort on method existence if only one input has compareDocumentPosition
+		var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
+		if ( compare ) {
+			return compare;
+		}
+
+		// Calculate position if both inputs belong to the same document
+		compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
+			a.compareDocumentPosition( b ) :
+
+			// Otherwise we know they are disconnected
+			1;
+
+		// Disconnected nodes
+		if ( compare & 1 ||
+			(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
+
+			// Choose the first element that is related to our preferred document
+			if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
+				return -1;
+			}
+			if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
+				return 1;
+			}
+
+			// Maintain original order
+			return sortInput ?
+				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
+				0;
+		}
+
+		return compare & 4 ? -1 : 1;
+	} :
+	function( a, b ) {
+		// Exit early if the nodes are identical
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+		}
+
+		var cur,
+			i = 0,
+			aup = a.parentNode,
+			bup = b.parentNode,
+			ap = [ a ],
+			bp = [ b ];
+
+		// Parentless nodes are either documents or disconnected
+		if ( !aup || !bup ) {
+			return a === document ? -1 :
+				b === document ? 1 :
+				aup ? -1 :
+				bup ? 1 :
+				sortInput ?
+				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
+				0;
+
+		// If the nodes are siblings, we can do a quick check
+		} else if ( aup === bup ) {
+			return siblingCheck( a, b );
+		}
+
+		// Otherwise we need full lists of their ancestors for comparison
+		cur = a;
+		while ( (cur = cur.parentNode) ) {
+			ap.unshift( cur );
+		}
+		cur = b;
+		while ( (cur = cur.parentNode) ) {
+			bp.unshift( cur );
+		}
+
+		// Walk down the tree looking for a discrepancy
+		while ( ap[i] === bp[i] ) {
+			i++;
+		}
+
+		return i ?
+			// Do a sibling check if the nodes have a common ancestor
+			siblingCheck( ap[i], bp[i] ) :
+
+			// Otherwise nodes in our document sort first
+			ap[i] === preferredDoc ? -1 :
+			bp[i] === preferredDoc ? 1 :
+			0;
+	};
+
+	return document;
+};
+
+Sizzle.matches = function( expr, elements ) {
+	return Sizzle( expr, null, null, elements );
+};
+
+Sizzle.matchesSelector = function( elem, expr ) {
+	// Set document vars if needed
+	if ( ( elem.ownerDocument || elem ) !== document ) {
+		setDocument( elem );
+	}
+
+	// Make sure that attribute selectors are quoted
+	expr = expr.replace( rattributeQuotes, "='$1']" );
+
+	if ( support.matchesSelector && documentIsHTML &&
+		!compilerCache[ expr + " " ] &&
+		( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
+		( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {
+
+		try {
+			var ret = matches.call( elem, expr );
+
+			// IE 9's matchesSelector returns false on disconnected nodes
+			if ( ret || support.disconnectedMatch ||
+					// As well, disconnected nodes are said to be in a document
+					// fragment in IE 9
+					elem.document && elem.document.nodeType !== 11 ) {
+				return ret;
+			}
+		} catch (e) {}
+	}
+
+	return Sizzle( expr, document, null, [ elem ] ).length > 0;
+};
+
+Sizzle.contains = function( context, elem ) {
+	// Set document vars if needed
+	if ( ( context.ownerDocument || context ) !== document ) {
+		setDocument( context );
+	}
+	return contains( context, elem );
+};
+
+Sizzle.attr = function( elem, name ) {
+	// Set document vars if needed
+	if ( ( elem.ownerDocument || elem ) !== document ) {
+		setDocument( elem );
+	}
+
+	var fn = Expr.attrHandle[ name.toLowerCase() ],
+		// Don't get fooled by Object.prototype properties (jQuery #13807)
+		val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
+			fn( elem, name, !documentIsHTML ) :
+			undefined;
+
+	return val !== undefined ?
+		val :
+		support.attributes || !documentIsHTML ?
+			elem.getAttribute( name ) :
+			(val = elem.getAttributeNode(name)) && val.specified ?
+				val.value :
+				null;
+};
+
+Sizzle.error = function( msg ) {
+	throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+/**
+ * Document sorting and removing duplicates
+ * @param {ArrayLike} results
+ */
+Sizzle.uniqueSort = function( results ) {
+	var elem,
+		duplicates = [],
+		j = 0,
+		i = 0;
+
+	// Unless we *know* we can detect duplicates, assume their presence
+	hasDuplicate = !support.detectDuplicates;
+	sortInput = !support.sortStable && results.slice( 0 );
+	results.sort( sortOrder );
+
+	if ( hasDuplicate ) {
+		while ( (elem = results[i++]) ) {
+			if ( elem === results[ i ] ) {
+				j = duplicates.push( i );
+			}
+		}
+		while ( j-- ) {
+			results.splice( duplicates[ j ], 1 );
+		}
+	}
+
+	// Clear input after sorting to release objects
+	// See https://github.com/jquery/sizzle/pull/225
+	sortInput = null;
+
+	return results;
+};
+
+/**
+ * Utility function for retrieving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+getText = Sizzle.getText = function( elem ) {
+	var node,
+		ret = "",
+		i = 0,
+		nodeType = elem.nodeType;
+
+	if ( !nodeType ) {
+		// If no nodeType, this is expected to be an array
+		while ( (node = elem[i++]) ) {
+			// Do not traverse comment nodes
+			ret += getText( node );
+		}
+	} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+		// Use textContent for elements
+		// innerText usage removed for consistency of new lines (jQuery #11153)
+		if ( typeof elem.textContent === "string" ) {
+			return elem.textContent;
+		} else {
+			// Traverse its children
+			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+				ret += getText( elem );
+			}
+		}
+	} else if ( nodeType === 3 || nodeType === 4 ) {
+		return elem.nodeValue;
+	}
+	// Do not include comment or processing instruction nodes
+
+	return ret;
+};
+
+Expr = Sizzle.selectors = {
+
+	// Can be adjusted by the user
+	cacheLength: 50,
+
+	createPseudo: markFunction,
+
+	match: matchExpr,
+
+	attrHandle: {},
+
+	find: {},
+
+	relative: {
+		">": { dir: "parentNode", first: true },
+		" ": { dir: "parentNode" },
+		"+": { dir: "previousSibling", first: true },
+		"~": { dir: "previousSibling" }
+	},
+
+	preFilter: {
+		"ATTR": function( match ) {
+			match[1] = match[1].replace( runescape, funescape );
+
+			// Move the given value to match[3] whether quoted or unquoted
+			match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
+
+			if ( match[2] === "~=" ) {
+				match[3] = " " + match[3] + " ";
+			}
+
+			return match.slice( 0, 4 );
+		},
+
+		"CHILD": function( match ) {
+			/* matches from matchExpr["CHILD"]
+				1 type (only|nth|...)
+				2 what (child|of-type)
+				3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
+				4 xn-component of xn+y argument ([+-]?\d*n|)
+				5 sign of xn-component
+				6 x of xn-component
+				7 sign of y-component
+				8 y of y-component
+			*/
+			match[1] = match[1].toLowerCase();
+
+			if ( match[1].slice( 0, 3 ) === "nth" ) {
+				// nth-* requires argument
+				if ( !match[3] ) {
+					Sizzle.error( match[0] );
+				}
+
+				// numeric x and y parameters for Expr.filter.CHILD
+				// remember that false/true cast respectively to 0/1
+				match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
+				match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
+
+			// other types prohibit arguments
+			} else if ( match[3] ) {
+				Sizzle.error( match[0] );
+			}
+
+			return match;
+		},
+
+		"PSEUDO": function( match ) {
+			var excess,
+				unquoted = !match[6] && match[2];
+
+			if ( matchExpr["CHILD"].test( match[0] ) ) {
+				return null;
+			}
+
+			// Accept quoted arguments as-is
+			if ( match[3] ) {
+				match[2] = match[4] || match[5] || "";
+
+			// Strip excess characters from unquoted arguments
+			} else if ( unquoted && rpseudo.test( unquoted ) &&
+				// Get excess from tokenize (recursively)
+				(excess = tokenize( unquoted, true )) &&
+				// advance to the next closing parenthesis
+				(excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
+
+				// excess is a negative index
+				match[0] = match[0].slice( 0, excess );
+				match[2] = unquoted.slice( 0, excess );
+			}
+
+			// Return only captures needed by the pseudo filter method (type and argument)
+			return match.slice( 0, 3 );
+		}
+	},
+
+	filter: {
+
+		"TAG": function( nodeNameSelector ) {
+			var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
+			return nodeNameSelector === "*" ?
+				function() { return true; } :
+				function( elem ) {
+					return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
+				};
+		},
+
+		"CLASS": function( className ) {
+			var pattern = classCache[ className + " " ];
+
+			return pattern ||
+				(pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
+				classCache( className, function( elem ) {
+					return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
+				});
+		},
+
+		"ATTR": function( name, operator, check ) {
+			return function( elem ) {
+				var result = Sizzle.attr( elem, name );
+
+				if ( result == null ) {
+					return operator === "!=";
+				}
+				if ( !operator ) {
+					return true;
+				}
+
+				result += "";
+
+				return operator === "=" ? result === check :
+					operator === "!=" ? result !== check :
+					operator === "^=" ? check && result.indexOf( check ) === 0 :
+					operator === "*=" ? check && result.indexOf( check ) > -1 :
+					operator === "$=" ? check && result.slice( -check.length ) === check :
+					operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
+					operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
+					false;
+			};
+		},
+
+		"CHILD": function( type, what, argument, first, last ) {
+			var simple = type.slice( 0, 3 ) !== "nth",
+				forward = type.slice( -4 ) !== "last",
+				ofType = what === "of-type";
+
+			return first === 1 && last === 0 ?
+
+				// Shortcut for :nth-*(n)
+				function( elem ) {
+					return !!elem.parentNode;
+				} :
+
+				function( elem, context, xml ) {
+					var cache, uniqueCache, outerCache, node, nodeIndex, start,
+						dir = simple !== forward ? "nextSibling" : "previousSibling",
+						parent = elem.parentNode,
+						name = ofType && elem.nodeName.toLowerCase(),
+						useCache = !xml && !ofType,
+						diff = false;
+
+					if ( parent ) {
+
+						// :(first|last|only)-(child|of-type)
+						if ( simple ) {
+							while ( dir ) {
+								node = elem;
+								while ( (node = node[ dir ]) ) {
+									if ( ofType ?
+										node.nodeName.toLowerCase() === name :
+										node.nodeType === 1 ) {
+
+										return false;
+									}
+								}
+								// Reverse direction for :only-* (if we haven't yet done so)
+								start = dir = type === "only" && !start && "nextSibling";
+							}
+							return true;
+						}
+
+						start = [ forward ? parent.firstChild : parent.lastChild ];
+
+						// non-xml :nth-child(...) stores cache data on `parent`
+						if ( forward && useCache ) {
+
+							// Seek `elem` from a previously-cached index
+
+							// ...in a gzip-friendly way
+							node = parent;
+							outerCache = node[ expando ] || (node[ expando ] = {});
+
+							// Support: IE <9 only
+							// Defend against cloned attroperties (jQuery gh-1709)
+							uniqueCache = outerCache[ node.uniqueID ] ||
+								(outerCache[ node.uniqueID ] = {});
+
+							cache = uniqueCache[ type ] || [];
+							nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
+							diff = nodeIndex && cache[ 2 ];
+							node = nodeIndex && parent.childNodes[ nodeIndex ];
+
+							while ( (node = ++nodeIndex && node && node[ dir ] ||
+
+								// Fallback to seeking `elem` from the start
+								(diff = nodeIndex = 0) || start.pop()) ) {
+
+								// When found, cache indexes on `parent` and break
+								if ( node.nodeType === 1 && ++diff && node === elem ) {
+									uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
+									break;
+								}
+							}
+
+						} else {
+							// Use previously-cached element index if available
+							if ( useCache ) {
+								// ...in a gzip-friendly way
+								node = elem;
+								outerCache = node[ expando ] || (node[ expando ] = {});
+
+								// Support: IE <9 only
+								// Defend against cloned attroperties (jQuery gh-1709)
+								uniqueCache = outerCache[ node.uniqueID ] ||
+									(outerCache[ node.uniqueID ] = {});
+
+								cache = uniqueCache[ type ] || [];
+								nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
+								diff = nodeIndex;
+							}
+
+							// xml :nth-child(...)
+							// or :nth-last-child(...) or :nth(-last)?-of-type(...)
+							if ( diff === false ) {
+								// Use the same loop as above to seek `elem` from the start
+								while ( (node = ++nodeIndex && node && node[ dir ] ||
+									(diff = nodeIndex = 0) || start.pop()) ) {
+
+									if ( ( ofType ?
+										node.nodeName.toLowerCase() === name :
+										node.nodeType === 1 ) &&
+										++diff ) {
+
+										// Cache the index of each encountered element
+										if ( useCache ) {
+											outerCache = node[ expando ] || (node[ expando ] = {});
+
+											// Support: IE <9 only
+											// Defend against cloned attroperties (jQuery gh-1709)
+											uniqueCache = outerCache[ node.uniqueID ] ||
+												(outerCache[ node.uniqueID ] = {});
+
+											uniqueCache[ type ] = [ dirruns, diff ];
+										}
+
+										if ( node === elem ) {
+											break;
+										}
+									}
+								}
+							}
+						}
+
+						// Incorporate the offset, then check against cycle size
+						diff -= last;
+						return diff === first || ( diff % first === 0 && diff / first >= 0 );
+					}
+				};
+		},
+
+		"PSEUDO": function( pseudo, argument ) {
+			// pseudo-class names are case-insensitive
+			// http://www.w3.org/TR/selectors/#pseudo-classes
+			// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
+			// Remember that setFilters inherits from pseudos
+			var args,
+				fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
+					Sizzle.error( "unsupported pseudo: " + pseudo );
+
+			// The user may use createPseudo to indicate that
+			// arguments are needed to create the filter function
+			// just as Sizzle does
+			if ( fn[ expando ] ) {
+				return fn( argument );
+			}
+
+			// But maintain support for old signatures
+			if ( fn.length > 1 ) {
+				args = [ pseudo, pseudo, "", argument ];
+				return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
+					markFunction(function( seed, matches ) {
+						var idx,
+							matched = fn( seed, argument ),
+							i = matched.length;
+						while ( i-- ) {
+							idx = indexOf( seed, matched[i] );
+							seed[ idx ] = !( matches[ idx ] = matched[i] );
+						}
+					}) :
+					function( elem ) {
+						return fn( elem, 0, args );
+					};
+			}
+
+			return fn;
+		}
+	},
+
+	pseudos: {
+		// Potentially complex pseudos
+		"not": markFunction(function( selector ) {
+			// Trim the selector passed to compile
+			// to avoid treating leading and trailing
+			// spaces as combinators
+			var input = [],
+				results = [],
+				matcher = compile( selector.replace( rtrim, "$1" ) );
+
+			return matcher[ expando ] ?
+				markFunction(function( seed, matches, context, xml ) {
+					var elem,
+						unmatched = matcher( seed, null, xml, [] ),
+						i = seed.length;
+
+					// Match elements unmatched by `matcher`
+					while ( i-- ) {
+						if ( (elem = unmatched[i]) ) {
+							seed[i] = !(matches[i] = elem);
+						}
+					}
+				}) :
+				function( elem, context, xml ) {
+					input[0] = elem;
+					matcher( input, null, xml, results );
+					// Don't keep the element (issue #299)
+					input[0] = null;
+					return !results.pop();
+				};
+		}),
+
+		"has": markFunction(function( selector ) {
+			return function( elem ) {
+				return Sizzle( selector, elem ).length > 0;
+			};
+		}),
+
+		"contains": markFunction(function( text ) {
+			text = text.replace( runescape, funescape );
+			return function( elem ) {
+				return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
+			};
+		}),
+
+		// "Whether an element is represented by a :lang() selector
+		// is based solely on the element's language value
+		// being equal to the identifier C,
+		// or beginning with the identifier C immediately followed by "-".
+		// The matching of C against the element's language value is performed case-insensitively.
+		// The identifier C does not have to be a valid language name."
+		// http://www.w3.org/TR/selectors/#lang-pseudo
+		"lang": markFunction( function( lang ) {
+			// lang value must be a valid identifier
+			if ( !ridentifier.test(lang || "") ) {
+				Sizzle.error( "unsupported lang: " + lang );
+			}
+			lang = lang.replace( runescape, funescape ).toLowerCase();
+			return function( elem ) {
+				var elemLang;
+				do {
+					if ( (elemLang = documentIsHTML ?
+						elem.lang :
+						elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
+
+						elemLang = elemLang.toLowerCase();
+						return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
+					}
+				} while ( (elem = elem.parentNode) && elem.nodeType === 1 );
+				return false;
+			};
+		}),
+
+		// Miscellaneous
+		"target": function( elem ) {
+			var hash = window.location && window.location.hash;
+			return hash && hash.slice( 1 ) === elem.id;
+		},
+
+		"root": function( elem ) {
+			return elem === docElem;
+		},
+
+		"focus": function( elem ) {
+			return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
+		},
+
+		// Boolean properties
+		"enabled": function( elem ) {
+			return elem.disabled === false;
+		},
+
+		"disabled": function( elem ) {
+			return elem.disabled === true;
+		},
+
+		"checked": function( elem ) {
+			// In CSS3, :checked should return both checked and selected elements
+			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+			var nodeName = elem.nodeName.toLowerCase();
+			return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
+		},
+
+		"selected": function( elem ) {
+			// Accessing this property makes selected-by-default
+			// options in Safari work properly
+			if ( elem.parentNode ) {
+				elem.parentNode.selectedIndex;
+			}
+
+			return elem.selected === true;
+		},
+
+		// Contents
+		"empty": function( elem ) {
+			// http://www.w3.org/TR/selectors/#empty-pseudo
+			// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
+			//   but not by others (comment: 8; processing instruction: 7; etc.)
+			// nodeType < 6 works because attributes (2) do not appear as children
+			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+				if ( elem.nodeType < 6 ) {
+					return false;
+				}
+			}
+			return true;
+		},
+
+		"parent": function( elem ) {
+			return !Expr.pseudos["empty"]( elem );
+		},
+
+		// Element/input types
+		"header": function( elem ) {
+			return rheader.test( elem.nodeName );
+		},
+
+		"input": function( elem ) {
+			return rinputs.test( elem.nodeName );
+		},
+
+		"button": function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return name === "input" && elem.type === "button" || name === "button";
+		},
+
+		"text": function( elem ) {
+			var attr;
+			return elem.nodeName.toLowerCase() === "input" &&
+				elem.type === "text" &&
+
+				// Support: IE<8
+				// New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
+				( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
+		},
+
+		// Position-in-collection
+		"first": createPositionalPseudo(function() {
+			return [ 0 ];
+		}),
+
+		"last": createPositionalPseudo(function( matchIndexes, length ) {
+			return [ length - 1 ];
+		}),
+
+		"eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
+			return [ argument < 0 ? argument + length : argument ];
+		}),
+
+		"even": createPositionalPseudo(function( matchIndexes, length ) {
+			var i = 0;
+			for ( ; i < length; i += 2 ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		}),
+
+		"odd": createPositionalPseudo(function( matchIndexes, length ) {
+			var i = 1;
+			for ( ; i < length; i += 2 ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		}),
+
+		"lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+			var i = argument < 0 ? argument + length : argument;
+			for ( ; --i >= 0; ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		}),
+
+		"gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+			var i = argument < 0 ? argument + length : argument;
+			for ( ; ++i < length; ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		})
+	}
+};
+
+Expr.pseudos["nth"] = Expr.pseudos["eq"];
+
+// Add button/input type pseudos
+for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
+	Expr.pseudos[ i ] = createInputPseudo( i );
+}
+for ( i in { submit: true, reset: true } ) {
+	Expr.pseudos[ i ] = createButtonPseudo( i );
+}
+
+// Easy API for creating new setFilters
+function setFilters() {}
+setFilters.prototype = Expr.filters = Expr.pseudos;
+Expr.setFilters = new setFilters();
+
+tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
+	var matched, match, tokens, type,
+		soFar, groups, preFilters,
+		cached = tokenCache[ selector + " " ];
+
+	if ( cached ) {
+		return parseOnly ? 0 : cached.slice( 0 );
+	}
+
+	soFar = selector;
+	groups = [];
+	preFilters = Expr.preFilter;
+
+	while ( soFar ) {
+
+		// Comma and first run
+		if ( !matched || (match = rcomma.exec( soFar )) ) {
+			if ( match ) {
+				// Don't consume trailing commas as valid
+				soFar = soFar.slice( match[0].length ) || soFar;
+			}
+			groups.push( (tokens = []) );
+		}
+
+		matched = false;
+
+		// Combinators
+		if ( (match = rcombinators.exec( soFar )) ) {
+			matched = match.shift();
+			tokens.push({
+				value: matched,
+				// Cast descendant combinators to space
+				type: match[0].replace( rtrim, " " )
+			});
+			soFar = soFar.slice( matched.length );
+		}
+
+		// Filters
+		for ( type in Expr.filter ) {
+			if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
+				(match = preFilters[ type ]( match ))) ) {
+				matched = match.shift();
+				tokens.push({
+					value: matched,
+					type: type,
+					matches: match
+				});
+				soFar = soFar.slice( matched.length );
+			}
+		}
+
+		if ( !matched ) {
+			break;
+		}
+	}
+
+	// Return the length of the invalid excess
+	// if we're just parsing
+	// Otherwise, throw an error or return tokens
+	return parseOnly ?
+		soFar.length :
+		soFar ?
+			Sizzle.error( selector ) :
+			// Cache the tokens
+			tokenCache( selector, groups ).slice( 0 );
+};
+
+function toSelector( tokens ) {
+	var i = 0,
+		len = tokens.length,
+		selector = "";
+	for ( ; i < len; i++ ) {
+		selector += tokens[i].value;
+	}
+	return selector;
+}
+
+function addCombinator( matcher, combinator, base ) {
+	var dir = combinator.dir,
+		checkNonElements = base && dir === "parentNode",
+		doneName = done++;
+
+	return combinator.first ?
+		// Check against closest ancestor/preceding element
+		function( elem, context, xml ) {
+			while ( (elem = elem[ dir ]) ) {
+				if ( elem.nodeType === 1 || checkNonElements ) {
+					return matcher( elem, context, xml );
+				}
+			}
+		} :
+
+		// Check against all ancestor/preceding elements
+		function( elem, context, xml ) {
+			var oldCache, uniqueCache, outerCache,
+				newCache = [ dirruns, doneName ];
+
+			// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
+			if ( xml ) {
+				while ( (elem = elem[ dir ]) ) {
+					if ( elem.nodeType === 1 || checkNonElements ) {
+						if ( matcher( elem, context, xml ) ) {
+							return true;
+						}
+					}
+				}
+			} else {
+				while ( (elem = elem[ dir ]) ) {
+					if ( elem.nodeType === 1 || checkNonElements ) {
+						outerCache = elem[ expando ] || (elem[ expando ] = {});
+
+						// Support: IE <9 only
+						// Defend against cloned attroperties (jQuery gh-1709)
+						uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
+
+						if ( (oldCache = uniqueCache[ dir ]) &&
+							oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
+
+							// Assign to newCache so results back-propagate to previous elements
+							return (newCache[ 2 ] = oldCache[ 2 ]);
+						} else {
+							// Reuse newcache so results back-propagate to previous elements
+							uniqueCache[ dir ] = newCache;
+
+							// A match means we're done; a fail means we have to keep checking
+							if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
+								return true;
+							}
+						}
+					}
+				}
+			}
+		};
+}
+
+function elementMatcher( matchers ) {
+	return matchers.length > 1 ?
+		function( elem, context, xml ) {
+			var i = matchers.length;
+			while ( i-- ) {
+				if ( !matchers[i]( elem, context, xml ) ) {
+					return false;
+				}
+			}
+			return true;
+		} :
+		matchers[0];
+}
+
+function multipleContexts( selector, contexts, results ) {
+	var i = 0,
+		len = contexts.length;
+	for ( ; i < len; i++ ) {
+		Sizzle( selector, contexts[i], results );
+	}
+	return results;
+}
+
+function condense( unmatched, map, filter, context, xml ) {
+	var elem,
+		newUnmatched = [],
+		i = 0,
+		len = unmatched.length,
+		mapped = map != null;
+
+	for ( ; i < len; i++ ) {
+		if ( (elem = unmatched[i]) ) {
+			if ( !filter || filter( elem, context, xml ) ) {
+				newUnmatched.push( elem );
+				if ( mapped ) {
+					map.push( i );
+				}
+			}
+		}
+	}
+
+	return newUnmatched;
+}
+
+function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
+	if ( postFilter && !postFilter[ expando ] ) {
+		postFilter = setMatcher( postFilter );
+	}
+	if ( postFinder && !postFinder[ expando ] ) {
+		postFinder = setMatcher( postFinder, postSelector );
+	}
+	return markFunction(function( seed, results, context, xml ) {
+		var temp, i, elem,
+			preMap = [],
+			postMap = [],
+			preexisting = results.length,
+
+			// Get initial elements from seed or context
+			elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
+
+			// Prefilter to get matcher input, preserving a map for seed-results synchronization
+			matcherIn = preFilter && ( seed || !selector ) ?
+				condense( elems, preMap, preFilter, context, xml ) :
+				elems,
+
+			matcherOut = matcher ?
+				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
+				postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
+
+					// ...intermediate processing is necessary
+					[] :
+
+					// ...otherwise use results directly
+					results :
+				matcherIn;
+
+		// Find primary matches
+		if ( matcher ) {
+			matcher( matcherIn, matcherOut, context, xml );
+		}
+
+		// Apply postFilter
+		if ( postFilter ) {
+			temp = condense( matcherOut, postMap );
+			postFilter( temp, [], context, xml );
+
+			// Un-match failing elements by moving them back to matcherIn
+			i = temp.length;
+			while ( i-- ) {
+				if ( (elem = temp[i]) ) {
+					matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
+				}
+			}
+		}
+
+		if ( seed ) {
+			if ( postFinder || preFilter ) {
+				if ( postFinder ) {
+					// Get the final matcherOut by condensing this intermediate into postFinder contexts
+					temp = [];
+					i = matcherOut.length;
+					while ( i-- ) {
+						if ( (elem = matcherOut[i]) ) {
+							// Restore matcherIn since elem is not yet a final match
+							temp.push( (matcherIn[i] = elem) );
+						}
+					}
+					postFinder( null, (matcherOut = []), temp, xml );
+				}
+
+				// Move matched elements from seed to results to keep them synchronized
+				i = matcherOut.length;
+				while ( i-- ) {
+					if ( (elem = matcherOut[i]) &&
+						(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
+
+						seed[temp] = !(results[temp] = elem);
+					}
+				}
+			}
+
+		// Add elements to results, through postFinder if defined
+		} else {
+			matcherOut = condense(
+				matcherOut === results ?
+					matcherOut.splice( preexisting, matcherOut.length ) :
+					matcherOut
+			);
+			if ( postFinder ) {
+				postFinder( null, results, matcherOut, xml );
+			} else {
+				push.apply( results, matcherOut );
+			}
+		}
+	});
+}
+
+function matcherFromTokens( tokens ) {
+	var checkContext, matcher, j,
+		len = tokens.length,
+		leadingRelative = Expr.relative[ tokens[0].type ],
+		implicitRelative = leadingRelative || Expr.relative[" "],
+		i = leadingRelative ? 1 : 0,
+
+		// The foundational matcher ensures that elements are reachable from top-level context(s)
+		matchContext = addCombinator( function( elem ) {
+			return elem === checkContext;
+		}, implicitRelative, true ),
+		matchAnyContext = addCombinator( function( elem ) {
+			return indexOf( checkContext, elem ) > -1;
+		}, implicitRelative, true ),
+		matchers = [ function( elem, context, xml ) {
+			var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+				(checkContext = context).nodeType ?
+					matchContext( elem, context, xml ) :
+					matchAnyContext( elem, context, xml ) );
+			// Avoid hanging onto element (issue #299)
+			checkContext = null;
+			return ret;
+		} ];
+
+	for ( ; i < len; i++ ) {
+		if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
+			matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
+		} else {
+			matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
+
+			// Return special upon seeing a positional matcher
+			if ( matcher[ expando ] ) {
+				// Find the next relative operator (if any) for proper handling
+				j = ++i;
+				for ( ; j < len; j++ ) {
+					if ( Expr.relative[ tokens[j].type ] ) {
+						break;
+					}
+				}
+				return setMatcher(
+					i > 1 && elementMatcher( matchers ),
+					i > 1 && toSelector(
+						// If the preceding token was a descendant combinator, insert an implicit any-element `*`
+						tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
+					).replace( rtrim, "$1" ),
+					matcher,
+					i < j && matcherFromTokens( tokens.slice( i, j ) ),
+					j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
+					j < len && toSelector( tokens )
+				);
+			}
+			matchers.push( matcher );
+		}
+	}
+
+	return elementMatcher( matchers );
+}
+
+function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
+	var bySet = setMatchers.length > 0,
+		byElement = elementMatchers.length > 0,
+		superMatcher = function( seed, context, xml, results, outermost ) {
+			var elem, j, matcher,
+				matchedCount = 0,
+				i = "0",
+				unmatched = seed && [],
+				setMatched = [],
+				contextBackup = outermostContext,
+				// We must always have either seed elements or outermost context
+				elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
+				// Use integer dirruns iff this is the outermost matcher
+				dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
+				len = elems.length;
+
+			if ( outermost ) {
+				outermostContext = context === document || context || outermost;
+			}
+
+			// Add elements passing elementMatchers directly to results
+			// Support: IE<9, Safari
+			// Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
+			for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
+				if ( byElement && elem ) {
+					j = 0;
+					if ( !context && elem.ownerDocument !== document ) {
+						setDocument( elem );
+						xml = !documentIsHTML;
+					}
+					while ( (matcher = elementMatchers[j++]) ) {
+						if ( matcher( elem, context || document, xml) ) {
+							results.push( elem );
+							break;
+						}
+					}
+					if ( outermost ) {
+						dirruns = dirrunsUnique;
+					}
+				}
+
+				// Track unmatched elements for set filters
+				if ( bySet ) {
+					// They will have gone through all possible matchers
+					if ( (elem = !matcher && elem) ) {
+						matchedCount--;
+					}
+
+					// Lengthen the array for every element, matched or not
+					if ( seed ) {
+						unmatched.push( elem );
+					}
+				}
+			}
+
+			// `i` is now the count of elements visited above, and adding it to `matchedCount`
+			// makes the latter nonnegative.
+			matchedCount += i;
+
+			// Apply set filters to unmatched elements
+			// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
+			// equals `i`), unless we didn't visit _any_ elements in the above loop because we have
+			// no element matchers and no seed.
+			// Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
+			// case, which will result in a "00" `matchedCount` that differs from `i` but is also
+			// numerically zero.
+			if ( bySet && i !== matchedCount ) {
+				j = 0;
+				while ( (matcher = setMatchers[j++]) ) {
+					matcher( unmatched, setMatched, context, xml );
+				}
+
+				if ( seed ) {
+					// Reintegrate element matches to eliminate the need for sorting
+					if ( matchedCount > 0 ) {
+						while ( i-- ) {
+							if ( !(unmatched[i] || setMatched[i]) ) {
+								setMatched[i] = pop.call( results );
+							}
+						}
+					}
+
+					// Discard index placeholder values to get only actual matches
+					setMatched = condense( setMatched );
+				}
+
+				// Add matches to results
+				push.apply( results, setMatched );
+
+				// Seedless set matches succeeding multiple successful matchers stipulate sorting
+				if ( outermost && !seed && setMatched.length > 0 &&
+					( matchedCount + setMatchers.length ) > 1 ) {
+
+					Sizzle.uniqueSort( results );
+				}
+			}
+
+			// Override manipulation of globals by nested matchers
+			if ( outermost ) {
+				dirruns = dirrunsUnique;
+				outermostContext = contextBackup;
+			}
+
+			return unmatched;
+		};
+
+	return bySet ?
+		markFunction( superMatcher ) :
+		superMatcher;
+}
+
+compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
+	var i,
+		setMatchers = [],
+		elementMatchers = [],
+		cached = compilerCache[ selector + " " ];
+
+	if ( !cached ) {
+		// Generate a function of recursive functions that can be used to check each element
+		if ( !match ) {
+			match = tokenize( selector );
+		}
+		i = match.length;
+		while ( i-- ) {
+			cached = matcherFromTokens( match[i] );
+			if ( cached[ expando ] ) {
+				setMatchers.push( cached );
+			} else {
+				elementMatchers.push( cached );
+			}
+		}
+
+		// Cache the compiled function
+		cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
+
+		// Save selector and tokenization
+		cached.selector = selector;
+	}
+	return cached;
+};
+
+/**
+ * A low-level selection function that works with Sizzle's compiled
+ *  selector functions
+ * @param {String|Function} selector A selector or a pre-compiled
+ *  selector function built with Sizzle.compile
+ * @param {Element} context
+ * @param {Array} [results]
+ * @param {Array} [seed] A set of elements to match against
+ */
+select = Sizzle.select = function( selector, context, results, seed ) {
+	var i, tokens, token, type, find,
+		compiled = typeof selector === "function" && selector,
+		match = !seed && tokenize( (selector = compiled.selector || selector) );
+
+	results = results || [];
+
+	// Try to minimize operations if there is only one selector in the list and no seed
+	// (the latter of which guarantees us context)
+	if ( match.length === 1 ) {
+
+		// Reduce context if the leading compound selector is an ID
+		tokens = match[0] = match[0].slice( 0 );
+		if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
+				support.getById && context.nodeType === 9 && documentIsHTML &&
+				Expr.relative[ tokens[1].type ] ) {
+
+			context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
+			if ( !context ) {
+				return results;
+
+			// Precompiled matchers will still verify ancestry, so step up a level
+			} else if ( compiled ) {
+				context = context.parentNode;
+			}
+
+			selector = selector.slice( tokens.shift().value.length );
+		}
+
+		// Fetch a seed set for right-to-left matching
+		i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
+		while ( i-- ) {
+			token = tokens[i];
+
+			// Abort if we hit a combinator
+			if ( Expr.relative[ (type = token.type) ] ) {
+				break;
+			}
+			if ( (find = Expr.find[ type ]) ) {
+				// Search, expanding context for leading sibling combinators
+				if ( (seed = find(
+					token.matches[0].replace( runescape, funescape ),
+					rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
+				)) ) {
+
+					// If seed is empty or no tokens remain, we can return early
+					tokens.splice( i, 1 );
+					selector = seed.length && toSelector( tokens );
+					if ( !selector ) {
+						push.apply( results, seed );
+						return results;
+					}
+
+					break;
+				}
+			}
+		}
+	}
+
+	// Compile and execute a filtering function if one is not provided
+	// Provide `match` to avoid retokenization if we modified the selector above
+	( compiled || compile( selector, match ) )(
+		seed,
+		context,
+		!documentIsHTML,
+		results,
+		!context || rsibling.test( selector ) && testContext( context.parentNode ) || context
+	);
+	return results;
+};
+
+// One-time assignments
+
+// Sort stability
+support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
+
+// Support: Chrome 14-35+
+// Always assume duplicates if they aren't passed to the comparison function
+support.detectDuplicates = !!hasDuplicate;
+
+// Initialize against the default document
+setDocument();
+
+// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
+// Detached nodes confoundingly follow *each other*
+support.sortDetached = assert(function( div1 ) {
+	// Should return 1, but returns 4 (following)
+	return div1.compareDocumentPosition( document.createElement("div") ) & 1;
+});
+
+// Support: IE<8
+// Prevent attribute/property "interpolation"
+// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !assert(function( div ) {
+	div.innerHTML = "<a href='#'></a>";
+	return div.firstChild.getAttribute("href") === "#" ;
+}) ) {
+	addHandle( "type|href|height|width", function( elem, name, isXML ) {
+		if ( !isXML ) {
+			return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
+		}
+	});
+}
+
+// Support: IE<9
+// Use defaultValue in place of getAttribute("value")
+if ( !support.attributes || !assert(function( div ) {
+	div.innerHTML = "<input/>";
+	div.firstChild.setAttribute( "value", "" );
+	return div.firstChild.getAttribute( "value" ) === "";
+}) ) {
+	addHandle( "value", function( elem, name, isXML ) {
+		if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
+			return elem.defaultValue;
+		}
+	});
+}
+
+// Support: IE<9
+// Use getAttributeNode to fetch booleans when getAttribute lies
+if ( !assert(function( div ) {
+	return div.getAttribute("disabled") == null;
+}) ) {
+	addHandle( booleans, function( elem, name, isXML ) {
+		var val;
+		if ( !isXML ) {
+			return elem[ name ] === true ? name.toLowerCase() :
+					(val = elem.getAttributeNode( name )) && val.specified ?
+					val.value :
+				null;
+		}
+	});
+}
+
+return Sizzle;
+
+})( window );
+
+
+
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[ ":" ] = jQuery.expr.pseudos;
+jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+
+var dir = function( elem, dir, until ) {
+	var matched = [],
+		truncate = until !== undefined;
+
+	while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
+		if ( elem.nodeType === 1 ) {
+			if ( truncate && jQuery( elem ).is( until ) ) {
+				break;
+			}
+			matched.push( elem );
+		}
+	}
+	return matched;
+};
+
+
+var siblings = function( n, elem ) {
+	var matched = [];
+
+	for ( ; n; n = n.nextSibling ) {
+		if ( n.nodeType === 1 && n !== elem ) {
+			matched.push( n );
+		}
+	}
+
+	return matched;
+};
+
+
+var rneedsContext = jQuery.expr.match.needsContext;
+
+var rsingleTag = ( /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/ );
+
+
+
+var risSimple = /^.[^:#\[\.,]*$/;
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, not ) {
+	if ( jQuery.isFunction( qualifier ) ) {
+		return jQuery.grep( elements, function( elem, i ) {
+			/* jshint -W018 */
+			return !!qualifier.call( elem, i, elem ) !== not;
+		} );
+
+	}
+
+	if ( qualifier.nodeType ) {
+		return jQuery.grep( elements, function( elem ) {
+			return ( elem === qualifier ) !== not;
+		} );
+
+	}
+
+	if ( typeof qualifier === "string" ) {
+		if ( risSimple.test( qualifier ) ) {
+			return jQuery.filter( qualifier, elements, not );
+		}
+
+		qualifier = jQuery.filter( qualifier, elements );
+	}
+
+	return jQuery.grep( elements, function( elem ) {
+		return ( jQuery.inArray( elem, qualifier ) > -1 ) !== not;
+	} );
+}
+
+jQuery.filter = function( expr, elems, not ) {
+	var elem = elems[ 0 ];
+
+	if ( not ) {
+		expr = ":not(" + expr + ")";
+	}
+
+	return elems.length === 1 && elem.nodeType === 1 ?
+		jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
+		jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
+			return elem.nodeType === 1;
+		} ) );
+};
+
+jQuery.fn.extend( {
+	find: function( selector ) {
+		var i,
+			ret = [],
+			self = this,
+			len = self.length;
+
+		if ( typeof selector !== "string" ) {
+			return this.pushStack( jQuery( selector ).filter( function() {
+				for ( i = 0; i < len; i++ ) {
+					if ( jQuery.contains( self[ i ], this ) ) {
+						return true;
+					}
+				}
+			} ) );
+		}
+
+		for ( i = 0; i < len; i++ ) {
+			jQuery.find( selector, self[ i ], ret );
+		}
+
+		// Needed because $( selector, context ) becomes $( context ).find( selector )
+		ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
+		ret.selector = this.selector ? this.selector + " " + selector : selector;
+		return ret;
+	},
+	filter: function( selector ) {
+		return this.pushStack( winnow( this, selector || [], false ) );
+	},
+	not: function( selector ) {
+		return this.pushStack( winnow( this, selector || [], true ) );
+	},
+	is: function( selector ) {
+		return !!winnow(
+			this,
+
+			// If this is a positional/relative selector, check membership in the returned set
+			// so $("p:first").is("p:last") won't return true for a doc with two "p".
+			typeof selector === "string" && rneedsContext.test( selector ) ?
+				jQuery( selector ) :
+				selector || [],
+			false
+		).length;
+	}
+} );
+
+
+// Initialize a jQuery object
+
+
+// A central reference to the root jQuery(document)
+var rootjQuery,
+
+	// A simple way to check for HTML strings
+	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+	// Strict HTML recognition (#11290: must start with <)
+	rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
+
+	init = jQuery.fn.init = function( selector, context, root ) {
+		var match, elem;
+
+		// HANDLE: $(""), $(null), $(undefined), $(false)
+		if ( !selector ) {
+			return this;
+		}
+
+		// init accepts an alternate rootjQuery
+		// so migrate can support jQuery.sub (gh-2101)
+		root = root || rootjQuery;
+
+		// Handle HTML strings
+		if ( typeof selector === "string" ) {
+			if ( selector.charAt( 0 ) === "<" &&
+				selector.charAt( selector.length - 1 ) === ">" &&
+				selector.length >= 3 ) {
+
+				// Assume that strings that start and end with <> are HTML and skip the regex check
+				match = [ null, selector, null ];
+
+			} else {
+				match = rquickExpr.exec( selector );
+			}
+
+			// Match html or make sure no context is specified for #id
+			if ( match && ( match[ 1 ] || !context ) ) {
+
+				// HANDLE: $(html) -> $(array)
+				if ( match[ 1 ] ) {
+					context = context instanceof jQuery ? context[ 0 ] : context;
+
+					// scripts is true for back-compat
+					// Intentionally let the error be thrown if parseHTML is not present
+					jQuery.merge( this, jQuery.parseHTML(
+						match[ 1 ],
+						context && context.nodeType ? context.ownerDocument || context : document,
+						true
+					) );
+
+					// HANDLE: $(html, props)
+					if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
+						for ( match in context ) {
+
+							// Properties of context are called as methods if possible
+							if ( jQuery.isFunction( this[ match ] ) ) {
+								this[ match ]( context[ match ] );
+
+							// ...and otherwise set as attributes
+							} else {
+								this.attr( match, context[ match ] );
+							}
+						}
+					}
+
+					return this;
+
+				// HANDLE: $(#id)
+				} else {
+					elem = document.getElementById( match[ 2 ] );
+
+					// Check parentNode to catch when Blackberry 4.6 returns
+					// nodes that are no longer in the document #6963
+					if ( elem && elem.parentNode ) {
+
+						// Handle the case where IE and Opera return items
+						// by name instead of ID
+						if ( elem.id !== match[ 2 ] ) {
+							return rootjQuery.find( selector );
+						}
+
+						// Otherwise, we inject the element directly into the jQuery object
+						this.length = 1;
+						this[ 0 ] = elem;
+					}
+
+					this.context = document;
+					this.selector = selector;
+					return this;
+				}
+
+			// HANDLE: $(expr, $(...))
+			} else if ( !context || context.jquery ) {
+				return ( context || root ).find( selector );
+
+			// HANDLE: $(expr, context)
+			// (which is just equivalent to: $(context).find(expr)
+			} else {
+				return this.constructor( context ).find( selector );
+			}
+
+		// HANDLE: $(DOMElement)
+		} else if ( selector.nodeType ) {
+			this.context = this[ 0 ] = selector;
+			this.length = 1;
+			return this;
+
+		// HANDLE: $(function)
+		// Shortcut for document ready
+		} else if ( jQuery.isFunction( selector ) ) {
+			return typeof root.ready !== "undefined" ?
+				root.ready( selector ) :
+
+				// Execute immediately if ready is not present
+				selector( jQuery );
+		}
+
+		if ( selector.selector !== undefined ) {
+			this.selector = selector.selector;
+			this.context = selector.context;
+		}
+
+		return jQuery.makeArray( selector, this );
+	};
+
+// Give the init function the jQuery prototype for later instantiation
+init.prototype = jQuery.fn;
+
+// Initialize central reference
+rootjQuery = jQuery( document );
+
+
+var rparentsprev = /^(?:parents|prev(?:Until|All))/,
+
+	// methods guaranteed to produce a unique set when starting from a unique set
+	guaranteedUnique = {
+		children: true,
+		contents: true,
+		next: true,
+		prev: true
+	};
+
+jQuery.fn.extend( {
+	has: function( target ) {
+		var i,
+			targets = jQuery( target, this ),
+			len = targets.length;
+
+		return this.filter( function() {
+			for ( i = 0; i < len; i++ ) {
+				if ( jQuery.contains( this, targets[ i ] ) ) {
+					return true;
+				}
+			}
+		} );
+	},
+
+	closest: function( selectors, context ) {
+		var cur,
+			i = 0,
+			l = this.length,
+			matched = [],
+			pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
+				jQuery( selectors, context || this.context ) :
+				0;
+
+		for ( ; i < l; i++ ) {
+			for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
+
+				// Always skip document fragments
+				if ( cur.nodeType < 11 && ( pos ?
+					pos.index( cur ) > -1 :
+
+					// Don't pass non-elements to Sizzle
+					cur.nodeType === 1 &&
+						jQuery.find.matchesSelector( cur, selectors ) ) ) {
+
+					matched.push( cur );
+					break;
+				}
+			}
+		}
+
+		return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
+	},
+
+	// Determine the position of an element within
+	// the matched set of elements
+	index: function( elem ) {
+
+		// No argument, return index in parent
+		if ( !elem ) {
+			return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
+		}
+
+		// index in selector
+		if ( typeof elem === "string" ) {
+			return jQuery.inArray( this[ 0 ], jQuery( elem ) );
+		}
+
+		// Locate the position of the desired element
+		return jQuery.inArray(
+
+			// If it receives a jQuery object, the first element is used
+			elem.jquery ? elem[ 0 ] : elem, this );
+	},
+
+	add: function( selector, context ) {
+		return this.pushStack(
+			jQuery.uniqueSort(
+				jQuery.merge( this.get(), jQuery( selector, context ) )
+			)
+		);
+	},
+
+	addBack: function( selector ) {
+		return this.add( selector == null ?
+			this.prevObject : this.prevObject.filter( selector )
+		);
+	}
+} );
+
+function sibling( cur, dir ) {
+	do {
+		cur = cur[ dir ];
+	} while ( cur && cur.nodeType !== 1 );
+
+	return cur;
+}
+
+jQuery.each( {
+	parent: function( elem ) {
+		var parent = elem.parentNode;
+		return parent && parent.nodeType !== 11 ? parent : null;
+	},
+	parents: function( elem ) {
+		return dir( elem, "parentNode" );
+	},
+	parentsUntil: function( elem, i, until ) {
+		return dir( elem, "parentNode", until );
+	},
+	next: function( elem ) {
+		return sibling( elem, "nextSibling" );
+	},
+	prev: function( elem ) {
+		return sibling( elem, "previousSibling" );
+	},
+	nextAll: function( elem ) {
+		return dir( elem, "nextSibling" );
+	},
+	prevAll: function( elem ) {
+		return dir( elem, "previousSibling" );
+	},
+	nextUntil: function( elem, i, until ) {
+		return dir( elem, "nextSibling", until );
+	},
+	prevUntil: function( elem, i, until ) {
+		return dir( elem, "previousSibling", until );
+	},
+	siblings: function( elem ) {
+		return siblings( ( elem.parentNode || {} ).firstChild, elem );
+	},
+	children: function( elem ) {
+		return siblings( elem.firstChild );
+	},
+	contents: function( elem ) {
+		return jQuery.nodeName( elem, "iframe" ) ?
+			elem.contentDocument || elem.contentWindow.document :
+			jQuery.merge( [], elem.childNodes );
+	}
+}, function( name, fn ) {
+	jQuery.fn[ name ] = function( until, selector ) {
+		var ret = jQuery.map( this, fn, until );
+
+		if ( name.slice( -5 ) !== "Until" ) {
+			selector = until;
+		}
+
+		if ( selector && typeof selector === "string" ) {
+			ret = jQuery.filter( selector, ret );
+		}
+
+		if ( this.length > 1 ) {
+
+			// Remove duplicates
+			if ( !guaranteedUnique[ name ] ) {
+				ret = jQuery.uniqueSort( ret );
+			}
+
+			// Reverse order for parents* and prev-derivatives
+			if ( rparentsprev.test( name ) ) {
+				ret = ret.reverse();
+			}
+		}
+
+		return this.pushStack( ret );
+	};
+} );
+var rnotwhite = ( /\S+/g );
+
+
+
+// Convert String-formatted options into Object-formatted ones
+function createOptions( options ) {
+	var object = {};
+	jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {
+		object[ flag ] = true;
+	} );
+	return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ *	options: an optional list of space-separated options that will change how
+ *			the callback list behaves or a more traditional option object
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible options:
+ *
+ *	once:			will ensure the callback list can only be fired once (like a Deferred)
+ *
+ *	memory:			will keep track of previous values and will call any callback added
+ *					after the list has been fired right away with the latest "memorized"
+ *					values (like a Deferred)
+ *
+ *	unique:			will ensure a callback can only be added once (no duplicate in the list)
+ *
+ *	stopOnFalse:	interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( options ) {
+
+	// Convert options from String-formatted to Object-formatted if needed
+	// (we check in cache first)
+	options = typeof options === "string" ?
+		createOptions( options ) :
+		jQuery.extend( {}, options );
+
+	var // Flag to know if list is currently firing
+		firing,
+
+		// Last fire value for non-forgettable lists
+		memory,
+
+		// Flag to know if list was already fired
+		fired,
+
+		// Flag to prevent firing
+		locked,
+
+		// Actual callback list
+		list = [],
+
+		// Queue of execution data for repeatable lists
+		queue = [],
+
+		// Index of currently firing callback (modified by add/remove as needed)
+		firingIndex = -1,
+
+		// Fire callbacks
+		fire = function() {
+
+			// Enforce single-firing
+			locked = options.once;
+
+			// Execute callbacks for all pending executions,
+			// respecting firingIndex overrides and runtime changes
+			fired = firing = true;
+			for ( ; queue.length; firingIndex = -1 ) {
+				memory = queue.shift();
+				while ( ++firingIndex < list.length ) {
+
+					// Run callback and check for early termination
+					if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
+						options.stopOnFalse ) {
+
+						// Jump to end and forget the data so .add doesn't re-fire
+						firingIndex = list.length;
+						memory = false;
+					}
+				}
+			}
+
+			// Forget the data if we're done with it
+			if ( !options.memory ) {
+				memory = false;
+			}
+
+			firing = false;
+
+			// Clean up if we're done firing for good
+			if ( locked ) {
+
+				// Keep an empty list if we have data for future add calls
+				if ( memory ) {
+					list = [];
+
+				// Otherwise, this object is spent
+				} else {
+					list = "";
+				}
+			}
+		},
+
+		// Actual Callbacks object
+		self = {
+
+			// Add a callback or a collection of callbacks to the list
+			add: function() {
+				if ( list ) {
+
+					// If we have memory from a past run, we should fire after adding
+					if ( memory && !firing ) {
+						firingIndex = list.length - 1;
+						queue.push( memory );
+					}
+
+					( function add( args ) {
+						jQuery.each( args, function( _, arg ) {
+							if ( jQuery.isFunction( arg ) ) {
+								if ( !options.unique || !self.has( arg ) ) {
+									list.push( arg );
+								}
+							} else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) {
+
+								// Inspect recursively
+								add( arg );
+							}
+						} );
+					} )( arguments );
+
+					if ( memory && !firing ) {
+						fire();
+					}
+				}
+				return this;
+			},
+
+			// Remove a callback from the list
+			remove: function() {
+				jQuery.each( arguments, function( _, arg ) {
+					var index;
+					while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+						list.splice( index, 1 );
+
+						// Handle firing indexes
+						if ( index <= firingIndex ) {
+							firingIndex--;
+						}
+					}
+				} );
+				return this;
+			},
+
+			// Check if a given callback is in the list.
+			// If no argument is given, return whether or not list has callbacks attached.
+			has: function( fn ) {
+				return fn ?
+					jQuery.inArray( fn, list ) > -1 :
+					list.length > 0;
+			},
+
+			// Remove all callbacks from the list
+			empty: function() {
+				if ( list ) {
+					list = [];
+				}
+				return this;
+			},
+
+			// Disable .fire and .add
+			// Abort any current/pending executions
+			// Clear all callbacks and values
+			disable: function() {
+				locked = queue = [];
+				list = memory = "";
+				return this;
+			},
+			disabled: function() {
+				return !list;
+			},
+
+			// Disable .fire
+			// Also disable .add unless we have memory (since it would have no effect)
+			// Abort any pending executions
+			lock: function() {
+				locked = true;
+				if ( !memory ) {
+					self.disable();
+				}
+				return this;
+			},
+			locked: function() {
+				return !!locked;
+			},
+
+			// Call all callbacks with the given context and arguments
+			fireWith: function( context, args ) {
+				if ( !locked ) {
+					args = args || [];
+					args = [ context, args.slice ? args.slice() : args ];
+					queue.push( args );
+					if ( !firing ) {
+						fire();
+					}
+				}
+				return this;
+			},
+
+			// Call all the callbacks with the given arguments
+			fire: function() {
+				self.fireWith( this, arguments );
+				return this;
+			},
+
+			// To know if the callbacks have already been called at least once
+			fired: function() {
+				return !!fired;
+			}
+		};
+
+	return self;
+};
+
+
+jQuery.extend( {
+
+	Deferred: function( func ) {
+		var tuples = [
+
+				// action, add listener, listener list, final state
+				[ "resolve", "done", jQuery.Callbacks( "once memory" ), "resolved" ],
+				[ "reject", "fail", jQuery.Callbacks( "once memory" ), "rejected" ],
+				[ "notify", "progress", jQuery.Callbacks( "memory" ) ]
+			],
+			state = "pending",
+			promise = {
+				state: function() {
+					return state;
+				},
+				always: function() {
+					deferred.done( arguments ).fail( arguments );
+					return this;
+				},
+				then: function( /* fnDone, fnFail, fnProgress */ ) {
+					var fns = arguments;
+					return jQuery.Deferred( function( newDefer ) {
+						jQuery.each( tuples, function( i, tuple ) {
+							var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
+
+							// deferred[ done | fail | progress ] for forwarding actions to newDefer
+							deferred[ tuple[ 1 ] ]( function() {
+								var returned = fn && fn.apply( this, arguments );
+								if ( returned && jQuery.isFunction( returned.promise ) ) {
+									returned.promise()
+										.progress( newDefer.notify )
+										.done( newDefer.resolve )
+										.fail( newDefer.reject );
+								} else {
+									newDefer[ tuple[ 0 ] + "With" ](
+										this === promise ? newDefer.promise() : this,
+										fn ? [ returned ] : arguments
+									);
+								}
+							} );
+						} );
+						fns = null;
+					} ).promise();
+				},
+
+				// Get a promise for this deferred
+				// If obj is provided, the promise aspect is added to the object
+				promise: function( obj ) {
+					return obj != null ? jQuery.extend( obj, promise ) : promise;
+				}
+			},
+			deferred = {};
+
+		// Keep pipe for back-compat
+		promise.pipe = promise.then;
+
+		// Add list-specific methods
+		jQuery.each( tuples, function( i, tuple ) {
+			var list = tuple[ 2 ],
+				stateString = tuple[ 3 ];
+
+			// promise[ done | fail | progress ] = list.add
+			promise[ tuple[ 1 ] ] = list.add;
+
+			// Handle state
+			if ( stateString ) {
+				list.add( function() {
+
+					// state = [ resolved | rejected ]
+					state = stateString;
+
+				// [ reject_list | resolve_list ].disable; progress_list.lock
+				}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
+			}
+
+			// deferred[ resolve | reject | notify ]
+			deferred[ tuple[ 0 ] ] = function() {
+				deferred[ tuple[ 0 ] + "With" ]( this === deferred ? promise : this, arguments );
+				return this;
+			};
+			deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
+		} );
+
+		// Make the deferred a promise
+		promise.promise( deferred );
+
+		// Call given func if any
+		if ( func ) {
+			func.call( deferred, deferred );
+		}
+
+		// All done!
+		return deferred;
+	},
+
+	// Deferred helper
+	when: function( subordinate /* , ..., subordinateN */ ) {
+		var i = 0,
+			resolveValues = slice.call( arguments ),
+			length = resolveValues.length,
+
+			// the count of uncompleted subordinates
+			remaining = length !== 1 ||
+				( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
+
+			// the master Deferred.
+			// If resolveValues consist of only a single Deferred, just use that.
+			deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
+
+			// Update function for both resolve and progress values
+			updateFunc = function( i, contexts, values ) {
+				return function( value ) {
+					contexts[ i ] = this;
+					values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
+					if ( values === progressValues ) {
+						deferred.notifyWith( contexts, values );
+
+					} else if ( !( --remaining ) ) {
+						deferred.resolveWith( contexts, values );
+					}
+				};
+			},
+
+			progressValues, progressContexts, resolveContexts;
+
+		// add listeners to Deferred subordinates; treat others as resolved
+		if ( length > 1 ) {
+			progressValues = new Array( length );
+			progressContexts = new Array( length );
+			resolveContexts = new Array( length );
+			for ( ; i < length; i++ ) {
+				if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
+					resolveValues[ i ].promise()
+						.progress( updateFunc( i, progressContexts, progressValues ) )
+						.done( updateFunc( i, resolveContexts, resolveValues ) )
+						.fail( deferred.reject );
+				} else {
+					--remaining;
+				}
+			}
+		}
+
+		// if we're not waiting on anything, resolve the master
+		if ( !remaining ) {
+			deferred.resolveWith( resolveContexts, resolveValues );
+		}
+
+		return deferred.promise();
+	}
+} );
+
+
+// The deferred used on DOM ready
+var readyList;
+
+jQuery.fn.ready = function( fn ) {
+
+	// Add the callback
+	jQuery.ready.promise().done( fn );
+
+	return this;
+};
+
+jQuery.extend( {
+
+	// Is the DOM ready to be used? Set to true once it occurs.
+	isReady: false,
+
+	// A counter to track how many items to wait for before
+	// the ready event fires. See #6781
+	readyWait: 1,
+
+	// Hold (or release) the ready event
+	holdReady: function( hold ) {
+		if ( hold ) {
+			jQuery.readyWait++;
+		} else {
+			jQuery.ready( true );
+		}
+	},
+
+	// Handle when the DOM is ready
+	ready: function( wait ) {
+
+		// Abort if there are pending holds or we're already ready
+		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+			return;
+		}
+
+		// Remember that the DOM is ready
+		jQuery.isReady = true;
+
+		// If a normal DOM Ready event fired, decrement, and wait if need be
+		if ( wait !== true && --jQuery.readyWait > 0 ) {
+			return;
+		}
+
+		// If there are functions bound, to execute
+		readyList.resolveWith( document, [ jQuery ] );
+
+		// Trigger any bound ready events
+		if ( jQuery.fn.triggerHandler ) {
+			jQuery( document ).triggerHandler( "ready" );
+			jQuery( document ).off( "ready" );
+		}
+	}
+} );
+
+/**
+ * Clean-up method for dom ready events
+ */
+function detach() {
+	if ( document.addEventListener ) {
+		document.removeEventListener( "DOMContentLoaded", completed );
+		window.removeEventListener( "load", completed );
+
+	} else {
+		document.detachEvent( "onreadystatechange", completed );
+		window.detachEvent( "onload", completed );
+	}
+}
+
+/**
+ * The ready event handler and self cleanup method
+ */
+function completed() {
+
+	// readyState === "complete" is good enough for us to call the dom ready in oldIE
+	if ( document.addEventListener ||
+		window.event.type === "load" ||
+		document.readyState === "complete" ) {
+
+		detach();
+		jQuery.ready();
+	}
+}
+
+jQuery.ready.promise = function( obj ) {
+	if ( !readyList ) {
+
+		readyList = jQuery.Deferred();
+
+		// Catch cases where $(document).ready() is called
+		// after the browser event has already occurred.
+		// Support: IE6-10
+		// Older IE sometimes signals "interactive" too soon
+		if ( document.readyState === "complete" ||
+			( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
+
+			// Handle it asynchronously to allow scripts the opportunity to delay ready
+			window.setTimeout( jQuery.ready );
+
+		// Standards-based browsers support DOMContentLoaded
+		} else if ( document.addEventListener ) {
+
+			// Use the handy event callback
+			document.addEventListener( "DOMContentLoaded", completed );
+
+			// A fallback to window.onload, that will always work
+			window.addEventListener( "load", completed );
+
+		// If IE event model is used
+		} else {
+
+			// Ensure firing before onload, maybe late but safe also for iframes
+			document.attachEvent( "onreadystatechange", completed );
+
+			// A fallback to window.onload, that will always work
+			window.attachEvent( "onload", completed );
+
+			// If IE and not a frame
+			// continually check to see if the document is ready
+			var top = false;
+
+			try {
+				top = window.frameElement == null && document.documentElement;
+			} catch ( e ) {}
+
+			if ( top && top.doScroll ) {
+				( function doScrollCheck() {
+					if ( !jQuery.isReady ) {
+
+						try {
+
+							// Use the trick by Diego Perini
+							// http://javascript.nwbox.com/IEContentLoaded/
+							top.doScroll( "left" );
+						} catch ( e ) {
+							return window.setTimeout( doScrollCheck, 50 );
+						}
+
+						// detach all dom ready events
+						detach();
+
+						// and execute any waiting functions
+						jQuery.ready();
+					}
+				} )();
+			}
+		}
+	}
+	return readyList.promise( obj );
+};
+
+// Kick off the DOM ready check even if the user does not
+jQuery.ready.promise();
+
+
+
+
+// Support: IE<9
+// Iteration over object's inherited properties before its own
+var i;
+for ( i in jQuery( support ) ) {
+	break;
+}
+support.ownFirst = i === "0";
+
+// Note: most support tests are defined in their respective modules.
+// false until the test is run
+support.inlineBlockNeedsLayout = false;
+
+// Execute ASAP in case we need to set body.style.zoom
+jQuery( function() {
+
+	// Minified: var a,b,c,d
+	var val, div, body, container;
+
+	body = document.getElementsByTagName( "body" )[ 0 ];
+	if ( !body || !body.style ) {
+
+		// Return for frameset docs that don't have a body
+		return;
+	}
+
+	// Setup
+	div = document.createElement( "div" );
+	container = document.createElement( "div" );
+	container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px";
+	body.appendChild( container ).appendChild( div );
+
+	if ( typeof div.style.zoom !== "undefined" ) {
+
+		// Support: IE<8
+		// Check if natively block-level elements act like inline-block
+		// elements when setting their display to 'inline' and giving
+		// them layout
+		div.style.cssText = "display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1";
+
+		support.inlineBlockNeedsLayout = val = div.offsetWidth === 3;
+		if ( val ) {
+
+			// Prevent IE 6 from affecting layout for positioned elements #11048
+			// Prevent IE from shrinking the body in IE 7 mode #12869
+			// Support: IE<8
+			body.style.zoom = 1;
+		}
+	}
+
+	body.removeChild( container );
+} );
+
+
+( function() {
+	var div = document.createElement( "div" );
+
+	// Support: IE<9
+	support.deleteExpando = true;
+	try {
+		delete div.test;
+	} catch ( e ) {
+		support.deleteExpando = false;
+	}
+
+	// Null elements to avoid leaks in IE.
+	div = null;
+} )();
+var acceptData = function( elem ) {
+	var noData = jQuery.noData[ ( elem.nodeName + " " ).toLowerCase() ],
+		nodeType = +elem.nodeType || 1;
+
+	// Do not set data on non-element DOM nodes because it will not be cleared (#8335).
+	return nodeType !== 1 && nodeType !== 9 ?
+		false :
+
+		// Nodes accept data unless otherwise specified; rejection can be conditional
+		!noData || noData !== true && elem.getAttribute( "classid" ) === noData;
+};
+
+
+
+
+var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
+	rmultiDash = /([A-Z])/g;
+
+function dataAttr( elem, key, data ) {
+
+	// If nothing was found internally, try to fetch any
+	// data from the HTML5 data-* attribute
+	if ( data === undefined && elem.nodeType === 1 ) {
+
+		var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
+
+		data = elem.getAttribute( name );
+
+		if ( typeof data === "string" ) {
+			try {
+				data = data === "true" ? true :
+					data === "false" ? false :
+					data === "null" ? null :
+
+					// Only convert to a number if it doesn't change the string
+					+data + "" === data ? +data :
+					rbrace.test( data ) ? jQuery.parseJSON( data ) :
+					data;
+			} catch ( e ) {}
+
+			// Make sure we set the data so it isn't changed later
+			jQuery.data( elem, key, data );
+
+		} else {
+			data = undefined;
+		}
+	}
+
+	return data;
+}
+
+// checks a cache object for emptiness
+function isEmptyDataObject( obj ) {
+	var name;
+	for ( name in obj ) {
+
+		// if the public data object is empty, the private is still empty
+		if ( name === "data" && jQuery.isEmptyObject( obj[ name ] ) ) {
+			continue;
+		}
+		if ( name !== "toJSON" ) {
+			return false;
+		}
+	}
+
+	return true;
+}
+
+function internalData( elem, name, data, pvt /* Internal Use Only */ ) {
+	if ( !acceptData( elem ) ) {
+		return;
+	}
+
+	var ret, thisCache,
+		internalKey = jQuery.expando,
+
+		// We have to handle DOM nodes and JS objects differently because IE6-7
+		// can't GC object references properly across the DOM-JS boundary
+		isNode = elem.nodeType,
+
+		// Only DOM nodes need the global jQuery cache; JS object data is
+		// attached directly to the object so GC can occur automatically
+		cache = isNode ? jQuery.cache : elem,
+
+		// Only defining an ID for JS objects if its cache already exists allows
+		// the code to shortcut on the same path as a DOM node with no cache
+		id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
+
+	// Avoid doing any more work than we need to when trying to get data on an
+	// object that has no data at all
+	if ( ( !id || !cache[ id ] || ( !pvt && !cache[ id ].data ) ) &&
+		data === undefined && typeof name === "string" ) {
+		return;
+	}
+
+	if ( !id ) {
+
+		// Only DOM nodes need a new unique ID for each element since their data
+		// ends up in the global cache
+		if ( isNode ) {
+			id = elem[ internalKey ] = deletedIds.pop() || jQuery.guid++;
+		} else {
+			id = internalKey;
+		}
+	}
+
+	if ( !cache[ id ] ) {
+
+		// Avoid exposing jQuery metadata on plain JS objects when the object
+		// is serialized using JSON.stringify
+		cache[ id ] = isNode ? {} : { toJSON: jQuery.noop };
+	}
+
+	// An object can be passed to jQuery.data instead of a key/value pair; this gets
+	// shallow copied over onto the existing cache
+	if ( typeof name === "object" || typeof name === "function" ) {
+		if ( pvt ) {
+			cache[ id ] = jQuery.extend( cache[ id ], name );
+		} else {
+			cache[ id ].data = jQuery.extend( cache[ id ].data, name );
+		}
+	}
+
+	thisCache = cache[ id ];
+
+	// jQuery data() is stored in a separate object inside the object's internal data
+	// cache in order to avoid key collisions between internal data and user-defined
+	// data.
+	if ( !pvt ) {
+		if ( !thisCache.data ) {
+			thisCache.data = {};
+		}
+
+		thisCache = thisCache.data;
+	}
+
+	if ( data !== undefined ) {
+		thisCache[ jQuery.camelCase( name ) ] = data;
+	}
+
+	// Check for both converted-to-camel and non-converted data property names
+	// If a data property was specified
+	if ( typeof name === "string" ) {
+
+		// First Try to find as-is property data
+		ret = thisCache[ name ];
+
+		// Test for null|undefined property data
+		if ( ret == null ) {
+
+			// Try to find the camelCased property
+			ret = thisCache[ jQuery.camelCase( name ) ];
+		}
+	} else {
+		ret = thisCache;
+	}
+
+	return ret;
+}
+
+function internalRemoveData( elem, name, pvt ) {
+	if ( !acceptData( elem ) ) {
+		return;
+	}
+
+	var thisCache, i,
+		isNode = elem.nodeType,
+
+		// See jQuery.data for more information
+		cache = isNode ? jQuery.cache : elem,
+		id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
+
+	// If there is already no cache entry for this object, there is no
+	// purpose in continuing
+	if ( !cache[ id ] ) {
+		return;
+	}
+
+	if ( name ) {
+
+		thisCache = pvt ? cache[ id ] : cache[ id ].data;
+
+		if ( thisCache ) {
+
+			// Support array or space separated string names for data keys
+			if ( !jQuery.isArray( name ) ) {
+
+				// try the string as a key before any manipulation
+				if ( name in thisCache ) {
+					name = [ name ];
+				} else {
+
+					// split the camel cased version by spaces unless a key with the spaces exists
+					name = jQuery.camelCase( name );
+					if ( name in thisCache ) {
+						name = [ name ];
+					} else {
+						name = name.split( " " );
+					}
+				}
+			} else {
+
+				// If "name" is an array of keys...
+				// When data is initially created, via ("key", "val") signature,
+				// keys will be converted to camelCase.
+				// Since there is no way to tell _how_ a key was added, remove
+				// both plain key and camelCase key. #12786
+				// This will only penalize the array argument path.
+				name = name.concat( jQuery.map( name, jQuery.camelCase ) );
+			}
+
+			i = name.length;
+			while ( i-- ) {
+				delete thisCache[ name[ i ] ];
+			}
+
+			// If there is no data left in the cache, we want to continue
+			// and let the cache object itself get destroyed
+			if ( pvt ? !isEmptyDataObject( thisCache ) : !jQuery.isEmptyObject( thisCache ) ) {
+				return;
+			}
+		}
+	}
+
+	// See jQuery.data for more information
+	if ( !pvt ) {
+		delete cache[ id ].data;
+
+		// Don't destroy the parent cache unless the internal data object
+		// had been the only thing left in it
+		if ( !isEmptyDataObject( cache[ id ] ) ) {
+			return;
+		}
+	}
+
+	// Destroy the cache
+	if ( isNode ) {
+		jQuery.cleanData( [ elem ], true );
+
+	// Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
+	/* jshint eqeqeq: false */
+	} else if ( support.deleteExpando || cache != cache.window ) {
+		/* jshint eqeqeq: true */
+		delete cache[ id ];
+
+	// When all else fails, undefined
+	} else {
+		cache[ id ] = undefined;
+	}
+}
+
+jQuery.extend( {
+	cache: {},
+
+	// The following elements (space-suffixed to avoid Object.prototype collisions)
+	// throw uncatchable exceptions if you attempt to set expando properties
+	noData: {
+		"applet ": true,
+		"embed ": true,
+
+		// ...but Flash objects (which have this classid) *can* handle expandos
+		"object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
+	},
+
+	hasData: function( elem ) {
+		elem = elem.nodeType ? jQuery.cache[ elem[ jQuery.expando ] ] : elem[ jQuery.expando ];
+		return !!elem && !isEmptyDataObject( elem );
+	},
+
+	data: function( elem, name, data ) {
+		return internalData( elem, name, data );
+	},
+
+	removeData: function( elem, name ) {
+		return internalRemoveData( elem, name );
+	},
+
+	// For internal use only.
+	_data: function( elem, name, data ) {
+		return internalData( elem, name, data, true );
+	},
+
+	_removeData: function( elem, name ) {
+		return internalRemoveData( elem, name, true );
+	}
+} );
+
+jQuery.fn.extend( {
+	data: function( key, value ) {
+		var i, name, data,
+			elem = this[ 0 ],
+			attrs = elem && elem.attributes;
+
+		// Special expections of .data basically thwart jQuery.access,
+		// so implement the relevant behavior ourselves
+
+		// Gets all values
+		if ( key === undefined ) {
+			if ( this.length ) {
+				data = jQuery.data( elem );
+
+				if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
+					i = attrs.length;
+					while ( i-- ) {
+
+						// Support: IE11+
+						// The attrs elements can be null (#14894)
+						if ( attrs[ i ] ) {
+							name = attrs[ i ].name;
+							if ( name.indexOf( "data-" ) === 0 ) {
+								name = jQuery.camelCase( name.slice( 5 ) );
+								dataAttr( elem, name, data[ name ] );
+							}
+						}
+					}
+					jQuery._data( elem, "parsedAttrs", true );
+				}
+			}
+
+			return data;
+		}
+
+		// Sets multiple values
+		if ( typeof key === "object" ) {
+			return this.each( function() {
+				jQuery.data( this, key );
+			} );
+		}
+
+		return arguments.length > 1 ?
+
+			// Sets one value
+			this.each( function() {
+				jQuery.data( this, key, value );
+			} ) :
+
+			// Gets one value
+			// Try to fetch any internally stored data first
+			elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : undefined;
+	},
+
+	removeData: function( key ) {
+		return this.each( function() {
+			jQuery.removeData( this, key );
+		} );
+	}
+} );
+
+
+jQuery.extend( {
+	queue: function( elem, type, data ) {
+		var queue;
+
+		if ( elem ) {
+			type = ( type || "fx" ) + "queue";
+			queue = jQuery._data( elem, type );
+
+			// Speed up dequeue by getting out quickly if this is just a lookup
+			if ( data ) {
+				if ( !queue || jQuery.isArray( data ) ) {
+					queue = jQuery._data( elem, type, jQuery.makeArray( data ) );
+				} else {
+					queue.push( data );
+				}
+			}
+			return queue || [];
+		}
+	},
+
+	dequeue: function( elem, type ) {
+		type = type || "fx";
+
+		var queue = jQuery.queue( elem, type ),
+			startLength = queue.length,
+			fn = queue.shift(),
+			hooks = jQuery._queueHooks( elem, type ),
+			next = function() {
+				jQuery.dequeue( elem, type );
+			};
+
+		// If the fx queue is dequeued, always remove the progress sentinel
+		if ( fn === "inprogress" ) {
+			fn = queue.shift();
+			startLength--;
+		}
+
+		if ( fn ) {
+
+			// Add a progress sentinel to prevent the fx queue from being
+			// automatically dequeued
+			if ( type === "fx" ) {
+				queue.unshift( "inprogress" );
+			}
+
+			// clear up the last queue stop function
+			delete hooks.stop;
+			fn.call( elem, next, hooks );
+		}
+
+		if ( !startLength && hooks ) {
+			hooks.empty.fire();
+		}
+	},
+
+	// not intended for public consumption - generates a queueHooks object,
+	// or returns the current one
+	_queueHooks: function( elem, type ) {
+		var key = type + "queueHooks";
+		return jQuery._data( elem, key ) || jQuery._data( elem, key, {
+			empty: jQuery.Callbacks( "once memory" ).add( function() {
+				jQuery._removeData( elem, type + "queue" );
+				jQuery._removeData( elem, key );
+			} )
+		} );
+	}
+} );
+
+jQuery.fn.extend( {
+	queue: function( type, data ) {
+		var setter = 2;
+
+		if ( typeof type !== "string" ) {
+			data = type;
+			type = "fx";
+			setter--;
+		}
+
+		if ( arguments.length < setter ) {
+			return jQuery.queue( this[ 0 ], type );
+		}
+
+		return data === undefined ?
+			this :
+			this.each( function() {
+				var queue = jQuery.queue( this, type, data );
+
+				// ensure a hooks for this queue
+				jQuery._queueHooks( this, type );
+
+				if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
+					jQuery.dequeue( this, type );
+				}
+			} );
+	},
+	dequeue: function( type ) {
+		return this.each( function() {
+			jQuery.dequeue( this, type );
+		} );
+	},
+	clearQueue: function( type ) {
+		return this.queue( type || "fx", [] );
+	},
+
+	// Get a promise resolved when queues of a certain type
+	// are emptied (fx is the type by default)
+	promise: function( type, obj ) {
+		var tmp,
+			count = 1,
+			defer = jQuery.Deferred(),
+			elements = this,
+			i = this.length,
+			resolve = function() {
+				if ( !( --count ) ) {
+					defer.resolveWith( elements, [ elements ] );
+				}
+			};
+
+		if ( typeof type !== "string" ) {
+			obj = type;
+			type = undefined;
+		}
+		type = type || "fx";
+
+		while ( i-- ) {
+			tmp = jQuery._data( elements[ i ], type + "queueHooks" );
+			if ( tmp && tmp.empty ) {
+				count++;
+				tmp.empty.add( resolve );
+			}
+		}
+		resolve();
+		return defer.promise( obj );
+	}
+} );
+
+
+( function() {
+	var shrinkWrapBlocksVal;
+
+	support.shrinkWrapBlocks = function() {
+		if ( shrinkWrapBlocksVal != null ) {
+			return shrinkWrapBlocksVal;
+		}
+
+		// Will be changed later if needed.
+		shrinkWrapBlocksVal = false;
+
+		// Minified: var b,c,d
+		var div, body, container;
+
+		body = document.getElementsByTagName( "body" )[ 0 ];
+		if ( !body || !body.style ) {
+
+			// Test fired too early or in an unsupported environment, exit.
+			return;
+		}
+
+		// Setup
+		div = document.createElement( "div" );
+		container = document.createElement( "div" );
+		container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px";
+		body.appendChild( container ).appendChild( div );
+
+		// Support: IE6
+		// Check if elements with layout shrink-wrap their children
+		if ( typeof div.style.zoom !== "undefined" ) {
+
+			// Reset CSS: box-sizing; display; margin; border
+			div.style.cssText =
+
+				// Support: Firefox<29, Android 2.3
+				// Vendor-prefix box-sizing
+				"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" +
+				"box-sizing:content-box;display:block;margin:0;border:0;" +
+				"padding:1px;width:1px;zoom:1";
+			div.appendChild( document.createElement( "div" ) ).style.width = "5px";
+			shrinkWrapBlocksVal = div.offsetWidth !== 3;
+		}
+
+		body.removeChild( container );
+
+		return shrinkWrapBlocksVal;
+	};
+
+} )();
+var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
+
+var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
+
+
+var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
+
+var isHidden = function( elem, el ) {
+
+		// isHidden might be called from jQuery#filter function;
+		// in that case, element will be second argument
+		elem = el || elem;
+		return jQuery.css( elem, "display" ) === "none" ||
+			!jQuery.contains( elem.ownerDocument, elem );
+	};
+
+
+
+function adjustCSS( elem, prop, valueParts, tween ) {
+	var adjusted,
+		scale = 1,
+		maxIterations = 20,
+		currentValue = tween ?
+			function() { return tween.cur(); } :
+			function() { return jQuery.css( elem, prop, "" ); },
+		initial = currentValue(),
+		unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
+
+		// Starting value computation is required for potential unit mismatches
+		initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
+			rcssNum.exec( jQuery.css( elem, prop ) );
+
+	if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
+
+		// Trust units reported by jQuery.css
+		unit = unit || initialInUnit[ 3 ];
+
+		// Make sure we update the tween properties later on
+		valueParts = valueParts || [];
+
+		// Iteratively approximate from a nonzero starting point
+		initialInUnit = +initial || 1;
+
+		do {
+
+			// If previous iteration zeroed out, double until we get *something*.
+			// Use string for doubling so we don't accidentally see scale as unchanged below
+			scale = scale || ".5";
+
+			// Adjust and apply
+			initialInUnit = initialInUnit / scale;
+			jQuery.style( elem, prop, initialInUnit + unit );
+
+		// Update scale, tolerating zero or NaN from tween.cur()
+		// Break the loop if scale is unchanged or perfect, or if we've just had enough.
+		} while (
+			scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations
+		);
+	}
+
+	if ( valueParts ) {
+		initialInUnit = +initialInUnit || +initial || 0;
+
+		// Apply relative offset (+=/-=) if specified
+		adjusted = valueParts[ 1 ] ?
+			initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
+			+valueParts[ 2 ];
+		if ( tween ) {
+			tween.unit = unit;
+			tween.start = initialInUnit;
+			tween.end = adjusted;
+		}
+	}
+	return adjusted;
+}
+
+
+// Multifunctional method to get and set values of a collection
+// The value/s can optionally be executed if it's a function
+var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
+	var i = 0,
+		length = elems.length,
+		bulk = key == null;
+
+	// Sets many values
+	if ( jQuery.type( key ) === "object" ) {
+		chainable = true;
+		for ( i in key ) {
+			access( elems, fn, i, key[ i ], true, emptyGet, raw );
+		}
+
+	// Sets one value
+	} else if ( value !== undefined ) {
+		chainable = true;
+
+		if ( !jQuery.isFunction( value ) ) {
+			raw = true;
+		}
+
+		if ( bulk ) {
+
+			// Bulk operations run against the entire set
+			if ( raw ) {
+				fn.call( elems, value );
+				fn = null;
+
+			// ...except when executing function values
+			} else {
+				bulk = fn;
+				fn = function( elem, key, value ) {
+					return bulk.call( jQuery( elem ), value );
+				};
+			}
+		}
+
+		if ( fn ) {
+			for ( ; i < length; i++ ) {
+				fn(
+					elems[ i ],
+					key,
+					raw ? value : value.call( elems[ i ], i, fn( elems[ i ], key ) )
+				);
+			}
+		}
+	}
+
+	return chainable ?
+		elems :
+
+		// Gets
+		bulk ?
+			fn.call( elems ) :
+			length ? fn( elems[ 0 ], key ) : emptyGet;
+};
+var rcheckableType = ( /^(?:checkbox|radio)$/i );
+
+var rtagName = ( /<([\w:-]+)/ );
+
+var rscriptType = ( /^$|\/(?:java|ecma)script/i );
+
+var rleadingWhitespace = ( /^\s+/ );
+
+var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|" +
+		"details|dialog|figcaption|figure|footer|header|hgroup|main|" +
+		"mark|meter|nav|output|picture|progress|section|summary|template|time|video";
+
+
+
+function createSafeFragment( document ) {
+	var list = nodeNames.split( "|" ),
+		safeFrag = document.createDocumentFragment();
+
+	if ( safeFrag.createElement ) {
+		while ( list.length ) {
+			safeFrag.createElement(
+				list.pop()
+			);
+		}
+	}
+	return safeFrag;
+}
+
+
+( function() {
+	var div = document.createElement( "div" ),
+		fragment = document.createDocumentFragment(),
+		input = document.createElement( "input" );
+
+	// Setup
+	div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
+
+	// IE strips leading whitespace when .innerHTML is used
+	support.leadingWhitespace = div.firstChild.nodeType === 3;
+
+	// Make sure that tbody elements aren't automatically inserted
+	// IE will insert them into empty tables
+	support.tbody = !div.getElementsByTagName( "tbody" ).length;
+
+	// Make sure that link elements get serialized correctly by innerHTML
+	// This requires a wrapper element in IE
+	support.htmlSerialize = !!div.getElementsByTagName( "link" ).length;
+
+	// Makes sure cloning an html5 element does not cause problems
+	// Where outerHTML is undefined, this still works
+	support.html5Clone =
+		document.createElement( "nav" ).cloneNode( true ).outerHTML !== "<:nav></:nav>";
+
+	// Check if a disconnected checkbox will retain its checked
+	// value of true after appended to the DOM (IE6/7)
+	input.type = "checkbox";
+	input.checked = true;
+	fragment.appendChild( input );
+	support.appendChecked = input.checked;
+
+	// Make sure textarea (and checkbox) defaultValue is properly cloned
+	// Support: IE6-IE11+
+	div.innerHTML = "<textarea>x</textarea>";
+	support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
+
+	// #11217 - WebKit loses check when the name is after the checked attribute
+	fragment.appendChild( div );
+
+	// Support: Windows Web Apps (WWA)
+	// `name` and `type` must use .setAttribute for WWA (#14901)
+	input = document.createElement( "input" );
+	input.setAttribute( "type", "radio" );
+	input.setAttribute( "checked", "checked" );
+	input.setAttribute( "name", "t" );
+
+	div.appendChild( input );
+
+	// Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3
+	// old WebKit doesn't clone checked state correctly in fragments
+	support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+	// Support: IE<9
+	// Cloned elements keep attachEvent handlers, we use addEventListener on IE9+
+	support.noCloneEvent = !!div.addEventListener;
+
+	// Support: IE<9
+	// Since attributes and properties are the same in IE,
+	// cleanData must set properties to undefined rather than use removeAttribute
+	div[ jQuery.expando ] = 1;
+	support.attributes = !div.getAttribute( jQuery.expando );
+} )();
+
+
+// We have to close these tags to support XHTML (#13200)
+var wrapMap = {
+	option: [ 1, "<select multiple='multiple'>", "</select>" ],
+	legend: [ 1, "<fieldset>", "</fieldset>" ],
+	area: [ 1, "<map>", "</map>" ],
+
+	// Support: IE8
+	param: [ 1, "<object>", "</object>" ],
+	thead: [ 1, "<table>", "</table>" ],
+	tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+	col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
+	td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+
+	// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
+	// unless wrapped in a div with non-breaking characters in front of it.
+	_default: support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X<div>", "</div>" ]
+};
+
+// Support: IE8-IE9
+wrapMap.optgroup = wrapMap.option;
+
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+
+function getAll( context, tag ) {
+	var elems, elem,
+		i = 0,
+		found = typeof context.getElementsByTagName !== "undefined" ?
+			context.getElementsByTagName( tag || "*" ) :
+			typeof context.querySelectorAll !== "undefined" ?
+				context.querySelectorAll( tag || "*" ) :
+				undefined;
+
+	if ( !found ) {
+		for ( found = [], elems = context.childNodes || context;
+			( elem = elems[ i ] ) != null;
+			i++
+		) {
+			if ( !tag || jQuery.nodeName( elem, tag ) ) {
+				found.push( elem );
+			} else {
+				jQuery.merge( found, getAll( elem, tag ) );
+			}
+		}
+	}
+
+	return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
+		jQuery.merge( [ context ], found ) :
+		found;
+}
+
+
+// Mark scripts as having already been evaluated
+function setGlobalEval( elems, refElements ) {
+	var elem,
+		i = 0;
+	for ( ; ( elem = elems[ i ] ) != null; i++ ) {
+		jQuery._data(
+			elem,
+			"globalEval",
+			!refElements || jQuery._data( refElements[ i ], "globalEval" )
+		);
+	}
+}
+
+
+var rhtml = /<|&#?\w+;/,
+	rtbody = /<tbody/i;
+
+function fixDefaultChecked( elem ) {
+	if ( rcheckableType.test( elem.type ) ) {
+		elem.defaultChecked = elem.checked;
+	}
+}
+
+function buildFragment( elems, context, scripts, selection, ignored ) {
+	var j, elem, contains,
+		tmp, tag, tbody, wrap,
+		l = elems.length,
+
+		// Ensure a safe fragment
+		safe = createSafeFragment( context ),
+
+		nodes = [],
+		i = 0;
+
+	for ( ; i < l; i++ ) {
+		elem = elems[ i ];
+
+		if ( elem || elem === 0 ) {
+
+			// Add nodes directly
+			if ( jQuery.type( elem ) === "object" ) {
+				jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
+
+			// Convert non-html into a text node
+			} else if ( !rhtml.test( elem ) ) {
+				nodes.push( context.createTextNode( elem ) );
+
+			// Convert html into DOM nodes
+			} else {
+				tmp = tmp || safe.appendChild( context.createElement( "div" ) );
+
+				// Deserialize a standard representation
+				tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
+				wrap = wrapMap[ tag ] || wrapMap._default;
+
+				tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
+
+				// Descend through wrappers to the right content
+				j = wrap[ 0 ];
+				while ( j-- ) {
+					tmp = tmp.lastChild;
+				}
+
+				// Manually add leading whitespace removed by IE
+				if ( !support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
+					nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[ 0 ] ) );
+				}
+
+				// Remove IE's autoinserted <tbody> from table fragments
+				if ( !support.tbody ) {
+
+					// String was a <table>, *may* have spurious <tbody>
+					elem = tag === "table" && !rtbody.test( elem ) ?
+						tmp.firstChild :
+
+						// String was a bare <thead> or <tfoot>
+						wrap[ 1 ] === "<table>" && !rtbody.test( elem ) ?
+							tmp :
+							0;
+
+					j = elem && elem.childNodes.length;
+					while ( j-- ) {
+						if ( jQuery.nodeName( ( tbody = elem.childNodes[ j ] ), "tbody" ) &&
+							!tbody.childNodes.length ) {
+
+							elem.removeChild( tbody );
+						}
+					}
+				}
+
+				jQuery.merge( nodes, tmp.childNodes );
+
+				// Fix #12392 for WebKit and IE > 9
+				tmp.textContent = "";
+
+				// Fix #12392 for oldIE
+				while ( tmp.firstChild ) {
+					tmp.removeChild( tmp.firstChild );
+				}
+
+				// Remember the top-level container for proper cleanup
+				tmp = safe.lastChild;
+			}
+		}
+	}
+
+	// Fix #11356: Clear elements from fragment
+	if ( tmp ) {
+		safe.removeChild( tmp );
+	}
+
+	// Reset defaultChecked for any radios and checkboxes
+	// about to be appended to the DOM in IE 6/7 (#8060)
+	if ( !support.appendChecked ) {
+		jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked );
+	}
+
+	i = 0;
+	while ( ( elem = nodes[ i++ ] ) ) {
+
+		// Skip elements already in the context collection (trac-4087)
+		if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
+			if ( ignored ) {
+				ignored.push( elem );
+			}
+
+			continue;
+		}
+
+		contains = jQuery.contains( elem.ownerDocument, elem );
+
+		// Append to fragment
+		tmp = getAll( safe.appendChild( elem ), "script" );
+
+		// Preserve script evaluation history
+		if ( contains ) {
+			setGlobalEval( tmp );
+		}
+
+		// Capture executables
+		if ( scripts ) {
+			j = 0;
+			while ( ( elem = tmp[ j++ ] ) ) {
+				if ( rscriptType.test( elem.type || "" ) ) {
+					scripts.push( elem );
+				}
+			}
+		}
+	}
+
+	tmp = null;
+
+	return safe;
+}
+
+
+( function() {
+	var i, eventName,
+		div = document.createElement( "div" );
+
+	// Support: IE<9 (lack submit/change bubble), Firefox (lack focus(in | out) events)
+	for ( i in { submit: true, change: true, focusin: true } ) {
+		eventName = "on" + i;
+
+		if ( !( support[ i ] = eventName in window ) ) {
+
+			// Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)
+			div.setAttribute( eventName, "t" );
+			support[ i ] = div.attributes[ eventName ].expando === false;
+		}
+	}
+
+	// Null elements to avoid leaks in IE.
+	div = null;
+} )();
+
+
+var rformElems = /^(?:input|select|textarea)$/i,
+	rkeyEvent = /^key/,
+	rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
+	rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+	rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
+
+function returnTrue() {
+	return true;
+}
+
+function returnFalse() {
+	return false;
+}
+
+// Support: IE9
+// See #13393 for more info
+function safeActiveElement() {
+	try {
+		return document.activeElement;
+	} catch ( err ) { }
+}
+
+function on( elem, types, selector, data, fn, one ) {
+	var origFn, type;
+
+	// Types can be a map of types/handlers
+	if ( typeof types === "object" ) {
+
+		// ( types-Object, selector, data )
+		if ( typeof selector !== "string" ) {
+
+			// ( types-Object, data )
+			data = data || selector;
+			selector = undefined;
+		}
+		for ( type in types ) {
+			on( elem, type, selector, data, types[ type ], one );
+		}
+		return elem;
+	}
+
+	if ( data == null && fn == null ) {
+
+		// ( types, fn )
+		fn = selector;
+		data = selector = undefined;
+	} else if ( fn == null ) {
+		if ( typeof selector === "string" ) {
+
+			// ( types, selector, fn )
+			fn = data;
+			data = undefined;
+		} else {
+
+			// ( types, data, fn )
+			fn = data;
+			data = selector;
+			selector = undefined;
+		}
+	}
+	if ( fn === false ) {
+		fn = returnFalse;
+	} else if ( !fn ) {
+		return elem;
+	}
+
+	if ( one === 1 ) {
+		origFn = fn;
+		fn = function( event ) {
+
+			// Can use an empty set, since event contains the info
+			jQuery().off( event );
+			return origFn.apply( this, arguments );
+		};
+
+		// Use same guid so caller can remove using origFn
+		fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+	}
+	return elem.each( function() {
+		jQuery.event.add( this, types, fn, data, selector );
+	} );
+}
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+	global: {},
+
+	add: function( elem, types, handler, data, selector ) {
+		var tmp, events, t, handleObjIn,
+			special, eventHandle, handleObj,
+			handlers, type, namespaces, origType,
+			elemData = jQuery._data( elem );
+
+		// Don't attach events to noData or text/comment nodes (but allow plain objects)
+		if ( !elemData ) {
+			return;
+		}
+
+		// Caller can pass in an object of custom data in lieu of the handler
+		if ( handler.handler ) {
+			handleObjIn = handler;
+			handler = handleObjIn.handler;
+			selector = handleObjIn.selector;
+		}
+
+		// Make sure that the handler has a unique ID, used to find/remove it later
+		if ( !handler.guid ) {
+			handler.guid = jQuery.guid++;
+		}
+
+		// Init the element's event structure and main handler, if this is the first
+		if ( !( events = elemData.events ) ) {
+			events = elemData.events = {};
+		}
+		if ( !( eventHandle = elemData.handle ) ) {
+			eventHandle = elemData.handle = function( e ) {
+
+				// Discard the second event of a jQuery.event.trigger() and
+				// when an event is called after a page has unloaded
+				return typeof jQuery !== "undefined" &&
+					( !e || jQuery.event.triggered !== e.type ) ?
+					jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
+					undefined;
+			};
+
+			// Add elem as a property of the handle fn to prevent a memory leak
+			// with IE non-native events
+			eventHandle.elem = elem;
+		}
+
+		// Handle multiple events separated by a space
+		types = ( types || "" ).match( rnotwhite ) || [ "" ];
+		t = types.length;
+		while ( t-- ) {
+			tmp = rtypenamespace.exec( types[ t ] ) || [];
+			type = origType = tmp[ 1 ];
+			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
+
+			// There *must* be a type, no attaching namespace-only handlers
+			if ( !type ) {
+				continue;
+			}
+
+			// If event changes its type, use the special event handlers for the changed type
+			special = jQuery.event.special[ type ] || {};
+
+			// If selector defined, determine special event api type, otherwise given type
+			type = ( selector ? special.delegateType : special.bindType ) || type;
+
+			// Update special based on newly reset type
+			special = jQuery.event.special[ type ] || {};
+
+			// handleObj is passed to all event handlers
+			handleObj = jQuery.extend( {
+				type: type,
+				origType: origType,
+				data: data,
+				handler: handler,
+				guid: handler.guid,
+				selector: selector,
+				needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
+				namespace: namespaces.join( "." )
+			}, handleObjIn );
+
+			// Init the event handler queue if we're the first
+			if ( !( handlers = events[ type ] ) ) {
+				handlers = events[ type ] = [];
+				handlers.delegateCount = 0;
+
+				// Only use addEventListener/attachEvent if the special events handler returns false
+				if ( !special.setup ||
+					special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+
+					// Bind the global event handler to the element
+					if ( elem.addEventListener ) {
+						elem.addEventListener( type, eventHandle, false );
+
+					} else if ( elem.attachEvent ) {
+						elem.attachEvent( "on" + type, eventHandle );
+					}
+				}
+			}
+
+			if ( special.add ) {
+				special.add.call( elem, handleObj );
+
+				if ( !handleObj.handler.guid ) {
+					handleObj.handler.guid = handler.guid;
+				}
+			}
+
+			// Add to the element's handler list, delegates in front
+			if ( selector ) {
+				handlers.splice( handlers.delegateCount++, 0, handleObj );
+			} else {
+				handlers.push( handleObj );
+			}
+
+			// Keep track of which events have ever been used, for event optimization
+			jQuery.event.global[ type ] = true;
+		}
+
+		// Nullify elem to prevent memory leaks in IE
+		elem = null;
+	},
+
+	// Detach an event or set of events from an element
+	remove: function( elem, types, handler, selector, mappedTypes ) {
+		var j, handleObj, tmp,
+			origCount, t, events,
+			special, handlers, type,
+			namespaces, origType,
+			elemData = jQuery.hasData( elem ) && jQuery._data( elem );
+
+		if ( !elemData || !( events = elemData.events ) ) {
+			return;
+		}
+
+		// Once for each type.namespace in types; type may be omitted
+		types = ( types || "" ).match( rnotwhite ) || [ "" ];
+		t = types.length;
+		while ( t-- ) {
+			tmp = rtypenamespace.exec( types[ t ] ) || [];
+			type = origType = tmp[ 1 ];
+			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
+
+			// Unbind all events (on this namespace, if provided) for the element
+			if ( !type ) {
+				for ( type in events ) {
+					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+				}
+				continue;
+			}
+
+			special = jQuery.event.special[ type ] || {};
+			type = ( selector ? special.delegateType : special.bindType ) || type;
+			handlers = events[ type ] || [];
+			tmp = tmp[ 2 ] &&
+				new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
+
+			// Remove matching events
+			origCount = j = handlers.length;
+			while ( j-- ) {
+				handleObj = handlers[ j ];
+
+				if ( ( mappedTypes || origType === handleObj.origType ) &&
+					( !handler || handler.guid === handleObj.guid ) &&
+					( !tmp || tmp.test( handleObj.namespace ) ) &&
+					( !selector || selector === handleObj.selector ||
+						selector === "**" && handleObj.selector ) ) {
+					handlers.splice( j, 1 );
+
+					if ( handleObj.selector ) {
+						handlers.delegateCount--;
+					}
+					if ( special.remove ) {
+						special.remove.call( elem, handleObj );
+					}
+				}
+			}
+
+			// Remove generic event handler if we removed something and no more handlers exist
+			// (avoids potential for endless recursion during removal of special event handlers)
+			if ( origCount && !handlers.length ) {
+				if ( !special.teardown ||
+					special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
+
+					jQuery.removeEvent( elem, type, elemData.handle );
+				}
+
+				delete events[ type ];
+			}
+		}
+
+		// Remove the expando if it's no longer used
+		if ( jQuery.isEmptyObject( events ) ) {
+			delete elemData.handle;
+
+			// removeData also checks for emptiness and clears the expando if empty
+			// so use it instead of delete
+			jQuery._removeData( elem, "events" );
+		}
+	},
+
+	trigger: function( event, data, elem, onlyHandlers ) {
+		var handle, ontype, cur,
+			bubbleType, special, tmp, i,
+			eventPath = [ elem || document ],
+			type = hasOwn.call( event, "type" ) ? event.type : event,
+			namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
+
+		cur = tmp = elem = elem || document;
+
+		// Don't do events on text and comment nodes
+		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+			return;
+		}
+
+		// focus/blur morphs to focusin/out; ensure we're not firing them right now
+		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+			return;
+		}
+
+		if ( type.indexOf( "." ) > -1 ) {
+
+			// Namespaced trigger; create a regexp to match event type in handle()
+			namespaces = type.split( "." );
+			type = namespaces.shift();
+			namespaces.sort();
+		}
+		ontype = type.indexOf( ":" ) < 0 && "on" + type;
+
+		// Caller can pass in a jQuery.Event object, Object, or just an event type string
+		event = event[ jQuery.expando ] ?
+			event :
+			new jQuery.Event( type, typeof event === "object" && event );
+
+		// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
+		event.isTrigger = onlyHandlers ? 2 : 3;
+		event.namespace = namespaces.join( "." );
+		event.rnamespace = event.namespace ?
+			new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
+			null;
+
+		// Clean up the event in case it is being reused
+		event.result = undefined;
+		if ( !event.target ) {
+			event.target = elem;
+		}
+
+		// Clone any incoming data and prepend the event, creating the handler arg list
+		data = data == null ?
+			[ event ] :
+			jQuery.makeArray( data, [ event ] );
+
+		// Allow special events to draw outside the lines
+		special = jQuery.event.special[ type ] || {};
+		if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
+			return;
+		}
+
+		// Determine event propagation path in advance, per W3C events spec (#9951)
+		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+		if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+
+			bubbleType = special.delegateType || type;
+			if ( !rfocusMorph.test( bubbleType + type ) ) {
+				cur = cur.parentNode;
+			}
+			for ( ; cur; cur = cur.parentNode ) {
+				eventPath.push( cur );
+				tmp = cur;
+			}
+
+			// Only add window if we got to document (e.g., not plain obj or detached DOM)
+			if ( tmp === ( elem.ownerDocument || document ) ) {
+				eventPath.push( tmp.defaultView || tmp.parentWindow || window );
+			}
+		}
+
+		// Fire handlers on the event path
+		i = 0;
+		while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
+
+			event.type = i > 1 ?
+				bubbleType :
+				special.bindType || type;
+
+			// jQuery handler
+			handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] &&
+				jQuery._data( cur, "handle" );
+
+			if ( handle ) {
+				handle.apply( cur, data );
+			}
+
+			// Native handler
+			handle = ontype && cur[ ontype ];
+			if ( handle && handle.apply && acceptData( cur ) ) {
+				event.result = handle.apply( cur, data );
+				if ( event.result === false ) {
+					event.preventDefault();
+				}
+			}
+		}
+		event.type = type;
+
+		// If nobody prevented the default action, do it now
+		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+
+			if (
+				( !special._default ||
+				 special._default.apply( eventPath.pop(), data ) === false
+				) && acceptData( elem )
+			) {
+
+				// Call a native DOM method on the target with the same name name as the event.
+				// Can't use an .isFunction() check here because IE6/7 fails that test.
+				// Don't do default actions on window, that's where global variables be (#6170)
+				if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {
+
+					// Don't re-trigger an onFOO event when we call its FOO() method
+					tmp = elem[ ontype ];
+
+					if ( tmp ) {
+						elem[ ontype ] = null;
+					}
+
+					// Prevent re-triggering of the same event, since we already bubbled it above
+					jQuery.event.triggered = type;
+					try {
+						elem[ type ]();
+					} catch ( e ) {
+
+						// IE<9 dies on focus/blur to hidden element (#1486,#12518)
+						// only reproducible on winXP IE8 native, not IE9 in IE8 mode
+					}
+					jQuery.event.triggered = undefined;
+
+					if ( tmp ) {
+						elem[ ontype ] = tmp;
+					}
+				}
+			}
+		}
+
+		return event.result;
+	},
+
+	dispatch: function( event ) {
+
+		// Make a writable jQuery.Event from the native event object
+		event = jQuery.event.fix( event );
+
+		var i, j, ret, matched, handleObj,
+			handlerQueue = [],
+			args = slice.call( arguments ),
+			handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [],
+			special = jQuery.event.special[ event.type ] || {};
+
+		// Use the fix-ed jQuery.Event rather than the (read-only) native event
+		args[ 0 ] = event;
+		event.delegateTarget = this;
+
+		// Call the preDispatch hook for the mapped type, and let it bail if desired
+		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+			return;
+		}
+
+		// Determine handlers
+		handlerQueue = jQuery.event.handlers.call( this, event, handlers );
+
+		// Run delegates first; they may want to stop propagation beneath us
+		i = 0;
+		while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
+			event.currentTarget = matched.elem;
+
+			j = 0;
+			while ( ( handleObj = matched.handlers[ j++ ] ) &&
+				!event.isImmediatePropagationStopped() ) {
+
+				// Triggered event must either 1) have no namespace, or 2) have namespace(s)
+				// a subset or equal to those in the bound event (both can have no namespace).
+				if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {
+
+					event.handleObj = handleObj;
+					event.data = handleObj.data;
+
+					ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
+						handleObj.handler ).apply( matched.elem, args );
+
+					if ( ret !== undefined ) {
+						if ( ( event.result = ret ) === false ) {
+							event.preventDefault();
+							event.stopPropagation();
+						}
+					}
+				}
+			}
+		}
+
+		// Call the postDispatch hook for the mapped type
+		if ( special.postDispatch ) {
+			special.postDispatch.call( this, event );
+		}
+
+		return event.result;
+	},
+
+	handlers: function( event, handlers ) {
+		var i, matches, sel, handleObj,
+			handlerQueue = [],
+			delegateCount = handlers.delegateCount,
+			cur = event.target;
+
+		// Support (at least): Chrome, IE9
+		// Find delegate handlers
+		// Black-hole SVG <use> instance trees (#13180)
+		//
+		// Support: Firefox<=42+
+		// Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343)
+		if ( delegateCount && cur.nodeType &&
+			( event.type !== "click" || isNaN( event.button ) || event.button < 1 ) ) {
+
+			/* jshint eqeqeq: false */
+			for ( ; cur != this; cur = cur.parentNode || this ) {
+				/* jshint eqeqeq: true */
+
+				// Don't check non-elements (#13208)
+				// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
+				if ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== "click" ) ) {
+					matches = [];
+					for ( i = 0; i < delegateCount; i++ ) {
+						handleObj = handlers[ i ];
+
+						// Don't conflict with Object.prototype properties (#13203)
+						sel = handleObj.selector + " ";
+
+						if ( matches[ sel ] === undefined ) {
+							matches[ sel ] = handleObj.needsContext ?
+								jQuery( sel, this ).index( cur ) > -1 :
+								jQuery.find( sel, this, null, [ cur ] ).length;
+						}
+						if ( matches[ sel ] ) {
+							matches.push( handleObj );
+						}
+					}
+					if ( matches.length ) {
+						handlerQueue.push( { elem: cur, handlers: matches } );
+					}
+				}
+			}
+		}
+
+		// Add the remaining (directly-bound) handlers
+		if ( delegateCount < handlers.length ) {
+			handlerQueue.push( { elem: this, handlers: handlers.slice( delegateCount ) } );
+		}
+
+		return handlerQueue;
+	},
+
+	fix: function( event ) {
+		if ( event[ jQuery.expando ] ) {
+			return event;
+		}
+
+		// Create a writable copy of the event object and normalize some properties
+		var i, prop, copy,
+			type = event.type,
+			originalEvent = event,
+			fixHook = this.fixHooks[ type ];
+
+		if ( !fixHook ) {
+			this.fixHooks[ type ] = fixHook =
+				rmouseEvent.test( type ) ? this.mouseHooks :
+				rkeyEvent.test( type ) ? this.keyHooks :
+				{};
+		}
+		copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
+
+		event = new jQuery.Event( originalEvent );
+
+		i = copy.length;
+		while ( i-- ) {
+			prop = copy[ i ];
+			event[ prop ] = originalEvent[ prop ];
+		}
+
+		// Support: IE<9
+		// Fix target property (#1925)
+		if ( !event.target ) {
+			event.target = originalEvent.srcElement || document;
+		}
+
+		// Support: Safari 6-8+
+		// Target should not be a text node (#504, #13143)
+		if ( event.target.nodeType === 3 ) {
+			event.target = event.target.parentNode;
+		}
+
+		// Support: IE<9
+		// For mouse/key events, metaKey==false if it's undefined (#3368, #11328)
+		event.metaKey = !!event.metaKey;
+
+		return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
+	},
+
+	// Includes some event props shared by KeyEvent and MouseEvent
+	props: ( "altKey bubbles cancelable ctrlKey currentTarget detail eventPhase " +
+		"metaKey relatedTarget shiftKey target timeStamp view which" ).split( " " ),
+
+	fixHooks: {},
+
+	keyHooks: {
+		props: "char charCode key keyCode".split( " " ),
+		filter: function( event, original ) {
+
+			// Add which for key events
+			if ( event.which == null ) {
+				event.which = original.charCode != null ? original.charCode : original.keyCode;
+			}
+
+			return event;
+		}
+	},
+
+	mouseHooks: {
+		props: ( "button buttons clientX clientY fromElement offsetX offsetY " +
+			"pageX pageY screenX screenY toElement" ).split( " " ),
+		filter: function( event, original ) {
+			var body, eventDoc, doc,
+				button = original.button,
+				fromElement = original.fromElement;
+
+			// Calculate pageX/Y if missing and clientX/Y available
+			if ( event.pageX == null && original.clientX != null ) {
+				eventDoc = event.target.ownerDocument || document;
+				doc = eventDoc.documentElement;
+				body = eventDoc.body;
+
+				event.pageX = original.clientX +
+					( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) -
+					( doc && doc.clientLeft || body && body.clientLeft || 0 );
+				event.pageY = original.clientY +
+					( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) -
+					( doc && doc.clientTop  || body && body.clientTop  || 0 );
+			}
+
+			// Add relatedTarget, if necessary
+			if ( !event.relatedTarget && fromElement ) {
+				event.relatedTarget = fromElement === event.target ?
+					original.toElement :
+					fromElement;
+			}
+
+			// Add which for click: 1 === left; 2 === middle; 3 === right
+			// Note: button is not normalized, so don't use it
+			if ( !event.which && button !== undefined ) {
+				event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
+			}
+
+			return event;
+		}
+	},
+
+	special: {
+		load: {
+
+			// Prevent triggered image.load events from bubbling to window.load
+			noBubble: true
+		},
+		focus: {
+
+			// Fire native event if possible so blur/focus sequence is correct
+			trigger: function() {
+				if ( this !== safeActiveElement() && this.focus ) {
+					try {
+						this.focus();
+						return false;
+					} catch ( e ) {
+
+						// Support: IE<9
+						// If we error on focus to hidden element (#1486, #12518),
+						// let .trigger() run the handlers
+					}
+				}
+			},
+			delegateType: "focusin"
+		},
+		blur: {
+			trigger: function() {
+				if ( this === safeActiveElement() && this.blur ) {
+					this.blur();
+					return false;
+				}
+			},
+			delegateType: "focusout"
+		},
+		click: {
+
+			// For checkbox, fire native event so checked state will be right
+			trigger: function() {
+				if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) {
+					this.click();
+					return false;
+				}
+			},
+
+			// For cross-browser consistency, don't fire native .click() on links
+			_default: function( event ) {
+				return jQuery.nodeName( event.target, "a" );
+			}
+		},
+
+		beforeunload: {
+			postDispatch: function( event ) {
+
+				// Support: Firefox 20+
+				// Firefox doesn't alert if the returnValue field is not set.
+				if ( event.result !== undefined && event.originalEvent ) {
+					event.originalEvent.returnValue = event.result;
+				}
+			}
+		}
+	},
+
+	// Piggyback on a donor event to simulate a different one
+	simulate: function( type, elem, event ) {
+		var e = jQuery.extend(
+			new jQuery.Event(),
+			event,
+			{
+				type: type,
+				isSimulated: true
+
+				// Previously, `originalEvent: {}` was set here, so stopPropagation call
+				// would not be triggered on donor event, since in our own
+				// jQuery.event.stopPropagation function we had a check for existence of
+				// originalEvent.stopPropagation method, so, consequently it would be a noop.
+				//
+				// Guard for simulated events was moved to jQuery.event.stopPropagation function
+				// since `originalEvent` should point to the original event for the
+				// constancy with other events and for more focused logic
+			}
+		);
+
+		jQuery.event.trigger( e, null, elem );
+
+		if ( e.isDefaultPrevented() ) {
+			event.preventDefault();
+		}
+	}
+};
+
+jQuery.removeEvent = document.removeEventListener ?
+	function( elem, type, handle ) {
+
+		// This "if" is needed for plain objects
+		if ( elem.removeEventListener ) {
+			elem.removeEventListener( type, handle );
+		}
+	} :
+	function( elem, type, handle ) {
+		var name = "on" + type;
+
+		if ( elem.detachEvent ) {
+
+			// #8545, #7054, preventing memory leaks for custom events in IE6-8
+			// detachEvent needed property on element, by name of that event,
+			// to properly expose it to GC
+			if ( typeof elem[ name ] === "undefined" ) {
+				elem[ name ] = null;
+			}
+
+			elem.detachEvent( name, handle );
+		}
+	};
+
+jQuery.Event = function( src, props ) {
+
+	// Allow instantiation without the 'new' keyword
+	if ( !( this instanceof jQuery.Event ) ) {
+		return new jQuery.Event( src, props );
+	}
+
+	// Event object
+	if ( src && src.type ) {
+		this.originalEvent = src;
+		this.type = src.type;
+
+		// Events bubbling up the document may have been marked as prevented
+		// by a handler lower down the tree; reflect the correct value.
+		this.isDefaultPrevented = src.defaultPrevented ||
+				src.defaultPrevented === undefined &&
+
+				// Support: IE < 9, Android < 4.0
+				src.returnValue === false ?
+			returnTrue :
+			returnFalse;
+
+	// Event type
+	} else {
+		this.type = src;
+	}
+
+	// Put explicitly provided properties onto the event object
+	if ( props ) {
+		jQuery.extend( this, props );
+	}
+
+	// Create a timestamp if incoming event doesn't have one
+	this.timeStamp = src && src.timeStamp || jQuery.now();
+
+	// Mark it as fixed
+	this[ jQuery.expando ] = true;
+};
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+	constructor: jQuery.Event,
+	isDefaultPrevented: returnFalse,
+	isPropagationStopped: returnFalse,
+	isImmediatePropagationStopped: returnFalse,
+
+	preventDefault: function() {
+		var e = this.originalEvent;
+
+		this.isDefaultPrevented = returnTrue;
+		if ( !e ) {
+			return;
+		}
+
+		// If preventDefault exists, run it on the original event
+		if ( e.preventDefault ) {
+			e.preventDefault();
+
+		// Support: IE
+		// Otherwise set the returnValue property of the original event to false
+		} else {
+			e.returnValue = false;
+		}
+	},
+	stopPropagation: function() {
+		var e = this.originalEvent;
+
+		this.isPropagationStopped = returnTrue;
+
+		if ( !e || this.isSimulated ) {
+			return;
+		}
+
+		// If stopPropagation exists, run it on the original event
+		if ( e.stopPropagation ) {
+			e.stopPropagation();
+		}
+
+		// Support: IE
+		// Set the cancelBubble property of the original event to true
+		e.cancelBubble = true;
+	},
+	stopImmediatePropagation: function() {
+		var e = this.originalEvent;
+
+		this.isImmediatePropagationStopped = returnTrue;
+
+		if ( e && e.stopImmediatePropagation ) {
+			e.stopImmediatePropagation();
+		}
+
+		this.stopPropagation();
+	}
+};
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+// so that event delegation works in jQuery.
+// Do the same for pointerenter/pointerleave and pointerover/pointerout
+//
+// Support: Safari 7 only
+// Safari sends mouseenter too often; see:
+// https://code.google.com/p/chromium/issues/detail?id=470258
+// for the description of the bug (it existed in older Chrome versions as well).
+jQuery.each( {
+	mouseenter: "mouseover",
+	mouseleave: "mouseout",
+	pointerenter: "pointerover",
+	pointerleave: "pointerout"
+}, function( orig, fix ) {
+	jQuery.event.special[ orig ] = {
+		delegateType: fix,
+		bindType: fix,
+
+		handle: function( event ) {
+			var ret,
+				target = this,
+				related = event.relatedTarget,
+				handleObj = event.handleObj;
+
+			// For mouseenter/leave call the handler if related is outside the target.
+			// NB: No relatedTarget if the mouse left/entered the browser window
+			if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
+				event.type = handleObj.origType;
+				ret = handleObj.handler.apply( this, arguments );
+				event.type = fix;
+			}
+			return ret;
+		}
+	};
+} );
+
+// IE submit delegation
+if ( !support.submit ) {
+
+	jQuery.event.special.submit = {
+		setup: function() {
+
+			// Only need this for delegated form submit events
+			if ( jQuery.nodeName( this, "form" ) ) {
+				return false;
+			}
+
+			// Lazy-add a submit handler when a descendant form may potentially be submitted
+			jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
+
+				// Node name check avoids a VML-related crash in IE (#9807)
+				var elem = e.target,
+					form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ?
+
+						// Support: IE <=8
+						// We use jQuery.prop instead of elem.form
+						// to allow fixing the IE8 delegated submit issue (gh-2332)
+						// by 3rd party polyfills/workarounds.
+						jQuery.prop( elem, "form" ) :
+						undefined;
+
+				if ( form && !jQuery._data( form, "submit" ) ) {
+					jQuery.event.add( form, "submit._submit", function( event ) {
+						event._submitBubble = true;
+					} );
+					jQuery._data( form, "submit", true );
+				}
+			} );
+
+			// return undefined since we don't need an event listener
+		},
+
+		postDispatch: function( event ) {
+
+			// If form was submitted by the user, bubble the event up the tree
+			if ( event._submitBubble ) {
+				delete event._submitBubble;
+				if ( this.parentNode && !event.isTrigger ) {
+					jQuery.event.simulate( "submit", this.parentNode, event );
+				}
+			}
+		},
+
+		teardown: function() {
+
+			// Only need this for delegated form submit events
+			if ( jQuery.nodeName( this, "form" ) ) {
+				return false;
+			}
+
+			// Remove delegated handlers; cleanData eventually reaps submit handlers attached above
+			jQuery.event.remove( this, "._submit" );
+		}
+	};
+}
+
+// IE change delegation and checkbox/radio fix
+if ( !support.change ) {
+
+	jQuery.event.special.change = {
+
+		setup: function() {
+
+			if ( rformElems.test( this.nodeName ) ) {
+
+				// IE doesn't fire change on a check/radio until blur; trigger it on click
+				// after a propertychange. Eat the blur-change in special.change.handle.
+				// This still fires onchange a second time for check/radio after blur.
+				if ( this.type === "checkbox" || this.type === "radio" ) {
+					jQuery.event.add( this, "propertychange._change", function( event ) {
+						if ( event.originalEvent.propertyName === "checked" ) {
+							this._justChanged = true;
+						}
+					} );
+					jQuery.event.add( this, "click._change", function( event ) {
+						if ( this._justChanged && !event.isTrigger ) {
+							this._justChanged = false;
+						}
+
+						// Allow triggered, simulated change events (#11500)
+						jQuery.event.simulate( "change", this, event );
+					} );
+				}
+				return false;
+			}
+
+			// Delegated event; lazy-add a change handler on descendant inputs
+			jQuery.event.add( this, "beforeactivate._change", function( e ) {
+				var elem = e.target;
+
+				if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "change" ) ) {
+					jQuery.event.add( elem, "change._change", function( event ) {
+						if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
+							jQuery.event.simulate( "change", this.parentNode, event );
+						}
+					} );
+					jQuery._data( elem, "change", true );
+				}
+			} );
+		},
+
+		handle: function( event ) {
+			var elem = event.target;
+
+			// Swallow native change events from checkbox/radio, we already triggered them above
+			if ( this !== elem || event.isSimulated || event.isTrigger ||
+				( elem.type !== "radio" && elem.type !== "checkbox" ) ) {
+
+				return event.handleObj.handler.apply( this, arguments );
+			}
+		},
+
+		teardown: function() {
+			jQuery.event.remove( this, "._change" );
+
+			return !rformElems.test( this.nodeName );
+		}
+	};
+}
+
+// Support: Firefox
+// Firefox doesn't have focus(in | out) events
+// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
+//
+// Support: Chrome, Safari
+// focus(in | out) events fire after focus & blur events,
+// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
+// Related ticket - https://code.google.com/p/chromium/issues/detail?id=449857
+if ( !support.focusin ) {
+	jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+		// Attach a single capturing handler on the document while someone wants focusin/focusout
+		var handler = function( event ) {
+			jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
+		};
+
+		jQuery.event.special[ fix ] = {
+			setup: function() {
+				var doc = this.ownerDocument || this,
+					attaches = jQuery._data( doc, fix );
+
+				if ( !attaches ) {
+					doc.addEventListener( orig, handler, true );
+				}
+				jQuery._data( doc, fix, ( attaches || 0 ) + 1 );
+			},
+			teardown: function() {
+				var doc = this.ownerDocument || this,
+					attaches = jQuery._data( doc, fix ) - 1;
+
+				if ( !attaches ) {
+					doc.removeEventListener( orig, handler, true );
+					jQuery._removeData( doc, fix );
+				} else {
+					jQuery._data( doc, fix, attaches );
+				}
+			}
+		};
+	} );
+}
+
+jQuery.fn.extend( {
+
+	on: function( types, selector, data, fn ) {
+		return on( this, types, selector, data, fn );
+	},
+	one: function( types, selector, data, fn ) {
+		return on( this, types, selector, data, fn, 1 );
+	},
+	off: function( types, selector, fn ) {
+		var handleObj, type;
+		if ( types && types.preventDefault && types.handleObj ) {
+
+			// ( event )  dispatched jQuery.Event
+			handleObj = types.handleObj;
+			jQuery( types.delegateTarget ).off(
+				handleObj.namespace ?
+					handleObj.origType + "." + handleObj.namespace :
+					handleObj.origType,
+				handleObj.selector,
+				handleObj.handler
+			);
+			return this;
+		}
+		if ( typeof types === "object" ) {
+
+			// ( types-object [, selector] )
+			for ( type in types ) {
+				this.off( type, selector, types[ type ] );
+			}
+			return this;
+		}
+		if ( selector === false || typeof selector === "function" ) {
+
+			// ( types [, fn] )
+			fn = selector;
+			selector = undefined;
+		}
+		if ( fn === false ) {
+			fn = returnFalse;
+		}
+		return this.each( function() {
+			jQuery.event.remove( this, types, fn, selector );
+		} );
+	},
+
+	trigger: function( type, data ) {
+		return this.each( function() {
+			jQuery.event.trigger( type, data, this );
+		} );
+	},
+	triggerHandler: function( type, data ) {
+		var elem = this[ 0 ];
+		if ( elem ) {
+			return jQuery.event.trigger( type, data, elem, true );
+		}
+	}
+} );
+
+
+var rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
+	rnoshimcache = new RegExp( "<(?:" + nodeNames + ")[\\s/>]", "i" ),
+	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,
+
+	// Support: IE 10-11, Edge 10240+
+	// In IE/Edge using regex groups here causes severe slowdowns.
+	// See https://connect.microsoft.com/IE/feedback/details/1736512/
+	rnoInnerhtml = /<script|<style|<link/i,
+
+	// checked="checked" or checked
+	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+	rscriptTypeMasked = /^true\/(.*)/,
+	rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
+	safeFragment = createSafeFragment( document ),
+	fragmentDiv = safeFragment.appendChild( document.createElement( "div" ) );
+
+// Support: IE<8
+// Manipulating tables requires a tbody
+function manipulationTarget( elem, content ) {
+	return jQuery.nodeName( elem, "table" ) &&
+		jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ?
+
+		elem.getElementsByTagName( "tbody" )[ 0 ] ||
+			elem.appendChild( elem.ownerDocument.createElement( "tbody" ) ) :
+		elem;
+}
+
+// Replace/restore the type attribute of script elements for safe DOM manipulation
+function disableScript( elem ) {
+	elem.type = ( jQuery.find.attr( elem, "type" ) !== null ) + "/" + elem.type;
+	return elem;
+}
+function restoreScript( elem ) {
+	var match = rscriptTypeMasked.exec( elem.type );
+	if ( match ) {
+		elem.type = match[ 1 ];
+	} else {
+		elem.removeAttribute( "type" );
+	}
+	return elem;
+}
+
+function cloneCopyEvent( src, dest ) {
+	if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
+		return;
+	}
+
+	var type, i, l,
+		oldData = jQuery._data( src ),
+		curData = jQuery._data( dest, oldData ),
+		events = oldData.events;
+
+	if ( events ) {
+		delete curData.handle;
+		curData.events = {};
+
+		for ( type in events ) {
+			for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+				jQuery.event.add( dest, type, events[ type ][ i ] );
+			}
+		}
+	}
+
+	// make the cloned public data object a copy from the original
+	if ( curData.data ) {
+		curData.data = jQuery.extend( {}, curData.data );
+	}
+}
+
+function fixCloneNodeIssues( src, dest ) {
+	var nodeName, e, data;
+
+	// We do not need to do anything for non-Elements
+	if ( dest.nodeType !== 1 ) {
+		return;
+	}
+
+	nodeName = dest.nodeName.toLowerCase();
+
+	// IE6-8 copies events bound via attachEvent when using cloneNode.
+	if ( !support.noCloneEvent && dest[ jQuery.expando ] ) {
+		data = jQuery._data( dest );
+
+		for ( e in data.events ) {
+			jQuery.removeEvent( dest, e, data.handle );
+		}
+
+		// Event data gets referenced instead of copied if the expando gets copied too
+		dest.removeAttribute( jQuery.expando );
+	}
+
+	// IE blanks contents when cloning scripts, and tries to evaluate newly-set text
+	if ( nodeName === "script" && dest.text !== src.text ) {
+		disableScript( dest ).text = src.text;
+		restoreScript( dest );
+
+	// IE6-10 improperly clones children of object elements using classid.
+	// IE10 throws NoModificationAllowedError if parent is null, #12132.
+	} else if ( nodeName === "object" ) {
+		if ( dest.parentNode ) {
+			dest.outerHTML = src.outerHTML;
+		}
+
+		// This path appears unavoidable for IE9. When cloning an object
+		// element in IE9, the outerHTML strategy above is not sufficient.
+		// If the src has innerHTML and the destination does not,
+		// copy the src.innerHTML into the dest.innerHTML. #10324
+		if ( support.html5Clone && ( src.innerHTML && !jQuery.trim( dest.innerHTML ) ) ) {
+			dest.innerHTML = src.innerHTML;
+		}
+
+	} else if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
+
+		// IE6-8 fails to persist the checked state of a cloned checkbox
+		// or radio button. Worse, IE6-7 fail to give the cloned element
+		// a checked appearance if the defaultChecked value isn't also set
+
+		dest.defaultChecked = dest.checked = src.checked;
+
+		// IE6-7 get confused and end up setting the value of a cloned
+		// checkbox/radio button to an empty string instead of "on"
+		if ( dest.value !== src.value ) {
+			dest.value = src.value;
+		}
+
+	// IE6-8 fails to return the selected option to the default selected
+	// state when cloning options
+	} else if ( nodeName === "option" ) {
+		dest.defaultSelected = dest.selected = src.defaultSelected;
+
+	// IE6-8 fails to set the defaultValue to the correct value when
+	// cloning other types of input fields
+	} else if ( nodeName === "input" || nodeName === "textarea" ) {
+		dest.defaultValue = src.defaultValue;
+	}
+}
+
+function domManip( collection, args, callback, ignored ) {
+
+	// Flatten any nested arrays
+	args = concat.apply( [], args );
+
+	var first, node, hasScripts,
+		scripts, doc, fragment,
+		i = 0,
+		l = collection.length,
+		iNoClone = l - 1,
+		value = args[ 0 ],
+		isFunction = jQuery.isFunction( value );
+
+	// We can't cloneNode fragments that contain checked, in WebKit
+	if ( isFunction ||
+			( l > 1 && typeof value === "string" &&
+				!support.checkClone && rchecked.test( value ) ) ) {
+		return collection.each( function( index ) {
+			var self = collection.eq( index );
+			if ( isFunction ) {
+				args[ 0 ] = value.call( this, index, self.html() );
+			}
+			domManip( self, args, callback, ignored );
+		} );
+	}
+
+	if ( l ) {
+		fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
+		first = fragment.firstChild;
+
+		if ( fragment.childNodes.length === 1 ) {
+			fragment = first;
+		}
+
+		// Require either new content or an interest in ignored elements to invoke the callback
+		if ( first || ignored ) {
+			scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
+			hasScripts = scripts.length;
+
+			// Use the original fragment for the last item
+			// instead of the first because it can end up
+			// being emptied incorrectly in certain situations (#8070).
+			for ( ; i < l; i++ ) {
+				node = fragment;
+
+				if ( i !== iNoClone ) {
+					node = jQuery.clone( node, true, true );
+
+					// Keep references to cloned scripts for later restoration
+					if ( hasScripts ) {
+
+						// Support: Android<4.1, PhantomJS<2
+						// push.apply(_, arraylike) throws on ancient WebKit
+						jQuery.merge( scripts, getAll( node, "script" ) );
+					}
+				}
+
+				callback.call( collection[ i ], node, i );
+			}
+
+			if ( hasScripts ) {
+				doc = scripts[ scripts.length - 1 ].ownerDocument;
+
+				// Reenable scripts
+				jQuery.map( scripts, restoreScript );
+
+				// Evaluate executable scripts on first document insertion
+				for ( i = 0; i < hasScripts; i++ ) {
+					node = scripts[ i ];
+					if ( rscriptType.test( node.type || "" ) &&
+						!jQuery._data( node, "globalEval" ) &&
+						jQuery.contains( doc, node ) ) {
+
+						if ( node.src ) {
+
+							// Optional AJAX dependency, but won't run scripts if not present
+							if ( jQuery._evalUrl ) {
+								jQuery._evalUrl( node.src );
+							}
+						} else {
+							jQuery.globalEval(
+								( node.text || node.textContent || node.innerHTML || "" )
+									.replace( rcleanScript, "" )
+							);
+						}
+					}
+				}
+			}
+
+			// Fix #11809: Avoid leaking memory
+			fragment = first = null;
+		}
+	}
+
+	return collection;
+}
+
+function remove( elem, selector, keepData ) {
+	var node,
+		elems = selector ? jQuery.filter( selector, elem ) : elem,
+		i = 0;
+
+	for ( ; ( node = elems[ i ] ) != null; i++ ) {
+
+		if ( !keepData && node.nodeType === 1 ) {
+			jQuery.cleanData( getAll( node ) );
+		}
+
+		if ( node.parentNode ) {
+			if ( keepData && jQuery.contains( node.ownerDocument, node ) ) {
+				setGlobalEval( getAll( node, "script" ) );
+			}
+			node.parentNode.removeChild( node );
+		}
+	}
+
+	return elem;
+}
+
+jQuery.extend( {
+	htmlPrefilter: function( html ) {
+		return html.replace( rxhtmlTag, "<$1></$2>" );
+	},
+
+	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+		var destElements, node, clone, i, srcElements,
+			inPage = jQuery.contains( elem.ownerDocument, elem );
+
+		if ( support.html5Clone || jQuery.isXMLDoc( elem ) ||
+			!rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
+
+			clone = elem.cloneNode( true );
+
+		// IE<=8 does not properly clone detached, unknown element nodes
+		} else {
+			fragmentDiv.innerHTML = elem.outerHTML;
+			fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
+		}
+
+		if ( ( !support.noCloneEvent || !support.noCloneChecked ) &&
+				( elem.nodeType === 1 || elem.nodeType === 11 ) && !jQuery.isXMLDoc( elem ) ) {
+
+			// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
+			destElements = getAll( clone );
+			srcElements = getAll( elem );
+
+			// Fix all IE cloning issues
+			for ( i = 0; ( node = srcElements[ i ] ) != null; ++i ) {
+
+				// Ensure that the destination node is not null; Fixes #9587
+				if ( destElements[ i ] ) {
+					fixCloneNodeIssues( node, destElements[ i ] );
+				}
+			}
+		}
+
+		// Copy the events from the original to the clone
+		if ( dataAndEvents ) {
+			if ( deepDataAndEvents ) {
+				srcElements = srcElements || getAll( elem );
+				destElements = destElements || getAll( clone );
+
+				for ( i = 0; ( node = srcElements[ i ] ) != null; i++ ) {
+					cloneCopyEvent( node, destElements[ i ] );
+				}
+			} else {
+				cloneCopyEvent( elem, clone );
+			}
+		}
+
+		// Preserve script evaluation history
+		destElements = getAll( clone, "script" );
+		if ( destElements.length > 0 ) {
+			setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
+		}
+
+		destElements = srcElements = node = null;
+
+		// Return the cloned set
+		return clone;
+	},
+
+	cleanData: function( elems, /* internal */ forceAcceptData ) {
+		var elem, type, id, data,
+			i = 0,
+			internalKey = jQuery.expando,
+			cache = jQuery.cache,
+			attributes = support.attributes,
+			special = jQuery.event.special;
+
+		for ( ; ( elem = elems[ i ] ) != null; i++ ) {
+			if ( forceAcceptData || acceptData( elem ) ) {
+
+				id = elem[ internalKey ];
+				data = id && cache[ id ];
+
+				if ( data ) {
+					if ( data.events ) {
+						for ( type in data.events ) {
+							if ( special[ type ] ) {
+								jQuery.event.remove( elem, type );
+
+							// This is a shortcut to avoid jQuery.event.remove's overhead
+							} else {
+								jQuery.removeEvent( elem, type, data.handle );
+							}
+						}
+					}
+
+					// Remove cache only if it was not already removed by jQuery.event.remove
+					if ( cache[ id ] ) {
+
+						delete cache[ id ];
+
+						// Support: IE<9
+						// IE does not allow us to delete expando properties from nodes
+						// IE creates expando attributes along with the property
+						// IE does not have a removeAttribute function on Document nodes
+						if ( !attributes && typeof elem.removeAttribute !== "undefined" ) {
+							elem.removeAttribute( internalKey );
+
+						// Webkit & Blink performance suffers when deleting properties
+						// from DOM nodes, so set to undefined instead
+						// https://code.google.com/p/chromium/issues/detail?id=378607
+						} else {
+							elem[ internalKey ] = undefined;
+						}
+
+						deletedIds.push( id );
+					}
+				}
+			}
+		}
+	}
+} );
+
+jQuery.fn.extend( {
+
+	// Keep domManip exposed until 3.0 (gh-2225)
+	domManip: domManip,
+
+	detach: function( selector ) {
+		return remove( this, selector, true );
+	},
+
+	remove: function( selector ) {
+		return remove( this, selector );
+	},
+
+	text: function( value ) {
+		return access( this, function( value ) {
+			return value === undefined ?
+				jQuery.text( this ) :
+				this.empty().append(
+					( this[ 0 ] && this[ 0 ].ownerDocument || document ).createTextNode( value )
+				);
+		}, null, value, arguments.length );
+	},
+
+	append: function() {
+		return domManip( this, arguments, function( elem ) {
+			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+				var target = manipulationTarget( this, elem );
+				target.appendChild( elem );
+			}
+		} );
+	},
+
+	prepend: function() {
+		return domManip( this, arguments, function( elem ) {
+			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+				var target = manipulationTarget( this, elem );
+				target.insertBefore( elem, target.firstChild );
+			}
+		} );
+	},
+
+	before: function() {
+		return domManip( this, arguments, function( elem ) {
+			if ( this.parentNode ) {
+				this.parentNode.insertBefore( elem, this );
+			}
+		} );
+	},
+
+	after: function() {
+		return domManip( this, arguments, function( elem ) {
+			if ( this.parentNode ) {
+				this.parentNode.insertBefore( elem, this.nextSibling );
+			}
+		} );
+	},
+
+	empty: function() {
+		var elem,
+			i = 0;
+
+		for ( ; ( elem = this[ i ] ) != null; i++ ) {
+
+			// Remove element nodes and prevent memory leaks
+			if ( elem.nodeType === 1 ) {
+				jQuery.cleanData( getAll( elem, false ) );
+			}
+
+			// Remove any remaining nodes
+			while ( elem.firstChild ) {
+				elem.removeChild( elem.firstChild );
+			}
+
+			// If this is a select, ensure that it displays empty (#12336)
+			// Support: IE<9
+			if ( elem.options && jQuery.nodeName( elem, "select" ) ) {
+				elem.options.length = 0;
+			}
+		}
+
+		return this;
+	},
+
+	clone: function( dataAndEvents, deepDataAndEvents ) {
+		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+		return this.map( function() {
+			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+		} );
+	},
+
+	html: function( value ) {
+		return access( this, function( value ) {
+			var elem = this[ 0 ] || {},
+				i = 0,
+				l = this.length;
+
+			if ( value === undefined ) {
+				return elem.nodeType === 1 ?
+					elem.innerHTML.replace( rinlinejQuery, "" ) :
+					undefined;
+			}
+
+			// See if we can take a shortcut and just use innerHTML
+			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+				( support.htmlSerialize || !rnoshimcache.test( value )  ) &&
+				( support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
+				!wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
+
+				value = jQuery.htmlPrefilter( value );
+
+				try {
+					for ( ; i < l; i++ ) {
+
+						// Remove element nodes and prevent memory leaks
+						elem = this[ i ] || {};
+						if ( elem.nodeType === 1 ) {
+							jQuery.cleanData( getAll( elem, false ) );
+							elem.innerHTML = value;
+						}
+					}
+
+					elem = 0;
+
+				// If using innerHTML throws an exception, use the fallback method
+				} catch ( e ) {}
+			}
+
+			if ( elem ) {
+				this.empty().append( value );
+			}
+		}, null, value, arguments.length );
+	},
+
+	replaceWith: function() {
+		var ignored = [];
+
+		// Make the changes, replacing each non-ignored context element with the new content
+		return domManip( this, arguments, function( elem ) {
+			var parent = this.parentNode;
+
+			if ( jQuery.inArray( this, ignored ) < 0 ) {
+				jQuery.cleanData( getAll( this ) );
+				if ( parent ) {
+					parent.replaceChild( elem, this );
+				}
+			}
+
+		// Force callback invocation
+		}, ignored );
+	}
+} );
+
+jQuery.each( {
+	appendTo: "append",
+	prependTo: "prepend",
+	insertBefore: "before",
+	insertAfter: "after",
+	replaceAll: "replaceWith"
+}, function( name, original ) {
+	jQuery.fn[ name ] = function( selector ) {
+		var elems,
+			i = 0,
+			ret = [],
+			insert = jQuery( selector ),
+			last = insert.length - 1;
+
+		for ( ; i <= last; i++ ) {
+			elems = i === last ? this : this.clone( true );
+			jQuery( insert[ i ] )[ original ]( elems );
+
+			// Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()
+			push.apply( ret, elems.get() );
+		}
+
+		return this.pushStack( ret );
+	};
+} );
+
+
+var iframe,
+	elemdisplay = {
+
+		// Support: Firefox
+		// We have to pre-define these values for FF (#10227)
+		HTML: "block",
+		BODY: "block"
+	};
+
+/**
+ * Retrieve the actual display of a element
+ * @param {String} name nodeName of the element
+ * @param {Object} doc Document object
+ */
+
+// Called only from within defaultDisplay
+function actualDisplay( name, doc ) {
+	var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
+
+		display = jQuery.css( elem[ 0 ], "display" );
+
+	// We don't have any data stored on the element,
+	// so use "detach" method as fast way to get rid of the element
+	elem.detach();
+
+	return display;
+}
+
+/**
+ * Try to determine the default display value of an element
+ * @param {String} nodeName
+ */
+function defaultDisplay( nodeName ) {
+	var doc = document,
+		display = elemdisplay[ nodeName ];
+
+	if ( !display ) {
+		display = actualDisplay( nodeName, doc );
+
+		// If the simple way fails, read from inside an iframe
+		if ( display === "none" || !display ) {
+
+			// Use the already-created iframe if possible
+			iframe = ( iframe || jQuery( "<iframe frameborder='0' width='0' height='0'/>" ) )
+				.appendTo( doc.documentElement );
+
+			// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
+			doc = ( iframe[ 0 ].contentWindow || iframe[ 0 ].contentDocument ).document;
+
+			// Support: IE
+			doc.write();
+			doc.close();
+
+			display = actualDisplay( nodeName, doc );
+			iframe.detach();
+		}
+
+		// Store the correct default display
+		elemdisplay[ nodeName ] = display;
+	}
+
+	return display;
+}
+var rmargin = ( /^margin/ );
+
+var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
+
+var swap = function( elem, options, callback, args ) {
+	var ret, name,
+		old = {};
+
+	// Remember the old values, and insert the new ones
+	for ( name in options ) {
+		old[ name ] = elem.style[ name ];
+		elem.style[ name ] = options[ name ];
+	}
+
+	ret = callback.apply( elem, args || [] );
+
+	// Revert the old values
+	for ( name in options ) {
+		elem.style[ name ] = old[ name ];
+	}
+
+	return ret;
+};
+
+
+var documentElement = document.documentElement;
+
+
+
+( function() {
+	var pixelPositionVal, pixelMarginRightVal, boxSizingReliableVal,
+		reliableHiddenOffsetsVal, reliableMarginRightVal, reliableMarginLeftVal,
+		container = document.createElement( "div" ),
+		div = document.createElement( "div" );
+
+	// Finish early in limited (non-browser) environments
+	if ( !div.style ) {
+		return;
+	}
+
+	div.style.cssText = "float:left;opacity:.5";
+
+	// Support: IE<9
+	// Make sure that element opacity exists (as opposed to filter)
+	support.opacity = div.style.opacity === "0.5";
+
+	// Verify style float existence
+	// (IE uses styleFloat instead of cssFloat)
+	support.cssFloat = !!div.style.cssFloat;
+
+	div.style.backgroundClip = "content-box";
+	div.cloneNode( true ).style.backgroundClip = "";
+	support.clearCloneStyle = div.style.backgroundClip === "content-box";
+
+	container = document.createElement( "div" );
+	container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" +
+		"padding:0;margin-top:1px;position:absolute";
+	div.innerHTML = "";
+	container.appendChild( div );
+
+	// Support: Firefox<29, Android 2.3
+	// Vendor-prefix box-sizing
+	support.boxSizing = div.style.boxSizing === "" || div.style.MozBoxSizing === "" ||
+		div.style.WebkitBoxSizing === "";
+
+	jQuery.extend( support, {
+		reliableHiddenOffsets: function() {
+			if ( pixelPositionVal == null ) {
+				computeStyleTests();
+			}
+			return reliableHiddenOffsetsVal;
+		},
+
+		boxSizingReliable: function() {
+
+			// We're checking for pixelPositionVal here instead of boxSizingReliableVal
+			// since that compresses better and they're computed together anyway.
+			if ( pixelPositionVal == null ) {
+				computeStyleTests();
+			}
+			return boxSizingReliableVal;
+		},
+
+		pixelMarginRight: function() {
+
+			// Support: Android 4.0-4.3
+			if ( pixelPositionVal == null ) {
+				computeStyleTests();
+			}
+			return pixelMarginRightVal;
+		},
+
+		pixelPosition: function() {
+			if ( pixelPositionVal == null ) {
+				computeStyleTests();
+			}
+			return pixelPositionVal;
+		},
+
+		reliableMarginRight: function() {
+
+			// Support: Android 2.3
+			if ( pixelPositionVal == null ) {
+				computeStyleTests();
+			}
+			return reliableMarginRightVal;
+		},
+
+		reliableMarginLeft: function() {
+
+			// Support: IE <=8 only, Android 4.0 - 4.3 only, Firefox <=3 - 37
+			if ( pixelPositionVal == null ) {
+				computeStyleTests();
+			}
+			return reliableMarginLeftVal;
+		}
+	} );
+
+	function computeStyleTests() {
+		var contents, divStyle,
+			documentElement = document.documentElement;
+
+		// Setup
+		documentElement.appendChild( container );
+
+		div.style.cssText =
+
+			// Support: Android 2.3
+			// Vendor-prefix box-sizing
+			"-webkit-box-sizing:border-box;box-sizing:border-box;" +
+			"position:relative;display:block;" +
+			"margin:auto;border:1px;padding:1px;" +
+			"top:1%;width:50%";
+
+		// Support: IE<9
+		// Assume reasonable values in the absence of getComputedStyle
+		pixelPositionVal = boxSizingReliableVal = reliableMarginLeftVal = false;
+		pixelMarginRightVal = reliableMarginRightVal = true;
+
+		// Check for getComputedStyle so that this code is not run in IE<9.
+		if ( window.getComputedStyle ) {
+			divStyle = window.getComputedStyle( div );
+			pixelPositionVal = ( divStyle || {} ).top !== "1%";
+			reliableMarginLeftVal = ( divStyle || {} ).marginLeft === "2px";
+			boxSizingReliableVal = ( divStyle || { width: "4px" } ).width === "4px";
+
+			// Support: Android 4.0 - 4.3 only
+			// Some styles come back with percentage values, even though they shouldn't
+			div.style.marginRight = "50%";
+			pixelMarginRightVal = ( divStyle || { marginRight: "4px" } ).marginRight === "4px";
+
+			// Support: Android 2.3 only
+			// Div with explicit width and no margin-right incorrectly
+			// gets computed margin-right based on width of container (#3333)
+			// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+			contents = div.appendChild( document.createElement( "div" ) );
+
+			// Reset CSS: box-sizing; display; margin; border; padding
+			contents.style.cssText = div.style.cssText =
+
+				// Support: Android 2.3
+				// Vendor-prefix box-sizing
+				"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" +
+				"box-sizing:content-box;display:block;margin:0;border:0;padding:0";
+			contents.style.marginRight = contents.style.width = "0";
+			div.style.width = "1px";
+
+			reliableMarginRightVal =
+				!parseFloat( ( window.getComputedStyle( contents ) || {} ).marginRight );
+
+			div.removeChild( contents );
+		}
+
+		// Support: IE6-8
+		// First check that getClientRects works as expected
+		// Check if table cells still have offsetWidth/Height when they are set
+		// to display:none and there are still other visible table cells in a
+		// table row; if so, offsetWidth/Height are not reliable for use when
+		// determining if an element has been hidden directly using
+		// display:none (it is still safe to use offsets if a parent element is
+		// hidden; don safety goggles and see bug #4512 for more information).
+		div.style.display = "none";
+		reliableHiddenOffsetsVal = div.getClientRects().length === 0;
+		if ( reliableHiddenOffsetsVal ) {
+			div.style.display = "";
+			div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
+			div.childNodes[ 0 ].style.borderCollapse = "separate";
+			contents = div.getElementsByTagName( "td" );
+			contents[ 0 ].style.cssText = "margin:0;border:0;padding:0;display:none";
+			reliableHiddenOffsetsVal = contents[ 0 ].offsetHeight === 0;
+			if ( reliableHiddenOffsetsVal ) {
+				contents[ 0 ].style.display = "";
+				contents[ 1 ].style.display = "none";
+				reliableHiddenOffsetsVal = contents[ 0 ].offsetHeight === 0;
+			}
+		}
+
+		// Teardown
+		documentElement.removeChild( container );
+	}
+
+} )();
+
+
+var getStyles, curCSS,
+	rposition = /^(top|right|bottom|left)$/;
+
+if ( window.getComputedStyle ) {
+	getStyles = function( elem ) {
+
+		// Support: IE<=11+, Firefox<=30+ (#15098, #14150)
+		// IE throws on elements created in popups
+		// FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
+		var view = elem.ownerDocument.defaultView;
+
+		if ( !view || !view.opener ) {
+			view = window;
+		}
+
+		return view.getComputedStyle( elem );
+	};
+
+	curCSS = function( elem, name, computed ) {
+		var width, minWidth, maxWidth, ret,
+			style = elem.style;
+
+		computed = computed || getStyles( elem );
+
+		// getPropertyValue is only needed for .css('filter') in IE9, see #12537
+		ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined;
+
+		// Support: Opera 12.1x only
+		// Fall back to style even without computed
+		// computed is undefined for elems on document fragments
+		if ( ( ret === "" || ret === undefined ) && !jQuery.contains( elem.ownerDocument, elem ) ) {
+			ret = jQuery.style( elem, name );
+		}
+
+		if ( computed ) {
+
+			// A tribute to the "awesome hack by Dean Edwards"
+			// Chrome < 17 and Safari 5.0 uses "computed value"
+			// instead of "used value" for margin-right
+			// Safari 5.1.7 (at least) returns percentage for a larger set of values,
+			// but width seems to be reliably pixels
+			// this is against the CSSOM draft spec:
+			// http://dev.w3.org/csswg/cssom/#resolved-values
+			if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) {
+
+				// Remember the original values
+				width = style.width;
+				minWidth = style.minWidth;
+				maxWidth = style.maxWidth;
+
+				// Put in the new values to get a computed value out
+				style.minWidth = style.maxWidth = style.width = ret;
+				ret = computed.width;
+
+				// Revert the changed values
+				style.width = width;
+				style.minWidth = minWidth;
+				style.maxWidth = maxWidth;
+			}
+		}
+
+		// Support: IE
+		// IE returns zIndex value as an integer.
+		return ret === undefined ?
+			ret :
+			ret + "";
+	};
+} else if ( documentElement.currentStyle ) {
+	getStyles = function( elem ) {
+		return elem.currentStyle;
+	};
+
+	curCSS = function( elem, name, computed ) {
+		var left, rs, rsLeft, ret,
+			style = elem.style;
+
+		computed = computed || getStyles( elem );
+		ret = computed ? computed[ name ] : undefined;
+
+		// Avoid setting ret to empty string here
+		// so we don't default to auto
+		if ( ret == null && style && style[ name ] ) {
+			ret = style[ name ];
+		}
+
+		// From the awesome hack by Dean Edwards
+		// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
+
+		// If we're not dealing with a regular pixel number
+		// but a number that has a weird ending, we need to convert it to pixels
+		// but not position css attributes, as those are
+		// proportional to the parent element instead
+		// and we can't measure the parent instead because it
+		// might trigger a "stacking dolls" problem
+		if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
+
+			// Remember the original values
+			left = style.left;
+			rs = elem.runtimeStyle;
+			rsLeft = rs && rs.left;
+
+			// Put in the new values to get a computed value out
+			if ( rsLeft ) {
+				rs.left = elem.currentStyle.left;
+			}
+			style.left = name === "fontSize" ? "1em" : ret;
+			ret = style.pixelLeft + "px";
+
+			// Revert the changed values
+			style.left = left;
+			if ( rsLeft ) {
+				rs.left = rsLeft;
+			}
+		}
+
+		// Support: IE
+		// IE returns zIndex value as an integer.
+		return ret === undefined ?
+			ret :
+			ret + "" || "auto";
+	};
+}
+
+
+
+
+function addGetHookIf( conditionFn, hookFn ) {
+
+	// Define the hook, we'll check on the first run if it's really needed.
+	return {
+		get: function() {
+			if ( conditionFn() ) {
+
+				// Hook not needed (or it's not possible to use it due
+				// to missing dependency), remove it.
+				delete this.get;
+				return;
+			}
+
+			// Hook needed; redefine it so that the support test is not executed again.
+			return ( this.get = hookFn ).apply( this, arguments );
+		}
+	};
+}
+
+
+var
+
+		ralpha = /alpha\([^)]*\)/i,
+	ropacity = /opacity\s*=\s*([^)]*)/i,
+
+	// swappable if display is none or starts with table except
+	// "table", "table-cell", or "table-caption"
+	// see here for display values:
+	// https://developer.mozilla.org/en-US/docs/CSS/display
+	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
+	rnumsplit = new RegExp( "^(" + pnum + ")(.*)$", "i" ),
+
+	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+	cssNormalTransform = {
+		letterSpacing: "0",
+		fontWeight: "400"
+	},
+
+	cssPrefixes = [ "Webkit", "O", "Moz", "ms" ],
+	emptyStyle = document.createElement( "div" ).style;
+
+
+// return a css property mapped to a potentially vendor prefixed property
+function vendorPropName( name ) {
+
+	// shortcut for names that are not vendor prefixed
+	if ( name in emptyStyle ) {
+		return name;
+	}
+
+	// check for vendor prefixed names
+	var capName = name.charAt( 0 ).toUpperCase() + name.slice( 1 ),
+		i = cssPrefixes.length;
+
+	while ( i-- ) {
+		name = cssPrefixes[ i ] + capName;
+		if ( name in emptyStyle ) {
+			return name;
+		}
+	}
+}
+
+function showHide( elements, show ) {
+	var display, elem, hidden,
+		values = [],
+		index = 0,
+		length = elements.length;
+
+	for ( ; index < length; index++ ) {
+		elem = elements[ index ];
+		if ( !elem.style ) {
+			continue;
+		}
+
+		values[ index ] = jQuery._data( elem, "olddisplay" );
+		display = elem.style.display;
+		if ( show ) {
+
+			// Reset the inline display of this element to learn if it is
+			// being hidden by cascaded rules or not
+			if ( !values[ index ] && display === "none" ) {
+				elem.style.display = "";
+			}
+
+			// Set elements which have been overridden with display: none
+			// in a stylesheet to whatever the default browser style is
+			// for such an element
+			if ( elem.style.display === "" && isHidden( elem ) ) {
+				values[ index ] =
+					jQuery._data( elem, "olddisplay", defaultDisplay( elem.nodeName ) );
+			}
+		} else {
+			hidden = isHidden( elem );
+
+			if ( display && display !== "none" || !hidden ) {
+				jQuery._data(
+					elem,
+					"olddisplay",
+					hidden ? display : jQuery.css( elem, "display" )
+				);
+			}
+		}
+	}
+
+	// Set the display of most of the elements in a second loop
+	// to avoid the constant reflow
+	for ( index = 0; index < length; index++ ) {
+		elem = elements[ index ];
+		if ( !elem.style ) {
+			continue;
+		}
+		if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
+			elem.style.display = show ? values[ index ] || "" : "none";
+		}
+	}
+
+	return elements;
+}
+
+function setPositiveNumber( elem, value, subtract ) {
+	var matches = rnumsplit.exec( value );
+	return matches ?
+
+		// Guard against undefined "subtract", e.g., when used as in cssHooks
+		Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
+		value;
+}
+
+function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
+	var i = extra === ( isBorderBox ? "border" : "content" ) ?
+
+		// If we already have the right measurement, avoid augmentation
+		4 :
+
+		// Otherwise initialize for horizontal or vertical properties
+		name === "width" ? 1 : 0,
+
+		val = 0;
+
+	for ( ; i < 4; i += 2 ) {
+
+		// both box models exclude margin, so add it if we want it
+		if ( extra === "margin" ) {
+			val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
+		}
+
+		if ( isBorderBox ) {
+
+			// border-box includes padding, so remove it if we want content
+			if ( extra === "content" ) {
+				val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+			}
+
+			// at this point, extra isn't border nor margin, so remove border
+			if ( extra !== "margin" ) {
+				val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+			}
+		} else {
+
+			// at this point, extra isn't content, so add padding
+			val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+
+			// at this point, extra isn't content nor padding, so add border
+			if ( extra !== "padding" ) {
+				val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+			}
+		}
+	}
+
+	return val;
+}
+
+function getWidthOrHeight( elem, name, extra ) {
+
+	// Start with offset property, which is equivalent to the border-box value
+	var valueIsBorderBox = true,
+		val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+		styles = getStyles( elem ),
+		isBorderBox = support.boxSizing &&
+			jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
+
+	// some non-html elements return undefined for offsetWidth, so check for null/undefined
+	// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
+	// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
+	if ( val <= 0 || val == null ) {
+
+		// Fall back to computed then uncomputed css if necessary
+		val = curCSS( elem, name, styles );
+		if ( val < 0 || val == null ) {
+			val = elem.style[ name ];
+		}
+
+		// Computed unit is not pixels. Stop here and return.
+		if ( rnumnonpx.test( val ) ) {
+			return val;
+		}
+
+		// we need the check for style in case a browser which returns unreliable values
+		// for getComputedStyle silently falls back to the reliable elem.style
+		valueIsBorderBox = isBorderBox &&
+			( support.boxSizingReliable() || val === elem.style[ name ] );
+
+		// Normalize "", auto, and prepare for extra
+		val = parseFloat( val ) || 0;
+	}
+
+	// use the active box-sizing model to add/subtract irrelevant styles
+	return ( val +
+		augmentWidthOrHeight(
+			elem,
+			name,
+			extra || ( isBorderBox ? "border" : "content" ),
+			valueIsBorderBox,
+			styles
+		)
+	) + "px";
+}
+
+jQuery.extend( {
+
+	// Add in style property hooks for overriding the default
+	// behavior of getting and setting a style property
+	cssHooks: {
+		opacity: {
+			get: function( elem, computed ) {
+				if ( computed ) {
+
+					// We should always get a number back from opacity
+					var ret = curCSS( elem, "opacity" );
+					return ret === "" ? "1" : ret;
+				}
+			}
+		}
+	},
+
+	// Don't automatically add "px" to these possibly-unitless properties
+	cssNumber: {
+		"animationIterationCount": true,
+		"columnCount": true,
+		"fillOpacity": true,
+		"flexGrow": true,
+		"flexShrink": true,
+		"fontWeight": true,
+		"lineHeight": true,
+		"opacity": true,
+		"order": true,
+		"orphans": true,
+		"widows": true,
+		"zIndex": true,
+		"zoom": true
+	},
+
+	// Add in properties whose names you wish to fix before
+	// setting or getting the value
+	cssProps: {
+
+		// normalize float css property
+		"float": support.cssFloat ? "cssFloat" : "styleFloat"
+	},
+
+	// Get and set the style property on a DOM Node
+	style: function( elem, name, value, extra ) {
+
+		// Don't set styles on text and comment nodes
+		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+			return;
+		}
+
+		// Make sure that we're working with the right name
+		var ret, type, hooks,
+			origName = jQuery.camelCase( name ),
+			style = elem.style;
+
+		name = jQuery.cssProps[ origName ] ||
+			( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );
+
+		// gets hook for the prefixed version
+		// followed by the unprefixed version
+		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+		// Check if we're setting a value
+		if ( value !== undefined ) {
+			type = typeof value;
+
+			// Convert "+=" or "-=" to relative numbers (#7345)
+			if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
+				value = adjustCSS( elem, name, ret );
+
+				// Fixes bug #9237
+				type = "number";
+			}
+
+			// Make sure that null and NaN values aren't set. See: #7116
+			if ( value == null || value !== value ) {
+				return;
+			}
+
+			// If a number was passed in, add the unit (except for certain CSS properties)
+			if ( type === "number" ) {
+				value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
+			}
+
+			// Fixes #8908, it can be done more correctly by specifing setters in cssHooks,
+			// but it would mean to define eight
+			// (for every problematic property) identical functions
+			if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
+				style[ name ] = "inherit";
+			}
+
+			// If a hook was provided, use that value, otherwise just set the specified value
+			if ( !hooks || !( "set" in hooks ) ||
+				( value = hooks.set( elem, value, extra ) ) !== undefined ) {
+
+				// Support: IE
+				// Swallow errors from 'invalid' CSS values (#5509)
+				try {
+					style[ name ] = value;
+				} catch ( e ) {}
+			}
+
+		} else {
+
+			// If a hook was provided get the non-computed value from there
+			if ( hooks && "get" in hooks &&
+				( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
+
+				return ret;
+			}
+
+			// Otherwise just get the value from the style object
+			return style[ name ];
+		}
+	},
+
+	css: function( elem, name, extra, styles ) {
+		var num, val, hooks,
+			origName = jQuery.camelCase( name );
+
+		// Make sure that we're working with the right name
+		name = jQuery.cssProps[ origName ] ||
+			( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );
+
+		// gets hook for the prefixed version
+		// followed by the unprefixed version
+		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+		// If a hook was provided get the computed value from there
+		if ( hooks && "get" in hooks ) {
+			val = hooks.get( elem, true, extra );
+		}
+
+		// Otherwise, if a way to get the computed value exists, use that
+		if ( val === undefined ) {
+			val = curCSS( elem, name, styles );
+		}
+
+		//convert "normal" to computed value
+		if ( val === "normal" && name in cssNormalTransform ) {
+			val = cssNormalTransform[ name ];
+		}
+
+		// Return, converting to number if forced or a qualifier was provided and val looks numeric
+		if ( extra === "" || extra ) {
+			num = parseFloat( val );
+			return extra === true || isFinite( num ) ? num || 0 : val;
+		}
+		return val;
+	}
+} );
+
+jQuery.each( [ "height", "width" ], function( i, name ) {
+	jQuery.cssHooks[ name ] = {
+		get: function( elem, computed, extra ) {
+			if ( computed ) {
+
+				// certain elements can have dimension info if we invisibly show them
+				// however, it must have a current display style that would benefit from this
+				return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
+					elem.offsetWidth === 0 ?
+						swap( elem, cssShow, function() {
+							return getWidthOrHeight( elem, name, extra );
+						} ) :
+						getWidthOrHeight( elem, name, extra );
+			}
+		},
+
+		set: function( elem, value, extra ) {
+			var styles = extra && getStyles( elem );
+			return setPositiveNumber( elem, value, extra ?
+				augmentWidthOrHeight(
+					elem,
+					name,
+					extra,
+					support.boxSizing &&
+						jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
+					styles
+				) : 0
+			);
+		}
+	};
+} );
+
+if ( !support.opacity ) {
+	jQuery.cssHooks.opacity = {
+		get: function( elem, computed ) {
+
+			// IE uses filters for opacity
+			return ropacity.test( ( computed && elem.currentStyle ?
+				elem.currentStyle.filter :
+				elem.style.filter ) || "" ) ?
+					( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
+					computed ? "1" : "";
+		},
+
+		set: function( elem, value ) {
+			var style = elem.style,
+				currentStyle = elem.currentStyle,
+				opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
+				filter = currentStyle && currentStyle.filter || style.filter || "";
+
+			// IE has trouble with opacity if it does not have layout
+			// Force it by setting the zoom level
+			style.zoom = 1;
+
+			// if setting opacity to 1, and no other filters exist -
+			// attempt to remove filter attribute #6652
+			// if value === "", then remove inline opacity #12685
+			if ( ( value >= 1 || value === "" ) &&
+					jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
+					style.removeAttribute ) {
+
+				// Setting style.filter to null, "" & " " still leave "filter:" in the cssText
+				// if "filter:" is present at all, clearType is disabled, we want to avoid this
+				// style.removeAttribute is IE Only, but so apparently is this code path...
+				style.removeAttribute( "filter" );
+
+				// if there is no filter style applied in a css rule
+				// or unset inline opacity, we are done
+				if ( value === "" || currentStyle && !currentStyle.filter ) {
+					return;
+				}
+			}
+
+			// otherwise, set new filter values
+			style.filter = ralpha.test( filter ) ?
+				filter.replace( ralpha, opacity ) :
+				filter + " " + opacity;
+		}
+	};
+}
+
+jQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,
+	function( elem, computed ) {
+		if ( computed ) {
+			return swap( elem, { "display": "inline-block" },
+				curCSS, [ elem, "marginRight" ] );
+		}
+	}
+);
+
+jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
+	function( elem, computed ) {
+		if ( computed ) {
+			return (
+				parseFloat( curCSS( elem, "marginLeft" ) ) ||
+
+				// Support: IE<=11+
+				// Running getBoundingClientRect on a disconnected node in IE throws an error
+				// Support: IE8 only
+				// getClientRects() errors on disconnected elems
+				( jQuery.contains( elem.ownerDocument, elem ) ?
+					elem.getBoundingClientRect().left -
+						swap( elem, { marginLeft: 0 }, function() {
+							return elem.getBoundingClientRect().left;
+						} ) :
+					0
+				)
+			) + "px";
+		}
+	}
+);
+
+// These hooks are used by animate to expand properties
+jQuery.each( {
+	margin: "",
+	padding: "",
+	border: "Width"
+}, function( prefix, suffix ) {
+	jQuery.cssHooks[ prefix + suffix ] = {
+		expand: function( value ) {
+			var i = 0,
+				expanded = {},
+
+				// assumes a single number if not a string
+				parts = typeof value === "string" ? value.split( " " ) : [ value ];
+
+			for ( ; i < 4; i++ ) {
+				expanded[ prefix + cssExpand[ i ] + suffix ] =
+					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
+			}
+
+			return expanded;
+		}
+	};
+
+	if ( !rmargin.test( prefix ) ) {
+		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
+	}
+} );
+
+jQuery.fn.extend( {
+	css: function( name, value ) {
+		return access( this, function( elem, name, value ) {
+			var styles, len,
+				map = {},
+				i = 0;
+
+			if ( jQuery.isArray( name ) ) {
+				styles = getStyles( elem );
+				len = name.length;
+
+				for ( ; i < len; i++ ) {
+					map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
+				}
+
+				return map;
+			}
+
+			return value !== undefined ?
+				jQuery.style( elem, name, value ) :
+				jQuery.css( elem, name );
+		}, name, value, arguments.length > 1 );
+	},
+	show: function() {
+		return showHide( this, true );
+	},
+	hide: function() {
+		return showHide( this );
+	},
+	toggle: function( state ) {
+		if ( typeof state === "boolean" ) {
+			return state ? this.show() : this.hide();
+		}
+
+		return this.each( function() {
+			if ( isHidden( this ) ) {
+				jQuery( this ).show();
+			} else {
+				jQuery( this ).hide();
+			}
+		} );
+	}
+} );
+
+
+function Tween( elem, options, prop, end, easing ) {
+	return new Tween.prototype.init( elem, options, prop, end, easing );
+}
+jQuery.Tween = Tween;
+
+Tween.prototype = {
+	constructor: Tween,
+	init: function( elem, options, prop, end, easing, unit ) {
+		this.elem = elem;
+		this.prop = prop;
+		this.easing = easing || jQuery.easing._default;
+		this.options = options;
+		this.start = this.now = this.cur();
+		this.end = end;
+		this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+	},
+	cur: function() {
+		var hooks = Tween.propHooks[ this.prop ];
+
+		return hooks && hooks.get ?
+			hooks.get( this ) :
+			Tween.propHooks._default.get( this );
+	},
+	run: function( percent ) {
+		var eased,
+			hooks = Tween.propHooks[ this.prop ];
+
+		if ( this.options.duration ) {
+			this.pos = eased = jQuery.easing[ this.easing ](
+				percent, this.options.duration * percent, 0, 1, this.options.duration
+			);
+		} else {
+			this.pos = eased = percent;
+		}
+		this.now = ( this.end - this.start ) * eased + this.start;
+
+		if ( this.options.step ) {
+			this.options.step.call( this.elem, this.now, this );
+		}
+
+		if ( hooks && hooks.set ) {
+			hooks.set( this );
+		} else {
+			Tween.propHooks._default.set( this );
+		}
+		return this;
+	}
+};
+
+Tween.prototype.init.prototype = Tween.prototype;
+
+Tween.propHooks = {
+	_default: {
+		get: function( tween ) {
+			var result;
+
+			// Use a property on the element directly when it is not a DOM element,
+			// or when there is no matching style property that exists.
+			if ( tween.elem.nodeType !== 1 ||
+				tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {
+				return tween.elem[ tween.prop ];
+			}
+
+			// passing an empty string as a 3rd parameter to .css will automatically
+			// attempt a parseFloat and fallback to a string if the parse fails
+			// so, simple values such as "10px" are parsed to Float.
+			// complex values such as "rotate(1rad)" are returned as is.
+			result = jQuery.css( tween.elem, tween.prop, "" );
+
+			// Empty strings, null, undefined and "auto" are converted to 0.
+			return !result || result === "auto" ? 0 : result;
+		},
+		set: function( tween ) {
+
+			// use step hook for back compat - use cssHook if its there - use .style if its
+			// available and use plain properties where available
+			if ( jQuery.fx.step[ tween.prop ] ) {
+				jQuery.fx.step[ tween.prop ]( tween );
+			} else if ( tween.elem.nodeType === 1 &&
+				( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null ||
+					jQuery.cssHooks[ tween.prop ] ) ) {
+				jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
+			} else {
+				tween.elem[ tween.prop ] = tween.now;
+			}
+		}
+	}
+};
+
+// Support: IE <=9
+// Panic based approach to setting things on disconnected nodes
+
+Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
+	set: function( tween ) {
+		if ( tween.elem.nodeType && tween.elem.parentNode ) {
+			tween.elem[ tween.prop ] = tween.now;
+		}
+	}
+};
+
+jQuery.easing = {
+	linear: function( p ) {
+		return p;
+	},
+	swing: function( p ) {
+		return 0.5 - Math.cos( p * Math.PI ) / 2;
+	},
+	_default: "swing"
+};
+
+jQuery.fx = Tween.prototype.init;
+
+// Back Compat <1.8 extension point
+jQuery.fx.step = {};
+
+
+
+
+var
+	fxNow, timerId,
+	rfxtypes = /^(?:toggle|show|hide)$/,
+	rrun = /queueHooks$/;
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+	window.setTimeout( function() {
+		fxNow = undefined;
+	} );
+	return ( fxNow = jQuery.now() );
+}
+
+// Generate parameters to create a standard animation
+function genFx( type, includeWidth ) {
+	var which,
+		attrs = { height: type },
+		i = 0;
+
+	// if we include width, step value is 1 to do all cssExpand values,
+	// if we don't include width, step value is 2 to skip over Left and Right
+	includeWidth = includeWidth ? 1 : 0;
+	for ( ; i < 4 ; i += 2 - includeWidth ) {
+		which = cssExpand[ i ];
+		attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
+	}
+
+	if ( includeWidth ) {
+		attrs.opacity = attrs.width = type;
+	}
+
+	return attrs;
+}
+
+function createTween( value, prop, animation ) {
+	var tween,
+		collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),
+		index = 0,
+		length = collection.length;
+	for ( ; index < length; index++ ) {
+		if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {
+
+			// we're done with this property
+			return tween;
+		}
+	}
+}
+
+function defaultPrefilter( elem, props, opts ) {
+	/* jshint validthis: true */
+	var prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,
+		anim = this,
+		orig = {},
+		style = elem.style,
+		hidden = elem.nodeType && isHidden( elem ),
+		dataShow = jQuery._data( elem, "fxshow" );
+
+	// handle queue: false promises
+	if ( !opts.queue ) {
+		hooks = jQuery._queueHooks( elem, "fx" );
+		if ( hooks.unqueued == null ) {
+			hooks.unqueued = 0;
+			oldfire = hooks.empty.fire;
+			hooks.empty.fire = function() {
+				if ( !hooks.unqueued ) {
+					oldfire();
+				}
+			};
+		}
+		hooks.unqueued++;
+
+		anim.always( function() {
+
+			// doing this makes sure that the complete handler will be called
+			// before this completes
+			anim.always( function() {
+				hooks.unqueued--;
+				if ( !jQuery.queue( elem, "fx" ).length ) {
+					hooks.empty.fire();
+				}
+			} );
+		} );
+	}
+
+	// height/width overflow pass
+	if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
+
+		// Make sure that nothing sneaks out
+		// Record all 3 overflow attributes because IE does not
+		// change the overflow attribute when overflowX and
+		// overflowY are set to the same value
+		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
+
+		// Set display property to inline-block for height/width
+		// animations on inline elements that are having width/height animated
+		display = jQuery.css( elem, "display" );
+
+		// Test default display if display is currently "none"
+		checkDisplay = display === "none" ?
+			jQuery._data( elem, "olddisplay" ) || defaultDisplay( elem.nodeName ) : display;
+
+		if ( checkDisplay === "inline" && jQuery.css( elem, "float" ) === "none" ) {
+
+			// inline-level elements accept inline-block;
+			// block-level elements need to be inline with layout
+			if ( !support.inlineBlockNeedsLayout || defaultDisplay( elem.nodeName ) === "inline" ) {
+				style.display = "inline-block";
+			} else {
+				style.zoom = 1;
+			}
+		}
+	}
+
+	if ( opts.overflow ) {
+		style.overflow = "hidden";
+		if ( !support.shrinkWrapBlocks() ) {
+			anim.always( function() {
+				style.overflow = opts.overflow[ 0 ];
+				style.overflowX = opts.overflow[ 1 ];
+				style.overflowY = opts.overflow[ 2 ];
+			} );
+		}
+	}
+
+	// show/hide pass
+	for ( prop in props ) {
+		value = props[ prop ];
+		if ( rfxtypes.exec( value ) ) {
+			delete props[ prop ];
+			toggle = toggle || value === "toggle";
+			if ( value === ( hidden ? "hide" : "show" ) ) {
+
+				// If there is dataShow left over from a stopped hide or show
+				// and we are going to proceed with show, we should pretend to be hidden
+				if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
+					hidden = true;
+				} else {
+					continue;
+				}
+			}
+			orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
+
+		// Any non-fx value stops us from restoring the original display value
+		} else {
+			display = undefined;
+		}
+	}
+
+	if ( !jQuery.isEmptyObject( orig ) ) {
+		if ( dataShow ) {
+			if ( "hidden" in dataShow ) {
+				hidden = dataShow.hidden;
+			}
+		} else {
+			dataShow = jQuery._data( elem, "fxshow", {} );
+		}
+
+		// store state if its toggle - enables .stop().toggle() to "reverse"
+		if ( toggle ) {
+			dataShow.hidden = !hidden;
+		}
+		if ( hidden ) {
+			jQuery( elem ).show();
+		} else {
+			anim.done( function() {
+				jQuery( elem ).hide();
+			} );
+		}
+		anim.done( function() {
+			var prop;
+			jQuery._removeData( elem, "fxshow" );
+			for ( prop in orig ) {
+				jQuery.style( elem, prop, orig[ prop ] );
+			}
+		} );
+		for ( prop in orig ) {
+			tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
+
+			if ( !( prop in dataShow ) ) {
+				dataShow[ prop ] = tween.start;
+				if ( hidden ) {
+					tween.end = tween.start;
+					tween.start = prop === "width" || prop === "height" ? 1 : 0;
+				}
+			}
+		}
+
+	// If this is a noop like .hide().hide(), restore an overwritten display value
+	} else if ( ( display === "none" ? defaultDisplay( elem.nodeName ) : display ) === "inline" ) {
+		style.display = display;
+	}
+}
+
+function propFilter( props, specialEasing ) {
+	var index, name, easing, value, hooks;
+
+	// camelCase, specialEasing and expand cssHook pass
+	for ( index in props ) {
+		name = jQuery.camelCase( index );
+		easing = specialEasing[ name ];
+		value = props[ index ];
+		if ( jQuery.isArray( value ) ) {
+			easing = value[ 1 ];
+			value = props[ index ] = value[ 0 ];
+		}
+
+		if ( index !== name ) {
+			props[ name ] = value;
+			delete props[ index ];
+		}
+
+		hooks = jQuery.cssHooks[ name ];
+		if ( hooks && "expand" in hooks ) {
+			value = hooks.expand( value );
+			delete props[ name ];
+
+			// not quite $.extend, this wont overwrite keys already present.
+			// also - reusing 'index' from above because we have the correct "name"
+			for ( index in value ) {
+				if ( !( index in props ) ) {
+					props[ index ] = value[ index ];
+					specialEasing[ index ] = easing;
+				}
+			}
+		} else {
+			specialEasing[ name ] = easing;
+		}
+	}
+}
+
+function Animation( elem, properties, options ) {
+	var result,
+		stopped,
+		index = 0,
+		length = Animation.prefilters.length,
+		deferred = jQuery.Deferred().always( function() {
+
+			// don't match elem in the :animated selector
+			delete tick.elem;
+		} ),
+		tick = function() {
+			if ( stopped ) {
+				return false;
+			}
+			var currentTime = fxNow || createFxNow(),
+				remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
+
+				// Support: Android 2.3
+				// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
+				temp = remaining / animation.duration || 0,
+				percent = 1 - temp,
+				index = 0,
+				length = animation.tweens.length;
+
+			for ( ; index < length ; index++ ) {
+				animation.tweens[ index ].run( percent );
+			}
+
+			deferred.notifyWith( elem, [ animation, percent, remaining ] );
+
+			if ( percent < 1 && length ) {
+				return remaining;
+			} else {
+				deferred.resolveWith( elem, [ animation ] );
+				return false;
+			}
+		},
+		animation = deferred.promise( {
+			elem: elem,
+			props: jQuery.extend( {}, properties ),
+			opts: jQuery.extend( true, {
+				specialEasing: {},
+				easing: jQuery.easing._default
+			}, options ),
+			originalProperties: properties,
+			originalOptions: options,
+			startTime: fxNow || createFxNow(),
+			duration: options.duration,
+			tweens: [],
+			createTween: function( prop, end ) {
+				var tween = jQuery.Tween( elem, animation.opts, prop, end,
+						animation.opts.specialEasing[ prop ] || animation.opts.easing );
+				animation.tweens.push( tween );
+				return tween;
+			},
+			stop: function( gotoEnd ) {
+				var index = 0,
+
+					// if we are going to the end, we want to run all the tweens
+					// otherwise we skip this part
+					length = gotoEnd ? animation.tweens.length : 0;
+				if ( stopped ) {
+					return this;
+				}
+				stopped = true;
+				for ( ; index < length ; index++ ) {
+					animation.tweens[ index ].run( 1 );
+				}
+
+				// resolve when we played the last frame
+				// otherwise, reject
+				if ( gotoEnd ) {
+					deferred.notifyWith( elem, [ animation, 1, 0 ] );
+					deferred.resolveWith( elem, [ animation, gotoEnd ] );
+				} else {
+					deferred.rejectWith( elem, [ animation, gotoEnd ] );
+				}
+				return this;
+			}
+		} ),
+		props = animation.props;
+
+	propFilter( props, animation.opts.specialEasing );
+
+	for ( ; index < length ; index++ ) {
+		result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
+		if ( result ) {
+			if ( jQuery.isFunction( result.stop ) ) {
+				jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
+					jQuery.proxy( result.stop, result );
+			}
+			return result;
+		}
+	}
+
+	jQuery.map( props, createTween, animation );
+
+	if ( jQuery.isFunction( animation.opts.start ) ) {
+		animation.opts.start.call( elem, animation );
+	}
+
+	jQuery.fx.timer(
+		jQuery.extend( tick, {
+			elem: elem,
+			anim: animation,
+			queue: animation.opts.queue
+		} )
+	);
+
+	// attach callbacks from options
+	return animation.progress( animation.opts.progress )
+		.done( animation.opts.done, animation.opts.complete )
+		.fail( animation.opts.fail )
+		.always( animation.opts.always );
+}
+
+jQuery.Animation = jQuery.extend( Animation, {
+
+	tweeners: {
+		"*": [ function( prop, value ) {
+			var tween = this.createTween( prop, value );
+			adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
+			return tween;
+		} ]
+	},
+
+	tweener: function( props, callback ) {
+		if ( jQuery.isFunction( props ) ) {
+			callback = props;
+			props = [ "*" ];
+		} else {
+			props = props.match( rnotwhite );
+		}
+
+		var prop,
+			index = 0,
+			length = props.length;
+
+		for ( ; index < length ; index++ ) {
+			prop = props[ index ];
+			Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
+			Animation.tweeners[ prop ].unshift( callback );
+		}
+	},
+
+	prefilters: [ defaultPrefilter ],
+
+	prefilter: function( callback, prepend ) {
+		if ( prepend ) {
+			Animation.prefilters.unshift( callback );
+		} else {
+			Animation.prefilters.push( callback );
+		}
+	}
+} );
+
+jQuery.speed = function( speed, easing, fn ) {
+	var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
+		complete: fn || !fn && easing ||
+			jQuery.isFunction( speed ) && speed,
+		duration: speed,
+		easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
+	};
+
+	opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+		opt.duration in jQuery.fx.speeds ?
+			jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
+
+	// normalize opt.queue - true/undefined/null -> "fx"
+	if ( opt.queue == null || opt.queue === true ) {
+		opt.queue = "fx";
+	}
+
+	// Queueing
+	opt.old = opt.complete;
+
+	opt.complete = function() {
+		if ( jQuery.isFunction( opt.old ) ) {
+			opt.old.call( this );
+		}
+
+		if ( opt.queue ) {
+			jQuery.dequeue( this, opt.queue );
+		}
+	};
+
+	return opt;
+};
+
+jQuery.fn.extend( {
+	fadeTo: function( speed, to, easing, callback ) {
+
+		// show any hidden elements after setting opacity to 0
+		return this.filter( isHidden ).css( "opacity", 0 ).show()
+
+			// animate to the value specified
+			.end().animate( { opacity: to }, speed, easing, callback );
+	},
+	animate: function( prop, speed, easing, callback ) {
+		var empty = jQuery.isEmptyObject( prop ),
+			optall = jQuery.speed( speed, easing, callback ),
+			doAnimation = function() {
+
+				// Operate on a copy of prop so per-property easing won't be lost
+				var anim = Animation( this, jQuery.extend( {}, prop ), optall );
+
+				// Empty animations, or finishing resolves immediately
+				if ( empty || jQuery._data( this, "finish" ) ) {
+					anim.stop( true );
+				}
+			};
+			doAnimation.finish = doAnimation;
+
+		return empty || optall.queue === false ?
+			this.each( doAnimation ) :
+			this.queue( optall.queue, doAnimation );
+	},
+	stop: function( type, clearQueue, gotoEnd ) {
+		var stopQueue = function( hooks ) {
+			var stop = hooks.stop;
+			delete hooks.stop;
+			stop( gotoEnd );
+		};
+
+		if ( typeof type !== "string" ) {
+			gotoEnd = clearQueue;
+			clearQueue = type;
+			type = undefined;
+		}
+		if ( clearQueue && type !== false ) {
+			this.queue( type || "fx", [] );
+		}
+
+		return this.each( function() {
+			var dequeue = true,
+				index = type != null && type + "queueHooks",
+				timers = jQuery.timers,
+				data = jQuery._data( this );
+
+			if ( index ) {
+				if ( data[ index ] && data[ index ].stop ) {
+					stopQueue( data[ index ] );
+				}
+			} else {
+				for ( index in data ) {
+					if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
+						stopQueue( data[ index ] );
+					}
+				}
+			}
+
+			for ( index = timers.length; index--; ) {
+				if ( timers[ index ].elem === this &&
+					( type == null || timers[ index ].queue === type ) ) {
+
+					timers[ index ].anim.stop( gotoEnd );
+					dequeue = false;
+					timers.splice( index, 1 );
+				}
+			}
+
+			// start the next in the queue if the last step wasn't forced
+			// timers currently will call their complete callbacks, which will dequeue
+			// but only if they were gotoEnd
+			if ( dequeue || !gotoEnd ) {
+				jQuery.dequeue( this, type );
+			}
+		} );
+	},
+	finish: function( type ) {
+		if ( type !== false ) {
+			type = type || "fx";
+		}
+		return this.each( function() {
+			var index,
+				data = jQuery._data( this ),
+				queue = data[ type + "queue" ],
+				hooks = data[ type + "queueHooks" ],
+				timers = jQuery.timers,
+				length = queue ? queue.length : 0;
+
+			// enable finishing flag on private data
+			data.finish = true;
+
+			// empty the queue first
+			jQuery.queue( this, type, [] );
+
+			if ( hooks && hooks.stop ) {
+				hooks.stop.call( this, true );
+			}
+
+			// look for any active animations, and finish them
+			for ( index = timers.length; index--; ) {
+				if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
+					timers[ index ].anim.stop( true );
+					timers.splice( index, 1 );
+				}
+			}
+
+			// look for any animations in the old queue and finish them
+			for ( index = 0; index < length; index++ ) {
+				if ( queue[ index ] && queue[ index ].finish ) {
+					queue[ index ].finish.call( this );
+				}
+			}
+
+			// turn off finishing flag
+			delete data.finish;
+		} );
+	}
+} );
+
+jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) {
+	var cssFn = jQuery.fn[ name ];
+	jQuery.fn[ name ] = function( speed, easing, callback ) {
+		return speed == null || typeof speed === "boolean" ?
+			cssFn.apply( this, arguments ) :
+			this.animate( genFx( name, true ), speed, easing, callback );
+	};
+} );
+
+// Generate shortcuts for custom animations
+jQuery.each( {
+	slideDown: genFx( "show" ),
+	slideUp: genFx( "hide" ),
+	slideToggle: genFx( "toggle" ),
+	fadeIn: { opacity: "show" },
+	fadeOut: { opacity: "hide" },
+	fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+	jQuery.fn[ name ] = function( speed, easing, callback ) {
+		return this.animate( props, speed, easing, callback );
+	};
+} );
+
+jQuery.timers = [];
+jQuery.fx.tick = function() {
+	var timer,
+		timers = jQuery.timers,
+		i = 0;
+
+	fxNow = jQuery.now();
+
+	for ( ; i < timers.length; i++ ) {
+		timer = timers[ i ];
+
+		// Checks the timer has not already been removed
+		if ( !timer() && timers[ i ] === timer ) {
+			timers.splice( i--, 1 );
+		}
+	}
+
+	if ( !timers.length ) {
+		jQuery.fx.stop();
+	}
+	fxNow = undefined;
+};
+
+jQuery.fx.timer = function( timer ) {
+	jQuery.timers.push( timer );
+	if ( timer() ) {
+		jQuery.fx.start();
+	} else {
+		jQuery.timers.pop();
+	}
+};
+
+jQuery.fx.interval = 13;
+
+jQuery.fx.start = function() {
+	if ( !timerId ) {
+		timerId = window.setInterval( jQuery.fx.tick, jQuery.fx.interval );
+	}
+};
+
+jQuery.fx.stop = function() {
+	window.clearInterval( timerId );
+	timerId = null;
+};
+
+jQuery.fx.speeds = {
+	slow: 600,
+	fast: 200,
+
+	// Default speed
+	_default: 400
+};
+
+
+// Based off of the plugin by Clint Helfers, with permission.
+// http://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
+jQuery.fn.delay = function( time, type ) {
+	time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+	type = type || "fx";
+
+	return this.queue( type, function( next, hooks ) {
+		var timeout = window.setTimeout( next, time );
+		hooks.stop = function() {
+			window.clearTimeout( timeout );
+		};
+	} );
+};
+
+
+( function() {
+	var a,
+		input = document.createElement( "input" ),
+		div = document.createElement( "div" ),
+		select = document.createElement( "select" ),
+		opt = select.appendChild( document.createElement( "option" ) );
+
+	// Setup
+	div = document.createElement( "div" );
+	div.setAttribute( "className", "t" );
+	div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
+	a = div.getElementsByTagName( "a" )[ 0 ];
+
+	// Support: Windows Web Apps (WWA)
+	// `type` must use .setAttribute for WWA (#14901)
+	input.setAttribute( "type", "checkbox" );
+	div.appendChild( input );
+
+	a = div.getElementsByTagName( "a" )[ 0 ];
+
+	// First batch of tests.
+	a.style.cssText = "top:1px";
+
+	// Test setAttribute on camelCase class.
+	// If it works, we need attrFixes when doing get/setAttribute (ie6/7)
+	support.getSetAttribute = div.className !== "t";
+
+	// Get the style information from getAttribute
+	// (IE uses .cssText instead)
+	support.style = /top/.test( a.getAttribute( "style" ) );
+
+	// Make sure that URLs aren't manipulated
+	// (IE normalizes it by default)
+	support.hrefNormalized = a.getAttribute( "href" ) === "/a";
+
+	// Check the default checkbox/radio value ("" on WebKit; "on" elsewhere)
+	support.checkOn = !!input.value;
+
+	// Make sure that a selected-by-default option has a working selected property.
+	// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
+	support.optSelected = opt.selected;
+
+	// Tests for enctype support on a form (#6743)
+	support.enctype = !!document.createElement( "form" ).enctype;
+
+	// Make sure that the options inside disabled selects aren't marked as disabled
+	// (WebKit marks them as disabled)
+	select.disabled = true;
+	support.optDisabled = !opt.disabled;
+
+	// Support: IE8 only
+	// Check if we can trust getAttribute("value")
+	input = document.createElement( "input" );
+	input.setAttribute( "value", "" );
+	support.input = input.getAttribute( "value" ) === "";
+
+	// Check if an input maintains its value after becoming a radio
+	input.value = "t";
+	input.setAttribute( "type", "radio" );
+	support.radioValue = input.value === "t";
+} )();
+
+
+var rreturn = /\r/g,
+	rspaces = /[\x20\t\r\n\f]+/g;
+
+jQuery.fn.extend( {
+	val: function( value ) {
+		var hooks, ret, isFunction,
+			elem = this[ 0 ];
+
+		if ( !arguments.length ) {
+			if ( elem ) {
+				hooks = jQuery.valHooks[ elem.type ] ||
+					jQuery.valHooks[ elem.nodeName.toLowerCase() ];
+
+				if (
+					hooks &&
+					"get" in hooks &&
+					( ret = hooks.get( elem, "value" ) ) !== undefined
+				) {
+					return ret;
+				}
+
+				ret = elem.value;
+
+				return typeof ret === "string" ?
+
+					// handle most common string cases
+					ret.replace( rreturn, "" ) :
+
+					// handle cases where value is null/undef or number
+					ret == null ? "" : ret;
+			}
+
+			return;
+		}
+
+		isFunction = jQuery.isFunction( value );
+
+		return this.each( function( i ) {
+			var val;
+
+			if ( this.nodeType !== 1 ) {
+				return;
+			}
+
+			if ( isFunction ) {
+				val = value.call( this, i, jQuery( this ).val() );
+			} else {
+				val = value;
+			}
+
+			// Treat null/undefined as ""; convert numbers to string
+			if ( val == null ) {
+				val = "";
+			} else if ( typeof val === "number" ) {
+				val += "";
+			} else if ( jQuery.isArray( val ) ) {
+				val = jQuery.map( val, function( value ) {
+					return value == null ? "" : value + "";
+				} );
+			}
+
+			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
+
+			// If set returns undefined, fall back to normal setting
+			if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
+				this.value = val;
+			}
+		} );
+	}
+} );
+
+jQuery.extend( {
+	valHooks: {
+		option: {
+			get: function( elem ) {
+				var val = jQuery.find.attr( elem, "value" );
+				return val != null ?
+					val :
+
+					// Support: IE10-11+
+					// option.text throws exceptions (#14686, #14858)
+					// Strip and collapse whitespace
+					// https://html.spec.whatwg.org/#strip-and-collapse-whitespace
+					jQuery.trim( jQuery.text( elem ) ).replace( rspaces, " " );
+			}
+		},
+		select: {
+			get: function( elem ) {
+				var value, option,
+					options = elem.options,
+					index = elem.selectedIndex,
+					one = elem.type === "select-one" || index < 0,
+					values = one ? null : [],
+					max = one ? index + 1 : options.length,
+					i = index < 0 ?
+						max :
+						one ? index : 0;
+
+				// Loop through all the selected options
+				for ( ; i < max; i++ ) {
+					option = options[ i ];
+
+					// oldIE doesn't update selected after form reset (#2551)
+					if ( ( option.selected || i === index ) &&
+
+							// Don't return options that are disabled or in a disabled optgroup
+							( support.optDisabled ?
+								!option.disabled :
+								option.getAttribute( "disabled" ) === null ) &&
+							( !option.parentNode.disabled ||
+								!jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
+
+						// Get the specific value for the option
+						value = jQuery( option ).val();
+
+						// We don't need an array for one selects
+						if ( one ) {
+							return value;
+						}
+
+						// Multi-Selects return an array
+						values.push( value );
+					}
+				}
+
+				return values;
+			},
+
+			set: function( elem, value ) {
+				var optionSet, option,
+					options = elem.options,
+					values = jQuery.makeArray( value ),
+					i = options.length;
+
+				while ( i-- ) {
+					option = options[ i ];
+
+					if ( jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 ) {
+
+						// Support: IE6
+						// When new option element is added to select box we need to
+						// force reflow of newly added node in order to workaround delay
+						// of initialization properties
+						try {
+							option.selected = optionSet = true;
+
+						} catch ( _ ) {
+
+							// Will be executed only in IE6
+							option.scrollHeight;
+						}
+
+					} else {
+						option.selected = false;
+					}
+				}
+
+				// Force browsers to behave consistently when non-matching value is set
+				if ( !optionSet ) {
+					elem.selectedIndex = -1;
+				}
+
+				return options;
+			}
+		}
+	}
+} );
+
+// Radios and checkboxes getter/setter
+jQuery.each( [ "radio", "checkbox" ], function() {
+	jQuery.valHooks[ this ] = {
+		set: function( elem, value ) {
+			if ( jQuery.isArray( value ) ) {
+				return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
+			}
+		}
+	};
+	if ( !support.checkOn ) {
+		jQuery.valHooks[ this ].get = function( elem ) {
+			return elem.getAttribute( "value" ) === null ? "on" : elem.value;
+		};
+	}
+} );
+
+
+
+
+var nodeHook, boolHook,
+	attrHandle = jQuery.expr.attrHandle,
+	ruseDefault = /^(?:checked|selected)$/i,
+	getSetAttribute = support.getSetAttribute,
+	getSetInput = support.input;
+
+jQuery.fn.extend( {
+	attr: function( name, value ) {
+		return access( this, jQuery.attr, name, value, arguments.length > 1 );
+	},
+
+	removeAttr: function( name ) {
+		return this.each( function() {
+			jQuery.removeAttr( this, name );
+		} );
+	}
+} );
+
+jQuery.extend( {
+	attr: function( elem, name, value ) {
+		var ret, hooks,
+			nType = elem.nodeType;
+
+		// Don't get/set attributes on text, comment and attribute nodes
+		if ( nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		// Fallback to prop when attributes are not supported
+		if ( typeof elem.getAttribute === "undefined" ) {
+			return jQuery.prop( elem, name, value );
+		}
+
+		// All attributes are lowercase
+		// Grab necessary hook if one is defined
+		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
+			name = name.toLowerCase();
+			hooks = jQuery.attrHooks[ name ] ||
+				( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );
+		}
+
+		if ( value !== undefined ) {
+			if ( value === null ) {
+				jQuery.removeAttr( elem, name );
+				return;
+			}
+
+			if ( hooks && "set" in hooks &&
+				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
+				return ret;
+			}
+
+			elem.setAttribute( name, value + "" );
+			return value;
+		}
+
+		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
+			return ret;
+		}
+
+		ret = jQuery.find.attr( elem, name );
+
+		// Non-existent attributes return null, we normalize to undefined
+		return ret == null ? undefined : ret;
+	},
+
+	attrHooks: {
+		type: {
+			set: function( elem, value ) {
+				if ( !support.radioValue && value === "radio" &&
+					jQuery.nodeName( elem, "input" ) ) {
+
+					// Setting the type on a radio button after the value resets the value in IE8-9
+					// Reset value to default in case type is set after value during creation
+					var val = elem.value;
+					elem.setAttribute( "type", value );
+					if ( val ) {
+						elem.value = val;
+					}
+					return value;
+				}
+			}
+		}
+	},
+
+	removeAttr: function( elem, value ) {
+		var name, propName,
+			i = 0,
+			attrNames = value && value.match( rnotwhite );
+
+		if ( attrNames && elem.nodeType === 1 ) {
+			while ( ( name = attrNames[ i++ ] ) ) {
+				propName = jQuery.propFix[ name ] || name;
+
+				// Boolean attributes get special treatment (#10870)
+				if ( jQuery.expr.match.bool.test( name ) ) {
+
+					// Set corresponding property to false
+					if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
+						elem[ propName ] = false;
+
+					// Support: IE<9
+					// Also clear defaultChecked/defaultSelected (if appropriate)
+					} else {
+						elem[ jQuery.camelCase( "default-" + name ) ] =
+							elem[ propName ] = false;
+					}
+
+				// See #9699 for explanation of this approach (setting first, then removal)
+				} else {
+					jQuery.attr( elem, name, "" );
+				}
+
+				elem.removeAttribute( getSetAttribute ? name : propName );
+			}
+		}
+	}
+} );
+
+// Hooks for boolean attributes
+boolHook = {
+	set: function( elem, value, name ) {
+		if ( value === false ) {
+
+			// Remove boolean attributes when set to false
+			jQuery.removeAttr( elem, name );
+		} else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
+
+			// IE<8 needs the *property* name
+			elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );
+
+		} else {
+
+			// Support: IE<9
+			// Use defaultChecked and defaultSelected for oldIE
+			elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true;
+		}
+		return name;
+	}
+};
+
+jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
+	var getter = attrHandle[ name ] || jQuery.find.attr;
+
+	if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
+		attrHandle[ name ] = function( elem, name, isXML ) {
+			var ret, handle;
+			if ( !isXML ) {
+
+				// Avoid an infinite loop by temporarily removing this function from the getter
+				handle = attrHandle[ name ];
+				attrHandle[ name ] = ret;
+				ret = getter( elem, name, isXML ) != null ?
+					name.toLowerCase() :
+					null;
+				attrHandle[ name ] = handle;
+			}
+			return ret;
+		};
+	} else {
+		attrHandle[ name ] = function( elem, name, isXML ) {
+			if ( !isXML ) {
+				return elem[ jQuery.camelCase( "default-" + name ) ] ?
+					name.toLowerCase() :
+					null;
+			}
+		};
+	}
+} );
+
+// fix oldIE attroperties
+if ( !getSetInput || !getSetAttribute ) {
+	jQuery.attrHooks.value = {
+		set: function( elem, value, name ) {
+			if ( jQuery.nodeName( elem, "input" ) ) {
+
+				// Does not return so that setAttribute is also used
+				elem.defaultValue = value;
+			} else {
+
+				// Use nodeHook if defined (#1954); otherwise setAttribute is fine
+				return nodeHook && nodeHook.set( elem, value, name );
+			}
+		}
+	};
+}
+
+// IE6/7 do not support getting/setting some attributes with get/setAttribute
+if ( !getSetAttribute ) {
+
+	// Use this for any attribute in IE6/7
+	// This fixes almost every IE6/7 issue
+	nodeHook = {
+		set: function( elem, value, name ) {
+
+			// Set the existing or create a new attribute node
+			var ret = elem.getAttributeNode( name );
+			if ( !ret ) {
+				elem.setAttributeNode(
+					( ret = elem.ownerDocument.createAttribute( name ) )
+				);
+			}
+
+			ret.value = value += "";
+
+			// Break association with cloned elements by also using setAttribute (#9646)
+			if ( name === "value" || value === elem.getAttribute( name ) ) {
+				return value;
+			}
+		}
+	};
+
+	// Some attributes are constructed with empty-string values when not defined
+	attrHandle.id = attrHandle.name = attrHandle.coords =
+		function( elem, name, isXML ) {
+			var ret;
+			if ( !isXML ) {
+				return ( ret = elem.getAttributeNode( name ) ) && ret.value !== "" ?
+					ret.value :
+					null;
+			}
+		};
+
+	// Fixing value retrieval on a button requires this module
+	jQuery.valHooks.button = {
+		get: function( elem, name ) {
+			var ret = elem.getAttributeNode( name );
+			if ( ret && ret.specified ) {
+				return ret.value;
+			}
+		},
+		set: nodeHook.set
+	};
+
+	// Set contenteditable to false on removals(#10429)
+	// Setting to empty string throws an error as an invalid value
+	jQuery.attrHooks.contenteditable = {
+		set: function( elem, value, name ) {
+			nodeHook.set( elem, value === "" ? false : value, name );
+		}
+	};
+
+	// Set width and height to auto instead of 0 on empty string( Bug #8150 )
+	// This is for removals
+	jQuery.each( [ "width", "height" ], function( i, name ) {
+		jQuery.attrHooks[ name ] = {
+			set: function( elem, value ) {
+				if ( value === "" ) {
+					elem.setAttribute( name, "auto" );
+					return value;
+				}
+			}
+		};
+	} );
+}
+
+if ( !support.style ) {
+	jQuery.attrHooks.style = {
+		get: function( elem ) {
+
+			// Return undefined in the case of empty string
+			// Note: IE uppercases css property names, but if we were to .toLowerCase()
+			// .cssText, that would destroy case sensitivity in URL's, like in "background"
+			return elem.style.cssText || undefined;
+		},
+		set: function( elem, value ) {
+			return ( elem.style.cssText = value + "" );
+		}
+	};
+}
+
+
+
+
+var rfocusable = /^(?:input|select|textarea|button|object)$/i,
+	rclickable = /^(?:a|area)$/i;
+
+jQuery.fn.extend( {
+	prop: function( name, value ) {
+		return access( this, jQuery.prop, name, value, arguments.length > 1 );
+	},
+
+	removeProp: function( name ) {
+		name = jQuery.propFix[ name ] || name;
+		return this.each( function() {
+
+			// try/catch handles cases where IE balks (such as removing a property on window)
+			try {
+				this[ name ] = undefined;
+				delete this[ name ];
+			} catch ( e ) {}
+		} );
+	}
+} );
+
+jQuery.extend( {
+	prop: function( elem, name, value ) {
+		var ret, hooks,
+			nType = elem.nodeType;
+
+		// Don't get/set properties on text, comment and attribute nodes
+		if ( nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
+
+			// Fix name and attach hooks
+			name = jQuery.propFix[ name ] || name;
+			hooks = jQuery.propHooks[ name ];
+		}
+
+		if ( value !== undefined ) {
+			if ( hooks && "set" in hooks &&
+				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
+				return ret;
+			}
+
+			return ( elem[ name ] = value );
+		}
+
+		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
+			return ret;
+		}
+
+		return elem[ name ];
+	},
+
+	propHooks: {
+		tabIndex: {
+			get: function( elem ) {
+
+				// elem.tabIndex doesn't always return the
+				// correct value when it hasn't been explicitly set
+				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+				// Use proper attribute retrieval(#12072)
+				var tabindex = jQuery.find.attr( elem, "tabindex" );
+
+				return tabindex ?
+					parseInt( tabindex, 10 ) :
+					rfocusable.test( elem.nodeName ) ||
+						rclickable.test( elem.nodeName ) && elem.href ?
+							0 :
+							-1;
+			}
+		}
+	},
+
+	propFix: {
+		"for": "htmlFor",
+		"class": "className"
+	}
+} );
+
+// Some attributes require a special call on IE
+// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !support.hrefNormalized ) {
+
+	// href/src property should get the full normalized URL (#10299/#12915)
+	jQuery.each( [ "href", "src" ], function( i, name ) {
+		jQuery.propHooks[ name ] = {
+			get: function( elem ) {
+				return elem.getAttribute( name, 4 );
+			}
+		};
+	} );
+}
+
+// Support: Safari, IE9+
+// Accessing the selectedIndex property
+// forces the browser to respect setting selected
+// on the option
+// The getter ensures a default option is selected
+// when in an optgroup
+if ( !support.optSelected ) {
+	jQuery.propHooks.selected = {
+		get: function( elem ) {
+			var parent = elem.parentNode;
+
+			if ( parent ) {
+				parent.selectedIndex;
+
+				// Make sure that it also works with optgroups, see #5701
+				if ( parent.parentNode ) {
+					parent.parentNode.selectedIndex;
+				}
+			}
+			return null;
+		},
+		set: function( elem ) {
+			var parent = elem.parentNode;
+			if ( parent ) {
+				parent.selectedIndex;
+
+				if ( parent.parentNode ) {
+					parent.parentNode.selectedIndex;
+				}
+			}
+		}
+	};
+}
+
+jQuery.each( [
+	"tabIndex",
+	"readOnly",
+	"maxLength",
+	"cellSpacing",
+	"cellPadding",
+	"rowSpan",
+	"colSpan",
+	"useMap",
+	"frameBorder",
+	"contentEditable"
+], function() {
+	jQuery.propFix[ this.toLowerCase() ] = this;
+} );
+
+// IE6/7 call enctype encoding
+if ( !support.enctype ) {
+	jQuery.propFix.enctype = "encoding";
+}
+
+
+
+
+var rclass = /[\t\r\n\f]/g;
+
+function getClass( elem ) {
+	return jQuery.attr( elem, "class" ) || "";
+}
+
+jQuery.fn.extend( {
+	addClass: function( value ) {
+		var classes, elem, cur, curValue, clazz, j, finalValue,
+			i = 0;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each( function( j ) {
+				jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
+			} );
+		}
+
+		if ( typeof value === "string" && value ) {
+			classes = value.match( rnotwhite ) || [];
+
+			while ( ( elem = this[ i++ ] ) ) {
+				curValue = getClass( elem );
+				cur = elem.nodeType === 1 &&
+					( " " + curValue + " " ).replace( rclass, " " );
+
+				if ( cur ) {
+					j = 0;
+					while ( ( clazz = classes[ j++ ] ) ) {
+						if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
+							cur += clazz + " ";
+						}
+					}
+
+					// only assign if different to avoid unneeded rendering.
+					finalValue = jQuery.trim( cur );
+					if ( curValue !== finalValue ) {
+						jQuery.attr( elem, "class", finalValue );
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	removeClass: function( value ) {
+		var classes, elem, cur, curValue, clazz, j, finalValue,
+			i = 0;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each( function( j ) {
+				jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
+			} );
+		}
+
+		if ( !arguments.length ) {
+			return this.attr( "class", "" );
+		}
+
+		if ( typeof value === "string" && value ) {
+			classes = value.match( rnotwhite ) || [];
+
+			while ( ( elem = this[ i++ ] ) ) {
+				curValue = getClass( elem );
+
+				// This expression is here for better compressibility (see addClass)
+				cur = elem.nodeType === 1 &&
+					( " " + curValue + " " ).replace( rclass, " " );
+
+				if ( cur ) {
+					j = 0;
+					while ( ( clazz = classes[ j++ ] ) ) {
+
+						// Remove *all* instances
+						while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
+							cur = cur.replace( " " + clazz + " ", " " );
+						}
+					}
+
+					// Only assign if different to avoid unneeded rendering.
+					finalValue = jQuery.trim( cur );
+					if ( curValue !== finalValue ) {
+						jQuery.attr( elem, "class", finalValue );
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	toggleClass: function( value, stateVal ) {
+		var type = typeof value;
+
+		if ( typeof stateVal === "boolean" && type === "string" ) {
+			return stateVal ? this.addClass( value ) : this.removeClass( value );
+		}
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each( function( i ) {
+				jQuery( this ).toggleClass(
+					value.call( this, i, getClass( this ), stateVal ),
+					stateVal
+				);
+			} );
+		}
+
+		return this.each( function() {
+			var className, i, self, classNames;
+
+			if ( type === "string" ) {
+
+				// Toggle individual class names
+				i = 0;
+				self = jQuery( this );
+				classNames = value.match( rnotwhite ) || [];
+
+				while ( ( className = classNames[ i++ ] ) ) {
+
+					// Check each className given, space separated list
+					if ( self.hasClass( className ) ) {
+						self.removeClass( className );
+					} else {
+						self.addClass( className );
+					}
+				}
+
+			// Toggle whole class name
+			} else if ( value === undefined || type === "boolean" ) {
+				className = getClass( this );
+				if ( className ) {
+
+					// store className if set
+					jQuery._data( this, "__className__", className );
+				}
+
+				// If the element has a class name or if we're passed "false",
+				// then remove the whole classname (if there was one, the above saved it).
+				// Otherwise bring back whatever was previously saved (if anything),
+				// falling back to the empty string if nothing was stored.
+				jQuery.attr( this, "class",
+					className || value === false ?
+					"" :
+					jQuery._data( this, "__className__" ) || ""
+				);
+			}
+		} );
+	},
+
+	hasClass: function( selector ) {
+		var className, elem,
+			i = 0;
+
+		className = " " + selector + " ";
+		while ( ( elem = this[ i++ ] ) ) {
+			if ( elem.nodeType === 1 &&
+				( " " + getClass( elem ) + " " ).replace( rclass, " " )
+					.indexOf( className ) > -1
+			) {
+				return true;
+			}
+		}
+
+		return false;
+	}
+} );
+
+
+
+
+// Return jQuery for attributes-only inclusion
+
+
+jQuery.each( ( "blur focus focusin focusout load resize scroll unload click dblclick " +
+	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+	"change select submit keydown keypress keyup error contextmenu" ).split( " " ),
+	function( i, name ) {
+
+	// Handle event binding
+	jQuery.fn[ name ] = function( data, fn ) {
+		return arguments.length > 0 ?
+			this.on( name, null, data, fn ) :
+			this.trigger( name );
+	};
+} );
+
+jQuery.fn.extend( {
+	hover: function( fnOver, fnOut ) {
+		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+	}
+} );
+
+
+var location = window.location;
+
+var nonce = jQuery.now();
+
+var rquery = ( /\?/ );
+
+
+
+var rvalidtokens = /(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;
+
+jQuery.parseJSON = function( data ) {
+
+	// Attempt to parse using the native JSON parser first
+	if ( window.JSON && window.JSON.parse ) {
+
+		// Support: Android 2.3
+		// Workaround failure to string-cast null input
+		return window.JSON.parse( data + "" );
+	}
+
+	var requireNonComma,
+		depth = null,
+		str = jQuery.trim( data + "" );
+
+	// Guard against invalid (and possibly dangerous) input by ensuring that nothing remains
+	// after removing valid tokens
+	return str && !jQuery.trim( str.replace( rvalidtokens, function( token, comma, open, close ) {
+
+		// Force termination if we see a misplaced comma
+		if ( requireNonComma && comma ) {
+			depth = 0;
+		}
+
+		// Perform no more replacements after returning to outermost depth
+		if ( depth === 0 ) {
+			return token;
+		}
+
+		// Commas must not follow "[", "{", or ","
+		requireNonComma = open || comma;
+
+		// Determine new depth
+		// array/object open ("[" or "{"): depth += true - false (increment)
+		// array/object close ("]" or "}"): depth += false - true (decrement)
+		// other cases ("," or primitive): depth += true - true (numeric cast)
+		depth += !close - !open;
+
+		// Remove this token
+		return "";
+	} ) ) ?
+		( Function( "return " + str ) )() :
+		jQuery.error( "Invalid JSON: " + data );
+};
+
+
+// Cross-browser xml parsing
+jQuery.parseXML = function( data ) {
+	var xml, tmp;
+	if ( !data || typeof data !== "string" ) {
+		return null;
+	}
+	try {
+		if ( window.DOMParser ) { // Standard
+			tmp = new window.DOMParser();
+			xml = tmp.parseFromString( data, "text/xml" );
+		} else { // IE
+			xml = new window.ActiveXObject( "Microsoft.XMLDOM" );
+			xml.async = "false";
+			xml.loadXML( data );
+		}
+	} catch ( e ) {
+		xml = undefined;
+	}
+	if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
+		jQuery.error( "Invalid XML: " + data );
+	}
+	return xml;
+};
+
+
+var
+	rhash = /#.*$/,
+	rts = /([?&])_=[^&]*/,
+
+	// IE leaves an \r character at EOL
+	rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg,
+
+	// #7653, #8125, #8152: local protocol detection
+	rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
+	rnoContent = /^(?:GET|HEAD)$/,
+	rprotocol = /^\/\//,
+	rurl = /^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,
+
+	/* Prefilters
+	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+	 * 2) These are called:
+	 *    - BEFORE asking for a transport
+	 *    - AFTER param serialization (s.data is a string if s.processData is true)
+	 * 3) key is the dataType
+	 * 4) the catchall symbol "*" can be used
+	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
+	 */
+	prefilters = {},
+
+	/* Transports bindings
+	 * 1) key is the dataType
+	 * 2) the catchall symbol "*" can be used
+	 * 3) selection will start with transport dataType and THEN go to "*" if needed
+	 */
+	transports = {},
+
+	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+	allTypes = "*/".concat( "*" ),
+
+	// Document location
+	ajaxLocation = location.href,
+
+	// Segment location into parts
+	ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
+
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+function addToPrefiltersOrTransports( structure ) {
+
+	// dataTypeExpression is optional and defaults to "*"
+	return function( dataTypeExpression, func ) {
+
+		if ( typeof dataTypeExpression !== "string" ) {
+			func = dataTypeExpression;
+			dataTypeExpression = "*";
+		}
+
+		var dataType,
+			i = 0,
+			dataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];
+
+		if ( jQuery.isFunction( func ) ) {
+
+			// For each dataType in the dataTypeExpression
+			while ( ( dataType = dataTypes[ i++ ] ) ) {
+
+				// Prepend if requested
+				if ( dataType.charAt( 0 ) === "+" ) {
+					dataType = dataType.slice( 1 ) || "*";
+					( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );
+
+				// Otherwise append
+				} else {
+					( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
+				}
+			}
+		}
+	};
+}
+
+// Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
+
+	var inspected = {},
+		seekingTransport = ( structure === transports );
+
+	function inspect( dataType ) {
+		var selected;
+		inspected[ dataType ] = true;
+		jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
+			var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
+			if ( typeof dataTypeOrTransport === "string" &&
+				!seekingTransport && !inspected[ dataTypeOrTransport ] ) {
+
+				options.dataTypes.unshift( dataTypeOrTransport );
+				inspect( dataTypeOrTransport );
+				return false;
+			} else if ( seekingTransport ) {
+				return !( selected = dataTypeOrTransport );
+			}
+		} );
+		return selected;
+	}
+
+	return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
+}
+
+// A special extend for ajax options
+// that takes "flat" options (not to be deep extended)
+// Fixes #9887
+function ajaxExtend( target, src ) {
+	var deep, key,
+		flatOptions = jQuery.ajaxSettings.flatOptions || {};
+
+	for ( key in src ) {
+		if ( src[ key ] !== undefined ) {
+			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
+		}
+	}
+	if ( deep ) {
+		jQuery.extend( true, target, deep );
+	}
+
+	return target;
+}
+
+/* Handles responses to an ajax request:
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+	var firstDataType, ct, finalDataType, type,
+		contents = s.contents,
+		dataTypes = s.dataTypes;
+
+	// Remove auto dataType and get content-type in the process
+	while ( dataTypes[ 0 ] === "*" ) {
+		dataTypes.shift();
+		if ( ct === undefined ) {
+			ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
+		}
+	}
+
+	// Check if we're dealing with a known content-type
+	if ( ct ) {
+		for ( type in contents ) {
+			if ( contents[ type ] && contents[ type ].test( ct ) ) {
+				dataTypes.unshift( type );
+				break;
+			}
+		}
+	}
+
+	// Check to see if we have a response for the expected dataType
+	if ( dataTypes[ 0 ] in responses ) {
+		finalDataType = dataTypes[ 0 ];
+	} else {
+
+		// Try convertible dataTypes
+		for ( type in responses ) {
+			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
+				finalDataType = type;
+				break;
+			}
+			if ( !firstDataType ) {
+				firstDataType = type;
+			}
+		}
+
+		// Or just use first one
+		finalDataType = finalDataType || firstDataType;
+	}
+
+	// If we found a dataType
+	// We add the dataType to the list if needed
+	// and return the corresponding response
+	if ( finalDataType ) {
+		if ( finalDataType !== dataTypes[ 0 ] ) {
+			dataTypes.unshift( finalDataType );
+		}
+		return responses[ finalDataType ];
+	}
+}
+
+/* Chain conversions given the request and the original response
+ * Also sets the responseXXX fields on the jqXHR instance
+ */
+function ajaxConvert( s, response, jqXHR, isSuccess ) {
+	var conv2, current, conv, tmp, prev,
+		converters = {},
+
+		// Work with a copy of dataTypes in case we need to modify it for conversion
+		dataTypes = s.dataTypes.slice();
+
+	// Create converters map with lowercased keys
+	if ( dataTypes[ 1 ] ) {
+		for ( conv in s.converters ) {
+			converters[ conv.toLowerCase() ] = s.converters[ conv ];
+		}
+	}
+
+	current = dataTypes.shift();
+
+	// Convert to each sequential dataType
+	while ( current ) {
+
+		if ( s.responseFields[ current ] ) {
+			jqXHR[ s.responseFields[ current ] ] = response;
+		}
+
+		// Apply the dataFilter if provided
+		if ( !prev && isSuccess && s.dataFilter ) {
+			response = s.dataFilter( response, s.dataType );
+		}
+
+		prev = current;
+		current = dataTypes.shift();
+
+		if ( current ) {
+
+			// There's only work to do if current dataType is non-auto
+			if ( current === "*" ) {
+
+				current = prev;
+
+			// Convert response if prev dataType is non-auto and differs from current
+			} else if ( prev !== "*" && prev !== current ) {
+
+				// Seek a direct converter
+				conv = converters[ prev + " " + current ] || converters[ "* " + current ];
+
+				// If none found, seek a pair
+				if ( !conv ) {
+					for ( conv2 in converters ) {
+
+						// If conv2 outputs current
+						tmp = conv2.split( " " );
+						if ( tmp[ 1 ] === current ) {
+
+							// If prev can be converted to accepted input
+							conv = converters[ prev + " " + tmp[ 0 ] ] ||
+								converters[ "* " + tmp[ 0 ] ];
+							if ( conv ) {
+
+								// Condense equivalence converters
+								if ( conv === true ) {
+									conv = converters[ conv2 ];
+
+								// Otherwise, insert the intermediate dataType
+								} else if ( converters[ conv2 ] !== true ) {
+									current = tmp[ 0 ];
+									dataTypes.unshift( tmp[ 1 ] );
+								}
+								break;
+							}
+						}
+					}
+				}
+
+				// Apply converter (if not an equivalence)
+				if ( conv !== true ) {
+
+					// Unless errors are allowed to bubble, catch and return them
+					if ( conv && s[ "throws" ] ) { // jscs:ignore requireDotNotation
+						response = conv( response );
+					} else {
+						try {
+							response = conv( response );
+						} catch ( e ) {
+							return {
+								state: "parsererror",
+								error: conv ? e : "No conversion from " + prev + " to " + current
+							};
+						}
+					}
+				}
+			}
+		}
+	}
+
+	return { state: "success", data: response };
+}
+
+jQuery.extend( {
+
+	// Counter for holding the number of active queries
+	active: 0,
+
+	// Last-Modified header cache for next request
+	lastModified: {},
+	etag: {},
+
+	ajaxSettings: {
+		url: ajaxLocation,
+		type: "GET",
+		isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
+		global: true,
+		processData: true,
+		async: true,
+		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
+		/*
+		timeout: 0,
+		data: null,
+		dataType: null,
+		username: null,
+		password: null,
+		cache: null,
+		throws: false,
+		traditional: false,
+		headers: {},
+		*/
+
+		accepts: {
+			"*": allTypes,
+			text: "text/plain",
+			html: "text/html",
+			xml: "application/xml, text/xml",
+			json: "application/json, text/javascript"
+		},
+
+		contents: {
+			xml: /\bxml\b/,
+			html: /\bhtml/,
+			json: /\bjson\b/
+		},
+
+		responseFields: {
+			xml: "responseXML",
+			text: "responseText",
+			json: "responseJSON"
+		},
+
+		// Data converters
+		// Keys separate source (or catchall "*") and destination types with a single space
+		converters: {
+
+			// Convert anything to text
+			"* text": String,
+
+			// Text to html (true = no transformation)
+			"text html": true,
+
+			// Evaluate text as a json expression
+			"text json": jQuery.parseJSON,
+
+			// Parse text as xml
+			"text xml": jQuery.parseXML
+		},
+
+		// For options that shouldn't be deep extended:
+		// you can add your own custom options here if
+		// and when you create one that shouldn't be
+		// deep extended (see ajaxExtend)
+		flatOptions: {
+			url: true,
+			context: true
+		}
+	},
+
+	// Creates a full fledged settings object into target
+	// with both ajaxSettings and settings fields.
+	// If target is omitted, writes into ajaxSettings.
+	ajaxSetup: function( target, settings ) {
+		return settings ?
+
+			// Building a settings object
+			ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
+
+			// Extending ajaxSettings
+			ajaxExtend( jQuery.ajaxSettings, target );
+	},
+
+	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+	ajaxTransport: addToPrefiltersOrTransports( transports ),
+
+	// Main method
+	ajax: function( url, options ) {
+
+		// If url is an object, simulate pre-1.5 signature
+		if ( typeof url === "object" ) {
+			options = url;
+			url = undefined;
+		}
+
+		// Force options to be an object
+		options = options || {};
+
+		var
+
+			// Cross-domain detection vars
+			parts,
+
+			// Loop variable
+			i,
+
+			// URL without anti-cache param
+			cacheURL,
+
+			// Response headers as string
+			responseHeadersString,
+
+			// timeout handle
+			timeoutTimer,
+
+			// To know if global events are to be dispatched
+			fireGlobals,
+
+			transport,
+
+			// Response headers
+			responseHeaders,
+
+			// Create the final options object
+			s = jQuery.ajaxSetup( {}, options ),
+
+			// Callbacks context
+			callbackContext = s.context || s,
+
+			// Context for global events is callbackContext if it is a DOM node or jQuery collection
+			globalEventContext = s.context &&
+				( callbackContext.nodeType || callbackContext.jquery ) ?
+					jQuery( callbackContext ) :
+					jQuery.event,
+
+			// Deferreds
+			deferred = jQuery.Deferred(),
+			completeDeferred = jQuery.Callbacks( "once memory" ),
+
+			// Status-dependent callbacks
+			statusCode = s.statusCode || {},
+
+			// Headers (they are sent all at once)
+			requestHeaders = {},
+			requestHeadersNames = {},
+
+			// The jqXHR state
+			state = 0,
+
+			// Default abort message
+			strAbort = "canceled",
+
+			// Fake xhr
+			jqXHR = {
+				readyState: 0,
+
+				// Builds headers hashtable if needed
+				getResponseHeader: function( key ) {
+					var match;
+					if ( state === 2 ) {
+						if ( !responseHeaders ) {
+							responseHeaders = {};
+							while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
+								responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];
+							}
+						}
+						match = responseHeaders[ key.toLowerCase() ];
+					}
+					return match == null ? null : match;
+				},
+
+				// Raw string
+				getAllResponseHeaders: function() {
+					return state === 2 ? responseHeadersString : null;
+				},
+
+				// Caches the header
+				setRequestHeader: function( name, value ) {
+					var lname = name.toLowerCase();
+					if ( !state ) {
+						name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
+						requestHeaders[ name ] = value;
+					}
+					return this;
+				},
+
+				// Overrides response content-type header
+				overrideMimeType: function( type ) {
+					if ( !state ) {
+						s.mimeType = type;
+					}
+					return this;
+				},
+
+				// Status-dependent callbacks
+				statusCode: function( map ) {
+					var code;
+					if ( map ) {
+						if ( state < 2 ) {
+							for ( code in map ) {
+
+								// Lazy-add the new callback in a way that preserves old ones
+								statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
+							}
+						} else {
+
+							// Execute the appropriate callbacks
+							jqXHR.always( map[ jqXHR.status ] );
+						}
+					}
+					return this;
+				},
+
+				// Cancel the request
+				abort: function( statusText ) {
+					var finalText = statusText || strAbort;
+					if ( transport ) {
+						transport.abort( finalText );
+					}
+					done( 0, finalText );
+					return this;
+				}
+			};
+
+		// Attach deferreds
+		deferred.promise( jqXHR ).complete = completeDeferred.add;
+		jqXHR.success = jqXHR.done;
+		jqXHR.error = jqXHR.fail;
+
+		// Remove hash character (#7531: and string promotion)
+		// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
+		// Handle falsy url in the settings object (#10093: consistency with old signature)
+		// We also use the url parameter if available
+		s.url = ( ( url || s.url || ajaxLocation ) + "" )
+			.replace( rhash, "" )
+			.replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+		// Alias method option to type as per ticket #12004
+		s.type = options.method || options.type || s.method || s.type;
+
+		// Extract dataTypes list
+		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( rnotwhite ) || [ "" ];
+
+		// A cross-domain request is in order when we have a protocol:host:port mismatch
+		if ( s.crossDomain == null ) {
+			parts = rurl.exec( s.url.toLowerCase() );
+			s.crossDomain = !!( parts &&
+				( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
+					( parts[ 3 ] || ( parts[ 1 ] === "http:" ? "80" : "443" ) ) !==
+						( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? "80" : "443" ) ) )
+			);
+		}
+
+		// Convert data if not already a string
+		if ( s.data && s.processData && typeof s.data !== "string" ) {
+			s.data = jQuery.param( s.data, s.traditional );
+		}
+
+		// Apply prefilters
+		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
+
+		// If request was aborted inside a prefilter, stop there
+		if ( state === 2 ) {
+			return jqXHR;
+		}
+
+		// We can fire global events as of now if asked to
+		// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
+		fireGlobals = jQuery.event && s.global;
+
+		// Watch for a new set of requests
+		if ( fireGlobals && jQuery.active++ === 0 ) {
+			jQuery.event.trigger( "ajaxStart" );
+		}
+
+		// Uppercase the type
+		s.type = s.type.toUpperCase();
+
+		// Determine if request has content
+		s.hasContent = !rnoContent.test( s.type );
+
+		// Save the URL in case we're toying with the If-Modified-Since
+		// and/or If-None-Match header later on
+		cacheURL = s.url;
+
+		// More options handling for requests with no content
+		if ( !s.hasContent ) {
+
+			// If data is available, append data to url
+			if ( s.data ) {
+				cacheURL = ( s.url += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
+
+				// #9682: remove data so that it's not used in an eventual retry
+				delete s.data;
+			}
+
+			// Add anti-cache in url if needed
+			if ( s.cache === false ) {
+				s.url = rts.test( cacheURL ) ?
+
+					// If there is already a '_' parameter, set its value
+					cacheURL.replace( rts, "$1_=" + nonce++ ) :
+
+					// Otherwise add one to the end
+					cacheURL + ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + nonce++;
+			}
+		}
+
+		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+		if ( s.ifModified ) {
+			if ( jQuery.lastModified[ cacheURL ] ) {
+				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
+			}
+			if ( jQuery.etag[ cacheURL ] ) {
+				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
+			}
+		}
+
+		// Set the correct header, if data is being sent
+		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+			jqXHR.setRequestHeader( "Content-Type", s.contentType );
+		}
+
+		// Set the Accepts header for the server, depending on the dataType
+		jqXHR.setRequestHeader(
+			"Accept",
+			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
+				s.accepts[ s.dataTypes[ 0 ] ] +
+					( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
+				s.accepts[ "*" ]
+		);
+
+		// Check for headers option
+		for ( i in s.headers ) {
+			jqXHR.setRequestHeader( i, s.headers[ i ] );
+		}
+
+		// Allow custom headers/mimetypes and early abort
+		if ( s.beforeSend &&
+			( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
+
+			// Abort if not done already and return
+			return jqXHR.abort();
+		}
+
+		// aborting is no longer a cancellation
+		strAbort = "abort";
+
+		// Install callbacks on deferreds
+		for ( i in { success: 1, error: 1, complete: 1 } ) {
+			jqXHR[ i ]( s[ i ] );
+		}
+
+		// Get transport
+		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+
+		// If no transport, we auto-abort
+		if ( !transport ) {
+			done( -1, "No Transport" );
+		} else {
+			jqXHR.readyState = 1;
+
+			// Send global event
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+			}
+
+			// If request was aborted inside ajaxSend, stop there
+			if ( state === 2 ) {
+				return jqXHR;
+			}
+
+			// Timeout
+			if ( s.async && s.timeout > 0 ) {
+				timeoutTimer = window.setTimeout( function() {
+					jqXHR.abort( "timeout" );
+				}, s.timeout );
+			}
+
+			try {
+				state = 1;
+				transport.send( requestHeaders, done );
+			} catch ( e ) {
+
+				// Propagate exception as error if not done
+				if ( state < 2 ) {
+					done( -1, e );
+
+				// Simply rethrow otherwise
+				} else {
+					throw e;
+				}
+			}
+		}
+
+		// Callback for when everything is done
+		function done( status, nativeStatusText, responses, headers ) {
+			var isSuccess, success, error, response, modified,
+				statusText = nativeStatusText;
+
+			// Called once
+			if ( state === 2 ) {
+				return;
+			}
+
+			// State is "done" now
+			state = 2;
+
+			// Clear timeout if it exists
+			if ( timeoutTimer ) {
+				window.clearTimeout( timeoutTimer );
+			}
+
+			// Dereference transport for early garbage collection
+			// (no matter how long the jqXHR object will be used)
+			transport = undefined;
+
+			// Cache response headers
+			responseHeadersString = headers || "";
+
+			// Set readyState
+			jqXHR.readyState = status > 0 ? 4 : 0;
+
+			// Determine if successful
+			isSuccess = status >= 200 && status < 300 || status === 304;
+
+			// Get response data
+			if ( responses ) {
+				response = ajaxHandleResponses( s, jqXHR, responses );
+			}
+
+			// Convert no matter what (that way responseXXX fields are always set)
+			response = ajaxConvert( s, response, jqXHR, isSuccess );
+
+			// If successful, handle type chaining
+			if ( isSuccess ) {
+
+				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+				if ( s.ifModified ) {
+					modified = jqXHR.getResponseHeader( "Last-Modified" );
+					if ( modified ) {
+						jQuery.lastModified[ cacheURL ] = modified;
+					}
+					modified = jqXHR.getResponseHeader( "etag" );
+					if ( modified ) {
+						jQuery.etag[ cacheURL ] = modified;
+					}
+				}
+
+				// if no content
+				if ( status === 204 || s.type === "HEAD" ) {
+					statusText = "nocontent";
+
+				// if not modified
+				} else if ( status === 304 ) {
+					statusText = "notmodified";
+
+				// If we have data, let's convert it
+				} else {
+					statusText = response.state;
+					success = response.data;
+					error = response.error;
+					isSuccess = !error;
+				}
+			} else {
+
+				// We extract error from statusText
+				// then normalize statusText and status for non-aborts
+				error = statusText;
+				if ( status || !statusText ) {
+					statusText = "error";
+					if ( status < 0 ) {
+						status = 0;
+					}
+				}
+			}
+
+			// Set data for the fake xhr object
+			jqXHR.status = status;
+			jqXHR.statusText = ( nativeStatusText || statusText ) + "";
+
+			// Success/Error
+			if ( isSuccess ) {
+				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+			} else {
+				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+			}
+
+			// Status-dependent callbacks
+			jqXHR.statusCode( statusCode );
+			statusCode = undefined;
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
+					[ jqXHR, s, isSuccess ? success : error ] );
+			}
+
+			// Complete
+			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+
+				// Handle the global AJAX counter
+				if ( !( --jQuery.active ) ) {
+					jQuery.event.trigger( "ajaxStop" );
+				}
+			}
+		}
+
+		return jqXHR;
+	},
+
+	getJSON: function( url, data, callback ) {
+		return jQuery.get( url, data, callback, "json" );
+	},
+
+	getScript: function( url, callback ) {
+		return jQuery.get( url, undefined, callback, "script" );
+	}
+} );
+
+jQuery.each( [ "get", "post" ], function( i, method ) {
+	jQuery[ method ] = function( url, data, callback, type ) {
+
+		// shift arguments if data argument was omitted
+		if ( jQuery.isFunction( data ) ) {
+			type = type || callback;
+			callback = data;
+			data = undefined;
+		}
+
+		// The url can be an options object (which then must have .url)
+		return jQuery.ajax( jQuery.extend( {
+			url: url,
+			type: method,
+			dataType: type,
+			data: data,
+			success: callback
+		}, jQuery.isPlainObject( url ) && url ) );
+	};
+} );
+
+
+jQuery._evalUrl = function( url ) {
+	return jQuery.ajax( {
+		url: url,
+
+		// Make this explicit, since user can override this through ajaxSetup (#11264)
+		type: "GET",
+		dataType: "script",
+		cache: true,
+		async: false,
+		global: false,
+		"throws": true
+	} );
+};
+
+
+jQuery.fn.extend( {
+	wrapAll: function( html ) {
+		if ( jQuery.isFunction( html ) ) {
+			return this.each( function( i ) {
+				jQuery( this ).wrapAll( html.call( this, i ) );
+			} );
+		}
+
+		if ( this[ 0 ] ) {
+
+			// The elements to wrap the target around
+			var wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
+
+			if ( this[ 0 ].parentNode ) {
+				wrap.insertBefore( this[ 0 ] );
+			}
+
+			wrap.map( function() {
+				var elem = this;
+
+				while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
+					elem = elem.firstChild;
+				}
+
+				return elem;
+			} ).append( this );
+		}
+
+		return this;
+	},
+
+	wrapInner: function( html ) {
+		if ( jQuery.isFunction( html ) ) {
+			return this.each( function( i ) {
+				jQuery( this ).wrapInner( html.call( this, i ) );
+			} );
+		}
+
+		return this.each( function() {
+			var self = jQuery( this ),
+				contents = self.contents();
+
+			if ( contents.length ) {
+				contents.wrapAll( html );
+
+			} else {
+				self.append( html );
+			}
+		} );
+	},
+
+	wrap: function( html ) {
+		var isFunction = jQuery.isFunction( html );
+
+		return this.each( function( i ) {
+			jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html );
+		} );
+	},
+
+	unwrap: function() {
+		return this.parent().each( function() {
+			if ( !jQuery.nodeName( this, "body" ) ) {
+				jQuery( this ).replaceWith( this.childNodes );
+			}
+		} ).end();
+	}
+} );
+
+
+function getDisplay( elem ) {
+	return elem.style && elem.style.display || jQuery.css( elem, "display" );
+}
+
+function filterHidden( elem ) {
+
+	// Disconnected elements are considered hidden
+	if ( !jQuery.contains( elem.ownerDocument || document, elem ) ) {
+		return true;
+	}
+	while ( elem && elem.nodeType === 1 ) {
+		if ( getDisplay( elem ) === "none" || elem.type === "hidden" ) {
+			return true;
+		}
+		elem = elem.parentNode;
+	}
+	return false;
+}
+
+jQuery.expr.filters.hidden = function( elem ) {
+
+	// Support: Opera <= 12.12
+	// Opera reports offsetWidths and offsetHeights less than zero on some elements
+	return support.reliableHiddenOffsets() ?
+		( elem.offsetWidth <= 0 && elem.offsetHeight <= 0 &&
+			!elem.getClientRects().length ) :
+			filterHidden( elem );
+};
+
+jQuery.expr.filters.visible = function( elem ) {
+	return !jQuery.expr.filters.hidden( elem );
+};
+
+
+
+
+var r20 = /%20/g,
+	rbracket = /\[\]$/,
+	rCRLF = /\r?\n/g,
+	rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
+	rsubmittable = /^(?:input|select|textarea|keygen)/i;
+
+function buildParams( prefix, obj, traditional, add ) {
+	var name;
+
+	if ( jQuery.isArray( obj ) ) {
+
+		// Serialize array item.
+		jQuery.each( obj, function( i, v ) {
+			if ( traditional || rbracket.test( prefix ) ) {
+
+				// Treat each array item as a scalar.
+				add( prefix, v );
+
+			} else {
+
+				// Item is non-scalar (array or object), encode its numeric index.
+				buildParams(
+					prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
+					v,
+					traditional,
+					add
+				);
+			}
+		} );
+
+	} else if ( !traditional && jQuery.type( obj ) === "object" ) {
+
+		// Serialize object item.
+		for ( name in obj ) {
+			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+		}
+
+	} else {
+
+		// Serialize scalar item.
+		add( prefix, obj );
+	}
+}
+
+// Serialize an array of form elements or a set of
+// key/values into a query string
+jQuery.param = function( a, traditional ) {
+	var prefix,
+		s = [],
+		add = function( key, value ) {
+
+			// If value is a function, invoke it and return its value
+			value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
+			s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+		};
+
+	// Set traditional to true for jQuery <= 1.3.2 behavior.
+	if ( traditional === undefined ) {
+		traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
+	}
+
+	// If an array was passed in, assume that it is an array of form elements.
+	if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+
+		// Serialize the form elements
+		jQuery.each( a, function() {
+			add( this.name, this.value );
+		} );
+
+	} else {
+
+		// If traditional, encode the "old" way (the way 1.3.2 or older
+		// did it), otherwise encode params recursively.
+		for ( prefix in a ) {
+			buildParams( prefix, a[ prefix ], traditional, add );
+		}
+	}
+
+	// Return the resulting serialization
+	return s.join( "&" ).replace( r20, "+" );
+};
+
+jQuery.fn.extend( {
+	serialize: function() {
+		return jQuery.param( this.serializeArray() );
+	},
+	serializeArray: function() {
+		return this.map( function() {
+
+			// Can add propHook for "elements" to filter or add form elements
+			var elements = jQuery.prop( this, "elements" );
+			return elements ? jQuery.makeArray( elements ) : this;
+		} )
+		.filter( function() {
+			var type = this.type;
+
+			// Use .is(":disabled") so that fieldset[disabled] works
+			return this.name && !jQuery( this ).is( ":disabled" ) &&
+				rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
+				( this.checked || !rcheckableType.test( type ) );
+		} )
+		.map( function( i, elem ) {
+			var val = jQuery( this ).val();
+
+			return val == null ?
+				null :
+				jQuery.isArray( val ) ?
+					jQuery.map( val, function( val ) {
+						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+					} ) :
+					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+		} ).get();
+	}
+} );
+
+
+// Create the request object
+// (This is still attached to ajaxSettings for backward compatibility)
+jQuery.ajaxSettings.xhr = window.ActiveXObject !== undefined ?
+
+	// Support: IE6-IE8
+	function() {
+
+		// XHR cannot access local files, always use ActiveX for that case
+		if ( this.isLocal ) {
+			return createActiveXHR();
+		}
+
+		// Support: IE 9-11
+		// IE seems to error on cross-domain PATCH requests when ActiveX XHR
+		// is used. In IE 9+ always use the native XHR.
+		// Note: this condition won't catch Edge as it doesn't define
+		// document.documentMode but it also doesn't support ActiveX so it won't
+		// reach this code.
+		if ( document.documentMode > 8 ) {
+			return createStandardXHR();
+		}
+
+		// Support: IE<9
+		// oldIE XHR does not support non-RFC2616 methods (#13240)
+		// See http://msdn.microsoft.com/en-us/library/ie/ms536648(v=vs.85).aspx
+		// and http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9
+		// Although this check for six methods instead of eight
+		// since IE also does not support "trace" and "connect"
+		return /^(get|post|head|put|delete|options)$/i.test( this.type ) &&
+			createStandardXHR() || createActiveXHR();
+	} :
+
+	// For all other browsers, use the standard XMLHttpRequest object
+	createStandardXHR;
+
+var xhrId = 0,
+	xhrCallbacks = {},
+	xhrSupported = jQuery.ajaxSettings.xhr();
+
+// Support: IE<10
+// Open requests must be manually aborted on unload (#5280)
+// See https://support.microsoft.com/kb/2856746 for more info
+if ( window.attachEvent ) {
+	window.attachEvent( "onunload", function() {
+		for ( var key in xhrCallbacks ) {
+			xhrCallbacks[ key ]( undefined, true );
+		}
+	} );
+}
+
+// Determine support properties
+support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
+xhrSupported = support.ajax = !!xhrSupported;
+
+// Create transport if the browser can provide an xhr
+if ( xhrSupported ) {
+
+	jQuery.ajaxTransport( function( options ) {
+
+		// Cross domain only allowed if supported through XMLHttpRequest
+		if ( !options.crossDomain || support.cors ) {
+
+			var callback;
+
+			return {
+				send: function( headers, complete ) {
+					var i,
+						xhr = options.xhr(),
+						id = ++xhrId;
+
+					// Open the socket
+					xhr.open(
+						options.type,
+						options.url,
+						options.async,
+						options.username,
+						options.password
+					);
+
+					// Apply custom fields if provided
+					if ( options.xhrFields ) {
+						for ( i in options.xhrFields ) {
+							xhr[ i ] = options.xhrFields[ i ];
+						}
+					}
+
+					// Override mime type if needed
+					if ( options.mimeType && xhr.overrideMimeType ) {
+						xhr.overrideMimeType( options.mimeType );
+					}
+
+					// X-Requested-With header
+					// For cross-domain requests, seeing as conditions for a preflight are
+					// akin to a jigsaw puzzle, we simply never set it to be sure.
+					// (it can always be set on a per-request basis or even using ajaxSetup)
+					// For same-domain requests, won't change header if already provided.
+					if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
+						headers[ "X-Requested-With" ] = "XMLHttpRequest";
+					}
+
+					// Set headers
+					for ( i in headers ) {
+
+						// Support: IE<9
+						// IE's ActiveXObject throws a 'Type Mismatch' exception when setting
+						// request header to a null-value.
+						//
+						// To keep consistent with other XHR implementations, cast the value
+						// to string and ignore `undefined`.
+						if ( headers[ i ] !== undefined ) {
+							xhr.setRequestHeader( i, headers[ i ] + "" );
+						}
+					}
+
+					// Do send the request
+					// This may raise an exception which is actually
+					// handled in jQuery.ajax (so no try/catch here)
+					xhr.send( ( options.hasContent && options.data ) || null );
+
+					// Listener
+					callback = function( _, isAbort ) {
+						var status, statusText, responses;
+
+						// Was never called and is aborted or complete
+						if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
+
+							// Clean up
+							delete xhrCallbacks[ id ];
+							callback = undefined;
+							xhr.onreadystatechange = jQuery.noop;
+
+							// Abort manually if needed
+							if ( isAbort ) {
+								if ( xhr.readyState !== 4 ) {
+									xhr.abort();
+								}
+							} else {
+								responses = {};
+								status = xhr.status;
+
+								// Support: IE<10
+								// Accessing binary-data responseText throws an exception
+								// (#11426)
+								if ( typeof xhr.responseText === "string" ) {
+									responses.text = xhr.responseText;
+								}
+
+								// Firefox throws an exception when accessing
+								// statusText for faulty cross-domain requests
+								try {
+									statusText = xhr.statusText;
+								} catch ( e ) {
+
+									// We normalize with Webkit giving an empty statusText
+									statusText = "";
+								}
+
+								// Filter status for non standard behaviors
+
+								// If the request is local and we have data: assume a success
+								// (success with no data won't get notified, that's the best we
+								// can do given current implementations)
+								if ( !status && options.isLocal && !options.crossDomain ) {
+									status = responses.text ? 200 : 404;
+
+								// IE - #1450: sometimes returns 1223 when it should be 204
+								} else if ( status === 1223 ) {
+									status = 204;
+								}
+							}
+						}
+
+						// Call complete if needed
+						if ( responses ) {
+							complete( status, statusText, responses, xhr.getAllResponseHeaders() );
+						}
+					};
+
+					// Do send the request
+					// `xhr.send` may raise an exception, but it will be
+					// handled in jQuery.ajax (so no try/catch here)
+					if ( !options.async ) {
+
+						// If we're in sync mode we fire the callback
+						callback();
+					} else if ( xhr.readyState === 4 ) {
+
+						// (IE6 & IE7) if it's in cache and has been
+						// retrieved directly we need to fire the callback
+						window.setTimeout( callback );
+					} else {
+
+						// Register the callback, but delay it in case `xhr.send` throws
+						// Add to the list of active xhr callbacks
+						xhr.onreadystatechange = xhrCallbacks[ id ] = callback;
+					}
+				},
+
+				abort: function() {
+					if ( callback ) {
+						callback( undefined, true );
+					}
+				}
+			};
+		}
+	} );
+}
+
+// Functions to create xhrs
+function createStandardXHR() {
+	try {
+		return new window.XMLHttpRequest();
+	} catch ( e ) {}
+}
+
+function createActiveXHR() {
+	try {
+		return new window.ActiveXObject( "Microsoft.XMLHTTP" );
+	} catch ( e ) {}
+}
+
+
+
+
+// Install script dataType
+jQuery.ajaxSetup( {
+	accepts: {
+		script: "text/javascript, application/javascript, " +
+			"application/ecmascript, application/x-ecmascript"
+	},
+	contents: {
+		script: /\b(?:java|ecma)script\b/
+	},
+	converters: {
+		"text script": function( text ) {
+			jQuery.globalEval( text );
+			return text;
+		}
+	}
+} );
+
+// Handle cache's special case and global
+jQuery.ajaxPrefilter( "script", function( s ) {
+	if ( s.cache === undefined ) {
+		s.cache = false;
+	}
+	if ( s.crossDomain ) {
+		s.type = "GET";
+		s.global = false;
+	}
+} );
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function( s ) {
+
+	// This transport only deals with cross domain requests
+	if ( s.crossDomain ) {
+
+		var script,
+			head = document.head || jQuery( "head" )[ 0 ] || document.documentElement;
+
+		return {
+
+			send: function( _, callback ) {
+
+				script = document.createElement( "script" );
+
+				script.async = true;
+
+				if ( s.scriptCharset ) {
+					script.charset = s.scriptCharset;
+				}
+
+				script.src = s.url;
+
+				// Attach handlers for all browsers
+				script.onload = script.onreadystatechange = function( _, isAbort ) {
+
+					if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
+
+						// Handle memory leak in IE
+						script.onload = script.onreadystatechange = null;
+
+						// Remove the script
+						if ( script.parentNode ) {
+							script.parentNode.removeChild( script );
+						}
+
+						// Dereference the script
+						script = null;
+
+						// Callback if not abort
+						if ( !isAbort ) {
+							callback( 200, "success" );
+						}
+					}
+				};
+
+				// Circumvent IE6 bugs with index elements (#2709 and #4378) by prepending
+				// Use native DOM manipulation to avoid our domManip AJAX trickery
+				head.insertBefore( script, head.firstChild );
+			},
+
+			abort: function() {
+				if ( script ) {
+					script.onload( undefined, true );
+				}
+			}
+		};
+	}
+} );
+
+
+
+
+var oldCallbacks = [],
+	rjsonp = /(=)\?(?=&|$)|\?\?/;
+
+// Default jsonp settings
+jQuery.ajaxSetup( {
+	jsonp: "callback",
+	jsonpCallback: function() {
+		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
+		this[ callback ] = true;
+		return callback;
+	}
+} );
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+	var callbackName, overwritten, responseContainer,
+		jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
+			"url" :
+			typeof s.data === "string" &&
+				( s.contentType || "" )
+					.indexOf( "application/x-www-form-urlencoded" ) === 0 &&
+				rjsonp.test( s.data ) && "data"
+		);
+
+	// Handle iff the expected data type is "jsonp" or we have a parameter to set
+	if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
+
+		// Get callback name, remembering preexisting value associated with it
+		callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
+			s.jsonpCallback() :
+			s.jsonpCallback;
+
+		// Insert callback into url or form data
+		if ( jsonProp ) {
+			s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
+		} else if ( s.jsonp !== false ) {
+			s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
+		}
+
+		// Use data converter to retrieve json after script execution
+		s.converters[ "script json" ] = function() {
+			if ( !responseContainer ) {
+				jQuery.error( callbackName + " was not called" );
+			}
+			return responseContainer[ 0 ];
+		};
+
+		// force json dataType
+		s.dataTypes[ 0 ] = "json";
+
+		// Install callback
+		overwritten = window[ callbackName ];
+		window[ callbackName ] = function() {
+			responseContainer = arguments;
+		};
+
+		// Clean-up function (fires after converters)
+		jqXHR.always( function() {
+
+			// If previous value didn't exist - remove it
+			if ( overwritten === undefined ) {
+				jQuery( window ).removeProp( callbackName );
+
+			// Otherwise restore preexisting value
+			} else {
+				window[ callbackName ] = overwritten;
+			}
+
+			// Save back as free
+			if ( s[ callbackName ] ) {
+
+				// make sure that re-using the options doesn't screw things around
+				s.jsonpCallback = originalSettings.jsonpCallback;
+
+				// save the callback name for future use
+				oldCallbacks.push( callbackName );
+			}
+
+			// Call if it was a function and we have a response
+			if ( responseContainer && jQuery.isFunction( overwritten ) ) {
+				overwritten( responseContainer[ 0 ] );
+			}
+
+			responseContainer = overwritten = undefined;
+		} );
+
+		// Delegate to script
+		return "script";
+	}
+} );
+
+
+
+
+// data: string of html
+// context (optional): If specified, the fragment will be created in this context,
+// defaults to document
+// keepScripts (optional): If true, will include scripts passed in the html string
+jQuery.parseHTML = function( data, context, keepScripts ) {
+	if ( !data || typeof data !== "string" ) {
+		return null;
+	}
+	if ( typeof context === "boolean" ) {
+		keepScripts = context;
+		context = false;
+	}
+	context = context || document;
+
+	var parsed = rsingleTag.exec( data ),
+		scripts = !keepScripts && [];
+
+	// Single tag
+	if ( parsed ) {
+		return [ context.createElement( parsed[ 1 ] ) ];
+	}
+
+	parsed = buildFragment( [ data ], context, scripts );
+
+	if ( scripts && scripts.length ) {
+		jQuery( scripts ).remove();
+	}
+
+	return jQuery.merge( [], parsed.childNodes );
+};
+
+
+// Keep a copy of the old load method
+var _load = jQuery.fn.load;
+
+/**
+ * Load a url into a page
+ */
+jQuery.fn.load = function( url, params, callback ) {
+	if ( typeof url !== "string" && _load ) {
+		return _load.apply( this, arguments );
+	}
+
+	var selector, type, response,
+		self = this,
+		off = url.indexOf( " " );
+
+	if ( off > -1 ) {
+		selector = jQuery.trim( url.slice( off, url.length ) );
+		url = url.slice( 0, off );
+	}
+
+	// If it's a function
+	if ( jQuery.isFunction( params ) ) {
+
+		// We assume that it's the callback
+		callback = params;
+		params = undefined;
+
+	// Otherwise, build a param string
+	} else if ( params && typeof params === "object" ) {
+		type = "POST";
+	}
+
+	// If we have elements to modify, make the request
+	if ( self.length > 0 ) {
+		jQuery.ajax( {
+			url: url,
+
+			// If "type" variable is undefined, then "GET" method will be used.
+			// Make value of this field explicit since
+			// user can override it through ajaxSetup method
+			type: type || "GET",
+			dataType: "html",
+			data: params
+		} ).done( function( responseText ) {
+
+			// Save response for use in complete callback
+			response = arguments;
+
+			self.html( selector ?
+
+				// If a selector was specified, locate the right elements in a dummy div
+				// Exclude scripts to avoid IE 'Permission Denied' errors
+				jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :
+
+				// Otherwise use the full result
+				responseText );
+
+		// If the request succeeds, this function gets "data", "status", "jqXHR"
+		// but they are ignored because response was set above.
+		// If it fails, this function gets "jqXHR", "status", "error"
+		} ).always( callback && function( jqXHR, status ) {
+			self.each( function() {
+				callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
+			} );
+		} );
+	}
+
+	return this;
+};
+
+
+
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( [
+	"ajaxStart",
+	"ajaxStop",
+	"ajaxComplete",
+	"ajaxError",
+	"ajaxSuccess",
+	"ajaxSend"
+], function( i, type ) {
+	jQuery.fn[ type ] = function( fn ) {
+		return this.on( type, fn );
+	};
+} );
+
+
+
+
+jQuery.expr.filters.animated = function( elem ) {
+	return jQuery.grep( jQuery.timers, function( fn ) {
+		return elem === fn.elem;
+	} ).length;
+};
+
+
+
+
+
+/**
+ * Gets a window from an element
+ */
+function getWindow( elem ) {
+	return jQuery.isWindow( elem ) ?
+		elem :
+		elem.nodeType === 9 ?
+			elem.defaultView || elem.parentWindow :
+			false;
+}
+
+jQuery.offset = {
+	setOffset: function( elem, options, i ) {
+		var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
+			position = jQuery.css( elem, "position" ),
+			curElem = jQuery( elem ),
+			props = {};
+
+		// set position first, in-case top/left are set even on static elem
+		if ( position === "static" ) {
+			elem.style.position = "relative";
+		}
+
+		curOffset = curElem.offset();
+		curCSSTop = jQuery.css( elem, "top" );
+		curCSSLeft = jQuery.css( elem, "left" );
+		calculatePosition = ( position === "absolute" || position === "fixed" ) &&
+			jQuery.inArray( "auto", [ curCSSTop, curCSSLeft ] ) > -1;
+
+		// need to be able to calculate position if either top or left
+		// is auto and position is either absolute or fixed
+		if ( calculatePosition ) {
+			curPosition = curElem.position();
+			curTop = curPosition.top;
+			curLeft = curPosition.left;
+		} else {
+			curTop = parseFloat( curCSSTop ) || 0;
+			curLeft = parseFloat( curCSSLeft ) || 0;
+		}
+
+		if ( jQuery.isFunction( options ) ) {
+
+			// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
+			options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
+		}
+
+		if ( options.top != null ) {
+			props.top = ( options.top - curOffset.top ) + curTop;
+		}
+		if ( options.left != null ) {
+			props.left = ( options.left - curOffset.left ) + curLeft;
+		}
+
+		if ( "using" in options ) {
+			options.using.call( elem, props );
+		} else {
+			curElem.css( props );
+		}
+	}
+};
+
+jQuery.fn.extend( {
+	offset: function( options ) {
+		if ( arguments.length ) {
+			return options === undefined ?
+				this :
+				this.each( function( i ) {
+					jQuery.offset.setOffset( this, options, i );
+				} );
+		}
+
+		var docElem, win,
+			box = { top: 0, left: 0 },
+			elem = this[ 0 ],
+			doc = elem && elem.ownerDocument;
+
+		if ( !doc ) {
+			return;
+		}
+
+		docElem = doc.documentElement;
+
+		// Make sure it's not a disconnected DOM node
+		if ( !jQuery.contains( docElem, elem ) ) {
+			return box;
+		}
+
+		// If we don't have gBCR, just use 0,0 rather than error
+		// BlackBerry 5, iOS 3 (original iPhone)
+		if ( typeof elem.getBoundingClientRect !== "undefined" ) {
+			box = elem.getBoundingClientRect();
+		}
+		win = getWindow( doc );
+		return {
+			top: box.top  + ( win.pageYOffset || docElem.scrollTop )  - ( docElem.clientTop  || 0 ),
+			left: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )
+		};
+	},
+
+	position: function() {
+		if ( !this[ 0 ] ) {
+			return;
+		}
+
+		var offsetParent, offset,
+			parentOffset = { top: 0, left: 0 },
+			elem = this[ 0 ];
+
+		// Fixed elements are offset from window (parentOffset = {top:0, left: 0},
+		// because it is its only offset parent
+		if ( jQuery.css( elem, "position" ) === "fixed" ) {
+
+			// we assume that getBoundingClientRect is available when computed position is fixed
+			offset = elem.getBoundingClientRect();
+		} else {
+
+			// Get *real* offsetParent
+			offsetParent = this.offsetParent();
+
+			// Get correct offsets
+			offset = this.offset();
+			if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
+				parentOffset = offsetParent.offset();
+			}
+
+			// Add offsetParent borders
+			parentOffset.top  += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
+			parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
+		}
+
+		// Subtract parent offsets and element margins
+		// note: when an element has margin: auto the offsetLeft and marginLeft
+		// are the same in Safari causing offset.left to incorrectly be 0
+		return {
+			top:  offset.top  - parentOffset.top - jQuery.css( elem, "marginTop", true ),
+			left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
+		};
+	},
+
+	offsetParent: function() {
+		return this.map( function() {
+			var offsetParent = this.offsetParent;
+
+			while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) &&
+				jQuery.css( offsetParent, "position" ) === "static" ) ) {
+				offsetParent = offsetParent.offsetParent;
+			}
+			return offsetParent || documentElement;
+		} );
+	}
+} );
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
+	var top = /Y/.test( prop );
+
+	jQuery.fn[ method ] = function( val ) {
+		return access( this, function( elem, method, val ) {
+			var win = getWindow( elem );
+
+			if ( val === undefined ) {
+				return win ? ( prop in win ) ? win[ prop ] :
+					win.document.documentElement[ method ] :
+					elem[ method ];
+			}
+
+			if ( win ) {
+				win.scrollTo(
+					!top ? val : jQuery( win ).scrollLeft(),
+					top ? val : jQuery( win ).scrollTop()
+				);
+
+			} else {
+				elem[ method ] = val;
+			}
+		}, method, val, arguments.length, null );
+	};
+} );
+
+// Support: Safari<7-8+, Chrome<37-44+
+// Add the top/left cssHooks using jQuery.fn.position
+// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
+// getComputedStyle returns percent when specified for top/left/bottom/right
+// rather than make the css module depend on the offset module, we just check for it here
+jQuery.each( [ "top", "left" ], function( i, prop ) {
+	jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
+		function( elem, computed ) {
+			if ( computed ) {
+				computed = curCSS( elem, prop );
+
+				// if curCSS returns percentage, fallback to offset
+				return rnumnonpx.test( computed ) ?
+					jQuery( elem ).position()[ prop ] + "px" :
+					computed;
+			}
+		}
+	);
+} );
+
+
+// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
+jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
+	jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
+	function( defaultExtra, funcName ) {
+
+		// margin is only for outerHeight, outerWidth
+		jQuery.fn[ funcName ] = function( margin, value ) {
+			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
+				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
+
+			return access( this, function( elem, type, value ) {
+				var doc;
+
+				if ( jQuery.isWindow( elem ) ) {
+
+					// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
+					// isn't a whole lot we can do. See pull request at this URL for discussion:
+					// https://github.com/jquery/jquery/pull/764
+					return elem.document.documentElement[ "client" + name ];
+				}
+
+				// Get document width or height
+				if ( elem.nodeType === 9 ) {
+					doc = elem.documentElement;
+
+					// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
+					// whichever is greatest
+					// unfortunately, this causes bug #3838 in IE6/8 only,
+					// but there is currently no good, small way to fix it.
+					return Math.max(
+						elem.body[ "scroll" + name ], doc[ "scroll" + name ],
+						elem.body[ "offset" + name ], doc[ "offset" + name ],
+						doc[ "client" + name ]
+					);
+				}
+
+				return value === undefined ?
+
+					// Get width or height on the element, requesting but not forcing parseFloat
+					jQuery.css( elem, type, extra ) :
+
+					// Set width or height on the element
+					jQuery.style( elem, type, value, extra );
+			}, type, chainable ? margin : undefined, chainable, null );
+		};
+	} );
+} );
+
+
+jQuery.fn.extend( {
+
+	bind: function( types, data, fn ) {
+		return this.on( types, null, data, fn );
+	},
+	unbind: function( types, fn ) {
+		return this.off( types, null, fn );
+	},
+
+	delegate: function( selector, types, data, fn ) {
+		return this.on( types, selector, data, fn );
+	},
+	undelegate: function( selector, types, fn ) {
+
+		// ( namespace ) or ( selector, types [, fn] )
+		return arguments.length === 1 ?
+			this.off( selector, "**" ) :
+			this.off( types, selector || "**", fn );
+	}
+} );
+
+// The number of elements contained in the matched element set
+jQuery.fn.size = function() {
+	return this.length;
+};
+
+jQuery.fn.andSelf = jQuery.fn.addBack;
+
+
+
+
+// Register as a named AMD module, since jQuery can be concatenated with other
+// files that may use define, but not via a proper concatenation script that
+// understands anonymous AMD modules. A named AMD is safest and most robust
+// way to register. Lowercase jquery is used because AMD module names are
+// derived from file names, and jQuery is normally delivered in a lowercase
+// file name. Do this after creating the global so that if an AMD module wants
+// to call noConflict to hide this version of jQuery, it will work.
+
+// Note that for maximum portability, libraries that are not jQuery should
+// declare themselves as anonymous modules, and avoid setting a global if an
+// AMD loader is present. jQuery is a special case. For more information, see
+// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
+
+if ( typeof define === "function" && define.amd ) {
+	define( "jquery", [], function() {
+		return jQuery;
+	} );
+}
+
+
+
+var
+
+	// Map over jQuery in case of overwrite
+	_jQuery = window.jQuery,
+
+	// Map over the $ in case of overwrite
+	_$ = window.$;
+
+jQuery.noConflict = function( deep ) {
+	if ( window.$ === jQuery ) {
+		window.$ = _$;
+	}
+
+	if ( deep && window.jQuery === jQuery ) {
+		window.jQuery = _jQuery;
+	}
+
+	return jQuery;
+};
+
+// Expose jQuery and $ identifiers, even in
+// AMD (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
+// and CommonJS for browser emulators (#13566)
+if ( !noGlobal ) {
+	window.jQuery = window.$ = jQuery;
+}
+
+return jQuery;
+}));
diff --git a/Source/platformProject/platform2022UI/jslib/jquery/jquery-1.12.4.min.js b/Source/platformProject/platform2022UI/jslib/jquery/jquery-1.12.4.min.js
new file mode 100644
index 0000000..e836475
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/jquery/jquery-1.12.4.min.js
@@ -0,0 +1,5 @@
+/*! jQuery v1.12.4 | (c) jQuery Foundation | jquery.org/license */
+!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="1.12.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return e.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!k.call(a,"constructor")&&!k.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(!l.ownFirst)for(b in a)return k.call(a,b);for(b in a);return void 0===b||k.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(h)return h.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(f=a[b],b=a,a=f),n.isFunction(a)?(c=e.call(arguments,2),d=function(){return a.apply(b||this,c.concat(e.call(arguments)))},d.guid=a.guid=a.guid||n.guid++,d):void 0},now:function(){return+new Date},support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=la(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=ma(b);function pa(){}pa.prototype=d.filters=d.pseudos,d.setFilters=new pa,g=fa.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){c&&!(e=R.exec(h))||(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=S.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(Q," ")}),h=h.slice(c.length));for(g in d.filter)!(e=W[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?fa.error(a):z(a,i).slice(0)};function qa(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return n.inArray(a,b)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;e>b;b++)if(n.contains(d[b],this))return!0}));for(b=0;e>b;b++)n.find(a,d[b],c);return c=this.pushStack(e>1?n.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}if(f=d.getElementById(e[2]),f&&f.parentNode){if(f.id!==e[2])return A.find(a);this.length=1,this[0]=f}return this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b,c=n(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(n.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?n.inArray(this[0],n(a)):n.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return n.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||(e=n.uniqueSort(e)),D.test(a)&&(e=e.reverse())),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){n.each(b,function(b,c){n.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==n.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return n.each(arguments,function(a,b){var c;while((c=n.inArray(b,f,c))>-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=!0,c||j.disable(),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.addEventListener?(d.removeEventListener("DOMContentLoaded",K),a.removeEventListener("load",K)):(d.detachEvent("onreadystatechange",K),a.detachEvent("onload",K))}function K(){(d.addEventListener||"load"===a.event.type||"complete"===d.readyState)&&(J(),n.ready())}n.ready.promise=function(b){if(!I)if(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll)a.setTimeout(n.ready);else if(d.addEventListener)d.addEventListener("DOMContentLoaded",K),a.addEventListener("load",K);else{d.attachEvent("onreadystatechange",K),a.attachEvent("onload",K);var c=!1;try{c=null==a.frameElement&&d.documentElement}catch(e){}c&&c.doScroll&&!function f(){if(!n.isReady){try{c.doScroll("left")}catch(b){return a.setTimeout(f,50)}J(),n.ready()}}()}return I.promise(b)},n.ready.promise();var L;for(L in n(l))break;l.ownFirst="0"===L,l.inlineBlockNeedsLayout=!1,n(function(){var a,b,c,e;c=d.getElementsByTagName("body")[0],c&&c.style&&(b=d.createElement("div"),e=d.createElement("div"),e.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(e).appendChild(b),"undefined"!=typeof b.style.zoom&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",l.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(e))}),function(){var a=d.createElement("div");l.deleteExpando=!0;try{delete a.test}catch(b){l.deleteExpando=!1}a=null}();var M=function(a){var b=n.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b},N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(O,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}n.data(a,b,c)}else c=void 0;
+}return c}function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function R(a,b,d,e){if(M(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),"object"!=typeof b&&"function"!=typeof b||(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[n.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[n.camelCase(b)])):f=g,f}}function S(a,b,c){if(M(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.expando]:n.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){n.isArray(b)?b=b.concat(n.map(b,n.camelCase)):b in d?b=[b]:(b=n.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!Q(d):!n.isEmptyObject(d))return}(c||(delete g[h].data,Q(g[h])))&&(f?n.cleanData([a],!0):l.deleteExpando||g!=g.window?delete g[h]:g[h]=void 0)}}}n.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?n.cache[a[n.expando]]:a[n.expando],!!a&&!Q(a)},data:function(a,b,c){return R(a,b,c)},removeData:function(a,b){return S(a,b)},_data:function(a,b,c){return R(a,b,c,!0)},_removeData:function(a,b){return S(a,b,!0)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=n.data(f),1===f.nodeType&&!n._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));n._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){n.data(this,a)}):arguments.length>1?this.each(function(){n.data(this,a,b)}):f?P(f,a,n.data(f,a)):void 0},removeData:function(a){return this.each(function(){n.removeData(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=n._data(a,b),c&&(!d||n.isArray(c)?d=n._data(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return n._data(a,c)||n._data(a,c,{empty:n.Callbacks("once memory").add(function(){n._removeData(a,b+"queue"),n._removeData(a,c)})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=n._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}}),function(){var a;l.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,e;return c=d.getElementsByTagName("body")[0],c&&c.style?(b=d.createElement("div"),e=d.createElement("div"),e.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(e).appendChild(b),"undefined"!=typeof b.style.zoom&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(d.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(e),a):void 0}}();var T=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,U=new RegExp("^(?:([+-])=|)("+T+")([a-z%]*)$","i"),V=["Top","Right","Bottom","Left"],W=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)};function X(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return n.css(a,b,"")},i=h(),j=c&&c[3]||(n.cssNumber[b]?"":"px"),k=(n.cssNumber[b]||"px"!==j&&+i)&&U.exec(n.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,n.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var Y=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)Y(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},Z=/^(?:checkbox|radio)$/i,$=/<([\w:-]+)/,_=/^$|\/(?:java|ecma)script/i,aa=/^\s+/,ba="abbr|article|aside|audio|bdi|canvas|data|datalist|details|dialog|figcaption|figure|footer|header|hgroup|main|mark|meter|nav|output|picture|progress|section|summary|template|time|video";function ca(a){var b=ba.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}!function(){var a=d.createElement("div"),b=d.createDocumentFragment(),c=d.createElement("input");a.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",l.leadingWhitespace=3===a.firstChild.nodeType,l.tbody=!a.getElementsByTagName("tbody").length,l.htmlSerialize=!!a.getElementsByTagName("link").length,l.html5Clone="<:nav></:nav>"!==d.createElement("nav").cloneNode(!0).outerHTML,c.type="checkbox",c.checked=!0,b.appendChild(c),l.appendChecked=c.checked,a.innerHTML="<textarea>x</textarea>",l.noCloneChecked=!!a.cloneNode(!0).lastChild.defaultValue,b.appendChild(a),c=d.createElement("input"),c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),a.appendChild(c),l.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!!a.addEventListener,a[n.expando]=1,l.attributes=!a.getAttribute(n.expando)}();var da={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:l.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]};da.optgroup=da.option,da.tbody=da.tfoot=da.colgroup=da.caption=da.thead,da.th=da.td;function ea(a,b){var c,d,e=0,f="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,ea(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function fa(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}var ga=/<|&#?\w+;/,ha=/<tbody/i;function ia(a){Z.test(a.type)&&(a.defaultChecked=a.checked)}function ja(a,b,c,d,e){for(var f,g,h,i,j,k,m,o=a.length,p=ca(b),q=[],r=0;o>r;r++)if(g=a[r],g||0===g)if("object"===n.type(g))n.merge(q,g.nodeType?[g]:g);else if(ga.test(g)){i=i||p.appendChild(b.createElement("div")),j=($.exec(g)||["",""])[1].toLowerCase(),m=da[j]||da._default,i.innerHTML=m[1]+n.htmlPrefilter(g)+m[2],f=m[0];while(f--)i=i.lastChild;if(!l.leadingWhitespace&&aa.test(g)&&q.push(b.createTextNode(aa.exec(g)[0])),!l.tbody){g="table"!==j||ha.test(g)?"<table>"!==m[1]||ha.test(g)?0:i:i.firstChild,f=g&&g.childNodes.length;while(f--)n.nodeName(k=g.childNodes[f],"tbody")&&!k.childNodes.length&&g.removeChild(k)}n.merge(q,i.childNodes),i.textContent="";while(i.firstChild)i.removeChild(i.firstChild);i=p.lastChild}else q.push(b.createTextNode(g));i&&p.removeChild(i),l.appendChecked||n.grep(ea(q,"input"),ia),r=0;while(g=q[r++])if(d&&n.inArray(g,d)>-1)e&&e.push(g);else if(h=n.contains(g.ownerDocument,g),i=ea(p.appendChild(g),"script"),h&&fa(i),c){f=0;while(g=i[f++])_.test(g.type||"")&&c.push(g)}return i=null,p}!function(){var b,c,e=d.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(l[b]=c in a)||(e.setAttribute(c,"t"),l[b]=e.attributes[c].expando===!1);e=null}();var ka=/^(?:input|select|textarea)$/i,la=/^key/,ma=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,na=/^(?:focusinfocus|focusoutblur)$/,oa=/^([^.]*)(?:\.(.+)|)/;function pa(){return!0}function qa(){return!1}function ra(){try{return d.activeElement}catch(a){}}function sa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)sa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=qa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=n.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return"undefined"==typeof n||a&&n.event.triggered===a.type?void 0:n.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(G)||[""],h=b.length;while(h--)f=oa.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=n.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=n.event.special[o]||{},l=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},i),(m=g[o])||(m=g[o]=[],m.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,l):m.push(l),n.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n.hasData(a)&&n._data(a);if(r&&(k=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=oa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;while(f--)g=m[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(k)&&(delete r.handle,n._removeData(a,"events"))}},trigger:function(b,c,e,f){var g,h,i,j,l,m,o,p=[e||d],q=k.call(b,"type")?b.type:b,r=k.call(b,"namespace")?b.namespace.split("."):[];if(i=m=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!na.test(q+n.event.triggered)&&(q.indexOf(".")>-1&&(r=q.split("."),q=r.shift(),r.sort()),h=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=r.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:n.makeArray(c,[b]),l=n.event.special[q]||{},f||!l.trigger||l.trigger.apply(e,c)!==!1)){if(!f&&!l.noBubble&&!n.isWindow(e)){for(j=l.delegateType||q,na.test(j+q)||(i=i.parentNode);i;i=i.parentNode)p.push(i),m=i;m===(e.ownerDocument||d)&&p.push(m.defaultView||m.parentWindow||a)}o=0;while((i=p[o++])&&!b.isPropagationStopped())b.type=o>1?j:l.bindType||q,g=(n._data(i,"events")||{})[b.type]&&n._data(i,"handle"),g&&g.apply(i,c),g=h&&i[h],g&&g.apply&&M(i)&&(b.result=g.apply(i,c),b.result===!1&&b.preventDefault());if(b.type=q,!f&&!b.isDefaultPrevented()&&(!l._default||l._default.apply(p.pop(),c)===!1)&&M(e)&&h&&e[q]&&!n.isWindow(e)){m=e[h],m&&(e[h]=null),n.event.triggered=q;try{e[q]()}catch(s){}n.event.triggered=void 0,m&&(e[h]=m)}return b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(n._data(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())a.rnamespace&&!a.rnamespace.test(g.namespace)||(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[n.expando])return a;var b,c,e,f=a.type,g=a,h=this.fixHooks[f];h||(this.fixHooks[f]=h=ma.test(f)?this.mouseHooks:la.test(f)?this.keyHooks:{}),e=h.props?this.props.concat(h.props):this.props,a=new n.Event(g),b=e.length;while(b--)c=e[b],a[c]=g[c];return a.target||(a.target=g.srcElement||d),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,h.filter?h.filter(a,g):a},props:"altKey bubbles cancelable ctrlKey currentTarget detail eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,e,f,g=b.button,h=b.fromElement;return null==a.pageX&&null!=b.clientX&&(e=a.target.ownerDocument||d,f=e.documentElement,c=e.body,a.pageX=b.clientX+(f&&f.scrollLeft||c&&c.scrollLeft||0)-(f&&f.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(f&&f.scrollTop||c&&c.scrollTop||0)-(f&&f.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&h&&(a.relatedTarget=h===a.target?b.toElement:h),a.which||void 0===g||(a.which=1&g?1:2&g?3:4&g?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==ra()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===ra()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return n.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c){var d=n.extend(new n.Event,c,{type:a,isSimulated:!0});n.event.trigger(d,null,b),d.isDefaultPrevented()&&c.preventDefault()}},n.removeEvent=d.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)}:function(a,b,c){var d="on"+b;a.detachEvent&&("undefined"==typeof a[d]&&(a[d]=null),a.detachEvent(d,c))},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?pa:qa):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={constructor:n.Event,isDefaultPrevented:qa,isPropagationStopped:qa,isImmediatePropagationStopped:qa,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=pa,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=pa,a&&!this.isSimulated&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=pa,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},n.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return e&&(e===d||n.contains(d,e))||(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),l.submit||(n.event.special.submit={setup:function(){return n.nodeName(this,"form")?!1:void n.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=n.nodeName(b,"input")||n.nodeName(b,"button")?n.prop(b,"form"):void 0;c&&!n._data(c,"submit")&&(n.event.add(c,"submit._submit",function(a){a._submitBubble=!0}),n._data(c,"submit",!0))})},postDispatch:function(a){a._submitBubble&&(delete a._submitBubble,this.parentNode&&!a.isTrigger&&n.event.simulate("submit",this.parentNode,a))},teardown:function(){return n.nodeName(this,"form")?!1:void n.event.remove(this,"._submit")}}),l.change||(n.event.special.change={setup:function(){return ka.test(this.nodeName)?("checkbox"!==this.type&&"radio"!==this.type||(n.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._justChanged=!0)}),n.event.add(this,"click._change",function(a){this._justChanged&&!a.isTrigger&&(this._justChanged=!1),n.event.simulate("change",this,a)})),!1):void n.event.add(this,"beforeactivate._change",function(a){var b=a.target;ka.test(b.nodeName)&&!n._data(b,"change")&&(n.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||n.event.simulate("change",this.parentNode,a)}),n._data(b,"change",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return n.event.remove(this,"._change"),!ka.test(this.nodeName)}}),l.focusin||n.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a))};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=n._data(d,b);e||d.addEventListener(a,c,!0),n._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=n._data(d,b)-1;e?n._data(d,b,e):(d.removeEventListener(a,c,!0),n._removeData(d,b))}}}),n.fn.extend({on:function(a,b,c,d){return sa(this,a,b,c,d)},one:function(a,b,c,d){return sa(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return b!==!1&&"function"!=typeof b||(c=b,b=void 0),c===!1&&(c=qa),this.each(function(){n.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}});var ta=/ jQuery\d+="(?:null|\d+)"/g,ua=new RegExp("<(?:"+ba+")[\\s/>]","i"),va=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,wa=/<script|<style|<link/i,xa=/checked\s*(?:[^=]|=\s*.checked.)/i,ya=/^true\/(.*)/,za=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,Aa=ca(d),Ba=Aa.appendChild(d.createElement("div"));function Ca(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function Da(a){return a.type=(null!==n.find.attr(a,"type"))+"/"+a.type,a}function Ea(a){var b=ya.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Fa(a,b){if(1===b.nodeType&&n.hasData(a)){var c,d,e,f=n._data(a),g=n._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)n.event.add(b,c,h[c][d])}g.data&&(g.data=n.extend({},g.data))}}function Ga(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!l.noCloneEvent&&b[n.expando]){e=n._data(b);for(d in e.events)n.removeEvent(b,d,e.handle);b.removeAttribute(n.expando)}"script"===c&&b.text!==a.text?(Da(b).text=a.text,Ea(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),l.html5Clone&&a.innerHTML&&!n.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&Z.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}}function Ha(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,m=0,o=a.length,p=o-1,q=b[0],r=n.isFunction(q);if(r||o>1&&"string"==typeof q&&!l.checkClone&&xa.test(q))return a.each(function(e){var f=a.eq(e);r&&(b[0]=q.call(this,e,f.html())),Ha(f,b,c,d)});if(o&&(k=ja(b,a[0].ownerDocument,!1,a,d),e=k.firstChild,1===k.childNodes.length&&(k=e),e||d)){for(i=n.map(ea(k,"script"),Da),h=i.length;o>m;m++)g=k,m!==p&&(g=n.clone(g,!0,!0),h&&n.merge(i,ea(g,"script"))),c.call(a[m],g,m);if(h)for(j=i[i.length-1].ownerDocument,n.map(i,Ea),m=0;h>m;m++)g=i[m],_.test(g.type||"")&&!n._data(g,"globalEval")&&n.contains(j,g)&&(g.src?n._evalUrl&&n._evalUrl(g.src):n.globalEval((g.text||g.textContent||g.innerHTML||"").replace(za,"")));k=e=null}return a}function Ia(a,b,c){for(var d,e=b?n.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||n.cleanData(ea(d)),d.parentNode&&(c&&n.contains(d.ownerDocument,d)&&fa(ea(d,"script")),d.parentNode.removeChild(d));return a}n.extend({htmlPrefilter:function(a){return a.replace(va,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h,i=n.contains(a.ownerDocument,a);if(l.html5Clone||n.isXMLDoc(a)||!ua.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(Ba.innerHTML=a.outerHTML,Ba.removeChild(f=Ba.firstChild)),!(l.noCloneEvent&&l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(d=ea(f),h=ea(a),g=0;null!=(e=h[g]);++g)d[g]&&Ga(e,d[g]);if(b)if(c)for(h=h||ea(a),d=d||ea(f),g=0;null!=(e=h[g]);g++)Fa(e,d[g]);else Fa(a,f);return d=ea(f,"script"),d.length>0&&fa(d,!i&&ea(a,"script")),d=h=e=null,f},cleanData:function(a,b){for(var d,e,f,g,h=0,i=n.expando,j=n.cache,k=l.attributes,m=n.event.special;null!=(d=a[h]);h++)if((b||M(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)m[e]?n.event.remove(d,e):n.removeEvent(d,e,g.handle);j[f]&&(delete j[f],k||"undefined"==typeof d.removeAttribute?d[i]=void 0:d.removeAttribute(i),c.push(f))}}}),n.fn.extend({domManip:Ha,detach:function(a){return Ia(this,a,!0)},remove:function(a){return Ia(this,a)},text:function(a){return Y(this,function(a){return void 0===a?n.text(this):this.empty().append((this[0]&&this[0].ownerDocument||d).createTextNode(a))},null,a,arguments.length)},append:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.appendChild(a)}})},prepend:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&n.cleanData(ea(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&n.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return Y(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(ta,""):void 0;if("string"==typeof a&&!wa.test(a)&&(l.htmlSerialize||!ua.test(a))&&(l.leadingWhitespace||!aa.test(a))&&!da[($.exec(a)||["",""])[1].toLowerCase()]){a=n.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(ea(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ha(this,arguments,function(b){var c=this.parentNode;n.inArray(this,a)<0&&(n.cleanData(ea(this)),c&&c.replaceChild(b,this))},a)}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=0,e=[],f=n(a),h=f.length-1;h>=d;d++)c=d===h?this:this.clone(!0),n(f[d])[b](c),g.apply(e,c.get());return this.pushStack(e)}});var Ja,Ka={HTML:"block",BODY:"block"};function La(a,b){var c=n(b.createElement(a)).appendTo(b.body),d=n.css(c[0],"display");return c.detach(),d}function Ma(a){var b=d,c=Ka[a];return c||(c=La(a,b),"none"!==c&&c||(Ja=(Ja||n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Ja[0].contentWindow||Ja[0].contentDocument).document,b.write(),b.close(),c=La(a,b),Ja.detach()),Ka[a]=c),c}var Na=/^margin/,Oa=new RegExp("^("+T+")(?!px)[a-z%]+$","i"),Pa=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e},Qa=d.documentElement;!function(){var b,c,e,f,g,h,i=d.createElement("div"),j=d.createElement("div");if(j.style){j.style.cssText="float:left;opacity:.5",l.opacity="0.5"===j.style.opacity,l.cssFloat=!!j.style.cssFloat,j.style.backgroundClip="content-box",j.cloneNode(!0).style.backgroundClip="",l.clearCloneStyle="content-box"===j.style.backgroundClip,i=d.createElement("div"),i.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",j.innerHTML="",i.appendChild(j),l.boxSizing=""===j.style.boxSizing||""===j.style.MozBoxSizing||""===j.style.WebkitBoxSizing,n.extend(l,{reliableHiddenOffsets:function(){return null==b&&k(),f},boxSizingReliable:function(){return null==b&&k(),e},pixelMarginRight:function(){return null==b&&k(),c},pixelPosition:function(){return null==b&&k(),b},reliableMarginRight:function(){return null==b&&k(),g},reliableMarginLeft:function(){return null==b&&k(),h}});function k(){var k,l,m=d.documentElement;m.appendChild(i),j.style.cssText="-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",b=e=h=!1,c=g=!0,a.getComputedStyle&&(l=a.getComputedStyle(j),b="1%"!==(l||{}).top,h="2px"===(l||{}).marginLeft,e="4px"===(l||{width:"4px"}).width,j.style.marginRight="50%",c="4px"===(l||{marginRight:"4px"}).marginRight,k=j.appendChild(d.createElement("div")),k.style.cssText=j.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",k.style.marginRight=k.style.width="0",j.style.width="1px",g=!parseFloat((a.getComputedStyle(k)||{}).marginRight),j.removeChild(k)),j.style.display="none",f=0===j.getClientRects().length,f&&(j.style.display="",j.innerHTML="<table><tr><td></td><td>t</td></tr></table>",j.childNodes[0].style.borderCollapse="separate",k=j.getElementsByTagName("td"),k[0].style.cssText="margin:0;border:0;padding:0;display:none",f=0===k[0].offsetHeight,f&&(k[0].style.display="",k[1].style.display="none",f=0===k[0].offsetHeight)),m.removeChild(i)}}}();var Ra,Sa,Ta=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ra=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)},Sa=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ra(a),g=c?c.getPropertyValue(b)||c[b]:void 0,""!==g&&void 0!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),c&&!l.pixelMarginRight()&&Oa.test(g)&&Na.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f),void 0===g?g:g+""}):Qa.currentStyle&&(Ra=function(a){return a.currentStyle},Sa=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ra(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Oa.test(g)&&!Ta.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function Ua(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Va=/alpha\([^)]*\)/i,Wa=/opacity\s*=\s*([^)]*)/i,Xa=/^(none|table(?!-c[ea]).+)/,Ya=new RegExp("^("+T+")(.*)$","i"),Za={position:"absolute",visibility:"hidden",display:"block"},$a={letterSpacing:"0",fontWeight:"400"},_a=["Webkit","O","Moz","ms"],ab=d.createElement("div").style;function bb(a){if(a in ab)return a;var b=a.charAt(0).toUpperCase()+a.slice(1),c=_a.length;while(c--)if(a=_a[c]+b,a in ab)return a}function cb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=n._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&W(d)&&(f[g]=n._data(d,"olddisplay",Ma(d.nodeName)))):(e=W(d),(c&&"none"!==c||!e)&&n._data(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function db(a,b,c){var d=Ya.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function eb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+V[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+V[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+V[f]+"Width",!0,e))):(g+=n.css(a,"padding"+V[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+V[f]+"Width",!0,e)));return g}function fb(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ra(a),g=l.boxSizing&&"border-box"===n.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Sa(a,b,f),(0>e||null==e)&&(e=a.style[b]),Oa.test(e))return e;d=g&&(l.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+eb(a,b,c||(g?"border":"content"),d,f)+"px"}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Sa(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":l.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;if(b=n.cssProps[h]||(n.cssProps[h]=bb(h)||h),g=n.cssHooks[b]||n.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=U.exec(c))&&e[1]&&(c=X(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(n.cssNumber[h]?"":"px")),l.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=bb(h)||h),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Sa(a,b,d)),"normal"===f&&b in $a&&(f=$a[b]),""===c||c?(e=parseFloat(f),c===!0||isFinite(e)?e||0:f):f}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?Xa.test(n.css(a,"display"))&&0===a.offsetWidth?Pa(a,Za,function(){return fb(a,b,d)}):fb(a,b,d):void 0},set:function(a,c,d){var e=d&&Ra(a);return db(a,c,d?eb(a,b,d,l.boxSizing&&"border-box"===n.css(a,"boxSizing",!1,e),e):0)}}}),l.opacity||(n.cssHooks.opacity={get:function(a,b){return Wa.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=n.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===n.trim(f.replace(Va,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Va.test(f)?f.replace(Va,e):f+" "+e)}}),n.cssHooks.marginRight=Ua(l.reliableMarginRight,function(a,b){return b?Pa(a,{display:"inline-block"},Sa,[a,"marginRight"]):void 0}),n.cssHooks.marginLeft=Ua(l.reliableMarginLeft,function(a,b){return b?(parseFloat(Sa(a,"marginLeft"))||(n.contains(a.ownerDocument,a)?a.getBoundingClientRect().left-Pa(a,{
+marginLeft:0},function(){return a.getBoundingClientRect().left}):0))+"px":void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+V[d]+b]=f[d]||f[d-2]||f[0];return e}},Na.test(a)||(n.cssHooks[a+b].set=db)}),n.fn.extend({css:function(a,b){return Y(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=Ra(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)},a,b,arguments.length>1)},show:function(){return cb(this,!0)},hide:function(){return cb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){W(this)?n(this).show():n(this).hide()})}});function gb(a,b,c,d,e){return new gb.prototype.init(a,b,c,d,e)}n.Tween=gb,gb.prototype={constructor:gb,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||n.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=gb.propHooks[this.prop];return a&&a.get?a.get(this):gb.propHooks._default.get(this)},run:function(a){var b,c=gb.propHooks[this.prop];return this.options.duration?this.pos=b=n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):gb.propHooks._default.set(this),this}},gb.prototype.init.prototype=gb.prototype,gb.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[n.cssProps[a.prop]]&&!n.cssHooks[a.prop]?a.elem[a.prop]=a.now:n.style(a.elem,a.prop,a.now+a.unit)}}},gb.propHooks.scrollTop=gb.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},n.fx=gb.prototype.init,n.fx.step={};var hb,ib,jb=/^(?:toggle|show|hide)$/,kb=/queueHooks$/;function lb(){return a.setTimeout(function(){hb=void 0}),hb=n.now()}function mb(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=V[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function nb(a,b,c){for(var d,e=(qb.tweeners[b]||[]).concat(qb.tweeners["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ob(a,b,c){var d,e,f,g,h,i,j,k,m=this,o={},p=a.style,q=a.nodeType&&W(a),r=n._data(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,m.always(function(){m.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=n.css(a,"display"),k="none"===j?n._data(a,"olddisplay")||Ma(a.nodeName):j,"inline"===k&&"none"===n.css(a,"float")&&(l.inlineBlockNeedsLayout&&"inline"!==Ma(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",l.shrinkWrapBlocks()||m.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],jb.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||n.style(a,d)}else j=void 0;if(n.isEmptyObject(o))"inline"===("none"===j?Ma(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=n._data(a,"fxshow",{}),f&&(r.hidden=!q),q?n(a).show():m.done(function(){n(a).hide()}),m.done(function(){var b;n._removeData(a,"fxshow");for(b in o)n.style(a,b,o[b])});for(d in o)g=nb(q?r[d]:0,d,m),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function pb(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function qb(a,b,c){var d,e,f=0,g=qb.prefilters.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=hb||lb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{},easing:n.easing._default},c),originalProperties:b,originalOptions:c,startTime:hb||lb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for(pb(k,j.opts.specialEasing);g>f;f++)if(d=qb.prefilters[f].call(j,a,k,j.opts))return n.isFunction(d.stop)&&(n._queueHooks(j.elem,j.opts.queue).stop=n.proxy(d.stop,d)),d;return n.map(k,nb,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(qb,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return X(c.elem,a,U.exec(b),c),c}]},tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.match(G);for(var c,d=0,e=a.length;e>d;d++)c=a[d],qb.tweeners[c]=qb.tweeners[c]||[],qb.tweeners[c].unshift(b)},prefilters:[ob],prefilter:function(a,b){b?qb.prefilters.unshift(a):qb.prefilters.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,null!=d.queue&&d.queue!==!0||(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(W).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=qb(this,n.extend({},a),f);(e||n._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=n._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&kb.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));!b&&c||n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=n._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(mb(b,!0),a,d,e)}}),n.each({slideDown:mb("show"),slideUp:mb("hide"),slideToggle:mb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=n.timers,c=0;for(hb=n.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||n.fx.stop(),hb=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){ib||(ib=a.setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){a.clearInterval(ib),ib=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(b,c){return b=n.fx?n.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a,b=d.createElement("input"),c=d.createElement("div"),e=d.createElement("select"),f=e.appendChild(d.createElement("option"));c=d.createElement("div"),c.setAttribute("className","t"),c.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",a=c.getElementsByTagName("a")[0],b.setAttribute("type","checkbox"),c.appendChild(b),a=c.getElementsByTagName("a")[0],a.style.cssText="top:1px",l.getSetAttribute="t"!==c.className,l.style=/top/.test(a.getAttribute("style")),l.hrefNormalized="/a"===a.getAttribute("href"),l.checkOn=!!b.value,l.optSelected=f.selected,l.enctype=!!d.createElement("form").enctype,e.disabled=!0,l.optDisabled=!f.disabled,b=d.createElement("input"),b.setAttribute("value",""),l.input=""===b.getAttribute("value"),b.value="t",b.setAttribute("type","radio"),l.radioValue="t"===b.value}();var rb=/\r/g,sb=/[\x20\t\r\n\f]+/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(rb,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,"value");return null!=b?b:n.trim(n.text(a)).replace(sb," ")}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],(c.selected||i===e)&&(l.optDisabled?!c.disabled:null===c.getAttribute("disabled"))&&(!c.parentNode.disabled||!n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)if(d=e[g],n.inArray(n.valHooks.option.get(d),f)>-1)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>-1:void 0}},l.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var tb,ub,vb=n.expr.attrHandle,wb=/^(?:checked|selected)$/i,xb=l.getSetAttribute,yb=l.input;n.fn.extend({attr:function(a,b){return Y(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),e=n.attrHooks[b]||(n.expr.match.bool.test(b)?ub:tb)),void 0!==c?null===c?void n.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=n.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!l.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(G);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)?yb&&xb||!wb.test(c)?a[d]=!1:a[n.camelCase("default-"+c)]=a[d]=!1:n.attr(a,c,""),a.removeAttribute(xb?c:d)}}),ub={set:function(a,b,c){return b===!1?n.removeAttr(a,c):yb&&xb||!wb.test(c)?a.setAttribute(!xb&&n.propFix[c]||c,c):a[n.camelCase("default-"+c)]=a[c]=!0,c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=vb[b]||n.find.attr;yb&&xb||!wb.test(b)?vb[b]=function(a,b,d){var e,f;return d||(f=vb[b],vb[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,vb[b]=f),e}:vb[b]=function(a,b,c){return c?void 0:a[n.camelCase("default-"+b)]?b.toLowerCase():null}}),yb&&xb||(n.attrHooks.value={set:function(a,b,c){return n.nodeName(a,"input")?void(a.defaultValue=b):tb&&tb.set(a,b,c)}}),xb||(tb={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},vb.id=vb.name=vb.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},n.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:tb.set},n.attrHooks.contenteditable={set:function(a,b,c){tb.set(a,""===b?!1:b,c)}},n.each(["width","height"],function(a,b){n.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),l.style||(n.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var zb=/^(?:input|select|textarea|button|object)$/i,Ab=/^(?:a|area)$/i;n.fn.extend({prop:function(a,b){return Y(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return a=n.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),n.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&n.isXMLDoc(a)||(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=n.find.attr(a,"tabindex");return b?parseInt(b,10):zb.test(a.nodeName)||Ab.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),l.hrefNormalized||n.each(["href","src"],function(a,b){n.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),l.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this}),l.enctype||(n.propFix.enctype="encoding");var Bb=/[\t\r\n\f]/g;function Cb(a){return n.attr(a,"class")||""}n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,Cb(this)))});if("string"==typeof a&&a){b=a.match(G)||[];while(c=this[i++])if(e=Cb(c),d=1===c.nodeType&&(" "+e+" ").replace(Bb," ")){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=n.trim(d),e!==h&&n.attr(c,"class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,Cb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(G)||[];while(c=this[i++])if(e=Cb(c),d=1===c.nodeType&&(" "+e+" ").replace(Bb," ")){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=n.trim(d),e!==h&&n.attr(c,"class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):n.isFunction(a)?this.each(function(c){n(this).toggleClass(a.call(this,c,Cb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=n(this),f=a.match(G)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=Cb(this),b&&n._data(this,"__className__",b),n.attr(this,"class",b||a===!1?"":n._data(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+Cb(c)+" ").replace(Bb," ").indexOf(b)>-1)return!0;return!1}}),n.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Db=a.location,Eb=n.now(),Fb=/\?/,Gb=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;n.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=n.trim(b+"");return e&&!n.trim(e.replace(Gb,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():n.error("Invalid JSON: "+b)},n.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new a.DOMParser,c=d.parseFromString(b,"text/xml")):(c=new a.ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||n.error("Invalid XML: "+b),c};var Hb=/#.*$/,Ib=/([?&])_=[^&]*/,Jb=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Kb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Lb=/^(?:GET|HEAD)$/,Mb=/^\/\//,Nb=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Ob={},Pb={},Qb="*/".concat("*"),Rb=Db.href,Sb=Nb.exec(Rb.toLowerCase())||[];function Tb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(G)||[];if(n.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Ub(a,b,c,d){var e={},f=a===Pb;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Vb(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&n.extend(!0,a,c),a}function Wb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Xb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Rb,type:"GET",isLocal:Kb.test(Sb[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Qb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Vb(Vb(a,n.ajaxSettings),b):Vb(n.ajaxSettings,a)},ajaxPrefilter:Tb(Ob),ajaxTransport:Tb(Pb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var d,e,f,g,h,i,j,k,l=n.ajaxSetup({},c),m=l.context||l,o=l.context&&(m.nodeType||m.jquery)?n(m):n.event,p=n.Deferred(),q=n.Callbacks("once memory"),r=l.statusCode||{},s={},t={},u=0,v="canceled",w={readyState:0,getResponseHeader:function(a){var b;if(2===u){if(!k){k={};while(b=Jb.exec(g))k[b[1].toLowerCase()]=b[2]}b=k[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===u?g:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return u||(a=t[c]=t[c]||a,s[a]=b),this},overrideMimeType:function(a){return u||(l.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>u)for(b in a)r[b]=[r[b],a[b]];else w.always(a[w.status]);return this},abort:function(a){var b=a||v;return j&&j.abort(b),y(0,b),this}};if(p.promise(w).complete=q.add,w.success=w.done,w.error=w.fail,l.url=((b||l.url||Rb)+"").replace(Hb,"").replace(Mb,Sb[1]+"//"),l.type=c.method||c.type||l.method||l.type,l.dataTypes=n.trim(l.dataType||"*").toLowerCase().match(G)||[""],null==l.crossDomain&&(d=Nb.exec(l.url.toLowerCase()),l.crossDomain=!(!d||d[1]===Sb[1]&&d[2]===Sb[2]&&(d[3]||("http:"===d[1]?"80":"443"))===(Sb[3]||("http:"===Sb[1]?"80":"443")))),l.data&&l.processData&&"string"!=typeof l.data&&(l.data=n.param(l.data,l.traditional)),Ub(Ob,l,c,w),2===u)return w;i=n.event&&l.global,i&&0===n.active++&&n.event.trigger("ajaxStart"),l.type=l.type.toUpperCase(),l.hasContent=!Lb.test(l.type),f=l.url,l.hasContent||(l.data&&(f=l.url+=(Fb.test(f)?"&":"?")+l.data,delete l.data),l.cache===!1&&(l.url=Ib.test(f)?f.replace(Ib,"$1_="+Eb++):f+(Fb.test(f)?"&":"?")+"_="+Eb++)),l.ifModified&&(n.lastModified[f]&&w.setRequestHeader("If-Modified-Since",n.lastModified[f]),n.etag[f]&&w.setRequestHeader("If-None-Match",n.etag[f])),(l.data&&l.hasContent&&l.contentType!==!1||c.contentType)&&w.setRequestHeader("Content-Type",l.contentType),w.setRequestHeader("Accept",l.dataTypes[0]&&l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+("*"!==l.dataTypes[0]?", "+Qb+"; q=0.01":""):l.accepts["*"]);for(e in l.headers)w.setRequestHeader(e,l.headers[e]);if(l.beforeSend&&(l.beforeSend.call(m,w,l)===!1||2===u))return w.abort();v="abort";for(e in{success:1,error:1,complete:1})w[e](l[e]);if(j=Ub(Pb,l,c,w)){if(w.readyState=1,i&&o.trigger("ajaxSend",[w,l]),2===u)return w;l.async&&l.timeout>0&&(h=a.setTimeout(function(){w.abort("timeout")},l.timeout));try{u=1,j.send(s,y)}catch(x){if(!(2>u))throw x;y(-1,x)}}else y(-1,"No Transport");function y(b,c,d,e){var k,s,t,v,x,y=c;2!==u&&(u=2,h&&a.clearTimeout(h),j=void 0,g=e||"",w.readyState=b>0?4:0,k=b>=200&&300>b||304===b,d&&(v=Wb(l,w,d)),v=Xb(l,v,w,k),k?(l.ifModified&&(x=w.getResponseHeader("Last-Modified"),x&&(n.lastModified[f]=x),x=w.getResponseHeader("etag"),x&&(n.etag[f]=x)),204===b||"HEAD"===l.type?y="nocontent":304===b?y="notmodified":(y=v.state,s=v.data,t=v.error,k=!t)):(t=y,!b&&y||(y="error",0>b&&(b=0))),w.status=b,w.statusText=(c||y)+"",k?p.resolveWith(m,[s,y,w]):p.rejectWith(m,[w,y,t]),w.statusCode(r),r=void 0,i&&o.trigger(k?"ajaxSuccess":"ajaxError",[w,l,k?s:t]),q.fireWith(m,[w,y]),i&&(o.trigger("ajaxComplete",[w,l]),--n.active||n.event.trigger("ajaxStop")))}return w},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax(n.extend({url:a,type:b,dataType:e,data:c,success:d},n.isPlainObject(a)&&a))}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){if(n.isFunction(a))return this.each(function(b){n(this).wrapAll(a.call(this,b))});if(this[0]){var b=n(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return n.isFunction(a)?this.each(function(b){n(this).wrapInner(a.call(this,b))}):this.each(function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}});function Yb(a){return a.style&&a.style.display||n.css(a,"display")}function Zb(a){if(!n.contains(a.ownerDocument||d,a))return!0;while(a&&1===a.nodeType){if("none"===Yb(a)||"hidden"===a.type)return!0;a=a.parentNode}return!1}n.expr.filters.hidden=function(a){return l.reliableHiddenOffsets()?a.offsetWidth<=0&&a.offsetHeight<=0&&!a.getClientRects().length:Zb(a)},n.expr.filters.visible=function(a){return!n.expr.filters.hidden(a)};var $b=/%20/g,_b=/\[\]$/,ac=/\r?\n/g,bc=/^(?:submit|button|image|reset|file)$/i,cc=/^(?:input|select|textarea|keygen)/i;function dc(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||_b.test(a)?d(a,e):dc(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)dc(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)dc(c,a[c],b,e);return d.join("&").replace($b,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&cc.test(this.nodeName)&&!bc.test(a)&&(this.checked||!Z.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(ac,"\r\n")}}):{name:b.name,value:c.replace(ac,"\r\n")}}).get()}}),n.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return this.isLocal?ic():d.documentMode>8?hc():/^(get|post|head|put|delete|options)$/i.test(this.type)&&hc()||ic()}:hc;var ec=0,fc={},gc=n.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in fc)fc[a](void 0,!0)}),l.cors=!!gc&&"withCredentials"in gc,gc=l.ajax=!!gc,gc&&n.ajaxTransport(function(b){if(!b.crossDomain||l.cors){var c;return{send:function(d,e){var f,g=b.xhr(),h=++ec;if(g.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(f in b.xhrFields)g[f]=b.xhrFields[f];b.mimeType&&g.overrideMimeType&&g.overrideMimeType(b.mimeType),b.crossDomain||d["X-Requested-With"]||(d["X-Requested-With"]="XMLHttpRequest");for(f in d)void 0!==d[f]&&g.setRequestHeader(f,d[f]+"");g.send(b.hasContent&&b.data||null),c=function(a,d){var f,i,j;if(c&&(d||4===g.readyState))if(delete fc[h],c=void 0,g.onreadystatechange=n.noop,d)4!==g.readyState&&g.abort();else{j={},f=g.status,"string"==typeof g.responseText&&(j.text=g.responseText);try{i=g.statusText}catch(k){i=""}f||!b.isLocal||b.crossDomain?1223===f&&(f=204):f=j.text?200:404}j&&e(f,i,j,g.getAllResponseHeaders())},b.async?4===g.readyState?a.setTimeout(c):g.onreadystatechange=fc[h]=c:c()},abort:function(){c&&c(void 0,!0)}}}});function hc(){try{return new a.XMLHttpRequest}catch(b){}}function ic(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=d.head||n("head")[0]||d.documentElement;return{send:function(e,f){b=d.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||f(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var jc=[],kc=/(=)\?(?=&|$)|\?\?/;n.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=jc.pop()||n.expando+"_"+Eb++;return this[a]=!0,a}}),n.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(kc.test(b.url)?"url":"string"==typeof b.data&&0===(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&kc.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(kc,"$1"+e):b.jsonp!==!1&&(b.url+=(Fb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||n.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){void 0===f?n(a).removeProp(e):a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,jc.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),n.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||d;var e=x.exec(a),f=!c&&[];return e?[b.createElement(e[1])]:(e=ja([a],b,f),f&&f.length&&n(f).remove(),n.merge([],e.childNodes))};var lc=n.fn.load;n.fn.load=function(a,b,c){if("string"!=typeof a&&lc)return lc.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>-1&&(d=n.trim(a.slice(h,a.length)),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&n.ajax({url:a,type:e||"GET",dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?n("<div>").append(n.parseHTML(a)).find(d):a)}).always(c&&function(a,b){g.each(function(){c.apply(this,f||[a.responseText,b,a])})}),this},n.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};function mc(a){return n.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,"position"),l=n(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=n.css(a,"top"),i=n.css(a,"left"),j=("absolute"===k||"fixed"===k)&&n.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,n.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,n.contains(b,e)?("undefined"!=typeof e.getBoundingClientRect&&(d=e.getBoundingClientRect()),c=mc(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===n.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],"html")||(c=a.offset()),c.top+=n.css(a[0],"borderTopWidth",!0),c.left+=n.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-n.css(d,"marginTop",!0),left:b.left-c.left-n.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&!n.nodeName(a,"html")&&"static"===n.css(a,"position"))a=a.offsetParent;return a||Qa})}}),n.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);n.fn[a]=function(d){return Y(this,function(a,d,e){var f=mc(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?n(f).scrollLeft():e,c?e:n(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),n.each(["top","left"],function(a,b){n.cssHooks[b]=Ua(l.pixelPosition,function(a,c){return c?(c=Sa(a,b),Oa.test(c)?n(a).position()[b]+"px":c):void 0})}),n.each({Height:"height",Width:"width"},function(a,b){n.each({
+padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return Y(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}}),n.fn.size=function(){return this.length},n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var nc=a.jQuery,oc=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=oc),b&&a.jQuery===n&&(a.jQuery=nc),n},b||(a.jQuery=a.$=n),n});
diff --git a/Source/platformProject/platform2022UI/jslib/jquery/jquery-1.8.2.min.js b/Source/platformProject/platform2022UI/jslib/jquery/jquery-1.8.2.min.js
new file mode 100644
index 0000000..bdea953
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/jquery/jquery-1.8.2.min.js
@@ -0,0 +1,2 @@
+/*! jQuery v1.8.2 jquery.com | jquery.org/license */
+(function(a,b){function G(a){var b=F[a]={};return p.each(a.split(s),function(a,c){b[c]=!0}),b}function J(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(I,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:+d+""===d?+d:H.test(d)?p.parseJSON(d):d}catch(f){}p.data(a,c,d)}else d=b}return d}function K(a){var b;for(b in a){if(b==="data"&&p.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function ba(){return!1}function bb(){return!0}function bh(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function bi(a,b){do a=a[b];while(a&&a.nodeType!==1);return a}function bj(a,b,c){b=b||0;if(p.isFunction(b))return p.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return p.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=p.grep(a,function(a){return a.nodeType===1});if(be.test(b))return p.filter(b,d,!c);b=p.filter(b,d)}return p.grep(a,function(a,d){return p.inArray(a,b)>=0===c})}function bk(a){var b=bl.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function bC(a,b){return a.getElementsByTagName(b)[0]||a.appendChild(a.ownerDocument.createElement(b))}function bD(a,b){if(b.nodeType!==1||!p.hasData(a))return;var c,d,e,f=p._data(a),g=p._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;d<e;d++)p.event.add(b,c,h[c][d])}g.data&&(g.data=p.extend({},g.data))}function bE(a,b){var c;if(b.nodeType!==1)return;b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase(),c==="object"?(b.parentNode&&(b.outerHTML=a.outerHTML),p.support.html5Clone&&a.innerHTML&&!p.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):c==="input"&&bv.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):c==="option"?b.selected=a.defaultSelected:c==="input"||c==="textarea"?b.defaultValue=a.defaultValue:c==="script"&&b.text!==a.text&&(b.text=a.text),b.removeAttribute(p.expando)}function bF(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bG(a){bv.test(a.type)&&(a.defaultChecked=a.checked)}function bY(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=bW.length;while(e--){b=bW[e]+c;if(b in a)return b}return d}function bZ(a,b){return a=b||a,p.css(a,"display")==="none"||!p.contains(a.ownerDocument,a)}function b$(a,b){var c,d,e=[],f=0,g=a.length;for(;f<g;f++){c=a[f];if(!c.style)continue;e[f]=p._data(c,"olddisplay"),b?(!e[f]&&c.style.display==="none"&&(c.style.display=""),c.style.display===""&&bZ(c)&&(e[f]=p._data(c,"olddisplay",cc(c.nodeName)))):(d=bH(c,"display"),!e[f]&&d!=="none"&&p._data(c,"olddisplay",d))}for(f=0;f<g;f++){c=a[f];if(!c.style)continue;if(!b||c.style.display==="none"||c.style.display==="")c.style.display=b?e[f]||"":"none"}return a}function b_(a,b,c){var d=bP.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function ca(a,b,c,d){var e=c===(d?"border":"content")?4:b==="width"?1:0,f=0;for(;e<4;e+=2)c==="margin"&&(f+=p.css(a,c+bV[e],!0)),d?(c==="content"&&(f-=parseFloat(bH(a,"padding"+bV[e]))||0),c!=="margin"&&(f-=parseFloat(bH(a,"border"+bV[e]+"Width"))||0)):(f+=parseFloat(bH(a,"padding"+bV[e]))||0,c!=="padding"&&(f+=parseFloat(bH(a,"border"+bV[e]+"Width"))||0));return f}function cb(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=!0,f=p.support.boxSizing&&p.css(a,"boxSizing")==="border-box";if(d<=0||d==null){d=bH(a,b);if(d<0||d==null)d=a.style[b];if(bQ.test(d))return d;e=f&&(p.support.boxSizingReliable||d===a.style[b]),d=parseFloat(d)||0}return d+ca(a,b,c||(f?"border":"content"),e)+"px"}function cc(a){if(bS[a])return bS[a];var b=p("<"+a+">").appendTo(e.body),c=b.css("display");b.remove();if(c==="none"||c===""){bI=e.body.appendChild(bI||p.extend(e.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!bJ||!bI.createElement)bJ=(bI.contentWindow||bI.contentDocument).document,bJ.write("<!doctype html><html><body>"),bJ.close();b=bJ.body.appendChild(bJ.createElement(a)),c=bH(b,"display"),e.body.removeChild(bI)}return bS[a]=c,c}function ci(a,b,c,d){var e;if(p.isArray(b))p.each(b,function(b,e){c||ce.test(a)?d(a,e):ci(a+"["+(typeof e=="object"?b:"")+"]",e,c,d)});else if(!c&&p.type(b)==="object")for(e in b)ci(a+"["+e+"]",b[e],c,d);else d(a,b)}function cz(a){return function(b,c){typeof b!="string"&&(c=b,b="*");var d,e,f,g=b.toLowerCase().split(s),h=0,i=g.length;if(p.isFunction(c))for(;h<i;h++)d=g[h],f=/^\+/.test(d),f&&(d=d.substr(1)||"*"),e=a[d]=a[d]||[],e[f?"unshift":"push"](c)}}function cA(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h,i=a[f],j=0,k=i?i.length:0,l=a===cv;for(;j<k&&(l||!h);j++)h=i[j](c,d,e),typeof h=="string"&&(!l||g[h]?h=b:(c.dataTypes.unshift(h),h=cA(a,c,d,e,h,g)));return(l||!h)&&!g["*"]&&(h=cA(a,c,d,e,"*",g)),h}function cB(a,c){var d,e,f=p.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((f[d]?a:e||(e={}))[d]=c[d]);e&&p.extend(!0,a,e)}function cC(a,c,d){var e,f,g,h,i=a.contents,j=a.dataTypes,k=a.responseFields;for(f in k)f in d&&(c[k[f]]=d[f]);while(j[0]==="*")j.shift(),e===b&&(e=a.mimeType||c.getResponseHeader("content-type"));if(e)for(f in i)if(i[f]&&i[f].test(e)){j.unshift(f);break}if(j[0]in d)g=j[0];else{for(f in d){if(!j[0]||a.converters[f+" "+j[0]]){g=f;break}h||(h=f)}g=g||h}if(g)return g!==j[0]&&j.unshift(g),d[g]}function cD(a,b){var c,d,e,f,g=a.dataTypes.slice(),h=g[0],i={},j=0;a.dataFilter&&(b=a.dataFilter(b,a.dataType));if(g[1])for(c in a.converters)i[c.toLowerCase()]=a.converters[c];for(;e=g[++j];)if(e!=="*"){if(h!=="*"&&h!==e){c=i[h+" "+e]||i["* "+e];if(!c)for(d in i){f=d.split(" ");if(f[1]===e){c=i[h+" "+f[0]]||i["* "+f[0]];if(c){c===!0?c=i[d]:i[d]!==!0&&(e=f[0],g.splice(j--,0,e));break}}}if(c!==!0)if(c&&a["throws"])b=c(b);else try{b=c(b)}catch(k){return{state:"parsererror",error:c?k:"No conversion from "+h+" to "+e}}}h=e}return{state:"success",data:b}}function cL(){try{return new a.XMLHttpRequest}catch(b){}}function cM(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function cU(){return setTimeout(function(){cN=b},0),cN=p.now()}function cV(a,b){p.each(b,function(b,c){var d=(cT[b]||[]).concat(cT["*"]),e=0,f=d.length;for(;e<f;e++)if(d[e].call(a,b,c))return})}function cW(a,b,c){var d,e=0,f=0,g=cS.length,h=p.Deferred().always(function(){delete i.elem}),i=function(){var b=cN||cU(),c=Math.max(0,j.startTime+j.duration-b),d=1-(c/j.duration||0),e=0,f=j.tweens.length;for(;e<f;e++)j.tweens[e].run(d);return h.notifyWith(a,[j,d,c]),d<1&&f?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:p.extend({},b),opts:p.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:cN||cU(),duration:c.duration,tweens:[],createTween:function(b,c,d){var e=p.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(e),e},stop:function(b){var c=0,d=b?j.tweens.length:0;for(;c<d;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;cX(k,j.opts.specialEasing);for(;e<g;e++){d=cS[e].call(j,a,k,j.opts);if(d)return d}return cV(j,k),p.isFunction(j.opts.start)&&j.opts.start.call(a,j),p.fx.timer(p.extend(i,{anim:j,queue:j.opts.queue,elem:a})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}function cX(a,b){var c,d,e,f,g;for(c in a){d=p.camelCase(c),e=b[d],f=a[c],p.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=p.cssHooks[d];if(g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}}function cY(a,b,c){var d,e,f,g,h,i,j,k,l=this,m=a.style,n={},o=[],q=a.nodeType&&bZ(a);c.queue||(j=p._queueHooks(a,"fx"),j.unqueued==null&&(j.unqueued=0,k=j.empty.fire,j.empty.fire=function(){j.unqueued||k()}),j.unqueued++,l.always(function(){l.always(function(){j.unqueued--,p.queue(a,"fx").length||j.empty.fire()})})),a.nodeType===1&&("height"in b||"width"in b)&&(c.overflow=[m.overflow,m.overflowX,m.overflowY],p.css(a,"display")==="inline"&&p.css(a,"float")==="none"&&(!p.support.inlineBlockNeedsLayout||cc(a.nodeName)==="inline"?m.display="inline-block":m.zoom=1)),c.overflow&&(m.overflow="hidden",p.support.shrinkWrapBlocks||l.done(function(){m.overflow=c.overflow[0],m.overflowX=c.overflow[1],m.overflowY=c.overflow[2]}));for(d in b){f=b[d];if(cP.exec(f)){delete b[d];if(f===(q?"hide":"show"))continue;o.push(d)}}g=o.length;if(g){h=p._data(a,"fxshow")||p._data(a,"fxshow",{}),q?p(a).show():l.done(function(){p(a).hide()}),l.done(function(){var b;p.removeData(a,"fxshow",!0);for(b in n)p.style(a,b,n[b])});for(d=0;d<g;d++)e=o[d],i=l.createTween(e,q?h[e]:0),n[e]=h[e]||p.style(a,e),e in h||(h[e]=i.start,q&&(i.end=i.start,i.start=e==="width"||e==="height"?1:0))}}function cZ(a,b,c,d,e){return new cZ.prototype.init(a,b,c,d,e)}function c$(a,b){var c,d={height:a},e=0;b=b?1:0;for(;e<4;e+=2-b)c=bV[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function da(a){return p.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}var c,d,e=a.document,f=a.location,g=a.navigator,h=a.jQuery,i=a.$,j=Array.prototype.push,k=Array.prototype.slice,l=Array.prototype.indexOf,m=Object.prototype.toString,n=Object.prototype.hasOwnProperty,o=String.prototype.trim,p=function(a,b){return new p.fn.init(a,b,c)},q=/[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,r=/\S/,s=/\s+/,t=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,u=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^[\],:{}\s]*$/,x=/(?:^|:|,)(?:\s*\[)+/g,y=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,z=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,A=/^-ms-/,B=/-([\da-z])/gi,C=function(a,b){return(b+"").toUpperCase()},D=function(){e.addEventListener?(e.removeEventListener("DOMContentLoaded",D,!1),p.ready()):e.readyState==="complete"&&(e.detachEvent("onreadystatechange",D),p.ready())},E={};p.fn=p.prototype={constructor:p,init:function(a,c,d){var f,g,h,i;if(!a)return this;if(a.nodeType)return this.context=this[0]=a,this.length=1,this;if(typeof a=="string"){a.charAt(0)==="<"&&a.charAt(a.length-1)===">"&&a.length>=3?f=[null,a,null]:f=u.exec(a);if(f&&(f[1]||!c)){if(f[1])return c=c instanceof p?c[0]:c,i=c&&c.nodeType?c.ownerDocument||c:e,a=p.parseHTML(f[1],i,!0),v.test(f[1])&&p.isPlainObject(c)&&this.attr.call(a,c,!0),p.merge(this,a);g=e.getElementById(f[2]);if(g&&g.parentNode){if(g.id!==f[2])return d.find(a);this.length=1,this[0]=g}return this.context=e,this.selector=a,this}return!c||c.jquery?(c||d).find(a):this.constructor(c).find(a)}return p.isFunction(a)?d.ready(a):(a.selector!==b&&(this.selector=a.selector,this.context=a.context),p.makeArray(a,this))},selector:"",jquery:"1.8.2",length:0,size:function(){return this.length},toArray:function(){return k.call(this)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=p.merge(this.constructor(),a);return d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")"),d},each:function(a,b){return p.each(this,a,b)},ready:function(a){return p.ready.promise().done(a),this},eq:function(a){return a=+a,a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(k.apply(this,arguments),"slice",k.call(arguments).join(","))},map:function(a){return this.pushStack(p.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:j,sort:[].sort,splice:[].splice},p.fn.init.prototype=p.fn,p.extend=p.fn.extend=function(){var a,c,d,e,f,g,h=arguments[0]||{},i=1,j=arguments.length,k=!1;typeof h=="boolean"&&(k=h,h=arguments[1]||{},i=2),typeof h!="object"&&!p.isFunction(h)&&(h={}),j===i&&(h=this,--i);for(;i<j;i++)if((a=arguments[i])!=null)for(c in a){d=h[c],e=a[c];if(h===e)continue;k&&e&&(p.isPlainObject(e)||(f=p.isArray(e)))?(f?(f=!1,g=d&&p.isArray(d)?d:[]):g=d&&p.isPlainObject(d)?d:{},h[c]=p.extend(k,g,e)):e!==b&&(h[c]=e)}return h},p.extend({noConflict:function(b){return a.$===p&&(a.$=i),b&&a.jQuery===p&&(a.jQuery=h),p},isReady:!1,readyWait:1,holdReady:function(a){a?p.readyWait++:p.ready(!0)},ready:function(a){if(a===!0?--p.readyWait:p.isReady)return;if(!e.body)return setTimeout(p.ready,1);p.isReady=!0;if(a!==!0&&--p.readyWait>0)return;d.resolveWith(e,[p]),p.fn.trigger&&p(e).trigger("ready").off("ready")},isFunction:function(a){return p.type(a)==="function"},isArray:Array.isArray||function(a){return p.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):E[m.call(a)]||"object"},isPlainObject:function(a){if(!a||p.type(a)!=="object"||a.nodeType||p.isWindow(a))return!1;try{if(a.constructor&&!n.call(a,"constructor")&&!n.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||n.call(a,d)},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},error:function(a){throw new Error(a)},parseHTML:function(a,b,c){var d;return!a||typeof a!="string"?null:(typeof b=="boolean"&&(c=b,b=0),b=b||e,(d=v.exec(a))?[b.createElement(d[1])]:(d=p.buildFragment([a],b,c?null:[]),p.merge([],(d.cacheable?p.clone(d.fragment):d.fragment).childNodes)))},parseJSON:function(b){if(!b||typeof b!="string")return null;b=p.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(w.test(b.replace(y,"@").replace(z,"]").replace(x,"")))return(new Function("return "+b))();p.error("Invalid JSON: "+b)},parseXML:function(c){var d,e;if(!c||typeof c!="string")return null;try{a.DOMParser?(e=new DOMParser,d=e.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(f){d=b}return(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&p.error("Invalid XML: "+c),d},noop:function(){},globalEval:function(b){b&&r.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(A,"ms-").replace(B,C)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,c,d){var e,f=0,g=a.length,h=g===b||p.isFunction(a);if(d){if(h){for(e in a)if(c.apply(a[e],d)===!1)break}else for(;f<g;)if(c.apply(a[f++],d)===!1)break}else if(h){for(e in a)if(c.call(a[e],e,a[e])===!1)break}else for(;f<g;)if(c.call(a[f],f,a[f++])===!1)break;return a},trim:o&&!o.call("锘柯�")?function(a){return a==null?"":o.call(a)}:function(a){return a==null?"":(a+"").replace(t,"")},makeArray:function(a,b){var c,d=b||[];return a!=null&&(c=p.type(a),a.length==null||c==="string"||c==="function"||c==="regexp"||p.isWindow(a)?j.call(d,a):p.merge(d,a)),d},inArray:function(a,b,c){var d;if(b){if(l)return l.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=c.length,e=a.length,f=0;if(typeof d=="number")for(;f<d;f++)a[e++]=c[f];else while(c[f]!==b)a[e++]=c[f++];return a.length=e,a},grep:function(a,b,c){var d,e=[],f=0,g=a.length;c=!!c;for(;f<g;f++)d=!!b(a[f],f),c!==d&&e.push(a[f]);return e},map:function(a,c,d){var e,f,g=[],h=0,i=a.length,j=a instanceof p||i!==b&&typeof i=="number"&&(i>0&&a[0]&&a[i-1]||i===0||p.isArray(a));if(j)for(;h<i;h++)e=c(a[h],h,d),e!=null&&(g[g.length]=e);else for(f in a)e=c(a[f],f,d),e!=null&&(g[g.length]=e);return g.concat.apply([],g)},guid:1,proxy:function(a,c){var d,e,f;return typeof c=="string"&&(d=a[c],c=a,a=d),p.isFunction(a)?(e=k.call(arguments,2),f=function(){return a.apply(c,e.concat(k.call(arguments)))},f.guid=a.guid=a.guid||p.guid++,f):b},access:function(a,c,d,e,f,g,h){var i,j=d==null,k=0,l=a.length;if(d&&typeof d=="object"){for(k in d)p.access(a,c,k,d[k],1,g,e);f=1}else if(e!==b){i=h===b&&p.isFunction(e),j&&(i?(i=c,c=function(a,b,c){return i.call(p(a),c)}):(c.call(a,e),c=null));if(c)for(;k<l;k++)c(a[k],d,i?e.call(a[k],k,c(a[k],d)):e,h);f=1}return f?a:j?c.call(a):l?c(a[0],d):g},now:function(){return(new Date).getTime()}}),p.ready.promise=function(b){if(!d){d=p.Deferred();if(e.readyState==="complete")setTimeout(p.ready,1);else if(e.addEventListener)e.addEventListener("DOMContentLoaded",D,!1),a.addEventListener("load",p.ready,!1);else{e.attachEvent("onreadystatechange",D),a.attachEvent("onload",p.ready);var c=!1;try{c=a.frameElement==null&&e.documentElement}catch(f){}c&&c.doScroll&&function g(){if(!p.isReady){try{c.doScroll("left")}catch(a){return setTimeout(g,50)}p.ready()}}()}}return d.promise(b)},p.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){E["[object "+b+"]"]=b.toLowerCase()}),c=p(e);var F={};p.Callbacks=function(a){a=typeof a=="string"?F[a]||G(a):p.extend({},a);var c,d,e,f,g,h,i=[],j=!a.once&&[],k=function(b){c=a.memory&&b,d=!0,h=f||0,f=0,g=i.length,e=!0;for(;i&&h<g;h++)if(i[h].apply(b[0],b[1])===!1&&a.stopOnFalse){c=!1;break}e=!1,i&&(j?j.length&&k(j.shift()):c?i=[]:l.disable())},l={add:function(){if(i){var b=i.length;(function d(b){p.each(b,function(b,c){var e=p.type(c);e==="function"&&(!a.unique||!l.has(c))?i.push(c):c&&c.length&&e!=="string"&&d(c)})})(arguments),e?g=i.length:c&&(f=b,k(c))}return this},remove:function(){return i&&p.each(arguments,function(a,b){var c;while((c=p.inArray(b,i,c))>-1)i.splice(c,1),e&&(c<=g&&g--,c<=h&&h--)}),this},has:function(a){return p.inArray(a,i)>-1},empty:function(){return i=[],this},disable:function(){return i=j=c=b,this},disabled:function(){return!i},lock:function(){return j=b,c||l.disable(),this},locked:function(){return!j},fireWith:function(a,b){return b=b||[],b=[a,b.slice?b.slice():b],i&&(!d||j)&&(e?j.push(b):k(b)),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!d}};return l},p.extend({Deferred:function(a){var b=[["resolve","done",p.Callbacks("once memory"),"resolved"],["reject","fail",p.Callbacks("once memory"),"rejected"],["notify","progress",p.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return p.Deferred(function(c){p.each(b,function(b,d){var f=d[0],g=a[b];e[d[1]](p.isFunction(g)?function(){var a=g.apply(this,arguments);a&&p.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f+"With"](this===e?c:this,[a])}:c[f])}),a=null}).promise()},promise:function(a){return a!=null?p.extend(a,d):d}},e={};return d.pipe=d.then,p.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[a^1][2].disable,b[2][2].lock),e[f[0]]=g.fire,e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=k.call(arguments),d=c.length,e=d!==1||a&&p.isFunction(a.promise)?d:0,f=e===1?a:p.Deferred(),g=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?k.call(arguments):d,c===h?f.notifyWith(b,c):--e||f.resolveWith(b,c)}},h,i,j;if(d>1){h=new Array(d),i=new Array(d),j=new Array(d);for(;b<d;b++)c[b]&&p.isFunction(c[b].promise)?c[b].promise().done(g(b,j,c)).fail(f.reject).progress(g(b,i,h)):--e}return e||f.resolveWith(j,c),f.promise()}}),p.support=function(){var b,c,d,f,g,h,i,j,k,l,m,n=e.createElement("div");n.setAttribute("className","t"),n.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",c=n.getElementsByTagName("*"),d=n.getElementsByTagName("a")[0],d.style.cssText="top:1px;float:left;opacity:.5";if(!c||!c.length)return{};f=e.createElement("select"),g=f.appendChild(e.createElement("option")),h=n.getElementsByTagName("input")[0],b={leadingWhitespace:n.firstChild.nodeType===3,tbody:!n.getElementsByTagName("tbody").length,htmlSerialize:!!n.getElementsByTagName("link").length,style:/top/.test(d.getAttribute("style")),hrefNormalized:d.getAttribute("href")==="/a",opacity:/^0.5/.test(d.style.opacity),cssFloat:!!d.style.cssFloat,checkOn:h.value==="on",optSelected:g.selected,getSetAttribute:n.className!=="t",enctype:!!e.createElement("form").enctype,html5Clone:e.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",boxModel:e.compatMode==="CSS1Compat",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},h.checked=!0,b.noCloneChecked=h.cloneNode(!0).checked,f.disabled=!0,b.optDisabled=!g.disabled;try{delete n.test}catch(o){b.deleteExpando=!1}!n.addEventListener&&n.attachEvent&&n.fireEvent&&(n.attachEvent("onclick",m=function(){b.noCloneEvent=!1}),n.cloneNode(!0).fireEvent("onclick"),n.detachEvent("onclick",m)),h=e.createElement("input"),h.value="t",h.setAttribute("type","radio"),b.radioValue=h.value==="t",h.setAttribute("checked","checked"),h.setAttribute("name","t"),n.appendChild(h),i=e.createDocumentFragment(),i.appendChild(n.lastChild),b.checkClone=i.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=h.checked,i.removeChild(h),i.appendChild(n);if(n.attachEvent)for(k in{submit:!0,change:!0,focusin:!0})j="on"+k,l=j in n,l||(n.setAttribute(j,"return;"),l=typeof n[j]=="function"),b[k+"Bubbles"]=l;return p(function(){var c,d,f,g,h="padding:0;margin:0;border:0;display:block;overflow:hidden;",i=e.getElementsByTagName("body")[0];if(!i)return;c=e.createElement("div"),c.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",i.insertBefore(c,i.firstChild),d=e.createElement("div"),c.appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",f=d.getElementsByTagName("td"),f[0].style.cssText="padding:0;margin:0;border:0;display:none",l=f[0].offsetHeight===0,f[0].style.display="",f[1].style.display="none",b.reliableHiddenOffsets=l&&f[0].offsetHeight===0,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",b.boxSizing=d.offsetWidth===4,b.doesNotIncludeMarginInBodyOffset=i.offsetTop!==1,a.getComputedStyle&&(b.pixelPosition=(a.getComputedStyle(d,null)||{}).top!=="1%",b.boxSizingReliable=(a.getComputedStyle(d,null)||{width:"4px"}).width==="4px",g=e.createElement("div"),g.style.cssText=d.style.cssText=h,g.style.marginRight=g.style.width="0",d.style.width="1px",d.appendChild(g),b.reliableMarginRight=!parseFloat((a.getComputedStyle(g,null)||{}).marginRight)),typeof d.style.zoom!="undefined"&&(d.innerHTML="",d.style.cssText=h+"width:1px;padding:1px;display:inline;zoom:1",b.inlineBlockNeedsLayout=d.offsetWidth===3,d.style.display="block",d.style.overflow="visible",d.innerHTML="<div></div>",d.firstChild.style.width="5px",b.shrinkWrapBlocks=d.offsetWidth!==3,c.style.zoom=1),i.removeChild(c),c=d=f=g=null}),i.removeChild(n),c=d=f=g=h=i=n=null,b}();var H=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,I=/([A-Z])/g;p.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(p.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){return a=a.nodeType?p.cache[a[p.expando]]:a[p.expando],!!a&&!K(a)},data:function(a,c,d,e){if(!p.acceptData(a))return;var f,g,h=p.expando,i=typeof c=="string",j=a.nodeType,k=j?p.cache:a,l=j?a[h]:a[h]&&h;if((!l||!k[l]||!e&&!k[l].data)&&i&&d===b)return;l||(j?a[h]=l=p.deletedIds.pop()||p.guid++:l=h),k[l]||(k[l]={},j||(k[l].toJSON=p.noop));if(typeof c=="object"||typeof c=="function")e?k[l]=p.extend(k[l],c):k[l].data=p.extend(k[l].data,c);return f=k[l],e||(f.data||(f.data={}),f=f.data),d!==b&&(f[p.camelCase(c)]=d),i?(g=f[c],g==null&&(g=f[p.camelCase(c)])):g=f,g},removeData:function(a,b,c){if(!p.acceptData(a))return;var d,e,f,g=a.nodeType,h=g?p.cache:a,i=g?a[p.expando]:p.expando;if(!h[i])return;if(b){d=c?h[i]:h[i].data;if(d){p.isArray(b)||(b in d?b=[b]:(b=p.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,f=b.length;e<f;e++)delete d[b[e]];if(!(c?K:p.isEmptyObject)(d))return}}if(!c){delete h[i].data;if(!K(h[i]))return}g?p.cleanData([a],!0):p.support.deleteExpando||h!=h.window?delete h[i]:h[i]=null},_data:function(a,b,c){return p.data(a,b,c,!0)},acceptData:function(a){var b=a.nodeName&&p.noData[a.nodeName.toLowerCase()];return!b||b!==!0&&a.getAttribute("classid")===b}}),p.fn.extend({data:function(a,c){var d,e,f,g,h,i=this[0],j=0,k=null;if(a===b){if(this.length){k=p.data(i);if(i.nodeType===1&&!p._data(i,"parsedAttrs")){f=i.attributes;for(h=f.length;j<h;j++)g=f[j].name,g.indexOf("data-")||(g=p.camelCase(g.substring(5)),J(i,g,k[g]));p._data(i,"parsedAttrs",!0)}}return k}return typeof a=="object"?this.each(function(){p.data(this,a)}):(d=a.split(".",2),d[1]=d[1]?"."+d[1]:"",e=d[1]+"!",p.access(this,function(c){if(c===b)return k=this.triggerHandler("getData"+e,[d[0]]),k===b&&i&&(k=p.data(i,a),k=J(i,a,k)),k===b&&d[1]?this.data(d[0]):k;d[1]=c,this.each(function(){var b=p(this);b.triggerHandler("setData"+e,d),p.data(this,a,c),b.triggerHandler("changeData"+e,d)})},null,c,arguments.length>1,null,!1))},removeData:function(a){return this.each(function(){p.removeData(this,a)})}}),p.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=p._data(a,b),c&&(!d||p.isArray(c)?d=p._data(a,b,p.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=p.queue(a,b),d=c.length,e=c.shift(),f=p._queueHooks(a,b),g=function(){p.dequeue(a,b)};e==="inprogress"&&(e=c.shift(),d--),e&&(b==="fx"&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return p._data(a,c)||p._data(a,c,{empty:p.Callbacks("once memory").add(function(){p.removeData(a,b+"queue",!0),p.removeData(a,c,!0)})})}}),p.fn.extend({queue:function(a,c){var d=2;return typeof a!="string"&&(c=a,a="fx",d--),arguments.length<d?p.queue(this[0],a):c===b?this:this.each(function(){var b=p.queue(this,a,c);p._queueHooks(this,a),a==="fx"&&b[0]!=="inprogress"&&p.dequeue(this,a)})},dequeue:function(a){return this.each(function(){p.dequeue(this,a)})},delay:function(a,b){return a=p.fx?p.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){var d,e=1,f=p.Deferred(),g=this,h=this.length,i=function(){--e||f.resolveWith(g,[g])};typeof a!="string"&&(c=a,a=b),a=a||"fx";while(h--)d=p._data(g[h],a+"queueHooks"),d&&d.empty&&(e++,d.empty.add(i));return i(),f.promise(c)}});var L,M,N,O=/[\t\r\n]/g,P=/\r/g,Q=/^(?:button|input)$/i,R=/^(?:button|input|object|select|textarea)$/i,S=/^a(?:rea|)$/i,T=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,U=p.support.getSetAttribute;p.fn.extend({attr:function(a,b){return p.access(this,p.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){p.removeAttr(this,a)})},prop:function(a,b){return p.access(this,p.prop,a,b,arguments.length>1)},removeProp:function(a){return a=p.propFix[a]||a,this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,f,g,h;if(p.isFunction(a))return this.each(function(b){p(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(s);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{f=" "+e.className+" ";for(g=0,h=b.length;g<h;g++)f.indexOf(" "+b[g]+" ")<0&&(f+=b[g]+" ");e.className=p.trim(f)}}}return this},removeClass:function(a){var c,d,e,f,g,h,i;if(p.isFunction(a))return this.each(function(b){p(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(s);for(h=0,i=this.length;h<i;h++){e=this[h];if(e.nodeType===1&&e.className){d=(" "+e.className+" ").replace(O," ");for(f=0,g=c.length;f<g;f++)while(d.indexOf(" "+c[f]+" ")>=0)d=d.replace(" "+c[f]+" "," ");e.className=a?p.trim(d):""}}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";return p.isFunction(a)?this.each(function(c){p(this).toggleClass(a.call(this,c,this.className,b),b)}):this.each(function(){if(c==="string"){var e,f=0,g=p(this),h=b,i=a.split(s);while(e=i[f++])h=d?h:!g.hasClass(e),g[h?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&p._data(this,"__className__",this.className),this.className=this.className||a===!1?"":p._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(O," ").indexOf(b)>=0)return!0;return!1},val:function(a){var c,d,e,f=this[0];if(!arguments.length){if(f)return c=p.valHooks[f.type]||p.valHooks[f.nodeName.toLowerCase()],c&&"get"in c&&(d=c.get(f,"value"))!==b?d:(d=f.value,typeof d=="string"?d.replace(P,""):d==null?"":d);return}return e=p.isFunction(a),this.each(function(d){var f,g=p(this);if(this.nodeType!==1)return;e?f=a.call(this,d,g.val()):f=a,f==null?f="":typeof f=="number"?f+="":p.isArray(f)&&(f=p.map(f,function(a){return a==null?"":a+""})),c=p.valHooks[this.type]||p.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,f,"value")===b)this.value=f})}}),p.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,f=a.selectedIndex,g=[],h=a.options,i=a.type==="select-one";if(f<0)return null;c=i?f:0,d=i?f+1:h.length;for(;c<d;c++){e=h[c];if(e.selected&&(p.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!p.nodeName(e.parentNode,"optgroup"))){b=p(e).val();if(i)return b;g.push(b)}}return i&&!g.length&&h.length?p(h[f]).val():g},set:function(a,b){var c=p.makeArray(b);return p(a).find("option").each(function(){this.selected=p.inArray(p(this).val(),c)>=0}),c.length||(a.selectedIndex=-1),c}}},attrFn:{},attr:function(a,c,d,e){var f,g,h,i=a.nodeType;if(!a||i===3||i===8||i===2)return;if(e&&p.isFunction(p.fn[c]))return p(a)[c](d);if(typeof a.getAttribute=="undefined")return p.prop(a,c,d);h=i!==1||!p.isXMLDoc(a),h&&(c=c.toLowerCase(),g=p.attrHooks[c]||(T.test(c)?M:L));if(d!==b){if(d===null){p.removeAttr(a,c);return}return g&&"set"in g&&h&&(f=g.set(a,d,c))!==b?f:(a.setAttribute(c,d+""),d)}return g&&"get"in g&&h&&(f=g.get(a,c))!==null?f:(f=a.getAttribute(c),f===null?b:f)},removeAttr:function(a,b){var c,d,e,f,g=0;if(b&&a.nodeType===1){d=b.split(s);for(;g<d.length;g++)e=d[g],e&&(c=p.propFix[e]||e,f=T.test(e),f||p.attr(a,e,""),a.removeAttribute(U?e:c),f&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(Q.test(a.nodeName)&&a.parentNode)p.error("type property can't be changed");else if(!p.support.radioValue&&b==="radio"&&p.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}},value:{get:function(a,b){return L&&p.nodeName(a,"button")?L.get(a,b):b in a?a.value:null},set:function(a,b,c){if(L&&p.nodeName(a,"button"))return L.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,f,g,h=a.nodeType;if(!a||h===3||h===8||h===2)return;return g=h!==1||!p.isXMLDoc(a),g&&(c=p.propFix[c]||c,f=p.propHooks[c]),d!==b?f&&"set"in f&&(e=f.set(a,d,c))!==b?e:a[c]=d:f&&"get"in f&&(e=f.get(a,c))!==null?e:a[c]},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):R.test(a.nodeName)||S.test(a.nodeName)&&a.href?0:b}}}}),M={get:function(a,c){var d,e=p.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;return b===!1?p.removeAttr(a,c):(d=p.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase())),c}},U||(N={name:!0,id:!0,coords:!0},L=p.valHooks.button={get:function(a,c){var d;return d=a.getAttributeNode(c),d&&(N[c]?d.value!=="":d.specified)?d.value:b},set:function(a,b,c){var d=a.getAttributeNode(c);return d||(d=e.createAttribute(c),a.setAttributeNode(d)),d.value=b+""}},p.each(["width","height"],function(a,b){p.attrHooks[b]=p.extend(p.attrHooks[b],{set:function(a,c){if(c==="")return a.setAttribute(b,"auto"),c}})}),p.attrHooks.contenteditable={get:L.get,set:function(a,b,c){b===""&&(b="false"),L.set(a,b,c)}}),p.support.hrefNormalized||p.each(["href","src","width","height"],function(a,c){p.attrHooks[c]=p.extend(p.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),p.support.style||(p.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=b+""}}),p.support.optSelected||(p.propHooks.selected=p.extend(p.propHooks.selected,{get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}})),p.support.enctype||(p.propFix.enctype="encoding"),p.support.checkOn||p.each(["radio","checkbox"],function(){p.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),p.each(["radio","checkbox"],function(){p.valHooks[this]=p.extend(p.valHooks[this],{set:function(a,b){if(p.isArray(b))return a.checked=p.inArray(p(a).val(),b)>=0}})});var V=/^(?:textarea|input|select)$/i,W=/^([^\.]*|)(?:\.(.+)|)$/,X=/(?:^|\s)hover(\.\S+|)\b/,Y=/^key/,Z=/^(?:mouse|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=function(a){return p.event.special.hover?a:a.replace(X,"mouseenter$1 mouseleave$1")};p.event={add:function(a,c,d,e,f){var g,h,i,j,k,l,m,n,o,q,r;if(a.nodeType===3||a.nodeType===8||!c||!d||!(g=p._data(a)))return;d.handler&&(o=d,d=o.handler,f=o.selector),d.guid||(d.guid=p.guid++),i=g.events,i||(g.events=i={}),h=g.handle,h||(g.handle=h=function(a){return typeof p!="undefined"&&(!a||p.event.triggered!==a.type)?p.event.dispatch.apply(h.elem,arguments):b},h.elem=a),c=p.trim(_(c)).split(" ");for(j=0;j<c.length;j++){k=W.exec(c[j])||[],l=k[1],m=(k[2]||"").split(".").sort(),r=p.event.special[l]||{},l=(f?r.delegateType:r.bindType)||l,r=p.event.special[l]||{},n=p.extend({type:l,origType:k[1],data:e,handler:d,guid:d.guid,selector:f,needsContext:f&&p.expr.match.needsContext.test(f),namespace:m.join(".")},o),q=i[l];if(!q){q=i[l]=[],q.delegateCount=0;if(!r.setup||r.setup.call(a,e,m,h)===!1)a.addEventListener?a.addEventListener(l,h,!1):a.attachEvent&&a.attachEvent("on"+l,h)}r.add&&(r.add.call(a,n),n.handler.guid||(n.handler.guid=d.guid)),f?q.splice(q.delegateCount++,0,n):q.push(n),p.event.global[l]=!0}a=null},global:{},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,q,r=p.hasData(a)&&p._data(a);if(!r||!(m=r.events))return;b=p.trim(_(b||"")).split(" ");for(f=0;f<b.length;f++){g=W.exec(b[f])||[],h=i=g[1],j=g[2];if(!h){for(h in m)p.event.remove(a,h+b[f],c,d,!0);continue}n=p.event.special[h]||{},h=(d?n.delegateType:n.bindType)||h,o=m[h]||[],k=o.length,j=j?new RegExp("(^|\\.)"+j.split(".").sort().join("\\.(?:.*\\.|)")+"(\\.|$)"):null;for(l=0;l<o.length;l++)q=o[l],(e||i===q.origType)&&(!c||c.guid===q.guid)&&(!j||j.test(q.namespace))&&(!d||d===q.selector||d==="**"&&q.selector)&&(o.splice(l--,1),q.selector&&o.delegateCount--,n.remove&&n.remove.call(a,q));o.length===0&&k!==o.length&&((!n.teardown||n.teardown.call(a,j,r.handle)===!1)&&p.removeEvent(a,h,r.handle),delete m[h])}p.isEmptyObject(m)&&(delete r.handle,p.removeData(a,"events",!0))},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,f,g){if(!f||f.nodeType!==3&&f.nodeType!==8){var h,i,j,k,l,m,n,o,q,r,s=c.type||c,t=[];if($.test(s+p.event.triggered))return;s.indexOf("!")>=0&&(s=s.slice(0,-1),i=!0),s.indexOf(".")>=0&&(t=s.split("."),s=t.shift(),t.sort());if((!f||p.event.customEvent[s])&&!p.event.global[s])return;c=typeof c=="object"?c[p.expando]?c:new p.Event(s,c):new p.Event(s),c.type=s,c.isTrigger=!0,c.exclusive=i,c.namespace=t.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+t.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,m=s.indexOf(":")<0?"on"+s:"";if(!f){h=p.cache;for(j in h)h[j].events&&h[j].events[s]&&p.event.trigger(c,d,h[j].handle.elem,!0);return}c.result=b,c.target||(c.target=f),d=d!=null?p.makeArray(d):[],d.unshift(c),n=p.event.special[s]||{};if(n.trigger&&n.trigger.apply(f,d)===!1)return;q=[[f,n.bindType||s]];if(!g&&!n.noBubble&&!p.isWindow(f)){r=n.delegateType||s,k=$.test(r+s)?f:f.parentNode;for(l=f;k;k=k.parentNode)q.push([k,r]),l=k;l===(f.ownerDocument||e)&&q.push([l.defaultView||l.parentWindow||a,r])}for(j=0;j<q.length&&!c.isPropagationStopped();j++)k=q[j][0],c.type=q[j][1],o=(p._data(k,"events")||{})[c.type]&&p._data(k,"handle"),o&&o.apply(k,d),o=m&&k[m],o&&p.acceptData(k)&&o.apply&&o.apply(k,d)===!1&&c.preventDefault();return c.type=s,!g&&!c.isDefaultPrevented()&&(!n._default||n._default.apply(f.ownerDocument,d)===!1)&&(s!=="click"||!p.nodeName(f,"a"))&&p.acceptData(f)&&m&&f[s]&&(s!=="focus"&&s!=="blur"||c.target.offsetWidth!==0)&&!p.isWindow(f)&&(l=f[m],l&&(f[m]=null),p.event.triggered=s,f[s](),p.event.triggered=b,l&&(f[m]=l)),c.result}return},dispatch:function(c){c=p.event.fix(c||a.event);var d,e,f,g,h,i,j,l,m,n,o=(p._data(this,"events")||{})[c.type]||[],q=o.delegateCount,r=k.call(arguments),s=!c.exclusive&&!c.namespace,t=p.event.special[c.type]||{},u=[];r[0]=c,c.delegateTarget=this;if(t.preDispatch&&t.preDispatch.call(this,c)===!1)return;if(q&&(!c.button||c.type!=="click"))for(f=c.target;f!=this;f=f.parentNode||this)if(f.disabled!==!0||c.type!=="click"){h={},j=[];for(d=0;d<q;d++)l=o[d],m=l.selector,h[m]===b&&(h[m]=l.needsContext?p(m,this).index(f)>=0:p.find(m,this,null,[f]).length),h[m]&&j.push(l);j.length&&u.push({elem:f,matches:j})}o.length>q&&u.push({elem:this,matches:o.slice(q)});for(d=0;d<u.length&&!c.isPropagationStopped();d++){i=u[d],c.currentTarget=i.elem;for(e=0;e<i.matches.length&&!c.isImmediatePropagationStopped();e++){l=i.matches[e];if(s||!c.namespace&&!l.namespace||c.namespace_re&&c.namespace_re.test(l.namespace))c.data=l.data,c.handleObj=l,g=((p.event.special[l.origType]||{}).handle||l.handler).apply(i.elem,r),g!==b&&(c.result=g,g===!1&&(c.preventDefault(),c.stopPropagation()))}}return t.postDispatch&&t.postDispatch.call(this,c),c.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,c){var d,f,g,h=c.button,i=c.fromElement;return a.pageX==null&&c.clientX!=null&&(d=a.target.ownerDocument||e,f=d.documentElement,g=d.body,a.pageX=c.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=c.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?c.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0),a}},fix:function(a){if(a[p.expando])return a;var b,c,d=a,f=p.event.fixHooks[a.type]||{},g=f.props?this.props.concat(f.props):this.props;a=p.Event(d);for(b=g.length;b;)c=g[--b],a[c]=d[c];return a.target||(a.target=d.srcElement||e),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,f.filter?f.filter(a,d):a},special:{load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){p.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=p.extend(new p.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?p.event.trigger(e,null,b):p.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},p.event.handle=p.event.dispatch,p.removeEvent=e.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]=="undefined"&&(a[d]=null),a.detachEvent(d,c))},p.Event=function(a,b){if(this instanceof p.Event)a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?bb:ba):this.type=a,b&&p.extend(this,b),this.timeStamp=a&&a.timeStamp||p.now(),this[p.expando]=!0;else return new p.Event(a,b)},p.Event.prototype={preventDefault:function(){this.isDefaultPrevented=bb;var a=this.originalEvent;if(!a)return;a.preventDefault?a.preventDefault():a.returnValue=!1},stopPropagation:function(){this.isPropagationStopped=bb;var a=this.originalEvent;if(!a)return;a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=bb,this.stopPropagation()},isDefaultPrevented:ba,isPropagationStopped:ba,isImmediatePropagationStopped:ba},p.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){p.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj,g=f.selector;if(!e||e!==d&&!p.contains(d,e))a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b;return c}}}),p.support.submitBubbles||(p.event.special.submit={setup:function(){if(p.nodeName(this,"form"))return!1;p.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=p.nodeName(c,"input")||p.nodeName(c,"button")?c.form:b;d&&!p._data(d,"_submit_attached")&&(p.event.add(d,"submit._submit",function(a){a._submit_bubble=!0}),p._data(d,"_submit_attached",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&p.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){if(p.nodeName(this,"form"))return!1;p.event.remove(this,"._submit")}}),p.support.changeBubbles||(p.event.special.change={setup:function(){if(V.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")p.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),p.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),p.event.simulate("change",this,a,!0)});return!1}p.event.add(this,"beforeactivate._change",function(a){var b=a.target;V.test(b.nodeName)&&!p._data(b,"_change_attached")&&(p.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&p.event.simulate("change",this.parentNode,a,!0)}),p._data(b,"_change_attached",!0))})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){return p.event.remove(this,"._change"),!V.test(this.nodeName)}}),p.support.focusinBubbles||p.each({focus:"focusin",blur:"focusout"},function(a,b){var c=0,d=function(a){p.event.simulate(b,a.target,p.event.fix(a),!0)};p.event.special[b]={setup:function(){c++===0&&e.addEventListener(a,d,!0)},teardown:function(){--c===0&&e.removeEventListener(a,d,!0)}}}),p.fn.extend({on:function(a,c,d,e,f){var g,h;if(typeof a=="object"){typeof c!="string"&&(d=d||c,c=b);for(h in a)this.on(h,c,d,a[h],f);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=ba;else if(!e)return this;return f===1&&(g=e,e=function(a){return p().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=p.guid++)),this.each(function(){p.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,c,d){var e,f;if(a&&a.preventDefault&&a.handleObj)return e=a.handleObj,p(a.delegateTarget).off(e.namespace?e.origType+"."+e.namespace:e.origType,e.selector,e.handler),this;if(typeof a=="object"){for(f in a)this.off(f,c,a[f]);return this}if(c===!1||typeof c=="function")d=c,c=b;return d===!1&&(d=ba),this.each(function(){p.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){return p(this.context).on(a,this.selector,b,c),this},die:function(a,b){return p(this.context).off(a,this.selector||"**",b),this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length===1?this.off(a,"**"):this.off(b,a||"**",c)},trigger:function(a,b){return this.each(function(){p.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return p.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||p.guid++,d=0,e=function(c){var e=(p._data(this,"lastToggle"+a.guid)||0)%d;return p._data(this,"lastToggle"+a.guid,e+1),c.preventDefault(),b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),p.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){p.fn[b]=function(a,c){return c==null&&(c=a,a=null),arguments.length>0?this.on(b,null,a,c):this.trigger(b)},Y.test(b)&&(p.event.fixHooks[b]=p.event.keyHooks),Z.test(b)&&(p.event.fixHooks[b]=p.event.mouseHooks)}),function(a,b){function bc(a,b,c,d){c=c||[],b=b||r;var e,f,i,j,k=b.nodeType;if(!a||typeof a!="string")return c;if(k!==1&&k!==9)return[];i=g(b);if(!i&&!d)if(e=P.exec(a))if(j=e[1]){if(k===9){f=b.getElementById(j);if(!f||!f.parentNode)return c;if(f.id===j)return c.push(f),c}else if(b.ownerDocument&&(f=b.ownerDocument.getElementById(j))&&h(b,f)&&f.id===j)return c.push(f),c}else{if(e[2])return w.apply(c,x.call(b.getElementsByTagName(a),0)),c;if((j=e[3])&&_&&b.getElementsByClassName)return w.apply(c,x.call(b.getElementsByClassName(j),0)),c}return bp(a.replace(L,"$1"),b,c,d,i)}function bd(a){return function(b){var c=b.nodeName.toLowerCase();return c==="input"&&b.type===a}}function be(a){return function(b){var c=b.nodeName.toLowerCase();return(c==="input"||c==="button")&&b.type===a}}function bf(a){return z(function(b){return b=+b,z(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function bg(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}function bh(a,b){var c,d,f,g,h,i,j,k=C[o][a];if(k)return b?0:k.slice(0);h=a,i=[],j=e.preFilter;while(h){if(!c||(d=M.exec(h)))d&&(h=h.slice(d[0].length)),i.push(f=[]);c=!1;if(d=N.exec(h))f.push(c=new q(d.shift())),h=h.slice(c.length),c.type=d[0].replace(L," ");for(g in e.filter)(d=W[g].exec(h))&&(!j[g]||(d=j[g](d,r,!0)))&&(f.push(c=new q(d.shift())),h=h.slice(c.length),c.type=g,c.matches=d);if(!c)break}return b?h.length:h?bc.error(a):C(a,i).slice(0)}function bi(a,b,d){var e=b.dir,f=d&&b.dir==="parentNode",g=u++;return b.first?function(b,c,d){while(b=b[e])if(f||b.nodeType===1)return a(b,c,d)}:function(b,d,h){if(!h){var i,j=t+" "+g+" ",k=j+c;while(b=b[e])if(f||b.nodeType===1){if((i=b[o])===k)return b.sizset;if(typeof i=="string"&&i.indexOf(j)===0){if(b.sizset)return b}else{b[o]=k;if(a(b,d,h))return b.sizset=!0,b;b.sizset=!1}}}else while(b=b[e])if(f||b.nodeType===1)if(a(b,d,h))return b}}function bj(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function bk(a,b,c,d,e){var f,g=[],h=0,i=a.length,j=b!=null;for(;h<i;h++)if(f=a[h])if(!c||c(f,d,e))g.push(f),j&&b.push(h);return g}function bl(a,b,c,d,e,f){return d&&!d[o]&&(d=bl(d)),e&&!e[o]&&(e=bl(e,f)),z(function(f,g,h,i){if(f&&e)return;var j,k,l,m=[],n=[],o=g.length,p=f||bo(b||"*",h.nodeType?[h]:h,[],f),q=a&&(f||!b)?bk(p,m,a,h,i):p,r=c?e||(f?a:o||d)?[]:g:q;c&&c(q,r,h,i);if(d){l=bk(r,n),d(l,[],h,i),j=l.length;while(j--)if(k=l[j])r[n[j]]=!(q[n[j]]=k)}if(f){j=a&&r.length;while(j--)if(k=r[j])f[m[j]]=!(g[m[j]]=k)}else r=bk(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):w.apply(g,r)})}function bm(a){var b,c,d,f=a.length,g=e.relative[a[0].type],h=g||e.relative[" "],i=g?1:0,j=bi(function(a){return a===b},h,!0),k=bi(function(a){return y.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==l)||((b=c).nodeType?j(a,c,d):k(a,c,d))}];for(;i<f;i++)if(c=e.relative[a[i].type])m=[bi(bj(m),c)];else{c=e.filter[a[i].type].apply(null,a[i].matches);if(c[o]){d=++i;for(;d<f;d++)if(e.relative[a[d].type])break;return bl(i>1&&bj(m),i>1&&a.slice(0,i-1).join("").replace(L,"$1"),c,i<d&&bm(a.slice(i,d)),d<f&&bm(a=a.slice(d)),d<f&&a.join(""))}m.push(c)}return bj(m)}function bn(a,b){var d=b.length>0,f=a.length>0,g=function(h,i,j,k,m){var n,o,p,q=[],s=0,u="0",x=h&&[],y=m!=null,z=l,A=h||f&&e.find.TAG("*",m&&i.parentNode||i),B=t+=z==null?1:Math.E;y&&(l=i!==r&&i,c=g.el);for(;(n=A[u])!=null;u++){if(f&&n){for(o=0;p=a[o];o++)if(p(n,i,j)){k.push(n);break}y&&(t=B,c=++g.el)}d&&((n=!p&&n)&&s--,h&&x.push(n))}s+=u;if(d&&u!==s){for(o=0;p=b[o];o++)p(x,q,i,j);if(h){if(s>0)while(u--)!x[u]&&!q[u]&&(q[u]=v.call(k));q=bk(q)}w.apply(k,q),y&&!h&&q.length>0&&s+b.length>1&&bc.uniqueSort(k)}return y&&(t=B,l=z),x};return g.el=0,d?z(g):g}function bo(a,b,c,d){var e=0,f=b.length;for(;e<f;e++)bc(a,b[e],c,d);return c}function bp(a,b,c,d,f){var g,h,j,k,l,m=bh(a),n=m.length;if(!d&&m.length===1){h=m[0]=m[0].slice(0);if(h.length>2&&(j=h[0]).type==="ID"&&b.nodeType===9&&!f&&e.relative[h[1].type]){b=e.find.ID(j.matches[0].replace(V,""),b,f)[0];if(!b)return c;a=a.slice(h.shift().length)}for(g=W.POS.test(a)?-1:h.length-1;g>=0;g--){j=h[g];if(e.relative[k=j.type])break;if(l=e.find[k])if(d=l(j.matches[0].replace(V,""),R.test(h[0].type)&&b.parentNode||b,f)){h.splice(g,1),a=d.length&&h.join("");if(!a)return w.apply(c,x.call(d,0)),c;break}}}return i(a,m)(d,b,f,c,R.test(a)),c}function bq(){}var c,d,e,f,g,h,i,j,k,l,m=!0,n="undefined",o=("sizcache"+Math.random()).replace(".",""),q=String,r=a.document,s=r.documentElement,t=0,u=0,v=[].pop,w=[].push,x=[].slice,y=[].indexOf||function(a){var b=0,c=this.length;for(;b<c;b++)if(this[b]===a)return b;return-1},z=function(a,b){return a[o]=b==null||b,a},A=function(){var a={},b=[];return z(function(c,d){return b.push(c)>e.cacheLength&&delete a[b.shift()],a[c]=d},a)},B=A(),C=A(),D=A(),E="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",G=F.replace("w","w#"),H="([*^$|!~]?=)",I="\\["+E+"*("+F+")"+E+"*(?:"+H+E+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+G+")|)|)"+E+"*\\]",J=":("+F+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:"+I+")|[^:]|\\\\.)*|.*))\\)|)",K=":(even|odd|eq|gt|lt|nth|first|last)(?:\\("+E+"*((?:-\\d)?\\d*)"+E+"*\\)|)(?=[^-]|$)",L=new RegExp("^"+E+"+|((?:^|[^\\\\])(?:\\\\.)*)"+E+"+$","g"),M=new RegExp("^"+E+"*,"+E+"*"),N=new RegExp("^"+E+"*([\\x20\\t\\r\\n\\f>+~])"+E+"*"),O=new RegExp(J),P=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,Q=/^:not/,R=/[\x20\t\r\n\f]*[+~]/,S=/:not\($/,T=/h\d/i,U=/input|select|textarea|button/i,V=/\\(?!\\)/g,W={ID:new RegExp("^#("+F+")"),CLASS:new RegExp("^\\.("+F+")"),NAME:new RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:new RegExp("^("+F.replace("w","w*")+")"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+J),POS:new RegExp(K,"i"),CHILD:new RegExp("^:(only|nth|first|last)-child(?:\\("+E+"*(even|odd|(([+-]|)(\\d*)n|)"+E+"*(?:([+-]|)"+E+"*(\\d+)|))"+E+"*\\)|)","i"),needsContext:new RegExp("^"+E+"*[>+~]|"+K,"i")},X=function(a){var b=r.createElement("div");try{return a(b)}catch(c){return!1}finally{b=null}},Y=X(function(a){return a.appendChild(r.createComment("")),!a.getElementsByTagName("*").length}),Z=X(function(a){return a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!==n&&a.firstChild.getAttribute("href")==="#"}),$=X(function(a){a.innerHTML="<select></select>";var b=typeof a.lastChild.getAttribute("multiple");return b!=="boolean"&&b!=="string"}),_=X(function(a){return a.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",!a.getElementsByClassName||!a.getElementsByClassName("e").length?!1:(a.lastChild.className="e",a.getElementsByClassName("e").length===2)}),ba=X(function(a){a.id=o+0,a.innerHTML="<a name='"+o+"'></a><div name='"+o+"'></div>",s.insertBefore(a,s.firstChild);var b=r.getElementsByName&&r.getElementsByName(o).length===2+r.getElementsByName(o+0).length;return d=!r.getElementById(o),s.removeChild(a),b});try{x.call(s.childNodes,0)[0].nodeType}catch(bb){x=function(a){var b,c=[];for(;b=this[a];a++)c.push(b);return c}}bc.matches=function(a,b){return bc(a,null,null,b)},bc.matchesSelector=function(a,b){return bc(b,null,null,[a]).length>0},f=bc.getText=function(a){var b,c="",d=0,e=a.nodeType;if(e){if(e===1||e===9||e===11){if(typeof a.textContent=="string")return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=f(a)}else if(e===3||e===4)return a.nodeValue}else for(;b=a[d];d++)c+=f(b);return c},g=bc.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?b.nodeName!=="HTML":!1},h=bc.contains=s.contains?function(a,b){var c=a.nodeType===9?a.documentElement:a,d=b&&b.parentNode;return a===d||!!(d&&d.nodeType===1&&c.contains&&c.contains(d))}:s.compareDocumentPosition?function(a,b){return b&&!!(a.compareDocumentPosition(b)&16)}:function(a,b){while(b=b.parentNode)if(b===a)return!0;return!1},bc.attr=function(a,b){var c,d=g(a);return d||(b=b.toLowerCase()),(c=e.attrHandle[b])?c(a):d||$?a.getAttribute(b):(c=a.getAttributeNode(b),c?typeof a[b]=="boolean"?a[b]?b:null:c.specified?c.value:null:null)},e=bc.selectors={cacheLength:50,createPseudo:z,match:W,attrHandle:Z?{}:{href:function(a){return a.getAttribute("href",2)},type:function(a){return a.getAttribute("type")}},find:{ID:d?function(a,b,c){if(typeof b.getElementById!==n&&!c){var d=b.getElementById(a);return d&&d.parentNode?[d]:[]}}:function(a,c,d){if(typeof c.getElementById!==n&&!d){var e=c.getElementById(a);return e?e.id===a||typeof e.getAttributeNode!==n&&e.getAttributeNode("id").value===a?[e]:b:[]}},TAG:Y?function(a,b){if(typeof b.getElementsByTagName!==n)return b.getElementsByTagName(a)}:function(a,b){var c=b.getElementsByTagName(a);if(a==="*"){var d,e=[],f=0;for(;d=c[f];f++)d.nodeType===1&&e.push(d);return e}return c},NAME:ba&&function(a,b){if(typeof b.getElementsByName!==n)return b.getElementsByName(name)},CLASS:_&&function(a,b,c){if(typeof b.getElementsByClassName!==n&&!c)return b.getElementsByClassName(a)}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(V,""),a[3]=(a[4]||a[5]||"").replace(V,""),a[2]==="~="&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),a[1]==="nth"?(a[2]||bc.error(a[0]),a[3]=+(a[3]?a[4]+(a[5]||1):2*(a[2]==="even"||a[2]==="odd")),a[4]=+(a[6]+a[7]||a[2]==="odd")):a[2]&&bc.error(a[0]),a},PSEUDO:function(a){var b,c;if(W.CHILD.test(a[0]))return null;if(a[3])a[2]=a[3];else if(b=a[4])O.test(b)&&(c=bh(b,!0))&&(c=b.indexOf(")",b.length-c)-b.length)&&(b=b.slice(0,c),a[0]=a[0].slice(0,c)),a[2]=b;return a.slice(0,3)}},filter:{ID:d?function(a){return a=a.replace(V,""),function(b){return b.getAttribute("id")===a}}:function(a){return a=a.replace(V,""),function(b){var c=typeof b.getAttributeNode!==n&&b.getAttributeNode("id");return c&&c.value===a}},TAG:function(a){return a==="*"?function(){return!0}:(a=a.replace(V,"").toLowerCase(),function(b){return b.nodeName&&b.nodeName.toLowerCase()===a})},CLASS:function(a){var b=B[o][a];return b||(b=B(a,new RegExp("(^|"+E+")"+a+"("+E+"|$)"))),function(a){return b.test(a.className||typeof a.getAttribute!==n&&a.getAttribute("class")||"")}},ATTR:function(a,b,c){return function(d,e){var f=bc.attr(d,a);return f==null?b==="!=":b?(f+="",b==="="?f===c:b==="!="?f!==c:b==="^="?c&&f.indexOf(c)===0:b==="*="?c&&f.indexOf(c)>-1:b==="$="?c&&f.substr(f.length-c.length)===c:b==="~="?(" "+f+" ").indexOf(c)>-1:b==="|="?f===c||f.substr(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d){return a==="nth"?function(a){var b,e,f=a.parentNode;if(c===1&&d===0)return!0;if(f){e=0;for(b=f.firstChild;b;b=b.nextSibling)if(b.nodeType===1){e++;if(a===b)break}}return e-=d,e===c||e%c===0&&e/c>=0}:function(b){var c=b;switch(a){case"only":case"first":while(c=c.previousSibling)if(c.nodeType===1)return!1;if(a==="first")return!0;c=b;case"last":while(c=c.nextSibling)if(c.nodeType===1)return!1;return!0}}},PSEUDO:function(a,b){var c,d=e.pseudos[a]||e.setFilters[a.toLowerCase()]||bc.error("unsupported pseudo: "+a);return d[o]?d(b):d.length>1?(c=[a,a,"",b],e.setFilters.hasOwnProperty(a.toLowerCase())?z(function(a,c){var e,f=d(a,b),g=f.length;while(g--)e=y.call(a,f[g]),a[e]=!(c[e]=f[g])}):function(a){return d(a,0,c)}):d}},pseudos:{not:z(function(a){var b=[],c=[],d=i(a.replace(L,"$1"));return d[o]?z(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)if(f=g[h])a[h]=!(b[h]=f)}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:z(function(a){return function(b){return bc(a,b).length>0}}),contains:z(function(a){return function(b){return(b.textContent||b.innerText||f(b)).indexOf(a)>-1}}),enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&!!a.checked||b==="option"&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},parent:function(a){return!e.pseudos.empty(a)},empty:function(a){var b;a=a.firstChild;while(a){if(a.nodeName>"@"||(b=a.nodeType)===3||b===4)return!1;a=a.nextSibling}return!0},header:function(a){return T.test(a.nodeName)},text:function(a){var b,c;return a.nodeName.toLowerCase()==="input"&&(b=a.type)==="text"&&((c=a.getAttribute("type"))==null||c.toLowerCase()===b)},radio:bd("radio"),checkbox:bd("checkbox"),file:bd("file"),password:bd("password"),image:bd("image"),submit:be("submit"),reset:be("reset"),button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&a.type==="button"||b==="button"},input:function(a){return U.test(a.nodeName)},focus:function(a){var b=a.ownerDocument;return a===b.activeElement&&(!b.hasFocus||b.hasFocus())&&(!!a.type||!!a.href)},active:function(a){return a===a.ownerDocument.activeElement},first:bf(function(a,b,c){return[0]}),last:bf(function(a,b,c){return[b-1]}),eq:bf(function(a,b,c){return[c<0?c+b:c]}),even:bf(function(a,b,c){for(var d=0;d<b;d+=2)a.push(d);return a}),odd:bf(function(a,b,c){for(var d=1;d<b;d+=2)a.push(d);return a}),lt:bf(function(a,b,c){for(var d=c<0?c+b:c;--d>=0;)a.push(d);return a}),gt:bf(function(a,b,c){for(var d=c<0?c+b:c;++d<b;)a.push(d);return a})}},j=s.compareDocumentPosition?function(a,b){return a===b?(k=!0,0):(!a.compareDocumentPosition||!b.compareDocumentPosition?a.compareDocumentPosition:a.compareDocumentPosition(b)&4)?-1:1}:function(a,b){if(a===b)return k=!0,0;if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,h=b.parentNode,i=g;if(g===h)return bg(a,b);if(!g)return-1;if(!h)return 1;while(i)e.unshift(i),i=i.parentNode;i=h;while(i)f.unshift(i),i=i.parentNode;c=e.length,d=f.length;for(var j=0;j<c&&j<d;j++)if(e[j]!==f[j])return bg(e[j],f[j]);return j===c?bg(a,f[j],-1):bg(e[j],b,1)},[0,0].sort(j),m=!k,bc.uniqueSort=function(a){var b,c=1;k=m,a.sort(j);if(k)for(;b=a[c];c++)b===a[c-1]&&a.splice(c--,1);return a},bc.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},i=bc.compile=function(a,b){var c,d=[],e=[],f=D[o][a];if(!f){b||(b=bh(a)),c=b.length;while(c--)f=bm(b[c]),f[o]?d.push(f):e.push(f);f=D(a,bn(e,d))}return f},r.querySelectorAll&&function(){var a,b=bp,c=/'|\\/g,d=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,e=[":focus"],f=[":active",":focus"],h=s.matchesSelector||s.mozMatchesSelector||s.webkitMatchesSelector||s.oMatchesSelector||s.msMatchesSelector;X(function(a){a.innerHTML="<select><option selected=''></option></select>",a.querySelectorAll("[selected]").length||e.push("\\["+E+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),a.querySelectorAll(":checked").length||e.push(":checked")}),X(function(a){a.innerHTML="<p test=''></p>",a.querySelectorAll("[test^='']").length&&e.push("[*^$]="+E+"*(?:\"\"|'')"),a.innerHTML="<input type='hidden'/>",a.querySelectorAll(":enabled").length||e.push(":enabled",":disabled")}),e=new RegExp(e.join("|")),bp=function(a,d,f,g,h){if(!g&&!h&&(!e||!e.test(a))){var i,j,k=!0,l=o,m=d,n=d.nodeType===9&&a;if(d.nodeType===1&&d.nodeName.toLowerCase()!=="object"){i=bh(a),(k=d.getAttribute("id"))?l=k.replace(c,"\\$&"):d.setAttribute("id",l),l="[id='"+l+"'] ",j=i.length;while(j--)i[j]=l+i[j].join("");m=R.test(a)&&d.parentNode||d,n=i.join(",")}if(n)try{return w.apply(f,x.call(m.querySelectorAll(n),0)),f}catch(p){}finally{k||d.removeAttribute("id")}}return b(a,d,f,g,h)},h&&(X(function(b){a=h.call(b,"div");try{h.call(b,"[test!='']:sizzle"),f.push("!=",J)}catch(c){}}),f=new RegExp(f.join("|")),bc.matchesSelector=function(b,c){c=c.replace(d,"='$1']");if(!g(b)&&!f.test(c)&&(!e||!e.test(c)))try{var i=h.call(b,c);if(i||a||b.document&&b.document.nodeType!==11)return i}catch(j){}return bc(c,null,null,[b]).length>0})}(),e.pseudos.nth=e.pseudos.eq,e.filters=bq.prototype=e.pseudos,e.setFilters=new bq,bc.attr=p.attr,p.find=bc,p.expr=bc.selectors,p.expr[":"]=p.expr.pseudos,p.unique=bc.uniqueSort,p.text=bc.getText,p.isXMLDoc=bc.isXML,p.contains=bc.contains}(a);var bc=/Until$/,bd=/^(?:parents|prev(?:Until|All))/,be=/^.[^:#\[\.,]*$/,bf=p.expr.match.needsContext,bg={children:!0,contents:!0,next:!0,prev:!0};p.fn.extend({find:function(a){var b,c,d,e,f,g,h=this;if(typeof a!="string")return p(a).filter(function(){for(b=0,c=h.length;b<c;b++)if(p.contains(h[b],this))return!0});g=this.pushStack("","find",a);for(b=0,c=this.length;b<c;b++){d=g.length,p.find(a,this[b],g);if(b>0)for(e=d;e<g.length;e++)for(f=0;f<d;f++)if(g[f]===g[e]){g.splice(e--,1);break}}return g},has:function(a){var b,c=p(a,this),d=c.length;return this.filter(function(){for(b=0;b<d;b++)if(p.contains(this,c[b]))return!0})},not:function(a){return this.pushStack(bj(this,a,!1),"not",a)},filter:function(a){return this.pushStack(bj(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?bf.test(a)?p(a,this.context).index(this[0])>=0:p.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c,d=0,e=this.length,f=[],g=bf.test(a)||typeof a!="string"?p(a,b||this.context):0;for(;d<e;d++){c=this[d];while(c&&c.ownerDocument&&c!==b&&c.nodeType!==11){if(g?g.index(c)>-1:p.find.matchesSelector(c,a)){f.push(c);break}c=c.parentNode}}return f=f.length>1?p.unique(f):f,this.pushStack(f,"closest",a)},index:function(a){return a?typeof a=="string"?p.inArray(this[0],p(a)):p.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(a,b){var c=typeof a=="string"?p(a,b):p.makeArray(a&&a.nodeType?[a]:a),d=p.merge(this.get(),c);return this.pushStack(bh(c[0])||bh(d[0])?d:p.unique(d))},addBack:function(a){return this.add(a==null?this.prevObject:this.prevObject.filter(a))}}),p.fn.andSelf=p.fn.addBack,p.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return p.dir(a,"parentNode")},parentsUntil:function(a,b,c){return p.dir(a,"parentNode",c)},next:function(a){return bi(a,"nextSibling")},prev:function(a){return bi(a,"previousSibling")},nextAll:function(a){return p.dir(a,"nextSibling")},prevAll:function(a){return p.dir(a,"previousSibling")},nextUntil:function(a,b,c){return p.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return p.dir(a,"previousSibling",c)},siblings:function(a){return p.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return p.sibling(a.firstChild)},contents:function(a){return p.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:p.merge([],a.childNodes)}},function(a,b){p.fn[a]=function(c,d){var e=p.map(this,b,c);return bc.test(a)||(d=c),d&&typeof d=="string"&&(e=p.filter(d,e)),e=this.length>1&&!bg[a]?p.unique(e):e,this.length>1&&bd.test(a)&&(e=e.reverse()),this.pushStack(e,a,k.call(arguments).join(","))}}),p.extend({filter:function(a,b,c){return c&&(a=":not("+a+")"),b.length===1?p.find.matchesSelector(b[0],a)?[b[0]]:[]:p.find.matches(a,b)},dir:function(a,c,d){var e=[],f=a[c];while(f&&f.nodeType!==9&&(d===b||f.nodeType!==1||!p(f).is(d)))f.nodeType===1&&e.push(f),f=f[c];return e},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var bl="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",bm=/ jQuery\d+="(?:null|\d+)"/g,bn=/^\s+/,bo=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bp=/<([\w:]+)/,bq=/<tbody/i,br=/<|&#?\w+;/,bs=/<(?:script|style|link)/i,bt=/<(?:script|object|embed|option|style)/i,bu=new RegExp("<(?:"+bl+")[\\s/>]","i"),bv=/^(?:checkbox|radio)$/,bw=/checked\s*(?:[^=]|=\s*.checked.)/i,bx=/\/(java|ecma)script/i,by=/^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,bz={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},bA=bk(e),bB=bA.appendChild(e.createElement("div"));bz.optgroup=bz.option,bz.tbody=bz.tfoot=bz.colgroup=bz.caption=bz.thead,bz.th=bz.td,p.support.htmlSerialize||(bz._default=[1,"X<div>","</div>"]),p.fn.extend({text:function(a){return p.access(this,function(a){return a===b?p.text(this):this.empty().append((this[0]&&this[0].ownerDocument||e).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(p.isFunction(a))return this.each(function(b){p(this).wrapAll(a.call(this,b))});if(this[0]){var b=p(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return p.isFunction(a)?this.each(function(b){p(this).wrapInner(a.call(this,b))}):this.each(function(){var b=p(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=p.isFunction(a);return this.each(function(c){p(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){p.nodeName(this,"body")||p(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.insertBefore(a,this.firstChild)})},before:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(a,this),"before",this.selector)}},after:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(this,a),"after",this.selector)}},remove:function(a,b){var c,d=0;for(;(c=this[d])!=null;d++)if(!a||p.filter(a,[c]).length)!b&&c.nodeType===1&&(p.cleanData(c.getElementsByTagName("*")),p.cleanData([c])),c.parentNode&&c.parentNode.removeChild(c);return this},empty:function(){var a,b=0;for(;(a=this[b])!=null;b++){a.nodeType===1&&p.cleanData(a.getElementsByTagName("*"));while(a.firstChild)a.removeChild(a.firstChild)}return this},clone:function(a,b){return a=a==null?!1:a,b=b==null?a:b,this.map(function(){return p.clone(this,a,b)})},html:function(a){return p.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(bm,""):b;if(typeof a=="string"&&!bs.test(a)&&(p.support.htmlSerialize||!bu.test(a))&&(p.support.leadingWhitespace||!bn.test(a))&&!bz[(bp.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(bo,"<$1></$2>");try{for(;d<e;d++)c=this[d]||{},c.nodeType===1&&(p.cleanData(c.getElementsByTagName("*")),c.innerHTML=a);c=0}catch(f){}}c&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(a){return bh(this[0])?this.length?this.pushStack(p(p.isFunction(a)?a():a),"replaceWith",a):this:p.isFunction(a)?this.each(function(b){var c=p(this),d=c.html();c.replaceWith(a.call(this,b,d))}):(typeof a!="string"&&(a=p(a).detach()),this.each(function(){var b=this.nextSibling,c=this.parentNode;p(this).remove(),b?p(b).before(a):p(c).append(a)}))},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){a=[].concat.apply([],a);var e,f,g,h,i=0,j=a[0],k=[],l=this.length;if(!p.support.checkClone&&l>1&&typeof j=="string"&&bw.test(j))return this.each(function(){p(this).domManip(a,c,d)});if(p.isFunction(j))return this.each(function(e){var f=p(this);a[0]=j.call(this,e,c?f.html():b),f.domManip(a,c,d)});if(this[0]){e=p.buildFragment(a,this,k),g=e.fragment,f=g.firstChild,g.childNodes.length===1&&(g=f);if(f){c=c&&p.nodeName(f,"tr");for(h=e.cacheable||l-1;i<l;i++)d.call(c&&p.nodeName(this[i],"table")?bC(this[i],"tbody"):this[i],i===h?g:p.clone(g,!0,!0))}g=f=null,k.length&&p.each(k,function(a,b){b.src?p.ajax?p.ajax({url:b.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):p.error("no ajax"):p.globalEval((b.text||b.textContent||b.innerHTML||"").replace(by,"")),b.parentNode&&b.parentNode.removeChild(b)})}return this}}),p.buildFragment=function(a,c,d){var f,g,h,i=a[0];return c=c||e,c=!c.nodeType&&c[0]||c,c=c.ownerDocument||c,a.length===1&&typeof i=="string"&&i.length<512&&c===e&&i.charAt(0)==="<"&&!bt.test(i)&&(p.support.checkClone||!bw.test(i))&&(p.support.html5Clone||!bu.test(i))&&(g=!0,f=p.fragments[i],h=f!==b),f||(f=c.createDocumentFragment(),p.clean(a,c,f,d),g&&(p.fragments[i]=h&&f)),{fragment:f,cacheable:g}},p.fragments={},p.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){p.fn[a]=function(c){var d,e=0,f=[],g=p(c),h=g.length,i=this.length===1&&this[0].parentNode;if((i==null||i&&i.nodeType===11&&i.childNodes.length===1)&&h===1)return g[b](this[0]),this;for(;e<h;e++)d=(e>0?this.clone(!0):this).get(),p(g[e])[b](d),f=f.concat(d);return this.pushStack(f,a,g.selector)}}),p.extend({clone:function(a,b,c){var d,e,f,g;p.support.html5Clone||p.isXMLDoc(a)||!bu.test("<"+a.nodeName+">")?g=a.cloneNode(!0):(bB.innerHTML=a.outerHTML,bB.removeChild(g=bB.firstChild));if((!p.support.noCloneEvent||!p.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!p.isXMLDoc(a)){bE(a,g),d=bF(a),e=bF(g);for(f=0;d[f];++f)e[f]&&bE(d[f],e[f])}if(b){bD(a,g);if(c){d=bF(a),e=bF(g);for(f=0;d[f];++f)bD(d[f],e[f])}}return d=e=null,g},clean:function(a,b,c,d){var f,g,h,i,j,k,l,m,n,o,q,r,s=b===e&&bA,t=[];if(!b||typeof b.createDocumentFragment=="undefined")b=e;for(f=0;(h=a[f])!=null;f++){typeof h=="number"&&(h+="");if(!h)continue;if(typeof h=="string")if(!br.test(h))h=b.createTextNode(h);else{s=s||bk(b),l=b.createElement("div"),s.appendChild(l),h=h.replace(bo,"<$1></$2>"),i=(bp.exec(h)||["",""])[1].toLowerCase(),j=bz[i]||bz._default,k=j[0],l.innerHTML=j[1]+h+j[2];while(k--)l=l.lastChild;if(!p.support.tbody){m=bq.test(h),n=i==="table"&&!m?l.firstChild&&l.firstChild.childNodes:j[1]==="<table>"&&!m?l.childNodes:[];for(g=n.length-1;g>=0;--g)p.nodeName(n[g],"tbody")&&!n[g].childNodes.length&&n[g].parentNode.removeChild(n[g])}!p.support.leadingWhitespace&&bn.test(h)&&l.insertBefore(b.createTextNode(bn.exec(h)[0]),l.firstChild),h=l.childNodes,l.parentNode.removeChild(l)}h.nodeType?t.push(h):p.merge(t,h)}l&&(h=l=s=null);if(!p.support.appendChecked)for(f=0;(h=t[f])!=null;f++)p.nodeName(h,"input")?bG(h):typeof h.getElementsByTagName!="undefined"&&p.grep(h.getElementsByTagName("input"),bG);if(c){q=function(a){if(!a.type||bx.test(a.type))return d?d.push(a.parentNode?a.parentNode.removeChild(a):a):c.appendChild(a)};for(f=0;(h=t[f])!=null;f++)if(!p.nodeName(h,"script")||!q(h))c.appendChild(h),typeof h.getElementsByTagName!="undefined"&&(r=p.grep(p.merge([],h.getElementsByTagName("script")),q),t.splice.apply(t,[f+1,0].concat(r)),f+=r.length)}return t},cleanData:function(a,b){var c,d,e,f,g=0,h=p.expando,i=p.cache,j=p.support.deleteExpando,k=p.event.special;for(;(e=a[g])!=null;g++)if(b||p.acceptData(e)){d=e[h],c=d&&i[d];if(c){if(c.events)for(f in c.events)k[f]?p.event.remove(e,f):p.removeEvent(e,f,c.handle);i[d]&&(delete i[d],j?delete e[h]:e.removeAttribute?e.removeAttribute(h):e[h]=null,p.deletedIds.push(d))}}}}),function(){var a,b;p.uaMatch=function(a){a=a.toLowerCase();var b=/(chrome)[ \/]([\w.]+)/.exec(a)||/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||a.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},a=p.uaMatch(g.userAgent),b={},a.browser&&(b[a.browser]=!0,b.version=a.version),b.chrome?b.webkit=!0:b.webkit&&(b.safari=!0),p.browser=b,p.sub=function(){function a(b,c){return new a.fn.init(b,c)}p.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function c(c,d){return d&&d instanceof p&&!(d instanceof a)&&(d=a(d)),p.fn.init.call(this,c,d,b)},a.fn.init.prototype=a.fn;var b=a(e);return a}}();var bH,bI,bJ,bK=/alpha\([^)]*\)/i,bL=/opacity=([^)]*)/,bM=/^(top|right|bottom|left)$/,bN=/^(none|table(?!-c[ea]).+)/,bO=/^margin/,bP=new RegExp("^("+q+")(.*)$","i"),bQ=new RegExp("^("+q+")(?!px)[a-z%]+$","i"),bR=new RegExp("^([-+])=("+q+")","i"),bS={},bT={position:"absolute",visibility:"hidden",display:"block"},bU={letterSpacing:0,fontWeight:400},bV=["Top","Right","Bottom","Left"],bW=["Webkit","O","Moz","ms"],bX=p.fn.toggle;p.fn.extend({css:function(a,c){return p.access(this,function(a,c,d){return d!==b?p.style(a,c,d):p.css(a,c)},a,c,arguments.length>1)},show:function(){return b$(this,!0)},hide:function(){return b$(this)},toggle:function(a,b){var c=typeof a=="boolean";return p.isFunction(a)&&p.isFunction(b)?bX.apply(this,arguments):this.each(function(){(c?a:bZ(this))?p(this).show():p(this).hide()})}}),p.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bH(a,"opacity");return c===""?"1":c}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":p.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!a||a.nodeType===3||a.nodeType===8||!a.style)return;var f,g,h,i=p.camelCase(c),j=a.style;c=p.cssProps[i]||(p.cssProps[i]=bY(j,i)),h=p.cssHooks[c]||p.cssHooks[i];if(d===b)return h&&"get"in h&&(f=h.get(a,!1,e))!==b?f:j[c];g=typeof d,g==="string"&&(f=bR.exec(d))&&(d=(f[1]+1)*f[2]+parseFloat(p.css(a,c)),g="number");if(d==null||g==="number"&&isNaN(d))return;g==="number"&&!p.cssNumber[i]&&(d+="px");if(!h||!("set"in h)||(d=h.set(a,d,e))!==b)try{j[c]=d}catch(k){}},css:function(a,c,d,e){var f,g,h,i=p.camelCase(c);return c=p.cssProps[i]||(p.cssProps[i]=bY(a.style,i)),h=p.cssHooks[c]||p.cssHooks[i],h&&"get"in h&&(f=h.get(a,!0,e)),f===b&&(f=bH(a,c)),f==="normal"&&c in bU&&(f=bU[c]),d||e!==b?(g=parseFloat(f),d||p.isNumeric(g)?g||0:f):f},swap:function(a,b,c){var d,e,f={};for(e in b)f[e]=a.style[e],a.style[e]=b[e];d=c.call(a);for(e in b)a.style[e]=f[e];return d}}),a.getComputedStyle?bH=function(b,c){var d,e,f,g,h=a.getComputedStyle(b,null),i=b.style;return h&&(d=h[c],d===""&&!p.contains(b.ownerDocument,b)&&(d=p.style(b,c)),bQ.test(d)&&bO.test(c)&&(e=i.width,f=i.minWidth,g=i.maxWidth,i.minWidth=i.maxWidth=i.width=d,d=h.width,i.width=e,i.minWidth=f,i.maxWidth=g)),d}:e.documentElement.currentStyle&&(bH=function(a,b){var c,d,e=a.currentStyle&&a.currentStyle[b],f=a.style;return e==null&&f&&f[b]&&(e=f[b]),bQ.test(e)&&!bM.test(b)&&(c=f.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":e,e=f.pixelLeft+"px",f.left=c,d&&(a.runtimeStyle.left=d)),e===""?"auto":e}),p.each(["height","width"],function(a,b){p.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth===0&&bN.test(bH(a,"display"))?p.swap(a,bT,function(){return cb(a,b,d)}):cb(a,b,d)},set:function(a,c,d){return b_(a,c,d?ca(a,b,d,p.support.boxSizing&&p.css(a,"boxSizing")==="border-box"):0)}}}),p.support.opacity||(p.cssHooks.opacity={get:function(a,b){return bL.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=p.isNumeric(b)?"alpha(opacity="+b*100+")":"",f=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&p.trim(f.replace(bK,""))===""&&c.removeAttribute){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bK.test(f)?f.replace(bK,e):f+" "+e}}),p(function(){p.support.reliableMarginRight||(p.cssHooks.marginRight={get:function(a,b){return p.swap(a,{display:"inline-block"},function(){if(b)return bH(a,"marginRight")})}}),!p.support.pixelPosition&&p.fn.position&&p.each(["top","left"],function(a,b){p.cssHooks[b]={get:function(a,c){if(c){var d=bH(a,b);return bQ.test(d)?p(a).position()[b]+"px":d}}}})}),p.expr&&p.expr.filters&&(p.expr.filters.hidden=function(a){return a.offsetWidth===0&&a.offsetHeight===0||!p.support.reliableHiddenOffsets&&(a.style&&a.style.display||bH(a,"display"))==="none"},p.expr.filters.visible=function(a){return!p.expr.filters.hidden(a)}),p.each({margin:"",padding:"",border:"Width"},function(a,b){p.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bV[d]+b]=e[d]||e[d-2]||e[0];return f}},bO.test(a)||(p.cssHooks[a+b].set=b_)});var cd=/%20/g,ce=/\[\]$/,cf=/\r?\n/g,cg=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,ch=/^(?:select|textarea)/i;p.fn.extend({serialize:function(){return p.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?p.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ch.test(this.nodeName)||cg.test(this.type))}).map(function(a,b){var c=p(this).val();return c==null?null:p.isArray(c)?p.map(c,function(a,c){return{name:b.name,value:a.replace(cf,"\r\n")}}):{name:b.name,value:c.replace(cf,"\r\n")}}).get()}}),p.param=function(a,c){var d,e=[],f=function(a,b){b=p.isFunction(b)?b():b==null?"":b,e[e.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=p.ajaxSettings&&p.ajaxSettings.traditional);if(p.isArray(a)||a.jquery&&!p.isPlainObject(a))p.each(a,function(){f(this.name,this.value)});else for(d in a)ci(d,a[d],c,f);return e.join("&").replace(cd,"+")};var cj,ck,cl=/#.*$/,cm=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,cn=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,co=/^(?:GET|HEAD)$/,cp=/^\/\//,cq=/\?/,cr=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,cs=/([?&])_=[^&]*/,ct=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,cu=p.fn.load,cv={},cw={},cx=["*/"]+["*"];try{ck=f.href}catch(cy){ck=e.createElement("a"),ck.href="",ck=ck.href}cj=ct.exec(ck.toLowerCase())||[],p.fn.load=function(a,c,d){if(typeof a!="string"&&cu)return cu.apply(this,arguments);if(!this.length)return this;var e,f,g,h=this,i=a.indexOf(" ");return i>=0&&(e=a.slice(i,a.length),a=a.slice(0,i)),p.isFunction(c)?(d=c,c=b):c&&typeof c=="object"&&(f="POST"),p.ajax({url:a,type:f,dataType:"html",data:c,complete:function(a,b){d&&h.each(d,g||[a.responseText,b,a])}}).done(function(a){g=arguments,h.html(e?p("<div>").append(a.replace(cr,"")).find(e):a)}),this},p.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){p.fn[b]=function(a){return this.on(b,a)}}),p.each(["get","post"],function(a,c){p[c]=function(a,d,e,f){return p.isFunction(d)&&(f=f||e,e=d,d=b),p.ajax({type:c,url:a,data:d,success:e,dataType:f})}}),p.extend({getScript:function(a,c){return p.get(a,b,c,"script")},getJSON:function(a,b,c){return p.get(a,b,c,"json")},ajaxSetup:function(a,b){return b?cB(a,p.ajaxSettings):(b=a,a=p.ajaxSettings),cB(a,b),a},ajaxSettings:{url:ck,isLocal:cn.test(cj[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":cx},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":p.parseJSON,"text xml":p.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:cz(cv),ajaxTransport:cz(cw),ajax:function(a,c){function y(a,c,f,i){var k,s,t,u,w,y=c;if(v===2)return;v=2,h&&clearTimeout(h),g=b,e=i||"",x.readyState=a>0?4:0,f&&(u=cC(l,x,f));if(a>=200&&a<300||a===304)l.ifModified&&(w=x.getResponseHeader("Last-Modified"),w&&(p.lastModified[d]=w),w=x.getResponseHeader("Etag"),w&&(p.etag[d]=w)),a===304?(y="notmodified",k=!0):(k=cD(l,u),y=k.state,s=k.data,t=k.error,k=!t);else{t=y;if(!y||a)y="error",a<0&&(a=0)}x.status=a,x.statusText=(c||y)+"",k?o.resolveWith(m,[s,y,x]):o.rejectWith(m,[x,y,t]),x.statusCode(r),r=b,j&&n.trigger("ajax"+(k?"Success":"Error"),[x,l,k?s:t]),q.fireWith(m,[x,y]),j&&(n.trigger("ajaxComplete",[x,l]),--p.active||p.event.trigger("ajaxStop"))}typeof a=="object"&&(c=a,a=b),c=c||{};var d,e,f,g,h,i,j,k,l=p.ajaxSetup({},c),m=l.context||l,n=m!==l&&(m.nodeType||m instanceof p)?p(m):p.event,o=p.Deferred(),q=p.Callbacks("once memory"),r=l.statusCode||{},t={},u={},v=0,w="canceled",x={readyState:0,setRequestHeader:function(a,b){if(!v){var c=a.toLowerCase();a=u[c]=u[c]||a,t[a]=b}return this},getAllResponseHeaders:function(){return v===2?e:null},getResponseHeader:function(a){var c;if(v===2){if(!f){f={};while(c=cm.exec(e))f[c[1].toLowerCase()]=c[2]}c=f[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){return v||(l.mimeType=a),this},abort:function(a){return a=a||w,g&&g.abort(a),y(0,a),this}};o.promise(x),x.success=x.done,x.error=x.fail,x.complete=q.add,x.statusCode=function(a){if(a){var b;if(v<2)for(b in a)r[b]=[r[b],a[b]];else b=a[x.status],x.always(b)}return this},l.url=((a||l.url)+"").replace(cl,"").replace(cp,cj[1]+"//"),l.dataTypes=p.trim(l.dataType||"*").toLowerCase().split(s),l.crossDomain==null&&(i=ct.exec(l.url.toLowerCase())||!1,l.crossDomain=i&&i.join(":")+(i[3]?"":i[1]==="http:"?80:443)!==cj.join(":")+(cj[3]?"":cj[1]==="http:"?80:443)),l.data&&l.processData&&typeof l.data!="string"&&(l.data=p.param(l.data,l.traditional)),cA(cv,l,c,x);if(v===2)return x;j=l.global,l.type=l.type.toUpperCase(),l.hasContent=!co.test(l.type),j&&p.active++===0&&p.event.trigger("ajaxStart");if(!l.hasContent){l.data&&(l.url+=(cq.test(l.url)?"&":"?")+l.data,delete l.data),d=l.url;if(l.cache===!1){var z=p.now(),A=l.url.replace(cs,"$1_="+z);l.url=A+(A===l.url?(cq.test(l.url)?"&":"?")+"_="+z:"")}}(l.data&&l.hasContent&&l.contentType!==!1||c.contentType)&&x.setRequestHeader("Content-Type",l.contentType),l.ifModified&&(d=d||l.url,p.lastModified[d]&&x.setRequestHeader("If-Modified-Since",p.lastModified[d]),p.etag[d]&&x.setRequestHeader("If-None-Match",p.etag[d])),x.setRequestHeader("Accept",l.dataTypes[0]&&l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+(l.dataTypes[0]!=="*"?", "+cx+"; q=0.01":""):l.accepts["*"]);for(k in l.headers)x.setRequestHeader(k,l.headers[k]);if(!l.beforeSend||l.beforeSend.call(m,x,l)!==!1&&v!==2){w="abort";for(k in{success:1,error:1,complete:1})x[k](l[k]);g=cA(cw,l,c,x);if(!g)y(-1,"No Transport");else{x.readyState=1,j&&n.trigger("ajaxSend",[x,l]),l.async&&l.timeout>0&&(h=setTimeout(function(){x.abort("timeout")},l.timeout));try{v=1,g.send(t,y)}catch(B){if(v<2)y(-1,B);else throw B}}return x}return x.abort()},active:0,lastModified:{},etag:{}});var cE=[],cF=/\?/,cG=/(=)\?(?=&|$)|\?\?/,cH=p.now();p.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=cE.pop()||p.expando+"_"+cH++;return this[a]=!0,a}}),p.ajaxPrefilter("json jsonp",function(c,d,e){var f,g,h,i=c.data,j=c.url,k=c.jsonp!==!1,l=k&&cG.test(j),m=k&&!l&&typeof i=="string"&&!(c.contentType||"").indexOf("application/x-www-form-urlencoded")&&cG.test(i);if(c.dataTypes[0]==="jsonp"||l||m)return f=c.jsonpCallback=p.isFunction(c.jsonpCallback)?c.jsonpCallback():c.jsonpCallback,g=a[f],l?c.url=j.replace(cG,"$1"+f):m?c.data=i.replace(cG,"$1"+f):k&&(c.url+=(cF.test(j)?"&":"?")+c.jsonp+"="+f),c.converters["script json"]=function(){return h||p.error(f+" was not called"),h[0]},c.dataTypes[0]="json",a[f]=function(){h=arguments},e.always(function(){a[f]=g,c[f]&&(c.jsonpCallback=d.jsonpCallback,cE.push(f)),h&&p.isFunction(g)&&g(h[0]),h=g=b}),"script"}),p.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){return p.globalEval(a),a}}}),p.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),p.ajaxTransport("script",function(a){if(a.crossDomain){var c,d=e.head||e.getElementsByTagName("head")[0]||e.documentElement;return{send:function(f,g){c=e.createElement("script"),c.async="async",a.scriptCharset&&(c.charset=a.scriptCharset),c.src=a.url,c.onload=c.onreadystatechange=function(a,e){if(e||!c.readyState||/loaded|complete/.test(c.readyState))c.onload=c.onreadystatechange=null,d&&c.parentNode&&d.removeChild(c),c=b,e||g(200,"success")},d.insertBefore(c,d.firstChild)},abort:function(){c&&c.onload(0,1)}}}});var cI,cJ=a.ActiveXObject?function(){for(var a in cI)cI[a](0,1)}:!1,cK=0;p.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&cL()||cM()}:cL,function(a){p.extend(p.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(p.ajaxSettings.xhr()),p.support.ajax&&p.ajaxTransport(function(c){if(!c.crossDomain||p.support.cors){var d;return{send:function(e,f){var g,h,i=c.xhr();c.username?i.open(c.type,c.url,c.async,c.username,c.password):i.open(c.type,c.url,c.async);if(c.xhrFields)for(h in c.xhrFields)i[h]=c.xhrFields[h];c.mimeType&&i.overrideMimeType&&i.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(h in e)i.setRequestHeader(h,e[h])}catch(j){}i.send(c.hasContent&&c.data||null),d=function(a,e){var h,j,k,l,m;try{if(d&&(e||i.readyState===4)){d=b,g&&(i.onreadystatechange=p.noop,cJ&&delete cI[g]);if(e)i.readyState!==4&&i.abort();else{h=i.status,k=i.getAllResponseHeaders(),l={},m=i.responseXML,m&&m.documentElement&&(l.xml=m);try{l.text=i.responseText}catch(a){}try{j=i.statusText}catch(n){j=""}!h&&c.isLocal&&!c.crossDomain?h=l.text?200:404:h===1223&&(h=204)}}}catch(o){e||f(-1,o)}l&&f(h,j,l,k)},c.async?i.readyState===4?setTimeout(d,0):(g=++cK,cJ&&(cI||(cI={},p(a).unload(cJ)),cI[g]=d),i.onreadystatechange=d):d()},abort:function(){d&&d(0,1)}}}});var cN,cO,cP=/^(?:toggle|show|hide)$/,cQ=new RegExp("^(?:([-+])=|)("+q+")([a-z%]*)$","i"),cR=/queueHooks$/,cS=[cY],cT={"*":[function(a,b){var c,d,e=this.createTween(a,b),f=cQ.exec(b),g=e.cur(),h=+g||0,i=1,j=20;if(f){c=+f[2],d=f[3]||(p.cssNumber[a]?"":"px");if(d!=="px"&&h){h=p.css(e.elem,a,!0)||c||1;do i=i||".5",h=h/i,p.style(e.elem,a,h+d);while(i!==(i=e.cur()/g)&&i!==1&&--j)}e.unit=d,e.start=h,e.end=f[1]?h+(f[1]+1)*c:c}return e}]};p.Animation=p.extend(cW,{tweener:function(a,b){p.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");var c,d=0,e=a.length;for(;d<e;d++)c=a[d],cT[c]=cT[c]||[],cT[c].unshift(b)},prefilter:function(a,b){b?cS.unshift(a):cS.push(a)}}),p.Tween=cZ,cZ.prototype={constructor:cZ,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(p.cssNumber[c]?"":"px")},cur:function(){var a=cZ.propHooks[this.prop];return a&&a.get?a.get(this):cZ.propHooks._default.get(this)},run:function(a){var b,c=cZ.propHooks[this.prop];return this.options.duration?this.pos=b=p.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):cZ.propHooks._default.set(this),this}},cZ.prototype.init.prototype=cZ.prototype,cZ.propHooks={_default:{get:function(a){var b;return a.elem[a.prop]==null||!!a.elem.style&&a.elem.style[a.prop]!=null?(b=p.css(a.elem,a.prop,!1,""),!b||b==="auto"?0:b):a.elem[a.prop]},set:function(a){p.fx.step[a.prop]?p.fx.step[a.prop](a):a.elem.style&&(a.elem.style[p.cssProps[a.prop]]!=null||p.cssHooks[a.prop])?p.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},cZ.propHooks.scrollTop=cZ.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},p.each(["toggle","show","hide"],function(a,b){var c=p.fn[b];p.fn[b]=function(d,e,f){return d==null||typeof d=="boolean"||!a&&p.isFunction(d)&&p.isFunction(e)?c.apply(this,arguments):this.animate(c$(b,!0),d,e,f)}}),p.fn.extend({fadeTo:function(a,b,c,d){return this.filter(bZ).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=p.isEmptyObject(a),f=p.speed(b,c,d),g=function(){var b=cW(this,p.extend({},a),f);e&&b.stop(!0)};return e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,c,d){var e=function(a){var b=a.stop;delete a.stop,b(d)};return typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,c=a!=null&&a+"queueHooks",f=p.timers,g=p._data(this);if(c)g[c]&&g[c].stop&&e(g[c]);else for(c in g)g[c]&&g[c].stop&&cR.test(c)&&e(g[c]);for(c=f.length;c--;)f[c].elem===this&&(a==null||f[c].queue===a)&&(f[c].anim.stop(d),b=!1,f.splice(c,1));(b||!d)&&p.dequeue(this,a)})}}),p.each({slideDown:c$("show"),slideUp:c$("hide"),slideToggle:c$("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){p.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),p.speed=function(a,b,c){var d=a&&typeof a=="object"?p.extend({},a):{complete:c||!c&&b||p.isFunction(a)&&a,duration:a,easing:c&&b||b&&!p.isFunction(b)&&b};d.duration=p.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in p.fx.speeds?p.fx.speeds[d.duration]:p.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";return d.old=d.complete,d.complete=function(){p.isFunction(d.old)&&d.old.call(this),d.queue&&p.dequeue(this,d.queue)},d},p.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},p.timers=[],p.fx=cZ.prototype.init,p.fx.tick=function(){var a,b=p.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||p.fx.stop()},p.fx.timer=function(a){a()&&p.timers.push(a)&&!cO&&(cO=setInterval(p.fx.tick,p.fx.interval))},p.fx.interval=13,p.fx.stop=function(){clearInterval(cO),cO=null},p.fx.speeds={slow:600,fast:200,_default:400},p.fx.step={},p.expr&&p.expr.filters&&(p.expr.filters.animated=function(a){return p.grep(p.timers,function(b){return a===b.elem}).length});var c_=/^(?:body|html)$/i;p.fn.offset=function(a){if(arguments.length)return a===b?this:this.each(function(b){p.offset.setOffset(this,a,b)});var c,d,e,f,g,h,i,j={top:0,left:0},k=this[0],l=k&&k.ownerDocument;if(!l)return;return(d=l.body)===k?p.offset.bodyOffset(k):(c=l.documentElement,p.contains(c,k)?(typeof k.getBoundingClientRect!="undefined"&&(j=k.getBoundingClientRect()),e=da(l),f=c.clientTop||d.clientTop||0,g=c.clientLeft||d.clientLeft||0,h=e.pageYOffset||c.scrollTop,i=e.pageXOffset||c.scrollLeft,{top:j.top+h-f,left:j.left+i-g}):j)},p.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;return p.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(p.css(a,"marginTop"))||0,c+=parseFloat(p.css(a,"marginLeft"))||0),{top:b,left:c}},setOffset:function(a,b,c){var d=p.css(a,"position");d==="static"&&(a.style.position="relative");var e=p(a),f=e.offset(),g=p.css(a,"top"),h=p.css(a,"left"),i=(d==="absolute"||d==="fixed")&&p.inArray("auto",[g,h])>-1,j={},k={},l,m;i?(k=e.position(),l=k.top,m=k.left):(l=parseFloat(g)||0,m=parseFloat(h)||0),p.isFunction(b)&&(b=b.call(a,c,f)),b.top!=null&&(j.top=b.top-f.top+l),b.left!=null&&(j.left=b.left-f.left+m),"using"in b?b.using.call(a,j):e.css(j)}},p.fn.extend({position:function(){if(!this[0])return;var a=this[0],b=this.offsetParent(),c=this.offset(),d=c_.test(b[0].nodeName)?{top:0,left:0}:b.offset();return c.top-=parseFloat(p.css(a,"marginTop"))||0,c.left-=parseFloat(p.css(a,"marginLeft"))||0,d.top+=parseFloat(p.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(p.css(b[0],"borderLeftWidth"))||0,{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=e.body||this.offsetParent;while(a&&!c_.test(a.nodeName)&&p.css(a,"position")==="static")a=a.offsetParent;return a||e.body})}}),p.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);p.fn[a]=function(e){return p.access(this,function(a,e,f){var g=da(a);if(f===b)return g?c in g?g[c]:g.document.documentElement[e]:a[e];g?g.scrollTo(d?p(g).scrollLeft():f,d?f:p(g).scrollTop()):a[e]=f},a,e,arguments.length,null)}}),p.each({Height:"height",Width:"width"},function(a,c){p.each({padding:"inner"+a,content:c,"":"outer"+a},function(d,e){p.fn[e]=function(e,f){var g=arguments.length&&(d||typeof e!="boolean"),h=d||(e===!0||f===!0?"margin":"border");return p.access(this,function(c,d,e){var f;return p.isWindow(c)?c.document.documentElement["client"+a]:c.nodeType===9?(f=c.documentElement,Math.max(c.body["scroll"+a],f["scroll"+a],c.body["offset"+a],f["offset"+a],f["client"+a])):e===b?p.css(c,d,e,h):p.style(c,d,e,h)},c,g?e:b,g,null)}})}),a.jQuery=a.$=p,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return p})})(window);
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/jquery/jquery-migrate-1.4.1.js b/Source/platformProject/platform2022UI/jslib/jquery/jquery-migrate-1.4.1.js
new file mode 100644
index 0000000..89437eb
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/jquery/jquery-migrate-1.4.1.js
@@ -0,0 +1,752 @@
+/*!
+ * jQuery Migrate - v1.4.1 - 2016-05-19
+ * Copyright jQuery Foundation and other contributors
+ */
+(function( jQuery, window, undefined ) {
+// See http://bugs.jquery.com/ticket/13335
+// "use strict";
+
+
+jQuery.migrateVersion = "1.4.1";
+
+
+var warnedAbout = {};
+
+// List of warnings already given; public read only
+jQuery.migrateWarnings = [];
+
+// Set to true to prevent console output; migrateWarnings still maintained
+// jQuery.migrateMute = false;
+
+// Show a message on the console so devs know we're active
+if ( window.console && window.console.log ) {
+	window.console.log( "JQMIGRATE: Migrate is installed" +
+		( jQuery.migrateMute ? "" : " with logging active" ) +
+		", version " + jQuery.migrateVersion );
+}
+
+// Set to false to disable traces that appear with warnings
+if ( jQuery.migrateTrace === undefined ) {
+	jQuery.migrateTrace = true;
+}
+
+// Forget any warnings we've already given; public
+jQuery.migrateReset = function() {
+	warnedAbout = {};
+	jQuery.migrateWarnings.length = 0;
+};
+
+function migrateWarn( msg) {
+	var console = window.console;
+	if ( !warnedAbout[ msg ] ) {
+		warnedAbout[ msg ] = true;
+		jQuery.migrateWarnings.push( msg );
+		if ( console && console.warn && !jQuery.migrateMute ) {
+			console.warn( "JQMIGRATE: " + msg );
+			if ( jQuery.migrateTrace && console.trace ) {
+				console.trace();
+			}
+		}
+	}
+}
+
+function migrateWarnProp( obj, prop, value, msg ) {
+	if ( Object.defineProperty ) {
+		// On ES5 browsers (non-oldIE), warn if the code tries to get prop;
+		// allow property to be overwritten in case some other plugin wants it
+		try {
+			Object.defineProperty( obj, prop, {
+				configurable: true,
+				enumerable: true,
+				get: function() {
+					migrateWarn( msg );
+					return value;
+				},
+				set: function( newValue ) {
+					migrateWarn( msg );
+					value = newValue;
+				}
+			});
+			return;
+		} catch( err ) {
+			// IE8 is a dope about Object.defineProperty, can't warn there
+		}
+	}
+
+	// Non-ES5 (or broken) browser; just set the property
+	jQuery._definePropertyBroken = true;
+	obj[ prop ] = value;
+}
+
+if ( document.compatMode === "BackCompat" ) {
+	// jQuery has never supported or tested Quirks Mode
+	migrateWarn( "jQuery is not compatible with Quirks Mode" );
+}
+
+
+var attrFn = jQuery( "<input/>", { size: 1 } ).attr("size") && jQuery.attrFn,
+	oldAttr = jQuery.attr,
+	valueAttrGet = jQuery.attrHooks.value && jQuery.attrHooks.value.get ||
+		function() { return null; },
+	valueAttrSet = jQuery.attrHooks.value && jQuery.attrHooks.value.set ||
+		function() { return undefined; },
+	rnoType = /^(?:input|button)$/i,
+	rnoAttrNodeType = /^[238]$/,
+	rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
+	ruseDefault = /^(?:checked|selected)$/i;
+
+// jQuery.attrFn
+migrateWarnProp( jQuery, "attrFn", attrFn || {}, "jQuery.attrFn is deprecated" );
+
+jQuery.attr = function( elem, name, value, pass ) {
+	var lowerName = name.toLowerCase(),
+		nType = elem && elem.nodeType;
+
+	if ( pass ) {
+		// Since pass is used internally, we only warn for new jQuery
+		// versions where there isn't a pass arg in the formal params
+		if ( oldAttr.length < 4 ) {
+			migrateWarn("jQuery.fn.attr( props, pass ) is deprecated");
+		}
+		if ( elem && !rnoAttrNodeType.test( nType ) &&
+			(attrFn ? name in attrFn : jQuery.isFunction(jQuery.fn[name])) ) {
+			return jQuery( elem )[ name ]( value );
+		}
+	}
+
+	// Warn if user tries to set `type`, since it breaks on IE 6/7/8; by checking
+	// for disconnected elements we don't warn on $( "<button>", { type: "button" } ).
+	if ( name === "type" && value !== undefined && rnoType.test( elem.nodeName ) && elem.parentNode ) {
+		migrateWarn("Can't change the 'type' of an input or button in IE 6/7/8");
+	}
+
+	// Restore boolHook for boolean property/attribute synchronization
+	if ( !jQuery.attrHooks[ lowerName ] && rboolean.test( lowerName ) ) {
+		jQuery.attrHooks[ lowerName ] = {
+			get: function( elem, name ) {
+				// Align boolean attributes with corresponding properties
+				// Fall back to attribute presence where some booleans are not supported
+				var attrNode,
+					property = jQuery.prop( elem, name );
+				return property === true || typeof property !== "boolean" &&
+					( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
+
+					name.toLowerCase() :
+					undefined;
+			},
+			set: function( elem, value, name ) {
+				var propName;
+				if ( value === false ) {
+					// Remove boolean attributes when set to false
+					jQuery.removeAttr( elem, name );
+				} else {
+					// value is true since we know at this point it's type boolean and not false
+					// Set boolean attributes to the same name and set the DOM property
+					propName = jQuery.propFix[ name ] || name;
+					if ( propName in elem ) {
+						// Only set the IDL specifically if it already exists on the element
+						elem[ propName ] = true;
+					}
+
+					elem.setAttribute( name, name.toLowerCase() );
+				}
+				return name;
+			}
+		};
+
+		// Warn only for attributes that can remain distinct from their properties post-1.9
+		if ( ruseDefault.test( lowerName ) ) {
+			migrateWarn( "jQuery.fn.attr('" + lowerName + "') might use property instead of attribute" );
+		}
+	}
+
+	return oldAttr.call( jQuery, elem, name, value );
+};
+
+// attrHooks: value
+jQuery.attrHooks.value = {
+	get: function( elem, name ) {
+		var nodeName = ( elem.nodeName || "" ).toLowerCase();
+		if ( nodeName === "button" ) {
+			return valueAttrGet.apply( this, arguments );
+		}
+		if ( nodeName !== "input" && nodeName !== "option" ) {
+			migrateWarn("jQuery.fn.attr('value') no longer gets properties");
+		}
+		return name in elem ?
+			elem.value :
+			null;
+	},
+	set: function( elem, value ) {
+		var nodeName = ( elem.nodeName || "" ).toLowerCase();
+		if ( nodeName === "button" ) {
+			return valueAttrSet.apply( this, arguments );
+		}
+		if ( nodeName !== "input" && nodeName !== "option" ) {
+			migrateWarn("jQuery.fn.attr('value', val) no longer sets properties");
+		}
+		// Does not return so that setAttribute is also used
+		elem.value = value;
+	}
+};
+
+
+var matched, browser,
+	oldInit = jQuery.fn.init,
+	oldFind = jQuery.find,
+	oldParseJSON = jQuery.parseJSON,
+	rspaceAngle = /^\s*</,
+	rattrHashTest = /\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/,
+	rattrHashGlob = /\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/g,
+	// Note: XSS check is done below after string is trimmed
+	rquickExpr = /^([^<]*)(<[\w\W]+>)([^>]*)$/;
+
+// $(html) "looks like html" rule change
+jQuery.fn.init = function( selector, context, rootjQuery ) {
+	var match, ret;
+
+	if ( selector && typeof selector === "string" ) {
+		if ( !jQuery.isPlainObject( context ) &&
+				(match = rquickExpr.exec( jQuery.trim( selector ) )) && match[ 0 ] ) {
+
+			// This is an HTML string according to the "old" rules; is it still?
+			if ( !rspaceAngle.test( selector ) ) {
+				migrateWarn("$(html) HTML strings must start with '<' character");
+			}
+			if ( match[ 3 ] ) {
+				migrateWarn("$(html) HTML text after last tag is ignored");
+			}
+
+			// Consistently reject any HTML-like string starting with a hash (gh-9521)
+			// Note that this may break jQuery 1.6.x code that otherwise would work.
+			if ( match[ 0 ].charAt( 0 ) === "#" ) {
+				migrateWarn("HTML string cannot start with a '#' character");
+				jQuery.error("JQMIGRATE: Invalid selector string (XSS)");
+			}
+
+			// Now process using loose rules; let pre-1.8 play too
+			// Is this a jQuery context? parseHTML expects a DOM element (#178)
+			if ( context && context.context && context.context.nodeType ) {
+				context = context.context;
+			}
+
+			if ( jQuery.parseHTML ) {
+				return oldInit.call( this,
+						jQuery.parseHTML( match[ 2 ], context && context.ownerDocument ||
+							context || document, true ), context, rootjQuery );
+			}
+		}
+	}
+
+	ret = oldInit.apply( this, arguments );
+
+	// Fill in selector and context properties so .live() works
+	if ( selector && selector.selector !== undefined ) {
+		// A jQuery object, copy its properties
+		ret.selector = selector.selector;
+		ret.context = selector.context;
+
+	} else {
+		ret.selector = typeof selector === "string" ? selector : "";
+		if ( selector ) {
+			ret.context = selector.nodeType? selector : context || document;
+		}
+	}
+
+	return ret;
+};
+jQuery.fn.init.prototype = jQuery.fn;
+
+jQuery.find = function( selector ) {
+	var args = Array.prototype.slice.call( arguments );
+
+	// Support: PhantomJS 1.x
+	// String#match fails to match when used with a //g RegExp, only on some strings
+	if ( typeof selector === "string" && rattrHashTest.test( selector ) ) {
+
+		// The nonstandard and undocumented unquoted-hash was removed in jQuery 1.12.0
+		// First see if qS thinks it's a valid selector, if so avoid a false positive
+		try {
+			document.querySelector( selector );
+		} catch ( err1 ) {
+
+			// Didn't *look* valid to qSA, warn and try quoting what we think is the value
+			selector = selector.replace( rattrHashGlob, function( _, attr, op, value ) {
+				return "[" + attr + op + "\"" + value + "\"]";
+			} );
+
+			// If the regexp *may* have created an invalid selector, don't update it
+			// Note that there may be false alarms if selector uses jQuery extensions
+			try {
+				document.querySelector( selector );
+				migrateWarn( "Attribute selector with '#' must be quoted: " + args[ 0 ] );
+				args[ 0 ] = selector;
+			} catch ( err2 ) {
+				migrateWarn( "Attribute selector with '#' was not fixed: " + args[ 0 ] );
+			}
+		}
+	}
+
+	return oldFind.apply( this, args );
+};
+
+// Copy properties attached to original jQuery.find method (e.g. .attr, .isXML)
+var findProp;
+for ( findProp in oldFind ) {
+	if ( Object.prototype.hasOwnProperty.call( oldFind, findProp ) ) {
+		jQuery.find[ findProp ] = oldFind[ findProp ];
+	}
+}
+
+// Let $.parseJSON(falsy_value) return null
+jQuery.parseJSON = function( json ) {
+	if ( !json ) {
+		migrateWarn("jQuery.parseJSON requires a valid JSON string");
+		return null;
+	}
+	return oldParseJSON.apply( this, arguments );
+};
+
+jQuery.uaMatch = function( ua ) {
+	ua = ua.toLowerCase();
+
+	var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
+		/(webkit)[ \/]([\w.]+)/.exec( ua ) ||
+		/(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
+		/(msie) ([\w.]+)/.exec( ua ) ||
+		ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
+		[];
+
+	return {
+		browser: match[ 1 ] || "",
+		version: match[ 2 ] || "0"
+	};
+};
+
+// Don't clobber any existing jQuery.browser in case it's different
+if ( !jQuery.browser ) {
+	matched = jQuery.uaMatch( navigator.userAgent );
+	browser = {};
+
+	if ( matched.browser ) {
+		browser[ matched.browser ] = true;
+		browser.version = matched.version;
+	}
+
+	// Chrome is Webkit, but Webkit is also Safari.
+	if ( browser.chrome ) {
+		browser.webkit = true;
+	} else if ( browser.webkit ) {
+		browser.safari = true;
+	}
+
+	jQuery.browser = browser;
+}
+
+// Warn if the code tries to get jQuery.browser
+migrateWarnProp( jQuery, "browser", jQuery.browser, "jQuery.browser is deprecated" );
+
+// jQuery.boxModel deprecated in 1.3, jQuery.support.boxModel deprecated in 1.7
+jQuery.boxModel = jQuery.support.boxModel = (document.compatMode === "CSS1Compat");
+migrateWarnProp( jQuery, "boxModel", jQuery.boxModel, "jQuery.boxModel is deprecated" );
+migrateWarnProp( jQuery.support, "boxModel", jQuery.support.boxModel, "jQuery.support.boxModel is deprecated" );
+
+jQuery.sub = function() {
+	function jQuerySub( selector, context ) {
+		return new jQuerySub.fn.init( selector, context );
+	}
+	jQuery.extend( true, jQuerySub, this );
+	jQuerySub.superclass = this;
+	jQuerySub.fn = jQuerySub.prototype = this();
+	jQuerySub.fn.constructor = jQuerySub;
+	jQuerySub.sub = this.sub;
+	jQuerySub.fn.init = function init( selector, context ) {
+		var instance = jQuery.fn.init.call( this, selector, context, rootjQuerySub );
+		return instance instanceof jQuerySub ?
+			instance :
+			jQuerySub( instance );
+	};
+	jQuerySub.fn.init.prototype = jQuerySub.fn;
+	var rootjQuerySub = jQuerySub(document);
+	migrateWarn( "jQuery.sub() is deprecated" );
+	return jQuerySub;
+};
+
+// The number of elements contained in the matched element set
+jQuery.fn.size = function() {
+	migrateWarn( "jQuery.fn.size() is deprecated; use the .length property" );
+	return this.length;
+};
+
+
+var internalSwapCall = false;
+
+// If this version of jQuery has .swap(), don't false-alarm on internal uses
+if ( jQuery.swap ) {
+	jQuery.each( [ "height", "width", "reliableMarginRight" ], function( _, name ) {
+		var oldHook = jQuery.cssHooks[ name ] && jQuery.cssHooks[ name ].get;
+
+		if ( oldHook ) {
+			jQuery.cssHooks[ name ].get = function() {
+				var ret;
+
+				internalSwapCall = true;
+				ret = oldHook.apply( this, arguments );
+				internalSwapCall = false;
+				return ret;
+			};
+		}
+	});
+}
+
+jQuery.swap = function( elem, options, callback, args ) {
+	var ret, name,
+		old = {};
+
+	if ( !internalSwapCall ) {
+		migrateWarn( "jQuery.swap() is undocumented and deprecated" );
+	}
+
+	// Remember the old values, and insert the new ones
+	for ( name in options ) {
+		old[ name ] = elem.style[ name ];
+		elem.style[ name ] = options[ name ];
+	}
+
+	ret = callback.apply( elem, args || [] );
+
+	// Revert the old values
+	for ( name in options ) {
+		elem.style[ name ] = old[ name ];
+	}
+
+	return ret;
+};
+
+
+// Ensure that $.ajax gets the new parseJSON defined in core.js
+jQuery.ajaxSetup({
+	converters: {
+		"text json": jQuery.parseJSON
+	}
+});
+
+
+var oldFnData = jQuery.fn.data;
+
+jQuery.fn.data = function( name ) {
+	var ret, evt,
+		elem = this[0];
+
+	// Handles 1.7 which has this behavior and 1.8 which doesn't
+	if ( elem && name === "events" && arguments.length === 1 ) {
+		ret = jQuery.data( elem, name );
+		evt = jQuery._data( elem, name );
+		if ( ( ret === undefined || ret === evt ) && evt !== undefined ) {
+			migrateWarn("Use of jQuery.fn.data('events') is deprecated");
+			return evt;
+		}
+	}
+	return oldFnData.apply( this, arguments );
+};
+
+
+var rscriptType = /\/(java|ecma)script/i;
+
+// Since jQuery.clean is used internally on older versions, we only shim if it's missing
+if ( !jQuery.clean ) {
+	jQuery.clean = function( elems, context, fragment, scripts ) {
+		// Set context per 1.8 logic
+		context = context || document;
+		context = !context.nodeType && context[0] || context;
+		context = context.ownerDocument || context;
+
+		migrateWarn("jQuery.clean() is deprecated");
+
+		var i, elem, handleScript, jsTags,
+			ret = [];
+
+		jQuery.merge( ret, jQuery.buildFragment( elems, context ).childNodes );
+
+		// Complex logic lifted directly from jQuery 1.8
+		if ( fragment ) {
+			// Special handling of each script element
+			handleScript = function( elem ) {
+				// Check if we consider it executable
+				if ( !elem.type || rscriptType.test( elem.type ) ) {
+					// Detach the script and store it in the scripts array (if provided) or the fragment
+					// Return truthy to indicate that it has been handled
+					return scripts ?
+						scripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) :
+						fragment.appendChild( elem );
+				}
+			};
+
+			for ( i = 0; (elem = ret[i]) != null; i++ ) {
+				// Check if we're done after handling an executable script
+				if ( !( jQuery.nodeName( elem, "script" ) && handleScript( elem ) ) ) {
+					// Append to fragment and handle embedded scripts
+					fragment.appendChild( elem );
+					if ( typeof elem.getElementsByTagName !== "undefined" ) {
+						// handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration
+						jsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName("script") ), handleScript );
+
+						// Splice the scripts into ret after their former ancestor and advance our index beyond them
+						ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
+						i += jsTags.length;
+					}
+				}
+			}
+		}
+
+		return ret;
+	};
+}
+
+var eventAdd = jQuery.event.add,
+	eventRemove = jQuery.event.remove,
+	eventTrigger = jQuery.event.trigger,
+	oldToggle = jQuery.fn.toggle,
+	oldLive = jQuery.fn.live,
+	oldDie = jQuery.fn.die,
+	oldLoad = jQuery.fn.load,
+	ajaxEvents = "ajaxStart|ajaxStop|ajaxSend|ajaxComplete|ajaxError|ajaxSuccess",
+	rajaxEvent = new RegExp( "\\b(?:" + ajaxEvents + ")\\b" ),
+	rhoverHack = /(?:^|\s)hover(\.\S+|)\b/,
+	hoverHack = function( events ) {
+		if ( typeof( events ) !== "string" || jQuery.event.special.hover ) {
+			return events;
+		}
+		if ( rhoverHack.test( events ) ) {
+			migrateWarn("'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'");
+		}
+		return events && events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
+	};
+
+// Event props removed in 1.9, put them back if needed; no practical way to warn them
+if ( jQuery.event.props && jQuery.event.props[ 0 ] !== "attrChange" ) {
+	jQuery.event.props.unshift( "attrChange", "attrName", "relatedNode", "srcElement" );
+}
+
+// Undocumented jQuery.event.handle was "deprecated" in jQuery 1.7
+if ( jQuery.event.dispatch ) {
+	migrateWarnProp( jQuery.event, "handle", jQuery.event.dispatch, "jQuery.event.handle is undocumented and deprecated" );
+}
+
+// Support for 'hover' pseudo-event and ajax event warnings
+jQuery.event.add = function( elem, types, handler, data, selector ){
+	if ( elem !== document && rajaxEvent.test( types ) ) {
+		migrateWarn( "AJAX events should be attached to document: " + types );
+	}
+	eventAdd.call( this, elem, hoverHack( types || "" ), handler, data, selector );
+};
+jQuery.event.remove = function( elem, types, handler, selector, mappedTypes ){
+	eventRemove.call( this, elem, hoverHack( types ) || "", handler, selector, mappedTypes );
+};
+
+jQuery.each( [ "load", "unload", "error" ], function( _, name ) {
+
+	jQuery.fn[ name ] = function() {
+		var args = Array.prototype.slice.call( arguments, 0 );
+
+		// If this is an ajax load() the first arg should be the string URL;
+		// technically this could also be the "Anything" arg of the event .load()
+		// which just goes to show why this dumb signature has been deprecated!
+		// jQuery custom builds that exclude the Ajax module justifiably die here.
+		if ( name === "load" && typeof args[ 0 ] === "string" ) {
+			return oldLoad.apply( this, args );
+		}
+
+		migrateWarn( "jQuery.fn." + name + "() is deprecated" );
+
+		args.splice( 0, 0, name );
+		if ( arguments.length ) {
+			return this.bind.apply( this, args );
+		}
+
+		// Use .triggerHandler here because:
+		// - load and unload events don't need to bubble, only applied to window or image
+		// - error event should not bubble to window, although it does pre-1.7
+		// See http://bugs.jquery.com/ticket/11820
+		this.triggerHandler.apply( this, args );
+		return this;
+	};
+
+});
+
+jQuery.fn.toggle = function( fn, fn2 ) {
+
+	// Don't mess with animation or css toggles
+	if ( !jQuery.isFunction( fn ) || !jQuery.isFunction( fn2 ) ) {
+		return oldToggle.apply( this, arguments );
+	}
+	migrateWarn("jQuery.fn.toggle(handler, handler...) is deprecated");
+
+	// Save reference to arguments for access in closure
+	var args = arguments,
+		guid = fn.guid || jQuery.guid++,
+		i = 0,
+		toggler = function( event ) {
+			// Figure out which function to execute
+			var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
+			jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
+
+			// Make sure that clicks stop
+			event.preventDefault();
+
+			// and execute the function
+			return args[ lastToggle ].apply( this, arguments ) || false;
+		};
+
+	// link all the functions, so any of them can unbind this click handler
+	toggler.guid = guid;
+	while ( i < args.length ) {
+		args[ i++ ].guid = guid;
+	}
+
+	return this.click( toggler );
+};
+
+jQuery.fn.live = function( types, data, fn ) {
+	migrateWarn("jQuery.fn.live() is deprecated");
+	if ( oldLive ) {
+		return oldLive.apply( this, arguments );
+	}
+	jQuery( this.context ).on( types, this.selector, data, fn );
+	return this;
+};
+
+jQuery.fn.die = function( types, fn ) {
+	migrateWarn("jQuery.fn.die() is deprecated");
+	if ( oldDie ) {
+		return oldDie.apply( this, arguments );
+	}
+	jQuery( this.context ).off( types, this.selector || "**", fn );
+	return this;
+};
+
+// Turn global events into document-triggered events
+jQuery.event.trigger = function( event, data, elem, onlyHandlers  ){
+	if ( !elem && !rajaxEvent.test( event ) ) {
+		migrateWarn( "Global events are undocumented and deprecated" );
+	}
+	return eventTrigger.call( this,  event, data, elem || document, onlyHandlers  );
+};
+jQuery.each( ajaxEvents.split("|"),
+	function( _, name ) {
+		jQuery.event.special[ name ] = {
+			setup: function() {
+				var elem = this;
+
+				// The document needs no shimming; must be !== for oldIE
+				if ( elem !== document ) {
+					jQuery.event.add( document, name + "." + jQuery.guid, function() {
+						jQuery.event.trigger( name, Array.prototype.slice.call( arguments, 1 ), elem, true );
+					});
+					jQuery._data( this, name, jQuery.guid++ );
+				}
+				return false;
+			},
+			teardown: function() {
+				if ( this !== document ) {
+					jQuery.event.remove( document, name + "." + jQuery._data( this, name ) );
+				}
+				return false;
+			}
+		};
+	}
+);
+
+jQuery.event.special.ready = {
+	setup: function() {
+		if ( this === document ) {
+			migrateWarn( "'ready' event is deprecated" );
+		}
+	}
+};
+
+var oldSelf = jQuery.fn.andSelf || jQuery.fn.addBack,
+	oldFnFind = jQuery.fn.find;
+
+jQuery.fn.andSelf = function() {
+	migrateWarn("jQuery.fn.andSelf() replaced by jQuery.fn.addBack()");
+	return oldSelf.apply( this, arguments );
+};
+
+jQuery.fn.find = function( selector ) {
+	var ret = oldFnFind.apply( this, arguments );
+	ret.context = this.context;
+	ret.selector = this.selector ? this.selector + " " + selector : selector;
+	return ret;
+};
+
+
+// jQuery 1.6 did not support Callbacks, do not warn there
+if ( jQuery.Callbacks ) {
+
+	var oldDeferred = jQuery.Deferred,
+		tuples = [
+			// action, add listener, callbacks, .then handlers, final state
+			[ "resolve", "done", jQuery.Callbacks("once memory"),
+				jQuery.Callbacks("once memory"), "resolved" ],
+			[ "reject", "fail", jQuery.Callbacks("once memory"),
+				jQuery.Callbacks("once memory"), "rejected" ],
+			[ "notify", "progress", jQuery.Callbacks("memory"),
+				jQuery.Callbacks("memory") ]
+		];
+
+	jQuery.Deferred = function( func ) {
+		var deferred = oldDeferred(),
+			promise = deferred.promise();
+
+		deferred.pipe = promise.pipe = function( /* fnDone, fnFail, fnProgress */ ) {
+			var fns = arguments;
+
+			migrateWarn( "deferred.pipe() is deprecated" );
+
+			return jQuery.Deferred(function( newDefer ) {
+				jQuery.each( tuples, function( i, tuple ) {
+					var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
+					// deferred.done(function() { bind to newDefer or newDefer.resolve })
+					// deferred.fail(function() { bind to newDefer or newDefer.reject })
+					// deferred.progress(function() { bind to newDefer or newDefer.notify })
+					deferred[ tuple[1] ](function() {
+						var returned = fn && fn.apply( this, arguments );
+						if ( returned && jQuery.isFunction( returned.promise ) ) {
+							returned.promise()
+								.done( newDefer.resolve )
+								.fail( newDefer.reject )
+								.progress( newDefer.notify );
+						} else {
+							newDefer[ tuple[ 0 ] + "With" ](
+								this === promise ? newDefer.promise() : this,
+								fn ? [ returned ] : arguments
+							);
+						}
+					});
+				});
+				fns = null;
+			}).promise();
+
+		};
+
+		deferred.isResolved = function() {
+			migrateWarn( "deferred.isResolved is deprecated" );
+			return deferred.state() === "resolved";
+		};
+
+		deferred.isRejected = function() {
+			migrateWarn( "deferred.isRejected is deprecated" );
+			return deferred.state() === "rejected";
+		};
+
+		if ( func ) {
+			func.call( deferred, deferred );
+		}
+
+		return deferred;
+	};
+
+}
+
+})( jQuery, window );
diff --git a/Source/platformProject/platform2022UI/jslib/jquery/jquery.cookie.js b/Source/platformProject/platform2022UI/jslib/jquery/jquery.cookie.js
new file mode 100644
index 0000000..c7f3a59
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/jquery/jquery.cookie.js
@@ -0,0 +1,117 @@
+/*!
+ * jQuery Cookie Plugin v1.4.1
+ * https://github.com/carhartl/jquery-cookie
+ *
+ * Copyright 2013 Klaus Hartl
+ * Released under the MIT license
+ */
+(function (factory) {
+	if (typeof define === 'function' && define.amd) {
+		// AMD
+		define(['jquery'], factory);
+	} else if (typeof exports === 'object') {
+		// CommonJS
+		factory(require('jquery'));
+	} else {
+		// Browser globals
+		factory(jQuery);
+	}
+}(function ($) {
+
+	var pluses = /\+/g;
+
+	function encode(s) {
+		return config.raw ? s : encodeURIComponent(s);
+	}
+
+	function decode(s) {
+		return config.raw ? s : decodeURIComponent(s);
+	}
+
+	function stringifyCookieValue(value) {
+		return encode(config.json ? JSON.stringify(value) : String(value));
+	}
+
+	function parseCookieValue(s) {
+		if (s.indexOf('"') === 0) {
+			// This is a quoted cookie as according to RFC2068, unescape...
+			s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\');
+		}
+
+		try {
+			// Replace server-side written pluses with spaces.
+			// If we can't decode the cookie, ignore it, it's unusable.
+			// If we can't parse the cookie, ignore it, it's unusable.
+			s = decodeURIComponent(s.replace(pluses, ' '));
+			return config.json ? JSON.parse(s) : s;
+		} catch(e) {}
+	}
+
+	function read(s, converter) {
+		var value = config.raw ? s : parseCookieValue(s);
+		return $.isFunction(converter) ? converter(value) : value;
+	}
+
+	var config = $.cookie = function (key, value, options) {
+
+		// Write
+
+		if (value !== undefined && !$.isFunction(value)) {
+			options = $.extend({}, config.defaults, options);
+
+			if (typeof options.expires === 'number') {
+				var days = options.expires, t = options.expires = new Date();
+				t.setTime(+t + days * 864e+5);
+			}
+
+			return (document.cookie = [
+				encode(key), '=', stringifyCookieValue(value),
+				options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
+				options.path    ? '; path=' + options.path : '',
+				options.domain  ? '; domain=' + options.domain : '',
+				options.secure  ? '; secure' : ''
+			].join(''));
+		}
+
+		// Read
+
+		var result = key ? undefined : {};
+
+		// To prevent the for loop in the first place assign an empty array
+		// in case there are no cookies at all. Also prevents odd result when
+		// calling $.cookie().
+		var cookies = document.cookie ? document.cookie.split('; ') : [];
+
+		for (var i = 0, l = cookies.length; i < l; i++) {
+			var parts = cookies[i].split('=');
+			var name = decode(parts.shift());
+			var cookie = parts.join('=');
+
+			if (key && key === name) {
+				// If second argument (value) is a function it's a converter...
+				result = read(cookie, value);
+				break;
+			}
+
+			// Prevent storing a cookie that we couldn't decode.
+			if (!key && (cookie = read(cookie)) !== undefined) {
+				result[name] = cookie;
+			}
+		}
+
+		return result;
+	};
+
+	config.defaults = {};
+
+	$.removeCookie = function (key, options) {
+		if ($.cookie(key) === undefined) {
+			return false;
+		}
+
+		// Must not alter options, thus extending a fresh object...
+		$.cookie(key, '', $.extend({}, options, { expires: -1 }));
+		return !$.cookie(key);
+	};
+
+}));
diff --git a/Source/platformProject/platform2022UI/jslib/jquery/jquery.easyui.min.js b/Source/platformProject/platform2022UI/jslib/jquery/jquery.easyui.min.js
new file mode 100644
index 0000000..2cf960e
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/jquery/jquery.easyui.min.js
@@ -0,0 +1,17827 @@
+/**
+ * EasyUI for jQuery 1.10.1
+ * 
+ * Copyright (c) 2009-2021 www.jeasyui.com. All rights reserved.
+ *
+ * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php
+ * To use it on other terms please contact us: info@jeasyui.com
+ *
+ */
+(function($){
+$.easyui={indexOfArray:function(a,o,id){
+for(var i=0,_1=a.length;i<_1;i++){
+if(id==undefined){
+if(a[i]==o){
+return i;
+}
+}else{
+if(a[i][o]==id){
+return i;
+}
+}
+}
+return -1;
+},removeArrayItem:function(a,o,id){
+if(typeof o=="string"){
+for(var i=0,_2=a.length;i<_2;i++){
+if(a[i][o]==id){
+a.splice(i,1);
+return;
+}
+}
+}else{
+var _3=this.indexOfArray(a,o);
+if(_3!=-1){
+a.splice(_3,1);
+}
+}
+},addArrayItem:function(a,o,r){
+var _4=this.indexOfArray(a,o,r?r[o]:undefined);
+if(_4==-1){
+a.push(r?r:o);
+}else{
+a[_4]=r?r:o;
+}
+},getArrayItem:function(a,o,id){
+var _5=this.indexOfArray(a,o,id);
+return _5==-1?null:a[_5];
+},forEach:function(_6,_7,_8){
+var _9=[];
+for(var i=0;i<_6.length;i++){
+_9.push(_6[i]);
+}
+while(_9.length){
+var _a=_9.shift();
+if(_8(_a)==false){
+return;
+}
+if(_7&&_a.children){
+for(var i=_a.children.length-1;i>=0;i--){
+_9.unshift(_a.children[i]);
+}
+}
+}
+}};
+$.parser={auto:true,emptyFn:function(){
+},onComplete:function(_b){
+},plugins:["draggable","droppable","resizable","pagination","tooltip","linkbutton","menu","sidemenu","menubutton","splitbutton","switchbutton","progressbar","radiobutton","checkbox","tree","textbox","passwordbox","maskedbox","filebox","combo","combobox","combotree","combogrid","combotreegrid","tagbox","numberbox","validatebox","searchbox","spinner","numberspinner","timespinner","datetimespinner","calendar","datebox","datetimebox","timepicker","slider","layout","panel","datagrid","propertygrid","treegrid","datalist","tabs","accordion","window","dialog","drawer","form"],parse:function(_c){
+var aa=[];
+for(var i=0;i<$.parser.plugins.length;i++){
+var _d=$.parser.plugins[i];
+var r=$(".easyui-"+_d,_c);
+if(r.length){
+if(r[_d]){
+r.each(function(){
+$(this)[_d]($.data(this,"options")||{});
+});
+}else{
+aa.push({name:_d,jq:r});
+}
+}
+}
+if(aa.length&&window.easyloader){
+var _e=[];
+for(var i=0;i<aa.length;i++){
+_e.push(aa[i].name);
+}
+easyloader.load(_e,function(){
+for(var i=0;i<aa.length;i++){
+var _f=aa[i].name;
+var jq=aa[i].jq;
+jq.each(function(){
+$(this)[_f]($.data(this,"options")||{});
+});
+}
+$.parser.onComplete.call($.parser,_c);
+});
+}else{
+$.parser.onComplete.call($.parser,_c);
+}
+},parseValue:function(_10,_11,_12,_13){
+_13=_13||0;
+var v=$.trim(String(_11||""));
+var _14=v.substr(v.length-1,1);
+if(_14=="%"){
+v=parseFloat(v.substr(0,v.length-1));
+if(_10.toLowerCase().indexOf("width")>=0){
+_13+=_12[0].offsetWidth-_12[0].clientWidth;
+v=Math.floor((_12.width()-_13)*v/100);
+}else{
+_13+=_12[0].offsetHeight-_12[0].clientHeight;
+v=Math.floor((_12.height()-_13)*v/100);
+}
+}else{
+v=parseInt(v)||undefined;
+}
+return v;
+},parseOptions:function(_15,_16){
+var t=$(_15);
+var _17={};
+var s=$.trim(t.attr("data-options"));
+if(s){
+if(s.substring(0,1)!="{"){
+s="{"+s+"}";
+}
+_17=(new Function("return "+s))();
+}
+$.map(["width","height","left","top","minWidth","maxWidth","minHeight","maxHeight"],function(p){
+var pv=$.trim(_15.style[p]||"");
+if(pv){
+if(pv.indexOf("%")==-1){
+pv=parseInt(pv);
+if(isNaN(pv)){
+pv=undefined;
+}
+}
+_17[p]=pv;
+}
+});
+if(_16){
+var _18={};
+for(var i=0;i<_16.length;i++){
+var pp=_16[i];
+if(typeof pp=="string"){
+_18[pp]=t.attr(pp);
+}else{
+for(var _19 in pp){
+var _1a=pp[_19];
+if(_1a=="boolean"){
+_18[_19]=t.attr(_19)?(t.attr(_19)=="true"):undefined;
+}else{
+if(_1a=="number"){
+_18[_19]=t.attr(_19)=="0"?0:parseFloat(t.attr(_19))||undefined;
+}
+}
+}
+}
+}
+$.extend(_17,_18);
+}
+return _17;
+},parseVars:function(){
+var d=$("<div style=\"position:absolute;top:-1000px;width:100px;height:100px;padding:5px\"></div>").appendTo("body");
+$._boxModel=d.outerWidth()!=100;
+d.remove();
+d=$("<div style=\"position:fixed\"></div>").appendTo("body");
+$._positionFixed=(d.css("position")=="fixed");
+d.remove();
+}};
+$(function(){
+$.parser.parseVars();
+if(!window.easyloader&&$.parser.auto){
+$.parser.parse();
+}
+});
+$.fn._outerWidth=function(_1b){
+if(_1b==undefined){
+if(this[0]==window){
+return this.width()||document.body.clientWidth;
+}
+return this.outerWidth()||0;
+}
+return this._size("width",_1b);
+};
+$.fn._outerHeight=function(_1c){
+if(_1c==undefined){
+if(this[0]==window){
+return this.height()||document.body.clientHeight;
+}
+return this.outerHeight()||0;
+}
+return this._size("height",_1c);
+};
+$.fn._scrollLeft=function(_1d){
+if(_1d==undefined){
+return this.scrollLeft();
+}else{
+return this.each(function(){
+$(this).scrollLeft(_1d);
+});
+}
+};
+$.fn._propAttr=$.fn.prop||$.fn.attr;
+$.fn._bind=$.fn.on;
+$.fn._unbind=$.fn.off;
+$.fn._size=function(_1e,_1f){
+if(typeof _1e=="string"){
+if(_1e=="clear"){
+return this.each(function(){
+$(this).css({width:"",minWidth:"",maxWidth:"",height:"",minHeight:"",maxHeight:""});
+});
+}else{
+if(_1e=="fit"){
+return this.each(function(){
+_20(this,this.tagName=="BODY"?$("body"):$(this).parent(),true);
+});
+}else{
+if(_1e=="unfit"){
+return this.each(function(){
+_20(this,$(this).parent(),false);
+});
+}else{
+if(_1f==undefined){
+return _21(this[0],_1e);
+}else{
+return this.each(function(){
+_21(this,_1e,_1f);
+});
+}
+}
+}
+}
+}else{
+return this.each(function(){
+_1f=_1f||$(this).parent();
+$.extend(_1e,_20(this,_1f,_1e.fit)||{});
+var r1=_22(this,"width",_1f,_1e);
+var r2=_22(this,"height",_1f,_1e);
+if(r1||r2){
+$(this).addClass("easyui-fluid");
+}else{
+$(this).removeClass("easyui-fluid");
+}
+});
+}
+function _20(_23,_24,fit){
+if(!_24.length){
+return false;
+}
+var t=$(_23)[0];
+var p=_24[0];
+var _25=p.fcount||0;
+if(fit){
+if(!t.fitted){
+t.fitted=true;
+p.fcount=_25+1;
+$(p).addClass("panel-noscroll");
+if(p.tagName=="BODY"){
+$("html").addClass("panel-fit");
+}
+}
+return {width:($(p).width()||1),height:($(p).height()||1)};
+}else{
+if(t.fitted){
+t.fitted=false;
+p.fcount=_25-1;
+if(p.fcount==0){
+$(p).removeClass("panel-noscroll");
+if(p.tagName=="BODY"){
+$("html").removeClass("panel-fit");
+}
+}
+}
+return false;
+}
+};
+function _22(_26,_27,_28,_29){
+var t=$(_26);
+var p=_27;
+var p1=p.substr(0,1).toUpperCase()+p.substr(1);
+var min=$.parser.parseValue("min"+p1,_29["min"+p1],_28);
+var max=$.parser.parseValue("max"+p1,_29["max"+p1],_28);
+var val=$.parser.parseValue(p,_29[p],_28);
+var _2a=(String(_29[p]||"").indexOf("%")>=0?true:false);
+if(!isNaN(val)){
+var v=Math.min(Math.max(val,min||0),max||99999);
+if(!_2a){
+_29[p]=v;
+}
+t._size("min"+p1,"");
+t._size("max"+p1,"");
+t._size(p,v);
+}else{
+t._size(p,"");
+t._size("min"+p1,min);
+t._size("max"+p1,max);
+}
+return _2a||_29.fit;
+};
+function _21(_2b,_2c,_2d){
+var t=$(_2b);
+if(_2d==undefined){
+_2d=parseInt(_2b.style[_2c]);
+if(isNaN(_2d)){
+return undefined;
+}
+if($._boxModel){
+_2d+=_2e();
+}
+return _2d;
+}else{
+if(_2d===""){
+t.css(_2c,"");
+}else{
+if($._boxModel){
+_2d-=_2e();
+if(_2d<0){
+_2d=0;
+}
+}
+t.css(_2c,_2d+"px");
+}
+}
+function _2e(){
+if(_2c.toLowerCase().indexOf("width")>=0){
+return t.outerWidth()-t.width();
+}else{
+return t.outerHeight()-t.height();
+}
+};
+};
+};
+})(jQuery);
+(function($){
+var _2f=null;
+var _30=null;
+var _31=false;
+function _32(e){
+if(e.touches.length!=1){
+return;
+}
+if(!_31){
+_31=true;
+dblClickTimer=setTimeout(function(){
+_31=false;
+},500);
+}else{
+clearTimeout(dblClickTimer);
+_31=false;
+_33(e,"dblclick");
+}
+_2f=setTimeout(function(){
+_33(e,"contextmenu",3);
+},1000);
+_33(e,"mousedown");
+if($.fn.draggable.isDragging||$.fn.resizable.isResizing){
+e.preventDefault();
+}
+};
+function _34(e){
+if(e.touches.length!=1){
+return;
+}
+if(_2f){
+clearTimeout(_2f);
+}
+_33(e,"mousemove");
+if($.fn.draggable.isDragging||$.fn.resizable.isResizing){
+e.preventDefault();
+}
+};
+function _35(e){
+if(_2f){
+clearTimeout(_2f);
+}
+_33(e,"mouseup");
+if($.fn.draggable.isDragging||$.fn.resizable.isResizing){
+e.preventDefault();
+}
+};
+function _33(e,_36,_37){
+var _38=new $.Event(_36);
+_38.pageX=e.changedTouches[0].pageX;
+_38.pageY=e.changedTouches[0].pageY;
+_38.which=_37||1;
+$(e.target).trigger(_38);
+};
+if(document.addEventListener){
+document.addEventListener("touchstart",_32,true);
+document.addEventListener("touchmove",_34,true);
+document.addEventListener("touchend",_35,true);
+}
+})(jQuery);
+(function($){
+function _39(e){
+var _3a=$.data(e.data.target,"draggable");
+var _3b=_3a.options;
+var _3c=_3a.proxy;
+var _3d=e.data;
+var _3e=_3d.startLeft+e.pageX-_3d.startX;
+var top=_3d.startTop+e.pageY-_3d.startY;
+if(_3c){
+if(_3c.parent()[0]==document.body){
+if(_3b.deltaX!=null&&_3b.deltaX!=undefined){
+_3e=e.pageX+_3b.deltaX;
+}else{
+_3e=e.pageX-e.data.offsetWidth;
+}
+if(_3b.deltaY!=null&&_3b.deltaY!=undefined){
+top=e.pageY+_3b.deltaY;
+}else{
+top=e.pageY-e.data.offsetHeight;
+}
+}else{
+if(_3b.deltaX!=null&&_3b.deltaX!=undefined){
+_3e+=e.data.offsetWidth+_3b.deltaX;
+}
+if(_3b.deltaY!=null&&_3b.deltaY!=undefined){
+top+=e.data.offsetHeight+_3b.deltaY;
+}
+}
+}
+if(e.data.parent!=document.body){
+_3e+=$(e.data.parent).scrollLeft();
+top+=$(e.data.parent).scrollTop();
+}
+if(_3b.axis=="h"){
+_3d.left=_3e;
+}else{
+if(_3b.axis=="v"){
+_3d.top=top;
+}else{
+_3d.left=_3e;
+_3d.top=top;
+}
+}
+};
+function _3f(e){
+var _40=$.data(e.data.target,"draggable");
+var _41=_40.options;
+var _42=_40.proxy;
+if(!_42){
+_42=$(e.data.target);
+}
+_42.css({left:e.data.left,top:e.data.top});
+$("body").css("cursor",_41.cursor);
+};
+function _43(e){
+if(!$.fn.draggable.isDragging){
+return false;
+}
+var _44=$.data(e.data.target,"draggable");
+var _45=_44.options;
+var _46=$(".droppable:visible").filter(function(){
+return e.data.target!=this;
+}).filter(function(){
+var _47=$.data(this,"droppable").options.accept;
+if(_47){
+return $(_47).filter(function(){
+return this==e.data.target;
+}).length>0;
+}else{
+return true;
+}
+});
+_44.droppables=_46;
+var _48=_44.proxy;
+if(!_48){
+if(_45.proxy){
+if(_45.proxy=="clone"){
+_48=$(e.data.target).clone().insertAfter(e.data.target);
+}else{
+_48=_45.proxy.call(e.data.target,e.data.target);
+}
+_44.proxy=_48;
+}else{
+_48=$(e.data.target);
+}
+}
+_48.css("position","absolute");
+_39(e);
+_3f(e);
+_45.onStartDrag.call(e.data.target,e);
+return false;
+};
+function _49(e){
+if(!$.fn.draggable.isDragging){
+return false;
+}
+var _4a=$.data(e.data.target,"draggable");
+_39(e);
+if(_4a.options.onDrag.call(e.data.target,e)!=false){
+_3f(e);
+}
+var _4b=e.data.target;
+_4a.droppables.each(function(){
+var _4c=$(this);
+if(_4c.droppable("options").disabled){
+return;
+}
+var p2=_4c.offset();
+if(e.pageX>p2.left&&e.pageX<p2.left+_4c.outerWidth()&&e.pageY>p2.top&&e.pageY<p2.top+_4c.outerHeight()){
+if(!this.entered){
+$(this).trigger("_dragenter",[_4b]);
+this.entered=true;
+}
+$(this).trigger("_dragover",[_4b]);
+}else{
+if(this.entered){
+$(this).trigger("_dragleave",[_4b]);
+this.entered=false;
+}
+}
+});
+return false;
+};
+function _4d(e){
+if(!$.fn.draggable.isDragging){
+_4e();
+return false;
+}
+_49(e);
+var _4f=$.data(e.data.target,"draggable");
+var _50=_4f.proxy;
+var _51=_4f.options;
+_51.onEndDrag.call(e.data.target,e);
+if(_51.revert){
+if(_52()==true){
+$(e.data.target).css({position:e.data.startPosition,left:e.data.startLeft,top:e.data.startTop});
+}else{
+if(_50){
+var _53,top;
+if(_50.parent()[0]==document.body){
+_53=e.data.startX-e.data.offsetWidth;
+top=e.data.startY-e.data.offsetHeight;
+}else{
+_53=e.data.startLeft;
+top=e.data.startTop;
+}
+_50.animate({left:_53,top:top},function(){
+_54();
+});
+}else{
+$(e.data.target).animate({left:e.data.startLeft,top:e.data.startTop},function(){
+$(e.data.target).css("position",e.data.startPosition);
+});
+}
+}
+}else{
+$(e.data.target).css({position:"absolute",left:e.data.left,top:e.data.top});
+_52();
+}
+_51.onStopDrag.call(e.data.target,e);
+_4e();
+function _54(){
+if(_50){
+_50.remove();
+}
+_4f.proxy=null;
+};
+function _52(){
+var _55=false;
+_4f.droppables.each(function(){
+var _56=$(this);
+if(_56.droppable("options").disabled){
+return;
+}
+var p2=_56.offset();
+if(e.pageX>p2.left&&e.pageX<p2.left+_56.outerWidth()&&e.pageY>p2.top&&e.pageY<p2.top+_56.outerHeight()){
+if(_51.revert){
+$(e.data.target).css({position:e.data.startPosition,left:e.data.startLeft,top:e.data.startTop});
+}
+$(this).triggerHandler("_drop",[e.data.target]);
+_54();
+_55=true;
+this.entered=false;
+return false;
+}
+});
+if(!_55&&!_51.revert){
+_54();
+}
+return _55;
+};
+return false;
+};
+function _4e(){
+if($.fn.draggable.timer){
+clearTimeout($.fn.draggable.timer);
+$.fn.draggable.timer=undefined;
+}
+$(document)._unbind(".draggable");
+$.fn.draggable.isDragging=false;
+setTimeout(function(){
+$("body").css("cursor","");
+},100);
+};
+$.fn.draggable=function(_57,_58){
+if(typeof _57=="string"){
+return $.fn.draggable.methods[_57](this,_58);
+}
+return this.each(function(){
+var _59;
+var _5a=$.data(this,"draggable");
+if(_5a){
+_5a.handle._unbind(".draggable");
+_59=$.extend(_5a.options,_57);
+}else{
+_59=$.extend({},$.fn.draggable.defaults,$.fn.draggable.parseOptions(this),_57||{});
+}
+var _5b=_59.handle?(typeof _59.handle=="string"?$(_59.handle,this):_59.handle):$(this);
+$.data(this,"draggable",{options:_59,handle:_5b});
+if(_59.disabled){
+$(this).css("cursor","");
+return;
+}
+_5b._unbind(".draggable")._bind("mousemove.draggable",{target:this},function(e){
+if($.fn.draggable.isDragging){
+return;
+}
+var _5c=$.data(e.data.target,"draggable").options;
+if(_5d(e)){
+$(this).css("cursor",_5c.cursor);
+}else{
+$(this).css("cursor","");
+}
+})._bind("mouseleave.draggable",{target:this},function(e){
+$(this).css("cursor","");
+})._bind("mousedown.draggable",{target:this},function(e){
+if(_5d(e)==false){
+return;
+}
+$(this).css("cursor","");
+var _5e=$(e.data.target).position();
+var _5f=$(e.data.target).offset();
+var _60={startPosition:$(e.data.target).css("position"),startLeft:_5e.left,startTop:_5e.top,left:_5e.left,top:_5e.top,startX:e.pageX,startY:e.pageY,width:$(e.data.target).outerWidth(),height:$(e.data.target).outerHeight(),offsetWidth:(e.pageX-_5f.left),offsetHeight:(e.pageY-_5f.top),target:e.data.target,parent:$(e.data.target).parent()[0]};
+$.extend(e.data,_60);
+var _61=$.data(e.data.target,"draggable").options;
+if(_61.onBeforeDrag.call(e.data.target,e)==false){
+return;
+}
+$(document)._bind("mousedown.draggable",e.data,_43);
+$(document)._bind("mousemove.draggable",e.data,_49);
+$(document)._bind("mouseup.draggable",e.data,_4d);
+$.fn.draggable.timer=setTimeout(function(){
+$.fn.draggable.isDragging=true;
+_43(e);
+},_61.delay);
+return false;
+});
+function _5d(e){
+var _62=$.data(e.data.target,"draggable");
+var _63=_62.handle;
+var _64=$(_63).offset();
+var _65=$(_63).outerWidth();
+var _66=$(_63).outerHeight();
+var t=e.pageY-_64.top;
+var r=_64.left+_65-e.pageX;
+var b=_64.top+_66-e.pageY;
+var l=e.pageX-_64.left;
+return Math.min(t,r,b,l)>_62.options.edge;
+};
+});
+};
+$.fn.draggable.methods={options:function(jq){
+return $.data(jq[0],"draggable").options;
+},proxy:function(jq){
+return $.data(jq[0],"draggable").proxy;
+},enable:function(jq){
+return jq.each(function(){
+$(this).draggable({disabled:false});
+});
+},disable:function(jq){
+return jq.each(function(){
+$(this).draggable({disabled:true});
+});
+}};
+$.fn.draggable.parseOptions=function(_67){
+var t=$(_67);
+return $.extend({},$.parser.parseOptions(_67,["cursor","handle","axis",{"revert":"boolean","deltaX":"number","deltaY":"number","edge":"number","delay":"number"}]),{disabled:(t.attr("disabled")?true:undefined)});
+};
+$.fn.draggable.defaults={proxy:null,revert:false,cursor:"move",deltaX:null,deltaY:null,handle:null,disabled:false,edge:0,axis:null,delay:100,onBeforeDrag:function(e){
+},onStartDrag:function(e){
+},onDrag:function(e){
+},onEndDrag:function(e){
+},onStopDrag:function(e){
+}};
+$.fn.draggable.isDragging=false;
+})(jQuery);
+(function($){
+function _68(_69){
+$(_69).addClass("droppable");
+$(_69)._bind("_dragenter",function(e,_6a){
+$.data(_69,"droppable").options.onDragEnter.apply(_69,[e,_6a]);
+});
+$(_69)._bind("_dragleave",function(e,_6b){
+$.data(_69,"droppable").options.onDragLeave.apply(_69,[e,_6b]);
+});
+$(_69)._bind("_dragover",function(e,_6c){
+$.data(_69,"droppable").options.onDragOver.apply(_69,[e,_6c]);
+});
+$(_69)._bind("_drop",function(e,_6d){
+$.data(_69,"droppable").options.onDrop.apply(_69,[e,_6d]);
+});
+};
+$.fn.droppable=function(_6e,_6f){
+if(typeof _6e=="string"){
+return $.fn.droppable.methods[_6e](this,_6f);
+}
+_6e=_6e||{};
+return this.each(function(){
+var _70=$.data(this,"droppable");
+if(_70){
+$.extend(_70.options,_6e);
+}else{
+_68(this);
+$.data(this,"droppable",{options:$.extend({},$.fn.droppable.defaults,$.fn.droppable.parseOptions(this),_6e)});
+}
+});
+};
+$.fn.droppable.methods={options:function(jq){
+return $.data(jq[0],"droppable").options;
+},enable:function(jq){
+return jq.each(function(){
+$(this).droppable({disabled:false});
+});
+},disable:function(jq){
+return jq.each(function(){
+$(this).droppable({disabled:true});
+});
+}};
+$.fn.droppable.parseOptions=function(_71){
+var t=$(_71);
+return $.extend({},$.parser.parseOptions(_71,["accept"]),{disabled:(t.attr("disabled")?true:undefined)});
+};
+$.fn.droppable.defaults={accept:null,disabled:false,onDragEnter:function(e,_72){
+},onDragOver:function(e,_73){
+},onDragLeave:function(e,_74){
+},onDrop:function(e,_75){
+}};
+})(jQuery);
+(function($){
+function _76(e){
+var _77=e.data;
+var _78=$.data(_77.target,"resizable").options;
+if(_77.dir.indexOf("e")!=-1){
+var _79=_77.startWidth+e.pageX-_77.startX;
+_79=Math.min(Math.max(_79,_78.minWidth),_78.maxWidth);
+_77.width=_79;
+}
+if(_77.dir.indexOf("s")!=-1){
+var _7a=_77.startHeight+e.pageY-_77.startY;
+_7a=Math.min(Math.max(_7a,_78.minHeight),_78.maxHeight);
+_77.height=_7a;
+}
+if(_77.dir.indexOf("w")!=-1){
+var _79=_77.startWidth-e.pageX+_77.startX;
+_79=Math.min(Math.max(_79,_78.minWidth),_78.maxWidth);
+_77.width=_79;
+_77.left=_77.startLeft+_77.startWidth-_77.width;
+}
+if(_77.dir.indexOf("n")!=-1){
+var _7a=_77.startHeight-e.pageY+_77.startY;
+_7a=Math.min(Math.max(_7a,_78.minHeight),_78.maxHeight);
+_77.height=_7a;
+_77.top=_77.startTop+_77.startHeight-_77.height;
+}
+};
+function _7b(e){
+var _7c=e.data;
+var t=$(_7c.target);
+t.css({left:_7c.left,top:_7c.top});
+if(t.outerWidth()!=_7c.width){
+t._outerWidth(_7c.width);
+}
+if(t.outerHeight()!=_7c.height){
+t._outerHeight(_7c.height);
+}
+};
+function _7d(e){
+$.fn.resizable.isResizing=true;
+$.data(e.data.target,"resizable").options.onStartResize.call(e.data.target,e);
+return false;
+};
+function _7e(e){
+_76(e);
+if($.data(e.data.target,"resizable").options.onResize.call(e.data.target,e)!=false){
+_7b(e);
+}
+return false;
+};
+function _7f(e){
+$.fn.resizable.isResizing=false;
+_76(e,true);
+_7b(e);
+$.data(e.data.target,"resizable").options.onStopResize.call(e.data.target,e);
+$(document)._unbind(".resizable");
+$("body").css("cursor","");
+return false;
+};
+function _80(e){
+var _81=$(e.data.target).resizable("options");
+var tt=$(e.data.target);
+var dir="";
+var _82=tt.offset();
+var _83=tt.outerWidth();
+var _84=tt.outerHeight();
+var _85=_81.edge;
+if(e.pageY>_82.top&&e.pageY<_82.top+_85){
+dir+="n";
+}else{
+if(e.pageY<_82.top+_84&&e.pageY>_82.top+_84-_85){
+dir+="s";
+}
+}
+if(e.pageX>_82.left&&e.pageX<_82.left+_85){
+dir+="w";
+}else{
+if(e.pageX<_82.left+_83&&e.pageX>_82.left+_83-_85){
+dir+="e";
+}
+}
+var _86=_81.handles.split(",");
+_86=$.map(_86,function(h){
+return $.trim(h).toLowerCase();
+});
+if($.inArray("all",_86)>=0||$.inArray(dir,_86)>=0){
+return dir;
+}
+for(var i=0;i<dir.length;i++){
+var _87=$.inArray(dir.substr(i,1),_86);
+if(_87>=0){
+return _86[_87];
+}
+}
+return "";
+};
+$.fn.resizable=function(_88,_89){
+if(typeof _88=="string"){
+return $.fn.resizable.methods[_88](this,_89);
+}
+return this.each(function(){
+var _8a=null;
+var _8b=$.data(this,"resizable");
+if(_8b){
+$(this)._unbind(".resizable");
+_8a=$.extend(_8b.options,_88||{});
+}else{
+_8a=$.extend({},$.fn.resizable.defaults,$.fn.resizable.parseOptions(this),_88||{});
+$.data(this,"resizable",{options:_8a});
+}
+if(_8a.disabled==true){
+return;
+}
+$(this)._bind("mousemove.resizable",{target:this},function(e){
+if($.fn.resizable.isResizing){
+return;
+}
+var dir=_80(e);
+$(e.data.target).css("cursor",dir?dir+"-resize":"");
+})._bind("mouseleave.resizable",{target:this},function(e){
+$(e.data.target).css("cursor","");
+})._bind("mousedown.resizable",{target:this},function(e){
+var dir=_80(e);
+if(dir==""){
+return;
+}
+function _8c(css){
+var val=parseInt($(e.data.target).css(css));
+if(isNaN(val)){
+return 0;
+}else{
+return val;
+}
+};
+var _8d={target:e.data.target,dir:dir,startLeft:_8c("left"),startTop:_8c("top"),left:_8c("left"),top:_8c("top"),startX:e.pageX,startY:e.pageY,startWidth:$(e.data.target).outerWidth(),startHeight:$(e.data.target).outerHeight(),width:$(e.data.target).outerWidth(),height:$(e.data.target).outerHeight(),deltaWidth:$(e.data.target).outerWidth()-$(e.data.target).width(),deltaHeight:$(e.data.target).outerHeight()-$(e.data.target).height()};
+$(document)._bind("mousedown.resizable",_8d,_7d);
+$(document)._bind("mousemove.resizable",_8d,_7e);
+$(document)._bind("mouseup.resizable",_8d,_7f);
+$("body").css("cursor",dir+"-resize");
+});
+});
+};
+$.fn.resizable.methods={options:function(jq){
+return $.data(jq[0],"resizable").options;
+},enable:function(jq){
+return jq.each(function(){
+$(this).resizable({disabled:false});
+});
+},disable:function(jq){
+return jq.each(function(){
+$(this).resizable({disabled:true});
+});
+}};
+$.fn.resizable.parseOptions=function(_8e){
+var t=$(_8e);
+return $.extend({},$.parser.parseOptions(_8e,["handles",{minWidth:"number",minHeight:"number",maxWidth:"number",maxHeight:"number",edge:"number"}]),{disabled:(t.attr("disabled")?true:undefined)});
+};
+$.fn.resizable.defaults={disabled:false,handles:"n, e, s, w, ne, se, sw, nw, all",minWidth:10,minHeight:10,maxWidth:10000,maxHeight:10000,edge:5,onStartResize:function(e){
+},onResize:function(e){
+},onStopResize:function(e){
+}};
+$.fn.resizable.isResizing=false;
+})(jQuery);
+(function($){
+function _8f(_90,_91){
+var _92=$.data(_90,"linkbutton").options;
+if(_91){
+$.extend(_92,_91);
+}
+if(_92.width||_92.height||_92.fit){
+var btn=$(_90);
+var _93=btn.parent();
+var _94=btn.is(":visible");
+if(!_94){
+var _95=$("<div style=\"display:none\"></div>").insertBefore(_90);
+var _96={position:btn.css("position"),display:btn.css("display"),left:btn.css("left")};
+btn.appendTo("body");
+btn.css({position:"absolute",display:"inline-block",left:-20000});
+}
+btn._size(_92,_93);
+var _97=btn.find(".l-btn-left");
+_97.css("margin-top",0);
+_97.css("margin-top",parseInt((btn.height()-_97.height())/2)+"px");
+if(!_94){
+btn.insertAfter(_95);
+btn.css(_96);
+_95.remove();
+}
+}
+};
+function _98(_99){
+var _9a=$.data(_99,"linkbutton").options;
+var t=$(_99).empty();
+t.addClass("l-btn").removeClass("l-btn-plain l-btn-selected l-btn-plain-selected l-btn-outline");
+t.removeClass("l-btn-small l-btn-medium l-btn-large").addClass("l-btn-"+_9a.size);
+if(_9a.plain){
+t.addClass("l-btn-plain");
+}
+if(_9a.outline){
+t.addClass("l-btn-outline");
+}
+if(_9a.selected){
+t.addClass(_9a.plain?"l-btn-selected l-btn-plain-selected":"l-btn-selected");
+}
+t.attr("group",_9a.group||"");
+t.attr("id",_9a.id||"");
+var _9b=$("<span class=\"l-btn-left\"></span>").appendTo(t);
+if(_9a.text){
+$("<span class=\"l-btn-text\"></span>").html(_9a.text).appendTo(_9b);
+}else{
+$("<span class=\"l-btn-text l-btn-empty\">&nbsp;</span>").appendTo(_9b);
+}
+if(_9a.iconCls){
+$("<span class=\"l-btn-icon\">&nbsp;</span>").addClass(_9a.iconCls).appendTo(_9b);
+_9b.addClass("l-btn-icon-"+_9a.iconAlign);
+}
+t._unbind(".linkbutton")._bind("focus.linkbutton",function(){
+if(!_9a.disabled){
+$(this).addClass("l-btn-focus");
+}
+})._bind("blur.linkbutton",function(){
+$(this).removeClass("l-btn-focus");
+})._bind("click.linkbutton",function(){
+if(!_9a.disabled){
+if(_9a.toggle){
+if(_9a.selected){
+$(this).linkbutton("unselect");
+}else{
+$(this).linkbutton("select");
+}
+}
+_9a.onClick.call(this);
+}
+});
+_9c(_99,_9a.selected);
+_9d(_99,_9a.disabled);
+};
+function _9c(_9e,_9f){
+var _a0=$.data(_9e,"linkbutton").options;
+if(_9f){
+if(_a0.group){
+$("a.l-btn[group=\""+_a0.group+"\"]").each(function(){
+var o=$(this).linkbutton("options");
+if(o.toggle){
+$(this).removeClass("l-btn-selected l-btn-plain-selected");
+o.selected=false;
+}
+});
+}
+$(_9e).addClass(_a0.plain?"l-btn-selected l-btn-plain-selected":"l-btn-selected");
+_a0.selected=true;
+}else{
+if(!_a0.group){
+$(_9e).removeClass("l-btn-selected l-btn-plain-selected");
+_a0.selected=false;
+}
+}
+};
+function _9d(_a1,_a2){
+var _a3=$.data(_a1,"linkbutton");
+var _a4=_a3.options;
+$(_a1).removeClass("l-btn-disabled l-btn-plain-disabled");
+if(_a2){
+_a4.disabled=true;
+var _a5=$(_a1).attr("href");
+if(_a5){
+_a3.href=_a5;
+$(_a1).attr("href","javascript:;");
+}
+if(_a1.onclick){
+_a3.onclick=_a1.onclick;
+_a1.onclick=null;
+}
+_a4.plain?$(_a1).addClass("l-btn-disabled l-btn-plain-disabled"):$(_a1).addClass("l-btn-disabled");
+}else{
+_a4.disabled=false;
+if(_a3.href){
+$(_a1).attr("href",_a3.href);
+}
+if(_a3.onclick){
+_a1.onclick=_a3.onclick;
+}
+}
+$(_a1)._propAttr("disabled",_a2);
+};
+$.fn.linkbutton=function(_a6,_a7){
+if(typeof _a6=="string"){
+return $.fn.linkbutton.methods[_a6](this,_a7);
+}
+_a6=_a6||{};
+return this.each(function(){
+var _a8=$.data(this,"linkbutton");
+if(_a8){
+$.extend(_a8.options,_a6);
+}else{
+$.data(this,"linkbutton",{options:$.extend({},$.fn.linkbutton.defaults,$.fn.linkbutton.parseOptions(this),_a6)});
+$(this)._propAttr("disabled",false);
+$(this)._bind("_resize",function(e,_a9){
+if($(this).hasClass("easyui-fluid")||_a9){
+_8f(this);
+}
+return false;
+});
+}
+_98(this);
+_8f(this);
+});
+};
+$.fn.linkbutton.methods={options:function(jq){
+return $.data(jq[0],"linkbutton").options;
+},resize:function(jq,_aa){
+return jq.each(function(){
+_8f(this,_aa);
+});
+},enable:function(jq){
+return jq.each(function(){
+_9d(this,false);
+});
+},disable:function(jq){
+return jq.each(function(){
+_9d(this,true);
+});
+},select:function(jq){
+return jq.each(function(){
+_9c(this,true);
+});
+},unselect:function(jq){
+return jq.each(function(){
+_9c(this,false);
+});
+}};
+$.fn.linkbutton.parseOptions=function(_ab){
+var t=$(_ab);
+return $.extend({},$.parser.parseOptions(_ab,["id","iconCls","iconAlign","group","size","text",{plain:"boolean",toggle:"boolean",selected:"boolean",outline:"boolean"}]),{disabled:(t.attr("disabled")?true:undefined),text:($.trim(t.html())||undefined),iconCls:(t.attr("icon")||t.attr("iconCls"))});
+};
+$.fn.linkbutton.defaults={id:null,disabled:false,toggle:false,selected:false,outline:false,group:null,plain:false,text:"",iconCls:null,iconAlign:"left",size:"small",onClick:function(){
+}};
+})(jQuery);
+(function($){
+function _ac(_ad){
+var _ae=$.data(_ad,"pagination");
+var _af=_ae.options;
+var bb=_ae.bb={};
+if(_af.buttons&&!$.isArray(_af.buttons)){
+$(_af.buttons).insertAfter(_ad);
+}
+var _b0=$(_ad).addClass("pagination").html("<table cellspacing=\"0\" cellpadding=\"0\" border=\"0\"><tr></tr></table>");
+var tr=_b0.find("tr");
+var aa=$.extend([],_af.layout);
+if(!_af.showPageList){
+_b1(aa,"list");
+}
+if(!_af.showPageInfo){
+_b1(aa,"info");
+}
+if(!_af.showRefresh){
+_b1(aa,"refresh");
+}
+if(aa[0]=="sep"){
+aa.shift();
+}
+if(aa[aa.length-1]=="sep"){
+aa.pop();
+}
+for(var _b2=0;_b2<aa.length;_b2++){
+var _b3=aa[_b2];
+if(_b3=="list"){
+var ps=$("<select class=\"pagination-page-list\"></select>");
+ps._bind("change",function(){
+_af.pageSize=parseInt($(this).val());
+_af.onChangePageSize.call(_ad,_af.pageSize);
+_b9(_ad,_af.pageNumber);
+});
+for(var i=0;i<_af.pageList.length;i++){
+$("<option></option>").text(_af.pageList[i]).appendTo(ps);
+}
+$("<td></td>").append(ps).appendTo(tr);
+}else{
+if(_b3=="sep"){
+$("<td><div class=\"pagination-btn-separator\"></div></td>").appendTo(tr);
+}else{
+if(_b3=="first"){
+bb.first=_b4("first");
+}else{
+if(_b3=="prev"){
+bb.prev=_b4("prev");
+}else{
+if(_b3=="next"){
+bb.next=_b4("next");
+}else{
+if(_b3=="last"){
+bb.last=_b4("last");
+}else{
+if(_b3=="manual"){
+$("<span style=\"padding-left:6px;\"></span>").html(_af.beforePageText).appendTo(tr).wrap("<td></td>");
+bb.num=$("<input class=\"pagination-num\" type=\"text\" value=\"1\" size=\"2\">").appendTo(tr).wrap("<td></td>");
+bb.num._unbind(".pagination")._bind("keydown.pagination",function(e){
+if(e.keyCode==13){
+var _b5=parseInt($(this).val())||1;
+_b9(_ad,_b5);
+return false;
+}
+});
+bb.after=$("<span style=\"padding-right:6px;\"></span>").appendTo(tr).wrap("<td></td>");
+}else{
+if(_b3=="refresh"){
+bb.refresh=_b4("refresh");
+}else{
+if(_b3=="links"){
+$("<td class=\"pagination-links\"></td>").appendTo(tr);
+}else{
+if(_b3=="info"){
+if(_b2==aa.length-1){
+$("<div class=\"pagination-info\"></div>").appendTo(_b0);
+}else{
+$("<td><div class=\"pagination-info\"></div></td>").appendTo(tr);
+}
+}
+}
+}
+}
+}
+}
+}
+}
+}
+}
+}
+if(_af.buttons){
+$("<td><div class=\"pagination-btn-separator\"></div></td>").appendTo(tr);
+if($.isArray(_af.buttons)){
+for(var i=0;i<_af.buttons.length;i++){
+var btn=_af.buttons[i];
+if(btn=="-"){
+$("<td><div class=\"pagination-btn-separator\"></div></td>").appendTo(tr);
+}else{
+var td=$("<td></td>").appendTo(tr);
+var a=$("<a href=\"javascript:;\"></a>").appendTo(td);
+a[0].onclick=eval(btn.handler||function(){
+});
+a.linkbutton($.extend({},btn,{plain:true}));
+}
+}
+}else{
+var td=$("<td></td>").appendTo(tr);
+$(_af.buttons).appendTo(td).show();
+}
+}
+$("<div style=\"clear:both;\"></div>").appendTo(_b0);
+function _b4(_b6){
+var btn=_af.nav[_b6];
+var a=$("<a href=\"javascript:;\"></a>").appendTo(tr);
+a.wrap("<td></td>");
+a.linkbutton({iconCls:btn.iconCls,plain:true})._unbind(".pagination")._bind("click.pagination",function(){
+btn.handler.call(_ad);
+});
+return a;
+};
+function _b1(aa,_b7){
+var _b8=$.inArray(_b7,aa);
+if(_b8>=0){
+aa.splice(_b8,1);
+}
+return aa;
+};
+};
+function _b9(_ba,_bb){
+var _bc=$.data(_ba,"pagination").options;
+if(_bc.onBeforeSelectPage.call(_ba,_bb,_bc.pageSize)==false){
+_bd(_ba);
+return;
+}
+_bd(_ba,{pageNumber:_bb});
+_bc.onSelectPage.call(_ba,_bc.pageNumber,_bc.pageSize);
+};
+function _bd(_be,_bf){
+var _c0=$.data(_be,"pagination");
+var _c1=_c0.options;
+var bb=_c0.bb;
+$.extend(_c1,_bf||{});
+var ps=$(_be).find("select.pagination-page-list");
+if(ps.length){
+ps.val(_c1.pageSize+"");
+_c1.pageSize=parseInt(ps.val());
+}
+var _c2=Math.ceil(_c1.total/_c1.pageSize)||1;
+if(_c1.pageNumber<1){
+_c1.pageNumber=1;
+}
+if(_c1.pageNumber>_c2){
+_c1.pageNumber=_c2;
+}
+if(_c1.total==0){
+_c1.pageNumber=0;
+_c2=0;
+}
+if(bb.num){
+bb.num.val(_c1.pageNumber);
+}
+if(bb.after){
+bb.after.html(_c1.afterPageText.replace(/{pages}/,_c2));
+}
+var td=$(_be).find("td.pagination-links");
+if(td.length){
+td.empty();
+var _c3=_c1.pageNumber-Math.floor(_c1.links/2);
+if(_c3<1){
+_c3=1;
+}
+var _c4=_c3+_c1.links-1;
+if(_c4>_c2){
+_c4=_c2;
+}
+_c3=_c4-_c1.links+1;
+if(_c3<1){
+_c3=1;
+}
+for(var i=_c3;i<=_c4;i++){
+var a=$("<a class=\"pagination-link\" href=\"javascript:;\"></a>").appendTo(td);
+a.linkbutton({plain:true,text:i});
+if(i==_c1.pageNumber){
+a.linkbutton("select");
+}else{
+a._unbind(".pagination")._bind("click.pagination",{pageNumber:i},function(e){
+_b9(_be,e.data.pageNumber);
+});
+}
+}
+}
+var _c5=_c1.displayMsg;
+_c5=_c5.replace(/{from}/,_c1.total==0?0:_c1.pageSize*(_c1.pageNumber-1)+1);
+_c5=_c5.replace(/{to}/,Math.min(_c1.pageSize*(_c1.pageNumber),_c1.total));
+_c5=_c5.replace(/{total}/,_c1.total);
+$(_be).find("div.pagination-info").html(_c5);
+if(bb.first){
+bb.first.linkbutton({disabled:((!_c1.total)||_c1.pageNumber==1)});
+}
+if(bb.prev){
+bb.prev.linkbutton({disabled:((!_c1.total)||_c1.pageNumber==1)});
+}
+if(bb.next){
+bb.next.linkbutton({disabled:(_c1.pageNumber==_c2)});
+}
+if(bb.last){
+bb.last.linkbutton({disabled:(_c1.pageNumber==_c2)});
+}
+_c6(_be,_c1.loading);
+};
+function _c6(_c7,_c8){
+var _c9=$.data(_c7,"pagination");
+var _ca=_c9.options;
+_ca.loading=_c8;
+if(_ca.showRefresh&&_c9.bb.refresh){
+_c9.bb.refresh.linkbutton({iconCls:(_ca.loading?"pagination-loading":"pagination-load")});
+}
+};
+$.fn.pagination=function(_cb,_cc){
+if(typeof _cb=="string"){
+return $.fn.pagination.methods[_cb](this,_cc);
+}
+_cb=_cb||{};
+return this.each(function(){
+var _cd;
+var _ce=$.data(this,"pagination");
+if(_ce){
+_cd=$.extend(_ce.options,_cb);
+}else{
+_cd=$.extend({},$.fn.pagination.defaults,$.fn.pagination.parseOptions(this),_cb);
+$.data(this,"pagination",{options:_cd});
+}
+_ac(this);
+_bd(this);
+});
+};
+$.fn.pagination.methods={options:function(jq){
+return $.data(jq[0],"pagination").options;
+},loading:function(jq){
+return jq.each(function(){
+_c6(this,true);
+});
+},loaded:function(jq){
+return jq.each(function(){
+_c6(this,false);
+});
+},refresh:function(jq,_cf){
+return jq.each(function(){
+_bd(this,_cf);
+});
+},select:function(jq,_d0){
+return jq.each(function(){
+_b9(this,_d0);
+});
+}};
+$.fn.pagination.parseOptions=function(_d1){
+var t=$(_d1);
+return $.extend({},$.parser.parseOptions(_d1,[{total:"number",pageSize:"number",pageNumber:"number",links:"number"},{loading:"boolean",showPageList:"boolean",showPageInfo:"boolean",showRefresh:"boolean"}]),{pageList:(t.attr("pageList")?eval(t.attr("pageList")):undefined)});
+};
+$.fn.pagination.defaults={total:1,pageSize:10,pageNumber:1,pageList:[10,20,30,50],loading:false,buttons:null,showPageList:true,showPageInfo:true,showRefresh:true,links:10,layout:["list","sep","first","prev","sep","manual","sep","next","last","sep","refresh","info"],onBeforeSelectPage:function(_d2,_d3){
+},onSelectPage:function(_d4,_d5){
+},onBeforeRefresh:function(_d6,_d7){
+},onRefresh:function(_d8,_d9){
+},onChangePageSize:function(_da){
+},beforePageText:"Page",afterPageText:"of {pages}",displayMsg:"Displaying {from} to {to} of {total} items",nav:{first:{iconCls:"pagination-first",handler:function(){
+var _db=$(this).pagination("options");
+if(_db.pageNumber>1){
+$(this).pagination("select",1);
+}
+}},prev:{iconCls:"pagination-prev",handler:function(){
+var _dc=$(this).pagination("options");
+if(_dc.pageNumber>1){
+$(this).pagination("select",_dc.pageNumber-1);
+}
+}},next:{iconCls:"pagination-next",handler:function(){
+var _dd=$(this).pagination("options");
+var _de=Math.ceil(_dd.total/_dd.pageSize);
+if(_dd.pageNumber<_de){
+$(this).pagination("select",_dd.pageNumber+1);
+}
+}},last:{iconCls:"pagination-last",handler:function(){
+var _df=$(this).pagination("options");
+var _e0=Math.ceil(_df.total/_df.pageSize);
+if(_df.pageNumber<_e0){
+$(this).pagination("select",_e0);
+}
+}},refresh:{iconCls:"pagination-refresh",handler:function(){
+var _e1=$(this).pagination("options");
+if(_e1.onBeforeRefresh.call(this,_e1.pageNumber,_e1.pageSize)!=false){
+$(this).pagination("select",_e1.pageNumber);
+_e1.onRefresh.call(this,_e1.pageNumber,_e1.pageSize);
+}
+}}}};
+})(jQuery);
+(function($){
+function _e2(_e3){
+var _e4=$(_e3);
+_e4.addClass("tree");
+return _e4;
+};
+function _e5(_e6){
+var _e7=$.data(_e6,"tree").options;
+$(_e6)._unbind()._bind("mouseover",function(e){
+var tt=$(e.target);
+var _e8=tt.closest("div.tree-node");
+if(!_e8.length){
+return;
+}
+_e8.addClass("tree-node-hover");
+if(tt.hasClass("tree-hit")){
+if(tt.hasClass("tree-expanded")){
+tt.addClass("tree-expanded-hover");
+}else{
+tt.addClass("tree-collapsed-hover");
+}
+}
+e.stopPropagation();
+})._bind("mouseout",function(e){
+var tt=$(e.target);
+var _e9=tt.closest("div.tree-node");
+if(!_e9.length){
+return;
+}
+_e9.removeClass("tree-node-hover");
+if(tt.hasClass("tree-hit")){
+if(tt.hasClass("tree-expanded")){
+tt.removeClass("tree-expanded-hover");
+}else{
+tt.removeClass("tree-collapsed-hover");
+}
+}
+e.stopPropagation();
+})._bind("click",function(e){
+var tt=$(e.target);
+var _ea=tt.closest("div.tree-node");
+if(!_ea.length){
+return;
+}
+if(tt.hasClass("tree-hit")){
+_148(_e6,_ea[0]);
+return false;
+}else{
+if(tt.hasClass("tree-checkbox")){
+_10f(_e6,_ea[0]);
+return false;
+}else{
+_18d(_e6,_ea[0]);
+_e7.onClick.call(_e6,_ed(_e6,_ea[0]));
+}
+}
+e.stopPropagation();
+})._bind("dblclick",function(e){
+var _eb=$(e.target).closest("div.tree-node");
+if(!_eb.length){
+return;
+}
+_18d(_e6,_eb[0]);
+_e7.onDblClick.call(_e6,_ed(_e6,_eb[0]));
+e.stopPropagation();
+})._bind("contextmenu",function(e){
+var _ec=$(e.target).closest("div.tree-node");
+if(!_ec.length){
+return;
+}
+_e7.onContextMenu.call(_e6,e,_ed(_e6,_ec[0]));
+e.stopPropagation();
+});
+};
+function _ee(_ef){
+var _f0=$.data(_ef,"tree").options;
+_f0.dnd=false;
+var _f1=$(_ef).find("div.tree-node");
+_f1.draggable("disable");
+_f1.css("cursor","pointer");
+};
+function _f2(_f3){
+var _f4=$.data(_f3,"tree");
+var _f5=_f4.options;
+var _f6=_f4.tree;
+_f4.disabledNodes=[];
+_f5.dnd=true;
+_f6.find("div.tree-node").draggable({disabled:false,revert:true,cursor:"pointer",proxy:function(_f7){
+var p=$("<div class=\"tree-node-proxy\"></div>").appendTo("body");
+p.html("<span class=\"tree-dnd-icon tree-dnd-no\">&nbsp;</span>"+$(_f7).find(".tree-title").html());
+p.hide();
+return p;
+},deltaX:15,deltaY:15,onBeforeDrag:function(e){
+if(_f5.onBeforeDrag.call(_f3,_ed(_f3,this))==false){
+return false;
+}
+if($(e.target).hasClass("tree-hit")||$(e.target).hasClass("tree-checkbox")){
+return false;
+}
+if(e.which!=1){
+return false;
+}
+var _f8=$(this).find("span.tree-indent");
+if(_f8.length){
+e.data.offsetWidth-=_f8.length*_f8.width();
+}
+},onStartDrag:function(e){
+$(this).next("ul").find("div.tree-node").each(function(){
+$(this).droppable("disable");
+_f4.disabledNodes.push(this);
+});
+$(this).draggable("proxy").css({left:-10000,top:-10000});
+_f5.onStartDrag.call(_f3,_ed(_f3,this));
+var _f9=_ed(_f3,this);
+if(_f9.id==undefined){
+_f9.id="easyui_tree_node_id_temp";
+_12f(_f3,_f9);
+}
+_f4.draggingNodeId=_f9.id;
+},onDrag:function(e){
+var x1=e.pageX,y1=e.pageY,x2=e.data.startX,y2=e.data.startY;
+var d=Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
+if(d>3){
+$(this).draggable("proxy").show();
+}
+this.pageY=e.pageY;
+},onStopDrag:function(){
+for(var i=0;i<_f4.disabledNodes.length;i++){
+$(_f4.disabledNodes[i]).droppable("enable");
+}
+_f4.disabledNodes=[];
+var _fa=_185(_f3,_f4.draggingNodeId);
+if(_fa&&_fa.id=="easyui_tree_node_id_temp"){
+_fa.id="";
+_12f(_f3,_fa);
+}
+_f5.onStopDrag.call(_f3,_fa);
+}}).droppable({accept:"div.tree-node",onDragEnter:function(e,_fb){
+if(_f5.onDragEnter.call(_f3,this,_fc(_fb))==false){
+_fd(_fb,false);
+$(this).removeClass("tree-node-append tree-node-top tree-node-bottom");
+$(this).droppable("disable");
+_f4.disabledNodes.push(this);
+}
+},onDragOver:function(e,_fe){
+if($(this).droppable("options").disabled){
+return;
+}
+var _ff=_fe.pageY;
+var top=$(this).offset().top;
+var _100=top+$(this).outerHeight();
+_fd(_fe,true);
+$(this).removeClass("tree-node-append tree-node-top tree-node-bottom");
+if(_ff>top+(_100-top)/2){
+if(_100-_ff<5){
+$(this).addClass("tree-node-bottom");
+}else{
+$(this).addClass("tree-node-append");
+}
+}else{
+if(_ff-top<5){
+$(this).addClass("tree-node-top");
+}else{
+$(this).addClass("tree-node-append");
+}
+}
+if(_f5.onDragOver.call(_f3,this,_fc(_fe))==false){
+_fd(_fe,false);
+$(this).removeClass("tree-node-append tree-node-top tree-node-bottom");
+$(this).droppable("disable");
+_f4.disabledNodes.push(this);
+}
+},onDragLeave:function(e,_101){
+_fd(_101,false);
+$(this).removeClass("tree-node-append tree-node-top tree-node-bottom");
+_f5.onDragLeave.call(_f3,this,_fc(_101));
+},onDrop:function(e,_102){
+var dest=this;
+var _103,_104;
+if($(this).hasClass("tree-node-append")){
+_103=_105;
+_104="append";
+}else{
+_103=_106;
+_104=$(this).hasClass("tree-node-top")?"top":"bottom";
+}
+if(_f5.onBeforeDrop.call(_f3,dest,_fc(_102),_104)==false){
+$(this).removeClass("tree-node-append tree-node-top tree-node-bottom");
+return;
+}
+_103(_102,dest,_104);
+$(this).removeClass("tree-node-append tree-node-top tree-node-bottom");
+}});
+function _fc(_107,pop){
+return $(_107).closest("ul.tree").tree(pop?"pop":"getData",_107);
+};
+function _fd(_108,_109){
+var icon=$(_108).draggable("proxy").find("span.tree-dnd-icon");
+icon.removeClass("tree-dnd-yes tree-dnd-no").addClass(_109?"tree-dnd-yes":"tree-dnd-no");
+};
+function _105(_10a,dest){
+if(_ed(_f3,dest).state=="closed"){
+_140(_f3,dest,function(){
+_10b();
+});
+}else{
+_10b();
+}
+function _10b(){
+var node=_fc(_10a,true);
+$(_f3).tree("append",{parent:dest,data:[node]});
+_f5.onDrop.call(_f3,dest,node,"append");
+};
+};
+function _106(_10c,dest,_10d){
+var _10e={};
+if(_10d=="top"){
+_10e.before=dest;
+}else{
+_10e.after=dest;
+}
+var node=_fc(_10c,true);
+_10e.data=node;
+$(_f3).tree("insert",_10e);
+_f5.onDrop.call(_f3,dest,node,_10d);
+};
+};
+function _10f(_110,_111,_112,_113){
+var _114=$.data(_110,"tree");
+var opts=_114.options;
+if(!opts.checkbox){
+return;
+}
+var _115=_ed(_110,_111);
+if(!_115.checkState){
+return;
+}
+var ck=$(_111).find(".tree-checkbox");
+if(_112==undefined){
+if(ck.hasClass("tree-checkbox1")){
+_112=false;
+}else{
+if(ck.hasClass("tree-checkbox0")){
+_112=true;
+}else{
+if(_115._checked==undefined){
+_115._checked=$(_111).find(".tree-checkbox").hasClass("tree-checkbox1");
+}
+_112=!_115._checked;
+}
+}
+}
+_115._checked=_112;
+if(_112){
+if(ck.hasClass("tree-checkbox1")){
+return;
+}
+}else{
+if(ck.hasClass("tree-checkbox0")){
+return;
+}
+}
+if(!_113){
+if(opts.onBeforeCheck.call(_110,_115,_112)==false){
+return;
+}
+}
+if(opts.cascadeCheck){
+_116(_110,_115,_112);
+_117(_110,_115);
+}else{
+_118(_110,_115,_112?"1":"0");
+}
+if(!_113){
+opts.onCheck.call(_110,_115,_112);
+}
+};
+function _116(_119,_11a,_11b){
+var opts=$.data(_119,"tree").options;
+var flag=_11b?1:0;
+_118(_119,_11a,flag);
+if(opts.deepCheck){
+$.easyui.forEach(_11a.children||[],true,function(n){
+_118(_119,n,flag);
+});
+}else{
+var _11c=[];
+if(_11a.children&&_11a.children.length){
+_11c.push(_11a);
+}
+$.easyui.forEach(_11a.children||[],true,function(n){
+if(!n.hidden){
+_118(_119,n,flag);
+if(n.children&&n.children.length){
+_11c.push(n);
+}
+}
+});
+for(var i=_11c.length-1;i>=0;i--){
+var node=_11c[i];
+_118(_119,node,_11d(node));
+}
+}
+};
+function _118(_11e,_11f,flag){
+var opts=$.data(_11e,"tree").options;
+if(!_11f.checkState||flag==undefined){
+return;
+}
+if(_11f.hidden&&!opts.deepCheck){
+return;
+}
+var ck=$("#"+_11f.domId).find(".tree-checkbox");
+_11f.checkState=["unchecked","checked","indeterminate"][flag];
+_11f.checked=(_11f.checkState=="checked");
+ck.removeClass("tree-checkbox0 tree-checkbox1 tree-checkbox2");
+ck.addClass("tree-checkbox"+flag);
+};
+function _117(_120,_121){
+var pd=_122(_120,$("#"+_121.domId)[0]);
+if(pd){
+_118(_120,pd,_11d(pd));
+_117(_120,pd);
+}
+};
+function _11d(row){
+var c0=0;
+var c1=0;
+var len=0;
+$.easyui.forEach(row.children||[],false,function(r){
+if(r.checkState){
+len++;
+if(r.checkState=="checked"){
+c1++;
+}else{
+if(r.checkState=="unchecked"){
+c0++;
+}
+}
+}
+});
+if(len==0){
+return undefined;
+}
+var flag=0;
+if(c0==len){
+flag=0;
+}else{
+if(c1==len){
+flag=1;
+}else{
+flag=2;
+}
+}
+return flag;
+};
+function _123(_124,_125){
+var opts=$.data(_124,"tree").options;
+if(!opts.checkbox){
+return;
+}
+var node=$(_125);
+var ck=node.find(".tree-checkbox");
+var _126=_ed(_124,_125);
+if(opts.view.hasCheckbox(_124,_126)){
+if(!ck.length){
+_126.checkState=_126.checkState||"unchecked";
+$("<span class=\"tree-checkbox\"></span>").insertBefore(node.find(".tree-title"));
+}
+if(_126.checkState=="checked"){
+_10f(_124,_125,true,true);
+}else{
+if(_126.checkState=="unchecked"){
+_10f(_124,_125,false,true);
+}else{
+var flag=_11d(_126);
+if(flag===0){
+_10f(_124,_125,false,true);
+}else{
+if(flag===1){
+_10f(_124,_125,true,true);
+}
+}
+}
+}
+}else{
+ck.remove();
+_126.checkState=undefined;
+_126.checked=undefined;
+_117(_124,_126);
+}
+};
+function _127(_128,ul,data,_129,_12a){
+var _12b=$.data(_128,"tree");
+var opts=_12b.options;
+var _12c=$(ul).prevAll("div.tree-node:first");
+data=opts.loadFilter.call(_128,data,_12c[0]);
+var _12d=_12e(_128,"domId",_12c.attr("id"));
+if(!_129){
+_12d?_12d.children=data:_12b.data=data;
+$(ul).empty();
+}else{
+if(_12d){
+_12d.children?_12d.children=_12d.children.concat(data):_12d.children=data;
+}else{
+_12b.data=_12b.data.concat(data);
+}
+}
+opts.view.render.call(opts.view,_128,ul,data);
+if(opts.dnd){
+_f2(_128);
+}
+if(_12d){
+_12f(_128,_12d);
+}
+for(var i=0;i<_12b.tmpIds.length;i++){
+_10f(_128,$("#"+_12b.tmpIds[i])[0],true,true);
+}
+_12b.tmpIds=[];
+setTimeout(function(){
+_130(_128,_128);
+},0);
+if(!_12a){
+opts.onLoadSuccess.call(_128,_12d,data);
+}
+};
+function _130(_131,ul,_132){
+var opts=$.data(_131,"tree").options;
+if(opts.lines){
+$(_131).addClass("tree-lines");
+}else{
+$(_131).removeClass("tree-lines");
+return;
+}
+if(!_132){
+_132=true;
+$(_131).find("span.tree-indent").removeClass("tree-line tree-join tree-joinbottom");
+$(_131).find("div.tree-node").removeClass("tree-node-last tree-root-first tree-root-one");
+var _133=$(_131).tree("getRoots");
+if(_133.length>1){
+$(_133[0].target).addClass("tree-root-first");
+}else{
+if(_133.length==1){
+$(_133[0].target).addClass("tree-root-one");
+}
+}
+}
+$(ul).children("li").each(function(){
+var node=$(this).children("div.tree-node");
+var ul=node.next("ul");
+if(ul.length){
+if($(this).next().length){
+_134(node);
+}
+_130(_131,ul,_132);
+}else{
+_135(node);
+}
+});
+var _136=$(ul).children("li:last").children("div.tree-node").addClass("tree-node-last");
+_136.children("span.tree-join").removeClass("tree-join").addClass("tree-joinbottom");
+function _135(node,_137){
+var icon=node.find("span.tree-icon");
+icon.prev("span.tree-indent").addClass("tree-join");
+};
+function _134(node){
+var _138=node.find("span.tree-indent, span.tree-hit").length;
+node.next().find("div.tree-node").each(function(){
+$(this).children("span:eq("+(_138-1)+")").addClass("tree-line");
+});
+};
+};
+function _139(_13a,ul,_13b,_13c){
+var opts=$.data(_13a,"tree").options;
+_13b=$.extend({},opts.queryParams,_13b||{});
+var _13d=null;
+if(_13a!=ul){
+var node=$(ul).prev();
+_13d=_ed(_13a,node[0]);
+}
+if(opts.onBeforeLoad.call(_13a,_13d,_13b)==false){
+return;
+}
+var _13e=$(ul).prev().children("span.tree-folder");
+_13e.addClass("tree-loading");
+var _13f=opts.loader.call(_13a,_13b,function(data){
+_13e.removeClass("tree-loading");
+_127(_13a,ul,data);
+if(_13c){
+_13c();
+}
+},function(){
+_13e.removeClass("tree-loading");
+opts.onLoadError.apply(_13a,arguments);
+if(_13c){
+_13c();
+}
+});
+if(_13f==false){
+_13e.removeClass("tree-loading");
+}
+};
+function _140(_141,_142,_143){
+var opts=$.data(_141,"tree").options;
+var hit=$(_142).children("span.tree-hit");
+if(hit.length==0){
+return;
+}
+if(hit.hasClass("tree-expanded")){
+return;
+}
+var node=_ed(_141,_142);
+if(opts.onBeforeExpand.call(_141,node)==false){
+return;
+}
+hit.removeClass("tree-collapsed tree-collapsed-hover").addClass("tree-expanded");
+hit.next().addClass("tree-folder-open");
+var ul=$(_142).next();
+if(ul.length){
+if(opts.animate){
+ul.slideDown("normal",function(){
+node.state="open";
+opts.onExpand.call(_141,node);
+if(_143){
+_143();
+}
+});
+}else{
+ul.css("display","block");
+node.state="open";
+opts.onExpand.call(_141,node);
+if(_143){
+_143();
+}
+}
+}else{
+var _144=$("<ul style=\"display:none\"></ul>").insertAfter(_142);
+_139(_141,_144[0],{id:node.id},function(){
+if(_144.is(":empty")){
+_144.remove();
+}
+if(opts.animate){
+_144.slideDown("normal",function(){
+node.state="open";
+opts.onExpand.call(_141,node);
+if(_143){
+_143();
+}
+});
+}else{
+_144.css("display","block");
+node.state="open";
+opts.onExpand.call(_141,node);
+if(_143){
+_143();
+}
+}
+});
+}
+};
+function _145(_146,_147){
+var opts=$.data(_146,"tree").options;
+var hit=$(_147).children("span.tree-hit");
+if(hit.length==0){
+return;
+}
+if(hit.hasClass("tree-collapsed")){
+return;
+}
+var node=_ed(_146,_147);
+if(opts.onBeforeCollapse.call(_146,node)==false){
+return;
+}
+hit.removeClass("tree-expanded tree-expanded-hover").addClass("tree-collapsed");
+hit.next().removeClass("tree-folder-open");
+var ul=$(_147).next();
+if(opts.animate){
+ul.slideUp("normal",function(){
+node.state="closed";
+opts.onCollapse.call(_146,node);
+});
+}else{
+ul.css("display","none");
+node.state="closed";
+opts.onCollapse.call(_146,node);
+}
+};
+function _148(_149,_14a){
+var hit=$(_14a).children("span.tree-hit");
+if(hit.length==0){
+return;
+}
+if(hit.hasClass("tree-expanded")){
+_145(_149,_14a);
+}else{
+_140(_149,_14a);
+}
+};
+function _14b(_14c,_14d){
+var _14e=_14f(_14c,_14d);
+if(_14d){
+_14e.unshift(_ed(_14c,_14d));
+}
+for(var i=0;i<_14e.length;i++){
+_140(_14c,_14e[i].target);
+}
+};
+function _150(_151,_152){
+var _153=[];
+var p=_122(_151,_152);
+while(p){
+_153.unshift(p);
+p=_122(_151,p.target);
+}
+for(var i=0;i<_153.length;i++){
+_140(_151,_153[i].target);
+}
+};
+function _154(_155,_156){
+var c=$(_155).parent();
+while(c[0].tagName!="BODY"&&c.css("overflow-y")!="auto"){
+c=c.parent();
+}
+var n=$(_156);
+var ntop=n.offset().top;
+if(c[0].tagName!="BODY"){
+var ctop=c.offset().top;
+if(ntop<ctop){
+c.scrollTop(c.scrollTop()+ntop-ctop);
+}else{
+if(ntop+n.outerHeight()>ctop+c.outerHeight()-18){
+c.scrollTop(c.scrollTop()+ntop+n.outerHeight()-ctop-c.outerHeight()+18);
+}
+}
+}else{
+c.scrollTop(ntop);
+}
+};
+function _157(_158,_159){
+var _15a=_14f(_158,_159);
+if(_159){
+_15a.unshift(_ed(_158,_159));
+}
+for(var i=0;i<_15a.length;i++){
+_145(_158,_15a[i].target);
+}
+};
+function _15b(_15c,_15d){
+var node=$(_15d.parent);
+var data=_15d.data;
+if(!data){
+return;
+}
+data=$.isArray(data)?data:[data];
+if(!data.length){
+return;
+}
+var ul;
+if(node.length==0){
+ul=$(_15c);
+}else{
+if(_15e(_15c,node[0])){
+var _15f=node.find("span.tree-icon");
+_15f.removeClass("tree-file").addClass("tree-folder tree-folder-open");
+var hit=$("<span class=\"tree-hit tree-expanded\"></span>").insertBefore(_15f);
+if(hit.prev().length){
+hit.prev().remove();
+}
+}
+ul=node.next();
+if(!ul.length){
+ul=$("<ul></ul>").insertAfter(node);
+}
+}
+_127(_15c,ul[0],data,true,true);
+};
+function _160(_161,_162){
+var ref=_162.before||_162.after;
+var _163=_122(_161,ref);
+var data=_162.data;
+if(!data){
+return;
+}
+data=$.isArray(data)?data:[data];
+if(!data.length){
+return;
+}
+_15b(_161,{parent:(_163?_163.target:null),data:data});
+var _164=_163?_163.children:$(_161).tree("getRoots");
+for(var i=0;i<_164.length;i++){
+if(_164[i].domId==$(ref).attr("id")){
+for(var j=data.length-1;j>=0;j--){
+_164.splice((_162.before?i:(i+1)),0,data[j]);
+}
+_164.splice(_164.length-data.length,data.length);
+break;
+}
+}
+var li=$();
+for(var i=0;i<data.length;i++){
+li=li.add($("#"+data[i].domId).parent());
+}
+if(_162.before){
+li.insertBefore($(ref).parent());
+}else{
+li.insertAfter($(ref).parent());
+}
+};
+function _165(_166,_167){
+var _168=del(_167);
+$(_167).parent().remove();
+if(_168){
+if(!_168.children||!_168.children.length){
+var node=$(_168.target);
+node.find(".tree-icon").removeClass("tree-folder").addClass("tree-file");
+node.find(".tree-hit").remove();
+$("<span class=\"tree-indent\"></span>").prependTo(node);
+node.next().remove();
+}
+_12f(_166,_168);
+}
+_130(_166,_166);
+function del(_169){
+var id=$(_169).attr("id");
+var _16a=_122(_166,_169);
+var cc=_16a?_16a.children:$.data(_166,"tree").data;
+for(var i=0;i<cc.length;i++){
+if(cc[i].domId==id){
+cc.splice(i,1);
+break;
+}
+}
+return _16a;
+};
+};
+function _12f(_16b,_16c){
+var opts=$.data(_16b,"tree").options;
+var node=$(_16c.target);
+var data=_ed(_16b,_16c.target);
+if(data.iconCls){
+node.find(".tree-icon").removeClass(data.iconCls);
+}
+$.extend(data,_16c);
+node.find(".tree-title").html(opts.formatter.call(_16b,data));
+if(data.iconCls){
+node.find(".tree-icon").addClass(data.iconCls);
+}
+_123(_16b,_16c.target);
+};
+function _16d(_16e,_16f){
+if(_16f){
+var p=_122(_16e,_16f);
+while(p){
+_16f=p.target;
+p=_122(_16e,_16f);
+}
+return _ed(_16e,_16f);
+}else{
+var _170=_171(_16e);
+return _170.length?_170[0]:null;
+}
+};
+function _171(_172){
+var _173=$.data(_172,"tree").data;
+for(var i=0;i<_173.length;i++){
+_174(_173[i]);
+}
+return _173;
+};
+function _14f(_175,_176){
+var _177=[];
+var n=_ed(_175,_176);
+var data=n?(n.children||[]):$.data(_175,"tree").data;
+$.easyui.forEach(data,true,function(node){
+_177.push(_174(node));
+});
+return _177;
+};
+function _122(_178,_179){
+var p=$(_179).closest("ul").prevAll("div.tree-node:first");
+return _ed(_178,p[0]);
+};
+function _17a(_17b,_17c){
+_17c=_17c||"checked";
+if(!$.isArray(_17c)){
+_17c=[_17c];
+}
+var _17d=[];
+$.easyui.forEach($.data(_17b,"tree").data,true,function(n){
+if(n.checkState&&$.easyui.indexOfArray(_17c,n.checkState)!=-1){
+_17d.push(_174(n));
+}
+});
+return _17d;
+};
+function _17e(_17f){
+var node=$(_17f).find("div.tree-node-selected");
+return node.length?_ed(_17f,node[0]):null;
+};
+function _180(_181,_182){
+var data=_ed(_181,_182);
+if(data&&data.children){
+$.easyui.forEach(data.children,true,function(node){
+_174(node);
+});
+}
+return data;
+};
+function _ed(_183,_184){
+return _12e(_183,"domId",$(_184).attr("id"));
+};
+function _185(_186,_187){
+if($.isFunction(_187)){
+var fn=_187;
+}else{
+var _187=typeof _187=="object"?_187:{id:_187};
+var fn=function(node){
+for(var p in _187){
+if(node[p]!=_187[p]){
+return false;
+}
+}
+return true;
+};
+}
+var _188=null;
+var data=$.data(_186,"tree").data;
+$.easyui.forEach(data,true,function(node){
+if(fn.call(_186,node)==true){
+_188=_174(node);
+return false;
+}
+});
+return _188;
+};
+function _12e(_189,_18a,_18b){
+var _18c={};
+_18c[_18a]=_18b;
+return _185(_189,_18c);
+};
+function _174(node){
+node.target=$("#"+node.domId)[0];
+return node;
+};
+function _18d(_18e,_18f){
+var opts=$.data(_18e,"tree").options;
+var node=_ed(_18e,_18f);
+if(opts.onBeforeSelect.call(_18e,node)==false){
+return;
+}
+$(_18e).find("div.tree-node-selected").removeClass("tree-node-selected");
+$(_18f).addClass("tree-node-selected");
+opts.onSelect.call(_18e,node);
+};
+function _15e(_190,_191){
+return $(_191).children("span.tree-hit").length==0;
+};
+function _192(_193,_194){
+var opts=$.data(_193,"tree").options;
+var node=_ed(_193,_194);
+if(opts.onBeforeEdit.call(_193,node)==false){
+return;
+}
+$(_194).css("position","relative");
+var nt=$(_194).find(".tree-title");
+var _195=nt.outerWidth();
+nt.empty();
+var _196=$("<input class=\"tree-editor\">").appendTo(nt);
+_196.val(node.text).focus();
+_196.width(_195+20);
+_196._outerHeight(opts.editorHeight);
+_196._bind("click",function(e){
+return false;
+})._bind("mousedown",function(e){
+e.stopPropagation();
+})._bind("mousemove",function(e){
+e.stopPropagation();
+})._bind("keydown",function(e){
+if(e.keyCode==13){
+_197(_193,_194);
+return false;
+}else{
+if(e.keyCode==27){
+_19b(_193,_194);
+return false;
+}
+}
+})._bind("blur",function(e){
+e.stopPropagation();
+_197(_193,_194);
+});
+};
+function _197(_198,_199){
+var opts=$.data(_198,"tree").options;
+$(_199).css("position","");
+var _19a=$(_199).find("input.tree-editor");
+var val=_19a.val();
+_19a.remove();
+var node=_ed(_198,_199);
+node.text=val;
+_12f(_198,node);
+opts.onAfterEdit.call(_198,node);
+};
+function _19b(_19c,_19d){
+var opts=$.data(_19c,"tree").options;
+$(_19d).css("position","");
+$(_19d).find("input.tree-editor").remove();
+var node=_ed(_19c,_19d);
+_12f(_19c,node);
+opts.onCancelEdit.call(_19c,node);
+};
+function _19e(_19f,q){
+var _1a0=$.data(_19f,"tree");
+var opts=_1a0.options;
+var ids={};
+$.easyui.forEach(_1a0.data,true,function(node){
+if(opts.filter.call(_19f,q,node)){
+$("#"+node.domId).removeClass("tree-node-hidden");
+ids[node.domId]=1;
+node.hidden=false;
+}else{
+$("#"+node.domId).addClass("tree-node-hidden");
+node.hidden=true;
+}
+});
+for(var id in ids){
+_1a1(id);
+}
+function _1a1(_1a2){
+var p=$(_19f).tree("getParent",$("#"+_1a2)[0]);
+while(p){
+$(p.target).removeClass("tree-node-hidden");
+p.hidden=false;
+p=$(_19f).tree("getParent",p.target);
+}
+};
+};
+$.fn.tree=function(_1a3,_1a4){
+if(typeof _1a3=="string"){
+return $.fn.tree.methods[_1a3](this,_1a4);
+}
+var _1a3=_1a3||{};
+return this.each(function(){
+var _1a5=$.data(this,"tree");
+var opts;
+if(_1a5){
+opts=$.extend(_1a5.options,_1a3);
+_1a5.options=opts;
+}else{
+opts=$.extend({},$.fn.tree.defaults,$.fn.tree.parseOptions(this),_1a3);
+$.data(this,"tree",{options:opts,tree:_e2(this),data:[],tmpIds:[]});
+var data=$.fn.tree.parseData(this);
+if(data.length){
+_127(this,this,data);
+}
+}
+_e5(this);
+if(opts.data){
+_127(this,this,$.extend(true,[],opts.data));
+}
+_139(this,this);
+});
+};
+$.fn.tree.methods={options:function(jq){
+return $.data(jq[0],"tree").options;
+},loadData:function(jq,data){
+return jq.each(function(){
+_127(this,this,data);
+});
+},getNode:function(jq,_1a6){
+return _ed(jq[0],_1a6);
+},getData:function(jq,_1a7){
+return _180(jq[0],_1a7);
+},reload:function(jq,_1a8){
+return jq.each(function(){
+if(_1a8){
+var node=$(_1a8);
+var hit=node.children("span.tree-hit");
+hit.removeClass("tree-expanded tree-expanded-hover").addClass("tree-collapsed");
+node.next().remove();
+_140(this,_1a8);
+}else{
+$(this).empty();
+_139(this,this);
+}
+});
+},getRoot:function(jq,_1a9){
+return _16d(jq[0],_1a9);
+},getRoots:function(jq){
+return _171(jq[0]);
+},getParent:function(jq,_1aa){
+return _122(jq[0],_1aa);
+},getChildren:function(jq,_1ab){
+return _14f(jq[0],_1ab);
+},getChecked:function(jq,_1ac){
+return _17a(jq[0],_1ac);
+},getSelected:function(jq){
+return _17e(jq[0]);
+},isLeaf:function(jq,_1ad){
+return _15e(jq[0],_1ad);
+},find:function(jq,id){
+return _185(jq[0],id);
+},findBy:function(jq,_1ae){
+return _12e(jq[0],_1ae.field,_1ae.value);
+},select:function(jq,_1af){
+return jq.each(function(){
+_18d(this,_1af);
+});
+},check:function(jq,_1b0){
+return jq.each(function(){
+_10f(this,_1b0,true);
+});
+},uncheck:function(jq,_1b1){
+return jq.each(function(){
+_10f(this,_1b1,false);
+});
+},collapse:function(jq,_1b2){
+return jq.each(function(){
+_145(this,_1b2);
+});
+},expand:function(jq,_1b3){
+return jq.each(function(){
+_140(this,_1b3);
+});
+},collapseAll:function(jq,_1b4){
+return jq.each(function(){
+_157(this,_1b4);
+});
+},expandAll:function(jq,_1b5){
+return jq.each(function(){
+_14b(this,_1b5);
+});
+},expandTo:function(jq,_1b6){
+return jq.each(function(){
+_150(this,_1b6);
+});
+},scrollTo:function(jq,_1b7){
+return jq.each(function(){
+_154(this,_1b7);
+});
+},toggle:function(jq,_1b8){
+return jq.each(function(){
+_148(this,_1b8);
+});
+},append:function(jq,_1b9){
+return jq.each(function(){
+_15b(this,_1b9);
+});
+},insert:function(jq,_1ba){
+return jq.each(function(){
+_160(this,_1ba);
+});
+},remove:function(jq,_1bb){
+return jq.each(function(){
+_165(this,_1bb);
+});
+},pop:function(jq,_1bc){
+var node=jq.tree("getData",_1bc);
+jq.tree("remove",_1bc);
+return node;
+},update:function(jq,_1bd){
+return jq.each(function(){
+_12f(this,$.extend({},_1bd,{checkState:_1bd.checked?"checked":(_1bd.checked===false?"unchecked":undefined)}));
+});
+},enableDnd:function(jq){
+return jq.each(function(){
+_f2(this);
+});
+},disableDnd:function(jq){
+return jq.each(function(){
+_ee(this);
+});
+},beginEdit:function(jq,_1be){
+return jq.each(function(){
+_192(this,_1be);
+});
+},endEdit:function(jq,_1bf){
+return jq.each(function(){
+_197(this,_1bf);
+});
+},cancelEdit:function(jq,_1c0){
+return jq.each(function(){
+_19b(this,_1c0);
+});
+},doFilter:function(jq,q){
+return jq.each(function(){
+_19e(this,q);
+});
+}};
+$.fn.tree.parseOptions=function(_1c1){
+var t=$(_1c1);
+return $.extend({},$.parser.parseOptions(_1c1,["url","method",{checkbox:"boolean",cascadeCheck:"boolean",onlyLeafCheck:"boolean"},{animate:"boolean",lines:"boolean",dnd:"boolean"}]));
+};
+$.fn.tree.parseData=function(_1c2){
+var data=[];
+_1c3(data,$(_1c2));
+return data;
+function _1c3(aa,tree){
+tree.children("li").each(function(){
+var node=$(this);
+var item=$.extend({},$.parser.parseOptions(this,["id","iconCls","state"]),{checked:(node.attr("checked")?true:undefined)});
+item.text=node.children("span").html();
+if(!item.text){
+item.text=node.html();
+}
+var _1c4=node.children("ul");
+if(_1c4.length){
+item.children=[];
+_1c3(item.children,_1c4);
+}
+aa.push(item);
+});
+};
+};
+var _1c5=1;
+var _1c6={render:function(_1c7,ul,data){
+var _1c8=$.data(_1c7,"tree");
+var opts=_1c8.options;
+var _1c9=$(ul).prev(".tree-node");
+var _1ca=_1c9.length?$(_1c7).tree("getNode",_1c9[0]):null;
+var _1cb=_1c9.find("span.tree-indent, span.tree-hit").length;
+var _1cc=$(_1c7).attr("id")||"";
+var cc=_1cd.call(this,_1cb,data);
+$(ul).append(cc.join(""));
+function _1cd(_1ce,_1cf){
+var cc=[];
+for(var i=0;i<_1cf.length;i++){
+var item=_1cf[i];
+if(item.state!="open"&&item.state!="closed"){
+item.state="open";
+}
+item.domId=_1cc+"_easyui_tree_"+_1c5++;
+cc.push("<li>");
+cc.push("<div id=\""+item.domId+"\" class=\"tree-node"+(item.nodeCls?" "+item.nodeCls:"")+"\">");
+for(var j=0;j<_1ce;j++){
+cc.push("<span class=\"tree-indent\"></span>");
+}
+if(item.state=="closed"){
+cc.push("<span class=\"tree-hit tree-collapsed\"></span>");
+cc.push("<span class=\"tree-icon tree-folder "+(item.iconCls?item.iconCls:"")+"\"></span>");
+}else{
+if(item.children&&item.children.length){
+cc.push("<span class=\"tree-hit tree-expanded\"></span>");
+cc.push("<span class=\"tree-icon tree-folder tree-folder-open "+(item.iconCls?item.iconCls:"")+"\"></span>");
+}else{
+cc.push("<span class=\"tree-indent\"></span>");
+cc.push("<span class=\"tree-icon tree-file "+(item.iconCls?item.iconCls:"")+"\"></span>");
+}
+}
+if(this.hasCheckbox(_1c7,item)){
+var flag=0;
+if(_1ca&&_1ca.checkState=="checked"&&opts.cascadeCheck){
+flag=1;
+item.checked=true;
+}else{
+if(item.checked){
+$.easyui.addArrayItem(_1c8.tmpIds,item.domId);
+}
+}
+item.checkState=flag?"checked":"unchecked";
+cc.push("<span class=\"tree-checkbox tree-checkbox"+flag+"\"></span>");
+}else{
+item.checkState=undefined;
+item.checked=undefined;
+}
+cc.push("<span class=\"tree-title\">"+opts.formatter.call(_1c7,item)+"</span>");
+cc.push("</div>");
+if(item.children&&item.children.length){
+var tmp=_1cd.call(this,_1ce+1,item.children);
+cc.push("<ul style=\"display:"+(item.state=="closed"?"none":"block")+"\">");
+cc=cc.concat(tmp);
+cc.push("</ul>");
+}
+cc.push("</li>");
+}
+return cc;
+};
+},hasCheckbox:function(_1d0,item){
+var _1d1=$.data(_1d0,"tree");
+var opts=_1d1.options;
+if(opts.checkbox){
+if($.isFunction(opts.checkbox)){
+if(opts.checkbox.call(_1d0,item)){
+return true;
+}else{
+return false;
+}
+}else{
+if(opts.onlyLeafCheck){
+if(item.state=="open"&&!(item.children&&item.children.length)){
+return true;
+}
+}else{
+return true;
+}
+}
+}
+return false;
+}};
+$.fn.tree.defaults={url:null,method:"post",animate:false,checkbox:false,cascadeCheck:true,onlyLeafCheck:false,lines:false,dnd:false,editorHeight:26,data:null,queryParams:{},formatter:function(node){
+return node.text;
+},filter:function(q,node){
+var qq=[];
+$.map($.isArray(q)?q:[q],function(q){
+q=$.trim(q);
+if(q){
+qq.push(q);
+}
+});
+for(var i=0;i<qq.length;i++){
+var _1d2=node.text.toLowerCase().indexOf(qq[i].toLowerCase());
+if(_1d2>=0){
+return true;
+}
+}
+return !qq.length;
+},loader:function(_1d3,_1d4,_1d5){
+var opts=$(this).tree("options");
+if(!opts.url){
+return false;
+}
+$.ajax({type:opts.method,url:opts.url,data:_1d3,dataType:"json",success:function(data){
+_1d4(data);
+},error:function(){
+_1d5.apply(this,arguments);
+}});
+},loadFilter:function(data,_1d6){
+return data;
+},view:_1c6,onBeforeLoad:function(node,_1d7){
+},onLoadSuccess:function(node,data){
+},onLoadError:function(){
+},onClick:function(node){
+},onDblClick:function(node){
+},onBeforeExpand:function(node){
+},onExpand:function(node){
+},onBeforeCollapse:function(node){
+},onCollapse:function(node){
+},onBeforeCheck:function(node,_1d8){
+},onCheck:function(node,_1d9){
+},onBeforeSelect:function(node){
+},onSelect:function(node){
+},onContextMenu:function(e,node){
+},onBeforeDrag:function(node){
+},onStartDrag:function(node){
+},onStopDrag:function(node){
+},onDragEnter:function(_1da,_1db){
+},onDragOver:function(_1dc,_1dd){
+},onDragLeave:function(_1de,_1df){
+},onBeforeDrop:function(_1e0,_1e1,_1e2){
+},onDrop:function(_1e3,_1e4,_1e5){
+},onBeforeEdit:function(node){
+},onAfterEdit:function(node){
+},onCancelEdit:function(node){
+}};
+})(jQuery);
+(function($){
+function init(_1e6){
+$(_1e6).addClass("progressbar");
+$(_1e6).html("<div class=\"progressbar-text\"></div><div class=\"progressbar-value\"><div class=\"progressbar-text\"></div></div>");
+$(_1e6)._bind("_resize",function(e,_1e7){
+if($(this).hasClass("easyui-fluid")||_1e7){
+_1e8(_1e6);
+}
+return false;
+});
+return $(_1e6);
+};
+function _1e8(_1e9,_1ea){
+var opts=$.data(_1e9,"progressbar").options;
+var bar=$.data(_1e9,"progressbar").bar;
+if(_1ea){
+opts.width=_1ea;
+}
+bar._size(opts);
+bar.find("div.progressbar-text").css("width",bar.width());
+bar.find("div.progressbar-text,div.progressbar-value").css({height:bar.height()+"px",lineHeight:bar.height()+"px"});
+};
+$.fn.progressbar=function(_1eb,_1ec){
+if(typeof _1eb=="string"){
+var _1ed=$.fn.progressbar.methods[_1eb];
+if(_1ed){
+return _1ed(this,_1ec);
+}
+}
+_1eb=_1eb||{};
+return this.each(function(){
+var _1ee=$.data(this,"progressbar");
+if(_1ee){
+$.extend(_1ee.options,_1eb);
+}else{
+_1ee=$.data(this,"progressbar",{options:$.extend({},$.fn.progressbar.defaults,$.fn.progressbar.parseOptions(this),_1eb),bar:init(this)});
+}
+$(this).progressbar("setValue",_1ee.options.value);
+_1e8(this);
+});
+};
+$.fn.progressbar.methods={options:function(jq){
+return $.data(jq[0],"progressbar").options;
+},resize:function(jq,_1ef){
+return jq.each(function(){
+_1e8(this,_1ef);
+});
+},getValue:function(jq){
+return $.data(jq[0],"progressbar").options.value;
+},setValue:function(jq,_1f0){
+if(_1f0<0){
+_1f0=0;
+}
+if(_1f0>100){
+_1f0=100;
+}
+return jq.each(function(){
+var opts=$.data(this,"progressbar").options;
+var text=opts.text.replace(/{value}/,_1f0);
+var _1f1=opts.value;
+opts.value=_1f0;
+$(this).find("div.progressbar-value").width(_1f0+"%");
+$(this).find("div.progressbar-text").html(text);
+if(_1f1!=_1f0){
+opts.onChange.call(this,_1f0,_1f1);
+}
+});
+}};
+$.fn.progressbar.parseOptions=function(_1f2){
+return $.extend({},$.parser.parseOptions(_1f2,["width","height","text",{value:"number"}]));
+};
+$.fn.progressbar.defaults={width:"auto",height:22,value:0,text:"{value}%",onChange:function(_1f3,_1f4){
+}};
+})(jQuery);
+(function($){
+function init(_1f5){
+$(_1f5).addClass("tooltip-f");
+};
+function _1f6(_1f7){
+var opts=$.data(_1f7,"tooltip").options;
+$(_1f7)._unbind(".tooltip")._bind(opts.showEvent+".tooltip",function(e){
+$(_1f7).tooltip("show",e);
+})._bind(opts.hideEvent+".tooltip",function(e){
+$(_1f7).tooltip("hide",e);
+})._bind("mousemove.tooltip",function(e){
+if(opts.trackMouse){
+opts.trackMouseX=e.pageX;
+opts.trackMouseY=e.pageY;
+$(_1f7).tooltip("reposition");
+}
+});
+};
+function _1f8(_1f9){
+var _1fa=$.data(_1f9,"tooltip");
+if(_1fa.showTimer){
+clearTimeout(_1fa.showTimer);
+_1fa.showTimer=null;
+}
+if(_1fa.hideTimer){
+clearTimeout(_1fa.hideTimer);
+_1fa.hideTimer=null;
+}
+};
+function _1fb(_1fc){
+var _1fd=$.data(_1fc,"tooltip");
+if(!_1fd||!_1fd.tip){
+return;
+}
+var opts=_1fd.options;
+var tip=_1fd.tip;
+var pos={left:-100000,top:-100000};
+if($(_1fc).is(":visible")){
+pos=_1fe(opts.position);
+if(opts.position=="top"&&pos.top<0){
+pos=_1fe("bottom");
+}else{
+if((opts.position=="bottom")&&(pos.top+tip._outerHeight()>$(window)._outerHeight()+$(document).scrollTop())){
+pos=_1fe("top");
+}
+}
+if(pos.left<0){
+if(opts.position=="left"){
+pos=_1fe("right");
+}else{
+$(_1fc).tooltip("arrow").css("left",tip._outerWidth()/2+pos.left);
+pos.left=0;
+}
+}else{
+if(pos.left+tip._outerWidth()>$(window)._outerWidth()+$(document)._scrollLeft()){
+if(opts.position=="right"){
+pos=_1fe("left");
+}else{
+var left=pos.left;
+pos.left=$(window)._outerWidth()+$(document)._scrollLeft()-tip._outerWidth();
+$(_1fc).tooltip("arrow").css("left",tip._outerWidth()/2-(pos.left-left));
+}
+}
+}
+}
+tip.css({left:pos.left,top:pos.top,zIndex:(opts.zIndex!=undefined?opts.zIndex:($.fn.window?$.fn.window.defaults.zIndex++:""))});
+opts.onPosition.call(_1fc,pos.left,pos.top);
+function _1fe(_1ff){
+opts.position=_1ff||"bottom";
+tip.removeClass("tooltip-top tooltip-bottom tooltip-left tooltip-right").addClass("tooltip-"+opts.position);
+var left,top;
+var _200=$.isFunction(opts.deltaX)?opts.deltaX.call(_1fc,opts.position):opts.deltaX;
+var _201=$.isFunction(opts.deltaY)?opts.deltaY.call(_1fc,opts.position):opts.deltaY;
+if(opts.trackMouse){
+t=$();
+left=opts.trackMouseX+_200;
+top=opts.trackMouseY+_201;
+}else{
+var t=$(_1fc);
+left=t.offset().left+_200;
+top=t.offset().top+_201;
+}
+switch(opts.position){
+case "right":
+left+=t._outerWidth()+12+(opts.trackMouse?12:0);
+if(opts.valign=="middle"){
+top-=(tip._outerHeight()-t._outerHeight())/2;
+}
+break;
+case "left":
+left-=tip._outerWidth()+12+(opts.trackMouse?12:0);
+if(opts.valign=="middle"){
+top-=(tip._outerHeight()-t._outerHeight())/2;
+}
+break;
+case "top":
+left-=(tip._outerWidth()-t._outerWidth())/2;
+top-=tip._outerHeight()+12+(opts.trackMouse?12:0);
+break;
+case "bottom":
+left-=(tip._outerWidth()-t._outerWidth())/2;
+top+=t._outerHeight()+12+(opts.trackMouse?12:0);
+break;
+}
+return {left:left,top:top};
+};
+};
+function _202(_203,e){
+var _204=$.data(_203,"tooltip");
+var opts=_204.options;
+var tip=_204.tip;
+if(!tip){
+tip=$("<div tabindex=\"-1\" class=\"tooltip\">"+"<div class=\"tooltip-content\"></div>"+"<div class=\"tooltip-arrow-outer\"></div>"+"<div class=\"tooltip-arrow\"></div>"+"</div>").appendTo("body");
+_204.tip=tip;
+_205(_203);
+}
+_1f8(_203);
+_204.showTimer=setTimeout(function(){
+$(_203).tooltip("reposition");
+tip.show();
+opts.onShow.call(_203,e);
+var _206=tip.children(".tooltip-arrow-outer");
+var _207=tip.children(".tooltip-arrow");
+var bc="border-"+opts.position+"-color";
+_206.add(_207).css({borderTopColor:"",borderBottomColor:"",borderLeftColor:"",borderRightColor:""});
+_206.css(bc,tip.css(bc));
+_207.css(bc,tip.css("backgroundColor"));
+},opts.showDelay);
+};
+function _208(_209,e){
+var _20a=$.data(_209,"tooltip");
+if(_20a&&_20a.tip){
+_1f8(_209);
+_20a.hideTimer=setTimeout(function(){
+_20a.tip.hide();
+_20a.options.onHide.call(_209,e);
+},_20a.options.hideDelay);
+}
+};
+function _205(_20b,_20c){
+var _20d=$.data(_20b,"tooltip");
+var opts=_20d.options;
+if(_20c){
+opts.content=_20c;
+}
+if(!_20d.tip){
+return;
+}
+var cc=typeof opts.content=="function"?opts.content.call(_20b):opts.content;
+_20d.tip.children(".tooltip-content").html(cc);
+opts.onUpdate.call(_20b,cc);
+};
+function _20e(_20f){
+var _210=$.data(_20f,"tooltip");
+if(_210){
+_1f8(_20f);
+var opts=_210.options;
+if(_210.tip){
+_210.tip.remove();
+}
+if(opts._title){
+$(_20f).attr("title",opts._title);
+}
+$.removeData(_20f,"tooltip");
+$(_20f)._unbind(".tooltip").removeClass("tooltip-f");
+opts.onDestroy.call(_20f);
+}
+};
+$.fn.tooltip=function(_211,_212){
+if(typeof _211=="string"){
+return $.fn.tooltip.methods[_211](this,_212);
+}
+_211=_211||{};
+return this.each(function(){
+var _213=$.data(this,"tooltip");
+if(_213){
+$.extend(_213.options,_211);
+}else{
+$.data(this,"tooltip",{options:$.extend({},$.fn.tooltip.defaults,$.fn.tooltip.parseOptions(this),_211)});
+init(this);
+}
+_1f6(this);
+_205(this);
+});
+};
+$.fn.tooltip.methods={options:function(jq){
+return $.data(jq[0],"tooltip").options;
+},tip:function(jq){
+return $.data(jq[0],"tooltip").tip;
+},arrow:function(jq){
+return jq.tooltip("tip").children(".tooltip-arrow-outer,.tooltip-arrow");
+},show:function(jq,e){
+return jq.each(function(){
+_202(this,e);
+});
+},hide:function(jq,e){
+return jq.each(function(){
+_208(this,e);
+});
+},update:function(jq,_214){
+return jq.each(function(){
+_205(this,_214);
+});
+},reposition:function(jq){
+return jq.each(function(){
+_1fb(this);
+});
+},destroy:function(jq){
+return jq.each(function(){
+_20e(this);
+});
+}};
+$.fn.tooltip.parseOptions=function(_215){
+var t=$(_215);
+var opts=$.extend({},$.parser.parseOptions(_215,["position","showEvent","hideEvent","content",{trackMouse:"boolean",deltaX:"number",deltaY:"number",showDelay:"number",hideDelay:"number"}]),{_title:t.attr("title")});
+t.attr("title","");
+if(!opts.content){
+opts.content=opts._title;
+}
+return opts;
+};
+$.fn.tooltip.defaults={position:"bottom",valign:"middle",content:null,trackMouse:false,deltaX:0,deltaY:0,showEvent:"mouseenter",hideEvent:"mouseleave",showDelay:200,hideDelay:100,onShow:function(e){
+},onHide:function(e){
+},onUpdate:function(_216){
+},onPosition:function(left,top){
+},onDestroy:function(){
+}};
+})(jQuery);
+(function($){
+$.fn._remove=function(){
+return this.each(function(){
+$(this).remove();
+try{
+this.outerHTML="";
+}
+catch(err){
+}
+});
+};
+function _217(node){
+node._remove();
+};
+function _218(_219,_21a){
+var _21b=$.data(_219,"panel");
+var opts=_21b.options;
+var _21c=_21b.panel;
+var _21d=_21c.children(".panel-header");
+var _21e=_21c.children(".panel-body");
+var _21f=_21c.children(".panel-footer");
+var _220=(opts.halign=="left"||opts.halign=="right");
+if(_21a){
+$.extend(opts,{width:_21a.width,height:_21a.height,minWidth:_21a.minWidth,maxWidth:_21a.maxWidth,minHeight:_21a.minHeight,maxHeight:_21a.maxHeight,left:_21a.left,top:_21a.top});
+opts.hasResized=false;
+}
+var _221=_21c.outerWidth();
+var _222=_21c.outerHeight();
+_21c._size(opts);
+var _223=_21c.outerWidth();
+var _224=_21c.outerHeight();
+if(opts.hasResized&&(_221==_223&&_222==_224)){
+return;
+}
+opts.hasResized=true;
+if(!_220){
+_21d._outerWidth(_21c.width());
+}
+_21e._outerWidth(_21c.width());
+if(!isNaN(parseInt(opts.height))){
+if(_220){
+if(opts.header){
+var _225=$(opts.header)._outerWidth();
+}else{
+_21d.css("width","");
+var _225=_21d._outerWidth();
+}
+var _226=_21d.find(".panel-title");
+_225+=Math.min(_226._outerWidth(),_226._outerHeight());
+var _227=_21c.height();
+_21d._outerWidth(_225)._outerHeight(_227);
+_226._outerWidth(_21d.height());
+_21e._outerWidth(_21c.width()-_225-_21f._outerWidth())._outerHeight(_227);
+_21f._outerHeight(_227);
+_21e.css({left:"",right:""});
+if(_21d.length){
+_21e.css(opts.halign,(_21d.position()[opts.halign]+_225)+"px");
+}
+opts.panelCssWidth=_21c.css("width");
+if(opts.collapsed){
+_21c._outerWidth(_225+_21f._outerWidth());
+}
+}else{
+_21e._outerHeight(_21c.height()-_21d._outerHeight()-_21f._outerHeight());
+}
+}else{
+_21e.css("height","");
+var min=$.parser.parseValue("minHeight",opts.minHeight,_21c.parent());
+var max=$.parser.parseValue("maxHeight",opts.maxHeight,_21c.parent());
+var _228=_21d._outerHeight()+_21f._outerHeight()+_21c._outerHeight()-_21c.height();
+_21e._size("minHeight",min?(min-_228):"");
+_21e._size("maxHeight",max?(max-_228):"");
+}
+_21c.css({height:(_220?undefined:""),minHeight:"",maxHeight:"",left:opts.left,top:opts.top});
+opts.onResize.apply(_219,[opts.width,opts.height]);
+$(_219).panel("doLayout");
+};
+function _229(_22a,_22b){
+var _22c=$.data(_22a,"panel");
+var opts=_22c.options;
+var _22d=_22c.panel;
+if(_22b){
+if(_22b.left!=null){
+opts.left=_22b.left;
+}
+if(_22b.top!=null){
+opts.top=_22b.top;
+}
+}
+_22d.css({left:opts.left,top:opts.top});
+_22d.find(".tooltip-f").each(function(){
+$(this).tooltip("reposition");
+});
+opts.onMove.apply(_22a,[opts.left,opts.top]);
+};
+function _22e(_22f){
+$(_22f).addClass("panel-body")._size("clear");
+var _230=$("<div class=\"panel\"></div>").insertBefore(_22f);
+_230[0].appendChild(_22f);
+_230._bind("_resize",function(e,_231){
+if($(this).hasClass("easyui-fluid")||_231){
+_218(_22f,{});
+}
+return false;
+});
+return _230;
+};
+function _232(_233){
+var _234=$.data(_233,"panel");
+var opts=_234.options;
+var _235=_234.panel;
+_235.css(opts.style);
+_235.addClass(opts.cls);
+_235.removeClass("panel-hleft panel-hright").addClass("panel-h"+opts.halign);
+_236();
+_237();
+var _238=$(_233).panel("header");
+var body=$(_233).panel("body");
+var _239=$(_233).siblings(".panel-footer");
+if(opts.border){
+_238.removeClass("panel-header-noborder");
+body.removeClass("panel-body-noborder");
+_239.removeClass("panel-footer-noborder");
+}else{
+_238.addClass("panel-header-noborder");
+body.addClass("panel-body-noborder");
+_239.addClass("panel-footer-noborder");
+}
+_238.addClass(opts.headerCls);
+body.addClass(opts.bodyCls);
+$(_233).attr("id",opts.id||"");
+if(opts.content){
+$(_233).panel("clear");
+$(_233).html(opts.content);
+$.parser.parse($(_233));
+}
+function _236(){
+if(opts.noheader||(!opts.title&&!opts.header)){
+_217(_235.children(".panel-header"));
+_235.children(".panel-body").addClass("panel-body-noheader");
+}else{
+if(opts.header){
+$(opts.header).addClass("panel-header").prependTo(_235);
+}else{
+var _23a=_235.children(".panel-header");
+if(!_23a.length){
+_23a=$("<div class=\"panel-header\"></div>").prependTo(_235);
+}
+if(!$.isArray(opts.tools)){
+_23a.find("div.panel-tool .panel-tool-a").appendTo(opts.tools);
+}
+_23a.empty();
+var _23b=$("<div class=\"panel-title\"></div>").html(opts.title).appendTo(_23a);
+if(opts.iconCls){
+_23b.addClass("panel-with-icon");
+$("<div class=\"panel-icon\"></div>").addClass(opts.iconCls).appendTo(_23a);
+}
+if(opts.halign=="left"||opts.halign=="right"){
+_23b.addClass("panel-title-"+opts.titleDirection);
+}
+var tool=$("<div class=\"panel-tool\"></div>").appendTo(_23a);
+tool._bind("click",function(e){
+e.stopPropagation();
+});
+if(opts.tools){
+if($.isArray(opts.tools)){
+$.map(opts.tools,function(t){
+_23c(tool,t.iconCls,eval(t.handler));
+});
+}else{
+$(opts.tools).children().each(function(){
+$(this).addClass($(this).attr("iconCls")).addClass("panel-tool-a").appendTo(tool);
+});
+}
+}
+if(opts.collapsible){
+_23c(tool,"panel-tool-collapse",function(){
+if(opts.collapsed==true){
+_25d(_233,true);
+}else{
+_24e(_233,true);
+}
+});
+}
+if(opts.minimizable){
+_23c(tool,"panel-tool-min",function(){
+_263(_233);
+});
+}
+if(opts.maximizable){
+_23c(tool,"panel-tool-max",function(){
+if(opts.maximized==true){
+_266(_233);
+}else{
+_24d(_233);
+}
+});
+}
+if(opts.closable){
+_23c(tool,"panel-tool-close",function(){
+_24f(_233);
+});
+}
+}
+_235.children("div.panel-body").removeClass("panel-body-noheader");
+}
+};
+function _23c(c,icon,_23d){
+var a=$("<a href=\"javascript:;\"></a>").addClass(icon).appendTo(c);
+a._bind("click",_23d);
+};
+function _237(){
+if(opts.footer){
+$(opts.footer).addClass("panel-footer").appendTo(_235);
+$(_233).addClass("panel-body-nobottom");
+}else{
+_235.children(".panel-footer").remove();
+$(_233).removeClass("panel-body-nobottom");
+}
+};
+};
+function _23e(_23f,_240){
+var _241=$.data(_23f,"panel");
+var opts=_241.options;
+if(_242){
+opts.queryParams=_240;
+}
+if(!opts.href){
+return;
+}
+if(!_241.isLoaded||!opts.cache){
+var _242=$.extend({},opts.queryParams);
+if(opts.onBeforeLoad.call(_23f,_242)==false){
+return;
+}
+_241.isLoaded=false;
+if(opts.loadingMessage){
+$(_23f).panel("clear");
+$(_23f).html($("<div class=\"panel-loading\"></div>").html(opts.loadingMessage));
+}
+opts.loader.call(_23f,_242,function(data){
+var _243=opts.extractor.call(_23f,data);
+$(_23f).panel("clear");
+$(_23f).html(_243);
+$.parser.parse($(_23f));
+opts.onLoad.apply(_23f,arguments);
+_241.isLoaded=true;
+},function(){
+opts.onLoadError.apply(_23f,arguments);
+});
+}
+};
+function _244(_245){
+var t=$(_245);
+t.find(".combo-f").each(function(){
+$(this).combo("destroy");
+});
+t.find(".m-btn").each(function(){
+$(this).menubutton("destroy");
+});
+t.find(".s-btn").each(function(){
+$(this).splitbutton("destroy");
+});
+t.find(".tooltip-f").each(function(){
+$(this).tooltip("destroy");
+});
+t.children("div").each(function(){
+$(this)._size("unfit");
+});
+t.empty();
+};
+function _246(_247){
+$(_247).panel("doLayout",true);
+};
+function _248(_249,_24a){
+var _24b=$.data(_249,"panel");
+var opts=_24b.options;
+var _24c=_24b.panel;
+if(_24a!=true){
+if(opts.onBeforeOpen.call(_249)==false){
+return;
+}
+}
+_24c.stop(true,true);
+if($.isFunction(opts.openAnimation)){
+opts.openAnimation.call(_249,cb);
+}else{
+switch(opts.openAnimation){
+case "slide":
+_24c.slideDown(opts.openDuration,cb);
+break;
+case "fade":
+_24c.fadeIn(opts.openDuration,cb);
+break;
+case "show":
+_24c.show(opts.openDuration,cb);
+break;
+default:
+_24c.show();
+cb();
+}
+}
+function cb(){
+opts.closed=false;
+opts.minimized=false;
+var tool=_24c.children(".panel-header").find("a.panel-tool-restore");
+if(tool.length){
+opts.maximized=true;
+}
+opts.onOpen.call(_249);
+if(opts.maximized==true){
+opts.maximized=false;
+_24d(_249);
+}
+if(opts.collapsed==true){
+opts.collapsed=false;
+_24e(_249);
+}
+if(!opts.collapsed){
+if(opts.href&&(!_24b.isLoaded||!opts.cache)){
+_23e(_249);
+_246(_249);
+opts.doneLayout=true;
+}
+}
+if(!opts.doneLayout){
+opts.doneLayout=true;
+_246(_249);
+}
+};
+};
+function _24f(_250,_251){
+var _252=$.data(_250,"panel");
+var opts=_252.options;
+var _253=_252.panel;
+if(_251!=true){
+if(opts.onBeforeClose.call(_250)==false){
+return;
+}
+}
+_253.find(".tooltip-f").each(function(){
+$(this).tooltip("hide");
+});
+_253.stop(true,true);
+_253._size("unfit");
+if($.isFunction(opts.closeAnimation)){
+opts.closeAnimation.call(_250,cb);
+}else{
+switch(opts.closeAnimation){
+case "slide":
+_253.slideUp(opts.closeDuration,cb);
+break;
+case "fade":
+_253.fadeOut(opts.closeDuration,cb);
+break;
+case "hide":
+_253.hide(opts.closeDuration,cb);
+break;
+default:
+_253.hide();
+cb();
+}
+}
+function cb(){
+opts.closed=true;
+opts.onClose.call(_250);
+};
+};
+function _254(_255,_256){
+var _257=$.data(_255,"panel");
+var opts=_257.options;
+var _258=_257.panel;
+if(_256!=true){
+if(opts.onBeforeDestroy.call(_255)==false){
+return;
+}
+}
+$(_255).panel("clear").panel("clear","footer");
+_217(_258);
+opts.onDestroy.call(_255);
+};
+function _24e(_259,_25a){
+var opts=$.data(_259,"panel").options;
+var _25b=$.data(_259,"panel").panel;
+var body=_25b.children(".panel-body");
+var _25c=_25b.children(".panel-header");
+var tool=_25c.find("a.panel-tool-collapse");
+if(opts.collapsed==true){
+return;
+}
+body.stop(true,true);
+if(opts.onBeforeCollapse.call(_259)==false){
+return;
+}
+tool.addClass("panel-tool-expand");
+if(_25a==true){
+if(opts.halign=="left"||opts.halign=="right"){
+_25b.animate({width:_25c._outerWidth()+_25b.children(".panel-footer")._outerWidth()},function(){
+cb();
+});
+}else{
+body.slideUp("normal",function(){
+cb();
+});
+}
+}else{
+if(opts.halign=="left"||opts.halign=="right"){
+_25b._outerWidth(_25c._outerWidth()+_25b.children(".panel-footer")._outerWidth());
+}
+cb();
+}
+function cb(){
+body.hide();
+opts.collapsed=true;
+opts.onCollapse.call(_259);
+};
+};
+function _25d(_25e,_25f){
+var opts=$.data(_25e,"panel").options;
+var _260=$.data(_25e,"panel").panel;
+var body=_260.children(".panel-body");
+var tool=_260.children(".panel-header").find("a.panel-tool-collapse");
+if(opts.collapsed==false){
+return;
+}
+body.stop(true,true);
+if(opts.onBeforeExpand.call(_25e)==false){
+return;
+}
+tool.removeClass("panel-tool-expand");
+if(_25f==true){
+if(opts.halign=="left"||opts.halign=="right"){
+body.show();
+_260.animate({width:opts.panelCssWidth},function(){
+cb();
+});
+}else{
+body.slideDown("normal",function(){
+cb();
+});
+}
+}else{
+if(opts.halign=="left"||opts.halign=="right"){
+_260.css("width",opts.panelCssWidth);
+}
+cb();
+}
+function cb(){
+body.show();
+opts.collapsed=false;
+opts.onExpand.call(_25e);
+_23e(_25e);
+_246(_25e);
+};
+};
+function _24d(_261){
+var opts=$.data(_261,"panel").options;
+var _262=$.data(_261,"panel").panel;
+var tool=_262.children(".panel-header").find("a.panel-tool-max");
+if(opts.maximized==true){
+return;
+}
+tool.addClass("panel-tool-restore");
+if(!$.data(_261,"panel").original){
+$.data(_261,"panel").original={width:opts.width,height:opts.height,left:opts.left,top:opts.top,fit:opts.fit};
+}
+opts.left=0;
+opts.top=0;
+opts.fit=true;
+_218(_261);
+opts.minimized=false;
+opts.maximized=true;
+opts.onMaximize.call(_261);
+};
+function _263(_264){
+var opts=$.data(_264,"panel").options;
+var _265=$.data(_264,"panel").panel;
+_265._size("unfit");
+_265.hide();
+opts.minimized=true;
+opts.maximized=false;
+opts.onMinimize.call(_264);
+};
+function _266(_267){
+var opts=$.data(_267,"panel").options;
+var _268=$.data(_267,"panel").panel;
+var tool=_268.children(".panel-header").find("a.panel-tool-max");
+if(opts.maximized==false){
+return;
+}
+_268.show();
+tool.removeClass("panel-tool-restore");
+$.extend(opts,$.data(_267,"panel").original);
+_218(_267);
+opts.minimized=false;
+opts.maximized=false;
+$.data(_267,"panel").original=null;
+opts.onRestore.call(_267);
+};
+function _269(_26a,_26b){
+$.data(_26a,"panel").options.title=_26b;
+$(_26a).panel("header").find("div.panel-title").html(_26b);
+};
+var _26c=null;
+$(window)._unbind(".panel")._bind("resize.panel",function(){
+if(_26c){
+clearTimeout(_26c);
+}
+_26c=setTimeout(function(){
+var _26d=$("body.layout");
+if(_26d.length){
+_26d.layout("resize");
+$("body").children(".easyui-fluid:visible").each(function(){
+$(this).triggerHandler("_resize");
+});
+}else{
+$("body").panel("doLayout");
+}
+_26c=null;
+},100);
+});
+$.fn.panel=function(_26e,_26f){
+if(typeof _26e=="string"){
+return $.fn.panel.methods[_26e](this,_26f);
+}
+_26e=_26e||{};
+return this.each(function(){
+var _270=$.data(this,"panel");
+var opts;
+if(_270){
+opts=$.extend(_270.options,_26e);
+_270.isLoaded=false;
+}else{
+opts=$.extend({},$.fn.panel.defaults,$.fn.panel.parseOptions(this),_26e);
+$(this).attr("title","");
+_270=$.data(this,"panel",{options:opts,panel:_22e(this),isLoaded:false});
+}
+_232(this);
+$(this).show();
+if(opts.doSize==true){
+_270.panel.css("display","block");
+_218(this);
+}
+if(opts.closed==true||opts.minimized==true){
+_270.panel.hide();
+}else{
+_248(this);
+}
+});
+};
+$.fn.panel.methods={options:function(jq){
+return $.data(jq[0],"panel").options;
+},panel:function(jq){
+return $.data(jq[0],"panel").panel;
+},header:function(jq){
+return $.data(jq[0],"panel").panel.children(".panel-header");
+},footer:function(jq){
+return jq.panel("panel").children(".panel-footer");
+},body:function(jq){
+return $.data(jq[0],"panel").panel.children(".panel-body");
+},setTitle:function(jq,_271){
+return jq.each(function(){
+_269(this,_271);
+});
+},open:function(jq,_272){
+return jq.each(function(){
+_248(this,_272);
+});
+},close:function(jq,_273){
+return jq.each(function(){
+_24f(this,_273);
+});
+},destroy:function(jq,_274){
+return jq.each(function(){
+_254(this,_274);
+});
+},clear:function(jq,type){
+return jq.each(function(){
+_244(type=="footer"?$(this).panel("footer"):this);
+});
+},refresh:function(jq,href){
+return jq.each(function(){
+var _275=$.data(this,"panel");
+_275.isLoaded=false;
+if(href){
+if(typeof href=="string"){
+_275.options.href=href;
+}else{
+_275.options.queryParams=href;
+}
+}
+_23e(this);
+});
+},resize:function(jq,_276){
+return jq.each(function(){
+_218(this,_276||{});
+});
+},doLayout:function(jq,all){
+return jq.each(function(){
+_277(this,"body");
+_277($(this).siblings(".panel-footer")[0],"footer");
+function _277(_278,type){
+if(!_278){
+return;
+}
+var _279=_278==$("body")[0];
+var s=$(_278).find("div.panel:visible,div.accordion:visible,div.tabs-container:visible,div.layout:visible,.easyui-fluid:visible").filter(function(_27a,el){
+var p=$(el).parents(".panel-"+type+":first");
+return _279?p.length==0:p[0]==_278;
+});
+s.each(function(){
+$(this).triggerHandler("_resize",[all||false]);
+});
+};
+});
+},move:function(jq,_27b){
+return jq.each(function(){
+_229(this,_27b);
+});
+},maximize:function(jq){
+return jq.each(function(){
+_24d(this);
+});
+},minimize:function(jq){
+return jq.each(function(){
+_263(this);
+});
+},restore:function(jq){
+return jq.each(function(){
+_266(this);
+});
+},collapse:function(jq,_27c){
+return jq.each(function(){
+_24e(this,_27c);
+});
+},expand:function(jq,_27d){
+return jq.each(function(){
+_25d(this,_27d);
+});
+}};
+$.fn.panel.parseOptions=function(_27e){
+var t=$(_27e);
+var hh=t.children(".panel-header,header");
+var ff=t.children(".panel-footer,footer");
+return $.extend({},$.parser.parseOptions(_27e,["id","width","height","left","top","title","iconCls","cls","headerCls","bodyCls","tools","href","method","header","footer","halign","titleDirection",{cache:"boolean",fit:"boolean",border:"boolean",noheader:"boolean"},{collapsible:"boolean",minimizable:"boolean",maximizable:"boolean"},{closable:"boolean",collapsed:"boolean",minimized:"boolean",maximized:"boolean",closed:"boolean"},"openAnimation","closeAnimation",{openDuration:"number",closeDuration:"number"},]),{loadingMessage:(t.attr("loadingMessage")!=undefined?t.attr("loadingMessage"):undefined),header:(hh.length?hh.removeClass("panel-header"):undefined),footer:(ff.length?ff.removeClass("panel-footer"):undefined)});
+};
+$.fn.panel.defaults={id:null,title:null,iconCls:null,width:"auto",height:"auto",left:null,top:null,cls:null,headerCls:null,bodyCls:null,style:{},href:null,cache:true,fit:false,border:true,doSize:true,noheader:false,content:null,halign:"top",titleDirection:"down",collapsible:false,minimizable:false,maximizable:false,closable:false,collapsed:false,minimized:false,maximized:false,closed:false,openAnimation:false,openDuration:400,closeAnimation:false,closeDuration:400,tools:null,footer:null,header:null,queryParams:{},method:"get",href:null,loadingMessage:"Loading...",loader:function(_27f,_280,_281){
+var opts=$(this).panel("options");
+if(!opts.href){
+return false;
+}
+$.ajax({type:opts.method,url:opts.href,cache:false,data:_27f,dataType:"html",success:function(data){
+_280(data);
+},error:function(){
+_281.apply(this,arguments);
+}});
+},extractor:function(data){
+var _282=/<body[^>]*>((.|[\n\r])*)<\/body>/im;
+var _283=_282.exec(data);
+if(_283){
+return _283[1];
+}else{
+return data;
+}
+},onBeforeLoad:function(_284){
+},onLoad:function(){
+},onLoadError:function(){
+},onBeforeOpen:function(){
+},onOpen:function(){
+},onBeforeClose:function(){
+},onClose:function(){
+},onBeforeDestroy:function(){
+},onDestroy:function(){
+},onResize:function(_285,_286){
+},onMove:function(left,top){
+},onMaximize:function(){
+},onRestore:function(){
+},onMinimize:function(){
+},onBeforeCollapse:function(){
+},onBeforeExpand:function(){
+},onCollapse:function(){
+},onExpand:function(){
+}};
+})(jQuery);
+(function($){
+function _287(_288,_289){
+var _28a=$.data(_288,"window");
+if(_289){
+if(_289.left!=null){
+_28a.options.left=_289.left;
+}
+if(_289.top!=null){
+_28a.options.top=_289.top;
+}
+}
+$(_288).panel("move",_28a.options);
+if(_28a.shadow){
+_28a.shadow.css({left:_28a.options.left,top:_28a.options.top});
+}
+};
+function _28b(_28c,_28d){
+var opts=$.data(_28c,"window").options;
+var pp=$(_28c).window("panel");
+var _28e=pp._outerWidth();
+if(opts.inline){
+var _28f=pp.parent();
+opts.left=Math.ceil((_28f.width()-_28e)/2+_28f.scrollLeft());
+}else{
+var _290=opts.fixed?0:$(document).scrollLeft();
+opts.left=Math.ceil(($(window)._outerWidth()-_28e)/2+_290);
+}
+if(_28d){
+_287(_28c);
+}
+};
+function _291(_292,_293){
+var opts=$.data(_292,"window").options;
+var pp=$(_292).window("panel");
+var _294=pp._outerHeight();
+if(opts.inline){
+var _295=pp.parent();
+opts.top=Math.ceil((_295.height()-_294)/2+_295.scrollTop());
+}else{
+var _296=opts.fixed?0:$(document).scrollTop();
+opts.top=Math.ceil(($(window)._outerHeight()-_294)/2+_296);
+}
+if(_293){
+_287(_292);
+}
+};
+function _297(_298){
+var _299=$.data(_298,"window");
+var opts=_299.options;
+var win=$(_298).panel($.extend({},_299.options,{border:false,doSize:true,closed:true,cls:"window "+(!opts.border?"window-thinborder window-noborder ":(opts.border=="thin"?"window-thinborder ":""))+(opts.cls||""),headerCls:"window-header "+(opts.headerCls||""),bodyCls:"window-body "+(opts.noheader?"window-body-noheader ":" ")+(opts.bodyCls||""),onBeforeDestroy:function(){
+if(opts.onBeforeDestroy.call(_298)==false){
+return false;
+}
+if(_299.shadow){
+_299.shadow.remove();
+}
+if(_299.mask){
+_299.mask.remove();
+}
+},onClose:function(){
+if(_299.shadow){
+_299.shadow.hide();
+}
+if(_299.mask){
+_299.mask.hide();
+}
+opts.onClose.call(_298);
+},onOpen:function(){
+if(_299.mask){
+_299.mask.css($.extend({display:"block",zIndex:$.fn.window.defaults.zIndex++},$.fn.window.getMaskSize(_298)));
+}
+if(_299.shadow){
+_299.shadow.css({display:"block",position:(opts.fixed?"fixed":"absolute"),zIndex:$.fn.window.defaults.zIndex++,left:opts.left,top:opts.top,width:_299.window._outerWidth(),height:_299.window._outerHeight()});
+}
+_299.window.css({position:(opts.fixed?"fixed":"absolute"),zIndex:$.fn.window.defaults.zIndex++});
+opts.onOpen.call(_298);
+},onResize:function(_29a,_29b){
+var _29c=$(this).panel("options");
+$.extend(opts,{width:_29c.width,height:_29c.height,left:_29c.left,top:_29c.top});
+if(_299.shadow){
+_299.shadow.css({left:opts.left,top:opts.top,width:_299.window._outerWidth(),height:_299.window._outerHeight()});
+}
+opts.onResize.call(_298,_29a,_29b);
+},onMinimize:function(){
+if(_299.shadow){
+_299.shadow.hide();
+}
+if(_299.mask){
+_299.mask.hide();
+}
+_299.options.onMinimize.call(_298);
+},onBeforeCollapse:function(){
+if(opts.onBeforeCollapse.call(_298)==false){
+return false;
+}
+if(_299.shadow){
+_299.shadow.hide();
+}
+},onExpand:function(){
+if(_299.shadow){
+_299.shadow.show();
+}
+opts.onExpand.call(_298);
+}}));
+_299.window=win.panel("panel");
+if(_299.mask){
+_299.mask.remove();
+}
+if(opts.modal){
+_299.mask=$("<div class=\"window-mask\" style=\"display:none\"></div>").insertAfter(_299.window);
+}
+if(_299.shadow){
+_299.shadow.remove();
+}
+if(opts.shadow){
+_299.shadow=$("<div class=\"window-shadow\" style=\"display:none\"></div>").insertAfter(_299.window);
+}
+var _29d=opts.closed;
+if(opts.left==null){
+_28b(_298);
+}
+if(opts.top==null){
+_291(_298);
+}
+_287(_298);
+if(!_29d){
+win.window("open");
+}
+};
+function _29e(left,top,_29f,_2a0){
+var _2a1=this;
+var _2a2=$.data(_2a1,"window");
+var opts=_2a2.options;
+if(!opts.constrain){
+return {};
+}
+if($.isFunction(opts.constrain)){
+return opts.constrain.call(_2a1,left,top,_29f,_2a0);
+}
+var win=$(_2a1).window("window");
+var _2a3=opts.inline?win.parent():$(window);
+var _2a4=opts.fixed?0:_2a3.scrollTop();
+if(left<0){
+left=0;
+}
+if(top<_2a4){
+top=_2a4;
+}
+if(left+_29f>_2a3.width()){
+if(_29f==win.outerWidth()){
+left=_2a3.width()-_29f;
+}else{
+_29f=_2a3.width()-left;
+}
+}
+if(top-_2a4+_2a0>_2a3.height()){
+if(_2a0==win.outerHeight()){
+top=_2a3.height()-_2a0+_2a4;
+}else{
+_2a0=_2a3.height()-top+_2a4;
+}
+}
+return {left:left,top:top,width:_29f,height:_2a0};
+};
+function _2a5(_2a6){
+var _2a7=$.data(_2a6,"window");
+var opts=_2a7.options;
+_2a7.window.draggable({handle:">.panel-header>.panel-title",disabled:_2a7.options.draggable==false,onBeforeDrag:function(e){
+if(_2a7.mask){
+_2a7.mask.css("z-index",$.fn.window.defaults.zIndex++);
+}
+if(_2a7.shadow){
+_2a7.shadow.css("z-index",$.fn.window.defaults.zIndex++);
+}
+_2a7.window.css("z-index",$.fn.window.defaults.zIndex++);
+},onStartDrag:function(e){
+_2a8(e);
+},onDrag:function(e){
+_2a9(e);
+return false;
+},onStopDrag:function(e){
+_2aa(e,"move");
+}});
+_2a7.window.resizable({disabled:_2a7.options.resizable==false,onStartResize:function(e){
+_2a8(e);
+},onResize:function(e){
+_2a9(e);
+return false;
+},onStopResize:function(e){
+_2aa(e,"resize");
+}});
+function _2a8(e){
+_2a7.window.css("position",opts.fixed?"fixed":"absolute");
+if(_2a7.shadow){
+_2a7.shadow.css("position",opts.fixed?"fixed":"absolute");
+}
+if(_2a7.pmask){
+_2a7.pmask.remove();
+}
+_2a7.pmask=$("<div class=\"window-proxy-mask\"></div>").insertAfter(_2a7.window);
+_2a7.pmask.css({display:"none",position:(opts.fixed?"fixed":"absolute"),zIndex:$.fn.window.defaults.zIndex++,left:e.data.left,top:e.data.top,width:_2a7.window._outerWidth(),height:_2a7.window._outerHeight()});
+if(_2a7.proxy){
+_2a7.proxy.remove();
+}
+_2a7.proxy=$("<div class=\"window-proxy\"></div>").insertAfter(_2a7.window);
+_2a7.proxy.css({display:"none",position:(opts.fixed?"fixed":"absolute"),zIndex:$.fn.window.defaults.zIndex++,left:e.data.left,top:e.data.top});
+_2a7.proxy._outerWidth(e.data.width)._outerHeight(e.data.height);
+_2a7.proxy.hide();
+setTimeout(function(){
+if(_2a7.pmask){
+_2a7.pmask.show();
+}
+if(_2a7.proxy){
+_2a7.proxy.show();
+}
+},500);
+};
+function _2a9(e){
+$.extend(e.data,_29e.call(_2a6,e.data.left,e.data.top,e.data.width,e.data.height));
+_2a7.pmask.show();
+_2a7.proxy.css({display:"block",left:e.data.left,top:e.data.top});
+_2a7.proxy._outerWidth(e.data.width);
+_2a7.proxy._outerHeight(e.data.height);
+};
+function _2aa(e,_2ab){
+_2a7.window.css("position",opts.fixed?"fixed":"absolute");
+if(_2a7.shadow){
+_2a7.shadow.css("position",opts.fixed?"fixed":"absolute");
+}
+$.extend(e.data,_29e.call(_2a6,e.data.left,e.data.top,e.data.width+0.1,e.data.height+0.1));
+$(_2a6).window(_2ab,e.data);
+_2a7.pmask.remove();
+_2a7.pmask=null;
+_2a7.proxy.remove();
+_2a7.proxy=null;
+};
+};
+$(function(){
+if(!$._positionFixed){
+$(window).resize(function(){
+$("body>.window-mask:visible").css({width:"",height:""});
+setTimeout(function(){
+$("body>.window-mask:visible").css($.fn.window.getMaskSize());
+},50);
+});
+}
+});
+$.fn.window=function(_2ac,_2ad){
+if(typeof _2ac=="string"){
+var _2ae=$.fn.window.methods[_2ac];
+if(_2ae){
+return _2ae(this,_2ad);
+}else{
+return this.panel(_2ac,_2ad);
+}
+}
+_2ac=_2ac||{};
+return this.each(function(){
+var _2af=$.data(this,"window");
+if(_2af){
+$.extend(_2af.options,_2ac);
+}else{
+_2af=$.data(this,"window",{options:$.extend({},$.fn.window.defaults,$.fn.window.parseOptions(this),_2ac)});
+if(!_2af.options.inline){
+document.body.appendChild(this);
+}
+}
+_297(this);
+_2a5(this);
+});
+};
+$.fn.window.methods={options:function(jq){
+var _2b0=jq.panel("options");
+var _2b1=$.data(jq[0],"window").options;
+return $.extend(_2b1,{closed:_2b0.closed,collapsed:_2b0.collapsed,minimized:_2b0.minimized,maximized:_2b0.maximized});
+},window:function(jq){
+return $.data(jq[0],"window").window;
+},move:function(jq,_2b2){
+return jq.each(function(){
+_287(this,_2b2);
+});
+},hcenter:function(jq){
+return jq.each(function(){
+_28b(this,true);
+});
+},vcenter:function(jq){
+return jq.each(function(){
+_291(this,true);
+});
+},center:function(jq){
+return jq.each(function(){
+_28b(this);
+_291(this);
+_287(this);
+});
+}};
+$.fn.window.getMaskSize=function(_2b3){
+var _2b4=$(_2b3).data("window");
+if(_2b4&&_2b4.options.inline){
+return {};
+}else{
+if($._positionFixed){
+return {position:"fixed"};
+}else{
+return {width:$(document).width(),height:$(document).height()};
+}
+}
+};
+$.fn.window.parseOptions=function(_2b5){
+return $.extend({},$.fn.panel.parseOptions(_2b5),$.parser.parseOptions(_2b5,[{draggable:"boolean",resizable:"boolean",shadow:"boolean",modal:"boolean",inline:"boolean"}]));
+};
+$.fn.window.defaults=$.extend({},$.fn.panel.defaults,{zIndex:9000,draggable:true,resizable:true,shadow:true,modal:false,border:true,inline:false,title:"New Window",collapsible:true,minimizable:true,maximizable:true,closable:true,closed:false,fixed:false,constrain:false});
+})(jQuery);
+(function($){
+function _2b6(_2b7){
+var opts=$.data(_2b7,"dialog").options;
+opts.inited=false;
+$(_2b7).window($.extend({},opts,{onResize:function(w,h){
+if(opts.inited){
+_2bc(this);
+opts.onResize.call(this,w,h);
+}
+}}));
+var win=$(_2b7).window("window");
+if(opts.toolbar){
+if($.isArray(opts.toolbar)){
+$(_2b7).siblings("div.dialog-toolbar").remove();
+var _2b8=$("<div class=\"dialog-toolbar\"><table cellspacing=\"0\" cellpadding=\"0\"><tr></tr></table></div>").appendTo(win);
+var tr=_2b8.find("tr");
+for(var i=0;i<opts.toolbar.length;i++){
+var btn=opts.toolbar[i];
+if(btn=="-"){
+$("<td><div class=\"dialog-tool-separator\"></div></td>").appendTo(tr);
+}else{
+var td=$("<td></td>").appendTo(tr);
+var tool=$("<a href=\"javascript:;\"></a>").appendTo(td);
+tool[0].onclick=eval(btn.handler||function(){
+});
+tool.linkbutton($.extend({},btn,{plain:true}));
+}
+}
+}else{
+$(opts.toolbar).addClass("dialog-toolbar").appendTo(win);
+$(opts.toolbar).show();
+}
+}else{
+$(_2b7).siblings("div.dialog-toolbar").remove();
+}
+if(opts.buttons){
+if($.isArray(opts.buttons)){
+$(_2b7).siblings("div.dialog-button").remove();
+var _2b9=$("<div class=\"dialog-button\"></div>").appendTo(win);
+for(var i=0;i<opts.buttons.length;i++){
+var p=opts.buttons[i];
+var _2ba=$("<a href=\"javascript:;\"></a>").appendTo(_2b9);
+if(p.handler){
+_2ba[0].onclick=p.handler;
+}
+_2ba.linkbutton(p);
+}
+}else{
+$(opts.buttons).addClass("dialog-button").appendTo(win);
+$(opts.buttons).show();
+}
+}else{
+$(_2b7).siblings("div.dialog-button").remove();
+}
+opts.inited=true;
+var _2bb=opts.closed;
+win.show();
+$(_2b7).window("resize",{});
+if(_2bb){
+win.hide();
+}
+};
+function _2bc(_2bd,_2be){
+var t=$(_2bd);
+var opts=t.dialog("options");
+var _2bf=opts.noheader;
+var tb=t.siblings(".dialog-toolbar");
+var bb=t.siblings(".dialog-button");
+tb.insertBefore(_2bd).css({borderTopWidth:(_2bf?1:0),top:(_2bf?tb.length:0)});
+bb.insertAfter(_2bd);
+tb.add(bb)._outerWidth(t._outerWidth()).find(".easyui-fluid:visible").each(function(){
+$(this).triggerHandler("_resize");
+});
+var _2c0=tb._outerHeight()+bb._outerHeight();
+if(!isNaN(parseInt(opts.height))){
+t._outerHeight(t._outerHeight()-_2c0);
+}else{
+var _2c1=t._size("min-height");
+if(_2c1){
+t._size("min-height",_2c1-_2c0);
+}
+var _2c2=t._size("max-height");
+if(_2c2){
+t._size("max-height",_2c2-_2c0);
+}
+}
+var _2c3=$.data(_2bd,"window").shadow;
+if(_2c3){
+var cc=t.panel("panel");
+_2c3.css({width:cc._outerWidth(),height:cc._outerHeight()});
+}
+};
+$.fn.dialog=function(_2c4,_2c5){
+if(typeof _2c4=="string"){
+var _2c6=$.fn.dialog.methods[_2c4];
+if(_2c6){
+return _2c6(this,_2c5);
+}else{
+return this.window(_2c4,_2c5);
+}
+}
+_2c4=_2c4||{};
+return this.each(function(){
+var _2c7=$.data(this,"dialog");
+if(_2c7){
+$.extend(_2c7.options,_2c4);
+}else{
+$.data(this,"dialog",{options:$.extend({},$.fn.dialog.defaults,$.fn.dialog.parseOptions(this),_2c4)});
+}
+_2b6(this);
+});
+};
+$.fn.dialog.methods={options:function(jq){
+var _2c8=$.data(jq[0],"dialog").options;
+var _2c9=jq.panel("options");
+$.extend(_2c8,{width:_2c9.width,height:_2c9.height,left:_2c9.left,top:_2c9.top,closed:_2c9.closed,collapsed:_2c9.collapsed,minimized:_2c9.minimized,maximized:_2c9.maximized});
+return _2c8;
+},dialog:function(jq){
+return jq.window("window");
+}};
+$.fn.dialog.parseOptions=function(_2ca){
+var t=$(_2ca);
+return $.extend({},$.fn.window.parseOptions(_2ca),$.parser.parseOptions(_2ca,["toolbar","buttons"]),{toolbar:(t.children(".dialog-toolbar").length?t.children(".dialog-toolbar").removeClass("dialog-toolbar"):undefined),buttons:(t.children(".dialog-button").length?t.children(".dialog-button").removeClass("dialog-button"):undefined)});
+};
+$.fn.dialog.defaults=$.extend({},$.fn.window.defaults,{title:"New Dialog",collapsible:false,minimizable:false,maximizable:false,resizable:false,toolbar:null,buttons:null});
+})(jQuery);
+(function($){
+function _2cb(){
+$(document)._unbind(".messager")._bind("keydown.messager",function(e){
+if(e.keyCode==27){
+$("body").children("div.messager-window").children("div.messager-body").each(function(){
+$(this).dialog("close");
+});
+}else{
+if(e.keyCode==9){
+var win=$("body").children("div.messager-window");
+if(!win.length){
+return;
+}
+var _2cc=win.find(".messager-input,.messager-button .l-btn");
+for(var i=0;i<_2cc.length;i++){
+if($(_2cc[i]).is(":focus")){
+$(_2cc[i>=_2cc.length-1?0:i+1]).focus();
+return false;
+}
+}
+}else{
+if(e.keyCode==13){
+var _2cd=$(e.target).closest("input.messager-input");
+if(_2cd.length){
+var dlg=_2cd.closest(".messager-body");
+_2ce(dlg,_2cd.val());
+}
+}
+}
+}
+});
+};
+function _2cf(){
+$(document)._unbind(".messager");
+};
+function _2d0(_2d1){
+var opts=$.extend({},$.messager.defaults,{modal:false,shadow:false,draggable:false,resizable:false,closed:true,style:{left:"",top:"",right:0,zIndex:$.fn.window.defaults.zIndex++,bottom:-document.body.scrollTop-document.documentElement.scrollTop},title:"",width:300,height:150,minHeight:0,showType:"slide",showSpeed:600,content:_2d1.msg,timeout:4000},_2d1);
+var dlg=$("<div class=\"messager-body\"></div>").appendTo("body");
+dlg.dialog($.extend({},opts,{noheader:(opts.title?false:true),openAnimation:(opts.showType),closeAnimation:(opts.showType=="show"?"hide":opts.showType),openDuration:opts.showSpeed,closeDuration:opts.showSpeed,onOpen:function(){
+dlg.dialog("dialog").hover(function(){
+if(opts.timer){
+clearTimeout(opts.timer);
+}
+},function(){
+_2d2();
+});
+_2d2();
+function _2d2(){
+if(opts.timeout>0){
+opts.timer=setTimeout(function(){
+if(dlg.length&&dlg.data("dialog")){
+dlg.dialog("close");
+}
+},opts.timeout);
+}
+};
+if(_2d1.onOpen){
+_2d1.onOpen.call(this);
+}else{
+opts.onOpen.call(this);
+}
+},onClose:function(){
+if(opts.timer){
+clearTimeout(opts.timer);
+}
+if(_2d1.onClose){
+_2d1.onClose.call(this);
+}else{
+opts.onClose.call(this);
+}
+dlg.dialog("destroy");
+}}));
+dlg.dialog("dialog").css(opts.style);
+dlg.dialog("open");
+return dlg;
+};
+function _2d3(_2d4){
+_2cb();
+var dlg=$("<div class=\"messager-body\"></div>").appendTo("body");
+dlg.dialog($.extend({},_2d4,{noheader:(_2d4.title?false:true),onClose:function(){
+_2cf();
+if(_2d4.onClose){
+_2d4.onClose.call(this);
+}
+dlg.dialog("destroy");
+_2d5();
+}}));
+var win=dlg.dialog("dialog").addClass("messager-window");
+win.find(".dialog-button").addClass("messager-button").find("a:first").focus();
+return dlg;
+};
+function _2ce(dlg,_2d6){
+var opts=dlg.dialog("options");
+dlg.dialog("close");
+opts.fn(_2d6);
+};
+function _2d5(){
+var top=20+document.body.scrollTop+document.documentElement.scrollTop;
+$("body>.messager-tip").each(function(){
+$(this).animate({top:top},200);
+top+=$(this)._outerHeight()+10;
+});
+};
+$.messager={show:function(_2d7){
+return _2d0(_2d7);
+},tip:function(msg){
+var opts=typeof msg=="object"?msg:{msg:msg};
+if(opts.timeout==null){
+opts.timeout=2000;
+}
+var top=0;
+var _2d8=$("body>.messager-tip").last();
+if(_2d8.length){
+top=parseInt(_2d8.css("top"))+_2d8._outerHeight();
+}
+var cls=opts.icon?"messager-icon messager-"+opts.icon:"";
+opts=$.extend({},$.messager.defaults,{content:"<div class=\""+cls+"\"></div>"+"<div style=\"white-space:nowrap\">"+opts.msg+"</div>"+"<div style=\"clear:both;\"></div>",border:false,noheader:true,modal:false,title:null,width:"auto",height:"auto",minHeight:null,shadow:false,top:top,cls:"messager-tip",bodyCls:"f-row f-vcenter f-full"},opts);
+var dlg=_2d3(opts);
+if(opts.timeout){
+setTimeout(function(){
+if($(dlg).closest("body").length){
+$(dlg).dialog("close");
+}
+},opts.timeout);
+}
+setTimeout(function(){
+_2d5();
+},0);
+return dlg;
+},alert:function(_2d9,msg,icon,fn){
+var opts=typeof _2d9=="object"?_2d9:{title:_2d9,msg:msg,icon:icon,fn:fn};
+var cls=opts.icon?"messager-icon messager-"+opts.icon:"";
+opts=$.extend({},$.messager.defaults,{content:"<div class=\""+cls+"\"></div>"+"<div>"+opts.msg+"</div>"+"<div style=\"clear:both;\"></div>"},opts);
+if(!opts.buttons){
+opts.buttons=[{text:opts.ok,onClick:function(){
+_2ce(dlg);
+}}];
+}
+var dlg=_2d3(opts);
+return dlg;
+},confirm:function(_2da,msg,fn){
+var opts=typeof _2da=="object"?_2da:{title:_2da,msg:msg,fn:fn};
+opts=$.extend({},$.messager.defaults,{content:"<div class=\"messager-icon messager-question\"></div>"+"<div>"+opts.msg+"</div>"+"<div style=\"clear:both;\"></div>"},opts);
+if(!opts.buttons){
+opts.buttons=[{text:opts.ok,onClick:function(){
+_2ce(dlg,true);
+}},{text:opts.cancel,onClick:function(){
+_2ce(dlg,false);
+}}];
+}
+var dlg=_2d3(opts);
+return dlg;
+},prompt:function(_2db,msg,fn){
+var opts=typeof _2db=="object"?_2db:{title:_2db,msg:msg,fn:fn};
+opts=$.extend({},$.messager.defaults,{content:"<div class=\"messager-icon messager-question\"></div>"+"<div>"+opts.msg+"</div>"+"<br>"+"<div style=\"clear:both;\"></div>"+"<div><input class=\"messager-input\" type=\"text\"></div>"},opts);
+if(!opts.buttons){
+opts.buttons=[{text:opts.ok,onClick:function(){
+_2ce(dlg,dlg.find(".messager-input").val());
+}},{text:opts.cancel,onClick:function(){
+_2ce(dlg);
+}}];
+}
+var dlg=_2d3(opts);
+dlg.find(".messager-input").focus();
+return dlg;
+},progress:function(_2dc){
+var _2dd={bar:function(){
+return $("body>div.messager-window").find("div.messager-p-bar");
+},close:function(){
+var dlg=$("body>div.messager-window>div.messager-body:has(div.messager-progress)");
+if(dlg.length){
+dlg.dialog("close");
+}
+}};
+if(typeof _2dc=="string"){
+var _2de=_2dd[_2dc];
+return _2de();
+}
+_2dc=_2dc||{};
+var opts=$.extend({},{title:"",minHeight:0,content:undefined,msg:"",text:undefined,interval:300},_2dc);
+var dlg=_2d3($.extend({},$.messager.defaults,{content:"<div class=\"messager-progress\"><div class=\"messager-p-msg\">"+opts.msg+"</div><div class=\"messager-p-bar\"></div></div>",closable:false,doSize:false},opts,{onClose:function(){
+if(this.timer){
+clearInterval(this.timer);
+}
+if(_2dc.onClose){
+_2dc.onClose.call(this);
+}else{
+$.messager.defaults.onClose.call(this);
+}
+}}));
+var bar=dlg.find("div.messager-p-bar");
+bar.progressbar({text:opts.text});
+dlg.dialog("resize");
+if(opts.interval){
+dlg[0].timer=setInterval(function(){
+var v=bar.progressbar("getValue");
+v+=10;
+if(v>100){
+v=0;
+}
+bar.progressbar("setValue",v);
+},opts.interval);
+}
+return dlg;
+}};
+$.messager.defaults=$.extend({},$.fn.dialog.defaults,{ok:"Ok",cancel:"Cancel",width:300,height:"auto",minHeight:150,modal:true,collapsible:false,minimizable:false,maximizable:false,resizable:false,fn:function(){
+}});
+})(jQuery);
+(function($){
+function _2df(_2e0){
+var opts=$.data(_2e0,"drawer").options;
+$(_2e0).dialog($.extend({},opts,{cls:"drawer f-column window-shadow layout-panel layout-collapsed layout-panel-"+opts.region,bodyCls:"f-full",collapsed:false,top:0,left:"auto",right:"auto"}));
+$(_2e0).dialog("header").find(".panel-tool-collapse").addClass("layout-button-"+(opts.region=="east"?"right":"left"))._unbind()._bind("click",function(){
+_2e2(_2e0);
+});
+var _2e1=$(_2e0).dialog("dialog").width();
+$(_2e0).dialog("dialog").css({display:"",left:opts.region=="east"?"auto":-_2e1,right:opts.region=="east"?-_2e1:"auto"});
+var mask=$(_2e0).data("window").mask;
+$(mask).addClass("drawer-mask").hide()._unbind()._bind("click",function(){
+_2e2(_2e0);
+});
+};
+function _2e3(_2e4){
+var opts=$.data(_2e4,"drawer").options;
+var _2e5=$(_2e4).dialog("dialog").width();
+var mask=$(_2e4).data("window").mask;
+$(mask).show();
+$(_2e4).show().css({display:""}).dialog("dialog").animate({left:opts.region=="east"?"auto":0,right:opts.region=="east"?0:"auto"},function(){
+$(this).removeClass("layout-collapsed");
+opts.collapsed=false;
+opts.onExpand.call(_2e4);
+});
+};
+function _2e2(_2e6){
+var opts=$.data(_2e6,"drawer").options;
+var _2e7=$(_2e6).dialog("dialog").width();
+$(_2e6).show().css({display:""}).dialog("dialog").animate({left:opts.region=="east"?"auto":-_2e7,right:opts.region=="east"?-_2e7:"auto"},function(){
+$(this).addClass("layout-collapsed");
+var mask=$(_2e6).data("window").mask;
+$(mask).hide();
+opts.collapsed=true;
+opts.onCollapse.call(this);
+});
+};
+$.fn.drawer=function(_2e8,_2e9){
+if(typeof _2e8=="string"){
+var _2ea=$.fn.drawer.methods[_2e8];
+if(_2ea){
+return _2ea(this,_2e9);
+}else{
+return this.dialog(_2e8,_2e9);
+}
+}
+_2e8=_2e8||{};
+this.each(function(){
+var _2eb=$.data(this,"drawer");
+if(_2eb){
+$.extend(_2eb.options,_2e8);
+}else{
+var opts=$.extend({},$.fn.drawer.defaults,$.fn.drawer.parseOptions(this),_2e8);
+$.data(this,"drawer",{options:opts});
+}
+_2df(this);
+});
+};
+$.fn.drawer.methods={options:function(jq){
+var opts=$.data(jq[0],"drawer").options;
+return $.extend(jq.dialog("options"),{region:opts.region,collapsed:opts.collapsed});
+},expand:function(jq){
+return jq.each(function(){
+_2e3(this);
+});
+},collapse:function(jq){
+return jq.each(function(){
+_2e2(this);
+});
+}};
+$.fn.drawer.parseOptions=function(_2ec){
+return $.extend({},$.fn.dialog.parseOptions(_2ec),$.parser.parseOptions(_2ec,["region"]));
+};
+$.fn.drawer.defaults=$.extend({},$.fn.dialog.defaults,{border:false,region:"east",title:null,shadow:false,fixed:true,collapsed:true,closable:false,modal:true,draggable:false});
+})(jQuery);
+(function($){
+function _2ed(_2ee,_2ef){
+var _2f0=$.data(_2ee,"accordion");
+var opts=_2f0.options;
+var _2f1=_2f0.panels;
+var cc=$(_2ee);
+var _2f2=(opts.halign=="left"||opts.halign=="right");
+cc.children(".panel-last").removeClass("panel-last");
+cc.children(".panel:last").addClass("panel-last");
+if(_2ef){
+$.extend(opts,{width:_2ef.width,height:_2ef.height});
+}
+cc._size(opts);
+var _2f3=0;
+var _2f4="auto";
+var _2f5=cc.find(">.panel>.accordion-header");
+if(_2f5.length){
+if(_2f2){
+$(_2f5[0]).next().panel("resize",{width:cc.width(),height:cc.height()});
+_2f3=$(_2f5[0])._outerWidth();
+}else{
+_2f3=$(_2f5[0]).css("height","")._outerHeight();
+}
+}
+if(!isNaN(parseInt(opts.height))){
+if(_2f2){
+_2f4=cc.width()-_2f3*_2f5.length;
+}else{
+_2f4=cc.height()-_2f3*_2f5.length;
+}
+}
+_2f6(true,_2f4-_2f6(false));
+function _2f6(_2f7,_2f8){
+var _2f9=0;
+for(var i=0;i<_2f1.length;i++){
+var p=_2f1[i];
+if(_2f2){
+var h=p.panel("header")._outerWidth(_2f3);
+}else{
+var h=p.panel("header")._outerHeight(_2f3);
+}
+if(p.panel("options").collapsible==_2f7){
+var _2fa=isNaN(_2f8)?undefined:(_2f8+_2f3*h.length);
+if(_2f2){
+p.panel("resize",{height:cc.height(),width:(_2f7?_2fa:undefined)});
+_2f9+=p.panel("panel")._outerWidth()-_2f3*h.length;
+}else{
+p.panel("resize",{width:cc.width(),height:(_2f7?_2fa:undefined)});
+_2f9+=p.panel("panel").outerHeight()-_2f3*h.length;
+}
+}
+}
+return _2f9;
+};
+};
+function _2fb(_2fc,_2fd,_2fe,all){
+var _2ff=$.data(_2fc,"accordion").panels;
+var pp=[];
+for(var i=0;i<_2ff.length;i++){
+var p=_2ff[i];
+if(_2fd){
+if(p.panel("options")[_2fd]==_2fe){
+pp.push(p);
+}
+}else{
+if(p[0]==$(_2fe)[0]){
+return i;
+}
+}
+}
+if(_2fd){
+return all?pp:(pp.length?pp[0]:null);
+}else{
+return -1;
+}
+};
+function _300(_301){
+return _2fb(_301,"collapsed",false,true);
+};
+function _302(_303){
+var pp=_300(_303);
+return pp.length?pp[0]:null;
+};
+function _304(_305,_306){
+return _2fb(_305,null,_306);
+};
+function _307(_308,_309){
+var _30a=$.data(_308,"accordion").panels;
+if(typeof _309=="number"){
+if(_309<0||_309>=_30a.length){
+return null;
+}else{
+return _30a[_309];
+}
+}
+return _2fb(_308,"title",_309);
+};
+function _30b(_30c){
+var opts=$.data(_30c,"accordion").options;
+var cc=$(_30c);
+if(opts.border){
+cc.removeClass("accordion-noborder");
+}else{
+cc.addClass("accordion-noborder");
+}
+};
+function init(_30d){
+var _30e=$.data(_30d,"accordion");
+var cc=$(_30d);
+cc.addClass("accordion");
+_30e.panels=[];
+cc.children("div").each(function(){
+var opts=$.extend({},$.parser.parseOptions(this),{selected:($(this).attr("selected")?true:undefined)});
+var pp=$(this);
+_30e.panels.push(pp);
+_310(_30d,pp,opts);
+});
+cc._bind("_resize",function(e,_30f){
+if($(this).hasClass("easyui-fluid")||_30f){
+_2ed(_30d);
+}
+return false;
+});
+};
+function _310(_311,pp,_312){
+var opts=$.data(_311,"accordion").options;
+pp.panel($.extend({},{collapsible:true,minimizable:false,maximizable:false,closable:false,doSize:false,collapsed:true,headerCls:"accordion-header",bodyCls:"accordion-body",halign:opts.halign},_312,{onBeforeExpand:function(){
+if(_312.onBeforeExpand){
+if(_312.onBeforeExpand.call(this)==false){
+return false;
+}
+}
+if(!opts.multiple){
+var all=$.grep(_300(_311),function(p){
+return p.panel("options").collapsible;
+});
+for(var i=0;i<all.length;i++){
+_31a(_311,_304(_311,all[i]));
+}
+}
+var _313=$(this).panel("header");
+_313.addClass("accordion-header-selected");
+_313.find(".accordion-collapse").removeClass("accordion-expand");
+},onExpand:function(){
+$(_311).find(">.panel-last>.accordion-header").removeClass("accordion-header-border");
+if(_312.onExpand){
+_312.onExpand.call(this);
+}
+opts.onSelect.call(_311,$(this).panel("options").title,_304(_311,this));
+},onBeforeCollapse:function(){
+if(_312.onBeforeCollapse){
+if(_312.onBeforeCollapse.call(this)==false){
+return false;
+}
+}
+$(_311).find(">.panel-last>.accordion-header").addClass("accordion-header-border");
+var _314=$(this).panel("header");
+_314.removeClass("accordion-header-selected");
+_314.find(".accordion-collapse").addClass("accordion-expand");
+},onCollapse:function(){
+if(isNaN(parseInt(opts.height))){
+$(_311).find(">.panel-last>.accordion-header").removeClass("accordion-header-border");
+}
+if(_312.onCollapse){
+_312.onCollapse.call(this);
+}
+opts.onUnselect.call(_311,$(this).panel("options").title,_304(_311,this));
+}}));
+var _315=pp.panel("header");
+var tool=_315.children("div.panel-tool");
+tool.children("a.panel-tool-collapse").hide();
+var t=$("<a href=\"javascript:;\"></a>").addClass("accordion-collapse accordion-expand").appendTo(tool);
+t._bind("click",function(){
+_316(pp);
+return false;
+});
+pp.panel("options").collapsible?t.show():t.hide();
+if(opts.halign=="left"||opts.halign=="right"){
+t.hide();
+}
+_315._bind("click",function(){
+_316(pp);
+return false;
+});
+function _316(p){
+var _317=p.panel("options");
+if(_317.collapsible){
+var _318=_304(_311,p);
+if(_317.collapsed){
+_319(_311,_318);
+}else{
+_31a(_311,_318);
+}
+}
+};
+};
+function _319(_31b,_31c){
+var p=_307(_31b,_31c);
+if(!p){
+return;
+}
+_31d(_31b);
+var opts=$.data(_31b,"accordion").options;
+p.panel("expand",opts.animate);
+};
+function _31a(_31e,_31f){
+var p=_307(_31e,_31f);
+if(!p){
+return;
+}
+_31d(_31e);
+var opts=$.data(_31e,"accordion").options;
+p.panel("collapse",opts.animate);
+};
+function _320(_321){
+var opts=$.data(_321,"accordion").options;
+$(_321).find(">.panel-last>.accordion-header").addClass("accordion-header-border");
+var p=_2fb(_321,"selected",true);
+if(p){
+_322(_304(_321,p));
+}else{
+_322(opts.selected);
+}
+function _322(_323){
+var _324=opts.animate;
+opts.animate=false;
+_319(_321,_323);
+opts.animate=_324;
+};
+};
+function _31d(_325){
+var _326=$.data(_325,"accordion").panels;
+for(var i=0;i<_326.length;i++){
+_326[i].stop(true,true);
+}
+};
+function add(_327,_328){
+var _329=$.data(_327,"accordion");
+var opts=_329.options;
+var _32a=_329.panels;
+if(_328.selected==undefined){
+_328.selected=true;
+}
+_31d(_327);
+var pp=$("<div></div>").appendTo(_327);
+_32a.push(pp);
+_310(_327,pp,_328);
+_2ed(_327);
+opts.onAdd.call(_327,_328.title,_32a.length-1);
+if(_328.selected){
+_319(_327,_32a.length-1);
+}
+};
+function _32b(_32c,_32d){
+var _32e=$.data(_32c,"accordion");
+var opts=_32e.options;
+var _32f=_32e.panels;
+_31d(_32c);
+var _330=_307(_32c,_32d);
+var _331=_330.panel("options").title;
+var _332=_304(_32c,_330);
+if(!_330){
+return;
+}
+if(opts.onBeforeRemove.call(_32c,_331,_332)==false){
+return;
+}
+_32f.splice(_332,1);
+_330.panel("destroy");
+if(_32f.length){
+_2ed(_32c);
+var curr=_302(_32c);
+if(!curr){
+_319(_32c,0);
+}
+}
+opts.onRemove.call(_32c,_331,_332);
+};
+$.fn.accordion=function(_333,_334){
+if(typeof _333=="string"){
+return $.fn.accordion.methods[_333](this,_334);
+}
+_333=_333||{};
+return this.each(function(){
+var _335=$.data(this,"accordion");
+if(_335){
+$.extend(_335.options,_333);
+}else{
+$.data(this,"accordion",{options:$.extend({},$.fn.accordion.defaults,$.fn.accordion.parseOptions(this),_333),accordion:$(this).addClass("accordion"),panels:[]});
+init(this);
+}
+_30b(this);
+_2ed(this);
+_320(this);
+});
+};
+$.fn.accordion.methods={options:function(jq){
+return $.data(jq[0],"accordion").options;
+},panels:function(jq){
+return $.data(jq[0],"accordion").panels;
+},resize:function(jq,_336){
+return jq.each(function(){
+_2ed(this,_336);
+});
+},getSelections:function(jq){
+return _300(jq[0]);
+},getSelected:function(jq){
+return _302(jq[0]);
+},getPanel:function(jq,_337){
+return _307(jq[0],_337);
+},getPanelIndex:function(jq,_338){
+return _304(jq[0],_338);
+},select:function(jq,_339){
+return jq.each(function(){
+_319(this,_339);
+});
+},unselect:function(jq,_33a){
+return jq.each(function(){
+_31a(this,_33a);
+});
+},add:function(jq,_33b){
+return jq.each(function(){
+add(this,_33b);
+});
+},remove:function(jq,_33c){
+return jq.each(function(){
+_32b(this,_33c);
+});
+}};
+$.fn.accordion.parseOptions=function(_33d){
+var t=$(_33d);
+return $.extend({},$.parser.parseOptions(_33d,["width","height","halign",{fit:"boolean",border:"boolean",animate:"boolean",multiple:"boolean",selected:"number"}]));
+};
+$.fn.accordion.defaults={width:"auto",height:"auto",fit:false,border:true,animate:true,multiple:false,selected:0,halign:"top",onSelect:function(_33e,_33f){
+},onUnselect:function(_340,_341){
+},onAdd:function(_342,_343){
+},onBeforeRemove:function(_344,_345){
+},onRemove:function(_346,_347){
+}};
+})(jQuery);
+(function($){
+function _348(c){
+var w=0;
+$(c).children().each(function(){
+w+=$(this).outerWidth(true);
+});
+return w;
+};
+function _349(_34a){
+var opts=$.data(_34a,"tabs").options;
+if(!opts.showHeader){
+return;
+}
+var _34b=$(_34a).children("div.tabs-header");
+var tool=_34b.children("div.tabs-tool:not(.tabs-tool-hidden)");
+var _34c=_34b.children("div.tabs-scroller-left");
+var _34d=_34b.children("div.tabs-scroller-right");
+var wrap=_34b.children("div.tabs-wrap");
+if(opts.tabPosition=="left"||opts.tabPosition=="right"){
+if(!tool.length){
+return;
+}
+tool._outerWidth(_34b.width());
+var _34e={left:opts.tabPosition=="left"?"auto":0,right:opts.tabPosition=="left"?0:"auto",top:opts.toolPosition=="top"?0:"auto",bottom:opts.toolPosition=="top"?"auto":0};
+var _34f={marginTop:opts.toolPosition=="top"?tool.outerHeight():0};
+tool.css(_34e);
+wrap.css(_34f);
+return;
+}
+var _350=_34b.outerHeight();
+if(opts.plain){
+_350-=_350-_34b.height();
+}
+tool._outerHeight(_350);
+var _351=_348(_34b.find("ul.tabs"));
+var _352=_34b.width()-tool._outerWidth();
+if(_351>_352){
+_34c.add(_34d).show()._outerHeight(_350);
+if(opts.toolPosition=="left"){
+tool.css({left:_34c.outerWidth(),right:""});
+wrap.css({marginLeft:_34c.outerWidth()+tool._outerWidth(),marginRight:_34d._outerWidth(),width:_352-_34c.outerWidth()-_34d.outerWidth()});
+}else{
+tool.css({left:"",right:_34d.outerWidth()});
+wrap.css({marginLeft:_34c.outerWidth(),marginRight:_34d.outerWidth()+tool._outerWidth(),width:_352-_34c.outerWidth()-_34d.outerWidth()});
+}
+}else{
+_34c.add(_34d).hide();
+if(opts.toolPosition=="left"){
+tool.css({left:0,right:""});
+wrap.css({marginLeft:tool._outerWidth(),marginRight:0,width:_352});
+}else{
+tool.css({left:"",right:0});
+wrap.css({marginLeft:0,marginRight:tool._outerWidth(),width:_352});
+}
+}
+};
+function _353(_354){
+var opts=$.data(_354,"tabs").options;
+var _355=$(_354).children("div.tabs-header");
+if(opts.tools){
+if(typeof opts.tools=="string"){
+$(opts.tools).addClass("tabs-tool").appendTo(_355);
+$(opts.tools).show();
+}else{
+_355.children("div.tabs-tool").remove();
+var _356=$("<div class=\"tabs-tool\"><table cellspacing=\"0\" cellpadding=\"0\" style=\"height:100%\"><tr></tr></table></div>").appendTo(_355);
+var tr=_356.find("tr");
+for(var i=0;i<opts.tools.length;i++){
+var td=$("<td></td>").appendTo(tr);
+var tool=$("<a href=\"javascript:;\"></a>").appendTo(td);
+tool[0].onclick=eval(opts.tools[i].handler||function(){
+});
+tool.linkbutton($.extend({},opts.tools[i],{plain:true}));
+}
+}
+}else{
+_355.children("div.tabs-tool").remove();
+}
+};
+function _357(_358,_359){
+var _35a=$.data(_358,"tabs");
+var opts=_35a.options;
+var cc=$(_358);
+if(!opts.doSize){
+return;
+}
+if(_359){
+$.extend(opts,{width:_359.width,height:_359.height});
+}
+cc._size(opts);
+var _35b=cc.children("div.tabs-header");
+var _35c=cc.children("div.tabs-panels");
+var wrap=_35b.find("div.tabs-wrap");
+var ul=wrap.find(".tabs");
+ul.children("li").removeClass("tabs-first tabs-last");
+ul.children("li:first").addClass("tabs-first");
+ul.children("li:last").addClass("tabs-last");
+if(opts.tabPosition=="left"||opts.tabPosition=="right"){
+_35b._outerWidth(opts.showHeader?opts.headerWidth:0);
+_35c._outerWidth(cc.width()-_35b.outerWidth());
+_35b.add(_35c)._size("height",isNaN(parseInt(opts.height))?"":cc.height());
+wrap._outerWidth(_35b.width());
+ul._outerWidth(wrap.width()).css("height","");
+}else{
+_35b.children("div.tabs-scroller-left,div.tabs-scroller-right,div.tabs-tool:not(.tabs-tool-hidden)").css("display",opts.showHeader?"block":"none");
+_35b._outerWidth(cc.width()).css("height","");
+if(opts.showHeader){
+_35b.css("background-color","");
+wrap.css("height","");
+}else{
+_35b.css("background-color","transparent");
+_35b._outerHeight(0);
+wrap._outerHeight(0);
+}
+ul._outerHeight(opts.tabHeight).css("width","");
+ul._outerHeight(ul.outerHeight()-ul.height()-1+opts.tabHeight).css("width","");
+_35c._size("height",isNaN(parseInt(opts.height))?"":(cc.height()-_35b.outerHeight()));
+_35c._size("width",cc.width());
+}
+if(_35a.tabs.length){
+var d1=ul.outerWidth(true)-ul.width();
+var li=ul.children("li:first");
+var d2=li.outerWidth(true)-li.width();
+var _35d=_35b.width()-_35b.children(".tabs-tool:not(.tabs-tool-hidden)")._outerWidth();
+var _35e=Math.floor((_35d-d1-d2*_35a.tabs.length)/_35a.tabs.length);
+$.map(_35a.tabs,function(p){
+_35f(p,(opts.justified&&$.inArray(opts.tabPosition,["top","bottom"])>=0)?_35e:undefined);
+});
+if(opts.justified&&$.inArray(opts.tabPosition,["top","bottom"])>=0){
+var _360=_35d-d1-_348(ul);
+_35f(_35a.tabs[_35a.tabs.length-1],_35e+_360);
+}
+}
+_349(_358);
+function _35f(p,_361){
+var _362=p.panel("options");
+var p_t=_362.tab.find(".tabs-inner");
+var _361=_361?_361:(parseInt(_362.tabWidth||opts.tabWidth||undefined));
+if(_361){
+p_t._outerWidth(_361);
+}else{
+p_t.css("width","");
+}
+p_t._outerHeight(opts.tabHeight);
+p_t.css("lineHeight",p_t.height()+"px");
+p_t.find(".easyui-fluid:visible").triggerHandler("_resize");
+};
+};
+function _363(_364){
+var opts=$.data(_364,"tabs").options;
+var tab=_365(_364);
+if(tab){
+var _366=$(_364).children("div.tabs-panels");
+var _367=opts.width=="auto"?"auto":_366.width();
+var _368=opts.height=="auto"?"auto":_366.height();
+tab.panel("resize",{width:_367,height:_368});
+}
+};
+function _369(_36a){
+var tabs=$.data(_36a,"tabs").tabs;
+var cc=$(_36a).addClass("tabs-container");
+var _36b=$("<div class=\"tabs-panels\"></div>").insertBefore(cc);
+cc.children("div").each(function(){
+_36b[0].appendChild(this);
+});
+cc[0].appendChild(_36b[0]);
+$("<div class=\"tabs-header\">"+"<div class=\"tabs-scroller-left\"></div>"+"<div class=\"tabs-scroller-right\"></div>"+"<div class=\"tabs-wrap\">"+"<ul class=\"tabs\"></ul>"+"</div>"+"</div>").prependTo(_36a);
+cc.children("div.tabs-panels").children("div").each(function(i){
+var opts=$.extend({},$.parser.parseOptions(this),{disabled:($(this).attr("disabled")?true:undefined),selected:($(this).attr("selected")?true:undefined)});
+_378(_36a,opts,$(this));
+});
+cc.children("div.tabs-header").find(".tabs-scroller-left, .tabs-scroller-right")._bind("mouseenter",function(){
+$(this).addClass("tabs-scroller-over");
+})._bind("mouseleave",function(){
+$(this).removeClass("tabs-scroller-over");
+});
+cc._bind("_resize",function(e,_36c){
+if($(this).hasClass("easyui-fluid")||_36c){
+_357(_36a);
+_363(_36a);
+}
+return false;
+});
+};
+function _36d(_36e){
+var _36f=$.data(_36e,"tabs");
+var opts=_36f.options;
+$(_36e).children("div.tabs-header")._unbind()._bind("click",function(e){
+if($(e.target).hasClass("tabs-scroller-left")){
+$(_36e).tabs("scrollBy",-opts.scrollIncrement);
+}else{
+if($(e.target).hasClass("tabs-scroller-right")){
+$(_36e).tabs("scrollBy",opts.scrollIncrement);
+}else{
+var li=$(e.target).closest("li");
+if(li.hasClass("tabs-disabled")){
+return false;
+}
+var a=$(e.target).closest(".tabs-close");
+if(a.length){
+_392(_36e,_370(li));
+}else{
+if(li.length){
+var _371=_370(li);
+var _372=_36f.tabs[_371].panel("options");
+if(_372.collapsible){
+_372.closed?_389(_36e,_371):_3a9(_36e,_371);
+}else{
+_389(_36e,_371);
+}
+}
+}
+return false;
+}
+}
+})._bind("contextmenu",function(e){
+var li=$(e.target).closest("li");
+if(li.hasClass("tabs-disabled")){
+return;
+}
+if(li.length){
+opts.onContextMenu.call(_36e,e,li.find("span.tabs-title").html(),_370(li));
+}
+});
+function _370(li){
+var _373=0;
+li.parent().children("li").each(function(i){
+if(li[0]==this){
+_373=i;
+return false;
+}
+});
+return _373;
+};
+};
+function _374(_375){
+var opts=$.data(_375,"tabs").options;
+var _376=$(_375).children("div.tabs-header");
+var _377=$(_375).children("div.tabs-panels");
+_376.removeClass("tabs-header-top tabs-header-bottom tabs-header-left tabs-header-right");
+_377.removeClass("tabs-panels-top tabs-panels-bottom tabs-panels-left tabs-panels-right");
+if(opts.tabPosition=="top"){
+_376.insertBefore(_377);
+}else{
+if(opts.tabPosition=="bottom"){
+_376.insertAfter(_377);
+_376.addClass("tabs-header-bottom");
+_377.addClass("tabs-panels-top");
+}else{
+if(opts.tabPosition=="left"){
+_376.addClass("tabs-header-left");
+_377.addClass("tabs-panels-right");
+}else{
+if(opts.tabPosition=="right"){
+_376.addClass("tabs-header-right");
+_377.addClass("tabs-panels-left");
+}
+}
+}
+}
+if(opts.plain==true){
+_376.addClass("tabs-header-plain");
+}else{
+_376.removeClass("tabs-header-plain");
+}
+_376.removeClass("tabs-header-narrow").addClass(opts.narrow?"tabs-header-narrow":"");
+var tabs=_376.find(".tabs");
+tabs.removeClass("tabs-pill").addClass(opts.pill?"tabs-pill":"");
+tabs.removeClass("tabs-narrow").addClass(opts.narrow?"tabs-narrow":"");
+tabs.removeClass("tabs-justified").addClass(opts.justified?"tabs-justified":"");
+if(opts.border==true){
+_376.removeClass("tabs-header-noborder");
+_377.removeClass("tabs-panels-noborder");
+}else{
+_376.addClass("tabs-header-noborder");
+_377.addClass("tabs-panels-noborder");
+}
+opts.doSize=true;
+};
+function _378(_379,_37a,pp){
+_37a=_37a||{};
+var _37b=$.data(_379,"tabs");
+var tabs=_37b.tabs;
+if(_37a.index==undefined||_37a.index>tabs.length){
+_37a.index=tabs.length;
+}
+if(_37a.index<0){
+_37a.index=0;
+}
+var ul=$(_379).children("div.tabs-header").find("ul.tabs");
+var _37c=$(_379).children("div.tabs-panels");
+var tab=$("<li>"+"<span class=\"tabs-inner\">"+"<span class=\"tabs-title\"></span>"+"<span class=\"tabs-icon\"></span>"+"</span>"+"</li>");
+if(!pp){
+pp=$("<div></div>");
+}
+if(_37a.index>=tabs.length){
+tab.appendTo(ul);
+pp.appendTo(_37c);
+tabs.push(pp);
+}else{
+tab.insertBefore(ul.children("li:eq("+_37a.index+")"));
+pp.insertBefore(_37c.children("div.panel:eq("+_37a.index+")"));
+tabs.splice(_37a.index,0,pp);
+}
+pp.panel($.extend({},_37a,{tab:tab,border:false,noheader:true,closed:true,doSize:false,iconCls:(_37a.icon?_37a.icon:undefined),onLoad:function(){
+if(_37a.onLoad){
+_37a.onLoad.apply(this,arguments);
+}
+_37b.options.onLoad.call(_379,$(this));
+},onBeforeOpen:function(){
+if(_37a.onBeforeOpen){
+if(_37a.onBeforeOpen.call(this)==false){
+return false;
+}
+}
+var p=$(_379).tabs("getSelected");
+if(p){
+if(p[0]!=this){
+$(_379).tabs("unselect",_384(_379,p));
+p=$(_379).tabs("getSelected");
+if(p){
+return false;
+}
+}else{
+_363(_379);
+return false;
+}
+}
+var _37d=$(this).panel("options");
+_37d.tab.addClass("tabs-selected");
+var wrap=$(_379).find(">div.tabs-header>div.tabs-wrap");
+var left=_37d.tab.position().left;
+var _37e=left+_37d.tab.outerWidth();
+if(left<0||_37e>wrap.width()){
+var _37f=left-(wrap.width()-_37d.tab.width())/2;
+$(_379).tabs("scrollBy",_37f);
+}else{
+$(_379).tabs("scrollBy",0);
+}
+var _380=$(this).panel("panel");
+_380.css("display","block");
+_363(_379);
+_380.css("display","none");
+},onOpen:function(){
+if(_37a.onOpen){
+_37a.onOpen.call(this);
+}
+var _381=$(this).panel("options");
+var _382=_384(_379,this);
+_37b.selectHis.push(_382);
+_37b.options.onSelect.call(_379,_381.title,_382);
+},onBeforeClose:function(){
+if(_37a.onBeforeClose){
+if(_37a.onBeforeClose.call(this)==false){
+return false;
+}
+}
+$(this).panel("options").tab.removeClass("tabs-selected");
+},onClose:function(){
+if(_37a.onClose){
+_37a.onClose.call(this);
+}
+var _383=$(this).panel("options");
+_37b.options.onUnselect.call(_379,_383.title,_384(_379,this));
+}}));
+$(_379).tabs("update",{tab:pp,options:pp.panel("options"),type:"header"});
+};
+function _385(_386,_387){
+var _388=$.data(_386,"tabs");
+var opts=_388.options;
+if(_387.selected==undefined){
+_387.selected=true;
+}
+_378(_386,_387);
+opts.onAdd.call(_386,_387.title,_387.index);
+if(_387.selected){
+_389(_386,_387.index);
+}
+};
+function _38a(_38b,_38c){
+_38c.type=_38c.type||"all";
+var _38d=$.data(_38b,"tabs").selectHis;
+var pp=_38c.tab;
+var opts=pp.panel("options");
+var _38e=opts.title;
+$.extend(opts,_38c.options,{iconCls:(_38c.options.icon?_38c.options.icon:undefined)});
+if(_38c.type=="all"||_38c.type=="body"){
+pp.panel();
+}
+if(_38c.type=="all"||_38c.type=="header"){
+var tab=opts.tab;
+if(opts.header){
+tab.find(".tabs-inner").html($(opts.header));
+}else{
+var _38f=tab.find("span.tabs-title");
+var _390=tab.find("span.tabs-icon");
+_38f.html(opts.title);
+_390.attr("class","tabs-icon");
+tab.find(".tabs-close").remove();
+if(opts.closable){
+_38f.addClass("tabs-closable");
+$("<span class=\"tabs-close\"></span>").appendTo(tab);
+}else{
+_38f.removeClass("tabs-closable");
+}
+if(opts.iconCls){
+_38f.addClass("tabs-with-icon");
+_390.addClass(opts.iconCls);
+}else{
+_38f.removeClass("tabs-with-icon");
+}
+if(opts.tools){
+var _391=tab.find("span.tabs-p-tool");
+if(!_391.length){
+var _391=$("<span class=\"tabs-p-tool\"></span>").insertAfter(tab.find(".tabs-inner"));
+}
+if($.isArray(opts.tools)){
+_391.empty();
+for(var i=0;i<opts.tools.length;i++){
+var t=$("<a href=\"javascript:;\"></a>").appendTo(_391);
+t.addClass(opts.tools[i].iconCls);
+if(opts.tools[i].handler){
+t._bind("click",{handler:opts.tools[i].handler},function(e){
+if($(this).parents("li").hasClass("tabs-disabled")){
+return;
+}
+e.data.handler.call(this);
+});
+}
+}
+}else{
+$(opts.tools).children().appendTo(_391);
+}
+var pr=_391.children().length*12;
+if(opts.closable){
+pr+=8;
+_391.css("right","");
+}else{
+pr-=3;
+_391.css("right","5px");
+}
+_38f.css("padding-right",pr+"px");
+}else{
+tab.find("span.tabs-p-tool").remove();
+_38f.css("padding-right","");
+}
+}
+}
+if(opts.disabled){
+opts.tab.addClass("tabs-disabled");
+}else{
+opts.tab.removeClass("tabs-disabled");
+}
+_357(_38b);
+$.data(_38b,"tabs").options.onUpdate.call(_38b,opts.title,_384(_38b,pp));
+};
+function _392(_393,_394){
+var _395=$.data(_393,"tabs");
+var opts=_395.options;
+var tabs=_395.tabs;
+var _396=_395.selectHis;
+if(!_397(_393,_394)){
+return;
+}
+var tab=_398(_393,_394);
+var _399=tab.panel("options").title;
+var _39a=_384(_393,tab);
+if(opts.onBeforeClose.call(_393,_399,_39a)==false){
+return;
+}
+var tab=_398(_393,_394,true);
+tab.panel("options").tab.remove();
+tab.panel("destroy");
+opts.onClose.call(_393,_399,_39a);
+_357(_393);
+var his=[];
+for(var i=0;i<_396.length;i++){
+var _39b=_396[i];
+if(_39b!=_39a){
+his.push(_39b>_39a?_39b-1:_39b);
+}
+}
+_395.selectHis=his;
+var _39c=$(_393).tabs("getSelected");
+if(!_39c&&his.length){
+_39a=_395.selectHis.pop();
+$(_393).tabs("select",_39a);
+}
+};
+function _398(_39d,_39e,_39f){
+var tabs=$.data(_39d,"tabs").tabs;
+var tab=null;
+if(typeof _39e=="number"){
+if(_39e>=0&&_39e<tabs.length){
+tab=tabs[_39e];
+if(_39f){
+tabs.splice(_39e,1);
+}
+}
+}else{
+var tmp=$("<span></span>");
+for(var i=0;i<tabs.length;i++){
+var p=tabs[i];
+tmp.html(p.panel("options").title);
+var _3a0=tmp.text();
+tmp.html(_39e);
+_39e=tmp.text();
+if(_3a0==_39e){
+tab=p;
+if(_39f){
+tabs.splice(i,1);
+}
+break;
+}
+}
+tmp.remove();
+}
+return tab;
+};
+function _384(_3a1,tab){
+var tabs=$.data(_3a1,"tabs").tabs;
+for(var i=0;i<tabs.length;i++){
+if(tabs[i][0]==$(tab)[0]){
+return i;
+}
+}
+return -1;
+};
+function _365(_3a2){
+var tabs=$.data(_3a2,"tabs").tabs;
+for(var i=0;i<tabs.length;i++){
+var tab=tabs[i];
+if(tab.panel("options").tab.hasClass("tabs-selected")){
+return tab;
+}
+}
+return null;
+};
+function _3a3(_3a4){
+var _3a5=$.data(_3a4,"tabs");
+var tabs=_3a5.tabs;
+for(var i=0;i<tabs.length;i++){
+var opts=tabs[i].panel("options");
+if(opts.selected&&!opts.disabled){
+_389(_3a4,i);
+return;
+}
+}
+_389(_3a4,_3a5.options.selected);
+};
+function _389(_3a6,_3a7){
+var p=_398(_3a6,_3a7);
+if(p&&!p.is(":visible")){
+_3a8(_3a6);
+if(!p.panel("options").disabled){
+p.panel("open");
+}
+}
+};
+function _3a9(_3aa,_3ab){
+var p=_398(_3aa,_3ab);
+if(p&&p.is(":visible")){
+_3a8(_3aa);
+p.panel("close");
+}
+};
+function _3a8(_3ac){
+$(_3ac).children("div.tabs-panels").each(function(){
+$(this).stop(true,true);
+});
+};
+function _397(_3ad,_3ae){
+return _398(_3ad,_3ae)!=null;
+};
+function _3af(_3b0,_3b1){
+var opts=$.data(_3b0,"tabs").options;
+opts.showHeader=_3b1;
+$(_3b0).tabs("resize");
+};
+function _3b2(_3b3,_3b4){
+var tool=$(_3b3).find(">.tabs-header>.tabs-tool");
+if(_3b4){
+tool.removeClass("tabs-tool-hidden").show();
+}else{
+tool.addClass("tabs-tool-hidden").hide();
+}
+$(_3b3).tabs("resize").tabs("scrollBy",0);
+};
+$.fn.tabs=function(_3b5,_3b6){
+if(typeof _3b5=="string"){
+return $.fn.tabs.methods[_3b5](this,_3b6);
+}
+_3b5=_3b5||{};
+return this.each(function(){
+var _3b7=$.data(this,"tabs");
+if(_3b7){
+$.extend(_3b7.options,_3b5);
+}else{
+$.data(this,"tabs",{options:$.extend({},$.fn.tabs.defaults,$.fn.tabs.parseOptions(this),_3b5),tabs:[],selectHis:[]});
+_369(this);
+}
+_353(this);
+_374(this);
+_357(this);
+_36d(this);
+_3a3(this);
+});
+};
+$.fn.tabs.methods={options:function(jq){
+var cc=jq[0];
+var opts=$.data(cc,"tabs").options;
+var s=_365(cc);
+opts.selected=s?_384(cc,s):-1;
+return opts;
+},tabs:function(jq){
+return $.data(jq[0],"tabs").tabs;
+},resize:function(jq,_3b8){
+return jq.each(function(){
+_357(this,_3b8);
+_363(this);
+});
+},add:function(jq,_3b9){
+return jq.each(function(){
+_385(this,_3b9);
+});
+},close:function(jq,_3ba){
+return jq.each(function(){
+_392(this,_3ba);
+});
+},getTab:function(jq,_3bb){
+return _398(jq[0],_3bb);
+},getTabIndex:function(jq,tab){
+return _384(jq[0],tab);
+},getSelected:function(jq){
+return _365(jq[0]);
+},select:function(jq,_3bc){
+return jq.each(function(){
+_389(this,_3bc);
+});
+},unselect:function(jq,_3bd){
+return jq.each(function(){
+_3a9(this,_3bd);
+});
+},exists:function(jq,_3be){
+return _397(jq[0],_3be);
+},update:function(jq,_3bf){
+return jq.each(function(){
+_38a(this,_3bf);
+});
+},enableTab:function(jq,_3c0){
+return jq.each(function(){
+var opts=$(this).tabs("getTab",_3c0).panel("options");
+opts.tab.removeClass("tabs-disabled");
+opts.disabled=false;
+});
+},disableTab:function(jq,_3c1){
+return jq.each(function(){
+var opts=$(this).tabs("getTab",_3c1).panel("options");
+opts.tab.addClass("tabs-disabled");
+opts.disabled=true;
+});
+},showHeader:function(jq){
+return jq.each(function(){
+_3af(this,true);
+});
+},hideHeader:function(jq){
+return jq.each(function(){
+_3af(this,false);
+});
+},showTool:function(jq){
+return jq.each(function(){
+_3b2(this,true);
+});
+},hideTool:function(jq){
+return jq.each(function(){
+_3b2(this,false);
+});
+},scrollBy:function(jq,_3c2){
+return jq.each(function(){
+var opts=$(this).tabs("options");
+var wrap=$(this).find(">div.tabs-header>div.tabs-wrap");
+var pos=Math.min(wrap._scrollLeft()+_3c2,_3c3());
+wrap.animate({scrollLeft:pos},opts.scrollDuration);
+function _3c3(){
+var w=0;
+var ul=wrap.children("ul");
+ul.children("li").each(function(){
+w+=$(this).outerWidth(true);
+});
+return w-wrap.width()+(ul.outerWidth()-ul.width());
+};
+});
+}};
+$.fn.tabs.parseOptions=function(_3c4){
+return $.extend({},$.parser.parseOptions(_3c4,["tools","toolPosition","tabPosition",{fit:"boolean",border:"boolean",plain:"boolean"},{headerWidth:"number",tabWidth:"number",tabHeight:"number",selected:"number"},{showHeader:"boolean",justified:"boolean",narrow:"boolean",pill:"boolean"}]));
+};
+$.fn.tabs.defaults={width:"auto",height:"auto",headerWidth:150,tabWidth:"auto",tabHeight:32,selected:0,showHeader:true,plain:false,fit:false,border:true,justified:false,narrow:false,pill:false,tools:null,toolPosition:"right",tabPosition:"top",scrollIncrement:100,scrollDuration:400,onLoad:function(_3c5){
+},onSelect:function(_3c6,_3c7){
+},onUnselect:function(_3c8,_3c9){
+},onBeforeClose:function(_3ca,_3cb){
+},onClose:function(_3cc,_3cd){
+},onAdd:function(_3ce,_3cf){
+},onUpdate:function(_3d0,_3d1){
+},onContextMenu:function(e,_3d2,_3d3){
+}};
+})(jQuery);
+(function($){
+var _3d4=false;
+function _3d5(_3d6,_3d7){
+var _3d8=$.data(_3d6,"layout");
+var opts=_3d8.options;
+var _3d9=_3d8.panels;
+var cc=$(_3d6);
+if(_3d7){
+$.extend(opts,{width:_3d7.width,height:_3d7.height});
+}
+if(_3d6.tagName.toLowerCase()=="body"){
+cc._size("fit");
+}else{
+cc._size(opts);
+}
+var cpos={top:0,left:0,width:cc.width(),height:cc.height()};
+_3da(_3db(_3d9.expandNorth)?_3d9.expandNorth:_3d9.north,"n");
+_3da(_3db(_3d9.expandSouth)?_3d9.expandSouth:_3d9.south,"s");
+_3dc(_3db(_3d9.expandEast)?_3d9.expandEast:_3d9.east,"e");
+_3dc(_3db(_3d9.expandWest)?_3d9.expandWest:_3d9.west,"w");
+_3d9.center.panel("resize",cpos);
+function _3da(pp,type){
+if(!pp.length||!_3db(pp)){
+return;
+}
+var opts=pp.panel("options");
+pp.panel("resize",{width:cc.width(),height:opts.height});
+var _3dd=pp.panel("panel").outerHeight();
+pp.panel("move",{left:0,top:(type=="n"?0:cc.height()-_3dd)});
+cpos.height-=_3dd;
+if(type=="n"){
+cpos.top+=_3dd;
+if(!opts.split&&opts.border){
+cpos.top--;
+}
+}
+if(!opts.split&&opts.border){
+cpos.height++;
+}
+};
+function _3dc(pp,type){
+if(!pp.length||!_3db(pp)){
+return;
+}
+var opts=pp.panel("options");
+pp.panel("resize",{width:opts.width,height:cpos.height});
+var _3de=pp.panel("panel").outerWidth();
+pp.panel("move",{left:(type=="e"?cc.width()-_3de:0),top:cpos.top});
+cpos.width-=_3de;
+if(type=="w"){
+cpos.left+=_3de;
+if(!opts.split&&opts.border){
+cpos.left--;
+}
+}
+if(!opts.split&&opts.border){
+cpos.width++;
+}
+};
+};
+function init(_3df){
+var cc=$(_3df);
+cc.addClass("layout");
+function _3e0(el){
+var _3e1=$.fn.layout.parsePanelOptions(el);
+if("north,south,east,west,center".indexOf(_3e1.region)>=0){
+_3e4(_3df,_3e1,el);
+}
+};
+var opts=cc.layout("options");
+var _3e2=opts.onAdd;
+opts.onAdd=function(){
+};
+cc.find(">div,>form>div").each(function(){
+_3e0(this);
+});
+opts.onAdd=_3e2;
+cc.append("<div class=\"layout-split-proxy-h\"></div><div class=\"layout-split-proxy-v\"></div>");
+cc._bind("_resize",function(e,_3e3){
+if($(this).hasClass("easyui-fluid")||_3e3){
+_3d5(_3df);
+}
+return false;
+});
+};
+function _3e4(_3e5,_3e6,el){
+_3e6.region=_3e6.region||"center";
+var _3e7=$.data(_3e5,"layout").panels;
+var cc=$(_3e5);
+var dir=_3e6.region;
+if(_3e7[dir].length){
+return;
+}
+var pp=$(el);
+if(!pp.length){
+pp=$("<div></div>").appendTo(cc);
+}
+var _3e8=$.extend({},$.fn.layout.paneldefaults,{width:(pp.length?parseInt(pp[0].style.width)||pp.outerWidth():"auto"),height:(pp.length?parseInt(pp[0].style.height)||pp.outerHeight():"auto"),doSize:false,collapsible:true,onOpen:function(){
+var tool=$(this).panel("header").children("div.panel-tool");
+tool.children("a.panel-tool-collapse").hide();
+var _3e9={north:"up",south:"down",east:"right",west:"left"};
+if(!_3e9[dir]){
+return;
+}
+var _3ea="layout-button-"+_3e9[dir];
+var t=tool.children("a."+_3ea);
+if(!t.length){
+t=$("<a href=\"javascript:;\"></a>").addClass(_3ea).appendTo(tool);
+t._bind("click",{dir:dir},function(e){
+_401(_3e5,e.data.dir);
+return false;
+});
+}
+$(this).panel("options").collapsible?t.show():t.hide();
+}},_3e6,{cls:((_3e6.cls||"")+" layout-panel layout-panel-"+dir),bodyCls:((_3e6.bodyCls||"")+" layout-body")});
+pp.panel(_3e8);
+_3e7[dir]=pp;
+var _3eb={north:"s",south:"n",east:"w",west:"e"};
+var _3ec=pp.panel("panel");
+if(pp.panel("options").split){
+_3ec.addClass("layout-split-"+dir);
+}
+_3ec.resizable($.extend({},{handles:(_3eb[dir]||""),disabled:(!pp.panel("options").split),onStartResize:function(e){
+_3d4=true;
+if(dir=="north"||dir=="south"){
+var _3ed=$(">div.layout-split-proxy-v",_3e5);
+}else{
+var _3ed=$(">div.layout-split-proxy-h",_3e5);
+}
+var top=0,left=0,_3ee=0,_3ef=0;
+var pos={display:"block"};
+if(dir=="north"){
+pos.top=parseInt(_3ec.css("top"))+_3ec.outerHeight()-_3ed.height();
+pos.left=parseInt(_3ec.css("left"));
+pos.width=_3ec.outerWidth();
+pos.height=_3ed.height();
+}else{
+if(dir=="south"){
+pos.top=parseInt(_3ec.css("top"));
+pos.left=parseInt(_3ec.css("left"));
+pos.width=_3ec.outerWidth();
+pos.height=_3ed.height();
+}else{
+if(dir=="east"){
+pos.top=parseInt(_3ec.css("top"))||0;
+pos.left=parseInt(_3ec.css("left"))||0;
+pos.width=_3ed.width();
+pos.height=_3ec.outerHeight();
+}else{
+if(dir=="west"){
+pos.top=parseInt(_3ec.css("top"))||0;
+pos.left=_3ec.outerWidth()-_3ed.width();
+pos.width=_3ed.width();
+pos.height=_3ec.outerHeight();
+}
+}
+}
+}
+_3ed.css(pos);
+$("<div class=\"layout-mask\"></div>").css({left:0,top:0,width:cc.width(),height:cc.height()}).appendTo(cc);
+},onResize:function(e){
+if(dir=="north"||dir=="south"){
+var _3f0=_3f1(this);
+$(this).resizable("options").maxHeight=_3f0;
+var _3f2=$(">div.layout-split-proxy-v",_3e5);
+var top=dir=="north"?e.data.height-_3f2.height():$(_3e5).height()-e.data.height;
+_3f2.css("top",top);
+}else{
+var _3f3=_3f1(this);
+$(this).resizable("options").maxWidth=_3f3;
+var _3f2=$(">div.layout-split-proxy-h",_3e5);
+var left=dir=="west"?e.data.width-_3f2.width():$(_3e5).width()-e.data.width;
+_3f2.css("left",left);
+}
+return false;
+},onStopResize:function(e){
+cc.children("div.layout-split-proxy-v,div.layout-split-proxy-h").hide();
+pp.panel("resize",e.data);
+_3d5(_3e5);
+_3d4=false;
+cc.find(">div.layout-mask").remove();
+}},_3e6));
+cc.layout("options").onAdd.call(_3e5,dir);
+function _3f1(p){
+var _3f4="expand"+dir.substring(0,1).toUpperCase()+dir.substring(1);
+var _3f5=_3e7["center"];
+var _3f6=(dir=="north"||dir=="south")?"minHeight":"minWidth";
+var _3f7=(dir=="north"||dir=="south")?"maxHeight":"maxWidth";
+var _3f8=(dir=="north"||dir=="south")?"_outerHeight":"_outerWidth";
+var _3f9=$.parser.parseValue(_3f7,_3e7[dir].panel("options")[_3f7],$(_3e5));
+var _3fa=$.parser.parseValue(_3f6,_3f5.panel("options")[_3f6],$(_3e5));
+var _3fb=_3f5.panel("panel")[_3f8]()-_3fa;
+if(_3db(_3e7[_3f4])){
+_3fb+=_3e7[_3f4][_3f8]()-1;
+}else{
+_3fb+=$(p)[_3f8]();
+}
+if(_3fb>_3f9){
+_3fb=_3f9;
+}
+return _3fb;
+};
+};
+function _3fc(_3fd,_3fe){
+var _3ff=$.data(_3fd,"layout").panels;
+if(_3ff[_3fe].length){
+_3ff[_3fe].panel("destroy");
+_3ff[_3fe]=$();
+var _400="expand"+_3fe.substring(0,1).toUpperCase()+_3fe.substring(1);
+if(_3ff[_400]){
+_3ff[_400].panel("destroy");
+_3ff[_400]=undefined;
+}
+$(_3fd).layout("options").onRemove.call(_3fd,_3fe);
+}
+};
+function _401(_402,_403,_404){
+if(_404==undefined){
+_404="normal";
+}
+var _405=$.data(_402,"layout");
+var _406=_405.panels;
+var p=_406[_403];
+var _407=p.panel("options");
+if(_407.onBeforeCollapse.call(p)==false){
+return;
+}
+var _408="expand"+_403.substring(0,1).toUpperCase()+_403.substring(1);
+if(!_406[_408]){
+_406[_408]=_409(_403);
+var ep=_406[_408].panel("panel");
+if(!_407.expandMode){
+ep.css("cursor","default");
+}else{
+ep._bind("click",function(){
+if(_407.expandMode=="dock"){
+_416(_402,_403);
+}else{
+p.panel("expand",false).panel("open");
+var _40a=_40b();
+p.panel("resize",_40a.collapse);
+p.panel("panel")._unbind(".layout")._bind("mouseleave.layout",{region:_403},function(e){
+var that=this;
+_405.collapseTimer=setTimeout(function(){
+$(that).stop(true,true);
+if(_3d4==true){
+return;
+}
+if($("body>div.combo-p>div.combo-panel:visible").length){
+return;
+}
+_401(_402,e.data.region);
+},_405.options.collapseDelay);
+});
+p.panel("panel").animate(_40a.expand,function(){
+$(_402).layout("options").onExpand.call(_402,_403);
+});
+}
+return false;
+});
+}
+}
+var _40c=_40b();
+if(!_3db(_406[_408])){
+_406.center.panel("resize",_40c.resizeC);
+}
+p.panel("panel").animate(_40c.collapse,_404,function(){
+p.panel("collapse",false).panel("close");
+_406[_408].panel("open").panel("resize",_40c.expandP);
+$(this)._unbind(".layout");
+$(_402).layout("options").onCollapse.call(_402,_403);
+});
+function _409(dir){
+var _40d={"east":"left","west":"right","north":"down","south":"up"};
+var isns=(_407.region=="north"||_407.region=="south");
+var icon="layout-button-"+_40d[dir];
+var p=$("<div></div>").appendTo(_402);
+var panelTitle=' ';
+var header=$('.layout-panel-'+dir+' .panel-title',_402);
+if(header && isns){
+    panelTitle=header.html()
+}
+p.panel($.extend({},$.fn.layout.paneldefaults,{cls:("layout-expand layout-expand-"+dir),title:panelTitle,titleDirection:_407.titleDirection,iconCls:(_407.hideCollapsedContent?null:_407.iconCls),closed:true,minWidth:0,minHeight:0,doSize:false,region:_407.region,collapsedSize:_407.collapsedSize,noheader:(!isns&&_407.hideExpandTool),tools:((isns&&_407.hideExpandTool)?null:[{iconCls:icon,handler:function(){
+_416(_402,_403);
+return false;
+}}]),onResize:function(){
+var _40e=$(this).children(".layout-expand-title");
+if(_40e.length){
+var icon=$(this).children(".panel-icon");
+var _40f=icon.length>0?(icon._outerHeight()+2):0;
+_40e._outerWidth($(this).height()-_40f);
+var left=($(this).width()-Math.min(_40e._outerWidth(),_40e._outerHeight()))/2;
+var top=Math.max(_40e._outerWidth(),_40e._outerHeight());
+if(_40e.hasClass("layout-expand-title-down")){
+left+=Math.min(_40e._outerWidth(),_40e._outerHeight());
+top=0;
+}
+top+=_40f;
+_40e.css({left:(left+"px"),top:(top+"px")});
+}
+}}));
+if(!_407.hideCollapsedContent){
+var _410=typeof _407.collapsedContent=="function"?_407.collapsedContent.call(p[0],_407.title):_407.collapsedContent;
+isns?p.panel("setTitle",_410):p.html(_410);
+}
+p.panel("panel").hover(function(){
+$(this).addClass("layout-expand-over");
+},function(){
+$(this).removeClass("layout-expand-over");
+});
+return p;
+};
+function _40b(){
+var cc=$(_402);
+var _411=_406.center.panel("options");
+var _412=_407.collapsedSize;
+if(_403=="east"){
+var _413=p.panel("panel")._outerWidth();
+var _414=_411.width+_413-_412;
+if(_407.split||!_407.border){
+_414++;
+}
+return {resizeC:{width:_414},expand:{left:cc.width()-_413},expandP:{top:_411.top,left:cc.width()-_412,width:_412,height:_411.height},collapse:{left:cc.width(),top:_411.top,height:_411.height}};
+}else{
+if(_403=="west"){
+var _413=p.panel("panel")._outerWidth();
+var _414=_411.width+_413-_412;
+if(_407.split||!_407.border){
+_414++;
+}
+return {resizeC:{width:_414,left:_412-1},expand:{left:0},expandP:{left:0,top:_411.top,width:_412,height:_411.height},collapse:{left:-_413,top:_411.top,height:_411.height}};
+}else{
+if(_403=="north"){
+var _415=p.panel("panel")._outerHeight();
+var hh=_411.height;
+if(!_3db(_406.expandNorth)){
+hh+=_415-_412+((_407.split||!_407.border)?1:0);
+}
+_406.east.add(_406.west).add(_406.expandEast).add(_406.expandWest).panel("resize",{top:_412-1,height:hh});
+return {resizeC:{top:_412-1,height:hh},expand:{top:0},expandP:{top:0,left:0,width:cc.width(),height:_412},collapse:{top:-_415,width:cc.width()}};
+}else{
+if(_403=="south"){
+var _415=p.panel("panel")._outerHeight();
+var hh=_411.height;
+if(!_3db(_406.expandSouth)){
+hh+=_415-_412+((_407.split||!_407.border)?1:0);
+}
+_406.east.add(_406.west).add(_406.expandEast).add(_406.expandWest).panel("resize",{height:hh});
+return {resizeC:{height:hh},expand:{top:cc.height()-_415},expandP:{top:cc.height()-_412,left:0,width:cc.width(),height:_412},collapse:{top:cc.height(),width:cc.width()}};
+}
+}
+}
+}
+};
+};
+function _416(_417,_418){
+var _419=$.data(_417,"layout").panels;
+var p=_419[_418];
+var _41a=p.panel("options");
+if(_41a.onBeforeExpand.call(p)==false){
+return;
+}
+var _41b="expand"+_418.substring(0,1).toUpperCase()+_418.substring(1);
+if(_419[_41b]){
+_419[_41b].panel("close");
+p.panel("panel").stop(true,true);
+p.panel("expand",false).panel("open");
+var _41c=_41d();
+p.panel("resize",_41c.collapse);
+p.panel("panel").animate(_41c.expand,function(){
+_3d5(_417);
+$(_417).layout("options").onExpand.call(_417,_418);
+});
+}
+function _41d(){
+var cc=$(_417);
+var _41e=_419.center.panel("options");
+if(_418=="east"&&_419.expandEast){
+return {collapse:{left:cc.width(),top:_41e.top,height:_41e.height},expand:{left:cc.width()-p.panel("panel")._outerWidth()}};
+}else{
+if(_418=="west"&&_419.expandWest){
+return {collapse:{left:-p.panel("panel")._outerWidth(),top:_41e.top,height:_41e.height},expand:{left:0}};
+}else{
+if(_418=="north"&&_419.expandNorth){
+return {collapse:{top:-p.panel("panel")._outerHeight(),width:cc.width()},expand:{top:0}};
+}else{
+if(_418=="south"&&_419.expandSouth){
+return {collapse:{top:cc.height(),width:cc.width()},expand:{top:cc.height()-p.panel("panel")._outerHeight()}};
+}
+}
+}
+}
+};
+};
+function _3db(pp){
+if(!pp){
+return false;
+}
+if(pp.length){
+return pp.panel("panel").is(":visible");
+}else{
+return false;
+}
+};
+function _41f(_420){
+var _421=$.data(_420,"layout");
+var opts=_421.options;
+var _422=_421.panels;
+var _423=opts.onCollapse;
+opts.onCollapse=function(){
+};
+_424("east");
+_424("west");
+_424("north");
+_424("south");
+opts.onCollapse=_423;
+function _424(_425){
+var p=_422[_425];
+if(p.length&&p.panel("options").collapsed){
+_401(_420,_425,0);
+}
+};
+};
+function _426(_427,_428,_429){
+var p=$(_427).layout("panel",_428);
+p.panel("options").split=_429;
+var cls="layout-split-"+_428;
+var _42a=p.panel("panel").removeClass(cls);
+if(_429){
+_42a.addClass(cls);
+}
+_42a.resizable({disabled:(!_429)});
+_3d5(_427);
+};
+$.fn.layout=function(_42b,_42c){
+if(typeof _42b=="string"){
+return $.fn.layout.methods[_42b](this,_42c);
+}
+_42b=_42b||{};
+return this.each(function(){
+var _42d=$.data(this,"layout");
+if(_42d){
+$.extend(_42d.options,_42b);
+}else{
+var opts=$.extend({},$.fn.layout.defaults,$.fn.layout.parseOptions(this),_42b);
+$.data(this,"layout",{options:opts,panels:{center:$(),north:$(),south:$(),east:$(),west:$()}});
+init(this);
+}
+_3d5(this);
+_41f(this);
+});
+};
+$.fn.layout.methods={options:function(jq){
+return $.data(jq[0],"layout").options;
+},resize:function(jq,_42e){
+return jq.each(function(){
+_3d5(this,_42e);
+});
+},panel:function(jq,_42f){
+return $.data(jq[0],"layout").panels[_42f];
+},collapse:function(jq,_430){
+return jq.each(function(){
+_401(this,_430);
+});
+},expand:function(jq,_431){
+return jq.each(function(){
+_416(this,_431);
+});
+},add:function(jq,_432){
+return jq.each(function(){
+_3e4(this,_432);
+_3d5(this);
+if($(this).layout("panel",_432.region).panel("options").collapsed){
+_401(this,_432.region,0);
+}
+});
+},remove:function(jq,_433){
+return jq.each(function(){
+_3fc(this,_433);
+_3d5(this);
+});
+},split:function(jq,_434){
+return jq.each(function(){
+_426(this,_434,true);
+});
+},unsplit:function(jq,_435){
+return jq.each(function(){
+_426(this,_435,false);
+});
+},stopCollapsing:function(jq){
+return jq.each(function(){
+clearTimeout($(this).data("layout").collapseTimer);
+});
+}};
+$.fn.layout.parseOptions=function(_436){
+return $.extend({},$.parser.parseOptions(_436,[{fit:"boolean"}]));
+};
+$.fn.layout.defaults={fit:false,onExpand:function(_437){
+},onCollapse:function(_438){
+},onAdd:function(_439){
+},onRemove:function(_43a){
+}};
+$.fn.layout.parsePanelOptions=function(_43b){
+var t=$(_43b);
+return $.extend({},$.fn.panel.parseOptions(_43b),$.parser.parseOptions(_43b,["region",{split:"boolean",collpasedSize:"number",minWidth:"number",minHeight:"number",maxWidth:"number",maxHeight:"number"}]));
+};
+$.fn.layout.paneldefaults=$.extend({},$.fn.panel.defaults,{region:null,split:false,collapseDelay:100,collapsedSize:32,expandMode:"float",hideExpandTool:false,hideCollapsedContent:true,collapsedContent:function(_43c){
+var p=$(this);
+var opts=p.panel("options");
+if(opts.region=="north"||opts.region=="south"){
+return _43c;
+}
+var cc=[];
+if(opts.iconCls){
+cc.push("<div class=\"panel-icon "+opts.iconCls+"\"></div>");
+}
+cc.push("<div class=\"panel-title layout-expand-title");
+cc.push(" layout-expand-title-"+opts.titleDirection);
+cc.push(opts.iconCls?" layout-expand-with-icon":"");
+cc.push("\">");
+cc.push(_43c);
+cc.push("</div>");
+return cc.join("");
+},minWidth:10,minHeight:10,maxWidth:10000,maxHeight:10000});
+})(jQuery);
+(function($){
+$(function(){
+$(document)._unbind(".menu")._bind("mousedown.menu",function(e){
+var m=$(e.target).closest("div.menu,div.combo-p");
+if(m.length){
+return;
+}
+$("body>div.menu-top:visible").not(".menu-inline").menu("hide");
+_43d($("body>div.menu:visible").not(".menu-inline"));
+});
+});
+function init(_43e){
+var opts=$.data(_43e,"menu").options;
+$(_43e).addClass("menu-top");
+opts.inline?$(_43e).addClass("menu-inline"):$(_43e).appendTo("body");
+$(_43e)._bind("_resize",function(e,_43f){
+if($(this).hasClass("easyui-fluid")||_43f){
+$(_43e).menu("resize",_43e);
+}
+return false;
+});
+var _440=_441($(_43e));
+for(var i=0;i<_440.length;i++){
+_444(_43e,_440[i]);
+}
+function _441(menu){
+var _442=[];
+menu.addClass("menu");
+_442.push(menu);
+if(!menu.hasClass("menu-content")){
+menu.children("div").each(function(){
+var _443=$(this).children("div");
+if(_443.length){
+_443.appendTo("body");
+this.submenu=_443;
+var mm=_441(_443);
+_442=_442.concat(mm);
+}
+});
+}
+return _442;
+};
+};
+function _444(_445,div){
+var menu=$(div).addClass("menu");
+if(!menu.data("menu")){
+menu.data("menu",{options:$.parser.parseOptions(menu[0],["width","height"])});
+}
+if(!menu.hasClass("menu-content")){
+menu.children("div").each(function(){
+_446(_445,this);
+});
+$("<div class=\"menu-line\"></div>").prependTo(menu);
+}
+_447(_445,menu);
+if(!menu.hasClass("menu-inline")){
+menu.hide();
+}
+_448(_445,menu);
+};
+function _446(_449,div,_44a){
+var item=$(div);
+var _44b=$.extend({},$.parser.parseOptions(item[0],["id","name","iconCls","href",{separator:"boolean"}]),{disabled:(item.attr("disabled")?true:undefined),text:$.trim(item.html()),onclick:item[0].onclick},_44a||{});
+_44b.onclick=_44b.onclick||_44b.handler||null;
+item.data("menuitem",{options:_44b});
+if(_44b.separator){
+item.addClass("menu-sep");
+}
+if(!item.hasClass("menu-sep")){
+item.addClass("menu-item");
+item.empty().append($("<div class=\"menu-text\"></div>").html(_44b.text));
+if(_44b.iconCls){
+$("<div class=\"menu-icon\"></div>").addClass(_44b.iconCls).appendTo(item);
+}
+if(_44b.id){
+item.attr("id",_44b.id);
+}
+if(_44b.onclick){
+if(typeof _44b.onclick=="string"){
+item.attr("onclick",_44b.onclick);
+}else{
+item[0].onclick=eval(_44b.onclick);
+}
+}
+if(_44b.disabled){
+_44c(_449,item[0],true);
+}
+if(item[0].submenu){
+$("<div class=\"menu-rightarrow\"></div>").appendTo(item);
+}
+}
+};
+function _447(_44d,menu){
+var opts=$.data(_44d,"menu").options;
+var _44e=menu.attr("style")||"";
+var _44f=menu.is(":visible");
+menu.css({display:"block",left:-10000,height:"auto",overflow:"hidden"});
+menu.find(".menu-item").each(function(){
+$(this)._outerHeight(opts.itemHeight);
+$(this).find(".menu-text").css({height:(opts.itemHeight-2)+"px",lineHeight:(opts.itemHeight-2)+"px"});
+});
+menu.removeClass("menu-noline").addClass(opts.noline?"menu-noline":"");
+var _450=menu.data("menu").options;
+var _451=_450.width;
+var _452=_450.height;
+if(isNaN(parseInt(_451))){
+_451=0;
+menu.find("div.menu-text").each(function(){
+if(_451<$(this).outerWidth()){
+_451=$(this).outerWidth();
+}
+});
+_451=_451?_451+40:"";
+}
+var _453=menu.outerHeight();
+if(isNaN(parseInt(_452))){
+_452=_453;
+if(menu.hasClass("menu-top")&&opts.alignTo){
+var at=$(opts.alignTo);
+var h1=at.offset().top-$(document).scrollTop();
+var h2=$(window)._outerHeight()+$(document).scrollTop()-at.offset().top-at._outerHeight();
+_452=Math.min(_452,Math.max(h1,h2));
+}else{
+if(_452>$(window)._outerHeight()){
+_452=$(window).height();
+}
+}
+}
+menu.attr("style",_44e);
+menu.show();
+menu._size($.extend({},_450,{width:_451,height:_452,minWidth:_450.minWidth||opts.minWidth,maxWidth:_450.maxWidth||opts.maxWidth}));
+menu.find(".easyui-fluid").triggerHandler("_resize",[true]);
+menu.css("overflow",menu.outerHeight()<_453?"auto":"hidden");
+menu.children("div.menu-line")._outerHeight(_453-2);
+if(!_44f){
+menu.hide();
+}
+};
+function _448(_454,menu){
+var _455=$.data(_454,"menu");
+var opts=_455.options;
+menu._unbind(".menu");
+for(var _456 in opts.events){
+menu._bind(_456+".menu",{target:_454},opts.events[_456]);
+}
+};
+function _457(e){
+var _458=e.data.target;
+var _459=$.data(_458,"menu");
+if(_459.timer){
+clearTimeout(_459.timer);
+_459.timer=null;
+}
+};
+function _45a(e){
+var _45b=e.data.target;
+var _45c=$.data(_45b,"menu");
+if(_45c.options.hideOnUnhover){
+_45c.timer=setTimeout(function(){
+_45d(_45b,$(_45b).hasClass("menu-inline"));
+},_45c.options.duration);
+}
+};
+function _45e(e){
+var _45f=e.data.target;
+var item=$(e.target).closest(".menu-item");
+if(item.length){
+item.siblings().each(function(){
+if(this.submenu){
+_43d(this.submenu);
+}
+$(this).removeClass("menu-active");
+});
+item.addClass("menu-active");
+if(item.hasClass("menu-item-disabled")){
+item.addClass("menu-active-disabled");
+return;
+}
+var _460=item[0].submenu;
+if(_460){
+$(_45f).menu("show",{menu:_460,parent:item});
+}
+}
+};
+function _461(e){
+var item=$(e.target).closest(".menu-item");
+if(item.length){
+item.removeClass("menu-active menu-active-disabled");
+var _462=item[0].submenu;
+if(_462){
+if(e.pageX>=parseInt(_462.css("left"))){
+item.addClass("menu-active");
+}else{
+_43d(_462);
+}
+}else{
+item.removeClass("menu-active");
+}
+}
+};
+function _463(e){
+var _464=e.data.target;
+var item=$(e.target).closest(".menu-item");
+if(item.length){
+var opts=$(_464).data("menu").options;
+var _465=item.data("menuitem").options;
+if(_465.disabled){
+return;
+}
+if(!item[0].submenu){
+_45d(_464,opts.inline);
+if(_465.href){
+location.href=_465.href;
+}
+}
+item.trigger("mouseenter");
+opts.onClick.call(_464,$(_464).menu("getItem",item[0]));
+}
+};
+function _45d(_466,_467){
+var _468=$.data(_466,"menu");
+if(_468){
+if($(_466).is(":visible")){
+_43d($(_466));
+if(_467){
+$(_466).show();
+}else{
+_468.options.onHide.call(_466);
+}
+}
+}
+return false;
+};
+function _469(_46a,_46b){
+_46b=_46b||{};
+var left,top;
+var opts=$.data(_46a,"menu").options;
+var menu=$(_46b.menu||_46a);
+$(_46a).menu("resize",menu[0]);
+if(menu.hasClass("menu-top")){
+$.extend(opts,_46b);
+left=opts.left;
+top=opts.top;
+if(opts.alignTo){
+var at=$(opts.alignTo);
+left=at.offset().left;
+top=at.offset().top+at._outerHeight();
+if(opts.align=="right"){
+left+=at.outerWidth()-menu.outerWidth();
+}
+}
+if(left+menu.outerWidth()>$(window)._outerWidth()+$(document)._scrollLeft()){
+left=$(window)._outerWidth()+$(document).scrollLeft()-menu.outerWidth()-5;
+}
+if(left<0){
+left=0;
+}
+top=_46c(top,opts.alignTo);
+}else{
+var _46d=_46b.parent;
+left=_46d.offset().left+_46d.outerWidth()-2;
+if(left+menu.outerWidth()+5>$(window)._outerWidth()+$(document).scrollLeft()){
+left=_46d.offset().left-menu.outerWidth()+2;
+}
+top=_46c(_46d.offset().top-3);
+}
+function _46c(top,_46e){
+if(top+menu.outerHeight()>$(window)._outerHeight()+$(document).scrollTop()){
+if(_46e){
+top=$(_46e).offset().top-menu._outerHeight();
+}else{
+top=$(window)._outerHeight()+$(document).scrollTop()-menu.outerHeight();
+}
+}
+if(top<0){
+top=0;
+}
+return top;
+};
+menu.css(opts.position.call(_46a,menu[0],left,top));
+menu.show(0,function(){
+if(!menu[0].shadow){
+menu[0].shadow=$("<div class=\"menu-shadow\"></div>").insertAfter(menu);
+}
+menu[0].shadow.css({display:(menu.hasClass("menu-inline")?"none":"block"),zIndex:$.fn.menu.defaults.zIndex++,left:menu.css("left"),top:menu.css("top"),width:menu.outerWidth(),height:menu.outerHeight()});
+menu.css("z-index",$.fn.menu.defaults.zIndex++);
+if(menu.hasClass("menu-top")){
+opts.onShow.call(_46a);
+}
+});
+};
+function _43d(menu){
+if(menu&&menu.length){
+_46f(menu);
+menu.find("div.menu-item").each(function(){
+if(this.submenu){
+_43d(this.submenu);
+}
+$(this).removeClass("menu-active");
+});
+}
+function _46f(m){
+m.stop(true,true);
+if(m[0].shadow){
+m[0].shadow.hide();
+}
+m.hide();
+};
+};
+function _470(_471,_472){
+var _473=null;
+var fn=$.isFunction(_472)?_472:function(item){
+for(var p in _472){
+if(item[p]!=_472[p]){
+return false;
+}
+}
+return true;
+};
+function find(menu){
+menu.children("div.menu-item").each(function(){
+var opts=$(this).data("menuitem").options;
+if(fn.call(_471,opts)==true){
+_473=$(_471).menu("getItem",this);
+}else{
+if(this.submenu&&!_473){
+find(this.submenu);
+}
+}
+});
+};
+find($(_471));
+return _473;
+};
+function _44c(_474,_475,_476){
+var t=$(_475);
+if(t.hasClass("menu-item")){
+var opts=t.data("menuitem").options;
+opts.disabled=_476;
+if(_476){
+t.addClass("menu-item-disabled");
+t[0].onclick=null;
+}else{
+t.removeClass("menu-item-disabled");
+t[0].onclick=opts.onclick;
+}
+}
+};
+function _477(_478,_479){
+var opts=$.data(_478,"menu").options;
+var menu=$(_478);
+if(_479.parent){
+if(!_479.parent.submenu){
+var _47a=$("<div></div>").appendTo("body");
+_479.parent.submenu=_47a;
+$("<div class=\"menu-rightarrow\"></div>").appendTo(_479.parent);
+_444(_478,_47a);
+}
+menu=_479.parent.submenu;
+}
+var div=$("<div></div>").appendTo(menu);
+_446(_478,div,_479);
+};
+function _47b(_47c,_47d){
+function _47e(el){
+if(el.submenu){
+el.submenu.children("div.menu-item").each(function(){
+_47e(this);
+});
+var _47f=el.submenu[0].shadow;
+if(_47f){
+_47f.remove();
+}
+el.submenu.remove();
+}
+$(el).remove();
+};
+_47e(_47d);
+};
+function _480(_481,_482,_483){
+var menu=$(_482).parent();
+if(_483){
+$(_482).show();
+}else{
+$(_482).hide();
+}
+_447(_481,menu);
+};
+function _484(_485){
+$(_485).children("div.menu-item").each(function(){
+_47b(_485,this);
+});
+if(_485.shadow){
+_485.shadow.remove();
+}
+$(_485).remove();
+};
+$.fn.menu=function(_486,_487){
+if(typeof _486=="string"){
+return $.fn.menu.methods[_486](this,_487);
+}
+_486=_486||{};
+return this.each(function(){
+var _488=$.data(this,"menu");
+if(_488){
+$.extend(_488.options,_486);
+}else{
+_488=$.data(this,"menu",{options:$.extend({},$.fn.menu.defaults,$.fn.menu.parseOptions(this),_486)});
+init(this);
+}
+$(this).css({left:_488.options.left,top:_488.options.top});
+});
+};
+$.fn.menu.methods={options:function(jq){
+return $.data(jq[0],"menu").options;
+},show:function(jq,pos){
+return jq.each(function(){
+_469(this,pos);
+});
+},hide:function(jq){
+return jq.each(function(){
+_45d(this);
+});
+},destroy:function(jq){
+return jq.each(function(){
+_484(this);
+});
+},setText:function(jq,_489){
+return jq.each(function(){
+var item=$(_489.target).data("menuitem").options;
+item.text=_489.text;
+$(_489.target).children("div.menu-text").html(_489.text);
+});
+},setIcon:function(jq,_48a){
+return jq.each(function(){
+var item=$(_48a.target).data("menuitem").options;
+item.iconCls=_48a.iconCls;
+$(_48a.target).children("div.menu-icon").remove();
+if(_48a.iconCls){
+$("<div class=\"menu-icon\"></div>").addClass(_48a.iconCls).appendTo(_48a.target);
+}
+});
+},getItem:function(jq,_48b){
+var item=$(_48b).data("menuitem").options;
+return $.extend({},item,{target:$(_48b)[0]});
+},findItem:function(jq,text){
+if(typeof text=="string"){
+return _470(jq[0],function(item){
+return $("<div>"+item.text+"</div>").text()==text;
+});
+}else{
+return _470(jq[0],text);
+}
+},appendItem:function(jq,_48c){
+return jq.each(function(){
+_477(this,_48c);
+});
+},removeItem:function(jq,_48d){
+return jq.each(function(){
+_47b(this,_48d);
+});
+},enableItem:function(jq,_48e){
+return jq.each(function(){
+_44c(this,_48e,false);
+});
+},disableItem:function(jq,_48f){
+return jq.each(function(){
+_44c(this,_48f,true);
+});
+},showItem:function(jq,_490){
+return jq.each(function(){
+_480(this,_490,true);
+});
+},hideItem:function(jq,_491){
+return jq.each(function(){
+_480(this,_491,false);
+});
+},resize:function(jq,_492){
+return jq.each(function(){
+_447(this,_492?$(_492):$(this));
+});
+}};
+$.fn.menu.parseOptions=function(_493){
+return $.extend({},$.parser.parseOptions(_493,[{minWidth:"number",itemHeight:"number",duration:"number",hideOnUnhover:"boolean"},{fit:"boolean",inline:"boolean",noline:"boolean"}]));
+};
+$.fn.menu.defaults={zIndex:110000,left:0,top:0,alignTo:null,align:"left",minWidth:150,itemHeight:32,duration:100,hideOnUnhover:true,inline:false,fit:false,noline:false,events:{mouseenter:_457,mouseleave:_45a,mouseover:_45e,mouseout:_461,click:_463},position:function(_494,left,top){
+return {left:left,top:top};
+},onShow:function(){
+},onHide:function(){
+},onClick:function(item){
+}};
+})(jQuery);
+(function($){
+var _495=1;
+function init(_496){
+$(_496).addClass("sidemenu");
+};
+function _497(_498,_499){
+var opts=$(_498).sidemenu("options");
+if(_499){
+$.extend(opts,{width:_499.width,height:_499.height});
+}
+$(_498)._size(opts);
+$(_498).find(".accordion").accordion("resize");
+};
+function _49a(_49b,_49c,data){
+var opts=$(_49b).sidemenu("options");
+var tt=$("<ul class=\"sidemenu-tree\"></ul>").appendTo(_49c);
+tt.tree({data:data,animate:opts.animate,onBeforeSelect:function(node){
+if(node.children){
+return false;
+}
+},onSelect:function(node){
+_49d(_49b,node.id,true);
+},onExpand:function(node){
+_4aa(_49b,node);
+},onCollapse:function(node){
+_4aa(_49b,node);
+},onClick:function(node){
+if(node.children){
+if(node.state=="open"){
+$(node.target).addClass("tree-node-nonleaf-collapsed");
+}else{
+$(node.target).removeClass("tree-node-nonleaf-collapsed");
+}
+$(this).tree("toggle",node.target);
+}
+}});
+tt._unbind(".sidemenu")._bind("mouseleave.sidemenu",function(){
+$(_49c).trigger("mouseleave");
+});
+_49d(_49b,opts.selectedItemId);
+};
+function _49e(_49f,_4a0,data){
+var opts=$(_49f).sidemenu("options");
+$(_4a0).tooltip({content:$("<div></div>"),position:opts.floatMenuPosition,valign:"top",data:data,onUpdate:function(_4a1){
+var _4a2=$(this).tooltip("options");
+var data=_4a2.data;
+_4a1.accordion({width:opts.floatMenuWidth,multiple:false}).accordion("add",{title:data.text,collapsed:false,collapsible:false});
+_49a(_49f,_4a1.accordion("panels")[0],data.children);
+},onShow:function(){
+var t=$(this);
+var tip=t.tooltip("tip").addClass("sidemenu-tooltip");
+tip.children(".tooltip-content").addClass("sidemenu");
+tip.find(".accordion").accordion("resize");
+tip.add(tip.find("ul.tree"))._unbind(".sidemenu")._bind("mouseover.sidemenu",function(){
+t.tooltip("show");
+})._bind("mouseleave.sidemenu",function(){
+t.tooltip("hide");
+});
+t.tooltip("reposition");
+},onPosition:function(left,top){
+var tip=$(this).tooltip("tip");
+if(!opts.collapsed){
+tip.css({left:-999999});
+}else{
+if(top+tip.outerHeight()>$(window)._outerHeight()+$(document).scrollTop()){
+top=$(window)._outerHeight()+$(document).scrollTop()-tip.outerHeight();
+tip.css("top",top);
+}
+}
+}});
+};
+function _4a3(_4a4,_4a5){
+$(_4a4).find(".sidemenu-tree").each(function(){
+_4a5($(this));
+});
+$(_4a4).find(".tooltip-f").each(function(){
+var tip=$(this).tooltip("tip");
+if(tip){
+tip.find(".sidemenu-tree").each(function(){
+_4a5($(this));
+});
+$(this).tooltip("reposition");
+}
+});
+};
+function _49d(_4a6,_4a7,_4a8){
+var _4a9=null;
+var opts=$(_4a6).sidemenu("options");
+_4a3(_4a6,function(t){
+t.find("div.tree-node-selected").removeClass("tree-node-selected");
+var node=t.tree("find",_4a7);
+if(node){
+$(node.target).addClass("tree-node-selected");
+opts.selectedItemId=node.id;
+t.trigger("mouseleave.sidemenu");
+_4a9=node;
+}
+});
+if(_4a8&&_4a9){
+opts.onSelect.call(_4a6,_4a9);
+}
+};
+function _4aa(_4ab,item){
+_4a3(_4ab,function(t){
+var node=t.tree("find",item.id);
+if(node){
+var _4ac=t.tree("options");
+var _4ad=_4ac.animate;
+_4ac.animate=false;
+t.tree(item.state=="open"?"expand":"collapse",node.target);
+_4ac.animate=_4ad;
+}
+});
+};
+function _4ae(_4af){
+var opts=$(_4af).sidemenu("options");
+$(_4af).empty();
+if(opts.data){
+$.easyui.forEach(opts.data,true,function(node){
+if(!node.id){
+node.id="_easyui_sidemenu_"+(_495++);
+}
+if(!node.iconCls){
+node.iconCls="sidemenu-default-icon";
+}
+if(node.children){
+node.nodeCls="tree-node-nonleaf";
+if(!node.state){
+node.state="closed";
+}
+if(node.state=="open"){
+node.nodeCls="tree-node-nonleaf";
+}else{
+node.nodeCls="tree-node-nonleaf tree-node-nonleaf-collapsed";
+}
+}
+});
+var acc=$("<div></div>").appendTo(_4af);
+acc.accordion({fit:opts.height=="auto"?false:true,border:opts.border,multiple:opts.multiple});
+var data=opts.data;
+for(var i=0;i<data.length;i++){
+acc.accordion("add",{title:data[i].text,selected:data[i].state=="open",iconCls:data[i].iconCls,onBeforeExpand:function(){
+return !opts.collapsed;
+}});
+var ap=acc.accordion("panels")[i];
+_49a(_4af,ap,data[i].children);
+_49e(_4af,ap.panel("header"),data[i]);
+}
+}
+};
+function _4b0(_4b1,_4b2){
+var opts=$(_4b1).sidemenu("options");
+opts.collapsed=_4b2;
+var acc=$(_4b1).find(".accordion");
+var _4b3=acc.accordion("panels");
+acc.accordion("options").animate=false;
+if(opts.collapsed){
+$(_4b1).addClass("sidemenu-collapsed");
+for(var i=0;i<_4b3.length;i++){
+var _4b4=_4b3[i];
+if(_4b4.panel("options").collapsed){
+opts.data[i].state="closed";
+}else{
+opts.data[i].state="open";
+acc.accordion("unselect",i);
+}
+var _4b5=_4b4.panel("header");
+_4b5.find(".panel-title").html("");
+_4b5.find(".panel-tool").hide();
+}
+}else{
+$(_4b1).removeClass("sidemenu-collapsed");
+for(var i=0;i<_4b3.length;i++){
+var _4b4=_4b3[i];
+if(opts.data[i].state=="open"){
+acc.accordion("select",i);
+}
+var _4b5=_4b4.panel("header");
+_4b5.find(".panel-title").html(_4b4.panel("options").title);
+_4b5.find(".panel-tool").show();
+}
+}
+acc.accordion("options").animate=opts.animate;
+};
+function _4b6(_4b7){
+$(_4b7).find(".tooltip-f").each(function(){
+$(this).tooltip("destroy");
+});
+$(_4b7).remove();
+};
+$.fn.sidemenu=function(_4b8,_4b9){
+if(typeof _4b8=="string"){
+var _4ba=$.fn.sidemenu.methods[_4b8];
+return _4ba(this,_4b9);
+}
+_4b8=_4b8||{};
+return this.each(function(){
+var _4bb=$.data(this,"sidemenu");
+if(_4bb){
+$.extend(_4bb.options,_4b8);
+}else{
+_4bb=$.data(this,"sidemenu",{options:$.extend({},$.fn.sidemenu.defaults,$.fn.sidemenu.parseOptions(this),_4b8)});
+init(this);
+}
+_497(this);
+_4ae(this);
+_4b0(this,_4bb.options.collapsed);
+});
+};
+$.fn.sidemenu.methods={options:function(jq){
+return jq.data("sidemenu").options;
+},resize:function(jq,_4bc){
+return jq.each(function(){
+_497(this,_4bc);
+});
+},collapse:function(jq){
+return jq.each(function(){
+_4b0(this,true);
+});
+},expand:function(jq){
+return jq.each(function(){
+_4b0(this,false);
+});
+},destroy:function(jq){
+return jq.each(function(){
+_4b6(this);
+});
+}};
+$.fn.sidemenu.parseOptions=function(_4bd){
+var t=$(_4bd);
+return $.extend({},$.parser.parseOptions(_4bd,["width","height"]));
+};
+$.fn.sidemenu.defaults={width:200,height:"auto",border:true,animate:true,multiple:true,collapsed:false,data:null,floatMenuWidth:200,floatMenuPosition:"right",onSelect:function(item){
+}};
+})(jQuery);
+(function($){
+function init(_4be){
+var opts=$.data(_4be,"menubutton").options;
+var btn=$(_4be);
+btn.linkbutton(opts);
+if(opts.hasDownArrow){
+btn.removeClass(opts.cls.btn1+" "+opts.cls.btn2).addClass("m-btn");
+btn.removeClass("m-btn-small m-btn-medium m-btn-large").addClass("m-btn-"+opts.size);
+var _4bf=btn.find(".l-btn-left");
+$("<span></span>").addClass(opts.cls.arrow).appendTo(_4bf);
+$("<span></span>").addClass("m-btn-line").appendTo(_4bf);
+}
+$(_4be).menubutton("resize");
+if(opts.menu){
+$(opts.menu).menu({duration:opts.duration});
+var _4c0=$(opts.menu).menu("options");
+var _4c1=_4c0.onShow;
+var _4c2=_4c0.onHide;
+$.extend(_4c0,{onShow:function(){
+var _4c3=$(this).menu("options");
+var btn=$(_4c3.alignTo);
+var opts=btn.menubutton("options");
+btn.addClass((opts.plain==true)?opts.cls.btn2:opts.cls.btn1);
+_4c1.call(this);
+},onHide:function(){
+var _4c4=$(this).menu("options");
+var btn=$(_4c4.alignTo);
+var opts=btn.menubutton("options");
+btn.removeClass((opts.plain==true)?opts.cls.btn2:opts.cls.btn1);
+_4c2.call(this);
+}});
+}
+};
+function _4c5(_4c6){
+var opts=$.data(_4c6,"menubutton").options;
+var btn=$(_4c6);
+var t=btn.find("."+opts.cls.trigger);
+if(!t.length){
+t=btn;
+}
+t._unbind(".menubutton");
+var _4c7=null;
+t._bind(opts.showEvent+".menubutton",function(){
+if(!_4c8()){
+_4c7=setTimeout(function(){
+_4c9(_4c6);
+},opts.duration);
+return false;
+}
+})._bind(opts.hideEvent+".menubutton",function(){
+if(_4c7){
+clearTimeout(_4c7);
+}
+$(opts.menu).triggerHandler("mouseleave");
+});
+function _4c8(){
+return $(_4c6).linkbutton("options").disabled;
+};
+};
+function _4c9(_4ca){
+var opts=$(_4ca).menubutton("options");
+if(opts.disabled||!opts.menu){
+return;
+}
+$("body>div.menu-top").menu("hide");
+var btn=$(_4ca);
+var mm=$(opts.menu);
+if(mm.length){
+mm.menu("options").alignTo=btn;
+mm.menu("show",{alignTo:btn,align:opts.menuAlign});
+}
+btn.blur();
+};
+$.fn.menubutton=function(_4cb,_4cc){
+if(typeof _4cb=="string"){
+var _4cd=$.fn.menubutton.methods[_4cb];
+if(_4cd){
+return _4cd(this,_4cc);
+}else{
+return this.linkbutton(_4cb,_4cc);
+}
+}
+_4cb=_4cb||{};
+return this.each(function(){
+var _4ce=$.data(this,"menubutton");
+if(_4ce){
+$.extend(_4ce.options,_4cb);
+}else{
+$.data(this,"menubutton",{options:$.extend({},$.fn.menubutton.defaults,$.fn.menubutton.parseOptions(this),_4cb)});
+$(this)._propAttr("disabled",false);
+}
+init(this);
+_4c5(this);
+});
+};
+$.fn.menubutton.methods={options:function(jq){
+var _4cf=jq.linkbutton("options");
+return $.extend($.data(jq[0],"menubutton").options,{toggle:_4cf.toggle,selected:_4cf.selected,disabled:_4cf.disabled});
+},destroy:function(jq){
+return jq.each(function(){
+var opts=$(this).menubutton("options");
+if(opts.menu){
+$(opts.menu).menu("destroy");
+}
+$(this).remove();
+});
+}};
+$.fn.menubutton.parseOptions=function(_4d0){
+var t=$(_4d0);
+return $.extend({},$.fn.linkbutton.parseOptions(_4d0),$.parser.parseOptions(_4d0,["menu",{plain:"boolean",hasDownArrow:"boolean",duration:"number"}]));
+};
+$.fn.menubutton.defaults=$.extend({},$.fn.linkbutton.defaults,{plain:true,hasDownArrow:true,menu:null,menuAlign:"left",duration:100,showEvent:"mouseenter",hideEvent:"mouseleave",cls:{btn1:"m-btn-active",btn2:"m-btn-plain-active",arrow:"m-btn-downarrow",trigger:"m-btn"}});
+})(jQuery);
+(function($){
+function init(_4d1){
+var opts=$.data(_4d1,"splitbutton").options;
+$(_4d1).menubutton(opts);
+$(_4d1).addClass("s-btn");
+};
+$.fn.splitbutton=function(_4d2,_4d3){
+if(typeof _4d2=="string"){
+var _4d4=$.fn.splitbutton.methods[_4d2];
+if(_4d4){
+return _4d4(this,_4d3);
+}else{
+return this.menubutton(_4d2,_4d3);
+}
+}
+_4d2=_4d2||{};
+return this.each(function(){
+var _4d5=$.data(this,"splitbutton");
+if(_4d5){
+$.extend(_4d5.options,_4d2);
+}else{
+$.data(this,"splitbutton",{options:$.extend({},$.fn.splitbutton.defaults,$.fn.splitbutton.parseOptions(this),_4d2)});
+$(this)._propAttr("disabled",false);
+}
+init(this);
+});
+};
+$.fn.splitbutton.methods={options:function(jq){
+var _4d6=jq.menubutton("options");
+var _4d7=$.data(jq[0],"splitbutton").options;
+$.extend(_4d7,{disabled:_4d6.disabled,toggle:_4d6.toggle,selected:_4d6.selected});
+return _4d7;
+}};
+$.fn.splitbutton.parseOptions=function(_4d8){
+var t=$(_4d8);
+return $.extend({},$.fn.linkbutton.parseOptions(_4d8),$.parser.parseOptions(_4d8,["menu",{plain:"boolean",duration:"number"}]));
+};
+$.fn.splitbutton.defaults=$.extend({},$.fn.linkbutton.defaults,{plain:true,menu:null,duration:100,cls:{btn1:"m-btn-active s-btn-active",btn2:"m-btn-plain-active s-btn-plain-active",arrow:"m-btn-downarrow",trigger:"m-btn-line"}});
+})(jQuery);
+(function($){
+var _4d9=1;
+function init(_4da){
+var _4db=$("<span class=\"switchbutton\">"+"<span class=\"switchbutton-inner\">"+"<span class=\"switchbutton-on\"></span>"+"<span class=\"switchbutton-handle\"></span>"+"<span class=\"switchbutton-off\"></span>"+"<input class=\"switchbutton-value\" type=\"checkbox\" tabindex=\"-1\">"+"</span>"+"</span>").insertAfter(_4da);
+var t=$(_4da);
+t.addClass("switchbutton-f").hide();
+var name=t.attr("name");
+if(name){
+t.removeAttr("name").attr("switchbuttonName",name);
+_4db.find(".switchbutton-value").attr("name",name);
+}
+_4db._bind("_resize",function(e,_4dc){
+if($(this).hasClass("easyui-fluid")||_4dc){
+_4dd(_4da);
+}
+return false;
+});
+return _4db;
+};
+function _4dd(_4de,_4df){
+var _4e0=$.data(_4de,"switchbutton");
+var opts=_4e0.options;
+var _4e1=_4e0.switchbutton;
+if(_4df){
+$.extend(opts,_4df);
+}
+var _4e2=_4e1.is(":visible");
+if(!_4e2){
+_4e1.appendTo("body");
+}
+_4e1._size(opts);
+if(opts.label&&opts.labelPosition){
+if(opts.labelPosition=="top"){
+_4e0.label._size({width:opts.labelWidth},_4e1);
+}else{
+_4e0.label._size({width:opts.labelWidth,height:_4e1.outerHeight()},_4e1);
+_4e0.label.css("lineHeight",_4e1.outerHeight()+"px");
+}
+}
+var w=_4e1.width();
+var h=_4e1.height();
+var w=_4e1.outerWidth();
+var h=_4e1.outerHeight();
+var _4e3=parseInt(opts.handleWidth)||_4e1.height();
+var _4e4=w*2-_4e3;
+_4e1.find(".switchbutton-inner").css({width:_4e4+"px",height:h+"px",lineHeight:h+"px"});
+_4e1.find(".switchbutton-handle")._outerWidth(_4e3)._outerHeight(h).css({marginLeft:-_4e3/2+"px"});
+_4e1.find(".switchbutton-on").css({width:(w-_4e3/2)+"px",textIndent:(opts.reversed?"":"-")+_4e3/2+"px"});
+_4e1.find(".switchbutton-off").css({width:(w-_4e3/2)+"px",textIndent:(opts.reversed?"-":"")+_4e3/2+"px"});
+opts.marginWidth=w-_4e3;
+_4e5(_4de,opts.checked,false);
+if(!_4e2){
+_4e1.insertAfter(_4de);
+}
+};
+function _4e6(_4e7){
+var _4e8=$.data(_4e7,"switchbutton");
+var opts=_4e8.options;
+var _4e9=_4e8.switchbutton;
+var _4ea=_4e9.find(".switchbutton-inner");
+var on=_4ea.find(".switchbutton-on").html(opts.onText);
+var off=_4ea.find(".switchbutton-off").html(opts.offText);
+var _4eb=_4ea.find(".switchbutton-handle").html(opts.handleText);
+if(opts.reversed){
+off.prependTo(_4ea);
+on.insertAfter(_4eb);
+}else{
+on.prependTo(_4ea);
+off.insertAfter(_4eb);
+}
+var _4ec="_easyui_switchbutton_"+(++_4d9);
+var _4ed=_4e9.find(".switchbutton-value")._propAttr("checked",opts.checked).attr("id",_4ec);
+_4ed._unbind(".switchbutton")._bind("change.switchbutton",function(e){
+return false;
+});
+_4e9.removeClass("switchbutton-reversed").addClass(opts.reversed?"switchbutton-reversed":"");
+if(opts.label){
+if(typeof opts.label=="object"){
+_4e8.label=$(opts.label);
+_4e8.label.attr("for",_4ec);
+}else{
+$(_4e8.label).remove();
+_4e8.label=$("<label class=\"textbox-label\"></label>").html(opts.label);
+_4e8.label.css("textAlign",opts.labelAlign).attr("for",_4ec);
+if(opts.labelPosition=="after"){
+_4e8.label.insertAfter(_4e9);
+}else{
+_4e8.label.insertBefore(_4e7);
+}
+_4e8.label.removeClass("textbox-label-left textbox-label-right textbox-label-top");
+_4e8.label.addClass("textbox-label-"+opts.labelPosition);
+}
+}else{
+$(_4e8.label).remove();
+}
+_4e5(_4e7,opts.checked);
+_4ee(_4e7,opts.readonly);
+_4ef(_4e7,opts.disabled);
+$(_4e7).switchbutton("setValue",opts.value);
+};
+function _4e5(_4f0,_4f1,_4f2){
+var _4f3=$.data(_4f0,"switchbutton");
+var opts=_4f3.options;
+var _4f4=_4f3.switchbutton.find(".switchbutton-inner");
+var _4f5=_4f4.find(".switchbutton-on");
+var _4f6=opts.reversed?(_4f1?opts.marginWidth:0):(_4f1?0:opts.marginWidth);
+var dir=_4f5.css("float").toLowerCase();
+var css={};
+css["margin-"+dir]=-_4f6+"px";
+_4f2?_4f4.animate(css,200):_4f4.css(css);
+var _4f7=_4f4.find(".switchbutton-value");
+$(_4f0).add(_4f7)._propAttr("checked",_4f1);
+if(opts.checked!=_4f1){
+opts.checked=_4f1;
+opts.onChange.call(_4f0,opts.checked);
+$(_4f0).closest("form").trigger("_change",[_4f0]);
+}
+};
+function _4ef(_4f8,_4f9){
+var _4fa=$.data(_4f8,"switchbutton");
+var opts=_4fa.options;
+var _4fb=_4fa.switchbutton;
+var _4fc=_4fb.find(".switchbutton-value");
+if(_4f9){
+opts.disabled=true;
+$(_4f8).add(_4fc)._propAttr("disabled",true);
+_4fb.addClass("switchbutton-disabled");
+_4fb.removeAttr("tabindex");
+}else{
+opts.disabled=false;
+$(_4f8).add(_4fc)._propAttr("disabled",false);
+_4fb.removeClass("switchbutton-disabled");
+_4fb.attr("tabindex",$(_4f8).attr("tabindex")||"");
+}
+};
+function _4ee(_4fd,mode){
+var _4fe=$.data(_4fd,"switchbutton");
+var opts=_4fe.options;
+opts.readonly=mode==undefined?true:mode;
+_4fe.switchbutton.removeClass("switchbutton-readonly").addClass(opts.readonly?"switchbutton-readonly":"");
+};
+function _4ff(_500){
+var _501=$.data(_500,"switchbutton");
+var opts=_501.options;
+_501.switchbutton._unbind(".switchbutton")._bind("click.switchbutton",function(){
+if(!opts.disabled&&!opts.readonly){
+_4e5(_500,opts.checked?false:true,true);
+}
+})._bind("keydown.switchbutton",function(e){
+if(e.which==13||e.which==32){
+if(!opts.disabled&&!opts.readonly){
+_4e5(_500,opts.checked?false:true,true);
+return false;
+}
+}
+});
+};
+$.fn.switchbutton=function(_502,_503){
+if(typeof _502=="string"){
+return $.fn.switchbutton.methods[_502](this,_503);
+}
+_502=_502||{};
+return this.each(function(){
+var _504=$.data(this,"switchbutton");
+if(_504){
+$.extend(_504.options,_502);
+}else{
+_504=$.data(this,"switchbutton",{options:$.extend({},$.fn.switchbutton.defaults,$.fn.switchbutton.parseOptions(this),_502),switchbutton:init(this)});
+}
+_504.options.originalChecked=_504.options.checked;
+_4e6(this);
+_4dd(this);
+_4ff(this);
+});
+};
+$.fn.switchbutton.methods={options:function(jq){
+var _505=jq.data("switchbutton");
+return $.extend(_505.options,{value:_505.switchbutton.find(".switchbutton-value").val()});
+},resize:function(jq,_506){
+return jq.each(function(){
+_4dd(this,_506);
+});
+},enable:function(jq){
+return jq.each(function(){
+_4ef(this,false);
+});
+},disable:function(jq){
+return jq.each(function(){
+_4ef(this,true);
+});
+},readonly:function(jq,mode){
+return jq.each(function(){
+_4ee(this,mode);
+});
+},check:function(jq){
+return jq.each(function(){
+_4e5(this,true);
+});
+},uncheck:function(jq){
+return jq.each(function(){
+_4e5(this,false);
+});
+},clear:function(jq){
+return jq.each(function(){
+_4e5(this,false);
+});
+},reset:function(jq){
+return jq.each(function(){
+var opts=$(this).switchbutton("options");
+_4e5(this,opts.originalChecked);
+});
+},setValue:function(jq,_507){
+return jq.each(function(){
+$(this).val(_507);
+$.data(this,"switchbutton").switchbutton.find(".switchbutton-value").val(_507);
+});
+}};
+$.fn.switchbutton.parseOptions=function(_508){
+var t=$(_508);
+return $.extend({},$.parser.parseOptions(_508,["onText","offText","handleText",{handleWidth:"number",reversed:"boolean"},"label","labelPosition","labelAlign",{labelWidth:"number"}]),{value:(t.val()||undefined),checked:(t.attr("checked")?true:undefined),disabled:(t.attr("disabled")?true:undefined),readonly:(t.attr("readonly")?true:undefined)});
+};
+$.fn.switchbutton.defaults={handleWidth:"auto",width:60,height:30,checked:false,disabled:false,readonly:false,reversed:false,onText:"ON",offText:"OFF",handleText:"",value:"on",label:null,labelWidth:"auto",labelPosition:"before",labelAlign:"left",onChange:function(_509){
+}};
+})(jQuery);
+(function($){
+var _50a=1;
+function init(_50b){
+var _50c=$("<span class=\"radiobutton inputbox\">"+"<span class=\"radiobutton-inner\" style=\"display:none\"></span>"+"<input type=\"radio\" class=\"radiobutton-value\">"+"</span>").insertAfter(_50b);
+var t=$(_50b);
+t.addClass("radiobutton-f").hide();
+var name=t.attr("name");
+if(name){
+t.removeAttr("name").attr("radiobuttonName",name);
+_50c.find(".radiobutton-value").attr("name",name);
+}
+return _50c;
+};
+function _50d(_50e){
+var _50f=$.data(_50e,"radiobutton");
+var opts=_50f.options;
+var _510=_50f.radiobutton;
+var _511="_easyui_radiobutton_"+(++_50a);
+var _512=_510.find(".radiobutton-value").attr("id",_511);
+_512._unbind(".radiobutton")._bind("change.radiobutton",function(e){
+return false;
+});
+if(opts.label){
+if(typeof opts.label=="object"){
+_50f.label=$(opts.label);
+_50f.label.attr("for",_511);
+}else{
+$(_50f.label).remove();
+_50f.label=$("<label class=\"textbox-label\"></label>").html(opts.label);
+_50f.label.css("textAlign",opts.labelAlign).attr("for",_511);
+if(opts.labelPosition=="after"){
+_50f.label.insertAfter(_510);
+}else{
+_50f.label.insertBefore(_50e);
+}
+_50f.label.removeClass("textbox-label-left textbox-label-right textbox-label-top");
+_50f.label.addClass("textbox-label-"+opts.labelPosition);
+}
+}else{
+$(_50f.label).remove();
+}
+$(_50e).radiobutton("setValue",opts.value);
+_513(_50e,opts.checked);
+_514(_50e,opts.readonly);
+_515(_50e,opts.disabled);
+};
+function _516(_517){
+var _518=$.data(_517,"radiobutton");
+var opts=_518.options;
+var _519=_518.radiobutton;
+_519._unbind(".radiobutton")._bind("click.radiobutton",function(){
+if(!opts.disabled&&!opts.readonly){
+_513(_517,true);
+}
+});
+};
+function _51a(_51b){
+var _51c=$.data(_51b,"radiobutton");
+var opts=_51c.options;
+var _51d=_51c.radiobutton;
+_51d._size(opts,_51d.parent());
+if(opts.label&&opts.labelPosition){
+if(opts.labelPosition=="top"){
+_51c.label._size({width:opts.labelWidth},_51d);
+}else{
+_51c.label._size({width:opts.labelWidth,height:_51d.outerHeight()},_51d);
+_51c.label.css("lineHeight",_51d.outerHeight()+"px");
+}
+}
+};
+function _513(_51e,_51f){
+if(_51f){
+var f=$(_51e).closest("form");
+var name=$(_51e).attr("radiobuttonName");
+f.find(".radiobutton-f[radiobuttonName=\""+name+"\"]").each(function(){
+if(this!=_51e){
+_520(this,false);
+}
+});
+_520(_51e,true);
+}else{
+_520(_51e,false);
+}
+function _520(b,c){
+var _521=$(b).data("radiobutton");
+var opts=_521.options;
+var _522=_521.radiobutton;
+_522.find(".radiobutton-inner").css("display",c?"":"none");
+_522.find(".radiobutton-value")._propAttr("checked",c);
+if(c){
+_522.addClass("radiobutton-checked");
+$(_521.label).addClass("textbox-label-checked");
+}else{
+_522.removeClass("radiobutton-checked");
+$(_521.label).removeClass("textbox-label-checked");
+}
+if(opts.checked!=c){
+opts.checked=c;
+opts.onChange.call($(b)[0],c);
+$(b).closest("form").trigger("_change",[$(b)[0]]);
+}
+};
+};
+function _515(_523,_524){
+var _525=$.data(_523,"radiobutton");
+var opts=_525.options;
+var _526=_525.radiobutton;
+var rv=_526.find(".radiobutton-value");
+opts.disabled=_524;
+if(_524){
+$(_523).add(rv)._propAttr("disabled",true);
+_526.addClass("radiobutton-disabled");
+$(_525.label).addClass("textbox-label-disabled");
+}else{
+$(_523).add(rv)._propAttr("disabled",false);
+_526.removeClass("radiobutton-disabled");
+$(_525.label).removeClass("textbox-label-disabled");
+}
+};
+function _514(_527,mode){
+var _528=$.data(_527,"radiobutton");
+var opts=_528.options;
+opts.readonly=mode==undefined?true:mode;
+if(opts.readonly){
+_528.radiobutton.addClass("radiobutton-readonly");
+$(_528.label).addClass("textbox-label-readonly");
+}else{
+_528.radiobutton.removeClass("radiobutton-readonly");
+$(_528.label).removeClass("textbox-label-readonly");
+}
+};
+$.fn.radiobutton=function(_529,_52a){
+if(typeof _529=="string"){
+return $.fn.radiobutton.methods[_529](this,_52a);
+}
+_529=_529||{};
+return this.each(function(){
+var _52b=$.data(this,"radiobutton");
+if(_52b){
+$.extend(_52b.options,_529);
+}else{
+_52b=$.data(this,"radiobutton",{options:$.extend({},$.fn.radiobutton.defaults,$.fn.radiobutton.parseOptions(this),_529),radiobutton:init(this)});
+}
+_52b.options.originalChecked=_52b.options.checked;
+_50d(this);
+_516(this);
+_51a(this);
+});
+};
+$.fn.radiobutton.methods={options:function(jq){
+var _52c=jq.data("radiobutton");
+return $.extend(_52c.options,{value:_52c.radiobutton.find(".radiobutton-value").val()});
+},setValue:function(jq,_52d){
+return jq.each(function(){
+$(this).val(_52d);
+$.data(this,"radiobutton").radiobutton.find(".radiobutton-value").val(_52d);
+});
+},enable:function(jq){
+return jq.each(function(){
+_515(this,false);
+});
+},disable:function(jq){
+return jq.each(function(){
+_515(this,true);
+});
+},readonly:function(jq,mode){
+return jq.each(function(){
+_514(this,mode);
+});
+},check:function(jq){
+return jq.each(function(){
+_513(this,true);
+});
+},uncheck:function(jq){
+return jq.each(function(){
+_513(this,false);
+});
+},clear:function(jq){
+return jq.each(function(){
+_513(this,false);
+});
+},reset:function(jq){
+return jq.each(function(){
+var opts=$(this).radiobutton("options");
+_513(this,opts.originalChecked);
+});
+}};
+$.fn.radiobutton.parseOptions=function(_52e){
+var t=$(_52e);
+return $.extend({},$.parser.parseOptions(_52e,["label","labelPosition","labelAlign",{labelWidth:"number"}]),{value:(t.val()||undefined),checked:(t.attr("checked")?true:undefined),disabled:(t.attr("disabled")?true:undefined),readonly:(t.attr("readonly")?true:undefined)});
+};
+$.fn.radiobutton.defaults={width:20,height:20,value:null,disabled:false,readonly:false,checked:false,label:null,labelWidth:"auto",labelPosition:"before",labelAlign:"left",onChange:function(_52f){
+}};
+})(jQuery);
+(function($){
+var _530=1;
+function init(_531){
+var _532=$("<span class=\"checkbox inputbox\">"+"<span class=\"checkbox-inner\">"+"<svg xml:space=\"preserve\" focusable=\"false\" version=\"1.1\" viewBox=\"0 0 24 24\"><path d=\"M4.1,12.7 9,17.6 20.3,6.3\" fill=\"none\" stroke=\"white\"></path></svg>"+"</span>"+"<input type=\"checkbox\" class=\"checkbox-value\">"+"</span>").insertAfter(_531);
+var t=$(_531);
+t.addClass("checkbox-f").hide();
+var name=t.attr("name");
+if(name){
+t.removeAttr("name").attr("checkboxName",name);
+_532.find(".checkbox-value").attr("name",name);
+}
+return _532;
+};
+function _533(_534){
+var _535=$.data(_534,"checkbox");
+var opts=_535.options;
+var _536=_535.checkbox;
+var _537="_easyui_checkbox_"+(++_530);
+var _538=_536.find(".checkbox-value").attr("id",_537);
+_538._unbind(".checkbox")._bind("change.checkbox",function(e){
+return false;
+});
+if(opts.label){
+if(typeof opts.label=="object"){
+_535.label=$(opts.label);
+_535.label.attr("for",_537);
+}else{
+$(_535.label).remove();
+_535.label=$("<label class=\"textbox-label\"></label>").html(opts.label);
+_535.label.css("textAlign",opts.labelAlign).attr("for",_537);
+if(opts.labelPosition=="after"){
+_535.label.insertAfter(_536);
+}else{
+_535.label.insertBefore(_534);
+}
+_535.label.removeClass("textbox-label-left textbox-label-right textbox-label-top");
+_535.label.addClass("textbox-label-"+opts.labelPosition);
+}
+}else{
+$(_535.label).remove();
+}
+$(_534).checkbox("setValue",opts.value);
+_539(_534,opts.checked);
+_53a(_534,opts.readonly);
+_53b(_534,opts.disabled);
+};
+function _53c(_53d){
+var _53e=$.data(_53d,"checkbox");
+var opts=_53e.options;
+var _53f=_53e.checkbox;
+_53f._unbind(".checkbox")._bind("click.checkbox",function(){
+if(!opts.disabled&&!opts.readonly){
+_539(_53d,!opts.checked);
+}
+});
+};
+function _540(_541){
+var _542=$.data(_541,"checkbox");
+var opts=_542.options;
+var _543=_542.checkbox;
+_543._size(opts,_543.parent());
+if(opts.label&&opts.labelPosition){
+if(opts.labelPosition=="top"){
+_542.label._size({width:opts.labelWidth},_543);
+}else{
+_542.label._size({width:opts.labelWidth,height:_543.outerHeight()},_543);
+_542.label.css("lineHeight",_543.outerHeight()+"px");
+}
+}
+};
+function _539(_544,_545){
+var _546=$.data(_544,"checkbox");
+var opts=_546.options;
+var _547=_546.checkbox;
+_547.find(".checkbox-value")._propAttr("checked",_545);
+var _548=_547.find(".checkbox-inner").css("display",_545?"":"none");
+if(_545){
+_547.addClass("checkbox-checked");
+$(_546.label).addClass("textbox-label-checked");
+}else{
+_547.removeClass("checkbox-checked");
+$(_546.label).removeClass("textbox-label-checked");
+}
+if(opts.checked!=_545){
+opts.checked=_545;
+opts.onChange.call(_544,_545);
+$(_544).closest("form").trigger("_change",[_544]);
+}
+};
+function _53a(_549,mode){
+var _54a=$.data(_549,"checkbox");
+var opts=_54a.options;
+opts.readonly=mode==undefined?true:mode;
+if(opts.readonly){
+_54a.checkbox.addClass("checkbox-readonly");
+$(_54a.label).addClass("textbox-label-readonly");
+}else{
+_54a.checkbox.removeClass("checkbox-readonly");
+$(_54a.label).removeClass("textbox-label-readonly");
+}
+};
+function _53b(_54b,_54c){
+var _54d=$.data(_54b,"checkbox");
+var opts=_54d.options;
+var _54e=_54d.checkbox;
+var rv=_54e.find(".checkbox-value");
+opts.disabled=_54c;
+if(_54c){
+$(_54b).add(rv)._propAttr("disabled",true);
+_54e.addClass("checkbox-disabled");
+$(_54d.label).addClass("textbox-label-disabled");
+}else{
+$(_54b).add(rv)._propAttr("disabled",false);
+_54e.removeClass("checkbox-disabled");
+$(_54d.label).removeClass("textbox-label-disabled");
+}
+};
+$.fn.checkbox=function(_54f,_550){
+if(typeof _54f=="string"){
+return $.fn.checkbox.methods[_54f](this,_550);
+}
+_54f=_54f||{};
+return this.each(function(){
+var _551=$.data(this,"checkbox");
+if(_551){
+$.extend(_551.options,_54f);
+}else{
+_551=$.data(this,"checkbox",{options:$.extend({},$.fn.checkbox.defaults,$.fn.checkbox.parseOptions(this),_54f),checkbox:init(this)});
+}
+_551.options.originalChecked=_551.options.checked;
+_533(this);
+_53c(this);
+_540(this);
+});
+};
+$.fn.checkbox.methods={options:function(jq){
+var _552=jq.data("checkbox");
+return $.extend(_552.options,{value:_552.checkbox.find(".checkbox-value").val()});
+},setValue:function(jq,_553){
+return jq.each(function(){
+$(this).val(_553);
+$.data(this,"checkbox").checkbox.find(".checkbox-value").val(_553);
+});
+},enable:function(jq){
+return jq.each(function(){
+_53b(this,false);
+});
+},disable:function(jq){
+return jq.each(function(){
+_53b(this,true);
+});
+},readonly:function(jq,mode){
+return jq.each(function(){
+_53a(this,mode);
+});
+},check:function(jq){
+return jq.each(function(){
+_539(this,true);
+});
+},uncheck:function(jq){
+return jq.each(function(){
+_539(this,false);
+});
+},clear:function(jq){
+return jq.each(function(){
+_539(this,false);
+});
+},reset:function(jq){
+return jq.each(function(){
+var opts=$(this).checkbox("options");
+_539(this,opts.originalChecked);
+});
+}};
+$.fn.checkbox.parseOptions=function(_554){
+var t=$(_554);
+return $.extend({},$.parser.parseOptions(_554,["label","labelPosition","labelAlign",{labelWidth:"number"}]),{value:(t.val()||undefined),checked:(t.attr("checked")?true:undefined),disabled:(t.attr("disabled")?true:undefined),readonly:(t.attr("readonly")?true:undefined)});
+};
+$.fn.checkbox.defaults={width:20,height:20,value:null,disabled:false,readonly:false,checked:false,label:null,labelWidth:"auto",labelPosition:"before",labelAlign:"left",onChange:function(_555){
+}};
+})(jQuery);
+(function($){
+function init(_556){
+$(_556).addClass("validatebox-text");
+};
+function _557(_558){
+var _559=$.data(_558,"validatebox");
+_559.validating=false;
+if(_559.vtimer){
+clearTimeout(_559.vtimer);
+}
+if(_559.ftimer){
+clearTimeout(_559.ftimer);
+}
+$(_558).tooltip("destroy");
+$(_558)._unbind();
+$(_558).remove();
+};
+function _55a(_55b){
+var opts=$.data(_55b,"validatebox").options;
+$(_55b)._unbind(".validatebox");
+if(opts.novalidate||opts.disabled){
+return;
+}
+for(var _55c in opts.events){
+$(_55b)._bind(_55c+".validatebox",{target:_55b},opts.events[_55c]);
+}
+};
+function _55d(e){
+var _55e=e.data.target;
+var _55f=$.data(_55e,"validatebox");
+var opts=_55f.options;
+if($(_55e).attr("readonly")){
+return;
+}
+_55f.validating=true;
+_55f.value=opts.val(_55e);
+(function(){
+if(!$(_55e).is(":visible")){
+_55f.validating=false;
+}
+if(_55f.validating){
+var _560=opts.val(_55e);
+if(_55f.value!=_560){
+_55f.value=_560;
+if(_55f.vtimer){
+clearTimeout(_55f.vtimer);
+}
+_55f.vtimer=setTimeout(function(){
+$(_55e).validatebox("validate");
+},opts.delay);
+}else{
+if(_55f.message){
+opts.err(_55e,_55f.message);
+}
+}
+_55f.ftimer=setTimeout(arguments.callee,opts.interval);
+}
+})();
+};
+function _561(e){
+var _562=e.data.target;
+var _563=$.data(_562,"validatebox");
+var opts=_563.options;
+_563.validating=false;
+if(_563.vtimer){
+clearTimeout(_563.vtimer);
+_563.vtimer=undefined;
+}
+if(_563.ftimer){
+clearTimeout(_563.ftimer);
+_563.ftimer=undefined;
+}
+if(opts.validateOnBlur){
+setTimeout(function(){
+$(_562).validatebox("validate");
+},0);
+}
+opts.err(_562,_563.message,"hide");
+};
+function _564(e){
+var _565=e.data.target;
+var _566=$.data(_565,"validatebox");
+_566.options.err(_565,_566.message,"show");
+};
+function _567(e){
+var _568=e.data.target;
+var _569=$.data(_568,"validatebox");
+if(!_569.validating){
+_569.options.err(_568,_569.message,"hide");
+}
+};
+function _56a(_56b,_56c,_56d){
+var _56e=$.data(_56b,"validatebox");
+var opts=_56e.options;
+var t=$(_56b);
+if(_56d=="hide"||!_56c){
+t.tooltip("hide");
+}else{
+if((t.is(":focus")&&_56e.validating)||_56d=="show"){
+t.tooltip($.extend({},opts.tipOptions,{content:_56c,position:opts.tipPosition,deltaX:opts.deltaX,deltaY:opts.deltaY})).tooltip("show");
+}
+}
+};
+function _56f(_570){
+var _571=$.data(_570,"validatebox");
+var opts=_571.options;
+var box=$(_570);
+opts.onBeforeValidate.call(_570);
+var _572=_573();
+_572?box.removeClass("validatebox-invalid"):box.addClass("validatebox-invalid");
+opts.err(_570,_571.message);
+opts.onValidate.call(_570,_572);
+return _572;
+function _574(msg){
+_571.message=msg;
+};
+function _575(_576,_577){
+var _578=opts.val(_570);
+var _579=/([a-zA-Z_]+)(.*)/.exec(_576);
+var rule=opts.rules[_579[1]];
+if(rule&&_578){
+var _57a=_577||opts.validParams||eval(_579[2]);
+if(!rule["validator"].call(_570,_578,_57a)){
+var _57b=rule["message"];
+if(_57a){
+for(var i=0;i<_57a.length;i++){
+_57b=_57b.replace(new RegExp("\\{"+i+"\\}","g"),_57a[i]);
+}
+}
+_574(opts.invalidMessage||_57b);
+return false;
+}
+}
+return true;
+};
+function _573(){
+_574("");
+if(!opts._validateOnCreate){
+setTimeout(function(){
+opts._validateOnCreate=true;
+},0);
+return true;
+}
+if(opts.novalidate||opts.disabled){
+return true;
+}
+if(opts.required){
+if(opts.val(_570)==""){
+_574(opts.missingMessage);
+return false;
+}
+}
+if(opts.validType){
+if($.isArray(opts.validType)){
+for(var i=0;i<opts.validType.length;i++){
+if(!_575(opts.validType[i])){
+return false;
+}
+}
+}else{
+if(typeof opts.validType=="string"){
+if(!_575(opts.validType)){
+return false;
+}
+}else{
+for(var _57c in opts.validType){
+var _57d=opts.validType[_57c];
+if(!_575(_57c,_57d)){
+return false;
+}
+}
+}
+}
+}
+return true;
+};
+};
+function _57e(_57f,_580){
+var opts=$.data(_57f,"validatebox").options;
+if(_580!=undefined){
+opts.disabled=_580;
+}
+if(opts.disabled){
+$(_57f).addClass("validatebox-disabled")._propAttr("disabled",true);
+}else{
+$(_57f).removeClass("validatebox-disabled")._propAttr("disabled",false);
+}
+};
+function _581(_582,mode){
+var opts=$.data(_582,"validatebox").options;
+opts.readonly=mode==undefined?true:mode;
+if(opts.readonly||!opts.editable){
+$(_582).triggerHandler("blur.validatebox");
+$(_582).addClass("validatebox-readonly")._propAttr("readonly",true);
+}else{
+$(_582).removeClass("validatebox-readonly")._propAttr("readonly",false);
+}
+};
+$.fn.validatebox=function(_583,_584){
+if(typeof _583=="string"){
+return $.fn.validatebox.methods[_583](this,_584);
+}
+_583=_583||{};
+return this.each(function(){
+var _585=$.data(this,"validatebox");
+if(_585){
+$.extend(_585.options,_583);
+}else{
+init(this);
+_585=$.data(this,"validatebox",{options:$.extend({},$.fn.validatebox.defaults,$.fn.validatebox.parseOptions(this),_583)});
+}
+_585.options._validateOnCreate=_585.options.validateOnCreate;
+_57e(this,_585.options.disabled);
+_581(this,_585.options.readonly);
+_55a(this);
+_56f(this);
+});
+};
+$.fn.validatebox.methods={options:function(jq){
+return $.data(jq[0],"validatebox").options;
+},destroy:function(jq){
+return jq.each(function(){
+_557(this);
+});
+},validate:function(jq){
+return jq.each(function(){
+_56f(this);
+});
+},isValid:function(jq){
+return _56f(jq[0]);
+},enableValidation:function(jq){
+return jq.each(function(){
+$(this).validatebox("options").novalidate=false;
+_55a(this);
+_56f(this);
+});
+},disableValidation:function(jq){
+return jq.each(function(){
+$(this).validatebox("options").novalidate=true;
+_55a(this);
+_56f(this);
+});
+},resetValidation:function(jq){
+return jq.each(function(){
+var opts=$(this).validatebox("options");
+opts._validateOnCreate=opts.validateOnCreate;
+_56f(this);
+});
+},enable:function(jq){
+return jq.each(function(){
+_57e(this,false);
+_55a(this);
+_56f(this);
+});
+},disable:function(jq){
+return jq.each(function(){
+_57e(this,true);
+_55a(this);
+_56f(this);
+});
+},readonly:function(jq,mode){
+return jq.each(function(){
+_581(this,mode);
+_55a(this);
+_56f(this);
+});
+}};
+$.fn.validatebox.parseOptions=function(_586){
+var t=$(_586);
+return $.extend({},$.parser.parseOptions(_586,["validType","missingMessage","invalidMessage","tipPosition",{delay:"number",interval:"number",deltaX:"number"},{editable:"boolean",validateOnCreate:"boolean",validateOnBlur:"boolean"}]),{required:(t.attr("required")?true:undefined),disabled:(t.attr("disabled")?true:undefined),readonly:(t.attr("readonly")?true:undefined),novalidate:(t.attr("novalidate")!=undefined?true:undefined)});
+};
+$.fn.validatebox.defaults={required:false,validType:null,validParams:null,delay:200,interval:200,missingMessage:"This field is required.",invalidMessage:null,tipPosition:"right",deltaX:0,deltaY:0,novalidate:false,editable:true,disabled:false,readonly:false,validateOnCreate:true,validateOnBlur:false,events:{focus:_55d,blur:_561,mouseenter:_564,mouseleave:_567,click:function(e){
+var t=$(e.data.target);
+if(t.attr("type")=="checkbox"||t.attr("type")=="radio"){
+t.focus().validatebox("validate");
+}
+}},val:function(_587){
+return $(_587).val();
+},err:function(_588,_589,_58a){
+_56a(_588,_589,_58a);
+},tipOptions:{showEvent:"none",hideEvent:"none",showDelay:0,hideDelay:0,zIndex:"",onShow:function(){
+$(this).tooltip("tip").css({color:"#000",borderColor:"#CC9933",backgroundColor:"#FFFFCC"});
+},onHide:function(){
+$(this).tooltip("destroy");
+}},rules:{email:{validator:function(_58b){
+return /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test(_58b);
+},message:"Please enter a valid email address."},url:{validator:function(_58c){
+return /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(_58c);
+},message:"Please enter a valid URL."},length:{validator:function(_58d,_58e){
+var len=$.trim(_58d).length;
+return len>=_58e[0]&&len<=_58e[1];
+},message:"Please enter a value between {0} and {1}."},remote:{validator:function(_58f,_590){
+var data={};
+data[_590[1]]=_58f;
+var _591=$.ajax({url:_590[0],dataType:"json",data:data,async:false,cache:false,type:"post"}).responseText;
+return _591.replace(/\s/g,"")=="true";
+},message:"Please fix this field."}},onBeforeValidate:function(){
+},onValidate:function(_592){
+}};
+})(jQuery);
+(function($){
+var _593=0;
+function init(_594){
+$(_594).addClass("textbox-f").hide();
+var span=$("<span class=\"textbox\">"+"<input class=\"textbox-text\" autocomplete=\"off\">"+"<input type=\"hidden\" class=\"textbox-value\">"+"</span>").insertAfter(_594);
+var name=$(_594).attr("name");
+if(name){
+span.find("input.textbox-value").attr("name",name);
+$(_594).removeAttr("name").attr("textboxName",name);
+}
+return span;
+};
+function _595(_596){
+var _597=$.data(_596,"textbox");
+var opts=_597.options;
+var tb=_597.textbox;
+var _598="_easyui_textbox_input"+(++_593);
+tb.addClass(opts.cls);
+tb.find(".textbox-text").remove();
+if(opts.multiline){
+$("<textarea id=\""+_598+"\" class=\"textbox-text\" autocomplete=\"off\"></textarea>").prependTo(tb);
+}else{
+$("<input id=\""+_598+"\" type=\""+opts.type+"\" class=\"textbox-text\" autocomplete=\"off\">").prependTo(tb);
+}
+$("#"+_598).attr("tabindex",$(_596).attr("tabindex")||"").css("text-align",_596.style.textAlign||"");
+tb.find(".textbox-addon").remove();
+var bb=opts.icons?$.extend(true,[],opts.icons):[];
+if(opts.iconCls){
+bb.push({iconCls:opts.iconCls,disabled:true});
+}
+if(bb.length){
+var bc=$("<span class=\"textbox-addon\"></span>").prependTo(tb);
+bc.addClass("textbox-addon-"+opts.iconAlign);
+for(var i=0;i<bb.length;i++){
+bc.append("<a href=\"javascript:;\" class=\"textbox-icon "+bb[i].iconCls+"\" icon-index=\""+i+"\" tabindex=\"-1\"></a>");
+}
+}
+tb.find(".textbox-button").remove();
+if(opts.buttonText||opts.buttonIcon){
+var btn=$("<a href=\"javascript:;\" class=\"textbox-button\"></a>").prependTo(tb);
+btn.addClass("textbox-button-"+opts.buttonAlign).linkbutton({text:opts.buttonText,iconCls:opts.buttonIcon,onClick:function(){
+var t=$(this).parent().prev();
+t.textbox("options").onClickButton.call(t[0]);
+}});
+}
+if(opts.label){
+if(typeof opts.label=="object"){
+_597.label=$(opts.label);
+_597.label.attr("for",_598);
+}else{
+$(_597.label).remove();
+_597.label=$("<label class=\"textbox-label\"></label>").html(opts.label);
+_597.label.css("textAlign",opts.labelAlign).attr("for",_598);
+if(opts.labelPosition=="after"){
+_597.label.insertAfter(tb);
+}else{
+_597.label.insertBefore(_596);
+}
+_597.label.removeClass("textbox-label-left textbox-label-right textbox-label-top");
+_597.label.addClass("textbox-label-"+opts.labelPosition);
+}
+}else{
+$(_597.label).remove();
+}
+_599(_596);
+_59a(_596,opts.disabled);
+_59b(_596,opts.readonly);
+};
+function _59c(_59d){
+var _59e=$.data(_59d,"textbox");
+var tb=_59e.textbox;
+tb.find(".textbox-text").validatebox("destroy");
+tb.remove();
+$(_59e.label).remove();
+$(_59d).remove();
+};
+function _59f(_5a0,_5a1){
+var _5a2=$.data(_5a0,"textbox");
+var opts=_5a2.options;
+var tb=_5a2.textbox;
+var _5a3=tb.parent();
+if(_5a1){
+if(typeof _5a1=="object"){
+$.extend(opts,_5a1);
+}else{
+opts.width=_5a1;
+}
+}
+if(isNaN(parseInt(opts.width))){
+var c=$(_5a0).clone();
+c.css("visibility","hidden");
+c.insertAfter(_5a0);
+opts.width=c.outerWidth();
+c.remove();
+}
+var _5a4=tb.is(":visible");
+if(!_5a4){
+tb.appendTo("body");
+}
+var _5a5=tb.find(".textbox-text");
+var btn=tb.find(".textbox-button");
+var _5a6=tb.find(".textbox-addon");
+var _5a7=_5a6.find(".textbox-icon");
+if(opts.height=="auto"){
+_5a5.css({margin:"",paddingTop:"",paddingBottom:"",height:"",lineHeight:""});
+}
+tb._size(opts,_5a3);
+if(opts.label&&opts.labelPosition){
+if(opts.labelPosition=="top"){
+_5a2.label._size({width:opts.labelWidth=="auto"?tb.outerWidth():opts.labelWidth},tb);
+if(opts.height!="auto"){
+tb._size("height",tb.outerHeight()-_5a2.label.outerHeight());
+}
+}else{
+_5a2.label._size({width:opts.labelWidth,height:tb.outerHeight()},tb);
+if(!opts.multiline){
+_5a2.label.css("lineHeight",_5a2.label.height()+"px");
+}
+tb._size("width",tb.outerWidth()-_5a2.label.outerWidth());
+}
+}
+if(opts.buttonAlign=="left"||opts.buttonAlign=="right"){
+btn.linkbutton("resize",{height:tb.height()});
+}else{
+btn.linkbutton("resize",{width:"100%"});
+}
+var _5a8=tb.width()-_5a7.length*opts.iconWidth-_5a9("left")-_5a9("right");
+var _5aa=opts.height=="auto"?_5a5.outerHeight():(tb.height()-_5a9("top")-_5a9("bottom"));
+_5a6.css(opts.iconAlign,_5a9(opts.iconAlign)+"px");
+_5a6.css("top",_5a9("top")+"px");
+_5a7.css({width:opts.iconWidth+"px",height:_5aa+"px"});
+_5a5.css({paddingLeft:(_5a0.style.paddingLeft||""),paddingRight:(_5a0.style.paddingRight||""),marginLeft:_5ab("left"),marginRight:_5ab("right"),marginTop:_5a9("top"),marginBottom:_5a9("bottom")});
+if(opts.multiline){
+_5a5.css({paddingTop:(_5a0.style.paddingTop||""),paddingBottom:(_5a0.style.paddingBottom||"")});
+_5a5._outerHeight(_5aa);
+}else{
+_5a5.css({paddingTop:0,paddingBottom:0,height:_5aa+"px",lineHeight:_5aa+"px"});
+}
+_5a5._outerWidth(_5a8);
+opts.onResizing.call(_5a0,opts.width,opts.height);
+if(!_5a4){
+tb.insertAfter(_5a0);
+}
+opts.onResize.call(_5a0,opts.width,opts.height);
+function _5ab(_5ac){
+return (opts.iconAlign==_5ac?_5a6._outerWidth():0)+_5a9(_5ac);
+};
+function _5a9(_5ad){
+var w=0;
+btn.filter(".textbox-button-"+_5ad).each(function(){
+if(_5ad=="left"||_5ad=="right"){
+w+=$(this).outerWidth();
+}else{
+w+=$(this).outerHeight();
+}
+});
+return w;
+};
+};
+function _599(_5ae){
+var opts=$(_5ae).textbox("options");
+var _5af=$(_5ae).textbox("textbox");
+_5af.validatebox($.extend({},opts,{deltaX:function(_5b0){
+return $(_5ae).textbox("getTipX",_5b0);
+},deltaY:function(_5b1){
+return $(_5ae).textbox("getTipY",_5b1);
+},onBeforeValidate:function(){
+opts.onBeforeValidate.call(_5ae);
+var box=$(this);
+if(!box.is(":focus")){
+if(box.val()!==opts.value){
+opts.oldInputValue=box.val();
+box.val(opts.value);
+}
+}
+},onValidate:function(_5b2){
+var box=$(this);
+if(opts.oldInputValue!=undefined){
+box.val(opts.oldInputValue);
+opts.oldInputValue=undefined;
+}
+var tb=box.parent();
+if(_5b2){
+tb.removeClass("textbox-invalid");
+}else{
+tb.addClass("textbox-invalid");
+}
+opts.onValidate.call(_5ae,_5b2);
+}}));
+};
+function _5b3(_5b4){
+var _5b5=$.data(_5b4,"textbox");
+var opts=_5b5.options;
+var tb=_5b5.textbox;
+var _5b6=tb.find(".textbox-text");
+_5b6.attr("placeholder",opts.prompt);
+_5b6._unbind(".textbox");
+$(_5b5.label)._unbind(".textbox");
+if(!opts.disabled&&!opts.readonly){
+if(_5b5.label){
+$(_5b5.label)._bind("click.textbox",function(e){
+if(!opts.hasFocusMe){
+_5b6.focus();
+$(_5b4).textbox("setSelectionRange",{start:0,end:_5b6.val().length});
+}
+});
+}
+_5b6._bind("blur.textbox",function(e){
+if(!tb.hasClass("textbox-focused")){
+return;
+}
+opts.value=$(this).val();
+if(opts.value==""){
+$(this).val(opts.prompt).addClass("textbox-prompt");
+}else{
+$(this).removeClass("textbox-prompt");
+}
+tb.removeClass("textbox-focused");
+tb.closest(".form-field").removeClass("form-field-focused");
+})._bind("focus.textbox",function(e){
+opts.hasFocusMe=true;
+if(tb.hasClass("textbox-focused")){
+return;
+}
+if($(this).val()!=opts.value){
+$(this).val(opts.value);
+}
+$(this).removeClass("textbox-prompt");
+tb.addClass("textbox-focused");
+tb.closest(".form-field").addClass("form-field-focused");
+});
+for(var _5b7 in opts.inputEvents){
+_5b6._bind(_5b7+".textbox",{target:_5b4},opts.inputEvents[_5b7]);
+}
+}
+var _5b8=tb.find(".textbox-addon");
+_5b8._unbind()._bind("click",{target:_5b4},function(e){
+var icon=$(e.target).closest("a.textbox-icon:not(.textbox-icon-disabled)");
+if(icon.length){
+var _5b9=parseInt(icon.attr("icon-index"));
+var conf=opts.icons[_5b9];
+if(conf&&conf.handler){
+conf.handler.call(icon[0],e);
+}
+opts.onClickIcon.call(_5b4,_5b9);
+}
+});
+_5b8.find(".textbox-icon").each(function(_5ba){
+var conf=opts.icons[_5ba];
+var icon=$(this);
+if(!conf||conf.disabled||opts.disabled||opts.readonly){
+icon.addClass("textbox-icon-disabled");
+}else{
+icon.removeClass("textbox-icon-disabled");
+}
+});
+var btn=tb.find(".textbox-button");
+btn.linkbutton((opts.disabled||opts.readonly)?"disable":"enable");
+tb._unbind(".textbox")._bind("_resize.textbox",function(e,_5bb){
+if($(this).hasClass("easyui-fluid")||_5bb){
+_59f(_5b4);
+}
+return false;
+});
+};
+function _59a(_5bc,_5bd){
+var _5be=$.data(_5bc,"textbox");
+var opts=_5be.options;
+var tb=_5be.textbox;
+var _5bf=tb.find(".textbox-text");
+var ss=$(_5bc).add(tb.find(".textbox-value"));
+opts.disabled=_5bd;
+if(opts.disabled){
+_5bf.blur();
+_5bf.validatebox("disable");
+tb.addClass("textbox-disabled");
+ss._propAttr("disabled",true);
+$(_5be.label).addClass("textbox-label-disabled");
+}else{
+_5bf.validatebox("enable");
+tb.removeClass("textbox-disabled");
+ss._propAttr("disabled",false);
+$(_5be.label).removeClass("textbox-label-disabled");
+}
+};
+function _59b(_5c0,mode){
+var _5c1=$.data(_5c0,"textbox");
+var opts=_5c1.options;
+var tb=_5c1.textbox;
+var _5c2=tb.find(".textbox-text");
+opts.readonly=mode==undefined?true:mode;
+if(opts.readonly){
+_5c2.triggerHandler("blur.textbox");
+}
+_5c2.validatebox("readonly",opts.readonly);
+if(opts.readonly){
+tb.addClass("textbox-readonly");
+$(_5c1.label).addClass("textbox-label-readonly");
+}else{
+tb.removeClass("textbox-readonly");
+$(_5c1.label).removeClass("textbox-label-readonly");
+}
+};
+$.fn.textbox=function(_5c3,_5c4){
+if(typeof _5c3=="string"){
+var _5c5=$.fn.textbox.methods[_5c3];
+if(_5c5){
+return _5c5(this,_5c4);
+}else{
+return this.each(function(){
+var _5c6=$(this).textbox("textbox");
+_5c6.validatebox(_5c3,_5c4);
+});
+}
+}
+_5c3=_5c3||{};
+return this.each(function(){
+var _5c7=$.data(this,"textbox");
+if(_5c7){
+$.extend(_5c7.options,_5c3);
+if(_5c3.value!=undefined){
+_5c7.options.originalValue=_5c3.value;
+}
+}else{
+_5c7=$.data(this,"textbox",{options:$.extend({},$.fn.textbox.defaults,$.fn.textbox.parseOptions(this),_5c3),textbox:init(this)});
+_5c7.options.originalValue=_5c7.options.value;
+}
+_595(this);
+_5b3(this);
+if(_5c7.options.doSize){
+_59f(this);
+}
+var _5c8=_5c7.options.value;
+_5c7.options.value="";
+$(this).textbox("initValue",_5c8);
+});
+};
+$.fn.textbox.methods={options:function(jq){
+return $.data(jq[0],"textbox").options;
+},cloneFrom:function(jq,from){
+return jq.each(function(){
+var t=$(this);
+if(t.data("textbox")){
+return;
+}
+if(!$(from).data("textbox")){
+$(from).textbox();
+}
+var opts=$.extend(true,{},$(from).textbox("options"));
+var name=t.attr("name")||"";
+t.addClass("textbox-f").hide();
+t.removeAttr("name").attr("textboxName",name);
+var span=$(from).next().clone().insertAfter(t);
+var _5c9="_easyui_textbox_input"+(++_593);
+span.find(".textbox-value").attr("name",name);
+span.find(".textbox-text").attr("id",_5c9);
+var _5ca=$($(from).textbox("label")).clone();
+if(_5ca.length){
+_5ca.attr("for",_5c9);
+if(opts.labelPosition=="after"){
+_5ca.insertAfter(t.next());
+}else{
+_5ca.insertBefore(t);
+}
+}
+$.data(this,"textbox",{options:opts,textbox:span,label:(_5ca.length?_5ca:undefined)});
+var _5cb=$(from).textbox("button");
+if(_5cb.length){
+t.textbox("button").linkbutton($.extend(true,{},_5cb.linkbutton("options")));
+}
+_5b3(this);
+_599(this);
+});
+},textbox:function(jq){
+return $.data(jq[0],"textbox").textbox.find(".textbox-text");
+},button:function(jq){
+return $.data(jq[0],"textbox").textbox.find(".textbox-button");
+},label:function(jq){
+return $.data(jq[0],"textbox").label;
+},destroy:function(jq){
+return jq.each(function(){
+_59c(this);
+});
+},resize:function(jq,_5cc){
+return jq.each(function(){
+_59f(this,_5cc);
+});
+},disable:function(jq){
+return jq.each(function(){
+_59a(this,true);
+_5b3(this);
+});
+},enable:function(jq){
+return jq.each(function(){
+_59a(this,false);
+_5b3(this);
+});
+},readonly:function(jq,mode){
+return jq.each(function(){
+_59b(this,mode);
+_5b3(this);
+});
+},isValid:function(jq){
+return jq.textbox("textbox").validatebox("isValid");
+},clear:function(jq){
+return jq.each(function(){
+$(this).textbox("setValue","");
+});
+},setText:function(jq,_5cd){
+return jq.each(function(){
+var opts=$(this).textbox("options");
+var _5ce=$(this).textbox("textbox");
+_5cd=_5cd==undefined?"":String(_5cd);
+if($(this).textbox("getText")!=_5cd){
+_5ce.val(_5cd);
+}
+opts.value=_5cd;
+if(!_5ce.is(":focus")){
+if(_5cd){
+_5ce.removeClass("textbox-prompt");
+}else{
+_5ce.val(opts.prompt).addClass("textbox-prompt");
+}
+}
+if(opts.value){
+$(this).closest(".form-field").removeClass("form-field-empty");
+}else{
+$(this).closest(".form-field").addClass("form-field-empty");
+}
+$(this).textbox("validate");
+});
+},initValue:function(jq,_5cf){
+return jq.each(function(){
+var _5d0=$.data(this,"textbox");
+$(this).textbox("setText",_5cf);
+_5d0.textbox.find(".textbox-value").val(_5cf);
+$(this).val(_5cf);
+});
+},setValue:function(jq,_5d1){
+return jq.each(function(){
+var opts=$.data(this,"textbox").options;
+var _5d2=$(this).textbox("getValue");
+$(this).textbox("initValue",_5d1);
+if(_5d2!=_5d1){
+opts.onChange.call(this,_5d1,_5d2);
+$(this).closest("form").trigger("_change",[this]);
+}
+});
+},getText:function(jq){
+var _5d3=jq.textbox("textbox");
+if(_5d3.is(":focus")){
+return _5d3.val();
+}else{
+return jq.textbox("options").value;
+}
+},getValue:function(jq){
+return jq.data("textbox").textbox.find(".textbox-value").val();
+},reset:function(jq){
+return jq.each(function(){
+var opts=$(this).textbox("options");
+$(this).textbox("textbox").val(opts.originalValue);
+$(this).textbox("setValue",opts.originalValue);
+});
+},getIcon:function(jq,_5d4){
+return jq.data("textbox").textbox.find(".textbox-icon:eq("+_5d4+")");
+},getTipX:function(jq,_5d5){
+var _5d6=jq.data("textbox");
+var opts=_5d6.options;
+var tb=_5d6.textbox;
+var _5d7=tb.find(".textbox-text");
+var _5d5=_5d5||opts.tipPosition;
+var p1=tb.offset();
+var p2=_5d7.offset();
+var w1=tb.outerWidth();
+var w2=_5d7.outerWidth();
+if(_5d5=="right"){
+return w1-w2-p2.left+p1.left;
+}else{
+if(_5d5=="left"){
+return p1.left-p2.left;
+}else{
+return (w1-w2-p2.left+p1.left)/2-(p2.left-p1.left)/2;
+}
+}
+},getTipY:function(jq,_5d8){
+var _5d9=jq.data("textbox");
+var opts=_5d9.options;
+var tb=_5d9.textbox;
+var _5da=tb.find(".textbox-text");
+var _5d8=_5d8||opts.tipPosition;
+var p1=tb.offset();
+var p2=_5da.offset();
+var h1=tb.outerHeight();
+var h2=_5da.outerHeight();
+if(_5d8=="left"||_5d8=="right"){
+return (h1-h2-p2.top+p1.top)/2-(p2.top-p1.top)/2;
+}else{
+if(_5d8=="bottom"){
+return (h1-h2-p2.top+p1.top);
+}else{
+return (p1.top-p2.top);
+}
+}
+},getSelectionStart:function(jq){
+return jq.textbox("getSelectionRange").start;
+},getSelectionRange:function(jq){
+var _5db=jq.textbox("textbox")[0];
+var _5dc=0;
+var end=0;
+if(typeof _5db.selectionStart=="number"){
+_5dc=_5db.selectionStart;
+end=_5db.selectionEnd;
+}else{
+if(_5db.createTextRange){
+var s=document.selection.createRange();
+var _5dd=_5db.createTextRange();
+_5dd.setEndPoint("EndToStart",s);
+_5dc=_5dd.text.length;
+end=_5dc+s.text.length;
+}
+}
+return {start:_5dc,end:end};
+},setSelectionRange:function(jq,_5de){
+return jq.each(function(){
+var _5df=$(this).textbox("textbox")[0];
+var _5e0=_5de.start;
+var end=_5de.end;
+if(_5df.setSelectionRange){
+_5df.setSelectionRange(_5e0,end);
+}else{
+if(_5df.createTextRange){
+var _5e1=_5df.createTextRange();
+_5e1.collapse();
+_5e1.moveEnd("character",end);
+_5e1.moveStart("character",_5e0);
+_5e1.select();
+}
+}
+});
+},show:function(jq){
+return jq.each(function(){
+$(this).next().show();
+$($(this).textbox("label")).show();
+});
+},hide:function(jq){
+return jq.each(function(){
+$(this).next().hide();
+$($(this).textbox("label")).hide();
+});
+}};
+$.fn.textbox.parseOptions=function(_5e2){
+var t=$(_5e2);
+return $.extend({},$.fn.validatebox.parseOptions(_5e2),$.parser.parseOptions(_5e2,["prompt","iconCls","iconAlign","buttonText","buttonIcon","buttonAlign","label","labelPosition","labelAlign",{multiline:"boolean",iconWidth:"number",labelWidth:"number"}]),{value:(t.val()||undefined),type:(t.attr("type")?t.attr("type"):undefined)});
+};
+$.fn.textbox.defaults=$.extend({},$.fn.validatebox.defaults,{doSize:true,width:"auto",height:"auto",cls:null,prompt:"",value:"",type:"text",multiline:false,icons:[],iconCls:null,iconAlign:"right",iconWidth:26,buttonText:"",buttonIcon:null,buttonAlign:"right",label:null,labelWidth:"auto",labelPosition:"before",labelAlign:"left",inputEvents:{blur:function(e){
+var t=$(e.data.target);
+var opts=t.textbox("options");
+if(t.textbox("getValue")!=opts.value){
+t.textbox("setValue",opts.value);
+}
+},keydown:function(e){
+if(e.keyCode==13){
+var t=$(e.data.target);
+t.textbox("setValue",t.textbox("getText"));
+}
+}},onChange:function(_5e3,_5e4){
+},onResizing:function(_5e5,_5e6){
+},onResize:function(_5e7,_5e8){
+},onClickButton:function(){
+},onClickIcon:function(_5e9){
+}});
+})(jQuery);
+(function($){
+function _5ea(_5eb){
+var _5ec=$.data(_5eb,"passwordbox");
+var opts=_5ec.options;
+var _5ed=$.extend(true,[],opts.icons);
+if(opts.showEye){
+_5ed.push({iconCls:"passwordbox-open",handler:function(e){
+opts.revealed=!opts.revealed;
+_5ee(_5eb);
+}});
+}
+$(_5eb).addClass("passwordbox-f").textbox($.extend({},opts,{icons:_5ed}));
+_5ee(_5eb);
+};
+function _5ef(_5f0,_5f1,all){
+var _5f2=$(_5f0).data("passwordbox");
+var t=$(_5f0);
+var opts=t.passwordbox("options");
+if(opts.revealed){
+t.textbox("setValue",_5f1);
+return;
+}
+_5f2.converting=true;
+var _5f3=unescape(opts.passwordChar);
+var cc=_5f1.split("");
+var vv=t.passwordbox("getValue").split("");
+for(var i=0;i<cc.length;i++){
+var c=cc[i];
+if(c!=vv[i]){
+if(c!=_5f3){
+vv.splice(i,0,c);
+}
+}
+}
+var pos=t.passwordbox("getSelectionStart");
+if(cc.length<vv.length){
+vv.splice(pos,vv.length-cc.length,"");
+}
+for(var i=0;i<cc.length;i++){
+if(all||i!=pos-1){
+cc[i]=_5f3;
+}
+}
+t.textbox("setValue",vv.join(""));
+t.textbox("setText",cc.join(""));
+t.textbox("setSelectionRange",{start:pos,end:pos});
+setTimeout(function(){
+_5f2.converting=false;
+},0);
+};
+function _5ee(_5f4,_5f5){
+var t=$(_5f4);
+var opts=t.passwordbox("options");
+var icon=t.next().find(".passwordbox-open");
+var _5f6=unescape(opts.passwordChar);
+_5f5=_5f5==undefined?t.textbox("getValue"):_5f5;
+t.textbox("setValue",_5f5);
+t.textbox("setText",opts.revealed?_5f5:_5f5.replace(/./ig,_5f6));
+opts.revealed?icon.addClass("passwordbox-close"):icon.removeClass("passwordbox-close");
+};
+function _5f7(e){
+var _5f8=e.data.target;
+var t=$(e.data.target);
+var _5f9=t.data("passwordbox");
+var opts=t.data("passwordbox").options;
+_5f9.checking=true;
+_5f9.value=t.passwordbox("getText");
+(function(){
+if(_5f9.checking){
+var _5fa=t.passwordbox("getText");
+if(_5f9.value!=_5fa){
+_5f9.value=_5fa;
+if(_5f9.lastTimer){
+clearTimeout(_5f9.lastTimer);
+_5f9.lastTimer=undefined;
+}
+_5ef(_5f8,_5fa);
+_5f9.lastTimer=setTimeout(function(){
+_5ef(_5f8,t.passwordbox("getText"),true);
+_5f9.lastTimer=undefined;
+},opts.lastDelay);
+}
+setTimeout(arguments.callee,opts.checkInterval);
+}
+})();
+};
+function _5fb(e){
+var _5fc=e.data.target;
+var _5fd=$(_5fc).data("passwordbox");
+_5fd.checking=false;
+if(_5fd.lastTimer){
+clearTimeout(_5fd.lastTimer);
+_5fd.lastTimer=undefined;
+}
+_5ee(_5fc);
+};
+$.fn.passwordbox=function(_5fe,_5ff){
+if(typeof _5fe=="string"){
+var _600=$.fn.passwordbox.methods[_5fe];
+if(_600){
+return _600(this,_5ff);
+}else{
+return this.textbox(_5fe,_5ff);
+}
+}
+_5fe=_5fe||{};
+return this.each(function(){
+var _601=$.data(this,"passwordbox");
+if(_601){
+$.extend(_601.options,_5fe);
+}else{
+_601=$.data(this,"passwordbox",{options:$.extend({},$.fn.passwordbox.defaults,$.fn.passwordbox.parseOptions(this),_5fe)});
+}
+_5ea(this);
+});
+};
+$.fn.passwordbox.methods={options:function(jq){
+return $.data(jq[0],"passwordbox").options;
+},setValue:function(jq,_602){
+return jq.each(function(){
+_5ee(this,_602);
+});
+},clear:function(jq){
+return jq.each(function(){
+_5ee(this,"");
+});
+},reset:function(jq){
+return jq.each(function(){
+$(this).textbox("reset");
+_5ee(this);
+});
+},showPassword:function(jq){
+return jq.each(function(){
+var opts=$(this).passwordbox("options");
+opts.revealed=true;
+_5ee(this);
+});
+},hidePassword:function(jq){
+return jq.each(function(){
+var opts=$(this).passwordbox("options");
+opts.revealed=false;
+_5ee(this);
+});
+}};
+$.fn.passwordbox.parseOptions=function(_603){
+return $.extend({},$.fn.textbox.parseOptions(_603),$.parser.parseOptions(_603,["passwordChar",{checkInterval:"number",lastDelay:"number",revealed:"boolean",showEye:"boolean"}]));
+};
+$.fn.passwordbox.defaults=$.extend({},$.fn.textbox.defaults,{passwordChar:"%u25CF",checkInterval:200,lastDelay:500,revealed:false,showEye:true,inputEvents:{focus:_5f7,blur:_5fb,keydown:function(e){
+var _604=$(e.data.target).data("passwordbox");
+return !_604.converting;
+}},val:function(_605){
+return $(_605).parent().prev().passwordbox("getValue");
+}});
+})(jQuery);
+(function($){
+function _606(_607){
+var _608=$(_607).data("maskedbox");
+var opts=_608.options;
+$(_607).textbox(opts);
+$(_607).maskedbox("initValue",opts.value);
+};
+function _609(_60a,_60b){
+var opts=$(_60a).maskedbox("options");
+var tt=(_60b||$(_60a).maskedbox("getText")||"").split("");
+var vv=[];
+for(var i=0;i<opts.mask.length;i++){
+if(opts.masks[opts.mask[i]]){
+var t=tt[i];
+vv.push(t!=opts.promptChar?t:" ");
+}
+}
+return vv.join("");
+};
+function _60c(_60d,_60e){
+var opts=$(_60d).maskedbox("options");
+var cc=_60e.split("");
+var tt=[];
+for(var i=0;i<opts.mask.length;i++){
+var m=opts.mask[i];
+var r=opts.masks[m];
+if(r){
+var c=cc.shift();
+if(c!=undefined){
+var d=new RegExp(r,"i");
+if(d.test(c)){
+tt.push(c);
+continue;
+}
+}
+tt.push(opts.promptChar);
+}else{
+tt.push(m);
+}
+}
+return tt.join("");
+};
+function _60f(_610,c){
+var opts=$(_610).maskedbox("options");
+var _611=$(_610).maskedbox("getSelectionRange");
+var _612=_613(_610,_611.start);
+var end=_613(_610,_611.end);
+if(_612!=-1){
+var r=new RegExp(opts.masks[opts.mask[_612]],"i");
+if(r.test(c)){
+var vv=_609(_610).split("");
+var _614=_612-_615(_610,_612);
+var _616=end-_615(_610,end);
+vv.splice(_614,_616-_614,c);
+$(_610).maskedbox("setValue",_60c(_610,vv.join("")));
+_612=_613(_610,++_612);
+$(_610).maskedbox("setSelectionRange",{start:_612,end:_612});
+}
+}
+};
+function _617(_618,_619){
+var opts=$(_618).maskedbox("options");
+var vv=_609(_618).split("");
+var _61a=$(_618).maskedbox("getSelectionRange");
+if(_61a.start==_61a.end){
+if(_619){
+var _61b=_61c(_618,_61a.start);
+}else{
+var _61b=_613(_618,_61a.start);
+}
+var _61d=_61b-_615(_618,_61b);
+if(_61d>=0){
+vv.splice(_61d,1);
+}
+}else{
+var _61b=_613(_618,_61a.start);
+var end=_61c(_618,_61a.end);
+var _61d=_61b-_615(_618,_61b);
+var _61e=end-_615(_618,end);
+vv.splice(_61d,_61e-_61d+1);
+}
+$(_618).maskedbox("setValue",_60c(_618,vv.join("")));
+$(_618).maskedbox("setSelectionRange",{start:_61b,end:_61b});
+};
+function _615(_61f,pos){
+var opts=$(_61f).maskedbox("options");
+var _620=0;
+if(pos>=opts.mask.length){
+pos--;
+}
+for(var i=pos;i>=0;i--){
+if(opts.masks[opts.mask[i]]==undefined){
+_620++;
+}
+}
+return _620;
+};
+function _613(_621,pos){
+var opts=$(_621).maskedbox("options");
+var m=opts.mask[pos];
+var r=opts.masks[m];
+while(pos<opts.mask.length&&!r){
+pos++;
+m=opts.mask[pos];
+r=opts.masks[m];
+}
+return pos;
+};
+function _61c(_622,pos){
+var opts=$(_622).maskedbox("options");
+var m=opts.mask[--pos];
+var r=opts.masks[m];
+while(pos>=0&&!r){
+pos--;
+m=opts.mask[pos];
+r=opts.masks[m];
+}
+return pos<0?0:pos;
+};
+function _623(e){
+if(e.metaKey||e.ctrlKey){
+return;
+}
+var _624=e.data.target;
+var opts=$(_624).maskedbox("options");
+var _625=[9,13,35,36,37,39];
+if($.inArray(e.keyCode,_625)!=-1){
+return true;
+}
+if(e.keyCode>=96&&e.keyCode<=105){
+e.keyCode-=48;
+}
+var c=String.fromCharCode(e.keyCode);
+if(e.keyCode>=65&&e.keyCode<=90&&!e.shiftKey){
+c=c.toLowerCase();
+}else{
+if(e.keyCode==189){
+c="-";
+}else{
+if(e.keyCode==187){
+c="+";
+}else{
+if(e.keyCode==190){
+c=".";
+}
+}
+}
+}
+if(e.keyCode==8){
+_617(_624,true);
+}else{
+if(e.keyCode==46){
+_617(_624,false);
+}else{
+_60f(_624,c);
+}
+}
+return false;
+};
+$.extend($.fn.textbox.methods,{inputMask:function(jq,_626){
+return jq.each(function(){
+var _627=this;
+var opts=$.extend({},$.fn.maskedbox.defaults,_626);
+$.data(_627,"maskedbox",{options:opts});
+var _628=$(_627).textbox("textbox");
+_628._unbind(".maskedbox");
+for(var _629 in opts.inputEvents){
+_628._bind(_629+".maskedbox",{target:_627},opts.inputEvents[_629]);
+}
+});
+}});
+$.fn.maskedbox=function(_62a,_62b){
+if(typeof _62a=="string"){
+var _62c=$.fn.maskedbox.methods[_62a];
+if(_62c){
+return _62c(this,_62b);
+}else{
+return this.textbox(_62a,_62b);
+}
+}
+_62a=_62a||{};
+return this.each(function(){
+var _62d=$.data(this,"maskedbox");
+if(_62d){
+$.extend(_62d.options,_62a);
+}else{
+$.data(this,"maskedbox",{options:$.extend({},$.fn.maskedbox.defaults,$.fn.maskedbox.parseOptions(this),_62a)});
+}
+_606(this);
+});
+};
+$.fn.maskedbox.methods={options:function(jq){
+var opts=jq.textbox("options");
+return $.extend($.data(jq[0],"maskedbox").options,{width:opts.width,value:opts.value,originalValue:opts.originalValue,disabled:opts.disabled,readonly:opts.readonly});
+},initValue:function(jq,_62e){
+return jq.each(function(){
+_62e=_60c(this,_609(this,_62e));
+$(this).textbox("initValue",_62e);
+});
+},setValue:function(jq,_62f){
+return jq.each(function(){
+_62f=_60c(this,_609(this,_62f));
+$(this).textbox("setValue",_62f);
+});
+}};
+$.fn.maskedbox.parseOptions=function(_630){
+var t=$(_630);
+return $.extend({},$.fn.textbox.parseOptions(_630),$.parser.parseOptions(_630,["mask","promptChar"]),{});
+};
+$.fn.maskedbox.defaults=$.extend({},$.fn.textbox.defaults,{mask:"",promptChar:"_",masks:{"9":"[0-9]","a":"[a-zA-Z]","*":"[0-9a-zA-Z]"},inputEvents:{keydown:_623}});
+})(jQuery);
+(function($){
+var _631=0;
+function _632(_633){
+var _634=$.data(_633,"filebox");
+var opts=_634.options;
+opts.fileboxId="filebox_file_id_"+(++_631);
+$(_633).addClass("filebox-f").textbox(opts);
+$(_633).textbox("textbox").attr("readonly","readonly");
+_634.filebox=$(_633).next().addClass("filebox");
+var file=_635(_633);
+var btn=$(_633).filebox("button");
+if(btn.length){
+$("<label class=\"filebox-label\" for=\""+opts.fileboxId+"\"></label>").appendTo(btn);
+if(btn.linkbutton("options").disabled){
+file._propAttr("disabled",true);
+}else{
+file._propAttr("disabled",false);
+}
+}
+};
+function _635(_636){
+var _637=$.data(_636,"filebox");
+var opts=_637.options;
+_637.filebox.find(".textbox-value").remove();
+opts.oldValue="";
+var file=$("<input type=\"file\" class=\"textbox-value\">").appendTo(_637.filebox);
+file.attr("id",opts.fileboxId).attr("name",$(_636).attr("textboxName")||"");
+file.attr("accept",opts.accept);
+file.attr("capture",opts.capture);
+if(opts.multiple){
+file.attr("multiple","multiple");
+}
+file.change(function(){
+var _638=this.value;
+if(this.files){
+_638=$.map(this.files,function(file){
+return file.name;
+}).join(opts.separator);
+}
+$(_636).filebox("setText",_638);
+opts.onChange.call(_636,_638,opts.oldValue);
+opts.oldValue=_638;
+});
+return file;
+};
+$.fn.filebox=function(_639,_63a){
+if(typeof _639=="string"){
+var _63b=$.fn.filebox.methods[_639];
+if(_63b){
+return _63b(this,_63a);
+}else{
+return this.textbox(_639,_63a);
+}
+}
+_639=_639||{};
+return this.each(function(){
+var _63c=$.data(this,"filebox");
+if(_63c){
+$.extend(_63c.options,_639);
+}else{
+$.data(this,"filebox",{options:$.extend({},$.fn.filebox.defaults,$.fn.filebox.parseOptions(this),_639)});
+}
+_632(this);
+});
+};
+$.fn.filebox.methods={options:function(jq){
+var opts=jq.textbox("options");
+return $.extend($.data(jq[0],"filebox").options,{width:opts.width,value:opts.value,originalValue:opts.originalValue,disabled:opts.disabled,readonly:opts.readonly});
+},clear:function(jq){
+return jq.each(function(){
+$(this).textbox("clear");
+_635(this);
+});
+},reset:function(jq){
+return jq.each(function(){
+$(this).filebox("clear");
+});
+},setValue:function(jq){
+return jq;
+},setValues:function(jq){
+return jq;
+},files:function(jq){
+return jq.next().find(".textbox-value")[0].files;
+}};
+$.fn.filebox.parseOptions=function(_63d){
+var t=$(_63d);
+return $.extend({},$.fn.textbox.parseOptions(_63d),$.parser.parseOptions(_63d,["accept","capture","separator"]),{multiple:(t.attr("multiple")?true:undefined)});
+};
+$.fn.filebox.defaults=$.extend({},$.fn.textbox.defaults,{buttonIcon:null,buttonText:"Choose File",buttonAlign:"right",inputEvents:{},accept:"",capture:"",separator:",",multiple:false});
+})(jQuery);
+(function($){
+function _63e(_63f){
+var _640=$.data(_63f,"searchbox");
+var opts=_640.options;
+var _641=$.extend(true,[],opts.icons);
+_641.push({iconCls:"searchbox-button",handler:function(e){
+var t=$(e.data.target);
+var opts=t.searchbox("options");
+opts.searcher.call(e.data.target,t.searchbox("getValue"),t.searchbox("getName"));
+}});
+_642();
+var _643=_644();
+$(_63f).addClass("searchbox-f").textbox($.extend({},opts,{icons:_641,buttonText:(_643?_643.text:"")}));
+$(_63f).attr("searchboxName",$(_63f).attr("textboxName"));
+_640.searchbox=$(_63f).next();
+_640.searchbox.addClass("searchbox");
+_645(_643);
+function _642(){
+if(opts.menu){
+_640.menu=$(opts.menu).menu();
+var _646=_640.menu.menu("options");
+var _647=_646.onClick;
+_646.onClick=function(item){
+_645(item);
+_647.call(this,item);
+};
+}else{
+if(_640.menu){
+_640.menu.menu("destroy");
+}
+_640.menu=null;
+}
+};
+function _644(){
+if(_640.menu){
+var item=_640.menu.children("div.menu-item:first");
+_640.menu.children("div.menu-item").each(function(){
+var _648=$.extend({},$.parser.parseOptions(this),{selected:($(this).attr("selected")?true:undefined)});
+if(_648.selected){
+item=$(this);
+return false;
+}
+});
+return _640.menu.menu("getItem",item[0]);
+}else{
+return null;
+}
+};
+function _645(item){
+if(!item){
+return;
+}
+$(_63f).textbox("button").menubutton({text:item.text,iconCls:(item.iconCls||null),menu:_640.menu,menuAlign:opts.buttonAlign,plain:false});
+_640.searchbox.find("input.textbox-value").attr("name",item.name||item.text);
+$(_63f).searchbox("resize");
+};
+};
+$.fn.searchbox=function(_649,_64a){
+if(typeof _649=="string"){
+var _64b=$.fn.searchbox.methods[_649];
+if(_64b){
+return _64b(this,_64a);
+}else{
+return this.textbox(_649,_64a);
+}
+}
+_649=_649||{};
+return this.each(function(){
+var _64c=$.data(this,"searchbox");
+if(_64c){
+$.extend(_64c.options,_649);
+}else{
+$.data(this,"searchbox",{options:$.extend({},$.fn.searchbox.defaults,$.fn.searchbox.parseOptions(this),_649)});
+}
+_63e(this);
+});
+};
+$.fn.searchbox.methods={options:function(jq){
+var opts=jq.textbox("options");
+return $.extend($.data(jq[0],"searchbox").options,{width:opts.width,value:opts.value,originalValue:opts.originalValue,disabled:opts.disabled,readonly:opts.readonly});
+},menu:function(jq){
+return $.data(jq[0],"searchbox").menu;
+},getName:function(jq){
+return $.data(jq[0],"searchbox").searchbox.find("input.textbox-value").attr("name");
+},selectName:function(jq,name){
+return jq.each(function(){
+var menu=$.data(this,"searchbox").menu;
+if(menu){
+menu.children("div.menu-item").each(function(){
+var item=menu.menu("getItem",this);
+if(item.name==name){
+$(this).trigger("click");
+return false;
+}
+});
+}
+});
+},destroy:function(jq){
+return jq.each(function(){
+var menu=$(this).searchbox("menu");
+if(menu){
+menu.menu("destroy");
+}
+$(this).textbox("destroy");
+});
+}};
+$.fn.searchbox.parseOptions=function(_64d){
+var t=$(_64d);
+return $.extend({},$.fn.textbox.parseOptions(_64d),$.parser.parseOptions(_64d,["menu"]),{searcher:(t.attr("searcher")?eval(t.attr("searcher")):undefined)});
+};
+$.fn.searchbox.defaults=$.extend({},$.fn.textbox.defaults,{inputEvents:$.extend({},$.fn.textbox.defaults.inputEvents,{keydown:function(e){
+if(e.keyCode==13){
+e.preventDefault();
+var t=$(e.data.target);
+var opts=t.searchbox("options");
+t.searchbox("setValue",$(this).val());
+opts.searcher.call(e.data.target,t.searchbox("getValue"),t.searchbox("getName"));
+return false;
+}
+}}),buttonAlign:"left",menu:null,searcher:function(_64e,name){
+}});
+})(jQuery);
+(function($){
+function _64f(_650,_651){
+var opts=$.data(_650,"form").options;
+$.extend(opts,_651||{});
+var _652=$.extend({},opts.queryParams);
+if(opts.onSubmit.call(_650,_652)==false){
+return;
+}
+var _653=$(_650).find(".textbox-text:focus");
+_653.triggerHandler("blur");
+_653.focus();
+var _654=null;
+if(opts.dirty){
+var ff=[];
+$.map(opts.dirtyFields,function(f){
+if($(f).hasClass("textbox-f")){
+$(f).next().find(".textbox-value").each(function(){
+ff.push(this);
+});
+}else{
+ff.push(f);
+}
+});
+_654=$(_650).find("input[name]:enabled,textarea[name]:enabled,select[name]:enabled").filter(function(){
+return $.inArray(this,ff)==-1;
+});
+_654._propAttr("disabled",true);
+}
+if(opts.ajax){
+if(opts.iframe){
+_655(_650,_652);
+}else{
+if(window.FormData!==undefined){
+_656(_650,_652);
+}else{
+_655(_650,_652);
+}
+}
+}else{
+$(_650).submit();
+}
+if(opts.dirty){
+_654._propAttr("disabled",false);
+}
+};
+function _655(_657,_658){
+var opts=$.data(_657,"form").options;
+var _659="easyui_frame_"+(new Date().getTime());
+var _65a=$("<iframe id="+_659+" name="+_659+"></iframe>").appendTo("body");
+_65a.attr("src",window.ActiveXObject?"javascript:false":"about:blank");
+_65a.css({position:"absolute",top:-1000,left:-1000});
+_65a.bind("load",cb);
+_65b(_658);
+function _65b(_65c){
+var form=$(_657);
+if(opts.url){
+form.attr("action",opts.url);
+}
+var t=form.attr("target"),a=form.attr("action");
+form.attr("target",_659);
+var _65d=$();
+try{
+for(var n in _65c){
+var _65e=$("<input type=\"hidden\" name=\""+n+"\">").val(_65c[n]).appendTo(form);
+_65d=_65d.add(_65e);
+}
+_65f();
+form[0].submit();
+}
+finally{
+form.attr("action",a);
+t?form.attr("target",t):form.removeAttr("target");
+_65d.remove();
+}
+};
+function _65f(){
+var f=$("#"+_659);
+if(!f.length){
+return;
+}
+try{
+var s=f.contents()[0].readyState;
+if(s&&s.toLowerCase()=="uninitialized"){
+setTimeout(_65f,100);
+}
+}
+catch(e){
+cb();
+}
+};
+var _660=10;
+function cb(){
+var f=$("#"+_659);
+if(!f.length){
+return;
+}
+f.unbind();
+var data="";
+try{
+var body=f.contents().find("body");
+data=body.html();
+if(data==""){
+if(--_660){
+setTimeout(cb,100);
+return;
+}
+}
+var ta=body.find(">textarea");
+if(ta.length){
+data=ta.val();
+}else{
+var pre=body.find(">pre");
+if(pre.length){
+data=pre.html();
+}
+}
+}
+catch(e){
+}
+opts.success.call(_657,data);
+setTimeout(function(){
+f.unbind();
+f.remove();
+},100);
+};
+};
+function _656(_661,_662){
+var opts=$.data(_661,"form").options;
+var _663=new FormData($(_661)[0]);
+for(var name in _662){
+_663.append(name,_662[name]);
+}
+$.ajax({url:opts.url,type:"post",xhr:function(){
+var xhr=$.ajaxSettings.xhr();
+if(xhr.upload){
+xhr.upload.addEventListener("progress",function(e){
+if(e.lengthComputable){
+var _664=e.total;
+var _665=e.loaded||e.position;
+var _666=Math.ceil(_665*100/_664);
+opts.onProgress.call(_661,_666);
+}
+},false);
+}
+return xhr;
+},data:_663,dataType:"html",cache:false,contentType:false,processData:false,complete:function(res){
+opts.success.call(_661,res.responseText);
+}});
+};
+function load(_667,data){
+var opts=$.data(_667,"form").options;
+if(typeof data=="string"){
+var _668={};
+if(opts.onBeforeLoad.call(_667,_668)==false){
+return;
+}
+$.ajax({url:data,data:_668,dataType:"json",success:function(data){
+_669(data);
+},error:function(){
+opts.onLoadError.apply(_667,arguments);
+}});
+}else{
+_669(data);
+}
+function _669(data){
+var form=$(_667);
+for(var name in data){
+var val=data[name];
+if(!_66a(name,val)){
+if(!_66b(name,val)){
+form.find("input[name=\""+name+"\"]").val(val);
+form.find("textarea[name=\""+name+"\"]").val(val);
+form.find("select[name=\""+name+"\"]").val(val);
+}
+}
+}
+opts.onLoadSuccess.call(_667,data);
+form.form("validate");
+};
+function _66a(name,val){
+var _66c=["switchbutton","radiobutton","checkbox"];
+for(var i=0;i<_66c.length;i++){
+var _66d=_66c[i];
+var cc=$(_667).find("["+_66d+"Name=\""+name+"\"]");
+if(cc.length){
+cc[_66d]("uncheck");
+cc.each(function(){
+if(_66e($(this)[_66d]("options").value,val)){
+$(this)[_66d]("check");
+}
+});
+return true;
+}
+}
+var cc=$(_667).find("input[name=\""+name+"\"][type=radio], input[name=\""+name+"\"][type=checkbox]");
+if(cc.length){
+cc._propAttr("checked",false);
+cc.each(function(){
+if(_66e($(this).val(),val)){
+$(this)._propAttr("checked",true);
+}
+});
+return true;
+}
+return false;
+};
+function _66e(v,val){
+if(v==String(val)||$.inArray(v,$.isArray(val)?val:[val])>=0){
+return true;
+}else{
+return false;
+}
+};
+function _66b(name,val){
+var _66f=$(_667).find("[textboxName=\""+name+"\"],[sliderName=\""+name+"\"]");
+if(_66f.length){
+for(var i=0;i<opts.fieldTypes.length;i++){
+var type=opts.fieldTypes[i];
+var _670=_66f.data(type);
+if(_670){
+if(_670.options.multiple||_670.options.range){
+_66f[type]("setValues",val);
+}else{
+_66f[type]("setValue",val);
+}
+return true;
+}
+}
+}
+return false;
+};
+};
+function _671(_672){
+$("input,select,textarea",_672).each(function(){
+if($(this).hasClass("textbox-value")){
+return;
+}
+var t=this.type,tag=this.tagName.toLowerCase();
+if(t=="text"||t=="hidden"||t=="password"||tag=="textarea"){
+this.value="";
+}else{
+if(t=="file"){
+var file=$(this);
+if(!file.hasClass("textbox-value")){
+var _673=file.clone().val("");
+_673.insertAfter(file);
+if(file.data("validatebox")){
+file.validatebox("destroy");
+_673.validatebox();
+}else{
+file.remove();
+}
+}
+}else{
+if(t=="checkbox"||t=="radio"){
+this.checked=false;
+}else{
+if(tag=="select"){
+this.selectedIndex=-1;
+}
+}
+}
+}
+});
+var tmp=$();
+var form=$(_672);
+var opts=$.data(_672,"form").options;
+for(var i=0;i<opts.fieldTypes.length;i++){
+var type=opts.fieldTypes[i];
+var _674=form.find("."+type+"-f").not(tmp);
+if(_674.length&&_674[type]){
+_674[type]("clear");
+tmp=tmp.add(_674);
+}
+}
+form.form("validate");
+};
+function _675(_676){
+_676.reset();
+var form=$(_676);
+var opts=$.data(_676,"form").options;
+for(var i=opts.fieldTypes.length-1;i>=0;i--){
+var type=opts.fieldTypes[i];
+var _677=form.find("."+type+"-f");
+if(_677.length&&_677[type]){
+_677[type]("reset");
+}
+}
+form.form("validate");
+};
+function _678(_679){
+var _67a=$.data(_679,"form").options;
+$(_679).unbind(".form");
+if(_67a.ajax){
+$(_679).bind("submit.form",function(){
+setTimeout(function(){
+_64f(_679,_67a);
+},0);
+return false;
+});
+}
+$(_679).bind("_change.form",function(e,t){
+if($.inArray(t,_67a.dirtyFields)==-1){
+_67a.dirtyFields.push(t);
+}
+_67a.onChange.call(this,t);
+}).bind("change.form",function(e){
+var t=e.target;
+if(!$(t).hasClass("textbox-text")){
+if($.inArray(t,_67a.dirtyFields)==-1){
+_67a.dirtyFields.push(t);
+}
+_67a.onChange.call(this,t);
+}
+});
+_67b(_679,_67a.novalidate);
+};
+function _67c(_67d,_67e){
+_67e=_67e||{};
+var _67f=$.data(_67d,"form");
+if(_67f){
+$.extend(_67f.options,_67e);
+}else{
+$.data(_67d,"form",{options:$.extend({},$.fn.form.defaults,$.fn.form.parseOptions(_67d),_67e)});
+}
+};
+function _680(_681){
+if($.fn.validatebox){
+var t=$(_681);
+t.find(".validatebox-text:not(:disabled)").validatebox("validate");
+var _682=t.find(".validatebox-invalid");
+_682.filter(":not(:disabled):first").focus();
+return _682.length==0;
+}
+return true;
+};
+function _67b(_683,_684){
+var opts=$.data(_683,"form").options;
+opts.novalidate=_684;
+$(_683).find(".validatebox-text:not(:disabled)").validatebox(_684?"disableValidation":"enableValidation");
+};
+$.fn.form=function(_685,_686){
+if(typeof _685=="string"){
+this.each(function(){
+_67c(this);
+});
+return $.fn.form.methods[_685](this,_686);
+}
+return this.each(function(){
+_67c(this,_685);
+_678(this);
+});
+};
+$.fn.form.methods={options:function(jq){
+return $.data(jq[0],"form").options;
+},submit:function(jq,_687){
+return jq.each(function(){
+_64f(this,_687);
+});
+},load:function(jq,data){
+return jq.each(function(){
+load(this,data);
+});
+},clear:function(jq){
+return jq.each(function(){
+_671(this);
+});
+},reset:function(jq){
+return jq.each(function(){
+_675(this);
+});
+},validate:function(jq){
+return _680(jq[0]);
+},disableValidation:function(jq){
+return jq.each(function(){
+_67b(this,true);
+});
+},enableValidation:function(jq){
+return jq.each(function(){
+_67b(this,false);
+});
+},resetValidation:function(jq){
+return jq.each(function(){
+$(this).find(".validatebox-text:not(:disabled)").validatebox("resetValidation");
+});
+},resetDirty:function(jq){
+return jq.each(function(){
+$(this).form("options").dirtyFields=[];
+});
+}};
+$.fn.form.parseOptions=function(_688){
+var t=$(_688);
+return $.extend({},$.parser.parseOptions(_688,[{ajax:"boolean",dirty:"boolean"}]),{url:(t.attr("action")?t.attr("action"):undefined)});
+};
+$.fn.form.defaults={fieldTypes:["tagbox","combobox","combotree","combogrid","combotreegrid","datetimebox","datebox","timepicker","combo","datetimespinner","timespinner","numberspinner","spinner","slider","searchbox","numberbox","passwordbox","filebox","textbox","switchbutton","radiobutton","checkbox"],novalidate:false,ajax:true,iframe:true,dirty:false,dirtyFields:[],url:null,queryParams:{},onSubmit:function(_689){
+return $(this).form("validate");
+},onProgress:function(_68a){
+},success:function(data){
+},onBeforeLoad:function(_68b){
+},onLoadSuccess:function(data){
+},onLoadError:function(){
+},onChange:function(_68c){
+}};
+})(jQuery);
+(function($){
+function _68d(_68e){
+var _68f=$.data(_68e,"numberbox");
+var opts=_68f.options;
+$(_68e).addClass("numberbox-f").textbox(opts);
+$(_68e).textbox("textbox").css({imeMode:"disabled"});
+$(_68e).attr("numberboxName",$(_68e).attr("textboxName"));
+_68f.numberbox=$(_68e).next();
+_68f.numberbox.addClass("numberbox");
+var _690=opts.parser.call(_68e,opts.value);
+var _691=opts.formatter.call(_68e,_690);
+$(_68e).numberbox("initValue",_690).numberbox("setText",_691);
+};
+function _692(_693,_694){
+var _695=$.data(_693,"numberbox");
+var opts=_695.options;
+opts.value=parseFloat(_694);
+var _694=opts.parser.call(_693,_694);
+var text=opts.formatter.call(_693,_694);
+opts.value=_694;
+$(_693).textbox("setText",text).textbox("setValue",_694);
+text=opts.formatter.call(_693,$(_693).textbox("getValue"));
+$(_693).textbox("setText",text);
+};
+$.fn.numberbox=function(_696,_697){
+if(typeof _696=="string"){
+var _698=$.fn.numberbox.methods[_696];
+if(_698){
+return _698(this,_697);
+}else{
+return this.textbox(_696,_697);
+}
+}
+_696=_696||{};
+return this.each(function(){
+var _699=$.data(this,"numberbox");
+if(_699){
+$.extend(_699.options,_696);
+}else{
+_699=$.data(this,"numberbox",{options:$.extend({},$.fn.numberbox.defaults,$.fn.numberbox.parseOptions(this),_696)});
+}
+_68d(this);
+});
+};
+$.fn.numberbox.methods={options:function(jq){
+var opts=jq.data("textbox")?jq.textbox("options"):{};
+return $.extend($.data(jq[0],"numberbox").options,{width:opts.width,originalValue:opts.originalValue,disabled:opts.disabled,readonly:opts.readonly});
+},cloneFrom:function(jq,from){
+return jq.each(function(){
+$(this).textbox("cloneFrom",from);
+$.data(this,"numberbox",{options:$.extend(true,{},$(from).numberbox("options"))});
+$(this).addClass("numberbox-f");
+});
+},fix:function(jq){
+return jq.each(function(){
+var opts=$(this).numberbox("options");
+opts.value=null;
+var _69a=opts.parser.call(this,$(this).numberbox("getText"));
+$(this).numberbox("setValue",_69a);
+});
+},setValue:function(jq,_69b){
+return jq.each(function(){
+_692(this,_69b);
+});
+},clear:function(jq){
+return jq.each(function(){
+$(this).textbox("clear");
+$(this).numberbox("options").value="";
+});
+},reset:function(jq){
+return jq.each(function(){
+$(this).textbox("reset");
+$(this).numberbox("setValue",$(this).numberbox("getValue"));
+});
+}};
+$.fn.numberbox.parseOptions=function(_69c){
+var t=$(_69c);
+return $.extend({},$.fn.textbox.parseOptions(_69c),$.parser.parseOptions(_69c,["decimalSeparator","groupSeparator","suffix",{min:"number",max:"number",precision:"number"}]),{prefix:(t.attr("prefix")?t.attr("prefix"):undefined)});
+};
+$.fn.numberbox.defaults=$.extend({},$.fn.textbox.defaults,{inputEvents:{keypress:function(e){
+var _69d=e.data.target;
+var opts=$(_69d).numberbox("options");
+return opts.filter.call(_69d,e);
+},blur:function(e){
+$(e.data.target).numberbox("fix");
+},keydown:function(e){
+if(e.keyCode==13){
+$(e.data.target).numberbox("fix");
+}
+}},min:null,max:null,precision:0,decimalSeparator:".",groupSeparator:"",prefix:"",suffix:"",filter:function(e){
+var opts=$(this).numberbox("options");
+var s=$(this).numberbox("getText");
+if(e.metaKey||e.ctrlKey){
+return true;
+}
+if($.inArray(String(e.which),["46","8","13","0"])>=0){
+return true;
+}
+var tmp=$("<span></span>");
+tmp.html(String.fromCharCode(e.which));
+var c=tmp.text();
+tmp.remove();
+if(!c){
+return true;
+}
+if(c=="-"&&opts.min!=null&&opts.min>=0){
+return false;
+}
+if(c=="-"||c==opts.decimalSeparator){
+return (s.indexOf(c)==-1)?true:false;
+}else{
+if(c==opts.groupSeparator){
+return true;
+}else{
+if("0123456789".indexOf(c)>=0){
+return true;
+}else{
+return false;
+}
+}
+}
+},formatter:function(_69e){
+if(!_69e){
+return _69e;
+}
+_69e=_69e+"";
+var opts=$(this).numberbox("options");
+var s1=_69e,s2="";
+var dpos=_69e.indexOf(".");
+if(dpos>=0){
+s1=_69e.substring(0,dpos);
+s2=_69e.substring(dpos+1,_69e.length);
+}
+if(opts.groupSeparator){
+var p=/(\d+)(\d{3})/;
+while(p.test(s1)){
+s1=s1.replace(p,"$1"+opts.groupSeparator+"$2");
+}
+}
+if(s2){
+return opts.prefix+s1+opts.decimalSeparator+s2+opts.suffix;
+}else{
+return opts.prefix+s1+opts.suffix;
+}
+},parser:function(s){
+s=s+"";
+var opts=$(this).numberbox("options");
+if(opts.prefix){
+s=$.trim(s.replace(new RegExp("\\"+$.trim(opts.prefix),"g"),""));
+}
+if(opts.suffix){
+s=$.trim(s.replace(new RegExp("\\"+$.trim(opts.suffix),"g"),""));
+}
+if(parseFloat(s)!=opts.value){
+if(opts.groupSeparator){
+s=$.trim(s.replace(new RegExp("\\"+opts.groupSeparator,"g"),""));
+}
+if(opts.decimalSeparator){
+s=$.trim(s.replace(new RegExp("\\"+opts.decimalSeparator,"g"),"."));
+}
+s=s.replace(/\s/g,"");
+}
+var val=parseFloat(s).toFixed(opts.precision);
+if(isNaN(val)){
+val="";
+}else{
+if(typeof (opts.min)=="number"&&val<opts.min){
+val=opts.min.toFixed(opts.precision);
+}else{
+if(typeof (opts.max)=="number"&&val>opts.max){
+val=opts.max.toFixed(opts.precision);
+}
+}
+}
+return val;
+}});
+})(jQuery);
+(function($){
+function _69f(_6a0,_6a1){
+var opts=$.data(_6a0,"calendar").options;
+var t=$(_6a0);
+if(_6a1){
+$.extend(opts,{width:_6a1.width,height:_6a1.height});
+}
+t._size(opts,t.parent());
+t.find(".calendar-body")._outerHeight(t.height()-t.find(".calendar-header")._outerHeight());
+if(t.find(".calendar-menu").is(":visible")){
+_6a2(_6a0);
+}
+};
+function init(_6a3){
+$(_6a3).addClass("calendar").html("<div class=\"calendar-header\">"+"<div class=\"calendar-nav calendar-prevmonth\"></div>"+"<div class=\"calendar-nav calendar-nextmonth\"></div>"+"<div class=\"calendar-nav calendar-prevyear\"></div>"+"<div class=\"calendar-nav calendar-nextyear\"></div>"+"<div class=\"calendar-title\">"+"<span class=\"calendar-text\"></span>"+"</div>"+"</div>"+"<div class=\"calendar-body\">"+"<div class=\"calendar-menu\">"+"<div class=\"calendar-menu-year-inner\">"+"<span class=\"calendar-nav calendar-menu-prev\"></span>"+"<span><input class=\"calendar-menu-year\" type=\"text\"></span>"+"<span class=\"calendar-nav calendar-menu-next\"></span>"+"</div>"+"<div class=\"calendar-menu-month-inner\">"+"</div>"+"</div>"+"</div>");
+$(_6a3)._bind("_resize",function(e,_6a4){
+if($(this).hasClass("easyui-fluid")||_6a4){
+_69f(_6a3);
+}
+return false;
+});
+};
+function _6a5(_6a6){
+var opts=$.data(_6a6,"calendar").options;
+var menu=$(_6a6).find(".calendar-menu");
+menu.find(".calendar-menu-year")._unbind(".calendar")._bind("keypress.calendar",function(e){
+if(e.keyCode==13){
+_6a7(true);
+}
+});
+$(_6a6)._unbind(".calendar")._bind("mouseover.calendar",function(e){
+var t=_6a8(e.target);
+if(t.hasClass("calendar-nav")||t.hasClass("calendar-text")||(t.hasClass("calendar-day")&&!t.hasClass("calendar-disabled"))){
+t.addClass("calendar-nav-hover");
+}
+})._bind("mouseout.calendar",function(e){
+var t=_6a8(e.target);
+if(t.hasClass("calendar-nav")||t.hasClass("calendar-text")||(t.hasClass("calendar-day")&&!t.hasClass("calendar-disabled"))){
+t.removeClass("calendar-nav-hover");
+}
+})._bind("click.calendar",function(e){
+var t=_6a8(e.target);
+if(t.hasClass("calendar-menu-next")||t.hasClass("calendar-nextyear")){
+_6a9(1);
+}else{
+if(t.hasClass("calendar-menu-prev")||t.hasClass("calendar-prevyear")){
+_6a9(-1);
+}else{
+if(t.hasClass("calendar-menu-month")){
+menu.find(".calendar-selected").removeClass("calendar-selected");
+t.addClass("calendar-selected");
+_6a7(true);
+}else{
+if(t.hasClass("calendar-prevmonth")){
+_6aa(-1);
+}else{
+if(t.hasClass("calendar-nextmonth")){
+_6aa(1);
+}else{
+if(t.hasClass("calendar-text")){
+if(menu.is(":visible")){
+menu.hide();
+}else{
+_6a2(_6a6);
+}
+}else{
+if(t.hasClass("calendar-day")){
+if(t.hasClass("calendar-disabled")){
+return;
+}
+var _6ab=opts.current;
+t.closest("div.calendar-body").find(".calendar-selected").removeClass("calendar-selected");
+t.addClass("calendar-selected");
+var _6ac=t.attr("abbr").split(",");
+var y=parseInt(_6ac[0]);
+var m=parseInt(_6ac[1]);
+var d=parseInt(_6ac[2]);
+opts.current=new opts.Date(y,m-1,d);
+opts.onSelect.call(_6a6,opts.current);
+if(!_6ab||_6ab.getTime()!=opts.current.getTime()){
+opts.onChange.call(_6a6,opts.current,_6ab);
+}
+if(opts.year!=y||opts.month!=m){
+opts.year=y;
+opts.month=m;
+show(_6a6);
+}
+}
+}
+}
+}
+}
+}
+}
+});
+function _6a8(t){
+var day=$(t).closest(".calendar-day");
+if(day.length){
+return day;
+}else{
+return $(t);
+}
+};
+function _6a7(_6ad){
+var menu=$(_6a6).find(".calendar-menu");
+var year=menu.find(".calendar-menu-year").val();
+var _6ae=menu.find(".calendar-selected").attr("abbr");
+if(!isNaN(year)){
+opts.year=parseInt(year);
+opts.month=parseInt(_6ae);
+show(_6a6);
+}
+if(_6ad){
+menu.hide();
+}
+};
+function _6a9(_6af){
+opts.year+=_6af;
+show(_6a6);
+menu.find(".calendar-menu-year").val(opts.year);
+};
+function _6aa(_6b0){
+opts.month+=_6b0;
+if(opts.month>12){
+opts.year++;
+opts.month=1;
+}else{
+if(opts.month<1){
+opts.year--;
+opts.month=12;
+}
+}
+show(_6a6);
+menu.find("td.calendar-selected").removeClass("calendar-selected");
+menu.find("td:eq("+(opts.month-1)+")").addClass("calendar-selected");
+};
+};
+function _6a2(_6b1){
+var opts=$.data(_6b1,"calendar").options;
+$(_6b1).find(".calendar-menu").show();
+if($(_6b1).find(".calendar-menu-month-inner").is(":empty")){
+$(_6b1).find(".calendar-menu-month-inner").empty();
+var t=$("<table class=\"calendar-mtable\"></table>").appendTo($(_6b1).find(".calendar-menu-month-inner"));
+var idx=0;
+for(var i=0;i<3;i++){
+var tr=$("<tr></tr>").appendTo(t);
+for(var j=0;j<4;j++){
+$("<td class=\"calendar-nav calendar-menu-month\"></td>").html(opts.months[idx++]).attr("abbr",idx).appendTo(tr);
+}
+}
+}
+var body=$(_6b1).find(".calendar-body");
+var sele=$(_6b1).find(".calendar-menu");
+var _6b2=sele.find(".calendar-menu-year-inner");
+var _6b3=sele.find(".calendar-menu-month-inner");
+_6b2.find("input").val(opts.year).focus();
+_6b3.find("td.calendar-selected").removeClass("calendar-selected");
+_6b3.find("td:eq("+(opts.month-1)+")").addClass("calendar-selected");
+sele._outerWidth(body._outerWidth());
+sele._outerHeight(body._outerHeight());
+_6b3._outerHeight(sele.height()-_6b2._outerHeight());
+};
+function _6b4(_6b5,year,_6b6){
+var opts=$.data(_6b5,"calendar").options;
+var _6b7=[];
+var _6b8=new opts.Date(year,_6b6,0).getDate();
+for(var i=1;i<=_6b8;i++){
+_6b7.push([year,_6b6,i]);
+}
+var _6b9=[],week=[];
+var _6ba=-1;
+while(_6b7.length>0){
+var date=_6b7.shift();
+week.push(date);
+var day=new opts.Date(date[0],date[1]-1,date[2]).getDay();
+if(_6ba==day){
+day=0;
+}else{
+if(day==(opts.firstDay==0?7:opts.firstDay)-1){
+_6b9.push(week);
+week=[];
+}
+}
+_6ba=day;
+}
+if(week.length){
+_6b9.push(week);
+}
+var _6bb=_6b9[0];
+if(_6bb.length<7){
+while(_6bb.length<7){
+var _6bc=_6bb[0];
+var date=new opts.Date(_6bc[0],_6bc[1]-1,_6bc[2]-1);
+_6bb.unshift([date.getFullYear(),date.getMonth()+1,date.getDate()]);
+}
+}else{
+var _6bc=_6bb[0];
+var week=[];
+for(var i=1;i<=7;i++){
+var date=new opts.Date(_6bc[0],_6bc[1]-1,_6bc[2]-i);
+week.unshift([date.getFullYear(),date.getMonth()+1,date.getDate()]);
+}
+_6b9.unshift(week);
+}
+var _6bd=_6b9[_6b9.length-1];
+while(_6bd.length<7){
+var _6be=_6bd[_6bd.length-1];
+var date=new opts.Date(_6be[0],_6be[1]-1,_6be[2]+1);
+_6bd.push([date.getFullYear(),date.getMonth()+1,date.getDate()]);
+}
+if(_6b9.length<6){
+var _6be=_6bd[_6bd.length-1];
+var week=[];
+for(var i=1;i<=7;i++){
+var date=new opts.Date(_6be[0],_6be[1]-1,_6be[2]+i);
+week.push([date.getFullYear(),date.getMonth()+1,date.getDate()]);
+}
+_6b9.push(week);
+}
+return _6b9;
+};
+function show(_6bf){
+var opts=$.data(_6bf,"calendar").options;
+if(opts.current&&!opts.validator.call(_6bf,opts.current)){
+opts.current=null;
+}
+var now=new opts.Date();
+var _6c0=now.getFullYear()+","+(now.getMonth()+1)+","+now.getDate();
+var _6c1=opts.current?(opts.current.getFullYear()+","+(opts.current.getMonth()+1)+","+opts.current.getDate()):"";
+var _6c2=6-opts.firstDay;
+var _6c3=_6c2+1;
+if(_6c2>=7){
+_6c2-=7;
+}
+if(_6c3>=7){
+_6c3-=7;
+}
+$(_6bf).find(".calendar-title span").html(opts.months[opts.month-1]+" "+opts.year);
+var body=$(_6bf).find("div.calendar-body");
+body.children("table").remove();
+var data=["<table class=\"calendar-dtable\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\">"];
+data.push("<thead><tr>");
+if(opts.showWeek){
+data.push("<th class=\"calendar-week\">"+opts.weekNumberHeader+"</th>");
+}
+for(var i=opts.firstDay;i<opts.weeks.length;i++){
+data.push("<th>"+opts.weeks[i]+"</th>");
+}
+for(var i=0;i<opts.firstDay;i++){
+data.push("<th>"+opts.weeks[i]+"</th>");
+}
+data.push("</tr></thead>");
+data.push("<tbody>");
+var _6c4=_6b4(_6bf,opts.year,opts.month);
+for(var i=0;i<_6c4.length;i++){
+var week=_6c4[i];
+var cls="";
+if(i==0){
+cls="calendar-first";
+}else{
+if(i==_6c4.length-1){
+cls="calendar-last";
+}
+}
+data.push("<tr class=\""+cls+"\">");
+if(opts.showWeek){
+var _6c5=opts.getWeekNumber(new opts.Date(week[0][0],parseInt(week[0][1])-1,week[0][2]));
+data.push("<td class=\"calendar-week\">"+_6c5+"</td>");
+}
+for(var j=0;j<week.length;j++){
+var day=week[j];
+var s=day[0]+","+day[1]+","+day[2];
+var _6c6=new opts.Date(day[0],parseInt(day[1])-1,day[2]);
+var d=opts.formatter.call(_6bf,_6c6);
+var css=opts.styler.call(_6bf,_6c6);
+var _6c7="";
+var _6c8="";
+if(typeof css=="string"){
+_6c8=css;
+}else{
+if(css){
+_6c7=css["class"]||"";
+_6c8=css["style"]||"";
+}
+}
+var cls="calendar-day";
+if(!(opts.year==day[0]&&opts.month==day[1])){
+cls+=" calendar-other-month";
+}
+if(s==_6c0){
+cls+=" calendar-today";
+}
+if(s==_6c1){
+cls+=" calendar-selected";
+}
+if(j==_6c2){
+cls+=" calendar-saturday";
+}else{
+if(j==_6c3){
+cls+=" calendar-sunday";
+}
+}
+if(j==0){
+cls+=" calendar-first";
+}else{
+if(j==week.length-1){
+cls+=" calendar-last";
+}
+}
+cls+=" "+_6c7;
+if(!opts.validator.call(_6bf,_6c6)){
+cls+=" calendar-disabled";
+}
+data.push("<td class=\""+cls+"\" abbr=\""+s+"\" style=\""+_6c8+"\">"+d+"</td>");
+}
+data.push("</tr>");
+}
+data.push("</tbody>");
+data.push("</table>");
+body.append(data.join(""));
+body.children("table.calendar-dtable").prependTo(body);
+opts.onNavigate.call(_6bf,opts.year,opts.month);
+};
+$.fn.calendar=function(_6c9,_6ca){
+if(typeof _6c9=="string"){
+return $.fn.calendar.methods[_6c9](this,_6ca);
+}
+_6c9=_6c9||{};
+return this.each(function(){
+var _6cb=$.data(this,"calendar");
+if(_6cb){
+$.extend(_6cb.options,_6c9);
+}else{
+_6cb=$.data(this,"calendar",{options:$.extend({},$.fn.calendar.defaults,$.fn.calendar.parseOptions(this),_6c9)});
+init(this);
+}
+if(_6cb.options.border==false){
+$(this).addClass("calendar-noborder");
+}
+_69f(this);
+_6a5(this);
+show(this);
+$(this).find("div.calendar-menu").hide();
+});
+};
+$.fn.calendar.methods={options:function(jq){
+return $.data(jq[0],"calendar").options;
+},resize:function(jq,_6cc){
+return jq.each(function(){
+_69f(this,_6cc);
+});
+},moveTo:function(jq,date){
+return jq.each(function(){
+var opts=$(this).calendar("options");
+if(!date){
+var now=new opts.Date();
+$(this).calendar({year:now.getFullYear(),month:now.getMonth()+1,current:date});
+return;
+}
+if(opts.validator.call(this,date)){
+var _6cd=opts.current;
+$(this).calendar({year:date.getFullYear(),month:date.getMonth()+1,current:date});
+if(!_6cd||_6cd.getTime()!=date.getTime()){
+opts.onChange.call(this,opts.current,_6cd);
+}
+}
+});
+}};
+$.fn.calendar.parseOptions=function(_6ce){
+var t=$(_6ce);
+return $.extend({},$.parser.parseOptions(_6ce,["weekNumberHeader",{firstDay:"number",fit:"boolean",border:"boolean",showWeek:"boolean"}]));
+};
+$.fn.calendar.defaults={Date:Date,width:180,height:180,fit:false,border:true,showWeek:false,firstDay:0,weeks:["S","M","T","W","T","F","S"],months:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],year:new Date().getFullYear(),month:new Date().getMonth()+1,current:(function(){
+var d=new Date();
+return new Date(d.getFullYear(),d.getMonth(),d.getDate());
+})(),weekNumberHeader:"",getWeekNumber:function(date){
+var _6cf=new Date(date.getTime());
+_6cf.setDate(_6cf.getDate()+4-(_6cf.getDay()||7));
+var time=_6cf.getTime();
+_6cf.setMonth(0);
+_6cf.setDate(1);
+return Math.floor(Math.round((time-_6cf)/86400000)/7)+1;
+},formatter:function(date){
+return date.getDate();
+},styler:function(date){
+return "";
+},validator:function(date){
+return true;
+},onSelect:function(date){
+},onChange:function(_6d0,_6d1){
+},onNavigate:function(year,_6d2){
+}};
+})(jQuery);
+(function($){
+function _6d3(_6d4){
+var _6d5=$.data(_6d4,"spinner");
+var opts=_6d5.options;
+var _6d6=$.extend(true,[],opts.icons);
+if(opts.spinAlign=="left"||opts.spinAlign=="right"){
+opts.spinArrow=true;
+opts.iconAlign=opts.spinAlign;
+var _6d7={iconCls:"spinner-button-updown",handler:function(e){
+var spin=$(e.target).closest(".spinner-arrow-up,.spinner-arrow-down");
+_6e1(e.data.target,spin.hasClass("spinner-arrow-down"));
+}};
+if(opts.spinAlign=="left"){
+_6d6.unshift(_6d7);
+}else{
+_6d6.push(_6d7);
+}
+}else{
+opts.spinArrow=false;
+if(opts.spinAlign=="vertical"){
+if(opts.buttonAlign!="top"){
+opts.buttonAlign="bottom";
+}
+opts.clsLeft="textbox-button-bottom";
+opts.clsRight="textbox-button-top";
+}else{
+opts.clsLeft="textbox-button-left";
+opts.clsRight="textbox-button-right";
+}
+}
+$(_6d4).addClass("spinner-f").textbox($.extend({},opts,{icons:_6d6,doSize:false,onResize:function(_6d8,_6d9){
+if(!opts.spinArrow){
+var span=$(this).next();
+var btn=span.find(".textbox-button:not(.spinner-button)");
+if(btn.length){
+var _6da=btn.outerWidth();
+var _6db=btn.outerHeight();
+var _6dc=span.find(".spinner-button."+opts.clsLeft);
+var _6dd=span.find(".spinner-button."+opts.clsRight);
+if(opts.buttonAlign=="right"){
+_6dd.css("marginRight",_6da+"px");
+}else{
+if(opts.buttonAlign=="left"){
+_6dc.css("marginLeft",_6da+"px");
+}else{
+if(opts.buttonAlign=="top"){
+_6dd.css("marginTop",_6db+"px");
+}else{
+_6dc.css("marginBottom",_6db+"px");
+}
+}
+}
+}
+}
+opts.onResize.call(this,_6d8,_6d9);
+}}));
+$(_6d4).attr("spinnerName",$(_6d4).attr("textboxName"));
+_6d5.spinner=$(_6d4).next();
+_6d5.spinner.addClass("spinner");
+if(opts.spinArrow){
+var _6de=_6d5.spinner.find(".spinner-button-updown");
+_6de.append("<span class=\"spinner-arrow spinner-button-top\">"+"<span class=\"spinner-arrow-up\"></span>"+"</span>"+"<span class=\"spinner-arrow spinner-button-bottom\">"+"<span class=\"spinner-arrow-down\"></span>"+"</span>");
+}else{
+var _6df=$("<a href=\"javascript:;\" class=\"textbox-button spinner-button\"></a>").addClass(opts.clsLeft).appendTo(_6d5.spinner);
+var _6e0=$("<a href=\"javascript:;\" class=\"textbox-button spinner-button\"></a>").addClass(opts.clsRight).appendTo(_6d5.spinner);
+_6df.linkbutton({iconCls:opts.reversed?"spinner-button-up":"spinner-button-down",onClick:function(){
+_6e1(_6d4,!opts.reversed);
+}});
+_6e0.linkbutton({iconCls:opts.reversed?"spinner-button-down":"spinner-button-up",onClick:function(){
+_6e1(_6d4,opts.reversed);
+}});
+if(opts.disabled){
+$(_6d4).spinner("disable");
+}
+if(opts.readonly){
+$(_6d4).spinner("readonly");
+}
+}
+$(_6d4).spinner("resize");
+};
+function _6e1(_6e2,down){
+var opts=$(_6e2).spinner("options");
+opts.spin.call(_6e2,down);
+opts[down?"onSpinDown":"onSpinUp"].call(_6e2);
+$(_6e2).spinner("validate");
+};
+$.fn.spinner=function(_6e3,_6e4){
+if(typeof _6e3=="string"){
+var _6e5=$.fn.spinner.methods[_6e3];
+if(_6e5){
+return _6e5(this,_6e4);
+}else{
+return this.textbox(_6e3,_6e4);
+}
+}
+_6e3=_6e3||{};
+return this.each(function(){
+var _6e6=$.data(this,"spinner");
+if(_6e6){
+$.extend(_6e6.options,_6e3);
+}else{
+_6e6=$.data(this,"spinner",{options:$.extend({},$.fn.spinner.defaults,$.fn.spinner.parseOptions(this),_6e3)});
+}
+_6d3(this);
+});
+};
+$.fn.spinner.methods={options:function(jq){
+var opts=jq.textbox("options");
+return $.extend($.data(jq[0],"spinner").options,{width:opts.width,value:opts.value,originalValue:opts.originalValue,disabled:opts.disabled,readonly:opts.readonly});
+}};
+$.fn.spinner.parseOptions=function(_6e7){
+return $.extend({},$.fn.textbox.parseOptions(_6e7),$.parser.parseOptions(_6e7,["min","max","spinAlign",{increment:"number",reversed:"boolean"}]));
+};
+$.fn.spinner.defaults=$.extend({},$.fn.textbox.defaults,{min:null,max:null,increment:1,spinAlign:"right",reversed:false,spin:function(down){
+},onSpinUp:function(){
+},onSpinDown:function(){
+}});
+})(jQuery);
+(function($){
+function _6e8(_6e9){
+$(_6e9).addClass("numberspinner-f");
+var opts=$.data(_6e9,"numberspinner").options;
+$(_6e9).numberbox($.extend({},opts,{doSize:false})).spinner(opts);
+$(_6e9).numberbox("setValue",opts.value);
+};
+function _6ea(_6eb,down){
+var opts=$.data(_6eb,"numberspinner").options;
+var v=parseFloat($(_6eb).numberbox("getValue")||opts.value)||0;
+if(down){
+v-=opts.increment;
+}else{
+v+=opts.increment;
+}
+$(_6eb).numberbox("setValue",v);
+};
+$.fn.numberspinner=function(_6ec,_6ed){
+if(typeof _6ec=="string"){
+var _6ee=$.fn.numberspinner.methods[_6ec];
+if(_6ee){
+return _6ee(this,_6ed);
+}else{
+return this.numberbox(_6ec,_6ed);
+}
+}
+_6ec=_6ec||{};
+return this.each(function(){
+var _6ef=$.data(this,"numberspinner");
+if(_6ef){
+$.extend(_6ef.options,_6ec);
+}else{
+$.data(this,"numberspinner",{options:$.extend({},$.fn.numberspinner.defaults,$.fn.numberspinner.parseOptions(this),_6ec)});
+}
+_6e8(this);
+});
+};
+$.fn.numberspinner.methods={options:function(jq){
+var opts=jq.numberbox("options");
+return $.extend($.data(jq[0],"numberspinner").options,{width:opts.width,value:opts.value,originalValue:opts.originalValue,disabled:opts.disabled,readonly:opts.readonly});
+}};
+$.fn.numberspinner.parseOptions=function(_6f0){
+return $.extend({},$.fn.spinner.parseOptions(_6f0),$.fn.numberbox.parseOptions(_6f0),{});
+};
+$.fn.numberspinner.defaults=$.extend({},$.fn.spinner.defaults,$.fn.numberbox.defaults,{spin:function(down){
+_6ea(this,down);
+}});
+})(jQuery);
+(function($){
+function _6f1(_6f2){
+var opts=$.data(_6f2,"timespinner").options;
+$(_6f2).addClass("timespinner-f").spinner(opts);
+var _6f3=opts.formatter.call(_6f2,opts.parser.call(_6f2,opts.value));
+$(_6f2).timespinner("initValue",_6f3);
+};
+function _6f4(e){
+var _6f5=e.data.target;
+var opts=$.data(_6f5,"timespinner").options;
+var _6f6=$(_6f5).timespinner("getSelectionStart");
+for(var i=0;i<opts.selections.length;i++){
+var _6f7=opts.selections[i];
+if(_6f6>=_6f7[0]&&_6f6<=_6f7[1]){
+_6f8(_6f5,i);
+return;
+}
+}
+};
+function _6f8(_6f9,_6fa){
+var opts=$.data(_6f9,"timespinner").options;
+if(_6fa!=undefined){
+opts.highlight=_6fa;
+}
+var _6fb=opts.selections[opts.highlight];
+if(_6fb){
+var tb=$(_6f9).timespinner("textbox");
+$(_6f9).timespinner("setSelectionRange",{start:_6fb[0],end:_6fb[1]});
+tb.focus();
+}
+};
+function _6fc(_6fd,_6fe){
+var opts=$.data(_6fd,"timespinner").options;
+var _6fe=opts.parser.call(_6fd,_6fe);
+var text=opts.formatter.call(_6fd,_6fe);
+$(_6fd).spinner("setValue",text);
+};
+function _6ff(_700,down){
+var opts=$.data(_700,"timespinner").options;
+var s=$(_700).timespinner("getValue");
+var _701=opts.selections[opts.highlight];
+var s1=s.substring(0,_701[0]);
+var s2=s.substring(_701[0],_701[1]);
+var s3=s.substring(_701[1]);
+if(s2==opts.ampm[0]){
+s2=opts.ampm[1];
+}else{
+if(s2==opts.ampm[1]){
+s2=opts.ampm[0];
+}else{
+s2=parseInt(s2,10)||0;
+if(opts.selections.length-4==opts.highlight&&opts.hour12){
+if(s2==12){
+s2=0;
+}else{
+if(s2==11&&!down){
+var tmp=s3.replace(opts.ampm[0],opts.ampm[1]);
+if(s3!=tmp){
+s3=tmp;
+}else{
+s3=s3.replace(opts.ampm[1],opts.ampm[0]);
+}
+}
+}
+}
+s2=s2+opts.increment*(down?-1:1);
+}
+}
+var v=s1+s2+s3;
+$(_700).timespinner("setValue",v);
+_6f8(_700);
+};
+$.fn.timespinner=function(_702,_703){
+if(typeof _702=="string"){
+var _704=$.fn.timespinner.methods[_702];
+if(_704){
+return _704(this,_703);
+}else{
+return this.spinner(_702,_703);
+}
+}
+_702=_702||{};
+return this.each(function(){
+var _705=$.data(this,"timespinner");
+if(_705){
+$.extend(_705.options,_702);
+}else{
+$.data(this,"timespinner",{options:$.extend({},$.fn.timespinner.defaults,$.fn.timespinner.parseOptions(this),_702)});
+}
+_6f1(this);
+});
+};
+$.fn.timespinner.methods={options:function(jq){
+var opts=jq.data("spinner")?jq.spinner("options"):{};
+return $.extend($.data(jq[0],"timespinner").options,{width:opts.width,value:opts.value,originalValue:opts.originalValue,disabled:opts.disabled,readonly:opts.readonly});
+},setValue:function(jq,_706){
+return jq.each(function(){
+_6fc(this,_706);
+});
+},getHours:function(jq){
+var opts=$.data(jq[0],"timespinner").options;
+var date=opts.parser.call(jq[0],jq.timespinner("getValue"));
+return date?date.getHours():null;
+},getMinutes:function(jq){
+var opts=$.data(jq[0],"timespinner").options;
+var date=opts.parser.call(jq[0],jq.timespinner("getValue"));
+return date?date.getMinutes():null;
+},getSeconds:function(jq){
+var opts=$.data(jq[0],"timespinner").options;
+var date=opts.parser.call(jq[0],jq.timespinner("getValue"));
+return date?date.getSeconds():null;
+}};
+$.fn.timespinner.parseOptions=function(_707){
+return $.extend({},$.fn.spinner.parseOptions(_707),$.parser.parseOptions(_707,["separator",{hour12:"boolean",showSeconds:"boolean",highlight:"number"}]));
+};
+$.fn.timespinner.defaults=$.extend({},$.fn.spinner.defaults,{inputEvents:$.extend({},$.fn.spinner.defaults.inputEvents,{click:function(e){
+_6f4.call(this,e);
+},blur:function(e){
+var t=$(e.data.target);
+t.timespinner("setValue",t.timespinner("getText"));
+},keydown:function(e){
+if(e.keyCode==13){
+var t=$(e.data.target);
+t.timespinner("setValue",t.timespinner("getText"));
+}
+}}),formatter:function(date){
+if(!date){
+return "";
+}
+var opts=$(this).timespinner("options");
+var hour=date.getHours();
+var _708=date.getMinutes();
+var _709=date.getSeconds();
+var ampm="";
+if(opts.hour12){
+ampm=hour>=12?opts.ampm[1]:opts.ampm[0];
+hour=hour%12;
+if(hour==0){
+hour=12;
+}
+}
+var tt=[_70a(hour),_70a(_708)];
+if(opts.showSeconds){
+tt.push(_70a(_709));
+}
+var s=tt.join(opts.separator)+" "+ampm;
+return $.trim(s);
+function _70a(_70b){
+return (_70b<10?"0":"")+_70b;
+};
+},parser:function(s){
+var opts=$(this).timespinner("options");
+var date=_70c(s);
+if(date){
+var min=_70c(opts.min);
+var max=_70c(opts.max);
+if(min&&min>date){
+date=min;
+}
+if(max&&max<date){
+date=max;
+}
+}
+return date;
+function _70c(s){
+if(!s){
+return null;
+}
+var ss=s.split(" ");
+var tt=ss[0].split(opts.separator);
+var hour=parseInt(tt[0],10)||0;
+var _70d=parseInt(tt[1],10)||0;
+var _70e=parseInt(tt[2],10)||0;
+if(opts.hour12){
+var ampm=ss[1];
+if(ampm==opts.ampm[1]&&hour<12){
+hour+=12;
+}else{
+if(ampm==opts.ampm[0]&&hour==12){
+hour-=12;
+}
+}
+}
+return new Date(1900,0,0,hour,_70d,_70e);
+};
+},selections:[[0,2],[3,5],[6,8],[9,11]],separator:":",showSeconds:false,highlight:0,hour12:false,ampm:["AM","PM"],spin:function(down){
+_6ff(this,down);
+}});
+})(jQuery);
+(function($){
+function _70f(_710){
+var opts=$.data(_710,"datetimespinner").options;
+$(_710).addClass("datetimespinner-f").timespinner(opts);
+};
+$.fn.datetimespinner=function(_711,_712){
+if(typeof _711=="string"){
+var _713=$.fn.datetimespinner.methods[_711];
+if(_713){
+return _713(this,_712);
+}else{
+return this.timespinner(_711,_712);
+}
+}
+_711=_711||{};
+return this.each(function(){
+var _714=$.data(this,"datetimespinner");
+if(_714){
+$.extend(_714.options,_711);
+}else{
+$.data(this,"datetimespinner",{options:$.extend({},$.fn.datetimespinner.defaults,$.fn.datetimespinner.parseOptions(this),_711)});
+}
+_70f(this);
+});
+};
+$.fn.datetimespinner.methods={options:function(jq){
+var opts=jq.timespinner("options");
+return $.extend($.data(jq[0],"datetimespinner").options,{width:opts.width,value:opts.value,originalValue:opts.originalValue,disabled:opts.disabled,readonly:opts.readonly});
+}};
+$.fn.datetimespinner.parseOptions=function(_715){
+return $.extend({},$.fn.timespinner.parseOptions(_715),$.parser.parseOptions(_715,[]));
+};
+$.fn.datetimespinner.defaults=$.extend({},$.fn.timespinner.defaults,{formatter:function(date){
+if(!date){
+return "";
+}
+return $.fn.datebox.defaults.formatter.call(this,date)+" "+$.fn.timespinner.defaults.formatter.call(this,date);
+},parser:function(s){
+s=$.trim(s);
+if(!s){
+return null;
+}
+var dt=s.split(" ");
+var _716=$.fn.datebox.defaults.parser.call(this,dt[0]);
+if(dt.length<2){
+return _716;
+}
+var _717=$.fn.timespinner.defaults.parser.call(this,dt[1]+(dt[2]?" "+dt[2]:""));
+return new Date(_716.getFullYear(),_716.getMonth(),_716.getDate(),_717.getHours(),_717.getMinutes(),_717.getSeconds());
+},selections:[[0,2],[3,5],[6,10],[11,13],[14,16],[17,19],[20,22]]});
+})(jQuery);
+(function($){
+var _718=0;
+function _719(a,o){
+return $.easyui.indexOfArray(a,o);
+};
+function _71a(a,o,id){
+$.easyui.removeArrayItem(a,o,id);
+};
+function _71b(a,o,r){
+$.easyui.addArrayItem(a,o,r);
+};
+function _71c(_71d,aa){
+return $.data(_71d,"treegrid")?aa.slice(1):aa;
+};
+function _71e(_71f){
+var _720=$.data(_71f,"datagrid");
+var opts=_720.options;
+var _721=_720.panel;
+var dc=_720.dc;
+var ss=null;
+if(opts.sharedStyleSheet){
+ss=typeof opts.sharedStyleSheet=="boolean"?"head":opts.sharedStyleSheet;
+}else{
+ss=_721.closest("div.datagrid-view");
+if(!ss.length){
+ss=dc.view;
+}
+}
+var cc=$(ss);
+var _722=$.data(cc[0],"ss");
+if(!_722){
+_722=$.data(cc[0],"ss",{cache:{},dirty:[]});
+}
+return {add:function(_723){
+var ss=["<style type=\"text/css\" easyui=\"true\">"];
+for(var i=0;i<_723.length;i++){
+_722.cache[_723[i][0]]={width:_723[i][1]};
+}
+var _724=0;
+for(var s in _722.cache){
+var item=_722.cache[s];
+item.index=_724++;
+ss.push(s+"{width:"+item.width+"}");
+}
+ss.push("</style>");
+$(ss.join("\n")).appendTo(cc);
+cc.children("style[easyui]:not(:last)").remove();
+},getRule:function(_725){
+var _726=cc.children("style[easyui]:last")[0];
+var _727=_726.styleSheet?_726.styleSheet:(_726.sheet||document.styleSheets[document.styleSheets.length-1]);
+var _728=_727.cssRules||_727.rules;
+return _728[_725];
+},set:function(_729,_72a){
+var item=_722.cache[_729];
+if(item){
+item.width=_72a;
+var rule=this.getRule(item.index);
+if(rule){
+rule.style["width"]=_72a;
+}
+}
+},remove:function(_72b){
+var tmp=[];
+for(var s in _722.cache){
+if(s.indexOf(_72b)==-1){
+tmp.push([s,_722.cache[s].width]);
+}
+}
+_722.cache={};
+this.add(tmp);
+},dirty:function(_72c){
+if(_72c){
+_722.dirty.push(_72c);
+}
+},clean:function(){
+for(var i=0;i<_722.dirty.length;i++){
+this.remove(_722.dirty[i]);
+}
+_722.dirty=[];
+}};
+};
+function _72d(_72e,_72f){
+var _730=$.data(_72e,"datagrid");
+var opts=_730.options;
+var _731=_730.panel;
+if(_72f){
+$.extend(opts,_72f);
+}
+if(opts.fit==true){
+var p=_731.panel("panel").parent();
+opts.width=p.width();
+opts.height=p.height();
+}
+_731.panel("resize",opts);
+};
+function _732(_733){
+var _734=$.data(_733,"datagrid");
+var opts=_734.options;
+var dc=_734.dc;
+var wrap=_734.panel;
+if(!wrap.is(":visible")){
+return;
+}
+var _735=wrap.width();
+var _736=wrap.height();
+var view=dc.view;
+var _737=dc.view1;
+var _738=dc.view2;
+var _739=_737.children("div.datagrid-header");
+var _73a=_738.children("div.datagrid-header");
+var _73b=_739.find("table");
+var _73c=_73a.find("table");
+view.width(_735);
+var _73d=_739.children("div.datagrid-header-inner").show();
+_737.width(_73d.find("table").width());
+if(!opts.showHeader){
+_73d.hide();
+}
+_738.width(_735-_737._outerWidth());
+_737.children()._outerWidth(_737.width());
+_738.children()._outerWidth(_738.width());
+var all=_739.add(_73a).add(_73b).add(_73c);
+all.css("height","");
+var hh=Math.max(_73b.height(),_73c.height());
+all._outerHeight(hh);
+view.children(".datagrid-empty").css("top",hh+"px");
+dc.body1.add(dc.body2).children("table.datagrid-btable-frozen").css({position:"absolute",top:dc.header2._outerHeight()});
+var _73e=dc.body2.children("table.datagrid-btable-frozen")._outerHeight();
+var _73f=_73e+_73a._outerHeight()+_738.children(".datagrid-footer")._outerHeight();
+wrap.children(":not(.datagrid-view,.datagrid-mask,.datagrid-mask-msg)").each(function(){
+_73f+=$(this)._outerHeight();
+});
+var _740=wrap.outerHeight()-wrap.height();
+var _741=wrap._size("minHeight")||"";
+var _742=wrap._size("maxHeight")||"";
+_737.add(_738).children("div.datagrid-body").css({marginTop:_73e,height:(isNaN(parseInt(opts.height))?"":(_736-_73f)),minHeight:(_741?_741-_740-_73f:""),maxHeight:(_742?_742-_740-_73f:"")});
+view.height(_738.height());
+};
+function _743(_744,_745,_746){
+var rows=$.data(_744,"datagrid").data.rows;
+var opts=$.data(_744,"datagrid").options;
+var dc=$.data(_744,"datagrid").dc;
+var tmp=$("<tr class=\"datagrid-row\" style=\"position:absolute;left:-999999px\"></tr>").appendTo("body");
+var _747=tmp.outerHeight();
+tmp.remove();
+if(!dc.body1.is(":empty")&&(!opts.nowrap||opts.autoRowHeight||_746)){
+if(_745!=undefined){
+var tr1=opts.finder.getTr(_744,_745,"body",1);
+var tr2=opts.finder.getTr(_744,_745,"body",2);
+_748(tr1,tr2);
+}else{
+var tr1=opts.finder.getTr(_744,0,"allbody",1);
+var tr2=opts.finder.getTr(_744,0,"allbody",2);
+_748(tr1,tr2);
+if(opts.showFooter){
+var tr1=opts.finder.getTr(_744,0,"allfooter",1);
+var tr2=opts.finder.getTr(_744,0,"allfooter",2);
+_748(tr1,tr2);
+}
+}
+}
+_732(_744);
+if(opts.height=="auto"){
+var _749=dc.body1.parent();
+var _74a=dc.body2;
+var _74b=_74c(_74a);
+var _74d=_74b.height;
+if(_74b.width>_74a.width()){
+_74d+=18;
+}
+_74d-=parseInt(_74a.css("marginTop"))||0;
+_749.height(_74d);
+_74a.height(_74d);
+dc.view.height(dc.view2.height());
+}
+dc.body2.triggerHandler("scroll");
+function _748(trs1,trs2){
+for(var i=0;i<trs2.length;i++){
+var tr1=$(trs1[i]);
+var tr2=$(trs2[i]);
+tr1.css("height","");
+tr2.css("height","");
+var _74e=Math.max(tr1.outerHeight(),tr2.outerHeight());
+if(_74e!=_747){
+_74e=Math.max(_74e,_747)+1;
+tr1.css("height",_74e);
+tr2.css("height",_74e);
+}
+}
+};
+function _74c(cc){
+var _74f=0;
+var _750=0;
+$(cc).children().each(function(){
+var c=$(this);
+if(c.is(":visible")){
+_750+=c._outerHeight();
+if(_74f<c._outerWidth()){
+_74f=c._outerWidth();
+}
+}
+});
+return {width:_74f,height:_750};
+};
+};
+function _751(_752,_753){
+var _754=$.data(_752,"datagrid");
+var opts=_754.options;
+var dc=_754.dc;
+if(!dc.body2.children("table.datagrid-btable-frozen").length){
+dc.body1.add(dc.body2).prepend("<table class=\"datagrid-btable datagrid-btable-frozen\" cellspacing=\"0\" cellpadding=\"0\"></table>");
+}
+_755(true);
+_755(false);
+_732(_752);
+function _755(_756){
+var _757=_756?1:2;
+var tr=opts.finder.getTr(_752,_753,"body",_757);
+(_756?dc.body1:dc.body2).children("table.datagrid-btable-frozen").append(tr);
+};
+};
+function _758(_759,_75a){
+function _75b(){
+var _75c=[];
+var _75d=[];
+$(_759).children("thead").each(function(){
+var opt=$.parser.parseOptions(this,[{frozen:"boolean"}]);
+$(this).find("tr").each(function(){
+var cols=[];
+$(this).find("th").each(function(){
+var th=$(this);
+var col=$.extend({},$.parser.parseOptions(this,["id","field","align","halign","order","width",{sortable:"boolean",checkbox:"boolean",resizable:"boolean",fixed:"boolean"},{rowspan:"number",colspan:"number"}]),{title:(th.html()||undefined),hidden:(th.attr("hidden")?true:undefined),hformatter:(th.attr("hformatter")?eval(th.attr("hformatter")):undefined),hstyler:(th.attr("hstyler")?eval(th.attr("hstyler")):undefined),formatter:(th.attr("formatter")?eval(th.attr("formatter")):undefined),styler:(th.attr("styler")?eval(th.attr("styler")):undefined),sorter:(th.attr("sorter")?eval(th.attr("sorter")):undefined)});
+if(col.width&&String(col.width).indexOf("%")==-1){
+col.width=parseInt(col.width);
+}
+if(th.attr("editor")){
+var s=$.trim(th.attr("editor"));
+if(s.substr(0,1)=="{"){
+col.editor=eval("("+s+")");
+}else{
+col.editor=s;
+}
+}
+cols.push(col);
+});
+opt.frozen?_75c.push(cols):_75d.push(cols);
+});
+});
+return [_75c,_75d];
+};
+var _75e=$("<div class=\"datagrid-wrap\">"+"<div class=\"datagrid-view\">"+"<div class=\"datagrid-view1\">"+"<div class=\"datagrid-header\">"+"<div class=\"datagrid-header-inner\"></div>"+"</div>"+"<div class=\"datagrid-body\">"+"<div class=\"datagrid-body-inner\"></div>"+"</div>"+"<div class=\"datagrid-footer\">"+"<div class=\"datagrid-footer-inner\"></div>"+"</div>"+"</div>"+"<div class=\"datagrid-view2\">"+"<div class=\"datagrid-header\">"+"<div class=\"datagrid-header-inner\"></div>"+"</div>"+"<div class=\"datagrid-body\"></div>"+"<div class=\"datagrid-footer\">"+"<div class=\"datagrid-footer-inner\"></div>"+"</div>"+"</div>"+"</div>"+"</div>").insertAfter(_759);
+_75e.panel({doSize:false,cls:"datagrid"});
+$(_759).addClass("datagrid-f").hide().appendTo(_75e.children("div.datagrid-view"));
+var cc=_75b();
+var view=_75e.children("div.datagrid-view");
+var _75f=view.children("div.datagrid-view1");
+var _760=view.children("div.datagrid-view2");
+return {panel:_75e,frozenColumns:cc[0],columns:cc[1],dc:{view:view,view1:_75f,view2:_760,header1:_75f.children("div.datagrid-header").children("div.datagrid-header-inner"),header2:_760.children("div.datagrid-header").children("div.datagrid-header-inner"),body1:_75f.children("div.datagrid-body").children("div.datagrid-body-inner"),body2:_760.children("div.datagrid-body"),footer1:_75f.children("div.datagrid-footer").children("div.datagrid-footer-inner"),footer2:_760.children("div.datagrid-footer").children("div.datagrid-footer-inner")}};
+};
+function _761(_762){
+var _763=$.data(_762,"datagrid");
+var opts=_763.options;
+var dc=_763.dc;
+var _764=_763.panel;
+_763.ss=$(_762).datagrid("createStyleSheet");
+_764.panel($.extend({},opts,{id:null,doSize:false,onResize:function(_765,_766){
+if($.data(_762,"datagrid")){
+_732(_762);
+$(_762).datagrid("fitColumns");
+opts.onResize.call(_764,_765,_766);
+}
+},onExpand:function(){
+if($.data(_762,"datagrid")){
+$(_762).datagrid("fixRowHeight").datagrid("fitColumns");
+opts.onExpand.call(_764);
+}
+}}));
+var _767=$(_762).attr("id")||"";
+if(_767){
+_767+="_";
+}
+_763.rowIdPrefix=_767+"datagrid-row-r"+(++_718);
+_763.cellClassPrefix=_767+"datagrid-cell-c"+_718;
+_768(dc.header1,opts.frozenColumns,true);
+_768(dc.header2,opts.columns,false);
+_769();
+dc.header1.add(dc.header2).css("display",opts.showHeader?"block":"none");
+dc.footer1.add(dc.footer2).css("display",opts.showFooter?"block":"none");
+if(opts.toolbar){
+if($.isArray(opts.toolbar)){
+$("div.datagrid-toolbar",_764).remove();
+var tb=$("<div class=\"datagrid-toolbar\"><table cellspacing=\"0\" cellpadding=\"0\"><tr></tr></table></div>").prependTo(_764);
+var tr=tb.find("tr");
+for(var i=0;i<opts.toolbar.length;i++){
+var btn=opts.toolbar[i];
+if(btn=="-"){
+$("<td><div class=\"datagrid-btn-separator\"></div></td>").appendTo(tr);
+}else{
+var td=$("<td></td>").appendTo(tr);
+var tool=$("<a href=\"javascript:;\"></a>").appendTo(td);
+tool[0].onclick=eval(btn.handler||function(){
+});
+tool.linkbutton($.extend({},btn,{plain:true}));
+}
+}
+}else{
+$(opts.toolbar).addClass("datagrid-toolbar").prependTo(_764);
+$(opts.toolbar).show();
+}
+}else{
+$("div.datagrid-toolbar",_764).remove();
+}
+$("div.datagrid-pager",_764).remove();
+if(opts.pagination){
+var _76a=$("<div class=\"datagrid-pager\"></div>");
+if(opts.pagePosition=="bottom"){
+_76a.appendTo(_764);
+}else{
+if(opts.pagePosition=="top"){
+_76a.addClass("datagrid-pager-top").prependTo(_764);
+}else{
+var ptop=$("<div class=\"datagrid-pager datagrid-pager-top\"></div>").prependTo(_764);
+_76a.appendTo(_764);
+_76a=_76a.add(ptop);
+}
+}
+_76a.pagination({total:0,pageNumber:opts.pageNumber,pageSize:opts.pageSize,pageList:opts.pageList,onSelectPage:function(_76b,_76c){
+opts.pageNumber=_76b||1;
+opts.pageSize=_76c;
+_76a.pagination("refresh",{pageNumber:_76b,pageSize:_76c});
+_7b6(_762);
+}});
+opts.pageSize=_76a.pagination("options").pageSize;
+}
+function _768(_76d,_76e,_76f){
+if(!_76e){
+return;
+}
+$(_76d).show();
+$(_76d).empty();
+var tmp=$("<div class=\"datagrid-cell\" style=\"position:absolute;left:-99999px\"></div>").appendTo("body");
+tmp._outerWidth(99);
+var _770=100-parseInt(tmp[0].style.width);
+tmp.remove();
+var _771=[];
+var _772=[];
+var _773=[];
+if(opts.sortName){
+_771=opts.sortName.split(",");
+_772=opts.sortOrder.split(",");
+}
+var t=$("<table class=\"datagrid-htable\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\"><tbody></tbody></table>").appendTo(_76d);
+for(var i=0;i<_76e.length;i++){
+var tr=$("<tr class=\"datagrid-header-row\"></tr>").appendTo($("tbody",t));
+var cols=_76e[i];
+for(var j=0;j<cols.length;j++){
+var col=cols[j];
+var attr="";
+if(col.rowspan){
+attr+="rowspan=\""+col.rowspan+"\" ";
+}
+if(col.colspan){
+attr+="colspan=\""+col.colspan+"\" ";
+if(!col.id){
+col.id=["datagrid-td-group"+_718,i,j].join("-");
+}
+}
+if(col.id){
+attr+="id=\""+col.id+"\"";
+}
+var css=col.hstyler?col.hstyler(col.title,col):"";
+if(typeof css=="string"){
+var _774=css;
+var _775="";
+}else{
+css=css||{};
+var _774=css["style"]||"";
+var _775=css["class"]||"";
+}
+var td=$("<td "+attr+" class=\""+_775+"\" style=\""+_774+"\""+"></td>").appendTo(tr);
+if(col.checkbox){
+td.attr("field",col.field);
+$("<div class=\"datagrid-header-check\"></div>").html("<input type=\"checkbox\">").appendTo(td);
+}else{
+if(col.field){
+td.attr("field",col.field);
+td.append("<div class=\"datagrid-cell\"><span></span><span class=\"datagrid-sort-icon\"></span></div>");
+td.find("span:first").html(col.hformatter?col.hformatter(col.title,col):col.title);
+var cell=td.find("div.datagrid-cell");
+var pos=_719(_771,col.field);
+if(pos>=0){
+cell.addClass("datagrid-sort-"+_772[pos]);
+}
+if(col.sortable){
+cell.addClass("datagrid-sort");
+}
+if(col.resizable==false){
+cell.attr("resizable","false");
+}
+if(col.width){
+var _776=$.parser.parseValue("width",col.width,dc.view,opts.scrollbarSize+(opts.rownumbers?opts.rownumberWidth:0));
+col.deltaWidth=_770;
+col.boxWidth=_776-_770;
+}else{
+col.auto=true;
+}
+cell.css("text-align",(col.halign||col.align||""));
+col.cellClass=_763.cellClassPrefix+"-"+col.field.replace(/[\.|\s]/g,"-");
+cell.addClass(col.cellClass);
+}else{
+$("<div class=\"datagrid-cell-group\"></div>").html(col.hformatter?col.hformatter(col.title,col):col.title).appendTo(td);
+}
+}
+if(col.hidden){
+td.hide();
+_773.push(col.field);
+}
+}
+}
+if(_76f&&opts.rownumbers){
+var td=$("<td rowspan=\""+opts.frozenColumns.length+"\"><div class=\"datagrid-header-rownumber\"></div></td>");
+if($("tr",t).length==0){
+td.wrap("<tr class=\"datagrid-header-row\"></tr>").parent().appendTo($("tbody",t));
+}else{
+td.prependTo($("tr:first",t));
+}
+}
+for(var i=0;i<_773.length;i++){
+_7b8(_762,_773[i],-1);
+}
+};
+function _769(){
+var _777=[[".datagrid-header-rownumber",(opts.rownumberWidth-1)+"px"],[".datagrid-cell-rownumber",(opts.rownumberWidth-1)+"px"]];
+var _778=_779(_762,true).concat(_779(_762));
+for(var i=0;i<_778.length;i++){
+var col=_77a(_762,_778[i]);
+if(col&&!col.checkbox){
+_777.push(["."+col.cellClass,col.boxWidth?col.boxWidth+"px":"auto"]);
+}
+}
+_763.ss.add(_777);
+_763.ss.dirty(_763.cellSelectorPrefix);
+_763.cellSelectorPrefix="."+_763.cellClassPrefix;
+};
+};
+function _77b(_77c){
+var _77d=$.data(_77c,"datagrid");
+var _77e=_77d.panel;
+var opts=_77d.options;
+var dc=_77d.dc;
+var _77f=dc.header1.add(dc.header2);
+_77f._unbind(".datagrid");
+for(var _780 in opts.headerEvents){
+_77f._bind(_780+".datagrid",opts.headerEvents[_780]);
+}
+var _781=_77f.find("div.datagrid-cell");
+var _782=opts.resizeHandle=="right"?"e":(opts.resizeHandle=="left"?"w":"e,w");
+_781.each(function(){
+$(this).resizable({handles:_782,edge:opts.resizeEdge,disabled:($(this).attr("resizable")?$(this).attr("resizable")=="false":false),minWidth:25,onStartResize:function(e){
+_77d.resizing=true;
+_77f.css("cursor",$("body").css("cursor"));
+if(!_77d.proxy){
+_77d.proxy=$("<div class=\"datagrid-resize-proxy\"></div>").appendTo(dc.view);
+}
+if(e.data.dir=="e"){
+e.data.deltaEdge=$(this)._outerWidth()-(e.pageX-$(this).offset().left);
+}else{
+e.data.deltaEdge=$(this).offset().left-e.pageX-1;
+}
+_77d.proxy.css({left:e.pageX-$(_77e).offset().left-1+e.data.deltaEdge,display:"none"});
+setTimeout(function(){
+if(_77d.proxy){
+_77d.proxy.show();
+}
+},500);
+},onResize:function(e){
+_77d.proxy.css({left:e.pageX-$(_77e).offset().left-1+e.data.deltaEdge,display:"block"});
+return false;
+},onStopResize:function(e){
+_77f.css("cursor","");
+$(this).css("height","");
+var _783=$(this).parent().attr("field");
+var col=_77a(_77c,_783);
+col.width=$(this)._outerWidth()+1;
+col.boxWidth=col.width-col.deltaWidth;
+col.auto=undefined;
+$(this).css("width","");
+$(_77c).datagrid("fixColumnSize",_783);
+_77d.proxy.remove();
+_77d.proxy=null;
+if($(this).parents("div:first.datagrid-header").parent().hasClass("datagrid-view1")){
+_732(_77c);
+}
+$(_77c).datagrid("fitColumns");
+opts.onResizeColumn.call(_77c,_783,col.width);
+setTimeout(function(){
+_77d.resizing=false;
+},0);
+}});
+});
+var bb=dc.body1.add(dc.body2);
+bb._unbind();
+for(var _780 in opts.rowEvents){
+bb._bind(_780,opts.rowEvents[_780]);
+}
+dc.body1._bind("mousewheel DOMMouseScroll MozMousePixelScroll",function(e){
+e.preventDefault();
+var e1=e.originalEvent||window.event;
+var _784=e1.wheelDelta||e1.detail*(-1);
+if("deltaY" in e1){
+_784=e1.deltaY*-1;
+}
+var dg=$(e.target).closest("div.datagrid-view").children(".datagrid-f");
+var dc=dg.data("datagrid").dc;
+dc.body2.scrollTop(dc.body2.scrollTop()-_784);
+});
+dc.body2._bind("scroll",function(){
+var b1=dc.view1.children("div.datagrid-body");
+var stv=$(this).scrollTop();
+$(this).scrollTop(stv);
+b1.scrollTop(stv);
+var c1=dc.body1.children(":first");
+var c2=dc.body2.children(":first");
+if(c1.length&&c2.length){
+var top1=c1.offset().top;
+var top2=c2.offset().top;
+if(top1!=top2){
+b1.scrollTop(b1.scrollTop()+top1-top2);
+}
+}
+dc.view2.children("div.datagrid-header,div.datagrid-footer")._scrollLeft($(this)._scrollLeft());
+dc.body2.children("table.datagrid-btable-frozen").css("left",-$(this)._scrollLeft());
+});
+};
+function _785(_786){
+return function(e){
+var td=$(e.target).closest("td[field]");
+if(td.length){
+var _787=_788(td);
+if(!$(_787).data("datagrid").resizing&&_786){
+td.addClass("datagrid-header-over");
+}else{
+td.removeClass("datagrid-header-over");
+}
+}
+};
+};
+function _789(e){
+var _78a=_788(e.target);
+var opts=$(_78a).datagrid("options");
+var ck=$(e.target).closest("input[type=checkbox]");
+if(ck.length){
+if(opts.singleSelect&&opts.selectOnCheck){
+return false;
+}
+if(ck.is(":checked")){
+_78b(_78a);
+}else{
+_78c(_78a);
+}
+e.stopPropagation();
+}else{
+var cell=$(e.target).closest(".datagrid-cell");
+if(cell.length){
+var p1=cell.offset().left+5;
+var p2=cell.offset().left+cell._outerWidth()-5;
+if(e.pageX<p2&&e.pageX>p1){
+_78d(_78a,cell.parent().attr("field"));
+}
+}
+}
+};
+function _78e(e){
+var _78f=_788(e.target);
+var opts=$(_78f).datagrid("options");
+var cell=$(e.target).closest(".datagrid-cell");
+if(cell.length){
+var p1=cell.offset().left+5;
+var p2=cell.offset().left+cell._outerWidth()-5;
+var cond=opts.resizeHandle=="right"?(e.pageX>p2):(opts.resizeHandle=="left"?(e.pageX<p1):(e.pageX<p1||e.pageX>p2));
+if(cond){
+var _790=cell.parent().attr("field");
+var col=_77a(_78f,_790);
+if(col.resizable==false){
+return;
+}
+$(_78f).datagrid("autoSizeColumn",_790);
+col.auto=false;
+}
+}
+};
+function _791(e){
+var _792=_788(e.target);
+var opts=$(_792).datagrid("options");
+var td=$(e.target).closest("td[field]");
+opts.onHeaderContextMenu.call(_792,e,td.attr("field"));
+};
+function _793(_794){
+return function(e){
+var tr=_795(e.target);
+if(!tr){
+return;
+}
+var _796=_788(tr);
+if($.data(_796,"datagrid").resizing){
+return;
+}
+var _797=_798(tr);
+if(_794){
+_799(_796,_797);
+}else{
+var opts=$.data(_796,"datagrid").options;
+opts.finder.getTr(_796,_797).removeClass("datagrid-row-over");
+}
+};
+};
+function _79a(e){
+var tr=_795(e.target);
+if(!tr){
+return;
+}
+var _79b=_788(tr);
+var opts=$.data(_79b,"datagrid").options;
+var _79c=_798(tr);
+var tt=$(e.target);
+if(tt.parent().hasClass("datagrid-cell-check")){
+if(opts.singleSelect&&opts.selectOnCheck){
+tt._propAttr("checked",!tt.is(":checked"));
+_79d(_79b,_79c);
+}else{
+if(tt.is(":checked")){
+tt._propAttr("checked",false);
+_79d(_79b,_79c);
+}else{
+tt._propAttr("checked",true);
+_79e(_79b,_79c);
+}
+}
+}else{
+var row=opts.finder.getRow(_79b,_79c);
+var td=tt.closest("td[field]",tr);
+if(td.length){
+var _79f=td.attr("field");
+opts.onClickCell.call(_79b,_79c,_79f,row[_79f]);
+}
+if(opts.singleSelect==true){
+_7a0(_79b,_79c);
+}else{
+if(opts.ctrlSelect){
+if(e.metaKey||e.ctrlKey){
+if(tr.hasClass("datagrid-row-selected")){
+_7a1(_79b,_79c);
+}else{
+_7a0(_79b,_79c);
+}
+}else{
+if(e.shiftKey){
+$(_79b).datagrid("clearSelections");
+var _7a2=Math.min(opts.lastSelectedIndex||0,_79c);
+var _7a3=Math.max(opts.lastSelectedIndex||0,_79c);
+for(var i=_7a2;i<=_7a3;i++){
+_7a0(_79b,i);
+}
+}else{
+$(_79b).datagrid("clearSelections");
+_7a0(_79b,_79c);
+opts.lastSelectedIndex=_79c;
+}
+}
+}else{
+if(tr.hasClass("datagrid-row-selected")){
+_7a1(_79b,_79c);
+}else{
+_7a0(_79b,_79c);
+}
+}
+}
+opts.onClickRow.apply(_79b,_71c(_79b,[_79c,row]));
+}
+};
+function _7a4(e){
+var tr=_795(e.target);
+if(!tr){
+return;
+}
+var _7a5=_788(tr);
+var opts=$.data(_7a5,"datagrid").options;
+var _7a6=_798(tr);
+var row=opts.finder.getRow(_7a5,_7a6);
+var td=$(e.target).closest("td[field]",tr);
+if(td.length){
+var _7a7=td.attr("field");
+opts.onDblClickCell.call(_7a5,_7a6,_7a7,row[_7a7]);
+}
+opts.onDblClickRow.apply(_7a5,_71c(_7a5,[_7a6,row]));
+};
+function _7a8(e){
+var tr=_795(e.target);
+if(tr){
+var _7a9=_788(tr);
+var opts=$.data(_7a9,"datagrid").options;
+var _7aa=_798(tr);
+var row=opts.finder.getRow(_7a9,_7aa);
+opts.onRowContextMenu.call(_7a9,e,_7aa,row);
+}else{
+var body=_795(e.target,".datagrid-body");
+if(body){
+var _7a9=_788(body);
+var opts=$.data(_7a9,"datagrid").options;
+opts.onRowContextMenu.call(_7a9,e,-1,null);
+}
+}
+};
+function _788(t){
+return $(t).closest("div.datagrid-view").children(".datagrid-f")[0];
+};
+function _795(t,_7ab){
+var tr=$(t).closest(_7ab||"tr.datagrid-row");
+if(tr.length&&tr.parent().length){
+return tr;
+}else{
+return undefined;
+}
+};
+function _798(tr){
+if(tr.attr("datagrid-row-index")){
+return parseInt(tr.attr("datagrid-row-index"));
+}else{
+return tr.attr("node-id");
+}
+};
+function _78d(_7ac,_7ad){
+var _7ae=$.data(_7ac,"datagrid");
+var opts=_7ae.options;
+_7ad=_7ad||{};
+var _7af={sortName:opts.sortName,sortOrder:opts.sortOrder};
+if(typeof _7ad=="object"){
+$.extend(_7af,_7ad);
+}
+var _7b0=[];
+var _7b1=[];
+if(_7af.sortName){
+_7b0=_7af.sortName.split(",");
+_7b1=_7af.sortOrder.split(",");
+}
+if(typeof _7ad=="string"){
+var _7b2=_7ad;
+var col=_77a(_7ac,_7b2);
+if(!col.sortable||_7ae.resizing){
+return;
+}
+var _7b3=col.order||"asc";
+var pos=_719(_7b0,_7b2);
+if(pos>=0){
+var _7b4=_7b1[pos]=="asc"?"desc":"asc";
+if(opts.multiSort&&_7b4==_7b3){
+_7b0.splice(pos,1);
+_7b1.splice(pos,1);
+}else{
+_7b1[pos]=_7b4;
+}
+}else{
+if(opts.multiSort){
+_7b0.push(_7b2);
+_7b1.push(_7b3);
+}else{
+_7b0=[_7b2];
+_7b1=[_7b3];
+}
+}
+_7af.sortName=_7b0.join(",");
+_7af.sortOrder=_7b1.join(",");
+}
+if(opts.onBeforeSortColumn.call(_7ac,_7af.sortName,_7af.sortOrder)==false){
+return;
+}
+$.extend(opts,_7af);
+var dc=_7ae.dc;
+var _7b5=dc.header1.add(dc.header2);
+_7b5.find("div.datagrid-cell").removeClass("datagrid-sort-asc datagrid-sort-desc");
+for(var i=0;i<_7b0.length;i++){
+var col=_77a(_7ac,_7b0[i]);
+_7b5.find("div."+col.cellClass).addClass("datagrid-sort-"+_7b1[i]);
+}
+if(opts.remoteSort){
+_7b6(_7ac);
+}else{
+_7b7(_7ac,$(_7ac).datagrid("getData"));
+}
+opts.onSortColumn.call(_7ac,opts.sortName,opts.sortOrder);
+};
+function _7b8(_7b9,_7ba,_7bb){
+_7bc(true);
+_7bc(false);
+function _7bc(_7bd){
+var aa=_7be(_7b9,_7bd);
+if(aa.length){
+var _7bf=aa[aa.length-1];
+var _7c0=_719(_7bf,_7ba);
+if(_7c0>=0){
+for(var _7c1=0;_7c1<aa.length-1;_7c1++){
+var td=$("#"+aa[_7c1][_7c0]);
+var _7c2=parseInt(td.attr("colspan")||1)+(_7bb||0);
+td.attr("colspan",_7c2);
+if(_7c2){
+td.show();
+}else{
+td.hide();
+}
+}
+}
+}
+};
+};
+function _7c3(_7c4){
+var _7c5=$.data(_7c4,"datagrid");
+var opts=_7c5.options;
+var dc=_7c5.dc;
+var _7c6=dc.view2.children("div.datagrid-header");
+var _7c7=_7c6.children("div.datagrid-header-inner");
+dc.body2.css("overflow-x","");
+_7c8();
+_7c9();
+_7ca();
+_7c8(true);
+_7c7.show();
+if(_7c6.width()>=_7c6.find("table").width()){
+dc.body2.css("overflow-x","hidden");
+}
+if(!opts.showHeader){
+_7c7.hide();
+}
+function _7ca(){
+if(!opts.fitColumns){
+return;
+}
+if(!_7c5.leftWidth){
+_7c5.leftWidth=0;
+}
+var _7cb=0;
+var cc=[];
+var _7cc=_779(_7c4,false);
+for(var i=0;i<_7cc.length;i++){
+var col=_77a(_7c4,_7cc[i]);
+if(_7cd(col)){
+_7cb+=col.width;
+cc.push({field:col.field,col:col,addingWidth:0});
+}
+}
+if(!_7cb){
+return;
+}
+cc[cc.length-1].addingWidth-=_7c5.leftWidth;
+_7c7.show();
+var _7ce=_7c6.width()-_7c6.find("table").width()-opts.scrollbarSize+_7c5.leftWidth;
+var rate=_7ce/_7cb;
+if(!opts.showHeader){
+_7c7.hide();
+}
+for(var i=0;i<cc.length;i++){
+var c=cc[i];
+var _7cf=parseInt(c.col.width*rate);
+c.addingWidth+=_7cf;
+_7ce-=_7cf;
+}
+cc[cc.length-1].addingWidth+=_7ce;
+for(var i=0;i<cc.length;i++){
+var c=cc[i];
+if(c.col.boxWidth+c.addingWidth>0){
+c.col.boxWidth+=c.addingWidth;
+c.col.width+=c.addingWidth;
+}
+}
+_7c5.leftWidth=_7ce;
+$(_7c4).datagrid("fixColumnSize");
+};
+function _7c9(){
+var _7d0=false;
+var _7d1=_779(_7c4,true).concat(_779(_7c4,false));
+$.map(_7d1,function(_7d2){
+var col=_77a(_7c4,_7d2);
+if(String(col.width||"").indexOf("%")>=0){
+var _7d3=$.parser.parseValue("width",col.width,dc.view,opts.scrollbarSize+(opts.rownumbers?opts.rownumberWidth:0))-col.deltaWidth;
+if(_7d3>0){
+col.boxWidth=_7d3;
+_7d0=true;
+}
+}
+});
+if(_7d0){
+$(_7c4).datagrid("fixColumnSize");
+}
+};
+function _7c8(fit){
+var _7d4=dc.header1.add(dc.header2).find(".datagrid-cell-group");
+if(_7d4.length){
+_7d4.each(function(){
+$(this)._outerWidth(fit?$(this).parent().width():10);
+});
+if(fit){
+_732(_7c4);
+}
+}
+};
+function _7cd(col){
+if(String(col.width||"").indexOf("%")>=0){
+return false;
+}
+if(!col.hidden&&!col.checkbox&&!col.auto&&!col.fixed){
+return true;
+}
+};
+};
+function _7d5(_7d6,_7d7){
+var _7d8=$.data(_7d6,"datagrid");
+var opts=_7d8.options;
+var dc=_7d8.dc;
+var tmp=$("<div class=\"datagrid-cell\" style=\"position:absolute;left:-9999px\"></div>").appendTo("body");
+if(_7d7){
+_72d(_7d7);
+$(_7d6).datagrid("fitColumns");
+}else{
+var _7d9=false;
+var _7da=_779(_7d6,true).concat(_779(_7d6,false));
+for(var i=0;i<_7da.length;i++){
+var _7d7=_7da[i];
+var col=_77a(_7d6,_7d7);
+if(col.auto){
+_72d(_7d7);
+_7d9=true;
+}
+}
+if(_7d9){
+$(_7d6).datagrid("fitColumns");
+}
+}
+tmp.remove();
+function _72d(_7db){
+var _7dc=dc.view.find("div.datagrid-header td[field=\""+_7db+"\"] div.datagrid-cell");
+_7dc.css("width","");
+var col=$(_7d6).datagrid("getColumnOption",_7db);
+col.width=undefined;
+col.boxWidth=undefined;
+col.auto=true;
+$(_7d6).datagrid("fixColumnSize",_7db);
+var _7dd=Math.max(_7de("header"),_7de("allbody"),_7de("allfooter"))+1;
+_7dc._outerWidth(_7dd-1);
+col.width=_7dd;
+col.boxWidth=parseInt(_7dc[0].style.width);
+col.deltaWidth=_7dd-col.boxWidth;
+_7dc.css("width","");
+$(_7d6).datagrid("fixColumnSize",_7db);
+opts.onResizeColumn.call(_7d6,_7db,col.width);
+function _7de(type){
+var _7df=0;
+if(type=="header"){
+_7df=_7e0(_7dc);
+}else{
+opts.finder.getTr(_7d6,0,type).find("td[field=\""+_7db+"\"] div.datagrid-cell").each(function(){
+var w=_7e0($(this));
+if(_7df<w){
+_7df=w;
+}
+});
+}
+return _7df;
+function _7e0(cell){
+return cell.is(":visible")?cell._outerWidth():tmp.html(cell.html())._outerWidth();
+};
+};
+};
+};
+function _7e1(_7e2,_7e3){
+var _7e4=$.data(_7e2,"datagrid");
+var opts=_7e4.options;
+var dc=_7e4.dc;
+var _7e5=dc.view.find("table.datagrid-btable,table.datagrid-ftable");
+_7e5.css("table-layout","fixed");
+if(_7e3){
+fix(_7e3);
+}else{
+var ff=_779(_7e2,true).concat(_779(_7e2,false));
+for(var i=0;i<ff.length;i++){
+fix(ff[i]);
+}
+}
+_7e5.css("table-layout","");
+_7e6(_7e2);
+_743(_7e2);
+_7e7(_7e2);
+function fix(_7e8){
+var col=_77a(_7e2,_7e8);
+if(col.cellClass){
+_7e4.ss.set("."+col.cellClass,col.boxWidth?col.boxWidth+"px":"auto");
+}
+};
+};
+function _7e6(_7e9,tds){
+var dc=$.data(_7e9,"datagrid").dc;
+tds=tds||dc.view.find("td.datagrid-td-merged");
+tds.each(function(){
+var td=$(this);
+var _7ea=td.attr("colspan")||1;
+if(_7ea>1){
+var col=_77a(_7e9,td.attr("field"));
+var _7eb=col.boxWidth+col.deltaWidth-1;
+for(var i=1;i<_7ea;i++){
+td=td.next();
+col=_77a(_7e9,td.attr("field"));
+_7eb+=col.boxWidth+col.deltaWidth;
+}
+$(this).children("div.datagrid-cell")._outerWidth(_7eb);
+}
+});
+};
+function _7e7(_7ec){
+var dc=$.data(_7ec,"datagrid").dc;
+dc.view.find("div.datagrid-editable").each(function(){
+var cell=$(this);
+var _7ed=cell.parent().attr("field");
+var col=$(_7ec).datagrid("getColumnOption",_7ed);
+cell._outerWidth(col.boxWidth+col.deltaWidth-1);
+var ed=$.data(this,"datagrid.editor");
+if(ed.actions.resize){
+ed.actions.resize(ed.target,cell.width());
+}
+});
+};
+function _77a(_7ee,_7ef){
+function find(_7f0){
+if(_7f0){
+for(var i=0;i<_7f0.length;i++){
+var cc=_7f0[i];
+for(var j=0;j<cc.length;j++){
+var c=cc[j];
+if(c.field==_7ef){
+return c;
+}
+}
+}
+}
+return null;
+};
+var opts=$.data(_7ee,"datagrid").options;
+var col=find(opts.columns);
+if(!col){
+col=find(opts.frozenColumns);
+}
+return col;
+};
+function _7be(_7f1,_7f2){
+var opts=$.data(_7f1,"datagrid").options;
+var _7f3=_7f2?opts.frozenColumns:opts.columns;
+var aa=[];
+var _7f4=_7f5();
+for(var i=0;i<_7f3.length;i++){
+aa[i]=new Array(_7f4);
+}
+for(var _7f6=0;_7f6<_7f3.length;_7f6++){
+$.map(_7f3[_7f6],function(col){
+var _7f7=_7f8(aa[_7f6]);
+if(_7f7>=0){
+var _7f9=col.field||col.id||"";
+for(var c=0;c<(col.colspan||1);c++){
+for(var r=0;r<(col.rowspan||1);r++){
+aa[_7f6+r][_7f7]=_7f9;
+}
+_7f7++;
+}
+}
+});
+}
+return aa;
+function _7f5(){
+var _7fa=0;
+$.map(_7f3[0]||[],function(col){
+_7fa+=col.colspan||1;
+});
+return _7fa;
+};
+function _7f8(a){
+for(var i=0;i<a.length;i++){
+if(a[i]==undefined){
+return i;
+}
+}
+return -1;
+};
+};
+function _779(_7fb,_7fc){
+var aa=_7be(_7fb,_7fc);
+return aa.length?aa[aa.length-1]:aa;
+};
+function _7b7(_7fd,data){
+var _7fe=$.data(_7fd,"datagrid");
+var opts=_7fe.options;
+var dc=_7fe.dc;
+data=opts.loadFilter.call(_7fd,data);
+if($.isArray(data)){
+data={total:data.length,rows:data};
+}
+data.total=parseInt(data.total);
+_7fe.data=data;
+if(data.footer){
+_7fe.footer=data.footer;
+}
+if(!opts.remoteSort&&opts.sortName){
+var _7ff=opts.sortName.split(",");
+var _800=opts.sortOrder.split(",");
+data.rows.sort(function(r1,r2){
+var r=0;
+for(var i=0;i<_7ff.length;i++){
+var sn=_7ff[i];
+var so=_800[i];
+var col=_77a(_7fd,sn);
+var _801=col.sorter||function(a,b){
+return a==b?0:(a>b?1:-1);
+};
+r=_801(r1[sn],r2[sn],r1,r2)*(so=="asc"?1:-1);
+if(r!=0){
+return r;
+}
+}
+return r;
+});
+}
+if(opts.view.onBeforeRender){
+opts.view.onBeforeRender.call(opts.view,_7fd,data.rows);
+}
+opts.view.render.call(opts.view,_7fd,dc.body2,false);
+opts.view.render.call(opts.view,_7fd,dc.body1,true);
+if(opts.showFooter){
+opts.view.renderFooter.call(opts.view,_7fd,dc.footer2,false);
+opts.view.renderFooter.call(opts.view,_7fd,dc.footer1,true);
+}
+if(opts.view.onAfterRender){
+opts.view.onAfterRender.call(opts.view,_7fd);
+}
+_7fe.ss.clean();
+var _802=$(_7fd).datagrid("getPager");
+if(_802.length){
+var _803=_802.pagination("options");
+if(_803.total!=data.total){
+_802.pagination("refresh",{pageNumber:opts.pageNumber,total:data.total});
+if(opts.pageNumber!=_803.pageNumber&&_803.pageNumber>0){
+opts.pageNumber=_803.pageNumber;
+_7b6(_7fd);
+}
+}
+}
+_743(_7fd);
+dc.body2.triggerHandler("scroll");
+$(_7fd).datagrid("setSelectionState");
+$(_7fd).datagrid("autoSizeColumn");
+opts.onLoadSuccess.call(_7fd,data);
+};
+function _804(_805){
+var _806=$.data(_805,"datagrid");
+var opts=_806.options;
+var dc=_806.dc;
+dc.header1.add(dc.header2).find("input[type=checkbox]")._propAttr("checked",false);
+if(opts.idField){
+var _807=$.data(_805,"treegrid")?true:false;
+var _808=opts.onSelect;
+var _809=opts.onCheck;
+opts.onSelect=opts.onCheck=function(){
+};
+var rows=opts.finder.getRows(_805);
+for(var i=0;i<rows.length;i++){
+var row=rows[i];
+var _80a=_807?row[opts.idField]:$(_805).datagrid("getRowIndex",row[opts.idField]);
+if(_80b(_806.selectedRows,row)){
+_7a0(_805,_80a,true,true);
+}
+if(_80b(_806.checkedRows,row)){
+_79d(_805,_80a,true);
+}
+}
+opts.onSelect=_808;
+opts.onCheck=_809;
+}
+function _80b(a,r){
+for(var i=0;i<a.length;i++){
+if(a[i][opts.idField]==r[opts.idField]){
+a[i]=r;
+return true;
+}
+}
+return false;
+};
+};
+function _80c(_80d,row){
+var _80e=$.data(_80d,"datagrid");
+var opts=_80e.options;
+var rows=_80e.data.rows;
+if(typeof row=="object"){
+return _719(rows,row);
+}else{
+for(var i=0;i<rows.length;i++){
+if(rows[i][opts.idField]==row){
+return i;
+}
+}
+return -1;
+}
+};
+function _80f(_810){
+var _811=$.data(_810,"datagrid");
+var opts=_811.options;
+var data=_811.data;
+if(opts.idField){
+return _811.selectedRows;
+}else{
+var rows=[];
+opts.finder.getTr(_810,"","selected",2).each(function(){
+rows.push(opts.finder.getRow(_810,$(this)));
+});
+return rows;
+}
+};
+function _812(_813){
+var _814=$.data(_813,"datagrid");
+var opts=_814.options;
+if(opts.idField){
+return _814.checkedRows;
+}else{
+var rows=[];
+opts.finder.getTr(_813,"","checked",2).each(function(){
+rows.push(opts.finder.getRow(_813,$(this)));
+});
+return rows;
+}
+};
+function _815(_816,_817){
+var _818=$.data(_816,"datagrid");
+var dc=_818.dc;
+var opts=_818.options;
+var tr=opts.finder.getTr(_816,_817);
+if(tr.length){
+if(tr.closest("table").hasClass("datagrid-btable-frozen")){
+return;
+}
+var _819=dc.view2.children("div.datagrid-header")._outerHeight();
+var _81a=dc.body2;
+var _81b=opts.scrollbarSize;
+if(_81a[0].offsetHeight&&_81a[0].clientHeight&&_81a[0].offsetHeight<=_81a[0].clientHeight){
+_81b=0;
+}
+var _81c=_81a.outerHeight(true)-_81a.outerHeight();
+var top=tr.offset().top-dc.view2.offset().top-_819-_81c;
+if(top<0){
+_81a.scrollTop(_81a.scrollTop()+top);
+}else{
+if(top+tr._outerHeight()>_81a.height()-_81b){
+_81a.scrollTop(_81a.scrollTop()+top+tr._outerHeight()-_81a.height()+_81b);
+}
+}
+}
+};
+function _799(_81d,_81e){
+var _81f=$.data(_81d,"datagrid");
+var opts=_81f.options;
+opts.finder.getTr(_81d,_81f.highlightIndex).removeClass("datagrid-row-over");
+opts.finder.getTr(_81d,_81e).addClass("datagrid-row-over");
+_81f.highlightIndex=_81e;
+};
+function _7a0(_820,_821,_822,_823){
+var _824=$.data(_820,"datagrid");
+var opts=_824.options;
+var row=opts.finder.getRow(_820,_821);
+if(!row){
+return;
+}
+if(opts.onBeforeSelect.apply(_820,_71c(_820,[_821,row]))==false){
+return;
+}
+if(opts.singleSelect){
+_825(_820,true);
+_824.selectedRows=[];
+}
+if(!_822&&opts.checkOnSelect){
+_79d(_820,_821,true);
+}
+if(opts.idField){
+_71b(_824.selectedRows,opts.idField,row);
+}
+opts.finder.getTr(_820,_821).addClass("datagrid-row-selected");
+opts.onSelect.apply(_820,_71c(_820,[_821,row]));
+if(!_823&&opts.scrollOnSelect){
+_815(_820,_821);
+}
+};
+function _7a1(_826,_827,_828){
+var _829=$.data(_826,"datagrid");
+var dc=_829.dc;
+var opts=_829.options;
+var row=opts.finder.getRow(_826,_827);
+if(!row){
+return;
+}
+if(opts.onBeforeUnselect.apply(_826,_71c(_826,[_827,row]))==false){
+return;
+}
+if(!_828&&opts.checkOnSelect){
+_79e(_826,_827,true);
+}
+opts.finder.getTr(_826,_827).removeClass("datagrid-row-selected");
+if(opts.idField){
+_71a(_829.selectedRows,opts.idField,row[opts.idField]);
+}
+opts.onUnselect.apply(_826,_71c(_826,[_827,row]));
+};
+function _82a(_82b,_82c){
+var _82d=$.data(_82b,"datagrid");
+var opts=_82d.options;
+var rows=opts.finder.getRows(_82b);
+var _82e=$.data(_82b,"datagrid").selectedRows;
+if(!_82c&&opts.checkOnSelect){
+_78b(_82b,true);
+}
+opts.finder.getTr(_82b,"","allbody").addClass("datagrid-row-selected");
+if(opts.idField){
+for(var _82f=0;_82f<rows.length;_82f++){
+_71b(_82e,opts.idField,rows[_82f]);
+}
+}
+opts.onSelectAll.call(_82b,rows);
+};
+function _825(_830,_831){
+var _832=$.data(_830,"datagrid");
+var opts=_832.options;
+var rows=opts.finder.getRows(_830);
+var _833=$.data(_830,"datagrid").selectedRows;
+if(!_831&&opts.checkOnSelect){
+_78c(_830,true);
+}
+opts.finder.getTr(_830,"","selected").removeClass("datagrid-row-selected");
+if(opts.idField){
+for(var _834=0;_834<rows.length;_834++){
+_71a(_833,opts.idField,rows[_834][opts.idField]);
+}
+}
+opts.onUnselectAll.call(_830,rows);
+};
+function _79d(_835,_836,_837){
+var _838=$.data(_835,"datagrid");
+var opts=_838.options;
+var row=opts.finder.getRow(_835,_836);
+if(!row){
+return;
+}
+if(opts.onBeforeCheck.apply(_835,_71c(_835,[_836,row]))==false){
+return;
+}
+if(opts.singleSelect&&opts.selectOnCheck){
+_78c(_835,true);
+_838.checkedRows=[];
+}
+if(!_837&&opts.selectOnCheck){
+_7a0(_835,_836,true);
+}
+var tr=opts.finder.getTr(_835,_836).addClass("datagrid-row-checked");
+tr.find("div.datagrid-cell-check input[type=checkbox]")._propAttr("checked",true);
+tr=opts.finder.getTr(_835,"","checked",2);
+if(tr.length==opts.finder.getRows(_835).length){
+var dc=_838.dc;
+dc.header1.add(dc.header2).find("input[type=checkbox]")._propAttr("checked",true);
+}
+if(opts.idField){
+_71b(_838.checkedRows,opts.idField,row);
+}
+opts.onCheck.apply(_835,_71c(_835,[_836,row]));
+};
+function _79e(_839,_83a,_83b){
+var _83c=$.data(_839,"datagrid");
+var opts=_83c.options;
+var row=opts.finder.getRow(_839,_83a);
+if(!row){
+return;
+}
+if(opts.onBeforeUncheck.apply(_839,_71c(_839,[_83a,row]))==false){
+return;
+}
+if(!_83b&&opts.selectOnCheck){
+_7a1(_839,_83a,true);
+}
+var tr=opts.finder.getTr(_839,_83a).removeClass("datagrid-row-checked");
+tr.find("div.datagrid-cell-check input[type=checkbox]")._propAttr("checked",false);
+var dc=_83c.dc;
+var _83d=dc.header1.add(dc.header2);
+_83d.find("input[type=checkbox]")._propAttr("checked",false);
+if(opts.idField){
+_71a(_83c.checkedRows,opts.idField,row[opts.idField]);
+}
+opts.onUncheck.apply(_839,_71c(_839,[_83a,row]));
+};
+function _78b(_83e,_83f){
+var _840=$.data(_83e,"datagrid");
+var opts=_840.options;
+var rows=opts.finder.getRows(_83e);
+if(!_83f&&opts.selectOnCheck){
+_82a(_83e,true);
+}
+var dc=_840.dc;
+var hck=dc.header1.add(dc.header2).find("input[type=checkbox]");
+var bck=opts.finder.getTr(_83e,"","allbody").addClass("datagrid-row-checked").find("div.datagrid-cell-check input[type=checkbox]");
+hck.add(bck)._propAttr("checked",true);
+if(opts.idField){
+for(var i=0;i<rows.length;i++){
+_71b(_840.checkedRows,opts.idField,rows[i]);
+}
+}
+opts.onCheckAll.call(_83e,rows);
+};
+function _78c(_841,_842){
+var _843=$.data(_841,"datagrid");
+var opts=_843.options;
+var rows=opts.finder.getRows(_841);
+if(!_842&&opts.selectOnCheck){
+_825(_841,true);
+}
+var dc=_843.dc;
+var hck=dc.header1.add(dc.header2).find("input[type=checkbox]");
+var bck=opts.finder.getTr(_841,"","checked").removeClass("datagrid-row-checked").find("div.datagrid-cell-check input[type=checkbox]");
+hck.add(bck)._propAttr("checked",false);
+if(opts.idField){
+for(var i=0;i<rows.length;i++){
+_71a(_843.checkedRows,opts.idField,rows[i][opts.idField]);
+}
+}
+opts.onUncheckAll.call(_841,rows);
+};
+function _844(_845,_846){
+var opts=$.data(_845,"datagrid").options;
+var tr=opts.finder.getTr(_845,_846);
+var row=opts.finder.getRow(_845,_846);
+if(tr.hasClass("datagrid-row-editing")){
+return;
+}
+if(opts.onBeforeEdit.apply(_845,_71c(_845,[_846,row]))==false){
+return;
+}
+tr.addClass("datagrid-row-editing");
+_847(_845,_846);
+_7e7(_845);
+tr.find("div.datagrid-editable").each(function(){
+var _848=$(this).parent().attr("field");
+var ed=$.data(this,"datagrid.editor");
+ed.actions.setValue(ed.target,row[_848]);
+});
+_849(_845,_846);
+opts.onBeginEdit.apply(_845,_71c(_845,[_846,row]));
+};
+function _84a(_84b,_84c,_84d){
+var _84e=$.data(_84b,"datagrid");
+var opts=_84e.options;
+var _84f=_84e.updatedRows;
+var _850=_84e.insertedRows;
+var tr=opts.finder.getTr(_84b,_84c);
+var row=opts.finder.getRow(_84b,_84c);
+if(!tr.hasClass("datagrid-row-editing")){
+return;
+}
+if(!_84d){
+if(!_849(_84b,_84c)){
+return;
+}
+var _851=false;
+var _852={};
+tr.find("div.datagrid-editable").each(function(){
+var _853=$(this).parent().attr("field");
+var ed=$.data(this,"datagrid.editor");
+var t=$(ed.target);
+var _854=t.data("textbox")?t.textbox("textbox"):t;
+if(_854.is(":focus")){
+_854.triggerHandler("blur");
+}
+var _855=ed.actions.getValue(ed.target);
+if(row[_853]!==_855){
+row[_853]=_855;
+_851=true;
+_852[_853]=_855;
+}
+});
+if(_851){
+if(_719(_850,row)==-1){
+if(_719(_84f,row)==-1){
+_84f.push(row);
+}
+}
+}
+opts.onEndEdit.apply(_84b,_71c(_84b,[_84c,row,_852]));
+}
+tr.removeClass("datagrid-row-editing");
+_856(_84b,_84c);
+$(_84b).datagrid("refreshRow",_84c);
+if(!_84d){
+opts.onAfterEdit.apply(_84b,_71c(_84b,[_84c,row,_852]));
+}else{
+opts.onCancelEdit.apply(_84b,_71c(_84b,[_84c,row]));
+}
+};
+function _857(_858,_859){
+var opts=$.data(_858,"datagrid").options;
+var tr=opts.finder.getTr(_858,_859);
+var _85a=[];
+tr.children("td").each(function(){
+var cell=$(this).find("div.datagrid-editable");
+if(cell.length){
+var ed=$.data(cell[0],"datagrid.editor");
+_85a.push(ed);
+}
+});
+return _85a;
+};
+function _85b(_85c,_85d){
+var _85e=_857(_85c,_85d.index!=undefined?_85d.index:_85d.id);
+for(var i=0;i<_85e.length;i++){
+if(_85e[i].field==_85d.field){
+return _85e[i];
+}
+}
+return null;
+};
+function _847(_85f,_860){
+var opts=$.data(_85f,"datagrid").options;
+var tr=opts.finder.getTr(_85f,_860);
+tr.children("td").each(function(){
+var cell=$(this).find("div.datagrid-cell");
+var _861=$(this).attr("field");
+var col=_77a(_85f,_861);
+if(col&&col.editor){
+var _862,_863;
+if(typeof col.editor=="string"){
+_862=col.editor;
+}else{
+_862=col.editor.type;
+_863=col.editor.options;
+}
+var _864=opts.editors[_862];
+if(_864){
+var _865=cell.html();
+var _866=cell._outerWidth();
+cell.addClass("datagrid-editable");
+cell._outerWidth(_866);
+cell.html("<table border=\"0\" cellspacing=\"0\" cellpadding=\"1\"><tr><td></td></tr></table>");
+cell.children("table")._bind("click dblclick contextmenu",function(e){
+e.stopPropagation();
+});
+$.data(cell[0],"datagrid.editor",{actions:_864,target:_864.init(cell.find("td"),$.extend({height:opts.editorHeight},_863)),field:_861,type:_862,oldHtml:_865});
+}
+}
+});
+_743(_85f,_860,true);
+};
+function _856(_867,_868){
+var opts=$.data(_867,"datagrid").options;
+var tr=opts.finder.getTr(_867,_868);
+tr.children("td").each(function(){
+var cell=$(this).find("div.datagrid-editable");
+if(cell.length){
+var ed=$.data(cell[0],"datagrid.editor");
+if(ed.actions.destroy){
+ed.actions.destroy(ed.target);
+}
+cell.html(ed.oldHtml);
+$.removeData(cell[0],"datagrid.editor");
+cell.removeClass("datagrid-editable");
+cell.css("width","");
+}
+});
+};
+function _849(_869,_86a){
+var tr=$.data(_869,"datagrid").options.finder.getTr(_869,_86a);
+if(!tr.hasClass("datagrid-row-editing")){
+return true;
+}
+var vbox=tr.find(".validatebox-text");
+vbox.validatebox("validate");
+vbox.trigger("mouseleave");
+var _86b=tr.find(".validatebox-invalid");
+return _86b.length==0;
+};
+function _86c(_86d,_86e){
+var _86f=$.data(_86d,"datagrid").insertedRows;
+var _870=$.data(_86d,"datagrid").deletedRows;
+var _871=$.data(_86d,"datagrid").updatedRows;
+if(!_86e){
+var rows=[];
+rows=rows.concat(_86f);
+rows=rows.concat(_870);
+rows=rows.concat(_871);
+return rows;
+}else{
+if(_86e=="inserted"){
+return _86f;
+}else{
+if(_86e=="deleted"){
+return _870;
+}else{
+if(_86e=="updated"){
+return _871;
+}
+}
+}
+}
+return [];
+};
+function _872(_873,_874){
+var _875=$.data(_873,"datagrid");
+var opts=_875.options;
+var data=_875.data;
+var _876=_875.insertedRows;
+var _877=_875.deletedRows;
+$(_873).datagrid("cancelEdit",_874);
+var row=opts.finder.getRow(_873,_874);
+if(_719(_876,row)>=0){
+_71a(_876,row);
+}else{
+_877.push(row);
+}
+_71a(_875.selectedRows,opts.idField,row[opts.idField]);
+_71a(_875.checkedRows,opts.idField,row[opts.idField]);
+opts.view.deleteRow.call(opts.view,_873,_874);
+if(opts.height=="auto"){
+_743(_873);
+}
+$(_873).datagrid("getPager").pagination("refresh",{total:data.total});
+};
+function _878(_879,_87a){
+var data=$.data(_879,"datagrid").data;
+var view=$.data(_879,"datagrid").options.view;
+var _87b=$.data(_879,"datagrid").insertedRows;
+view.insertRow.call(view,_879,_87a.index,_87a.row);
+_87b.push(_87a.row);
+$(_879).datagrid("getPager").pagination("refresh",{total:data.total});
+};
+function _87c(_87d,row){
+var data=$.data(_87d,"datagrid").data;
+var view=$.data(_87d,"datagrid").options.view;
+var _87e=$.data(_87d,"datagrid").insertedRows;
+view.insertRow.call(view,_87d,null,row);
+_87e.push(row);
+$(_87d).datagrid("getPager").pagination("refresh",{total:data.total});
+};
+function _87f(_880,_881){
+var _882=$.data(_880,"datagrid");
+var opts=_882.options;
+var row=opts.finder.getRow(_880,_881.index);
+var _883=false;
+_881.row=_881.row||{};
+for(var _884 in _881.row){
+if(row[_884]!==_881.row[_884]){
+_883=true;
+break;
+}
+}
+if(_883){
+if(_719(_882.insertedRows,row)==-1){
+if(_719(_882.updatedRows,row)==-1){
+_882.updatedRows.push(row);
+}
+}
+opts.view.updateRow.call(opts.view,_880,_881.index,_881.row);
+}
+};
+function _885(_886){
+var _887=$.data(_886,"datagrid");
+var data=_887.data;
+var rows=data.rows;
+var _888=[];
+for(var i=0;i<rows.length;i++){
+_888.push($.extend({},rows[i]));
+}
+_887.originalRows=_888;
+_887.updatedRows=[];
+_887.insertedRows=[];
+_887.deletedRows=[];
+};
+function _889(_88a){
+var data=$.data(_88a,"datagrid").data;
+var ok=true;
+for(var i=0,len=data.rows.length;i<len;i++){
+if(_849(_88a,i)){
+$(_88a).datagrid("endEdit",i);
+}else{
+ok=false;
+}
+}
+if(ok){
+_885(_88a);
+}
+};
+function _88b(_88c){
+var _88d=$.data(_88c,"datagrid");
+var opts=_88d.options;
+var _88e=_88d.originalRows;
+var _88f=_88d.insertedRows;
+var _890=_88d.deletedRows;
+var _891=_88d.selectedRows;
+var _892=_88d.checkedRows;
+var data=_88d.data;
+function _893(a){
+var ids=[];
+for(var i=0;i<a.length;i++){
+ids.push(a[i][opts.idField]);
+}
+return ids;
+};
+function _894(ids,_895){
+for(var i=0;i<ids.length;i++){
+var _896=_80c(_88c,ids[i]);
+if(_896>=0){
+(_895=="s"?_7a0:_79d)(_88c,_896,true);
+}
+}
+};
+for(var i=0;i<data.rows.length;i++){
+$(_88c).datagrid("cancelEdit",i);
+}
+var _897=_893(_891);
+var _898=_893(_892);
+_891.splice(0,_891.length);
+_892.splice(0,_892.length);
+data.total+=_890.length-_88f.length;
+data.rows=_88e;
+_7b7(_88c,data);
+_894(_897,"s");
+_894(_898,"c");
+_885(_88c);
+};
+function _7b6(_899,_89a,cb){
+var opts=$.data(_899,"datagrid").options;
+if(_89a){
+opts.queryParams=_89a;
+}
+var _89b=$.extend({},opts.queryParams);
+if(opts.pagination){
+$.extend(_89b,{page:opts.pageNumber||1,rows:opts.pageSize});
+}
+if(opts.sortName&&opts.remoteSort){
+$.extend(_89b,{sort:opts.sortName,order:opts.sortOrder});
+}
+if(opts.onBeforeLoad.call(_899,_89b)==false){
+opts.view.setEmptyMsg(_899);
+return;
+}
+$(_899).datagrid("loading");
+var _89c=opts.loader.call(_899,_89b,function(data){
+$(_899).datagrid("loaded");
+$(_899).datagrid("loadData",data);
+if(cb){
+cb();
+}
+},function(){
+$(_899).datagrid("loaded");
+opts.onLoadError.apply(_899,arguments);
+});
+if(_89c==false){
+$(_899).datagrid("loaded");
+opts.view.setEmptyMsg(_899);
+}
+};
+function _89d(_89e,_89f){
+var opts=$.data(_89e,"datagrid").options;
+_89f.type=_89f.type||"body";
+_89f.rowspan=_89f.rowspan||1;
+_89f.colspan=_89f.colspan||1;
+if(_89f.rowspan==1&&_89f.colspan==1){
+return;
+}
+var tr=opts.finder.getTr(_89e,(_89f.index!=undefined?_89f.index:_89f.id),_89f.type);
+if(!tr.length){
+return;
+}
+var td=tr.find("td[field=\""+_89f.field+"\"]");
+td.attr("rowspan",_89f.rowspan).attr("colspan",_89f.colspan);
+td.addClass("datagrid-td-merged");
+_8a0(td.next(),_89f.colspan-1);
+for(var i=1;i<_89f.rowspan;i++){
+tr=tr.next();
+if(!tr.length){
+break;
+}
+_8a0(tr.find("td[field=\""+_89f.field+"\"]"),_89f.colspan);
+}
+_7e6(_89e,td);
+function _8a0(td,_8a1){
+for(var i=0;i<_8a1;i++){
+td.hide();
+td=td.next();
+}
+};
+};
+$.fn.datagrid=function(_8a2,_8a3){
+if(typeof _8a2=="string"){
+return $.fn.datagrid.methods[_8a2](this,_8a3);
+}
+_8a2=_8a2||{};
+return this.each(function(){
+var _8a4=$.data(this,"datagrid");
+var opts;
+if(_8a4){
+opts=$.extend(_8a4.options,_8a2);
+_8a4.options=opts;
+}else{
+opts=$.extend({},$.extend({},$.fn.datagrid.defaults,{queryParams:{}}),$.fn.datagrid.parseOptions(this),_8a2);
+$(this).css("width","").css("height","");
+var _8a5=_758(this,opts.rownumbers);
+if(!opts.columns){
+opts.columns=_8a5.columns;
+}
+if(!opts.frozenColumns){
+opts.frozenColumns=_8a5.frozenColumns;
+}
+opts.columns=$.extend(true,[],opts.columns);
+opts.frozenColumns=$.extend(true,[],opts.frozenColumns);
+opts.view=$.extend({},opts.view);
+$.data(this,"datagrid",{options:opts,panel:_8a5.panel,dc:_8a5.dc,ss:null,selectedRows:[],checkedRows:[],data:{total:0,rows:[]},originalRows:[],updatedRows:[],insertedRows:[],deletedRows:[]});
+}
+_761(this);
+_77b(this);
+_72d(this);
+if(opts.data){
+$(this).datagrid("loadData",opts.data);
+}else{
+var data=$.fn.datagrid.parseData(this);
+if(data.total>0){
+$(this).datagrid("loadData",data);
+}else{
+$(this).datagrid("autoSizeColumn");
+}
+}
+_7b6(this);
+});
+};
+function _8a6(_8a7){
+var _8a8={};
+$.map(_8a7,function(name){
+_8a8[name]=_8a9(name);
+});
+return _8a8;
+function _8a9(name){
+function isA(_8aa){
+return $.data($(_8aa)[0],name)!=undefined;
+};
+return {init:function(_8ab,_8ac){
+var _8ad=$("<input type=\"text\" class=\"datagrid-editable-input\">").appendTo(_8ab);
+if(_8ad[name]&&name!="text"){
+return _8ad[name](_8ac);
+}else{
+return _8ad;
+}
+},destroy:function(_8ae){
+if(isA(_8ae,name)){
+$(_8ae)[name]("destroy");
+}
+},getValue:function(_8af){
+if(isA(_8af,name)){
+var opts=$(_8af)[name]("options");
+if(opts.multiple){
+return $(_8af)[name]("getValues").join(opts.separator);
+}else{
+return $(_8af)[name]("getValue");
+}
+}else{
+return $(_8af).val();
+}
+},setValue:function(_8b0,_8b1){
+if(isA(_8b0,name)){
+var opts=$(_8b0)[name]("options");
+if(opts.multiple){
+if(_8b1){
+$(_8b0)[name]("setValues",_8b1.split(opts.separator));
+}else{
+$(_8b0)[name]("clear");
+}
+}else{
+$(_8b0)[name]("setValue",_8b1);
+}
+}else{
+$(_8b0).val(_8b1);
+}
+},resize:function(_8b2,_8b3){
+if(isA(_8b2,name)){
+$(_8b2)[name]("resize",_8b3);
+}else{
+$(_8b2)._size({width:_8b3,height:$.fn.datagrid.defaults.editorHeight});
+}
+}};
+};
+};
+var _8b4=$.extend({},_8a6(["text","textbox","passwordbox","filebox","numberbox","numberspinner","combobox","combotree","combogrid","combotreegrid","datebox","datetimebox","timespinner","datetimespinner"]),{textarea:{init:function(_8b5,_8b6){
+var _8b7=$("<textarea class=\"datagrid-editable-input\"></textarea>").appendTo(_8b5);
+_8b7.css("vertical-align","middle")._outerHeight(_8b6.height);
+return _8b7;
+},getValue:function(_8b8){
+return $(_8b8).val();
+},setValue:function(_8b9,_8ba){
+$(_8b9).val(_8ba);
+},resize:function(_8bb,_8bc){
+$(_8bb)._outerWidth(_8bc);
+}},checkbox:{init:function(_8bd,_8be){
+var _8bf=$("<input type=\"checkbox\">").appendTo(_8bd);
+_8bf.val(_8be.on);
+_8bf.attr("offval",_8be.off);
+return _8bf;
+},getValue:function(_8c0){
+if($(_8c0).is(":checked")){
+return $(_8c0).val();
+}else{
+return $(_8c0).attr("offval");
+}
+},setValue:function(_8c1,_8c2){
+var _8c3=false;
+if($(_8c1).val()==_8c2){
+_8c3=true;
+}
+$(_8c1)._propAttr("checked",_8c3);
+}},validatebox:{init:function(_8c4,_8c5){
+var _8c6=$("<input type=\"text\" class=\"datagrid-editable-input\">").appendTo(_8c4);
+_8c6.validatebox(_8c5);
+return _8c6;
+},destroy:function(_8c7){
+$(_8c7).validatebox("destroy");
+},getValue:function(_8c8){
+return $(_8c8).val();
+},setValue:function(_8c9,_8ca){
+$(_8c9).val(_8ca);
+},resize:function(_8cb,_8cc){
+$(_8cb)._outerWidth(_8cc)._outerHeight($.fn.datagrid.defaults.editorHeight);
+}}});
+$.fn.datagrid.methods={options:function(jq){
+var _8cd=$.data(jq[0],"datagrid").options;
+var _8ce=$.data(jq[0],"datagrid").panel.panel("options");
+var opts=$.extend(_8cd,{width:_8ce.width,height:_8ce.height,closed:_8ce.closed,collapsed:_8ce.collapsed,minimized:_8ce.minimized,maximized:_8ce.maximized});
+return opts;
+},setSelectionState:function(jq){
+return jq.each(function(){
+_804(this);
+});
+},createStyleSheet:function(jq){
+return _71e(jq[0]);
+},getPanel:function(jq){
+return $.data(jq[0],"datagrid").panel;
+},getPager:function(jq){
+return $.data(jq[0],"datagrid").panel.children("div.datagrid-pager");
+},getColumnFields:function(jq,_8cf){
+return _779(jq[0],_8cf);
+},getColumnOption:function(jq,_8d0){
+return _77a(jq[0],_8d0);
+},resize:function(jq,_8d1){
+return jq.each(function(){
+_72d(this,_8d1);
+});
+},load:function(jq,_8d2){
+return jq.each(function(){
+var opts=$(this).datagrid("options");
+if(typeof _8d2=="string"){
+opts.url=_8d2;
+_8d2=null;
+}
+opts.pageNumber=1;
+var _8d3=$(this).datagrid("getPager");
+_8d3.pagination("refresh",{pageNumber:1});
+_7b6(this,_8d2);
+});
+},reload:function(jq,_8d4){
+return jq.each(function(){
+var opts=$(this).datagrid("options");
+if(typeof _8d4=="string"){
+opts.url=_8d4;
+_8d4=null;
+}
+_7b6(this,_8d4);
+});
+},reloadFooter:function(jq,_8d5){
+return jq.each(function(){
+var opts=$.data(this,"datagrid").options;
+var dc=$.data(this,"datagrid").dc;
+if(_8d5){
+$.data(this,"datagrid").footer=_8d5;
+}
+if(opts.showFooter){
+opts.view.renderFooter.call(opts.view,this,dc.footer2,false);
+opts.view.renderFooter.call(opts.view,this,dc.footer1,true);
+if(opts.view.onAfterRender){
+opts.view.onAfterRender.call(opts.view,this);
+}
+$(this).datagrid("fixRowHeight");
+}
+});
+},loading:function(jq){
+return jq.each(function(){
+var opts=$.data(this,"datagrid").options;
+$(this).datagrid("getPager").pagination("loading");
+if(opts.loadMsg){
+var _8d6=$(this).datagrid("getPanel");
+if(!_8d6.children("div.datagrid-mask").length){
+$("<div class=\"datagrid-mask\" style=\"display:block\"></div>").appendTo(_8d6);
+var msg=$("<div class=\"datagrid-mask-msg\" style=\"display:block;left:50%\"></div>").html(opts.loadMsg).appendTo(_8d6);
+msg._outerHeight(40);
+msg.css({marginLeft:(-msg.outerWidth()/2),lineHeight:(msg.height()+"px")});
+}
+}
+});
+},loaded:function(jq){
+return jq.each(function(){
+$(this).datagrid("getPager").pagination("loaded");
+var _8d7=$(this).datagrid("getPanel");
+_8d7.children("div.datagrid-mask-msg").remove();
+_8d7.children("div.datagrid-mask").remove();
+});
+},fitColumns:function(jq){
+return jq.each(function(){
+_7c3(this);
+});
+},fixColumnSize:function(jq,_8d8){
+return jq.each(function(){
+_7e1(this,_8d8);
+});
+},fixRowHeight:function(jq,_8d9){
+return jq.each(function(){
+_743(this,_8d9);
+});
+},freezeRow:function(jq,_8da){
+return jq.each(function(){
+_751(this,_8da);
+});
+},autoSizeColumn:function(jq,_8db){
+return jq.each(function(){
+_7d5(this,_8db);
+});
+},loadData:function(jq,data){
+return jq.each(function(){
+_7b7(this,data);
+_885(this);
+});
+},getData:function(jq){
+return $.data(jq[0],"datagrid").data;
+},getRows:function(jq){
+return $.data(jq[0],"datagrid").data.rows;
+},getFooterRows:function(jq){
+return $.data(jq[0],"datagrid").footer;
+},getRowIndex:function(jq,id){
+return _80c(jq[0],id);
+},getChecked:function(jq){
+return _812(jq[0]);
+},getSelected:function(jq){
+var rows=_80f(jq[0]);
+return rows.length>0?rows[0]:null;
+},getSelections:function(jq){
+return _80f(jq[0]);
+},clearSelections:function(jq){
+return jq.each(function(){
+var _8dc=$.data(this,"datagrid");
+var _8dd=_8dc.selectedRows;
+var _8de=_8dc.checkedRows;
+_8dd.splice(0,_8dd.length);
+_825(this);
+if(_8dc.options.checkOnSelect){
+_8de.splice(0,_8de.length);
+}
+});
+},clearChecked:function(jq){
+return jq.each(function(){
+var _8df=$.data(this,"datagrid");
+var _8e0=_8df.selectedRows;
+var _8e1=_8df.checkedRows;
+_8e1.splice(0,_8e1.length);
+_78c(this);
+if(_8df.options.selectOnCheck){
+_8e0.splice(0,_8e0.length);
+}
+});
+},scrollTo:function(jq,_8e2){
+return jq.each(function(){
+_815(this,_8e2);
+});
+},highlightRow:function(jq,_8e3){
+return jq.each(function(){
+_799(this,_8e3);
+_815(this,_8e3);
+});
+},selectAll:function(jq){
+return jq.each(function(){
+_82a(this);
+});
+},unselectAll:function(jq){
+return jq.each(function(){
+_825(this);
+});
+},selectRow:function(jq,_8e4){
+return jq.each(function(){
+_7a0(this,_8e4);
+});
+},selectRecord:function(jq,id){
+return jq.each(function(){
+var opts=$.data(this,"datagrid").options;
+if(opts.idField){
+var _8e5=_80c(this,id);
+if(_8e5>=0){
+$(this).datagrid("selectRow",_8e5);
+}
+}
+});
+},unselectRow:function(jq,_8e6){
+return jq.each(function(){
+_7a1(this,_8e6);
+});
+},checkRow:function(jq,_8e7){
+return jq.each(function(){
+_79d(this,_8e7);
+});
+},uncheckRow:function(jq,_8e8){
+return jq.each(function(){
+_79e(this,_8e8);
+});
+},checkAll:function(jq){
+return jq.each(function(){
+_78b(this);
+});
+},uncheckAll:function(jq){
+return jq.each(function(){
+_78c(this);
+});
+},beginEdit:function(jq,_8e9){
+return jq.each(function(){
+_844(this,_8e9);
+});
+},endEdit:function(jq,_8ea){
+return jq.each(function(){
+_84a(this,_8ea,false);
+});
+},cancelEdit:function(jq,_8eb){
+return jq.each(function(){
+_84a(this,_8eb,true);
+});
+},getEditors:function(jq,_8ec){
+return _857(jq[0],_8ec);
+},getEditor:function(jq,_8ed){
+return _85b(jq[0],_8ed);
+},refreshRow:function(jq,_8ee){
+return jq.each(function(){
+var opts=$.data(this,"datagrid").options;
+opts.view.refreshRow.call(opts.view,this,_8ee);
+});
+},validateRow:function(jq,_8ef){
+return _849(jq[0],_8ef);
+},updateRow:function(jq,_8f0){
+return jq.each(function(){
+_87f(this,_8f0);
+});
+},appendRow:function(jq,row){
+return jq.each(function(){
+_87c(this,row);
+});
+},insertRow:function(jq,_8f1){
+return jq.each(function(){
+_878(this,_8f1);
+});
+},deleteRow:function(jq,_8f2){
+return jq.each(function(){
+_872(this,_8f2);
+});
+},getChanges:function(jq,_8f3){
+return _86c(jq[0],_8f3);
+},acceptChanges:function(jq){
+return jq.each(function(){
+_889(this);
+});
+},rejectChanges:function(jq){
+return jq.each(function(){
+_88b(this);
+});
+},mergeCells:function(jq,_8f4){
+return jq.each(function(){
+_89d(this,_8f4);
+});
+},showColumn:function(jq,_8f5){
+return jq.each(function(){
+var col=$(this).datagrid("getColumnOption",_8f5);
+if(col.hidden){
+col.hidden=false;
+$(this).datagrid("getPanel").find("td[field=\""+_8f5+"\"]").show();
+_7b8(this,_8f5,1);
+$(this).datagrid("fitColumns");
+}
+});
+},hideColumn:function(jq,_8f6){
+return jq.each(function(){
+var col=$(this).datagrid("getColumnOption",_8f6);
+if(!col.hidden){
+col.hidden=true;
+$(this).datagrid("getPanel").find("td[field=\""+_8f6+"\"]").hide();
+_7b8(this,_8f6,-1);
+$(this).datagrid("fitColumns");
+}
+});
+},sort:function(jq,_8f7){
+return jq.each(function(){
+_78d(this,_8f7);
+});
+},gotoPage:function(jq,_8f8){
+return jq.each(function(){
+var _8f9=this;
+var page,cb;
+if(typeof _8f8=="object"){
+page=_8f8.page;
+cb=_8f8.callback;
+}else{
+page=_8f8;
+}
+$(_8f9).datagrid("options").pageNumber=page;
+$(_8f9).datagrid("getPager").pagination("refresh",{pageNumber:page});
+_7b6(_8f9,null,function(){
+if(cb){
+cb.call(_8f9,page);
+}
+});
+});
+}};
+$.fn.datagrid.parseOptions=function(_8fa){
+var t=$(_8fa);
+return $.extend({},$.fn.panel.parseOptions(_8fa),$.parser.parseOptions(_8fa,["url","toolbar","idField","sortName","sortOrder","pagePosition","resizeHandle",{sharedStyleSheet:"boolean",fitColumns:"boolean",autoRowHeight:"boolean",striped:"boolean",nowrap:"boolean"},{rownumbers:"boolean",singleSelect:"boolean",ctrlSelect:"boolean",checkOnSelect:"boolean",selectOnCheck:"boolean"},{pagination:"boolean",pageSize:"number",pageNumber:"number"},{multiSort:"boolean",remoteSort:"boolean",showHeader:"boolean",showFooter:"boolean"},{scrollbarSize:"number",scrollOnSelect:"boolean"}]),{pageList:(t.attr("pageList")?eval(t.attr("pageList")):undefined),loadMsg:(t.attr("loadMsg")!=undefined?t.attr("loadMsg"):undefined),rowStyler:(t.attr("rowStyler")?eval(t.attr("rowStyler")):undefined)});
+};
+$.fn.datagrid.parseData=function(_8fb){
+var t=$(_8fb);
+var data={total:0,rows:[]};
+var _8fc=t.datagrid("getColumnFields",true).concat(t.datagrid("getColumnFields",false));
+t.find("tbody tr").each(function(){
+data.total++;
+var row={};
+$.extend(row,$.parser.parseOptions(this,["iconCls","state"]));
+for(var i=0;i<_8fc.length;i++){
+row[_8fc[i]]=$(this).find("td:eq("+i+")").html();
+}
+data.rows.push(row);
+});
+return data;
+};
+var _8fd={render:function(_8fe,_8ff,_900){
+var rows=$(_8fe).datagrid("getRows");
+$(_8ff).empty().html(this.renderTable(_8fe,0,rows,_900));
+},renderFooter:function(_901,_902,_903){
+var opts=$.data(_901,"datagrid").options;
+var rows=$.data(_901,"datagrid").footer||[];
+var _904=$(_901).datagrid("getColumnFields",_903);
+var _905=["<table class=\"datagrid-ftable\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\"><tbody>"];
+for(var i=0;i<rows.length;i++){
+_905.push("<tr class=\"datagrid-row\" datagrid-row-index=\""+i+"\">");
+_905.push(this.renderRow.call(this,_901,_904,_903,i,rows[i]));
+_905.push("</tr>");
+}
+_905.push("</tbody></table>");
+$(_902).html(_905.join(""));
+},renderTable:function(_906,_907,rows,_908){
+var _909=$.data(_906,"datagrid");
+var opts=_909.options;
+if(_908){
+if(!(opts.rownumbers||(opts.frozenColumns&&opts.frozenColumns.length))){
+return "";
+}
+}
+var _90a=$(_906).datagrid("getColumnFields",_908);
+var _90b=["<table class=\"datagrid-btable\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\"><tbody>"];
+for(var i=0;i<rows.length;i++){
+var row=rows[i];
+var css=opts.rowStyler?opts.rowStyler.call(_906,_907,row):"";
+var cs=this.getStyleValue(css);
+var cls="class=\"datagrid-row "+(_907%2&&opts.striped?"datagrid-row-alt ":" ")+cs.c+"\"";
+var _90c=cs.s?"style=\""+cs.s+"\"":"";
+var _90d=_909.rowIdPrefix+"-"+(_908?1:2)+"-"+_907;
+_90b.push("<tr id=\""+_90d+"\" datagrid-row-index=\""+_907+"\" "+cls+" "+_90c+">");
+_90b.push(this.renderRow.call(this,_906,_90a,_908,_907,row));
+_90b.push("</tr>");
+_907++;
+}
+_90b.push("</tbody></table>");
+return _90b.join("");
+},renderRow:function(_90e,_90f,_910,_911,_912){
+var opts=$.data(_90e,"datagrid").options;
+var cc=[];
+if(_910&&opts.rownumbers){
+var _913=_911+1;
+if(opts.pagination){
+_913+=(opts.pageNumber-1)*opts.pageSize;
+}
+cc.push("<td class=\"datagrid-td-rownumber\"><div class=\"datagrid-cell-rownumber\">"+_913+"</div></td>");
+}
+for(var i=0;i<_90f.length;i++){
+var _914=_90f[i];
+var col=$(_90e).datagrid("getColumnOption",_914);
+if(col){
+var _915=_912[_914];
+var css=col.styler?(col.styler.call(_90e,_915,_912,_911)||""):"";
+var cs=this.getStyleValue(css);
+var cls=cs.c?"class=\""+cs.c+"\"":"";
+var _916=col.hidden?"style=\"display:none;"+cs.s+"\"":(cs.s?"style=\""+cs.s+"\"":"");
+cc.push("<td field=\""+_914+"\" "+cls+" "+_916+">");
+var _916="";
+if(!col.checkbox){
+if(col.align){
+_916+="text-align:"+col.align+";";
+}
+if(!opts.nowrap){
+_916+="white-space:normal;height:auto;";
+}else{
+if(opts.autoRowHeight){
+_916+="height:auto;";
+}
+}
+}
+cc.push("<div style=\""+_916+"\" ");
+cc.push(col.checkbox?"class=\"datagrid-cell-check\"":"class=\"datagrid-cell "+col.cellClass+"\"");
+cc.push(">");
+if(col.checkbox){
+cc.push("<input type=\"checkbox\" "+(_912.checked?"checked=\"checked\"":""));
+cc.push(" name=\""+_914+"\" value=\""+(_915!=undefined?_915:"")+"\">");
+}else{
+if(col.formatter){
+cc.push(col.formatter(_915,_912,_911));
+}else{
+cc.push(_915);
+}
+}
+cc.push("</div>");
+cc.push("</td>");
+}
+}
+return cc.join("");
+},getStyleValue:function(css){
+var _917="";
+var _918="";
+if(typeof css=="string"){
+_918=css;
+}else{
+if(css){
+_917=css["class"]||"";
+_918=css["style"]||"";
+}
+}
+return {c:_917,s:_918};
+},refreshRow:function(_919,_91a){
+this.updateRow.call(this,_919,_91a,{});
+},updateRow:function(_91b,_91c,row){
+var opts=$.data(_91b,"datagrid").options;
+var _91d=opts.finder.getRow(_91b,_91c);
+$.extend(_91d,row);
+var cs=_91e.call(this,_91c);
+var _91f=cs.s;
+var cls="datagrid-row "+(_91c%2&&opts.striped?"datagrid-row-alt ":" ")+cs.c;
+function _91e(_920){
+var css=opts.rowStyler?opts.rowStyler.call(_91b,_920,_91d):"";
+return this.getStyleValue(css);
+};
+function _921(_922){
+var tr=opts.finder.getTr(_91b,_91c,"body",(_922?1:2));
+if(!tr.length){
+return;
+}
+var _923=$(_91b).datagrid("getColumnFields",_922);
+var _924=tr.find("div.datagrid-cell-check input[type=checkbox]").is(":checked");
+tr.html(this.renderRow.call(this,_91b,_923,_922,_91c,_91d));
+var _925=(tr.hasClass("datagrid-row-checked")?" datagrid-row-checked":"")+(tr.hasClass("datagrid-row-selected")?" datagrid-row-selected":"");
+tr.attr("style",_91f).attr("class",cls+_925);
+if(_924){
+tr.find("div.datagrid-cell-check input[type=checkbox]")._propAttr("checked",true);
+}
+};
+_921.call(this,true);
+_921.call(this,false);
+$(_91b).datagrid("fixRowHeight",_91c);
+},insertRow:function(_926,_927,row){
+var _928=$.data(_926,"datagrid");
+var opts=_928.options;
+var dc=_928.dc;
+var data=_928.data;
+if(_927==undefined||_927==null){
+_927=data.rows.length;
+}
+if(_927>data.rows.length){
+_927=data.rows.length;
+}
+function _929(_92a){
+var _92b=_92a?1:2;
+for(var i=data.rows.length-1;i>=_927;i--){
+var tr=opts.finder.getTr(_926,i,"body",_92b);
+tr.attr("datagrid-row-index",i+1);
+tr.attr("id",_928.rowIdPrefix+"-"+_92b+"-"+(i+1));
+if(_92a&&opts.rownumbers){
+var _92c=i+2;
+if(opts.pagination){
+_92c+=(opts.pageNumber-1)*opts.pageSize;
+}
+tr.find("div.datagrid-cell-rownumber").html(_92c);
+}
+if(opts.striped){
+tr.removeClass("datagrid-row-alt").addClass((i+1)%2?"datagrid-row-alt":"");
+}
+}
+};
+function _92d(_92e){
+var _92f=_92e?1:2;
+var _930=$(_926).datagrid("getColumnFields",_92e);
+var _931=_928.rowIdPrefix+"-"+_92f+"-"+_927;
+var tr="<tr id=\""+_931+"\" class=\"datagrid-row\" datagrid-row-index=\""+_927+"\"></tr>";
+if(_927>=data.rows.length){
+if(data.rows.length){
+opts.finder.getTr(_926,"","last",_92f).after(tr);
+}else{
+var cc=_92e?dc.body1:dc.body2;
+cc.html("<table class=\"datagrid-btable\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\"><tbody>"+tr+"</tbody></table>");
+}
+}else{
+opts.finder.getTr(_926,_927+1,"body",_92f).before(tr);
+}
+};
+_929.call(this,true);
+_929.call(this,false);
+_92d.call(this,true);
+_92d.call(this,false);
+data.total+=1;
+data.rows.splice(_927,0,row);
+this.setEmptyMsg(_926);
+this.refreshRow.call(this,_926,_927);
+},deleteRow:function(_932,_933){
+var _934=$.data(_932,"datagrid");
+var opts=_934.options;
+var data=_934.data;
+function _935(_936){
+var _937=_936?1:2;
+for(var i=_933+1;i<data.rows.length;i++){
+var tr=opts.finder.getTr(_932,i,"body",_937);
+tr.attr("datagrid-row-index",i-1);
+tr.attr("id",_934.rowIdPrefix+"-"+_937+"-"+(i-1));
+if(_936&&opts.rownumbers){
+var _938=i;
+if(opts.pagination){
+_938+=(opts.pageNumber-1)*opts.pageSize;
+}
+tr.find("div.datagrid-cell-rownumber").html(_938);
+}
+if(opts.striped){
+tr.removeClass("datagrid-row-alt").addClass((i-1)%2?"datagrid-row-alt":"");
+}
+}
+};
+opts.finder.getTr(_932,_933).remove();
+_935.call(this,true);
+_935.call(this,false);
+data.total-=1;
+data.rows.splice(_933,1);
+this.setEmptyMsg(_932);
+},onBeforeRender:function(_939,rows){
+},onAfterRender:function(_93a){
+var _93b=$.data(_93a,"datagrid");
+var opts=_93b.options;
+if(opts.showFooter){
+var _93c=$(_93a).datagrid("getPanel").find("div.datagrid-footer");
+_93c.find("div.datagrid-cell-rownumber,div.datagrid-cell-check").css("visibility","hidden");
+}
+this.setEmptyMsg(_93a);
+},setEmptyMsg:function(_93d){
+var _93e=$.data(_93d,"datagrid");
+var opts=_93e.options;
+var _93f=opts.finder.getRows(_93d).length==0;
+if(_93f){
+this.renderEmptyRow(_93d);
+}
+if(opts.emptyMsg){
+_93e.dc.view.children(".datagrid-empty").remove();
+if(_93f){
+var h=_93e.dc.header2.parent().outerHeight();
+var d=$("<div class=\"datagrid-empty\"></div>").appendTo(_93e.dc.view);
+d.html(opts.emptyMsg).css("top",h+"px");
+}
+}
+},renderEmptyRow:function(_940){
+var opts=$(_940).datagrid("options");
+var cols=$.map($(_940).datagrid("getColumnFields"),function(_941){
+return $(_940).datagrid("getColumnOption",_941);
+});
+$.map(cols,function(col){
+col.formatter1=col.formatter;
+col.styler1=col.styler;
+col.formatter=col.styler=undefined;
+});
+var _942=opts.rowStyler;
+opts.rowStyler=function(){
+};
+var _943=$.data(_940,"datagrid").dc.body2;
+_943.html(this.renderTable(_940,0,[{}],false));
+_943.find("tbody *").css({height:1,borderColor:"transparent",background:"transparent"});
+var tr=_943.find(".datagrid-row");
+tr.removeClass("datagrid-row").removeAttr("datagrid-row-index");
+tr.find(".datagrid-cell,.datagrid-cell-check").empty();
+$.map(cols,function(col){
+col.formatter=col.formatter1;
+col.styler=col.styler1;
+col.formatter1=col.styler1=undefined;
+});
+opts.rowStyler=_942;
+}};
+$.fn.datagrid.defaults=$.extend({},$.fn.panel.defaults,{sharedStyleSheet:false,frozenColumns:undefined,columns:undefined,fitColumns:false,resizeHandle:"right",resizeEdge:5,autoRowHeight:true,toolbar:null,striped:false,method:"post",nowrap:true,idField:null,url:null,data:null,loadMsg:"Processing, please wait ...",emptyMsg:"",rownumbers:false,singleSelect:false,ctrlSelect:false,selectOnCheck:true,checkOnSelect:true,pagination:false,pagePosition:"bottom",pageNumber:1,pageSize:10,pageList:[10,20,30,40,50],queryParams:{},sortName:null,sortOrder:"asc",multiSort:false,remoteSort:true,showHeader:true,showFooter:false,scrollOnSelect:true,scrollbarSize:18,rownumberWidth:30,editorHeight:31,headerEvents:{mouseover:_785(true),mouseout:_785(false),click:_789,dblclick:_78e,contextmenu:_791},rowEvents:{mouseover:_793(true),mouseout:_793(false),click:_79a,dblclick:_7a4,contextmenu:_7a8},rowStyler:function(_944,_945){
+},loader:function(_946,_947,_948){
+var opts=$(this).datagrid("options");
+if(!opts.url){
+return false;
+}
+$.ajax({type:opts.method,url:opts.url,data:_946,dataType:"json",success:function(data){
+_947(data);
+},error:function(){
+_948.apply(this,arguments);
+}});
+},loadFilter:function(data){
+return data;
+},editors:_8b4,finder:{getTr:function(_949,_94a,type,_94b){
+type=type||"body";
+_94b=_94b||0;
+var _94c=$.data(_949,"datagrid");
+var dc=_94c.dc;
+var opts=_94c.options;
+if(_94b==0){
+var tr1=opts.finder.getTr(_949,_94a,type,1);
+var tr2=opts.finder.getTr(_949,_94a,type,2);
+return tr1.add(tr2);
+}else{
+if(type=="body"){
+var tr=$("#"+_94c.rowIdPrefix+"-"+_94b+"-"+_94a);
+if(!tr.length){
+tr=(_94b==1?dc.body1:dc.body2).find(">table>tbody>tr[datagrid-row-index="+_94a+"]");
+}
+return tr;
+}else{
+if(type=="footer"){
+return (_94b==1?dc.footer1:dc.footer2).find(">table>tbody>tr[datagrid-row-index="+_94a+"]");
+}else{
+if(type=="selected"){
+return (_94b==1?dc.body1:dc.body2).find(">table>tbody>tr.datagrid-row-selected");
+}else{
+if(type=="highlight"){
+return (_94b==1?dc.body1:dc.body2).find(">table>tbody>tr.datagrid-row-over");
+}else{
+if(type=="checked"){
+return (_94b==1?dc.body1:dc.body2).find(">table>tbody>tr.datagrid-row-checked");
+}else{
+if(type=="editing"){
+return (_94b==1?dc.body1:dc.body2).find(">table>tbody>tr.datagrid-row-editing");
+}else{
+if(type=="last"){
+return (_94b==1?dc.body1:dc.body2).find(">table>tbody>tr[datagrid-row-index]:last");
+}else{
+if(type=="allbody"){
+return (_94b==1?dc.body1:dc.body2).find(">table>tbody>tr[datagrid-row-index]");
+}else{
+if(type=="allfooter"){
+return (_94b==1?dc.footer1:dc.footer2).find(">table>tbody>tr[datagrid-row-index]");
+}
+}
+}
+}
+}
+}
+}
+}
+}
+}
+},getRow:function(_94d,p){
+var _94e=(typeof p=="object")?p.attr("datagrid-row-index"):p;
+return $.data(_94d,"datagrid").data.rows[parseInt(_94e)];
+},getRows:function(_94f){
+return $(_94f).datagrid("getRows");
+}},view:_8fd,onBeforeLoad:function(_950){
+},onLoadSuccess:function(){
+},onLoadError:function(){
+},onClickRow:function(_951,_952){
+},onDblClickRow:function(_953,_954){
+},onClickCell:function(_955,_956,_957){
+},onDblClickCell:function(_958,_959,_95a){
+},onBeforeSortColumn:function(sort,_95b){
+},onSortColumn:function(sort,_95c){
+},onResizeColumn:function(_95d,_95e){
+},onBeforeSelect:function(_95f,_960){
+},onSelect:function(_961,_962){
+},onBeforeUnselect:function(_963,_964){
+},onUnselect:function(_965,_966){
+},onSelectAll:function(rows){
+},onUnselectAll:function(rows){
+},onBeforeCheck:function(_967,_968){
+},onCheck:function(_969,_96a){
+},onBeforeUncheck:function(_96b,_96c){
+},onUncheck:function(_96d,_96e){
+},onCheckAll:function(rows){
+},onUncheckAll:function(rows){
+},onBeforeEdit:function(_96f,_970){
+},onBeginEdit:function(_971,_972){
+},onEndEdit:function(_973,_974,_975){
+},onAfterEdit:function(_976,_977,_978){
+},onCancelEdit:function(_979,_97a){
+},onHeaderContextMenu:function(e,_97b){
+},onRowContextMenu:function(e,_97c,_97d){
+}});
+})(jQuery);
+(function($){
+var _97e;
+$(document)._unbind(".propertygrid")._bind("mousedown.propertygrid",function(e){
+var p=$(e.target).closest("div.datagrid-view,div.combo-panel");
+if(p.length){
+return;
+}
+_97f(_97e);
+_97e=undefined;
+});
+function _980(_981){
+var _982=$.data(_981,"propertygrid");
+var opts=$.data(_981,"propertygrid").options;
+$(_981).datagrid($.extend({},opts,{cls:"propertygrid",view:(opts.showGroup?opts.groupView:opts.view),onBeforeEdit:function(_983,row){
+if(opts.onBeforeEdit.call(_981,_983,row)==false){
+return false;
+}
+var dg=$(this);
+var row=dg.datagrid("getRows")[_983];
+var col=dg.datagrid("getColumnOption","value");
+col.editor=row.editor;
+},onClickCell:function(_984,_985,_986){
+if(_97e!=this){
+_97f(_97e);
+_97e=this;
+}
+if(opts.editIndex!=_984){
+_97f(_97e);
+$(this).datagrid("beginEdit",_984);
+var ed=$(this).datagrid("getEditor",{index:_984,field:_985});
+if(!ed){
+ed=$(this).datagrid("getEditor",{index:_984,field:"value"});
+}
+if(ed){
+var t=$(ed.target);
+var _987=t.data("textbox")?t.textbox("textbox"):t;
+_987.focus();
+opts.editIndex=_984;
+}
+}
+opts.onClickCell.call(_981,_984,_985,_986);
+},loadFilter:function(data){
+_97f(this);
+return opts.loadFilter.call(this,data);
+}}));
+};
+function _97f(_988){
+var t=$(_988);
+if(!t.length){
+return;
+}
+var opts=$.data(_988,"propertygrid").options;
+opts.finder.getTr(_988,null,"editing").each(function(){
+var _989=parseInt($(this).attr("datagrid-row-index"));
+if(t.datagrid("validateRow",_989)){
+t.datagrid("endEdit",_989);
+}else{
+t.datagrid("cancelEdit",_989);
+}
+});
+opts.editIndex=undefined;
+};
+$.fn.propertygrid=function(_98a,_98b){
+if(typeof _98a=="string"){
+var _98c=$.fn.propertygrid.methods[_98a];
+if(_98c){
+return _98c(this,_98b);
+}else{
+return this.datagrid(_98a,_98b);
+}
+}
+_98a=_98a||{};
+return this.each(function(){
+var _98d=$.data(this,"propertygrid");
+if(_98d){
+$.extend(_98d.options,_98a);
+}else{
+var opts=$.extend({},$.fn.propertygrid.defaults,$.fn.propertygrid.parseOptions(this),_98a);
+opts.frozenColumns=$.extend(true,[],opts.frozenColumns);
+opts.columns=$.extend(true,[],opts.columns);
+$.data(this,"propertygrid",{options:opts});
+}
+_980(this);
+});
+};
+$.fn.propertygrid.methods={options:function(jq){
+return $.data(jq[0],"propertygrid").options;
+}};
+$.fn.propertygrid.parseOptions=function(_98e){
+return $.extend({},$.fn.datagrid.parseOptions(_98e),$.parser.parseOptions(_98e,[{showGroup:"boolean"}]));
+};
+var _98f=$.extend({},$.fn.datagrid.defaults.view,{render:function(_990,_991,_992){
+var _993=[];
+var _994=this.groups;
+for(var i=0;i<_994.length;i++){
+_993.push(this.renderGroup.call(this,_990,i,_994[i],_992));
+}
+$(_991).html(_993.join(""));
+},renderGroup:function(_995,_996,_997,_998){
+var _999=$.data(_995,"datagrid");
+var opts=_999.options;
+var _99a=$(_995).datagrid("getColumnFields",_998);
+var _99b=opts.frozenColumns&&opts.frozenColumns.length;
+if(_998){
+if(!(opts.rownumbers||_99b)){
+return "";
+}
+}
+var _99c=[];
+var css=opts.groupStyler.call(_995,_997.value,_997.rows);
+var cs=_99d(css,"datagrid-group");
+_99c.push("<div group-index="+_996+" "+cs+">");
+if((_998&&(opts.rownumbers||opts.frozenColumns.length))||(!_998&&!(opts.rownumbers||opts.frozenColumns.length))){
+_99c.push("<span class=\"datagrid-group-expander\">");
+_99c.push("<span class=\"datagrid-row-expander datagrid-row-collapse\">&nbsp;</span>");
+_99c.push("</span>");
+}
+if((_998&&_99b)||(!_998)){
+_99c.push("<span class=\"datagrid-group-title\">");
+_99c.push(opts.groupFormatter.call(_995,_997.value,_997.rows));
+_99c.push("</span>");
+}
+_99c.push("</div>");
+_99c.push("<table class=\"datagrid-btable\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\"><tbody>");
+var _99e=_997.startIndex;
+for(var j=0;j<_997.rows.length;j++){
+var css=opts.rowStyler?opts.rowStyler.call(_995,_99e,_997.rows[j]):"";
+var _99f="";
+var _9a0="";
+if(typeof css=="string"){
+_9a0=css;
+}else{
+if(css){
+_99f=css["class"]||"";
+_9a0=css["style"]||"";
+}
+}
+var cls="class=\"datagrid-row "+(_99e%2&&opts.striped?"datagrid-row-alt ":" ")+_99f+"\"";
+var _9a1=_9a0?"style=\""+_9a0+"\"":"";
+var _9a2=_999.rowIdPrefix+"-"+(_998?1:2)+"-"+_99e;
+_99c.push("<tr id=\""+_9a2+"\" datagrid-row-index=\""+_99e+"\" "+cls+" "+_9a1+">");
+_99c.push(this.renderRow.call(this,_995,_99a,_998,_99e,_997.rows[j]));
+_99c.push("</tr>");
+_99e++;
+}
+_99c.push("</tbody></table>");
+return _99c.join("");
+function _99d(css,cls){
+var _9a3="";
+var _9a4="";
+if(typeof css=="string"){
+_9a4=css;
+}else{
+if(css){
+_9a3=css["class"]||"";
+_9a4=css["style"]||"";
+}
+}
+return "class=\""+cls+(_9a3?" "+_9a3:"")+"\" "+"style=\""+_9a4+"\"";
+};
+},bindEvents:function(_9a5){
+var _9a6=$.data(_9a5,"datagrid");
+var dc=_9a6.dc;
+var body=dc.body1.add(dc.body2);
+var _9a7=($.data(body[0],"events")||$._data(body[0],"events")).click[0].handler;
+body._unbind("click")._bind("click",function(e){
+var tt=$(e.target);
+var _9a8=tt.closest("span.datagrid-row-expander");
+if(_9a8.length){
+var _9a9=_9a8.closest("div.datagrid-group").attr("group-index");
+if(_9a8.hasClass("datagrid-row-collapse")){
+$(_9a5).datagrid("collapseGroup",_9a9);
+}else{
+$(_9a5).datagrid("expandGroup",_9a9);
+}
+}else{
+_9a7(e);
+}
+e.stopPropagation();
+});
+},onBeforeRender:function(_9aa,rows){
+var _9ab=$.data(_9aa,"datagrid");
+var opts=_9ab.options;
+_9ac();
+var _9ad=[];
+for(var i=0;i<rows.length;i++){
+var row=rows[i];
+var _9ae=_9af(row[opts.groupField]);
+if(!_9ae){
+_9ae={value:row[opts.groupField],rows:[row]};
+_9ad.push(_9ae);
+}else{
+_9ae.rows.push(row);
+}
+}
+var _9b0=0;
+var _9b1=[];
+for(var i=0;i<_9ad.length;i++){
+var _9ae=_9ad[i];
+_9ae.startIndex=_9b0;
+_9b0+=_9ae.rows.length;
+_9b1=_9b1.concat(_9ae.rows);
+}
+_9ab.data.rows=_9b1;
+this.groups=_9ad;
+var that=this;
+setTimeout(function(){
+that.bindEvents(_9aa);
+},0);
+function _9af(_9b2){
+for(var i=0;i<_9ad.length;i++){
+var _9b3=_9ad[i];
+if(_9b3.value==_9b2){
+return _9b3;
+}
+}
+return null;
+};
+function _9ac(){
+if(!$("#datagrid-group-style").length){
+$("head").append("<style id=\"datagrid-group-style\">"+".datagrid-group{height:"+opts.groupHeight+"px;overflow:hidden;font-weight:bold;border-bottom:1px solid #ccc;white-space:nowrap;word-break:normal;}"+".datagrid-group-title,.datagrid-group-expander{display:inline-block;vertical-align:bottom;height:100%;line-height:"+opts.groupHeight+"px;padding:0 4px;}"+".datagrid-group-title{position:relative;}"+".datagrid-group-expander{width:"+opts.expanderWidth+"px;text-align:center;padding:0}"+".datagrid-group-expander .datagrid-row-expander{margin:"+Math.floor((opts.groupHeight-16)/2)+"px 0;display:inline-block;width:16px;height:16px;cursor:pointer}"+"</style>");
+}
+};
+},onAfterRender:function(_9b4){
+$.fn.datagrid.defaults.view.onAfterRender.call(this,_9b4);
+var view=this;
+var _9b5=$.data(_9b4,"datagrid");
+var opts=_9b5.options;
+if(!_9b5.onResizeColumn){
+_9b5.onResizeColumn=opts.onResizeColumn;
+}
+if(!_9b5.onResize){
+_9b5.onResize=opts.onResize;
+}
+opts.onResizeColumn=function(_9b6,_9b7){
+view.resizeGroup(_9b4);
+_9b5.onResizeColumn.call(_9b4,_9b6,_9b7);
+};
+opts.onResize=function(_9b8,_9b9){
+view.resizeGroup(_9b4);
+_9b5.onResize.call($(_9b4).datagrid("getPanel")[0],_9b8,_9b9);
+};
+view.resizeGroup(_9b4);
+}});
+$.extend($.fn.datagrid.methods,{groups:function(jq){
+return jq.datagrid("options").view.groups;
+},expandGroup:function(jq,_9ba){
+return jq.each(function(){
+var opts=$(this).datagrid("options");
+var view=$.data(this,"datagrid").dc.view;
+var _9bb=view.find(_9ba!=undefined?"div.datagrid-group[group-index=\""+_9ba+"\"]":"div.datagrid-group");
+var _9bc=_9bb.find("span.datagrid-row-expander");
+if(_9bc.hasClass("datagrid-row-expand")){
+_9bc.removeClass("datagrid-row-expand").addClass("datagrid-row-collapse");
+_9bb.next("table").show();
+}
+$(this).datagrid("fixRowHeight");
+if(opts.onExpandGroup){
+opts.onExpandGroup.call(this,_9ba);
+}
+});
+},collapseGroup:function(jq,_9bd){
+return jq.each(function(){
+var opts=$(this).datagrid("options");
+var view=$.data(this,"datagrid").dc.view;
+var _9be=view.find(_9bd!=undefined?"div.datagrid-group[group-index=\""+_9bd+"\"]":"div.datagrid-group");
+var _9bf=_9be.find("span.datagrid-row-expander");
+if(_9bf.hasClass("datagrid-row-collapse")){
+_9bf.removeClass("datagrid-row-collapse").addClass("datagrid-row-expand");
+_9be.next("table").hide();
+}
+$(this).datagrid("fixRowHeight");
+if(opts.onCollapseGroup){
+opts.onCollapseGroup.call(this,_9bd);
+}
+});
+},scrollToGroup:function(jq,_9c0){
+return jq.each(function(){
+var _9c1=$.data(this,"datagrid");
+var dc=_9c1.dc;
+var grow=dc.body2.children("div.datagrid-group[group-index=\""+_9c0+"\"]");
+if(grow.length){
+var _9c2=grow.outerHeight();
+var _9c3=dc.view2.children("div.datagrid-header")._outerHeight();
+var _9c4=dc.body2.outerHeight(true)-dc.body2.outerHeight();
+var top=grow.position().top-_9c3-_9c4;
+if(top<0){
+dc.body2.scrollTop(dc.body2.scrollTop()+top);
+}else{
+if(top+_9c2>dc.body2.height()-18){
+dc.body2.scrollTop(dc.body2.scrollTop()+top+_9c2-dc.body2.height()+18);
+}
+}
+}
+});
+}});
+$.extend(_98f,{refreshGroupTitle:function(_9c5,_9c6){
+var _9c7=$.data(_9c5,"datagrid");
+var opts=_9c7.options;
+var dc=_9c7.dc;
+var _9c8=this.groups[_9c6];
+var span=dc.body1.add(dc.body2).children("div.datagrid-group[group-index="+_9c6+"]").find("span.datagrid-group-title");
+span.html(opts.groupFormatter.call(_9c5,_9c8.value,_9c8.rows));
+},resizeGroup:function(_9c9,_9ca){
+var _9cb=$.data(_9c9,"datagrid");
+var dc=_9cb.dc;
+var ht=dc.header2.find("table");
+var fr=ht.find("tr.datagrid-filter-row").hide();
+var ww=dc.body2.children("table.datagrid-btable:first").width();
+if(_9ca==undefined){
+var _9cc=dc.body2.children("div.datagrid-group");
+}else{
+var _9cc=dc.body2.children("div.datagrid-group[group-index="+_9ca+"]");
+}
+_9cc._outerWidth(ww);
+var opts=_9cb.options;
+if(opts.frozenColumns&&opts.frozenColumns.length){
+var _9cd=dc.view1.width()-opts.expanderWidth;
+var _9ce=dc.view1.css("direction").toLowerCase()=="rtl";
+_9cc.find(".datagrid-group-title").css(_9ce?"right":"left",-_9cd+"px");
+}
+if(fr.length){
+if(opts.showFilterBar){
+fr.show();
+}
+}
+},insertRow:function(_9cf,_9d0,row){
+var _9d1=$.data(_9cf,"datagrid");
+var opts=_9d1.options;
+var dc=_9d1.dc;
+var _9d2=null;
+var _9d3;
+if(!_9d1.data.rows.length){
+$(_9cf).datagrid("loadData",[row]);
+return;
+}
+for(var i=0;i<this.groups.length;i++){
+if(this.groups[i].value==row[opts.groupField]){
+_9d2=this.groups[i];
+_9d3=i;
+break;
+}
+}
+if(_9d2){
+if(_9d0==undefined||_9d0==null){
+_9d0=_9d1.data.rows.length;
+}
+if(_9d0<_9d2.startIndex){
+_9d0=_9d2.startIndex;
+}else{
+if(_9d0>_9d2.startIndex+_9d2.rows.length){
+_9d0=_9d2.startIndex+_9d2.rows.length;
+}
+}
+$.fn.datagrid.defaults.view.insertRow.call(this,_9cf,_9d0,row);
+if(_9d0>=_9d2.startIndex+_9d2.rows.length){
+_9d4(_9d0,true);
+_9d4(_9d0,false);
+}
+_9d2.rows.splice(_9d0-_9d2.startIndex,0,row);
+}else{
+_9d2={value:row[opts.groupField],rows:[row],startIndex:_9d1.data.rows.length};
+_9d3=this.groups.length;
+dc.body1.append(this.renderGroup.call(this,_9cf,_9d3,_9d2,true));
+dc.body2.append(this.renderGroup.call(this,_9cf,_9d3,_9d2,false));
+this.groups.push(_9d2);
+_9d1.data.rows.push(row);
+}
+this.setGroupIndex(_9cf);
+this.refreshGroupTitle(_9cf,_9d3);
+this.resizeGroup(_9cf);
+function _9d4(_9d5,_9d6){
+var _9d7=_9d6?1:2;
+var _9d8=opts.finder.getTr(_9cf,_9d5-1,"body",_9d7);
+var tr=opts.finder.getTr(_9cf,_9d5,"body",_9d7);
+tr.insertAfter(_9d8);
+};
+},updateRow:function(_9d9,_9da,row){
+var opts=$.data(_9d9,"datagrid").options;
+$.fn.datagrid.defaults.view.updateRow.call(this,_9d9,_9da,row);
+var tb=opts.finder.getTr(_9d9,_9da,"body",2).closest("table.datagrid-btable");
+var _9db=parseInt(tb.prev().attr("group-index"));
+this.refreshGroupTitle(_9d9,_9db);
+},deleteRow:function(_9dc,_9dd){
+var _9de=$.data(_9dc,"datagrid");
+var opts=_9de.options;
+var dc=_9de.dc;
+var body=dc.body1.add(dc.body2);
+var tb=opts.finder.getTr(_9dc,_9dd,"body",2).closest("table.datagrid-btable");
+var _9df=parseInt(tb.prev().attr("group-index"));
+$.fn.datagrid.defaults.view.deleteRow.call(this,_9dc,_9dd);
+var _9e0=this.groups[_9df];
+if(_9e0.rows.length>1){
+_9e0.rows.splice(_9dd-_9e0.startIndex,1);
+this.refreshGroupTitle(_9dc,_9df);
+}else{
+body.children("div.datagrid-group[group-index="+_9df+"]").remove();
+for(var i=_9df+1;i<this.groups.length;i++){
+body.children("div.datagrid-group[group-index="+i+"]").attr("group-index",i-1);
+}
+this.groups.splice(_9df,1);
+}
+this.setGroupIndex(_9dc);
+},setGroupIndex:function(_9e1){
+var _9e2=0;
+for(var i=0;i<this.groups.length;i++){
+var _9e3=this.groups[i];
+_9e3.startIndex=_9e2;
+_9e2+=_9e3.rows.length;
+}
+}});
+$.fn.propertygrid.defaults=$.extend({},$.fn.datagrid.defaults,{groupHeight:28,expanderWidth:20,singleSelect:true,remoteSort:false,fitColumns:true,loadMsg:"",frozenColumns:[[{field:"f",width:20,resizable:false}]],columns:[[{field:"name",title:"Name",width:100,sortable:true},{field:"value",title:"Value",width:100,resizable:false}]],showGroup:false,groupView:_98f,groupField:"group",groupStyler:function(_9e4,rows){
+return "";
+},groupFormatter:function(_9e5,rows){
+return _9e5;
+}});
+})(jQuery);
+(function($){
+function _9e6(_9e7){
+var _9e8=$.data(_9e7,"treegrid");
+var opts=_9e8.options;
+$(_9e7).datagrid($.extend({},opts,{url:null,data:null,loader:function(){
+return false;
+},onBeforeLoad:function(){
+return false;
+},onLoadSuccess:function(){
+},onResizeColumn:function(_9e9,_9ea){
+_9f7(_9e7);
+opts.onResizeColumn.call(_9e7,_9e9,_9ea);
+},onBeforeSortColumn:function(sort,_9eb){
+if(opts.onBeforeSortColumn.call(_9e7,sort,_9eb)==false){
+return false;
+}
+},onSortColumn:function(sort,_9ec){
+opts.sortName=sort;
+opts.sortOrder=_9ec;
+if(opts.remoteSort){
+_9f6(_9e7);
+}else{
+var data=$(_9e7).treegrid("getData");
+_a25(_9e7,null,data);
+}
+opts.onSortColumn.call(_9e7,sort,_9ec);
+},onClickCell:function(_9ed,_9ee){
+opts.onClickCell.call(_9e7,_9ee,find(_9e7,_9ed));
+},onDblClickCell:function(_9ef,_9f0){
+opts.onDblClickCell.call(_9e7,_9f0,find(_9e7,_9ef));
+},onRowContextMenu:function(e,_9f1){
+opts.onContextMenu.call(_9e7,e,find(_9e7,_9f1));
+}}));
+var _9f2=$.data(_9e7,"datagrid").options;
+opts.columns=_9f2.columns;
+opts.frozenColumns=_9f2.frozenColumns;
+_9e8.dc=$.data(_9e7,"datagrid").dc;
+if(opts.pagination){
+var _9f3=$(_9e7).datagrid("getPager");
+_9f3.pagination({total:0,pageNumber:opts.pageNumber,pageSize:opts.pageSize,pageList:opts.pageList,onSelectPage:function(_9f4,_9f5){
+opts.pageNumber=_9f4||1;
+opts.pageSize=_9f5;
+_9f3.pagination("refresh",{pageNumber:_9f4,pageSize:_9f5});
+_9f6(_9e7);
+}});
+opts.pageSize=_9f3.pagination("options").pageSize;
+}
+};
+function _9f7(_9f8,_9f9){
+var opts=$.data(_9f8,"datagrid").options;
+var dc=$.data(_9f8,"datagrid").dc;
+if(!dc.body1.is(":empty")&&(!opts.nowrap||opts.autoRowHeight)){
+if(_9f9!=undefined){
+var _9fa=_9fb(_9f8,_9f9);
+for(var i=0;i<_9fa.length;i++){
+_9fc(_9fa[i][opts.idField]);
+}
+}
+}
+$(_9f8).datagrid("fixRowHeight",_9f9);
+function _9fc(_9fd){
+var tr1=opts.finder.getTr(_9f8,_9fd,"body",1);
+var tr2=opts.finder.getTr(_9f8,_9fd,"body",2);
+tr1.css("height","");
+tr2.css("height","");
+var _9fe=Math.max(tr1.height(),tr2.height());
+tr1.css("height",_9fe);
+tr2.css("height",_9fe);
+};
+};
+function _9ff(_a00){
+var dc=$.data(_a00,"datagrid").dc;
+var opts=$.data(_a00,"treegrid").options;
+if(!opts.rownumbers){
+return;
+}
+dc.body1.find("div.datagrid-cell-rownumber").each(function(i){
+$(this).html(i+1);
+});
+};
+function _a01(_a02){
+return function(e){
+$.fn.datagrid.defaults.rowEvents[_a02?"mouseover":"mouseout"](e);
+var tt=$(e.target);
+var fn=_a02?"addClass":"removeClass";
+if(tt.hasClass("tree-hit")){
+tt.hasClass("tree-expanded")?tt[fn]("tree-expanded-hover"):tt[fn]("tree-collapsed-hover");
+}
+};
+};
+function _a03(e){
+var tt=$(e.target);
+var tr=tt.closest("tr.datagrid-row");
+if(!tr.length||!tr.parent().length){
+return;
+}
+var _a04=tr.attr("node-id");
+var _a05=_a06(tr);
+if(tt.hasClass("tree-hit")){
+_a07(_a05,_a04);
+}else{
+if(tt.hasClass("tree-checkbox")){
+_a08(_a05,_a04);
+}else{
+var opts=$(_a05).datagrid("options");
+if(!tt.parent().hasClass("datagrid-cell-check")&&!opts.singleSelect&&e.shiftKey){
+var rows=$(_a05).treegrid("getChildren");
+var idx1=$.easyui.indexOfArray(rows,opts.idField,opts.lastSelectedIndex);
+var idx2=$.easyui.indexOfArray(rows,opts.idField,_a04);
+var from=Math.min(Math.max(idx1,0),idx2);
+var to=Math.max(idx1,idx2);
+var row=rows[idx2];
+var td=tt.closest("td[field]",tr);
+if(td.length){
+var _a09=td.attr("field");
+opts.onClickCell.call(_a05,_a04,_a09,row[_a09]);
+}
+$(_a05).treegrid("clearSelections");
+for(var i=from;i<=to;i++){
+$(_a05).treegrid("selectRow",rows[i][opts.idField]);
+}
+opts.onClickRow.call(_a05,row);
+}else{
+$.fn.datagrid.defaults.rowEvents.click(e);
+}
+}
+}
+};
+function _a06(t){
+return $(t).closest("div.datagrid-view").children(".datagrid-f")[0];
+};
+function _a08(_a0a,_a0b,_a0c,_a0d){
+var _a0e=$.data(_a0a,"treegrid");
+var _a0f=_a0e.checkedRows;
+var opts=_a0e.options;
+if(!opts.checkbox){
+return;
+}
+var row=find(_a0a,_a0b);
+if(!row.checkState){
+return;
+}
+var tr=opts.finder.getTr(_a0a,_a0b);
+var ck=tr.find(".tree-checkbox");
+if(_a0c==undefined){
+if(ck.hasClass("tree-checkbox1")){
+_a0c=false;
+}else{
+if(ck.hasClass("tree-checkbox0")){
+_a0c=true;
+}else{
+if(row._checked==undefined){
+row._checked=ck.hasClass("tree-checkbox1");
+}
+_a0c=!row._checked;
+}
+}
+}
+row._checked=_a0c;
+if(_a0c){
+if(ck.hasClass("tree-checkbox1")){
+return;
+}
+}else{
+if(ck.hasClass("tree-checkbox0")){
+return;
+}
+}
+if(!_a0d){
+if(opts.onBeforeCheckNode.call(_a0a,row,_a0c)==false){
+return;
+}
+}
+if(opts.cascadeCheck){
+_a10(_a0a,row,_a0c);
+_a11(_a0a,row);
+}else{
+_a12(_a0a,row,_a0c?"1":"0");
+}
+if(!_a0d){
+opts.onCheckNode.call(_a0a,row,_a0c);
+}
+};
+function _a12(_a13,row,flag){
+var _a14=$.data(_a13,"treegrid");
+var _a15=_a14.checkedRows;
+var opts=_a14.options;
+if(!row.checkState||flag==undefined){
+return;
+}
+var tr=opts.finder.getTr(_a13,row[opts.idField]);
+var ck=tr.find(".tree-checkbox");
+if(!ck.length){
+return;
+}
+row.checkState=["unchecked","checked","indeterminate"][flag];
+row.checked=(row.checkState=="checked");
+ck.removeClass("tree-checkbox0 tree-checkbox1 tree-checkbox2");
+ck.addClass("tree-checkbox"+flag);
+if(flag==0){
+$.easyui.removeArrayItem(_a15,opts.idField,row[opts.idField]);
+}else{
+$.easyui.addArrayItem(_a15,opts.idField,row);
+}
+};
+function _a10(_a16,row,_a17){
+var flag=_a17?1:0;
+_a12(_a16,row,flag);
+$.easyui.forEach(row.children||[],true,function(r){
+_a12(_a16,r,flag);
+});
+};
+function _a11(_a18,row){
+var opts=$.data(_a18,"treegrid").options;
+var prow=_a19(_a18,row[opts.idField]);
+if(prow){
+_a12(_a18,prow,_a1a(prow));
+_a11(_a18,prow);
+}
+};
+function _a1a(row){
+var len=0;
+var c0=0;
+var c1=0;
+$.easyui.forEach(row.children||[],false,function(r){
+if(r.checkState){
+len++;
+if(r.checkState=="checked"){
+c1++;
+}else{
+if(r.checkState=="unchecked"){
+c0++;
+}
+}
+}
+});
+if(len==0){
+return undefined;
+}
+var flag=0;
+if(c0==len){
+flag=0;
+}else{
+if(c1==len){
+flag=1;
+}else{
+flag=2;
+}
+}
+return flag;
+};
+function _a1b(_a1c,_a1d){
+var opts=$.data(_a1c,"treegrid").options;
+if(!opts.checkbox){
+return;
+}
+var row=find(_a1c,_a1d);
+var tr=opts.finder.getTr(_a1c,_a1d);
+var ck=tr.find(".tree-checkbox");
+if(opts.view.hasCheckbox(_a1c,row)){
+if(!ck.length){
+row.checkState=row.checkState||"unchecked";
+$("<span class=\"tree-checkbox\"></span>").insertBefore(tr.find(".tree-title"));
+}
+if(row.checkState=="checked"){
+_a08(_a1c,_a1d,true,true);
+}else{
+if(row.checkState=="unchecked"){
+_a08(_a1c,_a1d,false,true);
+}else{
+var flag=_a1a(row);
+if(flag===0){
+_a08(_a1c,_a1d,false,true);
+}else{
+if(flag===1){
+_a08(_a1c,_a1d,true,true);
+}
+}
+}
+}
+}else{
+ck.remove();
+row.checkState=undefined;
+row.checked=undefined;
+_a11(_a1c,row);
+}
+};
+function _a1e(_a1f,_a20){
+var opts=$.data(_a1f,"treegrid").options;
+var tr1=opts.finder.getTr(_a1f,_a20,"body",1);
+var tr2=opts.finder.getTr(_a1f,_a20,"body",2);
+var _a21=$(_a1f).datagrid("getColumnFields",true).length+(opts.rownumbers?1:0);
+var _a22=$(_a1f).datagrid("getColumnFields",false).length;
+_a23(tr1,_a21);
+_a23(tr2,_a22);
+function _a23(tr,_a24){
+$("<tr class=\"treegrid-tr-tree\">"+"<td style=\"border:0px\" colspan=\""+_a24+"\">"+"<div></div>"+"</td>"+"</tr>").insertAfter(tr);
+};
+};
+function _a25(_a26,_a27,data,_a28,_a29){
+var _a2a=$.data(_a26,"treegrid");
+var opts=_a2a.options;
+var dc=_a2a.dc;
+data=opts.loadFilter.call(_a26,data,_a27);
+var node=find(_a26,_a27);
+if(node){
+var _a2b=opts.finder.getTr(_a26,_a27,"body",1);
+var _a2c=opts.finder.getTr(_a26,_a27,"body",2);
+var cc1=_a2b.next("tr.treegrid-tr-tree").children("td").children("div");
+var cc2=_a2c.next("tr.treegrid-tr-tree").children("td").children("div");
+if(!_a28){
+node.children=[];
+}
+}else{
+var cc1=dc.body1;
+var cc2=dc.body2;
+if(!_a28){
+_a2a.data=[];
+}
+}
+if(!_a28){
+cc1.empty();
+cc2.empty();
+}
+if(opts.view.onBeforeRender){
+opts.view.onBeforeRender.call(opts.view,_a26,_a27,data);
+}
+opts.view.render.call(opts.view,_a26,cc1,true);
+opts.view.render.call(opts.view,_a26,cc2,false);
+if(opts.showFooter){
+opts.view.renderFooter.call(opts.view,_a26,dc.footer1,true);
+opts.view.renderFooter.call(opts.view,_a26,dc.footer2,false);
+}
+if(opts.view.onAfterRender){
+opts.view.onAfterRender.call(opts.view,_a26);
+}
+if(!_a27&&opts.pagination){
+var _a2d=$.data(_a26,"treegrid").total;
+var _a2e=$(_a26).datagrid("getPager");
+var _a2f=_a2e.pagination("options");
+if(_a2f.total!=data.total){
+_a2e.pagination("refresh",{pageNumber:opts.pageNumber,total:data.total});
+if(opts.pageNumber!=_a2f.pageNumber&&_a2f.pageNumber>0){
+opts.pageNumber=_a2f.pageNumber;
+_9f6(_a26);
+}
+}
+}
+_9f7(_a26);
+_9ff(_a26);
+$(_a26).treegrid("showLines");
+$(_a26).treegrid("setSelectionState");
+$(_a26).treegrid("autoSizeColumn");
+if(!_a29){
+opts.onLoadSuccess.call(_a26,node,data);
+}
+};
+function _9f6(_a30,_a31,_a32,_a33,_a34){
+var opts=$.data(_a30,"treegrid").options;
+var body=$(_a30).datagrid("getPanel").find("div.datagrid-body");
+if(_a31==undefined&&opts.queryParams){
+opts.queryParams.id=undefined;
+}
+if(_a32){
+opts.queryParams=_a32;
+}
+var _a35=$.extend({},opts.queryParams);
+if(opts.pagination){
+$.extend(_a35,{page:opts.pageNumber,rows:opts.pageSize});
+}
+if(opts.sortName){
+$.extend(_a35,{sort:opts.sortName,order:opts.sortOrder});
+}
+var row=find(_a30,_a31);
+if(opts.onBeforeLoad.call(_a30,row,_a35)==false){
+return;
+}
+var _a36=body.find("tr[node-id=\""+_a31+"\"] span.tree-folder");
+_a36.addClass("tree-loading");
+$(_a30).treegrid("loading");
+var _a37=opts.loader.call(_a30,_a35,function(data){
+_a36.removeClass("tree-loading");
+$(_a30).treegrid("loaded");
+_a25(_a30,_a31,data,_a33);
+if(_a34){
+_a34();
+}
+},function(){
+_a36.removeClass("tree-loading");
+$(_a30).treegrid("loaded");
+opts.onLoadError.apply(_a30,arguments);
+if(_a34){
+_a34();
+}
+});
+if(_a37==false){
+_a36.removeClass("tree-loading");
+$(_a30).treegrid("loaded");
+}
+};
+function _a38(_a39){
+var _a3a=_a3b(_a39);
+return _a3a.length?_a3a[0]:null;
+};
+function _a3b(_a3c){
+return $.data(_a3c,"treegrid").data;
+};
+function _a19(_a3d,_a3e){
+var row=find(_a3d,_a3e);
+if(row._parentId){
+return find(_a3d,row._parentId);
+}else{
+return null;
+}
+};
+function _9fb(_a3f,_a40){
+var data=$.data(_a3f,"treegrid").data;
+if(_a40){
+var _a41=find(_a3f,_a40);
+data=_a41?(_a41.children||[]):[];
+}
+var _a42=[];
+$.easyui.forEach(data,true,function(node){
+_a42.push(node);
+});
+return _a42;
+};
+function _a43(_a44,_a45){
+var opts=$.data(_a44,"treegrid").options;
+var tr=opts.finder.getTr(_a44,_a45);
+var node=tr.children("td[field=\""+opts.treeField+"\"]");
+return node.find("span.tree-indent,span.tree-hit").length;
+};
+function find(_a46,_a47){
+var _a48=$.data(_a46,"treegrid");
+var opts=_a48.options;
+var _a49=null;
+$.easyui.forEach(_a48.data,true,function(node){
+if(node[opts.idField]==_a47){
+_a49=node;
+return false;
+}
+});
+return _a49;
+};
+function _a4a(_a4b,_a4c){
+var opts=$.data(_a4b,"treegrid").options;
+var row=find(_a4b,_a4c);
+var tr=opts.finder.getTr(_a4b,_a4c);
+var hit=tr.find("span.tree-hit");
+if(hit.length==0){
+return;
+}
+if(hit.hasClass("tree-collapsed")){
+return;
+}
+if(opts.onBeforeCollapse.call(_a4b,row)==false){
+return;
+}
+hit.removeClass("tree-expanded tree-expanded-hover").addClass("tree-collapsed");
+hit.next().removeClass("tree-folder-open");
+row.state="closed";
+tr=tr.next("tr.treegrid-tr-tree");
+var cc=tr.children("td").children("div");
+if(opts.animate){
+cc.slideUp("normal",function(){
+$(_a4b).treegrid("autoSizeColumn");
+_9f7(_a4b,_a4c);
+opts.onCollapse.call(_a4b,row);
+});
+}else{
+cc.hide();
+$(_a4b).treegrid("autoSizeColumn");
+_9f7(_a4b,_a4c);
+opts.onCollapse.call(_a4b,row);
+}
+};
+function _a4d(_a4e,_a4f){
+var opts=$.data(_a4e,"treegrid").options;
+var tr=opts.finder.getTr(_a4e,_a4f);
+var hit=tr.find("span.tree-hit");
+var row=find(_a4e,_a4f);
+if(hit.length==0){
+return;
+}
+if(hit.hasClass("tree-expanded")){
+return;
+}
+if(opts.onBeforeExpand.call(_a4e,row)==false){
+return;
+}
+hit.removeClass("tree-collapsed tree-collapsed-hover").addClass("tree-expanded");
+hit.next().addClass("tree-folder-open");
+var _a50=tr.next("tr.treegrid-tr-tree");
+if(_a50.length){
+var cc=_a50.children("td").children("div");
+_a51(cc);
+}else{
+_a1e(_a4e,row[opts.idField]);
+var _a50=tr.next("tr.treegrid-tr-tree");
+var cc=_a50.children("td").children("div");
+cc.hide();
+var _a52=$.extend({},opts.queryParams||{});
+_a52.id=row[opts.idField];
+_9f6(_a4e,row[opts.idField],_a52,true,function(){
+if(cc.is(":empty")){
+_a50.remove();
+}else{
+_a51(cc);
+}
+});
+}
+function _a51(cc){
+row.state="open";
+if(opts.animate){
+cc.slideDown("normal",function(){
+$(_a4e).treegrid("autoSizeColumn");
+_9f7(_a4e,_a4f);
+opts.onExpand.call(_a4e,row);
+});
+}else{
+cc.show();
+$(_a4e).treegrid("autoSizeColumn");
+_9f7(_a4e,_a4f);
+opts.onExpand.call(_a4e,row);
+}
+};
+};
+function _a07(_a53,_a54){
+var opts=$.data(_a53,"treegrid").options;
+var tr=opts.finder.getTr(_a53,_a54);
+var hit=tr.find("span.tree-hit");
+if(hit.hasClass("tree-expanded")){
+_a4a(_a53,_a54);
+}else{
+_a4d(_a53,_a54);
+}
+};
+function _a55(_a56,_a57){
+var opts=$.data(_a56,"treegrid").options;
+var _a58=_9fb(_a56,_a57);
+if(_a57){
+_a58.unshift(find(_a56,_a57));
+}
+for(var i=0;i<_a58.length;i++){
+_a4a(_a56,_a58[i][opts.idField]);
+}
+};
+function _a59(_a5a,_a5b){
+var opts=$.data(_a5a,"treegrid").options;
+var _a5c=_9fb(_a5a,_a5b);
+if(_a5b){
+_a5c.unshift(find(_a5a,_a5b));
+}
+for(var i=0;i<_a5c.length;i++){
+_a4d(_a5a,_a5c[i][opts.idField]);
+}
+};
+function _a5d(_a5e,_a5f){
+var opts=$.data(_a5e,"treegrid").options;
+var ids=[];
+var p=_a19(_a5e,_a5f);
+while(p){
+var id=p[opts.idField];
+ids.unshift(id);
+p=_a19(_a5e,id);
+}
+for(var i=0;i<ids.length;i++){
+_a4d(_a5e,ids[i]);
+}
+};
+function _a60(_a61,_a62){
+var _a63=$.data(_a61,"treegrid");
+var opts=_a63.options;
+if(_a62.parent){
+var tr=opts.finder.getTr(_a61,_a62.parent);
+if(tr.next("tr.treegrid-tr-tree").length==0){
+_a1e(_a61,_a62.parent);
+}
+var cell=tr.children("td[field=\""+opts.treeField+"\"]").children("div.datagrid-cell");
+var _a64=cell.children("span.tree-icon");
+if(_a64.hasClass("tree-file")){
+_a64.removeClass("tree-file").addClass("tree-folder tree-folder-open");
+var hit=$("<span class=\"tree-hit tree-expanded\"></span>").insertBefore(_a64);
+if(hit.prev().length){
+hit.prev().remove();
+}
+}
+}
+_a25(_a61,_a62.parent,_a62.data,_a63.data.length>0,true);
+};
+function _a65(_a66,_a67){
+var ref=_a67.before||_a67.after;
+var opts=$.data(_a66,"treegrid").options;
+var _a68=_a19(_a66,ref);
+_a60(_a66,{parent:(_a68?_a68[opts.idField]:null),data:[_a67.data]});
+var _a69=_a68?_a68.children:$(_a66).treegrid("getRoots");
+for(var i=0;i<_a69.length;i++){
+if(_a69[i][opts.idField]==ref){
+var _a6a=_a69[_a69.length-1];
+_a69.splice(_a67.before?i:(i+1),0,_a6a);
+_a69.splice(_a69.length-1,1);
+break;
+}
+}
+_a6b(true);
+_a6b(false);
+_9ff(_a66);
+$(_a66).treegrid("showLines");
+function _a6b(_a6c){
+var _a6d=_a6c?1:2;
+var tr=opts.finder.getTr(_a66,_a67.data[opts.idField],"body",_a6d);
+var _a6e=tr.closest("table.datagrid-btable");
+tr=tr.parent().children();
+var dest=opts.finder.getTr(_a66,ref,"body",_a6d);
+if(_a67.before){
+tr.insertBefore(dest);
+}else{
+var sub=dest.next("tr.treegrid-tr-tree");
+tr.insertAfter(sub.length?sub:dest);
+}
+_a6e.remove();
+};
+};
+function _a6f(_a70,_a71){
+var _a72=$.data(_a70,"treegrid");
+var opts=_a72.options;
+var prow=_a19(_a70,_a71);
+$(_a70).datagrid("deleteRow",_a71);
+$.easyui.removeArrayItem(_a72.checkedRows,opts.idField,_a71);
+_9ff(_a70);
+if(prow){
+_a1b(_a70,prow[opts.idField]);
+}
+_a72.total-=1;
+$(_a70).datagrid("getPager").pagination("refresh",{total:_a72.total});
+$(_a70).treegrid("showLines");
+};
+function _a73(_a74){
+var t=$(_a74);
+var opts=t.treegrid("options");
+if(opts.lines){
+t.treegrid("getPanel").addClass("tree-lines");
+}else{
+t.treegrid("getPanel").removeClass("tree-lines");
+return;
+}
+t.treegrid("getPanel").find("span.tree-indent").removeClass("tree-line tree-join tree-joinbottom");
+t.treegrid("getPanel").find("div.datagrid-cell").removeClass("tree-node-last tree-root-first tree-root-one");
+var _a75=t.treegrid("getRoots");
+if(_a75.length>1){
+_a76(_a75[0]).addClass("tree-root-first");
+}else{
+if(_a75.length==1){
+_a76(_a75[0]).addClass("tree-root-one");
+}
+}
+_a77(_a75);
+_a78(_a75);
+function _a77(_a79){
+$.map(_a79,function(node){
+if(node.children&&node.children.length){
+_a77(node.children);
+}else{
+var cell=_a76(node);
+cell.find(".tree-icon").prev().addClass("tree-join");
+}
+});
+if(_a79.length){
+var cell=_a76(_a79[_a79.length-1]);
+cell.addClass("tree-node-last");
+cell.find(".tree-join").removeClass("tree-join").addClass("tree-joinbottom");
+}
+};
+function _a78(_a7a){
+$.map(_a7a,function(node){
+if(node.children&&node.children.length){
+_a78(node.children);
+}
+});
+for(var i=0;i<_a7a.length-1;i++){
+var node=_a7a[i];
+var _a7b=t.treegrid("getLevel",node[opts.idField]);
+var tr=opts.finder.getTr(_a74,node[opts.idField]);
+var cc=tr.next().find("tr.datagrid-row td[field=\""+opts.treeField+"\"] div.datagrid-cell");
+cc.find("span:eq("+(_a7b-1)+")").addClass("tree-line");
+}
+};
+function _a76(node){
+var tr=opts.finder.getTr(_a74,node[opts.idField]);
+var cell=tr.find("td[field=\""+opts.treeField+"\"] div.datagrid-cell");
+return cell;
+};
+};
+$.fn.treegrid=function(_a7c,_a7d){
+if(typeof _a7c=="string"){
+var _a7e=$.fn.treegrid.methods[_a7c];
+if(_a7e){
+return _a7e(this,_a7d);
+}else{
+return this.datagrid(_a7c,_a7d);
+}
+}
+_a7c=_a7c||{};
+return this.each(function(){
+var _a7f=$.data(this,"treegrid");
+if(_a7f){
+$.extend(_a7f.options,_a7c);
+}else{
+_a7f=$.data(this,"treegrid",{options:$.extend({},$.fn.treegrid.defaults,$.fn.treegrid.parseOptions(this),_a7c),data:[],checkedRows:[],tmpIds:[]});
+}
+_9e6(this);
+if(_a7f.options.data){
+$(this).treegrid("loadData",_a7f.options.data);
+}
+_9f6(this);
+});
+};
+$.fn.treegrid.methods={options:function(jq){
+return $.data(jq[0],"treegrid").options;
+},resize:function(jq,_a80){
+return jq.each(function(){
+$(this).datagrid("resize",_a80);
+});
+},fixRowHeight:function(jq,_a81){
+return jq.each(function(){
+_9f7(this,_a81);
+});
+},loadData:function(jq,data){
+return jq.each(function(){
+_a25(this,data.parent,data);
+});
+},load:function(jq,_a82){
+return jq.each(function(){
+$(this).treegrid("options").pageNumber=1;
+$(this).treegrid("getPager").pagination({pageNumber:1});
+$(this).treegrid("reload",_a82);
+});
+},reload:function(jq,id){
+return jq.each(function(){
+var opts=$(this).treegrid("options");
+var _a83={};
+if(typeof id=="object"){
+_a83=id;
+}else{
+_a83=$.extend({},opts.queryParams);
+_a83.id=id;
+}
+if(_a83.id){
+var node=$(this).treegrid("find",_a83.id);
+if(node.children){
+node.children.splice(0,node.children.length);
+}
+opts.queryParams=_a83;
+var tr=opts.finder.getTr(this,_a83.id);
+tr.next("tr.treegrid-tr-tree").remove();
+tr.find("span.tree-hit").removeClass("tree-expanded tree-expanded-hover").addClass("tree-collapsed");
+_a4d(this,_a83.id);
+}else{
+_9f6(this,null,_a83);
+}
+});
+},reloadFooter:function(jq,_a84){
+return jq.each(function(){
+var opts=$.data(this,"treegrid").options;
+var dc=$.data(this,"datagrid").dc;
+if(_a84){
+$.data(this,"treegrid").footer=_a84;
+}
+if(opts.showFooter){
+opts.view.renderFooter.call(opts.view,this,dc.footer1,true);
+opts.view.renderFooter.call(opts.view,this,dc.footer2,false);
+if(opts.view.onAfterRender){
+opts.view.onAfterRender.call(opts.view,this);
+}
+$(this).treegrid("fixRowHeight");
+}
+});
+},getData:function(jq){
+return $.data(jq[0],"treegrid").data;
+},getFooterRows:function(jq){
+return $.data(jq[0],"treegrid").footer;
+},getRoot:function(jq){
+return _a38(jq[0]);
+},getRoots:function(jq){
+return _a3b(jq[0]);
+},getParent:function(jq,id){
+return _a19(jq[0],id);
+},getChildren:function(jq,id){
+return _9fb(jq[0],id);
+},getLevel:function(jq,id){
+return _a43(jq[0],id);
+},find:function(jq,id){
+return find(jq[0],id);
+},isLeaf:function(jq,id){
+var opts=$.data(jq[0],"treegrid").options;
+var tr=opts.finder.getTr(jq[0],id);
+var hit=tr.find("span.tree-hit");
+return hit.length==0;
+},select:function(jq,id){
+return jq.each(function(){
+$(this).datagrid("selectRow",id);
+});
+},unselect:function(jq,id){
+return jq.each(function(){
+$(this).datagrid("unselectRow",id);
+});
+},collapse:function(jq,id){
+return jq.each(function(){
+_a4a(this,id);
+});
+},expand:function(jq,id){
+return jq.each(function(){
+_a4d(this,id);
+});
+},toggle:function(jq,id){
+return jq.each(function(){
+_a07(this,id);
+});
+},collapseAll:function(jq,id){
+return jq.each(function(){
+_a55(this,id);
+});
+},expandAll:function(jq,id){
+return jq.each(function(){
+_a59(this,id);
+});
+},expandTo:function(jq,id){
+return jq.each(function(){
+_a5d(this,id);
+});
+},append:function(jq,_a85){
+return jq.each(function(){
+_a60(this,_a85);
+});
+},insert:function(jq,_a86){
+return jq.each(function(){
+_a65(this,_a86);
+});
+},remove:function(jq,id){
+return jq.each(function(){
+_a6f(this,id);
+});
+},pop:function(jq,id){
+var row=jq.treegrid("find",id);
+jq.treegrid("remove",id);
+return row;
+},refresh:function(jq,id){
+return jq.each(function(){
+var opts=$.data(this,"treegrid").options;
+opts.view.refreshRow.call(opts.view,this,id);
+});
+},update:function(jq,_a87){
+return jq.each(function(){
+var opts=$.data(this,"treegrid").options;
+var row=_a87.row;
+opts.view.updateRow.call(opts.view,this,_a87.id,row);
+if(row.checked!=undefined){
+row=find(this,_a87.id);
+$.extend(row,{checkState:row.checked?"checked":(row.checked===false?"unchecked":undefined)});
+_a1b(this,_a87.id);
+}
+});
+},beginEdit:function(jq,id){
+return jq.each(function(){
+$(this).datagrid("beginEdit",id);
+$(this).treegrid("fixRowHeight",id);
+});
+},endEdit:function(jq,id){
+return jq.each(function(){
+$(this).datagrid("endEdit",id);
+});
+},cancelEdit:function(jq,id){
+return jq.each(function(){
+$(this).datagrid("cancelEdit",id);
+});
+},showLines:function(jq){
+return jq.each(function(){
+_a73(this);
+});
+},setSelectionState:function(jq){
+return jq.each(function(){
+$(this).datagrid("setSelectionState");
+var _a88=$(this).data("treegrid");
+for(var i=0;i<_a88.tmpIds.length;i++){
+_a08(this,_a88.tmpIds[i],true,true);
+}
+_a88.tmpIds=[];
+});
+},getCheckedNodes:function(jq,_a89){
+_a89=_a89||"checked";
+var rows=[];
+$.easyui.forEach(jq.data("treegrid").checkedRows,false,function(row){
+if(row.checkState==_a89){
+rows.push(row);
+}
+});
+return rows;
+},checkNode:function(jq,id){
+return jq.each(function(){
+_a08(this,id,true);
+});
+},uncheckNode:function(jq,id){
+return jq.each(function(){
+_a08(this,id,false);
+});
+},clearChecked:function(jq){
+return jq.each(function(){
+var _a8a=this;
+var opts=$(_a8a).treegrid("options");
+$(_a8a).datagrid("clearChecked");
+$.map($(_a8a).treegrid("getCheckedNodes"),function(row){
+_a08(_a8a,row[opts.idField],false,true);
+});
+});
+}};
+$.fn.treegrid.parseOptions=function(_a8b){
+return $.extend({},$.fn.datagrid.parseOptions(_a8b),$.parser.parseOptions(_a8b,["treeField",{checkbox:"boolean",cascadeCheck:"boolean",onlyLeafCheck:"boolean"},{animate:"boolean"}]));
+};
+var _a8c=$.extend({},$.fn.datagrid.defaults.view,{render:function(_a8d,_a8e,_a8f){
+var opts=$.data(_a8d,"treegrid").options;
+var _a90=$(_a8d).datagrid("getColumnFields",_a8f);
+var _a91=$.data(_a8d,"datagrid").rowIdPrefix;
+if(_a8f){
+if(!(opts.rownumbers||(opts.frozenColumns&&opts.frozenColumns.length))){
+return;
+}
+}
+var view=this;
+if(this.treeNodes&&this.treeNodes.length){
+var _a92=_a93.call(this,_a8f,this.treeLevel,this.treeNodes);
+$(_a8e).append(_a92.join(""));
+}
+function _a93(_a94,_a95,_a96){
+var _a97=$(_a8d).treegrid("getParent",_a96[0][opts.idField]);
+var _a98=(_a97?_a97.children.length:$(_a8d).treegrid("getRoots").length)-_a96.length;
+var _a99=["<table class=\"datagrid-btable\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\"><tbody>"];
+for(var i=0;i<_a96.length;i++){
+var row=_a96[i];
+if(row.state!="open"&&row.state!="closed"){
+row.state="open";
+}
+var css=opts.rowStyler?opts.rowStyler.call(_a8d,row):"";
+var cs=this.getStyleValue(css);
+var cls="class=\"datagrid-row "+(_a98++%2&&opts.striped?"datagrid-row-alt ":" ")+cs.c+"\"";
+var _a9a=cs.s?"style=\""+cs.s+"\"":"";
+var _a9b=_a91+"-"+(_a94?1:2)+"-"+row[opts.idField];
+_a99.push("<tr id=\""+_a9b+"\" node-id=\""+row[opts.idField]+"\" "+cls+" "+_a9a+">");
+_a99=_a99.concat(view.renderRow.call(view,_a8d,_a90,_a94,_a95,row));
+_a99.push("</tr>");
+if(row.children&&row.children.length){
+var tt=_a93.call(this,_a94,_a95+1,row.children);
+var v=row.state=="closed"?"none":"block";
+_a99.push("<tr class=\"treegrid-tr-tree\"><td style=\"border:0px\" colspan="+(_a90.length+(opts.rownumbers?1:0))+"><div style=\"display:"+v+"\">");
+_a99=_a99.concat(tt);
+_a99.push("</div></td></tr>");
+}
+}
+_a99.push("</tbody></table>");
+return _a99;
+};
+},renderFooter:function(_a9c,_a9d,_a9e){
+var opts=$.data(_a9c,"treegrid").options;
+var rows=$.data(_a9c,"treegrid").footer||[];
+var _a9f=$(_a9c).datagrid("getColumnFields",_a9e);
+var _aa0=["<table class=\"datagrid-ftable\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\"><tbody>"];
+for(var i=0;i<rows.length;i++){
+var row=rows[i];
+row[opts.idField]=row[opts.idField]||("foot-row-id"+i);
+_aa0.push("<tr class=\"datagrid-row\" node-id=\""+row[opts.idField]+"\">");
+_aa0.push(this.renderRow.call(this,_a9c,_a9f,_a9e,0,row));
+_aa0.push("</tr>");
+}
+_aa0.push("</tbody></table>");
+$(_a9d).html(_aa0.join(""));
+},renderRow:function(_aa1,_aa2,_aa3,_aa4,row){
+var _aa5=$.data(_aa1,"treegrid");
+var opts=_aa5.options;
+var cc=[];
+if(_aa3&&opts.rownumbers){
+cc.push("<td class=\"datagrid-td-rownumber\"><div class=\"datagrid-cell-rownumber\">0</div></td>");
+}
+for(var i=0;i<_aa2.length;i++){
+var _aa6=_aa2[i];
+var col=$(_aa1).datagrid("getColumnOption",_aa6);
+if(col){
+var css=col.styler?(col.styler(row[_aa6],row)||""):"";
+var cs=this.getStyleValue(css);
+var cls=cs.c?"class=\""+cs.c+"\"":"";
+var _aa7=col.hidden?"style=\"display:none;"+cs.s+"\"":(cs.s?"style=\""+cs.s+"\"":"");
+cc.push("<td field=\""+_aa6+"\" "+cls+" "+_aa7+">");
+var _aa7="";
+if(!col.checkbox){
+if(col.align){
+_aa7+="text-align:"+col.align+";";
+}
+if(!opts.nowrap){
+_aa7+="white-space:normal;height:auto;";
+}else{
+if(opts.autoRowHeight){
+_aa7+="height:auto;";
+}
+}
+}
+cc.push("<div style=\""+_aa7+"\" ");
+if(col.checkbox){
+cc.push("class=\"datagrid-cell-check ");
+}else{
+cc.push("class=\"datagrid-cell "+col.cellClass);
+}
+if(_aa6==opts.treeField){
+cc.push(" tree-node");
+}
+cc.push("\">");
+if(col.checkbox){
+if(row.checked){
+cc.push("<input type=\"checkbox\" checked=\"checked\"");
+}else{
+cc.push("<input type=\"checkbox\"");
+}
+cc.push(" name=\""+_aa6+"\" value=\""+(row[_aa6]!=undefined?row[_aa6]:"")+"\">");
+}else{
+var val=null;
+if(col.formatter){
+val=col.formatter(row[_aa6],row);
+}else{
+val=row[_aa6];
+}
+if(_aa6==opts.treeField){
+for(var j=0;j<_aa4;j++){
+cc.push("<span class=\"tree-indent\"></span>");
+}
+if(row.state=="closed"){
+cc.push("<span class=\"tree-hit tree-collapsed\"></span>");
+cc.push("<span class=\"tree-icon tree-folder "+(row.iconCls?row.iconCls:"")+"\"></span>");
+}else{
+if(row.children&&row.children.length){
+cc.push("<span class=\"tree-hit tree-expanded\"></span>");
+cc.push("<span class=\"tree-icon tree-folder tree-folder-open "+(row.iconCls?row.iconCls:"")+"\"></span>");
+}else{
+cc.push("<span class=\"tree-indent\"></span>");
+cc.push("<span class=\"tree-icon tree-file "+(row.iconCls?row.iconCls:"")+"\"></span>");
+}
+}
+if(this.hasCheckbox(_aa1,row)){
+var flag=0;
+var crow=$.easyui.getArrayItem(_aa5.checkedRows,opts.idField,row[opts.idField]);
+if(crow){
+flag=crow.checkState=="checked"?1:2;
+row.checkState=crow.checkState;
+row.checked=crow.checked;
+$.easyui.addArrayItem(_aa5.checkedRows,opts.idField,row);
+}else{
+var prow=$.easyui.getArrayItem(_aa5.checkedRows,opts.idField,row._parentId);
+if(prow&&prow.checkState=="checked"&&opts.cascadeCheck){
+flag=1;
+row.checked=true;
+$.easyui.addArrayItem(_aa5.checkedRows,opts.idField,row);
+}else{
+if(row.checked){
+$.easyui.addArrayItem(_aa5.tmpIds,row[opts.idField]);
+}
+}
+row.checkState=flag?"checked":"unchecked";
+}
+cc.push("<span class=\"tree-checkbox tree-checkbox"+flag+"\"></span>");
+}else{
+row.checkState=undefined;
+row.checked=undefined;
+}
+cc.push("<span class=\"tree-title\">"+val+"</span>");
+}else{
+cc.push(val);
+}
+}
+cc.push("</div>");
+cc.push("</td>");
+}
+}
+return cc.join("");
+},hasCheckbox:function(_aa8,row){
+var opts=$.data(_aa8,"treegrid").options;
+if(opts.checkbox){
+if($.isFunction(opts.checkbox)){
+if(opts.checkbox.call(_aa8,row)){
+return true;
+}else{
+return false;
+}
+}else{
+if(opts.onlyLeafCheck){
+if(row.state=="open"&&!(row.children&&row.children.length)){
+return true;
+}
+}else{
+return true;
+}
+}
+}
+return false;
+},refreshRow:function(_aa9,id){
+this.updateRow.call(this,_aa9,id,{});
+},updateRow:function(_aaa,id,row){
+var opts=$.data(_aaa,"treegrid").options;
+var _aab=$(_aaa).treegrid("find",id);
+$.extend(_aab,row);
+var _aac=$(_aaa).treegrid("getLevel",id)-1;
+var _aad=opts.rowStyler?opts.rowStyler.call(_aaa,_aab):"";
+var _aae=$.data(_aaa,"datagrid").rowIdPrefix;
+var _aaf=_aab[opts.idField];
+function _ab0(_ab1){
+var _ab2=$(_aaa).treegrid("getColumnFields",_ab1);
+var tr=opts.finder.getTr(_aaa,id,"body",(_ab1?1:2));
+var _ab3=tr.find("div.datagrid-cell-rownumber").html();
+var _ab4=tr.find("div.datagrid-cell-check input[type=checkbox]").is(":checked");
+tr.html(this.renderRow(_aaa,_ab2,_ab1,_aac,_aab));
+tr.attr("style",_aad||"");
+tr.find("div.datagrid-cell-rownumber").html(_ab3);
+if(_ab4){
+tr.find("div.datagrid-cell-check input[type=checkbox]")._propAttr("checked",true);
+}
+if(_aaf!=id){
+tr.attr("id",_aae+"-"+(_ab1?1:2)+"-"+_aaf);
+tr.attr("node-id",_aaf);
+}
+};
+_ab0.call(this,true);
+_ab0.call(this,false);
+$(_aaa).treegrid("fixRowHeight",id);
+},deleteRow:function(_ab5,id){
+var opts=$.data(_ab5,"treegrid").options;
+var tr=opts.finder.getTr(_ab5,id);
+tr.next("tr.treegrid-tr-tree").remove();
+tr.remove();
+var _ab6=del(id);
+if(_ab6){
+if(_ab6.children.length==0){
+tr=opts.finder.getTr(_ab5,_ab6[opts.idField]);
+tr.next("tr.treegrid-tr-tree").remove();
+var cell=tr.children("td[field=\""+opts.treeField+"\"]").children("div.datagrid-cell");
+cell.find(".tree-icon").removeClass("tree-folder").addClass("tree-file");
+cell.find(".tree-hit").remove();
+$("<span class=\"tree-indent\"></span>").prependTo(cell);
+}
+}
+this.setEmptyMsg(_ab5);
+function del(id){
+var cc;
+var _ab7=$(_ab5).treegrid("getParent",id);
+if(_ab7){
+cc=_ab7.children;
+}else{
+cc=$(_ab5).treegrid("getData");
+}
+for(var i=0;i<cc.length;i++){
+if(cc[i][opts.idField]==id){
+cc.splice(i,1);
+break;
+}
+}
+return _ab7;
+};
+},onBeforeRender:function(_ab8,_ab9,data){
+if($.isArray(_ab9)){
+data={total:_ab9.length,rows:_ab9};
+_ab9=null;
+}
+if(!data){
+return false;
+}
+var _aba=$.data(_ab8,"treegrid");
+var opts=_aba.options;
+if(data.length==undefined){
+if(data.footer){
+_aba.footer=data.footer;
+}
+if(data.total){
+_aba.total=data.total;
+}
+data=this.transfer(_ab8,_ab9,data.rows);
+}else{
+function _abb(_abc,_abd){
+for(var i=0;i<_abc.length;i++){
+var row=_abc[i];
+row._parentId=_abd;
+if(row.children&&row.children.length){
+_abb(row.children,row[opts.idField]);
+}
+}
+};
+_abb(data,_ab9);
+}
+this.sort(_ab8,data);
+this.treeNodes=data;
+this.treeLevel=$(_ab8).treegrid("getLevel",_ab9);
+var node=find(_ab8,_ab9);
+if(node){
+if(node.children){
+node.children=node.children.concat(data);
+}else{
+node.children=data;
+}
+}else{
+_aba.data=_aba.data.concat(data);
+}
+},sort:function(_abe,data){
+var opts=$.data(_abe,"treegrid").options;
+if(!opts.remoteSort&&opts.sortName){
+var _abf=opts.sortName.split(",");
+var _ac0=opts.sortOrder.split(",");
+_ac1(data);
+}
+function _ac1(rows){
+rows.sort(function(r1,r2){
+var r=0;
+for(var i=0;i<_abf.length;i++){
+var sn=_abf[i];
+var so=_ac0[i];
+var col=$(_abe).treegrid("getColumnOption",sn);
+var _ac2=col.sorter||function(a,b){
+return a==b?0:(a>b?1:-1);
+};
+r=_ac2(r1[sn],r2[sn])*(so=="asc"?1:-1);
+if(r!=0){
+return r;
+}
+}
+return r;
+});
+for(var i=0;i<rows.length;i++){
+var _ac3=rows[i].children;
+if(_ac3&&_ac3.length){
+_ac1(_ac3);
+}
+}
+};
+},transfer:function(_ac4,_ac5,data){
+var opts=$.data(_ac4,"treegrid").options;
+var rows=$.extend([],data);
+var _ac6=_ac7(_ac5,rows);
+var toDo=$.extend([],_ac6);
+while(toDo.length){
+var node=toDo.shift();
+var _ac8=_ac7(node[opts.idField],rows);
+if(_ac8.length){
+if(node.children){
+node.children=node.children.concat(_ac8);
+}else{
+node.children=_ac8;
+}
+toDo=toDo.concat(_ac8);
+}
+}
+return _ac6;
+function _ac7(_ac9,rows){
+var rr=[];
+for(var i=0;i<rows.length;i++){
+var row=rows[i];
+if(row._parentId==_ac9){
+rr.push(row);
+rows.splice(i,1);
+i--;
+}
+}
+return rr;
+};
+}});
+$.fn.treegrid.defaults=$.extend({},$.fn.datagrid.defaults,{treeField:null,checkbox:false,cascadeCheck:true,onlyLeafCheck:false,lines:false,animate:false,singleSelect:true,view:_a8c,rowEvents:$.extend({},$.fn.datagrid.defaults.rowEvents,{mouseover:_a01(true),mouseout:_a01(false),click:_a03}),loader:function(_aca,_acb,_acc){
+var opts=$(this).treegrid("options");
+if(!opts.url){
+return false;
+}
+$.ajax({type:opts.method,url:opts.url,data:_aca,dataType:"json",success:function(data){
+_acb(data);
+},error:function(){
+_acc.apply(this,arguments);
+}});
+},loadFilter:function(data,_acd){
+return data;
+},finder:{getTr:function(_ace,id,type,_acf){
+type=type||"body";
+_acf=_acf||0;
+var dc=$.data(_ace,"datagrid").dc;
+if(_acf==0){
+var opts=$.data(_ace,"treegrid").options;
+var tr1=opts.finder.getTr(_ace,id,type,1);
+var tr2=opts.finder.getTr(_ace,id,type,2);
+return tr1.add(tr2);
+}else{
+if(type=="body"){
+var tr=$("#"+$.data(_ace,"datagrid").rowIdPrefix+"-"+_acf+"-"+id);
+if(!tr.length){
+tr=(_acf==1?dc.body1:dc.body2).find("tr[node-id=\""+id+"\"]");
+}
+return tr;
+}else{
+if(type=="footer"){
+return (_acf==1?dc.footer1:dc.footer2).find("tr[node-id=\""+id+"\"]");
+}else{
+if(type=="selected"){
+return (_acf==1?dc.body1:dc.body2).find("tr.datagrid-row-selected");
+}else{
+if(type=="highlight"){
+return (_acf==1?dc.body1:dc.body2).find("tr.datagrid-row-over");
+}else{
+if(type=="checked"){
+return (_acf==1?dc.body1:dc.body2).find("tr.datagrid-row-checked");
+}else{
+if(type=="last"){
+return (_acf==1?dc.body1:dc.body2).find("tr:last[node-id]");
+}else{
+if(type=="allbody"){
+return (_acf==1?dc.body1:dc.body2).find("tr[node-id]");
+}else{
+if(type=="allfooter"){
+return (_acf==1?dc.footer1:dc.footer2).find("tr[node-id]");
+}
+}
+}
+}
+}
+}
+}
+}
+}
+},getRow:function(_ad0,p){
+var id=(typeof p=="object")?p.attr("node-id"):p;
+return $(_ad0).treegrid("find",id);
+},getRows:function(_ad1){
+return $(_ad1).treegrid("getChildren");
+}},onBeforeLoad:function(row,_ad2){
+},onLoadSuccess:function(row,data){
+},onLoadError:function(){
+},onBeforeCollapse:function(row){
+},onCollapse:function(row){
+},onBeforeExpand:function(row){
+},onExpand:function(row){
+},onClickRow:function(row){
+},onDblClickRow:function(row){
+},onClickCell:function(_ad3,row){
+},onDblClickCell:function(_ad4,row){
+},onContextMenu:function(e,row){
+},onBeforeEdit:function(row){
+},onAfterEdit:function(row,_ad5){
+},onCancelEdit:function(row){
+},onBeforeCheckNode:function(row,_ad6){
+},onCheckNode:function(row,_ad7){
+}});
+})(jQuery);
+(function($){
+function _ad8(_ad9){
+var opts=$.data(_ad9,"datalist").options;
+$(_ad9).datagrid($.extend({},opts,{cls:"datalist"+(opts.lines?" datalist-lines":""),frozenColumns:(opts.frozenColumns&&opts.frozenColumns.length)?opts.frozenColumns:(opts.checkbox?[[{field:"_ck",checkbox:true}]]:undefined),columns:(opts.columns&&opts.columns.length)?opts.columns:[[{field:opts.textField,width:"100%",formatter:function(_ada,row,_adb){
+return opts.textFormatter?opts.textFormatter(_ada,row,_adb):_ada;
+}}]]}));
+};
+var _adc=$.extend({},$.fn.datagrid.defaults.view,{render:function(_add,_ade,_adf){
+var _ae0=$.data(_add,"datagrid");
+var opts=_ae0.options;
+if(opts.groupField){
+var g=this.groupRows(_add,_ae0.data.rows);
+this.groups=g.groups;
+_ae0.data.rows=g.rows;
+var _ae1=[];
+for(var i=0;i<g.groups.length;i++){
+_ae1.push(this.renderGroup.call(this,_add,i,g.groups[i],_adf));
+}
+$(_ade).html(_ae1.join(""));
+}else{
+$(_ade).html(this.renderTable(_add,0,_ae0.data.rows,_adf));
+}
+},renderGroup:function(_ae2,_ae3,_ae4,_ae5){
+var _ae6=$.data(_ae2,"datagrid");
+var opts=_ae6.options;
+var _ae7=$(_ae2).datagrid("getColumnFields",_ae5);
+var _ae8=[];
+_ae8.push("<div class=\"datagrid-group\" group-index="+_ae3+">");
+if(!_ae5){
+_ae8.push("<span class=\"datagrid-group-title\">");
+_ae8.push(opts.groupFormatter.call(_ae2,_ae4.value,_ae4.rows));
+_ae8.push("</span>");
+}
+_ae8.push("</div>");
+_ae8.push(this.renderTable(_ae2,_ae4.startIndex,_ae4.rows,_ae5));
+return _ae8.join("");
+},groupRows:function(_ae9,rows){
+var _aea=$.data(_ae9,"datagrid");
+var opts=_aea.options;
+var _aeb=[];
+for(var i=0;i<rows.length;i++){
+var row=rows[i];
+var _aec=_aed(row[opts.groupField]);
+if(!_aec){
+_aec={value:row[opts.groupField],rows:[row]};
+_aeb.push(_aec);
+}else{
+_aec.rows.push(row);
+}
+}
+var _aee=0;
+var rows=[];
+for(var i=0;i<_aeb.length;i++){
+var _aec=_aeb[i];
+_aec.startIndex=_aee;
+_aee+=_aec.rows.length;
+rows=rows.concat(_aec.rows);
+}
+return {groups:_aeb,rows:rows};
+function _aed(_aef){
+for(var i=0;i<_aeb.length;i++){
+var _af0=_aeb[i];
+if(_af0.value==_aef){
+return _af0;
+}
+}
+return null;
+};
+}});
+$.fn.datalist=function(_af1,_af2){
+if(typeof _af1=="string"){
+var _af3=$.fn.datalist.methods[_af1];
+if(_af3){
+return _af3(this,_af2);
+}else{
+return this.datagrid(_af1,_af2);
+}
+}
+_af1=_af1||{};
+return this.each(function(){
+var _af4=$.data(this,"datalist");
+if(_af4){
+$.extend(_af4.options,_af1);
+}else{
+var opts=$.extend({},$.fn.datalist.defaults,$.fn.datalist.parseOptions(this),_af1);
+opts.columns=$.extend(true,[],opts.columns);
+_af4=$.data(this,"datalist",{options:opts});
+}
+_ad8(this);
+if(!_af4.options.data){
+var data=$.fn.datalist.parseData(this);
+if(data.total){
+$(this).datalist("loadData",data);
+}
+}
+});
+};
+$.fn.datalist.methods={options:function(jq){
+return $.data(jq[0],"datalist").options;
+}};
+$.fn.datalist.parseOptions=function(_af5){
+return $.extend({},$.fn.datagrid.parseOptions(_af5),$.parser.parseOptions(_af5,["valueField","textField","groupField",{checkbox:"boolean",lines:"boolean"}]));
+};
+$.fn.datalist.parseData=function(_af6){
+var opts=$.data(_af6,"datalist").options;
+var data={total:0,rows:[]};
+$(_af6).children().each(function(){
+var _af7=$.parser.parseOptions(this,["value","group"]);
+var row={};
+var html=$(this).html();
+row[opts.valueField]=_af7.value!=undefined?_af7.value:html;
+row[opts.textField]=html;
+if(opts.groupField){
+row[opts.groupField]=_af7.group;
+}
+data.total++;
+data.rows.push(row);
+});
+return data;
+};
+$.fn.datalist.defaults=$.extend({},$.fn.datagrid.defaults,{fitColumns:true,singleSelect:true,showHeader:false,checkbox:false,lines:false,valueField:"value",textField:"text",groupField:"",view:_adc,textFormatter:function(_af8,row){
+return _af8;
+},groupFormatter:function(_af9,rows){
+return _af9;
+}});
+})(jQuery);
+(function($){
+$(function(){
+$(document)._unbind(".combo")._bind("mousedown.combo mousewheel.combo",function(e){
+var p=$(e.target).closest("span.combo,div.combo-p,div.menu");
+if(p.length){
+_afa(p);
+return;
+}
+$("body>div.combo-p>div.combo-panel:visible").panel("close");
+});
+});
+function _afb(_afc){
+var _afd=$.data(_afc,"combo");
+var opts=_afd.options;
+if(!_afd.panel){
+_afd.panel=$("<div class=\"combo-panel\"></div>").appendTo("html>body");
+_afd.panel.panel({minWidth:opts.panelMinWidth,maxWidth:opts.panelMaxWidth,minHeight:opts.panelMinHeight,maxHeight:opts.panelMaxHeight,doSize:false,closed:true,cls:"combo-p",style:{position:"absolute",zIndex:10},onOpen:function(){
+var _afe=$(this).panel("options").comboTarget;
+var _aff=$.data(_afe,"combo");
+if(_aff){
+_aff.options.onShowPanel.call(_afe);
+}
+},onBeforeClose:function(){
+_afa($(this).parent());
+},onClose:function(){
+var _b00=$(this).panel("options").comboTarget;
+var _b01=$(_b00).data("combo");
+if(_b01){
+_b01.options.onHidePanel.call(_b00);
+}
+}});
+}
+var _b02=$.extend(true,[],opts.icons);
+if(opts.hasDownArrow){
+_b02.push({iconCls:"combo-arrow",handler:function(e){
+_b07(e.data.target);
+}});
+}
+$(_afc).addClass("combo-f").textbox($.extend({},opts,{icons:_b02,onChange:function(){
+}}));
+$(_afc).attr("comboName",$(_afc).attr("textboxName"));
+_afd.combo=$(_afc).next();
+_afd.combo.addClass("combo");
+_afd.panel._unbind(".combo");
+for(var _b03 in opts.panelEvents){
+_afd.panel._bind(_b03+".combo",{target:_afc},opts.panelEvents[_b03]);
+}
+};
+function _b04(_b05){
+var _b06=$.data(_b05,"combo");
+var opts=_b06.options;
+var p=_b06.panel;
+if(p.is(":visible")){
+p.panel("close");
+}
+if(!opts.cloned){
+p.panel("destroy");
+}
+$(_b05).textbox("destroy");
+};
+function _b07(_b08){
+var _b09=$.data(_b08,"combo").panel;
+if(_b09.is(":visible")){
+var _b0a=_b09.combo("combo");
+_b0b(_b0a);
+if(_b0a!=_b08){
+$(_b08).combo("showPanel");
+}
+}else{
+var p=$(_b08).closest("div.combo-p").children(".combo-panel");
+$("div.combo-panel:visible").not(_b09).not(p).panel("close");
+$(_b08).combo("showPanel");
+}
+$(_b08).combo("textbox").focus();
+};
+function _afa(_b0c){
+$(_b0c).find(".combo-f").each(function(){
+var p=$(this).combo("panel");
+if(p.is(":visible")){
+p.panel("close");
+}
+});
+};
+function _b0d(e){
+var _b0e=e.data.target;
+var _b0f=$.data(_b0e,"combo");
+var opts=_b0f.options;
+if(!opts.editable){
+_b07(_b0e);
+}else{
+var p=$(_b0e).closest("div.combo-p").children(".combo-panel");
+$("div.combo-panel:visible").not(p).each(function(){
+var _b10=$(this).combo("combo");
+if(_b10!=_b0e){
+_b0b(_b10);
+}
+});
+}
+};
+function _b11(e){
+var _b12=e.data.target;
+var t=$(_b12);
+var _b13=t.data("combo");
+var opts=t.combo("options");
+_b13.panel.panel("options").comboTarget=_b12;
+switch(e.keyCode){
+case 38:
+opts.keyHandler.up.call(_b12,e);
+break;
+case 40:
+opts.keyHandler.down.call(_b12,e);
+break;
+case 37:
+opts.keyHandler.left.call(_b12,e);
+break;
+case 39:
+opts.keyHandler.right.call(_b12,e);
+break;
+case 13:
+e.preventDefault();
+opts.keyHandler.enter.call(_b12,e);
+return false;
+case 9:
+case 27:
+_b0b(_b12);
+break;
+default:
+if(opts.editable){
+if(_b13.timer){
+clearTimeout(_b13.timer);
+}
+_b13.timer=setTimeout(function(){
+var q=t.combo("getText");
+if(_b13.previousText!=q){
+_b13.previousText=q;
+t.combo("showPanel");
+opts.keyHandler.query.call(_b12,q,e);
+t.combo("validate");
+}
+},opts.delay);
+}
+}
+};
+function _b14(e){
+var _b15=e.data.target;
+var _b16=$(_b15).data("combo");
+if(_b16.timer){
+clearTimeout(_b16.timer);
+}
+};
+function _b17(_b18){
+var _b19=$.data(_b18,"combo");
+var _b1a=_b19.combo;
+var _b1b=_b19.panel;
+var opts=$(_b18).combo("options");
+var _b1c=_b1b.panel("options");
+_b1c.comboTarget=_b18;
+if(_b1c.closed){
+_b1b.panel("panel").show().css({zIndex:($.fn.menu?$.fn.menu.defaults.zIndex++:($.fn.window?$.fn.window.defaults.zIndex++:99)),left:-999999});
+_b1b.panel("resize",{width:(opts.panelWidth?opts.panelWidth:_b1a._outerWidth()),height:opts.panelHeight});
+_b1b.panel("panel").hide();
+_b1b.panel("open");
+}
+(function(){
+if(_b1c.comboTarget==_b18&&_b1b.is(":visible")){
+_b1b.panel("move",{left:_b1d(),top:_b1e()});
+setTimeout(arguments.callee,200);
+}
+})();
+function _b1d(){
+var left=_b1a.offset().left;
+if(opts.panelAlign=="right"){
+left+=_b1a._outerWidth()-_b1b._outerWidth();
+}
+if(left+_b1b._outerWidth()>$(window)._outerWidth()+$(document).scrollLeft()){
+left=$(window)._outerWidth()+$(document).scrollLeft()-_b1b._outerWidth();
+}
+if(left<0){
+left=0;
+}
+return left;
+};
+function _b1e(){
+if(opts.panelValign=="top"){
+var top=_b1a.offset().top-_b1b._outerHeight();
+}else{
+if(opts.panelValign=="bottom"){
+var top=_b1a.offset().top+_b1a._outerHeight();
+}else{
+var top=_b1a.offset().top+_b1a._outerHeight();
+if(top+_b1b._outerHeight()>$(window)._outerHeight()+$(document).scrollTop()){
+top=_b1a.offset().top-_b1b._outerHeight();
+}
+if(top<$(document).scrollTop()){
+top=_b1a.offset().top+_b1a._outerHeight();
+}
+}
+}
+return top;
+};
+};
+function _b0b(_b1f){
+var _b20=$.data(_b1f,"combo").panel;
+_b20.panel("close");
+};
+function _b21(_b22,text){
+var _b23=$.data(_b22,"combo");
+var _b24=$(_b22).textbox("getText");
+if(_b24!=text){
+$(_b22).textbox("setText",text);
+}
+_b23.previousText=text;
+};
+function _b25(_b26){
+var _b27=$.data(_b26,"combo");
+var opts=_b27.options;
+var _b28=$(_b26).next();
+var _b29=[];
+_b28.find(".textbox-value").each(function(){
+_b29.push($(this).val());
+});
+if(opts.multivalue){
+return _b29;
+}else{
+return _b29.length?_b29[0].split(opts.separator):_b29;
+}
+};
+function _b2a(_b2b,_b2c){
+var _b2d=$.data(_b2b,"combo");
+var _b2e=_b2d.combo;
+var opts=$(_b2b).combo("options");
+if(!$.isArray(_b2c)){
+_b2c=_b2c.split(opts.separator);
+}
+var _b2f=_b25(_b2b);
+_b2e.find(".textbox-value").remove();
+if(_b2c.length){
+if(opts.multivalue){
+for(var i=0;i<_b2c.length;i++){
+_b30(_b2c[i]);
+}
+}else{
+_b30(_b2c.join(opts.separator));
+}
+}
+function _b30(_b31){
+var name=$(_b2b).attr("textboxName")||"";
+var _b32=$("<input type=\"hidden\" class=\"textbox-value\">").appendTo(_b2e);
+_b32.attr("name",name);
+if(opts.disabled){
+_b32.attr("disabled","disabled");
+}
+_b32.val(_b31);
+};
+var _b33=(function(){
+if(opts.onChange==$.parser.emptyFn){
+return false;
+}
+if(_b2f.length!=_b2c.length){
+return true;
+}
+for(var i=0;i<_b2c.length;i++){
+if(_b2c[i]!=_b2f[i]){
+return true;
+}
+}
+return false;
+})();
+if(_b33){
+$(_b2b).val(_b2c.join(opts.separator));
+if(opts.multiple){
+opts.onChange.call(_b2b,_b2c,_b2f);
+}else{
+opts.onChange.call(_b2b,_b2c[0],_b2f[0]);
+}
+$(_b2b).closest("form").trigger("_change",[_b2b]);
+}
+};
+function _b34(_b35){
+var _b36=_b25(_b35);
+return _b36[0];
+};
+function _b37(_b38,_b39){
+_b2a(_b38,[_b39]);
+};
+function _b3a(_b3b){
+var opts=$.data(_b3b,"combo").options;
+var _b3c=opts.onChange;
+opts.onChange=$.parser.emptyFn;
+if(opts.multiple){
+_b2a(_b3b,opts.value?opts.value:[]);
+}else{
+_b37(_b3b,opts.value);
+}
+opts.onChange=_b3c;
+};
+$.fn.combo=function(_b3d,_b3e){
+if(typeof _b3d=="string"){
+var _b3f=$.fn.combo.methods[_b3d];
+if(_b3f){
+return _b3f(this,_b3e);
+}else{
+return this.textbox(_b3d,_b3e);
+}
+}
+_b3d=_b3d||{};
+return this.each(function(){
+var _b40=$.data(this,"combo");
+if(_b40){
+$.extend(_b40.options,_b3d);
+if(_b3d.value!=undefined){
+_b40.options.originalValue=_b3d.value;
+}
+}else{
+_b40=$.data(this,"combo",{options:$.extend({},$.fn.combo.defaults,$.fn.combo.parseOptions(this),_b3d),previousText:""});
+if(_b40.options.multiple&&_b40.options.value==""){
+_b40.options.originalValue=[];
+}else{
+_b40.options.originalValue=_b40.options.value;
+}
+}
+_afb(this);
+_b3a(this);
+});
+};
+$.fn.combo.methods={options:function(jq){
+var opts=jq.textbox("options");
+return $.extend($.data(jq[0],"combo").options,{width:opts.width,height:opts.height,disabled:opts.disabled,readonly:opts.readonly});
+},cloneFrom:function(jq,from){
+return jq.each(function(){
+$(this).textbox("cloneFrom",from);
+$.data(this,"combo",{options:$.extend(true,{cloned:true},$(from).combo("options")),combo:$(this).next(),panel:$(from).combo("panel")});
+$(this).addClass("combo-f").attr("comboName",$(this).attr("textboxName"));
+});
+},combo:function(jq){
+return jq.closest(".combo-panel").panel("options").comboTarget;
+},panel:function(jq){
+return $.data(jq[0],"combo").panel;
+},destroy:function(jq){
+return jq.each(function(){
+_b04(this);
+});
+},showPanel:function(jq){
+return jq.each(function(){
+_b17(this);
+});
+},hidePanel:function(jq){
+return jq.each(function(){
+_b0b(this);
+});
+},clear:function(jq){
+return jq.each(function(){
+$(this).textbox("setText","");
+var opts=$.data(this,"combo").options;
+if(opts.multiple){
+$(this).combo("setValues",[]);
+}else{
+$(this).combo("setValue","");
+}
+});
+},reset:function(jq){
+return jq.each(function(){
+var opts=$.data(this,"combo").options;
+if(opts.multiple){
+$(this).combo("setValues",opts.originalValue);
+}else{
+$(this).combo("setValue",opts.originalValue);
+}
+});
+},setText:function(jq,text){
+return jq.each(function(){
+_b21(this,text);
+});
+},getValues:function(jq){
+return _b25(jq[0]);
+},setValues:function(jq,_b41){
+return jq.each(function(){
+_b2a(this,_b41);
+});
+},getValue:function(jq){
+return _b34(jq[0]);
+},setValue:function(jq,_b42){
+return jq.each(function(){
+_b37(this,_b42);
+});
+}};
+$.fn.combo.parseOptions=function(_b43){
+var t=$(_b43);
+return $.extend({},$.fn.textbox.parseOptions(_b43),$.parser.parseOptions(_b43,["separator","panelAlign",{panelWidth:"number",hasDownArrow:"boolean",delay:"number",reversed:"boolean",multivalue:"boolean",selectOnNavigation:"boolean"},{panelMinWidth:"number",panelMaxWidth:"number",panelMinHeight:"number",panelMaxHeight:"number"}]),{panelHeight:(t.attr("panelHeight")=="auto"?"auto":parseInt(t.attr("panelHeight"))||undefined),multiple:(t.attr("multiple")?true:undefined)});
+};
+$.fn.combo.defaults=$.extend({},$.fn.textbox.defaults,{inputEvents:{click:_b0d,keydown:_b11,paste:_b11,drop:_b11,blur:_b14},panelEvents:{mousedown:function(e){
+e.preventDefault();
+e.stopPropagation();
+}},panelWidth:null,panelHeight:300,panelMinWidth:null,panelMaxWidth:null,panelMinHeight:null,panelMaxHeight:null,panelAlign:"left",panelValign:"auto",reversed:false,multiple:false,multivalue:true,selectOnNavigation:true,separator:",",hasDownArrow:true,delay:200,keyHandler:{up:function(e){
+},down:function(e){
+},left:function(e){
+},right:function(e){
+},enter:function(e){
+},query:function(q,e){
+}},onShowPanel:function(){
+},onHidePanel:function(){
+},onChange:function(_b44,_b45){
+}});
+})(jQuery);
+(function($){
+function _b46(_b47,_b48){
+var _b49=$.data(_b47,"combobox");
+return $.easyui.indexOfArray(_b49.data,_b49.options.valueField,_b48);
+};
+function _b4a(_b4b,_b4c){
+var opts=$.data(_b4b,"combobox").options;
+var _b4d=$(_b4b).combo("panel");
+var item=opts.finder.getEl(_b4b,_b4c);
+if(item.length){
+if(item.position().top<=0){
+var h=_b4d.scrollTop()+item.position().top;
+_b4d.scrollTop(h);
+}else{
+if(item.position().top+item.outerHeight()>_b4d.height()){
+var h=_b4d.scrollTop()+item.position().top+item.outerHeight()-_b4d.height();
+_b4d.scrollTop(h);
+}
+}
+}
+_b4d.triggerHandler("scroll");
+};
+function nav(_b4e,dir){
+var opts=$.data(_b4e,"combobox").options;
+var _b4f=$(_b4e).combobox("panel");
+var item=_b4f.children("div.combobox-item-hover");
+if(!item.length){
+item=_b4f.children("div.combobox-item-selected");
+}
+item.removeClass("combobox-item-hover");
+var _b50="div.combobox-item:visible:not(.combobox-item-disabled):first";
+var _b51="div.combobox-item:visible:not(.combobox-item-disabled):last";
+if(!item.length){
+item=_b4f.children(dir=="next"?_b50:_b51);
+}else{
+if(dir=="next"){
+item=item.nextAll(_b50);
+if(!item.length){
+item=_b4f.children(_b50);
+}
+}else{
+item=item.prevAll(_b50);
+if(!item.length){
+item=_b4f.children(_b51);
+}
+}
+}
+if(item.length){
+item.addClass("combobox-item-hover");
+var row=opts.finder.getRow(_b4e,item);
+if(row){
+$(_b4e).combobox("scrollTo",row[opts.valueField]);
+if(opts.selectOnNavigation){
+_b52(_b4e,row[opts.valueField]);
+}
+}
+}
+};
+function _b52(_b53,_b54,_b55){
+var opts=$.data(_b53,"combobox").options;
+var _b56=$(_b53).combo("getValues");
+if($.inArray(_b54+"",_b56)==-1){
+if(opts.multiple){
+_b56.push(_b54);
+}else{
+_b56=[_b54];
+}
+_b57(_b53,_b56,_b55);
+}
+};
+function _b58(_b59,_b5a){
+var opts=$.data(_b59,"combobox").options;
+var _b5b=$(_b59).combo("getValues");
+var _b5c=$.inArray(_b5a+"",_b5b);
+if(_b5c>=0){
+_b5b.splice(_b5c,1);
+_b57(_b59,_b5b);
+}
+};
+function _b57(_b5d,_b5e,_b5f){
+var opts=$.data(_b5d,"combobox").options;
+var _b60=$(_b5d).combo("panel");
+if(!$.isArray(_b5e)){
+_b5e=_b5e.split(opts.separator);
+}
+if(!opts.multiple){
+_b5e=_b5e.length?[_b5e[0]]:[""];
+}
+var _b61=$(_b5d).combo("getValues");
+if(_b60.is(":visible")){
+_b60.find(".combobox-item-selected").each(function(){
+var row=opts.finder.getRow(_b5d,$(this));
+if(row){
+if($.easyui.indexOfArray(_b61,row[opts.valueField])==-1){
+$(this).removeClass("combobox-item-selected");
+}
+}
+});
+}
+$.map(_b61,function(v){
+if($.easyui.indexOfArray(_b5e,v)==-1){
+var el=opts.finder.getEl(_b5d,v);
+if(el.hasClass("combobox-item-selected")){
+el.removeClass("combobox-item-selected");
+opts.onUnselect.call(_b5d,opts.finder.getRow(_b5d,v));
+}
+}
+});
+var _b62=null;
+var vv=[],ss=[];
+for(var i=0;i<_b5e.length;i++){
+var v=_b5e[i];
+var s=v;
+var row=opts.finder.getRow(_b5d,v);
+if(row){
+s=row[opts.textField];
+_b62=row;
+var el=opts.finder.getEl(_b5d,v);
+if(!el.hasClass("combobox-item-selected")){
+el.addClass("combobox-item-selected");
+opts.onSelect.call(_b5d,row);
+}
+}else{
+s=_b63(v,opts.mappingRows)||v;
+}
+vv.push(v);
+ss.push(s);
+}
+if(!_b5f){
+$(_b5d).combo("setText",ss.join(opts.separator));
+}
+if(opts.showItemIcon){
+var tb=$(_b5d).combobox("textbox");
+tb.removeClass("textbox-bgicon "+opts.textboxIconCls);
+if(_b62&&_b62.iconCls){
+tb.addClass("textbox-bgicon "+_b62.iconCls);
+opts.textboxIconCls=_b62.iconCls;
+}
+}
+$(_b5d).combo("setValues",vv);
+_b60.triggerHandler("scroll");
+function _b63(_b64,a){
+var item=$.easyui.getArrayItem(a,opts.valueField,_b64);
+return item?item[opts.textField]:undefined;
+};
+};
+function _b65(_b66,data,_b67){
+var _b68=$.data(_b66,"combobox");
+var opts=_b68.options;
+_b68.data=opts.loadFilter.call(_b66,data);
+opts.view.render.call(opts.view,_b66,$(_b66).combo("panel"),_b68.data);
+var vv=$(_b66).combobox("getValues");
+$.easyui.forEach(_b68.data,false,function(row){
+if(row["selected"]){
+$.easyui.addArrayItem(vv,row[opts.valueField]+"");
+}
+});
+if(opts.multiple){
+_b57(_b66,vv,_b67);
+}else{
+_b57(_b66,vv.length?[vv[vv.length-1]]:[],_b67);
+}
+opts.onLoadSuccess.call(_b66,data);
+};
+function _b69(_b6a,url,_b6b,_b6c){
+var opts=$.data(_b6a,"combobox").options;
+if(url){
+opts.url=url;
+}
+_b6b=$.extend({},opts.queryParams,_b6b||{});
+if(opts.onBeforeLoad.call(_b6a,_b6b)==false){
+return;
+}
+opts.loader.call(_b6a,_b6b,function(data){
+_b65(_b6a,data,_b6c);
+},function(){
+opts.onLoadError.apply(this,arguments);
+});
+};
+function _b6d(_b6e,q){
+var _b6f=$.data(_b6e,"combobox");
+var opts=_b6f.options;
+var _b70=$();
+var qq=opts.multiple?q.split(opts.separator):[q];
+if(opts.mode=="remote"){
+_b71(qq);
+_b69(_b6e,null,{q:q},true);
+}else{
+var _b72=$(_b6e).combo("panel");
+_b72.find(".combobox-item-hover").removeClass("combobox-item-hover");
+_b72.find(".combobox-item,.combobox-group").hide();
+var data=_b6f.data;
+var vv=[];
+$.map(qq,function(q){
+q=$.trim(q);
+var _b73=q;
+var _b74=undefined;
+_b70=$();
+for(var i=0;i<data.length;i++){
+var row=data[i];
+if(opts.filter.call(_b6e,q,row)){
+var v=row[opts.valueField];
+var s=row[opts.textField];
+var g=row[opts.groupField];
+var item=opts.finder.getEl(_b6e,v).show();
+if(s.toLowerCase()==q.toLowerCase()){
+_b73=v;
+if(opts.reversed){
+_b70=item;
+}else{
+_b52(_b6e,v,true);
+}
+}
+if(opts.groupField&&_b74!=g){
+opts.finder.getGroupEl(_b6e,g).show();
+_b74=g;
+}
+}
+}
+vv.push(_b73);
+});
+_b71(vv);
+}
+function _b71(vv){
+if(opts.reversed){
+_b70.addClass("combobox-item-hover");
+}else{
+_b57(_b6e,opts.multiple?(q?vv:[]):vv,true);
+}
+};
+};
+function _b75(_b76){
+var t=$(_b76);
+var opts=t.combobox("options");
+var _b77=t.combobox("panel");
+var item=_b77.children("div.combobox-item-hover");
+if(item.length){
+item.removeClass("combobox-item-hover");
+var row=opts.finder.getRow(_b76,item);
+var _b78=row[opts.valueField];
+if(opts.multiple){
+if(item.hasClass("combobox-item-selected")){
+t.combobox("unselect",_b78);
+}else{
+t.combobox("select",_b78);
+}
+}else{
+t.combobox("select",_b78);
+}
+}
+var vv=[];
+$.map(t.combobox("getValues"),function(v){
+if(_b46(_b76,v)>=0){
+vv.push(v);
+}
+});
+t.combobox("setValues",vv);
+if(!opts.multiple){
+t.combobox("hidePanel");
+}
+};
+function _b79(_b7a){
+var _b7b=$.data(_b7a,"combobox");
+var opts=_b7b.options;
+$(_b7a).addClass("combobox-f");
+$(_b7a).combo($.extend({},opts,{onShowPanel:function(){
+$(this).combo("panel").find("div.combobox-item:hidden,div.combobox-group:hidden").show();
+_b57(this,$(this).combobox("getValues"),true);
+$(this).combobox("scrollTo",$(this).combobox("getValue"));
+opts.onShowPanel.call(this);
+}}));
+};
+function _b7c(e){
+$(this).children("div.combobox-item-hover").removeClass("combobox-item-hover");
+var item=$(e.target).closest("div.combobox-item");
+if(!item.hasClass("combobox-item-disabled")){
+item.addClass("combobox-item-hover");
+}
+e.stopPropagation();
+};
+function _b7d(e){
+$(e.target).closest("div.combobox-item").removeClass("combobox-item-hover");
+e.stopPropagation();
+};
+function _b7e(e){
+var _b7f=$(this).panel("options").comboTarget;
+if(!_b7f){
+return;
+}
+var opts=$(_b7f).combobox("options");
+var item=$(e.target).closest("div.combobox-item");
+if(!item.length||item.hasClass("combobox-item-disabled")){
+return;
+}
+var row=opts.finder.getRow(_b7f,item);
+if(!row){
+return;
+}
+if(opts.blurTimer){
+clearTimeout(opts.blurTimer);
+opts.blurTimer=null;
+}
+opts.onClick.call(_b7f,row);
+var _b80=row[opts.valueField];
+if(opts.multiple){
+if(item.hasClass("combobox-item-selected")){
+_b58(_b7f,_b80);
+}else{
+_b52(_b7f,_b80);
+}
+}else{
+$(_b7f).combobox("setValue",_b80).combobox("hidePanel");
+}
+e.stopPropagation();
+};
+function _b81(e){
+var _b82=$(this).panel("options").comboTarget;
+if(!_b82){
+return;
+}
+var opts=$(_b82).combobox("options");
+if(opts.groupPosition=="sticky"){
+var _b83=$(this).children(".combobox-stick");
+if(!_b83.length){
+_b83=$("<div class=\"combobox-stick\"></div>").appendTo(this);
+}
+_b83.hide();
+var _b84=$(_b82).data("combobox");
+$(this).children(".combobox-group:visible").each(function(){
+var g=$(this);
+var _b85=opts.finder.getGroup(_b82,g);
+var _b86=_b84.data[_b85.startIndex+_b85.count-1];
+var last=opts.finder.getEl(_b82,_b86[opts.valueField]);
+if(g.position().top<0&&last.position().top>0){
+_b83.show().html(g.html());
+return false;
+}
+});
+}
+};
+$.fn.combobox=function(_b87,_b88){
+if(typeof _b87=="string"){
+var _b89=$.fn.combobox.methods[_b87];
+if(_b89){
+return _b89(this,_b88);
+}else{
+return this.combo(_b87,_b88);
+}
+}
+_b87=_b87||{};
+return this.each(function(){
+var _b8a=$.data(this,"combobox");
+if(_b8a){
+$.extend(_b8a.options,_b87);
+}else{
+_b8a=$.data(this,"combobox",{options:$.extend({},$.fn.combobox.defaults,$.fn.combobox.parseOptions(this),_b87),data:[]});
+}
+_b79(this);
+if(_b8a.options.data){
+_b65(this,_b8a.options.data);
+}else{
+var data=$.fn.combobox.parseData(this);
+if(data.length){
+_b65(this,data);
+}
+}
+_b69(this);
+});
+};
+$.fn.combobox.methods={options:function(jq){
+var _b8b=jq.combo("options");
+return $.extend($.data(jq[0],"combobox").options,{width:_b8b.width,height:_b8b.height,originalValue:_b8b.originalValue,disabled:_b8b.disabled,readonly:_b8b.readonly});
+},cloneFrom:function(jq,from){
+return jq.each(function(){
+$(this).combo("cloneFrom",from);
+$.data(this,"combobox",$(from).data("combobox"));
+$(this).addClass("combobox-f").attr("comboboxName",$(this).attr("textboxName"));
+});
+},getData:function(jq){
+return $.data(jq[0],"combobox").data;
+},setValues:function(jq,_b8c){
+return jq.each(function(){
+var opts=$(this).combobox("options");
+if($.isArray(_b8c)){
+_b8c=$.map(_b8c,function(_b8d){
+if(_b8d&&typeof _b8d=="object"){
+$.easyui.addArrayItem(opts.mappingRows,opts.valueField,_b8d);
+return _b8d[opts.valueField];
+}else{
+return _b8d;
+}
+});
+}
+_b57(this,_b8c);
+});
+},setValue:function(jq,_b8e){
+return jq.each(function(){
+$(this).combobox("setValues",$.isArray(_b8e)?_b8e:[_b8e]);
+});
+},clear:function(jq){
+return jq.each(function(){
+_b57(this,[]);
+});
+},reset:function(jq){
+return jq.each(function(){
+var opts=$(this).combobox("options");
+if(opts.multiple){
+$(this).combobox("setValues",opts.originalValue);
+}else{
+$(this).combobox("setValue",opts.originalValue);
+}
+});
+},loadData:function(jq,data){
+return jq.each(function(){
+_b65(this,data);
+});
+},reload:function(jq,url){
+return jq.each(function(){
+if(typeof url=="string"){
+_b69(this,url);
+}else{
+if(url){
+var opts=$(this).combobox("options");
+opts.queryParams=url;
+}
+_b69(this);
+}
+});
+},select:function(jq,_b8f){
+return jq.each(function(){
+_b52(this,_b8f);
+});
+},unselect:function(jq,_b90){
+return jq.each(function(){
+_b58(this,_b90);
+});
+},scrollTo:function(jq,_b91){
+return jq.each(function(){
+_b4a(this,_b91);
+});
+}};
+$.fn.combobox.parseOptions=function(_b92){
+var t=$(_b92);
+return $.extend({},$.fn.combo.parseOptions(_b92),$.parser.parseOptions(_b92,["valueField","textField","groupField","groupPosition","mode","method","url",{showItemIcon:"boolean",limitToList:"boolean"}]));
+};
+$.fn.combobox.parseData=function(_b93){
+var data=[];
+var opts=$(_b93).combobox("options");
+$(_b93).children().each(function(){
+if(this.tagName.toLowerCase()=="optgroup"){
+var _b94=$(this).attr("label");
+$(this).children().each(function(){
+_b95(this,_b94);
+});
+}else{
+_b95(this);
+}
+});
+return data;
+function _b95(el,_b96){
+var t=$(el);
+var row={};
+row[opts.valueField]=t.attr("value")!=undefined?t.attr("value"):t.text();
+row[opts.textField]=t.text();
+row["iconCls"]=$.parser.parseOptions(el,["iconCls"]).iconCls;
+row["selected"]=t.is(":selected");
+row["disabled"]=t.is(":disabled");
+if(_b96){
+opts.groupField=opts.groupField||"group";
+row[opts.groupField]=_b96;
+}
+data.push(row);
+};
+};
+var _b97=0;
+var _b98={render:function(_b99,_b9a,data){
+var _b9b=$.data(_b99,"combobox");
+var opts=_b9b.options;
+var _b9c=$(_b99).attr("id")||"";
+_b97++;
+_b9b.itemIdPrefix=_b9c+"_easyui_combobox_i"+_b97;
+_b9b.groupIdPrefix=_b9c+"_easyui_combobox_g"+_b97;
+_b9b.groups=[];
+var dd=[];
+var _b9d=undefined;
+for(var i=0;i<data.length;i++){
+var row=data[i];
+var v=row[opts.valueField]+"";
+var s=row[opts.textField];
+var g=row[opts.groupField];
+if(g){
+if(_b9d!=g){
+_b9d=g;
+_b9b.groups.push({value:g,startIndex:i,count:1});
+dd.push("<div id=\""+(_b9b.groupIdPrefix+"_"+(_b9b.groups.length-1))+"\" class=\"combobox-group\">");
+dd.push(opts.groupFormatter?opts.groupFormatter.call(_b99,g):g);
+dd.push("</div>");
+}else{
+_b9b.groups[_b9b.groups.length-1].count++;
+}
+}else{
+_b9d=undefined;
+}
+var cls="combobox-item"+(row.disabled?" combobox-item-disabled":"")+(g?" combobox-gitem":"");
+dd.push("<div id=\""+(_b9b.itemIdPrefix+"_"+i)+"\" class=\""+cls+"\">");
+if(opts.showItemIcon&&row.iconCls){
+dd.push("<span class=\"combobox-icon "+row.iconCls+"\"></span>");
+}
+dd.push(opts.formatter?opts.formatter.call(_b99,row):s);
+dd.push("</div>");
+}
+$(_b9a).html(dd.join(""));
+}};
+$.fn.combobox.defaults=$.extend({},$.fn.combo.defaults,{valueField:"value",textField:"text",groupPosition:"static",groupField:null,groupFormatter:function(_b9e){
+return _b9e;
+},mode:"local",method:"post",url:null,data:null,queryParams:{},showItemIcon:false,limitToList:false,unselectedValues:[],mappingRows:[],view:_b98,keyHandler:{up:function(e){
+nav(this,"prev");
+e.preventDefault();
+},down:function(e){
+nav(this,"next");
+e.preventDefault();
+},left:function(e){
+},right:function(e){
+},enter:function(e){
+_b75(this);
+},query:function(q,e){
+_b6d(this,q);
+}},inputEvents:$.extend({},$.fn.combo.defaults.inputEvents,{blur:function(e){
+$.fn.combo.defaults.inputEvents.blur(e);
+var _b9f=e.data.target;
+var opts=$(_b9f).combobox("options");
+if(opts.reversed||opts.limitToList){
+if(opts.blurTimer){
+clearTimeout(opts.blurTimer);
+}
+opts.blurTimer=setTimeout(function(){
+var _ba0=$(_b9f).parent().length;
+if(_ba0){
+if(opts.reversed){
+$(_b9f).combobox("setValues",$(_b9f).combobox("getValues"));
+}else{
+if(opts.limitToList){
+var vv=[];
+$.map($(_b9f).combobox("getValues"),function(v){
+var _ba1=$.easyui.indexOfArray($(_b9f).combobox("getData"),opts.valueField,v);
+if(_ba1>=0){
+vv.push(v);
+}
+});
+$(_b9f).combobox("setValues",vv);
+}
+}
+opts.blurTimer=null;
+}
+},50);
+}
+}}),panelEvents:{mouseover:_b7c,mouseout:_b7d,mousedown:function(e){
+e.preventDefault();
+e.stopPropagation();
+},click:_b7e,scroll:_b81},filter:function(q,row){
+var opts=$(this).combobox("options");
+return row[opts.textField].toLowerCase().indexOf(q.toLowerCase())>=0;
+},formatter:function(row){
+var opts=$(this).combobox("options");
+return row[opts.textField];
+},loader:function(_ba2,_ba3,_ba4){
+var opts=$(this).combobox("options");
+if(!opts.url){
+return false;
+}
+$.ajax({type:opts.method,url:opts.url,data:_ba2,dataType:"json",success:function(data){
+_ba3(data);
+},error:function(){
+_ba4.apply(this,arguments);
+}});
+},loadFilter:function(data){
+return data;
+},finder:{getEl:function(_ba5,_ba6){
+var _ba7=_b46(_ba5,_ba6);
+var id=$.data(_ba5,"combobox").itemIdPrefix+"_"+_ba7;
+return $("#"+id);
+},getGroupEl:function(_ba8,_ba9){
+var _baa=$.data(_ba8,"combobox");
+var _bab=$.easyui.indexOfArray(_baa.groups,"value",_ba9);
+var id=_baa.groupIdPrefix+"_"+_bab;
+return $("#"+id);
+},getGroup:function(_bac,p){
+var _bad=$.data(_bac,"combobox");
+var _bae=p.attr("id").substr(_bad.groupIdPrefix.length+1);
+return _bad.groups[parseInt(_bae)];
+},getRow:function(_baf,p){
+var _bb0=$.data(_baf,"combobox");
+var _bb1=(p instanceof $)?p.attr("id").substr(_bb0.itemIdPrefix.length+1):_b46(_baf,p);
+return _bb0.data[parseInt(_bb1)];
+}},onBeforeLoad:function(_bb2){
+},onLoadSuccess:function(data){
+},onLoadError:function(){
+},onSelect:function(_bb3){
+},onUnselect:function(_bb4){
+},onClick:function(_bb5){
+}});
+})(jQuery);
+(function($){
+function _bb6(_bb7){
+var _bb8=$.data(_bb7,"combotree");
+var opts=_bb8.options;
+var tree=_bb8.tree;
+$(_bb7).addClass("combotree-f");
+$(_bb7).combo($.extend({},opts,{onShowPanel:function(){
+if(opts.editable){
+tree.tree("doFilter","");
+}
+opts.onShowPanel.call(this);
+}}));
+var _bb9=$(_bb7).combo("panel");
+if(!tree){
+tree=$("<ul></ul>").appendTo(_bb9);
+_bb8.tree=tree;
+}
+tree.tree($.extend({},opts,{checkbox:opts.multiple,onLoadSuccess:function(node,data){
+var _bba=$(_bb7).combotree("getValues");
+if(opts.multiple){
+$.map(tree.tree("getChecked"),function(node){
+$.easyui.addArrayItem(_bba,node.id);
+});
+}
+_bbf(_bb7,_bba,_bb8.remainText);
+opts.onLoadSuccess.call(this,node,data);
+},onClick:function(node){
+if(opts.multiple){
+$(this).tree(node.checked?"uncheck":"check",node.target);
+}else{
+$(_bb7).combo("hidePanel");
+}
+_bb8.remainText=false;
+_bbc(_bb7);
+opts.onClick.call(this,node);
+},onCheck:function(node,_bbb){
+_bb8.remainText=false;
+_bbc(_bb7);
+opts.onCheck.call(this,node,_bbb);
+}}));
+};
+function _bbc(_bbd){
+var _bbe=$.data(_bbd,"combotree");
+var opts=_bbe.options;
+var tree=_bbe.tree;
+var vv=[];
+if(opts.multiple){
+vv=$.map(tree.tree("getChecked"),function(node){
+return node.id;
+});
+}else{
+var node=tree.tree("getSelected");
+if(node){
+vv.push(node.id);
+}
+}
+vv=vv.concat(opts.unselectedValues);
+_bbf(_bbd,vv,_bbe.remainText);
+};
+function _bbf(_bc0,_bc1,_bc2){
+var _bc3=$.data(_bc0,"combotree");
+var opts=_bc3.options;
+var tree=_bc3.tree;
+var _bc4=tree.tree("options");
+var _bc5=_bc4.onBeforeCheck;
+var _bc6=_bc4.onCheck;
+var _bc7=_bc4.onBeforeSelect;
+var _bc8=_bc4.onSelect;
+_bc4.onBeforeCheck=_bc4.onCheck=_bc4.onBeforeSelect=_bc4.onSelect=function(){
+};
+if(!$.isArray(_bc1)){
+_bc1=_bc1.split(opts.separator);
+}
+if(!opts.multiple){
+_bc1=_bc1.length?[_bc1[0]]:[""];
+}
+var vv=$.map(_bc1,function(_bc9){
+return String(_bc9);
+});
+tree.find("div.tree-node-selected").removeClass("tree-node-selected");
+$.map(tree.tree("getChecked"),function(node){
+if($.inArray(String(node.id),vv)==-1){
+tree.tree("uncheck",node.target);
+}
+});
+var ss=[];
+opts.unselectedValues=[];
+$.map(vv,function(v){
+var node=tree.tree("find",v);
+if(node){
+tree.tree("check",node.target).tree("select",node.target);
+ss.push(_bca(node));
+}else{
+ss.push(_bcb(v,opts.mappingRows)||v);
+opts.unselectedValues.push(v);
+}
+});
+if(opts.multiple){
+$.map(tree.tree("getChecked"),function(node){
+var id=String(node.id);
+if($.inArray(id,vv)==-1){
+vv.push(id);
+ss.push(_bca(node));
+}
+});
+}
+_bc4.onBeforeCheck=_bc5;
+_bc4.onCheck=_bc6;
+_bc4.onBeforeSelect=_bc7;
+_bc4.onSelect=_bc8;
+if(!_bc2){
+var s=ss.join(opts.separator);
+if($(_bc0).combo("getText")!=s){
+$(_bc0).combo("setText",s);
+}
+}
+$(_bc0).combo("setValues",vv);
+function _bcb(_bcc,a){
+var item=$.easyui.getArrayItem(a,"id",_bcc);
+return item?_bca(item):undefined;
+};
+function _bca(node){
+return node[opts.textField||""]||node.text;
+};
+};
+function _bcd(_bce,q){
+var _bcf=$.data(_bce,"combotree");
+var opts=_bcf.options;
+var tree=_bcf.tree;
+_bcf.remainText=true;
+tree.tree("doFilter",opts.multiple?q.split(opts.separator):q);
+};
+function _bd0(_bd1){
+var _bd2=$.data(_bd1,"combotree");
+_bd2.remainText=false;
+$(_bd1).combotree("setValues",$(_bd1).combotree("getValues"));
+$(_bd1).combotree("hidePanel");
+};
+$.fn.combotree=function(_bd3,_bd4){
+if(typeof _bd3=="string"){
+var _bd5=$.fn.combotree.methods[_bd3];
+if(_bd5){
+return _bd5(this,_bd4);
+}else{
+return this.combo(_bd3,_bd4);
+}
+}
+_bd3=_bd3||{};
+return this.each(function(){
+var _bd6=$.data(this,"combotree");
+if(_bd6){
+$.extend(_bd6.options,_bd3);
+}else{
+$.data(this,"combotree",{options:$.extend({},$.fn.combotree.defaults,$.fn.combotree.parseOptions(this),_bd3)});
+}
+_bb6(this);
+});
+};
+$.fn.combotree.methods={options:function(jq){
+var _bd7=jq.combo("options");
+return $.extend($.data(jq[0],"combotree").options,{width:_bd7.width,height:_bd7.height,originalValue:_bd7.originalValue,disabled:_bd7.disabled,readonly:_bd7.readonly});
+},clone:function(jq,_bd8){
+var t=jq.combo("clone",_bd8);
+t.data("combotree",{options:$.extend(true,{},jq.combotree("options")),tree:jq.combotree("tree")});
+return t;
+},tree:function(jq){
+return $.data(jq[0],"combotree").tree;
+},loadData:function(jq,data){
+return jq.each(function(){
+var opts=$.data(this,"combotree").options;
+opts.data=data;
+var tree=$.data(this,"combotree").tree;
+tree.tree("loadData",data);
+});
+},reload:function(jq,url){
+return jq.each(function(){
+var opts=$.data(this,"combotree").options;
+var tree=$.data(this,"combotree").tree;
+if(url){
+opts.url=url;
+}
+tree.tree({url:opts.url});
+});
+},setValues:function(jq,_bd9){
+return jq.each(function(){
+var opts=$(this).combotree("options");
+if($.isArray(_bd9)){
+_bd9=$.map(_bd9,function(_bda){
+if(_bda&&typeof _bda=="object"){
+$.easyui.addArrayItem(opts.mappingRows,"id",_bda);
+return _bda.id;
+}else{
+return _bda;
+}
+});
+}
+_bbf(this,_bd9);
+});
+},setValue:function(jq,_bdb){
+return jq.each(function(){
+$(this).combotree("setValues",$.isArray(_bdb)?_bdb:[_bdb]);
+});
+},clear:function(jq){
+return jq.each(function(){
+$(this).combotree("setValues",[]);
+});
+},reset:function(jq){
+return jq.each(function(){
+var opts=$(this).combotree("options");
+if(opts.multiple){
+$(this).combotree("setValues",opts.originalValue);
+}else{
+$(this).combotree("setValue",opts.originalValue);
+}
+});
+}};
+$.fn.combotree.parseOptions=function(_bdc){
+return $.extend({},$.fn.combo.parseOptions(_bdc),$.fn.tree.parseOptions(_bdc));
+};
+$.fn.combotree.defaults=$.extend({},$.fn.combo.defaults,$.fn.tree.defaults,{editable:false,textField:null,unselectedValues:[],mappingRows:[],keyHandler:{up:function(e){
+},down:function(e){
+},left:function(e){
+},right:function(e){
+},enter:function(e){
+_bd0(this);
+},query:function(q,e){
+_bcd(this,q);
+}}});
+})(jQuery);
+(function($){
+function _bdd(_bde){
+var _bdf=$.data(_bde,"combogrid");
+var opts=_bdf.options;
+var grid=_bdf.grid;
+$(_bde).addClass("combogrid-f").combo($.extend({},opts,{onShowPanel:function(){
+_bf6(this,$(this).combogrid("getValues"),true);
+var p=$(this).combogrid("panel");
+var _be0=p.outerHeight()-p.height();
+var _be1=p._size("minHeight");
+var _be2=p._size("maxHeight");
+var dg=$(this).combogrid("grid");
+dg.datagrid("resize",{width:"100%",height:(isNaN(parseInt(opts.panelHeight))?"auto":"100%"),minHeight:(_be1?_be1-_be0:""),maxHeight:(_be2?_be2-_be0:"")});
+var row=dg.datagrid("getSelected");
+if(row){
+dg.datagrid("scrollTo",dg.datagrid("getRowIndex",row));
+}
+opts.onShowPanel.call(this);
+}}));
+var _be3=$(_bde).combo("panel");
+if(!grid){
+grid=$("<table></table>").appendTo(_be3);
+_bdf.grid=grid;
+}
+grid.datagrid($.extend({},opts,{border:false,singleSelect:(!opts.multiple),onLoadSuccess:_be4,onClickRow:_be5,onSelect:_be6("onSelect"),onUnselect:_be6("onUnselect"),onSelectAll:_be6("onSelectAll"),onUnselectAll:_be6("onUnselectAll")}));
+function _be7(dg){
+return $(dg).closest(".combo-panel").panel("options").comboTarget||_bde;
+};
+function _be4(data){
+var _be8=_be7(this);
+var _be9=$(_be8).data("combogrid");
+var opts=_be9.options;
+var _bea=$(_be8).combo("getValues");
+_bf6(_be8,_bea,_be9.remainText);
+opts.onLoadSuccess.call(this,data);
+};
+function _be5(_beb,row){
+var _bec=_be7(this);
+var _bed=$(_bec).data("combogrid");
+var opts=_bed.options;
+_bed.remainText=false;
+_bee.call(this);
+if(!opts.multiple){
+$(_bec).combo("hidePanel");
+}
+opts.onClickRow.call(this,_beb,row);
+};
+function _be6(_bef){
+return function(_bf0,row){
+var _bf1=_be7(this);
+var opts=$(_bf1).combogrid("options");
+if(_bef=="onUnselectAll"){
+if(opts.multiple){
+_bee.call(this);
+}
+}else{
+_bee.call(this);
+}
+opts[_bef].call(this,_bf0,row);
+};
+};
+function _bee(){
+var dg=$(this);
+var _bf2=_be7(dg);
+var _bf3=$(_bf2).data("combogrid");
+var opts=_bf3.options;
+var vv=$.map(dg.datagrid("getSelections"),function(row){
+return row[opts.idField];
+});
+vv=vv.concat(opts.unselectedValues);
+var _bf4=dg.data("datagrid").dc.body2;
+var _bf5=_bf4.scrollTop();
+_bf6(_bf2,vv,_bf3.remainText);
+_bf4.scrollTop(_bf5);
+};
+};
+function nav(_bf7,dir){
+var _bf8=$.data(_bf7,"combogrid");
+var opts=_bf8.options;
+var grid=_bf8.grid;
+var _bf9=grid.datagrid("getRows").length;
+if(!_bf9){
+return;
+}
+var tr=opts.finder.getTr(grid[0],null,"highlight");
+if(!tr.length){
+tr=opts.finder.getTr(grid[0],null,"selected");
+}
+var _bfa;
+if(!tr.length){
+_bfa=(dir=="next"?0:_bf9-1);
+}else{
+var _bfa=parseInt(tr.attr("datagrid-row-index"));
+_bfa+=(dir=="next"?1:-1);
+if(_bfa<0){
+_bfa=_bf9-1;
+}
+if(_bfa>=_bf9){
+_bfa=0;
+}
+}
+grid.datagrid("highlightRow",_bfa);
+if(opts.selectOnNavigation){
+_bf8.remainText=false;
+grid.datagrid("selectRow",_bfa);
+}
+};
+function _bf6(_bfb,_bfc,_bfd){
+var _bfe=$.data(_bfb,"combogrid");
+var opts=_bfe.options;
+var grid=_bfe.grid;
+var _bff=$(_bfb).combo("getValues");
+var _c00=$(_bfb).combo("options");
+var _c01=_c00.onChange;
+_c00.onChange=function(){
+};
+var _c02=grid.datagrid("options");
+var _c03=_c02.onSelect;
+var _c04=_c02.onUnselectAll;
+_c02.onSelect=_c02.onUnselectAll=function(){
+};
+if(!$.isArray(_bfc)){
+_bfc=_bfc.split(opts.separator);
+}
+if(!opts.multiple){
+_bfc=_bfc.length?[_bfc[0]]:[""];
+}
+var vv=$.map(_bfc,function(_c05){
+return String(_c05);
+});
+vv=$.grep(vv,function(v,_c06){
+return _c06===$.inArray(v,vv);
+});
+var _c07=$.grep(grid.datagrid("getSelections"),function(row,_c08){
+return $.inArray(String(row[opts.idField]),vv)>=0;
+});
+grid.datagrid("clearSelections");
+grid.data("datagrid").selectedRows=_c07;
+var ss=[];
+opts.unselectedValues=[];
+$.map(vv,function(v){
+var _c09=grid.datagrid("getRowIndex",v);
+if(_c09>=0){
+grid.datagrid("selectRow",_c09);
+}else{
+if($.easyui.indexOfArray(_c07,opts.idField,v)==-1){
+opts.unselectedValues.push(v);
+}
+}
+ss.push(_c0a(v,grid.datagrid("getRows"))||_c0a(v,_c07)||_c0a(v,opts.mappingRows)||v);
+});
+$(_bfb).combo("setValues",_bff);
+_c00.onChange=_c01;
+_c02.onSelect=_c03;
+_c02.onUnselectAll=_c04;
+if(!_bfd){
+var s=ss.join(opts.separator);
+if($(_bfb).combo("getText")!=s){
+$(_bfb).combo("setText",s);
+}
+}
+$(_bfb).combo("setValues",_bfc);
+function _c0a(_c0b,a){
+var item=$.easyui.getArrayItem(a,opts.idField,_c0b);
+return item?item[opts.textField]:undefined;
+};
+};
+function _c0c(_c0d,q){
+var _c0e=$.data(_c0d,"combogrid");
+var opts=_c0e.options;
+var grid=_c0e.grid;
+_c0e.remainText=true;
+var qq=opts.multiple?q.split(opts.separator):[q];
+qq=$.grep(qq,function(q){
+return $.trim(q)!="";
+});
+if(opts.mode=="remote"){
+_c0f(qq);
+grid.datagrid("load",$.extend({},opts.queryParams,{q:q}));
+}else{
+grid.datagrid("highlightRow",-1);
+var rows=grid.datagrid("getRows");
+var vv=[];
+$.map(qq,function(q){
+q=$.trim(q);
+var _c10=q;
+_c11(opts.mappingRows,q);
+_c11(grid.datagrid("getSelections"),q);
+var _c12=_c11(rows,q);
+if(_c12>=0){
+if(opts.reversed){
+grid.datagrid("highlightRow",_c12);
+}
+}else{
+$.map(rows,function(row,i){
+if(opts.filter.call(_c0d,q,row)){
+grid.datagrid("highlightRow",i);
+}
+});
+}
+});
+_c0f(vv);
+}
+function _c11(rows,q){
+for(var i=0;i<rows.length;i++){
+var row=rows[i];
+if((row[opts.textField]||"").toLowerCase()==q.toLowerCase()){
+vv.push(row[opts.idField]);
+return i;
+}
+}
+return -1;
+};
+function _c0f(vv){
+if(!opts.reversed){
+_bf6(_c0d,vv,true);
+}
+};
+};
+function _c13(_c14){
+var _c15=$.data(_c14,"combogrid");
+var opts=_c15.options;
+var grid=_c15.grid;
+var tr=opts.finder.getTr(grid[0],null,"highlight");
+_c15.remainText=false;
+if(tr.length){
+var _c16=parseInt(tr.attr("datagrid-row-index"));
+if(opts.multiple){
+if(tr.hasClass("datagrid-row-selected")){
+grid.datagrid("unselectRow",_c16);
+}else{
+grid.datagrid("selectRow",_c16);
+}
+}else{
+grid.datagrid("selectRow",_c16);
+}
+}
+var vv=[];
+$.map(grid.datagrid("getSelections"),function(row){
+vv.push(row[opts.idField]);
+});
+$.map(opts.unselectedValues,function(v){
+if($.easyui.indexOfArray(opts.mappingRows,opts.idField,v)>=0){
+$.easyui.addArrayItem(vv,v);
+}
+});
+$(_c14).combogrid("setValues",vv);
+if(!opts.multiple){
+$(_c14).combogrid("hidePanel");
+}
+};
+$.fn.combogrid=function(_c17,_c18){
+if(typeof _c17=="string"){
+var _c19=$.fn.combogrid.methods[_c17];
+if(_c19){
+return _c19(this,_c18);
+}else{
+return this.combo(_c17,_c18);
+}
+}
+_c17=_c17||{};
+return this.each(function(){
+var _c1a=$.data(this,"combogrid");
+if(_c1a){
+$.extend(_c1a.options,_c17);
+}else{
+_c1a=$.data(this,"combogrid",{options:$.extend({},$.fn.combogrid.defaults,$.fn.combogrid.parseOptions(this),_c17)});
+}
+_bdd(this);
+});
+};
+$.fn.combogrid.methods={options:function(jq){
+var _c1b=jq.combo("options");
+return $.extend($.data(jq[0],"combogrid").options,{width:_c1b.width,height:_c1b.height,originalValue:_c1b.originalValue,disabled:_c1b.disabled,readonly:_c1b.readonly});
+},cloneFrom:function(jq,from){
+return jq.each(function(){
+$(this).combo("cloneFrom",from);
+$.data(this,"combogrid",{options:$.extend(true,{cloned:true},$(from).combogrid("options")),combo:$(this).next(),panel:$(from).combo("panel"),grid:$(from).combogrid("grid")});
+});
+},grid:function(jq){
+return $.data(jq[0],"combogrid").grid;
+},setValues:function(jq,_c1c){
+return jq.each(function(){
+var opts=$(this).combogrid("options");
+if($.isArray(_c1c)){
+_c1c=$.map(_c1c,function(_c1d){
+if(_c1d&&typeof _c1d=="object"){
+$.easyui.addArrayItem(opts.mappingRows,opts.idField,_c1d);
+return _c1d[opts.idField];
+}else{
+return _c1d;
+}
+});
+}
+_bf6(this,_c1c);
+});
+},setValue:function(jq,_c1e){
+return jq.each(function(){
+$(this).combogrid("setValues",$.isArray(_c1e)?_c1e:[_c1e]);
+});
+},clear:function(jq){
+return jq.each(function(){
+$(this).combogrid("setValues",[]);
+});
+},reset:function(jq){
+return jq.each(function(){
+var opts=$(this).combogrid("options");
+if(opts.multiple){
+$(this).combogrid("setValues",opts.originalValue);
+}else{
+$(this).combogrid("setValue",opts.originalValue);
+}
+});
+}};
+$.fn.combogrid.parseOptions=function(_c1f){
+var t=$(_c1f);
+return $.extend({},$.fn.combo.parseOptions(_c1f),$.fn.datagrid.parseOptions(_c1f),$.parser.parseOptions(_c1f,["idField","textField","mode"]));
+};
+$.fn.combogrid.defaults=$.extend({},$.fn.combo.defaults,$.fn.datagrid.defaults,{loadMsg:null,idField:null,textField:null,unselectedValues:[],mappingRows:[],mode:"local",keyHandler:{up:function(e){
+nav(this,"prev");
+e.preventDefault();
+},down:function(e){
+nav(this,"next");
+e.preventDefault();
+},left:function(e){
+},right:function(e){
+},enter:function(e){
+_c13(this);
+},query:function(q,e){
+_c0c(this,q);
+}},inputEvents:$.extend({},$.fn.combo.defaults.inputEvents,{blur:function(e){
+$.fn.combo.defaults.inputEvents.blur(e);
+var _c20=e.data.target;
+var opts=$(_c20).combogrid("options");
+if(opts.reversed){
+$(_c20).combogrid("setValues",$(_c20).combogrid("getValues"));
+}
+}}),panelEvents:{mousedown:function(e){
+}},filter:function(q,row){
+var opts=$(this).combogrid("options");
+return (row[opts.textField]||"").toLowerCase().indexOf(q.toLowerCase())>=0;
+}});
+})(jQuery);
+(function($){
+function _c21(_c22){
+var _c23=$.data(_c22,"combotreegrid");
+var opts=_c23.options;
+$(_c22).addClass("combotreegrid-f").combo($.extend({},opts,{onShowPanel:function(){
+var p=$(this).combotreegrid("panel");
+var _c24=p.outerHeight()-p.height();
+var _c25=p._size("minHeight");
+var _c26=p._size("maxHeight");
+var dg=$(this).combotreegrid("grid");
+dg.treegrid("resize",{width:"100%",height:(isNaN(parseInt(opts.panelHeight))?"auto":"100%"),minHeight:(_c25?_c25-_c24:""),maxHeight:(_c26?_c26-_c24:"")});
+var row=dg.treegrid("getSelected");
+if(row){
+dg.treegrid("scrollTo",row[opts.idField]);
+}
+opts.onShowPanel.call(this);
+}}));
+if(!_c23.grid){
+var _c27=$(_c22).combo("panel");
+_c23.grid=$("<table></table>").appendTo(_c27);
+}
+_c23.grid.treegrid($.extend({},opts,{border:false,checkbox:opts.multiple,onLoadSuccess:function(row,data){
+var _c28=$(_c22).combotreegrid("getValues");
+if(opts.multiple){
+$.map($(this).treegrid("getCheckedNodes"),function(row){
+$.easyui.addArrayItem(_c28,row[opts.idField]);
+});
+}
+_c2d(_c22,_c28);
+opts.onLoadSuccess.call(this,row,data);
+_c23.remainText=false;
+},onClickRow:function(row){
+if(opts.multiple){
+$(this).treegrid(row.checked?"uncheckNode":"checkNode",row[opts.idField]);
+$(this).treegrid("unselect",row[opts.idField]);
+}else{
+$(_c22).combo("hidePanel");
+}
+_c2a(_c22);
+opts.onClickRow.call(this,row);
+},onCheckNode:function(row,_c29){
+_c2a(_c22);
+opts.onCheckNode.call(this,row,_c29);
+}}));
+};
+function _c2a(_c2b){
+var _c2c=$.data(_c2b,"combotreegrid");
+var opts=_c2c.options;
+var grid=_c2c.grid;
+var vv=[];
+if(opts.multiple){
+vv=$.map(grid.treegrid("getCheckedNodes"),function(row){
+return row[opts.idField];
+});
+}else{
+var row=grid.treegrid("getSelected");
+if(row){
+vv.push(row[opts.idField]);
+}
+}
+vv=vv.concat(opts.unselectedValues);
+_c2d(_c2b,vv);
+};
+function _c2d(_c2e,_c2f){
+var _c30=$.data(_c2e,"combotreegrid");
+var opts=_c30.options;
+var grid=_c30.grid;
+var _c31=grid.datagrid("options");
+var _c32=_c31.onBeforeCheck;
+var _c33=_c31.onCheck;
+var _c34=_c31.onBeforeSelect;
+var _c35=_c31.onSelect;
+_c31.onBeforeCheck=_c31.onCheck=_c31.onBeforeSelect=_c31.onSelect=function(){
+};
+if(!$.isArray(_c2f)){
+_c2f=_c2f.split(opts.separator);
+}
+if(!opts.multiple){
+_c2f=_c2f.length?[_c2f[0]]:[""];
+}
+var vv=$.map(_c2f,function(_c36){
+return String(_c36);
+});
+vv=$.grep(vv,function(v,_c37){
+return _c37===$.inArray(v,vv);
+});
+var _c38=grid.treegrid("getSelected");
+if(_c38){
+grid.treegrid("unselect",_c38[opts.idField]);
+}
+$.map(grid.treegrid("getCheckedNodes"),function(row){
+if($.inArray(String(row[opts.idField]),vv)==-1){
+grid.treegrid("uncheckNode",row[opts.idField]);
+}
+});
+var ss=[];
+opts.unselectedValues=[];
+$.map(vv,function(v){
+var row=grid.treegrid("find",v);
+if(row){
+if(opts.multiple){
+grid.treegrid("checkNode",v);
+}else{
+grid.treegrid("select",v);
+}
+ss.push(_c39(row));
+}else{
+ss.push(_c3a(v,opts.mappingRows)||v);
+opts.unselectedValues.push(v);
+}
+});
+if(opts.multiple){
+$.map(grid.treegrid("getCheckedNodes"),function(row){
+var id=String(row[opts.idField]);
+if($.inArray(id,vv)==-1){
+vv.push(id);
+ss.push(_c39(row));
+}
+});
+}
+_c31.onBeforeCheck=_c32;
+_c31.onCheck=_c33;
+_c31.onBeforeSelect=_c34;
+_c31.onSelect=_c35;
+if(!_c30.remainText){
+var s=ss.join(opts.separator);
+if($(_c2e).combo("getText")!=s){
+$(_c2e).combo("setText",s);
+}
+}
+$(_c2e).combo("setValues",vv);
+function _c3a(_c3b,a){
+var item=$.easyui.getArrayItem(a,opts.idField,_c3b);
+return item?_c39(item):undefined;
+};
+function _c39(row){
+return row[opts.textField||""]||row[opts.treeField];
+};
+};
+function _c3c(_c3d,q){
+var _c3e=$.data(_c3d,"combotreegrid");
+var opts=_c3e.options;
+var grid=_c3e.grid;
+_c3e.remainText=true;
+var qq=opts.multiple?q.split(opts.separator):[q];
+qq=$.grep(qq,function(q){
+return $.trim(q)!="";
+});
+grid.treegrid("clearSelections").treegrid("clearChecked").treegrid("highlightRow",-1);
+if(opts.mode=="remote"){
+_c3f(qq);
+grid.treegrid("load",$.extend({},opts.queryParams,{q:q}));
+}else{
+if(q){
+var data=grid.treegrid("getData");
+var vv=[];
+$.map(qq,function(q){
+q=$.trim(q);
+if(q){
+var v=undefined;
+$.easyui.forEach(data,true,function(row){
+if(q.toLowerCase()==String(row[opts.treeField]).toLowerCase()){
+v=row[opts.idField];
+return false;
+}else{
+if(opts.filter.call(_c3d,q,row)){
+grid.treegrid("expandTo",row[opts.idField]);
+grid.treegrid("highlightRow",row[opts.idField]);
+return false;
+}
+}
+});
+if(v==undefined){
+$.easyui.forEach(opts.mappingRows,false,function(row){
+if(q.toLowerCase()==String(row[opts.treeField])){
+v=row[opts.idField];
+return false;
+}
+});
+}
+if(v!=undefined){
+vv.push(v);
+}else{
+vv.push(q);
+}
+}
+});
+_c3f(vv);
+_c3e.remainText=false;
+}
+}
+function _c3f(vv){
+if(!opts.reversed){
+$(_c3d).combotreegrid("setValues",vv);
+}
+};
+};
+function _c40(_c41){
+var _c42=$.data(_c41,"combotreegrid");
+var opts=_c42.options;
+var grid=_c42.grid;
+var tr=opts.finder.getTr(grid[0],null,"highlight");
+_c42.remainText=false;
+if(tr.length){
+var id=tr.attr("node-id");
+if(opts.multiple){
+if(tr.hasClass("datagrid-row-selected")){
+grid.treegrid("uncheckNode",id);
+}else{
+grid.treegrid("checkNode",id);
+}
+}else{
+grid.treegrid("selectRow",id);
+}
+}
+var vv=[];
+if(opts.multiple){
+$.map(grid.treegrid("getCheckedNodes"),function(row){
+vv.push(row[opts.idField]);
+});
+}else{
+var row=grid.treegrid("getSelected");
+if(row){
+vv.push(row[opts.idField]);
+}
+}
+$.map(opts.unselectedValues,function(v){
+if($.easyui.indexOfArray(opts.mappingRows,opts.idField,v)>=0){
+$.easyui.addArrayItem(vv,v);
+}
+});
+$(_c41).combotreegrid("setValues",vv);
+if(!opts.multiple){
+$(_c41).combotreegrid("hidePanel");
+}
+};
+$.fn.combotreegrid=function(_c43,_c44){
+if(typeof _c43=="string"){
+var _c45=$.fn.combotreegrid.methods[_c43];
+if(_c45){
+return _c45(this,_c44);
+}else{
+return this.combo(_c43,_c44);
+}
+}
+_c43=_c43||{};
+return this.each(function(){
+var _c46=$.data(this,"combotreegrid");
+if(_c46){
+$.extend(_c46.options,_c43);
+}else{
+_c46=$.data(this,"combotreegrid",{options:$.extend({},$.fn.combotreegrid.defaults,$.fn.combotreegrid.parseOptions(this),_c43)});
+}
+_c21(this);
+});
+};
+$.fn.combotreegrid.methods={options:function(jq){
+var _c47=jq.combo("options");
+return $.extend($.data(jq[0],"combotreegrid").options,{width:_c47.width,height:_c47.height,originalValue:_c47.originalValue,disabled:_c47.disabled,readonly:_c47.readonly});
+},grid:function(jq){
+return $.data(jq[0],"combotreegrid").grid;
+},setValues:function(jq,_c48){
+return jq.each(function(){
+var opts=$(this).combotreegrid("options");
+if($.isArray(_c48)){
+_c48=$.map(_c48,function(_c49){
+if(_c49&&typeof _c49=="object"){
+$.easyui.addArrayItem(opts.mappingRows,opts.idField,_c49);
+return _c49[opts.idField];
+}else{
+return _c49;
+}
+});
+}
+_c2d(this,_c48);
+});
+},setValue:function(jq,_c4a){
+return jq.each(function(){
+$(this).combotreegrid("setValues",$.isArray(_c4a)?_c4a:[_c4a]);
+});
+},clear:function(jq){
+return jq.each(function(){
+$(this).combotreegrid("setValues",[]);
+});
+},reset:function(jq){
+return jq.each(function(){
+var opts=$(this).combotreegrid("options");
+if(opts.multiple){
+$(this).combotreegrid("setValues",opts.originalValue);
+}else{
+$(this).combotreegrid("setValue",opts.originalValue);
+}
+});
+}};
+$.fn.combotreegrid.parseOptions=function(_c4b){
+var t=$(_c4b);
+return $.extend({},$.fn.combo.parseOptions(_c4b),$.fn.treegrid.parseOptions(_c4b),$.parser.parseOptions(_c4b,["mode",{limitToGrid:"boolean"}]));
+};
+$.fn.combotreegrid.defaults=$.extend({},$.fn.combo.defaults,$.fn.treegrid.defaults,{editable:false,singleSelect:true,limitToGrid:false,unselectedValues:[],mappingRows:[],mode:"local",textField:null,keyHandler:{up:function(e){
+},down:function(e){
+},left:function(e){
+},right:function(e){
+},enter:function(e){
+_c40(this);
+},query:function(q,e){
+_c3c(this,q);
+}},inputEvents:$.extend({},$.fn.combo.defaults.inputEvents,{blur:function(e){
+$.fn.combo.defaults.inputEvents.blur(e);
+var _c4c=e.data.target;
+var opts=$(_c4c).combotreegrid("options");
+if(opts.limitToGrid){
+_c40(_c4c);
+}
+}}),filter:function(q,row){
+var opts=$(this).combotreegrid("options");
+return (row[opts.treeField]||"").toLowerCase().indexOf(q.toLowerCase())>=0;
+}});
+})(jQuery);
+(function($){
+function _c4d(_c4e){
+var _c4f=$.data(_c4e,"tagbox");
+var opts=_c4f.options;
+$(_c4e).addClass("tagbox-f").combobox($.extend({},opts,{cls:"tagbox",reversed:true,onChange:function(_c50,_c51){
+_c52();
+$(this).combobox("hidePanel");
+opts.onChange.call(_c4e,_c50,_c51);
+},onResizing:function(_c53,_c54){
+var _c55=$(this).combobox("textbox");
+var tb=$(this).data("textbox").textbox;
+var _c56=tb.outerWidth();
+tb.css({height:"",paddingLeft:_c55.css("marginLeft"),paddingRight:_c55.css("marginRight")});
+_c55.css("margin",0);
+tb._outerWidth(_c56);
+_c69(_c4e);
+_c5b(this);
+opts.onResizing.call(_c4e,_c53,_c54);
+},onLoadSuccess:function(data){
+_c52();
+opts.onLoadSuccess.call(_c4e,data);
+}}));
+_c52();
+_c69(_c4e);
+function _c52(){
+$(_c4e).next().find(".tagbox-label").remove();
+var _c57=$(_c4e).tagbox("textbox");
+var ss=[];
+$.map($(_c4e).tagbox("getValues"),function(_c58,_c59){
+var row=opts.finder.getRow(_c4e,_c58);
+var text=opts.tagFormatter.call(_c4e,_c58,row);
+var cs={};
+var css=opts.tagStyler.call(_c4e,_c58,row)||"";
+if(typeof css=="string"){
+cs={s:css};
+}else{
+cs={c:css["class"]||"",s:css["style"]||""};
+}
+var _c5a=$("<span class=\"tagbox-label\"></span>").insertBefore(_c57).html(text);
+_c5a.attr("tagbox-index",_c59);
+_c5a.attr("style",cs.s).addClass(cs.c);
+$("<a href=\"javascript:;\" class=\"tagbox-remove\"></a>").appendTo(_c5a);
+});
+_c5b(_c4e);
+$(_c4e).combobox("setText","");
+};
+};
+function _c5b(_c5c,_c5d){
+var span=$(_c5c).next();
+var _c5e=_c5d?$(_c5d):span.find(".tagbox-label");
+if(_c5e.length){
+var _c5f=$(_c5c).tagbox("textbox");
+var _c60=$(_c5e[0]);
+var _c61=_c60.outerHeight(true)-_c60.outerHeight();
+var _c62=_c5f.outerHeight()-_c61*2;
+_c5e.css({height:_c62+"px",lineHeight:_c62+"px"});
+var _c63=span.find(".textbox-addon").css("height","100%");
+_c63.find(".textbox-icon").css("height","100%");
+span.find(".textbox-button").linkbutton("resize",{height:"100%"});
+}
+};
+function _c64(_c65){
+var span=$(_c65).next();
+span._unbind(".tagbox")._bind("click.tagbox",function(e){
+var opts=$(_c65).tagbox("options");
+if(opts.disabled||opts.readonly){
+return;
+}
+if($(e.target).hasClass("tagbox-remove")){
+var _c66=parseInt($(e.target).parent().attr("tagbox-index"));
+var _c67=$(_c65).tagbox("getValues");
+if(opts.onBeforeRemoveTag.call(_c65,_c67[_c66])==false){
+return;
+}
+opts.onRemoveTag.call(_c65,_c67[_c66]);
+_c67.splice(_c66,1);
+$(_c65).tagbox("setValues",_c67);
+}else{
+var _c68=$(e.target).closest(".tagbox-label");
+if(_c68.length){
+var _c66=parseInt(_c68.attr("tagbox-index"));
+var _c67=$(_c65).tagbox("getValues");
+opts.onClickTag.call(_c65,_c67[_c66]);
+}
+}
+$(this).find(".textbox-text").focus();
+})._bind("keyup.tagbox",function(e){
+_c69(_c65);
+})._bind("mouseover.tagbox",function(e){
+if($(e.target).closest(".textbox-button,.textbox-addon,.tagbox-label").length){
+$(this).triggerHandler("mouseleave");
+}else{
+$(this).find(".textbox-text").triggerHandler("mouseenter");
+}
+})._bind("mouseleave.tagbox",function(e){
+$(this).find(".textbox-text").triggerHandler("mouseleave");
+});
+};
+function _c69(_c6a){
+var opts=$(_c6a).tagbox("options");
+var _c6b=$(_c6a).tagbox("textbox");
+var span=$(_c6a).next();
+var tmp=$("<span></span>").appendTo("body");
+tmp.attr("style",_c6b.attr("style"));
+tmp.css({position:"absolute",top:-9999,left:-9999,width:"auto",fontFamily:_c6b.css("fontFamily"),fontSize:_c6b.css("fontSize"),fontWeight:_c6b.css("fontWeight"),whiteSpace:"nowrap"});
+var _c6c=_c6d(_c6b.val());
+var _c6e=_c6d(opts.prompt||"");
+tmp.remove();
+var _c6f=Math.min(Math.max(_c6c,_c6e)+20,span.width());
+_c6b._outerWidth(_c6f);
+span.find(".textbox-button").linkbutton("resize",{height:"100%"});
+function _c6d(val){
+var s=val.replace(/&/g,"&amp;").replace(/\s/g," ").replace(/</g,"&lt;").replace(/>/g,"&gt;");
+tmp.html(s);
+return tmp.outerWidth();
+};
+};
+function _c70(_c71){
+var t=$(_c71);
+var opts=t.tagbox("options");
+if(opts.limitToList){
+var _c72=t.tagbox("panel");
+var item=_c72.children("div.combobox-item-hover");
+if(item.length){
+item.removeClass("combobox-item-hover");
+var row=opts.finder.getRow(_c71,item);
+var _c73=row[opts.valueField];
+$(_c71).tagbox(item.hasClass("combobox-item-selected")?"unselect":"select",_c73);
+}
+$(_c71).tagbox("hidePanel");
+}else{
+var v=$.trim($(_c71).tagbox("getText"));
+if(v!==""){
+var _c74=$(_c71).tagbox("getValues");
+_c74.push(v);
+$(_c71).tagbox("setValues",_c74);
+}
+}
+};
+function _c75(_c76,_c77){
+$(_c76).combobox("setText","");
+_c69(_c76);
+$(_c76).combobox("setValues",_c77);
+$(_c76).combobox("setText","");
+$(_c76).tagbox("validate");
+};
+$.fn.tagbox=function(_c78,_c79){
+if(typeof _c78=="string"){
+var _c7a=$.fn.tagbox.methods[_c78];
+if(_c7a){
+return _c7a(this,_c79);
+}else{
+return this.combobox(_c78,_c79);
+}
+}
+_c78=_c78||{};
+return this.each(function(){
+var _c7b=$.data(this,"tagbox");
+if(_c7b){
+$.extend(_c7b.options,_c78);
+}else{
+$.data(this,"tagbox",{options:$.extend({},$.fn.tagbox.defaults,$.fn.tagbox.parseOptions(this),_c78)});
+}
+_c4d(this);
+_c64(this);
+});
+};
+$.fn.tagbox.methods={options:function(jq){
+var _c7c=jq.combobox("options");
+return $.extend($.data(jq[0],"tagbox").options,{width:_c7c.width,height:_c7c.height,originalValue:_c7c.originalValue,disabled:_c7c.disabled,readonly:_c7c.readonly});
+},setValues:function(jq,_c7d){
+return jq.each(function(){
+_c75(this,_c7d);
+});
+},reset:function(jq){
+return jq.each(function(){
+$(this).combobox("reset").combobox("setText","");
+});
+}};
+$.fn.tagbox.parseOptions=function(_c7e){
+return $.extend({},$.fn.combobox.parseOptions(_c7e),$.parser.parseOptions(_c7e,[]));
+};
+$.fn.tagbox.defaults=$.extend({},$.fn.combobox.defaults,{hasDownArrow:false,multiple:true,reversed:true,selectOnNavigation:false,tipOptions:$.extend({},$.fn.textbox.defaults.tipOptions,{showDelay:200}),val:function(_c7f){
+var vv=$(_c7f).parent().prev().tagbox("getValues");
+if($(_c7f).is(":focus")){
+vv.push($(_c7f).val());
+}
+return vv.join(",");
+},inputEvents:$.extend({},$.fn.combo.defaults.inputEvents,{blur:function(e){
+var _c80=e.data.target;
+var opts=$(_c80).tagbox("options");
+if(opts.limitToList){
+_c70(_c80);
+}
+}}),keyHandler:$.extend({},$.fn.combobox.defaults.keyHandler,{enter:function(e){
+_c70(this);
+},query:function(q,e){
+var opts=$(this).tagbox("options");
+if(opts.limitToList){
+$.fn.combobox.defaults.keyHandler.query.call(this,q,e);
+}else{
+$(this).combobox("hidePanel");
+}
+}}),tagFormatter:function(_c81,row){
+var opts=$(this).tagbox("options");
+return row?row[opts.textField]:_c81;
+},tagStyler:function(_c82,row){
+return "";
+},onClickTag:function(_c83){
+},onBeforeRemoveTag:function(_c84){
+},onRemoveTag:function(_c85){
+}});
+})(jQuery);
+(function($){
+function _c86(_c87){
+var _c88=$.data(_c87,"datebox");
+var opts=_c88.options;
+$(_c87).addClass("datebox-f").combo($.extend({},opts,{onShowPanel:function(){
+_c89(this);
+_c8a(this);
+_c8b(this);
+_c99(this,$(this).datebox("getText"),true);
+opts.onShowPanel.call(this);
+}}));
+if(!_c88.calendar){
+var _c8c=$(_c87).combo("panel").css("overflow","hidden");
+_c8c.panel("options").onBeforeDestroy=function(){
+var c=$(this).find(".calendar-shared");
+if(c.length){
+c.insertBefore(c[0].pholder);
+}
+};
+var cc=$("<div class=\"datebox-calendar-inner\"></div>").prependTo(_c8c);
+if(opts.sharedCalendar){
+var c=$(opts.sharedCalendar);
+if(!c[0].pholder){
+c[0].pholder=$("<div class=\"calendar-pholder\" style=\"display:none\"></div>").insertAfter(c);
+}
+c.addClass("calendar-shared").appendTo(cc);
+if(!c.hasClass("calendar")){
+c.calendar();
+}
+_c88.calendar=c;
+}else{
+_c88.calendar=$("<div></div>").appendTo(cc).calendar();
+}
+$.extend(_c88.calendar.calendar("options"),{fit:true,border:false,onSelect:function(date){
+var _c8d=this.target;
+var opts=$(_c8d).datebox("options");
+opts.onSelect.call(_c8d,date);
+_c99(_c8d,opts.formatter.call(_c8d,date));
+$(_c8d).combo("hidePanel");
+}});
+}
+$(_c87).combo("textbox").parent().addClass("datebox");
+$(_c87).datebox("initValue",opts.value);
+function _c89(_c8e){
+var opts=$(_c8e).datebox("options");
+var _c8f=$(_c8e).combo("panel");
+_c8f._unbind(".datebox")._bind("click.datebox",function(e){
+if($(e.target).hasClass("datebox-button-a")){
+var _c90=parseInt($(e.target).attr("datebox-button-index"));
+opts.buttons[_c90].handler.call(e.target,_c8e);
+}
+});
+};
+function _c8a(_c91){
+var _c92=$(_c91).combo("panel");
+if(_c92.children("div.datebox-button").length){
+return;
+}
+var _c93=$("<div class=\"datebox-button\"><table cellspacing=\"0\" cellpadding=\"0\" style=\"width:100%\"><tr></tr></table></div>").appendTo(_c92);
+var tr=_c93.find("tr");
+for(var i=0;i<opts.buttons.length;i++){
+var td=$("<td></td>").appendTo(tr);
+var btn=opts.buttons[i];
+var t=$("<a class=\"datebox-button-a\" href=\"javascript:;\"></a>").html($.isFunction(btn.text)?btn.text(_c91):btn.text).appendTo(td);
+t.attr("datebox-button-index",i);
+}
+tr.find("td").css("width",(100/opts.buttons.length)+"%");
+};
+function _c8b(_c94){
+var _c95=$(_c94).combo("panel");
+var cc=_c95.children("div.datebox-calendar-inner");
+_c95.children()._outerWidth(_c95.width());
+_c88.calendar.appendTo(cc);
+_c88.calendar[0].target=_c94;
+if(opts.panelHeight!="auto"){
+var _c96=_c95.height();
+_c95.children().not(cc).each(function(){
+_c96-=$(this).outerHeight();
+});
+cc._outerHeight(_c96);
+}
+_c88.calendar.calendar("resize");
+};
+};
+function _c97(_c98,q){
+_c99(_c98,q,true);
+};
+function _c9a(_c9b){
+var _c9c=$.data(_c9b,"datebox");
+var opts=_c9c.options;
+var _c9d=_c9c.calendar.calendar("options").current;
+if(_c9d){
+_c99(_c9b,opts.formatter.call(_c9b,_c9d));
+$(_c9b).combo("hidePanel");
+}
+};
+function _c99(_c9e,_c9f,_ca0){
+var _ca1=$.data(_c9e,"datebox");
+var opts=_ca1.options;
+var _ca2=_ca1.calendar;
+_ca2.calendar("moveTo",opts.parser.call(_c9e,_c9f));
+if(_ca0){
+$(_c9e).combo("setValue",_c9f);
+}else{
+if(_c9f){
+_c9f=opts.formatter.call(_c9e,_ca2.calendar("options").current);
+}
+$(_c9e).combo("setText",_c9f).combo("setValue",_c9f);
+}
+};
+$.fn.datebox=function(_ca3,_ca4){
+if(typeof _ca3=="string"){
+var _ca5=$.fn.datebox.methods[_ca3];
+if(_ca5){
+return _ca5(this,_ca4);
+}else{
+return this.combo(_ca3,_ca4);
+}
+}
+_ca3=_ca3||{};
+return this.each(function(){
+var _ca6=$.data(this,"datebox");
+if(_ca6){
+$.extend(_ca6.options,_ca3);
+}else{
+$.data(this,"datebox",{options:$.extend({},$.fn.datebox.defaults,$.fn.datebox.parseOptions(this),_ca3)});
+}
+_c86(this);
+});
+};
+$.fn.datebox.methods={options:function(jq){
+var _ca7=jq.combo("options");
+return $.extend($.data(jq[0],"datebox").options,{width:_ca7.width,height:_ca7.height,originalValue:_ca7.originalValue,disabled:_ca7.disabled,readonly:_ca7.readonly});
+},cloneFrom:function(jq,from){
+return jq.each(function(){
+$(this).combo("cloneFrom",from);
+$.data(this,"datebox",{options:$.extend(true,{},$(from).datebox("options")),calendar:$(from).datebox("calendar")});
+$(this).addClass("datebox-f");
+});
+},calendar:function(jq){
+return $.data(jq[0],"datebox").calendar;
+},initValue:function(jq,_ca8){
+return jq.each(function(){
+var opts=$(this).datebox("options");
+if(_ca8){
+var date=opts.parser.call(this,_ca8);
+_ca8=opts.formatter.call(this,date);
+$(this).datebox("calendar").calendar("moveTo",date);
+}
+$(this).combo("initValue",_ca8).combo("setText",_ca8);
+});
+},setValue:function(jq,_ca9){
+return jq.each(function(){
+_c99(this,_ca9);
+});
+},reset:function(jq){
+return jq.each(function(){
+var opts=$(this).datebox("options");
+$(this).datebox("setValue",opts.originalValue);
+});
+},setDate:function(jq,date){
+return jq.each(function(){
+var opts=$(this).datebox("options");
+$(this).datebox("calendar").calendar("moveTo",date);
+_c99(this,date?opts.formatter.call(this,date):"");
+});
+},getDate:function(jq){
+if(jq.datebox("getValue")){
+return jq.datebox("calendar").calendar("options").current;
+}else{
+return null;
+}
+}};
+$.fn.datebox.parseOptions=function(_caa){
+return $.extend({},$.fn.combo.parseOptions(_caa),$.parser.parseOptions(_caa,["sharedCalendar"]));
+};
+$.fn.datebox.defaults=$.extend({},$.fn.combo.defaults,{panelWidth:250,panelHeight:"auto",sharedCalendar:null,keyHandler:{up:function(e){
+},down:function(e){
+},left:function(e){
+},right:function(e){
+},enter:function(e){
+_c9a(this);
+},query:function(q,e){
+_c97(this,q);
+}},currentText:"Today",closeText:"Close",okText:"Ok",buttons:[{text:function(_cab){
+return $(_cab).datebox("options").currentText;
+},handler:function(_cac){
+var opts=$(_cac).datebox("options");
+var now=new Date();
+var _cad=new Date(now.getFullYear(),now.getMonth(),now.getDate());
+$(_cac).datebox("calendar").calendar({year:_cad.getFullYear(),month:_cad.getMonth()+1,current:_cad});
+opts.onSelect.call(_cac,_cad);
+_c9a(_cac);
+}},{text:function(_cae){
+return $(_cae).datebox("options").closeText;
+},handler:function(_caf){
+$(this).closest("div.combo-panel").panel("close");
+}}],formatter:function(date){
+var y=date.getFullYear();
+var m=date.getMonth()+1;
+var d=date.getDate();
+return (m<10?("0"+m):m)+"/"+(d<10?("0"+d):d)+"/"+y;
+},parser:function(s){
+var _cb0=$.fn.calendar.defaults.Date;
+if($(this).data("datebox")){
+_cb0=$(this).datebox("calendar").calendar("options").Date;
+}
+if(!s){
+return new _cb0();
+}
+var ss=s.split("/");
+var m=parseInt(ss[0],10);
+var d=parseInt(ss[1],10);
+var y=parseInt(ss[2],10);
+if(!isNaN(y)&&!isNaN(m)&&!isNaN(d)){
+return new _cb0(y,m-1,d);
+}else{
+return new _cb0();
+}
+},onSelect:function(date){
+}});
+})(jQuery);
+(function($){
+function _cb1(_cb2){
+var _cb3=$.data(_cb2,"datetimebox");
+var opts=_cb3.options;
+$(_cb2).datebox($.extend({},opts,{onShowPanel:function(){
+var _cb4=$(this).datetimebox("getValue");
+_cba(this,_cb4,true);
+opts.onShowPanel.call(this);
+},formatter:$.fn.datebox.defaults.formatter,parser:$.fn.datebox.defaults.parser}));
+$(_cb2).removeClass("datebox-f").addClass("datetimebox-f");
+$(_cb2).datebox("calendar").calendar({onSelect:function(date){
+opts.onSelect.call(this.target,date);
+}});
+if(!_cb3.spinner){
+var _cb5=$(_cb2).datebox("panel");
+var p=$("<div style=\"padding:2px\"><input></div>").insertAfter(_cb5.children("div.datebox-calendar-inner"));
+_cb3.spinner=p.children("input");
+}
+_cb3.spinner.timespinner({width:opts.spinnerWidth,showSeconds:opts.showSeconds,separator:opts.timeSeparator,hour12:opts.hour12});
+$(_cb2).datetimebox("initValue",opts.value);
+};
+function _cb6(_cb7){
+var c=$(_cb7).datetimebox("calendar");
+var t=$(_cb7).datetimebox("spinner");
+var date=c.calendar("options").current;
+return new Date(date.getFullYear(),date.getMonth(),date.getDate(),t.timespinner("getHours"),t.timespinner("getMinutes"),t.timespinner("getSeconds"));
+};
+function _cb8(_cb9,q){
+_cba(_cb9,q,true);
+};
+function _cbb(_cbc){
+var opts=$.data(_cbc,"datetimebox").options;
+var date=_cb6(_cbc);
+_cba(_cbc,opts.formatter.call(_cbc,date));
+$(_cbc).combo("hidePanel");
+};
+function _cba(_cbd,_cbe,_cbf){
+var opts=$.data(_cbd,"datetimebox").options;
+$(_cbd).combo("setValue",_cbe);
+if(!_cbf){
+if(_cbe){
+var date=opts.parser.call(_cbd,_cbe);
+$(_cbd).combo("setText",opts.formatter.call(_cbd,date));
+$(_cbd).combo("setValue",opts.formatter.call(_cbd,date));
+}else{
+$(_cbd).combo("setText",_cbe);
+}
+}
+var date=opts.parser.call(_cbd,_cbe);
+$(_cbd).datetimebox("calendar").calendar("moveTo",date);
+$(_cbd).datetimebox("spinner").timespinner("setValue",_cc0(date));
+function _cc0(date){
+function _cc1(_cc2){
+return (_cc2<10?"0":"")+_cc2;
+};
+var tt=[_cc1(date.getHours()),_cc1(date.getMinutes())];
+if(opts.showSeconds){
+tt.push(_cc1(date.getSeconds()));
+}
+return tt.join($(_cbd).datetimebox("spinner").timespinner("options").separator);
+};
+};
+$.fn.datetimebox=function(_cc3,_cc4){
+if(typeof _cc3=="string"){
+var _cc5=$.fn.datetimebox.methods[_cc3];
+if(_cc5){
+return _cc5(this,_cc4);
+}else{
+return this.datebox(_cc3,_cc4);
+}
+}
+_cc3=_cc3||{};
+return this.each(function(){
+var _cc6=$.data(this,"datetimebox");
+if(_cc6){
+$.extend(_cc6.options,_cc3);
+}else{
+$.data(this,"datetimebox",{options:$.extend({},$.fn.datetimebox.defaults,$.fn.datetimebox.parseOptions(this),_cc3)});
+}
+_cb1(this);
+});
+};
+$.fn.datetimebox.methods={options:function(jq){
+var _cc7=jq.datebox("options");
+return $.extend($.data(jq[0],"datetimebox").options,{originalValue:_cc7.originalValue,disabled:_cc7.disabled,readonly:_cc7.readonly});
+},cloneFrom:function(jq,from){
+return jq.each(function(){
+$(this).datebox("cloneFrom",from);
+$.data(this,"datetimebox",{options:$.extend(true,{},$(from).datetimebox("options")),spinner:$(from).datetimebox("spinner")});
+$(this).removeClass("datebox-f").addClass("datetimebox-f");
+});
+},spinner:function(jq){
+return $.data(jq[0],"datetimebox").spinner;
+},initValue:function(jq,_cc8){
+return jq.each(function(){
+var opts=$(this).datetimebox("options");
+var _cc9=opts.value;
+if(_cc9){
+var date=opts.parser.call(this,_cc9);
+_cc9=opts.formatter.call(this,date);
+$(this).datetimebox("calendar").calendar("moveTo",date);
+}
+$(this).combo("initValue",_cc9).combo("setText",_cc9);
+});
+},setValue:function(jq,_cca){
+return jq.each(function(){
+_cba(this,_cca);
+});
+},reset:function(jq){
+return jq.each(function(){
+var opts=$(this).datetimebox("options");
+$(this).datetimebox("setValue",opts.originalValue);
+});
+},setDate:function(jq,date){
+return jq.each(function(){
+var opts=$(this).datetimebox("options");
+$(this).datetimebox("calendar").calendar("moveTo",date);
+_cba(this,date?opts.formatter.call(this,date):"");
+});
+},getDate:function(jq){
+if(jq.datetimebox("getValue")){
+return jq.datetimebox("calendar").calendar("options").current;
+}else{
+return null;
+}
+}};
+$.fn.datetimebox.parseOptions=function(_ccb){
+var t=$(_ccb);
+return $.extend({},$.fn.datebox.parseOptions(_ccb),$.parser.parseOptions(_ccb,["timeSeparator","spinnerWidth",{showSeconds:"boolean"}]));
+};
+$.fn.datetimebox.defaults=$.extend({},$.fn.datebox.defaults,{spinnerWidth:"100%",showSeconds:true,timeSeparator:":",hour12:false,panelEvents:{mousedown:function(e){
+}},keyHandler:{up:function(e){
+},down:function(e){
+},left:function(e){
+},right:function(e){
+},enter:function(e){
+_cbb(this);
+},query:function(q,e){
+_cb8(this,q);
+}},buttons:[{text:function(_ccc){
+return $(_ccc).datetimebox("options").currentText;
+},handler:function(_ccd){
+var opts=$(_ccd).datetimebox("options");
+_cba(_ccd,opts.formatter.call(_ccd,new Date()));
+$(_ccd).datetimebox("hidePanel");
+}},{text:function(_cce){
+return $(_cce).datetimebox("options").okText;
+},handler:function(_ccf){
+_cbb(_ccf);
+}},{text:function(_cd0){
+return $(_cd0).datetimebox("options").closeText;
+},handler:function(_cd1){
+$(_cd1).datetimebox("hidePanel");
+}}],formatter:function(date){
+if(!date){
+return "";
+}
+return $.fn.datebox.defaults.formatter.call(this,date)+" "+$.fn.timespinner.defaults.formatter.call($(this).datetimebox("spinner")[0],date);
+},parser:function(s){
+s=$.trim(s);
+if(!s){
+return new Date();
+}
+var dt=s.split(" ");
+var _cd2=$.fn.datebox.defaults.parser.call(this,dt[0]);
+if(dt.length<2){
+return _cd2;
+}
+var _cd3=$.fn.timespinner.defaults.parser.call($(this).datetimebox("spinner")[0],dt[1]+(dt[2]?" "+dt[2]:""));
+return new Date(_cd2.getFullYear(),_cd2.getMonth(),_cd2.getDate(),_cd3.getHours(),_cd3.getMinutes(),_cd3.getSeconds());
+}});
+})(jQuery);
+(function($){
+function _cd4(_cd5){
+var _cd6=$.data(_cd5,"timepicker");
+var opts=_cd6.options;
+$(_cd5).addClass("timepicker-f").combo($.extend({},opts,{onShowPanel:function(){
+_cd7(this);
+_cd8(_cd5);
+_ce2(_cd5,$(_cd5).timepicker("getValue"));
+}}));
+$(_cd5).timepicker("initValue",opts.value);
+function _cd7(_cd9){
+var opts=$(_cd9).timepicker("options");
+var _cda=$(_cd9).combo("panel");
+_cda._unbind(".timepicker")._bind("click.timepicker",function(e){
+if($(e.target).hasClass("datebox-button-a")){
+var _cdb=parseInt($(e.target).attr("datebox-button-index"));
+opts.buttons[_cdb].handler.call(e.target,_cd9);
+}
+});
+};
+function _cd8(_cdc){
+var _cdd=$(_cdc).combo("panel");
+if(_cdd.children("div.datebox-button").length){
+return;
+}
+var _cde=$("<div class=\"datebox-button\"><table cellspacing=\"0\" cellpadding=\"0\" style=\"width:100%\"><tr></tr></table></div>").appendTo(_cdd);
+var tr=_cde.find("tr");
+for(var i=0;i<opts.buttons.length;i++){
+var td=$("<td></td>").appendTo(tr);
+var btn=opts.buttons[i];
+var t=$("<a class=\"datebox-button-a\" href=\"javascript:;\"></a>").html($.isFunction(btn.text)?btn.text(_cdc):btn.text).appendTo(td);
+t.attr("datebox-button-index",i);
+}
+tr.find("td").css("width",(100/opts.buttons.length)+"%");
+};
+};
+function _cdf(_ce0,_ce1){
+var opts=$(_ce0).data("timepicker").options;
+_ce2(_ce0,_ce1);
+opts.value=_ce3(_ce0);
+$(_ce0).combo("setValue",opts.value).combo("setText",opts.value);
+};
+function _ce2(_ce4,_ce5){
+var opts=$(_ce4).data("timepicker").options;
+if(_ce5){
+var _ce6=_ce5.split(" ");
+var hm=_ce6[0].split(":");
+opts.selectingHour=parseInt(hm[0],10);
+opts.selectingMinute=parseInt(hm[1],10);
+opts.selectingAmpm=_ce6[1];
+}else{
+opts.selectingHour=12;
+opts.selectingMinute=0;
+opts.selectingAmpm=opts.ampm[0];
+}
+_ce7(_ce4);
+};
+function _ce3(_ce8){
+var opts=$(_ce8).data("timepicker").options;
+var h=opts.selectingHour;
+var m=opts.selectingMinute;
+var ampm=opts.selectingAmpm;
+if(!ampm){
+ampm=opts.ampm[0];
+}
+var v=(h<10?"0"+h:h)+":"+(m<10?"0"+m:m);
+if(!opts.hour24){
+v+=" "+ampm;
+}
+return v;
+};
+function _ce7(_ce9){
+var opts=$(_ce9).data("timepicker").options;
+var _cea=$(_ce9).combo("panel");
+var _ceb=_cea.children(".timepicker-panel");
+if(!_ceb.length){
+var _ceb=$("<div class=\"timepicker-panel f-column\"></div>").prependTo(_cea);
+}
+_ceb.empty();
+if(opts.panelHeight!="auto"){
+var _cec=_cea.height()-_cea.find(".datebox-button").outerHeight();
+_ceb._outerHeight(_cec);
+}
+_ced(_ce9);
+_cee(_ce9);
+_ceb.off(".timepicker");
+_ceb.on("click.timepicker",".title-hour",function(e){
+opts.selectingType="hour";
+_ce7(_ce9);
+}).on("click.timepicker",".title-minute",function(e){
+opts.selectingType="minute";
+_ce7(_ce9);
+}).on("click.timepicker",".title-am",function(e){
+opts.selectingAmpm=opts.ampm[0];
+_ce7(_ce9);
+}).on("click.timepicker",".title-pm",function(e){
+opts.selectingAmpm=opts.ampm[1];
+_ce7(_ce9);
+}).on("click.timepicker",".item",function(e){
+var _cef=parseInt($(this).text(),10);
+if(opts.selectingType=="hour"){
+opts.selectingHour=_cef;
+}else{
+opts.selectingMinute=_cef;
+}
+_ce7(_ce9);
+});
+};
+function _ced(_cf0){
+var opts=$(_cf0).data("timepicker").options;
+var _cf1=$(_cf0).combo("panel");
+var _cf2=_cf1.find(".timepicker-panel");
+var hour=opts.selectingHour;
+var _cf3=opts.selectingMinute;
+$("<div class=\"panel-header f-noshrink f-row f-content-center\">"+"<div class=\"title title-hour\">"+(hour<10?"0"+hour:hour)+"</div>"+"<div class=\"sep\">:</div>"+"<div class=\"title title-minute\">"+(_cf3<10?"0"+_cf3:_cf3)+"</div>"+"<div class=\"ampm f-column\">"+"<div class=\"title title-am\">"+opts.ampm[0]+"</div>"+"<div class=\"title title-pm\">"+opts.ampm[1]+"</div>"+"</div>"+"</div>").appendTo(_cf2);
+var _cf4=_cf2.find(".panel-header");
+if(opts.selectingType=="hour"){
+_cf4.find(".title-hour").addClass("title-selected");
+}else{
+_cf4.find(".title-minute").addClass("title-selected");
+}
+if(opts.selectingAmpm==opts.ampm[0]){
+_cf4.find(".title-am").addClass("title-selected");
+}
+if(opts.selectingAmpm==opts.ampm[1]){
+_cf4.find(".title-pm").addClass("title-selected");
+}
+if(opts.hour24){
+_cf4.find(".ampm").hide();
+}
+};
+function _cee(_cf5){
+var opts=$(_cf5).data("timepicker").options;
+var _cf6=$(_cf5).combo("panel");
+var _cf7=_cf6.find(".timepicker-panel");
+var _cf8=$("<div class=\"clock-wrap f-full f-column f-content-center\">"+"</div>").appendTo(_cf7);
+var _cf9=_cf8.outerWidth();
+var _cfa=_cf8.outerHeight();
+var size=Math.min(_cf9,_cfa)-20;
+var _cfb=size/2;
+_cf9=size;
+_cfa=size;
+var _cfc=opts.selectingType=="hour"?opts.selectingHour:opts.selectingMinute;
+var _cfd=_cfc/(opts.selectingType=="hour"?12:60)*360;
+_cfd=parseFloat(_cfd).toFixed(4);
+var _cfe={transform:"rotate("+_cfd+"deg)",};
+if(opts.hour24&&opts.selectingType=="hour"){
+if(_cfc==0){
+_cfe.top=opts.hourDistance[0]+"px";
+}else{
+if(_cfc<=12){
+_cfe.top=opts.hourDistance[1]+"px";
+}
+}
+}
+var _cff={width:_cf9+"px",height:_cfa+"px",marginLeft:-_cf9/2+"px",marginTop:-_cfa/2+"px"};
+var _d00=[];
+_d00.push("<div class=\"clock\">");
+_d00.push("<div class=\"center\"></div>");
+_d00.push("<div class=\"hand\">");
+_d00.push("<div class=\"drag\"></div>");
+_d00.push("</div>");
+var data=_d01();
+if(opts.hour24&&opts.selectingType=="hour"){
+for(var i=0;i<data.length;i++){
+var _d02=parseInt(data[i],10);
+_d02+=12;
+if(_d02==24){
+_d02="00";
+}
+var cls="item f-column f-content-center";
+if(_d02==_cfc){
+cls+=" item-selected";
+}
+var _cfd=_d02/(opts.selectingType=="hour"?12:60)*360*Math.PI/180;
+var x=(_cfb-20)*Math.sin(_cfd);
+var y=-(_cfb-20)*Math.cos(_cfd);
+_cfd=parseFloat(_cfd).toFixed(4);
+x=parseFloat(x).toFixed(4);
+y=parseFloat(y).toFixed(4);
+var _d03={transform:"translate("+x+"px,"+y+"px)"};
+var _d03="transform:translate("+x+"px,"+y+"px)";
+_d00.push("<div class=\""+cls+"\" style=\""+_d03+"\">"+(_d02)+"</div>");
+}
+_cfb-=opts.hourDistance[1]-opts.hourDistance[0];
+}
+for(var i=0;i<data.length;i++){
+var _d02=data[i];
+var cls="item f-column f-content-center";
+if(_d02==_cfc){
+cls+=" item-selected";
+}
+var _cfd=_d02/(opts.selectingType=="hour"?12:60)*360*Math.PI/180;
+var x=(_cfb-20)*Math.sin(_cfd);
+var y=-(_cfb-20)*Math.cos(_cfd);
+_cfd=parseFloat(_cfd).toFixed(4);
+x=parseFloat(x).toFixed(4);
+y=parseFloat(y).toFixed(4);
+var _d03={transform:"translate("+x+"px,"+y+"px)"};
+var _d03="transform:translate("+x+"px,"+y+"px)";
+_d00.push("<div class=\""+cls+"\" style=\""+_d03+"\">"+_d02+"</div>");
+}
+_d00.push("</div>");
+_cf8.html(_d00.join(""));
+_cf8.find(".clock").css(_cff);
+_cf8.find(".hand").css(_cfe);
+function _d01(){
+var data=[];
+if(opts.selectingType=="hour"){
+for(var i=0;i<12;i++){
+data.push(String(i));
+}
+data[0]="12";
+}else{
+for(var i=0;i<60;i+=5){
+data.push(i<10?"0"+i:String(i));
+}
+data[0]="00";
+}
+return data;
+};
+};
+$.fn.timepicker=function(_d04,_d05){
+if(typeof _d04=="string"){
+var _d06=$.fn.timepicker.methods[_d04];
+if(_d06){
+return _d06(this,_d05);
+}else{
+return this.combo(_d04,_d05);
+}
+}
+_d04=_d04||{};
+return this.each(function(){
+var _d07=$.data(this,"timepicker");
+if(_d07){
+$.extend(_d07.options,_d04);
+}else{
+$.data(this,"timepicker",{options:$.extend({},$.fn.timepicker.defaults,$.fn.timepicker.parseOptions(this),_d04)});
+}
+_cd4(this);
+});
+};
+$.fn.timepicker.methods={options:function(jq){
+var _d08=jq.combo("options");
+return $.extend($.data(jq[0],"timepicker").options,{width:_d08.width,height:_d08.height,originalValue:_d08.originalValue,disabled:_d08.disabled,readonly:_d08.readonly});
+},initValue:function(jq,_d09){
+return jq.each(function(){
+var opts=$(this).timepicker("options");
+opts.value=_d09;
+_ce2(this,_d09);
+if(_d09){
+opts.value=_ce3(this);
+$(this).combo("initValue",opts.value).combo("setText",opts.value);
+}
+});
+},setValue:function(jq,_d0a){
+return jq.each(function(){
+_cdf(this,_d0a);
+});
+},reset:function(jq){
+return jq.each(function(){
+var opts=$(this).timepicker("options");
+$(this).timepicker("setValue",opts.originalValue);
+});
+}};
+$.fn.timepicker.parseOptions=function(_d0b){
+return $.extend({},$.fn.combo.parseOptions(_d0b),$.parser.parseOptions(_d0b,[{hour24:"boolean"}]));
+};
+$.fn.timepicker.defaults=$.extend({},$.fn.combo.defaults,{closeText:"Close",okText:"Ok",buttons:[{text:function(_d0c){
+return $(_d0c).timepicker("options").okText;
+},handler:function(_d0d){
+$(_d0d).timepicker("setValue",_ce3(_d0d));
+$(this).closest("div.combo-panel").panel("close");
+}},{text:function(_d0e){
+return $(_d0e).timepicker("options").closeText;
+},handler:function(_d0f){
+$(this).closest("div.combo-panel").panel("close");
+}}],editable:false,ampm:["am","pm"],value:"",selectingHour:12,selectingMinute:0,selectingType:"hour",hour24:false,hourDistance:[20,50]});
+})(jQuery);
+(function($){
+function init(_d10){
+var _d11=$("<div class=\"slider\">"+"<div class=\"slider-inner\">"+"<a href=\"javascript:;\" class=\"slider-handle\"></a>"+"<span class=\"slider-tip\"></span>"+"</div>"+"<div class=\"slider-rule\"></div>"+"<div class=\"slider-rulelabel\"></div>"+"<div style=\"clear:both\"></div>"+"<input type=\"hidden\" class=\"slider-value\">"+"</div>").insertAfter(_d10);
+var t=$(_d10);
+t.addClass("slider-f").hide();
+var name=t.attr("name");
+if(name){
+_d11.find("input.slider-value").attr("name",name);
+t.removeAttr("name").attr("sliderName",name);
+}
+_d11._bind("_resize",function(e,_d12){
+if($(this).hasClass("easyui-fluid")||_d12){
+_d13(_d10);
+}
+return false;
+});
+return _d11;
+};
+function _d13(_d14,_d15){
+var _d16=$.data(_d14,"slider");
+var opts=_d16.options;
+var _d17=_d16.slider;
+if(_d15){
+if(_d15.width){
+opts.width=_d15.width;
+}
+if(_d15.height){
+opts.height=_d15.height;
+}
+}
+_d17._size(opts);
+if(opts.mode=="h"){
+_d17.css("height","");
+_d17.children("div").css("height","");
+}else{
+_d17.css("width","");
+_d17.children("div").css("width","");
+_d17.children("div.slider-rule,div.slider-rulelabel,div.slider-inner")._outerHeight(_d17._outerHeight());
+}
+_d18(_d14);
+};
+function _d19(_d1a){
+var _d1b=$.data(_d1a,"slider");
+var opts=_d1b.options;
+var _d1c=_d1b.slider;
+var aa=opts.mode=="h"?opts.rule:opts.rule.slice(0).reverse();
+if(opts.reversed){
+aa=aa.slice(0).reverse();
+}
+_d1d(aa);
+function _d1d(aa){
+var rule=_d1c.find("div.slider-rule");
+var _d1e=_d1c.find("div.slider-rulelabel");
+rule.empty();
+_d1e.empty();
+for(var i=0;i<aa.length;i++){
+var _d1f=i*100/(aa.length-1)+"%";
+var span=$("<span></span>").appendTo(rule);
+span.css((opts.mode=="h"?"left":"top"),_d1f);
+if(aa[i]!="|"){
+span=$("<span></span>").appendTo(_d1e);
+span.html(aa[i]);
+if(opts.mode=="h"){
+span.css({left:_d1f,marginLeft:-Math.round(span.outerWidth()/2)});
+}else{
+span.css({top:_d1f,marginTop:-Math.round(span.outerHeight()/2)});
+}
+}
+}
+};
+};
+function _d20(_d21){
+var _d22=$.data(_d21,"slider");
+var opts=_d22.options;
+var _d23=_d22.slider;
+_d23.removeClass("slider-h slider-v slider-disabled");
+_d23.addClass(opts.mode=="h"?"slider-h":"slider-v");
+_d23.addClass(opts.disabled?"slider-disabled":"");
+var _d24=_d23.find(".slider-inner");
+_d24.html("<a href=\"javascript:;\" class=\"slider-handle\"></a>"+"<span class=\"slider-tip\"></span>");
+if(opts.range){
+_d24.append("<a href=\"javascript:;\" class=\"slider-handle\"></a>"+"<span class=\"slider-tip\"></span>");
+}
+_d23.find("a.slider-handle").draggable({axis:opts.mode,cursor:"pointer",disabled:opts.disabled,onDrag:function(e){
+var left=e.data.left;
+var _d25=_d23.width();
+if(opts.mode!="h"){
+left=e.data.top;
+_d25=_d23.height();
+}
+if(left<0||left>_d25){
+return false;
+}else{
+_d26(left,this);
+return false;
+}
+},onStartDrag:function(){
+_d22.isDragging=true;
+opts.onSlideStart.call(_d21,opts.value);
+},onStopDrag:function(e){
+_d26(opts.mode=="h"?e.data.left:e.data.top,this);
+opts.onSlideEnd.call(_d21,opts.value);
+opts.onComplete.call(_d21,opts.value);
+_d22.isDragging=false;
+}});
+_d23.find("div.slider-inner")._unbind(".slider")._bind("mousedown.slider",function(e){
+if(_d22.isDragging||opts.disabled){
+return;
+}
+var pos=$(this).offset();
+_d26(opts.mode=="h"?(e.pageX-pos.left):(e.pageY-pos.top));
+opts.onComplete.call(_d21,opts.value);
+});
+function _d27(_d28){
+var dd=String(opts.step).split(".");
+var dlen=dd.length>1?dd[1].length:0;
+return parseFloat(_d28.toFixed(dlen));
+};
+function _d26(pos,_d29){
+var _d2a=_d2b(_d21,pos);
+var s=Math.abs(_d2a%opts.step);
+if(s<opts.step/2){
+_d2a-=s;
+}else{
+_d2a=_d2a-s+opts.step;
+}
+_d2a=_d27(_d2a);
+if(opts.range){
+var v1=opts.value[0];
+var v2=opts.value[1];
+var m=parseFloat((v1+v2)/2);
+if(_d29){
+var _d2c=$(_d29).nextAll(".slider-handle").length>0;
+if(_d2a<=v2&&_d2c){
+v1=_d2a;
+}else{
+if(_d2a>=v1&&(!_d2c)){
+v2=_d2a;
+}
+}
+}else{
+if(_d2a<v1){
+v1=_d2a;
+}else{
+if(_d2a>v2){
+v2=_d2a;
+}else{
+_d2a<m?v1=_d2a:v2=_d2a;
+}
+}
+}
+$(_d21).slider("setValues",[v1,v2]);
+}else{
+$(_d21).slider("setValue",_d2a);
+}
+};
+};
+function _d2d(_d2e,_d2f){
+var _d30=$.data(_d2e,"slider");
+var opts=_d30.options;
+var _d31=_d30.slider;
+var _d32=$.isArray(opts.value)?opts.value:[opts.value];
+var _d33=[];
+if(!$.isArray(_d2f)){
+_d2f=$.map(String(_d2f).split(opts.separator),function(v){
+return parseFloat(v);
+});
+}
+_d31.find(".slider-value").remove();
+var name=$(_d2e).attr("sliderName")||"";
+for(var i=0;i<_d2f.length;i++){
+var _d34=_d2f[i];
+if(_d34<opts.min){
+_d34=opts.min;
+}
+if(_d34>opts.max){
+_d34=opts.max;
+}
+var _d35=$("<input type=\"hidden\" class=\"slider-value\">").appendTo(_d31);
+_d35.attr("name",name);
+_d35.val(_d34);
+_d33.push(_d34);
+var _d36=_d31.find(".slider-handle:eq("+i+")");
+var tip=_d36.next();
+var pos=_d37(_d2e,_d34);
+if(opts.showTip){
+tip.show();
+tip.html(opts.tipFormatter.call(_d2e,_d34));
+}else{
+tip.hide();
+}
+if(opts.mode=="h"){
+var _d38="left:"+pos+"px;";
+_d36.attr("style",_d38);
+tip.attr("style",_d38+"margin-left:"+(-Math.round(tip.outerWidth()/2))+"px");
+}else{
+var _d38="top:"+pos+"px;";
+_d36.attr("style",_d38);
+tip.attr("style",_d38+"margin-left:"+(-Math.round(tip.outerWidth()))+"px");
+}
+}
+opts.value=opts.range?_d33:_d33[0];
+$(_d2e).val(opts.range?_d33.join(opts.separator):_d33[0]);
+if(_d32.join(",")!=_d33.join(",")){
+opts.onChange.call(_d2e,opts.value,(opts.range?_d32:_d32[0]));
+}
+};
+function _d18(_d39){
+var opts=$.data(_d39,"slider").options;
+var fn=opts.onChange;
+opts.onChange=function(){
+};
+_d2d(_d39,opts.value);
+opts.onChange=fn;
+};
+function _d37(_d3a,_d3b){
+var _d3c=$.data(_d3a,"slider");
+var opts=_d3c.options;
+var _d3d=_d3c.slider;
+var size=opts.mode=="h"?_d3d.width():_d3d.height();
+var pos=opts.converter.toPosition.call(_d3a,_d3b,size);
+if(opts.mode=="v"){
+pos=_d3d.height()-pos;
+}
+if(opts.reversed){
+pos=size-pos;
+}
+return pos;
+};
+function _d2b(_d3e,pos){
+var _d3f=$.data(_d3e,"slider");
+var opts=_d3f.options;
+var _d40=_d3f.slider;
+var size=opts.mode=="h"?_d40.width():_d40.height();
+var pos=opts.mode=="h"?(opts.reversed?(size-pos):pos):(opts.reversed?pos:(size-pos));
+var _d41=opts.converter.toValue.call(_d3e,pos,size);
+return _d41;
+};
+$.fn.slider=function(_d42,_d43){
+if(typeof _d42=="string"){
+return $.fn.slider.methods[_d42](this,_d43);
+}
+_d42=_d42||{};
+return this.each(function(){
+var _d44=$.data(this,"slider");
+if(_d44){
+$.extend(_d44.options,_d42);
+}else{
+_d44=$.data(this,"slider",{options:$.extend({},$.fn.slider.defaults,$.fn.slider.parseOptions(this),_d42),slider:init(this)});
+$(this)._propAttr("disabled",false);
+}
+var opts=_d44.options;
+opts.min=parseFloat(opts.min);
+opts.max=parseFloat(opts.max);
+if(opts.range){
+if(!$.isArray(opts.value)){
+opts.value=$.map(String(opts.value).split(opts.separator),function(v){
+return parseFloat(v);
+});
+}
+if(opts.value.length<2){
+opts.value.push(opts.max);
+}
+}else{
+opts.value=parseFloat(opts.value);
+}
+opts.step=parseFloat(opts.step);
+opts.originalValue=opts.value;
+_d20(this);
+_d19(this);
+_d13(this);
+});
+};
+$.fn.slider.methods={options:function(jq){
+return $.data(jq[0],"slider").options;
+},destroy:function(jq){
+return jq.each(function(){
+$.data(this,"slider").slider.remove();
+$(this).remove();
+});
+},resize:function(jq,_d45){
+return jq.each(function(){
+_d13(this,_d45);
+});
+},getValue:function(jq){
+return jq.slider("options").value;
+},getValues:function(jq){
+return jq.slider("options").value;
+},setValue:function(jq,_d46){
+return jq.each(function(){
+_d2d(this,[_d46]);
+});
+},setValues:function(jq,_d47){
+return jq.each(function(){
+_d2d(this,_d47);
+});
+},clear:function(jq){
+return jq.each(function(){
+var opts=$(this).slider("options");
+_d2d(this,opts.range?[opts.min,opts.max]:[opts.min]);
+});
+},reset:function(jq){
+return jq.each(function(){
+var opts=$(this).slider("options");
+$(this).slider(opts.range?"setValues":"setValue",opts.originalValue);
+});
+},enable:function(jq){
+return jq.each(function(){
+$.data(this,"slider").options.disabled=false;
+_d20(this);
+});
+},disable:function(jq){
+return jq.each(function(){
+$.data(this,"slider").options.disabled=true;
+_d20(this);
+});
+}};
+$.fn.slider.parseOptions=function(_d48){
+var t=$(_d48);
+return $.extend({},$.parser.parseOptions(_d48,["width","height","mode",{reversed:"boolean",showTip:"boolean",range:"boolean",min:"number",max:"number",step:"number"}]),{value:(t.val()||undefined),disabled:(t.attr("disabled")?true:undefined),rule:(t.attr("rule")?eval(t.attr("rule")):undefined)});
+};
+$.fn.slider.defaults={width:"auto",height:"auto",mode:"h",reversed:false,showTip:false,disabled:false,range:false,value:0,separator:",",min:0,max:100,step:1,rule:[],tipFormatter:function(_d49){
+return _d49;
+},converter:{toPosition:function(_d4a,size){
+var opts=$(this).slider("options");
+var p=(_d4a-opts.min)/(opts.max-opts.min)*size;
+return p;
+},toValue:function(pos,size){
+var opts=$(this).slider("options");
+var v=opts.min+(opts.max-opts.min)*(pos/size);
+return v;
+}},onChange:function(_d4b,_d4c){
+},onSlideStart:function(_d4d){
+},onSlideEnd:function(_d4e){
+},onComplete:function(_d4f){
+}};
+})(jQuery);
+
diff --git a/Source/platformProject/platform2022UI/jslib/jquery/jquery.fileDownload.js b/Source/platformProject/platform2022UI/jslib/jquery/jquery.fileDownload.js
new file mode 100644
index 0000000..797fe33
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/jquery/jquery.fileDownload.js
@@ -0,0 +1,495 @@
+/*
+* jQuery File Download Plugin v1.4.5
+*
+* http://www.johnculviner.com
+*
+* Copyright (c) 2013 - John Culviner
+*
+* Licensed under the MIT license:
+*   http://www.opensource.org/licenses/mit-license.php
+*
+* !!!!NOTE!!!!
+* You must also write a cookie in conjunction with using this plugin in the server's response headers containing the file download:
+* Set-Cookie: fileDownload=true; path=/"
+* !!!!NOTE!!!!
+*/
+
+(function($, window){
+    // i'll just put them here to get evaluated on script load
+    var htmlSpecialCharsRegEx = /[<>&\r\n"']/gm;
+    var htmlSpecialCharsPlaceHolders = {
+        '<': 'lt;',
+        '>': 'gt;',
+        '&': 'amp;',
+        '\r': "#13;",
+        '\n': "#10;",
+        '"': 'quot;',
+        "'": '#39;' /*single quotes just to be safe, IE8 doesn't support &apos;, so use &#39; instead */
+    };
+
+    $.extend({
+        //
+        //$.fileDownload('/path/to/url/', options)
+        //  see directly below for possible 'options'
+        fileDownload: function (fileUrl, options) {
+
+            //provide some reasonable defaults to any unspecified options below
+            var settings = $.extend({
+
+                //
+                //Requires jQuery UI: provide a message to display to the user when the file download is being prepared before the browser's dialog appears
+                //
+                preparingMessageHtml: null,
+
+                //
+                //Requires jQuery UI: provide a message to display to the user when a file download fails
+                //
+                failMessageHtml: null,
+
+                //
+                //the stock android browser straight up doesn't support file downloads initiated by a non GET: http://code.google.com/p/android/issues/detail?id=1780
+                //specify a message here to display if a user tries with an android browser
+                //if jQuery UI is installed this will be a dialog, otherwise it will be an alert
+                //Set to null to disable the message and attempt to download anyway
+                //
+                androidPostUnsupportedMessageHtml: "Unfortunately your Android browser doesn't support this type of file download. Please try again with a different browser.",
+
+                //
+                //Requires jQuery UI: options to pass into jQuery UI Dialog
+                //
+                dialogOptions: { modal: true },
+
+                //
+                //a function to call while the dowload is being prepared before the browser's dialog appears
+                //Args:
+                //  url - the original url attempted
+                //
+                prepareCallback: function (url) { },
+
+                //
+                //a function to call after a file download successfully completed
+                //Args:
+                //  url - the original url attempted
+                //
+                successCallback: function (url) { },
+
+                //
+                //a function to call after a file download request was canceled
+                //Args:
+                //  url - the original url attempted
+                //
+                abortCallback: function (url) { },
+
+                //
+                //a function to call after a file download failed
+                //Args:
+                //  responseHtml    - the html that came back in response to the file download. this won't necessarily come back depending on the browser.
+                //                      in less than IE9 a cross domain error occurs because 500+ errors cause a cross domain issue due to IE subbing out the
+                //                      server's error message with a "helpful" IE built in message
+                //  url             - the original url attempted
+                //  error           - original error cautch from exception
+                //
+                failCallback: function (responseHtml, url, error) { },
+
+                //
+                // the HTTP method to use. Defaults to "GET".
+                //
+                httpMethod: "GET",
+
+                //
+                // if specified will perform a "httpMethod" request to the specified 'fileUrl' using the specified data.
+                // data must be an object (which will be $.param serialized) or already a key=value param string
+                //
+                data: null,
+
+                //
+                //a period in milliseconds to poll to determine if a successful file download has occured or not
+                //
+                checkInterval: 100,
+
+                //
+                //the cookie name to indicate if a file download has occured
+                //
+                cookieName: "fileDownload",
+
+                //
+                //the cookie value for the above name to indicate that a file download has occured
+                //
+                cookieValue: "true",
+
+                //
+                //the cookie path for above name value pair
+                //
+                cookiePath: "/",
+
+                //
+                //if specified it will be used when attempting to clear the above name value pair
+                //useful for when downloads are being served on a subdomain (e.g. downloads.example.com)
+                //
+                cookieDomain: null,
+
+                //
+                //the title for the popup second window as a download is processing in the case of a mobile browser
+                //
+                popupWindowTitle: "Initiating file download...",
+
+                //
+                //Functionality to encode HTML entities for a POST, need this if data is an object with properties whose values contains strings with quotation marks.
+                //HTML entity encoding is done by replacing all &,<,>,',",\r,\n characters.
+                //Note that some browsers will POST the string htmlentity-encoded whilst others will decode it before POSTing.
+                //It is recommended that on the server, htmlentity decoding is done irrespective.
+                //
+                encodeHTMLEntities: true
+
+            }, options);
+
+
+            var deferred = new $.Deferred();
+
+            //Setup mobile browser detection: Partial credit: http://detectmobilebrowser.com/
+            var userAgent = (navigator.userAgent || navigator.vendor || window.opera).toLowerCase();
+
+            var isIos;                  //has full support of features in iOS 4.0+, uses a new window to accomplish this.
+            var isAndroid;              //has full support of GET features in 4.0+ by using a new window. Non-GET is completely unsupported by the browser. See above for specifying a message.
+            var isOtherMobileBrowser;   //there is no way to reliably guess here so all other mobile devices will GET and POST to the current window.
+
+            if (/ip(ad|hone|od)/.test(userAgent)) {
+
+                isIos = true;
+
+            } else if (userAgent.indexOf('android') !== -1) {
+
+                isAndroid = true;
+
+            } else {
+
+                isOtherMobileBrowser = /avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|playbook|silk|iemobile|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(userAgent) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|e\-|e\/|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(di|rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|xda(\-|2|g)|yas\-|your|zeto|zte\-/i.test(userAgent.substr(0, 4));
+
+            }
+
+            var httpMethodUpper = settings.httpMethod.toUpperCase();
+
+            if (isAndroid && httpMethodUpper !== "GET" && settings.androidPostUnsupportedMessageHtml) {
+                //the stock android browser straight up doesn't support file downloads initiated by non GET requests: http://code.google.com/p/android/issues/detail?id=1780
+
+                if ($().dialog) {
+                    $("<div>").html(settings.androidPostUnsupportedMessageHtml).dialog(settings.dialogOptions);
+                } else {
+                    alert(settings.androidPostUnsupportedMessageHtml);
+                }
+
+                return deferred.reject();
+            }
+
+            var $preparingDialog = null;
+
+            var internalCallbacks = {
+
+                onPrepare: function (url) {
+
+                    //wire up a jquery dialog to display the preparing message if specified
+                    if (settings.preparingMessageHtml) {
+
+                        $preparingDialog = $("<div>").html(settings.preparingMessageHtml).dialog(settings.dialogOptions);
+
+                    } else if (settings.prepareCallback) {
+
+                        settings.prepareCallback(url);
+
+                    }
+
+                },
+
+                onSuccess: function (url) {
+
+                    //remove the perparing message if it was specified
+                    if ($preparingDialog) {
+                        $preparingDialog.dialog('close');
+                    }
+
+                    settings.successCallback(url);
+
+                    deferred.resolve(url);
+                },
+
+                onAbort: function (url) {
+
+                    //remove the perparing message if it was specified
+                    if ($preparingDialog) {
+                        $preparingDialog.dialog('close');
+                    };
+
+                    settings.abortCallback(url);
+
+                    deferred.reject(url);
+                },
+
+                onFail: function (responseHtml, url, error) {
+
+                    //remove the perparing message if it was specified
+                    if ($preparingDialog) {
+                        $preparingDialog.dialog('close');
+                    }
+
+                    //wire up a jquery dialog to display the fail message if specified
+                    if (settings.failMessageHtml) {
+                        $("<div>").html(settings.failMessageHtml).dialog(settings.dialogOptions);
+                    }
+
+                    settings.failCallback(responseHtml, url, error);
+
+                    deferred.reject(responseHtml, url);
+                }
+            };
+
+            internalCallbacks.onPrepare(fileUrl);
+
+            //make settings.data a param string if it exists and isn't already
+            if (settings.data !== null && typeof settings.data !== "string") {
+                settings.data = $.param(settings.data);
+            }
+
+
+            var $iframe,
+                downloadWindow,
+                formDoc,
+                $form;
+
+            if (httpMethodUpper === "GET") {
+                if (settings.data !== null) {
+                    //need to merge any fileUrl params with the data object
+
+                    var qsStart = fileUrl.indexOf('?');
+
+                    if (qsStart !== -1) {
+                        //we have a querystring in the url
+
+                        if (fileUrl.substring(fileUrl.length - 1) !== "&") {
+                            fileUrl = fileUrl + "&";
+                        }
+                    } else {
+
+                        fileUrl = fileUrl + "?";
+                    }
+
+                    fileUrl = fileUrl + settings.data;
+                }
+
+                if (isIos || isAndroid) {
+
+                    downloadWindow = window.open(fileUrl);
+                    downloadWindow.document.title = settings.popupWindowTitle;
+                    window.focus();
+
+                } else if (isOtherMobileBrowser) {
+
+                    window.location(fileUrl);
+
+                } else {
+
+                    //create a temporary iframe that is used to request the fileUrl as a GET request
+                    $iframe = $("<iframe style='display: none' src='"+fileUrl+"'></iframe>").appendTo("body");
+                }
+
+            } else {
+
+                var formInnerHtml = "";
+
+                if (settings.data !== null) {
+
+                    $.each(settings.data.replace(/\+/g, ' ').split("&"), function () {
+
+                        var kvp = this.split("=");
+
+                        //Issue: When value contains sign '=' then the kvp array does have more than 2 items. We have to join value back
+                        var k = kvp[0];
+                        kvp.shift();
+                        var v = kvp.join("=");
+                        kvp = [k, v];
+
+                        var key = settings.encodeHTMLEntities ? htmlSpecialCharsEntityEncode(decodeURIComponent(kvp[0])) : decodeURIComponent(kvp[0]);
+                        if (key) {
+                            var value = settings.encodeHTMLEntities ? htmlSpecialCharsEntityEncode(decodeURIComponent(kvp[1])) : decodeURIComponent(kvp[1]);
+                            formInnerHtml += '<input type="hidden" name="' + key + '" value="' + value + '" />';
+                        }
+                    });
+                }
+
+                if (isOtherMobileBrowser) {
+
+                    $form = $("<form>").appendTo("body");
+                    $form.hide()
+                        .prop('method', settings.httpMethod)
+                        .prop('action', fileUrl)
+                        .html(formInnerHtml);
+
+                } else {
+
+                    if (isIos) {
+
+                        downloadWindow = window.open("about:blank");
+                        downloadWindow.document.title = settings.popupWindowTitle;
+                        formDoc = downloadWindow.document;
+                        window.focus();
+
+                    } else {
+
+                        $iframe = $("<iframe style='display: none' src='about:blank'></iframe>").appendTo("body");
+                        formDoc = getiframeDocument($iframe);
+                    }
+
+                    formDoc.write("<html><head></head><body><form method='" + settings.httpMethod + "' action='" + fileUrl + "'>" + formInnerHtml + "</form>" + settings.popupWindowTitle + "</body></html>");
+                    $form = $(formDoc).find('form');
+                }
+
+                $form.submit();
+            }
+
+
+            //check if the file download has completed every checkInterval ms
+            setTimeout(checkFileDownloadComplete, settings.checkInterval);
+
+
+            function checkFileDownloadComplete() {
+                //has the cookie been written due to a file download occuring?
+
+                var cookieValue = settings.cookieValue;
+                if(typeof cookieValue == 'string') {
+                    cookieValue = cookieValue.toLowerCase();
+                }
+
+                var lowerCaseCookie = settings.cookieName.toLowerCase() + "=" + cookieValue;
+
+                if (document.cookie.toLowerCase().indexOf(lowerCaseCookie) > -1) {
+
+                    //execute specified callback
+                    internalCallbacks.onSuccess(fileUrl);
+
+                    //remove cookie
+                    var cookieData = settings.cookieName + "=; path=" + settings.cookiePath + "; expires=" + new Date(0).toUTCString() + ";";
+                    if (settings.cookieDomain) cookieData += " domain=" + settings.cookieDomain + ";";
+                    document.cookie = cookieData;
+
+                    //remove iframe
+                    cleanUp(false);
+
+                    return;
+                }
+
+                //has an error occured?
+                //if neither containers exist below then the file download is occuring on the current window
+                if (downloadWindow || $iframe) {
+
+                    //has an error occured?
+                    try {
+
+                        var formDoc = downloadWindow ? downloadWindow.document : getiframeDocument($iframe);
+
+                        if (formDoc && formDoc.body !== null && formDoc.body.innerHTML.length) {
+
+                            var isFailure = true;
+
+                            if ($form && $form.length) {
+                                var $contents = $(formDoc.body).contents().first();
+
+                                try {
+                                    if ($contents.length && $contents[0] === $form[0]) {
+                                        isFailure = false;
+                                    }
+                                } catch (e) {
+                                    if (e && e.number == -2146828218) {
+                                        // IE 8-10 throw a permission denied after the form reloads on the "$contents[0] === $form[0]" comparison
+                                        isFailure = true;
+                                    } else {
+                                        throw e;
+                                    }
+                                }
+                            }
+
+                            if (isFailure) {
+                                // IE 8-10 don't always have the full content available right away, they need a litle bit to finish
+                                setTimeout(function () {
+                                    internalCallbacks.onFail(formDoc.body.innerHTML, fileUrl);
+                                    cleanUp(true);
+                                }, 100);
+
+                                return;
+                            }
+                        }
+                    }
+                    catch (err) {
+
+                        //500 error less than IE9
+                        internalCallbacks.onFail('', fileUrl, err);
+
+                        cleanUp(true);
+
+                        return;
+                    }
+                }
+
+
+                //keep checking...
+                setTimeout(checkFileDownloadComplete, settings.checkInterval);
+            }
+
+            //gets an iframes document in a cross browser compatible manner
+            function getiframeDocument($iframe) {
+                try{
+                    var iframeDoc = $iframe[0].contentWindow || $iframe[0].contentDocument;
+                    if (iframeDoc.document) {
+                        iframeDoc = iframeDoc.document;
+                    }
+                    return iframeDoc;
+                }catch(e){
+                    //鍙兘鏄法鍩�
+                    return null;
+                }
+            }
+
+            function cleanUp(isFailure) {
+
+                setTimeout(function() {
+
+                    if (downloadWindow) {
+
+                        if (isAndroid) {
+                            downloadWindow.close();
+                        }
+
+                        if (isIos) {
+                            if (downloadWindow.focus) {
+                                downloadWindow.focus(); //ios safari bug doesn't allow a window to be closed unless it is focused
+                                if (isFailure) {
+                                    downloadWindow.close();
+                                }
+                            }
+                        }
+                    }
+
+                    //iframe cleanup appears to randomly cause the download to fail
+                    //not doing it seems better than failure...
+                    //if ($iframe) {
+                    //    $iframe.remove();
+                    //}
+
+                }, 0);
+            }
+
+
+            function htmlSpecialCharsEntityEncode(str) {
+                return str.replace(htmlSpecialCharsRegEx, function(match) {
+                    return '&' + htmlSpecialCharsPlaceHolders[match];
+                });
+            }
+            var promise = deferred.promise();
+            promise.abort = function() {
+                cleanUp();
+                $iframe.attr('src', '').html('');
+                internalCallbacks.onAbort(fileUrl);
+            };
+            return promise;
+        }
+    });
+
+})(jQuery, this || window);
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/jquery/jquery.layout.js b/Source/platformProject/platform2022UI/jslib/jquery/jquery.layout.js
new file mode 100644
index 0000000..3b511fa
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/jquery/jquery.layout.js
@@ -0,0 +1,530 @@
+/**
+ * EasyUI for jQuery 1.10.1
+ * 
+ * Copyright (c) 2009-2021 www.jeasyui.com. All rights reserved.
+ *
+ * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php
+ * To use it on other terms please contact us: info@jeasyui.com
+ *
+ */
+(function($){
+var _1=false;
+function _2(_3,_4){
+var _5=$.data(_3,"layout");
+var _6=_5.options;
+var _7=_5.panels;
+var cc=$(_3);
+if(_4){
+$.extend(_6,{width:_4.width,height:_4.height});
+}
+if(_3.tagName.toLowerCase()=="body"){
+cc._size("fit");
+}else{
+cc._size(_6);
+}
+var _8={top:0,left:0,width:cc.width(),height:cc.height()};
+_9(_a(_7.expandNorth)?_7.expandNorth:_7.north,"n");
+_9(_a(_7.expandSouth)?_7.expandSouth:_7.south,"s");
+_b(_a(_7.expandEast)?_7.expandEast:_7.east,"e");
+_b(_a(_7.expandWest)?_7.expandWest:_7.west,"w");
+_7.center.panel("resize",_8);
+function _9(pp,_c){
+if(!pp.length||!_a(pp)){
+return;
+}
+var _d=pp.panel("options");
+pp.panel("resize",{width:cc.width(),height:_d.height});
+var _e=pp.panel("panel").outerHeight();
+pp.panel("move",{left:0,top:(_c=="n"?0:cc.height()-_e)});
+_8.height-=_e;
+if(_c=="n"){
+_8.top+=_e;
+if(!_d.split&&_d.border){
+_8.top--;
+}
+}
+if(!_d.split&&_d.border){
+_8.height++;
+}
+};
+function _b(pp,_f){
+if(!pp.length||!_a(pp)){
+return;
+}
+var _10=pp.panel("options");
+pp.panel("resize",{width:_10.width,height:_8.height});
+var _11=pp.panel("panel").outerWidth();
+pp.panel("move",{left:(_f=="e"?cc.width()-_11:0),top:_8.top});
+_8.width-=_11;
+if(_f=="w"){
+_8.left+=_11;
+if(!_10.split&&_10.border){
+_8.left--;
+}
+}
+if(!_10.split&&_10.border){
+_8.width++;
+}
+};
+};
+function _12(_13){
+var cc=$(_13);
+cc.addClass("layout");
+function _14(el){
+var _15=$.fn.layout.parsePanelOptions(el);
+if("north,south,east,west,center".indexOf(_15.region)>=0){
+_19(_13,_15,el);
+}
+};
+var _16=cc.layout("options");
+var _17=_16.onAdd;
+_16.onAdd=function(){
+};
+cc.find(">div,>form>div").each(function(){
+_14(this);
+});
+_16.onAdd=_17;
+cc.append("<div class=\"layout-split-proxy-h\"></div><div class=\"layout-split-proxy-v\"></div>");
+cc._bind("_resize",function(e,_18){
+if($(this).hasClass("easyui-fluid")||_18){
+_2(_13);
+}
+return false;
+});
+};
+function _19(_1a,_1b,el){
+_1b.region=_1b.region||"center";
+var _1c=$.data(_1a,"layout").panels;
+var cc=$(_1a);
+var dir=_1b.region;
+if(_1c[dir].length){
+return;
+}
+var pp=$(el);
+if(!pp.length){
+pp=$("<div></div>").appendTo(cc);
+}
+var _1d=$.extend({},$.fn.layout.paneldefaults,{width:(pp.length?parseInt(pp[0].style.width)||pp.outerWidth():"auto"),height:(pp.length?parseInt(pp[0].style.height)||pp.outerHeight():"auto"),doSize:false,collapsible:true,onOpen:function(){
+var _1e=$(this).panel("header").children("div.panel-tool");
+_1e.children("a.panel-tool-collapse").hide();
+var _1f={north:"up",south:"down",east:"right",west:"left"};
+if(!_1f[dir]){
+return;
+}
+var _20="layout-button-"+_1f[dir];
+var t=_1e.children("a."+_20);
+if(!t.length){
+t=$("<a href=\"javascript:;\"></a>").addClass(_20).appendTo(_1e);
+t._bind("click",{dir:dir},function(e){
+_39(_1a,e.data.dir);
+return false;
+});
+}
+$(this).panel("options").collapsible?t.show():t.hide();
+}},_1b,{cls:((_1b.cls||"")+" layout-panel layout-panel-"+dir),bodyCls:((_1b.bodyCls||"")+" layout-body")});
+pp.panel(_1d);
+_1c[dir]=pp;
+var _21={north:"s",south:"n",east:"w",west:"e"};
+var _22=pp.panel("panel");
+if(pp.panel("options").split){
+_22.addClass("layout-split-"+dir);
+}
+_22.resizable($.extend({},{handles:(_21[dir]||""),disabled:(!pp.panel("options").split),onStartResize:function(e){
+_1=true;
+if(dir=="north"||dir=="south"){
+var _23=$(">div.layout-split-proxy-v",_1a);
+}else{
+var _23=$(">div.layout-split-proxy-h",_1a);
+}
+var top=0,_24=0,_25=0,_26=0;
+var pos={display:"block"};
+if(dir=="north"){
+pos.top=parseInt(_22.css("top"))+_22.outerHeight()-_23.height();
+pos.left=parseInt(_22.css("left"));
+pos.width=_22.outerWidth();
+pos.height=_23.height();
+}else{
+if(dir=="south"){
+pos.top=parseInt(_22.css("top"));
+pos.left=parseInt(_22.css("left"));
+pos.width=_22.outerWidth();
+pos.height=_23.height();
+}else{
+if(dir=="east"){
+pos.top=parseInt(_22.css("top"))||0;
+pos.left=parseInt(_22.css("left"))||0;
+pos.width=_23.width();
+pos.height=_22.outerHeight();
+}else{
+if(dir=="west"){
+pos.top=parseInt(_22.css("top"))||0;
+pos.left=_22.outerWidth()-_23.width();
+pos.width=_23.width();
+pos.height=_22.outerHeight();
+}
+}
+}
+}
+_23.css(pos);
+$("<div class=\"layout-mask\"></div>").css({left:0,top:0,width:cc.width(),height:cc.height()}).appendTo(cc);
+},onResize:function(e){
+if(dir=="north"||dir=="south"){
+var _27=_28(this);
+$(this).resizable("options").maxHeight=_27;
+var _29=$(">div.layout-split-proxy-v",_1a);
+var top=dir=="north"?e.data.height-_29.height():$(_1a).height()-e.data.height;
+_29.css("top",top);
+}else{
+var _2a=_28(this);
+$(this).resizable("options").maxWidth=_2a;
+var _29=$(">div.layout-split-proxy-h",_1a);
+var _2b=dir=="west"?e.data.width-_29.width():$(_1a).width()-e.data.width;
+_29.css("left",_2b);
+}
+return false;
+},onStopResize:function(e){
+cc.children("div.layout-split-proxy-v,div.layout-split-proxy-h").hide();
+pp.panel("resize",e.data);
+_2(_1a);
+_1=false;
+cc.find(">div.layout-mask").remove();
+}},_1b));
+cc.layout("options").onAdd.call(_1a,dir);
+function _28(p){
+var _2c="expand"+dir.substring(0,1).toUpperCase()+dir.substring(1);
+var _2d=_1c["center"];
+var _2e=(dir=="north"||dir=="south")?"minHeight":"minWidth";
+var _2f=(dir=="north"||dir=="south")?"maxHeight":"maxWidth";
+var _30=(dir=="north"||dir=="south")?"_outerHeight":"_outerWidth";
+var _31=$.parser.parseValue(_2f,_1c[dir].panel("options")[_2f],$(_1a));
+var _32=$.parser.parseValue(_2e,_2d.panel("options")[_2e],$(_1a));
+var _33=_2d.panel("panel")[_30]()-_32;
+if(_a(_1c[_2c])){
+_33+=_1c[_2c][_30]()-1;
+}else{
+_33+=$(p)[_30]();
+}
+if(_33>_31){
+_33=_31;
+}
+return _33;
+};
+};
+function _34(_35,_36){
+var _37=$.data(_35,"layout").panels;
+if(_37[_36].length){
+_37[_36].panel("destroy");
+_37[_36]=$();
+var _38="expand"+_36.substring(0,1).toUpperCase()+_36.substring(1);
+if(_37[_38]){
+_37[_38].panel("destroy");
+_37[_38]=undefined;
+}
+$(_35).layout("options").onRemove.call(_35,_36);
+}
+};
+function _39(_3a,_3b,_3c){
+if(_3c==undefined){
+_3c="normal";
+}
+var _3d=$.data(_3a,"layout");
+var _3e=_3d.panels;
+var p=_3e[_3b];
+var _3f=p.panel("options");
+if(_3f.onBeforeCollapse.call(p)==false){
+return;
+}
+var _40="expand"+_3b.substring(0,1).toUpperCase()+_3b.substring(1);
+if(!_3e[_40]){
+_3e[_40]=_41(_3b);
+var ep=_3e[_40].panel("panel");
+if(!_3f.expandMode){
+ep.css("cursor","default");
+}else{
+ep._bind("click",function(){
+if(_3f.expandMode=="dock"){
+_53(_3a,_3b);
+}else{
+p.panel("expand",false).panel("open");
+var _42=_43();
+p.panel("resize",_42.collapse);
+p.panel("panel")._unbind(".layout")._bind("mouseleave.layout",{region:_3b},function(e){
+var _44=this;
+_3d.collapseTimer=setTimeout(function(){
+$(_44).stop(true,true);
+if(_1==true){
+return;
+}
+if($("body>div.combo-p>div.combo-panel:visible").length){
+return;
+}
+_39(_3a,e.data.region);
+},_3d.options.collapseDelay);
+});
+p.panel("panel").animate(_42.expand,function(){
+$(_3a).layout("options").onExpand.call(_3a,_3b);
+});
+}
+return false;
+});
+}
+}
+var _45=_43();
+if(!_a(_3e[_40])){
+_3e.center.panel("resize",_45.resizeC);
+}
+p.panel("panel").animate(_45.collapse,_3c,function(){
+p.panel("collapse",false).panel("close");
+_3e[_40].panel("open").panel("resize",_45.expandP);
+$(this)._unbind(".layout");
+$(_3a).layout("options").onCollapse.call(_3a,_3b);
+});
+function _41(dir){
+var _46={"east":"left","west":"right","north":"down","south":"up"};
+var _47=(_3f.region=="north"||_3f.region=="south");
+var _48="layout-button-"+_46[dir];
+var p=$("<div></div>").appendTo(_3a);
+p.panel($.extend({},$.fn.layout.paneldefaults,{cls:("layout-expand layout-expand-"+dir),title:"&nbsp;",titleDirection:_3f.titleDirection,iconCls:(_3f.hideCollapsedContent?null:_3f.iconCls),closed:true,minWidth:0,minHeight:0,doSize:false,region:_3f.region,collapsedSize:_3f.collapsedSize,noheader:(!_47&&_3f.hideExpandTool),tools:((_47&&_3f.hideExpandTool)?null:[{iconCls:_48,handler:function(){
+_53(_3a,_3b);
+return false;
+}}]),onResize:function(){
+var _49=$(this).children(".layout-expand-title");
+if(_49.length){
+var _4a=$(this).children(".panel-icon");
+var _4b=_4a.length>0?(_4a._outerHeight()+2):0;
+_49._outerWidth($(this).height()-_4b);
+var _4c=($(this).width()-Math.min(_49._outerWidth(),_49._outerHeight()))/2;
+var top=Math.max(_49._outerWidth(),_49._outerHeight());
+if(_49.hasClass("layout-expand-title-down")){
+_4c+=Math.min(_49._outerWidth(),_49._outerHeight());
+top=0;
+}
+top+=_4b;
+_49.css({left:(_4c+"px"),top:(top+"px")});
+}
+}}));
+if(!_3f.hideCollapsedContent){
+var _4d=typeof _3f.collapsedContent=="function"?_3f.collapsedContent.call(p[0],_3f.title):_3f.collapsedContent;
+_47?p.panel("setTitle",_4d):p.html(_4d);
+}
+p.panel("panel").hover(function(){
+$(this).addClass("layout-expand-over");
+},function(){
+$(this).removeClass("layout-expand-over");
+});
+return p;
+};
+function _43(){
+var cc=$(_3a);
+var _4e=_3e.center.panel("options");
+var _4f=_3f.collapsedSize;
+if(_3b=="east"){
+var _50=p.panel("panel")._outerWidth();
+var _51=_4e.width+_50-_4f;
+if(_3f.split||!_3f.border){
+_51++;
+}
+return {resizeC:{width:_51},expand:{left:cc.width()-_50},expandP:{top:_4e.top,left:cc.width()-_4f,width:_4f,height:_4e.height},collapse:{left:cc.width(),top:_4e.top,height:_4e.height}};
+}else{
+if(_3b=="west"){
+var _50=p.panel("panel")._outerWidth();
+var _51=_4e.width+_50-_4f;
+if(_3f.split||!_3f.border){
+_51++;
+}
+return {resizeC:{width:_51,left:_4f-1},expand:{left:0},expandP:{left:0,top:_4e.top,width:_4f,height:_4e.height},collapse:{left:-_50,top:_4e.top,height:_4e.height}};
+}else{
+if(_3b=="north"){
+var _52=p.panel("panel")._outerHeight();
+var hh=_4e.height;
+if(!_a(_3e.expandNorth)){
+hh+=_52-_4f+((_3f.split||!_3f.border)?1:0);
+}
+_3e.east.add(_3e.west).add(_3e.expandEast).add(_3e.expandWest).panel("resize",{top:_4f-1,height:hh});
+return {resizeC:{top:_4f-1,height:hh},expand:{top:0},expandP:{top:0,left:0,width:cc.width(),height:_4f},collapse:{top:-_52,width:cc.width()}};
+}else{
+if(_3b=="south"){
+var _52=p.panel("panel")._outerHeight();
+var hh=_4e.height;
+if(!_a(_3e.expandSouth)){
+hh+=_52-_4f+((_3f.split||!_3f.border)?1:0);
+}
+_3e.east.add(_3e.west).add(_3e.expandEast).add(_3e.expandWest).panel("resize",{height:hh});
+return {resizeC:{height:hh},expand:{top:cc.height()-_52},expandP:{top:cc.height()-_4f,left:0,width:cc.width(),height:_4f},collapse:{top:cc.height(),width:cc.width()}};
+}
+}
+}
+}
+};
+};
+function _53(_54,_55){
+var _56=$.data(_54,"layout").panels;
+var p=_56[_55];
+var _57=p.panel("options");
+if(_57.onBeforeExpand.call(p)==false){
+return;
+}
+var _58="expand"+_55.substring(0,1).toUpperCase()+_55.substring(1);
+if(_56[_58]){
+_56[_58].panel("close");
+p.panel("panel").stop(true,true);
+p.panel("expand",false).panel("open");
+var _59=_5a();
+p.panel("resize",_59.collapse);
+p.panel("panel").animate(_59.expand,function(){
+_2(_54);
+$(_54).layout("options").onExpand.call(_54,_55);
+});
+}
+function _5a(){
+var cc=$(_54);
+var _5b=_56.center.panel("options");
+if(_55=="east"&&_56.expandEast){
+return {collapse:{left:cc.width(),top:_5b.top,height:_5b.height},expand:{left:cc.width()-p.panel("panel")._outerWidth()}};
+}else{
+if(_55=="west"&&_56.expandWest){
+return {collapse:{left:-p.panel("panel")._outerWidth(),top:_5b.top,height:_5b.height},expand:{left:0}};
+}else{
+if(_55=="north"&&_56.expandNorth){
+return {collapse:{top:-p.panel("panel")._outerHeight(),width:cc.width()},expand:{top:0}};
+}else{
+if(_55=="south"&&_56.expandSouth){
+return {collapse:{top:cc.height(),width:cc.width()},expand:{top:cc.height()-p.panel("panel")._outerHeight()}};
+}
+}
+}
+}
+};
+};
+function _a(pp){
+if(!pp){
+return false;
+}
+if(pp.length){
+return pp.panel("panel").is(":visible");
+}else{
+return false;
+}
+};
+function _5c(_5d){
+var _5e=$.data(_5d,"layout");
+var _5f=_5e.options;
+var _60=_5e.panels;
+var _61=_5f.onCollapse;
+_5f.onCollapse=function(){
+};
+_62("east");
+_62("west");
+_62("north");
+_62("south");
+_5f.onCollapse=_61;
+function _62(_63){
+var p=_60[_63];
+if(p.length&&p.panel("options").collapsed){
+_39(_5d,_63,0);
+}
+};
+};
+function _64(_65,_66,_67){
+var p=$(_65).layout("panel",_66);
+p.panel("options").split=_67;
+var cls="layout-split-"+_66;
+var _68=p.panel("panel").removeClass(cls);
+if(_67){
+_68.addClass(cls);
+}
+_68.resizable({disabled:(!_67)});
+_2(_65);
+};
+$.fn.layout=function(_69,_6a){
+if(typeof _69=="string"){
+return $.fn.layout.methods[_69](this,_6a);
+}
+_69=_69||{};
+return this.each(function(){
+var _6b=$.data(this,"layout");
+if(_6b){
+$.extend(_6b.options,_69);
+}else{
+var _6c=$.extend({},$.fn.layout.defaults,$.fn.layout.parseOptions(this),_69);
+$.data(this,"layout",{options:_6c,panels:{center:$(),north:$(),south:$(),east:$(),west:$()}});
+_12(this);
+}
+_2(this);
+_5c(this);
+});
+};
+$.fn.layout.methods={options:function(jq){
+return $.data(jq[0],"layout").options;
+},resize:function(jq,_6d){
+return jq.each(function(){
+_2(this,_6d);
+});
+},panel:function(jq,_6e){
+return $.data(jq[0],"layout").panels[_6e];
+},collapse:function(jq,_6f){
+return jq.each(function(){
+_39(this,_6f);
+});
+},expand:function(jq,_70){
+return jq.each(function(){
+_53(this,_70);
+});
+},add:function(jq,_71){
+return jq.each(function(){
+_19(this,_71);
+_2(this);
+if($(this).layout("panel",_71.region).panel("options").collapsed){
+_39(this,_71.region,0);
+}
+});
+},remove:function(jq,_72){
+return jq.each(function(){
+_34(this,_72);
+_2(this);
+});
+},split:function(jq,_73){
+return jq.each(function(){
+_64(this,_73,true);
+});
+},unsplit:function(jq,_74){
+return jq.each(function(){
+_64(this,_74,false);
+});
+},stopCollapsing:function(jq){
+return jq.each(function(){
+clearTimeout($(this).data("layout").collapseTimer);
+});
+}};
+$.fn.layout.parseOptions=function(_75){
+return $.extend({},$.parser.parseOptions(_75,[{fit:"boolean"}]));
+};
+$.fn.layout.defaults={fit:false,onExpand:function(_76){
+},onCollapse:function(_77){
+},onAdd:function(_78){
+},onRemove:function(_79){
+}};
+$.fn.layout.parsePanelOptions=function(_7a){
+var t=$(_7a);
+return $.extend({},$.fn.panel.parseOptions(_7a),$.parser.parseOptions(_7a,["region",{split:"boolean",collpasedSize:"number",minWidth:"number",minHeight:"number",maxWidth:"number",maxHeight:"number"}]));
+};
+$.fn.layout.paneldefaults=$.extend({},$.fn.panel.defaults,{region:null,split:false,collapseDelay:100,collapsedSize:32,expandMode:"float",hideExpandTool:false,hideCollapsedContent:true,collapsedContent:function(_7b){
+var p=$(this);
+var _7c=p.panel("options");
+if(_7c.region=="north"||_7c.region=="south"){
+return _7b;
+}
+var cc=[];
+if(_7c.iconCls){
+cc.push("<div class=\"panel-icon "+_7c.iconCls+"\"></div>");
+}
+cc.push("<div class=\"panel-title layout-expand-title");
+cc.push(" layout-expand-title-"+_7c.titleDirection);
+cc.push(_7c.iconCls?" layout-expand-with-icon":"");
+cc.push("\">");
+cc.push(_7b);
+cc.push("</div>");
+return cc.join("");
+},minWidth:10,minHeight:10,maxWidth:10000,maxHeight:10000});
+})(jQuery);
+
diff --git a/Source/platformProject/platform2022UI/jslib/jquery/jquery.panel.js b/Source/platformProject/platform2022UI/jslib/jquery/jquery.panel.js
new file mode 100644
index 0000000..5e00ca1
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/jquery/jquery.panel.js
@@ -0,0 +1,694 @@
+/**
+ * EasyUI for jQuery 1.10.1
+ * 
+ * Copyright (c) 2009-2021 www.jeasyui.com. All rights reserved.
+ *
+ * Licensed under the freeware license: http://www.jeasyui.com/license_freeware.php
+ * To use it on other terms please contact us: info@jeasyui.com
+ *
+ */
+(function($){
+$.fn._remove=function(){
+return this.each(function(){
+$(this).remove();
+try{
+this.outerHTML="";
+}
+catch(err){
+}
+});
+};
+function _1(_2){
+_2._remove();
+};
+function _3(_4,_5){
+var _6=$.data(_4,"panel");
+var _7=_6.options;
+var _8=_6.panel;
+var _9=_8.children(".panel-header");
+var _a=_8.children(".panel-body");
+var _b=_8.children(".panel-footer");
+var _c=(_7.halign=="left"||_7.halign=="right");
+if(_5){
+$.extend(_7,{width:_5.width,height:_5.height,minWidth:_5.minWidth,maxWidth:_5.maxWidth,minHeight:_5.minHeight,maxHeight:_5.maxHeight,left:_5.left,top:_5.top});
+_7.hasResized=false;
+}
+var _d=_8.outerWidth();
+var _e=_8.outerHeight();
+_8._size(_7);
+var _f=_8.outerWidth();
+var _10=_8.outerHeight();
+if(_7.hasResized&&(_d==_f&&_e==_10)){
+return;
+}
+_7.hasResized=true;
+if(!_c){
+_9._outerWidth(_8.width());
+}
+_a._outerWidth(_8.width());
+if(!isNaN(parseInt(_7.height))){
+if(_c){
+if(_7.header){
+var _11=$(_7.header)._outerWidth();
+}else{
+_9.css("width","");
+var _11=_9._outerWidth();
+}
+var _12=_9.find(".panel-title");
+_11+=Math.min(_12._outerWidth(),_12._outerHeight());
+var _13=_8.height();
+_9._outerWidth(_11)._outerHeight(_13);
+_12._outerWidth(_9.height());
+_a._outerWidth(_8.width()-_11-_b._outerWidth())._outerHeight(_13);
+_b._outerHeight(_13);
+_a.css({left:"",right:""});
+if(_9.length){
+_a.css(_7.halign,(_9.position()[_7.halign]+_11)+"px");
+}
+_7.panelCssWidth=_8.css("width");
+if(_7.collapsed){
+_8._outerWidth(_11+_b._outerWidth());
+}
+}else{
+_a._outerHeight(_8.height()-_9._outerHeight()-_b._outerHeight());
+}
+}else{
+_a.css("height","");
+var min=$.parser.parseValue("minHeight",_7.minHeight,_8.parent());
+var max=$.parser.parseValue("maxHeight",_7.maxHeight,_8.parent());
+var _14=_9._outerHeight()+_b._outerHeight()+_8._outerHeight()-_8.height();
+_a._size("minHeight",min?(min-_14):"");
+_a._size("maxHeight",max?(max-_14):"");
+}
+_8.css({height:(_c?undefined:""),minHeight:"",maxHeight:"",left:_7.left,top:_7.top});
+_7.onResize.apply(_4,[_7.width,_7.height]);
+$(_4).panel("doLayout");
+};
+function _15(_16,_17){
+var _18=$.data(_16,"panel");
+var _19=_18.options;
+var _1a=_18.panel;
+if(_17){
+if(_17.left!=null){
+_19.left=_17.left;
+}
+if(_17.top!=null){
+_19.top=_17.top;
+}
+}
+_1a.css({left:_19.left,top:_19.top});
+_1a.find(".tooltip-f").each(function(){
+$(this).tooltip("reposition");
+});
+_19.onMove.apply(_16,[_19.left,_19.top]);
+};
+function _1b(_1c){
+$(_1c).addClass("panel-body")._size("clear");
+var _1d=$("<div class=\"panel\"></div>").insertBefore(_1c);
+_1d[0].appendChild(_1c);
+_1d._bind("_resize",function(e,_1e){
+if($(this).hasClass("easyui-fluid")||_1e){
+_3(_1c,{});
+}
+return false;
+});
+return _1d;
+};
+function _1f(_20){
+var _21=$.data(_20,"panel");
+var _22=_21.options;
+var _23=_21.panel;
+_23.css(_22.style);
+_23.addClass(_22.cls);
+_23.removeClass("panel-hleft panel-hright").addClass("panel-h"+_22.halign);
+_24();
+_25();
+var _26=$(_20).panel("header");
+var _27=$(_20).panel("body");
+var _28=$(_20).siblings(".panel-footer");
+if(_22.border){
+_26.removeClass("panel-header-noborder");
+_27.removeClass("panel-body-noborder");
+_28.removeClass("panel-footer-noborder");
+}else{
+_26.addClass("panel-header-noborder");
+_27.addClass("panel-body-noborder");
+_28.addClass("panel-footer-noborder");
+}
+_26.addClass(_22.headerCls);
+_27.addClass(_22.bodyCls);
+$(_20).attr("id",_22.id||"");
+if(_22.content){
+$(_20).panel("clear");
+$(_20).html(_22.content);
+$.parser.parse($(_20));
+}
+function _24(){
+if(_22.noheader||(!_22.title&&!_22.header)){
+_1(_23.children(".panel-header"));
+_23.children(".panel-body").addClass("panel-body-noheader");
+}else{
+if(_22.header){
+$(_22.header).addClass("panel-header").prependTo(_23);
+}else{
+var _29=_23.children(".panel-header");
+if(!_29.length){
+_29=$("<div class=\"panel-header\"></div>").prependTo(_23);
+}
+if(!$.isArray(_22.tools)){
+_29.find("div.panel-tool .panel-tool-a").appendTo(_22.tools);
+}
+_29.empty();
+var _2a=$("<div class=\"panel-title\"></div>").html(_22.title).appendTo(_29);
+if(_22.iconCls){
+_2a.addClass("panel-with-icon");
+$("<div class=\"panel-icon\"></div>").addClass(_22.iconCls).appendTo(_29);
+}
+if(_22.halign=="left"||_22.halign=="right"){
+_2a.addClass("panel-title-"+_22.titleDirection);
+}
+var _2b=$("<div class=\"panel-tool\"></div>").appendTo(_29);
+_2b._bind("click",function(e){
+e.stopPropagation();
+});
+if(_22.tools){
+if($.isArray(_22.tools)){
+$.map(_22.tools,function(t){
+_2c(_2b,t.iconCls,eval(t.handler));
+});
+}else{
+$(_22.tools).children().each(function(){
+$(this).addClass($(this).attr("iconCls")).addClass("panel-tool-a").appendTo(_2b);
+});
+}
+}
+if(_22.collapsible){
+_2c(_2b,"panel-tool-collapse",function(){
+if(_22.collapsed==true){
+_57(_20,true);
+}else{
+_43(_20,true);
+}
+});
+}
+if(_22.minimizable){
+_2c(_2b,"panel-tool-min",function(){
+_62(_20);
+});
+}
+if(_22.maximizable){
+_2c(_2b,"panel-tool-max",function(){
+if(_22.maximized==true){
+_66(_20);
+}else{
+_42(_20);
+}
+});
+}
+if(_22.closable){
+_2c(_2b,"panel-tool-close",function(){
+_44(_20);
+});
+}
+}
+_23.children("div.panel-body").removeClass("panel-body-noheader");
+}
+};
+function _2c(c,_2d,_2e){
+var a=$("<a href=\"javascript:;\"></a>").addClass(_2d).appendTo(c);
+a._bind("click",_2e);
+};
+function _25(){
+if(_22.footer){
+$(_22.footer).addClass("panel-footer").appendTo(_23);
+$(_20).addClass("panel-body-nobottom");
+}else{
+_23.children(".panel-footer").remove();
+$(_20).removeClass("panel-body-nobottom");
+}
+};
+};
+function _2f(_30,_31){
+var _32=$.data(_30,"panel");
+var _33=_32.options;
+if(_34){
+_33.queryParams=_31;
+}
+if(!_33.href){
+return;
+}
+if(!_32.isLoaded||!_33.cache){
+var _34=$.extend({},_33.queryParams);
+if(_33.onBeforeLoad.call(_30,_34)==false){
+return;
+}
+_32.isLoaded=false;
+if(_33.loadingMessage){
+$(_30).panel("clear");
+$(_30).html($("<div class=\"panel-loading\"></div>").html(_33.loadingMessage));
+}
+_33.loader.call(_30,_34,function(_35){
+var _36=_33.extractor.call(_30,_35);
+$(_30).panel("clear");
+$(_30).html(_36);
+$.parser.parse($(_30));
+_33.onLoad.apply(_30,arguments);
+_32.isLoaded=true;
+},function(){
+_33.onLoadError.apply(_30,arguments);
+});
+}
+};
+function _37(_38){
+var t=$(_38);
+t.find(".combo-f").each(function(){
+$(this).combo("destroy");
+});
+t.find(".m-btn").each(function(){
+$(this).menubutton("destroy");
+});
+t.find(".s-btn").each(function(){
+$(this).splitbutton("destroy");
+});
+t.find(".tooltip-f").each(function(){
+$(this).tooltip("destroy");
+});
+t.children("div").each(function(){
+$(this)._size("unfit");
+});
+t.empty();
+};
+function _39(_3a){
+$(_3a).panel("doLayout",true);
+};
+function _3b(_3c,_3d){
+var _3e=$.data(_3c,"panel");
+var _3f=_3e.options;
+var _40=_3e.panel;
+if(_3d!=true){
+if(_3f.onBeforeOpen.call(_3c)==false){
+return;
+}
+}
+_40.stop(true,true);
+if($.isFunction(_3f.openAnimation)){
+_3f.openAnimation.call(_3c,cb);
+}else{
+switch(_3f.openAnimation){
+case "slide":
+_40.slideDown(_3f.openDuration,cb);
+break;
+case "fade":
+_40.fadeIn(_3f.openDuration,cb);
+break;
+case "show":
+_40.show(_3f.openDuration,cb);
+break;
+default:
+_40.show();
+cb();
+}
+}
+function cb(){
+_3f.closed=false;
+_3f.minimized=false;
+var _41=_40.children(".panel-header").find("a.panel-tool-restore");
+if(_41.length){
+_3f.maximized=true;
+}
+_3f.onOpen.call(_3c);
+if(_3f.maximized==true){
+_3f.maximized=false;
+_42(_3c);
+}
+if(_3f.collapsed==true){
+_3f.collapsed=false;
+_43(_3c);
+}
+if(!_3f.collapsed){
+if(_3f.href&&(!_3e.isLoaded||!_3f.cache)){
+_2f(_3c);
+_39(_3c);
+_3f.doneLayout=true;
+}
+}
+if(!_3f.doneLayout){
+_3f.doneLayout=true;
+_39(_3c);
+}
+};
+};
+function _44(_45,_46){
+var _47=$.data(_45,"panel");
+var _48=_47.options;
+var _49=_47.panel;
+if(_46!=true){
+if(_48.onBeforeClose.call(_45)==false){
+return;
+}
+}
+_49.find(".tooltip-f").each(function(){
+$(this).tooltip("hide");
+});
+_49.stop(true,true);
+_49._size("unfit");
+if($.isFunction(_48.closeAnimation)){
+_48.closeAnimation.call(_45,cb);
+}else{
+switch(_48.closeAnimation){
+case "slide":
+_49.slideUp(_48.closeDuration,cb);
+break;
+case "fade":
+_49.fadeOut(_48.closeDuration,cb);
+break;
+case "hide":
+_49.hide(_48.closeDuration,cb);
+break;
+default:
+_49.hide();
+cb();
+}
+}
+function cb(){
+_48.closed=true;
+_48.onClose.call(_45);
+};
+};
+function _4a(_4b,_4c){
+var _4d=$.data(_4b,"panel");
+var _4e=_4d.options;
+var _4f=_4d.panel;
+if(_4c!=true){
+if(_4e.onBeforeDestroy.call(_4b)==false){
+return;
+}
+}
+$(_4b).panel("clear").panel("clear","footer");
+_1(_4f);
+_4e.onDestroy.call(_4b);
+};
+function _43(_50,_51){
+var _52=$.data(_50,"panel").options;
+var _53=$.data(_50,"panel").panel;
+var _54=_53.children(".panel-body");
+var _55=_53.children(".panel-header");
+var _56=_55.find("a.panel-tool-collapse");
+if(_52.collapsed==true){
+return;
+}
+_54.stop(true,true);
+if(_52.onBeforeCollapse.call(_50)==false){
+return;
+}
+_56.addClass("panel-tool-expand");
+if(_51==true){
+if(_52.halign=="left"||_52.halign=="right"){
+_53.animate({width:_55._outerWidth()+_53.children(".panel-footer")._outerWidth()},function(){
+cb();
+});
+}else{
+_54.slideUp("normal",function(){
+cb();
+});
+}
+}else{
+if(_52.halign=="left"||_52.halign=="right"){
+_53._outerWidth(_55._outerWidth()+_53.children(".panel-footer")._outerWidth());
+}
+cb();
+}
+function cb(){
+_54.hide();
+_52.collapsed=true;
+_52.onCollapse.call(_50);
+};
+};
+function _57(_58,_59){
+var _5a=$.data(_58,"panel").options;
+var _5b=$.data(_58,"panel").panel;
+var _5c=_5b.children(".panel-body");
+var _5d=_5b.children(".panel-header").find("a.panel-tool-collapse");
+if(_5a.collapsed==false){
+return;
+}
+_5c.stop(true,true);
+if(_5a.onBeforeExpand.call(_58)==false){
+return;
+}
+_5d.removeClass("panel-tool-expand");
+if(_59==true){
+if(_5a.halign=="left"||_5a.halign=="right"){
+_5c.show();
+_5b.animate({width:_5a.panelCssWidth},function(){
+cb();
+});
+}else{
+_5c.slideDown("normal",function(){
+cb();
+});
+}
+}else{
+if(_5a.halign=="left"||_5a.halign=="right"){
+_5b.css("width",_5a.panelCssWidth);
+}
+cb();
+}
+function cb(){
+_5c.show();
+_5a.collapsed=false;
+_5a.onExpand.call(_58);
+_2f(_58);
+_39(_58);
+};
+};
+function _42(_5e){
+var _5f=$.data(_5e,"panel").options;
+var _60=$.data(_5e,"panel").panel;
+var _61=_60.children(".panel-header").find("a.panel-tool-max");
+if(_5f.maximized==true){
+return;
+}
+_61.addClass("panel-tool-restore");
+if(!$.data(_5e,"panel").original){
+$.data(_5e,"panel").original={width:_5f.width,height:_5f.height,left:_5f.left,top:_5f.top,fit:_5f.fit};
+}
+_5f.left=0;
+_5f.top=0;
+_5f.fit=true;
+_3(_5e);
+_5f.minimized=false;
+_5f.maximized=true;
+_5f.onMaximize.call(_5e);
+};
+function _62(_63){
+var _64=$.data(_63,"panel").options;
+var _65=$.data(_63,"panel").panel;
+_65._size("unfit");
+_65.hide();
+_64.minimized=true;
+_64.maximized=false;
+_64.onMinimize.call(_63);
+};
+function _66(_67){
+var _68=$.data(_67,"panel").options;
+var _69=$.data(_67,"panel").panel;
+var _6a=_69.children(".panel-header").find("a.panel-tool-max");
+if(_68.maximized==false){
+return;
+}
+_69.show();
+_6a.removeClass("panel-tool-restore");
+$.extend(_68,$.data(_67,"panel").original);
+_3(_67);
+_68.minimized=false;
+_68.maximized=false;
+$.data(_67,"panel").original=null;
+_68.onRestore.call(_67);
+};
+function _6b(_6c,_6d){
+$.data(_6c,"panel").options.title=_6d;
+$(_6c).panel("header").find("div.panel-title").html(_6d);
+};
+var _6e=null;
+$(window)._unbind(".panel")._bind("resize.panel",function(){
+if(_6e){
+clearTimeout(_6e);
+}
+_6e=setTimeout(function(){
+var _6f=$("body.layout");
+if(_6f.length){
+_6f.layout("resize");
+$("body").children(".easyui-fluid:visible").each(function(){
+$(this).triggerHandler("_resize");
+});
+}else{
+$("body").panel("doLayout");
+}
+_6e=null;
+},100);
+});
+$.fn.panel=function(_70,_71){
+if(typeof _70=="string"){
+return $.fn.panel.methods[_70](this,_71);
+}
+_70=_70||{};
+return this.each(function(){
+var _72=$.data(this,"panel");
+var _73;
+if(_72){
+_73=$.extend(_72.options,_70);
+_72.isLoaded=false;
+}else{
+_73=$.extend({},$.fn.panel.defaults,$.fn.panel.parseOptions(this),_70);
+$(this).attr("title","");
+_72=$.data(this,"panel",{options:_73,panel:_1b(this),isLoaded:false});
+}
+_1f(this);
+$(this).show();
+if(_73.doSize==true){
+_72.panel.css("display","block");
+_3(this);
+}
+if(_73.closed==true||_73.minimized==true){
+_72.panel.hide();
+}else{
+_3b(this);
+}
+});
+};
+$.fn.panel.methods={options:function(jq){
+return $.data(jq[0],"panel").options;
+},panel:function(jq){
+return $.data(jq[0],"panel").panel;
+},header:function(jq){
+return $.data(jq[0],"panel").panel.children(".panel-header");
+},footer:function(jq){
+return jq.panel("panel").children(".panel-footer");
+},body:function(jq){
+return $.data(jq[0],"panel").panel.children(".panel-body");
+},setTitle:function(jq,_74){
+return jq.each(function(){
+_6b(this,_74);
+});
+},open:function(jq,_75){
+return jq.each(function(){
+_3b(this,_75);
+});
+},close:function(jq,_76){
+return jq.each(function(){
+_44(this,_76);
+});
+},destroy:function(jq,_77){
+return jq.each(function(){
+_4a(this,_77);
+});
+},clear:function(jq,_78){
+return jq.each(function(){
+_37(_78=="footer"?$(this).panel("footer"):this);
+});
+},refresh:function(jq,_79){
+return jq.each(function(){
+var _7a=$.data(this,"panel");
+_7a.isLoaded=false;
+if(_79){
+if(typeof _79=="string"){
+_7a.options.href=_79;
+}else{
+_7a.options.queryParams=_79;
+}
+}
+_2f(this);
+});
+},resize:function(jq,_7b){
+return jq.each(function(){
+_3(this,_7b||{});
+});
+},doLayout:function(jq,all){
+return jq.each(function(){
+_7c(this,"body");
+_7c($(this).siblings(".panel-footer")[0],"footer");
+function _7c(_7d,_7e){
+if(!_7d){
+return;
+}
+var _7f=_7d==$("body")[0];
+var s=$(_7d).find("div.panel:visible,div.accordion:visible,div.tabs-container:visible,div.layout:visible,.easyui-fluid:visible").filter(function(_80,el){
+var p=$(el).parents(".panel-"+_7e+":first");
+return _7f?p.length==0:p[0]==_7d;
+});
+s.each(function(){
+$(this).triggerHandler("_resize",[all||false]);
+});
+};
+});
+},move:function(jq,_81){
+return jq.each(function(){
+_15(this,_81);
+});
+},maximize:function(jq){
+return jq.each(function(){
+_42(this);
+});
+},minimize:function(jq){
+return jq.each(function(){
+_62(this);
+});
+},restore:function(jq){
+return jq.each(function(){
+_66(this);
+});
+},collapse:function(jq,_82){
+return jq.each(function(){
+_43(this,_82);
+});
+},expand:function(jq,_83){
+return jq.each(function(){
+_57(this,_83);
+});
+}};
+$.fn.panel.parseOptions=function(_84){
+var t=$(_84);
+var hh=t.children(".panel-header,header");
+var ff=t.children(".panel-footer,footer");
+return $.extend({},$.parser.parseOptions(_84,["id","width","height","left","top","title","iconCls","cls","headerCls","bodyCls","tools","href","method","header","footer","halign","titleDirection",{cache:"boolean",fit:"boolean",border:"boolean",noheader:"boolean"},{collapsible:"boolean",minimizable:"boolean",maximizable:"boolean"},{closable:"boolean",collapsed:"boolean",minimized:"boolean",maximized:"boolean",closed:"boolean"},"openAnimation","closeAnimation",{openDuration:"number",closeDuration:"number"},]),{loadingMessage:(t.attr("loadingMessage")!=undefined?t.attr("loadingMessage"):undefined),header:(hh.length?hh.removeClass("panel-header"):undefined),footer:(ff.length?ff.removeClass("panel-footer"):undefined)});
+};
+$.fn.panel.defaults={id:null,title:null,iconCls:null,width:"auto",height:"auto",left:null,top:null,cls:null,headerCls:null,bodyCls:null,style:{},href:null,cache:true,fit:false,border:true,doSize:true,noheader:false,content:null,halign:"top",titleDirection:"down",collapsible:false,minimizable:false,maximizable:false,closable:false,collapsed:false,minimized:false,maximized:false,closed:false,openAnimation:false,openDuration:400,closeAnimation:false,closeDuration:400,tools:null,footer:null,header:null,queryParams:{},method:"get",href:null,loadingMessage:"Loading...",loader:function(_85,_86,_87){
+var _88=$(this).panel("options");
+if(!_88.href){
+return false;
+}
+$.ajax({type:_88.method,url:_88.href,cache:false,data:_85,dataType:"html",success:function(_89){
+_86(_89);
+},error:function(){
+_87.apply(this,arguments);
+}});
+},extractor:function(_8a){
+var _8b=/<body[^>]*>((.|[\n\r])*)<\/body>/im;
+var _8c=_8b.exec(_8a);
+if(_8c){
+return _8c[1];
+}else{
+return _8a;
+}
+},onBeforeLoad:function(_8d){
+},onLoad:function(){
+},onLoadError:function(){
+},onBeforeOpen:function(){
+},onOpen:function(){
+},onBeforeClose:function(){
+},onClose:function(){
+},onBeforeDestroy:function(){
+},onDestroy:function(){
+},onResize:function(_8e,_8f){
+},onMove:function(_90,top){
+},onMaximize:function(){
+},onRestore:function(){
+},onMinimize:function(){
+},onBeforeCollapse:function(){
+},onBeforeExpand:function(){
+},onCollapse:function(){
+},onExpand:function(){
+}};
+})(jQuery);
+
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/kindeditor-all-min.js b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/kindeditor-all-min.js
new file mode 100644
index 0000000..4485a41
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/kindeditor-all-min.js
@@ -0,0 +1,352 @@
+/* KindEditor 4.1.7 (2013-04-21), Copyright (C) kindsoft.net, Licence: http://www.kindsoft.net/license.php */(function(b,d){function g(a){if(!a)return!1;return Object.prototype.toString.call(a)==="[object Array]"}function l(a){if(!a)return!1;return Object.prototype.toString.call(a)==="[object Function]"}function e(a,c){for(var f=0,b=c.length;f<b;f++)if(a===c[f])return f;return-1}function h(a,c){if(g(a))for(var f=0,b=a.length;f<b;f++){if(c.call(a[f],f,a[f])===!1)break}else for(f in a)if(a.hasOwnProperty(f)&&c.call(a[f],f,a[f])===!1)break}function m(a){return a.replace(/(?:^[ \t\n\r]+)|(?:[ \t\n\r]+$)/g,"")}
+function n(a,c,f){f=f===d?",":f;return(f+c+f).indexOf(f+a+f)>=0}function j(a,c){c=c||"px";return a&&/^\d+$/.test(a)?a+c:a}function o(a){var c;return a&&(c=/(\d+)/.exec(a))?parseInt(c[1],10):0}function s(a){return a.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function t(a){return a.replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&quot;/g,'"').replace(/&amp;/g,"&")}function p(a){var c=a.split("-"),a="";h(c,function(c,b){a+=c>0?b.charAt(0).toUpperCase()+
+b.substr(1):b});return a}function q(a){function c(a){a=parseInt(a,10).toString(16).toUpperCase();return a.length>1?a:"0"+a}return a.replace(/rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/ig,function(a,b,d,k){return"#"+c(b)+c(d)+c(k)})}function z(a,c){var c=c===d?",":c,f={},b=g(a)?a:a.split(c),u;h(b,function(a,c){if(u=/^(\d+)\.\.(\d+)$/.exec(c))for(var b=parseInt(u[1],10);b<=parseInt(u[2],10);b++)f[b.toString()]=!0;else f[c]=!0});return f}function D(a,c){return Array.prototype.slice.call(a,c||0)}function r(a,
+c){return a===d?c:a}function A(a,c,f){f||(f=c,c=null);var b;if(c){var d=function(){};d.prototype=c.prototype;b=new d;h(f,function(a,c){b[a]=c})}else b=f;b.constructor=a;a.prototype=b;a.parent=c?c.prototype:null}function w(a){var c;if(c=/\{[\s\S]*\}|\[[\s\S]*\]/.exec(a))a=c[0];c=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;c.lastIndex=0;c.test(a)&&(a=a.replace(c,function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)}));
+if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return eval("("+a+")");throw"JSON parse error";}function H(a,c,f){a.addEventListener?a.addEventListener(c,f,db):a.attachEvent&&a.attachEvent("on"+c,f)}function v(a,c,f){a.removeEventListener?a.removeEventListener(c,f,db):a.detachEvent&&a.detachEvent("on"+c,f)}function E(a,c){this.init(a,c)}function U(a){try{delete a[la]}catch(c){a.removeAttribute&&
+a.removeAttribute(la)}}function F(a,c,f){if(c.indexOf(",")>=0)h(c.split(","),function(){F(a,this,f)});else{var b=a[la]||null;b||(a[la]=++eb,b=eb);L[b]===d&&(L[b]={});var u=L[b][c];u&&u.length>0?v(a,c,u[0]):(L[b][c]=[],L[b].el=a);u=L[b][c];u.length===0&&(u[0]=function(c){var f=c?new E(a,c):d;h(u,function(c,b){c>0&&b&&b.call(a,f)})});e(f,u)<0&&u.push(f);H(a,c,u[0])}}function N(a,c,f){if(c&&c.indexOf(",")>=0)h(c.split(","),function(){N(a,this,f)});else{var b=a[la]||null;if(b)if(c===d)b in L&&(h(L[b],
+function(c,f){c!="el"&&f.length>0&&v(a,c,f[0])}),delete L[b],U(a));else if(L[b]){var u=L[b][c];if(u&&u.length>0){f===d?(v(a,c,u[0]),delete L[b][c]):(h(u,function(a,c){a>0&&c===f&&u.splice(a,1)}),u.length==1&&(v(a,c,u[0]),delete L[b][c]));var k=0;h(L[b],function(){k++});k<2&&(delete L[b],U(a))}}}}function ea(a,c){if(c.indexOf(",")>=0)h(c.split(","),function(){ea(a,this)});else{var f=a[la]||null;if(f){var b=L[f][c];if(L[f]&&b&&b.length>0)b[0]()}}}function V(a,c,f){c=/^\d{2,}$/.test(c)?c:c.toUpperCase().charCodeAt(0);
+F(a,"keydown",function(b){b.ctrlKey&&b.which==c&&!b.shiftKey&&!b.altKey&&(f.call(a),b.stop())})}function Q(a){for(var c={},f=/\s*([\w\-]+)\s*:([^;]*)(;|$)/g,b;b=f.exec(a);){var d=m(b[1].toLowerCase());b=m(q(b[2]));c[d]=b}return c}function G(a){for(var c={},f=/\s+(?:([\w\-:]+)|(?:([\w\-:]+)=([^\s"'<>]+))|(?:([\w\-:"]+)="([^"]*)")|(?:([\w\-:"]+)='([^']*)'))(?=(?:\s|\/|>)+)/g,b;b=f.exec(a);){var d=(b[1]||b[2]||b[4]||b[6]).toLowerCase();c[d]=(b[2]?b[3]:b[4]?b[5]:b[7])||""}return c}function S(a,c){return a=
+/\s+class\s*=/.test(a)?a.replace(/(\s+class=["']?)([^"']*)(["']?[\s>])/,function(a,b,d,k){return(" "+d+" ").indexOf(" "+c+" ")<0?d===""?b+c+k:b+d+" "+c+k:a}):a.substr(0,a.length-1)+' class="'+c+'">'}function Y(a){var c="";h(Q(a),function(a,b){c+=a+":"+b+";"});return c}function M(a,c,f,b){function u(a){for(var a=a.split("/"),c=[],f=0,b=a.length;f<b;f++){var d=a[f];d==".."?c.length>0&&c.pop():d!==""&&d!="."&&c.push(d)}return"/"+c.join("/")}function k(c,f){if(a.substr(0,c.length)===c){for(var d=[],u=
+0;u<f;u++)d.push("..");u=".";d.length>0&&(u+="/"+d.join("/"));b=="/"&&(u+="/");return u+a.substr(c.length)}else if(i=/^(.*)\//.exec(c))return k(i[1],++f)}c=r(c,"").toLowerCase();a.substr(0,5)!="data:"&&(a=a.replace(/([^:])\/\//g,"$1/"));if(e(c,["absolute","relative","domain"])<0)return a;f=f||location.protocol+"//"+location.host;if(b===d)var B=location.pathname.match(/^(\/.*)\//),b=B?B[1]:"";var i;if(i=/^(\w+:\/\/[^\/]*)/.exec(a)){if(i[1]!==f)return a}else if(/^\w+:/.test(a))return a;/^\//.test(a)?
+a=f+u(a.substr(1)):/^\w+:\/\//.test(a)||(a=f+u(b+"/"+a));c==="relative"?a=k(f+b,0).substr(2):c==="absolute"&&a.substr(0,f.length)===f&&(a=a.substr(f.length));return a}function J(a,c,f,b,d){var f=f||"",b=r(b,!1),d=r(d,"\t"),k="xx-small,x-small,small,medium,large,x-large,xx-large".split(","),a=a.replace(/(<(?:pre|pre\s[^>]*)>)([\s\S]*?)(<\/pre>)/ig,function(a,c,f,b){return c+f.replace(/<(?:br|br\s[^>]*)>/ig,"\n")+b}),a=a.replace(/<(?:br|br\s[^>]*)\s*\/?>\s*<\/p>/ig,"</p>"),a=a.replace(/(<(?:p|p\s[^>]*)>)\s*(<\/p>)/ig,
+"$1<br />$2"),a=a.replace(/\u200B/g,""),a=a.replace(/\u00A9/g,"&copy;"),B={};c&&(h(c,function(a,c){for(var f=a.split(","),b=0,d=f.length;b<d;b++)B[f[b]]=z(c)}),B.script||(a=a.replace(/(<(?:script|script\s[^>]*)>)([\s\S]*?)(<\/script>)/ig,"")),B.style||(a=a.replace(/(<(?:style|style\s[^>]*)>)([\s\S]*?)(<\/style>)/ig,"")));var i=[],a=a.replace(/([ \t\n\r]*)<(\/)?([\w\-:]+)((?:\s+|(?:\s+[\w\-:]+)|(?:\s+[\w\-:]+=[^\s"'<>]+)|(?:\s+[\w\-:"]+="[^"]*")|(?:\s+[\w\-:"]+='[^']*'))*)(\/)?>([ \t\n\r]*)/g,function(a,
+g,j,n,o,s,l){var g=g||"",j=j||"",m=n.toLowerCase(),q=o||"",n=s?" "+s:"",l=l||"";if(c&&!B[m])return"";n===""&&fb[m]&&(n=" /");gb[m]&&(g&&(g=" "),l&&(l=" "));Ja[m]&&(j?l="\n":g="\n");b&&m=="br"&&(l="\n");if(hb[m]&&!Ja[m])if(b){j&&i.length>0&&i[i.length-1]===m?i.pop():i.push(m);l=g="\n";o=0;for(s=j?i.length:i.length-1;o<s;o++)g+=d,j||(l+=d);n?i.pop():j||(l+=d)}else g=l="";if(q!==""){var t=G(a);if(m==="font"){var p={},w="";h(t,function(a,c){if(a==="color")p.color=c,delete t[a];a==="size"&&(p["font-size"]=
+k[parseInt(c,10)-1]||"",delete t[a]);a==="face"&&(p["font-family"]=c,delete t[a]);a==="style"&&(w=c)});w&&!/;$/.test(w)&&(w+=";");h(p,function(a,c){c!==""&&(/\s/.test(c)&&(c="'"+c+"'"),w+=a+":"+c+";")});t.style=w}h(t,function(a,b){Jb[a]&&(t[a]=a);e(a,["src","href"])>=0&&(t[a]=M(b,f));(c&&a!=="style"&&!B[m]["*"]&&!B[m][a]||m==="body"&&a==="contenteditable"||/^kindeditor_\d+$/.test(a))&&delete t[a];if(a==="style"&&b!==""){var d=Q(b);h(d,function(a){c&&!B[m].style&&!B[m]["."+a]&&delete d[a]});var K=
+"";h(d,function(a,c){K+=a+":"+c+";"});t.style=K}});q="";h(t,function(a,c){a==="style"&&c===""||(c=c.replace(/"/g,"&quot;"),q+=" "+a+'="'+c+'"')})}m==="font"&&(m="span");return g+"<"+j+m+q+n+">"+l}),a=a.replace(/(<(?:pre|pre\s[^>]*)>)([\s\S]*?)(<\/pre>)/ig,function(a,c,f,b){return c+f.replace(/\n/g,'<span id="__kindeditor_pre_newline__">\n')+b}),a=a.replace(/\n\s*\n/g,"\n"),a=a.replace(/<span id="__kindeditor_pre_newline__">\n/g,"\n");return m(a)}function W(a,c){a=a.replace(/<meta[\s\S]*?>/ig,"").replace(/<![\s\S]*?>/ig,
+"").replace(/<style[^>]*>[\s\S]*?<\/style>/ig,"").replace(/<script[^>]*>[\s\S]*?<\/script>/ig,"").replace(/<w:[^>]+>[\s\S]*?<\/w:[^>]+>/ig,"").replace(/<o:[^>]+>[\s\S]*?<\/o:[^>]+>/ig,"").replace(/<xml>[\s\S]*?<\/xml>/ig,"").replace(/<(?:table|td)[^>]*>/ig,function(a){return a.replace(/border-bottom:([#\w\s]+)/ig,"border:$1")});return J(a,c)}function T(a){if(/\.(rm|rmvb)(\?|$)/i.test(a))return"audio/x-pn-realaudio-plugin";if(/\.(swf|flv)(\?|$)/i.test(a))return"application/x-shockwave-flash";return"video/x-ms-asf-plugin"}
+function fa(a){return G(unescape(a))}function Ka(a){var c="<embed ";h(a,function(a,b){c+=a+'="'+b+'" '});c+="/>";return c}function ib(a,c){var f=c.width,b=c.height,d=c.type||T(c.src),k=Ka(c),i="";f>0&&(i+="width:"+f+"px;");b>0&&(i+="height:"+b+"px;");f=/realaudio/i.test(d)?"ke-rm":/flash/i.test(d)?"ke-flash":"ke-media";f='<img class="'+f+'" src="'+a+'" ';i!==""&&(f+='style="'+i+'" ');f+='data-ke-tag="'+escape(k)+'" alt="" />';return f}function Ba(a,c){if(a.nodeType==9&&c.nodeType!=9)return!0;for(;c=
+c.parentNode;)if(c==a)return!0;return!1}function Ca(a,c){var c=c.toLowerCase(),f=null;if(!Kb&&a.nodeName.toLowerCase()!="script"){var b=a.ownerDocument.createElement("div");b.appendChild(a.cloneNode(!1));b=G(t(b.innerHTML));c in b&&(f=b[c])}else try{f=a.getAttribute(c,2)}catch(d){f=a.getAttribute(c,1)}c==="style"&&f!==null&&(f=Y(f));return f}function Da(a,c){function f(a){if(typeof a!="string")return a;return a.replace(/([^\w\-])/g,"\\$1")}function b(a,c){return a==="*"||a.toLowerCase()===f(c.toLowerCase())}
+function d(a,c,f){var u=[];(a=(f.ownerDocument||f).getElementById(a.replace(/\\/g,"")))&&b(c,a.nodeName)&&Ba(f,a)&&u.push(a);return u}function k(a,c,f){var d=f.ownerDocument||f,u=[],k,i,B;if(f.getElementsByClassName){d=f.getElementsByClassName(a.replace(/\\/g,""));k=0;for(i=d.length;k<i;k++)B=d[k],b(c,B.nodeName)&&u.push(B)}else if(d.querySelectorAll){d=d.querySelectorAll((f.nodeName!=="#document"?f.nodeName+" ":"")+c+"."+a);k=0;for(i=d.length;k<i;k++)B=d[k],Ba(f,B)&&u.push(B)}else{d=f.getElementsByTagName(c);
+a=" "+a+" ";k=0;for(i=d.length;k<i;k++)if(B=d[k],B.nodeType==1)(c=B.className)&&(" "+c+" ").indexOf(a)>-1&&u.push(B)}return u}function i(a,c,b,d){for(var K=[],b=d.getElementsByTagName(b),u=0,k=b.length;u<k;u++)d=b[u],d.nodeType==1&&(c===null?Ca(d,a)!==null&&K.push(d):c===f(Ca(d,a))&&K.push(d));return K}function g(a,c){var f=[],e,P=(e=/^((?:\\.|[^.#\s\[<>])+)/.exec(a))?e[1]:"*";if(e=/#((?:[\w\-]|\\.)+)$/.exec(a))f=d(e[1],P,c);else if(e=/\.((?:[\w\-]|\\.)+)$/.exec(a))f=k(e[1],P,c);else if(e=/\[((?:[\w\-]|\\.)+)\]/.exec(a))f=
+i(e[1].toLowerCase(),null,P,c);else if(e=/\[((?:[\w\-]|\\.)+)\s*=\s*['"]?((?:\\.|[^'"]+)+)['"]?\]/.exec(a)){f=e[1].toLowerCase();e=e[2];if(f==="id")P=d(e,P,c);else if(f==="class")P=k(e,P,c);else if(f==="name"){f=[];e=(c.ownerDocument||c).getElementsByName(e.replace(/\\/g,""));for(var h,j=0,o=e.length;j<o;j++)h=e[j],b(P,h.nodeName)&&Ba(c,h)&&h.getAttributeNode("name")&&f.push(h);P=f}else P=i(f,e,P,c);f=P}else{P=c.getElementsByTagName(P);h=0;for(j=P.length;h<j;h++)e=P[h],e.nodeType==1&&f.push(e)}return f}
+var j=a.split(",");if(j.length>1){var n=[];h(j,function(){h(Da(this,c),function(){e(this,n)<0&&n.push(this)})});return n}for(var c=c||document,j=[],o,m=/((?:\\.|[^\s>])+|[\s>])/g;o=m.exec(a);)o[1]!==" "&&j.push(o[1]);o=[];if(j.length==1)return g(j[0],c);var m=!1,l,s,q,t,w,p,r,N,F,v;p=0;for(lenth=j.length;p<lenth;p++)if(l=j[p],l===">")m=!0;else{if(p>0){s=[];r=0;for(F=o.length;r<F;r++){t=o[r];q=g(l,t);N=0;for(v=q.length;N<v;N++)w=q[N],m?t===w.parentNode&&s.push(w):s.push(w)}o=s}else o=g(l,c);if(o.length===
+0)return[]}return o}function ga(a){if(!a)return document;return a.ownerDocument||a.document||a}function ha(a){if(!a)return b;a=ga(a);return a.parentWindow||a.defaultView}function Lb(a,c){if(a.nodeType==1){var f=ga(a);try{a.innerHTML='<img id="__kindeditor_temp_tag__" width="0" height="0" style="display:none;" />'+c;var b=f.getElementById("__kindeditor_temp_tag__");b.parentNode.removeChild(b)}catch(d){i(a).empty(),i("@"+c,f).each(function(){a.appendChild(this)})}}}function La(a,c,f){C&&O<8&&c.toLowerCase()==
+"class"&&(c="className");a.setAttribute(c,""+f)}function Ma(a){if(!a||!a.nodeName)return"";return a.nodeName.toLowerCase()}function Mb(a,c){var f=ha(a),b=p(c),d="";f.getComputedStyle?(f=f.getComputedStyle(a,null),d=f[b]||f.getPropertyValue(c)||a.style[b]):a.currentStyle&&(d=a.currentStyle[b]||a.style[b]);return d}function X(a){a=a||document;return aa?a.body:a.documentElement}function ma(a){var a=a||document,c;C||Na?(c=X(a).scrollLeft,a=X(a).scrollTop):(c=ha(a).scrollX,a=ha(a).scrollY);return{x:c,
+y:a}}function R(a){this.init(a)}function jb(a){a.collapsed=a.startContainer===a.endContainer&&a.startOffset===a.endOffset;return a}function Oa(a,c,f){function b(d,K,u){var k=d.nodeValue.length,i;c&&(i=d.cloneNode(!0),i=K>0?i.splitText(K):i,u<k&&i.splitText(u-K));if(f){var B=d;K>0&&(B=d.splitText(K),a.setStart(d,K));u<k&&(d=B.splitText(u-K),a.setEnd(d,0));e.push(B)}return i}function d(){f&&a.up().collapse(!0);for(var c=0,b=e.length;c<b;c++){var K=e[c];K.parentNode&&K.parentNode.removeChild(K)}}function k(d,
+u){for(var m=d.firstChild,l;m;){l=(new Z(i)).selectNode(m);h=l.compareBoundaryPoints(qa,a);h>=0&&j<=0&&(j=l.compareBoundaryPoints(ra,a));j>=0&&o<=0&&(o=l.compareBoundaryPoints(na,a));o>=0&&n<=0&&(n=l.compareBoundaryPoints(sa,a));if(n>=0)return!1;l=m.nextSibling;if(h>0)if(m.nodeType==1)if(j>=0&&o<=0)c&&u.appendChild(m.cloneNode(!0)),f&&e.push(m);else{var s;c&&(s=m.cloneNode(!1),u.appendChild(s));if(k(m,s)===!1)return!1}else if(m.nodeType==3&&(m=m==g.startContainer?b(m,g.startOffset,m.nodeValue.length):
+m==g.endContainer?b(m,0,g.endOffset):b(m,0,m.nodeValue.length),c))try{u.appendChild(m)}catch(q){}m=l}}var i=a.doc,e=[],g=a.cloneRange().down(),h=-1,j=-1,o=-1,n=-1,m=a.commonAncestor(),l=i.createDocumentFragment();if(m.nodeType==3)return m=b(m,a.startOffset,a.endOffset),c&&l.appendChild(m),d(),c?l:a;k(m,l);f&&a.up().collapse(!0);for(var m=0,s=e.length;m<s;m++){var q=e[m];q.parentNode&&q.parentNode.removeChild(q)}return c?l:a}function ta(a,c){for(var f=c;f;){var b=i(f);if(b.name=="marquee"||b.name==
+"select")return;f=f.parentNode}try{a.moveToElementText(c)}catch(d){}}function kb(a,c){var f=a.parentElement().ownerDocument,b=a.duplicate();b.collapse(c);var d=b.parentElement(),k=d.childNodes;if(k.length===0)return{node:d.parentNode,offset:i(d).index()};var B=f,e=0,g=-1,h=a.duplicate();ta(h,d);for(var j=0,o=k.length;j<o;j++){var n=k[j],g=h.compareEndPoints("StartToStart",b);if(g===0)return{node:n.parentNode,offset:j};if(n.nodeType==1){var m=a.duplicate(),l,s=i(n),q=n;s.isControl()&&(l=f.createElement("span"),
+s.after(l),q=l,e+=s.text().replace(/\r\n|\n|\r/g,"").length);ta(m,q);h.setEndPoint("StartToEnd",m);g>0?e+=m.text.replace(/\r\n|\n|\r/g,"").length:e=0;l&&i(l).remove()}else n.nodeType==3&&(h.moveStart("character",n.nodeValue.length),e+=n.nodeValue.length);g<0&&(B=n)}if(g<0&&B.nodeType==1)return{node:d,offset:i(d.lastChild).index()+1};if(g>0)for(;B.nextSibling&&B.nodeType==1;)B=B.nextSibling;h=a.duplicate();ta(h,d);h.setEndPoint("StartToEnd",b);e-=h.text.replace(/\r\n|\n|\r/g,"").length;if(g>0&&B.nodeType==
+3)for(f=B.previousSibling;f&&f.nodeType==3;)e-=f.nodeValue.length,f=f.previousSibling;return{node:B,offset:e}}function lb(a,c){var f=a.ownerDocument||a,b=f.body.createTextRange();if(f==a)return b.collapse(!0),b;if(a.nodeType==1&&a.childNodes.length>0){var d=a.childNodes,k;c===0?(k=d[0],d=!0):(k=d[c-1],d=!1);if(!k)return b;if(i(k).name==="head")return c===1&&(d=!0),c===2&&(d=!1),b.collapse(d),b;if(k.nodeType==1){var B=i(k),e;B.isControl()&&(e=f.createElement("span"),d?B.before(e):B.after(e),k=e);ta(b,
+k);b.collapse(d);e&&i(e).remove();return b}a=k;c=d?0:k.nodeValue.length}f=f.createElement("span");i(a).before(f);ta(b,f);b.moveStart("character",c);i(f).remove();return b}function mb(a){function c(a){if(i(a.node).name=="tr")a.node=a.node.cells[a.offset],a.offset=0}var f;if(C){if(a.item)return f=ga(a.item(0)),f=new Z(f),f.selectNode(a.item(0)),f;f=a.parentElement().ownerDocument;var b=kb(a,!0),a=kb(a,!1);c(b);c(a);f=new Z(f);f.setStart(b.node,b.offset);f.setEnd(a.node,a.offset);return f}b=a.startContainer;
+f=b.ownerDocument||b;f=new Z(f);f.setStart(b,a.startOffset);f.setEnd(a.endContainer,a.endOffset);return f}function Z(a){this.init(a)}function Pa(a){if(!a.nodeName)return a.constructor===Z?a:mb(a);return new Z(a)}function ba(a,c,f){try{a.execCommand(c,!1,f)}catch(b){}}function nb(a,c){var f="";try{f=a.queryCommandValue(c)}catch(b){}typeof f!=="string"&&(f="");return f}function Qa(a){var c=ha(a);return a.selection||c.getSelection()}function ob(a){var c={},f,b;h(a,function(a,d){f=a.split(",");for(var i=
+0,e=f.length;i<e;i++)b=f[i],c[b]=d});return c}function Ra(a,c){return pb(a,c,"*")||pb(a,c)}function pb(a,c,f){f=f||a.name;if(a.type!==1)return!1;c=ob(c);if(!c[f])return!1;for(var f=c[f].split(","),c=0,b=f.length;c<b;c++){var d=f[c];if(d==="*")return!0;var k=/^(\.?)([^=]+)(?:=([^=]*))?$/.exec(d),i=k[1]?"css":"attr",d=k[2],k=k[3]||"";if(k===""&&a[i](d)!=="")return!0;if(k!==""&&a[i](d)===k)return!0}return!1}function Sa(a,c){a.type==1&&(qb(a,c,"*"),qb(a,c))}function qb(a,c,f){f=f||a.name;if(a.type===
+1&&(c=ob(c),c[f])){for(var f=c[f].split(","),c=!1,b=0,d=f.length;b<d;b++){var k=f[b];if(k==="*"){c=!0;break}var i=/^(\.?)([^=]+)(?:=([^=]*))?$/.exec(k),k=i[2];i[1]?(k=p(k),a[0].style[k]&&(a[0].style[k]="")):a.removeAttr(k)}c&&a.remove(!0)}}function Ta(a){for(;a.first();)a=a.first();return a}function oa(a){if(a.type!=1||a.isSingle())return!1;return a.html().replace(/<[^>]+>/g,"")===""}function Nb(a,c,f){h(c,function(c,f){c!=="style"&&a.attr(c,f)});h(f,function(c,f){a.css(c,f)})}function ua(a){this.init(a)}
+function rb(a){a.nodeName&&(a=ga(a),a=Pa(a).selectNodeContents(a.body).collapse(!1));return new ua(a)}function Ua(a){var c=a.moveEl,f=a.moveFn,b=a.clickEl||c,u=a.beforeDrag,k=[document];(a.iframeFix===d||a.iframeFix)&&i("iframe").each(function(){if(!/^https?:\/\//.test(M(this.src||"","absolute"))){var a;try{a=Va(this)}catch(c){}if(a){var f=i(this).pos();i(a).data("pos-x",f.x);i(a).data("pos-y",f.y);k.push(a)}}});b.mousedown(function(a){function d(a){a.preventDefault();var c=i(ga(a.target)),k=ca((c.data("pos-x")||
+0)+a.pageX-s),a=ca((c.data("pos-y")||0)+a.pageY-q);f.call(b,j,n,m,l,k,a)}function e(a){a.preventDefault()}function g(a){a.preventDefault();i(k).unbind("mousemove",d).unbind("mouseup",g).unbind("selectstart",e);h.releaseCapture&&h.releaseCapture()}a.stopPropagation();var h=b.get(),j=o(c.css("left")),n=o(c.css("top")),m=c.width(),l=c.height(),s=a.pageX,q=a.pageY;u&&u();i(k).mousemove(d).mouseup(g).bind("selectstart",e);h.setCapture&&h.setCapture()})}function da(a){this.init(a)}function Wa(a){return new da(a)}
+function Va(a){a=i(a)[0];return a.contentDocument||a.contentWindow.document}function Ob(a,c,f,b){var d=[Xa===""?"<html>":'<html dir="'+Xa+'">','<head><meta charset="utf-8" /><title></title>',"<style>","html {margin:0;padding:0;}","body {margin:0;padding:5px;}",'body, td {font:12px/1.5 "sans serif",tahoma,verdana,helvetica;}',"body, p, div {word-wrap: break-word;}","p {margin:5px 0;}","table {border-collapse:collapse;}","img {border:0;}","noscript {display:none;}","table.ke-zeroborder td {border:1px dotted #AAA;}",
+"img.ke-flash {","\tborder:1px solid #AAA;","\tbackground-image:url("+a+"common/flash.gif);","\tbackground-position:center center;","\tbackground-repeat:no-repeat;","\twidth:100px;","\theight:100px;","}","img.ke-rm {","\tborder:1px solid #AAA;","\tbackground-image:url("+a+"common/rm.gif);","\tbackground-position:center center;","\tbackground-repeat:no-repeat;","\twidth:100px;","\theight:100px;","}","img.ke-media {","\tborder:1px solid #AAA;","\tbackground-image:url("+a+"common/media.gif);","\tbackground-position:center center;",
+"\tbackground-repeat:no-repeat;","\twidth:100px;","\theight:100px;","}","img.ke-anchor {","\tborder:1px dashed #666;","\twidth:16px;","\theight:16px;","}",".ke-script, .ke-noscript, .ke-display-none {","\tdisplay:none;","\tfont-size:0;","\twidth:0;","\theight:0;","}",".ke-pagebreak {","\tborder:1px dotted #AAA;","\tfont-size:0;","\theight:2px;","}","</style>"];g(f)||(f=[f]);h(f,function(a,c){c&&d.push('<link href="'+c+'" rel="stylesheet" />')});b&&d.push("<style>"+b+"</style>");d.push("</head><body "+
+(c?'class="'+c+'"':"")+"></body></html>");return d.join("\n")}function va(a,c){if(a.hasVal()){if(c===d){var f=a.val();return f=f.replace(/(<(?:p|p\s[^>]*)>) *(<\/p>)/ig,"")}return a.val(c)}return a.html(c)}function wa(a){this.init(a)}function sb(a){return new wa(a)}function tb(a,c){var f=this.get(a);f&&!f.hasClass("ke-disabled")&&c(f)}function Ea(a){this.init(a)}function ub(a){return new Ea(a)}function xa(a){this.init(a)}function Ya(a){return new xa(a)}function ya(a){this.init(a)}function vb(a){return new ya(a)}
+function Za(a){this.init(a)}function za(a){this.init(a)}function wb(a){return new za(a)}function $a(a,c){var f=document.getElementsByTagName("head")[0]||(aa?document.body:document.documentElement),b=document.createElement("script");f.appendChild(b);b.src=a;b.charset="utf-8";b.onload=b.onreadystatechange=function(){if(!this.readyState||this.readyState==="loaded")c&&c(),b.onload=b.onreadystatechange=null,f.removeChild(b)}}function xb(a){var c=a.indexOf("?");return c>0?a.substr(0,c):a}function ab(a){for(var c=
+document.getElementsByTagName("head")[0]||(aa?document.body:document.documentElement),f=document.createElement("link"),b=xb(M(a,"absolute")),d=i('link[rel="stylesheet"]',c),k=0,e=d.length;k<e;k++)if(xb(M(d[k].href,"absolute"))===b)return;c.appendChild(f);f.href=a;f.rel="stylesheet"}function yb(a,c){if(a===d)return ia;if(!c)return ia[a];ia[a]=c}function zb(a){var c,f="core";if(c=/^(\w+)\.(\w+)$/.exec(a))f=c[1],a=c[2];return{ns:f,key:a}}function Ab(a,c){c=c===d?i.options.langType:c;if(typeof a==="string"){if(!$[c])return"no language";
+var f=a.length-1;if(a.substr(f)===".")return $[c][a.substr(0,f)];f=zb(a);return $[c][f.ns][f.key]}h(a,function(a,f){var b=zb(a);$[c]||($[c]={});$[c][b.ns]||($[c][b.ns]={});$[c][b.ns][b.key]=f})}function Fa(a,c){if(!a.collapsed){var a=a.cloneRange().up(),f=a.startContainer,b=a.startOffset;if(ja||a.isControl())if((f=i(f.childNodes[b]))&&f.name=="img"&&c(f))return f}}function Pb(){var a=this;i(a.edit.doc).contextmenu(function(c){a.menu&&a.hideMenu();if(a.useContextmenu){if(a._contextmenus.length!==0){var f=
+0,b=[];for(h(a._contextmenus,function(){if(this.title=="-")b.push(this);else if(this.cond&&this.cond()&&(b.push(this),this.width&&this.width>f))f=this.width});b.length>0&&b[0].title=="-";)b.shift();for(;b.length>0&&b[b.length-1].title=="-";)b.pop();var d=null;h(b,function(a){this.title=="-"&&d.title=="-"&&delete b[a];d=this});if(b.length>0){c.preventDefault();var k=i(a.edit.iframe).pos(),e=Ya({x:k.x+c.clientX,y:k.y+c.clientY,width:f,css:{visibility:"hidden"},shadowMode:a.shadowMode});h(b,function(){this.title&&
+e.addItem(this)});var k=X(e.doc),g=e.div.height();c.clientY+g>=k.clientHeight-100&&e.pos(e.x,o(e.y)-g);e.div.css("visibility","visible");a.menu=e}}}else c.preventDefault()})}function Qb(){function a(a){for(a=i(a.commonAncestor());a;){if(a.type==1&&!a.isStyle())break;a=a.parent()}return a.name}var c=this,f=c.edit.doc,b=c.newlineTag;if(!(C&&b!=="br")&&(!pa||!(O<3&&b!=="p"))&&!(Na&&O<9)){var d=z("h1,h2,h3,h4,h5,h6,pre,li"),k=z("p,h1,h2,h3,h4,h5,h6,pre,li,blockquote");i(f).keydown(function(i){if(!(i.which!=
+13||i.shiftKey||i.ctrlKey||i.altKey)){c.cmd.selection();var e=a(c.cmd.range);e=="marquee"||e=="select"||(b==="br"&&!d[e]?(i.preventDefault(),c.insertHtml("<br />"+(C&&O<9?"":"\u200b"))):k[e]||ba(f,"formatblock","<p>"))}});i(f).keyup(function(d){if(!(d.which!=13||d.shiftKey||d.ctrlKey||d.altKey)&&b!="br")if(pa){var d=c.cmd.commonAncestor("p"),u=c.cmd.commonAncestor("a");u&&u.text()==""&&(u.remove(!0),c.cmd.range.selectNodeContents(d[0]).collapse(!0),c.cmd.select())}else if(c.cmd.selection(),d=a(c.cmd.range),
+!(d=="marquee"||d=="select"))if(k[d]||ba(f,"formatblock","<p>"),d=c.cmd.commonAncestor("div")){for(var u=i("<p></p>"),e=d[0].firstChild;e;){var g=e.nextSibling;u.append(e);e=g}d.before(u);d.remove();c.cmd.range.selectNodeContents(u[0]);c.cmd.select()}})}}function Rb(){var a=this,c=a.edit.doc;i(c).keydown(function(f){if(f.which==9)if(f.preventDefault(),a.afterTab)a.afterTab.call(a,f);else{var f=a.cmd,b=f.range;b.shrink();b.collapsed&&b.startContainer.nodeType==1&&(b.insertNode(i("@&nbsp;",c)[0]),f.select());
+a.insertHtml("&nbsp;&nbsp;&nbsp;&nbsp;")}})}function Sb(){var a=this;i(a.edit.textarea[0],a.edit.win).focus(function(c){a.afterFocus&&a.afterFocus.call(a,c)}).blur(function(c){a.afterBlur&&a.afterBlur.call(a,c)})}function ka(a){return m(a.replace(/<span [^>]*id="?__kindeditor_bookmark_\w+_\d+__"?[^>]*><\/span>/ig,""))}function bb(a){return a.replace(/<div[^>]+class="?__kindeditor_paste__"?[^>]*>[\s\S]*?<\/div>/ig,"")}function Bb(a,c){if(a.length===0)a.push(c);else{var f=a[a.length-1];ka(c.html)!==
+ka(f.html)&&a.push(c)}}function Cb(a,c){var f=this.edit,b=f.doc.body,d,k;if(a.length===0)return this;f.designMode?(d=this.cmd.range,k=d.createBookmark(!0),k.html=b.innerHTML):k={html:b.innerHTML};Bb(c,k);var e=a.pop();ka(k.html)===ka(e.html)&&a.length>0&&(e=a.pop());f.designMode?(f.html(e.html),e.start&&(d.moveToBookmark(e),this.select())):i(b).html(ka(e.html));return this}function Aa(a){function c(a,c){Aa.prototype[a]===d&&(f[a]=c);f.options[a]=c}var f=this;f.options={};h(a,function(f){c(f,a[f])});
+h(i.options,function(a,b){f[a]===d&&c(a,b)});var b=i(f.srcElement||"<textarea/>");if(!f.width)f.width=b[0].style.width||b.width();if(!f.height)f.height=b[0].style.height||b.height();c("width",r(f.width,f.minWidth));c("height",r(f.height,f.minHeight));c("width",j(f.width));c("height",j(f.height));if(Tb&&(!Ub||O<534))f.designMode=!1;f.srcElement=b;f.initContent="";f.plugin={};f.isCreated=!1;f.isLoading=!1;f._handlers={};f._contextmenus=[];f._undoStack=[];f._redoStack=[];f._calledPlugins={};f._firstAddBookmark=
+!0;f.menu=f.contextmenu=null;f.dialogs=[]}function Db(a,c){function f(a){h(ia,function(c,f){f.call(a,KindEditor)});return a.create()}c=c||{};c.basePath=r(c.basePath,i.basePath);c.themesPath=r(c.themesPath,c.basePath+"themes/");c.langPath=r(c.langPath,c.basePath+"lang/");c.pluginsPath=r(c.pluginsPath,c.basePath+"plugins/");if(r(c.loadStyleMode,i.options.loadStyleMode)){var b=r(c.themeType,i.options.themeType);ab(c.themesPath+"default/default.css");ab(c.themesPath+b+"/"+b+".css")}if((b=i(a))&&b.length!==
+0){if(b.length>1)return b.each(function(){Db(this,c)}),_instances[0];c.srcElement=b[0];var d=new Aa(c);_instances.push(d);if($[d.langType])return f(d);$a(d.langPath+d.langType+".js?ver="+encodeURIComponent(i.DEBUG?Ga:Ha),function(){f(d)});return d}}function Eb(a,c){i(a).each(function(a,b){i.each(_instances,function(a,f){if(f&&f.srcElement[0]==b)return c.call(f,a,f),!1})})}if(!b.KindEditor){if(!b.console)b.console={};if(!console.log)console.log=function(){};var Ha="4.1.7 (2013-04-21)",I=navigator.userAgent.toLowerCase(),
+C=I.indexOf("msie")>-1&&I.indexOf("opera")==-1,pa=I.indexOf("gecko")>-1&&I.indexOf("khtml")==-1,ja=I.indexOf("applewebkit")>-1,Na=I.indexOf("opera")>-1,Tb=I.indexOf("mobile")>-1,Ub=/ipad|iphone|ipod/.test(I),aa=document.compatMode!="CSS1Compat",O=(I=/(?:msie|firefox|webkit|opera)[\/:\s](\d+)/.exec(I))?I[1]:"0",Ga=(new Date).getTime(),ca=Math.round,i={DEBUG:!1,VERSION:Ha,IE:C,GECKO:pa,WEBKIT:ja,OPERA:Na,V:O,TIME:Ga,each:h,isArray:g,isFunction:l,inArray:e,inString:n,trim:m,addUnit:j,removeUnit:o,escape:s,
+unescape:t,toCamel:p,toHex:q,toMap:z,toArray:D,undef:r,invalidUrl:function(a){return!a||/[<>"]/.test(a)},addParam:function(a,c){return a.indexOf("?")>=0?a+"&"+c:a+"?"+c},extend:A,json:w},gb=z("a,abbr,acronym,b,basefont,bdo,big,br,button,cite,code,del,dfn,em,font,i,img,input,ins,kbd,label,map,q,s,samp,select,small,span,strike,strong,sub,sup,textarea,tt,u,var"),hb=z("address,applet,blockquote,body,center,dd,dir,div,dl,dt,fieldset,form,frameset,h1,h2,h3,h4,h5,h6,head,hr,html,iframe,ins,isindex,li,map,menu,meta,noframes,noscript,object,ol,p,pre,script,style,table,tbody,td,tfoot,th,thead,title,tr,ul"),
+fb=z("area,index,basefont,br,col,frame,hr,img,input,isindex,link,meta,param,embed"),Fb=z("b,basefont,big,del,em,font,i,s,small,span,strike,strong,sub,sup,u"),Vb=z("img,table,input,textarea,button"),Ja=z("pre,style,script"),Ia=z("html,head,body,td,tr,table,ol,ul,li");z("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr");var Jb=z("checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected"),Gb=z("input,button,textarea,select");i.basePath=function(){for(var a=
+document.getElementsByTagName("script"),c,f=0,b=a.length;f<b;f++)if(c=a[f].src||"",/kindeditor[\w\-\.]*\.js/.test(c))return c.substring(0,c.lastIndexOf("/")+1);return""}();i.options={designMode:!0,fullscreenMode:!1,filterMode:!0,wellFormatMode:!0,shadowMode:!0,loadStyleMode:!0,basePath:i.basePath,themesPath:i.basePath+"themes/",langPath:i.basePath+"lang/",pluginsPath:i.basePath+"plugins/",themeType:"default",langType:"zh_CN",urlType:"",newlineTag:"p",resizeType:2,syncType:"form",pasteType:2,dialogAlignType:"page",
+useContextmenu:!0,fullscreenShortcut:!1,bodyClass:"ke-content",indentChar:"\t",cssPath:"",cssData:"",minWidth:650,minHeight:100,minChangeSize:50,zIndex:811213,items:["source","|","undo","redo","|","preview","print","template","code","cut","copy","paste","plainpaste","wordpaste","|","justifyleft","justifycenter","justifyright","justifyfull","insertorderedlist","insertunorderedlist","indent","outdent","subscript","superscript","clearhtml","quickformat","selectall","|","fullscreen","/","formatblock",
+"fontname","fontsize","|","forecolor","hilitecolor","bold","italic","underline","strikethrough","lineheight","removeformat","|","image","multiimage","flash","media","insertfile","table","hr","emoticons","baidumap","pagebreak","anchor","link","unlink","|","about"],noDisableItems:["source","fullscreen"],colorTable:[["#E53333","#E56600","#FF9900","#64451D","#DFC5A4","#FFE500"],["#009900","#006600","#99BB00","#B8D100","#60D978","#00D5FF"],["#337FE5","#003399","#4C33E5","#9933E5","#CC33E5","#EE33EE"],
+["#FFFFFF","#CCCCCC","#999999","#666666","#333333","#000000"]],fontSizeTable:["9px","10px","12px","14px","16px","18px","24px","32px"],htmlTags:{font:["id","class","color","size","face",".background-color"],span:["id","class",".color",".background-color",".font-size",".font-family",".background",".font-weight",".font-style",".text-decoration",".vertical-align",".line-height"],div:["id","class","align",".border",".margin",".padding",".text-align",".color",".background-color",".font-size",".font-family",
+".font-weight",".background",".font-style",".text-decoration",".vertical-align",".margin-left"],table:["id","class","border","cellspacing","cellpadding","width","height","align","bordercolor",".padding",".margin",".border","bgcolor",".text-align",".color",".background-color",".font-size",".font-family",".font-weight",".font-style",".text-decoration",".background",".width",".height",".border-collapse"],"td,th":["id","class","align","valign","width","height","colspan","rowspan","bgcolor",".text-align",
+".color",".background-color",".font-size",".font-family",".font-weight",".font-style",".text-decoration",".vertical-align",".background",".border"],a:["id","class","href","target","name"],embed:["id","class","src","width","height","type","loop","autostart","quality",".width",".height","align","allowscriptaccess"],img:["id","class","src","width","height","border","alt","title","align",".width",".height",".border"],"p,ol,ul,li,blockquote,h1,h2,h3,h4,h5,h6":["id","class","align",".text-align",".color",
+".background-color",".font-size",".font-family",".background",".font-weight",".font-style",".text-decoration",".vertical-align",".text-indent",".margin-left"],pre:["id","class"],hr:["id","class",".page-break-after"],"br,tbody,tr,strong,b,sub,sup,em,i,u,strike,s,del":["id","class"],iframe:["id","class","src","frameborder","width","height",".width",".height"]},layout:'<div class="container"><div class="toolbar"></div><div class="edit"></div><div class="statusbar"></div></div>'};var db=!1,Hb=z("8,9,13,32,46,48..57,59,61,65..90,106,109..111,188,190..192,219..222"),
+I=z("33..40"),cb={};h(Hb,function(a,c){cb[a]=c});h(I,function(a,c){cb[a]=c});var Wb="altKey,attrChange,attrName,bubbles,button,cancelable,charCode,clientX,clientY,ctrlKey,currentTarget,data,detail,eventPhase,fromElement,handler,keyCode,metaKey,newValue,offsetX,offsetY,originalTarget,pageX,pageY,prevValue,relatedNode,relatedTarget,screenX,screenY,shiftKey,srcElement,target,toElement,view,wheelDelta,which".split(",");A(E,{init:function(a,c){var f=this,b=a.ownerDocument||a.document||a;f.event=c;h(Wb,
+function(a,b){f[b]=c[b]});if(!f.target)f.target=f.srcElement||b;if(f.target.nodeType===3)f.target=f.target.parentNode;if(!f.relatedTarget&&f.fromElement)f.relatedTarget=f.fromElement===f.target?f.toElement:f.fromElement;if(f.pageX==null&&f.clientX!=null){var i=b.documentElement,b=b.body;f.pageX=f.clientX+(i&&i.scrollLeft||b&&b.scrollLeft||0)-(i&&i.clientLeft||b&&b.clientLeft||0);f.pageY=f.clientY+(i&&i.scrollTop||b&&b.scrollTop||0)-(i&&i.clientTop||b&&b.clientTop||0)}if(!f.which&&(f.charCode||f.charCode===
+0?f.charCode:f.keyCode))f.which=f.charCode||f.keyCode;if(!f.metaKey&&f.ctrlKey)f.metaKey=f.ctrlKey;if(!f.which&&f.button!==d)f.which=f.button&1?1:f.button&2?3:f.button&4?2:0;switch(f.which){case 186:f.which=59;break;case 187:case 107:case 43:f.which=61;break;case 189:case 45:f.which=109;break;case 42:f.which=106;break;case 47:f.which=111;break;case 78:f.which=110}f.which>=96&&f.which<=105&&(f.which-=48)},preventDefault:function(){var a=this.event;a.preventDefault&&a.preventDefault();a.returnValue=
+!1},stopPropagation:function(){var a=this.event;a.stopPropagation&&a.stopPropagation();a.cancelBubble=!0},stop:function(){this.preventDefault();this.stopPropagation()}});var la="kindeditor_"+Ga,eb=0,L={};C&&b.attachEvent("onunload",function(){h(L,function(a,c){c.el&&N(c.el)})});i.ctrl=V;i.ready=function(a){function c(){i||(i=!0,a(KindEditor))}function f(){if(!i){try{document.documentElement.doScroll("left")}catch(a){setTimeout(f,100);return}c()}}function d(){document.readyState==="complete"&&c()}
+var i=!1;if(document.addEventListener)F(document,"DOMContentLoaded",c);else if(document.attachEvent){F(document,"readystatechange",d);var k=!1;try{k=b.frameElement==null}catch(e){}document.documentElement.doScroll&&k&&f()}F(b,"load",c)};i.formatUrl=M;i.formatHtml=J;i.getCssList=Q;i.getAttrList=G;i.mediaType=T;i.mediaAttrs=fa;i.mediaEmbed=Ka;i.mediaImg=ib;i.clearMsWord=W;i.tmpl=function(a,c){var f=new Function("obj","var p=[],print=function(){p.push.apply(p,arguments);};with(obj){p.push('"+a.replace(/[\r\t\n]/g,
+" ").split("<%").join("\t").replace(/((^|%>)[^\t]*)'/g,"$1\r").replace(/\t=(.*?)%>/g,"',$1,'").split("\t").join("');").split("%>").join("p.push('").split("\r").join("\\'")+"');}return p.join('');");return c?f(c):f};I=document.createElement("div");I.setAttribute("className","t");var Kb=I.className!=="t";i.query=function(a,c){var f=Da(a,c);return f.length>0?f[0]:null};i.queryAll=Da;A(R,{init:function(a){for(var a=g(a)?a:[a],c=0,f=0,b=a.length;f<b;f++)a[f]&&(this[f]=a[f].constructor===R?a[f][0]:a[f],
+c++);this.length=c;this.doc=ga(this[0]);this.name=Ma(this[0]);this.type=this.length>0?this[0].nodeType:null;this.win=ha(this[0])},each:function(a){for(var c=0;c<this.length;c++)if(a.call(this[c],c,this[c])===!1)break;return this},bind:function(a,c){this.each(function(){F(this,a,c)});return this},unbind:function(a,c){this.each(function(){N(this,a,c)});return this},fire:function(a){if(this.length<1)return this;ea(this[0],a);return this},hasAttr:function(a){if(this.length<1)return!1;return!!Ca(this[0],
+a)},attr:function(a,c){var f=this;if(a===d)return G(f.outer());if(typeof a==="object")return h(a,function(a,c){f.attr(a,c)}),f;if(c===d)return c=f.length<1?null:Ca(f[0],a),c===null?"":c;f.each(function(){La(this,a,c)});return f},removeAttr:function(a){this.each(function(){var c=a;C&&O<8&&c.toLowerCase()=="class"&&(c="className");La(this,c,"");this.removeAttribute(c)});return this},get:function(a){if(this.length<1)return null;return this[a||0]},eq:function(a){if(this.length<1)return null;return this[a]?
+new R(this[a]):null},hasClass:function(a){if(this.length<1)return!1;return n(a,this[0].className," ")},addClass:function(a){this.each(function(){if(!n(a,this.className," "))this.className=m(this.className+" "+a)});return this},removeClass:function(a){this.each(function(){if(n(a,this.className," "))this.className=m(this.className.replace(RegExp("(^|\\s)"+a+"(\\s|$)")," "))});return this},html:function(a){if(a===d){if(this.length<1||this.type!=1)return"";return J(this[0].innerHTML)}this.each(function(){Lb(this,
+a)});return this},text:function(){if(this.length<1)return"";return C?this[0].innerText:this[0].textContent},hasVal:function(){if(this.length<1)return!1;return!!Gb[Ma(this[0])]},val:function(a){if(a===d){if(this.length<1)return"";return this.hasVal()?this[0].value:this.attr("value")}else return this.each(function(){Gb[Ma(this)]?this.value=a:La(this,"value",a)}),this},css:function(a,c){var f=this;if(a===d)return Q(f.attr("style"));if(typeof a==="object")return h(a,function(a,c){f.css(a,c)}),f;if(c===
+d){if(f.length<1)return"";return f[0].style[p(a)]||Mb(f[0],a)||""}f.each(function(){this.style[p(a)]=c});return f},width:function(a){if(a===d){if(this.length<1)return 0;return this[0].offsetWidth}return this.css("width",j(a))},height:function(a){if(a===d){if(this.length<1)return 0;return this[0].offsetHeight}return this.css("height",j(a))},opacity:function(a){this.each(function(){this.style.opacity===d?this.style.filter=a==1?"":"alpha(opacity="+a*100+")":this.style.opacity=a==1?"":a});return this},
+data:function(a,c){a="kindeditor_data_"+a;if(c===d){if(this.length<1)return null;return this[0][a]}this.each(function(){this[a]=c});return this},pos:function(){var a=this[0],c=0,f=0;if(a)if(a.getBoundingClientRect)a=a.getBoundingClientRect(),f=ma(this.doc),c=a.left+f.x,f=a.top+f.y;else for(;a;)c+=a.offsetLeft,f+=a.offsetTop,a=a.offsetParent;return{x:ca(c),y:ca(f)}},clone:function(a){if(this.length<1)return new R([]);return new R(this[0].cloneNode(a))},append:function(a){this.each(function(){this.appendChild&&
+this.appendChild(i(a)[0])});return this},appendTo:function(a){this.each(function(){i(a)[0].appendChild(this)});return this},before:function(a){this.each(function(){this.parentNode.insertBefore(i(a)[0],this)});return this},after:function(a){this.each(function(){this.nextSibling?this.parentNode.insertBefore(i(a)[0],this.nextSibling):this.parentNode.appendChild(i(a)[0])});return this},replaceWith:function(a){var c=[];this.each(function(f,b){N(b);var d=i(a)[0];b.parentNode.replaceChild(d,b);c.push(d)});
+return i(c)},empty:function(){this.each(function(a,c){for(var f=c.firstChild;f;){if(!c.parentNode)break;var b=f.nextSibling;f.parentNode.removeChild(f);f=b}});return this},remove:function(a){var c=this;c.each(function(f,b){if(b.parentNode){N(b);if(a)for(var d=b.firstChild;d;){var i=d.nextSibling;b.parentNode.insertBefore(d,b);d=i}b.parentNode.removeChild(b);delete c[f]}});c.length=0;return c},show:function(a){a===d&&(a=this._originDisplay||"");if(this.css("display")!="none")return this;return this.css("display",
+a)},hide:function(){if(this.length<1)return this;this._originDisplay=this[0].style.display;return this.css("display","none")},outer:function(){if(this.length<1)return"";var a=this.doc.createElement("div");a.appendChild(this[0].cloneNode(!0));return J(a.innerHTML)},isSingle:function(){return!!fb[this.name]},isInline:function(){return!!gb[this.name]},isBlock:function(){return!!hb[this.name]},isStyle:function(){return!!Fb[this.name]},isControl:function(){return!!Vb[this.name]},contains:function(a){if(this.length<
+1)return!1;return Ba(this[0],i(a)[0])},parent:function(){if(this.length<1)return null;var a=this[0].parentNode;return a?new R(a):null},children:function(){if(this.length<1)return new R([]);for(var a=[],c=this[0].firstChild;c;)(c.nodeType!=3||m(c.nodeValue)!=="")&&a.push(c),c=c.nextSibling;return new R(a)},first:function(){var a=this.children();return a.length>0?a.eq(0):null},last:function(){var a=this.children();return a.length>0?a.eq(a.length-1):null},index:function(){if(this.length<1)return-1;for(var a=
+-1,c=this[0];c;)a++,c=c.previousSibling;return a},prev:function(){if(this.length<1)return null;var a=this[0].previousSibling;return a?new R(a):null},next:function(){if(this.length<1)return null;var a=this[0].nextSibling;return a?new R(a):null},scan:function(a,c){function b(d){for(d=c?d.firstChild:d.lastChild;d;){var i=c?d.nextSibling:d.previousSibling;if(a(d)===!1)return!1;if(b(d)===!1)return!1;d=i}}if(!(this.length<1))return c=c===d?!0:c,b(this[0]),this}});h("blur,focus,focusin,focusout,load,resize,scroll,unload,click,dblclick,mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave,change,select,submit,keydown,keypress,keyup,error,contextmenu".split(","),
+function(a,c){R.prototype[c]=function(a){return a?this.bind(c,a):this.fire(c)}});I=i;i=function(a,c){function b(a){a[0]||(a=[]);return new R(a)}if(!(a===d||a===null)){if(typeof a==="string"){c&&(c=i(c)[0]);var e=a.length;a.charAt(0)==="@"&&(a=a.substr(1));if(a.length!==e||/<.+>/.test(a)){var e=(c?c.ownerDocument||c:document).createElement("div"),u=[];e.innerHTML='<img id="__kindeditor_temp_tag__" width="0" height="0" style="display:none;" />'+a;for(var k=0,h=e.childNodes.length;k<h;k++){var j=e.childNodes[k];
+j.id!="__kindeditor_temp_tag__"&&u.push(j)}return b(u)}return b(Da(a,c))}if(a&&a.constructor===R)return a;a.toArray&&(a=a.toArray());if(g(a))return b(a);return b(D(arguments))}};h(I,function(a,c){i[a]=c});i.NodeClass=R;b.KindEditor=i;var ra=0,qa=1,na=2,sa=3,Ib=0;A(Z,{init:function(a){this.startContainer=a;this.startOffset=0;this.endContainer=a;this.endOffset=0;this.collapsed=!0;this.doc=a},commonAncestor:function(){function a(a){for(var c=[];a;)c.push(a),a=a.parentNode;return c}for(var c=a(this.startContainer),
+b=a(this.endContainer),d=0,i=c.length,k=b.length,e,g;++d;)if(e=c[i-d],g=b[k-d],!e||!g||e!==g)break;return c[i-d+1]},setStart:function(a,c){var b=this.doc;this.startContainer=a;this.startOffset=c;if(this.endContainer===b)this.endContainer=a,this.endOffset=c;return jb(this)},setEnd:function(a,c){var b=this.doc;this.endContainer=a;this.endOffset=c;if(this.startContainer===b)this.startContainer=a,this.startOffset=c;return jb(this)},setStartBefore:function(a){return this.setStart(a.parentNode||this.doc,
+i(a).index())},setStartAfter:function(a){return this.setStart(a.parentNode||this.doc,i(a).index()+1)},setEndBefore:function(a){return this.setEnd(a.parentNode||this.doc,i(a).index())},setEndAfter:function(a){return this.setEnd(a.parentNode||this.doc,i(a).index()+1)},selectNode:function(a){return this.setStartBefore(a).setEndAfter(a)},selectNodeContents:function(a){var c=i(a);if(c.type==3||c.isSingle())return this.selectNode(a);c=c.children();if(c.length>0)return this.setStartBefore(c[0]).setEndAfter(c[c.length-
+1]);return this.setStart(a,0).setEnd(a,0)},collapse:function(a){if(a)return this.setEnd(this.startContainer,this.startOffset);return this.setStart(this.endContainer,this.endOffset)},compareBoundaryPoints:function(a,c){var b=this.get(),d=c.get();if(C){var e={};e[ra]="StartToStart";e[qa]="EndToStart";e[na]="EndToEnd";e[sa]="StartToEnd";b=b.compareEndPoints(e[a],d);if(b!==0)return b;var k,g,h,j;if(a===ra||a===sa)k=this.startContainer,h=this.startOffset;if(a===qa||a===na)k=this.endContainer,h=this.endOffset;
+if(a===ra||a===qa)g=c.startContainer,j=c.startOffset;if(a===na||a===sa)g=c.endContainer,j=c.endOffset;if(k===g)return k=h-j,k>0?1:k<0?-1:0;for(b=g;b&&b.parentNode!==k;)b=b.parentNode;if(b)return i(b).index()>=h?-1:1;for(b=k;b&&b.parentNode!==g;)b=b.parentNode;if(b)return i(b).index()>=j?1:-1;if((b=i(g).next())&&b.contains(k))return 1;if((b=i(k).next())&&b.contains(g))return-1}else return b.compareBoundaryPoints(a,d)},cloneRange:function(){return(new Z(this.doc)).setStart(this.startContainer,this.startOffset).setEnd(this.endContainer,
+this.endOffset)},toString:function(){var a=this.get();return(C?a.text:a.toString()).replace(/\r\n|\n|\r/g,"")},cloneContents:function(){return Oa(this,!0,!1)},deleteContents:function(){return Oa(this,!1,!0)},extractContents:function(){return Oa(this,!0,!0)},insertNode:function(a){var c=this.startContainer,b=this.startOffset,d=this.endContainer,i=this.endOffset,k,e,g,h=1;if(a.nodeName.toLowerCase()==="#document-fragment")k=a.firstChild,e=a.lastChild,h=a.childNodes.length;c.nodeType==1?(g=c.childNodes[b])?
+(c.insertBefore(a,g),c===d&&(i+=h)):c.appendChild(a):c.nodeType==3&&(b===0?(c.parentNode.insertBefore(a,c),c.parentNode===d&&(i+=h)):b>=c.nodeValue.length?c.nextSibling?c.parentNode.insertBefore(a,c.nextSibling):c.parentNode.appendChild(a):(g=b>0?c.splitText(b):c,c.parentNode.insertBefore(a,g),c===d&&(d=g,i-=b)));k?this.setStartBefore(k).setEndAfter(e):this.selectNode(a);if(this.compareBoundaryPoints(na,this.cloneRange().setEnd(d,i))>=1)return this;return this.setEnd(d,i)},surroundContents:function(a){a.appendChild(this.extractContents());
+return this.insertNode(a).selectNode(a)},isControl:function(){var a=this.startContainer,c=this.startOffset,b=this.endContainer,d=this.endOffset;return a.nodeType==1&&a===b&&c+1===d&&i(a.childNodes[c]).isControl()},get:function(a){var c=this.doc;if(!C){c=c.createRange();try{c.setStart(this.startContainer,this.startOffset),c.setEnd(this.endContainer,this.endOffset)}catch(b){}return c}if(a&&this.isControl())return c=c.body.createControlRange(),c.addElement(this.startContainer.childNodes[this.startOffset]),
+c;a=this.cloneRange().down();c=c.body.createTextRange();c.setEndPoint("StartToStart",lb(a.startContainer,a.startOffset));c.setEndPoint("EndToStart",lb(a.endContainer,a.endOffset));return c},html:function(){return i(this.cloneContents()).outer()},down:function(){function a(a,b,d){if(a.nodeType==1&&(a=i(a).children(),a.length!==0)){var k,e,g,h;b>0&&(k=a.eq(b-1));b<a.length&&(e=a.eq(b));if(k&&k.type==3)g=k[0],h=g.nodeValue.length;e&&e.type==3&&(g=e[0],h=0);g&&(d?c.setStart(g,h):c.setEnd(g,h))}}var c=
+this;a(c.startContainer,c.startOffset,!0);a(c.endContainer,c.endOffset,!1);return c},up:function(){function a(a,b,d){a.nodeType==3&&(b===0?d?c.setStartBefore(a):c.setEndBefore(a):b==a.nodeValue.length&&(d?c.setStartAfter(a):c.setEndAfter(a)))}var c=this;a(c.startContainer,c.startOffset,!0);a(c.endContainer,c.endOffset,!1);return c},enlarge:function(a){function c(c,d,k){c=i(c);if(!(c.type==3||Ia[c.name]||!a&&c.isBlock()))if(d===0){for(;!c.prev();){d=c.parent();if(!d||Ia[d.name]||!a&&d.isBlock())break;
+c=d}k?b.setStartBefore(c[0]):b.setEndBefore(c[0])}else if(d==c.children().length){for(;!c.next();){d=c.parent();if(!d||Ia[d.name]||!a&&d.isBlock())break;c=d}k?b.setStartAfter(c[0]):b.setEndAfter(c[0])}}var b=this;b.up();c(b.startContainer,b.startOffset,!0);c(b.endContainer,b.endOffset,!1);return b},shrink:function(){for(var a,c=this.collapsed;this.startContainer.nodeType==1&&(a=this.startContainer.childNodes[this.startOffset])&&a.nodeType==1&&!i(a).isSingle();)this.setStart(a,0);if(c)return this.collapse(c);
+for(;this.endContainer.nodeType==1&&this.endOffset>0&&(a=this.endContainer.childNodes[this.endOffset-1])&&a.nodeType==1&&!i(a).isSingle();)this.setEnd(a,a.childNodes.length);return this},createBookmark:function(a){var c,b=i('<span style="display:none;"></span>',this.doc)[0];b.id="__kindeditor_bookmark_start_"+Ib++ +"__";if(!this.collapsed)c=b.cloneNode(!0),c.id="__kindeditor_bookmark_end_"+Ib++ +"__";c&&this.cloneRange().collapse(!1).insertNode(c).setEndBefore(c);this.insertNode(b).setStartAfter(b);
+return{start:a?"#"+b.id:b,end:c?a?"#"+c.id:c:null}},moveToBookmark:function(a){var c=this.doc,b=i(a.start,c),a=a.end?i(a.end,c):null;if(!b||b.length<1)return this;this.setStartBefore(b[0]);b.remove();a&&a.length>0?(this.setEndBefore(a[0]),a.remove()):this.collapse(!0);return this},dump:function(){console.log("--------------------");console.log(this.startContainer.nodeType==3?this.startContainer.nodeValue:this.startContainer,this.startOffset);console.log(this.endContainer.nodeType==3?this.endContainer.nodeValue:
+this.endContainer,this.endOffset)}});i.RangeClass=Z;i.range=Pa;i.START_TO_START=ra;i.START_TO_END=qa;i.END_TO_END=na;i.END_TO_START=sa;A(ua,{init:function(a){var c=a.doc;this.doc=c;this.win=ha(c);this.sel=Qa(c);this.range=a},selection:function(a){var c=this.doc,b;b=Qa(c);var d;try{d=b.rangeCount>0?b.getRangeAt(0):b.createRange()}catch(e){}b=C&&(!d||!d.item&&d.parentElement().ownerDocument!==c)?null:d;this.sel=Qa(c);if(b)return this.range=Pa(b),i(this.range.startContainer).name=="html"&&this.range.selectNodeContents(c.body).collapse(!1),
+this;a&&this.range.selectNodeContents(c.body).collapse(!1);return this},select:function(a){var a=r(a,!0),c=this.sel,b=this.range.cloneRange().shrink(),d=b.startContainer,e=b.startOffset,k=ga(d),g=this.win,h,j=!1;if(a&&d.nodeType==1&&b.collapsed){if(C){c=i("<span>&nbsp;</span>",k);b.insertNode(c[0]);h=k.body.createTextRange();try{h.moveToElementText(c[0])}catch(n){}h.collapse(!1);h.select();c.remove();g.focus();return this}if(ja&&(a=d.childNodes,i(d).isInline()||e>0&&i(a[e-1]).isInline()||a[e]&&i(a[e]).isInline()))b.insertNode(k.createTextNode("\u200b")),
+j=!0}if(C)try{h=b.get(!0),h.select()}catch(o){}else j&&b.collapse(!1),h=b.get(!0),c.removeAllRanges(),c.addRange(h),k!==document&&(b=i(h.endContainer).pos(),g.scrollTo(b.x,b.y));g.focus();return this},wrap:function(a){var c=this.range,b;b=i(a,this.doc);if(c.collapsed)return c.shrink(),c.insertNode(b[0]).selectNodeContents(b[0]),this;if(b.isBlock()){for(var d=a=b.clone(!0);d.first();)d=d.first();d.append(c.extractContents());c.insertNode(a[0]).selectNode(a[0]);return this}c.enlarge();var e=c.createBookmark(),
+a=c.commonAncestor(),k=!1;i(a).scan(function(a){if(!k&&a==e.start)k=!0;else if(k){if(a==e.end)return!1;var c=i(a),d;a:{for(d=c;d&&d.name!="body";){if(Ja[d.name]||d.name=="div"&&d.hasClass("ke-script")){d=!0;break a}d=d.parent()}d=!1}if(!d&&c.type==3&&m(a.nodeValue).length>0){for(var g;(g=c.parent())&&g.isStyle()&&g.children().length==1;)c=g;g=b;g=g.clone(!0);if(c.type==3)Ta(g).append(c.clone(!1)),c.replaceWith(g);else{for(var a=c,h;(h=c.first())&&h.children().length==1;)c=h;h=c.first();for(c=c.doc.createDocumentFragment();h;)c.appendChild(h[0]),
+h=h.next();h=a.clone(!0);d=Ta(h);for(var j=h,n=!1;g;){for(;j;)j.name===g.name&&(Nb(j,g.attr(),g.css()),n=!0),j=j.first();n||d.append(g.clone(!1));n=!1;g=g.first()}g=h;c.firstChild&&Ta(g).append(c);a.replaceWith(g)}}}});c.moveToBookmark(e);return this},split:function(a,c){for(var b=this.range,d=b.doc,e=b.cloneRange().collapse(a),k=e.startContainer,g=e.startOffset,h=k.nodeType==3?k.parentNode:k,j=!1,n;h&&h.parentNode;){n=i(h);if(c){if(!n.isStyle())break;if(!Ra(n,c))break}else if(Ia[n.name])break;j=
+!0;h=h.parentNode}if(j)d=d.createElement("span"),b.cloneRange().collapse(!a).insertNode(d),a?e.setStartBefore(h.firstChild).setEnd(k,g):e.setStart(k,g).setEndAfter(h.lastChild),k=e.extractContents(),g=k.firstChild,j=k.lastChild,a?(e.insertNode(k),b.setStartAfter(j).setEndBefore(d)):(h.appendChild(k),b.setStartBefore(d).setEndBefore(g)),e=d.parentNode,e==b.endContainer&&(h=i(d).prev(),k=i(d).next(),h&&k&&h.type==3&&k.type==3?b.setEnd(h[0],h[0].nodeValue.length):a||b.setEnd(b.endContainer,b.endOffset-
+1)),e.removeChild(d);return this},remove:function(a){var c=this.doc,b=this.range;b.enlarge();if(b.startOffset===0){for(var d=i(b.startContainer),e;(e=d.parent())&&e.isStyle()&&e.children().length==1;)d=e;b.setStart(d[0],0);d=i(b.startContainer);d.isBlock()&&Sa(d,a);(d=d.parent())&&d.isBlock()&&Sa(d,a)}if(b.collapsed){this.split(!0,a);c=b.startContainer;d=b.startOffset;if(d>0&&(e=i(c.childNodes[d-1]))&&oa(e))e.remove(),b.setStart(c,d-1);(d=i(c.childNodes[d]))&&oa(d)&&d.remove();oa(c)&&(b.startBefore(c),
+c.remove());b.collapse(!0);return this}this.split(!0,a);this.split(!1,a);var k=c.createElement("span"),g=c.createElement("span");b.cloneRange().collapse(!1).insertNode(g);b.cloneRange().collapse(!0).insertNode(k);var j=[],n=!1;i(b.commonAncestor()).scan(function(a){if(!n&&a==k)n=!0;else{if(a==g)return!1;n&&j.push(a)}});i(k).remove();i(g).remove();c=b.startContainer;d=b.startOffset;e=b.endContainer;var o=b.endOffset;if(d>0){var m=i(c.childNodes[d-1]);m&&oa(m)&&(m.remove(),b.setStart(c,d-1),c==e&&b.setEnd(e,
+o-1));if((d=i(c.childNodes[d]))&&oa(d))d.remove(),c==e&&b.setEnd(e,o-1)}(c=i(e.childNodes[b.endOffset]))&&oa(c)&&c.remove();c=b.createBookmark(!0);h(j,function(c,b){Sa(i(b),a)});b.moveToBookmark(c);return this},commonNode:function(a){function c(c){for(var b=c;c;){if(Ra(i(c),a))return i(c);c=c.parentNode}for(;b&&(b=b.lastChild);)if(Ra(i(b),a))return i(b);return null}var b=this.range,d=b.endContainer,b=b.endOffset,e=d.nodeType==3||b===0?d:d.childNodes[b-1],k=c(e);if(k)return k;if(e.nodeType==1||d.nodeType==
+3&&b===0)if(d=i(e).prev())return c(d);return null},commonAncestor:function(a){function c(c){for(;c;){if(c.nodeType==1&&c.tagName.toLowerCase()===a)return c;c=c.parentNode}return null}var b=this.range,d=b.startContainer,e=b.startOffset,k=b.endContainer,b=b.endOffset,k=k.nodeType==3||b===0?k:k.childNodes[b-1],d=c(d.nodeType==3||e===0?d:d.childNodes[e-1]),e=c(k);if(d&&e&&d===e)return i(d);return null},state:function(a){var c=this.doc,b=!1;try{b=c.queryCommandState(a)}catch(d){}return b},val:function(a){var c=
+this.doc,a=a.toLowerCase(),b="";if(a==="fontfamily"||a==="fontname")return b=nb(c,"fontname"),b=b.replace(/['"]/g,""),b.toLowerCase();if(a==="formatblock"){b=nb(c,a);if(b===""&&(a=this.commonNode({"h1,h2,h3,h4,h5,h6,p,div,pre,address":"*"})))b=a.name;b==="Normal"&&(b="p");return b.toLowerCase()}if(a==="fontsize")return(a=this.commonNode({"*":".font-size"}))&&(b=a.css("font-size")),b.toLowerCase();if(a==="forecolor")return(a=this.commonNode({"*":".color"}))&&(b=a.css("color")),b=q(b),b===""&&(b="default"),
+b.toLowerCase();if(a==="hilitecolor")return(a=this.commonNode({"*":".background-color"}))&&(b=a.css("background-color")),b=q(b),b===""&&(b="default"),b.toLowerCase();return b},toggle:function(a,c){this.commonNode(c)?this.remove(c):this.wrap(a);return this.select()},bold:function(){return this.toggle("<strong></strong>",{span:".font-weight=bold",strong:"*",b:"*"})},italic:function(){return this.toggle("<em></em>",{span:".font-style=italic",em:"*",i:"*"})},underline:function(){return this.toggle("<u></u>",
+{span:".text-decoration=underline",u:"*"})},strikethrough:function(){return this.toggle("<s></s>",{span:".text-decoration=line-through",s:"*"})},forecolor:function(a){return this.toggle('<span style="color:'+a+';"></span>',{span:".color="+a,font:"color"})},hilitecolor:function(a){return this.toggle('<span style="background-color:'+a+';"></span>',{span:".background-color="+a})},fontsize:function(a){return this.toggle('<span style="font-size:'+a+';"></span>',{span:".font-size="+a,font:"size"})},fontname:function(a){return this.fontfamily(a)},
+fontfamily:function(a){return this.toggle('<span style="font-family:'+a+';"></span>',{span:".font-family="+a,font:"face"})},removeformat:function(){var a={"*":".font-weight,.font-style,.text-decoration,.color,.background-color,.font-size,.font-family,.text-indent"};h(Fb,function(c){a[c]="*"});this.remove(a);return this.select()},inserthtml:function(a,c){function b(a,c){var c='<img id="__kindeditor_temp_tag__" width="0" height="0" style="display:none;" />'+c,d=a.get();d.item?d.item(0).outerHTML=c:
+d.pasteHTML(c);var f=a.doc.getElementById("__kindeditor_temp_tag__");f.parentNode.removeChild(f);d=mb(d);a.setEnd(d.endContainer,d.endOffset);a.collapse(!1);e.select(!1)}function d(a,c){var b=a.doc,f=b.createDocumentFragment();i("@"+c,b).each(function(){f.appendChild(this)});a.deleteContents();a.insertNode(f);a.collapse(!1);e.select(!1)}var e=this,k=e.range;if(a==="")return e;if(C&&c){try{b(k,a)}catch(g){d(k,a)}return e}d(k,a);return e},hr:function(){return this.inserthtml("<hr />")},print:function(){this.win.print();
+return this},insertimage:function(a,c,b,d,e,i){c=r(c,"");r(e,0);a='<img src="'+s(a)+'" data-ke-src="'+s(a)+'" ';b&&(a+='width="'+s(b)+'" ');d&&(a+='height="'+s(d)+'" ');c&&(a+='title="'+s(c)+'" ');i&&(a+='align="'+s(i)+'" ');a+='alt="'+s(c)+'" ';a+="/>";return this.inserthtml(a)},createlink:function(a,c){var b=this.doc,d=this.range;this.select();var e=this.commonNode({a:"*"});e&&!d.isControl()&&(d.selectNode(e.get()),this.select());e='<a href="'+s(a)+'" data-ke-src="'+s(a)+'" ';c&&(e+=' target="'+
+s(c)+'"');if(d.collapsed)return e+=">"+s(a)+"</a>",this.inserthtml(e);if(d.isControl()){var k=i(d.startContainer.childNodes[d.startOffset]);e+="></a>";k.after(i(e,b));k.next().append(k);d.selectNode(k[0]);return this.select()}ba(b,"createlink","__kindeditor_temp_url__");i('a[href="__kindeditor_temp_url__"]',b).each(function(){i(this).attr("href",a).attr("data-ke-src",a);c?i(this).attr("target",c):i(this).removeAttr("target")});return this},unlink:function(){var a=this.doc,c=this.range;this.select();
+if(c.collapsed){var b=this.commonNode({a:"*"});b&&(c.selectNode(b.get()),this.select());ba(a,"unlink",null);ja&&i(c.startContainer).name==="img"&&(a=i(c.startContainer).parent(),a.name==="a"&&a.remove(!0))}else ba(a,"unlink",null);return this}});h("formatblock,selectall,justifyleft,justifycenter,justifyright,justifyfull,insertorderedlist,insertunorderedlist,indent,outdent,subscript,superscript".split(","),function(a,c){ua.prototype[c]=function(a){this.select();ba(this.doc,c,a);(!C||e(c,"formatblock,selectall,insertorderedlist,insertunorderedlist".split(","))>=
+0)&&this.selection();return this}});h("cut,copy,paste".split(","),function(a,c){ua.prototype[c]=function(){if(!this.doc.queryCommandSupported(c))throw"not supported";this.select();ba(this.doc,c,null);return this}});i.CmdClass=ua;i.cmd=rb;A(da,{init:function(a){var c=this;c.name=a.name||"";c.doc=a.doc||document;c.win=ha(c.doc);c.x=j(a.x);c.y=j(a.y);c.z=a.z;c.width=j(a.width);c.height=j(a.height);c.div=i('<div style="display:block;"></div>');c.options=a;c._alignEl=a.alignEl;c.width&&c.div.css("width",
+c.width);c.height&&c.div.css("height",c.height);c.z&&c.div.css({position:"absolute",left:c.x,top:c.y,"z-index":c.z});c.z&&(c.x===d||c.y===d)&&c.autoPos(c.width,c.height);a.cls&&c.div.addClass(a.cls);a.shadowMode&&c.div.addClass("ke-shadow");a.css&&c.div.css(a.css);a.src?i(a.src).replaceWith(c.div):i(c.doc.body).append(c.div);a.html&&c.div.html(a.html);if(a.autoScroll)if(C&&O<7||aa){var b=ma();i(c.win).bind("scroll",function(){var a=ma(),d=a.x-b.x,a=a.y-b.y;c.pos(o(c.x)+d,o(c.y)+a,!1)})}else c.div.css("position",
+"fixed")},pos:function(a,c,b){b=r(b,!0);if(a!==null&&(a=a<0?0:j(a),this.div.css("left",a),b))this.x=a;if(c!==null&&(c=c<0?0:j(c),this.div.css("top",c),b))this.y=c;return this},autoPos:function(a,c){var b=o(a)||0,d=o(c)||0,e=ma();if(this._alignEl){var k=i(this._alignEl),g=k.pos(),b=ca(k[0].clientWidth/2-b/2),d=ca(k[0].clientHeight/2-d/2);x=b<0?g.x:g.x+b;y=d<0?g.y:g.y+d}else g=X(this.doc),x=ca(e.x+(g.clientWidth-b)/2),y=ca(e.y+(g.clientHeight-d)/2);C&&O<7||aa||(x-=e.x,y-=e.y);return this.pos(x,y)},
+remove:function(){var a=this;(C&&O<7||aa)&&i(a.win).unbind("scroll");a.div.remove();h(a,function(c){a[c]=null});return this},show:function(){this.div.show();return this},hide:function(){this.div.hide();return this},draggable:function(a){var c=this,a=a||{};a.moveEl=c.div;a.moveFn=function(a,b,d,e,i,g){if((a+=i)<0)a=0;if((b+=g)<0)b=0;c.pos(a,b)};Ua(a);return c}});i.WidgetClass=da;i.widget=Wa;var Xa="";if(I=document.getElementsByTagName("html"))Xa=I[0].dir;A(wa,da,{init:function(a){function c(){var c=
+Va(b.iframe);c.open();if(h)c.domain=document.domain;c.write(Ob(d,e,k,g));c.close();b.win=b.iframe[0].contentWindow;b.doc=c;var j=rb(c);b.afterChange(function(){j.selection()});ja&&i(c).click(function(a){i(a.target).name==="img"&&(j.selection(!0),j.range.selectNode(a.target),j.select())});if(C)b._mousedownHandler=function(){var a=j.range.cloneRange();a.shrink();a.isControl()&&b.blur()},i(document).mousedown(b._mousedownHandler),i(c).keydown(function(a){if(a.which==8){j.selection();var c=j.range;c.isControl()&&
+(c.collapse(!0),i(c.startContainer.childNodes[c.startOffset]).remove(),a.preventDefault())}});b.cmd=j;b.html(va(b.srcElement));C?(c.body.disabled=!0,c.body.contentEditable=!0,c.body.removeAttribute("disabled")):c.designMode="on";a.afterCreate&&a.afterCreate.call(b)}var b=this;wa.parent.init.call(b,a);b.srcElement=i(a.srcElement);b.div.addClass("ke-edit");b.designMode=r(a.designMode,!0);b.beforeGetHtml=a.beforeGetHtml;b.beforeSetHtml=a.beforeSetHtml;b.afterSetHtml=a.afterSetHtml;var d=r(a.themesPath,
+""),e=a.bodyClass,k=a.cssPath,g=a.cssData,h=location.host.replace(/:\d+/,"")!==document.domain,j="document.open();"+(h?'document.domain="'+document.domain+'";':"")+"document.close();",j=C?' src="javascript:void(function(){'+encodeURIComponent(j)+'}())"':"";b.iframe=i('<iframe class="ke-edit-iframe" hidefocus="true" frameborder="0"'+j+"></iframe>").css("width","100%");b.textarea=i('<textarea class="ke-edit-textarea" hidefocus="true"></textarea>').css("width","100%");b.width&&b.setWidth(b.width);b.height&&
+b.setHeight(b.height);b.designMode?b.textarea.hide():b.iframe.hide();h&&b.iframe.bind("load",function(){b.iframe.unbind("load");C?c():setTimeout(c,0)});b.div.append(b.iframe);b.div.append(b.textarea);b.srcElement.hide();!h&&c()},setWidth:function(a){this.div.css("width",j(a));return this},setHeight:function(a){a=j(a);this.div.css("height",a);this.iframe.css("height",a);if(C&&O<8||aa)a=j(o(a)-2);this.textarea.css("height",a);return this},remove:function(){var a=this.doc;i(a.body).unbind();i(a).unbind();
+i(this.win).unbind();this._mousedownHandler&&i(document).unbind("mousedown",this._mousedownHandler);va(this.srcElement,this.html());this.srcElement.show();a.write("");this.iframe.unbind();this.textarea.unbind();wa.parent.remove.call(this)},html:function(a,c){var b=this.doc;if(this.designMode){b=b.body;if(a===d)return a=c?"<!doctype html><html>"+b.parentNode.innerHTML+"</html>":b.innerHTML,this.beforeGetHtml&&(a=this.beforeGetHtml(a)),pa&&a=="<br />"&&(a=""),a;this.beforeSetHtml&&(a=this.beforeSetHtml(a));
+C&&O>=9&&(a=a.replace(/(<.*?checked=")checked(".*>)/ig,"$1$2"));i(b).html(a);this.afterSetHtml&&this.afterSetHtml();return this}if(a===d)return this.textarea.val();this.textarea.val(a);return this},design:function(a){if(a===d?!this.designMode:a){if(!this.designMode)a=this.html(),this.designMode=!0,this.html(a),this.textarea.hide(),this.iframe.show()}else if(this.designMode)a=this.html(),this.designMode=!1,this.html(a),this.iframe.hide(),this.textarea.show();return this.focus()},focus:function(){this.designMode?
+this.win.focus():this.textarea[0].focus();return this},blur:function(){if(C){var a=i('<input type="text" style="float:left;width:0;height:0;padding:0;margin:0;border:0;" value="" />',this.div);this.div.append(a);a[0].focus();a.remove()}else this.designMode?this.win.blur():this.textarea[0].blur();return this},afterChange:function(a){function c(c){setTimeout(function(){a(c)},1)}var b=this.doc,d=b.body;i(b).keyup(function(c){!c.ctrlKey&&!c.altKey&&cb[c.which]&&a(c)});i(b).mouseup(a).contextmenu(a);i(this.win).blur(a);
+i(d).bind("paste",c);i(d).bind("cut",c);return this}});i.EditClass=wa;i.edit=sb;i.iframeDoc=Va;A(Ea,da,{init:function(a){function c(a){a=i(a);if(a.hasClass("ke-outline"))return a;if(a.hasClass("ke-toolbar-icon"))return a.parent()}function b(a,d){var f=c(a.target);if(f&&!f.hasClass("ke-disabled")&&!f.hasClass("ke-selected"))f[d]("ke-on")}var d=this;Ea.parent.init.call(d,a);d.disableMode=r(a.disableMode,!1);d.noDisableItemMap=z(r(a.noDisableItems,[]));d._itemMap={};d.div.addClass("ke-toolbar").bind("contextmenu,mousedown,mousemove",
+function(a){a.preventDefault()}).attr("unselectable","on");d.div.mouseover(function(a){b(a,"addClass")}).mouseout(function(a){b(a,"removeClass")}).click(function(a){var b=c(a.target);b&&!b.hasClass("ke-disabled")&&d.options.click.call(this,a,b.attr("data-name"))})},get:function(a){if(this._itemMap[a])return this._itemMap[a];return this._itemMap[a]=i("span.ke-icon-"+a,this.div).parent()},select:function(a){tb.call(this,a,function(a){a.addClass("ke-selected")});return self},unselect:function(a){tb.call(this,
+a,function(a){a.removeClass("ke-selected").removeClass("ke-on")});return self},enable:function(a){if(a=a.get?a:this.get(a))a.removeClass("ke-disabled"),a.opacity(1);return this},disable:function(a){if(a=a.get?a:this.get(a))a.removeClass("ke-selected").addClass("ke-disabled"),a.opacity(0.5);return this},disableAll:function(a,c){var b=this,e=b.noDisableItemMap;c&&(e=z(c));(a===d?!b.disableMode:a)?(i("span.ke-outline",b.div).each(function(){var a=i(this),c=a[0].getAttribute("data-name",2);e[c]||b.disable(a)}),
+b.disableMode=!0):(i("span.ke-outline",b.div).each(function(){var a=i(this),c=a[0].getAttribute("data-name",2);e[c]||b.enable(a)}),b.disableMode=!1);return b}});i.ToolbarClass=Ea;i.toolbar=ub;A(xa,da,{init:function(a){a.z=a.z||811213;xa.parent.init.call(this,a);this.centerLineMode=r(a.centerLineMode,!0);this.div.addClass("ke-menu").bind("click,mousedown",function(a){a.stopPropagation()}).attr("unselectable","on")},addItem:function(a){if(a.title==="-")this.div.append(i('<div class="ke-menu-separator"></div>'));
+else{var c=i('<div class="ke-menu-item" unselectable="on"></div>'),b=i('<div class="ke-inline-block ke-menu-item-left"></div>'),d=i('<div class="ke-inline-block ke-menu-item-right"></div>'),e=j(a.height),k=r(a.iconClass,"");this.div.append(c);e&&(c.css("height",e),d.css("line-height",e));var g;this.centerLineMode&&(g=i('<div class="ke-inline-block ke-menu-item-center"></div>'),e&&g.css("height",e));c.mouseover(function(){i(this).addClass("ke-menu-item-on");g&&g.addClass("ke-menu-item-center-on")}).mouseout(function(){i(this).removeClass("ke-menu-item-on");
+g&&g.removeClass("ke-menu-item-center-on")}).click(function(c){a.click.call(i(this));c.stopPropagation()}).append(b);g&&c.append(g);c.append(d);a.checked&&(k="ke-icon-checked");k!==""&&b.html('<span class="ke-inline-block ke-toolbar-icon ke-toolbar-icon-url '+k+'"></span>');d.html(a.title);return this}},remove:function(){this.options.beforeRemove&&this.options.beforeRemove.call(this);i(".ke-menu-item",this.div[0]).unbind();xa.parent.remove.call(this);return this}});i.MenuClass=xa;i.menu=Ya;A(ya,da,
+{init:function(a){a.z=a.z||811213;ya.parent.init.call(this,a);var c=a.colors||[["#E53333","#E56600","#FF9900","#64451D","#DFC5A4","#FFE500"],["#009900","#006600","#99BB00","#B8D100","#60D978","#00D5FF"],["#337FE5","#003399","#4C33E5","#9933E5","#CC33E5","#EE33EE"],["#FFFFFF","#CCCCCC","#999999","#666666","#333333","#000000"]];this.selectedColor=(a.selectedColor||"").toLowerCase();this._cells=[];this.div.addClass("ke-colorpicker").bind("click,mousedown",function(a){a.stopPropagation()}).attr("unselectable",
+"on");a=this.doc.createElement("table");this.div.append(a);a.className="ke-colorpicker-table";a.cellPadding=0;a.cellSpacing=0;a.border=0;var b=a.insertRow(0),d=b.insertCell(0);d.colSpan=c[0].length;this._addAttr(d,"","ke-colorpicker-cell-top");for(var e=0;e<c.length;e++)for(var b=a.insertRow(e+1),i=0;i<c[e].length;i++)d=b.insertCell(i),this._addAttr(d,c[e][i],"ke-colorpicker-cell")},_addAttr:function(a,c,b){var d=this,a=i(a).addClass(b);d.selectedColor===c.toLowerCase()&&a.addClass("ke-colorpicker-cell-selected");
+a.attr("title",c||d.options.noColor);a.mouseover(function(){i(this).addClass("ke-colorpicker-cell-on")});a.mouseout(function(){i(this).removeClass("ke-colorpicker-cell-on")});a.click(function(a){a.stop();d.options.click.call(i(this),c)});c?a.append(i('<div class="ke-colorpicker-cell-color" unselectable="on"></div>').css("background-color",c)):a.html(d.options.noColor);i(a).attr("unselectable","on");d._cells.push(a)},remove:function(){h(this._cells,function(){this.unbind()});ya.parent.remove.call(this);
+return this}});i.ColorPickerClass=ya;i.colorpicker=vb;A(Za,{init:function(a){var c=i(a.button),b=a.fieldName||"file",d=a.url||"",e=c.val(),k=a.extraParams||{},g=c[0].className||"",h=a.target||"kindeditor_upload_iframe_"+(new Date).getTime();a.afterError=a.afterError||function(a){alert(a)};var j=[],n;for(n in k)j.push('<input type="hidden" name="'+n+'" value="'+k[n]+'" />');b=['<div class="ke-inline-block '+g+'">',a.target?"":'<iframe name="'+h+'" style="display:none;"></iframe>',a.form?'<div class="ke-upload-area">':
+'<form class="ke-upload-area ke-form" method="post" enctype="multipart/form-data" target="'+h+'" action="'+d+'">','<span class="ke-button-common">',j.join(""),'<input type="button" class="ke-button-common ke-button" value="'+e+'" />',"</span>",'<input type="file" class="ke-upload-file" name="'+b+'" tabindex="-1" />',a.form?"</div>":"</form>","</div>"].join("");b=i(b,c.doc);c.hide();c.before(b);this.div=b;this.button=c;this.iframe=a.target?i('iframe[name="'+h+'"]'):i("iframe",b);this.form=a.form?i(a.form):
+i("form",b);c=a.width||i(".ke-button-common",b).width();this.fileBox=i(".ke-upload-file",b).width(c);this.options=a},submit:function(){var a=this,c=a.iframe;c.bind("load",function(){c.unbind();var b=document.createElement("form");a.fileBox.before(b);i(b).append(a.fileBox);b.reset();i(b).remove(!0);var b=i.iframeDoc(c),d=b.getElementsByTagName("pre")[0],e="",k,e=d?d.innerHTML:b.body.innerHTML,e=t(e);c[0].src="javascript:false";try{k=i.json(e)}catch(g){a.options.afterError.call(a,"<!doctype html><html>"+
+b.body.parentNode.innerHTML+"</html>")}k&&a.options.afterUpload.call(a,k)});a.form[0].submit();return a},remove:function(){this.fileBox&&this.fileBox.unbind();this.iframe.remove();this.div.remove();this.button.show();return this}});i.UploadButtonClass=Za;i.uploadbutton=function(a){return new Za(a)};A(za,da,{init:function(a){var c=r(a.shadowMode,!0);a.z=a.z||811213;a.shadowMode=!1;a.autoScroll=r(a.autoScroll,!0);za.parent.init.call(this,a);var b=a.title,d=i(a.body,this.doc),e=a.previewBtn,k=a.yesBtn,
+g=a.noBtn,j=a.closeBtn,n=r(a.showMask,!0);this.div.addClass("ke-dialog").bind("click,mousedown",function(a){a.stopPropagation()});var m=i('<div class="ke-dialog-content"></div>').appendTo(this.div);C&&O<7?this.iframeMask=i('<iframe src="about:blank" class="ke-dialog-shadow"></iframe>').appendTo(this.div):c&&i('<div class="ke-dialog-shadow"></div>').appendTo(this.div);c=i('<div class="ke-dialog-header"></div>');m.append(c);c.html(b);this.closeIcon=i('<span class="ke-dialog-icon-close" title="'+j.name+
+'"></span>').click(j.click);c.append(this.closeIcon);this.draggable({clickEl:c,beforeDrag:a.beforeDrag});a=i('<div class="ke-dialog-body"></div>');m.append(a);a.append(d);var l=i('<div class="ke-dialog-footer"></div>');(e||k||g)&&m.append(l);h([{btn:e,name:"preview"},{btn:k,name:"yes"},{btn:g,name:"no"}],function(){if(this.btn){var a=this.btn,a=a||{},c=a.name||"",b=i('<span class="ke-button-common ke-button-outer" title="'+c+'"></span>'),c=i('<input class="ke-button-common ke-button" type="button" value="'+
+c+'" />');a.click&&c.click(a.click);b.append(c);b.addClass("ke-dialog-"+this.name);l.append(b)}});this.height&&a.height(o(this.height)-c.height()-l.height());this.div.width(this.div.width());this.div.height(this.div.height());this.mask=null;if(n)d=X(this.doc),this.mask=Wa({x:0,y:0,z:this.z-1,cls:"ke-dialog-mask",width:Math.max(d.scrollWidth,d.clientWidth),height:Math.max(d.scrollHeight,d.clientHeight)});this.autoPos(this.div.width(),this.div.height());this.footerDiv=l;this.bodyDiv=a;this.headerDiv=
+c;this.isLoading=!1},setMaskIndex:function(a){this.mask.div.css("z-index",a)},showLoading:function(a){var a=r(a,""),c=this.bodyDiv;this.loading=i('<div class="ke-dialog-loading"><div class="ke-inline-block ke-dialog-loading-content" style="margin-top:'+Math.round(c.height()/3)+'px;">'+a+"</div></div>").width(c.width()).height(c.height()).css("top",this.headerDiv.height()+"px");c.css("visibility","hidden").after(this.loading);this.isLoading=!0;return this},hideLoading:function(){this.loading&&this.loading.remove();
+this.bodyDiv.css("visibility","visible");this.isLoading=!1;return this},remove:function(){this.options.beforeRemove&&this.options.beforeRemove.call(this);this.mask&&this.mask.remove();this.iframeMask&&this.iframeMask.remove();this.closeIcon.unbind();i("input",this.div).unbind();i("button",this.div).unbind();this.footerDiv.unbind();this.bodyDiv.unbind();this.headerDiv.unbind();i("iframe",this.div).each(function(){i(this).remove()});za.parent.remove.call(this);return this}});i.DialogClass=za;i.dialog=
+wb;i.tabs=function(a){var c=Wa(a),b=c.remove,d=a.afterSelect,a=c.div,e=[];a.addClass("ke-tabs").bind("contextmenu,mousedown,mousemove",function(a){a.preventDefault()});var g=i('<ul class="ke-tabs-ul ke-clearfix"></ul>');a.append(g);c.add=function(a){var c=i('<li class="ke-tabs-li">'+a.title+"</li>");c.data("tab",a);e.push(c);g.append(c)};c.selectedIndex=0;c.select=function(a){c.selectedIndex=a;h(e,function(b,d){d.unbind();b===a?(d.addClass("ke-tabs-li-selected"),i(d.data("tab").panel).show("")):(d.removeClass("ke-tabs-li-selected").removeClass("ke-tabs-li-on").mouseover(function(){i(this).addClass("ke-tabs-li-on")}).mouseout(function(){i(this).removeClass("ke-tabs-li-on")}).click(function(){c.select(b)}),
+i(d.data("tab").panel).hide())});d&&d.call(c,a)};c.remove=function(){h(e,function(){this.remove()});g.remove();b.call(c)};return c};i.loadScript=$a;i.loadStyle=ab;i.ajax=function(a,c,d,e,i){var d=d||"GET",i=i||"json",g=b.XMLHttpRequest?new b.XMLHttpRequest:new ActiveXObject("Microsoft.XMLHTTP");g.open(d,a,!0);g.onreadystatechange=function(){if(g.readyState==4&&g.status==200&&c){var a=m(g.responseText);i=="json"&&(a=w(a));c(a)}};if(d=="POST"){var j=[];h(e,function(a,c){j.push(encodeURIComponent(a)+
+"="+encodeURIComponent(c))});try{g.setRequestHeader("Content-Type","application/x-www-form-urlencoded")}catch(n){}g.send(j.join("&"))}else g.send(null)};var ia={},$={};Aa.prototype={lang:function(a){return Ab(a,this.langType)},loadPlugin:function(a,c){var b=this;if(ia[a]){if(b._calledPlugins[a])return c&&c.call(b),b;ia[a].call(b,KindEditor);c&&c.call(b);b._calledPlugins[a]=!0;return b}if(b.isLoading)return b;b.isLoading=!0;$a(b.pluginsPath+a+"/"+a+".js?ver="+encodeURIComponent(i.DEBUG?Ga:Ha),function(){b.isLoading=
+!1;ia[a]&&b.loadPlugin(a,c)});return b},handler:function(a,c){var b=this;b._handlers[a]||(b._handlers[a]=[]);if(l(c))return b._handlers[a].push(c),b;h(b._handlers[a],function(){c=this.call(b,c)});return c},clickToolbar:function(a,c){var b=this,e="clickToolbar"+a;if(c===d){if(b._handlers[e])return b.handler(e);b.loadPlugin(a,function(){b.handler(e)});return b}return b.handler(e,c)},updateState:function(){var a=this;h("justifyleft,justifycenter,justifyright,justifyfull,insertorderedlist,insertunorderedlist,subscript,superscript,bold,italic,underline,strikethrough".split(","),
+function(c,b){a.cmd.state(b)?a.toolbar.select(b):a.toolbar.unselect(b)});return a},addContextmenu:function(a){this._contextmenus.push(a);return this},afterCreate:function(a){return this.handler("afterCreate",a)},beforeRemove:function(a){return this.handler("beforeRemove",a)},beforeGetHtml:function(a){return this.handler("beforeGetHtml",a)},beforeSetHtml:function(a){return this.handler("beforeSetHtml",a)},afterSetHtml:function(a){return this.handler("afterSetHtml",a)},create:function(){function a(){m.height()===
+0?setTimeout(a,100):c.resize(e,g,!1)}var c=this,d=c.fullscreenMode;if(c.isCreated)return c;if(c.srcElement.data("kindeditor"))return c;c.srcElement.data("kindeditor","true");d?X().style.overflow="hidden":X().style.overflow="";var e=d?X().clientWidth+"px":c.width,g=d?X().clientHeight+"px":c.height;if(C&&O<8||aa)g=j(o(g)+2);var k=c.container=i(c.layout);d?i(document.body).append(k):c.srcElement.before(k);var h=i(".toolbar",k),n=i(".edit",k),m=c.statusbar=i(".statusbar",k);k.removeClass("container").addClass("ke-container ke-container-"+
+c.themeType).css("width",e);if(d){k.css({position:"absolute",left:0,top:0,"z-index":811211});if(!pa)c._scrollPos=ma();b.scrollTo(0,0);i(document.body).css({height:"1px",overflow:"hidden"});i(document.body.parentNode).css("overflow","hidden");c._fullscreenExecuted=!0}else c._fullscreenExecuted&&(i(document.body).css({height:"",overflow:""}),i(document.body.parentNode).css("overflow","")),c._scrollPos&&b.scrollTo(c._scrollPos.x,c._scrollPos.y);var l=[];i.each(c.items,function(a,b){b=="|"?l.push('<span class="ke-inline-block ke-separator"></span>'):
+b=="/"?l.push('<div class="ke-hr"></div>'):(l.push('<span class="ke-outline" data-name="'+b+'" title="'+c.lang(b)+'" unselectable="on">'),l.push('<span class="ke-toolbar-icon ke-toolbar-icon-url ke-icon-'+b+'" unselectable="on"></span></span>'))});var h=c.toolbar=ub({src:h,html:l.join(""),noDisableItems:c.noDisableItems,click:function(a,b){a.stop();if(c.menu){var d=c.menu.name;c.hideMenu();if(d===b)return}c.clickToolbar(b)}}),s=o(g)-h.div.height(),q=c.edit=sb({height:s>0&&o(g)>c.minHeight?s:c.minHeight,
+src:n,srcElement:c.srcElement,designMode:c.designMode,themesPath:c.themesPath,bodyClass:c.bodyClass,cssPath:c.cssPath,cssData:c.cssData,beforeGetHtml:function(a){a=c.beforeGetHtml(a);return J(a,c.filterMode?c.htmlTags:null,c.urlType,c.wellFormatMode,c.indentChar)},beforeSetHtml:function(a){a=J(a,c.filterMode?c.htmlTags:null,"",!1);return c.beforeSetHtml(a)},afterSetHtml:function(){c.edit=q=this;c.afterSetHtml()},afterCreate:function(){c.edit=q=this;c.cmd=q.cmd;c._docMousedownFn=function(){c.menu&&
+c.hideMenu()};i(q.doc,document).mousedown(c._docMousedownFn);Pb.call(c);Qb.call(c);Rb.call(c);Sb.call(c);q.afterChange(function(){q.designMode&&(c.updateState(),c.addBookmark(),c.options.afterChange&&c.options.afterChange.call(c))});q.textarea.keyup(function(a){!a.ctrlKey&&!a.altKey&&Hb[a.which]&&c.options.afterChange&&c.options.afterChange.call(c)});c.readonlyMode&&c.readonly();c.isCreated=!0;if(c.initContent==="")c.initContent=c.html();c.afterCreate();c.options.afterCreate&&c.options.afterCreate.call(c)}});
+m.removeClass("statusbar").addClass("ke-statusbar").append('<span class="ke-inline-block ke-statusbar-center-icon"></span>').append('<span class="ke-inline-block ke-statusbar-right-icon"></span>');if(c._fullscreenResizeHandler)i(b).unbind("resize",c._fullscreenResizeHandler),c._fullscreenResizeHandler=null;a();d?(c._fullscreenResizeHandler=function(){c.isCreated&&c.resize(X().clientWidth,X().clientHeight,!1)},i(b).bind("resize",c._fullscreenResizeHandler),h.select("fullscreen"),m.first().css("visibility",
+"hidden"),m.last().css("visibility","hidden")):(pa&&i(b).bind("scroll",function(){c._scrollPos=ma()}),c.resizeType>0?Ua({moveEl:k,clickEl:m,moveFn:function(a,b,d,f,e,i){f+=i;c.resize(null,f)}}):m.first().css("visibility","hidden"),c.resizeType===2?Ua({moveEl:k,clickEl:m.last(),moveFn:function(a,b,d,f,e,i){d+=e;f+=i;c.resize(d,f)}}):m.last().css("visibility","hidden"));return c},remove:function(){var a=this;if(!a.isCreated)return a;a.beforeRemove();a.srcElement.data("kindeditor","");a.menu&&a.hideMenu();
+h(a.dialogs,function(){a.hideDialog()});i(document).unbind("mousedown",a._docMousedownFn);a.toolbar.remove();a.edit.remove();a.statusbar.last().unbind();a.statusbar.unbind();a.container.remove();a.container=a.toolbar=a.edit=a.menu=null;a.dialogs=[];a.isCreated=!1;return a},resize:function(a,c,b){b=r(b,!0);if(a&&(/%/.test(a)||(a=o(a),a=a<this.minWidth?this.minWidth:a),this.container.css("width",j(a)),b))this.width=j(a);if(c&&(c=o(c),editHeight=o(c)-this.toolbar.div.height()-this.statusbar.height(),
+editHeight=editHeight<this.minHeight?this.minHeight:editHeight,this.edit.setHeight(editHeight),b))this.height=j(c);return this},select:function(){this.isCreated&&this.cmd.select();return this},html:function(a){if(a===d)return this.isCreated?this.edit.html():va(this.srcElement);this.isCreated?this.edit.html(a):va(this.srcElement,a);this.isCreated&&this.cmd.selection();return this},fullHtml:function(){return this.isCreated?this.edit.html(d,!0):""},text:function(a){return a===d?m(this.html().replace(/<(?!img|embed).*?>/ig,
+"").replace(/&nbsp;/ig," ")):this.html(s(a))},isEmpty:function(){return m(this.text().replace(/\r\n|\n|\r/,""))===""},isDirty:function(){return m(this.initContent.replace(/\r\n|\n|\r|t/g,""))!==m(this.html().replace(/\r\n|\n|\r|t/g,""))},selectedHtml:function(){return this.isCreated?this.cmd.range.html():""},count:function(a){a=(a||"html").toLowerCase();if(a==="html")return ka(bb(this.html())).length;if(a==="text")return this.text().replace(/<(?:img|embed).*?>/ig,"K").replace(/\r\n|\n|\r/g,"").length;
+return 0},exec:function(a){var a=a.toLowerCase(),c=this.cmd,b=e(a,"selectall,copy,paste,print".split(","))<0;b&&this.addBookmark(!1);c[a].apply(c,D(arguments,1));b&&(this.updateState(),this.addBookmark(!1),this.options.afterChange&&this.options.afterChange.call(this));return this},insertHtml:function(a,b){if(!this.isCreated)return this;a=this.beforeSetHtml(a);this.exec("inserthtml",a,b);return this},appendHtml:function(a){this.html(this.html()+a);if(this.isCreated)a=this.cmd,a.range.selectNodeContents(a.doc.body).collapse(!1),
+a.select();return this},sync:function(){va(this.srcElement,this.html());return this},focus:function(){this.isCreated?this.edit.focus():this.srcElement[0].focus();return this},blur:function(){this.isCreated?this.edit.blur():this.srcElement[0].blur();return this},addBookmark:function(a){var a=r(a,!0),b=this.edit,d=b.doc.body,e=bb(d.innerHTML);if(a&&this._undoStack.length>0&&Math.abs(e.length-ka(this._undoStack[this._undoStack.length-1].html).length)<this.minChangeSize)return this;b.designMode&&!this._firstAddBookmark?
+(b=this.cmd.range,a=b.createBookmark(!0),a.html=bb(d.innerHTML),b.moveToBookmark(a)):a={html:e};this._firstAddBookmark=!1;Bb(this._undoStack,a);return this},undo:function(){return Cb.call(this,this._undoStack,this._redoStack)},redo:function(){return Cb.call(this,this._redoStack,this._undoStack)},fullscreen:function(a){this.fullscreenMode=a===d?!this.fullscreenMode:a;return this.remove().create()},readonly:function(a){var a=r(a,!0),b=this,d=b.edit,e=d.doc;b.designMode?b.toolbar.disableAll(a,[]):h(b.noDisableItems,
+function(){b.toolbar[a?"disable":"enable"](this)});C?e.body.contentEditable=!a:e.designMode=a?"off":"on";d.textarea[0].disabled=a},createMenu:function(a){var b=this.toolbar.get(a.name),f=b.pos();a.x=f.x;a.y=f.y+b.height();a.z=this.options.zIndex;a.shadowMode=r(a.shadowMode,this.shadowMode);a.selectedColor!==d?(a.cls="ke-colorpicker-"+this.themeType,a.noColor=this.lang("noColor"),this.menu=vb(a)):(a.cls="ke-menu-"+this.themeType,a.centerLineMode=!1,this.menu=Ya(a));return this.menu},hideMenu:function(){this.menu.remove();
+this.menu=null;return this},hideContextmenu:function(){this.contextmenu.remove();this.contextmenu=null;return this},createDialog:function(a){var b=this;a.z=b.options.zIndex;a.shadowMode=r(a.shadowMode,b.shadowMode);a.closeBtn=r(a.closeBtn,{name:b.lang("close"),click:function(){b.hideDialog();C&&b.cmd&&b.cmd.select()}});a.noBtn=r(a.noBtn,{name:b.lang(a.yesBtn?"no":"close"),click:function(){b.hideDialog();C&&b.cmd&&b.cmd.select()}});if(b.dialogAlignType!="page")a.alignEl=b.container;a.cls="ke-dialog-"+
+b.themeType;if(b.dialogs.length>0){var d=b.dialogs[b.dialogs.length-1];b.dialogs[0].setMaskIndex(d.z+2);a.z=d.z+3;a.showMask=!1}a=wb(a);b.dialogs.push(a);return a},hideDialog:function(){this.dialogs.length>0&&this.dialogs.pop().remove();this.dialogs.length>0&&this.dialogs[0].setMaskIndex(this.dialogs[this.dialogs.length-1].z-1);return this},errorDialog:function(a){var b=this.createDialog({width:750,title:this.lang("uploadError"),body:'<div style="padding:10px 20px;"><iframe frameborder="0" style="width:708px;height:400px;"></iframe></div>'}),
+b=i("iframe",b.div),d=i.iframeDoc(b);d.open();d.write(a);d.close();i(d.body).css("background-color","#FFF");b[0].contentWindow.focus();return this}};_instances=[];i.remove=function(a){Eb(a,function(a){this.remove();_instances.splice(a,1)})};i.sync=function(a){Eb(a,function(){this.sync()})};C&&O<7&&ba(document,"BackgroundImageCache",!0);i.EditorClass=Aa;i.editor=function(a){return new Aa(a)};i.create=Db;i.instances=_instances;i.plugin=yb;i.lang=Ab;yb("core",function(a){var c=this,f={undo:"Z",redo:"Y",
+bold:"B",italic:"I",underline:"U",print:"P",selectall:"A"};c.afterSetHtml(function(){c.options.afterChange&&c.options.afterChange.call(c)});c.afterCreate(function(){if(c.syncType=="form"){for(var d=a(c.srcElement),f=!1;d=d.parent();)if(d.name=="form"){f=!0;break}if(f){d.bind("submit",function(){c.sync();a(b).bind("unload",function(){c.edit.textarea.remove()})});var e=a('[type="reset"]',d);e.click(function(){c.html(c.initContent);c.cmd.selection()});c.beforeRemove(function(){d.unbind();e.unbind()})}}});
+c.clickToolbar("source",function(){c.edit.designMode?(c.toolbar.disableAll(!0),c.edit.design(!1),c.toolbar.select("source")):(c.toolbar.disableAll(!1),c.edit.design(!0),c.toolbar.unselect("source"),c.cmd.selection());c.designMode=c.edit.designMode});c.afterCreate(function(){c.designMode||c.toolbar.disableAll(!0).select("source")});c.clickToolbar("fullscreen",function(){c.fullscreen()});if(c.fullscreenShortcut){var i=!1;c.afterCreate(function(){a(c.edit.doc,c.edit.textarea).keyup(function(a){a.which==
+27&&setTimeout(function(){c.fullscreen()},0)});if(i){if(C&&!c.designMode)return;c.focus()}i||(i=!0)})}h("undo,redo".split(","),function(a,b){f[b]&&c.afterCreate(function(){V(this.edit.doc,f[b],function(){c.clickToolbar(b)})});c.clickToolbar(b,function(){c[b]()})});c.clickToolbar("formatblock",function(){var a=c.lang("formatblock.formatBlock"),b={h1:28,h2:24,h3:18,H4:14,p:12},d=c.cmd.val("formatblock"),f=c.createMenu({name:"formatblock",width:c.langType=="en"?200:150});h(a,function(a,e){var i="font-size:"+
+b[a]+"px;";a.charAt(0)==="h"&&(i+="font-weight:bold;");f.addItem({title:'<span style="'+i+'" unselectable="on">'+e+"</span>",height:b[a]+12,checked:d===a||d===e,click:function(){c.select().exec("formatblock","<"+a+">").hideMenu()}})})});c.clickToolbar("fontname",function(){var a=c.cmd.val("fontname"),b=c.createMenu({name:"fontname",width:150});h(c.lang("fontname.fontName"),function(d,f){b.addItem({title:'<span style="font-family: '+d+';" unselectable="on">'+f+"</span>",checked:a===d.toLowerCase()||
+a===f.toLowerCase(),click:function(){c.exec("fontname",d).hideMenu()}})})});c.clickToolbar("fontsize",function(){var a=c.cmd.val("fontsize"),b=c.createMenu({name:"fontsize",width:150});h(c.fontSizeTable,function(d,f){b.addItem({title:'<span style="font-size:'+f+';" unselectable="on">'+f+"</span>",height:o(f)+12,checked:a===f,click:function(){c.exec("fontsize",f).hideMenu()}})})});h("forecolor,hilitecolor".split(","),function(a,b){c.clickToolbar(b,function(){c.createMenu({name:b,selectedColor:c.cmd.val(b)||
+"default",colors:c.colorTable,click:function(a){c.exec(b,a).hideMenu()}})})});h("cut,copy,paste".split(","),function(a,b){c.clickToolbar(b,function(){c.focus();try{c.exec(b,null)}catch(a){alert(c.lang(b+"Error"))}})});c.clickToolbar("about",function(){var a='<div style="margin:20px;"><div>KindEditor '+Ha+'</div><div>Copyright &copy; <a href="http://www.kindsoft.net/" target="_blank">kindsoft.net</a> All rights reserved.</div></div>';c.createDialog({name:"about",width:350,title:c.lang("about"),body:a})});
+c.plugin.getSelectedLink=function(){return c.cmd.commonAncestor("a")};c.plugin.getSelectedImage=function(){return Fa(c.edit.cmd.range,function(a){return!/^ke-\w+$/i.test(a[0].className)})};c.plugin.getSelectedFlash=function(){return Fa(c.edit.cmd.range,function(a){return a[0].className=="ke-flash"})};c.plugin.getSelectedMedia=function(){return Fa(c.edit.cmd.range,function(a){return a[0].className=="ke-media"||a[0].className=="ke-rm"})};c.plugin.getSelectedAnchor=function(){return Fa(c.edit.cmd.range,
+function(a){return a[0].className=="ke-anchor"})};h("link,image,flash,media,anchor".split(","),function(a,b){var f=b.charAt(0).toUpperCase()+b.substr(1);h("edit,delete".split(","),function(a,e){c.addContextmenu({title:c.lang(e+f),click:function(){c.loadPlugin(b,function(){c.plugin[b][e]();c.hideMenu()})},cond:c.plugin["getSelected"+f],width:150,iconClass:e=="edit"?"ke-icon-"+b:d})});c.addContextmenu({title:"-"})});c.plugin.getSelectedTable=function(){return c.cmd.commonAncestor("table")};c.plugin.getSelectedRow=
+function(){return c.cmd.commonAncestor("tr")};c.plugin.getSelectedCell=function(){return c.cmd.commonAncestor("td")};h("prop,cellprop,colinsertleft,colinsertright,rowinsertabove,rowinsertbelow,rowmerge,colmerge,rowsplit,colsplit,coldelete,rowdelete,insert,delete".split(","),function(a,b){var d=e(b,["prop","delete"])<0?c.plugin.getSelectedCell:c.plugin.getSelectedTable;c.addContextmenu({title:c.lang("table"+b),click:function(){c.loadPlugin("table",function(){c.plugin.table[b]();c.hideMenu()})},cond:d,
+width:170,iconClass:"ke-icon-table"+b})});c.addContextmenu({title:"-"});h("selectall,justifyleft,justifycenter,justifyright,justifyfull,insertorderedlist,insertunorderedlist,indent,outdent,subscript,superscript,hr,print,bold,italic,underline,strikethrough,removeformat,unlink".split(","),function(a,b){f[b]&&c.afterCreate(function(){V(this.edit.doc,f[b],function(){c.cmd.selection();c.clickToolbar(b)})});c.clickToolbar(b,function(){c.focus().exec(b,null)})});c.afterCreate(function(){function b(){f.range.moveToBookmark(e);
+f.select();ja&&(a("div."+g,i).each(function(){a(this).after("<br />").remove(!0)}),a("span.Apple-style-span",i).remove(!0),a("span.Apple-tab-span",i).remove(!0),a("span[style]",i).each(function(){a(this).css("white-space")=="nowrap"&&a(this).remove(!0)}),a("meta",i).remove());var d=i[0].innerHTML;i.remove();d!==""&&(ja&&(d=d.replace(/(<br>)\1/ig,"$1")),c.pasteType===2&&(d=d.replace(/(<(?:p|p\s[^>]*)>) *(<\/p>)/ig,""),/schemas-microsoft-com|worddocument|mso-\w+/i.test(d)?d=W(d,c.filterMode?c.htmlTags:
+a.options.htmlTags):(d=J(d,c.filterMode?c.htmlTags:null),d=c.beforeSetHtml(d))),c.pasteType===1&&(d=d.replace(/&nbsp;/ig," "),d=d.replace(/\n\s*\n/g,"\n"),d=d.replace(/<br[^>]*>/ig,"\n"),d=d.replace(/<\/p><p[^>]*>/ig,"\n"),d=d.replace(/<[^>]+>/g,""),d=d.replace(/ {2}/g," &nbsp;"),c.newlineTag=="p"?/\n/.test(d)&&(d=d.replace(/^/,"<p>").replace(/$/,"<br /></p>").replace(/\n/g,"<br /></p><p>")):d=d.replace(/\n/g,"<br />$&")),c.insertHtml(d,!0))}var d=c.edit.doc,f,e,i,g="__kindeditor_paste__",h=!1;a(d.body).bind("paste",
+function(j){if(c.pasteType===0)j.stop();else if(!h){h=!0;a("div."+g,d).remove();f=c.cmd.selection();e=f.range.createBookmark();i=a('<div class="'+g+'"></div>',d).css({position:"absolute",width:"1px",height:"1px",overflow:"hidden",left:"-1981px",top:a(e.start).pos().y+"px","white-space":"nowrap"});a(d.body).append(i);if(C){var n=f.range.get(!0);n.moveToElementText(i[0]);n.select();n.execCommand("paste");j.preventDefault()}else f.range.selectNodeContents(i[0]),f.select();setTimeout(function(){b();h=
+!1},0)}})});c.beforeGetHtml(function(a){C&&O<=8&&(a=a.replace(/<div\s+[^>]*data-ke-input-tag="([^"]*)"[^>]*>([\s\S]*?)<\/div>/ig,function(a,b){return unescape(b)}),a=a.replace(/(<input)((?:\s+[^>]*)?>)/ig,function(a,b,c){if(!/\s+type="[^"]+"/i.test(a))return b+' type="text"'+c;return a}));return a.replace(/(<(?:noscript|noscript\s[^>]*)>)([\s\S]*?)(<\/noscript>)/ig,function(a,b,c,d){return b+t(c).replace(/\s+/g," ")+d}).replace(/<img[^>]*class="?ke-(flash|rm|media)"?[^>]*>/ig,function(a){var a=G(a),
+b=Q(a.style||""),c=fa(a["data-ke-tag"]);c.width=r(a.width,o(r(b.width,"")));c.height=r(a.height,o(r(b.height,"")));return Ka(c)}).replace(/<img[^>]*class="?ke-anchor"?[^>]*>/ig,function(a){a=G(a);return'<a name="'+unescape(a["data-ke-name"])+'"></a>'}).replace(/<div\s+[^>]*data-ke-script-attr="([^"]*)"[^>]*>([\s\S]*?)<\/div>/ig,function(a,b,c){return"<script"+unescape(b)+">"+unescape(c)+"<\/script>"}).replace(/<div\s+[^>]*data-ke-noscript-attr="([^"]*)"[^>]*>([\s\S]*?)<\/div>/ig,function(a,b,c){return"<noscript"+
+unescape(b)+">"+unescape(c)+"</noscript>"}).replace(/(<[^>]*)data-ke-src="([^"]*)"([^>]*>)/ig,function(a,b,c){a=a.replace(/(\s+(?:href|src)=")[^"]*(")/i,function(a,b,d){return b+t(c)+d});return a=a.replace(/\s+data-ke-src="[^"]*"/i,"")}).replace(/(<[^>]+\s)data-ke-(on\w+="[^"]*"[^>]*>)/ig,function(a,b,c){return b+c})});c.beforeSetHtml(function(a){C&&O<=8&&(a=a.replace(/<input[^>]*>|<(select|button)[^>]*>[\s\S]*?<\/\1>/ig,function(a){var b=G(a);if(Q(b.style||"").display=="none")return'<div class="ke-display-none" data-ke-input-tag="'+
+escape(a)+'"></div>';return a}));return a.replace(/<embed[^>]*type="([^"]+)"[^>]*>(?:<\/embed>)?/ig,function(a){a=G(a);a.src=r(a.src,"");a.width=r(a.width,0);a.height=r(a.height,0);return ib(c.themesPath+"common/blank.gif",a)}).replace(/<a[^>]*name="([^"]+)"[^>]*>(?:<\/a>)?/ig,function(a){var b=G(a);if(b.href!==d)return a;return'<img class="ke-anchor" src="'+c.themesPath+'common/anchor.gif" data-ke-name="'+escape(b.name)+'" />'}).replace(/<script([^>]*)>([\s\S]*?)<\/script>/ig,function(a,b,c){return'<div class="ke-script" data-ke-script-attr="'+
+escape(b)+'">'+escape(c)+"</div>"}).replace(/<noscript([^>]*)>([\s\S]*?)<\/noscript>/ig,function(a,b,c){return'<div class="ke-noscript" data-ke-noscript-attr="'+escape(b)+'">'+escape(c)+"</div>"}).replace(/(<[^>]*)(href|src)="([^"]*)"([^>]*>)/ig,function(a,b,c,d,f){if(a.match(/\sdata-ke-src="[^"]*"/i))return a;return a=b+c+'="'+d+'" data-ke-src="'+s(d)+'"'+f}).replace(/(<[^>]+\s)(on\w+="[^"]*"[^>]*>)/ig,function(a,b,c){return b+"data-ke-"+c}).replace(/<table[^>]*\s+border="0"[^>]*>/ig,function(a){if(a.indexOf("ke-zeroborder")>=
+0)return a;return S(a,"ke-zeroborder")})})})}})(window);
+KindEditor.lang({source:"HTML\u4ee3\u7801",preview:"\u9884\u89c8",undo:"\u540e\u9000(Ctrl+Z)",redo:"\u524d\u8fdb(Ctrl+Y)",cut:"\u526a\u5207(Ctrl+X)",copy:"\u590d\u5236(Ctrl+C)",paste:"\u7c98\u8d34(Ctrl+V)",plainpaste:"\u7c98\u8d34\u4e3a\u65e0\u683c\u5f0f\u6587\u672c",wordpaste:"\u4eceWord\u7c98\u8d34",selectall:"\u5168\u9009(Ctrl+A)",justifyleft:"\u5de6\u5bf9\u9f50",justifycenter:"\u5c45\u4e2d",justifyright:"\u53f3\u5bf9\u9f50",justifyfull:"\u4e24\u7aef\u5bf9\u9f50",insertorderedlist:"\u7f16\u53f7",
+insertunorderedlist:"\u9879\u76ee\u7b26\u53f7",indent:"\u589e\u52a0\u7f29\u8fdb",outdent:"\u51cf\u5c11\u7f29\u8fdb",subscript:"\u4e0b\u6807",superscript:"\u4e0a\u6807",formatblock:"\u6bb5\u843d",fontname:"\u5b57\u4f53",fontsize:"\u6587\u5b57\u5927\u5c0f",forecolor:"\u6587\u5b57\u989c\u8272",hilitecolor:"\u6587\u5b57\u80cc\u666f",bold:"\u7c97\u4f53(Ctrl+B)",italic:"\u659c\u4f53(Ctrl+I)",underline:"\u4e0b\u5212\u7ebf(Ctrl+U)",strikethrough:"\u5220\u9664\u7ebf",removeformat:"\u5220\u9664\u683c\u5f0f",
+image:"\u56fe\u7247",multiimage:"\u6279\u91cf\u56fe\u7247\u4e0a\u4f20",flash:"Flash",media:"\u89c6\u97f3\u9891",table:"\u8868\u683c",tablecell:"\u5355\u5143\u683c",hr:"\u63d2\u5165\u6a2a\u7ebf",emoticons:"\u63d2\u5165\u8868\u60c5",link:"\u8d85\u7ea7\u94fe\u63a5",unlink:"\u53d6\u6d88\u8d85\u7ea7\u94fe\u63a5",fullscreen:"\u5168\u5c4f\u663e\u793a",about:"\u5173\u4e8e",print:"\u6253\u5370(Ctrl+P)",filemanager:"\u6587\u4ef6\u7a7a\u95f4",code:"\u63d2\u5165\u7a0b\u5e8f\u4ee3\u7801",map:"Google\u5730\u56fe",
+baidumap:"\u767e\u5ea6\u5730\u56fe",lineheight:"\u884c\u8ddd",clearhtml:"\u6e05\u7406HTML\u4ee3\u7801",pagebreak:"\u63d2\u5165\u5206\u9875\u7b26",quickformat:"\u4e00\u952e\u6392\u7248",insertfile:"\u63d2\u5165\u6587\u4ef6",template:"\u63d2\u5165\u6a21\u677f",anchor:"\u951a\u70b9",yes:"\u786e\u5b9a",no:"\u53d6\u6d88",close:"\u5173\u95ed",editImage:"\u56fe\u7247\u5c5e\u6027",deleteImage:"\u5220\u9664\u56fe\u7247",editFlash:"Flash\u5c5e\u6027",deleteFlash:"\u5220\u9664Flash",editMedia:"\u89c6\u97f3\u9891\u5c5e\u6027",
+deleteMedia:"\u5220\u9664\u89c6\u97f3\u9891",editLink:"\u8d85\u7ea7\u94fe\u63a5\u5c5e\u6027",deleteLink:"\u53d6\u6d88\u8d85\u7ea7\u94fe\u63a5",editAnchor:"\u951a\u70b9\u5c5e\u6027",deleteAnchor:"\u5220\u9664\u951a\u70b9",tableprop:"\u8868\u683c\u5c5e\u6027",tablecellprop:"\u5355\u5143\u683c\u5c5e\u6027",tableinsert:"\u63d2\u5165\u8868\u683c",tabledelete:"\u5220\u9664\u8868\u683c",tablecolinsertleft:"\u5de6\u4fa7\u63d2\u5165\u5217",tablecolinsertright:"\u53f3\u4fa7\u63d2\u5165\u5217",tablerowinsertabove:"\u4e0a\u65b9\u63d2\u5165\u884c",
+tablerowinsertbelow:"\u4e0b\u65b9\u63d2\u5165\u884c",tablerowmerge:"\u5411\u4e0b\u5408\u5e76\u5355\u5143\u683c",tablecolmerge:"\u5411\u53f3\u5408\u5e76\u5355\u5143\u683c",tablerowsplit:"\u62c6\u5206\u884c",tablecolsplit:"\u62c6\u5206\u5217",tablecoldelete:"\u5220\u9664\u5217",tablerowdelete:"\u5220\u9664\u884c",noColor:"\u65e0\u989c\u8272",pleaseSelectFile:"\u8bf7\u9009\u62e9\u6587\u4ef6\u3002",invalidImg:"\u8bf7\u8f93\u5165\u6709\u6548\u7684URL\u5730\u5740\u3002\n\u53ea\u5141\u8bb8jpg,gif,bmp,png\u683c\u5f0f\u3002",
+invalidMedia:"\u8bf7\u8f93\u5165\u6709\u6548\u7684URL\u5730\u5740\u3002\n\u53ea\u5141\u8bb8swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb\u683c\u5f0f\u3002",invalidWidth:"\u5bbd\u5ea6\u5fc5\u987b\u4e3a\u6570\u5b57\u3002",invalidHeight:"\u9ad8\u5ea6\u5fc5\u987b\u4e3a\u6570\u5b57\u3002",invalidBorder:"\u8fb9\u6846\u5fc5\u987b\u4e3a\u6570\u5b57\u3002",invalidUrl:"\u8bf7\u8f93\u5165\u6709\u6548\u7684URL\u5730\u5740\u3002",invalidRows:"\u884c\u6570\u4e3a\u5fc5\u9009\u9879\uff0c\u53ea\u5141\u8bb8\u8f93\u5165\u5927\u4e8e0\u7684\u6570\u5b57\u3002",
+invalidCols:"\u5217\u6570\u4e3a\u5fc5\u9009\u9879\uff0c\u53ea\u5141\u8bb8\u8f93\u5165\u5927\u4e8e0\u7684\u6570\u5b57\u3002",invalidPadding:"\u8fb9\u8ddd\u5fc5\u987b\u4e3a\u6570\u5b57\u3002",invalidSpacing:"\u95f4\u8ddd\u5fc5\u987b\u4e3a\u6570\u5b57\u3002",invalidJson:"\u670d\u52a1\u5668\u53d1\u751f\u6545\u969c\u3002",uploadSuccess:"\u4e0a\u4f20\u6210\u529f\u3002",cutError:"\u60a8\u7684\u6d4f\u89c8\u5668\u5b89\u5168\u8bbe\u7f6e\u4e0d\u5141\u8bb8\u4f7f\u7528\u526a\u5207\u64cd\u4f5c\uff0c\u8bf7\u4f7f\u7528\u5feb\u6377\u952e(Ctrl+X)\u6765\u5b8c\u6210\u3002",
+copyError:"\u60a8\u7684\u6d4f\u89c8\u5668\u5b89\u5168\u8bbe\u7f6e\u4e0d\u5141\u8bb8\u4f7f\u7528\u590d\u5236\u64cd\u4f5c\uff0c\u8bf7\u4f7f\u7528\u5feb\u6377\u952e(Ctrl+C)\u6765\u5b8c\u6210\u3002",pasteError:"\u60a8\u7684\u6d4f\u89c8\u5668\u5b89\u5168\u8bbe\u7f6e\u4e0d\u5141\u8bb8\u4f7f\u7528\u7c98\u8d34\u64cd\u4f5c\uff0c\u8bf7\u4f7f\u7528\u5feb\u6377\u952e(Ctrl+V)\u6765\u5b8c\u6210\u3002",ajaxLoading:"\u52a0\u8f7d\u4e2d\uff0c\u8bf7\u7a0d\u5019 ...",uploadLoading:"\u4e0a\u4f20\u4e2d\uff0c\u8bf7\u7a0d\u5019 ...",
+uploadError:"\u4e0a\u4f20\u9519\u8bef","plainpaste.comment":"\u8bf7\u4f7f\u7528\u5feb\u6377\u952e(Ctrl+V)\u628a\u5185\u5bb9\u7c98\u8d34\u5230\u4e0b\u9762\u7684\u65b9\u6846\u91cc\u3002","wordpaste.comment":"\u8bf7\u4f7f\u7528\u5feb\u6377\u952e(Ctrl+V)\u628a\u5185\u5bb9\u7c98\u8d34\u5230\u4e0b\u9762\u7684\u65b9\u6846\u91cc\u3002","code.pleaseInput":"\u8bf7\u8f93\u5165\u7a0b\u5e8f\u4ee3\u7801\u3002","link.url":"URL","link.linkType":"\u6253\u5f00\u7c7b\u578b","link.newWindow":"\u65b0\u7a97\u53e3","link.selfWindow":"\u5f53\u524d\u7a97\u53e3",
+"flash.url":"URL","flash.width":"\u5bbd\u5ea6","flash.height":"\u9ad8\u5ea6","flash.upload":"\u4e0a\u4f20","flash.viewServer":"\u6587\u4ef6\u7a7a\u95f4","media.url":"URL","media.width":"\u5bbd\u5ea6","media.height":"\u9ad8\u5ea6","media.autostart":"\u81ea\u52a8\u64ad\u653e","media.upload":"\u4e0a\u4f20","media.viewServer":"\u6587\u4ef6\u7a7a\u95f4","image.remoteImage":"\u7f51\u7edc\u56fe\u7247","image.localImage":"\u672c\u5730\u4e0a\u4f20","image.remoteUrl":"\u56fe\u7247\u5730\u5740","image.localUrl":"\u4e0a\u4f20\u6587\u4ef6",
+"image.size":"\u56fe\u7247\u5927\u5c0f","image.width":"\u5bbd","image.height":"\u9ad8","image.resetSize":"\u91cd\u7f6e\u5927\u5c0f","image.align":"\u5bf9\u9f50\u65b9\u5f0f","image.defaultAlign":"\u9ed8\u8ba4\u65b9\u5f0f","image.leftAlign":"\u5de6\u5bf9\u9f50","image.rightAlign":"\u53f3\u5bf9\u9f50","image.imgTitle":"\u56fe\u7247\u8bf4\u660e","image.upload":"\u6d4f\u89c8...","image.viewServer":"\u56fe\u7247\u7a7a\u95f4","multiimage.uploadDesc":"\u5141\u8bb8\u7528\u6237\u540c\u65f6\u4e0a\u4f20<%=uploadLimit%>\u5f20\u56fe\u7247\uff0c\u5355\u5f20\u56fe\u7247\u5bb9\u91cf\u4e0d\u8d85\u8fc7<%=sizeLimit%>",
+"multiimage.startUpload":"\u5f00\u59cb\u4e0a\u4f20","multiimage.clearAll":"\u5168\u90e8\u6e05\u7a7a","multiimage.insertAll":"\u5168\u90e8\u63d2\u5165","multiimage.queueLimitExceeded":"\u6587\u4ef6\u6570\u91cf\u8d85\u8fc7\u9650\u5236\u3002","multiimage.fileExceedsSizeLimit":"\u6587\u4ef6\u5927\u5c0f\u8d85\u8fc7\u9650\u5236\u3002","multiimage.zeroByteFile":"\u65e0\u6cd5\u4e0a\u4f20\u7a7a\u6587\u4ef6\u3002","multiimage.invalidFiletype":"\u6587\u4ef6\u7c7b\u578b\u4e0d\u6b63\u786e\u3002","multiimage.unknownError":"\u53d1\u751f\u5f02\u5e38\uff0c\u65e0\u6cd5\u4e0a\u4f20\u3002",
+"multiimage.pending":"\u7b49\u5f85\u4e0a\u4f20","multiimage.uploadError":"\u4e0a\u4f20\u5931\u8d25","filemanager.emptyFolder":"\u7a7a\u6587\u4ef6\u5939","filemanager.moveup":"\u79fb\u5230\u4e0a\u4e00\u7ea7\u6587\u4ef6\u5939","filemanager.viewType":"\u663e\u793a\u65b9\u5f0f\uff1a","filemanager.viewImage":"\u7f29\u7565\u56fe","filemanager.listImage":"\u8be6\u7ec6\u4fe1\u606f","filemanager.orderType":"\u6392\u5e8f\u65b9\u5f0f\uff1a","filemanager.fileName":"\u540d\u79f0","filemanager.fileSize":"\u5927\u5c0f",
+"filemanager.fileType":"\u7c7b\u578b","insertfile.url":"URL","insertfile.title":"\u6587\u4ef6\u8bf4\u660e","insertfile.upload":"\u4e0a\u4f20","insertfile.viewServer":"\u6587\u4ef6\u7a7a\u95f4","table.cells":"\u5355\u5143\u683c\u6570","table.rows":"\u884c\u6570","table.cols":"\u5217\u6570","table.size":"\u5927\u5c0f","table.width":"\u5bbd\u5ea6","table.height":"\u9ad8\u5ea6","table.percent":"%","table.px":"px","table.space":"\u8fb9\u8ddd\u95f4\u8ddd","table.padding":"\u8fb9\u8ddd","table.spacing":"\u95f4\u8ddd",
+"table.align":"\u5bf9\u9f50\u65b9\u5f0f","table.textAlign":"\u6c34\u5e73\u5bf9\u9f50","table.verticalAlign":"\u5782\u76f4\u5bf9\u9f50","table.alignDefault":"\u9ed8\u8ba4","table.alignLeft":"\u5de6\u5bf9\u9f50","table.alignCenter":"\u5c45\u4e2d","table.alignRight":"\u53f3\u5bf9\u9f50","table.alignTop":"\u9876\u90e8","table.alignMiddle":"\u4e2d\u90e8","table.alignBottom":"\u5e95\u90e8","table.alignBaseline":"\u57fa\u7ebf","table.border":"\u8fb9\u6846","table.borderWidth":"\u8fb9\u6846","table.borderColor":"\u989c\u8272",
+"table.backgroundColor":"\u80cc\u666f\u989c\u8272","map.address":"\u5730\u5740: ","map.search":"\u641c\u7d22","baidumap.address":"\u5730\u5740: ","baidumap.search":"\u641c\u7d22","baidumap.insertDynamicMap":"\u63d2\u5165\u52a8\u6001\u5730\u56fe","anchor.name":"\u951a\u70b9\u540d\u79f0","formatblock.formatBlock":{h1:"\u6807\u9898 1",h2:"\u6807\u9898 2",h3:"\u6807\u9898 3",h4:"\u6807\u9898 4",p:"\u6b63 \u6587"},"fontname.fontName":{SimSun:"\u5b8b\u4f53",NSimSun:"\u65b0\u5b8b\u4f53",FangSong_GB2312:"\u4eff\u5b8b_GB2312",
+KaiTi_GB2312:"\u6977\u4f53_GB2312",SimHei:"\u9ed1\u4f53","Microsoft YaHei":"\u5fae\u8f6f\u96c5\u9ed1",Arial:"Arial","Arial Black":"Arial Black","Times New Roman":"Times New Roman","Courier New":"Courier New",Tahoma:"Tahoma",Verdana:"Verdana"},"lineheight.lineHeight":[{1:"\u5355\u500d\u884c\u8ddd"},{"1.5":"1.5\u500d\u884c\u8ddd"},{2:"2\u500d\u884c\u8ddd"},{"2.5":"2.5\u500d\u884c\u8ddd"},{3:"3\u500d\u884c\u8ddd"}],"template.selectTemplate":"\u53ef\u9009\u6a21\u677f","template.replaceContent":"\u66ff\u6362\u5f53\u524d\u5185\u5bb9",
+"template.fileList":{"1.html":"\u56fe\u7247\u548c\u6587\u5b57","2.html":"\u8868\u683c","3.html":"\u9879\u76ee\u7f16\u53f7"}},"zh_CN");
+KindEditor.plugin("anchor",function(b){var d=this,g=d.lang("anchor.");d.plugin.anchor={edit:function(){var l=['<div style="padding:20px;"><div class="ke-dialog-row">','<label for="keName">'+g.name+"</label>",'<input class="ke-input-text" type="text" id="keName" name="name" value="" style="width:100px;" /></div></div>'].join(""),l=d.createDialog({name:"anchor",width:300,title:d.lang("anchor"),body:l,yesBtn:{name:d.lang("yes"),click:function(){d.insertHtml('<a name="'+e.val()+'">').hideDialog().focus()}}}).div,
+e=b('input[name="name"]',l);(l=d.plugin.getSelectedAnchor())&&e.val(unescape(l.attr("data-ke-name")));e[0].focus();e[0].select()},"delete":function(){d.plugin.getSelectedAnchor().remove()}};d.clickToolbar("anchor",d.plugin.anchor.edit)});
+KindEditor.plugin("baidumap",function(b){var d=this,g=d.lang("baidumap."),l=b.undef(d.mapWidth,558),e=b.undef(d.mapHeight,360);d.clickToolbar("baidumap",function(){function h(){t=q[0].contentWindow;p=b.iframeDoc(q)}var m=['<div style="padding:10px 20px;"><div class="ke-header"><div class="ke-left">',g.address+' <input id="kindeditor_plugin_map_address" name="address" class="ke-input-text" value="" style="width:200px;" /> ','<span class="ke-button-common ke-button-outer">','<input type="button" name="searchBtn" class="ke-button-common ke-button" value="'+
+g.search+'" />','</span></div><div class="ke-right">','<input type="checkbox" id="keInsertDynamicMap" name="insertDynamicMap" value="1" /> <label for="keInsertDynamicMap">'+g.insertDynamicMap+"</label>",'</div><div class="ke-clearfix"></div></div>','<div class="ke-map" style="width:'+l+"px;height:"+e+'px;"></div>',"</div>"].join(""),m=d.createDialog({name:"baidumap",width:l+42,title:d.lang("baidumap"),body:m,yesBtn:{name:d.lang("yes"),click:function(){var b=t.map,g=b.getCenter(),g=g.lng+","+g.lat,
+b=b.getZoom(),b=[s[0].checked?d.pluginsPath+"baidumap/index.html":"http://api.map.baidu.com/staticimage","?center="+encodeURIComponent(g),"&zoom="+encodeURIComponent(b),"&width="+l,"&height="+e,"&markers="+encodeURIComponent(g),"&markerStyles="+encodeURIComponent("l,A")].join("");s[0].checked?d.insertHtml('<iframe src="'+b+'" frameborder="0" style="width:'+(l+2)+"px;height:"+(e+2)+'px;"></iframe>'):d.exec("insertimage",b);d.hideDialog().focus()}},beforeRemove:function(){o.remove();p&&p.write("");
+q.remove()}}),n=m.div,j=b('[name="address"]',n),o=b('[name="searchBtn"]',n),s=b('[name="insertDynamicMap"]',m.div),t,p,q=b('<iframe class="ke-textarea" frameborder="0" src="'+d.pluginsPath+'baidumap/map.html" style="width:'+l+"px;height:"+e+'px;"></iframe>');q.bind("load",function(){q.unbind("load");b.IE?h():setTimeout(h,0)});b(".ke-map",n).replaceWith(q);o.click(function(){t.search(j.val())})})});
+KindEditor.plugin("clearhtml",function(b){var d=this;d.clickToolbar("clearhtml",function(){d.focus();var g=d.html(),g=g.replace(/(<script[^>]*>)([\s\S]*?)(<\/script>)/ig,""),g=g.replace(/(<style[^>]*>)([\s\S]*?)(<\/style>)/ig,""),g=b.formatHtml(g,{a:["href","target"],embed:["src","width","height","type","loop","autostart","quality",".width",".height","align","allowscriptaccess"],img:["src","width","height","border","alt","title",".width",".height"],table:["border"],"td,th":["rowspan","colspan"],"div,hr,br,tbody,tr,p,ol,ul,li,blockquote,h1,h2,h3,h4,h5,h6":[]});
+d.html(g);d.cmd.selection(!0);d.addBookmark()})});
+KindEditor.plugin("code",function(b){var d=this;d.clickToolbar("code",function(){var g=d.lang("code."),l=d.createDialog({name:"code",width:450,title:d.lang("code"),body:'<div style="padding:10px 20px;"><div class="ke-dialog-row"><select class="ke-code-type"><option value="js">JavaScript</option><option value="html">HTML</option><option value="css">CSS</option><option value="php">PHP</option><option value="pl">Perl</option><option value="py">Python</option><option value="rb">Ruby</option><option value="java">Java</option><option value="vb">ASP/VB</option><option value="cpp">C/C++</option><option value="cs">C#</option><option value="xml">XML</option><option value="bsh">Shell</option><option value="">Other</option></select></div><textarea class="ke-textarea" style="width:408px;height:260px;"></textarea></div>',yesBtn:{name:d.lang("yes"),
+click:function(){var h=b(".ke-code-type",l.div).val(),m=e.val(),h='<pre class="prettyprint'+(h===""?"":" lang-"+h)+'">\n'+b.escape(m)+"</pre> ";b.trim(m)===""?(alert(g.pleaseInput),e[0].focus()):d.insertHtml(h).hideDialog().focus()}}}),e=b("textarea",l.div);e[0].focus()})});
+KindEditor.plugin("emoticons",function(b){var d=this,g=d.emoticonsPath||d.pluginsPath+"emoticons/images/",l=d.allowPreviewEmoticons===void 0?!0:d.allowPreviewEmoticons,e=1;d.clickToolbar("emoticons",function(){function h(e,h,j){w?e.mouseover(function(){h>D?(w.css("left",0),w.css("right","")):(w.css("left",""),w.css("right",0));H.attr("src",g+j+".gif");b(this).addClass("ke-on")}):e.mouseover(function(){b(this).addClass("ke-on")});e.mouseout(function(){b(this).removeClass("ke-on")});e.click(function(b){d.insertHtml('<img src="'+
+g+j+'.gif" border="0" alt="" />').hideMenu().focus();b.stop()})}function m(d,e){var j=document.createElement("table");e.append(j);w&&(b(j).mouseover(function(){w.show("block")}),b(j).mouseout(function(){w.hide()}),A.push(b(j)));j.className="ke-table";j.cellPadding=0;j.cellSpacing=0;j.border=0;for(var n=(d-1)*q+p,m=0;m<s;m++)for(var o=j.insertRow(m),l=0;l<t;l++){var r=b(o.insertCell(l));r.addClass("ke-cell");h(r,l,n);var v=b('<span class="ke-img"></span>').css("background-position","-"+24*n+"px 0px").css("background-image",
+"url("+g+"static.gif)");r.append(v);A.push(r);n++}return j}function n(){b.each(A,function(){this.unbind()})}function j(b,d){b.click(function(b){n();v.parentNode.removeChild(v);E.remove();v=m(d,r);o(d);e=d;b.stop()})}function o(d){E=b('<div class="ke-page"></div>');r.append(E);for(var e=1;e<=z;e++){if(d!==e){var g=b('<a href="javascript:;">['+e+"]</a>");j(g,e);E.append(g);A.push(g)}else E.append(b("@["+e+"]"));E.append(b("@&nbsp;"))}}var s=5,t=9,p=0,q=s*t,z=Math.ceil(135/q),D=Math.floor(t/2),r=b('<div class="ke-plugin-emoticons"></div>'),
+A=[];d.createMenu({name:"emoticons",beforeRemove:function(){n()}}).div.append(r);var w,H;l&&(w=b('<div class="ke-preview"></div>').css("right",0),H=b('<img class="ke-preview-img" src="'+g+p+'.gif" />'),r.append(w),w.append(H));var v=m(e,r),E;o(e)})});
+KindEditor.plugin("filemanager",function(b){function d(b,d){d.is_dir?b.attr("title",d.filename):b.attr("title",d.filename+" ("+Math.ceil(d.filesize/1024)+"KB, "+d.datetime+")")}var g=this,l=b.undef(g.fileManagerJson,g.basePath+"php/file_manager_json.php"),e=g.pluginsPath+"filemanager/images/",h=g.lang("filemanager.");g.plugin.filemanagerDialog=function(m){function n(d,e,h){d="path="+d+"&order="+e+"&dir="+z;A.showLoading(g.lang("ajaxLoading"));b.ajax(b.addParam(l,d+"&"+(new Date).getTime()),function(b){A.hideLoading();
+h(b)})}function j(d,e,g,h){var j=b.formatUrl(e.current_url+g.filename,"absolute"),o=encodeURIComponent(e.current_dir_path+g.filename+"/");g.is_dir?d.click(function(){n(o,E.val(),h)}):g.is_photo?d.click(function(){r.call(this,j,g.filename)}):d.click(function(){r.call(this,j,g.filename)});U.push(d)}function o(d,e){function g(){v.val()=="VIEW"?n(d.current_dir_path,E.val(),t):n(d.current_dir_path,E.val(),s)}b.each(U,function(){this.unbind()});H.unbind();v.unbind();E.unbind();d.current_dir_path&&H.click(function(){n(d.moveup_dir_path,
+E.val(),e)});v.change(g);E.change(g);w.html("")}function s(d){o(d,s);var g=document.createElement("table");g.className="ke-table";g.cellPadding=0;g.cellSpacing=0;g.border=0;w.append(g);for(var n=d.file_list,m=0,l=n.length;m<l;m++){var q=n[m],t=b(g.insertRow(m));t.mouseover(function(){b(this).addClass("ke-on")}).mouseout(function(){b(this).removeClass("ke-on")});var p=b('<img src="'+(e+(q.is_dir?"folder-16.gif":"file-16.gif"))+'" width="16" height="16" alt="'+q.filename+'" align="absmiddle" />'),p=
+b(t[0].insertCell(0)).addClass("ke-cell ke-name").append(p).append(document.createTextNode(" "+q.filename));!q.is_dir||q.has_file?(t.css("cursor","pointer"),p.attr("title",q.filename),j(p,d,q,s)):p.attr("title",h.emptyFolder);b(t[0].insertCell(1)).addClass("ke-cell ke-size").html(q.is_dir?"-":Math.ceil(q.filesize/1024)+"KB");b(t[0].insertCell(2)).addClass("ke-cell ke-datetime").html(q.datetime)}}function t(g){o(g,t);for(var n=g.file_list,m=0,l=n.length;m<l;m++){var s=n[m],q=b('<div class="ke-inline-block ke-item"></div>');
+w.append(q);var p=b('<div class="ke-inline-block ke-photo"></div>').mouseover(function(){b(this).addClass("ke-on")}).mouseout(function(){b(this).removeClass("ke-on")});q.append(p);var r=g.current_url+s.filename,r=b('<img src="'+(s.is_dir?e+"folder-64.gif":s.is_photo?r:e+"file-64.gif")+'" width="80" height="80" alt="'+s.filename+'" />');!s.is_dir||s.has_file?(p.css("cursor","pointer"),d(p,s),j(p,g,s,t)):p.attr("title",h.emptyFolder);p.append(r);q.append('<div class="ke-name" title="'+s.filename+'">'+
+s.filename+"</div>")}}var p=b.undef(m.width,650),q=b.undef(m.height,510),z=b.undef(m.dirName,""),D=b.undef(m.viewType,"VIEW").toUpperCase(),r=m.clickFn,m=['<div style="padding:10px 20px;"><div class="ke-plugin-filemanager-header"><div class="ke-left">','<img class="ke-inline-block" name="moveupImg" src="'+e+'go-up.gif" width="16" height="16" border="0" alt="" /> ','<a class="ke-inline-block" name="moveupLink" href="javascript:;">'+h.moveup+"</a>",'</div><div class="ke-right">',h.viewType+' <select class="ke-inline-block" name="viewType">',
+'<option value="VIEW">'+h.viewImage+"</option>",'<option value="LIST">'+h.listImage+"</option>","</select> ",h.orderType+' <select class="ke-inline-block" name="orderType">','<option value="NAME">'+h.fileName+"</option>",'<option value="SIZE">'+h.fileSize+"</option>",'<option value="TYPE">'+h.fileType+"</option>",'</select></div><div class="ke-clearfix"></div></div><div class="ke-plugin-filemanager-body"></div></div>'].join(""),A=g.createDialog({name:"filemanager",width:p,height:q,title:g.lang("filemanager"),
+body:m}),p=A.div,w=b(".ke-plugin-filemanager-body",p);b('[name="moveupImg"]',p);var H=b('[name="moveupLink"]',p);b('[name="viewServer"]',p);var v=b('[name="viewType"]',p),E=b('[name="orderType"]',p),U=[];v.val(D);n("",E.val(),D=="VIEW"?t:s);return A}});
+KindEditor.plugin("flash",function(b){var d=this,g=d.lang("flash."),l=b.undef(d.allowFlashUpload,!0),e=b.undef(d.allowFileManager,!1),h=b.undef(d.formatUploadUrl,!0),m=b.undef(d.extraFileUploadParams,{}),n=b.undef(d.filePostName,"imgFile"),j=b.undef(d.uploadJson,d.basePath+"php/upload_json.php");d.plugin.flash={edit:function(){var o=['<div style="padding:20px;"><div class="ke-dialog-row">','<label for="keUrl" style="width:60px;">'+g.url+"</label>",'<input class="ke-input-text" type="text" id="keUrl" name="url" value="" style="width:160px;" /> &nbsp;',
+'<input type="button" class="ke-upload-button" value="'+g.upload+'" /> &nbsp;','<span class="ke-button-common ke-button-outer">','<input type="button" class="ke-button-common ke-button" name="viewServer" value="'+g.viewServer+'" />','</span></div><div class="ke-dialog-row">','<label for="keWidth" style="width:60px;">'+g.width+"</label>",'<input type="text" id="keWidth" class="ke-input-text ke-input-number" name="width" value="550" maxlength="4" /> </div><div class="ke-dialog-row">','<label for="keHeight" style="width:60px;">'+
+g.height+"</label>",'<input type="text" id="keHeight" class="ke-input-text ke-input-number" name="height" value="400" maxlength="4" /> </div></div>'].join(""),s=d.createDialog({name:"flash",width:450,title:d.lang("flash"),body:o,yesBtn:{name:d.lang("yes"),click:function(){var e=b.trim(p.val()),g=q.val(),h=z.val();e=="http://"||b.invalidUrl(e)?(alert(d.lang("invalidUrl")),p[0].focus()):/^\d*$/.test(g)?/^\d*$/.test(h)?(e=b.mediaImg(d.themesPath+"common/blank.gif",{src:e,type:b.mediaType(".swf"),width:g,
+height:h,quality:"high"}),d.insertHtml(e).hideDialog().focus()):(alert(d.lang("invalidHeight")),z[0].focus()):(alert(d.lang("invalidWidth")),q[0].focus())}}}),t=s.div,p=b('[name="url"]',t),o=b('[name="viewServer"]',t),q=b('[name="width"]',t),z=b('[name="height"]',t);p.val("http://");if(l){var D=b.uploadbutton({button:b(".ke-upload-button",t)[0],fieldName:n,extraParams:m,url:b.addParam(j,"dir=flash"),afterUpload:function(e){s.hideLoading();if(e.error===0){var g=e.url;h&&(g=b.formatUrl(g,"absolute"));
+p.val(g);d.afterUpload&&d.afterUpload.call(d,g,e,"flash");alert(d.lang("uploadSuccess"))}else alert(e.message)},afterError:function(b){s.hideLoading();d.errorDialog(b)}});D.fileBox.change(function(){s.showLoading(d.lang("uploadLoading"));D.submit()})}else b(".ke-upload-button",t).hide();e?o.click(function(){d.loadPlugin("filemanager",function(){d.plugin.filemanagerDialog({viewType:"LIST",dirName:"flash",clickFn:function(e){d.dialogs.length>1&&(b('[name="url"]',t).val(e),d.afterSelectFile&&d.afterSelectFile.call(d,
+e),d.hideDialog())}})})}):o.hide();if(o=d.plugin.getSelectedFlash()){var r=b.mediaAttrs(o.attr("data-ke-tag"));p.val(r.src);q.val(b.removeUnit(o.css("width"))||r.width||0);z.val(b.removeUnit(o.css("height"))||r.height||0)}p[0].focus();p[0].select()},"delete":function(){d.plugin.getSelectedFlash().remove();d.addBookmark()}};d.clickToolbar("flash",d.plugin.flash.edit)});
+KindEditor.plugin("image",function(b){var d=this,g=b.undef(d.allowImageUpload,!0),l=b.undef(d.allowImageRemote,!0),e=b.undef(d.formatUploadUrl,!0),h=b.undef(d.allowFileManager,!1),m=b.undef(d.uploadJson,d.basePath+"php/upload_json.php"),n=b.undef(d.imageTabIndex,0),j=d.pluginsPath+"image/images/",o=b.undef(d.extraFileUploadParams,{}),s=b.undef(d.filePostName,"imgFile"),t=b.undef(d.fillDescAfterUploadImage,!1),p=d.lang("image.");d.plugin.imageDialog=function(g){function n(b,d){Q.val(b);G.val(d);T=
+b;fa=d}b.undef(g.imageWidth,"");b.undef(g.imageHeight,"");b.undef(g.imageTitle,"");b.undef(g.imageAlign,"");var l=b.undef(g.showRemote,!0),r=b.undef(g.showLocal,!0),A=b.undef(g.tabIndex,0),w=g.clickFn,H="kindeditor_upload_iframe_"+(new Date).getTime(),v=[],E;for(E in o)v.push('<input type="hidden" name="'+E+'" value="'+o[E]+'" />');var v=['<div style="padding:20px;"><div class="tabs"></div><div class="tab1" style="display:none;"><div class="ke-dialog-row">','<label for="remoteUrl" style="width:60px;">'+
+p.remoteUrl+"</label>",'<input type="text" id="remoteUrl" class="ke-input-text" name="url" value="" style="width:200px;" /> &nbsp;<span class="ke-button-common ke-button-outer">','<input type="button" class="ke-button-common ke-button" name="viewServer" value="'+p.viewServer+'" />','</span></div><div class="ke-dialog-row">','<label for="remoteWidth" style="width:60px;">'+p.size+"</label>",p.width+' <input type="text" id="remoteWidth" class="ke-input-text ke-input-number" name="width" value="" maxlength="4" /> ',
+p.height+' <input type="text" class="ke-input-text ke-input-number" name="height" value="" maxlength="4" /> ','<img class="ke-refresh-btn" src="'+j+'refresh.png" width="16" height="16" alt="" style="cursor:pointer;" title="'+p.resetSize+'" />','</div><div class="ke-dialog-row">','<label style="width:60px;">'+p.align+"</label>",'<input type="radio" name="align" class="ke-inline-block" value="" checked="checked" /> <img name="defaultImg" src="'+j+'align_top.gif" width="23" height="25" alt="" />',' <input type="radio" name="align" class="ke-inline-block" value="left" /> <img name="leftImg" src="'+
+j+'align_left.gif" width="23" height="25" alt="" />',' <input type="radio" name="align" class="ke-inline-block" value="right" /> <img name="rightImg" src="'+j+'align_right.gif" width="23" height="25" alt="" />','</div><div class="ke-dialog-row">','<label for="remoteTitle" style="width:60px;">'+p.imgTitle+"</label>",'<input type="text" id="remoteTitle" class="ke-input-text" name="title" value="" style="width:200px;" /></div></div><div class="tab2" style="display:none;">','<iframe name="'+H+'" style="display:none;"></iframe>',
+'<form class="ke-upload-area ke-form" method="post" enctype="multipart/form-data" target="'+H+'" action="'+b.addParam(m,"dir=image")+'">','<div class="ke-dialog-row">',v.join(""),'<label style="width:60px;">'+p.localUrl+"</label>",'<input type="text" name="localUrl" class="ke-input-text" tabindex="-1" style="width:200px;" readonly="true" /> &nbsp;','<input type="button" class="ke-upload-button" value="'+p.upload+'" />',"</div></form></div></div>"].join(""),U=d.createDialog({name:"image",width:r||
+h?450:400,height:r&&l?300:250,title:d.lang("image"),body:v,yesBtn:{name:d.lang("yes"),click:function(){if(!U.isLoading)if(r&&l&&J&&J.selectedIndex===1||!l)W.fileBox.val()==""?alert(d.lang("pleaseSelectFile")):(U.showLoading(d.lang("uploadLoading")),W.submit(),ea.val(""));else{var e=b.trim(N.val()),g=Q.val(),h=G.val(),j=Y.val(),n="";M.each(function(){if(this.checked)return n=this.value,!1});e=="http://"||b.invalidUrl(e)?(alert(d.lang("invalidUrl")),N[0].focus()):/^\d*$/.test(g)?/^\d*$/.test(h)?w.call(d,
+e,j,g,h,0,n):(alert(d.lang("invalidHeight")),G[0].focus()):(alert(d.lang("invalidWidth")),Q[0].focus())}}},beforeRemove:function(){V.unbind();Q.unbind();G.unbind();S.unbind()}}),F=U.div,N=b('[name="url"]',F),ea=b('[name="localUrl"]',F),V=b('[name="viewServer"]',F),Q=b('.tab1 [name="width"]',F),G=b('.tab1 [name="height"]',F),S=b(".ke-refresh-btn",F),Y=b('.tab1 [name="title"]',F),M=b('.tab1 [name="align"]',F),J;l&&r?(J=b.tabs({src:b(".tabs",F),afterSelect:function(){}}),J.add({title:p.remoteImage,panel:b(".tab1",
+F)}),J.add({title:p.localImage,panel:b(".tab2",F)}),J.select(A)):l?b(".tab1",F).show():r&&b(".tab2",F).show();var W=b.uploadbutton({button:b(".ke-upload-button",F)[0],fieldName:s,form:b(".ke-form",F),target:H,width:60,afterUpload:function(g){U.hideLoading();if(g.error===0){var h=g.url;e&&(h=b.formatUrl(h,"absolute"));d.afterUpload&&d.afterUpload.call(d,h,g,"image");t?(b(".ke-dialog-row #remoteUrl",F).val(h),b(".ke-tabs-li",F)[0].click(),b(".ke-refresh-btn",F).click()):w.call(d,h,g.title,g.width,g.height,
+g.border,g.align)}else alert(g.message)},afterError:function(b){U.hideLoading();d.errorDialog(b)}});W.fileBox.change(function(){ea.val(W.fileBox.val())});h?V.click(function(){d.loadPlugin("filemanager",function(){d.plugin.filemanagerDialog({viewType:"VIEW",dirName:"image",clickFn:function(e){d.dialogs.length>1&&(b('[name="url"]',F).val(e),d.afterSelectFile&&d.afterSelectFile.call(d,e),d.hideDialog())}})})}):V.hide();var T=0,fa=0;S.click(function(){var d=b('<img src="'+N.val()+'" />',document).css({position:"absolute",
+visibility:"hidden",top:0,left:"-1000px"});d.bind("load",function(){n(d.width(),d.height());d.remove()});b(document.body).append(d)});Q.change(function(){T>0&&G.val(Math.round(fa/T*parseInt(this.value,10)))});G.change(function(){fa>0&&Q.val(Math.round(T/fa*parseInt(this.value,10)))});N.val(g.imageUrl);n(g.imageWidth,g.imageHeight);Y.val(g.imageTitle);M.each(function(){if(this.value===g.imageAlign)return this.checked=!0,!1});l&&A===0&&(N[0].focus(),N[0].select());return U};d.plugin.image={edit:function(){var b=
+d.plugin.getSelectedImage();d.plugin.imageDialog({imageUrl:b?b.attr("data-ke-src"):"http://",imageWidth:b?b.width():"",imageHeight:b?b.height():"",imageTitle:b?b.attr("title"):"",imageAlign:b?b.attr("align"):"",showRemote:l,showLocal:g,tabIndex:b?0:n,clickFn:function(b,e,g,h,j,n){d.exec("insertimage",b,e,g,h,j,n);setTimeout(function(){d.hideDialog().focus()},0)}})},"delete":function(){var b=d.plugin.getSelectedImage();b.parent().name=="a"&&(b=b.parent());b.remove();d.addBookmark()}};d.clickToolbar("image",
+d.plugin.image.edit)});
+KindEditor.plugin("insertfile",function(b){var d=this,g=b.undef(d.allowFileUpload,!0),l=b.undef(d.allowFileManager,!1),e=b.undef(d.formatUploadUrl,!0),h=b.undef(d.uploadJson,d.basePath+"php/upload_json.php"),m=b.undef(d.extraFileUploadParams,{}),n=b.undef(d.filePostName,"imgFile"),j=d.lang("insertfile.");d.plugin.fileDialog=function(o){var s=b.undef(o.fileUrl,"http://"),t=b.undef(o.fileTitle,""),p=o.clickFn,o=['<div style="padding:20px;"><div class="ke-dialog-row">','<label for="keUrl" style="width:60px;">'+j.url+
+"</label>",'<input type="text" id="keUrl" name="url" class="ke-input-text" style="width:160px;" /> &nbsp;','<input type="button" class="ke-upload-button" value="'+j.upload+'" /> &nbsp;','<span class="ke-button-common ke-button-outer">','<input type="button" class="ke-button-common ke-button" name="viewServer" value="'+j.viewServer+'" />','</span></div><div class="ke-dialog-row">','<label for="keTitle" style="width:60px;">'+j.title+"</label>",'<input type="text" id="keTitle" class="ke-input-text" name="title" value="" style="width:160px;" /></div></div></form></div>'].join(""),
+q=d.createDialog({name:"insertfile",width:450,title:d.lang("insertfile"),body:o,yesBtn:{name:d.lang("yes"),click:function(){var e=b.trim(D.val()),g=r.val();e=="http://"||b.invalidUrl(e)?(alert(d.lang("invalidUrl")),D[0].focus()):(b.trim(g)===""&&(g=e),p.call(d,e,g))}}}),z=q.div,D=b('[name="url"]',z),o=b('[name="viewServer"]',z),r=b('[name="title"]',z);if(g){var A=b.uploadbutton({button:b(".ke-upload-button",z)[0],fieldName:n,url:b.addParam(h,"dir=file"),extraParams:m,afterUpload:function(g){q.hideLoading();
+if(g.error===0){var h=g.url;e&&(h=b.formatUrl(h,"absolute"));D.val(h);d.afterUpload&&d.afterUpload.call(d,h,g,"insertfile");alert(d.lang("uploadSuccess"))}else alert(g.message)},afterError:function(b){q.hideLoading();d.errorDialog(b)}});A.fileBox.change(function(){q.showLoading(d.lang("uploadLoading"));A.submit()})}else b(".ke-upload-button",z).hide();l?o.click(function(){d.loadPlugin("filemanager",function(){d.plugin.filemanagerDialog({viewType:"LIST",dirName:"file",clickFn:function(e){d.dialogs.length>
+1&&(b('[name="url"]',z).val(e),d.afterSelectFile&&d.afterSelectFile.call(d,e),d.hideDialog())}})})}):o.hide();D.val(s);r.val(t);D[0].focus();D[0].select()};d.clickToolbar("insertfile",function(){d.plugin.fileDialog({clickFn:function(b,e){d.insertHtml('<a class="ke-insertfile" href="'+b+'" data-ke-src="'+b+'" target="_blank">'+e+"</a>").hideDialog().focus()}})})});
+KindEditor.plugin("lineheight",function(b){var d=this,g=d.lang("lineheight.");d.clickToolbar("lineheight",function(){var l="",e=d.cmd.commonNode({"*":".line-height"});e&&(l=e.css("line-height"));var h=d.createMenu({name:"lineheight",width:150});b.each(g.lineHeight,function(e,g){b.each(g,function(b,e){h.addItem({title:e,checked:l===b,click:function(){d.cmd.toggle('<span style="line-height:'+b+';"></span>',{span:".line-height="+b});d.updateState();d.addBookmark();d.hideMenu()}})})})})});
+KindEditor.plugin("link",function(b){var d=this;d.plugin.link={edit:function(){var g=d.lang("link."),l='<div style="padding:20px;"><div class="ke-dialog-row"><label for="keUrl" style="width:60px;">'+g.url+'</label><input class="ke-input-text" type="text" id="keUrl" name="url" value="" style="width:260px;" /></div><div class="ke-dialog-row""><label for="keType" style="width:60px;">'+g.linkType+'</label><select id="keType" name="type"></select></div></div>',l=d.createDialog({name:"link",width:450,title:d.lang("link"),
+body:l,yesBtn:{name:d.lang("yes"),click:function(){var g=b.trim(e.val());g=="http://"||b.invalidUrl(g)?(alert(d.lang("invalidUrl")),e[0].focus()):d.exec("createlink",g,h.val()).hideDialog().focus()}}}).div,e=b('input[name="url"]',l),h=b('select[name="type"]',l);e.val("http://");h[0].options[0]=new Option(g.newWindow,"_blank");h[0].options[1]=new Option(g.selfWindow,"");d.cmd.selection();if(g=d.plugin.getSelectedLink())d.cmd.range.selectNode(g[0]),d.cmd.select(),e.val(g.attr("data-ke-src")),h.val(g.attr("target"));
+e[0].focus();e[0].select()},"delete":function(){d.exec("unlink",null)}};d.clickToolbar("link",d.plugin.link.edit)});
+KindEditor.plugin("map",function(b){var d=this,g=d.lang("map.");d.clickToolbar("map",function(){function l(){n=o[0].contentWindow;j=b.iframeDoc(o)}var e=['<div style="padding:10px 20px;"><div class="ke-dialog-row">',g.address+' <input id="kindeditor_plugin_map_address" name="address" class="ke-input-text" value="" style="width:200px;" /> ','<span class="ke-button-common ke-button-outer">','<input type="button" name="searchBtn" class="ke-button-common ke-button" value="'+g.search+'" />','</span></div><div class="ke-map" style="width:558px;height:360px;"></div></div>'].join(""),
+e=d.createDialog({name:"map",width:600,title:d.lang("map"),body:e,yesBtn:{name:d.lang("yes"),click:function(){var b=n.map,e=b.getCenter().lat()+","+b.getCenter().lng(),g=b.getZoom(),b=b.getMapTypeId(),h="http://maps.googleapis.com/maps/api/staticmap";h+="?center="+encodeURIComponent(e);h+="&zoom="+encodeURIComponent(g);h+="&size=558x360";h+="&maptype="+encodeURIComponent(b);h+="&markers="+encodeURIComponent(e);h+="&language="+d.langType;h+="&sensor=false";d.exec("insertimage",h).hideDialog().focus()}},
+beforeRemove:function(){m.remove();j&&j.write("");o.remove()}}).div,h=b('[name="address"]',e),m=b('[name="searchBtn"]',e),n,j;['<!doctype html><html><head>\n<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />\n<style>\n\thtml { height: 100% }\n\tbody { height: 100%; margin: 0; padding: 0; background-color: #FFF }\n\t#map_canvas { height: 100% }\n</style>','<script src="http://maps.googleapis.com/maps/api/js?sensor=false&language='+d.langType+'"><\/script>','<script>\nvar map, geocoder;\nfunction initialize() {\n\tvar latlng = new google.maps.LatLng(31.230393, 121.473704);\n\tvar options = {\n\t\tzoom: 11,\n\t\tcenter: latlng,\n\t\tdisableDefaultUI: true,\n\t\tpanControl: true,\n\t\tzoomControl: true,\n\t\tmapTypeControl: true,\n\t\tscaleControl: true,\n\t\tstreetViewControl: false,\n\t\toverviewMapControl: true,\n\t\tmapTypeId: google.maps.MapTypeId.ROADMAP\n\t};\n\tmap = new google.maps.Map(document.getElementById("map_canvas"), options);\n\tgeocoder = new google.maps.Geocoder();\n\tgeocoder.geocode({latLng: latlng}, function(results, status) {\n\t\tif (status == google.maps.GeocoderStatus.OK) {\n\t\t\tif (results[3]) {\n\t\t\t\tparent.document.getElementById("kindeditor_plugin_map_address").value = results[3].formatted_address;\n\t\t\t}\n\t\t}\n\t});\n}\nfunction search(address) {\n\tif (!map) return;\n\tgeocoder.geocode({address : address}, function(results, status) {\n\t\tif (status == google.maps.GeocoderStatus.OK) {\n\t\t\tmap.setZoom(11);\n\t\t\tmap.setCenter(results[0].geometry.location);\n\t\t\tvar marker = new google.maps.Marker({\n\t\t\t\tmap: map,\n\t\t\t\tposition: results[0].geometry.location\n\t\t\t});\n\t\t} else {\n\t\t\talert("Invalid address: " + address);\n\t\t}\n\t});\n}\n<\/script>\n</head>\n<body onload="initialize();">\n<div id="map_canvas" style="width:100%; height:100%"></div>\n</body></html>'].join("\n");
+var o=b('<iframe class="ke-textarea" frameborder="0" src="'+d.pluginsPath+'map/map.html" style="width:558px;height:360px;"></iframe>');o.bind("load",function(){o.unbind("load");b.IE?l():setTimeout(l,0)});b(".ke-map",e).replaceWith(o);m.click(function(){n.search(h.val())})})});
+KindEditor.plugin("media",function(b){var d=this,g=d.lang("media."),l=b.undef(d.allowMediaUpload,!0),e=b.undef(d.allowFileManager,!1),h=b.undef(d.formatUploadUrl,!0),m=b.undef(d.extraFileUploadParams,{}),n=b.undef(d.filePostName,"imgFile"),j=b.undef(d.uploadJson,d.basePath+"php/upload_json.php");d.plugin.media={edit:function(){var o=['<div style="padding:20px;"><div class="ke-dialog-row">','<label for="keUrl" style="width:60px;">'+g.url+"</label>",'<input class="ke-input-text" type="text" id="keUrl" name="url" value="" style="width:160px;" /> &nbsp;',
+'<input type="button" class="ke-upload-button" value="'+g.upload+'" /> &nbsp;','<span class="ke-button-common ke-button-outer">','<input type="button" class="ke-button-common ke-button" name="viewServer" value="'+g.viewServer+'" />','</span></div><div class="ke-dialog-row">','<label for="keWidth" style="width:60px;">'+g.width+"</label>",'<input type="text" id="keWidth" class="ke-input-text ke-input-number" name="width" value="550" maxlength="4" /></div><div class="ke-dialog-row">','<label for="keHeight" style="width:60px;">'+
+g.height+"</label>",'<input type="text" id="keHeight" class="ke-input-text ke-input-number" name="height" value="400" maxlength="4" /></div><div class="ke-dialog-row">','<label for="keAutostart">'+g.autostart+"</label>",'<input type="checkbox" id="keAutostart" name="autostart" value="" /> </div></div>'].join(""),s=d.createDialog({name:"media",width:450,height:230,title:d.lang("media"),body:o,yesBtn:{name:d.lang("yes"),click:function(){var e=b.trim(p.val()),g=q.val(),h=z.val();e=="http://"||b.invalidUrl(e)?
+(alert(d.lang("invalidUrl")),p[0].focus()):/^\d*$/.test(g)?/^\d*$/.test(h)?(e=b.mediaImg(d.themesPath+"common/blank.gif",{src:e,type:b.mediaType(e),width:g,height:h,autostart:D[0].checked?"true":"false",loop:"true"}),d.insertHtml(e).hideDialog().focus()):(alert(d.lang("invalidHeight")),z[0].focus()):(alert(d.lang("invalidWidth")),q[0].focus())}}}),t=s.div,p=b('[name="url"]',t),o=b('[name="viewServer"]',t),q=b('[name="width"]',t),z=b('[name="height"]',t),D=b('[name="autostart"]',t);p.val("http://");
+if(l){var r=b.uploadbutton({button:b(".ke-upload-button",t)[0],fieldName:n,extraParams:m,url:b.addParam(j,"dir=media"),afterUpload:function(e){s.hideLoading();if(e.error===0){var g=e.url;h&&(g=b.formatUrl(g,"absolute"));p.val(g);d.afterUpload&&d.afterUpload.call(d,g,e,"media");alert(d.lang("uploadSuccess"))}else alert(e.message)},afterError:function(b){s.hideLoading();d.errorDialog(b)}});r.fileBox.change(function(){s.showLoading(d.lang("uploadLoading"));r.submit()})}else b(".ke-upload-button",t).hide();
+e?o.click(function(){d.loadPlugin("filemanager",function(){d.plugin.filemanagerDialog({viewType:"LIST",dirName:"media",clickFn:function(e){d.dialogs.length>1&&(b('[name="url"]',t).val(e),d.afterSelectFile&&d.afterSelectFile.call(d,e),d.hideDialog())}})})}):o.hide();if(o=d.plugin.getSelectedMedia()){var A=b.mediaAttrs(o.attr("data-ke-tag"));p.val(A.src);q.val(b.removeUnit(o.css("width"))||A.width||0);z.val(b.removeUnit(o.css("height"))||A.height||0);D[0].checked=A.autostart==="true"}p[0].focus();p[0].select()},
+"delete":function(){d.plugin.getSelectedMedia().remove();d.addBookmark()}};d.clickToolbar("media",d.plugin.media.edit)});
+(function(b){function d(b){this.init(b)}b.extend(d,{init:function(d){function l(d,e){b(".ke-status > div",d).hide();b(".ke-message",d).addClass("ke-error").show().html(b.escape(e))}var e=this;d.afterError=d.afterError||function(b){alert(b)};e.options=d;e.progressbars={};e.div=b(d.container).html(['<div class="ke-swfupload"><div class="ke-swfupload-top"><div class="ke-inline-block ke-swfupload-button"><input type="button" value="Browse" /></div>','<div class="ke-inline-block ke-swfupload-desc">'+d.uploadDesc+
+"</div>",'<span class="ke-button-common ke-button-outer ke-swfupload-startupload">','<input type="button" class="ke-button-common ke-button" value="'+d.startButtonValue+'" />','</span></div><div class="ke-swfupload-body"></div></div>'].join(""));e.bodyDiv=b(".ke-swfupload-body",e.div);var h={debug:!1,upload_url:d.uploadUrl,flash_url:d.flashUrl,file_post_name:d.filePostName,button_placeholder:b(".ke-swfupload-button > input",e.div)[0],button_image_url:d.buttonImageUrl,button_width:d.buttonWidth,button_height:d.buttonHeight,
+button_cursor:SWFUpload.CURSOR.HAND,file_types:d.fileTypes,file_types_description:d.fileTypesDesc,file_upload_limit:d.fileUploadLimit,file_size_limit:d.fileSizeLimit,post_params:d.postParams,file_queued_handler:function(b){b.url=e.options.fileIconUrl;e.appendFile(b)},file_queue_error_handler:function(e,h){var j="";switch(h){case SWFUpload.QUEUE_ERROR.QUEUE_LIMIT_EXCEEDED:j=d.queueLimitExceeded;break;case SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT:j=d.fileExceedsSizeLimit;break;case SWFUpload.QUEUE_ERROR.ZERO_BYTE_FILE:j=
+d.zeroByteFile;break;case SWFUpload.QUEUE_ERROR.INVALID_FILETYPE:j=d.invalidFiletype;break;default:j=d.unknownError}b.DEBUG&&alert(j)},upload_start_handler:function(d){d=b('div[data-id="'+d.id+'"]',this.bodyDiv);b(".ke-status > div",d).hide();b(".ke-progressbar",d).show()},upload_progress_handler:function(b,d,g){d=Math.round(d*100/g);b=e.progressbars[b.id];b.bar.css("width",Math.round(d*80/100)+"px");b.percent.html(d+"%")},upload_error_handler:function(d){d&&d.filestatus==SWFUpload.FILE_STATUS.ERROR&&
+(d=b('div[data-id="'+d.id+'"]',e.bodyDiv).eq(0),l(d,e.options.errorMessage))},upload_success_handler:function(d,g){var h=b('div[data-id="'+d.id+'"]',e.bodyDiv).eq(0),o={};try{o=b.json(g)}catch(s){e.options.afterError.call(this,"<!doctype html><html>"+g+"</html>")}o.error!==0?l(h,b.DEBUG?o.message:e.options.errorMessage):(d.url=o.url,b(".ke-img",h).attr("src",d.url).attr("data-status",d.filestatus).data("data",o),b(".ke-status > div",h).hide())}};e.swfu=new SWFUpload(h);b(".ke-swfupload-startupload input",
+e.div).click(function(){e.swfu.startUpload()})},getUrlList:function(){var d=[];b(".ke-img",self.bodyDiv).each(function(){var l=b(this);l.attr("data-status")==SWFUpload.FILE_STATUS.COMPLETE&&d.push(l.data("data"))});return d},removeFile:function(d){this.swfu.cancelUpload(d);d=b('div[data-id="'+d+'"]',this.bodyDiv);b(".ke-photo",d).unbind();b(".ke-delete",d).unbind();d.remove()},removeFiles:function(){var d=this;b(".ke-item",d.bodyDiv).each(function(){d.removeFile(b(this).attr("data-id"))})},appendFile:function(d){var l=
+this,e=b('<div class="ke-inline-block ke-item" data-id="'+d.id+'"></div>');l.bodyDiv.append(e);var h=b('<div class="ke-inline-block ke-photo"></div>').mouseover(function(){b(this).addClass("ke-on")}).mouseout(function(){b(this).removeClass("ke-on")});e.append(h);var m=b('<img src="'+d.url+'" class="ke-img" data-status="'+d.filestatus+'" width="80" height="80" alt="'+d.name+'" />');h.append(m);b('<span class="ke-delete"></span>').appendTo(h).click(function(){l.removeFile(d.id)});m=b('<div class="ke-status"></div>').appendTo(h);
+b('<div class="ke-progressbar"><div class="ke-progressbar-bar"><div class="ke-progressbar-bar-inner"></div></div><div class="ke-progressbar-percent">0%</div></div>').hide().appendTo(m);b('<div class="ke-message">'+l.options.pendingMessage+"</div>").appendTo(m);e.append('<div class="ke-name">'+d.name+"</div>");l.progressbars[d.id]={bar:b(".ke-progressbar-bar-inner",h),percent:b(".ke-progressbar-percent",h)}},remove:function(){this.removeFiles();this.swfu.destroy();this.div.html("")}});b.swfupload=
+function(b,l){return new d(b,l)}})(KindEditor);
+KindEditor.plugin("multiimage",function(b){var d=this;b.undef(d.formatUploadUrl,!0);var g=b.undef(d.uploadJson,d.basePath+"php/upload_json.php"),l=d.pluginsPath+"multiimage/images/",e=b.undef(d.imageSizeLimit,"1MB");b.undef(d.imageFileTypes,"*.jpg;*.gif;*.png");var h=b.undef(d.imageUploadLimit,20),m=b.undef(d.filePostName,"imgFile"),n=d.lang("multiimage.");d.plugin.multiImageDialog=function(j){var o=j.clickFn,j=b.tmpl(n.uploadDesc,{uploadLimit:h,sizeLimit:e}),s=d.createDialog({name:"multiimage",width:650,
+height:510,title:d.lang("multiimage"),body:'<div style="padding:20px;"><div class="swfupload"></div></div>',previewBtn:{name:n.insertAll,click:function(){o.call(d,t.getUrlList())}},yesBtn:{name:n.clearAll,click:function(){t.removeFiles()}},beforeRemove:function(){(!b.IE||b.V<=8)&&t.remove()}}),t=b.swfupload({container:b(".swfupload",s.div),buttonImageUrl:l+(d.langType=="zh_CN"?"select-files-zh_CN.png":"select-files-en.png"),buttonWidth:d.langType=="zh_CN"?72:88,buttonHeight:23,fileIconUrl:l+"image.png",
+uploadDesc:j,startButtonValue:n.startUpload,uploadUrl:b.addParam(g,"dir=image"),flashUrl:l+"swfupload.swf",filePostName:m,fileTypes:"*.jpg;*.jpeg;*.gif;*.png;*.bmp",fileTypesDesc:"Image Files",fileUploadLimit:h,fileSizeLimit:e,postParams:b.undef(d.extraFileUploadParams,{}),queueLimitExceeded:n.queueLimitExceeded,fileExceedsSizeLimit:n.fileExceedsSizeLimit,zeroByteFile:n.zeroByteFile,invalidFiletype:n.invalidFiletype,unknownError:n.unknownError,pendingMessage:n.pending,errorMessage:n.uploadError,afterError:function(b){d.errorDialog(b)}});
+return s};d.clickToolbar("multiimage",function(){d.plugin.multiImageDialog({clickFn:function(e){e.length!==0&&(b.each(e,function(b,e){d.afterUpload&&d.afterUpload.call(d,e.url,e,"multiimage");d.exec("insertimage",e.url,e.title,e.width,e.height,e.border,e.align)}),setTimeout(function(){d.hideDialog().focus()},0))}})})});
+(function(){if(!window.SWFUpload)window.SWFUpload=function(b){this.initSWFUpload(b)},SWFUpload.prototype.initSWFUpload=function(b){try{this.customSettings={},this.settings=b,this.eventQueue=[],this.movieName="SWFUpload_"+SWFUpload.movieCount++,this.movieElement=null,SWFUpload.instances[this.movieName]=this,this.initSettings(),this.loadFlash(),this.displayDebugInfo()}catch(d){throw delete SWFUpload.instances[this.movieName],d;}},SWFUpload.instances={},SWFUpload.movieCount=0,SWFUpload.version="2.2.0 2009-03-25",
+SWFUpload.QUEUE_ERROR={QUEUE_LIMIT_EXCEEDED:-100,FILE_EXCEEDS_SIZE_LIMIT:-110,ZERO_BYTE_FILE:-120,INVALID_FILETYPE:-130},SWFUpload.UPLOAD_ERROR={HTTP_ERROR:-200,MISSING_UPLOAD_URL:-210,IO_ERROR:-220,SECURITY_ERROR:-230,UPLOAD_LIMIT_EXCEEDED:-240,UPLOAD_FAILED:-250,SPECIFIED_FILE_ID_NOT_FOUND:-260,FILE_VALIDATION_FAILED:-270,FILE_CANCELLED:-280,UPLOAD_STOPPED:-290},SWFUpload.FILE_STATUS={QUEUED:-1,IN_PROGRESS:-2,ERROR:-3,COMPLETE:-4,CANCELLED:-5},SWFUpload.BUTTON_ACTION={SELECT_FILE:-100,SELECT_FILES:-110,
+START_UPLOAD:-120},SWFUpload.CURSOR={ARROW:-1,HAND:-2},SWFUpload.WINDOW_MODE={WINDOW:"window",TRANSPARENT:"transparent",OPAQUE:"opaque"},SWFUpload.completeURL=function(b){if(typeof b!=="string"||b.match(/^https?:\/\//i)||b.match(/^\//))return b;var d=window.location.pathname.lastIndexOf("/");path=d<=0?"/":window.location.pathname.substr(0,d)+"/";return path+b},SWFUpload.prototype.initSettings=function(){this.ensureDefault=function(b,d){this.settings[b]=this.settings[b]==void 0?d:this.settings[b]};
+this.ensureDefault("upload_url","");this.ensureDefault("preserve_relative_urls",!1);this.ensureDefault("file_post_name","Filedata");this.ensureDefault("post_params",{});this.ensureDefault("use_query_string",!1);this.ensureDefault("requeue_on_error",!1);this.ensureDefault("http_success",[]);this.ensureDefault("assume_success_timeout",0);this.ensureDefault("file_types","*.*");this.ensureDefault("file_types_description","All Files");this.ensureDefault("file_size_limit",0);this.ensureDefault("file_upload_limit",
+0);this.ensureDefault("file_queue_limit",0);this.ensureDefault("flash_url","swfupload.swf");this.ensureDefault("prevent_swf_caching",!0);this.ensureDefault("button_image_url","");this.ensureDefault("button_width",1);this.ensureDefault("button_height",1);this.ensureDefault("button_text","");this.ensureDefault("button_text_style","color: #000000; font-size: 16pt;");this.ensureDefault("button_text_top_padding",0);this.ensureDefault("button_text_left_padding",0);this.ensureDefault("button_action",SWFUpload.BUTTON_ACTION.SELECT_FILES);
+this.ensureDefault("button_disabled",!1);this.ensureDefault("button_placeholder_id","");this.ensureDefault("button_placeholder",null);this.ensureDefault("button_cursor",SWFUpload.CURSOR.ARROW);this.ensureDefault("button_window_mode",SWFUpload.WINDOW_MODE.WINDOW);this.ensureDefault("debug",!1);this.settings.debug_enabled=this.settings.debug;this.settings.return_upload_start_handler=this.returnUploadStart;this.ensureDefault("swfupload_loaded_handler",null);this.ensureDefault("file_dialog_start_handler",
+null);this.ensureDefault("file_queued_handler",null);this.ensureDefault("file_queue_error_handler",null);this.ensureDefault("file_dialog_complete_handler",null);this.ensureDefault("upload_start_handler",null);this.ensureDefault("upload_progress_handler",null);this.ensureDefault("upload_error_handler",null);this.ensureDefault("upload_success_handler",null);this.ensureDefault("upload_complete_handler",null);this.ensureDefault("debug_handler",this.debugMessage);this.ensureDefault("custom_settings",{});
+this.customSettings=this.settings.custom_settings;if(this.settings.prevent_swf_caching)this.settings.flash_url=this.settings.flash_url+(this.settings.flash_url.indexOf("?")<0?"?":"&")+"preventswfcaching="+(new Date).getTime();if(!this.settings.preserve_relative_urls)this.settings.upload_url=SWFUpload.completeURL(this.settings.upload_url),this.settings.button_image_url=SWFUpload.completeURL(this.settings.button_image_url);delete this.ensureDefault},SWFUpload.prototype.loadFlash=function(){var b,d;
+if(document.getElementById(this.movieName)!==null)throw"ID "+this.movieName+" is already in use. The Flash Object could not be added";b=document.getElementById(this.settings.button_placeholder_id)||this.settings.button_placeholder;if(b==void 0)throw"Could not find the placeholder element: "+this.settings.button_placeholder_id;d=document.createElement("div");d.innerHTML=this.getFlashHTML();b.parentNode.replaceChild(d.firstChild,b);window[this.movieName]==void 0&&(window[this.movieName]=this.getMovieElement())},
+SWFUpload.prototype.getFlashHTML=function(){var b="";KindEditor.IE&&KindEditor.V>8&&(b=' classid = "clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"');return['<object id="',this.movieName,'"'+b+' type="application/x-shockwave-flash" data="',this.settings.flash_url,'" width="',this.settings.button_width,'" height="',this.settings.button_height,'" class="swfupload"><param name="wmode" value="',this.settings.button_window_mode,'" /><param name="movie" value="',this.settings.flash_url,'" /><param name="quality" value="high" /><param name="menu" value="false" /><param name="allowScriptAccess" value="always" />',
+'<param name="flashvars" value="'+this.getFlashVars()+'" />',"</object>"].join("")},SWFUpload.prototype.getFlashVars=function(){var b=this.buildParamString(),d=this.settings.http_success.join(",");return["movieName=",encodeURIComponent(this.movieName),"&amp;uploadURL=",encodeURIComponent(this.settings.upload_url),"&amp;useQueryString=",encodeURIComponent(this.settings.use_query_string),"&amp;requeueOnError=",encodeURIComponent(this.settings.requeue_on_error),"&amp;httpSuccess=",encodeURIComponent(d),
+"&amp;assumeSuccessTimeout=",encodeURIComponent(this.settings.assume_success_timeout),"&amp;params=",encodeURIComponent(b),"&amp;filePostName=",encodeURIComponent(this.settings.file_post_name),"&amp;fileTypes=",encodeURIComponent(this.settings.file_types),"&amp;fileTypesDescription=",encodeURIComponent(this.settings.file_types_description),"&amp;fileSizeLimit=",encodeURIComponent(this.settings.file_size_limit),"&amp;fileUploadLimit=",encodeURIComponent(this.settings.file_upload_limit),"&amp;fileQueueLimit=",
+encodeURIComponent(this.settings.file_queue_limit),"&amp;debugEnabled=",encodeURIComponent(this.settings.debug_enabled),"&amp;buttonImageURL=",encodeURIComponent(this.settings.button_image_url),"&amp;buttonWidth=",encodeURIComponent(this.settings.button_width),"&amp;buttonHeight=",encodeURIComponent(this.settings.button_height),"&amp;buttonText=",encodeURIComponent(this.settings.button_text),"&amp;buttonTextTopPadding=",encodeURIComponent(this.settings.button_text_top_padding),"&amp;buttonTextLeftPadding=",
+encodeURIComponent(this.settings.button_text_left_padding),"&amp;buttonTextStyle=",encodeURIComponent(this.settings.button_text_style),"&amp;buttonAction=",encodeURIComponent(this.settings.button_action),"&amp;buttonDisabled=",encodeURIComponent(this.settings.button_disabled),"&amp;buttonCursor=",encodeURIComponent(this.settings.button_cursor)].join("")},SWFUpload.prototype.getMovieElement=function(){if(this.movieElement==void 0)this.movieElement=document.getElementById(this.movieName);if(this.movieElement===
+null)throw"Could not find Flash element";return this.movieElement},SWFUpload.prototype.buildParamString=function(){var b=this.settings.post_params,d=[];if(typeof b==="object")for(var g in b)b.hasOwnProperty(g)&&d.push(encodeURIComponent(g.toString())+"="+encodeURIComponent(b[g].toString()));return d.join("&amp;")},SWFUpload.prototype.destroy=function(){try{this.cancelUpload(null,!1);var b=null;if((b=this.getMovieElement())&&typeof b.CallFunction==="unknown"){for(var d in b)try{typeof b[d]==="function"&&
+(b[d]=null)}catch(g){}try{b.parentNode.removeChild(b)}catch(l){}}window[this.movieName]=null;SWFUpload.instances[this.movieName]=null;delete SWFUpload.instances[this.movieName];this.movieName=this.eventQueue=this.customSettings=this.settings=this.movieElement=null;return!0}catch(e){return!1}},SWFUpload.prototype.displayDebugInfo=function(){this.debug(["---SWFUpload Instance Info---\nVersion: ",SWFUpload.version,"\nMovie Name: ",this.movieName,"\nSettings:\n\tupload_url:               ",this.settings.upload_url,
+"\n\tflash_url:                ",this.settings.flash_url,"\n\tuse_query_string:         ",this.settings.use_query_string.toString(),"\n\trequeue_on_error:         ",this.settings.requeue_on_error.toString(),"\n\thttp_success:             ",this.settings.http_success.join(", "),"\n\tassume_success_timeout:   ",this.settings.assume_success_timeout,"\n\tfile_post_name:           ",this.settings.file_post_name,"\n\tpost_params:              ",this.settings.post_params.toString(),"\n\tfile_types:               ",
+this.settings.file_types,"\n\tfile_types_description:   ",this.settings.file_types_description,"\n\tfile_size_limit:          ",this.settings.file_size_limit,"\n\tfile_upload_limit:        ",this.settings.file_upload_limit,"\n\tfile_queue_limit:         ",this.settings.file_queue_limit,"\n\tdebug:                    ",this.settings.debug.toString(),"\n\tprevent_swf_caching:      ",this.settings.prevent_swf_caching.toString(),"\n\tbutton_placeholder_id:    ",this.settings.button_placeholder_id.toString(),
+"\n\tbutton_placeholder:       ",this.settings.button_placeholder?"Set":"Not Set","\n\tbutton_image_url:         ",this.settings.button_image_url.toString(),"\n\tbutton_width:             ",this.settings.button_width.toString(),"\n\tbutton_height:            ",this.settings.button_height.toString(),"\n\tbutton_text:              ",this.settings.button_text.toString(),"\n\tbutton_text_style:        ",this.settings.button_text_style.toString(),"\n\tbutton_text_top_padding:  ",this.settings.button_text_top_padding.toString(),
+"\n\tbutton_text_left_padding: ",this.settings.button_text_left_padding.toString(),"\n\tbutton_action:            ",this.settings.button_action.toString(),"\n\tbutton_disabled:          ",this.settings.button_disabled.toString(),"\n\tcustom_settings:          ",this.settings.custom_settings.toString(),"\nEvent Handlers:\n\tswfupload_loaded_handler assigned:  ",(typeof this.settings.swfupload_loaded_handler==="function").toString(),"\n\tfile_dialog_start_handler assigned: ",(typeof this.settings.file_dialog_start_handler===
+"function").toString(),"\n\tfile_queued_handler assigned:       ",(typeof this.settings.file_queued_handler==="function").toString(),"\n\tfile_queue_error_handler assigned:  ",(typeof this.settings.file_queue_error_handler==="function").toString(),"\n\tupload_start_handler assigned:      ",(typeof this.settings.upload_start_handler==="function").toString(),"\n\tupload_progress_handler assigned:   ",(typeof this.settings.upload_progress_handler==="function").toString(),"\n\tupload_error_handler assigned:      ",
+(typeof this.settings.upload_error_handler==="function").toString(),"\n\tupload_success_handler assigned:    ",(typeof this.settings.upload_success_handler==="function").toString(),"\n\tupload_complete_handler assigned:   ",(typeof this.settings.upload_complete_handler==="function").toString(),"\n\tdebug_handler assigned:             ",(typeof this.settings.debug_handler==="function").toString(),"\n"].join(""))},SWFUpload.prototype.addSetting=function(b,d,g){return d==void 0?this.settings[b]=g:this.settings[b]=
+d},SWFUpload.prototype.getSetting=function(b){if(this.settings[b]!=void 0)return this.settings[b];return""},SWFUpload.prototype.callFlash=function(b,d){var d=d||[],g=this.getMovieElement(),l,e;try{e=g.CallFunction('<invoke name="'+b+'" returntype="javascript">'+__flash__argumentsToXML(d,0)+"</invoke>"),l=eval(e)}catch(h){throw"Call to "+b+" failed";}l!=void 0&&typeof l.post==="object"&&(l=this.unescapeFilePostParams(l));return l},SWFUpload.prototype.selectFile=function(){this.callFlash("SelectFile")},
+SWFUpload.prototype.selectFiles=function(){this.callFlash("SelectFiles")},SWFUpload.prototype.startUpload=function(b){this.callFlash("StartUpload",[b])},SWFUpload.prototype.cancelUpload=function(b,d){d!==!1&&(d=!0);this.callFlash("CancelUpload",[b,d])},SWFUpload.prototype.stopUpload=function(){this.callFlash("StopUpload")},SWFUpload.prototype.getStats=function(){return this.callFlash("GetStats")},SWFUpload.prototype.setStats=function(b){this.callFlash("SetStats",[b])},SWFUpload.prototype.getFile=
+function(b){return typeof b==="number"?this.callFlash("GetFileByIndex",[b]):this.callFlash("GetFile",[b])},SWFUpload.prototype.addFileParam=function(b,d,g){return this.callFlash("AddFileParam",[b,d,g])},SWFUpload.prototype.removeFileParam=function(b,d){this.callFlash("RemoveFileParam",[b,d])},SWFUpload.prototype.setUploadURL=function(b){this.settings.upload_url=b.toString();this.callFlash("SetUploadURL",[b])},SWFUpload.prototype.setPostParams=function(b){this.settings.post_params=b;this.callFlash("SetPostParams",
+[b])},SWFUpload.prototype.addPostParam=function(b,d){this.settings.post_params[b]=d;this.callFlash("SetPostParams",[this.settings.post_params])},SWFUpload.prototype.removePostParam=function(b){delete this.settings.post_params[b];this.callFlash("SetPostParams",[this.settings.post_params])},SWFUpload.prototype.setFileTypes=function(b,d){this.settings.file_types=b;this.settings.file_types_description=d;this.callFlash("SetFileTypes",[b,d])},SWFUpload.prototype.setFileSizeLimit=function(b){this.settings.file_size_limit=
+b;this.callFlash("SetFileSizeLimit",[b])},SWFUpload.prototype.setFileUploadLimit=function(b){this.settings.file_upload_limit=b;this.callFlash("SetFileUploadLimit",[b])},SWFUpload.prototype.setFileQueueLimit=function(b){this.settings.file_queue_limit=b;this.callFlash("SetFileQueueLimit",[b])},SWFUpload.prototype.setFilePostName=function(b){this.settings.file_post_name=b;this.callFlash("SetFilePostName",[b])},SWFUpload.prototype.setUseQueryString=function(b){this.settings.use_query_string=b;this.callFlash("SetUseQueryString",
+[b])},SWFUpload.prototype.setRequeueOnError=function(b){this.settings.requeue_on_error=b;this.callFlash("SetRequeueOnError",[b])},SWFUpload.prototype.setHTTPSuccess=function(b){typeof b==="string"&&(b=b.replace(" ","").split(","));this.settings.http_success=b;this.callFlash("SetHTTPSuccess",[b])},SWFUpload.prototype.setAssumeSuccessTimeout=function(b){this.settings.assume_success_timeout=b;this.callFlash("SetAssumeSuccessTimeout",[b])},SWFUpload.prototype.setDebugEnabled=function(b){this.settings.debug_enabled=
+b;this.callFlash("SetDebugEnabled",[b])},SWFUpload.prototype.setButtonImageURL=function(b){b==void 0&&(b="");this.settings.button_image_url=b;this.callFlash("SetButtonImageURL",[b])},SWFUpload.prototype.setButtonDimensions=function(b,d){this.settings.button_width=b;this.settings.button_height=d;var g=this.getMovieElement();if(g!=void 0)g.style.width=b+"px",g.style.height=d+"px";this.callFlash("SetButtonDimensions",[b,d])},SWFUpload.prototype.setButtonText=function(b){this.settings.button_text=b;this.callFlash("SetButtonText",
+[b])},SWFUpload.prototype.setButtonTextPadding=function(b,d){this.settings.button_text_top_padding=d;this.settings.button_text_left_padding=b;this.callFlash("SetButtonTextPadding",[b,d])},SWFUpload.prototype.setButtonTextStyle=function(b){this.settings.button_text_style=b;this.callFlash("SetButtonTextStyle",[b])},SWFUpload.prototype.setButtonDisabled=function(b){this.settings.button_disabled=b;this.callFlash("SetButtonDisabled",[b])},SWFUpload.prototype.setButtonAction=function(b){this.settings.button_action=
+b;this.callFlash("SetButtonAction",[b])},SWFUpload.prototype.setButtonCursor=function(b){this.settings.button_cursor=b;this.callFlash("SetButtonCursor",[b])},SWFUpload.prototype.queueEvent=function(b,d){d==void 0?d=[]:d instanceof Array||(d=[d]);var g=this;if(typeof this.settings[b]==="function")this.eventQueue.push(function(){this.settings[b].apply(this,d)}),setTimeout(function(){g.executeNextEvent()},0);else if(this.settings[b]!==null)throw"Event handler "+b+" is unknown or is not a function";},
+SWFUpload.prototype.executeNextEvent=function(){var b=this.eventQueue?this.eventQueue.shift():null;typeof b==="function"&&b.apply(this)},SWFUpload.prototype.unescapeFilePostParams=function(b){var d=/[$]([0-9a-f]{4})/i,g={},l;if(b!=void 0){for(var e in b.post)if(b.post.hasOwnProperty(e)){l=e;for(var h;(h=d.exec(l))!==null;)l=l.replace(h[0],String.fromCharCode(parseInt("0x"+h[1],16)));g[l]=b.post[e]}b.post=g}return b},SWFUpload.prototype.testExternalInterface=function(){try{return this.callFlash("TestExternalInterface")}catch(b){return!1}},
+SWFUpload.prototype.flashReady=function(){var b=this.getMovieElement();b?(this.cleanUp(b),this.queueEvent("swfupload_loaded_handler")):this.debug("Flash called back ready but the flash movie can't be found.")},SWFUpload.prototype.cleanUp=function(b){try{if(this.movieElement&&typeof b.CallFunction==="unknown"){this.debug("Removing Flash functions hooks (this should only run in IE and should prevent memory leaks)");for(var d in b)try{typeof b[d]==="function"&&(b[d]=null)}catch(g){}}}catch(l){}window.__flash__removeCallback=
+function(b,d){try{b&&(b[d]=null)}catch(g){}}},SWFUpload.prototype.fileDialogStart=function(){this.queueEvent("file_dialog_start_handler")},SWFUpload.prototype.fileQueued=function(b){b=this.unescapeFilePostParams(b);this.queueEvent("file_queued_handler",b)},SWFUpload.prototype.fileQueueError=function(b,d,g){b=this.unescapeFilePostParams(b);this.queueEvent("file_queue_error_handler",[b,d,g])},SWFUpload.prototype.fileDialogComplete=function(b,d,g){this.queueEvent("file_dialog_complete_handler",[b,d,
+g])},SWFUpload.prototype.uploadStart=function(b){b=this.unescapeFilePostParams(b);this.queueEvent("return_upload_start_handler",b)},SWFUpload.prototype.returnUploadStart=function(b){var d;if(typeof this.settings.upload_start_handler==="function")b=this.unescapeFilePostParams(b),d=this.settings.upload_start_handler.call(this,b);else if(this.settings.upload_start_handler!=void 0)throw"upload_start_handler must be a function";d===void 0&&(d=!0);this.callFlash("ReturnUploadStart",[!!d])},SWFUpload.prototype.uploadProgress=
+function(b,d,g){b=this.unescapeFilePostParams(b);this.queueEvent("upload_progress_handler",[b,d,g])},SWFUpload.prototype.uploadError=function(b,d,g){b=this.unescapeFilePostParams(b);this.queueEvent("upload_error_handler",[b,d,g])},SWFUpload.prototype.uploadSuccess=function(b,d,g){b=this.unescapeFilePostParams(b);this.queueEvent("upload_success_handler",[b,d,g])},SWFUpload.prototype.uploadComplete=function(b){b=this.unescapeFilePostParams(b);this.queueEvent("upload_complete_handler",b)},SWFUpload.prototype.debug=
+function(b){this.queueEvent("debug_handler",b)},SWFUpload.prototype.debugMessage=function(b){if(this.settings.debug){var d=[];if(typeof b==="object"&&typeof b.name==="string"&&typeof b.message==="string"){for(var g in b)b.hasOwnProperty(g)&&d.push(g+": "+b[g]);b=d.join("\n")||"";d=b.split("\n");b="EXCEPTION: "+d.join("\nEXCEPTION: ")}SWFUpload.Console.writeLine(b)}},SWFUpload.Console={},SWFUpload.Console.writeLine=function(b){var d,g;try{d=document.getElementById("SWFUpload_Console");if(!d)g=document.createElement("form"),
+document.getElementsByTagName("body")[0].appendChild(g),d=document.createElement("textarea"),d.id="SWFUpload_Console",d.style.fontFamily="monospace",d.setAttribute("wrap","off"),d.wrap="off",d.style.overflow="auto",d.style.width="700px",d.style.height="350px",d.style.margin="5px",g.appendChild(d);d.value+=b+"\n";d.scrollTop=d.scrollHeight-d.clientHeight}catch(l){alert("Exception: "+l.name+" Message: "+l.message)}}})();
+(function(){if(typeof SWFUpload==="function")SWFUpload.queue={},SWFUpload.prototype.initSettings=function(b){return function(){typeof b==="function"&&b.call(this);this.queueSettings={};this.queueSettings.queue_cancelled_flag=!1;this.queueSettings.queue_upload_count=0;this.queueSettings.user_upload_complete_handler=this.settings.upload_complete_handler;this.queueSettings.user_upload_start_handler=this.settings.upload_start_handler;this.settings.upload_complete_handler=SWFUpload.queue.uploadCompleteHandler;
+this.settings.upload_start_handler=SWFUpload.queue.uploadStartHandler;this.settings.queue_complete_handler=this.settings.queue_complete_handler||null}}(SWFUpload.prototype.initSettings),SWFUpload.prototype.startUpload=function(b){this.queueSettings.queue_cancelled_flag=!1;this.callFlash("StartUpload",[b])},SWFUpload.prototype.cancelQueue=function(){this.queueSettings.queue_cancelled_flag=!0;this.stopUpload();for(var b=this.getStats();b.files_queued>0;)this.cancelUpload(),b=this.getStats()},SWFUpload.queue.uploadStartHandler=
+function(b){var d;typeof this.queueSettings.user_upload_start_handler==="function"&&(d=this.queueSettings.user_upload_start_handler.call(this,b));d=d===!1?!1:!0;this.queueSettings.queue_cancelled_flag=!d;return d},SWFUpload.queue.uploadCompleteHandler=function(b){var d=this.queueSettings.user_upload_complete_handler;b.filestatus===SWFUpload.FILE_STATUS.COMPLETE&&this.queueSettings.queue_upload_count++;if(typeof d==="function"?d.call(this,b)!==!1:b.filestatus!==SWFUpload.FILE_STATUS.QUEUED)this.getStats().files_queued>
+0&&this.queueSettings.queue_cancelled_flag===!1?this.startUpload():(this.queueSettings.queue_cancelled_flag===!1?this.queueEvent("queue_complete_handler",[this.queueSettings.queue_upload_count]):this.queueSettings.queue_cancelled_flag=!1,this.queueSettings.queue_upload_count=0)}})();
+KindEditor.plugin("pagebreak",function(b){var d=this,g=b.undef(d.pagebreakHtml,'<hr style="page-break-after: always;" class="ke-pagebreak" />');d.clickToolbar("pagebreak",function(){var l=d.cmd,e=l.range;d.focus();e.enlarge(!0);l.split(!0);var h=d.newlineTag=="br"||b.WEBKIT?"":'<p id="__kindeditor_tail_tag__"></p>';d.insertHtml(g+h);h!==""&&(h=b("#__kindeditor_tail_tag__",d.edit.doc),e.selectNodeContents(h[0]),h.removeAttr("id"),l.select())})});
+KindEditor.plugin("plainpaste",function(b){var d=this;d.clickToolbar("plainpaste",function(){var g='<div style="padding:10px 20px;"><div style="margin-bottom:10px;">'+d.lang("plainpaste.").comment+'</div><textarea class="ke-textarea" style="width:408px;height:260px;"></textarea></div>',g=d.createDialog({name:"plainpaste",width:450,title:d.lang("plainpaste"),body:g,yesBtn:{name:d.lang("yes"),click:function(){var e=l.val(),e=b.escape(e),e=e.replace(/ {2}/g," &nbsp;"),e=d.newlineTag=="p"?e.replace(/^/,
+"<p>").replace(/$/,"</p>").replace(/\n/g,"</p><p>"):e.replace(/\n/g,"<br />$&");d.insertHtml(e).hideDialog().focus()}}}),l=b("textarea",g.div);l[0].focus()})});
+KindEditor.plugin("preview",function(b){var d=this;d.clickToolbar("preview",function(){d.lang("preview.");var g=d.createDialog({name:"preview",width:750,title:d.lang("preview"),body:'<div style="padding:10px 20px;"><iframe class="ke-textarea" frameborder="0" style="width:708px;height:400px;"></iframe></div>'}),g=b("iframe",g.div),l=b.iframeDoc(g);l.open();l.write(d.fullHtml());l.close();b(l.body).css("background-color","#FFF");g[0].contentWindow.focus()})});
+KindEditor.plugin("quickformat",function(b){function d(b){for(b=b.first();b&&b.first();)b=b.first();return b}var g=this,l=b.toMap("blockquote,center,div,h1,h2,h3,h4,h5,h6,p");g.clickToolbar("quickformat",function(){g.focus();for(var e=g.edit.doc,h=g.cmd.range,m=b(e.body).first(),n,j=[],o=[],s=h.createBookmark(!0);m;){n=m.next();var t=d(m);if(!t||t.name!="img")if(l[m.name]?(m.html(m.html().replace(/^(\s|&nbsp;|\u3000)+/ig,"")),m.css("text-indent","2em")):o.push(m),!n||l[n.name]||l[m.name]&&!l[n.name])o.length>
+0&&j.push(o),o=[];m=n}b.each(j,function(d,g){var h=b('<p style="text-indent:2em;"></p>',e);g[0].before(h);b.each(g,function(b,d){h.append(d)})});h.moveToBookmark(s);g.addBookmark()})});
+KindEditor.plugin("table",function(b){function d(b,d){d=d.toUpperCase();b.css("background-color",d);b.css("color",d==="#000000"?"#FFFFFF":"#000000");b.html(d)}function g(g,h){function o(){b.each(m,function(){this.remove()});m=[];b(document).unbind("click,mousedown",o);g.unbind("click,mousedown",o)}h.bind("click,mousedown",function(b){b.stopPropagation()});h.click(function(){o();var h=b(this),j=h.pos(),j=b.colorpicker({x:j.x,y:j.y+h.height(),z:811214,selectedColor:b(this).html(),colors:e.colorTable,
+noColor:e.lang("noColor"),shadowMode:e.shadowMode,click:function(b){d(h,b);o()}});m.push(j);b(document).bind("click,mousedown",o);g.bind("click,mousedown",o)})}function l(b,d,e){for(var g=b=0,h=d.cells.length;g<h;g++){if(d.cells[g]==e)break;b+=d.cells[g].rowSpan-1}return e.cellIndex-b}var e=this,h=e.lang("table."),m=[];e.plugin.table={prop:function(n){var j=['<div style="padding:20px;"><div class="ke-dialog-row">','<label for="keRows" style="width:90px;">'+h.cells+"</label>",h.rows+' <input type="text" id="keRows" class="ke-input-text ke-input-number" name="rows" value="" maxlength="4" /> &nbsp; ',
+h.cols+' <input type="text" class="ke-input-text ke-input-number" name="cols" value="" maxlength="4" />','</div><div class="ke-dialog-row">','<label for="keWidth" style="width:90px;">'+h.size+"</label>",h.width+' <input type="text" id="keWidth" class="ke-input-text ke-input-number" name="width" value="" maxlength="4" /> &nbsp; ','<select name="widthType">','<option value="%">'+h.percent+"</option>",'<option value="px">'+h.px+"</option>","</select> &nbsp; ",h.height+' <input type="text" class="ke-input-text ke-input-number" name="height" value="" maxlength="4" /> &nbsp; ',
+'<select name="heightType">','<option value="%">'+h.percent+"</option>",'<option value="px">'+h.px+"</option>",'</select></div><div class="ke-dialog-row">','<label for="kePadding" style="width:90px;">'+h.space+"</label>",h.padding+' <input type="text" id="kePadding" class="ke-input-text ke-input-number" name="padding" value="" maxlength="4" /> &nbsp; ',h.spacing+' <input type="text" class="ke-input-text ke-input-number" name="spacing" value="" maxlength="4" />','</div><div class="ke-dialog-row">',
+'<label for="keAlign" style="width:90px;">'+h.align+"</label>",'<select id="keAlign" name="align">','<option value="">'+h.alignDefault+"</option>",'<option value="left">'+h.alignLeft+"</option>",'<option value="center">'+h.alignCenter+"</option>",'<option value="right">'+h.alignRight+"</option>",'</select></div><div class="ke-dialog-row">','<label for="keBorder" style="width:90px;">'+h.border+"</label>",h.borderWidth+' <input type="text" id="keBorder" class="ke-input-text ke-input-number" name="border" value="" maxlength="4" /> &nbsp; ',
+h.borderColor+' <span class="ke-inline-block ke-input-color"></span>','</div><div class="ke-dialog-row">','<label for="keBgColor" style="width:90px;">'+h.backgroundColor+"</label>",'<span class="ke-inline-block ke-input-color"></span></div></div>'].join(""),j=e.createDialog({name:"table",width:500,title:e.lang("table"),body:j,beforeRemove:function(){H.unbind()},yesBtn:{name:e.lang("yes"),click:function(){var d=o.val(),g=l.val(),h=m.val(),j=p.val(),n=q.val(),E=z.val(),G=D.val(),S=r.val(),Y=A.val(),
+M=w.val(),J=b(H[0]).html()||"",W=b(H[1]).html()||"";if(d==0||!/^\d+$/.test(d))alert(e.lang("invalidRows")),o[0].focus();else if(g==0||!/^\d+$/.test(g))alert(e.lang("invalidRows")),l[0].focus();else if(/^\d*$/.test(h))if(/^\d*$/.test(j))if(/^\d*$/.test(G))if(/^\d*$/.test(S))if(/^\d*$/.test(M))if(v)h!==""?v.width(h+n):v.css("width",""),v[0].width!==void 0&&v.removeAttr("width"),j!==""?v.height(j+E):v.css("height",""),v[0].height!==void 0&&v.removeAttr("height"),v.css("background-color",W),v[0].bgColor!==
+void 0&&v.removeAttr("bgColor"),G!==""?v[0].cellPadding=G:v.removeAttr("cellPadding"),S!==""?v[0].cellSpacing=S:v.removeAttr("cellSpacing"),Y!==""?v[0].align=Y:v.removeAttr("align"),M!==""?v.attr("border",M):v.removeAttr("border"),M===""||M==="0"?v.addClass("ke-zeroborder"):v.removeClass("ke-zeroborder"),J!==""?v.attr("borderColor",J):v.removeAttr("borderColor"),e.hideDialog().focus();else{var T="";h!==""&&(T+="width:"+h+n+";");j!==""&&(T+="height:"+j+E+";");W!==""&&(T+="background-color:"+W+";");
+h="<table";T!==""&&(h+=' style="'+T+'"');G!==""&&(h+=' cellpadding="'+G+'"');S!==""&&(h+=' cellspacing="'+S+'"');Y!==""&&(h+=' align="'+Y+'"');M!==""&&(h+=' border="'+M+'"');if(M===""||M==="0")h+=' class="ke-zeroborder"';J!==""&&(h+=' bordercolor="'+J+'"');h+=">";for(G=0;G<d;G++){h+="<tr>";for(S=0;S<g;S++)h+="<td>"+(b.IE?"&nbsp;":"<br />")+"</td>";h+="</tr>"}h+="</table>";b.IE||(h+="<br />");e.insertHtml(h);e.select().hideDialog().focus();e.addBookmark()}else alert(e.lang("invalidBorder")),w[0].focus();
+else alert(e.lang("invalidSpacing")),r[0].focus();else alert(e.lang("invalidPadding")),D[0].focus();else alert(e.lang("invalidHeight")),p[0].focus();else alert(e.lang("invalidWidth")),m[0].focus()}}}).div,o=b('[name="rows"]',j).val(3),l=b('[name="cols"]',j).val(2),m=b('[name="width"]',j).val(100),p=b('[name="height"]',j),q=b('[name="widthType"]',j),z=b('[name="heightType"]',j),D=b('[name="padding"]',j).val(2),r=b('[name="spacing"]',j).val(0),A=b('[name="align"]',j),w=b('[name="border"]',j).val(1),
+H=b(".ke-input-color",j);g(j,H.eq(0));g(j,H.eq(1));d(H.eq(0),"#000000");d(H.eq(1),"");o[0].focus();o[0].select();var v;if(!n&&(v=e.plugin.getSelectedTable())){o.val(v[0].rows.length);l.val(v[0].rows.length>0?v[0].rows[0].cells.length:0);o.attr("disabled",!0);l.attr("disabled",!0);var E,n=v[0].style.width||v[0].width,j=v[0].style.height||v[0].height;n!==void 0&&(E=/^(\d+)((?:px|%)*)$/.exec(n))?(m.val(E[1]),q.val(E[2])):m.val("");if(j!==void 0&&(E=/^(\d+)((?:px|%)*)$/.exec(j)))p.val(E[1]),z.val(E[2]);
+D.val(v[0].cellPadding||"");r.val(v[0].cellSpacing||"");A.val(v[0].align||"");w.val(v[0].border===void 0?"":v[0].border);d(H.eq(0),b.toHex(v.attr("borderColor")||""));d(H.eq(1),b.toHex(v[0].style.backgroundColor||v[0].bgColor||""));m[0].focus();m[0].select()}},cellprop:function(){var n=['<div style="padding:20px;"><div class="ke-dialog-row">','<label for="keWidth" style="width:90px;">'+h.size+"</label>",h.width+' <input type="text" id="keWidth" class="ke-input-text ke-input-number" name="width" value="" maxlength="4" /> &nbsp; ',
+'<select name="widthType">','<option value="%">'+h.percent+"</option>",'<option value="px">'+h.px+"</option>","</select> &nbsp; ",h.height+' <input type="text" class="ke-input-text ke-input-number" name="height" value="" maxlength="4" /> &nbsp; ','<select name="heightType">','<option value="%">'+h.percent+"</option>",'<option value="px">'+h.px+"</option>",'</select></div><div class="ke-dialog-row">','<label for="keAlign" style="width:90px;">'+h.align+"</label>",h.textAlign+' <select id="keAlign" name="textAlign">',
+'<option value="">'+h.alignDefault+"</option>",'<option value="left">'+h.alignLeft+"</option>",'<option value="center">'+h.alignCenter+"</option>",'<option value="right">'+h.alignRight+"</option>","</select> ",h.verticalAlign+' <select name="verticalAlign">','<option value="">'+h.alignDefault+"</option>",'<option value="top">'+h.alignTop+"</option>",'<option value="middle">'+h.alignMiddle+"</option>",'<option value="bottom">'+h.alignBottom+"</option>",'<option value="baseline">'+h.alignBaseline+"</option>",
+'</select></div><div class="ke-dialog-row">','<label for="keBorder" style="width:90px;">'+h.border+"</label>",h.borderWidth+' <input type="text" id="keBorder" class="ke-input-text ke-input-number" name="border" value="" maxlength="4" /> &nbsp; ',h.borderColor+' <span class="ke-inline-block ke-input-color"></span>','</div><div class="ke-dialog-row">','<label for="keBgColor" style="width:90px;">'+h.backgroundColor+"</label>",'<span class="ke-inline-block ke-input-color"></span></div></div>'].join(""),
+n=e.createDialog({name:"table",width:500,title:e.lang("tablecell"),body:n,beforeRemove:function(){A.unbind()},yesBtn:{name:e.lang("yes"),click:function(){var d=j.val(),g=o.val(),h=l.val(),n=m.val();p.val();q.val();var H=z.val(),ea=D.val(),V=r.val(),Q=b(A[0]).html()||"",G=b(A[1]).html()||"";/^\d*$/.test(d)?/^\d*$/.test(g)?/^\d*$/.test(V)?(w.css({width:d!==""?d+h:"",height:g!==""?g+n:"","background-color":G,"text-align":H,"vertical-align":ea,"border-width":V,"border-style":V!==""?"solid":"","border-color":Q}),
+e.hideDialog().focus(),e.addBookmark()):(alert(e.lang("invalidBorder")),r[0].focus()):(alert(e.lang("invalidHeight")),o[0].focus()):(alert(e.lang("invalidWidth")),j[0].focus())}}}).div,j=b('[name="width"]',n).val(100),o=b('[name="height"]',n),l=b('[name="widthType"]',n),m=b('[name="heightType"]',n),p=b('[name="padding"]',n).val(2),q=b('[name="spacing"]',n).val(0),z=b('[name="textAlign"]',n),D=b('[name="verticalAlign"]',n),r=b('[name="border"]',n).val(1),A=b(".ke-input-color",n);g(n,A.eq(0));g(n,A.eq(1));
+d(A.eq(0),"#000000");d(A.eq(1),"");j[0].focus();j[0].select();var w=e.plugin.getSelectedCell(),H=w[0].style.height||w[0].height||"";(n=/^(\d+)((?:px|%)*)$/.exec(w[0].style.width||w[0].width||""))?(j.val(n[1]),l.val(n[2])):j.val("");if(n=/^(\d+)((?:px|%)*)$/.exec(H))o.val(n[1]),m.val(n[2]);z.val(w[0].style.textAlign||"");D.val(w[0].style.verticalAlign||"");(n=w[0].style.borderWidth||"")&&(n=parseInt(n));r.val(n);d(A.eq(0),b.toHex(w[0].style.borderColor||""));d(A.eq(1),b.toHex(w[0].style.backgroundColor||
+""));j[0].focus();j[0].select()},insert:function(){this.prop(!0)},"delete":function(){var b=e.plugin.getSelectedTable();e.cmd.range.setStartBefore(b[0]).collapse(!0);e.cmd.select();b.remove();e.addBookmark()},colinsert:function(d){var g=e.plugin.getSelectedTable()[0],h=e.plugin.getSelectedRow()[0],m=e.plugin.getSelectedCell()[0],d=m.cellIndex+d;d+=g.rows[0].cells.length-h.cells.length;for(var h=0,t=g.rows.length;h<t;h++){var p=g.rows[h],d=p.insertCell(d);d.innerHTML=b.IE?"":"<br />";d=l(g,p,d)}e.cmd.range.selectNodeContents(m).collapse(!0);
+e.cmd.select();e.addBookmark()},colinsertleft:function(){this.colinsert(0)},colinsertright:function(){this.colinsert(1)},rowinsert:function(d){var g=e.plugin.getSelectedTable()[0],h=e.plugin.getSelectedRow()[0],l=e.plugin.getSelectedCell()[0],m=h.rowIndex;d===1&&(m=h.rowIndex+(l.rowSpan-1)+d);for(var p=g.insertRow(m),q=0,z=h.cells.length;q<z;q++){h.cells[q].rowSpan>1&&(z-=h.cells[q].rowSpan-1);var D=p.insertCell(q);if(d===1&&h.cells[q].colSpan>1)D.colSpan=h.cells[q].colSpan;D.innerHTML=b.IE?"":"<br />"}for(h=
+m;h>=0;h--)if(d=g.rows[h].cells,d.length>q){for(g=l.cellIndex;g>=0;g--)d[g].rowSpan>1&&(d[g].rowSpan+=1);break}e.cmd.range.selectNodeContents(l).collapse(!0);e.cmd.select();e.addBookmark()},rowinsertabove:function(){this.rowinsert(0)},rowinsertbelow:function(){this.rowinsert(1)},rowmerge:function(){var b=e.plugin.getSelectedTable()[0],d=e.plugin.getSelectedRow()[0],g=e.plugin.getSelectedCell()[0],h=d.rowIndex+g.rowSpan,d=b.rows[h];if(!(b.rows.length<=h))b=g.cellIndex,d.cells.length<=b||(h=d.cells[b],
+g.colSpan===h.colSpan&&(g.rowSpan+=h.rowSpan,d.deleteCell(b),e.cmd.range.selectNodeContents(g).collapse(!0),e.cmd.select(),e.addBookmark()))},colmerge:function(){e.plugin.getSelectedTable();var b=e.plugin.getSelectedRow()[0],d=e.plugin.getSelectedCell()[0],g=d.cellIndex+1;if(!(b.cells.length<=g)){var h=b.cells[g];d.rowSpan===h.rowSpan&&(d.colSpan+=h.colSpan,b.deleteCell(g),e.cmd.range.selectNodeContents(d).collapse(!0),e.cmd.select(),e.addBookmark())}},rowsplit:function(){var d=e.plugin.getSelectedTable()[0],
+g=e.plugin.getSelectedRow()[0],h=e.plugin.getSelectedCell()[0],m=g.rowIndex;if(h.rowSpan!==1){for(var t=l(d,g,h),g=1,p=h.rowSpan;g<p;g++){var q=d.rows[m+g],t=q.insertCell(t);if(h.colSpan>1)t.colSpan=h.colSpan;t.innerHTML=b.IE?"":"<br />";t=l(d,q,t)}b(h).removeAttr("rowSpan");e.cmd.range.selectNodeContents(h).collapse(!0);e.cmd.select();e.addBookmark()}},colsplit:function(){e.plugin.getSelectedTable();var d=e.plugin.getSelectedRow()[0],g=e.plugin.getSelectedCell()[0],h=g.cellIndex;if(g.colSpan!==1){for(var l=
+1,m=g.colSpan;l<m;l++){var p=d.insertCell(h+l);if(g.rowSpan>1)p.rowSpan=g.rowSpan;p.innerHTML=b.IE?"":"<br />"}b(g).removeAttr("colSpan");e.cmd.range.selectNodeContents(g).collapse(!0);e.cmd.select();e.addBookmark()}},coldelete:function(){for(var d=e.plugin.getSelectedTable()[0],g=e.plugin.getSelectedRow()[0],h=e.plugin.getSelectedCell()[0].cellIndex,l=0,m=d.rows.length;l<m;l++){var p=d.rows[l],q=p.cells[h];q.colSpan>1?(q.colSpan-=1,q.colSpan===1&&b(q).removeAttr("colSpan")):p.deleteCell(h);q.rowSpan>
+1&&(l+=q.rowSpan-1)}g.cells.length===0?(e.cmd.range.setStartBefore(d).collapse(!0),e.cmd.select(),b(d).remove()):e.cmd.selection(!0);e.addBookmark()},rowdelete:function(){for(var d=e.plugin.getSelectedTable()[0],g=e.plugin.getSelectedRow()[0],h=e.plugin.getSelectedCell()[0],g=g.rowIndex,h=h.rowSpan-1;h>=0;h--)d.deleteRow(g+h);d.rows.length===0?(e.cmd.range.setStartBefore(d).collapse(!0),e.cmd.select(),b(d).remove()):e.cmd.selection(!0);e.addBookmark()}};e.clickToolbar("table",e.plugin.table.prop)});
+KindEditor.plugin("template",function(b){function d(d){return l+d+"?ver="+encodeURIComponent(b.DEBUG?b.TIME:b.VERSION)}var g=this;g.lang("template.");var l=g.pluginsPath+"template/html/";g.clickToolbar("template",function(){var e=g.lang("template."),h=['<div style="padding:10px 20px;">','<div class="ke-header">','<div class="ke-left">',e.selectTemplate+" <select>"];b.each(e.fileList,function(b,d){h.push('<option value="'+b+'">'+d+"</option>")});html=[h.join(""),'</select></div><div class="ke-right">',
+'<input type="checkbox" id="keReplaceFlag" name="replaceFlag" value="1" /> <label for="keReplaceFlag">'+e.replaceContent+"</label>",'</div><div class="ke-clearfix"></div></div><iframe class="ke-textarea" frameborder="0" style="width:458px;height:260px;background-color:#FFF;"></iframe></div>'].join("");var e=g.createDialog({name:"template",width:500,title:g.lang("template"),body:html,yesBtn:{name:g.lang("yes"),click:function(){var d=b.iframeDoc(j);g[n[0].checked?"html":"insertHtml"](d.body.innerHTML).hideDialog().focus()}}}),
+l=b("select",e.div),n=b('[name="replaceFlag"]',e.div),j=b("iframe",e.div);n[0].checked=!0;j.attr("src",d(l.val()));l.change(function(){j.attr("src",d(this.value))})})});
+KindEditor.plugin("wordpaste",function(b){var d=this;d.clickToolbar("wordpaste",function(){var g='<div style="padding:10px 20px;"><div style="margin-bottom:10px;">'+d.lang("wordpaste.").comment+'</div><iframe class="ke-textarea" frameborder="0" style="width:408px;height:260px;"></iframe></div>',g=d.createDialog({name:"wordpaste",width:450,title:d.lang("wordpaste"),body:g,yesBtn:{name:d.lang("yes"),click:function(){var e=l.body.innerHTML,e=b.clearMsWord(e,d.filterMode?d.htmlTags:b.options.htmlTags);
+d.insertHtml(e).hideDialog().focus()}}}).div,g=b("iframe",g),l=b.iframeDoc(g);if(!b.IE)l.designMode="on";l.open();l.write("<!doctype html><html><head><title>WordPaste</title></head>");l.write('<body style="background-color:#FFF;font-size:12px;margin:2px;">');b.IE||l.write("<br />");l.write("</body></html>");l.close();if(b.IE)l.body.contentEditable="true";g[0].contentWindow.focus()})});
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/kindeditor-all.js b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/kindeditor-all.js
new file mode 100644
index 0000000..283fa60
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/kindeditor-all.js
@@ -0,0 +1,10084 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2013 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @website http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+* @version 4.1.7 (2013-04-21)
+*******************************************************************************/
+(function (window, undefined) {
+	if (window.KindEditor) {
+		return;
+	}
+if (!window.console) {
+	window.console = {};
+}
+if (!console.log) {
+	console.log = function () {};
+}
+var _VERSION = '4.1.7 (2013-04-21)',
+	_ua = navigator.userAgent.toLowerCase(),
+	_IE = _ua.indexOf('msie') > -1 && _ua.indexOf('opera') == -1,
+	_GECKO = _ua.indexOf('gecko') > -1 && _ua.indexOf('khtml') == -1,
+	_WEBKIT = _ua.indexOf('applewebkit') > -1,
+	_OPERA = _ua.indexOf('opera') > -1,
+	_MOBILE = _ua.indexOf('mobile') > -1,
+	_IOS = /ipad|iphone|ipod/.test(_ua),
+	_QUIRKS = document.compatMode != 'CSS1Compat',
+	_matches = /(?:msie|firefox|webkit|opera)[\/:\s](\d+)/.exec(_ua),
+	_V = _matches ? _matches[1] : '0',
+	_TIME = new Date().getTime();
+function _isArray(val) {
+	if (!val) {
+		return false;
+	}
+	return Object.prototype.toString.call(val) === '[object Array]';
+}
+function _isFunction(val) {
+	if (!val) {
+		return false;
+	}
+	return Object.prototype.toString.call(val) === '[object Function]';
+}
+function _inArray(val, arr) {
+	for (var i = 0, len = arr.length; i < len; i++) {
+		if (val === arr[i]) {
+			return i;
+		}
+	}
+	return -1;
+}
+function _each(obj, fn) {
+	if (_isArray(obj)) {
+		for (var i = 0, len = obj.length; i < len; i++) {
+			if (fn.call(obj[i], i, obj[i]) === false) {
+				break;
+			}
+		}
+	} else {
+		for (var key in obj) {
+			if (obj.hasOwnProperty(key)) {
+				if (fn.call(obj[key], key, obj[key]) === false) {
+					break;
+				}
+			}
+		}
+	}
+}
+function _trim(str) {
+	return str.replace(/(?:^[ \t\n\r]+)|(?:[ \t\n\r]+$)/g, '');
+}
+function _inString(val, str, delimiter) {
+	delimiter = delimiter === undefined ? ',' : delimiter;
+	return (delimiter + str + delimiter).indexOf(delimiter + val + delimiter) >= 0;
+}
+function _addUnit(val, unit) {
+	unit = unit || 'px';
+	return val && /^\d+$/.test(val) ? val + unit : val;
+}
+function _removeUnit(val) {
+	var match;
+	return val && (match = /(\d+)/.exec(val)) ? parseInt(match[1], 10) : 0;
+}
+function _escape(val) {
+	return val.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
+}
+function _unescape(val) {
+	return val.replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&quot;/g, '"').replace(/&amp;/g, '&');
+}
+function _toCamel(str) {
+	var arr = str.split('-');
+	str = '';
+	_each(arr, function(key, val) {
+		str += (key > 0) ? val.charAt(0).toUpperCase() + val.substr(1) : val;
+	});
+	return str;
+}
+function _toHex(val) {
+	function hex(d) {
+		var s = parseInt(d, 10).toString(16).toUpperCase();
+		return s.length > 1 ? s : '0' + s;
+	}
+	return val.replace(/rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/ig,
+		function($0, $1, $2, $3) {
+			return '#' + hex($1) + hex($2) + hex($3);
+		}
+	);
+}
+function _toMap(val, delimiter) {
+	delimiter = delimiter === undefined ? ',' : delimiter;
+	var map = {}, arr = _isArray(val) ? val : val.split(delimiter), match;
+	_each(arr, function(key, val) {
+		if ((match = /^(\d+)\.\.(\d+)$/.exec(val))) {
+			for (var i = parseInt(match[1], 10); i <= parseInt(match[2], 10); i++) {
+				map[i.toString()] = true;
+			}
+		} else {
+			map[val] = true;
+		}
+	});
+	return map;
+}
+function _toArray(obj, offset) {
+	return Array.prototype.slice.call(obj, offset || 0);
+}
+function _undef(val, defaultVal) {
+	return val === undefined ? defaultVal : val;
+}
+function _invalidUrl(url) {
+	return !url || /[<>"]/.test(url);
+}
+function _addParam(url, param) {
+	return url.indexOf('?') >= 0 ? url + '&' + param : url + '?' + param;
+}
+function _extend(child, parent, proto) {
+	if (!proto) {
+		proto = parent;
+		parent = null;
+	}
+	var childProto;
+	if (parent) {
+		var fn = function () {};
+		fn.prototype = parent.prototype;
+		childProto = new fn();
+		_each(proto, function(key, val) {
+			childProto[key] = val;
+		});
+	} else {
+		childProto = proto;
+	}
+	childProto.constructor = child;
+	child.prototype = childProto;
+	child.parent = parent ? parent.prototype : null;
+}
+function _json(text) {
+	var match;
+	if ((match = /\{[\s\S]*\}|\[[\s\S]*\]/.exec(text))) {
+		text = match[0];
+	}
+	var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
+	cx.lastIndex = 0;
+	if (cx.test(text)) {
+		text = text.replace(cx, function (a) {
+			return '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
+		});
+	}
+	if (/^[\],:{}\s]*$/.
+	test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').
+	replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
+	replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
+		return eval('(' + text + ')');
+	}
+	throw 'JSON parse error';
+}
+var _round = Math.round;
+var K = {
+	DEBUG : false,
+	VERSION : _VERSION,
+	IE : _IE,
+	GECKO : _GECKO,
+	WEBKIT : _WEBKIT,
+	OPERA : _OPERA,
+	V : _V,
+	TIME : _TIME,
+	each : _each,
+	isArray : _isArray,
+	isFunction : _isFunction,
+	inArray : _inArray,
+	inString : _inString,
+	trim : _trim,
+	addUnit : _addUnit,
+	removeUnit : _removeUnit,
+	escape : _escape,
+	unescape : _unescape,
+	toCamel : _toCamel,
+	toHex : _toHex,
+	toMap : _toMap,
+	toArray : _toArray,
+	undef : _undef,
+	invalidUrl : _invalidUrl,
+	addParam : _addParam,
+	extend : _extend,
+	json : _json
+};
+var _INLINE_TAG_MAP = _toMap('a,abbr,acronym,b,basefont,bdo,big,br,button,cite,code,del,dfn,em,font,i,img,input,ins,kbd,label,map,q,s,samp,select,small,span,strike,strong,sub,sup,textarea,tt,u,var'),
+	_BLOCK_TAG_MAP = _toMap('address,applet,blockquote,body,center,dd,dir,div,dl,dt,fieldset,form,frameset,h1,h2,h3,h4,h5,h6,head,hr,html,iframe,ins,isindex,li,map,menu,meta,noframes,noscript,object,ol,p,pre,script,style,table,tbody,td,tfoot,th,thead,title,tr,ul'),
+	_SINGLE_TAG_MAP = _toMap('area,index,basefont,br,col,frame,hr,img,input,isindex,link,meta,param,embed'),
+	_STYLE_TAG_MAP = _toMap('b,basefont,big,del,em,font,i,s,small,span,strike,strong,sub,sup,u'),
+	_CONTROL_TAG_MAP = _toMap('img,table,input,textarea,button'),
+	_PRE_TAG_MAP = _toMap('pre,style,script'),
+	_NOSPLIT_TAG_MAP = _toMap('html,head,body,td,tr,table,ol,ul,li'),
+	_AUTOCLOSE_TAG_MAP = _toMap('colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr'),
+	_FILL_ATTR_MAP = _toMap('checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected'),
+	_VALUE_TAG_MAP = _toMap('input,button,textarea,select');
+function _getBasePath() {
+	var els = document.getElementsByTagName('script'), src;
+	for (var i = 0, len = els.length; i < len; i++) {
+		src = els[i].src || '';
+		if (/kindeditor[\w\-\.]*\.js/.test(src)) {
+			return src.substring(0, src.lastIndexOf('/') + 1);
+		}
+	}
+	return '';
+}
+K.basePath = _getBasePath();
+K.options = {
+	designMode : true,
+	fullscreenMode : false,
+	filterMode : true,
+	wellFormatMode : true,
+	shadowMode : true,
+	loadStyleMode : true,
+	basePath : K.basePath,
+	themesPath : K.basePath + 'themes/',
+	langPath : K.basePath + 'lang/',
+	pluginsPath : K.basePath + 'plugins/',
+	themeType : 'default',
+	langType : 'zh_CN',
+	urlType : '',
+	newlineTag : 'p',
+	resizeType : 2,
+	syncType : 'form',
+	pasteType : 2,
+	dialogAlignType : 'page',
+	useContextmenu : true,
+	fullscreenShortcut : false,
+	bodyClass : 'ke-content',
+	indentChar : '\t',
+	cssPath : '',
+	cssData : '',
+	minWidth : 650,
+	minHeight : 100,
+	minChangeSize : 50,
+	zIndex : 811213,
+	items : [
+		'source', '|', 'undo', 'redo', '|', 'preview', 'print', 'template', 'code', 'cut', 'copy', 'paste',
+		'plainpaste', 'wordpaste', '|', 'justifyleft', 'justifycenter', 'justifyright',
+		'justifyfull', 'insertorderedlist', 'insertunorderedlist', 'indent', 'outdent', 'subscript',
+		'superscript', 'clearhtml', 'quickformat', 'selectall', '|', 'fullscreen', '/',
+		'formatblock', 'fontname', 'fontsize', '|', 'forecolor', 'hilitecolor', 'bold',
+		'italic', 'underline', 'strikethrough', 'lineheight', 'removeformat', '|', 'image', 'multiimage',
+		'flash', 'media', 'insertfile', 'table', 'hr', 'emoticons', 'baidumap', 'pagebreak',
+		'anchor', 'link', 'unlink', '|', 'about'
+	],
+	noDisableItems : ['source', 'fullscreen'],
+	colorTable : [
+		['#E53333', '#E56600', '#FF9900', '#64451D', '#DFC5A4', '#FFE500'],
+		['#009900', '#006600', '#99BB00', '#B8D100', '#60D978', '#00D5FF'],
+		['#337FE5', '#003399', '#4C33E5', '#9933E5', '#CC33E5', '#EE33EE'],
+		['#FFFFFF', '#CCCCCC', '#999999', '#666666', '#333333', '#000000']
+	],
+	fontSizeTable : ['9px', '10px', '12px', '14px', '16px', '18px', '24px', '32px'],
+	htmlTags : {
+		font : ['id', 'class', 'color', 'size', 'face', '.background-color'],
+		span : [
+			'id', 'class', '.color', '.background-color', '.font-size', '.font-family', '.background',
+			'.font-weight', '.font-style', '.text-decoration', '.vertical-align', '.line-height'
+		],
+		div : [
+			'id', 'class', 'align', '.border', '.margin', '.padding', '.text-align', '.color',
+			'.background-color', '.font-size', '.font-family', '.font-weight', '.background',
+			'.font-style', '.text-decoration', '.vertical-align', '.margin-left'
+		],
+		table: [
+			'id', 'class', 'border', 'cellspacing', 'cellpadding', 'width', 'height', 'align', 'bordercolor',
+			'.padding', '.margin', '.border', 'bgcolor', '.text-align', '.color', '.background-color',
+			'.font-size', '.font-family', '.font-weight', '.font-style', '.text-decoration', '.background',
+			'.width', '.height', '.border-collapse'
+		],
+		'td,th': [
+			'id', 'class', 'align', 'valign', 'width', 'height', 'colspan', 'rowspan', 'bgcolor',
+			'.text-align', '.color', '.background-color', '.font-size', '.font-family', '.font-weight',
+			'.font-style', '.text-decoration', '.vertical-align', '.background', '.border'
+		],
+		a : ['id', 'class', 'href', 'target', 'name'],
+		embed : ['id', 'class', 'src', 'width', 'height', 'type', 'loop', 'autostart', 'quality', '.width', '.height', 'align', 'allowscriptaccess'],
+		img : ['id', 'class', 'src', 'width', 'height', 'border', 'alt', 'title', 'align', '.width', '.height', '.border'],
+		'p,ol,ul,li,blockquote,h1,h2,h3,h4,h5,h6' : [
+			'id', 'class', 'align', '.text-align', '.color', '.background-color', '.font-size', '.font-family', '.background',
+			'.font-weight', '.font-style', '.text-decoration', '.vertical-align', '.text-indent', '.margin-left'
+		],
+		pre : ['id', 'class'],
+		hr : ['id', 'class', '.page-break-after'],
+		'br,tbody,tr,strong,b,sub,sup,em,i,u,strike,s,del' : ['id', 'class'],
+		iframe : ['id', 'class', 'src', 'frameborder', 'width', 'height', '.width', '.height']
+	},
+	layout : '<div class="container"><div class="toolbar"></div><div class="edit"></div><div class="statusbar"></div></div>'
+};
+var _useCapture = false;
+var _INPUT_KEY_MAP = _toMap('8,9,13,32,46,48..57,59,61,65..90,106,109..111,188,190..192,219..222');
+var _CURSORMOVE_KEY_MAP = _toMap('33..40');
+var _CHANGE_KEY_MAP = {};
+_each(_INPUT_KEY_MAP, function(key, val) {
+	_CHANGE_KEY_MAP[key] = val;
+});
+_each(_CURSORMOVE_KEY_MAP, function(key, val) {
+	_CHANGE_KEY_MAP[key] = val;
+});
+function _bindEvent(el, type, fn) {
+	if (el.addEventListener){
+		el.addEventListener(type, fn, _useCapture);
+	} else if (el.attachEvent){
+		el.attachEvent('on' + type, fn);
+	}
+}
+function _unbindEvent(el, type, fn) {
+	if (el.removeEventListener){
+		el.removeEventListener(type, fn, _useCapture);
+	} else if (el.detachEvent){
+		el.detachEvent('on' + type, fn);
+	}
+}
+var _EVENT_PROPS = ('altKey,attrChange,attrName,bubbles,button,cancelable,charCode,clientX,clientY,ctrlKey,currentTarget,' +
+	'data,detail,eventPhase,fromElement,handler,keyCode,metaKey,newValue,offsetX,offsetY,originalTarget,pageX,' +
+	'pageY,prevValue,relatedNode,relatedTarget,screenX,screenY,shiftKey,srcElement,target,toElement,view,wheelDelta,which').split(',');
+function KEvent(el, event) {
+	this.init(el, event);
+}
+_extend(KEvent, {
+	init : function(el, event) {
+		var self = this, doc = el.ownerDocument || el.document || el;
+		self.event = event;
+		_each(_EVENT_PROPS, function(key, val) {
+			self[val] = event[val];
+		});
+		if (!self.target) {
+			self.target = self.srcElement || doc;
+		}
+		if (self.target.nodeType === 3) {
+			self.target = self.target.parentNode;
+		}
+		if (!self.relatedTarget && self.fromElement) {
+			self.relatedTarget = self.fromElement === self.target ? self.toElement : self.fromElement;
+		}
+		if (self.pageX == null && self.clientX != null) {
+			var d = doc.documentElement, body = doc.body;
+			self.pageX = self.clientX + (d && d.scrollLeft || body && body.scrollLeft || 0) - (d && d.clientLeft || body && body.clientLeft || 0);
+			self.pageY = self.clientY + (d && d.scrollTop  || body && body.scrollTop  || 0) - (d && d.clientTop  || body && body.clientTop  || 0);
+		}
+		if (!self.which && ((self.charCode || self.charCode === 0) ? self.charCode : self.keyCode)) {
+			self.which = self.charCode || self.keyCode;
+		}
+		if (!self.metaKey && self.ctrlKey) {
+			self.metaKey = self.ctrlKey;
+		}
+		if (!self.which && self.button !== undefined) {
+			self.which = (self.button & 1 ? 1 : (self.button & 2 ? 3 : (self.button & 4 ? 2 : 0)));
+		}
+		switch (self.which) {
+		case 186 :
+			self.which = 59;
+			break;
+		case 187 :
+		case 107 :
+		case 43 :
+			self.which = 61;
+			break;
+		case 189 :
+		case 45 :
+			self.which = 109;
+			break;
+		case 42 :
+			self.which = 106;
+			break;
+		case 47 :
+			self.which = 111;
+			break;
+		case 78 :
+			self.which = 110;
+			break;
+		}
+		if (self.which >= 96 && self.which <= 105) {
+			self.which -= 48;
+		}
+	},
+	preventDefault : function() {
+		var ev = this.event;
+		if (ev.preventDefault) {
+			ev.preventDefault();
+		}
+		ev.returnValue = false;
+	},
+	stopPropagation : function() {
+		var ev = this.event;
+		if (ev.stopPropagation) {
+			ev.stopPropagation();
+		}
+		ev.cancelBubble = true;
+	},
+	stop : function() {
+		this.preventDefault();
+		this.stopPropagation();
+	}
+});
+var _eventExpendo = 'kindeditor_' + _TIME, _eventId = 0, _eventData = {};
+function _getId(el) {
+	return el[_eventExpendo] || null;
+}
+function _setId(el) {
+	el[_eventExpendo] = ++_eventId;
+	return _eventId;
+}
+function _removeId(el) {
+	try {
+		delete el[_eventExpendo];
+	} catch(e) {
+		if (el.removeAttribute) {
+			el.removeAttribute(_eventExpendo);
+		}
+	}
+}
+function _bind(el, type, fn) {
+	if (type.indexOf(',') >= 0) {
+		_each(type.split(','), function() {
+			_bind(el, this, fn);
+		});
+		return;
+	}
+	var id = _getId(el);
+	if (!id) {
+		id = _setId(el);
+	}
+	if (_eventData[id] === undefined) {
+		_eventData[id] = {};
+	}
+	var events = _eventData[id][type];
+	if (events && events.length > 0) {
+		_unbindEvent(el, type, events[0]);
+	} else {
+		_eventData[id][type] = [];
+		_eventData[id].el = el;
+	}
+	events = _eventData[id][type];
+	if (events.length === 0) {
+		events[0] = function(e) {
+			var kevent = e ? new KEvent(el, e) : undefined;
+			_each(events, function(i, event) {
+				if (i > 0 && event) {
+					event.call(el, kevent);
+				}
+			});
+		};
+	}
+	if (_inArray(fn, events) < 0) {
+		events.push(fn);
+	}
+	_bindEvent(el, type, events[0]);
+}
+function _unbind(el, type, fn) {
+	if (type && type.indexOf(',') >= 0) {
+		_each(type.split(','), function() {
+			_unbind(el, this, fn);
+		});
+		return;
+	}
+	var id = _getId(el);
+	if (!id) {
+		return;
+	}
+	if (type === undefined) {
+		if (id in _eventData) {
+			_each(_eventData[id], function(key, events) {
+				if (key != 'el' && events.length > 0) {
+					_unbindEvent(el, key, events[0]);
+				}
+			});
+			delete _eventData[id];
+			_removeId(el);
+		}
+		return;
+	}
+	if (!_eventData[id]) {
+		return;
+	}
+	var events = _eventData[id][type];
+	if (events && events.length > 0) {
+		if (fn === undefined) {
+			_unbindEvent(el, type, events[0]);
+			delete _eventData[id][type];
+		} else {
+			_each(events, function(i, event) {
+				if (i > 0 && event === fn) {
+					events.splice(i, 1);
+				}
+			});
+			if (events.length == 1) {
+				_unbindEvent(el, type, events[0]);
+				delete _eventData[id][type];
+			}
+		}
+		var count = 0;
+		_each(_eventData[id], function() {
+			count++;
+		});
+		if (count < 2) {
+			delete _eventData[id];
+			_removeId(el);
+		}
+	}
+}
+function _fire(el, type) {
+	if (type.indexOf(',') >= 0) {
+		_each(type.split(','), function() {
+			_fire(el, this);
+		});
+		return;
+	}
+	var id = _getId(el);
+	if (!id) {
+		return;
+	}
+	var events = _eventData[id][type];
+	if (_eventData[id] && events && events.length > 0) {
+		events[0]();
+	}
+}
+function _ctrl(el, key, fn) {
+	var self = this;
+	key = /^\d{2,}$/.test(key) ? key : key.toUpperCase().charCodeAt(0);
+	_bind(el, 'keydown', function(e) {
+		if (e.ctrlKey && e.which == key && !e.shiftKey && !e.altKey) {
+			fn.call(el);
+			e.stop();
+		}
+	});
+}
+function _ready(fn) {
+	var loaded = false;
+	function readyFunc() {
+		if (!loaded) {
+			loaded = true;
+			fn(KindEditor);
+		}
+	}
+	function ieReadyFunc() {
+		if (!loaded) {
+			try {
+				document.documentElement.doScroll('left');
+			} catch(e) {
+				setTimeout(ieReadyFunc, 100);
+				return;
+			}
+			readyFunc();
+		}
+	}
+	function ieReadyStateFunc() {
+		if (document.readyState === 'complete') {
+			readyFunc();
+		}
+	}
+	if (document.addEventListener) {
+		_bind(document, 'DOMContentLoaded', readyFunc);
+	} else if (document.attachEvent) {
+		_bind(document, 'readystatechange', ieReadyStateFunc);
+		var toplevel = false;
+		try {
+			toplevel = window.frameElement == null;
+		} catch(e) {}
+		if (document.documentElement.doScroll && toplevel) {
+			ieReadyFunc();
+		}
+	}
+	_bind(window, 'load', readyFunc);
+}
+if (_IE) {
+	window.attachEvent('onunload', function() {
+		_each(_eventData, function(key, events) {
+			if (events.el) {
+				_unbind(events.el);
+			}
+		});
+	});
+}
+K.ctrl = _ctrl;
+K.ready = _ready;
+function _getCssList(css) {
+	var list = {},
+		reg = /\s*([\w\-]+)\s*:([^;]*)(;|$)/g,
+		match;
+	while ((match = reg.exec(css))) {
+		var key = _trim(match[1].toLowerCase()),
+			val = _trim(_toHex(match[2]));
+		list[key] = val;
+	}
+	return list;
+}
+function _getAttrList(tag) {
+	var list = {},
+		reg = /\s+(?:([\w\-:]+)|(?:([\w\-:]+)=([^\s"'<>]+))|(?:([\w\-:"]+)="([^"]*)")|(?:([\w\-:"]+)='([^']*)'))(?=(?:\s|\/|>)+)/g,
+		match;
+	while ((match = reg.exec(tag))) {
+		var key = (match[1] || match[2] || match[4] || match[6]).toLowerCase(),
+			val = (match[2] ? match[3] : (match[4] ? match[5] : match[7])) || '';
+		list[key] = val;
+	}
+	return list;
+}
+function _addClassToTag(tag, className) {
+	if (/\s+class\s*=/.test(tag)) {
+		tag = tag.replace(/(\s+class=["']?)([^"']*)(["']?[\s>])/, function($0, $1, $2, $3) {
+			if ((' ' + $2 + ' ').indexOf(' ' + className + ' ') < 0) {
+				return $2 === '' ? $1 + className + $3 : $1 + $2 + ' ' + className + $3;
+			} else {
+				return $0;
+			}
+		});
+	} else {
+		tag = tag.substr(0, tag.length - 1) + ' class="' + className + '">';
+	}
+	return tag;
+}
+function _formatCss(css) {
+	var str = '';
+	_each(_getCssList(css), function(key, val) {
+		str += key + ':' + val + ';';
+	});
+	return str;
+}
+function _formatUrl(url, mode, host, pathname) {
+	mode = _undef(mode, '').toLowerCase();
+	if (url.substr(0, 5) != 'data:') {
+		url = url.replace(/([^:])\/\//g, '$1/');
+	}
+	if (_inArray(mode, ['absolute', 'relative', 'domain']) < 0) {
+		return url;
+	}
+	host = host || location.protocol + '//' + location.host;
+	if (pathname === undefined) {
+		var m = location.pathname.match(/^(\/.*)\//);
+		pathname = m ? m[1] : '';
+	}
+	var match;
+	if ((match = /^(\w+:\/\/[^\/]*)/.exec(url))) {
+		if (match[1] !== host) {
+			return url;
+		}
+	} else if (/^\w+:/.test(url)) {
+		return url;
+	}
+	function getRealPath(path) {
+		var parts = path.split('/'), paths = [];
+		for (var i = 0, len = parts.length; i < len; i++) {
+			var part = parts[i];
+			if (part == '..') {
+				if (paths.length > 0) {
+					paths.pop();
+				}
+			} else if (part !== '' && part != '.') {
+				paths.push(part);
+			}
+		}
+		return '/' + paths.join('/');
+	}
+	if (/^\//.test(url)) {
+		url = host + getRealPath(url.substr(1));
+	} else if (!/^\w+:\/\//.test(url)) {
+		url = host + getRealPath(pathname + '/' + url);
+	}
+	function getRelativePath(path, depth) {
+		if (url.substr(0, path.length) === path) {
+			var arr = [];
+			for (var i = 0; i < depth; i++) {
+				arr.push('..');
+			}
+			var prefix = '.';
+			if (arr.length > 0) {
+				prefix += '/' + arr.join('/');
+			}
+			if (pathname == '/') {
+				prefix += '/';
+			}
+			return prefix + url.substr(path.length);
+		} else {
+			if ((match = /^(.*)\//.exec(path))) {
+				return getRelativePath(match[1], ++depth);
+			}
+		}
+	}
+	if (mode === 'relative') {
+		url = getRelativePath(host + pathname, 0).substr(2);
+	} else if (mode === 'absolute') {
+		if (url.substr(0, host.length) === host) {
+			url = url.substr(host.length);
+		}
+	}
+	return url;
+}
+function _formatHtml(html, htmlTags, urlType, wellFormatted, indentChar) {
+	urlType = urlType || '';
+	wellFormatted = _undef(wellFormatted, false);
+	indentChar = _undef(indentChar, '\t');
+	var fontSizeList = 'xx-small,x-small,small,medium,large,x-large,xx-large'.split(',');
+	html = html.replace(/(<(?:pre|pre\s[^>]*)>)([\s\S]*?)(<\/pre>)/ig, function($0, $1, $2, $3) {
+		return $1 + $2.replace(/<(?:br|br\s[^>]*)>/ig, '\n') + $3;
+	});
+	html = html.replace(/<(?:br|br\s[^>]*)\s*\/?>\s*<\/p>/ig, '</p>');
+	html = html.replace(/(<(?:p|p\s[^>]*)>)\s*(<\/p>)/ig, '$1<br />$2');
+	html = html.replace(/\u200B/g, '');
+	html = html.replace(/\u00A9/g, '&copy;');
+	var htmlTagMap = {};
+	if (htmlTags) {
+		_each(htmlTags, function(key, val) {
+			var arr = key.split(',');
+			for (var i = 0, len = arr.length; i < len; i++) {
+				htmlTagMap[arr[i]] = _toMap(val);
+			}
+		});
+		if (!htmlTagMap.script) {
+			html = html.replace(/(<(?:script|script\s[^>]*)>)([\s\S]*?)(<\/script>)/ig, '');
+		}
+		if (!htmlTagMap.style) {
+			html = html.replace(/(<(?:style|style\s[^>]*)>)([\s\S]*?)(<\/style>)/ig, '');
+		}
+	}
+	var re = /([ \t\n\r]*)<(\/)?([\w\-:]+)((?:\s+|(?:\s+[\w\-:]+)|(?:\s+[\w\-:]+=[^\s"'<>]+)|(?:\s+[\w\-:"]+="[^"]*")|(?:\s+[\w\-:"]+='[^']*'))*)(\/)?>([ \t\n\r]*)/g;
+	var tagStack = [];
+	html = html.replace(re, function($0, $1, $2, $3, $4, $5, $6) {
+		var full = $0,
+			startNewline = $1 || '',
+			startSlash = $2 || '',
+			tagName = $3.toLowerCase(),
+			attr = $4 || '',
+			endSlash = $5 ? ' ' + $5 : '',
+			endNewline = $6 || '';
+		if (htmlTags && !htmlTagMap[tagName]) {
+			return '';
+		}
+		if (endSlash === '' && _SINGLE_TAG_MAP[tagName]) {
+			endSlash = ' /';
+		}
+		if (_INLINE_TAG_MAP[tagName]) {
+			if (startNewline) {
+				startNewline = ' ';
+			}
+			if (endNewline) {
+				endNewline = ' ';
+			}
+		}
+		if (_PRE_TAG_MAP[tagName]) {
+			if (startSlash) {
+				endNewline = '\n';
+			} else {
+				startNewline = '\n';
+			}
+		}
+		if (wellFormatted && tagName == 'br') {
+			endNewline = '\n';
+		}
+		if (_BLOCK_TAG_MAP[tagName] && !_PRE_TAG_MAP[tagName]) {
+			if (wellFormatted) {
+				if (startSlash && tagStack.length > 0 && tagStack[tagStack.length - 1] === tagName) {
+					tagStack.pop();
+				} else {
+					tagStack.push(tagName);
+				}
+				startNewline = '\n';
+				endNewline = '\n';
+				for (var i = 0, len = startSlash ? tagStack.length : tagStack.length - 1; i < len; i++) {
+					startNewline += indentChar;
+					if (!startSlash) {
+						endNewline += indentChar;
+					}
+				}
+				if (endSlash) {
+					tagStack.pop();
+				} else if (!startSlash) {
+					endNewline += indentChar;
+				}
+			} else {
+				startNewline = endNewline = '';
+			}
+		}
+		if (attr !== '') {
+			var attrMap = _getAttrList(full);
+			if (tagName === 'font') {
+				var fontStyleMap = {}, fontStyle = '';
+				_each(attrMap, function(key, val) {
+					if (key === 'color') {
+						fontStyleMap.color = val;
+						delete attrMap[key];
+					}
+					if (key === 'size') {
+						fontStyleMap['font-size'] = fontSizeList[parseInt(val, 10) - 1] || '';
+						delete attrMap[key];
+					}
+					if (key === 'face') {
+						fontStyleMap['font-family'] = val;
+						delete attrMap[key];
+					}
+					if (key === 'style') {
+						fontStyle = val;
+					}
+				});
+				if (fontStyle && !/;$/.test(fontStyle)) {
+					fontStyle += ';';
+				}
+				_each(fontStyleMap, function(key, val) {
+					if (val === '') {
+						return;
+					}
+					if (/\s/.test(val)) {
+						val = "'" + val + "'";
+					}
+					fontStyle += key + ':' + val + ';';
+				});
+				attrMap.style = fontStyle;
+			}
+			_each(attrMap, function(key, val) {
+				if (_FILL_ATTR_MAP[key]) {
+					attrMap[key] = key;
+				}
+				if (_inArray(key, ['src', 'href']) >= 0) {
+					attrMap[key] = _formatUrl(val, urlType);
+				}
+				if (htmlTags && key !== 'style' && !htmlTagMap[tagName]['*'] && !htmlTagMap[tagName][key] ||
+					tagName === 'body' && key === 'contenteditable' ||
+					/^kindeditor_\d+$/.test(key)) {
+					delete attrMap[key];
+				}
+				if (key === 'style' && val !== '') {
+					var styleMap = _getCssList(val);
+					_each(styleMap, function(k, v) {
+						if (htmlTags && !htmlTagMap[tagName].style && !htmlTagMap[tagName]['.' + k]) {
+							delete styleMap[k];
+						}
+					});
+					var style = '';
+					_each(styleMap, function(k, v) {
+						style += k + ':' + v + ';';
+					});
+					attrMap.style = style;
+				}
+			});
+			attr = '';
+			_each(attrMap, function(key, val) {
+				if (key === 'style' && val === '') {
+					return;
+				}
+				val = val.replace(/"/g, '&quot;');
+				attr += ' ' + key + '="' + val + '"';
+			});
+		}
+		if (tagName === 'font') {
+			tagName = 'span';
+		}
+		return startNewline + '<' + startSlash + tagName + attr + endSlash + '>' + endNewline;
+	});
+	html = html.replace(/(<(?:pre|pre\s[^>]*)>)([\s\S]*?)(<\/pre>)/ig, function($0, $1, $2, $3) {
+		return $1 + $2.replace(/\n/g, '<span id="__kindeditor_pre_newline__">\n') + $3;
+	});
+	html = html.replace(/\n\s*\n/g, '\n');
+	html = html.replace(/<span id="__kindeditor_pre_newline__">\n/g, '\n');
+	return _trim(html);
+}
+function _clearMsWord(html, htmlTags) {
+	html = html.replace(/<meta[\s\S]*?>/ig, '')
+		.replace(/<![\s\S]*?>/ig, '')
+		.replace(/<style[^>]*>[\s\S]*?<\/style>/ig, '')
+		.replace(/<script[^>]*>[\s\S]*?<\/script>/ig, '')
+		.replace(/<w:[^>]+>[\s\S]*?<\/w:[^>]+>/ig, '')
+		.replace(/<o:[^>]+>[\s\S]*?<\/o:[^>]+>/ig, '')
+		.replace(/<xml>[\s\S]*?<\/xml>/ig, '')
+		.replace(/<(?:table|td)[^>]*>/ig, function(full) {
+			return full.replace(/border-bottom:([#\w\s]+)/ig, 'border:$1');
+		});
+	return _formatHtml(html, htmlTags);
+}
+function _mediaType(src) {
+	if (/\.(rm|rmvb)(\?|$)/i.test(src)) {
+		return 'audio/x-pn-realaudio-plugin';
+	}
+	if (/\.(swf|flv)(\?|$)/i.test(src)) {
+		return 'application/x-shockwave-flash';
+	}
+	return 'video/x-ms-asf-plugin';
+}
+function _mediaClass(type) {
+	if (/realaudio/i.test(type)) {
+		return 'ke-rm';
+	}
+	if (/flash/i.test(type)) {
+		return 'ke-flash';
+	}
+	return 'ke-media';
+}
+function _mediaAttrs(srcTag) {
+	return _getAttrList(unescape(srcTag));
+}
+function _mediaEmbed(attrs) {
+	var html = '<embed ';
+	_each(attrs, function(key, val) {
+		html += key + '="' + val + '" ';
+	});
+	html += '/>';
+	return html;
+}
+function _mediaImg(blankPath, attrs) {
+	var width = attrs.width,
+		height = attrs.height,
+		type = attrs.type || _mediaType(attrs.src),
+		srcTag = _mediaEmbed(attrs),
+		style = '';
+	if (width > 0) {
+		style += 'width:' + width + 'px;';
+	}
+	if (height > 0) {
+		style += 'height:' + height + 'px;';
+	}
+	var html = '<img class="' + _mediaClass(type) + '" src="' + blankPath + '" ';
+	if (style !== '') {
+		html += 'style="' + style + '" ';
+	}
+	html += 'data-ke-tag="' + escape(srcTag) + '" alt="" />';
+	return html;
+}
+function _tmpl(str, data) {
+	var fn = new Function("obj",
+		"var p=[],print=function(){p.push.apply(p,arguments);};" +
+		"with(obj){p.push('" +
+		str.replace(/[\r\t\n]/g, " ")
+			.split("<%").join("\t")
+			.replace(/((^|%>)[^\t]*)'/g, "$1\r")
+			.replace(/\t=(.*?)%>/g, "',$1,'")
+			.split("\t").join("');")
+			.split("%>").join("p.push('")
+			.split("\r").join("\\'") + "');}return p.join('');");
+	return data ? fn(data) : fn;
+}
+K.formatUrl = _formatUrl;
+K.formatHtml = _formatHtml;
+K.getCssList = _getCssList;
+K.getAttrList = _getAttrList;
+K.mediaType = _mediaType;
+K.mediaAttrs = _mediaAttrs;
+K.mediaEmbed = _mediaEmbed;
+K.mediaImg = _mediaImg;
+K.clearMsWord = _clearMsWord;
+K.tmpl = _tmpl;
+function _contains(nodeA, nodeB) {
+	if (nodeA.nodeType == 9 && nodeB.nodeType != 9) {
+		return true;
+	}
+	while ((nodeB = nodeB.parentNode)) {
+		if (nodeB == nodeA) {
+			return true;
+		}
+	}
+	return false;
+}
+var _getSetAttrDiv = document.createElement('div');
+_getSetAttrDiv.setAttribute('className', 't');
+var _GET_SET_ATTRIBUTE = _getSetAttrDiv.className !== 't';
+function _getAttr(el, key) {
+	key = key.toLowerCase();
+	var val = null;
+	if (!_GET_SET_ATTRIBUTE && el.nodeName.toLowerCase() != 'script') {
+		var div = el.ownerDocument.createElement('div');
+		div.appendChild(el.cloneNode(false));
+		var list = _getAttrList(_unescape(div.innerHTML));
+		if (key in list) {
+			val = list[key];
+		}
+	} else {
+		try {
+			val = el.getAttribute(key, 2);
+		} catch(e) {
+			val = el.getAttribute(key, 1);
+		}
+	}
+	if (key === 'style' && val !== null) {
+		val = _formatCss(val);
+	}
+	return val;
+}
+function _queryAll(expr, root) {
+	var exprList = expr.split(',');
+	if (exprList.length > 1) {
+		var mergedResults = [];
+		_each(exprList, function() {
+			_each(_queryAll(this, root), function() {
+				if (_inArray(this, mergedResults) < 0) {
+					mergedResults.push(this);
+				}
+			});
+		});
+		return mergedResults;
+	}
+	root = root || document;
+	function escape(str) {
+		if (typeof str != 'string') {
+			return str;
+		}
+		return str.replace(/([^\w\-])/g, '\\$1');
+	}
+	function stripslashes(str) {
+		return str.replace(/\\/g, '');
+	}
+	function cmpTag(tagA, tagB) {
+		return tagA === '*' || tagA.toLowerCase() === escape(tagB.toLowerCase());
+	}
+	function byId(id, tag, root) {
+		var arr = [],
+			doc = root.ownerDocument || root,
+			el = doc.getElementById(stripslashes(id));
+		if (el) {
+			if (cmpTag(tag, el.nodeName) && _contains(root, el)) {
+				arr.push(el);
+			}
+		}
+		return arr;
+	}
+	function byClass(className, tag, root) {
+		var doc = root.ownerDocument || root, arr = [], els, i, len, el;
+		if (root.getElementsByClassName) {
+			els = root.getElementsByClassName(stripslashes(className));
+			for (i = 0, len = els.length; i < len; i++) {
+				el = els[i];
+				if (cmpTag(tag, el.nodeName)) {
+					arr.push(el);
+				}
+			}
+		} else if (doc.querySelectorAll) {
+			els = doc.querySelectorAll((root.nodeName !== '#document' ? root.nodeName + ' ' : '') + tag + '.' + className);
+			for (i = 0, len = els.length; i < len; i++) {
+				el = els[i];
+				if (_contains(root, el)) {
+					arr.push(el);
+				}
+			}
+		} else {
+			els = root.getElementsByTagName(tag);
+			className = ' ' + className + ' ';
+			for (i = 0, len = els.length; i < len; i++) {
+				el = els[i];
+				if (el.nodeType == 1) {
+					var cls = el.className;
+					if (cls && (' ' + cls + ' ').indexOf(className) > -1) {
+						arr.push(el);
+					}
+				}
+			}
+		}
+		return arr;
+	}
+	function byName(name, tag, root) {
+		var arr = [], doc = root.ownerDocument || root,
+			els = doc.getElementsByName(stripslashes(name)), el;
+		for (var i = 0, len = els.length; i < len; i++) {
+			el = els[i];
+			if (cmpTag(tag, el.nodeName) && _contains(root, el)) {
+				if (el.getAttributeNode('name')) {
+					arr.push(el);
+				}
+			}
+		}
+		return arr;
+	}
+	function byAttr(key, val, tag, root) {
+		var arr = [], els = root.getElementsByTagName(tag), el;
+		for (var i = 0, len = els.length; i < len; i++) {
+			el = els[i];
+			if (el.nodeType == 1) {
+				if (val === null) {
+					if (_getAttr(el, key) !== null) {
+						arr.push(el);
+					}
+				} else {
+					if (val === escape(_getAttr(el, key))) {
+						arr.push(el);
+					}
+				}
+			}
+		}
+		return arr;
+	}
+	function select(expr, root) {
+		var arr = [], matches;
+		matches = /^((?:\\.|[^.#\s\[<>])+)/.exec(expr);
+		var tag = matches ? matches[1] : '*';
+		if ((matches = /#((?:[\w\-]|\\.)+)$/.exec(expr))) {
+			arr = byId(matches[1], tag, root);
+		} else if ((matches = /\.((?:[\w\-]|\\.)+)$/.exec(expr))) {
+			arr = byClass(matches[1], tag, root);
+		} else if ((matches = /\[((?:[\w\-]|\\.)+)\]/.exec(expr))) {
+			arr = byAttr(matches[1].toLowerCase(), null, tag, root);
+		} else if ((matches = /\[((?:[\w\-]|\\.)+)\s*=\s*['"]?((?:\\.|[^'"]+)+)['"]?\]/.exec(expr))) {
+			var key = matches[1].toLowerCase(), val = matches[2];
+			if (key === 'id') {
+				arr = byId(val, tag, root);
+			} else if (key === 'class') {
+				arr = byClass(val, tag, root);
+			} else if (key === 'name') {
+				arr = byName(val, tag, root);
+			} else {
+				arr = byAttr(key, val, tag, root);
+			}
+		} else {
+			var els = root.getElementsByTagName(tag), el;
+			for (var i = 0, len = els.length; i < len; i++) {
+				el = els[i];
+				if (el.nodeType == 1) {
+					arr.push(el);
+				}
+			}
+		}
+		return arr;
+	}
+	var parts = [], arr, re = /((?:\\.|[^\s>])+|[\s>])/g;
+	while ((arr = re.exec(expr))) {
+		if (arr[1] !== ' ') {
+			parts.push(arr[1]);
+		}
+	}
+	var results = [];
+	if (parts.length == 1) {
+		return select(parts[0], root);
+	}
+	var isChild = false, part, els, subResults, val, v, i, j, k, length, len, l;
+	for (i = 0, lenth = parts.length; i < lenth; i++) {
+		part = parts[i];
+		if (part === '>') {
+			isChild = true;
+			continue;
+		}
+		if (i > 0) {
+			els = [];
+			for (j = 0, len = results.length; j < len; j++) {
+				val = results[j];
+				subResults = select(part, val);
+				for (k = 0, l = subResults.length; k < l; k++) {
+					v = subResults[k];
+					if (isChild) {
+						if (val === v.parentNode) {
+							els.push(v);
+						}
+					} else {
+						els.push(v);
+					}
+				}
+			}
+			results = els;
+		} else {
+			results = select(part, root);
+		}
+		if (results.length === 0) {
+			return [];
+		}
+	}
+	return results;
+}
+function _query(expr, root) {
+	var arr = _queryAll(expr, root);
+	return arr.length > 0 ? arr[0] : null;
+}
+K.query = _query;
+K.queryAll = _queryAll;
+function _get(val) {
+	return K(val)[0];
+}
+function _getDoc(node) {
+	if (!node) {
+		return document;
+	}
+	return node.ownerDocument || node.document || node;
+}
+function _getWin(node) {
+	if (!node) {
+		return window;
+	}
+	var doc = _getDoc(node);
+	return doc.parentWindow || doc.defaultView;
+}
+function _setHtml(el, html) {
+	if (el.nodeType != 1) {
+		return;
+	}
+	var doc = _getDoc(el);
+	try {
+		el.innerHTML = '<img id="__kindeditor_temp_tag__" width="0" height="0" style="display:none;" />' + html;
+		var temp = doc.getElementById('__kindeditor_temp_tag__');
+		temp.parentNode.removeChild(temp);
+	} catch(e) {
+		K(el).empty();
+		K('@' + html, doc).each(function() {
+			el.appendChild(this);
+		});
+	}
+}
+function _hasClass(el, cls) {
+	return _inString(cls, el.className, ' ');
+}
+function _setAttr(el, key, val) {
+	if (_IE && _V < 8 && key.toLowerCase() == 'class') {
+		key = 'className';
+	}
+	el.setAttribute(key, '' + val);
+}
+function _removeAttr(el, key) {
+	if (_IE && _V < 8 && key.toLowerCase() == 'class') {
+		key = 'className';
+	}
+	_setAttr(el, key, '');
+	el.removeAttribute(key);
+}
+function _getNodeName(node) {
+	if (!node || !node.nodeName) {
+		return '';
+	}
+	return node.nodeName.toLowerCase();
+}
+function _computedCss(el, key) {
+	var self = this, win = _getWin(el), camelKey = _toCamel(key), val = '';
+	if (win.getComputedStyle) {
+		var style = win.getComputedStyle(el, null);
+		val = style[camelKey] || style.getPropertyValue(key) || el.style[camelKey];
+	} else if (el.currentStyle) {
+		val = el.currentStyle[camelKey] || el.style[camelKey];
+	}
+	return val;
+}
+function _hasVal(node) {
+	return !!_VALUE_TAG_MAP[_getNodeName(node)];
+}
+function _docElement(doc) {
+	doc = doc || document;
+	return _QUIRKS ? doc.body : doc.documentElement;
+}
+function _docHeight(doc) {
+	var el = _docElement(doc);
+	return Math.max(el.scrollHeight, el.clientHeight);
+}
+function _docWidth(doc) {
+	var el = _docElement(doc);
+	return Math.max(el.scrollWidth, el.clientWidth);
+}
+function _getScrollPos(doc) {
+	doc = doc || document;
+	var x, y;
+	if (_IE || _OPERA) {
+		x = _docElement(doc).scrollLeft;
+		y = _docElement(doc).scrollTop;
+	} else {
+		x = _getWin(doc).scrollX;
+		y = _getWin(doc).scrollY;
+	}
+	return {x : x, y : y};
+}
+function KNode(node) {
+	this.init(node);
+}
+_extend(KNode, {
+	init : function(node) {
+		var self = this;
+		node = _isArray(node) ? node : [node];
+		var length = 0;
+		for (var i = 0, len = node.length; i < len; i++) {
+			if (node[i]) {
+				self[i] = node[i].constructor === KNode ? node[i][0] : node[i];
+				length++;
+			}
+		}
+		self.length = length;
+		self.doc = _getDoc(self[0]);
+		self.name = _getNodeName(self[0]);
+		self.type = self.length > 0 ? self[0].nodeType : null;
+		self.win = _getWin(self[0]);
+	},
+	each : function(fn) {
+		var self = this;
+		for (var i = 0; i < self.length; i++) {
+			if (fn.call(self[i], i, self[i]) === false) {
+				return self;
+			}
+		}
+		return self;
+	},
+	bind : function(type, fn) {
+		this.each(function() {
+			_bind(this, type, fn);
+		});
+		return this;
+	},
+	unbind : function(type, fn) {
+		this.each(function() {
+			_unbind(this, type, fn);
+		});
+		return this;
+	},
+	fire : function(type) {
+		if (this.length < 1) {
+			return this;
+		}
+		_fire(this[0], type);
+		return this;
+	},
+	hasAttr : function(key) {
+		if (this.length < 1) {
+			return false;
+		}
+		return !!_getAttr(this[0], key);
+	},
+	attr : function(key, val) {
+		var self = this;
+		if (key === undefined) {
+			return _getAttrList(self.outer());
+		}
+		if (typeof key === 'object') {
+			_each(key, function(k, v) {
+				self.attr(k, v);
+			});
+			return self;
+		}
+		if (val === undefined) {
+			val = self.length < 1 ? null : _getAttr(self[0], key);
+			return val === null ? '' : val;
+		}
+		self.each(function() {
+			_setAttr(this, key, val);
+		});
+		return self;
+	},
+	removeAttr : function(key) {
+		this.each(function() {
+			_removeAttr(this, key);
+		});
+		return this;
+	},
+	get : function(i) {
+		if (this.length < 1) {
+			return null;
+		}
+		return this[i || 0];
+	},
+	eq : function(i) {
+		if (this.length < 1) {
+			return null;
+		}
+		return this[i] ? new KNode(this[i]) : null;
+	},
+	hasClass : function(cls) {
+		if (this.length < 1) {
+			return false;
+		}
+		return _hasClass(this[0], cls);
+	},
+	addClass : function(cls) {
+		this.each(function() {
+			if (!_hasClass(this, cls)) {
+				this.className = _trim(this.className + ' ' + cls);
+			}
+		});
+		return this;
+	},
+	removeClass : function(cls) {
+		this.each(function() {
+			if (_hasClass(this, cls)) {
+				this.className = _trim(this.className.replace(new RegExp('(^|\\s)' + cls + '(\\s|$)'), ' '));
+			}
+		});
+		return this;
+	},
+	html : function(val) {
+		var self = this;
+		if (val === undefined) {
+			if (self.length < 1 || self.type != 1) {
+				return '';
+			}
+			return _formatHtml(self[0].innerHTML);
+		}
+		self.each(function() {
+			_setHtml(this, val);
+		});
+		return self;
+	},
+	text : function() {
+		var self = this;
+		if (self.length < 1) {
+			return '';
+		}
+		return _IE ? self[0].innerText : self[0].textContent;
+	},
+	hasVal : function() {
+		if (this.length < 1) {
+			return false;
+		}
+		return _hasVal(this[0]);
+	},
+	val : function(val) {
+		var self = this;
+		if (val === undefined) {
+			if (self.length < 1) {
+				return '';
+			}
+			return self.hasVal() ? self[0].value : self.attr('value');
+		} else {
+			self.each(function() {
+				if (_hasVal(this)) {
+					this.value = val;
+				} else {
+					_setAttr(this, 'value' , val);
+				}
+			});
+			return self;
+		}
+	},
+	css : function(key, val) {
+		var self = this;
+		if (key === undefined) {
+			return _getCssList(self.attr('style'));
+		}
+		if (typeof key === 'object') {
+			_each(key, function(k, v) {
+				self.css(k, v);
+			});
+			return self;
+		}
+		if (val === undefined) {
+			if (self.length < 1) {
+				return '';
+			}
+			return self[0].style[_toCamel(key)] || _computedCss(self[0], key) || '';
+		}
+		self.each(function() {
+			this.style[_toCamel(key)] = val;
+		});
+		return self;
+	},
+	width : function(val) {
+		var self = this;
+		if (val === undefined) {
+			if (self.length < 1) {
+				return 0;
+			}
+			return self[0].offsetWidth;
+		}
+		return self.css('width', _addUnit(val));
+	},
+	height : function(val) {
+		var self = this;
+		if (val === undefined) {
+			if (self.length < 1) {
+				return 0;
+			}
+			return self[0].offsetHeight;
+		}
+		return self.css('height', _addUnit(val));
+	},
+	opacity : function(val) {
+		this.each(function() {
+			if (this.style.opacity === undefined) {
+				this.style.filter = val == 1 ? '' : 'alpha(opacity=' + (val * 100) + ')';
+			} else {
+				this.style.opacity = val == 1 ? '' : val;
+			}
+		});
+		return this;
+	},
+	data : function(key, val) {
+		var self = this;
+		key = 'kindeditor_data_' + key;
+		if (val === undefined) {
+			if (self.length < 1) {
+				return null;
+			}
+			return self[0][key];
+		}
+		this.each(function() {
+			this[key] = val;
+		});
+		return self;
+	},
+	pos : function() {
+		var self = this, node = self[0], x = 0, y = 0;
+		if (node) {
+			if (node.getBoundingClientRect) {
+				var box = node.getBoundingClientRect(),
+					pos = _getScrollPos(self.doc);
+				x = box.left + pos.x;
+				y = box.top + pos.y;
+			} else {
+				while (node) {
+					x += node.offsetLeft;
+					y += node.offsetTop;
+					node = node.offsetParent;
+				}
+			}
+		}
+		return {x : _round(x), y : _round(y)};
+	},
+	clone : function(bool) {
+		if (this.length < 1) {
+			return new KNode([]);
+		}
+		return new KNode(this[0].cloneNode(bool));
+	},
+	append : function(expr) {
+		this.each(function() {
+			if (this.appendChild) {
+				this.appendChild(_get(expr));
+			}
+		});
+		return this;
+	},
+	appendTo : function(expr) {
+		this.each(function() {
+			_get(expr).appendChild(this);
+		});
+		return this;
+	},
+	before : function(expr) {
+		this.each(function() {
+			this.parentNode.insertBefore(_get(expr), this);
+		});
+		return this;
+	},
+	after : function(expr) {
+		this.each(function() {
+			if (this.nextSibling) {
+				this.parentNode.insertBefore(_get(expr), this.nextSibling);
+			} else {
+				this.parentNode.appendChild(_get(expr));
+			}
+		});
+		return this;
+	},
+	replaceWith : function(expr) {
+		var nodes = [];
+		this.each(function(i, node) {
+			_unbind(node);
+			var newNode = _get(expr);
+			node.parentNode.replaceChild(newNode, node);
+			nodes.push(newNode);
+		});
+		return K(nodes);
+	},
+	empty : function() {
+		var self = this;
+		self.each(function(i, node) {
+			var child = node.firstChild;
+			while (child) {
+				if (!node.parentNode) {
+					return;
+				}
+				var next = child.nextSibling;
+				child.parentNode.removeChild(child);
+				child = next;
+			}
+		});
+		return self;
+	},
+	remove : function(keepChilds) {
+		var self = this;
+		self.each(function(i, node) {
+			if (!node.parentNode) {
+				return;
+			}
+			_unbind(node);
+			if (keepChilds) {
+				var child = node.firstChild;
+				while (child) {
+					var next = child.nextSibling;
+					node.parentNode.insertBefore(child, node);
+					child = next;
+				}
+			}
+			node.parentNode.removeChild(node);
+			delete self[i];
+		});
+		self.length = 0;
+		return self;
+	},
+	show : function(val) {
+		var self = this;
+		if (val === undefined) {
+			val = self._originDisplay || '';
+		}
+		if (self.css('display') != 'none') {
+			return self;
+		}
+		return self.css('display', val);
+	},
+	hide : function() {
+		var self = this;
+		if (self.length < 1) {
+			return self;
+		}
+		self._originDisplay = self[0].style.display;
+		return self.css('display', 'none');
+	},
+	outer : function() {
+		var self = this;
+		if (self.length < 1) {
+			return '';
+		}
+		var div = self.doc.createElement('div'), html;
+		div.appendChild(self[0].cloneNode(true));
+		html = _formatHtml(div.innerHTML);
+		div = null;
+		return html;
+	},
+	isSingle : function() {
+		return !!_SINGLE_TAG_MAP[this.name];
+	},
+	isInline : function() {
+		return !!_INLINE_TAG_MAP[this.name];
+	},
+	isBlock : function() {
+		return !!_BLOCK_TAG_MAP[this.name];
+	},
+	isStyle : function() {
+		return !!_STYLE_TAG_MAP[this.name];
+	},
+	isControl : function() {
+		return !!_CONTROL_TAG_MAP[this.name];
+	},
+	contains : function(otherNode) {
+		if (this.length < 1) {
+			return false;
+		}
+		return _contains(this[0], _get(otherNode));
+	},
+	parent : function() {
+		if (this.length < 1) {
+			return null;
+		}
+		var node = this[0].parentNode;
+		return node ? new KNode(node) : null;
+	},
+	children : function() {
+		if (this.length < 1) {
+			return new KNode([]);
+		}
+		var list = [], child = this[0].firstChild;
+		while (child) {
+			if (child.nodeType != 3 || _trim(child.nodeValue) !== '') {
+				list.push(child);
+			}
+			child = child.nextSibling;
+		}
+		return new KNode(list);
+	},
+	first : function() {
+		var list = this.children();
+		return list.length > 0 ? list.eq(0) : null;
+	},
+	last : function() {
+		var list = this.children();
+		return list.length > 0 ? list.eq(list.length - 1) : null;
+	},
+	index : function() {
+		if (this.length < 1) {
+			return -1;
+		}
+		var i = -1, sibling = this[0];
+		while (sibling) {
+			i++;
+			sibling = sibling.previousSibling;
+		}
+		return i;
+	},
+	prev : function() {
+		if (this.length < 1) {
+			return null;
+		}
+		var node = this[0].previousSibling;
+		return node ? new KNode(node) : null;
+	},
+	next : function() {
+		if (this.length < 1) {
+			return null;
+		}
+		var node = this[0].nextSibling;
+		return node ? new KNode(node) : null;
+	},
+	scan : function(fn, order) {
+		if (this.length < 1) {
+			return;
+		}
+		order = (order === undefined) ? true : order;
+		function walk(node) {
+			var n = order ? node.firstChild : node.lastChild;
+			while (n) {
+				var next = order ? n.nextSibling : n.previousSibling;
+				if (fn(n) === false) {
+					return false;
+				}
+				if (walk(n) === false) {
+					return false;
+				}
+				n = next;
+			}
+		}
+		walk(this[0]);
+		return this;
+	}
+});
+_each(('blur,focus,focusin,focusout,load,resize,scroll,unload,click,dblclick,' +
+	'mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave,' +
+	'change,select,submit,keydown,keypress,keyup,error,contextmenu').split(','), function(i, type) {
+	KNode.prototype[type] = function(fn) {
+		return fn ? this.bind(type, fn) : this.fire(type);
+	};
+});
+var _K = K;
+K = function(expr, root) {
+	if (expr === undefined || expr === null) {
+		return;
+	}
+	function newNode(node) {
+		if (!node[0]) {
+			node = [];
+		}
+		return new KNode(node);
+	}
+	if (typeof expr === 'string') {
+		if (root) {
+			root = _get(root);
+		}
+		var length = expr.length;
+		if (expr.charAt(0) === '@') {
+			expr = expr.substr(1);
+		}
+		if (expr.length !== length || /<.+>/.test(expr)) {
+			var doc = root ? root.ownerDocument || root : document,
+				div = doc.createElement('div'), list = [];
+			div.innerHTML = '<img id="__kindeditor_temp_tag__" width="0" height="0" style="display:none;" />' + expr;
+			for (var i = 0, len = div.childNodes.length; i < len; i++) {
+				var child = div.childNodes[i];
+				if (child.id == '__kindeditor_temp_tag__') {
+					continue;
+				}
+				list.push(child);
+			}
+			return newNode(list);
+		}
+		return newNode(_queryAll(expr, root));
+	}
+	if (expr && expr.constructor === KNode) {
+		return expr;
+	}
+	if (expr.toArray) {
+		expr = expr.toArray();
+	}
+	if (_isArray(expr)) {
+		return newNode(expr);
+	}
+	return newNode(_toArray(arguments));
+};
+_each(_K, function(key, val) {
+	K[key] = val;
+});
+K.NodeClass = KNode;
+window.KindEditor = K;
+var _START_TO_START = 0,
+	_START_TO_END = 1,
+	_END_TO_END = 2,
+	_END_TO_START = 3,
+	_BOOKMARK_ID = 0;
+function _updateCollapsed(range) {
+	range.collapsed = (range.startContainer === range.endContainer && range.startOffset === range.endOffset);
+	return range;
+}
+function _copyAndDelete(range, isCopy, isDelete) {
+	var doc = range.doc, nodeList = [];
+	function splitTextNode(node, startOffset, endOffset) {
+		var length = node.nodeValue.length, centerNode;
+		if (isCopy) {
+			var cloneNode = node.cloneNode(true);
+			if (startOffset > 0) {
+				centerNode = cloneNode.splitText(startOffset);
+			} else {
+				centerNode = cloneNode;
+			}
+			if (endOffset < length) {
+				centerNode.splitText(endOffset - startOffset);
+			}
+		}
+		if (isDelete) {
+			var center = node;
+			if (startOffset > 0) {
+				center = node.splitText(startOffset);
+				range.setStart(node, startOffset);
+			}
+			if (endOffset < length) {
+				var right = center.splitText(endOffset - startOffset);
+				range.setEnd(right, 0);
+			}
+			nodeList.push(center);
+		}
+		return centerNode;
+	}
+	function removeNodes() {
+		if (isDelete) {
+			range.up().collapse(true);
+		}
+		for (var i = 0, len = nodeList.length; i < len; i++) {
+			var node = nodeList[i];
+			if (node.parentNode) {
+				node.parentNode.removeChild(node);
+			}
+		}
+	}
+	var copyRange = range.cloneRange().down();
+	var start = -1, incStart = -1, incEnd = -1, end = -1,
+		ancestor = range.commonAncestor(), frag = doc.createDocumentFragment();
+	if (ancestor.nodeType == 3) {
+		var textNode = splitTextNode(ancestor, range.startOffset, range.endOffset);
+		if (isCopy) {
+			frag.appendChild(textNode);
+		}
+		removeNodes();
+		return isCopy ? frag : range;
+	}
+	function extractNodes(parent, frag) {
+		var node = parent.firstChild, nextNode;
+		while (node) {
+			var testRange = new KRange(doc).selectNode(node);
+			start = testRange.compareBoundaryPoints(_START_TO_END, range);
+			if (start >= 0 && incStart <= 0) {
+				incStart = testRange.compareBoundaryPoints(_START_TO_START, range);
+			}
+			if (incStart >= 0 && incEnd <= 0) {
+				incEnd = testRange.compareBoundaryPoints(_END_TO_END, range);
+			}
+			if (incEnd >= 0 && end <= 0) {
+				end = testRange.compareBoundaryPoints(_END_TO_START, range);
+			}
+			if (end >= 0) {
+				return false;
+			}
+			nextNode = node.nextSibling;
+			if (start > 0) {
+				if (node.nodeType == 1) {
+					if (incStart >= 0 && incEnd <= 0) {
+						if (isCopy) {
+							frag.appendChild(node.cloneNode(true));
+						}
+						if (isDelete) {
+							nodeList.push(node);
+						}
+					} else {
+						var childFlag;
+						if (isCopy) {
+							childFlag = node.cloneNode(false);
+							frag.appendChild(childFlag);
+						}
+						if (extractNodes(node, childFlag) === false) {
+							return false;
+						}
+					}
+				} else if (node.nodeType == 3) {
+					var textNode;
+					if (node == copyRange.startContainer) {
+						textNode = splitTextNode(node, copyRange.startOffset, node.nodeValue.length);
+					} else if (node == copyRange.endContainer) {
+						textNode = splitTextNode(node, 0, copyRange.endOffset);
+					} else {
+						textNode = splitTextNode(node, 0, node.nodeValue.length);
+					}
+					if (isCopy) {
+						try {
+							frag.appendChild(textNode);
+						} catch(e) {}
+					}
+				}
+			}
+			node = nextNode;
+		}
+	}
+	extractNodes(ancestor, frag);
+	if (isDelete) {
+		range.up().collapse(true);
+	}
+	for (var i = 0, len = nodeList.length; i < len; i++) {
+		var node = nodeList[i];
+		if (node.parentNode) {
+			node.parentNode.removeChild(node);
+		}
+	}
+	return isCopy ? frag : range;
+}
+function _moveToElementText(range, el) {
+	var node = el;
+	while (node) {
+		var knode = K(node);
+		if (knode.name == 'marquee' || knode.name == 'select') {
+			return;
+		}
+		node = node.parentNode;
+	}
+	try {
+		range.moveToElementText(el);
+	} catch(e) {}
+}
+function _getStartEnd(rng, isStart) {
+	var doc = rng.parentElement().ownerDocument,
+		pointRange = rng.duplicate();
+	pointRange.collapse(isStart);
+	var parent = pointRange.parentElement(),
+		nodes = parent.childNodes;
+	if (nodes.length === 0) {
+		return {node: parent.parentNode, offset: K(parent).index()};
+	}
+	var startNode = doc, startPos = 0, cmp = -1;
+	var testRange = rng.duplicate();
+	_moveToElementText(testRange, parent);
+	for (var i = 0, len = nodes.length; i < len; i++) {
+		var node = nodes[i];
+		cmp = testRange.compareEndPoints('StartToStart', pointRange);
+		if (cmp === 0) {
+			return {node: node.parentNode, offset: i};
+		}
+		if (node.nodeType == 1) {
+			var nodeRange = rng.duplicate(), dummy, knode = K(node), newNode = node;
+			if (knode.isControl()) {
+				dummy = doc.createElement('span');
+				knode.after(dummy);
+				newNode = dummy;
+				startPos += knode.text().replace(/\r\n|\n|\r/g, '').length;
+			}
+			_moveToElementText(nodeRange, newNode);
+			testRange.setEndPoint('StartToEnd', nodeRange);
+			if (cmp > 0) {
+				startPos += nodeRange.text.replace(/\r\n|\n|\r/g, '').length;
+			} else {
+				startPos = 0;
+			}
+			if (dummy) {
+				K(dummy).remove();
+			}
+		} else if (node.nodeType == 3) {
+			testRange.moveStart('character', node.nodeValue.length);
+			startPos += node.nodeValue.length;
+		}
+		if (cmp < 0) {
+			startNode = node;
+		}
+	}
+	if (cmp < 0 && startNode.nodeType == 1) {
+		return {node: parent, offset: K(parent.lastChild).index() + 1};
+	}
+	if (cmp > 0) {
+		while (startNode.nextSibling && startNode.nodeType == 1) {
+			startNode = startNode.nextSibling;
+		}
+	}
+	testRange = rng.duplicate();
+	_moveToElementText(testRange, parent);
+	testRange.setEndPoint('StartToEnd', pointRange);
+	startPos -= testRange.text.replace(/\r\n|\n|\r/g, '').length;
+	if (cmp > 0 && startNode.nodeType == 3) {
+		var prevNode = startNode.previousSibling;
+		while (prevNode && prevNode.nodeType == 3) {
+			startPos -= prevNode.nodeValue.length;
+			prevNode = prevNode.previousSibling;
+		}
+	}
+	return {node: startNode, offset: startPos};
+}
+function _getEndRange(node, offset) {
+	var doc = node.ownerDocument || node,
+		range = doc.body.createTextRange();
+	if (doc == node) {
+		range.collapse(true);
+		return range;
+	}
+	if (node.nodeType == 1 && node.childNodes.length > 0) {
+		var children = node.childNodes, isStart, child;
+		if (offset === 0) {
+			child = children[0];
+			isStart = true;
+		} else {
+			child = children[offset - 1];
+			isStart = false;
+		}
+		if (!child) {
+			return range;
+		}
+		if (K(child).name === 'head') {
+			if (offset === 1) {
+				isStart = true;
+			}
+			if (offset === 2) {
+				isStart = false;
+			}
+			range.collapse(isStart);
+			return range;
+		}
+		if (child.nodeType == 1) {
+			var kchild = K(child), span;
+			if (kchild.isControl()) {
+				span = doc.createElement('span');
+				if (isStart) {
+					kchild.before(span);
+				} else {
+					kchild.after(span);
+				}
+				child = span;
+			}
+			_moveToElementText(range, child);
+			range.collapse(isStart);
+			if (span) {
+				K(span).remove();
+			}
+			return range;
+		}
+		node = child;
+		offset = isStart ? 0 : child.nodeValue.length;
+	}
+	var dummy = doc.createElement('span');
+	K(node).before(dummy);
+	_moveToElementText(range, dummy);
+	range.moveStart('character', offset);
+	K(dummy).remove();
+	return range;
+}
+function _toRange(rng) {
+	var doc, range;
+	function tr2td(start) {
+		if (K(start.node).name == 'tr') {
+			start.node = start.node.cells[start.offset];
+			start.offset = 0;
+		}
+	}
+	if (_IE) {
+		if (rng.item) {
+			doc = _getDoc(rng.item(0));
+			range = new KRange(doc);
+			range.selectNode(rng.item(0));
+			return range;
+		}
+		doc = rng.parentElement().ownerDocument;
+		var start = _getStartEnd(rng, true),
+			end = _getStartEnd(rng, false);
+		tr2td(start);
+		tr2td(end);
+		range = new KRange(doc);
+		range.setStart(start.node, start.offset);
+		range.setEnd(end.node, end.offset);
+		return range;
+	}
+	var startContainer = rng.startContainer;
+	doc = startContainer.ownerDocument || startContainer;
+	range = new KRange(doc);
+	range.setStart(startContainer, rng.startOffset);
+	range.setEnd(rng.endContainer, rng.endOffset);
+	return range;
+}
+function KRange(doc) {
+	this.init(doc);
+}
+_extend(KRange, {
+	init : function(doc) {
+		var self = this;
+		self.startContainer = doc;
+		self.startOffset = 0;
+		self.endContainer = doc;
+		self.endOffset = 0;
+		self.collapsed = true;
+		self.doc = doc;
+	},
+	commonAncestor : function() {
+		function getParents(node) {
+			var parents = [];
+			while (node) {
+				parents.push(node);
+				node = node.parentNode;
+			}
+			return parents;
+		}
+		var parentsA = getParents(this.startContainer),
+			parentsB = getParents(this.endContainer),
+			i = 0, lenA = parentsA.length, lenB = parentsB.length, parentA, parentB;
+		while (++i) {
+			parentA = parentsA[lenA - i];
+			parentB = parentsB[lenB - i];
+			if (!parentA || !parentB || parentA !== parentB) {
+				break;
+			}
+		}
+		return parentsA[lenA - i + 1];
+	},
+	setStart : function(node, offset) {
+		var self = this, doc = self.doc;
+		self.startContainer = node;
+		self.startOffset = offset;
+		if (self.endContainer === doc) {
+			self.endContainer = node;
+			self.endOffset = offset;
+		}
+		return _updateCollapsed(this);
+	},
+	setEnd : function(node, offset) {
+		var self = this, doc = self.doc;
+		self.endContainer = node;
+		self.endOffset = offset;
+		if (self.startContainer === doc) {
+			self.startContainer = node;
+			self.startOffset = offset;
+		}
+		return _updateCollapsed(this);
+	},
+	setStartBefore : function(node) {
+		return this.setStart(node.parentNode || this.doc, K(node).index());
+	},
+	setStartAfter : function(node) {
+		return this.setStart(node.parentNode || this.doc, K(node).index() + 1);
+	},
+	setEndBefore : function(node) {
+		return this.setEnd(node.parentNode || this.doc, K(node).index());
+	},
+	setEndAfter : function(node) {
+		return this.setEnd(node.parentNode || this.doc, K(node).index() + 1);
+	},
+	selectNode : function(node) {
+		return this.setStartBefore(node).setEndAfter(node);
+	},
+	selectNodeContents : function(node) {
+		var knode = K(node);
+		if (knode.type == 3 || knode.isSingle()) {
+			return this.selectNode(node);
+		}
+		var children = knode.children();
+		if (children.length > 0) {
+			return this.setStartBefore(children[0]).setEndAfter(children[children.length - 1]);
+		}
+		return this.setStart(node, 0).setEnd(node, 0);
+	},
+	collapse : function(toStart) {
+		if (toStart) {
+			return this.setEnd(this.startContainer, this.startOffset);
+		}
+		return this.setStart(this.endContainer, this.endOffset);
+	},
+	compareBoundaryPoints : function(how, range) {
+		var rangeA = this.get(), rangeB = range.get();
+		if (_IE) {
+			var arr = {};
+			arr[_START_TO_START] = 'StartToStart';
+			arr[_START_TO_END] = 'EndToStart';
+			arr[_END_TO_END] = 'EndToEnd';
+			arr[_END_TO_START] = 'StartToEnd';
+			var cmp = rangeA.compareEndPoints(arr[how], rangeB);
+			if (cmp !== 0) {
+				return cmp;
+			}
+			var nodeA, nodeB, nodeC, posA, posB;
+			if (how === _START_TO_START || how === _END_TO_START) {
+				nodeA = this.startContainer;
+				posA = this.startOffset;
+			}
+			if (how === _START_TO_END || how === _END_TO_END) {
+				nodeA = this.endContainer;
+				posA = this.endOffset;
+			}
+			if (how === _START_TO_START || how === _START_TO_END) {
+				nodeB = range.startContainer;
+				posB = range.startOffset;
+			}
+			if (how === _END_TO_END || how === _END_TO_START) {
+				nodeB = range.endContainer;
+				posB = range.endOffset;
+			}
+			if (nodeA === nodeB) {
+				var diff = posA - posB;
+				return diff > 0 ? 1 : (diff < 0 ? -1 : 0);
+			}
+			nodeC = nodeB;
+			while (nodeC && nodeC.parentNode !== nodeA) {
+				nodeC = nodeC.parentNode;
+			}
+			if (nodeC) {
+				return K(nodeC).index() >= posA ? -1 : 1;
+			}
+			nodeC = nodeA;
+			while (nodeC && nodeC.parentNode !== nodeB) {
+				nodeC = nodeC.parentNode;
+			}
+			if (nodeC) {
+				return K(nodeC).index() >= posB ? 1 : -1;
+			}
+			nodeC = K(nodeB).next();
+			if (nodeC && nodeC.contains(nodeA)) {
+				return 1;
+			}
+			nodeC = K(nodeA).next();
+			if (nodeC && nodeC.contains(nodeB)) {
+				return -1;
+			}
+		} else {
+			return rangeA.compareBoundaryPoints(how, rangeB);
+		}
+	},
+	cloneRange : function() {
+		return new KRange(this.doc).setStart(this.startContainer, this.startOffset).setEnd(this.endContainer, this.endOffset);
+	},
+	toString : function() {
+		var rng = this.get(), str = _IE ? rng.text : rng.toString();
+		return str.replace(/\r\n|\n|\r/g, '');
+	},
+	cloneContents : function() {
+		return _copyAndDelete(this, true, false);
+	},
+	deleteContents : function() {
+		return _copyAndDelete(this, false, true);
+	},
+	extractContents : function() {
+		return _copyAndDelete(this, true, true);
+	},
+	insertNode : function(node) {
+		var self = this,
+			sc = self.startContainer, so = self.startOffset,
+			ec = self.endContainer, eo = self.endOffset,
+			firstChild, lastChild, c, nodeCount = 1;
+		if (node.nodeName.toLowerCase() === '#document-fragment') {
+			firstChild = node.firstChild;
+			lastChild = node.lastChild;
+			nodeCount = node.childNodes.length;
+		}
+		if (sc.nodeType == 1) {
+			c = sc.childNodes[so];
+			if (c) {
+				sc.insertBefore(node, c);
+				if (sc === ec) {
+					eo += nodeCount;
+				}
+			} else {
+				sc.appendChild(node);
+			}
+		} else if (sc.nodeType == 3) {
+			if (so === 0) {
+				sc.parentNode.insertBefore(node, sc);
+				if (sc.parentNode === ec) {
+					eo += nodeCount;
+				}
+			} else if (so >= sc.nodeValue.length) {
+				if (sc.nextSibling) {
+					sc.parentNode.insertBefore(node, sc.nextSibling);
+				} else {
+					sc.parentNode.appendChild(node);
+				}
+			} else {
+				if (so > 0) {
+					c = sc.splitText(so);
+				} else {
+					c = sc;
+				}
+				sc.parentNode.insertBefore(node, c);
+				if (sc === ec) {
+					ec = c;
+					eo -= so;
+				}
+			}
+		}
+		if (firstChild) {
+			self.setStartBefore(firstChild).setEndAfter(lastChild);
+		} else {
+			self.selectNode(node);
+		}
+		if (self.compareBoundaryPoints(_END_TO_END, self.cloneRange().setEnd(ec, eo)) >= 1) {
+			return self;
+		}
+		return self.setEnd(ec, eo);
+	},
+	surroundContents : function(node) {
+		node.appendChild(this.extractContents());
+		return this.insertNode(node).selectNode(node);
+	},
+	isControl : function() {
+		var self = this,
+			sc = self.startContainer, so = self.startOffset,
+			ec = self.endContainer, eo = self.endOffset, rng;
+		return sc.nodeType == 1 && sc === ec && so + 1 === eo && K(sc.childNodes[so]).isControl();
+	},
+	get : function(hasControlRange) {
+		var self = this, doc = self.doc, node, rng;
+		if (!_IE) {
+			rng = doc.createRange();
+			try {
+				rng.setStart(self.startContainer, self.startOffset);
+				rng.setEnd(self.endContainer, self.endOffset);
+			} catch (e) {}
+			return rng;
+		}
+		if (hasControlRange && self.isControl()) {
+			rng = doc.body.createControlRange();
+			rng.addElement(self.startContainer.childNodes[self.startOffset]);
+			return rng;
+		}
+		var range = self.cloneRange().down();
+		rng = doc.body.createTextRange();
+		rng.setEndPoint('StartToStart', _getEndRange(range.startContainer, range.startOffset));
+		rng.setEndPoint('EndToStart', _getEndRange(range.endContainer, range.endOffset));
+		return rng;
+	},
+	html : function() {
+		return K(this.cloneContents()).outer();
+	},
+	down : function() {
+		var self = this;
+		function downPos(node, pos, isStart) {
+			if (node.nodeType != 1) {
+				return;
+			}
+			var children = K(node).children();
+			if (children.length === 0) {
+				return;
+			}
+			var left, right, child, offset;
+			if (pos > 0) {
+				left = children.eq(pos - 1);
+			}
+			if (pos < children.length) {
+				right = children.eq(pos);
+			}
+			if (left && left.type == 3) {
+				child = left[0];
+				offset = child.nodeValue.length;
+			}
+			if (right && right.type == 3) {
+				child = right[0];
+				offset = 0;
+			}
+			if (!child) {
+				return;
+			}
+			if (isStart) {
+				self.setStart(child, offset);
+			} else {
+				self.setEnd(child, offset);
+			}
+		}
+		downPos(self.startContainer, self.startOffset, true);
+		downPos(self.endContainer, self.endOffset, false);
+		return self;
+	},
+	up : function() {
+		var self = this;
+		function upPos(node, pos, isStart) {
+			if (node.nodeType != 3) {
+				return;
+			}
+			if (pos === 0) {
+				if (isStart) {
+					self.setStartBefore(node);
+				} else {
+					self.setEndBefore(node);
+				}
+			} else if (pos == node.nodeValue.length) {
+				if (isStart) {
+					self.setStartAfter(node);
+				} else {
+					self.setEndAfter(node);
+				}
+			}
+		}
+		upPos(self.startContainer, self.startOffset, true);
+		upPos(self.endContainer, self.endOffset, false);
+		return self;
+	},
+	enlarge : function(toBlock) {
+		var self = this;
+		self.up();
+		function enlargePos(node, pos, isStart) {
+			var knode = K(node), parent;
+			if (knode.type == 3 || _NOSPLIT_TAG_MAP[knode.name] || !toBlock && knode.isBlock()) {
+				return;
+			}
+			if (pos === 0) {
+				while (!knode.prev()) {
+					parent = knode.parent();
+					if (!parent || _NOSPLIT_TAG_MAP[parent.name] || !toBlock && parent.isBlock()) {
+						break;
+					}
+					knode = parent;
+				}
+				if (isStart) {
+					self.setStartBefore(knode[0]);
+				} else {
+					self.setEndBefore(knode[0]);
+				}
+			} else if (pos == knode.children().length) {
+				while (!knode.next()) {
+					parent = knode.parent();
+					if (!parent || _NOSPLIT_TAG_MAP[parent.name] || !toBlock && parent.isBlock()) {
+						break;
+					}
+					knode = parent;
+				}
+				if (isStart) {
+					self.setStartAfter(knode[0]);
+				} else {
+					self.setEndAfter(knode[0]);
+				}
+			}
+		}
+		enlargePos(self.startContainer, self.startOffset, true);
+		enlargePos(self.endContainer, self.endOffset, false);
+		return self;
+	},
+	shrink : function() {
+		var self = this, child, collapsed = self.collapsed;
+		while (self.startContainer.nodeType == 1 && (child = self.startContainer.childNodes[self.startOffset]) && child.nodeType == 1 && !K(child).isSingle()) {
+			self.setStart(child, 0);
+		}
+		if (collapsed) {
+			return self.collapse(collapsed);
+		}
+		while (self.endContainer.nodeType == 1 && self.endOffset > 0 && (child = self.endContainer.childNodes[self.endOffset - 1]) && child.nodeType == 1 && !K(child).isSingle()) {
+			self.setEnd(child, child.childNodes.length);
+		}
+		return self;
+	},
+	createBookmark : function(serialize) {
+		var self = this, doc = self.doc, endNode,
+			startNode = K('<span style="display:none;"></span>', doc)[0];
+		startNode.id = '__kindeditor_bookmark_start_' + (_BOOKMARK_ID++) + '__';
+		if (!self.collapsed) {
+			endNode = startNode.cloneNode(true);
+			endNode.id = '__kindeditor_bookmark_end_' + (_BOOKMARK_ID++) + '__';
+		}
+		if (endNode) {
+			self.cloneRange().collapse(false).insertNode(endNode).setEndBefore(endNode);
+		}
+		self.insertNode(startNode).setStartAfter(startNode);
+		return {
+			start : serialize ? '#' + startNode.id : startNode,
+			end : endNode ? (serialize ? '#' + endNode.id : endNode) : null
+		};
+	},
+	moveToBookmark : function(bookmark) {
+		var self = this, doc = self.doc,
+			start = K(bookmark.start, doc), end = bookmark.end ? K(bookmark.end, doc) : null;
+		if (!start || start.length < 1) {
+			return self;
+		}
+		self.setStartBefore(start[0]);
+		start.remove();
+		if (end && end.length > 0) {
+			self.setEndBefore(end[0]);
+			end.remove();
+		} else {
+			self.collapse(true);
+		}
+		return self;
+	},
+	dump : function() {
+		console.log('--------------------');
+		console.log(this.startContainer.nodeType == 3 ? this.startContainer.nodeValue : this.startContainer, this.startOffset);
+		console.log(this.endContainer.nodeType == 3 ? this.endContainer.nodeValue : this.endContainer, this.endOffset);
+	}
+});
+function _range(mixed) {
+	if (!mixed.nodeName) {
+		return mixed.constructor === KRange ? mixed : _toRange(mixed);
+	}
+	return new KRange(mixed);
+}
+K.RangeClass = KRange;
+K.range = _range;
+K.START_TO_START = _START_TO_START;
+K.START_TO_END = _START_TO_END;
+K.END_TO_END = _END_TO_END;
+K.END_TO_START = _END_TO_START;
+function _nativeCommand(doc, key, val) {
+	try {
+		doc.execCommand(key, false, val);
+	} catch(e) {}
+}
+function _nativeCommandValue(doc, key) {
+	var val = '';
+	try {
+		val = doc.queryCommandValue(key);
+	} catch (e) {}
+	if (typeof val !== 'string') {
+		val = '';
+	}
+	return val;
+}
+function _getSel(doc) {
+	var win = _getWin(doc);
+	return doc.selection || win.getSelection();
+}
+function _getRng(doc) {
+	var sel = _getSel(doc), rng;
+	try {
+		if (sel.rangeCount > 0) {
+			rng = sel.getRangeAt(0);
+		} else {
+			rng = sel.createRange();
+		}
+	} catch(e) {}
+	if (_IE && (!rng || (!rng.item && rng.parentElement().ownerDocument !== doc))) {
+		return null;
+	}
+	return rng;
+}
+function _singleKeyMap(map) {
+	var newMap = {}, arr, v;
+	_each(map, function(key, val) {
+		arr = key.split(',');
+		for (var i = 0, len = arr.length; i < len; i++) {
+			v = arr[i];
+			newMap[v] = val;
+		}
+	});
+	return newMap;
+}
+function _hasAttrOrCss(knode, map) {
+	return _hasAttrOrCssByKey(knode, map, '*') || _hasAttrOrCssByKey(knode, map);
+}
+function _hasAttrOrCssByKey(knode, map, mapKey) {
+	mapKey = mapKey || knode.name;
+	if (knode.type !== 1) {
+		return false;
+	}
+	var newMap = _singleKeyMap(map);
+	if (!newMap[mapKey]) {
+		return false;
+	}
+	var arr = newMap[mapKey].split(',');
+	for (var i = 0, len = arr.length; i < len; i++) {
+		var key = arr[i];
+		if (key === '*') {
+			return true;
+		}
+		var match = /^(\.?)([^=]+)(?:=([^=]*))?$/.exec(key);
+		var method = match[1] ? 'css' : 'attr';
+		key = match[2];
+		var val = match[3] || '';
+		if (val === '' && knode[method](key) !== '') {
+			return true;
+		}
+		if (val !== '' && knode[method](key) === val) {
+			return true;
+		}
+	}
+	return false;
+}
+function _removeAttrOrCss(knode, map) {
+	if (knode.type != 1) {
+		return;
+	}
+	_removeAttrOrCssByKey(knode, map, '*');
+	_removeAttrOrCssByKey(knode, map);
+}
+function _removeAttrOrCssByKey(knode, map, mapKey) {
+	mapKey = mapKey || knode.name;
+	if (knode.type !== 1) {
+		return;
+	}
+	var newMap = _singleKeyMap(map);
+	if (!newMap[mapKey]) {
+		return;
+	}
+	var arr = newMap[mapKey].split(','), allFlag = false;
+	for (var i = 0, len = arr.length; i < len; i++) {
+		var key = arr[i];
+		if (key === '*') {
+			allFlag = true;
+			break;
+		}
+		var match = /^(\.?)([^=]+)(?:=([^=]*))?$/.exec(key);
+		key = match[2];
+		if (match[1]) {
+			key = _toCamel(key);
+			if (knode[0].style[key]) {
+				knode[0].style[key] = '';
+			}
+		} else {
+			knode.removeAttr(key);
+		}
+	}
+	if (allFlag) {
+		knode.remove(true);
+	}
+}
+function _getInnerNode(knode) {
+	var inner = knode;
+	while (inner.first()) {
+		inner = inner.first();
+	}
+	return inner;
+}
+function _isEmptyNode(knode) {
+	if (knode.type != 1 || knode.isSingle()) {
+		return false;
+	}
+	return knode.html().replace(/<[^>]+>/g, '') === '';
+}
+function _mergeWrapper(a, b) {
+	a = a.clone(true);
+	var lastA = _getInnerNode(a), childA = a, merged = false;
+	while (b) {
+		while (childA) {
+			if (childA.name === b.name) {
+				_mergeAttrs(childA, b.attr(), b.css());
+				merged = true;
+			}
+			childA = childA.first();
+		}
+		if (!merged) {
+			lastA.append(b.clone(false));
+		}
+		merged = false;
+		b = b.first();
+	}
+	return a;
+}
+function _wrapNode(knode, wrapper) {
+	wrapper = wrapper.clone(true);
+	if (knode.type == 3) {
+		_getInnerNode(wrapper).append(knode.clone(false));
+		knode.replaceWith(wrapper);
+		return wrapper;
+	}
+	var nodeWrapper = knode, child;
+	while ((child = knode.first()) && child.children().length == 1) {
+		knode = child;
+	}
+	child = knode.first();
+	var frag = knode.doc.createDocumentFragment();
+	while (child) {
+		frag.appendChild(child[0]);
+		child = child.next();
+	}
+	wrapper = _mergeWrapper(nodeWrapper, wrapper);
+	if (frag.firstChild) {
+		_getInnerNode(wrapper).append(frag);
+	}
+	nodeWrapper.replaceWith(wrapper);
+	return wrapper;
+}
+function _mergeAttrs(knode, attrs, styles) {
+	_each(attrs, function(key, val) {
+		if (key !== 'style') {
+			knode.attr(key, val);
+		}
+	});
+	_each(styles, function(key, val) {
+		knode.css(key, val);
+	});
+}
+function _inPreElement(knode) {
+	while (knode && knode.name != 'body') {
+		if (_PRE_TAG_MAP[knode.name] || knode.name == 'div' && knode.hasClass('ke-script')) {
+			return true;
+		}
+		knode = knode.parent();
+	}
+	return false;
+}
+function KCmd(range) {
+	this.init(range);
+}
+_extend(KCmd, {
+	init : function(range) {
+		var self = this, doc = range.doc;
+		self.doc = doc;
+		self.win = _getWin(doc);
+		self.sel = _getSel(doc);
+		self.range = range;
+	},
+	selection : function(forceReset) {
+		var self = this, doc = self.doc, rng = _getRng(doc);
+		self.sel = _getSel(doc);
+		if (rng) {
+			self.range = _range(rng);
+			if (K(self.range.startContainer).name == 'html') {
+				self.range.selectNodeContents(doc.body).collapse(false);
+			}
+			return self;
+		}
+		if (forceReset) {
+			self.range.selectNodeContents(doc.body).collapse(false);
+		}
+		return self;
+	},
+	select : function(hasDummy) {
+		hasDummy = _undef(hasDummy, true);
+		var self = this, sel = self.sel, range = self.range.cloneRange().shrink(),
+			sc = range.startContainer, so = range.startOffset,
+			ec = range.endContainer, eo = range.endOffset,
+			doc = _getDoc(sc), win = self.win, rng, hasU200b = false;
+		if (hasDummy && sc.nodeType == 1 && range.collapsed) {
+			if (_IE) {
+				var dummy = K('<span>&nbsp;</span>', doc);
+				range.insertNode(dummy[0]);
+				rng = doc.body.createTextRange();
+				try {
+					rng.moveToElementText(dummy[0]);
+				} catch(ex) {}
+				rng.collapse(false);
+				rng.select();
+				dummy.remove();
+				win.focus();
+				return self;
+			}
+			if (_WEBKIT) {
+				var children = sc.childNodes;
+				if (K(sc).isInline() || so > 0 && K(children[so - 1]).isInline() || children[so] && K(children[so]).isInline()) {
+					range.insertNode(doc.createTextNode('\u200B'));
+					hasU200b = true;
+				}
+			}
+		}
+		if (_IE) {
+			try {
+				rng = range.get(true);
+				rng.select();
+			} catch(e) {}
+		} else {
+			if (hasU200b) {
+				range.collapse(false);
+			}
+			rng = range.get(true);
+			sel.removeAllRanges();
+			sel.addRange(rng);
+			if (doc !== document) {
+				var pos = K(rng.endContainer).pos();
+				win.scrollTo(pos.x, pos.y);
+			}
+		}
+		win.focus();
+		return self;
+	},
+	wrap : function(val) {
+		var self = this, doc = self.doc, range = self.range, wrapper;
+		wrapper = K(val, doc);
+		if (range.collapsed) {
+			range.shrink();
+			range.insertNode(wrapper[0]).selectNodeContents(wrapper[0]);
+			return self;
+		}
+		if (wrapper.isBlock()) {
+			var copyWrapper = wrapper.clone(true), child = copyWrapper;
+			while (child.first()) {
+				child = child.first();
+			}
+			child.append(range.extractContents());
+			range.insertNode(copyWrapper[0]).selectNode(copyWrapper[0]);
+			return self;
+		}
+		range.enlarge();
+		var bookmark = range.createBookmark(), ancestor = range.commonAncestor(), isStart = false;
+		K(ancestor).scan(function(node) {
+			if (!isStart && node == bookmark.start) {
+				isStart = true;
+				return;
+			}
+			if (isStart) {
+				if (node == bookmark.end) {
+					return false;
+				}
+				var knode = K(node);
+				if (_inPreElement(knode)) {
+					return;
+				}
+				if (knode.type == 3 && _trim(node.nodeValue).length > 0) {
+					var parent;
+					while ((parent = knode.parent()) && parent.isStyle() && parent.children().length == 1) {
+						knode = parent;
+					}
+					_wrapNode(knode, wrapper);
+				}
+			}
+		});
+		range.moveToBookmark(bookmark);
+		return self;
+	},
+	split : function(isStart, map) {
+		var range = this.range, doc = range.doc;
+		var tempRange = range.cloneRange().collapse(isStart);
+		var node = tempRange.startContainer, pos = tempRange.startOffset,
+			parent = node.nodeType == 3 ? node.parentNode : node,
+			needSplit = false, knode;
+		while (parent && parent.parentNode) {
+			knode = K(parent);
+			if (map) {
+				if (!knode.isStyle()) {
+					break;
+				}
+				if (!_hasAttrOrCss(knode, map)) {
+					break;
+				}
+			} else {
+				if (_NOSPLIT_TAG_MAP[knode.name]) {
+					break;
+				}
+			}
+			needSplit = true;
+			parent = parent.parentNode;
+		}
+		if (needSplit) {
+			var dummy = doc.createElement('span');
+			range.cloneRange().collapse(!isStart).insertNode(dummy);
+			if (isStart) {
+				tempRange.setStartBefore(parent.firstChild).setEnd(node, pos);
+			} else {
+				tempRange.setStart(node, pos).setEndAfter(parent.lastChild);
+			}
+			var frag = tempRange.extractContents(),
+				first = frag.firstChild, last = frag.lastChild;
+			if (isStart) {
+				tempRange.insertNode(frag);
+				range.setStartAfter(last).setEndBefore(dummy);
+			} else {
+				parent.appendChild(frag);
+				range.setStartBefore(dummy).setEndBefore(first);
+			}
+			var dummyParent = dummy.parentNode;
+			if (dummyParent == range.endContainer) {
+				var prev = K(dummy).prev(), next = K(dummy).next();
+				if (prev && next && prev.type == 3 && next.type == 3) {
+					range.setEnd(prev[0], prev[0].nodeValue.length);
+				} else if (!isStart) {
+					range.setEnd(range.endContainer, range.endOffset - 1);
+				}
+			}
+			dummyParent.removeChild(dummy);
+		}
+		return this;
+	},
+	remove : function(map) {
+		var self = this, doc = self.doc, range = self.range;
+		range.enlarge();
+		if (range.startOffset === 0) {
+			var ksc = K(range.startContainer), parent;
+			while ((parent = ksc.parent()) && parent.isStyle() && parent.children().length == 1) {
+				ksc = parent;
+			}
+			range.setStart(ksc[0], 0);
+			ksc = K(range.startContainer);
+			if (ksc.isBlock()) {
+				_removeAttrOrCss(ksc, map);
+			}
+			var kscp = ksc.parent();
+			if (kscp && kscp.isBlock()) {
+				_removeAttrOrCss(kscp, map);
+			}
+		}
+		var sc, so;
+		if (range.collapsed) {
+			self.split(true, map);
+			sc = range.startContainer;
+			so = range.startOffset;
+			if (so > 0) {
+				var sb = K(sc.childNodes[so - 1]);
+				if (sb && _isEmptyNode(sb)) {
+					sb.remove();
+					range.setStart(sc, so - 1);
+				}
+			}
+			var sa = K(sc.childNodes[so]);
+			if (sa && _isEmptyNode(sa)) {
+				sa.remove();
+			}
+			if (_isEmptyNode(sc)) {
+				range.startBefore(sc);
+				sc.remove();
+			}
+			range.collapse(true);
+			return self;
+		}
+		self.split(true, map);
+		self.split(false, map);
+		var startDummy = doc.createElement('span'), endDummy = doc.createElement('span');
+		range.cloneRange().collapse(false).insertNode(endDummy);
+		range.cloneRange().collapse(true).insertNode(startDummy);
+		var nodeList = [], cmpStart = false;
+		K(range.commonAncestor()).scan(function(node) {
+			if (!cmpStart && node == startDummy) {
+				cmpStart = true;
+				return;
+			}
+			if (node == endDummy) {
+				return false;
+			}
+			if (cmpStart) {
+				nodeList.push(node);
+			}
+		});
+		K(startDummy).remove();
+		K(endDummy).remove();
+		sc = range.startContainer;
+		so = range.startOffset;
+		var ec = range.endContainer, eo = range.endOffset;
+		if (so > 0) {
+			var startBefore = K(sc.childNodes[so - 1]);
+			if (startBefore && _isEmptyNode(startBefore)) {
+				startBefore.remove();
+				range.setStart(sc, so - 1);
+				if (sc == ec) {
+					range.setEnd(ec, eo - 1);
+				}
+			}
+			var startAfter = K(sc.childNodes[so]);
+			if (startAfter && _isEmptyNode(startAfter)) {
+				startAfter.remove();
+				if (sc == ec) {
+					range.setEnd(ec, eo - 1);
+				}
+			}
+		}
+		var endAfter = K(ec.childNodes[range.endOffset]);
+		if (endAfter && _isEmptyNode(endAfter)) {
+			endAfter.remove();
+		}
+		var bookmark = range.createBookmark(true);
+		_each(nodeList, function(i, node) {
+			_removeAttrOrCss(K(node), map);
+		});
+		range.moveToBookmark(bookmark);
+		return self;
+	},
+	commonNode : function(map) {
+		var range = this.range;
+		var ec = range.endContainer, eo = range.endOffset,
+			node = (ec.nodeType == 3 || eo === 0) ? ec : ec.childNodes[eo - 1];
+		function find(node) {
+			var child = node, parent = node;
+			while (parent) {
+				if (_hasAttrOrCss(K(parent), map)) {
+					return K(parent);
+				}
+				parent = parent.parentNode;
+			}
+			while (child && (child = child.lastChild)) {
+				if (_hasAttrOrCss(K(child), map)) {
+					return K(child);
+				}
+			}
+			return null;
+		}
+		var cNode = find(node);
+		if (cNode) {
+			return cNode;
+		}
+		if (node.nodeType == 1 || (ec.nodeType == 3 && eo === 0)) {
+			var prev = K(node).prev();
+			if (prev) {
+				return find(prev);
+			}
+		}
+		return null;
+	},
+	commonAncestor : function(tagName) {
+		var range = this.range,
+			sc = range.startContainer, so = range.startOffset,
+			ec = range.endContainer, eo = range.endOffset,
+			startNode = (sc.nodeType == 3 || so === 0) ? sc : sc.childNodes[so - 1],
+			endNode = (ec.nodeType == 3 || eo === 0) ? ec : ec.childNodes[eo - 1];
+		function find(node) {
+			while (node) {
+				if (node.nodeType == 1) {
+					if (node.tagName.toLowerCase() === tagName) {
+						return node;
+					}
+				}
+				node = node.parentNode;
+			}
+			return null;
+		}
+		var start = find(startNode), end = find(endNode);
+		if (start && end && start === end) {
+			return K(start);
+		}
+		return null;
+	},
+	state : function(key) {
+		var self = this, doc = self.doc, bool = false;
+		try {
+			bool = doc.queryCommandState(key);
+		} catch (e) {}
+		return bool;
+	},
+	val : function(key) {
+		var self = this, doc = self.doc, range = self.range;
+		function lc(val) {
+			return val.toLowerCase();
+		}
+		key = lc(key);
+		var val = '', knode;
+		if (key === 'fontfamily' || key === 'fontname') {
+			val = _nativeCommandValue(doc, 'fontname');
+			val = val.replace(/['"]/g, '');
+			return lc(val);
+		}
+		if (key === 'formatblock') {
+			val = _nativeCommandValue(doc, key);
+			if (val === '') {
+				knode = self.commonNode({'h1,h2,h3,h4,h5,h6,p,div,pre,address' : '*'});
+				if (knode) {
+					val = knode.name;
+				}
+			}
+			if (val === 'Normal') {
+				val = 'p';
+			}
+			return lc(val);
+		}
+		if (key === 'fontsize') {
+			knode = self.commonNode({'*' : '.font-size'});
+			if (knode) {
+				val = knode.css('font-size');
+			}
+			return lc(val);
+		}
+		if (key === 'forecolor') {
+			knode = self.commonNode({'*' : '.color'});
+			if (knode) {
+				val = knode.css('color');
+			}
+			val = _toHex(val);
+			if (val === '') {
+				val = 'default';
+			}
+			return lc(val);
+		}
+		if (key === 'hilitecolor') {
+			knode = self.commonNode({'*' : '.background-color'});
+			if (knode) {
+				val = knode.css('background-color');
+			}
+			val = _toHex(val);
+			if (val === '') {
+				val = 'default';
+			}
+			return lc(val);
+		}
+		return val;
+	},
+	toggle : function(wrapper, map) {
+		var self = this;
+		if (self.commonNode(map)) {
+			self.remove(map);
+		} else {
+			self.wrap(wrapper);
+		}
+		return self.select();
+	},
+	bold : function() {
+		return this.toggle('<strong></strong>', {
+			span : '.font-weight=bold',
+			strong : '*',
+			b : '*'
+		});
+	},
+	italic : function() {
+		return this.toggle('<em></em>', {
+			span : '.font-style=italic',
+			em : '*',
+			i : '*'
+		});
+	},
+	underline : function() {
+		return this.toggle('<u></u>', {
+			span : '.text-decoration=underline',
+			u : '*'
+		});
+	},
+	strikethrough : function() {
+		return this.toggle('<s></s>', {
+			span : '.text-decoration=line-through',
+			s : '*'
+		});
+	},
+	forecolor : function(val) {
+		return this.toggle('<span style="color:' + val + ';"></span>', {
+			span : '.color=' + val,
+			font : 'color'
+		});
+	},
+	hilitecolor : function(val) {
+		return this.toggle('<span style="background-color:' + val + ';"></span>', {
+			span : '.background-color=' + val
+		});
+	},
+	fontsize : function(val) {
+		return this.toggle('<span style="font-size:' + val + ';"></span>', {
+			span : '.font-size=' + val,
+			font : 'size'
+		});
+	},
+	fontname : function(val) {
+		return this.fontfamily(val);
+	},
+	fontfamily : function(val) {
+		return this.toggle('<span style="font-family:' + val + ';"></span>', {
+			span : '.font-family=' + val,
+			font : 'face'
+		});
+	},
+	removeformat : function() {
+		var map = {
+			'*' : '.font-weight,.font-style,.text-decoration,.color,.background-color,.font-size,.font-family,.text-indent'
+		},
+		tags = _STYLE_TAG_MAP;
+		_each(tags, function(key, val) {
+			map[key] = '*';
+		});
+		this.remove(map);
+		return this.select();
+	},
+	inserthtml : function(val, quickMode) {
+		var self = this, range = self.range;
+		if (val === '') {
+			return self;
+		}
+		function pasteHtml(range, val) {
+			val = '<img id="__kindeditor_temp_tag__" width="0" height="0" style="display:none;" />' + val;
+			var rng = range.get();
+			if (rng.item) {
+				rng.item(0).outerHTML = val;
+			} else {
+				rng.pasteHTML(val);
+			}
+			var temp = range.doc.getElementById('__kindeditor_temp_tag__');
+			temp.parentNode.removeChild(temp);
+			var newRange = _toRange(rng);
+			range.setEnd(newRange.endContainer, newRange.endOffset);
+			range.collapse(false);
+			self.select(false);
+		}
+		function insertHtml(range, val) {
+			var doc = range.doc,
+				frag = doc.createDocumentFragment();
+			K('@' + val, doc).each(function() {
+				frag.appendChild(this);
+			});
+			range.deleteContents();
+			range.insertNode(frag);
+			range.collapse(false);
+			self.select(false);
+		}
+		if (_IE && quickMode) {
+			try {
+				pasteHtml(range, val);
+			} catch(e) {
+				insertHtml(range, val);
+			}
+			return self;
+		}
+		insertHtml(range, val);
+		return self;
+	},
+	hr : function() {
+		return this.inserthtml('<hr />');
+	},
+	print : function() {
+		this.win.print();
+		return this;
+	},
+	insertimage : function(url, title, width, height, border, align) {
+		title = _undef(title, '');
+		border = _undef(border, 0);
+		var html = '<img src="' + _escape(url) + '" data-ke-src="' + _escape(url) + '" ';
+		if (width) {
+			html += 'width="' + _escape(width) + '" ';
+		}
+		if (height) {
+			html += 'height="' + _escape(height) + '" ';
+		}
+		if (title) {
+			html += 'title="' + _escape(title) + '" ';
+		}
+		if (align) {
+			html += 'align="' + _escape(align) + '" ';
+		}
+		html += 'alt="' + _escape(title) + '" ';
+		html += '/>';
+		return this.inserthtml(html);
+	},
+	createlink : function(url, type) {
+		var self = this, doc = self.doc, range = self.range;
+		self.select();
+		var a = self.commonNode({ a : '*' });
+		if (a && !range.isControl()) {
+			range.selectNode(a.get());
+			self.select();
+		}
+		var html = '<a href="' + _escape(url) + '" data-ke-src="' + _escape(url) + '" ';
+		if (type) {
+			html += ' target="' + _escape(type) + '"';
+		}
+		if (range.collapsed) {
+			html += '>' + _escape(url) + '</a>';
+			return self.inserthtml(html);
+		}
+		if (range.isControl()) {
+			var node = K(range.startContainer.childNodes[range.startOffset]);
+			html += '></a>';
+			node.after(K(html, doc));
+			node.next().append(node);
+			range.selectNode(node[0]);
+			return self.select();
+		}
+		_nativeCommand(doc, 'createlink', '__kindeditor_temp_url__');
+		K('a[href="__kindeditor_temp_url__"]', doc).each(function() {
+			K(this).attr('href', url).attr('data-ke-src', url);
+			if (type) {
+				K(this).attr('target', type);
+			} else {
+				K(this).removeAttr('target');
+			}
+		});
+		return self;
+	},
+	unlink : function() {
+		var self = this, doc = self.doc, range = self.range;
+		self.select();
+		if (range.collapsed) {
+			var a = self.commonNode({ a : '*' });
+			if (a) {
+				range.selectNode(a.get());
+				self.select();
+			}
+			_nativeCommand(doc, 'unlink', null);
+			if (_WEBKIT && K(range.startContainer).name === 'img') {
+				var parent = K(range.startContainer).parent();
+				if (parent.name === 'a') {
+					parent.remove(true);
+				}
+			}
+		} else {
+			_nativeCommand(doc, 'unlink', null);
+		}
+		return self;
+	}
+});
+_each(('formatblock,selectall,justifyleft,justifycenter,justifyright,justifyfull,insertorderedlist,' +
+	'insertunorderedlist,indent,outdent,subscript,superscript').split(','), function(i, name) {
+	KCmd.prototype[name] = function(val) {
+		var self = this;
+		self.select();
+		_nativeCommand(self.doc, name, val);
+		if (!_IE || _inArray(name, 'formatblock,selectall,insertorderedlist,insertunorderedlist'.split(',')) >= 0) {
+			self.selection();
+		}
+		return self;
+	};
+});
+_each('cut,copy,paste'.split(','), function(i, name) {
+	KCmd.prototype[name] = function() {
+		var self = this;
+		if (!self.doc.queryCommandSupported(name)) {
+			throw 'not supported';
+		}
+		self.select();
+		_nativeCommand(self.doc, name, null);
+		return self;
+	};
+});
+function _cmd(mixed) {
+	if (mixed.nodeName) {
+		var doc = _getDoc(mixed);
+		mixed = _range(doc).selectNodeContents(doc.body).collapse(false);
+	}
+	return new KCmd(mixed);
+}
+K.CmdClass = KCmd;
+K.cmd = _cmd;
+function _drag(options) {
+	var moveEl = options.moveEl,
+		moveFn = options.moveFn,
+		clickEl = options.clickEl || moveEl,
+		beforeDrag = options.beforeDrag,
+		iframeFix = options.iframeFix === undefined ? true : options.iframeFix;
+	var docs = [document];
+	if (iframeFix) {
+		K('iframe').each(function() {
+			var src = _formatUrl(this.src || '', 'absolute');
+			if (/^https?:\/\//.test(src)) {
+				return;
+			}
+			var doc;
+			try {
+				doc = _iframeDoc(this);
+			} catch(e) {}
+			if (doc) {
+				var pos = K(this).pos();
+				K(doc).data('pos-x', pos.x);
+				K(doc).data('pos-y', pos.y);
+				docs.push(doc);
+			}
+		});
+	}
+	clickEl.mousedown(function(e) {
+		e.stopPropagation();
+		var self = clickEl.get(),
+			x = _removeUnit(moveEl.css('left')),
+			y = _removeUnit(moveEl.css('top')),
+			width = moveEl.width(),
+			height = moveEl.height(),
+			pageX = e.pageX,
+			pageY = e.pageY;
+		if (beforeDrag) {
+			beforeDrag();
+		}
+		function moveListener(e) {
+			e.preventDefault();
+			var kdoc = K(_getDoc(e.target));
+			var diffX = _round((kdoc.data('pos-x') || 0) + e.pageX - pageX);
+			var diffY = _round((kdoc.data('pos-y') || 0) + e.pageY - pageY);
+			moveFn.call(clickEl, x, y, width, height, diffX, diffY);
+		}
+		function selectListener(e) {
+			e.preventDefault();
+		}
+		function upListener(e) {
+			e.preventDefault();
+			K(docs).unbind('mousemove', moveListener)
+				.unbind('mouseup', upListener)
+				.unbind('selectstart', selectListener);
+			if (self.releaseCapture) {
+				self.releaseCapture();
+			}
+		}
+		K(docs).mousemove(moveListener)
+			.mouseup(upListener)
+			.bind('selectstart', selectListener);
+		if (self.setCapture) {
+			self.setCapture();
+		}
+	});
+}
+function KWidget(options) {
+	this.init(options);
+}
+_extend(KWidget, {
+	init : function(options) {
+		var self = this;
+		self.name = options.name || '';
+		self.doc = options.doc || document;
+		self.win = _getWin(self.doc);
+		self.x = _addUnit(options.x);
+		self.y = _addUnit(options.y);
+		self.z = options.z;
+		self.width = _addUnit(options.width);
+		self.height = _addUnit(options.height);
+		self.div = K('<div style="display:block;"></div>');
+		self.options = options;
+		self._alignEl = options.alignEl;
+		if (self.width) {
+			self.div.css('width', self.width);
+		}
+		if (self.height) {
+			self.div.css('height', self.height);
+		}
+		if (self.z) {
+			self.div.css({
+				position : 'absolute',
+				left : self.x,
+				top : self.y,
+				'z-index' : self.z
+			});
+		}
+		if (self.z && (self.x === undefined || self.y === undefined)) {
+			self.autoPos(self.width, self.height);
+		}
+		if (options.cls) {
+			self.div.addClass(options.cls);
+		}
+		if (options.shadowMode) {
+			self.div.addClass('ke-shadow');
+		}
+		if (options.css) {
+			self.div.css(options.css);
+		}
+		if (options.src) {
+			K(options.src).replaceWith(self.div);
+		} else {
+			K(self.doc.body).append(self.div);
+		}
+		if (options.html) {
+			self.div.html(options.html);
+		}
+		if (options.autoScroll) {
+			if (_IE && _V < 7 || _QUIRKS) {
+				var scrollPos = _getScrollPos();
+				K(self.win).bind('scroll', function(e) {
+					var pos = _getScrollPos(),
+						diffX = pos.x - scrollPos.x,
+						diffY = pos.y - scrollPos.y;
+					self.pos(_removeUnit(self.x) + diffX, _removeUnit(self.y) + diffY, false);
+				});
+			} else {
+				self.div.css('position', 'fixed');
+			}
+		}
+	},
+	pos : function(x, y, updateProp) {
+		var self = this;
+		updateProp = _undef(updateProp, true);
+		if (x !== null) {
+			x = x < 0 ? 0 : _addUnit(x);
+			self.div.css('left', x);
+			if (updateProp) {
+				self.x = x;
+			}
+		}
+		if (y !== null) {
+			y = y < 0 ? 0 : _addUnit(y);
+			self.div.css('top', y);
+			if (updateProp) {
+				self.y = y;
+			}
+		}
+		return self;
+	},
+	autoPos : function(width, height) {
+		var self = this,
+			w = _removeUnit(width) || 0,
+			h = _removeUnit(height) || 0,
+			scrollPos = _getScrollPos();
+		if (self._alignEl) {
+			var knode = K(self._alignEl),
+				pos = knode.pos(),
+				diffX = _round(knode[0].clientWidth / 2 - w / 2),
+				diffY = _round(knode[0].clientHeight / 2 - h / 2);
+			x = diffX < 0 ? pos.x : pos.x + diffX;
+			y = diffY < 0 ? pos.y : pos.y + diffY;
+		} else {
+			var docEl = _docElement(self.doc);
+			x = _round(scrollPos.x + (docEl.clientWidth - w) / 2);
+			y = _round(scrollPos.y + (docEl.clientHeight - h) / 2);
+		}
+		if (!(_IE && _V < 7 || _QUIRKS)) {
+			x -= scrollPos.x;
+			y -= scrollPos.y;
+		}
+		return self.pos(x, y);
+	},
+	remove : function() {
+		var self = this;
+		if (_IE && _V < 7 || _QUIRKS) {
+			K(self.win).unbind('scroll');
+		}
+		self.div.remove();
+		_each(self, function(i) {
+			self[i] = null;
+		});
+		return this;
+	},
+	show : function() {
+		this.div.show();
+		return this;
+	},
+	hide : function() {
+		this.div.hide();
+		return this;
+	},
+	draggable : function(options) {
+		var self = this;
+		options = options || {};
+		options.moveEl = self.div;
+		options.moveFn = function(x, y, width, height, diffX, diffY) {
+			if ((x = x + diffX) < 0) {
+				x = 0;
+			}
+			if ((y = y + diffY) < 0) {
+				y = 0;
+			}
+			self.pos(x, y);
+		};
+		_drag(options);
+		return self;
+	}
+});
+function _widget(options) {
+	return new KWidget(options);
+}
+K.WidgetClass = KWidget;
+K.widget = _widget;
+function _iframeDoc(iframe) {
+	iframe = _get(iframe);
+	return iframe.contentDocument || iframe.contentWindow.document;
+}
+var html, _direction = '';
+if ((html = document.getElementsByTagName('html'))) {
+	_direction = html[0].dir;
+}
+function _getInitHtml(themesPath, bodyClass, cssPath, cssData) {
+	var arr = [
+		(_direction === '' ? '<html>' : '<html dir="' + _direction + '">'),
+		'<head><meta charset="utf-8" /><title></title>',
+		'<style>',
+		'html {margin:0;padding:0;}',
+		'body {margin:0;padding:5px;}',
+		'body, td {font:12px/1.5 "sans serif",tahoma,verdana,helvetica;}',
+		'body, p, div {word-wrap: break-word;}',
+		'p {margin:5px 0;}',
+		'table {border-collapse:collapse;}',
+		'img {border:0;}',
+		'noscript {display:none;}',
+		'table.ke-zeroborder td {border:1px dotted #AAA;}',
+		'img.ke-flash {',
+		'	border:1px solid #AAA;',
+		'	background-image:url(' + themesPath + 'common/flash.gif);',
+		'	background-position:center center;',
+		'	background-repeat:no-repeat;',
+		'	width:100px;',
+		'	height:100px;',
+		'}',
+		'img.ke-rm {',
+		'	border:1px solid #AAA;',
+		'	background-image:url(' + themesPath + 'common/rm.gif);',
+		'	background-position:center center;',
+		'	background-repeat:no-repeat;',
+		'	width:100px;',
+		'	height:100px;',
+		'}',
+		'img.ke-media {',
+		'	border:1px solid #AAA;',
+		'	background-image:url(' + themesPath + 'common/media.gif);',
+		'	background-position:center center;',
+		'	background-repeat:no-repeat;',
+		'	width:100px;',
+		'	height:100px;',
+		'}',
+		'img.ke-anchor {',
+		'	border:1px dashed #666;',
+		'	width:16px;',
+		'	height:16px;',
+		'}',
+		'.ke-script, .ke-noscript, .ke-display-none {',
+		'	display:none;',
+		'	font-size:0;',
+		'	width:0;',
+		'	height:0;',
+		'}',
+		'.ke-pagebreak {',
+		'	border:1px dotted #AAA;',
+		'	font-size:0;',
+		'	height:2px;',
+		'}',
+		'</style>'
+	];
+	if (!_isArray(cssPath)) {
+		cssPath = [cssPath];
+	}
+	_each(cssPath, function(i, path) {
+		if (path) {
+			arr.push('<link href="' + path + '" rel="stylesheet" />');
+		}
+	});
+	if (cssData) {
+		arr.push('<style>' + cssData + '</style>');
+	}
+	arr.push('</head><body ' + (bodyClass ? 'class="' + bodyClass + '"' : '') + '></body></html>');
+	return arr.join('\n');
+}
+function _elementVal(knode, val) {
+	if (knode.hasVal()) {
+		if (val === undefined) {
+			var html = knode.val();
+			html = html.replace(/(<(?:p|p\s[^>]*)>) *(<\/p>)/ig, '');
+			return html;
+		}
+		return knode.val(val);
+	}
+	return knode.html(val);
+}
+function KEdit(options) {
+	this.init(options);
+}
+_extend(KEdit, KWidget, {
+	init : function(options) {
+		var self = this;
+		KEdit.parent.init.call(self, options);
+		self.srcElement = K(options.srcElement);
+		self.div.addClass('ke-edit');
+		self.designMode = _undef(options.designMode, true);
+		self.beforeGetHtml = options.beforeGetHtml;
+		self.beforeSetHtml = options.beforeSetHtml;
+		self.afterSetHtml = options.afterSetHtml;
+		var themesPath = _undef(options.themesPath, ''),
+			bodyClass = options.bodyClass,
+			cssPath = options.cssPath,
+			cssData = options.cssData,
+			isDocumentDomain = location.host.replace(/:\d+/, '') !== document.domain,
+			srcScript = ('document.open();' +
+				(isDocumentDomain ? 'document.domain="' + document.domain + '";' : '') +
+				'document.close();'),
+			iframeSrc = _IE ? ' src="javascript:void(function(){' + encodeURIComponent(srcScript) + '}())"' : '';
+		self.iframe = K('<iframe class="ke-edit-iframe" hidefocus="true" frameborder="0"' + iframeSrc + '></iframe>').css('width', '100%');
+		self.textarea = K('<textarea class="ke-edit-textarea" hidefocus="true"></textarea>').css('width', '100%');
+		if (self.width) {
+			self.setWidth(self.width);
+		}
+		if (self.height) {
+			self.setHeight(self.height);
+		}
+		if (self.designMode) {
+			self.textarea.hide();
+		} else {
+			self.iframe.hide();
+		}
+		function ready() {
+			var doc = _iframeDoc(self.iframe);
+			doc.open();
+			if (isDocumentDomain) {
+				doc.domain = document.domain;
+			}
+			doc.write(_getInitHtml(themesPath, bodyClass, cssPath, cssData));
+			doc.close();
+			self.win = self.iframe[0].contentWindow;
+			self.doc = doc;
+			var cmd = _cmd(doc);
+			self.afterChange(function(e) {
+				cmd.selection();
+			});
+			if (_WEBKIT) {
+				K(doc).click(function(e) {
+					if (K(e.target).name === 'img') {
+						cmd.selection(true);
+						cmd.range.selectNode(e.target);
+						cmd.select();
+					}
+				});
+			}
+			if (_IE) {
+				self._mousedownHandler = function() {
+					var newRange = cmd.range.cloneRange();
+					newRange.shrink();
+					if (newRange.isControl()) {
+						self.blur();
+					}
+				};
+				K(document).mousedown(self._mousedownHandler);
+				K(doc).keydown(function(e) {
+					if (e.which == 8) {
+						cmd.selection();
+						var rng = cmd.range;
+						if (rng.isControl()) {
+							rng.collapse(true);
+							K(rng.startContainer.childNodes[rng.startOffset]).remove();
+							e.preventDefault();
+						}
+					}
+				});
+			}
+			self.cmd = cmd;
+			self.html(_elementVal(self.srcElement));
+			if (_IE) {
+				doc.body.disabled = true;
+				doc.body.contentEditable = true;
+				doc.body.removeAttribute('disabled');
+			} else {
+				doc.designMode = 'on';
+			}
+			if (options.afterCreate) {
+				options.afterCreate.call(self);
+			}
+		}
+		if (isDocumentDomain) {
+			self.iframe.bind('load', function(e) {
+				self.iframe.unbind('load');
+				if (_IE) {
+					ready();
+				} else {
+					setTimeout(ready, 0);
+				}
+			});
+		}
+		self.div.append(self.iframe);
+		self.div.append(self.textarea);
+		self.srcElement.hide();
+		!isDocumentDomain && ready();
+	},
+	setWidth : function(val) {
+		this.div.css('width', _addUnit(val));
+		return this;
+	},
+	setHeight : function(val) {
+		var self = this;
+		val = _addUnit(val);
+		self.div.css('height', val);
+		self.iframe.css('height', val);
+		if ((_IE && _V < 8) || _QUIRKS) {
+			val = _addUnit(_removeUnit(val) - 2);
+		}
+		self.textarea.css('height', val);
+		return self;
+	},
+	remove : function() {
+		var self = this, doc = self.doc;
+		K(doc.body).unbind();
+		K(doc).unbind();
+		K(self.win).unbind();
+		if (self._mousedownHandler) {
+			K(document).unbind('mousedown', self._mousedownHandler);
+		}
+		_elementVal(self.srcElement, self.html());
+		self.srcElement.show();
+		doc.write('');
+		self.iframe.unbind();
+		self.textarea.unbind();
+		KEdit.parent.remove.call(self);
+	},
+	html : function(val, isFull) {
+		var self = this, doc = self.doc;
+		if (self.designMode) {
+			var body = doc.body;
+			if (val === undefined) {
+				if (isFull) {
+					val = '<!doctype html><html>' + body.parentNode.innerHTML + '</html>';
+				} else {
+					val = body.innerHTML;
+				}
+				if (self.beforeGetHtml) {
+					val = self.beforeGetHtml(val);
+				}
+				if (_GECKO && val == '<br />') {
+					val = '';
+				}
+				return val;
+			}
+			if (self.beforeSetHtml) {
+				val = self.beforeSetHtml(val);
+			}
+			if (_IE && _V >= 9) {
+				val = val.replace(/(<.*?checked=")checked(".*>)/ig, '$1$2');
+			}
+			K(body).html(val);
+			if (self.afterSetHtml) {
+				self.afterSetHtml();
+			}
+			return self;
+		}
+		if (val === undefined) {
+			return self.textarea.val();
+		}
+		self.textarea.val(val);
+		return self;
+	},
+	design : function(bool) {
+		var self = this, val;
+		if (bool === undefined ? !self.designMode : bool) {
+			if (!self.designMode) {
+				val = self.html();
+				self.designMode = true;
+				self.html(val);
+				self.textarea.hide();
+				self.iframe.show();
+			}
+		} else {
+			if (self.designMode) {
+				val = self.html();
+				self.designMode = false;
+				self.html(val);
+				self.iframe.hide();
+				self.textarea.show();
+			}
+		}
+		return self.focus();
+	},
+	focus : function() {
+		var self = this;
+		self.designMode ? self.win.focus() : self.textarea[0].focus();
+		return self;
+	},
+	blur : function() {
+		var self = this;
+		if (_IE) {
+			var input = K('<input type="text" style="float:left;width:0;height:0;padding:0;margin:0;border:0;" value="" />', self.div);
+			self.div.append(input);
+			input[0].focus();
+			input.remove();
+		} else {
+			self.designMode ? self.win.blur() : self.textarea[0].blur();
+		}
+		return self;
+	},
+	afterChange : function(fn) {
+		var self = this, doc = self.doc, body = doc.body;
+		K(doc).keyup(function(e) {
+			if (!e.ctrlKey && !e.altKey && _CHANGE_KEY_MAP[e.which]) {
+				fn(e);
+			}
+		});
+		K(doc).mouseup(fn).contextmenu(fn);
+		K(self.win).blur(fn);
+		function timeoutHandler(e) {
+			setTimeout(function() {
+				fn(e);
+			}, 1);
+		}
+		K(body).bind('paste', timeoutHandler);
+		K(body).bind('cut', timeoutHandler);
+		return self;
+	}
+});
+function _edit(options) {
+	return new KEdit(options);
+}
+K.EditClass = KEdit;
+K.edit = _edit;
+K.iframeDoc = _iframeDoc;
+function _selectToolbar(name, fn) {
+	var self = this,
+		knode = self.get(name);
+	if (knode) {
+		if (knode.hasClass('ke-disabled')) {
+			return;
+		}
+		fn(knode);
+	}
+}
+function KToolbar(options) {
+	this.init(options);
+}
+_extend(KToolbar, KWidget, {
+	init : function(options) {
+		var self = this;
+		KToolbar.parent.init.call(self, options);
+		self.disableMode = _undef(options.disableMode, false);
+		self.noDisableItemMap = _toMap(_undef(options.noDisableItems, []));
+		self._itemMap = {};
+		self.div.addClass('ke-toolbar').bind('contextmenu,mousedown,mousemove', function(e) {
+			e.preventDefault();
+		}).attr('unselectable', 'on');
+		function find(target) {
+			var knode = K(target);
+			if (knode.hasClass('ke-outline')) {
+				return knode;
+			}
+			if (knode.hasClass('ke-toolbar-icon')) {
+				return knode.parent();
+			}
+		}
+		function hover(e, method) {
+			var knode = find(e.target);
+			if (knode) {
+				if (knode.hasClass('ke-disabled')) {
+					return;
+				}
+				if (knode.hasClass('ke-selected')) {
+					return;
+				}
+				knode[method]('ke-on');
+			}
+		}
+		self.div.mouseover(function(e) {
+			hover(e, 'addClass');
+		})
+		.mouseout(function(e) {
+			hover(e, 'removeClass');
+		})
+		.click(function(e) {
+			var knode = find(e.target);
+			if (knode) {
+				if (knode.hasClass('ke-disabled')) {
+					return;
+				}
+				self.options.click.call(this, e, knode.attr('data-name'));
+			}
+		});
+	},
+	get : function(name) {
+		if (this._itemMap[name]) {
+			return this._itemMap[name];
+		}
+		return (this._itemMap[name] = K('span.ke-icon-' + name, this.div).parent());
+	},
+	select : function(name) {
+		_selectToolbar.call(this, name, function(knode) {
+			knode.addClass('ke-selected');
+		});
+		return self;
+	},
+	unselect : function(name) {
+		_selectToolbar.call(this, name, function(knode) {
+			knode.removeClass('ke-selected').removeClass('ke-on');
+		});
+		return self;
+	},
+	enable : function(name) {
+		var self = this,
+			knode = name.get ? name : self.get(name);
+		if (knode) {
+			knode.removeClass('ke-disabled');
+			knode.opacity(1);
+		}
+		return self;
+	},
+	disable : function(name) {
+		var self = this,
+			knode = name.get ? name : self.get(name);
+		if (knode) {
+			knode.removeClass('ke-selected').addClass('ke-disabled');
+			knode.opacity(0.5);
+		}
+		return self;
+	},
+	disableAll : function(bool, noDisableItems) {
+		var self = this, map = self.noDisableItemMap, item;
+		if (noDisableItems) {
+			map = _toMap(noDisableItems);
+		}
+		if (bool === undefined ? !self.disableMode : bool) {
+			K('span.ke-outline', self.div).each(function() {
+				var knode = K(this),
+					name = knode[0].getAttribute('data-name', 2);
+				if (!map[name]) {
+					self.disable(knode);
+				}
+			});
+			self.disableMode = true;
+		} else {
+			K('span.ke-outline', self.div).each(function() {
+				var knode = K(this),
+					name = knode[0].getAttribute('data-name', 2);
+				if (!map[name]) {
+					self.enable(knode);
+				}
+			});
+			self.disableMode = false;
+		}
+		return self;
+	}
+});
+function _toolbar(options) {
+	return new KToolbar(options);
+}
+K.ToolbarClass = KToolbar;
+K.toolbar = _toolbar;
+function KMenu(options) {
+	this.init(options);
+}
+_extend(KMenu, KWidget, {
+	init : function(options) {
+		var self = this;
+		options.z = options.z || 811213;
+		KMenu.parent.init.call(self, options);
+		self.centerLineMode = _undef(options.centerLineMode, true);
+		self.div.addClass('ke-menu').bind('click,mousedown', function(e){
+			e.stopPropagation();
+		}).attr('unselectable', 'on');
+	},
+	addItem : function(item) {
+		var self = this;
+		if (item.title === '-') {
+			self.div.append(K('<div class="ke-menu-separator"></div>'));
+			return;
+		}
+		var itemDiv = K('<div class="ke-menu-item" unselectable="on"></div>'),
+			leftDiv = K('<div class="ke-inline-block ke-menu-item-left"></div>'),
+			rightDiv = K('<div class="ke-inline-block ke-menu-item-right"></div>'),
+			height = _addUnit(item.height),
+			iconClass = _undef(item.iconClass, '');
+		self.div.append(itemDiv);
+		if (height) {
+			itemDiv.css('height', height);
+			rightDiv.css('line-height', height);
+		}
+		var centerDiv;
+		if (self.centerLineMode) {
+			centerDiv = K('<div class="ke-inline-block ke-menu-item-center"></div>');
+			if (height) {
+				centerDiv.css('height', height);
+			}
+		}
+		itemDiv.mouseover(function(e) {
+			K(this).addClass('ke-menu-item-on');
+			if (centerDiv) {
+				centerDiv.addClass('ke-menu-item-center-on');
+			}
+		})
+		.mouseout(function(e) {
+			K(this).removeClass('ke-menu-item-on');
+			if (centerDiv) {
+				centerDiv.removeClass('ke-menu-item-center-on');
+			}
+		})
+		.click(function(e) {
+			item.click.call(K(this));
+			e.stopPropagation();
+		})
+		.append(leftDiv);
+		if (centerDiv) {
+			itemDiv.append(centerDiv);
+		}
+		itemDiv.append(rightDiv);
+		if (item.checked) {
+			iconClass = 'ke-icon-checked';
+		}
+		if (iconClass !== '') {
+			leftDiv.html('<span class="ke-inline-block ke-toolbar-icon ke-toolbar-icon-url ' + iconClass + '"></span>');
+		}
+		rightDiv.html(item.title);
+		return self;
+	},
+	remove : function() {
+		var self = this;
+		if (self.options.beforeRemove) {
+			self.options.beforeRemove.call(self);
+		}
+		K('.ke-menu-item', self.div[0]).unbind();
+		KMenu.parent.remove.call(self);
+		return self;
+	}
+});
+function _menu(options) {
+	return new KMenu(options);
+}
+K.MenuClass = KMenu;
+K.menu = _menu;
+function KColorPicker(options) {
+	this.init(options);
+}
+_extend(KColorPicker, KWidget, {
+	init : function(options) {
+		var self = this;
+		options.z = options.z || 811213;
+		KColorPicker.parent.init.call(self, options);
+		var colors = options.colors || [
+			['#E53333', '#E56600', '#FF9900', '#64451D', '#DFC5A4', '#FFE500'],
+			['#009900', '#006600', '#99BB00', '#B8D100', '#60D978', '#00D5FF'],
+			['#337FE5', '#003399', '#4C33E5', '#9933E5', '#CC33E5', '#EE33EE'],
+			['#FFFFFF', '#CCCCCC', '#999999', '#666666', '#333333', '#000000']
+		];
+		self.selectedColor = (options.selectedColor || '').toLowerCase();
+		self._cells = [];
+		self.div.addClass('ke-colorpicker').bind('click,mousedown', function(e){
+			e.stopPropagation();
+		}).attr('unselectable', 'on');
+		var table = self.doc.createElement('table');
+		self.div.append(table);
+		table.className = 'ke-colorpicker-table';
+		table.cellPadding = 0;
+		table.cellSpacing = 0;
+		table.border = 0;
+		var row = table.insertRow(0), cell = row.insertCell(0);
+		cell.colSpan = colors[0].length;
+		self._addAttr(cell, '', 'ke-colorpicker-cell-top');
+		for (var i = 0; i < colors.length; i++) {
+			row = table.insertRow(i + 1);
+			for (var j = 0; j < colors[i].length; j++) {
+				cell = row.insertCell(j);
+				self._addAttr(cell, colors[i][j], 'ke-colorpicker-cell');
+			}
+		}
+	},
+	_addAttr : function(cell, color, cls) {
+		var self = this;
+		cell = K(cell).addClass(cls);
+		if (self.selectedColor === color.toLowerCase()) {
+			cell.addClass('ke-colorpicker-cell-selected');
+		}
+		cell.attr('title', color || self.options.noColor);
+		cell.mouseover(function(e) {
+			K(this).addClass('ke-colorpicker-cell-on');
+		});
+		cell.mouseout(function(e) {
+			K(this).removeClass('ke-colorpicker-cell-on');
+		});
+		cell.click(function(e) {
+			e.stop();
+			self.options.click.call(K(this), color);
+		});
+		if (color) {
+			cell.append(K('<div class="ke-colorpicker-cell-color" unselectable="on"></div>').css('background-color', color));
+		} else {
+			cell.html(self.options.noColor);
+		}
+		K(cell).attr('unselectable', 'on');
+		self._cells.push(cell);
+	},
+	remove : function() {
+		var self = this;
+		_each(self._cells, function() {
+			this.unbind();
+		});
+		KColorPicker.parent.remove.call(self);
+		return self;
+	}
+});
+function _colorpicker(options) {
+	return new KColorPicker(options);
+}
+K.ColorPickerClass = KColorPicker;
+K.colorpicker = _colorpicker;
+function KUploadButton(options) {
+	this.init(options);
+}
+_extend(KUploadButton, {
+	init : function(options) {
+		var self = this,
+			button = K(options.button),
+			fieldName = options.fieldName || 'file',
+			url = options.url || '',
+			title = button.val(),
+			extraParams = options.extraParams || {},
+			cls = button[0].className || '',
+			target = options.target || 'kindeditor_upload_iframe_' + new Date().getTime();
+		options.afterError = options.afterError || function(str) {
+			alert(str);
+		};
+		var hiddenElements = [];
+		for(var k in extraParams){
+			hiddenElements.push('<input type="hidden" name="' + k + '" value="' + extraParams[k] + '" />');
+		}
+		var html = [
+			'<div class="ke-inline-block ' + cls + '">',
+			(options.target ? '' : '<iframe name="' + target + '" style="display:none;"></iframe>'),
+			(options.form ? '<div class="ke-upload-area">' : '<form class="ke-upload-area ke-form" method="post" enctype="multipart/form-data" target="' + target + '" action="' + url + '">'),
+			'<span class="ke-button-common">',
+			hiddenElements.join(''),
+			'<input type="button" class="ke-button-common ke-button" value="' + title + '" />',
+			'</span>',
+			'<input type="file" class="ke-upload-file" name="' + fieldName + '" tabindex="-1" />',
+			(options.form ? '</div>' : '</form>'),
+			'</div>'].join('');
+		var div = K(html, button.doc);
+		button.hide();
+		button.before(div);
+		self.div = div;
+		self.button = button;
+		self.iframe = options.target ? K('iframe[name="' + target + '"]') : K('iframe', div);
+		self.form = options.form ? K(options.form) : K('form', div);
+		var width = options.width || K('.ke-button-common', div).width();
+		self.fileBox = K('.ke-upload-file', div).width(width);
+		self.options = options;
+	},
+	submit : function() {
+		var self = this,
+			iframe = self.iframe;
+		iframe.bind('load', function() {
+			iframe.unbind();
+			var tempForm = document.createElement('form');
+			self.fileBox.before(tempForm);
+			K(tempForm).append(self.fileBox);
+			tempForm.reset();
+			K(tempForm).remove(true);
+			var doc = K.iframeDoc(iframe),
+				pre = doc.getElementsByTagName('pre')[0],
+				str = '', data;
+			if (pre) {
+				str = pre.innerHTML;
+			} else {
+				str = doc.body.innerHTML;
+			}
+			str = _unescape(str);
+			iframe[0].src = 'javascript:false';
+			try {
+				data = K.json(str);
+			} catch (e) {
+				self.options.afterError.call(self, '<!doctype html><html>' + doc.body.parentNode.innerHTML + '</html>');
+			}
+			if (data) {
+				self.options.afterUpload.call(self, data);
+			}
+		});
+		self.form[0].submit();
+		return self;
+	},
+	remove : function() {
+		var self = this;
+		if (self.fileBox) {
+			self.fileBox.unbind();
+		}
+		self.iframe.remove();
+		self.div.remove();
+		self.button.show();
+		return self;
+	}
+});
+function _uploadbutton(options) {
+	return new KUploadButton(options);
+}
+K.UploadButtonClass = KUploadButton;
+K.uploadbutton = _uploadbutton;
+function _createButton(arg) {
+	arg = arg || {};
+	var name = arg.name || '',
+		span = K('<span class="ke-button-common ke-button-outer" title="' + name + '"></span>'),
+		btn = K('<input class="ke-button-common ke-button" type="button" value="' + name + '" />');
+	if (arg.click) {
+		btn.click(arg.click);
+	}
+	span.append(btn);
+	return span;
+}
+function KDialog(options) {
+	this.init(options);
+}
+_extend(KDialog, KWidget, {
+	init : function(options) {
+		var self = this;
+		var shadowMode = _undef(options.shadowMode, true);
+		options.z = options.z || 811213;
+		options.shadowMode = false;
+		options.autoScroll = _undef(options.autoScroll, true);
+		KDialog.parent.init.call(self, options);
+		var title = options.title,
+			body = K(options.body, self.doc),
+			previewBtn = options.previewBtn,
+			yesBtn = options.yesBtn,
+			noBtn = options.noBtn,
+			closeBtn = options.closeBtn,
+			showMask = _undef(options.showMask, true);
+		self.div.addClass('ke-dialog').bind('click,mousedown', function(e){
+			e.stopPropagation();
+		});
+		var contentDiv = K('<div class="ke-dialog-content"></div>').appendTo(self.div);
+		if (_IE && _V < 7) {
+			self.iframeMask = K('<iframe src="about:blank" class="ke-dialog-shadow"></iframe>').appendTo(self.div);
+		} else if (shadowMode) {
+			K('<div class="ke-dialog-shadow"></div>').appendTo(self.div);
+		}
+		var headerDiv = K('<div class="ke-dialog-header"></div>');
+		contentDiv.append(headerDiv);
+		headerDiv.html(title);
+		self.closeIcon = K('<span class="ke-dialog-icon-close" title="' + closeBtn.name + '"></span>').click(closeBtn.click);
+		headerDiv.append(self.closeIcon);
+		self.draggable({
+			clickEl : headerDiv,
+			beforeDrag : options.beforeDrag
+		});
+		var bodyDiv = K('<div class="ke-dialog-body"></div>');
+		contentDiv.append(bodyDiv);
+		bodyDiv.append(body);
+		var footerDiv = K('<div class="ke-dialog-footer"></div>');
+		if (previewBtn || yesBtn || noBtn) {
+			contentDiv.append(footerDiv);
+		}
+		_each([
+			{ btn : previewBtn, name : 'preview' },
+			{ btn : yesBtn, name : 'yes' },
+			{ btn : noBtn, name : 'no' }
+		], function() {
+			if (this.btn) {
+				var button = _createButton(this.btn);
+				button.addClass('ke-dialog-' + this.name);
+				footerDiv.append(button);
+			}
+		});
+		if (self.height) {
+			bodyDiv.height(_removeUnit(self.height) - headerDiv.height() - footerDiv.height());
+		}
+		self.div.width(self.div.width());
+		self.div.height(self.div.height());
+		self.mask = null;
+		if (showMask) {
+			var docEl = _docElement(self.doc),
+				docWidth = Math.max(docEl.scrollWidth, docEl.clientWidth),
+				docHeight = Math.max(docEl.scrollHeight, docEl.clientHeight);
+			self.mask = _widget({
+				x : 0,
+				y : 0,
+				z : self.z - 1,
+				cls : 'ke-dialog-mask',
+				width : docWidth,
+				height : docHeight
+			});
+		}
+		self.autoPos(self.div.width(), self.div.height());
+		self.footerDiv = footerDiv;
+		self.bodyDiv = bodyDiv;
+		self.headerDiv = headerDiv;
+		self.isLoading = false;
+	},
+	setMaskIndex : function(z) {
+		var self = this;
+		self.mask.div.css('z-index', z);
+	},
+	showLoading : function(msg) {
+		msg = _undef(msg, '');
+		var self = this, body = self.bodyDiv;
+		self.loading = K('<div class="ke-dialog-loading"><div class="ke-inline-block ke-dialog-loading-content" style="margin-top:' + Math.round(body.height() / 3) + 'px;">' + msg + '</div></div>')
+			.width(body.width()).height(body.height())
+			.css('top', self.headerDiv.height() + 'px');
+		body.css('visibility', 'hidden').after(self.loading);
+		self.isLoading = true;
+		return self;
+	},
+	hideLoading : function() {
+		this.loading && this.loading.remove();
+		this.bodyDiv.css('visibility', 'visible');
+		this.isLoading = false;
+		return this;
+	},
+	remove : function() {
+		var self = this;
+		if (self.options.beforeRemove) {
+			self.options.beforeRemove.call(self);
+		}
+		self.mask && self.mask.remove();
+		self.iframeMask && self.iframeMask.remove();
+		self.closeIcon.unbind();
+		K('input', self.div).unbind();
+		K('button', self.div).unbind();
+		self.footerDiv.unbind();
+		self.bodyDiv.unbind();
+		self.headerDiv.unbind();
+		K('iframe', self.div).each(function() {
+			K(this).remove();
+		});
+		KDialog.parent.remove.call(self);
+		return self;
+	}
+});
+function _dialog(options) {
+	return new KDialog(options);
+}
+K.DialogClass = KDialog;
+K.dialog = _dialog;
+function _tabs(options) {
+	var self = _widget(options),
+		remove = self.remove,
+		afterSelect = options.afterSelect,
+		div = self.div,
+		liList = [];
+	div.addClass('ke-tabs')
+		.bind('contextmenu,mousedown,mousemove', function(e) {
+			e.preventDefault();
+		});
+	var ul = K('<ul class="ke-tabs-ul ke-clearfix"></ul>');
+	div.append(ul);
+	self.add = function(tab) {
+		var li = K('<li class="ke-tabs-li">' + tab.title + '</li>');
+		li.data('tab', tab);
+		liList.push(li);
+		ul.append(li);
+	};
+	self.selectedIndex = 0;
+	self.select = function(index) {
+		self.selectedIndex = index;
+		_each(liList, function(i, li) {
+			li.unbind();
+			if (i === index) {
+				li.addClass('ke-tabs-li-selected');
+				K(li.data('tab').panel).show('');
+			} else {
+				li.removeClass('ke-tabs-li-selected').removeClass('ke-tabs-li-on')
+				.mouseover(function() {
+					K(this).addClass('ke-tabs-li-on');
+				})
+				.mouseout(function() {
+					K(this).removeClass('ke-tabs-li-on');
+				})
+				.click(function() {
+					self.select(i);
+				});
+				K(li.data('tab').panel).hide();
+			}
+		});
+		if (afterSelect) {
+			afterSelect.call(self, index);
+		}
+	};
+	self.remove = function() {
+		_each(liList, function() {
+			this.remove();
+		});
+		ul.remove();
+		remove.call(self);
+	};
+	return self;
+}
+K.tabs = _tabs;
+function _loadScript(url, fn) {
+	var head = document.getElementsByTagName('head')[0] || (_QUIRKS ? document.body : document.documentElement),
+		script = document.createElement('script');
+	head.appendChild(script);
+	script.src = url;
+	script.charset = 'utf-8';
+	script.onload = script.onreadystatechange = function() {
+		if (!this.readyState || this.readyState === 'loaded') {
+			if (fn) {
+				fn();
+			}
+			script.onload = script.onreadystatechange = null;
+			head.removeChild(script);
+		}
+	};
+}
+function _chopQuery(url) {
+	var index = url.indexOf('?');
+	return index > 0 ? url.substr(0, index) : url;
+}
+function _loadStyle(url) {
+	var head = document.getElementsByTagName('head')[0] || (_QUIRKS ? document.body : document.documentElement),
+		link = document.createElement('link'),
+		absoluteUrl = _chopQuery(_formatUrl(url, 'absolute'));
+	var links = K('link[rel="stylesheet"]', head);
+	for (var i = 0, len = links.length; i < len; i++) {
+		if (_chopQuery(_formatUrl(links[i].href, 'absolute')) === absoluteUrl) {
+			return;
+		}
+	}
+	head.appendChild(link);
+	link.href = url;
+	link.rel = 'stylesheet';
+}
+function _ajax(url, fn, method, param, dataType) {
+	method = method || 'GET';
+	dataType = dataType || 'json';
+	var xhr = window.XMLHttpRequest ? new window.XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');
+	xhr.open(method, url, true);
+	xhr.onreadystatechange = function () {
+		if (xhr.readyState == 4 && xhr.status == 200) {
+			if (fn) {
+				var data = _trim(xhr.responseText);
+				if (dataType == 'json') {
+					data = _json(data);
+				}
+				fn(data);
+			}
+		}
+	};
+	if (method == 'POST') {
+		var params = [];
+		_each(param, function(key, val) {
+			params.push(encodeURIComponent(key) + '=' + encodeURIComponent(val));
+		});
+		try {
+			xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
+		} catch (e) {}
+		xhr.send(params.join('&'));
+	} else {
+		xhr.send(null);
+	}
+}
+K.loadScript = _loadScript;
+K.loadStyle = _loadStyle;
+K.ajax = _ajax;
+var _plugins = {};
+function _plugin(name, fn) {
+	if (name === undefined) {
+		return _plugins;
+	}
+	if (!fn) {
+		return _plugins[name];
+	}
+	_plugins[name] = fn;
+}
+var _language = {};
+function _parseLangKey(key) {
+	var match, ns = 'core';
+	if ((match = /^(\w+)\.(\w+)$/.exec(key))) {
+		ns = match[1];
+		key = match[2];
+	}
+	return { ns : ns, key : key };
+}
+function _lang(mixed, langType) {
+	langType = langType === undefined ? K.options.langType : langType;
+	if (typeof mixed === 'string') {
+		if (!_language[langType]) {
+			return 'no language';
+		}
+		var pos = mixed.length - 1;
+		if (mixed.substr(pos) === '.') {
+			return _language[langType][mixed.substr(0, pos)];
+		}
+		var obj = _parseLangKey(mixed);
+		return _language[langType][obj.ns][obj.key];
+	}
+	_each(mixed, function(key, val) {
+		var obj = _parseLangKey(key);
+		if (!_language[langType]) {
+			_language[langType] = {};
+		}
+		if (!_language[langType][obj.ns]) {
+			_language[langType][obj.ns] = {};
+		}
+		_language[langType][obj.ns][obj.key] = val;
+	});
+}
+function _getImageFromRange(range, fn) {
+	if (range.collapsed) {
+		return;
+	}
+	range = range.cloneRange().up();
+	var sc = range.startContainer, so = range.startOffset;
+	if (!_WEBKIT && !range.isControl()) {
+		return;
+	}
+	var img = K(sc.childNodes[so]);
+	if (!img || img.name != 'img') {
+		return;
+	}
+	if (fn(img)) {
+		return img;
+	}
+}
+function _bindContextmenuEvent() {
+	var self = this, doc = self.edit.doc;
+	K(doc).contextmenu(function(e) {
+		if (self.menu) {
+			self.hideMenu();
+		}
+		if (!self.useContextmenu) {
+			e.preventDefault();
+			return;
+		}
+		if (self._contextmenus.length === 0) {
+			return;
+		}
+		var maxWidth = 0, items = [];
+		_each(self._contextmenus, function() {
+			if (this.title == '-') {
+				items.push(this);
+				return;
+			}
+			if (this.cond && this.cond()) {
+				items.push(this);
+				if (this.width && this.width > maxWidth) {
+					maxWidth = this.width;
+				}
+			}
+		});
+		while (items.length > 0 && items[0].title == '-') {
+			items.shift();
+		}
+		while (items.length > 0 && items[items.length - 1].title == '-') {
+			items.pop();
+		}
+		var prevItem = null;
+		_each(items, function(i) {
+			if (this.title == '-' && prevItem.title == '-') {
+				delete items[i];
+			}
+			prevItem = this;
+		});
+		if (items.length > 0) {
+			e.preventDefault();
+			var pos = K(self.edit.iframe).pos(),
+				menu = _menu({
+					x : pos.x + e.clientX,
+					y : pos.y + e.clientY,
+					width : maxWidth,
+					css : { visibility: 'hidden' },
+					shadowMode : self.shadowMode
+				});
+			_each(items, function() {
+				if (this.title) {
+					menu.addItem(this);
+				}
+			});
+			var docEl = _docElement(menu.doc),
+				menuHeight = menu.div.height();
+			if (e.clientY + menuHeight >= docEl.clientHeight - 100) {
+				menu.pos(menu.x, _removeUnit(menu.y) - menuHeight);
+			}
+			menu.div.css('visibility', 'visible');
+			self.menu = menu;
+		}
+	});
+}
+function _bindNewlineEvent() {
+	var self = this, doc = self.edit.doc, newlineTag = self.newlineTag;
+	if (_IE && newlineTag !== 'br') {
+		return;
+	}
+	if (_GECKO && _V < 3 && newlineTag !== 'p') {
+		return;
+	}
+	if (_OPERA && _V < 9) {
+		return;
+	}
+	var brSkipTagMap = _toMap('h1,h2,h3,h4,h5,h6,pre,li'),
+		pSkipTagMap = _toMap('p,h1,h2,h3,h4,h5,h6,pre,li,blockquote');
+	function getAncestorTagName(range) {
+		var ancestor = K(range.commonAncestor());
+		while (ancestor) {
+			if (ancestor.type == 1 && !ancestor.isStyle()) {
+				break;
+			}
+			ancestor = ancestor.parent();
+		}
+		return ancestor.name;
+	}
+	K(doc).keydown(function(e) {
+		if (e.which != 13 || e.shiftKey || e.ctrlKey || e.altKey) {
+			return;
+		}
+		self.cmd.selection();
+		var tagName = getAncestorTagName(self.cmd.range);
+		if (tagName == 'marquee' || tagName == 'select') {
+			return;
+		}
+		if (newlineTag === 'br' && !brSkipTagMap[tagName]) {
+			e.preventDefault();
+			self.insertHtml('<br />' + (_IE && _V < 9 ? '' : '\u200B'));
+			return;
+		}
+		if (!pSkipTagMap[tagName]) {
+			_nativeCommand(doc, 'formatblock', '<p>');
+		}
+	});
+	K(doc).keyup(function(e) {
+		if (e.which != 13 || e.shiftKey || e.ctrlKey || e.altKey) {
+			return;
+		}
+		if (newlineTag == 'br') {
+			return;
+		}
+		if (_GECKO) {
+			var root = self.cmd.commonAncestor('p');
+			var a = self.cmd.commonAncestor('a');
+			if (a && a.text() == '') {
+				a.remove(true);
+				self.cmd.range.selectNodeContents(root[0]).collapse(true);
+				self.cmd.select();
+			}
+			return;
+		}
+		self.cmd.selection();
+		var tagName = getAncestorTagName(self.cmd.range);
+		if (tagName == 'marquee' || tagName == 'select') {
+			return;
+		}
+		if (!pSkipTagMap[tagName]) {
+			_nativeCommand(doc, 'formatblock', '<p>');
+		}
+		var div = self.cmd.commonAncestor('div');
+		if (div) {
+			var p = K('<p></p>'),
+				child = div[0].firstChild;
+			while (child) {
+				var next = child.nextSibling;
+				p.append(child);
+				child = next;
+			}
+			div.before(p);
+			div.remove();
+			self.cmd.range.selectNodeContents(p[0]);
+			self.cmd.select();
+		}
+	});
+}
+function _bindTabEvent() {
+	var self = this, doc = self.edit.doc;
+	K(doc).keydown(function(e) {
+		if (e.which == 9) {
+			e.preventDefault();
+			if (self.afterTab) {
+				self.afterTab.call(self, e);
+				return;
+			}
+			var cmd = self.cmd, range = cmd.range;
+			range.shrink();
+			if (range.collapsed && range.startContainer.nodeType == 1) {
+				range.insertNode(K('@&nbsp;', doc)[0]);
+				cmd.select();
+			}
+			self.insertHtml('&nbsp;&nbsp;&nbsp;&nbsp;');
+		}
+	});
+}
+function _bindFocusEvent() {
+	var self = this;
+	K(self.edit.textarea[0], self.edit.win).focus(function(e) {
+		if (self.afterFocus) {
+			self.afterFocus.call(self, e);
+		}
+	}).blur(function(e) {
+		if (self.afterBlur) {
+			self.afterBlur.call(self, e);
+		}
+	});
+}
+function _removeBookmarkTag(html) {
+	return _trim(html.replace(/<span [^>]*id="?__kindeditor_bookmark_\w+_\d+__"?[^>]*><\/span>/ig, ''));
+}
+function _removeTempTag(html) {
+	return html.replace(/<div[^>]+class="?__kindeditor_paste__"?[^>]*>[\s\S]*?<\/div>/ig, '');
+}
+function _addBookmarkToStack(stack, bookmark) {
+	if (stack.length === 0) {
+		stack.push(bookmark);
+		return;
+	}
+	var prev = stack[stack.length - 1];
+	if (_removeBookmarkTag(bookmark.html) !== _removeBookmarkTag(prev.html)) {
+		stack.push(bookmark);
+	}
+}
+function _undoToRedo(fromStack, toStack) {
+	var self = this, edit = self.edit,
+		body = edit.doc.body,
+		range, bookmark;
+	if (fromStack.length === 0) {
+		return self;
+	}
+	if (edit.designMode) {
+		range = self.cmd.range;
+		bookmark = range.createBookmark(true);
+		bookmark.html = body.innerHTML;
+	} else {
+		bookmark = {
+			html : body.innerHTML
+		};
+	}
+	_addBookmarkToStack(toStack, bookmark);
+	var prev = fromStack.pop();
+	if (_removeBookmarkTag(bookmark.html) === _removeBookmarkTag(prev.html) && fromStack.length > 0) {
+		prev = fromStack.pop();
+	}
+	if (edit.designMode) {
+		edit.html(prev.html);
+		if (prev.start) {
+			range.moveToBookmark(prev);
+			self.select();
+		}
+	} else {
+		K(body).html(_removeBookmarkTag(prev.html));
+	}
+	return self;
+}
+function KEditor(options) {
+	var self = this;
+	self.options = {};
+	function setOption(key, val) {
+		if (KEditor.prototype[key] === undefined) {
+			self[key] = val;
+		}
+		self.options[key] = val;
+	}
+	_each(options, function(key, val) {
+		setOption(key, options[key]);
+	});
+	_each(K.options, function(key, val) {
+		if (self[key] === undefined) {
+			setOption(key, val);
+		}
+	});
+	var se = K(self.srcElement || '<textarea/>');
+	if (!self.width) {
+		self.width = se[0].style.width || se.width();
+	}
+	if (!self.height) {
+		self.height = se[0].style.height || se.height();
+	}
+	setOption('width', _undef(self.width, self.minWidth));
+	setOption('height', _undef(self.height, self.minHeight));
+	setOption('width', _addUnit(self.width));
+	setOption('height', _addUnit(self.height));
+	if (_MOBILE && (!_IOS || _V < 534)) {
+		self.designMode = false;
+	}
+	self.srcElement = se;
+	self.initContent = '';
+	self.plugin = {};
+	self.isCreated = false;
+	self.isLoading = false;
+	self._handlers = {};
+	self._contextmenus = [];
+	self._undoStack = [];
+	self._redoStack = [];
+	self._calledPlugins = {};
+	self._firstAddBookmark = true;
+	self.menu = self.contextmenu = null;
+	self.dialogs = [];
+}
+KEditor.prototype = {
+	lang : function(mixed) {
+		return _lang(mixed, this.langType);
+	},
+	loadPlugin : function(name, fn) {
+		var self = this;
+		if (_plugins[name]) {
+			if (self._calledPlugins[name]) {
+				if (fn) {
+					fn.call(self);
+				}
+				return self;
+			}
+			_plugins[name].call(self, KindEditor);
+			if (fn) {
+				fn.call(self);
+			}
+			self._calledPlugins[name] = true;
+			return self;
+		}
+		if (self.isLoading) {
+			return self;
+		}
+		self.isLoading = true;
+		_loadScript(self.pluginsPath + name + '/' + name + '.js?ver=' + encodeURIComponent(K.DEBUG ? _TIME : _VERSION), function() {
+			self.isLoading = false;
+			if (_plugins[name]) {
+				self.loadPlugin(name, fn);
+			}
+		});
+		return self;
+	},
+	handler : function(key, fn) {
+		var self = this;
+		if (!self._handlers[key]) {
+			self._handlers[key] = [];
+		}
+		if (_isFunction(fn)) {
+			self._handlers[key].push(fn);
+			return self;
+		}
+		_each(self._handlers[key], function() {
+			fn = this.call(self, fn);
+		});
+		return fn;
+	},
+	clickToolbar : function(name, fn) {
+		var self = this, key = 'clickToolbar' + name;
+		if (fn === undefined) {
+			if (self._handlers[key]) {
+				return self.handler(key);
+			}
+			self.loadPlugin(name, function() {
+				self.handler(key);
+			});
+			return self;
+		}
+		return self.handler(key, fn);
+	},
+	updateState : function() {
+		var self = this;
+		_each(('justifyleft,justifycenter,justifyright,justifyfull,insertorderedlist,insertunorderedlist,' +
+			'subscript,superscript,bold,italic,underline,strikethrough').split(','), function(i, name) {
+			self.cmd.state(name) ? self.toolbar.select(name) : self.toolbar.unselect(name);
+		});
+		return self;
+	},
+	addContextmenu : function(item) {
+		this._contextmenus.push(item);
+		return this;
+	},
+	afterCreate : function(fn) {
+		return this.handler('afterCreate', fn);
+	},
+	beforeRemove : function(fn) {
+		return this.handler('beforeRemove', fn);
+	},
+	beforeGetHtml : function(fn) {
+		return this.handler('beforeGetHtml', fn);
+	},
+	beforeSetHtml : function(fn) {
+		return this.handler('beforeSetHtml', fn);
+	},
+	afterSetHtml : function(fn) {
+		return this.handler('afterSetHtml', fn);
+	},
+	create : function() {
+		var self = this, fullscreenMode = self.fullscreenMode;
+		if (self.isCreated) {
+			return self;
+		}
+		if (self.srcElement.data('kindeditor')) {
+			return self;
+		}
+		self.srcElement.data('kindeditor', 'true');
+		if (fullscreenMode) {
+			_docElement().style.overflow = 'hidden';
+		} else {
+			_docElement().style.overflow = '';
+		}
+		var width = fullscreenMode ? _docElement().clientWidth + 'px' : self.width,
+			height = fullscreenMode ? _docElement().clientHeight + 'px' : self.height;
+		if ((_IE && _V < 8) || _QUIRKS) {
+			height = _addUnit(_removeUnit(height) + 2);
+		}
+		var container = self.container = K(self.layout);
+		if (fullscreenMode) {
+			K(document.body).append(container);
+		} else {
+			self.srcElement.before(container);
+		}
+		var toolbarDiv = K('.toolbar', container),
+			editDiv = K('.edit', container),
+			statusbar = self.statusbar = K('.statusbar', container);
+		container.removeClass('container')
+			.addClass('ke-container ke-container-' + self.themeType).css('width', width);
+		if (fullscreenMode) {
+			container.css({
+				position : 'absolute',
+				left : 0,
+				top : 0,
+				'z-index' : 811211
+			});
+			if (!_GECKO) {
+				self._scrollPos = _getScrollPos();
+			}
+			window.scrollTo(0, 0);
+			K(document.body).css({
+				'height' : '1px',
+				'overflow' : 'hidden'
+			});
+			K(document.body.parentNode).css('overflow', 'hidden');
+			self._fullscreenExecuted = true;
+		} else {
+			if (self._fullscreenExecuted) {
+				K(document.body).css({
+					'height' : '',
+					'overflow' : ''
+				});
+				K(document.body.parentNode).css('overflow', '');
+			}
+			if (self._scrollPos) {
+				window.scrollTo(self._scrollPos.x, self._scrollPos.y);
+			}
+		}
+		var htmlList = [];
+		K.each(self.items, function(i, name) {
+			if (name == '|') {
+				htmlList.push('<span class="ke-inline-block ke-separator"></span>');
+			} else if (name == '/') {
+				htmlList.push('<div class="ke-hr"></div>');
+			} else {
+				htmlList.push('<span class="ke-outline" data-name="' + name + '" title="' + self.lang(name) + '" unselectable="on">');
+				htmlList.push('<span class="ke-toolbar-icon ke-toolbar-icon-url ke-icon-' + name + '" unselectable="on"></span></span>');
+			}
+		});
+		var toolbar = self.toolbar = _toolbar({
+			src : toolbarDiv,
+			html : htmlList.join(''),
+			noDisableItems : self.noDisableItems,
+			click : function(e, name) {
+				e.stop();
+				if (self.menu) {
+					var menuName = self.menu.name;
+					self.hideMenu();
+					if (menuName === name) {
+						return;
+					}
+				}
+				self.clickToolbar(name);
+			}
+		});
+		var editHeight = _removeUnit(height) - toolbar.div.height();
+		var edit = self.edit = _edit({
+			height : editHeight > 0 && _removeUnit(height) > self.minHeight ? editHeight : self.minHeight,
+			src : editDiv,
+			srcElement : self.srcElement,
+			designMode : self.designMode,
+			themesPath : self.themesPath,
+			bodyClass : self.bodyClass,
+			cssPath : self.cssPath,
+			cssData : self.cssData,
+			beforeGetHtml : function(html) {
+				html = self.beforeGetHtml(html);
+				return _formatHtml(html, self.filterMode ? self.htmlTags : null, self.urlType, self.wellFormatMode, self.indentChar);
+			},
+			beforeSetHtml : function(html) {
+				html = _formatHtml(html, self.filterMode ? self.htmlTags : null, '', false);
+				return self.beforeSetHtml(html);
+			},
+			afterSetHtml : function() {
+				self.edit = edit = this;
+				self.afterSetHtml();
+			},
+			afterCreate : function() {
+				self.edit = edit = this;
+				self.cmd = edit.cmd;
+				self._docMousedownFn = function(e) {
+					if (self.menu) {
+						self.hideMenu();
+					}
+				};
+				K(edit.doc, document).mousedown(self._docMousedownFn);
+				_bindContextmenuEvent.call(self);
+				_bindNewlineEvent.call(self);
+				_bindTabEvent.call(self);
+				_bindFocusEvent.call(self);
+				edit.afterChange(function(e) {
+					if (!edit.designMode) {
+						return;
+					}
+					self.updateState();
+					self.addBookmark();
+					if (self.options.afterChange) {
+						self.options.afterChange.call(self);
+					}
+				});
+				edit.textarea.keyup(function(e) {
+					if (!e.ctrlKey && !e.altKey && _INPUT_KEY_MAP[e.which]) {
+						if (self.options.afterChange) {
+							self.options.afterChange.call(self);
+						}
+					}
+				});
+				if (self.readonlyMode) {
+					self.readonly();
+				}
+				self.isCreated = true;
+				if (self.initContent === '') {
+					self.initContent = self.html();
+				}
+				self.afterCreate();
+				if (self.options.afterCreate) {
+					self.options.afterCreate.call(self);
+				}
+			}
+		});
+		statusbar.removeClass('statusbar').addClass('ke-statusbar')
+			.append('<span class="ke-inline-block ke-statusbar-center-icon"></span>')
+			.append('<span class="ke-inline-block ke-statusbar-right-icon"></span>');
+		if (self._fullscreenResizeHandler) {
+			K(window).unbind('resize', self._fullscreenResizeHandler);
+			self._fullscreenResizeHandler = null;
+		}
+		function initResize() {
+			if (statusbar.height() === 0) {
+				setTimeout(initResize, 100);
+				return;
+			}
+			self.resize(width, height, false);
+		}
+		initResize();
+		if (fullscreenMode) {
+			self._fullscreenResizeHandler = function(e) {
+				if (self.isCreated) {
+					self.resize(_docElement().clientWidth, _docElement().clientHeight, false);
+				}
+			};
+			K(window).bind('resize', self._fullscreenResizeHandler);
+			toolbar.select('fullscreen');
+			statusbar.first().css('visibility', 'hidden');
+			statusbar.last().css('visibility', 'hidden');
+		} else {
+			if (_GECKO) {
+				K(window).bind('scroll', function(e) {
+					self._scrollPos = _getScrollPos();
+				});
+			}
+			if (self.resizeType > 0) {
+				_drag({
+					moveEl : container,
+					clickEl : statusbar,
+					moveFn : function(x, y, width, height, diffX, diffY) {
+						height += diffY;
+						self.resize(null, height);
+					}
+				});
+			} else {
+				statusbar.first().css('visibility', 'hidden');
+			}
+			if (self.resizeType === 2) {
+				_drag({
+					moveEl : container,
+					clickEl : statusbar.last(),
+					moveFn : function(x, y, width, height, diffX, diffY) {
+						width += diffX;
+						height += diffY;
+						self.resize(width, height);
+					}
+				});
+			} else {
+				statusbar.last().css('visibility', 'hidden');
+			}
+		}
+		return self;
+	},
+	remove : function() {
+		var self = this;
+		if (!self.isCreated) {
+			return self;
+		}
+		self.beforeRemove();
+		self.srcElement.data('kindeditor', '');
+		if (self.menu) {
+			self.hideMenu();
+		}
+		_each(self.dialogs, function() {
+			self.hideDialog();
+		});
+		K(document).unbind('mousedown', self._docMousedownFn);
+		self.toolbar.remove();
+		self.edit.remove();
+		self.statusbar.last().unbind();
+		self.statusbar.unbind();
+		self.container.remove();
+		self.container = self.toolbar = self.edit = self.menu = null;
+		self.dialogs = [];
+		self.isCreated = false;
+		return self;
+	},
+	resize : function(width, height, updateProp) {
+		var self = this;
+		updateProp = _undef(updateProp, true);
+		if (width) {
+			if (!/%/.test(width)) {
+				width = _removeUnit(width);
+				width = width < self.minWidth ? self.minWidth : width;
+			}
+			self.container.css('width', _addUnit(width));
+			if (updateProp) {
+				self.width = _addUnit(width);
+			}
+		}
+		if (height) {
+			height = _removeUnit(height);
+			editHeight = _removeUnit(height) - self.toolbar.div.height() - self.statusbar.height();
+			editHeight = editHeight < self.minHeight ? self.minHeight : editHeight;
+			self.edit.setHeight(editHeight);
+			if (updateProp) {
+				self.height = _addUnit(height);
+			}
+		}
+		return self;
+	},
+	select : function() {
+		this.isCreated && this.cmd.select();
+		return this;
+	},
+	html : function(val) {
+		var self = this;
+		if (val === undefined) {
+			return self.isCreated ? self.edit.html() : _elementVal(self.srcElement);
+		}
+		self.isCreated ? self.edit.html(val) : _elementVal(self.srcElement, val);
+		if (self.isCreated) {
+			self.cmd.selection();
+		}
+		return self;
+	},
+	fullHtml : function() {
+		return this.isCreated ? this.edit.html(undefined, true) : '';
+	},
+	text : function(val) {
+		var self = this;
+		if (val === undefined) {
+			return _trim(self.html().replace(/<(?!img|embed).*?>/ig, '').replace(/&nbsp;/ig, ' '));
+		} else {
+			return self.html(_escape(val));
+		}
+	},
+	isEmpty : function() {
+		return _trim(this.text().replace(/\r\n|\n|\r/, '')) === '';
+	},
+	isDirty : function() {
+		return _trim(this.initContent.replace(/\r\n|\n|\r|t/g, '')) !== _trim(this.html().replace(/\r\n|\n|\r|t/g, ''));
+	},
+	selectedHtml : function() {
+		return this.isCreated ? this.cmd.range.html() : '';
+	},
+	count : function(mode) {
+		var self = this;
+		mode = (mode || 'html').toLowerCase();
+		if (mode === 'html') {
+			return _removeBookmarkTag(_removeTempTag(self.html())).length;
+		}
+		if (mode === 'text') {
+			return self.text().replace(/<(?:img|embed).*?>/ig, 'K').replace(/\r\n|\n|\r/g, '').length;
+		}
+		return 0;
+	},
+	exec : function(key) {
+		key = key.toLowerCase();
+		var self = this, cmd = self.cmd,
+			changeFlag = _inArray(key, 'selectall,copy,paste,print'.split(',')) < 0;
+		if (changeFlag) {
+			self.addBookmark(false);
+		}
+		cmd[key].apply(cmd, _toArray(arguments, 1));
+		if (changeFlag) {
+			self.updateState();
+			self.addBookmark(false);
+			if (self.options.afterChange) {
+				self.options.afterChange.call(self);
+			}
+		}
+		return self;
+	},
+	insertHtml : function(val, quickMode) {
+		if (!this.isCreated) {
+			return this;
+		}
+		val = this.beforeSetHtml(val);
+		this.exec('inserthtml', val, quickMode);
+		return this;
+	},
+	appendHtml : function(val) {
+		this.html(this.html() + val);
+		if (this.isCreated) {
+			var cmd = this.cmd;
+			cmd.range.selectNodeContents(cmd.doc.body).collapse(false);
+			cmd.select();
+		}
+		return this;
+	},
+	sync : function() {
+		_elementVal(this.srcElement, this.html());
+		return this;
+	},
+	focus : function() {
+		this.isCreated ? this.edit.focus() : this.srcElement[0].focus();
+		return this;
+	},
+	blur : function() {
+		this.isCreated ? this.edit.blur() : this.srcElement[0].blur();
+		return this;
+	},
+	addBookmark : function(checkSize) {
+		checkSize = _undef(checkSize, true);
+		var self = this, edit = self.edit,
+			body = edit.doc.body,
+			html = _removeTempTag(body.innerHTML), bookmark;
+		if (checkSize && self._undoStack.length > 0) {
+			var prev = self._undoStack[self._undoStack.length - 1];
+			if (Math.abs(html.length - _removeBookmarkTag(prev.html).length) < self.minChangeSize) {
+				return self;
+			}
+		}
+		if (edit.designMode && !self._firstAddBookmark) {
+			var range = self.cmd.range;
+			bookmark = range.createBookmark(true);
+			bookmark.html = _removeTempTag(body.innerHTML);
+			range.moveToBookmark(bookmark);
+		} else {
+			bookmark = {
+				html : html
+			};
+		}
+		self._firstAddBookmark = false;
+		_addBookmarkToStack(self._undoStack, bookmark);
+		return self;
+	},
+	undo : function() {
+		return _undoToRedo.call(this, this._undoStack, this._redoStack);
+	},
+	redo : function() {
+		return _undoToRedo.call(this, this._redoStack, this._undoStack);
+	},
+	fullscreen : function(bool) {
+		this.fullscreenMode = (bool === undefined ? !this.fullscreenMode : bool);
+		return this.remove().create();
+	},
+	readonly : function(isReadonly) {
+		isReadonly = _undef(isReadonly, true);
+		var self = this, edit = self.edit, doc = edit.doc;
+		if (self.designMode) {
+			self.toolbar.disableAll(isReadonly, []);
+		} else {
+			_each(self.noDisableItems, function() {
+				self.toolbar[isReadonly ? 'disable' : 'enable'](this);
+			});
+		}
+		if (_IE) {
+			doc.body.contentEditable = !isReadonly;
+		} else {
+			doc.designMode = isReadonly ? 'off' : 'on';
+		}
+		edit.textarea[0].disabled = isReadonly;
+	},
+	createMenu : function(options) {
+		var self = this,
+			name = options.name,
+			knode = self.toolbar.get(name),
+			pos = knode.pos();
+		options.x = pos.x;
+		options.y = pos.y + knode.height();
+		options.z = self.options.zIndex;
+		options.shadowMode = _undef(options.shadowMode, self.shadowMode);
+		if (options.selectedColor !== undefined) {
+			options.cls = 'ke-colorpicker-' + self.themeType;
+			options.noColor = self.lang('noColor');
+			self.menu = _colorpicker(options);
+		} else {
+			options.cls = 'ke-menu-' + self.themeType;
+			options.centerLineMode = false;
+			self.menu = _menu(options);
+		}
+		return self.menu;
+	},
+	hideMenu : function() {
+		this.menu.remove();
+		this.menu = null;
+		return this;
+	},
+	hideContextmenu : function() {
+		this.contextmenu.remove();
+		this.contextmenu = null;
+		return this;
+	},
+	createDialog : function(options) {
+		var self = this, name = options.name;
+		options.z = self.options.zIndex;
+		options.shadowMode = _undef(options.shadowMode, self.shadowMode);
+		options.closeBtn = _undef(options.closeBtn, {
+			name : self.lang('close'),
+			click : function(e) {
+				self.hideDialog();
+				if (_IE && self.cmd) {
+					self.cmd.select();
+				}
+			}
+		});
+		options.noBtn = _undef(options.noBtn, {
+			name : self.lang(options.yesBtn ? 'no' : 'close'),
+			click : function(e) {
+				self.hideDialog();
+				if (_IE && self.cmd) {
+					self.cmd.select();
+				}
+			}
+		});
+		if (self.dialogAlignType != 'page') {
+			options.alignEl = self.container;
+		}
+		options.cls = 'ke-dialog-' + self.themeType;
+		if (self.dialogs.length > 0) {
+			var firstDialog = self.dialogs[0],
+				parentDialog = self.dialogs[self.dialogs.length - 1];
+			firstDialog.setMaskIndex(parentDialog.z + 2);
+			options.z = parentDialog.z + 3;
+			options.showMask = false;
+		}
+		var dialog = _dialog(options);
+		self.dialogs.push(dialog);
+		return dialog;
+	},
+	hideDialog : function() {
+		var self = this;
+		if (self.dialogs.length > 0) {
+			self.dialogs.pop().remove();
+		}
+		if (self.dialogs.length > 0) {
+			var firstDialog = self.dialogs[0],
+				parentDialog = self.dialogs[self.dialogs.length - 1];
+			firstDialog.setMaskIndex(parentDialog.z - 1);
+		}
+		return self;
+	},
+	errorDialog : function(html) {
+		var self = this;
+		var dialog = self.createDialog({
+			width : 750,
+			title : self.lang('uploadError'),
+			body : '<div style="padding:10px 20px;"><iframe frameborder="0" style="width:708px;height:400px;"></iframe></div>'
+		});
+		var iframe = K('iframe', dialog.div), doc = K.iframeDoc(iframe);
+		doc.open();
+		doc.write(html);
+		doc.close();
+		K(doc.body).css('background-color', '#FFF');
+		iframe[0].contentWindow.focus();
+		return self;
+	}
+};
+function _editor(options) {
+	return new KEditor(options);
+}
+_instances = [];
+function _create(expr, options) {
+	options = options || {};
+	options.basePath = _undef(options.basePath, K.basePath);
+	options.themesPath = _undef(options.themesPath, options.basePath + 'themes/');
+	options.langPath = _undef(options.langPath, options.basePath + 'lang/');
+	options.pluginsPath = _undef(options.pluginsPath, options.basePath + 'plugins/');
+	if (_undef(options.loadStyleMode, K.options.loadStyleMode)) {
+		var themeType = _undef(options.themeType, K.options.themeType);
+		_loadStyle(options.themesPath + 'default/default.css');
+		_loadStyle(options.themesPath + themeType + '/' + themeType + '.css');
+	}
+	function create(editor) {
+		_each(_plugins, function(name, fn) {
+			fn.call(editor, KindEditor);
+		});
+		return editor.create();
+	}
+	var knode = K(expr);
+	if (!knode || knode.length === 0) {
+		return;
+	}
+	if (knode.length > 1) {
+		knode.each(function() {
+			_create(this, options);
+		});
+		return _instances[0];
+	}
+	options.srcElement = knode[0];
+	var editor = new KEditor(options);
+	_instances.push(editor);
+	if (_language[editor.langType]) {
+		return create(editor);
+	}
+	_loadScript(editor.langPath + editor.langType + '.js?ver=' + encodeURIComponent(K.DEBUG ? _TIME : _VERSION), function() {
+		create(editor);
+	});
+	return editor;
+}
+function _eachEditor(expr, fn) {
+	K(expr).each(function(i, el) {
+		K.each(_instances, function(j, editor) {
+			if (editor && editor.srcElement[0] == el) {
+				fn.call(editor, j, editor);
+				return false;
+			}
+		});
+	});
+}
+K.remove = function(expr) {
+	_eachEditor(expr, function(i) {
+		this.remove();
+		_instances.splice(i, 1);
+	});
+};
+K.sync = function(expr) {
+	_eachEditor(expr, function() {
+		this.sync();
+	});
+};
+if (_IE && _V < 7) {
+	_nativeCommand(document, 'BackgroundImageCache', true);
+}
+K.EditorClass = KEditor;
+K.editor = _editor;
+K.create = _create;
+K.instances = _instances;
+K.plugin = _plugin;
+K.lang = _lang;
+_plugin('core', function(K) {
+	var self = this,
+		shortcutKeys = {
+			undo : 'Z', redo : 'Y', bold : 'B', italic : 'I', underline : 'U', print : 'P', selectall : 'A'
+		};
+	self.afterSetHtml(function() {
+		if (self.options.afterChange) {
+			self.options.afterChange.call(self);
+		}
+	});
+	self.afterCreate(function() {
+		if (self.syncType != 'form') {
+			return;
+		}
+		var el = K(self.srcElement), hasForm = false;
+		while ((el = el.parent())) {
+			if (el.name == 'form') {
+				hasForm = true;
+				break;
+			}
+		}
+		if (hasForm) {
+			el.bind('submit', function(e) {
+				self.sync();
+				K(window).bind('unload', function() {
+					self.edit.textarea.remove();
+				});
+			});
+			var resetBtn = K('[type="reset"]', el);
+			resetBtn.click(function() {
+				self.html(self.initContent);
+				self.cmd.selection();
+			});
+			self.beforeRemove(function() {
+				el.unbind();
+				resetBtn.unbind();
+			});
+		}
+	});
+	self.clickToolbar('source', function() {
+		if (self.edit.designMode) {
+			self.toolbar.disableAll(true);
+			self.edit.design(false);
+			self.toolbar.select('source');
+		} else {
+			self.toolbar.disableAll(false);
+			self.edit.design(true);
+			self.toolbar.unselect('source');
+			self.cmd.selection();
+		}
+		self.designMode = self.edit.designMode;
+	});
+	self.afterCreate(function() {
+		if (!self.designMode) {
+			self.toolbar.disableAll(true).select('source');
+		}
+	});
+	self.clickToolbar('fullscreen', function() {
+		self.fullscreen();
+	});
+	if (self.fullscreenShortcut) {
+		var loaded = false;
+		self.afterCreate(function() {
+			K(self.edit.doc, self.edit.textarea).keyup(function(e) {
+				if (e.which == 27) {
+					setTimeout(function() {
+						self.fullscreen();
+					}, 0);
+				}
+			});
+			if (loaded) {
+				if (_IE && !self.designMode) {
+					return;
+				}
+				self.focus();
+			}
+			if (!loaded) {
+				loaded = true;
+			}
+		});
+	}
+	_each('undo,redo'.split(','), function(i, name) {
+		if (shortcutKeys[name]) {
+			self.afterCreate(function() {
+				_ctrl(this.edit.doc, shortcutKeys[name], function() {
+					self.clickToolbar(name);
+				});
+			});
+		}
+		self.clickToolbar(name, function() {
+			self[name]();
+		});
+	});
+	self.clickToolbar('formatblock', function() {
+		var blocks = self.lang('formatblock.formatBlock'),
+			heights = {
+				h1 : 28,
+				h2 : 24,
+				h3 : 18,
+				H4 : 14,
+				p : 12
+			},
+			curVal = self.cmd.val('formatblock'),
+			menu = self.createMenu({
+				name : 'formatblock',
+				width : self.langType == 'en' ? 200 : 150
+			});
+		_each(blocks, function(key, val) {
+			var style = 'font-size:' + heights[key] + 'px;';
+			if (key.charAt(0) === 'h') {
+				style += 'font-weight:bold;';
+			}
+			menu.addItem({
+				title : '<span style="' + style + '" unselectable="on">' + val + '</span>',
+				height : heights[key] + 12,
+				checked : (curVal === key || curVal === val),
+				click : function() {
+					self.select().exec('formatblock', '<' + key + '>').hideMenu();
+				}
+			});
+		});
+	});
+	self.clickToolbar('fontname', function() {
+		var curVal = self.cmd.val('fontname'),
+			menu = self.createMenu({
+				name : 'fontname',
+				width : 150
+			});
+		_each(self.lang('fontname.fontName'), function(key, val) {
+			menu.addItem({
+				title : '<span style="font-family: ' + key + ';" unselectable="on">' + val + '</span>',
+				checked : (curVal === key.toLowerCase() || curVal === val.toLowerCase()),
+				click : function() {
+					self.exec('fontname', key).hideMenu();
+				}
+			});
+		});
+	});
+	self.clickToolbar('fontsize', function() {
+		var curVal = self.cmd.val('fontsize'),
+			menu = self.createMenu({
+				name : 'fontsize',
+				width : 150
+			});
+		_each(self.fontSizeTable, function(i, val) {
+			menu.addItem({
+				title : '<span style="font-size:' + val + ';" unselectable="on">' + val + '</span>',
+				height : _removeUnit(val) + 12,
+				checked : curVal === val,
+				click : function() {
+					self.exec('fontsize', val).hideMenu();
+				}
+			});
+		});
+	});
+	_each('forecolor,hilitecolor'.split(','), function(i, name) {
+		self.clickToolbar(name, function() {
+			self.createMenu({
+				name : name,
+				selectedColor : self.cmd.val(name) || 'default',
+				colors : self.colorTable,
+				click : function(color) {
+					self.exec(name, color).hideMenu();
+				}
+			});
+		});
+	});
+	_each(('cut,copy,paste').split(','), function(i, name) {
+		self.clickToolbar(name, function() {
+			self.focus();
+			try {
+				self.exec(name, null);
+			} catch(e) {
+				alert(self.lang(name + 'Error'));
+			}
+		});
+	});
+	self.clickToolbar('about', function() {
+		var html = '<div style="margin:20px;">' +
+			'<div>KindEditor ' + _VERSION + '</div>' +
+			'<div>Copyright &copy; <a href="http://www.kindsoft.net/" target="_blank">kindsoft.net</a> All rights reserved.</div>' +
+			'</div>';
+		self.createDialog({
+			name : 'about',
+			width : 350,
+			title : self.lang('about'),
+			body : html
+		});
+	});
+	self.plugin.getSelectedLink = function() {
+		return self.cmd.commonAncestor('a');
+	};
+	self.plugin.getSelectedImage = function() {
+		return _getImageFromRange(self.edit.cmd.range, function(img) {
+			return !/^ke-\w+$/i.test(img[0].className);
+		});
+	};
+	self.plugin.getSelectedFlash = function() {
+		return _getImageFromRange(self.edit.cmd.range, function(img) {
+			return img[0].className == 'ke-flash';
+		});
+	};
+	self.plugin.getSelectedMedia = function() {
+		return _getImageFromRange(self.edit.cmd.range, function(img) {
+			return img[0].className == 'ke-media' || img[0].className == 'ke-rm';
+		});
+	};
+	self.plugin.getSelectedAnchor = function() {
+		return _getImageFromRange(self.edit.cmd.range, function(img) {
+			return img[0].className == 'ke-anchor';
+		});
+	};
+	_each('link,image,flash,media,anchor'.split(','), function(i, name) {
+		var uName = name.charAt(0).toUpperCase() + name.substr(1);
+		_each('edit,delete'.split(','), function(j, val) {
+			self.addContextmenu({
+				title : self.lang(val + uName),
+				click : function() {
+					self.loadPlugin(name, function() {
+						self.plugin[name][val]();
+						self.hideMenu();
+					});
+				},
+				cond : self.plugin['getSelected' + uName],
+				width : 150,
+				iconClass : val == 'edit' ? 'ke-icon-' + name : undefined
+			});
+		});
+		self.addContextmenu({ title : '-' });
+	});
+	self.plugin.getSelectedTable = function() {
+		return self.cmd.commonAncestor('table');
+	};
+	self.plugin.getSelectedRow = function() {
+		return self.cmd.commonAncestor('tr');
+	};
+	self.plugin.getSelectedCell = function() {
+		return self.cmd.commonAncestor('td');
+	};
+	_each(('prop,cellprop,colinsertleft,colinsertright,rowinsertabove,rowinsertbelow,rowmerge,colmerge,' +
+	'rowsplit,colsplit,coldelete,rowdelete,insert,delete').split(','), function(i, val) {
+		var cond = _inArray(val, ['prop', 'delete']) < 0 ? self.plugin.getSelectedCell : self.plugin.getSelectedTable;
+		self.addContextmenu({
+			title : self.lang('table' + val),
+			click : function() {
+				self.loadPlugin('table', function() {
+					self.plugin.table[val]();
+					self.hideMenu();
+				});
+			},
+			cond : cond,
+			width : 170,
+			iconClass : 'ke-icon-table' + val
+		});
+	});
+	self.addContextmenu({ title : '-' });
+	_each(('selectall,justifyleft,justifycenter,justifyright,justifyfull,insertorderedlist,' +
+		'insertunorderedlist,indent,outdent,subscript,superscript,hr,print,' +
+		'bold,italic,underline,strikethrough,removeformat,unlink').split(','), function(i, name) {
+		if (shortcutKeys[name]) {
+			self.afterCreate(function() {
+				_ctrl(this.edit.doc, shortcutKeys[name], function() {
+					self.cmd.selection();
+					self.clickToolbar(name);
+				});
+			});
+		}
+		self.clickToolbar(name, function() {
+			self.focus().exec(name, null);
+		});
+	});
+	self.afterCreate(function() {
+		var doc = self.edit.doc, cmd, bookmark, div,
+			cls = '__kindeditor_paste__', pasting = false;
+		function movePastedData() {
+			cmd.range.moveToBookmark(bookmark);
+			cmd.select();
+			if (_WEBKIT) {
+				K('div.' + cls, div).each(function() {
+					K(this).after('<br />').remove(true);
+				});
+				K('span.Apple-style-span', div).remove(true);
+				K('span.Apple-tab-span', div).remove(true);
+				K('span[style]', div).each(function() {
+					if (K(this).css('white-space') == 'nowrap') {
+						K(this).remove(true);
+					}
+				});
+				K('meta', div).remove();
+			}
+			var html = div[0].innerHTML;
+			div.remove();
+			if (html === '') {
+				return;
+			}
+			if (_WEBKIT) {
+				html = html.replace(/(<br>)\1/ig, '$1');
+			}
+			if (self.pasteType === 2) {
+				html = html.replace(/(<(?:p|p\s[^>]*)>) *(<\/p>)/ig, '');
+				if (/schemas-microsoft-com|worddocument|mso-\w+/i.test(html)) {
+					html = _clearMsWord(html, self.filterMode ? self.htmlTags : K.options.htmlTags);
+				} else {
+					html = _formatHtml(html, self.filterMode ? self.htmlTags : null);
+					html = self.beforeSetHtml(html);
+				}
+			}
+			if (self.pasteType === 1) {
+				html = html.replace(/&nbsp;/ig, ' ');
+				html = html.replace(/\n\s*\n/g, '\n');
+				html = html.replace(/<br[^>]*>/ig, '\n');
+				html = html.replace(/<\/p><p[^>]*>/ig, '\n');
+				html = html.replace(/<[^>]+>/g, '');
+				html = html.replace(/ {2}/g, ' &nbsp;');
+				if (self.newlineTag == 'p') {
+					if (/\n/.test(html)) {
+						html = html.replace(/^/, '<p>').replace(/$/, '<br /></p>').replace(/\n/g, '<br /></p><p>');
+					}
+				} else {
+					html = html.replace(/\n/g, '<br />$&');
+				}
+			}
+			self.insertHtml(html, true);
+		}
+		K(doc.body).bind('paste', function(e){
+			if (self.pasteType === 0) {
+				e.stop();
+				return;
+			}
+			if (pasting) {
+				return;
+			}
+			pasting = true;
+			K('div.' + cls, doc).remove();
+			cmd = self.cmd.selection();
+			bookmark = cmd.range.createBookmark();
+			div = K('<div class="' + cls + '"></div>', doc).css({
+				position : 'absolute',
+				width : '1px',
+				height : '1px',
+				overflow : 'hidden',
+				left : '-1981px',
+				top : K(bookmark.start).pos().y + 'px',
+				'white-space' : 'nowrap'
+			});
+			K(doc.body).append(div);
+			if (_IE) {
+				var rng = cmd.range.get(true);
+				rng.moveToElementText(div[0]);
+				rng.select();
+				rng.execCommand('paste');
+				e.preventDefault();
+			} else {
+				cmd.range.selectNodeContents(div[0]);
+				cmd.select();
+			}
+			setTimeout(function() {
+				movePastedData();
+				pasting = false;
+			}, 0);
+		});
+	});
+	self.beforeGetHtml(function(html) {
+		if (_IE && _V <= 8) {
+			html = html.replace(/<div\s+[^>]*data-ke-input-tag="([^"]*)"[^>]*>([\s\S]*?)<\/div>/ig, function(full, tag) {
+				return unescape(tag);
+			});
+			html = html.replace(/(<input)((?:\s+[^>]*)?>)/ig, function($0, $1, $2) {
+				if (!/\s+type="[^"]+"/i.test($0)) {
+					return $1 + ' type="text"' + $2;
+				}
+				return $0;
+			});
+		}
+		return html.replace(/(<(?:noscript|noscript\s[^>]*)>)([\s\S]*?)(<\/noscript>)/ig, function($0, $1, $2, $3) {
+			return $1 + _unescape($2).replace(/\s+/g, ' ') + $3;
+		})
+		.replace(/<img[^>]*class="?ke-(flash|rm|media)"?[^>]*>/ig, function(full) {
+			var imgAttrs = _getAttrList(full),
+				styles = _getCssList(imgAttrs.style || ''),
+				attrs = _mediaAttrs(imgAttrs['data-ke-tag']);
+			attrs.width = _undef(imgAttrs.width, _removeUnit(_undef(styles.width, '')));
+			attrs.height = _undef(imgAttrs.height, _removeUnit(_undef(styles.height, '')));
+			return _mediaEmbed(attrs);
+		})
+		.replace(/<img[^>]*class="?ke-anchor"?[^>]*>/ig, function(full) {
+			var imgAttrs = _getAttrList(full);
+			return '<a name="' + unescape(imgAttrs['data-ke-name']) + '"></a>';
+		})
+		.replace(/<div\s+[^>]*data-ke-script-attr="([^"]*)"[^>]*>([\s\S]*?)<\/div>/ig, function(full, attr, code) {
+			return '<script' + unescape(attr) + '>' + unescape(code) + '</script>';
+		})
+		.replace(/<div\s+[^>]*data-ke-noscript-attr="([^"]*)"[^>]*>([\s\S]*?)<\/div>/ig, function(full, attr, code) {
+			return '<noscript' + unescape(attr) + '>' + unescape(code) + '</noscript>';
+		})
+		.replace(/(<[^>]*)data-ke-src="([^"]*)"([^>]*>)/ig, function(full, start, src, end) {
+			full = full.replace(/(\s+(?:href|src)=")[^"]*(")/i, function($0, $1, $2) {
+				return $1 + _unescape(src) + $2;
+			});
+			full = full.replace(/\s+data-ke-src="[^"]*"/i, '');
+			return full;
+		})
+		.replace(/(<[^>]+\s)data-ke-(on\w+="[^"]*"[^>]*>)/ig, function(full, start, end) {
+			return start + end;
+		});
+	});
+	self.beforeSetHtml(function(html) {
+		if (_IE && _V <= 8) {
+			html = html.replace(/<input[^>]*>|<(select|button)[^>]*>[\s\S]*?<\/\1>/ig, function(full) {
+				var attrs = _getAttrList(full);
+				var styles = _getCssList(attrs.style || '');
+				if (styles.display == 'none') {
+					return '<div class="ke-display-none" data-ke-input-tag="' + escape(full) + '"></div>';
+				}
+				return full;
+			});
+		}
+		return html.replace(/<embed[^>]*type="([^"]+)"[^>]*>(?:<\/embed>)?/ig, function(full) {
+			var attrs = _getAttrList(full);
+			attrs.src = _undef(attrs.src, '');
+			attrs.width = _undef(attrs.width, 0);
+			attrs.height = _undef(attrs.height, 0);
+			return _mediaImg(self.themesPath + 'common/blank.gif', attrs);
+		})
+		.replace(/<a[^>]*name="([^"]+)"[^>]*>(?:<\/a>)?/ig, function(full) {
+			var attrs = _getAttrList(full);
+			if (attrs.href !== undefined) {
+				return full;
+			}
+			return '<img class="ke-anchor" src="' + self.themesPath + 'common/anchor.gif" data-ke-name="' + escape(attrs.name) + '" />';
+		})
+		.replace(/<script([^>]*)>([\s\S]*?)<\/script>/ig, function(full, attr, code) {
+			return '<div class="ke-script" data-ke-script-attr="' + escape(attr) + '">' + escape(code) + '</div>';
+		})
+		.replace(/<noscript([^>]*)>([\s\S]*?)<\/noscript>/ig, function(full, attr, code) {
+			return '<div class="ke-noscript" data-ke-noscript-attr="' + escape(attr) + '">' + escape(code) + '</div>';
+		})
+		.replace(/(<[^>]*)(href|src)="([^"]*)"([^>]*>)/ig, function(full, start, key, src, end) {
+			if (full.match(/\sdata-ke-src="[^"]*"/i)) {
+				return full;
+			}
+			full = start + key + '="' + src + '"' + ' data-ke-src="' + _escape(src) + '"' + end;
+			return full;
+		})
+		.replace(/(<[^>]+\s)(on\w+="[^"]*"[^>]*>)/ig, function(full, start, end) {
+			return start + 'data-ke-' + end;
+		})
+		.replace(/<table[^>]*\s+border="0"[^>]*>/ig, function(full) {
+			if (full.indexOf('ke-zeroborder') >= 0) {
+				return full;
+			}
+			return _addClassToTag(full, 'ke-zeroborder');
+		});
+	});
+});
+})(window);
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.lang({
+	source : 'HTML浠g爜',
+	preview : '棰勮',
+	undo : '鍚庨��(Ctrl+Z)',
+	redo : '鍓嶈繘(Ctrl+Y)',
+	cut : '鍓垏(Ctrl+X)',
+	copy : '澶嶅埗(Ctrl+C)',
+	paste : '绮樿创(Ctrl+V)',
+	plainpaste : '绮樿创涓烘棤鏍煎紡鏂囨湰',
+	wordpaste : '浠嶹ord绮樿创',
+	selectall : '鍏ㄩ��(Ctrl+A)',
+	justifyleft : '宸﹀榻�',
+	justifycenter : '灞呬腑',
+	justifyright : '鍙冲榻�',
+	justifyfull : '涓ょ瀵归綈',
+	insertorderedlist : '缂栧彿',
+	insertunorderedlist : '椤圭洰绗﹀彿',
+	indent : '澧炲姞缂╄繘',
+	outdent : '鍑忓皯缂╄繘',
+	subscript : '涓嬫爣',
+	superscript : '涓婃爣',
+	formatblock : '娈佃惤',
+	fontname : '瀛椾綋',
+	fontsize : '鏂囧瓧澶у皬',
+	forecolor : '鏂囧瓧棰滆壊',
+	hilitecolor : '鏂囧瓧鑳屾櫙',
+	bold : '绮椾綋(Ctrl+B)',
+	italic : '鏂滀綋(Ctrl+I)',
+	underline : '涓嬪垝绾�(Ctrl+U)',
+	strikethrough : '鍒犻櫎绾�',
+	removeformat : '鍒犻櫎鏍煎紡',
+	image : '鍥剧墖',
+	multiimage : '鎵归噺鍥剧墖涓婁紶',
+	flash : 'Flash',
+	media : '瑙嗛煶棰�',
+	table : '琛ㄦ牸',
+	tablecell : '鍗曞厓鏍�',
+	hr : '鎻掑叆妯嚎',
+	emoticons : '鎻掑叆琛ㄦ儏',
+	link : '瓒呯骇閾炬帴',
+	unlink : '鍙栨秷瓒呯骇閾炬帴',
+	fullscreen : '鍏ㄥ睆鏄剧ず',
+	about : '鍏充簬',
+	print : '鎵撳嵃(Ctrl+P)',
+	filemanager : '鏂囦欢绌洪棿',
+	code : '鎻掑叆绋嬪簭浠g爜',
+	map : 'Google鍦板浘',
+	baidumap : '鐧惧害鍦板浘',
+	lineheight : '琛岃窛',
+	clearhtml : '娓呯悊HTML浠g爜',
+	pagebreak : '鎻掑叆鍒嗛〉绗�',
+	quickformat : '涓�閿帓鐗�',
+	insertfile : '鎻掑叆鏂囦欢',
+	template : '鎻掑叆妯℃澘',
+	anchor : '閿氱偣',
+	yes : '纭畾',
+	no : '鍙栨秷',
+	close : '鍏抽棴',
+	editImage : '鍥剧墖灞炴��',
+	deleteImage : '鍒犻櫎鍥剧墖',
+	editFlash : 'Flash灞炴��',
+	deleteFlash : '鍒犻櫎Flash',
+	editMedia : '瑙嗛煶棰戝睘鎬�',
+	deleteMedia : '鍒犻櫎瑙嗛煶棰�',
+	editLink : '瓒呯骇閾炬帴灞炴��',
+	deleteLink : '鍙栨秷瓒呯骇閾炬帴',
+	editAnchor : '閿氱偣灞炴��',
+	deleteAnchor : '鍒犻櫎閿氱偣',
+	tableprop : '琛ㄦ牸灞炴��',
+	tablecellprop : '鍗曞厓鏍煎睘鎬�',
+	tableinsert : '鎻掑叆琛ㄦ牸',
+	tabledelete : '鍒犻櫎琛ㄦ牸',
+	tablecolinsertleft : '宸︿晶鎻掑叆鍒�',
+	tablecolinsertright : '鍙充晶鎻掑叆鍒�',
+	tablerowinsertabove : '涓婃柟鎻掑叆琛�',
+	tablerowinsertbelow : '涓嬫柟鎻掑叆琛�',
+	tablerowmerge : '鍚戜笅鍚堝苟鍗曞厓鏍�',
+	tablecolmerge : '鍚戝彸鍚堝苟鍗曞厓鏍�',
+	tablerowsplit : '鎷嗗垎琛�',
+	tablecolsplit : '鎷嗗垎鍒�',
+	tablecoldelete : '鍒犻櫎鍒�',
+	tablerowdelete : '鍒犻櫎琛�',
+	noColor : '鏃犻鑹�',
+	pleaseSelectFile : '璇烽�夋嫨鏂囦欢銆�',
+	invalidImg : "璇疯緭鍏ユ湁鏁堢殑URL鍦板潃銆俓n鍙厑璁竕pg,gif,bmp,png鏍煎紡銆�",
+	invalidMedia : "璇疯緭鍏ユ湁鏁堢殑URL鍦板潃銆俓n鍙厑璁竤wf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb鏍煎紡銆�",
+	invalidWidth : "瀹藉害蹇呴』涓烘暟瀛椼��",
+	invalidHeight : "楂樺害蹇呴』涓烘暟瀛椼��",
+	invalidBorder : "杈规蹇呴』涓烘暟瀛椼��",
+	invalidUrl : "璇疯緭鍏ユ湁鏁堢殑URL鍦板潃銆�",
+	invalidRows : '琛屾暟涓哄繀閫夐」锛屽彧鍏佽杈撳叆澶т簬0鐨勬暟瀛椼��',
+	invalidCols : '鍒楁暟涓哄繀閫夐」锛屽彧鍏佽杈撳叆澶т簬0鐨勬暟瀛椼��',
+	invalidPadding : '杈硅窛蹇呴』涓烘暟瀛椼��',
+	invalidSpacing : '闂磋窛蹇呴』涓烘暟瀛椼��',
+	invalidJson : '鏈嶅姟鍣ㄥ彂鐢熸晠闅溿��',
+	uploadSuccess : '涓婁紶鎴愬姛銆�',
+	cutError : '鎮ㄧ殑娴忚鍣ㄥ畨鍏ㄨ缃笉鍏佽浣跨敤鍓垏鎿嶄綔锛岃浣跨敤蹇嵎閿�(Ctrl+X)鏉ュ畬鎴愩��',
+	copyError : '鎮ㄧ殑娴忚鍣ㄥ畨鍏ㄨ缃笉鍏佽浣跨敤澶嶅埗鎿嶄綔锛岃浣跨敤蹇嵎閿�(Ctrl+C)鏉ュ畬鎴愩��',
+	pasteError : '鎮ㄧ殑娴忚鍣ㄥ畨鍏ㄨ缃笉鍏佽浣跨敤绮樿创鎿嶄綔锛岃浣跨敤蹇嵎閿�(Ctrl+V)鏉ュ畬鎴愩��',
+	ajaxLoading : '鍔犺浇涓紝璇风◢鍊� ...',
+	uploadLoading : '涓婁紶涓紝璇风◢鍊� ...',
+	uploadError : '涓婁紶閿欒',
+	'plainpaste.comment' : '璇蜂娇鐢ㄥ揩鎹烽敭(Ctrl+V)鎶婂唴瀹圭矘璐村埌涓嬮潰鐨勬柟妗嗛噷銆�',
+	'wordpaste.comment' : '璇蜂娇鐢ㄥ揩鎹烽敭(Ctrl+V)鎶婂唴瀹圭矘璐村埌涓嬮潰鐨勬柟妗嗛噷銆�',
+	'code.pleaseInput' : '璇疯緭鍏ョ▼搴忎唬鐮併��',
+	'link.url' : 'URL',
+	'link.linkType' : '鎵撳紑绫诲瀷',
+	'link.newWindow' : '鏂扮獥鍙�',
+	'link.selfWindow' : '褰撳墠绐楀彛',
+	'flash.url' : 'URL',
+	'flash.width' : '瀹藉害',
+	'flash.height' : '楂樺害',
+	'flash.upload' : '涓婁紶',
+	'flash.viewServer' : '鏂囦欢绌洪棿',
+	'media.url' : 'URL',
+	'media.width' : '瀹藉害',
+	'media.height' : '楂樺害',
+	'media.autostart' : '鑷姩鎾斁',
+	'media.upload' : '涓婁紶',
+	'media.viewServer' : '鏂囦欢绌洪棿',
+	'image.remoteImage' : '缃戠粶鍥剧墖',
+	'image.localImage' : '鏈湴涓婁紶',
+	'image.remoteUrl' : '鍥剧墖鍦板潃',
+	'image.localUrl' : '涓婁紶鏂囦欢',
+	'image.size' : '鍥剧墖澶у皬',
+	'image.width' : '瀹�',
+	'image.height' : '楂�',
+	'image.resetSize' : '閲嶇疆澶у皬',
+	'image.align' : '瀵归綈鏂瑰紡',
+	'image.defaultAlign' : '榛樿鏂瑰紡',
+	'image.leftAlign' : '宸﹀榻�',
+	'image.rightAlign' : '鍙冲榻�',
+	'image.imgTitle' : '鍥剧墖璇存槑',
+	'image.upload' : '娴忚...',
+	'image.viewServer' : '鍥剧墖绌洪棿',
+	'multiimage.uploadDesc' : '鍏佽鐢ㄦ埛鍚屾椂涓婁紶<%=uploadLimit%>寮犲浘鐗囷紝鍗曞紶鍥剧墖瀹归噺涓嶈秴杩�<%=sizeLimit%>',
+	'multiimage.startUpload' : '寮�濮嬩笂浼�',
+	'multiimage.clearAll' : '鍏ㄩ儴娓呯┖',
+	'multiimage.insertAll' : '鍏ㄩ儴鎻掑叆',
+	'multiimage.queueLimitExceeded' : '鏂囦欢鏁伴噺瓒呰繃闄愬埗銆�',
+	'multiimage.fileExceedsSizeLimit' : '鏂囦欢澶у皬瓒呰繃闄愬埗銆�',
+	'multiimage.zeroByteFile' : '鏃犳硶涓婁紶绌烘枃浠躲��',
+	'multiimage.invalidFiletype' : '鏂囦欢绫诲瀷涓嶆纭��',
+	'multiimage.unknownError' : '鍙戠敓寮傚父锛屾棤娉曚笂浼犮��',
+	'multiimage.pending' : '绛夊緟涓婁紶',
+	'multiimage.uploadError' : '涓婁紶澶辫触',
+	'filemanager.emptyFolder' : '绌烘枃浠跺す',
+	'filemanager.moveup' : '绉诲埌涓婁竴绾ф枃浠跺す',
+	'filemanager.viewType' : '鏄剧ず鏂瑰紡锛�',
+	'filemanager.viewImage' : '缂╃暐鍥�',
+	'filemanager.listImage' : '璇︾粏淇℃伅',
+	'filemanager.orderType' : '鎺掑簭鏂瑰紡锛�',
+	'filemanager.fileName' : '鍚嶇О',
+	'filemanager.fileSize' : '澶у皬',
+	'filemanager.fileType' : '绫诲瀷',
+	'insertfile.url' : 'URL',
+	'insertfile.title' : '鏂囦欢璇存槑',
+	'insertfile.upload' : '涓婁紶',
+	'insertfile.viewServer' : '鏂囦欢绌洪棿',
+	'table.cells' : '鍗曞厓鏍兼暟',
+	'table.rows' : '琛屾暟',
+	'table.cols' : '鍒楁暟',
+	'table.size' : '澶у皬',
+	'table.width' : '瀹藉害',
+	'table.height' : '楂樺害',
+	'table.percent' : '%',
+	'table.px' : 'px',
+	'table.space' : '杈硅窛闂磋窛',
+	'table.padding' : '杈硅窛',
+	'table.spacing' : '闂磋窛',
+	'table.align' : '瀵归綈鏂瑰紡',
+	'table.textAlign' : '姘村钩瀵归綈',
+	'table.verticalAlign' : '鍨傜洿瀵归綈',
+	'table.alignDefault' : '榛樿',
+	'table.alignLeft' : '宸﹀榻�',
+	'table.alignCenter' : '灞呬腑',
+	'table.alignRight' : '鍙冲榻�',
+	'table.alignTop' : '椤堕儴',
+	'table.alignMiddle' : '涓儴',
+	'table.alignBottom' : '搴曢儴',
+	'table.alignBaseline' : '鍩虹嚎',
+	'table.border' : '杈规',
+	'table.borderWidth' : '杈规',
+	'table.borderColor' : '棰滆壊',
+	'table.backgroundColor' : '鑳屾櫙棰滆壊',
+	'map.address' : '鍦板潃: ',
+	'map.search' : '鎼滅储',
+	'baidumap.address' : '鍦板潃: ',
+	'baidumap.search' : '鎼滅储',
+	'baidumap.insertDynamicMap' : '鎻掑叆鍔ㄦ�佸湴鍥�',
+	'anchor.name' : '閿氱偣鍚嶇О',
+	'formatblock.formatBlock' : {
+		h1 : '鏍囬 1',
+		h2 : '鏍囬 2',
+		h3 : '鏍囬 3',
+		h4 : '鏍囬 4',
+		p : '姝� 鏂�'
+	},
+	'fontname.fontName' : {
+		'SimSun' : '瀹嬩綋',
+		'NSimSun' : '鏂板畫浣�',
+		'FangSong_GB2312' : '浠垮畫_GB2312',
+		'KaiTi_GB2312' : '妤蜂綋_GB2312',
+		'SimHei' : '榛戜綋',
+		'Microsoft YaHei' : '寰蒋闆呴粦',
+		'Arial' : 'Arial',
+		'Arial Black' : 'Arial Black',
+		'Times New Roman' : 'Times New Roman',
+		'Courier New' : 'Courier New',
+		'Tahoma' : 'Tahoma',
+		'Verdana' : 'Verdana'
+	},
+	'lineheight.lineHeight' : [
+		{'1' : '鍗曞�嶈璺�'},
+		{'1.5' : '1.5鍊嶈璺�'},
+		{'2' : '2鍊嶈璺�'},
+		{'2.5' : '2.5鍊嶈璺�'},
+		{'3' : '3鍊嶈璺�'}
+	],
+	'template.selectTemplate' : '鍙�夋ā鏉�',
+	'template.replaceContent' : '鏇挎崲褰撳墠鍐呭',
+	'template.fileList' : {
+		'1.html' : '鍥剧墖鍜屾枃瀛�',
+		'2.html' : '琛ㄦ牸',
+		'3.html' : '椤圭洰缂栧彿'
+	}
+}, 'zh_CN');
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('anchor', function(K) {
+	var self = this, name = 'anchor', lang = self.lang(name + '.');
+	self.plugin.anchor = {
+		edit : function() {
+			var html = ['<div style="padding:20px;">',
+					'<div class="ke-dialog-row">',
+					'<label for="keName">' + lang.name + '</label>',
+					'<input class="ke-input-text" type="text" id="keName" name="name" value="" style="width:100px;" />',
+					'</div>',
+					'</div>'].join('');
+			var dialog = self.createDialog({
+				name : name,
+				width : 300,
+				title : self.lang(name),
+				body : html,
+				yesBtn : {
+					name : self.lang('yes'),
+					click : function(e) {
+						self.insertHtml('<a name="' + nameBox.val() + '">').hideDialog().focus();
+					}
+				}
+			});
+			var div = dialog.div,
+				nameBox = K('input[name="name"]', div);
+			var img = self.plugin.getSelectedAnchor();
+			if (img) {
+				nameBox.val(unescape(img.attr('data-ke-name')));
+			}
+			nameBox[0].focus();
+			nameBox[0].select();
+		},
+		'delete' : function() {
+			self.plugin.getSelectedAnchor().remove();
+		}
+	};
+	self.clickToolbar(name, self.plugin.anchor.edit);
+});
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+// Baidu Maps: http://dev.baidu.com/wiki/map/index.php?title=%E9%A6%96%E9%A1%B5
+
+KindEditor.plugin('baidumap', function(K) {
+	var self = this, name = 'baidumap', lang = self.lang(name + '.');
+	var mapWidth = K.undef(self.mapWidth, 558);
+	var mapHeight = K.undef(self.mapHeight, 360);
+	self.clickToolbar(name, function() {
+		var html = ['<div style="padding:10px 20px;">',
+			'<div class="ke-header">',
+			// left start
+			'<div class="ke-left">',
+			lang.address + ' <input id="kindeditor_plugin_map_address" name="address" class="ke-input-text" value="" style="width:200px;" /> ',
+			'<span class="ke-button-common ke-button-outer">',
+			'<input type="button" name="searchBtn" class="ke-button-common ke-button" value="' + lang.search + '" />',
+			'</span>',
+			'</div>',
+			// right start
+			'<div class="ke-right">',
+			'<input type="checkbox" id="keInsertDynamicMap" name="insertDynamicMap" value="1" /> <label for="keInsertDynamicMap">' + lang.insertDynamicMap + '</label>',
+			'</div>',
+			'<div class="ke-clearfix"></div>',
+			'</div>',
+			'<div class="ke-map" style="width:' + mapWidth + 'px;height:' + mapHeight + 'px;"></div>',
+			'</div>'].join('');
+		var dialog = self.createDialog({
+			name : name,
+			width : mapWidth + 42,
+			title : self.lang(name),
+			body : html,
+			yesBtn : {
+				name : self.lang('yes'),
+				click : function(e) {
+					var map = win.map;
+					var centerObj = map.getCenter();
+					var center = centerObj.lng + ',' + centerObj.lat;
+					var zoom = map.getZoom();
+					var url = [checkbox[0].checked ? self.pluginsPath + 'baidumap/index.html' : 'http://api.map.baidu.com/staticimage',
+						'?center=' + encodeURIComponent(center),
+						'&zoom=' + encodeURIComponent(zoom),
+						'&width=' + mapWidth,
+						'&height=' + mapHeight,
+						'&markers=' + encodeURIComponent(center),
+						'&markerStyles=' + encodeURIComponent('l,A')].join('');
+					if (checkbox[0].checked) {
+						self.insertHtml('<iframe src="' + url + '" frameborder="0" style="width:' + (mapWidth + 2) + 'px;height:' + (mapHeight + 2) + 'px;"></iframe>');
+					} else {
+						self.exec('insertimage', url);
+					}
+					self.hideDialog().focus();
+				}
+			},
+			beforeRemove : function() {
+				searchBtn.remove();
+				if (doc) {
+					doc.write('');
+				}
+				iframe.remove();
+			}
+		});
+		var div = dialog.div,
+			addressBox = K('[name="address"]', div),
+			searchBtn = K('[name="searchBtn"]', div),
+			checkbox = K('[name="insertDynamicMap"]', dialog.div),
+			win, doc;
+		var iframe = K('<iframe class="ke-textarea" frameborder="0" src="' + self.pluginsPath + 'baidumap/map.html" style="width:' + mapWidth + 'px;height:' + mapHeight + 'px;"></iframe>');
+		function ready() {
+			win = iframe[0].contentWindow;
+			doc = K.iframeDoc(iframe);
+		}
+		iframe.bind('load', function() {
+			iframe.unbind('load');
+			if (K.IE) {
+				ready();
+			} else {
+				setTimeout(ready, 0);
+			}
+		});
+		K('.ke-map', div).replaceWith(iframe);
+		// search map
+		searchBtn.click(function() {
+			win.search(addressBox.val());
+		});
+	});
+});
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('clearhtml', function(K) {
+	var self = this, name = 'clearhtml';
+	self.clickToolbar(name, function() {
+		self.focus();
+		var html = self.html();
+		html = html.replace(/(<script[^>]*>)([\s\S]*?)(<\/script>)/ig, '');
+		html = html.replace(/(<style[^>]*>)([\s\S]*?)(<\/style>)/ig, '');
+		html = K.formatHtml(html, {
+			a : ['href', 'target'],
+			embed : ['src', 'width', 'height', 'type', 'loop', 'autostart', 'quality', '.width', '.height', 'align', 'allowscriptaccess'],
+			img : ['src', 'width', 'height', 'border', 'alt', 'title', '.width', '.height'],
+			table : ['border'],
+			'td,th' : ['rowspan', 'colspan'],
+			'div,hr,br,tbody,tr,p,ol,ul,li,blockquote,h1,h2,h3,h4,h5,h6' : []
+		});
+		self.html(html);
+		self.cmd.selection(true);
+		self.addBookmark();
+	});
+});
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+// google code prettify: http://google-code-prettify.googlecode.com/
+// http://google-code-prettify.googlecode.com/
+
+KindEditor.plugin('code', function(K) {
+	var self = this, name = 'code';
+	self.clickToolbar(name, function() {
+		var lang = self.lang(name + '.'),
+			html = ['<div style="padding:10px 20px;">',
+				'<div class="ke-dialog-row">',
+				'<select class="ke-code-type">',
+				'<option value="js">JavaScript</option>',
+				'<option value="html">HTML</option>',
+				'<option value="css">CSS</option>',
+				'<option value="php">PHP</option>',
+				'<option value="pl">Perl</option>',
+				'<option value="py">Python</option>',
+				'<option value="rb">Ruby</option>',
+				'<option value="java">Java</option>',
+				'<option value="vb">ASP/VB</option>',
+				'<option value="cpp">C/C++</option>',
+				'<option value="cs">C#</option>',
+				'<option value="xml">XML</option>',
+				'<option value="bsh">Shell</option>',
+				'<option value="">Other</option>',
+				'</select>',
+				'</div>',
+				'<textarea class="ke-textarea" style="width:408px;height:260px;"></textarea>',
+				'</div>'].join(''),
+			dialog = self.createDialog({
+				name : name,
+				width : 450,
+				title : self.lang(name),
+				body : html,
+				yesBtn : {
+					name : self.lang('yes'),
+					click : function(e) {
+						var type = K('.ke-code-type', dialog.div).val(),
+							code = textarea.val(),
+							cls = type === '' ? '' :  ' lang-' + type,
+							html = '<pre class="prettyprint' + cls + '">\n' + K.escape(code) + '</pre> ';
+						if (K.trim(code) === '') {
+							alert(lang.pleaseInput);
+							textarea[0].focus();
+							return;
+						}
+						self.insertHtml(html).hideDialog().focus();
+					}
+				}
+			}),
+			textarea = K('textarea', dialog.div);
+		textarea[0].focus();
+	});
+});
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('emoticons', function(K) {
+	var self = this, name = 'emoticons',
+		path = (self.emoticonsPath || self.pluginsPath + 'emoticons/images/'),
+		allowPreview = self.allowPreviewEmoticons === undefined ? true : self.allowPreviewEmoticons,
+		currentPageNum = 1;
+	self.clickToolbar(name, function() {
+		var rows = 5, cols = 9, total = 135, startNum = 0,
+			cells = rows * cols, pages = Math.ceil(total / cells),
+			colsHalf = Math.floor(cols / 2),
+			wrapperDiv = K('<div class="ke-plugin-emoticons"></div>'),
+			elements = [],
+			menu = self.createMenu({
+				name : name,
+				beforeRemove : function() {
+					removeEvent();
+				}
+			});
+		menu.div.append(wrapperDiv);
+		var previewDiv, previewImg;
+		if (allowPreview) {
+			previewDiv = K('<div class="ke-preview"></div>').css('right', 0);
+			previewImg = K('<img class="ke-preview-img" src="' + path + startNum + '.gif" />');
+			wrapperDiv.append(previewDiv);
+			previewDiv.append(previewImg);
+		}
+		function bindCellEvent(cell, j, num) {
+			if (previewDiv) {
+				cell.mouseover(function() {
+					if (j > colsHalf) {
+						previewDiv.css('left', 0);
+						previewDiv.css('right', '');
+					} else {
+						previewDiv.css('left', '');
+						previewDiv.css('right', 0);
+					}
+					previewImg.attr('src', path + num + '.gif');
+					K(this).addClass('ke-on');
+				});
+			} else {
+				cell.mouseover(function() {
+					K(this).addClass('ke-on');
+				});
+			}
+			cell.mouseout(function() {
+				K(this).removeClass('ke-on');
+			});
+			cell.click(function(e) {
+				self.insertHtml('<img src="' + path + num + '.gif" border="0" alt="" />').hideMenu().focus();
+				e.stop();
+			});
+		}
+		function createEmoticonsTable(pageNum, parentDiv) {
+			var table = document.createElement('table');
+			parentDiv.append(table);
+			if (previewDiv) {
+				K(table).mouseover(function() {
+					previewDiv.show('block');
+				});
+				K(table).mouseout(function() {
+					previewDiv.hide();
+				});
+				elements.push(K(table));
+			}
+			table.className = 'ke-table';
+			table.cellPadding = 0;
+			table.cellSpacing = 0;
+			table.border = 0;
+			var num = (pageNum - 1) * cells + startNum;
+			for (var i = 0; i < rows; i++) {
+				var row = table.insertRow(i);
+				for (var j = 0; j < cols; j++) {
+					var cell = K(row.insertCell(j));
+					cell.addClass('ke-cell');
+					bindCellEvent(cell, j, num);
+					var span = K('<span class="ke-img"></span>')
+						.css('background-position', '-' + (24 * num) + 'px 0px')
+						.css('background-image', 'url(' + path + 'static.gif)');
+					cell.append(span);
+					elements.push(cell);
+					num++;
+				}
+			}
+			return table;
+		}
+		var table = createEmoticonsTable(currentPageNum, wrapperDiv);
+		function removeEvent() {
+			K.each(elements, function() {
+				this.unbind();
+			});
+		}
+		var pageDiv;
+		function bindPageEvent(el, pageNum) {
+			el.click(function(e) {
+				removeEvent();
+				table.parentNode.removeChild(table);
+				pageDiv.remove();
+				table = createEmoticonsTable(pageNum, wrapperDiv);
+				createPageTable(pageNum);
+				currentPageNum = pageNum;
+				e.stop();
+			});
+		}
+		function createPageTable(currentPageNum) {
+			pageDiv = K('<div class="ke-page"></div>');
+			wrapperDiv.append(pageDiv);
+			for (var pageNum = 1; pageNum <= pages; pageNum++) {
+				if (currentPageNum !== pageNum) {
+					var a = K('<a href="javascript:;">[' + pageNum + ']</a>');
+					bindPageEvent(a, pageNum);
+					pageDiv.append(a);
+					elements.push(a);
+				} else {
+					pageDiv.append(K('@[' + pageNum + ']'));
+				}
+				pageDiv.append(K('@&nbsp;'));
+			}
+		}
+		createPageTable(currentPageNum);
+	});
+});
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('filemanager', function(K) {
+	var self = this, name = 'filemanager',
+		fileManagerJson = K.undef(self.fileManagerJson, self.basePath + 'php/file_manager_json.php'),
+		imgPath = self.pluginsPath + name + '/images/',
+		lang = self.lang(name + '.');
+	function makeFileTitle(filename, filesize, datetime) {
+		return filename + ' (' + Math.ceil(filesize / 1024) + 'KB, ' + datetime + ')';
+	}
+	function bindTitle(el, data) {
+		if (data.is_dir) {
+			el.attr('title', data.filename);
+		} else {
+			el.attr('title', makeFileTitle(data.filename, data.filesize, data.datetime));
+		}
+	}
+	self.plugin.filemanagerDialog = function(options) {
+		var width = K.undef(options.width, 650),
+			height = K.undef(options.height, 510),
+			dirName = K.undef(options.dirName, ''),
+			viewType = K.undef(options.viewType, 'VIEW').toUpperCase(), // "LIST" or "VIEW"
+			clickFn = options.clickFn;
+		var html = [
+			'<div style="padding:10px 20px;">',
+			// header start
+			'<div class="ke-plugin-filemanager-header">',
+			// left start
+			'<div class="ke-left">',
+			'<img class="ke-inline-block" name="moveupImg" src="' + imgPath + 'go-up.gif" width="16" height="16" border="0" alt="" /> ',
+			'<a class="ke-inline-block" name="moveupLink" href="javascript:;">' + lang.moveup + '</a>',
+			'</div>',
+			// right start
+			'<div class="ke-right">',
+			lang.viewType + ' <select class="ke-inline-block" name="viewType">',
+			'<option value="VIEW">' + lang.viewImage + '</option>',
+			'<option value="LIST">' + lang.listImage + '</option>',
+			'</select> ',
+			lang.orderType + ' <select class="ke-inline-block" name="orderType">',
+			'<option value="NAME">' + lang.fileName + '</option>',
+			'<option value="SIZE">' + lang.fileSize + '</option>',
+			'<option value="TYPE">' + lang.fileType + '</option>',
+			'</select>',
+			'</div>',
+			'<div class="ke-clearfix"></div>',
+			'</div>',
+			// body start
+			'<div class="ke-plugin-filemanager-body"></div>',
+			'</div>'
+		].join('');
+		var dialog = self.createDialog({
+			name : name,
+			width : width,
+			height : height,
+			title : self.lang(name),
+			body : html
+		}),
+		div = dialog.div,
+		bodyDiv = K('.ke-plugin-filemanager-body', div),
+		moveupImg = K('[name="moveupImg"]', div),
+		moveupLink = K('[name="moveupLink"]', div),
+		viewServerBtn = K('[name="viewServer"]', div),
+		viewTypeBox = K('[name="viewType"]', div),
+		orderTypeBox = K('[name="orderType"]', div);
+		function reloadPage(path, order, func) {
+			var param = 'path=' + path + '&order=' + order + '&dir=' + dirName;
+			dialog.showLoading(self.lang('ajaxLoading'));
+			K.ajax(K.addParam(fileManagerJson, param + '&' + new Date().getTime()), function(data) {
+				dialog.hideLoading();
+				func(data);
+			});
+		}
+		var elList = [];
+		function bindEvent(el, result, data, createFunc) {
+			var fileUrl = K.formatUrl(result.current_url + data.filename, 'absolute'),
+				dirPath = encodeURIComponent(result.current_dir_path + data.filename + '/');
+			if (data.is_dir) {
+				el.click(function(e) {
+					reloadPage(dirPath, orderTypeBox.val(), createFunc);
+				});
+			} else if (data.is_photo) {
+				el.click(function(e) {
+					clickFn.call(this, fileUrl, data.filename);
+				});
+			} else {
+				el.click(function(e) {
+					clickFn.call(this, fileUrl, data.filename);
+				});
+			}
+			elList.push(el);
+		}
+		function createCommon(result, createFunc) {
+			// remove events
+			K.each(elList, function() {
+				this.unbind();
+			});
+			moveupLink.unbind();
+			viewTypeBox.unbind();
+			orderTypeBox.unbind();
+			// add events
+			if (result.current_dir_path) {
+				moveupLink.click(function(e) {
+					reloadPage(result.moveup_dir_path, orderTypeBox.val(), createFunc);
+				});
+			}
+			function changeFunc() {
+				if (viewTypeBox.val() == 'VIEW') {
+					reloadPage(result.current_dir_path, orderTypeBox.val(), createView);
+				} else {
+					reloadPage(result.current_dir_path, orderTypeBox.val(), createList);
+				}
+			}
+			viewTypeBox.change(changeFunc);
+			orderTypeBox.change(changeFunc);
+			bodyDiv.html('');
+		}
+		function createList(result) {
+			createCommon(result, createList);
+			var table = document.createElement('table');
+			table.className = 'ke-table';
+			table.cellPadding = 0;
+			table.cellSpacing = 0;
+			table.border = 0;
+			bodyDiv.append(table);
+			var fileList = result.file_list;
+			for (var i = 0, len = fileList.length; i < len; i++) {
+				var data = fileList[i], row = K(table.insertRow(i));
+				row.mouseover(function(e) {
+					K(this).addClass('ke-on');
+				})
+				.mouseout(function(e) {
+					K(this).removeClass('ke-on');
+				});
+				var iconUrl = imgPath + (data.is_dir ? 'folder-16.gif' : 'file-16.gif'),
+					img = K('<img src="' + iconUrl + '" width="16" height="16" alt="' + data.filename + '" align="absmiddle" />'),
+					cell0 = K(row[0].insertCell(0)).addClass('ke-cell ke-name').append(img).append(document.createTextNode(' ' + data.filename));
+				if (!data.is_dir || data.has_file) {
+					row.css('cursor', 'pointer');
+					cell0.attr('title', data.filename);
+					bindEvent(cell0, result, data, createList);
+				} else {
+					cell0.attr('title', lang.emptyFolder);
+				}
+				K(row[0].insertCell(1)).addClass('ke-cell ke-size').html(data.is_dir ? '-' : Math.ceil(data.filesize / 1024) + 'KB');
+				K(row[0].insertCell(2)).addClass('ke-cell ke-datetime').html(data.datetime);
+			}
+		}
+		function createView(result) {
+			createCommon(result, createView);
+			var fileList = result.file_list;
+			for (var i = 0, len = fileList.length; i < len; i++) {
+				var data = fileList[i],
+					div = K('<div class="ke-inline-block ke-item"></div>');
+				bodyDiv.append(div);
+				var photoDiv = K('<div class="ke-inline-block ke-photo"></div>')
+					.mouseover(function(e) {
+						K(this).addClass('ke-on');
+					})
+					.mouseout(function(e) {
+						K(this).removeClass('ke-on');
+					});
+				div.append(photoDiv);
+				var fileUrl = result.current_url + data.filename,
+					iconUrl = data.is_dir ? imgPath + 'folder-64.gif' : (data.is_photo ? fileUrl : imgPath + 'file-64.gif');
+				var img = K('<img src="' + iconUrl + '" width="80" height="80" alt="' + data.filename + '" />');
+				if (!data.is_dir || data.has_file) {
+					photoDiv.css('cursor', 'pointer');
+					bindTitle(photoDiv, data);
+					bindEvent(photoDiv, result, data, createView);
+				} else {
+					photoDiv.attr('title', lang.emptyFolder);
+				}
+				photoDiv.append(img);
+				div.append('<div class="ke-name" title="' + data.filename + '">' + data.filename + '</div>');
+			}
+		}
+		viewTypeBox.val(viewType);
+		reloadPage('', orderTypeBox.val(), viewType == 'VIEW' ? createView : createList);
+		return dialog;
+	}
+
+});
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('flash', function(K) {
+	var self = this, name = 'flash', lang = self.lang(name + '.'),
+		allowFlashUpload = K.undef(self.allowFlashUpload, true),
+		allowFileManager = K.undef(self.allowFileManager, false),
+		formatUploadUrl = K.undef(self.formatUploadUrl, true),
+		extraParams = K.undef(self.extraFileUploadParams, {}),
+		filePostName = K.undef(self.filePostName, 'imgFile'),
+		uploadJson = K.undef(self.uploadJson, self.basePath + 'php/upload_json.php');
+	self.plugin.flash = {
+		edit : function() {
+			var html = [
+				'<div style="padding:20px;">',
+				//url
+				'<div class="ke-dialog-row">',
+				'<label for="keUrl" style="width:60px;">' + lang.url + '</label>',
+				'<input class="ke-input-text" type="text" id="keUrl" name="url" value="" style="width:160px;" /> &nbsp;',
+				'<input type="button" class="ke-upload-button" value="' + lang.upload + '" /> &nbsp;',
+				'<span class="ke-button-common ke-button-outer">',
+				'<input type="button" class="ke-button-common ke-button" name="viewServer" value="' + lang.viewServer + '" />',
+				'</span>',
+				'</div>',
+				//width
+				'<div class="ke-dialog-row">',
+				'<label for="keWidth" style="width:60px;">' + lang.width + '</label>',
+				'<input type="text" id="keWidth" class="ke-input-text ke-input-number" name="width" value="550" maxlength="4" /> ',
+				'</div>',
+				//height
+				'<div class="ke-dialog-row">',
+				'<label for="keHeight" style="width:60px;">' + lang.height + '</label>',
+				'<input type="text" id="keHeight" class="ke-input-text ke-input-number" name="height" value="400" maxlength="4" /> ',
+				'</div>',
+				'</div>'
+			].join('');
+			var dialog = self.createDialog({
+				name : name,
+				width : 450,
+				title : self.lang(name),
+				body : html,
+				yesBtn : {
+					name : self.lang('yes'),
+					click : function(e) {
+						var url = K.trim(urlBox.val()),
+							width = widthBox.val(),
+							height = heightBox.val();
+						if (url == 'http://' || K.invalidUrl(url)) {
+							alert(self.lang('invalidUrl'));
+							urlBox[0].focus();
+							return;
+						}
+						if (!/^\d*$/.test(width)) {
+							alert(self.lang('invalidWidth'));
+							widthBox[0].focus();
+							return;
+						}
+						if (!/^\d*$/.test(height)) {
+							alert(self.lang('invalidHeight'));
+							heightBox[0].focus();
+							return;
+						}
+						var html = K.mediaImg(self.themesPath + 'common/blank.gif', {
+								src : url,
+								type : K.mediaType('.swf'),
+								width : width,
+								height : height,
+								quality : 'high'
+							});
+						self.insertHtml(html).hideDialog().focus();
+					}
+				}
+			}),
+			div = dialog.div,
+			urlBox = K('[name="url"]', div),
+			viewServerBtn = K('[name="viewServer"]', div),
+			widthBox = K('[name="width"]', div),
+			heightBox = K('[name="height"]', div);
+			urlBox.val('http://');
+
+			if (allowFlashUpload) {
+				var uploadbutton = K.uploadbutton({
+					button : K('.ke-upload-button', div)[0],
+					fieldName : filePostName,
+					extraParams : extraParams,
+					url : K.addParam(uploadJson, 'dir=flash'),
+					afterUpload : function(data) {
+						dialog.hideLoading();
+						if (data.error === 0) {
+							var url = data.url;
+							if (formatUploadUrl) {
+								url = K.formatUrl(url, 'absolute');
+							}
+							urlBox.val(url);
+							if (self.afterUpload) {
+								self.afterUpload.call(self, url, data, name);
+							}
+							alert(self.lang('uploadSuccess'));
+						} else {
+							alert(data.message);
+						}
+					},
+					afterError : function(html) {
+						dialog.hideLoading();
+						self.errorDialog(html);
+					}
+				});
+				uploadbutton.fileBox.change(function(e) {
+					dialog.showLoading(self.lang('uploadLoading'));
+					uploadbutton.submit();
+				});
+			} else {
+				K('.ke-upload-button', div).hide();
+			}
+
+			if (allowFileManager) {
+				viewServerBtn.click(function(e) {
+					self.loadPlugin('filemanager', function() {
+						self.plugin.filemanagerDialog({
+							viewType : 'LIST',
+							dirName : 'flash',
+							clickFn : function(url, title) {
+								if (self.dialogs.length > 1) {
+									K('[name="url"]', div).val(url);
+									if (self.afterSelectFile) {
+										self.afterSelectFile.call(self, url);
+									}
+									self.hideDialog();
+								}
+							}
+						});
+					});
+				});
+			} else {
+				viewServerBtn.hide();
+			}
+
+			var img = self.plugin.getSelectedFlash();
+			if (img) {
+				var attrs = K.mediaAttrs(img.attr('data-ke-tag'));
+				urlBox.val(attrs.src);
+				widthBox.val(K.removeUnit(img.css('width')) || attrs.width || 0);
+				heightBox.val(K.removeUnit(img.css('height')) || attrs.height || 0);
+			}
+			urlBox[0].focus();
+			urlBox[0].select();
+		},
+		'delete' : function() {
+			self.plugin.getSelectedFlash().remove();
+			// [IE] 鍒犻櫎鍥剧墖鍚庣珛鍗崇偣鍑诲浘鐗囨寜閽嚭閿�
+			self.addBookmark();
+		}
+	};
+	self.clickToolbar(name, self.plugin.flash.edit);
+});
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('image', function(K) {
+	var self = this, name = 'image',
+		allowImageUpload = K.undef(self.allowImageUpload, true),
+		allowImageRemote = K.undef(self.allowImageRemote, true),
+		formatUploadUrl = K.undef(self.formatUploadUrl, true),
+		allowFileManager = K.undef(self.allowFileManager, false),
+		uploadJson = K.undef(self.uploadJson, self.basePath + 'php/upload_json.php'),
+		imageTabIndex = K.undef(self.imageTabIndex, 0),
+		imgPath = self.pluginsPath + 'image/images/',
+		extraParams = K.undef(self.extraFileUploadParams, {}),
+		filePostName = K.undef(self.filePostName, 'imgFile'),
+		fillDescAfterUploadImage = K.undef(self.fillDescAfterUploadImage, false),
+		lang = self.lang(name + '.');
+
+	self.plugin.imageDialog = function(options) {
+		var imageUrl = options.imageUrl,
+			imageWidth = K.undef(options.imageWidth, ''),
+			imageHeight = K.undef(options.imageHeight, ''),
+			imageTitle = K.undef(options.imageTitle, ''),
+			imageAlign = K.undef(options.imageAlign, ''),
+			showRemote = K.undef(options.showRemote, true),
+			showLocal = K.undef(options.showLocal, true),
+			tabIndex = K.undef(options.tabIndex, 0),
+			clickFn = options.clickFn;
+		var target = 'kindeditor_upload_iframe_' + new Date().getTime();
+		var hiddenElements = [];
+		for(var k in extraParams){
+			hiddenElements.push('<input type="hidden" name="' + k + '" value="' + extraParams[k] + '" />');
+		}
+		var html = [
+			'<div style="padding:20px;">',
+			//tabs
+			'<div class="tabs"></div>',
+			//remote image - start
+			'<div class="tab1" style="display:none;">',
+			//url
+			'<div class="ke-dialog-row">',
+			'<label for="remoteUrl" style="width:60px;">' + lang.remoteUrl + '</label>',
+			'<input type="text" id="remoteUrl" class="ke-input-text" name="url" value="" style="width:200px;" /> &nbsp;',
+			'<span class="ke-button-common ke-button-outer">',
+			'<input type="button" class="ke-button-common ke-button" name="viewServer" value="' + lang.viewServer + '" />',
+			'</span>',
+			'</div>',
+			//size
+			'<div class="ke-dialog-row">',
+			'<label for="remoteWidth" style="width:60px;">' + lang.size + '</label>',
+			lang.width + ' <input type="text" id="remoteWidth" class="ke-input-text ke-input-number" name="width" value="" maxlength="4" /> ',
+			lang.height + ' <input type="text" class="ke-input-text ke-input-number" name="height" value="" maxlength="4" /> ',
+			'<img class="ke-refresh-btn" src="' + imgPath + 'refresh.png" width="16" height="16" alt="" style="cursor:pointer;" title="' + lang.resetSize + '" />',
+			'</div>',
+			//align
+			'<div class="ke-dialog-row">',
+			'<label style="width:60px;">' + lang.align + '</label>',
+			'<input type="radio" name="align" class="ke-inline-block" value="" checked="checked" /> <img name="defaultImg" src="' + imgPath + 'align_top.gif" width="23" height="25" alt="" />',
+			' <input type="radio" name="align" class="ke-inline-block" value="left" /> <img name="leftImg" src="' + imgPath + 'align_left.gif" width="23" height="25" alt="" />',
+			' <input type="radio" name="align" class="ke-inline-block" value="right" /> <img name="rightImg" src="' + imgPath + 'align_right.gif" width="23" height="25" alt="" />',
+			'</div>',
+			//title
+			'<div class="ke-dialog-row">',
+			'<label for="remoteTitle" style="width:60px;">' + lang.imgTitle + '</label>',
+			'<input type="text" id="remoteTitle" class="ke-input-text" name="title" value="" style="width:200px;" />',
+			'</div>',
+			'</div>',
+			//remote image - end
+			//local upload - start
+			'<div class="tab2" style="display:none;">',
+			'<iframe name="' + target + '" style="display:none;"></iframe>',
+			'<form class="ke-upload-area ke-form" method="post" enctype="multipart/form-data" target="' + target + '" action="' + K.addParam(uploadJson, 'dir=image') + '">',
+			//file
+			'<div class="ke-dialog-row">',
+			hiddenElements.join(''),
+			'<label style="width:60px;">' + lang.localUrl + '</label>',
+			'<input type="text" name="localUrl" class="ke-input-text" tabindex="-1" style="width:200px;" readonly="true" /> &nbsp;',
+			'<input type="button" class="ke-upload-button" value="' + lang.upload + '" />',
+			'</div>',
+			'</form>',
+			'</div>',
+			//local upload - end
+			'</div>'
+		].join('');
+		var dialogWidth = showLocal || allowFileManager ? 450 : 400,
+			dialogHeight = showLocal && showRemote ? 300 : 250;
+		var dialog = self.createDialog({
+			name : name,
+			width : dialogWidth,
+			height : dialogHeight,
+			title : self.lang(name),
+			body : html,
+			yesBtn : {
+				name : self.lang('yes'),
+				click : function(e) {
+					// Bugfix: http://code.google.com/p/kindeditor/issues/detail?id=319
+					if (dialog.isLoading) {
+						return;
+					}
+					// insert local image
+					if (showLocal && showRemote && tabs && tabs.selectedIndex === 1 || !showRemote) {
+						if (uploadbutton.fileBox.val() == '') {
+							alert(self.lang('pleaseSelectFile'));
+							return;
+						}
+						dialog.showLoading(self.lang('uploadLoading'));
+						uploadbutton.submit();
+						localUrlBox.val('');
+						return;
+					}
+					// insert remote image
+					var url = K.trim(urlBox.val()),
+						width = widthBox.val(),
+						height = heightBox.val(),
+						title = titleBox.val(),
+						align = '';
+					alignBox.each(function() {
+						if (this.checked) {
+							align = this.value;
+							return false;
+						}
+					});
+					if (url == 'http://' || K.invalidUrl(url)) {
+						alert(self.lang('invalidUrl'));
+						urlBox[0].focus();
+						return;
+					}
+					if (!/^\d*$/.test(width)) {
+						alert(self.lang('invalidWidth'));
+						widthBox[0].focus();
+						return;
+					}
+					if (!/^\d*$/.test(height)) {
+						alert(self.lang('invalidHeight'));
+						heightBox[0].focus();
+						return;
+					}
+					clickFn.call(self, url, title, width, height, 0, align);
+				}
+			},
+			beforeRemove : function() {
+				viewServerBtn.unbind();
+				widthBox.unbind();
+				heightBox.unbind();
+				refreshBtn.unbind();
+			}
+		}),
+		div = dialog.div;
+
+		var urlBox = K('[name="url"]', div),
+			localUrlBox = K('[name="localUrl"]', div),
+			viewServerBtn = K('[name="viewServer"]', div),
+			widthBox = K('.tab1 [name="width"]', div),
+			heightBox = K('.tab1 [name="height"]', div),
+			refreshBtn = K('.ke-refresh-btn', div),
+			titleBox = K('.tab1 [name="title"]', div),
+			alignBox = K('.tab1 [name="align"]', div);
+
+		var tabs;
+		if (showRemote && showLocal) {
+			tabs = K.tabs({
+				src : K('.tabs', div),
+				afterSelect : function(i) {}
+			});
+			tabs.add({
+				title : lang.remoteImage,
+				panel : K('.tab1', div)
+			});
+			tabs.add({
+				title : lang.localImage,
+				panel : K('.tab2', div)
+			});
+			tabs.select(tabIndex);
+		} else if (showRemote) {
+			K('.tab1', div).show();
+		} else if (showLocal) {
+			K('.tab2', div).show();
+		}
+
+		var uploadbutton = K.uploadbutton({
+			button : K('.ke-upload-button', div)[0],
+			fieldName : filePostName,
+			form : K('.ke-form', div),
+			target : target,
+			width: 60,
+			afterUpload : function(data) {
+				dialog.hideLoading();
+				if (data.error === 0) {
+					var url = data.url;
+					if (formatUploadUrl) {
+						url = K.formatUrl(url, 'absolute');
+					}
+					if (self.afterUpload) {
+						self.afterUpload.call(self, url, data, name);
+					}
+					if (!fillDescAfterUploadImage) {
+						clickFn.call(self, url, data.title, data.width, data.height, data.border, data.align);
+					} else {
+						K(".ke-dialog-row #remoteUrl", div).val(url);
+						K(".ke-tabs-li", div)[0].click();
+						K(".ke-refresh-btn", div).click();
+					}
+				} else {
+					alert(data.message);
+				}
+			},
+			afterError : function(html) {
+				dialog.hideLoading();
+				self.errorDialog(html);
+			}
+		});
+		uploadbutton.fileBox.change(function(e) {
+			localUrlBox.val(uploadbutton.fileBox.val());
+		});
+		if (allowFileManager) {
+			viewServerBtn.click(function(e) {
+				self.loadPlugin('filemanager', function() {
+					self.plugin.filemanagerDialog({
+						viewType : 'VIEW',
+						dirName : 'image',
+						clickFn : function(url, title) {
+							if (self.dialogs.length > 1) {
+								K('[name="url"]', div).val(url);
+								if (self.afterSelectFile) {
+									self.afterSelectFile.call(self, url);
+								}
+								self.hideDialog();
+							}
+						}
+					});
+				});
+			});
+		} else {
+			viewServerBtn.hide();
+		}
+		var originalWidth = 0, originalHeight = 0;
+		function setSize(width, height) {
+			widthBox.val(width);
+			heightBox.val(height);
+			originalWidth = width;
+			originalHeight = height;
+		}
+		refreshBtn.click(function(e) {
+			var tempImg = K('<img src="' + urlBox.val() + '" />', document).css({
+				position : 'absolute',
+				visibility : 'hidden',
+				top : 0,
+				left : '-1000px'
+			});
+			tempImg.bind('load', function() {
+				setSize(tempImg.width(), tempImg.height());
+				tempImg.remove();
+			});
+			K(document.body).append(tempImg);
+		});
+		widthBox.change(function(e) {
+			if (originalWidth > 0) {
+				heightBox.val(Math.round(originalHeight / originalWidth * parseInt(this.value, 10)));
+			}
+		});
+		heightBox.change(function(e) {
+			if (originalHeight > 0) {
+				widthBox.val(Math.round(originalWidth / originalHeight * parseInt(this.value, 10)));
+			}
+		});
+		urlBox.val(options.imageUrl);
+		setSize(options.imageWidth, options.imageHeight);
+		titleBox.val(options.imageTitle);
+		alignBox.each(function() {
+			if (this.value === options.imageAlign) {
+				this.checked = true;
+				return false;
+			}
+		});
+		if (showRemote && tabIndex === 0) {
+			urlBox[0].focus();
+			urlBox[0].select();
+		}
+		return dialog;
+	};
+	self.plugin.image = {
+		edit : function() {
+			var img = self.plugin.getSelectedImage();
+			self.plugin.imageDialog({
+				imageUrl : img ? img.attr('data-ke-src') : 'http://',
+				imageWidth : img ? img.width() : '',
+				imageHeight : img ? img.height() : '',
+				imageTitle : img ? img.attr('title') : '',
+				imageAlign : img ? img.attr('align') : '',
+				showRemote : allowImageRemote,
+				showLocal : allowImageUpload,
+				tabIndex: img ? 0 : imageTabIndex,
+				clickFn : function(url, title, width, height, border, align) {
+					self.exec('insertimage', url, title, width, height, border, align);
+					// Bugfix: [Firefox] 涓婁紶鍥剧墖鍚庯紝鎬绘槸鍑虹幇姝e湪鍔犺浇鐨勬牱寮忥紝闇�瑕佸欢杩熸墽琛宧ideDialog
+					setTimeout(function() {
+						self.hideDialog().focus();
+					}, 0);
+				}
+			});
+		},
+		'delete' : function() {
+			var target = self.plugin.getSelectedImage();
+			if (target.parent().name == 'a') {
+				target = target.parent();
+			}
+			target.remove();
+			// [IE] 鍒犻櫎鍥剧墖鍚庣珛鍗崇偣鍑诲浘鐗囨寜閽嚭閿�
+			self.addBookmark();
+		}
+	};
+	self.clickToolbar(name, self.plugin.image.edit);
+});
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('insertfile', function(K) {
+	var self = this, name = 'insertfile',
+		allowFileUpload = K.undef(self.allowFileUpload, true),
+		allowFileManager = K.undef(self.allowFileManager, false),
+		formatUploadUrl = K.undef(self.formatUploadUrl, true),
+		uploadJson = K.undef(self.uploadJson, self.basePath + 'php/upload_json.php'),
+		extraParams = K.undef(self.extraFileUploadParams, {}),
+		filePostName = K.undef(self.filePostName, 'imgFile'),
+		lang = self.lang(name + '.');
+	self.plugin.fileDialog = function(options) {
+		var fileUrl = K.undef(options.fileUrl, 'http://'),
+			fileTitle = K.undef(options.fileTitle, ''),
+			clickFn = options.clickFn;
+		var html = [
+			'<div style="padding:20px;">',
+			'<div class="ke-dialog-row">',
+			'<label for="keUrl" style="width:60px;">' + lang.url + '</label>',
+			'<input type="text" id="keUrl" name="url" class="ke-input-text" style="width:160px;" /> &nbsp;',
+			'<input type="button" class="ke-upload-button" value="' + lang.upload + '" /> &nbsp;',
+			'<span class="ke-button-common ke-button-outer">',
+			'<input type="button" class="ke-button-common ke-button" name="viewServer" value="' + lang.viewServer + '" />',
+			'</span>',
+			'</div>',
+			//title
+			'<div class="ke-dialog-row">',
+			'<label for="keTitle" style="width:60px;">' + lang.title + '</label>',
+			'<input type="text" id="keTitle" class="ke-input-text" name="title" value="" style="width:160px;" /></div>',
+			'</div>',
+			//form end
+			'</form>',
+			'</div>'
+			].join('');
+		var dialog = self.createDialog({
+			name : name,
+			width : 450,
+			title : self.lang(name),
+			body : html,
+			yesBtn : {
+				name : self.lang('yes'),
+				click : function(e) {
+					var url = K.trim(urlBox.val()),
+						title = titleBox.val();
+					if (url == 'http://' || K.invalidUrl(url)) {
+						alert(self.lang('invalidUrl'));
+						urlBox[0].focus();
+						return;
+					}
+					if (K.trim(title) === '') {
+						title = url;
+					}
+					clickFn.call(self, url, title);
+				}
+			}
+		}),
+		div = dialog.div;
+
+		var urlBox = K('[name="url"]', div),
+			viewServerBtn = K('[name="viewServer"]', div),
+			titleBox = K('[name="title"]', div);
+
+		if (allowFileUpload) {
+			var uploadbutton = K.uploadbutton({
+				button : K('.ke-upload-button', div)[0],
+				fieldName : filePostName,
+				url : K.addParam(uploadJson, 'dir=file'),
+				extraParams : extraParams,
+				afterUpload : function(data) {
+					dialog.hideLoading();
+					if (data.error === 0) {
+						var url = data.url;
+						if (formatUploadUrl) {
+							url = K.formatUrl(url, 'absolute');
+						}
+						urlBox.val(url);
+						if (self.afterUpload) {
+							self.afterUpload.call(self, url, data, name);
+						}
+						alert(self.lang('uploadSuccess'));
+					} else {
+						alert(data.message);
+					}
+				},
+				afterError : function(html) {
+					dialog.hideLoading();
+					self.errorDialog(html);
+				}
+			});
+			uploadbutton.fileBox.change(function(e) {
+				dialog.showLoading(self.lang('uploadLoading'));
+				uploadbutton.submit();
+			});
+		} else {
+			K('.ke-upload-button', div).hide();
+		}
+		if (allowFileManager) {
+			viewServerBtn.click(function(e) {
+				self.loadPlugin('filemanager', function() {
+					self.plugin.filemanagerDialog({
+						viewType : 'LIST',
+						dirName : 'file',
+						clickFn : function(url, title) {
+							if (self.dialogs.length > 1) {
+								K('[name="url"]', div).val(url);
+								if (self.afterSelectFile) {
+									self.afterSelectFile.call(self, url);
+								}
+								self.hideDialog();
+							}
+						}
+					});
+				});
+			});
+		} else {
+			viewServerBtn.hide();
+		}
+		urlBox.val(fileUrl);
+		titleBox.val(fileTitle);
+		urlBox[0].focus();
+		urlBox[0].select();
+	};
+	self.clickToolbar(name, function() {
+		self.plugin.fileDialog({
+			clickFn : function(url, title) {
+				var html = '<a class="ke-insertfile" href="' + url + '" data-ke-src="' + url + '" target="_blank">' + title + '</a>';
+				self.insertHtml(html).hideDialog().focus();
+			}
+		});
+	});
+});
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('lineheight', function(K) {
+	var self = this, name = 'lineheight', lang = self.lang(name + '.');
+	self.clickToolbar(name, function() {
+		var curVal = '', commonNode = self.cmd.commonNode({'*' : '.line-height'});
+		if (commonNode) {
+			curVal = commonNode.css('line-height');
+		}
+		var menu = self.createMenu({
+			name : name,
+			width : 150
+		});
+		K.each(lang.lineHeight, function(i, row) {
+			K.each(row, function(key, val) {
+				menu.addItem({
+					title : val,
+					checked : curVal === key,
+					click : function() {
+						self.cmd.toggle('<span style="line-height:' + key + ';"></span>', {
+							span : '.line-height=' + key
+						});
+						self.updateState();
+						self.addBookmark();
+						self.hideMenu();
+					}
+				});
+			});
+		});
+	});
+});
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('link', function(K) {
+	var self = this, name = 'link';
+	self.plugin.link = {
+		edit : function() {
+			var lang = self.lang(name + '.'),
+				html = '<div style="padding:20px;">' +
+					//url
+					'<div class="ke-dialog-row">' +
+					'<label for="keUrl" style="width:60px;">' + lang.url + '</label>' +
+					'<input class="ke-input-text" type="text" id="keUrl" name="url" value="" style="width:260px;" /></div>' +
+					//type
+					'<div class="ke-dialog-row"">' +
+					'<label for="keType" style="width:60px;">' + lang.linkType + '</label>' +
+					'<select id="keType" name="type"></select>' +
+					'</div>' +
+					'</div>',
+				dialog = self.createDialog({
+					name : name,
+					width : 450,
+					title : self.lang(name),
+					body : html,
+					yesBtn : {
+						name : self.lang('yes'),
+						click : function(e) {
+							var url = K.trim(urlBox.val());
+							if (url == 'http://' || K.invalidUrl(url)) {
+								alert(self.lang('invalidUrl'));
+								urlBox[0].focus();
+								return;
+							}
+							self.exec('createlink', url, typeBox.val()).hideDialog().focus();
+						}
+					}
+				}),
+				div = dialog.div,
+				urlBox = K('input[name="url"]', div),
+				typeBox = K('select[name="type"]', div);
+			urlBox.val('http://');
+			typeBox[0].options[0] = new Option(lang.newWindow, '_blank');
+			typeBox[0].options[1] = new Option(lang.selfWindow, '');
+			self.cmd.selection();
+			var a = self.plugin.getSelectedLink();
+			if (a) {
+				self.cmd.range.selectNode(a[0]);
+				self.cmd.select();
+				urlBox.val(a.attr('data-ke-src'));
+				typeBox.val(a.attr('target'));
+			}
+			urlBox[0].focus();
+			urlBox[0].select();
+		},
+		'delete' : function() {
+			self.exec('unlink', null);
+		}
+	};
+	self.clickToolbar(name, self.plugin.link.edit);
+});
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+// Google Maps: http://code.google.com/apis/maps/index.html
+
+KindEditor.plugin('map', function(K) {
+	var self = this, name = 'map', lang = self.lang(name + '.');
+	self.clickToolbar(name, function() {
+		var html = ['<div style="padding:10px 20px;">',
+			'<div class="ke-dialog-row">',
+			lang.address + ' <input id="kindeditor_plugin_map_address" name="address" class="ke-input-text" value="" style="width:200px;" /> ',
+			'<span class="ke-button-common ke-button-outer">',
+			'<input type="button" name="searchBtn" class="ke-button-common ke-button" value="' + lang.search + '" />',
+			'</span>',
+			'</div>',
+			'<div class="ke-map" style="width:558px;height:360px;"></div>',
+			'</div>'].join('');
+		var dialog = self.createDialog({
+			name : name,
+			width : 600,
+			title : self.lang(name),
+			body : html,
+			yesBtn : {
+				name : self.lang('yes'),
+				click : function(e) {
+					var geocoder = win.geocoder,
+						map = win.map,
+						center = map.getCenter().lat() + ',' + map.getCenter().lng(),
+						zoom = map.getZoom(),
+						maptype = map.getMapTypeId(),
+						url = 'http://maps.googleapis.com/maps/api/staticmap';
+						url += '?center=' + encodeURIComponent(center);
+						url += '&zoom=' + encodeURIComponent(zoom);
+						url += '&size=558x360';
+						url += '&maptype=' + encodeURIComponent(maptype);
+						url += '&markers=' + encodeURIComponent(center);
+						url += '&language=' + self.langType;
+						url += '&sensor=false';
+					self.exec('insertimage', url).hideDialog().focus();
+				}
+			},
+			beforeRemove : function() {
+				searchBtn.remove();
+				if (doc) {
+					doc.write('');
+				}
+				iframe.remove();
+			}
+		});
+		var div = dialog.div,
+			addressBox = K('[name="address"]', div),
+			searchBtn = K('[name="searchBtn"]', div),
+			win, doc;
+		var iframeHtml = ['<!doctype html><html><head>',
+			'<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />',
+			'<style>',
+			'	html { height: 100% }',
+			'	body { height: 100%; margin: 0; padding: 0; background-color: #FFF }',
+			'	#map_canvas { height: 100% }',
+			'</style>',
+			'<script src="http://maps.googleapis.com/maps/api/js?sensor=false&language=' + self.langType + '"></script>',
+			'<script>',
+			'var map, geocoder;',
+			'function initialize() {',
+			'	var latlng = new google.maps.LatLng(31.230393, 121.473704);',
+			'	var options = {',
+			'		zoom: 11,',
+			'		center: latlng,',
+			'		disableDefaultUI: true,',
+			'		panControl: true,',
+			'		zoomControl: true,',
+			'		mapTypeControl: true,',
+			'		scaleControl: true,',
+			'		streetViewControl: false,',
+			'		overviewMapControl: true,',
+			'		mapTypeId: google.maps.MapTypeId.ROADMAP',
+			'	};',
+			'	map = new google.maps.Map(document.getElementById("map_canvas"), options);',
+			'	geocoder = new google.maps.Geocoder();',
+			'	geocoder.geocode({latLng: latlng}, function(results, status) {',
+			'		if (status == google.maps.GeocoderStatus.OK) {',
+			'			if (results[3]) {',
+			'				parent.document.getElementById("kindeditor_plugin_map_address").value = results[3].formatted_address;',
+			'			}',
+			'		}',
+			'	});',
+			'}',
+			'function search(address) {',
+			'	if (!map) return;',
+			'	geocoder.geocode({address : address}, function(results, status) {',
+			'		if (status == google.maps.GeocoderStatus.OK) {',
+			'			map.setZoom(11);',
+			'			map.setCenter(results[0].geometry.location);',
+			'			var marker = new google.maps.Marker({',
+			'				map: map,',
+			'				position: results[0].geometry.location',
+			'			});',
+			'		} else {',
+			'			alert("Invalid address: " + address);',
+			'		}',
+			'	});',
+			'}',
+			'</script>',
+			'</head>',
+			'<body onload="initialize();">',
+			'<div id="map_canvas" style="width:100%; height:100%"></div>',
+			'</body></html>'].join('\n');
+		// TODO锛氱敤doc.write(iframeHtml)鏂瑰紡鍔犺浇鏃讹紝鍦↖E6涓婄涓�娆″姞杞芥姤閿欙紝鏆傛椂浣跨敤src鏂瑰紡
+		var iframe = K('<iframe class="ke-textarea" frameborder="0" src="' + self.pluginsPath + 'map/map.html" style="width:558px;height:360px;"></iframe>');
+		function ready() {
+			win = iframe[0].contentWindow;
+			doc = K.iframeDoc(iframe);
+			//doc.open();
+			//doc.write(iframeHtml);
+			//doc.close();
+		}
+		iframe.bind('load', function() {
+			iframe.unbind('load');
+			if (K.IE) {
+				ready();
+			} else {
+				setTimeout(ready, 0);
+			}
+		});
+		K('.ke-map', div).replaceWith(iframe);
+		// search map
+		searchBtn.click(function() {
+			win.search(addressBox.val());
+		});
+	});
+});
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('media', function(K) {
+	var self = this, name = 'media', lang = self.lang(name + '.'),
+		allowMediaUpload = K.undef(self.allowMediaUpload, true),
+		allowFileManager = K.undef(self.allowFileManager, false),
+		formatUploadUrl = K.undef(self.formatUploadUrl, true),
+		extraParams = K.undef(self.extraFileUploadParams, {}),
+		filePostName = K.undef(self.filePostName, 'imgFile'),
+		uploadJson = K.undef(self.uploadJson, self.basePath + 'php/upload_json.php');
+	self.plugin.media = {
+		edit : function() {
+			var html = [
+				'<div style="padding:20px;">',
+				//url
+				'<div class="ke-dialog-row">',
+				'<label for="keUrl" style="width:60px;">' + lang.url + '</label>',
+				'<input class="ke-input-text" type="text" id="keUrl" name="url" value="" style="width:160px;" /> &nbsp;',
+				'<input type="button" class="ke-upload-button" value="' + lang.upload + '" /> &nbsp;',
+				'<span class="ke-button-common ke-button-outer">',
+				'<input type="button" class="ke-button-common ke-button" name="viewServer" value="' + lang.viewServer + '" />',
+				'</span>',
+				'</div>',
+				//width
+				'<div class="ke-dialog-row">',
+				'<label for="keWidth" style="width:60px;">' + lang.width + '</label>',
+				'<input type="text" id="keWidth" class="ke-input-text ke-input-number" name="width" value="550" maxlength="4" />',
+				'</div>',
+				//height
+				'<div class="ke-dialog-row">',
+				'<label for="keHeight" style="width:60px;">' + lang.height + '</label>',
+				'<input type="text" id="keHeight" class="ke-input-text ke-input-number" name="height" value="400" maxlength="4" />',
+				'</div>',
+				//autostart
+				'<div class="ke-dialog-row">',
+				'<label for="keAutostart">' + lang.autostart + '</label>',
+				'<input type="checkbox" id="keAutostart" name="autostart" value="" /> ',
+				'</div>',
+				'</div>'
+			].join('');
+			var dialog = self.createDialog({
+				name : name,
+				width : 450,
+				height : 230,
+				title : self.lang(name),
+				body : html,
+				yesBtn : {
+					name : self.lang('yes'),
+					click : function(e) {
+						var url = K.trim(urlBox.val()),
+							width = widthBox.val(),
+							height = heightBox.val();
+						if (url == 'http://' || K.invalidUrl(url)) {
+							alert(self.lang('invalidUrl'));
+							urlBox[0].focus();
+							return;
+						}
+						if (!/^\d*$/.test(width)) {
+							alert(self.lang('invalidWidth'));
+							widthBox[0].focus();
+							return;
+						}
+						if (!/^\d*$/.test(height)) {
+							alert(self.lang('invalidHeight'));
+							heightBox[0].focus();
+							return;
+						}
+						var html = K.mediaImg(self.themesPath + 'common/blank.gif', {
+								src : url,
+								type : K.mediaType(url),
+								width : width,
+								height : height,
+								autostart : autostartBox[0].checked ? 'true' : 'false',
+								loop : 'true'
+							});
+						self.insertHtml(html).hideDialog().focus();
+					}
+				}
+			}),
+			div = dialog.div,
+			urlBox = K('[name="url"]', div),
+			viewServerBtn = K('[name="viewServer"]', div),
+			widthBox = K('[name="width"]', div),
+			heightBox = K('[name="height"]', div),
+			autostartBox = K('[name="autostart"]', div);
+			urlBox.val('http://');
+
+			if (allowMediaUpload) {
+				var uploadbutton = K.uploadbutton({
+					button : K('.ke-upload-button', div)[0],
+					fieldName : filePostName,
+					extraParams : extraParams,
+					url : K.addParam(uploadJson, 'dir=media'),
+					afterUpload : function(data) {
+						dialog.hideLoading();
+						if (data.error === 0) {
+							var url = data.url;
+							if (formatUploadUrl) {
+								url = K.formatUrl(url, 'absolute');
+							}
+							urlBox.val(url);
+							if (self.afterUpload) {
+								self.afterUpload.call(self, url, data, name);
+							}
+							alert(self.lang('uploadSuccess'));
+						} else {
+							alert(data.message);
+						}
+					},
+					afterError : function(html) {
+						dialog.hideLoading();
+						self.errorDialog(html);
+					}
+				});
+				uploadbutton.fileBox.change(function(e) {
+					dialog.showLoading(self.lang('uploadLoading'));
+					uploadbutton.submit();
+				});
+			} else {
+				K('.ke-upload-button', div).hide();
+			}
+
+			if (allowFileManager) {
+				viewServerBtn.click(function(e) {
+					self.loadPlugin('filemanager', function() {
+						self.plugin.filemanagerDialog({
+							viewType : 'LIST',
+							dirName : 'media',
+							clickFn : function(url, title) {
+								if (self.dialogs.length > 1) {
+									K('[name="url"]', div).val(url);
+									if (self.afterSelectFile) {
+										self.afterSelectFile.call(self, url);
+									}
+									self.hideDialog();
+								}
+							}
+						});
+					});
+				});
+			} else {
+				viewServerBtn.hide();
+			}
+
+			var img = self.plugin.getSelectedMedia();
+			if (img) {
+				var attrs = K.mediaAttrs(img.attr('data-ke-tag'));
+				urlBox.val(attrs.src);
+				widthBox.val(K.removeUnit(img.css('width')) || attrs.width || 0);
+				heightBox.val(K.removeUnit(img.css('height')) || attrs.height || 0);
+				autostartBox[0].checked = (attrs.autostart === 'true');
+			}
+			urlBox[0].focus();
+			urlBox[0].select();
+		},
+		'delete' : function() {
+			self.plugin.getSelectedMedia().remove();
+			// [IE] 鍒犻櫎鍥剧墖鍚庣珛鍗崇偣鍑诲浘鐗囨寜閽嚭閿�
+			self.addBookmark();
+		}
+	};
+	self.clickToolbar(name, self.plugin.media.edit);
+});
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+
+(function(K) {
+
+function KSWFUpload(options) {
+	this.init(options);
+}
+K.extend(KSWFUpload, {
+	init : function(options) {
+		var self = this;
+		options.afterError = options.afterError || function(str) {
+			alert(str);
+		};
+		self.options = options;
+		self.progressbars = {};
+		// template
+		self.div = K(options.container).html([
+			'<div class="ke-swfupload">',
+			'<div class="ke-swfupload-top">',
+			'<div class="ke-inline-block ke-swfupload-button">',
+			'<input type="button" value="Browse" />',
+			'</div>',
+			'<div class="ke-inline-block ke-swfupload-desc">' + options.uploadDesc + '</div>',
+			'<span class="ke-button-common ke-button-outer ke-swfupload-startupload">',
+			'<input type="button" class="ke-button-common ke-button" value="' + options.startButtonValue + '" />',
+			'</span>',
+			'</div>',
+			'<div class="ke-swfupload-body"></div>',
+			'</div>'
+		].join(''));
+		self.bodyDiv = K('.ke-swfupload-body', self.div);
+
+		function showError(itemDiv, msg) {
+			K('.ke-status > div', itemDiv).hide();
+			K('.ke-message', itemDiv).addClass('ke-error').show().html(K.escape(msg));
+		}
+
+		var settings = {
+			debug : false,
+			upload_url : options.uploadUrl,
+			flash_url : options.flashUrl,
+			file_post_name : options.filePostName,
+			button_placeholder : K('.ke-swfupload-button > input', self.div)[0],
+			button_image_url: options.buttonImageUrl,
+			button_width: options.buttonWidth,
+			button_height: options.buttonHeight,
+			button_cursor : SWFUpload.CURSOR.HAND,
+			file_types : options.fileTypes,
+			file_types_description : options.fileTypesDesc,
+			file_upload_limit : options.fileUploadLimit,
+			file_size_limit : options.fileSizeLimit,
+			post_params : options.postParams,
+			file_queued_handler : function(file) {
+				file.url = self.options.fileIconUrl;
+				self.appendFile(file);
+			},
+			file_queue_error_handler : function(file, errorCode, message) {
+				var errorName = '';
+				switch (errorCode) {
+					case SWFUpload.QUEUE_ERROR.QUEUE_LIMIT_EXCEEDED:
+						errorName = options.queueLimitExceeded;
+						break;
+					case SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT:
+						errorName = options.fileExceedsSizeLimit;
+						break;
+					case SWFUpload.QUEUE_ERROR.ZERO_BYTE_FILE:
+						errorName = options.zeroByteFile;
+						break;
+					case SWFUpload.QUEUE_ERROR.INVALID_FILETYPE:
+						errorName = options.invalidFiletype;
+						break;
+					default:
+						errorName = options.unknownError;
+						break;
+				}
+				K.DEBUG && alert(errorName);
+			},
+			upload_start_handler : function(file) {
+				var self = this;
+				var itemDiv = K('div[data-id="' + file.id + '"]', self.bodyDiv);
+				K('.ke-status > div', itemDiv).hide();
+				K('.ke-progressbar', itemDiv).show();
+			},
+			upload_progress_handler : function(file, bytesLoaded, bytesTotal) {
+				var percent = Math.round(bytesLoaded * 100 / bytesTotal);
+				var progressbar = self.progressbars[file.id];
+				progressbar.bar.css('width', Math.round(percent * 80 / 100) + 'px');
+				progressbar.percent.html(percent + '%');
+			},
+			upload_error_handler : function(file, errorCode, message) {
+				if (file && file.filestatus == SWFUpload.FILE_STATUS.ERROR) {
+					var itemDiv = K('div[data-id="' + file.id + '"]', self.bodyDiv).eq(0);
+					showError(itemDiv, self.options.errorMessage);
+				}
+			},
+			upload_success_handler : function(file, serverData) {
+				var itemDiv = K('div[data-id="' + file.id + '"]', self.bodyDiv).eq(0);
+				var data = {};
+				try {
+					data = K.json(serverData);
+				} catch (e) {
+					self.options.afterError.call(this, '<!doctype html><html>' + serverData + '</html>');
+				}
+				if (data.error !== 0) {
+					showError(itemDiv, K.DEBUG ? data.message : self.options.errorMessage);
+					return;
+				}
+				file.url = data.url;
+				K('.ke-img', itemDiv).attr('src', file.url).attr('data-status', file.filestatus).data('data', data);
+				K('.ke-status > div', itemDiv).hide();
+			}
+		};
+		self.swfu = new SWFUpload(settings);
+
+		K('.ke-swfupload-startupload input', self.div).click(function() {
+			self.swfu.startUpload();
+		});
+	},
+	getUrlList : function() {
+		var list = [];
+		K('.ke-img', self.bodyDiv).each(function() {
+			var img = K(this);
+			var status = img.attr('data-status');
+			if (status == SWFUpload.FILE_STATUS.COMPLETE) {
+				list.push(img.data('data'));
+			}
+		});
+		return list;
+	},
+	removeFile : function(fileId) {
+		var self = this;
+		self.swfu.cancelUpload(fileId);
+		var itemDiv = K('div[data-id="' + fileId + '"]', self.bodyDiv);
+		K('.ke-photo', itemDiv).unbind();
+		K('.ke-delete', itemDiv).unbind();
+		itemDiv.remove();
+	},
+	removeFiles : function() {
+		var self = this;
+		K('.ke-item', self.bodyDiv).each(function() {
+			self.removeFile(K(this).attr('data-id'));
+		});
+	},
+	appendFile : function(file) {
+		var self = this;
+		var itemDiv = K('<div class="ke-inline-block ke-item" data-id="' + file.id + '"></div>');
+		self.bodyDiv.append(itemDiv);
+		var photoDiv = K('<div class="ke-inline-block ke-photo"></div>')
+			.mouseover(function(e) {
+				K(this).addClass('ke-on');
+			})
+			.mouseout(function(e) {
+				K(this).removeClass('ke-on');
+			});
+		itemDiv.append(photoDiv);
+
+		var img = K('<img src="' + file.url + '" class="ke-img" data-status="' + file.filestatus + '" width="80" height="80" alt="' + file.name + '" />');
+		photoDiv.append(img);
+		K('<span class="ke-delete"></span>').appendTo(photoDiv).click(function() {
+			self.removeFile(file.id);
+		});
+		var statusDiv = K('<div class="ke-status"></div>').appendTo(photoDiv);
+		// progressbar
+		K(['<div class="ke-progressbar">',
+			'<div class="ke-progressbar-bar"><div class="ke-progressbar-bar-inner"></div></div>',
+			'<div class="ke-progressbar-percent">0%</div></div>'].join('')).hide().appendTo(statusDiv);
+		// message
+		K('<div class="ke-message">' + self.options.pendingMessage + '</div>').appendTo(statusDiv);
+
+		itemDiv.append('<div class="ke-name">' + file.name + '</div>');
+
+		self.progressbars[file.id] = {
+			bar : K('.ke-progressbar-bar-inner', photoDiv),
+			percent : K('.ke-progressbar-percent', photoDiv)
+		};
+	},
+	remove : function() {
+		this.removeFiles();
+		this.swfu.destroy();
+		this.div.html('');
+	}
+});
+
+K.swfupload = function(element, options) {
+	return new KSWFUpload(element, options);
+};
+
+})(KindEditor);
+
+KindEditor.plugin('multiimage', function(K) {
+	var self = this, name = 'multiimage',
+		formatUploadUrl = K.undef(self.formatUploadUrl, true),
+		uploadJson = K.undef(self.uploadJson, self.basePath + 'php/upload_json.php'),
+		imgPath = self.pluginsPath + 'multiimage/images/',
+		imageSizeLimit = K.undef(self.imageSizeLimit, '1MB'),
+		imageFileTypes = K.undef(self.imageFileTypes, '*.jpg;*.gif;*.png'),
+		imageUploadLimit = K.undef(self.imageUploadLimit, 20),
+		filePostName = K.undef(self.filePostName, 'imgFile'),
+		lang = self.lang(name + '.');
+
+	self.plugin.multiImageDialog = function(options) {
+		var clickFn = options.clickFn,
+			uploadDesc = K.tmpl(lang.uploadDesc, {uploadLimit : imageUploadLimit, sizeLimit : imageSizeLimit});
+		var html = [
+			'<div style="padding:20px;">',
+			'<div class="swfupload">',
+			'</div>',
+			'</div>'
+		].join('');
+		var dialog = self.createDialog({
+			name : name,
+			width : 650,
+			height : 510,
+			title : self.lang(name),
+			body : html,
+			previewBtn : {
+				name : lang.insertAll,
+				click : function(e) {
+					clickFn.call(self, swfupload.getUrlList());
+				}
+			},
+			yesBtn : {
+				name : lang.clearAll,
+				click : function(e) {
+					swfupload.removeFiles();
+				}
+			},
+			beforeRemove : function() {
+				// IE9 bugfix: https://github.com/kindsoft/kindeditor/issues/72
+				if (!K.IE || K.V <= 8) {
+					swfupload.remove();
+				}
+			}
+		}),
+		div = dialog.div;
+
+		var swfupload = K.swfupload({
+			container : K('.swfupload', div),
+			buttonImageUrl : imgPath + (self.langType == 'zh_CN' ? 'select-files-zh_CN.png' : 'select-files-en.png'),
+			buttonWidth : self.langType == 'zh_CN' ? 72 : 88,
+			buttonHeight : 23,
+			fileIconUrl : imgPath + 'image.png',
+			uploadDesc : uploadDesc,
+			startButtonValue : lang.startUpload,
+			uploadUrl : K.addParam(uploadJson, 'dir=image'),
+			flashUrl : imgPath + 'swfupload.swf',
+			filePostName : filePostName,
+			fileTypes : '*.jpg;*.jpeg;*.gif;*.png;*.bmp',
+			fileTypesDesc : 'Image Files',
+			fileUploadLimit : imageUploadLimit,
+			fileSizeLimit : imageSizeLimit,
+			postParams :  K.undef(self.extraFileUploadParams, {}),
+			queueLimitExceeded : lang.queueLimitExceeded,
+			fileExceedsSizeLimit : lang.fileExceedsSizeLimit,
+			zeroByteFile : lang.zeroByteFile,
+			invalidFiletype : lang.invalidFiletype,
+			unknownError : lang.unknownError,
+			pendingMessage : lang.pending,
+			errorMessage : lang.uploadError,
+			afterError : function(html) {
+				self.errorDialog(html);
+			}
+		});
+
+		return dialog;
+	};
+	self.clickToolbar(name, function() {
+		self.plugin.multiImageDialog({
+			clickFn : function (urlList) {
+				if (urlList.length === 0) {
+					return;
+				}
+				K.each(urlList, function(i, data) {
+					if (self.afterUpload) {
+						self.afterUpload.call(self, data.url, data, 'multiimage');
+					}
+					self.exec('insertimage', data.url, data.title, data.width, data.height, data.border, data.align);
+				});
+				// Bugfix: [Firefox] 涓婁紶鍥剧墖鍚庯紝鎬绘槸鍑虹幇姝e湪鍔犺浇鐨勬牱寮忥紝闇�瑕佸欢杩熸墽琛宧ideDialog
+				setTimeout(function() {
+					self.hideDialog().focus();
+				}, 0);
+			}
+		});
+	});
+});
+
+
+/**
+ * SWFUpload: http://www.swfupload.org, http://swfupload.googlecode.com
+ *
+ * mmSWFUpload 1.0: Flash upload dialog - http://profandesign.se/swfupload/,  http://www.vinterwebb.se/
+ *
+ * SWFUpload is (c) 2006-2007 Lars Huring, Olov Nilz闁� and Mammon Media and is released under the MIT License:
+ * http://www.opensource.org/licenses/mit-license.php
+ *
+ * SWFUpload 2 is (c) 2007-2008 Jake Roberts and is released under the MIT License:
+ * http://www.opensource.org/licenses/mit-license.php
+ *
+ */
+
+
+/* ******************* */
+/* Constructor & Init  */
+/* ******************* */
+
+(function() {
+
+if (window.SWFUpload) {
+	return;
+}
+
+window.SWFUpload = function (settings) {
+	this.initSWFUpload(settings);
+};
+
+SWFUpload.prototype.initSWFUpload = function (settings) {
+	try {
+		this.customSettings = {};	// A container where developers can place their own settings associated with this instance.
+		this.settings = settings;
+		this.eventQueue = [];
+		this.movieName = "SWFUpload_" + SWFUpload.movieCount++;
+		this.movieElement = null;
+
+
+		// Setup global control tracking
+		SWFUpload.instances[this.movieName] = this;
+
+		// Load the settings.  Load the Flash movie.
+		this.initSettings();
+		this.loadFlash();
+		this.displayDebugInfo();
+	} catch (ex) {
+		delete SWFUpload.instances[this.movieName];
+		throw ex;
+	}
+};
+
+/* *************** */
+/* Static Members  */
+/* *************** */
+SWFUpload.instances = {};
+SWFUpload.movieCount = 0;
+SWFUpload.version = "2.2.0 2009-03-25";
+SWFUpload.QUEUE_ERROR = {
+	QUEUE_LIMIT_EXCEEDED	  		: -100,
+	FILE_EXCEEDS_SIZE_LIMIT  		: -110,
+	ZERO_BYTE_FILE			  		: -120,
+	INVALID_FILETYPE		  		: -130
+};
+SWFUpload.UPLOAD_ERROR = {
+	HTTP_ERROR				  		: -200,
+	MISSING_UPLOAD_URL	      		: -210,
+	IO_ERROR				  		: -220,
+	SECURITY_ERROR			  		: -230,
+	UPLOAD_LIMIT_EXCEEDED	  		: -240,
+	UPLOAD_FAILED			  		: -250,
+	SPECIFIED_FILE_ID_NOT_FOUND		: -260,
+	FILE_VALIDATION_FAILED	  		: -270,
+	FILE_CANCELLED			  		: -280,
+	UPLOAD_STOPPED					: -290
+};
+SWFUpload.FILE_STATUS = {
+	QUEUED		 : -1,
+	IN_PROGRESS	 : -2,
+	ERROR		 : -3,
+	COMPLETE	 : -4,
+	CANCELLED	 : -5
+};
+SWFUpload.BUTTON_ACTION = {
+	SELECT_FILE  : -100,
+	SELECT_FILES : -110,
+	START_UPLOAD : -120
+};
+SWFUpload.CURSOR = {
+	ARROW : -1,
+	HAND : -2
+};
+SWFUpload.WINDOW_MODE = {
+	WINDOW : "window",
+	TRANSPARENT : "transparent",
+	OPAQUE : "opaque"
+};
+
+// Private: takes a URL, determines if it is relative and converts to an absolute URL
+// using the current site. Only processes the URL if it can, otherwise returns the URL untouched
+SWFUpload.completeURL = function(url) {
+	if (typeof(url) !== "string" || url.match(/^https?:\/\//i) || url.match(/^\//)) {
+		return url;
+	}
+
+	var currentURL = window.location.protocol + "//" + window.location.hostname + (window.location.port ? ":" + window.location.port : "");
+
+	var indexSlash = window.location.pathname.lastIndexOf("/");
+	if (indexSlash <= 0) {
+		path = "/";
+	} else {
+		path = window.location.pathname.substr(0, indexSlash) + "/";
+	}
+
+	return /*currentURL +*/ path + url;
+
+};
+
+
+/* ******************** */
+/* Instance Members  */
+/* ******************** */
+
+// Private: initSettings ensures that all the
+// settings are set, getting a default value if one was not assigned.
+SWFUpload.prototype.initSettings = function () {
+	this.ensureDefault = function (settingName, defaultValue) {
+		this.settings[settingName] = (this.settings[settingName] == undefined) ? defaultValue : this.settings[settingName];
+	};
+
+	// Upload backend settings
+	this.ensureDefault("upload_url", "");
+	this.ensureDefault("preserve_relative_urls", false);
+	this.ensureDefault("file_post_name", "Filedata");
+	this.ensureDefault("post_params", {});
+	this.ensureDefault("use_query_string", false);
+	this.ensureDefault("requeue_on_error", false);
+	this.ensureDefault("http_success", []);
+	this.ensureDefault("assume_success_timeout", 0);
+
+	// File Settings
+	this.ensureDefault("file_types", "*.*");
+	this.ensureDefault("file_types_description", "All Files");
+	this.ensureDefault("file_size_limit", 0);	// Default zero means "unlimited"
+	this.ensureDefault("file_upload_limit", 0);
+	this.ensureDefault("file_queue_limit", 0);
+
+	// Flash Settings
+	this.ensureDefault("flash_url", "swfupload.swf");
+	this.ensureDefault("prevent_swf_caching", true);
+
+	// Button Settings
+	this.ensureDefault("button_image_url", "");
+	this.ensureDefault("button_width", 1);
+	this.ensureDefault("button_height", 1);
+	this.ensureDefault("button_text", "");
+	this.ensureDefault("button_text_style", "color: #000000; font-size: 16pt;");
+	this.ensureDefault("button_text_top_padding", 0);
+	this.ensureDefault("button_text_left_padding", 0);
+	this.ensureDefault("button_action", SWFUpload.BUTTON_ACTION.SELECT_FILES);
+	this.ensureDefault("button_disabled", false);
+	this.ensureDefault("button_placeholder_id", "");
+	this.ensureDefault("button_placeholder", null);
+	this.ensureDefault("button_cursor", SWFUpload.CURSOR.ARROW);
+	this.ensureDefault("button_window_mode", SWFUpload.WINDOW_MODE.WINDOW);
+
+	// Debug Settings
+	this.ensureDefault("debug", false);
+	this.settings.debug_enabled = this.settings.debug;	// Here to maintain v2 API
+
+	// Event Handlers
+	this.settings.return_upload_start_handler = this.returnUploadStart;
+	this.ensureDefault("swfupload_loaded_handler", null);
+	this.ensureDefault("file_dialog_start_handler", null);
+	this.ensureDefault("file_queued_handler", null);
+	this.ensureDefault("file_queue_error_handler", null);
+	this.ensureDefault("file_dialog_complete_handler", null);
+
+	this.ensureDefault("upload_start_handler", null);
+	this.ensureDefault("upload_progress_handler", null);
+	this.ensureDefault("upload_error_handler", null);
+	this.ensureDefault("upload_success_handler", null);
+	this.ensureDefault("upload_complete_handler", null);
+
+	this.ensureDefault("debug_handler", this.debugMessage);
+
+	this.ensureDefault("custom_settings", {});
+
+	// Other settings
+	this.customSettings = this.settings.custom_settings;
+
+	// Update the flash url if needed
+	if (!!this.settings.prevent_swf_caching) {
+		this.settings.flash_url = this.settings.flash_url + (this.settings.flash_url.indexOf("?") < 0 ? "?" : "&") + "preventswfcaching=" + new Date().getTime();
+	}
+
+	if (!this.settings.preserve_relative_urls) {
+		//this.settings.flash_url = SWFUpload.completeURL(this.settings.flash_url);	// Don't need to do this one since flash doesn't look at it
+		this.settings.upload_url = SWFUpload.completeURL(this.settings.upload_url);
+		this.settings.button_image_url = SWFUpload.completeURL(this.settings.button_image_url);
+	}
+
+	delete this.ensureDefault;
+};
+
+// Private: loadFlash replaces the button_placeholder element with the flash movie.
+SWFUpload.prototype.loadFlash = function () {
+	var targetElement, tempParent;
+
+	// Make sure an element with the ID we are going to use doesn't already exist
+	if (document.getElementById(this.movieName) !== null) {
+		throw "ID " + this.movieName + " is already in use. The Flash Object could not be added";
+	}
+
+	// Get the element where we will be placing the flash movie
+	targetElement = document.getElementById(this.settings.button_placeholder_id) || this.settings.button_placeholder;
+
+	if (targetElement == undefined) {
+		throw "Could not find the placeholder element: " + this.settings.button_placeholder_id;
+	}
+
+	// Append the container and load the flash
+	tempParent = document.createElement("div");
+	tempParent.innerHTML = this.getFlashHTML();	// Using innerHTML is non-standard but the only sensible way to dynamically add Flash in IE (and maybe other browsers)
+	targetElement.parentNode.replaceChild(tempParent.firstChild, targetElement);
+
+	// Fix IE Flash/Form bug
+	if (window[this.movieName] == undefined) {
+		window[this.movieName] = this.getMovieElement();
+	}
+
+};
+
+// Private: getFlashHTML generates the object tag needed to embed the flash in to the document
+SWFUpload.prototype.getFlashHTML = function () {
+	// Flash Satay object syntax: http://www.alistapart.com/articles/flashsatay
+	// Fix bug for IE9
+	// http://www.kindsoft.net/view.php?bbsid=7&postid=5825&pagenum=1
+	var classid = '';
+	if (KindEditor.IE && KindEditor.V > 8) {
+		classid = ' classid = "clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"';
+	}
+	return ['<object id="', this.movieName, '"' + classid + ' type="application/x-shockwave-flash" data="', this.settings.flash_url, '" width="', this.settings.button_width, '" height="', this.settings.button_height, '" class="swfupload">',
+				'<param name="wmode" value="', this.settings.button_window_mode, '" />',
+				'<param name="movie" value="', this.settings.flash_url, '" />',
+				'<param name="quality" value="high" />',
+				'<param name="menu" value="false" />',
+				'<param name="allowScriptAccess" value="always" />',
+				'<param name="flashvars" value="' + this.getFlashVars() + '" />',
+				'</object>'].join("");
+};
+
+// Private: getFlashVars builds the parameter string that will be passed
+// to flash in the flashvars param.
+SWFUpload.prototype.getFlashVars = function () {
+	// Build a string from the post param object
+	var paramString = this.buildParamString();
+	var httpSuccessString = this.settings.http_success.join(",");
+
+	// Build the parameter string
+	return ["movieName=", encodeURIComponent(this.movieName),
+			"&amp;uploadURL=", encodeURIComponent(this.settings.upload_url),
+			"&amp;useQueryString=", encodeURIComponent(this.settings.use_query_string),
+			"&amp;requeueOnError=", encodeURIComponent(this.settings.requeue_on_error),
+			"&amp;httpSuccess=", encodeURIComponent(httpSuccessString),
+			"&amp;assumeSuccessTimeout=", encodeURIComponent(this.settings.assume_success_timeout),
+			"&amp;params=", encodeURIComponent(paramString),
+			"&amp;filePostName=", encodeURIComponent(this.settings.file_post_name),
+			"&amp;fileTypes=", encodeURIComponent(this.settings.file_types),
+			"&amp;fileTypesDescription=", encodeURIComponent(this.settings.file_types_description),
+			"&amp;fileSizeLimit=", encodeURIComponent(this.settings.file_size_limit),
+			"&amp;fileUploadLimit=", encodeURIComponent(this.settings.file_upload_limit),
+			"&amp;fileQueueLimit=", encodeURIComponent(this.settings.file_queue_limit),
+			"&amp;debugEnabled=", encodeURIComponent(this.settings.debug_enabled),
+			"&amp;buttonImageURL=", encodeURIComponent(this.settings.button_image_url),
+			"&amp;buttonWidth=", encodeURIComponent(this.settings.button_width),
+			"&amp;buttonHeight=", encodeURIComponent(this.settings.button_height),
+			"&amp;buttonText=", encodeURIComponent(this.settings.button_text),
+			"&amp;buttonTextTopPadding=", encodeURIComponent(this.settings.button_text_top_padding),
+			"&amp;buttonTextLeftPadding=", encodeURIComponent(this.settings.button_text_left_padding),
+			"&amp;buttonTextStyle=", encodeURIComponent(this.settings.button_text_style),
+			"&amp;buttonAction=", encodeURIComponent(this.settings.button_action),
+			"&amp;buttonDisabled=", encodeURIComponent(this.settings.button_disabled),
+			"&amp;buttonCursor=", encodeURIComponent(this.settings.button_cursor)
+		].join("");
+};
+
+// Public: getMovieElement retrieves the DOM reference to the Flash element added by SWFUpload
+// The element is cached after the first lookup
+SWFUpload.prototype.getMovieElement = function () {
+	if (this.movieElement == undefined) {
+		this.movieElement = document.getElementById(this.movieName);
+	}
+
+	if (this.movieElement === null) {
+		throw "Could not find Flash element";
+	}
+
+	return this.movieElement;
+};
+
+// Private: buildParamString takes the name/value pairs in the post_params setting object
+// and joins them up in to a string formatted "name=value&amp;name=value"
+SWFUpload.prototype.buildParamString = function () {
+	var postParams = this.settings.post_params;
+	var paramStringPairs = [];
+
+	if (typeof(postParams) === "object") {
+		for (var name in postParams) {
+			if (postParams.hasOwnProperty(name)) {
+				paramStringPairs.push(encodeURIComponent(name.toString()) + "=" + encodeURIComponent(postParams[name].toString()));
+			}
+		}
+	}
+
+	return paramStringPairs.join("&amp;");
+};
+
+// Public: Used to remove a SWFUpload instance from the page. This method strives to remove
+// all references to the SWF, and other objects so memory is properly freed.
+// Returns true if everything was destroyed. Returns a false if a failure occurs leaving SWFUpload in an inconsistant state.
+// Credits: Major improvements provided by steffen
+SWFUpload.prototype.destroy = function () {
+	try {
+		// Make sure Flash is done before we try to remove it
+		this.cancelUpload(null, false);
+
+
+		// Remove the SWFUpload DOM nodes
+		var movieElement = null;
+		movieElement = this.getMovieElement();
+
+		if (movieElement && typeof(movieElement.CallFunction) === "unknown") { // We only want to do this in IE
+			// Loop through all the movie's properties and remove all function references (DOM/JS IE 6/7 memory leak workaround)
+			for (var i in movieElement) {
+				try {
+					if (typeof(movieElement[i]) === "function") {
+						movieElement[i] = null;
+					}
+				} catch (ex1) {}
+			}
+
+			// Remove the Movie Element from the page
+			try {
+				movieElement.parentNode.removeChild(movieElement);
+			} catch (ex) {}
+		}
+
+		// Remove IE form fix reference
+		window[this.movieName] = null;
+
+		// Destroy other references
+		SWFUpload.instances[this.movieName] = null;
+		delete SWFUpload.instances[this.movieName];
+
+		this.movieElement = null;
+		this.settings = null;
+		this.customSettings = null;
+		this.eventQueue = null;
+		this.movieName = null;
+
+
+		return true;
+	} catch (ex2) {
+		return false;
+	}
+};
+
+
+// Public: displayDebugInfo prints out settings and configuration
+// information about this SWFUpload instance.
+// This function (and any references to it) can be deleted when placing
+// SWFUpload in production.
+SWFUpload.prototype.displayDebugInfo = function () {
+	this.debug(
+		[
+			"---SWFUpload Instance Info---\n",
+			"Version: ", SWFUpload.version, "\n",
+			"Movie Name: ", this.movieName, "\n",
+			"Settings:\n",
+			"\t", "upload_url:               ", this.settings.upload_url, "\n",
+			"\t", "flash_url:                ", this.settings.flash_url, "\n",
+			"\t", "use_query_string:         ", this.settings.use_query_string.toString(), "\n",
+			"\t", "requeue_on_error:         ", this.settings.requeue_on_error.toString(), "\n",
+			"\t", "http_success:             ", this.settings.http_success.join(", "), "\n",
+			"\t", "assume_success_timeout:   ", this.settings.assume_success_timeout, "\n",
+			"\t", "file_post_name:           ", this.settings.file_post_name, "\n",
+			"\t", "post_params:              ", this.settings.post_params.toString(), "\n",
+			"\t", "file_types:               ", this.settings.file_types, "\n",
+			"\t", "file_types_description:   ", this.settings.file_types_description, "\n",
+			"\t", "file_size_limit:          ", this.settings.file_size_limit, "\n",
+			"\t", "file_upload_limit:        ", this.settings.file_upload_limit, "\n",
+			"\t", "file_queue_limit:         ", this.settings.file_queue_limit, "\n",
+			"\t", "debug:                    ", this.settings.debug.toString(), "\n",
+
+			"\t", "prevent_swf_caching:      ", this.settings.prevent_swf_caching.toString(), "\n",
+
+			"\t", "button_placeholder_id:    ", this.settings.button_placeholder_id.toString(), "\n",
+			"\t", "button_placeholder:       ", (this.settings.button_placeholder ? "Set" : "Not Set"), "\n",
+			"\t", "button_image_url:         ", this.settings.button_image_url.toString(), "\n",
+			"\t", "button_width:             ", this.settings.button_width.toString(), "\n",
+			"\t", "button_height:            ", this.settings.button_height.toString(), "\n",
+			"\t", "button_text:              ", this.settings.button_text.toString(), "\n",
+			"\t", "button_text_style:        ", this.settings.button_text_style.toString(), "\n",
+			"\t", "button_text_top_padding:  ", this.settings.button_text_top_padding.toString(), "\n",
+			"\t", "button_text_left_padding: ", this.settings.button_text_left_padding.toString(), "\n",
+			"\t", "button_action:            ", this.settings.button_action.toString(), "\n",
+			"\t", "button_disabled:          ", this.settings.button_disabled.toString(), "\n",
+
+			"\t", "custom_settings:          ", this.settings.custom_settings.toString(), "\n",
+			"Event Handlers:\n",
+			"\t", "swfupload_loaded_handler assigned:  ", (typeof this.settings.swfupload_loaded_handler === "function").toString(), "\n",
+			"\t", "file_dialog_start_handler assigned: ", (typeof this.settings.file_dialog_start_handler === "function").toString(), "\n",
+			"\t", "file_queued_handler assigned:       ", (typeof this.settings.file_queued_handler === "function").toString(), "\n",
+			"\t", "file_queue_error_handler assigned:  ", (typeof this.settings.file_queue_error_handler === "function").toString(), "\n",
+			"\t", "upload_start_handler assigned:      ", (typeof this.settings.upload_start_handler === "function").toString(), "\n",
+			"\t", "upload_progress_handler assigned:   ", (typeof this.settings.upload_progress_handler === "function").toString(), "\n",
+			"\t", "upload_error_handler assigned:      ", (typeof this.settings.upload_error_handler === "function").toString(), "\n",
+			"\t", "upload_success_handler assigned:    ", (typeof this.settings.upload_success_handler === "function").toString(), "\n",
+			"\t", "upload_complete_handler assigned:   ", (typeof this.settings.upload_complete_handler === "function").toString(), "\n",
+			"\t", "debug_handler assigned:             ", (typeof this.settings.debug_handler === "function").toString(), "\n"
+		].join("")
+	);
+};
+
+/* Note: addSetting and getSetting are no longer used by SWFUpload but are included
+	the maintain v2 API compatibility
+*/
+// Public: (Deprecated) addSetting adds a setting value. If the value given is undefined or null then the default_value is used.
+SWFUpload.prototype.addSetting = function (name, value, default_value) {
+    if (value == undefined) {
+        return (this.settings[name] = default_value);
+    } else {
+        return (this.settings[name] = value);
+	}
+};
+
+// Public: (Deprecated) getSetting gets a setting. Returns an empty string if the setting was not found.
+SWFUpload.prototype.getSetting = function (name) {
+    if (this.settings[name] != undefined) {
+        return this.settings[name];
+	}
+
+    return "";
+};
+
+
+
+// Private: callFlash handles function calls made to the Flash element.
+// Calls are made with a setTimeout for some functions to work around
+// bugs in the ExternalInterface library.
+SWFUpload.prototype.callFlash = function (functionName, argumentArray) {
+	argumentArray = argumentArray || [];
+
+	var movieElement = this.getMovieElement();
+	var returnValue, returnString;
+
+	// Flash's method if calling ExternalInterface methods (code adapted from MooTools).
+	try {
+		returnString = movieElement.CallFunction('<invoke name="' + functionName + '" returntype="javascript">' + __flash__argumentsToXML(argumentArray, 0) + '</invoke>');
+		returnValue = eval(returnString);
+	} catch (ex) {
+		throw "Call to " + functionName + " failed";
+	}
+
+	// Unescape file post param values
+	if (returnValue != undefined && typeof returnValue.post === "object") {
+		returnValue = this.unescapeFilePostParams(returnValue);
+	}
+
+	return returnValue;
+};
+
+/* *****************************
+	-- Flash control methods --
+	Your UI should use these
+	to operate SWFUpload
+   ***************************** */
+
+// WARNING: this function does not work in Flash Player 10
+// Public: selectFile causes a File Selection Dialog window to appear.  This
+// dialog only allows 1 file to be selected.
+SWFUpload.prototype.selectFile = function () {
+	this.callFlash("SelectFile");
+};
+
+// WARNING: this function does not work in Flash Player 10
+// Public: selectFiles causes a File Selection Dialog window to appear/ This
+// dialog allows the user to select any number of files
+// Flash Bug Warning: Flash limits the number of selectable files based on the combined length of the file names.
+// If the selection name length is too long the dialog will fail in an unpredictable manner.  There is no work-around
+// for this bug.
+SWFUpload.prototype.selectFiles = function () {
+	this.callFlash("SelectFiles");
+};
+
+
+// Public: startUpload starts uploading the first file in the queue unless
+// the optional parameter 'fileID' specifies the ID
+SWFUpload.prototype.startUpload = function (fileID) {
+	this.callFlash("StartUpload", [fileID]);
+};
+
+// Public: cancelUpload cancels any queued file.  The fileID parameter may be the file ID or index.
+// If you do not specify a fileID the current uploading file or first file in the queue is cancelled.
+// If you do not want the uploadError event to trigger you can specify false for the triggerErrorEvent parameter.
+SWFUpload.prototype.cancelUpload = function (fileID, triggerErrorEvent) {
+	if (triggerErrorEvent !== false) {
+		triggerErrorEvent = true;
+	}
+	this.callFlash("CancelUpload", [fileID, triggerErrorEvent]);
+};
+
+// Public: stopUpload stops the current upload and requeues the file at the beginning of the queue.
+// If nothing is currently uploading then nothing happens.
+SWFUpload.prototype.stopUpload = function () {
+	this.callFlash("StopUpload");
+};
+
+/* ************************
+ * Settings methods
+ *   These methods change the SWFUpload settings.
+ *   SWFUpload settings should not be changed directly on the settings object
+ *   since many of the settings need to be passed to Flash in order to take
+ *   effect.
+ * *********************** */
+
+// Public: getStats gets the file statistics object.
+SWFUpload.prototype.getStats = function () {
+	return this.callFlash("GetStats");
+};
+
+// Public: setStats changes the SWFUpload statistics.  You shouldn't need to
+// change the statistics but you can.  Changing the statistics does not
+// affect SWFUpload accept for the successful_uploads count which is used
+// by the upload_limit setting to determine how many files the user may upload.
+SWFUpload.prototype.setStats = function (statsObject) {
+	this.callFlash("SetStats", [statsObject]);
+};
+
+// Public: getFile retrieves a File object by ID or Index.  If the file is
+// not found then 'null' is returned.
+SWFUpload.prototype.getFile = function (fileID) {
+	if (typeof(fileID) === "number") {
+		return this.callFlash("GetFileByIndex", [fileID]);
+	} else {
+		return this.callFlash("GetFile", [fileID]);
+	}
+};
+
+// Public: addFileParam sets a name/value pair that will be posted with the
+// file specified by the Files ID.  If the name already exists then the
+// exiting value will be overwritten.
+SWFUpload.prototype.addFileParam = function (fileID, name, value) {
+	return this.callFlash("AddFileParam", [fileID, name, value]);
+};
+
+// Public: removeFileParam removes a previously set (by addFileParam) name/value
+// pair from the specified file.
+SWFUpload.prototype.removeFileParam = function (fileID, name) {
+	this.callFlash("RemoveFileParam", [fileID, name]);
+};
+
+// Public: setUploadUrl changes the upload_url setting.
+SWFUpload.prototype.setUploadURL = function (url) {
+	this.settings.upload_url = url.toString();
+	this.callFlash("SetUploadURL", [url]);
+};
+
+// Public: setPostParams changes the post_params setting
+SWFUpload.prototype.setPostParams = function (paramsObject) {
+	this.settings.post_params = paramsObject;
+	this.callFlash("SetPostParams", [paramsObject]);
+};
+
+// Public: addPostParam adds post name/value pair.  Each name can have only one value.
+SWFUpload.prototype.addPostParam = function (name, value) {
+	this.settings.post_params[name] = value;
+	this.callFlash("SetPostParams", [this.settings.post_params]);
+};
+
+// Public: removePostParam deletes post name/value pair.
+SWFUpload.prototype.removePostParam = function (name) {
+	delete this.settings.post_params[name];
+	this.callFlash("SetPostParams", [this.settings.post_params]);
+};
+
+// Public: setFileTypes changes the file_types setting and the file_types_description setting
+SWFUpload.prototype.setFileTypes = function (types, description) {
+	this.settings.file_types = types;
+	this.settings.file_types_description = description;
+	this.callFlash("SetFileTypes", [types, description]);
+};
+
+// Public: setFileSizeLimit changes the file_size_limit setting
+SWFUpload.prototype.setFileSizeLimit = function (fileSizeLimit) {
+	this.settings.file_size_limit = fileSizeLimit;
+	this.callFlash("SetFileSizeLimit", [fileSizeLimit]);
+};
+
+// Public: setFileUploadLimit changes the file_upload_limit setting
+SWFUpload.prototype.setFileUploadLimit = function (fileUploadLimit) {
+	this.settings.file_upload_limit = fileUploadLimit;
+	this.callFlash("SetFileUploadLimit", [fileUploadLimit]);
+};
+
+// Public: setFileQueueLimit changes the file_queue_limit setting
+SWFUpload.prototype.setFileQueueLimit = function (fileQueueLimit) {
+	this.settings.file_queue_limit = fileQueueLimit;
+	this.callFlash("SetFileQueueLimit", [fileQueueLimit]);
+};
+
+// Public: setFilePostName changes the file_post_name setting
+SWFUpload.prototype.setFilePostName = function (filePostName) {
+	this.settings.file_post_name = filePostName;
+	this.callFlash("SetFilePostName", [filePostName]);
+};
+
+// Public: setUseQueryString changes the use_query_string setting
+SWFUpload.prototype.setUseQueryString = function (useQueryString) {
+	this.settings.use_query_string = useQueryString;
+	this.callFlash("SetUseQueryString", [useQueryString]);
+};
+
+// Public: setRequeueOnError changes the requeue_on_error setting
+SWFUpload.prototype.setRequeueOnError = function (requeueOnError) {
+	this.settings.requeue_on_error = requeueOnError;
+	this.callFlash("SetRequeueOnError", [requeueOnError]);
+};
+
+// Public: setHTTPSuccess changes the http_success setting
+SWFUpload.prototype.setHTTPSuccess = function (http_status_codes) {
+	if (typeof http_status_codes === "string") {
+		http_status_codes = http_status_codes.replace(" ", "").split(",");
+	}
+
+	this.settings.http_success = http_status_codes;
+	this.callFlash("SetHTTPSuccess", [http_status_codes]);
+};
+
+// Public: setHTTPSuccess changes the http_success setting
+SWFUpload.prototype.setAssumeSuccessTimeout = function (timeout_seconds) {
+	this.settings.assume_success_timeout = timeout_seconds;
+	this.callFlash("SetAssumeSuccessTimeout", [timeout_seconds]);
+};
+
+// Public: setDebugEnabled changes the debug_enabled setting
+SWFUpload.prototype.setDebugEnabled = function (debugEnabled) {
+	this.settings.debug_enabled = debugEnabled;
+	this.callFlash("SetDebugEnabled", [debugEnabled]);
+};
+
+// Public: setButtonImageURL loads a button image sprite
+SWFUpload.prototype.setButtonImageURL = function (buttonImageURL) {
+	if (buttonImageURL == undefined) {
+		buttonImageURL = "";
+	}
+
+	this.settings.button_image_url = buttonImageURL;
+	this.callFlash("SetButtonImageURL", [buttonImageURL]);
+};
+
+// Public: setButtonDimensions resizes the Flash Movie and button
+SWFUpload.prototype.setButtonDimensions = function (width, height) {
+	this.settings.button_width = width;
+	this.settings.button_height = height;
+
+	var movie = this.getMovieElement();
+	if (movie != undefined) {
+		movie.style.width = width + "px";
+		movie.style.height = height + "px";
+	}
+
+	this.callFlash("SetButtonDimensions", [width, height]);
+};
+// Public: setButtonText Changes the text overlaid on the button
+SWFUpload.prototype.setButtonText = function (html) {
+	this.settings.button_text = html;
+	this.callFlash("SetButtonText", [html]);
+};
+// Public: setButtonTextPadding changes the top and left padding of the text overlay
+SWFUpload.prototype.setButtonTextPadding = function (left, top) {
+	this.settings.button_text_top_padding = top;
+	this.settings.button_text_left_padding = left;
+	this.callFlash("SetButtonTextPadding", [left, top]);
+};
+
+// Public: setButtonTextStyle changes the CSS used to style the HTML/Text overlaid on the button
+SWFUpload.prototype.setButtonTextStyle = function (css) {
+	this.settings.button_text_style = css;
+	this.callFlash("SetButtonTextStyle", [css]);
+};
+// Public: setButtonDisabled disables/enables the button
+SWFUpload.prototype.setButtonDisabled = function (isDisabled) {
+	this.settings.button_disabled = isDisabled;
+	this.callFlash("SetButtonDisabled", [isDisabled]);
+};
+// Public: setButtonAction sets the action that occurs when the button is clicked
+SWFUpload.prototype.setButtonAction = function (buttonAction) {
+	this.settings.button_action = buttonAction;
+	this.callFlash("SetButtonAction", [buttonAction]);
+};
+
+// Public: setButtonCursor changes the mouse cursor displayed when hovering over the button
+SWFUpload.prototype.setButtonCursor = function (cursor) {
+	this.settings.button_cursor = cursor;
+	this.callFlash("SetButtonCursor", [cursor]);
+};
+
+/* *******************************
+	Flash Event Interfaces
+	These functions are used by Flash to trigger the various
+	events.
+
+	All these functions a Private.
+
+	Because the ExternalInterface library is buggy the event calls
+	are added to a queue and the queue then executed by a setTimeout.
+	This ensures that events are executed in a determinate order and that
+	the ExternalInterface bugs are avoided.
+******************************* */
+
+SWFUpload.prototype.queueEvent = function (handlerName, argumentArray) {
+	// Warning: Don't call this.debug inside here or you'll create an infinite loop
+
+	if (argumentArray == undefined) {
+		argumentArray = [];
+	} else if (!(argumentArray instanceof Array)) {
+		argumentArray = [argumentArray];
+	}
+
+	var self = this;
+	if (typeof this.settings[handlerName] === "function") {
+		// Queue the event
+		this.eventQueue.push(function () {
+			this.settings[handlerName].apply(this, argumentArray);
+		});
+
+		// Execute the next queued event
+		setTimeout(function () {
+			self.executeNextEvent();
+		}, 0);
+
+	} else if (this.settings[handlerName] !== null) {
+		throw "Event handler " + handlerName + " is unknown or is not a function";
+	}
+};
+
+// Private: Causes the next event in the queue to be executed.  Since events are queued using a setTimeout
+// we must queue them in order to garentee that they are executed in order.
+SWFUpload.prototype.executeNextEvent = function () {
+	// Warning: Don't call this.debug inside here or you'll create an infinite loop
+
+	var  f = this.eventQueue ? this.eventQueue.shift() : null;
+	if (typeof(f) === "function") {
+		f.apply(this);
+	}
+};
+
+// Private: unescapeFileParams is part of a workaround for a flash bug where objects passed through ExternalInterface cannot have
+// properties that contain characters that are not valid for JavaScript identifiers. To work around this
+// the Flash Component escapes the parameter names and we must unescape again before passing them along.
+SWFUpload.prototype.unescapeFilePostParams = function (file) {
+	var reg = /[$]([0-9a-f]{4})/i;
+	var unescapedPost = {};
+	var uk;
+
+	if (file != undefined) {
+		for (var k in file.post) {
+			if (file.post.hasOwnProperty(k)) {
+				uk = k;
+				var match;
+				while ((match = reg.exec(uk)) !== null) {
+					uk = uk.replace(match[0], String.fromCharCode(parseInt("0x" + match[1], 16)));
+				}
+				unescapedPost[uk] = file.post[k];
+			}
+		}
+
+		file.post = unescapedPost;
+	}
+
+	return file;
+};
+
+// Private: Called by Flash to see if JS can call in to Flash (test if External Interface is working)
+SWFUpload.prototype.testExternalInterface = function () {
+	try {
+		return this.callFlash("TestExternalInterface");
+	} catch (ex) {
+		return false;
+	}
+};
+
+// Private: This event is called by Flash when it has finished loading. Don't modify this.
+// Use the swfupload_loaded_handler event setting to execute custom code when SWFUpload has loaded.
+SWFUpload.prototype.flashReady = function () {
+	// Check that the movie element is loaded correctly with its ExternalInterface methods defined
+	var movieElement = this.getMovieElement();
+
+	if (!movieElement) {
+		this.debug("Flash called back ready but the flash movie can't be found.");
+		return;
+	}
+
+	this.cleanUp(movieElement);
+
+	this.queueEvent("swfupload_loaded_handler");
+};
+
+// Private: removes Flash added fuctions to the DOM node to prevent memory leaks in IE.
+// This function is called by Flash each time the ExternalInterface functions are created.
+SWFUpload.prototype.cleanUp = function (movieElement) {
+	// Pro-actively unhook all the Flash functions
+	try {
+		if (this.movieElement && typeof(movieElement.CallFunction) === "unknown") { // We only want to do this in IE
+			this.debug("Removing Flash functions hooks (this should only run in IE and should prevent memory leaks)");
+			for (var key in movieElement) {
+				try {
+					if (typeof(movieElement[key]) === "function") {
+						movieElement[key] = null;
+					}
+				} catch (ex) {
+				}
+			}
+		}
+	} catch (ex1) {
+
+	}
+
+	// Fix Flashes own cleanup code so if the SWFMovie was removed from the page
+	// it doesn't display errors.
+	window["__flash__removeCallback"] = function (instance, name) {
+		try {
+			if (instance) {
+				instance[name] = null;
+			}
+		} catch (flashEx) {
+
+		}
+	};
+
+};
+
+
+/* This is a chance to do something before the browse window opens */
+SWFUpload.prototype.fileDialogStart = function () {
+	this.queueEvent("file_dialog_start_handler");
+};
+
+
+/* Called when a file is successfully added to the queue. */
+SWFUpload.prototype.fileQueued = function (file) {
+	file = this.unescapeFilePostParams(file);
+	this.queueEvent("file_queued_handler", file);
+};
+
+
+/* Handle errors that occur when an attempt to queue a file fails. */
+SWFUpload.prototype.fileQueueError = function (file, errorCode, message) {
+	file = this.unescapeFilePostParams(file);
+	this.queueEvent("file_queue_error_handler", [file, errorCode, message]);
+};
+
+/* Called after the file dialog has closed and the selected files have been queued.
+	You could call startUpload here if you want the queued files to begin uploading immediately. */
+SWFUpload.prototype.fileDialogComplete = function (numFilesSelected, numFilesQueued, numFilesInQueue) {
+	this.queueEvent("file_dialog_complete_handler", [numFilesSelected, numFilesQueued, numFilesInQueue]);
+};
+
+SWFUpload.prototype.uploadStart = function (file) {
+	file = this.unescapeFilePostParams(file);
+	this.queueEvent("return_upload_start_handler", file);
+};
+
+SWFUpload.prototype.returnUploadStart = function (file) {
+	var returnValue;
+	if (typeof this.settings.upload_start_handler === "function") {
+		file = this.unescapeFilePostParams(file);
+		returnValue = this.settings.upload_start_handler.call(this, file);
+	} else if (this.settings.upload_start_handler != undefined) {
+		throw "upload_start_handler must be a function";
+	}
+
+	// Convert undefined to true so if nothing is returned from the upload_start_handler it is
+	// interpretted as 'true'.
+	if (returnValue === undefined) {
+		returnValue = true;
+	}
+
+	returnValue = !!returnValue;
+
+	this.callFlash("ReturnUploadStart", [returnValue]);
+};
+
+
+
+SWFUpload.prototype.uploadProgress = function (file, bytesComplete, bytesTotal) {
+	file = this.unescapeFilePostParams(file);
+	this.queueEvent("upload_progress_handler", [file, bytesComplete, bytesTotal]);
+};
+
+SWFUpload.prototype.uploadError = function (file, errorCode, message) {
+	file = this.unescapeFilePostParams(file);
+	this.queueEvent("upload_error_handler", [file, errorCode, message]);
+};
+
+SWFUpload.prototype.uploadSuccess = function (file, serverData, responseReceived) {
+	file = this.unescapeFilePostParams(file);
+	this.queueEvent("upload_success_handler", [file, serverData, responseReceived]);
+};
+
+SWFUpload.prototype.uploadComplete = function (file) {
+	file = this.unescapeFilePostParams(file);
+	this.queueEvent("upload_complete_handler", file);
+};
+
+/* Called by SWFUpload JavaScript and Flash functions when debug is enabled. By default it writes messages to the
+   internal debug console.  You can override this event and have messages written where you want. */
+SWFUpload.prototype.debug = function (message) {
+	this.queueEvent("debug_handler", message);
+};
+
+
+/* **********************************
+	Debug Console
+	The debug console is a self contained, in page location
+	for debug message to be sent.  The Debug Console adds
+	itself to the body if necessary.
+
+	The console is automatically scrolled as messages appear.
+
+	If you are using your own debug handler or when you deploy to production and
+	have debug disabled you can remove these functions to reduce the file size
+	and complexity.
+********************************** */
+
+// Private: debugMessage is the default debug_handler.  If you want to print debug messages
+// call the debug() function.  When overriding the function your own function should
+// check to see if the debug setting is true before outputting debug information.
+SWFUpload.prototype.debugMessage = function (message) {
+	if (this.settings.debug) {
+		var exceptionMessage, exceptionValues = [];
+
+		// Check for an exception object and print it nicely
+		if (typeof message === "object" && typeof message.name === "string" && typeof message.message === "string") {
+			for (var key in message) {
+				if (message.hasOwnProperty(key)) {
+					exceptionValues.push(key + ": " + message[key]);
+				}
+			}
+			exceptionMessage = exceptionValues.join("\n") || "";
+			exceptionValues = exceptionMessage.split("\n");
+			exceptionMessage = "EXCEPTION: " + exceptionValues.join("\nEXCEPTION: ");
+			SWFUpload.Console.writeLine(exceptionMessage);
+		} else {
+			SWFUpload.Console.writeLine(message);
+		}
+	}
+};
+
+SWFUpload.Console = {};
+SWFUpload.Console.writeLine = function (message) {
+	var console, documentForm;
+
+	try {
+		console = document.getElementById("SWFUpload_Console");
+
+		if (!console) {
+			documentForm = document.createElement("form");
+			document.getElementsByTagName("body")[0].appendChild(documentForm);
+
+			console = document.createElement("textarea");
+			console.id = "SWFUpload_Console";
+			console.style.fontFamily = "monospace";
+			console.setAttribute("wrap", "off");
+			console.wrap = "off";
+			console.style.overflow = "auto";
+			console.style.width = "700px";
+			console.style.height = "350px";
+			console.style.margin = "5px";
+			documentForm.appendChild(console);
+		}
+
+		console.value += message + "\n";
+
+		console.scrollTop = console.scrollHeight - console.clientHeight;
+	} catch (ex) {
+		alert("Exception: " + ex.name + " Message: " + ex.message);
+	}
+};
+
+})();
+
+(function() {
+/*
+	Queue Plug-in
+
+	Features:
+		*Adds a cancelQueue() method for cancelling the entire queue.
+		*All queued files are uploaded when startUpload() is called.
+		*If false is returned from uploadComplete then the queue upload is stopped.
+		 If false is not returned (strict comparison) then the queue upload is continued.
+		*Adds a QueueComplete event that is fired when all the queued files have finished uploading.
+		 Set the event handler with the queue_complete_handler setting.
+
+	*/
+
+if (typeof(SWFUpload) === "function") {
+	SWFUpload.queue = {};
+
+	SWFUpload.prototype.initSettings = (function (oldInitSettings) {
+		return function () {
+			if (typeof(oldInitSettings) === "function") {
+				oldInitSettings.call(this);
+			}
+
+			this.queueSettings = {};
+
+			this.queueSettings.queue_cancelled_flag = false;
+			this.queueSettings.queue_upload_count = 0;
+
+			this.queueSettings.user_upload_complete_handler = this.settings.upload_complete_handler;
+			this.queueSettings.user_upload_start_handler = this.settings.upload_start_handler;
+			this.settings.upload_complete_handler = SWFUpload.queue.uploadCompleteHandler;
+			this.settings.upload_start_handler = SWFUpload.queue.uploadStartHandler;
+
+			this.settings.queue_complete_handler = this.settings.queue_complete_handler || null;
+		};
+	})(SWFUpload.prototype.initSettings);
+
+	SWFUpload.prototype.startUpload = function (fileID) {
+		this.queueSettings.queue_cancelled_flag = false;
+		this.callFlash("StartUpload", [fileID]);
+	};
+
+	SWFUpload.prototype.cancelQueue = function () {
+		this.queueSettings.queue_cancelled_flag = true;
+		this.stopUpload();
+
+		var stats = this.getStats();
+		while (stats.files_queued > 0) {
+			this.cancelUpload();
+			stats = this.getStats();
+		}
+	};
+
+	SWFUpload.queue.uploadStartHandler = function (file) {
+		var returnValue;
+		if (typeof(this.queueSettings.user_upload_start_handler) === "function") {
+			returnValue = this.queueSettings.user_upload_start_handler.call(this, file);
+		}
+
+		// To prevent upload a real "FALSE" value must be returned, otherwise default to a real "TRUE" value.
+		returnValue = (returnValue === false) ? false : true;
+
+		this.queueSettings.queue_cancelled_flag = !returnValue;
+
+		return returnValue;
+	};
+
+	SWFUpload.queue.uploadCompleteHandler = function (file) {
+		var user_upload_complete_handler = this.queueSettings.user_upload_complete_handler;
+		var continueUpload;
+
+		if (file.filestatus === SWFUpload.FILE_STATUS.COMPLETE) {
+			this.queueSettings.queue_upload_count++;
+		}
+
+		if (typeof(user_upload_complete_handler) === "function") {
+			continueUpload = (user_upload_complete_handler.call(this, file) === false) ? false : true;
+		} else if (file.filestatus === SWFUpload.FILE_STATUS.QUEUED) {
+			// If the file was stopped and re-queued don't restart the upload
+			continueUpload = false;
+		} else {
+			continueUpload = true;
+		}
+
+		if (continueUpload) {
+			var stats = this.getStats();
+			if (stats.files_queued > 0 && this.queueSettings.queue_cancelled_flag === false) {
+				this.startUpload();
+			} else if (this.queueSettings.queue_cancelled_flag === false) {
+				this.queueEvent("queue_complete_handler", [this.queueSettings.queue_upload_count]);
+				this.queueSettings.queue_upload_count = 0;
+			} else {
+				this.queueSettings.queue_cancelled_flag = false;
+				this.queueSettings.queue_upload_count = 0;
+			}
+		}
+	};
+}
+
+})();
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('pagebreak', function(K) {
+	var self = this;
+	var name = 'pagebreak';
+	var pagebreakHtml = K.undef(self.pagebreakHtml, '<hr style="page-break-after: always;" class="ke-pagebreak" />');
+
+	self.clickToolbar(name, function() {
+		var cmd = self.cmd, range = cmd.range;
+		self.focus();
+		range.enlarge(true);
+		cmd.split(true);
+		var tail = self.newlineTag == 'br' || K.WEBKIT ? '' : '<p id="__kindeditor_tail_tag__"></p>';
+		self.insertHtml(pagebreakHtml + tail);
+		if (tail !== '') {
+			var p = K('#__kindeditor_tail_tag__', self.edit.doc);
+			range.selectNodeContents(p[0]);
+			p.removeAttr('id');
+			cmd.select();
+		}
+	});
+});
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('plainpaste', function(K) {
+	var self = this, name = 'plainpaste';
+	self.clickToolbar(name, function() {
+		var lang = self.lang(name + '.'),
+			html = '<div style="padding:10px 20px;">' +
+				'<div style="margin-bottom:10px;">' + lang.comment + '</div>' +
+				'<textarea class="ke-textarea" style="width:408px;height:260px;"></textarea>' +
+				'</div>',
+			dialog = self.createDialog({
+				name : name,
+				width : 450,
+				title : self.lang(name),
+				body : html,
+				yesBtn : {
+					name : self.lang('yes'),
+					click : function(e) {
+						var html = textarea.val();
+						html = K.escape(html);
+						html = html.replace(/ {2}/g, ' &nbsp;');
+						if (self.newlineTag == 'p') {
+							html = html.replace(/^/, '<p>').replace(/$/, '</p>').replace(/\n/g, '</p><p>');
+						} else {
+							html = html.replace(/\n/g, '<br />$&');
+						}
+						self.insertHtml(html).hideDialog().focus();
+					}
+				}
+			}),
+			textarea = K('textarea', dialog.div);
+		textarea[0].focus();
+	});
+});
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('preview', function(K) {
+	var self = this, name = 'preview', undefined;
+	self.clickToolbar(name, function() {
+		var lang = self.lang(name + '.'),
+			html = '<div style="padding:10px 20px;">' +
+				'<iframe class="ke-textarea" frameborder="0" style="width:708px;height:400px;"></iframe>' +
+				'</div>',
+			dialog = self.createDialog({
+				name : name,
+				width : 750,
+				title : self.lang(name),
+				body : html
+			}),
+			iframe = K('iframe', dialog.div),
+			doc = K.iframeDoc(iframe);
+		doc.open();
+		doc.write(self.fullHtml());
+		doc.close();
+		K(doc.body).css('background-color', '#FFF');
+		iframe[0].contentWindow.focus();
+	});
+});
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('quickformat', function(K) {
+	var self = this, name = 'quickformat',
+		blockMap = K.toMap('blockquote,center,div,h1,h2,h3,h4,h5,h6,p');
+	function getFirstChild(knode) {
+		var child = knode.first();
+		while (child && child.first()) {
+			child = child.first();
+		}
+		return child;
+	}
+	self.clickToolbar(name, function() {
+		self.focus();
+		var doc = self.edit.doc,
+			range = self.cmd.range,
+			child = K(doc.body).first(), next,
+			nodeList = [], subList = [],
+			bookmark = range.createBookmark(true);
+		while(child) {
+			next = child.next();
+			var firstChild = getFirstChild(child);
+			if (!firstChild || firstChild.name != 'img') {
+				if (blockMap[child.name]) {
+					child.html(child.html().replace(/^(\s|&nbsp;|銆�)+/ig, ''));
+					child.css('text-indent', '2em');
+				} else {
+					subList.push(child);
+				}
+				if (!next || (blockMap[next.name] || blockMap[child.name] && !blockMap[next.name])) {
+					if (subList.length > 0) {
+						nodeList.push(subList);
+					}
+					subList = [];
+				}
+			}
+			child = next;
+		}
+		K.each(nodeList, function(i, subList) {
+			var wrapper = K('<p style="text-indent:2em;"></p>', doc);
+			subList[0].before(wrapper);
+			K.each(subList, function(i, knode) {
+				wrapper.append(knode);
+			});
+		});
+		range.moveToBookmark(bookmark);
+		self.addBookmark();
+	});
+});
+
+/**
+--------------------------
+abcd<br />
+1234<br />
+
+to
+
+<p style="text-indent:2em;">
+	abcd<br />
+	1234<br />
+</p>
+
+--------------------------
+
+&nbsp; abcd<img>1233
+<p>1234</p>
+
+to
+
+<p style="text-indent:2em;">abcd<img>1233</p>
+<p style="text-indent:2em;">1234</p>
+
+--------------------------
+*//*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('table', function(K) {
+	var self = this, name = 'table', lang = self.lang(name + '.'), zeroborder = 'ke-zeroborder';
+	// 璁剧疆棰滆壊
+	function _setColor(box, color) {
+		color = color.toUpperCase();
+		box.css('background-color', color);
+		box.css('color', color === '#000000' ? '#FFFFFF' : '#000000');
+		box.html(color);
+	}
+	// 鍒濆鍖栧彇鑹插櫒
+	var pickerList = [];
+	function _initColorPicker(dialogDiv, colorBox) {
+		colorBox.bind('click,mousedown', function(e){
+			e.stopPropagation();
+		});
+		function removePicker() {
+			K.each(pickerList, function() {
+				this.remove();
+			});
+			pickerList = [];
+			K(document).unbind('click,mousedown', removePicker);
+			dialogDiv.unbind('click,mousedown', removePicker);
+		}
+		colorBox.click(function(e) {
+			removePicker();
+			var box = K(this),
+				pos = box.pos();
+			var picker = K.colorpicker({
+				x : pos.x,
+				y : pos.y + box.height(),
+				z : 811214,
+				selectedColor : K(this).html(),
+				colors : self.colorTable,
+				noColor : self.lang('noColor'),
+				shadowMode : self.shadowMode,
+				click : function(color) {
+					_setColor(box, color);
+					removePicker();
+				}
+			});
+			pickerList.push(picker);
+			K(document).bind('click,mousedown', removePicker);
+			dialogDiv.bind('click,mousedown', removePicker);
+		});
+	}
+	// 鍙栧緱涓嬩竴琛宑ell鐨刬ndex
+	function _getCellIndex(table, row, cell) {
+		var rowSpanCount = 0;
+		for (var i = 0, len = row.cells.length; i < len; i++) {
+			if (row.cells[i] == cell) {
+				break;
+			}
+			rowSpanCount += row.cells[i].rowSpan - 1;
+		}
+		return cell.cellIndex - rowSpanCount;
+	}
+	self.plugin.table = {
+		//insert or modify table
+		prop : function(isInsert) {
+			var html = [
+				'<div style="padding:20px;">',
+				//rows, cols
+				'<div class="ke-dialog-row">',
+				'<label for="keRows" style="width:90px;">' + lang.cells + '</label>',
+				lang.rows + ' <input type="text" id="keRows" class="ke-input-text ke-input-number" name="rows" value="" maxlength="4" /> &nbsp; ',
+				lang.cols + ' <input type="text" class="ke-input-text ke-input-number" name="cols" value="" maxlength="4" />',
+				'</div>',
+				//width, height
+				'<div class="ke-dialog-row">',
+				'<label for="keWidth" style="width:90px;">' + lang.size + '</label>',
+				lang.width + ' <input type="text" id="keWidth" class="ke-input-text ke-input-number" name="width" value="" maxlength="4" /> &nbsp; ',
+				'<select name="widthType">',
+				'<option value="%">' + lang.percent + '</option>',
+				'<option value="px">' + lang.px + '</option>',
+				'</select> &nbsp; ',
+				lang.height + ' <input type="text" class="ke-input-text ke-input-number" name="height" value="" maxlength="4" /> &nbsp; ',
+				'<select name="heightType">',
+				'<option value="%">' + lang.percent + '</option>',
+				'<option value="px">' + lang.px + '</option>',
+				'</select>',
+				'</div>',
+				//space, padding
+				'<div class="ke-dialog-row">',
+				'<label for="kePadding" style="width:90px;">' + lang.space + '</label>',
+				lang.padding + ' <input type="text" id="kePadding" class="ke-input-text ke-input-number" name="padding" value="" maxlength="4" /> &nbsp; ',
+				lang.spacing + ' <input type="text" class="ke-input-text ke-input-number" name="spacing" value="" maxlength="4" />',
+				'</div>',
+				//align
+				'<div class="ke-dialog-row">',
+				'<label for="keAlign" style="width:90px;">' + lang.align + '</label>',
+				'<select id="keAlign" name="align">',
+				'<option value="">' + lang.alignDefault + '</option>',
+				'<option value="left">' + lang.alignLeft + '</option>',
+				'<option value="center">' + lang.alignCenter + '</option>',
+				'<option value="right">' + lang.alignRight + '</option>',
+				'</select>',
+				'</div>',
+				//border
+				'<div class="ke-dialog-row">',
+				'<label for="keBorder" style="width:90px;">' + lang.border + '</label>',
+				lang.borderWidth + ' <input type="text" id="keBorder" class="ke-input-text ke-input-number" name="border" value="" maxlength="4" /> &nbsp; ',
+				lang.borderColor + ' <span class="ke-inline-block ke-input-color"></span>',
+				'</div>',
+				//background color
+				'<div class="ke-dialog-row">',
+				'<label for="keBgColor" style="width:90px;">' + lang.backgroundColor + '</label>',
+				'<span class="ke-inline-block ke-input-color"></span>',
+				'</div>',
+				'</div>'
+			].join('');
+			var dialog = self.createDialog({
+				name : name,
+				width : 500,
+				title : self.lang(name),
+				body : html,
+				beforeRemove : function() {
+					colorBox.unbind();
+				},
+				yesBtn : {
+					name : self.lang('yes'),
+					click : function(e) {
+						var rows = rowsBox.val(),
+							cols = colsBox.val(),
+							width = widthBox.val(),
+							height = heightBox.val(),
+							widthType = widthTypeBox.val(),
+							heightType = heightTypeBox.val(),
+							padding = paddingBox.val(),
+							spacing = spacingBox.val(),
+							align = alignBox.val(),
+							border = borderBox.val(),
+							borderColor = K(colorBox[0]).html() || '',
+							bgColor = K(colorBox[1]).html() || '';
+						if (rows == 0 || !/^\d+$/.test(rows)) {
+							alert(self.lang('invalidRows'));
+							rowsBox[0].focus();
+							return;
+						}
+						if (cols == 0 || !/^\d+$/.test(cols)) {
+							alert(self.lang('invalidRows'));
+							colsBox[0].focus();
+							return;
+						}
+						if (!/^\d*$/.test(width)) {
+							alert(self.lang('invalidWidth'));
+							widthBox[0].focus();
+							return;
+						}
+						if (!/^\d*$/.test(height)) {
+							alert(self.lang('invalidHeight'));
+							heightBox[0].focus();
+							return;
+						}
+						if (!/^\d*$/.test(padding)) {
+							alert(self.lang('invalidPadding'));
+							paddingBox[0].focus();
+							return;
+						}
+						if (!/^\d*$/.test(spacing)) {
+							alert(self.lang('invalidSpacing'));
+							spacingBox[0].focus();
+							return;
+						}
+						if (!/^\d*$/.test(border)) {
+							alert(self.lang('invalidBorder'));
+							borderBox[0].focus();
+							return;
+						}
+						//modify table
+						if (table) {
+							if (width !== '') {
+								table.width(width + widthType);
+							} else {
+								table.css('width', '');
+							}
+							if (table[0].width !== undefined) {
+								table.removeAttr('width');
+							}
+							if (height !== '') {
+								table.height(height + heightType);
+							} else {
+								table.css('height', '');
+							}
+							if (table[0].height !== undefined) {
+								table.removeAttr('height');
+							}
+							table.css('background-color', bgColor);
+							if (table[0].bgColor !== undefined) {
+								table.removeAttr('bgColor');
+							}
+							if (padding !== '') {
+								table[0].cellPadding = padding;
+							} else {
+								table.removeAttr('cellPadding');
+							}
+							if (spacing !== '') {
+								table[0].cellSpacing = spacing;
+							} else {
+								table.removeAttr('cellSpacing');
+							}
+							if (align !== '') {
+								table[0].align = align;
+							} else {
+								table.removeAttr('align');
+							}
+							if (border !== '') {
+								table.attr('border', border);
+							} else {
+								table.removeAttr('border');
+							}
+							if (border === '' || border === '0') {
+								table.addClass(zeroborder);
+							} else {
+								table.removeClass(zeroborder);
+							}
+							if (borderColor !== '') {
+								table.attr('borderColor', borderColor);
+							} else {
+								table.removeAttr('borderColor');
+							}
+							self.hideDialog().focus();
+							return;
+						}
+						//insert new table
+						var style = '';
+						if (width !== '') {
+							style += 'width:' + width + widthType + ';';
+						}
+						if (height !== '') {
+							style += 'height:' + height + heightType + ';';
+						}
+						if (bgColor !== '') {
+							style += 'background-color:' + bgColor + ';';
+						}
+						var html = '<table';
+						if (style !== '') {
+							html += ' style="' + style + '"';
+						}
+						if (padding !== '') {
+							html += ' cellpadding="' + padding + '"';
+						}
+						if (spacing !== '') {
+							html += ' cellspacing="' + spacing + '"';
+						}
+						if (align !== '') {
+							html += ' align="' + align + '"';
+						}
+						if (border !== '') {
+							html += ' border="' + border + '"';
+						}
+						if (border === '' || border === '0') {
+							html += ' class="' + zeroborder + '"';
+						}
+						if (borderColor !== '') {
+							html += ' bordercolor="' + borderColor + '"';
+						}
+						html += '>';
+						for (var i = 0; i < rows; i++) {
+							html += '<tr>';
+							for (var j = 0; j < cols; j++) {
+								html += '<td>' + (K.IE ? '&nbsp;' : '<br />') + '</td>';
+							}
+							html += '</tr>';
+						}
+						html += '</table>';
+						if (!K.IE) {
+							html += '<br />';
+						}
+						self.insertHtml(html);
+						self.select().hideDialog().focus();
+						self.addBookmark();
+					}
+				}
+			}),
+			div = dialog.div,
+			rowsBox = K('[name="rows"]', div).val(3),
+			colsBox = K('[name="cols"]', div).val(2),
+			widthBox = K('[name="width"]', div).val(100),
+			heightBox = K('[name="height"]', div),
+			widthTypeBox = K('[name="widthType"]', div),
+			heightTypeBox = K('[name="heightType"]', div),
+			paddingBox = K('[name="padding"]', div).val(2),
+			spacingBox = K('[name="spacing"]', div).val(0),
+			alignBox = K('[name="align"]', div),
+			borderBox = K('[name="border"]', div).val(1),
+			colorBox = K('.ke-input-color', div);
+			_initColorPicker(div, colorBox.eq(0));
+			_initColorPicker(div, colorBox.eq(1));
+			_setColor(colorBox.eq(0), '#000000');
+			_setColor(colorBox.eq(1), '');
+			// foucs and select
+			rowsBox[0].focus();
+			rowsBox[0].select();
+			var table;
+			if (isInsert) {
+				return;
+			}
+			//get selected table node
+			table = self.plugin.getSelectedTable();
+			if (table) {
+				rowsBox.val(table[0].rows.length);
+				colsBox.val(table[0].rows.length > 0 ? table[0].rows[0].cells.length : 0);
+				rowsBox.attr('disabled', true);
+				colsBox.attr('disabled', true);
+				var match,
+					tableWidth = table[0].style.width || table[0].width,
+					tableHeight = table[0].style.height || table[0].height;
+				if (tableWidth !== undefined && (match = /^(\d+)((?:px|%)*)$/.exec(tableWidth))) {
+					widthBox.val(match[1]);
+					widthTypeBox.val(match[2]);
+				} else {
+					widthBox.val('');
+				}
+				if (tableHeight !== undefined && (match = /^(\d+)((?:px|%)*)$/.exec(tableHeight))) {
+					heightBox.val(match[1]);
+					heightTypeBox.val(match[2]);
+				}
+				paddingBox.val(table[0].cellPadding || '');
+				spacingBox.val(table[0].cellSpacing || '');
+				alignBox.val(table[0].align || '');
+				borderBox.val(table[0].border === undefined ? '' : table[0].border);
+				_setColor(colorBox.eq(0), K.toHex(table.attr('borderColor') || ''));
+				_setColor(colorBox.eq(1), K.toHex(table[0].style.backgroundColor || table[0].bgColor || ''));
+				widthBox[0].focus();
+				widthBox[0].select();
+			}
+		},
+		//modify cell
+		cellprop : function() {
+			var html = [
+				'<div style="padding:20px;">',
+				//width, height
+				'<div class="ke-dialog-row">',
+				'<label for="keWidth" style="width:90px;">' + lang.size + '</label>',
+				lang.width + ' <input type="text" id="keWidth" class="ke-input-text ke-input-number" name="width" value="" maxlength="4" /> &nbsp; ',
+				'<select name="widthType">',
+				'<option value="%">' + lang.percent + '</option>',
+				'<option value="px">' + lang.px + '</option>',
+				'</select> &nbsp; ',
+				lang.height + ' <input type="text" class="ke-input-text ke-input-number" name="height" value="" maxlength="4" /> &nbsp; ',
+				'<select name="heightType">',
+				'<option value="%">' + lang.percent + '</option>',
+				'<option value="px">' + lang.px + '</option>',
+				'</select>',
+				'</div>',
+				//align
+				'<div class="ke-dialog-row">',
+				'<label for="keAlign" style="width:90px;">' + lang.align + '</label>',
+				lang.textAlign + ' <select id="keAlign" name="textAlign">',
+				'<option value="">' + lang.alignDefault + '</option>',
+				'<option value="left">' + lang.alignLeft + '</option>',
+				'<option value="center">' + lang.alignCenter + '</option>',
+				'<option value="right">' + lang.alignRight + '</option>',
+				'</select> ',
+				lang.verticalAlign + ' <select name="verticalAlign">',
+				'<option value="">' + lang.alignDefault + '</option>',
+				'<option value="top">' + lang.alignTop + '</option>',
+				'<option value="middle">' + lang.alignMiddle + '</option>',
+				'<option value="bottom">' + lang.alignBottom + '</option>',
+				'<option value="baseline">' + lang.alignBaseline + '</option>',
+				'</select>',
+				'</div>',
+				//border
+				'<div class="ke-dialog-row">',
+				'<label for="keBorder" style="width:90px;">' + lang.border + '</label>',
+				lang.borderWidth + ' <input type="text" id="keBorder" class="ke-input-text ke-input-number" name="border" value="" maxlength="4" /> &nbsp; ',
+				lang.borderColor + ' <span class="ke-inline-block ke-input-color"></span>',
+				'</div>',
+				//background color
+				'<div class="ke-dialog-row">',
+				'<label for="keBgColor" style="width:90px;">' + lang.backgroundColor + '</label>',
+				'<span class="ke-inline-block ke-input-color"></span>',
+				'</div>',
+				'</div>'
+			].join('');
+			var dialog = self.createDialog({
+				name : name,
+				width : 500,
+				title : self.lang('tablecell'),
+				body : html,
+				beforeRemove : function() {
+					colorBox.unbind();
+				},
+				yesBtn : {
+					name : self.lang('yes'),
+					click : function(e) {
+						var width = widthBox.val(),
+							height = heightBox.val(),
+							widthType = widthTypeBox.val(),
+							heightType = heightTypeBox.val(),
+							padding = paddingBox.val(),
+							spacing = spacingBox.val(),
+							textAlign = textAlignBox.val(),
+							verticalAlign = verticalAlignBox.val(),
+							border = borderBox.val(),
+							borderColor = K(colorBox[0]).html() || '',
+							bgColor = K(colorBox[1]).html() || '';
+						if (!/^\d*$/.test(width)) {
+							alert(self.lang('invalidWidth'));
+							widthBox[0].focus();
+							return;
+						}
+						if (!/^\d*$/.test(height)) {
+							alert(self.lang('invalidHeight'));
+							heightBox[0].focus();
+							return;
+						}
+						if (!/^\d*$/.test(border)) {
+							alert(self.lang('invalidBorder'));
+							borderBox[0].focus();
+							return;
+						}
+						cell.css({
+							width : width !== '' ? (width + widthType) : '',
+							height : height !== '' ? (height + heightType) : '',
+							'background-color' : bgColor,
+							'text-align' : textAlign,
+							'vertical-align' : verticalAlign,
+							'border-width' : border,
+							'border-style' : border !== '' ? 'solid' : '',
+							'border-color' : borderColor
+						});
+						self.hideDialog().focus();
+						self.addBookmark();
+					}
+				}
+			}),
+			div = dialog.div,
+			widthBox = K('[name="width"]', div).val(100),
+			heightBox = K('[name="height"]', div),
+			widthTypeBox = K('[name="widthType"]', div),
+			heightTypeBox = K('[name="heightType"]', div),
+			paddingBox = K('[name="padding"]', div).val(2),
+			spacingBox = K('[name="spacing"]', div).val(0),
+			textAlignBox = K('[name="textAlign"]', div),
+			verticalAlignBox = K('[name="verticalAlign"]', div),
+			borderBox = K('[name="border"]', div).val(1),
+			colorBox = K('.ke-input-color', div);
+			_initColorPicker(div, colorBox.eq(0));
+			_initColorPicker(div, colorBox.eq(1));
+			_setColor(colorBox.eq(0), '#000000');
+			_setColor(colorBox.eq(1), '');
+			// foucs and select
+			widthBox[0].focus();
+			widthBox[0].select();
+			// get selected cell
+			var cell = self.plugin.getSelectedCell();
+			var match,
+				cellWidth = cell[0].style.width || cell[0].width || '',
+				cellHeight = cell[0].style.height || cell[0].height || '';
+			if ((match = /^(\d+)((?:px|%)*)$/.exec(cellWidth))) {
+				widthBox.val(match[1]);
+				widthTypeBox.val(match[2]);
+			} else {
+				widthBox.val('');
+			}
+			if ((match = /^(\d+)((?:px|%)*)$/.exec(cellHeight))) {
+				heightBox.val(match[1]);
+				heightTypeBox.val(match[2]);
+			}
+			textAlignBox.val(cell[0].style.textAlign || '');
+			verticalAlignBox.val(cell[0].style.verticalAlign || '');
+			var border = cell[0].style.borderWidth || '';
+			if (border) {
+				border = parseInt(border);
+			}
+			borderBox.val(border);
+			_setColor(colorBox.eq(0), K.toHex(cell[0].style.borderColor || ''));
+			_setColor(colorBox.eq(1), K.toHex(cell[0].style.backgroundColor || ''));
+			widthBox[0].focus();
+			widthBox[0].select();
+		},
+		insert : function() {
+			this.prop(true);
+		},
+		'delete' : function() {
+			var table = self.plugin.getSelectedTable();
+			self.cmd.range.setStartBefore(table[0]).collapse(true);
+			self.cmd.select();
+			table.remove();
+			self.addBookmark();
+		},
+		colinsert : function(offset) {
+			var table = self.plugin.getSelectedTable()[0],
+				row = self.plugin.getSelectedRow()[0],
+				cell = self.plugin.getSelectedCell()[0],
+				index = cell.cellIndex + offset;
+			// 鍙栧緱绗竴琛岀殑index
+			index += table.rows[0].cells.length - row.cells.length;
+
+			for (var i = 0, len = table.rows.length; i < len; i++) {
+				var newRow = table.rows[i],
+					newCell = newRow.insertCell(index);
+				newCell.innerHTML = K.IE ? '' : '<br />';
+				// 璋冩暣涓嬩竴琛岀殑鍗曞厓鏍糹ndex
+				index = _getCellIndex(table, newRow, newCell);
+			}
+			self.cmd.range.selectNodeContents(cell).collapse(true);
+			self.cmd.select();
+			self.addBookmark();
+		},
+		colinsertleft : function() {
+			this.colinsert(0);
+		},
+		colinsertright : function() {
+			this.colinsert(1);
+		},
+		rowinsert : function(offset) {
+			var table = self.plugin.getSelectedTable()[0],
+				row = self.plugin.getSelectedRow()[0],
+				cell = self.plugin.getSelectedCell()[0];
+			var rowIndex = row.rowIndex;
+			if (offset === 1) {
+				rowIndex = row.rowIndex + (cell.rowSpan - 1) + offset;
+			}
+			var newRow = table.insertRow(rowIndex);
+
+			for (var i = 0, len = row.cells.length; i < len; i++) {
+				// 璋冩暣cell涓暟
+				if (row.cells[i].rowSpan > 1) {
+					len -= row.cells[i].rowSpan - 1;
+				}
+				var newCell = newRow.insertCell(i);
+				// copy colspan
+				if (offset === 1 && row.cells[i].colSpan > 1) {
+					newCell.colSpan = row.cells[i].colSpan;
+				}
+				newCell.innerHTML = K.IE ? '' : '<br />';
+			}
+			// 璋冩暣rowspan
+			for (var j = rowIndex; j >= 0; j--) {
+				var cells = table.rows[j].cells;
+				if (cells.length > i) {
+					for (var k = cell.cellIndex; k >= 0; k--) {
+						if (cells[k].rowSpan > 1) {
+							cells[k].rowSpan += 1;
+						}
+					}
+					break;
+				}
+			}
+			self.cmd.range.selectNodeContents(cell).collapse(true);
+			self.cmd.select();
+			self.addBookmark();
+		},
+		rowinsertabove : function() {
+			this.rowinsert(0);
+		},
+		rowinsertbelow : function() {
+			this.rowinsert(1);
+		},
+		rowmerge : function() {
+			var table = self.plugin.getSelectedTable()[0],
+				row = self.plugin.getSelectedRow()[0],
+				cell = self.plugin.getSelectedCell()[0],
+				rowIndex = row.rowIndex, // 褰撳墠琛岀殑index
+				nextRowIndex = rowIndex + cell.rowSpan, // 涓嬩竴琛岀殑index
+				nextRow = table.rows[nextRowIndex]; // 涓嬩竴琛�
+			// 鏈�鍚庝竴琛屼笉鑳藉悎骞�
+			if (table.rows.length <= nextRowIndex) {
+				return;
+			}
+			var cellIndex = cell.cellIndex; // 涓嬩竴琛屽崟鍏冩牸鐨刬ndex
+			if (nextRow.cells.length <= cellIndex) {
+				return;
+			}
+			var nextCell = nextRow.cells[cellIndex]; // 涓嬩竴琛屽崟鍏冩牸
+			// 涓婁笅琛岀殑colspan涓嶄竴鑷存椂涓嶈兘鍚堝苟
+			if (cell.colSpan !== nextCell.colSpan) {
+				return;
+			}
+			cell.rowSpan += nextCell.rowSpan;
+			nextRow.deleteCell(cellIndex);
+			self.cmd.range.selectNodeContents(cell).collapse(true);
+			self.cmd.select();
+			self.addBookmark();
+		},
+		colmerge : function() {
+			var table = self.plugin.getSelectedTable()[0],
+				row = self.plugin.getSelectedRow()[0],
+				cell = self.plugin.getSelectedCell()[0],
+				rowIndex = row.rowIndex, // 褰撳墠琛岀殑index
+				cellIndex = cell.cellIndex,
+				nextCellIndex = cellIndex + 1;
+			// 鏈�鍚庝竴鍒椾笉鑳藉悎骞�
+			if (row.cells.length <= nextCellIndex) {
+				return;
+			}
+			var nextCell = row.cells[nextCellIndex];
+			// 宸﹀彸鍒楃殑rowspan涓嶄竴鑷存椂涓嶈兘鍚堝苟
+			if (cell.rowSpan !== nextCell.rowSpan) {
+				return;
+			}
+			cell.colSpan += nextCell.colSpan;
+			row.deleteCell(nextCellIndex);
+			self.cmd.range.selectNodeContents(cell).collapse(true);
+			self.cmd.select();
+			self.addBookmark();
+		},
+		rowsplit : function() {
+			var table = self.plugin.getSelectedTable()[0],
+				row = self.plugin.getSelectedRow()[0],
+				cell = self.plugin.getSelectedCell()[0],
+				rowIndex = row.rowIndex;
+			// 涓嶆槸鍙垎鍓插崟鍏冩牸
+			if (cell.rowSpan === 1) {
+				return;
+			}
+			var cellIndex = _getCellIndex(table, row, cell);
+			for (var i = 1, len = cell.rowSpan; i < len; i++) {
+				var newRow = table.rows[rowIndex + i],
+					newCell = newRow.insertCell(cellIndex);
+				if (cell.colSpan > 1) {
+					newCell.colSpan = cell.colSpan;
+				}
+				newCell.innerHTML = K.IE ? '' : '<br />';
+				// 璋冩暣涓嬩竴琛岀殑鍗曞厓鏍糹ndex
+				cellIndex = _getCellIndex(table, newRow, newCell);
+			}
+			K(cell).removeAttr('rowSpan');
+			self.cmd.range.selectNodeContents(cell).collapse(true);
+			self.cmd.select();
+			self.addBookmark();
+		},
+		colsplit : function() {
+			var table = self.plugin.getSelectedTable()[0],
+				row = self.plugin.getSelectedRow()[0],
+				cell = self.plugin.getSelectedCell()[0],
+				cellIndex = cell.cellIndex;
+			// 涓嶆槸鍙垎鍓插崟鍏冩牸
+			if (cell.colSpan === 1) {
+				return;
+			}
+			for (var i = 1, len = cell.colSpan; i < len; i++) {
+				var newCell = row.insertCell(cellIndex + i);
+				if (cell.rowSpan > 1) {
+					newCell.rowSpan = cell.rowSpan;
+				}
+				newCell.innerHTML = K.IE ? '' : '<br />';
+			}
+			K(cell).removeAttr('colSpan');
+			self.cmd.range.selectNodeContents(cell).collapse(true);
+			self.cmd.select();
+			self.addBookmark();
+		},
+		coldelete : function() {
+			var table = self.plugin.getSelectedTable()[0],
+				row = self.plugin.getSelectedRow()[0],
+				cell = self.plugin.getSelectedCell()[0],
+				index = cell.cellIndex;
+			for (var i = 0, len = table.rows.length; i < len; i++) {
+				var newRow = table.rows[i],
+					newCell = newRow.cells[index];
+				if (newCell.colSpan > 1) {
+					newCell.colSpan -= 1;
+					if (newCell.colSpan === 1) {
+						K(newCell).removeAttr('colSpan');
+					}
+				} else {
+					newRow.deleteCell(index);
+				}
+				// 璺宠繃涓嶉渶瑕佸垹闄ょ殑琛�
+				if (newCell.rowSpan > 1) {
+					i += newCell.rowSpan - 1;
+				}
+			}
+			if (row.cells.length === 0) {
+				self.cmd.range.setStartBefore(table).collapse(true);
+				self.cmd.select();
+				K(table).remove();
+			} else {
+				self.cmd.selection(true);
+			}
+			self.addBookmark();
+		},
+		rowdelete : function() {
+			var table = self.plugin.getSelectedTable()[0],
+				row = self.plugin.getSelectedRow()[0],
+				cell = self.plugin.getSelectedCell()[0],
+				rowIndex = row.rowIndex;
+			// 浠庝笅鍒颁笂鍒犻櫎
+			for (var i = cell.rowSpan - 1; i >= 0; i--) {
+				table.deleteRow(rowIndex + i);
+			}
+			if (table.rows.length === 0) {
+				self.cmd.range.setStartBefore(table).collapse(true);
+				self.cmd.select();
+				K(table).remove();
+			} else {
+				self.cmd.selection(true);
+			}
+			self.addBookmark();
+		}
+	};
+	self.clickToolbar(name, self.plugin.table.prop);
+});
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('template', function(K) {
+	var self = this, name = 'template', lang = self.lang(name + '.'),
+		htmlPath = self.pluginsPath + name + '/html/';
+	function getFilePath(fileName) {
+		return htmlPath + fileName + '?ver=' + encodeURIComponent(K.DEBUG ? K.TIME : K.VERSION);
+	}
+	self.clickToolbar(name, function() {
+		var lang = self.lang(name + '.'),
+			arr = ['<div style="padding:10px 20px;">',
+				'<div class="ke-header">',
+				// left start
+				'<div class="ke-left">',
+				lang. selectTemplate + ' <select>'];
+			K.each(lang.fileList, function(key, val) {
+				arr.push('<option value="' + key + '">' + val + '</option>');
+			});
+			html = [arr.join(''),
+				'</select></div>',
+				// right start
+				'<div class="ke-right">',
+				'<input type="checkbox" id="keReplaceFlag" name="replaceFlag" value="1" /> <label for="keReplaceFlag">' + lang.replaceContent + '</label>',
+				'</div>',
+				'<div class="ke-clearfix"></div>',
+				'</div>',
+				'<iframe class="ke-textarea" frameborder="0" style="width:458px;height:260px;background-color:#FFF;"></iframe>',
+				'</div>'].join('');
+		var dialog = self.createDialog({
+			name : name,
+			width : 500,
+			title : self.lang(name),
+			body : html,
+			yesBtn : {
+				name : self.lang('yes'),
+				click : function(e) {
+					var doc = K.iframeDoc(iframe);
+					self[checkbox[0].checked ? 'html' : 'insertHtml'](doc.body.innerHTML).hideDialog().focus();
+				}
+			}
+		});
+		var selectBox = K('select', dialog.div),
+			checkbox = K('[name="replaceFlag"]', dialog.div),
+			iframe = K('iframe', dialog.div);
+		checkbox[0].checked = true;
+		iframe.attr('src', getFilePath(selectBox.val()));
+		selectBox.change(function() {
+			iframe.attr('src', getFilePath(this.value));
+		});
+	});
+});
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('wordpaste', function(K) {
+	var self = this, name = 'wordpaste';
+	self.clickToolbar(name, function() {
+		var lang = self.lang(name + '.'),
+			html = '<div style="padding:10px 20px;">' +
+				'<div style="margin-bottom:10px;">' + lang.comment + '</div>' +
+				'<iframe class="ke-textarea" frameborder="0" style="width:408px;height:260px;"></iframe>' +
+				'</div>',
+			dialog = self.createDialog({
+				name : name,
+				width : 450,
+				title : self.lang(name),
+				body : html,
+				yesBtn : {
+					name : self.lang('yes'),
+					click : function(e) {
+						var str = doc.body.innerHTML;
+						str = K.clearMsWord(str, self.filterMode ? self.htmlTags : K.options.htmlTags);
+						self.insertHtml(str).hideDialog().focus();
+					}
+				}
+			}),
+			div = dialog.div,
+			iframe = K('iframe', div),
+			doc = K.iframeDoc(iframe);
+		if (!K.IE) {
+			doc.designMode = 'on';
+		}
+		doc.open();
+		doc.write('<!doctype html><html><head><title>WordPaste</title></head>');
+		doc.write('<body style="background-color:#FFF;font-size:12px;margin:2px;">');
+		if (!K.IE) {
+			doc.write('<br />');
+		}
+		doc.write('</body></html>');
+		doc.close();
+		if (K.IE) {
+			doc.body.contentEditable = 'true';
+		}
+		iframe[0].contentWindow.focus();
+	});
+});
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/kindeditor-min.js b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/kindeditor-min.js
new file mode 100644
index 0000000..c1d7290
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/kindeditor-min.js
@@ -0,0 +1,181 @@
+/* KindEditor 4.1.7 (2013-04-21), Copyright (C) kindsoft.net, Licence: http://www.kindsoft.net/license.php */(function(A,o){function Y(a){if(!a)return!1;return Object.prototype.toString.call(a)==="[object Array]"}function bb(a){if(!a)return!1;return Object.prototype.toString.call(a)==="[object Function]"}function N(a,b){for(var c=0,d=b.length;c<d;c++)if(a===b[c])return c;return-1}function m(a,b){if(Y(a))for(var c=0,d=a.length;c<d;c++){if(b.call(a[c],c,a[c])===!1)break}else for(c in a)if(a.hasOwnProperty(c)&&b.call(a[c],c,a[c])===!1)break}function B(a){return a.replace(/(?:^[ \t\n\r]+)|(?:[ \t\n\r]+$)/g,
+"")}function ua(a,b,c){c=c===o?",":c;return(c+b+c).indexOf(c+a+c)>=0}function s(a,b){b=b||"px";return a&&/^\d+$/.test(a)?a+b:a}function t(a){var b;return a&&(b=/(\d+)/.exec(a))?parseInt(b[1],10):0}function C(a){return a.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function fa(a){return a.replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&quot;/g,'"').replace(/&amp;/g,"&")}function ga(a){var b=a.split("-"),a="";m(b,function(b,d){a+=b>0?d.charAt(0).toUpperCase()+
+d.substr(1):d});return a}function va(a){function b(a){a=parseInt(a,10).toString(16).toUpperCase();return a.length>1?a:"0"+a}return a.replace(/rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/ig,function(a,d,e,g){return"#"+b(d)+b(e)+b(g)})}function u(a,b){var b=b===o?",":b,c={},d=Y(a)?a:a.split(b),e;m(d,function(a,b){if(e=/^(\d+)\.\.(\d+)$/.exec(b))for(var d=parseInt(e[1],10);d<=parseInt(e[2],10);d++)c[d.toString()]=!0;else c[b]=!0});return c}function Fa(a,b){return Array.prototype.slice.call(a,b||0)}
+function j(a,b){return a===o?b:a}function E(a,b,c){c||(c=b,b=null);var d;if(b){var e=function(){};e.prototype=b.prototype;d=new e;m(c,function(a,b){d[a]=b})}else d=c;d.constructor=a;a.prototype=d;a.parent=b?b.prototype:null}function cb(a){var b;if(b=/\{[\s\S]*\}|\[[\s\S]*\]/.exec(a))a=b[0];b=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;b.lastIndex=0;b.test(a)&&(a=a.replace(b,function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)}));
+if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return eval("("+a+")");throw"JSON parse error";}function Pb(a,b,c){a.addEventListener?a.addEventListener(b,c,db):a.attachEvent&&a.attachEvent("on"+b,c)}function wa(a,b,c){a.removeEventListener?a.removeEventListener(b,c,db):a.detachEvent&&a.detachEvent("on"+b,c)}function eb(a,b){this.init(a,b)}function fb(a){try{delete a[Z]}catch(b){a.removeAttribute&&
+a.removeAttribute(Z)}}function $(a,b,c){if(b.indexOf(",")>=0)m(b.split(","),function(){$(a,this,c)});else{var d=a[Z]||null;d||(a[Z]=++gb,d=gb);v[d]===o&&(v[d]={});var e=v[d][b];e&&e.length>0?wa(a,b,e[0]):(v[d][b]=[],v[d].el=a);e=v[d][b];e.length===0&&(e[0]=function(b){var c=b?new eb(a,b):o;m(e,function(b,d){b>0&&d&&d.call(a,c)})});N(c,e)<0&&e.push(c);Pb(a,b,e[0])}}function ha(a,b,c){if(b&&b.indexOf(",")>=0)m(b.split(","),function(){ha(a,this,c)});else{var d=a[Z]||null;if(d)if(b===o)d in v&&(m(v[d],
+function(b,c){b!="el"&&c.length>0&&wa(a,b,c[0])}),delete v[d],fb(a));else if(v[d]){var e=v[d][b];if(e&&e.length>0){c===o?(wa(a,b,e[0]),delete v[d][b]):(m(e,function(a,b){a>0&&b===c&&e.splice(a,1)}),e.length==1&&(wa(a,b,e[0]),delete v[d][b]));var g=0;m(v[d],function(){g++});g<2&&(delete v[d],fb(a))}}}}function hb(a,b){if(b.indexOf(",")>=0)m(b.split(","),function(){hb(a,this)});else{var c=a[Z]||null;if(c){var d=v[c][b];if(v[c]&&d&&d.length>0)d[0]()}}}function Ga(a,b,c){b=/^\d{2,}$/.test(b)?b:b.toUpperCase().charCodeAt(0);
+$(a,"keydown",function(d){d.ctrlKey&&d.which==b&&!d.shiftKey&&!d.altKey&&(c.call(a),d.stop())})}function aa(a){for(var b={},c=/\s*([\w\-]+)\s*:([^;]*)(;|$)/g,d;d=c.exec(a);){var e=B(d[1].toLowerCase());d=B(va(d[2]));b[e]=d}return b}function H(a){for(var b={},c=/\s+(?:([\w\-:]+)|(?:([\w\-:]+)=([^\s"'<>]+))|(?:([\w\-:"]+)="([^"]*)")|(?:([\w\-:"]+)='([^']*)'))(?=(?:\s|\/|>)+)/g,d;d=c.exec(a);){var e=(d[1]||d[2]||d[4]||d[6]).toLowerCase();b[e]=(d[2]?d[3]:d[4]?d[5]:d[7])||""}return b}function Qb(a,b){return a=
+/\s+class\s*=/.test(a)?a.replace(/(\s+class=["']?)([^"']*)(["']?[\s>])/,function(a,d,e,g){return(" "+e+" ").indexOf(" "+b+" ")<0?e===""?d+b+g:d+e+" "+b+g:a}):a.substr(0,a.length-1)+' class="'+b+'">'}function Rb(a){var b="";m(aa(a),function(a,d){b+=a+":"+d+";"});return b}function ia(a,b,c,d){function e(a){for(var a=a.split("/"),b=[],c=0,d=a.length;c<d;c++){var e=a[c];e==".."?b.length>0&&b.pop():e!==""&&e!="."&&b.push(e)}return"/"+b.join("/")}function g(b,c){if(a.substr(0,b.length)===b){for(var e=[],
+h=0;h<c;h++)e.push("..");h=".";e.length>0&&(h+="/"+e.join("/"));d=="/"&&(h+="/");return h+a.substr(b.length)}else if(f=/^(.*)\//.exec(b))return g(f[1],++c)}b=j(b,"").toLowerCase();a.substr(0,5)!="data:"&&(a=a.replace(/([^:])\/\//g,"$1/"));if(N(b,["absolute","relative","domain"])<0)return a;c=c||location.protocol+"//"+location.host;if(d===o)var h=location.pathname.match(/^(\/.*)\//),d=h?h[1]:"";var f;if(f=/^(\w+:\/\/[^\/]*)/.exec(a)){if(f[1]!==c)return a}else if(/^\w+:/.test(a))return a;/^\//.test(a)?
+a=c+e(a.substr(1)):/^\w+:\/\//.test(a)||(a=c+e(d+"/"+a));b==="relative"?a=g(c+d,0).substr(2):b==="absolute"&&a.substr(0,c.length)===c&&(a=a.substr(c.length));return a}function S(a,b,c,d,e){var c=c||"",d=j(d,!1),e=j(e,"\t"),g="xx-small,x-small,small,medium,large,x-large,xx-large".split(","),a=a.replace(/(<(?:pre|pre\s[^>]*)>)([\s\S]*?)(<\/pre>)/ig,function(a,b,c,d){return b+c.replace(/<(?:br|br\s[^>]*)>/ig,"\n")+d}),a=a.replace(/<(?:br|br\s[^>]*)\s*\/?>\s*<\/p>/ig,"</p>"),a=a.replace(/(<(?:p|p\s[^>]*)>)\s*(<\/p>)/ig,
+"$1<br />$2"),a=a.replace(/\u200B/g,""),a=a.replace(/\u00A9/g,"&copy;"),h={};b&&(m(b,function(a,b){for(var c=a.split(","),d=0,e=c.length;d<e;d++)h[c[d]]=u(b)}),h.script||(a=a.replace(/(<(?:script|script\s[^>]*)>)([\s\S]*?)(<\/script>)/ig,"")),h.style||(a=a.replace(/(<(?:style|style\s[^>]*)>)([\s\S]*?)(<\/style>)/ig,"")));var f=[],a=a.replace(/([ \t\n\r]*)<(\/)?([\w\-:]+)((?:\s+|(?:\s+[\w\-:]+)|(?:\s+[\w\-:]+=[^\s"'<>]+)|(?:\s+[\w\-:"]+="[^"]*")|(?:\s+[\w\-:"]+='[^']*'))*)(\/)?>([ \t\n\r]*)/g,function(a,
+n,r,p,I,o,j){var n=n||"",r=r||"",l=p.toLowerCase(),J=I||"",p=o?" "+o:"",j=j||"";if(b&&!h[l])return"";p===""&&ib[l]&&(p=" /");jb[l]&&(n&&(n=" "),j&&(j=" "));Ha[l]&&(r?j="\n":n="\n");d&&l=="br"&&(j="\n");if(kb[l]&&!Ha[l])if(d){r&&f.length>0&&f[f.length-1]===l?f.pop():f.push(l);j=n="\n";I=0;for(o=r?f.length:f.length-1;I<o;I++)n+=e,r||(j+=e);p?f.pop():r||(j+=e)}else n=j="";if(J!==""){var w=H(a);if(l==="font"){var K={},F="";m(w,function(a,b){if(a==="color")K.color=b,delete w[a];a==="size"&&(K["font-size"]=
+g[parseInt(b,10)-1]||"",delete w[a]);a==="face"&&(K["font-family"]=b,delete w[a]);a==="style"&&(F=b)});F&&!/;$/.test(F)&&(F+=";");m(K,function(a,b){b!==""&&(/\s/.test(b)&&(b="'"+b+"'"),F+=a+":"+b+";")});w.style=F}m(w,function(a,d){Sb[a]&&(w[a]=a);N(a,["src","href"])>=0&&(w[a]=ia(d,c));(b&&a!=="style"&&!h[l]["*"]&&!h[l][a]||l==="body"&&a==="contenteditable"||/^kindeditor_\d+$/.test(a))&&delete w[a];if(a==="style"&&d!==""){var e=aa(d);m(e,function(a){b&&!h[l].style&&!h[l]["."+a]&&delete e[a]});var g=
+"";m(e,function(a,b){g+=a+":"+b+";"});w.style=g}});J="";m(w,function(a,b){a==="style"&&b===""||(b=b.replace(/"/g,"&quot;"),J+=" "+a+'="'+b+'"')})}l==="font"&&(l="span");return n+"<"+r+l+J+p+">"+j}),a=a.replace(/(<(?:pre|pre\s[^>]*)>)([\s\S]*?)(<\/pre>)/ig,function(a,b,c,d){return b+c.replace(/\n/g,'<span id="__kindeditor_pre_newline__">\n')+d}),a=a.replace(/\n\s*\n/g,"\n"),a=a.replace(/<span id="__kindeditor_pre_newline__">\n/g,"\n");return B(a)}function lb(a,b){a=a.replace(/<meta[\s\S]*?>/ig,"").replace(/<![\s\S]*?>/ig,
+"").replace(/<style[^>]*>[\s\S]*?<\/style>/ig,"").replace(/<script[^>]*>[\s\S]*?<\/script>/ig,"").replace(/<w:[^>]+>[\s\S]*?<\/w:[^>]+>/ig,"").replace(/<o:[^>]+>[\s\S]*?<\/o:[^>]+>/ig,"").replace(/<xml>[\s\S]*?<\/xml>/ig,"").replace(/<(?:table|td)[^>]*>/ig,function(a){return a.replace(/border-bottom:([#\w\s]+)/ig,"border:$1")});return S(a,b)}function mb(a){if(/\.(rm|rmvb)(\?|$)/i.test(a))return"audio/x-pn-realaudio-plugin";if(/\.(swf|flv)(\?|$)/i.test(a))return"application/x-shockwave-flash";return"video/x-ms-asf-plugin"}
+function nb(a){return H(unescape(a))}function Ia(a){var b="<embed ";m(a,function(a,d){b+=a+'="'+d+'" '});b+="/>";return b}function ob(a,b){var c=b.width,d=b.height,e=b.type||mb(b.src),g=Ia(b),h="";c>0&&(h+="width:"+c+"px;");d>0&&(h+="height:"+d+"px;");c=/realaudio/i.test(e)?"ke-rm":/flash/i.test(e)?"ke-flash":"ke-media";c='<img class="'+c+'" src="'+a+'" ';h!==""&&(c+='style="'+h+'" ');c+='data-ke-tag="'+escape(g)+'" alt="" />';return c}function xa(a,b){if(a.nodeType==9&&b.nodeType!=9)return!0;for(;b=
+b.parentNode;)if(b==a)return!0;return!1}function ya(a,b){var b=b.toLowerCase(),c=null;if(!Tb&&a.nodeName.toLowerCase()!="script"){var d=a.ownerDocument.createElement("div");d.appendChild(a.cloneNode(!1));d=H(fa(d.innerHTML));b in d&&(c=d[b])}else try{c=a.getAttribute(b,2)}catch(e){c=a.getAttribute(b,1)}b==="style"&&c!==null&&(c=Rb(c));return c}function za(a,b){function c(a){if(typeof a!="string")return a;return a.replace(/([^\w\-])/g,"\\$1")}function d(a,b){return a==="*"||a.toLowerCase()===c(b.toLowerCase())}
+function e(a,b,c){var e=[];(a=(c.ownerDocument||c).getElementById(a.replace(/\\/g,"")))&&d(b,a.nodeName)&&xa(c,a)&&e.push(a);return e}function g(a,b,c){var e=c.ownerDocument||c,g=[],h,f,i;if(c.getElementsByClassName){e=c.getElementsByClassName(a.replace(/\\/g,""));h=0;for(f=e.length;h<f;h++)i=e[h],d(b,i.nodeName)&&g.push(i)}else if(e.querySelectorAll){e=e.querySelectorAll((c.nodeName!=="#document"?c.nodeName+" ":"")+b+"."+a);h=0;for(f=e.length;h<f;h++)i=e[h],xa(c,i)&&g.push(i)}else{e=c.getElementsByTagName(b);
+a=" "+a+" ";h=0;for(f=e.length;h<f;h++)if(i=e[h],i.nodeType==1)(b=i.className)&&(" "+b+" ").indexOf(a)>-1&&g.push(i)}return g}function h(a,b,d,e){for(var g=[],d=e.getElementsByTagName(d),h=0,f=d.length;h<f;h++)e=d[h],e.nodeType==1&&(b===null?ya(e,a)!==null&&g.push(e):b===c(ya(e,a))&&g.push(e));return g}function f(a,b){var c=[],i,k=(i=/^((?:\\.|[^.#\s\[<>])+)/.exec(a))?i[1]:"*";if(i=/#((?:[\w\-]|\\.)+)$/.exec(a))c=e(i[1],k,b);else if(i=/\.((?:[\w\-]|\\.)+)$/.exec(a))c=g(i[1],k,b);else if(i=/\[((?:[\w\-]|\\.)+)\]/.exec(a))c=
+h(i[1].toLowerCase(),null,k,b);else if(i=/\[((?:[\w\-]|\\.)+)\s*=\s*['"]?((?:\\.|[^'"]+)+)['"]?\]/.exec(a)){c=i[1].toLowerCase();i=i[2];if(c==="id")k=e(i,k,b);else if(c==="class")k=g(i,k,b);else if(c==="name"){c=[];i=(b.ownerDocument||b).getElementsByName(i.replace(/\\/g,""));for(var n,p=0,r=i.length;p<r;p++)n=i[p],d(k,n.nodeName)&&xa(b,n)&&n.getAttributeNode("name")&&c.push(n);k=c}else k=h(c,i,k,b);c=k}else{k=b.getElementsByTagName(k);n=0;for(p=k.length;n<p;n++)i=k[n],i.nodeType==1&&c.push(i)}return c}
+var k=a.split(",");if(k.length>1){var n=[];m(k,function(){m(za(this,b),function(){N(this,n)<0&&n.push(this)})});return n}for(var b=b||document,k=[],r,p=/((?:\\.|[^\s>])+|[\s>])/g;r=p.exec(a);)r[1]!==" "&&k.push(r[1]);r=[];if(k.length==1)return f(k[0],b);var p=!1,I,l,j,o,J,w,K,F,q,s;w=0;for(lenth=k.length;w<lenth;w++)if(I=k[w],I===">")p=!0;else{if(w>0){l=[];K=0;for(q=r.length;K<q;K++){o=r[K];j=f(I,o);F=0;for(s=j.length;F<s;F++)J=j[F],p?o===J.parentNode&&l.push(J):l.push(J)}r=l}else r=f(I,b);if(r.length===
+0)return[]}return r}function T(a){if(!a)return document;return a.ownerDocument||a.document||a}function U(a){if(!a)return A;a=T(a);return a.parentWindow||a.defaultView}function Ub(a,b){if(a.nodeType==1){var c=T(a);try{a.innerHTML='<img id="__kindeditor_temp_tag__" width="0" height="0" style="display:none;" />'+b;var d=c.getElementById("__kindeditor_temp_tag__");d.parentNode.removeChild(d)}catch(e){f(a).empty(),f("@"+b,c).each(function(){a.appendChild(this)})}}}function Ja(a,b,c){l&&z<8&&b.toLowerCase()==
+"class"&&(b="className");a.setAttribute(b,""+c)}function Ka(a){if(!a||!a.nodeName)return"";return a.nodeName.toLowerCase()}function Vb(a,b){var c=U(a),d=ga(b),e="";c.getComputedStyle?(c=c.getComputedStyle(a,null),e=c[d]||c.getPropertyValue(b)||a.style[d]):a.currentStyle&&(e=a.currentStyle[d]||a.style[d]);return e}function G(a){a=a||document;return O?a.body:a.documentElement}function ba(a){var a=a||document,b;l||La?(b=G(a).scrollLeft,a=G(a).scrollTop):(b=U(a).scrollX,a=U(a).scrollY);return{x:b,y:a}}
+function D(a){this.init(a)}function pb(a){a.collapsed=a.startContainer===a.endContainer&&a.startOffset===a.endOffset;return a}function Ma(a,b,c){function d(d,e,g){var h=d.nodeValue.length,k;b&&(k=d.cloneNode(!0),k=e>0?k.splitText(e):k,g<h&&k.splitText(g-e));if(c){var n=d;e>0&&(n=d.splitText(e),a.setStart(d,e));g<h&&(d=n.splitText(g-e),a.setEnd(d,0));f.push(n)}return k}function e(){c&&a.up().collapse(!0);for(var b=0,d=f.length;b<d;b++){var e=f[b];e.parentNode&&e.parentNode.removeChild(e)}}function g(e,
+l){for(var j=e.firstChild,o;j;){o=(new L(h)).selectNode(j);n=o.compareBoundaryPoints(ja,a);n>=0&&r<=0&&(r=o.compareBoundaryPoints(ka,a));r>=0&&p<=0&&(p=o.compareBoundaryPoints(ca,a));p>=0&&m<=0&&(m=o.compareBoundaryPoints(la,a));if(m>=0)return!1;o=j.nextSibling;if(n>0)if(j.nodeType==1)if(r>=0&&p<=0)b&&l.appendChild(j.cloneNode(!0)),c&&f.push(j);else{var q;b&&(q=j.cloneNode(!1),l.appendChild(q));if(g(j,q)===!1)return!1}else if(j.nodeType==3&&(j=j==k.startContainer?d(j,k.startOffset,j.nodeValue.length):
+j==k.endContainer?d(j,0,k.endOffset):d(j,0,j.nodeValue.length),b))try{l.appendChild(j)}catch(s){}j=o}}var h=a.doc,f=[],k=a.cloneRange().down(),n=-1,r=-1,p=-1,m=-1,l=a.commonAncestor(),j=h.createDocumentFragment();if(l.nodeType==3)return l=d(l,a.startOffset,a.endOffset),b&&j.appendChild(l),e(),b?j:a;g(l,j);c&&a.up().collapse(!0);for(var l=0,o=f.length;l<o;l++){var q=f[l];q.parentNode&&q.parentNode.removeChild(q)}return b?j:a}function ma(a,b){for(var c=b;c;){var d=f(c);if(d.name=="marquee"||d.name==
+"select")return;c=c.parentNode}try{a.moveToElementText(b)}catch(e){}}function qb(a,b){var c=a.parentElement().ownerDocument,d=a.duplicate();d.collapse(b);var e=d.parentElement(),g=e.childNodes;if(g.length===0)return{node:e.parentNode,offset:f(e).index()};var h=c,i=0,k=-1,n=a.duplicate();ma(n,e);for(var r=0,p=g.length;r<p;r++){var j=g[r],k=n.compareEndPoints("StartToStart",d);if(k===0)return{node:j.parentNode,offset:r};if(j.nodeType==1){var l=a.duplicate(),m,o=f(j),q=j;o.isControl()&&(m=c.createElement("span"),
+o.after(m),q=m,i+=o.text().replace(/\r\n|\n|\r/g,"").length);ma(l,q);n.setEndPoint("StartToEnd",l);k>0?i+=l.text.replace(/\r\n|\n|\r/g,"").length:i=0;m&&f(m).remove()}else j.nodeType==3&&(n.moveStart("character",j.nodeValue.length),i+=j.nodeValue.length);k<0&&(h=j)}if(k<0&&h.nodeType==1)return{node:e,offset:f(e.lastChild).index()+1};if(k>0)for(;h.nextSibling&&h.nodeType==1;)h=h.nextSibling;n=a.duplicate();ma(n,e);n.setEndPoint("StartToEnd",d);i-=n.text.replace(/\r\n|\n|\r/g,"").length;if(k>0&&h.nodeType==
+3)for(c=h.previousSibling;c&&c.nodeType==3;)i-=c.nodeValue.length,c=c.previousSibling;return{node:h,offset:i}}function rb(a,b){var c=a.ownerDocument||a,d=c.body.createTextRange();if(c==a)return d.collapse(!0),d;if(a.nodeType==1&&a.childNodes.length>0){var e=a.childNodes,g;b===0?(g=e[0],e=!0):(g=e[b-1],e=!1);if(!g)return d;if(f(g).name==="head")return b===1&&(e=!0),b===2&&(e=!1),d.collapse(e),d;if(g.nodeType==1){var h=f(g),i;h.isControl()&&(i=c.createElement("span"),e?h.before(i):h.after(i),g=i);ma(d,
+g);d.collapse(e);i&&f(i).remove();return d}a=g;b=e?0:g.nodeValue.length}c=c.createElement("span");f(a).before(c);ma(d,c);d.moveStart("character",b);f(c).remove();return d}function sb(a){function b(a){if(f(a.node).name=="tr")a.node=a.node.cells[a.offset],a.offset=0}var c;if(l){if(a.item)return c=T(a.item(0)),c=new L(c),c.selectNode(a.item(0)),c;c=a.parentElement().ownerDocument;var d=qb(a,!0),a=qb(a,!1);b(d);b(a);c=new L(c);c.setStart(d.node,d.offset);c.setEnd(a.node,a.offset);return c}d=a.startContainer;
+c=d.ownerDocument||d;c=new L(c);c.setStart(d,a.startOffset);c.setEnd(a.endContainer,a.endOffset);return c}function L(a){this.init(a)}function Na(a){if(!a.nodeName)return a.constructor===L?a:sb(a);return new L(a)}function P(a,b,c){try{a.execCommand(b,!1,c)}catch(d){}}function tb(a,b){var c="";try{c=a.queryCommandValue(b)}catch(d){}typeof c!=="string"&&(c="");return c}function Oa(a){var b=U(a);return a.selection||b.getSelection()}function ub(a){var b={},c,d;m(a,function(a,g){c=a.split(",");for(var h=
+0,f=c.length;h<f;h++)d=c[h],b[d]=g});return b}function Pa(a,b){return vb(a,b,"*")||vb(a,b)}function vb(a,b,c){c=c||a.name;if(a.type!==1)return!1;b=ub(b);if(!b[c])return!1;for(var c=b[c].split(","),b=0,d=c.length;b<d;b++){var e=c[b];if(e==="*")return!0;var g=/^(\.?)([^=]+)(?:=([^=]*))?$/.exec(e),h=g[1]?"css":"attr",e=g[2],g=g[3]||"";if(g===""&&a[h](e)!=="")return!0;if(g!==""&&a[h](e)===g)return!0}return!1}function Qa(a,b){a.type==1&&(wb(a,b,"*"),wb(a,b))}function wb(a,b,c){c=c||a.name;if(a.type===
+1&&(b=ub(b),b[c])){for(var c=b[c].split(","),b=!1,d=0,e=c.length;d<e;d++){var g=c[d];if(g==="*"){b=!0;break}var h=/^(\.?)([^=]+)(?:=([^=]*))?$/.exec(g),g=h[2];h[1]?(g=ga(g),a[0].style[g]&&(a[0].style[g]="")):a.removeAttr(g)}b&&a.remove(!0)}}function Ra(a){for(;a.first();)a=a.first();return a}function da(a){if(a.type!=1||a.isSingle())return!1;return a.html().replace(/<[^>]+>/g,"")===""}function Wb(a,b,c){m(b,function(b,c){b!=="style"&&a.attr(b,c)});m(c,function(b,c){a.css(b,c)})}function na(a){this.init(a)}
+function xb(a){a.nodeName&&(a=T(a),a=Na(a).selectNodeContents(a.body).collapse(!1));return new na(a)}function Sa(a){var b=a.moveEl,c=a.moveFn,d=a.clickEl||b,e=a.beforeDrag,g=[document];(a.iframeFix===o||a.iframeFix)&&f("iframe").each(function(){if(!/^https?:\/\//.test(ia(this.src||"","absolute"))){var a;try{a=Ta(this)}catch(b){}if(a){var c=f(this).pos();f(a).data("pos-x",c.x);f(a).data("pos-y",c.y);g.push(a)}}});d.mousedown(function(a){function i(a){a.preventDefault();var b=f(T(a.target)),e=Q((b.data("pos-x")||
+0)+a.pageX-q),a=Q((b.data("pos-y")||0)+a.pageY-s);c.call(d,p,l,m,o,e,a)}function k(a){a.preventDefault()}function n(a){a.preventDefault();f(g).unbind("mousemove",i).unbind("mouseup",n).unbind("selectstart",k);j.releaseCapture&&j.releaseCapture()}a.stopPropagation();var j=d.get(),p=t(b.css("left")),l=t(b.css("top")),m=b.width(),o=b.height(),q=a.pageX,s=a.pageY;e&&e();f(g).mousemove(i).mouseup(n).bind("selectstart",k);j.setCapture&&j.setCapture()})}function R(a){this.init(a)}function Ua(a){return new R(a)}
+function Ta(a){a=f(a)[0];return a.contentDocument||a.contentWindow.document}function Xb(a,b,c,d){var e=[Va===""?"<html>":'<html dir="'+Va+'">','<head><meta charset="utf-8" /><title></title>',"<style>","html {margin:0;padding:0;}","body {margin:0;padding:5px;}",'body, td {font:12px/1.5 "sans serif",tahoma,verdana,helvetica;}',"body, p, div {word-wrap: break-word;}","p {margin:5px 0;}","table {border-collapse:collapse;}","img {border:0;}","noscript {display:none;}","table.ke-zeroborder td {border:1px dotted #AAA;}",
+"img.ke-flash {","\tborder:1px solid #AAA;","\tbackground-image:url("+a+"common/flash.gif);","\tbackground-position:center center;","\tbackground-repeat:no-repeat;","\twidth:100px;","\theight:100px;","}","img.ke-rm {","\tborder:1px solid #AAA;","\tbackground-image:url("+a+"common/rm.gif);","\tbackground-position:center center;","\tbackground-repeat:no-repeat;","\twidth:100px;","\theight:100px;","}","img.ke-media {","\tborder:1px solid #AAA;","\tbackground-image:url("+a+"common/media.gif);","\tbackground-position:center center;",
+"\tbackground-repeat:no-repeat;","\twidth:100px;","\theight:100px;","}","img.ke-anchor {","\tborder:1px dashed #666;","\twidth:16px;","\theight:16px;","}",".ke-script, .ke-noscript, .ke-display-none {","\tdisplay:none;","\tfont-size:0;","\twidth:0;","\theight:0;","}",".ke-pagebreak {","\tborder:1px dotted #AAA;","\tfont-size:0;","\theight:2px;","}","</style>"];Y(c)||(c=[c]);m(c,function(a,b){b&&e.push('<link href="'+b+'" rel="stylesheet" />')});d&&e.push("<style>"+d+"</style>");e.push("</head><body "+
+(b?'class="'+b+'"':"")+"></body></html>");return e.join("\n")}function oa(a,b){if(a.hasVal()){if(b===o){var c=a.val();return c=c.replace(/(<(?:p|p\s[^>]*)>) *(<\/p>)/ig,"")}return a.val(b)}return a.html(b)}function pa(a){this.init(a)}function yb(a){return new pa(a)}function zb(a,b){var c=this.get(a);c&&!c.hasClass("ke-disabled")&&b(c)}function Aa(a){this.init(a)}function Ab(a){return new Aa(a)}function qa(a){this.init(a)}function Wa(a){return new qa(a)}function ra(a){this.init(a)}function Bb(a){return new ra(a)}
+function Xa(a){this.init(a)}function sa(a){this.init(a)}function Cb(a){return new sa(a)}function Ya(a,b){var c=document.getElementsByTagName("head")[0]||(O?document.body:document.documentElement),d=document.createElement("script");c.appendChild(d);d.src=a;d.charset="utf-8";d.onload=d.onreadystatechange=function(){if(!this.readyState||this.readyState==="loaded")b&&b(),d.onload=d.onreadystatechange=null,c.removeChild(d)}}function Db(a){var b=a.indexOf("?");return b>0?a.substr(0,b):a}function Za(a){for(var b=
+document.getElementsByTagName("head")[0]||(O?document.body:document.documentElement),c=document.createElement("link"),d=Db(ia(a,"absolute")),e=f('link[rel="stylesheet"]',b),g=0,h=e.length;g<h;g++)if(Db(ia(e[g].href,"absolute"))===d)return;b.appendChild(c);c.href=a;c.rel="stylesheet"}function Eb(a,b){if(a===o)return V;if(!b)return V[a];V[a]=b}function Fb(a){var b,c="core";if(b=/^(\w+)\.(\w+)$/.exec(a))c=b[1],a=b[2];return{ns:c,key:a}}function Gb(a,b){b=b===o?f.options.langType:b;if(typeof a==="string"){if(!M[b])return"no language";
+var c=a.length-1;if(a.substr(c)===".")return M[b][a.substr(0,c)];c=Fb(a);return M[b][c.ns][c.key]}m(a,function(a,c){var g=Fb(a);M[b]||(M[b]={});M[b][g.ns]||(M[b][g.ns]={});M[b][g.ns][g.key]=c})}function Ba(a,b){if(!a.collapsed){var a=a.cloneRange().up(),c=a.startContainer,d=a.startOffset;if(W||a.isControl())if((c=f(c.childNodes[d]))&&c.name=="img"&&b(c))return c}}function Yb(){var a=this;f(a.edit.doc).contextmenu(function(b){a.menu&&a.hideMenu();if(a.useContextmenu){if(a._contextmenus.length!==0){var c=
+0,d=[];for(m(a._contextmenus,function(){if(this.title=="-")d.push(this);else if(this.cond&&this.cond()&&(d.push(this),this.width&&this.width>c))c=this.width});d.length>0&&d[0].title=="-";)d.shift();for(;d.length>0&&d[d.length-1].title=="-";)d.pop();var e=null;m(d,function(a){this.title=="-"&&e.title=="-"&&delete d[a];e=this});if(d.length>0){b.preventDefault();var g=f(a.edit.iframe).pos(),h=Wa({x:g.x+b.clientX,y:g.y+b.clientY,width:c,css:{visibility:"hidden"},shadowMode:a.shadowMode});m(d,function(){this.title&&
+h.addItem(this)});var g=G(h.doc),i=h.div.height();b.clientY+i>=g.clientHeight-100&&h.pos(h.x,t(h.y)-i);h.div.css("visibility","visible");a.menu=h}}}else b.preventDefault()})}function Zb(){function a(a){for(a=f(a.commonAncestor());a;){if(a.type==1&&!a.isStyle())break;a=a.parent()}return a.name}var b=this,c=b.edit.doc,d=b.newlineTag;if(!(l&&d!=="br")&&(!ea||!(z<3&&d!=="p"))&&!(La&&z<9)){var e=u("h1,h2,h3,h4,h5,h6,pre,li"),g=u("p,h1,h2,h3,h4,h5,h6,pre,li,blockquote");f(c).keydown(function(f){if(!(f.which!=
+13||f.shiftKey||f.ctrlKey||f.altKey)){b.cmd.selection();var i=a(b.cmd.range);i=="marquee"||i=="select"||(d==="br"&&!e[i]?(f.preventDefault(),b.insertHtml("<br />"+(l&&z<9?"":"\u200b"))):g[i]||P(c,"formatblock","<p>"))}});f(c).keyup(function(e){if(!(e.which!=13||e.shiftKey||e.ctrlKey||e.altKey)&&d!="br")if(ea){var e=b.cmd.commonAncestor("p"),i=b.cmd.commonAncestor("a");i&&i.text()==""&&(i.remove(!0),b.cmd.range.selectNodeContents(e[0]).collapse(!0),b.cmd.select())}else if(b.cmd.selection(),e=a(b.cmd.range),
+!(e=="marquee"||e=="select"))if(g[e]||P(c,"formatblock","<p>"),e=b.cmd.commonAncestor("div")){for(var i=f("<p></p>"),k=e[0].firstChild;k;){var n=k.nextSibling;i.append(k);k=n}e.before(i);e.remove();b.cmd.range.selectNodeContents(i[0]);b.cmd.select()}})}}function $b(){var a=this,b=a.edit.doc;f(b).keydown(function(c){if(c.which==9)if(c.preventDefault(),a.afterTab)a.afterTab.call(a,c);else{var c=a.cmd,d=c.range;d.shrink();d.collapsed&&d.startContainer.nodeType==1&&(d.insertNode(f("@&nbsp;",b)[0]),c.select());
+a.insertHtml("&nbsp;&nbsp;&nbsp;&nbsp;")}})}function ac(){var a=this;f(a.edit.textarea[0],a.edit.win).focus(function(b){a.afterFocus&&a.afterFocus.call(a,b)}).blur(function(b){a.afterBlur&&a.afterBlur.call(a,b)})}function X(a){return B(a.replace(/<span [^>]*id="?__kindeditor_bookmark_\w+_\d+__"?[^>]*><\/span>/ig,""))}function $a(a){return a.replace(/<div[^>]+class="?__kindeditor_paste__"?[^>]*>[\s\S]*?<\/div>/ig,"")}function Hb(a,b){if(a.length===0)a.push(b);else{var c=a[a.length-1];X(b.html)!==X(c.html)&&
+a.push(b)}}function Ib(a,b){var c=this.edit,d=c.doc.body,e,g;if(a.length===0)return this;c.designMode?(e=this.cmd.range,g=e.createBookmark(!0),g.html=d.innerHTML):g={html:d.innerHTML};Hb(b,g);var h=a.pop();X(g.html)===X(h.html)&&a.length>0&&(h=a.pop());c.designMode?(c.html(h.html),h.start&&(e.moveToBookmark(h),this.select())):f(d).html(X(h.html));return this}function ta(a){function b(a,b){ta.prototype[a]===o&&(c[a]=b);c.options[a]=b}var c=this;c.options={};m(a,function(c){b(c,a[c])});m(f.options,
+function(a,d){c[a]===o&&b(a,d)});var d=f(c.srcElement||"<textarea/>");if(!c.width)c.width=d[0].style.width||d.width();if(!c.height)c.height=d[0].style.height||d.height();b("width",j(c.width,c.minWidth));b("height",j(c.height,c.minHeight));b("width",s(c.width));b("height",s(c.height));if(bc&&(!cc||z<534))c.designMode=!1;c.srcElement=d;c.initContent="";c.plugin={};c.isCreated=!1;c.isLoading=!1;c._handlers={};c._contextmenus=[];c._undoStack=[];c._redoStack=[];c._calledPlugins={};c._firstAddBookmark=
+!0;c.menu=c.contextmenu=null;c.dialogs=[]}function Jb(a,b){function c(a){m(V,function(b,c){c.call(a,KindEditor)});return a.create()}b=b||{};b.basePath=j(b.basePath,f.basePath);b.themesPath=j(b.themesPath,b.basePath+"themes/");b.langPath=j(b.langPath,b.basePath+"lang/");b.pluginsPath=j(b.pluginsPath,b.basePath+"plugins/");if(j(b.loadStyleMode,f.options.loadStyleMode)){var d=j(b.themeType,f.options.themeType);Za(b.themesPath+"default/default.css");Za(b.themesPath+d+"/"+d+".css")}if((d=f(a))&&d.length!==
+0){if(d.length>1)return d.each(function(){Jb(this,b)}),_instances[0];b.srcElement=d[0];var e=new ta(b);_instances.push(e);if(M[e.langType])return c(e);Ya(e.langPath+e.langType+".js?ver="+encodeURIComponent(f.DEBUG?Ca:Da),function(){c(e)});return e}}function Kb(a,b){f(a).each(function(a,d){f.each(_instances,function(a,c){if(c&&c.srcElement[0]==d)return b.call(c,a,c),!1})})}if(!A.KindEditor){if(!A.console)A.console={};if(!console.log)console.log=function(){};var Da="4.1.7 (2013-04-21)",q=navigator.userAgent.toLowerCase(),
+l=q.indexOf("msie")>-1&&q.indexOf("opera")==-1,ea=q.indexOf("gecko")>-1&&q.indexOf("khtml")==-1,W=q.indexOf("applewebkit")>-1,La=q.indexOf("opera")>-1,bc=q.indexOf("mobile")>-1,cc=/ipad|iphone|ipod/.test(q),O=document.compatMode!="CSS1Compat",z=(q=/(?:msie|firefox|webkit|opera)[\/:\s](\d+)/.exec(q))?q[1]:"0",Ca=(new Date).getTime(),Q=Math.round,f={DEBUG:!1,VERSION:Da,IE:l,GECKO:ea,WEBKIT:W,OPERA:La,V:z,TIME:Ca,each:m,isArray:Y,isFunction:bb,inArray:N,inString:ua,trim:B,addUnit:s,removeUnit:t,escape:C,
+unescape:fa,toCamel:ga,toHex:va,toMap:u,toArray:Fa,undef:j,invalidUrl:function(a){return!a||/[<>"]/.test(a)},addParam:function(a,b){return a.indexOf("?")>=0?a+"&"+b:a+"?"+b},extend:E,json:cb},jb=u("a,abbr,acronym,b,basefont,bdo,big,br,button,cite,code,del,dfn,em,font,i,img,input,ins,kbd,label,map,q,s,samp,select,small,span,strike,strong,sub,sup,textarea,tt,u,var"),kb=u("address,applet,blockquote,body,center,dd,dir,div,dl,dt,fieldset,form,frameset,h1,h2,h3,h4,h5,h6,head,hr,html,iframe,ins,isindex,li,map,menu,meta,noframes,noscript,object,ol,p,pre,script,style,table,tbody,td,tfoot,th,thead,title,tr,ul"),
+ib=u("area,index,basefont,br,col,frame,hr,img,input,isindex,link,meta,param,embed"),Lb=u("b,basefont,big,del,em,font,i,s,small,span,strike,strong,sub,sup,u"),dc=u("img,table,input,textarea,button"),Ha=u("pre,style,script"),Ea=u("html,head,body,td,tr,table,ol,ul,li");u("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr");var Sb=u("checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected"),Mb=u("input,button,textarea,select");f.basePath=function(){for(var a=
+document.getElementsByTagName("script"),b,c=0,d=a.length;c<d;c++)if(b=a[c].src||"",/kindeditor[\w\-\.]*\.js/.test(b))return b.substring(0,b.lastIndexOf("/")+1);return""}();f.options={designMode:!0,fullscreenMode:!1,filterMode:!0,wellFormatMode:!0,shadowMode:!0,loadStyleMode:!0,basePath:f.basePath,themesPath:f.basePath+"themes/",langPath:f.basePath+"lang/",pluginsPath:f.basePath+"plugins/",themeType:"default",langType:"zh_CN",urlType:"",newlineTag:"p",resizeType:2,syncType:"form",pasteType:2,dialogAlignType:"page",
+useContextmenu:!0,fullscreenShortcut:!1,bodyClass:"ke-content",indentChar:"\t",cssPath:"",cssData:"",minWidth:650,minHeight:100,minChangeSize:50,zIndex:811213,items:["source","|","undo","redo","|","preview","print","template","code","cut","copy","paste","plainpaste","wordpaste","|","justifyleft","justifycenter","justifyright","justifyfull","insertorderedlist","insertunorderedlist","indent","outdent","subscript","superscript","clearhtml","quickformat","selectall","|","fullscreen","/","formatblock",
+"fontname","fontsize","|","forecolor","hilitecolor","bold","italic","underline","strikethrough","lineheight","removeformat","|","image","multiimage","flash","media","insertfile","table","hr","emoticons","baidumap","pagebreak","anchor","link","unlink","|","about"],noDisableItems:["source","fullscreen"],colorTable:[["#E53333","#E56600","#FF9900","#64451D","#DFC5A4","#FFE500"],["#009900","#006600","#99BB00","#B8D100","#60D978","#00D5FF"],["#337FE5","#003399","#4C33E5","#9933E5","#CC33E5","#EE33EE"],
+["#FFFFFF","#CCCCCC","#999999","#666666","#333333","#000000"]],fontSizeTable:["9px","10px","12px","14px","16px","18px","24px","32px"],htmlTags:{font:["id","class","color","size","face",".background-color"],span:["id","class",".color",".background-color",".font-size",".font-family",".background",".font-weight",".font-style",".text-decoration",".vertical-align",".line-height"],div:["id","class","align",".border",".margin",".padding",".text-align",".color",".background-color",".font-size",".font-family",
+".font-weight",".background",".font-style",".text-decoration",".vertical-align",".margin-left"],table:["id","class","border","cellspacing","cellpadding","width","height","align","bordercolor",".padding",".margin",".border","bgcolor",".text-align",".color",".background-color",".font-size",".font-family",".font-weight",".font-style",".text-decoration",".background",".width",".height",".border-collapse"],"td,th":["id","class","align","valign","width","height","colspan","rowspan","bgcolor",".text-align",
+".color",".background-color",".font-size",".font-family",".font-weight",".font-style",".text-decoration",".vertical-align",".background",".border"],a:["id","class","href","target","name"],embed:["id","class","src","width","height","type","loop","autostart","quality",".width",".height","align","allowscriptaccess"],img:["id","class","src","width","height","border","alt","title","align",".width",".height",".border"],"p,ol,ul,li,blockquote,h1,h2,h3,h4,h5,h6":["id","class","align",".text-align",".color",
+".background-color",".font-size",".font-family",".background",".font-weight",".font-style",".text-decoration",".vertical-align",".text-indent",".margin-left"],pre:["id","class"],hr:["id","class",".page-break-after"],"br,tbody,tr,strong,b,sub,sup,em,i,u,strike,s,del":["id","class"],iframe:["id","class","src","frameborder","width","height",".width",".height"]},layout:'<div class="container"><div class="toolbar"></div><div class="edit"></div><div class="statusbar"></div></div>'};var db=!1,Nb=u("8,9,13,32,46,48..57,59,61,65..90,106,109..111,188,190..192,219..222"),
+q=u("33..40"),ab={};m(Nb,function(a,b){ab[a]=b});m(q,function(a,b){ab[a]=b});var ec="altKey,attrChange,attrName,bubbles,button,cancelable,charCode,clientX,clientY,ctrlKey,currentTarget,data,detail,eventPhase,fromElement,handler,keyCode,metaKey,newValue,offsetX,offsetY,originalTarget,pageX,pageY,prevValue,relatedNode,relatedTarget,screenX,screenY,shiftKey,srcElement,target,toElement,view,wheelDelta,which".split(",");E(eb,{init:function(a,b){var c=this,d=a.ownerDocument||a.document||a;c.event=b;m(ec,
+function(a,d){c[d]=b[d]});if(!c.target)c.target=c.srcElement||d;if(c.target.nodeType===3)c.target=c.target.parentNode;if(!c.relatedTarget&&c.fromElement)c.relatedTarget=c.fromElement===c.target?c.toElement:c.fromElement;if(c.pageX==null&&c.clientX!=null){var e=d.documentElement,d=d.body;c.pageX=c.clientX+(e&&e.scrollLeft||d&&d.scrollLeft||0)-(e&&e.clientLeft||d&&d.clientLeft||0);c.pageY=c.clientY+(e&&e.scrollTop||d&&d.scrollTop||0)-(e&&e.clientTop||d&&d.clientTop||0)}if(!c.which&&(c.charCode||c.charCode===
+0?c.charCode:c.keyCode))c.which=c.charCode||c.keyCode;if(!c.metaKey&&c.ctrlKey)c.metaKey=c.ctrlKey;if(!c.which&&c.button!==o)c.which=c.button&1?1:c.button&2?3:c.button&4?2:0;switch(c.which){case 186:c.which=59;break;case 187:case 107:case 43:c.which=61;break;case 189:case 45:c.which=109;break;case 42:c.which=106;break;case 47:c.which=111;break;case 78:c.which=110}c.which>=96&&c.which<=105&&(c.which-=48)},preventDefault:function(){var a=this.event;a.preventDefault&&a.preventDefault();a.returnValue=
+!1},stopPropagation:function(){var a=this.event;a.stopPropagation&&a.stopPropagation();a.cancelBubble=!0},stop:function(){this.preventDefault();this.stopPropagation()}});var Z="kindeditor_"+Ca,gb=0,v={};l&&A.attachEvent("onunload",function(){m(v,function(a,b){b.el&&ha(b.el)})});f.ctrl=Ga;f.ready=function(a){function b(){e||(e=!0,a(KindEditor))}function c(){if(!e){try{document.documentElement.doScroll("left")}catch(a){setTimeout(c,100);return}b()}}function d(){document.readyState==="complete"&&b()}
+var e=!1;if(document.addEventListener)$(document,"DOMContentLoaded",b);else if(document.attachEvent){$(document,"readystatechange",d);var g=!1;try{g=A.frameElement==null}catch(f){}document.documentElement.doScroll&&g&&c()}$(A,"load",b)};f.formatUrl=ia;f.formatHtml=S;f.getCssList=aa;f.getAttrList=H;f.mediaType=mb;f.mediaAttrs=nb;f.mediaEmbed=Ia;f.mediaImg=ob;f.clearMsWord=lb;f.tmpl=function(a,b){var c=new Function("obj","var p=[],print=function(){p.push.apply(p,arguments);};with(obj){p.push('"+a.replace(/[\r\t\n]/g,
+" ").split("<%").join("\t").replace(/((^|%>)[^\t]*)'/g,"$1\r").replace(/\t=(.*?)%>/g,"',$1,'").split("\t").join("');").split("%>").join("p.push('").split("\r").join("\\'")+"');}return p.join('');");return b?c(b):c};q=document.createElement("div");q.setAttribute("className","t");var Tb=q.className!=="t";f.query=function(a,b){var c=za(a,b);return c.length>0?c[0]:null};f.queryAll=za;E(D,{init:function(a){for(var a=Y(a)?a:[a],b=0,c=0,d=a.length;c<d;c++)a[c]&&(this[c]=a[c].constructor===D?a[c][0]:a[c],
+b++);this.length=b;this.doc=T(this[0]);this.name=Ka(this[0]);this.type=this.length>0?this[0].nodeType:null;this.win=U(this[0])},each:function(a){for(var b=0;b<this.length;b++)if(a.call(this[b],b,this[b])===!1)break;return this},bind:function(a,b){this.each(function(){$(this,a,b)});return this},unbind:function(a,b){this.each(function(){ha(this,a,b)});return this},fire:function(a){if(this.length<1)return this;hb(this[0],a);return this},hasAttr:function(a){if(this.length<1)return!1;return!!ya(this[0],
+a)},attr:function(a,b){var c=this;if(a===o)return H(c.outer());if(typeof a==="object")return m(a,function(a,b){c.attr(a,b)}),c;if(b===o)return b=c.length<1?null:ya(c[0],a),b===null?"":b;c.each(function(){Ja(this,a,b)});return c},removeAttr:function(a){this.each(function(){var b=a;l&&z<8&&b.toLowerCase()=="class"&&(b="className");Ja(this,b,"");this.removeAttribute(b)});return this},get:function(a){if(this.length<1)return null;return this[a||0]},eq:function(a){if(this.length<1)return null;return this[a]?
+new D(this[a]):null},hasClass:function(a){if(this.length<1)return!1;return ua(a,this[0].className," ")},addClass:function(a){this.each(function(){if(!ua(a,this.className," "))this.className=B(this.className+" "+a)});return this},removeClass:function(a){this.each(function(){if(ua(a,this.className," "))this.className=B(this.className.replace(RegExp("(^|\\s)"+a+"(\\s|$)")," "))});return this},html:function(a){if(a===o){if(this.length<1||this.type!=1)return"";return S(this[0].innerHTML)}this.each(function(){Ub(this,
+a)});return this},text:function(){if(this.length<1)return"";return l?this[0].innerText:this[0].textContent},hasVal:function(){if(this.length<1)return!1;return!!Mb[Ka(this[0])]},val:function(a){if(a===o){if(this.length<1)return"";return this.hasVal()?this[0].value:this.attr("value")}else return this.each(function(){Mb[Ka(this)]?this.value=a:Ja(this,"value",a)}),this},css:function(a,b){var c=this;if(a===o)return aa(c.attr("style"));if(typeof a==="object")return m(a,function(a,b){c.css(a,b)}),c;if(b===
+o){if(c.length<1)return"";return c[0].style[ga(a)]||Vb(c[0],a)||""}c.each(function(){this.style[ga(a)]=b});return c},width:function(a){if(a===o){if(this.length<1)return 0;return this[0].offsetWidth}return this.css("width",s(a))},height:function(a){if(a===o){if(this.length<1)return 0;return this[0].offsetHeight}return this.css("height",s(a))},opacity:function(a){this.each(function(){this.style.opacity===o?this.style.filter=a==1?"":"alpha(opacity="+a*100+")":this.style.opacity=a==1?"":a});return this},
+data:function(a,b){a="kindeditor_data_"+a;if(b===o){if(this.length<1)return null;return this[0][a]}this.each(function(){this[a]=b});return this},pos:function(){var a=this[0],b=0,c=0;if(a)if(a.getBoundingClientRect)a=a.getBoundingClientRect(),c=ba(this.doc),b=a.left+c.x,c=a.top+c.y;else for(;a;)b+=a.offsetLeft,c+=a.offsetTop,a=a.offsetParent;return{x:Q(b),y:Q(c)}},clone:function(a){if(this.length<1)return new D([]);return new D(this[0].cloneNode(a))},append:function(a){this.each(function(){this.appendChild&&
+this.appendChild(f(a)[0])});return this},appendTo:function(a){this.each(function(){f(a)[0].appendChild(this)});return this},before:function(a){this.each(function(){this.parentNode.insertBefore(f(a)[0],this)});return this},after:function(a){this.each(function(){this.nextSibling?this.parentNode.insertBefore(f(a)[0],this.nextSibling):this.parentNode.appendChild(f(a)[0])});return this},replaceWith:function(a){var b=[];this.each(function(c,d){ha(d);var e=f(a)[0];d.parentNode.replaceChild(e,d);b.push(e)});
+return f(b)},empty:function(){this.each(function(a,b){for(var c=b.firstChild;c;){if(!b.parentNode)break;var d=c.nextSibling;c.parentNode.removeChild(c);c=d}});return this},remove:function(a){var b=this;b.each(function(c,d){if(d.parentNode){ha(d);if(a)for(var e=d.firstChild;e;){var g=e.nextSibling;d.parentNode.insertBefore(e,d);e=g}d.parentNode.removeChild(d);delete b[c]}});b.length=0;return b},show:function(a){a===o&&(a=this._originDisplay||"");if(this.css("display")!="none")return this;return this.css("display",
+a)},hide:function(){if(this.length<1)return this;this._originDisplay=this[0].style.display;return this.css("display","none")},outer:function(){if(this.length<1)return"";var a=this.doc.createElement("div");a.appendChild(this[0].cloneNode(!0));return S(a.innerHTML)},isSingle:function(){return!!ib[this.name]},isInline:function(){return!!jb[this.name]},isBlock:function(){return!!kb[this.name]},isStyle:function(){return!!Lb[this.name]},isControl:function(){return!!dc[this.name]},contains:function(a){if(this.length<
+1)return!1;return xa(this[0],f(a)[0])},parent:function(){if(this.length<1)return null;var a=this[0].parentNode;return a?new D(a):null},children:function(){if(this.length<1)return new D([]);for(var a=[],b=this[0].firstChild;b;)(b.nodeType!=3||B(b.nodeValue)!=="")&&a.push(b),b=b.nextSibling;return new D(a)},first:function(){var a=this.children();return a.length>0?a.eq(0):null},last:function(){var a=this.children();return a.length>0?a.eq(a.length-1):null},index:function(){if(this.length<1)return-1;for(var a=
+-1,b=this[0];b;)a++,b=b.previousSibling;return a},prev:function(){if(this.length<1)return null;var a=this[0].previousSibling;return a?new D(a):null},next:function(){if(this.length<1)return null;var a=this[0].nextSibling;return a?new D(a):null},scan:function(a,b){function c(d){for(d=b?d.firstChild:d.lastChild;d;){var e=b?d.nextSibling:d.previousSibling;if(a(d)===!1)return!1;if(c(d)===!1)return!1;d=e}}if(!(this.length<1))return b=b===o?!0:b,c(this[0]),this}});m("blur,focus,focusin,focusout,load,resize,scroll,unload,click,dblclick,mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave,change,select,submit,keydown,keypress,keyup,error,contextmenu".split(","),
+function(a,b){D.prototype[b]=function(a){return a?this.bind(b,a):this.fire(b)}});q=f;f=function(a,b){function c(a){a[0]||(a=[]);return new D(a)}if(!(a===o||a===null)){if(typeof a==="string"){b&&(b=f(b)[0]);var d=a.length;a.charAt(0)==="@"&&(a=a.substr(1));if(a.length!==d||/<.+>/.test(a)){var d=(b?b.ownerDocument||b:document).createElement("div"),e=[];d.innerHTML='<img id="__kindeditor_temp_tag__" width="0" height="0" style="display:none;" />'+a;for(var g=0,h=d.childNodes.length;g<h;g++){var i=d.childNodes[g];
+i.id!="__kindeditor_temp_tag__"&&e.push(i)}return c(e)}return c(za(a,b))}if(a&&a.constructor===D)return a;a.toArray&&(a=a.toArray());if(Y(a))return c(a);return c(Fa(arguments))}};m(q,function(a,b){f[a]=b});f.NodeClass=D;A.KindEditor=f;var ka=0,ja=1,ca=2,la=3,Ob=0;E(L,{init:function(a){this.startContainer=a;this.startOffset=0;this.endContainer=a;this.endOffset=0;this.collapsed=!0;this.doc=a},commonAncestor:function(){function a(a){for(var b=[];a;)b.push(a),a=a.parentNode;return b}for(var b=a(this.startContainer),
+c=a(this.endContainer),d=0,e=b.length,g=c.length,f,i;++d;)if(f=b[e-d],i=c[g-d],!f||!i||f!==i)break;return b[e-d+1]},setStart:function(a,b){var c=this.doc;this.startContainer=a;this.startOffset=b;if(this.endContainer===c)this.endContainer=a,this.endOffset=b;return pb(this)},setEnd:function(a,b){var c=this.doc;this.endContainer=a;this.endOffset=b;if(this.startContainer===c)this.startContainer=a,this.startOffset=b;return pb(this)},setStartBefore:function(a){return this.setStart(a.parentNode||this.doc,
+f(a).index())},setStartAfter:function(a){return this.setStart(a.parentNode||this.doc,f(a).index()+1)},setEndBefore:function(a){return this.setEnd(a.parentNode||this.doc,f(a).index())},setEndAfter:function(a){return this.setEnd(a.parentNode||this.doc,f(a).index()+1)},selectNode:function(a){return this.setStartBefore(a).setEndAfter(a)},selectNodeContents:function(a){var b=f(a);if(b.type==3||b.isSingle())return this.selectNode(a);b=b.children();if(b.length>0)return this.setStartBefore(b[0]).setEndAfter(b[b.length-
+1]);return this.setStart(a,0).setEnd(a,0)},collapse:function(a){if(a)return this.setEnd(this.startContainer,this.startOffset);return this.setStart(this.endContainer,this.endOffset)},compareBoundaryPoints:function(a,b){var c=this.get(),d=b.get();if(l){var e={};e[ka]="StartToStart";e[ja]="EndToStart";e[ca]="EndToEnd";e[la]="StartToEnd";c=c.compareEndPoints(e[a],d);if(c!==0)return c;var g,h,i,k;if(a===ka||a===la)g=this.startContainer,i=this.startOffset;if(a===ja||a===ca)g=this.endContainer,i=this.endOffset;
+if(a===ka||a===ja)h=b.startContainer,k=b.startOffset;if(a===ca||a===la)h=b.endContainer,k=b.endOffset;if(g===h)return g=i-k,g>0?1:g<0?-1:0;for(c=h;c&&c.parentNode!==g;)c=c.parentNode;if(c)return f(c).index()>=i?-1:1;for(c=g;c&&c.parentNode!==h;)c=c.parentNode;if(c)return f(c).index()>=k?1:-1;if((c=f(h).next())&&c.contains(g))return 1;if((c=f(g).next())&&c.contains(h))return-1}else return c.compareBoundaryPoints(a,d)},cloneRange:function(){return(new L(this.doc)).setStart(this.startContainer,this.startOffset).setEnd(this.endContainer,
+this.endOffset)},toString:function(){var a=this.get();return(l?a.text:a.toString()).replace(/\r\n|\n|\r/g,"")},cloneContents:function(){return Ma(this,!0,!1)},deleteContents:function(){return Ma(this,!1,!0)},extractContents:function(){return Ma(this,!0,!0)},insertNode:function(a){var b=this.startContainer,c=this.startOffset,d=this.endContainer,e=this.endOffset,g,f,i,k=1;if(a.nodeName.toLowerCase()==="#document-fragment")g=a.firstChild,f=a.lastChild,k=a.childNodes.length;b.nodeType==1?(i=b.childNodes[c])?
+(b.insertBefore(a,i),b===d&&(e+=k)):b.appendChild(a):b.nodeType==3&&(c===0?(b.parentNode.insertBefore(a,b),b.parentNode===d&&(e+=k)):c>=b.nodeValue.length?b.nextSibling?b.parentNode.insertBefore(a,b.nextSibling):b.parentNode.appendChild(a):(i=c>0?b.splitText(c):b,b.parentNode.insertBefore(a,i),b===d&&(d=i,e-=c)));g?this.setStartBefore(g).setEndAfter(f):this.selectNode(a);if(this.compareBoundaryPoints(ca,this.cloneRange().setEnd(d,e))>=1)return this;return this.setEnd(d,e)},surroundContents:function(a){a.appendChild(this.extractContents());
+return this.insertNode(a).selectNode(a)},isControl:function(){var a=this.startContainer,b=this.startOffset,c=this.endContainer,d=this.endOffset;return a.nodeType==1&&a===c&&b+1===d&&f(a.childNodes[b]).isControl()},get:function(a){var b=this.doc;if(!l){b=b.createRange();try{b.setStart(this.startContainer,this.startOffset),b.setEnd(this.endContainer,this.endOffset)}catch(c){}return b}if(a&&this.isControl())return b=b.body.createControlRange(),b.addElement(this.startContainer.childNodes[this.startOffset]),
+b;a=this.cloneRange().down();b=b.body.createTextRange();b.setEndPoint("StartToStart",rb(a.startContainer,a.startOffset));b.setEndPoint("EndToStart",rb(a.endContainer,a.endOffset));return b},html:function(){return f(this.cloneContents()).outer()},down:function(){function a(a,d,e){if(a.nodeType==1&&(a=f(a).children(),a.length!==0)){var g,h,i,k;d>0&&(g=a.eq(d-1));d<a.length&&(h=a.eq(d));if(g&&g.type==3)i=g[0],k=i.nodeValue.length;h&&h.type==3&&(i=h[0],k=0);i&&(e?b.setStart(i,k):b.setEnd(i,k))}}var b=
+this;a(b.startContainer,b.startOffset,!0);a(b.endContainer,b.endOffset,!1);return b},up:function(){function a(a,d,e){a.nodeType==3&&(d===0?e?b.setStartBefore(a):b.setEndBefore(a):d==a.nodeValue.length&&(e?b.setStartAfter(a):b.setEndAfter(a)))}var b=this;a(b.startContainer,b.startOffset,!0);a(b.endContainer,b.endOffset,!1);return b},enlarge:function(a){function b(b,e,g){b=f(b);if(!(b.type==3||Ea[b.name]||!a&&b.isBlock()))if(e===0){for(;!b.prev();){e=b.parent();if(!e||Ea[e.name]||!a&&e.isBlock())break;
+b=e}g?c.setStartBefore(b[0]):c.setEndBefore(b[0])}else if(e==b.children().length){for(;!b.next();){e=b.parent();if(!e||Ea[e.name]||!a&&e.isBlock())break;b=e}g?c.setStartAfter(b[0]):c.setEndAfter(b[0])}}var c=this;c.up();b(c.startContainer,c.startOffset,!0);b(c.endContainer,c.endOffset,!1);return c},shrink:function(){for(var a,b=this.collapsed;this.startContainer.nodeType==1&&(a=this.startContainer.childNodes[this.startOffset])&&a.nodeType==1&&!f(a).isSingle();)this.setStart(a,0);if(b)return this.collapse(b);
+for(;this.endContainer.nodeType==1&&this.endOffset>0&&(a=this.endContainer.childNodes[this.endOffset-1])&&a.nodeType==1&&!f(a).isSingle();)this.setEnd(a,a.childNodes.length);return this},createBookmark:function(a){var b,c=f('<span style="display:none;"></span>',this.doc)[0];c.id="__kindeditor_bookmark_start_"+Ob++ +"__";if(!this.collapsed)b=c.cloneNode(!0),b.id="__kindeditor_bookmark_end_"+Ob++ +"__";b&&this.cloneRange().collapse(!1).insertNode(b).setEndBefore(b);this.insertNode(c).setStartAfter(c);
+return{start:a?"#"+c.id:c,end:b?a?"#"+b.id:b:null}},moveToBookmark:function(a){var b=this.doc,c=f(a.start,b),a=a.end?f(a.end,b):null;if(!c||c.length<1)return this;this.setStartBefore(c[0]);c.remove();a&&a.length>0?(this.setEndBefore(a[0]),a.remove()):this.collapse(!0);return this},dump:function(){console.log("--------------------");console.log(this.startContainer.nodeType==3?this.startContainer.nodeValue:this.startContainer,this.startOffset);console.log(this.endContainer.nodeType==3?this.endContainer.nodeValue:
+this.endContainer,this.endOffset)}});f.RangeClass=L;f.range=Na;f.START_TO_START=ka;f.START_TO_END=ja;f.END_TO_END=ca;f.END_TO_START=la;E(na,{init:function(a){var b=a.doc;this.doc=b;this.win=U(b);this.sel=Oa(b);this.range=a},selection:function(a){var b=this.doc,c;c=Oa(b);var d;try{d=c.rangeCount>0?c.getRangeAt(0):c.createRange()}catch(e){}c=l&&(!d||!d.item&&d.parentElement().ownerDocument!==b)?null:d;this.sel=Oa(b);if(c)return this.range=Na(c),f(this.range.startContainer).name=="html"&&this.range.selectNodeContents(b.body).collapse(!1),
+this;a&&this.range.selectNodeContents(b.body).collapse(!1);return this},select:function(a){var a=j(a,!0),b=this.sel,c=this.range.cloneRange().shrink(),d=c.startContainer,e=c.startOffset,g=T(d),h=this.win,i,k=!1;if(a&&d.nodeType==1&&c.collapsed){if(l){b=f("<span>&nbsp;</span>",g);c.insertNode(b[0]);i=g.body.createTextRange();try{i.moveToElementText(b[0])}catch(n){}i.collapse(!1);i.select();b.remove();h.focus();return this}if(W&&(a=d.childNodes,f(d).isInline()||e>0&&f(a[e-1]).isInline()||a[e]&&f(a[e]).isInline()))c.insertNode(g.createTextNode("\u200b")),
+k=!0}if(l)try{i=c.get(!0),i.select()}catch(r){}else k&&c.collapse(!1),i=c.get(!0),b.removeAllRanges(),b.addRange(i),g!==document&&(c=f(i.endContainer).pos(),h.scrollTo(c.x,c.y));h.focus();return this},wrap:function(a){var b=this.range,c;c=f(a,this.doc);if(b.collapsed)return b.shrink(),b.insertNode(c[0]).selectNodeContents(c[0]),this;if(c.isBlock()){for(var d=a=c.clone(!0);d.first();)d=d.first();d.append(b.extractContents());b.insertNode(a[0]).selectNode(a[0]);return this}b.enlarge();var e=b.createBookmark(),
+a=b.commonAncestor(),g=!1;f(a).scan(function(a){if(!g&&a==e.start)g=!0;else if(g){if(a==e.end)return!1;var b=f(a),d;a:{for(d=b;d&&d.name!="body";){if(Ha[d.name]||d.name=="div"&&d.hasClass("ke-script")){d=!0;break a}d=d.parent()}d=!1}if(!d&&b.type==3&&B(a.nodeValue).length>0){for(var n;(n=b.parent())&&n.isStyle()&&n.children().length==1;)b=n;n=c;n=n.clone(!0);if(b.type==3)Ra(n).append(b.clone(!1)),b.replaceWith(n);else{for(var a=b,j;(j=b.first())&&j.children().length==1;)b=j;j=b.first();for(b=b.doc.createDocumentFragment();j;)b.appendChild(j[0]),
+j=j.next();j=a.clone(!0);d=Ra(j);for(var p=j,l=!1;n;){for(;p;)p.name===n.name&&(Wb(p,n.attr(),n.css()),l=!0),p=p.first();l||d.append(n.clone(!1));l=!1;n=n.first()}n=j;b.firstChild&&Ra(n).append(b);a.replaceWith(n)}}}});b.moveToBookmark(e);return this},split:function(a,b){for(var c=this.range,d=c.doc,e=c.cloneRange().collapse(a),g=e.startContainer,h=e.startOffset,i=g.nodeType==3?g.parentNode:g,k=!1,n;i&&i.parentNode;){n=f(i);if(b){if(!n.isStyle())break;if(!Pa(n,b))break}else if(Ea[n.name])break;k=
+!0;i=i.parentNode}if(k)d=d.createElement("span"),c.cloneRange().collapse(!a).insertNode(d),a?e.setStartBefore(i.firstChild).setEnd(g,h):e.setStart(g,h).setEndAfter(i.lastChild),g=e.extractContents(),h=g.firstChild,k=g.lastChild,a?(e.insertNode(g),c.setStartAfter(k).setEndBefore(d)):(i.appendChild(g),c.setStartBefore(d).setEndBefore(h)),e=d.parentNode,e==c.endContainer&&(i=f(d).prev(),g=f(d).next(),i&&g&&i.type==3&&g.type==3?c.setEnd(i[0],i[0].nodeValue.length):a||c.setEnd(c.endContainer,c.endOffset-
+1)),e.removeChild(d);return this},remove:function(a){var b=this.doc,c=this.range;c.enlarge();if(c.startOffset===0){for(var d=f(c.startContainer),e;(e=d.parent())&&e.isStyle()&&e.children().length==1;)d=e;c.setStart(d[0],0);d=f(c.startContainer);d.isBlock()&&Qa(d,a);(d=d.parent())&&d.isBlock()&&Qa(d,a)}if(c.collapsed){this.split(!0,a);b=c.startContainer;d=c.startOffset;if(d>0&&(e=f(b.childNodes[d-1]))&&da(e))e.remove(),c.setStart(b,d-1);(d=f(b.childNodes[d]))&&da(d)&&d.remove();da(b)&&(c.startBefore(b),
+b.remove());c.collapse(!0);return this}this.split(!0,a);this.split(!1,a);var g=b.createElement("span"),h=b.createElement("span");c.cloneRange().collapse(!1).insertNode(h);c.cloneRange().collapse(!0).insertNode(g);var i=[],k=!1;f(c.commonAncestor()).scan(function(a){if(!k&&a==g)k=!0;else{if(a==h)return!1;k&&i.push(a)}});f(g).remove();f(h).remove();b=c.startContainer;d=c.startOffset;e=c.endContainer;var n=c.endOffset;if(d>0){var j=f(b.childNodes[d-1]);j&&da(j)&&(j.remove(),c.setStart(b,d-1),b==e&&c.setEnd(e,
+n-1));if((d=f(b.childNodes[d]))&&da(d))d.remove(),b==e&&c.setEnd(e,n-1)}(b=f(e.childNodes[c.endOffset]))&&da(b)&&b.remove();b=c.createBookmark(!0);m(i,function(b,c){Qa(f(c),a)});c.moveToBookmark(b);return this},commonNode:function(a){function b(b){for(var c=b;b;){if(Pa(f(b),a))return f(b);b=b.parentNode}for(;c&&(c=c.lastChild);)if(Pa(f(c),a))return f(c);return null}var c=this.range,d=c.endContainer,c=c.endOffset,e=d.nodeType==3||c===0?d:d.childNodes[c-1],g=b(e);if(g)return g;if(e.nodeType==1||d.nodeType==
+3&&c===0)if(d=f(e).prev())return b(d);return null},commonAncestor:function(a){function b(b){for(;b;){if(b.nodeType==1&&b.tagName.toLowerCase()===a)return b;b=b.parentNode}return null}var c=this.range,d=c.startContainer,e=c.startOffset,g=c.endContainer,c=c.endOffset,g=g.nodeType==3||c===0?g:g.childNodes[c-1],d=b(d.nodeType==3||e===0?d:d.childNodes[e-1]),e=b(g);if(d&&e&&d===e)return f(d);return null},state:function(a){var b=this.doc,c=!1;try{c=b.queryCommandState(a)}catch(d){}return c},val:function(a){var b=
+this.doc,a=a.toLowerCase(),c="";if(a==="fontfamily"||a==="fontname")return c=tb(b,"fontname"),c=c.replace(/['"]/g,""),c.toLowerCase();if(a==="formatblock"){c=tb(b,a);if(c===""&&(a=this.commonNode({"h1,h2,h3,h4,h5,h6,p,div,pre,address":"*"})))c=a.name;c==="Normal"&&(c="p");return c.toLowerCase()}if(a==="fontsize")return(a=this.commonNode({"*":".font-size"}))&&(c=a.css("font-size")),c.toLowerCase();if(a==="forecolor")return(a=this.commonNode({"*":".color"}))&&(c=a.css("color")),c=va(c),c===""&&(c="default"),
+c.toLowerCase();if(a==="hilitecolor")return(a=this.commonNode({"*":".background-color"}))&&(c=a.css("background-color")),c=va(c),c===""&&(c="default"),c.toLowerCase();return c},toggle:function(a,b){this.commonNode(b)?this.remove(b):this.wrap(a);return this.select()},bold:function(){return this.toggle("<strong></strong>",{span:".font-weight=bold",strong:"*",b:"*"})},italic:function(){return this.toggle("<em></em>",{span:".font-style=italic",em:"*",i:"*"})},underline:function(){return this.toggle("<u></u>",
+{span:".text-decoration=underline",u:"*"})},strikethrough:function(){return this.toggle("<s></s>",{span:".text-decoration=line-through",s:"*"})},forecolor:function(a){return this.toggle('<span style="color:'+a+';"></span>',{span:".color="+a,font:"color"})},hilitecolor:function(a){return this.toggle('<span style="background-color:'+a+';"></span>',{span:".background-color="+a})},fontsize:function(a){return this.toggle('<span style="font-size:'+a+';"></span>',{span:".font-size="+a,font:"size"})},fontname:function(a){return this.fontfamily(a)},
+fontfamily:function(a){return this.toggle('<span style="font-family:'+a+';"></span>',{span:".font-family="+a,font:"face"})},removeformat:function(){var a={"*":".font-weight,.font-style,.text-decoration,.color,.background-color,.font-size,.font-family,.text-indent"};m(Lb,function(b){a[b]="*"});this.remove(a);return this.select()},inserthtml:function(a,b){function c(a,b){var b='<img id="__kindeditor_temp_tag__" width="0" height="0" style="display:none;" />'+b,c=a.get();c.item?c.item(0).outerHTML=b:
+c.pasteHTML(b);var d=a.doc.getElementById("__kindeditor_temp_tag__");d.parentNode.removeChild(d);c=sb(c);a.setEnd(c.endContainer,c.endOffset);a.collapse(!1);e.select(!1)}function d(a,b){var c=a.doc,d=c.createDocumentFragment();f("@"+b,c).each(function(){d.appendChild(this)});a.deleteContents();a.insertNode(d);a.collapse(!1);e.select(!1)}var e=this,g=e.range;if(a==="")return e;if(l&&b){try{c(g,a)}catch(h){d(g,a)}return e}d(g,a);return e},hr:function(){return this.inserthtml("<hr />")},print:function(){this.win.print();
+return this},insertimage:function(a,b,c,d,e,g){b=j(b,"");j(e,0);a='<img src="'+C(a)+'" data-ke-src="'+C(a)+'" ';c&&(a+='width="'+C(c)+'" ');d&&(a+='height="'+C(d)+'" ');b&&(a+='title="'+C(b)+'" ');g&&(a+='align="'+C(g)+'" ');a+='alt="'+C(b)+'" ';a+="/>";return this.inserthtml(a)},createlink:function(a,b){var c=this.doc,d=this.range;this.select();var e=this.commonNode({a:"*"});e&&!d.isControl()&&(d.selectNode(e.get()),this.select());e='<a href="'+C(a)+'" data-ke-src="'+C(a)+'" ';b&&(e+=' target="'+
+C(b)+'"');if(d.collapsed)return e+=">"+C(a)+"</a>",this.inserthtml(e);if(d.isControl()){var g=f(d.startContainer.childNodes[d.startOffset]);e+="></a>";g.after(f(e,c));g.next().append(g);d.selectNode(g[0]);return this.select()}P(c,"createlink","__kindeditor_temp_url__");f('a[href="__kindeditor_temp_url__"]',c).each(function(){f(this).attr("href",a).attr("data-ke-src",a);b?f(this).attr("target",b):f(this).removeAttr("target")});return this},unlink:function(){var a=this.doc,b=this.range;this.select();
+if(b.collapsed){var c=this.commonNode({a:"*"});c&&(b.selectNode(c.get()),this.select());P(a,"unlink",null);W&&f(b.startContainer).name==="img"&&(a=f(b.startContainer).parent(),a.name==="a"&&a.remove(!0))}else P(a,"unlink",null);return this}});m("formatblock,selectall,justifyleft,justifycenter,justifyright,justifyfull,insertorderedlist,insertunorderedlist,indent,outdent,subscript,superscript".split(","),function(a,b){na.prototype[b]=function(a){this.select();P(this.doc,b,a);(!l||N(b,"formatblock,selectall,insertorderedlist,insertunorderedlist".split(","))>=
+0)&&this.selection();return this}});m("cut,copy,paste".split(","),function(a,b){na.prototype[b]=function(){if(!this.doc.queryCommandSupported(b))throw"not supported";this.select();P(this.doc,b,null);return this}});f.CmdClass=na;f.cmd=xb;E(R,{init:function(a){var b=this;b.name=a.name||"";b.doc=a.doc||document;b.win=U(b.doc);b.x=s(a.x);b.y=s(a.y);b.z=a.z;b.width=s(a.width);b.height=s(a.height);b.div=f('<div style="display:block;"></div>');b.options=a;b._alignEl=a.alignEl;b.width&&b.div.css("width",
+b.width);b.height&&b.div.css("height",b.height);b.z&&b.div.css({position:"absolute",left:b.x,top:b.y,"z-index":b.z});b.z&&(b.x===o||b.y===o)&&b.autoPos(b.width,b.height);a.cls&&b.div.addClass(a.cls);a.shadowMode&&b.div.addClass("ke-shadow");a.css&&b.div.css(a.css);a.src?f(a.src).replaceWith(b.div):f(b.doc.body).append(b.div);a.html&&b.div.html(a.html);if(a.autoScroll)if(l&&z<7||O){var c=ba();f(b.win).bind("scroll",function(){var a=ba(),e=a.x-c.x,a=a.y-c.y;b.pos(t(b.x)+e,t(b.y)+a,!1)})}else b.div.css("position",
+"fixed")},pos:function(a,b,c){c=j(c,!0);if(a!==null&&(a=a<0?0:s(a),this.div.css("left",a),c))this.x=a;if(b!==null&&(b=b<0?0:s(b),this.div.css("top",b),c))this.y=b;return this},autoPos:function(a,b){var c=t(a)||0,d=t(b)||0,e=ba();if(this._alignEl){var g=f(this._alignEl),h=g.pos(),c=Q(g[0].clientWidth/2-c/2),d=Q(g[0].clientHeight/2-d/2);x=c<0?h.x:h.x+c;y=d<0?h.y:h.y+d}else h=G(this.doc),x=Q(e.x+(h.clientWidth-c)/2),y=Q(e.y+(h.clientHeight-d)/2);l&&z<7||O||(x-=e.x,y-=e.y);return this.pos(x,y)},remove:function(){var a=
+this;(l&&z<7||O)&&f(a.win).unbind("scroll");a.div.remove();m(a,function(b){a[b]=null});return this},show:function(){this.div.show();return this},hide:function(){this.div.hide();return this},draggable:function(a){var b=this,a=a||{};a.moveEl=b.div;a.moveFn=function(a,d,e,g,f,i){if((a+=f)<0)a=0;if((d+=i)<0)d=0;b.pos(a,d)};Sa(a);return b}});f.WidgetClass=R;f.widget=Ua;var Va="";if(q=document.getElementsByTagName("html"))Va=q[0].dir;E(pa,R,{init:function(a){function b(){var b=Ta(c.iframe);b.open();if(i)b.domain=
+document.domain;b.write(Xb(d,e,g,h));b.close();c.win=c.iframe[0].contentWindow;c.doc=b;var k=xb(b);c.afterChange(function(){k.selection()});W&&f(b).click(function(a){f(a.target).name==="img"&&(k.selection(!0),k.range.selectNode(a.target),k.select())});if(l)c._mousedownHandler=function(){var a=k.range.cloneRange();a.shrink();a.isControl()&&c.blur()},f(document).mousedown(c._mousedownHandler),f(b).keydown(function(a){if(a.which==8){k.selection();var b=k.range;b.isControl()&&(b.collapse(!0),f(b.startContainer.childNodes[b.startOffset]).remove(),
+a.preventDefault())}});c.cmd=k;c.html(oa(c.srcElement));l?(b.body.disabled=!0,b.body.contentEditable=!0,b.body.removeAttribute("disabled")):b.designMode="on";a.afterCreate&&a.afterCreate.call(c)}var c=this;pa.parent.init.call(c,a);c.srcElement=f(a.srcElement);c.div.addClass("ke-edit");c.designMode=j(a.designMode,!0);c.beforeGetHtml=a.beforeGetHtml;c.beforeSetHtml=a.beforeSetHtml;c.afterSetHtml=a.afterSetHtml;var d=j(a.themesPath,""),e=a.bodyClass,g=a.cssPath,h=a.cssData,i=location.host.replace(/:\d+/,
+"")!==document.domain,k="document.open();"+(i?'document.domain="'+document.domain+'";':"")+"document.close();",k=l?' src="javascript:void(function(){'+encodeURIComponent(k)+'}())"':"";c.iframe=f('<iframe class="ke-edit-iframe" hidefocus="true" frameborder="0"'+k+"></iframe>").css("width","100%");c.textarea=f('<textarea class="ke-edit-textarea" hidefocus="true"></textarea>').css("width","100%");c.width&&c.setWidth(c.width);c.height&&c.setHeight(c.height);c.designMode?c.textarea.hide():c.iframe.hide();
+i&&c.iframe.bind("load",function(){c.iframe.unbind("load");l?b():setTimeout(b,0)});c.div.append(c.iframe);c.div.append(c.textarea);c.srcElement.hide();!i&&b()},setWidth:function(a){this.div.css("width",s(a));return this},setHeight:function(a){a=s(a);this.div.css("height",a);this.iframe.css("height",a);if(l&&z<8||O)a=s(t(a)-2);this.textarea.css("height",a);return this},remove:function(){var a=this.doc;f(a.body).unbind();f(a).unbind();f(this.win).unbind();this._mousedownHandler&&f(document).unbind("mousedown",
+this._mousedownHandler);oa(this.srcElement,this.html());this.srcElement.show();a.write("");this.iframe.unbind();this.textarea.unbind();pa.parent.remove.call(this)},html:function(a,b){var c=this.doc;if(this.designMode){c=c.body;if(a===o)return a=b?"<!doctype html><html>"+c.parentNode.innerHTML+"</html>":c.innerHTML,this.beforeGetHtml&&(a=this.beforeGetHtml(a)),ea&&a=="<br />"&&(a=""),a;this.beforeSetHtml&&(a=this.beforeSetHtml(a));l&&z>=9&&(a=a.replace(/(<.*?checked=")checked(".*>)/ig,"$1$2"));f(c).html(a);
+this.afterSetHtml&&this.afterSetHtml();return this}if(a===o)return this.textarea.val();this.textarea.val(a);return this},design:function(a){if(a===o?!this.designMode:a){if(!this.designMode)a=this.html(),this.designMode=!0,this.html(a),this.textarea.hide(),this.iframe.show()}else if(this.designMode)a=this.html(),this.designMode=!1,this.html(a),this.iframe.hide(),this.textarea.show();return this.focus()},focus:function(){this.designMode?this.win.focus():this.textarea[0].focus();return this},blur:function(){if(l){var a=
+f('<input type="text" style="float:left;width:0;height:0;padding:0;margin:0;border:0;" value="" />',this.div);this.div.append(a);a[0].focus();a.remove()}else this.designMode?this.win.blur():this.textarea[0].blur();return this},afterChange:function(a){function b(b){setTimeout(function(){a(b)},1)}var c=this.doc,d=c.body;f(c).keyup(function(b){!b.ctrlKey&&!b.altKey&&ab[b.which]&&a(b)});f(c).mouseup(a).contextmenu(a);f(this.win).blur(a);f(d).bind("paste",b);f(d).bind("cut",b);return this}});f.EditClass=
+pa;f.edit=yb;f.iframeDoc=Ta;E(Aa,R,{init:function(a){function b(a){a=f(a);if(a.hasClass("ke-outline"))return a;if(a.hasClass("ke-toolbar-icon"))return a.parent()}function c(a,c){var d=b(a.target);if(d&&!d.hasClass("ke-disabled")&&!d.hasClass("ke-selected"))d[c]("ke-on")}var d=this;Aa.parent.init.call(d,a);d.disableMode=j(a.disableMode,!1);d.noDisableItemMap=u(j(a.noDisableItems,[]));d._itemMap={};d.div.addClass("ke-toolbar").bind("contextmenu,mousedown,mousemove",function(a){a.preventDefault()}).attr("unselectable",
+"on");d.div.mouseover(function(a){c(a,"addClass")}).mouseout(function(a){c(a,"removeClass")}).click(function(a){var c=b(a.target);c&&!c.hasClass("ke-disabled")&&d.options.click.call(this,a,c.attr("data-name"))})},get:function(a){if(this._itemMap[a])return this._itemMap[a];return this._itemMap[a]=f("span.ke-icon-"+a,this.div).parent()},select:function(a){zb.call(this,a,function(a){a.addClass("ke-selected")});return self},unselect:function(a){zb.call(this,a,function(a){a.removeClass("ke-selected").removeClass("ke-on")});
+return self},enable:function(a){if(a=a.get?a:this.get(a))a.removeClass("ke-disabled"),a.opacity(1);return this},disable:function(a){if(a=a.get?a:this.get(a))a.removeClass("ke-selected").addClass("ke-disabled"),a.opacity(0.5);return this},disableAll:function(a,b){var c=this,d=c.noDisableItemMap;b&&(d=u(b));(a===o?!c.disableMode:a)?(f("span.ke-outline",c.div).each(function(){var a=f(this),b=a[0].getAttribute("data-name",2);d[b]||c.disable(a)}),c.disableMode=!0):(f("span.ke-outline",c.div).each(function(){var a=
+f(this),b=a[0].getAttribute("data-name",2);d[b]||c.enable(a)}),c.disableMode=!1);return c}});f.ToolbarClass=Aa;f.toolbar=Ab;E(qa,R,{init:function(a){a.z=a.z||811213;qa.parent.init.call(this,a);this.centerLineMode=j(a.centerLineMode,!0);this.div.addClass("ke-menu").bind("click,mousedown",function(a){a.stopPropagation()}).attr("unselectable","on")},addItem:function(a){if(a.title==="-")this.div.append(f('<div class="ke-menu-separator"></div>'));else{var b=f('<div class="ke-menu-item" unselectable="on"></div>'),
+c=f('<div class="ke-inline-block ke-menu-item-left"></div>'),d=f('<div class="ke-inline-block ke-menu-item-right"></div>'),e=s(a.height),g=j(a.iconClass,"");this.div.append(b);e&&(b.css("height",e),d.css("line-height",e));var h;this.centerLineMode&&(h=f('<div class="ke-inline-block ke-menu-item-center"></div>'),e&&h.css("height",e));b.mouseover(function(){f(this).addClass("ke-menu-item-on");h&&h.addClass("ke-menu-item-center-on")}).mouseout(function(){f(this).removeClass("ke-menu-item-on");h&&h.removeClass("ke-menu-item-center-on")}).click(function(b){a.click.call(f(this));
+b.stopPropagation()}).append(c);h&&b.append(h);b.append(d);a.checked&&(g="ke-icon-checked");g!==""&&c.html('<span class="ke-inline-block ke-toolbar-icon ke-toolbar-icon-url '+g+'"></span>');d.html(a.title);return this}},remove:function(){this.options.beforeRemove&&this.options.beforeRemove.call(this);f(".ke-menu-item",this.div[0]).unbind();qa.parent.remove.call(this);return this}});f.MenuClass=qa;f.menu=Wa;E(ra,R,{init:function(a){a.z=a.z||811213;ra.parent.init.call(this,a);var b=a.colors||[["#E53333",
+"#E56600","#FF9900","#64451D","#DFC5A4","#FFE500"],["#009900","#006600","#99BB00","#B8D100","#60D978","#00D5FF"],["#337FE5","#003399","#4C33E5","#9933E5","#CC33E5","#EE33EE"],["#FFFFFF","#CCCCCC","#999999","#666666","#333333","#000000"]];this.selectedColor=(a.selectedColor||"").toLowerCase();this._cells=[];this.div.addClass("ke-colorpicker").bind("click,mousedown",function(a){a.stopPropagation()}).attr("unselectable","on");a=this.doc.createElement("table");this.div.append(a);a.className="ke-colorpicker-table";
+a.cellPadding=0;a.cellSpacing=0;a.border=0;var c=a.insertRow(0),d=c.insertCell(0);d.colSpan=b[0].length;this._addAttr(d,"","ke-colorpicker-cell-top");for(var e=0;e<b.length;e++)for(var c=a.insertRow(e+1),g=0;g<b[e].length;g++)d=c.insertCell(g),this._addAttr(d,b[e][g],"ke-colorpicker-cell")},_addAttr:function(a,b,c){var d=this,a=f(a).addClass(c);d.selectedColor===b.toLowerCase()&&a.addClass("ke-colorpicker-cell-selected");a.attr("title",b||d.options.noColor);a.mouseover(function(){f(this).addClass("ke-colorpicker-cell-on")});
+a.mouseout(function(){f(this).removeClass("ke-colorpicker-cell-on")});a.click(function(a){a.stop();d.options.click.call(f(this),b)});b?a.append(f('<div class="ke-colorpicker-cell-color" unselectable="on"></div>').css("background-color",b)):a.html(d.options.noColor);f(a).attr("unselectable","on");d._cells.push(a)},remove:function(){m(this._cells,function(){this.unbind()});ra.parent.remove.call(this);return this}});f.ColorPickerClass=ra;f.colorpicker=Bb;E(Xa,{init:function(a){var b=f(a.button),c=a.fieldName||
+"file",d=a.url||"",e=b.val(),g=a.extraParams||{},h=b[0].className||"",i=a.target||"kindeditor_upload_iframe_"+(new Date).getTime();a.afterError=a.afterError||function(a){alert(a)};var k=[],j;for(j in g)k.push('<input type="hidden" name="'+j+'" value="'+g[j]+'" />');c=['<div class="ke-inline-block '+h+'">',a.target?"":'<iframe name="'+i+'" style="display:none;"></iframe>',a.form?'<div class="ke-upload-area">':'<form class="ke-upload-area ke-form" method="post" enctype="multipart/form-data" target="'+
+i+'" action="'+d+'">','<span class="ke-button-common">',k.join(""),'<input type="button" class="ke-button-common ke-button" value="'+e+'" />',"</span>",'<input type="file" class="ke-upload-file" name="'+c+'" tabindex="-1" />',a.form?"</div>":"</form>","</div>"].join("");c=f(c,b.doc);b.hide();b.before(c);this.div=c;this.button=b;this.iframe=a.target?f('iframe[name="'+i+'"]'):f("iframe",c);this.form=a.form?f(a.form):f("form",c);b=a.width||f(".ke-button-common",c).width();this.fileBox=f(".ke-upload-file",
+c).width(b);this.options=a},submit:function(){var a=this,b=a.iframe;b.bind("load",function(){b.unbind();var c=document.createElement("form");a.fileBox.before(c);f(c).append(a.fileBox);c.reset();f(c).remove(!0);var c=f.iframeDoc(b),d=c.getElementsByTagName("pre")[0],e="",g,e=d?d.innerHTML:c.body.innerHTML,e=fa(e);b[0].src="javascript:false";try{g=f.json(e)}catch(h){a.options.afterError.call(a,"<!doctype html><html>"+c.body.parentNode.innerHTML+"</html>")}g&&a.options.afterUpload.call(a,g)});a.form[0].submit();
+return a},remove:function(){this.fileBox&&this.fileBox.unbind();this.iframe.remove();this.div.remove();this.button.show();return this}});f.UploadButtonClass=Xa;f.uploadbutton=function(a){return new Xa(a)};E(sa,R,{init:function(a){var b=j(a.shadowMode,!0);a.z=a.z||811213;a.shadowMode=!1;a.autoScroll=j(a.autoScroll,!0);sa.parent.init.call(this,a);var c=a.title,d=f(a.body,this.doc),e=a.previewBtn,g=a.yesBtn,h=a.noBtn,i=a.closeBtn,k=j(a.showMask,!0);this.div.addClass("ke-dialog").bind("click,mousedown",
+function(a){a.stopPropagation()});var n=f('<div class="ke-dialog-content"></div>').appendTo(this.div);l&&z<7?this.iframeMask=f('<iframe src="about:blank" class="ke-dialog-shadow"></iframe>').appendTo(this.div):b&&f('<div class="ke-dialog-shadow"></div>').appendTo(this.div);b=f('<div class="ke-dialog-header"></div>');n.append(b);b.html(c);this.closeIcon=f('<span class="ke-dialog-icon-close" title="'+i.name+'"></span>').click(i.click);b.append(this.closeIcon);this.draggable({clickEl:b,beforeDrag:a.beforeDrag});
+a=f('<div class="ke-dialog-body"></div>');n.append(a);a.append(d);var o=f('<div class="ke-dialog-footer"></div>');(e||g||h)&&n.append(o);m([{btn:e,name:"preview"},{btn:g,name:"yes"},{btn:h,name:"no"}],function(){if(this.btn){var a=this.btn,a=a||{},b=a.name||"",c=f('<span class="ke-button-common ke-button-outer" title="'+b+'"></span>'),b=f('<input class="ke-button-common ke-button" type="button" value="'+b+'" />');a.click&&b.click(a.click);c.append(b);c.addClass("ke-dialog-"+this.name);o.append(c)}});
+this.height&&a.height(t(this.height)-b.height()-o.height());this.div.width(this.div.width());this.div.height(this.div.height());this.mask=null;if(k)d=G(this.doc),this.mask=Ua({x:0,y:0,z:this.z-1,cls:"ke-dialog-mask",width:Math.max(d.scrollWidth,d.clientWidth),height:Math.max(d.scrollHeight,d.clientHeight)});this.autoPos(this.div.width(),this.div.height());this.footerDiv=o;this.bodyDiv=a;this.headerDiv=b;this.isLoading=!1},setMaskIndex:function(a){this.mask.div.css("z-index",a)},showLoading:function(a){var a=
+j(a,""),b=this.bodyDiv;this.loading=f('<div class="ke-dialog-loading"><div class="ke-inline-block ke-dialog-loading-content" style="margin-top:'+Math.round(b.height()/3)+'px;">'+a+"</div></div>").width(b.width()).height(b.height()).css("top",this.headerDiv.height()+"px");b.css("visibility","hidden").after(this.loading);this.isLoading=!0;return this},hideLoading:function(){this.loading&&this.loading.remove();this.bodyDiv.css("visibility","visible");this.isLoading=!1;return this},remove:function(){this.options.beforeRemove&&
+this.options.beforeRemove.call(this);this.mask&&this.mask.remove();this.iframeMask&&this.iframeMask.remove();this.closeIcon.unbind();f("input",this.div).unbind();f("button",this.div).unbind();this.footerDiv.unbind();this.bodyDiv.unbind();this.headerDiv.unbind();f("iframe",this.div).each(function(){f(this).remove()});sa.parent.remove.call(this);return this}});f.DialogClass=sa;f.dialog=Cb;f.tabs=function(a){var b=Ua(a),c=b.remove,d=a.afterSelect,a=b.div,e=[];a.addClass("ke-tabs").bind("contextmenu,mousedown,mousemove",
+function(a){a.preventDefault()});var g=f('<ul class="ke-tabs-ul ke-clearfix"></ul>');a.append(g);b.add=function(a){var b=f('<li class="ke-tabs-li">'+a.title+"</li>");b.data("tab",a);e.push(b);g.append(b)};b.selectedIndex=0;b.select=function(a){b.selectedIndex=a;m(e,function(c,d){d.unbind();c===a?(d.addClass("ke-tabs-li-selected"),f(d.data("tab").panel).show("")):(d.removeClass("ke-tabs-li-selected").removeClass("ke-tabs-li-on").mouseover(function(){f(this).addClass("ke-tabs-li-on")}).mouseout(function(){f(this).removeClass("ke-tabs-li-on")}).click(function(){b.select(c)}),
+f(d.data("tab").panel).hide())});d&&d.call(b,a)};b.remove=function(){m(e,function(){this.remove()});g.remove();c.call(b)};return b};f.loadScript=Ya;f.loadStyle=Za;f.ajax=function(a,b,c,d,e){var c=c||"GET",e=e||"json",g=A.XMLHttpRequest?new A.XMLHttpRequest:new ActiveXObject("Microsoft.XMLHTTP");g.open(c,a,!0);g.onreadystatechange=function(){if(g.readyState==4&&g.status==200&&b){var a=B(g.responseText);e=="json"&&(a=cb(a));b(a)}};if(c=="POST"){var f=[];m(d,function(a,b){f.push(encodeURIComponent(a)+
+"="+encodeURIComponent(b))});try{g.setRequestHeader("Content-Type","application/x-www-form-urlencoded")}catch(i){}g.send(f.join("&"))}else g.send(null)};var V={},M={};ta.prototype={lang:function(a){return Gb(a,this.langType)},loadPlugin:function(a,b){var c=this;if(V[a]){if(c._calledPlugins[a])return b&&b.call(c),c;V[a].call(c,KindEditor);b&&b.call(c);c._calledPlugins[a]=!0;return c}if(c.isLoading)return c;c.isLoading=!0;Ya(c.pluginsPath+a+"/"+a+".js?ver="+encodeURIComponent(f.DEBUG?Ca:Da),function(){c.isLoading=
+!1;V[a]&&c.loadPlugin(a,b)});return c},handler:function(a,b){var c=this;c._handlers[a]||(c._handlers[a]=[]);if(bb(b))return c._handlers[a].push(b),c;m(c._handlers[a],function(){b=this.call(c,b)});return b},clickToolbar:function(a,b){var c=this,d="clickToolbar"+a;if(b===o){if(c._handlers[d])return c.handler(d);c.loadPlugin(a,function(){c.handler(d)});return c}return c.handler(d,b)},updateState:function(){var a=this;m("justifyleft,justifycenter,justifyright,justifyfull,insertorderedlist,insertunorderedlist,subscript,superscript,bold,italic,underline,strikethrough".split(","),
+function(b,c){a.cmd.state(c)?a.toolbar.select(c):a.toolbar.unselect(c)});return a},addContextmenu:function(a){this._contextmenus.push(a);return this},afterCreate:function(a){return this.handler("afterCreate",a)},beforeRemove:function(a){return this.handler("beforeRemove",a)},beforeGetHtml:function(a){return this.handler("beforeGetHtml",a)},beforeSetHtml:function(a){return this.handler("beforeSetHtml",a)},afterSetHtml:function(a){return this.handler("afterSetHtml",a)},create:function(){function a(){k.height()===
+0?setTimeout(a,100):b.resize(d,e,!1)}var b=this,c=b.fullscreenMode;if(b.isCreated)return b;if(b.srcElement.data("kindeditor"))return b;b.srcElement.data("kindeditor","true");c?G().style.overflow="hidden":G().style.overflow="";var d=c?G().clientWidth+"px":b.width,e=c?G().clientHeight+"px":b.height;if(l&&z<8||O)e=s(t(e)+2);var g=b.container=f(b.layout);c?f(document.body).append(g):b.srcElement.before(g);var h=f(".toolbar",g),i=f(".edit",g),k=b.statusbar=f(".statusbar",g);g.removeClass("container").addClass("ke-container ke-container-"+
+b.themeType).css("width",d);if(c){g.css({position:"absolute",left:0,top:0,"z-index":811211});if(!ea)b._scrollPos=ba();A.scrollTo(0,0);f(document.body).css({height:"1px",overflow:"hidden"});f(document.body.parentNode).css("overflow","hidden");b._fullscreenExecuted=!0}else b._fullscreenExecuted&&(f(document.body).css({height:"",overflow:""}),f(document.body.parentNode).css("overflow","")),b._scrollPos&&A.scrollTo(b._scrollPos.x,b._scrollPos.y);var j=[];f.each(b.items,function(a,c){c=="|"?j.push('<span class="ke-inline-block ke-separator"></span>'):
+c=="/"?j.push('<div class="ke-hr"></div>'):(j.push('<span class="ke-outline" data-name="'+c+'" title="'+b.lang(c)+'" unselectable="on">'),j.push('<span class="ke-toolbar-icon ke-toolbar-icon-url ke-icon-'+c+'" unselectable="on"></span></span>'))});var h=b.toolbar=Ab({src:h,html:j.join(""),noDisableItems:b.noDisableItems,click:function(a,c){a.stop();if(b.menu){var d=b.menu.name;b.hideMenu();if(d===c)return}b.clickToolbar(c)}}),m=t(e)-h.div.height(),p=b.edit=yb({height:m>0&&t(e)>b.minHeight?m:b.minHeight,
+src:i,srcElement:b.srcElement,designMode:b.designMode,themesPath:b.themesPath,bodyClass:b.bodyClass,cssPath:b.cssPath,cssData:b.cssData,beforeGetHtml:function(a){a=b.beforeGetHtml(a);return S(a,b.filterMode?b.htmlTags:null,b.urlType,b.wellFormatMode,b.indentChar)},beforeSetHtml:function(a){a=S(a,b.filterMode?b.htmlTags:null,"",!1);return b.beforeSetHtml(a)},afterSetHtml:function(){b.edit=p=this;b.afterSetHtml()},afterCreate:function(){b.edit=p=this;b.cmd=p.cmd;b._docMousedownFn=function(){b.menu&&
+b.hideMenu()};f(p.doc,document).mousedown(b._docMousedownFn);Yb.call(b);Zb.call(b);$b.call(b);ac.call(b);p.afterChange(function(){p.designMode&&(b.updateState(),b.addBookmark(),b.options.afterChange&&b.options.afterChange.call(b))});p.textarea.keyup(function(a){!a.ctrlKey&&!a.altKey&&Nb[a.which]&&b.options.afterChange&&b.options.afterChange.call(b)});b.readonlyMode&&b.readonly();b.isCreated=!0;if(b.initContent==="")b.initContent=b.html();b.afterCreate();b.options.afterCreate&&b.options.afterCreate.call(b)}});
+k.removeClass("statusbar").addClass("ke-statusbar").append('<span class="ke-inline-block ke-statusbar-center-icon"></span>').append('<span class="ke-inline-block ke-statusbar-right-icon"></span>');if(b._fullscreenResizeHandler)f(A).unbind("resize",b._fullscreenResizeHandler),b._fullscreenResizeHandler=null;a();c?(b._fullscreenResizeHandler=function(){b.isCreated&&b.resize(G().clientWidth,G().clientHeight,!1)},f(A).bind("resize",b._fullscreenResizeHandler),h.select("fullscreen"),k.first().css("visibility",
+"hidden"),k.last().css("visibility","hidden")):(ea&&f(A).bind("scroll",function(){b._scrollPos=ba()}),b.resizeType>0?Sa({moveEl:g,clickEl:k,moveFn:function(a,c,d,e,g,f){e+=f;b.resize(null,e)}}):k.first().css("visibility","hidden"),b.resizeType===2?Sa({moveEl:g,clickEl:k.last(),moveFn:function(a,c,d,e,g,f){d+=g;e+=f;b.resize(d,e)}}):k.last().css("visibility","hidden"));return b},remove:function(){var a=this;if(!a.isCreated)return a;a.beforeRemove();a.srcElement.data("kindeditor","");a.menu&&a.hideMenu();
+m(a.dialogs,function(){a.hideDialog()});f(document).unbind("mousedown",a._docMousedownFn);a.toolbar.remove();a.edit.remove();a.statusbar.last().unbind();a.statusbar.unbind();a.container.remove();a.container=a.toolbar=a.edit=a.menu=null;a.dialogs=[];a.isCreated=!1;return a},resize:function(a,b,c){c=j(c,!0);if(a&&(/%/.test(a)||(a=t(a),a=a<this.minWidth?this.minWidth:a),this.container.css("width",s(a)),c))this.width=s(a);if(b&&(b=t(b),editHeight=t(b)-this.toolbar.div.height()-this.statusbar.height(),
+editHeight=editHeight<this.minHeight?this.minHeight:editHeight,this.edit.setHeight(editHeight),c))this.height=s(b);return this},select:function(){this.isCreated&&this.cmd.select();return this},html:function(a){if(a===o)return this.isCreated?this.edit.html():oa(this.srcElement);this.isCreated?this.edit.html(a):oa(this.srcElement,a);this.isCreated&&this.cmd.selection();return this},fullHtml:function(){return this.isCreated?this.edit.html(o,!0):""},text:function(a){return a===o?B(this.html().replace(/<(?!img|embed).*?>/ig,
+"").replace(/&nbsp;/ig," ")):this.html(C(a))},isEmpty:function(){return B(this.text().replace(/\r\n|\n|\r/,""))===""},isDirty:function(){return B(this.initContent.replace(/\r\n|\n|\r|t/g,""))!==B(this.html().replace(/\r\n|\n|\r|t/g,""))},selectedHtml:function(){return this.isCreated?this.cmd.range.html():""},count:function(a){a=(a||"html").toLowerCase();if(a==="html")return X($a(this.html())).length;if(a==="text")return this.text().replace(/<(?:img|embed).*?>/ig,"K").replace(/\r\n|\n|\r/g,"").length;
+return 0},exec:function(a){var a=a.toLowerCase(),b=this.cmd,c=N(a,"selectall,copy,paste,print".split(","))<0;c&&this.addBookmark(!1);b[a].apply(b,Fa(arguments,1));c&&(this.updateState(),this.addBookmark(!1),this.options.afterChange&&this.options.afterChange.call(this));return this},insertHtml:function(a,b){if(!this.isCreated)return this;a=this.beforeSetHtml(a);this.exec("inserthtml",a,b);return this},appendHtml:function(a){this.html(this.html()+a);if(this.isCreated)a=this.cmd,a.range.selectNodeContents(a.doc.body).collapse(!1),
+a.select();return this},sync:function(){oa(this.srcElement,this.html());return this},focus:function(){this.isCreated?this.edit.focus():this.srcElement[0].focus();return this},blur:function(){this.isCreated?this.edit.blur():this.srcElement[0].blur();return this},addBookmark:function(a){var a=j(a,!0),b=this.edit,c=b.doc.body,d=$a(c.innerHTML);if(a&&this._undoStack.length>0&&Math.abs(d.length-X(this._undoStack[this._undoStack.length-1].html).length)<this.minChangeSize)return this;b.designMode&&!this._firstAddBookmark?
+(b=this.cmd.range,a=b.createBookmark(!0),a.html=$a(c.innerHTML),b.moveToBookmark(a)):a={html:d};this._firstAddBookmark=!1;Hb(this._undoStack,a);return this},undo:function(){return Ib.call(this,this._undoStack,this._redoStack)},redo:function(){return Ib.call(this,this._redoStack,this._undoStack)},fullscreen:function(a){this.fullscreenMode=a===o?!this.fullscreenMode:a;return this.remove().create()},readonly:function(a){var a=j(a,!0),b=this,c=b.edit,d=c.doc;b.designMode?b.toolbar.disableAll(a,[]):m(b.noDisableItems,
+function(){b.toolbar[a?"disable":"enable"](this)});l?d.body.contentEditable=!a:d.designMode=a?"off":"on";c.textarea[0].disabled=a},createMenu:function(a){var b=this.toolbar.get(a.name),c=b.pos();a.x=c.x;a.y=c.y+b.height();a.z=this.options.zIndex;a.shadowMode=j(a.shadowMode,this.shadowMode);a.selectedColor!==o?(a.cls="ke-colorpicker-"+this.themeType,a.noColor=this.lang("noColor"),this.menu=Bb(a)):(a.cls="ke-menu-"+this.themeType,a.centerLineMode=!1,this.menu=Wa(a));return this.menu},hideMenu:function(){this.menu.remove();
+this.menu=null;return this},hideContextmenu:function(){this.contextmenu.remove();this.contextmenu=null;return this},createDialog:function(a){var b=this;a.z=b.options.zIndex;a.shadowMode=j(a.shadowMode,b.shadowMode);a.closeBtn=j(a.closeBtn,{name:b.lang("close"),click:function(){b.hideDialog();l&&b.cmd&&b.cmd.select()}});a.noBtn=j(a.noBtn,{name:b.lang(a.yesBtn?"no":"close"),click:function(){b.hideDialog();l&&b.cmd&&b.cmd.select()}});if(b.dialogAlignType!="page")a.alignEl=b.container;a.cls="ke-dialog-"+
+b.themeType;if(b.dialogs.length>0){var c=b.dialogs[b.dialogs.length-1];b.dialogs[0].setMaskIndex(c.z+2);a.z=c.z+3;a.showMask=!1}a=Cb(a);b.dialogs.push(a);return a},hideDialog:function(){this.dialogs.length>0&&this.dialogs.pop().remove();this.dialogs.length>0&&this.dialogs[0].setMaskIndex(this.dialogs[this.dialogs.length-1].z-1);return this},errorDialog:function(a){var b=this.createDialog({width:750,title:this.lang("uploadError"),body:'<div style="padding:10px 20px;"><iframe frameborder="0" style="width:708px;height:400px;"></iframe></div>'}),
+b=f("iframe",b.div),c=f.iframeDoc(b);c.open();c.write(a);c.close();f(c.body).css("background-color","#FFF");b[0].contentWindow.focus();return this}};_instances=[];f.remove=function(a){Kb(a,function(a){this.remove();_instances.splice(a,1)})};f.sync=function(a){Kb(a,function(){this.sync()})};l&&z<7&&P(document,"BackgroundImageCache",!0);f.EditorClass=ta;f.editor=function(a){return new ta(a)};f.create=Jb;f.instances=_instances;f.plugin=Eb;f.lang=Gb;Eb("core",function(a){var b=this,c={undo:"Z",redo:"Y",
+bold:"B",italic:"I",underline:"U",print:"P",selectall:"A"};b.afterSetHtml(function(){b.options.afterChange&&b.options.afterChange.call(b)});b.afterCreate(function(){if(b.syncType=="form"){for(var c=a(b.srcElement),d=!1;c=c.parent();)if(c.name=="form"){d=!0;break}if(d){c.bind("submit",function(){b.sync();a(A).bind("unload",function(){b.edit.textarea.remove()})});var f=a('[type="reset"]',c);f.click(function(){b.html(b.initContent);b.cmd.selection()});b.beforeRemove(function(){c.unbind();f.unbind()})}}});
+b.clickToolbar("source",function(){b.edit.designMode?(b.toolbar.disableAll(!0),b.edit.design(!1),b.toolbar.select("source")):(b.toolbar.disableAll(!1),b.edit.design(!0),b.toolbar.unselect("source"),b.cmd.selection());b.designMode=b.edit.designMode});b.afterCreate(function(){b.designMode||b.toolbar.disableAll(!0).select("source")});b.clickToolbar("fullscreen",function(){b.fullscreen()});if(b.fullscreenShortcut){var d=!1;b.afterCreate(function(){a(b.edit.doc,b.edit.textarea).keyup(function(a){a.which==
+27&&setTimeout(function(){b.fullscreen()},0)});if(d){if(l&&!b.designMode)return;b.focus()}d||(d=!0)})}m("undo,redo".split(","),function(a,d){c[d]&&b.afterCreate(function(){Ga(this.edit.doc,c[d],function(){b.clickToolbar(d)})});b.clickToolbar(d,function(){b[d]()})});b.clickToolbar("formatblock",function(){var a=b.lang("formatblock.formatBlock"),c={h1:28,h2:24,h3:18,H4:14,p:12},d=b.cmd.val("formatblock"),f=b.createMenu({name:"formatblock",width:b.langType=="en"?200:150});m(a,function(a,e){var j="font-size:"+
+c[a]+"px;";a.charAt(0)==="h"&&(j+="font-weight:bold;");f.addItem({title:'<span style="'+j+'" unselectable="on">'+e+"</span>",height:c[a]+12,checked:d===a||d===e,click:function(){b.select().exec("formatblock","<"+a+">").hideMenu()}})})});b.clickToolbar("fontname",function(){var a=b.cmd.val("fontname"),c=b.createMenu({name:"fontname",width:150});m(b.lang("fontname.fontName"),function(d,f){c.addItem({title:'<span style="font-family: '+d+';" unselectable="on">'+f+"</span>",checked:a===d.toLowerCase()||
+a===f.toLowerCase(),click:function(){b.exec("fontname",d).hideMenu()}})})});b.clickToolbar("fontsize",function(){var a=b.cmd.val("fontsize"),c=b.createMenu({name:"fontsize",width:150});m(b.fontSizeTable,function(d,f){c.addItem({title:'<span style="font-size:'+f+';" unselectable="on">'+f+"</span>",height:t(f)+12,checked:a===f,click:function(){b.exec("fontsize",f).hideMenu()}})})});m("forecolor,hilitecolor".split(","),function(a,c){b.clickToolbar(c,function(){b.createMenu({name:c,selectedColor:b.cmd.val(c)||
+"default",colors:b.colorTable,click:function(a){b.exec(c,a).hideMenu()}})})});m("cut,copy,paste".split(","),function(a,c){b.clickToolbar(c,function(){b.focus();try{b.exec(c,null)}catch(a){alert(b.lang(c+"Error"))}})});b.clickToolbar("about",function(){var a='<div style="margin:20px;"><div>KindEditor '+Da+'</div><div>Copyright &copy; <a href="http://www.kindsoft.net/" target="_blank">kindsoft.net</a> All rights reserved.</div></div>';b.createDialog({name:"about",width:350,title:b.lang("about"),body:a})});
+b.plugin.getSelectedLink=function(){return b.cmd.commonAncestor("a")};b.plugin.getSelectedImage=function(){return Ba(b.edit.cmd.range,function(a){return!/^ke-\w+$/i.test(a[0].className)})};b.plugin.getSelectedFlash=function(){return Ba(b.edit.cmd.range,function(a){return a[0].className=="ke-flash"})};b.plugin.getSelectedMedia=function(){return Ba(b.edit.cmd.range,function(a){return a[0].className=="ke-media"||a[0].className=="ke-rm"})};b.plugin.getSelectedAnchor=function(){return Ba(b.edit.cmd.range,
+function(a){return a[0].className=="ke-anchor"})};m("link,image,flash,media,anchor".split(","),function(a,c){var d=c.charAt(0).toUpperCase()+c.substr(1);m("edit,delete".split(","),function(a,e){b.addContextmenu({title:b.lang(e+d),click:function(){b.loadPlugin(c,function(){b.plugin[c][e]();b.hideMenu()})},cond:b.plugin["getSelected"+d],width:150,iconClass:e=="edit"?"ke-icon-"+c:o})});b.addContextmenu({title:"-"})});b.plugin.getSelectedTable=function(){return b.cmd.commonAncestor("table")};b.plugin.getSelectedRow=
+function(){return b.cmd.commonAncestor("tr")};b.plugin.getSelectedCell=function(){return b.cmd.commonAncestor("td")};m("prop,cellprop,colinsertleft,colinsertright,rowinsertabove,rowinsertbelow,rowmerge,colmerge,rowsplit,colsplit,coldelete,rowdelete,insert,delete".split(","),function(a,c){var d=N(c,["prop","delete"])<0?b.plugin.getSelectedCell:b.plugin.getSelectedTable;b.addContextmenu({title:b.lang("table"+c),click:function(){b.loadPlugin("table",function(){b.plugin.table[c]();b.hideMenu()})},cond:d,
+width:170,iconClass:"ke-icon-table"+c})});b.addContextmenu({title:"-"});m("selectall,justifyleft,justifycenter,justifyright,justifyfull,insertorderedlist,insertunorderedlist,indent,outdent,subscript,superscript,hr,print,bold,italic,underline,strikethrough,removeformat,unlink".split(","),function(a,d){c[d]&&b.afterCreate(function(){Ga(this.edit.doc,c[d],function(){b.cmd.selection();b.clickToolbar(d)})});b.clickToolbar(d,function(){b.focus().exec(d,null)})});b.afterCreate(function(){function c(){f.range.moveToBookmark(i);
+f.select();W&&(a("div."+n,j).each(function(){a(this).after("<br />").remove(!0)}),a("span.Apple-style-span",j).remove(!0),a("span.Apple-tab-span",j).remove(!0),a("span[style]",j).each(function(){a(this).css("white-space")=="nowrap"&&a(this).remove(!0)}),a("meta",j).remove());var d=j[0].innerHTML;j.remove();d!==""&&(W&&(d=d.replace(/(<br>)\1/ig,"$1")),b.pasteType===2&&(d=d.replace(/(<(?:p|p\s[^>]*)>) *(<\/p>)/ig,""),/schemas-microsoft-com|worddocument|mso-\w+/i.test(d)?d=lb(d,b.filterMode?b.htmlTags:
+a.options.htmlTags):(d=S(d,b.filterMode?b.htmlTags:null),d=b.beforeSetHtml(d))),b.pasteType===1&&(d=d.replace(/&nbsp;/ig," "),d=d.replace(/\n\s*\n/g,"\n"),d=d.replace(/<br[^>]*>/ig,"\n"),d=d.replace(/<\/p><p[^>]*>/ig,"\n"),d=d.replace(/<[^>]+>/g,""),d=d.replace(/ {2}/g," &nbsp;"),b.newlineTag=="p"?/\n/.test(d)&&(d=d.replace(/^/,"<p>").replace(/$/,"<br /></p>").replace(/\n/g,"<br /></p><p>")):d=d.replace(/\n/g,"<br />$&")),b.insertHtml(d,!0))}var d=b.edit.doc,f,i,j,n="__kindeditor_paste__",m=!1;a(d.body).bind("paste",
+function(o){if(b.pasteType===0)o.stop();else if(!m){m=!0;a("div."+n,d).remove();f=b.cmd.selection();i=f.range.createBookmark();j=a('<div class="'+n+'"></div>',d).css({position:"absolute",width:"1px",height:"1px",overflow:"hidden",left:"-1981px",top:a(i.start).pos().y+"px","white-space":"nowrap"});a(d.body).append(j);if(l){var q=f.range.get(!0);q.moveToElementText(j[0]);q.select();q.execCommand("paste");o.preventDefault()}else f.range.selectNodeContents(j[0]),f.select();setTimeout(function(){c();m=
+!1},0)}})});b.beforeGetHtml(function(a){l&&z<=8&&(a=a.replace(/<div\s+[^>]*data-ke-input-tag="([^"]*)"[^>]*>([\s\S]*?)<\/div>/ig,function(a,b){return unescape(b)}),a=a.replace(/(<input)((?:\s+[^>]*)?>)/ig,function(a,b,c){if(!/\s+type="[^"]+"/i.test(a))return b+' type="text"'+c;return a}));return a.replace(/(<(?:noscript|noscript\s[^>]*)>)([\s\S]*?)(<\/noscript>)/ig,function(a,b,c,d){return b+fa(c).replace(/\s+/g," ")+d}).replace(/<img[^>]*class="?ke-(flash|rm|media)"?[^>]*>/ig,function(a){var a=H(a),
+b=aa(a.style||""),c=nb(a["data-ke-tag"]);c.width=j(a.width,t(j(b.width,"")));c.height=j(a.height,t(j(b.height,"")));return Ia(c)}).replace(/<img[^>]*class="?ke-anchor"?[^>]*>/ig,function(a){a=H(a);return'<a name="'+unescape(a["data-ke-name"])+'"></a>'}).replace(/<div\s+[^>]*data-ke-script-attr="([^"]*)"[^>]*>([\s\S]*?)<\/div>/ig,function(a,b,c){return"<script"+unescape(b)+">"+unescape(c)+"<\/script>"}).replace(/<div\s+[^>]*data-ke-noscript-attr="([^"]*)"[^>]*>([\s\S]*?)<\/div>/ig,function(a,b,c){return"<noscript"+
+unescape(b)+">"+unescape(c)+"</noscript>"}).replace(/(<[^>]*)data-ke-src="([^"]*)"([^>]*>)/ig,function(a,b,c){a=a.replace(/(\s+(?:href|src)=")[^"]*(")/i,function(a,b,d){return b+fa(c)+d});return a=a.replace(/\s+data-ke-src="[^"]*"/i,"")}).replace(/(<[^>]+\s)data-ke-(on\w+="[^"]*"[^>]*>)/ig,function(a,b,c){return b+c})});b.beforeSetHtml(function(a){l&&z<=8&&(a=a.replace(/<input[^>]*>|<(select|button)[^>]*>[\s\S]*?<\/\1>/ig,function(a){var b=H(a);if(aa(b.style||"").display=="none")return'<div class="ke-display-none" data-ke-input-tag="'+
+escape(a)+'"></div>';return a}));return a.replace(/<embed[^>]*type="([^"]+)"[^>]*>(?:<\/embed>)?/ig,function(a){a=H(a);a.src=j(a.src,"");a.width=j(a.width,0);a.height=j(a.height,0);return ob(b.themesPath+"common/blank.gif",a)}).replace(/<a[^>]*name="([^"]+)"[^>]*>(?:<\/a>)?/ig,function(a){var c=H(a);if(c.href!==o)return a;return'<img class="ke-anchor" src="'+b.themesPath+'common/anchor.gif" data-ke-name="'+escape(c.name)+'" />'}).replace(/<script([^>]*)>([\s\S]*?)<\/script>/ig,function(a,b,c){return'<div class="ke-script" data-ke-script-attr="'+
+escape(b)+'">'+escape(c)+"</div>"}).replace(/<noscript([^>]*)>([\s\S]*?)<\/noscript>/ig,function(a,b,c){return'<div class="ke-noscript" data-ke-noscript-attr="'+escape(b)+'">'+escape(c)+"</div>"}).replace(/(<[^>]*)(href|src)="([^"]*)"([^>]*>)/ig,function(a,b,c,d,e){if(a.match(/\sdata-ke-src="[^"]*"/i))return a;return a=b+c+'="'+d+'" data-ke-src="'+C(d)+'"'+e}).replace(/(<[^>]+\s)(on\w+="[^"]*"[^>]*>)/ig,function(a,b,c){return b+"data-ke-"+c}).replace(/<table[^>]*\s+border="0"[^>]*>/ig,function(a){if(a.indexOf("ke-zeroborder")>=
+0)return a;return Qb(a,"ke-zeroborder")})})})}})(window);
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/kindeditor.js b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/kindeditor.js
new file mode 100644
index 0000000..53ee43f
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/kindeditor.js
@@ -0,0 +1,5889 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2013 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @website http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+* @version 4.1.7 (2013-04-21)
+*******************************************************************************/
+(function (window, undefined) {
+	if (window.KindEditor) {
+		return;
+	}
+if (!window.console) {
+	window.console = {};
+}
+if (!console.log) {
+	console.log = function () {};
+}
+var _VERSION = '4.1.7 (2013-04-21)',
+	_ua = navigator.userAgent.toLowerCase(),
+	_IE = _ua.indexOf('msie') > -1 && _ua.indexOf('opera') == -1,
+	_GECKO = _ua.indexOf('gecko') > -1 && _ua.indexOf('khtml') == -1,
+	_WEBKIT = _ua.indexOf('applewebkit') > -1,
+	_OPERA = _ua.indexOf('opera') > -1,
+	_MOBILE = _ua.indexOf('mobile') > -1,
+	_IOS = /ipad|iphone|ipod/.test(_ua),
+	_QUIRKS = document.compatMode != 'CSS1Compat',
+	_matches = /(?:msie|firefox|webkit|opera)[\/:\s](\d+)/.exec(_ua),
+	_V = _matches ? _matches[1] : '0',
+	_TIME = new Date().getTime();
+function _isArray(val) {
+	if (!val) {
+		return false;
+	}
+	return Object.prototype.toString.call(val) === '[object Array]';
+}
+function _isFunction(val) {
+	if (!val) {
+		return false;
+	}
+	return Object.prototype.toString.call(val) === '[object Function]';
+}
+function _inArray(val, arr) {
+	for (var i = 0, len = arr.length; i < len; i++) {
+		if (val === arr[i]) {
+			return i;
+		}
+	}
+	return -1;
+}
+function _each(obj, fn) {
+	if (_isArray(obj)) {
+		for (var i = 0, len = obj.length; i < len; i++) {
+			if (fn.call(obj[i], i, obj[i]) === false) {
+				break;
+			}
+		}
+	} else {
+		for (var key in obj) {
+			if (obj.hasOwnProperty(key)) {
+				if (fn.call(obj[key], key, obj[key]) === false) {
+					break;
+				}
+			}
+		}
+	}
+}
+function _trim(str) {
+	return str.replace(/(?:^[ \t\n\r]+)|(?:[ \t\n\r]+$)/g, '');
+}
+function _inString(val, str, delimiter) {
+	delimiter = delimiter === undefined ? ',' : delimiter;
+	return (delimiter + str + delimiter).indexOf(delimiter + val + delimiter) >= 0;
+}
+function _addUnit(val, unit) {
+	unit = unit || 'px';
+	return val && /^\d+$/.test(val) ? val + unit : val;
+}
+function _removeUnit(val) {
+	var match;
+	return val && (match = /(\d+)/.exec(val)) ? parseInt(match[1], 10) : 0;
+}
+function _escape(val) {
+	return val.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
+}
+function _unescape(val) {
+	return val.replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&quot;/g, '"').replace(/&amp;/g, '&');
+}
+function _toCamel(str) {
+	var arr = str.split('-');
+	str = '';
+	_each(arr, function(key, val) {
+		str += (key > 0) ? val.charAt(0).toUpperCase() + val.substr(1) : val;
+	});
+	return str;
+}
+function _toHex(val) {
+	function hex(d) {
+		var s = parseInt(d, 10).toString(16).toUpperCase();
+		return s.length > 1 ? s : '0' + s;
+	}
+	return val.replace(/rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/ig,
+		function($0, $1, $2, $3) {
+			return '#' + hex($1) + hex($2) + hex($3);
+		}
+	);
+}
+function _toMap(val, delimiter) {
+	delimiter = delimiter === undefined ? ',' : delimiter;
+	var map = {}, arr = _isArray(val) ? val : val.split(delimiter), match;
+	_each(arr, function(key, val) {
+		if ((match = /^(\d+)\.\.(\d+)$/.exec(val))) {
+			for (var i = parseInt(match[1], 10); i <= parseInt(match[2], 10); i++) {
+				map[i.toString()] = true;
+			}
+		} else {
+			map[val] = true;
+		}
+	});
+	return map;
+}
+function _toArray(obj, offset) {
+	return Array.prototype.slice.call(obj, offset || 0);
+}
+function _undef(val, defaultVal) {
+	return val === undefined ? defaultVal : val;
+}
+function _invalidUrl(url) {
+	return !url || /[<>"]/.test(url);
+}
+function _addParam(url, param) {
+	return url.indexOf('?') >= 0 ? url + '&' + param : url + '?' + param;
+}
+function _extend(child, parent, proto) {
+	if (!proto) {
+		proto = parent;
+		parent = null;
+	}
+	var childProto;
+	if (parent) {
+		var fn = function () {};
+		fn.prototype = parent.prototype;
+		childProto = new fn();
+		_each(proto, function(key, val) {
+			childProto[key] = val;
+		});
+	} else {
+		childProto = proto;
+	}
+	childProto.constructor = child;
+	child.prototype = childProto;
+	child.parent = parent ? parent.prototype : null;
+}
+function _json(text) {
+	var match;
+	if ((match = /\{[\s\S]*\}|\[[\s\S]*\]/.exec(text))) {
+		text = match[0];
+	}
+	var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
+	cx.lastIndex = 0;
+	if (cx.test(text)) {
+		text = text.replace(cx, function (a) {
+			return '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
+		});
+	}
+	if (/^[\],:{}\s]*$/.
+	test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').
+	replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
+	replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
+		return eval('(' + text + ')');
+	}
+	throw 'JSON parse error';
+}
+var _round = Math.round;
+var K = {
+	DEBUG : false,
+	VERSION : _VERSION,
+	IE : _IE,
+	GECKO : _GECKO,
+	WEBKIT : _WEBKIT,
+	OPERA : _OPERA,
+	V : _V,
+	TIME : _TIME,
+	each : _each,
+	isArray : _isArray,
+	isFunction : _isFunction,
+	inArray : _inArray,
+	inString : _inString,
+	trim : _trim,
+	addUnit : _addUnit,
+	removeUnit : _removeUnit,
+	escape : _escape,
+	unescape : _unescape,
+	toCamel : _toCamel,
+	toHex : _toHex,
+	toMap : _toMap,
+	toArray : _toArray,
+	undef : _undef,
+	invalidUrl : _invalidUrl,
+	addParam : _addParam,
+	extend : _extend,
+	json : _json
+};
+var _INLINE_TAG_MAP = _toMap('a,abbr,acronym,b,basefont,bdo,big,br,button,cite,code,del,dfn,em,font,i,img,input,ins,kbd,label,map,q,s,samp,select,small,span,strike,strong,sub,sup,textarea,tt,u,var'),
+	_BLOCK_TAG_MAP = _toMap('address,applet,blockquote,body,center,dd,dir,div,dl,dt,fieldset,form,frameset,h1,h2,h3,h4,h5,h6,head,hr,html,iframe,ins,isindex,li,map,menu,meta,noframes,noscript,object,ol,p,pre,script,style,table,tbody,td,tfoot,th,thead,title,tr,ul'),
+	_SINGLE_TAG_MAP = _toMap('area,index,basefont,br,col,frame,hr,img,input,isindex,link,meta,param,embed'),
+	_STYLE_TAG_MAP = _toMap('b,basefont,big,del,em,font,i,s,small,span,strike,strong,sub,sup,u'),
+	_CONTROL_TAG_MAP = _toMap('img,table,input,textarea,button'),
+	_PRE_TAG_MAP = _toMap('pre,style,script'),
+	_NOSPLIT_TAG_MAP = _toMap('html,head,body,td,tr,table,ol,ul,li'),
+	_AUTOCLOSE_TAG_MAP = _toMap('colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr'),
+	_FILL_ATTR_MAP = _toMap('checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected'),
+	_VALUE_TAG_MAP = _toMap('input,button,textarea,select');
+function _getBasePath() {
+	var els = document.getElementsByTagName('script'), src;
+	for (var i = 0, len = els.length; i < len; i++) {
+		src = els[i].src || '';
+		if (/kindeditor[\w\-\.]*\.js/.test(src)) {
+			return src.substring(0, src.lastIndexOf('/') + 1);
+		}
+	}
+	return '';
+}
+K.basePath = _getBasePath();
+K.options = {
+	designMode : true,
+	fullscreenMode : false,
+	filterMode : true,
+	wellFormatMode : true,
+	shadowMode : true,
+	loadStyleMode : true,
+	basePath : K.basePath,
+	themesPath : K.basePath + 'themes/',
+	langPath : K.basePath + 'lang/',
+	pluginsPath : K.basePath + 'plugins/',
+	themeType : 'default',
+	langType : 'zh_CN',
+	urlType : '',
+	newlineTag : 'p',
+	resizeType : 2,
+	syncType : 'form',
+	pasteType : 2,
+	dialogAlignType : 'page',
+	useContextmenu : true,
+	fullscreenShortcut : false,
+	bodyClass : 'ke-content',
+	indentChar : '\t',
+	cssPath : '',
+	cssData : '',
+	minWidth : 650,
+	minHeight : 100,
+	minChangeSize : 50,
+	zIndex : 811213,
+	items : [
+		'source', '|', 'undo', 'redo', '|', 'preview', 'print', 'template', 'code', 'cut', 'copy', 'paste',
+		'plainpaste', 'wordpaste', '|', 'justifyleft', 'justifycenter', 'justifyright',
+		'justifyfull', 'insertorderedlist', 'insertunorderedlist', 'indent', 'outdent', 'subscript',
+		'superscript', 'clearhtml', 'quickformat', 'selectall', '|', 'fullscreen', '/',
+		'formatblock', 'fontname', 'fontsize', '|', 'forecolor', 'hilitecolor', 'bold',
+		'italic', 'underline', 'strikethrough', 'lineheight', 'removeformat', '|', 'image', 'multiimage',
+		'flash', 'media', 'insertfile', 'table', 'hr', 'emoticons', 'baidumap', 'pagebreak',
+		'anchor', 'link', 'unlink', '|', 'about'
+	],
+	noDisableItems : ['source', 'fullscreen'],
+	colorTable : [
+		['#E53333', '#E56600', '#FF9900', '#64451D', '#DFC5A4', '#FFE500'],
+		['#009900', '#006600', '#99BB00', '#B8D100', '#60D978', '#00D5FF'],
+		['#337FE5', '#003399', '#4C33E5', '#9933E5', '#CC33E5', '#EE33EE'],
+		['#FFFFFF', '#CCCCCC', '#999999', '#666666', '#333333', '#000000']
+	],
+	fontSizeTable : ['9px', '10px', '12px', '14px', '16px', '18px', '24px', '32px'],
+	htmlTags : {
+		font : ['id', 'class', 'color', 'size', 'face', '.background-color'],
+		span : [
+			'id', 'class', '.color', '.background-color', '.font-size', '.font-family', '.background',
+			'.font-weight', '.font-style', '.text-decoration', '.vertical-align', '.line-height'
+		],
+		div : [
+			'id', 'class', 'align', '.border', '.margin', '.padding', '.text-align', '.color',
+			'.background-color', '.font-size', '.font-family', '.font-weight', '.background',
+			'.font-style', '.text-decoration', '.vertical-align', '.margin-left'
+		],
+		table: [
+			'id', 'class', 'border', 'cellspacing', 'cellpadding', 'width', 'height', 'align', 'bordercolor',
+			'.padding', '.margin', '.border', 'bgcolor', '.text-align', '.color', '.background-color',
+			'.font-size', '.font-family', '.font-weight', '.font-style', '.text-decoration', '.background',
+			'.width', '.height', '.border-collapse'
+		],
+		'td,th': [
+			'id', 'class', 'align', 'valign', 'width', 'height', 'colspan', 'rowspan', 'bgcolor',
+			'.text-align', '.color', '.background-color', '.font-size', '.font-family', '.font-weight',
+			'.font-style', '.text-decoration', '.vertical-align', '.background', '.border'
+		],
+		a : ['id', 'class', 'href', 'target', 'name'],
+		embed : ['id', 'class', 'src', 'width', 'height', 'type', 'loop', 'autostart', 'quality', '.width', '.height', 'align', 'allowscriptaccess'],
+		img : ['id', 'class', 'src', 'width', 'height', 'border', 'alt', 'title', 'align', '.width', '.height', '.border'],
+		'p,ol,ul,li,blockquote,h1,h2,h3,h4,h5,h6' : [
+			'id', 'class', 'align', '.text-align', '.color', '.background-color', '.font-size', '.font-family', '.background',
+			'.font-weight', '.font-style', '.text-decoration', '.vertical-align', '.text-indent', '.margin-left'
+		],
+		pre : ['id', 'class'],
+		hr : ['id', 'class', '.page-break-after'],
+		'br,tbody,tr,strong,b,sub,sup,em,i,u,strike,s,del' : ['id', 'class'],
+		iframe : ['id', 'class', 'src', 'frameborder', 'width', 'height', '.width', '.height']
+	},
+	layout : '<div class="container"><div class="toolbar"></div><div class="edit"></div><div class="statusbar"></div></div>'
+};
+var _useCapture = false;
+var _INPUT_KEY_MAP = _toMap('8,9,13,32,46,48..57,59,61,65..90,106,109..111,188,190..192,219..222');
+var _CURSORMOVE_KEY_MAP = _toMap('33..40');
+var _CHANGE_KEY_MAP = {};
+_each(_INPUT_KEY_MAP, function(key, val) {
+	_CHANGE_KEY_MAP[key] = val;
+});
+_each(_CURSORMOVE_KEY_MAP, function(key, val) {
+	_CHANGE_KEY_MAP[key] = val;
+});
+function _bindEvent(el, type, fn) {
+	if (el.addEventListener){
+		el.addEventListener(type, fn, _useCapture);
+	} else if (el.attachEvent){
+		el.attachEvent('on' + type, fn);
+	}
+}
+function _unbindEvent(el, type, fn) {
+	if (el.removeEventListener){
+		el.removeEventListener(type, fn, _useCapture);
+	} else if (el.detachEvent){
+		el.detachEvent('on' + type, fn);
+	}
+}
+var _EVENT_PROPS = ('altKey,attrChange,attrName,bubbles,button,cancelable,charCode,clientX,clientY,ctrlKey,currentTarget,' +
+	'data,detail,eventPhase,fromElement,handler,keyCode,metaKey,newValue,offsetX,offsetY,originalTarget,pageX,' +
+	'pageY,prevValue,relatedNode,relatedTarget,screenX,screenY,shiftKey,srcElement,target,toElement,view,wheelDelta,which').split(',');
+function KEvent(el, event) {
+	this.init(el, event);
+}
+_extend(KEvent, {
+	init : function(el, event) {
+		var self = this, doc = el.ownerDocument || el.document || el;
+		self.event = event;
+		_each(_EVENT_PROPS, function(key, val) {
+			self[val] = event[val];
+		});
+		if (!self.target) {
+			self.target = self.srcElement || doc;
+		}
+		if (self.target.nodeType === 3) {
+			self.target = self.target.parentNode;
+		}
+		if (!self.relatedTarget && self.fromElement) {
+			self.relatedTarget = self.fromElement === self.target ? self.toElement : self.fromElement;
+		}
+		if (self.pageX == null && self.clientX != null) {
+			var d = doc.documentElement, body = doc.body;
+			self.pageX = self.clientX + (d && d.scrollLeft || body && body.scrollLeft || 0) - (d && d.clientLeft || body && body.clientLeft || 0);
+			self.pageY = self.clientY + (d && d.scrollTop  || body && body.scrollTop  || 0) - (d && d.clientTop  || body && body.clientTop  || 0);
+		}
+		if (!self.which && ((self.charCode || self.charCode === 0) ? self.charCode : self.keyCode)) {
+			self.which = self.charCode || self.keyCode;
+		}
+		if (!self.metaKey && self.ctrlKey) {
+			self.metaKey = self.ctrlKey;
+		}
+		if (!self.which && self.button !== undefined) {
+			self.which = (self.button & 1 ? 1 : (self.button & 2 ? 3 : (self.button & 4 ? 2 : 0)));
+		}
+		switch (self.which) {
+		case 186 :
+			self.which = 59;
+			break;
+		case 187 :
+		case 107 :
+		case 43 :
+			self.which = 61;
+			break;
+		case 189 :
+		case 45 :
+			self.which = 109;
+			break;
+		case 42 :
+			self.which = 106;
+			break;
+		case 47 :
+			self.which = 111;
+			break;
+		case 78 :
+			self.which = 110;
+			break;
+		}
+		if (self.which >= 96 && self.which <= 105) {
+			self.which -= 48;
+		}
+	},
+	preventDefault : function() {
+		var ev = this.event;
+		if (ev.preventDefault) {
+			ev.preventDefault();
+		}
+		ev.returnValue = false;
+	},
+	stopPropagation : function() {
+		var ev = this.event;
+		if (ev.stopPropagation) {
+			ev.stopPropagation();
+		}
+		ev.cancelBubble = true;
+	},
+	stop : function() {
+		this.preventDefault();
+		this.stopPropagation();
+	}
+});
+var _eventExpendo = 'kindeditor_' + _TIME, _eventId = 0, _eventData = {};
+function _getId(el) {
+	return el[_eventExpendo] || null;
+}
+function _setId(el) {
+	el[_eventExpendo] = ++_eventId;
+	return _eventId;
+}
+function _removeId(el) {
+	try {
+		delete el[_eventExpendo];
+	} catch(e) {
+		if (el.removeAttribute) {
+			el.removeAttribute(_eventExpendo);
+		}
+	}
+}
+function _bind(el, type, fn) {
+	if (type.indexOf(',') >= 0) {
+		_each(type.split(','), function() {
+			_bind(el, this, fn);
+		});
+		return;
+	}
+	var id = _getId(el);
+	if (!id) {
+		id = _setId(el);
+	}
+	if (_eventData[id] === undefined) {
+		_eventData[id] = {};
+	}
+	var events = _eventData[id][type];
+	if (events && events.length > 0) {
+		_unbindEvent(el, type, events[0]);
+	} else {
+		_eventData[id][type] = [];
+		_eventData[id].el = el;
+	}
+	events = _eventData[id][type];
+	if (events.length === 0) {
+		events[0] = function(e) {
+			var kevent = e ? new KEvent(el, e) : undefined;
+			_each(events, function(i, event) {
+				if (i > 0 && event) {
+					event.call(el, kevent);
+				}
+			});
+		};
+	}
+	if (_inArray(fn, events) < 0) {
+		events.push(fn);
+	}
+	_bindEvent(el, type, events[0]);
+}
+function _unbind(el, type, fn) {
+	if (type && type.indexOf(',') >= 0) {
+		_each(type.split(','), function() {
+			_unbind(el, this, fn);
+		});
+		return;
+	}
+	var id = _getId(el);
+	if (!id) {
+		return;
+	}
+	if (type === undefined) {
+		if (id in _eventData) {
+			_each(_eventData[id], function(key, events) {
+				if (key != 'el' && events.length > 0) {
+					_unbindEvent(el, key, events[0]);
+				}
+			});
+			delete _eventData[id];
+			_removeId(el);
+		}
+		return;
+	}
+	if (!_eventData[id]) {
+		return;
+	}
+	var events = _eventData[id][type];
+	if (events && events.length > 0) {
+		if (fn === undefined) {
+			_unbindEvent(el, type, events[0]);
+			delete _eventData[id][type];
+		} else {
+			_each(events, function(i, event) {
+				if (i > 0 && event === fn) {
+					events.splice(i, 1);
+				}
+			});
+			if (events.length == 1) {
+				_unbindEvent(el, type, events[0]);
+				delete _eventData[id][type];
+			}
+		}
+		var count = 0;
+		_each(_eventData[id], function() {
+			count++;
+		});
+		if (count < 2) {
+			delete _eventData[id];
+			_removeId(el);
+		}
+	}
+}
+function _fire(el, type) {
+	if (type.indexOf(',') >= 0) {
+		_each(type.split(','), function() {
+			_fire(el, this);
+		});
+		return;
+	}
+	var id = _getId(el);
+	if (!id) {
+		return;
+	}
+	var events = _eventData[id][type];
+	if (_eventData[id] && events && events.length > 0) {
+		events[0]();
+	}
+}
+function _ctrl(el, key, fn) {
+	var self = this;
+	key = /^\d{2,}$/.test(key) ? key : key.toUpperCase().charCodeAt(0);
+	_bind(el, 'keydown', function(e) {
+		if (e.ctrlKey && e.which == key && !e.shiftKey && !e.altKey) {
+			fn.call(el);
+			e.stop();
+		}
+	});
+}
+function _ready(fn) {
+	var loaded = false;
+	function readyFunc() {
+		if (!loaded) {
+			loaded = true;
+			fn(KindEditor);
+		}
+	}
+	function ieReadyFunc() {
+		if (!loaded) {
+			try {
+				document.documentElement.doScroll('left');
+			} catch(e) {
+				setTimeout(ieReadyFunc, 100);
+				return;
+			}
+			readyFunc();
+		}
+	}
+	function ieReadyStateFunc() {
+		if (document.readyState === 'complete') {
+			readyFunc();
+		}
+	}
+	if (document.addEventListener) {
+		_bind(document, 'DOMContentLoaded', readyFunc);
+	} else if (document.attachEvent) {
+		_bind(document, 'readystatechange', ieReadyStateFunc);
+		var toplevel = false;
+		try {
+			toplevel = window.frameElement == null;
+		} catch(e) {}
+		if (document.documentElement.doScroll && toplevel) {
+			ieReadyFunc();
+		}
+	}
+	_bind(window, 'load', readyFunc);
+}
+if (_IE) {
+	window.attachEvent('onunload', function() {
+		_each(_eventData, function(key, events) {
+			if (events.el) {
+				_unbind(events.el);
+			}
+		});
+	});
+}
+K.ctrl = _ctrl;
+K.ready = _ready;
+function _getCssList(css) {
+	var list = {},
+		reg = /\s*([\w\-]+)\s*:([^;]*)(;|$)/g,
+		match;
+	while ((match = reg.exec(css))) {
+		var key = _trim(match[1].toLowerCase()),
+			val = _trim(_toHex(match[2]));
+		list[key] = val;
+	}
+	return list;
+}
+function _getAttrList(tag) {
+	var list = {},
+		reg = /\s+(?:([\w\-:]+)|(?:([\w\-:]+)=([^\s"'<>]+))|(?:([\w\-:"]+)="([^"]*)")|(?:([\w\-:"]+)='([^']*)'))(?=(?:\s|\/|>)+)/g,
+		match;
+	while ((match = reg.exec(tag))) {
+		var key = (match[1] || match[2] || match[4] || match[6]).toLowerCase(),
+			val = (match[2] ? match[3] : (match[4] ? match[5] : match[7])) || '';
+		list[key] = val;
+	}
+	return list;
+}
+function _addClassToTag(tag, className) {
+	if (/\s+class\s*=/.test(tag)) {
+		tag = tag.replace(/(\s+class=["']?)([^"']*)(["']?[\s>])/, function($0, $1, $2, $3) {
+			if ((' ' + $2 + ' ').indexOf(' ' + className + ' ') < 0) {
+				return $2 === '' ? $1 + className + $3 : $1 + $2 + ' ' + className + $3;
+			} else {
+				return $0;
+			}
+		});
+	} else {
+		tag = tag.substr(0, tag.length - 1) + ' class="' + className + '">';
+	}
+	return tag;
+}
+function _formatCss(css) {
+	var str = '';
+	_each(_getCssList(css), function(key, val) {
+		str += key + ':' + val + ';';
+	});
+	return str;
+}
+function _formatUrl(url, mode, host, pathname) {
+	mode = _undef(mode, '').toLowerCase();
+	if (url.substr(0, 5) != 'data:') {
+		url = url.replace(/([^:])\/\//g, '$1/');
+	}
+	if (_inArray(mode, ['absolute', 'relative', 'domain']) < 0) {
+		return url;
+	}
+	host = host || location.protocol + '//' + location.host;
+	if (pathname === undefined) {
+		var m = location.pathname.match(/^(\/.*)\//);
+		pathname = m ? m[1] : '';
+	}
+	var match;
+	if ((match = /^(\w+:\/\/[^\/]*)/.exec(url))) {
+		if (match[1] !== host) {
+			return url;
+		}
+	} else if (/^\w+:/.test(url)) {
+		return url;
+	}
+	function getRealPath(path) {
+		var parts = path.split('/'), paths = [];
+		for (var i = 0, len = parts.length; i < len; i++) {
+			var part = parts[i];
+			if (part == '..') {
+				if (paths.length > 0) {
+					paths.pop();
+				}
+			} else if (part !== '' && part != '.') {
+				paths.push(part);
+			}
+		}
+		return '/' + paths.join('/');
+	}
+	if (/^\//.test(url)) {
+		url = host + getRealPath(url.substr(1));
+	} else if (!/^\w+:\/\//.test(url)) {
+		url = host + getRealPath(pathname + '/' + url);
+	}
+	function getRelativePath(path, depth) {
+		if (url.substr(0, path.length) === path) {
+			var arr = [];
+			for (var i = 0; i < depth; i++) {
+				arr.push('..');
+			}
+			var prefix = '.';
+			if (arr.length > 0) {
+				prefix += '/' + arr.join('/');
+			}
+			if (pathname == '/') {
+				prefix += '/';
+			}
+			return prefix + url.substr(path.length);
+		} else {
+			if ((match = /^(.*)\//.exec(path))) {
+				return getRelativePath(match[1], ++depth);
+			}
+		}
+	}
+	if (mode === 'relative') {
+		url = getRelativePath(host + pathname, 0).substr(2);
+	} else if (mode === 'absolute') {
+		if (url.substr(0, host.length) === host) {
+			url = url.substr(host.length);
+		}
+	}
+	return url;
+}
+function _formatHtml(html, htmlTags, urlType, wellFormatted, indentChar) {
+	urlType = urlType || '';
+	wellFormatted = _undef(wellFormatted, false);
+	indentChar = _undef(indentChar, '\t');
+	var fontSizeList = 'xx-small,x-small,small,medium,large,x-large,xx-large'.split(',');
+	html = html.replace(/(<(?:pre|pre\s[^>]*)>)([\s\S]*?)(<\/pre>)/ig, function($0, $1, $2, $3) {
+		return $1 + $2.replace(/<(?:br|br\s[^>]*)>/ig, '\n') + $3;
+	});
+	html = html.replace(/<(?:br|br\s[^>]*)\s*\/?>\s*<\/p>/ig, '</p>');
+	html = html.replace(/(<(?:p|p\s[^>]*)>)\s*(<\/p>)/ig, '$1<br />$2');
+	html = html.replace(/\u200B/g, '');
+	html = html.replace(/\u00A9/g, '&copy;');
+	var htmlTagMap = {};
+	if (htmlTags) {
+		_each(htmlTags, function(key, val) {
+			var arr = key.split(',');
+			for (var i = 0, len = arr.length; i < len; i++) {
+				htmlTagMap[arr[i]] = _toMap(val);
+			}
+		});
+		if (!htmlTagMap.script) {
+			html = html.replace(/(<(?:script|script\s[^>]*)>)([\s\S]*?)(<\/script>)/ig, '');
+		}
+		if (!htmlTagMap.style) {
+			html = html.replace(/(<(?:style|style\s[^>]*)>)([\s\S]*?)(<\/style>)/ig, '');
+		}
+	}
+	var re = /([ \t\n\r]*)<(\/)?([\w\-:]+)((?:\s+|(?:\s+[\w\-:]+)|(?:\s+[\w\-:]+=[^\s"'<>]+)|(?:\s+[\w\-:"]+="[^"]*")|(?:\s+[\w\-:"]+='[^']*'))*)(\/)?>([ \t\n\r]*)/g;
+	var tagStack = [];
+	html = html.replace(re, function($0, $1, $2, $3, $4, $5, $6) {
+		var full = $0,
+			startNewline = $1 || '',
+			startSlash = $2 || '',
+			tagName = $3.toLowerCase(),
+			attr = $4 || '',
+			endSlash = $5 ? ' ' + $5 : '',
+			endNewline = $6 || '';
+		if (htmlTags && !htmlTagMap[tagName]) {
+			return '';
+		}
+		if (endSlash === '' && _SINGLE_TAG_MAP[tagName]) {
+			endSlash = ' /';
+		}
+		if (_INLINE_TAG_MAP[tagName]) {
+			if (startNewline) {
+				startNewline = ' ';
+			}
+			if (endNewline) {
+				endNewline = ' ';
+			}
+		}
+		if (_PRE_TAG_MAP[tagName]) {
+			if (startSlash) {
+				endNewline = '\n';
+			} else {
+				startNewline = '\n';
+			}
+		}
+		if (wellFormatted && tagName == 'br') {
+			endNewline = '\n';
+		}
+		if (_BLOCK_TAG_MAP[tagName] && !_PRE_TAG_MAP[tagName]) {
+			if (wellFormatted) {
+				if (startSlash && tagStack.length > 0 && tagStack[tagStack.length - 1] === tagName) {
+					tagStack.pop();
+				} else {
+					tagStack.push(tagName);
+				}
+				startNewline = '\n';
+				endNewline = '\n';
+				for (var i = 0, len = startSlash ? tagStack.length : tagStack.length - 1; i < len; i++) {
+					startNewline += indentChar;
+					if (!startSlash) {
+						endNewline += indentChar;
+					}
+				}
+				if (endSlash) {
+					tagStack.pop();
+				} else if (!startSlash) {
+					endNewline += indentChar;
+				}
+			} else {
+				startNewline = endNewline = '';
+			}
+		}
+		if (attr !== '') {
+			var attrMap = _getAttrList(full);
+			if (tagName === 'font') {
+				var fontStyleMap = {}, fontStyle = '';
+				_each(attrMap, function(key, val) {
+					if (key === 'color') {
+						fontStyleMap.color = val;
+						delete attrMap[key];
+					}
+					if (key === 'size') {
+						fontStyleMap['font-size'] = fontSizeList[parseInt(val, 10) - 1] || '';
+						delete attrMap[key];
+					}
+					if (key === 'face') {
+						fontStyleMap['font-family'] = val;
+						delete attrMap[key];
+					}
+					if (key === 'style') {
+						fontStyle = val;
+					}
+				});
+				if (fontStyle && !/;$/.test(fontStyle)) {
+					fontStyle += ';';
+				}
+				_each(fontStyleMap, function(key, val) {
+					if (val === '') {
+						return;
+					}
+					if (/\s/.test(val)) {
+						val = "'" + val + "'";
+					}
+					fontStyle += key + ':' + val + ';';
+				});
+				attrMap.style = fontStyle;
+			}
+			_each(attrMap, function(key, val) {
+				if (_FILL_ATTR_MAP[key]) {
+					attrMap[key] = key;
+				}
+				if (_inArray(key, ['src', 'href']) >= 0) {
+					attrMap[key] = _formatUrl(val, urlType);
+				}
+				if (htmlTags && key !== 'style' && !htmlTagMap[tagName]['*'] && !htmlTagMap[tagName][key] ||
+					tagName === 'body' && key === 'contenteditable' ||
+					/^kindeditor_\d+$/.test(key)) {
+					delete attrMap[key];
+				}
+				if (key === 'style' && val !== '') {
+					var styleMap = _getCssList(val);
+					_each(styleMap, function(k, v) {
+						if (htmlTags && !htmlTagMap[tagName].style && !htmlTagMap[tagName]['.' + k]) {
+							delete styleMap[k];
+						}
+					});
+					var style = '';
+					_each(styleMap, function(k, v) {
+						style += k + ':' + v + ';';
+					});
+					attrMap.style = style;
+				}
+			});
+			attr = '';
+			_each(attrMap, function(key, val) {
+				if (key === 'style' && val === '') {
+					return;
+				}
+				val = val.replace(/"/g, '&quot;');
+				attr += ' ' + key + '="' + val + '"';
+			});
+		}
+		if (tagName === 'font') {
+			tagName = 'span';
+		}
+		return startNewline + '<' + startSlash + tagName + attr + endSlash + '>' + endNewline;
+	});
+	html = html.replace(/(<(?:pre|pre\s[^>]*)>)([\s\S]*?)(<\/pre>)/ig, function($0, $1, $2, $3) {
+		return $1 + $2.replace(/\n/g, '<span id="__kindeditor_pre_newline__">\n') + $3;
+	});
+	html = html.replace(/\n\s*\n/g, '\n');
+	html = html.replace(/<span id="__kindeditor_pre_newline__">\n/g, '\n');
+	return _trim(html);
+}
+function _clearMsWord(html, htmlTags) {
+	html = html.replace(/<meta[\s\S]*?>/ig, '')
+		.replace(/<![\s\S]*?>/ig, '')
+		.replace(/<style[^>]*>[\s\S]*?<\/style>/ig, '')
+		.replace(/<script[^>]*>[\s\S]*?<\/script>/ig, '')
+		.replace(/<w:[^>]+>[\s\S]*?<\/w:[^>]+>/ig, '')
+		.replace(/<o:[^>]+>[\s\S]*?<\/o:[^>]+>/ig, '')
+		.replace(/<xml>[\s\S]*?<\/xml>/ig, '')
+		.replace(/<(?:table|td)[^>]*>/ig, function(full) {
+			return full.replace(/border-bottom:([#\w\s]+)/ig, 'border:$1');
+		});
+	return _formatHtml(html, htmlTags);
+}
+function _mediaType(src) {
+	if (/\.(rm|rmvb)(\?|$)/i.test(src)) {
+		return 'audio/x-pn-realaudio-plugin';
+	}
+	if (/\.(swf|flv)(\?|$)/i.test(src)) {
+		return 'application/x-shockwave-flash';
+	}
+	return 'video/x-ms-asf-plugin';
+}
+function _mediaClass(type) {
+	if (/realaudio/i.test(type)) {
+		return 'ke-rm';
+	}
+	if (/flash/i.test(type)) {
+		return 'ke-flash';
+	}
+	return 'ke-media';
+}
+function _mediaAttrs(srcTag) {
+	return _getAttrList(unescape(srcTag));
+}
+function _mediaEmbed(attrs) {
+	var html = '<embed ';
+	_each(attrs, function(key, val) {
+		html += key + '="' + val + '" ';
+	});
+	html += '/>';
+	return html;
+}
+function _mediaImg(blankPath, attrs) {
+	var width = attrs.width,
+		height = attrs.height,
+		type = attrs.type || _mediaType(attrs.src),
+		srcTag = _mediaEmbed(attrs),
+		style = '';
+	if (width > 0) {
+		style += 'width:' + width + 'px;';
+	}
+	if (height > 0) {
+		style += 'height:' + height + 'px;';
+	}
+	var html = '<img class="' + _mediaClass(type) + '" src="' + blankPath + '" ';
+	if (style !== '') {
+		html += 'style="' + style + '" ';
+	}
+	html += 'data-ke-tag="' + escape(srcTag) + '" alt="" />';
+	return html;
+}
+function _tmpl(str, data) {
+	var fn = new Function("obj",
+		"var p=[],print=function(){p.push.apply(p,arguments);};" +
+		"with(obj){p.push('" +
+		str.replace(/[\r\t\n]/g, " ")
+			.split("<%").join("\t")
+			.replace(/((^|%>)[^\t]*)'/g, "$1\r")
+			.replace(/\t=(.*?)%>/g, "',$1,'")
+			.split("\t").join("');")
+			.split("%>").join("p.push('")
+			.split("\r").join("\\'") + "');}return p.join('');");
+	return data ? fn(data) : fn;
+}
+K.formatUrl = _formatUrl;
+K.formatHtml = _formatHtml;
+K.getCssList = _getCssList;
+K.getAttrList = _getAttrList;
+K.mediaType = _mediaType;
+K.mediaAttrs = _mediaAttrs;
+K.mediaEmbed = _mediaEmbed;
+K.mediaImg = _mediaImg;
+K.clearMsWord = _clearMsWord;
+K.tmpl = _tmpl;
+function _contains(nodeA, nodeB) {
+	if (nodeA.nodeType == 9 && nodeB.nodeType != 9) {
+		return true;
+	}
+	while ((nodeB = nodeB.parentNode)) {
+		if (nodeB == nodeA) {
+			return true;
+		}
+	}
+	return false;
+}
+var _getSetAttrDiv = document.createElement('div');
+_getSetAttrDiv.setAttribute('className', 't');
+var _GET_SET_ATTRIBUTE = _getSetAttrDiv.className !== 't';
+function _getAttr(el, key) {
+	key = key.toLowerCase();
+	var val = null;
+	if (!_GET_SET_ATTRIBUTE && el.nodeName.toLowerCase() != 'script') {
+		var div = el.ownerDocument.createElement('div');
+		div.appendChild(el.cloneNode(false));
+		var list = _getAttrList(_unescape(div.innerHTML));
+		if (key in list) {
+			val = list[key];
+		}
+	} else {
+		try {
+			val = el.getAttribute(key, 2);
+		} catch(e) {
+			val = el.getAttribute(key, 1);
+		}
+	}
+	if (key === 'style' && val !== null) {
+		val = _formatCss(val);
+	}
+	return val;
+}
+function _queryAll(expr, root) {
+	var exprList = expr.split(',');
+	if (exprList.length > 1) {
+		var mergedResults = [];
+		_each(exprList, function() {
+			_each(_queryAll(this, root), function() {
+				if (_inArray(this, mergedResults) < 0) {
+					mergedResults.push(this);
+				}
+			});
+		});
+		return mergedResults;
+	}
+	root = root || document;
+	function escape(str) {
+		if (typeof str != 'string') {
+			return str;
+		}
+		return str.replace(/([^\w\-])/g, '\\$1');
+	}
+	function stripslashes(str) {
+		return str.replace(/\\/g, '');
+	}
+	function cmpTag(tagA, tagB) {
+		return tagA === '*' || tagA.toLowerCase() === escape(tagB.toLowerCase());
+	}
+	function byId(id, tag, root) {
+		var arr = [],
+			doc = root.ownerDocument || root,
+			el = doc.getElementById(stripslashes(id));
+		if (el) {
+			if (cmpTag(tag, el.nodeName) && _contains(root, el)) {
+				arr.push(el);
+			}
+		}
+		return arr;
+	}
+	function byClass(className, tag, root) {
+		var doc = root.ownerDocument || root, arr = [], els, i, len, el;
+		if (root.getElementsByClassName) {
+			els = root.getElementsByClassName(stripslashes(className));
+			for (i = 0, len = els.length; i < len; i++) {
+				el = els[i];
+				if (cmpTag(tag, el.nodeName)) {
+					arr.push(el);
+				}
+			}
+		} else if (doc.querySelectorAll) {
+			els = doc.querySelectorAll((root.nodeName !== '#document' ? root.nodeName + ' ' : '') + tag + '.' + className);
+			for (i = 0, len = els.length; i < len; i++) {
+				el = els[i];
+				if (_contains(root, el)) {
+					arr.push(el);
+				}
+			}
+		} else {
+			els = root.getElementsByTagName(tag);
+			className = ' ' + className + ' ';
+			for (i = 0, len = els.length; i < len; i++) {
+				el = els[i];
+				if (el.nodeType == 1) {
+					var cls = el.className;
+					if (cls && (' ' + cls + ' ').indexOf(className) > -1) {
+						arr.push(el);
+					}
+				}
+			}
+		}
+		return arr;
+	}
+	function byName(name, tag, root) {
+		var arr = [], doc = root.ownerDocument || root,
+			els = doc.getElementsByName(stripslashes(name)), el;
+		for (var i = 0, len = els.length; i < len; i++) {
+			el = els[i];
+			if (cmpTag(tag, el.nodeName) && _contains(root, el)) {
+				if (el.getAttributeNode('name')) {
+					arr.push(el);
+				}
+			}
+		}
+		return arr;
+	}
+	function byAttr(key, val, tag, root) {
+		var arr = [], els = root.getElementsByTagName(tag), el;
+		for (var i = 0, len = els.length; i < len; i++) {
+			el = els[i];
+			if (el.nodeType == 1) {
+				if (val === null) {
+					if (_getAttr(el, key) !== null) {
+						arr.push(el);
+					}
+				} else {
+					if (val === escape(_getAttr(el, key))) {
+						arr.push(el);
+					}
+				}
+			}
+		}
+		return arr;
+	}
+	function select(expr, root) {
+		var arr = [], matches;
+		matches = /^((?:\\.|[^.#\s\[<>])+)/.exec(expr);
+		var tag = matches ? matches[1] : '*';
+		if ((matches = /#((?:[\w\-]|\\.)+)$/.exec(expr))) {
+			arr = byId(matches[1], tag, root);
+		} else if ((matches = /\.((?:[\w\-]|\\.)+)$/.exec(expr))) {
+			arr = byClass(matches[1], tag, root);
+		} else if ((matches = /\[((?:[\w\-]|\\.)+)\]/.exec(expr))) {
+			arr = byAttr(matches[1].toLowerCase(), null, tag, root);
+		} else if ((matches = /\[((?:[\w\-]|\\.)+)\s*=\s*['"]?((?:\\.|[^'"]+)+)['"]?\]/.exec(expr))) {
+			var key = matches[1].toLowerCase(), val = matches[2];
+			if (key === 'id') {
+				arr = byId(val, tag, root);
+			} else if (key === 'class') {
+				arr = byClass(val, tag, root);
+			} else if (key === 'name') {
+				arr = byName(val, tag, root);
+			} else {
+				arr = byAttr(key, val, tag, root);
+			}
+		} else {
+			var els = root.getElementsByTagName(tag), el;
+			for (var i = 0, len = els.length; i < len; i++) {
+				el = els[i];
+				if (el.nodeType == 1) {
+					arr.push(el);
+				}
+			}
+		}
+		return arr;
+	}
+	var parts = [], arr, re = /((?:\\.|[^\s>])+|[\s>])/g;
+	while ((arr = re.exec(expr))) {
+		if (arr[1] !== ' ') {
+			parts.push(arr[1]);
+		}
+	}
+	var results = [];
+	if (parts.length == 1) {
+		return select(parts[0], root);
+	}
+	var isChild = false, part, els, subResults, val, v, i, j, k, length, len, l;
+	for (i = 0, lenth = parts.length; i < lenth; i++) {
+		part = parts[i];
+		if (part === '>') {
+			isChild = true;
+			continue;
+		}
+		if (i > 0) {
+			els = [];
+			for (j = 0, len = results.length; j < len; j++) {
+				val = results[j];
+				subResults = select(part, val);
+				for (k = 0, l = subResults.length; k < l; k++) {
+					v = subResults[k];
+					if (isChild) {
+						if (val === v.parentNode) {
+							els.push(v);
+						}
+					} else {
+						els.push(v);
+					}
+				}
+			}
+			results = els;
+		} else {
+			results = select(part, root);
+		}
+		if (results.length === 0) {
+			return [];
+		}
+	}
+	return results;
+}
+function _query(expr, root) {
+	var arr = _queryAll(expr, root);
+	return arr.length > 0 ? arr[0] : null;
+}
+K.query = _query;
+K.queryAll = _queryAll;
+function _get(val) {
+	return K(val)[0];
+}
+function _getDoc(node) {
+	if (!node) {
+		return document;
+	}
+	return node.ownerDocument || node.document || node;
+}
+function _getWin(node) {
+	if (!node) {
+		return window;
+	}
+	var doc = _getDoc(node);
+	return doc.parentWindow || doc.defaultView;
+}
+function _setHtml(el, html) {
+	if (el.nodeType != 1) {
+		return;
+	}
+	var doc = _getDoc(el);
+	try {
+		el.innerHTML = '<img id="__kindeditor_temp_tag__" width="0" height="0" style="display:none;" />' + html;
+		var temp = doc.getElementById('__kindeditor_temp_tag__');
+		temp.parentNode.removeChild(temp);
+	} catch(e) {
+		K(el).empty();
+		K('@' + html, doc).each(function() {
+			el.appendChild(this);
+		});
+	}
+}
+function _hasClass(el, cls) {
+	return _inString(cls, el.className, ' ');
+}
+function _setAttr(el, key, val) {
+	if (_IE && _V < 8 && key.toLowerCase() == 'class') {
+		key = 'className';
+	}
+	el.setAttribute(key, '' + val);
+}
+function _removeAttr(el, key) {
+	if (_IE && _V < 8 && key.toLowerCase() == 'class') {
+		key = 'className';
+	}
+	_setAttr(el, key, '');
+	el.removeAttribute(key);
+}
+function _getNodeName(node) {
+	if (!node || !node.nodeName) {
+		return '';
+	}
+	return node.nodeName.toLowerCase();
+}
+function _computedCss(el, key) {
+	var self = this, win = _getWin(el), camelKey = _toCamel(key), val = '';
+	if (win.getComputedStyle) {
+		var style = win.getComputedStyle(el, null);
+		val = style[camelKey] || style.getPropertyValue(key) || el.style[camelKey];
+	} else if (el.currentStyle) {
+		val = el.currentStyle[camelKey] || el.style[camelKey];
+	}
+	return val;
+}
+function _hasVal(node) {
+	return !!_VALUE_TAG_MAP[_getNodeName(node)];
+}
+function _docElement(doc) {
+	doc = doc || document;
+	return _QUIRKS ? doc.body : doc.documentElement;
+}
+function _docHeight(doc) {
+	var el = _docElement(doc);
+	return Math.max(el.scrollHeight, el.clientHeight);
+}
+function _docWidth(doc) {
+	var el = _docElement(doc);
+	return Math.max(el.scrollWidth, el.clientWidth);
+}
+function _getScrollPos(doc) {
+	doc = doc || document;
+	var x, y;
+	if (_IE || _OPERA) {
+		x = _docElement(doc).scrollLeft;
+		y = _docElement(doc).scrollTop;
+	} else {
+		x = _getWin(doc).scrollX;
+		y = _getWin(doc).scrollY;
+	}
+	return {x : x, y : y};
+}
+function KNode(node) {
+	this.init(node);
+}
+_extend(KNode, {
+	init : function(node) {
+		var self = this;
+		node = _isArray(node) ? node : [node];
+		var length = 0;
+		for (var i = 0, len = node.length; i < len; i++) {
+			if (node[i]) {
+				self[i] = node[i].constructor === KNode ? node[i][0] : node[i];
+				length++;
+			}
+		}
+		self.length = length;
+		self.doc = _getDoc(self[0]);
+		self.name = _getNodeName(self[0]);
+		self.type = self.length > 0 ? self[0].nodeType : null;
+		self.win = _getWin(self[0]);
+	},
+	each : function(fn) {
+		var self = this;
+		for (var i = 0; i < self.length; i++) {
+			if (fn.call(self[i], i, self[i]) === false) {
+				return self;
+			}
+		}
+		return self;
+	},
+	bind : function(type, fn) {
+		this.each(function() {
+			_bind(this, type, fn);
+		});
+		return this;
+	},
+	unbind : function(type, fn) {
+		this.each(function() {
+			_unbind(this, type, fn);
+		});
+		return this;
+	},
+	fire : function(type) {
+		if (this.length < 1) {
+			return this;
+		}
+		_fire(this[0], type);
+		return this;
+	},
+	hasAttr : function(key) {
+		if (this.length < 1) {
+			return false;
+		}
+		return !!_getAttr(this[0], key);
+	},
+	attr : function(key, val) {
+		var self = this;
+		if (key === undefined) {
+			return _getAttrList(self.outer());
+		}
+		if (typeof key === 'object') {
+			_each(key, function(k, v) {
+				self.attr(k, v);
+			});
+			return self;
+		}
+		if (val === undefined) {
+			val = self.length < 1 ? null : _getAttr(self[0], key);
+			return val === null ? '' : val;
+		}
+		self.each(function() {
+			_setAttr(this, key, val);
+		});
+		return self;
+	},
+	removeAttr : function(key) {
+		this.each(function() {
+			_removeAttr(this, key);
+		});
+		return this;
+	},
+	get : function(i) {
+		if (this.length < 1) {
+			return null;
+		}
+		return this[i || 0];
+	},
+	eq : function(i) {
+		if (this.length < 1) {
+			return null;
+		}
+		return this[i] ? new KNode(this[i]) : null;
+	},
+	hasClass : function(cls) {
+		if (this.length < 1) {
+			return false;
+		}
+		return _hasClass(this[0], cls);
+	},
+	addClass : function(cls) {
+		this.each(function() {
+			if (!_hasClass(this, cls)) {
+				this.className = _trim(this.className + ' ' + cls);
+			}
+		});
+		return this;
+	},
+	removeClass : function(cls) {
+		this.each(function() {
+			if (_hasClass(this, cls)) {
+				this.className = _trim(this.className.replace(new RegExp('(^|\\s)' + cls + '(\\s|$)'), ' '));
+			}
+		});
+		return this;
+	},
+	html : function(val) {
+		var self = this;
+		if (val === undefined) {
+			if (self.length < 1 || self.type != 1) {
+				return '';
+			}
+			return _formatHtml(self[0].innerHTML);
+		}
+		self.each(function() {
+			_setHtml(this, val);
+		});
+		return self;
+	},
+	text : function() {
+		var self = this;
+		if (self.length < 1) {
+			return '';
+		}
+		return _IE ? self[0].innerText : self[0].textContent;
+	},
+	hasVal : function() {
+		if (this.length < 1) {
+			return false;
+		}
+		return _hasVal(this[0]);
+	},
+	val : function(val) {
+		var self = this;
+		if (val === undefined) {
+			if (self.length < 1) {
+				return '';
+			}
+			return self.hasVal() ? self[0].value : self.attr('value');
+		} else {
+			self.each(function() {
+				if (_hasVal(this)) {
+					this.value = val;
+				} else {
+					_setAttr(this, 'value' , val);
+				}
+			});
+			return self;
+		}
+	},
+	css : function(key, val) {
+		var self = this;
+		if (key === undefined) {
+			return _getCssList(self.attr('style'));
+		}
+		if (typeof key === 'object') {
+			_each(key, function(k, v) {
+				self.css(k, v);
+			});
+			return self;
+		}
+		if (val === undefined) {
+			if (self.length < 1) {
+				return '';
+			}
+			return self[0].style[_toCamel(key)] || _computedCss(self[0], key) || '';
+		}
+		self.each(function() {
+			this.style[_toCamel(key)] = val;
+		});
+		return self;
+	},
+	width : function(val) {
+		var self = this;
+		if (val === undefined) {
+			if (self.length < 1) {
+				return 0;
+			}
+			return self[0].offsetWidth;
+		}
+		return self.css('width', _addUnit(val));
+	},
+	height : function(val) {
+		var self = this;
+		if (val === undefined) {
+			if (self.length < 1) {
+				return 0;
+			}
+			return self[0].offsetHeight;
+		}
+		return self.css('height', _addUnit(val));
+	},
+	opacity : function(val) {
+		this.each(function() {
+			if (this.style.opacity === undefined) {
+				this.style.filter = val == 1 ? '' : 'alpha(opacity=' + (val * 100) + ')';
+			} else {
+				this.style.opacity = val == 1 ? '' : val;
+			}
+		});
+		return this;
+	},
+	data : function(key, val) {
+		var self = this;
+		key = 'kindeditor_data_' + key;
+		if (val === undefined) {
+			if (self.length < 1) {
+				return null;
+			}
+			return self[0][key];
+		}
+		this.each(function() {
+			this[key] = val;
+		});
+		return self;
+	},
+	pos : function() {
+		var self = this, node = self[0], x = 0, y = 0;
+		if (node) {
+			if (node.getBoundingClientRect) {
+				var box = node.getBoundingClientRect(),
+					pos = _getScrollPos(self.doc);
+				x = box.left + pos.x;
+				y = box.top + pos.y;
+			} else {
+				while (node) {
+					x += node.offsetLeft;
+					y += node.offsetTop;
+					node = node.offsetParent;
+				}
+			}
+		}
+		return {x : _round(x), y : _round(y)};
+	},
+	clone : function(bool) {
+		if (this.length < 1) {
+			return new KNode([]);
+		}
+		return new KNode(this[0].cloneNode(bool));
+	},
+	append : function(expr) {
+		this.each(function() {
+			if (this.appendChild) {
+				this.appendChild(_get(expr));
+			}
+		});
+		return this;
+	},
+	appendTo : function(expr) {
+		this.each(function() {
+			_get(expr).appendChild(this);
+		});
+		return this;
+	},
+	before : function(expr) {
+		this.each(function() {
+			this.parentNode.insertBefore(_get(expr), this);
+		});
+		return this;
+	},
+	after : function(expr) {
+		this.each(function() {
+			if (this.nextSibling) {
+				this.parentNode.insertBefore(_get(expr), this.nextSibling);
+			} else {
+				this.parentNode.appendChild(_get(expr));
+			}
+		});
+		return this;
+	},
+	replaceWith : function(expr) {
+		var nodes = [];
+		this.each(function(i, node) {
+			_unbind(node);
+			var newNode = _get(expr);
+			node.parentNode.replaceChild(newNode, node);
+			nodes.push(newNode);
+		});
+		return K(nodes);
+	},
+	empty : function() {
+		var self = this;
+		self.each(function(i, node) {
+			var child = node.firstChild;
+			while (child) {
+				if (!node.parentNode) {
+					return;
+				}
+				var next = child.nextSibling;
+				child.parentNode.removeChild(child);
+				child = next;
+			}
+		});
+		return self;
+	},
+	remove : function(keepChilds) {
+		var self = this;
+		self.each(function(i, node) {
+			if (!node.parentNode) {
+				return;
+			}
+			_unbind(node);
+			if (keepChilds) {
+				var child = node.firstChild;
+				while (child) {
+					var next = child.nextSibling;
+					node.parentNode.insertBefore(child, node);
+					child = next;
+				}
+			}
+			node.parentNode.removeChild(node);
+			delete self[i];
+		});
+		self.length = 0;
+		return self;
+	},
+	show : function(val) {
+		var self = this;
+		if (val === undefined) {
+			val = self._originDisplay || '';
+		}
+		if (self.css('display') != 'none') {
+			return self;
+		}
+		return self.css('display', val);
+	},
+	hide : function() {
+		var self = this;
+		if (self.length < 1) {
+			return self;
+		}
+		self._originDisplay = self[0].style.display;
+		return self.css('display', 'none');
+	},
+	outer : function() {
+		var self = this;
+		if (self.length < 1) {
+			return '';
+		}
+		var div = self.doc.createElement('div'), html;
+		div.appendChild(self[0].cloneNode(true));
+		html = _formatHtml(div.innerHTML);
+		div = null;
+		return html;
+	},
+	isSingle : function() {
+		return !!_SINGLE_TAG_MAP[this.name];
+	},
+	isInline : function() {
+		return !!_INLINE_TAG_MAP[this.name];
+	},
+	isBlock : function() {
+		return !!_BLOCK_TAG_MAP[this.name];
+	},
+	isStyle : function() {
+		return !!_STYLE_TAG_MAP[this.name];
+	},
+	isControl : function() {
+		return !!_CONTROL_TAG_MAP[this.name];
+	},
+	contains : function(otherNode) {
+		if (this.length < 1) {
+			return false;
+		}
+		return _contains(this[0], _get(otherNode));
+	},
+	parent : function() {
+		if (this.length < 1) {
+			return null;
+		}
+		var node = this[0].parentNode;
+		return node ? new KNode(node) : null;
+	},
+	children : function() {
+		if (this.length < 1) {
+			return new KNode([]);
+		}
+		var list = [], child = this[0].firstChild;
+		while (child) {
+			if (child.nodeType != 3 || _trim(child.nodeValue) !== '') {
+				list.push(child);
+			}
+			child = child.nextSibling;
+		}
+		return new KNode(list);
+	},
+	first : function() {
+		var list = this.children();
+		return list.length > 0 ? list.eq(0) : null;
+	},
+	last : function() {
+		var list = this.children();
+		return list.length > 0 ? list.eq(list.length - 1) : null;
+	},
+	index : function() {
+		if (this.length < 1) {
+			return -1;
+		}
+		var i = -1, sibling = this[0];
+		while (sibling) {
+			i++;
+			sibling = sibling.previousSibling;
+		}
+		return i;
+	},
+	prev : function() {
+		if (this.length < 1) {
+			return null;
+		}
+		var node = this[0].previousSibling;
+		return node ? new KNode(node) : null;
+	},
+	next : function() {
+		if (this.length < 1) {
+			return null;
+		}
+		var node = this[0].nextSibling;
+		return node ? new KNode(node) : null;
+	},
+	scan : function(fn, order) {
+		if (this.length < 1) {
+			return;
+		}
+		order = (order === undefined) ? true : order;
+		function walk(node) {
+			var n = order ? node.firstChild : node.lastChild;
+			while (n) {
+				var next = order ? n.nextSibling : n.previousSibling;
+				if (fn(n) === false) {
+					return false;
+				}
+				if (walk(n) === false) {
+					return false;
+				}
+				n = next;
+			}
+		}
+		walk(this[0]);
+		return this;
+	}
+});
+_each(('blur,focus,focusin,focusout,load,resize,scroll,unload,click,dblclick,' +
+	'mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave,' +
+	'change,select,submit,keydown,keypress,keyup,error,contextmenu').split(','), function(i, type) {
+	KNode.prototype[type] = function(fn) {
+		return fn ? this.bind(type, fn) : this.fire(type);
+	};
+});
+var _K = K;
+K = function(expr, root) {
+	if (expr === undefined || expr === null) {
+		return;
+	}
+	function newNode(node) {
+		if (!node[0]) {
+			node = [];
+		}
+		return new KNode(node);
+	}
+	if (typeof expr === 'string') {
+		if (root) {
+			root = _get(root);
+		}
+		var length = expr.length;
+		if (expr.charAt(0) === '@') {
+			expr = expr.substr(1);
+		}
+		if (expr.length !== length || /<.+>/.test(expr)) {
+			var doc = root ? root.ownerDocument || root : document,
+				div = doc.createElement('div'), list = [];
+			div.innerHTML = '<img id="__kindeditor_temp_tag__" width="0" height="0" style="display:none;" />' + expr;
+			for (var i = 0, len = div.childNodes.length; i < len; i++) {
+				var child = div.childNodes[i];
+				if (child.id == '__kindeditor_temp_tag__') {
+					continue;
+				}
+				list.push(child);
+			}
+			return newNode(list);
+		}
+		return newNode(_queryAll(expr, root));
+	}
+	if (expr && expr.constructor === KNode) {
+		return expr;
+	}
+	if (expr.toArray) {
+		expr = expr.toArray();
+	}
+	if (_isArray(expr)) {
+		return newNode(expr);
+	}
+	return newNode(_toArray(arguments));
+};
+_each(_K, function(key, val) {
+	K[key] = val;
+});
+K.NodeClass = KNode;
+window.KindEditor = K;
+var _START_TO_START = 0,
+	_START_TO_END = 1,
+	_END_TO_END = 2,
+	_END_TO_START = 3,
+	_BOOKMARK_ID = 0;
+function _updateCollapsed(range) {
+	range.collapsed = (range.startContainer === range.endContainer && range.startOffset === range.endOffset);
+	return range;
+}
+function _copyAndDelete(range, isCopy, isDelete) {
+	var doc = range.doc, nodeList = [];
+	function splitTextNode(node, startOffset, endOffset) {
+		var length = node.nodeValue.length, centerNode;
+		if (isCopy) {
+			var cloneNode = node.cloneNode(true);
+			if (startOffset > 0) {
+				centerNode = cloneNode.splitText(startOffset);
+			} else {
+				centerNode = cloneNode;
+			}
+			if (endOffset < length) {
+				centerNode.splitText(endOffset - startOffset);
+			}
+		}
+		if (isDelete) {
+			var center = node;
+			if (startOffset > 0) {
+				center = node.splitText(startOffset);
+				range.setStart(node, startOffset);
+			}
+			if (endOffset < length) {
+				var right = center.splitText(endOffset - startOffset);
+				range.setEnd(right, 0);
+			}
+			nodeList.push(center);
+		}
+		return centerNode;
+	}
+	function removeNodes() {
+		if (isDelete) {
+			range.up().collapse(true);
+		}
+		for (var i = 0, len = nodeList.length; i < len; i++) {
+			var node = nodeList[i];
+			if (node.parentNode) {
+				node.parentNode.removeChild(node);
+			}
+		}
+	}
+	var copyRange = range.cloneRange().down();
+	var start = -1, incStart = -1, incEnd = -1, end = -1,
+		ancestor = range.commonAncestor(), frag = doc.createDocumentFragment();
+	if (ancestor.nodeType == 3) {
+		var textNode = splitTextNode(ancestor, range.startOffset, range.endOffset);
+		if (isCopy) {
+			frag.appendChild(textNode);
+		}
+		removeNodes();
+		return isCopy ? frag : range;
+	}
+	function extractNodes(parent, frag) {
+		var node = parent.firstChild, nextNode;
+		while (node) {
+			var testRange = new KRange(doc).selectNode(node);
+			start = testRange.compareBoundaryPoints(_START_TO_END, range);
+			if (start >= 0 && incStart <= 0) {
+				incStart = testRange.compareBoundaryPoints(_START_TO_START, range);
+			}
+			if (incStart >= 0 && incEnd <= 0) {
+				incEnd = testRange.compareBoundaryPoints(_END_TO_END, range);
+			}
+			if (incEnd >= 0 && end <= 0) {
+				end = testRange.compareBoundaryPoints(_END_TO_START, range);
+			}
+			if (end >= 0) {
+				return false;
+			}
+			nextNode = node.nextSibling;
+			if (start > 0) {
+				if (node.nodeType == 1) {
+					if (incStart >= 0 && incEnd <= 0) {
+						if (isCopy) {
+							frag.appendChild(node.cloneNode(true));
+						}
+						if (isDelete) {
+							nodeList.push(node);
+						}
+					} else {
+						var childFlag;
+						if (isCopy) {
+							childFlag = node.cloneNode(false);
+							frag.appendChild(childFlag);
+						}
+						if (extractNodes(node, childFlag) === false) {
+							return false;
+						}
+					}
+				} else if (node.nodeType == 3) {
+					var textNode;
+					if (node == copyRange.startContainer) {
+						textNode = splitTextNode(node, copyRange.startOffset, node.nodeValue.length);
+					} else if (node == copyRange.endContainer) {
+						textNode = splitTextNode(node, 0, copyRange.endOffset);
+					} else {
+						textNode = splitTextNode(node, 0, node.nodeValue.length);
+					}
+					if (isCopy) {
+						try {
+							frag.appendChild(textNode);
+						} catch(e) {}
+					}
+				}
+			}
+			node = nextNode;
+		}
+	}
+	extractNodes(ancestor, frag);
+	if (isDelete) {
+		range.up().collapse(true);
+	}
+	for (var i = 0, len = nodeList.length; i < len; i++) {
+		var node = nodeList[i];
+		if (node.parentNode) {
+			node.parentNode.removeChild(node);
+		}
+	}
+	return isCopy ? frag : range;
+}
+function _moveToElementText(range, el) {
+	var node = el;
+	while (node) {
+		var knode = K(node);
+		if (knode.name == 'marquee' || knode.name == 'select') {
+			return;
+		}
+		node = node.parentNode;
+	}
+	try {
+		range.moveToElementText(el);
+	} catch(e) {}
+}
+function _getStartEnd(rng, isStart) {
+	var doc = rng.parentElement().ownerDocument,
+		pointRange = rng.duplicate();
+	pointRange.collapse(isStart);
+	var parent = pointRange.parentElement(),
+		nodes = parent.childNodes;
+	if (nodes.length === 0) {
+		return {node: parent.parentNode, offset: K(parent).index()};
+	}
+	var startNode = doc, startPos = 0, cmp = -1;
+	var testRange = rng.duplicate();
+	_moveToElementText(testRange, parent);
+	for (var i = 0, len = nodes.length; i < len; i++) {
+		var node = nodes[i];
+		cmp = testRange.compareEndPoints('StartToStart', pointRange);
+		if (cmp === 0) {
+			return {node: node.parentNode, offset: i};
+		}
+		if (node.nodeType == 1) {
+			var nodeRange = rng.duplicate(), dummy, knode = K(node), newNode = node;
+			if (knode.isControl()) {
+				dummy = doc.createElement('span');
+				knode.after(dummy);
+				newNode = dummy;
+				startPos += knode.text().replace(/\r\n|\n|\r/g, '').length;
+			}
+			_moveToElementText(nodeRange, newNode);
+			testRange.setEndPoint('StartToEnd', nodeRange);
+			if (cmp > 0) {
+				startPos += nodeRange.text.replace(/\r\n|\n|\r/g, '').length;
+			} else {
+				startPos = 0;
+			}
+			if (dummy) {
+				K(dummy).remove();
+			}
+		} else if (node.nodeType == 3) {
+			testRange.moveStart('character', node.nodeValue.length);
+			startPos += node.nodeValue.length;
+		}
+		if (cmp < 0) {
+			startNode = node;
+		}
+	}
+	if (cmp < 0 && startNode.nodeType == 1) {
+		return {node: parent, offset: K(parent.lastChild).index() + 1};
+	}
+	if (cmp > 0) {
+		while (startNode.nextSibling && startNode.nodeType == 1) {
+			startNode = startNode.nextSibling;
+		}
+	}
+	testRange = rng.duplicate();
+	_moveToElementText(testRange, parent);
+	testRange.setEndPoint('StartToEnd', pointRange);
+	startPos -= testRange.text.replace(/\r\n|\n|\r/g, '').length;
+	if (cmp > 0 && startNode.nodeType == 3) {
+		var prevNode = startNode.previousSibling;
+		while (prevNode && prevNode.nodeType == 3) {
+			startPos -= prevNode.nodeValue.length;
+			prevNode = prevNode.previousSibling;
+		}
+	}
+	return {node: startNode, offset: startPos};
+}
+function _getEndRange(node, offset) {
+	var doc = node.ownerDocument || node,
+		range = doc.body.createTextRange();
+	if (doc == node) {
+		range.collapse(true);
+		return range;
+	}
+	if (node.nodeType == 1 && node.childNodes.length > 0) {
+		var children = node.childNodes, isStart, child;
+		if (offset === 0) {
+			child = children[0];
+			isStart = true;
+		} else {
+			child = children[offset - 1];
+			isStart = false;
+		}
+		if (!child) {
+			return range;
+		}
+		if (K(child).name === 'head') {
+			if (offset === 1) {
+				isStart = true;
+			}
+			if (offset === 2) {
+				isStart = false;
+			}
+			range.collapse(isStart);
+			return range;
+		}
+		if (child.nodeType == 1) {
+			var kchild = K(child), span;
+			if (kchild.isControl()) {
+				span = doc.createElement('span');
+				if (isStart) {
+					kchild.before(span);
+				} else {
+					kchild.after(span);
+				}
+				child = span;
+			}
+			_moveToElementText(range, child);
+			range.collapse(isStart);
+			if (span) {
+				K(span).remove();
+			}
+			return range;
+		}
+		node = child;
+		offset = isStart ? 0 : child.nodeValue.length;
+	}
+	var dummy = doc.createElement('span');
+	K(node).before(dummy);
+	_moveToElementText(range, dummy);
+	range.moveStart('character', offset);
+	K(dummy).remove();
+	return range;
+}
+function _toRange(rng) {
+	var doc, range;
+	function tr2td(start) {
+		if (K(start.node).name == 'tr') {
+			start.node = start.node.cells[start.offset];
+			start.offset = 0;
+		}
+	}
+	if (_IE) {
+		if (rng.item) {
+			doc = _getDoc(rng.item(0));
+			range = new KRange(doc);
+			range.selectNode(rng.item(0));
+			return range;
+		}
+		doc = rng.parentElement().ownerDocument;
+		var start = _getStartEnd(rng, true),
+			end = _getStartEnd(rng, false);
+		tr2td(start);
+		tr2td(end);
+		range = new KRange(doc);
+		range.setStart(start.node, start.offset);
+		range.setEnd(end.node, end.offset);
+		return range;
+	}
+	var startContainer = rng.startContainer;
+	doc = startContainer.ownerDocument || startContainer;
+	range = new KRange(doc);
+	range.setStart(startContainer, rng.startOffset);
+	range.setEnd(rng.endContainer, rng.endOffset);
+	return range;
+}
+function KRange(doc) {
+	this.init(doc);
+}
+_extend(KRange, {
+	init : function(doc) {
+		var self = this;
+		self.startContainer = doc;
+		self.startOffset = 0;
+		self.endContainer = doc;
+		self.endOffset = 0;
+		self.collapsed = true;
+		self.doc = doc;
+	},
+	commonAncestor : function() {
+		function getParents(node) {
+			var parents = [];
+			while (node) {
+				parents.push(node);
+				node = node.parentNode;
+			}
+			return parents;
+		}
+		var parentsA = getParents(this.startContainer),
+			parentsB = getParents(this.endContainer),
+			i = 0, lenA = parentsA.length, lenB = parentsB.length, parentA, parentB;
+		while (++i) {
+			parentA = parentsA[lenA - i];
+			parentB = parentsB[lenB - i];
+			if (!parentA || !parentB || parentA !== parentB) {
+				break;
+			}
+		}
+		return parentsA[lenA - i + 1];
+	},
+	setStart : function(node, offset) {
+		var self = this, doc = self.doc;
+		self.startContainer = node;
+		self.startOffset = offset;
+		if (self.endContainer === doc) {
+			self.endContainer = node;
+			self.endOffset = offset;
+		}
+		return _updateCollapsed(this);
+	},
+	setEnd : function(node, offset) {
+		var self = this, doc = self.doc;
+		self.endContainer = node;
+		self.endOffset = offset;
+		if (self.startContainer === doc) {
+			self.startContainer = node;
+			self.startOffset = offset;
+		}
+		return _updateCollapsed(this);
+	},
+	setStartBefore : function(node) {
+		return this.setStart(node.parentNode || this.doc, K(node).index());
+	},
+	setStartAfter : function(node) {
+		return this.setStart(node.parentNode || this.doc, K(node).index() + 1);
+	},
+	setEndBefore : function(node) {
+		return this.setEnd(node.parentNode || this.doc, K(node).index());
+	},
+	setEndAfter : function(node) {
+		return this.setEnd(node.parentNode || this.doc, K(node).index() + 1);
+	},
+	selectNode : function(node) {
+		return this.setStartBefore(node).setEndAfter(node);
+	},
+	selectNodeContents : function(node) {
+		var knode = K(node);
+		if (knode.type == 3 || knode.isSingle()) {
+			return this.selectNode(node);
+		}
+		var children = knode.children();
+		if (children.length > 0) {
+			return this.setStartBefore(children[0]).setEndAfter(children[children.length - 1]);
+		}
+		return this.setStart(node, 0).setEnd(node, 0);
+	},
+	collapse : function(toStart) {
+		if (toStart) {
+			return this.setEnd(this.startContainer, this.startOffset);
+		}
+		return this.setStart(this.endContainer, this.endOffset);
+	},
+	compareBoundaryPoints : function(how, range) {
+		var rangeA = this.get(), rangeB = range.get();
+		if (_IE) {
+			var arr = {};
+			arr[_START_TO_START] = 'StartToStart';
+			arr[_START_TO_END] = 'EndToStart';
+			arr[_END_TO_END] = 'EndToEnd';
+			arr[_END_TO_START] = 'StartToEnd';
+			var cmp = rangeA.compareEndPoints(arr[how], rangeB);
+			if (cmp !== 0) {
+				return cmp;
+			}
+			var nodeA, nodeB, nodeC, posA, posB;
+			if (how === _START_TO_START || how === _END_TO_START) {
+				nodeA = this.startContainer;
+				posA = this.startOffset;
+			}
+			if (how === _START_TO_END || how === _END_TO_END) {
+				nodeA = this.endContainer;
+				posA = this.endOffset;
+			}
+			if (how === _START_TO_START || how === _START_TO_END) {
+				nodeB = range.startContainer;
+				posB = range.startOffset;
+			}
+			if (how === _END_TO_END || how === _END_TO_START) {
+				nodeB = range.endContainer;
+				posB = range.endOffset;
+			}
+			if (nodeA === nodeB) {
+				var diff = posA - posB;
+				return diff > 0 ? 1 : (diff < 0 ? -1 : 0);
+			}
+			nodeC = nodeB;
+			while (nodeC && nodeC.parentNode !== nodeA) {
+				nodeC = nodeC.parentNode;
+			}
+			if (nodeC) {
+				return K(nodeC).index() >= posA ? -1 : 1;
+			}
+			nodeC = nodeA;
+			while (nodeC && nodeC.parentNode !== nodeB) {
+				nodeC = nodeC.parentNode;
+			}
+			if (nodeC) {
+				return K(nodeC).index() >= posB ? 1 : -1;
+			}
+			nodeC = K(nodeB).next();
+			if (nodeC && nodeC.contains(nodeA)) {
+				return 1;
+			}
+			nodeC = K(nodeA).next();
+			if (nodeC && nodeC.contains(nodeB)) {
+				return -1;
+			}
+		} else {
+			return rangeA.compareBoundaryPoints(how, rangeB);
+		}
+	},
+	cloneRange : function() {
+		return new KRange(this.doc).setStart(this.startContainer, this.startOffset).setEnd(this.endContainer, this.endOffset);
+	},
+	toString : function() {
+		var rng = this.get(), str = _IE ? rng.text : rng.toString();
+		return str.replace(/\r\n|\n|\r/g, '');
+	},
+	cloneContents : function() {
+		return _copyAndDelete(this, true, false);
+	},
+	deleteContents : function() {
+		return _copyAndDelete(this, false, true);
+	},
+	extractContents : function() {
+		return _copyAndDelete(this, true, true);
+	},
+	insertNode : function(node) {
+		var self = this,
+			sc = self.startContainer, so = self.startOffset,
+			ec = self.endContainer, eo = self.endOffset,
+			firstChild, lastChild, c, nodeCount = 1;
+		if (node.nodeName.toLowerCase() === '#document-fragment') {
+			firstChild = node.firstChild;
+			lastChild = node.lastChild;
+			nodeCount = node.childNodes.length;
+		}
+		if (sc.nodeType == 1) {
+			c = sc.childNodes[so];
+			if (c) {
+				sc.insertBefore(node, c);
+				if (sc === ec) {
+					eo += nodeCount;
+				}
+			} else {
+				sc.appendChild(node);
+			}
+		} else if (sc.nodeType == 3) {
+			if (so === 0) {
+				sc.parentNode.insertBefore(node, sc);
+				if (sc.parentNode === ec) {
+					eo += nodeCount;
+				}
+			} else if (so >= sc.nodeValue.length) {
+				if (sc.nextSibling) {
+					sc.parentNode.insertBefore(node, sc.nextSibling);
+				} else {
+					sc.parentNode.appendChild(node);
+				}
+			} else {
+				if (so > 0) {
+					c = sc.splitText(so);
+				} else {
+					c = sc;
+				}
+				sc.parentNode.insertBefore(node, c);
+				if (sc === ec) {
+					ec = c;
+					eo -= so;
+				}
+			}
+		}
+		if (firstChild) {
+			self.setStartBefore(firstChild).setEndAfter(lastChild);
+		} else {
+			self.selectNode(node);
+		}
+		if (self.compareBoundaryPoints(_END_TO_END, self.cloneRange().setEnd(ec, eo)) >= 1) {
+			return self;
+		}
+		return self.setEnd(ec, eo);
+	},
+	surroundContents : function(node) {
+		node.appendChild(this.extractContents());
+		return this.insertNode(node).selectNode(node);
+	},
+	isControl : function() {
+		var self = this,
+			sc = self.startContainer, so = self.startOffset,
+			ec = self.endContainer, eo = self.endOffset, rng;
+		return sc.nodeType == 1 && sc === ec && so + 1 === eo && K(sc.childNodes[so]).isControl();
+	},
+	get : function(hasControlRange) {
+		var self = this, doc = self.doc, node, rng;
+		if (!_IE) {
+			rng = doc.createRange();
+			try {
+				rng.setStart(self.startContainer, self.startOffset);
+				rng.setEnd(self.endContainer, self.endOffset);
+			} catch (e) {}
+			return rng;
+		}
+		if (hasControlRange && self.isControl()) {
+			rng = doc.body.createControlRange();
+			rng.addElement(self.startContainer.childNodes[self.startOffset]);
+			return rng;
+		}
+		var range = self.cloneRange().down();
+		rng = doc.body.createTextRange();
+		rng.setEndPoint('StartToStart', _getEndRange(range.startContainer, range.startOffset));
+		rng.setEndPoint('EndToStart', _getEndRange(range.endContainer, range.endOffset));
+		return rng;
+	},
+	html : function() {
+		return K(this.cloneContents()).outer();
+	},
+	down : function() {
+		var self = this;
+		function downPos(node, pos, isStart) {
+			if (node.nodeType != 1) {
+				return;
+			}
+			var children = K(node).children();
+			if (children.length === 0) {
+				return;
+			}
+			var left, right, child, offset;
+			if (pos > 0) {
+				left = children.eq(pos - 1);
+			}
+			if (pos < children.length) {
+				right = children.eq(pos);
+			}
+			if (left && left.type == 3) {
+				child = left[0];
+				offset = child.nodeValue.length;
+			}
+			if (right && right.type == 3) {
+				child = right[0];
+				offset = 0;
+			}
+			if (!child) {
+				return;
+			}
+			if (isStart) {
+				self.setStart(child, offset);
+			} else {
+				self.setEnd(child, offset);
+			}
+		}
+		downPos(self.startContainer, self.startOffset, true);
+		downPos(self.endContainer, self.endOffset, false);
+		return self;
+	},
+	up : function() {
+		var self = this;
+		function upPos(node, pos, isStart) {
+			if (node.nodeType != 3) {
+				return;
+			}
+			if (pos === 0) {
+				if (isStart) {
+					self.setStartBefore(node);
+				} else {
+					self.setEndBefore(node);
+				}
+			} else if (pos == node.nodeValue.length) {
+				if (isStart) {
+					self.setStartAfter(node);
+				} else {
+					self.setEndAfter(node);
+				}
+			}
+		}
+		upPos(self.startContainer, self.startOffset, true);
+		upPos(self.endContainer, self.endOffset, false);
+		return self;
+	},
+	enlarge : function(toBlock) {
+		var self = this;
+		self.up();
+		function enlargePos(node, pos, isStart) {
+			var knode = K(node), parent;
+			if (knode.type == 3 || _NOSPLIT_TAG_MAP[knode.name] || !toBlock && knode.isBlock()) {
+				return;
+			}
+			if (pos === 0) {
+				while (!knode.prev()) {
+					parent = knode.parent();
+					if (!parent || _NOSPLIT_TAG_MAP[parent.name] || !toBlock && parent.isBlock()) {
+						break;
+					}
+					knode = parent;
+				}
+				if (isStart) {
+					self.setStartBefore(knode[0]);
+				} else {
+					self.setEndBefore(knode[0]);
+				}
+			} else if (pos == knode.children().length) {
+				while (!knode.next()) {
+					parent = knode.parent();
+					if (!parent || _NOSPLIT_TAG_MAP[parent.name] || !toBlock && parent.isBlock()) {
+						break;
+					}
+					knode = parent;
+				}
+				if (isStart) {
+					self.setStartAfter(knode[0]);
+				} else {
+					self.setEndAfter(knode[0]);
+				}
+			}
+		}
+		enlargePos(self.startContainer, self.startOffset, true);
+		enlargePos(self.endContainer, self.endOffset, false);
+		return self;
+	},
+	shrink : function() {
+		var self = this, child, collapsed = self.collapsed;
+		while (self.startContainer.nodeType == 1 && (child = self.startContainer.childNodes[self.startOffset]) && child.nodeType == 1 && !K(child).isSingle()) {
+			self.setStart(child, 0);
+		}
+		if (collapsed) {
+			return self.collapse(collapsed);
+		}
+		while (self.endContainer.nodeType == 1 && self.endOffset > 0 && (child = self.endContainer.childNodes[self.endOffset - 1]) && child.nodeType == 1 && !K(child).isSingle()) {
+			self.setEnd(child, child.childNodes.length);
+		}
+		return self;
+	},
+	createBookmark : function(serialize) {
+		var self = this, doc = self.doc, endNode,
+			startNode = K('<span style="display:none;"></span>', doc)[0];
+		startNode.id = '__kindeditor_bookmark_start_' + (_BOOKMARK_ID++) + '__';
+		if (!self.collapsed) {
+			endNode = startNode.cloneNode(true);
+			endNode.id = '__kindeditor_bookmark_end_' + (_BOOKMARK_ID++) + '__';
+		}
+		if (endNode) {
+			self.cloneRange().collapse(false).insertNode(endNode).setEndBefore(endNode);
+		}
+		self.insertNode(startNode).setStartAfter(startNode);
+		return {
+			start : serialize ? '#' + startNode.id : startNode,
+			end : endNode ? (serialize ? '#' + endNode.id : endNode) : null
+		};
+	},
+	moveToBookmark : function(bookmark) {
+		var self = this, doc = self.doc,
+			start = K(bookmark.start, doc), end = bookmark.end ? K(bookmark.end, doc) : null;
+		if (!start || start.length < 1) {
+			return self;
+		}
+		self.setStartBefore(start[0]);
+		start.remove();
+		if (end && end.length > 0) {
+			self.setEndBefore(end[0]);
+			end.remove();
+		} else {
+			self.collapse(true);
+		}
+		return self;
+	},
+	dump : function() {
+		console.log('--------------------');
+		console.log(this.startContainer.nodeType == 3 ? this.startContainer.nodeValue : this.startContainer, this.startOffset);
+		console.log(this.endContainer.nodeType == 3 ? this.endContainer.nodeValue : this.endContainer, this.endOffset);
+	}
+});
+function _range(mixed) {
+	if (!mixed.nodeName) {
+		return mixed.constructor === KRange ? mixed : _toRange(mixed);
+	}
+	return new KRange(mixed);
+}
+K.RangeClass = KRange;
+K.range = _range;
+K.START_TO_START = _START_TO_START;
+K.START_TO_END = _START_TO_END;
+K.END_TO_END = _END_TO_END;
+K.END_TO_START = _END_TO_START;
+function _nativeCommand(doc, key, val) {
+	try {
+		doc.execCommand(key, false, val);
+	} catch(e) {}
+}
+function _nativeCommandValue(doc, key) {
+	var val = '';
+	try {
+		val = doc.queryCommandValue(key);
+	} catch (e) {}
+	if (typeof val !== 'string') {
+		val = '';
+	}
+	return val;
+}
+function _getSel(doc) {
+	var win = _getWin(doc);
+	return doc.selection || win.getSelection();
+}
+function _getRng(doc) {
+	var sel = _getSel(doc), rng;
+	try {
+		if (sel.rangeCount > 0) {
+			rng = sel.getRangeAt(0);
+		} else {
+			rng = sel.createRange();
+		}
+	} catch(e) {}
+	if (_IE && (!rng || (!rng.item && rng.parentElement().ownerDocument !== doc))) {
+		return null;
+	}
+	return rng;
+}
+function _singleKeyMap(map) {
+	var newMap = {}, arr, v;
+	_each(map, function(key, val) {
+		arr = key.split(',');
+		for (var i = 0, len = arr.length; i < len; i++) {
+			v = arr[i];
+			newMap[v] = val;
+		}
+	});
+	return newMap;
+}
+function _hasAttrOrCss(knode, map) {
+	return _hasAttrOrCssByKey(knode, map, '*') || _hasAttrOrCssByKey(knode, map);
+}
+function _hasAttrOrCssByKey(knode, map, mapKey) {
+	mapKey = mapKey || knode.name;
+	if (knode.type !== 1) {
+		return false;
+	}
+	var newMap = _singleKeyMap(map);
+	if (!newMap[mapKey]) {
+		return false;
+	}
+	var arr = newMap[mapKey].split(',');
+	for (var i = 0, len = arr.length; i < len; i++) {
+		var key = arr[i];
+		if (key === '*') {
+			return true;
+		}
+		var match = /^(\.?)([^=]+)(?:=([^=]*))?$/.exec(key);
+		var method = match[1] ? 'css' : 'attr';
+		key = match[2];
+		var val = match[3] || '';
+		if (val === '' && knode[method](key) !== '') {
+			return true;
+		}
+		if (val !== '' && knode[method](key) === val) {
+			return true;
+		}
+	}
+	return false;
+}
+function _removeAttrOrCss(knode, map) {
+	if (knode.type != 1) {
+		return;
+	}
+	_removeAttrOrCssByKey(knode, map, '*');
+	_removeAttrOrCssByKey(knode, map);
+}
+function _removeAttrOrCssByKey(knode, map, mapKey) {
+	mapKey = mapKey || knode.name;
+	if (knode.type !== 1) {
+		return;
+	}
+	var newMap = _singleKeyMap(map);
+	if (!newMap[mapKey]) {
+		return;
+	}
+	var arr = newMap[mapKey].split(','), allFlag = false;
+	for (var i = 0, len = arr.length; i < len; i++) {
+		var key = arr[i];
+		if (key === '*') {
+			allFlag = true;
+			break;
+		}
+		var match = /^(\.?)([^=]+)(?:=([^=]*))?$/.exec(key);
+		key = match[2];
+		if (match[1]) {
+			key = _toCamel(key);
+			if (knode[0].style[key]) {
+				knode[0].style[key] = '';
+			}
+		} else {
+			knode.removeAttr(key);
+		}
+	}
+	if (allFlag) {
+		knode.remove(true);
+	}
+}
+function _getInnerNode(knode) {
+	var inner = knode;
+	while (inner.first()) {
+		inner = inner.first();
+	}
+	return inner;
+}
+function _isEmptyNode(knode) {
+	if (knode.type != 1 || knode.isSingle()) {
+		return false;
+	}
+	return knode.html().replace(/<[^>]+>/g, '') === '';
+}
+function _mergeWrapper(a, b) {
+	a = a.clone(true);
+	var lastA = _getInnerNode(a), childA = a, merged = false;
+	while (b) {
+		while (childA) {
+			if (childA.name === b.name) {
+				_mergeAttrs(childA, b.attr(), b.css());
+				merged = true;
+			}
+			childA = childA.first();
+		}
+		if (!merged) {
+			lastA.append(b.clone(false));
+		}
+		merged = false;
+		b = b.first();
+	}
+	return a;
+}
+function _wrapNode(knode, wrapper) {
+	wrapper = wrapper.clone(true);
+	if (knode.type == 3) {
+		_getInnerNode(wrapper).append(knode.clone(false));
+		knode.replaceWith(wrapper);
+		return wrapper;
+	}
+	var nodeWrapper = knode, child;
+	while ((child = knode.first()) && child.children().length == 1) {
+		knode = child;
+	}
+	child = knode.first();
+	var frag = knode.doc.createDocumentFragment();
+	while (child) {
+		frag.appendChild(child[0]);
+		child = child.next();
+	}
+	wrapper = _mergeWrapper(nodeWrapper, wrapper);
+	if (frag.firstChild) {
+		_getInnerNode(wrapper).append(frag);
+	}
+	nodeWrapper.replaceWith(wrapper);
+	return wrapper;
+}
+function _mergeAttrs(knode, attrs, styles) {
+	_each(attrs, function(key, val) {
+		if (key !== 'style') {
+			knode.attr(key, val);
+		}
+	});
+	_each(styles, function(key, val) {
+		knode.css(key, val);
+	});
+}
+function _inPreElement(knode) {
+	while (knode && knode.name != 'body') {
+		if (_PRE_TAG_MAP[knode.name] || knode.name == 'div' && knode.hasClass('ke-script')) {
+			return true;
+		}
+		knode = knode.parent();
+	}
+	return false;
+}
+function KCmd(range) {
+	this.init(range);
+}
+_extend(KCmd, {
+	init : function(range) {
+		var self = this, doc = range.doc;
+		self.doc = doc;
+		self.win = _getWin(doc);
+		self.sel = _getSel(doc);
+		self.range = range;
+	},
+	selection : function(forceReset) {
+		var self = this, doc = self.doc, rng = _getRng(doc);
+		self.sel = _getSel(doc);
+		if (rng) {
+			self.range = _range(rng);
+			if (K(self.range.startContainer).name == 'html') {
+				self.range.selectNodeContents(doc.body).collapse(false);
+			}
+			return self;
+		}
+		if (forceReset) {
+			self.range.selectNodeContents(doc.body).collapse(false);
+		}
+		return self;
+	},
+	select : function(hasDummy) {
+		hasDummy = _undef(hasDummy, true);
+		var self = this, sel = self.sel, range = self.range.cloneRange().shrink(),
+			sc = range.startContainer, so = range.startOffset,
+			ec = range.endContainer, eo = range.endOffset,
+			doc = _getDoc(sc), win = self.win, rng, hasU200b = false;
+		if (hasDummy && sc.nodeType == 1 && range.collapsed) {
+			if (_IE) {
+				var dummy = K('<span>&nbsp;</span>', doc);
+				range.insertNode(dummy[0]);
+				rng = doc.body.createTextRange();
+				try {
+					rng.moveToElementText(dummy[0]);
+				} catch(ex) {}
+				rng.collapse(false);
+				rng.select();
+				dummy.remove();
+				win.focus();
+				return self;
+			}
+			if (_WEBKIT) {
+				var children = sc.childNodes;
+				if (K(sc).isInline() || so > 0 && K(children[so - 1]).isInline() || children[so] && K(children[so]).isInline()) {
+					range.insertNode(doc.createTextNode('\u200B'));
+					hasU200b = true;
+				}
+			}
+		}
+		if (_IE) {
+			try {
+				rng = range.get(true);
+				rng.select();
+			} catch(e) {}
+		} else {
+			if (hasU200b) {
+				range.collapse(false);
+			}
+			rng = range.get(true);
+			sel.removeAllRanges();
+			sel.addRange(rng);
+			if (doc !== document) {
+				var pos = K(rng.endContainer).pos();
+				win.scrollTo(pos.x, pos.y);
+			}
+		}
+		win.focus();
+		return self;
+	},
+	wrap : function(val) {
+		var self = this, doc = self.doc, range = self.range, wrapper;
+		wrapper = K(val, doc);
+		if (range.collapsed) {
+			range.shrink();
+			range.insertNode(wrapper[0]).selectNodeContents(wrapper[0]);
+			return self;
+		}
+		if (wrapper.isBlock()) {
+			var copyWrapper = wrapper.clone(true), child = copyWrapper;
+			while (child.first()) {
+				child = child.first();
+			}
+			child.append(range.extractContents());
+			range.insertNode(copyWrapper[0]).selectNode(copyWrapper[0]);
+			return self;
+		}
+		range.enlarge();
+		var bookmark = range.createBookmark(), ancestor = range.commonAncestor(), isStart = false;
+		K(ancestor).scan(function(node) {
+			if (!isStart && node == bookmark.start) {
+				isStart = true;
+				return;
+			}
+			if (isStart) {
+				if (node == bookmark.end) {
+					return false;
+				}
+				var knode = K(node);
+				if (_inPreElement(knode)) {
+					return;
+				}
+				if (knode.type == 3 && _trim(node.nodeValue).length > 0) {
+					var parent;
+					while ((parent = knode.parent()) && parent.isStyle() && parent.children().length == 1) {
+						knode = parent;
+					}
+					_wrapNode(knode, wrapper);
+				}
+			}
+		});
+		range.moveToBookmark(bookmark);
+		return self;
+	},
+	split : function(isStart, map) {
+		var range = this.range, doc = range.doc;
+		var tempRange = range.cloneRange().collapse(isStart);
+		var node = tempRange.startContainer, pos = tempRange.startOffset,
+			parent = node.nodeType == 3 ? node.parentNode : node,
+			needSplit = false, knode;
+		while (parent && parent.parentNode) {
+			knode = K(parent);
+			if (map) {
+				if (!knode.isStyle()) {
+					break;
+				}
+				if (!_hasAttrOrCss(knode, map)) {
+					break;
+				}
+			} else {
+				if (_NOSPLIT_TAG_MAP[knode.name]) {
+					break;
+				}
+			}
+			needSplit = true;
+			parent = parent.parentNode;
+		}
+		if (needSplit) {
+			var dummy = doc.createElement('span');
+			range.cloneRange().collapse(!isStart).insertNode(dummy);
+			if (isStart) {
+				tempRange.setStartBefore(parent.firstChild).setEnd(node, pos);
+			} else {
+				tempRange.setStart(node, pos).setEndAfter(parent.lastChild);
+			}
+			var frag = tempRange.extractContents(),
+				first = frag.firstChild, last = frag.lastChild;
+			if (isStart) {
+				tempRange.insertNode(frag);
+				range.setStartAfter(last).setEndBefore(dummy);
+			} else {
+				parent.appendChild(frag);
+				range.setStartBefore(dummy).setEndBefore(first);
+			}
+			var dummyParent = dummy.parentNode;
+			if (dummyParent == range.endContainer) {
+				var prev = K(dummy).prev(), next = K(dummy).next();
+				if (prev && next && prev.type == 3 && next.type == 3) {
+					range.setEnd(prev[0], prev[0].nodeValue.length);
+				} else if (!isStart) {
+					range.setEnd(range.endContainer, range.endOffset - 1);
+				}
+			}
+			dummyParent.removeChild(dummy);
+		}
+		return this;
+	},
+	remove : function(map) {
+		var self = this, doc = self.doc, range = self.range;
+		range.enlarge();
+		if (range.startOffset === 0) {
+			var ksc = K(range.startContainer), parent;
+			while ((parent = ksc.parent()) && parent.isStyle() && parent.children().length == 1) {
+				ksc = parent;
+			}
+			range.setStart(ksc[0], 0);
+			ksc = K(range.startContainer);
+			if (ksc.isBlock()) {
+				_removeAttrOrCss(ksc, map);
+			}
+			var kscp = ksc.parent();
+			if (kscp && kscp.isBlock()) {
+				_removeAttrOrCss(kscp, map);
+			}
+		}
+		var sc, so;
+		if (range.collapsed) {
+			self.split(true, map);
+			sc = range.startContainer;
+			so = range.startOffset;
+			if (so > 0) {
+				var sb = K(sc.childNodes[so - 1]);
+				if (sb && _isEmptyNode(sb)) {
+					sb.remove();
+					range.setStart(sc, so - 1);
+				}
+			}
+			var sa = K(sc.childNodes[so]);
+			if (sa && _isEmptyNode(sa)) {
+				sa.remove();
+			}
+			if (_isEmptyNode(sc)) {
+				range.startBefore(sc);
+				sc.remove();
+			}
+			range.collapse(true);
+			return self;
+		}
+		self.split(true, map);
+		self.split(false, map);
+		var startDummy = doc.createElement('span'), endDummy = doc.createElement('span');
+		range.cloneRange().collapse(false).insertNode(endDummy);
+		range.cloneRange().collapse(true).insertNode(startDummy);
+		var nodeList = [], cmpStart = false;
+		K(range.commonAncestor()).scan(function(node) {
+			if (!cmpStart && node == startDummy) {
+				cmpStart = true;
+				return;
+			}
+			if (node == endDummy) {
+				return false;
+			}
+			if (cmpStart) {
+				nodeList.push(node);
+			}
+		});
+		K(startDummy).remove();
+		K(endDummy).remove();
+		sc = range.startContainer;
+		so = range.startOffset;
+		var ec = range.endContainer, eo = range.endOffset;
+		if (so > 0) {
+			var startBefore = K(sc.childNodes[so - 1]);
+			if (startBefore && _isEmptyNode(startBefore)) {
+				startBefore.remove();
+				range.setStart(sc, so - 1);
+				if (sc == ec) {
+					range.setEnd(ec, eo - 1);
+				}
+			}
+			var startAfter = K(sc.childNodes[so]);
+			if (startAfter && _isEmptyNode(startAfter)) {
+				startAfter.remove();
+				if (sc == ec) {
+					range.setEnd(ec, eo - 1);
+				}
+			}
+		}
+		var endAfter = K(ec.childNodes[range.endOffset]);
+		if (endAfter && _isEmptyNode(endAfter)) {
+			endAfter.remove();
+		}
+		var bookmark = range.createBookmark(true);
+		_each(nodeList, function(i, node) {
+			_removeAttrOrCss(K(node), map);
+		});
+		range.moveToBookmark(bookmark);
+		return self;
+	},
+	commonNode : function(map) {
+		var range = this.range;
+		var ec = range.endContainer, eo = range.endOffset,
+			node = (ec.nodeType == 3 || eo === 0) ? ec : ec.childNodes[eo - 1];
+		function find(node) {
+			var child = node, parent = node;
+			while (parent) {
+				if (_hasAttrOrCss(K(parent), map)) {
+					return K(parent);
+				}
+				parent = parent.parentNode;
+			}
+			while (child && (child = child.lastChild)) {
+				if (_hasAttrOrCss(K(child), map)) {
+					return K(child);
+				}
+			}
+			return null;
+		}
+		var cNode = find(node);
+		if (cNode) {
+			return cNode;
+		}
+		if (node.nodeType == 1 || (ec.nodeType == 3 && eo === 0)) {
+			var prev = K(node).prev();
+			if (prev) {
+				return find(prev);
+			}
+		}
+		return null;
+	},
+	commonAncestor : function(tagName) {
+		var range = this.range,
+			sc = range.startContainer, so = range.startOffset,
+			ec = range.endContainer, eo = range.endOffset,
+			startNode = (sc.nodeType == 3 || so === 0) ? sc : sc.childNodes[so - 1],
+			endNode = (ec.nodeType == 3 || eo === 0) ? ec : ec.childNodes[eo - 1];
+		function find(node) {
+			while (node) {
+				if (node.nodeType == 1) {
+					if (node.tagName.toLowerCase() === tagName) {
+						return node;
+					}
+				}
+				node = node.parentNode;
+			}
+			return null;
+		}
+		var start = find(startNode), end = find(endNode);
+		if (start && end && start === end) {
+			return K(start);
+		}
+		return null;
+	},
+	state : function(key) {
+		var self = this, doc = self.doc, bool = false;
+		try {
+			bool = doc.queryCommandState(key);
+		} catch (e) {}
+		return bool;
+	},
+	val : function(key) {
+		var self = this, doc = self.doc, range = self.range;
+		function lc(val) {
+			return val.toLowerCase();
+		}
+		key = lc(key);
+		var val = '', knode;
+		if (key === 'fontfamily' || key === 'fontname') {
+			val = _nativeCommandValue(doc, 'fontname');
+			val = val.replace(/['"]/g, '');
+			return lc(val);
+		}
+		if (key === 'formatblock') {
+			val = _nativeCommandValue(doc, key);
+			if (val === '') {
+				knode = self.commonNode({'h1,h2,h3,h4,h5,h6,p,div,pre,address' : '*'});
+				if (knode) {
+					val = knode.name;
+				}
+			}
+			if (val === 'Normal') {
+				val = 'p';
+			}
+			return lc(val);
+		}
+		if (key === 'fontsize') {
+			knode = self.commonNode({'*' : '.font-size'});
+			if (knode) {
+				val = knode.css('font-size');
+			}
+			return lc(val);
+		}
+		if (key === 'forecolor') {
+			knode = self.commonNode({'*' : '.color'});
+			if (knode) {
+				val = knode.css('color');
+			}
+			val = _toHex(val);
+			if (val === '') {
+				val = 'default';
+			}
+			return lc(val);
+		}
+		if (key === 'hilitecolor') {
+			knode = self.commonNode({'*' : '.background-color'});
+			if (knode) {
+				val = knode.css('background-color');
+			}
+			val = _toHex(val);
+			if (val === '') {
+				val = 'default';
+			}
+			return lc(val);
+		}
+		return val;
+	},
+	toggle : function(wrapper, map) {
+		var self = this;
+		if (self.commonNode(map)) {
+			self.remove(map);
+		} else {
+			self.wrap(wrapper);
+		}
+		return self.select();
+	},
+	bold : function() {
+		return this.toggle('<strong></strong>', {
+			span : '.font-weight=bold',
+			strong : '*',
+			b : '*'
+		});
+	},
+	italic : function() {
+		return this.toggle('<em></em>', {
+			span : '.font-style=italic',
+			em : '*',
+			i : '*'
+		});
+	},
+	underline : function() {
+		return this.toggle('<u></u>', {
+			span : '.text-decoration=underline',
+			u : '*'
+		});
+	},
+	strikethrough : function() {
+		return this.toggle('<s></s>', {
+			span : '.text-decoration=line-through',
+			s : '*'
+		});
+	},
+	forecolor : function(val) {
+		return this.toggle('<span style="color:' + val + ';"></span>', {
+			span : '.color=' + val,
+			font : 'color'
+		});
+	},
+	hilitecolor : function(val) {
+		return this.toggle('<span style="background-color:' + val + ';"></span>', {
+			span : '.background-color=' + val
+		});
+	},
+	fontsize : function(val) {
+		return this.toggle('<span style="font-size:' + val + ';"></span>', {
+			span : '.font-size=' + val,
+			font : 'size'
+		});
+	},
+	fontname : function(val) {
+		return this.fontfamily(val);
+	},
+	fontfamily : function(val) {
+		return this.toggle('<span style="font-family:' + val + ';"></span>', {
+			span : '.font-family=' + val,
+			font : 'face'
+		});
+	},
+	removeformat : function() {
+		var map = {
+			'*' : '.font-weight,.font-style,.text-decoration,.color,.background-color,.font-size,.font-family,.text-indent'
+		},
+		tags = _STYLE_TAG_MAP;
+		_each(tags, function(key, val) {
+			map[key] = '*';
+		});
+		this.remove(map);
+		return this.select();
+	},
+	inserthtml : function(val, quickMode) {
+		var self = this, range = self.range;
+		if (val === '') {
+			return self;
+		}
+		function pasteHtml(range, val) {
+			val = '<img id="__kindeditor_temp_tag__" width="0" height="0" style="display:none;" />' + val;
+			var rng = range.get();
+			if (rng.item) {
+				rng.item(0).outerHTML = val;
+			} else {
+				rng.pasteHTML(val);
+			}
+			var temp = range.doc.getElementById('__kindeditor_temp_tag__');
+			temp.parentNode.removeChild(temp);
+			var newRange = _toRange(rng);
+			range.setEnd(newRange.endContainer, newRange.endOffset);
+			range.collapse(false);
+			self.select(false);
+		}
+		function insertHtml(range, val) {
+			var doc = range.doc,
+				frag = doc.createDocumentFragment();
+			K('@' + val, doc).each(function() {
+				frag.appendChild(this);
+			});
+			range.deleteContents();
+			range.insertNode(frag);
+			range.collapse(false);
+			self.select(false);
+		}
+		if (_IE && quickMode) {
+			try {
+				pasteHtml(range, val);
+			} catch(e) {
+				insertHtml(range, val);
+			}
+			return self;
+		}
+		insertHtml(range, val);
+		return self;
+	},
+	hr : function() {
+		return this.inserthtml('<hr />');
+	},
+	print : function() {
+		this.win.print();
+		return this;
+	},
+	insertimage : function(url, title, width, height, border, align) {
+		title = _undef(title, '');
+		border = _undef(border, 0);
+		var html = '<img src="' + _escape(url) + '" data-ke-src="' + _escape(url) + '" ';
+		if (width) {
+			html += 'width="' + _escape(width) + '" ';
+		}
+		if (height) {
+			html += 'height="' + _escape(height) + '" ';
+		}
+		if (title) {
+			html += 'title="' + _escape(title) + '" ';
+		}
+		if (align) {
+			html += 'align="' + _escape(align) + '" ';
+		}
+		html += 'alt="' + _escape(title) + '" ';
+		html += '/>';
+		return this.inserthtml(html);
+	},
+	createlink : function(url, type) {
+		var self = this, doc = self.doc, range = self.range;
+		self.select();
+		var a = self.commonNode({ a : '*' });
+		if (a && !range.isControl()) {
+			range.selectNode(a.get());
+			self.select();
+		}
+		var html = '<a href="' + _escape(url) + '" data-ke-src="' + _escape(url) + '" ';
+		if (type) {
+			html += ' target="' + _escape(type) + '"';
+		}
+		if (range.collapsed) {
+			html += '>' + _escape(url) + '</a>';
+			return self.inserthtml(html);
+		}
+		if (range.isControl()) {
+			var node = K(range.startContainer.childNodes[range.startOffset]);
+			html += '></a>';
+			node.after(K(html, doc));
+			node.next().append(node);
+			range.selectNode(node[0]);
+			return self.select();
+		}
+		_nativeCommand(doc, 'createlink', '__kindeditor_temp_url__');
+		K('a[href="__kindeditor_temp_url__"]', doc).each(function() {
+			K(this).attr('href', url).attr('data-ke-src', url);
+			if (type) {
+				K(this).attr('target', type);
+			} else {
+				K(this).removeAttr('target');
+			}
+		});
+		return self;
+	},
+	unlink : function() {
+		var self = this, doc = self.doc, range = self.range;
+		self.select();
+		if (range.collapsed) {
+			var a = self.commonNode({ a : '*' });
+			if (a) {
+				range.selectNode(a.get());
+				self.select();
+			}
+			_nativeCommand(doc, 'unlink', null);
+			if (_WEBKIT && K(range.startContainer).name === 'img') {
+				var parent = K(range.startContainer).parent();
+				if (parent.name === 'a') {
+					parent.remove(true);
+				}
+			}
+		} else {
+			_nativeCommand(doc, 'unlink', null);
+		}
+		return self;
+	}
+});
+_each(('formatblock,selectall,justifyleft,justifycenter,justifyright,justifyfull,insertorderedlist,' +
+	'insertunorderedlist,indent,outdent,subscript,superscript').split(','), function(i, name) {
+	KCmd.prototype[name] = function(val) {
+		var self = this;
+		self.select();
+		_nativeCommand(self.doc, name, val);
+		if (!_IE || _inArray(name, 'formatblock,selectall,insertorderedlist,insertunorderedlist'.split(',')) >= 0) {
+			self.selection();
+		}
+		return self;
+	};
+});
+_each('cut,copy,paste'.split(','), function(i, name) {
+	KCmd.prototype[name] = function() {
+		var self = this;
+		if (!self.doc.queryCommandSupported(name)) {
+			throw 'not supported';
+		}
+		self.select();
+		_nativeCommand(self.doc, name, null);
+		return self;
+	};
+});
+function _cmd(mixed) {
+	if (mixed.nodeName) {
+		var doc = _getDoc(mixed);
+		mixed = _range(doc).selectNodeContents(doc.body).collapse(false);
+	}
+	return new KCmd(mixed);
+}
+K.CmdClass = KCmd;
+K.cmd = _cmd;
+function _drag(options) {
+	var moveEl = options.moveEl,
+		moveFn = options.moveFn,
+		clickEl = options.clickEl || moveEl,
+		beforeDrag = options.beforeDrag,
+		iframeFix = options.iframeFix === undefined ? true : options.iframeFix;
+	var docs = [document];
+	if (iframeFix) {
+		K('iframe').each(function() {
+			var src = _formatUrl(this.src || '', 'absolute');
+			if (/^https?:\/\//.test(src)) {
+				return;
+			}
+			var doc;
+			try {
+				doc = _iframeDoc(this);
+			} catch(e) {}
+			if (doc) {
+				var pos = K(this).pos();
+				K(doc).data('pos-x', pos.x);
+				K(doc).data('pos-y', pos.y);
+				docs.push(doc);
+			}
+		});
+	}
+	clickEl.mousedown(function(e) {
+		e.stopPropagation();
+		var self = clickEl.get(),
+			x = _removeUnit(moveEl.css('left')),
+			y = _removeUnit(moveEl.css('top')),
+			width = moveEl.width(),
+			height = moveEl.height(),
+			pageX = e.pageX,
+			pageY = e.pageY;
+		if (beforeDrag) {
+			beforeDrag();
+		}
+		function moveListener(e) {
+			e.preventDefault();
+			var kdoc = K(_getDoc(e.target));
+			var diffX = _round((kdoc.data('pos-x') || 0) + e.pageX - pageX);
+			var diffY = _round((kdoc.data('pos-y') || 0) + e.pageY - pageY);
+			moveFn.call(clickEl, x, y, width, height, diffX, diffY);
+		}
+		function selectListener(e) {
+			e.preventDefault();
+		}
+		function upListener(e) {
+			e.preventDefault();
+			K(docs).unbind('mousemove', moveListener)
+				.unbind('mouseup', upListener)
+				.unbind('selectstart', selectListener);
+			if (self.releaseCapture) {
+				self.releaseCapture();
+			}
+		}
+		K(docs).mousemove(moveListener)
+			.mouseup(upListener)
+			.bind('selectstart', selectListener);
+		if (self.setCapture) {
+			self.setCapture();
+		}
+	});
+}
+function KWidget(options) {
+	this.init(options);
+}
+_extend(KWidget, {
+	init : function(options) {
+		var self = this;
+		self.name = options.name || '';
+		self.doc = options.doc || document;
+		self.win = _getWin(self.doc);
+		self.x = _addUnit(options.x);
+		self.y = _addUnit(options.y);
+		self.z = options.z;
+		self.width = _addUnit(options.width);
+		self.height = _addUnit(options.height);
+		self.div = K('<div style="display:block;"></div>');
+		self.options = options;
+		self._alignEl = options.alignEl;
+		if (self.width) {
+			self.div.css('width', self.width);
+		}
+		if (self.height) {
+			self.div.css('height', self.height);
+		}
+		if (self.z) {
+			self.div.css({
+				position : 'absolute',
+				left : self.x,
+				top : self.y,
+				'z-index' : self.z
+			});
+		}
+		if (self.z && (self.x === undefined || self.y === undefined)) {
+			self.autoPos(self.width, self.height);
+		}
+		if (options.cls) {
+			self.div.addClass(options.cls);
+		}
+		if (options.shadowMode) {
+			self.div.addClass('ke-shadow');
+		}
+		if (options.css) {
+			self.div.css(options.css);
+		}
+		if (options.src) {
+			K(options.src).replaceWith(self.div);
+		} else {
+			K(self.doc.body).append(self.div);
+		}
+		if (options.html) {
+			self.div.html(options.html);
+		}
+		if (options.autoScroll) {
+			if (_IE && _V < 7 || _QUIRKS) {
+				var scrollPos = _getScrollPos();
+				K(self.win).bind('scroll', function(e) {
+					var pos = _getScrollPos(),
+						diffX = pos.x - scrollPos.x,
+						diffY = pos.y - scrollPos.y;
+					self.pos(_removeUnit(self.x) + diffX, _removeUnit(self.y) + diffY, false);
+				});
+			} else {
+				self.div.css('position', 'fixed');
+			}
+		}
+	},
+	pos : function(x, y, updateProp) {
+		var self = this;
+		updateProp = _undef(updateProp, true);
+		if (x !== null) {
+			x = x < 0 ? 0 : _addUnit(x);
+			self.div.css('left', x);
+			if (updateProp) {
+				self.x = x;
+			}
+		}
+		if (y !== null) {
+			y = y < 0 ? 0 : _addUnit(y);
+			self.div.css('top', y);
+			if (updateProp) {
+				self.y = y;
+			}
+		}
+		return self;
+	},
+	autoPos : function(width, height) {
+		var self = this,
+			w = _removeUnit(width) || 0,
+			h = _removeUnit(height) || 0,
+			scrollPos = _getScrollPos();
+		if (self._alignEl) {
+			var knode = K(self._alignEl),
+				pos = knode.pos(),
+				diffX = _round(knode[0].clientWidth / 2 - w / 2),
+				diffY = _round(knode[0].clientHeight / 2 - h / 2);
+			x = diffX < 0 ? pos.x : pos.x + diffX;
+			y = diffY < 0 ? pos.y : pos.y + diffY;
+		} else {
+			var docEl = _docElement(self.doc);
+			x = _round(scrollPos.x + (docEl.clientWidth - w) / 2);
+			y = _round(scrollPos.y + (docEl.clientHeight - h) / 2);
+		}
+		if (!(_IE && _V < 7 || _QUIRKS)) {
+			x -= scrollPos.x;
+			y -= scrollPos.y;
+		}
+		return self.pos(x, y);
+	},
+	remove : function() {
+		var self = this;
+		if (_IE && _V < 7 || _QUIRKS) {
+			K(self.win).unbind('scroll');
+		}
+		self.div.remove();
+		_each(self, function(i) {
+			self[i] = null;
+		});
+		return this;
+	},
+	show : function() {
+		this.div.show();
+		return this;
+	},
+	hide : function() {
+		this.div.hide();
+		return this;
+	},
+	draggable : function(options) {
+		var self = this;
+		options = options || {};
+		options.moveEl = self.div;
+		options.moveFn = function(x, y, width, height, diffX, diffY) {
+			if ((x = x + diffX) < 0) {
+				x = 0;
+			}
+			if ((y = y + diffY) < 0) {
+				y = 0;
+			}
+			self.pos(x, y);
+		};
+		_drag(options);
+		return self;
+	}
+});
+function _widget(options) {
+	return new KWidget(options);
+}
+K.WidgetClass = KWidget;
+K.widget = _widget;
+function _iframeDoc(iframe) {
+	iframe = _get(iframe);
+	return iframe.contentDocument || iframe.contentWindow.document;
+}
+var html, _direction = '';
+if ((html = document.getElementsByTagName('html'))) {
+	_direction = html[0].dir;
+}
+function _getInitHtml(themesPath, bodyClass, cssPath, cssData) {
+	var arr = [
+		(_direction === '' ? '<html>' : '<html dir="' + _direction + '">'),
+		'<head><meta charset="utf-8" /><title></title>',
+		'<style>',
+		'html {margin:0;padding:0;}',
+		'body {margin:0;padding:5px;}',
+		'body, td {font:12px/1.5 "sans serif",tahoma,verdana,helvetica;}',
+		'body, p, div {word-wrap: break-word;}',
+		'p {margin:5px 0;}',
+		'table {border-collapse:collapse;}',
+		'img {border:0;}',
+		'noscript {display:none;}',
+		'table.ke-zeroborder td {border:1px dotted #AAA;}',
+		'img.ke-flash {',
+		'	border:1px solid #AAA;',
+		'	background-image:url(' + themesPath + 'common/flash.gif);',
+		'	background-position:center center;',
+		'	background-repeat:no-repeat;',
+		'	width:100px;',
+		'	height:100px;',
+		'}',
+		'img.ke-rm {',
+		'	border:1px solid #AAA;',
+		'	background-image:url(' + themesPath + 'common/rm.gif);',
+		'	background-position:center center;',
+		'	background-repeat:no-repeat;',
+		'	width:100px;',
+		'	height:100px;',
+		'}',
+		'img.ke-media {',
+		'	border:1px solid #AAA;',
+		'	background-image:url(' + themesPath + 'common/media.gif);',
+		'	background-position:center center;',
+		'	background-repeat:no-repeat;',
+		'	width:100px;',
+		'	height:100px;',
+		'}',
+		'img.ke-anchor {',
+		'	border:1px dashed #666;',
+		'	width:16px;',
+		'	height:16px;',
+		'}',
+		'.ke-script, .ke-noscript, .ke-display-none {',
+		'	display:none;',
+		'	font-size:0;',
+		'	width:0;',
+		'	height:0;',
+		'}',
+		'.ke-pagebreak {',
+		'	border:1px dotted #AAA;',
+		'	font-size:0;',
+		'	height:2px;',
+		'}',
+		'</style>'
+	];
+	if (!_isArray(cssPath)) {
+		cssPath = [cssPath];
+	}
+	_each(cssPath, function(i, path) {
+		if (path) {
+			arr.push('<link href="' + path + '" rel="stylesheet" />');
+		}
+	});
+	if (cssData) {
+		arr.push('<style>' + cssData + '</style>');
+	}
+	arr.push('</head><body ' + (bodyClass ? 'class="' + bodyClass + '"' : '') + '></body></html>');
+	return arr.join('\n');
+}
+function _elementVal(knode, val) {
+	if (knode.hasVal()) {
+		if (val === undefined) {
+			var html = knode.val();
+			html = html.replace(/(<(?:p|p\s[^>]*)>) *(<\/p>)/ig, '');
+			return html;
+		}
+		return knode.val(val);
+	}
+	return knode.html(val);
+}
+function KEdit(options) {
+	this.init(options);
+}
+_extend(KEdit, KWidget, {
+	init : function(options) {
+		var self = this;
+		KEdit.parent.init.call(self, options);
+		self.srcElement = K(options.srcElement);
+		self.div.addClass('ke-edit');
+		self.designMode = _undef(options.designMode, true);
+		self.beforeGetHtml = options.beforeGetHtml;
+		self.beforeSetHtml = options.beforeSetHtml;
+		self.afterSetHtml = options.afterSetHtml;
+		var themesPath = _undef(options.themesPath, ''),
+			bodyClass = options.bodyClass,
+			cssPath = options.cssPath,
+			cssData = options.cssData,
+			isDocumentDomain = location.host.replace(/:\d+/, '') !== document.domain,
+			srcScript = ('document.open();' +
+				(isDocumentDomain ? 'document.domain="' + document.domain + '";' : '') +
+				'document.close();'),
+			iframeSrc = _IE ? ' src="javascript:void(function(){' + encodeURIComponent(srcScript) + '}())"' : '';
+		self.iframe = K('<iframe class="ke-edit-iframe" hidefocus="true" frameborder="0"' + iframeSrc + '></iframe>').css('width', '100%');
+		self.textarea = K('<textarea class="ke-edit-textarea" hidefocus="true"></textarea>').css('width', '100%');
+		if (self.width) {
+			self.setWidth(self.width);
+		}
+		if (self.height) {
+			self.setHeight(self.height);
+		}
+		if (self.designMode) {
+			self.textarea.hide();
+		} else {
+			self.iframe.hide();
+		}
+		function ready() {
+			var doc = _iframeDoc(self.iframe);
+			doc.open();
+			if (isDocumentDomain) {
+				doc.domain = document.domain;
+			}
+			doc.write(_getInitHtml(themesPath, bodyClass, cssPath, cssData));
+			doc.close();
+			self.win = self.iframe[0].contentWindow;
+			self.doc = doc;
+			var cmd = _cmd(doc);
+			self.afterChange(function(e) {
+				cmd.selection();
+			});
+			if (_WEBKIT) {
+				K(doc).click(function(e) {
+					if (K(e.target).name === 'img') {
+						cmd.selection(true);
+						cmd.range.selectNode(e.target);
+						cmd.select();
+					}
+				});
+			}
+			if (_IE) {
+				self._mousedownHandler = function() {
+					var newRange = cmd.range.cloneRange();
+					newRange.shrink();
+					if (newRange.isControl()) {
+						self.blur();
+					}
+				};
+				K(document).mousedown(self._mousedownHandler);
+				K(doc).keydown(function(e) {
+					if (e.which == 8) {
+						cmd.selection();
+						var rng = cmd.range;
+						if (rng.isControl()) {
+							rng.collapse(true);
+							K(rng.startContainer.childNodes[rng.startOffset]).remove();
+							e.preventDefault();
+						}
+					}
+				});
+			}
+			self.cmd = cmd;
+			self.html(_elementVal(self.srcElement));
+			if (_IE) {
+				doc.body.disabled = true;
+				doc.body.contentEditable = true;
+				doc.body.removeAttribute('disabled');
+			} else {
+				doc.designMode = 'on';
+			}
+			if (options.afterCreate) {
+				options.afterCreate.call(self);
+			}
+		}
+		if (isDocumentDomain) {
+			self.iframe.bind('load', function(e) {
+				self.iframe.unbind('load');
+				if (_IE) {
+					ready();
+				} else {
+					setTimeout(ready, 0);
+				}
+			});
+		}
+		self.div.append(self.iframe);
+		self.div.append(self.textarea);
+		self.srcElement.hide();
+		!isDocumentDomain && ready();
+	},
+	setWidth : function(val) {
+		this.div.css('width', _addUnit(val));
+		return this;
+	},
+	setHeight : function(val) {
+		var self = this;
+		val = _addUnit(val);
+		self.div.css('height', val);
+		self.iframe.css('height', val);
+		if ((_IE && _V < 8) || _QUIRKS) {
+			val = _addUnit(_removeUnit(val) - 2);
+		}
+		self.textarea.css('height', val);
+		return self;
+	},
+	remove : function() {
+		var self = this, doc = self.doc;
+		K(doc.body).unbind();
+		K(doc).unbind();
+		K(self.win).unbind();
+		if (self._mousedownHandler) {
+			K(document).unbind('mousedown', self._mousedownHandler);
+		}
+		_elementVal(self.srcElement, self.html());
+		self.srcElement.show();
+		doc.write('');
+		self.iframe.unbind();
+		self.textarea.unbind();
+		KEdit.parent.remove.call(self);
+	},
+	html : function(val, isFull) {
+		var self = this, doc = self.doc;
+		if (self.designMode) {
+			var body = doc.body;
+			if (val === undefined) {
+				if (isFull) {
+					val = '<!doctype html><html>' + body.parentNode.innerHTML + '</html>';
+				} else {
+					val = body.innerHTML;
+				}
+				if (self.beforeGetHtml) {
+					val = self.beforeGetHtml(val);
+				}
+				if (_GECKO && val == '<br />') {
+					val = '';
+				}
+				return val;
+			}
+			if (self.beforeSetHtml) {
+				val = self.beforeSetHtml(val);
+			}
+			if (_IE && _V >= 9) {
+				val = val.replace(/(<.*?checked=")checked(".*>)/ig, '$1$2');
+			}
+			K(body).html(val);
+			if (self.afterSetHtml) {
+				self.afterSetHtml();
+			}
+			return self;
+		}
+		if (val === undefined) {
+			return self.textarea.val();
+		}
+		self.textarea.val(val);
+		return self;
+	},
+	design : function(bool) {
+		var self = this, val;
+		if (bool === undefined ? !self.designMode : bool) {
+			if (!self.designMode) {
+				val = self.html();
+				self.designMode = true;
+				self.html(val);
+				self.textarea.hide();
+				self.iframe.show();
+			}
+		} else {
+			if (self.designMode) {
+				val = self.html();
+				self.designMode = false;
+				self.html(val);
+				self.iframe.hide();
+				self.textarea.show();
+			}
+		}
+		return self.focus();
+	},
+	focus : function() {
+		var self = this;
+		self.designMode ? self.win.focus() : self.textarea[0].focus();
+		return self;
+	},
+	blur : function() {
+		var self = this;
+		if (_IE) {
+			var input = K('<input type="text" style="float:left;width:0;height:0;padding:0;margin:0;border:0;" value="" />', self.div);
+			self.div.append(input);
+			input[0].focus();
+			input.remove();
+		} else {
+			self.designMode ? self.win.blur() : self.textarea[0].blur();
+		}
+		return self;
+	},
+	afterChange : function(fn) {
+		var self = this, doc = self.doc, body = doc.body;
+		K(doc).keyup(function(e) {
+			if (!e.ctrlKey && !e.altKey && _CHANGE_KEY_MAP[e.which]) {
+				fn(e);
+			}
+		});
+		K(doc).mouseup(fn).contextmenu(fn);
+		K(self.win).blur(fn);
+		function timeoutHandler(e) {
+			setTimeout(function() {
+				fn(e);
+			}, 1);
+		}
+		K(body).bind('paste', timeoutHandler);
+		K(body).bind('cut', timeoutHandler);
+		return self;
+	}
+});
+function _edit(options) {
+	return new KEdit(options);
+}
+K.EditClass = KEdit;
+K.edit = _edit;
+K.iframeDoc = _iframeDoc;
+function _selectToolbar(name, fn) {
+	var self = this,
+		knode = self.get(name);
+	if (knode) {
+		if (knode.hasClass('ke-disabled')) {
+			return;
+		}
+		fn(knode);
+	}
+}
+function KToolbar(options) {
+	this.init(options);
+}
+_extend(KToolbar, KWidget, {
+	init : function(options) {
+		var self = this;
+		KToolbar.parent.init.call(self, options);
+		self.disableMode = _undef(options.disableMode, false);
+		self.noDisableItemMap = _toMap(_undef(options.noDisableItems, []));
+		self._itemMap = {};
+		self.div.addClass('ke-toolbar').bind('contextmenu,mousedown,mousemove', function(e) {
+			e.preventDefault();
+		}).attr('unselectable', 'on');
+		function find(target) {
+			var knode = K(target);
+			if (knode.hasClass('ke-outline')) {
+				return knode;
+			}
+			if (knode.hasClass('ke-toolbar-icon')) {
+				return knode.parent();
+			}
+		}
+		function hover(e, method) {
+			var knode = find(e.target);
+			if (knode) {
+				if (knode.hasClass('ke-disabled')) {
+					return;
+				}
+				if (knode.hasClass('ke-selected')) {
+					return;
+				}
+				knode[method]('ke-on');
+			}
+		}
+		self.div.mouseover(function(e) {
+			hover(e, 'addClass');
+		})
+		.mouseout(function(e) {
+			hover(e, 'removeClass');
+		})
+		.click(function(e) {
+			var knode = find(e.target);
+			if (knode) {
+				if (knode.hasClass('ke-disabled')) {
+					return;
+				}
+				self.options.click.call(this, e, knode.attr('data-name'));
+			}
+		});
+	},
+	get : function(name) {
+		if (this._itemMap[name]) {
+			return this._itemMap[name];
+		}
+		return (this._itemMap[name] = K('span.ke-icon-' + name, this.div).parent());
+	},
+	select : function(name) {
+		_selectToolbar.call(this, name, function(knode) {
+			knode.addClass('ke-selected');
+		});
+		return self;
+	},
+	unselect : function(name) {
+		_selectToolbar.call(this, name, function(knode) {
+			knode.removeClass('ke-selected').removeClass('ke-on');
+		});
+		return self;
+	},
+	enable : function(name) {
+		var self = this,
+			knode = name.get ? name : self.get(name);
+		if (knode) {
+			knode.removeClass('ke-disabled');
+			knode.opacity(1);
+		}
+		return self;
+	},
+	disable : function(name) {
+		var self = this,
+			knode = name.get ? name : self.get(name);
+		if (knode) {
+			knode.removeClass('ke-selected').addClass('ke-disabled');
+			knode.opacity(0.5);
+		}
+		return self;
+	},
+	disableAll : function(bool, noDisableItems) {
+		var self = this, map = self.noDisableItemMap, item;
+		if (noDisableItems) {
+			map = _toMap(noDisableItems);
+		}
+		if (bool === undefined ? !self.disableMode : bool) {
+			K('span.ke-outline', self.div).each(function() {
+				var knode = K(this),
+					name = knode[0].getAttribute('data-name', 2);
+				if (!map[name]) {
+					self.disable(knode);
+				}
+			});
+			self.disableMode = true;
+		} else {
+			K('span.ke-outline', self.div).each(function() {
+				var knode = K(this),
+					name = knode[0].getAttribute('data-name', 2);
+				if (!map[name]) {
+					self.enable(knode);
+				}
+			});
+			self.disableMode = false;
+		}
+		return self;
+	}
+});
+function _toolbar(options) {
+	return new KToolbar(options);
+}
+K.ToolbarClass = KToolbar;
+K.toolbar = _toolbar;
+function KMenu(options) {
+	this.init(options);
+}
+_extend(KMenu, KWidget, {
+	init : function(options) {
+		var self = this;
+		options.z = options.z || 811213;
+		KMenu.parent.init.call(self, options);
+		self.centerLineMode = _undef(options.centerLineMode, true);
+		self.div.addClass('ke-menu').bind('click,mousedown', function(e){
+			e.stopPropagation();
+		}).attr('unselectable', 'on');
+	},
+	addItem : function(item) {
+		var self = this;
+		if (item.title === '-') {
+			self.div.append(K('<div class="ke-menu-separator"></div>'));
+			return;
+		}
+		var itemDiv = K('<div class="ke-menu-item" unselectable="on"></div>'),
+			leftDiv = K('<div class="ke-inline-block ke-menu-item-left"></div>'),
+			rightDiv = K('<div class="ke-inline-block ke-menu-item-right"></div>'),
+			height = _addUnit(item.height),
+			iconClass = _undef(item.iconClass, '');
+		self.div.append(itemDiv);
+		if (height) {
+			itemDiv.css('height', height);
+			rightDiv.css('line-height', height);
+		}
+		var centerDiv;
+		if (self.centerLineMode) {
+			centerDiv = K('<div class="ke-inline-block ke-menu-item-center"></div>');
+			if (height) {
+				centerDiv.css('height', height);
+			}
+		}
+		itemDiv.mouseover(function(e) {
+			K(this).addClass('ke-menu-item-on');
+			if (centerDiv) {
+				centerDiv.addClass('ke-menu-item-center-on');
+			}
+		})
+		.mouseout(function(e) {
+			K(this).removeClass('ke-menu-item-on');
+			if (centerDiv) {
+				centerDiv.removeClass('ke-menu-item-center-on');
+			}
+		})
+		.click(function(e) {
+			item.click.call(K(this));
+			e.stopPropagation();
+		})
+		.append(leftDiv);
+		if (centerDiv) {
+			itemDiv.append(centerDiv);
+		}
+		itemDiv.append(rightDiv);
+		if (item.checked) {
+			iconClass = 'ke-icon-checked';
+		}
+		if (iconClass !== '') {
+			leftDiv.html('<span class="ke-inline-block ke-toolbar-icon ke-toolbar-icon-url ' + iconClass + '"></span>');
+		}
+		rightDiv.html(item.title);
+		return self;
+	},
+	remove : function() {
+		var self = this;
+		if (self.options.beforeRemove) {
+			self.options.beforeRemove.call(self);
+		}
+		K('.ke-menu-item', self.div[0]).unbind();
+		KMenu.parent.remove.call(self);
+		return self;
+	}
+});
+function _menu(options) {
+	return new KMenu(options);
+}
+K.MenuClass = KMenu;
+K.menu = _menu;
+function KColorPicker(options) {
+	this.init(options);
+}
+_extend(KColorPicker, KWidget, {
+	init : function(options) {
+		var self = this;
+		options.z = options.z || 811213;
+		KColorPicker.parent.init.call(self, options);
+		var colors = options.colors || [
+			['#E53333', '#E56600', '#FF9900', '#64451D', '#DFC5A4', '#FFE500'],
+			['#009900', '#006600', '#99BB00', '#B8D100', '#60D978', '#00D5FF'],
+			['#337FE5', '#003399', '#4C33E5', '#9933E5', '#CC33E5', '#EE33EE'],
+			['#FFFFFF', '#CCCCCC', '#999999', '#666666', '#333333', '#000000']
+		];
+		self.selectedColor = (options.selectedColor || '').toLowerCase();
+		self._cells = [];
+		self.div.addClass('ke-colorpicker').bind('click,mousedown', function(e){
+			e.stopPropagation();
+		}).attr('unselectable', 'on');
+		var table = self.doc.createElement('table');
+		self.div.append(table);
+		table.className = 'ke-colorpicker-table';
+		table.cellPadding = 0;
+		table.cellSpacing = 0;
+		table.border = 0;
+		var row = table.insertRow(0), cell = row.insertCell(0);
+		cell.colSpan = colors[0].length;
+		self._addAttr(cell, '', 'ke-colorpicker-cell-top');
+		for (var i = 0; i < colors.length; i++) {
+			row = table.insertRow(i + 1);
+			for (var j = 0; j < colors[i].length; j++) {
+				cell = row.insertCell(j);
+				self._addAttr(cell, colors[i][j], 'ke-colorpicker-cell');
+			}
+		}
+	},
+	_addAttr : function(cell, color, cls) {
+		var self = this;
+		cell = K(cell).addClass(cls);
+		if (self.selectedColor === color.toLowerCase()) {
+			cell.addClass('ke-colorpicker-cell-selected');
+		}
+		cell.attr('title', color || self.options.noColor);
+		cell.mouseover(function(e) {
+			K(this).addClass('ke-colorpicker-cell-on');
+		});
+		cell.mouseout(function(e) {
+			K(this).removeClass('ke-colorpicker-cell-on');
+		});
+		cell.click(function(e) {
+			e.stop();
+			self.options.click.call(K(this), color);
+		});
+		if (color) {
+			cell.append(K('<div class="ke-colorpicker-cell-color" unselectable="on"></div>').css('background-color', color));
+		} else {
+			cell.html(self.options.noColor);
+		}
+		K(cell).attr('unselectable', 'on');
+		self._cells.push(cell);
+	},
+	remove : function() {
+		var self = this;
+		_each(self._cells, function() {
+			this.unbind();
+		});
+		KColorPicker.parent.remove.call(self);
+		return self;
+	}
+});
+function _colorpicker(options) {
+	return new KColorPicker(options);
+}
+K.ColorPickerClass = KColorPicker;
+K.colorpicker = _colorpicker;
+function KUploadButton(options) {
+	this.init(options);
+}
+_extend(KUploadButton, {
+	init : function(options) {
+		var self = this,
+			button = K(options.button),
+			fieldName = options.fieldName || 'file',
+			url = options.url || '',
+			title = button.val(),
+			extraParams = options.extraParams || {},
+			cls = button[0].className || '',
+			target = options.target || 'kindeditor_upload_iframe_' + new Date().getTime();
+		options.afterError = options.afterError || function(str) {
+			alert(str);
+		};
+		var hiddenElements = [];
+		for(var k in extraParams){
+			hiddenElements.push('<input type="hidden" name="' + k + '" value="' + extraParams[k] + '" />');
+		}
+		var html = [
+			'<div class="ke-inline-block ' + cls + '">',
+			(options.target ? '' : '<iframe name="' + target + '" style="display:none;"></iframe>'),
+			(options.form ? '<div class="ke-upload-area">' : '<form class="ke-upload-area ke-form" method="post" enctype="multipart/form-data" target="' + target + '" action="' + url + '">'),
+			'<span class="ke-button-common">',
+			hiddenElements.join(''),
+			'<input type="button" class="ke-button-common ke-button" value="' + title + '" />',
+			'</span>',
+			'<input type="file" class="ke-upload-file" name="' + fieldName + '" tabindex="-1" />',
+			(options.form ? '</div>' : '</form>'),
+			'</div>'].join('');
+		var div = K(html, button.doc);
+		button.hide();
+		button.before(div);
+		self.div = div;
+		self.button = button;
+		self.iframe = options.target ? K('iframe[name="' + target + '"]') : K('iframe', div);
+		self.form = options.form ? K(options.form) : K('form', div);
+		var width = options.width || K('.ke-button-common', div).width();
+		self.fileBox = K('.ke-upload-file', div).width(width);
+		self.options = options;
+	},
+	submit : function() {
+		var self = this,
+			iframe = self.iframe;
+		iframe.bind('load', function() {
+			iframe.unbind();
+			var tempForm = document.createElement('form');
+			self.fileBox.before(tempForm);
+			K(tempForm).append(self.fileBox);
+			tempForm.reset();
+			K(tempForm).remove(true);
+			var doc = K.iframeDoc(iframe),
+				pre = doc.getElementsByTagName('pre')[0],
+				str = '', data;
+			if (pre) {
+				str = pre.innerHTML;
+			} else {
+				str = doc.body.innerHTML;
+			}
+			str = _unescape(str);
+			iframe[0].src = 'javascript:false';
+			try {
+				data = K.json(str);
+			} catch (e) {
+				self.options.afterError.call(self, '<!doctype html><html>' + doc.body.parentNode.innerHTML + '</html>');
+			}
+			if (data) {
+				self.options.afterUpload.call(self, data);
+			}
+		});
+		self.form[0].submit();
+		return self;
+	},
+	remove : function() {
+		var self = this;
+		if (self.fileBox) {
+			self.fileBox.unbind();
+		}
+		self.iframe.remove();
+		self.div.remove();
+		self.button.show();
+		return self;
+	}
+});
+function _uploadbutton(options) {
+	return new KUploadButton(options);
+}
+K.UploadButtonClass = KUploadButton;
+K.uploadbutton = _uploadbutton;
+function _createButton(arg) {
+	arg = arg || {};
+	var name = arg.name || '',
+		span = K('<span class="ke-button-common ke-button-outer" title="' + name + '"></span>'),
+		btn = K('<input class="ke-button-common ke-button" type="button" value="' + name + '" />');
+	if (arg.click) {
+		btn.click(arg.click);
+	}
+	span.append(btn);
+	return span;
+}
+function KDialog(options) {
+	this.init(options);
+}
+_extend(KDialog, KWidget, {
+	init : function(options) {
+		var self = this;
+		var shadowMode = _undef(options.shadowMode, true);
+		options.z = options.z || 811213;
+		options.shadowMode = false;
+		options.autoScroll = _undef(options.autoScroll, true);
+		KDialog.parent.init.call(self, options);
+		var title = options.title,
+			body = K(options.body, self.doc),
+			previewBtn = options.previewBtn,
+			yesBtn = options.yesBtn,
+			noBtn = options.noBtn,
+			closeBtn = options.closeBtn,
+			showMask = _undef(options.showMask, true);
+		self.div.addClass('ke-dialog').bind('click,mousedown', function(e){
+			e.stopPropagation();
+		});
+		var contentDiv = K('<div class="ke-dialog-content"></div>').appendTo(self.div);
+		if (_IE && _V < 7) {
+			self.iframeMask = K('<iframe src="about:blank" class="ke-dialog-shadow"></iframe>').appendTo(self.div);
+		} else if (shadowMode) {
+			K('<div class="ke-dialog-shadow"></div>').appendTo(self.div);
+		}
+		var headerDiv = K('<div class="ke-dialog-header"></div>');
+		contentDiv.append(headerDiv);
+		headerDiv.html(title);
+		self.closeIcon = K('<span class="ke-dialog-icon-close" title="' + closeBtn.name + '"></span>').click(closeBtn.click);
+		headerDiv.append(self.closeIcon);
+		self.draggable({
+			clickEl : headerDiv,
+			beforeDrag : options.beforeDrag
+		});
+		var bodyDiv = K('<div class="ke-dialog-body"></div>');
+		contentDiv.append(bodyDiv);
+		bodyDiv.append(body);
+		var footerDiv = K('<div class="ke-dialog-footer"></div>');
+		if (previewBtn || yesBtn || noBtn) {
+			contentDiv.append(footerDiv);
+		}
+		_each([
+			{ btn : previewBtn, name : 'preview' },
+			{ btn : yesBtn, name : 'yes' },
+			{ btn : noBtn, name : 'no' }
+		], function() {
+			if (this.btn) {
+				var button = _createButton(this.btn);
+				button.addClass('ke-dialog-' + this.name);
+				footerDiv.append(button);
+			}
+		});
+		if (self.height) {
+			bodyDiv.height(_removeUnit(self.height) - headerDiv.height() - footerDiv.height());
+		}
+		self.div.width(self.div.width());
+		self.div.height(self.div.height());
+		self.mask = null;
+		if (showMask) {
+			var docEl = _docElement(self.doc),
+				docWidth = Math.max(docEl.scrollWidth, docEl.clientWidth),
+				docHeight = Math.max(docEl.scrollHeight, docEl.clientHeight);
+			self.mask = _widget({
+				x : 0,
+				y : 0,
+				z : self.z - 1,
+				cls : 'ke-dialog-mask',
+				width : docWidth,
+				height : docHeight
+			});
+		}
+		self.autoPos(self.div.width(), self.div.height());
+		self.footerDiv = footerDiv;
+		self.bodyDiv = bodyDiv;
+		self.headerDiv = headerDiv;
+		self.isLoading = false;
+	},
+	setMaskIndex : function(z) {
+		var self = this;
+		self.mask.div.css('z-index', z);
+	},
+	showLoading : function(msg) {
+		msg = _undef(msg, '');
+		var self = this, body = self.bodyDiv;
+		self.loading = K('<div class="ke-dialog-loading"><div class="ke-inline-block ke-dialog-loading-content" style="margin-top:' + Math.round(body.height() / 3) + 'px;">' + msg + '</div></div>')
+			.width(body.width()).height(body.height())
+			.css('top', self.headerDiv.height() + 'px');
+		body.css('visibility', 'hidden').after(self.loading);
+		self.isLoading = true;
+		return self;
+	},
+	hideLoading : function() {
+		this.loading && this.loading.remove();
+		this.bodyDiv.css('visibility', 'visible');
+		this.isLoading = false;
+		return this;
+	},
+	remove : function() {
+		var self = this;
+		if (self.options.beforeRemove) {
+			self.options.beforeRemove.call(self);
+		}
+		self.mask && self.mask.remove();
+		self.iframeMask && self.iframeMask.remove();
+		self.closeIcon.unbind();
+		K('input', self.div).unbind();
+		K('button', self.div).unbind();
+		self.footerDiv.unbind();
+		self.bodyDiv.unbind();
+		self.headerDiv.unbind();
+		K('iframe', self.div).each(function() {
+			K(this).remove();
+		});
+		KDialog.parent.remove.call(self);
+		return self;
+	}
+});
+function _dialog(options) {
+	return new KDialog(options);
+}
+K.DialogClass = KDialog;
+K.dialog = _dialog;
+function _tabs(options) {
+	var self = _widget(options),
+		remove = self.remove,
+		afterSelect = options.afterSelect,
+		div = self.div,
+		liList = [];
+	div.addClass('ke-tabs')
+		.bind('contextmenu,mousedown,mousemove', function(e) {
+			e.preventDefault();
+		});
+	var ul = K('<ul class="ke-tabs-ul ke-clearfix"></ul>');
+	div.append(ul);
+	self.add = function(tab) {
+		var li = K('<li class="ke-tabs-li">' + tab.title + '</li>');
+		li.data('tab', tab);
+		liList.push(li);
+		ul.append(li);
+	};
+	self.selectedIndex = 0;
+	self.select = function(index) {
+		self.selectedIndex = index;
+		_each(liList, function(i, li) {
+			li.unbind();
+			if (i === index) {
+				li.addClass('ke-tabs-li-selected');
+				K(li.data('tab').panel).show('');
+			} else {
+				li.removeClass('ke-tabs-li-selected').removeClass('ke-tabs-li-on')
+				.mouseover(function() {
+					K(this).addClass('ke-tabs-li-on');
+				})
+				.mouseout(function() {
+					K(this).removeClass('ke-tabs-li-on');
+				})
+				.click(function() {
+					self.select(i);
+				});
+				K(li.data('tab').panel).hide();
+			}
+		});
+		if (afterSelect) {
+			afterSelect.call(self, index);
+		}
+	};
+	self.remove = function() {
+		_each(liList, function() {
+			this.remove();
+		});
+		ul.remove();
+		remove.call(self);
+	};
+	return self;
+}
+K.tabs = _tabs;
+function _loadScript(url, fn) {
+	var head = document.getElementsByTagName('head')[0] || (_QUIRKS ? document.body : document.documentElement),
+		script = document.createElement('script');
+	head.appendChild(script);
+	script.src = url;
+	script.charset = 'utf-8';
+	script.onload = script.onreadystatechange = function() {
+		if (!this.readyState || this.readyState === 'loaded') {
+			if (fn) {
+				fn();
+			}
+			script.onload = script.onreadystatechange = null;
+			head.removeChild(script);
+		}
+	};
+}
+function _chopQuery(url) {
+	var index = url.indexOf('?');
+	return index > 0 ? url.substr(0, index) : url;
+}
+function _loadStyle(url) {
+	var head = document.getElementsByTagName('head')[0] || (_QUIRKS ? document.body : document.documentElement),
+		link = document.createElement('link'),
+		absoluteUrl = _chopQuery(_formatUrl(url, 'absolute'));
+	var links = K('link[rel="stylesheet"]', head);
+	for (var i = 0, len = links.length; i < len; i++) {
+		if (_chopQuery(_formatUrl(links[i].href, 'absolute')) === absoluteUrl) {
+			return;
+		}
+	}
+	head.appendChild(link);
+	link.href = url;
+	link.rel = 'stylesheet';
+}
+function _ajax(url, fn, method, param, dataType) {
+	method = method || 'GET';
+	dataType = dataType || 'json';
+	var xhr = window.XMLHttpRequest ? new window.XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');
+	xhr.open(method, url, true);
+	xhr.onreadystatechange = function () {
+		if (xhr.readyState == 4 && xhr.status == 200) {
+			if (fn) {
+				var data = _trim(xhr.responseText);
+				if (dataType == 'json') {
+					data = _json(data);
+				}
+				fn(data);
+			}
+		}
+	};
+	if (method == 'POST') {
+		var params = [];
+		_each(param, function(key, val) {
+			params.push(encodeURIComponent(key) + '=' + encodeURIComponent(val));
+		});
+		try {
+			xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
+		} catch (e) {}
+		xhr.send(params.join('&'));
+	} else {
+		xhr.send(null);
+	}
+}
+K.loadScript = _loadScript;
+K.loadStyle = _loadStyle;
+K.ajax = _ajax;
+var _plugins = {};
+function _plugin(name, fn) {
+	if (name === undefined) {
+		return _plugins;
+	}
+	if (!fn) {
+		return _plugins[name];
+	}
+	_plugins[name] = fn;
+}
+var _language = {};
+function _parseLangKey(key) {
+	var match, ns = 'core';
+	if ((match = /^(\w+)\.(\w+)$/.exec(key))) {
+		ns = match[1];
+		key = match[2];
+	}
+	return { ns : ns, key : key };
+}
+function _lang(mixed, langType) {
+	langType = langType === undefined ? K.options.langType : langType;
+	if (typeof mixed === 'string') {
+		if (!_language[langType]) {
+			return 'no language';
+		}
+		var pos = mixed.length - 1;
+		if (mixed.substr(pos) === '.') {
+			return _language[langType][mixed.substr(0, pos)];
+		}
+		var obj = _parseLangKey(mixed);
+		return _language[langType][obj.ns][obj.key];
+	}
+	_each(mixed, function(key, val) {
+		var obj = _parseLangKey(key);
+		if (!_language[langType]) {
+			_language[langType] = {};
+		}
+		if (!_language[langType][obj.ns]) {
+			_language[langType][obj.ns] = {};
+		}
+		_language[langType][obj.ns][obj.key] = val;
+	});
+}
+function _getImageFromRange(range, fn) {
+	if (range.collapsed) {
+		return;
+	}
+	range = range.cloneRange().up();
+	var sc = range.startContainer, so = range.startOffset;
+	if (!_WEBKIT && !range.isControl()) {
+		return;
+	}
+	var img = K(sc.childNodes[so]);
+	if (!img || img.name != 'img') {
+		return;
+	}
+	if (fn(img)) {
+		return img;
+	}
+}
+function _bindContextmenuEvent() {
+	var self = this, doc = self.edit.doc;
+	K(doc).contextmenu(function(e) {
+		if (self.menu) {
+			self.hideMenu();
+		}
+		if (!self.useContextmenu) {
+			e.preventDefault();
+			return;
+		}
+		if (self._contextmenus.length === 0) {
+			return;
+		}
+		var maxWidth = 0, items = [];
+		_each(self._contextmenus, function() {
+			if (this.title == '-') {
+				items.push(this);
+				return;
+			}
+			if (this.cond && this.cond()) {
+				items.push(this);
+				if (this.width && this.width > maxWidth) {
+					maxWidth = this.width;
+				}
+			}
+		});
+		while (items.length > 0 && items[0].title == '-') {
+			items.shift();
+		}
+		while (items.length > 0 && items[items.length - 1].title == '-') {
+			items.pop();
+		}
+		var prevItem = null;
+		_each(items, function(i) {
+			if (this.title == '-' && prevItem.title == '-') {
+				delete items[i];
+			}
+			prevItem = this;
+		});
+		if (items.length > 0) {
+			e.preventDefault();
+			var pos = K(self.edit.iframe).pos(),
+				menu = _menu({
+					x : pos.x + e.clientX,
+					y : pos.y + e.clientY,
+					width : maxWidth,
+					css : { visibility: 'hidden' },
+					shadowMode : self.shadowMode
+				});
+			_each(items, function() {
+				if (this.title) {
+					menu.addItem(this);
+				}
+			});
+			var docEl = _docElement(menu.doc),
+				menuHeight = menu.div.height();
+			if (e.clientY + menuHeight >= docEl.clientHeight - 100) {
+				menu.pos(menu.x, _removeUnit(menu.y) - menuHeight);
+			}
+			menu.div.css('visibility', 'visible');
+			self.menu = menu;
+		}
+	});
+}
+function _bindNewlineEvent() {
+	var self = this, doc = self.edit.doc, newlineTag = self.newlineTag;
+	if (_IE && newlineTag !== 'br') {
+		return;
+	}
+	if (_GECKO && _V < 3 && newlineTag !== 'p') {
+		return;
+	}
+	if (_OPERA && _V < 9) {
+		return;
+	}
+	var brSkipTagMap = _toMap('h1,h2,h3,h4,h5,h6,pre,li'),
+		pSkipTagMap = _toMap('p,h1,h2,h3,h4,h5,h6,pre,li,blockquote');
+	function getAncestorTagName(range) {
+		var ancestor = K(range.commonAncestor());
+		while (ancestor) {
+			if (ancestor.type == 1 && !ancestor.isStyle()) {
+				break;
+			}
+			ancestor = ancestor.parent();
+		}
+		return ancestor.name;
+	}
+	K(doc).keydown(function(e) {
+		if (e.which != 13 || e.shiftKey || e.ctrlKey || e.altKey) {
+			return;
+		}
+		self.cmd.selection();
+		var tagName = getAncestorTagName(self.cmd.range);
+		if (tagName == 'marquee' || tagName == 'select') {
+			return;
+		}
+		if (newlineTag === 'br' && !brSkipTagMap[tagName]) {
+			e.preventDefault();
+			self.insertHtml('<br />' + (_IE && _V < 9 ? '' : '\u200B'));
+			return;
+		}
+		if (!pSkipTagMap[tagName]) {
+			_nativeCommand(doc, 'formatblock', '<p>');
+		}
+	});
+	K(doc).keyup(function(e) {
+		if (e.which != 13 || e.shiftKey || e.ctrlKey || e.altKey) {
+			return;
+		}
+		if (newlineTag == 'br') {
+			return;
+		}
+		if (_GECKO) {
+			var root = self.cmd.commonAncestor('p');
+			var a = self.cmd.commonAncestor('a');
+			if (a && a.text() == '') {
+				a.remove(true);
+				self.cmd.range.selectNodeContents(root[0]).collapse(true);
+				self.cmd.select();
+			}
+			return;
+		}
+		self.cmd.selection();
+		var tagName = getAncestorTagName(self.cmd.range);
+		if (tagName == 'marquee' || tagName == 'select') {
+			return;
+		}
+		if (!pSkipTagMap[tagName]) {
+			_nativeCommand(doc, 'formatblock', '<p>');
+		}
+		var div = self.cmd.commonAncestor('div');
+		if (div) {
+			var p = K('<p></p>'),
+				child = div[0].firstChild;
+			while (child) {
+				var next = child.nextSibling;
+				p.append(child);
+				child = next;
+			}
+			div.before(p);
+			div.remove();
+			self.cmd.range.selectNodeContents(p[0]);
+			self.cmd.select();
+		}
+	});
+}
+function _bindTabEvent() {
+	var self = this, doc = self.edit.doc;
+	K(doc).keydown(function(e) {
+		if (e.which == 9) {
+			e.preventDefault();
+			if (self.afterTab) {
+				self.afterTab.call(self, e);
+				return;
+			}
+			var cmd = self.cmd, range = cmd.range;
+			range.shrink();
+			if (range.collapsed && range.startContainer.nodeType == 1) {
+				range.insertNode(K('@&nbsp;', doc)[0]);
+				cmd.select();
+			}
+			self.insertHtml('&nbsp;&nbsp;&nbsp;&nbsp;');
+		}
+	});
+}
+function _bindFocusEvent() {
+	var self = this;
+	K(self.edit.textarea[0], self.edit.win).focus(function(e) {
+		if (self.afterFocus) {
+			self.afterFocus.call(self, e);
+		}
+	}).blur(function(e) {
+		if (self.afterBlur) {
+			self.afterBlur.call(self, e);
+		}
+	});
+}
+function _removeBookmarkTag(html) {
+	return _trim(html.replace(/<span [^>]*id="?__kindeditor_bookmark_\w+_\d+__"?[^>]*><\/span>/ig, ''));
+}
+function _removeTempTag(html) {
+	return html.replace(/<div[^>]+class="?__kindeditor_paste__"?[^>]*>[\s\S]*?<\/div>/ig, '');
+}
+function _addBookmarkToStack(stack, bookmark) {
+	if (stack.length === 0) {
+		stack.push(bookmark);
+		return;
+	}
+	var prev = stack[stack.length - 1];
+	if (_removeBookmarkTag(bookmark.html) !== _removeBookmarkTag(prev.html)) {
+		stack.push(bookmark);
+	}
+}
+function _undoToRedo(fromStack, toStack) {
+	var self = this, edit = self.edit,
+		body = edit.doc.body,
+		range, bookmark;
+	if (fromStack.length === 0) {
+		return self;
+	}
+	if (edit.designMode) {
+		range = self.cmd.range;
+		bookmark = range.createBookmark(true);
+		bookmark.html = body.innerHTML;
+	} else {
+		bookmark = {
+			html : body.innerHTML
+		};
+	}
+	_addBookmarkToStack(toStack, bookmark);
+	var prev = fromStack.pop();
+	if (_removeBookmarkTag(bookmark.html) === _removeBookmarkTag(prev.html) && fromStack.length > 0) {
+		prev = fromStack.pop();
+	}
+	if (edit.designMode) {
+		edit.html(prev.html);
+		if (prev.start) {
+			range.moveToBookmark(prev);
+			self.select();
+		}
+	} else {
+		K(body).html(_removeBookmarkTag(prev.html));
+	}
+	return self;
+}
+function KEditor(options) {
+	var self = this;
+	self.options = {};
+	function setOption(key, val) {
+		if (KEditor.prototype[key] === undefined) {
+			self[key] = val;
+		}
+		self.options[key] = val;
+	}
+	_each(options, function(key, val) {
+		setOption(key, options[key]);
+	});
+	_each(K.options, function(key, val) {
+		if (self[key] === undefined) {
+			setOption(key, val);
+		}
+	});
+	var se = K(self.srcElement || '<textarea/>');
+	if (!self.width) {
+		self.width = se[0].style.width || se.width();
+	}
+	if (!self.height) {
+		self.height = se[0].style.height || se.height();
+	}
+	setOption('width', _undef(self.width, self.minWidth));
+	setOption('height', _undef(self.height, self.minHeight));
+	setOption('width', _addUnit(self.width));
+	setOption('height', _addUnit(self.height));
+	if (_MOBILE && (!_IOS || _V < 534)) {
+		self.designMode = false;
+	}
+	self.srcElement = se;
+	self.initContent = '';
+	self.plugin = {};
+	self.isCreated = false;
+	self.isLoading = false;
+	self._handlers = {};
+	self._contextmenus = [];
+	self._undoStack = [];
+	self._redoStack = [];
+	self._calledPlugins = {};
+	self._firstAddBookmark = true;
+	self.menu = self.contextmenu = null;
+	self.dialogs = [];
+}
+KEditor.prototype = {
+	lang : function(mixed) {
+		return _lang(mixed, this.langType);
+	},
+	loadPlugin : function(name, fn) {
+		var self = this;
+		if (_plugins[name]) {
+			if (self._calledPlugins[name]) {
+				if (fn) {
+					fn.call(self);
+				}
+				return self;
+			}
+			_plugins[name].call(self, KindEditor);
+			if (fn) {
+				fn.call(self);
+			}
+			self._calledPlugins[name] = true;
+			return self;
+		}
+		if (self.isLoading) {
+			return self;
+		}
+		self.isLoading = true;
+		_loadScript(self.pluginsPath + name + '/' + name + '.js?ver=' + encodeURIComponent(K.DEBUG ? _TIME : _VERSION), function() {
+			self.isLoading = false;
+			if (_plugins[name]) {
+				self.loadPlugin(name, fn);
+			}
+		});
+		return self;
+	},
+	handler : function(key, fn) {
+		var self = this;
+		if (!self._handlers[key]) {
+			self._handlers[key] = [];
+		}
+		if (_isFunction(fn)) {
+			self._handlers[key].push(fn);
+			return self;
+		}
+		_each(self._handlers[key], function() {
+			fn = this.call(self, fn);
+		});
+		return fn;
+	},
+	clickToolbar : function(name, fn) {
+		var self = this, key = 'clickToolbar' + name;
+		if (fn === undefined) {
+			if (self._handlers[key]) {
+				return self.handler(key);
+			}
+			self.loadPlugin(name, function() {
+				self.handler(key);
+			});
+			return self;
+		}
+		return self.handler(key, fn);
+	},
+	updateState : function() {
+		var self = this;
+		_each(('justifyleft,justifycenter,justifyright,justifyfull,insertorderedlist,insertunorderedlist,' +
+			'subscript,superscript,bold,italic,underline,strikethrough').split(','), function(i, name) {
+			self.cmd.state(name) ? self.toolbar.select(name) : self.toolbar.unselect(name);
+		});
+		return self;
+	},
+	addContextmenu : function(item) {
+		this._contextmenus.push(item);
+		return this;
+	},
+	afterCreate : function(fn) {
+		return this.handler('afterCreate', fn);
+	},
+	beforeRemove : function(fn) {
+		return this.handler('beforeRemove', fn);
+	},
+	beforeGetHtml : function(fn) {
+		return this.handler('beforeGetHtml', fn);
+	},
+	beforeSetHtml : function(fn) {
+		return this.handler('beforeSetHtml', fn);
+	},
+	afterSetHtml : function(fn) {
+		return this.handler('afterSetHtml', fn);
+	},
+	create : function() {
+		var self = this, fullscreenMode = self.fullscreenMode;
+		if (self.isCreated) {
+			return self;
+		}
+		if (self.srcElement.data('kindeditor')) {
+			return self;
+		}
+		self.srcElement.data('kindeditor', 'true');
+		if (fullscreenMode) {
+			_docElement().style.overflow = 'hidden';
+		} else {
+			_docElement().style.overflow = '';
+		}
+		var width = fullscreenMode ? _docElement().clientWidth + 'px' : self.width,
+			height = fullscreenMode ? _docElement().clientHeight + 'px' : self.height;
+		if ((_IE && _V < 8) || _QUIRKS) {
+			height = _addUnit(_removeUnit(height) + 2);
+		}
+		var container = self.container = K(self.layout);
+		if (fullscreenMode) {
+			K(document.body).append(container);
+		} else {
+			self.srcElement.before(container);
+		}
+		var toolbarDiv = K('.toolbar', container),
+			editDiv = K('.edit', container),
+			statusbar = self.statusbar = K('.statusbar', container);
+		container.removeClass('container')
+			.addClass('ke-container ke-container-' + self.themeType).css('width', width);
+		if (fullscreenMode) {
+			container.css({
+				position : 'absolute',
+				left : 0,
+				top : 0,
+				'z-index' : 811211
+			});
+			if (!_GECKO) {
+				self._scrollPos = _getScrollPos();
+			}
+			window.scrollTo(0, 0);
+			K(document.body).css({
+				'height' : '1px',
+				'overflow' : 'hidden'
+			});
+			K(document.body.parentNode).css('overflow', 'hidden');
+			self._fullscreenExecuted = true;
+		} else {
+			if (self._fullscreenExecuted) {
+				K(document.body).css({
+					'height' : '',
+					'overflow' : ''
+				});
+				K(document.body.parentNode).css('overflow', '');
+			}
+			if (self._scrollPos) {
+				window.scrollTo(self._scrollPos.x, self._scrollPos.y);
+			}
+		}
+		var htmlList = [];
+		K.each(self.items, function(i, name) {
+			if (name == '|') {
+				htmlList.push('<span class="ke-inline-block ke-separator"></span>');
+			} else if (name == '/') {
+				htmlList.push('<div class="ke-hr"></div>');
+			} else {
+				htmlList.push('<span class="ke-outline" data-name="' + name + '" title="' + self.lang(name) + '" unselectable="on">');
+				htmlList.push('<span class="ke-toolbar-icon ke-toolbar-icon-url ke-icon-' + name + '" unselectable="on"></span></span>');
+			}
+		});
+		var toolbar = self.toolbar = _toolbar({
+			src : toolbarDiv,
+			html : htmlList.join(''),
+			noDisableItems : self.noDisableItems,
+			click : function(e, name) {
+				e.stop();
+				if (self.menu) {
+					var menuName = self.menu.name;
+					self.hideMenu();
+					if (menuName === name) {
+						return;
+					}
+				}
+				self.clickToolbar(name);
+			}
+		});
+		var editHeight = _removeUnit(height) - toolbar.div.height();
+		var edit = self.edit = _edit({
+			height : editHeight > 0 && _removeUnit(height) > self.minHeight ? editHeight : self.minHeight,
+			src : editDiv,
+			srcElement : self.srcElement,
+			designMode : self.designMode,
+			themesPath : self.themesPath,
+			bodyClass : self.bodyClass,
+			cssPath : self.cssPath,
+			cssData : self.cssData,
+			beforeGetHtml : function(html) {
+				html = self.beforeGetHtml(html);
+				return _formatHtml(html, self.filterMode ? self.htmlTags : null, self.urlType, self.wellFormatMode, self.indentChar);
+			},
+			beforeSetHtml : function(html) {
+				html = _formatHtml(html, self.filterMode ? self.htmlTags : null, '', false);
+				return self.beforeSetHtml(html);
+			},
+			afterSetHtml : function() {
+				self.edit = edit = this;
+				self.afterSetHtml();
+			},
+			afterCreate : function() {
+				self.edit = edit = this;
+				self.cmd = edit.cmd;
+				self._docMousedownFn = function(e) {
+					if (self.menu) {
+						self.hideMenu();
+					}
+				};
+				K(edit.doc, document).mousedown(self._docMousedownFn);
+				_bindContextmenuEvent.call(self);
+				_bindNewlineEvent.call(self);
+				_bindTabEvent.call(self);
+				_bindFocusEvent.call(self);
+				edit.afterChange(function(e) {
+					if (!edit.designMode) {
+						return;
+					}
+					self.updateState();
+					self.addBookmark();
+					if (self.options.afterChange) {
+						self.options.afterChange.call(self);
+					}
+				});
+				edit.textarea.keyup(function(e) {
+					if (!e.ctrlKey && !e.altKey && _INPUT_KEY_MAP[e.which]) {
+						if (self.options.afterChange) {
+							self.options.afterChange.call(self);
+						}
+					}
+				});
+				if (self.readonlyMode) {
+					self.readonly();
+				}
+				self.isCreated = true;
+				if (self.initContent === '') {
+					self.initContent = self.html();
+				}
+				self.afterCreate();
+				if (self.options.afterCreate) {
+					self.options.afterCreate.call(self);
+				}
+			}
+		});
+		statusbar.removeClass('statusbar').addClass('ke-statusbar')
+			.append('<span class="ke-inline-block ke-statusbar-center-icon"></span>')
+			.append('<span class="ke-inline-block ke-statusbar-right-icon"></span>');
+		if (self._fullscreenResizeHandler) {
+			K(window).unbind('resize', self._fullscreenResizeHandler);
+			self._fullscreenResizeHandler = null;
+		}
+		function initResize() {
+			if (statusbar.height() === 0) {
+				setTimeout(initResize, 100);
+				return;
+			}
+			self.resize(width, height, false);
+		}
+		initResize();
+		if (fullscreenMode) {
+			self._fullscreenResizeHandler = function(e) {
+				if (self.isCreated) {
+					self.resize(_docElement().clientWidth, _docElement().clientHeight, false);
+				}
+			};
+			K(window).bind('resize', self._fullscreenResizeHandler);
+			toolbar.select('fullscreen');
+			statusbar.first().css('visibility', 'hidden');
+			statusbar.last().css('visibility', 'hidden');
+		} else {
+			if (_GECKO) {
+				K(window).bind('scroll', function(e) {
+					self._scrollPos = _getScrollPos();
+				});
+			}
+			if (self.resizeType > 0) {
+				_drag({
+					moveEl : container,
+					clickEl : statusbar,
+					moveFn : function(x, y, width, height, diffX, diffY) {
+						height += diffY;
+						self.resize(null, height);
+					}
+				});
+			} else {
+				statusbar.first().css('visibility', 'hidden');
+			}
+			if (self.resizeType === 2) {
+				_drag({
+					moveEl : container,
+					clickEl : statusbar.last(),
+					moveFn : function(x, y, width, height, diffX, diffY) {
+						width += diffX;
+						height += diffY;
+						self.resize(width, height);
+					}
+				});
+			} else {
+				statusbar.last().css('visibility', 'hidden');
+			}
+		}
+		return self;
+	},
+	remove : function() {
+		var self = this;
+		if (!self.isCreated) {
+			return self;
+		}
+		self.beforeRemove();
+		self.srcElement.data('kindeditor', '');
+		if (self.menu) {
+			self.hideMenu();
+		}
+		_each(self.dialogs, function() {
+			self.hideDialog();
+		});
+		K(document).unbind('mousedown', self._docMousedownFn);
+		self.toolbar.remove();
+		self.edit.remove();
+		self.statusbar.last().unbind();
+		self.statusbar.unbind();
+		self.container.remove();
+		self.container = self.toolbar = self.edit = self.menu = null;
+		self.dialogs = [];
+		self.isCreated = false;
+		return self;
+	},
+	resize : function(width, height, updateProp) {
+		var self = this;
+		updateProp = _undef(updateProp, true);
+		if (width) {
+			if (!/%/.test(width)) {
+				width = _removeUnit(width);
+				width = width < self.minWidth ? self.minWidth : width;
+			}
+			self.container.css('width', _addUnit(width));
+			if (updateProp) {
+				self.width = _addUnit(width);
+			}
+		}
+		if (height) {
+			height = _removeUnit(height);
+			editHeight = _removeUnit(height) - self.toolbar.div.height() - self.statusbar.height();
+			editHeight = editHeight < self.minHeight ? self.minHeight : editHeight;
+			self.edit.setHeight(editHeight);
+			if (updateProp) {
+				self.height = _addUnit(height);
+			}
+		}
+		return self;
+	},
+	select : function() {
+		this.isCreated && this.cmd.select();
+		return this;
+	},
+	html : function(val) {
+		var self = this;
+		if (val === undefined) {
+			return self.isCreated ? self.edit.html() : _elementVal(self.srcElement);
+		}
+		self.isCreated ? self.edit.html(val) : _elementVal(self.srcElement, val);
+		if (self.isCreated) {
+			self.cmd.selection();
+		}
+		return self;
+	},
+	fullHtml : function() {
+		return this.isCreated ? this.edit.html(undefined, true) : '';
+	},
+	text : function(val) {
+		var self = this;
+		if (val === undefined) {
+			return _trim(self.html().replace(/<(?!img|embed).*?>/ig, '').replace(/&nbsp;/ig, ' '));
+		} else {
+			return self.html(_escape(val));
+		}
+	},
+	isEmpty : function() {
+		return _trim(this.text().replace(/\r\n|\n|\r/, '')) === '';
+	},
+	isDirty : function() {
+		return _trim(this.initContent.replace(/\r\n|\n|\r|t/g, '')) !== _trim(this.html().replace(/\r\n|\n|\r|t/g, ''));
+	},
+	selectedHtml : function() {
+		return this.isCreated ? this.cmd.range.html() : '';
+	},
+	count : function(mode) {
+		var self = this;
+		mode = (mode || 'html').toLowerCase();
+		if (mode === 'html') {
+			return _removeBookmarkTag(_removeTempTag(self.html())).length;
+		}
+		if (mode === 'text') {
+			return self.text().replace(/<(?:img|embed).*?>/ig, 'K').replace(/\r\n|\n|\r/g, '').length;
+		}
+		return 0;
+	},
+	exec : function(key) {
+		key = key.toLowerCase();
+		var self = this, cmd = self.cmd,
+			changeFlag = _inArray(key, 'selectall,copy,paste,print'.split(',')) < 0;
+		if (changeFlag) {
+			self.addBookmark(false);
+		}
+		cmd[key].apply(cmd, _toArray(arguments, 1));
+		if (changeFlag) {
+			self.updateState();
+			self.addBookmark(false);
+			if (self.options.afterChange) {
+				self.options.afterChange.call(self);
+			}
+		}
+		return self;
+	},
+	insertHtml : function(val, quickMode) {
+		if (!this.isCreated) {
+			return this;
+		}
+		val = this.beforeSetHtml(val);
+		this.exec('inserthtml', val, quickMode);
+		return this;
+	},
+	appendHtml : function(val) {
+		this.html(this.html() + val);
+		if (this.isCreated) {
+			var cmd = this.cmd;
+			cmd.range.selectNodeContents(cmd.doc.body).collapse(false);
+			cmd.select();
+		}
+		return this;
+	},
+	sync : function() {
+		_elementVal(this.srcElement, this.html());
+		return this;
+	},
+	focus : function() {
+		this.isCreated ? this.edit.focus() : this.srcElement[0].focus();
+		return this;
+	},
+	blur : function() {
+		this.isCreated ? this.edit.blur() : this.srcElement[0].blur();
+		return this;
+	},
+	addBookmark : function(checkSize) {
+		checkSize = _undef(checkSize, true);
+		var self = this, edit = self.edit,
+			body = edit.doc.body,
+			html = _removeTempTag(body.innerHTML), bookmark;
+		if (checkSize && self._undoStack.length > 0) {
+			var prev = self._undoStack[self._undoStack.length - 1];
+			if (Math.abs(html.length - _removeBookmarkTag(prev.html).length) < self.minChangeSize) {
+				return self;
+			}
+		}
+		if (edit.designMode && !self._firstAddBookmark) {
+			var range = self.cmd.range;
+			bookmark = range.createBookmark(true);
+			bookmark.html = _removeTempTag(body.innerHTML);
+			range.moveToBookmark(bookmark);
+		} else {
+			bookmark = {
+				html : html
+			};
+		}
+		self._firstAddBookmark = false;
+		_addBookmarkToStack(self._undoStack, bookmark);
+		return self;
+	},
+	undo : function() {
+		return _undoToRedo.call(this, this._undoStack, this._redoStack);
+	},
+	redo : function() {
+		return _undoToRedo.call(this, this._redoStack, this._undoStack);
+	},
+	fullscreen : function(bool) {
+		this.fullscreenMode = (bool === undefined ? !this.fullscreenMode : bool);
+		return this.remove().create();
+	},
+	readonly : function(isReadonly) {
+		isReadonly = _undef(isReadonly, true);
+		var self = this, edit = self.edit, doc = edit.doc;
+		if (self.designMode) {
+			self.toolbar.disableAll(isReadonly, []);
+		} else {
+			_each(self.noDisableItems, function() {
+				self.toolbar[isReadonly ? 'disable' : 'enable'](this);
+			});
+		}
+		if (_IE) {
+			doc.body.contentEditable = !isReadonly;
+		} else {
+			doc.designMode = isReadonly ? 'off' : 'on';
+		}
+		edit.textarea[0].disabled = isReadonly;
+	},
+	createMenu : function(options) {
+		var self = this,
+			name = options.name,
+			knode = self.toolbar.get(name),
+			pos = knode.pos();
+		options.x = pos.x;
+		options.y = pos.y + knode.height();
+		options.z = self.options.zIndex;
+		options.shadowMode = _undef(options.shadowMode, self.shadowMode);
+		if (options.selectedColor !== undefined) {
+			options.cls = 'ke-colorpicker-' + self.themeType;
+			options.noColor = self.lang('noColor');
+			self.menu = _colorpicker(options);
+		} else {
+			options.cls = 'ke-menu-' + self.themeType;
+			options.centerLineMode = false;
+			self.menu = _menu(options);
+		}
+		return self.menu;
+	},
+	hideMenu : function() {
+		this.menu.remove();
+		this.menu = null;
+		return this;
+	},
+	hideContextmenu : function() {
+		this.contextmenu.remove();
+		this.contextmenu = null;
+		return this;
+	},
+	createDialog : function(options) {
+		var self = this, name = options.name;
+		options.z = self.options.zIndex;
+		options.shadowMode = _undef(options.shadowMode, self.shadowMode);
+		options.closeBtn = _undef(options.closeBtn, {
+			name : self.lang('close'),
+			click : function(e) {
+				self.hideDialog();
+				if (_IE && self.cmd) {
+					self.cmd.select();
+				}
+			}
+		});
+		options.noBtn = _undef(options.noBtn, {
+			name : self.lang(options.yesBtn ? 'no' : 'close'),
+			click : function(e) {
+				self.hideDialog();
+				if (_IE && self.cmd) {
+					self.cmd.select();
+				}
+			}
+		});
+		if (self.dialogAlignType != 'page') {
+			options.alignEl = self.container;
+		}
+		options.cls = 'ke-dialog-' + self.themeType;
+		if (self.dialogs.length > 0) {
+			var firstDialog = self.dialogs[0],
+				parentDialog = self.dialogs[self.dialogs.length - 1];
+			firstDialog.setMaskIndex(parentDialog.z + 2);
+			options.z = parentDialog.z + 3;
+			options.showMask = false;
+		}
+		var dialog = _dialog(options);
+		self.dialogs.push(dialog);
+		return dialog;
+	},
+	hideDialog : function() {
+		var self = this;
+		if (self.dialogs.length > 0) {
+			self.dialogs.pop().remove();
+		}
+		if (self.dialogs.length > 0) {
+			var firstDialog = self.dialogs[0],
+				parentDialog = self.dialogs[self.dialogs.length - 1];
+			firstDialog.setMaskIndex(parentDialog.z - 1);
+		}
+		return self;
+	},
+	errorDialog : function(html) {
+		var self = this;
+		var dialog = self.createDialog({
+			width : 750,
+			title : self.lang('uploadError'),
+			body : '<div style="padding:10px 20px;"><iframe frameborder="0" style="width:708px;height:400px;"></iframe></div>'
+		});
+		var iframe = K('iframe', dialog.div), doc = K.iframeDoc(iframe);
+		doc.open();
+		doc.write(html);
+		doc.close();
+		K(doc.body).css('background-color', '#FFF');
+		iframe[0].contentWindow.focus();
+		return self;
+	}
+};
+function _editor(options) {
+	return new KEditor(options);
+}
+_instances = [];
+function _create(expr, options) {
+	options = options || {};
+	options.basePath = _undef(options.basePath, K.basePath);
+	options.themesPath = _undef(options.themesPath, options.basePath + 'themes/');
+	options.langPath = _undef(options.langPath, options.basePath + 'lang/');
+	options.pluginsPath = _undef(options.pluginsPath, options.basePath + 'plugins/');
+	if (_undef(options.loadStyleMode, K.options.loadStyleMode)) {
+		var themeType = _undef(options.themeType, K.options.themeType);
+		_loadStyle(options.themesPath + 'default/default.css');
+		_loadStyle(options.themesPath + themeType + '/' + themeType + '.css');
+	}
+	function create(editor) {
+		_each(_plugins, function(name, fn) {
+			fn.call(editor, KindEditor);
+		});
+		return editor.create();
+	}
+	var knode = K(expr);
+	if (!knode || knode.length === 0) {
+		return;
+	}
+	if (knode.length > 1) {
+		knode.each(function() {
+			_create(this, options);
+		});
+		return _instances[0];
+	}
+	options.srcElement = knode[0];
+	var editor = new KEditor(options);
+	_instances.push(editor);
+	if (_language[editor.langType]) {
+		return create(editor);
+	}
+	_loadScript(editor.langPath + editor.langType + '.js?ver=' + encodeURIComponent(K.DEBUG ? _TIME : _VERSION), function() {
+		create(editor);
+	});
+	return editor;
+}
+function _eachEditor(expr, fn) {
+	K(expr).each(function(i, el) {
+		K.each(_instances, function(j, editor) {
+			if (editor && editor.srcElement[0] == el) {
+				fn.call(editor, j, editor);
+				return false;
+			}
+		});
+	});
+}
+K.remove = function(expr) {
+	_eachEditor(expr, function(i) {
+		this.remove();
+		_instances.splice(i, 1);
+	});
+};
+K.sync = function(expr) {
+	_eachEditor(expr, function() {
+		this.sync();
+	});
+};
+if (_IE && _V < 7) {
+	_nativeCommand(document, 'BackgroundImageCache', true);
+}
+K.EditorClass = KEditor;
+K.editor = _editor;
+K.create = _create;
+K.instances = _instances;
+K.plugin = _plugin;
+K.lang = _lang;
+_plugin('core', function(K) {
+	var self = this,
+		shortcutKeys = {
+			undo : 'Z', redo : 'Y', bold : 'B', italic : 'I', underline : 'U', print : 'P', selectall : 'A'
+		};
+	self.afterSetHtml(function() {
+		if (self.options.afterChange) {
+			self.options.afterChange.call(self);
+		}
+	});
+	self.afterCreate(function() {
+		if (self.syncType != 'form') {
+			return;
+		}
+		var el = K(self.srcElement), hasForm = false;
+		while ((el = el.parent())) {
+			if (el.name == 'form') {
+				hasForm = true;
+				break;
+			}
+		}
+		if (hasForm) {
+			el.bind('submit', function(e) {
+				self.sync();
+				K(window).bind('unload', function() {
+					self.edit.textarea.remove();
+				});
+			});
+			var resetBtn = K('[type="reset"]', el);
+			resetBtn.click(function() {
+				self.html(self.initContent);
+				self.cmd.selection();
+			});
+			self.beforeRemove(function() {
+				el.unbind();
+				resetBtn.unbind();
+			});
+		}
+	});
+	self.clickToolbar('source', function() {
+		if (self.edit.designMode) {
+			self.toolbar.disableAll(true);
+			self.edit.design(false);
+			self.toolbar.select('source');
+		} else {
+			self.toolbar.disableAll(false);
+			self.edit.design(true);
+			self.toolbar.unselect('source');
+			self.cmd.selection();
+		}
+		self.designMode = self.edit.designMode;
+	});
+	self.afterCreate(function() {
+		if (!self.designMode) {
+			self.toolbar.disableAll(true).select('source');
+		}
+	});
+	self.clickToolbar('fullscreen', function() {
+		self.fullscreen();
+	});
+	if (self.fullscreenShortcut) {
+		var loaded = false;
+		self.afterCreate(function() {
+			K(self.edit.doc, self.edit.textarea).keyup(function(e) {
+				if (e.which == 27) {
+					setTimeout(function() {
+						self.fullscreen();
+					}, 0);
+				}
+			});
+			if (loaded) {
+				if (_IE && !self.designMode) {
+					return;
+				}
+				self.focus();
+			}
+			if (!loaded) {
+				loaded = true;
+			}
+		});
+	}
+	_each('undo,redo'.split(','), function(i, name) {
+		if (shortcutKeys[name]) {
+			self.afterCreate(function() {
+				_ctrl(this.edit.doc, shortcutKeys[name], function() {
+					self.clickToolbar(name);
+				});
+			});
+		}
+		self.clickToolbar(name, function() {
+			self[name]();
+		});
+	});
+	self.clickToolbar('formatblock', function() {
+		var blocks = self.lang('formatblock.formatBlock'),
+			heights = {
+				h1 : 28,
+				h2 : 24,
+				h3 : 18,
+				H4 : 14,
+				p : 12
+			},
+			curVal = self.cmd.val('formatblock'),
+			menu = self.createMenu({
+				name : 'formatblock',
+				width : self.langType == 'en' ? 200 : 150
+			});
+		_each(blocks, function(key, val) {
+			var style = 'font-size:' + heights[key] + 'px;';
+			if (key.charAt(0) === 'h') {
+				style += 'font-weight:bold;';
+			}
+			menu.addItem({
+				title : '<span style="' + style + '" unselectable="on">' + val + '</span>',
+				height : heights[key] + 12,
+				checked : (curVal === key || curVal === val),
+				click : function() {
+					self.select().exec('formatblock', '<' + key + '>').hideMenu();
+				}
+			});
+		});
+	});
+	self.clickToolbar('fontname', function() {
+		var curVal = self.cmd.val('fontname'),
+			menu = self.createMenu({
+				name : 'fontname',
+				width : 150
+			});
+		_each(self.lang('fontname.fontName'), function(key, val) {
+			menu.addItem({
+				title : '<span style="font-family: ' + key + ';" unselectable="on">' + val + '</span>',
+				checked : (curVal === key.toLowerCase() || curVal === val.toLowerCase()),
+				click : function() {
+					self.exec('fontname', key).hideMenu();
+				}
+			});
+		});
+	});
+	self.clickToolbar('fontsize', function() {
+		var curVal = self.cmd.val('fontsize'),
+			menu = self.createMenu({
+				name : 'fontsize',
+				width : 150
+			});
+		_each(self.fontSizeTable, function(i, val) {
+			menu.addItem({
+				title : '<span style="font-size:' + val + ';" unselectable="on">' + val + '</span>',
+				height : _removeUnit(val) + 12,
+				checked : curVal === val,
+				click : function() {
+					self.exec('fontsize', val).hideMenu();
+				}
+			});
+		});
+	});
+	_each('forecolor,hilitecolor'.split(','), function(i, name) {
+		self.clickToolbar(name, function() {
+			self.createMenu({
+				name : name,
+				selectedColor : self.cmd.val(name) || 'default',
+				colors : self.colorTable,
+				click : function(color) {
+					self.exec(name, color).hideMenu();
+				}
+			});
+		});
+	});
+	_each(('cut,copy,paste').split(','), function(i, name) {
+		self.clickToolbar(name, function() {
+			self.focus();
+			try {
+				self.exec(name, null);
+			} catch(e) {
+				alert(self.lang(name + 'Error'));
+			}
+		});
+	});
+	self.clickToolbar('about', function() {
+		var html = '<div style="margin:20px;">' +
+			'<div>KindEditor ' + _VERSION + '</div>' +
+			'<div>Copyright &copy; <a href="http://www.kindsoft.net/" target="_blank">kindsoft.net</a> All rights reserved.</div>' +
+			'</div>';
+		self.createDialog({
+			name : 'about',
+			width : 350,
+			title : self.lang('about'),
+			body : html
+		});
+	});
+	self.plugin.getSelectedLink = function() {
+		return self.cmd.commonAncestor('a');
+	};
+	self.plugin.getSelectedImage = function() {
+		return _getImageFromRange(self.edit.cmd.range, function(img) {
+			return !/^ke-\w+$/i.test(img[0].className);
+		});
+	};
+	self.plugin.getSelectedFlash = function() {
+		return _getImageFromRange(self.edit.cmd.range, function(img) {
+			return img[0].className == 'ke-flash';
+		});
+	};
+	self.plugin.getSelectedMedia = function() {
+		return _getImageFromRange(self.edit.cmd.range, function(img) {
+			return img[0].className == 'ke-media' || img[0].className == 'ke-rm';
+		});
+	};
+	self.plugin.getSelectedAnchor = function() {
+		return _getImageFromRange(self.edit.cmd.range, function(img) {
+			return img[0].className == 'ke-anchor';
+		});
+	};
+	_each('link,image,flash,media,anchor'.split(','), function(i, name) {
+		var uName = name.charAt(0).toUpperCase() + name.substr(1);
+		_each('edit,delete'.split(','), function(j, val) {
+			self.addContextmenu({
+				title : self.lang(val + uName),
+				click : function() {
+					self.loadPlugin(name, function() {
+						self.plugin[name][val]();
+						self.hideMenu();
+					});
+				},
+				cond : self.plugin['getSelected' + uName],
+				width : 150,
+				iconClass : val == 'edit' ? 'ke-icon-' + name : undefined
+			});
+		});
+		self.addContextmenu({ title : '-' });
+	});
+	self.plugin.getSelectedTable = function() {
+		return self.cmd.commonAncestor('table');
+	};
+	self.plugin.getSelectedRow = function() {
+		return self.cmd.commonAncestor('tr');
+	};
+	self.plugin.getSelectedCell = function() {
+		return self.cmd.commonAncestor('td');
+	};
+	_each(('prop,cellprop,colinsertleft,colinsertright,rowinsertabove,rowinsertbelow,rowmerge,colmerge,' +
+	'rowsplit,colsplit,coldelete,rowdelete,insert,delete').split(','), function(i, val) {
+		var cond = _inArray(val, ['prop', 'delete']) < 0 ? self.plugin.getSelectedCell : self.plugin.getSelectedTable;
+		self.addContextmenu({
+			title : self.lang('table' + val),
+			click : function() {
+				self.loadPlugin('table', function() {
+					self.plugin.table[val]();
+					self.hideMenu();
+				});
+			},
+			cond : cond,
+			width : 170,
+			iconClass : 'ke-icon-table' + val
+		});
+	});
+	self.addContextmenu({ title : '-' });
+	_each(('selectall,justifyleft,justifycenter,justifyright,justifyfull,insertorderedlist,' +
+		'insertunorderedlist,indent,outdent,subscript,superscript,hr,print,' +
+		'bold,italic,underline,strikethrough,removeformat,unlink').split(','), function(i, name) {
+		if (shortcutKeys[name]) {
+			self.afterCreate(function() {
+				_ctrl(this.edit.doc, shortcutKeys[name], function() {
+					self.cmd.selection();
+					self.clickToolbar(name);
+				});
+			});
+		}
+		self.clickToolbar(name, function() {
+			self.focus().exec(name, null);
+		});
+	});
+	self.afterCreate(function() {
+		var doc = self.edit.doc, cmd, bookmark, div,
+			cls = '__kindeditor_paste__', pasting = false;
+		function movePastedData() {
+			cmd.range.moveToBookmark(bookmark);
+			cmd.select();
+			if (_WEBKIT) {
+				K('div.' + cls, div).each(function() {
+					K(this).after('<br />').remove(true);
+				});
+				K('span.Apple-style-span', div).remove(true);
+				K('span.Apple-tab-span', div).remove(true);
+				K('span[style]', div).each(function() {
+					if (K(this).css('white-space') == 'nowrap') {
+						K(this).remove(true);
+					}
+				});
+				K('meta', div).remove();
+			}
+			var html = div[0].innerHTML;
+			div.remove();
+			if (html === '') {
+				return;
+			}
+			if (_WEBKIT) {
+				html = html.replace(/(<br>)\1/ig, '$1');
+			}
+			if (self.pasteType === 2) {
+				html = html.replace(/(<(?:p|p\s[^>]*)>) *(<\/p>)/ig, '');
+				if (/schemas-microsoft-com|worddocument|mso-\w+/i.test(html)) {
+					html = _clearMsWord(html, self.filterMode ? self.htmlTags : K.options.htmlTags);
+				} else {
+					html = _formatHtml(html, self.filterMode ? self.htmlTags : null);
+					html = self.beforeSetHtml(html);
+				}
+			}
+			if (self.pasteType === 1) {
+				html = html.replace(/&nbsp;/ig, ' ');
+				html = html.replace(/\n\s*\n/g, '\n');
+				html = html.replace(/<br[^>]*>/ig, '\n');
+				html = html.replace(/<\/p><p[^>]*>/ig, '\n');
+				html = html.replace(/<[^>]+>/g, '');
+				html = html.replace(/ {2}/g, ' &nbsp;');
+				if (self.newlineTag == 'p') {
+					if (/\n/.test(html)) {
+						html = html.replace(/^/, '<p>').replace(/$/, '<br /></p>').replace(/\n/g, '<br /></p><p>');
+					}
+				} else {
+					html = html.replace(/\n/g, '<br />$&');
+				}
+			}
+			self.insertHtml(html, true);
+		}
+		K(doc.body).bind('paste', function(e){
+			if (self.pasteType === 0) {
+				e.stop();
+				return;
+			}
+			if (pasting) {
+				return;
+			}
+			pasting = true;
+			K('div.' + cls, doc).remove();
+			cmd = self.cmd.selection();
+			bookmark = cmd.range.createBookmark();
+			div = K('<div class="' + cls + '"></div>', doc).css({
+				position : 'absolute',
+				width : '1px',
+				height : '1px',
+				overflow : 'hidden',
+				left : '-1981px',
+				top : K(bookmark.start).pos().y + 'px',
+				'white-space' : 'nowrap'
+			});
+			K(doc.body).append(div);
+			if (_IE) {
+				var rng = cmd.range.get(true);
+				rng.moveToElementText(div[0]);
+				rng.select();
+				rng.execCommand('paste');
+				e.preventDefault();
+			} else {
+				cmd.range.selectNodeContents(div[0]);
+				cmd.select();
+			}
+			setTimeout(function() {
+				movePastedData();
+				pasting = false;
+			}, 0);
+		});
+	});
+	self.beforeGetHtml(function(html) {
+		if (_IE && _V <= 8) {
+			html = html.replace(/<div\s+[^>]*data-ke-input-tag="([^"]*)"[^>]*>([\s\S]*?)<\/div>/ig, function(full, tag) {
+				return unescape(tag);
+			});
+			html = html.replace(/(<input)((?:\s+[^>]*)?>)/ig, function($0, $1, $2) {
+				if (!/\s+type="[^"]+"/i.test($0)) {
+					return $1 + ' type="text"' + $2;
+				}
+				return $0;
+			});
+		}
+		return html.replace(/(<(?:noscript|noscript\s[^>]*)>)([\s\S]*?)(<\/noscript>)/ig, function($0, $1, $2, $3) {
+			return $1 + _unescape($2).replace(/\s+/g, ' ') + $3;
+		})
+		.replace(/<img[^>]*class="?ke-(flash|rm|media)"?[^>]*>/ig, function(full) {
+			var imgAttrs = _getAttrList(full),
+				styles = _getCssList(imgAttrs.style || ''),
+				attrs = _mediaAttrs(imgAttrs['data-ke-tag']);
+			attrs.width = _undef(imgAttrs.width, _removeUnit(_undef(styles.width, '')));
+			attrs.height = _undef(imgAttrs.height, _removeUnit(_undef(styles.height, '')));
+			return _mediaEmbed(attrs);
+		})
+		.replace(/<img[^>]*class="?ke-anchor"?[^>]*>/ig, function(full) {
+			var imgAttrs = _getAttrList(full);
+			return '<a name="' + unescape(imgAttrs['data-ke-name']) + '"></a>';
+		})
+		.replace(/<div\s+[^>]*data-ke-script-attr="([^"]*)"[^>]*>([\s\S]*?)<\/div>/ig, function(full, attr, code) {
+			return '<script' + unescape(attr) + '>' + unescape(code) + '</script>';
+		})
+		.replace(/<div\s+[^>]*data-ke-noscript-attr="([^"]*)"[^>]*>([\s\S]*?)<\/div>/ig, function(full, attr, code) {
+			return '<noscript' + unescape(attr) + '>' + unescape(code) + '</noscript>';
+		})
+		.replace(/(<[^>]*)data-ke-src="([^"]*)"([^>]*>)/ig, function(full, start, src, end) {
+			full = full.replace(/(\s+(?:href|src)=")[^"]*(")/i, function($0, $1, $2) {
+				return $1 + _unescape(src) + $2;
+			});
+			full = full.replace(/\s+data-ke-src="[^"]*"/i, '');
+			return full;
+		})
+		.replace(/(<[^>]+\s)data-ke-(on\w+="[^"]*"[^>]*>)/ig, function(full, start, end) {
+			return start + end;
+		});
+	});
+	self.beforeSetHtml(function(html) {
+		if (_IE && _V <= 8) {
+			html = html.replace(/<input[^>]*>|<(select|button)[^>]*>[\s\S]*?<\/\1>/ig, function(full) {
+				var attrs = _getAttrList(full);
+				var styles = _getCssList(attrs.style || '');
+				if (styles.display == 'none') {
+					return '<div class="ke-display-none" data-ke-input-tag="' + escape(full) + '"></div>';
+				}
+				return full;
+			});
+		}
+		return html.replace(/<embed[^>]*type="([^"]+)"[^>]*>(?:<\/embed>)?/ig, function(full) {
+			var attrs = _getAttrList(full);
+			attrs.src = _undef(attrs.src, '');
+			attrs.width = _undef(attrs.width, 0);
+			attrs.height = _undef(attrs.height, 0);
+			return _mediaImg(self.themesPath + 'common/blank.gif', attrs);
+		})
+		.replace(/<a[^>]*name="([^"]+)"[^>]*>(?:<\/a>)?/ig, function(full) {
+			var attrs = _getAttrList(full);
+			if (attrs.href !== undefined) {
+				return full;
+			}
+			return '<img class="ke-anchor" src="' + self.themesPath + 'common/anchor.gif" data-ke-name="' + escape(attrs.name) + '" />';
+		})
+		.replace(/<script([^>]*)>([\s\S]*?)<\/script>/ig, function(full, attr, code) {
+			return '<div class="ke-script" data-ke-script-attr="' + escape(attr) + '">' + escape(code) + '</div>';
+		})
+		.replace(/<noscript([^>]*)>([\s\S]*?)<\/noscript>/ig, function(full, attr, code) {
+			return '<div class="ke-noscript" data-ke-noscript-attr="' + escape(attr) + '">' + escape(code) + '</div>';
+		})
+		.replace(/(<[^>]*)(href|src)="([^"]*)"([^>]*>)/ig, function(full, start, key, src, end) {
+			if (full.match(/\sdata-ke-src="[^"]*"/i)) {
+				return full;
+			}
+			full = start + key + '="' + src + '"' + ' data-ke-src="' + _escape(src) + '"' + end;
+			return full;
+		})
+		.replace(/(<[^>]+\s)(on\w+="[^"]*"[^>]*>)/ig, function(full, start, end) {
+			return start + 'data-ke-' + end;
+		})
+		.replace(/<table[^>]*\s+border="0"[^>]*>/ig, function(full) {
+			if (full.indexOf('ke-zeroborder') >= 0) {
+				return full;
+			}
+			return _addClassToTag(full, 'ke-zeroborder');
+		});
+	});
+});
+})(window);
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/lang/ar.js b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/lang/ar.js
new file mode 100644
index 0000000..0516199
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/lang/ar.js
@@ -0,0 +1,233 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+* Arabic Translation By daif alotaibi (http://daif.net/)
+*******************************************************************************/
+
+KindEditor.lang({
+	source : '毓乇囟 丕賱賲氐丿乇',
+	preview : '賲毓丕賷賳丞 丕賱氐賮丨丞',
+	undo : '鬲乇丕噩毓(Ctrl+Z)',
+	redo : '廿毓丕丿丞 丕賱鬲乇丕噩毓(Ctrl+Y)',
+	cut : '賯氐(Ctrl+X)',
+	copy : '賳爻禺(Ctrl+C)',
+	paste : '賱氐賯(Ctrl+V)',
+	plainpaste : '賱氐賯 賰賳氐 毓丕丿賷',
+	wordpaste : '賱氐賯 賲賳 賲丕賷賰乇賵爻賮鬲 賵乇丿',
+	selectall : '鬲丨丿賷丿 丕賱賰賱',
+	justifyleft : '賲丨丕匕丕賴 賱賱賷爻丕乇',
+	justifycenter : '賲丨丕匕丕賴 賱賱賵爻胤',
+	justifyright : '賲丨丕匕丕賴 賱賱賷賲賷賳',
+	justifyfull : '賲丨丕匕丕賴 鬲賱賯丕卅賷丞',
+	insertorderedlist : '賯丕卅賲丞 賲乇賯賲賴',
+	insertunorderedlist : '賯丕卅賲丞 賳賯胤賷丞',
+	indent : '廿夭丕丨賴 丕賱賳氐',
+	outdent : '廿賱睾丕亍 丕賱丕夭丕丨丞',
+	subscript : '兀爻賮賱 丕賱賳氐',
+	superscript : '兀毓賱賶 丕賱賳氐',
+	formatblock : 'Paragraph format',
+	fontname : '賳賵毓 丕賱禺胤',
+	fontsize : '丨噩賲 丕賱禺胤',
+	forecolor : '賱賵賳 丕賱賳氐',
+	hilitecolor : '賱賵賳 禺賱賮賷丞 丕賱賳氐',
+	bold : '毓乇賷囟(Ctrl+B)',
+	italic : '賲丕卅賱(Ctrl+I)',
+	underline : '禺胤 鬲丨鬲 丕賱賳氐(Ctrl+U)',
+	strikethrough : '禺胤 毓賱賶 丕賱賳氐',
+	removeformat : '廿夭丕賱丞 丕賱鬲賳爻賷賯',
+	image : '廿丿乇丕噩 氐賵乇丞',
+	multiimage : 'Multi image',
+	flash : '廿丿乇丕噩 賮賱丕卮',
+	media : '廿丿乇丕噩 賵爻丕卅胤 賲鬲毓丿丿丞',
+	table : '廿丿乇丕噩 噩丿賵賱',
+	tablecell : '禺賱賷丞',
+	hr : '廿丿乇丕噩 禺胤 兀賮賯賷',
+	emoticons : '廿丿乇丕噩 賵噩賴 囟丕丨賰',
+	link : '乇丕亘胤',
+	unlink : '廿夭丕賱丞 丕賱乇丕亘胤',
+	fullscreen : '賲丨乇乇 賲賱卅 丕賱卮丕卮丞',
+	about : '丨賵賱',
+	print : '胤亘丕毓丞',
+	filemanager : '賲丿賷乇 丕賱賲賱賮丕鬲',
+	code : '廿丿乇丕噩 賳氐 亘乇賲噩賷',
+	map : '禺乇丕卅胤 賯賵賵賯賱',
+	baidumap : '禺乇丕卅胤 賯賵賵賯賱',
+	lineheight : '廿乇鬲賮丕毓 丕賱爻胤乇',
+	clearhtml : '賲爻丨 賰賵丿 HTML',
+	pagebreak : '廿丿乇丕噩 賮丕氐賱 氐賮丨丕鬲',
+	quickformat : '鬲賳爻賷賯 爻乇賷毓',
+	insertfile : '廿丿乇丕噩 賲賱賮',
+	template : '廿丿乇丕噩 賯丕賱亘',
+	anchor : '乇丕亘胤',
+	yes : '賲賵丕賮賯',
+	no : '廿賱睾丕亍',
+	close : '廿睾賱丕賯',
+	editImage : '禺氐丕卅氐 丕賱氐賵乇丞',
+	deleteImage : '丨匕賮丕賱氐賵乇丞',
+	editFlash : '禺氐丕卅氐 丕賱賮賱丕卮',
+	deleteFlash : '丨匕賮 丕賱賮賱丕卮',
+	editMedia : '禺氐丕卅氐 丕賱賵爻丕卅胤',
+	deleteMedia : '丨匕賮 丕賱賵爻丕卅胤',
+	editLink : '禺氐丕卅氐 丕賱乇丕亘胤',
+	deleteLink : '廿夭丕賱丞 丕賱乇丕亘胤',
+	tableprop : '禺氐丕卅氐 丕賱噩丿賵賱',
+	tablecellprop : '禺氐丕卅氐 丕賱禺賱賷丞',
+	tableinsert : '廿丿乇丕噩 噩丿賵賱',
+	tabledelete : '丨匕賮 噩丿賵賱',
+	tablecolinsertleft : '廿丿乇丕噩 毓賲賵丿 賱賱賷爻丕乇',
+	tablecolinsertright : '廿丿乇丕噩 毓賲賵丿 賱賱賷爻丕乇',
+	tablerowinsertabove : '廿丿乇丕噩 氐賮 賱賱兀毓賱賶',
+	tablerowinsertbelow : '廿丿乇丕噩 氐賮 賱賱兀爻賮賱',
+	tablerowmerge : '丿賲噩 賱賱兀爻賮賱',
+	tablecolmerge : '丿賲噩 賱賱賷賲賷賳',
+	tablerowsplit : '鬲賯爻賲 丕賱氐賮',
+	tablecolsplit : '鬲賯爻賷賲 丕賱毓賲賵丿',
+	tablecoldelete : '丨匕賮 丕賱毓賲賵丿',
+	tablerowdelete : '丨匕賮 丕賱氐賮',
+	noColor : '廿賮鬲乇丕囟賷',
+	pleaseSelectFile : 'Please select file.',
+	invalidImg : "丕賱乇噩丕亍 廿丿禺丕賱 乇丕亘胤 氐丨賷丨.\n丕賱賲賱賮丕鬲 丕賱賲爻賲賵丨 亘賴丕: jpg,gif,bmp,png",
+	invalidMedia : "丕賱乇噩丕亍 廿丿禺丕賱 乇丕亘胤 氐丨賷丨.\n丕賱賲賱賮丕鬲 丕賱賲爻賲賵丨 亘賴丕: swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb",
+	invalidWidth : "丕賱毓乇囟 賷噩亘 兀賳 賷賰賵賳 乇賯賲.",
+	invalidHeight : "丕賱廿乇鬲賮丕毓 賷噩亘 兀賳 賷賰賵賳 乇賯賲.",
+	invalidBorder : "毓乇囟 丕賱丨丿 賷噩亘 兀賳 賷賰賵賳 乇賯賲.",
+	invalidUrl : "丕賱乇噩丕亍 廿丿禺丕賱 乇丕亘胤 丨賷丨.",
+	invalidRows : '氐賮賵賮 睾賷乇 氐丨賷丨.',
+	invalidCols : '兀毓賲丿丞 睾賷乇 氐丨賷丨丞.',
+	invalidPadding : 'The padding must be number.',
+	invalidSpacing : 'The spacing must be number.',
+	invalidJson : 'Invalid JSON string.',
+	uploadSuccess : '鬲賲 乇賮毓 丕賱賲賱賮 亘賳噩丕丨.',
+	cutError : '丨丕賱賷丕 睾賷乇 賲丿毓賵賲丞 賲賳 丕賱賲鬲氐賮丨, 廿爻鬲禺丿賲 廿禺鬲氐丕乇 賱賵丨丞 丕賱賲賮丕鬲賷丨 (Ctrl+X).',
+	copyError : '丨丕賱賷丕 睾賷乇 賲丿毓賵賲丞 賲賳 丕賱賲鬲氐賮丨, 廿爻鬲禺丿賲 廿禺鬲氐丕乇 賱賵丨丞 丕賱賲賮丕鬲賷丨 (Ctrl+C).',
+	pasteError : '丨丕賱賷丕 睾賷乇 賲丿毓賵賲丞 賲賳 丕賱賲鬲氐賮丨, 廿爻鬲禺丿賲 廿禺鬲氐丕乇 賱賵丨丞 丕賱賲賮丕鬲賷丨 (Ctrl+V).',
+	ajaxLoading : 'Loading ...',
+	uploadLoading : 'Uploading ...',
+	uploadError : 'Upload Error',
+	'plainpaste.comment' : '廿爻鬲禺丿賲 廿禺鬲氐丕乇 賱賵丨丞 丕賱賲賮丕鬲賷丨 (Ctrl+V) 賱賱氐賯 丿丕禺賱 丕賱賳丕賮匕丞.',
+	'wordpaste.comment' : '廿爻鬲禺丿賲 廿禺鬲氐丕乇 賱賵丨丞 丕賱賲賮丕鬲賷丨 (Ctrl+V) 賱賱氐賯 丿丕禺賱 丕賱賳丕賮匕丞.',
+	'code.pleaseInput' : 'Please input code.',
+	'link.url' : '丕賱乇丕亘胤',
+	'link.linkType' : '丕賱賴丿賮',
+	'link.newWindow' : '賳丕賮匕丞 噩丿賷丿丞',
+	'link.selfWindow' : '賳賮爻 丕賱賳丕賮匕丞',
+	'flash.url' : '丕賱乇丕亘胤',
+	'flash.width' : '丕賱毓乇囟',
+	'flash.height' : '丕賱廿乇鬲賮丕毓',
+	'flash.upload' : '乇賮毓',
+	'flash.viewServer' : '兀爻鬲毓乇丕囟',
+	'media.url' : '丕賱乇丕亘胤',
+	'media.width' : '丕賱毓乇囟',
+	'media.height' : '丕賱廿乇鬲賮丕毓',
+	'media.autostart' : '鬲卮睾賷賱 鬲賱賯丕卅賷',
+	'media.upload' : '乇賮毓',
+	'media.viewServer' : '兀爻鬲毓乇丕囟',
+	'image.remoteImage' : '廿丿乇丕噩 丕賱乇丕亘胤',
+	'image.localImage' : '乇賮毓',
+	'image.remoteUrl' : '丕賱乇丕亘胤',
+	'image.localUrl' : '丕賱賲賱賮',
+	'image.size' : '丕賱丨噩賲',
+	'image.width' : '丕賱毓乇囟',
+	'image.height' : '丕賱廿乇鬲賮丕毓',
+	'image.resetSize' : '廿爻鬲毓丕丿丞 丕賱兀亘毓丕丿',
+	'image.align' : '賲丨丕匕丕丞',
+	'image.defaultAlign' : '丕賱廿賮鬲乇丕囟賷',
+	'image.leftAlign' : '丕賱賷爻丕乇',
+	'image.rightAlign' : '丕賱賷賲賷賳',
+	'image.imgTitle' : '丕賱毓賳賵丕賳',
+	'image.upload' : '兀爻鬲毓乇丕囟',
+	'image.viewServer' : '兀爻鬲毓乇丕囟',
+	'multiimage.uploadDesc' : 'Allows users to upload <%=uploadLimit%> images, single image size not exceeding <%=sizeLimit%>',
+	'multiimage.startUpload' : 'Start upload',
+	'multiimage.clearAll' : 'Clear all',
+	'multiimage.insertAll' : 'Insert all',
+	'multiimage.queueLimitExceeded' : 'Queue limit exceeded.',
+	'multiimage.fileExceedsSizeLimit' : 'File exceeds size limit.',
+	'multiimage.zeroByteFile' : 'Zero byte file.',
+	'multiimage.invalidFiletype' : 'Invalid file type.',
+	'multiimage.unknownError' : 'Unknown upload error.',
+	'multiimage.pending' : 'Pending ...',
+	'multiimage.uploadError' : 'Upload error',
+	'filemanager.emptyFolder' : '賮丕乇睾',
+	'filemanager.moveup' : '丕賱賲噩賱丿 丕賱兀亘',
+	'filemanager.viewType' : '丕賱毓乇囟: ',
+	'filemanager.viewImage' : '賲氐睾乇丕鬲',
+	'filemanager.listImage' : '賯丕卅賲丞',
+	'filemanager.orderType' : '丕賱鬲乇鬲賷亘: ',
+	'filemanager.fileName' : '亘丕賱廿爻賲',
+	'filemanager.fileSize' : '亘丕賱丨噩賲',
+	'filemanager.fileType' : '亘丕賱賳賵毓',
+	'insertfile.url' : '丕賱乇丕亘胤',
+	'insertfile.title' : '丕賱毓賳賵丕賳',
+	'insertfile.upload' : '乇賮毓',
+	'insertfile.viewServer' : '兀爻鬲毓乇丕囟',
+	'table.cells' : '禺賱丕賷丕',
+	'table.rows' : '氐賮賵賮',
+	'table.cols' : '兀毓賲丿丞',
+	'table.size' : '丕賱兀亘毓丕丿',
+	'table.width' : '丕賱毓乇囟',
+	'table.height' : '丕賱廿乇鬲賮丕毓',
+	'table.percent' : '%',
+	'table.px' : 'px',
+	'table.space' : '丕賱禺丕乇噩',
+	'table.padding' : '丕賱丿丕禺賱',
+	'table.spacing' : '丕賱賮乇丕睾丕鬲',
+	'table.align' : '賲丨丕匕丕賴',
+	'table.textAlign' : '丕賮賯賶',
+	'table.verticalAlign' : '乇兀爻賷',
+	'table.alignDefault' : '廿賮鬲乇丕囟賷',
+	'table.alignLeft' : '賷爻丕乇',
+	'table.alignCenter' : '賵爻胤',
+	'table.alignRight' : '賷賲賷賳',
+	'table.alignTop' : '兀毓賱賶',
+	'table.alignMiddle' : '賲賳鬲氐賮',
+	'table.alignBottom' : '兀爻賮賱',
+	'table.alignBaseline' : 'Baseline',
+	'table.border' : '丕賱丨丿賵丿',
+	'table.borderWidth' : '丕賱毓乇囟',
+	'table.borderColor' : '丕賱賱賵賳',
+	'table.backgroundColor' : '丕賱禺賱賮賷丞',
+	'map.address' : '丕賱毓賳賵丕賳: ',
+	'map.search' : '亘丨孬',
+	'baidumap.address' : '丕賱毓賳賵丕賳: ',
+	'baidumap.search' : '亘丨孬',
+	'baidumap.insertDynamicMap' : 'Dynamic Map',
+	'anchor.name' : '廿爻賲 丕賱乇丕亘胤',
+	'formatblock.formatBlock' : {
+		h1 : '毓賳賵丕賳 1',
+		h2 : '毓賳賵丕賳 2',
+		h3 : '毓賳賵丕賳 3',
+		h4 : '毓賳賵丕賳 4',
+		p : '毓丕丿賷'
+	},
+	'fontname.fontName' : {
+		'Arial' : 'Arial',
+		'Arial Black' : 'Arial Black',
+		'Comic Sans MS' : 'Comic Sans MS',
+		'Courier New' : 'Courier New',
+		'Garamond' : 'Garamond',
+		'Georgia' : 'Georgia',
+		'Tahoma' : 'Tahoma',
+		'Times New Roman' : 'Times New Roman',
+		'Trebuchet MS' : 'Trebuchet MS',
+		'Verdana' : 'Verdana'
+	},
+	'lineheight.lineHeight' : [
+		{'1' : '廿乇鬲賮丕毓 丕賱爻胤乇 1'},
+		{'1.5' : '廿乇鬲賮丕毓 丕賱爻胤乇 1.5'},
+		{'2' : '廿乇鬲賮丕毓 丕賱爻胤乇 2'},
+		{'2.5' : '廿乇鬲賮丕毓 丕賱爻胤乇 2.5'},
+		{'3' : '廿乇鬲賮丕毓 丕賱爻胤乇 3'}
+	],
+	'template.selectTemplate' : '賯丕賱亘',
+	'template.replaceContent' : '廿爻鬲亘丿丕賱 丕賱賲丨鬲賵賶 丕賱丨丕賱賷',
+	'template.fileList' : {
+		'1.html' : '氐賵乇丞 賵賳氐',
+		'2.html' : '噩丿賵賱',
+		'3.html' : '賯丕卅賲丞'
+	}
+}, 'ar');
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/lang/en.js b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/lang/en.js
new file mode 100644
index 0000000..39ce909
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/lang/en.js
@@ -0,0 +1,232 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.lang({
+	source : 'Source',
+	preview : 'Preview',
+	undo : 'Undo(Ctrl+Z)',
+	redo : 'Redo(Ctrl+Y)',
+	cut : 'Cut(Ctrl+X)',
+	copy : 'Copy(Ctrl+C)',
+	paste : 'Paste(Ctrl+V)',
+	plainpaste : 'Paste as plain text',
+	wordpaste : 'Paste from Word',
+	selectall : 'Select all',
+	justifyleft : 'Align left',
+	justifycenter : 'Align center',
+	justifyright : 'Align right',
+	justifyfull : 'Align full',
+	insertorderedlist : 'Ordered list',
+	insertunorderedlist : 'Unordered list',
+	indent : 'Increase indent',
+	outdent : 'Decrease indent',
+	subscript : 'Subscript',
+	superscript : 'Superscript',
+	formatblock : 'Paragraph format',
+	fontname : 'Font family',
+	fontsize : 'Font size',
+	forecolor : 'Text color',
+	hilitecolor : 'Highlight color',
+	bold : 'Bold(Ctrl+B)',
+	italic : 'Italic(Ctrl+I)',
+	underline : 'Underline(Ctrl+U)',
+	strikethrough : 'Strikethrough',
+	removeformat : 'Remove format',
+	image : 'Image',
+	multiimage : 'Multi image',
+	flash : 'Flash',
+	media : 'Embeded media',
+	table : 'Table',
+	tablecell : 'Cell',
+	hr : 'Insert horizontal line',
+	emoticons : 'Insert emoticon',
+	link : 'Link',
+	unlink : 'Unlink',
+	fullscreen : 'Toggle fullscreen mode',
+	about : 'About',
+	print : 'Print',
+	filemanager : 'File Manager',
+	code : 'Insert code',
+	map : 'Google Maps',
+	baidumap : 'Baidu Maps',
+	lineheight : 'Line height',
+	clearhtml : 'Clear HTML code',
+	pagebreak : 'Insert Page Break',
+	quickformat : 'Quick Format',
+	insertfile : 'Insert file',
+	template : 'Insert Template',
+	anchor : 'Anchor',
+	yes : 'OK',
+	no : 'Cancel',
+	close : 'Close',
+	editImage : 'Image properties',
+	deleteImage : 'Delete image',
+	editFlash : 'Flash properties',
+	deleteFlash : 'Delete flash',
+	editMedia : 'Media properties',
+	deleteMedia : 'Delete media',
+	editLink : 'Link properties',
+	deleteLink : 'Unlink',
+	tableprop : 'Table properties',
+	tablecellprop : 'Cell properties',
+	tableinsert : 'Insert table',
+	tabledelete : 'Delete table',
+	tablecolinsertleft : 'Insert column left',
+	tablecolinsertright : 'Insert column right',
+	tablerowinsertabove : 'Insert row above',
+	tablerowinsertbelow : 'Insert row below',
+	tablerowmerge : 'Merge down',
+	tablecolmerge : 'Merge right',
+	tablerowsplit : 'Split row',
+	tablecolsplit : 'Split column',
+	tablecoldelete : 'Delete column',
+	tablerowdelete : 'Delete row',
+	noColor : 'Default',
+	pleaseSelectFile : 'Please select file.',
+	invalidImg : "Please type valid URL.\nAllowed file extension: jpg,gif,bmp,png",
+	invalidMedia : "Please type valid URL.\nAllowed file extension: swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb",
+	invalidWidth : "The width must be number.",
+	invalidHeight : "The height must be number.",
+	invalidBorder : "The border must be number.",
+	invalidUrl : "Please type valid URL.",
+	invalidRows : 'Invalid rows.',
+	invalidCols : 'Invalid columns.',
+	invalidPadding : 'The padding must be number.',
+	invalidSpacing : 'The spacing must be number.',
+	invalidJson : 'Invalid JSON string.',
+	uploadSuccess : 'Upload success.',
+	cutError : 'Currently not supported by your browser, use keyboard shortcut(Ctrl+X) instead.',
+	copyError : 'Currently not supported by your browser, use keyboard shortcut(Ctrl+C) instead.',
+	pasteError : 'Currently not supported by your browser, use keyboard shortcut(Ctrl+V) instead.',
+	ajaxLoading : 'Loading ...',
+	uploadLoading : 'Uploading ...',
+	uploadError : 'Upload Error',
+	'plainpaste.comment' : 'Use keyboard shortcut(Ctrl+V) to paste the text into the window.',
+	'wordpaste.comment' : 'Use keyboard shortcut(Ctrl+V) to paste the text into the window.',
+	'code.pleaseInput' : 'Please input code.',
+	'link.url' : 'URL',
+	'link.linkType' : 'Target',
+	'link.newWindow' : 'New window',
+	'link.selfWindow' : 'Same window',
+	'flash.url' : 'URL',
+	'flash.width' : 'Width',
+	'flash.height' : 'Height',
+	'flash.upload' : 'Upload',
+	'flash.viewServer' : 'Browse',
+	'media.url' : 'URL',
+	'media.width' : 'Width',
+	'media.height' : 'Height',
+	'media.autostart' : 'Auto start',
+	'media.upload' : 'Upload',
+	'media.viewServer' : 'Browse',
+	'image.remoteImage' : 'Insert URL',
+	'image.localImage' : 'Upload',
+	'image.remoteUrl' : 'URL',
+	'image.localUrl' : 'File',
+	'image.size' : 'Size',
+	'image.width' : 'Width',
+	'image.height' : 'Height',
+	'image.resetSize' : 'Reset dimensions',
+	'image.align' : 'Align',
+	'image.defaultAlign' : 'Default',
+	'image.leftAlign' : 'Left',
+	'image.rightAlign' : 'Right',
+	'image.imgTitle' : 'Title',
+	'image.upload' : 'Browse',
+	'image.viewServer' : 'Browse',
+	'multiimage.uploadDesc' : 'Allows users to upload <%=uploadLimit%> images, single image size not exceeding <%=sizeLimit%>',
+	'multiimage.startUpload' : 'Start upload',
+	'multiimage.clearAll' : 'Clear all',
+	'multiimage.insertAll' : 'Insert all',
+	'multiimage.queueLimitExceeded' : 'Queue limit exceeded.',
+	'multiimage.fileExceedsSizeLimit' : 'File exceeds size limit.',
+	'multiimage.zeroByteFile' : 'Zero byte file.',
+	'multiimage.invalidFiletype' : 'Invalid file type.',
+	'multiimage.unknownError' : 'Unknown upload error.',
+	'multiimage.pending' : 'Pending ...',
+	'multiimage.uploadError' : 'Upload error',
+	'filemanager.emptyFolder' : 'Blank',
+	'filemanager.moveup' : 'Parent folder',
+	'filemanager.viewType' : 'Display: ',
+	'filemanager.viewImage' : 'Thumbnails',
+	'filemanager.listImage' : 'List',
+	'filemanager.orderType' : 'Sorting: ',
+	'filemanager.fileName' : 'By name',
+	'filemanager.fileSize' : 'By size',
+	'filemanager.fileType' : 'By type',
+	'insertfile.url' : 'URL',
+	'insertfile.title' : 'Title',
+	'insertfile.upload' : 'Upload',
+	'insertfile.viewServer' : 'Browse',
+	'table.cells' : 'Cells',
+	'table.rows' : 'Rows',
+	'table.cols' : 'Columns',
+	'table.size' : 'Dimensions',
+	'table.width' : 'Width',
+	'table.height' : 'Height',
+	'table.percent' : '%',
+	'table.px' : 'px',
+	'table.space' : 'Space',
+	'table.padding' : 'Padding',
+	'table.spacing' : 'Spacing',
+	'table.align' : 'Align',
+	'table.textAlign' : 'Horizontal',
+	'table.verticalAlign' : 'Vertical',
+	'table.alignDefault' : 'Default',
+	'table.alignLeft' : 'Left',
+	'table.alignCenter' : 'Center',
+	'table.alignRight' : 'Right',
+	'table.alignTop' : 'Top',
+	'table.alignMiddle' : 'Middle',
+	'table.alignBottom' : 'Bottom',
+	'table.alignBaseline' : 'Baseline',
+	'table.border' : 'Border',
+	'table.borderWidth' : 'Width',
+	'table.borderColor' : 'Color',
+	'table.backgroundColor' : 'Background',
+	'map.address' : 'Address: ',
+	'map.search' : 'Search',
+	'baidumap.address' : 'Address: ',
+	'baidumap.search' : 'Search',
+	'baidumap.insertDynamicMap' : 'Dynamic Map',
+	'anchor.name' : 'Anchor name',
+	'formatblock.formatBlock' : {
+		h1 : 'Heading 1',
+		h2 : 'Heading 2',
+		h3 : 'Heading 3',
+		h4 : 'Heading 4',
+		p : 'Normal'
+	},
+	'fontname.fontName' : {
+		'Arial' : 'Arial',
+		'Arial Black' : 'Arial Black',
+		'Comic Sans MS' : 'Comic Sans MS',
+		'Courier New' : 'Courier New',
+		'Garamond' : 'Garamond',
+		'Georgia' : 'Georgia',
+		'Tahoma' : 'Tahoma',
+		'Times New Roman' : 'Times New Roman',
+		'Trebuchet MS' : 'Trebuchet MS',
+		'Verdana' : 'Verdana'
+	},
+	'lineheight.lineHeight' : [
+		{'1' : 'Line height 1'},
+		{'1.5' : 'Line height 1.5'},
+		{'2' : 'Line height 2'},
+		{'2.5' : 'Line height 2.5'},
+		{'3' : 'Line height 3'}
+	],
+	'template.selectTemplate' : 'Template',
+	'template.replaceContent' : 'Replace current content',
+	'template.fileList' : {
+		'1.html' : 'Image and Text',
+		'2.html' : 'Table',
+		'3.html' : 'List'
+	}
+}, 'en');
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/lang/ko.js b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/lang/ko.js
new file mode 100644
index 0000000..2341042
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/lang/ko.js
@@ -0,0 +1,237 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Composite <ukjinplant@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.lang({
+	source : '靻岇姢',
+	preview : '氙鸽Μ氤搓赴',
+	undo : '鞛戩梾旆唽(Ctrl+Z)',
+	redo : '鞛戩梾鞛皽(Ctrl+Y)',
+	cut : '鞛橂澕雮搓赴(Ctrl+X)',
+	copy : '氤奠偓(Ctrl+C)',
+	paste : '攵欖棳雱j赴(Ctrl+V)',
+	plainpaste : '鞚茧皹 韰嶌姢韸鸽 攵欖棳雱j赴',
+	wordpaste : '鞗岆摐 氍胳劀搿� 攵欖棳雱j赴',
+	selectall : '鞝勳泊 靹犿儩',
+	justifyleft : '鞕检 鞝曤牞',
+	justifycenter : '臧�鞖措嵃 鞝曤牞',
+	justifyright : '鞓るジ飒� 鞝曤牞',
+	justifyfull : '鞏戩 鞝曤牞',
+	insertorderedlist : '靾滌劀 氇╇',
+	insertunorderedlist : '牍勳垳靹� 氇╇',
+	indent : '霌れ棳鞊瓣赴',
+	outdent : '雮挫柎鞊瓣赴',
+	subscript : '鞎勲灚觳瀽',
+	superscript : '鞙楈波鞛�',
+	formatblock : '氍鸽嫧 順曥嫕',
+	fontname : '旮�昙�',
+	fontsize : '旮�鞛� 韥赴',
+	forecolor : '旮�鞛愳儔',
+	hilitecolor : '臧曥“靸�',
+	bold : '甑店矊(Ctrl+B)',
+	italic : '鞚错厰毽�(Ctrl+I)',
+	underline : '牍濎(Ctrl+U)',
+	strikethrough : '旆唽靹�',
+	removeformat : '順曥嫕 鞝滉卑',
+	image : '鞚措歆� 於旉皜',
+	multiimage : '鞐煬 鞚措歆� 於旉皜',
+	flash : '頂岆灅鞁� 於旉皜',
+	media : '氙鸽敂鞏� 於旉皜',
+	table : '響�',
+	tablecell : '鞐�',
+	hr : '甑秳靹� 於旉皜',
+	emoticons : '鞚措韹办綐 於旉皜',
+	link : '毵來伂',
+	unlink : '毵來伂 鞝滉卑',
+	fullscreen : '鞝勳泊 頇旊┐ 氇摐',
+	about : '鞚� 鞐愲敂韯半姅...',
+	print : '鞚胳噭',
+	filemanager : '韺岇澕 甏�毽瀽',
+	code : '旖旊摐 於旉皜',
+	map : '甑竴 毵� 於旉皜',
+	baidumap : '氚旍澊霊� 毵� 於旉皜',
+	lineheight : '頄� 臧勱博',
+	clearhtml : 'HTML 旖旊摐 鞝曤Μ',
+	pagebreak : '韼橃澊歆� 甑秳 於旉皜',
+	quickformat : '牍犽ジ 順曥嫕',
+	insertfile : '韺岇澕 於旉皜',
+	template : '韰滍攲毽� 於旉皜',
+	anchor : '毂呹皥頂�',
+	yes : '頇曥澑',
+	no : '旆唽',
+	close : '雼赴',
+	editImage : '鞚措歆� 靻嶌劚',
+	deleteImage : '鞚措歆� 靷牅',
+	editFlash : '頂岆灅鞁� 靻嶌劚',
+	deleteFlash : '頂岆灅鞁� 靷牅',
+	editMedia : '氙鸽敂鞏� 靻嶌劚',
+	deleteMedia : '氙鸽敂鞏� 靷牅',
+	editLink : '毵來伂 靻嶌劚',
+	deleteLink : '毵來伂 靷牅',
+	tableprop : '響� 靻嶌劚',
+	tablecellprop : '鞐� 靻嶌劚',
+	tableinsert : '響� 於旉皜',
+	tabledelete : '響� 靷牅',
+	tablecolinsertleft : '鞕检鞙茧 鞐� 於旉皜',
+	tablecolinsertright : '鞓るジ飒届溂搿� 鞐� 於旉皜',
+	tablerowinsertabove : '鞙勳鞙茧 鞐� 於旉皜',
+	tablerowinsertbelow : '鞎勲灅飒届溂搿� 鞐� 於旉皜',
+	tablerowmerge : '鞎勲灅搿� 氤戫暕',
+	tablecolmerge : '鞓るジ飒届溂搿� 氤戫暕',
+	tablerowsplit : '頄� 雮橂垊旮�',
+	tablecolsplit : '鞐� 雮橂垊旮�',
+	tablecoldelete : '鞐� 靷牅',
+	tablerowdelete : '頄� 靷牅',
+	noColor : '旮半掣靸�',
+	pleaseSelectFile : '韺岇澕 靹犿儩',
+	invalidImg : "鞓皵毳� 欤检唽毳� 鞛呺牓頃橃劯鞖�.\njpg,gif,bmp,png 順曥嫕鞚� 臧�電ロ暕雼堧嫟.",
+	invalidMedia : "鞓皵毳� 欤检唽毳� 鞛呺牓頃橃劯鞖�.\nswf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb 順曥嫕鞚� 臧�電ロ暕雼堧嫟.",
+	invalidWidth : "雱撿澊 臧掛潃 靾瀽鞐暭 頃╇媹雼�.",
+	invalidHeight : "雴掛澊 臧掛潃 靾瀽鞐暭 頃╇媹雼�.",
+	invalidBorder : "甑店赴 臧掛潃 靾瀽鞐暭 頃╇媹雼�.",
+	invalidUrl : "鞓皵毳� 欤检唽毳� 鞛呺牓頃橃劯鞖�.",
+	invalidRows : '鞓皵毳� 頄夓澊 鞎勲嫏雼堧嫟.',
+	invalidCols : '鞓皵毳� 鞐挫澊 鞎勲嫏雼堧嫟.',
+	invalidPadding : '鞎堨 鞐氨 臧掛潃 靾瀽鞐暭 頃╇媹雼�.',
+	invalidSpacing : '臧勱博 旮胳澊 臧掛潃 靾瀽鞐暭 頃╇媹雼�.',
+	invalidJson : '鞓皵毳� JSON 順曥嫕鞚� 鞎勲嫏雼堧嫟.',
+	uploadSuccess : '鞐呺霌滉皜 鞕勲霅橃棃鞀惦媹雼�.',
+	cutError : '敫岆澕鞖办爛臧� 鞛橂澕雮搓赴 旮半姤鞚� 歆�鞗愴晿歆� 鞎婌姷雼堧嫟, 雼稌韨る 雽�鞁� 靷毄頃橃劯鞖�. (Ctrl+X)',
+	copyError : '敫岆澕鞖办爛臧� 氤奠偓 旮半姤鞚� 歆�鞗愴晿歆� 鞎婌姷雼堧嫟, 雼稌韨る 雽�鞁� 靷毄頃橃劯鞖�. (Ctrl+X)',
+	pasteError : '敫岆澕鞖办爛臧� 攵欖棳雱j赴 旮半姤鞚� 歆�鞗愴晿歆� 鞎婌姷雼堧嫟, 雼稌韨る 雽�鞁� 靷毄頃橃劯鞖�. (Ctrl+X)',
+	ajaxLoading : '攵堧煬鞓る姅 欷� ...',
+	uploadLoading : '鞐呺霌� 欷� ...',
+	uploadError : '鞐呺霌� 鞓る',
+	'plainpaste.comment' : '雼稌韨�(Ctrl+V)毳� 韱淀晿鞐� 鞐赴鞐� 韰嶌姢韸鸽ゼ 攵欖棳雱l溂靹胳殧.',
+	'wordpaste.comment' : '雼稌韨�(Ctrl+V)毳� 韱淀晿鞐� 鞐赴鞐� 鞗岆摐 韰嶌姢韸鸽ゼ 攵欖棳雱l溂靹胳殧.',
+	'code.pleaseInput' : 'Please input code.',
+	'link.url' : '欤检唽',
+	'link.linkType' : '彀�',
+	'link.newWindow' : '靸� 彀�',
+	'link.selfWindow' : '順勳灛 彀�',
+	'flash.url' : '欤检唽',
+	'flash.width' : '雱撿澊',
+	'flash.height' : '雴掛澊',
+	'flash.upload' : '鞐呺霌�',
+	'flash.viewServer' : '彀眷晞氤搓赴',
+	'media.url' : '欤检唽',
+	'media.width' : '雱撿澊',
+	'media.height' : '雴掛澊',
+	'media.autostart' : '鞛愲彊 鞁滌瀾',
+	'media.upload' : '鞐呺霌�',
+	'media.viewServer' : '彀眷晞氤搓赴',
+	'image.remoteImage' : '鞕鸽秬 鞚措歆�',
+	'image.localImage' : '雮措秬 鞚措歆�',
+	'image.remoteUrl' : '欤检唽',
+	'image.localUrl' : '韺岇澕',
+	'image.size' : '韥赴',
+	'image.width' : '雱撿澊',
+	'image.height' : '雴掛澊',
+	'image.resetSize' : '旮半掣 韥赴搿�',
+	'image.align' : '鞝曤牞',
+	'image.defaultAlign' : '旮半掣',
+	'image.leftAlign' : '鞕检',
+	'image.rightAlign' : '鞓るジ飒�',
+	'image.imgTitle' : '鞝滊',
+	'image.upload' : '彀眷晞氤搓赴',
+	'image.viewServer' : '彀眷晞氤搓赴',
+	'multiimage.uploadDesc' : '斓滊寑 鞚措歆� 臧滌垬: <%=uploadLimit%>臧�, 臧滊嫻 鞚措歆� 韥赴: <%=sizeLimit%>',
+	'multiimage.startUpload' : '鞐呺霌� 鞁滌瀾',
+	'multiimage.clearAll' : '氇憪 靷牅',
+	'multiimage.insertAll' : '氇憪 靷届瀰',
+	'multiimage.queueLimitExceeded' : '鞐呺霌� 臧滌垬臧� 齑堦臣霅橃棃鞀惦媹雼�.',
+	'multiimage.fileExceedsSizeLimit' : '鞐呺霌� 韥赴臧� 齑堦臣霅橃棃鞀惦媹雼�.',
+	'multiimage.zeroByteFile' : '韺岇澕 韥赴臧� 鞐嗢姷雼堧嫟.',
+	'multiimage.invalidFiletype' : '鞓皵毳� 鞚措歆�臧� 鞎勲嫏雼堧嫟.',
+	'multiimage.unknownError' : '鞎� 靾� 鞐嗠姅 鞐呺霌� 鞓る臧� 氚滌儩頃橃榾鞀惦媹雼�.',
+	'multiimage.pending' : '觳橂Μ 欷� ...',
+	'multiimage.uploadError' : '鞐呺霌� 鞓る',
+	'filemanager.emptyFolder' : '牍� 韽措崝',
+	'filemanager.moveup' : '鞙勲',
+	'filemanager.viewType' : '氤搓赴 氚╈嫕: ',
+	'filemanager.viewImage' : '氙鸽Μ 氤搓赴',
+	'filemanager.listImage' : '氇╇',
+	'filemanager.orderType' : '鞝曤牞 氚╈嫕: ',
+	'filemanager.fileName' : '鞚措氤�',
+	'filemanager.fileSize' : '韥赴氤�',
+	'filemanager.fileType' : '膦呺氤�',
+	'insertfile.url' : '欤检唽',
+	'insertfile.title' : '鞝滊',
+	'insertfile.upload' : '鞐呺霌�',
+	'insertfile.viewServer' : '彀眷晞氤搓赴',
+	'table.cells' : '鞐�',
+	'table.rows' : '頄�',
+	'table.cols' : '鞐�',
+	'table.size' : '響� 韥赴',
+	'table.width' : '雱撿澊',
+	'table.height' : '雴掛澊',
+	'table.percent' : '%',
+	'table.px' : 'px',
+	'table.space' : '臧勱博',
+	'table.padding' : '鞎堨鞐氨',
+	'table.spacing' : '臧勱博',
+	'table.align' : '鞝曤牞',
+	'table.textAlign' : '靾橃',
+	'table.verticalAlign' : '靾橅弶',
+	'table.alignDefault' : '旮半掣',
+	'table.alignLeft' : '鞕检',
+	'table.alignCenter' : '臧�鞖措嵃',
+	'table.alignRight' : '鞓るジ飒�',
+	'table.alignTop' : '鞙勳',
+	'table.alignMiddle' : '欷戧皠',
+	'table.alignBottom' : '鞎勲灅飒�',
+	'table.alignBaseline' : '旮�鞛愱赴欷�',
+	'table.border' : '韰岆憪毽�',
+	'table.borderWidth' : '韥赴',
+	'table.borderColor' : '靸夓儊',
+	'table.backgroundColor' : '氚瓣步',
+	'map.address' : '欤检唽: ',
+	'map.search' : '瓴�靸�',
+	'baidumap.address' : '欤检唽: ',
+	'baidumap.search' : '瓴�靸�',
+	'baidumap.insertDynamicMap' : '霃欖爜 歆�霃�',
+	'anchor.name' : '毂呹皥頂茧獏',
+	'formatblock.formatBlock' : {
+		h1 : '鞝滊 1',
+		h2 : '鞝滊 2',
+		h3 : '鞝滊 3',
+		h4 : '鞝滊 4',
+		p : '氤鸽'
+	},
+	'fontname.fontName' : {
+		'Gulim' : '甑措',
+		'Dotum' : '霃嬱泙',
+		'Batang' : '氚旐儠',
+		'Gungsuh' : '甓侅劀',
+		'Malgun Gothic' : '毵戩潃 瓿犽敃',
+		'Arial' : 'Arial',
+		'Arial Black' : 'Arial Black',
+		'Comic Sans MS' : 'Comic Sans MS',
+		'Courier New' : 'Courier New',
+		'Garamond' : 'Garamond',
+		'Georgia' : 'Georgia',
+		'Tahoma' : 'Tahoma',
+		'Times New Roman' : 'Times New Roman',
+		'Trebuchet MS' : 'Trebuchet MS',
+		'Verdana' : 'Verdana'
+	},
+	'lineheight.lineHeight' : [
+		{'1' : '頄夑皠 1'},
+		{'1.5' : '頄夑皠 1.5'},
+		{'2' : '頄夑皠 2'},
+		{'2.5' : '頄夑皠 2.5'},
+		{'3' : '頄夑皠 3'}
+	],
+	'template.selectTemplate' : '韰滍攲毽�',
+	'template.replaceContent' : '雮挫毄 氚旉靖旮�',
+	'template.fileList' : {
+		'1.html' : '鞚措歆�鞕� 韰嶌姢韸�',
+		'2.html' : '響�',
+		'3.html' : '氇╇'
+	}
+}, 'ko');
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/lang/zh_CN.js b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/lang/zh_CN.js
new file mode 100644
index 0000000..c8506f3
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/lang/zh_CN.js
@@ -0,0 +1,236 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.lang({
+	source : 'HTML浠g爜',
+	preview : '棰勮',
+	undo : '鍚庨��(Ctrl+Z)',
+	redo : '鍓嶈繘(Ctrl+Y)',
+	cut : '鍓垏(Ctrl+X)',
+	copy : '澶嶅埗(Ctrl+C)',
+	paste : '绮樿创(Ctrl+V)',
+	plainpaste : '绮樿创涓烘棤鏍煎紡鏂囨湰',
+	wordpaste : '浠嶹ord绮樿创',
+	selectall : '鍏ㄩ��(Ctrl+A)',
+	justifyleft : '宸﹀榻�',
+	justifycenter : '灞呬腑',
+	justifyright : '鍙冲榻�',
+	justifyfull : '涓ょ瀵归綈',
+	insertorderedlist : '缂栧彿',
+	insertunorderedlist : '椤圭洰绗﹀彿',
+	indent : '澧炲姞缂╄繘',
+	outdent : '鍑忓皯缂╄繘',
+	subscript : '涓嬫爣',
+	superscript : '涓婃爣',
+	formatblock : '娈佃惤',
+	fontname : '瀛椾綋',
+	fontsize : '鏂囧瓧澶у皬',
+	forecolor : '鏂囧瓧棰滆壊',
+	hilitecolor : '鏂囧瓧鑳屾櫙',
+	bold : '绮椾綋(Ctrl+B)',
+	italic : '鏂滀綋(Ctrl+I)',
+	underline : '涓嬪垝绾�(Ctrl+U)',
+	strikethrough : '鍒犻櫎绾�',
+	removeformat : '鍒犻櫎鏍煎紡',
+	image : '鍥剧墖',
+	multiimage : '鎵归噺鍥剧墖涓婁紶',
+	flash : 'Flash',
+	media : '瑙嗛煶棰�',
+	table : '琛ㄦ牸',
+	tablecell : '鍗曞厓鏍�',
+	hr : '鎻掑叆妯嚎',
+	emoticons : '鎻掑叆琛ㄦ儏',
+	link : '瓒呯骇閾炬帴',
+	unlink : '鍙栨秷瓒呯骇閾炬帴',
+	fullscreen : '鍏ㄥ睆鏄剧ず',
+	about : '鍏充簬',
+	print : '鎵撳嵃(Ctrl+P)',
+	filemanager : '鏂囦欢绌洪棿',
+	code : '鎻掑叆绋嬪簭浠g爜',
+	map : 'Google鍦板浘',
+	baidumap : '鐧惧害鍦板浘',
+	lineheight : '琛岃窛',
+	clearhtml : '娓呯悊HTML浠g爜',
+	pagebreak : '鎻掑叆鍒嗛〉绗�',
+	quickformat : '涓�閿帓鐗�',
+	insertfile : '鎻掑叆鏂囦欢',
+	template : '鎻掑叆妯℃澘',
+	anchor : '閿氱偣',
+	yes : '纭畾',
+	no : '鍙栨秷',
+	close : '鍏抽棴',
+	editImage : '鍥剧墖灞炴��',
+	deleteImage : '鍒犻櫎鍥剧墖',
+	editFlash : 'Flash灞炴��',
+	deleteFlash : '鍒犻櫎Flash',
+	editMedia : '瑙嗛煶棰戝睘鎬�',
+	deleteMedia : '鍒犻櫎瑙嗛煶棰�',
+	editLink : '瓒呯骇閾炬帴灞炴��',
+	deleteLink : '鍙栨秷瓒呯骇閾炬帴',
+	editAnchor : '閿氱偣灞炴��',
+	deleteAnchor : '鍒犻櫎閿氱偣',
+	tableprop : '琛ㄦ牸灞炴��',
+	tablecellprop : '鍗曞厓鏍煎睘鎬�',
+	tableinsert : '鎻掑叆琛ㄦ牸',
+	tabledelete : '鍒犻櫎琛ㄦ牸',
+	tablecolinsertleft : '宸︿晶鎻掑叆鍒�',
+	tablecolinsertright : '鍙充晶鎻掑叆鍒�',
+	tablerowinsertabove : '涓婃柟鎻掑叆琛�',
+	tablerowinsertbelow : '涓嬫柟鎻掑叆琛�',
+	tablerowmerge : '鍚戜笅鍚堝苟鍗曞厓鏍�',
+	tablecolmerge : '鍚戝彸鍚堝苟鍗曞厓鏍�',
+	tablerowsplit : '鎷嗗垎琛�',
+	tablecolsplit : '鎷嗗垎鍒�',
+	tablecoldelete : '鍒犻櫎鍒�',
+	tablerowdelete : '鍒犻櫎琛�',
+	noColor : '鏃犻鑹�',
+	pleaseSelectFile : '璇烽�夋嫨鏂囦欢銆�',
+	invalidImg : "璇疯緭鍏ユ湁鏁堢殑URL鍦板潃銆俓n鍙厑璁竕pg,gif,bmp,png鏍煎紡銆�",
+	invalidMedia : "璇疯緭鍏ユ湁鏁堢殑URL鍦板潃銆俓n鍙厑璁竤wf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb鏍煎紡銆�",
+	invalidWidth : "瀹藉害蹇呴』涓烘暟瀛椼��",
+	invalidHeight : "楂樺害蹇呴』涓烘暟瀛椼��",
+	invalidBorder : "杈规蹇呴』涓烘暟瀛椼��",
+	invalidUrl : "璇疯緭鍏ユ湁鏁堢殑URL鍦板潃銆�",
+	invalidRows : '琛屾暟涓哄繀閫夐」锛屽彧鍏佽杈撳叆澶т簬0鐨勬暟瀛椼��',
+	invalidCols : '鍒楁暟涓哄繀閫夐」锛屽彧鍏佽杈撳叆澶т簬0鐨勬暟瀛椼��',
+	invalidPadding : '杈硅窛蹇呴』涓烘暟瀛椼��',
+	invalidSpacing : '闂磋窛蹇呴』涓烘暟瀛椼��',
+	invalidJson : '鏈嶅姟鍣ㄥ彂鐢熸晠闅溿��',
+	uploadSuccess : '涓婁紶鎴愬姛銆�',
+	cutError : '鎮ㄧ殑娴忚鍣ㄥ畨鍏ㄨ缃笉鍏佽浣跨敤鍓垏鎿嶄綔锛岃浣跨敤蹇嵎閿�(Ctrl+X)鏉ュ畬鎴愩��',
+	copyError : '鎮ㄧ殑娴忚鍣ㄥ畨鍏ㄨ缃笉鍏佽浣跨敤澶嶅埗鎿嶄綔锛岃浣跨敤蹇嵎閿�(Ctrl+C)鏉ュ畬鎴愩��',
+	pasteError : '鎮ㄧ殑娴忚鍣ㄥ畨鍏ㄨ缃笉鍏佽浣跨敤绮樿创鎿嶄綔锛岃浣跨敤蹇嵎閿�(Ctrl+V)鏉ュ畬鎴愩��',
+	ajaxLoading : '鍔犺浇涓紝璇风◢鍊� ...',
+	uploadLoading : '涓婁紶涓紝璇风◢鍊� ...',
+	uploadError : '涓婁紶閿欒',
+	'plainpaste.comment' : '璇蜂娇鐢ㄥ揩鎹烽敭(Ctrl+V)鎶婂唴瀹圭矘璐村埌涓嬮潰鐨勬柟妗嗛噷銆�',
+	'wordpaste.comment' : '璇蜂娇鐢ㄥ揩鎹烽敭(Ctrl+V)鎶婂唴瀹圭矘璐村埌涓嬮潰鐨勬柟妗嗛噷銆�',
+	'code.pleaseInput' : '璇疯緭鍏ョ▼搴忎唬鐮併��',
+	'link.url' : 'URL',
+	'link.linkType' : '鎵撳紑绫诲瀷',
+	'link.newWindow' : '鏂扮獥鍙�',
+	'link.selfWindow' : '褰撳墠绐楀彛',
+	'flash.url' : 'URL',
+	'flash.width' : '瀹藉害',
+	'flash.height' : '楂樺害',
+	'flash.upload' : '涓婁紶',
+	'flash.viewServer' : '鏂囦欢绌洪棿',
+	'media.url' : 'URL',
+	'media.width' : '瀹藉害',
+	'media.height' : '楂樺害',
+	'media.autostart' : '鑷姩鎾斁',
+	'media.upload' : '涓婁紶',
+	'media.viewServer' : '鏂囦欢绌洪棿',
+	'image.remoteImage' : '缃戠粶鍥剧墖',
+	'image.localImage' : '鏈湴涓婁紶',
+	'image.remoteUrl' : '鍥剧墖鍦板潃',
+	'image.localUrl' : '涓婁紶鏂囦欢',
+	'image.size' : '鍥剧墖澶у皬',
+	'image.width' : '瀹�',
+	'image.height' : '楂�',
+	'image.resetSize' : '閲嶇疆澶у皬',
+	'image.align' : '瀵归綈鏂瑰紡',
+	'image.defaultAlign' : '榛樿鏂瑰紡',
+	'image.leftAlign' : '宸﹀榻�',
+	'image.rightAlign' : '鍙冲榻�',
+	'image.imgTitle' : '鍥剧墖璇存槑',
+	'image.upload' : '娴忚...',
+	'image.viewServer' : '鍥剧墖绌洪棿',
+	'multiimage.uploadDesc' : '鍏佽鐢ㄦ埛鍚屾椂涓婁紶<%=uploadLimit%>寮犲浘鐗囷紝鍗曞紶鍥剧墖瀹归噺涓嶈秴杩�<%=sizeLimit%>',
+	'multiimage.startUpload' : '寮�濮嬩笂浼�',
+	'multiimage.clearAll' : '鍏ㄩ儴娓呯┖',
+	'multiimage.insertAll' : '鍏ㄩ儴鎻掑叆',
+	'multiimage.queueLimitExceeded' : '鏂囦欢鏁伴噺瓒呰繃闄愬埗銆�',
+	'multiimage.fileExceedsSizeLimit' : '鏂囦欢澶у皬瓒呰繃闄愬埗銆�',
+	'multiimage.zeroByteFile' : '鏃犳硶涓婁紶绌烘枃浠躲��',
+	'multiimage.invalidFiletype' : '鏂囦欢绫诲瀷涓嶆纭��',
+	'multiimage.unknownError' : '鍙戠敓寮傚父锛屾棤娉曚笂浼犮��',
+	'multiimage.pending' : '绛夊緟涓婁紶',
+	'multiimage.uploadError' : '涓婁紶澶辫触',
+	'filemanager.emptyFolder' : '绌烘枃浠跺す',
+	'filemanager.moveup' : '绉诲埌涓婁竴绾ф枃浠跺す',
+	'filemanager.viewType' : '鏄剧ず鏂瑰紡锛�',
+	'filemanager.viewImage' : '缂╃暐鍥�',
+	'filemanager.listImage' : '璇︾粏淇℃伅',
+	'filemanager.orderType' : '鎺掑簭鏂瑰紡锛�',
+	'filemanager.fileName' : '鍚嶇О',
+	'filemanager.fileSize' : '澶у皬',
+	'filemanager.fileType' : '绫诲瀷',
+	'insertfile.url' : 'URL',
+	'insertfile.title' : '鏂囦欢璇存槑',
+	'insertfile.upload' : '涓婁紶',
+	'insertfile.viewServer' : '鏂囦欢绌洪棿',
+	'table.cells' : '鍗曞厓鏍兼暟',
+	'table.rows' : '琛屾暟',
+	'table.cols' : '鍒楁暟',
+	'table.size' : '澶у皬',
+	'table.width' : '瀹藉害',
+	'table.height' : '楂樺害',
+	'table.percent' : '%',
+	'table.px' : 'px',
+	'table.space' : '杈硅窛闂磋窛',
+	'table.padding' : '杈硅窛',
+	'table.spacing' : '闂磋窛',
+	'table.align' : '瀵归綈鏂瑰紡',
+	'table.textAlign' : '姘村钩瀵归綈',
+	'table.verticalAlign' : '鍨傜洿瀵归綈',
+	'table.alignDefault' : '榛樿',
+	'table.alignLeft' : '宸﹀榻�',
+	'table.alignCenter' : '灞呬腑',
+	'table.alignRight' : '鍙冲榻�',
+	'table.alignTop' : '椤堕儴',
+	'table.alignMiddle' : '涓儴',
+	'table.alignBottom' : '搴曢儴',
+	'table.alignBaseline' : '鍩虹嚎',
+	'table.border' : '杈规',
+	'table.borderWidth' : '杈规',
+	'table.borderColor' : '棰滆壊',
+	'table.backgroundColor' : '鑳屾櫙棰滆壊',
+	'map.address' : '鍦板潃: ',
+	'map.search' : '鎼滅储',
+	'baidumap.address' : '鍦板潃: ',
+	'baidumap.search' : '鎼滅储',
+	'baidumap.insertDynamicMap' : '鎻掑叆鍔ㄦ�佸湴鍥�',
+	'anchor.name' : '閿氱偣鍚嶇О',
+	'formatblock.formatBlock' : {
+		h1 : '鏍囬 1',
+		h2 : '鏍囬 2',
+		h3 : '鏍囬 3',
+		h4 : '鏍囬 4',
+		p : '姝� 鏂�'
+	},
+	'fontname.fontName' : {
+		'SimSun' : '瀹嬩綋',
+		'NSimSun' : '鏂板畫浣�',
+		'FangSong_GB2312' : '浠垮畫_GB2312',
+		'KaiTi_GB2312' : '妤蜂綋_GB2312',
+		'SimHei' : '榛戜綋',
+		'Microsoft YaHei' : '寰蒋闆呴粦',
+		'Arial' : 'Arial',
+		'Arial Black' : 'Arial Black',
+		'Times New Roman' : 'Times New Roman',
+		'Courier New' : 'Courier New',
+		'Tahoma' : 'Tahoma',
+		'Verdana' : 'Verdana'
+	},
+	'lineheight.lineHeight' : [
+		{'1' : '鍗曞�嶈璺�'},
+		{'1.5' : '1.5鍊嶈璺�'},
+		{'2' : '2鍊嶈璺�'},
+		{'2.5' : '2.5鍊嶈璺�'},
+		{'3' : '3鍊嶈璺�'}
+	],
+	'template.selectTemplate' : '鍙�夋ā鏉�',
+	'template.replaceContent' : '鏇挎崲褰撳墠鍐呭',
+	'template.fileList' : {
+		'1.html' : '鍥剧墖鍜屾枃瀛�',
+		'2.html' : '琛ㄦ牸',
+		'3.html' : '椤圭洰缂栧彿'
+	}
+}, 'zh_CN');
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/lang/zh_TW.js b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/lang/zh_TW.js
new file mode 100644
index 0000000..ceac2af
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/lang/zh_TW.js
@@ -0,0 +1,235 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.lang({
+	source : '鍘熷纰�',
+	preview : '闋愯',
+	undo : '寰╁師(Ctrl+Z)',
+	redo : '閲嶈(Ctrl+Y)',
+	cut : '鍓笅(Ctrl+X)',
+	copy : '瑜囪=(Ctrl+C)',
+	paste : '璨间笂(Ctrl+V)',
+	plainpaste : '璨肩偤绱旀枃瀛楁牸寮�',
+	wordpaste : '鑷猈ord璨间笂',
+	selectall : '鍏ㄩ伕(Ctrl+A)',
+	justifyleft : '闈犲乏灏嶉綂',
+	justifycenter : '缃腑',
+	justifyright : '闈犲彸灏嶉綂',
+	justifyfull : '宸﹀彸灏嶉綂',
+	insertorderedlist : '绶ㄨ櫉娓呭柈',
+	insertunorderedlist : '闋呯洰娓呭柈',
+	indent : '澧炲姞绺帓',
+	outdent : '娓涘皯绺帓',
+	subscript : '涓嬫',
+	superscript : '涓婃',
+	formatblock : '妯欓',
+	fontname : '瀛楅珨',
+	fontsize : '鏂囧瓧澶у皬',
+	forecolor : '鏂囧瓧椤忚壊',
+	hilitecolor : '鑳屾櫙椤忚壊',
+	bold : '绮楅珨(Ctrl+B)',
+	italic : '鏂滈珨(Ctrl+I)',
+	underline : '搴曠窔(Ctrl+U)',
+	strikethrough : '鍒櫎绶�',
+	removeformat : '娓呴櫎鏍煎紡',
+	image : '褰卞儚',
+	multiimage : '鎵归噺褰卞儚涓婂偝',
+	flash : 'Flash',
+	media : '澶氬獟楂�',
+	table : '琛ㄦ牸',
+	hr : '鎻掑叆姘村钩绶�',
+	emoticons : '鎻掑叆琛ㄦ儏',
+	link : '瓒呴�g祼',
+	unlink : '绉婚櫎瓒呴�g祼',
+	fullscreen : '鏈�澶у寲',
+	about : '闂滄柤',
+	print : '鍒楀嵃(Ctrl+P)',
+	fileManager : '鐎忚浼烘湇鍣�',
+	code : '鎻掑叆绋嬪紡浠g⒓',
+	map : 'Google鍦板湒',
+	baidumap : 'Baidu鍦板湒',
+	lineheight : '琛岃窛',
+	clearhtml : '娓呯悊HTML浠g⒓',
+	pagebreak : '鎻掑叆鍒嗛爜绗﹁櫉',
+	quickformat : '蹇�熸帓鐗�',
+	insertfile : '鎻掑叆鏂囦欢',
+	template : '鎻掑叆妯f澘',
+	anchor : '閷ㄩ粸',
+	yes : '纰哄畾',
+	no : '鍙栨秷',
+	close : '闂滈枆',
+	editImage : '褰卞儚灞��',
+	deleteImage : '鍒櫎褰卞儚',
+	editFlash : 'Flash灞��',
+	deleteFlash : '鍒犻櫎Flash',
+	editMedia : '澶氬獟楂斿爆鎬�',
+	deleteMedia : '鍒犻櫎澶氬獟楂�',
+	editLink : '瓒呴�g祼灞��',
+	deleteLink : '绉婚櫎瓒呴�g祼',
+	tableprop : '琛ㄦ牸灞��',
+	tablecellprop : '鍎插瓨鏍煎爆鎬�',
+	tableinsert : '鎻掑叆琛ㄦ牸',
+	tabledelete : '鍒櫎琛ㄦ牸',
+	tablecolinsertleft : '鍚戝乏鎻掑叆鍒�',
+	tablecolinsertright : '鍚戝彸鎻掑叆鍒�',
+	tablerowinsertabove : '鍚戜笂鎻掑叆娆�',
+	tablerowinsertbelow : '涓嬫柟鎻掑叆娆�',
+	tablerowmerge : '鍚戜笅鍚堜降鍠厓鏍�',
+	tablecolmerge : '鍚戝彸鍚堜降鍠厓鏍�',
+	tablerowsplit : '鍒嗗壊娆�',
+	tablecolsplit : '鍒嗗壊鍒�',
+	tablecoldelete : '鍒犻櫎鍒�',
+	tablerowdelete : '鍒犻櫎娆�',
+	noColor : '鑷嫊',
+	pleaseSelectFile : '璜嬮伕鎿囨枃浠躲��',
+	invalidImg : "璜嬭几鍏ユ湁鏁堢殑URL銆俓n鍙厑瑷眏pg,gif,bmp,png鏍煎紡銆�",
+	invalidMedia : "璜嬭几鍏ユ湁鏁堢殑URL銆俓n鍙厑瑷眘wf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb鏍煎紡銆�",
+	invalidWidth : "瀵害蹇呴爤鏄暩瀛椼��",
+	invalidHeight : "楂樺害蹇呴爤鏄暩瀛椼��",
+	invalidBorder : "閭婃蹇呴爤鏄暩瀛椼��",
+	invalidUrl : "璜嬭几鍏ユ湁鏁堢殑URL銆�",
+	invalidRows : '娆勬暩鏄繀闋堣几鍏ラ爡鐩紝鍙厑瑷辫几鍏ュぇ鏂�0鐨勬暩瀛椼��',
+	invalidCols : '鍒楁暩鏄繀闋堣几鍏ラ爡鐩紝鍙厑瑷辫几鍏ュぇ鏂�0鐨勬暩瀛椼��',
+	invalidPadding : '鍏ц窛蹇呴爤鏄暩瀛椼��',
+	invalidSpacing : '闁撹窛蹇呴爤鏄暩瀛椼��',
+	invalidBorder : '杈规蹇呴』涓烘暟瀛椼��',
+	pleaseInput : "璜嬭几鍏ュ収瀹广��",
+	invalidJson : '浼烘湇鍣ㄧ櫦鐢熸晠闅溿��',
+	uploadSuccess : '涓婂偝鎴愬姛銆�',
+	cutError : '鎮ㄧ殑鐎忚鍣ㄥ畨鍏ㄨō缃笉鍏佽ū浣跨敤鍓笅鎿嶄綔锛岃珛浣跨敤蹇嵎閸�(Ctrl+X)瀹屾垚銆�',
+	copyError : '鎮ㄧ殑鐎忚鍣ㄥ畨鍏ㄨō缃笉鍏佽ū浣跨敤鍓笅鎿嶄綔锛岃珛浣跨敤蹇嵎閸�(Ctrl+C)瀹屾垚銆�',
+	pasteError : '鎮ㄧ殑鐎忚鍣ㄥ畨鍏ㄨō缃笉鍏佽ū浣跨敤鍓笅鎿嶄綔锛岃珛浣跨敤蹇嵎閸�(Ctrl+V)瀹屾垚銆�',
+	ajaxLoading : '鍔犺級涓紝璜嬬◢鍊� ...',
+	uploadLoading : '涓婂偝涓紝璜嬬◢鍊� ...',
+	uploadError : '涓婂偝閷',
+	'plainpaste.comment' : '璜嬩娇鐢ㄥ揩鎹烽嵉(Ctrl+V)鎶婂収瀹硅布鍒颁笅鏂瑰崁鍩熻!銆�',
+	'wordpaste.comment' : '璜嬩娇鐢ㄥ揩鎹烽嵉(Ctrl+V)鎶婂収瀹硅布鍒颁笅鏂瑰崁鍩熻!銆�',
+	'code.pleaseInput' : 'Please input code.',
+	'link.url' : 'URL',
+	'link.linkType' : '鎵撻枊椤炲瀷',
+	'link.newWindow' : '鏂扮獥鍙�',
+	'link.selfWindow' : '鏈爜绐楀彛',
+	'flash.url' : 'URL',
+	'flash.width' : '瀵害',
+	'flash.height' : '楂樺害',
+	'flash.upload' : '涓婂偝',
+	'flash.viewServer' : '鐎忚',
+	'media.url' : 'URL',
+	'media.width' : '瀵害',
+	'media.height' : '楂樺害',
+	'media.autostart' : '鑷嫊鎾斁',
+	'media.upload' : '涓婂偝',
+	'media.viewServer' : '鐎忚',
+	'image.remoteImage' : '缍茬怠褰卞儚',
+	'image.localImage' : '涓婂偝褰卞儚',
+	'image.remoteUrl' : '褰卞儚URL',
+	'image.localUrl' : '褰卞儚URL',
+	'image.size' : '褰卞儚澶у皬',
+	'image.width' : '瀵害',
+	'image.height' : '楂樺害',
+	'image.resetSize' : '鍘熷澶у皬',
+	'image.align' : '灏嶉綂鏂瑰紡',
+	'image.defaultAlign' : '鏈ō瀹�',
+	'image.leftAlign' : '鍚戝乏灏嶉綂',
+	'image.rightAlign' : '鍚戝彸灏嶉綂',
+	'image.imgTitle' : '褰卞儚瑾槑',
+	'image.upload' : '鐎忚...',
+	'image.viewServer' : '鐎忚...',
+	'multiimage.uploadDesc' : 'Allows users to upload <%=uploadLimit%> images, single image size not exceeding <%=sizeLimit%>',
+	'multiimage.startUpload' : 'Start upload',
+	'multiimage.clearAll' : 'Clear all',
+	'multiimage.insertAll' : 'Insert all',
+	'multiimage.queueLimitExceeded' : 'Queue limit exceeded.',
+	'multiimage.fileExceedsSizeLimit' : 'File exceeds size limit.',
+	'multiimage.zeroByteFile' : 'Zero byte file.',
+	'multiimage.invalidFiletype' : 'Invalid file type.',
+	'multiimage.unknownError' : 'Unknown upload error.',
+	'multiimage.pending' : 'Pending ...',
+	'multiimage.uploadError' : 'Upload error',
+	'filemanager.emptyFolder' : '绌烘枃浠跺ぞ',
+	'filemanager.moveup' : '鑷充笂涓�绱氭枃浠跺ぞ',
+	'filemanager.viewType' : '椤ず鏂瑰紡锛�',
+	'filemanager.viewImage' : '绺暐鍦�',
+	'filemanager.listImage' : '瑭崇窗淇℃伅',
+	'filemanager.orderType' : '鎺掑簭鏂瑰紡锛�',
+	'filemanager.fileName' : '鍚嶇ū',
+	'filemanager.fileSize' : '澶у皬',
+	'filemanager.fileType' : '椤炲瀷',
+	'insertfile.url' : 'URL',
+	'insertfile.title' : '鏂囦欢瑾槑',
+	'insertfile.upload' : '涓婂偝',
+	'insertfile.viewServer' : '鐎忚',
+	'table.cells' : '鍎插瓨鏍兼暩',
+	'table.rows' : '娆勬暩',
+	'table.cols' : '鍒楁暩',
+	'table.size' : '琛ㄦ牸澶у皬',
+	'table.width' : '瀵害',
+	'table.height' : '楂樺害',
+	'table.percent' : '%',
+	'table.px' : 'px',
+	'table.space' : '鍏ц窛闁撹窛',
+	'table.padding' : '鍏ц窛',
+	'table.spacing' : '闁撹窛',
+	'table.align' : '灏嶉綂鏂瑰紡',
+	'table.textAlign' : '姘村钩灏嶉綂',
+	'table.verticalAlign' : '鍨傜洿灏嶉綂',
+	'table.alignDefault' : '鏈ō瀹�',
+	'table.alignLeft' : '鍚戝乏灏嶉綂',
+	'table.alignCenter' : '缃腑',
+	'table.alignRight' : '鍚戝彸灏嶉綂',
+	'table.alignTop' : '闈犱笂',
+	'table.alignMiddle' : '缃腑',
+	'table.alignBottom' : '闈犱笅',
+	'table.alignBaseline' : '鍩虹窔',
+	'table.border' : '琛ㄦ牸閭婃',
+	'table.borderWidth' : '閭婃',
+	'table.borderColor' : '椤忚壊',
+	'table.backgroundColor' : '鑳屾櫙椤忚壊',
+	'map.address' : '浣忔墍: ',
+	'map.search' : '灏嬫壘',
+	'baidumap.address' : '浣忔墍: ',
+	'baidumap.search' : '灏嬫壘',
+	'baidumap.insertDynamicMap' : '鎻掑叆鍕曟厠鍦板湒',
+	'anchor.name' : '閷ㄩ粸鍚嶇ū',
+	'formatblock.formatBlock' : {
+		h1 : '妯欓 1',
+		h2 : '妯欓 2',
+		h3 : '妯欓 3',
+		h4 : '妯欓 4',
+		p : '涓�鑸�'
+	},
+	'fontname.fontName' : {
+		'MingLiU' : '绱版槑楂�',
+		'PMingLiU' : '鏂扮窗鏄庨珨',
+		'DFKai-SB' : '妯欐シ楂�',
+		'SimSun' : '瀹嬮珨',
+		'NSimSun' : '鏂板畫楂�',
+		'FangSong' : '浠垮畫楂�',
+		'Arial' : 'Arial',
+		'Arial Black' : 'Arial Black',
+		'Times New Roman' : 'Times New Roman',
+		'Courier New' : 'Courier New',
+		'Tahoma' : 'Tahoma',
+		'Verdana' : 'Verdana'
+	},
+	'lineheight.lineHeight' : [
+		{'1' : '鍗曞�嶈璺�'},
+		{'1.5' : '1.5鍊嶈璺�'},
+		{'2' : '2鍊嶈璺�'},
+		{'2.5' : '2.5鍊嶈璺�'},
+		{'3' : '3鍊嶈璺�'}
+	],
+	'template.selectTemplate' : '鍙伕妯f澘',
+	'template.replaceContent' : '鍙栦唬鐣跺墠鍏у',
+	'template.fileList' : {
+		'1.html' : '褰卞儚鍜屾枃瀛�',
+		'2.html' : '琛ㄦ牸',
+		'3.html' : '椤圭洰娓呭柈'
+	}
+}, 'zh_TW');
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/license.txt b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/license.txt
new file mode 100644
index 0000000..4362b49
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/license.txt
@@ -0,0 +1,502 @@
+                  GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+                  GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+                            NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
+           How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/anchor/anchor.js b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/anchor/anchor.js
new file mode 100644
index 0000000..55ab894
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/anchor/anchor.js
@@ -0,0 +1,46 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('anchor', function(K) {
+	var self = this, name = 'anchor', lang = self.lang(name + '.');
+	self.plugin.anchor = {
+		edit : function() {
+			var html = ['<div style="padding:20px;">',
+					'<div class="ke-dialog-row">',
+					'<label for="keName">' + lang.name + '</label>',
+					'<input class="ke-input-text" type="text" id="keName" name="name" value="" style="width:100px;" />',
+					'</div>',
+					'</div>'].join('');
+			var dialog = self.createDialog({
+				name : name,
+				width : 300,
+				title : self.lang(name),
+				body : html,
+				yesBtn : {
+					name : self.lang('yes'),
+					click : function(e) {
+						self.insertHtml('<a name="' + nameBox.val() + '">').hideDialog().focus();
+					}
+				}
+			});
+			var div = dialog.div,
+				nameBox = K('input[name="name"]', div);
+			var img = self.plugin.getSelectedAnchor();
+			if (img) {
+				nameBox.val(unescape(img.attr('data-ke-name')));
+			}
+			nameBox[0].focus();
+			nameBox[0].select();
+		},
+		'delete' : function() {
+			self.plugin.getSelectedAnchor().remove();
+		}
+	};
+	self.clickToolbar(name, self.plugin.anchor.edit);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/autoheight/autoheight.js b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/autoheight/autoheight.js
new file mode 100644
index 0000000..25472bf
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/autoheight/autoheight.js
@@ -0,0 +1,27 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('autoheight', function(K) {
+	var self = this;
+
+	if (!self.autoHeightMode) {
+		return;
+	}
+
+	var edit = self.edit;
+	var body = edit.doc.body;
+	var minHeight = K.removeUnit(self.height);
+
+	edit.iframe[0].scroll = 'no';
+	body.style.overflowY = 'hidden';
+
+	edit.afterChange(function() {
+		self.resize(null, Math.max((K.IE ? body.scrollHeight : body.offsetHeight) + 62, minHeight));
+	});
+});
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/baidumap/baidumap.js b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/baidumap/baidumap.js
new file mode 100644
index 0000000..12751c4
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/baidumap/baidumap.js
@@ -0,0 +1,93 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+// Baidu Maps: http://dev.baidu.com/wiki/map/index.php?title=%E9%A6%96%E9%A1%B5
+
+KindEditor.plugin('baidumap', function(K) {
+	var self = this, name = 'baidumap', lang = self.lang(name + '.');
+	var mapWidth = K.undef(self.mapWidth, 558);
+	var mapHeight = K.undef(self.mapHeight, 360);
+	self.clickToolbar(name, function() {
+		var html = ['<div style="padding:10px 20px;">',
+			'<div class="ke-header">',
+			// left start
+			'<div class="ke-left">',
+			lang.address + ' <input id="kindeditor_plugin_map_address" name="address" class="ke-input-text" value="" style="width:200px;" /> ',
+			'<span class="ke-button-common ke-button-outer">',
+			'<input type="button" name="searchBtn" class="ke-button-common ke-button" value="' + lang.search + '" />',
+			'</span>',
+			'</div>',
+			// right start
+			'<div class="ke-right">',
+			'<input type="checkbox" id="keInsertDynamicMap" name="insertDynamicMap" value="1" /> <label for="keInsertDynamicMap">' + lang.insertDynamicMap + '</label>',
+			'</div>',
+			'<div class="ke-clearfix"></div>',
+			'</div>',
+			'<div class="ke-map" style="width:' + mapWidth + 'px;height:' + mapHeight + 'px;"></div>',
+			'</div>'].join('');
+		var dialog = self.createDialog({
+			name : name,
+			width : mapWidth + 42,
+			title : self.lang(name),
+			body : html,
+			yesBtn : {
+				name : self.lang('yes'),
+				click : function(e) {
+					var map = win.map;
+					var centerObj = map.getCenter();
+					var center = centerObj.lng + ',' + centerObj.lat;
+					var zoom = map.getZoom();
+					var url = [checkbox[0].checked ? self.pluginsPath + 'baidumap/index.html' : 'http://api.map.baidu.com/staticimage',
+						'?center=' + encodeURIComponent(center),
+						'&zoom=' + encodeURIComponent(zoom),
+						'&width=' + mapWidth,
+						'&height=' + mapHeight,
+						'&markers=' + encodeURIComponent(center),
+						'&markerStyles=' + encodeURIComponent('l,A')].join('');
+					if (checkbox[0].checked) {
+						self.insertHtml('<iframe src="' + url + '" frameborder="0" style="width:' + (mapWidth + 2) + 'px;height:' + (mapHeight + 2) + 'px;"></iframe>');
+					} else {
+						self.exec('insertimage', url);
+					}
+					self.hideDialog().focus();
+				}
+			},
+			beforeRemove : function() {
+				searchBtn.remove();
+				if (doc) {
+					doc.write('');
+				}
+				iframe.remove();
+			}
+		});
+		var div = dialog.div,
+			addressBox = K('[name="address"]', div),
+			searchBtn = K('[name="searchBtn"]', div),
+			checkbox = K('[name="insertDynamicMap"]', dialog.div),
+			win, doc;
+		var iframe = K('<iframe class="ke-textarea" frameborder="0" src="' + self.pluginsPath + 'baidumap/map.html" style="width:' + mapWidth + 'px;height:' + mapHeight + 'px;"></iframe>');
+		function ready() {
+			win = iframe[0].contentWindow;
+			doc = K.iframeDoc(iframe);
+		}
+		iframe.bind('load', function() {
+			iframe.unbind('load');
+			if (K.IE) {
+				ready();
+			} else {
+				setTimeout(ready, 0);
+			}
+		});
+		K('.ke-map', div).replaceWith(iframe);
+		// search map
+		searchBtn.click(function() {
+			win.search(addressBox.val());
+		});
+	});
+});
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/baidumap/index.html b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/baidumap/index.html
new file mode 100644
index 0000000..e106d1a
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/baidumap/index.html
@@ -0,0 +1,83 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta charset="utf-8" />
+<meta name="keywords" content="鐧惧害鍦板浘,鐧惧害鍦板浘API锛岀櫨搴﹀湴鍥捐嚜瀹氫箟宸ュ叿锛岀櫨搴﹀湴鍥炬墍瑙佸嵆鎵�寰楀伐鍏�" />
+<meta name="description" content="鐧惧害鍦板浘API鑷畾涔夊湴鍥撅紝甯姪鐢ㄦ埛鍦ㄥ彲瑙嗗寲鎿嶄綔涓嬬敓鎴愮櫨搴﹀湴鍥�" />
+<title>鐧惧害鍦板浘API鑷畾涔夊湴鍥�</title>
+<!--寮曠敤鐧惧害鍦板浘API-->
+<style type="text/css">
+	html,body{margin:0;padding:0;}
+	.iw_poi_title {color:#CC5522;font-size:14px;font-weight:bold;overflow:hidden;padding-right:13px;white-space:nowrap}
+	.iw_poi_content {font:12px arial,sans-serif;overflow:visible;padding-top:4px;white-space:-moz-pre-wrap;word-wrap:break-word}
+</style>
+<script type="text/javascript" src="http://api.map.baidu.com/api?key=&v=1.1&services=true"></script>
+</head>
+
+<body onload="initMap();">
+  <!--鐧惧害鍦板浘瀹瑰櫒-->
+  <div style="width:697px;height:550px;border:#ccc solid 1px;" id="dituContent"></div>
+</body>
+<script type="text/javascript">
+	function getParam(name) {
+		return location.href.match(new RegExp('[?&]' + name + '=([^?&]+)', 'i')) ? decodeURIComponent(RegExp.$1) : '';
+	}
+	var centerParam = getParam('center');
+	var zoomParam = getParam('zoom');
+	var widthParam = getParam('width');
+	var heightParam = getParam('height');
+	var markersParam = getParam('markers');
+	var markerStylesParam = getParam('markerStyles');
+
+	//鍒涘缓鍜屽垵濮嬪寲鍦板浘鍑芥暟锛�
+	function initMap(){
+		// [FF]鍒囨崲妯″紡鍚庢姤閿�
+		if (!window.BMap) {
+			return;
+		}
+		var dituContent = document.getElementById('dituContent');
+		dituContent.style.width = widthParam + 'px';
+		dituContent.style.height = heightParam + 'px';
+
+		createMap();//鍒涘缓鍦板浘
+		setMapEvent();//璁剧疆鍦板浘浜嬩欢
+		addMapControl();//鍚戝湴鍥炬坊鍔犳帶浠�
+
+		// 鍒涘缓鏍囨敞
+		var markersArr = markersParam.split(',');
+		var point = new BMap.Point(markersArr[0], markersArr[1]);
+		var marker = new BMap.Marker(point);
+		map.addOverlay(marker); // 灏嗘爣娉ㄦ坊鍔犲埌鍦板浘涓�
+	}
+
+	//鍒涘缓鍦板浘鍑芥暟锛�
+	function createMap(){
+		var map = new BMap.Map("dituContent");//鍦ㄧ櫨搴﹀湴鍥惧鍣ㄤ腑鍒涘缓涓�涓湴鍥�
+		var centerArr = centerParam.split(',');
+		var point = new BMap.Point(centerArr[0], centerArr[1]);//瀹氫箟涓�涓腑蹇冪偣鍧愭爣
+		map.centerAndZoom(point, zoomParam);//璁惧畾鍦板浘鐨勪腑蹇冪偣鍜屽潗鏍囧苟灏嗗湴鍥炬樉绀哄湪鍦板浘瀹瑰櫒涓�
+		window.map = map;//灏唌ap鍙橀噺瀛樺偍鍦ㄥ叏灞�
+	}
+
+	//鍦板浘浜嬩欢璁剧疆鍑芥暟锛�
+	function setMapEvent(){
+		map.enableDragging();//鍚敤鍦板浘鎷栨嫿浜嬩欢锛岄粯璁ゅ惎鐢�(鍙笉鍐�)
+		map.enableScrollWheelZoom();//鍚敤鍦板浘婊氳疆鏀惧ぇ缂╁皬
+		map.enableDoubleClickZoom();//鍚敤榧犳爣鍙屽嚮鏀惧ぇ锛岄粯璁ゅ惎鐢�(鍙笉鍐�)
+		map.enableKeyboard();//鍚敤閿洏涓婁笅宸﹀彸閿Щ鍔ㄥ湴鍥�
+	}
+
+	//鍦板浘鎺т欢娣诲姞鍑芥暟锛�
+	function addMapControl(){
+		//鍚戝湴鍥句腑娣诲姞缂╂斁鎺т欢
+	var ctrl_nav = new BMap.NavigationControl({anchor:BMAP_ANCHOR_TOP_LEFT,type:BMAP_NAVIGATION_CONTROL_LARGE});
+	map.addControl(ctrl_nav);
+		//鍚戝湴鍥句腑娣诲姞缂╃暐鍥炬帶浠�
+	var ctrl_ove = new BMap.OverviewMapControl({anchor:BMAP_ANCHOR_BOTTOM_RIGHT,isOpen:1});
+	map.addControl(ctrl_ove);
+		//鍚戝湴鍥句腑娣诲姞姣斾緥灏烘帶浠�
+	var ctrl_sca = new BMap.ScaleControl({anchor:BMAP_ANCHOR_BOTTOM_LEFT});
+	map.addControl(ctrl_sca);
+	}
+</script>
+</html>
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/baidumap/map.html b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/baidumap/map.html
new file mode 100644
index 0000000..b65ea1d
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/baidumap/map.html
@@ -0,0 +1,43 @@
+<!doctype html>
+<html>
+	<head>
+		<meta charset="utf-8" />
+		<title>Baidu Maps</title>
+		<style>
+			html { height: 100% }
+			body { height: 100%; margin: 0; padding: 0; background-color: #FFF }
+		</style>
+		<script charset="utf-8" src="http://api.map.baidu.com/api?v=1.3"></script>
+		<script>
+			var map, geocoder;
+			function initialize() {
+				map = new BMap.Map('map_canvas');
+				var point = new BMap.Point(121.473704, 31.230393);
+				map.centerAndZoom(point, 11);
+				map.addControl(new BMap.NavigationControl());
+				map.enableScrollWheelZoom();
+
+				var gc = new BMap.Geocoder();
+				gc.getLocation(point, function(rs){
+					var addComp = rs.addressComponents;
+					var address = [addComp.city].join('');
+					parent.document.getElementById("kindeditor_plugin_map_address").value = address;
+				});
+			}
+			function search(address) {
+				if (!map) return;
+				var local = new BMap.LocalSearch(map, {
+					renderOptions: {
+						map: map,
+						autoViewport: true,
+						selectFirstResult: false
+					}
+				});
+				local.search(address);
+			}
+		</script>
+	</head>
+	<body onload="initialize();">
+		<div id="map_canvas" style="width:100%; height:100%"></div>
+	</body>
+</html>
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/clearhtml/clearhtml.js b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/clearhtml/clearhtml.js
new file mode 100644
index 0000000..1bf0e5d
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/clearhtml/clearhtml.js
@@ -0,0 +1,29 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('clearhtml', function(K) {
+	var self = this, name = 'clearhtml';
+	self.clickToolbar(name, function() {
+		self.focus();
+		var html = self.html();
+		html = html.replace(/(<script[^>]*>)([\s\S]*?)(<\/script>)/ig, '');
+		html = html.replace(/(<style[^>]*>)([\s\S]*?)(<\/style>)/ig, '');
+		html = K.formatHtml(html, {
+			a : ['href', 'target'],
+			embed : ['src', 'width', 'height', 'type', 'loop', 'autostart', 'quality', '.width', '.height', 'align', 'allowscriptaccess'],
+			img : ['src', 'width', 'height', 'border', 'alt', 'title', '.width', '.height'],
+			table : ['border'],
+			'td,th' : ['rowspan', 'colspan'],
+			'div,hr,br,tbody,tr,p,ol,ul,li,blockquote,h1,h2,h3,h4,h5,h6' : []
+		});
+		self.html(html);
+		self.cmd.selection(true);
+		self.addBookmark();
+	});
+});
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/code/code.js b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/code/code.js
new file mode 100644
index 0000000..85e4225
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/code/code.js
@@ -0,0 +1,62 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+// google code prettify: http://google-code-prettify.googlecode.com/
+// http://google-code-prettify.googlecode.com/
+
+KindEditor.plugin('code', function(K) {
+	var self = this, name = 'code';
+	self.clickToolbar(name, function() {
+		var lang = self.lang(name + '.'),
+			html = ['<div style="padding:10px 20px;">',
+				'<div class="ke-dialog-row">',
+				'<select class="ke-code-type">',
+				'<option value="js">JavaScript</option>',
+				'<option value="html">HTML</option>',
+				'<option value="css">CSS</option>',
+				'<option value="php">PHP</option>',
+				'<option value="pl">Perl</option>',
+				'<option value="py">Python</option>',
+				'<option value="rb">Ruby</option>',
+				'<option value="java">Java</option>',
+				'<option value="vb">ASP/VB</option>',
+				'<option value="cpp">C/C++</option>',
+				'<option value="cs">C#</option>',
+				'<option value="xml">XML</option>',
+				'<option value="bsh">Shell</option>',
+				'<option value="">Other</option>',
+				'</select>',
+				'</div>',
+				'<textarea class="ke-textarea" style="width:408px;height:260px;"></textarea>',
+				'</div>'].join(''),
+			dialog = self.createDialog({
+				name : name,
+				width : 450,
+				title : self.lang(name),
+				body : html,
+				yesBtn : {
+					name : self.lang('yes'),
+					click : function(e) {
+						var type = K('.ke-code-type', dialog.div).val(),
+							code = textarea.val(),
+							cls = type === '' ? '' :  ' lang-' + type,
+							html = '<pre class="prettyprint' + cls + '">\n' + K.escape(code) + '</pre> ';
+						if (K.trim(code) === '') {
+							alert(lang.pleaseInput);
+							textarea[0].focus();
+							return;
+						}
+						self.insertHtml(html).hideDialog().focus();
+					}
+				}
+			}),
+			textarea = K('textarea', dialog.div);
+		textarea[0].focus();
+	});
+});
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/code/prettify.css b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/code/prettify.css
new file mode 100644
index 0000000..b8287e5
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/code/prettify.css
@@ -0,0 +1,13 @@
+.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee}
+
+pre.prettyprint {
+	border: 0;
+	border-left: 3px solid rgb(204, 204, 204);
+	margin-left: 2em;
+	padding: 0.5em;
+	font-size: 110%;
+	display: block;
+	font-family: "Consolas", "Monaco", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace;
+	margin: 1em 0px;
+	white-space: pre;
+}
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/code/prettify.js b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/code/prettify.js
new file mode 100644
index 0000000..e2957f7
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/code/prettify.js
@@ -0,0 +1,28 @@
+var q=null;window.PR_SHOULD_USE_CONTINUATION=!0;
+(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),a=
+[],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c<i;++c){var j=f[c];if(/\\[bdsw]/i.test(j))a.push(j);else{var j=m(j),d;c+2<i&&"-"===f[c+1]?(d=m(f[c+2]),c+=2):d=j;b.push([j,d]);d<65||j>122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;c<b.length;++c)i=b[c],i[0]<=j[1]+1?j[1]=Math.max(j[1],i[1]):f.push(j=i);b=["["];o&&b.push("^");b.push.apply(b,a);for(c=0;c<
+f.length;++c)i=f[c],b.push(e(i[0])),i[1]>i[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c<b;++c){var j=f[c];j==="("?++i:"\\"===j.charAt(0)&&(j=+j.substring(1))&&j<=i&&(d[j]=-1)}for(c=1;c<d.length;++c)-1===d[c]&&(d[c]=++t);for(i=c=0;c<b;++c)j=f[c],j==="("?(++i,d[i]===void 0&&(f[c]="(?:")):"\\"===j.charAt(0)&&
+(j=+j.substring(1))&&j<=i&&(f[c]="\\"+d[i]);for(i=c=0;c<b;++c)"^"===f[c]&&"^"!==f[c+1]&&(f[c]="");if(a.ignoreCase&&s)for(c=0;c<b;++c)j=f[c],a=j.charAt(0),j.length>=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p<d;++p){var g=a[p];if(g.ignoreCase)l=!0;else if(/[a-z]/i.test(g.source.replace(/\\u[\da-f]{4}|\\x[\da-f]{2}|\\[^UXux]/gi,""))){s=!0;l=!1;break}}for(var r=
+{b:8,t:9,n:10,v:11,f:12,r:13},n=[],p=0,d=a.length;p<d;++p){g=a[p];if(g.global||g.multiline)throw Error(""+g);n.push("(?:"+y(g)+")")}return RegExp(n.join("|"),l?"gi":"g")}function M(a){function m(a){switch(a.nodeType){case 1:if(e.test(a.className))break;for(var g=a.firstChild;g;g=g.nextSibling)m(g);g=a.nodeName;if("BR"===g||"LI"===g)h[s]="\n",t[s<<1]=y++,t[s++<<1|1]=a;break;case 3:case 4:g=a.nodeValue,g.length&&(g=p?g.replace(/\r\n?/g,"\n"):g.replace(/[\t\n\r ]+/g," "),h[s]=g,t[s<<1]=y,y+=g.length,
+t[s++<<1|1]=a)}}var e=/(?:^|\s)nocode(?:\s|$)/,h=[],y=0,t=[],s=0,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=document.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);m(a);return{a:h.join("").replace(/\n$/,""),c:t}}function B(a,m,e,h){m&&(a={a:m,d:a},e(a),h.push.apply(h,a.e))}function x(a,m){function e(a){for(var l=a.d,p=[l,"pln"],d=0,g=a.a.match(y)||[],r={},n=0,z=g.length;n<z;++n){var f=g[n],b=r[f],o=void 0,c;if(typeof b===
+"string")c=!1;else{var i=h[f.charAt(0)];if(i)o=f.match(i[1]),b=i[0];else{for(c=0;c<t;++c)if(i=m[c],o=f.match(i[1])){b=i[0];break}o||(b="pln")}if((c=b.length>=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m),
+l=[],p={},d=0,g=e.length;d<g;++d){var r=e[d],n=r[3];if(n)for(var k=n.length;--k>=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/,
+q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com",/^#[^\n\r]*/,
+q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]);a=(""+a.keywords).replace(/^ | $/g,
+"");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("BR"===a.nodeName)h(a),
+a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e}
+for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g<d.length;++g)e(d[g]);m===(m|0)&&d[0].setAttribute("value",
+m);var r=s.createElement("OL");r.className="linenums";for(var n=Math.max(0,m-1|0)||0,g=0,z=d.length;g<z;++g)l=d[g],l.className="L"+(g+n)%10,l.firstChild||l.appendChild(s.createTextNode("\xa0")),r.appendChild(l);a.appendChild(r)}function k(a,m){for(var e=m.length;--e>=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*</.test(m)?"default-markup":"default-code";return A[a]}function E(a){var m=
+a.g;try{var e=M(a.h),h=e.a;a.a=h;a.c=e.c;a.d=0;C(m,h)(a);var k=/\bMSIE\b/.test(navigator.userAgent),m=/\n/g,t=a.a,s=t.length,e=0,l=a.c,p=l.length,h=0,d=a.e,g=d.length,a=0;d[g]=s;var r,n;for(n=r=0;n<g;)d[n]!==d[n+2]?(d[r++]=d[n++],d[r++]=d[n++]):n+=2;g=r;for(n=r=0;n<g;){for(var z=d[n],f=d[n+1],b=n+2;b+2<=g&&d[b+1]===f;)b+=2;d[r++]=z;d[r++]=f;n=b}for(d.length=r;h<p;){var o=l[h+2]||s,c=d[a+2]||s,b=Math.min(o,c),i=l[h+1],j;if(i.nodeType!==1&&(j=t.substring(e,b))){k&&(j=j.replace(m,"\r"));i.nodeValue=
+j;var u=i.ownerDocument,v=u.createElement("SPAN");v.className=d[a+1];var x=i.parentNode;x.replaceChild(v,i);v.appendChild(i);e<o&&(l[h+1]=i=u.createTextNode(t.substring(b,o)),x.insertBefore(i,v.nextSibling))}e=b;e>=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"],
+"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"],
+H=[G,"as,index,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"],
+J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+
+I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^<?]+/],["dec",/^<!\w[^>]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),
+["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css",
+/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),
+["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes",
+hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p<h.length&&l.now()<e;p++){var n=h[p],k=n.className;if(k.indexOf("prettyprint")>=0){var k=k.match(g),f,b;if(b=
+!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&"CODE"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName==="pre"||o.tagName==="code"||o.tagName==="xmp")&&o.className&&o.className.indexOf("prettyprint")>=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p<h.length?setTimeout(m,
+250):a&&a()}for(var e=[document.getElementsByTagName("pre"),document.getElementsByTagName("code"),document.getElementsByTagName("xmp")],h=[],k=0;k<e.length;++k)for(var t=0,s=e[k].length;t<s;++t)h.push(e[k][t]);var e=q,l=Date;l.now||(l={now:function(){return+new Date}});var p=0,d,g=/\blang(?:uage)?-([\w.]+)(?!\S)/;m()};window.PR={createSimpleLexer:x,registerLangHandler:k,sourceDecorator:u,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",
+PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ"}})();
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/emoticons.js b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/emoticons.js
new file mode 100644
index 0000000..a990066
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/emoticons.js
@@ -0,0 +1,129 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('emoticons', function(K) {
+	var self = this, name = 'emoticons',
+		path = (self.emoticonsPath || self.pluginsPath + 'emoticons/images/'),
+		allowPreview = self.allowPreviewEmoticons === undefined ? true : self.allowPreviewEmoticons,
+		currentPageNum = 1;
+	self.clickToolbar(name, function() {
+		var rows = 5, cols = 9, total = 135, startNum = 0,
+			cells = rows * cols, pages = Math.ceil(total / cells),
+			colsHalf = Math.floor(cols / 2),
+			wrapperDiv = K('<div class="ke-plugin-emoticons"></div>'),
+			elements = [],
+			menu = self.createMenu({
+				name : name,
+				beforeRemove : function() {
+					removeEvent();
+				}
+			});
+		menu.div.append(wrapperDiv);
+		var previewDiv, previewImg;
+		if (allowPreview) {
+			previewDiv = K('<div class="ke-preview"></div>').css('right', 0);
+			previewImg = K('<img class="ke-preview-img" src="' + path + startNum + '.gif" />');
+			wrapperDiv.append(previewDiv);
+			previewDiv.append(previewImg);
+		}
+		function bindCellEvent(cell, j, num) {
+			if (previewDiv) {
+				cell.mouseover(function() {
+					if (j > colsHalf) {
+						previewDiv.css('left', 0);
+						previewDiv.css('right', '');
+					} else {
+						previewDiv.css('left', '');
+						previewDiv.css('right', 0);
+					}
+					previewImg.attr('src', path + num + '.gif');
+					K(this).addClass('ke-on');
+				});
+			} else {
+				cell.mouseover(function() {
+					K(this).addClass('ke-on');
+				});
+			}
+			cell.mouseout(function() {
+				K(this).removeClass('ke-on');
+			});
+			cell.click(function(e) {
+				self.insertHtml('<img src="' + path + num + '.gif" border="0" alt="" />').hideMenu().focus();
+				e.stop();
+			});
+		}
+		function createEmoticonsTable(pageNum, parentDiv) {
+			var table = document.createElement('table');
+			parentDiv.append(table);
+			if (previewDiv) {
+				K(table).mouseover(function() {
+					previewDiv.show('block');
+				});
+				K(table).mouseout(function() {
+					previewDiv.hide();
+				});
+				elements.push(K(table));
+			}
+			table.className = 'ke-table';
+			table.cellPadding = 0;
+			table.cellSpacing = 0;
+			table.border = 0;
+			var num = (pageNum - 1) * cells + startNum;
+			for (var i = 0; i < rows; i++) {
+				var row = table.insertRow(i);
+				for (var j = 0; j < cols; j++) {
+					var cell = K(row.insertCell(j));
+					cell.addClass('ke-cell');
+					bindCellEvent(cell, j, num);
+					var span = K('<span class="ke-img"></span>')
+						.css('background-position', '-' + (24 * num) + 'px 0px')
+						.css('background-image', 'url(' + path + 'static.gif)');
+					cell.append(span);
+					elements.push(cell);
+					num++;
+				}
+			}
+			return table;
+		}
+		var table = createEmoticonsTable(currentPageNum, wrapperDiv);
+		function removeEvent() {
+			K.each(elements, function() {
+				this.unbind();
+			});
+		}
+		var pageDiv;
+		function bindPageEvent(el, pageNum) {
+			el.click(function(e) {
+				removeEvent();
+				table.parentNode.removeChild(table);
+				pageDiv.remove();
+				table = createEmoticonsTable(pageNum, wrapperDiv);
+				createPageTable(pageNum);
+				currentPageNum = pageNum;
+				e.stop();
+			});
+		}
+		function createPageTable(currentPageNum) {
+			pageDiv = K('<div class="ke-page"></div>');
+			wrapperDiv.append(pageDiv);
+			for (var pageNum = 1; pageNum <= pages; pageNum++) {
+				if (currentPageNum !== pageNum) {
+					var a = K('<a href="javascript:;">[' + pageNum + ']</a>');
+					bindPageEvent(a, pageNum);
+					pageDiv.append(a);
+					elements.push(a);
+				} else {
+					pageDiv.append(K('@[' + pageNum + ']'));
+				}
+				pageDiv.append(K('@&nbsp;'));
+			}
+		}
+		createPageTable(currentPageNum);
+	});
+});
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/0.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/0.gif
new file mode 100644
index 0000000..5be27cb
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/0.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/1.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/1.gif
new file mode 100644
index 0000000..a2644a9
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/1.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/10.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/10.gif
new file mode 100644
index 0000000..905c15b
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/10.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/100.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/100.gif
new file mode 100644
index 0000000..92ad35d
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/100.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/101.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/101.gif
new file mode 100644
index 0000000..1f27663
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/101.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/102.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/102.gif
new file mode 100644
index 0000000..748ded1
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/102.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/103.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/103.gif
new file mode 100644
index 0000000..be9eaa0
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/103.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/104.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/104.gif
new file mode 100644
index 0000000..d7c2066
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/104.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/105.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/105.gif
new file mode 100644
index 0000000..2f353ca
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/105.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/106.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/106.gif
new file mode 100644
index 0000000..5193534
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/106.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/107.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/107.gif
new file mode 100644
index 0000000..70d38d3
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/107.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/108.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/108.gif
new file mode 100644
index 0000000..749d500
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/108.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/109.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/109.gif
new file mode 100644
index 0000000..6f57d56
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/109.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/11.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/11.gif
new file mode 100644
index 0000000..b512dd5
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/11.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/110.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/110.gif
new file mode 100644
index 0000000..e253abc
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/110.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/111.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/111.gif
new file mode 100644
index 0000000..0c56723
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/111.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/112.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/112.gif
new file mode 100644
index 0000000..c8ddce8
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/112.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/113.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/113.gif
new file mode 100644
index 0000000..2727104
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/113.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/114.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/114.gif
new file mode 100644
index 0000000..53918e2
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/114.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/115.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/115.gif
new file mode 100644
index 0000000..4db3369
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/115.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/116.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/116.gif
new file mode 100644
index 0000000..57326bd
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/116.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/117.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/117.gif
new file mode 100644
index 0000000..14611b6
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/117.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/118.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/118.gif
new file mode 100644
index 0000000..8c25500
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/118.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/119.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/119.gif
new file mode 100644
index 0000000..65bb468
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/119.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/12.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/12.gif
new file mode 100644
index 0000000..547529c
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/12.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/120.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/120.gif
new file mode 100644
index 0000000..5ce77c0
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/120.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/121.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/121.gif
new file mode 100644
index 0000000..a021aba
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/121.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/122.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/122.gif
new file mode 100644
index 0000000..9a79e11
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/122.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/123.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/123.gif
new file mode 100644
index 0000000..b9480be
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/123.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/124.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/124.gif
new file mode 100644
index 0000000..7fed477
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/124.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/125.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/125.gif
new file mode 100644
index 0000000..e2c3c11
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/125.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/126.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/126.gif
new file mode 100644
index 0000000..24105c9
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/126.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/127.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/127.gif
new file mode 100644
index 0000000..0cead36
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/127.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/128.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/128.gif
new file mode 100644
index 0000000..3185861
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/128.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/129.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/129.gif
new file mode 100644
index 0000000..ffd7c6b
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/129.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/13.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/13.gif
new file mode 100644
index 0000000..3475300
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/13.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/130.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/130.gif
new file mode 100644
index 0000000..d828e3d
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/130.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/131.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/131.gif
new file mode 100644
index 0000000..dcb096f
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/131.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/132.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/132.gif
new file mode 100644
index 0000000..1b272a6
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/132.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/133.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/133.gif
new file mode 100644
index 0000000..0d0e864
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/133.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/134.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/134.gif
new file mode 100644
index 0000000..cf48356
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/134.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/14.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/14.gif
new file mode 100644
index 0000000..6a788f8
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/14.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/15.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/15.gif
new file mode 100644
index 0000000..debab8e
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/15.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/16.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/16.gif
new file mode 100644
index 0000000..ed5d29f
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/16.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/17.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/17.gif
new file mode 100644
index 0000000..85886fe
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/17.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/18.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/18.gif
new file mode 100644
index 0000000..b6af218
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/18.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/19.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/19.gif
new file mode 100644
index 0000000..e045ff2
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/19.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/2.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/2.gif
new file mode 100644
index 0000000..40cfda4
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/2.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/20.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/20.gif
new file mode 100644
index 0000000..efd650f
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/20.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/21.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/21.gif
new file mode 100644
index 0000000..cb8cf6d
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/21.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/22.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/22.gif
new file mode 100644
index 0000000..96b04df
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/22.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/23.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/23.gif
new file mode 100644
index 0000000..96516b8
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/23.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/24.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/24.gif
new file mode 100644
index 0000000..5f925c7
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/24.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/25.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/25.gif
new file mode 100644
index 0000000..97f8b1a
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/25.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/26.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/26.gif
new file mode 100644
index 0000000..a7cded7
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/26.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/27.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/27.gif
new file mode 100644
index 0000000..bb46890
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/27.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/28.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/28.gif
new file mode 100644
index 0000000..f59dd58
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/28.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/29.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/29.gif
new file mode 100644
index 0000000..3c5227e
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/29.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/3.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/3.gif
new file mode 100644
index 0000000..6d6f762
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/3.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/30.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/30.gif
new file mode 100644
index 0000000..e24a180
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/30.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/31.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/31.gif
new file mode 100644
index 0000000..073e743
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/31.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/32.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/32.gif
new file mode 100644
index 0000000..772eff2
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/32.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/33.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/33.gif
new file mode 100644
index 0000000..217c1c5
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/33.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/34.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/34.gif
new file mode 100644
index 0000000..e9d4213
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/34.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/35.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/35.gif
new file mode 100644
index 0000000..d6da2c3
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/35.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/36.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/36.gif
new file mode 100644
index 0000000..c1e6ac9
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/36.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/37.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/37.gif
new file mode 100644
index 0000000..92efec6
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/37.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/38.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/38.gif
new file mode 100644
index 0000000..489f0f9
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/38.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/39.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/39.gif
new file mode 100644
index 0000000..734f6d8
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/39.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/4.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/4.gif
new file mode 100644
index 0000000..6ccdaa2
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/4.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/40.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/40.gif
new file mode 100644
index 0000000..24a8eb6
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/40.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/41.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/41.gif
new file mode 100644
index 0000000..99139e1
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/41.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/42.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/42.gif
new file mode 100644
index 0000000..f60897e
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/42.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/43.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/43.gif
new file mode 100644
index 0000000..4350491
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/43.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/44.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/44.gif
new file mode 100644
index 0000000..650d3dd
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/44.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/45.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/45.gif
new file mode 100644
index 0000000..5c8e071
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/45.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/46.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/46.gif
new file mode 100644
index 0000000..f3cb074
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/46.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/47.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/47.gif
new file mode 100644
index 0000000..5b3057a
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/47.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/48.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/48.gif
new file mode 100644
index 0000000..27a30c1
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/48.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/49.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/49.gif
new file mode 100644
index 0000000..dcfa48a
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/49.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/5.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/5.gif
new file mode 100644
index 0000000..ab0b81b
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/5.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/50.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/50.gif
new file mode 100644
index 0000000..029cf0f
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/50.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/51.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/51.gif
new file mode 100644
index 0000000..69f183f
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/51.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/52.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/52.gif
new file mode 100644
index 0000000..d41e8aa
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/52.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/53.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/53.gif
new file mode 100644
index 0000000..56352dd
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/53.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/54.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/54.gif
new file mode 100644
index 0000000..b28d848
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/54.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/55.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/55.gif
new file mode 100644
index 0000000..e18da84
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/55.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/56.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/56.gif
new file mode 100644
index 0000000..edf96f0
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/56.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/57.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/57.gif
new file mode 100644
index 0000000..3f0e2b9
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/57.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/58.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/58.gif
new file mode 100644
index 0000000..47b1aaa
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/58.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/59.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/59.gif
new file mode 100644
index 0000000..918288b
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/59.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/6.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/6.gif
new file mode 100644
index 0000000..ceab122
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/6.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/60.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/60.gif
new file mode 100644
index 0000000..66d2113
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/60.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/61.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/61.gif
new file mode 100644
index 0000000..034933e
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/61.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/62.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/62.gif
new file mode 100644
index 0000000..8d5c4fd
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/62.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/63.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/63.gif
new file mode 100644
index 0000000..d58fcf6
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/63.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/64.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/64.gif
new file mode 100644
index 0000000..c4e00bd
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/64.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/65.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/65.gif
new file mode 100644
index 0000000..da23bfa
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/65.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/66.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/66.gif
new file mode 100644
index 0000000..310ec65
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/66.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/67.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/67.gif
new file mode 100644
index 0000000..51761ba
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/67.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/68.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/68.gif
new file mode 100644
index 0000000..345cb43
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/68.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/69.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/69.gif
new file mode 100644
index 0000000..e0f28a0
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/69.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/7.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/7.gif
new file mode 100644
index 0000000..2f45399
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/7.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/70.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/70.gif
new file mode 100644
index 0000000..24284cf
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/70.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/71.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/71.gif
new file mode 100644
index 0000000..a0ccf2e
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/71.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/72.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/72.gif
new file mode 100644
index 0000000..7e113ee
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/72.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/73.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/73.gif
new file mode 100644
index 0000000..c0293c3
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/73.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/74.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/74.gif
new file mode 100644
index 0000000..1c52bde
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/74.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/75.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/75.gif
new file mode 100644
index 0000000..9cb9aa7
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/75.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/76.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/76.gif
new file mode 100644
index 0000000..27019f8
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/76.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/77.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/77.gif
new file mode 100644
index 0000000..8f882f5
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/77.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/78.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/78.gif
new file mode 100644
index 0000000..d0d0856
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/78.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/79.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/79.gif
new file mode 100644
index 0000000..61652a7
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/79.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/8.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/8.gif
new file mode 100644
index 0000000..f6c8834
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/8.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/80.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/80.gif
new file mode 100644
index 0000000..9a77936
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/80.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/81.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/81.gif
new file mode 100644
index 0000000..2329101
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/81.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/82.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/82.gif
new file mode 100644
index 0000000..644748a
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/82.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/83.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/83.gif
new file mode 100644
index 0000000..fbf275b
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/83.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/84.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/84.gif
new file mode 100644
index 0000000..076f0c6
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/84.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/85.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/85.gif
new file mode 100644
index 0000000..d254af4
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/85.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/86.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/86.gif
new file mode 100644
index 0000000..8f09d33
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/86.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/87.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/87.gif
new file mode 100644
index 0000000..df70756
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/87.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/88.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/88.gif
new file mode 100644
index 0000000..4d8b15e
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/88.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/89.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/89.gif
new file mode 100644
index 0000000..05726dc
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/89.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/9.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/9.gif
new file mode 100644
index 0000000..c2d8450
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/9.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/90.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/90.gif
new file mode 100644
index 0000000..adaf20e
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/90.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/91.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/91.gif
new file mode 100644
index 0000000..608d0ad
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/91.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/92.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/92.gif
new file mode 100644
index 0000000..b909e16
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/92.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/93.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/93.gif
new file mode 100644
index 0000000..7f71a8c
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/93.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/94.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/94.gif
new file mode 100644
index 0000000..4f26d7d
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/94.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/95.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/95.gif
new file mode 100644
index 0000000..5ef6d38
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/95.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/96.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/96.gif
new file mode 100644
index 0000000..2b709e1
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/96.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/97.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/97.gif
new file mode 100644
index 0000000..cf29be8
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/97.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/98.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/98.gif
new file mode 100644
index 0000000..c70e7d3
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/98.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/99.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/99.gif
new file mode 100644
index 0000000..05c1863
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/99.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/static.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/static.gif
new file mode 100644
index 0000000..b8c444b
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/emoticons/images/static.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/filemanager/filemanager.js b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/filemanager/filemanager.js
new file mode 100644
index 0000000..fd899af
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/filemanager/filemanager.js
@@ -0,0 +1,189 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('filemanager', function(K) {
+	var self = this, name = 'filemanager',
+		fileManagerJson = K.undef(self.fileManagerJson, self.basePath + 'php/file_manager_json.php'),
+		imgPath = self.pluginsPath + name + '/images/',
+		lang = self.lang(name + '.');
+	function makeFileTitle(filename, filesize, datetime) {
+		return filename + ' (' + Math.ceil(filesize / 1024) + 'KB, ' + datetime + ')';
+	}
+	function bindTitle(el, data) {
+		if (data.is_dir) {
+			el.attr('title', data.filename);
+		} else {
+			el.attr('title', makeFileTitle(data.filename, data.filesize, data.datetime));
+		}
+	}
+	self.plugin.filemanagerDialog = function(options) {
+		var width = K.undef(options.width, 650),
+			height = K.undef(options.height, 510),
+			dirName = K.undef(options.dirName, ''),
+			viewType = K.undef(options.viewType, 'VIEW').toUpperCase(), // "LIST" or "VIEW"
+			clickFn = options.clickFn;
+		var html = [
+			'<div style="padding:10px 20px;">',
+			// header start
+			'<div class="ke-plugin-filemanager-header">',
+			// left start
+			'<div class="ke-left">',
+			'<img class="ke-inline-block" name="moveupImg" src="' + imgPath + 'go-up.gif" width="16" height="16" border="0" alt="" /> ',
+			'<a class="ke-inline-block" name="moveupLink" href="javascript:;">' + lang.moveup + '</a>',
+			'</div>',
+			// right start
+			'<div class="ke-right">',
+			lang.viewType + ' <select class="ke-inline-block" name="viewType">',
+			'<option value="VIEW">' + lang.viewImage + '</option>',
+			'<option value="LIST">' + lang.listImage + '</option>',
+			'</select> ',
+			lang.orderType + ' <select class="ke-inline-block" name="orderType">',
+			'<option value="NAME">' + lang.fileName + '</option>',
+			'<option value="SIZE">' + lang.fileSize + '</option>',
+			'<option value="TYPE">' + lang.fileType + '</option>',
+			'</select>',
+			'</div>',
+			'<div class="ke-clearfix"></div>',
+			'</div>',
+			// body start
+			'<div class="ke-plugin-filemanager-body"></div>',
+			'</div>'
+		].join('');
+		var dialog = self.createDialog({
+			name : name,
+			width : width,
+			height : height,
+			title : self.lang(name),
+			body : html
+		}),
+		div = dialog.div,
+		bodyDiv = K('.ke-plugin-filemanager-body', div),
+		moveupImg = K('[name="moveupImg"]', div),
+		moveupLink = K('[name="moveupLink"]', div),
+		viewServerBtn = K('[name="viewServer"]', div),
+		viewTypeBox = K('[name="viewType"]', div),
+		orderTypeBox = K('[name="orderType"]', div);
+		function reloadPage(path, order, func) {
+			var param = 'path=' + path + '&order=' + order + '&dir=' + dirName;
+			dialog.showLoading(self.lang('ajaxLoading'));
+			K.ajax(K.addParam(fileManagerJson, param + '&' + new Date().getTime()), function(data) {
+				dialog.hideLoading();
+				func(data);
+			});
+		}
+		var elList = [];
+		function bindEvent(el, result, data, createFunc) {
+			var fileUrl = K.formatUrl(result.current_url + data.filename, 'absolute'),
+				dirPath = encodeURIComponent(result.current_dir_path + data.filename + '/');
+			if (data.is_dir) {
+				el.click(function(e) {
+					reloadPage(dirPath, orderTypeBox.val(), createFunc);
+				});
+			} else if (data.is_photo) {
+				el.click(function(e) {
+					clickFn.call(this, fileUrl, data.filename);
+				});
+			} else {
+				el.click(function(e) {
+					clickFn.call(this, fileUrl, data.filename);
+				});
+			}
+			elList.push(el);
+		}
+		function createCommon(result, createFunc) {
+			// remove events
+			K.each(elList, function() {
+				this.unbind();
+			});
+			moveupLink.unbind();
+			viewTypeBox.unbind();
+			orderTypeBox.unbind();
+			// add events
+			if (result.current_dir_path) {
+				moveupLink.click(function(e) {
+					reloadPage(result.moveup_dir_path, orderTypeBox.val(), createFunc);
+				});
+			}
+			function changeFunc() {
+				if (viewTypeBox.val() == 'VIEW') {
+					reloadPage(result.current_dir_path, orderTypeBox.val(), createView);
+				} else {
+					reloadPage(result.current_dir_path, orderTypeBox.val(), createList);
+				}
+			}
+			viewTypeBox.change(changeFunc);
+			orderTypeBox.change(changeFunc);
+			bodyDiv.html('');
+		}
+		function createList(result) {
+			createCommon(result, createList);
+			var table = document.createElement('table');
+			table.className = 'ke-table';
+			table.cellPadding = 0;
+			table.cellSpacing = 0;
+			table.border = 0;
+			bodyDiv.append(table);
+			var fileList = result.file_list;
+			for (var i = 0, len = fileList.length; i < len; i++) {
+				var data = fileList[i], row = K(table.insertRow(i));
+				row.mouseover(function(e) {
+					K(this).addClass('ke-on');
+				})
+				.mouseout(function(e) {
+					K(this).removeClass('ke-on');
+				});
+				var iconUrl = imgPath + (data.is_dir ? 'folder-16.gif' : 'file-16.gif'),
+					img = K('<img src="' + iconUrl + '" width="16" height="16" alt="' + data.filename + '" align="absmiddle" />'),
+					cell0 = K(row[0].insertCell(0)).addClass('ke-cell ke-name').append(img).append(document.createTextNode(' ' + data.filename));
+				if (!data.is_dir || data.has_file) {
+					row.css('cursor', 'pointer');
+					cell0.attr('title', data.filename);
+					bindEvent(cell0, result, data, createList);
+				} else {
+					cell0.attr('title', lang.emptyFolder);
+				}
+				K(row[0].insertCell(1)).addClass('ke-cell ke-size').html(data.is_dir ? '-' : Math.ceil(data.filesize / 1024) + 'KB');
+				K(row[0].insertCell(2)).addClass('ke-cell ke-datetime').html(data.datetime);
+			}
+		}
+		function createView(result) {
+			createCommon(result, createView);
+			var fileList = result.file_list;
+			for (var i = 0, len = fileList.length; i < len; i++) {
+				var data = fileList[i],
+					div = K('<div class="ke-inline-block ke-item"></div>');
+				bodyDiv.append(div);
+				var photoDiv = K('<div class="ke-inline-block ke-photo"></div>')
+					.mouseover(function(e) {
+						K(this).addClass('ke-on');
+					})
+					.mouseout(function(e) {
+						K(this).removeClass('ke-on');
+					});
+				div.append(photoDiv);
+				var fileUrl = result.current_url + data.filename,
+					iconUrl = data.is_dir ? imgPath + 'folder-64.gif' : (data.is_photo ? fileUrl : imgPath + 'file-64.gif');
+				var img = K('<img src="' + iconUrl + '" width="80" height="80" alt="' + data.filename + '" />');
+				if (!data.is_dir || data.has_file) {
+					photoDiv.css('cursor', 'pointer');
+					bindTitle(photoDiv, data);
+					bindEvent(photoDiv, result, data, createView);
+				} else {
+					photoDiv.attr('title', lang.emptyFolder);
+				}
+				photoDiv.append(img);
+				div.append('<div class="ke-name" title="' + data.filename + '">' + data.filename + '</div>');
+			}
+		}
+		viewTypeBox.val(viewType);
+		reloadPage('', orderTypeBox.val(), viewType == 'VIEW' ? createView : createList);
+		return dialog;
+	}
+
+});
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/filemanager/images/file-16.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/filemanager/images/file-16.gif
new file mode 100644
index 0000000..2cf6e47
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/filemanager/images/file-16.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/filemanager/images/file-64.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/filemanager/images/file-64.gif
new file mode 100644
index 0000000..2e211da
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/filemanager/images/file-64.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/filemanager/images/folder-16.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/filemanager/images/folder-16.gif
new file mode 100644
index 0000000..850b5a3
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/filemanager/images/folder-16.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/filemanager/images/folder-64.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/filemanager/images/folder-64.gif
new file mode 100644
index 0000000..e8a1b09
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/filemanager/images/folder-64.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/filemanager/images/go-up.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/filemanager/images/go-up.gif
new file mode 100644
index 0000000..92ae23d
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/filemanager/images/go-up.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/flash/flash.js b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/flash/flash.js
new file mode 100644
index 0000000..d5d465e
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/flash/flash.js
@@ -0,0 +1,161 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('flash', function(K) {
+	var self = this, name = 'flash', lang = self.lang(name + '.'),
+		allowFlashUpload = K.undef(self.allowFlashUpload, true),
+		allowFileManager = K.undef(self.allowFileManager, false),
+		formatUploadUrl = K.undef(self.formatUploadUrl, true),
+		extraParams = K.undef(self.extraFileUploadParams, {}),
+		filePostName = K.undef(self.filePostName, 'imgFile'),
+		uploadJson = K.undef(self.uploadJson, self.basePath + 'php/upload_json.php');
+	self.plugin.flash = {
+		edit : function() {
+			var html = [
+				'<div style="padding:20px;">',
+				//url
+				'<div class="ke-dialog-row">',
+				'<label for="keUrl" style="width:60px;">' + lang.url + '</label>',
+				'<input class="ke-input-text" type="text" id="keUrl" name="url" value="" style="width:160px;" /> &nbsp;',
+				'<input type="button" class="ke-upload-button" value="' + lang.upload + '" /> &nbsp;',
+				'<span class="ke-button-common ke-button-outer">',
+				'<input type="button" class="ke-button-common ke-button" name="viewServer" value="' + lang.viewServer + '" />',
+				'</span>',
+				'</div>',
+				//width
+				'<div class="ke-dialog-row">',
+				'<label for="keWidth" style="width:60px;">' + lang.width + '</label>',
+				'<input type="text" id="keWidth" class="ke-input-text ke-input-number" name="width" value="550" maxlength="4" /> ',
+				'</div>',
+				//height
+				'<div class="ke-dialog-row">',
+				'<label for="keHeight" style="width:60px;">' + lang.height + '</label>',
+				'<input type="text" id="keHeight" class="ke-input-text ke-input-number" name="height" value="400" maxlength="4" /> ',
+				'</div>',
+				'</div>'
+			].join('');
+			var dialog = self.createDialog({
+				name : name,
+				width : 450,
+				title : self.lang(name),
+				body : html,
+				yesBtn : {
+					name : self.lang('yes'),
+					click : function(e) {
+						var url = K.trim(urlBox.val()),
+							width = widthBox.val(),
+							height = heightBox.val();
+						if (url == 'http://' || K.invalidUrl(url)) {
+							alert(self.lang('invalidUrl'));
+							urlBox[0].focus();
+							return;
+						}
+						if (!/^\d*$/.test(width)) {
+							alert(self.lang('invalidWidth'));
+							widthBox[0].focus();
+							return;
+						}
+						if (!/^\d*$/.test(height)) {
+							alert(self.lang('invalidHeight'));
+							heightBox[0].focus();
+							return;
+						}
+						var html = K.mediaImg(self.themesPath + 'common/blank.gif', {
+								src : url,
+								type : K.mediaType('.swf'),
+								width : width,
+								height : height,
+								quality : 'high'
+							});
+						self.insertHtml(html).hideDialog().focus();
+					}
+				}
+			}),
+			div = dialog.div,
+			urlBox = K('[name="url"]', div),
+			viewServerBtn = K('[name="viewServer"]', div),
+			widthBox = K('[name="width"]', div),
+			heightBox = K('[name="height"]', div);
+			urlBox.val('http://');
+
+			if (allowFlashUpload) {
+				var uploadbutton = K.uploadbutton({
+					button : K('.ke-upload-button', div)[0],
+					fieldName : filePostName,
+					extraParams : extraParams,
+					url : K.addParam(uploadJson, 'dir=flash'),
+					afterUpload : function(data) {
+						dialog.hideLoading();
+						if (data.error === 0) {
+							var url = data.url;
+							if (formatUploadUrl) {
+								url = K.formatUrl(url, 'absolute');
+							}
+							urlBox.val(url);
+							if (self.afterUpload) {
+								self.afterUpload.call(self, url, data, name);
+							}
+							alert(self.lang('uploadSuccess'));
+						} else {
+							alert(data.message);
+						}
+					},
+					afterError : function(html) {
+						dialog.hideLoading();
+						self.errorDialog(html);
+					}
+				});
+				uploadbutton.fileBox.change(function(e) {
+					dialog.showLoading(self.lang('uploadLoading'));
+					uploadbutton.submit();
+				});
+			} else {
+				K('.ke-upload-button', div).hide();
+			}
+
+			if (allowFileManager) {
+				viewServerBtn.click(function(e) {
+					self.loadPlugin('filemanager', function() {
+						self.plugin.filemanagerDialog({
+							viewType : 'LIST',
+							dirName : 'flash',
+							clickFn : function(url, title) {
+								if (self.dialogs.length > 1) {
+									K('[name="url"]', div).val(url);
+									if (self.afterSelectFile) {
+										self.afterSelectFile.call(self, url);
+									}
+									self.hideDialog();
+								}
+							}
+						});
+					});
+				});
+			} else {
+				viewServerBtn.hide();
+			}
+
+			var img = self.plugin.getSelectedFlash();
+			if (img) {
+				var attrs = K.mediaAttrs(img.attr('data-ke-tag'));
+				urlBox.val(attrs.src);
+				widthBox.val(K.removeUnit(img.css('width')) || attrs.width || 0);
+				heightBox.val(K.removeUnit(img.css('height')) || attrs.height || 0);
+			}
+			urlBox[0].focus();
+			urlBox[0].select();
+		},
+		'delete' : function() {
+			self.plugin.getSelectedFlash().remove();
+			// [IE] 鍒犻櫎鍥剧墖鍚庣珛鍗崇偣鍑诲浘鐗囨寜閽嚭閿�
+			self.addBookmark();
+		}
+	};
+	self.clickToolbar(name, self.plugin.flash.edit);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/image/image.js b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/image/image.js
new file mode 100644
index 0000000..e03790a
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/image/image.js
@@ -0,0 +1,318 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('image', function(K) {
+	var self = this, name = 'image',
+		allowImageUpload = K.undef(self.allowImageUpload, true),
+		allowImageRemote = K.undef(self.allowImageRemote, true),
+		formatUploadUrl = K.undef(self.formatUploadUrl, true),
+		allowFileManager = K.undef(self.allowFileManager, false),
+		uploadJson = K.undef(self.uploadJson, self.basePath + 'php/upload_json.php'),
+		imageTabIndex = K.undef(self.imageTabIndex, 0),
+		imgPath = self.pluginsPath + 'image/images/',
+		extraParams = K.undef(self.extraFileUploadParams, {}),
+		filePostName = K.undef(self.filePostName, 'imgFile'),
+		fillDescAfterUploadImage = K.undef(self.fillDescAfterUploadImage, false),
+		lang = self.lang(name + '.');
+
+	self.plugin.imageDialog = function(options) {
+		var imageUrl = options.imageUrl,
+			imageWidth = K.undef(options.imageWidth, ''),
+			imageHeight = K.undef(options.imageHeight, ''),
+			imageTitle = K.undef(options.imageTitle, ''),
+			imageAlign = K.undef(options.imageAlign, ''),
+			showRemote = K.undef(options.showRemote, true),
+			showLocal = K.undef(options.showLocal, true),
+			tabIndex = K.undef(options.tabIndex, 0),
+			clickFn = options.clickFn;
+		var target = 'kindeditor_upload_iframe_' + new Date().getTime();
+		var hiddenElements = [];
+		for(var k in extraParams){
+			hiddenElements.push('<input type="hidden" name="' + k + '" value="' + extraParams[k] + '" />');
+		}
+		var html = [
+			'<div style="padding:20px;">',
+			//tabs
+			'<div class="tabs"></div>',
+			//remote image - start
+			'<div class="tab1" style="display:none;">',
+			//url
+			'<div class="ke-dialog-row">',
+			'<label for="remoteUrl" style="width:60px;">' + lang.remoteUrl + '</label>',
+			'<input type="text" id="remoteUrl" class="ke-input-text" name="url" value="" style="width:200px;" /> &nbsp;',
+			'<span class="ke-button-common ke-button-outer">',
+			'<input type="button" class="ke-button-common ke-button" name="viewServer" value="' + lang.viewServer + '" />',
+			'</span>',
+			'</div>',
+			//size
+			'<div class="ke-dialog-row">',
+			'<label for="remoteWidth" style="width:60px;">' + lang.size + '</label>',
+			lang.width + ' <input type="text" id="remoteWidth" class="ke-input-text ke-input-number" name="width" value="" maxlength="4" /> ',
+			lang.height + ' <input type="text" class="ke-input-text ke-input-number" name="height" value="" maxlength="4" /> ',
+			'<img class="ke-refresh-btn" src="' + imgPath + 'refresh.png" width="16" height="16" alt="" style="cursor:pointer;" title="' + lang.resetSize + '" />',
+			'</div>',
+			//align
+			'<div class="ke-dialog-row">',
+			'<label style="width:60px;">' + lang.align + '</label>',
+			'<input type="radio" name="align" class="ke-inline-block" value="" checked="checked" /> <img name="defaultImg" src="' + imgPath + 'align_top.gif" width="23" height="25" alt="" />',
+			' <input type="radio" name="align" class="ke-inline-block" value="left" /> <img name="leftImg" src="' + imgPath + 'align_left.gif" width="23" height="25" alt="" />',
+			' <input type="radio" name="align" class="ke-inline-block" value="right" /> <img name="rightImg" src="' + imgPath + 'align_right.gif" width="23" height="25" alt="" />',
+			'</div>',
+			//title
+			'<div class="ke-dialog-row">',
+			'<label for="remoteTitle" style="width:60px;">' + lang.imgTitle + '</label>',
+			'<input type="text" id="remoteTitle" class="ke-input-text" name="title" value="" style="width:200px;" />',
+			'</div>',
+			'</div>',
+			//remote image - end
+			//local upload - start
+			'<div class="tab2" style="display:none;">',
+			'<iframe name="' + target + '" style="display:none;"></iframe>',
+			'<form class="ke-upload-area ke-form" method="post" enctype="multipart/form-data" target="' + target + '" action="' + K.addParam(uploadJson, 'dir=image') + '">',
+			//file
+			'<div class="ke-dialog-row">',
+			hiddenElements.join(''),
+			'<label style="width:60px;">' + lang.localUrl + '</label>',
+			'<input type="text" name="localUrl" class="ke-input-text" tabindex="-1" style="width:200px;" readonly="true" /> &nbsp;',
+			'<input type="button" class="ke-upload-button" value="' + lang.upload + '" />',
+			'</div>',
+			'</form>',
+			'</div>',
+			//local upload - end
+			'</div>'
+		].join('');
+		var dialogWidth = showLocal || allowFileManager ? 450 : 400,
+			dialogHeight = showLocal && showRemote ? 300 : 250;
+		var dialog = self.createDialog({
+			name : name,
+			width : dialogWidth,
+			height : dialogHeight,
+			title : self.lang(name),
+			body : html,
+			yesBtn : {
+				name : self.lang('yes'),
+				click : function(e) {
+					// Bugfix: http://code.google.com/p/kindeditor/issues/detail?id=319
+					if (dialog.isLoading) {
+						return;
+					}
+					// insert local image
+					if (showLocal && showRemote && tabs && tabs.selectedIndex === 1 || !showRemote) {
+						if (uploadbutton.fileBox.val() == '') {
+							alert(self.lang('pleaseSelectFile'));
+							return;
+						}
+						dialog.showLoading(self.lang('uploadLoading'));
+						uploadbutton.submit();
+						localUrlBox.val('');
+						return;
+					}
+					// insert remote image
+					var url = K.trim(urlBox.val()),
+						width = widthBox.val(),
+						height = heightBox.val(),
+						title = titleBox.val(),
+						align = '';
+					alignBox.each(function() {
+						if (this.checked) {
+							align = this.value;
+							return false;
+						}
+					});
+					if (url == 'http://' || K.invalidUrl(url)) {
+						alert(self.lang('invalidUrl'));
+						urlBox[0].focus();
+						return;
+					}
+					if (!/^\d*$/.test(width)) {
+						alert(self.lang('invalidWidth'));
+						widthBox[0].focus();
+						return;
+					}
+					if (!/^\d*$/.test(height)) {
+						alert(self.lang('invalidHeight'));
+						heightBox[0].focus();
+						return;
+					}
+					clickFn.call(self, url, title, width, height, 0, align);
+				}
+			},
+			beforeRemove : function() {
+				viewServerBtn.unbind();
+				widthBox.unbind();
+				heightBox.unbind();
+				refreshBtn.unbind();
+			}
+		}),
+		div = dialog.div;
+
+		var urlBox = K('[name="url"]', div),
+			localUrlBox = K('[name="localUrl"]', div),
+			viewServerBtn = K('[name="viewServer"]', div),
+			widthBox = K('.tab1 [name="width"]', div),
+			heightBox = K('.tab1 [name="height"]', div),
+			refreshBtn = K('.ke-refresh-btn', div),
+			titleBox = K('.tab1 [name="title"]', div),
+			alignBox = K('.tab1 [name="align"]', div);
+
+		var tabs;
+		if (showRemote && showLocal) {
+			tabs = K.tabs({
+				src : K('.tabs', div),
+				afterSelect : function(i) {}
+			});
+			tabs.add({
+				title : lang.remoteImage,
+				panel : K('.tab1', div)
+			});
+			tabs.add({
+				title : lang.localImage,
+				panel : K('.tab2', div)
+			});
+			tabs.select(tabIndex);
+		} else if (showRemote) {
+			K('.tab1', div).show();
+		} else if (showLocal) {
+			K('.tab2', div).show();
+		}
+
+		var uploadbutton = K.uploadbutton({
+			button : K('.ke-upload-button', div)[0],
+			fieldName : filePostName,
+			form : K('.ke-form', div),
+			target : target,
+			width: 60,
+			afterUpload : function(data) {
+				dialog.hideLoading();
+				if (data.error === 0) {
+					var url = data.url;
+					if (formatUploadUrl) {
+						url = K.formatUrl(url, 'absolute');
+					}
+					if (self.afterUpload) {
+						self.afterUpload.call(self, url, data, name);
+					}
+					if (!fillDescAfterUploadImage) {
+						clickFn.call(self, url, data.title, data.width, data.height, data.border, data.align);
+					} else {
+						K(".ke-dialog-row #remoteUrl", div).val(url);
+						K(".ke-tabs-li", div)[0].click();
+						K(".ke-refresh-btn", div).click();
+					}
+				} else {
+					alert(data.message);
+				}
+			},
+			afterError : function(html) {
+				dialog.hideLoading();
+				self.errorDialog(html);
+			}
+		});
+		uploadbutton.fileBox.change(function(e) {
+			localUrlBox.val(uploadbutton.fileBox.val());
+		});
+		if (allowFileManager) {
+			viewServerBtn.click(function(e) {
+				self.loadPlugin('filemanager', function() {
+					self.plugin.filemanagerDialog({
+						viewType : 'VIEW',
+						dirName : 'image',
+						clickFn : function(url, title) {
+							if (self.dialogs.length > 1) {
+								K('[name="url"]', div).val(url);
+								if (self.afterSelectFile) {
+									self.afterSelectFile.call(self, url);
+								}
+								self.hideDialog();
+							}
+						}
+					});
+				});
+			});
+		} else {
+			viewServerBtn.hide();
+		}
+		var originalWidth = 0, originalHeight = 0;
+		function setSize(width, height) {
+			widthBox.val(width);
+			heightBox.val(height);
+			originalWidth = width;
+			originalHeight = height;
+		}
+		refreshBtn.click(function(e) {
+			var tempImg = K('<img src="' + urlBox.val() + '" />', document).css({
+				position : 'absolute',
+				visibility : 'hidden',
+				top : 0,
+				left : '-1000px'
+			});
+			tempImg.bind('load', function() {
+				setSize(tempImg.width(), tempImg.height());
+				tempImg.remove();
+			});
+			K(document.body).append(tempImg);
+		});
+		widthBox.change(function(e) {
+			if (originalWidth > 0) {
+				heightBox.val(Math.round(originalHeight / originalWidth * parseInt(this.value, 10)));
+			}
+		});
+		heightBox.change(function(e) {
+			if (originalHeight > 0) {
+				widthBox.val(Math.round(originalWidth / originalHeight * parseInt(this.value, 10)));
+			}
+		});
+		urlBox.val(options.imageUrl);
+		setSize(options.imageWidth, options.imageHeight);
+		titleBox.val(options.imageTitle);
+		alignBox.each(function() {
+			if (this.value === options.imageAlign) {
+				this.checked = true;
+				return false;
+			}
+		});
+		if (showRemote && tabIndex === 0) {
+			urlBox[0].focus();
+			urlBox[0].select();
+		}
+		return dialog;
+	};
+	self.plugin.image = {
+		edit : function() {
+			var img = self.plugin.getSelectedImage();
+			self.plugin.imageDialog({
+				imageUrl : img ? img.attr('data-ke-src') : 'http://',
+				imageWidth : img ? img.width() : '',
+				imageHeight : img ? img.height() : '',
+				imageTitle : img ? img.attr('title') : '',
+				imageAlign : img ? img.attr('align') : '',
+				showRemote : allowImageRemote,
+				showLocal : allowImageUpload,
+				tabIndex: img ? 0 : imageTabIndex,
+				clickFn : function(url, title, width, height, border, align) {
+					self.exec('insertimage', url, title, width, height, border, align);
+					// Bugfix: [Firefox] 涓婁紶鍥剧墖鍚庯紝鎬绘槸鍑虹幇姝e湪鍔犺浇鐨勬牱寮忥紝闇�瑕佸欢杩熸墽琛宧ideDialog
+					setTimeout(function() {
+						self.hideDialog().focus();
+					}, 0);
+				}
+			});
+		},
+		'delete' : function() {
+			var target = self.plugin.getSelectedImage();
+			if (target.parent().name == 'a') {
+				target = target.parent();
+			}
+			target.remove();
+			// [IE] 鍒犻櫎鍥剧墖鍚庣珛鍗崇偣鍑诲浘鐗囨寜閽嚭閿�
+			self.addBookmark();
+		}
+	};
+	self.clickToolbar(name, self.plugin.image.edit);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/image/images/align_left.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/image/images/align_left.gif
new file mode 100644
index 0000000..ab17f56
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/image/images/align_left.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/image/images/align_right.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/image/images/align_right.gif
new file mode 100644
index 0000000..e8ebe6a
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/image/images/align_right.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/image/images/align_top.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/image/images/align_top.gif
new file mode 100644
index 0000000..d8826a5
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/image/images/align_top.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/image/images/refresh.png b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/image/images/refresh.png
new file mode 100644
index 0000000..77e12d1
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/image/images/refresh.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/insertfile/insertfile.js b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/insertfile/insertfile.js
new file mode 100644
index 0000000..b8c523e
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/insertfile/insertfile.js
@@ -0,0 +1,138 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('insertfile', function(K) {
+	var self = this, name = 'insertfile',
+		allowFileUpload = K.undef(self.allowFileUpload, true),
+		allowFileManager = K.undef(self.allowFileManager, false),
+		formatUploadUrl = K.undef(self.formatUploadUrl, true),
+		uploadJson = K.undef(self.uploadJson, self.basePath + 'php/upload_json.php'),
+		extraParams = K.undef(self.extraFileUploadParams, {}),
+		filePostName = K.undef(self.filePostName, 'imgFile'),
+		lang = self.lang(name + '.');
+	self.plugin.fileDialog = function(options) {
+		var fileUrl = K.undef(options.fileUrl, 'http://'),
+			fileTitle = K.undef(options.fileTitle, ''),
+			clickFn = options.clickFn;
+		var html = [
+			'<div style="padding:20px;">',
+			'<div class="ke-dialog-row">',
+			'<label for="keUrl" style="width:60px;">' + lang.url + '</label>',
+			'<input type="text" id="keUrl" name="url" class="ke-input-text" style="width:160px;" /> &nbsp;',
+			'<input type="button" class="ke-upload-button" value="' + lang.upload + '" /> &nbsp;',
+			'<span class="ke-button-common ke-button-outer">',
+			'<input type="button" class="ke-button-common ke-button" name="viewServer" value="' + lang.viewServer + '" />',
+			'</span>',
+			'</div>',
+			//title
+			'<div class="ke-dialog-row">',
+			'<label for="keTitle" style="width:60px;">' + lang.title + '</label>',
+			'<input type="text" id="keTitle" class="ke-input-text" name="title" value="" style="width:160px;" /></div>',
+			'</div>',
+			//form end
+			'</form>',
+			'</div>'
+			].join('');
+		var dialog = self.createDialog({
+			name : name,
+			width : 450,
+			title : self.lang(name),
+			body : html,
+			yesBtn : {
+				name : self.lang('yes'),
+				click : function(e) {
+					var url = K.trim(urlBox.val()),
+						title = titleBox.val();
+					if (url == 'http://' || K.invalidUrl(url)) {
+						alert(self.lang('invalidUrl'));
+						urlBox[0].focus();
+						return;
+					}
+					if (K.trim(title) === '') {
+						title = url;
+					}
+					clickFn.call(self, url, title);
+				}
+			}
+		}),
+		div = dialog.div;
+
+		var urlBox = K('[name="url"]', div),
+			viewServerBtn = K('[name="viewServer"]', div),
+			titleBox = K('[name="title"]', div);
+
+		if (allowFileUpload) {
+			var uploadbutton = K.uploadbutton({
+				button : K('.ke-upload-button', div)[0],
+				fieldName : filePostName,
+				url : K.addParam(uploadJson, 'dir=file'),
+				extraParams : extraParams,
+				afterUpload : function(data) {
+					dialog.hideLoading();
+					if (data.error === 0) {
+						var url = data.url;
+						if (formatUploadUrl) {
+							url = K.formatUrl(url, 'absolute');
+						}
+						urlBox.val(url);
+						if (self.afterUpload) {
+							self.afterUpload.call(self, url, data, name);
+						}
+						alert(self.lang('uploadSuccess'));
+					} else {
+						alert(data.message);
+					}
+				},
+				afterError : function(html) {
+					dialog.hideLoading();
+					self.errorDialog(html);
+				}
+			});
+			uploadbutton.fileBox.change(function(e) {
+				dialog.showLoading(self.lang('uploadLoading'));
+				uploadbutton.submit();
+			});
+		} else {
+			K('.ke-upload-button', div).hide();
+		}
+		if (allowFileManager) {
+			viewServerBtn.click(function(e) {
+				self.loadPlugin('filemanager', function() {
+					self.plugin.filemanagerDialog({
+						viewType : 'LIST',
+						dirName : 'file',
+						clickFn : function(url, title) {
+							if (self.dialogs.length > 1) {
+								K('[name="url"]', div).val(url);
+								if (self.afterSelectFile) {
+									self.afterSelectFile.call(self, url);
+								}
+								self.hideDialog();
+							}
+						}
+					});
+				});
+			});
+		} else {
+			viewServerBtn.hide();
+		}
+		urlBox.val(fileUrl);
+		titleBox.val(fileTitle);
+		urlBox[0].focus();
+		urlBox[0].select();
+	};
+	self.clickToolbar(name, function() {
+		self.plugin.fileDialog({
+			clickFn : function(url, title) {
+				var html = '<a class="ke-insertfile" href="' + url + '" data-ke-src="' + url + '" target="_blank">' + title + '</a>';
+				self.insertHtml(html).hideDialog().focus();
+			}
+		});
+	});
+});
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/lineheight/lineheight.js b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/lineheight/lineheight.js
new file mode 100644
index 0000000..ae679d7
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/lineheight/lineheight.js
@@ -0,0 +1,38 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('lineheight', function(K) {
+	var self = this, name = 'lineheight', lang = self.lang(name + '.');
+	self.clickToolbar(name, function() {
+		var curVal = '', commonNode = self.cmd.commonNode({'*' : '.line-height'});
+		if (commonNode) {
+			curVal = commonNode.css('line-height');
+		}
+		var menu = self.createMenu({
+			name : name,
+			width : 150
+		});
+		K.each(lang.lineHeight, function(i, row) {
+			K.each(row, function(key, val) {
+				menu.addItem({
+					title : val,
+					checked : curVal === key,
+					click : function() {
+						self.cmd.toggle('<span style="line-height:' + key + ';"></span>', {
+							span : '.line-height=' + key
+						});
+						self.updateState();
+						self.addBookmark();
+						self.hideMenu();
+					}
+				});
+			});
+		});
+	});
+});
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/link/link.js b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/link/link.js
new file mode 100644
index 0000000..352fa3c
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/link/link.js
@@ -0,0 +1,66 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('link', function(K) {
+	var self = this, name = 'link';
+	self.plugin.link = {
+		edit : function() {
+			var lang = self.lang(name + '.'),
+				html = '<div style="padding:20px;">' +
+					//url
+					'<div class="ke-dialog-row">' +
+					'<label for="keUrl" style="width:60px;">' + lang.url + '</label>' +
+					'<input class="ke-input-text" type="text" id="keUrl" name="url" value="" style="width:260px;" /></div>' +
+					//type
+					'<div class="ke-dialog-row"">' +
+					'<label for="keType" style="width:60px;">' + lang.linkType + '</label>' +
+					'<select id="keType" name="type"></select>' +
+					'</div>' +
+					'</div>',
+				dialog = self.createDialog({
+					name : name,
+					width : 450,
+					title : self.lang(name),
+					body : html,
+					yesBtn : {
+						name : self.lang('yes'),
+						click : function(e) {
+							var url = K.trim(urlBox.val());
+							if (url == 'http://' || K.invalidUrl(url)) {
+								alert(self.lang('invalidUrl'));
+								urlBox[0].focus();
+								return;
+							}
+							self.exec('createlink', url, typeBox.val()).hideDialog().focus();
+						}
+					}
+				}),
+				div = dialog.div,
+				urlBox = K('input[name="url"]', div),
+				typeBox = K('select[name="type"]', div);
+			urlBox.val('http://');
+			typeBox[0].options[0] = new Option(lang.newWindow, '_blank');
+			typeBox[0].options[1] = new Option(lang.selfWindow, '');
+			self.cmd.selection();
+			var a = self.plugin.getSelectedLink();
+			if (a) {
+				self.cmd.range.selectNode(a[0]);
+				self.cmd.select();
+				urlBox.val(a.attr('data-ke-src'));
+				typeBox.val(a.attr('target'));
+			}
+			urlBox[0].focus();
+			urlBox[0].select();
+		},
+		'delete' : function() {
+			self.exec('unlink', null);
+		}
+	};
+	self.clickToolbar(name, self.plugin.link.edit);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/map/map.html b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/map/map.html
new file mode 100644
index 0000000..1a9ad7d
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/map/map.html
@@ -0,0 +1,57 @@
+<!doctype html>
+<html>
+	<head>
+	<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
+	<style>
+		html { height: 100% }
+		body { height: 100%; margin: 0; padding: 0; background-color: #FFF }
+		#map_canvas { height: 100% }
+	</style>
+	<script src="http://maps.googleapis.com/maps/api/js?sensor=false&language=zh_CN"></script>
+	<script>
+		var map, geocoder;
+		function initialize() {
+			var latlng = new google.maps.LatLng(31.230393, 121.473704);
+			var options = {
+				zoom: 11,
+				center: latlng,
+				disableDefaultUI: true,
+				panControl: true,
+				zoomControl: true,
+				mapTypeControl: true,
+				scaleControl: true,
+				streetViewControl: false,
+				overviewMapControl: true,
+				mapTypeId: google.maps.MapTypeId.ROADMAP
+			};
+			map = new google.maps.Map(document.getElementById("map_canvas"), options);
+			geocoder = new google.maps.Geocoder();
+			geocoder.geocode({latLng: latlng}, function(results, status) {
+				if (status == google.maps.GeocoderStatus.OK) {
+					if (results[3]) {
+						parent.document.getElementById("kindeditor_plugin_map_address").value = results[3].formatted_address;
+					}
+				}
+			});
+		}
+		function search(address) {
+			if (!map) return;
+			geocoder.geocode({address : address}, function(results, status) {
+				if (status == google.maps.GeocoderStatus.OK) {
+					map.setZoom(11);
+					map.setCenter(results[0].geometry.location);
+					var marker = new google.maps.Marker({
+						map: map,
+						position: results[0].geometry.location
+					});
+				} else {
+					alert("Invalid address: " + address);
+				}
+			});
+		}
+	</script>
+	</head>
+	<body onload="initialize();">
+		<div id="map_canvas" style="width:100%; height:100%"></div>
+	</body>
+</html>
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/map/map.js b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/map/map.js
new file mode 100644
index 0000000..5290875
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/map/map.js
@@ -0,0 +1,137 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+// Google Maps: http://code.google.com/apis/maps/index.html
+
+KindEditor.plugin('map', function(K) {
+	var self = this, name = 'map', lang = self.lang(name + '.');
+	self.clickToolbar(name, function() {
+		var html = ['<div style="padding:10px 20px;">',
+			'<div class="ke-dialog-row">',
+			lang.address + ' <input id="kindeditor_plugin_map_address" name="address" class="ke-input-text" value="" style="width:200px;" /> ',
+			'<span class="ke-button-common ke-button-outer">',
+			'<input type="button" name="searchBtn" class="ke-button-common ke-button" value="' + lang.search + '" />',
+			'</span>',
+			'</div>',
+			'<div class="ke-map" style="width:558px;height:360px;"></div>',
+			'</div>'].join('');
+		var dialog = self.createDialog({
+			name : name,
+			width : 600,
+			title : self.lang(name),
+			body : html,
+			yesBtn : {
+				name : self.lang('yes'),
+				click : function(e) {
+					var geocoder = win.geocoder,
+						map = win.map,
+						center = map.getCenter().lat() + ',' + map.getCenter().lng(),
+						zoom = map.getZoom(),
+						maptype = map.getMapTypeId(),
+						url = 'http://maps.googleapis.com/maps/api/staticmap';
+						url += '?center=' + encodeURIComponent(center);
+						url += '&zoom=' + encodeURIComponent(zoom);
+						url += '&size=558x360';
+						url += '&maptype=' + encodeURIComponent(maptype);
+						url += '&markers=' + encodeURIComponent(center);
+						url += '&language=' + self.langType;
+						url += '&sensor=false';
+					self.exec('insertimage', url).hideDialog().focus();
+				}
+			},
+			beforeRemove : function() {
+				searchBtn.remove();
+				if (doc) {
+					doc.write('');
+				}
+				iframe.remove();
+			}
+		});
+		var div = dialog.div,
+			addressBox = K('[name="address"]', div),
+			searchBtn = K('[name="searchBtn"]', div),
+			win, doc;
+		var iframeHtml = ['<!doctype html><html><head>',
+			'<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />',
+			'<style>',
+			'	html { height: 100% }',
+			'	body { height: 100%; margin: 0; padding: 0; background-color: #FFF }',
+			'	#map_canvas { height: 100% }',
+			'</style>',
+			'<script src="http://maps.googleapis.com/maps/api/js?sensor=false&language=' + self.langType + '"></script>',
+			'<script>',
+			'var map, geocoder;',
+			'function initialize() {',
+			'	var latlng = new google.maps.LatLng(31.230393, 121.473704);',
+			'	var options = {',
+			'		zoom: 11,',
+			'		center: latlng,',
+			'		disableDefaultUI: true,',
+			'		panControl: true,',
+			'		zoomControl: true,',
+			'		mapTypeControl: true,',
+			'		scaleControl: true,',
+			'		streetViewControl: false,',
+			'		overviewMapControl: true,',
+			'		mapTypeId: google.maps.MapTypeId.ROADMAP',
+			'	};',
+			'	map = new google.maps.Map(document.getElementById("map_canvas"), options);',
+			'	geocoder = new google.maps.Geocoder();',
+			'	geocoder.geocode({latLng: latlng}, function(results, status) {',
+			'		if (status == google.maps.GeocoderStatus.OK) {',
+			'			if (results[3]) {',
+			'				parent.document.getElementById("kindeditor_plugin_map_address").value = results[3].formatted_address;',
+			'			}',
+			'		}',
+			'	});',
+			'}',
+			'function search(address) {',
+			'	if (!map) return;',
+			'	geocoder.geocode({address : address}, function(results, status) {',
+			'		if (status == google.maps.GeocoderStatus.OK) {',
+			'			map.setZoom(11);',
+			'			map.setCenter(results[0].geometry.location);',
+			'			var marker = new google.maps.Marker({',
+			'				map: map,',
+			'				position: results[0].geometry.location',
+			'			});',
+			'		} else {',
+			'			alert("Invalid address: " + address);',
+			'		}',
+			'	});',
+			'}',
+			'</script>',
+			'</head>',
+			'<body onload="initialize();">',
+			'<div id="map_canvas" style="width:100%; height:100%"></div>',
+			'</body></html>'].join('\n');
+		// TODO锛氱敤doc.write(iframeHtml)鏂瑰紡鍔犺浇鏃讹紝鍦↖E6涓婄涓�娆″姞杞芥姤閿欙紝鏆傛椂浣跨敤src鏂瑰紡
+		var iframe = K('<iframe class="ke-textarea" frameborder="0" src="' + self.pluginsPath + 'map/map.html" style="width:558px;height:360px;"></iframe>');
+		function ready() {
+			win = iframe[0].contentWindow;
+			doc = K.iframeDoc(iframe);
+			//doc.open();
+			//doc.write(iframeHtml);
+			//doc.close();
+		}
+		iframe.bind('load', function() {
+			iframe.unbind('load');
+			if (K.IE) {
+				ready();
+			} else {
+				setTimeout(ready, 0);
+			}
+		});
+		K('.ke-map', div).replaceWith(iframe);
+		// search map
+		searchBtn.click(function() {
+			win.search(addressBox.val());
+		});
+	});
+});
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/media/media.js b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/media/media.js
new file mode 100644
index 0000000..5803466
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/media/media.js
@@ -0,0 +1,170 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('media', function(K) {
+	var self = this, name = 'media', lang = self.lang(name + '.'),
+		allowMediaUpload = K.undef(self.allowMediaUpload, true),
+		allowFileManager = K.undef(self.allowFileManager, false),
+		formatUploadUrl = K.undef(self.formatUploadUrl, true),
+		extraParams = K.undef(self.extraFileUploadParams, {}),
+		filePostName = K.undef(self.filePostName, 'imgFile'),
+		uploadJson = K.undef(self.uploadJson, self.basePath + 'php/upload_json.php');
+	self.plugin.media = {
+		edit : function() {
+			var html = [
+				'<div style="padding:20px;">',
+				//url
+				'<div class="ke-dialog-row">',
+				'<label for="keUrl" style="width:60px;">' + lang.url + '</label>',
+				'<input class="ke-input-text" type="text" id="keUrl" name="url" value="" style="width:160px;" /> &nbsp;',
+				'<input type="button" class="ke-upload-button" value="' + lang.upload + '" /> &nbsp;',
+				'<span class="ke-button-common ke-button-outer">',
+				'<input type="button" class="ke-button-common ke-button" name="viewServer" value="' + lang.viewServer + '" />',
+				'</span>',
+				'</div>',
+				//width
+				'<div class="ke-dialog-row">',
+				'<label for="keWidth" style="width:60px;">' + lang.width + '</label>',
+				'<input type="text" id="keWidth" class="ke-input-text ke-input-number" name="width" value="550" maxlength="4" />',
+				'</div>',
+				//height
+				'<div class="ke-dialog-row">',
+				'<label for="keHeight" style="width:60px;">' + lang.height + '</label>',
+				'<input type="text" id="keHeight" class="ke-input-text ke-input-number" name="height" value="400" maxlength="4" />',
+				'</div>',
+				//autostart
+				'<div class="ke-dialog-row">',
+				'<label for="keAutostart">' + lang.autostart + '</label>',
+				'<input type="checkbox" id="keAutostart" name="autostart" value="" /> ',
+				'</div>',
+				'</div>'
+			].join('');
+			var dialog = self.createDialog({
+				name : name,
+				width : 450,
+				height : 230,
+				title : self.lang(name),
+				body : html,
+				yesBtn : {
+					name : self.lang('yes'),
+					click : function(e) {
+						var url = K.trim(urlBox.val()),
+							width = widthBox.val(),
+							height = heightBox.val();
+						if (url == 'http://' || K.invalidUrl(url)) {
+							alert(self.lang('invalidUrl'));
+							urlBox[0].focus();
+							return;
+						}
+						if (!/^\d*$/.test(width)) {
+							alert(self.lang('invalidWidth'));
+							widthBox[0].focus();
+							return;
+						}
+						if (!/^\d*$/.test(height)) {
+							alert(self.lang('invalidHeight'));
+							heightBox[0].focus();
+							return;
+						}
+						var html = K.mediaImg(self.themesPath + 'common/blank.gif', {
+								src : url,
+								type : K.mediaType(url),
+								width : width,
+								height : height,
+								autostart : autostartBox[0].checked ? 'true' : 'false',
+								loop : 'true'
+							});
+						self.insertHtml(html).hideDialog().focus();
+					}
+				}
+			}),
+			div = dialog.div,
+			urlBox = K('[name="url"]', div),
+			viewServerBtn = K('[name="viewServer"]', div),
+			widthBox = K('[name="width"]', div),
+			heightBox = K('[name="height"]', div),
+			autostartBox = K('[name="autostart"]', div);
+			urlBox.val('http://');
+
+			if (allowMediaUpload) {
+				var uploadbutton = K.uploadbutton({
+					button : K('.ke-upload-button', div)[0],
+					fieldName : filePostName,
+					extraParams : extraParams,
+					url : K.addParam(uploadJson, 'dir=media'),
+					afterUpload : function(data) {
+						dialog.hideLoading();
+						if (data.error === 0) {
+							var url = data.url;
+							if (formatUploadUrl) {
+								url = K.formatUrl(url, 'absolute');
+							}
+							urlBox.val(url);
+							if (self.afterUpload) {
+								self.afterUpload.call(self, url, data, name);
+							}
+							alert(self.lang('uploadSuccess'));
+						} else {
+							alert(data.message);
+						}
+					},
+					afterError : function(html) {
+						dialog.hideLoading();
+						self.errorDialog(html);
+					}
+				});
+				uploadbutton.fileBox.change(function(e) {
+					dialog.showLoading(self.lang('uploadLoading'));
+					uploadbutton.submit();
+				});
+			} else {
+				K('.ke-upload-button', div).hide();
+			}
+
+			if (allowFileManager) {
+				viewServerBtn.click(function(e) {
+					self.loadPlugin('filemanager', function() {
+						self.plugin.filemanagerDialog({
+							viewType : 'LIST',
+							dirName : 'media',
+							clickFn : function(url, title) {
+								if (self.dialogs.length > 1) {
+									K('[name="url"]', div).val(url);
+									if (self.afterSelectFile) {
+										self.afterSelectFile.call(self, url);
+									}
+									self.hideDialog();
+								}
+							}
+						});
+					});
+				});
+			} else {
+				viewServerBtn.hide();
+			}
+
+			var img = self.plugin.getSelectedMedia();
+			if (img) {
+				var attrs = K.mediaAttrs(img.attr('data-ke-tag'));
+				urlBox.val(attrs.src);
+				widthBox.val(K.removeUnit(img.css('width')) || attrs.width || 0);
+				heightBox.val(K.removeUnit(img.css('height')) || attrs.height || 0);
+				autostartBox[0].checked = (attrs.autostart === 'true');
+			}
+			urlBox[0].focus();
+			urlBox[0].select();
+		},
+		'delete' : function() {
+			self.plugin.getSelectedMedia().remove();
+			// [IE] 鍒犻櫎鍥剧墖鍚庣珛鍗崇偣鍑诲浘鐗囨寜閽嚭閿�
+			self.addBookmark();
+		}
+	};
+	self.clickToolbar(name, self.plugin.media.edit);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/multiimage/images/image.png b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/multiimage/images/image.png
new file mode 100644
index 0000000..fe79cf0
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/multiimage/images/image.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/multiimage/images/select-files-en.png b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/multiimage/images/select-files-en.png
new file mode 100644
index 0000000..a926a6e
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/multiimage/images/select-files-en.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/multiimage/images/select-files-zh_CN.png b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/multiimage/images/select-files-zh_CN.png
new file mode 100644
index 0000000..5a31d36
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/multiimage/images/select-files-zh_CN.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/multiimage/images/swfupload.swf b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/multiimage/images/swfupload.swf
new file mode 100644
index 0000000..e3f7670
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/multiimage/images/swfupload.swf
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/multiimage/multiimage.js b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/multiimage/multiimage.js
new file mode 100644
index 0000000..05a60d6
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/multiimage/multiimage.js
@@ -0,0 +1,1388 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+
+(function(K) {
+
+function KSWFUpload(options) {
+	this.init(options);
+}
+K.extend(KSWFUpload, {
+	init : function(options) {
+		var self = this;
+		options.afterError = options.afterError || function(str) {
+			alert(str);
+		};
+		self.options = options;
+		self.progressbars = {};
+		// template
+		self.div = K(options.container).html([
+			'<div class="ke-swfupload">',
+			'<div class="ke-swfupload-top">',
+			'<div class="ke-inline-block ke-swfupload-button">',
+			'<input type="button" value="Browse" />',
+			'</div>',
+			'<div class="ke-inline-block ke-swfupload-desc">' + options.uploadDesc + '</div>',
+			'<span class="ke-button-common ke-button-outer ke-swfupload-startupload">',
+			'<input type="button" class="ke-button-common ke-button" value="' + options.startButtonValue + '" />',
+			'</span>',
+			'</div>',
+			'<div class="ke-swfupload-body"></div>',
+			'</div>'
+		].join(''));
+		self.bodyDiv = K('.ke-swfupload-body', self.div);
+
+		function showError(itemDiv, msg) {
+			K('.ke-status > div', itemDiv).hide();
+			K('.ke-message', itemDiv).addClass('ke-error').show().html(K.escape(msg));
+		}
+
+		var settings = {
+			debug : false,
+			upload_url : options.uploadUrl,
+			flash_url : options.flashUrl,
+			file_post_name : options.filePostName,
+			button_placeholder : K('.ke-swfupload-button > input', self.div)[0],
+			button_image_url: options.buttonImageUrl,
+			button_width: options.buttonWidth,
+			button_height: options.buttonHeight,
+			button_cursor : SWFUpload.CURSOR.HAND,
+			file_types : options.fileTypes,
+			file_types_description : options.fileTypesDesc,
+			file_upload_limit : options.fileUploadLimit,
+			file_size_limit : options.fileSizeLimit,
+			post_params : options.postParams,
+			file_queued_handler : function(file) {
+				file.url = self.options.fileIconUrl;
+				self.appendFile(file);
+			},
+			file_queue_error_handler : function(file, errorCode, message) {
+				var errorName = '';
+				switch (errorCode) {
+					case SWFUpload.QUEUE_ERROR.QUEUE_LIMIT_EXCEEDED:
+						errorName = options.queueLimitExceeded;
+						break;
+					case SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT:
+						errorName = options.fileExceedsSizeLimit;
+						break;
+					case SWFUpload.QUEUE_ERROR.ZERO_BYTE_FILE:
+						errorName = options.zeroByteFile;
+						break;
+					case SWFUpload.QUEUE_ERROR.INVALID_FILETYPE:
+						errorName = options.invalidFiletype;
+						break;
+					default:
+						errorName = options.unknownError;
+						break;
+				}
+				K.DEBUG && alert(errorName);
+			},
+			upload_start_handler : function(file) {
+				var self = this;
+				var itemDiv = K('div[data-id="' + file.id + '"]', self.bodyDiv);
+				K('.ke-status > div', itemDiv).hide();
+				K('.ke-progressbar', itemDiv).show();
+			},
+			upload_progress_handler : function(file, bytesLoaded, bytesTotal) {
+				var percent = Math.round(bytesLoaded * 100 / bytesTotal);
+				var progressbar = self.progressbars[file.id];
+				progressbar.bar.css('width', Math.round(percent * 80 / 100) + 'px');
+				progressbar.percent.html(percent + '%');
+			},
+			upload_error_handler : function(file, errorCode, message) {
+				if (file && file.filestatus == SWFUpload.FILE_STATUS.ERROR) {
+					var itemDiv = K('div[data-id="' + file.id + '"]', self.bodyDiv).eq(0);
+					showError(itemDiv, self.options.errorMessage);
+				}
+			},
+			upload_success_handler : function(file, serverData) {
+				var itemDiv = K('div[data-id="' + file.id + '"]', self.bodyDiv).eq(0);
+				var data = {};
+				try {
+					data = K.json(serverData);
+				} catch (e) {
+					self.options.afterError.call(this, '<!doctype html><html>' + serverData + '</html>');
+				}
+				if (data.error !== 0) {
+					showError(itemDiv, K.DEBUG ? data.message : self.options.errorMessage);
+					return;
+				}
+				file.url = data.url;
+				K('.ke-img', itemDiv).attr('src', file.url).attr('data-status', file.filestatus).data('data', data);
+				K('.ke-status > div', itemDiv).hide();
+			}
+		};
+		self.swfu = new SWFUpload(settings);
+
+		K('.ke-swfupload-startupload input', self.div).click(function() {
+			self.swfu.startUpload();
+		});
+	},
+	getUrlList : function() {
+		var list = [];
+		K('.ke-img', self.bodyDiv).each(function() {
+			var img = K(this);
+			var status = img.attr('data-status');
+			if (status == SWFUpload.FILE_STATUS.COMPLETE) {
+				list.push(img.data('data'));
+			}
+		});
+		return list;
+	},
+	removeFile : function(fileId) {
+		var self = this;
+		self.swfu.cancelUpload(fileId);
+		var itemDiv = K('div[data-id="' + fileId + '"]', self.bodyDiv);
+		K('.ke-photo', itemDiv).unbind();
+		K('.ke-delete', itemDiv).unbind();
+		itemDiv.remove();
+	},
+	removeFiles : function() {
+		var self = this;
+		K('.ke-item', self.bodyDiv).each(function() {
+			self.removeFile(K(this).attr('data-id'));
+		});
+	},
+	appendFile : function(file) {
+		var self = this;
+		var itemDiv = K('<div class="ke-inline-block ke-item" data-id="' + file.id + '"></div>');
+		self.bodyDiv.append(itemDiv);
+		var photoDiv = K('<div class="ke-inline-block ke-photo"></div>')
+			.mouseover(function(e) {
+				K(this).addClass('ke-on');
+			})
+			.mouseout(function(e) {
+				K(this).removeClass('ke-on');
+			});
+		itemDiv.append(photoDiv);
+
+		var img = K('<img src="' + file.url + '" class="ke-img" data-status="' + file.filestatus + '" width="80" height="80" alt="' + file.name + '" />');
+		photoDiv.append(img);
+		K('<span class="ke-delete"></span>').appendTo(photoDiv).click(function() {
+			self.removeFile(file.id);
+		});
+		var statusDiv = K('<div class="ke-status"></div>').appendTo(photoDiv);
+		// progressbar
+		K(['<div class="ke-progressbar">',
+			'<div class="ke-progressbar-bar"><div class="ke-progressbar-bar-inner"></div></div>',
+			'<div class="ke-progressbar-percent">0%</div></div>'].join('')).hide().appendTo(statusDiv);
+		// message
+		K('<div class="ke-message">' + self.options.pendingMessage + '</div>').appendTo(statusDiv);
+
+		itemDiv.append('<div class="ke-name">' + file.name + '</div>');
+
+		self.progressbars[file.id] = {
+			bar : K('.ke-progressbar-bar-inner', photoDiv),
+			percent : K('.ke-progressbar-percent', photoDiv)
+		};
+	},
+	remove : function() {
+		this.removeFiles();
+		this.swfu.destroy();
+		this.div.html('');
+	}
+});
+
+K.swfupload = function(element, options) {
+	return new KSWFUpload(element, options);
+};
+
+})(KindEditor);
+
+KindEditor.plugin('multiimage', function(K) {
+	var self = this, name = 'multiimage',
+		formatUploadUrl = K.undef(self.formatUploadUrl, true),
+		uploadJson = K.undef(self.uploadJson, self.basePath + 'php/upload_json.php'),
+		imgPath = self.pluginsPath + 'multiimage/images/',
+		imageSizeLimit = K.undef(self.imageSizeLimit, '1MB'),
+		imageFileTypes = K.undef(self.imageFileTypes, '*.jpg;*.gif;*.png'),
+		imageUploadLimit = K.undef(self.imageUploadLimit, 20),
+		filePostName = K.undef(self.filePostName, 'imgFile'),
+		lang = self.lang(name + '.');
+
+	self.plugin.multiImageDialog = function(options) {
+		var clickFn = options.clickFn,
+			uploadDesc = K.tmpl(lang.uploadDesc, {uploadLimit : imageUploadLimit, sizeLimit : imageSizeLimit});
+		var html = [
+			'<div style="padding:20px;">',
+			'<div class="swfupload">',
+			'</div>',
+			'</div>'
+		].join('');
+		var dialog = self.createDialog({
+			name : name,
+			width : 650,
+			height : 510,
+			title : self.lang(name),
+			body : html,
+			previewBtn : {
+				name : lang.insertAll,
+				click : function(e) {
+					clickFn.call(self, swfupload.getUrlList());
+				}
+			},
+			yesBtn : {
+				name : lang.clearAll,
+				click : function(e) {
+					swfupload.removeFiles();
+				}
+			},
+			beforeRemove : function() {
+				// IE9 bugfix: https://github.com/kindsoft/kindeditor/issues/72
+				if (!K.IE || K.V <= 8) {
+					swfupload.remove();
+				}
+			}
+		}),
+		div = dialog.div;
+
+		var swfupload = K.swfupload({
+			container : K('.swfupload', div),
+			buttonImageUrl : imgPath + (self.langType == 'zh_CN' ? 'select-files-zh_CN.png' : 'select-files-en.png'),
+			buttonWidth : self.langType == 'zh_CN' ? 72 : 88,
+			buttonHeight : 23,
+			fileIconUrl : imgPath + 'image.png',
+			uploadDesc : uploadDesc,
+			startButtonValue : lang.startUpload,
+			uploadUrl : K.addParam(uploadJson, 'dir=image'),
+			flashUrl : imgPath + 'swfupload.swf',
+			filePostName : filePostName,
+			fileTypes : '*.jpg;*.jpeg;*.gif;*.png;*.bmp',
+			fileTypesDesc : 'Image Files',
+			fileUploadLimit : imageUploadLimit,
+			fileSizeLimit : imageSizeLimit,
+			postParams :  K.undef(self.extraFileUploadParams, {}),
+			queueLimitExceeded : lang.queueLimitExceeded,
+			fileExceedsSizeLimit : lang.fileExceedsSizeLimit,
+			zeroByteFile : lang.zeroByteFile,
+			invalidFiletype : lang.invalidFiletype,
+			unknownError : lang.unknownError,
+			pendingMessage : lang.pending,
+			errorMessage : lang.uploadError,
+			afterError : function(html) {
+				self.errorDialog(html);
+			}
+		});
+
+		return dialog;
+	};
+	self.clickToolbar(name, function() {
+		self.plugin.multiImageDialog({
+			clickFn : function (urlList) {
+				if (urlList.length === 0) {
+					return;
+				}
+				K.each(urlList, function(i, data) {
+					if (self.afterUpload) {
+						self.afterUpload.call(self, data.url, data, 'multiimage');
+					}
+					self.exec('insertimage', data.url, data.title, data.width, data.height, data.border, data.align);
+				});
+				// Bugfix: [Firefox] 涓婁紶鍥剧墖鍚庯紝鎬绘槸鍑虹幇姝e湪鍔犺浇鐨勬牱寮忥紝闇�瑕佸欢杩熸墽琛宧ideDialog
+				setTimeout(function() {
+					self.hideDialog().focus();
+				}, 0);
+			}
+		});
+	});
+});
+
+
+/**
+ * SWFUpload: http://www.swfupload.org, http://swfupload.googlecode.com
+ *
+ * mmSWFUpload 1.0: Flash upload dialog - http://profandesign.se/swfupload/,  http://www.vinterwebb.se/
+ *
+ * SWFUpload is (c) 2006-2007 Lars Huring, Olov Nilz闁� and Mammon Media and is released under the MIT License:
+ * http://www.opensource.org/licenses/mit-license.php
+ *
+ * SWFUpload 2 is (c) 2007-2008 Jake Roberts and is released under the MIT License:
+ * http://www.opensource.org/licenses/mit-license.php
+ *
+ */
+
+
+/* ******************* */
+/* Constructor & Init  */
+/* ******************* */
+
+(function() {
+
+if (window.SWFUpload) {
+	return;
+}
+
+window.SWFUpload = function (settings) {
+	this.initSWFUpload(settings);
+};
+
+SWFUpload.prototype.initSWFUpload = function (settings) {
+	try {
+		this.customSettings = {};	// A container where developers can place their own settings associated with this instance.
+		this.settings = settings;
+		this.eventQueue = [];
+		this.movieName = "SWFUpload_" + SWFUpload.movieCount++;
+		this.movieElement = null;
+
+
+		// Setup global control tracking
+		SWFUpload.instances[this.movieName] = this;
+
+		// Load the settings.  Load the Flash movie.
+		this.initSettings();
+		this.loadFlash();
+		this.displayDebugInfo();
+	} catch (ex) {
+		delete SWFUpload.instances[this.movieName];
+		throw ex;
+	}
+};
+
+/* *************** */
+/* Static Members  */
+/* *************** */
+SWFUpload.instances = {};
+SWFUpload.movieCount = 0;
+SWFUpload.version = "2.2.0 2009-03-25";
+SWFUpload.QUEUE_ERROR = {
+	QUEUE_LIMIT_EXCEEDED	  		: -100,
+	FILE_EXCEEDS_SIZE_LIMIT  		: -110,
+	ZERO_BYTE_FILE			  		: -120,
+	INVALID_FILETYPE		  		: -130
+};
+SWFUpload.UPLOAD_ERROR = {
+	HTTP_ERROR				  		: -200,
+	MISSING_UPLOAD_URL	      		: -210,
+	IO_ERROR				  		: -220,
+	SECURITY_ERROR			  		: -230,
+	UPLOAD_LIMIT_EXCEEDED	  		: -240,
+	UPLOAD_FAILED			  		: -250,
+	SPECIFIED_FILE_ID_NOT_FOUND		: -260,
+	FILE_VALIDATION_FAILED	  		: -270,
+	FILE_CANCELLED			  		: -280,
+	UPLOAD_STOPPED					: -290
+};
+SWFUpload.FILE_STATUS = {
+	QUEUED		 : -1,
+	IN_PROGRESS	 : -2,
+	ERROR		 : -3,
+	COMPLETE	 : -4,
+	CANCELLED	 : -5
+};
+SWFUpload.BUTTON_ACTION = {
+	SELECT_FILE  : -100,
+	SELECT_FILES : -110,
+	START_UPLOAD : -120
+};
+SWFUpload.CURSOR = {
+	ARROW : -1,
+	HAND : -2
+};
+SWFUpload.WINDOW_MODE = {
+	WINDOW : "window",
+	TRANSPARENT : "transparent",
+	OPAQUE : "opaque"
+};
+
+// Private: takes a URL, determines if it is relative and converts to an absolute URL
+// using the current site. Only processes the URL if it can, otherwise returns the URL untouched
+SWFUpload.completeURL = function(url) {
+	if (typeof(url) !== "string" || url.match(/^https?:\/\//i) || url.match(/^\//)) {
+		return url;
+	}
+
+	var currentURL = window.location.protocol + "//" + window.location.hostname + (window.location.port ? ":" + window.location.port : "");
+
+	var indexSlash = window.location.pathname.lastIndexOf("/");
+	if (indexSlash <= 0) {
+		path = "/";
+	} else {
+		path = window.location.pathname.substr(0, indexSlash) + "/";
+	}
+
+	return /*currentURL +*/ path + url;
+
+};
+
+
+/* ******************** */
+/* Instance Members  */
+/* ******************** */
+
+// Private: initSettings ensures that all the
+// settings are set, getting a default value if one was not assigned.
+SWFUpload.prototype.initSettings = function () {
+	this.ensureDefault = function (settingName, defaultValue) {
+		this.settings[settingName] = (this.settings[settingName] == undefined) ? defaultValue : this.settings[settingName];
+	};
+
+	// Upload backend settings
+	this.ensureDefault("upload_url", "");
+	this.ensureDefault("preserve_relative_urls", false);
+	this.ensureDefault("file_post_name", "Filedata");
+	this.ensureDefault("post_params", {});
+	this.ensureDefault("use_query_string", false);
+	this.ensureDefault("requeue_on_error", false);
+	this.ensureDefault("http_success", []);
+	this.ensureDefault("assume_success_timeout", 0);
+
+	// File Settings
+	this.ensureDefault("file_types", "*.*");
+	this.ensureDefault("file_types_description", "All Files");
+	this.ensureDefault("file_size_limit", 0);	// Default zero means "unlimited"
+	this.ensureDefault("file_upload_limit", 0);
+	this.ensureDefault("file_queue_limit", 0);
+
+	// Flash Settings
+	this.ensureDefault("flash_url", "swfupload.swf");
+	this.ensureDefault("prevent_swf_caching", true);
+
+	// Button Settings
+	this.ensureDefault("button_image_url", "");
+	this.ensureDefault("button_width", 1);
+	this.ensureDefault("button_height", 1);
+	this.ensureDefault("button_text", "");
+	this.ensureDefault("button_text_style", "color: #000000; font-size: 16pt;");
+	this.ensureDefault("button_text_top_padding", 0);
+	this.ensureDefault("button_text_left_padding", 0);
+	this.ensureDefault("button_action", SWFUpload.BUTTON_ACTION.SELECT_FILES);
+	this.ensureDefault("button_disabled", false);
+	this.ensureDefault("button_placeholder_id", "");
+	this.ensureDefault("button_placeholder", null);
+	this.ensureDefault("button_cursor", SWFUpload.CURSOR.ARROW);
+	this.ensureDefault("button_window_mode", SWFUpload.WINDOW_MODE.WINDOW);
+
+	// Debug Settings
+	this.ensureDefault("debug", false);
+	this.settings.debug_enabled = this.settings.debug;	// Here to maintain v2 API
+
+	// Event Handlers
+	this.settings.return_upload_start_handler = this.returnUploadStart;
+	this.ensureDefault("swfupload_loaded_handler", null);
+	this.ensureDefault("file_dialog_start_handler", null);
+	this.ensureDefault("file_queued_handler", null);
+	this.ensureDefault("file_queue_error_handler", null);
+	this.ensureDefault("file_dialog_complete_handler", null);
+
+	this.ensureDefault("upload_start_handler", null);
+	this.ensureDefault("upload_progress_handler", null);
+	this.ensureDefault("upload_error_handler", null);
+	this.ensureDefault("upload_success_handler", null);
+	this.ensureDefault("upload_complete_handler", null);
+
+	this.ensureDefault("debug_handler", this.debugMessage);
+
+	this.ensureDefault("custom_settings", {});
+
+	// Other settings
+	this.customSettings = this.settings.custom_settings;
+
+	// Update the flash url if needed
+	if (!!this.settings.prevent_swf_caching) {
+		this.settings.flash_url = this.settings.flash_url + (this.settings.flash_url.indexOf("?") < 0 ? "?" : "&") + "preventswfcaching=" + new Date().getTime();
+	}
+
+	if (!this.settings.preserve_relative_urls) {
+		//this.settings.flash_url = SWFUpload.completeURL(this.settings.flash_url);	// Don't need to do this one since flash doesn't look at it
+		this.settings.upload_url = SWFUpload.completeURL(this.settings.upload_url);
+		this.settings.button_image_url = SWFUpload.completeURL(this.settings.button_image_url);
+	}
+
+	delete this.ensureDefault;
+};
+
+// Private: loadFlash replaces the button_placeholder element with the flash movie.
+SWFUpload.prototype.loadFlash = function () {
+	var targetElement, tempParent;
+
+	// Make sure an element with the ID we are going to use doesn't already exist
+	if (document.getElementById(this.movieName) !== null) {
+		throw "ID " + this.movieName + " is already in use. The Flash Object could not be added";
+	}
+
+	// Get the element where we will be placing the flash movie
+	targetElement = document.getElementById(this.settings.button_placeholder_id) || this.settings.button_placeholder;
+
+	if (targetElement == undefined) {
+		throw "Could not find the placeholder element: " + this.settings.button_placeholder_id;
+	}
+
+	// Append the container and load the flash
+	tempParent = document.createElement("div");
+	tempParent.innerHTML = this.getFlashHTML();	// Using innerHTML is non-standard but the only sensible way to dynamically add Flash in IE (and maybe other browsers)
+	targetElement.parentNode.replaceChild(tempParent.firstChild, targetElement);
+
+	// Fix IE Flash/Form bug
+	if (window[this.movieName] == undefined) {
+		window[this.movieName] = this.getMovieElement();
+	}
+
+};
+
+// Private: getFlashHTML generates the object tag needed to embed the flash in to the document
+SWFUpload.prototype.getFlashHTML = function () {
+	// Flash Satay object syntax: http://www.alistapart.com/articles/flashsatay
+	// Fix bug for IE9
+	// http://www.kindsoft.net/view.php?bbsid=7&postid=5825&pagenum=1
+	var classid = '';
+	if (KindEditor.IE && KindEditor.V > 8) {
+		classid = ' classid = "clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"';
+	}
+	return ['<object id="', this.movieName, '"' + classid + ' type="application/x-shockwave-flash" data="', this.settings.flash_url, '" width="', this.settings.button_width, '" height="', this.settings.button_height, '" class="swfupload">',
+				'<param name="wmode" value="', this.settings.button_window_mode, '" />',
+				'<param name="movie" value="', this.settings.flash_url, '" />',
+				'<param name="quality" value="high" />',
+				'<param name="menu" value="false" />',
+				'<param name="allowScriptAccess" value="always" />',
+				'<param name="flashvars" value="' + this.getFlashVars() + '" />',
+				'</object>'].join("");
+};
+
+// Private: getFlashVars builds the parameter string that will be passed
+// to flash in the flashvars param.
+SWFUpload.prototype.getFlashVars = function () {
+	// Build a string from the post param object
+	var paramString = this.buildParamString();
+	var httpSuccessString = this.settings.http_success.join(",");
+
+	// Build the parameter string
+	return ["movieName=", encodeURIComponent(this.movieName),
+			"&amp;uploadURL=", encodeURIComponent(this.settings.upload_url),
+			"&amp;useQueryString=", encodeURIComponent(this.settings.use_query_string),
+			"&amp;requeueOnError=", encodeURIComponent(this.settings.requeue_on_error),
+			"&amp;httpSuccess=", encodeURIComponent(httpSuccessString),
+			"&amp;assumeSuccessTimeout=", encodeURIComponent(this.settings.assume_success_timeout),
+			"&amp;params=", encodeURIComponent(paramString),
+			"&amp;filePostName=", encodeURIComponent(this.settings.file_post_name),
+			"&amp;fileTypes=", encodeURIComponent(this.settings.file_types),
+			"&amp;fileTypesDescription=", encodeURIComponent(this.settings.file_types_description),
+			"&amp;fileSizeLimit=", encodeURIComponent(this.settings.file_size_limit),
+			"&amp;fileUploadLimit=", encodeURIComponent(this.settings.file_upload_limit),
+			"&amp;fileQueueLimit=", encodeURIComponent(this.settings.file_queue_limit),
+			"&amp;debugEnabled=", encodeURIComponent(this.settings.debug_enabled),
+			"&amp;buttonImageURL=", encodeURIComponent(this.settings.button_image_url),
+			"&amp;buttonWidth=", encodeURIComponent(this.settings.button_width),
+			"&amp;buttonHeight=", encodeURIComponent(this.settings.button_height),
+			"&amp;buttonText=", encodeURIComponent(this.settings.button_text),
+			"&amp;buttonTextTopPadding=", encodeURIComponent(this.settings.button_text_top_padding),
+			"&amp;buttonTextLeftPadding=", encodeURIComponent(this.settings.button_text_left_padding),
+			"&amp;buttonTextStyle=", encodeURIComponent(this.settings.button_text_style),
+			"&amp;buttonAction=", encodeURIComponent(this.settings.button_action),
+			"&amp;buttonDisabled=", encodeURIComponent(this.settings.button_disabled),
+			"&amp;buttonCursor=", encodeURIComponent(this.settings.button_cursor)
+		].join("");
+};
+
+// Public: getMovieElement retrieves the DOM reference to the Flash element added by SWFUpload
+// The element is cached after the first lookup
+SWFUpload.prototype.getMovieElement = function () {
+	if (this.movieElement == undefined) {
+		this.movieElement = document.getElementById(this.movieName);
+	}
+
+	if (this.movieElement === null) {
+		throw "Could not find Flash element";
+	}
+
+	return this.movieElement;
+};
+
+// Private: buildParamString takes the name/value pairs in the post_params setting object
+// and joins them up in to a string formatted "name=value&amp;name=value"
+SWFUpload.prototype.buildParamString = function () {
+	var postParams = this.settings.post_params;
+	var paramStringPairs = [];
+
+	if (typeof(postParams) === "object") {
+		for (var name in postParams) {
+			if (postParams.hasOwnProperty(name)) {
+				paramStringPairs.push(encodeURIComponent(name.toString()) + "=" + encodeURIComponent(postParams[name].toString()));
+			}
+		}
+	}
+
+	return paramStringPairs.join("&amp;");
+};
+
+// Public: Used to remove a SWFUpload instance from the page. This method strives to remove
+// all references to the SWF, and other objects so memory is properly freed.
+// Returns true if everything was destroyed. Returns a false if a failure occurs leaving SWFUpload in an inconsistant state.
+// Credits: Major improvements provided by steffen
+SWFUpload.prototype.destroy = function () {
+	try {
+		// Make sure Flash is done before we try to remove it
+		this.cancelUpload(null, false);
+
+
+		// Remove the SWFUpload DOM nodes
+		var movieElement = null;
+		movieElement = this.getMovieElement();
+
+		if (movieElement && typeof(movieElement.CallFunction) === "unknown") { // We only want to do this in IE
+			// Loop through all the movie's properties and remove all function references (DOM/JS IE 6/7 memory leak workaround)
+			for (var i in movieElement) {
+				try {
+					if (typeof(movieElement[i]) === "function") {
+						movieElement[i] = null;
+					}
+				} catch (ex1) {}
+			}
+
+			// Remove the Movie Element from the page
+			try {
+				movieElement.parentNode.removeChild(movieElement);
+			} catch (ex) {}
+		}
+
+		// Remove IE form fix reference
+		window[this.movieName] = null;
+
+		// Destroy other references
+		SWFUpload.instances[this.movieName] = null;
+		delete SWFUpload.instances[this.movieName];
+
+		this.movieElement = null;
+		this.settings = null;
+		this.customSettings = null;
+		this.eventQueue = null;
+		this.movieName = null;
+
+
+		return true;
+	} catch (ex2) {
+		return false;
+	}
+};
+
+
+// Public: displayDebugInfo prints out settings and configuration
+// information about this SWFUpload instance.
+// This function (and any references to it) can be deleted when placing
+// SWFUpload in production.
+SWFUpload.prototype.displayDebugInfo = function () {
+	this.debug(
+		[
+			"---SWFUpload Instance Info---\n",
+			"Version: ", SWFUpload.version, "\n",
+			"Movie Name: ", this.movieName, "\n",
+			"Settings:\n",
+			"\t", "upload_url:               ", this.settings.upload_url, "\n",
+			"\t", "flash_url:                ", this.settings.flash_url, "\n",
+			"\t", "use_query_string:         ", this.settings.use_query_string.toString(), "\n",
+			"\t", "requeue_on_error:         ", this.settings.requeue_on_error.toString(), "\n",
+			"\t", "http_success:             ", this.settings.http_success.join(", "), "\n",
+			"\t", "assume_success_timeout:   ", this.settings.assume_success_timeout, "\n",
+			"\t", "file_post_name:           ", this.settings.file_post_name, "\n",
+			"\t", "post_params:              ", this.settings.post_params.toString(), "\n",
+			"\t", "file_types:               ", this.settings.file_types, "\n",
+			"\t", "file_types_description:   ", this.settings.file_types_description, "\n",
+			"\t", "file_size_limit:          ", this.settings.file_size_limit, "\n",
+			"\t", "file_upload_limit:        ", this.settings.file_upload_limit, "\n",
+			"\t", "file_queue_limit:         ", this.settings.file_queue_limit, "\n",
+			"\t", "debug:                    ", this.settings.debug.toString(), "\n",
+
+			"\t", "prevent_swf_caching:      ", this.settings.prevent_swf_caching.toString(), "\n",
+
+			"\t", "button_placeholder_id:    ", this.settings.button_placeholder_id.toString(), "\n",
+			"\t", "button_placeholder:       ", (this.settings.button_placeholder ? "Set" : "Not Set"), "\n",
+			"\t", "button_image_url:         ", this.settings.button_image_url.toString(), "\n",
+			"\t", "button_width:             ", this.settings.button_width.toString(), "\n",
+			"\t", "button_height:            ", this.settings.button_height.toString(), "\n",
+			"\t", "button_text:              ", this.settings.button_text.toString(), "\n",
+			"\t", "button_text_style:        ", this.settings.button_text_style.toString(), "\n",
+			"\t", "button_text_top_padding:  ", this.settings.button_text_top_padding.toString(), "\n",
+			"\t", "button_text_left_padding: ", this.settings.button_text_left_padding.toString(), "\n",
+			"\t", "button_action:            ", this.settings.button_action.toString(), "\n",
+			"\t", "button_disabled:          ", this.settings.button_disabled.toString(), "\n",
+
+			"\t", "custom_settings:          ", this.settings.custom_settings.toString(), "\n",
+			"Event Handlers:\n",
+			"\t", "swfupload_loaded_handler assigned:  ", (typeof this.settings.swfupload_loaded_handler === "function").toString(), "\n",
+			"\t", "file_dialog_start_handler assigned: ", (typeof this.settings.file_dialog_start_handler === "function").toString(), "\n",
+			"\t", "file_queued_handler assigned:       ", (typeof this.settings.file_queued_handler === "function").toString(), "\n",
+			"\t", "file_queue_error_handler assigned:  ", (typeof this.settings.file_queue_error_handler === "function").toString(), "\n",
+			"\t", "upload_start_handler assigned:      ", (typeof this.settings.upload_start_handler === "function").toString(), "\n",
+			"\t", "upload_progress_handler assigned:   ", (typeof this.settings.upload_progress_handler === "function").toString(), "\n",
+			"\t", "upload_error_handler assigned:      ", (typeof this.settings.upload_error_handler === "function").toString(), "\n",
+			"\t", "upload_success_handler assigned:    ", (typeof this.settings.upload_success_handler === "function").toString(), "\n",
+			"\t", "upload_complete_handler assigned:   ", (typeof this.settings.upload_complete_handler === "function").toString(), "\n",
+			"\t", "debug_handler assigned:             ", (typeof this.settings.debug_handler === "function").toString(), "\n"
+		].join("")
+	);
+};
+
+/* Note: addSetting and getSetting are no longer used by SWFUpload but are included
+	the maintain v2 API compatibility
+*/
+// Public: (Deprecated) addSetting adds a setting value. If the value given is undefined or null then the default_value is used.
+SWFUpload.prototype.addSetting = function (name, value, default_value) {
+    if (value == undefined) {
+        return (this.settings[name] = default_value);
+    } else {
+        return (this.settings[name] = value);
+	}
+};
+
+// Public: (Deprecated) getSetting gets a setting. Returns an empty string if the setting was not found.
+SWFUpload.prototype.getSetting = function (name) {
+    if (this.settings[name] != undefined) {
+        return this.settings[name];
+	}
+
+    return "";
+};
+
+
+
+// Private: callFlash handles function calls made to the Flash element.
+// Calls are made with a setTimeout for some functions to work around
+// bugs in the ExternalInterface library.
+SWFUpload.prototype.callFlash = function (functionName, argumentArray) {
+	argumentArray = argumentArray || [];
+
+	var movieElement = this.getMovieElement();
+	var returnValue, returnString;
+
+	// Flash's method if calling ExternalInterface methods (code adapted from MooTools).
+	try {
+		returnString = movieElement.CallFunction('<invoke name="' + functionName + '" returntype="javascript">' + __flash__argumentsToXML(argumentArray, 0) + '</invoke>');
+		returnValue = eval(returnString);
+	} catch (ex) {
+		throw "Call to " + functionName + " failed";
+	}
+
+	// Unescape file post param values
+	if (returnValue != undefined && typeof returnValue.post === "object") {
+		returnValue = this.unescapeFilePostParams(returnValue);
+	}
+
+	return returnValue;
+};
+
+/* *****************************
+	-- Flash control methods --
+	Your UI should use these
+	to operate SWFUpload
+   ***************************** */
+
+// WARNING: this function does not work in Flash Player 10
+// Public: selectFile causes a File Selection Dialog window to appear.  This
+// dialog only allows 1 file to be selected.
+SWFUpload.prototype.selectFile = function () {
+	this.callFlash("SelectFile");
+};
+
+// WARNING: this function does not work in Flash Player 10
+// Public: selectFiles causes a File Selection Dialog window to appear/ This
+// dialog allows the user to select any number of files
+// Flash Bug Warning: Flash limits the number of selectable files based on the combined length of the file names.
+// If the selection name length is too long the dialog will fail in an unpredictable manner.  There is no work-around
+// for this bug.
+SWFUpload.prototype.selectFiles = function () {
+	this.callFlash("SelectFiles");
+};
+
+
+// Public: startUpload starts uploading the first file in the queue unless
+// the optional parameter 'fileID' specifies the ID
+SWFUpload.prototype.startUpload = function (fileID) {
+	this.callFlash("StartUpload", [fileID]);
+};
+
+// Public: cancelUpload cancels any queued file.  The fileID parameter may be the file ID or index.
+// If you do not specify a fileID the current uploading file or first file in the queue is cancelled.
+// If you do not want the uploadError event to trigger you can specify false for the triggerErrorEvent parameter.
+SWFUpload.prototype.cancelUpload = function (fileID, triggerErrorEvent) {
+	if (triggerErrorEvent !== false) {
+		triggerErrorEvent = true;
+	}
+	this.callFlash("CancelUpload", [fileID, triggerErrorEvent]);
+};
+
+// Public: stopUpload stops the current upload and requeues the file at the beginning of the queue.
+// If nothing is currently uploading then nothing happens.
+SWFUpload.prototype.stopUpload = function () {
+	this.callFlash("StopUpload");
+};
+
+/* ************************
+ * Settings methods
+ *   These methods change the SWFUpload settings.
+ *   SWFUpload settings should not be changed directly on the settings object
+ *   since many of the settings need to be passed to Flash in order to take
+ *   effect.
+ * *********************** */
+
+// Public: getStats gets the file statistics object.
+SWFUpload.prototype.getStats = function () {
+	return this.callFlash("GetStats");
+};
+
+// Public: setStats changes the SWFUpload statistics.  You shouldn't need to
+// change the statistics but you can.  Changing the statistics does not
+// affect SWFUpload accept for the successful_uploads count which is used
+// by the upload_limit setting to determine how many files the user may upload.
+SWFUpload.prototype.setStats = function (statsObject) {
+	this.callFlash("SetStats", [statsObject]);
+};
+
+// Public: getFile retrieves a File object by ID or Index.  If the file is
+// not found then 'null' is returned.
+SWFUpload.prototype.getFile = function (fileID) {
+	if (typeof(fileID) === "number") {
+		return this.callFlash("GetFileByIndex", [fileID]);
+	} else {
+		return this.callFlash("GetFile", [fileID]);
+	}
+};
+
+// Public: addFileParam sets a name/value pair that will be posted with the
+// file specified by the Files ID.  If the name already exists then the
+// exiting value will be overwritten.
+SWFUpload.prototype.addFileParam = function (fileID, name, value) {
+	return this.callFlash("AddFileParam", [fileID, name, value]);
+};
+
+// Public: removeFileParam removes a previously set (by addFileParam) name/value
+// pair from the specified file.
+SWFUpload.prototype.removeFileParam = function (fileID, name) {
+	this.callFlash("RemoveFileParam", [fileID, name]);
+};
+
+// Public: setUploadUrl changes the upload_url setting.
+SWFUpload.prototype.setUploadURL = function (url) {
+	this.settings.upload_url = url.toString();
+	this.callFlash("SetUploadURL", [url]);
+};
+
+// Public: setPostParams changes the post_params setting
+SWFUpload.prototype.setPostParams = function (paramsObject) {
+	this.settings.post_params = paramsObject;
+	this.callFlash("SetPostParams", [paramsObject]);
+};
+
+// Public: addPostParam adds post name/value pair.  Each name can have only one value.
+SWFUpload.prototype.addPostParam = function (name, value) {
+	this.settings.post_params[name] = value;
+	this.callFlash("SetPostParams", [this.settings.post_params]);
+};
+
+// Public: removePostParam deletes post name/value pair.
+SWFUpload.prototype.removePostParam = function (name) {
+	delete this.settings.post_params[name];
+	this.callFlash("SetPostParams", [this.settings.post_params]);
+};
+
+// Public: setFileTypes changes the file_types setting and the file_types_description setting
+SWFUpload.prototype.setFileTypes = function (types, description) {
+	this.settings.file_types = types;
+	this.settings.file_types_description = description;
+	this.callFlash("SetFileTypes", [types, description]);
+};
+
+// Public: setFileSizeLimit changes the file_size_limit setting
+SWFUpload.prototype.setFileSizeLimit = function (fileSizeLimit) {
+	this.settings.file_size_limit = fileSizeLimit;
+	this.callFlash("SetFileSizeLimit", [fileSizeLimit]);
+};
+
+// Public: setFileUploadLimit changes the file_upload_limit setting
+SWFUpload.prototype.setFileUploadLimit = function (fileUploadLimit) {
+	this.settings.file_upload_limit = fileUploadLimit;
+	this.callFlash("SetFileUploadLimit", [fileUploadLimit]);
+};
+
+// Public: setFileQueueLimit changes the file_queue_limit setting
+SWFUpload.prototype.setFileQueueLimit = function (fileQueueLimit) {
+	this.settings.file_queue_limit = fileQueueLimit;
+	this.callFlash("SetFileQueueLimit", [fileQueueLimit]);
+};
+
+// Public: setFilePostName changes the file_post_name setting
+SWFUpload.prototype.setFilePostName = function (filePostName) {
+	this.settings.file_post_name = filePostName;
+	this.callFlash("SetFilePostName", [filePostName]);
+};
+
+// Public: setUseQueryString changes the use_query_string setting
+SWFUpload.prototype.setUseQueryString = function (useQueryString) {
+	this.settings.use_query_string = useQueryString;
+	this.callFlash("SetUseQueryString", [useQueryString]);
+};
+
+// Public: setRequeueOnError changes the requeue_on_error setting
+SWFUpload.prototype.setRequeueOnError = function (requeueOnError) {
+	this.settings.requeue_on_error = requeueOnError;
+	this.callFlash("SetRequeueOnError", [requeueOnError]);
+};
+
+// Public: setHTTPSuccess changes the http_success setting
+SWFUpload.prototype.setHTTPSuccess = function (http_status_codes) {
+	if (typeof http_status_codes === "string") {
+		http_status_codes = http_status_codes.replace(" ", "").split(",");
+	}
+
+	this.settings.http_success = http_status_codes;
+	this.callFlash("SetHTTPSuccess", [http_status_codes]);
+};
+
+// Public: setHTTPSuccess changes the http_success setting
+SWFUpload.prototype.setAssumeSuccessTimeout = function (timeout_seconds) {
+	this.settings.assume_success_timeout = timeout_seconds;
+	this.callFlash("SetAssumeSuccessTimeout", [timeout_seconds]);
+};
+
+// Public: setDebugEnabled changes the debug_enabled setting
+SWFUpload.prototype.setDebugEnabled = function (debugEnabled) {
+	this.settings.debug_enabled = debugEnabled;
+	this.callFlash("SetDebugEnabled", [debugEnabled]);
+};
+
+// Public: setButtonImageURL loads a button image sprite
+SWFUpload.prototype.setButtonImageURL = function (buttonImageURL) {
+	if (buttonImageURL == undefined) {
+		buttonImageURL = "";
+	}
+
+	this.settings.button_image_url = buttonImageURL;
+	this.callFlash("SetButtonImageURL", [buttonImageURL]);
+};
+
+// Public: setButtonDimensions resizes the Flash Movie and button
+SWFUpload.prototype.setButtonDimensions = function (width, height) {
+	this.settings.button_width = width;
+	this.settings.button_height = height;
+
+	var movie = this.getMovieElement();
+	if (movie != undefined) {
+		movie.style.width = width + "px";
+		movie.style.height = height + "px";
+	}
+
+	this.callFlash("SetButtonDimensions", [width, height]);
+};
+// Public: setButtonText Changes the text overlaid on the button
+SWFUpload.prototype.setButtonText = function (html) {
+	this.settings.button_text = html;
+	this.callFlash("SetButtonText", [html]);
+};
+// Public: setButtonTextPadding changes the top and left padding of the text overlay
+SWFUpload.prototype.setButtonTextPadding = function (left, top) {
+	this.settings.button_text_top_padding = top;
+	this.settings.button_text_left_padding = left;
+	this.callFlash("SetButtonTextPadding", [left, top]);
+};
+
+// Public: setButtonTextStyle changes the CSS used to style the HTML/Text overlaid on the button
+SWFUpload.prototype.setButtonTextStyle = function (css) {
+	this.settings.button_text_style = css;
+	this.callFlash("SetButtonTextStyle", [css]);
+};
+// Public: setButtonDisabled disables/enables the button
+SWFUpload.prototype.setButtonDisabled = function (isDisabled) {
+	this.settings.button_disabled = isDisabled;
+	this.callFlash("SetButtonDisabled", [isDisabled]);
+};
+// Public: setButtonAction sets the action that occurs when the button is clicked
+SWFUpload.prototype.setButtonAction = function (buttonAction) {
+	this.settings.button_action = buttonAction;
+	this.callFlash("SetButtonAction", [buttonAction]);
+};
+
+// Public: setButtonCursor changes the mouse cursor displayed when hovering over the button
+SWFUpload.prototype.setButtonCursor = function (cursor) {
+	this.settings.button_cursor = cursor;
+	this.callFlash("SetButtonCursor", [cursor]);
+};
+
+/* *******************************
+	Flash Event Interfaces
+	These functions are used by Flash to trigger the various
+	events.
+
+	All these functions a Private.
+
+	Because the ExternalInterface library is buggy the event calls
+	are added to a queue and the queue then executed by a setTimeout.
+	This ensures that events are executed in a determinate order and that
+	the ExternalInterface bugs are avoided.
+******************************* */
+
+SWFUpload.prototype.queueEvent = function (handlerName, argumentArray) {
+	// Warning: Don't call this.debug inside here or you'll create an infinite loop
+
+	if (argumentArray == undefined) {
+		argumentArray = [];
+	} else if (!(argumentArray instanceof Array)) {
+		argumentArray = [argumentArray];
+	}
+
+	var self = this;
+	if (typeof this.settings[handlerName] === "function") {
+		// Queue the event
+		this.eventQueue.push(function () {
+			this.settings[handlerName].apply(this, argumentArray);
+		});
+
+		// Execute the next queued event
+		setTimeout(function () {
+			self.executeNextEvent();
+		}, 0);
+
+	} else if (this.settings[handlerName] !== null) {
+		throw "Event handler " + handlerName + " is unknown or is not a function";
+	}
+};
+
+// Private: Causes the next event in the queue to be executed.  Since events are queued using a setTimeout
+// we must queue them in order to garentee that they are executed in order.
+SWFUpload.prototype.executeNextEvent = function () {
+	// Warning: Don't call this.debug inside here or you'll create an infinite loop
+
+	var  f = this.eventQueue ? this.eventQueue.shift() : null;
+	if (typeof(f) === "function") {
+		f.apply(this);
+	}
+};
+
+// Private: unescapeFileParams is part of a workaround for a flash bug where objects passed through ExternalInterface cannot have
+// properties that contain characters that are not valid for JavaScript identifiers. To work around this
+// the Flash Component escapes the parameter names and we must unescape again before passing them along.
+SWFUpload.prototype.unescapeFilePostParams = function (file) {
+	var reg = /[$]([0-9a-f]{4})/i;
+	var unescapedPost = {};
+	var uk;
+
+	if (file != undefined) {
+		for (var k in file.post) {
+			if (file.post.hasOwnProperty(k)) {
+				uk = k;
+				var match;
+				while ((match = reg.exec(uk)) !== null) {
+					uk = uk.replace(match[0], String.fromCharCode(parseInt("0x" + match[1], 16)));
+				}
+				unescapedPost[uk] = file.post[k];
+			}
+		}
+
+		file.post = unescapedPost;
+	}
+
+	return file;
+};
+
+// Private: Called by Flash to see if JS can call in to Flash (test if External Interface is working)
+SWFUpload.prototype.testExternalInterface = function () {
+	try {
+		return this.callFlash("TestExternalInterface");
+	} catch (ex) {
+		return false;
+	}
+};
+
+// Private: This event is called by Flash when it has finished loading. Don't modify this.
+// Use the swfupload_loaded_handler event setting to execute custom code when SWFUpload has loaded.
+SWFUpload.prototype.flashReady = function () {
+	// Check that the movie element is loaded correctly with its ExternalInterface methods defined
+	var movieElement = this.getMovieElement();
+
+	if (!movieElement) {
+		this.debug("Flash called back ready but the flash movie can't be found.");
+		return;
+	}
+
+	this.cleanUp(movieElement);
+
+	this.queueEvent("swfupload_loaded_handler");
+};
+
+// Private: removes Flash added fuctions to the DOM node to prevent memory leaks in IE.
+// This function is called by Flash each time the ExternalInterface functions are created.
+SWFUpload.prototype.cleanUp = function (movieElement) {
+	// Pro-actively unhook all the Flash functions
+	try {
+		if (this.movieElement && typeof(movieElement.CallFunction) === "unknown") { // We only want to do this in IE
+			this.debug("Removing Flash functions hooks (this should only run in IE and should prevent memory leaks)");
+			for (var key in movieElement) {
+				try {
+					if (typeof(movieElement[key]) === "function") {
+						movieElement[key] = null;
+					}
+				} catch (ex) {
+				}
+			}
+		}
+	} catch (ex1) {
+
+	}
+
+	// Fix Flashes own cleanup code so if the SWFMovie was removed from the page
+	// it doesn't display errors.
+	window["__flash__removeCallback"] = function (instance, name) {
+		try {
+			if (instance) {
+				instance[name] = null;
+			}
+		} catch (flashEx) {
+
+		}
+	};
+
+};
+
+
+/* This is a chance to do something before the browse window opens */
+SWFUpload.prototype.fileDialogStart = function () {
+	this.queueEvent("file_dialog_start_handler");
+};
+
+
+/* Called when a file is successfully added to the queue. */
+SWFUpload.prototype.fileQueued = function (file) {
+	file = this.unescapeFilePostParams(file);
+	this.queueEvent("file_queued_handler", file);
+};
+
+
+/* Handle errors that occur when an attempt to queue a file fails. */
+SWFUpload.prototype.fileQueueError = function (file, errorCode, message) {
+	file = this.unescapeFilePostParams(file);
+	this.queueEvent("file_queue_error_handler", [file, errorCode, message]);
+};
+
+/* Called after the file dialog has closed and the selected files have been queued.
+	You could call startUpload here if you want the queued files to begin uploading immediately. */
+SWFUpload.prototype.fileDialogComplete = function (numFilesSelected, numFilesQueued, numFilesInQueue) {
+	this.queueEvent("file_dialog_complete_handler", [numFilesSelected, numFilesQueued, numFilesInQueue]);
+};
+
+SWFUpload.prototype.uploadStart = function (file) {
+	file = this.unescapeFilePostParams(file);
+	this.queueEvent("return_upload_start_handler", file);
+};
+
+SWFUpload.prototype.returnUploadStart = function (file) {
+	var returnValue;
+	if (typeof this.settings.upload_start_handler === "function") {
+		file = this.unescapeFilePostParams(file);
+		returnValue = this.settings.upload_start_handler.call(this, file);
+	} else if (this.settings.upload_start_handler != undefined) {
+		throw "upload_start_handler must be a function";
+	}
+
+	// Convert undefined to true so if nothing is returned from the upload_start_handler it is
+	// interpretted as 'true'.
+	if (returnValue === undefined) {
+		returnValue = true;
+	}
+
+	returnValue = !!returnValue;
+
+	this.callFlash("ReturnUploadStart", [returnValue]);
+};
+
+
+
+SWFUpload.prototype.uploadProgress = function (file, bytesComplete, bytesTotal) {
+	file = this.unescapeFilePostParams(file);
+	this.queueEvent("upload_progress_handler", [file, bytesComplete, bytesTotal]);
+};
+
+SWFUpload.prototype.uploadError = function (file, errorCode, message) {
+	file = this.unescapeFilePostParams(file);
+	this.queueEvent("upload_error_handler", [file, errorCode, message]);
+};
+
+SWFUpload.prototype.uploadSuccess = function (file, serverData, responseReceived) {
+	file = this.unescapeFilePostParams(file);
+	this.queueEvent("upload_success_handler", [file, serverData, responseReceived]);
+};
+
+SWFUpload.prototype.uploadComplete = function (file) {
+	file = this.unescapeFilePostParams(file);
+	this.queueEvent("upload_complete_handler", file);
+};
+
+/* Called by SWFUpload JavaScript and Flash functions when debug is enabled. By default it writes messages to the
+   internal debug console.  You can override this event and have messages written where you want. */
+SWFUpload.prototype.debug = function (message) {
+	this.queueEvent("debug_handler", message);
+};
+
+
+/* **********************************
+	Debug Console
+	The debug console is a self contained, in page location
+	for debug message to be sent.  The Debug Console adds
+	itself to the body if necessary.
+
+	The console is automatically scrolled as messages appear.
+
+	If you are using your own debug handler or when you deploy to production and
+	have debug disabled you can remove these functions to reduce the file size
+	and complexity.
+********************************** */
+
+// Private: debugMessage is the default debug_handler.  If you want to print debug messages
+// call the debug() function.  When overriding the function your own function should
+// check to see if the debug setting is true before outputting debug information.
+SWFUpload.prototype.debugMessage = function (message) {
+	if (this.settings.debug) {
+		var exceptionMessage, exceptionValues = [];
+
+		// Check for an exception object and print it nicely
+		if (typeof message === "object" && typeof message.name === "string" && typeof message.message === "string") {
+			for (var key in message) {
+				if (message.hasOwnProperty(key)) {
+					exceptionValues.push(key + ": " + message[key]);
+				}
+			}
+			exceptionMessage = exceptionValues.join("\n") || "";
+			exceptionValues = exceptionMessage.split("\n");
+			exceptionMessage = "EXCEPTION: " + exceptionValues.join("\nEXCEPTION: ");
+			SWFUpload.Console.writeLine(exceptionMessage);
+		} else {
+			SWFUpload.Console.writeLine(message);
+		}
+	}
+};
+
+SWFUpload.Console = {};
+SWFUpload.Console.writeLine = function (message) {
+	var console, documentForm;
+
+	try {
+		console = document.getElementById("SWFUpload_Console");
+
+		if (!console) {
+			documentForm = document.createElement("form");
+			document.getElementsByTagName("body")[0].appendChild(documentForm);
+
+			console = document.createElement("textarea");
+			console.id = "SWFUpload_Console";
+			console.style.fontFamily = "monospace";
+			console.setAttribute("wrap", "off");
+			console.wrap = "off";
+			console.style.overflow = "auto";
+			console.style.width = "700px";
+			console.style.height = "350px";
+			console.style.margin = "5px";
+			documentForm.appendChild(console);
+		}
+
+		console.value += message + "\n";
+
+		console.scrollTop = console.scrollHeight - console.clientHeight;
+	} catch (ex) {
+		alert("Exception: " + ex.name + " Message: " + ex.message);
+	}
+};
+
+})();
+
+(function() {
+/*
+	Queue Plug-in
+
+	Features:
+		*Adds a cancelQueue() method for cancelling the entire queue.
+		*All queued files are uploaded when startUpload() is called.
+		*If false is returned from uploadComplete then the queue upload is stopped.
+		 If false is not returned (strict comparison) then the queue upload is continued.
+		*Adds a QueueComplete event that is fired when all the queued files have finished uploading.
+		 Set the event handler with the queue_complete_handler setting.
+
+	*/
+
+if (typeof(SWFUpload) === "function") {
+	SWFUpload.queue = {};
+
+	SWFUpload.prototype.initSettings = (function (oldInitSettings) {
+		return function () {
+			if (typeof(oldInitSettings) === "function") {
+				oldInitSettings.call(this);
+			}
+
+			this.queueSettings = {};
+
+			this.queueSettings.queue_cancelled_flag = false;
+			this.queueSettings.queue_upload_count = 0;
+
+			this.queueSettings.user_upload_complete_handler = this.settings.upload_complete_handler;
+			this.queueSettings.user_upload_start_handler = this.settings.upload_start_handler;
+			this.settings.upload_complete_handler = SWFUpload.queue.uploadCompleteHandler;
+			this.settings.upload_start_handler = SWFUpload.queue.uploadStartHandler;
+
+			this.settings.queue_complete_handler = this.settings.queue_complete_handler || null;
+		};
+	})(SWFUpload.prototype.initSettings);
+
+	SWFUpload.prototype.startUpload = function (fileID) {
+		this.queueSettings.queue_cancelled_flag = false;
+		this.callFlash("StartUpload", [fileID]);
+	};
+
+	SWFUpload.prototype.cancelQueue = function () {
+		this.queueSettings.queue_cancelled_flag = true;
+		this.stopUpload();
+
+		var stats = this.getStats();
+		while (stats.files_queued > 0) {
+			this.cancelUpload();
+			stats = this.getStats();
+		}
+	};
+
+	SWFUpload.queue.uploadStartHandler = function (file) {
+		var returnValue;
+		if (typeof(this.queueSettings.user_upload_start_handler) === "function") {
+			returnValue = this.queueSettings.user_upload_start_handler.call(this, file);
+		}
+
+		// To prevent upload a real "FALSE" value must be returned, otherwise default to a real "TRUE" value.
+		returnValue = (returnValue === false) ? false : true;
+
+		this.queueSettings.queue_cancelled_flag = !returnValue;
+
+		return returnValue;
+	};
+
+	SWFUpload.queue.uploadCompleteHandler = function (file) {
+		var user_upload_complete_handler = this.queueSettings.user_upload_complete_handler;
+		var continueUpload;
+
+		if (file.filestatus === SWFUpload.FILE_STATUS.COMPLETE) {
+			this.queueSettings.queue_upload_count++;
+		}
+
+		if (typeof(user_upload_complete_handler) === "function") {
+			continueUpload = (user_upload_complete_handler.call(this, file) === false) ? false : true;
+		} else if (file.filestatus === SWFUpload.FILE_STATUS.QUEUED) {
+			// If the file was stopped and re-queued don't restart the upload
+			continueUpload = false;
+		} else {
+			continueUpload = true;
+		}
+
+		if (continueUpload) {
+			var stats = this.getStats();
+			if (stats.files_queued > 0 && this.queueSettings.queue_cancelled_flag === false) {
+				this.startUpload();
+			} else if (this.queueSettings.queue_cancelled_flag === false) {
+				this.queueEvent("queue_complete_handler", [this.queueSettings.queue_upload_count]);
+				this.queueSettings.queue_upload_count = 0;
+			} else {
+				this.queueSettings.queue_cancelled_flag = false;
+				this.queueSettings.queue_upload_count = 0;
+			}
+		}
+	};
+}
+
+})();
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/pagebreak/pagebreak.js b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/pagebreak/pagebreak.js
new file mode 100644
index 0000000..a594eb2
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/pagebreak/pagebreak.js
@@ -0,0 +1,29 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('pagebreak', function(K) {
+	var self = this;
+	var name = 'pagebreak';
+	var pagebreakHtml = K.undef(self.pagebreakHtml, '<hr style="page-break-after: always;" class="ke-pagebreak" />');
+
+	self.clickToolbar(name, function() {
+		var cmd = self.cmd, range = cmd.range;
+		self.focus();
+		range.enlarge(true);
+		cmd.split(true);
+		var tail = self.newlineTag == 'br' || K.WEBKIT ? '' : '<p id="__kindeditor_tail_tag__"></p>';
+		self.insertHtml(pagebreakHtml + tail);
+		if (tail !== '') {
+			var p = K('#__kindeditor_tail_tag__', self.edit.doc);
+			range.selectNodeContents(p[0]);
+			p.removeAttr('id');
+			cmd.select();
+		}
+	});
+});
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/plainpaste/plainpaste.js b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/plainpaste/plainpaste.js
new file mode 100644
index 0000000..8f7bed8
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/plainpaste/plainpaste.js
@@ -0,0 +1,41 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('plainpaste', function(K) {
+	var self = this, name = 'plainpaste';
+	self.clickToolbar(name, function() {
+		var lang = self.lang(name + '.'),
+			html = '<div style="padding:10px 20px;">' +
+				'<div style="margin-bottom:10px;">' + lang.comment + '</div>' +
+				'<textarea class="ke-textarea" style="width:408px;height:260px;"></textarea>' +
+				'</div>',
+			dialog = self.createDialog({
+				name : name,
+				width : 450,
+				title : self.lang(name),
+				body : html,
+				yesBtn : {
+					name : self.lang('yes'),
+					click : function(e) {
+						var html = textarea.val();
+						html = K.escape(html);
+						html = html.replace(/ {2}/g, ' &nbsp;');
+						if (self.newlineTag == 'p') {
+							html = html.replace(/^/, '<p>').replace(/$/, '</p>').replace(/\n/g, '</p><p>');
+						} else {
+							html = html.replace(/\n/g, '<br />$&');
+						}
+						self.insertHtml(html).hideDialog().focus();
+					}
+				}
+			}),
+			textarea = K('textarea', dialog.div);
+		textarea[0].focus();
+	});
+});
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/preview/preview.js b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/preview/preview.js
new file mode 100644
index 0000000..ef6e2cf
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/preview/preview.js
@@ -0,0 +1,31 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('preview', function(K) {
+	var self = this, name = 'preview', undefined;
+	self.clickToolbar(name, function() {
+		var lang = self.lang(name + '.'),
+			html = '<div style="padding:10px 20px;">' +
+				'<iframe class="ke-textarea" frameborder="0" style="width:708px;height:400px;"></iframe>' +
+				'</div>',
+			dialog = self.createDialog({
+				name : name,
+				width : 750,
+				title : self.lang(name),
+				body : html
+			}),
+			iframe = K('iframe', dialog.div),
+			doc = K.iframeDoc(iframe);
+		doc.open();
+		doc.write(self.fullHtml());
+		doc.close();
+		K(doc.body).css('background-color', '#FFF');
+		iframe[0].contentWindow.focus();
+	});
+});
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/quickformat/quickformat.js b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/quickformat/quickformat.js
new file mode 100644
index 0000000..5b98c72
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/quickformat/quickformat.js
@@ -0,0 +1,81 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('quickformat', function(K) {
+	var self = this, name = 'quickformat',
+		blockMap = K.toMap('blockquote,center,div,h1,h2,h3,h4,h5,h6,p');
+	function getFirstChild(knode) {
+		var child = knode.first();
+		while (child && child.first()) {
+			child = child.first();
+		}
+		return child;
+	}
+	self.clickToolbar(name, function() {
+		self.focus();
+		var doc = self.edit.doc,
+			range = self.cmd.range,
+			child = K(doc.body).first(), next,
+			nodeList = [], subList = [],
+			bookmark = range.createBookmark(true);
+		while(child) {
+			next = child.next();
+			var firstChild = getFirstChild(child);
+			if (!firstChild || firstChild.name != 'img') {
+				if (blockMap[child.name]) {
+					child.html(child.html().replace(/^(\s|&nbsp;|銆�)+/ig, ''));
+					child.css('text-indent', '2em');
+				} else {
+					subList.push(child);
+				}
+				if (!next || (blockMap[next.name] || blockMap[child.name] && !blockMap[next.name])) {
+					if (subList.length > 0) {
+						nodeList.push(subList);
+					}
+					subList = [];
+				}
+			}
+			child = next;
+		}
+		K.each(nodeList, function(i, subList) {
+			var wrapper = K('<p style="text-indent:2em;"></p>', doc);
+			subList[0].before(wrapper);
+			K.each(subList, function(i, knode) {
+				wrapper.append(knode);
+			});
+		});
+		range.moveToBookmark(bookmark);
+		self.addBookmark();
+	});
+});
+
+/**
+--------------------------
+abcd<br />
+1234<br />
+
+to
+
+<p style="text-indent:2em;">
+	abcd<br />
+	1234<br />
+</p>
+
+--------------------------
+
+&nbsp; abcd<img>1233
+<p>1234</p>
+
+to
+
+<p style="text-indent:2em;">abcd<img>1233</p>
+<p style="text-indent:2em;">1234</p>
+
+--------------------------
+*/
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/table/table.js b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/table/table.js
new file mode 100644
index 0000000..2b73e6d
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/table/table.js
@@ -0,0 +1,705 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('table', function(K) {
+	var self = this, name = 'table', lang = self.lang(name + '.'), zeroborder = 'ke-zeroborder';
+	// 璁剧疆棰滆壊
+	function _setColor(box, color) {
+		color = color.toUpperCase();
+		box.css('background-color', color);
+		box.css('color', color === '#000000' ? '#FFFFFF' : '#000000');
+		box.html(color);
+	}
+	// 鍒濆鍖栧彇鑹插櫒
+	var pickerList = [];
+	function _initColorPicker(dialogDiv, colorBox) {
+		colorBox.bind('click,mousedown', function(e){
+			e.stopPropagation();
+		});
+		function removePicker() {
+			K.each(pickerList, function() {
+				this.remove();
+			});
+			pickerList = [];
+			K(document).unbind('click,mousedown', removePicker);
+			dialogDiv.unbind('click,mousedown', removePicker);
+		}
+		colorBox.click(function(e) {
+			removePicker();
+			var box = K(this),
+				pos = box.pos();
+			var picker = K.colorpicker({
+				x : pos.x,
+				y : pos.y + box.height(),
+				z : 811214,
+				selectedColor : K(this).html(),
+				colors : self.colorTable,
+				noColor : self.lang('noColor'),
+				shadowMode : self.shadowMode,
+				click : function(color) {
+					_setColor(box, color);
+					removePicker();
+				}
+			});
+			pickerList.push(picker);
+			K(document).bind('click,mousedown', removePicker);
+			dialogDiv.bind('click,mousedown', removePicker);
+		});
+	}
+	// 鍙栧緱涓嬩竴琛宑ell鐨刬ndex
+	function _getCellIndex(table, row, cell) {
+		var rowSpanCount = 0;
+		for (var i = 0, len = row.cells.length; i < len; i++) {
+			if (row.cells[i] == cell) {
+				break;
+			}
+			rowSpanCount += row.cells[i].rowSpan - 1;
+		}
+		return cell.cellIndex - rowSpanCount;
+	}
+	self.plugin.table = {
+		//insert or modify table
+		prop : function(isInsert) {
+			var html = [
+				'<div style="padding:20px;">',
+				//rows, cols
+				'<div class="ke-dialog-row">',
+				'<label for="keRows" style="width:90px;">' + lang.cells + '</label>',
+				lang.rows + ' <input type="text" id="keRows" class="ke-input-text ke-input-number" name="rows" value="" maxlength="4" /> &nbsp; ',
+				lang.cols + ' <input type="text" class="ke-input-text ke-input-number" name="cols" value="" maxlength="4" />',
+				'</div>',
+				//width, height
+				'<div class="ke-dialog-row">',
+				'<label for="keWidth" style="width:90px;">' + lang.size + '</label>',
+				lang.width + ' <input type="text" id="keWidth" class="ke-input-text ke-input-number" name="width" value="" maxlength="4" /> &nbsp; ',
+				'<select name="widthType">',
+				'<option value="%">' + lang.percent + '</option>',
+				'<option value="px">' + lang.px + '</option>',
+				'</select> &nbsp; ',
+				lang.height + ' <input type="text" class="ke-input-text ke-input-number" name="height" value="" maxlength="4" /> &nbsp; ',
+				'<select name="heightType">',
+				'<option value="%">' + lang.percent + '</option>',
+				'<option value="px">' + lang.px + '</option>',
+				'</select>',
+				'</div>',
+				//space, padding
+				'<div class="ke-dialog-row">',
+				'<label for="kePadding" style="width:90px;">' + lang.space + '</label>',
+				lang.padding + ' <input type="text" id="kePadding" class="ke-input-text ke-input-number" name="padding" value="" maxlength="4" /> &nbsp; ',
+				lang.spacing + ' <input type="text" class="ke-input-text ke-input-number" name="spacing" value="" maxlength="4" />',
+				'</div>',
+				//align
+				'<div class="ke-dialog-row">',
+				'<label for="keAlign" style="width:90px;">' + lang.align + '</label>',
+				'<select id="keAlign" name="align">',
+				'<option value="">' + lang.alignDefault + '</option>',
+				'<option value="left">' + lang.alignLeft + '</option>',
+				'<option value="center">' + lang.alignCenter + '</option>',
+				'<option value="right">' + lang.alignRight + '</option>',
+				'</select>',
+				'</div>',
+				//border
+				'<div class="ke-dialog-row">',
+				'<label for="keBorder" style="width:90px;">' + lang.border + '</label>',
+				lang.borderWidth + ' <input type="text" id="keBorder" class="ke-input-text ke-input-number" name="border" value="" maxlength="4" /> &nbsp; ',
+				lang.borderColor + ' <span class="ke-inline-block ke-input-color"></span>',
+				'</div>',
+				//background color
+				'<div class="ke-dialog-row">',
+				'<label for="keBgColor" style="width:90px;">' + lang.backgroundColor + '</label>',
+				'<span class="ke-inline-block ke-input-color"></span>',
+				'</div>',
+				'</div>'
+			].join('');
+			var dialog = self.createDialog({
+				name : name,
+				width : 500,
+				title : self.lang(name),
+				body : html,
+				beforeRemove : function() {
+					colorBox.unbind();
+				},
+				yesBtn : {
+					name : self.lang('yes'),
+					click : function(e) {
+						var rows = rowsBox.val(),
+							cols = colsBox.val(),
+							width = widthBox.val(),
+							height = heightBox.val(),
+							widthType = widthTypeBox.val(),
+							heightType = heightTypeBox.val(),
+							padding = paddingBox.val(),
+							spacing = spacingBox.val(),
+							align = alignBox.val(),
+							border = borderBox.val(),
+							borderColor = K(colorBox[0]).html() || '',
+							bgColor = K(colorBox[1]).html() || '';
+						if (rows == 0 || !/^\d+$/.test(rows)) {
+							alert(self.lang('invalidRows'));
+							rowsBox[0].focus();
+							return;
+						}
+						if (cols == 0 || !/^\d+$/.test(cols)) {
+							alert(self.lang('invalidRows'));
+							colsBox[0].focus();
+							return;
+						}
+						if (!/^\d*$/.test(width)) {
+							alert(self.lang('invalidWidth'));
+							widthBox[0].focus();
+							return;
+						}
+						if (!/^\d*$/.test(height)) {
+							alert(self.lang('invalidHeight'));
+							heightBox[0].focus();
+							return;
+						}
+						if (!/^\d*$/.test(padding)) {
+							alert(self.lang('invalidPadding'));
+							paddingBox[0].focus();
+							return;
+						}
+						if (!/^\d*$/.test(spacing)) {
+							alert(self.lang('invalidSpacing'));
+							spacingBox[0].focus();
+							return;
+						}
+						if (!/^\d*$/.test(border)) {
+							alert(self.lang('invalidBorder'));
+							borderBox[0].focus();
+							return;
+						}
+						//modify table
+						if (table) {
+							if (width !== '') {
+								table.width(width + widthType);
+							} else {
+								table.css('width', '');
+							}
+							if (table[0].width !== undefined) {
+								table.removeAttr('width');
+							}
+							if (height !== '') {
+								table.height(height + heightType);
+							} else {
+								table.css('height', '');
+							}
+							if (table[0].height !== undefined) {
+								table.removeAttr('height');
+							}
+							table.css('background-color', bgColor);
+							if (table[0].bgColor !== undefined) {
+								table.removeAttr('bgColor');
+							}
+							if (padding !== '') {
+								table[0].cellPadding = padding;
+							} else {
+								table.removeAttr('cellPadding');
+							}
+							if (spacing !== '') {
+								table[0].cellSpacing = spacing;
+							} else {
+								table.removeAttr('cellSpacing');
+							}
+							if (align !== '') {
+								table[0].align = align;
+							} else {
+								table.removeAttr('align');
+							}
+							if (border !== '') {
+								table.attr('border', border);
+							} else {
+								table.removeAttr('border');
+							}
+							if (border === '' || border === '0') {
+								table.addClass(zeroborder);
+							} else {
+								table.removeClass(zeroborder);
+							}
+							if (borderColor !== '') {
+								table.attr('borderColor', borderColor);
+							} else {
+								table.removeAttr('borderColor');
+							}
+							self.hideDialog().focus();
+							return;
+						}
+						//insert new table
+						var style = '';
+						if (width !== '') {
+							style += 'width:' + width + widthType + ';';
+						}
+						if (height !== '') {
+							style += 'height:' + height + heightType + ';';
+						}
+						if (bgColor !== '') {
+							style += 'background-color:' + bgColor + ';';
+						}
+						var html = '<table';
+						if (style !== '') {
+							html += ' style="' + style + '"';
+						}
+						if (padding !== '') {
+							html += ' cellpadding="' + padding + '"';
+						}
+						if (spacing !== '') {
+							html += ' cellspacing="' + spacing + '"';
+						}
+						if (align !== '') {
+							html += ' align="' + align + '"';
+						}
+						if (border !== '') {
+							html += ' border="' + border + '"';
+						}
+						if (border === '' || border === '0') {
+							html += ' class="' + zeroborder + '"';
+						}
+						if (borderColor !== '') {
+							html += ' bordercolor="' + borderColor + '"';
+						}
+						html += '>';
+						for (var i = 0; i < rows; i++) {
+							html += '<tr>';
+							for (var j = 0; j < cols; j++) {
+								html += '<td>' + (K.IE ? '&nbsp;' : '<br />') + '</td>';
+							}
+							html += '</tr>';
+						}
+						html += '</table>';
+						if (!K.IE) {
+							html += '<br />';
+						}
+						self.insertHtml(html);
+						self.select().hideDialog().focus();
+						self.addBookmark();
+					}
+				}
+			}),
+			div = dialog.div,
+			rowsBox = K('[name="rows"]', div).val(3),
+			colsBox = K('[name="cols"]', div).val(2),
+			widthBox = K('[name="width"]', div).val(100),
+			heightBox = K('[name="height"]', div),
+			widthTypeBox = K('[name="widthType"]', div),
+			heightTypeBox = K('[name="heightType"]', div),
+			paddingBox = K('[name="padding"]', div).val(2),
+			spacingBox = K('[name="spacing"]', div).val(0),
+			alignBox = K('[name="align"]', div),
+			borderBox = K('[name="border"]', div).val(1),
+			colorBox = K('.ke-input-color', div);
+			_initColorPicker(div, colorBox.eq(0));
+			_initColorPicker(div, colorBox.eq(1));
+			_setColor(colorBox.eq(0), '#000000');
+			_setColor(colorBox.eq(1), '');
+			// foucs and select
+			rowsBox[0].focus();
+			rowsBox[0].select();
+			var table;
+			if (isInsert) {
+				return;
+			}
+			//get selected table node
+			table = self.plugin.getSelectedTable();
+			if (table) {
+				rowsBox.val(table[0].rows.length);
+				colsBox.val(table[0].rows.length > 0 ? table[0].rows[0].cells.length : 0);
+				rowsBox.attr('disabled', true);
+				colsBox.attr('disabled', true);
+				var match,
+					tableWidth = table[0].style.width || table[0].width,
+					tableHeight = table[0].style.height || table[0].height;
+				if (tableWidth !== undefined && (match = /^(\d+)((?:px|%)*)$/.exec(tableWidth))) {
+					widthBox.val(match[1]);
+					widthTypeBox.val(match[2]);
+				} else {
+					widthBox.val('');
+				}
+				if (tableHeight !== undefined && (match = /^(\d+)((?:px|%)*)$/.exec(tableHeight))) {
+					heightBox.val(match[1]);
+					heightTypeBox.val(match[2]);
+				}
+				paddingBox.val(table[0].cellPadding || '');
+				spacingBox.val(table[0].cellSpacing || '');
+				alignBox.val(table[0].align || '');
+				borderBox.val(table[0].border === undefined ? '' : table[0].border);
+				_setColor(colorBox.eq(0), K.toHex(table.attr('borderColor') || ''));
+				_setColor(colorBox.eq(1), K.toHex(table[0].style.backgroundColor || table[0].bgColor || ''));
+				widthBox[0].focus();
+				widthBox[0].select();
+			}
+		},
+		//modify cell
+		cellprop : function() {
+			var html = [
+				'<div style="padding:20px;">',
+				//width, height
+				'<div class="ke-dialog-row">',
+				'<label for="keWidth" style="width:90px;">' + lang.size + '</label>',
+				lang.width + ' <input type="text" id="keWidth" class="ke-input-text ke-input-number" name="width" value="" maxlength="4" /> &nbsp; ',
+				'<select name="widthType">',
+				'<option value="%">' + lang.percent + '</option>',
+				'<option value="px">' + lang.px + '</option>',
+				'</select> &nbsp; ',
+				lang.height + ' <input type="text" class="ke-input-text ke-input-number" name="height" value="" maxlength="4" /> &nbsp; ',
+				'<select name="heightType">',
+				'<option value="%">' + lang.percent + '</option>',
+				'<option value="px">' + lang.px + '</option>',
+				'</select>',
+				'</div>',
+				//align
+				'<div class="ke-dialog-row">',
+				'<label for="keAlign" style="width:90px;">' + lang.align + '</label>',
+				lang.textAlign + ' <select id="keAlign" name="textAlign">',
+				'<option value="">' + lang.alignDefault + '</option>',
+				'<option value="left">' + lang.alignLeft + '</option>',
+				'<option value="center">' + lang.alignCenter + '</option>',
+				'<option value="right">' + lang.alignRight + '</option>',
+				'</select> ',
+				lang.verticalAlign + ' <select name="verticalAlign">',
+				'<option value="">' + lang.alignDefault + '</option>',
+				'<option value="top">' + lang.alignTop + '</option>',
+				'<option value="middle">' + lang.alignMiddle + '</option>',
+				'<option value="bottom">' + lang.alignBottom + '</option>',
+				'<option value="baseline">' + lang.alignBaseline + '</option>',
+				'</select>',
+				'</div>',
+				//border
+				'<div class="ke-dialog-row">',
+				'<label for="keBorder" style="width:90px;">' + lang.border + '</label>',
+				lang.borderWidth + ' <input type="text" id="keBorder" class="ke-input-text ke-input-number" name="border" value="" maxlength="4" /> &nbsp; ',
+				lang.borderColor + ' <span class="ke-inline-block ke-input-color"></span>',
+				'</div>',
+				//background color
+				'<div class="ke-dialog-row">',
+				'<label for="keBgColor" style="width:90px;">' + lang.backgroundColor + '</label>',
+				'<span class="ke-inline-block ke-input-color"></span>',
+				'</div>',
+				'</div>'
+			].join('');
+			var dialog = self.createDialog({
+				name : name,
+				width : 500,
+				title : self.lang('tablecell'),
+				body : html,
+				beforeRemove : function() {
+					colorBox.unbind();
+				},
+				yesBtn : {
+					name : self.lang('yes'),
+					click : function(e) {
+						var width = widthBox.val(),
+							height = heightBox.val(),
+							widthType = widthTypeBox.val(),
+							heightType = heightTypeBox.val(),
+							padding = paddingBox.val(),
+							spacing = spacingBox.val(),
+							textAlign = textAlignBox.val(),
+							verticalAlign = verticalAlignBox.val(),
+							border = borderBox.val(),
+							borderColor = K(colorBox[0]).html() || '',
+							bgColor = K(colorBox[1]).html() || '';
+						if (!/^\d*$/.test(width)) {
+							alert(self.lang('invalidWidth'));
+							widthBox[0].focus();
+							return;
+						}
+						if (!/^\d*$/.test(height)) {
+							alert(self.lang('invalidHeight'));
+							heightBox[0].focus();
+							return;
+						}
+						if (!/^\d*$/.test(border)) {
+							alert(self.lang('invalidBorder'));
+							borderBox[0].focus();
+							return;
+						}
+						cell.css({
+							width : width !== '' ? (width + widthType) : '',
+							height : height !== '' ? (height + heightType) : '',
+							'background-color' : bgColor,
+							'text-align' : textAlign,
+							'vertical-align' : verticalAlign,
+							'border-width' : border,
+							'border-style' : border !== '' ? 'solid' : '',
+							'border-color' : borderColor
+						});
+						self.hideDialog().focus();
+						self.addBookmark();
+					}
+				}
+			}),
+			div = dialog.div,
+			widthBox = K('[name="width"]', div).val(100),
+			heightBox = K('[name="height"]', div),
+			widthTypeBox = K('[name="widthType"]', div),
+			heightTypeBox = K('[name="heightType"]', div),
+			paddingBox = K('[name="padding"]', div).val(2),
+			spacingBox = K('[name="spacing"]', div).val(0),
+			textAlignBox = K('[name="textAlign"]', div),
+			verticalAlignBox = K('[name="verticalAlign"]', div),
+			borderBox = K('[name="border"]', div).val(1),
+			colorBox = K('.ke-input-color', div);
+			_initColorPicker(div, colorBox.eq(0));
+			_initColorPicker(div, colorBox.eq(1));
+			_setColor(colorBox.eq(0), '#000000');
+			_setColor(colorBox.eq(1), '');
+			// foucs and select
+			widthBox[0].focus();
+			widthBox[0].select();
+			// get selected cell
+			var cell = self.plugin.getSelectedCell();
+			var match,
+				cellWidth = cell[0].style.width || cell[0].width || '',
+				cellHeight = cell[0].style.height || cell[0].height || '';
+			if ((match = /^(\d+)((?:px|%)*)$/.exec(cellWidth))) {
+				widthBox.val(match[1]);
+				widthTypeBox.val(match[2]);
+			} else {
+				widthBox.val('');
+			}
+			if ((match = /^(\d+)((?:px|%)*)$/.exec(cellHeight))) {
+				heightBox.val(match[1]);
+				heightTypeBox.val(match[2]);
+			}
+			textAlignBox.val(cell[0].style.textAlign || '');
+			verticalAlignBox.val(cell[0].style.verticalAlign || '');
+			var border = cell[0].style.borderWidth || '';
+			if (border) {
+				border = parseInt(border);
+			}
+			borderBox.val(border);
+			_setColor(colorBox.eq(0), K.toHex(cell[0].style.borderColor || ''));
+			_setColor(colorBox.eq(1), K.toHex(cell[0].style.backgroundColor || ''));
+			widthBox[0].focus();
+			widthBox[0].select();
+		},
+		insert : function() {
+			this.prop(true);
+		},
+		'delete' : function() {
+			var table = self.plugin.getSelectedTable();
+			self.cmd.range.setStartBefore(table[0]).collapse(true);
+			self.cmd.select();
+			table.remove();
+			self.addBookmark();
+		},
+		colinsert : function(offset) {
+			var table = self.plugin.getSelectedTable()[0],
+				row = self.plugin.getSelectedRow()[0],
+				cell = self.plugin.getSelectedCell()[0],
+				index = cell.cellIndex + offset;
+			// 鍙栧緱绗竴琛岀殑index
+			index += table.rows[0].cells.length - row.cells.length;
+
+			for (var i = 0, len = table.rows.length; i < len; i++) {
+				var newRow = table.rows[i],
+					newCell = newRow.insertCell(index);
+				newCell.innerHTML = K.IE ? '' : '<br />';
+				// 璋冩暣涓嬩竴琛岀殑鍗曞厓鏍糹ndex
+				index = _getCellIndex(table, newRow, newCell);
+			}
+			self.cmd.range.selectNodeContents(cell).collapse(true);
+			self.cmd.select();
+			self.addBookmark();
+		},
+		colinsertleft : function() {
+			this.colinsert(0);
+		},
+		colinsertright : function() {
+			this.colinsert(1);
+		},
+		rowinsert : function(offset) {
+			var table = self.plugin.getSelectedTable()[0],
+				row = self.plugin.getSelectedRow()[0],
+				cell = self.plugin.getSelectedCell()[0];
+			var rowIndex = row.rowIndex;
+			if (offset === 1) {
+				rowIndex = row.rowIndex + (cell.rowSpan - 1) + offset;
+			}
+			var newRow = table.insertRow(rowIndex);
+
+			for (var i = 0, len = row.cells.length; i < len; i++) {
+				// 璋冩暣cell涓暟
+				if (row.cells[i].rowSpan > 1) {
+					len -= row.cells[i].rowSpan - 1;
+				}
+				var newCell = newRow.insertCell(i);
+				// copy colspan
+				if (offset === 1 && row.cells[i].colSpan > 1) {
+					newCell.colSpan = row.cells[i].colSpan;
+				}
+				newCell.innerHTML = K.IE ? '' : '<br />';
+			}
+			// 璋冩暣rowspan
+			for (var j = rowIndex; j >= 0; j--) {
+				var cells = table.rows[j].cells;
+				if (cells.length > i) {
+					for (var k = cell.cellIndex; k >= 0; k--) {
+						if (cells[k].rowSpan > 1) {
+							cells[k].rowSpan += 1;
+						}
+					}
+					break;
+				}
+			}
+			self.cmd.range.selectNodeContents(cell).collapse(true);
+			self.cmd.select();
+			self.addBookmark();
+		},
+		rowinsertabove : function() {
+			this.rowinsert(0);
+		},
+		rowinsertbelow : function() {
+			this.rowinsert(1);
+		},
+		rowmerge : function() {
+			var table = self.plugin.getSelectedTable()[0],
+				row = self.plugin.getSelectedRow()[0],
+				cell = self.plugin.getSelectedCell()[0],
+				rowIndex = row.rowIndex, // 褰撳墠琛岀殑index
+				nextRowIndex = rowIndex + cell.rowSpan, // 涓嬩竴琛岀殑index
+				nextRow = table.rows[nextRowIndex]; // 涓嬩竴琛�
+			// 鏈�鍚庝竴琛屼笉鑳藉悎骞�
+			if (table.rows.length <= nextRowIndex) {
+				return;
+			}
+			var cellIndex = cell.cellIndex; // 涓嬩竴琛屽崟鍏冩牸鐨刬ndex
+			if (nextRow.cells.length <= cellIndex) {
+				return;
+			}
+			var nextCell = nextRow.cells[cellIndex]; // 涓嬩竴琛屽崟鍏冩牸
+			// 涓婁笅琛岀殑colspan涓嶄竴鑷存椂涓嶈兘鍚堝苟
+			if (cell.colSpan !== nextCell.colSpan) {
+				return;
+			}
+			cell.rowSpan += nextCell.rowSpan;
+			nextRow.deleteCell(cellIndex);
+			self.cmd.range.selectNodeContents(cell).collapse(true);
+			self.cmd.select();
+			self.addBookmark();
+		},
+		colmerge : function() {
+			var table = self.plugin.getSelectedTable()[0],
+				row = self.plugin.getSelectedRow()[0],
+				cell = self.plugin.getSelectedCell()[0],
+				rowIndex = row.rowIndex, // 褰撳墠琛岀殑index
+				cellIndex = cell.cellIndex,
+				nextCellIndex = cellIndex + 1;
+			// 鏈�鍚庝竴鍒椾笉鑳藉悎骞�
+			if (row.cells.length <= nextCellIndex) {
+				return;
+			}
+			var nextCell = row.cells[nextCellIndex];
+			// 宸﹀彸鍒楃殑rowspan涓嶄竴鑷存椂涓嶈兘鍚堝苟
+			if (cell.rowSpan !== nextCell.rowSpan) {
+				return;
+			}
+			cell.colSpan += nextCell.colSpan;
+			row.deleteCell(nextCellIndex);
+			self.cmd.range.selectNodeContents(cell).collapse(true);
+			self.cmd.select();
+			self.addBookmark();
+		},
+		rowsplit : function() {
+			var table = self.plugin.getSelectedTable()[0],
+				row = self.plugin.getSelectedRow()[0],
+				cell = self.plugin.getSelectedCell()[0],
+				rowIndex = row.rowIndex;
+			// 涓嶆槸鍙垎鍓插崟鍏冩牸
+			if (cell.rowSpan === 1) {
+				return;
+			}
+			var cellIndex = _getCellIndex(table, row, cell);
+			for (var i = 1, len = cell.rowSpan; i < len; i++) {
+				var newRow = table.rows[rowIndex + i],
+					newCell = newRow.insertCell(cellIndex);
+				if (cell.colSpan > 1) {
+					newCell.colSpan = cell.colSpan;
+				}
+				newCell.innerHTML = K.IE ? '' : '<br />';
+				// 璋冩暣涓嬩竴琛岀殑鍗曞厓鏍糹ndex
+				cellIndex = _getCellIndex(table, newRow, newCell);
+			}
+			K(cell).removeAttr('rowSpan');
+			self.cmd.range.selectNodeContents(cell).collapse(true);
+			self.cmd.select();
+			self.addBookmark();
+		},
+		colsplit : function() {
+			var table = self.plugin.getSelectedTable()[0],
+				row = self.plugin.getSelectedRow()[0],
+				cell = self.plugin.getSelectedCell()[0],
+				cellIndex = cell.cellIndex;
+			// 涓嶆槸鍙垎鍓插崟鍏冩牸
+			if (cell.colSpan === 1) {
+				return;
+			}
+			for (var i = 1, len = cell.colSpan; i < len; i++) {
+				var newCell = row.insertCell(cellIndex + i);
+				if (cell.rowSpan > 1) {
+					newCell.rowSpan = cell.rowSpan;
+				}
+				newCell.innerHTML = K.IE ? '' : '<br />';
+			}
+			K(cell).removeAttr('colSpan');
+			self.cmd.range.selectNodeContents(cell).collapse(true);
+			self.cmd.select();
+			self.addBookmark();
+		},
+		coldelete : function() {
+			var table = self.plugin.getSelectedTable()[0],
+				row = self.plugin.getSelectedRow()[0],
+				cell = self.plugin.getSelectedCell()[0],
+				index = cell.cellIndex;
+			for (var i = 0, len = table.rows.length; i < len; i++) {
+				var newRow = table.rows[i],
+					newCell = newRow.cells[index];
+				if (newCell.colSpan > 1) {
+					newCell.colSpan -= 1;
+					if (newCell.colSpan === 1) {
+						K(newCell).removeAttr('colSpan');
+					}
+				} else {
+					newRow.deleteCell(index);
+				}
+				// 璺宠繃涓嶉渶瑕佸垹闄ょ殑琛�
+				if (newCell.rowSpan > 1) {
+					i += newCell.rowSpan - 1;
+				}
+			}
+			if (row.cells.length === 0) {
+				self.cmd.range.setStartBefore(table).collapse(true);
+				self.cmd.select();
+				K(table).remove();
+			} else {
+				self.cmd.selection(true);
+			}
+			self.addBookmark();
+		},
+		rowdelete : function() {
+			var table = self.plugin.getSelectedTable()[0],
+				row = self.plugin.getSelectedRow()[0],
+				cell = self.plugin.getSelectedCell()[0],
+				rowIndex = row.rowIndex;
+			// 浠庝笅鍒颁笂鍒犻櫎
+			for (var i = cell.rowSpan - 1; i >= 0; i--) {
+				table.deleteRow(rowIndex + i);
+			}
+			if (table.rows.length === 0) {
+				self.cmd.range.setStartBefore(table).collapse(true);
+				self.cmd.select();
+				K(table).remove();
+			} else {
+				self.cmd.selection(true);
+			}
+			self.addBookmark();
+		}
+	};
+	self.clickToolbar(name, self.plugin.table.prop);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/template/html/1.html b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/template/html/1.html
new file mode 100644
index 0000000..034126b
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/template/html/1.html
@@ -0,0 +1,14 @@
+<!doctype html>
+<html>
+<head>
+	<meta charset="utf-8" />
+</head>
+<body>
+	<h3>
+		<img align="left" height="100" style="margin-right: 10px" width="100" />鍦ㄦ澶勮緭鍏ユ爣棰�
+	</h3>
+	<p>
+		鍦ㄦ澶勮緭鍏ュ唴瀹�
+	</p>
+</body>
+</html>
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/template/html/2.html b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/template/html/2.html
new file mode 100644
index 0000000..dc2584a
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/template/html/2.html
@@ -0,0 +1,42 @@
+<!doctype html>
+<html>
+<head>
+	<meta charset="utf-8" />
+</head>
+<body>
+	<h3>
+		鏍囬
+	</h3>
+	<table style="width:100%;" cellpadding="2" cellspacing="0" border="1">
+		<tbody>
+			<tr>
+				<td>
+					<h3>鏍囬1</h3>
+				</td>
+				<td>
+					<h3>鏍囬1</h3>
+				</td>
+			</tr>
+			<tr>
+				<td>
+					鍐呭1
+				</td>
+				<td>
+					鍐呭2
+				</td>
+			</tr>
+			<tr>
+				<td>
+					鍐呭3
+				</td>
+				<td>
+					鍐呭4
+				</td>
+			</tr>
+		</tbody>
+	</table>
+	<p>
+		琛ㄦ牸璇存槑
+	</p>
+</body>
+</html>
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/template/html/3.html b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/template/html/3.html
new file mode 100644
index 0000000..873f0c6
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/template/html/3.html
@@ -0,0 +1,36 @@
+<!doctype html>
+<html>
+<head>
+	<meta charset="utf-8" />
+</head>
+<body>
+	<p>
+		鍦ㄦ澶勮緭鍏ュ唴瀹�
+	</p>
+	<ol>
+		<li>
+			鎻忚堪1
+		</li>
+		<li>
+			鎻忚堪2
+		</li>
+		<li>
+			鎻忚堪3
+		</li>
+	</ol>
+	<p>
+		鍦ㄦ澶勮緭鍏ュ唴瀹�
+	</p>
+	<ul>
+		<li>
+			鎻忚堪1
+		</li>
+		<li>
+			鎻忚堪2
+		</li>
+		<li>
+			鎻忚堪3
+		</li>
+	</ul>
+</body>
+</html>
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/template/template.js b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/template/template.js
new file mode 100644
index 0000000..4029e87
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/template/template.js
@@ -0,0 +1,58 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('template', function(K) {
+	var self = this, name = 'template', lang = self.lang(name + '.'),
+		htmlPath = self.pluginsPath + name + '/html/';
+	function getFilePath(fileName) {
+		return htmlPath + fileName + '?ver=' + encodeURIComponent(K.DEBUG ? K.TIME : K.VERSION);
+	}
+	self.clickToolbar(name, function() {
+		var lang = self.lang(name + '.'),
+			arr = ['<div style="padding:10px 20px;">',
+				'<div class="ke-header">',
+				// left start
+				'<div class="ke-left">',
+				lang. selectTemplate + ' <select>'];
+			K.each(lang.fileList, function(key, val) {
+				arr.push('<option value="' + key + '">' + val + '</option>');
+			});
+			html = [arr.join(''),
+				'</select></div>',
+				// right start
+				'<div class="ke-right">',
+				'<input type="checkbox" id="keReplaceFlag" name="replaceFlag" value="1" /> <label for="keReplaceFlag">' + lang.replaceContent + '</label>',
+				'</div>',
+				'<div class="ke-clearfix"></div>',
+				'</div>',
+				'<iframe class="ke-textarea" frameborder="0" style="width:458px;height:260px;background-color:#FFF;"></iframe>',
+				'</div>'].join('');
+		var dialog = self.createDialog({
+			name : name,
+			width : 500,
+			title : self.lang(name),
+			body : html,
+			yesBtn : {
+				name : self.lang('yes'),
+				click : function(e) {
+					var doc = K.iframeDoc(iframe);
+					self[checkbox[0].checked ? 'html' : 'insertHtml'](doc.body.innerHTML).hideDialog().focus();
+				}
+			}
+		});
+		var selectBox = K('select', dialog.div),
+			checkbox = K('[name="replaceFlag"]', dialog.div),
+			iframe = K('iframe', dialog.div);
+		checkbox[0].checked = true;
+		iframe.attr('src', getFilePath(selectBox.val()));
+		selectBox.change(function() {
+			iframe.attr('src', getFilePath(this.value));
+		});
+	});
+});
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/wordpaste/wordpaste.js b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/wordpaste/wordpaste.js
new file mode 100644
index 0000000..22061e1
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/plugins/wordpaste/wordpaste.js
@@ -0,0 +1,51 @@
+/*******************************************************************************
+* KindEditor - WYSIWYG HTML Editor for Internet
+* Copyright (C) 2006-2011 kindsoft.net
+*
+* @author Roddy <luolonghao@gmail.com>
+* @site http://www.kindsoft.net/
+* @licence http://www.kindsoft.net/license.php
+*******************************************************************************/
+
+KindEditor.plugin('wordpaste', function(K) {
+	var self = this, name = 'wordpaste';
+	self.clickToolbar(name, function() {
+		var lang = self.lang(name + '.'),
+			html = '<div style="padding:10px 20px;">' +
+				'<div style="margin-bottom:10px;">' + lang.comment + '</div>' +
+				'<iframe class="ke-textarea" frameborder="0" style="width:408px;height:260px;"></iframe>' +
+				'</div>',
+			dialog = self.createDialog({
+				name : name,
+				width : 450,
+				title : self.lang(name),
+				body : html,
+				yesBtn : {
+					name : self.lang('yes'),
+					click : function(e) {
+						var str = doc.body.innerHTML;
+						str = K.clearMsWord(str, self.filterMode ? self.htmlTags : K.options.htmlTags);
+						self.insertHtml(str).hideDialog().focus();
+					}
+				}
+			}),
+			div = dialog.div,
+			iframe = K('iframe', div),
+			doc = K.iframeDoc(iframe);
+		if (!K.IE) {
+			doc.designMode = 'on';
+		}
+		doc.open();
+		doc.write('<!doctype html><html><head><title>WordPaste</title></head>');
+		doc.write('<body style="background-color:#FFF;font-size:12px;margin:2px;">');
+		if (!K.IE) {
+			doc.write('<br />');
+		}
+		doc.write('</body></html>');
+		doc.close();
+		if (K.IE) {
+			doc.body.contentEditable = 'true';
+		}
+		iframe[0].contentWindow.focus();
+	});
+});
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/themes/common/anchor.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/themes/common/anchor.gif
new file mode 100644
index 0000000..61145ea
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/themes/common/anchor.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/themes/common/blank.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/themes/common/blank.gif
new file mode 100644
index 0000000..5bfd67a
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/themes/common/blank.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/themes/common/flash.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/themes/common/flash.gif
new file mode 100644
index 0000000..2cb12b2
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/themes/common/flash.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/themes/common/loading.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/themes/common/loading.gif
new file mode 100644
index 0000000..c69e937
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/themes/common/loading.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/themes/common/media.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/themes/common/media.gif
new file mode 100644
index 0000000..e1c0e30
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/themes/common/media.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/themes/common/rm.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/themes/common/rm.gif
new file mode 100644
index 0000000..d013d55
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/themes/common/rm.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/themes/default/background.png b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/themes/default/background.png
new file mode 100644
index 0000000..bbfb056
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/themes/default/background.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/themes/default/default.css b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/themes/default/default.css
new file mode 100644
index 0000000..c6e025c
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/themes/default/default.css
@@ -0,0 +1,1148 @@
+/* common */
+.ke-inline-block {
+	display: -moz-inline-stack;
+	display: inline-block;
+	vertical-align: middle;
+	zoom: 1;
+	*display: inline;
+}
+.ke-clearfix {
+	zoom: 1;
+}
+.ke-clearfix:after {
+	content: ".";
+	display: block;
+	clear: both;
+	font-size: 0;
+	height: 0;
+	line-height: 0;
+	visibility: hidden;
+}
+.ke-shadow {
+	box-shadow: 1px 1px 3px #A0A0A0;
+	-moz-box-shadow: 1px 1px 3px #A0A0A0;
+	-webkit-box-shadow: 1px 1px 3px #A0A0A0;
+	filter: progid:DXImageTransform.Microsoft.Shadow(color='#A0A0A0', Direction=135, Strength=3);
+	background-color: #F0F0EE;
+}
+.ke-menu a,
+.ke-menu a:hover,
+.ke-dialog a,
+.ke-dialog a:hover {
+	color: #337FE5;
+	text-decoration: none;
+}
+/* icons */
+.ke-icon-source {
+	background-position: 0px 0px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-preview {
+	background-position: 0px -16px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-print {
+	background-position: 0px -32px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-undo {
+	background-position: 0px -48px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-redo {
+	background-position: 0px -64px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-cut {
+	background-position: 0px -80px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-copy {
+	background-position: 0px -96px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-paste {
+	background-position: 0px -112px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-selectall {
+	background-position: 0px -128px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-justifyleft {
+	background-position: 0px -144px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-justifycenter {
+	background-position: 0px -160px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-justifyright {
+	background-position: 0px -176px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-justifyfull {
+	background-position: 0px -192px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-insertorderedlist {
+	background-position: 0px -208px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-insertunorderedlist {
+	background-position: 0px -224px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-indent {
+	background-position: 0px -240px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-outdent {
+	background-position: 0px -256px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-subscript {
+	background-position: 0px -272px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-superscript {
+	background-position: 0px -288px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-date {
+	background-position: 0px -304px;
+	width: 25px;
+	height: 16px;
+}
+.ke-icon-time {
+	background-position: 0px -320px;
+	width: 25px;
+	height: 16px;
+}
+.ke-icon-formatblock {
+	background-position: 0px -336px;
+	width: 25px;
+	height: 16px;
+}
+.ke-icon-fontname {
+	background-position: 0px -352px;
+	width: 21px;
+	height: 16px;
+}
+.ke-icon-fontsize {
+	background-position: 0px -368px;
+	width: 23px;
+	height: 16px;
+}
+.ke-icon-forecolor {
+	background-position: 0px -384px;
+	width: 20px;
+	height: 16px;
+}
+.ke-icon-hilitecolor {
+	background-position: 0px -400px;
+	width: 23px;
+	height: 16px;
+}
+.ke-icon-bold {
+	background-position: 0px -416px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-italic {
+	background-position: 0px -432px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-underline {
+	background-position: 0px -448px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-strikethrough {
+	background-position: 0px -464px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-removeformat {
+	background-position: 0px -480px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-image {
+	background-position: 0px -496px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-flash {
+	background-position: 0px -512px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-media {
+	background-position: 0px -528px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-div {
+	background-position: 0px -544px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-formula {
+	background-position: 0px -576px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-hr {
+	background-position: 0px -592px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-emoticons {
+	background-position: 0px -608px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-link {
+	background-position: 0px -624px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-unlink {
+	background-position: 0px -640px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-fullscreen {
+	background-position: 0px -656px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-about {
+	background-position: 0px -672px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-plainpaste {
+	background-position: 0px -704px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-wordpaste {
+	background-position: 0px -720px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-table {
+	background-position: 0px -784px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-tablemenu {
+	background-position: 0px -768px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-tableinsert {
+	background-position: 0px -784px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-tabledelete {
+	background-position: 0px -800px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-tablecolinsertleft {
+	background-position: 0px -816px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-tablecolinsertright {
+	background-position: 0px -832px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-tablerowinsertabove {
+	background-position: 0px -848px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-tablerowinsertbelow {
+	background-position: 0px -864px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-tablecoldelete {
+	background-position: 0px -880px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-tablerowdelete {
+	background-position: 0px -896px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-tablecellprop {
+	background-position: 0px -912px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-tableprop {
+	background-position: 0px -928px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-checked {
+	background-position: 0px -944px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-code {
+	background-position: 0px -960px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-map {
+	background-position: 0px -976px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-baidumap {
+	background-position: 0px -976px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-lineheight {
+	background-position: 0px -992px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-clearhtml {
+	background-position: 0px -1008px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-pagebreak {
+	background-position: 0px -1024px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-insertfile {
+	background-position: 0px -1040px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-quickformat {
+	background-position: 0px -1056px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-template {
+	background-position: 0px -1072px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-tablecellsplit {
+	background-position: 0px -1088px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-tablerowmerge {
+	background-position: 0px -1104px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-tablerowsplit {
+	background-position: 0px -1120px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-tablecolmerge {
+	background-position: 0px -1136px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-tablecolsplit {
+	background-position: 0px -1152px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-anchor {
+	background-position: 0px -1168px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-search {
+	background-position: 0px -1184px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-new {
+	background-position: 0px -1200px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-specialchar {
+	background-position: 0px -1216px;
+	width: 16px;
+	height: 16px;
+}
+.ke-icon-multiimage {
+	background-position: 0px -1232px;
+	width: 16px;
+	height: 16px;
+}
+/* container */
+.ke-container {
+	display: block;
+	border: 1px solid #CCCCCC;
+	background-color: #FFF;
+	overflow: hidden;
+	margin: 0;
+	padding: 0;
+}
+/* toolbar */
+.ke-toolbar {
+	border-bottom: 1px solid #CCC;
+	background-color: #F0F0EE;
+	padding: 2px 5px;
+	text-align: left;
+	overflow: hidden;
+	zoom: 1;
+}
+.ke-toolbar-icon {
+	background-repeat: no-repeat;
+	font-size: 0;
+	line-height: 0;
+	overflow: hidden;
+	display: block;
+}
+.ke-toolbar-icon-url {
+	background-image: url(default.png);
+}
+.ke-toolbar .ke-outline {
+	border: 1px solid #F0F0EE;
+	margin: 1px;
+	padding: 1px 2px;
+	font-size: 0;
+	line-height: 0;
+	overflow: hidden;
+	cursor: pointer;
+	display: block;
+	float: left;
+}
+.ke-toolbar .ke-on {
+	border: 1px solid #5690D2;
+}
+.ke-toolbar .ke-selected {
+	border: 1px solid #5690D2;
+	background-color: #E9EFF6;
+}
+.ke-toolbar .ke-disabled {
+	cursor: default;
+}
+.ke-toolbar .ke-separator {
+	height: 16px;
+	margin: 2px 3px;
+	border-left: 1px solid #A0A0A0;
+	border-right: 1px solid #FFFFFF;
+	border-top:0;
+	border-bottom:0;
+	width: 0;
+	font-size: 0;
+	line-height: 0;
+	overflow: hidden;
+	display: block;
+	float: left;
+}
+.ke-toolbar .ke-hr {
+	overflow: hidden;
+	height: 1px;
+	clear: both;
+}
+/* edit */
+.ke-edit {
+	padding: 0;
+}
+.ke-edit-iframe,
+.ke-edit-textarea {
+	border: 0;
+	margin: 0;
+	padding: 0;
+	overflow: auto;
+}
+.ke-edit-textarea {
+	font: 12px/1.5 "Consolas", "Monaco", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace;
+	color: #000;
+	overflow: auto;
+	resize: none;
+}
+.ke-edit-textarea:focus {
+	outline: none;
+}
+/* statusbar */
+.ke-statusbar {
+	position: relative;
+	background-color: #F0F0EE;
+	border-top: 1px solid #CCCCCC;
+	font-size: 0;
+	line-height: 0;
+	*height: 12px;
+	overflow: hidden;
+	text-align: center;
+	cursor: s-resize;
+}
+.ke-statusbar-center-icon {
+	background-position: -0px -754px;
+	width: 15px;
+	height: 11px;
+	background-image: url(default.png);
+}
+.ke-statusbar-right-icon {
+	position: absolute;
+	right: 0;
+	bottom: 0;
+	cursor: se-resize;
+	background-position: -5px -741px;
+	width: 11px;
+	height: 11px;
+	background-image: url(default.png);
+}
+/* menu */
+.ke-menu {
+	border: 1px solid #A0A0A0;
+	background-color: #F1F1F1;
+	color: #222222;
+	padding: 2px;
+	font-family: "sans serif",tahoma,verdana,helvetica;
+	font-size: 12px;
+	text-align: left;
+	overflow: hidden;
+}
+.ke-menu-item {
+	border: 1px solid #F1F1F1;
+	background-color: #F1F1F1;
+	color: #222222;
+	height: 24px;
+	overflow: hidden;
+	cursor: pointer;
+}
+.ke-menu-item-on {
+	border: 1px solid #5690D2;
+	background-color: #E9EFF6;
+}
+.ke-menu-item-left {
+	width: 27px;
+	text-align: center;
+	overflow: hidden;
+}
+.ke-menu-item-center {
+	width: 0;
+	height: 24px;
+	border-left: 1px solid #E3E3E3;
+	border-right: 1px solid #FFFFFF;
+	border-top: 0;
+	border-bottom: 0;
+}
+.ke-menu-item-center-on {
+	border-left: 1px solid #E9EFF6;
+	border-right: 1px solid #E9EFF6;
+}
+.ke-menu-item-right {
+	border: 0;
+	padding: 0 0 0 5px;
+	line-height: 24px;
+	text-align: left;
+	overflow: hidden;
+}
+.ke-menu-separator {
+	margin: 2px 0;
+	height: 0;
+	overflow: hidden;
+	border-top: 1px solid #CCCCCC;
+	border-bottom: 1px solid #FFFFFF;
+	border-left: 0;
+	border-right: 0;
+}
+/* colorpicker */
+.ke-colorpicker {
+	border: 1px solid #A0A0A0;
+	background-color: #F1F1F1;
+	color: #222222;
+	padding: 2px;
+}
+.ke-colorpicker-table {
+	border:0;
+	margin:0;
+	padding:0;
+	border-collapse: separate;
+}
+.ke-colorpicker-cell {
+	font-size: 0;
+	line-height: 0;
+	border: 1px solid #F0F0EE;
+	cursor: pointer;
+	margin:3px;
+	padding:0;
+}
+.ke-colorpicker-cell-top {
+	font-family: "sans serif",tahoma,verdana,helvetica;
+	font-size: 12px;
+	line-height: 24px;
+	border: 1px solid #F0F0EE;
+	cursor: pointer;
+	margin:0;
+	padding:0;
+	text-align: center;
+}
+.ke-colorpicker-cell-on {
+	border: 1px solid #5690D2;
+}
+.ke-colorpicker-cell-selected {
+	border: 1px solid #2446AB;
+}
+.ke-colorpicker-cell-color {
+	width: 14px;
+	height: 14px;
+	margin: 3px;
+	padding: 0;
+	border: 0;
+}
+/* dialog */
+.ke-dialog {
+	position: absolute;
+	margin: 0;
+	padding: 0;
+}
+.ke-dialog .ke-header {
+	width: 100%;
+	margin-bottom: 10px;
+}
+.ke-dialog .ke-header .ke-left {
+	float: left;
+}
+.ke-dialog .ke-header .ke-right {
+	float: right;
+}
+.ke-dialog .ke-header label {
+	margin-right: 0;
+	cursor: pointer;
+	font-weight: normal;
+	display: inline;
+	vertical-align: top;
+}
+.ke-dialog-content {
+	background-color: #FFF;
+	width: 100%;
+	height: 100%;
+	color: #333;
+	border: 1px solid #A0A0A0;
+}
+.ke-dialog-shadow {
+	position: absolute;
+	z-index: -1;
+	top: 0;
+	left: 0;
+	width: 100%;
+	height: 100%;
+	box-shadow: 3px 3px 7px #999;
+	-moz-box-shadow: 3px 3px 7px #999;
+	-webkit-box-shadow: 3px 3px 7px #999;
+	filter: progid:DXImageTransform.Microsoft.Blur(PixelRadius='3', MakeShadow='true', ShadowOpacity='0.4');
+	background-color: #F0F0EE;
+}
+.ke-dialog-header {
+	border:0;
+	margin:0;
+	padding: 0 10px;
+	background: url(background.png) repeat scroll 0 0 #F0F0EE;
+	border-bottom: 1px solid #CFCFCF;
+	height: 24px;
+	font: 12px/24px "sans serif",tahoma,verdana,helvetica;
+	text-align: left;
+	color: #222;
+	cursor: move;
+}
+.ke-dialog-icon-close {
+	display: block;
+	background: url(default.png) no-repeat scroll 0px -688px;
+	width: 16px;
+	height: 16px;
+	position: absolute;
+	right: 6px;
+	top: 6px;
+	cursor: pointer;
+}
+.ke-dialog-body {
+	font: 12px/1.5 "sans serif",tahoma,verdana,helvetica;
+	text-align: left;
+	overflow: hidden;
+	width: 100%;
+}
+.ke-dialog-body textarea {
+	display: block;
+	overflow: auto;
+	padding: 0;
+	resize: none;
+}
+.ke-dialog-body textarea:focus,
+.ke-dialog-body input:focus,
+.ke-dialog-body select:focus {
+	outline: none;
+}
+.ke-dialog-body label {
+	margin-right: 10px;
+	cursor: pointer;
+	display: -moz-inline-stack;
+	display: inline-block;
+	vertical-align: middle;
+	zoom: 1;
+	*display: inline;
+}
+.ke-dialog-body img {
+	display: -moz-inline-stack;
+	display: inline-block;
+	vertical-align: middle;
+	zoom: 1;
+	*display: inline;
+}
+.ke-dialog-body select {
+	display: -moz-inline-stack;
+	display: inline-block;
+	vertical-align: middle;
+	zoom: 1;
+	*display: inline;
+	width: auto;
+}
+.ke-dialog-body .ke-textarea {
+	display: block;
+	width: 408px;
+	height: 260px;
+	font-family: "sans serif",tahoma,verdana,helvetica;
+	font-size: 12px;
+	border-color: #848484 #E0E0E0 #E0E0E0 #848484;
+	border-style: solid;
+	border-width: 1px;
+}
+.ke-dialog-body .ke-form {
+	margin: 0;
+	padding: 0;
+}
+.ke-dialog-loading {
+	position: absolute;
+	top: 0;
+	left: 1px;
+	z-index: 1;
+	text-align: center;
+}
+.ke-dialog-loading-content {
+	background: url("../common/loading.gif") no-repeat;
+    color: #666;
+    font-size: 14px;
+    font-weight: bold;
+    height: 31px;
+    line-height: 31px;
+    padding-left: 36px;
+}
+.ke-dialog-row {
+	margin-bottom: 10px;
+}
+.ke-dialog-footer {
+	font: 12px/1 "sans serif",tahoma,verdana,helvetica;
+	text-align: right;
+	padding:0 0 5px 0;
+	background-color: #FFF;
+	width: 100%;
+}
+.ke-dialog-preview,
+.ke-dialog-yes {
+	margin: 5px;
+}
+.ke-dialog-no {
+	margin: 5px 10px 5px 5px;
+}
+.ke-dialog-mask {
+	background-color:#FFF;
+	filter:alpha(opacity=50);
+	opacity:0.5;
+}
+.ke-button-common {
+	background: url(background.png) no-repeat scroll 0 -25px transparent;
+	cursor: pointer;
+	height: 23px;
+	line-height: 23px;
+	overflow: visible;
+	display: inline-block;
+	vertical-align: top;
+	cursor: pointer;
+}
+.ke-button-outer {
+	background-position: 0 -25px;
+	padding: 0;
+	position: relative;
+	display: -moz-inline-stack;
+	display: inline-block;
+	vertical-align: middle;
+	zoom: 1;
+	*display: inline;
+}
+.ke-button {
+	background-position: right -25px;
+	padding: 0 12px;
+	margin: 0;
+	font-family: "sans serif",tahoma,verdana,helvetica;
+	border: 0 none;
+	color: #333;
+	font-size: 12px;
+	left: 2px;
+	text-decoration: none;
+}
+/* inputbox */
+.ke-input-text {
+	background-color:#FFFFFF;
+	font-family: "sans serif",tahoma,verdana,helvetica;
+	font-size: 12px;
+	line-height: 17px;
+	height: 17px;
+	padding: 2px 4px;
+	border-color: #848484 #E0E0E0 #E0E0E0 #848484;
+	border-style: solid;
+	border-width: 1px;
+	display: -moz-inline-stack;
+	display: inline-block;
+	vertical-align: middle;
+	zoom: 1;
+	*display: inline;
+}
+.ke-input-number {
+	width: 50px;
+}
+.ke-input-color {
+	border: 1px solid #A0A0A0;
+	background-color: #FFFFFF;
+	font-size: 12px;
+	width: 60px;
+	height: 20px;
+	line-height: 20px;
+	padding-left: 5px;
+	overflow: hidden;
+	cursor: pointer;
+	display: -moz-inline-stack;
+	display: inline-block;
+	vertical-align: middle;
+	zoom: 1;
+	*display: inline;
+}
+.ke-upload-button {
+	position: relative;
+}
+.ke-upload-area {
+	position: relative;
+	overflow: hidden;
+	margin: 0;
+	padding: 0;
+}
+.ke-upload-area .ke-upload-file {
+	position: absolute;
+	top: 0;
+	right: 0;
+	height: 25px;
+	padding: 0;
+	margin: 0;
+	z-index: 811212;
+	border: 0 none;
+	opacity: 0;
+	filter: alpha(opacity=0);
+}
+/* tabs */
+.ke-tabs {
+	font: 12px/1 "sans serif",tahoma,verdana,helvetica;
+	border-bottom:1px solid #A0A0A0;
+	padding-left:5px;
+	margin-bottom:20px;
+}
+.ke-tabs-ul  {
+	list-style-image:none;
+	list-style-position:outside;
+	list-style-type:none;
+	margin:0;
+	padding:0;
+}
+.ke-tabs-li {
+	position: relative;
+	border: 1px solid #A0A0A0;
+	background-color: #F0F0EE;
+	margin: 0 2px -1px 0;
+	padding: 0 20px;
+	float: left;
+	line-height: 25px;
+	text-align: center;
+	color: #555555;
+	cursor: pointer;
+}
+.ke-tabs-li-selected {
+	background-color: #FFF;
+	border-bottom: 1px solid #FFF;
+	color: #000;
+	cursor: default;
+}
+.ke-tabs-li-on {
+	background-color: #FFF;
+	color: #000;
+}
+/* progressbar */
+.ke-progressbar {
+	position: relative;
+	margin: 0;
+	padding: 0;
+}
+.ke-progressbar-bar {
+	border: 1px solid #6FA5DB;
+	width: 80px;
+	height: 5px;
+	margin: 10px 10px 0 10px;
+	padding: 0;
+}
+.ke-progressbar-bar-inner {
+	width: 0;
+	height: 5px;
+	background-color: #6FA5DB;
+	overflow: hidden;
+	margin: 0;
+	padding: 0;
+}
+.ke-progressbar-percent {
+	position: absolute;
+	top: 0;
+	left: 40%;
+	display: none;
+}
+/* swfupload */
+.ke-swfupload-top {
+	position: relative;
+	margin-bottom: 10px;
+	_width: 608px;
+}
+.ke-swfupload-button {
+	height: 23px;
+	line-height: 23px;
+}
+.ke-swfupload-desc {
+	padding: 0 10px;
+	height: 23px;
+	line-height: 23px;
+}
+.ke-swfupload-startupload {
+	position: absolute;
+	top: 0;
+	right: 0;
+}
+.ke-swfupload-body {
+	overflow: scroll;
+	background-color:#FFFFFF;
+	border-color: #848484 #E0E0E0 #E0E0E0 #848484;
+	border-style: solid;
+	border-width: 1px;
+	width: auto;
+	height: 370px;
+	padding: 5px;
+}
+.ke-swfupload-body .ke-item {
+	width: 100px;
+	margin: 5px;
+}
+.ke-swfupload-body .ke-photo {
+	position: relative;
+	border: 1px solid #DDDDDD;
+	background-color:#FFFFFF;
+	padding: 10px;
+}
+.ke-swfupload-body .ke-delete {
+	display: block;
+	background: url(default.png) no-repeat scroll 0px -688px;
+	width: 16px;
+	height: 16px;
+	position: absolute;
+	right: 0;
+	top: 0;
+	cursor: pointer;
+}
+.ke-swfupload-body .ke-status  {
+	position: absolute;
+	left: 0;
+	bottom: 5px;
+	width: 100px;
+	height: 17px;
+}
+.ke-swfupload-body .ke-message  {
+	width: 100px;
+	text-align: center;
+	overflow: hidden;
+	height:17px;
+}
+.ke-swfupload-body .ke-error  {
+	color: red;
+}
+.ke-swfupload-body .ke-name {
+	width: 100px;
+	text-align: center;
+	overflow: hidden;
+	height:16px;
+}
+.ke-swfupload-body .ke-on {
+	border: 1px solid #5690D2;
+	background-color: #E9EFF6;
+}
+
+/* emoticons */
+.ke-plugin-emoticons {
+	position: relative;
+}
+.ke-plugin-emoticons .ke-preview {
+	position: absolute;
+	text-align: center;
+	margin: 2px;
+	padding: 10px;
+	top: 0;
+	border: 1px solid #A0A0A0;
+	background-color: #FFFFFF;
+	display: none;
+}
+.ke-plugin-emoticons .ke-preview-img {
+	border:0;
+	margin:0;
+	padding:0;
+}
+.ke-plugin-emoticons .ke-table {
+	border:0;
+	margin:0;
+	padding:0;
+	border-collapse:separate;
+}
+.ke-plugin-emoticons .ke-cell {
+	margin:0;
+	padding:1px;
+	border:1px solid #F0F0EE;
+	cursor:pointer;
+}
+.ke-plugin-emoticons .ke-on {
+	border: 1px solid #5690D2;
+	background-color: #E9EFF6;
+}
+.ke-plugin-emoticons .ke-img {
+	display:block;
+	background-repeat:no-repeat;
+	overflow:hidden;
+	margin:2px;
+	width:24px;
+	height:24px;
+	margin: 0;
+	padding: 0;
+	border: 0;
+}
+.ke-plugin-emoticons .ke-page {
+	text-align: right;
+	margin: 5px;
+	padding: 0;
+	border: 0;
+	font: 12px/1 "sans serif",tahoma,verdana,helvetica;
+	color: #333;
+	text-decoration: none;
+}
+.ke-plugin-plainpaste-textarea,
+.ke-plugin-wordpaste-iframe {
+	display: block;
+	width: 408px;
+	height: 260px;
+	font-family: "sans serif",tahoma,verdana,helvetica;
+	font-size: 12px;
+	border-color: #848484 #E0E0E0 #E0E0E0 #848484;
+	border-style: solid;
+	border-width: 1px;
+}
+/* filemanager */
+.ke-plugin-filemanager-header {
+	width: 100%;
+	margin-bottom: 10px;
+}
+.ke-plugin-filemanager-header .ke-left {
+	float: left;
+}
+.ke-plugin-filemanager-header .ke-right {
+	float: right;
+}
+.ke-plugin-filemanager-body {
+	overflow: scroll;
+	background-color:#FFFFFF;
+	border-color: #848484 #E0E0E0 #E0E0E0 #848484;
+	border-style: solid;
+	border-width: 1px;
+	width: auto;
+	height: 370px;
+	padding: 5px;
+}
+.ke-plugin-filemanager-body .ke-item {
+	width: 100px;
+	margin: 5px;
+}
+.ke-plugin-filemanager-body .ke-photo {
+	border: 1px solid #DDDDDD;
+	background-color:#FFFFFF;
+	padding: 10px;
+}
+.ke-plugin-filemanager-body .ke-name {
+	width: 100px;
+	text-align: center;
+	overflow: hidden;
+	height:16px;
+}
+.ke-plugin-filemanager-body .ke-on {
+	border: 1px solid #5690D2;
+	background-color: #E9EFF6;
+}
+.ke-plugin-filemanager-body .ke-table {
+	width: 95%;
+	border: 0;
+	margin: 0;
+	padding: 0;
+	border-collapse: separate;
+}
+.ke-plugin-filemanager-body .ke-table .ke-cell {
+	margin: 0;
+	padding: 0;
+	border: 0;
+}
+.ke-plugin-filemanager-body .ke-table .ke-name {
+	width: 55%;
+	text-align: left;
+}
+.ke-plugin-filemanager-body .ke-table .ke-size {
+	width: 15%;
+	text-align: left;
+}
+.ke-plugin-filemanager-body .ke-table .ke-datetime {
+	width: 30%;
+	text-align: center;
+}
+
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/themes/default/default.png b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/themes/default/default.png
new file mode 100644
index 0000000..cc9e72d
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/themes/default/default.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/themes/qq/editor.gif b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/themes/qq/editor.gif
new file mode 100644
index 0000000..b256841
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/themes/qq/editor.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/themes/qq/qq.css b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/themes/qq/qq.css
new file mode 100644
index 0000000..a45e08c
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/themes/qq/qq.css
@@ -0,0 +1,143 @@
+/* container */
+.ke-container-qq {
+	display: block;
+	border: 1px solid #c3c3c3;
+	background-color: #FFF;
+	overflow: hidden;
+	margin: 0;
+	padding: 0;
+}
+/* toolbar */
+.ke-container-qq .ke-toolbar {
+	border-bottom: 1px solid #c3c3c3;
+	background-color: #FFFFFF;
+	padding: 2px 5px;
+	text-align: left;
+	overflow: hidden;
+	zoom: 1;
+}
+.ke-toolbar-icon-url {
+	background-image: url(editor.gif);
+	width:18px;
+	*xwidth:20px;
+	height:18px;
+	*xheight:20px;
+}
+.ke-icon-checked{
+	background-image: url(../default/default.png);
+	width:16px;
+	height:16px;
+}
+.ke-container-qq .ke-icon-bold{
+	background-position: 4px 1px;
+}
+.ke-container-qq .ke-icon-italic{
+	background-position: -27px 1px;
+}
+.ke-container-qq .ke-icon-italic{
+	background-position: -28px 1px;
+}
+.ke-container-qq .ke-icon-underline{
+	background-position: -60px 1px;
+}
+.ke-container-qq .ke-icon-fontname{
+	background-position: -95px 1px;
+}
+.ke-container-qq .ke-icon-fontsize{
+	background-position: -128px 1px;
+}
+.ke-container-qq .ke-icon-forecolor{
+	background-position: -159px 1px;
+}
+.ke-container-qq .ke-icon-hilitecolor{
+	background-position: -190px 1px;
+}
+.ke-container-qq .ke-icon-plug-align{
+	background-position: -223px 1px;
+}
+.plug-align-justifyleft{
+	background-position: -350px 1px;
+}
+.plug-align-justifycenter{
+	background-position: -382px 1px;
+}
+.plug-align-justifyright{
+	background-position: -414px 1px;
+}
+.plug-order-insertorderedlist{
+	background-position: -446px 1px;
+}
+.plug-order-insertunorderedlist{
+	background-position: -477px 1px;
+}
+.plug-indent-indent{
+	background-position: -513px 1px;
+}
+.plug-indent-outdent{
+	background-position: -545px 1px;
+}
+.ke-container-qq .ke-icon-plug-order{
+	background-position: -255px 1px;
+}
+.ke-container-qq .ke-icon-plug-indent{
+	background-position: -287px 1px;
+}
+.ke-container-qq .ke-icon-link{
+	background-position: -319px 1px;
+}
+
+.ke-container-qq .ke-toolbar .ke-outline {
+	cursor: default;
+	padding:0px;
+	border:1px solid #fff;
+}
+.ke-container-qq .ke-toolbar .ke-on {
+	border-left:1px solid white;
+	border-top:1px solid white;
+	border-right:1px solid gray;
+	border-bottom:1px solid gray;
+	background-color: #FFFFFF;
+}
+.ke-container-qq .ke-toolbar .ke-selected {
+	border-left:1px solid gray;
+	border-top:1px solid gray;
+	border-right:1px solid white;
+	border-bottom:1px solid white;
+	background-color: #FFFFFF;
+}
+.ke-container-qq .ke-toolbar  .ke-disabled {
+	cursor: default;
+}
+
+.ke-colorpicker-qq{
+	background:#fff;
+}
+/* statusbar */
+.ke-container-qq .ke-statusbar {
+	display:none;
+}
+/* menu */
+.ke-menu-qq {
+	border:1px solid #a6a6a6;
+	position:absolute;
+	background:#fff;
+	-moz-box-shadow:2px 2px 4px #DDDDDD;
+	z-index:999;
+	left:-400px;
+	top:-386px;
+	right:218px;
+	width:130px;
+}
+.ke-menu-qq .ke-menu-item {
+	padding:0px;
+	background:#fff;
+}
+.ke-menu-qq .ke-menu-item-on {
+	border:1px solid #000080;background:#FFEEC2;color:#036;
+}
+.ke-menu-qq .ke-toolbar .ke-selected {
+	border:1px solid #9a9afb;
+}
+.ke-menu-qq .ke-menu-item-left{
+	width:auto;
+}
diff --git a/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/themes/simple/simple.css b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/themes/simple/simple.css
new file mode 100644
index 0000000..4c76cf9
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/kindeditor-4.1.7/themes/simple/simple.css
@@ -0,0 +1,100 @@
+/* container */
+.ke-container-simple {
+	display: block;
+	border: 1px solid #CCC;
+	background-color: #FFF;
+	overflow: hidden;
+}
+/* toolbar */
+.ke-container-simple .ke-toolbar {
+	border-bottom: 1px solid #CCC;
+	background-color: #FFF;
+	padding: 2px 5px;
+	overflow: hidden;
+}
+.ke-container-simple .ke-toolbar .ke-outline {
+	border: 1px solid #FFF;
+	background-color: transparent;
+	margin: 1px;
+	padding: 1px 2px;
+	font-size: 0;
+	line-height: 0;
+	overflow: hidden;
+	cursor: pointer;
+}
+.ke-container-simple .ke-toolbar .ke-on {
+	border: 1px solid #5690D2;
+}
+.ke-container-simple .ke-toolbar .ke-selected {
+	border: 1px solid #5690D2;
+	background-color: #E9EFF6;
+}
+.ke-container-simple .ke-toolbar  .ke-disabled {
+	cursor: default;
+}
+/* statusbar */
+.ke-container-simple .ke-statusbar {
+	position: relative;
+	background-color: #FFF;
+	border-top: 1px solid #CCCCCC;
+	font-size: 0;
+	line-height: 0;
+	*height: 12px;
+	overflow: hidden;
+	text-align: center;
+	cursor: s-resize;
+}
+/* menu */
+.ke-menu-simple {
+	border: 1px solid #A0A0A0;
+	background-color: #FFF;
+	color: #222222;
+	padding: 2px;
+	font-family: "sans serif",tahoma,verdana,helvetica;
+	font-size: 12px;
+	text-align: left;
+	overflow: hidden;
+}
+.ke-menu-simple .ke-menu-item {
+	border: 1px solid #FFF;
+	background-color: #FFF;
+	color: #222222;
+	height: 24px;
+	overflow: hidden;
+	cursor: pointer;
+}
+.ke-menu-simple .ke-menu-item-on {
+	border: 1px solid #5690D2;
+	background-color: #FFF;
+}
+/* colorpicker */
+.ke-colorpicker-simple {
+	border: 1px solid #A0A0A0;
+	background-color: #FEFEFE;
+	color: #222222;
+	padding: 2px;
+}
+.ke-colorpicker-simple .ke-colorpicker-cell {
+	font-size: 0;
+	line-height: 0;
+	border: 1px solid #FEFEFE;
+	cursor: pointer;
+	margin:3px;
+	padding:0;
+}
+.ke-colorpicker-simple .ke-colorpicker-cell-top {
+	font-family: "sans serif",tahoma,verdana,helvetica;
+	font-size: 12px;
+	line-height: 24px;
+	border: 1px solid #FEFEFE;
+	cursor: pointer;
+	margin:0;
+	padding:0;
+	text-align: center;
+}
+.ke-colorpicker-simple .ke-colorpicker-cell-on {
+	border: 1px solid #5690D2;
+}
+.ke-colorpicker-simple .ke-colorpicker-cell-selected {
+	border: 1px solid #2446AB;
+}
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/alicon/alicon.css b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/alicon/alicon.css
new file mode 100644
index 0000000..18cf279
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/alicon/alicon.css
@@ -0,0 +1,113 @@
+@font-face {font-family: "layui-icon";
+  src: url('iconfont.eot?t=1596095376802'); /* IE9 */
+  src: url('iconfont.eot?t=1596095376802#iefix') format('embedded-opentype'), /* IE6-IE8 */
+  url('data:application/x-font-woff2;charset=utf-8;base64,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') format('woff2'),
+  url('iconfont.woff?t=1596095376802') format('woff'),
+  url('iconfont.ttf?t=1596095376802') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */
+  url('iconfont.svg?t=1596095376802#iconfont') format('svg'); /* iOS 4.1- */
+}
+
+.layui-icon {
+  font-family: "layui-icon" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+.layui-icon-92:before {
+  content: "\e676";
+}
+
+.layui-icon-jihua:before {
+  content: "\e639";
+}
+
+.layui-icon-shouye:before {
+  content: "\e614";
+}
+
+.layui-icon-dongjie2:before {
+  content: "\e656";
+}
+
+.layui-icon-zhihangzhong:before {
+  content: "\e841";
+}
+
+.layui-icon-fq_jiagong:before {
+  content: "\e62b";
+}
+
+.layui-icon-manage-process:before {
+  content: "\e746";
+}
+
+.layui-icon-web-icon-:before {
+  content: "\e70c";
+}
+
+.layui-icon-jiankong:before {
+  content: "\e69e";
+}
+
+.layui-icon-web-icon-1:before {
+  content: "\e71a";
+}
+
+.layui-icon-renwuguanli:before {
+  content: "\e699";
+}
+
+.layui-icon-quanxian:before {
+  content: "\e642";
+}
+
+.layui-icon-xiaoxizhongxin:before {
+  content: "\e678";
+}
+
+.layui-icon-wenjianguanli:before {
+  content: "\e62c";
+}
+
+.layui-icon-wj-jh:before {
+  content: "\e70e";
+}
+
+.layui-icon-eduguanli:before {
+  content: "\e609";
+}
+
+.layui-icon-RectangleCopy:before {
+  content: "\e6ad";
+}
+
+.layui-icon-tubiao_shengchangongyi:before {
+  content: "\e63a";
+}
+
+.layui-icon-shoudong:before {
+  content: "\e729";
+}
+
+.layui-icon-zuzhi:before {
+  content: "\e616";
+}
+
+.layui-icon-jichushuju:before {
+  content: "\e74e";
+}
+
+.layui-icon-ziyuan145:before {
+  content: "\e6e9";
+}
+
+.layui-icon-peizhizhongxin:before {
+  content: "\e610";
+}
+
+.layui-icon-paigongfenpeishebei:before {
+  content: "\e635";
+}
+
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/alicon/iconfont.eot b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/alicon/iconfont.eot
new file mode 100644
index 0000000..cf8e2fc
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/alicon/iconfont.eot
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/alicon/iconfont.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/alicon/iconfont.js
new file mode 100644
index 0000000..9f40c6e
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/alicon/iconfont.js
@@ -0,0 +1 @@
+!function(c){var h,a,l,t,o,s,i,e='<svg><symbol id="icon-92" viewBox="0 0 1024 1024"><path d="M532.252444 170.666667l-17.521778 0c-9.363911 0-16.952889-7.588978-16.952889-16.952889l0-0.568889c0-21.742933-17.624178-39.367111-39.367111-39.367111l-0.910222 0c-21.742933 0-39.367111 17.624178-39.367111 39.367111l0 0.568889c0 9.363911-7.588978 16.952889-16.952889 16.952889l-17.521778 0c-18.659556 0-33.792 15.132444-33.792 33.792l0 0.682667c0 18.659556 15.132444 33.792 33.792 33.792l148.593778 0c18.659556 0 33.792-15.132444 33.792-33.792l0-0.682667C566.044444 185.799111 550.912 170.666667 532.252444 170.666667zM457.955556 170.666667c-9.4208 0-17.066667-7.645867-17.066667-17.066667s7.645867-17.066667 17.066667-17.066667 17.066667 7.645867 17.066667 17.066667S467.376356 170.666667 457.955556 170.666667zM533.936356 830.577778 247.466667 830.577778c-25.133511 0-45.511111-20.3776-45.511111-45.511111L201.955556 238.933333c0-25.133511 20.3776-45.511111 34.133333-45.511111l92.205511 0c-0.773689 3.777422-1.183289 7.691378-1.183289 11.719111 0 31.175111 25.361067 56.547556 56.547556 56.547556l148.593778 0c31.186489 0 56.547556-25.361067 56.547556-57.230222 0-3.777422-0.4096-7.463822-1.115022-11.036444l69.381689 0c36.511289 0 56.888889 20.3776 56.888889 45.511111l0 341.9136C710.178133 580.608 706.423467 580.266667 702.577778 580.266667c-15.735467 0-30.936178 2.218667-45.511111 5.996089L657.066667 318.577778l-398.222222 0 0 455.111111 262.269156 0C522.353778 793.691022 526.722844 812.828444 533.936356 830.577778zM702.577778 614.4c-81.692444 0-147.911111 66.218667-147.911111 147.911111s66.218667 147.911111 147.911111 147.911111 147.911111-66.218667 147.911111-147.911111S784.270222 614.4 702.577778 614.4zM799.232 731.921067l-91.022222 102.4C703.726933 839.361422 697.480533 841.955556 691.188622 841.955556c-4.994844 0-10.012444-1.6384-14.210844-4.983467l-56.888889-45.511111c-9.807644-7.839289-11.400533-22.163911-3.549867-31.982933 7.839289-9.819022 22.175289-11.411911 31.982933-3.549867l40.015644 32.005689 76.674844-86.254933c8.339911-9.386667 22.7328-10.24 32.119467-1.888711S807.583289 722.523022 799.232 731.921067z"  ></path></symbol><symbol id="icon-jihua" viewBox="0 0 1024 1024"><path d="M674.507676 598.338391 287.079856 598.338391c-14.136975 0-25.638937 11.499915-25.638937 25.63689 0 14.137998 11.501962 25.640983 25.638937 25.640983l387.42782 0c14.137998 0 25.640983-11.501962 25.640983-25.640983C700.148659 609.838306 688.646698 598.338391 674.507676 598.338391zM794.746154 384.583029c-14.137998 0-25.640983 11.501962-25.640983 25.63996l0 494.299873c0 0.130983 0 0.280386-0.001023 0.433882-0.899486 0.279363-2.665713 0.644683-5.764284 0.644683L200.047664 905.601426c-4.312212 0-7.564279-2.971681-7.564279-6.913457L192.483384 191.851493c0-4.493338 0.974188-8.28878 1.811252-9.821693l373.337917 0c14.136975 0 25.63996-11.501962 25.63996-25.63996 0-14.136975-11.501962-25.638937-25.63996-25.638937l-374.069581 0c-30.336936 0-52.357462 25.696242-52.357462 61.099566l0 706.836477c0 32.086789 26.396183 58.19133 58.84113 58.19133l563.293223 0c34.119075 0 57.042157-21.041222 57.042157-52.356438L820.382021 410.224012C820.383044 396.086014 808.883129 384.583029 794.746154 384.583029zM674.507676 745.295394 287.079856 745.295394c-14.136975 0-25.638937 11.499915-25.638937 25.63689 0 14.137998 11.501962 25.640983 25.638937 25.640983l387.42782 0c14.137998 0 25.640983-11.501962 25.640983-25.640983C700.148659 756.795309 688.646698 745.295394 674.507676 745.295394zM879.595634 157.107177c-3.77293-14.409175-12.871145-28.250414-24.964578-37.975916l-43.827181-35.240619c-12.880355-10.352789-29.27679-16.290011-44.986587-16.290011-16.876366 0-31.594579 6.747681-41.439808 18.995633l-19.624966 24.381293c-6.380314 7.968485-7.987928 17.577331-5.222955 26.916023l-114.241904 142.063553-2.486634 3.090385-22.812565 85.303828c-9.749038 30.859845 4.449335 48.075949 13.806447 55.608505 6.783497 5.450129 14.468526 8.728802 22.851451 9.754155 0.984421 0.246617 2.125407 0.488117 3.440355 0.632403 1.003863 0.110517 2.053776 0.167822 3.118014 0.167822l0.014326 0c4.588505 0 10.047844-0.9967 17.180288-3.13541l2.877537-1.065262 83.402525-41.897226 119.874181-149.07934c0.440022 0.017396 0.880043 0.032746 1.320065 0.032746 9.218966 0 17.411555-3.862981 23.077601-10.892071l19.562545-24.342408C880.924909 191.1976 884.15037 174.495196 879.595634 157.107177zM674.469813 348.564697l-56.738235 28.537963c-2.958378 0.579191-5.734608 1.684362-8.277524 3.296069-0.313132 0.198521-0.615007 0.385786-0.905626 0.562818 0.12382-0.318248 0.25378-0.639566 0.39295-0.971118 0.99977-2.437515 1.588171-5.022387 1.753947-7.702426l17.732873-66.078974 105.73209-131.488707 48.647977 39.113833L674.469813 348.564697zM831.385633 172.919305l-7.679913 9.550517-68.139913-54.779627 7.687076-9.56382c0.291642-0.132006 1.144056-0.38374 2.604314-0.38374 4.28356 0 9.735735 2.071172 13.570063 5.15644l43.832298 35.245735c3.493567 2.805906 6.421246 7.018857 7.642051 10.993378C831.497173 171.081447 831.492056 172.446537 831.385633 172.919305zM487.474932 291.067168l-200.394053 0c-14.136975 0-25.638937 11.501962-25.638937 25.63996 0 14.136975 11.501962 25.637913 25.638937 25.637913l200.394053 0c14.137998 0 25.63996-11.500938 25.63996-25.637913C513.114892 302.56913 501.611907 291.067168 487.474932 291.067168zM674.507676 438.023148 287.079856 438.023148c-14.136975 0-25.638937 11.500938-25.638937 25.638937s11.501962 25.638937 25.638937 25.638937l387.42782 0c14.137998 0 25.640983-11.501962 25.640983-25.638937S688.646698 438.023148 674.507676 438.023148z"  ></path></symbol><symbol id="icon-shouye" viewBox="0 0 1024 1024"><path d="M387.018497 210.626092c17.179264 0 31.099299-13.925151 31.099299-31.099299l0-10.366092 186.597839 0 0 10.366092c0 17.175171 13.920034 31.099299 31.099299 31.099299s31.099299-13.925151 31.099299-31.099299L666.914232 96.593965c0-17.175171-13.920034-31.099299-31.099299-31.099299s-31.099299 13.925151-31.099299 31.099299l0 10.366092L418.117796 106.960057l0-10.366092c0-17.175171-13.920034-31.099299-31.099299-31.099299s-31.099299 13.925151-31.099299 31.099299l0 82.932828C355.919199 196.700941 369.83821 210.626092 387.018497 210.626092z"  ></path><path d="M400.416646 314.944995c-17.179264 0-31.099299 13.925151-31.099299 31.099299l0 30.340005c0 17.175171 13.920034 31.099299 31.099299 31.099299s31.099299-13.925151 31.099299-31.099299L431.515944 346.044294C431.516967 328.869123 417.596933 314.944995 400.416646 314.944995z"  ></path><path d="M622.416785 314.944995c-17.179264 0-31.099299 13.925151-31.099299 31.099299l0 30.340005c0 17.175171 13.920034 31.099299 31.099299 31.099299s31.099299-13.925151 31.099299-31.099299L653.516084 346.044294C653.517107 328.869123 639.597073 314.944995 622.416785 314.944995z"  ></path><path d="M511.103584 546.380018c43.773969 0 74.783217-30.18344 86.212524-48.016597 9.182127-14.33038 5.021364-33.210379-9.202593-42.569538-14.213723-9.379625-33.428344-5.385661-42.974767 8.706289-0.132006 0.197498-13.555737 19.680225-34.035164 19.680225-19.903306 0-32.29452-18.039865-33.124422-19.290345-9.151427-14.349823-28.173666-18.72855-42.650379-9.718339-14.588253 9.06547-19.072381 28.245298-10.001795 42.832528C436.493306 515.968381 467.116767 546.380018 511.103584 546.380018z"  ></path><path d="M463.633433 898.665457 266.173199 898.665457c-41.648562 0-75.532277-34.713616-75.532277-77.374228l0-574.913888c0-42.665729 33.883715-77.374228 75.532277-77.374228 17.179264 0 31.099299-13.925151 31.099299-31.099299s-13.920034-31.099299-31.099299-31.099299c-75.946716 0-137.730874 62.61406-137.730874 139.573849l0 574.913888c0 76.959789 61.784158 139.573849 137.730874 139.573849L463.633433 960.866101c17.179264 0 31.099299-13.920034 31.099299-31.099299S480.81372 898.665457 463.633433 898.665457z"  ></path><path d="M756.661256 106.803491c-17.179264 0-31.099299 13.925151-31.099299 31.099299s13.920034 31.099299 31.099299 31.099299c41.648562 0 75.532277 34.7085 75.532277 77.374228L832.193533 551.401382c0 17.175171 13.920034 31.099299 31.099299 31.099299s31.099299-13.925151 31.099299-31.099299L894.39213 246.37734C894.39213 169.417551 832.607972 106.803491 756.661256 106.803491z"  ></path><path d="M840.980663 650.76953 613.392248 885.125069l-110.711498-114.006544c-11.975752-12.325723-31.655977-12.614296-43.976584-0.647753-12.320607 11.966543-12.614296 31.655977-0.647753 43.976584l133.023666 136.981814c0.10847 0.110517 0.23843 0.183172 0.347924 0.291642 0.11154 0.11154 0.186242 0.245593 0.299829 0.356111 0.771573 0.74906 1.644453 1.311879 2.470261 1.963725 0.704035 0.556679 1.363044 1.183965 2.101871 1.671059 1.031493 0.680499 2.131547 1.187035 3.219321 1.731434 0.730641 0.366344 1.426489 0.816598 2.178619 1.121544 1.25048 0.50756 2.548032 0.823761 3.841491 1.162476 0.642636 0.167822 1.26276 0.429789 1.912559 0.555655 1.961678 0.38067 3.949962 0.581238 5.939269 0.581238s3.977591-0.200568 5.939269-0.581238c0.650823-0.12689 1.269923-0.387833 1.912559-0.555655 1.293459-0.338714 2.591011-0.654916 3.841491-1.162476 0.75213-0.304945 1.447978-0.7552 2.178619-1.121544 1.087774-0.544399 2.187829-1.050935 3.219321-1.731434 0.738827-0.487094 1.397836-1.11438 2.101871-1.671059 0.825808-0.651846 1.698688-1.215688 2.470261-1.963725 0.113587-0.110517 0.188288-0.24457 0.299829-0.356111 0.109494-0.10847 0.239454-0.181125 0.347924-0.291642l249.900583-257.331833c11.966543-12.320607 11.672854-32.011064-0.647753-43.976584C872.637664 638.160351 852.956416 638.438691 840.980663 650.76953z"  ></path></symbol><symbol id="icon-dongjie2" viewBox="0 0 1024 1024"><path d="M364.851804 792.021585c-116.75667-16.679524-212.024383-57.201559-261.142001-109.798341L103.709803 745.973818l0 36.224243c0 77.155591 156.153093 163.111422 380.149895 163.111422 1.534926 0 2.967523 0 4.502448 0C432.2862 909.187569 388.489657 855.465174 364.851804 792.021585z"  ></path><path d="M655.873688 422.616169C511.693015 422.616169 394.322374 539.884481 394.322374 684.065154S511.693015 945.616468 655.873688 945.616468s261.551314-117.268312 261.551314-261.448986C917.322674 539.884481 800.054362 422.51384 655.873688 422.616169zM494.706505 684.065154c0-88.821025 72.243829-161.064855 161.064855-161.064855 25.684421 0 49.526931 6.549016 71.015889 17.293495L512.102328 755.183372C501.35785 733.694414 494.706505 709.749575 494.706505 684.065154zM655.77136 845.232337c-26.503048 0-51.164185-7.060658-73.267113-18.521435l215.912861-215.912861c11.460777 22.102928 18.521435 46.764065 18.521435 73.267113C816.938543 772.988508 744.694714 845.130009 655.77136 845.232337z"  ></path><path d="M345.511742 684.065154c0-25.786749 3.172179-50.8572 9.107225-74.802039C242.569401 591.764965 151.394824 552.061557 103.709803 501.102029l0 39.191766 0 60.783052c0 60.987709 97.825922 127.603478 249.578895 152.673928C348.172279 731.340861 345.511742 708.009993 345.511742 684.065154z"  ></path><path d="M857.255921 448.198261c4.502448-9.516538 6.753672-19.033077 6.753672-28.344959l0-99.974818c-25.275107 27.117018-62.829619 50.959528-109.286699 70.094934C792.789048 402.662137 827.478365 422.616169 857.255921 448.198261z"  ></path><path d="M467.384831 437.760767c-162.292795-3.069851-300.74308-50.652543-363.572699-117.882282l0 99.974818c0 62.624963 103.044669 131.082642 261.755971 154.618167C386.238433 519.930449 421.848706 472.654742 467.384831 437.760767z"  ></path><path d="M530.112122 400.410912c38.475467-17.088838 81.044069-26.707705 125.761567-26.707705 10.335165 0 20.568002 0.511642 30.698511 1.534926 110.002998-31.41481 177.539722-85.955831 177.539722-136.710703 0-77.155591-156.153093-163.111422-380.149895-163.111422s-380.149895 85.955831-380.149895 163.111422c0 77.155591 156.153093 163.111422 380.149895 163.111422C499.618267 401.638853 515.069851 401.229539 530.112122 400.410912z"  ></path></symbol><symbol id="icon-zhihangzhong" viewBox="0 0 1024 1024"><path d="M511.071861 62.848397c-246.007927 0-447.287139 201.279213-447.287139 447.287139s201.279213 447.287139 447.287139 447.287139 447.287139-201.279213 447.28714-447.287139-201.279213-447.287139-447.28714-447.287139z m0 805.116851c-196.806341 0-357.829711-161.02337-357.829711-357.829712s161.02337-357.829711 357.829711-357.829711 357.829711 161.02337 357.829712 357.829711-161.02337 357.829711-357.829712 357.829712z"  ></path><path d="M332.157006 456.819237c31.989575 0 53.3163 21.326724 53.316299 53.316299 0 31.989575-21.326724 53.3163-53.316299 53.3163s-53.3163-21.326724-53.3163-53.3163c0-31.989575 21.326724-53.3163 53.3163-53.316299zM508.814448 456.819237c31.989575 0 53.3163 21.326724 53.316299 53.316299 0 31.989575-21.326724 53.3163-53.316299 53.3163s-53.3163-21.326724-53.3163-53.3163c0-31.989575 21.326724-53.3163 53.3163-53.316299zM683.022095 456.819237c31.989575 0 53.3163 21.326724 53.3163 53.316299 0 31.989575-21.326724 53.3163-53.3163 53.3163s-53.3163-21.326724-53.3163-53.3163c0-31.989575 21.326724-53.3163 53.3163-53.316299z"  ></path></symbol><symbol id="icon-fq_jiagong" viewBox="0 0 1024 1024"><path d="M914.773333 773.12l-221.866666-221.866667 221.866666-221.866666L723.626667 138.24l-221.866667 221.866667-221.866667-221.866667-158.72 158.72 221.866667 221.866667-158.72 158.72-32.426667 221.866666 221.866667-32.426666 158.72-158.72 221.866667 221.866666 160.426666-157.013333zM723.626667 201.386667l126.293333 126.293333-63.146667 63.146667-126.293333-126.293334 63.146667-63.146666z m-413.013334 221.866666l63.146667-63.146666-32.426667-32.426667-63.146666 63.146667-32.426667-32.426667 63.146667-63.146667-32.426667-32.426666-63.146667 63.146666-32.426666-32.426666 95.573333-95.573334 191.146667 191.146667-95.573334 95.573333-61.44-61.44z m-126.293333 443.733334l23.893333-167.253334 8.533334 8.533334 126.293333 126.293333 8.533333 8.533333-167.253333 23.893334z m189.44-63.146667l-126.293333-126.293333 126.293333-126.293334 158.72-158.72 95.573333-95.573333 126.293334 126.293333-95.573334 95.573334-158.72 158.72-126.293333 126.293333z m382.293333 63.146667L723.626667 836.266667l63.146666-63.146667-32.426666-32.426667-63.146667 63.146667-32.426667-32.426667 63.146667-63.146666-32.426667-32.426667-63.146666 63.146667-63.146667-63.146667 95.573333-95.573333 191.146667 191.146666-93.866667 95.573334z" fill="" ></path></symbol><symbol id="icon-manage-process" viewBox="0 0 1024 1024"><path d="M796.6 635.5V482.2H534.4v-93.7h200v-320h-450v320h200v93.7h-257v153.3h-155v320h360v-320h-155V532.2h469.1v103.3h-155v320h360v-320H796.6z m-462.2-517h350v220h-350v-220z m48 787h-260v-220h260v220z m519.2 0h-260v-220h260v220z" fill="" ></path></symbol><symbol id="icon-web-icon-" viewBox="0 0 1024 1024"><path d="M742.592 495.68c-48.32 48.32-123.2 57.28-180.512 26.56l-253.792 251.2c-17.6 17.6-45.44 17.6-61.76 0-17.6-17.6-17.6-45.44 0-61.76l252.512-252.832c-30.72-58.88-23.36-132.16 26.56-180.832 29.44-29.44 67.52-44.16 105.6-44.16-40.96 42.56-39.68 110.08 1.6 152.64a108.672 108.672 0 0 0 152.64 1.6c-0.288 40.032-13.408 78.112-42.848 107.584z m70.4-191.072c-10.24 11.84-29.44 27.84-54.4 51.52-27.84 27.84-65.92 27.84-92.48 0-27.84-27.84-27.84-66.24 0-92.48 23.36-24.96 51.2-55.68 49.92-55.68a194.944 194.944 0 0 0-221.472 39.36c-54.4 54.4-70.4 133.76-47.04 202.912l-231.712 230.4a88.288 88.288 0 0 0 0 123.52c33.6 33.92 89.6 33.92 124.8 0l231.712-232.032c68.8 23.36 148.16 7.36 202.592-47.04 58.56-58.88 70.4-147.2 38.08-220.48z"  ></path><path d="M759.328 818.368h-5.472c-0.672-36.16-19.2-58.784-40.448-77.504-6.176-5.824-4.128-12.928 0-16.16 21.248-19.36 39.776-41.344 40.448-78.144h5.472c4.8 0 8.928-3.872 8.928-8.384 0-4.512-4.128-8.384-8.928-8.384h-134.4c-5.472-0.64-9.6 3.232-9.6 7.744s4.128 8.384 8.928 8.384h5.472c0.672 36.8 18.528 58.784 40.448 78.144a10.88 10.88 0 0 1 0 16.16c-21.248 18.72-39.776 41.344-40.448 77.504h-4.8c-4.8 0-8.928 3.872-8.928 8.384 0 4.512 4.128 8.384 8.928 8.384h135.072c4.8 0 8.928-3.872 8.928-8.384 0-3.84-4.096-7.744-9.6-7.744z m-14.368-171.776c0 11.616-2.752 21.952-6.176 31.008-15.776 4.512-78.176 4.512-93.952 0a73.888 73.888 0 0 1-6.176-31.008h106.304z m-53.504 158.24c-8.928 0-29.472 13.568-43.872 13.568h-8.928c0.672-30.368 15.072-49.728 33.6-66.528 4.8-4.512 12.352-14.208 19.872-14.208 7.552 0 15.072 10.336 19.872 14.848 18.528 16.8 32.928 36.16 33.6 66.528h-10.24c-14.432-0.672-34.304-14.208-43.904-14.208z m0 0"  ></path></symbol><symbol id="icon-jiankong" viewBox="0 0 1024 1024"><path d="M64 64V640H896V64H64zM0 0h960v704H0V0z"  ></path><path d="M192 896H768v64H192zM448 640H512v256h-64z"  ></path><path d="M479.232 561.604267l309.9904-348.330667-47.803733-42.5472-259.566934 291.669333L303.957333 240.008533 163.208533 438.6048l52.224 37.009067 91.6224-129.28z"  ></path></symbol><symbol id="icon-web-icon-1" viewBox="0 0 1024 1024"><path d="M684.768 895.072a168.032 168.032 0 1 1 0-336.128 168.032 168.032 0 1 1 0 336.128z m-126.048-168.064c0 27.136 8.736 52.064 23.328 72.64l175.36-175.36a125.248 125.248 0 0 0-72.64-23.328 126.016 126.016 0 0 0-126.048 126.048z m228.768-72.64l-175.36 175.36a125.248 125.248 0 0 0 72.64 23.328 126.08 126.08 0 0 0 126.048-126.048 125.024 125.024 0 0 0-23.328-72.64z m0 0"  ></path><path d="M494.912 423.296h213.088v71.872a21.792 21.792 0 1 0 43.488 0v-95.264a21.728 21.728 0 0 0-6.624-15.712L497.28 135.648a21.536 21.536 0 0 0-16.032-7.104H213.984A43.52 43.52 0 0 0 170.528 172.16v620.608a43.52 43.52 0 0 0 43.456 43.648h225.024v-0.288a21.76 21.76 0 0 0 0-43.072v-0.288H227.008a13.12 13.12 0 0 1-13.056-13.152V185.248c0-7.232 5.856-13.088 13.024-13.088h245.152v229.408a21.76 21.76 0 0 0 22.784 21.76z m20.672-207.488l163.264 163.872h-163.264V215.744v0.064z m0 0"  ></path></symbol><symbol id="icon-renwuguanli" viewBox="0 0 1025 1024"><path d="M768 160H640a128 128 0 0 0-247.93 0H256a64 64 0 0 0-64 64v672a64 64 0 0 0 64 64h512a64 64 0 0 0 64-64V224a64 64 0 0 0-64-64zM516 96a32 32 0 1 1-32 32 32 32 0 0 1 32-32z m252 800H256V224h512z"  ></path><path d="M477.73 672l45.25-45.25L704 445.73l-45.25-45.26-181.02 181.02-90.51-90.51-45.26 45.26 90.51 90.51L477.73 672z"  ></path></symbol><symbol id="icon-quanxian" viewBox="0 0 1024 1024"><path d="M645.1 531.9C753.7 458.3 782 310.6 708.4 202S487.2 65.2 378.6 138.8 241.7 360 315.3 468.6c16.9 24.9 38.4 46.4 63.3 63.3C214.8 579.6 96.7 712.5 96.7 869v59.2H334V869H156c0-160.9 153.9-292 345.7-296.4h20C577 573.8 631.5 586 682 608.7l-177.3 177-83.6-83.8-41.8 42 125.9 125.9 23.1-23.1L736 639.1c79.7 49.8 129.1 136.3 131.6 230.2H689.8v58.9h237.5V869c0-156.5-118.1-289.4-282.2-337.1z m-133.1-19c-98.2 0-177.8-79.6-177.8-177.8 0-98.2 79.6-177.8 177.8-177.8 98.2 0 177.8 79.6 177.8 177.8S610.2 512.9 512 512.9z"  ></path></symbol><symbol id="icon-xiaoxizhongxin" viewBox="0 0 1024 1024"><path d="M512 512.2l0.1-0.4-0.1 0.4zM512 937.4c-34.3 0-67.1-10.6-94.8-30.7-25.9-18.8-45.5-44.4-57-74.2H190.4c-21.9 0-41.1-11.5-51.4-30.8-10.3-19.3-9.3-41.7 2.9-59.9l49.6-74.3v-208c0-68.9 21.6-134.5 62.3-189.8 19.6-26.6 43.1-49.9 69.9-69.4 26.3-19.1 55.2-34.1 85.9-44.4 8-19.8 21.4-36.7 38.8-49.1 18.7-13.3 40.7-20.3 63.6-20.3s44.9 7 63.6 20.3c17.4 12.4 30.8 29.3 38.8 49.1 30.7 10.4 59.6 25.3 85.9 44.4 26.7 19.4 50.3 42.8 69.9 69.4 40.8 55.3 62.3 121 62.3 189.9v208l49.6 74.3c12.1 18.2 13.2 40.6 2.9 59.9-10.3 19.3-29.5 30.8-51.4 30.8H663.8c-11.4 29.8-31.1 55.4-57 74.2-27.7 20-60.5 30.6-94.8 30.6z m-106.6-169l13.8 38.8c6.8 19.2 19.1 35.7 35.6 47.6 16.7 12.1 36.4 18.5 57.2 18.5 20.7 0 40.5-6.4 57.2-18.6 16.5-11.9 28.8-28.4 35.6-47.6l13.7-38.7h204.1l-44.5-66.6-9.8-14.7V459.6c0-55.1-17.2-107.6-49.8-151.7-15.6-21.2-34.4-39.9-56-55.6-21.4-15.8-45.3-28-70.7-36.3l-26.7-8.7-9.7-26.3c-3.3-8.8-9.2-16.4-16.9-21.9-7.8-5.5-17-8.4-26.5-8.4s-18.7 2.9-26.5 8.4c-7.7 5.4-13.5 13-16.9 21.9l-9.8 26.2-26.6 8.8C406.9 224.3 383 236.5 361.4 252.3c-21.3 15.5-40.2 34.2-55.9 55.6-32.6 44.1-49.8 96.6-49.8 151.7V687l-9.8 14.7-44.5 66.7h204z"  ></path></symbol><symbol id="icon-wenjianguanli" viewBox="0 0 1024 1024"><path d="M98 351c-17.7 0-32-14.3-32-32V192.8c0-52.9 43.1-96 96-96h221c52.9 0 96 43.1 96 96V255c0 17.7-14.3 32-32 32s-32-14.3-32-32v-62.2c0-17.6-14.4-32-32-32H162c-17.6 0-32 14.4-32 32V319c0 17.6-14.3 32-32 32z"  ></path><path d="M864 926.6H383c-17.7 0-32-14.3-32-32s14.3-32 32-32h481c17.6 0 32-14.4 32-32V319c0-17.6-14.4-32-32-32H447c-17.7 0-32-14.3-32-32s14.3-32 32-32h417c52.9 0 96 43.1 96 96v511.7c0 52.9-43.1 95.9-96 95.9z"  ></path><path d="M383 926.6H162c-52.9 0-96-43.1-96-96V319c0-17.7 14.3-32 32-32s32 14.3 32 32v511.7c0 17.6 14.4 32 32 32h221c17.7 0 32 14.3 32 32 0 17.6-14.3 31.9-32 31.9zM768.1 511.2H256c-17.7 0-32-14.3-32-32s14.3-32 32-32h512.1c17.7 0 32 14.3 32 32s-14.3 32-32 32z"  ></path><path d="M768.1 703H256c-17.7 0-32-14.3-32-32s14.3-32 32-32h512.1c17.7 0 32 14.3 32 32s-14.3 32-32 32z"  ></path></symbol><symbol id="icon-wj-jh" viewBox="0 0 1024 1024"><path d="M324.1 288v128.3h-27.5v-98.8c-3.4 2.8-8 5.3-13.9 7.6-5.9 2.2-11.2 3.6-16.1 4.2v-22.4c15.4-4.3 28.8-10.6 40.1-18.8h17.4zM283.8 585.5H337v21.7h-83.4V598c0-6.5 1.2-12.5 3.6-17.9 2.4-5.4 5.7-10.4 9.9-15.1 4.2-4.7 10.7-10.1 19.6-16.4 8.1-6 13.8-11.4 17-16 3.2-4.7 4.9-9.6 4.9-14.8 0-11.3-6.2-16.9-18.5-16.9-10.8 0-21.1 4.3-30.9 12.9v-23.3c11-7.1 23.3-10.6 36.9-10.6 12.5 0 22.4 3.2 29.7 9.6s10.9 15.2 10.9 26.4c0 6.2-1.1 11.9-3.2 16.9-2.1 5-5.2 9.8-9.1 14.2-4 4.4-10.4 9.7-19.2 15.9-8.5 6-14.2 10.7-17.1 14-2.8 3.3-4.3 6.2-4.3 8.6zM256.8 770.1c8.2 6.1 17.7 9.2 28.6 9.2 6.9 0 12.4-1.5 16.4-4.6 4.1-3.1 6.1-7.4 6.1-13 0-5.8-2.4-10.2-7.2-13.3-4.8-3.1-11.6-4.6-20.2-4.6h-10.9v-19.6h10c16.4 0 24.6-5.5 24.6-16.6 0-10.4-6.3-15.6-18.9-15.6-8.2 0-16.2 2.7-23.9 8v-21c8.4-4.4 18.3-6.5 29.7-6.5 11.6 0 21 2.7 28.2 8 7.2 5.3 10.8 12.7 10.8 22.2 0 16-8.1 26-24.3 30.1v0.4c8.5 0.9 15.3 4.1 20.4 9.4 5.1 5.3 7.7 11.7 7.7 19.3 0 11.6-4.2 20.7-12.7 27.2s-19.8 9.8-34 9.8c-12.6 0-22.7-2.1-30.4-6.2v-22.6zM736.3 703h-288c-17.7 0-32 14.3-32 32s14.3 32 32 32h288c17.7 0 32-14.3 32-32s-14.3-32-32-32zM448.3 511c-17.7 0-32 14.3-32 32s14.3 32 32 32h288c17.7 0 32-14.3 32-32s-14.3-32-32-32h-288zM448.3 319c-17.7 0-32 14.3-32 32s14.3 32 32 32h288c17.7 0 32-14.3 32-32s-14.3-32-32-32h-288zM352 64h64v160h-64z"  ></path><path d="M800 960H224c-53 0-96-43-96-96V224c0-53 43-96 96-96h96v64h-96c-17.7 0-32 14.3-32 32v640c0 17.7 14.3 32 32 32h576c17.7 0 32-14.3 32-32V224c0-17.7-14.3-32-32-32h-96v-64h96c53 0 96 43 96 96v640c0 53-43 96-96 96z"  ></path><path d="M448 128h128v64H448zM608 64h64v160h-64z"  ></path></symbol><symbol id="icon-eduguanli" viewBox="0 0 1024 1024"><path d="M482.41777778 897.70666667H129.82044445c-56.43377778 0-102.4-45.96622222-102.4-102.4V228.352c0-56.43377778 45.96622222-102.4 102.4-102.4h734.09422222c56.43377778 0 102.4 45.96622222 102.4 102.4v200.93155555c0 18.88711111-15.24622222 34.13333333-34.13333334 34.13333334s-34.13333333-15.24622222-34.13333333-34.13333334V228.352c0-18.77333333-15.36-34.13333333-34.13333333-34.13333333H129.82044445c-18.77333333 0-34.13333333 15.36-34.13333334 34.13333333V795.30666667c0 18.77333333 15.36 34.13333333 34.13333334 34.13333333H482.41777778c18.88711111 0 34.13333333 15.24622222 34.13333333 34.13333333s-15.24622222 34.13333333-34.13333333 34.13333334z m155.30666667-515.98222222H192.512c-18.88711111 0-34.13333333-15.24622222-34.13333333-34.13333334s15.24622222-34.13333333 34.13333333-34.13333333h445.21244445c18.88711111 0 34.13333333 15.24622222 34.13333333 34.13333333s-15.24622222 34.13333333-34.13333333 34.13333334zM474.90844445 534.75555555h-285.58222223c-18.88711111 0-34.13333333-15.24622222-34.13333333-34.13333333s15.24622222-34.13333333 34.13333333-34.13333333h285.58222223c18.88711111 0 34.13333333 15.24622222 34.13333333 34.13333333s-15.24622222 34.13333333-34.13333333 34.13333333z m279.552 290.816v-39.13955555h-46.6488889c-9.216-0.79644445-14.336-5.46133333-15.13244444-13.88088889 0.79644445-8.41955555 5.91644445-13.08444445 15.13244444-13.88088889h46.6488889V737.28h-46.6488889c-9.216-0.79644445-14.336-5.46133333-15.13244444-13.88088889 0.79644445-8.41955555 5.91644445-13.08444445 15.13244444-13.88088889h26.51022223l-40.39111111-56.77511111c-3.41333333-4.20977778-5.00622222-8.87466667-5.00622222-13.88088889 1.70666667-14.336 9.67111111-22.30044445 24.0071111-24.00711111 8.41955555 0.79644445 14.67733333 4.20977778 18.88711112 10.12622222l46.64888888 66.90133334 46.6488889-66.90133334c4.20977778-5.91644445 10.46755555-9.216 18.8871111-10.12622222 14.336 1.70666667 22.30044445 9.67111111 24.00711112 24.00711111 0 5.00622222-1.70666667 9.67111111-5.00622222 13.88088889L822.61333333 709.51822222h26.51022222c9.216 0.79644445 14.336 5.46133333 15.13244445 13.88088889-0.79644445 8.41955555-5.91644445 13.08444445-15.13244445 13.88088889h-46.64888888v21.39022222h46.64888888c9.216 0.79644445 14.336 5.46133333 15.13244445 13.88088889-0.79644445 8.41955555-5.91644445 13.08444445-15.13244445 13.88088889h-46.64888888v39.13955555c-0.79644445 14.336-8.87466667 21.39022222-24.00711112 21.39022223s-23.21066667-7.05422222-24.0071111-21.39022223z m23.89333333 122.53866667c-123.33511111 0-223.80088889-100.352-223.80088889-223.80088889S655.01866667 500.62222222 778.35377778 500.62222222c123.33511111 0 223.80088889 100.352 223.80088889 223.80088889s-100.352 223.68711111-223.80088889 223.68711111z m0-379.22133333c-85.78844445 0-155.53422222 69.74577778-155.53422223 155.53422222s69.74577778 155.53422222 155.53422223 155.53422222c85.78844445 0 155.53422222-69.74577778 155.53422222-155.53422222S864.14222222 568.88888889 778.35377778 568.88888889z"  ></path></symbol><symbol id="icon-RectangleCopy" viewBox="0 0 1024 1024"><path d="M832 403.498667a21.333333 21.333333 0 0 0 21.333333-21.333334V276.736A106.24 106.24 0 0 0 747.136 170.666667H276.864A106.24 106.24 0 0 0 170.666667 276.736v342.528A106.24 106.24 0 0 0 276.864 725.333333h470.272A106.24 106.24 0 0 0 853.333333 619.264V512a21.333333 21.333333 0 0 0-42.666666 0v107.264A63.573333 63.573333 0 0 1 747.136 682.666667H276.864A63.573333 63.573333 0 0 1 213.333333 619.264V276.736A63.573333 63.573333 0 0 1 276.864 213.333333h470.272A63.573333 63.573333 0 0 1 810.666667 276.736v105.429333a21.333333 21.333333 0 0 0 21.333333 21.333334M792.874667 810.666667H232.874667a21.333333 21.333333 0 0 0 0 42.666666h560a21.333333 21.333333 0 0 0 0-42.666666"  ></path></symbol><symbol id="icon-tubiao_shengchangongyi" viewBox="0 0 1024 1024"><path d="M54.139985 341.303229c-5.837322 0-11.625473-2.533821-15.592283-7.418829-6.986322-8.604958-5.674756-21.24396 2.929198-28.231285l260.065403-211.178206c8.601947-6.986322 21.24396-5.676763 28.232289 2.928195 6.986322 8.604958 5.674756 21.244963-2.929198 28.232289L66.779991 336.813598a19.9916 19.9916 0 0 1-12.640006 4.489631zM581.019287 341.303229c-5.837322 0-11.625473-2.533821-15.592284-7.418829-6.986322-8.604958-5.674756-21.24396 2.929198-28.231285L828.422608 94.474909c8.604958-6.986322 21.24396-5.676763 28.232289 2.928195 6.987326 8.604958 5.674756 21.244963-2.929198 28.232289L593.659292 336.813598a19.9916 19.9916 0 0 1-12.640005 4.489631z"  ></path><path d="M575.165909 336.608885a19.989593 19.989593 0 0 1-12.562737-4.428417L305.546243 125.521998c-8.638073-6.945179-10.011856-19.57816-3.066677-28.217237 6.944176-8.638073 19.57816-10.012859 28.216233-3.066676L587.753732 300.897558c8.638073 6.945179 10.011856 19.57816 3.066677 28.217237-3.9638 4.931168-9.783059 7.49409-15.6545 7.49409zM876.558189 89.918045c-1.187133 0-2.388315-0.105367-3.596521-0.323125L674.208721 53.637737c-10.906972-1.972868-18.149185-12.415223-16.176317-23.322195 1.973872-10.907976 12.42024-18.148182 23.322195-16.176317l198.752947 35.957183c10.906972 1.972868 18.149185 12.415223 16.176317 23.322195-1.75511 9.698766-10.206533 16.499442-19.725674 16.499442z"  ></path><path d="M885.844519 312.093537c-10.781535 0-19.692559-8.558797-20.047795-19.414591l-6.495614-198.748934c-0.362261-11.078569 8.324983-20.352857 19.403552-20.715118 11.12172-0.360254 20.352857 8.325986 20.715119 19.403552l6.495614 198.748934c0.362261 11.078569-8.324983 20.352857-19.403553 20.715118-0.223779 0.007024-0.446555 0.011038-0.667323 0.011039zM774.358386 517.214655H57.666262c-11.08459 0-20.069872-8.985282-20.069872-20.069873s8.985282-20.069872 20.069872-20.069872h716.692124c11.08459 0 20.069872 8.985282 20.069873 20.069872s-8.985282 20.069872-20.069873 20.069873zM500.097562 805.76021c-26.461123 0-40.918455-6.557831-52.535901-11.827176-10.152345-4.605032-18.170259-8.242696-35.954172-8.242696s-25.801828 3.637664-35.954173 8.242696c-11.616442 5.269345-26.073774 11.827176-52.536904 11.827176-26.460119 0-40.916448-6.557831-52.533894-11.827176-10.150338-4.605032-18.168252-8.242696-35.951162-8.242696-17.780903 0-25.798817 3.637664-35.949155 8.241693-11.616442 5.270348-26.072771 11.828179-52.533894 11.828179s-40.916448-6.557831-52.533894-11.828179c-10.150338-4.604029-18.168252-8.241693-35.950158-8.241693-11.08459 0-20.069872-8.985282-20.069872-20.069872s8.985282-20.069872 20.069872-20.069872c26.460119 0 40.916448 6.557831 52.533894 11.828179 10.150338 4.605032 18.169255 8.241693 35.950158 8.241693 17.781907 0 25.799821-3.637664 35.950159-8.241693 11.616442-5.269345 26.071767-11.828179 52.53289-11.828179s40.917452 6.557831 52.534898 11.828179c10.150338 4.605032 18.168252 8.241693 35.950158 8.241693 17.784917 0 25.802831-3.637664 35.955176-8.242697 11.616442-5.269345 26.073774-11.827176 52.535901-11.827175s40.918455 6.557831 52.535901 11.827175c10.152345 4.605032 18.170259 8.242696 35.954172 8.242697 11.08459 0 20.069872 8.985282 20.069872 20.069872s-8.985282 20.069872-20.069872 20.069872zM862.060717 643.050746l95.196421 164.887045-95.196421 164.885038H671.664864l-95.196421-164.886041 95.196421-164.885039h190.395853m23.173678-40.140747h-236.744212L530.119081 807.935784l118.371102 205.025786h236.744212l118.371103-205.024782-118.371103-205.025786z"  ></path><path d="M766.859279 913.84751c-58.398311 0-105.909719-47.511408-105.909719-105.911726S708.460968 702.024058 766.859279 702.024058c58.400318 0 105.913733 47.511408 105.913733 105.911726S825.2606 913.84751 766.859279 913.84751z m0-171.683707c-36.266259 0-65.769975 29.504719-65.769975 65.771981s29.503716 65.771982 65.769975 65.771982c36.268266 0 65.773989-29.504719 65.773988-65.771982s-29.505723-65.771982-65.773988-65.771981z"  ></path></symbol><symbol id="icon-shoudong" viewBox="0 0 1024 1024"><path d="M821.574863 397.603112h2.870264C877.53991 397.603112 920.578554 440.703042 920.578554 493.869327v285.902843c0 134.881995-109.20794 244.232938-243.921397 244.232937H477.679401a243.819252 243.819252 0 0 1-197.144259-100.418394l-194.703002-267.583202a94.917905 94.917905 0 0 1 5.760957-118.835072l9.050015-10.199142c33.845626-38.120379 92.144678-41.552439 130.213985-7.665955 0.919302 0.817157 1.818175 1.649636 2.701726 2.502543l37.134683 35.801696a14.336 14.336 0 0 0 20.291033-0.377935 14.376858 14.376858 0 0 0 4.009177-9.969317V218.017516c0-53.166284 43.043751-96.256 96.133426-96.256h2.870264c53.094783 0 96.133426 43.094823 96.133427 96.256v87.047661a95.617596 95.617596 0 0 1 44.48399-10.90394h2.865157c44.116269 0 81.29181 29.754733 92.604329 70.316369a95.597167 95.597167 0 0 1 48.00798-12.849796h2.870265c40.576958 0 75.280599 25.168439 89.386773 60.765846a95.59206 95.59206 0 0 1 51.225536-14.790544zM317.210175 896.829925a198.456818 198.456818 0 0 0 160.469226 81.73614h198.977756c109.652269 0 198.543641-89.008838 198.543641-198.80411v-285.902843c0-28.064239-22.727182-50.816958-50.755671-50.816957h-2.870264c-28.028489 0-50.750564 22.752718-50.750564 50.816957v102.006743c0 26.097955-39.106075 26.097955-39.106075 0V447.888918c0-28.069347-22.727182-50.822065-50.75567-50.822065h-2.870265c-28.028489 0-50.750564 22.752718-50.750563 50.816957v113.503123c0 26.097955-39.106075 26.097955-39.106075 0V390.422344c0-28.069347-22.727182-50.822065-50.755671-50.822065h-2.870264c-28.028489 0-50.750564 22.752718-50.750564 50.816958v136.490773c0 26.097955-39.106075 26.097955-39.106075 0v-308.885387c0-28.069347-22.727182-50.827172-50.755671-50.827172h-2.870264c-28.028489 0-50.750564 22.757825-50.750563 50.822065v329.237706c0 15.474913-5.985676 30.336958-16.700649 41.480938-22.880399 23.794594-60.699451 24.509606-84.458294 1.598563l-37.134683-35.806803a46.807781 46.807781 0 0 0-67.517606 2.625117l-9.055123 10.194035a49.438005 49.438005 0 0 0-3.003052 61.894544L317.210175 896.829925zM586.054863 196.628429a22.982544 22.982544 0 0 1-45.965087 0c0-83.207022-67.456319-150.663342-150.663342-150.663342S238.763092 113.421406 238.763092 196.628429a22.982544 22.982544 0 1 1-45.965087 0C192.798005 88.033357 280.831362 0 389.426434 0s196.628429 88.033357 196.628429 196.628429z" fill="#000000" ></path></symbol><symbol id="icon-zuzhi" viewBox="0 0 1024 1024"><path d="M273.6 656.3c20.6 0 41.4-5.2 60.4-16.2 1.1-0.6 2.2-1.3 3.3-2 12.2-7.6 16-23.6 8.5-35.8-7.6-12.2-23.6-16-35.8-8.5-0.6 0.4-1.3 0.8-2 1.2-33.1 19.1-75.5 7.7-94.5-25.3-19.1-33.1-7.7-75.5 25.3-94.5 33.1-19.1 75.5-7.7 94.5 25.3 6.2 10.7 9.4 22.9 9.3 35.1-0.1 14.4 11.4 26.1 25.8 26.3 14.4 0.2 26.1-11.4 26.3-25.8 0.2-21.6-5.4-42.9-16.3-61.6-33.4-58-107.7-77.9-165.6-44.5-57.9 33.4-77.8 107.7-44.4 165.6 22.5 38.9 63.3 60.7 105.2 60.7zM319.5 686.4H217.6c-82 0-148.7 66.7-148.7 148.7v27.3c0 14.4 11.6 26 26 26s26-11.7 26-26v-27.3c0-53.3 43.4-96.7 96.7-96.7h101.8c53.3 0 96.7 43.4 96.7 96.7v27.3c0 14.4 11.6 26 26 26s26-11.7 26-26v-27.3c0.1-82-66.6-148.7-148.6-148.7zM204.7 376.1c18 0 32.5-14.6 32.5-32.5V229.7c0-4.1 2.2-6.3 2.6-6.5h547.4c0.6 0.2 2.9 2.4 2.9 6.5v113.8c0 18 14.6 32.5 32.5 32.5s32.5-14.6 32.5-32.5V229.7c0-39.5-30.4-71.6-67.7-71.6H239.9c-37.3 0-67.7 32.1-67.7 71.6v113.8c0 18 14.6 32.6 32.5 32.6zM810.6 689.6H708.8c-82 0-148.7 66.7-148.7 148.7v27.3c0 14.4 11.7 26 26 26s26-11.7 26-26v-27.3c0-53.3 43.4-96.7 96.7-96.7h101.8c53.3 0 96.7 43.4 96.7 96.7v27.3c0 14.4 11.7 26 26 26s26-11.7 26-26v-27.3c0-81.9-66.7-148.7-148.7-148.7zM792.7 417.9c-31.3-8.4-64-4.1-92 12.1-57.9 33.4-77.8 107.7-44.4 165.6 22.4 38.9 63.3 60.6 105.2 60.6 20.6 0 41.4-5.2 60.4-16.2 1.1-0.6 2.2-1.3 3.3-2 12.2-7.6 16-23.6 8.5-35.8-7.6-12.2-23.6-16-35.8-8.5-0.6 0.4-1.3 0.8-2 1.2-33 19.1-75.5 7.7-94.5-25.3-19.1-33.1-7.7-75.5 25.3-94.5 16-9.2 34.7-11.7 52.5-6.9 17.9 4.8 32.8 16.2 42 32.2 6.2 10.7 9.4 22.9 9.3 35.1-0.1 14.4 11.4 26.1 25.8 26.3 14.4 0.2 26.1-11.4 26.3-25.8 0.2-21.6-5.4-42.9-16.3-61.6-16.2-28-42.3-48.1-73.6-56.5z" fill="#4D4D4D" ></path></symbol><symbol id="icon-jichushuju" viewBox="0 0 1024 1024"><path d="M754.456774 260.954839v508.696774h50.869678v-508.696774h-50.869678z m-508.696774 508.696774v-508.696774h-50.869677v508.696774h50.869677z"  ></path><path d="M754.456774 761.063226c1.32129 18.498065-19.819355 45.584516-66.725161 66.725161-46.245161 21.140645-112.970323 35.014194-187.623226 35.014194-73.992258 0-141.378065-13.873548-187.623226-35.014194-47.566452-21.140645-68.046452-48.227097-66.725161-66.725161h-50.869677c8.588387 101.739355 146.663226 149.966452 305.218064 152.609032 158.554839-2.642581 296.629677-50.869677 305.218065-152.609032h-50.869678z"  ></path><path d="M754.456774 591.277419c1.32129 18.498065-19.819355 45.584516-66.725161 66.725162-46.245161 21.140645-112.970323 35.014194-187.623226 35.014193-73.992258 0-141.378065-13.873548-187.623226-35.014193-47.566452-21.140645-68.046452-48.227097-66.725161-66.725162h-50.869677c8.588387 101.739355 146.663226 149.966452 305.218064 152.609033 158.554839-2.642581 296.629677-50.869677 305.218065-152.609033h-50.869678z"  ></path><path d="M754.456774 422.152258c1.32129 18.498065-19.819355 45.584516-66.725161 66.725161-46.245161 21.140645-112.970323 35.014194-187.623226 35.014194-73.992258 0-141.378065-13.873548-187.623226-35.014194-47.566452-21.140645-68.046452-48.227097-66.725161-66.725161h-50.869677C203.47871 523.891613 341.553548 572.11871 500.108387 574.76129c158.554839-2.642581 296.629677-50.869677 305.218065-152.609032h-50.869678z"  ></path><path d="M754.456774 235.189677c1.32129 18.498065-19.819355 45.584516-66.725161 66.725162-46.245161 21.140645-112.970323 35.014194-187.623226 35.014193-73.992258 0-141.378065-13.873548-187.623226-35.014193-47.566452-21.140645-68.046452-48.227097-66.725161-66.725162h-50.869677C203.47871 336.929032 341.553548 385.156129 500.108387 387.79871c158.554839-2.642581 296.629677-50.869677 305.218065-152.609033h-50.869678z"  ></path><path d="M245.76 252.366452c-1.32129-18.498065 19.819355-45.584516 66.725161-66.725162 46.245161-21.140645 112.970323-35.014194 187.623226-35.014193 73.992258 0 141.378065 13.873548 187.623226 35.014193 47.566452 21.140645 68.046452 48.227097 66.725161 66.725162h50.869678c-8.588387-101.739355-146.663226-149.966452-305.218065-152.609033-158.554839 2.642581-296.629677 50.869677-305.218064 152.609033h50.869677z"  ></path></symbol><symbol id="icon-ziyuan145" viewBox="0 0 1024 1024"><path d="M513.580247 1024l-10.53498-4.740741a1072.460905 1072.460905 0 0 1-271.539094-161.185185C122.469136 763.786008 64.790123 667.917695 55.308642 562.041152a717.958848 717.958848 0 0 1 0-81.64609V50.567901l33.711934 9.744856c137.744856 40.032922 309.201646 3.160494 407.440329-52.674897l11.325103-7.63786 26.337449 11.588477c84.279835 35.81893 171.45679 72.691358 297.349794 65.053498a480.921811 480.921811 0 0 0 102.1893-16.592592L966.584362 52.674897l1.316873 32.921811c1.580247 34.502058 1.580247 71.374486 1.580246 102.979424v378.205761a194.897119 194.897119 0 0 1-1.843621 26.337449c-19.489712 110.353909-96.395062 190.946502-152.493827 242.041152A1281.843621 1281.843621 0 0 1 685.82716 933.399177a1269.465021 1269.465021 0 0 1-161.975308 85.860082zM107.983539 119.045267V481.975309a666.864198 666.864198 0 0 0 0 75.588477c8.427984 92.707819 58.469136 175.407407 158.024691 260.477366a1003.983539 1003.983539 0 0 0 247.835391 148.54321A1246.814815 1246.814815 0 0 0 659.489712 888.888889a1243.390947 1243.390947 0 0 0 121.942387-92.707819c54.781893-49.777778 119.572016-119.045267 136.164609-212.279835a153.8107 153.8107 0 0 0 0-18.17284V187.786008 119.045267a549.662551 549.662551 0 0 1-80.855967 10.53498c-138.534979 8.427984-235.45679-32.921811-321.053498-69.26749l-3.423869-1.316872A647.374486 647.374486 0 0 1 107.983539 119.045267z"  ></path><path d="M756.674897 313.152263v48.460906h-198.584362c-1.843621 18.962963-4.213992 36.082305-6.584362 52.674897h164.082304v206.222222h-57.942386v-157.234568h-233.08642v153.020576H369.777778v-203.325103h128.263374q2.633745-22.91358 5.26749-52.674897h-171.983539V395.061728c0 96.395062-8.954733 237.037037-66.633745 330.271605a166.716049 166.716049 0 0 0-47.934156-27.654321C272.329218 609.185185 277.596708 483.292181 277.596708 395.061728V229.925926a2610.831276 2610.831276 0 0 0 401.119341-41.349794l43.720165 44.246913c-44.773663 9.481481-97.44856 17.646091-153.547325 24.230453-1.843621 17.646091-3.423868 36.609053-5.26749 56.098765z m-184.36214 222.024692c0 59.786008-22.386831 141.168724-212.016461 195.423868a223.078189 223.078189 0 0 0-37.135802-43.193416c178.304527-43.983539 190.683128-107.983539 190.683127-152.757201v-49.514404h57.415638z m-65.580247-222.024692c0-17.646091 2.37037-34.238683 3.423869-50.304526-59.786008 5.26749-121.152263 8.954733-179.094651 11.325103v38.979423z m79.012346 302.35391a1546.798354 1546.798354 0 0 1 168.823045 76.115226l-38.979424 36.609054a1185.185185 1185.185185 0 0 0-168.296296-80.329218z"  ></path></symbol><symbol id="icon-peizhizhongxin" viewBox="0 0 1024 1024"><path d="M511.63 324.4c-103.43 0-187.6 84.16-187.6 187.6s84.16 187.6 187.6 187.6 187.6-84.16 187.6-187.6-84.16-187.6-187.6-187.6z m0 283.14c-52.68 0-95.55-42.87-95.55-95.55s42.87-95.55 95.55-95.55 95.55 42.87 95.55 95.55-42.87 95.55-95.55 95.55z"  ></path><path d="M914.05 576.12c-18.03 0-34.37-7.49-46.03-19.54-11.19-11.55-18.1-27.26-18.1-44.58 0-17.32 6.9-33.03 18.1-44.58 11.65-12.05 27.99-19.54 46.03-19.54 25.42 0 46.03-20.61 46.03-46.03 0-0.73-0.02-1.44-0.06-2.15 0-0.42-0.04-0.84-0.06-1.23-0.06-0.88-0.15-1.76-0.27-2.62-0.04-0.44-0.1-0.86-0.19-1.3-0.1-0.67-0.23-1.32-0.36-1.97-0.1-0.54-0.23-1.09-0.38-1.63-0.08-0.34-0.17-0.67-0.25-1-0.13-0.48-0.27-0.96-0.42-1.44-0.15-0.48-0.29-0.96-0.46-1.44-0.25-0.69-0.5-1.38-0.75-2.05-0.25-0.69-0.52-1.36-0.86-2.03-0.42-0.96-0.88-1.9-1.38-2.82-0.23-0.44-0.48-0.88-0.73-1.32l-0.63-1.09-104.71-181.4-0.29-0.48c-0.25-0.46-0.54-0.92-0.84-1.38-0.27-0.46-0.56-0.92-0.88-1.36-0.27-0.4-0.54-0.82-0.84-1.19-0.17-0.23-0.36-0.48-0.52-0.71-0.27-0.4-0.56-0.77-0.88-1.13-0.21-0.27-0.42-0.52-0.63-0.77-0.36-0.42-0.71-0.84-1.07-1.23a44.62 44.62 0 0 0-3.14-3.16c-0.36-0.31-0.69-0.63-1.05-0.92-0.36-0.31-0.69-0.61-1.07-0.9-0.65-0.5-1.3-1-1.97-1.51-0.08-0.06-0.17-0.13-0.27-0.19-0.75-0.54-1.55-1.07-2.34-1.57-0.02 0-0.04-0.02-0.08-0.04-0.23-0.15-0.46-0.27-0.69-0.42-0.19-0.13-0.38-0.25-0.59-0.36-0.04-0.02-0.06-0.04-0.1-0.04-0.46-0.27-0.94-0.54-1.42-0.8l-1.21-0.63c-21.57-10.59-47.95-2.8-60.13 18.31-8.58 14.83-22.41 25.46-38.93 29.87-1.59 0.42-3.16 0.8-4.75 1.09-15.06 2.87-30.5 0.27-43.91-7.49-12.01-6.92-21.26-17.32-26.67-29.79-1.3-2.95-2.36-5.98-3.2-9.14-4.43-16.55-2.15-33.83 6.4-48.64 8.12-14.06 7.97-30.63 1.09-44.06a45.854 45.854 0 0 0-17.93-18.83c-11.11-6.4-23.77-7.66-35.23-4.5-0.73-0.06-1.46-0.08-2.2-0.08l-195.25-1.57h-0.17c-3.45-0.1-6.97 0.17-10.42 0.88-0.73 0.15-1.46 0.31-2.2 0.48-0.73 0.19-1.46 0.38-2.18 0.61-0.84 0.25-1.67 0.54-2.49 0.84-0.82 0.29-1.61 0.61-2.41 0.96-0.02 0-0.06 0.02-0.08 0.04-0.65 0.27-1.3 0.56-1.92 0.88-0.19 0.08-0.36 0.17-0.52 0.27-0.75 0.36-1.51 0.77-2.24 1.19-22.01 12.72-29.56 40.88-16.84 62.89 8.56 14.83 10.84 32.11 6.4 48.64-0.08 0.31-0.17 0.65-0.27 0.96h-0.02c-4.56 16.13-15.04 29.58-29.58 37.97-14.98 8.66-32.05 10.54-47.66 6.63-16.26-4.08-30.9-14.48-39.92-30.1-12.72-22.01-40.86-29.54-62.89-16.84-0.82 0.48-1.63 0.98-2.43 1.51-0.08 0.06-0.17 0.13-0.27 0.17-0.67 0.46-1.34 0.94-1.99 1.44-0.19 0.13-0.36 0.25-0.54 0.4-0.71 0.56-1.42 1.15-2.11 1.74-0.73 0.65-1.44 1.32-2.15 2.03-0.61 0.61-1.19 1.21-1.78 1.86-0.08 0.08-0.17 0.19-0.25 0.27-0.1 0.15-0.21 0.27-0.36 0.42-0.46 0.56-0.94 1.13-1.4 1.72-0.06 0.06-0.11 0.15-0.17 0.21-0.08 0.15-0.19 0.27-0.31 0.42-0.46 0.63-0.92 1.26-1.36 1.9-0.06 0.1-0.13 0.21-0.19 0.29-0.52 0.82-1.05 1.63-1.53 2.47l-0.29 0.48L70.73 377.75l-0.63 1.09c-0.25 0.44-0.5 0.88-0.73 1.32-0.71 1.34-1.36 2.7-1.95 4.1-0.38 0.92-0.73 1.86-1.05 2.8-0.17 0.48-0.31 0.96-0.46 1.44-0.15 0.48-0.29 0.96-0.42 1.44s-0.25 0.96-0.36 1.46c-0.13 0.48-0.23 0.96-0.31 1.46-0.1 0.48-0.19 0.98-0.27 1.46-0.08 0.5-0.17 1-0.23 1.51-0.13 0.86-0.21 1.74-0.25 2.62-0.04 0.4-0.08 0.82-0.08 1.23-0.04 0.71-0.06 1.42-0.06 2.15 0 25.42 20.61 46.03 46.03 46.03 18.03 0 34.37 7.49 46.03 19.54 11.19 11.55 18.1 27.26 18.1 44.58 0 17.32-6.9 33.03-18.1 44.58-11.65 12.05-27.99 19.54-46.03 19.54-25.42 0-46.03 20.61-46.03 46.03 0 0.73 0.02 1.44 0.06 2.15 0 0.42 0.04 0.84 0.08 1.23 0.04 0.88 0.15 1.76 0.25 2.62 0.06 0.5 0.15 1 0.23 1.51 0.08 0.48 0.17 0.98 0.27 1.46 0.08 0.5 0.19 0.98 0.31 1.46 0.1 0.5 0.23 0.98 0.36 1.46 0.13 0.48 0.27 0.96 0.42 1.44 0.15 0.48 0.29 0.96 0.46 1.44 0.31 0.96 0.65 1.88 1.05 2.8 0.59 1.4 1.23 2.76 1.95 4.1 0.23 0.44 0.48 0.88 0.73 1.32l0.63 1.09 104.71 181.4 0.29 0.48c0.48 0.84 1 1.65 1.53 2.47 0.06 0.08 0.13 0.19 0.19 0.29 0.44 0.65 0.9 1.28 1.36 1.9 0.13 0.15 0.23 0.27 0.31 0.42 0.06 0.06 0.1 0.15 0.17 0.21l0.06 0.06c0.44 0.56 0.9 1.11 1.34 1.65 0.15 0.15 0.25 0.27 0.36 0.42 0.08 0.08 0.17 0.19 0.25 0.27 0.29 0.31 0.59 0.65 0.88 0.94 0.29 0.31 0.59 0.63 0.9 0.92 0.71 0.71 1.42 1.38 2.15 2.03 0.69 0.59 1.4 1.17 2.11 1.74 0.19 0.15 0.36 0.27 0.54 0.4 0.65 0.5 1.32 0.98 1.99 1.44 0.1 0.04 0.19 0.1 0.27 0.17 0.79 0.52 1.61 1.03 2.43 1.51 22.03 12.7 50.17 5.17 62.89-16.84 9.02-15.63 23.68-26.03 39.94-30.11 15.59-3.91 32.66-2.03 47.64 6.63 14.54 8.39 25.02 21.84 29.58 37.95 0.1 0.31 0.21 0.65 0.29 0.98 4.44 16.53 2.15 33.81-6.4 48.64-12.7 22.01-5.17 50.17 16.84 62.89 0.52 0.31 1.07 0.61 1.61 0.88 0.33 0.19 0.67 0.36 1 0.5 1.19 0.61 2.41 1.13 3.64 1.61 0.71 0.29 1.42 0.54 2.15 0.8 0.48 0.15 0.94 0.31 1.42 0.46 0.34 0.1 0.69 0.21 1.05 0.29 0.34 0.08 0.69 0.17 1.05 0.27 0.69 0.17 1.4 0.31 2.11 0.46 3.45 0.71 6.97 0.98 10.42 0.88h208.4c3.18 0.1 6.38-0.13 9.54-0.71 1.59-0.27 3.18-0.63 4.75-1.11 0.61-0.17 1.19-0.36 1.78-0.54 0.71-0.25 1.44-0.5 2.15-0.8 0.54-0.21 1.07-0.42 1.59-0.65 0.46-0.19 0.92-0.4 1.36-0.63 0.42-0.19 0.84-0.4 1.25-0.61 0-0.02 0.02-0.02 0.02-0.02 0.67-0.34 1.34-0.71 2.01-1.09 22.01-12.72 29.56-40.88 16.84-62.89-8.56-14.83-10.84-32.11-6.4-48.64 0.08-0.33 0.19-0.67 0.29-0.98 4.56-16.11 15.04-29.56 29.58-37.95 14.54-8.41 31.44-10.75 47.68-6.65 0.34 0.08 0.65 0.17 0.98 0.25 16.53 4.41 30.36 15.04 38.93 29.88 12.7 22.01 40.86 29.54 62.87 16.84 0.82-0.48 1.63-0.98 2.43-1.51 0.08-0.06 0.17-0.13 0.27-0.17 0.67-0.46 1.34-0.94 1.99-1.44 0.19-0.13 0.36-0.25 0.54-0.4 0.71-0.56 1.42-1.15 2.11-1.74 0.73-0.65 1.44-1.32 2.15-2.03 0.29-0.29 0.61-0.61 0.9-0.92 0.29-0.29 0.59-0.63 0.88-0.94 0.08-0.08 0.17-0.19 0.25-0.27 0.1-0.15 0.21-0.27 0.36-0.42 0.44-0.52 0.86-1.05 1.3-1.59 0.19-0.23 0.4-0.5 0.56-0.75 0.02 0 0.02-0.02 0.02-0.02 0.25-0.31 0.48-0.65 0.71-0.98 0.25-0.31 0.46-0.65 0.69-0.98 0.04-0.06 0.08-0.13 0.13-0.17 0.54-0.82 1.05-1.65 1.55-2.51l0.29-0.48 104.71-181.4 0.63-1.09c0.25-0.44 0.5-0.88 0.73-1.32 0.5-0.92 0.96-1.86 1.38-2.82 0.31-0.67 0.59-1.34 0.86-2.03 0.25-0.67 0.5-1.36 0.75-2.05 0.17-0.48 0.31-0.96 0.46-1.44 0.15-0.48 0.29-0.96 0.42-1.44 0.08-0.34 0.17-0.67 0.25-1 0.15-0.54 0.27-1.09 0.38-1.63 0.13-0.65 0.25-1.3 0.36-1.97 0.08-0.44 0.15-0.86 0.19-1.3 0.13-0.86 0.21-1.74 0.27-2.62 0.02-0.4 0.06-0.82 0.06-1.23 0.04-0.71 0.06-1.42 0.06-2.15 0.01-25.38-20.6-45.99-46.01-45.99z m-160.61 133.2c-40.29-10.8-82.37-5.25-118.5 15.61s-61.97 54.54-72.76 94.83c-4.39 16.36-6.07 33.01-5.1 49.46h-90.13c0.19-2.93 0.27-5.86 0.27-8.79 0-13.56-1.78-27.22-5.4-40.67-10.79-40.29-36.63-73.98-72.76-94.83-36.13-20.86-78.2-26.4-118.5-15.61-16.36 4.39-31.65 11.26-45.42 20.29l-45.08-78.1c51.01-25.71 86.07-78.6 86.07-139.52s-35.06-113.81-86.07-139.52l45.08-78.1c13.77 9.04 29.06 15.9 45.42 20.29 40.29 10.8 82.37 5.25 118.5-15.61 36.13-20.86 61.97-54.54 72.76-94.83 3.62-13.45 5.4-27.11 5.4-40.67 0-2.78-0.08-5.54-0.25-8.31l90.04 0.73c-0.82 16.05 0.9 32.28 5.17 48.24 10.8 40.29 36.63 73.98 72.76 94.83s78.2 26.4 118.5 15.61c16.36-4.39 31.65-11.26 45.42-20.29l45.08 78.1c-51 25.71-86.07 78.6-86.07 139.52s35.06 113.81 86.07 139.52l-45.08 78.1c-13.77-9.02-29.06-15.88-45.42-20.28z"  ></path></symbol><symbol id="icon-paigongfenpeishebei" viewBox="0 0 1024 1024"><path d="M798.5152 893.5424H232.8576c-36.0448 0-65.3312-29.2864-65.3312-65.3312v-131.2768c0-36.0448 29.2864-65.3312 65.3312-65.3312h565.6576c36.0448 0 65.3312 29.2864 65.3312 65.3312v131.2768c0 35.84-29.2864 65.3312-65.3312 65.3312zM232.8576 672.5632c-13.5168 0-24.3712 10.8544-24.3712 24.3712v131.2768c0 13.5168 10.8544 24.3712 24.3712 24.3712h565.6576c13.5168 0 24.3712-10.8544 24.3712-24.3712v-131.2768c0-13.5168-10.8544-24.3712-24.3712-24.3712H232.8576zM779.0592 611.1232H252.3136c-46.6944 0-84.7872-38.0928-84.7872-84.7872V200.0896c0-46.6944 38.0928-84.7872 84.7872-84.7872h526.7456c46.6944 0 84.7872 38.0928 84.7872 84.7872V526.336c0 46.6944-38.0928 84.7872-84.7872 84.7872zM252.3136 156.2624c-24.1664 0-43.8272 19.6608-43.8272 43.8272V526.336c0 24.1664 19.6608 43.8272 43.8272 43.8272h526.7456c24.1664 0 43.8272-19.6608 43.8272-43.8272V200.0896c0-24.1664-19.6608-43.8272-43.8272-43.8272H252.3136z"  ></path><path d="M720.4864 782.9504h-61.44c-11.264 0-20.48-9.216-20.48-20.48s9.216-20.48 20.48-20.48h61.44c11.264 0 20.48 9.216 20.48 20.48s-9.216 20.48-20.48 20.48zM577.1264 782.9504h-266.24c-11.264 0-20.48-9.216-20.48-20.48s9.216-20.48 20.48-20.48h266.24c11.264 0 20.48 9.216 20.48 20.48s-9.216 20.48-20.48 20.48zM466.944 528.1792c-5.3248 0-10.4448-2.048-14.5408-5.9392l-48.3328-48.3328a20.39808 20.39808 0 1 1 28.8768-28.8768l48.3328 48.3328a20.39808 20.39808 0 0 1-14.336 34.816z"  ></path><path d="M287.1296 611.1232c-5.3248 0-10.4448-2.048-14.5408-5.9392a20.39808 20.39808 0 0 1 0-28.8768l131.4816-131.2768a20.39808 20.39808 0 1 1 28.8768 28.8768l-131.4816 131.2768c-3.8912 3.8912-9.216 5.9392-14.336 5.9392zM466.944 528.1792c-5.3248 0-10.4448-2.048-14.5408-5.9392a20.39808 20.39808 0 0 1 0-28.8768l146.432-146.432a20.39808 20.39808 0 1 1 28.8768 28.8768L481.28 522.24c-3.8912 3.8912-9.216 5.9392-14.336 5.9392z"  ></path><path d="M642.6624 385.4336c-13.7216 0-27.4432-5.12-37.888-15.5648a53.6576 53.6576 0 0 1 0-75.776 53.6576 53.6576 0 0 1 75.776 0 53.6576 53.6576 0 0 1 0 75.776c-10.4448 10.4448-24.1664 15.5648-37.888 15.5648z m0-66.1504a12.61568 12.61568 0 1 0 8.8064 3.6864 11.91936 11.91936 0 0 0-8.8064-3.6864z"  ></path></symbol></svg>',z=(h=document.getElementsByTagName("script"))[h.length-1].getAttribute("data-injectcss");if(z&&!c.__iconfont__svg__cssinject__){c.__iconfont__svg__cssinject__=!0;try{document.write("<style>.svgfont {display: inline-block;width: 1em;height: 1em;fill: currentColor;vertical-align: -0.1em;font-size:16px;}</style>")}catch(c){console&&console.log(c)}}function v(){s||(s=!0,t())}a=function(){var c,h,a,l,t,o=document.createElement("div");o.innerHTML=e,e=null,(c=o.getElementsByTagName("svg")[0])&&(c.setAttribute("aria-hidden","true"),c.style.position="absolute",c.style.width=0,c.style.height=0,c.style.overflow="hidden",h=c,(a=document.body).firstChild?(l=h,(t=a.firstChild).parentNode.insertBefore(l,t)):a.appendChild(h))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(a,0):(l=function(){document.removeEventListener("DOMContentLoaded",l,!1),a()},document.addEventListener("DOMContentLoaded",l,!1)):document.attachEvent&&(t=a,o=c.document,s=!1,(i=function(){try{o.documentElement.doScroll("left")}catch(c){return void setTimeout(i,50)}v()})(),o.onreadystatechange=function(){"complete"==o.readyState&&(o.onreadystatechange=null,v())})}(window);
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/alicon/iconfont.json b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/alicon/iconfont.json
new file mode 100644
index 0000000..2f4215a
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/alicon/iconfont.json
@@ -0,0 +1,177 @@
+{
+  "id": "",
+  "name": "",
+  "font_family": "iconfont",
+  "css_prefix_text": "icon-",
+  "description": "",
+  "glyphs": [
+    {
+      "icon_id": "392104",
+      "name": "绛炬敹",
+      "font_class": "92",
+      "unicode": "e676",
+      "unicode_decimal": 58998
+    },
+    {
+      "icon_id": "563700",
+      "name": "璁″垝",
+      "font_class": "jihua",
+      "unicode": "e639",
+      "unicode_decimal": 58937
+    },
+    {
+      "icon_id": "765287",
+      "name": "瀹屾垚",
+      "font_class": "shouye",
+      "unicode": "e614",
+      "unicode_decimal": 58900
+    },
+    {
+      "icon_id": "982339",
+      "name": "鍐荤粨2",
+      "font_class": "dongjie2",
+      "unicode": "e656",
+      "unicode_decimal": 58966
+    },
+    {
+      "icon_id": "1463998",
+      "name": "鎵ц涓�",
+      "font_class": "zhihangzhong",
+      "unicode": "e841",
+      "unicode_decimal": 59457
+    },
+    {
+      "icon_id": "1998089",
+      "name": "fq_鍔犲伐",
+      "font_class": "fq_jiagong",
+      "unicode": "e62b",
+      "unicode_decimal": 58923
+    },
+    {
+      "icon_id": "2198999",
+      "name": "娴佺▼绠$悊",
+      "font_class": "manage-process",
+      "unicode": "e746",
+      "unicode_decimal": 59206
+    },
+    {
+      "icon_id": "3168936",
+      "name": "鍔犲伐杩涘害",
+      "font_class": "web-icon-",
+      "unicode": "e70c",
+      "unicode_decimal": 59148
+    },
+    {
+      "icon_id": "3172484",
+      "name": "鐩戞帶",
+      "font_class": "jiankong",
+      "unicode": "e69e",
+      "unicode_decimal": 59038
+    },
+    {
+      "icon_id": "3423041",
+      "name": "缁堟",
+      "font_class": "web-icon-1",
+      "unicode": "e71a",
+      "unicode_decimal": 59162
+    },
+    {
+      "icon_id": "3978476",
+      "name": "浠诲姟绠$悊",
+      "font_class": "renwuguanli",
+      "unicode": "e699",
+      "unicode_decimal": 59033
+    },
+    {
+      "icon_id": "5121503",
+      "name": "鏉冮檺",
+      "font_class": "quanxian",
+      "unicode": "e642",
+      "unicode_decimal": 58946
+    },
+    {
+      "icon_id": "5886126",
+      "name": "娑堟伅涓績",
+      "font_class": "xiaoxizhongxin",
+      "unicode": "e678",
+      "unicode_decimal": 59000
+    },
+    {
+      "icon_id": "6241677",
+      "name": "鏂囦欢绠$悊",
+      "font_class": "wenjianguanli",
+      "unicode": "e62c",
+      "unicode_decimal": 58924
+    },
+    {
+      "icon_id": "6517455",
+      "name": "鏂囦欢-璁″垝",
+      "font_class": "wj-jh",
+      "unicode": "e70e",
+      "unicode_decimal": 59150
+    },
+    {
+      "icon_id": "7318485",
+      "name": "瀹氶绠$悊",
+      "font_class": "eduguanli",
+      "unicode": "e609",
+      "unicode_decimal": 58889
+    },
+    {
+      "icon_id": "7549842",
+      "name": "骞冲彴",
+      "font_class": "RectangleCopy",
+      "unicode": "e6ad",
+      "unicode_decimal": 59053
+    },
+    {
+      "icon_id": "8554289",
+      "name": "鐢熶骇宸ヨ壓",
+      "font_class": "tubiao_shengchangongyi",
+      "unicode": "e63a",
+      "unicode_decimal": 58938
+    },
+    {
+      "icon_id": "8791338",
+      "name": "鎵嬪姩",
+      "font_class": "shoudong",
+      "unicode": "e729",
+      "unicode_decimal": 59177
+    },
+    {
+      "icon_id": "12732492",
+      "name": "缁勭粐",
+      "font_class": "zuzhi",
+      "unicode": "e616",
+      "unicode_decimal": 58902
+    },
+    {
+      "icon_id": "14303377",
+      "name": "鍩虹鏁版嵁",
+      "font_class": "jichushuju",
+      "unicode": "e74e",
+      "unicode_decimal": 59214
+    },
+    {
+      "icon_id": "14845076",
+      "name": "璐ㄩ噺",
+      "font_class": "ziyuan145",
+      "unicode": "e6e9",
+      "unicode_decimal": 59113
+    },
+    {
+      "icon_id": "15571383",
+      "name": "閰嶇疆涓績",
+      "font_class": "peizhizhongxin",
+      "unicode": "e610",
+      "unicode_decimal": 58896
+    },
+    {
+      "icon_id": "15950995",
+      "name": "娲惧伐鍒嗛厤璁惧",
+      "font_class": "paigongfenpeishebei",
+      "unicode": "e635",
+      "unicode_decimal": 58933
+    }
+  ]
+}
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/alicon/iconfont.svg b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/alicon/iconfont.svg
new file mode 100644
index 0000000..3d29447
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/alicon/iconfont.svg
@@ -0,0 +1,98 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<!--
+2013-9-30: Created.
+-->
+<svg>
+<metadata>
+Created by iconfont
+</metadata>
+<defs>
+
+<font id="iconfont" horiz-adv-x="1024" >
+  <font-face
+    font-family="iconfont"
+    font-weight="500"
+    font-stretch="normal"
+    units-per-em="1024"
+    ascent="896"
+    descent="-128"
+  />
+    <missing-glyph />
+    
+    <glyph glyph-name="92" unicode="&#58998;" d="M532.252444 725.333333l-17.521778 0c-9.363911 0-16.952889 7.588978-16.952889 16.952889l0 0.568889c0 21.742933-17.624178 39.367111-39.367111 39.367111l-0.910222 0c-21.742933 0-39.367111-17.624178-39.367111-39.367111l0-0.568889c0-9.363911-7.588978-16.952889-16.952889-16.952889l-17.521778 0c-18.659556 0-33.792-15.132444-33.792-33.792l0-0.682667c0-18.659556 15.132444-33.792 33.792-33.792l148.593778 0c18.659556 0 33.792 15.132444 33.792 33.792l0 0.682667C566.044444 710.200889 550.912 725.333333 532.252444 725.333333zM457.955556 725.333333c-9.4208 0-17.066667 7.645867-17.066667 17.066667s7.645867 17.066667 17.066667 17.066667 17.066667-7.645867 17.066667-17.066667S467.376356 725.333333 457.955556 725.333333zM533.936356 65.422222 247.466667 65.422222c-25.133511 0-45.511111 20.3776-45.511111 45.511111L201.955556 657.066667c0 25.133511 20.3776 45.511111 34.133333 45.511111l92.205511 0c-0.773689-3.777422-1.183289-7.691378-1.183289-11.719111 0-31.175111 25.361067-56.547556 56.547556-56.547556l148.593778 0c31.186489 0 56.547556 25.361067 56.547556 57.230222 0 3.777422-0.4096 7.463822-1.115022 11.036444l69.381689 0c36.511289 0 56.888889-20.3776 56.888889-45.511111l0-341.9136C710.178133 315.392 706.423467 315.733333 702.577778 315.733333c-15.735467 0-30.936178-2.218667-45.511111-5.996089L657.066667 577.422222l-398.222222 0 0-455.111111 262.269156 0C522.353778 102.308978 526.722844 83.171556 533.936356 65.422222zM702.577778 281.6c-81.692444 0-147.911111-66.218667-147.911111-147.911111s66.218667-147.911111 147.911111-147.911111 147.911111 66.218667 147.911111 147.911111S784.270222 281.6 702.577778 281.6zM799.232 164.078933l-91.022222-102.4C703.726933 56.638578 697.480533 54.044444 691.188622 54.044444c-4.994844 0-10.012444 1.6384-14.210844 4.983467l-56.888889 45.511111c-9.807644 7.839289-11.400533 22.163911-3.549867 31.982933 7.839289 9.819022 22.175289 11.411911 31.982933 3.549867l40.015644-32.005689 76.674844 86.254933c8.339911 9.386667 22.7328 10.24 32.119467 1.888711S807.583289 173.476978 799.232 164.078933z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="jihua" unicode="&#58937;" d="M674.508 297.662h-387.428c-14.137 0-25.639-11.5-25.639-25.637 0-14.138 11.502-25.641 25.639-25.641h387.428c14.138 0 25.641 11.502 25.641 25.641 0 14.137-11.502 25.637-25.641 25.637zM794.746 511.417c-14.138 0-25.641-11.502-25.641-25.64v-494.3c0-0.131 0-0.28-0.001-0.434-0.899-0.279-2.666-0.645-5.764-0.645l-563.292 0c-4.312 0-7.564 2.972-7.564 6.913l-0 706.836c0 4.493 0.974 8.289 1.811 9.822h373.338c14.137 0 25.64 11.502 25.64 25.64 0 14.137-11.502 25.639-25.64 25.639h-374.070c-30.337 0-52.357-25.696-52.357-61.1v-706.836c0-32.087 26.396-58.191 58.841-58.191h563.293c34.119 0 57.042 21.041 57.042 52.356l0 494.298c0.001 14.138-11.499 25.641-25.636 25.641zM674.508 150.705h-387.428c-14.137 0-25.639-11.5-25.639-25.637 0-14.138 11.502-25.641 25.639-25.641h387.428c14.138 0 25.641 11.502 25.641 25.641 0 14.137-11.502 25.637-25.641 25.637zM879.596 738.893c-3.773 14.409-12.871 28.25-24.965 37.976l-43.827 35.241c-12.88 10.353-29.277 16.29-44.987 16.29-16.876 0-31.595-6.748-41.44-18.996l-19.625-24.381c-6.38-7.968-7.988-17.577-5.223-26.916l-116.729-145.154-22.813-85.304c-9.749-30.86 4.449-48.076 13.806-55.609 6.783-5.45 14.469-8.729 22.851-9.754 0.984-0.247 2.125-0.488 3.44-0.632 1.004-0.111 2.054-0.168 3.118-0.168h0.014c4.589 0 10.048 0.997 17.18 3.135l2.878 1.065 83.403 41.897 119.874 149.079c0.44-0.017 0.88-0.033 1.32-0.033 9.219 0 17.412 3.863 23.078 10.892l19.563 24.342c10.411 12.938 13.637 29.64 9.082 47.028zM674.47 547.435l-56.738-28.538c-2.958-0.579-5.735-1.684-8.278-3.296-0.313-0.199-0.615-0.386-0.906-0.563 0.124 0.318 0.254 0.64 0.393 0.971 1 2.438 1.588 5.022 1.754 7.702l17.733 66.079 105.732 131.489 48.648-39.114-108.338-134.731zM831.386 723.081l-7.68-9.551-68.14 54.78 7.687 9.564c0.292 0.132 1.144 0.384 2.604 0.384 4.284 0 9.736-2.071 13.57-5.156l43.832-35.246c3.494-2.806 6.421-7.019 7.642-10.993 0.596-1.943 0.59-3.308 0.484-3.781zM487.475 604.933h-200.394c-14.137 0-25.639-11.502-25.639-25.64 0-14.137 11.502-25.638 25.639-25.638h200.394c14.138 0 25.64 11.501 25.64 25.638 0 14.138-11.503 25.64-25.64 25.64zM674.508 457.977h-387.428c-14.137 0-25.639-11.501-25.639-25.639s11.502-25.639 25.639-25.639h387.428c14.138 0 25.641 11.502 25.641 25.639s-11.502 25.639-25.641 25.639z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="shouye" unicode="&#58900;" d="M387.018497 685.373908c17.179264 0 31.099299 13.925151 31.099299 31.099299l0 10.366092 186.597839 0 0-10.366092c0-17.175171 13.920034-31.099299 31.099299-31.099299s31.099299 13.925151 31.099299 31.099299L666.914232 799.406035c0 17.175171-13.920034 31.099299-31.099299 31.099299s-31.099299-13.925151-31.099299-31.099299l0-10.366092L418.117796 789.039943l0 10.366092c0 17.175171-13.920034 31.099299-31.099299 31.099299s-31.099299-13.925151-31.099299-31.099299l0-82.932828C355.919199 699.299059 369.83821 685.373908 387.018497 685.373908zM400.416646 581.055005c-17.179264 0-31.099299-13.925151-31.099299-31.099299l0-30.340005c0-17.175171 13.920034-31.099299 31.099299-31.099299s31.099299 13.925151 31.099299 31.099299L431.515944 549.955706C431.516967 567.130877 417.596933 581.055005 400.416646 581.055005zM622.416785 581.055005c-17.179264 0-31.099299-13.925151-31.099299-31.099299l0-30.340005c0-17.175171 13.920034-31.099299 31.099299-31.099299s31.099299 13.925151 31.099299 31.099299L653.516084 549.955706C653.517107 567.130877 639.597073 581.055005 622.416785 581.055005zM511.103584 349.619982c43.773969 0 74.783217 30.18344 86.212524 48.016597 9.182127 14.33038 5.021364 33.210379-9.202593 42.569538-14.213723 9.379625-33.428344 5.385661-42.974767-8.706289-0.132006-0.197498-13.555737-19.680225-34.035164-19.680225-19.903306 0-32.29452 18.039865-33.124422 19.290345-9.151427 14.349823-28.173666 18.72855-42.650379 9.718339-14.588253-9.06547-19.072381-28.245298-10.001795-42.832528C436.493306 380.031619 467.116767 349.619982 511.103584 349.619982zM463.633433-2.665457 266.173199-2.665457c-41.648562 0-75.532277 34.713616-75.532277 77.374228l0 574.913888c0 42.665729 33.883715 77.374228 75.532277 77.374228 17.179264 0 31.099299 13.925151 31.099299 31.099299s-13.920034 31.099299-31.099299 31.099299c-75.946716 0-137.730874-62.61406-137.730874-139.573849l0-574.913888c0-76.959789 61.784158-139.573849 137.730874-139.573849L463.633433-64.866101c17.179264 0 31.099299 13.920034 31.099299 31.099299S480.81372-2.665457 463.633433-2.665457zM756.661256 789.196509c-17.179264 0-31.099299-13.925151-31.099299-31.099299s13.920034-31.099299 31.099299-31.099299c41.648562 0 75.532277-34.7085 75.532277-77.374228L832.193533 344.598618c0-17.175171 13.920034-31.099299 31.099299-31.099299s31.099299 13.925151 31.099299 31.099299L894.39213 649.62266C894.39213 726.582449 832.607972 789.196509 756.661256 789.196509zM840.980663 245.23047 613.392248 10.874931l-110.711498 114.006544c-11.975752 12.325723-31.655977 12.614296-43.976584 0.647753-12.320607-11.966543-12.614296-31.655977-0.647753-43.976584l133.023666-136.981814c0.10847-0.110517 0.23843-0.183172 0.347924-0.291642 0.11154-0.11154 0.186242-0.245593 0.299829-0.356111 0.771573-0.74906 1.644453-1.311879 2.470261-1.963725 0.704035-0.556679 1.363044-1.183965 2.101871-1.671059 1.031493-0.680499 2.131547-1.187035 3.219321-1.731434 0.730641-0.366344 1.426489-0.816598 2.178619-1.121544 1.25048-0.50756 2.548032-0.823761 3.841491-1.162476 0.642636-0.167822 1.26276-0.429789 1.912559-0.555655 1.961678-0.38067 3.949962-0.581238 5.939269-0.581238s3.977591 0.200568 5.939269 0.581238c0.650823 0.12689 1.269923 0.387833 1.912559 0.555655 1.293459 0.338714 2.591011 0.654916 3.841491 1.162476 0.75213 0.304945 1.447978 0.7552 2.178619 1.121544 1.087774 0.544399 2.187829 1.050935 3.219321 1.731434 0.738827 0.487094 1.397836 1.11438 2.101871 1.671059 0.825808 0.651846 1.698688 1.215688 2.470261 1.963725 0.113587 0.110517 0.188288 0.24457 0.299829 0.356111 0.109494 0.10847 0.239454 0.181125 0.347924 0.291642l249.900583 257.331833c11.966543 12.320607 11.672854 32.011064-0.647753 43.976584C872.637664 257.839649 852.956416 257.561309 840.980663 245.23047z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="dongjie2" unicode="&#58966;" d="M364.851804 103.978415c-116.75667 16.679524-212.024383 57.201559-261.142001 109.798341L103.709803 150.026182l0-36.224243c0-77.155591 156.153093-163.111422 380.149895-163.111422 1.534926 0 2.967523 0 4.502448 0C432.2862-13.187569 388.489657 40.534826 364.851804 103.978415zM655.873688 473.383831C511.693015 473.383831 394.322374 356.115519 394.322374 211.934846S511.693015-49.616468 655.873688-49.616468s261.551314 117.268312 261.551314 261.448986C917.322674 356.115519 800.054362 473.48616 655.873688 473.383831zM494.706505 211.934846c0 88.821025 72.243829 161.064855 161.064855 161.064855 25.684421 0 49.526931-6.549016 71.015889-17.293495L512.102328 140.816628C501.35785 162.305586 494.706505 186.250425 494.706505 211.934846zM655.77136 50.767663c-26.503048 0-51.164185 7.060658-73.267113 18.521435l215.912861 215.912861c11.460777-22.102928 18.521435-46.764065 18.521435-73.267113C816.938543 123.011492 744.694714 50.869991 655.77136 50.767663zM345.511742 211.934846c0 25.786749 3.172179 50.8572 9.107225 74.802039C242.569401 304.235035 151.394824 343.938443 103.709803 394.897971l0-39.191766 0-60.783052c0-60.987709 97.825922-127.603478 249.578895-152.673928C348.172279 164.659139 345.511742 187.990007 345.511742 211.934846zM857.255921 447.801739c4.502448 9.516538 6.753672 19.033077 6.753672 28.344959l0 99.974818c-25.275107-27.117018-62.829619-50.959528-109.286699-70.094934C792.789048 493.337863 827.478365 473.383831 857.255921 447.801739zM467.384831 458.239233c-162.292795 3.069851-300.74308 50.652543-363.572699 117.882282l0-99.974818c0-62.624963 103.044669-131.082642 261.755971-154.618167C386.238433 376.069551 421.848706 423.345258 467.384831 458.239233zM530.112122 495.589088c38.475467 17.088838 81.044069 26.707705 125.761567 26.707705 10.335165 0 20.568002-0.511642 30.698511-1.534926 110.002998 31.41481 177.539722 85.955831 177.539722 136.710703 0 77.155591-156.153093 163.111422-380.149895 163.111422s-380.149895-85.955831-380.149895-163.111422c0-77.155591 156.153093-163.111422 380.149895-163.111422C499.618267 494.361147 515.069851 494.770461 530.112122 495.589088z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="zhihangzhong" unicode="&#59457;" d="M511.071861 833.151603c-246.007927 0-447.287139-201.279213-447.287139-447.287139s201.279213-447.287139 447.287139-447.287139 447.287139 201.279213 447.28714 447.287139-201.279213 447.287139-447.28714 447.287139z m0-805.116851c-196.806341 0-357.829711 161.02337-357.829711 357.829712s161.02337 357.829711 357.829711 357.829711 357.829711-161.02337 357.829712-357.829711-161.02337-357.829711-357.829712-357.829712zM332.157006 439.180763c31.989575 0 53.3163-21.326724 53.316299-53.316299 0-31.989575-21.326724-53.3163-53.316299-53.3163s-53.3163 21.326724-53.3163 53.3163c0 31.989575 21.326724 53.3163 53.3163 53.316299zM508.814448 439.180763c31.989575 0 53.3163-21.326724 53.316299-53.316299 0-31.989575-21.326724-53.3163-53.316299-53.3163s-53.3163 21.326724-53.3163 53.3163c0 31.989575 21.326724 53.3163 53.3163 53.316299zM683.022095 439.180763c31.989575 0 53.3163-21.326724 53.3163-53.316299 0-31.989575-21.326724-53.3163-53.3163-53.3163s-53.3163 21.326724-53.3163 53.3163c0 31.989575 21.326724 53.3163 53.3163 53.316299z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="fq_jiagong" unicode="&#58923;" d="M914.773333 122.88l-221.866666 221.866667 221.866666 221.866666L723.626667 757.76l-221.866667-221.866667-221.866667 221.866667-158.72-158.72 221.866667-221.866667-158.72-158.72-32.426667-221.866666 221.866667 32.426666 158.72 158.72 221.866667-221.866666 160.426666 157.013333zM723.626667 694.613333l126.293333-126.293333-63.146667-63.146667-126.293333 126.293334 63.146667 63.146666z m-413.013334-221.866666l63.146667 63.146666-32.426667 32.426667-63.146666-63.146667-32.426667 32.426667 63.146667 63.146667-32.426667 32.426666-63.146667-63.146666-32.426666 32.426666 95.573333 95.573334 191.146667-191.146667-95.573334-95.573333-61.44 61.44z m-126.293333-443.733334l23.893333 167.253334 8.533334-8.533334 126.293333-126.293333 8.533333-8.533333-167.253333-23.893334z m189.44 63.146667l-126.293333 126.293333 126.293333 126.293334 158.72 158.72 95.573333 95.573333 126.293334-126.293333-95.573334-95.573334-158.72-158.72-126.293333-126.293333z m382.293333-63.146667L723.626667 59.733333l63.146666 63.146667-32.426666 32.426667-63.146667-63.146667-32.426667 32.426667 63.146667 63.146666-32.426667 32.426667-63.146666-63.146667-63.146667 63.146667 95.573333 95.573333 191.146667-191.146666-93.866667-95.573334z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="manage-process" unicode="&#59206;" d="M796.6 260.5v153.3h-262.2v93.7h200v320h-450v-320h200v-93.7h-257v-153.3h-155v-320h360v320h-155v103.3h469.1v-103.3h-155v-320h360v320h-154.9zM334.4 777.5h350v-220h-350v220zM382.4-9.5h-260v220h260v-220zM901.6-9.5h-260v220h260v-220z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="web-icon-" unicode="&#59148;" d="M742.592 400.32c-48.32-48.32-123.2-57.28-180.512-26.56l-253.792-251.2c-17.6-17.6-45.44-17.6-61.76 0-17.6 17.6-17.6 45.44 0 61.76l252.512 252.832c-30.72 58.88-23.36 132.16 26.56 180.832 29.44 29.44 67.52 44.16 105.6 44.16-40.96-42.56-39.68-110.08 1.6-152.64a108.672 108.672 0 0 1 152.64-1.6c-0.288-40.032-13.408-78.112-42.848-107.584z m70.4 191.072c-10.24-11.84-29.44-27.84-54.4-51.52-27.84-27.84-65.92-27.84-92.48 0-27.84 27.84-27.84 66.24 0 92.48 23.36 24.96 51.2 55.68 49.92 55.68a194.944 194.944 0 0 1-221.472-39.36c-54.4-54.4-70.4-133.76-47.04-202.912l-231.712-230.4a88.288 88.288 0 0 1 0-123.52c33.6-33.92 89.6-33.92 124.8 0l231.712 232.032c68.8-23.36 148.16-7.36 202.592 47.04 58.56 58.88 70.4 147.2 38.08 220.48zM759.328 77.632h-5.472c-0.672 36.16-19.2 58.784-40.448 77.504-6.176 5.824-4.128 12.928 0 16.16 21.248 19.36 39.776 41.344 40.448 78.144h5.472c4.8 0 8.928 3.872 8.928 8.384 0 4.512-4.128 8.384-8.928 8.384h-134.4c-5.472 0.64-9.6-3.232-9.6-7.744s4.128-8.384 8.928-8.384h5.472c0.672-36.8 18.528-58.784 40.448-78.144a10.88 10.88 0 0 0 0-16.16c-21.248-18.72-39.776-41.344-40.448-77.504h-4.8c-4.8 0-8.928-3.872-8.928-8.384 0-4.512 4.128-8.384 8.928-8.384h135.072c4.8 0 8.928 3.872 8.928 8.384 0 3.84-4.096 7.744-9.6 7.744z m-14.368 171.776c0-11.616-2.752-21.952-6.176-31.008-15.776-4.512-78.176-4.512-93.952 0a73.888 73.888 0 0 0-6.176 31.008h106.304z m-53.504-158.24c-8.928 0-29.472-13.568-43.872-13.568h-8.928c0.672 30.368 15.072 49.728 33.6 66.528 4.8 4.512 12.352 14.208 19.872 14.208 7.552 0 15.072-10.336 19.872-14.848 18.528-16.8 32.928-36.16 33.6-66.528h-10.24c-14.432 0.672-34.304 14.208-43.904 14.208z m0 0"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="jiankong" unicode="&#59038;" d="M64 832V256H896V832H64zM0 896h960v-704H0V896zM192 0H768v-64H192zM448 256H512v-256h-64zM479.232 334.395733l309.9904 348.330667-47.803733 42.5472-259.566934-291.669333L303.957333 655.991467 163.208533 457.3952l52.224-37.009067 91.6224 129.28z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="web-icon-1" unicode="&#59162;" d="M684.768 0.928a168.032 168.032 0 1 0 0 336.128 168.032 168.032 0 1 0 0-336.128z m-126.048 168.064c0-27.136 8.736-52.064 23.328-72.64l175.36 175.36a125.248 125.248 0 0 1-72.64 23.328 126.016 126.016 0 0 1-126.048-126.048z m228.768 72.64l-175.36-175.36a125.248 125.248 0 0 1 72.64-23.328 126.08 126.08 0 0 1 126.048 126.048 125.024 125.024 0 0 1-23.328 72.64z m0 0M494.912 472.704h213.088v-71.872a21.792 21.792 0 1 1 43.488 0v95.264a21.728 21.728 0 0 1-6.624 15.712L497.28 760.352a21.536 21.536 0 0 1-16.032 7.104H213.984A43.52 43.52 0 0 1 170.528 723.84v-620.608a43.52 43.52 0 0 1 43.456-43.648h225.024v0.288a21.76 21.76 0 0 1 0 43.072v0.288H227.008a13.12 13.12 0 0 0-13.056 13.152V710.752c0 7.232 5.856 13.088 13.024 13.088h245.152v-229.408a21.76 21.76 0 0 1 22.784-21.76z m20.672 207.488l163.264-163.872h-163.264V680.256v-0.064z m0 0"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="renwuguanli" unicode="&#59033;" d="M768 736H640a128 128 0 0 1-247.93 0H256a64 64 0 0 1-64-64v-672a64 64 0 0 1 64-64h512a64 64 0 0 1 64 64V672a64 64 0 0 1-64 64zM516 800a32 32 0 1 0-32-32 32 32 0 0 0 32 32z m252-800H256V672h512zM477.73 224l45.25 45.25L704 450.27l-45.25 45.26-181.02-181.02-90.51 90.51-45.26-45.26 90.51-90.51L477.73 224z"  horiz-adv-x="1025" />
+
+    
+    <glyph glyph-name="quanxian" unicode="&#58946;" d="M645.1 364.1C753.7 437.7 782 585.4 708.4 694S487.2 830.8 378.6 757.2 241.7 536 315.3 427.4c16.9-24.9 38.4-46.4 63.3-63.3C214.8 316.4 96.7 183.5 96.7 27v-59.2H334V27H156c0 160.9 153.9 292 345.7 296.4h20C577 322.2 631.5 310 682 287.3l-177.3-177-83.6 83.8-41.8-42 125.9-125.9 23.1 23.1L736 256.9c79.7-49.8 129.1-136.3 131.6-230.2H689.8v-58.9h237.5V27c0 156.5-118.1 289.4-282.2 337.1z m-133.1 19c-98.2 0-177.8 79.6-177.8 177.8 0 98.2 79.6 177.8 177.8 177.8 98.2 0 177.8-79.6 177.8-177.8S610.2 383.1 512 383.1z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="xiaoxizhongxin" unicode="&#59000;" d="M512 383.8l0.1 0.4-0.1-0.4zM512-41.4c-34.3 0-67.1 10.6-94.8 30.7-25.9 18.8-45.5 44.4-57 74.2H190.4c-21.9 0-41.1 11.5-51.4 30.8-10.3 19.3-9.3 41.7 2.9 59.9l49.6 74.3v208c0 68.9 21.6 134.5 62.3 189.8 19.6 26.6 43.1 49.9 69.9 69.4 26.3 19.1 55.2 34.1 85.9 44.4 8 19.8 21.4 36.7 38.8 49.1 18.7 13.3 40.7 20.3 63.6 20.3s44.9-7 63.6-20.3c17.4-12.4 30.8-29.3 38.8-49.1 30.7-10.4 59.6-25.3 85.9-44.4 26.7-19.4 50.3-42.8 69.9-69.4 40.8-55.3 62.3-121 62.3-189.9v-208l49.6-74.3c12.1-18.2 13.2-40.6 2.9-59.9-10.3-19.3-29.5-30.8-51.4-30.8H663.8c-11.4-29.8-31.1-55.4-57-74.2-27.7-20-60.5-30.6-94.8-30.6z m-106.6 169l13.8-38.8c6.8-19.2 19.1-35.7 35.6-47.6 16.7-12.1 36.4-18.5 57.2-18.5 20.7 0 40.5 6.4 57.2 18.6 16.5 11.9 28.8 28.4 35.6 47.6l13.7 38.7h204.1l-44.5 66.6-9.8 14.7V436.4c0 55.1-17.2 107.6-49.8 151.7-15.6 21.2-34.4 39.9-56 55.6-21.4 15.8-45.3 28-70.7 36.3l-26.7 8.7-9.7 26.3c-3.3 8.8-9.2 16.4-16.9 21.9-7.8 5.5-17 8.4-26.5 8.4s-18.7-2.9-26.5-8.4c-7.7-5.4-13.5-13-16.9-21.9l-9.8-26.2-26.6-8.8C406.9 671.7 383 659.5 361.4 643.7c-21.3-15.5-40.2-34.2-55.9-55.6-32.6-44.1-49.8-96.6-49.8-151.7V209l-9.8-14.7-44.5-66.7h204z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="wenjianguanli" unicode="&#58924;" d="M98 545c-17.7 0-32 14.3-32 32V703.2c0 52.9 43.1 96 96 96h221c52.9 0 96-43.1 96-96V641c0-17.7-14.3-32-32-32s-32 14.3-32 32v62.2c0 17.6-14.4 32-32 32H162c-17.6 0-32-14.4-32-32V577c0-17.6-14.3-32-32-32zM864-30.6H383c-17.7 0-32 14.3-32 32s14.3 32 32 32h481c17.6 0 32 14.4 32 32V577c0 17.6-14.4 32-32 32H447c-17.7 0-32 14.3-32 32s14.3 32 32 32h417c52.9 0 96-43.1 96-96v-511.7c0-52.9-43.1-95.9-96-95.9zM383-30.6H162c-52.9 0-96 43.1-96 96V577c0 17.7 14.3 32 32 32s32-14.3 32-32v-511.7c0-17.6 14.4-32 32-32h221c17.7 0 32-14.3 32-32 0-17.6-14.3-31.9-32-31.9zM768.1 384.8H256c-17.7 0-32 14.3-32 32s14.3 32 32 32h512.1c17.7 0 32-14.3 32-32s-14.3-32-32-32zM768.1 193H256c-17.7 0-32 14.3-32 32s14.3 32 32 32h512.1c17.7 0 32-14.3 32-32s-14.3-32-32-32z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="wj-jh" unicode="&#59150;" d="M324.1 608v-128.3h-27.5v98.8c-3.4-2.8-8-5.3-13.9-7.6-5.9-2.2-11.2-3.6-16.1-4.2v22.4c15.4 4.3 28.8 10.6 40.1 18.8h17.4zM283.8 310.5H337v-21.7h-83.4V298c0 6.5 1.2 12.5 3.6 17.9 2.4 5.4 5.7 10.4 9.9 15.1 4.2 4.7 10.7 10.1 19.6 16.4 8.1 6 13.8 11.4 17 16 3.2 4.7 4.9 9.6 4.9 14.8 0 11.3-6.2 16.9-18.5 16.9-10.8 0-21.1-4.3-30.9-12.9v23.3c11 7.1 23.3 10.6 36.9 10.6 12.5 0 22.4-3.2 29.7-9.6s10.9-15.2 10.9-26.4c0-6.2-1.1-11.9-3.2-16.9-2.1-5-5.2-9.8-9.1-14.2-4-4.4-10.4-9.7-19.2-15.9-8.5-6-14.2-10.7-17.1-14-2.8-3.3-4.3-6.2-4.3-8.6zM256.8 125.89999999999998c8.2-6.1 17.7-9.2 28.6-9.2 6.9 0 12.4 1.5 16.4 4.6 4.1 3.1 6.1 7.4 6.1 13 0 5.8-2.4 10.2-7.2 13.3-4.8 3.1-11.6 4.6-20.2 4.6h-10.9v19.6h10c16.4 0 24.6 5.5 24.6 16.6 0 10.4-6.3 15.6-18.9 15.6-8.2 0-16.2-2.7-23.9-8v21c8.4 4.4 18.3 6.5 29.7 6.5 11.6 0 21-2.7 28.2-8 7.2-5.3 10.8-12.7 10.8-22.2 0-16-8.1-26-24.3-30.1v-0.4c8.5-0.9 15.3-4.1 20.4-9.4 5.1-5.3 7.7-11.7 7.7-19.3 0-11.6-4.2-20.7-12.7-27.2s-19.8-9.8-34-9.8c-12.6 0-22.7 2.1-30.4 6.2v22.6zM736.3 193h-288c-17.7 0-32-14.3-32-32s14.3-32 32-32h288c17.7 0 32 14.3 32 32s-14.3 32-32 32zM448.3 385c-17.7 0-32-14.3-32-32s14.3-32 32-32h288c17.7 0 32 14.3 32 32s-14.3 32-32 32h-288zM448.3 577c-17.7 0-32-14.3-32-32s14.3-32 32-32h288c17.7 0 32 14.3 32 32s-14.3 32-32 32h-288zM352 832h64v-160h-64zM800-64H224c-53 0-96 43-96 96V672c0 53 43 96 96 96h96v-64h-96c-17.7 0-32-14.3-32-32v-640c0-17.7 14.3-32 32-32h576c17.7 0 32 14.3 32 32V672c0 17.7-14.3 32-32 32h-96v64h96c53 0 96-43 96-96v-640c0-53-43-96-96-96zM448 768h128v-64H448zM608 832h64v-160h-64z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="eduguanli" unicode="&#58889;" d="M482.41777778-1.7066666700000042H129.82044445c-56.43377778 0-102.4 45.96622222-102.4 102.4V667.648c0 56.43377778 45.96622222 102.4 102.4 102.4h734.09422222c56.43377778 0 102.4-45.96622222 102.4-102.4v-200.93155555c0-18.88711111-15.24622222-34.13333333-34.13333334-34.13333334s-34.13333333 15.24622222-34.13333333 34.13333334V667.648c0 18.77333333-15.36 34.13333333-34.13333333 34.13333333H129.82044445c-18.77333333 0-34.13333333-15.36-34.13333334-34.13333333V100.69333332999997c0-18.77333333 15.36-34.13333333 34.13333334-34.13333333H482.41777778c18.88711111 0 34.13333333-15.24622222 34.13333333-34.13333333s-15.24622222-34.13333333-34.13333333-34.13333334z m155.30666667 515.98222222H192.512c-18.88711111 0-34.13333333 15.24622222-34.13333333 34.13333334s15.24622222 34.13333333 34.13333333 34.13333333h445.21244445c18.88711111 0 34.13333333-15.24622222 34.13333333-34.13333333s-15.24622222-34.13333333-34.13333333-34.13333334zM474.90844445 361.24444444999995h-285.58222223c-18.88711111 0-34.13333333 15.24622222-34.13333333 34.13333333s15.24622222 34.13333333 34.13333333 34.13333333h285.58222223c18.88711111 0 34.13333333-15.24622222 34.13333333-34.13333333s-15.24622222-34.13333333-34.13333333-34.13333333z m279.552-290.816v39.13955555h-46.6488889c-9.216 0.79644445-14.336 5.46133333-15.13244444 13.88088889 0.79644445 8.41955555 5.91644445 13.08444445 15.13244444 13.88088889h46.6488889V158.72000000000003h-46.6488889c-9.216 0.79644445-14.336 5.46133333-15.13244444 13.88088889 0.79644445 8.41955555 5.91644445 13.08444445 15.13244444 13.88088889h26.51022223l-40.39111111 56.77511111c-3.41333333 4.20977778-5.00622222 8.87466667-5.00622222 13.88088889 1.70666667 14.336 9.67111111 22.30044445 24.0071111 24.00711111 8.41955555-0.79644445 14.67733333-4.20977778 18.88711112-10.12622222l46.64888888-66.90133334 46.6488889 66.90133334c4.20977778 5.91644445 10.46755555 9.216 18.8871111 10.12622222 14.336-1.70666667 22.30044445-9.67111111 24.00711112-24.00711111 0-5.00622222-1.70666667-9.67111111-5.00622222-13.88088889L822.61333333 186.48177778000002h26.51022222c9.216-0.79644445 14.336-5.46133333 15.13244445-13.88088889-0.79644445-8.41955555-5.91644445-13.08444445-15.13244445-13.88088889h-46.64888888v-21.39022222h46.64888888c9.216-0.79644445 14.336-5.46133333 15.13244445-13.88088889-0.79644445-8.41955555-5.91644445-13.08444445-15.13244445-13.88088889h-46.64888888v-39.13955555c-0.79644445-14.336-8.87466667-21.39022222-24.00711112-21.39022223s-23.21066667 7.05422222-24.0071111 21.39022223z m23.89333333-122.53866667c-123.33511111 0-223.80088889 100.352-223.80088889 223.80088889S655.01866667 395.37777778 778.35377778 395.37777778c123.33511111 0 223.80088889-100.352 223.80088889-223.80088889s-100.352-223.68711111-223.80088889-223.68711111z m0 379.22133333c-85.78844445 0-155.53422222-69.74577778-155.53422223-155.53422222s69.74577778-155.53422222 155.53422223-155.53422222c85.78844445 0 155.53422222 69.74577778 155.53422222 155.53422222S864.14222222 327.11111111 778.35377778 327.11111111z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="RectangleCopy" unicode="&#59053;" d="M832 492.501333a21.333333 21.333333 0 0 1 21.333333 21.333334V619.264A106.24 106.24 0 0 1 747.136 725.333333H276.864A106.24 106.24 0 0 1 170.666667 619.264v-342.528A106.24 106.24 0 0 1 276.864 170.666667h470.272A106.24 106.24 0 0 1 853.333333 276.736V384a21.333333 21.333333 0 0 1-42.666666 0v-107.264A63.573333 63.573333 0 0 0 747.136 213.333333H276.864A63.573333 63.573333 0 0 0 213.333333 276.736V619.264A63.573333 63.573333 0 0 0 276.864 682.666667h470.272A63.573333 63.573333 0 0 0 810.666667 619.264v-105.429333a21.333333 21.333333 0 0 1 21.333333-21.333334M792.874667 85.333333H232.874667a21.333333 21.333333 0 0 1 0-42.666666h560a21.333333 21.333333 0 0 1 0 42.666666"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="tubiao_shengchangongyi" unicode="&#58938;" d="M54.139985 554.696771c-5.837322 0-11.625473 2.533821-15.592283 7.418829-6.986322 8.604958-5.674756 21.24396 2.929198 28.231285l260.065403 211.178206c8.601947 6.986322 21.24396 5.676763 28.232289-2.928195 6.986322-8.604958 5.674756-21.244963-2.929198-28.232289L66.779991 559.186402a19.9916 19.9916 0 0 0-12.640006-4.489631zM581.019287 554.696771c-5.837322 0-11.625473 2.533821-15.592284 7.418829-6.986322 8.604958-5.674756 21.24396 2.929198 28.231285L828.422608 801.525091c8.604958 6.986322 21.24396 5.676763 28.232289-2.928195 6.987326-8.604958 5.674756-21.244963-2.929198-28.232289L593.659292 559.186402a19.9916 19.9916 0 0 0-12.640005-4.489631zM575.165909 559.391115a19.989593 19.989593 0 0 0-12.562737 4.428417L305.546243 770.4780020000001c-8.638073 6.945179-10.011856 19.57816-3.066677 28.217237 6.944176 8.638073 19.57816 10.012859 28.216233 3.066676L587.753732 595.102442c8.638073-6.945179 10.011856-19.57816 3.066677-28.217237-3.9638-4.931168-9.783059-7.49409-15.6545-7.49409zM876.558189 806.081955c-1.187133 0-2.388315 0.105367-3.596521 0.323125L674.208721 842.362263c-10.906972 1.972868-18.149185 12.415223-16.176317 23.322195 1.973872 10.907976 12.42024 18.148182 23.322195 16.176317l198.752947-35.957183c10.906972-1.972868 18.149185-12.415223 16.176317-23.322195-1.75511-9.698766-10.206533-16.499442-19.725674-16.499442zM885.844519 583.906463c-10.781535 0-19.692559 8.558797-20.047795 19.414591l-6.495614 198.748934c-0.362261 11.078569 8.324983 20.352857 19.403552 20.715118 11.12172 0.360254 20.352857-8.325986 20.715119-19.403552l6.495614-198.748934c0.362261-11.078569-8.324983-20.352857-19.403553-20.715118-0.223779-0.007024-0.446555-0.011038-0.667323-0.011039zM774.358386 378.785345H57.666262c-11.08459 0-20.069872 8.985282-20.069872 20.069873s8.985282 20.069872 20.069872 20.069872h716.692124c11.08459 0 20.069872-8.985282 20.069873-20.069872s-8.985282-20.069872-20.069873-20.069873zM500.097562 90.23978999999997c-26.461123 0-40.918455 6.557831-52.535901 11.827176-10.152345 4.605032-18.170259 8.242696-35.954172 8.242696s-25.801828-3.637664-35.954173-8.242696c-11.616442-5.269345-26.073774-11.827176-52.536904-11.827176-26.460119 0-40.916448 6.557831-52.533894 11.827176-10.150338 4.605032-18.168252 8.242696-35.951162 8.242696-17.780903 0-25.798817-3.637664-35.949155-8.241693-11.616442-5.270348-26.072771-11.828179-52.533894-11.828179s-40.916448 6.557831-52.533894 11.828179c-10.150338 4.604029-18.168252 8.241693-35.950158 8.241693-11.08459 0-20.069872 8.985282-20.069872 20.069872s8.985282 20.069872 20.069872 20.069872c26.460119 0 40.916448-6.557831 52.533894-11.828179 10.150338-4.605032 18.169255-8.241693 35.950158-8.241693 17.781907 0 25.799821 3.637664 35.950159 8.241693 11.616442 5.269345 26.071767 11.828179 52.53289 11.828179s40.917452-6.557831 52.534898-11.828179c10.150338-4.605032 18.168252-8.241693 35.950158-8.241693 17.784917 0 25.802831 3.637664 35.955176 8.242697 11.616442 5.269345 26.073774 11.827176 52.535901 11.827175s40.918455-6.557831 52.535901-11.827175c10.152345-4.605032 18.170259-8.242696 35.954172-8.242697 11.08459 0 20.069872-8.985282 20.069872-20.069872s-8.985282-20.069872-20.069872-20.069872zM862.060717 252.949254l95.196421-164.887045-95.196421-164.885038H671.664864l-95.196421 164.886041 95.196421 164.885039h190.395853m23.173678 40.140747h-236.744212L530.119081 88.06421599999999l118.371102-205.025786h236.744212l118.371103 205.024782-118.371103 205.025786zM766.859279-17.847510000000057c-58.398311 0-105.909719 47.511408-105.909719 105.911726S708.460968 193.97594200000003 766.859279 193.97594200000003c58.400318 0 105.913733-47.511408 105.913733-105.911726S825.2606-17.847510000000057 766.859279-17.847510000000057z m0 171.683707c-36.266259 0-65.769975-29.504719-65.769975-65.771981s29.503716-65.771982 65.769975-65.771982c36.268266 0 65.773989 29.504719 65.773988 65.771982s-29.505723 65.771982-65.773988 65.771981z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="shoudong" unicode="&#59177;" d="M821.574863 498.396888h2.870264C877.53991 498.396888 920.578554 455.296958 920.578554 402.130673v-285.902843c0-134.881995-109.20794-244.232938-243.921397-244.232937H477.679401a243.819252 243.819252 0 0 0-197.144259 100.418394l-194.703002 267.583202a94.917905 94.917905 0 0 0 5.760957 118.835072l9.050015 10.199142c33.845626 38.120379 92.144678 41.552439 130.213985 7.665955 0.919302-0.817157 1.818175-1.649636 2.701726-2.502543l37.134683-35.801696a14.336 14.336 0 0 1 20.291033 0.377935 14.376858 14.376858 0 0 1 4.009177 9.969317V677.982484c0 53.166284 43.043751 96.256 96.133426 96.256h2.870264c53.094783 0 96.133426-43.094823 96.133427-96.256v-87.047661a95.617596 95.617596 0 0 0 44.48399 10.90394h2.865157c44.116269 0 81.29181-29.754733 92.604329-70.316369a95.597167 95.597167 0 0 0 48.00798 12.849796h2.870265c40.576958 0 75.280599-25.168439 89.386773-60.765846a95.59206 95.59206 0 0 0 51.225536 14.790544zM317.210175-0.829925a198.456818 198.456818 0 0 1 160.469226-81.73614h198.977756c109.652269 0 198.543641 89.008838 198.543641 198.80411v285.902843c0 28.064239-22.727182 50.816958-50.755671 50.816957h-2.870264c-28.028489 0-50.750564-22.752718-50.750564-50.816957v-102.006743c0-26.097955-39.106075-26.097955-39.106075 0V448.111082c0 28.069347-22.727182 50.822065-50.75567 50.822065h-2.870265c-28.028489 0-50.750564-22.752718-50.750563-50.816957v-113.503123c0-26.097955-39.106075-26.097955-39.106075 0V505.577656c0 28.069347-22.727182 50.822065-50.755671 50.822065h-2.870264c-28.028489 0-50.750564-22.752718-50.750564-50.816958v-136.490773c0-26.097955-39.106075-26.097955-39.106075 0v308.885387c0 28.069347-22.727182 50.827172-50.755671 50.827172h-2.870264c-28.028489 0-50.750564-22.757825-50.750563-50.822065v-329.237706c0-15.474913-5.985676-30.336958-16.700649-41.480938-22.880399-23.794594-60.699451-24.509606-84.458294-1.598563l-37.134683 35.806803a46.807781 46.807781 0 0 1-67.517606-2.625117l-9.055123-10.194035a49.438005 49.438005 0 0 1-3.003052-61.894544L317.210175-0.829925zM586.054863 699.371571a22.982544 22.982544 0 0 0-45.965087 0c0 83.207022-67.456319 150.663342-150.663342 150.663342S238.763092 782.578594 238.763092 699.371571a22.982544 22.982544 0 1 0-45.965087 0C192.798005 807.966643 280.831362 896 389.426434 896s196.628429-88.033357 196.628429-196.628429z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="zuzhi" unicode="&#58902;" d="M273.6 239.7c20.6 0 41.4 5.2 60.4 16.2 1.1 0.6 2.2 1.3 3.3 2 12.2 7.6 16 23.6 8.5 35.8-7.6 12.2-23.6 16-35.8 8.5-0.6-0.4-1.3-0.8-2-1.2-33.1-19.1-75.5-7.7-94.5 25.3-19.1 33.1-7.7 75.5 25.3 94.5 33.1 19.1 75.5 7.7 94.5-25.3 6.2-10.7 9.4-22.9 9.3-35.1-0.1-14.4 11.4-26.1 25.8-26.3 14.4-0.2 26.1 11.4 26.3 25.8 0.2 21.6-5.4 42.9-16.3 61.6-33.4 58-107.7 77.9-165.6 44.5-57.9-33.4-77.8-107.7-44.4-165.6 22.5-38.9 63.3-60.7 105.2-60.7zM319.5 209.6H217.6c-82 0-148.7-66.7-148.7-148.7v-27.3c0-14.4 11.6-26 26-26s26 11.7 26 26v27.3c0 53.3 43.4 96.7 96.7 96.7h101.8c53.3 0 96.7-43.4 96.7-96.7v-27.3c0-14.4 11.6-26 26-26s26 11.7 26 26v27.3c0.1 82-66.6 148.7-148.6 148.7zM204.7 519.9c18 0 32.5 14.6 32.5 32.5V666.3c0 4.1 2.2 6.3 2.6 6.5h547.4c0.6-0.2 2.9-2.4 2.9-6.5v-113.8c0-18 14.6-32.5 32.5-32.5s32.5 14.6 32.5 32.5V666.3c0 39.5-30.4 71.6-67.7 71.6H239.9c-37.3 0-67.7-32.1-67.7-71.6v-113.8c0-18 14.6-32.6 32.5-32.6zM810.6 206.4H708.8c-82 0-148.7-66.7-148.7-148.7v-27.3c0-14.4 11.7-26 26-26s26 11.7 26 26v27.3c0 53.3 43.4 96.7 96.7 96.7h101.8c53.3 0 96.7-43.4 96.7-96.7v-27.3c0-14.4 11.7-26 26-26s26 11.7 26 26v27.3c0 81.9-66.7 148.7-148.7 148.7zM792.7 478.1c-31.3 8.4-64 4.1-92-12.1-57.9-33.4-77.8-107.7-44.4-165.6 22.4-38.9 63.3-60.6 105.2-60.6 20.6 0 41.4 5.2 60.4 16.2 1.1 0.6 2.2 1.3 3.3 2 12.2 7.6 16 23.6 8.5 35.8-7.6 12.2-23.6 16-35.8 8.5-0.6-0.4-1.3-0.8-2-1.2-33-19.1-75.5-7.7-94.5 25.3-19.1 33.1-7.7 75.5 25.3 94.5 16 9.2 34.7 11.7 52.5 6.9 17.9-4.8 32.8-16.2 42-32.2 6.2-10.7 9.4-22.9 9.3-35.1-0.1-14.4 11.4-26.1 25.8-26.3 14.4-0.2 26.1 11.4 26.3 25.8 0.2 21.6-5.4 42.9-16.3 61.6-16.2 28-42.3 48.1-73.6 56.5z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="jichushuju" unicode="&#59214;" d="M754.456774 635.045161v-508.696774h50.869678v508.696774h-50.869678z m-508.696774-508.696774v508.696774h-50.869677v-508.696774h50.869677zM754.456774 134.936774c1.32129-18.498065-19.819355-45.584516-66.725161-66.725161-46.245161-21.140645-112.970323-35.014194-187.623226-35.014194-73.992258 0-141.378065 13.873548-187.623226 35.014194-47.566452 21.140645-68.046452 48.227097-66.725161 66.725161h-50.869677c8.588387-101.739355 146.663226-149.966452 305.218064-152.609032 158.554839 2.642581 296.629677 50.869677 305.218065 152.609032h-50.869678zM754.456774 304.722581c1.32129-18.498065-19.819355-45.584516-66.725161-66.725162-46.245161-21.140645-112.970323-35.014194-187.623226-35.014193-73.992258 0-141.378065 13.873548-187.623226 35.014193-47.566452 21.140645-68.046452 48.227097-66.725161 66.725162h-50.869677c8.588387-101.739355 146.663226-149.966452 305.218064-152.609033 158.554839 2.642581 296.629677 50.869677 305.218065 152.609033h-50.869678zM754.456774 473.847742c1.32129-18.498065-19.819355-45.584516-66.725161-66.725161-46.245161-21.140645-112.970323-35.014194-187.623226-35.014194-73.992258 0-141.378065 13.873548-187.623226 35.014194-47.566452 21.140645-68.046452 48.227097-66.725161 66.725161h-50.869677C203.47871 372.108387 341.553548 323.88129 500.108387 321.23871c158.554839 2.642581 296.629677 50.869677 305.218065 152.609032h-50.869678zM754.456774 660.810323c1.32129-18.498065-19.819355-45.584516-66.725161-66.725162-46.245161-21.140645-112.970323-35.014194-187.623226-35.014193-73.992258 0-141.378065 13.873548-187.623226 35.014193-47.566452 21.140645-68.046452 48.227097-66.725161 66.725162h-50.869677C203.47871 559.070968 341.553548 510.843871 500.108387 508.20129c158.554839 2.642581 296.629677 50.869677 305.218065 152.609033h-50.869678zM245.76 643.633548c-1.32129 18.498065 19.819355 45.584516 66.725161 66.725162 46.245161 21.140645 112.970323 35.014194 187.623226 35.014193 73.992258 0 141.378065-13.873548 187.623226-35.014193 47.566452-21.140645 68.046452-48.227097 66.725161-66.725162h50.869678c-8.588387 101.739355-146.663226 149.966452-305.218065 152.609033-158.554839-2.642581-296.629677-50.869677-305.218064-152.609033h50.869677z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="ziyuan145" unicode="&#59113;" d="M513.580247-128l-10.53498 4.740741a1072.460905 1072.460905 0 0 0-271.539094 161.185185C122.469136 132.213992 64.790123 228.082305 55.308642 333.958848a717.958848 717.958848 0 0 0 0 81.64609V845.432099l33.711934-9.744856c137.744856-40.032922 309.201646-3.160494 407.440329 52.674897l11.325103 7.63786 26.337449-11.588477c84.279835-35.81893 171.45679-72.691358 297.349794-65.053498a480.921811 480.921811 0 0 1 102.1893 16.592592L966.584362 843.325103l1.316873-32.921811c1.580247-34.502058 1.580247-71.374486 1.580246-102.979424v-378.205761a194.897119 194.897119 0 0 0-1.843621-26.337449c-19.489712-110.353909-96.395062-190.946502-152.493827-242.041152A1281.843621 1281.843621 0 0 0 685.82716-37.399177a1269.465021 1269.465021 0 0 0-161.975308-85.860082zM107.983539 776.954733V414.024691a666.864198 666.864198 0 0 1 0-75.588477c8.427984-92.707819 58.469136-175.407407 158.024691-260.477366a1003.983539 1003.983539 0 0 1 247.835391-148.54321A1246.814815 1246.814815 0 0 1 659.489712 7.111111a1243.390947 1243.390947 0 0 1 121.942387 92.707819c54.781893 49.777778 119.572016 119.045267 136.164609 212.279835a153.8107 153.8107 0 0 1 0 18.17284V708.213992 776.954733a549.662551 549.662551 0 0 0-80.855967-10.53498c-138.534979-8.427984-235.45679 32.921811-321.053498 69.26749l-3.423869 1.316872A647.374486 647.374486 0 0 0 107.983539 776.954733zM756.674897 582.847737v-48.460906h-198.584362c-1.843621-18.962963-4.213992-36.082305-6.584362-52.674897h164.082304v-206.222222h-57.942386v157.234568h-233.08642v-153.020576H369.777778v203.325103h128.263374q2.633745 22.91358 5.26749 52.674897h-171.983539V500.938272c0-96.395062-8.954733-237.037037-66.633745-330.271605a166.716049 166.716049 0 0 1-47.934156 27.654321C272.329218 286.814815 277.596708 412.707819 277.596708 500.938272V666.074074a2610.831276 2610.831276 0 0 1 401.119341 41.349794l43.720165-44.246913c-44.773663-9.481481-97.44856-17.646091-153.547325-24.230453-1.843621-17.646091-3.423868-36.609053-5.26749-56.098765z m-184.36214-222.024692c0-59.786008-22.386831-141.168724-212.016461-195.423868a223.078189 223.078189 0 0 1-37.135802 43.193416c178.304527 43.983539 190.683128 107.983539 190.683127 152.757201v49.514404h57.415638z m-65.580247 222.024692c0 17.646091 2.37037 34.238683 3.423869 50.304526-59.786008-5.26749-121.152263-8.954733-179.094651-11.325103v-38.979423z m79.012346-302.35391a1546.798354 1546.798354 0 0 0 168.823045-76.115226l-38.979424-36.609054a1185.185185 1185.185185 0 0 1-168.296296 80.329218z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="peizhizhongxin" unicode="&#58896;" d="M511.63 571.6c-103.43 0-187.6-84.16-187.6-187.6s84.16-187.6 187.6-187.6 187.6 84.16 187.6 187.6-84.16 187.6-187.6 187.6z m0-283.14c-52.68 0-95.55 42.87-95.55 95.55s42.87 95.55 95.55 95.55 95.55-42.87 95.55-95.55-42.87-95.55-95.55-95.55zM914.05 319.88c-18.03 0-34.37 7.49-46.03 19.54-11.19 11.55-18.1 27.26-18.1 44.58 0 17.32 6.9 33.03 18.1 44.58 11.65 12.05 27.99 19.54 46.03 19.54 25.42 0 46.03 20.61 46.03 46.03 0 0.73-0.02 1.44-0.06 2.15 0 0.42-0.04 0.84-0.06 1.23-0.06 0.88-0.15 1.76-0.27 2.62-0.04 0.44-0.1 0.86-0.19 1.3-0.1 0.67-0.23 1.32-0.36 1.97-0.1 0.54-0.23 1.09-0.38 1.63-0.08 0.34-0.17 0.67-0.25 1-0.13 0.48-0.27 0.96-0.42 1.44-0.15 0.48-0.29 0.96-0.46 1.44-0.25 0.69-0.5 1.38-0.75 2.05-0.25 0.69-0.52 1.36-0.86 2.03-0.42 0.96-0.88 1.9-1.38 2.82-0.23 0.44-0.48 0.88-0.73 1.32l-0.63 1.09-104.71 181.4-0.29 0.48c-0.25 0.46-0.54 0.92-0.84 1.38-0.27 0.46-0.56 0.92-0.88 1.36-0.27 0.4-0.54 0.82-0.84 1.19-0.17 0.23-0.36 0.48-0.52 0.71-0.27 0.4-0.56 0.77-0.88 1.13-0.21 0.27-0.42 0.52-0.63 0.77-0.36 0.42-0.71 0.84-1.07 1.23a44.62 44.62 0 0 1-3.14 3.16c-0.36 0.31-0.69 0.63-1.05 0.92-0.36 0.31-0.69 0.61-1.07 0.9-0.65 0.5-1.3 1-1.97 1.51-0.08 0.06-0.17 0.13-0.27 0.19-0.75 0.54-1.55 1.07-2.34 1.57-0.02 0-0.04 0.02-0.08 0.04-0.23 0.15-0.46 0.27-0.69 0.42-0.19 0.13-0.38 0.25-0.59 0.36-0.04 0.02-0.06 0.04-0.1 0.04-0.46 0.27-0.94 0.54-1.42 0.8l-1.21 0.63c-21.57 10.59-47.95 2.8-60.13-18.31-8.58-14.83-22.41-25.46-38.93-29.87-1.59-0.42-3.16-0.8-4.75-1.09-15.06-2.87-30.5-0.27-43.91 7.49-12.01 6.92-21.26 17.32-26.67 29.79-1.3 2.95-2.36 5.98-3.2 9.14-4.43 16.55-2.15 33.83 6.4 48.64 8.12 14.06 7.97 30.63 1.09 44.06a45.854 45.854 0 0 1-17.93 18.83c-11.11 6.4-23.77 7.66-35.23 4.5-0.73 0.06-1.46 0.08-2.2 0.08l-195.25 1.57h-0.17c-3.45 0.1-6.97-0.17-10.42-0.88-0.73-0.15-1.46-0.31-2.2-0.48-0.73-0.19-1.46-0.38-2.18-0.61-0.84-0.25-1.67-0.54-2.49-0.84-0.82-0.29-1.61-0.61-2.41-0.96-0.02 0-0.06-0.02-0.08-0.04-0.65-0.27-1.3-0.56-1.92-0.88-0.19-0.08-0.36-0.17-0.52-0.27-0.75-0.36-1.51-0.77-2.24-1.19-22.01-12.72-29.56-40.88-16.84-62.89 8.56-14.83 10.84-32.11 6.4-48.64-0.08-0.31-0.17-0.65-0.27-0.96h-0.02c-4.56-16.13-15.04-29.58-29.58-37.97-14.98-8.66-32.05-10.54-47.66-6.63-16.26 4.08-30.9 14.48-39.92 30.1-12.72 22.01-40.86 29.54-62.89 16.84-0.82-0.48-1.63-0.98-2.43-1.51-0.08-0.06-0.17-0.13-0.27-0.17-0.67-0.46-1.34-0.94-1.99-1.44-0.19-0.13-0.36-0.25-0.54-0.4-0.71-0.56-1.42-1.15-2.11-1.74-0.73-0.65-1.44-1.32-2.15-2.03-0.61-0.61-1.19-1.21-1.78-1.86-0.08-0.08-0.17-0.19-0.25-0.27-0.1-0.15-0.21-0.27-0.36-0.42-0.46-0.56-0.94-1.13-1.4-1.72-0.06-0.06-0.11-0.15-0.17-0.21-0.08-0.15-0.19-0.27-0.31-0.42-0.46-0.63-0.92-1.26-1.36-1.9-0.06-0.1-0.13-0.21-0.19-0.29-0.52-0.82-1.05-1.63-1.53-2.47l-0.29-0.48L70.73 518.25l-0.63-1.09c-0.25-0.44-0.5-0.88-0.73-1.32-0.71-1.34-1.36-2.7-1.95-4.1-0.38-0.92-0.73-1.86-1.05-2.8-0.17-0.48-0.31-0.96-0.46-1.44-0.15-0.48-0.29-0.96-0.42-1.44s-0.25-0.96-0.36-1.46c-0.13-0.48-0.23-0.96-0.31-1.46-0.1-0.48-0.19-0.98-0.27-1.46-0.08-0.5-0.17-1-0.23-1.51-0.13-0.86-0.21-1.74-0.25-2.62-0.04-0.4-0.08-0.82-0.08-1.23-0.04-0.71-0.06-1.42-0.06-2.15 0-25.42 20.61-46.03 46.03-46.03 18.03 0 34.37-7.49 46.03-19.54 11.19-11.55 18.1-27.26 18.1-44.58 0-17.32-6.9-33.03-18.1-44.58-11.65-12.05-27.99-19.54-46.03-19.54-25.42 0-46.03-20.61-46.03-46.03 0-0.73 0.02-1.44 0.06-2.15 0-0.42 0.04-0.84 0.08-1.23 0.04-0.88 0.15-1.76 0.25-2.62 0.06-0.5 0.15-1 0.23-1.51 0.08-0.48 0.17-0.98 0.27-1.46 0.08-0.5 0.19-0.98 0.31-1.46 0.1-0.5 0.23-0.98 0.36-1.46 0.13-0.48 0.27-0.96 0.42-1.44 0.15-0.48 0.29-0.96 0.46-1.44 0.31-0.96 0.65-1.88 1.05-2.8 0.59-1.4 1.23-2.76 1.95-4.1 0.23-0.44 0.48-0.88 0.73-1.32l0.63-1.09 104.71-181.4 0.29-0.48c0.48-0.84 1-1.65 1.53-2.47 0.06-0.08 0.13-0.19 0.19-0.29 0.44-0.65 0.9-1.28 1.36-1.9 0.13-0.15 0.23-0.27 0.31-0.42 0.06-0.06 0.1-0.15 0.17-0.21l0.06-0.06c0.44-0.56 0.9-1.11 1.34-1.65 0.15-0.15 0.25-0.27 0.36-0.42 0.08-0.08 0.17-0.19 0.25-0.27 0.29-0.31 0.59-0.65 0.88-0.94 0.29-0.31 0.59-0.63 0.9-0.92 0.71-0.71 1.42-1.38 2.15-2.03 0.69-0.59 1.4-1.17 2.11-1.74 0.19-0.15 0.36-0.27 0.54-0.4 0.65-0.5 1.32-0.98 1.99-1.44 0.1-0.04 0.19-0.1 0.27-0.17 0.79-0.52 1.61-1.03 2.43-1.51 22.03-12.7 50.17-5.17 62.89 16.84 9.02 15.63 23.68 26.03 39.94 30.11 15.59 3.91 32.66 2.03 47.64-6.63 14.54-8.39 25.02-21.84 29.58-37.95 0.1-0.31 0.21-0.65 0.29-0.98 4.44-16.53 2.15-33.81-6.4-48.64-12.7-22.01-5.17-50.17 16.84-62.89 0.52-0.31 1.07-0.61 1.61-0.88 0.33-0.19 0.67-0.36 1-0.5 1.19-0.61 2.41-1.13 3.64-1.61 0.71-0.29 1.42-0.54 2.15-0.8 0.48-0.15 0.94-0.31 1.42-0.46 0.34-0.1 0.69-0.21 1.05-0.29 0.34-0.08 0.69-0.17 1.05-0.27 0.69-0.17 1.4-0.31 2.11-0.46 3.45-0.71 6.97-0.98 10.42-0.88h208.4c3.18-0.1 6.38 0.13 9.54 0.71 1.59 0.27 3.18 0.63 4.75 1.11 0.61 0.17 1.19 0.36 1.78 0.54 0.71 0.25 1.44 0.5 2.15 0.8 0.54 0.21 1.07 0.42 1.59 0.65 0.46 0.19 0.92 0.4 1.36 0.63 0.42 0.19 0.84 0.4 1.25 0.61 0 0.02 0.02 0.02 0.02 0.02 0.67 0.34 1.34 0.71 2.01 1.09 22.01 12.72 29.56 40.88 16.84 62.89-8.56 14.83-10.84 32.11-6.4 48.64 0.08 0.33 0.19 0.67 0.29 0.98 4.56 16.11 15.04 29.56 29.58 37.95 14.54 8.41 31.44 10.75 47.68 6.65 0.34-0.08 0.65-0.17 0.98-0.25 16.53-4.41 30.36-15.04 38.93-29.88 12.7-22.01 40.86-29.54 62.87-16.84 0.82 0.48 1.63 0.98 2.43 1.51 0.08 0.06 0.17 0.13 0.27 0.17 0.67 0.46 1.34 0.94 1.99 1.44 0.19 0.13 0.36 0.25 0.54 0.4 0.71 0.56 1.42 1.15 2.11 1.74 0.73 0.65 1.44 1.32 2.15 2.03 0.29 0.29 0.61 0.61 0.9 0.92 0.29 0.29 0.59 0.63 0.88 0.94 0.08 0.08 0.17 0.19 0.25 0.27 0.1 0.15 0.21 0.27 0.36 0.42 0.44 0.52 0.86 1.05 1.3 1.59 0.19 0.23 0.4 0.5 0.56 0.75 0.02 0 0.02 0.02 0.02 0.02 0.25 0.31 0.48 0.65 0.71 0.98 0.25 0.31 0.46 0.65 0.69 0.98 0.04 0.06 0.08 0.13 0.13 0.17 0.54 0.82 1.05 1.65 1.55 2.51l0.29 0.48 104.71 181.4 0.63 1.09c0.25 0.44 0.5 0.88 0.73 1.32 0.5 0.92 0.96 1.86 1.38 2.82 0.31 0.67 0.59 1.34 0.86 2.03 0.25 0.67 0.5 1.36 0.75 2.05 0.17 0.48 0.31 0.96 0.46 1.44 0.15 0.48 0.29 0.96 0.42 1.44 0.08 0.34 0.17 0.67 0.25 1 0.15 0.54 0.27 1.09 0.38 1.63 0.13 0.65 0.25 1.3 0.36 1.97 0.08 0.44 0.15 0.86 0.19 1.3 0.13 0.86 0.21 1.74 0.27 2.62 0.02 0.4 0.06 0.82 0.06 1.23 0.04 0.71 0.06 1.42 0.06 2.15 0.01 25.38-20.6 45.99-46.01 45.99z m-160.61-133.2c-40.29 10.8-82.37 5.25-118.5-15.61s-61.97-54.54-72.76-94.83c-4.39-16.36-6.07-33.01-5.1-49.46h-90.13c0.19 2.93 0.27 5.86 0.27 8.79 0 13.56-1.78 27.22-5.4 40.67-10.79 40.29-36.63 73.98-72.76 94.83-36.13 20.86-78.2 26.4-118.5 15.61-16.36-4.39-31.65-11.26-45.42-20.29l-45.08 78.1c51.01 25.71 86.07 78.6 86.07 139.52s-35.06 113.81-86.07 139.52l45.08 78.1c13.77-9.04 29.06-15.9 45.42-20.29 40.29-10.8 82.37-5.25 118.5 15.61 36.13 20.86 61.97 54.54 72.76 94.83 3.62 13.45 5.4 27.11 5.4 40.67 0 2.78-0.08 5.54-0.25 8.31l90.04-0.73c-0.82-16.05 0.9-32.28 5.17-48.24 10.8-40.29 36.63-73.98 72.76-94.83s78.2-26.4 118.5-15.61c16.36 4.39 31.65 11.26 45.42 20.29l45.08-78.1c-51-25.71-86.07-78.6-86.07-139.52s35.06-113.81 86.07-139.52l-45.08-78.1c-13.77 9.02-29.06 15.88-45.42 20.28z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="paigongfenpeishebei" unicode="&#58933;" d="M798.5152 2.4576H232.8576c-36.0448 0-65.3312 29.2864-65.3312 65.3312v131.2768c0 36.0448 29.2864 65.3312 65.3312 65.3312h565.6576c36.0448 0 65.3312-29.2864 65.3312-65.3312v-131.2768c0-35.84-29.2864-65.3312-65.3312-65.3312zM232.8576 223.4368c-13.5168 0-24.3712-10.8544-24.3712-24.3712v-131.2768c0-13.5168 10.8544-24.3712 24.3712-24.3712h565.6576c13.5168 0 24.3712 10.8544 24.3712 24.3712v131.2768c0 13.5168-10.8544 24.3712-24.3712 24.3712H232.8576zM779.0592 284.8768H252.3136c-46.6944 0-84.7872 38.0928-84.7872 84.7872V695.9104c0 46.6944 38.0928 84.7872 84.7872 84.7872h526.7456c46.6944 0 84.7872-38.0928 84.7872-84.7872V369.664c0-46.6944-38.0928-84.7872-84.7872-84.7872zM252.3136 739.7376c-24.1664 0-43.8272-19.6608-43.8272-43.8272V369.664c0-24.1664 19.6608-43.8272 43.8272-43.8272h526.7456c24.1664 0 43.8272 19.6608 43.8272 43.8272V695.9104c0 24.1664-19.6608 43.8272-43.8272 43.8272H252.3136zM720.4864 113.0496h-61.44c-11.264 0-20.48 9.216-20.48 20.48s9.216 20.48 20.48 20.48h61.44c11.264 0 20.48-9.216 20.48-20.48s-9.216-20.48-20.48-20.48zM577.1264 113.0496h-266.24c-11.264 0-20.48 9.216-20.48 20.48s9.216 20.48 20.48 20.48h266.24c11.264 0 20.48-9.216 20.48-20.48s-9.216-20.48-20.48-20.48zM466.944 367.8208c-5.3248 0-10.4448 2.048-14.5408 5.9392l-48.3328 48.3328a20.39808 20.39808 0 1 0 28.8768 28.8768l48.3328-48.3328a20.39808 20.39808 0 0 0-14.336-34.816zM287.1296 284.8768c-5.3248 0-10.4448 2.048-14.5408 5.9392a20.39808 20.39808 0 0 0 0 28.8768l131.4816 131.2768a20.39808 20.39808 0 1 0 28.8768-28.8768l-131.4816-131.2768c-3.8912-3.8912-9.216-5.9392-14.336-5.9392zM466.944 367.8208c-5.3248 0-10.4448 2.048-14.5408 5.9392a20.39808 20.39808 0 0 0 0 28.8768l146.432 146.432a20.39808 20.39808 0 1 0 28.8768-28.8768L481.28 373.76c-3.8912-3.8912-9.216-5.9392-14.336-5.9392zM642.6624 510.5664c-13.7216 0-27.4432 5.12-37.888 15.5648a53.6576 53.6576 0 0 0 0 75.776 53.6576 53.6576 0 0 0 75.776 0 53.6576 53.6576 0 0 0 0-75.776c-10.4448-10.4448-24.1664-15.5648-37.888-15.5648z m0 66.1504a12.61568 12.61568 0 1 1 8.8064-3.6864 11.91936 11.91936 0 0 1-8.8064 3.6864z"  horiz-adv-x="1024" />
+
+    
+
+
+  </font>
+</defs></svg>
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/alicon/iconfont.ttf b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/alicon/iconfont.ttf
new file mode 100644
index 0000000..c94c374
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/alicon/iconfont.ttf
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/alicon/iconfont.woff b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/alicon/iconfont.woff
new file mode 100644
index 0000000..2a449cf
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/alicon/iconfont.woff
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/alicon/iconfont.woff2 b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/alicon/iconfont.woff2
new file mode 100644
index 0000000..578492c
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/alicon/iconfont.woff2
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/layui.css b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/layui.css
new file mode 100644
index 0000000..192721d
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/layui.css
@@ -0,0 +1,2203 @@
+/**
+
+ @Name: layui
+ @Author: 璐ゅ績
+ @Site: www.layui.com
+
+ */
+
+
+/** 鍒濆鍖� **/
+body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,input,button,textarea,p,blockquote,th,td,form,pre{margin: 0; padding: 0; -webkit-tap-highlight-color:rgba(0,0,0,0);}
+a:active,a:hover{outline:0}
+img{display: inline-block; border: none; vertical-align: middle;}
+li{list-style:none;}
+table{border-collapse: collapse; border-spacing: 0;}
+h1,h2,h3{font-weight: 400;}
+h4, h5, h6{font-size: 100%; font-weight: 400;}
+button,input,select,textarea{font-size: 100%; }
+input,button,textarea,select,optgroup,option{font-family: inherit; font-size: inherit; font-style: inherit; font-weight: inherit; outline: 0;}
+pre{white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;}
+
+/** 鍒濆鍖栧叏灞�鏍囩 **/
+body{line-height: 24px; font: 14px Helvetica Neue,Helvetica,PingFang SC,\5FAE\8F6F\96C5\9ED1,Tahoma,Arial,sans-serif;}
+hr{height: 1px; margin: 10px 0; border: 0; clear: both;}
+a{color: #333; text-decoration:none; }
+a:hover{color: #777;}
+a cite{font-style: normal; *cursor:pointer;}
+
+/** 鍩虹閫氱敤 **/
+.layui-border-box, .layui-border-box *{box-sizing: border-box;}
+/* 娑堥櫎绗笁鏂箄i鍙兘閫犳垚鐨勫啿绐� */.layui-box, .layui-box *{box-sizing: content-box;}
+.layui-clear{clear: both; *zoom: 1;}
+.layui-clear:after{content:'\20'; clear:both; *zoom:1; display:block; height:0;}
+.layui-inline{position: relative; display: inline-block; *display:inline; *zoom:1; vertical-align: middle;}
+/* 涓夎褰� */.layui-edge{position: relative; display: inline-block; vertical-align: middle; width: 0; height: 0; border-width: 6px; border-style: dashed; border-color: transparent; overflow: hidden;}
+.layui-edge-top{top: -4px; border-bottom-color: #999; border-bottom-style: solid;}
+.layui-edge-right{border-left-color: #999; border-left-style: solid;}
+.layui-edge-bottom{top: 2px; border-top-color: #999; border-top-style: solid;}
+.layui-edge-left{border-right-color: #999; border-right-style: solid;}
+/* 鍗曡婧㈠嚭鐪佺暐 */.layui-elip{text-overflow: ellipsis; overflow: hidden; white-space: nowrap;}
+/* 灞忚斀閫変腑 */.layui-unselect,.layui-icon, .layui-disabled{-moz-user-select: none; -webkit-user-select: none; -ms-user-select: none;}
+/* 绂佺敤 */.layui-disabled,.layui-disabled:hover{color: #d2d2d2 !important; cursor: not-allowed !important;}
+/* 绾渾瑙� */.layui-circle{border-radius: 100%;}
+.layui-show{display: block !important;}
+.layui-hide{display: none !important;}
+
+/** 鍥炬爣瀛椾綋 **/
+@font-face {font-family: 'layui-icon';
+  src: url('../font/iconfont.eot?v=220');
+  src: url('../font/iconfont.eot?v=220#iefix') format('embedded-opentype'),
+  url('../font/iconfont.svg?v=220#iconfont') format('svg'),
+  url('../font/iconfont.woff?v=220') format('woff'),
+  url('../font/iconfont.ttf?v=220') format('truetype');
+}
+/*娓呮诞鍔�*/
+.clearfloat:after{
+  display: block;
+  clear: both;
+  content: '';
+  visibility: hidden;
+  height:0;
+}
+.clearfloat{
+  zoom:1;
+}
+.layui-icon{
+  font-family:"layui-icon" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+/* font-class 鎸夐挳鐨勫浘鏍�*/
+.layui-icon-reply-fill:before {
+  content: "\e611"
+}
+
+.layui-icon-set-fill:before {
+  content: "\e614"
+}
+
+.layui-icon-menu-fill:before {
+  content: "\e60f"
+}
+
+.layui-icon-search:before {
+  content: "\e615"
+}
+
+.layui-icon-share:before {
+  content: "\e641"
+}
+
+.layui-icon-set-sm:before {
+  content: "\e620"
+}
+
+.layui-icon-engine:before {
+  content: "\e628"
+}
+
+.layui-icon-close:before {
+  content: "\1006"
+}
+
+.layui-icon-close-fill:before {
+  content: "\1007"
+}
+
+.layui-icon-chart-screen:before {
+  content: "\e629"
+}
+
+.layui-icon-star:before {
+  content: "\e600"
+}
+
+.layui-icon-circle-dot:before {
+  content: "\e617"
+}
+
+.layui-icon-chat:before {
+  content: "\e606"
+}
+
+.layui-icon-release:before {
+  content: "\e609"
+}
+
+.layui-icon-list:before {
+  content: "\e60a"
+}
+
+.layui-icon-chart:before {
+  content: "\e62c"
+}
+
+.layui-icon-ok-circle:before {
+  content: "\1005"
+}
+
+.layui-icon-layim-theme:before {
+  content: "\e61b"
+}
+
+.layui-icon-table:before {
+  content: "\e62d"
+}
+
+.layui-icon-right:before {
+  content: "\e602"
+}
+
+.layui-icon-left:before {
+  content: "\e603"
+}
+
+.layui-icon-cart-simple:before {
+  content: "\e698"
+}
+
+.layui-icon-face-cry:before {
+  content: "\e69c"
+}
+
+.layui-icon-face-smile:before {
+  content: "\e6af"
+}
+
+.layui-icon-survey:before {
+  content: "\e6b2"
+}
+
+.layui-icon-tree:before {
+  content: "\e62e"
+}
+
+.layui-icon-ie:before {
+  content: "\e7bb"
+}
+
+.layui-icon-upload-circle:before {
+  content: "\e62f"
+}
+
+.layui-icon-add-circle:before {
+  content: "\e61f"
+}
+
+.layui-icon-download-circle:before {
+  content: "\e601"
+}
+
+.layui-icon-templeate-1:before {
+  content: "\e630"
+}
+
+.layui-icon-util:before {
+  content: "\e631"
+}
+
+.layui-icon-face-surprised:before {
+  content: "\e664"
+}
+
+.layui-icon-edit:before {
+  content: "\e642"
+}
+
+.layui-icon-speaker:before {
+  content: "\e645"
+}
+
+.layui-icon-down:before {
+  content: "\e61a"
+}
+
+.layui-icon-file:before {
+  content: "\e621"
+}
+
+.layui-icon-layouts:before {
+  content: "\e632"
+}
+
+.layui-icon-rate-half:before {
+  content: "\e6c9"
+}
+
+.layui-icon-add-circle-fine:before {
+  content: "\e608"
+}
+
+.layui-icon-prev-circle:before {
+  content: "\e633"
+}
+
+.layui-icon-read:before {
+  content: "\e705"
+}
+
+.layui-icon-404:before {
+  content: "\e61c"
+}
+
+.layui-icon-carousel:before {
+  content: "\e634"
+}
+
+.layui-icon-help:before {
+  content: "\e607"
+}
+
+.layui-icon-code-circle:before {
+  content: "\e635"
+}
+
+.layui-icon-windows:before {
+  content: "\e67f"
+}
+
+.layui-icon-water:before {
+  content: "\e636"
+}
+
+.layui-icon-username:before {
+  content: "\e66f"
+}
+
+.layui-icon-find-fill:before {
+  content: "\e670"
+}
+
+.layui-icon-about:before {
+  content: "\e60b"
+}
+
+.layui-icon-location:before {
+  content: "\e715"
+}
+
+.layui-icon-up:before {
+  content: "\e619"
+}
+
+.layui-icon-pause:before {
+  content: "\e651"
+}
+
+.layui-icon-date:before {
+  content: "\e637"
+}
+
+.layui-icon-layim-uploadfile:before {
+  content: "\e61d"
+}
+
+.layui-icon-delete:before {
+  content: "\e640"
+}
+
+.layui-icon-play:before {
+  content: "\e652"
+}
+
+.layui-icon-top:before {
+  content: "\e604"
+}
+
+.layui-icon-firefox:before {
+  content: "\e686"
+}
+
+.layui-icon-friends:before {
+  content: "\e612"
+}
+
+.layui-icon-refresh-3:before {
+  content: "\e9aa"
+}
+
+.layui-icon-ok:before {
+  content: "\e605"
+}
+
+.layui-icon-layer:before {
+  content: "\e638"
+}
+
+.layui-icon-face-smile-fine:before {
+  content: "\e60c"
+}
+
+.layui-icon-dollar:before {
+  content: "\e659"
+}
+
+.layui-icon-group:before {
+  content: "\e613"
+}
+
+.layui-icon-layim-download:before {
+  content: "\e61e"
+}
+
+.layui-icon-picture-fine:before {
+  content: "\e60d"
+}
+
+.layui-icon-link:before {
+  content: "\e64c"
+}
+
+.layui-icon-diamond:before {
+  content: "\e735"
+}
+
+.layui-icon-log:before {
+  content: "\e60e"
+}
+
+.layui-icon-key:before {
+  content: "\e683"
+}
+
+.layui-icon-rate-solid:before {
+  content: "\e67a"
+}
+
+.layui-icon-fonts-del:before {
+  content: "\e64f"
+}
+
+.layui-icon-unlink:before {
+  content: "\e64d"
+}
+
+.layui-icon-fonts-clear:before {
+  content: "\e639"
+}
+
+.layui-icon-triangle-r:before {
+  content: "\e623"
+}
+
+.layui-icon-circle:before {
+  content: "\e63f"
+}
+
+.layui-icon-radio:before {
+  content: "\e643"
+}
+
+.layui-icon-align-center:before {
+  content: "\e647"
+}
+
+.layui-icon-align-right:before {
+  content: "\e648"
+}
+
+.layui-icon-align-left:before {
+  content: "\e649"
+}
+
+.layui-icon-loading-1:before {
+  content: "\e63e"
+}
+
+.layui-icon-return:before {
+  content: "\e65c"
+}
+
+.layui-icon-fonts-strong:before {
+  content: "\e62b"
+}
+
+.layui-icon-upload:before {
+  content: "\e67c"
+}
+
+.layui-icon-dialogue:before {
+  content: "\e63a"
+}
+
+.layui-icon-video:before {
+  content: "\e6ed"
+}
+
+.layui-icon-headset:before {
+  content: "\e6fc"
+}
+
+.layui-icon-cellphone-fine:before {
+  content: "\e63b"
+}
+
+.layui-icon-add-1:before {
+  content: "\e654"
+}
+
+.layui-icon-face-smile-b:before {
+  content: "\e650"
+}
+
+.layui-icon-fonts-html:before {
+  content: "\e64b"
+}
+
+.layui-icon-screen-full:before {
+  content: "\e622"
+}
+
+.layui-icon-form:before {
+  content: "\e63c"
+}
+
+.layui-icon-cart:before {
+  content: "\e657"
+}
+
+.layui-icon-camera-fill:before {
+  content: "\e65d"
+}
+
+.layui-icon-tabs:before {
+  content: "\e62a"
+}
+
+.layui-icon-heart-fill:before {
+  content: "\e68f"
+}
+
+.layui-icon-fonts-code:before {
+  content: "\e64e"
+}
+
+.layui-icon-ios:before {
+  content: "\e680"
+}
+
+.layui-icon-at:before {
+  content: "\e687"
+}
+
+.layui-icon-fire:before {
+  content: "\e756"
+}
+
+.layui-icon-set:before {
+  content: "\e716"
+}
+
+.layui-icon-fonts-u:before {
+  content: "\e646"
+}
+
+.layui-icon-triangle-d:before {
+  content: "\e625"
+}
+
+.layui-icon-tips:before {
+  content: "\e702"
+}
+
+.layui-icon-picture:before {
+  content: "\e64a"
+}
+
+.layui-icon-more-vertical:before {
+  content: "\e671"
+}
+
+.layui-icon-bluetooth:before {
+  content: "\e689"
+}
+
+.layui-icon-flag:before {
+  content: "\e66c"
+}
+
+.layui-icon-loading:before {
+  content: "\e63d"
+}
+
+.layui-icon-fonts-i:before {
+  content: "\e644"
+}
+
+.layui-icon-refresh-1:before {
+  content: "\e666"
+}
+
+.layui-icon-rmb:before {
+  content: "\e65e"
+}
+
+.layui-icon-addition:before {
+  content: "\e624"
+}
+
+.layui-icon-home:before {
+  content: "\e68e"
+}
+
+.layui-icon-time:before {
+  content: "\e68d"
+}
+
+.layui-icon-user:before {
+  content: "\e770"
+}
+
+.layui-icon-notice:before {
+  content: "\e667"
+}
+
+.layui-icon-chrome:before {
+  content: "\e68a"
+}
+
+.layui-icon-edge:before {
+  content: "\e68b"
+}
+
+.layui-icon-login-weibo:before {
+  content: "\e675"
+}
+
+.layui-icon-voice:before {
+  content: "\e688"
+}
+
+.layui-icon-upload-drag:before {
+  content: "\e681"
+}
+
+.layui-icon-login-qq:before {
+  content: "\e676"
+}
+
+.layui-icon-snowflake:before {
+  content: "\e6b1"
+}
+
+.layui-icon-heart:before {
+  content: "\e68c"
+}
+
+.layui-icon-logout:before {
+  content: "\e682"
+}
+
+.layui-icon-file-b:before {
+  content: "\e655"
+}
+
+.layui-icon-template:before {
+  content: "\e663"
+}
+
+.layui-icon-transfer:before {
+  content: "\e691"
+}
+
+.layui-icon-auz:before {
+  content: "\e672"
+}
+
+.layui-icon-console:before {
+  content: "\e665"
+}
+
+.layui-icon-app:before {
+  content: "\e653"
+}
+
+.layui-icon-prev:before {
+  content: "\e65a"
+}
+
+.layui-icon-website:before {
+  content: "\e7ae"
+}
+
+.layui-icon-next:before {
+  content: "\e65b"
+}
+
+.layui-icon-component:before {
+  content: "\e857"
+}
+
+.layui-icon-android:before {
+  content: "\e684"
+}
+
+.layui-icon-more:before {
+  content: "\e65f"
+}
+
+.layui-icon-login-wechat:before {
+  content: "\e677"
+}
+
+.layui-icon-shrink-right:before {
+  content: "\e668"
+}
+
+.layui-icon-spread-left:before {
+  content: "\e66b"
+}
+
+.layui-icon-camera:before {
+  content: "\e660"
+}
+
+.layui-icon-note:before {
+  content: "\e66e"
+}
+
+.layui-icon-refresh:before {
+  content: "\e669"
+}
+
+.layui-icon-female:before {
+  content: "\e661"
+}
+
+.layui-icon-male:before {
+  content: "\e662"
+}
+
+.layui-icon-screen-restore:before {
+  content: "\e758"
+}
+
+.layui-icon-password:before {
+  content: "\e673"
+}
+
+.layui-icon-senior:before {
+  content: "\e674"
+}
+
+.layui-icon-theme:before {
+  content: "\e66a"
+}
+
+.layui-icon-tread:before {
+  content: "\e6c5"
+}
+
+.layui-icon-praise:before {
+  content: "\e6c6"
+}
+
+.layui-icon-star-fill:before {
+  content: "\e658"
+}
+
+.layui-icon-rate:before {
+  content: "\e67b"
+}
+
+.layui-icon-template-1:before {
+  content: "\e656"
+}
+
+.layui-icon-vercode:before {
+  content: "\e679"
+}
+
+.layui-icon-service:before {
+  content: "\e626"
+}
+
+.layui-icon-cellphone:before {
+  content: "\e678"
+}
+
+.layui-icon-print:before {
+  content: "\e66d"
+}
+
+.layui-icon-cols:before {
+  content: "\e610"
+}
+
+.layui-icon-wifi:before {
+  content: "\e7e0"
+}
+
+.layui-icon-export:before {
+  content: "\e67d"
+}
+
+.layui-icon-rss:before {
+  content: "\e808"
+}
+
+.layui-icon-slider:before {
+  content: "\e714"
+}
+
+.layui-icon-email:before {
+  content: "\e618"
+}
+
+.layui-icon-subtraction:before {
+  content: "\e67e"
+}
+
+.layui-icon-mike:before {
+  content: "\e6dc"
+}
+
+.layui-icon-light:before {
+  content: "\e748"
+}
+
+.layui-icon-gift:before {
+  content: "\e627"
+}
+
+.layui-icon-mute:before {
+  content: "\e685"
+}
+
+.layui-icon-reduce-circle:before {
+  content: "\e616"
+}
+
+.layui-icon-music:before {
+  content: "\e690"
+}
+
+
+
+/* 鍩烘湰甯冨眬 */
+.layui-main{position: relative; width: 1140px; margin: 0 auto;}
+.layui-header{position: relative; z-index: 1000; height: 60px;}
+.layui-header a:hover{transition: all .5s; -webkit-transition: all .5s;}
+.layui-side{position: fixed; top: 0; bottom: 0; z-index: 999; width: 200px; overflow-x: hidden;}
+.layui-side-scroll{width: 220px; height: 100%; overflow-x: hidden;overflow-y:auto}
+.layui-body{position: absolute; left: 200px; right: 0; top: 0; bottom: 0; z-index: 998; width: auto; overflow: hidden; overflow-y: auto; box-sizing: border-box;}
+
+/* 鍚庡彴妗嗘灦澶у竷灞� */.layui-layout-body{overflow: hidden;}
+.layui-layout-admin .layui-header{background-color: #23262E;}
+.layui-layout-admin .layui-side{top: 60px; width: 200px; overflow-x: hidden;}
+.layui-layout-admin .layui-body{top: 60px; bottom: 44px;}
+.layui-layout-admin .layui-main{width: auto; margin: 0 15px;}
+.layui-layout-admin .layui-footer{position: fixed; left: 200px; right: 0; bottom: 0; height: 44px; line-height: 44px; padding: 0 15px; background-color: #eee;}
+.layui-layout-admin .layui-logo{position: absolute; left: 0; top: 0; width: 200px; height: 100%; line-height: 60px; text-align: center; color: #009688; font-size: 16px;}
+.layui-layout-admin .layui-header .layui-nav{background: none;}
+.layui-layout-left{position: absolute !important; left: 200px; top: 0;}
+.layui-layout-right{position: absolute !important; right: 15px; top: 0;}
+
+/* weidy border甯冨眬 */
+.layui-layout-border{
+  overflow:auto;
+  height:90%
+}
+
+.layui-layout-border .layui-north { /*鍖楀尯*/
+     background-color:#23262E;
+     width:auto;
+     min-height:50px;
+    border-bottom:1px solid #9F9F9F;
+}
+
+.layui-layout-border .layui-west{
+     top:5px;
+     width : 200px;
+     overflow-x:hidden;
+   border-right:1px solid #9F9F9F;
+}
+
+.layui-layout-border .layui-center{
+     margin:5px;
+     width:auto;
+     height:auto;
+
+}
+
+.layui-layout-border .layui-south {
+    border-top:1px solid #9F9F9F;
+    /*position:fixed;*/
+    /*left:200px;*/
+    /*right:0;*/
+    bottom:0;
+    width:auto;
+    min-height:50px;
+}
+
+/* 鏍呮牸甯冨眬 */
+.layui-container{position: relative; margin: 0 auto; padding: 0 15px; box-sizing: border-box;}
+.layui-fluid{position: relative; margin: 0 auto; padding: 0 15px;}
+
+.layui-row:before, .layui-row:after{content: ''; display: block; clear: both;}
+.layui-col-xs1, .layui-col-xs2, .layui-col-xs3, .layui-col-xs4, .layui-col-xs5, .layui-col-xs6, .layui-col-xs7, .layui-col-xs8, .layui-col-xs9, .layui-col-xs10, .layui-col-xs11, .layui-col-xs12
+,.layui-col-sm1, .layui-col-sm2, .layui-col-sm3, .layui-col-sm4, .layui-col-sm5, .layui-col-sm6, .layui-col-sm7, .layui-col-sm8, .layui-col-sm9, .layui-col-sm10, .layui-col-sm11, .layui-col-sm12
+,.layui-col-md1, .layui-col-md2, .layui-col-md3, .layui-col-md4, .layui-col-md5, .layui-col-md6, .layui-col-md7, .layui-col-md8, .layui-col-md9, .layui-col-md10, .layui-col-md11, .layui-col-md12
+,.layui-col-lg1, .layui-col-lg2, .layui-col-lg3, .layui-col-lg4, .layui-col-lg5, .layui-col-lg6, .layui-col-lg7, .layui-col-lg8, .layui-col-lg9, .layui-col-lg10, .layui-col-lg11, .layui-col-lg12
+{position: relative; display: block; box-sizing: border-box;}
+
+.layui-col-xs1, .layui-col-xs2, .layui-col-xs3, .layui-col-xs4, .layui-col-xs5, .layui-col-xs6, .layui-col-xs7, .layui-col-xs8, .layui-col-xs9, .layui-col-xs10, .layui-col-xs11, .layui-col-xs12{float: left;}
+.layui-col-xs1{width: 8.33333333%;}
+.layui-col-xs2{width: 16.66666667%;}
+.layui-col-xs3{width: 25%;}
+.layui-col-xs4{width: 33.33333333%;}
+.layui-col-xs5{width: 41.66666667%;}
+.layui-col-xs6{width: 50%;}
+.layui-col-xs7{width: 58.33333333%;}
+.layui-col-xs8{width: 66.66666667%;}
+.layui-col-xs9{width: 75%;}
+.layui-col-xs10{width: 83.33333333%;}
+.layui-col-xs11{width: 91.66666667%;}
+.layui-col-xs12{width: 100%;}
+
+.layui-col-xs-offset1{margin-left: 8.33333333%;}
+.layui-col-xs-offset2{margin-left: 16.66666667%;}
+.layui-col-xs-offset3{margin-left: 25%;}
+.layui-col-xs-offset4{margin-left: 33.33333333%;}
+.layui-col-xs-offset5{margin-left: 41.66666667%;}
+.layui-col-xs-offset6{margin-left: 50%;}
+.layui-col-xs-offset7{margin-left: 58.33333333%;}
+.layui-col-xs-offset8{margin-left: 66.66666667%;}
+.layui-col-xs-offset9{margin-left: 75%;}
+.layui-col-xs-offset10{margin-left: 83.33333333%;}
+.layui-col-xs-offset11{margin-left: 91.66666667%;}
+.layui-col-xs-offset12{margin-left: 100%;}
+
+/* 瓒呭皬灞忓箷(鎵嬫満) */
+@media screen and (max-width: 768px) {
+  .layui-hide-xs{display: none!important;}
+  .layui-show-xs-block{display: block!important;}
+  .layui-show-xs-inline{display: inline!important;}
+  .layui-show-xs-inline-block{display: inline-block!important;}
+}
+
+/* 灏忓瀷灞忓箷(骞虫澘) */
+@media screen and (min-width: 768px) {
+  .layui-container{width: 750px;}
+  .layui-hide-sm{display: none!important;}
+  .layui-show-sm-block{display: block!important;}
+  .layui-show-sm-inline{display: inline!important;}
+  .layui-show-sm-inline-block{display: inline-block!important;}
+
+  .layui-col-sm1, .layui-col-sm2, .layui-col-sm3, .layui-col-sm4, .layui-col-sm5, .layui-col-sm6, .layui-col-sm7, .layui-col-sm8, .layui-col-sm9, .layui-col-sm10, .layui-col-sm11, .layui-col-sm12{float: left;}
+  .layui-col-sm1{width: 8.33333333%;}
+  .layui-col-sm2{width: 16.66666667%;}
+  .layui-col-sm3{width: 25%;}
+  .layui-col-sm4{width: 33.33333333%;}
+  .layui-col-sm5{width: 41.66666667%;}
+  .layui-col-sm6{width: 50%;}
+  .layui-col-sm7{width: 58.33333333%;}
+  .layui-col-sm8{width: 66.66666667%;}
+  .layui-col-sm9{width: 75%;}
+  .layui-col-sm10{width: 83.33333333%;}
+  .layui-col-sm11{width: 91.66666667%;}
+  .layui-col-sm12{width: 100%;}
+  /* 鍒楀亸绉� */
+  .layui-col-sm-offset1{margin-left: 8.33333333%;}
+  .layui-col-sm-offset2{margin-left: 16.66666667%;}
+  .layui-col-sm-offset3{margin-left: 25%;}
+  .layui-col-sm-offset4{margin-left: 33.33333333%;}
+  .layui-col-sm-offset5{margin-left: 41.66666667%;}
+  .layui-col-sm-offset6{margin-left: 50%;}
+  .layui-col-sm-offset7{margin-left: 58.33333333%;}
+  .layui-col-sm-offset8{margin-left: 66.66666667%;}
+  .layui-col-sm-offset9{margin-left: 75%;}
+  .layui-col-sm-offset10{margin-left: 83.33333333%;}
+  .layui-col-sm-offset11{margin-left: 91.66666667%;}
+  .layui-col-sm-offset12{margin-left: 100%;}
+}
+/* 涓瀷灞忓箷(妗岄潰) */
+@media screen and (min-width: 992px) {
+  .layui-container{width: 970px;}
+  .layui-hide-md{display: none!important;}
+  .layui-show-md-block{display: block!important;}
+  .layui-show-md-inline{display: inline!important;}
+  .layui-show-md-inline-block{display: inline-block!important;}
+
+  .layui-col-md1, .layui-col-md2, .layui-col-md3, .layui-col-md4, .layui-col-md5, .layui-col-md6, .layui-col-md7, .layui-col-md8, .layui-col-md9, .layui-col-md10, .layui-col-md11, .layui-col-md12{float: left;}
+  .layui-col-md1{width: 8.33333333%;}
+  .layui-col-md2{width: 16.66666667%;}
+  .layui-col-md3{width: 25%;}
+  .layui-col-md4{width: 33.33333333%;}
+  .layui-col-md5{width: 41.66666667%;}
+  .layui-col-md6{width: 50%;}
+  .layui-col-md7{width: 58.33333333%;}
+  .layui-col-md8{width: 66.66666667%;}
+  .layui-col-md9{width: 75%;}
+  .layui-col-md10{width: 83.33333333%;}
+  .layui-col-md11{width: 91.66666667%;}
+  .layui-col-md12{width: 100%;}
+  /* 鍒楀亸绉� */
+  .layui-col-md-offset1{margin-left: 8.33333333%;}
+  .layui-col-md-offset2{margin-left: 16.66666667%;}
+  .layui-col-md-offset3{margin-left: 25%;}
+  .layui-col-md-offset4{margin-left: 33.33333333%;}
+  .layui-col-md-offset5{margin-left: 41.66666667%;}
+  .layui-col-md-offset6{margin-left: 50%;}
+  .layui-col-md-offset7{margin-left: 58.33333333%;}
+  .layui-col-md-offset8{margin-left: 66.66666667%;}
+  .layui-col-md-offset9{margin-left: 75%;}
+  .layui-col-md-offset10{margin-left: 83.33333333%;}
+  .layui-col-md-offset11{margin-left: 91.66666667%;}
+  .layui-col-md-offset12{margin-left: 100%;}
+}
+/* 澶у瀷灞忓箷(妗岄潰) */
+@media screen and (min-width: 1200px) {
+  .layui-container{width: 1170px;}
+  .layui-hide-lg{display: none!important;}
+  .layui-show-lg-block{display: block!important;}
+  .layui-show-lg-inline{display: inline!important;}
+  .layui-show-lg-inline-block{display: inline-block!important;}
+
+  .layui-col-lg1, .layui-col-lg2, .layui-col-lg3, .layui-col-lg4, .layui-col-lg5, .layui-col-lg6, .layui-col-lg7, .layui-col-lg8, .layui-col-lg9, .layui-col-lg10, .layui-col-lg11, .layui-col-lg12{float: left;}
+  .layui-col-lg1{width: 8.33333333%;}
+  .layui-col-lg2{width: 16.66666667%;}
+  .layui-col-lg3{width: 25%;}
+  .layui-col-lg4{width: 33.33333333%;}
+  .layui-col-lg5{width: 41.66666667%;}
+  .layui-col-lg6{width: 50%;}
+  .layui-col-lg7{width: 58.33333333%;}
+  .layui-col-lg8{width: 66.66666667%;}
+  .layui-col-lg9{width: 75%;}
+  .layui-col-lg10{width: 83.33333333%;}
+  .layui-col-lg11{width: 91.66666667%;}
+  .layui-col-lg12{width: 100%;}
+  /* 鍒楀亸绉� */
+  .layui-col-lg-offset1{margin-left: 8.33333333%;}
+  .layui-col-lg-offset2{margin-left: 16.66666667%;}
+  .layui-col-lg-offset3{margin-left: 25%;}
+  .layui-col-lg-offset4{margin-left: 33.33333333%;}
+  .layui-col-lg-offset5{margin-left: 41.66666667%;}
+  .layui-col-lg-offset6{margin-left: 50%;}
+  .layui-col-lg-offset7{margin-left: 58.33333333%;}
+  .layui-col-lg-offset8{margin-left: 66.66666667%;}
+  .layui-col-lg-offset9{margin-left: 75%;}
+  .layui-col-lg-offset10{margin-left: 83.33333333%;}
+  .layui-col-lg-offset11{margin-left: 91.66666667%;}
+  .layui-col-lg-offset12{margin-left: 100%;}
+}
+
+/* 鍒楅棿闅� */.layui-col-space1{margin: -0.5px;}
+.layui-col-space1>*{padding: 0.5px;}
+.layui-col-space3{margin: -1.5px;}
+.layui-col-space3>*{padding: 1.5px;}
+.layui-col-space5{margin: -2.5px;}
+.layui-col-space5>*{padding: 2.5px;}
+.layui-col-space8{margin: -3.5px;}
+.layui-col-space8>*{padding: 3.5px;}
+.layui-col-space10{margin: -5px;}
+.layui-col-space10>*{padding: 5px;}
+.layui-col-space12{margin: -6px;}
+.layui-col-space12>*{padding: 6px;}
+.layui-col-space15{margin: -7.5px;}
+.layui-col-space15>*{padding: 7.5px;}
+.layui-col-space18{margin: -9px;}
+.layui-col-space18>*{padding: 9px;}
+.layui-col-space20{margin: -10px;}
+.layui-col-space20>*{padding: 10px;}
+.layui-col-space22{margin: -11px;}
+.layui-col-space22>*{padding: 11px;}
+.layui-col-space25{margin: -12.5px;}
+.layui-col-space25>*{padding: 12.5px;}
+.layui-col-space30{margin: -15px;}
+.layui-col-space30>*{padding: 15px;}
+
+
+/** 椤甸潰鍏冪礌 **/
+.layui-btn, .layui-input, .layui-textarea, .layui-upload-button, .layui-select{outline: none; -webkit-appearance: none; transition: all .3s; -webkit-transition: all .3s; box-sizing: border-box;}
+
+/* 寮曠敤 */.layui-elem-quote{margin-bottom: 10px; padding: 15px; line-height: 22px; border-left: 5px solid #009688; border-radius: 0 2px 2px 0; background-color: #f2f2f2;}
+.layui-quote-nm{border-style: solid; border-width: 1px; border-left-width: 5px; background: none;}
+/* 瀛楁闆嗗悎 */.layui-elem-field{margin-bottom: 10px; padding: 0; border-width: 1px; border-style: solid;}
+.layui-elem-field legend{margin-left: 20px; padding: 0 10px; font-size: 20px; font-weight: 300;}
+.layui-field-title{margin: 10px 0 20px; border-width: 0; border-top-width: 1px;}
+.layui-field-box{padding: 10px 15px;}
+.layui-field-title .layui-field-box{padding: 10px 0;}
+
+
+/* 杩涘害鏉� */
+.layui-progress{position: relative; height: 6px; border-radius: 20px; background-color: #e2e2e2;}
+.layui-progress-bar{position: absolute; left: 0; top: 0; width: 0; max-width: 100%; height: 6px; border-radius: 20px; text-align: right; background-color: #5FB878; transition: all .3s; -webkit-transition: all .3s;}
+.layui-progress-big,
+.layui-progress-big .layui-progress-bar{height: 18px; line-height: 18px;}
+.layui-progress-text{position: relative; top: -20px; line-height: 18px; font-size: 12px; color: #666}
+.layui-progress-big .layui-progress-text{position: static; padding: 0 10px; color: #fff;}
+
+
+/*
+
+  闈㈡澘
+
+*/
+
+
+/* 鎶樺彔闈㈡澘 */
+.layui-collapse{border-width: 1px; border-style: solid; border-radius: 2px;}
+.layui-colla-item,
+.layui-colla-content{border-top-width: 1px; border-top-style: solid;}
+.layui-colla-item:first-child{border-top: none;}
+.layui-colla-title{position: relative; height: 42px; line-height: 42px; padding: 0 15px 0 35px; color: #333; background-color: #f2f2f2; cursor: pointer; font-size: 14px;}
+.layui-colla-content{display: none; padding: 10px 15px; line-height: 22px; color: #666;}
+.layui-colla-icon{position: absolute; left: 15px; top: 0; font-size: 14px;}
+
+/* 鍗$墖闈㈡澘 */
+.layui-card{margin-bottom: 15px; border-radius: 2px; background-color: #fff; box-shadow: 0 1px 2px 0 rgba(0,0,0,.05);}
+.layui-card:last-child{margin-bottom: 0;}
+.layui-card-header{position: relative; height: 42px; line-height: 42px; padding: 0 15px; border-bottom: 1px solid #f6f6f6; color: #333; border-radius: 2px 2px 0 0; font-size: 14px;}
+.layui-card-body{position: relative; padding: 10px 15px; line-height: 24px;}
+.layui-card-body .layui-table{margin: 5px 0;}
+.layui-card .layui-tab{margin: 0;}
+
+/* 甯歌闈㈡澘 */
+.layui-panel{}
+
+/* 绐楀彛闈㈡澘 */
+.layui-panel-window{position: relative; padding: 15px; border-radius: 0; border-top: 5px solid #E6E6E6; background-color: #fff;}
+
+
+
+/*
+
+  榛樿涓婚
+
+*/
+
+
+/* 鑳屾櫙棰滆壊 */
+.layui-bg-red{background-color: #FF5722 !important; color: #fff!important;} /*璧�*/
+.layui-bg-orange{background-color: #FFB800!important; color: #fff!important;} /*姗�*/
+.layui-bg-green{background-color: #009688!important; color: #fff!important;} /*缁�*/
+.layui-bg-cyan{background-color: #2F4056!important; color: #fff!important;} /*闈�*/
+.layui-bg-blue{background-color: #1E9FFF!important; color: #fff!important;} /*钃�*/
+.layui-bg-black{background-color: #393D49!important; color: #fff!important;} /*榛�*/
+.layui-bg-gray{background-color: #eee!important; color: #666!important;} /*鐏�*/
+
+/* 杈规 */
+.layui-quote-nm,
+.layui-elem-field,
+.layui-collapse,
+.layui-colla-item,
+.layui-colla-content,
+.layui-badge-rim,
+.layui-tab-title,
+.layui-tab-title .layui-this:after,
+.layui-tab-bar,
+.layui-tab-card,
+
+.layui-input, .layui-textarea, .layui-select,
+.layui-form-pane .layui-form-label,
+.layui-form-pane .layui-form-item[pane],
+.layui-layedit, .layui-layedit-tool{border-color: #e6e6e6}
+
+/* 鑳屾櫙杈规 */
+hr, .layui-timeline-item:before{background-color: #e6e6e6;}
+
+/* 鏂囨湰鍖哄煙 */
+.layui-text{line-height: 22px; font-size: 14px; color: #666;}
+.layui-text h1,
+.layui-text h2,
+.layui-text h3{font-weight: 500; color: #333;}
+.layui-text h1{font-size: 30px;}
+.layui-text h2{font-size: 24px;}
+.layui-text h3{font-size: 18px;}
+.layui-text a:not(.layui-btn){color: #01AAED;}
+.layui-text a:not(.layui-btn):hover{text-decoration: underline;}
+.layui-text ul{padding: 5px 0 5px 15px;}
+.layui-text ul li{margin-top: 5px; list-style-type: disc;}
+.layui-text em,
+.layui-word-aux{color: #999 !important; padding: 0 5px !important;}
+
+/*
+
+  鎸夐挳
+
+*/
+
+.layui-btn{display: inline-block; vertical-align: middle; height: 38px; line-height: 38px; padding: 0 18px; background-color: #009688; color: #fff; white-space: nowrap; text-align: center; font-size: 14px; border: none; border-radius: 2px; cursor: pointer; -moz-user-select: none; -webkit-user-select: none; -ms-user-select: none;}
+.layui-btn:hover{opacity: 0.8; filter:alpha(opacity=80); color: #fff;}
+.layui-btn:active{opacity: 1; filter:alpha(opacity=100);}
+.layui-btn+.layui-btn{margin-left: 10px;}
+
+.layui-layer-btn-beforeinfo{
+	padding:5px 10px 10px 5px;
+	text-align:left;
+	border:1px solid #E9E7E7;
+	float:left;
+	display:inline-block;
+	vertical-align: middle;
+  margin-top:10px;
+  margin-left:5px;
+}
+
+/* 鎸夐挳瀹瑰櫒 */
+.layui-btn-container{font-size: 0;}
+.layui-btn-container .layui-btn{margin-right: 10px; margin-top: 5px;}
+.layui-btn-container .layui-btn+.layui-btn{margin-left: 0;}
+.layui-table .layui-btn-container .layui-btn{margin-bottom: 9px;}
+
+
+/* 鍦嗚 */.layui-btn-radius{border-radius: 100px;}
+.layui-btn .layui-icon{margin-right: 3px; font-size: 18px; vertical-align: bottom; vertical-align: middle\0;}
+
+/* 鍘熷 */.layui-btn-primary{border: 1px solid #C9C9C9; background-color: #fff; color: #555;}
+.layui-btn-primary:hover{border-color: #009688; color: #333}
+/* 鐧炬惌 */.layui-btn-normal{background-color: #1E9FFF;}
+/* 鏆栬壊 */.layui-btn-warm{background-color: #FFB800;}
+/* 璀﹀憡 */.layui-btn-danger{background-color: #FF5722;}
+/* 绂佺敤 */.layui-btn-disabled,.layui-btn-disabled:hover,.layui-btn-disabled:active{border: 1px solid #e6e6e6; background-color: #FBFBFB; color: #C9C9C9; cursor: not-allowed; opacity: 1;}
+
+/* 澶у瀷 */.layui-btn-lg{height: 44px; line-height: 44px; padding: 0 25px; font-size: 16px;}
+/* 灏忓瀷 */.layui-btn-sm{height: 30px; line-height: 30px; padding: 0 10px; font-size: 12px;}
+.layui-btn-sm i{font-size: 16px !important;}
+/* 瓒呭皬 */.layui-btn-xs{height: 22px; line-height: 22px; padding: 0 5px; font-size: 12px;}
+.layui-btn-xs i{font-size: 14px !important;}
+/* 鎸夐挳缁� */.layui-btn-group{display: inline-block; vertical-align: middle; font-size: 0;}
+.layui-btn-group .layui-btn{margin-left: 0!important; margin-right: 0!important; border-left: 1px solid rgba(255,255,255,.5); border-radius: 0;}
+.layui-btn-group .layui-btn-primary{border-left: none;}
+.layui-btn-group .layui-btn-primary:hover{border-color: #C9C9C9; color: #009688;}
+.layui-btn-group .layui-btn:first-child{border-left: none; border-radius: 2px 0 0 2px;}
+.layui-btn-group .layui-btn-primary:first-child{border-left: 1px solid #c9c9c9;}
+.layui-btn-group .layui-btn:last-child{border-radius: 0 2px 2px 0;}
+.layui-btn-group .layui-btn+.layui-btn{margin-left: 0;}
+.layui-btn-group+.layui-btn-group{margin-left: 10px;}
+/* 娴佷綋 */.layui-btn-fluid{width: 100%;}
+
+/** 琛ㄥ崟 **/
+.layui-form{/*weidy娣诲姞锛岄粯璁ょ暀10px鐨勭┖鐧�*/
+  margin-top:10px;
+}
+.layui-input, .layui-textarea, .layui-select{height: 38px; line-height: 1.3; line-height: 38px\9; border-width: 1px; border-style: solid; background-color: #fff; border-radius: 2px;}
+.layui-input::-webkit-input-placeholder,
+.layui-textarea::-webkit-input-placeholder,
+.layui-select::-webkit-input-placeholder{line-height: 1.3;}
+.layui-input, .layui-textarea{display: block; width: 100%; padding-left: 10px;}
+.layui-input:hover, .layui-textarea:hover{border-color: #D2D2D2 !important;}
+.layui-input:focus, .layui-textarea:focus{border-color: #C9C9C9 !important;}
+.layui-textarea{position: relative; min-height: 100px; height: auto; line-height: 20px; padding: 6px 10px; resize: vertical;}
+.layui-select{padding: 0 10px;}
+.layui-form select,
+.layui-form input[type=checkbox],
+.layui-form input[type=radio]{display: none;}
+.layui-form *[lay-ignore]{display: initial;}
+
+.layui-form-item{/*margin-bottom: 15px;*/ clear: both; *zoom: 1;}
+.layui-form-item:after{content:'\20'; clear: both; *zoom: 1; display: block; height:0;}
+.layui-form-label{position: relative; float: left; display: block; padding: 9px 15px;  width: 80px; font-weight: 400; line-height: 20px; text-align: right;font-weight: 400}
+.layui-form-label-col{display: block; float: none; padding: 9px 0; line-height: 20px; text-align: left;}
+.layui-form-item .layui-inline{margin-bottom: 5px; margin-right: 10px;}
+.layui-input-block, .layui-input-inline{position: relative;}
+.layui-input-block{margin-left: 110px; min-height: 36px;margin-bottom:15px;}
+.layui-input-inline{display: inline-block; vertical-align: middle;}
+.layui-form-item .layui-input-inline{float: left; min-width: 190px; margin-right: 10px;margin-bottom:15px;}
+.layui-form-text .layui-input-inline{width: auto;}
+
+/*蹇呰緭瀛楁锛屾坊鍔犵孩鏄熷彿 weidy@2018-03-05*/
+.layui-field-required {}
+.layui-field-required:after{
+	content:'*';
+	color:red;
+}
+/*鍏抽敭灞炴�э紝娣诲姞钃濊壊鐨勬槦鍙� weidy@2022-2-26*/
+.layui-field-key-field{
+  font-family:"layui-icon" !important;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+.layui-field-key-field:before{
+  content: "\e67a";
+  font-size:10px;
+  color: #0e33d4;
+}
+
+/* 鍙瀛楁锛屾坊鍔犵伆鑹茬殑鑳屾櫙 weidy@2018-03-05*/
+.layui-field-readonly{
+	background-color:#e2dfdf;
+}
+
+
+/* 鍒嗗壊鍧� */.layui-form-mid{position: relative; float: left; display: block; padding: 9px 0 !important; line-height: 20px; margin-right: 10px;}
+/* 璀﹀憡鍩� */.layui-form-danger:focus
+,.layui-form-danger+.layui-form-select .layui-input{border-color: #FF5722 !important;}
+
+
+/* 涓嬫媺閫夋嫨 */.layui-form-select{position: relative;}
+.layui-form-select .layui-input{padding-right: 30px; cursor: pointer;}
+.layui-form-select .layui-edge{position: absolute; right: 10px; top: 50%; margin-top: -3px; cursor: pointer; border-width: 6px; border-top-color: #c2c2c2; border-top-style: solid; transition: all .3s; -webkit-transition: all .3s;}
+.layui-form-select dl{display: none; position: absolute; left: 0; top: 42px; padding: 5px 0; z-index: 999; min-width: 100%; border: 1px solid #d2d2d2; max-height: 300px; overflow-y: auto; background-color: #fff; border-radius: 2px; box-shadow: 0 2px 4px rgba(0,0,0,.12); box-sizing: border-box;}
+.layui-form-select dl dt,
+.layui-form-select dl dd{padding: 0 10px; line-height: 36px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;}
+.layui-form-select dl dt{font-size: 12px; color: #999;}
+.layui-form-select dl dd{cursor: pointer;}
+.layui-form-select dl dd:hover{background-color: #f2f2f2;}
+.layui-form-select .layui-select-group dd{padding-left: 20px;}
+.layui-form-select dl dd.layui-select-tips{padding-left: 10px !important; color: #999;}
+.layui-form-select dl dd.layui-this{background-color: #5FB878; color: #fff;}
+.layui-form-select dl dd.layui-disabled{background-color: #fff;}
+.layui-form-selected dl{display: block;}
+.layui-form-selected .layui-edge{margin-top: -9px; -webkit-transform:rotate(180deg); transform: rotate(180deg);}
+.layui-form-selected .layui-edge{margin-top: -3px\0; }
+:root .layui-form-selected .layui-edge{margin-top: -9px\0/IE9;}
+.layui-form-selectup dl{top: auto; bottom: 42px;}
+.layui-select-none{margin: 5px 0; text-align: center; color: #999;}
+
+.layui-select-disabled .layui-disabled{border-color: #eee !important;}
+.layui-select-disabled .layui-edge{border-top-color: #d2d2d2}
+
+/* 鍙傜収妗嗕腑鐨勬悳绱㈠浘鏍� weidy@2018-03-07*/
+.layui-form-select  .layui-search{
+	position: absolute;
+	right: 21px;
+	top: 30%;
+	margin-top: 0px;
+  cursor: pointer;
+    font-family:"layui-icon" !important;
+    font-size: 16px;
+    font-style: normal;
+    -webkit-font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
+}
+.layui-form-select  .layui-search:before{
+	content:"\e615";
+}
+
+
+/* 鍙傜収妗嗕腑鐨勬竻闄ゅ浘鏍� weidy@2018-03-07*/
+.layui-form-select .layui-clear {
+	position: absolute;
+  right: 5px;
+  top: 30%;
+  margin-top: 0px;
+  cursor: pointer;
+    font-family:"layui-icon" !important;
+    font-size: 16px;
+    font-style: normal;
+    -webkit-font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
+}
+.layui-form-select .layui-clear:after{
+	content:"\1006";
+}
+/* 澶嶉�夋 */.layui-form-checkbox{position: relative; display: inline-block; vertical-align: middle; height: 30px; line-height: 28px; margin-right: 10px; padding-right: 30px; border: 1px solid #d2d2d2; background-color: #fff; cursor: pointer; font-size: 0; border-radius: 2px;  -webkit-transition: .1s linear; transition: .1s linear; box-sizing: border-box;}
+.layui-form-checkbox:hover{border: 1px solid #c2c2c2;}
+.layui-form-checkbox *{display: inline-block; vertical-align: middle;}
+.layui-form-checkbox span{padding: 0 10px; height: 100%; font-size: 14px; background-color: #d2d2d2; color: #fff; overflow: hidden; white-space: nowrap; text-overflow: ellipsis;}
+.layui-form-checkbox:hover span{background-color: #c2c2c2;}
+.layui-form-checkbox i{position: absolute; right: 0; width: 30px; color: #fff; font-size: 20px; text-align: center;}
+.layui-form-checkbox:hover i{color: #c2c2c2;}
+.layui-form-checked, .layui-form-checked:hover{border-color: #5FB878;}
+.layui-form-checked span, .layui-form-checked:hover span{background-color: #5FB878;}
+.layui-form-checked i, .layui-form-checked:hover i{color: #5FB878;}
+.layui-form-item .layui-form-checkbox{margin-top: 4px;}
+
+/* 澶嶉�夋-鍘熷椋庢牸 */
+.layui-form-checkbox[lay-skin="primary"] {height: auto!important;line-height: normal!important; min-width: 16px;min-height: 16px;border: none!important;margin-right: 0;padding-left: 28px;padding-right: 0;background:none}
+.layui-form-checkbox[lay-skin="primary"] span {padding-left: 0;padding-right: 15px;line-height: 16px;background: 0 0;color: #666}
+.layui-form-checkbox[lay-skin="primary"] i {right: auto;left: 0;width: 16px;height: 16px;line-height: 16px;border: 1px solid #d2d2d2;font-size: 12px;
+  border-radius: 2px;background-color: #fff;-webkit-transition: .1s linear;transition: .1s linear}
+.layui-form-checkbox[lay-skin="primary"]:hover i {border-color: #5FB878;color: #fff}
+.layui-form-checked[lay-skin="primary"] i {border-color: #5FB878!important;background-color: #5FB878;color: #fff}
+.layui-checkbox-disabled[lay-skin="primary"] span {background: 0 0!important;color: #c2c2c2!important}
+.layui-checkbox-disabled[lay-skin="primary"]:hover i {border-color: #d2d2d2}
+.layui-form-item .layui-form-checkbox[lay-skin="primary"] {margin-top: 10px}
+
+/* 澶嶉�夋-寮�鍏抽鏍� */
+.layui-form-switch {position: relative;height: 22px;line-height: 24px;width: 42px;padding: 0 5px;margin-top: 6px;border: 1px solid #d2d2d2;border-radius: 20px;box-sizing:content-box;cursor: pointer;background-color: #fff;-webkit-transition: .1s linear;transition: .1s linear}
+.layui-form-switch i {position: absolute;left: 5px;top: 3px; width: 16px;height: 16px;border-radius: 20px;background-color: #d2d2d2;-webkit-transition: .1s linear;transition: .1s linear}
+.layui-form-switch em {position: relative;top: 0;width: 25px;margin-left: 26px;padding: 0!important;text-align: center!important;color: #999!important;font-style: normal!important;font-size: 12px}
+.layui-form-onswitch {border-color: #5FB878;background-color: #5FB878}
+.layui-form-onswitch i {left: 100%;margin-left: -21px;background-color: #fff}
+.layui-form-onswitch em {margin-left: 5px;margin-right: 21px;color: #fff!important}
+
+.layui-checkbox-disbaled{border-color: #e2e2e2 !important;}
+.layui-checkbox-disbaled span{background-color: #e2e2e2 !important;}
+.layui-checkbox-disbaled:hover i{color: #fff !important;}
+
+/* 鍗曢�夋 */
+*[lay-radio]{display: none;}
+.layui-form-radio{display: inline-block; vertical-align: middle; line-height: 28px; margin: 6px 10px 0 0; padding-right: 10px; cursor: pointer; font-size: 0;}
+.layui-form-radio *{display: inline-block; vertical-align: middle; font-size: 14px;}
+.layui-form-radio>i{margin-right: 8px; font-size: 22px; color: #c2c2c2;}
+.layui-form-radioed>i,.layui-form-radio>i:hover{color: #5FB878;}
+.layui-radio-disbaled>i{color: #e2e2e2 !important;}
+
+/* 琛ㄥ崟鏂规椋庢牸 */.layui-form-pane .layui-form-label{width: 110px; padding: 8px 15px; height: 38px; line-height: 20px; border-width: 1px; border-style: solid; border-radius: 2px 0 0 2px; text-align: center; background-color: #FBFBFB; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; box-sizing: border-box;}
+.layui-form-pane .layui-input-inline{margin-left: -1px;}
+.layui-form-pane .layui-input-block{margin-left: 110px; left: -1px;}
+.layui-form-pane .layui-input{border-radius: 0 2px 2px 0;}
+.layui-form-pane .layui-form-text .layui-form-label{float: none; width: 100%; border-radius: 2px; box-sizing: border-box; text-align: left;}
+.layui-form-pane .layui-form-text .layui-input-inline{display: block; margin: 0; top: -1px; clear: both;}
+.layui-form-pane .layui-form-text .layui-input-block{margin: 0; left: 0; top: -1px;}
+.layui-form-pane .layui-form-text .layui-textarea{min-height: 100px; border-radius: 0 0 2px 2px;}
+.layui-form-pane .layui-form-checkbox{margin: 4px 0 4px 10px;}
+.layui-form-pane .layui-form-switch,
+.layui-form-pane .layui-form-radio{margin-top: 6px; margin-left: 10px; }
+.layui-form-pane .layui-form-item[pane]{position: relative; border-width: 1px; border-style: solid;}
+.layui-form-pane .layui-form-item[pane] .layui-form-label{position: absolute; left: 0; top: 0; height: 100%; border-width: 0px; border-right-width: 1px;}
+.layui-form-pane .layui-form-item[pane] .layui-input-inline{margin-left: 110px;}
+
+/** 琛ㄥ崟鍝嶅簲寮� **/
+@media screen and (max-width: 450px) {
+  .layui-form-item .layui-form-label{text-overflow: ellipsis; overflow: hidden; white-space: nowrap;}
+  .layui-form-item .layui-inline{display: block; margin-right: 0; margin-bottom: 20px; clear: both;}
+  .layui-form-item .layui-inline:after{content:'\20'; clear:both; display:block; height:0;}
+  .layui-form-item .layui-input-inline{display: block; float: none; left: -3px; width: auto; margin: 0 0 10px 112px; }
+  .layui-form-item .layui-input-inline+.layui-form-mid{margin-left: 110px; top: -5px; padding: 0;}
+  .layui-form-item .layui-form-checkbox{margin-right: 5px; margin-bottom: 5px;}
+}
+
+/** 瀵屾枃鏈紪杈戝櫒 **/
+.layui-layedit{border-width: 1px; border-style: solid; border-radius: 2px;}
+.layui-layedit-tool{padding: 3px 5px; border-bottom-width: 1px; border-bottom-style: solid; font-size: 0;}
+.layedit-tool-fixed{position: fixed; top: 0; border-top: 1px solid #e2e2e2;}
+.layui-layedit-tool .layedit-tool-mid,
+.layui-layedit-tool .layui-icon{display: inline-block; vertical-align: middle; text-align: center; font-size: 14px;}
+.layui-layedit-tool .layui-icon{position: relative; width: 32px; height: 30px; line-height: 30px; margin: 3px 5px; border-radius: 2px; color: #777; cursor: pointer; border-radius: 2px;}
+.layui-layedit-tool .layui-icon:hover{color: #393D49;}
+.layui-layedit-tool .layui-icon:active{color: #000;}
+.layui-layedit-tool .layedit-tool-active{background-color: #e2e2e2; color: #000;}
+.layui-layedit-tool .layui-disabled,
+.layui-layedit-tool .layui-disabled:hover{color: #d2d2d2; cursor: not-allowed;}
+.layui-layedit-tool .layedit-tool-mid{width: 1px; height: 18px; margin: 0 10px; background-color: #d2d2d2;}
+
+.layedit-tool-html{width: 50px !important; font-size: 30px !important;}
+.layedit-tool-b,
+.layedit-tool-code,
+.layedit-tool-help{font-size: 16px !important;}
+.layedit-tool-d,
+.layedit-tool-unlink,
+.layedit-tool-face,
+.layedit-tool-image{font-size: 18px !important;}
+.layedit-tool-image input{position: absolute; font-size: 0; left: 0; top: 0; width: 100%; height: 100%; opacity: 0.01; filter: Alpha(opacity=1); cursor: pointer;}
+
+.layui-layedit-iframe iframe{display: block; width: 100%;}
+#LAY_layedit_code{overflow: hidden;}
+
+/** 鍒嗛〉 **/
+.layui-laypage{display: inline-block; *display: inline; *zoom: 1; vertical-align: middle; margin: 10px 0; font-size: 0;}
+.layui-laypage>a:first-child,
+.layui-laypage>a:first-child em{border-radius: 2px 0 0 2px;}
+.layui-laypage>a:last-child,
+.layui-laypage>a:last-child em{border-radius: 0 2px 2px 0;}
+.layui-laypage>*:first-child{margin-left: 0!important;}
+.layui-laypage>*:last-child{margin-right: 0!important;}
+.layui-laypage a,
+.layui-laypage span,
+.layui-laypage input,
+.layui-laypage button,
+.layui-laypage select{border: 1px solid #e2e2e2;}
+.layui-laypage a,
+.layui-laypage span{display: inline-block; *display: inline; *zoom: 1; vertical-align: middle; padding: 0 15px; height: 28px; line-height: 28px; margin: 0 -1px 5px 0; background-color: #fff; color: #333; font-size: 12px;}
+.layui-laypage a:hover{color: #009688;}
+.layui-laypage em{font-style: normal;}
+.layui-laypage .layui-laypage-spr{color:#999; font-weight: 700;}
+.layui-laypage a{ text-decoration: none;}
+.layui-laypage .layui-laypage-curr{position: relative;}
+.layui-laypage .layui-laypage-curr em{position: relative; color: #fff;}
+.layui-laypage .layui-laypage-curr .layui-laypage-em{position: absolute; left: -1px; top: -1px; padding: 1px; width: 100%; height: 100%; background-color: #009688; }
+.layui-laypage-em{border-radius: 2px;}
+.layui-laypage-prev em,
+.layui-laypage-next em{font-family: Sim sun; font-size: 16px;}
+
+.layui-laypage .layui-laypage-count,
+.layui-laypage .layui-laypage-limits,
+.layui-laypage .layui-laypage-skip{margin-left: 10px; margin-right: 10px; padding: 0; border: none;}
+.layui-laypage .layui-laypage-limits{vertical-align: top;}
+.layui-laypage select{height: 22px; padding: 3px; border-radius: 2px; cursor: pointer;}
+.layui-laypage .layui-laypage-skip{height: 30px; line-height: 30px; color: #999;}
+/**weidy娣诲姞鍒锋柊鎸夐挳**/
+.layui-laypage .layui-laypage-refresh-btn{height:30px;line-height:30px;color:#999;}
+.layui-laypage input, .layui-laypage button{height: 30px; line-height: 30px; border-radius: 2px; vertical-align: top;  background-color: #fff; box-sizing: border-box;}
+.layui-laypage input{display: inline-block; width: 40px; margin: 0 10px; padding: 0 3px; text-align: center;}
+.layui-laypage input:focus,
+.layui-laypage select:focus{border-color: #009688!important;}
+.layui-laypage button{margin-left: 10px; padding: 0 10px; cursor: pointer;}
+
+/** 娴佸姞杞� **/
+.layui-flow-more{margin: 10px 0; text-align: center; color: #999; font-size: 14px;}
+.layui-flow-more a{ height: 32px; line-height: 32px;  }
+.layui-flow-more a *{display: inline-block; vertical-align: top;}
+.layui-flow-more a cite{padding: 0 20px; border-radius: 3px; background-color: #eee; color: #333; font-style: normal;}
+.layui-flow-more a cite:hover{opacity: 0.8;}
+.layui-flow-more a i{font-size: 30px; color: #737383;}
+
+/** 琛ㄦ牸 **/  /*淇敼琛ㄦ牸margin-top涓�0px,鍘熶负10px*/
+.layui-table{width: 100%; margin: 0px 0; background-color: #fff; color: #666;}
+.layui-table tr{transition: all .3s; -webkit-transition: all .3s;}
+/** 琛ㄦ牸鐨勫伐鍏锋爮 **/
+.layui-table-toolbar{
+	text-align:left;
+	border:0;
+	height:25px;
+	float:left;
+	display:inline-block;
+	vertical-align: middle;
+	padding: 5px;
+	margin-top:5px;
+}
+/** weidy@2018-03-05 淇敼琛ㄦ牸鏍囬涓哄眳涓紝鍘熸湰涓簂eft**/
+.layui-table th{text-align: center; font-weight: 400;}
+
+.layui-table thead tr,
+.layui-table-header,
+.layui-table-tool,
+.layui-table-patch,
+.layui-table-mend,
+.layui-table[lay-even] tr:nth-child(even),
+
+.layui-table-hover,
+.layui-table-total,
+.layui-table-total tr
+{background-color: #f2f2f2;}
+.layui-table tbody tr:hover,.layui-table-click{
+  background-color: #ccc;
+}
+.layui-table th,
+.layui-table td,
+.layui-table[lay-skin="line"],
+.layui-table[lay-skin="row"],
+.layui-table-view,
+.layui-table-header,
+.layui-table-tool,
+.layui-table-page,
+.layui-table-fixed-r,
+.layui-table-tips-main{border-width: 1px; border-style: solid; border-color: #e6e6e6;}
+
+/*   weidy@2018-03-15 淇敼榛樿楂樺害锛屽師鏄�20锛岀幇鍦ㄤ慨鏀瑰埌14 瀛楀彿鍘熷14锛岀幇鍦ㄤ慨鏀逛负12*/
+.layui-table th, .layui-table td{position: relative; padding: 9px 15px; min-height: 20px; line-height: 20px;  font-size: 14px;}
+
+.layui-table[lay-skin="line"] th, .layui-table[lay-skin="line"] td{border-width: 0; border-bottom-width: 1px;}
+.layui-table[lay-skin="row"] th, .layui-table[lay-skin="row"] td{border-width: 0;border-right-width: 1px;}
+.layui-table[lay-skin="nob"] th, .layui-table[lay-skin="nob"] td{border: none;}
+
+.layui-table img{max-width:100px;}
+
+/* 澶ц〃鏍� */.layui-table[lay-size="lg"] th,
+.layui-table[lay-size="lg"] td{padding-top: 15px; padding-right: 30px; padding-bottom: 15px; padding-left: 30px;}
+.layui-table-view .layui-table[lay-size="lg"] .layui-table-cell{height: 40px; line-height: 40px;}
+/* 灏忚〃鏍� */.layui-table[lay-size="sm"] th,
+.layui-table[lay-size="sm"] td{padding-top: 5px; padding-right: 10px; padding-bottom: 5px; padding-left: 10px; font-size: 12px;}
+.layui-table-view .layui-table[lay-size="sm"] .layui-table-cell{height: 20px; line-height: 20px;}
+
+/* 鏁版嵁琛ㄦ牸 */
+.layui-table[lay-data]{display: none;}
+.layui-table-view,
+.layui-table-box{position: relative; /*overflow: hidden;*/}
+/*淇敼margin涓�5px锛屽師涓�10*/
+.layui-table-view{margin: 5px 0;}
+.layui-table-view .layui-table{position: relative; width: auto; margin: 0;}
+.layui-table-view .layui-table[lay-skin="line"]{border-width: 0; border-right-width: 1px;}
+.layui-table-view .layui-table[lay-skin="row"]{border-width: 0; border-bottom-width: 1px;}
+.layui-table-view .layui-table th,
+.layui-table-view .layui-table td{padding: 5px 0; border-top: none; border-left: none;}
+.layui-table-view .layui-table td{cursor: default;}
+.layui-table-view .layui-table td[data-edit=text] {cursor: text}
+/*wangting 淇敼澶嶉�夋鐨勫ぇ灏忥紝鍘熶负18锛岀幇鍦ㄤ负16*/
+.layui-table-view .layui-form-checkbox[lay-skin="primary"] i{width: 16px; height: 16px;}
+.layui-table-view .layui-form-radio {
+  line-height: 0;
+  padding: 0
+}
+.layui-table-view .layui-form-radio>i {
+  margin: 0;
+  font-size: 20px
+}
+
+.layui-table-init {
+  position: absolute;
+  left: 0;
+  top: 0;
+  width: 100%;
+  height: 100%;
+  text-align: center;
+  z-index: 110
+}
+.layui-table-init .layui-icon {
+  position: absolute;
+  left: 50%;
+  top: 50%;
+  margin: -15px 0 0 -15px;
+  font-size: 30px;
+  color: #c2c2c2
+}
+
+.layui-table-header{border-width: 0; border-bottom-width: 1px; overflow: hidden;}
+.layui-table-header .layui-table{margin-bottom: -1px;}
+.layui-table-sort{width: 10px; height: 20px; margin-left: 5px; cursor: pointer!important;}
+.layui-table-sort .layui-edge{position: absolute; left: 5px; border-width: 5px;}
+.layui-table-sort .layui-table-sort-asc{top: 4px; border-top: none; border-bottom-style: solid; border-bottom-color: #b2b2b2;}
+.layui-table-sort .layui-table-sort-asc:hover{border-bottom-color: #666;}
+.layui-table-sort .layui-table-sort-desc{bottom: 4px; border-bottom: none; border-top-style: solid; border-top-color: #b2b2b2;}
+.layui-table-sort .layui-table-sort-desc:hover{border-top-color: #666;}
+.layui-table-sort[lay-sort="asc"] .layui-table-sort-asc{border-bottom-color: #000;}
+.layui-table-sort[lay-sort="desc"] .layui-table-sort-desc{border-top-color: #000;}
+/* weidy@2018-03-15 淇敼榛樿楂樺害锛屽師涓�28锛岀幇鍦ㄤ慨鏀瑰埌16*/
+.layui-table-cell{height: 16px; line-height: 16px; padding: 0 15px; position: relative; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; box-sizing: border-box;}
+.layui-table-cell .layui-form-checkbox[lay-skin="primary"]{top: -1px; vertical-align: middle;padding: 0}
+.layui-table-cell .layui-table-link{color: #01AAED;}
+
+.laytable-cell-checkbox,
+.laytable-cell-space,
+.laytable-cell-numbers{padding: 0; text-align: center;}
+
+.layui-table-body{position: relative; overflow: auto; margin-right: -1px; margin-bottom: -1px;}
+.layui-table-body .layui-none{line-height: 40px; text-align: center; color: #999;}
+.layui-table-fixed{position: absolute; left: 0; top: 0;overflow: hidden;}
+.layui-table-fixed .layui-table-body{overflow: hidden;}
+.layui-table-fixed-l{box-shadow: 0 -1px 8px rgba(0,0,0,.08);}
+.layui-table-fixed-r{left: auto; right: -1px; border-width: 0; border-left-width: 1px; box-shadow: -1px 0 8px rgba(0,0,0,.08);}
+.layui-table-fixed-r .layui-table-header{position: relative; overflow: visible;}
+.layui-table-mend{position: absolute; right: -49px; top: 0; height: 100%; width: 50px;}
+.laydate-grid-item{width:90%;height:16px;border:none;}
+.layui-table-tool{position: relative; width: 100%; height: 50px; line-height: 30px; padding: 10px 15px; border-width: 0; border-bottom-width: 1px;}
+.layui-table-tool-temp{padding-left:120px;}
+.layui-table-tool-self{position: absolute;right:10%;top:10px;margin:0 0 0 10px;}
+.layui-inline[lay-event]{border:1px solid #ccc;width:26px;height:26px;text-align:center;padding:5px;}
+.layui-table-tool-panel{position:absolute; z-index:999;top:-180px;right:30px;padding:5px 0;min-width:170px;min-height:40px;border:1px solid #d2d2d2;text-align:left;overflow-y:auto;background-color:#fff;box-shadow: 0 2px 4px rgba(0,0,0,.12);}
+.layui-table-tool .layui-table-tool-self .layui-table-tool-panel{left:auto;right:-1px;}
+.layui-table-tool-panel li{padding:0 10px;line-height:30px;cursor: pointer;}
+.layui-table-tool-panel-special{top:-80px;right:0;}
+.layui-table-page{position: relative; width: 100%; padding: 7px 7px 0; border-width: 0; border-top-width: 1px; height: 41px; margin-bottom: -1px; font-size: 12px;}
+.layui-table-page>div{height: 26px;}
+.layui-table-page .layui-laypage{margin: 0;}
+.layui-table-page .layui-laypage a,
+.layui-table-page .layui-laypage span{height: 26px; line-height: 26px; margin-bottom: 10px; border: none; background: none;}
+.layui-table-page .layui-laypage a,
+.layui-table-page .layui-laypage span.layui-laypage-curr{padding: 0 12px;}
+.layui-table-page .layui-laypage span{margin-left: 0; padding: 0;}
+.layui-table-page .layui-laypage .layui-laypage-prev{margin-left: -7px!important;}
+.layui-table-page .layui-laypage .layui-laypage-curr .layui-laypage-em{left: 0; top: 0; padding: 0;}
+.layui-table-page .layui-laypage input,
+.layui-table-page .layui-laypage button{height: 26px; line-height: 26px; }
+.layui-table-page .layui-laypage input{width: 40px;}
+.layui-table-page .layui-laypage button{padding: 0 10px;}
+.layui-table-page select{height: 18px;}
+.layui-table-view select[lay-ignore]{display: inline-block;}
+
+.layui-table-patch .layui-table-cell{padding: 0; width: 30px;}
+
+.layui-table-edit{position: absolute; left: 0; top: 0; width: 100%; height: 100%; padding: 0 14px 1px; border-radius: 0; box-shadow: 1px 1px 20px rgba(0,0,0,.15)}
+.layui-table-edit:focus{border-color: #5FB878!important;}
+select.layui-table-edit{padding: 0 0 0 10px; border-color: #C9C9C9;}
+.layui-table-view .layui-form-switch,
+.layui-table-view .layui-form-checkbox,
+.layui-table-view .layui-form-radio{top: 0; margin: 0; box-sizing: content-box;}
+.layui-table-view .layui-form-checkbox{top: -1px; height: 26px; line-height: 26px;}
+
+.layui-table-grid-down {position: absolute;top: 0;right: 0;width: 26px;height: 100%;padding: 5px 0;border-width: 0 0 0 1px;text-align: center;background-color: #fff;color: #999;cursor: pointer}
+.layui-table-grid-down .layui-icon {position: absolute;top: 50%;left: 50%;margin: -8px 0 0 -8px}
+.layui-table-grid-down:hover {background-color: #fbfbfb}
+
+body .layui-table-tips .layui-layer-content{background: none; padding: 0; box-shadow: 0 1px 6px rgba(0,0,0,.1);}
+.layui-table-tips-main{margin: -44px 0 0 -1px; max-height: 150px; padding: 8px 15px; font-size: 14px; overflow-y: scroll; background-color: #fff; color: #333;}
+.layui-table-tips-c{position: absolute; right: -3px; top: -12px; width: 18px; height: 18px; padding: 3px; text-align: center; font-weight: 700; border-radius: 100%; font-size: 14px; cursor: pointer; background-color: #666;}
+.layui-table-tips-c:hover{background-color: #999;}
+
+
+/** 鏂囦欢涓婁紶 **/
+.layui-upload-file{display: none!important; opacity: .01; filter: Alpha(opacity=1);}
+.layui-upload-list{margin: 10px 0;}
+.layui-upload-choose{padding: 0 10px; color: #999;}
+.layui-upload-drag{position: relative; display: inline-block; padding: 30px; border: 1px dashed #e2e2e2; background-color: #fff; text-align: center; cursor: pointer; color: #999;}
+.layui-upload-drag .layui-icon{font-size: 50px; color: #009688;}
+.layui-upload-drag[lay-over]{border-color: #009688}
+.layui-upload-form{display: inline-block;}
+.layui-upload-iframe{position: absolute; width: 0; height: 0; border: 0; visibility: hidden}
+.layui-upload-wrap{position: relative; display: inline-block; vertical-align: middle;}
+.layui-upload-wrap .layui-upload-file{display: block!important; position: absolute; left: 0; top: 0; z-index: 10; font-size: 100px; width: 100%; height: 100%; opacity: .01; filter: Alpha(opacity=1); cursor: pointer;}
+
+
+/** 浠g爜淇グ鍣� **/
+.layui-code{position: relative; margin: 10px 0; padding: 15px; line-height: 20px; border: 1px solid #ddd; border-left-width: 6px; background-color: #f2f2f2; color: #333; font-family: Courier New; font-size: 12px;}
+
+
+/** 鏍戠粍浠讹紙閲嶅啓涓級 **/
+.layui-tree{/* line-height: 26px; */}
+.layui-tree li{text-overflow: ellipsis; /* overflow:hidden; */ white-space: nowrap;}
+.layui-tree li a,
+.layui-tree li .layui-tree-spread{display: inline-block; vertical-align: top; height: 26px; *display: inline; *zoom:1; cursor: pointer;}
+.layui-tree li a{font-size: 0;}
+.layui-tree li a i{font-size: 16px;}
+.layui-tree li a cite{padding: 0 6px; font-size: 14px; font-style: normal;}
+.layui-tree li i{/*padding-left: 6px;*/ color: #333; -moz-user-select: none;}
+/*.layui-tree li .layui-tree-check{font-size: 13px; cursor: pointer;}*//*娣诲姞鎵嬪娍*/
+.layui-tree li .layui-tree-check{cursor: pointer;display:inline-block;position: relative; top: 0; width: 14px; height: 14px; line-height: 14px; border: 1px solid #d2d2d2; font-size: 12px; border-radius: 2px; background-color: #fff; -webkit-transition: .1s linear; transition: .1s linear;}/*娣诲姞鎵嬪娍*/
+.layui-tree li .layui-tree-check:hover{color: #009E94;}
+/*.layui-tree li .layui-tree-checked{color:#ff0000;border-color: #ff0000;}*/
+.layui-tree li .layui-tree-checked{border-color: #5FB878; background-color: #5FB878; color: #fff;text-align:center}
+.layui-tree li ul{display: none; margin-left: 20px;}
+.layui-tree li .layui-tree-enter{line-height: 24px; border: 1px dotted #000;}
+.layui-tree-drag{display: none; position: absolute; left: -666px; top: -666px; background-color: #f2f2f2; padding: 5px 10px; border: 1px dotted #000; white-space: nowrap}
+.layui-tree-drag i{padding-right: 5px;}
+
+/** 瀵艰埅鑿滃崟 **/
+.layui-nav{position: relative; padding: 0 20px; background-color: #393D49; color: #fff; border-radius: 2px; font-size: 0; box-sizing: border-box;}
+.layui-nav *{font-size: 14px;}
+.layui-nav .layui-nav-item{position: relative; display: inline-block; *display: inline; *zoom: 1; vertical-align: middle; line-height: 60px;}
+.layui-nav .layui-nav-item a{display: block; padding: 0 20px; color: #fff; color: rgba(255,255,255,.7); transition: all .3s; -webkit-transition: all .3s;}
+.layui-nav-bar,
+.layui-nav .layui-this:after,
+.layui-nav-tree .layui-nav-itemed:after{position: absolute; left: 0; top: 0; width: 0; height: 5px; background-color: #5FB878; transition: all .2s; -webkit-transition: all .2s;}
+.layui-nav-bar{z-index: 1000;}
+.layui-nav .layui-this a
+,.layui-nav .layui-nav-item a:hover{color: #fff;}
+.layui-nav .layui-this:after{content: ''; top: auto; bottom: 0; width: 100%;}
+.layui-nav-img{width: 30px; height: 30px; margin-right: 10px; border-radius: 50%;}
+
+.layui-nav .layui-nav-more{content:''; width: 0; height: 0; border-style: dashed; border-color: transparent; overflow: hidden; cursor: pointer; transition: all .2s; -webkit-transition: all .2s;}
+.layui-nav .layui-nav-more{position: absolute; top: 50%; right: 3px; margin-top: -3px; border-width: 6px; border-top-style: solid; border-top-color: #fff; border-top-color: rgba(255,255,255,.7);}
+.layui-nav .layui-nav-mored,
+/* .layui-nav-itemed .layui-nav-more{margin-top: -9px; border-style: dashed; border-color: transparent; border-bottom-style: solid; border-bottom-color: #fff;} */
+
+.layui-nav-child{display: none; position: absolute; left: 0; top: 65px; min-width: 100%; line-height: 36px; padding: 5px 0;  box-shadow: 0 2px 4px rgba(0,0,0,.12); border: 1px solid #d2d2d2; background-color: #fff; z-index: 100; border-radius: 2px; white-space: nowrap;}
+.layui-nav .layui-nav-child a{color: #333;}
+.layui-nav .layui-nav-child a:hover{background-color: #f2f2f2; color: #000;}
+.layui-nav-child dd{position: relative;}
+.layui-nav-child dd.layui-this{background-color: #5FB878; color: #fff;}
+.layui-nav .layui-nav-child dd.layui-this a{background-color: #5FB878; color: #fff;}
+.layui-nav-child dd.layui-this:after{display: none;}
+
+/*!* 鍨傜洿瀵艰埅鑿滃崟 *!.layui-nav-tree{width: 200px; padding: 0;}*/
+/*.layui-nav-tree .layui-nav-item{display: block; width: 100%; line-height: 45px;}*/
+/*.layui-nav-tree .layui-nav-item a{height: 45px; line-height: 45px; text-overflow: ellipsis; overflow: hidden; white-space: nowrap;}*/
+/*.layui-nav-tree .layui-nav-item a:hover{background-color: #4E5465;}*/
+/*.layui-nav-tree .layui-nav-bar{width: 5px; height: 0;}*/
+/*.layui-nav-tree .layui-this,*/
+/*.layui-nav-tree .layui-this>a,*/
+/*.layui-nav-tree .layui-this>a:hover,*/
+/*.layui-nav-tree .layui-nav-child dd.layui-this,*/
+/*.layui-nav-tree .layui-nav-child dd.layui-this a{background-color: #009688; color: #fff;}*/
+/*.layui-nav-tree .layui-this:after{display: none;}*/
+/*.layui-nav-tree .layui-nav-title a,*/
+/*.layui-nav-tree .layui-nav-title a:hover,*/
+/*.layui-nav-itemed>a{color: #fff !important;}*/
+/*.layui-nav-tree .layui-nav-bar{background-color: #009688;}*/
+
+/*.layui-nav-tree .layui-nav-child{position: relative; z-index: 0; top: 0; border: none; box-shadow: none;}*/
+/*.layui-nav-tree .layui-nav-child a{height: 40px; line-height: 40px;}*/
+/*.layui-nav-tree .layui-nav-child a{color: #fff; color: rgba(255,255,255,.7);}*/
+/*.layui-nav-tree .layui-nav-child a:hover,*/
+/*.layui-nav-tree .layui-nav-child{background: none; color: #fff;}*/
+/*.layui-nav-tree .layui-nav-more{top: 20px; right: 10px; margin: 0;}*/
+/*.layui-nav-itemed .layui-nav-more{top: 14px;}*/
+/*.layui-nav-itemed .layui-nav-child{display: block; padding: 0; background-color: rgba(0,0,0,.3) !important;} */
+/* 鍨傜洿瀵艰埅鑿滃崟 */.layui-nav-tree{width: 200px; padding: 0;}
+.layui-nav-tree .layui-nav-item{display: block; width: 100%; line-height: 45px;}
+.layui-nav-tree .layui-nav-item a{position: relative; height: 45px; line-height: 45px; text-overflow: ellipsis; overflow: hidden; white-space: nowrap;}
+.layui-nav-tree .layui-nav-item a:hover{background-color: #4E5465;}
+.layui-nav-tree .layui-nav-bar{width: 5px; height: 0;}
+.layui-nav-tree .layui-this,
+.layui-nav-tree .layui-this>a,
+.layui-nav-tree .layui-this>a:hover,
+.layui-nav-tree .layui-nav-child dd.layui-this,
+.layui-nav-tree .layui-nav-child dd.layui-this a{background-color: #009688; color: #fff;}
+.layui-nav-tree .layui-this:after{display: none;}
+.layui-nav-tree .layui-nav-title a,
+.layui-nav-tree .layui-nav-title a:hover,
+.layui-nav-itemed>a{color: #fff !important;}
+.layui-nav-tree .layui-nav-bar{background-color: #009688;}
+
+.layui-nav-tree .layui-nav-child{position: relative; z-index: 0; top: 0; border: none; box-shadow: none;}
+.layui-nav-tree .layui-nav-child a{height: 40px; line-height: 40px;}
+.layui-nav-tree .layui-nav-child a{color: #fff; color: rgba(255,255,255,.7);}
+.layui-nav-tree .layui-nav-child a:hover,
+.layui-nav-tree .layui-nav-child{background: none; color: #fff;}
+.layui-nav-tree .layui-nav-more{right: 10px;}
+
+.layui-nav-itemed>.layui-nav-child{display: block; padding: 0; background-color: #1d1d1d !important;}
+.layui-nav-itemed>.layui-nav-child>.layui-this>.layui-nav-child{display: block;}
+
+/* 渚ц竟 */.layui-nav-side{position: fixed; top: 0; bottom: 0; left: 0; overflow-x: hidden; z-index: 999;}
+
+/* 瀵艰埅涓婚鑹� */.layui-bg-blue .layui-nav-bar,
+.layui-bg-blue .layui-this:after,
+.layui-bg-blue .layui-nav-itemed:after{background-color: #93D1FF;}
+.layui-bg-blue .layui-nav-child dd.layui-this{background-color: #1E9FFF;}
+.layui-nav-tree.layui-bg-blue .layui-nav-title a,
+.layui-nav-tree.layui-bg-blue .layui-nav-title a:hover,
+.layui-bg-blue .layui-nav-itemed>a{background-color: #007DDB /*!important;*/}
+.vciWebMenuLevel1 .layui-nav-itemed>a{
+  background-color:  #1E9FFF;
+}
+
+/** 闈㈠寘灞� **/
+.layui-breadcrumb{visibility: hidden; font-size: 0;}
+.layui-breadcrumb>*{font-size: 14px;}
+.layui-breadcrumb a{color: #999 !important;}
+.layui-breadcrumb a:hover{color: #5FB878 !important;}
+.layui-breadcrumb a cite{color: #666; font-style: normal;}
+.layui-breadcrumb span[lay-separator]{margin: 0 10px; color: #999;}
+
+/** Tab閫夐」鍗� **/
+.layui-tab{margin: 10px 0; text-align: left !important;}
+.layui-tab[overflow]>.layui-tab-title{overflow: hidden;}
+.layui-tab-title{position: relative; left: 0; height: 40px; white-space: nowrap; font-size: 0; border-bottom-width: 1px; border-bottom-style: solid; transition: all .2s; -webkit-transition: all .2s;}
+.layui-tab-title li{display: inline-block; *display: inline; *zoom: 1; vertical-align: middle; font-size: 14px; transition: all .2s; -webkit-transition: all .2s;}
+.layui-tab-title li{position: relative; line-height: 40px; min-width: 65px; padding: 0 15px; text-align: center; cursor: pointer;}
+.layui-tab-title li a{display: block;}
+.layui-tab-title .layui-this{color: #000;}
+
+.layui-tab-title .layui-this:after{position: absolute; left:0; top: 0; content: ''; width:100%; height: 41px; border-width: 1px; border-style: solid; border-bottom-color: #fff; border-radius: 2px 2px 0 0; box-sizing: border-box; pointer-events: none;}
+.layui-tab-bar{position: absolute; right: 0; top: 0; z-index: 10; width: 30px; height: 39px; line-height: 39px; border-width: 1px; border-style: solid; border-radius: 2px; text-align: center; background-color: #fff; cursor: pointer;}
+.layui-tab-bar .layui-icon{position: relative; display: inline-block; top: 3px; transition: all .3s; -webkit-transition: all .3s;}
+.layui-tab-item{display: none;}
+.layui-tab-more{padding-right: 30px; height: auto !important; white-space: normal !important;}
+.layui-tab-more li.layui-this:after{border-bottom-color: #e2e2e2; border-radius: 2px;}
+.layui-tab-more .layui-tab-bar .layui-icon{top: -2px; top: 3px\0; -webkit-transform: rotate(180deg); transform: rotate(180deg);}
+:root .layui-tab-more .layui-tab-bar .layui-icon{top: -2px\0/IE9;}
+
+.layui-tab-content{padding: 5px;} /*weidy淇敼闂撮殧澶у皬*/
+
+/* Tab鍏抽棴 */.layui-tab-title li .layui-tab-close{position: relative; display: inline-block; width: 18px; height: 18px; line-height: 20px; margin-left: 8px; top: 1px; text-align: center; font-size: 14px; color: #c2c2c2; transition: all .2s; -webkit-transition: all .2s;}
+.layui-tab-title li .layui-tab-close:hover{border-radius: 2px; background-color: #FF5722; color: #fff;}
+
+/* Tab绠�娲侀鏍� */.layui-tab-brief > .layui-tab-title .layui-this{color: #009688;}
+.layui-tab-brief > .layui-tab-title .layui-this:after
+,.layui-tab-brief > .layui-tab-more li.layui-this:after{border: none; border-radius: 0; border-bottom: 2px solid #5FB878;}
+.layui-tab-brief[overflow] > .layui-tab-title .layui-this:after{top: -1px;}
+
+/* Tab鍗$墖椋庢牸 */.layui-tab-card{border-width: 1px; border-style: solid; border-radius: 2px; box-shadow: 0 2px 5px 0 rgba(0,0,0,.1);}
+.layui-tab-card > .layui-tab-title{ background-color: #f2f2f2;}
+.layui-tab-card > .layui-tab-title li{margin-right: -1px; margin-left: -1px;}
+.layui-tab-card > .layui-tab-title .layui-this{background-color: #fff;     }
+.layui-tab-card > .layui-tab-title .layui-this:after{border-top: none; border-width: 1px; border-bottom-color: #fff;}
+.layui-tab-card > .layui-tab-title .layui-tab-bar{height: 40px; line-height: 40px; border-radius: 0; border-top: none; border-right: none;}
+.layui-tab-card > .layui-tab-more .layui-this{background: none; color: #5FB878;}
+.layui-tab-card > .layui-tab-more .layui-this:after{border: none;}
+
+/* 鏃堕棿绾� */
+.layui-timeline{padding-left: 5px;}
+.layui-timeline-item{position: relative; padding-bottom: 20px;}
+.layui-timeline-axis{position: absolute; left: -5px; top: 0; z-index: 10; width: 20px; height: 20px; line-height: 20px; background-color: #fff; color: #5FB878; border-radius: 50%; text-align: center; cursor: pointer;}
+.layui-timeline-axis:hover{color: #FF5722;}
+.layui-timeline-item:before{content: ''; position: absolute; left: 5px; top: 0; z-index: 0; width: 1px; height: 100%;}
+.layui-timeline-item:last-child:before{display: none;}
+.layui-timeline-item:first-child:before{display: block;}
+.layui-timeline-content{padding-left: 25px;;}
+.layui-timeline-title{position: relative; margin-bottom: 10px;}
+
+/* 灏忓窘绔� */
+.layui-badge,
+.layui-badge-dot,
+.layui-badge-rim{position:relative; display: inline-block; padding: 0 6px; font-size: 12px; text-align: center; background-color: #FF5722; color: #fff; border-radius: 2px;}
+.layui-badge{height: 18px; line-height: 18px;}
+.layui-badge-dot{width: 8px; height: 8px; padding: 0; border-radius: 50%;}
+.layui-badge-rim{height: 18px; line-height: 18px; border-width: 1px; border-style: solid; background-color: #fff; color: #666;}
+
+.layui-btn .layui-badge,
+.layui-btn .layui-badge-dot{margin-left: 5px;}
+.layui-nav .layui-badge,
+.layui-nav .layui-badge-dot{position: absolute; top: 50%; margin: -8px 6px 0;}
+.layui-tab-title .layui-badge,
+.layui-tab-title .layui-badge-dot{left: 5px; top: -2px;}
+
+/* carousel 杞挱 */
+.layui-carousel{position: relative; left: 0; top: 0; background-color: #f8f8f8;}
+.layui-carousel>*[carousel-item]{position: relative; width: 100%; height: 100%; overflow: hidden;}
+.layui-carousel>*[carousel-item]:before{position: absolute; content: '\e63d'; left: 50%; top: 50%; width: 100px; line-height: 20px; margin: -10px 0 0 -50px; text-align: center; color: #c2c2c2; font-family:"layui-icon" !important; font-size: 30px; font-style: normal; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;}
+.layui-carousel>*[carousel-item] > *{display: none; position: absolute; left: 0; top: 0; width: 100%; height: 100%; background-color: #f8f8f8; transition-duration: .3s; -webkit-transition-duration: .3s;}
+.layui-carousel-updown > *{-webkit-transition: .3s ease-in-out up; transition: .3s ease-in-out up;}
+.layui-carousel-arrow{display: none\0; opacity: 0; position: absolute; left: 10px; top: 50%; margin-top: -18px; width: 36px; height: 36px; line-height: 36px; text-align: center; font-size: 20px; border: none 0; border-radius: 50%; background-color: rgba(0,0,0,.2); color: #fff; -webkit-transition-duration: .3s; transition-duration: .3s; cursor: pointer;}
+.layui-carousel-arrow[lay-type="add"]{left: auto!important; right: 10px;}
+.layui-carousel[lay-arrow="always"] .layui-carousel-arrow{opacity: 1; left: 20px;}
+.layui-carousel[lay-arrow="always"] .layui-carousel-arrow[lay-type="add"]{right: 20px;}
+.layui-carousel[lay-arrow="none"] .layui-carousel-arrow{display: none;}
+.layui-carousel-arrow:hover,
+.layui-carousel-ind ul:hover{background-color: rgba(0,0,0,.35);}
+.layui-carousel:hover .layui-carousel-arrow{display: block\0; opacity: 1; left: 20px;}
+.layui-carousel:hover .layui-carousel-arrow[lay-type="add"]{right: 20px;}
+.layui-carousel-ind{position: relative; top: -35px; width: 100%; line-height: 0!important; text-align: center; font-size: 0;}
+.layui-carousel[lay-indicator="outside"]{margin-bottom: 30px;}
+.layui-carousel[lay-indicator="outside"] .layui-carousel-ind{top: 10px;}
+.layui-carousel[lay-indicator="outside"] .layui-carousel-ind ul{background-color: rgba(0,0,0,.5);}
+.layui-carousel[lay-indicator="none"] .layui-carousel-ind{display: none;}
+.layui-carousel-ind ul{display: inline-block; padding: 5px; background-color: rgba(0,0,0,.2); border-radius: 10px; -webkit-transition-duration: .3s; transition-duration: .3s;}
+.layui-carousel-ind li{display: inline-block; width: 10px; height: 10px; margin: 0 3px; font-size: 14px; background-color: #e2e2e2; background-color: rgba(255,255,255,.5); border-radius: 50%; cursor: pointer; -webkit-transition-duration: .3s; transition-duration: .3s;}
+.layui-carousel-ind li:hover{background-color: rgba(255,255,255,.7);}
+.layui-carousel-ind li.layui-this{background-color: #fff;}
+.layui-carousel>*[carousel-item]>.layui-this,
+.layui-carousel>*[carousel-item]>.layui-carousel-prev,
+.layui-carousel>*[carousel-item]>.layui-carousel-next{display: block}
+.layui-carousel>*[carousel-item]>.layui-this{left: 0;}
+.layui-carousel>*[carousel-item]>.layui-carousel-prev{left: -100%;}
+.layui-carousel>*[carousel-item]>.layui-carousel-next{left: 100%;}
+.layui-carousel>*[carousel-item]>.layui-carousel-prev.layui-carousel-right,
+.layui-carousel>*[carousel-item]>.layui-carousel-next.layui-carousel-left{left: 0;}
+.layui-carousel>*[carousel-item]>.layui-this.layui-carousel-left{left: -100%;}
+.layui-carousel>*[carousel-item]>.layui-this.layui-carousel-right{left: 100%;}
+
+/* 涓婁笅鍒囨崲 */.layui-carousel[lay-anim="updown"] .layui-carousel-arrow{left: 50%!important; top: 20px; margin: 0 0 0 -18px;}
+.layui-carousel[lay-anim="updown"] .layui-carousel-arrow[lay-type="add"]{top: auto!important; bottom: 20px;}
+.layui-carousel[lay-anim="updown"] .layui-carousel-ind{position: absolute; top: 50%; right: 20px; width: auto; height: auto;}
+.layui-carousel[lay-anim="updown"] .layui-carousel-ind ul{padding: 3px 5px;}
+.layui-carousel[lay-anim="updown"] .layui-carousel-ind li{display: block; margin: 6px 0;}
+
+.layui-carousel[lay-anim="updown"]>*[carousel-item]>*{left: 0!important;}
+.layui-carousel[lay-anim="updown"]>*[carousel-item]>.layui-this{top: 0;}
+.layui-carousel[lay-anim="updown"]>*[carousel-item]>.layui-carousel-prev{top: -100%;}
+.layui-carousel[lay-anim="updown"]>*[carousel-item]>.layui-carousel-next{top: 100%;}
+.layui-carousel[lay-anim="updown"]>*[carousel-item]>.layui-carousel-prev.layui-carousel-right,
+.layui-carousel[lay-anim="updown"]>*[carousel-item]>.layui-carousel-next.layui-carousel-left{top: 0;}
+.layui-carousel[lay-anim="updown"]>*[carousel-item]>.layui-this.layui-carousel-left{top: -100%;}
+.layui-carousel[lay-anim="updown"]>*[carousel-item]>.layui-this.layui-carousel-right{top: 100%;}
+
+/* 娓愭樉鍒囨崲 */.layui-carousel[lay-anim="fade"]>*[carousel-item]>*{left: 0!important;}
+.layui-carousel[lay-anim="fade"]>*[carousel-item]>.layui-carousel-prev,
+.layui-carousel[lay-anim="fade"]>*[carousel-item]>.layui-carousel-next{opacity: 0;}
+.layui-carousel[lay-anim="fade"]>*[carousel-item]>.layui-carousel-prev.layui-carousel-right,
+.layui-carousel[lay-anim="fade"]>*[carousel-item]>.layui-carousel-next.layui-carousel-left{opacity: 1;}
+.layui-carousel[lay-anim="fade"]>*[carousel-item]>.layui-this.layui-carousel-left,
+.layui-carousel[lay-anim="fade"]>*[carousel-item]>.layui-this.layui-carousel-right{opacity: 0}
+
+
+/** fixbar **/
+.layui-fixbar{position: fixed; right: 15px; bottom: 15px; z-index: 9999;}
+.layui-fixbar li{width: 50px; height: 50px; line-height: 50px; margin-bottom: 1px; text-align:center; cursor: pointer; font-size:30px; background-color: #9F9F9F; color:#fff; border-radius: 2px; opacity: 0.95;}
+.layui-fixbar li:hover{opacity: 0.85;}
+.layui-fixbar li:active{opacity: 1;}
+.layui-fixbar .layui-fixbar-top{display: none; font-size: 40px;}
+
+/** 琛ㄦ儏闈㈡澘 **/
+body .layui-util-face{border: none; background: none;}
+body .layui-util-face  .layui-layer-content{padding:0; background-color:#fff; color:#666; box-shadow:none}
+.layui-util-face .layui-layer-TipsG{display:none;}
+.layui-util-face ul{position:relative; width:372px; padding:10px; border:1px solid #D9D9D9; background-color:#fff; box-shadow: 0 0 20px rgba(0,0,0,.2);}
+.layui-util-face ul li{cursor: pointer; float: left; border: 1px solid #e8e8e8; height: 22px; width: 26px; overflow: hidden; margin: -1px 0 0 -1px; padding: 4px 2px; text-align: center;}
+.layui-util-face ul li:hover{position: relative; z-index: 2; border: 1px solid #eb7350; background: #fff9ec;}
+
+/** 鍔ㄧ敾 **/
+.layui-anim{-webkit-animation-duration: 0.3s; animation-duration: 0.3s; -webkit-animation-fill-mode: both; animation-fill-mode: both;}
+.layui-anim.layui-icon{display: inline-block;}
+.layui-anim-loop{-webkit-animation-iteration-count: infinite; animation-iteration-count: infinite;}
+
+@-webkit-keyframes layui-rotate{ /* 寰幆鏃嬭浆 */
+  from {-webkit-transform: rotate(0deg);}
+  to {-webkit-transform: rotate(360deg);}
+}
+@keyframes layui-rotate{
+  from {transform: rotate(0deg);}
+  to {transform: rotate(360deg);}
+}
+.layui-anim-rotate{-webkit-animation-name: layui-rotate; animation-name: layui-rotate; -webkit-animation-duration: 1s; animation-duration: 1s;  -webkit-animation-timing-function: linear; animation-timing-function: linear;}
+
+@-webkit-keyframes layui-up{ /* 浠庢渶搴曢儴寰�涓婃粦鍏� */
+  from {-webkit-transform: translate3d(0, 100%, 0); opacity: 0.3;}
+  to {-webkit-transform: translate3d(0, 0, 0);  opacity: 1;}
+}
+@keyframes layui-up{
+  from {transform: translate3d(0, 100%, 0);  opacity: 0.3;}
+  to {transform: translate3d(0, 0, 0);  opacity: 1;}
+}
+.layui-anim-up{-webkit-animation-name: layui-up; animation-name: layui-up;}
+
+@-webkit-keyframes layui-upbit{ /* 寰井寰�涓婃粦鍏� */
+  from {-webkit-transform: translate3d(0, 30px, 0); opacity: 0.3;}
+  to {-webkit-transform: translate3d(0, 0, 0);  opacity: 1;}
+}
+@keyframes layui-upbit{
+  from {transform: translate3d(0, 30px, 0);  opacity: 0.3;}
+  to {transform: translate3d(0, 0, 0);  opacity: 1;}
+}
+.layui-anim-upbit{-webkit-animation-name: layui-upbit; animation-name: layui-upbit;}
+
+
+@-webkit-keyframes layui-scale { /* 鏀惧ぇ */
+  0% {opacity: 0.3; -webkit-transform: scale(.5);}
+  100% {opacity: 1; -webkit-transform: scale(1);}
+}
+@keyframes layui-scale {
+  0% {opacity: 0.3; -ms-transform: scale(.5); transform: scale(.5);}
+  100% {opacity: 1; -ms-transform: scale(1); transform: scale(1);}
+}
+.layui-anim-scale{-webkit-animation-name: layui-scale; animation-name: layui-scale}
+
+@-webkit-keyframes layui-scale-spring { /* 寮圭哀寮忔斁澶� */
+  0% {opacity: 0.5; -webkit-transform: scale(.5);}
+  80% {opacity: 0.8; -webkit-transform: scale(1.1);}
+  100% {opacity: 1; -webkit-transform: scale(1);}
+}
+@keyframes layui-scale-spring {
+  0% {opacity: 0.5; transform: scale(.5);}
+  80% {opacity: 0.8; transform: scale(1.1);}
+  100% {opacity: 1; transform: scale(1);}
+}
+.layui-anim-scaleSpring{-webkit-animation-name: layui-scale-spring; animation-name: layui-scale-spring}
+
+@-webkit-keyframes layui-fadein { /* 娓愮幇 */
+  0% {opacity: 0;}
+  100% {opacity: 1;}
+}
+@keyframes layui-fadein {
+  0% {opacity: 0;}
+  100% {opacity: 1;}
+}
+.layui-anim-fadein{-webkit-animation-name: layui-fadein; animation-name: layui-fadein}
+
+@-webkit-keyframes layui-fadeout { /* 娓愰殣 */
+  0% {opacity: 1;}
+  100% {opacity: 0;}
+}
+@keyframes layui-fadeout {
+  0% {opacity: 1;}
+  100% {opacity: 0;}
+}
+.layui-anim-fadeout{-webkit-animation-name: layui-fadeout; animation-name: layui-fadeout}
+
+#selectWrapForIE{
+  width:20px;
+  height:26px;
+  margin-top:2px;
+  margin-bottom:2px;
+  background:#ffffff;
+  float:right;
+  position:absolute;
+  top:0px;
+  right:22px;
+}
+#selectWrapForIE:hover{
+  cursor:pointer;
+}
+
+.layui-transfer-active, .layui-transfer-box {
+  display: inline-block;
+  vertical-align: middle
+}
+
+.layui-transfer-box, .layui-transfer-header, .layui-transfer-search {
+  border-width: 0;
+  border-style: solid;
+  border-color: #e6e6e6
+}
+
+.layui-transfer-box {
+  position: relative;
+  border-width: 1px;
+  width: 200px;
+  height: 360px;
+  border-radius: 2px;
+  background-color: #fff
+}
+
+.layui-transfer-box .layui-form-checkbox {
+  width: 100%;
+  margin: 0 !important
+}
+
+.layui-transfer-header {
+  height: 38px;
+  line-height: 38px;
+  padding: 0 10px;
+  border-bottom-width: 1px
+}
+
+.layui-transfer-search {
+  position: relative;
+  padding: 10px;
+  border-bottom-width: 1px
+}
+
+.layui-transfer-search .layui-input {
+  height: 32px;
+  padding-left: 30px;
+  font-size: 12px
+}
+
+.layui-transfer-search .layui-icon-search {
+  position: absolute;
+  left: 20px;
+  top: 50%;
+  margin-top: -8px;
+  color: #666
+}
+
+.layui-transfer-active {
+  margin: 0 15px
+}
+
+.layui-transfer-active .layui-btn {
+  display: block;
+  margin: 0;
+  padding: 0 15px;
+  background-color: #5FB878;
+  border-color: #5FB878;
+  color: #fff
+}
+
+.layui-transfer-active .layui-btn-disabled {
+  background-color: #FBFBFB;
+  border-color: #e6e6e6;
+  color: #C9C9C9
+}
+
+.layui-transfer-active .layui-btn:first-child {
+  margin-bottom: 15px
+}
+
+.layui-transfer-active .layui-btn .layui-icon {
+  margin: 0;
+  font-size: 14px !important
+}
+
+.layui-transfer-data {
+  padding: 5px 0;
+  overflow: auto
+}
+
+.layui-transfer-data li {
+  height: 32px;
+  line-height: 32px;
+  padding: 0 10px
+}
+
+.layui-transfer-data li:hover {
+  background-color: #f2f2f2;
+  transition: .5s all
+}
+
+.layui-transfer-data .layui-none {
+  padding: 15px 10px;
+  text-align: center;
+  color: #999
+}
+
+.layui-rate, .layui-rate * {
+  display: inline-block;
+  vertical-align: middle
+}
+
+.layui-rate {
+  padding: 10px 5px 10px 0;
+  font-size: 0
+}
+
+.layui-rate li i.layui-icon {
+  font-size: 20px;
+  color: #FFB800;
+  margin-right: 5px;
+  transition: all .3s;
+  -webkit-transition: all .3s
+}
+
+.layui-rate li i:hover {
+  cursor: pointer;
+  transform: scale(1.12);
+  -webkit-transform: scale(1.12)
+}
+
+.layui-rate[readonly] li i:hover {
+  cursor: default;
+  transform: scale(1)
+}
+
+/* 渚ц竟鏀剁缉鎮诞 */
+.side-hover {
+  position: absolute;
+  top: 0;
+  left: 55px;
+  z-index: 100001;
+}
+.side-hover dd {
+  height: 35px;
+}
+.side-hover dl {
+  width: 185px;
+  background-color: #393d49;
+  border-radius: 5px;
+  /* padding-bottom: 10px; */
+}
+.side-hover a {
+  width: 180px;
+  display: block;
+  position: relative;
+  color: rgba(255,255,255,.7);
+  font-size: 24px;
+}
+.side-hover span:nth-of-type(2) {
+  position: absolute;
+  right: 15px;
+  top: 8px;
+  font-size: 18px;
+}
+.side-hover .leve3 {
+  position: absolute;
+  top: 0;
+  left: 190px;
+}
+.side-hover .isHover {
+  background-color: #4e5465;
+  color: #fff;
+  border-radius: 5px;
+}
+
+.vciWebReferGridInDojo .layui-unselect dl {
+  font-size: 16px;
+}
+.vciWebReferGridInDojo .layui-unselect input {
+  font-size: 15px;
+}
+.hisTable_overflow .layui-layer-content {
+  overflow: hidden !important;
+}
+.hisTable_dvi {
+  float: none !important;
+}
+.layui-font-12 {
+  font-size: 12px!important
+}
+
+.layui-font-14 {
+  font-size: 14px!important
+}
+
+.layui-font-16 {
+  font-size: 16px!important
+}
+
+.layui-font-18 {
+  font-size: 18px!important
+}
+
+.layui-font-20 {
+  font-size: 20px!important
+}
+
+.layui-font-red {
+  color: #FF5722!important
+}
+
+.layui-font-orange {
+  color: #FFB800!important
+}
+
+.layui-font-green {
+  color: #009688!important
+}
+
+.layui-font-cyan {
+  color: #2F4056!important
+}
+
+.layui-font-blue {
+  color: #01AAED!important
+}
+
+.layui-font-black {
+  color: #000!important
+}
+
+.layui-font-gray {
+  color: #c2c2c2!important
+}
+.layui-border-blue {
+  border-color: #1E9FFF !important;
+  color: #1E9FFF !important;
+}
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/layui.mobile.css b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/layui.mobile.css
new file mode 100644
index 0000000..d44d8b2
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/layui.mobile.css
@@ -0,0 +1,192 @@
+/**
+ 
+ @Name: layui mobile
+ @Author: 璐ゅ績
+ @Site: http://www.layui.com/mobile/
+ 
+ */
+ 
+/* reset */
+body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,input,button,textarea,p,blockquote,th,td,form,legend{margin:0; padding:0; -webkit-tap-highlight-color:rgba(0,0,0,0)}
+html{font:12px 'Helvetica Neue','PingFang SC',STHeitiSC-Light,Helvetica,Arial,sans-serif; -ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;}
+a,button,input{-webkit-tap-highlight-color:rgba(255,0,0,0);}
+a{text-decoration: none; background:transparent}
+a:active,a:hover{outline:0}
+table{border-collapse:collapse;border-spacing:0}
+li{list-style:none;}
+b,strong{font-weight:700;}
+h1, h2, h3, h4, h5, h6{font-weight:500;}
+address,cite,dfn,em,var{font-style:normal;}
+dfn{font-style:italic}
+sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
+img{border:0; vertical-align: bottom}
+button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0; outline: 0;}
+button,select{text-transform:none}
+select{-webkit-appearance: none; border:none;}
+input{line-height:normal; }
+input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}
+input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}
+input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}
+input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}
+label,input{vertical-align: middle;}
+
+
+/** 鍥炬爣瀛椾綋 **/
+@font-face {font-family: 'layui-icon';
+  src: url('../font/iconfont.eot?v=1.0.7');
+  src: url('../font/iconfont.eot?v=1.0.7#iefix') format('embedded-opentype'),
+  url('../font/iconfont.woff?v=1.0.7') format('woff'),
+  url('../font/iconfont.ttf?v=1.0.7') format('truetype'),
+  url('../font/iconfont.svg?v=1.0.7#iconfont') format('svg');
+}
+                    
+.layui-icon{
+  font-family:"layui-icon" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+
+/** 鍩虹閫氱敤 **/
+/* 娑堥櫎绗笁鏂箄i鍙兘閫犳垚鐨勫啿绐� */.layui-box, .layui-box *{-webkit-box-sizing: content-box !important; -moz-box-sizing: content-box !important; box-sizing: content-box !important;}
+.layui-border-box, .layui-border-box *{-webkit-box-sizing: border-box !important; -moz-box-sizing: border-box !important; box-sizing: border-box !important;}
+.layui-inline{position: relative; display: inline-block; *display:inline; *zoom:1; vertical-align: middle;}
+/* 涓夎褰� */.layui-edge{position: absolute; width: 0; height: 0; border-style: dashed; border-color: transparent; overflow: hidden;}
+/* 鍗曡婧㈠嚭鐪佺暐 */.layui-elip{text-overflow: ellipsis; overflow: hidden; white-space: nowrap;}
+/* 灞忚斀閫変腑 */.layui-unselect{-moz-user-select: none; -webkit-user-select: none; -ms-user-select: none;}
+.layui-disabled,.layui-disabled:active{background-color: #d2d2d2 !important; color: #fff !important; cursor: not-allowed !important;}
+/* 绾渾瑙� */.layui-circle{border-radius: 100%;}
+.layui-show{display: block !important;}
+.layui-hide{display: none !important;}
+
+
+.layui-upload-iframe{position: absolute; width: 0px; height: 0px; border: 0px; visibility: hidden;}
+.layui-upload-enter{border: 1px solid #009E94; background-color: #009E94; color: #fff; -webkit-transform: scale(1.1); transform: scale(1.1);}
+
+
+/* 寮瑰嚭鍔ㄧ敾 */
+@-webkit-keyframes layui-m-anim-scale { /* 榛樿 */
+	0% {opacity: 0; -webkit-transform: scale(.5); transform: scale(.5)}
+	100% {opacity: 1; -webkit-transform: scale(1); transform: scale(1)}
+}
+@keyframes layui-m-anim-scale { /* 鐢卞皬鍒板ぇ */
+	0% {opacity: 0; -webkit-transform: scale(.5); transform: scale(.5)}
+	100% {opacity: 1; -webkit-transform: scale(1); transform: scale(1)}
+}
+.layui-m-anim-scale{animation-name:  layui-m-anim-scale; -webkit-animation-name:  layui-m-anim-scale;}
+
+@-webkit-keyframes layui-m-anim-up{ /* 浠庝笅寰�涓� */
+  0%{opacity: 0; -webkit-transform: translateY(800px); transform: translateY(800px)}
+  100%{opacity: 1; -webkit-transform: translateY(0); transform: translateY(0)}
+}
+@keyframes layui-m-anim-up{
+  0%{opacity: 0; -webkit-transform: translateY(800px); transform: translateY(800px)}
+  100%{opacity: 1; -webkit-transform: translateY(0); transform: translateY(0)}
+}
+.layui-m-anim-up{-webkit-animation-name: layui-m-anim-up; animation-name: layui-m-anim-up}
+
+@-webkit-keyframes layui-m-anim-left{ /* 浠庡彸寰�宸� */
+  0%{-webkit-transform: translateX(100%); transform: translateX(100%)}
+  100%{-webkit-transform: translateX(0); transform: translateX(0)}
+}
+@keyframes layui-m-anim-left{
+  0%{-webkit-transform: translateX(100%); transform: translateX(100%)}
+  100%{-webkit-transform: translateX(0); transform: translateX(0)}
+}
+.layui-m-anim-left{-webkit-animation-name: layui-m-anim-left; animation-name: layui-m-anim-left}
+
+@-webkit-keyframes layui-m-anim-right{ /* 浠庡乏寰�鍙� */
+  0%{-webkit-transform: translateX(-100%); transform: translateX(-100%)}
+  100%{-webkit-transform: translateX(0); transform: translateX(0)}
+}
+@keyframes layui-m-anim-right{
+  0%{-webkit-transform: translateX(-100%); transform: translateX(-100%)}
+  100%{-webkit-transform: translateX(0); transform: translateX(0)}
+}
+.layui-m-anim-right{-webkit-animation-name: layui-m-anim-right; animation-name: layui-m-anim-right}
+
+@-webkit-keyframes layui-m-anim-lout{ /* 寰�宸︽敹缂� */
+  0%{-webkit-transform: translateX(0); transform: translateX(0)}
+  100%{-webkit-transform: translateX(-100%); transform: translateX(-100%)}
+}
+@keyframes layui-m-anim-lout{
+  0%{-webkit-transform: translateX(0); transform: translateX(0)}
+  100%{-webkit-transform: translateX(-100%); transform: translateX(-100%)}
+}
+.layui-m-anim-lout{-webkit-animation-name: layui-m-anim-lout; animation-name: layui-m-anim-lout}
+
+@-webkit-keyframes layui-m-anim-rout{ /* 寰�鍙虫敹缂� */
+  0%{-webkit-transform: translateX(0); transform: translateX(0)}
+  100%{-webkit-transform: translateX(100%); transform: translateX(100%)}
+}
+@keyframes layui-m-anim-rout{
+  0%{-webkit-transform: translateX(0); transform: translateX(0)}
+  100%{-webkit-transform: translateX(100%); transform: translateX(100%)}
+}
+.layui-m-anim-rout{-webkit-animation-name: layui-m-anim-rout; animation-name: layui-m-anim-rout}
+
+
+/** layer mobile */
+.layui-m-layer{position:relative; z-index: 19891014;}
+.layui-m-layer *{-webkit-box-sizing: content-box; -moz-box-sizing: content-box; box-sizing: content-box;}
+.layui-m-layershade,
+.layui-m-layermain{position:fixed; left:0; top:0; width:100%; height:100%;}
+.layui-m-layershade{background-color:rgba(0,0,0, .7); pointer-events:auto;}
+.layui-m-layermain{display:table; font-family: Helvetica, arial, sans-serif; pointer-events: none;}
+.layui-m-layermain .layui-m-layersection{display:table-cell; vertical-align:middle; text-align:center;}
+.layui-m-layerchild{position:relative; display:inline-block; text-align:left; background-color:#fff; font-size:14px; border-radius: 5px; box-shadow: 0 0 8px rgba(0, 0, 0, 0.1);  pointer-events:auto;  -webkit-overflow-scrolling: touch;}
+.layui-m-layerchild{-webkit-animation-fill-mode: both; animation-fill-mode: both; -webkit-animation-duration: .2s; animation-duration: .2s;}
+
+.layui-m-layer0 .layui-m-layerchild{width: 90%; max-width: 640px;}
+.layui-m-layer1 .layui-m-layerchild{border:none; border-radius:0;}
+.layui-m-layer2 .layui-m-layerchild{width:auto; max-width:260px; min-width:40px; border:none; background: none; box-shadow: none; color:#fff;}
+.layui-m-layerchild h3{padding: 0 10px; height: 60px; line-height: 60px; font-size:16px; font-weight: 400;  border-radius: 5px 5px 0 0; text-align: center;}
+.layui-m-layerchild h3,
+.layui-m-layerbtn span{ text-overflow:ellipsis; overflow:hidden; white-space:nowrap;}
+.layui-m-layercont{padding: 50px 30px; line-height: 22px; text-align:center;}
+.layui-m-layer1 .layui-m-layercont{padding:0; text-align:left;}
+.layui-m-layer2 .layui-m-layercont{text-align:center; padding: 0; line-height: 0;}
+.layui-m-layer2 .layui-m-layercont i{width:25px; height:25px; margin-left:8px; display:inline-block; background-color:#fff; border-radius:100%;}
+.layui-m-layer2 .layui-m-layercont p{margin-top: 20px;}
+
+/* loading */
+@-webkit-keyframes layui-m-anim-loading{
+    0%,80%,100%{transform:scale(0); -webkit-transform:scale(0)}
+    40%{transform:scale(1); -webkit-transform:scale(1)}
+}
+@keyframes layui-m-anim-loading{
+    0%,80%,100%{transform:scale(0); -webkit-transform:scale(0)}
+    40%{transform:scale(1); -webkit-transform:scale(1)}
+}
+.layui-m-layer2 .layui-m-layercont i{-webkit-animation: layui-m-anim-loading 1.4s infinite ease-in-out; animation: layui-m-anim-loading 1.4s infinite ease-in-out; -webkit-animation-fill-mode: both; animation-fill-mode: both;}
+
+.layui-m-layer2 .layui-m-layercont i:first-child{margin-left:0; -webkit-animation-delay: -.32s; animation-delay: -.32s;}
+.layui-m-layer2 .layui-m-layercont i.layui-m-layerload{-webkit-animation-delay: -.16s; animation-delay: -.16s;}
+.layui-m-layer2 .layui-m-layercont>div{line-height:22px; padding-top:7px; margin-bottom:20px; font-size: 14px;}
+.layui-m-layerbtn{display: box; display: -moz-box; display: -webkit-box; width: 100%; position:relative; height: 50px; line-height: 50px; font-size: 0; text-align:center;  border-top:1px solid #D0D0D0; background-color: #f2f2f2; border-radius: 0 0 5px 5px;}
+.layui-m-layerbtn span{position:relative; display: block; -moz-box-flex: 1; box-flex: 1; -webkit-box-flex: 1;  text-align:center; font-size:14px; border-radius: 0 0 5px 5px; cursor:pointer;}
+.layui-m-layerbtn span[yes]{color: #40AFFE;}
+.layui-m-layerbtn span[no]{border-right: 1px solid #D0D0D0; border-radius: 0 0 0 5px;}
+.layui-m-layerbtn span:active{background-color: #F6F6F6;}
+.layui-m-layerend{position:absolute; right:7px; top:10px; width:30px; height:30px; border: 0; font-weight:400; background: transparent; cursor: pointer; -webkit-appearance: none; font-size:30px;}
+.layui-m-layerend::before, .layui-m-layerend::after{position:absolute; left:5px; top:15px; content:''; width:18px; height:1px; background-color:#999; transform:rotate(45deg); -webkit-transform:rotate(45deg); border-radius: 3px;}
+.layui-m-layerend::after{transform:rotate(-45deg);  -webkit-transform:rotate(-45deg);}
+
+/* 搴曢儴瀵硅瘽妗嗛鏍� */
+body .layui-m-layer .layui-m-layer-footer{position: fixed; width: 95%; max-width: 100%; margin: 0 auto; left:0; right: 0; bottom: 10px; background: none;}
+.layui-m-layer-footer .layui-m-layercont{padding: 20px; border-radius: 5px 5px 0 0; background-color: rgba(255,255,255,.8);}
+.layui-m-layer-footer .layui-m-layerbtn{display: block; height: auto; background: none; border-top: none;}
+.layui-m-layer-footer .layui-m-layerbtn span{background-color: rgba(255,255,255,.8);}
+.layui-m-layer-footer .layui-m-layerbtn span[no]{color: #FD482C; border-top: 1px solid #c2c2c2; border-radius: 0 0 5px 5px;}
+.layui-m-layer-footer .layui-m-layerbtn span[yes]{margin-top: 10px; border-radius: 5px;}
+
+/* 閫氱敤鎻愮ず */
+body .layui-m-layer .layui-m-layer-msg{width: auto; max-width: 90%; margin: 0 auto; bottom: -150px; background-color: rgba(0,0,0,.7); color: #fff;}
+.layui-m-layer-msg .layui-m-layercont{padding: 10px 20px;}
+
+
+
+
+
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/modules/code.css b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/modules/code.css
new file mode 100644
index 0000000..844d3e9
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/modules/code.css
@@ -0,0 +1,23 @@
+/**
+ 
+ @Name: layui.code
+ @Author: 璐ゅ績
+ @Site: http://www.layui.com
+ 
+ */
+
+/* 鍔犺浇灏辩华鏍囧織 */
+html #layuicss-skincodecss{display:none; position: absolute; width:1989px;}
+
+/* 榛樿椋庢牸 */
+.layui-code-view{display: block; position: relative; margin: 10px 0; padding: 0; border: 1px solid #e2e2e2; border-left-width: 6px; background-color: #f2f2f2; color: #333; font-family: Courier New; font-size: 12px;}
+.layui-code-h3{position: relative; padding: 0 10px; height: 32px; line-height: 32px; border-bottom: 1px solid #e2e2e2; font-size: 12px;}
+.layui-code-h3 a{position: absolute; right: 10px; top: 0; color: #999;}
+.layui-code-view .layui-code-ol{position: relative; overflow: auto;}
+.layui-code-view .layui-code-ol li{position: relative; margin-left: 45px; line-height: 20px; padding: 0 5px; border-left: 1px solid #e2e2e2; list-style-type: decimal-leading-zero; *list-style-type: decimal; background-color: #fff;}
+.layui-code-view pre{margin: 0;}
+
+/* notepadd++椋庢牸 */
+.layui-code-notepad{border: 1px solid #0C0C0C; border-left-color: #3F3F3F; background-color: #0C0C0C; color: #C2BE9E}
+.layui-code-notepad .layui-code-h3{border-bottom: none;}
+.layui-code-notepad .layui-code-ol li{background-color: #3F3F3F; border-left: none;}
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/modules/laydate/default/font.css b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/modules/laydate/default/font.css
new file mode 100644
index 0000000..f429656
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/modules/laydate/default/font.css
@@ -0,0 +1,16 @@
+/** 鍥炬爣瀛椾綋 **/
+@font-face {font-family: 'laydate-icon';
+  src: url('./font/iconfont.eot');
+  src: url('./font/iconfont.eot#iefix') format('embedded-opentype'),
+  url('./font/iconfont.svg#iconfont') format('svg'),
+  url('./font/iconfont.woff') format('woff'),
+  url('./font/iconfont.ttf') format('truetype');
+}
+                    
+.laydate-icon{
+  font-family:"laydate-icon" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/modules/laydate/default/laydate.css b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/modules/laydate/default/laydate.css
new file mode 100644
index 0000000..7af789b
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/modules/laydate/default/laydate.css
@@ -0,0 +1,168 @@
+/**
+ 
+ @Name: laydata
+ @Author: 璐ゅ績
+ 
+ **/
+ 
+
+html #layuicss-laydate{display: none; position: absolute; width: 1989px;}
+
+/* 鍒濆鍖� */
+.layui-laydate *{margin: 0; padding: 0;}
+
+/* 涓讳綋缁撴瀯 */
+.layui-laydate, .layui-laydate *{box-sizing: border-box;}
+.layui-laydate{position: absolute; z-index: 66666666; margin: 5px 0; border-radius: 2px; font-size: 14px; -webkit-animation-duration: 0.3s; animation-duration: 0.3s; -webkit-animation-fill-mode: both; animation-fill-mode: both;}
+.layui-laydate-main{width: 272px;}
+.layui-laydate-header *,
+.layui-laydate-content td,
+.layui-laydate-list li{transition-duration: .3s; -webkit-transition-duration: .3s;}
+
+@-webkit-keyframes laydate-upbit{ /* 寰井寰�涓婃粦鍏� */
+  from {-webkit-transform: translate3d(0, 20px, 0); opacity: 0.3;}
+  to {-webkit-transform: translate3d(0, 0, 0);  opacity: 1;}
+}
+@keyframes laydate-upbit{
+  from {transform: translate3d(0, 20px, 0);  opacity: 0.3;}
+  to {transform: translate3d(0, 0, 0);  opacity: 1;}
+}
+.layui-laydate{-webkit-animation-name: laydate-upbit; animation-name: laydate-upbit;}
+.layui-laydate-static{ position: relative; z-index: 0; display: inline-block; margin: 0; -webkit-animation: none; animation: none;}
+
+/* 灞曞紑骞存湀鍒楄〃鏃� */
+.laydate-ym-show .laydate-prev-m,
+.laydate-ym-show .laydate-next-m{display: none !important;}
+.laydate-ym-show .laydate-prev-y,
+.laydate-ym-show .laydate-next-y{display: inline-block !important;}
+.laydate-ym-show .laydate-set-ym span[lay-type="month"]{display: none !important;}
+
+/* 灞曞紑鏃堕棿鍒楄〃鏃� */
+.laydate-time-show .layui-laydate-header .layui-icon,
+.laydate-time-show .laydate-set-ym span[lay-type="year"],
+.laydate-time-show .laydate-set-ym span[lay-type="month"]{display: none !important;}
+
+/* 澶撮儴缁撴瀯 */
+.layui-laydate-header{position: relative; line-height:30px; padding: 10px 70px 5px;}
+.layui-laydate-header *{display: inline-block; vertical-align: bottom;}
+.layui-laydate-header i{position: absolute; top: 10px; padding: 0 5px; color: #999; font-size: 18px; cursor: pointer;}
+.layui-laydate-header i.laydate-prev-y{left: 15px;}
+.layui-laydate-header i.laydate-prev-m{left: 45px;}
+.layui-laydate-header i.laydate-next-y{right: 15px;}
+.layui-laydate-header i.laydate-next-m{right: 45px;}
+.laydate-set-ym{width: 100%; text-align: center; box-sizing: border-box; text-overflow: ellipsis; overflow: hidden; white-space: nowrap;}
+.laydate-set-ym span{padding: 0 5px; cursor: pointer;}
+.laydate-time-text{cursor: default !important;}
+
+/* 涓讳綋缁撴瀯 */
+.layui-laydate-content{position: relative; padding: 10px; -moz-user-select: none; -webkit-user-select: none; -ms-user-select: none;}
+.layui-laydate-content table{border-collapse: collapse; border-spacing: 0;}
+.layui-laydate-content th,
+.layui-laydate-content td{width: 36px; height: 30px; padding: 5px; text-align: center;}
+.layui-laydate-content th{font-weight: 400;}
+.layui-laydate-content td{position: relative; cursor: pointer;}
+.laydate-day-mark{position: absolute; left: 0; top: 0; width: 100%; height: 100%; line-height: 30px; font-size: 12px; overflow: hidden;}
+.laydate-day-mark:after{position: absolute; content:''; right: 2px; top: 2px; width: 5px; height: 5px; border-radius: 50%;}
+
+/* 搴曢儴缁撴瀯 */
+.layui-laydate-footer{position: relative; height: 46px; line-height: 26px; padding: 10px 20px;}
+.layui-laydate-footer span{margin-right: 15px; display: inline-block; cursor: pointer; font-size: 12px;}
+.layui-laydate-footer span:hover{color: #5FB878;}
+.laydate-footer-btns{position: absolute; right: 10px; top: 10px;}
+.laydate-footer-btns span{height: 26px; line-height: 26px; margin: 0 0 0 -1px; padding: 0 10px; border: 1px solid #C9C9C9; background-color: #fff;  white-space: nowrap; vertical-align: top; border-radius: 2px;}
+
+/* 骞存湀鍒楄〃 */
+.layui-laydate-list{position: absolute; left: 0; top: 0; width: 100%; height: 100%; padding: 10px; box-sizing: border-box; background-color: #fff;}
+.layui-laydate-list>li{position: relative; display: inline-block; width: 33.3%; height: 36px; line-height: 36px; margin: 3px 0; vertical-align: middle; text-align: center; cursor: pointer;}
+.laydate-month-list>li{width: 25%; margin: 17px 0;}
+.laydate-time-list{}
+.laydate-time-list>li{height: 100%; margin: 0; line-height: normal; cursor: default;}
+.laydate-time-list p{position: relative; top: -4px; line-height: 29px;}
+.laydate-time-list ol{height: 181px; overflow: hidden;}
+.laydate-time-list>li:hover ol{overflow-y: auto;}
+.laydate-time-list ol li{width: 130%; padding-left: 33px; line-height: 30px; text-align: left; cursor: pointer;}
+
+/* 鎻愮ず */
+.layui-laydate-hint{position: absolute; top: 115px; left: 50%; width: 250px; margin-left: -125px; line-height: 20px; padding: 15px; text-align: center; font-size: 12px; color: #FF5722;}
+
+
+/* 鍙屾棩鍘� */
+.layui-laydate-range{width: 546px;}
+.layui-laydate-range .layui-laydate-main{display: inline-block; vertical-align: middle;}
+.layui-laydate-range .laydate-main-list-0 .laydate-next-m,
+.layui-laydate-range .laydate-main-list-0 .laydate-next-y,
+.layui-laydate-range .laydate-main-list-1 .laydate-prev-y,
+.layui-laydate-range .laydate-main-list-1 .laydate-prev-m{display: none;}
+.layui-laydate-range .laydate-main-list-1 .layui-laydate-content{border-left: 1px solid #e2e2e2;}
+
+
+/* 榛樿绠�绾︿富棰� */
+.layui-laydate, .layui-laydate-hint{border: 1px solid #d2d2d2; box-shadow: 0 2px 4px rgba(0,0,0,.12); background-color: #fff; color: #666;}
+.layui-laydate-header{border-bottom: 1px solid #e2e2e2;}
+.layui-laydate-header i:hover,
+.layui-laydate-header span:hover{color: #5FB878;}
+.layui-laydate-content{border-top: none 0; border-bottom: none 0;}
+.layui-laydate-content th{color: #333;}
+.layui-laydate-content td{color: #666;}
+.layui-laydate-content td.laydate-selected{background-color: #00F7DE;}
+.laydate-selected:hover{background-color: #00F7DE !important;}
+.layui-laydate-content td:hover,
+.layui-laydate-list li:hover{background-color: #eaeaea; /*color: #333;*/}
+.laydate-time-list li ol{margin: 0; padding: 0; border: 1px solid #e2e2e2; border-left-width: 0;}
+.laydate-time-list li:first-child ol{border-left-width: 1px;}
+.laydate-time-list>li:hover{background: none;}
+.layui-laydate-content .laydate-day-prev,
+.layui-laydate-content .laydate-day-next{color: #d2d2d2;}
+.laydate-selected.laydate-day-prev,
+.laydate-selected.laydate-day-next{background-color: #f8f8f8 !important;}
+.layui-laydate-footer{border-top: 1px solid #e2e2e2;}
+.layui-laydate-hint{color: #FF5722;}
+.laydate-day-mark:after{background-color: #5FB878;}
+.layui-laydate-content td.layui-this .laydate-day-mark:after{display: none;}
+.layui-laydate-footer span[lay-type="date"]{color: #5FB878;}
+.layui-laydate .layui-this{background-color: #009688 !important; color: #fff !important;}
+.layui-laydate .laydate-disabled,
+.layui-laydate .laydate-disabled:hover{background:none !important; color: #d2d2d2 !important; cursor: not-allowed !important; -moz-user-select: none; -webkit-user-select: none; -ms-user-select: none;}
+
+.layui-laydate-content .laydate-day-red{
+  color: #ff3333;
+}
+.laydate-day-red:hover{
+  color: #ff3333;
+}
+.layui-laydate-content .laydate-day-yellow{
+  color: #ffbb00;
+}
+.laydate-day-yellow:hover{
+  color: #ffbb00;
+}
+.laydate-day-blue{background-color: #00F7DE;}
+/* 澧ㄧ豢/鑷畾涔夎儗鏅壊涓婚 */
+.laydate-theme-molv{border: none;}
+.laydate-theme-molv.layui-laydate-range{width: 548px}
+.laydate-theme-molv .layui-laydate-main{width: 274px;}
+.laydate-theme-molv .layui-laydate-header{border: none; background-color: #009688;}
+.laydate-theme-molv .layui-laydate-header i,
+.laydate-theme-molv .layui-laydate-header span{color: #f6f6f6;}
+.laydate-theme-molv .layui-laydate-header i:hover,
+.laydate-theme-molv .layui-laydate-header span:hover{color: #fff;}
+.laydate-theme-molv .layui-laydate-content{border: 1px solid #e2e2e2; border-top: none; border-bottom: none;}
+.laydate-theme-molv .laydate-main-list-1 .layui-laydate-content{border-left: none;}
+.laydate-theme-molv .layui-laydate-footer{border: 1px solid #e2e2e2;}
+
+/* 鏍煎瓙涓婚 */
+.laydate-theme-grid .layui-laydate-content td,
+.laydate-theme-grid .layui-laydate-content thead,
+.laydate-theme-grid .laydate-year-list>li,
+.laydate-theme-grid .laydate-month-list>li{border: 1px solid #e2e2e2;}
+.laydate-theme-grid .laydate-selected,
+.laydate-theme-grid .laydate-selected:hover{background-color: #f2f2f2 !important; color: #009688 !important;}
+.laydate-theme-grid .laydate-selected.laydate-day-prev,
+.laydate-theme-grid .laydate-selected.laydate-day-next{color: #d2d2d2 !important;}
+.laydate-theme-grid .laydate-year-list,
+.laydate-theme-grid .laydate-month-list{margin: 1px 0 0 1px;}
+.laydate-theme-grid .laydate-year-list>li,
+.laydate-theme-grid .laydate-month-list>li{margin: 0 -1px -1px 0;}
+.laydate-theme-grid .laydate-year-list>li{height: 43px; line-height: 43px;}
+.laydate-theme-grid .laydate-month-list>li{height: 71px; line-height: 71px;}
+
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/modules/layer/default/icon-ext.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/modules/layer/default/icon-ext.png
new file mode 100644
index 0000000..bbbb669
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/modules/layer/default/icon-ext.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/modules/layer/default/icon.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/modules/layer/default/icon.png
new file mode 100644
index 0000000..3e17da8
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/modules/layer/default/icon.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/modules/layer/default/layer.css b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/modules/layer/default/layer.css
new file mode 100644
index 0000000..d5ea560
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/modules/layer/default/layer.css
@@ -0,0 +1,179 @@
+/**
+ 
+ @Name: layer
+ 
+ **/
+
+/* *html{background-image: url(about:blank); background-attachment: fixed;} */
+html #layuicss-layer{display: none; position: absolute; width: 1989px;}
+
+/* common */
+.layui-layer-shade, .layui-layer{position:fixed; _position:absolute; pointer-events: auto;}
+.layui-layer-shade{top:0; left:0; width:100%; height:100%; _height:expression(document.body.offsetHeight+"px");}
+.layui-layer{-webkit-overflow-scrolling: touch;}
+.layui-layer{top:150px; left: 0; margin:0; padding:0; background-color:#fff; -webkit-background-clip: content; border-radius: 2px; box-shadow: 1px 1px 50px rgba(0,0,0,.3);}
+.layui-layer-close{position:absolute;}
+.layui-layer-content{position:relative;}
+.layui-layer-border{border: 1px solid #B2B2B2; border: 1px solid rgba(0,0,0,.1); box-shadow: 1px 1px 5px rgba(0,0,0,.2);}
+.layui-layer-load{background:url(loading-1.gif) #eee center center no-repeat;}
+.layui-layer-ico{ background:url(icon.png) no-repeat;}
+.layui-layer-dialog .layui-layer-ico,
+.layui-layer-setwin a,
+.layui-layer-btn a{display:inline-block; *display:inline; *zoom:1; vertical-align:top;}
+
+.layui-layer-move{display: none; position: fixed; *position: absolute; left: 0px; top: 0px; width: 100%; height: 100%; cursor: move; opacity: 0; filter:alpha(opacity=0); background-color: #fff; z-index: 2147483647;}
+.layui-layer-resize{position: absolute; width: 15px; height: 15px; right: 0; bottom: 0; cursor: se-resize;}
+
+/* 鍔ㄧ敾 */
+.layer-anim{-webkit-animation-fill-mode: both; animation-fill-mode: both; -webkit-animation-duration:.3s; animation-duration:.3s;}
+
+@-webkit-keyframes layer-bounceIn { /* 榛樿 */
+	0% {opacity: 0; -webkit-transform: scale(.5); transform: scale(.5)}
+	100% {opacity: 1; -webkit-transform: scale(1); transform: scale(1)}
+}
+@keyframes layer-bounceIn {
+	0% {opacity: 0; -webkit-transform: scale(.5); -ms-transform: scale(.5); transform: scale(.5)}
+	100% {opacity: 1; -webkit-transform: scale(1); -ms-transform: scale(1); transform: scale(1)}
+}
+.layer-anim-00{-webkit-animation-name: layer-bounceIn;animation-name: layer-bounceIn}
+
+@-webkit-keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);-ms-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);-ms-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-01{-webkit-animation-name:layer-zoomInDown;animation-name:layer-zoomInDown}
+
+@-webkit-keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.layer-anim-02{-webkit-animation-name:layer-fadeInUpBig;animation-name:layer-fadeInUpBig}
+
+@-webkit-keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);-ms-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);-ms-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-03{-webkit-animation-name:layer-zoomInLeft;animation-name:layer-zoomInLeft}
+
+@-webkit-keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0px) rotate(0deg);transform:translateX(0px) rotate(0deg)}}@keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);-ms-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0px) rotate(0deg);-ms-transform:translateX(0px) rotate(0deg);transform:translateX(0px) rotate(0deg)}}.layer-anim-04{-webkit-animation-name:layer-rollIn;animation-name:layer-rollIn}
+
+@keyframes layer-fadeIn{0%{opacity:0}100%{opacity:1}}.layer-anim-05{-webkit-animation-name:layer-fadeIn;animation-name:layer-fadeIn}
+
+@-webkit-keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);-ms-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)}}.layer-anim-06{-webkit-animation-name:layer-shake;animation-name:layer-shake}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}
+
+/* 鏍囬鏍� */
+.layui-layer-title{padding:0 80px 0 20px; height: 50px; line-height: 50px; border-bottom:1px solid #F0F0F0; font-size: 14px; color:#333; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;background-color: #F8F8F8; border-radius: 2px 2px 0 0;}
+.layui-layer-setwin{position:absolute; right: 15px; *right:0; top: 17px; font-size:0; line-height: initial;}
+.layui-layer-setwin a{position:relative; width: 16px; height:16px; margin-left:10px; font-size:12px; _overflow:hidden;}
+.layui-layer-setwin .layui-layer-min cite{position:absolute; width:14px; height:2px; left:0; top:50%; margin-top:-1px; background-color:#2E2D3C; cursor:pointer; _overflow:hidden;}
+.layui-layer-setwin .layui-layer-min:hover cite{background-color:#2D93CA; }
+.layui-layer-setwin .layui-layer-max{background-position:-32px -40px;}
+.layui-layer-setwin .layui-layer-max:hover{background-position:-16px -40px;}
+.layui-layer-setwin .layui-layer-maxmin{background-position:-65px -40px;}
+.layui-layer-setwin .layui-layer-maxmin:hover{background-position:-49px -40px;}
+.layui-layer-setwin .layui-layer-close1{background-position: 1px -40px; cursor: pointer;}
+.layui-layer-setwin .layui-layer-close1:hover{opacity:0.7;}
+.layui-layer-setwin .layui-layer-close2{position:absolute; right:-28px; top:-28px; width:30px; height:30px;  margin-left:0; background-position:-149px -31px; *right:-18px; _display:none;}
+.layui-layer-setwin .layui-layer-close2:hover{ background-position:-180px -31px;}
+
+/* 鎸夐挳鏍� */
+.layui-layer-btn{text-align: right; padding: 0 15px 12px; pointer-events: auto; user-select: none; -webkit-user-select: none;}
+.layui-layer-btn a{height: 28px; line-height: 28px; margin: 5px 5px 0; padding: 0 15px; border: 1px solid #dedede; background-color:#fff; color: #333; border-radius: 2px; font-weight:400; cursor:pointer; text-decoration: none;}
+.layui-layer-btn a:hover{opacity: 0.9; text-decoration: none;}
+.layui-layer-btn a:active{opacity: 0.8;}
+.layui-layer-btn .layui-layer-btn0{border-color: #1E9FFF; background-color: #1E9FFF; color:#fff;}
+.layui-layer-btn-l{text-align: left;}
+.layui-layer-btn-c{text-align: center;}
+
+/* 瀹氬埗鍖� */
+.layui-layer-dialog{min-width: 300px;}
+.layui-layer-dialog .layui-layer-content{position: relative; padding:20px; line-height:24px; word-break: break-all; overflow:hidden; font-size:14px; overflow-x: hidden; overflow-y:auto;}
+.layui-layer-dialog .layui-layer-content .layui-layer-ico{position:absolute; top:16px; left:15px; _left:-40px; width:30px; height:30px;}
+.layui-layer-ico1{background-position:-30px 0 }
+.layui-layer-ico2{background-position:-60px 0;}
+.layui-layer-ico3{background-position:-90px 0;}
+.layui-layer-ico4{background-position:-120px 0;}
+.layui-layer-ico5{background-position:-150px 0;}
+.layui-layer-ico6{background-position:-180px 0;}
+.layui-layer-rim{border:6px solid #8D8D8D; border:6px solid rgba(0,0,0,.3); border-radius:5px; box-shadow: none;}
+.layui-layer-msg{min-width:180px; border:1px solid #D3D4D3; box-shadow: none;}
+.layui-layer-hui{min-width:100px;  background-color: #000; filter:alpha(opacity=60); background-color: rgba(0,0,0,0.6); color: #fff; border:none;}
+.layui-layer-hui .layui-layer-content{padding:12px 25px; text-align:center;}
+.layui-layer-dialog .layui-layer-padding{padding: 20px 20px 20px 55px; text-align: left;}
+.layui-layer-page .layui-layer-content{position:relative; overflow:auto;}
+.layui-layer-page .layui-layer-btn,.layui-layer-iframe .layui-layer-btn{padding-top:10px;}
+.layui-layer-nobg{background:none;}
+.layui-layer-iframe iframe{display: block; width: 100%;}
+
+.layui-layer-loading{border-radius:100%; background:none;  box-shadow:none;  border:none;}
+.layui-layer-loading .layui-layer-content{width:60px; height:24px; background:url(loading-0.gif) no-repeat;}
+.layui-layer-loading .layui-layer-loading1{width:37px; height:37px; background:url(loading-1.gif) no-repeat;}
+.layui-layer-loading .layui-layer-loading2, .layui-layer-ico16{width:32px; height:32px; background:url(loading-2.gif) no-repeat;}
+.layui-layer-tips{background: none; box-shadow:none; border:none;}
+.layui-layer-tips .layui-layer-content{position: relative; line-height: 22px; min-width: 12px; padding: 8px 15px; font-size: 12px; _float:left; border-radius: 2px; box-shadow: 1px 1px 3px rgba(0,0,0,.2); background-color: #000; color: #fff;}
+.layui-layer-tips .layui-layer-close{right:-2px; top:-1px;}
+.layui-layer-tips i.layui-layer-TipsG{ position:absolute;  width:0; height:0; border-width:8px; border-color:transparent; border-style:dashed; *overflow:hidden;}
+.layui-layer-tips i.layui-layer-TipsT, .layui-layer-tips i.layui-layer-TipsB{left:5px; border-right-style:solid; border-right-color: #000;}
+.layui-layer-tips i.layui-layer-TipsT{bottom:-8px;}
+.layui-layer-tips i.layui-layer-TipsB{top:-8px;}
+.layui-layer-tips i.layui-layer-TipsR, .layui-layer-tips i.layui-layer-TipsL{top: 5px; border-bottom-style:solid; border-bottom-color: #000;}
+.layui-layer-tips i.layui-layer-TipsR{left:-8px;}
+.layui-layer-tips i.layui-layer-TipsL{right:-8px;}
+
+/* skin */
+.layui-layer-lan[type="dialog"]{min-width:280px;}
+.layui-layer-lan .layui-layer-title{background:#4476A7; color:#fff; border: none;}
+.layui-layer-lan .layui-layer-btn{padding: 5px 10px 10px; text-align: right; border-top:1px solid #E9E7E7}
+.layui-layer-lan .layui-layer-btn a{background: #fff; border-color: #E9E7E7; color: #333;}
+.layui-layer-lan .layui-layer-btn .layui-layer-btn1{background:#C9C5C5;}
+.layui-layer-molv .layui-layer-title{background: #009f95; color:#fff; border: none;}
+.layui-layer-molv .layui-layer-btn a{background: #009f95; border-color: #009f95;}
+.layui-layer-molv .layui-layer-btn .layui-layer-btn1{background:#92B8B1;}
+
+
+/**
+ 
+ @Name: layer鎷撳睍鏍峰紡
+ 
+ */
+
+.layui-layer-iconext{background:url(icon-ext.png) no-repeat;}
+
+/* prompt妯″紡 */
+.layui-layer-prompt .layui-layer-input{display: block; width: 260px; height: 36px; margin: 0 auto; line-height: 30px; padding-left: 10px; border: 1px solid #e6e6e6; color: #333;}
+.layui-layer-prompt textarea.layui-layer-input{width: 300px; height: 100px; line-height: 20px; padding: 6px 10px;}
+.layui-layer-prompt .layui-layer-content{padding: 20px;}
+.layui-layer-prompt .layui-layer-btn{padding-top: 0;}
+
+/* tab妯″紡 */
+.layui-layer-tab{box-shadow:1px 1px 50px rgba(0,0,0,.4);}
+.layui-layer-tab .layui-layer-title{padding-left:0; overflow: visible;}
+.layui-layer-tab .layui-layer-title span{position:relative; float:left; min-width:80px; max-width: 300px; padding:0 20px; text-align:center; cursor:default; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; cursor: pointer;}
+.layui-layer-tab .layui-layer-title span.layui-this{height: 51px; border-left: 1px solid #eee; border-right: 1px solid #eee; background-color: #fff; z-index: 10;}
+.layui-layer-tab .layui-layer-title span:first-child{border-left:none;}
+.layui-layer-tabmain{line-height:24px; clear:both;}
+.layui-layer-tabmain .layui-layer-tabli{display:none;}
+.layui-layer-tabmain .layui-layer-tabli.layui-this{display: block;}
+
+/* photo妯″紡 */
+.layui-layer-photos{background: none; box-shadow: none;}
+.layui-layer-photos .layui-layer-content{overflow:hidden; text-align: center;}
+.layui-layer-photos .layui-layer-phimg img{position: relative; width:100%; display: inline-block; *display:inline; *zoom:1; vertical-align:top;}
+.layui-layer-imgprev, .layui-layer-imgnext{position: fixed; top: 50%; width: 27px; _width: 44px; height: 44px;  margin-top:-22px; outline:none;blr:expression(this.onFocus=this.blur());}
+.layui-layer-imgprev{left: 30px; background-position:-5px -5px; _background-position:-70px -5px;}
+.layui-layer-imgprev:hover{background-position:-33px -5px; _background-position:-120px -5px;}
+.layui-layer-imgnext{right: 30px; _right:8px; background-position:-5px -50px; _background-position:-70px -50px;}
+.layui-layer-imgnext:hover{background-position: -33px -50px; _background-position: -120px -50px;}
+.layui-layer-imgbar{position: fixed; left:0; right: 0; bottom:0; width:100%; height: 40px; line-height: 40px; background-color:#000\9; filter:Alpha(opacity=60); background-color: rgba(2,0,0,.35); color: #fff; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; font-size:0;}
+.layui-layer-imgtit{/*position:absolute; left:20px;*/}
+.layui-layer-imgtit *{display:inline-block; *display:inline; *zoom:1; vertical-align:top; font-size:12px;}
+.layui-layer-imgtit a{max-width:65%;  text-overflow: ellipsis; overflow: hidden; white-space: nowrap; color:#fff;}
+.layui-layer-imgtit a:hover{color:#fff; text-decoration:underline;}
+.layui-layer-imgtit em{padding-left:10px; font-style: normal;}
+
+/* 鍏抽棴鍔ㄧ敾 */
+@-webkit-keyframes layer-bounceOut {
+  100% {opacity: 0; -webkit-transform: scale(.7); transform: scale(.7)}
+  30% {-webkit-transform: scale(1.05); transform: scale(1.05)}
+  0% {-webkit-transform: scale(1); transform: scale(1);}
+}
+@keyframes layer-bounceOut {
+  100% {opacity: 0; -webkit-transform: scale(.7); -ms-transform: scale(.7); transform: scale(.7);}
+  30% {-webkit-transform: scale(1.05); -ms-transform: scale(1.05); transform: scale(1.05);}
+  0% {-webkit-transform: scale(1); -ms-transform: scale(1);transform: scale(1);}
+}
+.layer-anim-close{-webkit-animation-name: layer-bounceOut; animation-name: layer-bounceOut; -webkit-animation-fill-mode: both; animation-fill-mode: both; -webkit-animation-duration:.2s; animation-duration:.2s;}
+
+@media screen and (max-width: 1100px) {
+  .layui-layer-iframe{overflow-y: auto; -webkit-overflow-scrolling: touch;}
+}
+
+
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/modules/layer/default/layer.old.css b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/modules/layer/default/layer.old.css
new file mode 100644
index 0000000..b4018dd
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/modules/layer/default/layer.old.css
@@ -0,0 +1,182 @@
+/**
+ 
+ @Name: layer
+ @Author: 璐ゅ績
+ 
+ **/
+
+/* *html{background-image: url(about:blank); background-attachment: fixed;} */
+html #layuicss-layer{display: none; position: absolute; width: 1989px;}
+
+/* common */
+.layui-layer-shade, .layui-layer{position:fixed; _position:absolute; pointer-events: auto;}
+.layui-layer-shade{top:0; left:0; width:100%; height:100%; _height:expression(document.body.offsetHeight+"px");}
+.layui-layer{-webkit-overflow-scrolling: touch;}
+.layui-layer{top:150px; left: 0; margin:0; padding:0; background-color:#fff; -webkit-background-clip: content; border-radius: 2px; box-shadow: 1px 1px 50px rgba(0,0,0,.3);border:1px solid #B2B2B2 \9;}
+.layui-layer-close{position:absolute;}
+.layui-layer-content{position:relative;}
+.layui-layer-border{border: 1px solid #B2B2B2; border: 1px solid rgba(0,0,0,.1); box-shadow: 1px 1px 5px rgba(0,0,0,.2);}
+.layui-layer-load{background:url(loading-1.gif) #eee center center no-repeat;}
+.layui-layer-ico{ background:url(icon.png) no-repeat;}
+.layui-layer-dialog .layui-layer-ico,
+.layui-layer-setwin a,
+.layui-layer-btn a{display:inline-block; *display:inline; *zoom:1; vertical-align:top;}
+
+.layui-layer-move{display: none; position: fixed; *position: absolute; left: 0px; top: 0px; width: 100%; height: 100%; cursor: move; opacity: 0; filter:alpha(opacity=0); background-color: #fff; z-index: 2147483647;}
+.layui-layer-resize{position: absolute; width: 15px; height: 15px; right: 0; bottom: 0; cursor: se-resize;}
+
+/* 鍔ㄧ敾 */
+.layer-anim{-webkit-animation-fill-mode: both; animation-fill-mode: both; -webkit-animation-duration:.3s; animation-duration:.3s;}
+
+@-webkit-keyframes layer-bounceIn { /* 榛樿 */
+	0% {opacity: 0; -webkit-transform: scale(.5); transform: scale(.5)}
+	100% {opacity: 1; -webkit-transform: scale(1); transform: scale(1)}
+}
+@keyframes layer-bounceIn {
+	0% {opacity: 0; -webkit-transform: scale(.5); -ms-transform: scale(.5); transform: scale(.5)}
+	100% {opacity: 1; -webkit-transform: scale(1); -ms-transform: scale(1); transform: scale(1)}
+}
+.layer-anim-00{-webkit-animation-name: layer-bounceIn;animation-name: layer-bounceIn}
+
+@-webkit-keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);-ms-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);-ms-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-01{-webkit-animation-name:layer-zoomInDown;animation-name:layer-zoomInDown}
+
+@-webkit-keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.layer-anim-02{-webkit-animation-name:layer-fadeInUpBig;animation-name:layer-fadeInUpBig}
+
+@-webkit-keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);-ms-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);-ms-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-03{-webkit-animation-name:layer-zoomInLeft;animation-name:layer-zoomInLeft}
+
+@-webkit-keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0px) rotate(0deg);transform:translateX(0px) rotate(0deg)}}@keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);-ms-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0px) rotate(0deg);-ms-transform:translateX(0px) rotate(0deg);transform:translateX(0px) rotate(0deg)}}.layer-anim-04{-webkit-animation-name:layer-rollIn;animation-name:layer-rollIn}
+
+@keyframes layer-fadeIn{0%{opacity:0}100%{opacity:1}}.layer-anim-05{-webkit-animation-name:layer-fadeIn;animation-name:layer-fadeIn}
+
+@-webkit-keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);-ms-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)}}.layer-anim-06{-webkit-animation-name:layer-shake;animation-name:layer-shake}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}
+
+/* 鏍囬鏍� */
+.layui-layer-title{padding:0 80px 0 20px; height:42px; line-height:42px; border-bottom:1px solid #eee; font-size:14px; color:#333; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; background-color: #F8F8F8; border-radius: 2px 2px 0 0;}
+.layui-layer-setwin{position:absolute; right:15px; *right:0; top:15px; font-size:0; line-height: initial;}
+.layui-layer-setwin a{position:relative; width: 16px; height:16px; margin-left:10px; font-size:12px; _overflow:hidden;}
+.layui-layer-setwin .layui-layer-min cite{position:absolute; width:14px; height:2px; left:0; top:50%; margin-top:-1px; background-color:#2E2D3C; cursor:pointer; _overflow:hidden;}
+.layui-layer-setwin .layui-layer-min:hover cite{background-color:#2D93CA; }
+.layui-layer-setwin .layui-layer-max{background-position:-32px -40px;}
+.layui-layer-setwin .layui-layer-max:hover{background-position:-16px -40px;}
+.layui-layer-setwin .layui-layer-maxmin{background-position:-65px -40px;}
+.layui-layer-setwin .layui-layer-maxmin:hover{background-position:-49px -40px;}
+.layui-layer-setwin .layui-layer-close1{background-position: 1px -40px; cursor: pointer;}
+.layui-layer-setwin .layui-layer-close1:hover{opacity:0.7;}
+.layui-layer-setwin .layui-layer-close2{position:absolute; right:-28px; top:-28px; width:30px; height:30px;  margin-left:0; background-position:-149px -31px; *right:-18px; _display:none;}
+.layui-layer-setwin .layui-layer-close2:hover{ background-position:-180px -31px;}
+.layui-layer-setwin .layui-layer-closetrue{background-position: 1px -40px;cursor: pointer;}
+
+/* 鎸夐挳鏍� */
+.layui-layer-btn{text-align: right; padding: 0 15px 12px; pointer-events: auto; user-select: none; -webkit-user-select: none;}
+.layui-layer-btn a{height: 28px; line-height: 28px; margin: 5px 5px 0; padding: 0 15px; border: 1px solid #dedede; background-color:#fff; color: #333; border-radius: 2px; font-weight:400; cursor:pointer; text-decoration: none;}
+.layui-layer-btn a:hover{opacity: 0.9; text-decoration: none;}
+.layui-layer-btn a:active{opacity: 0.8;}
+.layui-layer-btn .layui-layer-btn0{border-color: #1E9FFF; background-color: #009688; color:#fff;}
+.layui-layer-btn-l{text-align: left;}
+.layui-layer-btn-c{text-align: center;}
+
+/* 瀹氬埗鍖� */
+.layui-layer-dialog{min-width:260px;}
+.layui-layer-dialog .layui-layer-content{position: relative; padding:20px; line-height:24px; word-break: break-all; overflow:hidden; font-size:14px; overflow-x: hidden; overflow-y:auto;}
+.layui-layer-dialog .layui-layer-content .layui-layer-ico{position:absolute; top:16px; left:15px; _left:-40px; width:30px; height:30px;}
+.layui-layer-ico1{background-position:-30px 0 }
+.layui-layer-ico2{background-position:-60px 0;}
+.layui-layer-ico3{background-position:-90px 0;}
+.layui-layer-ico4{background-position:-120px 0;}
+.layui-layer-ico5{background-position:-150px 0;}
+.layui-layer-ico6{background-position:-180px 0;}
+.layui-layer-rim{border:6px solid #8D8D8D; border:6px solid rgba(0,0,0,.3); border-radius:5px; box-shadow: none;}
+.layui-layer-msg{min-width:180px; border:1px solid #D3D4D3; box-shadow: none;}
+.layui-layer-hui{min-width:100px;  background-color: #000; filter:alpha(opacity=60); background-color: rgba(0,0,0,0.6); color: #fff; border:none;}
+.layui-layer-hui .layui-layer-content{padding:12px 25px; text-align:center;}
+.layui-layer-dialog .layui-layer-padding{padding: 20px 20px 20px 55px; text-align: left;}
+.layui-layer-page .layui-layer-content{position:relative; overflow:auto;}
+.layui-layer-page .layui-layer-btn,.layui-layer-iframe .layui-layer-btn{padding-top:10px;}
+.layui-layer-nobg{background:none;}
+.layui-layer-iframe iframe{display: block; width: 100%;}
+
+.layui-layer-loading{border-radius:100%; background:none;  box-shadow:none;  border:none;}
+.layui-layer-loading .layui-layer-content{width:60px; height:24px; background:url(loading-0.gif) no-repeat;}
+.layui-layer-loading .layui-layer-loading1{width:37px; height:37px; background:url(loading-1.gif) no-repeat;}
+.layui-layer-loading .layui-layer-loading2, .layui-layer-ico16{width:32px; height:32px; background:url(loading-2.gif) no-repeat;}
+.layui-layer-tips{background: none; box-shadow:none; border:none;}
+.layui-layer-tips .layui-layer-content{position: relative; line-height: 22px; min-width: 12px; padding: 8px 15px; font-size: 12px; _float:left; border-radius: 2px; box-shadow: 1px 1px 3px rgba(0,0,0,.2); background-color: #000; color: #fff;}
+.layui-layer-tips .layui-layer-close{right:-2px; top:-1px;}
+.layui-layer-tips i.layui-layer-TipsG{ position:absolute;  width:0; height:0; border-width:8px; border-color:transparent; border-style:dashed; *overflow:hidden;}
+.layui-layer-tips i.layui-layer-TipsT, .layui-layer-tips i.layui-layer-TipsB{left:5px; border-right-style:solid; border-right-color: #000;}
+.layui-layer-tips i.layui-layer-TipsT{bottom:-8px;}
+.layui-layer-tips i.layui-layer-TipsB{top:-8px;}
+.layui-layer-tips i.layui-layer-TipsR, .layui-layer-tips i.layui-layer-TipsL{top: 5px; border-bottom-style:solid; border-bottom-color: #000;}
+.layui-layer-tips i.layui-layer-TipsR{left:-8px;}
+.layui-layer-tips i.layui-layer-TipsL{right:-8px;}
+
+/* skin */
+.layui-layer-lan[type="dialog"]{min-width:280px;}
+.layui-layer-lan .layui-layer-title{background:#4476A7; color:#fff; border: none;}
+.layui-layer-lan .layui-layer-btn{padding: 5px 10px 10px; text-align: right; border-top:1px solid #E9E7E7}
+/*.layui-layer-lan .layui-layer-btn a{background: #fff; border-color: #E9E7E7; color: #333;}*/
+.layui-layer-lan .layui-layer-btn .layui-layer-btn1{background:#fff;}
+.layui-layer-molv .layui-layer-title{background: #009f95; color:#fff; border: none;}
+.layui-layer-molv .layui-layer-btn a{background: #009f95; border-color: #009f95;}
+.layui-layer-molv .layui-layer-btn .layui-layer-btn1{background:#92B8B1;}
+
+
+/**
+ 
+ @Name: layer鎷撳睍鏍峰紡
+ 
+ */
+
+.layui-layer-iconext{background:url(icon-ext.png) no-repeat;}
+
+/* prompt妯″紡 */
+.layui-layer-prompt .layui-layer-input{display: block; width: 230px; height: 36px; margin: 0 auto; line-height: 30px; padding-left: 10px; border: 1px solid #e6e6e6; color: #333;}
+.layui-layer-prompt textarea.layui-layer-input{width: 300px; height: 100px; line-height: 20px; padding: 6px 10px;}
+.layui-layer-prompt .layui-layer-content{padding: 20px;}
+.layui-layer-prompt .layui-layer-btn{padding-top: 0;}
+
+/* tab妯″紡 */
+.layui-layer-tab{box-shadow:1px 1px 50px rgba(0,0,0,.4);}
+.layui-layer-tab .layui-layer-title{padding-left:0; overflow: visible;}
+.layui-layer-tab .layui-layer-title span{position:relative; float:left; min-width:80px; max-width:260px; padding:0 20px; text-align:center; cursor:default; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; cursor: pointer;}
+.layui-layer-tab .layui-layer-title span.layui-this{height: 43px; border-left: 1px solid #eee; border-right: 1px solid #eee; background-color: #fff; z-index: 10;}
+.layui-layer-tab .layui-layer-title span:first-child{border-left:none;}
+.layui-layer-tabmain{line-height:24px; clear:both;}
+.layui-layer-tabmain .layui-layer-tabli{display:none;}
+.layui-layer-tabmain .layui-layer-tabli.layui-this{display: block;}
+
+/* photo妯″紡 */
+.layui-layer-photos{-webkit-animation-duration: .8s; animation-duration: .8s;}
+.layui-layer-photos .layui-layer-content{overflow:hidden; text-align: center;}
+.layui-layer-photos .layui-layer-phimg img{position: relative; width:100%; display: inline-block; *display:inline; *zoom:1; vertical-align:top;}
+.layui-layer-imguide,.layui-layer-imgbar{display:none;}
+.layui-layer-imgprev, .layui-layer-imgnext{position:absolute; top:50%; width:27px; _width:44px; height:44px;  margin-top:-22px; outline:none;blr:expression(this.onFocus=this.blur());}
+.layui-layer-imgprev{left:10px; background-position:-5px -5px; _background-position:-70px -5px;}
+.layui-layer-imgprev:hover{background-position:-33px -5px; _background-position:-120px -5px;}
+.layui-layer-imgnext{right:10px; _right:8px; background-position:-5px -50px; _background-position:-70px -50px;}
+.layui-layer-imgnext:hover{background-position:-33px -50px; _background-position:-120px -50px;}
+.layui-layer-imgbar{position:absolute; left:0; bottom:0; width:100%; height:32px; line-height:32px; background-color:rgba(0,0,0,.8); background-color:#000\9; filter:Alpha(opacity=80); color:#fff; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; font-size:0;}
+.layui-layer-imgtit{/*position:absolute; left:20px;*/}
+.layui-layer-imgtit *{display:inline-block; *display:inline; *zoom:1; vertical-align:top; font-size:12px;}
+.layui-layer-imgtit a{max-width:65%;  text-overflow: ellipsis; overflow: hidden; white-space: nowrap; color:#fff;}
+.layui-layer-imgtit a:hover{color:#fff; text-decoration:underline;}
+.layui-layer-imgtit em{padding-left:10px; font-style: normal;}
+
+/* 鍏抽棴鍔ㄧ敾 */
+@-webkit-keyframes layer-bounceOut {
+  100% {opacity: 0; -webkit-transform: scale(.7); transform: scale(.7)}
+  30% {-webkit-transform: scale(1.05); transform: scale(1.05)}
+  0% {-webkit-transform: scale(1); transform: scale(1);}
+}
+@keyframes layer-bounceOut {
+  100% {opacity: 0; -webkit-transform: scale(.7); -ms-transform: scale(.7); transform: scale(.7);}
+  30% {-webkit-transform: scale(1.05); -ms-transform: scale(1.05); transform: scale(1.05);}
+  0% {-webkit-transform: scale(1); -ms-transform: scale(1);transform: scale(1);}
+}
+.layer-anim-close{-webkit-animation-name: layer-bounceOut; animation-name: layer-bounceOut; -webkit-animation-fill-mode: both; animation-fill-mode: both; -webkit-animation-duration:.2s; animation-duration:.2s;}
+
+@media screen and (max-width: 1100px) {
+  .layui-layer-iframe{overflow-y: auto; -webkit-overflow-scrolling: touch;}
+}
+
+
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/modules/layer/default/loading-0.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/modules/layer/default/loading-0.gif
new file mode 100644
index 0000000..6f3c953
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/modules/layer/default/loading-0.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/modules/layer/default/loading-1.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/modules/layer/default/loading-1.gif
new file mode 100644
index 0000000..db3a483
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/modules/layer/default/loading-1.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/modules/layer/default/loading-2.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/modules/layer/default/loading-2.gif
new file mode 100644
index 0000000..5bb90fd
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/modules/layer/default/loading-2.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/modules/treetable.css b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/modules/treetable.css
new file mode 100644
index 0000000..28d7798
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/css/modules/treetable.css
@@ -0,0 +1,18 @@
+.treeTable-empty {
+    width: 30px;
+    display: inline-block;
+}
+
+.treeTable-icon {
+    cursor: pointer;
+}
+
+.treeTable-icon .layui-icon-triangle-d:before {
+    content: "\e623";
+}
+
+.treeTable-icon.open .layui-icon-triangle-d:before {
+    content: "\e625";
+    background-color: transparent;
+}
+
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/font/iconfont.eot b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/font/iconfont.eot
new file mode 100644
index 0000000..622d7ec
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/font/iconfont.eot
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/font/iconfont.svg b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/font/iconfont.svg
new file mode 100644
index 0000000..999ca1f
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/font/iconfont.svg
@@ -0,0 +1,554 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<!--
+2013-9-30: Created.
+-->
+<svg>
+<metadata>
+Created by iconfont
+</metadata>
+<defs>
+
+<font id="layui-icon" horiz-adv-x="1024" >
+  <font-face
+    font-family="layui-icon"
+    font-weight="500"
+    font-stretch="normal"
+    units-per-em="1024"
+    ascent="896"
+    descent="-128"
+  />
+    <missing-glyph />
+    
+    <glyph glyph-name="reply-fill" unicode="&#58897;" d="M507.904 835.5840000000001q93.184 1.024 175.104-33.792t143.872-94.72 97.792-141.312 36.864-174.592q1.024-88.064-30.208-165.888t-87.04-137.728-131.072-98.816-162.304-48.128q-22.528-3.072-48.128-5.12t-56.832-3.072-69.632 0-86.528 6.144q-106.496 10.24-158.208 26.624t-41.472 18.432q54.272 9.216 93.184 29.696 20.48 11.264 16.896 32.256t-19.968 39.424q-52.224 57.344-84.48 133.632t-34.304 164.352q-1.024 93.184 33.792 175.104t95.232 143.36 142.336 97.28 175.104 36.864zM707.584 385.024q0-26.624 18.432-45.568t45.056-18.944 45.568 18.944 18.944 45.568-18.944 45.056-45.568 18.432-45.056-18.432-18.432-45.056zM450.56 385.024q0-26.624 19.456-46.08t46.08-19.456q27.648 0 46.592 19.456t18.944 46.08q0 27.648-18.944 46.592t-46.592 18.944q-26.624 0-46.08-18.944t-19.456-46.592zM196.608 386.048q0-26.624 18.944-46.08t45.568-19.456q27.648 0 46.592 19.456t18.944 46.08-18.944 45.568-46.592 18.944q-26.624 0-45.568-18.944t-18.944-45.568z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="set-fill" unicode="&#58900;" d="M916.9398 445.2101l-69.9664 10.7833c-18.6619 2.863-38.1388 17.826-43.3424 33.2487-5.1618 15.3809-15.0883 65.4524-3.9288 80.6661l41.9004 57.135c11.1595 15.2346 9.3832 38.5985-3.9706 51.9314l-30.6364 30.6573c-13.3538 13.3538-36.7177 15.151-51.9314 3.9497l-57.135-41.8795c-15.2346-11.1804-39.4344-14.3987-53.7704-7.168-14.3569 7.2307-57.3022 35.7773-60.1652 54.4183l-10.7833 69.9664C570.3471 807.6016 552.542 822.8571 533.6712 822.8571h-43.34236734693877c-18.8709 0-36.6759-15.2555-39.5389-33.9174l-10.7833-69.9664c-2.863-18.6619-17.826-38.1388-33.2487-43.3424-15.4018-5.1827-65.4524-15.1092-80.687-3.9288L268.9567 713.5817c-15.2346 11.1804-38.6194 9.3832-51.9523-3.9497l-30.6364-30.6573c-13.3747-13.3538-15.151-36.7177-3.9706-51.9314l41.9004-57.135c11.1595-15.2346 14.3778-39.4136 7.168-53.7704-7.2307-14.3569-35.7773-57.2813-54.4183-60.1443l-69.9664-10.7833C88.3984 442.3471 73.1429 424.542 73.1429 405.6712v-43.34236734693877c0-18.8709 15.2555-36.6759 33.9174-39.5389l69.9664-10.7833c18.6619-2.863 38.1388-17.8469 43.3424-33.2487 5.1618-15.4018 15.0883-65.4733 3.9288-80.687l-41.9004-57.135c-11.1595-15.2346-9.3832-38.6194 3.9706-51.9314l30.6364-30.6573c13.3538-13.3538 36.7177-15.151 51.9523-3.9706l57.135 41.9213c15.2346 11.1386 39.4136 14.3778 53.7704 7.168 14.3569-7.2307 57.2813-35.7773 60.1443-54.4183l10.7833-69.9664c2.863-18.6619 20.6472-33.9174 39.5389-33.9174h43.34236734693877c18.8709 0 36.6759 15.2555 39.5389 33.9174l10.7833 69.9664c2.863 18.6619 17.826 38.1388 33.2487 43.3215 15.4018 5.1827 65.4524 15.0883 80.6661 3.9288l57.1559-41.9213c15.2346-11.1595 38.5985-9.3623 51.9314 3.9706l30.6364 30.6573c13.3747 13.3329 15.151 36.7177 3.9706 51.9314l-41.9004 57.135c-11.1595 15.2346-14.3778 39.4136-7.168 53.7496 7.2307 14.3778 35.7773 57.3231 54.4183 60.1861l69.9664 10.7833c18.6619 2.863 33.9174 20.6472 33.9174 39.5389v43.34236734693877C950.8571 424.542 935.6016 442.3471 916.9398 445.2101zM512 210.4633c-95.838 0-173.5367 77.6986-173.5367 173.5367s77.6986 173.5367 173.5367 173.5367 173.5367-77.6986 173.5367-173.5367S607.838 210.4633 512 210.4633zM512 384m-104.7824 0a5.014 5.014 0 1 1 209.5647 0 5.014 5.014 0 1 1-209.5647 0Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="menu-fill" unicode="&#58895;" d="M511.999488 834.254727c-248.678712 0-450.273176-201.585181-450.273176-450.254727s201.594464-450.254727 450.273176-450.254727 450.273176 201.585181 450.273176 450.254727S760.6782 834.254727 511.999488 834.254727zM266.371377 589.705012l491.256222 0 0-33.772174L266.371377 555.932838 266.371377 589.705012zM757.627599 178.29396499999996L266.371377 178.29396499999996l0 33.773198 491.256222 0L757.627599 178.29396499999996zM140.487278 367.11340099999995l0 33.771151 743.024421 0 0-33.771151L140.487278 367.11340099999995z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="search" unicode="&#58901;" d="M439.323351 120.52219c-49.280352 0-97.09834 9.656941-142.126681 28.699646-43.480015 18.388812-82.522793 44.706201-116.043584 78.225619s-59.841305 72.560596-78.230871 116.03883C83.878729 388.513804 74.222416 436.330856 74.222416 485.609189c0 49.284473 9.656313 97.104595 28.699798 142.133138 18.388542 43.479257 44.71008 82.520435 78.231894 116.03883 33.518745 33.515325 72.562546 59.832713 116.043584 78.219479 45.027318 19.039635 92.846329 28.694529 142.125658 28.694529 49.280352 0 97.099364-9.653871 142.126681-28.694529 43.481039-18.385742 82.525863-44.704155 116.044608-78.220502 33.520791-33.518395 59.842328-72.559573 78.230871-116.03883 19.042462-45.028543 28.699798-92.848665 28.699798-142.133138 0-49.278333-9.657336-97.095385-28.701845-142.122905-18.388542-43.47721-44.708033-82.520435-78.228824-116.03883s-72.563569-59.838853-116.043584-78.226642C536.422715 130.177084 488.603703 120.52219 439.323351 120.52219zM439.323351 797.483242c-171.975699 0-311.887855-139.906423-311.887855-311.875077S267.347652 173.734112 439.323351 173.734112s311.887855 139.907447 311.887855 311.874053S611.299051 797.483242 439.323351 797.483242zM890.678206-48.734702c-22.121716 0-42.90387 8.562003-58.541653 24.115234L674.672953 128.025071l37.039062 38.20616 157.888289-153.058978c5.606924-5.606695 13.091693-8.692986 21.077901-8.692986 7.983139 0 15.464837 3.087315 21.070738 8.69094 5.616135 5.622044 8.715856 13.126972 8.715856 21.123087 0 7.980765-3.091535 15.46318-8.702552 21.067828l-0.301888 0.306992L758.714395 213.230662l38.207726 37.035498 152.611906-157.427472c15.571265-15.638165 24.144876-36.422538 24.144876-58.549487 0-22.195511-8.625801-43.054585-24.287121-58.735729C933.723298-40.112324 912.876674-48.734702 890.678206-48.734702zM281.015489 327.245392c-42.340005 42.320874-65.652899 98.584296-65.643689 158.421102 0.008187 59.818387 23.319034 116.074645 65.637549 158.4078l37.634651-37.619806c-66.60666-66.629513-66.60973-175.00071-0.007163-241.577011L281.015489 327.245392z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="share" unicode="&#58945;" d="M769.714 306.453c-51.754 0-97.702-24.851-126.571-63.269L394.479 367.94100000000003c3.93 13.798 6.034 28.364 6.034 43.424 0 16.496-2.527 32.399-7.211 47.35l247.724 124.288c28.71-40.052 75.647-66.151 128.687-66.151 87.388 0 158.229 70.84 158.229 158.229 0 87.388-70.841 158.229-158.229 158.229-87.389 0-158.229-70.841-158.229-158.229 0-6.046 0.352-12.009 1.011-17.88L351.22 526.116c-28.371 26.943-66.723 43.479-108.938 43.479-87.388 0-158.229-70.84-158.229-158.229s70.84-158.229 158.229-158.229c43.752 0 83.354 17.758 111.997 46.459l258.676-129.779c-0.964-7.062-1.474-14.266-1.474-21.592 0-87.389 70.84-158.229 158.229-158.229s158.229 70.84 158.229 158.229C927.938 235.61199999999997 857.103 306.453 769.714 306.453L769.714 306.453z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="set-sm" unicode="&#58912;" d="M946.367 405.895c0.02 21.85-13.04 38.49-31.74 41.57-18.69 3.07-79.05 13.01-85.99 14.14-6.95 1.15-14.09 8.07-15.4 11.45-1.32 3.37-8.94 22.2-11.87 29.46-2.95 7.27-1.92 16.58 4.39 25.52 6.3 8.93 39.9 55.87 48.38 67.72 8.49 11.87 8.65 34.61-4.84 48.39-13.48 13.78-47.75 47.09-56.73 55.86-8.99 8.76-31.08 8.64-42.67 0.43-11.58-8.2-71.69-51.01-71.69-51.01s-9.97-6.89-20.67-2.64c-10.7 4.24-33.43 14.07-33.43 14.07s-7.19 5.43-9.68 19.79c-2.5 14.37-11.11 65.28-14.07 82.7-2.97 17.42-20.67 29.62-37.83 29.46-17.16-0.14-57.91 0-74.33 0s-32.26-15.68-34.75-29.46c-2.49-13.79-11.56-69.16-14.07-84.45-2.52-15.3-11.44-18.48-11.44-18.48s-19.56-8.06-29.91-12.31c-10.34-4.26-15.39-2.64-30.35 7.48-14.95 10.11-44.74 31.03-63.04 43.83-18.3 12.81-38.12 7.92-49.26-3.52s-36.06-35.77-51.02-50.43c-14.95-14.66-12.61-37.54 0.58-55.71 13.2-18.18 32.34-45.43 41.35-58.21 9.01-12.78 10.84-19.5 8.36-26.82-2.49-7.34-6.64-16.58-11.43-27.72-4.81-11.13-9.69-13.64-27.86-17.01-17.36-3.21-58.42-9.92-77.4-13.31-18.99-3.37-30.66-21.43-30.66-41.81l0-64.66c0-24.34 13.2-37.24 38.42-41.93 25.22-4.69 62.66-10.66 74.77-12.61 12.1-1.95 17.67-6.6 21.41-15.54 3.73-8.94 5.13-10.12 9.37-22.57 4.26-12.47 6.46-15.55-4.98-31.67-11.44-16.13-34.31-48.11-46.03-64.51-11.74-16.4-6.45-37.83 4.98-49.85 11.44-12.03 35.47-35.64 48.97-48.97 13.49-13.33 35.19-16.28 53.36-3.52 18.19 12.75 54.98 38.99 65.69 46.62 10.7 7.63 21.91 5.28 27.85 2.94 5.94-2.35 11.25-4.6 22-9.1 10.73-4.48 13.85-11.2 16.41-23.45 2.57-12.24 10.19-56.85 13.93-78.59 3.75-21.72 18.91-33.43 40.62-33.72 21.7-0.29 33.27-0.12 61.57 0 28.29 0.13 41.86 12.61 45.45 31.38 3.59 18.76 12.45 72.94 14.22 83.72 1.78 10.76 5.94 14.73 13.63 18.47 7.7 3.74 14.32 6.47 26.84 11.88 12.51 5.4 18.91 0.66 27.7-5.72 8.8-6.39 47.51-33.78 63.78-45.31 16.28-11.53 36.73-10.33 51.9 4.4 15.18 14.73 31.62 30.99 49.27 48.38 17.64 17.4 12.16 39.59 4.4 51.46-7.77 11.88-44.49 62.95-49.71 70.23-5.21 7.28-4.4 18.62-1.75 24.63 2.64 6.01 8.44 18.24 11.72 25.22 3.29 6.97 9.6 11.22 18.18 12.9 8.58 1.69 62.72 11 83.75 14.61 21.03 3.64 31.11 19.92 31.26 39.92C946.427 359.93499999999995 946.347 388.525 946.367 405.895zM908.587 338.615c0.21-5.76-4.66-10.65-8.82-11.38-4.17-0.73-63.26-11.38-81.48-14.29-18.21-2.92-33.23-15.07-38.72-28.06-3.98-9.44-5.47-13.51-10.59-26.96-5.12-13.44-4.64-32.19 2.56-42.26 7.2-10.08 46.82-64.9 50.38-70.45s4.27-11.95-1.28-17.5-40.99-41.2-47.39-47.39c-6.41-6.19-11.83-4.8-18.79 0-6.95 4.8-39.61 26.39-64.44 44.36-16.96 12.28-32.82 12.43-48.7 6.02-15.87-6.42 1.28 0.28-22.2-8.97-23.48-9.25-30.23-27.62-33.73-48.24-3.5-20.63-10.67-62.98-11.95-70.45-1.28-7.47-5.55-11.1-13.66-11.1l-64.9 0c-8.11 0-11.74 2.99-14.52 11.95-2.77 8.97-10.03 54.87-12.8 74.29-2.78 19.43-13.82 36.12-24.77 40.56-10.94 4.45-4.98 2.14-27.32 11.1-22.34 8.97-39.63 4.5-51.23-3.84-11.61-8.34-58.64-42.69-65.33-46.96-6.68-4.28-14.65-3.28-18.35 0.42-3.7 3.7-40.56 40.56-46.54 46.54-5.98 5.98-5.36 12.92 0 20.49 5.36 7.58 28.39 40.76 40.99 57.95 12.59 17.2 17.93 34.74 9.82 53.49-8.12 18.74-4.42 10.24-12.39 28.6-7.96 18.36-24.28 24.46-38.42 26.9-14.14 2.43-68.88 11.53-76.85 13.23-7.97 1.71-11.95 7.26-11.95 14.09l0 66.18c0 9.53 7.67 12.44 12.38 13.23 4.7 0.8 54.22 9.18 73 12.39 18.79 3.2 36.36 11.32 43.55 29.03 7.19 17.7 4.27 11.1 11.1 27.32 6.83 16.23 3.8 33.94-7.68 49.96-11.49 16.01-38.85 54-44.4 61.9-5.55 7.9-5.77 12.6 0.85 19.21 6.62 6.62 42.05 42.48 46.96 46.97 4.91 4.48 12.07 5.4 18.36 0.85 6.3-4.55 49.31-35.65 64.04-46.11 14.73-10.46 32.35-12.56 49.1-5.55 16.75 7.02 10.25 4.48 26.9 11.1s24.84 19.09 28.18 39.71c3.33 20.61 11.95 74.14 12.81 77.7 0.85 3.55 5.55 10.46 11.74 10.46s65.82-0.07 69.8 0c3.99 0.07 10.3-3.29 11.32-9.18 1.02-5.9 13.02-74.29 14.94-86.25 1.92-11.95 15.58-28.57 25.54-32.73 9.96-4.16 21.35-8.75 31.31-13.09 9.97-4.34 30.13-1.91 36.15 2.28 6.03 4.18 70.52 48.81 75.43 52.37 4.91 3.56 11.52 3.27 17.64-2.85s43.34-43.19 47.54-47.53c4.19-4.34 4.66-8.66 1.14-13.66-3.53-5.01-36.72-51.8-47.54-67.46-10.81-15.65-11.73-33.73-5.41-48.96 6.33-15.22 3.99-9.39 9.11-21.91 5.13-12.53 16.28-29.03 33.59-31.88 17.31-2.85 76.92-12.74 84.82-13.95 7.9-1.21 11.1-7.18 11.1-13.37S908.377 344.385 908.587 338.615zM526.833 573.1949999999999c-110.45 0-200-89.54-200-200s89.55-200 200-200c110.46 0 200 89.54 200 200S637.293 573.1949999999999 526.833 573.1949999999999zM526.833 208.19500000000005c-91.12 0-165 73.87-165 165s73.88 165 165 165c91.13 0 165-73.87 165-165S617.963 208.19500000000005 526.833 208.19500000000005z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="engine" unicode="&#58920;" d="M422.214332 360.70413299999996L186.183684 360.70413299999996l0 46.568461 236.030648 0c10.379577 40.075407 46.47537 69.794509 89.785668 69.794509 51.432433 0 93.067103-41.657943 93.067103-93.067103C605.067103 332.56756700000005 563.40916 290.909624 512 290.909624 468.689703 290.909624 432.593909 320.65199900000005 422.214332 360.70413299999996L422.214332 360.70413299999996zM512 779.634098c-218.529658 0-395.634098-177.10444-395.634098-395.634098 0-218.529658 177.10444-395.634098 395.634098-395.634098 154.76275 0 288.417257 89.064217 353.440885 218.55293l101.398692-59.112389-23.063141-39.959044-62.161099 35.909613c-33.745261-51.595341-77.42792-96.115813-129.093079-129.744711l35.653614-61.765464-40.308133-23.295867-35.653614 61.765464c-53.620057-27.345298-113.360805-44.404109-176.894987-47.73209L535.319139-127.99706800000001l-46.568461 0 0 70.981412c-63.534182 3.327981-123.27493 20.386792-176.894987 47.73209l-35.653614-61.765464-40.308133 23.295867 35.653614 61.765464c-51.665159 33.628898-95.347818 78.149371-129.093079 129.744711l-62.161099-35.909613-23.295867 40.308133 62.114553 35.863067c-27.415116 53.550239-44.799743 113.104807-48.127724 176.685534L0.002932 360.70413299999996l0 46.568461 70.958139 0c3.327981 63.580727 20.712609 123.135295 48.127724 176.685534l-62.114553 35.863067 23.295867 40.308133 62.161099-35.909613c33.745261 51.595341 77.42792 96.115813 129.093079 129.744711l-35.653614 61.765464 40.308133 23.295867 35.653614-61.765464c53.620057 27.345298 113.360805 44.404109 176.894987 47.73209L488.727406 895.997068l46.568461 0 0-70.981412c63.534182-3.327981 123.27493-20.386792 176.894987-47.73209l35.653614 61.765464 40.308133-23.295867-35.653614-61.765464c51.665159-33.628898 95.347818-78.149371 129.093079-129.744711l62.161099 35.909613 23.063141-39.959044-101.398692-59.112389C800.417257 690.569881 666.76275 779.634098 512 779.634098L512 779.634098z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="close" unicode="&#4102;" d="M783.483 701.249L512 429.775 240.517 701.249c-10.082 10.083-26.429 10.083-36.51 0-10.083-10.082-10.083-26.429 0-36.509l271.481-271.475L204.008 121.78800000000001c-10.083-10.081-10.083-26.428 0-36.508 10.082-10.082 26.429-10.082 36.51 0L512 356.755l271.483-271.475c10.082-10.082 26.429-10.082 36.513 0 10.081 10.083 10.081 26.428 0 36.508L548.51 393.265l271.485 271.474c10.081 10.083 10.081 26.429 0 36.509C809.912 711.33 793.564 711.33 783.483 701.249z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="close-fill" unicode="&#4103;" d="M512 822.022125c-217.47508 0-394.423141-176.949085-394.423141-394.423141 0-217.474057 176.948061-394.422118 394.423141-394.422118 217.473033 0 394.422118 176.948061 394.422118 394.422118C906.422118 645.07304 729.473033 822.022125 512 822.022125zM702.228529 270.92978200000005c8.030907-8.030907 8.030907-21.052478 0-29.083385s-21.052478-8.030907-29.083385 0L512 402.992563 350.853833 241.84741899999995c-8.030907-8.030907-21.052478-8.030907-29.083385 0s-8.030907 21.052478 0 29.083385l161.146167 161.146167L321.771471 593.222115c-8.030907 8.030907-8.030907 21.052478 0 29.083385s21.052478 8.030907 29.083385 0l161.146167-161.146167L673.145144 622.305501c8.030907 8.030907 21.052478 8.030907 29.083385 0s8.030907-21.052478 0-29.083385L541.082362 432.075949 702.228529 270.92978200000005z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="chart-screen" unicode="&#58921;" d="M963.930903 179.21903299999997l0 34.824133-37.354769-2.675946L926.576133 694.8538169999999 691.413206 694.8538169999999l0 70.462818L330.260819 765.316635l0-70.462818L95.690386 694.8538169999999l0-480.809627-35.621289 0 0-34.824133 432.583253 0 0-141.228535-90.313935 0 0-35.307134 216.753649 0 0 35.307134-90.313935 0L528.778128 179.21903299999997 963.930903 179.21903299999997zM366.212636 730.008478L655.216819 730.008478l0-35.307134L366.212636 694.7013440000001 366.212636 730.008478zM364.817869 332.73133600000006L222.224244 406.252817l14.295588 27.736715 123.238812-63.523779 173.928285 159.755494 127.5807-92.634794 93.13826 122.414027 12.420891-9.449209 12.420891-9.449209L667.639756 394.365068l-131.636063 95.621824L364.817869 332.73133600000006z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="star" unicode="&#58880;" d="M749.624889-84.152889c-15.672889 0-31.246222 3.882667-45.084444 11.306667l-192.526222 103.637333L319.544889-72.817778c-31.203556-16.64-70.314667-14.392889-99.043556 5.304889-29.511111 20.337778-44.743111 55.921778-38.840889 90.695111l37.703111 225.251556L56.661333 410.908444c-25.002667 24.888889-33.464889 60.984889-22.058667 94.193778 11.349333 32.910222 40.064 56.576 74.965333 61.752889l221.326222 32.896 96.128 199.580444c15.488 32.085333 48.853333 52.807111 84.992 52.807111 36.167111 0 69.518222-20.736 84.963556-52.807111l96.156444-199.580444 221.297778-32.910222c34.872889-5.162667 63.616-28.8 74.979556-61.696 11.392-33.28 2.944-69.361778-22.030222-94.250667L804.622222 248.433778l37.745778-225.28c5.845333-34.773333-9.386667-70.357333-38.812444-90.638222C787.569778-78.392889 768.938667-84.152889 749.624889-84.152889zM512.014222 91.548444c4.636444 0 9.272889-1.137778 13.482667-3.384889l205.937778-110.862222c12.373333-6.641778 28.316444-5.802667 39.936 2.133333 11.392 7.836444 17.123556 21.006222 14.890667 34.304L746.097778 253.496889c-1.507556 9.088 1.450667 18.332444 7.964444 24.832l173.141333 172.842667c9.457778 9.429333 12.686222 23.025778 8.405333 35.484444-4.380444 12.672-15.701333 21.873778-29.525333 23.921778L669.866667 545.706667c-9.315556 1.379556-17.365333 7.296-21.447111 15.786667L545.720889 774.641778c-6.030222 12.529778-19.256889 20.608-33.706667 20.608s-27.690667-8.092444-33.763556-20.622222L375.608889 561.493333c-4.081778-8.490667-12.131556-14.407111-21.447111-15.786667L117.930667 510.577778c-13.624889-2.033778-25.201778-11.434667-29.539556-23.992889-4.266667-12.416-1.024-25.984 8.433778-35.399111L269.937778 278.328889c6.513778-6.499556 9.472-15.744 7.964444-24.832l-40.135111-239.744c-2.247111-13.312 3.484444-26.439111 14.976-34.360889 11.434667-7.836444 27.349333-8.775111 39.950222-2.062222l205.852444 110.833778C502.741333 90.410667 507.377778 91.548444 512.014222 91.548444zM200.32 439.210667c-6.840889 0-12.885333 4.963556-14.023111 11.946667-1.251556 7.751111 4.010667 15.061333 11.761778 16.312889l9.443556 1.536c7.793778 1.336889 15.061333-4.010667 16.312889-11.761778 1.251556-7.751111-4.010667-15.061333-11.761778-16.312889l-9.443556-1.536C201.856 439.267556 201.073778 439.210667 200.32 439.210667zM252.544 447.687111c-6.684444 0-12.643556 4.721778-13.937778 11.534222-1.493333 7.708444 3.555556 15.175111 11.264 16.654222l153.927111 29.696 58.055111 133.148444c3.157333 7.182222 11.548444 10.496 18.716444 7.352889 7.210667-3.143111 10.510222-11.52 7.367111-18.716444l-61.056-140.017778c-1.877333-4.295111-5.745778-7.395556-10.353778-8.277333l-161.28-31.118222C254.336 447.758222 253.44 447.687111 252.544 447.687111z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="circle-dot" unicode="&#58903;" d="M513.133312 830.6731560000001c-247.538793 0-448.208115-200.669322-448.208115-448.207092 0-247.538793 200.670346-448.208115 448.208115-448.208115 247.538793 0 448.208115 200.670346 448.208115 448.208115C961.341427 630.004857 760.673128 830.6731560000001 513.133312 830.6731560000001zM513.132288-6.649187999999981c-214.901465 0-389.113205 174.212764-389.113205 389.114229 0 214.902488 174.21174 389.115252 389.113205 389.115252 214.903511 0 389.115252-174.212764 389.115252-389.115252C902.24754 167.563576 728.0358-6.649187999999981 513.132288-6.649187999999981zM513.133312 382.46504100000004m-344.602456 0a336.754 336.754 0 1 1 689.204911 0 336.754 336.754 0 1 1-689.204911 0Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="chat" unicode="&#58886;" d="M132.682393 414.567179c0 208.287837 166.471452 377.143593 379.317095 377.143593s385.380184-168.855756 385.380184-377.143593c0-177.196725-122.197086-325.812507-290.49821-366.259708l-116.291586-51.04763 0 41.126676C290.570353 52.175568999999996 132.682393 215.31206599999996 132.682393 414.567179zM83.799056 414.567179c0-211.946157 160.764474-387.135154 369.469819-415.152255-3.2623-20.458961-10.036587-65.024969-7.286963-65.024969 2.384303 0 114.89068 47.294143 189.700503 78.865185 176.193885 51.91437 304.518528 211.946157 304.518528 401.312038 0 231.432976-191.70823 419.042865-428.200432 419.042865S83.799056 646.0001560000001 83.799056 414.567179zM340.71952 276.63573699999995c22.935362-41.481763 89.831958-75.102489 170.391738-75.102489 79.650061 0 148.489916 32.909527 172.168198 73.681116-12.701277 5.979178-19.068288 8.02886-28.131711 12.21009-19.894096-31.257911-75.425853-59.661821-142.729725-59.661821-66.969251 0-122.836653 28.40391-143.598512 61.083194L340.71952 276.63573699999995z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="release" unicode="&#58889;" d="M990.78144 828.5388800000001c-3.35872 1.59744-7.04512 2.37568-11.01824 2.37568-14.45888 0-27.60704-10.81344-27.40224-10.81344-8.8064-4.42368-880.59904-443.22816-911.44192-459.44832-17.408-9.13408-27.36128-24.73984-25.92768-40.71424 1.10592-13.14816 9.78944-23.51104 23.10144-27.77088 26.17344-8.27392 290.24256-91.58656 290.24256-91.58656l4.83328-1.47456 16.67072 50.05312-254.32064 79.54432 780.73856 406.28224c-82.82112-93.88032-420.53632-476.32384-436.10112-493.93664-20.11136-22.48704-29.4912-45.09696-29.40928-70.98368l0.28672-153.27232-0.08192 0c0 0 0.08192-53.49376 0.08192-53.6576l0-1.96608 0 0c1.18784-13.5168 12.73856-24.24832 26.54208-24.24832s25.51808 10.73152 26.74688 24.24832l0 0c0 0 0.53248 191.03744 0 205.08672-0.49152 12.4928 5.07904 26.54208 10.69056 33.05472 5.65248 6.38976 390.63552 442.61376 465.75616 527.81056-21.38112-106.41408-126.68928-629.76-128.24576-637.41952-0.8192-4.05504-2.58048-4.05504-3.35872-4.05504-0.6144 0-1.31072 0.12288-2.048 0.36864-7.45472 2.37568-268.82048 81.55136-279.92064 84.91008l-4.7104 1.4336-17.16224-50.50368 5.07904-1.59744c2.58048-0.77824 258.90816-79.09376 284.38528-86.46656 5.07904-1.47456 10.24-2.2528 15.44192-2.2528 26.99264 0 49.5616 19.37408 54.8864 46.98112 2.08896 10.93632 27.0336 134.67648 55.9104 277.99552 39.77216 197.14048 84.7872 420.61824 85.93408 427.6224l0.6144 3.31776C1009.70496 798.96576 1013.26848 817.9712 990.78144 828.5388800000001z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="list" unicode="&#58890;" d="M618.04471 733.97072l-397.175835 0c-16.927531 0-30.699186-13.771655-30.699186-30.699186l0-638.543068c0-16.927531 13.771655-30.699186 30.699186-30.699186l582.261227 0c16.927531 0 30.699186 13.771655 30.699186 30.699186l-0.726547 476.760404L618.04471 733.97072zM803.771715 541.488871 619.537713 541.488871 619.537713 705.552483 803.771715 541.488871zM813.363164 64.728466c0-5.64251-4.590552-10.233062-10.233062-10.233062l-582.261227 0c-5.64251 0-10.233062 4.590552-10.233062 10.233062l0 638.543068c0 5.64251 4.590552 10.233062 10.233062 10.233062l378.202715 0 0-192.481849 214.291574 0L813.363164 64.728466zM298.129516 482.495268l55.258535 0 0-55.258535-55.258535 0 0 55.258535ZM399.777591 468.168981l323.364759 0 0-26.605961-323.364759 0 0 26.605961ZM298.129516 342.044446l55.258535 0 0-55.258535-55.258535 0 0 55.258535ZM399.777591 327.718159l323.364759 0 0-26.605961-323.364759 0 0 26.605961ZM298.129516 199.804884l55.258535 0 0-55.258535-55.258535 0 0 55.258535ZM399.777591 185.478598l323.364759 0 0-26.605961-323.364759 0 0 26.605961ZM881.315812 53.053566"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="chart" unicode="&#58924;" d="M953.440991 315.668729L784.061302 315.668729 681.06451 437.392024c-0.312108 0.373507-0.635473 0.737804-0.969071 1.094938-0.013303 0.014326-0.026606 0.027629-0.039909 0.041956-0.276293 0.293689-0.559748 0.582261-0.851391 0.86367-0.053212 0.051165-0.107447 0.099261-0.160659 0.150426-0.249687 0.237407-0.50142 0.470721-0.76134 0.697895-0.089028 0.078795-0.181125 0.153496-0.272199 0.230244-0.225127 0.191358-0.451278 0.381693-0.683569 0.565888-0.124843 0.099261-0.251733 0.192382-0.3776 0.288572-0.200568 0.153496-0.402159 0.306992-0.607844 0.454348-0.159636 0.11461-0.322341 0.224104-0.485047 0.334621-0.177032 0.12075-0.354064 0.242524-0.535189 0.35918-0.195451 0.12689-0.394996 0.246617-0.593518 0.367367-0.152473 0.092098-0.302899 0.186242-0.457418 0.275269-0.237407 0.137123-0.477884 0.268106-0.718361 0.397043-0.121773 0.065492-0.2415 0.132006-0.364297 0.195451-0.283456 0.146333-0.571005 0.285502-0.859577 0.420579-0.085958 0.040932-0.170892 0.082888-0.257873 0.122797-0.337691 0.154519-0.679475 0.298805-1.022283 0.437975-0.044002 0.017396-0.086981 0.036839-0.130983 0.055259-1.604544 0.638543-3.2623 1.113357-4.948709 1.416256-0.343831 0.062422-0.687662 0.112564-1.031493 0.160659-0.055259 0.008186-0.110517 0.01842-0.165776 0.025583-1.633197 0.216941-3.25923 0.26913-4.861728 0.173962-0.013303-0.001023-0.026606-0.001023-0.040932-0.002047-0.363274-0.022513-0.724501-0.054235-1.085728-0.091074-0.060375-0.00614-0.119727-0.011256-0.180102-0.017396-0.310062-0.034792-0.618077-0.077771-0.926092-0.122797-0.116657-0.017396-0.232291-0.032746-0.348947-0.051165-0.24764-0.040932-0.494257-0.086981-0.740874-0.135076-0.178055-0.033769-0.355087-0.067538-0.532119-0.105401-0.183172-0.039909-0.36532-0.083911-0.547469-0.127913-0.237407-0.056282-0.474814-0.113587-0.710175-0.176009-0.12075-0.032746-0.240477-0.068562-0.360204-0.102331-0.292666-0.082888-0.584308-0.168846-0.874927-0.26299-0.063445-0.020466-0.125867-0.042979-0.188288-0.063445-0.338714-0.112564-0.675382-0.230244-1.010003-0.357134-0.019443-0.007163-0.038886-0.01535-0.058328-0.022513-1.493004-0.571005-2.948145-1.284249-4.340865-2.149966-0.067538-0.041956-0.13303-0.088004-0.200568-0.12996-0.273223-0.172939-0.545422-0.346901-0.813528-0.531096-1.416256-0.971118-2.734274-2.089591-3.936659-3.333932-0.025583-0.026606-0.049119-0.053212-0.074701-0.079818-0.26299-0.275269-0.521886-0.555655-0.773619-0.843204-0.058328-0.066515-0.112564-0.134053-0.169869-0.200568-0.211824-0.246617-0.420579-0.496304-0.62217-0.751107-0.083911-0.106424-0.164752-0.214894-0.246617-0.322341-0.167822-0.218988-0.334621-0.437975-0.49528-0.663102-0.102331-0.14224-0.199545-0.287549-0.298805-0.431835-0.13303-0.194428-0.26606-0.387833-0.393973-0.586354-0.115634-0.179079-0.225127-0.360204-0.335644-0.541329-0.103354-0.168846-0.207731-0.336668-0.306992-0.508583-0.12689-0.220011-0.24764-0.443092-0.36839-0.666172-0.074701-0.138146-0.151449-0.275269-0.223081-0.416486-0.137123-0.265036-0.265036-0.533143-0.39295-0.802272-0.050142-0.105401-0.101307-0.209778-0.150426-0.316202-0.144286-0.317225-0.279363-0.63752-0.410346-0.958838-0.026606-0.064468-0.055259-0.127913-0.080841-0.193405-0.150426-0.378623-0.291642-0.760317-0.423649-1.14508-0.005117-0.016373-0.011256-0.031722-0.017396-0.048095-0.157589-0.463558-0.303922-0.930185-0.434905-1.400906l-97.897657-342.642824L435.093423 811.832042c-0.071631 0.569982-0.165776 1.13587-0.275269 1.696642-0.008186 0.040932-0.017396 0.081864-0.025583 0.12382-0.071631 0.356111-0.148379 0.709151-0.234337 1.061169-0.031722 0.128937-0.065492 0.255827-0.099261 0.38374-0.066515 0.254803-0.135076 0.508583-0.208754 0.760317-0.060375 0.206708-0.124843 0.411369-0.190335 0.615007-0.053212 0.166799-0.107447 0.332575-0.164752 0.49835-0.092098 0.26913-0.190335 0.535189-0.290619 0.800225-0.037862 0.098237-0.074701 0.196475-0.113587 0.293689-0.12382 0.313132-0.25378 0.623193-0.38988 0.930185-0.022513 0.050142-0.044002 0.100284-0.066515 0.150426-0.152473 0.338714-0.311085 0.672312-0.477884 1.00284-0.01228 0.024559-0.024559 0.049119-0.037862 0.074701-0.173962 0.343831-0.356111 0.682545-0.545422 1.017166-0.011256 0.019443-0.022513 0.039909-0.033769 0.059352-0.188288 0.330528-0.382717 0.654916-0.584308 0.975211-0.021489 0.034792-0.044002 0.068562-0.065492 0.103354-0.190335 0.298805-0.385786 0.592494-0.587378 0.88209-0.045025 0.065492-0.091074 0.12996-0.137123 0.194428-0.180102 0.252757-0.363274 0.502443-0.551562 0.74906-0.079818 0.105401-0.162706 0.208754-0.24457 0.312108-0.157589 0.199545-0.317225 0.396019-0.480954 0.590448-0.124843 0.149403-0.252757 0.295735-0.381693 0.442068-0.125867 0.14224-0.251733 0.284479-0.38067 0.424672-0.174985 0.191358-0.355087 0.378623-0.536212 0.563842-0.088004 0.090051-0.176009 0.180102-0.26606 0.26913-0.224104 0.222057-0.452301 0.440022-0.684592 0.653893-0.054235 0.050142-0.10847 0.100284-0.163729 0.150426-0.265036 0.240477-0.535189 0.474814-0.810459 0.704035-0.028653 0.023536-0.056282 0.047072-0.084934 0.070608-0.294712 0.243547-0.595564 0.479931-0.902556 0.711198-0.01535 0.011256-0.029676 0.022513-0.045025 0.033769-0.311085 0.232291-0.627287 0.458441-0.949628 0.677429-0.019443 0.013303-0.037862 0.025583-0.057305 0.038886-0.309038 0.208754-0.623193 0.411369-0.942465 0.606821-0.045025 0.027629-0.090051 0.054235-0.134053 0.081864-0.288572 0.174985-0.581238 0.343831-0.877997 0.50756-0.090051 0.050142-0.181125 0.098237-0.272199 0.147356-0.25071 0.134053-0.502443 0.265036-0.759293 0.391926-0.156566 0.077771-0.314155 0.151449-0.472767 0.226151-0.194428 0.091074-0.38988 0.182149-0.587378 0.268106-0.239454 0.105401-0.481977 0.204661-0.724501 0.302899-0.12382 0.049119-0.246617 0.100284-0.37146 0.148379-0.334621 0.128937-0.673335 0.249687-1.014096 0.36532-0.042979 0.014326-0.085958 0.029676-0.128937 0.044002-1.6158 0.536212-3.296069 0.915859-5.02034 1.119497-0.01535 0.002047-0.029676 0.004093-0.044002 0.00614-0.309038 0.035816-0.620124 0.062422-0.931209 0.086981-0.132006 0.010233-0.265036 0.025583-0.397043 0.033769-0.174985 0.011256-0.349971 0.01535-0.525979 0.022513-0.270153 0.01228-0.539282 0.024559-0.808412 0.027629-0.054235 0.001023-0.10847-0.001023-0.162706-0.001023-1.696642 0.010233-3.371794-0.149403-5.006014-0.466628-0.065492-0.01228-0.12996-0.027629-0.195451-0.039909-0.331551-0.067538-0.662079-0.13917-0.989537-0.218988-0.148379-0.035816-0.295735-0.075725-0.443092-0.11461-0.234337-0.061398-0.468674-0.124843-0.700965-0.192382-0.224104-0.065492-0.445138-0.135076-0.666172-0.206708-0.149403-0.048095-0.297782-0.096191-0.446162-0.147356-0.286526-0.098237-0.568958-0.201591-0.850367-0.309038-0.079818-0.030699-0.160659-0.061398-0.240477-0.093121-0.330528-0.12996-0.655939-0.267083-0.979304-0.410346-0.033769-0.01535-0.067538-0.029676-0.101307-0.045025-0.355087-0.159636-0.705058-0.325411-1.050935-0.500397-0.008186-0.004093-0.016373-0.008186-0.023536-0.01228-0.360204-0.182149-0.714268-0.372483-1.064238-0.569982-0.004093-0.002047-0.008186-0.005117-0.013303-0.007163-0.344854-0.196475-0.684592-0.399089-1.019213-0.610914-0.020466-0.013303-0.040932-0.025583-0.060375-0.038886-0.313132-0.199545-0.621147-0.404206-0.925069-0.61603-0.050142-0.034792-0.099261-0.070608-0.149403-0.105401-0.268106-0.190335-0.532119-0.38374-0.791016-0.583285-0.091074-0.069585-0.181125-0.141216-0.271176-0.212848-0.212848-0.167822-0.422625-0.337691-0.629333-0.512676-0.137123-0.11461-0.271176-0.232291-0.406253-0.349971-0.154519-0.1361-0.308015-0.272199-0.459464-0.412392-0.179079-0.164752-0.354064-0.332575-0.528026-0.502443-0.102331-0.100284-0.204661-0.199545-0.304945-0.301875-0.211824-0.212848-0.418532-0.430812-0.623193-0.651846-0.059352-0.064468-0.119727-0.128937-0.179079-0.194428-0.231267-0.254803-0.456395-0.515746-0.678452-0.780783-0.031722-0.037862-0.063445-0.075725-0.095167-0.11461-0.23536-0.285502-0.465604-0.577145-0.688685-0.874927-0.01842-0.024559-0.036839-0.048095-0.055259-0.072655-0.226151-0.301875-0.445138-0.60989-0.657986-0.923022-0.019443-0.028653-0.038886-0.057305-0.058328-0.084934-0.202615-0.300852-0.400113-0.606821-0.590448-0.916882-0.032746-0.053212-0.064468-0.105401-0.096191-0.158612-0.169869-0.282433-0.335644-0.567935-0.49528-0.857531-0.053212-0.097214-0.105401-0.194428-0.158612-0.292666-0.130983-0.24457-0.258896-0.490164-0.381693-0.73985-0.080841-0.162706-0.157589-0.326435-0.234337-0.491187-0.088004-0.189312-0.177032-0.378623-0.260943-0.571005-0.107447-0.245593-0.209778-0.493234-0.310062-0.741897-0.047072-0.11768-0.095167-0.234337-0.141216-0.354064-0.130983-0.340761-0.25378-0.684592-0.370437-1.030469-0.013303-0.037862-0.026606-0.075725-0.038886-0.113587-0.180102-0.543376-0.345877-1.092891-0.48914-1.650593L244.22942 305.59939599999996 67.355037 305.59939599999996c-14.128789 0-25.582655-11.453866-25.582655-25.582655s11.453866-25.582655 25.582655-25.582655l191.314257 0c0.867764 0 1.725294 0.044002 2.570545 0.128937 0.828878-0.080841 1.656733-0.1361 2.478448-0.1361 11.218506 0 21.512966 7.439436 24.644283 18.779715l113.358791 410.43686 103.412254-723.884758c0.00921-0.072655 0.021489-0.145309 0.030699-0.217964l0.046049-0.320295c0.002047-0.011256 0.005117-0.021489 0.00614-0.032746 0.109494-0.7552 0.25071-1.502213 0.425695-2.238994 0.01535-0.064468 0.031722-0.12689 0.047072-0.191358 0.166799-0.679475 0.358157-1.350764 0.579191-2.01182 0.041956-0.124843 0.088004-0.24764 0.130983-0.37146 0.210801-0.600681 0.437975-1.194198 0.692778-1.77646 0.068562-0.156566 0.144286-0.309038 0.215918-0.464581 0.223081-0.484024 0.460488-0.961908 0.713244-1.431605 0.106424-0.196475 0.213871-0.390903 0.325411-0.584308 0.265036-0.462534 0.545422-0.914836 0.838088-1.359974 0.088004-0.13303 0.170892-0.268106 0.260943-0.399089 0.354064-0.51677 0.732687-1.016143 1.12359-1.506307 0.078795-0.099261 0.156566-0.198521 0.237407-0.296759 0.420579-0.511653 0.864694-1.004887 1.325182-1.482771 0.051165-0.052189 0.101307-0.105401 0.152473-0.157589 0.494257-0.50449 1.010003-0.989537 1.548262-1.454118 0.00921-0.007163 0.017396-0.014326 0.026606-0.022513 1.636267-1.408069 3.466961-2.620687 5.466502-3.592828 0.075725-0.036839 0.151449-0.074701 0.228197-0.11154 0.576121-0.273223 1.165546-0.525979 1.768273-0.75827 0.158612-0.061398 0.319272-0.118704 0.478907-0.177032 0.558725-0.202615 1.124614-0.393973 1.704828-0.559748 0.005117-0.001023 0.010233-0.002047 0.01535-0.004093 0.278339-0.079818 0.562818-0.13917 0.844228-0.209778 0.394996-0.098237 0.789992-0.194428 1.184989-0.274246 0.283456-0.056282 0.568958-0.103354 0.854461-0.149403 0.445138-0.073678 0.889253-0.134053 1.333368-0.183172 0.229221-0.024559 0.456395-0.052189 0.686638-0.071631 0.710175-0.059352 1.418302-0.099261 2.122337-0.099261 0.337691 0 0.671289 0.027629 1.007957 0.040932 0.276293 0.011256 0.550539 0.013303 0.828878 0.033769 0.401136 0.029676 0.799202 0.079818 1.196245 0.127913 0.191358 0.022513 0.38067 0.033769 0.572028 0.061398 0.069585 0.010233 0.1361 0.024559 0.205685 0.034792 0.232291 0.034792 0.462534 0.075725 0.692778 0.116657 0.463558 0.082888 0.921999 0.176009 1.3743 0.283456 0.109494 0.025583 0.218988 0.047072 0.327458 0.074701 0.582261 0.145309 1.152243 0.316202 1.716084 0.499373 0.098237 0.031722 0.196475 0.063445 0.293689 0.097214 1.90335 0.644683 3.694135 1.50119 5.351891 2.540869 0.014326 0.00921 0.028653 0.01842 0.042979 0.027629 1.089821 0.686638 2.121314 1.452071 3.087315 2.287089 0.083911 0.071631 0.167822 0.143263 0.25071 0.215918 0.424672 0.3776 0.837064 0.76748 1.235131 1.170662 0.12382 0.124843 0.243547 0.254803 0.36532 0.382717 0.317225 0.334621 0.626263 0.677429 0.925069 1.028423 0.155543 0.183172 0.308015 0.36839 0.458441 0.556679 0.26606 0.331551 0.523933 0.670266 0.773619 1.01512 0.130983 0.180102 0.261966 0.35918 0.387833 0.543376 0.294712 0.429789 0.575098 0.86981 0.843204 1.316995 0.099261 0.165776 0.195451 0.334621 0.290619 0.503467 0.283456 0.499373 0.555655 1.004887 0.806365 1.52268 0.031722 0.065492 0.060375 0.13303 0.091074 0.199545 0.276293 0.584308 0.530073 1.178849 0.762363 1.784646 0.00614 0.017396 0.014326 0.034792 0.020466 0.051165 0.251733 0.661056 0.472767 1.336438 0.669242 2.020006 0.002047 0.008186 0.00614 0.016373 0.008186 0.024559l0.061398 0.215918c0.029676 0.106424 0.062422 0.210801 0.090051 0.317225l117.579929 411.527704 79.800487-94.308923c0.070608-0.083911 0.146333-0.161682 0.217964-0.243547 0.190335-0.220011 0.38374-0.436952 0.581238-0.649799 0.134053-0.144286 0.26913-0.285502 0.405229-0.425695 0.164752-0.168846 0.331551-0.335644 0.50142-0.500397 0.164752-0.159636 0.329505-0.319272 0.496304-0.473791 0.138146-0.12689 0.279363-0.25071 0.419556-0.37453 0.198521-0.174985 0.397043-0.350994 0.599657-0.518816 0.081864-0.067538 0.166799-0.132006 0.249687-0.198521 0.817622-0.661056 1.667989-1.264806 2.545986-1.811252 0.098237-0.061398 0.195451-0.125867 0.294712-0.185218 0.228197-0.138146 0.459464-0.267083 0.691755-0.398066 0.157589-0.089028 0.315178-0.178055 0.474814-0.264013 0.200568-0.107447 0.403183-0.208754 0.606821-0.311085 0.202615-0.101307 0.406253-0.201591 0.611937-0.297782 0.173962-0.080841 0.348947-0.159636 0.523933-0.237407 0.245593-0.10847 0.494257-0.212848 0.743944-0.313132 0.144286-0.058328 0.289596-0.115634 0.434905-0.171915 0.291642-0.11154 0.586354-0.216941 0.883113-0.317225 0.11154-0.037862 0.223081-0.076748 0.334621-0.113587 0.337691-0.109494 0.677429-0.210801 1.02126-0.305969 0.078795-0.021489 0.157589-0.046049 0.236384-0.066515 0.376577-0.101307 0.757247-0.193405 1.140986-0.277316 0.050142-0.011256 0.100284-0.023536 0.150426-0.034792 0.405229-0.085958 0.813528-0.162706 1.225921-0.229221 0.031722-0.005117 0.063445-0.01228 0.096191-0.017396 0.412392-0.065492 0.828878-0.12075 1.24741-0.165776 0.032746-0.004093 0.064468-0.00921 0.097214-0.01228 0.382717-0.039909 0.768503-0.068562 1.155313-0.092098 0.068562-0.004093 0.1361-0.01228 0.204661-0.01535 0.25992-0.013303 0.521886-0.01535 0.782829-0.020466 0.188288-0.004093 0.376577-0.01535 0.564865-0.01535 0.008186 0 0.01535 0.001023 0.023536 0.001023l181.208085 0c14.129812 0 25.582655 11.453866 25.582655 25.582655S967.56978 315.668729 953.440991 315.668729z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="ok-circle" unicode="&#4101;" d="M516.152065-63.152063c-60.696384 0-119.594819 11.894911-175.056991 35.353183-53.55473 22.651906-101.646028 55.073316-142.936433 96.364745-41.291428 41.291428-73.712839 89.381703-96.363721 142.936433-23.458271 55.462173-35.353183 114.359584-35.353183 175.055968s11.894911 119.594819 35.353183 175.056991c22.651906 53.55473 55.073316 101.646028 96.363721 142.936433 41.290405 41.291428 89.381703 73.712839 142.936433 96.363721 55.462173 23.458271 114.359584 35.353183 175.056991 35.353183s119.594819-11.894911 175.056991-35.353183c53.55473-22.651906 101.645005-55.073316 142.936433-96.363721 41.291428-41.290405 73.711815-89.38068 96.363721-142.936433 23.459295-55.462173 35.353183-114.359584 35.353183-175.056991 0-60.696384-11.893888-119.593795-35.353183-175.055968-22.651906-53.55473-55.072293-101.645005-96.363721-142.936433s-89.381703-73.712839-142.936433-96.364745C635.747907-51.25715200000002 576.849472-63.152063 516.152065-63.152063zM516.152065 774.870222c-214.115566 0-388.311956-174.196391-388.311956-388.311956s174.196391-388.311956 388.311956-388.311956 388.311956 174.196391 388.311956 388.311956S730.268654 774.870222 516.152065 774.870222zM434.74908 132.830517L209.49278 358.08784 289.087583 437.68162 434.74908 292.020122 743.218594 600.488613 822.812373 520.89381Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="layim-theme" unicode="&#58907;" d="M958.830745 538.643056L740.659817 692.753993l-100.539834 0-3.977591-9.332553c-0.37146-0.871857-38.021965-86.8613-124.772748-88.667435-35.691897 0.76441-67.206658 15.500019-93.680613 43.828204-20.658506 22.106484-30.374798 44.584428-30.456662 44.776809l-3.955078 9.393951-100.587929 0L64.518433 538.643056 169.320337 379.756349l89.956801 65.019853-19.016099-368.05254 268.86654 0 4.093225 0 269.866311 0-19.016099 368.051517 89.956801-65.018829L958.830745 538.643056zM730.105437 507.20402l20.655436-399.781172-237.540068 0-4.093225 0L272.587282 107.42284700000005l20.656459 399.781172-115.938546-83.797521-36.3243 55.070246 159.440315 111.641683-19.276019 30.638811L121.066333 508.667348l-14.548344 22.056342 185.921433 131.330094 71.077825 0c5.332449-10.04375 15.433504-26.779923 30.951943-43.580564 32.047904-34.69622 72.256674-53.486168 116.345822-54.411237l0-0.031722c0.203638 0.00307 0.406253 0.01228 0.60989 0.016373 0.203638-0.00307 0.406253-0.013303 0.60989-0.016373l0 0.031722c44.073798 0.925069 84.359316 19.703761 116.566856 54.379515 15.623839 16.821107 25.814945 33.579793 31.188326 43.612287l71.120804 0 185.921433-131.330094-14.548344-22.056342L742.203986 620.7551920000001l-19.276019-30.638811 159.440315-111.641683-36.3243-55.070246L730.105437 507.20402z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="table" unicode="&#58925;" d="M304.738028 343.684806M729.544153 511.153982M595.52788 637.723655M143.806755 686.614156l0-601.704045L881.172549 84.91011100000003l0 601.704045L143.806755 686.614156zM420.318416 299.80441299999995l0 128.936581 184.341448 0 0-128.936581L420.318416 299.80441299999995zM604.659865 256.825552l0-128.936581L420.318416 127.88897099999997l0 128.936581L604.659865 256.825552zM604.659865 600.656435l0-128.936581L420.318416 471.719854l0 128.936581L604.659865 600.656435zM374.232798 600.656435l0-128.936581L189.89135 471.719854l0 128.936581L374.232798 600.656435zM189.89135 428.740994L374.232798 428.740994l0-128.936581L189.89135 299.80441299999995 189.89135 428.740994zM650.745483 428.740994l184.341448 0 0-128.936581L650.745483 299.80441299999995 650.745483 428.740994zM650.745483 471.719854l0 128.936581 184.341448 0 0-128.936581L650.745483 471.719854zM189.89135 256.825552L374.232798 256.825552l0-128.936581L189.89135 127.88897099999997 189.89135 256.825552zM650.745483 127.88897099999997l0 128.936581 184.341448 0 0-128.936581L650.745483 127.88897099999997z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="right" unicode="&#58882;" d="M283.648 721.9189759999999L340.873216 780.926976 740.352 383.99795200000005 340.876288-12.925952000000052 283.648 46.07795199999998 619.52 383.99795200000005Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="left" unicode="&#58883;" d="M740.352 721.9189759999999L683.126784 780.926976 283.648 383.99795200000005 683.123712-12.925952000000052 740.352 46.07795199999998 404.48 383.99795200000005Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="cart-simple" unicode="&#59032;" d="M235.097303 196.866982C247.384597 160.417152 286.382106 132.37606800000003 324.772759 132.37606800000003L861.658537 132.37606800000003 880.429732 132.37606800000003 885.649214 150.54185399999994 1009.08775 580.154957C1021.388907 622.967661 993.187631 660.786325 949.051586 660.786325L424.585365 660.786325C410.791718 660.786325 399.609756 649.5207379999999 399.609756 635.623932 399.609756 621.727125 410.791718 610.461538 424.585365 610.461538L949.051586 610.461538C959.924 610.461538 964.161052 604.779539 961.106394 594.148171L837.667859 164.53506800000002 861.658537 182.70085500000005 324.772759 182.70085500000005C307.742153 182.70085500000005 287.789837 197.04752900000005 282.395194 213.05054900000005L73.600164 832.433664C69.16437 845.592294 54.980454 852.636656 41.919502 848.167687 28.858551 843.698719 21.86648 829.408727 26.302275 816.250097L235.097303 196.866982ZM399.609756-6.017094000000043C399.609756 49.57012899999995 354.881911 94.63247799999999 299.707317 94.63247799999999 244.532723 94.63247799999999 199.804878 49.57012899999995 199.804878-6.017094000000043 199.804878-61.604318000000035 244.532723-106.66666699999996 299.707317-106.66666699999996 354.881911-106.66666699999996 399.609756-61.604318000000035 399.609756-6.017094000000043ZM249.756098-6.017094000000043C249.756098 21.77651800000001 272.120021 44.30769299999997 299.707317 44.30769299999997 327.294613 44.30769299999997 349.658537 21.77651800000001 349.658537-6.017094000000043 349.658537-33.810704999999984 327.294613-56.34187899999995 299.707317-56.34187899999995 272.120021-56.34187899999995 249.756098-33.810704999999984 249.756098-6.017094000000043ZM924.097562-6.017094000000043C924.097562 49.57012899999995 879.369715 94.63247799999999 824.195121 94.63247799999999 769.020529 94.63247799999999 724.292683 49.57012899999995 724.292683-6.017094000000043 724.292683-61.604318000000035 769.020529-106.66666699999996 824.195121-106.66666699999996 879.369715-106.66666699999996 924.097562-61.604318000000035 924.097562-6.017094000000043ZM774.243902-6.017094000000043C774.243902 21.77651800000001 796.607825 44.30769299999997 824.195121 44.30769299999997 851.782419 44.30769299999997 874.146342 21.77651800000001 874.146342-6.017094000000043 874.146342-33.810704999999984 851.782419-56.34187899999995 824.195121-56.34187899999995 796.607825-56.34187899999995 774.243902-33.810704999999984 774.243902-6.017094000000043Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="face-cry" unicode="&#59036;" d="M1024 384C1024 666.769792 794.769792 896 512 896 229.230208 896 0 666.769792 0 384 0 101.23020799999995 229.230208-128 512-128 629.410831-128 740.826187-88.33104600000001 830.768465-16.686661999999956 841.557579-8.092490999999995 843.33693 7.620766000000003 834.742758 18.409879000000046 826.148587 29.198990999999978 810.43533 30.978341999999998 799.646219 22.384173000000033 718.470035-42.277495000000044 618.001779-78.04878099999996 512-78.04878099999996 256.817504-78.04878099999996 49.951219 128.81750399999999 49.951219 384 49.951219 639.182496 256.817504 846.048781 512 846.048781 767.182496 846.048781 974.048781 639.182496 974.048781 384 974.048781 296.507166 949.714859 212.66323599999998 904.470807 140.039307 897.177109 128.33175700000004 900.755245 112.92820300000005 912.462793 105.63450699999999 924.170342 98.34080900000004 939.573897 101.91894200000002 946.867595 113.62649199999998 997.013826 194.11920399999997 1024 287.101621 1024 384ZM337.170731 396.487806C371.654852 396.487806 399.609756 424.442709 399.609756 458.926829 399.609756 493.41095 371.654852 521.365854 337.170731 521.365854 302.686611 521.365854 274.731708 493.41095 274.731708 458.926829 274.731708 424.442709 302.686611 396.487806 337.170731 396.487806ZM711.804879 396.487806C746.288998 396.487806 774.243902 424.442709 774.243902 458.926829 774.243902 493.41095 746.288998 521.365854 711.804879 521.365854 677.320757 521.365854 649.365854 493.41095 649.365854 458.926829 649.365854 424.442709 677.320757 396.487806 711.804879 396.487806ZM352.788105 191.21547499999997C396.165222 225.91716899999994 453.151987 246.639629 524.487806 246.639629 595.823622 246.639629 652.810387 225.91716899999994 696.187505 191.21547499999997 722.700531 170.00505399999997 738.882517 148.42907300000002 746.631548 132.931012 752.800254 120.59359800000004 747.799529 105.59142399999996 735.462114 99.42271600000004 723.124702 93.25401 708.122526 98.25473499999998 701.953818 110.59214899999995 701.03616 112.42746499999998 698.492224 116.61747600000001 694.165854 122.38597100000004 686.602473 132.47047699999996 676.927317 142.654852 664.983226 152.21012499999995 630.311565 179.947456 584.273939 196.68840999999998 524.487806 196.68840999999998 464.70167 196.68840999999998 418.664045 179.947456 383.992384 152.21012499999995 372.048292 142.654852 362.373137 132.47047699999996 354.809756 122.38597100000004 350.483386 116.61747600000001 347.93945 112.42746499999998 347.021792 110.59214899999995 340.853084 98.25473499999998 325.850908 93.25401 313.513495 99.42271600000004 301.176081 105.59142399999996 296.175356 120.59359800000004 302.344062 132.931012 310.093092 148.42907300000002 326.275078 170.00505399999997 352.788105 191.21547499999997Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="face-smile" unicode="&#59055;" d="M1024 384C1024 666.769792 794.769792 896 512 896 229.230208 896 0 666.769792 0 384 0 101.23020799999995 229.230208-128 512-128 629.410831-128 740.826187-88.33104600000001 830.768465-16.686661999999956 841.557579-8.092490999999995 843.33693 7.620766000000003 834.742758 18.409879000000046 826.148587 29.198990999999978 810.43533 30.978341999999998 799.646219 22.384173000000033 718.470035-42.277495000000044 618.001779-78.04878099999996 512-78.04878099999996 256.817504-78.04878099999996 49.951219 128.81750399999999 49.951219 384 49.951219 639.182496 256.817504 846.048781 512 846.048781 767.182496 846.048781 974.048781 639.182496 974.048781 384 974.048781 296.507166 949.714859 212.66323599999998 904.470807 140.039307 897.177109 128.33175700000004 900.755245 112.92820300000005 912.462793 105.63450699999999 924.170342 98.34080900000004 939.573897 101.91894200000002 946.867595 113.62649199999998 997.013826 194.11920399999997 1024 287.101621 1024 384ZM337.170731 396.487806C371.654852 396.487806 399.609756 424.442709 399.609756 458.926829 399.609756 493.41095 371.654852 521.365854 337.170731 521.365854 302.686611 521.365854 274.731708 493.41095 274.731708 458.926829 274.731708 424.442709 302.686611 396.487806 337.170731 396.487806ZM711.804879 396.487806C746.288998 396.487806 774.243902 424.442709 774.243902 458.926829 774.243902 493.41095 746.288998 521.365854 711.804879 521.365854 677.320757 521.365854 649.365854 493.41095 649.365854 458.926829 649.365854 424.442709 677.320757 396.487806 711.804879 396.487806ZM352.788105 127.22903299999996C396.165222 92.52733899999998 453.151987 71.80487900000003 524.487806 71.80487900000003 595.823622 71.80487900000003 652.810387 92.52733899999998 696.187505 127.22903299999996 722.700531 148.43945399999996 738.882517 170.01543500000002 746.631548 185.51349500000003 752.800254 197.850908 747.799529 212.85308399999997 735.462114 219.021792 723.124702 225.19049800000005 708.122526 220.18977299999995 701.953818 207.85235799999998 701.03616 206.01704299999994 698.492224 201.82703100000003 694.165854 196.058537 686.602473 185.97402899999997 676.927317 175.78965500000004 664.983226 166.23438299999998 630.311565 138.49705200000005 584.273939 121.75609799999995 524.487806 121.75609799999995 464.70167 121.75609799999995 418.664045 138.49705200000005 383.992384 166.23438299999998 372.048292 175.78965500000004 362.373137 185.97402899999997 354.809756 196.058537 350.483386 201.82703100000003 347.93945 206.01704299999994 347.021792 207.85235799999998 340.853084 220.18977299999995 325.850908 225.19049800000005 313.513495 219.021792 301.176081 212.85308399999997 296.175356 197.850908 302.344062 185.51349500000003 310.093092 170.01543500000002 326.275078 148.43945399999996 352.788105 127.22903299999996Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="survey" unicode="&#59058;" d="M722.355804 849.454545C761.006291 849.454545 792.380951 818.166023 792.380951 779.627344L792.380951 437.500928 799.081094 453.813218 401.874746 51.22138 418.539682 58.181818 138.070006 58.181818C99.387643 58.181818 68.063492 89.328555 68.063492 127.771428L68.063492 872.727273 44.698413 849.454545 722.355804 849.454545ZM21.333333 896 21.333333 872.727273 21.333333 127.771428C21.333333 63.604277 73.59726 11.636363 138.070006 11.636363L418.539682 11.636363 428.337293 11.636363 435.204619 18.596802 832.410967 421.18864 839.11111 427.979625 839.11111 437.500928 839.11111 779.627344C839.11111 843.859757 786.827324 896 722.355804 896L44.698413 896 21.333333 896ZM775.859347 307.365395 759.337741 290.90909 775.859347 274.452787 869.319663 181.361879 885.841269 164.905574 902.362876 181.361879 972.458114 251.18006 988.979721 267.636363 972.458114 284.092668 878.997796 377.183575 862.47619 393.639878 845.954583 377.183575 775.859347 307.365395ZM845.954583 344.27097 939.414901 251.18006 939.414901 284.092668 869.319663 214.274485 902.362876 214.274485 808.902558 307.365395 808.902558 274.452787 878.997796 344.27097 845.954583 344.27097ZM518.843473 51.365395 513.841133 46.382827 512.453734 39.473248 489.088655-76.890387 482.215251-111.121568 516.58227-104.275332 633.407665-81.002605 640.344663-79.620689 645.347004-74.638121 902.362876 181.361879 918.884482 197.818182 902.362876 214.274485 808.902558 307.365395 792.380951 323.821698 775.859347 307.365395 518.843473 51.365395ZM775.859347 274.452787 869.319663 181.361879 869.319663 214.274485 612.303791-41.725515 624.243127-35.361033 507.41773-58.633758 534.911345-86.018703 558.276425 30.344934 551.886686 18.452787 808.902558 274.452787 775.859347 274.452787ZM426.576706 298.269073C444.201086 298.269073 458.488469 284.053815 458.488469 266.500753L458.488469 258.086116C458.488469 240.540958 444.323959 226.317797 426.576706 226.317797L426.576706 226.317797C408.952326 226.317797 394.664943 240.533054 394.664943 258.086116L394.664943 266.500753C394.664943 284.045911 408.829453 298.269073 426.576706 298.269073L426.576706 298.269073ZM278.349205 552.435127C278.349205 552.435127 280.851125 530.485568 305.477133 530.485568 330.103138 530.485568 331.559155 552.435127 331.559155 552.435127 329.927383 623.508937 362.988497 657.25782 430.67155 653.905282 475.722639 648.839223 499.06407 623.508937 500.624896 577.839917 497.503245 557.501184 480.405116 531.202385 449.969026 499.092521 409.671358 458.489557 389.522524 422.133143 389.522524 390.023279L389.522524 357.093903C389.522524 357.093903 392.614705 337.454532 414.885933 337.454532 437.157161 337.454532 440.249342 357.093903 440.249342 357.093903L440.249342 379.965664C440.249342 406.785969 459.546816 439.044836 498.21271 476.369762 538.652271 513.471183 558.730159 547.369069 558.730159 577.839917 555.395669 662.323878 511.195938 706.353877 425.776235 709.780917 327.515198 711.419936 278.349205 658.971339 278.349205 552.435127Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="tree" unicode="&#58926;" d="M962.691679 258.53447400000005c-8.721639 54.163597-34.298154 97.584526-73.089645 133.8638-44.721551 41.825594-99.282191 65.724911-156.512636 84.432994-26.935466 8.80555-54.079686 16.971533-81.129762 25.427112 41.188074 7.485485 81.495082 10.991332 121.872698 12.269441 39.906895 1.26276 79.885422 0.276293 120.633475 0.276293-30.644951 44.233434-74.588789 71.110571-127.260405 84.384899-53.004191 13.357216-103.742782 9.715269-152.261822-32.081673 18.715247 66.336848 12.464893 120.18936-38.810934 160.830989-32.450063 25.719778-77.127611 31.000038-111.319341 14.916734 58.583257-31.127951 82.051761-84.265172 94.304829-145.102772-44.638663 69.056795-110.067838 96.432283-187.710173 86.487793-56.123228-7.187703-110.723777-26.270317-166.003801-40.048111 15.677051-14.358009 31.136138-24.116257 47.932686-27.839045 51.427276-11.399631 103.405091-20.301372 155.098427-30.524201 37.036521-7.323802 75.163887-12.144598 104.448864-40.879036-78.096682 23.458271-155.928329 30.034037-235.541551 9.092076C186.718589 530.20385 104.838743 479.821369 81.996502 429.437865c46.955428 23.955598 95.807043 18.776645 144.606469 17.139356 37.737486-1.266853 76.089979-3.461845 113.238041 1.594311 52.683896 7.170307 104.513332 20.624736 159.209048 31.909757-91.88164-62.077847-186.516997-122.342396-159.194722-259.889075 58.852386 100.205213 163.392324 150.107763 229.951229 238.105956-16.239869-91.498924 6.980995-169.376619 66.432015-237.83785 41.815361-48.152696 89.979314-92.010577 110.706381-156.013263 12.758582 141.877311-25.823132 270.789333-97.911984 396.334677C755.996107 391.809873 858.199837 325.909977 962.691679 258.53447400000005zM513.476631 320.10169099999996c-27.767414-14.065344-39.008432-35.954887-42.252313-64.998363-6.078439-54.437843-15.162328-108.532879-21.799492-162.916487-3.90903-32.026414-5.519714-64.333214-8.16496-96.53052 30.078039 0 55.507198 0 79.961146 0 9.912767 78.200036 19.732413 154.247037 28.913517 230.369761 0.883113 7.322779-0.756223 15.746636-3.705392 22.591531C536.246217 272.25086999999996 524.967336 295.41135899999995 513.476631 320.10169099999996z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="ie" unicode="&#59323;" d="M734.208 267.1616l236.05248 0c1.82272 16.36352 2.53952 33.09568 2.53952 50.19648 0 80.22016-21.52448 155.46368-59.12576 220.2624 38.87104 103.30112 37.49888 190.99648-14.56128 243.38432-49.50016 49.27488-182.29248 41.28768-332.41088-25.1904-11.10016 0.83968-22.3232 1.26976-33.62816 1.26976-206.04928 0-378.92096-141.80352-426.7008-332.84096 64.63488 82.75968 132.62848 142.7456 223.47776 186.44992-8.25344-7.74144-56.46336-55.64416-64.55296-63.75424-239.55456-239.47264-315.0848-552.30464-233.79968-633.61024 61.78816-61.76768 173.75232-51.34336 302.36672 11.65312 59.8016-30.45376 127.50848-47.63648 199.20896-47.63648 193.1264 0 356.80256 124.3136 416.09216 297.45152l-237.8752 0c-32.72704-60.37504-96.74752-101.4784-170.20928-101.4784s-137.48224 41.10336-170.20928 101.4784c-14.5408 27.27936-22.91712 58.55232-22.91712 91.648l0 0.7168 386.2528 0zM348.30336 383.20128c5.44768 97.11616 86.20032 174.592 184.77056 174.592s179.3024-77.47584 184.77056-174.592l-369.54112 0zM896.96256 732.20096c33.52576-33.87392 32.68608-96.21504 4.01408-174.01856-49.13152 74.91584-120.5248 133.9392-204.8 167.64928 90.112 38.64576 163.40992 43.76576 200.78592 6.38976zM93.4912-71.24992c-42.78272 42.8032-29.88032 132.608 25.23136 240.82432 34.304-96.27648 101.15072-177.09056 187.33056-229.15072-95.4368-43.3152-173.52704-50.66752-212.56192-11.6736z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="upload-circle" unicode="&#58927;" d="M512-128c282.768 0 512 229.216 512 512C1024 666.768 794.768 896 512 896 229.216 896 0 666.768 0 384 0 101.21600000000001 229.216-128 512-128zM512 848c256.272 0 464-207.744 464-464 0-256.272-207.728-464-464-464S48 127.72799999999995 48 384C48 640.256 255.728 848 512 848zM377.728 534.544L480 534.544l0-478c0-17.664 14.336-32 32-32s32 14.336 32 32L544 534.544l102.272 0c17.616 0 23.424 11.568 12.944 25.68l-128.128 172.624c-10.496 14.128-27.664 14.128-38.16 0L364.8 560.24C354.32 546.1120000000001 360.128 534.544 377.728 534.544z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="add-circle" unicode="&#58911;" d="M675.04 412.736l-127.04 0 0 127.264c0 20.064-16.288 36.32-36.32 36.32-20.064 0-36.32-16.192-36.32-36.32l0-127.232-127.072 0c-20.064 0-36.352-16.32-36.352-36.352 0-20.064 16.224-36.352 36.352-36.352l127.072 0 0-127.232c0-20 16.256-36.384 36.32-36.384 20.032 0 36.32 16.256 36.32 36.384l0 127.136 127.04 0c19.968 0 36.352 16.256 36.352 36.384C711.36 396.448 695.136 412.736 675.04 412.736L675.04 412.736zM511.328 830.56c-250.24 0-453.952-203.616-453.952-453.952 0-250.336 203.712-453.952 453.952-453.952 250.336 0 453.984 203.584 453.984 453.952C965.312 626.944 761.696 830.56 511.328 830.56L511.328 830.56zM511.328-20.576000000000022c-219.04 0-397.184 178.176-397.184 397.152 0 219.104 178.144 397.216 397.184 397.216s397.216-178.112 397.216-397.216C908.576 157.63199999999995 730.368-20.576000000000022 511.328-20.576000000000022L511.328-20.576000000000022zM511.328-20.576000000000022"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="download-circle" unicode="&#58881;" d="M510.771521 828.211081c-244.998947 0-443.597097-198.60429-443.597097-443.590957s198.59815-443.591981 443.597097-443.591981c244.986667 0 443.583794 198.60429 443.583794 443.591981S755.758188 828.211081 510.771521 828.211081zM510.771521-30.044013999999947c-229.010811 0-414.664138 185.65435-414.664138 414.664138 0 229.010811 185.653327 414.657998 414.664138 414.657998 228.996484 0 414.652881-185.647187 414.652881-414.657998C925.424402 155.60931300000004 739.768005-30.044013999999947 510.771521-30.044013999999947zM662.749888 352.39518799999996L537.719266 245.82501100000002l0 324.388065c0 14.887059-12.06478 26.953885-26.947745 26.953885-14.894222 0-26.961048-12.066827-26.961048-26.953885l0-325.410348L357.936647 352.39518799999996c-10.56359 10.599406-27.693736 10.599406-38.267559 0-10.56359-10.596336-10.56359-27.777647 0-38.375006l170.181961-161.220868c5.629207-5.652743 13.111622-8.060583 20.49887-7.680936 7.373944-0.379647 14.859429 2.02717 20.488637 7.680936l170.181961 161.220868c10.562567 10.597359 10.562567 27.77867 0 38.375006C690.443623 362.99561700000004 673.313477 362.99561700000004 662.749888 352.39518799999996z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="templeate-1" unicode="&#58928;" d="M320 384L106.666667 384c-35.349333 0-64-28.650667-64-64l0-213.333333c0-35.349333 28.650667-64 64-64l213.333333 0c35.349333 0 64 28.650667 64 64L384 320C384 355.349333 355.349333 384 320 384zM256 341.33333300000004l0-256L170.666667 85.33333300000004 170.666667 341.33333300000004 256 341.33333300000004zM85.333333 106.66666699999996L85.333333 320c0 11.754667 9.578667 21.333333 21.333333 21.333333l42.666667 0 0-256L106.666667 85.33333300000004C94.912 85.33333300000004 85.333333 94.91200000000003 85.333333 106.66666699999996zM341.333333 106.66666699999996c0-11.754667-9.578667-21.333333-21.333333-21.333333l-42.666667 0L277.333333 341.33333300000004l42.666667 0c11.754667 0 21.333333-9.578667 21.333333-21.333333L341.333333 106.66666699999996zM576 554.666667L234.666667 554.666667c-47.061333 0-85.333333-38.272-85.333333-85.333333l0-42.666667 42.666667 0 0 42.666667c0 23.530667 19.136 42.666667 42.666667 42.666667l42.666667 0 0-96 21.333333 0L298.666667 512l213.333333 0 0-426.666667-85.333333 0-21.333333-42.666667 170.666667 0c47.061333 0 85.333333 38.272 85.333333 85.333333L661.333333 469.333333C661.333333 516.394667 623.061333 554.666667 576 554.666667zM618.666667 128c0-23.530667-19.136-42.666667-42.666667-42.666667l-42.666667 0L533.333333 512l42.666667 0c23.530667 0 42.666667-19.136 42.666667-42.666667L618.666667 128zM853.333333 42.66666699999996c47.061333 0 85.333333 38.272 85.333333 85.333333L938.666667 640c0 47.061333-38.272 85.333333-85.333333 85.333333L341.333333 725.333333c-47.061333 0-85.333333-38.272-85.333333-85.333333l0-42.666667 42.666667 0 0 42.666667c0 23.530667 19.136 42.666667 42.666667 42.666667l85.333333 0 0-85.333333 21.333333 0 0 85.333333 298.666667 0 0-597.333333-42.666667 0-21.333333-42.666667L853.333333 42.66666699999996zM896 128c0-23.530667-19.136-42.666667-42.666667-42.666667l-85.333333 0L768 682.666667l85.333333 0c23.530667 0 42.666667-19.136 42.666667-42.666667L896 128z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="util" unicode="&#58929;" d="M282.127566 639.0826059999999c-13.120832-13.221116-30.625508-20.50808-49.278333-20.50808-18.618033 0-36.157501 7.286963-49.311079 20.50808l-32.885991 33.019021 98.623181 99.027387 32.885991-33.019021c13.186324-13.221116 20.473287-30.829146 20.473287-49.548486C302.599829 669.8769589999999 295.347658 652.26893 282.127566 639.0826059999999L282.127566 639.0826059999999zM249.308089 705.0899489999999l-0.032746 0-32.884968-32.987299c4.418636-4.417613 10.252505-6.845918 16.458857-6.845918 6.206352 0 12.041244 2.428306 16.426111 6.813173 4.418636 4.452405 6.845918 10.288321 6.845918 16.493649C256.121262 694.802652 253.693979 700.671313 249.308089 705.0899489999999L249.308089 705.0899489999999zM396.703067 496.343671L249.578242 638.778684l32.278147 33.626865 147.157571-142.468782L396.703067 496.343671 396.703067 496.343671zM751.45979 133.92852400000004L618.131179 274.071332l32.884968 32.985252 133.330658-140.141784L751.45979 133.92852400000004 751.45979 133.92852400000004zM850.184279 67.95597399999997c-22.700001-22.766516-52.481282-34.168194-82.264609-34.168194-29.714765 0-59.395762 11.333116-81.994456 34.033118L538.194592 222.398462l32.884968 33.021068L718.811206 100.806149c27.117614-27.183106 71.269183-27.116591 98.488105 0.169869 27.186176 27.287483 27.117614 71.773673-0.135076 99.196233l-147.426701 154.273642 32.851199 33.021068 147.461493-154.308435C895.447159 187.557956 895.514697 113.421468 850.184279 67.95597399999997L850.184279 67.95597399999997zM801.716404 468.380806c-30.726815-30.860868-71.605851-47.861054-115.082038-47.861054-43.442418 0-84.321454 16.999163-115.082038 47.861054-30.760584 30.861892-47.692209 71.877027-47.692209 115.521037s16.931624 84.691891 47.692209 115.554806l42.497906 42.666752 32.885991-32.986275-42.497906-42.667775c-21.99085-22.090111-34.099632-51.367925-34.065863-82.566484 0-31.163767 12.108782-60.441581 34.065863-82.499969 21.956058-22.058388 51.16531-34.20094 82.196047-34.20094 31.064506 0 60.239989 12.142551 82.196047 34.20094l42.49893 42.665729 32.884968-33.019021L801.716404 468.380806 801.716404 468.380806zM844.214311 511.049604l-49.311079 49.51267-16.45988-16.493649c-17.538445-17.638729-40.879036-27.352975-65.73719-27.352975l-0.032746 0c-24.824385 0-48.198745 9.713222-65.73719 27.352975-17.539468 17.607006-27.252691 41.082674-27.252691 66.007343 0 24.925692 9.679453 48.400337 27.252691 66.040089l16.458857 16.495696-49.344848 49.51267 32.885991 33.021068 82.196047-82.533738-49.311079-49.482995c-8.769734-8.835226-13.626345-20.571525-13.626345-33.051767 0-12.446473 4.856611-24.183795 13.626345-32.987299 8.768711-8.835226 20.439518-13.69286 32.884968-13.69286 12.411681 0 24.082488 4.857635 32.852222 13.69286l49.344848 49.514717 82.196047-82.534761L844.214311 511.049604 844.214311 511.049604zM233.591129 129.139451l0 46.681182 46.512337 0 0-46.681182L233.591129 129.139451 233.591129 129.139451zM538.160823 356.538555l-92.247984 91.572602 32.717146 33.18889 92.214215-91.539856L538.160823 356.538555 538.160823 356.538555zM304.2187 101.04355599999997l173.634596 239.842507 37.641295-27.454282L338.318332 69.23715300000003c-21.923312-22.057365-51.132564-34.20094-82.19707-34.20094-31.028691 0-60.237943 12.143575-82.196047 34.168194-21.958104 22.057365-34.065863 51.335179-34.065863 82.533738 0 31.198559 12.107759 60.476373 34.065863 82.533738l2.765997 2.360767L417.243893 412.054963l27.353998-37.742603L205.596542 200.00340600000004c-12.411681-13.053294-19.224854-30.119995-19.224854-48.26526 0-18.71934 7.252171-36.291554 20.438495-49.513694C232.747925 76.15265599999998 277.775444 75.71263499999998 304.2187 101.04355599999997L304.2187 101.04355599999997z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="face-surprised" unicode="&#58980;" d="M485.656116-128C221.592397-128 6.762016 86.81718000000001 6.762016 350.87649799999997s214.830381 478.867697 478.8941 478.867697c264.041716 0 478.854495-214.812779 478.854495-478.867697S749.697832-128 485.656116-128zM485.656116 798.834741c-247.024795 0-447.975846-200.959852-447.975846-447.962644 0-247.002792 200.951051-447.962644 447.975846-447.962644 247.002792 0 447.953843 200.959852 447.953843 447.962644C933.609959 597.8748889999999 732.658908 798.834741 485.656116 798.834741zM352.033458 447.380528c0-30.469398-24.682677-55.147675-55.143274-55.147675-30.451796 0-55.143274 24.678276-55.143274 55.147675 0 30.460597 24.691478 55.138874 55.143274 55.138874C327.350781 502.519402 352.033458 477.845526 352.033458 447.380528zM674.417647 502.519402c-30.460597 0-55.156476-24.678276-55.156476-55.138874 0-30.469398 24.695879-55.147675 55.156476-55.147675 30.451796 0 55.143274 24.678276 55.143274 55.147675C729.560922 477.845526 704.869444 502.519402 674.417647 502.519402zM562.005634 165.30976499999997c0-59.733046-34.192262-108.165484-76.349518-108.165484-42.166057 0-76.36272 48.432438-76.36272 108.165484 0 59.724245 34.196663 108.152282 76.36272 108.152282C527.813371 273.45764699999995 562.005634 225.03400999999997 562.005634 165.30976499999997zM835.631745 793.712503c0 0 12.871605 56.819883 41.959231 85.925112 29.083226 29.096427 69.915916 15.124685 78.492585-8.801097 9.461179-26.385689-2.033053-50.069442-29.092027-56.164202C899.404495 808.463141 874.880237 826.192952 835.631745 793.712503zM916.698651 757.570797c0 0 35.767659 20.576965 64.877288 19.393218 29.136032-1.174946 41.431165-29.144833 33.109728-45.110024-9.192746-17.588993-27.054573-22.966463-43.217788-11.797871C954.979023 731.44034 952.453108 752.721393 916.698651 757.570797z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="edit" unicode="&#58946;" d="M769.089 516.251l-125.896 125.89 62.974 62.947c20.866 20.838 54.652 20.838 75.517 0l50.353-50.351c20.865-20.865 20.865-54.703 0-75.567L769.089 516.251zM403.349 150.52700000000004L277.453 276.418 619.706 615.982 745.601 490.09ZM176.314 47.283000000000015L252.912 251.87699999999995 377.753 127.01199999999994Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="speaker" unicode="&#58949;" d="M587.182306 754.7203c-6.003737 2.705622-13.043061 1.642406-17.984606-2.721994l-259.223926-229.293243-148.246369 0c-9.253758 0-16.752546-7.498788-16.752546-16.756639l0-267.886213c0-9.249665 7.498788-16.756639 16.752546-16.756639l144.050814 0c9.253758 0 16.752546 7.506974 16.752546 16.756639L322.530764 490.391099c1.774413 0.704035 3.433192 1.719154 4.892427 3.010567l236.127905 208.861912 0-653.332912-160.751171 137.64287c-2.12643 1.824555-90.300632 78.69941-93.927229 76.162634-4.427846-3.097548-15.768125-17.59882-18.419512-22.512736-0.953721-1.768273-2.196015-1.334391 15.413038-16.379039 25.674753-21.936615 73.780377-61.548798 75.144444-62.717414l10.007935-8.570189 178.388876-152.761196c3.093455-2.653433 6.978948-4.028757 10.900258-4.028757 2.369977 0 4.756327 0.503467 7.003508 1.534959 5.939269 2.738367 9.749038 8.677637 9.749038 15.217586L597.060281 739.446431C597.060281 746.034477 593.190137 752.013655 587.182306 754.7203L587.182306 754.7203zM290.453185 254.814756l-115.040083 0L175.413102 489.195877l115.03906 0 0-234.381122L290.453185 254.814756zM747.742119 375.98444300000006c0-51.55212-34.83232-96.658434-84.702124-109.693308-1.415232-0.375553-2.846838-0.551562-4.245697-0.551562-7.438413 0-14.234189 4.992711-16.200984 12.523221-2.338255 8.949836 3.021823 18.104333 11.967566 20.442588 35.136242 9.18929 59.672054 40.96397 59.672054 77.279061 0 36.307927-24.535813 68.090794-59.672054 77.271898-8.945743 2.346441-14.305821 11.492752-11.967566 20.450774 2.342348 8.953929 11.499915 14.305821 20.446681 11.967566C712.909799 472.643899 747.742119 427.530422 747.742119 375.98444300000006L747.742119 375.98444300000006zM864.950588 375.793084c0-88.87619-48.554856-170.44495-126.718053-212.883505-2.537799-1.375324-5.276167-2.02717-7.982812-2.02717-5.939269 0-11.69946 3.166109-14.733563 8.762571-4.417613 8.134261-1.39886 18.303878 6.727215 22.720468 67.350944 36.566824 109.198028 106.851587 109.198028 183.427636 0 76.844156-42.055838 147.272181-109.741403 183.78784-8.154727 4.396123-11.192923 14.557554-6.795776 22.700001 4.38896 8.142447 14.558577 11.184737 22.701025 6.795776C816.151162 546.697499 864.950588 464.976266 864.950588 375.793084L864.950588 375.793084z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="down" unicode="&#58906;" d="M888.306 619.94c15.615 15.617 40.93 15.617 56.545 0v0c15.617-15.615 15.617-40.93 0-56.545l-405.733-405.734c-15.615-15.617-40.928-15.617-56.545 0v0c-15.615 15.615-15.615 40.93 0 56.545l405.733 405.734zM538.619 214.20600000000002c15.617-15.615 15.617-40.93 0-56.545v0c-15.615-15.617-40.928-15.617-56.545 0l-405.734 405.734c-15.615 15.615-15.615 40.93 0 56.545v0c15.617 15.617 40.93 15.617 56.547 0l405.732-405.734zM538.619 214.20600000000002z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="file" unicode="&#58913;" d="M887.443911 598.6304l0-44.578133 0-45.511111 0-477.866667c0-37.705956-30.560711-68.266667-68.266667-68.266667l-614.4 0c-37.705956 0-68.266667 30.560711-68.266667 68.266667l0 705.422222c0 37.6832 30.560711 68.266667 68.266667 68.266667l386.844444 0 45.511111 0 38.024533 0c7.805156 2.594133 16.566044 1.2288 22.778311-5.006222l183.136711-183.159467C885.919289 611.373511 887.876267 604.9564439999999 887.443911 598.6304zM659.888356 531.296711c-12.583822 0-22.755556 10.171733-22.755556 22.755556l0 204.8-45.511111 0-364.088889 0c-25.122133 0-45.511111-20.388978-45.511111-45.511111l0-659.911111c0-25.122133 20.388978-45.511111 45.511111-45.511111l568.888889 0c25.122133 0 45.511111 20.388978 45.511111 45.511111l0 455.111111 0 22.755556L659.888356 531.296711zM682.643911 750.273422l0-173.4656 159.288889 0 0 14.176711L682.643911 750.273422z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="layouts" unicode="&#58930;" d="M917.213-103.239h-810.426c-23.151 0-41.918 18.766-41.918 41.917l0 698.644c0 23.148 18.767 41.917 41.918 41.917h810.426c23.149 0 41.918-18.769 41.918-41.917v-698.643c0-23.151-18.769-41.918-41.918-41.918zM316.38-61.321h600.833v363.294h-600.833v-363.294zM106.787-61.321h167.674v363.294h-167.674v-363.294zM148.705 637.322c-23.151 0-41.918-18.769-41.918-41.92s18.767-41.92 41.918-41.92 41.92 18.768 41.92 41.92-18.769 41.92-41.92 41.92zM274.461 637.322c-23.151 0-41.918-18.769-41.918-41.92s18.767-41.92 41.918-41.92c23.151 0 41.92 18.768 41.92 41.92s-18.77 41.92-41.92 41.92zM400.216 637.322c-23.15 0-41.918-18.769-41.918-41.92s18.769-41.92 41.918-41.92c23.152 0 41.92 18.768 41.92 41.92s-18.768 41.92-41.92 41.92zM875.293 511.566h-768.506v-167.675h810.426l0 167.675h-41.921z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="rate-half" unicode="&#59081;" d="M1012.064 504l-359.552 31.008-140.512 331.04-140.512-331.552-359.552-30.496 273.024-236.544-82.016-351.552 309.056 186.528 309.056-186.528-81.504 351.552 272.544 236.544zM512 195.96799999999996l0 465.056 85.504-202.016 219.04-19.008-166.016-144.032 50.016-214.016-188.512 114.016z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="add-circle-fine" unicode="&#58888;" d="M509.989715-60.972421000000054c-246.734474 0-446.75195 200.023616-446.75195 446.75809 0 246.732427 200.017476 446.75195 446.75195 446.75195 246.733451 0 446.757067-200.019523 446.757067-446.75195C956.746782 139.051195 756.723166-60.972421000000054 509.989715-60.972421000000054L509.989715-60.972421000000054zM509.989715 812.433746c-235.633648 0-426.650123-191.014428-426.650123-426.648077 0-235.639788 191.016475-426.654216 426.650123-426.654216 235.638765 0 426.654216 191.014428 426.654216 426.654216C936.643931 621.419318 745.62848 812.433746 509.989715 812.433746L509.989715 812.433746zM527.863804 153.46957999999995l-35.741016 0L492.122789 367.909533 277.678742 367.909533 277.678742 403.653619l214.443024 0L492.121765 618.0956189999999l35.741016 0L527.862781 403.653619l214.442 0 0-35.744086L527.863804 367.909533 527.863804 153.46957999999995 527.863804 153.46957999999995zM527.863804 153.46957999999995"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="prev-circle" unicode="&#58931;" d="M508.638018 827.97307c-246.403458 0-446.845649-200.463469-446.845649-446.845649 0-246.382179 200.442191-446.845649 446.845649-446.845649 246.382179 0 446.845649 200.463469 446.845649 446.845649C955.483667 627.5096 755.041476 827.97307 508.638018 827.97307zM508.638018-23.16149900000005c-222.933422 0-404.28892 181.355498-404.28892 404.28892 0 222.933422 181.355498 404.28892 404.28892 404.28892 222.912144 0 404.28892-181.355498 404.28892-404.28892C912.926939 158.19399899999996 731.57144-23.16149900000005 508.638018-23.16149900000005zM252.87208 485.1999c8.639016 26.129831-32.470784 37.215859-41.067243 11.32009-27.810822-83.730363-22.321004-168.545923 14.086277-248.573851 11.362646-24.938243 48.025268-3.298146 36.747735 21.491148C230.976644 339.081373 228.806251 412.853462 252.87208 485.1999zM599.262572 247.73335499999996l-127.627629 133.394065 127.47868 133.223838c9.043305 9.064583 9.022026 23.789211-0.021278 32.832516-8.809243 8.830521-24.087108 8.766686-32.832516 0l-148.310199-148.310199c-4.617405-4.638683-6.979303-11.064749-6.553736-17.746156-0.404289-6.702685 1.936331-13.107472 6.575015-17.788712l148.310199-148.28892c4.383343-4.383343 10.213615-6.787798 16.405619-6.787798 6.170726 0 12.000997 2.404455 16.405619 6.787798C608.156928 224.114371 608.156928 238.83899899999994 599.262572 247.73335499999996z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="read" unicode="&#59141;" d="M335.282306 712.495464C399.587328 713.451107 442.778899 696.882717 470.183494 669.3706540000001 479.127332 660.39174 485.691302 650.857363 490.241971 641.442689 492.795622 636.159553 494.049041 632.438701 494.358795 631.0740940000001L493.723712 636.7409230000001 493.723706 196.90019600000005C493.723706 199.018106 495.816045 203.920655 503.591595 207.36436700000002 511.039185 210.66283299999998 515.68422 209.16527399999995 517.176538 207.906613L500.671543 188.33763 521.297207 203.50146800000005C514.140179 213.23636899999997 499.631258 225.71450900000002 476.134074 237.35914000000002 439.577969 255.475456 390.86048 266.10507900000005 328.491925 266.10508200000004 265.860796 266.10508200000004 219.424582 255.71817999999996 186.827162 237.741581 164.977332 225.69198700000004 152.538132 212.28117299999997 147.220271 201.30886999999996L170.257196 190.14374199999997 151.035786 207.05224299999998C152.884078 209.15336100000002 158.307299 211.80336599999998 167.849005 208.050434 177.092077 204.41496099999995 179.2 199.20011699999998 179.2 196.66445199999998L179.2 497.049743 179.2 636.7409230000001 175.817447 624.023021C177.078908 626.226721 180.088681 630.807811 184.828724 636.965629 192.95423 647.521524 202.792594 658.127492 214.297641 668.007961 247.526453 696.544681 287.381649 713.209056 334.514421 712.495571L335.282306 712.495464ZM335.289387 763.689705C274.661039 764.607483 223.081402 743.04085 180.940156 706.850184 156.32698 685.712527 139.975514 664.470237 131.382553 649.4588249999999L128 643.549699 128 636.7409230000001 128 497.049743 128 196.66445199999998C128 159.26104999999995 164.542545 144.88818300000003 189.478606 173.23524099999997L191.776657 175.84764199999995 193.294121 178.978613C194.07832 180.59664399999997 199.156367 186.07133399999998 211.552092 192.907243 236.030601 206.40648099999999 274.024879 214.905082 328.491925 214.905082 383.221547 214.905079 424.163878 205.97190999999998 453.399258 191.483569 469.376966 183.56540600000005 477.614626 176.48075300000005 480.045882 173.17379000000005L481.844905 170.72677999999996 484.166551 168.768644C511.279708 145.90070000000003 544.923706 160.801293 544.923706 196.90019600000005L544.923712 636.740922 544.288627 642.407751C540.427211 659.419023 529.175531 682.697124 506.45814 705.503602 468.987716 743.1209699999999 412.352271 764.846461 334.521502 763.689812L335.289387 763.689705ZM0 506.026694L0 27.856867999999963C0-8.875636999999983 34.793167-23.40043300000002 61.4635 1.2485080000000153L63.46242 3.315859000000046C65.301149 5.444836000000009 69.655573 9.862312999999972 76.498228 15.820363000000043 88.306297 26.101906999999983 102.566352 36.46294 119.251411 46.17438500000003 167.295691 74.13829099999998 224.90855 90.95018200000004 292.337329 90.95018200000004 358.378978 90.95018000000005 409.459345 71.66956600000003 448.125308 39.64774 461.506042 28.56627400000002 472.380655 16.734758000000056 480.912593 4.997000999999955 485.832384-1.7713730000000396 488.762874-6.741985999999997 489.872527-9.02252199999998 496.058545-21.73590200000001 511.379537-27.027375000000006 524.092917-20.84135500000002 536.806298-14.655337000000031 542.097771 0.6656550000000152 535.91175 13.379036000000042 527.471002 30.726293000000055 509.777717 55.06771800000001 480.782336 79.08069999999998 433.134118 118.54132300000003 370.586889 142.15017999999998 292.337329 142.15018199999997 215.474895 142.15018499999996 149.074727 122.77408400000002 93.495781 90.424668 59.761154 70.78961500000003 36.872315 50.859801999999945 24.713677 36.78188399999999L44.088049 20.048869999999965 26.712598 38.84923500000002C28.162783 40.189508000000046 32.877261 41.946117999999956 40.792576 38.64178100000004 49.035365 35.200736000000006 51.2 30.12989200000004 51.2 27.856867999999963L51.2 506.026694C51.2 520.165184 39.73849 531.626694 25.6 531.626694 11.46151 531.626694 0 520.165184 0 506.026694L0 506.026694ZM696.80221 763.689812C618.971441 764.846461 562.335996 743.1209699999999 524.86557 705.503602 502.148181 682.697124 490.896501 659.419023 487.035083 642.407751L486.4 636.740922 486.400004 196.90019600000005C486.400006 160.801293 520.044004 145.90070000000003 547.157161 168.768644L549.478807 170.72677999999996 551.27783 173.17379000000005C553.709086 176.48075300000005 561.946746 183.56540600000005 577.924452 191.483569 607.159834 205.97190999999998 648.102165 214.905079 702.831787 214.905082 757.298833 214.905082 795.293111 206.40648099999999 819.77162 192.907243 832.167345 186.07133399999998 837.245391 180.59664399999997 838.029591 178.978613L839.547055 175.84764199999995 841.845105 173.23524099999997C866.781167 144.88818300000003 903.323712 159.26104999999995 903.323712 196.66445199999998L903.323712 497.049743 903.323712 636.7409230000001 903.323712 643.549699 899.941158 649.4588249999999C891.348196 664.470237 874.996732 685.712527 850.383556 706.850184 808.24231 743.04085 756.662673 764.607483 696.034325 763.689705L696.80221 763.689812ZM696.809291 712.495571C743.942063 713.209056 783.797257 696.544681 817.026071 668.007961 828.531119 658.127492 838.369481 647.521524 846.494989 636.965629 851.235031 630.807811 854.244804 626.226721 855.506263 624.023021L852.123712 636.7409230000001 852.123712 497.049743 852.123712 196.66445199999998C852.123712 199.20011699999998 854.231635 204.41496099999995 863.474707 208.050434 873.016412 211.80336599999998 878.439633 209.15336100000002 880.287925 207.05224299999998L861.066515 190.14374199999997 884.103441 201.30886999999996C878.785579 212.28117299999997 866.346381 225.69198700000004 844.49655 237.741581 811.89913 255.71817999999996 765.462916 266.10508200000004 702.831785 266.10508200000004 640.463232 266.10507900000005 591.745741 255.475456 555.189638 237.35914000000002 531.692454 225.71450900000002 517.183533 213.23636899999997 510.026502 203.50146800000005L530.652166 188.33763 514.147172 207.906613C515.63949 209.16527399999995 520.284527 210.66283299999998 527.732117 207.36436700000002 535.507665 203.920655 537.600004 199.018106 537.600004 196.90019600000005L537.6 636.7409230000001 536.964917 631.0740940000001C537.274671 632.438701 538.52809 636.159553 541.081741 641.442689 545.63241 650.857363 552.196378 660.39174 561.140218 669.3706540000001 588.544813 696.882717 631.736384 713.451107 696.041406 712.495464L696.809291 712.495571ZM972.799998 506.026694L972.799998 27.856867999999963C972.799998 30.12989200000004 974.964631 35.200736000000006 983.207422 38.64178100000004 991.122737 41.946117999999956 995.837214 40.189508000000046 997.287401 38.84923500000002L979.911949 20.048869999999965 999.286321 36.78188399999999C987.127682 50.859801999999945 964.238844 70.78961500000003 930.504218 90.424668 874.925269 122.77408400000002 808.525103 142.15018499999996 731.662669 142.15018199999997 653.132708 142.15017999999998 590.55104 117.26282200000003 543.127755 75.73800100000005 514.370099 50.55719499999998 496.945662 25.10259599999995 488.705389 7.022771000000034 482.841769-5.842485000000011 488.517717-21.02524200000005 501.382974-26.888862000000017 514.248233-32.752481999999986 529.430987-27.07653300000004 535.294607-14.211275 536.420563-11.740835999999945 539.350332-6.450639000000024 544.25735 0.7178109999999833 552.731727 13.097653000000037 563.54464 25.561581000000047 576.856734 37.21792900000003 615.190044 70.78337499999998 665.901421 90.95018000000005 731.662669 90.95018200000004 799.091447 90.95018200000004 856.704307 74.13829099999998 904.748587 46.17438500000003 921.433645 36.46294 935.6937 26.101906999999983 947.501771 15.820363000000043 954.344425 9.862312999999972 958.698848 5.444836000000009 960.537577 3.315859000000046L962.536497 1.2485080000000153C989.206831-23.40043300000002 1023.999998-8.875636999999983 1023.999998 27.856867999999963L1023.999998 506.026694C1023.999998 520.165184 1012.538487 531.626694 998.399998 531.626694 984.261508 531.626694 972.799998 520.165184 972.799998 506.026694L972.799998 506.026694Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="404" unicode="&#58908;" d="M300.197309 299.705317l4.427931 1.803972c1.147982-2.787956 10.167841-7.543882 26.89558-14.267777l5.411915-12.955798c10.659833-24.927611 23.123639-62.483024 37.555413-112.66624 14.431775 5.575913 34.439462 0.983985 60.351057-13.611787l1.803972-4.427931L389.575913 107.828315l18.203716-42.639334c2.459962-5.575913-12.463805-15.579757-44.7713-29.847534-11.151826 7.215887-19.84369 9.675849-26.403587 7.05189l-0.983985 2.131967c-10.823831 25.419603-16.235746 42.311339-16.399744 50.675208l-4.427931-1.803972 6.3959-14.923767-11.151826-4.263933c-41.655349-16.235746-71.830878-18.695708-90.690583-7.871877l-4.427931-1.803972-1.803972 4.263933c-7.05189 16.727739 3.607944 77.406791 32.307495 182.037156 11.479821 4.427931 19.1877 14.923767 22.959641 31.323511C281.337604 290.685458 291.83344 296.425368 300.197309 299.705317L300.197309 299.705317zM216.230621 80.276746c28.371557 19.515695 40.999359 32.799488 38.047406 39.68738-0.983985 2.131967-0.65599 5.575913 0.65599 10.167841l-0.983985 2.131967c-25.5836-21.483664-38.047406-32.963485-37.391416-34.439462C215.246637 88.804612 215.082639 83.064702 216.230621 80.276746L216.230621 80.276746zM216.722614 72.896861l0.983985-2.131967c11.643818 1.147982 21.155669 3.279949 28.699552 6.231903 0.819987 0.327995 7.379885 5.411915 19.84369 15.251762l-0.983985 2.131967c-7.543882-2.951954-12.7918-0.983985-15.743754 6.067905C226.398463 85.032671 215.574632 75.848815 216.722614 72.896861L216.722614 72.896861zM225.90647 143.743754l11.151826 4.263933c-1.147982-2.623959-6.3959-8.691864-15.579757-18.53171-2.295964-10.823831-2.787956-17.547726-1.639974-20.335682 27.715567 20.663677 40.34337 33.783472 37.883408 39.523382l0.819987 10.331839-3.443946-3.935939-9.019859-3.443946-0.983985 2.131967c11.151826 4.263933 17.875721 16.891736 20.49968 37.719411l-0.983985 2.131967C239.35426 172.443306 227.21845 160.307495 227.874439 157.027546L225.90647 143.743754 225.90647 143.743754zM231.646381 173.42729l0.983985-2.131967 2.131967 0.819987c28.371557 23.123639 40.179372 40.179372 35.423447 51.331198 1.475977 0.65599 1.967969 1.639974 1.475977 2.951954l-2.295964-0.819987c-28.863549-21.647662-40.999359-38.047406-36.407431-49.035234C231.482383 175.723254 230.990391 174.73927 231.646381 173.42729L231.646381 173.42729zM240.994234 211.966688l0.983985-2.131967c13.775785 10.331839 35.915439 29.847534 66.418962 58.21909l2.131967 0.819987-6.3959 14.923767 0.491992 5.083921-2.295964-0.819987c-36.571429-32.963485-55.431134-51.82319-56.579116-56.743113L240.994234 211.966688 240.994234 211.966688zM311.67713 107.336323l-35.751441-13.939782c-1.475977-0.491992-6.887892-4.263933-16.235746-11.315823l0.819987-1.967969 12.299808 2.131967 20.007687 7.871877c11.643818 4.591928 32.143498 19.84369 61.171044 46.08328l-6.3959 14.923767-2.131967-0.819987c-24.107623-16.891736-34.439462-29.191544-31.159513-36.899423C315.449071 110.616272 314.629084 108.484305 311.67713 107.336323L311.67713 107.336323zM267.889814 264.773863l0.819987-1.967969c17.875721 16.891736 27.387572 25.419603 28.207559 25.747598l-0.983985 2.131967-8.855862-3.443946C274.941704 282.485586 268.545804 274.941704 267.889814 264.773863L267.889814 264.773863zM275.597694 222.954516c16.071749-37.883408 20.007687-67.894939 11.971813-90.034593l-3.443946-28.863549 26.89558 10.495836c-7.543882 30.011531-18.367713 65.598975-32.471493 106.926329l-0.983985 2.131967L275.597694 222.954516 275.597694 222.954516zM279.369635 231.810378l6.3959-14.923767c13.44779 15.087764 24.435618 24.271621 32.63549 27.55157l-3.607944 8.527867-2.459962 11.643818-2.131967-0.819987C289.045484 247.06214 278.713645 236.566304 279.369635 231.810378L279.369635 231.810378zM292.817425 194.58296c23.943626 17.219731 33.619475 30.995516 29.191544 41.491352l-2.787956 6.3959-2.295964-0.819987c-21.483664-18.859705-30.667521-31.651505-27.879564-38.3754L292.817425 194.58296 292.817425 194.58296zM294.457399 190.483024l2.787956-6.3959 2.295964-11.807816 2.295964 0.819987-0.491992-5.083921 6.3959-14.923767 32.471493 27.387572-6.3959 15.087764c-9.347854-10.331839-16.235746-16.399744-20.827675-18.203716l-2.295964-0.983985c-0.65599 1.639974 6.067905 10.167841 20.335682 25.419603l-3.115951 13.611787-0.983985 2.131967L294.457399 190.483024 294.457399 190.483024zM307.413197 148.171685l2.787956-6.3959 2.295964-11.643818c23.943626 17.219731 35.259449 27.387572 33.94747 30.503523l-5.411915 12.955798C329.224856 165.719411 318.07303 157.191544 307.413197 148.171685L307.413197 148.171685zM355.792441 131.935939c-23.779628-17.711723-34.111467-30.011531-30.995516-37.227418l1.475977-9.347854c25.255605 18.039718 36.899423 29.355541 34.931454 33.783472 24.435618 21.155669 38.703395 32.471493 42.803331 33.94747l-0.819987 1.967969c-1.803972 2.787956-6.723895 4.099936-14.595772 4.427931l-30.831518-31.9795L355.792441 131.935939 355.792441 131.935939zM327.912876 81.26073l4.591928-10.659833-0.491992-5.083921 2.295964 0.819987c23.451634 14.595772 34.275464 23.615631 32.63549 27.55157l-5.411915 12.955798L327.912876 81.26073 327.912876 81.26073zM333.816784 61.253043l5.411915-12.7918c25.747598 13.283792 37.719411 22.139654 35.915439 26.403587l-4.591928 10.659833C348.412556 70.272902 336.112748 62.237028 333.816784 61.253043L333.816784 61.253043zM357.596413 139.971813l1.803972-4.099936c4.919923 1.967969 8.527867 9.839846 10.823831 23.943626l-2.295964-0.819987C364.648302 147.679693 361.204356 141.44779 357.596413 139.971813L357.596413 139.971813zM731.674568 256.081999l3.935939-0.163997c-0.163997-2.459962 4.755926-9.019859 14.759769-19.515695l-0.65599-11.315823c-1.147982-21.975657-5.411915-53.955157-12.955798-95.774504 12.627803-0.65599 25.911595-10.659833 39.68738-30.175529l-0.163997-3.935939-47.887252-10.823831-1.967969-37.719411c-0.327995-4.919923-14.923767-7.379885-43.951313-7.379885-5.575913 9.019859-11.151826 13.775785-16.891736 13.939782l0.163997 1.967969c1.147982 22.467649 3.279949 36.735426 6.231903 42.967329l-3.935939 0.163997-0.65599-13.119795-9.839846 0.491992c-36.571429 1.803972-60.023062 9.839846-70.026906 24.271621l-3.935939 0.163997 0.163997 3.771941c0.819987 14.759769 30.667521 56.087124 89.706598 124.14606 10.167841-0.491992 19.515695 4.755926 28.371557 15.579757C714.290839 255.754004 724.294683 256.573991 731.674568 256.081999L731.674568 256.081999zM587.848815 115.86419l-0.163997-1.967969c9.019859-2.951954 16.891736-4.591928 23.615631-4.919923 0.65599 0 7.379885 1.475977 20.171685 4.755926l0.163997 1.967969c-6.723895 0.327995-9.839846 3.607944-9.511851 9.675849C599.328635 121.6041 588.012812 118.324151 587.848815 115.86419L587.848815 115.86419zM590.144779 121.440102c28.043562 5.083921 42.147341 10.659833 42.475336 16.727739 0.163997 1.803972 1.475977 4.263933 4.099936 7.215887l0.163997 1.967969c-26.731582-7.379885-40.015375-11.807816-40.179372-13.119795C592.440743 128.163997 590.308776 123.900064 590.144779 121.440102L590.144779 121.440102zM620.15631 165.227418l9.839846-0.491992c-1.803972-1.475977-7.871877-4.427931-18.367713-8.527867-5.575913-7.215887-8.527867-12.13581-8.527867-14.595772 28.043562 6.067905 42.147341 11.643818 42.311339 16.727739l4.263933 7.379885-3.935939-1.803972-8.035874 0.327995 0.163997 1.967969c9.839846-0.491992 19.351698 6.559898 28.863549 21.155669l0.163997 1.967969c-26.23959-7.379885-39.68738-12.463805-40.34337-14.923767L620.15631 165.227418 620.15631 165.227418zM670.667521 109.960282l-31.487508 1.475977c-1.31198 0-6.559898-0.983985-16.071749-2.951954l-0.163997-1.803972 9.839846-2.459962 17.711723-0.819987c10.331839-0.491992 30.995516 4.099936 61.991031 13.939782l0.65599 13.119795-1.803972 0.163997c-23.943626-4.591928-36.079436-10.167841-36.407431-16.891736C674.603459 110.944266 673.29148 109.796284 670.667521 109.960282L670.667521 109.960282zM635.244074 185.399103l-0.163997-1.967969 1.803972-0.163997c29.355541 7.70788 44.279308 16.563741 44.7713 26.23959 1.31198 0 2.131967 0.491992 2.131967 1.639974l-1.967969 0.163997c-29.191544-6.3959-44.115311-14.595772-44.607303-24.271621C635.900064 187.039078 635.244074 186.547085 635.244074 185.399103L635.244074 185.399103zM685.755285 207.37476c-1.803972-33.29148-9.675849-56.907111-23.615631-70.682896l-12.955798-20.171685 23.779628-1.147982c5.247918 24.763613 10.167841 54.611147 14.595772 89.870596l0.163997 1.967969L685.755285 207.37476 685.755285 207.37476zM656.071749 210.818706l-0.163997-1.967969c13.939782 3.115951 37.391416 10.167841 70.354901 21.155669l1.803972-0.163997 0.65599 13.119795 2.295964 3.607944-1.967969 0.163997c-39.03139-12.299808-59.859065-20.007687-62.483024-23.287636L656.071749 210.818706 656.071749 210.818706zM670.339526 68.46893l-0.65599-11.315823c23.943626 1.31198 35.915439 3.935939 36.079436 7.70788l0.491992 9.347854C684.443306 70.272902 672.471493 68.304933 670.339526 68.46893L670.339526 68.46893zM673.29148 85.196669l-0.491992-9.347854-2.295964-3.607944 1.967969-0.163997c22.631646 2.951954 33.94747 6.231903 34.111467 9.511851l0.65599 11.315823L673.29148 85.196669 673.29148 85.196669zM712.158873 113.568225c-23.943626-5.247918-36.079436-10.987828-36.407431-17.219731l-2.295964-7.379885c25.255605 5.083921 37.883408 9.511851 38.211403 13.44779 25.747598 7.543882 40.34337 11.151826 43.951313 10.987828l0.163997 1.803972c-0.327995 2.623959-3.443946 5.247918-9.347854 8.035874l-34.439462-13.44779L712.158873 113.568225 712.158873 113.568225zM682.147341 141.611787l-0.327995-5.73991-2.459962-9.347854c23.943626 4.755926 36.079436 8.691864 36.079436 11.479821l0.65599 11.315823C704.778988 147.351698 693.463165 144.727739 682.147341 141.611787L682.147341 141.611787zM688.051249 177.199231l-0.327995-5.73991-2.623959-9.511851 1.967969-0.163997-2.295964-3.607944-0.65599-13.119795 33.94747 9.511851 0.65599 13.283792c-10.659833-4.591928-18.039718-6.723895-21.975657-6.559898l-1.967969 0.163997c0 1.475977 8.199872 5.411915 24.271621 12.13581l2.623959 11.151826 0.163997 1.967969L688.051249 177.199231 688.051249 177.199231zM688.215247 180.807175c23.943626 4.755926 36.243434 11.807816 36.735426 20.991672l0.327995 5.73991-1.967969 0.163997c-22.631646-6.887892-34.275464-13.283792-34.603459-19.1877L688.215247 180.807175 688.215247 180.807175zM691.82319 212.786675l-0.65599-13.119795c15.415759 6.723895 26.89558 10.003844 34.111467 9.511851l0.327995 7.543882 2.459962 9.511851-1.803972 0.163997C704.450993 220.986547 692.971172 216.558616 691.82319 212.786675L691.82319 212.786675zM695.103139 240.994234l-0.163997-1.803972c19.351698 6.559898 29.355541 9.839846 30.339526 9.839846l0.163997 1.967969-7.871877 0.327995C706.746957 251.818065 699.367072 248.374119 695.103139 240.994234L695.103139 240.994234zM716.422806 118.980141l-0.163997-3.607944c4.427931-0.163997 10.003844 4.427931 16.727739 14.10378l-1.967969 0.163997C724.45868 122.26009 719.538757 118.816143 716.422806 118.980141L716.422806 118.980141zM479.118514 382.196028c53.627162 10.167841 89.870596 1.967969 109.222293-24.599616 9.675849-18.695708 15.579757-33.455477 17.875721-44.279308 11.807816-56.743113-5.903908-103.154388-53.299167-138.741832-12.463805-5.083921-22.631646-8.363869-30.339526-10.003844-31.651505-6.067905-63.631006 5.083921-95.938501 33.455477-9.347854 16.399744-15.251762 31.159513-18.039718 44.279308-13.283792 63.795003 1.967969 108.238309 45.919283 133.165919L479.118514 382.196028 479.118514 382.196028zM410.075593 265.429853c6.231903 5.247918 11.479821 8.199872 15.579757 9.019859-9.675849-9.347854-14.431775-15.087764-13.939782-17.219731-0.327995-5.411915-0.163997-10.167841 0.819987-14.267777l2.131967 0.327995c24.271621 15.743754 35.915439 25.5836 35.095452 29.519539l-2.131967 10.003844c-4.099936-3.607944-8.035874-5.73991-11.643818-6.559898l-0.819987 4.099936c10.823831 2.131967 15.251762 11.971813 13.44779 29.519539l-1.967969-0.327995c-22.467649-16.399744-34.603459-27.715567-36.407431-33.94747C409.255605 273.30173 409.255605 269.857783 410.075593 265.429853L410.075593 265.429853zM410.23959 286.257527c33.127482 21.647662 47.887252 40.34337 44.607303 56.251121-29.683536-23.615631-44.443306-36.079436-44.279308-37.555413C409.747598 295.769379 409.5836 289.537476 410.23959 286.257527L410.23959 286.257527zM412.699552 315.777066l0.491992-2.131967c27.059577 20.663677 44.607303 37.227418 52.643177 49.527226 10.331839 1.967969 17.055734 7.379885 20.49968 16.235746l-2.131967-0.491992C447.303011 372.028187 423.523382 350.872518 412.699552 315.777066L412.699552 315.777066zM414.339526 234.926329c2.459962-4.919923 4.263933-9.347854 5.083921-13.44779 18.859705 14.759769 30.339526 22.467649 34.111467 23.123639l-3.771941 18.039718C444.18706 261.493914 432.379244 252.310058 414.339526 234.926329L414.339526 234.926329zM421.883408 220.002562c2.131967-9.839846 5.247918-14.759769 9.675849-14.759769l27.879564 21.975657c-0.327995 1.147982-2.131967 6.231903-5.411915 15.415759C437.299167 228.530429 426.639334 220.986547 421.883408 220.002562L421.883408 220.002562zM432.707239 199.174888c5.083921-5.903908 8.527867-8.691864 10.495836-8.363869l3.935939 0.819987c10.987828 10.495836 19.1877 16.235746 24.599616 17.219731-0.819987 3.935939-3.935939 8.855862-9.511851 14.759769C442.21909 209.014734 432.379244 200.814862 432.707239 199.174888L432.707239 199.174888zM448.450993 185.563101l0.491992-2.131967c2.459962 0.491992 6.3959-0.819987 11.807816-3.771941 18.859705 10.003844 28.207559 16.727739 28.207559 19.84369-6.067905 1.639974-9.511851 4.427931-10.331839 8.363869C466.818706 202.946829 456.814862 195.566944 448.450993 185.563101L448.450993 185.563101zM469.442665 179.331198l0.491992-2.131967 14.923767 0.65599 12.627803 2.459962c2.459962 0.491992 8.199872 3.771941 17.547726 9.839846l-0.491992 2.131967c-6.887892-1.31198-13.611787 0.163997-20.49968 4.263933L469.442665 179.331198 469.442665 179.331198zM476.494555 249.030109l4.591928-21.811659c2.951954-14.431775 12.463805-25.091608 28.535554-31.9795l4.099936 0.819987c24.599616 34.275464 32.143498 73.798847 22.795644 118.570147l-2.459962 11.971813-6.231903 19.515695-6.067905-1.147982c-3.935939-0.819987-14.267777 0-30.831518 2.295964C473.870596 316.597053 469.278668 283.961563 476.494555 249.030109L476.494555 249.030109zM476.494555 363.172325l0.327995-1.967969c10.823831-2.131967 17.547726-3.115951 20.007687-2.623959 13.939782 10.167841 21.647662 17.875721 23.287636 23.287636l-21.319667-1.967969C496.174247 379.408072 488.630365 373.832159 476.494555 363.172325L476.494555 363.172325zM508.966047 363.172325l3.771941 2.787956c1.147982 0.163997 6.231903-2.951954 15.087764-9.675849 10.331839 13.119795 18.203716 20.171685 23.779628 21.155669-0.65599 2.951954-8.199872 4.263933-22.467649 4.099936C515.361947 370.716208 508.638053 364.648302 508.966047 363.172325L508.966047 363.172325zM511.590006 185.235106l0.491992-2.131967 4.099936 0.819987c19.84369 3.771941 35.751441 17.219731 47.723254 40.34337C554.557335 214.754644 537.173607 201.634849 511.590006 185.235106L511.590006 185.235106zM521.921845 197.534914c38.211403 24.271621 56.087124 42.311339 53.79116 53.79116 1.967969 4.919923 2.623959 8.527867 2.295964 10.823831-35.095452-26.567585-51.495195-44.935298-49.363229-54.939142C526.349776 206.71877 524.217809 203.602819 521.921845 197.534914L521.921845 197.534914zM528.64574 352.348495l7.543882-15.251762 2.131967 0.491992c4.263933 5.73991 13.283792 14.431775 27.059577 25.911595l-0.491992 2.131967c-5.411915 5.247918-8.363869 8.855862-8.855862 10.823831l-4.099936-0.819987L528.64574 352.348495 528.64574 352.348495zM536.845612 333.324792l4.263933-9.675849-0.491992-8.363869 4.099936 0.819987c19.515695 17.711723 29.027546 27.059577 28.863549 28.371557l-0.491992 2.131967c-1.967969 9.347854-4.263933 13.611787-7.05189 13.119795C548.817425 342.508648 539.141576 333.652787 536.845612 333.324792L536.845612 333.324792zM539.797566 236.402306c27.715567 19.84369 40.999359 32.63549 39.68738 38.703395 1.31198 7.215887 1.803972 12.13581 1.147982 14.759769l-1.967969-0.327995-35.095452-29.519539C540.78155 245.586163 539.469571 237.714286 539.797566 236.402306L539.797566 236.402306zM542.257527 307.413197l2.459962-11.971813 10.003844 3.935939c-7.05189-7.871877-10.331839-12.627803-10.003844-14.267777-0.65599-10.495836-0.819987-16.727739-0.327995-18.695708 18.695708 13.611787 30.831518 24.927611 36.243434 33.94747l-2.459962 11.971813c-7.05189-7.05189-12.7918-10.987828-16.727739-11.807816 8.035874 11.315823 13.939782 17.383728 17.711723 18.039718l-4.099936 19.84369C554.557335 320.532992 543.733504 310.201153 542.257527 307.413197L542.257527 307.413197zM307.249199 569.153107c-9.675849 0-17.711723-6.887892-19.84369-16.071749-4.263933-12.463805 1.639974-28.863549 29.519539-35.751441 1.31198 35.587444 0 49.527226 0 49.527226C313.809097 568.33312 310.693145 569.153107 307.249199 569.153107L307.249199 569.153107zM709.862908 537.173607c0-1.147982 0-2.131967-0.163997-3.115951 2.131967 3.279949 3.279949 7.215887 3.279949 11.479821 0 11.643818-9.183857 21.155669-20.49968 21.155669-3.443946 0-6.723895-0.819987-9.511851-2.459962C697.891095 563.905189 709.862908 551.933376 709.862908 537.173607L709.862908 537.173607zM531.761691 520.281871c0.65599 15.743754-32.963485 49.199231-32.963485 49.199231 0-18.203716 9.347854-42.803331 12.463805-48.707239-8.035874-11.643818-13.283792-32.307495-13.283792-32.307495S531.105701 504.374119 531.761691 520.281871L531.761691 520.281871zM488.794363 507.326073c2.459962 0 4.427931 1.967969 4.427931 4.427931 0 2.459962-1.967969 4.427931-4.427931 4.427931-2.459962 0-4.427931-1.967969-4.427931-4.427931C484.366432 509.294042 486.334401 507.326073 488.794363 507.326073L488.794363 507.326073zM445.335042 629.668161c-0.819987 8.855862-2.131967 16.235746-2.131967 16.235746s-53.627162 7.05189-63.959001-30.503523C395.151826 632.94811 427.623318 631.144138 445.335042 629.668161L445.335042 629.668161zM620.648302 614.908392c-9.675849 37.719411-63.303011 31.651505-63.303011 31.651505s-1.475977-7.379885-2.459962-16.235746C572.597053 631.636131 605.232543 632.784113 620.648302 614.908392L620.648302 614.908392zM419.587444 518.313901c29.847534 0 53.955157 21.975657 53.955157 49.035234 0 27.059577-24.271621 49.035234-53.955157 49.035234-29.847534 0-53.955157-21.975657-53.955157-49.035234C365.632287 540.289558 389.903908 518.313901 419.587444 518.313901L419.587444 518.313901zM419.587444 613.76041c28.371557 0 51.331198-20.827675 51.331198-46.411275 0-25.5836-22.959641-46.411275-51.331198-46.411275-28.207559 0-51.331198 20.827675-51.331198 46.411275C368.256246 592.932735 391.379885 613.76041 419.587444 613.76041L419.587444 613.76041zM419.587444 534.38565c20.007687 0 36.243434 14.759769 36.243434 32.799488 0 18.203716-16.235746 32.799488-36.243434 32.799488s-36.243434-14.759769-36.243434-32.799488C383.34401 549.14542 399.579757 534.38565 419.587444 534.38565L419.587444 534.38565zM435.331198 552.261371c1.967969 2.131967 4.919923 2.623959 6.559898 1.147982 1.639974-1.475977 1.475977-4.263933-0.491992-6.3959-1.967969-2.131967-4.919923-2.623959-6.559898-1.147982C433.035234 547.341448 433.199231 550.129404 435.331198 552.261371L435.331198 552.261371zM395.971813 585.880846c5.411915 5.73991 13.283792 7.05189 17.875721 3.115951 4.591928-3.935939 3.935939-11.807816-1.475977-17.547726-5.411915-5.73991-13.283792-7.05189-17.875721-3.115951C389.903908 572.433056 390.559898 580.304933 395.971813 585.880846L395.971813 585.880846zM584.240871 518.313901c29.847534 0 53.955157 21.975657 53.955157 49.035234 0 27.059577-24.271621 49.035234-53.955157 49.035234-29.847534 0-53.955157-21.975657-53.955157-49.035234C530.121717 540.289558 554.393338 518.313901 584.240871 518.313901L584.240871 518.313901zM584.240871 613.76041c28.371557 0 51.331198-20.827675 51.331198-46.411275 0-25.5836-22.959641-46.411275-51.331198-46.411275-28.207559 0-51.331198 20.827675-51.331198 46.411275C532.909673 592.932735 555.869315 613.76041 584.240871 613.76041L584.240871 613.76041zM584.240871 534.38565c20.007687 0 36.243434 14.759769 36.243434 32.799488 0 18.203716-16.235746 32.799488-36.243434 32.799488-20.007687 0-36.243434-14.759769-36.243434-32.799488C547.997438 549.14542 564.233184 534.38565 584.240871 534.38565L584.240871 534.38565zM599.820628 552.261371c1.967969 2.131967 4.919923 2.623959 6.559898 1.147982 1.639974-1.475977 1.475977-4.263933-0.491992-6.3959-1.967969-2.131967-4.919923-2.623959-6.559898-1.147982C597.688661 547.341448 597.852659 550.129404 599.820628 552.261371L599.820628 552.261371zM560.62524 585.880846c5.411915 5.73991 13.283792 7.05189 17.875721 3.115951 4.591928-3.935939 3.935939-11.807816-1.475977-17.547726-5.411915-5.73991-13.283792-7.05189-17.875721-3.115951C554.557335 572.433056 555.213325 580.304933 560.62524 585.880846L560.62524 585.880846zM957.171044 381.540038C957.171044 381.540038 957.171044 381.540038 957.171044 381.540038c-0.65599 0.983985-1.31198 1.803972-1.967969 2.951954-0.327995 0.327995-0.491992 0.65599-0.819987 0.983985-0.327995 0.327995-1.967969 0.65599-2.295964 0.983985-11.315823 14.759769-29.355541 40.34337-62.975016 46.247277l0 34.931454c0 4.263933-0.819987 8.691864-5.083921 8.691864L685.919283 476.330557c-0.163997 10.331839-0.327995 18.203716-0.65599 27.879564 24.435618 1.803972 43.295324 19.351698 43.295324 41.491352 0 22.467649-19.84369 40.671365-45.263293 41.819347-1.967969 78.226778-5.903908 143.98975-7.70788 150.549648l-0.491992 0.983985c-1.967969 2.295964-9.511851 5.247918-21.155669 8.363869 0.327995 13.939782-3.279949 29.355541-11.643818 46.08328 3.443946-21.647662-22.795644-36.079436-26.567585-38.047406-0.163997 0-0.327995 0-0.491992 0 0.163997 4.427931 0 57.727098-88.230621 97.90647-1.475977-44.115311-14.10378-70.682896-31.9795-86.754644L494.534273 766.606022l-5.411915-0.327995 0-0.163997 0 0 0 0 0.327995 0 0.327995-0.163997c-0.819987-0.163997-0.983985-0.491992-1.147982-1.147982-10.331839-8.035874-28.043562-18.203716-64.450993-18.203716-13.283792 0-28.207559 1.31198-44.607303 3.935939-4.099936 0.819987-7.70788 1.147982-11.151826 1.147982-5.575913 0-10.003844-0.983985-16.071749-2.295964l-0.327995 0-0.327995-0.163997c-17.547726-4.099936-27.55157-7.70788-30.011531-10.659833l-0.491992-0.983985c-0.491992-2.131967-2.295964-8.363869-5.73991-150.549648-25.255605-0.983985-45.263293-19.351698-45.263293-41.983344 0-22.139654 18.859705-39.523382 43.459321-41.163357-0.163997-9.675849-0.327995-17.547726-0.65599-27.879564L132.099936 476.002562c-4.427931 0-10.495836-4.591928-10.495836-8.691864l0-97.414478c-11.807816-0.65599-19.679693-2.295964-26.731582-4.755926-29.027546-10.495836-35.751441-35.915439-35.587444-60.023062 0-1.475977 0.491992-2.787956 0.983985-3.771941-6.723895-11.643818-6.231903-25.5836-5.083921-35.587444 0.983985-8.035874 2.623959-12.13581 4.427931-13.939782-4.263933-8.855862-0.983985-18.859705 1.967969-26.731582 3.771941-10.167841 12.13581-11.971813 22.139654-10.003844-4.755926-9.019859-2.459962-17.219731 11.643818-28.699552 4.427931-3.607944 14.267777 7.05189 26.075593 16.071749l0-267.151826c0-4.263933 6.067905-6.067905 10.331839-6.067905l751.928251 0c4.427931 0 5.083921 1.803972 5.083921 6.067905L888.784113 248.374119c16.727739 0.983985 29.355541 7.70788 38.539398 19.84369 4.591928 6.231903 7.871877 11.807816 8.691864 16.891736C977.670724 313.153107 982.262652 344.640615 957.171044 381.540038L957.171044 381.540038zM316.433056 508.638053c-22.959641 0.491992-40.835362 16.727739-40.835362 36.735426 0 20.335682 18.859705 36.899423 41.983344 36.899423l0 2.623959 0.163997-0.65599c0-0.819987 0-1.475977 0-2.295964 0.491992 0.163997 0.983985 0.163997 1.475977 0.327995l1.803972 0 0 0.491992c5.247918 1.31198 12.7918 2.951954 19.351698 3.771941 10.003844 35.095452 34.111467 64.122998 34.111467 64.122998s-9.839846 28.863549-13.939782 67.238949c51.167201-85.11467 229.268418-81.178732 280.107623-10.823831-4.591928-32.799488-12.627803-56.415119-12.627803-56.415119s24.107623-28.863549 34.111467-64.122998c6.559898-0.819987 13.939782-1.147982 19.023703-2.295964 0 0.491992 0 2.623959 0 2.623959l0.491992 0c23.123639 0 41.983344-18.695708 41.983344-39.03139 0-9.347854-3.935939-18.695708-10.495836-25.419603-10.167841-6.723895-25.091608-10.331839-40.835362-10.331839 0-6.723895 0.983985-19.351698 1.803972-35.423447L318.401025 476.658552c0.163997 10.331839 0.491992 19.84369 0.65599 30.175529l0 2.131967L316.433056 508.638053 316.433056 508.638053zM126.524023 462.554773c0 4.099936 6.3959 9.183857 10.823831 9.183857l741.432415 0c4.263933 0 5.575913-4.919923 5.575913-9.183857l0-29.027546c0 0.491992-6.723895 1.475977-10.823831 1.147982-22.795644-2.295964-44.443306-3.607944-60.679052-9.183857L176.215247 425.491352l-1.31198-2.787956 0-60.18706c-10.823831 5.903908-25.5836 8.363869-48.215247 7.871877L126.68802 462.554773 126.524023 462.554773zM821.381166-13.693786 180.807175-13.693786 180.807175 282.649584c10.823831 4.263933 15.579757 10.987828 15.087764 21.975657-0.491992 8.363869-4.263933 13.611787-15.087764 16.727739l0 7.379885c5.903908 1.967969 3.935939 4.263933 5.247918 6.723895 5.411915 10.495836 5.575913 18.203716-5.247918 23.779628l0 55.759129 615.318386 0c-2.787956-5.575913-4.755926-7.871877-5.575913-12.299808-1.475977-8.035874-1.639974-18.367713-1.147982-28.207559L697.891095 315.449071c0 0-28.371557-15.251762-16.727739-32.799488 11.643818-17.383728 32.307495-11.479821 50.511211-0.327995 12.13581 7.379885 39.68738 23.287636 63.959001 40.179372 0.163997-0.163997 0.327995-0.163997 0.491992-0.327995-1.803972-1.31198-2.951954-2.295964-2.951954-2.295964-11.151826-7.543882-6.887892-36.899423 15.415759-41.327354 3.115951-0.65599 9.675849 0 9.675849 1.147982l0-293.391416L821.381166-13.693786 821.381166-13.693786zM177.855221 271.169763c0 3.443946-2.131967 6.231903-4.755926 8.035874 1.639974 0.491992 3.771941 0.983985 4.755926 1.475977L177.855221 271.169763 177.855221 271.169763zM177.855221 322.828956c-0.983985 0.163997-1.639974 0.327995-2.459962 0.491992 0.819987 0.491992 1.475977 0.983985 2.459962 1.475977L177.855221 322.828956 177.855221 322.828956zM878.780269-65.516976 137.347854-65.516976c-4.263933 0-10.823831 2.131967-10.823831 6.3959L126.524023 206.882767c5.903908 1.147982 4.919923 2.295964 6.723895 3.279949 19.679693 8.035874 38.047406 25.255605 25.747598 33.127482-0.163997 0-1.475977 0.163997-1.639974 0.163997 9.511851 3.771941 17.547726 9.839846 17.547726 20.663677l0-289.29148 655.169763 2.459962 0 291.915439c9.839846-9.675849 21.647662-14.595772 34.603459-10.331839 3.279949-6.559898 13.611787-9.839846 19.515695-10.331839l0-307.495195C884.192184-63.38501 883.044202-65.516976 878.780269-65.516976L878.780269-65.516976zM878.780269-65.516976"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="carousel" unicode="&#58932;" d="M1002.069333 144.38400000000001L1002.069333 611.6906670000001c0 24.213333-16.917333 49.578667-42.069333 49.578667l-64 0 1.152 6.4c0 31.338667-26.005333 57.6-58.538667 57.6L186.432 725.269333c-31.936 0-58.410667-31.957333-58.410667-64l-0.213333 0.96L67.178667 662.229333c-25.152 0-45.226667-20.288-45.226667-44.501333l0-467.328L21.354667 150.39999999999998c0-24.789333 20.629333-44.693333 45.312-44.693333L127.786667 105.70666700000004l0-5.184C127.786667 69.03466700000001 153.792 42.66666699999996 186.432 42.66666699999996l652.842667 0c31.658667 0 56.277333 10.901333 56.725333 42.602667l64 0c24.661333 0 42.666667 34.325333 42.666667 59.114667L1002.069333 144.38400000000001zM128 149.26933299999996L64 149.26933299999996l0 469.333333 64 0L128 149.26933299999996zM853.333333 106.602667c0-6.421333-14.848-21.333333-21.333333-21.333333l-640 0c-6.485333 0-21.333333 14.848-21.333333 21.333333l0 554.666667c0 6.378667 9.258667 18.56 15.744 18.56l5.589333 2.773333 640 0c6.442667 0 21.333333-14.954667 21.333333-21.333333L853.333333 106.602667zM960 127.93600000000004l-64 0 0 490.666667 60.842667 1.984c4.970667 0 3.157333 2.944 3.157333-1.984l0-469.333333C960 144.29866700000002 965.013333 127.93600000000004 960 127.93600000000004zM412.458667 399.829333c43.925333 0 79.637333 34.773333 79.637333 77.482667 0 42.752-35.712 77.482667-79.637333 77.482667-43.925333 0-79.637333-34.730667-79.637333-77.482667C332.8 434.602667 368.533333 399.829333 412.458667 399.829333zM412.458667 516.0533330000001c21.952 0 39.829333-17.365333 39.829333-38.741333 0-21.333333-17.877333-38.741333-39.829333-38.741333-21.952 0-39.829333 17.408-39.829333 38.741333C372.629333 498.709333 390.506667 516.0533330000001 412.458667 516.0533330000001zM785.92 457.386667c-95.914667-23.338667-137.728-87.765333-168.256-134.805333-24.213333-37.269333-39.082667-58.346667-65.109333-58.346667l-0.042667 0c-35.456 0-57.109333 14.272-80.042667 28.16-24.362667 14.741333-49.536 29.952-88.64 29.952-75.648 0-156.906667-93.269333-165.930667-103.893333L213.333333 167.38133300000004c0-10.709333 8.917333-18.112 19.925333-18.112l557.504 0c10.986667 0 19.904 7.402667 19.904 18.112L810.666667 438.570667c0 5.973333-2.837333 11.626667-7.658667 15.296C798.186667 457.536 791.872 458.858667 785.92 457.386667zM770.858667 188.52266699999996L253.162667 188.52266699999996c24.874667 27.733333 85.290667 95.082667 130.666667 95.082667 27.733333 0 46.229333-11.157333 67.605333-24.128 25.152-15.168 53.632-32.426667 99.712-33.941333l2.944-0.064c47.637333 0 71.722667 37.12 97.237333 76.416 26.645333 41.088 56.469333 79.104 119.530667 102.485333L770.858667 188.52266699999996z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="help" unicode="&#58887;" d="M690.2 741.8C635.2 783.6 573.2 798 494.6 798c-59.6 0-110.6-12.2-151-39.4C284 718 256 649.8 256 542l153.6 0c0 28.8-2.8 59.8 14 86.4 16.8 26.6 40.2 47 80.4 47 40.8 0 61.8-11.8 81.6-36.2 16.8-20.8 23.2-45.6 23.2-72 0-22.8-11.6-43.8-25.4-62.8-7.6-11.2-17.6-21.2-30.2-30.8 0 0-83-49.4-112.2-96.2-21.8-34.8-29.6-78.4-31.4-130.6-0.2-3.8 1.2-11.6 14.4-11.6 13 0 112 0 123.6 0 11.6 0 14 8.8 14.2 12.4 0.8 19 3.2 48.2 6.6 59.2 6.6 20.8 19.4 39 39.4 54.6l41.4 28.6c37.4 29.2 67.2 53 80.4 71.8 22.6 30.8 38.4 68.8 38.4 113.8C768 649 741 703.2 690.2 741.8zM484 155.6c-51.8 1.6-94.6-34.4-96.4-90.6-1.6-56.4 39-93.4 91-95 54-1.6 95.8 33.2 97.4 89.4C577.6 115.6 538 154 484 155.6z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="code-circle" unicode="&#58933;" d="M513.544163 893.525741c-282.101629 0-510.78094-228.679311-510.78094-510.76288 0-282.083569 228.679311-510.76288 510.78094-510.76288s510.76288 228.679311 510.76288 510.76288C1024.325103 664.8464309999999 795.645793 893.525741 513.544163 893.525741zM513.544163-83.46335899999997c-257.503523 0-466.22622 208.740757-466.22622 466.22622S256.0587 848.989082 513.544163 848.989082s466.22622-208.740757 466.22622-466.22622S771.047686-83.46335899999997 513.544163-83.46335899999997zM171.771357 359.77212099999997L414.357086 256.088033 414.357086 300.805295 221.978945 380.50532599999997 414.357086 459.464886 414.357086 504.182148 171.771357 401.76228ZM442.585309 193.38272800000004L478.814238 193.38272800000004 584.737801 572.1429949999999 548.743656 572.1429949999999ZM612.749301 504.182148L612.749301 459.464886 804.874598 380.50532599999997 612.749301 300.805295 612.749301 256.088033 855.33503 359.77212099999997 855.33503 401.76228Z"  horiz-adv-x="1025" />
+
+    
+    <glyph glyph-name="windows" unicode="&#59007;" d="M437 329l0-325.5-341 47 0 278.5 341 0zm0 371.5l0-329.5-341 0 0 282.5zm491-371.5l0-393-453.5 62.5 0 330.5 453.5 0zm0 439l0-397-453.5 0 0 334.5z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="water" unicode="&#58934;" d="M862.315763 33.684211000000005C802.869868 33.684211000000005 754.526289 82.94399999999996 754.526289 143.50371900000005 754.526289 162.33094700000004 759.35885 180.96056099999998 768.520956 197.43438600000002 768.64671 197.79368399999998 768.808394 198.15298199999995 769.006008 198.49431600000003L849.075622 334.542596 849.057657 334.542596 862.315763 357.052632 875.573868 334.542596 875.573868 334.542596 955.140464 199.356632C955.715341 198.67396499999995 956.164464 197.865544 956.380043 196.96729800000003 965.380464 180.60126300000002 970.123201 162.151298 970.105236 143.50371900000005 970.105236 82.94399999999996 921.761657 33.684211000000005 862.315763 33.684211000000005L862.315763 33.684211000000005ZM924.33064 188.57768399999998C924.204885 188.79326300000002 924.115061 189.02680699999996 924.025236 189.27831600000002L862.315763 302.996211 800.606289 189.260351C800.516464 189.02680699999996 800.42664 188.79326300000002 800.300885 188.57768399999998 793.977236 176.505263 790.635763 162.81600000000003 790.635763 148.965053 790.635763 105.29235100000005 822.792956 69.75775399999998 862.333727 69.75775399999998 901.856534 69.75775399999998 933.995763 105.29235100000005 933.995763 148.98301800000002 933.995763 162.81600000000003 930.654289 176.52322800000002 924.33064 188.57768399999998L924.33064 188.57768399999998ZM682.684605 392.982456C593.50678 392.982456 520.982429 469.602807 520.982429 563.8108070000001 520.982429 593.093614 528.240254 622.071018 541.965447 647.706947 542.163061 648.281825 542.396605 648.820772 542.684043 649.341754L662.815412 860.968421 662.797447 860.968421 682.684605 896 702.571763 860.968421 702.535833 860.968421 821.89471 650.689123C822.774991 649.647158 823.439692 648.3716489999999 823.781026 646.970386 837.25471 621.514105 844.368815 592.8241399999999 844.35085 563.8108070000001 844.35085 469.602807 771.844464 392.982456 682.684605 392.982456L682.684605 392.982456ZM791.408254 630.1192980000001C791.21064 630.4965609999999 791.030991 630.891789 790.887271 631.322947L682.684605 823.924772 574.446008 631.287018C574.320254 630.891789 574.140605 630.4965609999999 573.942991 630.1013330000001 562.840675 609.6931930000001 556.912254 596.075789 556.912254 572.631579 556.912254 498.634105 613.375973 428.876351 682.684605 428.876351 751.993236 428.876351 808.367131 489.058807 808.367131 563.056281 808.367131 586.500491 802.492605 609.6931930000001 791.408254 630.1192980000001L791.408254 630.1192980000001ZM538.695833 276.983018C540.115061 275.330246 541.174991 273.33614 541.713938 271.12645599999996 563.433517 231.11859600000003 574.895131 186.02666699999997 574.895131 140.43171900000004 574.895131-7.581192999999985 458.051341-128 314.403903-128 170.738499-128 53.89471-7.581192999999985 53.89471 140.43171900000004 53.89471 186.47578899999996 65.589868 231.998877 87.704675 272.294175 88.010078 273.17445599999996 88.387341 274.01880700000004 88.872394 274.863158L282.408394 607.411649 282.372464 607.411649 314.403903 662.45614 346.453306 607.411649 346.399412 607.411649 538.695833 276.983018 538.695833 276.983018ZM314.403903 590.614456L119.807973 257.79649099999995C119.556464 257.113825 119.251061 256.449123 118.873798 255.78442099999995 98.932745 220.48336800000004 88.387341 180.42161399999998 88.387341 139.91073700000004 88.387341 12.072420999999963 189.799271-91.89052600000002 314.421868-91.89052600000002 439.026499-91.89052600000002 540.420464 12.072420999999963 540.402499 139.91073700000004 540.402499 180.42161399999998 529.857096 220.50133300000005 509.916043 255.78442099999995 509.53878 256.449123 509.233377 257.131789 508.963903 257.86835099999996L314.403903 590.614456 314.403903 590.614456Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="username" unicode="&#58991;" d="M514.594 824.888c-144.11 0-260.979-118.46-260.979-264.558 0-88.783 43.497-166.928 109.711-214.898-135.361-59.354-230.159-195.858-230.159-354.931h0.894c1.541-21.375 18.641-38.377 40.117-38.377s38.575 17.051 40.117 38.377h0.645c0 0.944-0.099 1.79-0.099 2.734 0 0.05 0 0.099 0 0.149 0 0.099-0.05 0.149-0.05 0.199 0.05 159.967 120 291.054 273.009 304.924 8.948-0.944 17.598-2.734 26.844-2.734 144.11 0 260.979 118.46 260.979 264.558s-116.919 264.558-261.029 264.558zM514.594 377.54499999999996c-99.769 0-180.698 81.972-180.698 183.183s80.879 183.183 180.698 183.183c99.719 0 180.647-81.972 180.647-183.183s-80.879-183.183-180.647-183.183zM896.021-6.615000000000009c0 0.348-0.199 0.645-0.199 0.994-1.043 105.038-43.397 200.034-111.35 269.131v0c-7.157 7.357-17.001 11.98-27.986 11.98-21.574 0-39.122-17.747-39.122-39.668 0-11.135 4.573-21.127 11.83-28.334l-0.099-0.05c52.742-55.229 85.302-130.589 85.302-213.853 0-1.043-0.149-1.987-0.149-3.034h0.994c1.491-21.375 18.691-38.377 40.117-38.377 21.475 0 38.575 17.051 40.117 38.377h0.597c0 0.796-0.099 1.491-0.099 2.287-0.05 0.149 0.05 0.348 0.05 0.547z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="find-fill" unicode="&#58992;" d="M512 896C229.236364 896 0 666.763636 0 384c0-282.786909 229.236364-512 512-512s512 229.213091 512 512C1024 666.763636 794.763636 896 512 896zM657.291636 383.976727c0-77.195636-60.392727-139.729455-136.424727-144.407273l-175.732364-151.714909-22.877091 13.242182 58.228364 222.021818c-8.634182 18.548364-13.800727 39.074909-13.800727 60.858182 0 77.195636 60.369455 139.729455 136.378182 144.430545l175.802182 151.714909 22.877091-13.172364-58.251636-222.068364C652.125091 426.309818 657.291636 405.806545 657.291636 383.976727zM512 384m-66.048 0a2.838 2.838 0 1 1 132.096 0 2.838 2.838 0 1 1-132.096 0Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="about" unicode="&#58891;" d="M514.27174 834.607768c-249.516844 0-451.789687-202.272843-451.789687-451.789687s202.272843-451.789687 451.789687-451.789687 451.789687 202.272843 451.789687 451.789687S763.788583 834.607768 514.27174 834.607768zM514.27174-20.12919999999997c-222.541469 0-402.947282 180.405813-402.947282 402.947282s180.405813 402.947282 402.947282 402.947282 402.947282-180.405813 402.947282-402.947282S736.814232-20.12919999999997 514.27174-20.12919999999997zM514.295276 593.979362c-9.44614-10.360975-14.307867-22.951735-14.307867-37.483706 0-11.960403 3.886517-22.396079 11.534707-30.457686 7.783267-8.211009 17.853623-12.450567 29.313629-12.450567 9.312086 0 23.139 2.849908 35.782971 16.900925 9.865695 10.641361 14.866592 23.437805 14.866592 37.693484 0 11.68104-4.031826 21.900799-11.744485 29.832446C562.925856 615.325529 532.358677 613.449809 514.295276 593.979362zM549.461193 293.282882c-12.110829-11.541871-20.589944-18.759249-26.236548-23.316032 2.77009 14.953573 9.976212 44.614104 27.330462 103.023398 17.297968 57.890478 18.799158 67.991534 18.799158 72.955592 0 8.65717-3.63683 16.335037-9.921977 21.642926-14.124695 11.661597-39.035038 9.349949-69.131497-7.677866-16.779152-9.408277-34.595936-24.759917-54.493102-46.576805l-10.377348-11.541871 34.425044-26.548656 8.818853 8.715499c9.573029 9.292644 16.086373 15.35164 20.411889 19.393699-26.294876-86.460164-39.093367-140.190903-39.093367-164.262134 0-10.907421 3.172249-19.970844 9.573029-26.839275 6.460132-7.039323 15.510252-10.736529 25.891693-10.736529 10.146081 0 21.792329 3.926426 35.922141 11.949146 12.741185 7.212262 31.883151 23.029506 58.641585 48.190559l10.837836 10.391674-31.30703 30.475082L549.461193 293.282882z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="location" unicode="&#59157;" d="M451.673935-98.39569900000004C478.883834-129.01914699999998 524.254807-128.8089789999999 551.400292-97.92885100000001 553.755808-95.38790800000004 558.821323-89.79676199999994 565.872444-81.84834999999998 577.572838-68.65901699999995 590.597131-53.62432000000001 604.615947-36.99831500000005 644.662065 10.495494000000008 684.708678 61.282182000000034 722.129538 113.35355300000003 759.658524 165.575381 792.492213 216.29072599999995 819.314991 264.54153799999995 868.685946 353.35368300000005 896 430.456574 896 493.714285 896 715.890551 719.301715 896 501.333333 896 283.364952 896 106.666667 715.890551 106.666667 493.714285 106.666667 430.401284 134.05152 353.19426999999996 183.54613 264.23737800000004 210.371803 216.02347099999997 243.193308 165.34812399999998 280.699364 113.16684599999996 318.155192 61.05544999999995 358.239268 10.22578999999996 398.322835-37.31103099999996 412.354743-53.95207300000004 425.391185-69.00072999999998 437.102468-82.20257900000001 444.160087-90.15846599999998 449.230214-95.75492099999997 451.982775-98.73670600000003L451.673935-98.39569900000004ZM486.822684-65.32134799999994C484.281231-62.568254000000024 479.425084-57.207989 472.585916-49.49835900000005 461.135889-36.591016999999965 448.364015-21.84776099999999 434.602351-5.527214999999956 395.275714 41.11192700000004 355.949587 90.98045200000001 319.289224 141.985137 282.808749 192.739548 250.983685 241.87642200000005 225.158316 288.29247799999996 179.388826 370.55419500000005 154.50505 440.709839 154.50505 493.714285 154.50505 688.960095 309.785362 847.238095 501.333333 847.238095 692.881306 847.238095 848.161617 688.960095 848.161617 493.714285 848.161617 440.753978 823.345286 370.701737 777.693969 288.58074899999997 751.873483 242.13293399999998 720.038415 192.96007499999996 683.537446 142.16873799999996 646.912604 91.20503299999996 607.624538 41.38032599999997 568.335977-5.21503800000005 554.587654-21.52024300000005 541.828177-36.24924999999996 530.389289-49.14379699999995 523.556841-56.84571100000005 518.705521-62.20043499999997 516.166694-64.95052599999997 507.543772-74.74891100000002 495.255793-74.80583000000001 487.131524-65.66235300000005L486.822684-65.32134799999994ZM714.955981 428.971194C723.919106 453.372045 728.565658 479.331002 728.565658 505.904762 728.565658 627.091817 632.184774 725.333333 513.29293 725.333333 394.401086 725.333333 298.020202 627.091817 298.020202 505.904762 298.020202 384.717709 394.401086 286.47619 513.29293 286.47619 549.003859 286.47619 583.510052 295.36805300000003 614.373097 312.125591 626.032316 318.456132 630.449257 333.22218 624.238611 345.10648100000003 618.027966 356.99078199999997 603.541579 361.49299399999995 591.882359 355.16245100000003 567.900883 342.14136099999996 541.111735 335.23809500000004 513.29293 335.23809500000004 420.821495 335.23809500000004 345.858586 411.648164 345.858586 505.904762 345.858586 600.161359 420.821495 676.571428 513.29293 676.571428 605.764365 676.571428 680.727273 600.161359 680.727273 505.904762 680.727273 485.192019 677.117041 465.022684 670.154965 446.069408 665.522846 433.459117 671.796821 419.408892 684.168282 414.687349 696.53974 409.965809 710.323861 416.360905 714.955981 428.971194L714.955981 428.971194Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="up" unicode="&#58905;" d="M513.6 539.2l384-384c12.8-12.8 32-12.8 44.8 0 12.801 12.8 12.801 32 0 44.8l-403.2 403.2C532.8 609.6 520 616 513.6 616c-6.4 0-19.2 0-25.599-6.4L78.399 200c-12.8-12.8-12.8-32 0-44.8s32-12.8 44.8 0L513.6 539.2z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="pause" unicode="&#58961;" d="M512-128c-282.714 0-511.893 229.232-511.893 512 0 282.768 229.179 512 511.893 512 282.714 0 511.893-229.232 511.893-512 0-282.768-229.179-512-511.893-512zM512 863.996c-265.043 0-479.9-214.91-479.9-479.996 0-265.097 214.857-479.996 479.9-479.996 265.043 0 479.9 214.899 479.9 479.996 0 265.086-214.857 479.996-479.9 479.996zM639.973 181.32299999999998h-21.329c-23.558 0-42.658 19.1-42.658 42.658v319.933c0 23.558 19.1 42.658 42.658 42.658h21.329c23.558 0 42.658-19.1 42.658-42.658v-319.933c0-23.558-19.1-42.658-42.658-42.658zM405.356 181.32299999999998h-21.329c-23.558 0-42.658 19.1-42.658 42.658v319.933c0 23.558 19.1 42.658 42.658 42.658h21.329c23.558 0 42.658-19.1 42.658-42.658v-319.933c0-23.558-19.1-42.658-42.658-42.658z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="date" unicode="&#58935;" d="M933.185668 758.3591759999999l-167.054737 0 0 56.506968L732.333174 814.866145l0-56.506968L539.505447 758.3591759999999l0 56.506968-33.796734 0 0-56.506968-216.255299 0 0 56.506968-33.796734 0 0-56.506968L88.005356 758.3591759999999c-12.255115 0-22.224164-9.970072-22.224164-22.224164l0-706.60521c0-12.255115 9.970072-22.225187 22.224164-22.225187l845.179288 0c12.255115 0 22.225187 9.970072 22.225187 22.225187L955.409832 736.135012C955.409832 748.389104 945.43976 758.3591759999999 933.185668 758.3591759999999zM939.036933 29.528778999999986c0-3.226484-2.62478-5.852288-5.852288-5.852288l-845.179288 0c-3.226484 0-5.851265 2.62478-5.851265 5.852288L82.154092 736.135012c0 3.226484 2.62478 5.851265 5.851265 5.851265l167.650301 0 0-55.657624 33.796734 0 0 55.657624 216.255299 0 0-55.657624 33.796734 0 0 55.657624L732.333174 741.986277l0-55.657624 33.796734 0 0 55.657624 167.054737 0c3.226484 0 5.852288-2.62478 5.852288-5.851265L939.036933 29.528778999999986zM206.835765 608.260623l129.098263 0 0-94.008071-129.098263 0 0 94.008071ZM458.879152 608.260623l129.098263 0 0-94.008071-129.098263 0 0 94.008071ZM684.827207 608.260623l129.098263 0 0-94.008071-129.098263 0 0 94.008071ZM206.835765 433.345871l129.098263 0 0-94.008071-129.098263 0 0 94.008071ZM458.879152 433.345871l129.098263 0 0-94.008071-129.098263 0 0 94.008071ZM684.827207 433.345871l129.098263 0 0-94.008071-129.098263 0 0 94.008071ZM206.835765 257.877511l129.098263 0 0-94.008071-129.098263 0 0 94.008071ZM458.879152 257.877511l129.098263 0 0-94.008071-129.098263 0 0 94.008071ZM684.827207 257.877511l129.098263 0 0-94.008071-129.098263 0 0 94.008071Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="layim-uploadfile" unicode="&#58909;" d="M914.7359263333336 663.0359498888887c-20.806884999999987 20.806885000000012-48.471967999999976 32.265868000000026-77.89816099999994 32.265868000000054l-352.221993 2.2737367544323206e-13-120.26099099999992 95.03035300000005-11.157106999999995 8.816806000000007-14.220886 9.769962616701378e-15L197.09333633333344 799.148976888889c-51.69538300000001 2.1316282072803006e-14-93.75224400000005-42.88778599999995-93.75224400000006-95.60442799999993l-1.5631940186722204e-13-255.13888799999998c-1.7763568394002505e-15-2.302439 0.08391099999999785-4.716417999999999 0.24968699999999489-7.196911999999999l-1.9895196601282805e-13-340.692403c-1.9539925233402755e-14-29.426192999999998 11.458982999999954-57.09127599999999 32.26586799999994-77.89816100000002 20.806884999999987-20.806885000000012 48.471967999999976-32.265868000000026 77.89816099999994-32.265868000000054l623.083981-3.410605131648481e-13c29.426192999999998-1.9539925233402755e-14 57.09127599999999 11.458982999999954 77.89816100000002 32.26586799999994 20.806885000000012 20.806884999999987 32.265868000000026 48.471967999999976 32.265868000000054 77.89816099999994L947.0028173333335 585.1377888888885C947.0017943333336 614.5639818888885 935.5428113333334 642.2280418888886 914.7359263333336 663.0359498888887zM197.09333633333372 758.2167298888891l141.88345099999998-8.526512829121202e-14L470.3948853333333 654.369569888889l366.44287999999995-2.2737367544323206e-13c38.236859-2.1316282072803006e-14 69.23178099999997-30.99492100000004 69.23178099999994-69.23178100000004L906.0695463333333 465.9195468888886 144.27334033333327 465.91954688888893 144.2733403333336 703.5445488888892C144.2733403333336 733.7361748888891 167.92296933333355 758.2167298888891 197.09333633333372 758.2167298888891zM836.8377653333331 31.28558888888881L213.75480733333322 31.28558888888915c-38.236859 2.1316282072803006e-14-69.23178099999997 30.99492100000004-69.23178099999994 69.23178100000004L144.52302633333338 424.4776928888892l761.546519-6.252776074688882e-13-2.2737367544323206e-13-323.96134599999993C906.0695463333333 62.28050988888867 875.0746243333334 31.285588888888583 836.8377653333331 31.28558888888881z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="delete" unicode="&#58944;" d="M738.923 24.288h-451.956c-27.2 0-49.327 21.603-49.327 48.157v418.017c0 26.548 22.129 48.147 49.327 48.147h451.956c27.2 0 49.327-21.598 49.327-48.147v-418.017c0-26.555-22.129-48.157-49.327-48.157zM286.966 494.547c-4.447 0-7.168-2.644-7.168-4.084v-418.017c0-1.443 2.722-4.093 7.168-4.093h451.956c4.448 0 7.168 2.651 7.168 4.093v418.017c0 1.44-2.722 4.084-7.168 4.084h-451.956zM832.199 496.302h-640.401c-27.201 0-49.327 20.131-49.327 44.876v61.045c0 24.74 22.128 44.867 49.327 44.867h640.401c27.2 0 49.327-20.127 49.327-44.867v-61.045c0-24.744-22.129-44.876-49.327-44.876zM184.631 541.327c0.387-0.733 2.722-2.866 7.168-2.866h640.401c4.445 0 6.782 2.132 7.168 2.867v60.741c-0.393 0.736-2.733 2.863-7.168 2.863h-640.401c-4.437 0-6.776-2.128-7.168-2.863v-60.742zM600.748 605.354h-174.546c-27.201 0-49.327 20.13-49.327 44.876v10.736c0 24.74 22.128 44.867 49.327 44.867h174.546c27.2 0 49.327-20.126 49.327-44.867v-10.736c0-24.745-22.128-44.876-49.327-44.876zM419.034 650.378c0.387-0.733 2.722-2.865 7.168-2.865h174.546c4.446 0 6.782 2.131 7.168 2.865v10.432c-0.393 0.736-2.734 2.862-7.168 2.862h-174.546c-4.437 0-6.776-2.126-7.168-2.862v-10.432zM404.099 430.833h-30.097c-7.297 0-13.213-5.916-13.213-13.213v-272.34c0-7.297 5.916-13.212 13.213-13.212h30.098c7.297 0 13.212 5.916 13.212 13.212v272.341c0 7.297-5.916 13.213-13.212 13.213zM659.583 430.833h-30.097c-7.298 0-13.213-5.916-13.213-13.213v-272.34c0-7.297 5.917-13.212 13.213-13.212h30.097c7.297 0 13.212 5.916 13.212 13.212v272.341c0 7.297-5.916 13.213-13.212 13.213zM531.841 430.833h-30.098c-7.297 0-13.213-5.916-13.213-13.213v-272.34c0-7.297 5.917-13.212 13.213-13.212h30.098c7.297 0 13.212 5.916 13.212 13.212v272.341c0 7.297-5.916 13.213-13.212 13.213z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="play" unicode="&#58962;" d="M512 896C229.376 896 0 666.624 0 384 0 101.37599999999998 229.376-128 512-128 794.624-128 1024 101.37599999999998 1024 384 1024 666.624 794.624 896 512 896L512 896 512 896zM512-95.23199999999997C245.76-95.23199999999997 32.768 117.75999999999999 32.768 384 32.768 650.24 245.76 863.232 512 863.232S991.232 650.24 991.232 384C991.232 117.75999999999999 778.24-95.23199999999997 512-95.23199999999997L512-95.23199999999997 512-95.23199999999997zM733.184 392.192L393.216 588.8c-4.096 4.096-8.192 4.096-12.288 0C376.832 588.8 372.736 584.704 372.736 580.608l0-393.216c0-4.096 4.096-8.192 4.096-8.192 4.096-4.096 8.192-4.096 12.288 0l344.064 196.608c4.096 4.096 4.096 4.096 4.096 8.192C741.376 388.096 737.28 392.192 733.184 392.192L733.184 392.192 733.184 392.192zM733.184 392.192"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="top" unicode="&#58884;" d="M812 153.4l-300 172.8-300-172.8 300 604L812 153.4zM264.5 209.2l247.5 142.5 247.5-142.5L512 707.5 264.5 209.2zM371.7 138.3l0-126.2-15.9 0 0 126.2-45.9 0L309.9 153l107.4 0 0-14.8L371.7 138.2zM506.6 154.5c26.6 0 43.3-3.9 50-11.7 6.7-7.8 10-27.2 10-58.3 0-33.5-3.2-54.2-9.6-62-6.4-7.8-23.2-11.8-50.4-11.8-27 0-43.8 3.9-50.3 11.7-6.5 7.8-9.8 27.9-9.8 60.3l0 9.9 0.2 13.3c0 18.7 4.2 31.5 12.6 38.4C467.8 151 483.5 154.5 506.6 154.5zM506.5 141c-22.3 0-35.3-2.5-39.1-7.4-3.8-5-5.7-22-5.7-51 0-29.1 1.9-46.1 5.7-51.1 3.8-5 16.8-7.4 39.1-7.4 22.4 0 35.4 2.5 39.2 7.4 3.8 5 5.7 22 5.7 51.1l0 9.2-0.1 13.3c0 15.6-2.6 25.4-7.8 29.6S525.9 141 506.5 141zM608.4 12.1 608.4 153l59.2 0 5.4 0c15.9 0 26.7-3.1 32.5-9.2 5.8-6.1 8.7-17.6 8.7-34.4 0-16.1-3-27.1-9-32.9-6-5.9-17.3-8.8-33.9-8.8l-6.2-0.1-40.7 0 0-55.5L608.4 12.1zM624.3 81.1l37.7 0c15.8 0 25.9 1.6 30.3 4.9 4.4 3.2 6.7 10.7 6.7 22.3 0 13.6-1.5 22.2-4.5 25.9-3 3.6-10.1 5.4-21.3 5.4l-6.1 0.1-42.7 0L624.4 81.1z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="firefox" unicode="&#59014;" d="M516.010667-128q-161.706667 0-288.277333 85.994667t-188.288 227.712q-33.152 74.858667-38.293333 172.010667t14.848 189.994667 63.424 178.282667 102.293333 138.581333l-6.293333-160.576q6.293333 8 38.848 8.853333t40-8.853333q24 46.293333 91.712 78.848t133.994667 33.706667q-30.848-25.706667-68.288-84.864t-33.429333-93.418667q14.293333-4.565333 35.712-7.722667t36.010667-4.288 38.848-2.282667 28.864-1.706667q8.576-2.858667 5.418667-26.005333t-17.429333-43.136q-2.858667-4.010667-9.429333-10.581333t-32.277333-20.288-57.706667-19.434667l8.576-108.010667-79.424 38.293333q-10.282667-24.576-4.288-46.570667t20.565333-37.994667 37.418667-23.722667 46.293333-3.712q29.141333 5.141333 56 19.712t47.722667 25.706667 42.005333 10.005333q34.858667-2.282667 51.136-18.858667t11.136-37.141333q-0.576-1.152-1.429333-3.136t-4.864-7.146667-10.282667-8.853333-18.005333-5.994667-26.581333-0.576q-34.282667-54.293333-82.581333-77.418667t-119.722667-16.853333q42.282667-34.858667 92.864-47.146667t96.277333-3.434667 88.277333 29.717333 73.152 50.005333 45.994667 59.434667q24.576 52.010667 22.293333 109.994667t-21.418667 107.712-44.864 71.424q49.706667-21.717333 78.293333-45.418667t44.010667-64.277333q8.576 97.152-32.853333 196.010667t-119.722667 162.282667q151.424-44.010667 235.434667-159.722667t86.293333-295.722667q1.152-72.576-23.146667-145.706667t-70.570667-136-108.010667-112-141.418667-77.418667-164.864-28.288z"  horiz-adv-x="1025" />
+
+    
+    <glyph glyph-name="friends" unicode="&#58898;" d="M672.02974 765.933689c7.66047-32.266891 8.420787-62.237483 7.713682-95.365998-0.283456-12.778024-7.291057-71.832002-5.3918-89.926102 1.561565-14.936177 5.132904-16.128329 10.759041-28.436656 9.803273-21.422915 6.51846-50.970882 2.76088-72.566736-2.056845-11.816117-6.404873-28.64541-13.017478-38.287001-7.291057-10.645454-21.864984-10.711969-28.319999-23.12365-9.29469-17.848507-4.045129-42.930765-9.903557-62.21497-6.65763-21.883403-23.599488-23.420409-24.877597-52.040237 8.316409-1.243317 16.59598-2.479471 24.877597-3.722788 8.316409-18.498306 23.533996-55.70265 39.08518-66.900689 13.024641-3.728928 26.048259-7.448646 39.07904-11.156084 45.641503-19.593244 96.365768-43.032072 142.108578-63.215764 41.656749-18.381649 91.51325-24.937972 106.575294-70.629617 0-31.026644 2.795673-104.309694 2.025123-144.978952L58.155515-56.631556000000046c-0.757247 40.669258 2.029216 113.952308 2.029216 144.978952 15.065114 45.691645 64.928778 52.247968 106.578364 70.629617 45.74281 20.182668 96.467075 43.62252 142.098345 63.215764 13.027711 3.707438 26.054399 7.427156 39.08211 11.156084 15.554254 11.197016 30.78105 48.402383 39.09439 66.900689l18.492166 4.710278c-4.196579 24.429389-18.658965 26.322505-24.682146 43.62559-2.356674 26.013467-4.729721 52.052516-7.095605 78.079286 0.107447-1.234107-17.006326 3.246951-19.252483 4.716418-24.130583 15.838733-24.618701 80.075757-26.941606 106.793258-1.063215 12.222369 15.163351 22.240537 10.654664 44.62536-26.433022 131.125433 11.437493 219.776496 71.330582 240.123916 41.564651 17.633612 119.167077 50.323129 191.563944 3.716648l17.971303-17.428951 29.061896-5.237281C662.71663 795.172617 672.02974 765.933689 672.02974 765.933689z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="refresh-3" unicode="&#59818;" d="M820.376904 697.14807C740.637816 774.519228 631.884926 822.157201 511.999488 822.157201c-244.621347 0-442.925808-198.305485-442.925808-442.926832 0-244.6193 198.304462-442.925808 442.925808-442.925808 206.075449 0 379.271046 140.739395 428.740738 331.337337L822.859445 267.64189899999997c-45.759183-127.45381-167.656441-218.623229-310.859957-218.623229-182.371584 0-330.210677 147.842163-330.210677 330.210677 0 182.371584 147.840116 330.2117 330.210677 330.2117 88.762603 0 169.32443-35.035958 228.655723-92.015693L557.051567 433.822732l280.641725 0 113.880677 0 3.351328 0L954.925297 831.695438 820.376904 697.14807z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="ok" unicode="&#58885;" d="M960 640L915.2 684.8 371.2 172.79999999999995 108.8 454.4 64 409.6 358.4 83.20000000000005 364.8 89.60000000000002 371.2 83.20000000000005Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="layer" unicode="&#58936;" d="M96.089 724.318l0-684.236 831.822 0L927.911 724.318 96.089 724.318zM884.178 84.457L140.464 84.457 140.464 489.559l743.714 0L884.178 84.457z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="face-smile-fine" unicode="&#58892;" d="M511.558443 852.9315573333333c-246.787686 0-447.597201-200.783932-447.597201-447.598224 0-246.815315 200.783932-447.598224 447.597201-447.598224 246.841921 0 447.64939 200.782909 447.64939 447.598224C959.207833 652.1476253333334 758.400365 852.9315573333333 511.558443 852.9315573333333zM511.558443-4.962310666666667c-226.247884 0-410.295644 184.046736-410.295644 410.295644 0 226.249931 184.072319 410.296667 410.295644 410.296667 226.27449 0 410.346809-184.046736 410.346809-410.296667C921.905252 179.08442633333334 737.832933-4.962310666666667 511.558443-4.962310666666667zM724.38055 303.5726953333334c-9.698896 3.457752-20.366863-1.566682-23.848151-11.264555-28.500101-79.45461-104.372116-132.844587-188.82353-132.844587-84.798315 0-160.770614 53.689806-189.070146 133.590578-3.432169 9.723455-14.075577 14.772448-23.823592 11.364839-9.699919-3.432169-14.797008-14.100136-11.364839-23.823592 33.547047-94.77248 123.668601-158.434405 224.234017-158.434405 100.142791 0 190.140525 63.314001 223.935212 157.564595C739.125369 289.3978573333334 734.102982 300.0903843333334 724.38055 303.5726953333334zM302.49494 515.3479593333334c0-24.653493 19.98517-44.638663 44.638663-44.638663 24.653493 0 44.638663 19.98517 44.638663 44.638663s-19.98517 44.63764-44.638663 44.63764C322.48011 559.9855993333333 302.49494 540.0014523333333 302.49494 515.3479593333334L302.49494 515.3479593333334zM631.398856 515.3479593333334c0-24.653493 19.98517-44.638663 44.63764-44.638663 24.653493 0 44.63764 19.98517 44.63764 44.638663s-19.984147 44.63764-44.63764 44.63764C651.384026 559.9855993333333 631.398856 540.0014523333333 631.398856 515.3479593333334L631.398856 515.3479593333334z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="dollar" unicode="&#58969;" d="M517.565-65.45399999999995c-244.263 0-442.299 198.014-442.299 442.299s198.014 442.299 442.299 442.299c244.263 0 442.299-198.014 442.299-442.299 0-244.263-198.014-442.299-442.299-442.299zM517.565 863.383c-268.751 0-486.564-217.834-486.564-486.564s217.834-486.564 486.564-486.564c268.751 0 486.564 217.834 486.564 486.564 0 268.751-217.834 486.564-486.564 486.564zM497.036 425.349c-18.443 6.957-33.605 16.314-45.238 27.617-11.581 11.306-20.059 23.465-25.468 36.742-5.423 13.177-8.178 26.235-8.178 39.172-0.004 18.194 2.564 34.357 7.846 48.514 5.327 14.231 13.748 25.85 25.468 35.02 11.581 9.167 26.798 15.204 45.482 18.295v-205.52zM534.455 356.13199999999995c16.937-6.756 32.277-14.997 46.035-24.855 13.748-9.678 24.613-21.601 32.929-35.57 8.204-13.909 12.436-30.734 12.622-50.307 0-14.231-1.859-27.907-5.785-40.833-3.858-12.866-9.542-24.531-17.271-34.804-7.691-10.211-17.271-18.443-28.678-24.613-11.328-6.318-24.613-9.678-39.76-10.341v221.377zM534.455 94.18299999999999c29.037 3.318 53.978 11.306 74.785 24.134 20.985 12.866 37.018 30.15 48.281 51.734 11.125 21.535 16.876 46.832 16.937 76.196 0 16.08-1.67 30.377-5.033 42.985-3.318 12.622-8.204 24.15-14.836 34.357-6.739 10.341-14.836 20.189-24.613 29.326-8.853 8.204-19.107 15.957-30.659 23.041-11.328 7.197-22.836 13.706-34.281 19.261-11.581 5.694-21.601 10.516-30.659 14.231v221.377c14.527-3.318 26.662-8.594 36.62-16.192 9.859-7.395 17.766-16.192 23.776-26.384 5.941-10.211 10.341-20.985 12.972-32.345 2.666-11.328 4.026-22.836 3.858-34.097h46.155c0.004 16.314-1.566 32.345-5.327 48.281-3.543 15.957-9.938 30.909-19.107 44.969-8.996 13.909-21.601 26.235-37.684 36.742-16.192 10.521-36.62 18.295-61.318 23.562v49.426h-37.441v-53.316c-23.465-2.624-42.985-8.178-58.595-16.314-15.633-8.204-28.279-18.194-37.684-29.562-9.441-11.328-16.523-23.302-21.226-35.317-4.59-12.062-7.846-23.302-9.316-33.326-1.566-10.211-2.256-18.194-2.115-24.029 0.004-21.601 3.452-40.612 9.863-57.238 6.479-16.523 15.58-30.909 27.178-43.441 11.659-12.436 25.361-23.562 40.833-33.204 15.633-9.678 32.649-18.443 51.098-26.235v-237.329c-18.194 1.984-33.326 7.197-45.094 15.633-11.97 8.369-21.074 19.107-27.714 31.902-6.739 12.972-11.011 27.178-13.363 42.701-2.256 15.58-3.034 31.313-2.115 47.367h-47.803c-1.183-23.776 0.397-46.035 5.033-66.676s12.357-39.03 23.376-55.019c10.892-16.08 25.361-29.037 43.142-39.03 17.847-9.863 39.472-16.08 64.586-18.295v-65.283h37.441v65.283z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="group" unicode="&#58899;" d="M1328.72893437-13.274022189999982L1325.7954575 10.932401249999998 1319.19311938 40.27361905999999 1309.65730438 68.14729219000003 1296.45423969 96.75473719000001 1283.25117594 118.75984405999998 1264.91331781 140.03117906 1244.37414312 156.90310406000003 1215.76669813 173.03964562 1195.22913594 182.57546062999995 1168.08923563 189.17779874999997 1140.94772187 195.77852437 1117.47507031 204.58056750000003 1088.13546594 218.51740312000004 1064.66281438 229.52076375000001 1036.05536844 242.72382749999997 1014.0502625 255.19473187999995 1014.0502625 332.94718406000004 1023.58446406 343.95054469 1032.38811969 358.61954062999996 1038.98884531 373.29014906 1044.12363969 391.62800719 1049.992205 413.63472656 1052.19191 430.50504 1055.370515 429.77126719 1061.727725 430.75016813 1066.61900281 434.662545 1071.99731188 443.46458812 1075.42104594 453.7325625 1077.37723437 466.4469825 1079.82206656 489.43099031 1080.799355 508.991265 1079.82206656 525.61806187 1076.39833344 535.88764969 1069.55247969 539.80002656 1065.64010188 538.82112656 1069.06383594 560.82623344 1071.99731188 587.2339743800001 1072.97621281 611.19526969 1072.48595656 630.26689969 1069.55247969 647.870985 1064.17255719 664.98642656 1056.83805969 680.63432344 1046.56847188 698.24002125 1034.83295281 712.91063063 1021.13963187 724.15750594 1003.53554656 735.40438125 981.53043969 745.67396812 962.94745344 750.56363437 940.45370281 754.47601125 918.4469825 754.964655 895.95323188 751.05227812 874.43676969 743.71777969 855.36513875 735.893025 838.73834188 725.1347934400001 823.33396063 711.44308594 808.66335125 695.30493188 795.4602875 676.23330187 785.9244725 655.69573969 780.05751875 632.22308813 779.32374687 602.14809844 782.25722375 574.27442531 785.9244725 538.3324818799999 777.85620219 538.3324818799999 772.72140875 531.73014375 771.25547656 519.99462469 772.72140875 492.12095156 776.3886575 459.84625688 779.32374687 443.70810375 784.45854031 434.90606063 793.99435531 429.77126719 799.86130906 430.50504 803.53017031 404.83268344 807.19742 389.42830219 813.06598531 372.55637719000003 821.13425656 355.68606375 830.67007156 342.48299999999995 838.00456906 332.94718406000004 837.27079719 253.72718719 845.06329813 250.99690875 855.81346625 248.0392425 867.37158969 243.73981969 878.39107625 239.43878530999996 888.6058325 235.67638781000005 897.74331406 231.10603405999996 908.76441312 226.53729375 920.85956187 219.54952313 932.95471062 212.56014000000005 942.898535 205.30305094000005 955.80002656 195.62693156 966.82112656 185.41378874999998 977.30358781 172.51229719000003 988.32307531 158.26743750000003 1000.01505219 141.87125344000003 1010.0943425 122.51901655999995 1018.69641219 101.55409219 1026.22120719 82.20185436999998 1031.46243781 64.05913219000001 1035.09098281 45.110066250000045 1038.71952688 23.741970000000038 1041.13855625-1.2546703100000514 1041.54172812-18.187877810000032 1040.73538531-33.30681374999995 1037.30842625-44.99879062000002 1030.79156-57.83254968999995 1023.19742-66.36688593999997 1009.28799875-73.42238906 1298.65555719-73.42238906 1311.85862094-66.82005093999999 1322.12820875-56.552076560000046 1328.72893437-45.54871687000002 1330.19647906-31.611880309999947ZM443.23504906 789.36487031L427.10818437 771.62531906 412.59400625 750.66039469 402.11154406 728.08278469 395.66079781 702.27980156 394.854455 669.21972844 398.07982813 638.57868562 402.11154406 599.06786719 393.24176844 599.06786719 387.59736594 591.81077812 385.98467938 578.90928656 387.59736594 548.26824375 391.62908187 512.7891412500001 394.854455 495.04959 400.4988575 485.37347156 410.98131969 479.72906906 417.43206594 480.53541188 421.46378187 452.31339844 425.49549781 435.38019094 431.94624406 416.83429687 440.81601969 398.28840187 451.29848094 383.77422375000003 459.36191375 373.29176156000005 458.55557094 286.20669281000005 444.84773562 277.33691719 412.59400625 262.01639531 379.53393406 247.50221719 352.92460719 234.60072562000005 331.95968281 225.73095 308.57572906 218.47386094 284.3854325 213.63580125 261.00147875 207.99139875000003 236.81118125 197.50893656000005 214.23357031 186.22013156000003 194.07498969 171.70595344000003 171.49737969 149.12834250000003 155.370515 125.74438874999998 143.27536625 103.16677875000005 133.59924781 78.97648125 123.92312844 51.56081156000005 119.08506875 29.789544370000044 115.05335281 11.243650310000021 112.63432344-10.527616869999974 112.63432344-29.879854690000002 115.85969656-49.23209250000002 125.535815-62.133584059999976 140.04999313-71.80970344000002 158.59588719-73.42238906 965.74546437-73.42238906 980.2596425-66.1653 991.5484475-54.87649499999998 998.80553656-42.781346249999956 1000.41822312-27.46082531000002 998.80553656-7.302244689999952 995.58016438 19.30708218999996 988.32307531 51.56081156000005 977.84061313 82.20185436999998 963.326435 113.64924094000003 948.81225688 137.8395375 928.65367531 161.22349125000005 906.07606531 179.76938625000003 874.62867875 197.50893656000005 852.05106875 207.99139875000003 822.21636875 215.24848781000003 792.38166875 222.50557688000004 766.57868562 232.18169624999996 734.32495625 247.50221719 708.52197312 259.59736594000003 677.07458656 274.11154406 652.88429 287.81937937 652.88429 373.29176156000005 663.36675219 385.38691031 673.04287063 401.513775 680.29995969 417.64063969 685.94436219 437.79922031 692.39510844 461.98951781 694.81413781 480.53541188 698.30882938 479.72906906 705.2966 480.80473031 710.67168406 485.10415312 716.585405 494.78027156 720.3478025 506.06907656 722.49912688 520.04623031 725.18586219 545.31218906 726.26152437 566.8141378099999 725.18586219 585.09071344 721.42346469 596.3795184400001 713.89705719 600.68055375 709.59763438 599.6048915599999 713.36003188 623.79518906 716.585405 652.82354531 717.66106719 679.16516625 717.12242937 700.13008969 713.89705719 719.4823275 707.98494781 738.2959275000001 699.92151594 755.49845437 688.63271094 774.85069219 675.73121937 790.97755688 660.67840344 803.34202406 641.32616563 815.70487875 617.13586906 826.99368375 596.7095825 832.37038031 571.98064812 836.66980219 547.79035063 837.20844 523.06302875 832.90740469 499.40975656 824.84397281 478.44483313 816.24351562 460.16825656 804.4160728100001Z"  horiz-adv-x="1449" />
+
+    
+    <glyph glyph-name="layim-download" unicode="&#58910;" d="M186.888458 77.07363199999998l0 581.729108c14.85022-14.450107 35.050284-23.436782 57.359382-23.436782l560.03604 0 0-151.561881 25.029046 0 0 176.591951-585.065086 0c-31.191396 0-57.359382 26.166963-57.359382 57.359382 0 31.191396 26.165939 57.359382 57.359382 57.359382l572.551074 0L816.798914 800.143838 244.24784 800.143838c-45.431725 0-82.388429-36.957727-82.388429-82.388429l0-640.681778c0-41.796942 34.000372-75.789127 75.789127-75.789127l225.950102 0 0 25.029046L237.648538 26.31355099999996C209.661114 26.31355099999996 186.888458 49.078021000000035 186.888458 77.07363199999998zM236.947574 730.269421l560.38601 0 0-25.029046-560.38601 0 0 25.029046ZM686.086897 428.171012c-85.917812 0-164.908864-55.248302-194.553021-135.882783-30.013571-81.641415-4.269233-175.567621 62.624293-230.942813 67.00302-55.465243 164.474982-62.808488 238.931764-17.720593 74.094532 44.868907 113.272833 133.533272 96.080266 218.517829C869.882923 357.47283300000004 783.297916 428.171012 686.086897 428.171012zM686.086897 38.82858599999997c-75.595722 0-145.060817 48.634674-171.092703 119.595842-26.354228 71.839165-3.63069 154.438395 55.287187 203.074092 59.017138 48.718585 144.762011 55.029314 210.191186 15.237029 65.11195-39.59888 99.396801-117.681236 84.064604-192.408171C847.384513 100.72940100000005 771.387655 38.82858599999997 686.086897 38.82858599999997zM698.600909 152.23547199999996L698.600909 311.02496499999995 673.571862 311.02496499999995 673.571862 152.28459099999998 604.675726 221.17254100000002 586.978668 203.47548400000005 686.111456 104.35190499999999 785.185916 203.42738799999995 767.489882 221.123422Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="picture-fine" unicode="&#58893;" d="M958.648085 84.30682933333333L65.772494 84.30682933333333 65.772494 721.9115253333333l892.87559 0L958.648085 84.30682933333333zM97.660762 116.20328333333339l829.099055 0L926.759817 690.0570263333334 97.660762 690.0570263333334 97.660762 116.20328333333339zM648.731616 419.05893933333334l-1.991354 0c-47.801702 0-86.696548 38.900985-86.696548 86.695524l0 1.978051c0 47.809889 38.894845 86.671988 86.696548 86.671988l1.991354 0c47.801702 0 86.698594-38.862099 86.698594-86.671988l0-1.978051C735.43021 457.95992433333333 696.533318 419.05893933333334 648.731616 419.05893933333334zM646.740262 562.5193053333333c-30.224372 0-54.810327-24.582885-54.810327-54.787814l0-1.978051c0-30.230512 24.584931-54.803163 54.810327-54.803163l1.991354 0c30.222325 0 54.810327 24.572652 54.810327 54.803163l0 1.978051c0 30.203906-24.586978 54.787814-54.810327 54.787814L646.740262 562.5193053333333zM91.097276 181.7900473333334l-22.748097 22.338774 274.373974 279.332916 22.750143-22.351054L91.097276 181.7900473333334zM604.886015 215.92242633333342L339.999113 480.74793033333333l22.548552 22.525016L627.433544 238.4638153333334 604.886015 215.92242633333342zM619.007641 202.70744933333333l-22.763446 22.337751 167.989015 171.035398 22.765493-22.350031L619.007641 202.70744933333333zM925.622924 222.7939273333334L758.534418 389.8343373333333l22.548552 22.529109 167.086459-167.044504L925.622924 222.7939273333334z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="link" unicode="&#58956;" d="M262.4-121.60000000000002c-64 0-128 25.6-179.2 76.8-102.4 102.4-102.4 262.4 0 364.8l134.4 134.4 89.6-89.6-134.4-134.4c-51.2-51.2-51.2-128 0-179.2 51.2-51.2 128-51.2 179.2 0l179.2 179.2c25.6 25.6 38.4 57.6 38.4 89.6S556.8 384 537.6 409.6L467.2 473.6l89.6 89.6 70.4-70.4C672 448 697.6 384 697.6 313.6c0-70.4-25.6-134.4-76.8-179.2l-179.2-179.2C396.8-96 326.4-121.60000000000002 262.4-121.60000000000002zM467.2 204.79999999999995L396.8 268.79999999999995c-102.4 102.4-102.4 262.4 0 364.8l179.2 179.2c102.4 102.4 262.4 102.4 364.8 0 102.4-102.4 102.4-262.4 0-364.8l-134.4-134.4-89.6 89.6 134.4 134.4c51.2 51.2 51.2 128 0 179.2-51.2 51.2-134.4 51.2-179.2 0L486.4 544c-51.2-51.2-51.2-128 0-179.2l70.4-70.4L467.2 204.79999999999995z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="diamond" unicode="&#59189;" d="M998.4 526.933333L797.866667 802.133333c-4.266667 6.4-12.8 10.666667-19.2 10.666667L243.2 812.8c0 0-14.933333-2.133333-23.466667-17.066667C194.133333 753.066667 32 512 32 512L21.333333 494.933333l12.8-14.933333L469.333333-27.733333000000016c4.266667-4.266667 6.4-6.4 10.666667-8.533333 6.4-4.266667 32-10.666667 46.933333 0 4.266667 2.133333 6.4 6.4 10.666667 8.533333l409.6 420.266667c10.666667 8.533333 10.666667 25.6 0 34.133333-8.533333 10.666667-23.466667 10.666667-32 0L561.066667 61.86666700000001l153.6 422.4 0 0 251.733333 0c2.133333 0 19.2 0 23.466667 4.266667l2.133333 2.133333C1004.8 497.066667 1006.933333 512 998.4 526.933333zM782.933333 763.733333l-96-226.133333L341.333333 537.6l-85.333333 226.133333L782.933333 763.733333zM221.866667 714.666667l72.533333-179.2-192 0L221.866667 714.666667zM91.733333 488.533333l215.466667 0 138.666667-416L91.733333 488.533333zM503.466667 44.799999999999955l-147.2 443.733333 307.2 0L503.466667 44.799999999999955zM736 535.4666669999999L810.666667 701.866667l119.466667-168.533333L736 533.333333z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="log" unicode="&#58894;" d="M828.01742 700.357158C743.476979 784.899646 631.076002 831.458031 511.516999 831.458031c-119.55798 0-231.959979-46.558385-316.500421-131.09985C110.47716 615.81774 63.918775 503.41574 63.918775 383.85776c0-87.103824 25.045419-171.548074 72.429613-244.204861 9.393951-14.402011 28.685319-18.46249 43.087331-9.071609 14.404058 9.393951 18.46556 28.685319 9.072633 43.089377-40.768519 62.511729-62.317301 135.194098-62.317301 210.187093 0 212.469066 172.85586 385.326972 385.325949 385.326972s385.325949-172.857906 385.325949-385.326972-172.85586-385.326972-385.325949-385.326972c-70.357418 0-139.188062 19.131733-199.052498 55.323003-14.71412 8.900717-33.856086 4.180206-42.753733-10.534937-8.896624-14.71719-4.180206-33.856086 10.534937-42.753733 69.584821-42.070164 149.556201-64.307631 231.271294-64.307631 119.559003 0 231.959979 46.558385 316.500421 131.09985 84.539418 84.539418 131.097804 196.941418 131.097804 316.499397S912.556838 615.81774 828.01742 700.357158zM494.28964 690.216193c-21.782096 0-39.397289-17.658172-39.397289-39.439244l0-283.524378c0-1.360997 0.358157-2.706645 0.493234-4.03285 2.020006-19.886933 18.959817-34.573423 39.379892-34.573423l0 0 0.146333 0.832971 223.590358 0c21.782096 0 39.438221 17.616216 39.438221 39.397289s-17.658172 39.397289-39.439244 39.397289L533.686928 408.273846l0 242.503103C533.686928 672.5580219999999 516.071735 690.216193 494.28964 690.216193z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="key" unicode="&#59011;" d="M819.2 588.8c0-172.8-140.8-307.2-307.2-307.2-172.8 0-307.2 140.8-307.2 307.2C204.8 755.2 339.2 896 512 896S819.2 755.2 819.2 588.8L819.2 588.8zM512 838.4c-140.8 0-249.6-115.2-249.6-249.6 0-134.4 108.8-256 249.6-256s256 115.2 256 249.6S652.8 838.4 512 838.4L512 838.4zM480 300.79999999999995l64 0L544-128l-64 0L480 300.79999999999995 480 300.79999999999995zM512 192l192 0 0-64L512 128 512 192 512 192zM512 64l192 0 0-64L512 0 512 64 512 64z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="rate-solid" unicode="&#59002;" d="M957.111079 492.519576c-3.927449 11.669784-14.447037 19.86442-26.723641 20.816095L647.68068 535.250796 540.183388 811.873997c-4.586458 11.803837-15.951297 19.579941-28.614711 19.579941s-24.02723-7.776104-28.614711-19.579941L375.458719 535.250796l-282.708803-21.915126c-12.276604-0.951675-22.796192-9.146311-26.723641-20.816095-3.927449-11.669784-0.50142-24.557302 8.701173-32.737612l217.547735-193.358823-67.980277-291.298436c-2.848884-12.20702 2.009773-24.919553 12.273535-32.114418 10.264784-7.195889 23.87271-7.42818 34.375925-0.586354l240.624313 156.709111 240.625336-156.709111c5.099135-3.320629 10.92891-4.974291 16.752546-4.974291 6.173606 0 12.342096 1.858324 17.623379 5.561669 10.263761 7.194866 15.122419 19.907399 12.273535 32.114418l-67.980277 291.299459L948.409906 459.781964C957.613522 467.962274 961.037505 480.849792 957.111079 492.519576z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="fonts-del" unicode="&#58959;" d="M928 448l-143.616 0c-3.456 55.616-14.272 106.56-29.504 144.96C725.504 666.816 617.344 768 464.32 768L256 768l0-320L96 448C78.336 448 64 433.664 64 416S78.336 384 96 384L256 384l0-320 229.632 0c156.288 0 240.768 97.856 267.904 167.488C772.736 280.96000000000004 782.272 333.312 784.96 384L928 384C945.664 384 960 398.336 960 416S945.664 448 928 448zM349.376 711.488l63.936 0c35.712 0 251.84 27.968 266.944-263.488l-330.88 0L349.376 711.488zM439.296 120.51199999999994L349.376 120.51199999999994 349.376 382.528 349.376 384l330.88 0C665.344 113.98400000000004 467.968 120.51199999999994 439.296 120.51199999999994z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="unlink" unicode="&#58957;" d="M150.336 767.6800000000001C133.44 762.304 124.16 744.3199999999999 129.472 727.488 131.2 722.1759999999999 134.208 717.44 138.304 713.664l122.624-122.432C270.208 576.192 289.92 571.52 304.96 580.736 320 590.0799999999999 324.672 609.7280000000001 315.456 624.832 312.832 629.056 309.184 632.64 304.96 635.264L182.336 757.696C175.168 765.44 164.672 769.216 154.304 767.6800000000001 152.96 767.808 151.552 767.808 150.336 767.6800000000001L150.336 767.6800000000001zM406.08 831.424c-13.696-4.48-22.72-17.6-22.016-32L384.064 672c0-17.664 14.336-32 32-32s31.872 14.336 31.872 32L447.936 799.424C448.256 817.088 434.304 831.6800000000001 416.64 832 414.464 832.064 412.16 831.808 410.048 831.424 408.704 831.552 407.296 831.552 406.08 831.424L406.08 831.424zM91.392 511.872C73.728 509.12 61.632 492.544 64.384 474.88 67.136 457.28 83.712 445.248 101.376 448L224 448C241.664 448 256 462.208 256 479.872s-14.336 32-32 32L101.376 511.872c-1.984 0.192-3.968 0.192-6.016 0C94.016 512 92.608 512 91.392 511.872L91.392 511.872zM795.456 320c-17.728-2.752-29.824-14.08-27.072-31.744 2.752-17.6 19.328-35.008 36.992-32.256L928 256c17.664 0 32 19.584 32 37.248S945.664 320 928 320l-122.624 0c-1.984 0.192-3.968 0.192-6.016 0-1.344 0.128-2.688 0.128-4.032 0L795.456 320zM598.272 127.42399999999998c-13.76-4.48-22.72-17.6-22.08-32L576.192-32c0-17.664 14.336-32 32-32S640-49.66399999999999 640-32l0 127.424c0.32 17.6-13.568 32.256-31.232 32.576-2.176 0.064-4.352-0.192-6.592-0.576-1.344 0.128-2.688 0.128-4.032 0L598.272 127.42399999999998zM726.272 191.67999999999995c-16.896-5.376-26.24-23.36-20.864-40.192 1.664-5.312 4.736-10.048 8.832-13.824l122.56-122.432c9.28-15.04 28.928-19.776 44.032-10.496 14.976 9.344 19.712 28.992 10.368 44.032-2.624 4.224-6.144 7.808-10.368 10.432l-122.56 122.432c-7.168 7.744-17.6 11.52-28.032 9.984-1.344 0.128-2.688 0.128-4.032 0L726.272 191.61599999999999zM339.968 28.03200000000004c-49.152 0-98.304 18.688-135.744 56.128-74.816 74.88-74.816 196.608 0 271.488l87.744 87.744c12.48 12.48 32.768 12.48 45.248 0s12.48-32.768 0-45.248L249.408 310.46400000000006c-49.92-49.856-49.92-131.136 0-180.992 49.856-49.856 131.136-49.856 180.992 0l87.744 87.744c12.48 12.48 32.768 12.48 45.248 0s12.48-32.768 0-45.248l-87.744-87.744C438.272 46.72000000000003 389.12 28.03200000000004 339.968 28.03200000000004zM702.144 323.712c-8.192 0-16.384 3.136-22.656 9.344-12.48 12.48-12.48 32.768 0 45.248l87.744 87.744c49.856 49.92 49.856 131.072 0 180.992-49.856 49.856-131.136 49.856-180.992 0L498.496 559.296c-12.48-12.48-32.768-12.48-45.248 0s-12.48 32.768 0 45.248l87.744 87.744c74.88 74.88 196.608 74.88 271.488 0 74.88-74.816 74.88-196.672 0-271.488l-87.744-87.744C718.528 326.784 710.336 323.712 702.144 323.712z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="fonts-clear" unicode="&#58937;" d="M944.787709 197.20939699999997L857.081297 197.20939699999997 741.092979-127.73993700000005 815.146059-127.73993700000005 832.440281-65.58476199999996 966.82809-65.58476199999996 984.512408-127.73993700000005 1062.011328-127.73993700000005 944.787709 197.20939699999997 944.787709 197.20939699999997ZM848.04409 1.1865400000000363L898.951519 153.25866699999995 949.923963 1.1865400000000363 848.04409 1.1865400000000363 848.04409 1.1865400000000363ZM210.238376 489.910857L183.386821 513.121524 12.46009 313.522794C-5.874386 292.652698-3.728862 260.989968 17.271265 242.720508 38.401424 224.45104800000001 70.454249 226.66158700000005 88.853741 247.53168300000004L100.361551 260.599873C106.603075 267.55657099999996 117.200662 268.20673 124.287392 262.22527 131.309106 256.048762 132.024281 245.51619000000005 125.912789 238.55949199999998 107.448281 217.62438099999997 98.085995 173.08850800000005 119.216154 154.81904799999995 140.281297 136.614603 183.841932 151.76330199999995 202.371455 172.69841299999996 208.417932 179.525079 219.145551 180.30526999999995 226.167265 174.19377799999995 233.188979 168.14730199999997 233.904154 157.61473 227.792662 150.65803200000005 209.328154 129.85295199999996 199.965868 85.05701599999998 221.096027 66.91758700000003 242.16117 48.648127000000045 285.656789 63.86184100000003 304.186313 84.666921 310.362821 91.62361899999996 321.025424 92.40381000000002 327.982122 86.29231700000003 335.068852 80.18082500000003 335.784027 69.71326999999997 329.672535 62.75657100000001 311.143011 41.82146 301.845741-2.9094599999999673 322.910884-20.983873000000017 344.041043-39.253333 387.601678-24.039619000000016 406.00117-3.234540000000038 412.177678 3.7221590000000333 422.840281 4.437332999999967 429.927011-1.6091430000000173 436.948725-7.720635000000016 437.598884-18.31822199999999 431.487392-25.144889000000035 413.022884-46.08000000000004 403.725614-90.81092100000001 424.790757-109.01536499999997 445.920916-127.15479400000004 477.973741-125.00927000000001 496.373233-104.20419000000004L667.299963 95.52457100000004 658.652852 132.90869799999996 210.238376 489.910857 210.238376 489.910857ZM844.013106 329.516698L680.10809 471.12127 929.639011 715.190857C933.2799 718.376635 936.725741 721.562413 939.976535 725.203302 977.815773 768.048762 973.524725 833.129651 930.28917 870.513778 887.183646 907.702857 821.58263 903.281778 783.808408 860.631365L783.483328 860.761397 564.249805 571.3107299999999 399.824662 713.56546C385.391138 726.113524 363.480789 724.553143 350.867709 710.249651L248.14263 593.871238 225.322059 567.994921 251.393424 545.434413 695.7119 161.25561900000002 726.26936 136.679619 847.328916 281.014857C859.941995 295.318349 858.44663 316.96863499999995 844.013106 329.516698L844.013106 329.516698ZM817.941741 830.724063C839.136916 854.779937 876.000916 857.315556 900.186821 836.250413 924.372725 815.380317 926.908344 778.906413 905.648154 754.85054 884.452979 730.924698 847.588979 728.389079 823.403075 749.3892060000001 799.21717 770.324317 796.811582 806.798222 817.941741 830.724063L817.941741 830.724063ZM765.473932 758.491429C768.919773 741.522286 777.6319 725.593397 791.80536 713.305397 806.043836 701.017397 823.533106 694.580825 841.087392 693.540571L643.634186 494.526984 593.116852 538.2176509999999 765.473932 758.491429 765.473932 758.491429ZM776.006503 299.739429L709.755328 219.314794 307.502122 566.369524 376.809043 645.03873C382.920535 651.865397 393.38809 652.5155560000001 400.409805 646.534095L774.381106 323.01511100000005C781.337805 317.098667 782.117995 306.69612700000005 776.006503 299.739429L776.006503 299.739429Z"  horiz-adv-x="1063" />
+
+    
+    <glyph glyph-name="triangle-r" unicode="&#58915;" d="M293.291 728.256l426.88-355.456-426.88-355.52z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="circle" unicode="&#58943;" d="M511.998 847.999C255.739 847.999 48 640.26 48 383.999c0-256.258 207.739-463.998 463.998-463.998C768.261-79.99900000000002 976 127.74199999999996 976 383.999 976 640.26 768.261 847.999 511.998 847.999zM512.002-16.000999999999976c-220.915 0-400.002 179.088-400.002 400 0 220.917 179.086 400 400.002 400 220.912 0 399.998-179.083 399.998-400C912 163.087 732.914-16.000999999999976 512.002-16.000999999999976z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="radio" unicode="&#58947;" d="M512.5 383.5m-192 0a192 192 0 1 1 384 0 192 192 0 1 1-384 0ZM511.998 847.999C255.739 847.999 48 640.26 48 383.999c0-256.258 207.739-463.998 463.998-463.998C768.261-79.99900000000002 976 127.74199999999996 976 383.999 976 640.26 768.261 847.999 511.998 847.999zM512.002-16.000999999999976c-220.915 0-400.002 179.088-400.002 400 0 220.917 179.086 400 400.002 400 220.912 0 399.998-179.083 399.998-400C912 163.087 732.914-16.000999999999976 512.002-16.000999999999976z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="align-center" unicode="&#58951;" d="M992 448L32 448C14.32 448 0 462.336 0 480 0 497.664 14.32 512 32 512L992 512C1009.68 512 1024 497.664 1024 480 1024 462.336 1009.68 448 992 448ZM800 704C817.664 704 832 689.664 832 672 832 654.336 817.664 640 800 640L224 640C206.32 640 192 654.336 192 672 192 689.664 206.32 704 224 704L800 704ZM992 832L32 832C14.32 832 0 846.336 0 864 0 881.664 14.32 896 32 896L992 896C1009.68 896 1024 881.664 1024 864 1024 846.336 1009.68 832 992 832ZM224 256C206.32 256 192 270.336 192 288 192 305.664 206.32 320 224 320L800 320C817.664 320 832 305.664 832 288 832 270.336 817.664 256 800 256L224 256ZM32 128L992 128C1009.68 128 1024 113.66399999999999 1024 96 1024 78.33600000000001 1009.68 64 992 64L32 64C14.32 64 0 78.33600000000001 0 96 0 113.66399999999999 14.32 128 32 128ZM224-64L800-64C817.664-64 832-78.33600000000001 832-96 832-113.66399999999999 817.664-128 800-128L224-128C206.32-128 192-113.66399999999999 192-96 192-78.33600000000001 206.32-64 224-64Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="align-right" unicode="&#58952;" d="M992 64L32 64C14.32 64 0 78.33600000000001 0 96 0 113.66399999999999 14.32 128 32 128L992 128C1009.68 128 1024 113.66399999999999 1024 96 1024 78.33600000000001 1009.68 64 992 64ZM992 256L288 256C270.32 256 256 270.336 256 288 256 305.664 270.32 320 288 320L992 320C1009.68 320 1024 305.664 1024 288 1024 270.336 1009.68 256 992 256ZM992 448L32 448C14.32 448 0 462.336 0 480 0 497.664 14.32 512 32 512L992 512C1009.68 512 1024 497.664 1024 480 1024 462.336 1009.68 448 992 448ZM992 640L288 640C270.32 640 256 654.336 256 672 256 689.664 270.32 704 288 704L992 704C1009.68 704 1024 689.664 1024 672 1024 654.336 1009.68 640 992 640ZM992 832L32 832C14.32 832 0 846.336 0 864 0 881.664 14.32 896 32 896L992 896C1009.68 896 1024 881.664 1024 864 1024 846.336 1009.68 832 992 832ZM288-64L992-64C1009.68-64 1024-78.33600000000001 1024-96 1024-113.66399999999999 1009.68-128 992-128L288-128C270.32-128 256-113.66399999999999 256-96 256-78.33600000000001 270.32-64 288-64Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="align-left" unicode="&#58953;" d="M992 448L32 448C14.336 448 0 462.336 0 480 0 497.664 14.336 512 32 512L992 512C1009.664 512 1024 497.664 1024 480 1024 462.336 1009.664 448 992 448ZM32 704L736 704C753.68 704 768 689.664 768 672 768 654.336 753.68 640 736 640L32 640C14.336 640 0 654.336 0 672 0 689.664 14.336 704 32 704ZM992 832L32 832C14.336 832 0 846.336 0 864 0 881.664 14.336 896 32 896L992 896C1009.664 896 1024 881.664 1024 864 1024 846.336 1009.664 832 992 832ZM32 320L736 320C753.68 320 768 305.664 768 288 768 270.336 753.68 256 736 256L32 256C14.336 256 0 270.336 0 288 0 305.664 14.336 320 32 320ZM32 128L992 128C1009.664 128 1024 113.66399999999999 1024 96 1024 78.33600000000001 1009.664 64 992 64L32 64C14.336 64 0 78.33600000000001 0 96 0 113.66399999999999 14.336 128 32 128ZM32-64L736-64C753.68-64 768-78.33600000000001 768-96 768-113.66399999999999 753.68-128 736-128L32-128C14.336-128 0-113.66399999999999 0-96 0-78.33600000000001 14.336-64 32-64Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="loading-1" unicode="&#58942;" d="M537.574469 831.696462c-14.123672 0-25.574469-11.447726-25.574469-25.574469 0-14.123672 11.450796-25.574469 25.574469-25.574469 204.495464 0 370.82877-166.358889 370.82877-370.82877 0-14.123672 11.450796-25.574469 25.574469-25.574469 14.123672 0 25.574469 11.450796 25.574469 25.574469C959.551152 642.385838 770.241552 831.696462 537.574469 831.696462z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="return" unicode="&#58972;" d="M927.858848 417.938973L168.863431 417.938973l308.721247 308.86758c11.685133 11.69025 11.435447 30.881334-0.557702 42.868343-11.992125 11.985986-31.18321 12.226462-42.868343 0.536212L75.199191 411.071565c-1.994424-1.662873-3.773953-3.583618-5.294586-5.713119-4.047176-5.373381-6.013971-11.839653-5.9055-18.328437-0.12996-7.794523 2.725064-15.561417 8.595772-21.432125l361.565802-361.744881c11.685133-11.691273 30.876218-11.449773 42.868343 0.535189 11.993149 11.985986 12.242835 31.17707 0.557702 42.868343L168.441828 356.54571799999997l759.417019 0c16.527418 0 29.925566 13.738909 29.925566 30.694069S944.386266 417.938973 927.858848 417.938973z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="fonts-strong" unicode="&#58923;" d="M199.092919 848.487893l355.326704 0c70.335928 0 122.780371-2.942005 157.349701-8.809643 34.568307-5.884011 65.491597-18.131963 92.78522-36.759205 27.27725-18.627243 50.01409-43.427068 68.209498-74.397431 18.195408-30.986735 27.293623-65.699328 27.293623-104.169501 0-41.7161-11.17655-79.977519-33.496905-114.802676s-52.604078-60.951187-90.818425-78.362742c54.075593-15.765055 95.647407-42.626843 124.715443-80.585363s43.602054-82.58388 43.602054-133.877103c0-40.388872-9.417487-79.673597-28.220738-117.839849-18.803251-38.182624-44.482097-68.673056-77.035514-91.489714-32.55444-22.833031-72.702835-36.855396-120.414487-42.09984-29.931706-3.229554-102.122889-5.260817-216.572524-6.060019L199.092919-40.765192999999954 199.092919 848.487893zM378.171504 700.1084940000001l0-205.684546 117.64849 0c69.935816 0 113.410979 1.006933 130.390699 3.038196 30.730908 3.629667 54.891168 14.246469 72.478731 31.850405 17.588587 17.588587 26.381857 40.756239 26.381857 69.473281 0 27.501354-7.594979 49.838082-22.75219 67.042929-15.158235 17.188474-37.702694 27.597545-67.618027 31.242562-17.796318 2.01489-68.945255 3.038196-153.431461 3.038196L378.171504 700.109518zM378.171504 346.04454999999996l0-236.383732 166.622902 0c64.85203 0 106.008382 1.807159 123.43631 5.420453 26.750247 4.828982 48.543599 16.58063 65.363683 35.272341s25.247011 43.714617 25.247011 75.085092c0 26.526143-6.491855 49.03888-19.459191 67.538209-12.983709 18.48398-31.722492 31.961946-56.250118 40.404222s-77.739549 12.663414-159.619394 12.663414L378.171504 346.04454999999996z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="upload" unicode="&#59004;" d="M831.488 478.208C831.488 478.208 831.488 478.208 831.488 478.208c0 143.36-114.688 258.048-253.952 258.048-98.304 0-184.32-57.344-225.28-139.264C327.68 605.184 307.2 609.28 286.72 609.28c-90.112 0-159.744-73.728-159.744-159.744 0-16.384 4.096-28.672 8.192-40.96C57.344 379.904 0 310.27200000000005 0 224.25599999999997c0-106.496 86.016-192.512 192.512-192.512l192.512 0 0 192.512L258.048 224.25599999999997l258.048 258.048 258.048-258.048-126.976 0 0-192.512 192.512 0L839.68 35.84000000000003c106.496 16.384 192.512 110.592 192.512 221.184C1024 371.712 937.984 465.92 831.488 478.208z"  horiz-adv-x="1033" />
+
+    
+    <glyph glyph-name="dialogue" unicode="&#58938;" d="M998.4 500.992C998.4 682.24 811.392 829.696 581.632 829.696c-121.216 0-235.904-41.472-315.264-114.048 37.504 8.192 76.416 13.056 115.456 14.464 59.264 30.592 128.256 46.72 199.808 46.72 198.144 0 359.296-123.776 359.296-275.968 0-31.872-7.04-63.232-20.992-93.056 7.552-28.16 11.264-57.344 11.008-86.528C975.104 374.784 998.4 436.736 998.4 500.992L998.4 500.992zM442.368 398.72c-30.72 0-55.808-23.04-55.808-51.328s25.088-51.328 55.808-51.328 55.808 23.04 55.808 51.328S473.088 398.72 442.368 398.72zM243.328 398.72c-30.72 0-55.808-23.04-55.808-51.328s25.088-51.328 55.808-51.328 55.808 23.04 55.808 51.328C299.264 375.67999999999995 274.176 398.72 243.328 398.72zM641.28 398.72c-30.72 0-55.808-23.04-55.808-51.328s25.088-51.328 55.808-51.328 55.808 23.04 55.808 51.328S672.128 398.72 641.28 398.72zM442.368 677.888C212.608 677.888 25.6 530.432 25.6 349.312c0-179.968 173.696-296.192 332.544-321.664l60.8-78.336c5.632-7.424 14.464-11.008 23.296-11.008 8.832 0 17.792 3.712 23.424 11.008l60.8 78.464C685.312 53.24800000000005 859.008 169.47199999999998 859.008 349.44000000000005 859.136 530.432 672.128 677.888 442.368 677.888zM714.88 173.82399999999996c-52.224-45.184-124.288-77.952-197.376-89.6C503.168 81.91999999999996 490.112 74.24000000000001 481.28 62.72000000000003l-38.784-49.92-38.912 49.92c-8.96 11.52-21.888 19.2-36.224 21.504-73.216 11.776-145.152 44.416-197.376 89.728-39.68 34.304-86.912 92.544-86.912 175.36 0 69.76 35.584 136.192 100.352 187.264 68.736 54.144 160.768 84.096 258.944 84.096 98.304 0 190.336-29.824 259.072-84.096 64.768-51.072 100.352-117.504 100.352-187.264C801.664 266.36800000000005 754.56 208.12800000000004 714.88 173.82399999999996z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="video" unicode="&#59117;" d="M952.523633 599.2477269999999L952.523633 599.2477269999999 952.523633 599.2477269999999zM100.53762400000005 661.054062C100.53762400000005 661.054062 100.53762400000005 661.054062 100.53762400000005 661.054062 100.53762400000005 661.054062 100.53762400000005 661.054062 100.53762400000005 661.054062zM100.74228 720.404517L100.74228 720.404517 100.74228 720.404517zM660.990107 739.9449716666666c8.697911 0 17.498151-0.511642 25.684421-2.353553 12.279404-2.865194 23.22854-8.18627 34.382332-16.679524 15.144599-11.460777 26.196063-29.572899 32.02878-52.187469 3.479165-13.405016 2.967523-28.651944 2.558209-42.05696-0.102328-4.195463-0.204657-8.083941-0.204657-11.665434l0-37.759169 101.407415 70.401919 25.479764 17.60048c0.511642 0.306985 1.330269 1.023284 2.148896 1.637254 4.40012 3.376836 11.051464 8.595583 20.977316 11.051464 3.274508 0.818627 6.549016 1.22794 10.02818 1.22794 9.618867 0 19.44239-3.274508 27.730987999999996-9.311882 18.82842-13.916657999999998 18.726092-35.405616 18.726092-51.061857 0-1.023284 0-2.148896 0-3.172179l0-409.620466c0-15.963226 0.102328-37.963825-19.647047-51.982812-6.753672-4.809433-16.679524-8.390926-27.219346-8.390926-5.01409 0-10.130509 0.818627-15.144599 2.762866-7.162986 2.762866-12.279404 6.856000999999999-16.065554 9.823524-0.920955 0.716299-1.841911 1.432597-2.353553 1.841911l-24.968122 17.395823-101.10043 70.094934 0-37.963825c0-3.581493 0.102328-7.367643 0.204657-11.460777 0.409313-14.735285 0.818627-29.982212-2.865194-43.796542-5.62806-21.488957999999997-16.679524-39.396423-31.107825-50.447886-7.879285-6.037374-18.930748-13.405016-34.075347-16.986509-7.776956-1.841911-16.167882-2.353553-24.45648-2.353553-4.297792 0-8.595583 0.102328-12.688718 0.204657-3.683821 0.102328-7.162986 0.204657-10.232837 0.204657L167.15339300000005 84.94107466666674c-1.944239 0-3.888478 0-5.832717 0-1.944239 0-3.990806 0-5.935045 0-16.577196 0-33.461377 0.61397-47.787349 6.549016-27.935644999999997 11.563106-46.764065 37.759169-53.006096 73.574098l-0.409313 2.251224 0 2.353553c-0.102328 18.930748-0.204657 37.861497-0.306985 56.792245l0 0.511642L53.87588699999998 598.0155226666666c0 4.40012-0.102328 8.902568-0.102328 13.712001999999998-0.306985 27.01469-0.716299 54.950335 9.311882 76.643949 9.823524 21.284300999999996 27.526331999999996 38.066154 48.708304 45.945438 5.730389 2.148896 11.051464 2.762866 15.04227 3.172179 1.023284 0.102328 2.353553 0.306985 3.069851 0.409313l4.093135 1.534926 500.9997 0c3.581493 0 7.572299 0.102328 11.767763 0.306985C651.166583 739.7403146666667 656.078345 739.9449716666666 660.990107 739.9449716666666M304.273409 266.7785886666668L559.889677 394.2797376666667l0 33.973019L304.273409 555.9585626666667 304.273409 266.7785886666668M660.990107 780.8763196666666c-5.62806 0-10.949136-0.204657-15.758569-0.306985-3.888478-0.102328-7.469971-0.204657-10.437494-0.204657L133.79434400000002 780.3646776666667l-7.265314 0-6.446687-2.353553c-5.3210749999999996-0.61397-13.609673-1.841911-22.716898-5.218747-31.210153-11.665434-57.303887-36.121915-71.629859-67.229739-13.814329999999998-30.084541-13.405016-64.159888-12.995703-94.244429 0.102328-4.604777 0.102328-9.004897 0.102328-13.20036l0-371.349655 0-0.102328 0-0.102328 0-0.511642c0.102328-18.930748 0.204657-37.861497 0.306985-56.792245l0-2.251224 0-3.479165 0.61397-3.376836 0.409313-2.251224c4.195463-23.944839 12.791046-45.126811 25.479764-62.727291 13.609673-18.82842 31.107825-32.847407 52.08514-41.545318 21.488957999999997-8.902568 44.001199-9.618867 63.443589-9.618867 2.046567 0 4.093135 0 6.139702 0 1.841911 0 3.78615 0 5.62806 0l473.166384 0c2.558209 0 5.62806-0.102328 9.004897-0.204657 4.195463-0.102328 8.902568-0.306985 13.916657999999998-0.306985 13.302688 0 24.149495 1.125612 33.973019 3.479165 22.819227 5.423404 39.089437 16.474868 49.322274 24.251824 21.693613999999997 16.577196 37.963825 42.363944999999994 45.84311 72.653143 2.251224 8.595583 3.376836 17.088838 3.990806 25.377436l36.838213-25.582093 24.558809-17.088838c0.306985-0.204657 0.61397-0.511642 0.920955-0.716299 4.809433-3.683821 13.609673-10.642149999999999 26.400719-15.656241 9.516538-3.683821 19.647047-5.62806 30.084541-5.62806 18.009793 0 36.53122799999999 5.832717 50.8572 15.963226 16.577196 11.767763 27.730987999999996 27.935644999999997 33.052064 48.094334 3.78615 14.4283 3.78615 27.628659999999996 3.78615 37.34985499999999l0 409.518137c0 0.920955 0 1.739582 0 2.660538l0 0.409313c0 9.41421 0.102328 22.409913-3.479165 36.53122799999999-5.116419 19.749375-15.758569 35.81493-31.721795 47.68502-15.144599 11.153792-33.666034 17.293495-52.08514 17.293495-6.753672 0-13.507345-0.818627-19.954032-2.455881-18.21445-4.604777-30.289198-13.916657999999998-36.019586-18.419107l0 0c-0.204657-0.204657-0.511642-0.409313-0.716299-0.511642l-25.172779-17.293495-0.102328 0-0.102328 0-37.14519799999999-25.786749c-0.511642 7.674628-1.637254 15.553912-3.683821 23.433197-8.18627 31.721795-24.354152 57.508544-46.866394 74.597382-15.758569 11.972419-32.02878 19.851704-49.833916 23.944839C685.8559009999999 779.7507076666667 674.702109 780.8763196666666 660.990107 780.8763196666666L660.990107 780.8763196666666zM345.204757 332.9850436666668L345.204757 489.75210666666663l157.074048-78.48586L345.204757 332.9850436666668 345.204757 332.9850436666668zM347.455981 429.177975L347.455981 308.02118499999995 347.455981 429.177975Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="headset" unicode="&#59132;" d="M356.285031 2.1522690000000466L356.396571 2.1522690000000466 356.396571 285.236626 253.462201 285.236626 253.462201 2.1522690000000466ZM665.076886 285.236626l103.042841 0 0-283.08538-103.042841 0 0 283.08538ZM63.809793 301.950286c0-38.758746-3.195785-112.220874 5.457292-148.208507l65.735144 0c-10.112312 35.644825-7.747451 109.176538-7.747451 148.208507 0 219.937155 172.264389 398.231887 384.763131 398.231887 212.498742 0 384.763131-178.294732 384.763131-398.231887 0-39.031968 2.266623-112.563682-7.845689-148.208507l65.735144 0c8.653077 35.987632 5.555529 109.449761 5.555529 148.208507 0 256.20415-200.670346 463.898469-448.208115 463.898469C264.479115 765.848755 63.809793 558.1544349999999 63.809793 301.950286z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="cellphone-fine" unicode="&#58939;" d="M731.514252 896L292.485748 896C195.323702 896 116.154627 816.830925 116.154627 719.6688790000001l0-671.337759c0-97.162046 79.169075-176.331121 176.331121-176.331121l438.628661 0c97.162046 0 176.331121 79.169075 176.331121 176.331121L907.445529 719.6688790000001C907.845373 816.830925 828.676298 896 731.514252 896zM292.485748 853.216712l438.628661 0c70.772355 0 128.349863-55.178446 133.147989-124.751269L159.737602 728.465443C164.135884 798.038266 222.113237 853.216712 292.485748 853.216712zM865.062085 48.73096399999997c0-73.571261-59.976572-133.547833-133.547833-133.547833L292.485748-84.816868c-73.571261 0-133.547833 59.976572-133.547833 133.547833l0 45.582194 705.724326 0L864.662241 48.73096399999997zM865.062085 137.096447L158.937915 137.096447 158.937915 685.682155l705.724326 0L864.662241 137.096447zM512-54.82858299999998c13.59469 0 26.789535 5.597813 36.385787 15.194065 9.596251 9.596251 15.194065 22.791097 15.194065 36.385787 0 13.59469-5.597813 26.789535-15.194065 36.385787-9.596251 9.596251-22.791097 15.194065-36.385787 15.194065-13.59469 0-26.789535-5.597813-36.385787-15.194065-9.596251-9.596251-15.194065-22.791097-15.194065-36.385787 0-13.59469 5.597813-26.789535 15.194065-36.385787C485.210465-49.23076900000001 498.40531-54.82858299999998 512-54.82858299999998z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="add-1" unicode="&#58964;" d="M566.935 57.63900000000001c0-30.366-24.612-54.972-54.935-54.972v0c-30.384 0-54.996 24.612-54.996 54.972v610.057c0 30.361 24.612 54.972 54.996 54.972v0c30.33 0 54.935-24.612 54.935-54.972v-610.057zM817.004 417.633c30.384 0 54.996-24.606 54.996-54.966v0c0-30.354-24.612-54.966-54.996-54.966h-610.062c-30.33 0-54.942 24.612-54.942 54.966v0c0 30.359 24.612 54.966 54.942 54.966h610.062zM817.004 417.633z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="face-smile-b" unicode="&#58960;" d="M511.931733-128c-136.738133 0-265.284267 53.213867-361.984 149.879467C53.282133 118.51093300000002 0 247.09119999999996 0 384c0 136.738133 53.282133 265.3184 150.050133 362.0864C246.749867 842.683733 375.296 896 512.136533 896s265.4208-53.316267 362.1888-149.9136c199.645867-199.714133 199.543467-524.5952 0-724.206933C777.454933-74.71786699999996 648.772267-128 511.931733-128L511.931733-128 511.931733-128 511.931733-128 511.931733-128 511.931733-128zM512.034133 829.303467c-118.920533 0-230.741333-46.2848-314.914133-130.389333C113.083733 614.8778669999999 66.7648 502.8864 66.7648 384c0-118.9888 46.2848-230.912 130.3552-315.016533 84.0704-84.0704 195.857067-130.321067 314.811733-130.321067 119.022933 0 230.946133 46.318933 315.016533 130.423467 173.704533 173.636267 173.704533 456.157867 0 629.794133C742.877867 782.984533 631.057067 829.303467 512.034133 829.303467L512.034133 829.303467 512.034133 829.303467 512.034133 829.303467 512.034133 829.303467 512.034133 829.303467zM330.103467 244.25813300000004c0 0 59.904-95.9488 181.828267-95.9488s201.8304 95.9488 201.8304 95.9488 45.294933 0.136533 45.192533-47.957333c0 0-78.506667-111.8208-247.022933-111.8208s-223.368533 111.8208-223.368533 111.8208S286.856533 244.25813300000004 330.103467 244.25813300000004L330.103467 244.25813300000004 330.103467 244.25813300000004 330.103467 244.25813300000004 330.103467 244.25813300000004zM363.2128 548.590933c-34.5088 0-62.702933-28.091733-62.702933-62.737067 0-34.679467 28.194133-62.6688 62.702933-62.6688 34.679467 0 62.702933 28.091733 62.702933 62.6688C425.915733 520.4992 397.858133 548.590933 363.2128 548.590933L363.2128 548.590933 363.2128 548.590933 363.2128 548.590933 363.2128 548.590933 363.2128 548.590933zM684.544 548.590933c-34.679467 0-62.702933-28.091733-62.702933-62.737067 0-34.679467 28.023467-62.6688 62.702933-62.6688 34.6112 0 62.600533 28.091733 62.600533 62.6688C747.144533 520.4992 719.121067 548.590933 684.544 548.590933L684.544 548.590933 684.544 548.590933 684.544 548.590933 684.544 548.590933 684.544 548.590933zM684.544 548.590933"  horiz-adv-x="1025" />
+
+    
+    <glyph glyph-name="fonts-html" unicode="&#58955;" d="M194.33 416.235h-101.295v101.28h-46.035v-267.03h46.035v119.7h101.28v-119.7h46.035v267.03h-46.035v-101.28zM277.205 480.69h73.665v-230.205h46.035v230.205h73.665v36.825h-193.365v-36.825zM627.815 335.58000000000004l-46.755 181.935h-73.665v-267.03h46.035v211.785l46.035-211.785h55.245l46.83 213.93-0.795-213.93h46.035v267.03h-73.665l-45.3-181.935zM848.09 287.30999999999995v230.205h-46.035v-267.03h174.945v36.825h-128.91z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="screen-full" unicode="&#58914;" d="M641.750109 511.899972l205.227128 204.519-0.704035-115.89966c-0.282433-9.611915 7.489578-18.09103 17.101493-17.808598l12.297071 0c9.611915 0.283456 17.667382 5.936199 17.808598 15.689331l0.565888 172.57752c0 0.14224 0.282433 9.187243 0.282433 9.187243 0.14224 4.804423-0.99056 9.187243-4.100388 12.297071-3.109828 3.109828-7.347339 5.086855-12.297071 4.946662l-8.763594-0.14224c-0.141216 0-0.278339 0-0.420579-0.14224L697.581696 797.833213c-9.611915-0.283456-17.667382-8.200776-17.808598-17.950837l0-12.297071c1.416256-11.44875 10.458189-18.092054 20.070104-17.808598l112.789832-0.283456-204.66124-203.814965c-9.329483-9.329483-9.329483-24.449855 0-33.778314 9.329483-9.470699 24.452925-9.470699 33.782408 0L641.750109 511.899972zM383.095141 319.11010699999997L177.726797 115.29411900000002l0.707105 115.338888c0.283456 9.607822-7.492648 18.086937-17.104563 17.808598l-13.001105 0c-9.611915-0.283456-17.667382-5.937223-17.808598-15.690354l-0.565888-172.718737c0-0.14224-0.282433-9.187243-0.282433-9.187243-0.14224-4.808516 0.99056-9.187243 4.096295-12.297071 3.109828-3.109828 7.351432-5.086855 12.297071-4.946662l8.762571 0.14224c0.14224 0 0.283456 0 0.425695 0.14224l171.873486-0.708128c9.607822 0.283456 17.667382 8.196683 17.808598 17.950837L344.93503 63.42477399999996c-1.415232 11.44875-10.461259 18.092054-20.074198 17.808598L212.069977 81.51682800000003 416.59 285.32872299999997c9.329483 9.329483 9.329483 24.453948 0 33.782408C407.40685 328.58182999999997 392.424624 328.58182999999997 383.095141 319.11010699999997L383.095141 319.11010699999997zM894.047276 60.03251399999999l-0.424672 172.718737c-0.283456 9.612938-8.200776 15.406898-17.809621 15.690354l-12.296047 0c-9.612938 0.278339-17.243733-8.200776-17.105586-17.808598l0.708128-115.903753L641.750109 319.11010699999997c-9.329483 9.329483-24.452925 9.329483-33.782408 0-9.325389-9.328459-9.325389-24.452925 0-33.782408L812.490795 81.51682800000003l-112.789832-0.283456c-9.611915 0.283456-18.515702-6.502088-20.073174-17.808598l0-12.297071c0.282433-9.611915 8.200776-17.667382 17.808598-17.950837l171.166381 0.708128c0.141216 0 0.282433-0.14224 0.424672-0.14224l8.763594-0.14224c4.803399-0.141216 9.187243 1.694595 12.296047 4.946662 3.109828 3.109828 4.238534 7.488555 4.097318 12.297071 0 0-0.14224 9.046027-0.14224 9.187243L894.047276 60.03149099999996zM212.216309 749.493252l112.789832 0.283456c9.607822-0.283456 18.512632 6.502088 20.070104 17.808598L345.076246 779.883399c-0.283456 9.611915-8.196683 17.667382-17.808598 17.950837l-172.011632-0.708128c-0.14224 0-0.283456 0.14224-0.425695 0.14224l-8.761548 0.14224c-4.808516 0.141216-9.187243-1.694595-12.297071-4.946662-3.109828-3.109828-4.242627-7.488555-4.096295-12.297071 0 0 0.282433-9.046027 0.282433-9.187243l0.420579-172.718737c0.14224-9.608845 8.200776-15.406898 17.808598-15.686261l13.005198 0c9.611915-0.282433 17.242709 8.196683 17.10047 17.808598l-0.564865 115.334795 205.231221-203.958228c9.324366-9.329483 24.448832-9.329483 33.777291 0 9.329483 9.329483 9.329483 24.452925 0 33.782408L212.216309 749.493252 212.216309 749.493252zM212.216309 749.493252"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="form" unicode="&#58940;" d="M314.278111 437.019389l395.439892 0 0-30.297458-395.439892 0L314.278111 437.019389zM314.278111 315.83495200000004l395.439892 0 0-30.297458-395.439892 0L314.278111 315.83495200000004zM314.278111 194.62833l263.626661 0 0-30.297458L314.278111 164.330872 314.278111 194.62833zM609.376235 739.9931730000001c-7.849678 42.966669-48.394988 75.742447-97.378777 75.742447-48.961604 0-89.51311-32.775778-97.380776-75.742447L116.55177 739.9931730000001l0-787.725922 790.893774 0 0 787.725922L609.376235 739.9931730000001zM446.091342 670.440529l0 17.613058 0 36.791056c0 33.410348 29.57295 60.594317 65.906116 60.594317 36.352353 0 65.907115-27.183969 65.907115-60.594317l0-36.791056 0-17.621053 16.672696-8.712493c32.358061-16.929922 57.169039-42.663874 71.406386-73.213161L358.043239 588.50688c14.240345 30.555683 39.051523 56.281241 71.408385 73.213161L446.091342 670.440529zM874.489888-17.436289999999985L149.505227-17.436289999999985 149.505227 709.694715 413.138884 709.694715l0-21.641327c-51.44492-26.923746-88.727643-74.124144-98.86377-129.845165l395.44289 0c-10.102151 55.730615-47.40466 102.921419-98.859773 129.845165l0 21.641327 263.631658 0L874.489888-17.436289999999985z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="cart" unicode="&#58967;" d="M365.920994 84.618469c-39.030945 0-70.78516-31.754215-70.78516-70.78516s31.754215-70.784136 70.78516-70.784136c39.030945 0 70.784136 31.753191 70.784136 70.784136S404.951939 84.618469 365.920994 84.618469zM365.920994-5.784493999999995c-10.818393 0-19.61985 8.801457-19.61985 19.618826 0 10.818393 8.801457 19.61985 19.61985 19.61985s19.618826-8.801457 19.618826-19.61985C385.540843 3.015939000000003 376.739387-5.784493999999995 365.920994-5.784493999999995zM808.821219 84.618469c-39.030945 0-70.784136-31.754215-70.784136-70.78516s31.753191-70.784136 70.784136-70.784136 70.78516 31.753191 70.78516 70.784136S847.852164 84.618469 808.821219 84.618469zM808.821219-5.784493999999995c-10.81737 0-19.618826 8.801457-19.618826 19.618826 0 10.818393 8.801457 19.61985 19.618826 19.61985 10.818393 0 19.61985-8.801457 19.61985-19.61985C828.441069 3.015939000000003 819.640636-5.784493999999995 808.821219-5.784493999999995zM443.99107 305.940157c-14.057157-1.416256-24.305569-13.959943-22.890336-28.0171 1.328251-13.187347 12.446473-23.02132 25.423019-23.02132 0.856507 0 1.723248 0.042979 2.594081 0.130983l439.314561 44.245713c0.088004 0.007163 0.174985 0.01842 0.261966 0.026606l0.180102 0.01842c0.50449 0.051165 1.001817 0.119727 1.496074 0.198521 0.222057 0.035816 0.443092 0.076748 0.663102 0.11768 0.552585 0.103354 1.100054 0.217964 1.638313 0.355087 0.085958 0.022513 0.169869 0.047072 0.254803 0.069585 0.586354 0.156566 1.161453 0.334621 1.728364 0.530073 0.077771 0.026606 0.155543 0.051165 0.233314 0.078795 0.626263 0.222057 1.239224 0.469698 1.840928 0.737804 0.039909 0.017396 0.078795 0.035816 0.118704 0.054235 1.277086 0.577145 2.496867 1.252527 3.647063 2.020006 0.001023 0.001023 0.002047 0.001023 0.00307 0.002047 0.553609 0.369414 1.088798 0.76134 1.609661 1.170662 0.069585 0.054235 0.137123 0.10847 0.205685 0.163729 0.48607 0.38988 0.958838 0.795109 1.413186 1.218758 0.092098 0.084934 0.180102 0.173962 0.270153 0.25992 0.394996 0.378623 0.778736 0.76748 1.14815 1.169639 0.11154 0.121773 0.222057 0.243547 0.331551 0.367367 0.333598 0.3776 0.653893 0.766456 0.964978 1.163499 0.12382 0.158612 0.249687 0.314155 0.370437 0.475837 0.322341 0.432859 0.629333 0.876973 0.925069 1.329275 0.113587 0.173962 0.224104 0.348947 0.333598 0.525979 0.296759 0.479931 0.580215 0.968048 0.845251 1.467421 0.069585 0.130983 0.134053 0.265036 0.201591 0.397043 0.289596 0.568958 0.563842 1.147126 0.811482 1.738597 0.00307 0.007163 0.005117 0.014326 0.008186 0.021489 0.569982 1.369184 1.019213 2.796696 1.345648 4.26514 0 0.001023 0 0.002047 0.001023 0.00307l0.00307 0.013303c0.035816 0.162706 0.075725 0.323365 0.10847 0.487094l56.17951 252.734118c0.895393 4.030803 0.780783 8.04728-0.165776 11.794627 0.50449 2.003634 0.774643 4.101411 0.774643 6.261611 0 14.128789-11.452843 25.582655-25.582655 25.582655L195.47502 616.098125l-52.358485 159.553902c-3.631714 11.067057-14.093996 17.972327-25.177426 17.590634-0.207731 0.005117-0.413416 0.01535-0.62217 0.01535L54.663994 793.258011c-14.128789 0-25.582655-11.453866-25.582655-25.582655s11.453866-25.582655 25.582655-25.582655l45.614897 0 197.955514-603.235934c3.536546-10.776438 13.546527-17.613146 24.303522-17.613146 2.067079 0 4.16281 0.26299 6.245238 0.788969l567.583946 0c14.129812 0 25.582655 11.453866 25.582655 25.582655s-11.452843 25.582655-25.582655 25.582655L340.816223 173.1979 212.265428 564.933839l701.224666 0-48.137347-216.557174L443.99107 305.940157z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="camera-fill" unicode="&#58973;" d="M512 480C436.515555 480 375.111111 419.712 375.111111 345.6 375.111111 271.48800000000006 436.515555 211.20000000000005 512 211.20000000000005 587.484446 211.20000000000005 648.888887 271.48800000000006 648.888887 345.6 648.888887 419.712 587.484446 480 512 480M512 172.79999999999995C414.808889 172.79999999999995 336 250.15679999999998 336 345.6 336 441.0432 414.808889 518.4 512 518.4 609.210667 518.4 688 441.0432 688 345.6 688 250.15679999999998 609.210667 172.79999999999995 512 172.79999999999995M903.111113 691.2L723.767113 691.2C713.383113 691.2 703.448887 695.2512 696.115554 702.4512L640.792887 756.7488C633.459554 763.9488 623.505779 768 613.141333 768L512 768 410.878222 768C400.494222 768 390.56 763.9488 383.226667 756.7488L327.904 702.4512C320.570667 695.2512 310.616889 691.2 300.252445 691.2L120.888889 691.2C77.866667 691.2 42.666667 656.64 42.666667 614.4L42.666667 76.79999999999995C42.666667 34.559999999999945 77.866667 0 120.888889 0L903.111113 0C946.133333 0 981.333333 34.559999999999945 981.333333 76.79999999999995L981.333333 614.4C981.333333 656.64 946.133333 691.2 903.111113 691.2"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="tabs" unicode="&#58922;" d="M310.30303 523.636364L124.121212 523.636364c-17.128727 0-31.030303-13.901576-31.030303-31.030303l0-186.181818c0-17.128727 13.901576-31.030303 31.030303-31.030303l186.181818 0c17.128727 0 31.030303 13.901576 31.030303 31.030303L341.333333 492.606061C341.333333 509.734788 327.431758 523.636364 310.30303 523.636364zM294.787879 306.42424200000005L139.636364 306.42424200000005c-17.128727 0-15.515152-1.613576-15.515152 15.515152L124.121212 477.090909c0 17.128727-1.613576 15.515152 15.515152 15.515152l155.151515 0c17.128727 0 15.515152 1.613576 15.515152-15.515152l0-155.151515C310.30303 304.81066699999997 311.916606 306.42424200000005 294.787879 306.42424200000005zM418.909091 352.969697l480.969697 0 0 31.030303L418.909091 384 418.909091 352.969697zM418.909091 228.84848499999998l480.969697 0 0 31.030303L418.909091 259.878788 418.909091 228.84848499999998zM418.909091 89.21212100000002l480.969697 0 0 31.030303L418.909091 120.24242400000003 418.909091 89.21212100000002zM418.909091 492.606061l480.969697 0 0 31.030303L418.909091 523.636364 418.909091 492.606061zM992.969697 725.333333l-15.515152 0L977.454545 849.454545c0 17.128727-13.901576 31.030303-31.030303 31.030303L775.757576 880.484848c-17.128727 0-31.030303-13.901576-31.030303-31.030303l0-124.121212-139.636364 0L605.090909 849.454545c0 17.128727-13.901576 31.030303-31.030303 31.030303L403.393939 880.484848c-17.128727 0-31.030303-13.901576-31.030303-31.030303l0-124.121212-124.121212 0L248.242424 849.454545c0 17.128727-13.901576 31.030303-31.030303 31.030303L31.030303 880.484848C13.901576 880.484848 0 866.583273 0 849.454545l0-946.424242c0-17.128727 13.901576-31.030303 31.030303-31.030303l961.939394 0c17.128727 0 31.030303 13.901576 31.030303 31.030303L1024 694.30303C1024 711.431758 1010.098424 725.333333 992.969697 725.333333zM992.969697-65.939394c0-17.128727-13.901576-31.030303-31.030303-31.030303L62.060606-96.969697c-17.128727 0-31.030303 13.901576-31.030303 31.030303L31.030303 818.424242c0 17.128727 13.901576 31.030303 31.030303 31.030303l124.121212 0c17.128727 0 31.030303-13.901576 31.030303-31.030303l0-124.121212 744.727273 0c17.128727 0 31.030303-13.901576 31.030303-31.030303L992.969697-65.939394z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="heart-fill" unicode="&#59023;" d="M729.068827 776.44202c-94.686523 0-176.905082-48.314379-217.069851-118.640074-40.163745 70.325695-122.382305 118.640074-217.044268 118.640074-143.767358 0-229.665727-123.660414-229.665727-243.219417 0-283.128359 415.870616-527.841803 433.576883-538.126031 4.062526-2.363837 8.584516-3.538593 13.132088-3.538593 4.547573 0 9.070586 1.174756 13.132088 3.538593 17.706267 10.283204 433.576883 254.997672 433.576883 538.126031C958.708971 652.781606 872.811626 776.44202 729.068827 776.44202z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="fonts-code" unicode="&#58958;" d="M270 626c-12 12-32 12-44 0L9 409c-12-12-12-32 0-44l217-217c6-6 14-9 22-9s16 3 22 9c12 12 12 32 0 44L75 387 270 582C282 595 282 614 270 626zM1015 409L798 626c-12 12-32 12-44 0-12-12-12-32 0-44l195-195L754 192c-12-12-12-32 0-44 6-6 14-9 22-9s16 3 22 9l217 217C1027 377 1027 397 1015 409zM624 696L624 696c-16 6-34-3-40-19L382 119c-6-16 2-34 19-40l0 0c16-6 34 3 40 19l202 558C648 672 640 690 624 696z"  horiz-adv-x="1025" />
+
+    
+    <glyph glyph-name="ios" unicode="&#59008;" d="M821.235026 351.984884c-1.287001 129.729651 105.791442 191.891776 110.553344 194.980577-60.102924 88.030835-153.796561 100.12864-187.258574 101.54434-79.794032 7.979403-155.598362-46.975519-196.010178-46.975519-40.411816 0-102.831341 45.688518-168.983167 44.530218-86.872534-1.287001-167.052666-50.57912-211.840284-128.442651-90.347436-156.756662-23.166009-388.931554 64.864826-515.958505 42.985817-62.162125 94.337137-132.046252 161.647264-129.600951 64.864826 2.574001 89.317835 41.956217 167.696167 41.956217s100.38604-41.956217 169.111867-40.669216c69.755428 1.287001 114.028245 63.449125 156.756662 125.86865 49.42082 72.200729 69.755428 142.084856 70.913728 145.559758C957.14228 145.550002 822.522026 197.030023 821.235026 351.984884L821.235026 351.984884 821.235026 351.984884zM692.277575 732.550935c35.778614 43.371917 59.845524 103.474841 53.281821 163.449065-51.48002-2.059201-113.899545-34.234214-150.83646-77.477431C561.647023 780.041254 532.560811 718.78003 540.411514 660.092806 597.811737 655.588305 656.49896 689.307718 692.277575 732.550935L692.277575 732.550935 692.277575 732.550935z"  horiz-adv-x="1084" />
+
+    
+    <glyph glyph-name="at" unicode="&#59015;" d="M514.162246 831.556269c-246.201331 0-446.51045-200.783932-446.51045-447.571618 0-246.772336 201.037712-447.539896 448.157973-447.539896 50.29857 0 99.615788 8.224312 146.523121 24.436552 18.414395 6.370081 31.060413 12.423961 31.472805 12.630668 7.194866 3.217275 12.614296 9.049097 15.213493 16.401552 2.63092 7.305383 2.155083 15.133675-1.299599 22.043039l-2.883677 5.831822c-7.131421 14.262842-24.974811 20.569478-40.156582 13.850449-0.031722-0.031722-5.8001-3.02694-20.094664-8.082072-41.075511-14.627139-84.21196-22.059412-128.235616-22.059412-210.92592 0-382.487298 171.57775-382.487298 382.487298S305.423131 766.487298 516.349051 766.487298c210.894198 0 382.455575-171.5931 382.455575-382.423853-0.887206-51.868321-13.882172-100.486622-36.606733-136.855948-20.664645-33.104979-46.939055-51.994188-72.199369-51.994188-0.317225 0-0.601704 0-0.887206 0-45.829791 0.792039-75.433016 68.586075-75.433016 172.718737l0 185.269587c0 5.53097-1.426489 9.635451-4.373611 12.550851-4.944616 4.944616-12.360516 4.817726-21.267373 4.864798l-2.472308-0.016373-9.223059 0.016373c-7.701402-0.031722-13.469779 0.063445-17.495466-3.945869-3.645017-3.613294-4.119831-9.096169-4.119831-13.469779l0-31.060413c-45.196365 36.100196-80.440054 59.474556-131.9758 60.378136-1.045819 0.016373-2.059915 0.031722-3.074012 0.031722-108.74368 0-198.470237-99.218746-200.657043-222.779899-2.155083-124.701117 84.845387-227.723491 193.969737-229.625818 1.045819-0.01535 2.059915-0.031722 3.074012-0.031722 63.293535 0 122.276904 34.087353 159.992901 92.103698 24.373107-60.251246 61.519122-91.216491 110.48637-92.071975 0.697895-0.01535 1.394766-0.01535 2.060939-0.01535 33.945113 0 66.716494 14.610766 94.924953 42.328038 47.63695 46.796816 76.066443 124.796284 76.066443 208.643947l0 2.883677C959.595154 630.772336 759.761873 831.556269 514.162246 831.556269zM646.73975 354.651578c0-92.230588-58.475809-167.282934-130.390699-167.282934s-130.390699 75.052347-130.390699 167.282934c0 92.246961 58.475809 167.298284 130.390699 167.298284S646.73975 446.897515 646.73975 354.651578z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="fire" unicode="&#59222;" d="M890.059904 352.19948999999997C845.890699 458.956706 840.554889 548.4951550000001 857.396326 618.42714 859.144623 625.686731 860.991676 631.9776790000001 862.858846 637.425182 863.763607 640.064841 865.906573 645.659889 866.16406 646.532651L880.890349 696.448108 833.062903 675.9309969999999C832.106692 675.5208 830.618069 674.894716 827.426684 673.550492 824.667648 672.380966 822.310677 671.354022 819.868514 670.244809 813.291441 667.2575449999999 807.049466 664.090938 800.697749 660.4128450000001 784.089623 650.795565 768.486253 638.656896 753.86285 623.033596 727.630498 595.007563 706.526618 557.766355 691.78157 509.713231 675.041103 455.157161 671.516484 411.46006 673.004574 347.939834 673.477918 327.73476900000003 673.463923 322.197583 672.83965 318.324215 673.779618 324.156339 684.455526 333.67819899999995 696.104608 329.19567600000005 693.056849 330.36844199999996 685.695898 339.012828 676.314007 361.368339 660.550914 398.92921 646.834249 460.170272 636.817284 549.350468 625.445924 650.588768 630.103925 734.7280519999999 644.646978 801.338628 647.677924 815.221065 650.899934 827.082435 654.086773 836.904609 655.91465 842.538316 657.254607 846.094657 657.880284 847.554385L678.645286 896 628.243642 880.578031C617.409833 877.263087 599.94569 869.52239 578.105438 855.845223 542.547644 833.577626 507.199569 802.385036 474.400401 760.836776 447.596676 726.883228 423.611383 687.30061 403.118547 641.7016189999999 378.907516 587.829195 363.003277 542.798944 353.158029 503.238462 349.274261 487.632585 346.433259 473.323627 344.1945 458.925156 343.334411 453.39353 342.592734 448.063234 341.804612 441.911844 341.502524 439.553997 340.356619 430.329551 340.073506 428.145504 337.596047 409.033293 335.848224 404.35337 329.235273 398.312868 336.081933 404.566848 343.232634 404.098227 346.608002 402.086756 344.852318 403.133013 341.598345 406.493651 337.991853 411.887149 327.030897 428.279226 317.980358 454.883162 313.690598 489.339595 311.250185 508.941598 310.203772 539.08627 310.370048 576.545325 310.480474 601.422138 311.113088 628.122479 312.099068 654.977888 312.481453 665.393013 312.891081 675.105466 313.30045 683.8491750000001 313.545346 689.079919 313.735044 692.813105 313.84201 694.783403L317.55517 763.179488 271.360516 712.604139C270.467691 711.626645 268.852992 709.837042 266.618705 707.326295 262.927895 703.178805 258.823678 698.493751 254.407949 693.3614689999999 241.78797 678.693606 229.164348 663.340425 217.341267 648.004036 211.724185 640.717803 206.411389 633.591345 201.450577 626.6638379999999 176.017063 591.147305 156.617347 555.4025280000001 138.122768 512.155497 90.841957 401.595812 76.97672 299.64870599999995 99.261816 188.13489300000003 126.80821 50.29373899999996 188.553235-37.64422200000001 278.8297-84.690336 344.19104-118.75233700000001 408.837235-128 507.940695-128 525.713007-128 557.977207-125.567138 590.857378-120.46215900000004 641.152493-112.65333099999998 687.496192-99.78932299999997 726.063273-80.59104400000001 738.155853-74.57148800000004 743.07901-59.88870199999997 737.059454-47.79612199999997 731.039898-35.70354299999997 716.357111-30.780384000000026 704.264531-36.79993999999999 670.855859-53.43041900000003 629.092954-65.02289699999994 583.352478-72.12456999999995 552.984316-76.83953499999996 523.228215-79.08327499999996 507.940695-79.08327499999996 416.16215-79.08327499999996 357.934257-70.75375399999996 301.436271-41.310745999999995 224.830174-1.3887230000000272 171.977796 73.88423 147.230072 197.72094500000003 126.99711 298.965952 139.514783 391.004811 183.099329 492.921284 200.282663 533.1021499999999 218.020237 565.784358 241.22153 598.183718 245.831691 604.6215589999999 250.802959 611.289899 256.082244 618.137961 267.31885 632.713596 279.402035 647.409487 291.488864 661.457681 298.732051 669.8762429999999 304.338773 676.1767130000001 307.478705 679.614406L264.997214 697.435142C264.883874 695.347445 264.688038 691.493511 264.43725 686.13688 264.020474 677.234965 263.603959 667.359281 263.215279 656.7726250000001 262.21142 629.430212 261.566827 602.224414 261.453805 576.7624579999999 261.278897 537.3588179999999 262.385015 505.49418 265.148621 483.296209 276.058157 395.668083 322.627019 326.024497 362.226031 362.19561799999997 379.341732 377.829698 384.756649 392.328523 388.584361 421.857186 397.932742 493.974714 407.332926 531.746825 447.736538 621.64966 466.587287 663.594818 488.484326 699.731218 512.795234 730.526996 542.034492 767.565749 573.156162 795.028785 604.068111 814.386984 614.696751 821.043029 624.472062 826.201428 633.124687 830.036563 638.02329 832.207788 641.258688 833.404991 642.556233 833.802016L612.91959 866.825663C608.658554 856.884484 602.686705 838.478616 596.856038 811.772799 581.186705 740.003594 576.231674 650.498985 588.206246 543.890345 607.295279 373.94226100000003 638.819345 298.82556999999997 678.537329 283.542234 701.302332 274.78234499999996 717.731637 289.43566899999996 721.133156 310.5407 722.475759 318.870999 722.489387 324.26340300000004 721.907881 349.08549100000005 720.532565 407.791853 723.691247 446.952173 738.546223 495.36355 751.151827 536.44438 768.544047 567.135763 789.576147 589.605967 809.230566 610.60429 821.725461 617.839716 852.347733 630.9761169999999L842.705318 653.453557 819.246577 660.374464C822.235501 670.505564 813.450321 644.87463 809.839253 629.8801189999999 790.647573 550.1890470000001 796.611315 450.1135 844.8591 333.498332 883.105728 241.056017 874.587669 126.06492400000002 824.002925 61.39712899999995 815.680378 50.75754500000005 817.558709 35.38570000000004 828.198295 27.063153000000057 838.837879 18.740607999999952 854.209724 20.618939999999952 862.532269 31.258523999999966 924.762731 110.81426299999998 934.658528 244.404363 890.059904 352.19948999999997Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="set" unicode="&#59158;" d="M466.496-126.62400000000002l-1.056 0.064c-25.184 2.08-47.456 22.368-51.744 47.232l-17.344 102.4c-0.672 4.064-6.624 11.04-10.56 12.416l-30.336 12.416c-5.44 2.496-15.424 0.8-17.472-0.64l-84.992-60.16c-19.584-14.016-51.456-12.736-70.08 3.168l-64.288 64c-17.952 20.48-19.488 50.592-4.736 71.296l60.416 84.672c2.176 3.072 2.784 11.52 1.024 15.04l0 0c0 0-1.664 3.104-7.264 16.608-6.176 14.848-6.816 17.44-6.816 17.44-0.992 3.04-7.456 8.672-11.36 9.376l-102.56 17.248c-25.152 4.288-45.44 26.624-47.168 52L0 428.288c2.112 27.36 22.496 49.6 47.52 53.728l102.528 17.344c4.128 0.672 11.008 6.56 12.416 10.496l12.608 30.336c2.368 4.992 1.6 14.112-0.8 17.504L113.984 642.24C99.36 662.88 100.704 692.896 117.056 712.192l64.416 64.224c20.672 18.208 51.296 18.784 71.36 4.64l84.992-60.16c1.952-1.376 13.28-2.016 15.04-1.056 0.384 0.192 2.528 1.344 16.704 7.168 14.24 5.92 16.576 6.592 16.576 6.592 3.84 1.184 9.504 7.648 10.144 11.424l17.44 102.4c4.32 25.152 26.752 45.376 52.128 47.104l90.528 0.064c27.328-2.112 49.632-22.368 53.952-47.232l17.344-102.432c0.672-4.064 6.656-11.04 10.624-12.48l30.304-12.352c6.24-2.784 15.456-0.8 17.44 0.608l85.024 60.16c19.52 14.016 51.392 12.704 70.08-3.136l64.288-64.032c17.952-20.48 19.456-50.56 4.736-71.264l-60.416-84.672c-2.208-3.136-2.848-11.616-1.056-15.04 0.16-0.352 1.376-2.56 7.232-16.672 5.856-14.112 6.592-16.512 6.592-16.512 1.248-4.032 7.712-9.6 11.648-10.304l102.56-17.248c25.152-4.224 45.44-26.592 47.168-52l0.096-90.304c-2.112-27.392-22.528-49.6-47.552-53.728l-102.528-17.376c-4.128-0.672-10.944-6.496-12.32-10.432l-12.736-30.432c-2.336-4.928-1.568-14.112 0.832-17.472l60.288-84.512c14.624-20.736 13.216-50.816-3.232-70.048l-64.192-64.096c-11.328-9.92-24.64-14.72-38.784-14.72l0 0c-11.904 0-23.52 3.552-32.704 10.016l-84.992 60.16c-1.952 1.408-13.312 2.016-15.072 1.056-0.288-0.16-2.432-1.312-16.608-7.2-14.08-5.792-16.384-6.496-16.384-6.496-4.16-1.28-9.792-7.776-10.432-11.52l-17.408-102.4c-4.352-25.152-26.72-45.344-52.032-47.104L466.496-126.62400000000002zM347.84 100.60799999999995c10.368 0 20.192-2.112 28.48-6.112l27.648-11.296c20.416-7.072 38.976-28.992 42.848-51.584l17.344-102.336c0.288-1.6 3.136-4.32 5.056-4.832l87.296 0.064c-0.032 0.064 3.04 2.944 3.328 4.672l17.408 102.368c3.872 22.656 23.328 44.832 45.28 51.584 0 0 0 0 0 0-0.096 0 2.976 1.152 12.448 5.056 9.472 3.936 12.384 5.248 13.12 5.568 18.208 9.6 49.44 8.032 67.776-4.96l84.928-60.16c0.192-0.128 1.312-0.64 3.104-0.64l0 0c2.048 0 3.52 0.672 3.872 0.96l61.536 61.408 0 0c-0.16 0 0.064 4.416-0.992 5.952l-60.224 84.448c-13.248 18.624-15.68 47.168-5.792 67.872l11.648 27.84c6.944 19.968 29.408 38.912 51.68 42.496l102.464 17.376c1.824 0.384 4.736 3.648 4.864 5.408L972.8 428.288l0 0c-0.096 0-2.88 3.072-4.576 3.424l-102.72 17.28c-23.168 4.032-44.896 22.976-51.776 45.056l0 0c-0.032 0-1.216 3.04-5.12 12.512-3.968 9.568-5.28 12.512-5.632 13.248-10.24 19.36-8.288 48.736 4.96 67.456L868.448 672c0.96 1.408 0.736 5.6-0.384 6.912l-61.408 61.184c0.704-0.8-0.768-0.192-2.848-0.192-1.728 0-2.784-0.416-3.008-0.576l-85.024-60.16c-17.824-12.8-47.776-15.36-68-5.664l-27.712 11.296c-20.512 7.2-39.04 29.088-42.88 51.584l-17.344 102.336c-0.288 1.76-3.616 4.704-5.504 4.864L467.616 843.52c0-0.064-3.104-2.944-3.392-4.672l-17.408-102.336c-3.84-22.624-23.264-44.8-45.216-51.584 0-0.032-3.008-1.184-12.416-5.088-9.568-3.936-12.512-5.248-13.248-5.568-17.984-9.568-49.344-8.032-67.744 4.992L223.264 739.36c-0.416 0.32-6.176 0.288-6.848-0.224L154.688 677.6320000000001c0 0 0 0 0 0 0.224 0 0.032-4.384 1.056-5.856L216 587.264c13.312-18.752 15.744-47.296 5.76-67.968l-11.52-27.648c-6.976-20.032-29.472-38.944-51.776-42.624L55.968 431.68c-1.824-0.384-4.704-3.648-4.832-5.408l0.096-86.56 0 0c0.096 0 2.912-3.104 4.608-3.424l102.656-17.28c23.04-4 44.704-22.912 51.712-44.928 0.256-0.736 1.44-3.84 5.088-12.64 3.68-8.832 5.024-11.84 5.472-12.736 10.592-20.288 8.672-48.96-4.672-67.904l-60.512-84.768c-0.96-1.408-0.736-5.632 0.384-6.912l61.408-61.184c-0.736 0.8 0.736 0.224 2.816 0.192 1.728 0 2.784 0.416 3.008 0.576l84.992 60.16C318.624 96.32000000000005 333.088 100.60799999999995 347.84 100.60799999999995zM512.032 133.856c-138.336 0-250.848 112.224-250.848 250.176 0 137.92 112.544 250.144 250.848 250.144s250.848-112.224 250.848-250.144C762.88 246.08000000000004 650.336 133.856 512.032 133.856zM512.032 583.136c-110.08 0-199.648-89.312-199.648-199.104s89.568-199.136 199.648-199.136 199.648 89.344 199.648 199.136S622.112 583.136 512.032 583.136z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="fonts-u" unicode="&#58950;" d="M0-49.23076900000001L945.230769-49.23076900000001 945.230769-128 0-128 0-49.23076900000001ZM0 896L407.076943 896 407.076943 834.065644 319.153861 827.872177 299.076923 809.911217 299.076923 365.841959C299.076923 281.19796199999996 317.076716 220.709337 353.076933 184.37435100000005 389.077071 148.03936499999998 448.153442 129.87210800000003 530.307702 129.87210800000003 606.000364 129.87210800000003 660.807522 149.17482299999995 694.730752 187.78072599999996 728.653982 226.38662899999997 745.61536 289.66226700000004 745.61536 377.60953099999995L745.61536 804.956475 724.153817 826.633531 633.461524 834.065644 633.461524 896 955.384596 896 955.384596 834.065644 868.846119 826.633531 849.461563 804.956475 849.461563 364.60331299999996C849.461563 246.92743900000005 819.923338 161.66533900000002 760.846178 108.81441500000005 701.76894 55.96348999999998 606.462188 29.53846199999998 474.923087 29.53846199999998 406.153531 29.53846199999998 345.807951 38.51886300000001 293.884613 56.47990200000004 241.961275 74.44093999999996 201.230887 100.143419 171.692347 133.58820400000002 149.076834 160.01362700000004 133.038474 190.25793999999996 123.57695 224.32200899999998 114.115348 258.386078 109.384625 307.21047599999997 109.384625 370.796702L109.384625 809.911217 89.307687 827.872177 0 834.065644 0 896Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="triangle-d" unicode="&#58917;" d="M773.128299 88.65234199999998M889.696178 575.195553L158.862147 575.195553 524.357446 209.64704300000005 889.696178 575.195553Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="tips" unicode="&#59138;" d="M967.280184 578.537671c-24.915459 58.887178-60.544935 111.76755-105.96745 157.161413-45.393863 45.393863-98.273211 81.051991-157.160389 105.96745-60.988026 25.803689-125.735679 38.853913-192.494129 38.853913-66.729797 0-131.504056-13.0799-192.494129-38.853913-58.887178-24.916483-111.766526-60.544935-157.160389-105.96745-45.393863-45.393863-81.051991-98.274234-105.96745-157.161413-25.803689-60.988026-38.884612-125.734656-38.884612-192.464453s13.0799-131.50508 38.884612-192.464453c24.915459-58.887178 60.544935-111.737874 105.96745-157.161413 45.393863-45.393863 98.273211-81.051991 157.160389-105.96745 60.988026-25.803689 125.735679-38.853913 192.494129-38.853913 66.729797 0 131.504056 13.0799 192.494129 38.853913 58.887178 24.916483 111.766526 60.544935 157.160389 105.96745 45.393863 45.393863 81.051991 98.274234 105.96745 157.161413 25.803689 60.988026 38.853913 125.734656 38.853913 192.464453S993.084896 517.549645 967.280184 578.537671zM511.687892-55.138552000000004c-243.302305 0-441.241446 197.909465-441.241446 441.21177S268.385587 827.284989 511.687892 827.284989c243.273652-0.029676 441.210747-197.938118 441.210747-441.21177S754.990197-55.138552000000004 511.687892-55.138552000000004zM511.657192 573.565427m-45.511543 0a44.475 44.475 0 1 1 91.023086 0 44.475 44.475 0 1 1-91.023086 0ZM542.729885 184.14011300000004c0-17.162892-13.906731-31.071669-31.070646-31.071669l0 0c-17.163915 0-31.070646 13.907755-31.070646 31.071669L480.588593 426.998303c0 17.162892 13.906731 31.071669 31.070646 31.071669l0 0c17.163915 0 31.070646-13.907755 31.070646-31.071669L542.729885 184.14011300000004z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="picture" unicode="&#58954;" d="M765.376 615.424c0 0 103.04 1.024 103.04-100.992 0 0 9.536-98.752-103.04-100.928 0 0-100.864-2.176-99.84 100.928C665.536 514.496 664.448 605.8879999999999 765.376 615.424ZM968.32 770.56c0 0 54.208-4.224 54.208-52.032l0-712.832c0 0-3.2-51.008-54.208-52.096L968.32 770.56ZM1.472 5.631999999999948c0 0 2.176-52.096 52.096-52.096L968.32-46.464000000000055l0 150.848-99.712 0-203.072 206.144-153.024-153.984L304.32 413.568l-205.056-307.072-45.632-1.024L52.48 718.4639999999999 1.472 718.4639999999999 1.472 5.631999999999948ZM968.32 770.56L53.568 770.56c0 0-52.096 1.088-52.096-52.032L968.32 718.528 968.32 770.56Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="more-vertical" unicode="&#58993;" d="M511.998465 623.681848c40.525995 0 73.386404 35.771715 73.386404 79.892585s-32.860409 79.892585-73.386404 79.892585c-40.524972 0-73.384357-35.771715-73.384357-79.892585S471.47247 623.681848 511.998465 623.681848L511.998465 623.681848zM511.998465 463.893608c-40.524972 0-73.384357-35.772738-73.384357-79.893608 0-44.12087 32.859385-79.892585 73.384357-79.892585 40.525995 0 73.386404 35.772738 73.386404 79.892585C585.384869 428.12087 552.52446 463.893608 511.998465 463.893608L511.998465 463.893608zM511.998465 144.320199c-40.524972 0-73.384357-35.733852-73.384357-79.894631 0-44.119847 32.859385-79.893608 73.384357-79.893608 40.525995 0 73.386404 35.772738 73.386404 79.893608C585.383846 108.58634600000005 552.52446 144.320199 511.998465 144.320199L511.998465 144.320199z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="bluetooth" unicode="&#59017;" d="M844.799642 221.19607699999995L538.533306 374.84141l307.696917 177.029926c10.583033 5.006014 17.398252 15.59621 17.569144 27.302833s-6.332219 22.491247-16.764825 27.804253L475.584626 830.045869c-9.517771 4.846378-20.869307 4.39817-29.974685-1.181919-9.105379-5.581112-14.656815-15.493879-14.656815-26.174126l0-288.760636L210.662931 699.284733c-12.974499 10.915607-32.339546 9.248641-43.255153-3.724835-10.915607-12.973476-9.248641-32.339546 3.724835-43.255153L430.953126 433.687656l0-102.83511L171.558307 120.428046c-13.166881-10.68127-15.181771-30.013571-4.500501-43.180452 6.068206-7.480368 14.924921-11.360745 23.859407-11.360745 6.794753 0 13.634532 2.245134 19.322068 6.859221l220.714867 179.046862 0-283.065937c0-10.689457 5.561669-20.61041 14.680351-26.188452 4.903683-2.99931 10.455119-4.510734 16.019859-4.510734 4.78498 0 9.580193 1.118474 13.980409 3.368724l371.449917 224.085638c10.664897 5.456269 17.182334 16.618493 16.691147 28.589129C863.284645 206.04091200000005 855.875908 216.63110800000004 844.799642 221.19607699999995zM763.458055 580.639542L492.351498 420.917818l0 21.60711c0.563842 3.368724 0.558725 6.801916 0 10.153244L492.351498 752.604102 763.458055 580.639542zM492.351498 18.915047999999956L492.351498 311.51001199999996c0.558725 3.347235 0.562818 6.777357 0 10.146081l0 5.809309 267.472797-137.65822L492.351498 18.915047999999956z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="flag" unicode="&#58988;" d="M878.368178 798.272211c-11.363815 4.799306-24.470321 2.360767-33.31578-6.245238-0.36532-0.350994-37.162388-35.304064-95.163383-56.05262-75.462692-26.993794-150.763702-18.409279-223.812415 25.517163-38.347376 23.060205-81.875752 40.665165-129.376603 52.327786-37.582967 9.228175-77.742619 14.777565-119.363552 16.496719-70.805626 2.925632-121.493052-6.224772-123.615389-6.615675-14.56574-2.682086-25.140587-15.380292-25.140587-30.191626L128.58047-31.312913999999978c0-16.954137 13.745049-30.699186 30.699186-30.699186s30.699186 13.745049 30.699186 30.699186L189.978842 266.68306099999995c15.562441 5.250584 47.994084 14.447037 91.40171 17.48728 35.985586 2.51938 72.440869 0.378623 108.35073-6.363941 44.847417-8.420787 89.059362-24.102954 131.409912-46.611597 46.26879-24.591071 93.776803-41.069371 141.203976-48.977481 38.270629-6.380314 76.541257-7.219425 113.740484-2.491751 64.277956 8.16803 103.877859 30.461779 105.532545 31.406291 9.56689 5.464455 15.471366 15.637142 15.471366 26.656103L897.089565 769.958352C897.091612 782.298402 889.73711 793.470859 878.368178 798.272211zM835.69324 257.496841c-14.58416-5.755074-38.82526-13.530155-70.319555-17.225313-30.990828-3.635807-62.940494-2.676969-94.952582 2.851954-40.201607 6.943133-80.731696 21.171182-120.464629 42.289152-48.455595 25.753547-99.208513 43.61945-150.848637 53.101405-29.29214 5.378497-58.896388 8.079002-88.407516 8.079002-12.228509 0-24.443715-0.464581-36.609803-1.39272-34.879392-2.663666-63.618946-8.741082-84.111676-14.355963L189.978842 766.569162c19.971867 2.003634 50.446949 3.910053 86.392626 2.334161 58.186214-2.554172 143.250588-15.041578 218.064504-60.029188 61.32674-36.877909 119.196753-49.491181 169.691797-49.488111 42.293245 0.002047 79.416747 8.854669 109.019972 19.711947 24.269753 8.901741 45.327348 19.747763 62.544475 30.179346L835.692217 257.496841z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="loading" unicode="&#58941;" d="M511.999488 756.654348m-70.608128 0a69 69 0 1 1 141.216255 0 69 69 0 1 1-141.216255 0ZM236.047576 639.997442m-68.561515 0a67 67 0 1 1 137.123031 0 67 67 0 1 1-137.123031 0ZM125.530506 382.12428m-62.421678 0a61 61 0 1 1 124.843356 0 61 61 0 1 1-124.843356 0ZM227.861126 100.71507499999996m-54.235229 0a53 53 0 1 1 108.470457 0 53 53 0 1 1-108.470457 0ZM514.166851-16.84438799999998m-47.192835 0a46.118 46.118 0 1 1 94.385671 0 46.118 46.118 0 1 1-94.385671 0ZM804.730553 91.450061m-33.834596 0a33.064 33.064 0 1 1 67.669192 0 33.064 33.064 0 1 1-67.669192 0ZM935.55411 383.395226m-23.969924 0a23.424 23.424 0 1 1 47.939849 0 23.424 23.424 0 1 1-47.939849 0ZM856.723717 634.80007m-17.135262 0a16.745 16.745 0 1 1 34.270525 0 16.745 16.745 0 1 1-34.270525 0Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="fonts-i" unicode="&#58948;" d="M897.948 834.255l0-64.322-128.65 0L447.674-1.9329999999999927l128.65 0 0-64.32L126.052-66.25300000000004l0 64.32 128.65 0 321.622 771.866-128.65 0L447.674 834.255 897.948 834.255z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="refresh-1" unicode="&#58982;" d="M688.146 736l-192 128v-256l192 128.001zM496.146 767.7090000000001c-231.174-8.416-416-198.479-416-431.709 0-238.587 193.413-432 432-432 233.23 0 423.293 184.826 431.709 416h-64.05c-8.377-195.817-169.778-352-367.658-352-203.241 0-368 164.759-368 368 0 197.88 156.183 359.282 352 367.658v64.051z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="rmb" unicode="&#58974;" d="M511.998465 896C229.23338 896 0.004605 666.769178 0.004605 384.001023c0-282.773272 229.227752-512.001023 511.99386-512.001023 282.769178 0 511.994883 229.227752 511.994883 512.001023C1023.994372 666.769178 794.767644 896 511.998465 896zM511.998465-91.59690499999999c-262.660188 0-475.589742 212.930577-475.589742 475.597929 0 262.663258 212.929554 475.594859 475.589742 475.594859 262.663258 0 475.590765-212.9316 475.590765-475.594859C987.590254 121.33469500000001 774.662747-91.59690499999999 511.998465-91.59690499999999zM738.742652 301.137781L544.432155 301.137781l0 69.780273 194.310497 0c17.835204 0 32.249495 14.43885 32.249495 32.220842 0 17.784038-14.414291 32.19526-32.249495 32.19526L589.7462 435.334155l149.620669 209.579249c8.916067 15.397688 3.63069 35.099403-11.82021 43.988864-15.398712 8.891508-35.097356 3.629667-44.017516-11.793604L512.187777 437.098335 340.84334 677.108664c-8.864902 15.423271-28.617781 20.685111-44.016493 11.793604-15.395642-8.889461-20.685111-28.590152-11.82021-43.988864l149.622716-209.579249L285.628808 435.334155c-17.781992 0-32.245402-14.411221-32.245402-32.19526 0-17.781992 14.46341-32.220842 32.245402-32.220842l194.310497 0 0-69.780273L285.628808 301.137781c-17.781992 0-32.245402-14.413268-32.245402-32.19526s14.46341-32.220842 32.245402-32.220842l194.310497 0 0-132.435265c0-17.780969 14.46341-32.19526 32.248472-32.19526 17.835204 0 32.245402 14.414291 32.245402 32.19526L544.433178 236.72065499999997l194.310497 0c17.835204 0 32.249495 14.43885 32.249495 32.220842S756.577856 301.137781 738.742652 301.137781"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="addition" unicode="&#58916;" d="M544 768L480 768 480 416 128 416 128 352 480 352 480 0 544 0 544 352 895.936 352 895.936 416 544 416Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="home" unicode="&#59022;" d="M824.084343-40.42033900000001H232.898863c-74.604138 0-85.85232 28.334325-85.852321 49.997718l-0.584307 5.314029V447.645552h48.806589v-402.916582c0-25.547863 13.548574-36.343743 37.629015-36.343743h568.020898c25.928532 0 27.978215 6.220678 27.978215 37.84391V447.585177l48.806589 0.118704c0.022513-14.346753 0-382.76666 0-433.098999 0-38.130436-12.726859-54.765301-51.858088-54.765301l-1.76111-0.25992zM1012.470921 493.103884C849.773422 615.120868 687.101505 737.137853 524.404006 859.153814c-6.207375 4.659113-18.433838 4.659113-24.641213 0C337.077573 737.137853 174.393377 615.120868 11.696902 493.103884c-24.856108-18.635429-0.572028-61.044308 24.642236-42.13361A15995638.709915 15995638.709915 0 0 1 512.025071 807.737794c0.988514-0.715291 1.644453-1.144056 2.823302-2.037403 18.040888-13.524015 36.057217-27.036773 54.073546-40.560788 58.291614-43.718711 116.583229-87.437421 174.874843-131.143852 81.33647-61.008492 162.696476-122.015961 244.033969-183.024454 25.212218-18.911722 49.496298 23.497157 24.64019 42.132587z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="time" unicode="&#59021;" d="M511.98464 829.44c-118.97856 0-230.83008-46.35136-314.95168-130.4832C112.90624 614.84032 66.56 502.95808 66.56 384.00512c0-118.9632 46.34624-230.84544 130.47296-314.9568C281.15456-15.093759999999975 393.00608-61.440000000000055 511.98464-61.440000000000055c118.98368 0 230.84032 46.34624 314.9824 130.48832C911.09376 153.15967999999998 957.44 265.02144 957.44 384.00512c0 118.97856-46.34624 230.8352-130.47296 314.95168C742.82496 783.0886399999999 630.96832 829.44 511.98464 829.44z m275.58912-721.02912c-73.61024-73.63584-171.47904-114.18624-275.58912-114.18624s-201.97376 40.5504-275.57888 114.18624c-73.63584 73.61024-114.16064 171.47904-114.16064 275.59424 0 104.11008 40.54528 201.97376 114.18112 275.58912 73.60512 73.63072 171.47392 114.176 275.584 114.176s201.97376-40.54528 275.584-114.176c73.63584-73.61536 114.18112-171.47904 114.18112-275.58912 0-104.1152-40.56576-201.984-114.2016-275.59424zM519.1168 340.20863999999995V628.08064a27.8528 27.8528 0 0 1-27.84256 27.84768 27.8528 27.8528 0 0 1-27.84256-27.84768v-306.23232a27.81184 27.81184 0 0 1 16.88064-25.58976M734.70464 321.84831999999994a31.0784 31.0784 0 0 0-31.07328-31.0784H496.44544a31.08864 31.08864 0 0 0-31.07328 31.0784 31.09376 31.09376 0 0 0 31.07328 31.0784h207.18592a31.08864 31.08864 0 0 0 31.07328-31.0784z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="user" unicode="&#59248;" d="M611.2 342.4c70.4 54.4 115.2 140.8 115.2 230.4 0 156.8-128 288-284.8 288s-284.8-128-284.8-284.8c0-92.8 44.8-182.4 115.2-236.8C108.8 272 0 105.60000000000002 0-80c0-9.6 9.6-19.2 19.2-19.2h848c9.6 0 19.2 9.6 19.2 19.2 0 188.8-112 355.2-275.2 422.4z m-576-396.8C44.8 115.20000000000005 156.8 268.79999999999995 320 320c6.4 3.2 12.8 9.6 12.8 16s-3.2 16-9.6 19.2c-76.8 41.6-128 131.2-128 224 0 134.4 112 246.4 246.4 246.4s246.4-112 246.4-249.6c0-89.6-51.2-176-128-220.8-6.4-3.2-9.6-9.6-9.6-19.2 0-6.4 6.4-12.8 12.8-16 160-51.2 275.2-204.8 281.6-377.6H35.2zM812.8 361.6c54.4 41.6 86.4 108.8 86.4 176 0 89.6-54.4 172.8-134.4 208-9.6 3.2-22.4 0-25.6-9.6-3.2-9.6 0-22.4 9.6-25.6 67.2-28.8 112-99.2 112-172.8 0-67.2-38.4-131.2-96-163.2-6.4-3.2-9.6-9.6-9.6-19.2 0-6.4 6.4-12.8 12.8-16 131.2-41.6 217.6-160 217.6-297.6 0-9.6 9.6-19.2 19.2-19.2s19.2 9.6 19.2 19.2c-3.2 140.8-86.4 262.4-211.2 320z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="notice" unicode="&#58983;" d="M544 798.976V864h-64v-65.024C289.536 786.304 160 658.624 160 416v-288h64V416c0 192 115.456 320 288 320 180.544 0 288-128 288-320v-288h64V416c0 242.88-122.496 370.56-320 382.976zM672 64a160 160 0 1 0-320 0h64a96 96 0 0 1 192 0h64zM64 128h896v-64H64v64z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="chrome" unicode="&#59018;" d="M515.436 583.685H914.285C840.842 730.955 688.748 832.132 513 832.132c-141.284 0-267.274-65.395-349.42-167.546l151.66-262.682c8.535 102.325 95.704 181.781 200.196 181.781zM514.218 550.803c-91.476 0-165.631-74.155-165.631-165.631s74.155-165.631 165.631-165.631c52.7 0 99.615 24.642 129.95 62.999l1.428 2.474 0.355-0.205c21.252 27.852 33.898 62.624 33.898 100.363 0 84.774-63.702 154.626-145.841 164.413l-6.393 0.632c-4.424 0.354-8.882 0.586-13.397 0.586zM929.561 549.585H627.443c52.209-36.066 86.506-96.297 86.506-164.413 0-45.547-18.268-81.598-41.12-121.192L483.898-63.257c9.624-0.617 19.322-0.966 29.102-0.966 247.521 0 448.177 200.656 448.177 448.177 0 58.508-11.225 114.391-31.616 165.631zM514.218 185.441c-83.583 0-144.927 54.804-185.034 124.651l-0.235-0.136-187.482 324.727C93.081 563.124 64.823 476.84 64.823 383.954c0-225.02 165.839-411.288 381.958-443.298l152.278 263.752c-25.769-12.143-54.518-18.967-84.841-18.967z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="edge" unicode="&#59019;" d="M854.794 669.297C797.923 743.783 683.626 823.59 548.62 830.822 136.707 852.889 85.742 435.448 85.742 435.448c55.449 53.038 58.01 97.116 163.936 154.293C673.983 818.768 676.394 476.432 676.394 476.432H346.111c-7.232 65.092 62.681 137.417 62.681 137.417-202.509-98.844-216.974-284.477-216.974-284.477s-28.93-279.655 219.385-364.034 452.029 42.189 452.029 42.189V193.16c-59.065-32.546-102.292-54.405-153.087-63.887-361.623-67.503-364.034 188.044-364.034 188.044h585.83c0 0.001 39.075 199.761-77.147 351.98z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="login-weibo" unicode="&#58997;" d="M411.270737 288.350316c-17.973895 7.504842-41.189053-0.229053-52.264421-17.542737-11.223579-17.394526-5.955368-38.103579 11.870316-46.201263 18.108632-8.232421 42.132211-0.417684 53.342316 17.421474C435.253895 260.05557899999997 429.446737 280.62989500000003 411.270737 288.350316zM455.545263 306.64757899999995c-6.885053 2.721684-15.508211-0.579368-19.550316-7.329684-3.920842-6.790737-1.751579-14.524632 5.146947-17.367579 7.019789-2.883368 16.006737 0.458105 20.048842 7.370105C465.071158 296.259368 462.551579 304.087579 455.545263 306.64757899999995zM427.52 426.684632c-115.968-11.439158-203.924211-82.216421-196.378947-158.073263 7.531789-75.910737 107.654737-128.161684 223.649684-116.749474 115.994947 11.439158 203.924211 82.216421 196.392421 158.140632C643.664842 385.859368 543.541895 438.110316 427.52 426.684632zM529.300211 247.70021099999997c-23.673263-53.355789-91.769263-81.798737-149.530947-63.232-55.754105 17.933474-79.373474 72.811789-54.945684 122.246737 23.956211 48.464842 86.352842 75.870316 141.541053 61.561263C523.506526 353.562947 552.663579 299.85684200000003 529.300211 247.70021099999997zM512 896C229.241263 896 0 666.772211 0 384c0-282.758737 229.241263-512 512-512 282.772211 0 512 229.241263 512 512C1024 666.772211 794.772211 896 512 896zM455.531789 101.02568399999996c-145.354105 0-293.941895 70.197895-293.941895 185.667368 0 60.362105 38.386526 130.182737 104.474947 196.069053 88.252632 87.929263 191.164632 127.986526 229.874526 89.397895 17.084632-17.003789 18.741895-46.457263 7.760842-81.623579-5.726316-17.690947 16.666947-7.895579 16.666947-7.936 71.343158 29.763368 133.564632 31.514947 156.321684-0.862316 12.139789-17.246316 10.954105-41.472-0.215579-69.510737-5.173895-12.921263 1.589895-14.928842 11.466105-17.879579 40.178526-12.422737 84.924632-42.455579 84.924632-95.380211C772.837053 211.36168399999997 646.090105 101.02568399999996 455.531789 101.02568399999996zM718.672842 468.197053c4.715789 14.457263 1.765053 30.962526-9.202526 43.061895-10.954105 12.072421-27.136 16.666947-42.037895 13.527579l0 0.026947c-12.463158-2.694737-24.724211 5.268211-27.392 17.664-2.667789 12.463158 5.281684 24.697263 17.744842 27.338105 30.531368 6.467368 63.595789-2.937263 85.989053-27.715368 22.447158-24.764632 28.456421-58.489263 18.849684-88.064-3.907368-12.099368-16.936421-18.728421-29.062737-14.848-12.139789 3.920842-18.782316 16.922947-14.874947 28.995368L718.672842 468.183579zM853.261474 424.865684c-0.013474-0.013474-0.013474-0.080842-0.013474-0.107789-4.567579-14.026105-19.712-21.706105-33.778526-17.165474-14.133895 4.554105-21.854316 19.590737-17.300211 33.670737l0 0.013474c13.999158 43.169684 5.12 92.429474-27.567158 128.565895-32.714105 36.122947-80.949895 49.92-125.507368 40.488421-14.484211-3.085474-28.752842 6.130526-31.838316 20.574316-3.098947 14.403368 6.144 28.631579 20.641684 31.717053l0.026947 0c62.625684 13.271579 130.519579-6.117053 176.545684-56.966737C860.483368 554.886737 872.892632 485.618526 853.261474 424.865684z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="voice" unicode="&#59016;" d="M463.380164 644.0568969999999v-0.003069c-4.550643 4.549619-10.484795 7.02295-16.913205 7.02295s-12.365632-2.473331-16.915251-7.02295c-4.549619-4.551666-7.020904-10.485819-7.020904-16.914229s2.471284-12.365632 7.020904-16.915251c60.437487-60.438511 93.675496-140.756791 93.675496-226.222301 0-85.464487-33.238009-165.783791-93.675496-226.220255-4.549619-4.551666-7.020904-10.487865-7.020904-16.915252 0-6.429433 2.471284-12.365632 7.020904-16.914228 4.550643-4.549619 10.486842-7.02295 16.915251-7.02295s12.364609 2.473331 16.913205 7.02295c35.114752 35.116799 62.317301 76.06849 80.814584 121.668037 17.904789 44.018539 26.90579 90.608647 26.90579 138.384768s-9.101285 94.26799-26.90579 138.384767c-18.59552 45.697785-45.698808 86.550215-80.814584 121.667013zM781.892405 618.929614v-0.002047c-31.358195 77.452-77.550237 146.990772-137.098471 206.539007-4.550643 4.549619-10.485819 7.02295-16.915252 7.02295-6.42841 0-12.363585-2.473331-16.914228-7.02295-9.29776-9.299807-9.29776-24.531719 0-33.82948 54.997592-54.998615 97.631598-119.195729 126.613676-190.71153 27.993564-69.044516 42.237987-142.045133 42.237987-216.924541s-14.244422-147.882072-42.237987-216.923518c-28.982078-71.517847-71.616084-135.616724-126.613676-190.711529-9.29776-9.298783-9.29776-24.531719 0-33.82948 4.551666-4.551666 10.485819-7.02295 16.914228-7.02295 6.429433 0 12.366655 2.471284 16.915252 7.02295 59.547211 59.547211 105.740276 129.085984 137.098471 206.53696 30.369681 74.78117 45.699832 153.817248 45.699831 234.928591 0 81.111343-15.331173 160.146397-45.699831 234.927567zM299.474141 427.621497c-11.670807 11.573593-27.103288 18.004049-43.522236 18.004049-16.419971 0-31.852452-6.429433-43.52326-18.004049-11.57257-11.57257-18.003026-27.104311-18.003026-43.522236 0-16.420995 6.42841-31.851429 18.003026-43.52326 11.574616-11.57257 27.103288-18.003026 43.52326-18.003025s31.852452 6.429433 43.522236 18.003025c11.573593 11.573593 18.003026 27.104311 18.003025 43.52326 0 16.419971-6.427386 31.852452-18.003025 43.522236z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="upload-drag" unicode="&#59009;" d="M666.931 445.918l-124.245 99.362c-7.221 5.639-16.428 9.042-26.429 9.042-9.963 0-19.136-3.376-26.438-9.047l-124.215-99.391c-9.615-7.772-15.713-19.565-15.713-32.782 0-9.946 3.453-19.084 9.223-26.284 13.828-17.359 41.51-20.465 58.918-6.505l56.252 45.022v-261.12c0-23.177 18.842-41.984 41.95-41.984s41.95 18.842 41.95 41.984v261.12l56.286-45.056c17.545-13.892 45.09-10.718 58.914 6.554 5.754 7.137 9.236 16.316 9.236 26.308 0 13.211-6.086 24.999-15.609 32.716zM235.827 142.95000000000005c-85.026 0-152.542 31.71-188.655 89.839-36.113 58.095-34.406 134.724 4.335 195.174 37.342 58.334 102.366 92.023 178.995 94.549-19.866 130.492 42.667 202.377 84.753 235.008 90.112 69.871 234.257 79.053 335.565 21.367 58.982-33.587 94.037-85.675 100.454-146.978 113.937 18.978 177.562-33.826 206.814-69.905 63.317-78.131 71.27-204.39 18.91-300.203-46.524-85.06-130.389-127.317-229.82-116.497-18.739 2.116-32.222 18.978-30.174 37.683s19.285 32.017 37.683 30.174c96.7-10.718 143.258 46.353 162.406 81.408 39.014 71.373 33.826 167.868-12.049 224.495-38.673 47.684-100.352 60.518-178.483 37.069-2.94-0.916-6.319-1.443-9.822-1.443-18.851 0-34.133 15.282-34.133 34.133 0 1.495 0.096 2.969 0.283 4.414 8.549 68.506-31.114 106.53-65.93 126.362-77.346 44.066-191.522 37.035-259.925-15.974-58.266-45.193-75.947-117.18-51.132-208.179 0.761-2.688 1.198-5.775 1.198-8.963 0-18.851-15.282-34.133-34.133-34.133-1.481 0-2.94 0.094-4.371 0.277-70.759 8.822-128.991-13.535-159.677-61.424-24.61-38.434-26.146-86.46-3.823-122.368 27.716-44.578 86.05-64.375 164.147-55.637 1.132 0.133 2.443 0.209 3.772 0.209 18.853 0 34.138-15.284 34.138-34.138 0-17.525-13.205-31.965-30.208-33.914-14.153-1.653-27.874-2.404-41.118-2.404z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="login-qq" unicode="&#58998;" d="M512 896C229.227789 896 0 666.772211 0 384c0-282.745263 229.227789-512 512-512s512 229.254737 512 512C1024 666.772211 794.772211 896 512 896L512 896zM738.856421 258.93726300000003c0 0-16.208842-44.220632-45.945263-83.941053 0 0 53.126737-18.054737 48.64-64.983579 0 0 1.778526-52.345263-113.461895-48.734316 0 0-81.071158 6.319158-105.377684 40.609684l-21.423158 0c-24.306526-34.304-105.350737-40.609684-105.350737-40.609684-115.280842-3.610947-113.475368 48.734316-113.475368 48.734316-4.500211 46.928842 48.626526 64.983579 48.626526 64.983579-29.709474 39.720421-45.918316 83.941053-45.918316 83.941053-72.057263-116.439579-64.848842 16.249263-64.848842 16.249263 13.527579 78.524632 70.238316 129.967158 70.238316 129.967158-8.111158 71.316211 21.611789 83.941053 21.611789 83.941053C318.410105 709.712842 508.025263 705.859368 512 705.751579c3.988211 0.107789 193.576421 3.961263 199.828211-216.643368 0 0 29.709474-12.638316 21.611789-83.941053 0 0 56.737684-51.442526 70.238316-129.967158l0 0C803.678316 275.18652599999996 810.873263 142.49768400000005 738.856421 258.93726300000003L738.856421 258.93726300000003zM738.856421 258.93726300000003"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="snowflake" unicode="&#59057;" d="M480.695-64h63.725V59.291000000000054l68.854-68.242 44.945 44.546-113.798 112.79v180.02l177.271-102.44 41.67-155.652 60.725 16.284-25.398 94.872 85.259-49.266 31.87 55.246-84.726 48.961 94.497 25.343-16.495 61.622-156.068-41.855-176.934 102.245 177.667 102.667 155.513-41.709 16.274 60.793-94.78 25.418 85.255 49.264-31.869 55.247-84.733-48.965 25.326 94.594-61.557 16.51-41.817-156.206-176.948-102.251V644.461l113.849 113.951-44.459 44.496-69.392-69.454V832h-63.725v-97.935l-69.188 69.249-45.068-45.107 114.256-114.355V438.89l-156.557 90.469L283.45 684.39l-60.188-16.458 24.84-94.632-107.544 62.145-31.868-55.247 106.667-61.639-93.463-25.557 16.074-61.237 154.482 42.243 156.169-90.243-156.138-90.226-154.485 42.243-15.855-60.409 94.289-25.784-107.534-62.14 31.868-55.247 106.672 61.642-24.621-93.801 61.012-16.685 40.69 155.028 156.179 90.25v-180.455l-113.801-112.79 44.338-43.944 69.463 68.845V-64z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="heart" unicode="&#59020;" d="M512 4.100000000000023c-108.9 0-447.3 277.5-447.3 522.2 0 131 106.6 237.6 237.6 237.6 94.9 0 174.8-50.2 209.7-76.1 34.9 25.9 114.8 76.1 209.7 76.1 131 0 237.6-106.6 237.6-237.6 0-244.7-338.4-522.2-447.3-522.2zM302.3 708c-100.2 0-181.7-81.5-181.7-181.7 0-221 326.8-466.3 391.4-466.3s391.4 245.3 391.4 466.3c0 100.2-81.5 181.7-181.7 181.7-103.9 0-190.2-76-191.1-76.8-10.6-9.5-26.7-9.5-37.3 0-0.8 0.8-87.7 76.8-191 76.8z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="logout" unicode="&#59010;" d="M512 832a32 32 0 0 1-32-32v-416a32 32 0 0 1 64 0V800a32 32 0 0 1-32 32zM683.34 798.06a32 32 0 0 1-24.48-59.15C798.07 681.24 896 544.06 896 384c0-212.08-171.92-384-384-384S128 171.91999999999996 128 384c0 160.06 97.93 297.24 237.14 354.91a32 32 0 0 1-24.48 59.15C178.25 730.78 64 570.74 64 384c0-247.42 200.58-448 448-448s448 200.58 448 448c0 186.74-114.25 346.78-276.66 414.06z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="file-b" unicode="&#58965;" d="M790.08 177.91999999999996l-138.112-119.232V177.91999999999996h138.112zM198.848 763.008h627.328v-516.16H617.088a34.56 34.56 0 0 1-34.816-34.432v-206.528H198.848V763.008z m662.208 68.8H164.032a34.56 34.56 0 0 1-34.816-34.432v-825.92a34.56 34.56 0 0 1 34.816-34.432h453.056l278.784 240.896V797.376a34.56 34.56 0 0 1-34.816 34.432z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="template" unicode="&#58979;" d="M734 172.89999999999998v82.8h-59.9v-37l-35.7-9.7 15.7-57.8zM674.1 419.3H734v-81.8h-59.9zM734 600.2l-95.6-26 15.7-57.8 20 5.4v-20.7H734zM866.1 131.29999999999995v-37l-35.7-9.7 7.9-28.9 7.8-28.9 79.9 21.7v82.8h-29.9zM740.9 60.299999999999955L651.4 36l7.9-28.9 7.8-29 89.5 24.4-7.8 28.9zM740.9 781.7l-89.5-24.3 7.9-28.9 7.8-28.9 89.5 24.3-7.8 28.9zM830.4 806l7.9-28.9 7.8-28.9 20 5.5v-20.8H926V832zM866.1 612.6v-120.3H926V612.6h-29.9zM866.1 371.9v-120.3H926V371.9h-29.9zM541.9 665.6l35.7 9.7-7.8 28.9-7.8 28.9-50-13.6L98 832v-783.5l384.1-104.3L512-64l29.9 8.1 35.7 9.7-7.8 28.9-7.8 28.9-20-5.4V120.79999999999995l35.7 9.7-15.7 57.8-20-5.4V486l35.7 9.7-15.7 57.8-20-5.4V665.6z m-59.8-659.4l-324.2 88.1V753.7l324.2-88.1V548l-192 52.2v-427.3l192-52.2v-114.5z m0 360.9V182.79999999999995l-132.2 35.9V521.8l132.2-35.9v-118.8z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="transfer" unicode="&#59025;" d="M320 768H128c-35.2 0-64-28.8-64-64v-640c0-35.2 28.8-64 64-64h192c35.2 0 64 28.8 64 64V704c0 35.2-28.8 64-64 64z m0-672c0-16-16-32-32-32H160c-16 0-32 16-32 32V672c0 16 16 32 32 32h128c16 0 32-16 32-32v-576z m256 544h-64c-19.2 0-32-12.8-32-32s16-32 32-32h64c19.2 0 32 12.8 32 32s-16 32-32 32z m-64-448h-64c-19.2 0-32-12.8-32-32s16-32 32-32h64c19.2 0 32 12.8 32 32s-16 32-32 32z m384 576H704c-35.2 0-64-28.8-64-64v-640c0-35.2 28.8-64 64-64h192c35.2 0 64 28.8 64 64V704c0 35.2-28.8 64-64 64z m0-672c0-16-16-32-32-32H736c-16 0-32 16-32 32V672c0 16 16 32 32 32h128c16 0 32-16 32-32v-576z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="auz" unicode="&#58994;" d="M324.266667 435.2c-17.066667 17.066667-39.822222 17.066667-51.2 0-17.066667-17.066667-17.066667-39.822222 0-51.2l153.6-159.288889c5.688889-5.688889 17.066667-11.377778 28.444444-11.377778s17.066667 5.688889 28.444445 11.377778l295.822222 290.133333c17.066667 17.066667 17.066667 39.822222 0 51.2-17.066667 17.066667-39.822222 17.066667-51.2 0L455.111111 304.355556 324.266667 435.2zM927.288889 753.777778L523.377778 896h-22.755556L96.711111 753.777778c-17.066667-5.688889-28.444444-17.066667-28.444444-34.133334v-432.355555c11.377778-250.311111 409.6-409.6 426.666666-415.288889h22.755556c17.066667 5.688889 415.288889 159.288889 426.666667 415.288889V719.644444c11.377778 17.066667 0 28.444444-17.066667 34.133334z m-45.511111-460.8c-5.688889-182.044444-301.511111-312.888889-369.777778-341.333334-113.777778 45.511111-358.4 182.044444-369.777778 341.333334v398.222222L512 822.044444l369.777778-125.155555v-403.911111z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="console" unicode="&#58981;" d="M30.552 104.72699999999998c4.654-16.29 23.272-23.272 37.236-18.618 16.291 4.655 23.273 23.273 18.618 37.236C16.588 314.182 84.08 521.31 237.68 640c11.636 9.31 23.273 16.29 37.236 25.6 25.6 16.29 53.528 30.255 83.782 39.564 58.182 20.945 118.691 30.254 176.873 27.927h25.6c6.982 0 11.636 0 18.618-2.327 30.255-4.655 58.182-11.637 88.436-23.273 235.055-86.11 356.073-346.764 269.964-581.818-4.654-16.291 2.327-32.582 18.618-37.237 16.291-4.654 32.582 2.328 37.237 18.619 41.89 116.363 39.563 239.709 0 349.09h2.327C921.897 656.2909999999999 738.043 784.2909999999999 537.897 793.6h-48.873c-200.145-9.31-384-137.31-458.472-337.455-39.564-109.381-41.891-232.727 0-351.418z m707.49 386.328a29.498 29.498 0 0 1-41.89 0L521.606 316.509c-4.654 2.327-9.309 2.327-13.963 2.327-32.582 0-58.182-25.6-58.182-58.181s25.6-58.182 58.182-58.182 58.181 25.6 58.181 58.182c0 4.654 0 9.309-2.327 16.29l174.546 174.546c11.636 11.636 11.636 30.254 0 39.564z m228.073-458.473H58.48c-16.29 0-30.255-13.964-30.255-30.255 0-16.29 13.964-30.254 30.255-30.254h907.636c16.291 0 30.255 13.963 30.255 30.254 0 16.291-13.964 30.255-30.255 30.255z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="app" unicode="&#58963;" d="M432.022 818.946h-376.324c-6.627 0-12.078-5.45-12.078-12.078v-376.324c0-6.627 5.45-12.078 12.078-12.078h376.324c6.627 0 12.078 5.45 12.078 12.078v376.473c0 6.627-5.45 11.93-12.078 11.93zM391.517 471.196h-295.169v295.169h295.021v-295.169zM976.847 635.717l-211.95 211.95c-8.837 8.837-23.124 8.837-31.963 0l-211.95-211.95c-8.837-8.837-8.837-23.124 0-31.963l211.95-212.098c8.837-8.837 23.124-8.837 31.963 0l211.95 211.95c8.837 8.987 8.837 23.271 0 32.109zM432.022 313.45000000000005h-376.324c-6.627 0-12.078-5.45-12.078-12.078v-376.324c0-6.627 5.45-12.078 12.078-12.078h376.324c6.627 0 12.078 5.45 12.078 12.078v376.473c0 6.627-5.45 11.93-12.078 11.93zM391.517-34.15499999999997h-295.169v295.021h295.021v-295.021zM932.511 313.45000000000005h-376.324c-6.627 0-12.078-5.45-12.078-12.078v-376.324c0-6.627 5.45-12.078 12.078-12.078h376.324c6.627 0 12.078 5.45 12.078 12.078v376.473c0 6.627-5.45 11.93-12.078 11.93zM891.859-34.15499999999997h-295.021v295.021h295.021v-295.021z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="prev" unicode="&#58970;" d="M62.573 384.103l423.401 423.662c18.985 18.985 49.757 18.985 68.727 0 18.982-18.972 18.985-49.746 0-68.729l-355.058-355.067 356.796-356.796c18.977-18.971 18.976-49.746 0-68.727-18.982-18.976-49.751-18.976-68.727 0l-39.753 39.753 0.269 0.246-385.655 385.661zM451.365 384.103l423.407 423.662c18.985 18.985 49.757 18.985 68.727 0 18.982-18.972 18.985-49.746 0-68.729l-355.058-355.067 356.796-356.796c18.977-18.971 18.976-49.746 0-68.727-18.982-18.976-49.757-18.977-68.727 0l-39.762 39.754 0.273 0.249-385.662 385.661zM451.365 384.103z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="website" unicode="&#59310;" d="M777.073418 147.443038c-30.460759 21.387342-40.83038 40.182278-76.47595 53.792405 25.275949 60.273418 40.182278 83.605063 42.126583 154.896203H887.898734c-3.888608-99.159494-45.367089-143.878481-110.825316-208.688608zM136.101266 356.13164600000005h167.210126c1.944304-71.291139 16.850633-94.622785 42.126583-154.896203-34.997468-13.610127-68.050633-31.756962-98.511393-53.792405C181.468354 212.25316499999997 139.989873 256.97215200000005 136.101266 356.13164600000005z m103.048101 259.888607c29.164557-23.979747 61.56962-42.774684 96.567089-57.681012-19.443038-53.792405-30.460759-90.734177-31.756962-152.951899H136.101266c3.240506 90.734177 46.663291 147.767089 103.048101 210.632911z m309.144304-209.98481V523.989873c47.311392 1.296203 71.291139 10.36962 114.065823 25.27595 18.146835-51.2 28.516456-84.901266 30.460759-143.23038H548.293671z m104.344304-195.078481c-40.182278 12.962025-60.273418 20.091139-104.344304 21.387342V356.13164600000005h144.526582c-1.944304-68.050633-16.202532-88.141772-40.182278-145.174684z m36.941772-57.681013c31.756962-12.313924 39.534177-28.516456 66.75443-47.311392-51.848101-44.718987-114.713924-73.883544-182.116455-84.901266 36.941772 37.589873 90.734177 82.308861 115.362025 132.212658z m-163.321519-137.397468l22.035443 165.913924c40.182278-1.296203 56.38481-7.777215 92.678481-18.794937-27.220253-56.38481-66.106329-106.288608-113.417722-147.118987h-1.296202z m-75.827848 5.18481c-67.402532 11.017722-130.268354 40.83038-182.764557 84.901266 27.868354 19.443038 57.681013 34.997468 88.789873 47.311392 23.331646-48.607595 55.088608-93.326582 93.974684-132.212658z m47.311392 335.068355v-123.787342c-44.070886-1.296203-64.162025-8.425316-104.344304-21.387342-23.979747 57.681013-38.237975 77.124051-40.182278 145.174684h144.526582zM383.675949 549.265823c42.774684-14.906329 66.75443-23.331646 114.065823-25.27595v-117.95443H353.21519c1.944304 58.329114 12.313924 92.03038 30.460759 143.23038z m-37.589873 57.032911c-31.756962 12.962025-60.921519 30.460759-88.141772 51.848101 53.792405 51.848101 115.362025 91.382278 192.486076 104.344304-44.718987-44.718987-80.364557-97.863291-104.344304-156.192405z m151.655696 161.377215v-193.782278c-44.070886 1.296203-64.162025 9.073418-103.696202 22.683544 29.164557 68.698734 49.903797 127.027848 102.4 171.098734h1.296202z m75.827848-4.536708c77.772152-13.610127 149.711392-49.903797 206.744304-104.344304-29.164557-22.035443-46.01519-37.589873-80.364557-51.848102-25.275949 59.625316-82.956962 112.76962-126.379747 156.192406z m-46.01519 4.536708c54.440506-46.01519 97.21519-104.992405 124.435443-171.098734-39.534177-13.610127-59.625316-21.387342-103.696202-22.683544l-22.035443 193.782278h1.296202z m-31.10886-751.149367c-46.663291 38.886076-62.865823 88.789873-91.382279 147.118988 36.293671 11.665823 53.144304 17.498734 93.326582 18.794936v-165.913924h-1.944303zM887.898734 406.035443h-145.174683c-1.296203 61.56962-12.313924 98.511392-31.756962 152.303798 37.589873 15.55443 57.032911 33.053165 88.789873 57.681012 56.38481-62.865823 84.901266-119.898734 88.141772-209.98481z m-375.898734 427.746835c-244.334177 0-442.005063-197.670886-442.005063-442.005063S267.665823-50.227847999999994 512-50.227847999999994s442.005063 197.670886 442.005063 442.005063S756.334177 833.782278 512 833.782278z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="next" unicode="&#58971;" d="M948.066926 382.958838l-411.990051-412.24426c-18.47333-18.47333-48.417689-18.47333-66.875207 0-18.47333 18.461167-18.47333 48.405526 0 66.875207L814.691135 383.088983 467.512212 730.269123c-18.466032 18.458735-18.466032 48.405526 0 66.873991 18.468465 18.464816 48.410391 18.464816 66.872774 0l38.682336-38.682336-0.261507-0.239614 375.259894-375.265975v0.003649m-378.312834 0L157.756743-29.28542200000004c-18.47333-18.47333-48.415256-18.47333-66.872775 0-18.47333 18.461167-18.47333 48.405526 0 66.875207L436.369787 383.088983 89.19208 730.269123c-18.4636 18.458735-18.4636 48.405526 0 66.873991 18.470898 18.464816 48.415256 18.464816 66.872774 0l38.692067-38.682336-0.266372-0.239614 375.267191-375.265975-0.004865 0.003649m0 0z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="component" unicode="&#59479;" d="M917.376 652.544L500.8 891.2a34.304 34.304 0 0 1-34.176 0L50.112 652.48a33.92 33.92 0 0 1-17.088-29.376v-477.44c0-12.16 6.528-23.296 17.088-29.44l416.512-238.72a35.136 35.136 0 0 1 34.176 0l416.576 238.72a33.92 33.92 0 0 1 17.088 29.44v477.44a33.92 33.92 0 0 1-17.088 29.44z m-51.264-487.36l-382.4-219.136-382.336 219.136V603.52l382.336 219.136 382.4-219.136v-438.272zM198.784 535.488a33.792 33.792 0 0 1 12.544-46.4l237.824-136.32V83.20000000000005c0-18.816 15.232-33.92 34.176-33.92a33.92 33.92 0 0 1 34.176 33.92V352.384l238.656 136.832a33.856 33.856 0 0 1 12.544 46.4 34.368 34.368 0 0 1-46.72 12.416L483.712 411.52 245.504 548.0319999999999a34.432 34.432 0 0 1-46.72-12.544z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="android" unicode="&#59012;" d="M391.405714 619.995429a22.308571 22.308571 0 0 1 0 44.544c-11.995429 0-21.723429-10.276571-21.723428-22.272s9.728-22.272 21.723428-22.272z m241.152 0c11.995429 0 21.723429 10.276571 21.723429 22.272s-9.728 22.272-21.723429 22.272a22.308571 22.308571 0 0 1 0-44.544zM168.539429 514.852571a58.514286 58.514286 0 0 0 58.294857-58.294857v-245.723428c0-32.585143-25.709714-58.843429-58.294857-58.843429S109.696 178.285714 109.696 210.834286v245.723428c0 32 26.294857 58.294857 58.843429 58.294857z m605.732571-10.861714v-380.562286c0-34.852571-28.013714-62.866286-62.281143-62.866285h-42.861714v-129.718857c0-32.585143-26.294857-58.843429-58.843429-58.843429s-58.843429 26.294857-58.843428 58.843429v129.718857H472.594286v-129.718857c0-32.585143-26.294857-58.843429-58.843429-58.843429a58.660571 58.660571 0 0 0-58.294857 58.843429l-0.585143 129.718857H312.594286a62.683429 62.683429 0 0 0-62.866286 62.866285V503.990857h524.580571z m-132.571429 231.424c80.018286-41.142857 134.290286-119.990857 134.290286-210.870857H247.424c0 90.843429 54.272 169.728 134.838857 210.870857L341.705143 810.276571a8.338286 8.338286 0 0 0 2.852571 11.446858c3.986286 1.718857 9.142857 0.585143 11.446857-3.437715L397.147429 742.838857c34.852571 15.433143 73.728 23.990857 114.870857 23.990857s80.018286-8.557714 114.870857-23.990857l41.142857 75.446857c2.304 3.986286 7.424 5.156571 11.446857 3.437715a8.338286 8.338286 0 0 0 2.852572-11.446858zM914.267429 456.557714v-245.723428c0-32.585143-26.294857-58.843429-58.843429-58.843429a58.660571 58.660571 0 0 0-58.294857 58.843429v245.723428a58.148571 58.148571 0 0 0 58.294857 58.294857c32.585143 0 58.843429-25.709714 58.843429-58.294857z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="more" unicode="&#58975;" d="M224 288c-52.928 0-96 43.072-96 96s43.072 96 96 96 96-43.072 96-96-43.072-96-96-96z m288 0c-52.928 0-96 43.072-96 96s43.072 96 96 96 96-43.072 96-96-43.072-96-96-96z m288 0c-52.928 0-96 43.072-96 96s43.072 96 96 96 96-43.072 96-96-43.072-96-96-96z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="login-wechat" unicode="&#58999;" d="M516.464646 896C233.714646 896 4.464646 666.75 4.464646 384S233.714646-128 516.464646-128s512 229.25 512 512S799.214646 896 516.464646 896z m-74-523.375c-0.25-0.75-0.5-1.125-0.75-1.875-0.25-0.75-0.5-1.125-0.75-1.875-0.25-0.75-0.5-1.125-0.75-1.875-0.25-0.75-0.5-1.125-0.75-1.875-0.25-0.75-0.5-1.125-0.75-1.875-0.25-0.75-0.5-1.125-0.75-1.875-0.25-0.75-0.5-1.125-0.75-1.875-0.25-0.75-0.5-1.125-0.75-1.875-0.25-0.75-0.5-1.125-0.5-1.875-0.25-0.75-0.5-1.125-0.5-1.875-0.25-0.75-0.5-1.125-0.5-1.875-0.25-0.75-0.25-1.125-0.5-1.875s-0.5-1.125-0.5-1.875c-0.25-0.75-0.25-1.125-0.5-1.875s-0.25-1.125-0.5-1.875-0.25-1.125-0.5-1.875-0.25-1.125-0.5-1.875-0.25-1.125-0.5-1.875-0.25-1.125-0.5-1.875-0.25-1.125-0.5-1.875-0.25-1.125-0.5-1.875c0-0.75-0.25-1.125-0.25-1.875s-0.25-1.125-0.25-1.875-0.25-1.125-0.25-1.875-0.25-1.125-0.25-1.875-0.25-1.125-0.25-1.875-0.25-1.125-0.25-1.875-0.25-1.125-0.25-1.875-0.25-1.125-0.25-1.875-0.25-1.125-0.25-1.875 0-1.125-0.25-1.875c0-0.75-0.25-1.125-0.25-1.875s0-1.125-0.25-1.875c0-0.75 0-1.125-0.25-1.875 0-0.75 0-1.125-0.25-1.875v-22.5c0-0.75 0-1.125 0.25-1.875 0-0.75 0-1.125 0.25-1.875 0-0.75 0-1.125 0.25-1.875 0-0.75 0-1.125 0.25-1.875 0-0.75 0.25-1.125 0.25-1.875s0.25-1.125 0.25-1.875 0.25-1.125 0.25-1.875 0.25-1.125 0.25-1.875 0.25-1.125 0.25-1.875 0.25-1.125 0.25-1.875 0.25-1.125 0.25-1.875 0.25-1.125 0.25-1.875 0.25-1.125 0.25-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875l0.25-0.875c-4.25-0.25-8.625-0.75-12.75-0.75-3.75-0.25-7.25-0.25-11-0.25-3.5 0-7 0-10.5 0.25-7.25 0.25-14 0.875-20.75 1.875-4.25 0.5-8.125 1.125-12.375 1.875-3.5 0.5-6.75 1.125-10.25 1.875-3 0.5-6.25 1.125-9.25 1.875-3 0.75-5.875 1.125-8.875 1.875-2.75 0.75-5.875 1.125-8.875 1.875-2.75 0.5-5.625 1.125-8.375 1.625l-3.25-1.625-3.75-1.875-4 1.375-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-2.75-1.375-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-3.75-1.875-2.5-1.375 0.5 1.375 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.75 1.875 0.5 1.125c-0.5 0.25-0.75 0.5-1.125 0.75-0.875 0.75-1.625 1.125-2.5 1.875s-1.625 1.125-2.5 1.875-1.625 1.125-2.5 1.875c-0.75 0.75-1.625 1.125-2.375 1.875-0.75 0.75-1.625 1.125-2.375 1.875-0.75 0.75-1.625 1.125-2.375 1.875-0.75 0.75-1.625 1.125-2.375 1.875-0.75 0.75-1.375 1.125-2.375 1.875-0.75 0.75-1.375 1.125-2.125 1.875-0.75 0.75-1.375 1.125-2.125 1.875-0.75 0.75-1.375 1.125-2.125 1.875-0.75 0.75-1.375 1.125-2.125 1.875-0.75 0.75-1.375 1.125-2.125 1.875-0.75 0.75-1.375 1.125-2.125 1.875-0.75 0.75-1.375 1.125-1.875 1.875-0.75 0.75-1.375 1.125-1.875 1.875l-1.875 1.875-1.875 1.875-1.875 1.875-1.875 1.875c-0.75 0.75-1.125 1.125-1.625 1.875s-1.125 1.125-1.625 1.875-1.125 1.125-1.625 1.875-1.125 1.125-1.625 1.875-1.125 1.125-1.625 1.875-1.125 1.125-1.625 1.875-0.875 1.125-1.625 1.875c-0.5 0.75-0.875 1.125-1.625 1.875-0.5 0.75-0.875 1.125-1.375 1.875-0.5 0.75-0.875 1.125-1.375 1.875-0.5 0.75-0.875 1.125-1.375 1.875-0.5 0.75-0.875 1.125-1.375 1.875-0.5 0.75-0.875 1.125-1.375 1.875-0.5 0.75-0.875 1.125-1.375 1.875-0.5 0.75-0.875 1.125-1.375 1.875-0.5 0.75-0.875 1.125-1.375 1.875-0.5 0.75-0.875 1.125-1.125 1.875-0.5 0.75-0.875 1.125-1.125 1.875-0.5 0.75-0.75 1.125-1.125 1.875-0.5 0.75-0.75 1.125-1.125 1.875-0.5 0.75-0.75 1.125-1.125 1.875-0.5 0.75-0.75 1.125-1.125 1.875-0.5 0.75-0.75 1.125-1.125 1.875-0.5 0.75-0.75 1.125-1.125 1.875-0.25 0.75-0.75 1.125-0.875 1.875-0.25 0.75-0.75 1.125-0.875 1.875-0.25 0.75-0.75 1.125-0.875 1.875-0.25 0.75-0.75 1.125-0.875 1.875-0.25 0.75-0.75 1.125-0.875 1.875-0.25 0.75-0.75 1.125-0.875 1.875-0.25 0.75-0.75 1.125-0.875 1.875-0.25 0.75-0.5 1.125-0.875 1.875-0.25 0.75-0.5 1.125-0.875 1.875-0.25 0.75-0.5 1.125-0.875 1.875-0.25 0.75-0.5 1.125-0.75 1.875-0.25 0.75-0.5 1.125-0.75 1.875-0.25 0.75-0.5 1.125-0.75 1.875-0.25 0.75-0.5 1.125-0.75 1.875-0.25 0.75-0.5 1.125-0.75 1.875-0.25 0.75-0.5 1.125-0.75 1.875-0.25 0.75-0.5 1.125-0.75 1.875-0.25 0.75-0.5 1.125-0.75 1.875-0.25 0.75-0.5 1.125-0.75 1.875-0.25 0.75-0.5 1.125-0.75 1.875-0.25 0.75-0.5 1.125-0.5 1.875-0.25 0.75-0.5 1.125-0.5 1.875-0.25 0.75-0.5 1.125-0.5 1.875-0.25 0.75-0.25 1.125-0.5 1.875s-0.25 1.125-0.5 1.875-0.25 1.125-0.5 1.875-0.25 1.125-0.5 1.875-0.25 1.125-0.5 1.875-0.25 1.125-0.5 1.875-0.25 1.125-0.5 1.875-0.25 1.125-0.5 1.875-0.25 1.125-0.25 1.875-0.25 1.125-0.25 1.875-0.25 1.125-0.25 1.875-0.25 1.125-0.25 1.875-0.25 1.125-0.25 1.875-0.25 1.125-0.25 1.875-0.25 1.125-0.25 1.875-0.25 1.125-0.25 1.875-0.25 1.125-0.25 1.875 0 1.125-0.25 1.875c0 0.75 0 1.125-0.25 1.875 0 0.75 0 1.125-0.25 1.875 0 0.75 0 1.125-0.25 1.875V457.25v1.875 1.875 1.875 1.875 1.875 0.875 0.875 1.875 1.875 1.875 1.875 1.875 1.875c0 0.75 0 1.125 0.25 1.875 0 0.75 0 1.125 0.25 1.875 0 0.75 0 1.125 0.25 1.875 0 0.75 0.25 1.125 0.25 1.875s0.25 1.125 0.25 1.875 0.25 1.125 0.25 1.875 0.25 1.125 0.25 1.875 0.25 1.125 0.25 1.875 0.25 1.125 0.25 1.875 0.25 1.125 0.25 1.875 0.25 1.125 0.25 1.875 0.25 1.125 0.25 1.875 0.25 1.125 0.5 1.875c0 0.75 0.25 1.125 0.5 1.875s0.25 1.125 0.5 1.875 0.25 1.125 0.5 1.875 0.25 1.125 0.5 1.875 0.25 1.125 0.5 1.875 0.25 1.125 0.5 1.875 0.25 1.125 0.5 1.875 0.25 1.125 0.5 1.875 0.25 1.125 0.5 1.875 0.25 1.125 0.5 1.875 0.5 1.125 0.5 1.875c0.25 0.75 0.5 1.125 0.5 1.875 0.25 0.75 0.5 1.125 0.5 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.75 1.875 0.25 0.75 0.5 1.125 0.875 1.875 0.25 0.75 0.5 1.125 0.875 1.875 0.25 0.75 0.5 1.125 0.875 1.875 0.25 0.75 0.75 1.125 0.875 1.875 0.25 0.75 0.75 1.125 0.875 1.875 0.25 0.75 0.75 1.125 0.875 1.875 0.25 0.75 0.75 1.125 0.875 1.875 0.25 0.75 0.75 1.125 0.875 1.875 0.25 0.75 0.75 1.125 0.875 1.875 0.25 0.75 0.75 1.125 1.125 1.875 0.5 0.75 0.75 1.125 1.125 1.875 0.5 0.75 0.75 1.125 1.125 1.875 0.5 0.75 0.75 1.125 1.125 1.875 0.5 0.75 0.75 1.125 1.125 1.875 0.5 0.75 0.75 1.125 1.125 1.875 0.5 0.75 0.75 1.125 1.125 1.875 0.5 0.75 0.875 1.125 1.125 1.875 0.5 0.75 0.875 1.125 1.125 1.875 0.5 0.75 0.875 1.125 1.125 1.875 0.5 0.75 0.875 1.125 1.375 1.875 0.5 0.75 0.875 1.125 1.375 1.875 0.5 0.75 0.875 1.125 1.375 1.875 0.5 0.75 0.875 1.125 1.375 1.875 0.5 0.75 0.875 1.125 1.375 1.875 0.5 0.75 0.875 1.125 1.375 1.875 0.5 0.75 0.875 1.125 1.375 1.875 0.5 0.75 0.875 1.125 1.625 1.875 0.5 0.75 0.875 1.125 1.625 1.875 0.5 0.75 1.125 1.125 1.625 1.875s1.125 1.125 1.625 1.875 1.125 1.125 1.625 1.875 1.125 1.125 1.625 1.875 1.125 1.125 1.625 1.875l1.875 1.875 1.875 1.875 1.875 1.875 1.875 1.875c0.75 0.75 1.375 1.125 1.875 1.875 0.75 0.75 1.375 1.125 2.125 1.875 0.75 0.75 1.375 1.125 2.125 1.875 0.75 0.75 1.375 1.125 2.125 1.875 0.75 0.75 1.375 1.125 2.125 1.875 0.75 0.75 1.375 1.125 2.125 1.875 0.75 0.75 1.375 1.125 2.375 1.875 0.75 0.75 1.625 1.125 2.375 1.875 0.75 0.75 1.625 1.125 2.375 1.875 0.75 0.75 1.625 1.125 2.375 1.875 0.875 0.75 1.625 1.125 2.5 1.875s1.625 1.125 2.5 1.875 1.875 1.125 2.5 1.875c0.875 0.75 1.875 1.125 2.75 1.875 0.875 0.75 1.875 1.125 2.75 1.875 0.875 0.75 1.875 1.125 2.75 1.875 0.875 0.75 1.875 1.125 3 1.875 0.875 0.75 2.125 1.125 3 1.875s2.125 1.125 3 1.875c1.125 0.75 2.125 1.125 3.25 1.875 1.125 0.75 2.375 1.125 3.25 1.875 1.125 0.75 2.375 1.125 3.5 1.875 1.125 0.75 2.375 1.125 3.75 1.875 1.125 0.75 2.5 1.125 3.75 1.875 1.375 0.75 2.5 1.125 4 1.875 1.375 0.75 2.75 1.125 4.25 1.875 1.375 0.75 2.75 1.125 4.25 1.875 1.375 0.75 3 1.125 4.375 1.875 1.625 0.75 3 1.125 4.625 1.875 1.625 0.75 3.25 1.125 4.875 1.875 1.875 0.75 3.5 1.125 5.375 1.875s3.75 1.125 5.625 1.875c2.125 0.75 4.25 1.125 6 1.875 2.375 0.75 4.375 1.125 6.75 1.875 2.5 0.75 4.875 1.125 7.5 1.875 2.75 0.75 5.625 1.125 8.625 1.875 3.5 0.75 6.75 1.125 10.25 1.875 4.375 0.75 8.875 1.375 13.25 1.875 11 1.125 22.125 1.875 33.25 1.875h2.5c11.125 0 22.375-0.75 33.5-1.875 4.375-0.5 8.875-1.125 13.25-1.875 3.5-0.5 7-1.125 10.25-1.875 2.75-0.5 5.875-1.125 8.625-1.875 2.5-0.5 5.125-1.125 7.625-1.875 2.375-0.5 4.625-1.125 6.75-1.875 2.125-0.5 4.25-1.125 6.25-1.875 1.875-0.75 4-1.125 5.875-1.875s3.75-1.125 5.375-1.875c1.625-0.75 3.5-1.125 5.125-1.875 1.625-0.75 3.25-1.125 4.875-1.875 1.625-0.75 3-1.125 4.625-1.875 1.375-0.75 3-1.125 4.375-1.875s2.75-1.125 4.25-1.875c1.375-0.75 2.75-1.125 4-1.875 1.375-0.75 2.5-1.125 3.75-1.875 1.125-0.75 2.5-1.125 3.75-1.875 1.125-0.75 2.375-1.125 3.5-1.875 1.125-0.75 2.375-1.125 3.5-1.875 1.125-0.75 2.375-1.125 3.25-1.875 1.125-0.75 2.125-1.125 3.25-1.875 1.125-0.75 2.125-1.125 3-1.875s2.125-1.125 3-1.875 1.875-1.125 3-1.875c0.875-0.75 1.875-1.125 2.75-1.875 0.875-0.75 1.875-1.125 2.75-1.875 0.875-0.75 1.875-1.125 2.75-1.875 0.875-0.75 1.875-1.125 2.5-1.875 0.875-0.75 1.625-1.125 2.5-1.875s1.625-1.125 2.5-1.875 1.625-1.125 2.375-1.875c0.75-0.75 1.625-1.125 2.375-1.875 0.75-0.75 1.625-1.125 2.375-1.875 0.75-0.75 1.375-1.125 2.375-1.875 0.75-0.75 1.375-1.125 2.375-1.875 0.75-0.75 1.375-1.125 2.125-1.875 0.75-0.75 1.375-1.125 2.125-1.875 0.75-0.75 1.375-1.125 2.125-1.875 0.75-0.75 1.375-1.125 2.125-1.875 0.75-0.75 1.375-1.125 1.875-1.875 0.75-0.75 1.375-1.125 1.875-1.875l1.875-1.875 1.875-1.875 1.875-1.875 1.875-1.875c0.75-0.75 1.125-1.125 1.625-1.875s1.125-1.125 1.625-1.875 1.125-1.125 1.625-1.875 1.125-1.125 1.625-1.875 1.125-1.125 1.625-1.875 0.875-1.125 1.625-1.875c0.5-0.75 0.875-1.125 1.625-1.875 0.5-0.75 0.875-1.125 1.375-1.875 0.5-0.75 0.875-1.125 1.375-1.875 0.5-0.75 0.875-1.125 1.375-1.875 0.5-0.75 0.875-1.125 1.375-1.875 0.5-0.75 0.875-1.125 1.375-1.875 0.5-0.75 0.875-1.125 1.375-1.875 0.5-0.75 0.875-1.125 1.375-1.875 0.5-0.75 0.875-1.125 1.125-1.875 0.5-0.75 0.875-1.125 1.125-1.875 0.5-0.75 0.875-1.125 1.125-1.875 0.5-0.75 0.75-1.125 1.125-1.875 0.5-0.75 0.75-1.125 1.125-1.875 0.5-0.75 0.75-1.125 1.125-1.875 0.5-0.75 0.75-1.125 1.125-1.875 0.5-0.75 0.75-1.125 1.125-1.875 0.5-0.75 0.75-1.125 1.125-1.875 0.5-0.75 0.75-1.125 0.875-1.875 0.25-0.75 0.75-1.125 0.875-1.875 0.25-0.75 0.75-1.125 0.875-1.875 0.25-0.75 0.75-1.125 0.875-1.875 0.25-0.75 0.75-1.125 0.875-1.875 0.25-0.75 0.75-1.125 0.875-1.875 0.25-0.75 0.75-1.125 0.875-1.875 0.25-0.75 0.75-1.125 0.875-1.875 0.25-0.75 0.5-1.125 0.875-1.875 0.25-0.75 0.5-1.125 0.875-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.75-1.875 0.25-0.75 0.5-1.125 0.5-1.875 0.25-0.75 0.5-1.125 0.5-1.875 0.25-0.75 0.25-1.125 0.5-1.875s0.5-1.125 0.5-1.875c0.25-0.75 0.25-1.125 0.5-1.875s0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875 0.25-1.125 0.5-1.875c0-0.5 0.25-0.75 0.25-1.125-4.625 0.5-9.25 0.875-14 1.125-3.5 0.25-7 0.25-10.75 0.25-4 0-8.125 0-12.125-0.25-6.75-0.25-13.25-0.875-19.5-1.875-3.75-0.5-7.625-1.125-11.375-1.875-3-0.5-5.875-1.125-8.875-1.875-2.5-0.5-5.125-1.125-7.5-1.875-2.125-0.5-4.375-1.125-6.5-1.875-1.875-0.5-4-1.125-5.875-1.875-1.875-0.5-3.5-1.125-5.375-1.875-1.625-0.75-3.25-1.125-4.875-1.875-1.625-0.75-3-1.125-4.625-1.875-1.375-0.75-3-1.125-4.375-1.875s-2.75-1.125-4.25-1.875c-1.375-0.75-2.5-1.125-4-1.875-1.125-0.75-2.5-1.125-3.75-1.875-1.125-0.75-2.375-1.125-3.5-1.875-1.125-0.75-2.375-1.125-3.5-1.875-1.125-0.75-2.125-1.125-3.25-1.875-0.875-0.75-2.125-1.125-3-1.875s-2.125-1.125-3-1.875-1.875-1.125-3-1.875c-0.875-0.75-1.875-1.125-2.75-1.875-0.875-0.75-1.875-1.125-2.75-1.875-0.875-0.75-1.875-1.125-2.5-1.875-0.875-0.75-1.625-1.125-2.5-1.875s-1.625-1.125-2.5-1.875c-0.75-0.75-1.625-1.125-2.375-1.875-0.75-0.75-1.625-1.125-2.375-1.875-0.75-0.75-1.625-1.125-2.375-1.875-0.75-0.75-1.375-1.125-2.125-1.875-0.75-0.75-1.375-1.125-2.125-1.875-0.75-0.75-1.375-1.125-2.125-1.875-0.75-0.75-1.375-1.125-2.125-1.875-0.75-0.75-1.375-1.125-2.125-1.875-0.75-0.75-1.375-1.125-1.875-1.875l-1.875-1.875-1.875-1.875-1.875-1.875c-0.75-0.75-1.125-1.125-1.625-1.875s-1.125-1.125-1.625-1.875-1.125-1.125-1.625-1.875-1.125-1.125-1.625-1.875-1.125-1.125-1.625-1.875-0.875-1.125-1.625-1.875c-0.5-0.75-0.875-1.125-1.625-1.875-0.5-0.75-0.875-1.125-1.375-1.875-0.5-0.75-0.875-1.125-1.375-1.875-0.5-0.75-0.875-1.125-1.375-1.875-0.5-0.75-0.875-1.125-1.375-1.875-0.5-0.75-0.875-1.125-1.375-1.875-0.5-0.75-0.875-1.125-1.375-1.875-0.5-0.75-0.875-1.125-1.125-1.875-0.5-0.75-0.875-1.125-1.125-1.875-0.5-0.75-0.75-1.125-1.125-1.875-0.5-0.75-0.75-1.125-1.125-1.875-0.5-0.75-0.75-1.125-1.125-1.875-0.5-0.75-0.75-1.125-1.125-1.875-0.5-0.75-0.75-1.125-1.125-1.875-0.5-0.75-0.75-1.125-1.125-1.875-0.5-0.75-0.75-1.125-1.125-1.875-0.25-0.75-0.75-1.125-0.875-1.875-0.25-0.75-0.75-1.125-0.875-1.875-0.25-0.75-0.75-1.125-0.875-1.875-0.25-0.75-0.75-1.125-0.875-1.875-0.25-0.75-0.75-1.125-0.875-1.875-0.25-0.75-0.75-1.125-0.875-1.875-0.25-0.75-0.75-1.125-0.875-1.875-0.25-0.75-0.5-1.125-0.875-1.875-0.25-0.75-0.5-1.125-0.875-1.875-0.25-0.75-0.5-1.125-0.875-1.875-0.25-0.75-0.5-1.125-0.75-1.875-3.125-4.625-3.375-5.125-3.625-5.75z m433.625-71.25v-11.375c0-0.5 0-0.875-0.25-1.625 0-0.5 0-0.875-0.25-1.625 0-0.5 0-0.875-0.25-1.625 0-0.5-0.25-0.875-0.25-1.625 0-0.5-0.25-0.875-0.25-1.625 0-0.5-0.25-0.875-0.25-1.625 0-0.5-0.25-0.875-0.25-1.625 0-0.5-0.25-0.875-0.25-1.625 0-0.5-0.25-0.875-0.25-1.625 0-0.5-0.25-0.875-0.25-1.625 0-0.5-0.25-0.875-0.25-1.625 0-0.5-0.25-0.875-0.25-1.625 0-0.5-0.25-0.875-0.5-1.625-0.25-0.5-0.25-0.875-0.5-1.625-0.25-0.5-0.25-0.875-0.5-1.625-0.25-0.5-0.25-0.875-0.5-1.625-0.25-0.5-0.25-0.875-0.5-1.625-0.25-0.5-0.25-0.875-0.5-1.625-0.25-0.5-0.25-0.875-0.5-1.625-0.25-0.5-0.25-0.875-0.5-1.625-0.25-0.5-0.25-0.875-0.5-1.625-0.25-0.5-0.25-0.875-0.5-1.625-0.25-0.5-0.5-0.875-0.5-1.625-0.25-0.5-0.5-0.875-0.5-1.625-0.25-0.5-0.5-0.875-0.5-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.75-1.625-0.25-0.5-0.5-0.875-0.875-1.625-0.25-0.5-0.5-0.875-0.875-1.625-0.25-0.5-0.5-0.875-0.875-1.625-0.25-0.5-0.5-0.875-0.875-1.625-0.25-0.5-0.75-0.875-0.875-1.625-0.25-0.5-0.75-0.875-0.875-1.625-0.25-0.5-0.75-0.875-0.875-1.625-0.25-0.5-0.75-0.875-0.875-1.625-0.25-0.5-0.75-0.875-0.875-1.625-0.25-0.5-0.75-0.875-0.875-1.625-0.25-0.5-0.75-0.875-0.875-1.625-0.25-0.5-0.75-0.875-0.875-1.625-0.5-0.5-0.75-0.875-1.125-1.625-0.5-0.5-0.75-0.875-1.125-1.625-0.5-0.5-0.75-0.875-1.125-1.625-0.5-0.5-0.75-0.875-1.125-1.625-0.5-0.5-0.75-0.875-1.125-1.625-0.5-0.5-0.75-0.875-1.125-1.625-0.5-0.5-0.75-0.875-1.125-1.625-0.5-0.5-0.75-0.875-1.125-1.625-0.5-0.5-0.75-0.875-1.125-1.625-0.5-0.5-0.875-0.875-1.125-1.625-0.5-0.5-0.875-0.875-1.125-1.625-0.5-0.5-0.875-0.875-1.375-1.625-0.5-0.5-0.875-0.875-1.375-1.625-0.5-0.5-0.875-0.875-1.375-1.625-0.5-0.5-0.875-0.875-1.375-1.625-0.5-0.5-0.875-0.875-1.375-1.625-0.5-0.5-0.875-0.875-1.375-1.625-0.5-0.5-0.875-0.875-1.375-1.625-0.5-0.5-0.875-0.875-1.375-1.625-0.5-0.5-0.875-0.875-1.375-1.625-0.5-0.5-0.875-0.875-1.375-1.625l-1.625-1.625-1.625-1.625c-0.5-0.5-1.125-0.875-1.625-1.625-0.5-0.5-1.125-0.875-1.625-1.625-0.5-0.5-1.125-0.875-1.625-1.625-0.5-0.5-1.125-0.875-1.625-1.625-0.5-0.5-1.125-0.875-1.625-1.625-0.5-0.5-1.125-0.875-1.625-1.625-0.5-0.5-1.125-0.875-1.625-1.625-0.75-0.5-1.125-0.875-1.875-1.625-0.75-0.5-1.125-0.875-1.875-1.625-0.75-0.5-1.125-0.875-1.875-1.625-0.75-0.5-1.125-0.875-1.875-1.625-0.75-0.5-1.125-0.875-1.875-1.625-0.75-0.5-1.125-0.875-1.875-1.625-0.75-0.5-1.375-0.875-1.875-1.625-0.75-0.5-1.375-0.875-1.875-1.625-0.75-0.5-1.375-0.875-2.125-1.625-0.75-0.5-1.375-0.875-2.125-1.625l-0.75-0.5 0.25-0.875 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.5-1.625 0.25-1.125-2.125 1.125-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-2.75 1.625-0.5 0.25-0.875-0.25c-2.125-0.5-4.25-0.875-6-1.625-2.125-0.5-4.25-0.875-6.25-1.625-2.125-0.5-4.25-0.875-6.5-1.625-2.375-0.5-4.375-0.875-6.75-1.625-2.375-0.5-4.875-1.125-7.25-1.625-2.75-0.5-5.375-1.125-8.125-1.625-3.25-0.5-6.5-1.125-9.75-1.625-5.375-0.75-10.75-1.125-15.875-1.625-2.75-0.25-5.875-0.25-8.625-0.25-3.75 0-7.5 0-11.125 0.25-6.5 0.25-12.75 0.75-19.125 1.625-3.75 0.5-7.5 0.875-11 1.625-2.75 0.5-5.875 0.875-8.625 1.625-2.375 0.5-4.875 0.875-7.25 1.625-2.125 0.5-4.25 0.875-6.25 1.625-1.875 0.5-3.75 0.875-5.625 1.625-1.875 0.5-3.5 0.875-5.125 1.625-1.625 0.5-3.25 0.875-4.875 1.625-1.375 0.5-3 0.875-4.375 1.625-1.375 0.5-2.75 0.875-4.25 1.625-1.375 0.5-2.5 0.875-4 1.625-1.125 0.5-2.5 0.875-3.75 1.625-1.125 0.5-2.375 0.875-3.75 1.625-1.125 0.5-2.375 0.875-3.5 1.625-1.125 0.5-2.125 0.875-3.25 1.625-1.125 0.5-2.125 0.875-3.25 1.625-0.875 0.5-2.125 0.875-3 1.625-0.875 0.5-1.875 0.875-3 1.625-0.875 0.5-1.875 0.875-2.75 1.625-0.875 0.5-1.875 0.875-2.75 1.625-0.875 0.5-1.875 0.875-2.5 1.625-0.875 0.5-1.625 0.875-2.5 1.625-0.875 0.5-1.625 0.875-2.5 1.625-0.75 0.5-1.625 0.875-2.375 1.625-0.75 0.5-1.625 0.875-2.375 1.625-0.75 0.5-1.625 0.875-2.375 1.625-0.75 0.5-1.375 0.875-2.375 1.625-0.75 0.5-1.375 0.875-2.125 1.625-0.75 0.5-1.375 0.875-2.125 1.625-0.75 0.5-1.375 0.875-2.125 1.625-0.75 0.5-1.375 0.875-2.125 1.625-0.75 0.5-1.375 0.875-1.875 1.625-0.75 0.5-1.375 0.875-1.875 1.625-0.75 0.5-1.125 0.875-1.875 1.625-0.75 0.5-1.125 0.875-1.875 1.625-0.75 0.5-1.125 0.875-1.875 1.625-0.75 0.5-1.125 0.875-1.875 1.625-0.5 0.5-1.125 0.875-1.625 1.625-0.5 0.5-1.125 0.875-1.625 1.625-0.5 0.5-1.125 0.875-1.625 1.625-0.5 0.5-1.125 0.875-1.625 1.625l-1.625 1.625-1.625 1.625c-0.5 0.5-0.875 0.875-1.375 1.625-0.5 0.5-0.875 0.875-1.375 1.625-0.5 0.5-0.875 0.875-1.375 1.625-0.5 0.5-0.875 0.875-1.375 1.625-0.5 0.5-0.875 0.875-1.375 1.625-0.5 0.5-0.875 0.875-1.375 1.625-0.5 0.5-0.875 0.875-1.375 1.625-0.5 0.5-0.875 0.875-1.125 1.625-0.5 0.5-0.875 0.875-1.125 1.625-0.5 0.5-0.875 0.875-1.125 1.625-0.5 0.5-0.75 0.875-1.125 1.625-0.5 0.5-0.75 0.875-1.125 1.625-0.5 0.5-0.75 0.875-1.125 1.625-0.5 0.5-0.75 0.875-1.125 1.625-0.5 0.5-0.75 0.875-1.125 1.625-0.5 0.5-0.75 0.875-1.125 1.625-0.5 0.5-0.75 0.875-1.125 1.625-0.25 0.5-0.75 0.875-0.875 1.625-0.25 0.5-0.75 0.875-0.875 1.625-0.25 0.5-0.75 0.875-0.875 1.625-0.25 0.5-0.75 0.875-0.875 1.625-0.25 0.5-0.75 0.875-0.875 1.625-0.25 0.5-0.75 0.875-0.875 1.625-0.25 0.5-0.75 0.875-0.875 1.625-0.25 0.5-0.75 0.875-0.875 1.625-0.25 0.5-0.5 0.875-0.875 1.625-0.25 0.5-0.5 0.875-0.875 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.75 1.625-0.25 0.5-0.5 0.875-0.5 1.625-0.25 0.5-0.5 0.875-0.5 1.625-0.25 0.5-0.5 0.875-0.5 1.625-0.25 0.5-0.5 0.875-0.5 1.625-0.25 0.5-0.5 0.875-0.5 1.625-0.25 0.5-0.25 0.875-0.5 1.625-0.25 0.5-0.25 0.875-0.5 1.625-0.25 0.5-0.25 0.875-0.5 1.625-0.25 0.5-0.25 0.875-0.5 1.625-0.25 0.5-0.25 0.875-0.5 1.625-0.25 0.5-0.25 0.875-0.5 1.625-0.25 0.5-0.25 0.875-0.5 1.625-0.25 0.5-0.25 0.875-0.5 1.625-0.25 0.5-0.25 0.875-0.5 1.625-0.25 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5-0.25 0.875-0.25 1.625 0 0.5 0 0.875-0.25 1.625 0 0.5 0 0.875-0.25 1.625 0 0.5 0 0.875-0.25 1.625v1.625 1.625 1.625 3.25 1.625 3.25 1.375 1.625 1.625 1.625 1.625 1.625 1.625 1.625 1.625 1.625c0 0.5 0 0.875 0.25 1.625 0 0.5 0 0.875 0.25 1.625 0 0.5 0 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0 0.5 0.25 0.875 0.25 1.625 0.25 0.5 0.25 0.875 0.5 1.625 0.25 0.5 0.25 0.875 0.5 1.625 0.25 0.5 0.25 0.875 0.5 1.625 0.25 0.5 0.25 0.875 0.5 1.625 0.25 0.5 0.25 0.875 0.5 1.625 0.25 0.5 0.25 0.875 0.5 1.625 0.25 0.5 0.25 0.875 0.5 1.625 0.25 0.5 0.25 0.875 0.5 1.625 0.25 0.5 0.25 0.875 0.5 1.625 0.25 0.5 0.5 0.875 0.5 1.625 0.25 0.5 0.5 0.875 0.5 1.625 0.25 0.5 0.5 0.875 0.5 1.625 0.25 0.5 0.5 0.875 0.5 1.625 0.25 0.5 0.5 0.875 0.5 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.75 1.625 0.25 0.5 0.5 0.875 0.875 1.625 0.25 0.5 0.5 0.875 0.875 1.625 0.25 0.5 0.5 0.875 0.875 1.625 0.25 0.5 0.75 0.875 0.875 1.625 0.25 0.5 0.75 0.875 0.875 1.625 0.25 0.5 0.75 0.875 0.875 1.625 0.25 0.5 0.75 0.875 0.875 1.625 0.25 0.5 0.75 0.875 0.875 1.625 0.25 0.5 0.75 0.875 0.875 1.625 0.25 0.5 0.75 0.875 0.875 1.625 0.25 0.5 0.75 0.875 0.875 1.625 0.25 0.5 0.75 0.875 1.125 1.625 0.5 0.5 0.75 0.875 1.125 1.625 0.5 0.5 0.75 0.875 1.125 1.625 0.5 0.5 0.75 0.875 1.125 1.625 0.5 0.5 0.75 0.875 1.125 1.625 0.5 0.5 0.75 0.875 1.125 1.625 0.5 0.5 0.75 0.875 1.125 1.625 0.5 0.5 0.875 0.875 1.125 1.625 0.5 0.5 0.875 0.875 1.125 1.625 0.5 0.5 0.875 0.875 1.125 1.625 0.5 0.5 0.875 0.875 1.375 1.625 0.5 0.5 0.875 0.875 1.375 1.625 0.5 0.5 0.875 0.875 1.375 1.625 0.5 0.5 0.875 0.875 1.375 1.625 0.5 0.5 0.875 0.875 1.375 1.625 0.5 0.5 0.875 0.875 1.375 1.625 0.5 0.5 0.875 0.875 1.375 1.625l1.625 1.625 1.625 1.625c0.5 0.5 1.125 0.875 1.625 1.625 0.5 0.5 1.125 0.875 1.625 1.625 0.5 0.5 1.125 0.875 1.625 1.625 0.5 0.5 1.125 0.875 1.625 1.625 0.5 0.5 1.125 0.875 1.875 1.625 0.75 0.5 1.125 0.875 1.875 1.625 0.75 0.5 1.125 0.875 1.875 1.625 0.75 0.5 1.125 0.875 1.875 1.625 0.75 0.5 1.375 0.875 1.875 1.625 0.75 0.5 1.375 0.875 1.875 1.625 0.75 0.5 1.375 0.875 2.125 1.625 0.75 0.5 1.375 0.875 2.125 1.625 0.75 0.5 1.375 0.875 2.125 1.625 0.75 0.5 1.375 0.875 2.125 1.625 0.75 0.5 1.375 0.875 2.375 1.625 0.75 0.5 1.625 0.875 2.375 1.625 0.75 0.5 1.625 0.875 2.375 1.625 0.75 0.5 1.625 0.875 2.375 1.625 0.875 0.5 1.625 0.875 2.5 1.625 0.875 0.5 1.625 0.875 2.5 1.625 0.875 0.5 1.875 0.875 2.5 1.625 0.875 0.5 1.875 0.875 2.75 1.625 0.875 0.5 1.875 0.875 2.75 1.625 0.875 0.5 1.875 0.875 3 1.625 0.875 0.5 2.125 0.875 3 1.625 1.125 0.5 2.125 0.875 3.25 1.625 1.125 0.5 2.125 0.875 3.25 1.625 1.125 0.5 2.375 0.875 3.5 1.625 1.125 0.5 2.375 0.875 3.75 1.625 1.125 0.5 2.5 0.875 3.75 1.625 1.375 0.5 2.5 0.875 4 1.625 1.375 0.5 2.75 0.875 4.25 1.625 1.375 0.5 3 0.875 4.375 1.625 1.625 0.5 3.25 0.875 4.875 1.625 1.625 0.5 3.5 0.875 5.125 1.625 1.875 0.5 3.75 0.875 5.875 1.625 2.125 0.5 4.25 1.125 6.25 1.625 2.375 0.5 4.875 1.125 7.25 1.625 2.75 0.5 5.875 1.125 8.625 1.625 3.75 0.75 7.5 1.125 11.125 1.625 9.25 1.125 19.125 1.625 28.875 1.625h1.375c9.25 0 18.375-0.75 27.5-1.625 3.75-0.5 7.25-0.875 10.75-1.625 2.75-0.5 5.625-0.875 8.375-1.625 2.375-0.5 4.625-0.875 7-1.625 2.125-0.5 4.25-0.875 6.25-1.625 1.875-0.5 3.75-0.875 5.625-1.625 1.625-0.5 3.5-0.875 5.125-1.625 1.625-0.5 3.25-0.875 4.625-1.625 1.375-0.5 3-0.875 4.375-1.625 1.375-0.5 2.75-0.875 4.25-1.625 1.375-0.5 2.5-0.875 4-1.625 1.125-0.5 2.5-0.875 3.75-1.625 1.125-0.5 2.375-0.875 3.5-1.625 1.125-0.5 2.375-0.875 3.5-1.625 1.125-0.5 2.125-0.875 3.25-1.625 1.125-0.5 2.125-0.875 3.25-1.625 0.875-0.5 2.125-0.875 3-1.625 0.875-0.5 1.875-0.875 3-1.625 0.875-0.5 1.875-0.875 2.75-1.625 0.875-0.5 1.875-0.875 2.75-1.625 0.875-0.5 1.875-0.875 2.5-1.625 0.875-0.5 1.625-0.875 2.5-1.625 0.875-0.5 1.625-0.875 2.5-1.625 0.875-0.5 1.625-0.875 2.5-1.625 0.75-0.5 1.625-0.875 2.375-1.625 0.75-0.5 1.625-0.875 2.375-1.625 0.75-0.5 1.375-0.875 2.375-1.625 0.75-0.5 1.375-0.875 2.125-1.625 0.75-0.5 1.375-0.875 2.125-1.625 0.75-0.5 1.375-0.875 2.125-1.625 0.75-0.5 1.375-0.875 2.125-1.625 0.75-0.5 1.375-0.875 1.875-1.625 0.75-0.5 1.375-0.875 1.875-1.625 0.75-0.5 1.125-0.875 1.875-1.625 0.75-0.5 1.125-0.875 1.875-1.625 0.75-0.5 1.125-0.875 1.875-1.625 0.75-0.5 1.125-0.875 1.875-1.625 0.5-0.5 1.125-0.875 1.625-1.625 0.5-0.5 1.125-0.875 1.625-1.625 0.5-0.5 1.125-0.875 1.625-1.625 0.5-0.5 1.125-0.875 1.625-1.625 0.5-0.5 1.125-0.875 1.625-1.625l1.625-1.625 1.625-1.625c0.5-0.5 0.875-0.875 1.375-1.625 0.5-0.5 0.875-0.875 1.375-1.625 0.5-0.5 0.875-0.875 1.375-1.625 0.5-0.5 0.875-0.875 1.375-1.625 0.5-0.5 0.875-0.875 1.375-1.625 0.5-0.5 0.875-0.875 1.375-1.625 0.5-0.5 0.875-0.875 1.375-1.625 0.5-0.5 0.875-0.875 1.375-1.625 0.5-0.5 0.875-0.875 1.125-1.625 0.5-0.5 0.75-0.875 1.125-1.625 0.5-0.5 0.875-0.875 1.125-1.625 0.5-0.5 0.75-0.875 1.125-1.625 0.5-0.5 0.75-0.875 1.125-1.625 0.5-0.5 0.75-0.875 1.125-1.625 0.5-0.5 0.75-0.875 1.125-1.625 0.5-0.5 0.75-0.875 1.125-1.625 0.5-0.5 0.75-0.875 1.125-1.625 0.5-0.5 0.75-0.875 0.875-1.625 0.25-0.5 0.75-0.875 0.875-1.625 0.25-0.5 0.75-0.875 0.875-1.625 0.25-0.5 0.75-0.875 0.875-1.625 0.25-0.5 0.75-0.875 0.875-1.625 0.25-0.5 0.75-0.875 0.875-1.625 0.25-0.5 0.75-0.875 0.875-1.625 0.25-0.5 0.5-0.875 0.875-1.625 0.25-0.5 0.75-0.875 0.875-1.625 0.25-0.5 0.5-0.875 0.875-1.625 0.25-0.5 0.5-0.875 0.875-1.625 0.25-0.5 0.5-0.875 0.875-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.75-1.625 0.25-0.5 0.5-0.875 0.5-1.625 0.25-0.5 0.5-0.875 0.5-1.625 0.25-0.5 0.5-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0.25-0.5 0.25-0.875 0.5-1.625 0-0.5 0.25-0.875 0.25-1.625 0-0.5 0.25-0.875 0.25-1.625 0-0.5 0.25-0.875 0.25-1.625 0-0.5 0.25-0.875 0.25-1.625 0-0.5 0.25-0.875 0.25-1.625 0-0.5 0.25-0.875 0.25-1.625 0-0.5 0.25-0.875 0.25-1.625 0-0.5 0.25-0.875 0.25-1.625 0-0.5 0.25-0.875 0.25-1.625 0-0.5 0-0.875 0.25-1.625 0-0.5 0-0.875 0.25-1.625 0-0.5 0-0.875 0.25-1.625 0-0.5 0-0.875 0.25-1.625 0-0.5 0-0.875 0.25-1.625v-11.375h-3.125zM589.714646 384c-12.625 0-25.375-12.75-25.375-25.375 0-12.75 12.75-25.375 25.375-25.375 19.375 0 31.875 12.625 31.875 25.375-0.125 12.625-12.75 25.375-31.875 25.375zM729.589646 384c-12.625 0-25.375-12.75-25.375-25.375 0-12.75 12.75-25.375 25.375-25.375 19.125 0 31.875 12.625 31.875 25.375 0 12.625-12.75 25.375-31.875 25.375zM328.714646 568.75c-19.125 0-38.375-12.625-38.375-31.625 0-19.125 19.375-31.875 38.375-31.875s31.875 12.75 31.875 31.875-12.875 31.625-31.875 31.625zM506.964646 568.75c-19.125 0-38.125-12.625-38.125-31.625 0-19.125 19.125-31.875 38.125-31.875 19.125 0 31.875 12.75 31.875 31.875s-12.875 31.625-31.875 31.625z"  horiz-adv-x="1059" />
+
+    
+    <glyph glyph-name="shrink-right" unicode="&#58984;" d="M52.294-28.71900000000005h899.793c16.546 0 29.999 13.405 29.999 29.999v59.974c-0.013 16.562-13.436 29.985-29.998 29.999h-899.795c-16.57 0-29.999-13.429-29.999-29.999v-59.974c0-16.617 13.429-29.999 29.999-29.999zM952.087 451.165h-479.884c-16.57 0-29.999-13.405-29.999-29.999v-59.974c0 0 0 0 0 0 0-16.572 13.428-30.01 29.997-30.022h479.885c16.571 0.013 29.999 13.448 29.999 30.022 0 0 0 0 0 0v59.974c0 16.593-13.429 29.999-29.999 29.999zM52.294 691.0840000000001h899.793c16.554 0.013 29.972 13.423 29.999 29.974v59.999c0 16.57-13.429 29.999-29.999 29.999h-899.793c-16.57 0-29.999-13.429-29.999-29.999v-59.997c0-16.546 13.429-29.975 29.999-29.975zM45.183 383.53499999999997l239.919-150.598v301.196l-239.919-150.598z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="spread-left" unicode="&#58987;" d="M942.974 770.924h-843.556c-15.513 0-28.124-12.567-28.124-28.124v-56.226c0.012-15.527 12.596-28.111 28.123-28.124h843.559c15.534 0 28.124 12.59 28.124 28.124v56.226c0 15.578-12.59 28.124-28.124 28.124zM99.418 321.033h449.891c15.534 0 28.124 12.567 28.124 28.124v56.226c0 0 0 0 0 0 0 15.537-12.589 28.134-28.122 28.146h-449.892c-15.534-0.012-28.124-12.608-28.124-28.146 0 0 0 0 0 0v-56.226c0-15.556 12.59-28.124 28.124-28.124zM942.974 96.10900000000004h-843.556c-15.519-0.012-28.099-12.584-28.124-28.101v-56.249c0-15.534 12.59-28.124 28.124-28.124h843.556c15.534 0 28.124 12.59 28.124 28.124v56.248c0 15.513-12.59 28.103-28.124 28.102zM949.641 384.436l-224.924 141.186v-282.37l224.924 141.186z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="camera" unicode="&#58976;" d="M884.3 648.6H704.2L679.5 698l-0.2 0.4c-1.9 3.6-3.6 6.9-5.1 9.9-12 23.4-21.5 41.9-54.1 41.9H416.7c-32.9 0-43.7-21.3-55.1-43.8-1.3-2.6-2.7-5.3-4.2-8.1l-24.8-49.7H152.4c-34 0-61.7-27.7-61.7-61.7v-488c0-34 27.7-61.7 61.7-61.7h731.9c34 0 61.7 27.7 61.7 61.7v488c0 34-27.7 61.7-61.7 61.7zM904 98.89999999999998c0-10.8-8.8-19.7-19.7-19.7H152.4c-10.8 0-19.7 8.8-19.7 19.7v488c0 10.8 8.8 19.7 19.7 19.7h206.1l36.2 72.5c1.5 2.9 2.9 5.7 4.3 8.3 10.6 20.8 11.1 20.8 17.7 20.8H620c4.6 0 5.8-0.6 5.8-0.6 2-1.2 7.2-11.2 10.9-18.5 1.6-3.1 3.3-6.5 5.3-10.1l36.2-72.4h206.1c10.8 0 19.7-8.8 19.7-19.7v-488zM525.5 565.5c-123.5 0-223.6-100.1-223.6-223.6S402 118.20000000000005 525.5 118.20000000000005s223.7 100.1 223.7 223.7c0 123.5-100.2 223.6-223.7 223.6z m0-402.5c-98.8 0-178.9 80.1-178.9 178.9 0 98.8 80.1 178.9 178.9 178.9 98.8 0 178.9-80.1 178.9-178.9 0-98.8-80.1-178.9-178.9-178.9z m246 402.5v-44.7H861v44.7h-89.5z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="note" unicode="&#58990;" d="M987.2 384.36L512.43 859.13a84.75 84.75 0 0 1-65 24.71L111.55 864.09a84.83 84.83 0 0 1-79.65-79.65L12.15 448.57a84.57 84.57 0 0 1 24.69-65l474.8-474.8a84.91 84.91 0 0 1 119.93 0L987.2 264.41999999999996a84.9 84.9 0 0 1 0 119.94z m-39.28-80.66L592.29-51.91999999999996a29.31 29.31 0 0 0-41.37 0L76.1 422.9a29.22 29.22 0 0 0-8.49 22.38l19.74 335.88a29.29 29.29 0 0 0 27.48 27.48l335.9 19.75a29.32 29.32 0 0 0 22.38-8.52l474.8-474.8a29.31 29.31 0 0 0 0.01-41.37zM236.86 659.14c-50.92-50.95-50.92-133.8 0-184.72a130.61 130.61 0 1 1 184.71 184.72c-50.89 50.86-133.77 50.86-184.71 0zM382.29 513.7c-28.38-28.38-77.78-28.38-106.15 0a75.08 75.08 0 1 0 106.15 0z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="refresh" unicode="&#58985;" d="M928 810.666667c-18.133333 0-32-13.866667-32-32v-164.266667C816 747.733333 669.866667 832 512 832 264.533333 832 64 631.4666669999999 64 384s200.533333-448 448-448c230.4 0 422.4 172.8 445.866667 402.133333 2.133333 17.066667-10.666667 33.066667-28.8 35.2-17.066667 2.133333-33.066667-10.666667-35.2-28.8C873.6 148.26666699999998 709.333333 0 512 0c-212.266667 0-384 171.733333-384 384s171.733333 384 384 384c137.6 0 264.533333-74.666667 332.8-192H693.333333c-18.133333 0-32-13.866667-32-32s13.866667-32 32-32h266.666667V778.666667c0 18.133333-14.933333 32-32 32z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="female" unicode="&#58977;" d="M774.4 800c-48 35.2-108.8 51.2-172.8 51.2-105.6 0-208-51.2-268.8-150.4-89.6-134.4-57.6-313.6 60.8-416l-32-51.2-188.8 121.6S128 384 108.8 352c-22.4-35.2 22.4-64 22.4-64l188.8-121.6-105.6-163.2s-19.2-32 16-51.2c38.4-22.4 57.6 12.8 57.6 12.8l102.4 160 185.6-121.6s48-28.8 70.4 6.4c19.2 28.8-25.6 57.6-25.6 57.6L432 192l32 48c44.8-22.4 92.8-32 137.6-32 105.6 0 208 51.2 268.8 150.4 96 147.2 51.2 345.6-96 441.6z m35.2-400c-44.8-67.2-118.4-108.8-201.6-108.8-44.8 0-92.8 12.8-131.2 38.4-112 73.6-147.2 220.8-73.6 332.8 44.8 64 121.6 105.6 201.6 108.8 44.8 0 92.8-12.8 131.2-38.4 112-73.6 147.2-220.8 73.6-332.8z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="male" unicode="&#58978;" d="M889.6 800h-240s-35.2 0-38.4-41.6c0-19.2 16-38.4 38.4-38.4h140.8l-179.2-179.2C556.8 582.4 489.6 608 416 608 240 608 96 464 96 288s144-320 320-320 320 144 320 320c0 73.6-25.6 140.8-67.2 195.2l179.2 179.2v-140.8c0-22.4 19.2-38.4 38.4-38.4 22.4 0 38.4 19.2 38.4 41.6V764.8h3.2C924.8 800 889.6 800 889.6 800zM416 48c-131.2 0-236.8 105.6-236.8 236.8 0 131.2 105.6 236.8 236.8 236.8s236.8-105.6 236.8-236.8c0-131.2-105.6-236.8-236.8-236.8z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="screen-restore" unicode="&#59224;" d="M582.6 454.6v320h50V540l274 274 35.4-35.4-274-274h234.6v-50h-320zM117.4-46l274 274v-234.6h50v320h-320v-50H356l-274-274 35.4-35.4zM132 764h302V814H82v-352h50V764z m760-760H590v-50h352V306h-50v-302z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="password" unicode="&#58995;" d="M519.2 343.29999999999995c-41.1 0-74.4-33.3-74.4-74.4 0-29.7 17.5-55 42.5-67.1v-81.9c0-17.6 14.3-31.9 31.9-31.9 17.6 0 31.9 14.3 31.9 31.9v81.9c25.1 12 42.5 37.4 42.5 66.9 0 41.3-33.2 74.6-74.4 74.6zM827.6-62.10000000000002H189.4c-35.9 0-65.1 29.2-65.1 65.1V428.4c0 35.9 29.2 65.1 65.1 65.1h638.2c17.3 0 33.7-6.7 46-19.1 12.3-12.3 19.1-28.7 19.1-46V3c0-35.9-29.2-65.1-65.1-65.1zM231.9 427.2c-34.8 0-41.3-6.6-41.3-41.3v-340.4c0-34.8 6.6-41.3 41.3-41.3h553.2c34.8 0 41.3 6.6 41.3 41.3V385.9c0 34.8-6.6 41.3-41.3 41.3H231.9zM519.2 86.70000000000005c-18.3 0-33.2 14.8-33.2 33.2V201c-26.3 12.8-42.6 38.8-42.6 67.8 0 41.8 33.9 75.7 75.7 75.7s75.7-33.9 75.7-75.7c0-29-16.3-55-42.5-67.8v-81.1c0.1-18.2-14.9-33.2-33.1-33.2zM519.2 342c-40.4 0-73.2-32.9-73.2-73.2 0-28.3 16.1-53.6 41.9-65.8l0.7-0.4V120c0-17 13.7-30.7 30.7-30.7S550 103.10000000000002 550 120v82.6l0.7 0.4c25.8 12.3 41.9 37.5 41.9 65.8-0.2 40.4-33.1 73.2-73.4 73.2zM207 523.1c-9.1 0-17.6 3.5-23.9 10-6.4 6.4-10 15-10 23.9v2h-0.2l0.2 1.4c0.1 0.5 0.1 0.9 0.2 1.4l0.2 1c0.1 0.6 0.2 1.4 0.4 2 15.3 75.7 57 144.2 117.2 193 29.9 24.2 63.4 43 99.8 56 37.5 13.3 77 20.2 117.5 20.2 61 0 120.8-16.3 173-47.2 50.6-29.9 93-72.8 122.5-123.8 4-5.6 6.1-12.2 6.1-19.2 0-18.3-15-33.3-33.3-33.3-13.2 0-25.1 7.7-30.4 19.8-49.2 84.6-140.4 137.4-238 137.4-128.1 0-238.2-87.1-267.6-211.8v-0.2c-0.7-18.4-15.4-32.6-33.7-32.6z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="senior" unicode="&#58996;" d="M719.9 249.39999999999998L514.7 379.5V485.1C615.6 419 731.5 344 731.5 344s139.2-45.6 139.2 106.5c0 93-172.5 112.1-197.2 11.8l-69.6 47.3s24.2 101.5 162.4 106.5c138.2 4.9 192-94.6 190.9-199.6-1.2-104.7-136-198.3-237.3-167.1zM561 414c-4-19-23-33.7-47.6-33.7l-6.9 4.3-217.3 137.8S171 555.2 160.8 439c-10.2-116.1 147.4-129.5 186.8-23.8l81.7-47.6s-65.1-119.1-198.5-119.1C97.3 248.5 0.6 423.8 114 546.3c113.5 122.4 218.6 64.6 257 35.7 16.4-12.4 85.3-57.9 158.6-105.9l3.1-2.4c28.3-18.2 33.4-35.6 28.3-59.7zM434.1 149.70000000000005h212c16.7 0 30.3-13.6 30.3-30.3v-15.1c0-16.7-13.6-30.3-30.3-30.3h-212c-16.7 0-30.3 13.6-30.3 30.3v15.1c0 16.8 13.6 30.3 30.3 30.3z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="theme" unicode="&#58986;" d="M512 800C229.696 800 0 570.304 0 288c0-90.368 30.304-174.496 85.344-236.896 55.264-62.624 129.152-97.12 208.128-97.12 81.568 0 161.536 36.832 231.264 106.592l2.272 2.496c65.792 81.472 132.896 121.056 205.088 121.056 46.72 0 89.216-15.872 126.688-29.92 30.336-11.328 56.576-21.12 81.216-21.12C1024 133.08799999999997 1024 241.664 1024 288c0 282.304-229.696 512-512 512z m428-602.912c-13.088 0-35.296 8.288-58.784 17.088-40.48 15.136-90.848 33.952-149.12 33.952-92.352 0-175.328-46.944-253.76-143.456-57.184-56.704-121.056-86.688-184.832-86.688-60.352 0-117.216 26.784-160.128 75.456C88.64 144.12800000000004 64 213.216 64 288 64 535.04 264.96 736 512 736s448-200.96 448-448c0-27.328-1.952-90.912-20-90.912zM800.704 379.93600000000004m-64 0a64 64 0 1 1 128 0 64 64 0 1 1-128 0ZM457.024 582.624m-64 0a64 64 0 1 1 128 0 64 64 0 1 1-128 0ZM672.704 555.9359999999999m-64 0a64 64 0 1 1 128 0 64 64 0 1 1-128 0ZM291.392 443.936m-64 0a64 64 0 1 1 128 0 64 64 0 1 1-128 0ZM278.4 197.24800000000005m-96 0a96 96 0 1 1 192 0 96 96 0 1 1-192 0Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="tread" unicode="&#59077;" d="M860.8 172.79999999999995l6.4-57.6-6.4 57.6c12.8 0 25.6 3.2 35.2 12.8 6.4 9.6 6.4 22.4 3.2 32l57.6 12.8-57.6-12.8L800 553.6c-6.4 28.8-25.6 51.2-48 64-9.6 6.4-22.4 9.6-32 9.6H182.4c-22.4 3.2-41.6-6.4-51.2-25.6-6.4-9.6-6.4-19.2-9.6-28.8v-342.4c0-19.2 9.6-38.4 28.8-48 6.4-3.2 12.8-6.4 19.2-6.4h192l19.2-25.6 147.2-188.8c6.4-9.6 19.2-12.8 28.8-9.6 16 3.2 25.6 19.2 22.4 35.2l-9.6 118.4-6.4 67.2h297.6z m-233.6-57.6l9.6-128c3.2-28.8-9.6-54.4-28.8-73.6-35.2-32-92.8-28.8-124.8 6.4l-156.8 195.2H179.2c-19.2 0-38.4 6.4-57.6 16-35.2 19.2-57.6 57.6-57.6 99.2V572.8c0 19.2 6.4 38.4 16 57.6 19.2 38.4 57.6 60.8 99.2 54.4h537.6c67.2-3.2 121.6-48 137.6-112l102.4-339.2c6.4-28.8 3.2-57.6-12.8-80-19.2-22.4-48-38.4-76.8-38.4h-240zM304 627.2v-451.2h57.6V627.2H304z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="praise" unicode="&#59078;" d="M860.8 595.2h-297.6l6.4 67.2 9.6 118.4c3.2 16-6.4 32-22.4 35.2-9.6 3.2-22.4 0-28.8-9.6l-147.2-188.8-19.2-25.6h-192c-6.4 0-12.8-3.2-19.2-6.4-19.2-9.6-28.8-28.8-28.8-48v-342.4c0-9.6 3.2-22.4 9.6-28.8 9.6-19.2 28.8-28.8 48-25.6h537.6c12.8 0 22.4 3.2 32 9.6 25.6 12.8 44.8 35.2 48 64l102.4 336 57.6-12.8-57.6 12.8c3.2 9.6 0 22.4-3.2 32-9.6 6.4-22.4 12.8-35.2 12.8l6.4 57.6-6.4-57.6z m-233.6 57.6h240c28.8 0 57.6-12.8 76.8-38.4 16-22.4 19.2-54.4 12.8-80l-102.4-339.2c-16-64-70.4-108.8-137.6-112H179.2c-41.6-3.2-80 19.2-99.2 54.4-9.6 19.2-16 38.4-16 57.6V537.6c0 41.6 22.4 80 57.6 99.2 19.2 9.6 38.4 12.8 57.6 16h144L480 848c32 35.2 89.6 38.4 124.8 6.4 19.2-19.2 32-44.8 28.8-73.6l-6.4-128z m-323.2-512h57.6V592H304v-451.2z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="star-fill" unicode="&#58968;" d="M752-43.200000000000045c-9.6 0-20.8 3.2-30.4 8l-208 104-209.6-104c-20.8-11.2-48-9.6-67.2 4.8-19.2 14.4-30.4 40-25.6 64l43.2 224L89.6 411.2C72 428.8 65.6 456 72 478.4c8 24 27.2 41.6 52.8 44.8l228.8 41.6 102.4 208c11.2 22.4 33.6 36.8 57.6 36.8s48-14.4 57.6-36.8l102.4-208 228.8-40c24-3.2 44.8-20.8 51.2-44.8 8-24 1.6-49.6-16-67.2L772.8 257.6l41.6-224c4.8-25.6-6.4-49.6-25.6-64-9.6-8-22.4-12.8-36.8-12.8z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="rate" unicode="&#59003;" d="M959.008 489.984l-308 47.008L512 832 372.992 536.992l-308-47.008 223.008-228-52.992-324L512 90.976l276.992-152.992-52.992 324zM512 156L304 39.00800000000004l40 235.008-179.008 182.016 242.016 32 104.992 224 104-224 240.992-34.016L680 273.024l36.992-235.008z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="template-1" unicode="&#58966;" d="M512 384zM43.52 601.6l409.6-176.64c58.88-30.72 110.08 0 110.08 0l414.72 174.08 2.56 2.56c10.24 5.12 15.36 15.36 15.36 28.16 0 15.36-10.24 28.16-23.04 30.72L563.2 837.12c-56.32 23.04-97.28 0-97.28 0L46.08 660.48c-12.8-5.12-20.48-17.92-20.48-30.72s7.68-23.04 17.92-28.16z m0 0M512 222.72000000000003c-2.56 0-7.68 0-10.24 2.56l-486.4 215.04c-12.8 5.12-17.92 20.48-12.8 33.28 5.12 12.8 20.48 17.92 33.28 12.8L512 276.48 988.16 486.4c12.8 5.12 28.16 0 33.28-12.8 5.12-12.8 0-28.16-12.8-33.28l-486.4-215.04c-2.56-2.56-7.68-2.56-10.24-2.56zM512 71.67999999999995c-2.56 0-7.68 0-10.24 2.56l-486.4 215.04c-12.8 5.12-17.92 20.48-12.8 33.28 5.12 10.24 20.48 17.92 33.28 10.24L512 125.44000000000005 988.16 332.79999999999995c12.8 5.12 28.16 0 33.28-12.8 5.12-12.8 0-28.16-12.8-33.28l-486.4-215.04H512zM512-79.36000000000001c-2.56 0-7.68 0-10.24 2.56l-486.4 215.04c-12.8 5.12-17.92 20.48-12.8 33.28 5.12 12.8 20.48 17.92 33.28 12.8L512-25.600000000000023l476.16 209.92c12.8 5.12 28.16 0 33.28-12.8 5.12-12.8 0-28.16-12.8-33.28l-486.4-215.04c-2.56-2.56-7.68-2.56-10.24-2.56z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="vercode" unicode="&#59001;" d="M513.807059-128C351.171765-128 58.428235 126.19294100000002 54.211765 376.16941199999997V662.287059a93.364706 93.364706 0 0 0 81.317647 88.545882 570.428235 570.428235 0 0 1 163.237647 40.357647A393.336471 393.336471 0 0 1 446.945882 872.508235a101.797647 101.797647 0 0 0 120.470589 5.421177A629.458824 629.458824 0 0 1 716.8 792.395294a1255.303529 1255.303529 0 0 1 169.863529-38.550588 98.785882 98.785882 0 0 0 79.510589-90.955294 2911.171765 2911.171765 0 0 0-3.011765-291.538824C924.611765 49.09176500000001 672.828235-128 513.807059-128z m0 963.764706a39.152941 39.152941 0 0 1-24.696471-7.830588A438.512941 438.512941 0 0 0 319.247059 734.569412a608.376471 608.376471 0 0 0-180.705883-43.369412 33.731765 33.731765 0 0 1-24.094117-30.117647v-283.708235C118.663529 155.10588199999995 389.722353-67.76470600000005 513.807059-67.76470600000005s354.183529 148.178824 391.529412 444.536471c9.035294 175.887059 0 281.901176 0 283.105882a38.550588 38.550588 0 0 1-29.515295 33.731765 1287.830588 1287.830588 0 0 0-180.705882 41.562353A676.442353 676.442353 0 0 0 536.094118 829.741176a37.345882 37.345882 0 0 1-24.094118 6.02353zM784.865882 479.171765L487.905882 198.47529399999996a40.357647 40.357647 0 0 0-49.392941-4.818823l-7.830588 6.625882-161.430588 171.068235a40.357647 40.357647 0 1 0 60.235294 55.416471l133.722353-141.552941 267.444706 252.988235a40.357647 40.357647 0 1 0 55.41647-60.235294"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="service" unicode="&#58918;" d="M849.00812012 487.71642715A27.54528398 27.54528398 0 0 1 849.00812012 496.71080566 337.28919434 337.28919434 0 0 1 174.42973145 496.71080566a27.54528398 27.54528398 0 0 1-1e-8-8.99437852 147.28294776 147.28294776 0 0 1-112.42973144-140.53716386V328.06620849a148.40724551 148.40724551 0 0 1 123.67270459-143.34790781A308.6196126 308.6196126 0 0 1 414.4672083-9.222985839999978h5.05933769a84.32229815 84.32229815 0 1 1 0 56.21486573 252.40474688 252.40474688 0 0 0-172.01748955 137.16427235h31.48032481A35.41536562 35.41536562 0 0 1 314.96689531 215.63647705000005V458.48469697a35.41536562 35.41536562 0 0 1-35.97751406 34.29106787H230.64459717A26.42098711 26.42098711 0 0 1 230.64459717 496.71080566a281.07432862 281.07432862 0 0 0 562.14865723 0 26.42098711 26.42098711 0 0 1 0-3.3728915h-48.34478497a35.41536562 35.41536562 0 0 1-35.97751406-34.29106875V215.63647705000005a35.41536562 35.41536562 0 0 1 35.97751406-34.29106787h63.52279893A150.0936917 150.0936917 0 0 1 961.43785156 328.06620849v19.11305479a147.28294776 147.28294776 0 0 1-112.42973144 140.53716386zM498.22735801 46.991879880000056a28.10743242 28.10743242 0 1 0-28.1074333-28.10743242 28.10743242 28.10743242 0 0 0 28.10743329 28.10743242zM258.75202959 240.37101797000003h-43.28544639A93.87882598 93.87882598 0 0 0 118.21486572 328.06620849v19.11305479a93.87882598 93.87882598 0 0 0 97.25171748 89.94378516h43.28544639zM905.22298584 328.06620849a93.87882598 93.87882598 0 0 0-97.25171748-89.94378515h-43.28544727V437.12304844h43.28544727A93.87882598 93.87882598 0 0 0 905.22298584 347.17926328zM633.70518418 705.83010615l-20.7995001 7.30793232a28.10743242 28.10743242 0 0 1-17.42660859-56.21486571l16.30231084-6.18363458a28.10743242 28.10743242 0 1 1 21.92379785 51.71767646zM330.14490928 639.49656503A28.10743242 28.10743242 0 0 1 376.80324805 609.14053711 177.63897568 177.63897568 0 0 0 511.71892578 676.59837597a28.10743242 28.10743242 0 0 1 0 56.21486573 231.60524678 231.60524678 0 0 1-181.57401651-93.31667667z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="cellphone" unicode="&#59000;" d="M785.066667 896H238.933333a102.4 102.4 0 0 1-102.4-102.4v-819.2a102.4 102.4 0 0 1 102.4-102.4h546.133334a102.4 102.4 0 0 1 102.4 102.4V793.6a102.4 102.4 0 0 1-102.4 102.4zM238.933333 827.733333h546.133334a34.133333 34.133333 0 0 0 34.133333-34.133333v-648.533333H204.8V793.6a34.133333 34.133333 0 0 0 34.133333 34.133333z m546.133334-887.466666H238.933333a34.133333 34.133333 0 0 0-34.133333 34.133333v102.4h614.4v-102.4a34.133333 34.133333 0 0 0-34.133333-34.133333zM512 8.53333299999997m-34.133333 0a34.133333 34.133333 0 1 1 68.266666 0 34.133333 34.133333 0 1 1-68.266666 0ZM426.666667 725.333333h170.666666a17.066667 17.066667 0 0 1 0 34.133334h-170.666666a17.066667 17.066667 0 0 1 0-34.133334z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="print" unicode="&#58989;" d="M843.946667 603.733333h-47.36V725.333333a90.026667 90.026667 0 0 1-94.72 85.333334H312.32a81.493333 81.493333 0 0 1-85.333333-85.333334v-121.6H170.666667a81.493333 81.493333 0 0 1-85.333334-85.333333v-325.12a89.173333 89.173333 0 0 1 85.333334-93.866667h56.746666v-52.48a89.6 89.6 0 0 1 89.6-89.6h389.973334a89.6 89.6 0 0 1 89.6 89.6v52.48h47.36a97.706667 97.706667 0 0 1 94.72 93.866667V518.4a90.026667 90.026667 0 0 1-94.72 85.333333zM279.466667 725.333333a30.72 30.72 0 0 0 32.853333 33.706667h389.546667c18.773333 0 42.666667-11.52 42.666666-33.706667v-121.6H279.466667z m465.066666-678.4a37.546667 37.546667 0 0 0-37.546666-37.973333H317.013333a37.546667 37.546667 0 0 0-37.546666 37.973333v170.666667a37.546667 37.546667 0 0 0 37.546666 38.4h389.973334a37.546667 37.546667 0 0 0 37.546666-37.973333z m142.506667 146.346667a45.653333 45.653333 0 0 0-42.666667-42.666667h-47.786666v66.133334a89.6 89.6 0 0 1-89.6 89.6H317.013333a89.6 89.6 0 0 1-89.6-89.6v-65.28H170.666667a37.546667 37.546667 0 0 0-33.28 42.666666v324.266667A31.146667 31.146667 0 0 0 170.666667 552.106667h673.28c19.2 0 42.666667-11.52 42.666666-33.706667z m-640 281.173333h-37.546667a13.226667 13.226667 0 0 0 0 26.026667h38.826667a13.226667 13.226667 0 1 0 0-26.026667z m94.293333 0H298.666667a13.226667 13.226667 0 1 0 0 26.026667h42.666666a13.226667 13.226667 0 0 0 0-26.026667z m426.666667-116.48H248.32a13.226667 13.226667 0 0 0 0 26.026667H768a13.226667 13.226667 0 0 0 0-26.026667z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="cols" unicode="&#58896;" d="M128 448h384V832H128z m64 320h256v-256H192zM576 832v-384h384V832z m320-320H640V768h256zM192 384h64v-384H192zM384 384h64v-384H384zM640 384h64v-384H640zM832 384h64v-384h-64z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="wifi" unicode="&#59360;" d="M723 275.5C666.8 324.4 593.4 354 513 354s-153.8-29.6-210.1-78.6c-3.2-2.8-3.6-7.8-0.8-11.2l36-42.9c2.9-3.4 8-3.8 11.4-0.9C393.1 258.8 450.3 282 513 282s119.9-23.2 163.5-61.5c3.4-2.9 8.5-2.5 11.4 0.9l36 42.9c2.8 3.3 2.4 8.3-0.9 11.2zM840.4 415.6C751.7 489.5 637.6 534 513 534s-238.7-44.5-327.5-118.4c-3.4-2.8-3.8-7.9-1-11.3l36-42.9c2.8-3.4 7.9-3.8 11.2-1C308 423.8 406.1 462 513 462s205-38.2 281.2-101.6c3.4-2.8 8.4-2.4 11.2 1l36 42.9c2.8 3.4 2.4 8.5-1 11.3zM957.1 554.6C835.7 654.2 680.3 714 511 714c-168.2 0-322.6-59-443.7-157.4-3.5-2.8-4-7.9-1.1-11.4l36-42.9c2.8-3.3 7.8-3.8 11.1-1.1C222 589.3 360.3 642 511 642c151.8 0 291-53.5 400-142.7 3.4-2.8 8.4-2.3 11.2 1.1l36 42.9c2.9 3.4 2.4 8.5-1.1 11.3zM512 118m-64 0a64 64 0 1 1 128 0 64 64 0 1 1-128 0Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="export" unicode="&#59005;" d="M896.4374528 479.830016c0 26.673152-21.6236032 48.2967552-48.2967552 48.2967552H630.8069376c-26.673152 0-48.2967552-21.6236032-48.2967552-48.2967552v-83.04831147H384.69522773l-2.71428266 5.36849067c-41.336832 87.44686933-35.95195733 204.128256 150.601728 199.94487467v-108.91537067l172.19037866 164.757504L532.58267307 822.7110912v-106.57245867c-228.64418133 5.70709333-263.651328-183.517184-157.433856-314.01028266l4.6891008-5.34664534h-88.46595414c-26.673152 0-48.2967552-21.6236032-48.2967552-48.2967552v-66.78882986h-98.43616426c-26.673152 0-40.4258816-21.6236032-30.71781547-48.2967552l79.10304427-217.33485227c9.70806613-26.673152 39.20145067-48.2967552 65.87460266-48.2967552h603.70670934c23.75898453 0 37.2506624 17.16169387 33.05745066 39.76178347 0.4980736 2.77108053 0.77441707 5.619712 0.77441707 8.53497173v463.765504z m-60.37067093-306.4528896l-21.8464256 60.02223787c-9.70806613 26.673152-39.20145067 48.2967552-65.87460267 48.2967552H303.44697173v30.56708266c0 13.336576 10.81125547 24.14783147 24.14783147 24.14783147h315.28605013v107.1972352c0 13.336576 10.81125547 24.14783147 24.14783147 24.14783147h144.88917333c13.336576 0 24.14783147-10.81125547 24.14783147-24.14783147v-270.2311424z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="rss" unicode="&#59400;" d="M810.666667 42.624C810.666667 395.562667 523.562667 682.666667 170.666667 682.666667v-85.333334c305.834667 0 554.666667-248.832 554.666666-554.709333h85.333334zM512 42.624h85.333333C597.333333 277.930667 405.930667 469.333333 170.666667 469.333333v-85.333333c188.202667 0 341.333333-153.130667 341.333333-341.376zM256 128m-85.333333 0a85.333333 85.333333 0 1 1 170.666666 0 85.333333 85.333333 0 1 1-170.666666 0Z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="slider" unicode="&#59156;" d="M228.7 683.9v-66.7H112v66.7h116.7z m333.2-266.6v-66.7H112v66.7h449.9zM295.4 150.60000000000002V84H112v66.7h183.4v-0.1z m116.6 600c9 0 16.8-3.3 23.5-9.9 6.5-6.5 9.9-14.5 9.9-23.5v-133.3c0-9-3.3-16.8-9.9-23.5-6.5-6.5-14.5-9.9-23.5-9.9H278.8c-9 0-16.8 3.3-23.5 9.9-6.5 6.5-9.9 14.3-9.9 23.5V717.1c0 9 3.3 16.8 9.9 23.5 6.5 6.5 14.3 9.9 23.5 9.9h133.3v0.1h-0.1z m66.7-533.3c9 0 16.8-3.3 23.5-9.9 6.5-6.5 9.9-14.5 9.9-23.5v-133.3c0-9-3.3-16.8-9.9-23.5-6.5-6.5-14.5-9.9-23.5-9.9H345.3c-9 0-16.8 3.3-23.5 9.9-6.5 6.5-9.9 14.5-9.9 23.5V183.89999999999998c0 9 3.3 16.8 9.9 23.5 6.5 6.5 14.3 9.9 23.5 9.9h133.4v0.1zM912 683.9v-66.7H462.1v66.7H912z m0-533.3V84H528.6v66.7h383.3v-0.1h0.1zM745.2 483.9c9 0 16.8-3.3 23.5-9.9 6.5-6.5 9.9-14.5 9.9-23.5v-133.3c0-9-3.3-16.8-9.9-23.5-6.5-6.5-14.5-9.9-23.5-9.9H612c-9 0-16.8 3.3-23.5 9.9-6.5 6.5-9.9 14.3-9.9 23.5V450.6c0 9 3.3 16.8 9.9 23.5 6.5 6.5 14.5 9.9 23.5 9.9l133.2-0.1zM912 417.3v-66.7H795.3v66.7H912z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="email" unicode="&#58904;" d="M834.446 682.553H194.105c-50.176 0-91.022-40.846-91.022-91.022v-423.026c0-50.176 40.846-91.022 91.022-91.022h640.341c50.176 0 91.022 40.846 91.022 91.022V591.531c0 50.176-40.846 91.022-91.022 91.022z m36.409-514.048c0-20.025-16.384-36.409-36.409-36.409H194.105c-20.025 0-36.409 16.384-36.409 36.409V591.531c0 20.025 16.384 36.409 36.409 36.409h640.341c20.025 0 36.409-16.384 36.409-36.409v-423.026zM786.773 537.941L514.275 366.023 241.777 537.941c-12.743 8.078-29.582 4.21-37.661-8.533-8.078-12.743-4.21-29.582 8.533-37.661l286.72-180.907c4.551-2.845 9.557-4.21 14.563-4.21h0.91c5.006 0 10.013 1.365 14.563 4.21l286.72 180.907c12.743 8.078 16.611 24.917 8.533 37.661-8.306 12.857-25.145 16.611-37.888 8.533z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="subtraction" unicode="&#59006;" d="M785 348H239c-19.8 0-36 16.2-36 36s16.2 36 36 36h546c19.8 0 36-16.2 36-36s-16.2-36-36-36z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="mike" unicode="&#59100;" d="M512 256c115.2 0 208 92.8 208 208V624c0 115.2-92.8 208-208 208s-208-92.8-208-208v-160c0-115.2 92.8-208 208-208zM368 624c0 80 64 144 144 144s144-64 144-144v-160c0-80-64-144-144-144s-144 64-144 144V624zM844.8 416c0 17.6-14.4 32-32 32-16 0-30.4-12.8-32-28.8C758.4 289.6 646.4 192 512 192s-246.4 97.6-268.8 227.2c-1.6 16-16 28.8-32 28.8-17.6 0-32-14.4-32-32v-4.8C204.8 260.79999999999995 328 144 480 129.60000000000002V-32c0-17.6 14.4-32 32-32s32 14.4 32 32V129.60000000000002c152 14.4 275.2 131.2 299.2 280 0 1.6 1.6 4.8 1.6 6.4z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="light" unicode="&#59208;" d="M512 72c-172.313 0-312 139.687-312 312s139.687 312 312 312 312-139.687 312-312-139.687-312-312-312z m0 64c136.967 0 248 111.033 248 248 0 136.967-111.033 248-248 248-136.967 0-248-111.033-248-248 0-136.967 111.033-248 248-248z m0 696c17.673 0 32-14.327 32-32v-51c0-17.673-14.327-32-32-32-17.673 0-32 14.327-32 32V800c0 17.673 14.327 32 32 32z m0-785c17.673 0 32-14.327 32-32v-51c0-17.673-14.327-32-32-32-17.673 0-32 14.327-32 32v51c0 17.673 14.327 32 32 32z m325.945 11.055c-12.497-12.496-32.758-12.496-45.255 0l-36.063 36.063c-12.496 12.497-12.496 32.758 0 45.255 12.497 12.496 32.758 12.496 45.255 0l36.063-36.063c12.496-12.497 12.496-32.758 0-45.255z m-568 565c-12.497-12.496-32.758-12.496-45.255 0l-36.063 36.063c-12.496 12.497-12.496 32.758 0 45.255 12.497 12.496 32.758 12.496 45.255 0l36.063-36.063c12.496-12.497 12.496-32.758 0-45.255z m561 81.318c12.496-12.497 12.496-32.758 0-45.255l-36.063-36.063c-12.497-12.496-32.758-12.496-45.255 0-12.496 12.497-12.496 32.758 0 45.255l36.063 36.063c12.497 12.496 32.758 12.496 45.255 0z m-563.572-565c12.496-12.497 12.496-32.758 0-45.255l-36.063-36.063c-12.497-12.496-32.758-12.496-45.255 0-12.496 12.497-12.496 32.758 0 45.255l36.063 36.063c12.497 12.496 32.758 12.496 45.255 0zM960 384c0-17.673-14.327-32-32-32h-51c-17.673 0-32 14.327-32 32 0 17.673 14.327 32 32 32h51c17.673 0 32-14.327 32-32z m-781 0c0-17.673-14.327-32-32-32H96c-17.673 0-32 14.327-32 32 0 17.673 14.327 32 32 32h51c17.673 0 32-14.327 32-32z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="gift" unicode="&#58919;" d="M796.3 600h-6.7c5.1 6.7 9.6 13.4 13.4 20.1 18.3 32.2 20.8 63.1 7 87.1-9.1 15.7-33 41.2-91.9 36-35.4-3.2-76.1-17.2-114.7-39.4-37.9-21.9-68.9-49.3-89-77.5-4.5 6.4-9.5 12.8-15.1 19.1-19.8 22.3-45.4 42.8-74.1 59.4-38.4 22.2-79.3 35.9-115.1 38.5-43.3 3.2-75.8-10-91.4-37-13.8-24-11.3-54.8 7-86.7 3.7-6.5 8.1-13 13.1-19.5H236c-21.3 0-41.6-7.2-57.4-20.2-17.8-14.9-27.6-35.4-27.6-58v-50.8c0-34.4 23-64.6 55-76.6v-283.9c0-23.3 10.9-47.1 30.1-65.3 18.3-17.4 41.4-27.3 63.4-27.3h434.3c22 0 44.9 10 63 27.6 18.7 18.1 29.3 41.8 29.3 65.1V395c11 4.3 19.6 10.9 27.2 19.5 13.3 15.1 20.8 35.2 20.8 56.6v50.8c-0.1 45.3-32.8 78.1-77.8 78.1z m17.7-78.1v-50.8c0-7.7-3.2-20.3-15-22-0.9 0.1-1.7 0.1-2.6 0.1-1.5 0-2.9-0.1-4.3-0.3H543v91h253.3c11.9 0.1 17.7-5.8 17.7-18zM633.4 651.8c30.7 17.7 63.5 29.2 90 31.6 21.5 1.9 32.6-2.8 34.6-6.3 4.2-7.3-6.3-41.2-52.9-77.2H569.8c14 17 35.3 35.6 63.6 51.9z m-362.8 24.4c2.2 3.7 13.3 8.7 35 7.1 26.6-1.9 59.2-13.1 89.5-30.6 27.7-16 49.4-35.1 63.9-52.8H323.5c-20.3 15.6-36.4 32.9-45.8 49.4-8.9 15.6-8.5 24.4-7.1 26.9zM211 521.9c0 11.2 12.9 18.1 24.9 18.1H483v-91H240.1c-1.4 0.2-2.8 0.3-4.3 0.3-0.9 0-1.8 0-2.7-0.1-11.5 1.5-22.1 11.6-22.1 22v50.7z m55-411.3V389h217v-311H299.4c-13.2 0-33.4 17.5-33.4 32.6zM733.7 78H543V389h223v-278.4c0-15.5-19.1-32.6-32.3-32.6z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="mute" unicode="&#59013;" d="M739 294.4l180.2 180.2M735.391 297.9l180.24 180.24 7.07-7.07-180.239-180.24zM631.4-29.700000000000045c-5.1 0-10.1 1.3-14.5 3.7L277.1 162.20000000000005H116.8c-16 0-28.9 13-28.9 28.9v384c0 16 13 28.9 28.9 28.9h160.3l339.7 189.9c4.5 2.5 9.5 3.8 14.6 3.8 5.3 0 10.6-1.4 15.1-4.1 9.1-5.3 14.8-15.2 14.8-25.8v-767.6c0-10.5-5.6-20.4-14.7-25.8-4.6-2.7-9.9-4.1-15.2-4.1zM305.8 551.5v-336.7L601.4 51V716.8L305.8 551.5zM145.7 220.10000000000002h102.2v326H145.7v-326zM913.2 258.9c-9.3 0-18.1 3.6-24.7 10.3l-63.4 63.4-63.4-63.4c-6.6-6.6-15.4-10.3-24.7-10.3s-18.1 3.6-24.7 10.3c-13.6 13.6-13.6 35.9 0 49.5l63.4 63.4-67.4 67.4c-6.6 6.6-10.3 15.4-10.3 24.7 0 9.3 3.6 18.1 10.3 24.7 6.6 6.6 15.4 10.3 24.7 10.3s18.1-3.6 24.7-10.3l67.4-67.4 67.4 67.4c6.6 6.6 15.4 10.3 24.7 10.3s18.1-3.6 24.7-10.3c6.6-6.6 10.3-15.4 10.3-24.7 0-9.3-3.6-18.1-10.3-24.7L874.6 382l63.4-63.4c13.6-13.6 13.6-35.9 0-49.5-6.7-6.6-15.5-10.2-24.8-10.2z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="reduce-circle" unicode="&#58902;" d="M512-65.5c-60.6 0-119.4 11.9-174.8 35.3-53.5 22.6-101.5 55-142.7 96.2-41.2 41.2-73.6 89.2-96.2 142.7C74.9 264.1 63 322.9 63 383.5s11.9 119.4 35.3 174.8c22.6 53.5 55 101.5 96.2 142.7 41.2 41.2 89.2 73.6 142.7 96.2C392.6 820.6 451.4 832.5 512 832.5s119.4-11.9 174.8-35.3c53.5-22.6 101.5-55 142.7-96.2 41.2-41.2 73.6-89.2 96.2-142.7 23.4-55.4 35.3-114.2 35.3-174.8s-11.9-119.4-35.3-174.8c-22.6-53.5-55-101.5-96.2-142.7s-89.2-73.6-142.7-96.2c-55.4-23.4-114.2-35.3-174.8-35.3z m0 848c-220 0-399-179-399-399s179-399 399-399 399 179 399 399-179 399-399 399zM772 359H252c-13.8 0-25 11.2-25 25s11.2 25 25 25h520c13.8 0 25-11.2 25-25s-11.2-25-25-25z"  horiz-adv-x="1024" />
+
+    
+    <glyph glyph-name="music" unicode="&#59024;" d="M575.4 832h-74.5v-633.5C385 251.20000000000005 249.3 180.70000000000005 226.8 76c-7.3-34.1 7.9-70.9 21.9-87.8 79.3-94.6 252.2-50.5 331.6 51.3 35.2 45.2 32.3 84.6 32.3 181.3V608.5c48.8-36.3 103.9-70.1 123.7-135 12.2-40.3-4.1-107.3-17-141.5-3.9-10.3-14.7-18.9-9.7-29.2 34.2-25.4 51.1 28.6 60.9 51.2 10.6 24.5 20.8 54.7 24.4 75.6C833.2 653.2 595.5 661.7 575.4 832z"  horiz-adv-x="1024" />
+
+    
+
+
+  </font>
+</defs></svg>
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/font/iconfont.ttf b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/font/iconfont.ttf
new file mode 100644
index 0000000..06e30f9
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/font/iconfont.ttf
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/font/iconfont.woff b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/font/iconfont.woff
new file mode 100644
index 0000000..66a1783
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/font/iconfont.woff
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/font/iconfont.woff2 b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/font/iconfont.woff2
new file mode 100644
index 0000000..47e9980
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/font/iconfont.woff2
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/0.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/0.gif
new file mode 100644
index 0000000..a63f0d5
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/0.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/1.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/1.gif
new file mode 100644
index 0000000..b2b78b2
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/1.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/10.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/10.gif
new file mode 100644
index 0000000..556c7e3
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/10.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/11.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/11.gif
new file mode 100644
index 0000000..2bfc58b
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/11.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/12.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/12.gif
new file mode 100644
index 0000000..1c321c7
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/12.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/13.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/13.gif
new file mode 100644
index 0000000..300bbc2
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/13.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/14.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/14.gif
new file mode 100644
index 0000000..43b6d0a
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/14.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/15.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/15.gif
new file mode 100644
index 0000000..c9f25fa
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/15.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/16.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/16.gif
new file mode 100644
index 0000000..34f28e4
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/16.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/17.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/17.gif
new file mode 100644
index 0000000..39cd035
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/17.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/18.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/18.gif
new file mode 100644
index 0000000..7bce299
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/18.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/19.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/19.gif
new file mode 100644
index 0000000..adac542
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/19.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/2.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/2.gif
new file mode 100644
index 0000000..7edbb58
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/2.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/20.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/20.gif
new file mode 100644
index 0000000..50631a6
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/20.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/21.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/21.gif
new file mode 100644
index 0000000..b984212
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/21.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/22.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/22.gif
new file mode 100644
index 0000000..1f0bd8b
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/22.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/23.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/23.gif
new file mode 100644
index 0000000..e05e0f9
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/23.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/24.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/24.gif
new file mode 100644
index 0000000..f35928a
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/24.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/25.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/25.gif
new file mode 100644
index 0000000..0b4a883
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/25.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/26.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/26.gif
new file mode 100644
index 0000000..45c4fb5
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/26.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/27.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/27.gif
new file mode 100644
index 0000000..7a4c013
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/27.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/28.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/28.gif
new file mode 100644
index 0000000..fc5a0cf
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/28.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/29.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/29.gif
new file mode 100644
index 0000000..5dd7442
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/29.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/3.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/3.gif
new file mode 100644
index 0000000..86df67b
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/3.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/30.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/30.gif
new file mode 100644
index 0000000..b751f98
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/30.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/31.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/31.gif
new file mode 100644
index 0000000..c9476d7
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/31.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/32.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/32.gif
new file mode 100644
index 0000000..9931b06
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/32.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/33.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/33.gif
new file mode 100644
index 0000000..59111a3
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/33.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/34.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/34.gif
new file mode 100644
index 0000000..a334548
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/34.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/35.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/35.gif
new file mode 100644
index 0000000..a932264
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/35.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/36.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/36.gif
new file mode 100644
index 0000000..6de432a
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/36.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/37.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/37.gif
new file mode 100644
index 0000000..d05f2da
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/37.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/38.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/38.gif
new file mode 100644
index 0000000..8b1c88a
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/38.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/39.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/39.gif
new file mode 100644
index 0000000..38b84a5
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/39.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/4.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/4.gif
new file mode 100644
index 0000000..d52200c
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/4.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/40.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/40.gif
new file mode 100644
index 0000000..ae42991
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/40.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/41.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/41.gif
new file mode 100644
index 0000000..b9c715c
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/41.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/42.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/42.gif
new file mode 100644
index 0000000..0eb1434
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/42.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/43.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/43.gif
new file mode 100644
index 0000000..ac0b700
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/43.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/44.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/44.gif
new file mode 100644
index 0000000..ad44497
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/44.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/45.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/45.gif
new file mode 100644
index 0000000..6837fca
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/45.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/46.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/46.gif
new file mode 100644
index 0000000..d62916d
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/46.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/47.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/47.gif
new file mode 100644
index 0000000..58a0836
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/47.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/48.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/48.gif
new file mode 100644
index 0000000..7ffd161
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/48.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/49.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/49.gif
new file mode 100644
index 0000000..959b992
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/49.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/5.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/5.gif
new file mode 100644
index 0000000..4e8b09f
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/5.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/50.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/50.gif
new file mode 100644
index 0000000..6e22e7f
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/50.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/51.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/51.gif
new file mode 100644
index 0000000..ad3f4d3
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/51.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/52.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/52.gif
new file mode 100644
index 0000000..39f8a22
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/52.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/53.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/53.gif
new file mode 100644
index 0000000..a181ee7
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/53.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/54.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/54.gif
new file mode 100644
index 0000000..e289d92
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/54.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/55.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/55.gif
new file mode 100644
index 0000000..4351083
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/55.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/56.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/56.gif
new file mode 100644
index 0000000..e0eff22
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/56.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/57.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/57.gif
new file mode 100644
index 0000000..0bf130f
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/57.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/58.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/58.gif
new file mode 100644
index 0000000..0f06508
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/58.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/59.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/59.gif
new file mode 100644
index 0000000..7081e4f
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/59.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/6.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/6.gif
new file mode 100644
index 0000000..f7715bf
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/6.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/60.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/60.gif
new file mode 100644
index 0000000..6e15f89
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/60.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/61.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/61.gif
new file mode 100644
index 0000000..f092d7e
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/61.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/62.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/62.gif
new file mode 100644
index 0000000..7fe4984
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/62.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/63.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/63.gif
new file mode 100644
index 0000000..cf8e23e
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/63.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/64.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/64.gif
new file mode 100644
index 0000000..a779719
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/64.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/65.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/65.gif
new file mode 100644
index 0000000..7bb98f2
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/65.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/66.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/66.gif
new file mode 100644
index 0000000..bb6d077
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/66.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/67.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/67.gif
new file mode 100644
index 0000000..6e33f7c
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/67.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/68.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/68.gif
new file mode 100644
index 0000000..1a6c400
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/68.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/69.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/69.gif
new file mode 100644
index 0000000..a02f0b2
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/69.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/7.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/7.gif
new file mode 100644
index 0000000..e6d4db8
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/7.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/70.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/70.gif
new file mode 100644
index 0000000..416c5c1
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/70.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/71.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/71.gif
new file mode 100644
index 0000000..c17d60c
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/71.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/8.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/8.gif
new file mode 100644
index 0000000..66f967b
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/8.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/9.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/9.gif
new file mode 100644
index 0000000..6044740
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/images/face/9.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/all-mobile.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/all-mobile.js
new file mode 100644
index 0000000..3ebb7d2
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/all-mobile.js
@@ -0,0 +1,11 @@
+锘�/**
+
+ @Name锛氱敤浜庢墦鍖呯Щ鍔ㄥ畬鏁寸増
+ @Author锛氳搐蹇�
+ @License锛歀GPL
+    
+ */
+ 
+layui.define(function(exports){
+  exports('layui.mobile', layui.v);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/all.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/all.js
new file mode 100644
index 0000000..db17a8e
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/all.js
@@ -0,0 +1,15 @@
+锘�/**
+
+ @Name锛氱敤浜庢墦鍖匬C瀹屾暣鐗堬紝鍗冲寘鍚玪ayui.js鍜屾墍鏈夋ā鍧楃殑瀹屾暣鍚堝苟锛堣鏂囦欢涓嶄細瀛樺湪浜庢瀯寤哄悗鐨勭洰褰曪級
+ @Author锛氳搐蹇�
+ @License锛歀GPL
+    
+ */
+ 
+layui.define(function(exports){
+  var cache = layui.cache;
+  layui.config({
+    dir: cache.dir.replace(/lay\/dest\/$/, '')
+  });
+  exports('layui.all', layui.v);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/FilePreviewBase.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/FilePreviewBase.js
new file mode 100644
index 0000000..e1e9a30
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/FilePreviewBase.js
@@ -0,0 +1,436 @@
+/**
+ * Created by weidy on 2019/1/21.  鏂囦欢棰勮
+ */
+layui.define(['layer','table','element'],function(exports){
+    var Home = function(){
+        this.id = "vciFilePreview";
+        this.previewFileKey = "";
+        this.extraParams = {};
+        this.viewtype = "pdf";
+        this.viewtypeConstant = {
+            /**
+             * 涓庡悗鍙扮殑VciFileViewTypeConstant瀵瑰簲
+             */
+            PDF:'pdf',
+            XPS:'xps',
+            COMMON:'common',
+            IMAGES:'images',
+            AUDIO:'audio',
+            VIDEO:'video',
+            FLASH:'flash',
+            TEXT:'text',
+            HTML:'html',
+            ACTIVE:'active'
+        };
+        this.backPath = configData.compatibility?path:configData.filePreviewPath;
+        this.url={
+            controller:'vciFilePreviewController/',
+            ajaxPreview:'ajaxPreview',
+            showXps:'showXps',
+            showPdf:'showPdf',
+            showCommon:'showCommonFile',
+            getPdfUrlForIE:'getPdfUrlForIE',
+            listLinkeFile:'vciFileQueryController/gridFiles'
+        };
+        this.config = {};
+    };
+    Home.prototype.getContent = function(id){
+        var that = this;
+        return '<div class="layui-index-home layui-fluid" style="overflow:auto;position:absolute;left:5px;top:5px;background-color: #999999;z-index:auto;" id="vciFilePreview_' + id + '"></div>' +
+               '<div id="previewinfo_' + id + '" class="layui-layout-east" style="display:block;position:absolute;right:0;margin-top:5px;margin-right:5px;width:340px;height:98%;max-width:340px;min-width:150px;border:1px solid #e1e1e1">' +
+                    '<div lay-filter="panelFileInfo_' + id + '" class="layui-tab layui-tab-card" lay-allowClose="false" style="margin-top:0px;">'+
+                        '<ul class="layui-tab-title" lay-allowClose="false">' +
+                        '</ul>' +
+                        '<div class="layui-tab-content"></div>' +
+                        '</div> '+
+                    '</div> '+
+               '</div>';
+    };
+    Home.prototype.init = function(id,options){
+        var that = this;
+        var parent ;
+        var isInner = false;
+        if(options.showType && options.showType == "inner"){
+            parent = $("#vciFilePreview_" + id).parent();
+            isInner =true;
+        }else{
+            parent = $(document);
+        }
+        var width = (options.width?options.width:(isInner?(parent.width()-380):(parent.width()-430)));
+        var height =options.height?options.height: (parent.height()-120);
+        if(options.hideRightPanel){
+            width = $(document).width()-85;
+            $("#previewinfo_" + id).hide();
+        }
+        options.contentStyle = 'max-width: ' + width + 'px;max-height:' + height +'px;width:' + width + "px;height:" + height + "px;";
+        window.print = function(){
+            return false;
+        };
+        that.config[id] = options;
+        //闇�瑕佸厛鍒板悗鍙扮敓鎴愭枃浠�
+        $webUtil.get(that.url.controller + that.url.ajaxPreview,options,function(result){
+            if(result.success){
+                that.doShow(id,result.obj,true);
+            }else{
+                $webUtil.showErrorMsg(result.msg);
+            }
+        },function(xhr,err){
+            $webUtil.showErrorMsg("涓嬭浇棰勮鐩稿叧鐨勮鍙嚭閿�,鍙兘鏄枃浠堕瑙堟湇鍔℃病鏈夊惎鍔�");
+        },that.backPath);
+    };
+    Home.prototype.doShow = function(id,previewVO,first){
+        var that = this;
+        //涓嶅悓鐨勭被鍨嬬殑鏄剧ず鏂瑰紡
+        var viewtype = previewVO.viewType;
+        var previewFileKey = previewVO.previewKey;
+        if(that.viewtypeConstant.XPS == viewtype){
+            that.showXps(id,previewFileKey,first);
+        }else if(that.viewtypeConstant.PDF == viewtype || that.viewtypeConstant.ACTIVE == viewtype){
+            //pdf鐨勯瑙堬紝瀵逛簬IE8锛孖E9闇�瑕乤dobe鐨勬帶浠讹紝濡傛灉鏄叾浠栨祻瑙堝櫒锛屽垯鐩存帴鏄剧ず
+            that.showPdf(id,previewFileKey,first,viewtype);
+        }else if(that.viewtypeConstant.IMAGES == viewtype){
+            that.showImages(id,previewFileKey,first);
+        }else if(that.viewtypeConstant.AUDIO == viewtype || that.viewtypeConstant.VIDEO == viewtype){
+            that.showVedioAndAudio(id,previewFileKey,first);
+        }else if(that.viewtypeConstant.TEXT == viewtype){
+            that.showText(id,previewFileKey,first);
+        }else if(that.viewtypeConstant.HTML == viewtype){
+            that.showHtml(id,previewFileKey,first);
+        }else{
+            that.downloadFile(id,previewFileKey,first);
+        }
+    };
+    Home.prototype.downloadFile = function(id,previewFileKey,first){
+        //涓嬭浇鏂囦欢
+        var that = this;
+        $webUtil.get(that.url.controller + that.url.showCommon,{filePreviewKey:previewFileKey,viewType:that.viewtypeConstant.COMMON},function(result){
+            if(result.success){
+                that.replaceIframe(id, '<div style="text-align: center;font-size:20px;height:100px;">杩欎釜鏂囦欢涓嶆敮鎸侀瑙堬紝灏嗚嚜鍔ㄤ负鎮ㄤ笅杞�</div>');
+                $webUtil.fileDownload(that.backPath + result.obj);
+                if(first){
+                    that.initRightPanle(id);
+                }
+            }else{
+                $webUtil.showErrorMsg(result.msg);
+            }
+        },function(xhr,error){
+            $webUtil.showErrorMsg("涓嬭浇棰勮鐩稿叧鐨勮鍙嚭閿�,鍙兘鏄枃浠堕瑙堟湇鍔℃病鏈夊惎鍔�");
+        },that.backPath);
+        
+    };
+    Home.prototype.replaceIframe = function(id,html){
+        //鏇挎崲iframe閮ㄥ垎鐨勫唴瀹�
+        $("#vciFilePreview_" + id).find("[name='vciFilePreviewContent']").remove();
+        $("#vciFilePreview_" + id).prepend(html);
+    };
+    Home.prototype.showHtml = function(id,previewFileKey,first){
+        //鏄剧ずhtml
+        var that = this;
+        $webUtil.get(that.url.controller + that.url.showCommon,{filePreviewKey:previewFileKey,viewType:that.viewtypeConstant.HTML},function(result){
+            if(result.success){
+                var iframeUrl = that.backPath+ result.obj ;
+                that.replaceIframe(id, '<iframe src="' + iframeUrl +  '" style="' + that.config[id].contentStyle + '" name="vciFilePreviewContent" frameborder="false" scrolling="none" ></iframe>');
+                if(first){
+                    that.initRightPanle(id);
+                }
+            }else{
+                $webUtil.showErrorMsg(result.msg);
+            }
+        },function(xhr,error){
+            $webUtil.showErrorMsg("鑾峰彇鏂囦欢鐨勮矾寰勫嚭閿欙紝鍙兘鏄枃浠堕瑙堟湇鍔℃病鏈夊惎鍔�");
+        },that.backPath);
+    };
+    Home.prototype.showText = function(id,previewFileKey,first){
+        //鏄剧ず鏅�氱殑鏂囨湰
+        var that = this;
+        $webUtil.get(that.url.controller + that.url.showCommon,{filePreviewKey:previewFileKey,viewType:that.viewtypeConstant.TEXT},function(result){
+            if(result.success){
+                var width = ($(document).width()-400);
+                var height = ($(document).height()-80);
+                var contentStyle = 'max-width: ' + width + 'px;max-height:' + height +'px;width:' + width + "px;height:" + height + "px;";
+                that.replaceIframe(id,'<pre class="layui-code" lay-skin="notepad" lay-encode="false" style="' + contentStyle + ';overflow: auto" name="vciFilePreviewContent">' + result.obj +'</pre>');
+                if(first){
+                    that.initRightPanle(id);
+                }
+            }else{
+                $webUtil.showErrorMsg(result.msg);
+            }
+        },function(xhr,error){
+            $webUtil.showErrorMsg("鑾峰彇鏂囦欢鐨勫唴瀹瑰嚭閿欙紝鍙兘鏄枃浠堕瑙堟湇鍔℃病鏈夊惎鍔�");
+        },that.backPath);
+    };
+    Home.prototype.showVedioAndAudio =function(id,previewFileKey,first){
+        var that = this;
+        //瑙嗛
+        $webUtil.get(that.url.controller + that.url.showCommon,{filePreviewKey:previewFileKey,viewType:that.viewtypeConstant.AUDIO},function(result){
+            if(result.success){
+                var html = '<object id="player" classid="CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6" name="vciFilePreviewContent" style="' + that.config[id].contentStyle + ';">'+
+                    '<param name="AutoStart" VALUE="-1">'+
+                    '<param name="enabled" value="1">'+
+                    '<param name="EnableContextMenu" VALUE="-1">'+
+                    '<param name="url" VALUE="' + that.backPath + result.obj + '">'+
+                    '<param name="volume" value="50">'+
+                    '</object>';
+                that.replaceIframe(id,html);
+                if(first){
+                    that.initRightPanle(id);
+                }
+            }else{
+                $webUtil.showErrorMsg(result.msg);
+            }
+        },function(xhr,error){
+            $webUtil.showErrorMsg("鑾峰彇鏂囦欢鐨勮矾寰勫嚭閿欙紝鍙兘鏄枃浠堕瑙堟湇鍔℃病鏈夊惎鍔�");
+        },that.backPath);
+    };
+    Home.prototype.showImages = function (id,previewFileKey,first) {
+        var that = this;
+        //鍥剧墖
+        $webUtil.get(that.url.controller +that.url.showCommon,{filePreviewKey:previewFileKey,viewType:that.viewtypeConstant.IMAGES},function(result){
+            if(result.success){
+                that.replaceIframe(id,'<img src="' + that.backPath + result.obj + '" style="max-width:' + ($(document).width()-360) + 'px;height:auto;" name="vciFilePreviewContent" />');
+                if(first){
+                    that.initRightPanle(id);
+                }
+            }else{
+                $webUtil.showErrorMsg(result.msg);
+            }
+        },function(xhr,error){
+            $webUtil.showErrorMsg("鑾峰彇鏂囦欢鐨勮矾寰勫嚭閿欙紝鍙兘鏄枃浠堕瑙堟湇鍔℃病鏈夊惎鍔�");
+        },that.backPath);
+    };
+    Home.prototype.showXps = function(id,previewFileKey,first){
+        var that = this;
+        $webUtil.get(that.url.controller +that.url.showXps,{xpsPreviewKey:previewFileKey},function(result){
+            if(result.success){
+                var iframeUrl = that.backPath + result.obj ;
+                that.replaceIframe(id, '<iframe src="' + iframeUrl +  '" style="' + that.config[id].contentStyle + '" name="vciFilePreviewContent" frameborder="false" scrolling="auto" ></iframe>');
+                if(first){
+                    that.initRightPanle(id);
+                }
+            }else{
+                $webUtil.showErrorMsg(result.msg);
+            }
+        },function(xhr,error){
+            $webUtil.showErrorMsg("鑾峰彇鏂囦欢鐨勮矾寰勫嚭閿欙紝鍙兘鏄枃浠堕瑙堟湇鍔℃病鏈夊惎鍔�");
+        },that.backPath);
+    };
+    Home.prototype.showPdf = function(id,previewFileKey,first,viewtype){
+        var that = this;
+        $webUtil.get(that.url.controller +that.url.showPdf,{pdfPreviewKey:previewFileKey},function(result){
+            if(result.success){
+               //鏈塧dobe 鍜宎ctive鐨勬柟寮�
+                var iframeUrl = that.backPath + result.obj + "?AuthorizationToken=" + $webUtil.getToken() ;
+                if(that.isIE()) {
+                    if (that.viewtypeConstant.ACTIVE == viewtype) {
+                        //瑕佹帶鍒朵笅杞界殑鏃跺�欙紝浣跨敤杩欎釜
+                        that.replaceIframe(id, '<object id="csocx' + id + '" name="vciFilePreviewContent" style="' + that.config[id].contentStyle + '" classid="clsid:195CA93F-2C9A-4E46-A8B3-D28E8C790954">' +
+                            '<param name="Url" value="' + iframeUrl + '"></param></object>');
+                        document.getElementById("csocx" + id).Url = iframeUrl;
+                    } else {
+                        if (!that.checkAdobeReaderInstall()) {
+                            that.replaceIframe(id, projectName + "jslib/layui-2.2.5-debug/lay/filepreview/help.html?viewtype=" + that.viewtype);
+                        } else {
+                            that.replaceIframe(id, '<div style="' + that.config[id].contentStyle + '" id="vciFilePreviewContent' + id + '" name="vciFilePreviewContent" ></div>');
+                            var pdfObject = new PDFObject({
+                                id: 'vciFilePreviewContent' + id,
+                                url: iframeUrl,
+                                pdfOpenParams: {
+                                    scrollbars: '0',
+                                    toolbar: '0',
+                                    statusbar: '0'
+                                }
+                            }).embed('vciFilePreviewContent' + id);
+                        }
+                    }
+                }else{
+                    //鍙兘鏄敮鎸丠TML5鐨勬祻瑙堝櫒锛屽洜姝や娇鐢╬df.js杩涜灞曠ず
+                    var url = projectName + 'jslib/layui-2.2.5-debug/lay/filepreview/web/viewer.html?file=' +iframeUrl ;
+                    that.replaceIframe(id,'<iframe src="' + url + '" style="' + that.config[id].contentStyle + '" name="vciFilePreviewContent" frameborder="false" scrolling="auto" ></iframe>');
+                }
+                if (first) {
+                    that.initRightPanle(id);
+                }
+            }else{
+                $webUtil.showErrorMsg(result.msg);
+            }
+        },function(xhr,error){
+            $webUtil.showErrorMsg("鑾峰彇鏂囦欢鐨勮矾寰勫嚭閿欙紝鍙兘鏄枃浠堕瑙堟湇鍔℃病鏈夊惎鍔�");
+        },that.backPath);
+    };
+    Home.prototype.checkAdobeReaderInstall =function(){
+        var activeRender = false;
+        //妫�鏌df鏄惁瀹夎
+        for (var i = 2; i < 12; i++) {
+            try {
+                var activeAdobe = eval("new ActiveXObject('PDF.pdfCtrl." + x + "');");
+                if (activeAdobe) {
+                    activeRender = true;
+                    break;
+                }
+            } catch (e) {
+
+            }
+        }
+        if (!activeRender) {
+            //鐪嬬湅acro4
+            try {
+                var activeAdobe4 = new ActiveXObject("PDF.PdfCtrl.1");
+                activeRender = true;
+            } catch (e) {
+
+            }
+        }
+        if (!activeRender) {
+            try {
+                var activeAdobe7 = new ActiveXObject("AcroPDF.PDF.1");
+                activeRender = true;
+            } catch (e) {
+
+            }
+        }
+        return activeRender;
+    };
+    Home.prototype.initRightPanle = function (id) {
+        //鍒濆鍖栧彸渚х殑鍒楄〃鍜屽府鍔╀俊鎭�
+        var that = this;
+        var options = that.config[id];
+        if(!options.hideRightPanel) {
+            layui.element.tabAdd('panelFileInfo_' + id, {
+                title: '鏈笟鍔℃暟鎹殑鎵�鏈夐檮浠�',
+                id: "tab_allFile_" + id,
+                content: '<div id="allfile_' + id + '">' +
+                    '<div layui-filter="toolbar_' + id + '" class="layui-btn-container"></div>' +
+                    '<table id="allfile_table_' + id + '" lay-filter="allfile_table_' + id + '" style="overflow-y:auto;"></table>' +
+                    '</div>'
+            });
+            that.initFileTable(id);
+            layui.element.tabAdd('panelFileInfo_' + id, {
+                title: '浣跨敤甯姪淇℃伅',
+                id: "tab_preViewHelp_" + id,
+                content:that.getHelpContent(options.viewtype)
+            });
+            layui.element.tabChange('panelFileInfo_' + id, "tab_allFile_" + id);
+            $('a[name="vcifilepreviewforlinkfile"]').die().live('click', function () {
+                var thisFileNameCell = $(this);
+                var linkFileOid = thisFileNameCell.attr("fileoid");
+                that.clickNamePREVIEW(id, linkFileOid);
+            });
+        }
+    };
+    Home.prototype.getHelpContent = function (viewtype){
+        var sUserAgent = navigator.userAgent;
+        var that = this;
+        var isActive = false;
+        if("active" == viewtype){
+            isActive = true;
+        }
+        var downloadUrl = isActive?"/download/VCIPdfViewer.exe":"/download/AdbeRdr920_zh_CN.exe";
+        var installHelp = "/download/瀹夎璇存槑.doc";
+        var systemInfo = "鎮ㄧ殑绯荤粺鏄痺indows:";
+        if((navigator.platform == "Win32") || (navigator.platform == "Windows")){
+            if(sUserAgent.indexOf("Windows NT 5.1") > -1 ||
+                sUserAgent.indexOf("Windows XP") > -1){
+                if(isActive) {
+                    downloadUrl = "/download/vciFilePreview.zip";
+                    installHelp = "/download/瀹夎璇存槑xp.doc";
+                }
+                systemInfo = "鎮ㄧ殑鎿嶄綔绯荤粺鏄痺indows xp:";
+            }
+            var html = systemInfo + "</br>";
+            if(isActive){
+                html += "<a href='javascript:void(0);' docurl='" + projectName + installHelp + "' id='downloadDoc'>鐐瑰嚮杩欓噷涓嬭浇銆愬畨瑁呰鏄庛��</a></br>";
+            }else{
+                html += "榛樿鎻愪緵9.2鐗堟湰鐨凙dobe Reader锛屽彲浠ヨ嚜琛屽畨瑁呭叾浠栫増鏈殑Adobe鐨刾df杞欢</br>";
+            }
+            html += "<a href='javascript:void(0);' docurl='" + projectName + downloadUrl + "' id='downloadInstall'>鐐瑰嚮杩欓噷涓嬭浇瀹夎鏂囦欢</a>";
+        }else{
+            html = ("<br/>鎮ㄧ殑鎿嶄綔绯荤粺涓嶆槸windows锛屼笉闇�瑕佸畨瑁�,璇蜂娇鐢ㄨ胺姝屾祻瑙堝櫒銆佺伀鐙愭祻瑙堝櫒鎴栬�卻afari娴忚鍣�");
+        }
+        $("#downloadDoc").unbind("click").click(function(){
+            that.doDownload($(this).attr("docurl"));
+        });
+        $("#downloadInstall").unbind("click").click(function(){
+            that.doDownload($(this).attr("docurl"));
+        });
+        return ['<div style="display:block;text-align: left;padding:20px;">',
+            '<p style="color:blue;">1. 寤鸿鎮ㄤ娇鐢ㄨ胺姝屾祻瑙堝櫒锛屾垨鑰呯伀鐙愮瓑娴忚鍣ㄦ煡鐪嬩綋楠屾洿浣�</p>',
+            '<hr className="layui-bg-red">',
+            '<p style="color:blue;">2. 鏄剧ず鐨勫唴瀹逛腑鏌愪簺琛ㄦ牸绛夊彲鑳戒細鍑虹幇鏄剧ず鐨勬牸寮忛敊璇殑鎯呭喌锛屼絾鏄笉褰卞搷闃呰銆傝繖绉嶆儏鍐典笅鐨勫師鏂囨牸寮忔槸姝e父鐨�,寤鸿姝ゆ椂鐩存帴涓嬭浇鏂囦欢</p>',
+            '<hr className="layui-bg-red">',
+            '<p style="color:blue;">3. 鍙充晶鍒楄〃涓槸褰撳墠棰勮鏂囦欢鎵�灞炵殑涓氬姟绫诲瀷涓嬬殑鎵�鏈夐檮浠讹紝鍙互鐩存帴鍗曞嚮鍚嶇О灏卞彲浠ユ煡鐪�</p>',
+            '<hr className="layui-bg-red">',
+            '<p style="color:blue;">4. 闇�瑕佸畨瑁呮枃浠堕瑙堢殑绋嬪簭鍚庢墠鑳芥煡鐪嬪唴瀹癸紝璇峰湪涓嬫柟涓嬭浇瀹夎绋嬪簭鏍规嵁瑕佹眰瀹夎</p>',
+            '<hr className="layui-bg-red">',
+            '<p id="downloadP" style="color:red">' ,html ,'</p>',
+            '<hr className="layui-bg-red">',
+        '</div>'].join('');
+    };
+    Home.prototype.doDownload = function (url){
+        var downIframe = $("<iframe>");
+        downIframe.attr("style","display:none;");
+        $("body").append(downIframe);
+        downIframe.attr("src",url);
+        if (downIframe.attachEvent) {
+            downIframe.attachEvent("onload",
+                function() {
+                    downIframe.remove();
+                });
+        } else {
+            downIframe.onload = function() {
+                downIframe.remove();
+            };
+        }
+    };
+    Home.prototype.isIE = function () {
+        var userAgent = navigator.userAgent; //鍙栧緱娴忚鍣ㄧ殑userAgent瀛楃涓�
+        //IE11涓嶅氨绠楀湪閲岄潰锛屽洜涓哄畠鏈韩鏀寔H5鐨勬柟寮忎簡
+        return /msie/g.test(userAgent.toLowerCase());
+    };
+    Home.prototype.initFileTable = function(id) {
+        var that = this;
+        var table = layui.table;
+        var columns = [{
+            field:'name',
+            title:'鏂囦欢鍚嶇О',
+            width:300,
+            templet:function (d) {
+                var showName = $webUtil.isNull(d.id)?d.name:d.id;
+                return '<a href="javascript:;" name="vcifilepreviewforlinkfile" style="color:#2080da;text-decoration:underline;" compId="' + id +'"  fileoid="'
+                    + d.oid + '" >'
+                    + showName + ($webUtil.isNull(d.fileExtension)?"":("." + d.fileExtension)) + '</a>';
+            }
+        }];
+        var options = that.config[id];
+        layui.table.render({
+            elem:"#allfile_table_"+id,
+            url:that.url.listLinkeFile,
+            id:"allfile_table_"+id,
+            backPath:configData.fileServicePath,
+            where:{
+                ownbizOid:options.ownbizOid,
+                ownbizBtm:options.ownbizBtm
+            },
+            cols:[columns],
+            height:450
+        });
+    };
+    Home.prototype.clickNamePREVIEW = function(id,linkFileOid){
+        var that = this;
+        var extraParams={};
+        extraParams['linkFileOid'] = linkFileOid;
+        extraParams['viewType'] = that.config[id].viewType;
+        $webUtil.showProgress("鍗冲皢寮�濮嬮瑙堬紝璇风瓑寰�....");
+        $webUtil.post(that.url.controller + that.url.ajaxPreview, extraParams, function (result) {
+            $webUtil.closeProgress();
+            if (result.success && result.obj) {
+                that.doShow(id,result.obj,false);
+            } else {
+                $webUtil.showErrorMsg(result.msg);
+            }
+        },function(xhr,error){
+            $webUtil.showErrorMsg("鑾峰彇鏂囦欢鐨勮鍙嚭閿�,鍙兘鏄枃浠堕瑙堟湇鍔℃湭鍚姩")
+        });
+    };
+    var home = new Home();
+    exports('FilePreviewBase',home);
+});
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/build/pdf.compatibility.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/build/pdf.compatibility.js
new file mode 100644
index 0000000..06f54bf
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/build/pdf.compatibility.js
@@ -0,0 +1,577 @@
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+/* Copyright 2012 Mozilla Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/* globals VBArray, PDFJS */
+
+'use strict';
+
+// Initializing PDFJS global object here, it case if we need to change/disable
+// some PDF.js features, e.g. range requests
+if (typeof PDFJS === 'undefined') {
+  (typeof window !== 'undefined' ? window : this).PDFJS = {};
+}
+
+// Checking if the typed arrays are supported
+// Support: iOS<6.0 (subarray), IE<10, Android<4.0
+(function checkTypedArrayCompatibility() {
+  if (typeof Uint8Array !== 'undefined') {
+    // Support: iOS<6.0
+    if (typeof Uint8Array.prototype.subarray === 'undefined') {
+        Uint8Array.prototype.subarray = function subarray(start, end) {
+          return new Uint8Array(this.slice(start, end));
+        };
+        Float32Array.prototype.subarray = function subarray(start, end) {
+          return new Float32Array(this.slice(start, end));
+        };
+    }
+
+    // Support: Android<4.1
+    if (typeof Float64Array === 'undefined') {
+      window.Float64Array = Float32Array;
+    }
+    return;
+  }
+
+  function subarray(start, end) {
+    return new TypedArray(this.slice(start, end));
+  }
+
+  function setArrayOffset(array, offset) {
+    if (arguments.length < 2) {
+      offset = 0;
+    }
+    for (var i = 0, n = array.length; i < n; ++i, ++offset) {
+      this[offset] = array[i] & 0xFF;
+    }
+  }
+
+  function TypedArray(arg1) {
+    var result, i, n;
+    if (typeof arg1 === 'number') {
+      result = [];
+      for (i = 0; i < arg1; ++i) {
+        result[i] = 0;
+      }
+    } else if ('slice' in arg1) {
+      result = arg1.slice(0);
+    } else {
+      result = [];
+      for (i = 0, n = arg1.length; i < n; ++i) {
+        result[i] = arg1[i];
+      }
+    }
+
+    result.subarray = subarray;
+    result.buffer = result;
+    result.byteLength = result.length;
+    result.set = setArrayOffset;
+
+    if (typeof arg1 === 'object' && arg1.buffer) {
+      result.buffer = arg1.buffer;
+    }
+    return result;
+  }
+
+  window.Uint8Array = TypedArray;
+  window.Int8Array = TypedArray;
+
+  // we don't need support for set, byteLength for 32-bit array
+  // so we can use the TypedArray as well
+  window.Uint32Array = TypedArray;
+  window.Int32Array = TypedArray;
+  window.Uint16Array = TypedArray;
+  window.Float32Array = TypedArray;
+  window.Float64Array = TypedArray;
+})();
+
+// URL = URL || webkitURL
+// Support: Safari<7, Android 4.2+
+(function normalizeURLObject() {
+  if (!window.URL) {
+    window.URL = window.webkitURL;
+  }
+})();
+
+// Object.defineProperty()?
+// Support: Android<4.0, Safari<5.1
+(function checkObjectDefinePropertyCompatibility() {
+  if (typeof Object.defineProperty !== 'undefined') {
+    var definePropertyPossible = true;
+    try {
+      // some browsers (e.g. safari) cannot use defineProperty() on DOM objects
+      // and thus the native version is not sufficient
+      Object.defineProperty(new Image(), 'id', { value: 'test' });
+      // ... another test for android gb browser for non-DOM objects
+      var Test = function Test() {};
+      Test.prototype = { get id() { } };
+      Object.defineProperty(new Test(), 'id',
+        { value: '', configurable: true, enumerable: true, writable: false });
+    } catch (e) {
+      definePropertyPossible = false;
+    }
+    if (definePropertyPossible) {
+      return;
+    }
+  }
+
+  Object.defineProperty = function objectDefineProperty(obj, name, def) {
+    delete obj[name];
+    if ('get' in def) {
+      obj.__defineGetter__(name, def['get']);
+    }
+    if ('set' in def) {
+      obj.__defineSetter__(name, def['set']);
+    }
+    if ('value' in def) {
+      obj.__defineSetter__(name, function objectDefinePropertySetter(value) {
+        this.__defineGetter__(name, function objectDefinePropertyGetter() {
+          return value;
+        });
+        return value;
+      });
+      obj[name] = def.value;
+    }
+  };
+})();
+
+
+// No XMLHttpRequest#response?
+// Support: IE<11, Android <4.0
+(function checkXMLHttpRequestResponseCompatibility() {
+  var xhrPrototype = XMLHttpRequest.prototype;
+  var xhr = new XMLHttpRequest();
+  if (!('overrideMimeType' in xhr)) {
+    // IE10 might have response, but not overrideMimeType
+    // Support: IE10
+    Object.defineProperty(xhrPrototype, 'overrideMimeType', {
+      value: function xmlHttpRequestOverrideMimeType(mimeType) {}
+    });
+  }
+  if ('responseType' in xhr) {
+    return;
+  }
+
+  // The worker will be using XHR, so we can save time and disable worker.
+  PDFJS.disableWorker = true;
+
+  Object.defineProperty(xhrPrototype, 'responseType', {
+    get: function xmlHttpRequestGetResponseType() {
+      return this._responseType || 'text';
+    },
+    set: function xmlHttpRequestSetResponseType(value) {
+      if (value === 'text' || value === 'arraybuffer') {
+        this._responseType = value;
+        if (value === 'arraybuffer' &&
+            typeof this.overrideMimeType === 'function') {
+          this.overrideMimeType('text/plain; charset=x-user-defined');
+        }
+      }
+    }
+  });
+
+  // Support: IE9
+  if (typeof VBArray !== 'undefined') {
+    Object.defineProperty(xhrPrototype, 'response', {
+      get: function xmlHttpRequestResponseGet() {
+        if (this.responseType === 'arraybuffer') {
+          return new Uint8Array(new VBArray(this.responseBody).toArray());
+        } else {
+          return this.responseText;
+        }
+      }
+    });
+    return;
+  }
+
+  Object.defineProperty(xhrPrototype, 'response', {
+    get: function xmlHttpRequestResponseGet() {
+      if (this.responseType !== 'arraybuffer') {
+        return this.responseText;
+      }
+      var text = this.responseText;
+      var i, n = text.length;
+      var result = new Uint8Array(n);
+      for (i = 0; i < n; ++i) {
+        result[i] = text.charCodeAt(i) & 0xFF;
+      }
+      return result.buffer;
+    }
+  });
+})();
+
+// window.btoa (base64 encode function) ?
+// Support: IE<10
+(function checkWindowBtoaCompatibility() {
+  if ('btoa' in window) {
+    return;
+  }
+
+  var digits =
+    'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
+
+  window.btoa = function windowBtoa(chars) {
+    var buffer = '';
+    var i, n;
+    for (i = 0, n = chars.length; i < n; i += 3) {
+      var b1 = chars.charCodeAt(i) & 0xFF;
+      var b2 = chars.charCodeAt(i + 1) & 0xFF;
+      var b3 = chars.charCodeAt(i + 2) & 0xFF;
+      var d1 = b1 >> 2, d2 = ((b1 & 3) << 4) | (b2 >> 4);
+      var d3 = i + 1 < n ? ((b2 & 0xF) << 2) | (b3 >> 6) : 64;
+      var d4 = i + 2 < n ? (b3 & 0x3F) : 64;
+      buffer += (digits.charAt(d1) + digits.charAt(d2) +
+                 digits.charAt(d3) + digits.charAt(d4));
+    }
+    return buffer;
+  };
+})();
+
+// window.atob (base64 encode function)?
+// Support: IE<10
+(function checkWindowAtobCompatibility() {
+  if ('atob' in window) {
+    return;
+  }
+
+  // https://github.com/davidchambers/Base64.js
+  var digits =
+    'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
+  window.atob = function (input) {
+    input = input.replace(/=+$/, '');
+    if (input.length % 4 === 1) {
+      throw new Error('bad atob input');
+    }
+    for (
+      // initialize result and counters
+      var bc = 0, bs, buffer, idx = 0, output = '';
+      // get next character
+      buffer = input.charAt(idx++);
+      // character found in table?
+      // initialize bit storage and add its ascii value
+      ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer,
+        // and if not first of each 4 characters,
+        // convert the first 8 bits to one ascii character
+        bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0
+    ) {
+      // try to find character in table (0-63, not found => -1)
+      buffer = digits.indexOf(buffer);
+    }
+    return output;
+  };
+})();
+
+// Function.prototype.bind?
+// Support: Android<4.0, iOS<6.0
+(function checkFunctionPrototypeBindCompatibility() {
+  if (typeof Function.prototype.bind !== 'undefined') {
+    return;
+  }
+
+  Function.prototype.bind = function functionPrototypeBind(obj) {
+    var fn = this, headArgs = Array.prototype.slice.call(arguments, 1);
+    var bound = function functionPrototypeBindBound() {
+      var args = headArgs.concat(Array.prototype.slice.call(arguments));
+      return fn.apply(obj, args);
+    };
+    return bound;
+  };
+})();
+
+// HTMLElement dataset property
+// Support: IE<11, Safari<5.1, Android<4.0
+(function checkDatasetProperty() {
+  var div = document.createElement('div');
+  if ('dataset' in div) {
+    return; // dataset property exists
+  }
+
+  Object.defineProperty(HTMLElement.prototype, 'dataset', {
+    get: function() {
+      if (this._dataset) {
+        return this._dataset;
+      }
+
+      var dataset = {};
+      for (var j = 0, jj = this.attributes.length; j < jj; j++) {
+        var attribute = this.attributes[j];
+        if (attribute.name.substring(0, 5) !== 'data-') {
+          continue;
+        }
+        var key = attribute.name.substring(5).replace(/\-([a-z])/g,
+          function(all, ch) {
+            return ch.toUpperCase();
+          });
+        dataset[key] = attribute.value;
+      }
+
+      Object.defineProperty(this, '_dataset', {
+        value: dataset,
+        writable: false,
+        enumerable: false
+      });
+      return dataset;
+    },
+    enumerable: true
+  });
+})();
+
+// HTMLElement classList property
+// Support: IE<10, Android<4.0, iOS<5.0
+(function checkClassListProperty() {
+  var div = document.createElement('div');
+  if ('classList' in div) {
+    return; // classList property exists
+  }
+
+  function changeList(element, itemName, add, remove) {
+    var s = element.className || '';
+    var list = s.split(/\s+/g);
+    if (list[0] === '') {
+      list.shift();
+    }
+    var index = list.indexOf(itemName);
+    if (index < 0 && add) {
+      list.push(itemName);
+    }
+    if (index >= 0 && remove) {
+      list.splice(index, 1);
+    }
+    element.className = list.join(' ');
+    return (index >= 0);
+  }
+
+  var classListPrototype = {
+    add: function(name) {
+      changeList(this.element, name, true, false);
+    },
+    contains: function(name) {
+      return changeList(this.element, name, false, false);
+    },
+    remove: function(name) {
+      changeList(this.element, name, false, true);
+    },
+    toggle: function(name) {
+      changeList(this.element, name, true, true);
+    }
+  };
+
+  Object.defineProperty(HTMLElement.prototype, 'classList', {
+    get: function() {
+      if (this._classList) {
+        return this._classList;
+      }
+
+      var classList = Object.create(classListPrototype, {
+        element: {
+          value: this,
+          writable: false,
+          enumerable: true
+        }
+      });
+      Object.defineProperty(this, '_classList', {
+        value: classList,
+        writable: false,
+        enumerable: false
+      });
+      return classList;
+    },
+    enumerable: true
+  });
+})();
+
+// Check console compatibility
+// In older IE versions the console object is not available
+// unless console is open.
+// Support: IE<10
+(function checkConsoleCompatibility() {
+  if (!('console' in window)) {
+    window.console = {
+      log: function() {},
+      error: function() {},
+      warn: function() {}
+    };
+  } else if (!('bind' in console.log)) {
+    // native functions in IE9 might not have bind
+    console.log = (function(fn) {
+      return function(msg) { return fn(msg); };
+    })(console.log);
+    console.error = (function(fn) {
+      return function(msg) { return fn(msg); };
+    })(console.error);
+    console.warn = (function(fn) {
+      return function(msg) { return fn(msg); };
+    })(console.warn);
+  }
+})();
+
+// Check onclick compatibility in Opera
+// Support: Opera<15
+(function checkOnClickCompatibility() {
+  // workaround for reported Opera bug DSK-354448:
+  // onclick fires on disabled buttons with opaque content
+  function ignoreIfTargetDisabled(event) {
+    if (isDisabled(event.target)) {
+      event.stopPropagation();
+    }
+  }
+  function isDisabled(node) {
+    return node.disabled || (node.parentNode && isDisabled(node.parentNode));
+  }
+  if (navigator.userAgent.indexOf('Opera') !== -1) {
+    // use browser detection since we cannot feature-check this bug
+    document.addEventListener('click', ignoreIfTargetDisabled, true);
+  }
+})();
+
+// Checks if possible to use URL.createObjectURL()
+// Support: IE
+(function checkOnBlobSupport() {
+  // sometimes IE loosing the data created with createObjectURL(), see #3977
+  if (navigator.userAgent.indexOf('Trident') >= 0) {
+    PDFJS.disableCreateObjectURL = true;
+  }
+})();
+
+// Checks if navigator.language is supported
+(function checkNavigatorLanguage() {
+  if ('language' in navigator) {
+    return;
+  }
+  PDFJS.locale = navigator.userLanguage || 'en-US';
+})();
+
+(function checkRangeRequests() {
+  // Safari has issues with cached range requests see:
+  // https://github.com/mozilla/pdf.js/issues/3260
+  // Last tested with version 6.0.4.
+  // Support: Safari 6.0+
+  var isSafari = Object.prototype.toString.call(
+                  window.HTMLElement).indexOf('Constructor') > 0;
+
+  // Older versions of Android (pre 3.0) has issues with range requests, see:
+  // https://github.com/mozilla/pdf.js/issues/3381.
+  // Make sure that we only match webkit-based Android browsers,
+  // since Firefox/Fennec works as expected.
+  // Support: Android<3.0
+  var regex = /Android\s[0-2][^\d]/;
+  var isOldAndroid = regex.test(navigator.userAgent);
+
+  // Range requests are broken in Chrome 39 and 40, https://crbug.com/442318
+  var isChromeWithRangeBug = /Chrome\/(39|40)\./.test(navigator.userAgent);
+
+  if (isSafari || isOldAndroid || isChromeWithRangeBug) {
+    PDFJS.disableRange = true;
+    PDFJS.disableStream = true;
+  }
+})();
+
+// Check if the browser supports manipulation of the history.
+// Support: IE<10, Android<4.2
+(function checkHistoryManipulation() {
+  // Android 2.x has so buggy pushState support that it was removed in
+  // Android 3.0 and restored as late as in Android 4.2.
+  // Support: Android 2.x
+  if (!history.pushState || navigator.userAgent.indexOf('Android 2.') >= 0) {
+    PDFJS.disableHistory = true;
+  }
+})();
+
+// Support: IE<11, Chrome<21, Android<4.4, Safari<6
+(function checkSetPresenceInImageData() {
+  // IE < 11 will use window.CanvasPixelArray which lacks set function.
+  if (window.CanvasPixelArray) {
+    if (typeof window.CanvasPixelArray.prototype.set !== 'function') {
+      window.CanvasPixelArray.prototype.set = function(arr) {
+        for (var i = 0, ii = this.length; i < ii; i++) {
+          this[i] = arr[i];
+        }
+      };
+    }
+  } else {
+    // Old Chrome and Android use an inaccessible CanvasPixelArray prototype.
+    // Because we cannot feature detect it, we rely on user agent parsing.
+    var polyfill = false, versionMatch;
+    if (navigator.userAgent.indexOf('Chrom') >= 0) {
+      versionMatch = navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./);
+      // Chrome < 21 lacks the set function.
+      polyfill = versionMatch && parseInt(versionMatch[2]) < 21;
+    } else if (navigator.userAgent.indexOf('Android') >= 0) {
+      // Android < 4.4 lacks the set function.
+      // Android >= 4.4 will contain Chrome in the user agent,
+      // thus pass the Chrome check above and not reach this block.
+      polyfill = /Android\s[0-4][^\d]/g.test(navigator.userAgent);
+    } else if (navigator.userAgent.indexOf('Safari') >= 0) {
+      versionMatch = navigator.userAgent.
+        match(/Version\/([0-9]+)\.([0-9]+)\.([0-9]+) Safari\//);
+      // Safari < 6 lacks the set function.
+      polyfill = versionMatch && parseInt(versionMatch[1]) < 6;
+    }
+
+    if (polyfill) {
+      var contextPrototype = window.CanvasRenderingContext2D.prototype;
+      contextPrototype._createImageData = contextPrototype.createImageData;
+      contextPrototype.createImageData = function(w, h) {
+        var imageData = this._createImageData(w, h);
+        imageData.data.set = function(arr) {
+          for (var i = 0, ii = this.length; i < ii; i++) {
+            this[i] = arr[i];
+          }
+        };
+        return imageData;
+      };
+    }
+  }
+})();
+
+// Support: IE<10, Android<4.0, iOS
+(function checkRequestAnimationFrame() {
+  function fakeRequestAnimationFrame(callback) {
+    window.setTimeout(callback, 20);
+  }
+
+  var isIOS = /(iPad|iPhone|iPod)/g.test(navigator.userAgent);
+  if (isIOS) {
+    // requestAnimationFrame on iOS is broken, replacing with fake one.
+    window.requestAnimationFrame = fakeRequestAnimationFrame;
+    return;
+  }
+  if ('requestAnimationFrame' in window) {
+    return;
+  }
+  window.requestAnimationFrame =
+    window.mozRequestAnimationFrame ||
+    window.webkitRequestAnimationFrame ||
+    fakeRequestAnimationFrame;
+})();
+
+(function checkCanvasSizeLimitation() {
+  var isIOS = /(iPad|iPhone|iPod)/g.test(navigator.userAgent);
+  var isAndroid = /Android/g.test(navigator.userAgent);
+  if (isIOS || isAndroid) {
+    // 5MP
+    PDFJS.maxCanvasPixels = 5242880;
+  }
+})();
+
+// Disable fullscreen support for certain problematic configurations.
+// Support: IE11+ (when embedded).
+(function checkFullscreenSupport() {
+  var isEmbeddedIE = (navigator.userAgent.indexOf('Trident') >= 0 &&
+                      window.parent !== window);
+  if (isEmbeddedIE) {
+    PDFJS.disableFullscreen = true;
+  }
+})();
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/build/pdf.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/build/pdf.js
new file mode 100644
index 0000000..4d8adb0
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/build/pdf.js
@@ -0,0 +1,19365 @@
+/**
+ * @licstart The following is the entire license notice for the
+ * Javascript code in this page
+ *
+ * Copyright 2018 Mozilla Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * @licend The above is the entire license notice for the
+ * Javascript code in this page
+ */
+
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define("pdfjs-dist/build/pdf", [], factory);
+	else if(typeof exports === 'object')
+		exports["pdfjs-dist/build/pdf"] = factory();
+	else
+		root["pdfjs-dist/build/pdf"] = root.pdfjsLib = factory();
+})(this, function() {
+return /******/ (function(modules) { // webpackBootstrap
+/******/ 	// The module cache
+/******/ 	var installedModules = {};
+/******/
+/******/ 	// The require function
+/******/ 	function __w_pdfjs_require__(moduleId) {
+/******/
+/******/ 		// Check if module is in cache
+/******/ 		if(installedModules[moduleId]) {
+/******/ 			return installedModules[moduleId].exports;
+/******/ 		}
+/******/ 		// Create a new module (and put it into the cache)
+/******/ 		var module = installedModules[moduleId] = {
+/******/ 			i: moduleId,
+/******/ 			l: false,
+/******/ 			exports: {}
+/******/ 		};
+/******/
+/******/ 		// Execute the module function
+/******/ 		modules[moduleId].call(module.exports, module, module.exports, __w_pdfjs_require__);
+/******/
+/******/ 		// Flag the module as loaded
+/******/ 		module.l = true;
+/******/
+/******/ 		// Return the exports of the module
+/******/ 		return module.exports;
+/******/ 	}
+/******/
+/******/
+/******/ 	// expose the modules object (__webpack_modules__)
+/******/ 	__w_pdfjs_require__.m = modules;
+/******/
+/******/ 	// expose the module cache
+/******/ 	__w_pdfjs_require__.c = installedModules;
+/******/
+/******/ 	// define getter function for harmony exports
+/******/ 	__w_pdfjs_require__.d = function(exports, name, getter) {
+/******/ 		if(!__w_pdfjs_require__.o(exports, name)) {
+/******/ 			Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ 		}
+/******/ 	};
+/******/
+/******/ 	// define __esModule on exports
+/******/ 	__w_pdfjs_require__.r = function(exports) {
+/******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ 		}
+/******/ 		Object.defineProperty(exports, '__esModule', { value: true });
+/******/ 	};
+/******/
+/******/ 	// create a fake namespace object
+/******/ 	// mode & 1: value is a module id, require it
+/******/ 	// mode & 2: merge all properties of value into the ns
+/******/ 	// mode & 4: return value when already ns object
+/******/ 	// mode & 8|1: behave like require
+/******/ 	__w_pdfjs_require__.t = function(value, mode) {
+/******/ 		if(mode & 1) value = __w_pdfjs_require__(value);
+/******/ 		if(mode & 8) return value;
+/******/ 		if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ 		var ns = Object.create(null);
+/******/ 		__w_pdfjs_require__.r(ns);
+/******/ 		Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ 		if(mode & 2 && typeof value != 'string') for(var key in value) __w_pdfjs_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ 		return ns;
+/******/ 	};
+/******/
+/******/ 	// getDefaultExport function for compatibility with non-harmony modules
+/******/ 	__w_pdfjs_require__.n = function(module) {
+/******/ 		var getter = module && module.__esModule ?
+/******/ 			function getDefault() { return module['default']; } :
+/******/ 			function getModuleExports() { return module; };
+/******/ 		__w_pdfjs_require__.d(getter, 'a', getter);
+/******/ 		return getter;
+/******/ 	};
+/******/
+/******/ 	// Object.prototype.hasOwnProperty.call
+/******/ 	__w_pdfjs_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ 	// __webpack_public_path__
+/******/ 	__w_pdfjs_require__.p = "";
+/******/
+/******/
+/******/ 	// Load entry module and return exports
+/******/ 	return __w_pdfjs_require__(__w_pdfjs_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var pdfjsVersion = '2.0.943';
+var pdfjsBuild = 'dc98bf76';
+var pdfjsSharedUtil = __w_pdfjs_require__(1);
+var pdfjsDisplayAPI = __w_pdfjs_require__(129);
+var pdfjsDisplayTextLayer = __w_pdfjs_require__(145);
+var pdfjsDisplayAnnotationLayer = __w_pdfjs_require__(146);
+var pdfjsDisplayDOMUtils = __w_pdfjs_require__(130);
+var pdfjsDisplaySVG = __w_pdfjs_require__(147);
+var pdfjsDisplayWorkerOptions = __w_pdfjs_require__(135);
+var pdfjsDisplayAPICompatibility = __w_pdfjs_require__(132);
+{
+  var isNodeJS = __w_pdfjs_require__(4);
+  if (isNodeJS()) {
+    var PDFNodeStream = __w_pdfjs_require__(148).PDFNodeStream;
+    pdfjsDisplayAPI.setPDFNetworkStreamFactory(function (params) {
+      return new PDFNodeStream(params);
+    });
+  } else if (typeof Response !== 'undefined' && 'body' in Response.prototype && typeof ReadableStream !== 'undefined') {
+    var PDFFetchStream = __w_pdfjs_require__(151).PDFFetchStream;
+    pdfjsDisplayAPI.setPDFNetworkStreamFactory(function (params) {
+      return new PDFFetchStream(params);
+    });
+  } else {
+    var PDFNetworkStream = __w_pdfjs_require__(152).PDFNetworkStream;
+    pdfjsDisplayAPI.setPDFNetworkStreamFactory(function (params) {
+      return new PDFNetworkStream(params);
+    });
+  }
+}
+exports.build = pdfjsDisplayAPI.build;
+exports.version = pdfjsDisplayAPI.version;
+exports.getDocument = pdfjsDisplayAPI.getDocument;
+exports.LoopbackPort = pdfjsDisplayAPI.LoopbackPort;
+exports.PDFDataRangeTransport = pdfjsDisplayAPI.PDFDataRangeTransport;
+exports.PDFWorker = pdfjsDisplayAPI.PDFWorker;
+exports.renderTextLayer = pdfjsDisplayTextLayer.renderTextLayer;
+exports.AnnotationLayer = pdfjsDisplayAnnotationLayer.AnnotationLayer;
+exports.createPromiseCapability = pdfjsSharedUtil.createPromiseCapability;
+exports.PasswordResponses = pdfjsSharedUtil.PasswordResponses;
+exports.InvalidPDFException = pdfjsSharedUtil.InvalidPDFException;
+exports.MissingPDFException = pdfjsSharedUtil.MissingPDFException;
+exports.SVGGraphics = pdfjsDisplaySVG.SVGGraphics;
+exports.NativeImageDecoding = pdfjsSharedUtil.NativeImageDecoding;
+exports.CMapCompressionType = pdfjsSharedUtil.CMapCompressionType;
+exports.PermissionFlag = pdfjsSharedUtil.PermissionFlag;
+exports.UnexpectedResponseException = pdfjsSharedUtil.UnexpectedResponseException;
+exports.OPS = pdfjsSharedUtil.OPS;
+exports.VerbosityLevel = pdfjsSharedUtil.VerbosityLevel;
+exports.UNSUPPORTED_FEATURES = pdfjsSharedUtil.UNSUPPORTED_FEATURES;
+exports.createValidAbsoluteUrl = pdfjsSharedUtil.createValidAbsoluteUrl;
+exports.createObjectURL = pdfjsSharedUtil.createObjectURL;
+exports.removeNullCharacters = pdfjsSharedUtil.removeNullCharacters;
+exports.shadow = pdfjsSharedUtil.shadow;
+exports.Util = pdfjsSharedUtil.Util;
+exports.ReadableStream = pdfjsSharedUtil.ReadableStream;
+exports.URL = pdfjsSharedUtil.URL;
+exports.RenderingCancelledException = pdfjsDisplayDOMUtils.RenderingCancelledException;
+exports.getFilenameFromUrl = pdfjsDisplayDOMUtils.getFilenameFromUrl;
+exports.LinkTarget = pdfjsDisplayDOMUtils.LinkTarget;
+exports.addLinkAttributes = pdfjsDisplayDOMUtils.addLinkAttributes;
+exports.loadScript = pdfjsDisplayDOMUtils.loadScript;
+exports.GlobalWorkerOptions = pdfjsDisplayWorkerOptions.GlobalWorkerOptions;
+exports.apiCompatibilityParams = pdfjsDisplayAPICompatibility.apiCompatibilityParams;
+
+/***/ }),
+/* 1 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.unreachable = exports.warn = exports.utf8StringToString = exports.stringToUTF8String = exports.stringToPDFString = exports.stringToBytes = exports.string32 = exports.shadow = exports.setVerbosityLevel = exports.URL = exports.ReadableStream = exports.removeNullCharacters = exports.readUint32 = exports.readUint16 = exports.readInt8 = exports.log2 = exports.isEvalSupported = exports.isLittleEndian = exports.createValidAbsoluteUrl = exports.isSameOrigin = exports.isSpace = exports.isString = exports.isNum = exports.isEmptyObj = exports.isBool = exports.isArrayBuffer = exports.info = exports.getVerbosityLevel = exports.getLookupTableFactory = exports.getInheritableProperty = exports.deprecated = exports.createObjectURL = exports.createPromiseCapability = exports.bytesToString = exports.assert = exports.arraysToBytes = exports.arrayByteLength = exports.FormatError = exports.XRefParseException = exports.toRomanNumerals = exports.Util = exports.UnknownErrorException = exports.UnexpectedResponseException = exports.TextRenderingMode = exports.StreamType = exports.PermissionFlag = exports.PasswordResponses = exports.PasswordException = exports.NativeImageDecoding = exports.MissingPDFException = exports.MissingDataException = exports.InvalidPDFException = exports.AbortException = exports.CMapCompressionType = exports.ImageKind = exports.FontType = exports.AnnotationType = exports.AnnotationFlag = exports.AnnotationFieldFlag = exports.AnnotationBorderStyleType = exports.UNSUPPORTED_FEATURES = exports.VerbosityLevel = exports.OPS = exports.IDENTITY_MATRIX = exports.FONT_IDENTITY_MATRIX = undefined;
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+__w_pdfjs_require__(2);
+
+var _streams_polyfill = __w_pdfjs_require__(125);
+
+var _url_polyfill = __w_pdfjs_require__(127);
+
+var IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0];
+var FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0];
+var NativeImageDecoding = {
+  NONE: 'none',
+  DECODE: 'decode',
+  DISPLAY: 'display'
+};
+var PermissionFlag = {
+  PRINT: 0x04,
+  MODIFY_CONTENTS: 0x08,
+  COPY: 0x10,
+  MODIFY_ANNOTATIONS: 0x20,
+  FILL_INTERACTIVE_FORMS: 0x100,
+  COPY_FOR_ACCESSIBILITY: 0x200,
+  ASSEMBLE: 0x400,
+  PRINT_HIGH_QUALITY: 0x800
+};
+var TextRenderingMode = {
+  FILL: 0,
+  STROKE: 1,
+  FILL_STROKE: 2,
+  INVISIBLE: 3,
+  FILL_ADD_TO_PATH: 4,
+  STROKE_ADD_TO_PATH: 5,
+  FILL_STROKE_ADD_TO_PATH: 6,
+  ADD_TO_PATH: 7,
+  FILL_STROKE_MASK: 3,
+  ADD_TO_PATH_FLAG: 4
+};
+var ImageKind = {
+  GRAYSCALE_1BPP: 1,
+  RGB_24BPP: 2,
+  RGBA_32BPP: 3
+};
+var AnnotationType = {
+  TEXT: 1,
+  LINK: 2,
+  FREETEXT: 3,
+  LINE: 4,
+  SQUARE: 5,
+  CIRCLE: 6,
+  POLYGON: 7,
+  POLYLINE: 8,
+  HIGHLIGHT: 9,
+  UNDERLINE: 10,
+  SQUIGGLY: 11,
+  STRIKEOUT: 12,
+  STAMP: 13,
+  CARET: 14,
+  INK: 15,
+  POPUP: 16,
+  FILEATTACHMENT: 17,
+  SOUND: 18,
+  MOVIE: 19,
+  WIDGET: 20,
+  SCREEN: 21,
+  PRINTERMARK: 22,
+  TRAPNET: 23,
+  WATERMARK: 24,
+  THREED: 25,
+  REDACT: 26
+};
+var AnnotationFlag = {
+  INVISIBLE: 0x01,
+  HIDDEN: 0x02,
+  PRINT: 0x04,
+  NOZOOM: 0x08,
+  NOROTATE: 0x10,
+  NOVIEW: 0x20,
+  READONLY: 0x40,
+  LOCKED: 0x80,
+  TOGGLENOVIEW: 0x100,
+  LOCKEDCONTENTS: 0x200
+};
+var AnnotationFieldFlag = {
+  READONLY: 0x0000001,
+  REQUIRED: 0x0000002,
+  NOEXPORT: 0x0000004,
+  MULTILINE: 0x0001000,
+  PASSWORD: 0x0002000,
+  NOTOGGLETOOFF: 0x0004000,
+  RADIO: 0x0008000,
+  PUSHBUTTON: 0x0010000,
+  COMBO: 0x0020000,
+  EDIT: 0x0040000,
+  SORT: 0x0080000,
+  FILESELECT: 0x0100000,
+  MULTISELECT: 0x0200000,
+  DONOTSPELLCHECK: 0x0400000,
+  DONOTSCROLL: 0x0800000,
+  COMB: 0x1000000,
+  RICHTEXT: 0x2000000,
+  RADIOSINUNISON: 0x2000000,
+  COMMITONSELCHANGE: 0x4000000
+};
+var AnnotationBorderStyleType = {
+  SOLID: 1,
+  DASHED: 2,
+  BEVELED: 3,
+  INSET: 4,
+  UNDERLINE: 5
+};
+var StreamType = {
+  UNKNOWN: 0,
+  FLATE: 1,
+  LZW: 2,
+  DCT: 3,
+  JPX: 4,
+  JBIG: 5,
+  A85: 6,
+  AHX: 7,
+  CCF: 8,
+  RL: 9
+};
+var FontType = {
+  UNKNOWN: 0,
+  TYPE1: 1,
+  TYPE1C: 2,
+  CIDFONTTYPE0: 3,
+  CIDFONTTYPE0C: 4,
+  TRUETYPE: 5,
+  CIDFONTTYPE2: 6,
+  TYPE3: 7,
+  OPENTYPE: 8,
+  TYPE0: 9,
+  MMTYPE1: 10
+};
+var VerbosityLevel = {
+  ERRORS: 0,
+  WARNINGS: 1,
+  INFOS: 5
+};
+var CMapCompressionType = {
+  NONE: 0,
+  BINARY: 1,
+  STREAM: 2
+};
+var OPS = {
+  dependency: 1,
+  setLineWidth: 2,
+  setLineCap: 3,
+  setLineJoin: 4,
+  setMiterLimit: 5,
+  setDash: 6,
+  setRenderingIntent: 7,
+  setFlatness: 8,
+  setGState: 9,
+  save: 10,
+  restore: 11,
+  transform: 12,
+  moveTo: 13,
+  lineTo: 14,
+  curveTo: 15,
+  curveTo2: 16,
+  curveTo3: 17,
+  closePath: 18,
+  rectangle: 19,
+  stroke: 20,
+  closeStroke: 21,
+  fill: 22,
+  eoFill: 23,
+  fillStroke: 24,
+  eoFillStroke: 25,
+  closeFillStroke: 26,
+  closeEOFillStroke: 27,
+  endPath: 28,
+  clip: 29,
+  eoClip: 30,
+  beginText: 31,
+  endText: 32,
+  setCharSpacing: 33,
+  setWordSpacing: 34,
+  setHScale: 35,
+  setLeading: 36,
+  setFont: 37,
+  setTextRenderingMode: 38,
+  setTextRise: 39,
+  moveText: 40,
+  setLeadingMoveText: 41,
+  setTextMatrix: 42,
+  nextLine: 43,
+  showText: 44,
+  showSpacedText: 45,
+  nextLineShowText: 46,
+  nextLineSetSpacingShowText: 47,
+  setCharWidth: 48,
+  setCharWidthAndBounds: 49,
+  setStrokeColorSpace: 50,
+  setFillColorSpace: 51,
+  setStrokeColor: 52,
+  setStrokeColorN: 53,
+  setFillColor: 54,
+  setFillColorN: 55,
+  setStrokeGray: 56,
+  setFillGray: 57,
+  setStrokeRGBColor: 58,
+  setFillRGBColor: 59,
+  setStrokeCMYKColor: 60,
+  setFillCMYKColor: 61,
+  shadingFill: 62,
+  beginInlineImage: 63,
+  beginImageData: 64,
+  endInlineImage: 65,
+  paintXObject: 66,
+  markPoint: 67,
+  markPointProps: 68,
+  beginMarkedContent: 69,
+  beginMarkedContentProps: 70,
+  endMarkedContent: 71,
+  beginCompat: 72,
+  endCompat: 73,
+  paintFormXObjectBegin: 74,
+  paintFormXObjectEnd: 75,
+  beginGroup: 76,
+  endGroup: 77,
+  beginAnnotations: 78,
+  endAnnotations: 79,
+  beginAnnotation: 80,
+  endAnnotation: 81,
+  paintJpegXObject: 82,
+  paintImageMaskXObject: 83,
+  paintImageMaskXObjectGroup: 84,
+  paintImageXObject: 85,
+  paintInlineImageXObject: 86,
+  paintInlineImageXObjectGroup: 87,
+  paintImageXObjectRepeat: 88,
+  paintImageMaskXObjectRepeat: 89,
+  paintSolidColorImageMask: 90,
+  constructPath: 91
+};
+var UNSUPPORTED_FEATURES = {
+  unknown: 'unknown',
+  forms: 'forms',
+  javaScript: 'javaScript',
+  smask: 'smask',
+  shadingPattern: 'shadingPattern',
+  font: 'font'
+};
+var PasswordResponses = {
+  NEED_PASSWORD: 1,
+  INCORRECT_PASSWORD: 2
+};
+var verbosity = VerbosityLevel.WARNINGS;
+function setVerbosityLevel(level) {
+  if (Number.isInteger(level)) {
+    verbosity = level;
+  }
+}
+function getVerbosityLevel() {
+  return verbosity;
+}
+function info(msg) {
+  if (verbosity >= VerbosityLevel.INFOS) {
+    console.log('Info: ' + msg);
+  }
+}
+function warn(msg) {
+  if (verbosity >= VerbosityLevel.WARNINGS) {
+    console.log('Warning: ' + msg);
+  }
+}
+function deprecated(details) {
+  console.log('Deprecated API usage: ' + details);
+}
+function unreachable(msg) {
+  throw new Error(msg);
+}
+function assert(cond, msg) {
+  if (!cond) {
+    unreachable(msg);
+  }
+}
+function isSameOrigin(baseUrl, otherUrl) {
+  try {
+    var base = new _url_polyfill.URL(baseUrl);
+    if (!base.origin || base.origin === 'null') {
+      return false;
+    }
+  } catch (e) {
+    return false;
+  }
+  var other = new _url_polyfill.URL(otherUrl, base);
+  return base.origin === other.origin;
+}
+function _isValidProtocol(url) {
+  if (!url) {
+    return false;
+  }
+  switch (url.protocol) {
+    case 'http:':
+    case 'https:':
+    case 'ftp:':
+    case 'mailto:':
+    case 'tel:':
+      return true;
+    default:
+      return false;
+  }
+}
+function createValidAbsoluteUrl(url, baseUrl) {
+  if (!url) {
+    return null;
+  }
+  try {
+    var absoluteUrl = baseUrl ? new _url_polyfill.URL(url, baseUrl) : new _url_polyfill.URL(url);
+    if (_isValidProtocol(absoluteUrl)) {
+      return absoluteUrl;
+    }
+  } catch (ex) {}
+  return null;
+}
+function shadow(obj, prop, value) {
+  Object.defineProperty(obj, prop, {
+    value: value,
+    enumerable: true,
+    configurable: true,
+    writable: false
+  });
+  return value;
+}
+function getLookupTableFactory(initializer) {
+  var lookup;
+  return function () {
+    if (initializer) {
+      lookup = Object.create(null);
+      initializer(lookup);
+      initializer = null;
+    }
+    return lookup;
+  };
+}
+var PasswordException = function PasswordExceptionClosure() {
+  function PasswordException(msg, code) {
+    this.name = 'PasswordException';
+    this.message = msg;
+    this.code = code;
+  }
+  PasswordException.prototype = new Error();
+  PasswordException.constructor = PasswordException;
+  return PasswordException;
+}();
+var UnknownErrorException = function UnknownErrorExceptionClosure() {
+  function UnknownErrorException(msg, details) {
+    this.name = 'UnknownErrorException';
+    this.message = msg;
+    this.details = details;
+  }
+  UnknownErrorException.prototype = new Error();
+  UnknownErrorException.constructor = UnknownErrorException;
+  return UnknownErrorException;
+}();
+var InvalidPDFException = function InvalidPDFExceptionClosure() {
+  function InvalidPDFException(msg) {
+    this.name = 'InvalidPDFException';
+    this.message = msg;
+  }
+  InvalidPDFException.prototype = new Error();
+  InvalidPDFException.constructor = InvalidPDFException;
+  return InvalidPDFException;
+}();
+var MissingPDFException = function MissingPDFExceptionClosure() {
+  function MissingPDFException(msg) {
+    this.name = 'MissingPDFException';
+    this.message = msg;
+  }
+  MissingPDFException.prototype = new Error();
+  MissingPDFException.constructor = MissingPDFException;
+  return MissingPDFException;
+}();
+var UnexpectedResponseException = function UnexpectedResponseExceptionClosure() {
+  function UnexpectedResponseException(msg, status) {
+    this.name = 'UnexpectedResponseException';
+    this.message = msg;
+    this.status = status;
+  }
+  UnexpectedResponseException.prototype = new Error();
+  UnexpectedResponseException.constructor = UnexpectedResponseException;
+  return UnexpectedResponseException;
+}();
+var MissingDataException = function MissingDataExceptionClosure() {
+  function MissingDataException(begin, end) {
+    this.begin = begin;
+    this.end = end;
+    this.message = 'Missing data [' + begin + ', ' + end + ')';
+  }
+  MissingDataException.prototype = new Error();
+  MissingDataException.prototype.name = 'MissingDataException';
+  MissingDataException.constructor = MissingDataException;
+  return MissingDataException;
+}();
+var XRefParseException = function XRefParseExceptionClosure() {
+  function XRefParseException(msg) {
+    this.message = msg;
+  }
+  XRefParseException.prototype = new Error();
+  XRefParseException.prototype.name = 'XRefParseException';
+  XRefParseException.constructor = XRefParseException;
+  return XRefParseException;
+}();
+var FormatError = function FormatErrorClosure() {
+  function FormatError(msg) {
+    this.message = msg;
+  }
+  FormatError.prototype = new Error();
+  FormatError.prototype.name = 'FormatError';
+  FormatError.constructor = FormatError;
+  return FormatError;
+}();
+var AbortException = function AbortExceptionClosure() {
+  function AbortException(msg) {
+    this.name = 'AbortException';
+    this.message = msg;
+  }
+  AbortException.prototype = new Error();
+  AbortException.constructor = AbortException;
+  return AbortException;
+}();
+var NullCharactersRegExp = /\x00/g;
+function removeNullCharacters(str) {
+  if (typeof str !== 'string') {
+    warn('The argument for removeNullCharacters must be a string.');
+    return str;
+  }
+  return str.replace(NullCharactersRegExp, '');
+}
+function bytesToString(bytes) {
+  assert(bytes !== null && (typeof bytes === 'undefined' ? 'undefined' : _typeof(bytes)) === 'object' && bytes.length !== undefined, 'Invalid argument for bytesToString');
+  var length = bytes.length;
+  var MAX_ARGUMENT_COUNT = 8192;
+  if (length < MAX_ARGUMENT_COUNT) {
+    return String.fromCharCode.apply(null, bytes);
+  }
+  var strBuf = [];
+  for (var i = 0; i < length; i += MAX_ARGUMENT_COUNT) {
+    var chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length);
+    var chunk = bytes.subarray(i, chunkEnd);
+    strBuf.push(String.fromCharCode.apply(null, chunk));
+  }
+  return strBuf.join('');
+}
+function stringToBytes(str) {
+  assert(typeof str === 'string', 'Invalid argument for stringToBytes');
+  var length = str.length;
+  var bytes = new Uint8Array(length);
+  for (var i = 0; i < length; ++i) {
+    bytes[i] = str.charCodeAt(i) & 0xFF;
+  }
+  return bytes;
+}
+function arrayByteLength(arr) {
+  if (arr.length !== undefined) {
+    return arr.length;
+  }
+  assert(arr.byteLength !== undefined);
+  return arr.byteLength;
+}
+function arraysToBytes(arr) {
+  if (arr.length === 1 && arr[0] instanceof Uint8Array) {
+    return arr[0];
+  }
+  var resultLength = 0;
+  var i,
+      ii = arr.length;
+  var item, itemLength;
+  for (i = 0; i < ii; i++) {
+    item = arr[i];
+    itemLength = arrayByteLength(item);
+    resultLength += itemLength;
+  }
+  var pos = 0;
+  var data = new Uint8Array(resultLength);
+  for (i = 0; i < ii; i++) {
+    item = arr[i];
+    if (!(item instanceof Uint8Array)) {
+      if (typeof item === 'string') {
+        item = stringToBytes(item);
+      } else {
+        item = new Uint8Array(item);
+      }
+    }
+    itemLength = item.byteLength;
+    data.set(item, pos);
+    pos += itemLength;
+  }
+  return data;
+}
+function string32(value) {
+  return String.fromCharCode(value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff);
+}
+function log2(x) {
+  if (x <= 0) {
+    return 0;
+  }
+  return Math.ceil(Math.log2(x));
+}
+function readInt8(data, start) {
+  return data[start] << 24 >> 24;
+}
+function readUint16(data, offset) {
+  return data[offset] << 8 | data[offset + 1];
+}
+function readUint32(data, offset) {
+  return (data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3]) >>> 0;
+}
+function isLittleEndian() {
+  var buffer8 = new Uint8Array(4);
+  buffer8[0] = 1;
+  var view32 = new Uint32Array(buffer8.buffer, 0, 1);
+  return view32[0] === 1;
+}
+function isEvalSupported() {
+  try {
+    new Function('');
+    return true;
+  } catch (e) {
+    return false;
+  }
+}
+function getInheritableProperty(_ref) {
+  var dict = _ref.dict,
+      key = _ref.key,
+      _ref$getArray = _ref.getArray,
+      getArray = _ref$getArray === undefined ? false : _ref$getArray,
+      _ref$stopWhenFound = _ref.stopWhenFound,
+      stopWhenFound = _ref$stopWhenFound === undefined ? true : _ref$stopWhenFound;
+
+  var LOOP_LIMIT = 100;
+  var loopCount = 0;
+  var values = void 0;
+  while (dict) {
+    var value = getArray ? dict.getArray(key) : dict.get(key);
+    if (value !== undefined) {
+      if (stopWhenFound) {
+        return value;
+      }
+      if (!values) {
+        values = [];
+      }
+      values.push(value);
+    }
+    if (++loopCount > LOOP_LIMIT) {
+      warn('getInheritableProperty: maximum loop count exceeded for "' + key + '"');
+      break;
+    }
+    dict = dict.get('Parent');
+  }
+  return values;
+}
+var Util = function UtilClosure() {
+  function Util() {}
+  var rgbBuf = ['rgb(', 0, ',', 0, ',', 0, ')'];
+  Util.makeCssRgb = function Util_makeCssRgb(r, g, b) {
+    rgbBuf[1] = r;
+    rgbBuf[3] = g;
+    rgbBuf[5] = b;
+    return rgbBuf.join('');
+  };
+  Util.transform = function Util_transform(m1, m2) {
+    return [m1[0] * m2[0] + m1[2] * m2[1], m1[1] * m2[0] + m1[3] * m2[1], m1[0] * m2[2] + m1[2] * m2[3], m1[1] * m2[2] + m1[3] * m2[3], m1[0] * m2[4] + m1[2] * m2[5] + m1[4], m1[1] * m2[4] + m1[3] * m2[5] + m1[5]];
+  };
+  Util.applyTransform = function Util_applyTransform(p, m) {
+    var xt = p[0] * m[0] + p[1] * m[2] + m[4];
+    var yt = p[0] * m[1] + p[1] * m[3] + m[5];
+    return [xt, yt];
+  };
+  Util.applyInverseTransform = function Util_applyInverseTransform(p, m) {
+    var d = m[0] * m[3] - m[1] * m[2];
+    var xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d;
+    var yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d;
+    return [xt, yt];
+  };
+  Util.getAxialAlignedBoundingBox = function Util_getAxialAlignedBoundingBox(r, m) {
+    var p1 = Util.applyTransform(r, m);
+    var p2 = Util.applyTransform(r.slice(2, 4), m);
+    var p3 = Util.applyTransform([r[0], r[3]], m);
+    var p4 = Util.applyTransform([r[2], r[1]], m);
+    return [Math.min(p1[0], p2[0], p3[0], p4[0]), Math.min(p1[1], p2[1], p3[1], p4[1]), Math.max(p1[0], p2[0], p3[0], p4[0]), Math.max(p1[1], p2[1], p3[1], p4[1])];
+  };
+  Util.inverseTransform = function Util_inverseTransform(m) {
+    var d = m[0] * m[3] - m[1] * m[2];
+    return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d, (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d];
+  };
+  Util.apply3dTransform = function Util_apply3dTransform(m, v) {
+    return [m[0] * v[0] + m[1] * v[1] + m[2] * v[2], m[3] * v[0] + m[4] * v[1] + m[5] * v[2], m[6] * v[0] + m[7] * v[1] + m[8] * v[2]];
+  };
+  Util.singularValueDecompose2dScale = function Util_singularValueDecompose2dScale(m) {
+    var transpose = [m[0], m[2], m[1], m[3]];
+    var a = m[0] * transpose[0] + m[1] * transpose[2];
+    var b = m[0] * transpose[1] + m[1] * transpose[3];
+    var c = m[2] * transpose[0] + m[3] * transpose[2];
+    var d = m[2] * transpose[1] + m[3] * transpose[3];
+    var first = (a + d) / 2;
+    var second = Math.sqrt((a + d) * (a + d) - 4 * (a * d - c * b)) / 2;
+    var sx = first + second || 1;
+    var sy = first - second || 1;
+    return [Math.sqrt(sx), Math.sqrt(sy)];
+  };
+  Util.normalizeRect = function Util_normalizeRect(rect) {
+    var r = rect.slice(0);
+    if (rect[0] > rect[2]) {
+      r[0] = rect[2];
+      r[2] = rect[0];
+    }
+    if (rect[1] > rect[3]) {
+      r[1] = rect[3];
+      r[3] = rect[1];
+    }
+    return r;
+  };
+  Util.intersect = function Util_intersect(rect1, rect2) {
+    function compare(a, b) {
+      return a - b;
+    }
+    var orderedX = [rect1[0], rect1[2], rect2[0], rect2[2]].sort(compare),
+        orderedY = [rect1[1], rect1[3], rect2[1], rect2[3]].sort(compare),
+        result = [];
+    rect1 = Util.normalizeRect(rect1);
+    rect2 = Util.normalizeRect(rect2);
+    if (orderedX[0] === rect1[0] && orderedX[1] === rect2[0] || orderedX[0] === rect2[0] && orderedX[1] === rect1[0]) {
+      result[0] = orderedX[1];
+      result[2] = orderedX[2];
+    } else {
+      return false;
+    }
+    if (orderedY[0] === rect1[1] && orderedY[1] === rect2[1] || orderedY[0] === rect2[1] && orderedY[1] === rect1[1]) {
+      result[1] = orderedY[1];
+      result[3] = orderedY[2];
+    } else {
+      return false;
+    }
+    return result;
+  };
+  return Util;
+}();
+var ROMAN_NUMBER_MAP = ['', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM', '', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC', '', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX'];
+function toRomanNumerals(number) {
+  var lowerCase = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+
+  assert(Number.isInteger(number) && number > 0, 'The number should be a positive integer.');
+  var pos = void 0,
+      romanBuf = [];
+  while (number >= 1000) {
+    number -= 1000;
+    romanBuf.push('M');
+  }
+  pos = number / 100 | 0;
+  number %= 100;
+  romanBuf.push(ROMAN_NUMBER_MAP[pos]);
+  pos = number / 10 | 0;
+  number %= 10;
+  romanBuf.push(ROMAN_NUMBER_MAP[10 + pos]);
+  romanBuf.push(ROMAN_NUMBER_MAP[20 + number]);
+  var romanStr = romanBuf.join('');
+  return lowerCase ? romanStr.toLowerCase() : romanStr;
+}
+var PDFStringTranslateTable = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2D8, 0x2C7, 0x2C6, 0x2D9, 0x2DD, 0x2DB, 0x2DA, 0x2DC, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x192, 0x2044, 0x2039, 0x203A, 0x2212, 0x2030, 0x201E, 0x201C, 0x201D, 0x2018, 0x2019, 0x201A, 0x2122, 0xFB01, 0xFB02, 0x141, 0x152, 0x160, 0x178, 0x17D, 0x131, 0x142, 0x153, 0x161, 0x17E, 0, 0x20AC];
+function stringToPDFString(str) {
+  var i,
+      n = str.length,
+      strBuf = [];
+  if (str[0] === '\xFE' && str[1] === '\xFF') {
+    for (i = 2; i < n; i += 2) {
+      strBuf.push(String.fromCharCode(str.charCodeAt(i) << 8 | str.charCodeAt(i + 1)));
+    }
+  } else {
+    for (i = 0; i < n; ++i) {
+      var code = PDFStringTranslateTable[str.charCodeAt(i)];
+      strBuf.push(code ? String.fromCharCode(code) : str.charAt(i));
+    }
+  }
+  return strBuf.join('');
+}
+function stringToUTF8String(str) {
+  return decodeURIComponent(escape(str));
+}
+function utf8StringToString(str) {
+  return unescape(encodeURIComponent(str));
+}
+function isEmptyObj(obj) {
+  for (var key in obj) {
+    return false;
+  }
+  return true;
+}
+function isBool(v) {
+  return typeof v === 'boolean';
+}
+function isNum(v) {
+  return typeof v === 'number';
+}
+function isString(v) {
+  return typeof v === 'string';
+}
+function isArrayBuffer(v) {
+  return (typeof v === 'undefined' ? 'undefined' : _typeof(v)) === 'object' && v !== null && v.byteLength !== undefined;
+}
+function isSpace(ch) {
+  return ch === 0x20 || ch === 0x09 || ch === 0x0D || ch === 0x0A;
+}
+function createPromiseCapability() {
+  var capability = {};
+  capability.promise = new Promise(function (resolve, reject) {
+    capability.resolve = resolve;
+    capability.reject = reject;
+  });
+  return capability;
+}
+var createObjectURL = function createObjectURLClosure() {
+  var digits = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
+  return function createObjectURL(data, contentType) {
+    var forceDataSchema = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
+
+    if (!forceDataSchema && _url_polyfill.URL.createObjectURL) {
+      var blob = new Blob([data], { type: contentType });
+      return _url_polyfill.URL.createObjectURL(blob);
+    }
+    var buffer = 'data:' + contentType + ';base64,';
+    for (var i = 0, ii = data.length; i < ii; i += 3) {
+      var b1 = data[i] & 0xFF;
+      var b2 = data[i + 1] & 0xFF;
+      var b3 = data[i + 2] & 0xFF;
+      var d1 = b1 >> 2,
+          d2 = (b1 & 3) << 4 | b2 >> 4;
+      var d3 = i + 1 < ii ? (b2 & 0xF) << 2 | b3 >> 6 : 64;
+      var d4 = i + 2 < ii ? b3 & 0x3F : 64;
+      buffer += digits[d1] + digits[d2] + digits[d3] + digits[d4];
+    }
+    return buffer;
+  };
+}();
+exports.FONT_IDENTITY_MATRIX = FONT_IDENTITY_MATRIX;
+exports.IDENTITY_MATRIX = IDENTITY_MATRIX;
+exports.OPS = OPS;
+exports.VerbosityLevel = VerbosityLevel;
+exports.UNSUPPORTED_FEATURES = UNSUPPORTED_FEATURES;
+exports.AnnotationBorderStyleType = AnnotationBorderStyleType;
+exports.AnnotationFieldFlag = AnnotationFieldFlag;
+exports.AnnotationFlag = AnnotationFlag;
+exports.AnnotationType = AnnotationType;
+exports.FontType = FontType;
+exports.ImageKind = ImageKind;
+exports.CMapCompressionType = CMapCompressionType;
+exports.AbortException = AbortException;
+exports.InvalidPDFException = InvalidPDFException;
+exports.MissingDataException = MissingDataException;
+exports.MissingPDFException = MissingPDFException;
+exports.NativeImageDecoding = NativeImageDecoding;
+exports.PasswordException = PasswordException;
+exports.PasswordResponses = PasswordResponses;
+exports.PermissionFlag = PermissionFlag;
+exports.StreamType = StreamType;
+exports.TextRenderingMode = TextRenderingMode;
+exports.UnexpectedResponseException = UnexpectedResponseException;
+exports.UnknownErrorException = UnknownErrorException;
+exports.Util = Util;
+exports.toRomanNumerals = toRomanNumerals;
+exports.XRefParseException = XRefParseException;
+exports.FormatError = FormatError;
+exports.arrayByteLength = arrayByteLength;
+exports.arraysToBytes = arraysToBytes;
+exports.assert = assert;
+exports.bytesToString = bytesToString;
+exports.createPromiseCapability = createPromiseCapability;
+exports.createObjectURL = createObjectURL;
+exports.deprecated = deprecated;
+exports.getInheritableProperty = getInheritableProperty;
+exports.getLookupTableFactory = getLookupTableFactory;
+exports.getVerbosityLevel = getVerbosityLevel;
+exports.info = info;
+exports.isArrayBuffer = isArrayBuffer;
+exports.isBool = isBool;
+exports.isEmptyObj = isEmptyObj;
+exports.isNum = isNum;
+exports.isString = isString;
+exports.isSpace = isSpace;
+exports.isSameOrigin = isSameOrigin;
+exports.createValidAbsoluteUrl = createValidAbsoluteUrl;
+exports.isLittleEndian = isLittleEndian;
+exports.isEvalSupported = isEvalSupported;
+exports.log2 = log2;
+exports.readInt8 = readInt8;
+exports.readUint16 = readUint16;
+exports.readUint32 = readUint32;
+exports.removeNullCharacters = removeNullCharacters;
+exports.ReadableStream = _streams_polyfill.ReadableStream;
+exports.URL = _url_polyfill.URL;
+exports.setVerbosityLevel = setVerbosityLevel;
+exports.shadow = shadow;
+exports.string32 = string32;
+exports.stringToBytes = stringToBytes;
+exports.stringToPDFString = stringToPDFString;
+exports.stringToUTF8String = stringToUTF8String;
+exports.utf8StringToString = utf8StringToString;
+exports.warn = warn;
+exports.unreachable = unreachable;
+
+/***/ }),
+/* 2 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+var globalScope = __w_pdfjs_require__(3);
+if (!globalScope._pdfjsCompatibilityChecked) {
+  globalScope._pdfjsCompatibilityChecked = true;
+  var isNodeJS = __w_pdfjs_require__(4);
+  var hasDOM = (typeof window === 'undefined' ? 'undefined' : _typeof(window)) === 'object' && (typeof document === 'undefined' ? 'undefined' : _typeof(document)) === 'object';
+  (function checkNodeBtoa() {
+    if (globalScope.btoa || !isNodeJS()) {
+      return;
+    }
+    globalScope.btoa = function (chars) {
+      return Buffer.from(chars, 'binary').toString('base64');
+    };
+  })();
+  (function checkNodeAtob() {
+    if (globalScope.atob || !isNodeJS()) {
+      return;
+    }
+    globalScope.atob = function (input) {
+      return Buffer.from(input, 'base64').toString('binary');
+    };
+  })();
+  (function checkCurrentScript() {
+    if (!hasDOM) {
+      return;
+    }
+    if ('currentScript' in document) {
+      return;
+    }
+    Object.defineProperty(document, 'currentScript', {
+      get: function get() {
+        var scripts = document.getElementsByTagName('script');
+        return scripts[scripts.length - 1];
+      },
+
+      enumerable: true,
+      configurable: true
+    });
+  })();
+  (function checkChildNodeRemove() {
+    if (!hasDOM) {
+      return;
+    }
+    if (typeof Element.prototype.remove !== 'undefined') {
+      return;
+    }
+    Element.prototype.remove = function () {
+      if (this.parentNode) {
+        this.parentNode.removeChild(this);
+      }
+    };
+  })();
+  (function checkDOMTokenListToggle() {
+    if (!hasDOM || isNodeJS()) {
+      return;
+    }
+    var div = document.createElement('div');
+    if (div.classList.toggle('test', 0) === false) {
+      return;
+    }
+    var originalDOMTokenListToggle = DOMTokenList.prototype.toggle;
+    DOMTokenList.prototype.toggle = function (token) {
+      if (arguments.length > 1) {
+        var force = !!arguments[1];
+        return this[force ? 'add' : 'remove'](token), force;
+      }
+      return originalDOMTokenListToggle(token);
+    };
+  })();
+  (function checkStringIncludes() {
+    if (String.prototype.includes) {
+      return;
+    }
+    __w_pdfjs_require__(5);
+  })();
+  (function checkArrayIncludes() {
+    if (Array.prototype.includes) {
+      return;
+    }
+    __w_pdfjs_require__(33);
+  })();
+  (function checkObjectAssign() {
+    if (Object.assign) {
+      return;
+    }
+    __w_pdfjs_require__(42);
+  })();
+  (function checkMathLog2() {
+    if (Math.log2) {
+      return;
+    }
+    Math.log2 = __w_pdfjs_require__(52);
+  })();
+  (function checkNumberIsNaN() {
+    if (Number.isNaN) {
+      return;
+    }
+    Number.isNaN = __w_pdfjs_require__(54);
+  })();
+  (function checkNumberIsInteger() {
+    if (Number.isInteger) {
+      return;
+    }
+    Number.isInteger = __w_pdfjs_require__(56);
+  })();
+  (function checkPromise() {
+    if (globalScope.Promise) {
+      return;
+    }
+    globalScope.Promise = __w_pdfjs_require__(59);
+  })();
+  (function checkWeakMap() {
+    if (globalScope.WeakMap) {
+      return;
+    }
+    globalScope.WeakMap = __w_pdfjs_require__(94);
+  })();
+  (function checkStringCodePointAt() {
+    if (String.codePointAt) {
+      return;
+    }
+    String.codePointAt = __w_pdfjs_require__(111);
+  })();
+  (function checkStringFromCodePoint() {
+    if (String.fromCodePoint) {
+      return;
+    }
+    String.fromCodePoint = __w_pdfjs_require__(113);
+  })();
+  (function checkSymbol() {
+    if (globalScope.Symbol) {
+      return;
+    }
+    __w_pdfjs_require__(115);
+  })();
+  (function checkObjectValues() {
+    if (Object.values) {
+      return;
+    }
+    Object.values = __w_pdfjs_require__(122);
+  })();
+}
+
+/***/ }),
+/* 3 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+module.exports = typeof window !== 'undefined' && window.Math === Math ? window : typeof global !== 'undefined' && global.Math === Math ? global : typeof self !== 'undefined' && self.Math === Math ? self : {};
+
+/***/ }),
+/* 4 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+module.exports = function isNodeJS() {
+  return (typeof process === 'undefined' ? 'undefined' : _typeof(process)) === 'object' && process + '' === '[object process]';
+};
+
+/***/ }),
+/* 5 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+__w_pdfjs_require__(6);
+module.exports = __w_pdfjs_require__(9).String.includes;
+
+/***/ }),
+/* 6 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var $export = __w_pdfjs_require__(7);
+var context = __w_pdfjs_require__(25);
+var INCLUDES = 'includes';
+$export($export.P + $export.F * __w_pdfjs_require__(32)(INCLUDES), 'String', {
+  includes: function includes(searchString) {
+    return !!~context(this, searchString, INCLUDES).indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);
+  }
+});
+
+/***/ }),
+/* 7 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var global = __w_pdfjs_require__(8);
+var core = __w_pdfjs_require__(9);
+var hide = __w_pdfjs_require__(10);
+var redefine = __w_pdfjs_require__(20);
+var ctx = __w_pdfjs_require__(23);
+var PROTOTYPE = 'prototype';
+var $export = function $export(type, name, source) {
+  var IS_FORCED = type & $export.F;
+  var IS_GLOBAL = type & $export.G;
+  var IS_STATIC = type & $export.S;
+  var IS_PROTO = type & $export.P;
+  var IS_BIND = type & $export.B;
+  var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE];
+  var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});
+  var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});
+  var key, own, out, exp;
+  if (IS_GLOBAL) source = name;
+  for (key in source) {
+    own = !IS_FORCED && target && target[key] !== undefined;
+    out = (own ? target : source)[key];
+    exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;
+    if (target) redefine(target, key, out, type & $export.U);
+    if (exports[key] != out) hide(exports, key, exp);
+    if (IS_PROTO && expProto[key] != out) expProto[key] = out;
+  }
+};
+global.core = core;
+$export.F = 1;
+$export.G = 2;
+$export.S = 4;
+$export.P = 8;
+$export.B = 16;
+$export.W = 32;
+$export.U = 64;
+$export.R = 128;
+module.exports = $export;
+
+/***/ }),
+/* 8 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var global = module.exports = typeof window != 'undefined' && window.Math == Math ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')();
+if (typeof __g == 'number') __g = global;
+
+/***/ }),
+/* 9 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var core = module.exports = { version: '2.5.7' };
+if (typeof __e == 'number') __e = core;
+
+/***/ }),
+/* 10 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var dP = __w_pdfjs_require__(11);
+var createDesc = __w_pdfjs_require__(19);
+module.exports = __w_pdfjs_require__(15) ? function (object, key, value) {
+  return dP.f(object, key, createDesc(1, value));
+} : function (object, key, value) {
+  object[key] = value;
+  return object;
+};
+
+/***/ }),
+/* 11 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var anObject = __w_pdfjs_require__(12);
+var IE8_DOM_DEFINE = __w_pdfjs_require__(14);
+var toPrimitive = __w_pdfjs_require__(18);
+var dP = Object.defineProperty;
+exports.f = __w_pdfjs_require__(15) ? Object.defineProperty : function defineProperty(O, P, Attributes) {
+  anObject(O);
+  P = toPrimitive(P, true);
+  anObject(Attributes);
+  if (IE8_DOM_DEFINE) try {
+    return dP(O, P, Attributes);
+  } catch (e) {}
+  if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');
+  if ('value' in Attributes) O[P] = Attributes.value;
+  return O;
+};
+
+/***/ }),
+/* 12 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var isObject = __w_pdfjs_require__(13);
+module.exports = function (it) {
+  if (!isObject(it)) throw TypeError(it + ' is not an object!');
+  return it;
+};
+
+/***/ }),
+/* 13 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+module.exports = function (it) {
+  return (typeof it === 'undefined' ? 'undefined' : _typeof(it)) === 'object' ? it !== null : typeof it === 'function';
+};
+
+/***/ }),
+/* 14 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+module.exports = !__w_pdfjs_require__(15) && !__w_pdfjs_require__(16)(function () {
+  return Object.defineProperty(__w_pdfjs_require__(17)('div'), 'a', {
+    get: function get() {
+      return 7;
+    }
+  }).a != 7;
+});
+
+/***/ }),
+/* 15 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+module.exports = !__w_pdfjs_require__(16)(function () {
+  return Object.defineProperty({}, 'a', {
+    get: function get() {
+      return 7;
+    }
+  }).a != 7;
+});
+
+/***/ }),
+/* 16 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+module.exports = function (exec) {
+  try {
+    return !!exec();
+  } catch (e) {
+    return true;
+  }
+};
+
+/***/ }),
+/* 17 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var isObject = __w_pdfjs_require__(13);
+var document = __w_pdfjs_require__(8).document;
+var is = isObject(document) && isObject(document.createElement);
+module.exports = function (it) {
+  return is ? document.createElement(it) : {};
+};
+
+/***/ }),
+/* 18 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var isObject = __w_pdfjs_require__(13);
+module.exports = function (it, S) {
+  if (!isObject(it)) return it;
+  var fn, val;
+  if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;
+  if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;
+  if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;
+  throw TypeError("Can't convert object to primitive value");
+};
+
+/***/ }),
+/* 19 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+module.exports = function (bitmap, value) {
+  return {
+    enumerable: !(bitmap & 1),
+    configurable: !(bitmap & 2),
+    writable: !(bitmap & 4),
+    value: value
+  };
+};
+
+/***/ }),
+/* 20 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var global = __w_pdfjs_require__(8);
+var hide = __w_pdfjs_require__(10);
+var has = __w_pdfjs_require__(21);
+var SRC = __w_pdfjs_require__(22)('src');
+var TO_STRING = 'toString';
+var $toString = Function[TO_STRING];
+var TPL = ('' + $toString).split(TO_STRING);
+__w_pdfjs_require__(9).inspectSource = function (it) {
+  return $toString.call(it);
+};
+(module.exports = function (O, key, val, safe) {
+  var isFunction = typeof val == 'function';
+  if (isFunction) has(val, 'name') || hide(val, 'name', key);
+  if (O[key] === val) return;
+  if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));
+  if (O === global) {
+    O[key] = val;
+  } else if (!safe) {
+    delete O[key];
+    hide(O, key, val);
+  } else if (O[key]) {
+    O[key] = val;
+  } else {
+    hide(O, key, val);
+  }
+})(Function.prototype, TO_STRING, function toString() {
+  return typeof this == 'function' && this[SRC] || $toString.call(this);
+});
+
+/***/ }),
+/* 21 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var hasOwnProperty = {}.hasOwnProperty;
+module.exports = function (it, key) {
+  return hasOwnProperty.call(it, key);
+};
+
+/***/ }),
+/* 22 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var id = 0;
+var px = Math.random();
+module.exports = function (key) {
+  return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));
+};
+
+/***/ }),
+/* 23 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var aFunction = __w_pdfjs_require__(24);
+module.exports = function (fn, that, length) {
+  aFunction(fn);
+  if (that === undefined) return fn;
+  switch (length) {
+    case 1:
+      return function (a) {
+        return fn.call(that, a);
+      };
+    case 2:
+      return function (a, b) {
+        return fn.call(that, a, b);
+      };
+    case 3:
+      return function (a, b, c) {
+        return fn.call(that, a, b, c);
+      };
+  }
+  return function () {
+    return fn.apply(that, arguments);
+  };
+};
+
+/***/ }),
+/* 24 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+module.exports = function (it) {
+  if (typeof it != 'function') throw TypeError(it + ' is not a function!');
+  return it;
+};
+
+/***/ }),
+/* 25 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var isRegExp = __w_pdfjs_require__(26);
+var defined = __w_pdfjs_require__(31);
+module.exports = function (that, searchString, NAME) {
+  if (isRegExp(searchString)) throw TypeError('String#' + NAME + " doesn't accept regex!");
+  return String(defined(that));
+};
+
+/***/ }),
+/* 26 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var isObject = __w_pdfjs_require__(13);
+var cof = __w_pdfjs_require__(27);
+var MATCH = __w_pdfjs_require__(28)('match');
+module.exports = function (it) {
+  var isRegExp;
+  return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp');
+};
+
+/***/ }),
+/* 27 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var toString = {}.toString;
+module.exports = function (it) {
+  return toString.call(it).slice(8, -1);
+};
+
+/***/ }),
+/* 28 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var store = __w_pdfjs_require__(29)('wks');
+var uid = __w_pdfjs_require__(22);
+var _Symbol = __w_pdfjs_require__(8).Symbol;
+var USE_SYMBOL = typeof _Symbol == 'function';
+var $exports = module.exports = function (name) {
+  return store[name] || (store[name] = USE_SYMBOL && _Symbol[name] || (USE_SYMBOL ? _Symbol : uid)('Symbol.' + name));
+};
+$exports.store = store;
+
+/***/ }),
+/* 29 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var core = __w_pdfjs_require__(9);
+var global = __w_pdfjs_require__(8);
+var SHARED = '__core-js_shared__';
+var store = global[SHARED] || (global[SHARED] = {});
+(module.exports = function (key, value) {
+  return store[key] || (store[key] = value !== undefined ? value : {});
+})('versions', []).push({
+  version: core.version,
+  mode: __w_pdfjs_require__(30) ? 'pure' : 'global',
+  copyright: '漏 2018 Denis Pushkarev (zloirock.ru)'
+});
+
+/***/ }),
+/* 30 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+module.exports = false;
+
+/***/ }),
+/* 31 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+module.exports = function (it) {
+  if (it == undefined) throw TypeError("Can't call method on  " + it);
+  return it;
+};
+
+/***/ }),
+/* 32 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var MATCH = __w_pdfjs_require__(28)('match');
+module.exports = function (KEY) {
+  var re = /./;
+  try {
+    '/./'[KEY](re);
+  } catch (e) {
+    try {
+      re[MATCH] = false;
+      return !'/./'[KEY](re);
+    } catch (f) {}
+  }
+  return true;
+};
+
+/***/ }),
+/* 33 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+__w_pdfjs_require__(34);
+module.exports = __w_pdfjs_require__(9).Array.includes;
+
+/***/ }),
+/* 34 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var $export = __w_pdfjs_require__(7);
+var $includes = __w_pdfjs_require__(35)(true);
+$export($export.P, 'Array', {
+  includes: function includes(el) {
+    return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);
+  }
+});
+__w_pdfjs_require__(41)('includes');
+
+/***/ }),
+/* 35 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var toIObject = __w_pdfjs_require__(36);
+var toLength = __w_pdfjs_require__(38);
+var toAbsoluteIndex = __w_pdfjs_require__(40);
+module.exports = function (IS_INCLUDES) {
+  return function ($this, el, fromIndex) {
+    var O = toIObject($this);
+    var length = toLength(O.length);
+    var index = toAbsoluteIndex(fromIndex, length);
+    var value;
+    if (IS_INCLUDES && el != el) while (length > index) {
+      value = O[index++];
+      if (value != value) return true;
+    } else for (; length > index; index++) {
+      if (IS_INCLUDES || index in O) {
+        if (O[index] === el) return IS_INCLUDES || index || 0;
+      }
+    }return !IS_INCLUDES && -1;
+  };
+};
+
+/***/ }),
+/* 36 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var IObject = __w_pdfjs_require__(37);
+var defined = __w_pdfjs_require__(31);
+module.exports = function (it) {
+  return IObject(defined(it));
+};
+
+/***/ }),
+/* 37 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var cof = __w_pdfjs_require__(27);
+module.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {
+  return cof(it) == 'String' ? it.split('') : Object(it);
+};
+
+/***/ }),
+/* 38 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var toInteger = __w_pdfjs_require__(39);
+var min = Math.min;
+module.exports = function (it) {
+  return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0;
+};
+
+/***/ }),
+/* 39 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var ceil = Math.ceil;
+var floor = Math.floor;
+module.exports = function (it) {
+  return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);
+};
+
+/***/ }),
+/* 40 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var toInteger = __w_pdfjs_require__(39);
+var max = Math.max;
+var min = Math.min;
+module.exports = function (index, length) {
+  index = toInteger(index);
+  return index < 0 ? max(index + length, 0) : min(index, length);
+};
+
+/***/ }),
+/* 41 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var UNSCOPABLES = __w_pdfjs_require__(28)('unscopables');
+var ArrayProto = Array.prototype;
+if (ArrayProto[UNSCOPABLES] == undefined) __w_pdfjs_require__(10)(ArrayProto, UNSCOPABLES, {});
+module.exports = function (key) {
+  ArrayProto[UNSCOPABLES][key] = true;
+};
+
+/***/ }),
+/* 42 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+__w_pdfjs_require__(43);
+module.exports = __w_pdfjs_require__(9).Object.assign;
+
+/***/ }),
+/* 43 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var $export = __w_pdfjs_require__(7);
+$export($export.S + $export.F, 'Object', { assign: __w_pdfjs_require__(44) });
+
+/***/ }),
+/* 44 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var getKeys = __w_pdfjs_require__(45);
+var gOPS = __w_pdfjs_require__(49);
+var pIE = __w_pdfjs_require__(50);
+var toObject = __w_pdfjs_require__(51);
+var IObject = __w_pdfjs_require__(37);
+var $assign = Object.assign;
+module.exports = !$assign || __w_pdfjs_require__(16)(function () {
+  var A = {};
+  var B = {};
+  var S = Symbol();
+  var K = 'abcdefghijklmnopqrst';
+  A[S] = 7;
+  K.split('').forEach(function (k) {
+    B[k] = k;
+  });
+  return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;
+}) ? function assign(target, source) {
+  var T = toObject(target);
+  var aLen = arguments.length;
+  var index = 1;
+  var getSymbols = gOPS.f;
+  var isEnum = pIE.f;
+  while (aLen > index) {
+    var S = IObject(arguments[index++]);
+    var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S);
+    var length = keys.length;
+    var j = 0;
+    var key;
+    while (length > j) {
+      if (isEnum.call(S, key = keys[j++])) T[key] = S[key];
+    }
+  }
+  return T;
+} : $assign;
+
+/***/ }),
+/* 45 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var $keys = __w_pdfjs_require__(46);
+var enumBugKeys = __w_pdfjs_require__(48);
+module.exports = Object.keys || function keys(O) {
+  return $keys(O, enumBugKeys);
+};
+
+/***/ }),
+/* 46 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var has = __w_pdfjs_require__(21);
+var toIObject = __w_pdfjs_require__(36);
+var arrayIndexOf = __w_pdfjs_require__(35)(false);
+var IE_PROTO = __w_pdfjs_require__(47)('IE_PROTO');
+module.exports = function (object, names) {
+  var O = toIObject(object);
+  var i = 0;
+  var result = [];
+  var key;
+  for (key in O) {
+    if (key != IE_PROTO) has(O, key) && result.push(key);
+  }while (names.length > i) {
+    if (has(O, key = names[i++])) {
+      ~arrayIndexOf(result, key) || result.push(key);
+    }
+  }return result;
+};
+
+/***/ }),
+/* 47 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var shared = __w_pdfjs_require__(29)('keys');
+var uid = __w_pdfjs_require__(22);
+module.exports = function (key) {
+  return shared[key] || (shared[key] = uid(key));
+};
+
+/***/ }),
+/* 48 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+module.exports = 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'.split(',');
+
+/***/ }),
+/* 49 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+exports.f = Object.getOwnPropertySymbols;
+
+/***/ }),
+/* 50 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+exports.f = {}.propertyIsEnumerable;
+
+/***/ }),
+/* 51 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var defined = __w_pdfjs_require__(31);
+module.exports = function (it) {
+  return Object(defined(it));
+};
+
+/***/ }),
+/* 52 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+__w_pdfjs_require__(53);
+module.exports = __w_pdfjs_require__(9).Math.log2;
+
+/***/ }),
+/* 53 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var $export = __w_pdfjs_require__(7);
+$export($export.S, 'Math', {
+  log2: function log2(x) {
+    return Math.log(x) / Math.LN2;
+  }
+});
+
+/***/ }),
+/* 54 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+__w_pdfjs_require__(55);
+module.exports = __w_pdfjs_require__(9).Number.isNaN;
+
+/***/ }),
+/* 55 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var $export = __w_pdfjs_require__(7);
+$export($export.S, 'Number', {
+  isNaN: function isNaN(number) {
+    return number != number;
+  }
+});
+
+/***/ }),
+/* 56 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+__w_pdfjs_require__(57);
+module.exports = __w_pdfjs_require__(9).Number.isInteger;
+
+/***/ }),
+/* 57 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var $export = __w_pdfjs_require__(7);
+$export($export.S, 'Number', { isInteger: __w_pdfjs_require__(58) });
+
+/***/ }),
+/* 58 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var isObject = __w_pdfjs_require__(13);
+var floor = Math.floor;
+module.exports = function isInteger(it) {
+  return !isObject(it) && isFinite(it) && floor(it) === it;
+};
+
+/***/ }),
+/* 59 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+__w_pdfjs_require__(60);
+__w_pdfjs_require__(62);
+__w_pdfjs_require__(72);
+__w_pdfjs_require__(75);
+__w_pdfjs_require__(92);
+__w_pdfjs_require__(93);
+module.exports = __w_pdfjs_require__(9).Promise;
+
+/***/ }),
+/* 60 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var classof = __w_pdfjs_require__(61);
+var test = {};
+test[__w_pdfjs_require__(28)('toStringTag')] = 'z';
+if (test + '' != '[object z]') {
+  __w_pdfjs_require__(20)(Object.prototype, 'toString', function toString() {
+    return '[object ' + classof(this) + ']';
+  }, true);
+}
+
+/***/ }),
+/* 61 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var cof = __w_pdfjs_require__(27);
+var TAG = __w_pdfjs_require__(28)('toStringTag');
+var ARG = cof(function () {
+  return arguments;
+}()) == 'Arguments';
+var tryGet = function tryGet(it, key) {
+  try {
+    return it[key];
+  } catch (e) {}
+};
+module.exports = function (it) {
+  var O, T, B;
+  return it === undefined ? 'Undefined' : it === null ? 'Null' : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T : ARG ? cof(O) : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;
+};
+
+/***/ }),
+/* 62 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var $at = __w_pdfjs_require__(63)(true);
+__w_pdfjs_require__(64)(String, 'String', function (iterated) {
+  this._t = String(iterated);
+  this._i = 0;
+}, function () {
+  var O = this._t;
+  var index = this._i;
+  var point;
+  if (index >= O.length) return {
+    value: undefined,
+    done: true
+  };
+  point = $at(O, index);
+  this._i += point.length;
+  return {
+    value: point,
+    done: false
+  };
+});
+
+/***/ }),
+/* 63 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var toInteger = __w_pdfjs_require__(39);
+var defined = __w_pdfjs_require__(31);
+module.exports = function (TO_STRING) {
+  return function (that, pos) {
+    var s = String(defined(that));
+    var i = toInteger(pos);
+    var l = s.length;
+    var a, b;
+    if (i < 0 || i >= l) return TO_STRING ? '' : undefined;
+    a = s.charCodeAt(i);
+    return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff ? TO_STRING ? s.charAt(i) : a : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;
+  };
+};
+
+/***/ }),
+/* 64 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var LIBRARY = __w_pdfjs_require__(30);
+var $export = __w_pdfjs_require__(7);
+var redefine = __w_pdfjs_require__(20);
+var hide = __w_pdfjs_require__(10);
+var Iterators = __w_pdfjs_require__(65);
+var $iterCreate = __w_pdfjs_require__(66);
+var setToStringTag = __w_pdfjs_require__(70);
+var getPrototypeOf = __w_pdfjs_require__(71);
+var ITERATOR = __w_pdfjs_require__(28)('iterator');
+var BUGGY = !([].keys && 'next' in [].keys());
+var FF_ITERATOR = '@@iterator';
+var KEYS = 'keys';
+var VALUES = 'values';
+var returnThis = function returnThis() {
+  return this;
+};
+module.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {
+  $iterCreate(Constructor, NAME, next);
+  var getMethod = function getMethod(kind) {
+    if (!BUGGY && kind in proto) return proto[kind];
+    switch (kind) {
+      case KEYS:
+        return function keys() {
+          return new Constructor(this, kind);
+        };
+      case VALUES:
+        return function values() {
+          return new Constructor(this, kind);
+        };
+    }
+    return function entries() {
+      return new Constructor(this, kind);
+    };
+  };
+  var TAG = NAME + ' Iterator';
+  var DEF_VALUES = DEFAULT == VALUES;
+  var VALUES_BUG = false;
+  var proto = Base.prototype;
+  var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];
+  var $default = $native || getMethod(DEFAULT);
+  var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;
+  var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;
+  var methods, key, IteratorPrototype;
+  if ($anyNative) {
+    IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));
+    if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {
+      setToStringTag(IteratorPrototype, TAG, true);
+      if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);
+    }
+  }
+  if (DEF_VALUES && $native && $native.name !== VALUES) {
+    VALUES_BUG = true;
+    $default = function values() {
+      return $native.call(this);
+    };
+  }
+  if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {
+    hide(proto, ITERATOR, $default);
+  }
+  Iterators[NAME] = $default;
+  Iterators[TAG] = returnThis;
+  if (DEFAULT) {
+    methods = {
+      values: DEF_VALUES ? $default : getMethod(VALUES),
+      keys: IS_SET ? $default : getMethod(KEYS),
+      entries: $entries
+    };
+    if (FORCED) for (key in methods) {
+      if (!(key in proto)) redefine(proto, key, methods[key]);
+    } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);
+  }
+  return methods;
+};
+
+/***/ }),
+/* 65 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+module.exports = {};
+
+/***/ }),
+/* 66 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var create = __w_pdfjs_require__(67);
+var descriptor = __w_pdfjs_require__(19);
+var setToStringTag = __w_pdfjs_require__(70);
+var IteratorPrototype = {};
+__w_pdfjs_require__(10)(IteratorPrototype, __w_pdfjs_require__(28)('iterator'), function () {
+  return this;
+});
+module.exports = function (Constructor, NAME, next) {
+  Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });
+  setToStringTag(Constructor, NAME + ' Iterator');
+};
+
+/***/ }),
+/* 67 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var anObject = __w_pdfjs_require__(12);
+var dPs = __w_pdfjs_require__(68);
+var enumBugKeys = __w_pdfjs_require__(48);
+var IE_PROTO = __w_pdfjs_require__(47)('IE_PROTO');
+var Empty = function Empty() {};
+var PROTOTYPE = 'prototype';
+var _createDict = function createDict() {
+  var iframe = __w_pdfjs_require__(17)('iframe');
+  var i = enumBugKeys.length;
+  var lt = '<';
+  var gt = '>';
+  var iframeDocument;
+  iframe.style.display = 'none';
+  __w_pdfjs_require__(69).appendChild(iframe);
+  iframe.src = 'javascript:';
+  iframeDocument = iframe.contentWindow.document;
+  iframeDocument.open();
+  iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);
+  iframeDocument.close();
+  _createDict = iframeDocument.F;
+  while (i--) {
+    delete _createDict[PROTOTYPE][enumBugKeys[i]];
+  }return _createDict();
+};
+module.exports = Object.create || function create(O, Properties) {
+  var result;
+  if (O !== null) {
+    Empty[PROTOTYPE] = anObject(O);
+    result = new Empty();
+    Empty[PROTOTYPE] = null;
+    result[IE_PROTO] = O;
+  } else result = _createDict();
+  return Properties === undefined ? result : dPs(result, Properties);
+};
+
+/***/ }),
+/* 68 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var dP = __w_pdfjs_require__(11);
+var anObject = __w_pdfjs_require__(12);
+var getKeys = __w_pdfjs_require__(45);
+module.exports = __w_pdfjs_require__(15) ? Object.defineProperties : function defineProperties(O, Properties) {
+  anObject(O);
+  var keys = getKeys(Properties);
+  var length = keys.length;
+  var i = 0;
+  var P;
+  while (length > i) {
+    dP.f(O, P = keys[i++], Properties[P]);
+  }return O;
+};
+
+/***/ }),
+/* 69 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var document = __w_pdfjs_require__(8).document;
+module.exports = document && document.documentElement;
+
+/***/ }),
+/* 70 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var def = __w_pdfjs_require__(11).f;
+var has = __w_pdfjs_require__(21);
+var TAG = __w_pdfjs_require__(28)('toStringTag');
+module.exports = function (it, tag, stat) {
+  if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, {
+    configurable: true,
+    value: tag
+  });
+};
+
+/***/ }),
+/* 71 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var has = __w_pdfjs_require__(21);
+var toObject = __w_pdfjs_require__(51);
+var IE_PROTO = __w_pdfjs_require__(47)('IE_PROTO');
+var ObjectProto = Object.prototype;
+module.exports = Object.getPrototypeOf || function (O) {
+  O = toObject(O);
+  if (has(O, IE_PROTO)) return O[IE_PROTO];
+  if (typeof O.constructor == 'function' && O instanceof O.constructor) {
+    return O.constructor.prototype;
+  }
+  return O instanceof Object ? ObjectProto : null;
+};
+
+/***/ }),
+/* 72 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var $iterators = __w_pdfjs_require__(73);
+var getKeys = __w_pdfjs_require__(45);
+var redefine = __w_pdfjs_require__(20);
+var global = __w_pdfjs_require__(8);
+var hide = __w_pdfjs_require__(10);
+var Iterators = __w_pdfjs_require__(65);
+var wks = __w_pdfjs_require__(28);
+var ITERATOR = wks('iterator');
+var TO_STRING_TAG = wks('toStringTag');
+var ArrayValues = Iterators.Array;
+var DOMIterables = {
+  CSSRuleList: true,
+  CSSStyleDeclaration: false,
+  CSSValueList: false,
+  ClientRectList: false,
+  DOMRectList: false,
+  DOMStringList: false,
+  DOMTokenList: true,
+  DataTransferItemList: false,
+  FileList: false,
+  HTMLAllCollection: false,
+  HTMLCollection: false,
+  HTMLFormElement: false,
+  HTMLSelectElement: false,
+  MediaList: true,
+  MimeTypeArray: false,
+  NamedNodeMap: false,
+  NodeList: true,
+  PaintRequestList: false,
+  Plugin: false,
+  PluginArray: false,
+  SVGLengthList: false,
+  SVGNumberList: false,
+  SVGPathSegList: false,
+  SVGPointList: false,
+  SVGStringList: false,
+  SVGTransformList: false,
+  SourceBufferList: false,
+  StyleSheetList: true,
+  TextTrackCueList: false,
+  TextTrackList: false,
+  TouchList: false
+};
+for (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) {
+  var NAME = collections[i];
+  var explicit = DOMIterables[NAME];
+  var Collection = global[NAME];
+  var proto = Collection && Collection.prototype;
+  var key;
+  if (proto) {
+    if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues);
+    if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);
+    Iterators[NAME] = ArrayValues;
+    if (explicit) for (key in $iterators) {
+      if (!proto[key]) redefine(proto, key, $iterators[key], true);
+    }
+  }
+}
+
+/***/ }),
+/* 73 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var addToUnscopables = __w_pdfjs_require__(41);
+var step = __w_pdfjs_require__(74);
+var Iterators = __w_pdfjs_require__(65);
+var toIObject = __w_pdfjs_require__(36);
+module.exports = __w_pdfjs_require__(64)(Array, 'Array', function (iterated, kind) {
+  this._t = toIObject(iterated);
+  this._i = 0;
+  this._k = kind;
+}, function () {
+  var O = this._t;
+  var kind = this._k;
+  var index = this._i++;
+  if (!O || index >= O.length) {
+    this._t = undefined;
+    return step(1);
+  }
+  if (kind == 'keys') return step(0, index);
+  if (kind == 'values') return step(0, O[index]);
+  return step(0, [index, O[index]]);
+}, 'values');
+Iterators.Arguments = Iterators.Array;
+addToUnscopables('keys');
+addToUnscopables('values');
+addToUnscopables('entries');
+
+/***/ }),
+/* 74 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+module.exports = function (done, value) {
+  return {
+    value: value,
+    done: !!done
+  };
+};
+
+/***/ }),
+/* 75 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var LIBRARY = __w_pdfjs_require__(30);
+var global = __w_pdfjs_require__(8);
+var ctx = __w_pdfjs_require__(23);
+var classof = __w_pdfjs_require__(61);
+var $export = __w_pdfjs_require__(7);
+var isObject = __w_pdfjs_require__(13);
+var aFunction = __w_pdfjs_require__(24);
+var anInstance = __w_pdfjs_require__(76);
+var forOf = __w_pdfjs_require__(77);
+var speciesConstructor = __w_pdfjs_require__(81);
+var task = __w_pdfjs_require__(82).set;
+var microtask = __w_pdfjs_require__(84)();
+var newPromiseCapabilityModule = __w_pdfjs_require__(85);
+var perform = __w_pdfjs_require__(86);
+var userAgent = __w_pdfjs_require__(87);
+var promiseResolve = __w_pdfjs_require__(88);
+var PROMISE = 'Promise';
+var TypeError = global.TypeError;
+var process = global.process;
+var versions = process && process.versions;
+var v8 = versions && versions.v8 || '';
+var $Promise = global[PROMISE];
+var isNode = classof(process) == 'process';
+var empty = function empty() {};
+var Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;
+var newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f;
+var USE_NATIVE = !!function () {
+  try {
+    var promise = $Promise.resolve(1);
+    var FakePromise = (promise.constructor = {})[__w_pdfjs_require__(28)('species')] = function (exec) {
+      exec(empty, empty);
+    };
+    return (isNode || typeof PromiseRejectionEvent == 'function') && promise.then(empty) instanceof FakePromise && v8.indexOf('6.6') !== 0 && userAgent.indexOf('Chrome/66') === -1;
+  } catch (e) {}
+}();
+var isThenable = function isThenable(it) {
+  var then;
+  return isObject(it) && typeof (then = it.then) == 'function' ? then : false;
+};
+var notify = function notify(promise, isReject) {
+  if (promise._n) return;
+  promise._n = true;
+  var chain = promise._c;
+  microtask(function () {
+    var value = promise._v;
+    var ok = promise._s == 1;
+    var i = 0;
+    var run = function run(reaction) {
+      var handler = ok ? reaction.ok : reaction.fail;
+      var resolve = reaction.resolve;
+      var reject = reaction.reject;
+      var domain = reaction.domain;
+      var result, then, exited;
+      try {
+        if (handler) {
+          if (!ok) {
+            if (promise._h == 2) onHandleUnhandled(promise);
+            promise._h = 1;
+          }
+          if (handler === true) result = value;else {
+            if (domain) domain.enter();
+            result = handler(value);
+            if (domain) {
+              domain.exit();
+              exited = true;
+            }
+          }
+          if (result === reaction.promise) {
+            reject(TypeError('Promise-chain cycle'));
+          } else if (then = isThenable(result)) {
+            then.call(result, resolve, reject);
+          } else resolve(result);
+        } else reject(value);
+      } catch (e) {
+        if (domain && !exited) domain.exit();
+        reject(e);
+      }
+    };
+    while (chain.length > i) {
+      run(chain[i++]);
+    }promise._c = [];
+    promise._n = false;
+    if (isReject && !promise._h) onUnhandled(promise);
+  });
+};
+var onUnhandled = function onUnhandled(promise) {
+  task.call(global, function () {
+    var value = promise._v;
+    var unhandled = isUnhandled(promise);
+    var result, handler, console;
+    if (unhandled) {
+      result = perform(function () {
+        if (isNode) {
+          process.emit('unhandledRejection', value, promise);
+        } else if (handler = global.onunhandledrejection) {
+          handler({
+            promise: promise,
+            reason: value
+          });
+        } else if ((console = global.console) && console.error) {
+          console.error('Unhandled promise rejection', value);
+        }
+      });
+      promise._h = isNode || isUnhandled(promise) ? 2 : 1;
+    }
+    promise._a = undefined;
+    if (unhandled && result.e) throw result.v;
+  });
+};
+var isUnhandled = function isUnhandled(promise) {
+  return promise._h !== 1 && (promise._a || promise._c).length === 0;
+};
+var onHandleUnhandled = function onHandleUnhandled(promise) {
+  task.call(global, function () {
+    var handler;
+    if (isNode) {
+      process.emit('rejectionHandled', promise);
+    } else if (handler = global.onrejectionhandled) {
+      handler({
+        promise: promise,
+        reason: promise._v
+      });
+    }
+  });
+};
+var $reject = function $reject(value) {
+  var promise = this;
+  if (promise._d) return;
+  promise._d = true;
+  promise = promise._w || promise;
+  promise._v = value;
+  promise._s = 2;
+  if (!promise._a) promise._a = promise._c.slice();
+  notify(promise, true);
+};
+var $resolve = function $resolve(value) {
+  var promise = this;
+  var then;
+  if (promise._d) return;
+  promise._d = true;
+  promise = promise._w || promise;
+  try {
+    if (promise === value) throw TypeError("Promise can't be resolved itself");
+    if (then = isThenable(value)) {
+      microtask(function () {
+        var wrapper = {
+          _w: promise,
+          _d: false
+        };
+        try {
+          then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));
+        } catch (e) {
+          $reject.call(wrapper, e);
+        }
+      });
+    } else {
+      promise._v = value;
+      promise._s = 1;
+      notify(promise, false);
+    }
+  } catch (e) {
+    $reject.call({
+      _w: promise,
+      _d: false
+    }, e);
+  }
+};
+if (!USE_NATIVE) {
+  $Promise = function Promise(executor) {
+    anInstance(this, $Promise, PROMISE, '_h');
+    aFunction(executor);
+    Internal.call(this);
+    try {
+      executor(ctx($resolve, this, 1), ctx($reject, this, 1));
+    } catch (err) {
+      $reject.call(this, err);
+    }
+  };
+  Internal = function Promise(executor) {
+    this._c = [];
+    this._a = undefined;
+    this._s = 0;
+    this._d = false;
+    this._v = undefined;
+    this._h = 0;
+    this._n = false;
+  };
+  Internal.prototype = __w_pdfjs_require__(89)($Promise.prototype, {
+    then: function then(onFulfilled, onRejected) {
+      var reaction = newPromiseCapability(speciesConstructor(this, $Promise));
+      reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;
+      reaction.fail = typeof onRejected == 'function' && onRejected;
+      reaction.domain = isNode ? process.domain : undefined;
+      this._c.push(reaction);
+      if (this._a) this._a.push(reaction);
+      if (this._s) notify(this, false);
+      return reaction.promise;
+    },
+    'catch': function _catch(onRejected) {
+      return this.then(undefined, onRejected);
+    }
+  });
+  OwnPromiseCapability = function OwnPromiseCapability() {
+    var promise = new Internal();
+    this.promise = promise;
+    this.resolve = ctx($resolve, promise, 1);
+    this.reject = ctx($reject, promise, 1);
+  };
+  newPromiseCapabilityModule.f = newPromiseCapability = function newPromiseCapability(C) {
+    return C === $Promise || C === Wrapper ? new OwnPromiseCapability(C) : newGenericPromiseCapability(C);
+  };
+}
+$export($export.G + $export.W + $export.F * !USE_NATIVE, { Promise: $Promise });
+__w_pdfjs_require__(70)($Promise, PROMISE);
+__w_pdfjs_require__(90)(PROMISE);
+Wrapper = __w_pdfjs_require__(9)[PROMISE];
+$export($export.S + $export.F * !USE_NATIVE, PROMISE, {
+  reject: function reject(r) {
+    var capability = newPromiseCapability(this);
+    var $$reject = capability.reject;
+    $$reject(r);
+    return capability.promise;
+  }
+});
+$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, {
+  resolve: function resolve(x) {
+    return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x);
+  }
+});
+$export($export.S + $export.F * !(USE_NATIVE && __w_pdfjs_require__(91)(function (iter) {
+  $Promise.all(iter)['catch'](empty);
+})), PROMISE, {
+  all: function all(iterable) {
+    var C = this;
+    var capability = newPromiseCapability(C);
+    var resolve = capability.resolve;
+    var reject = capability.reject;
+    var result = perform(function () {
+      var values = [];
+      var index = 0;
+      var remaining = 1;
+      forOf(iterable, false, function (promise) {
+        var $index = index++;
+        var alreadyCalled = false;
+        values.push(undefined);
+        remaining++;
+        C.resolve(promise).then(function (value) {
+          if (alreadyCalled) return;
+          alreadyCalled = true;
+          values[$index] = value;
+          --remaining || resolve(values);
+        }, reject);
+      });
+      --remaining || resolve(values);
+    });
+    if (result.e) reject(result.v);
+    return capability.promise;
+  },
+  race: function race(iterable) {
+    var C = this;
+    var capability = newPromiseCapability(C);
+    var reject = capability.reject;
+    var result = perform(function () {
+      forOf(iterable, false, function (promise) {
+        C.resolve(promise).then(capability.resolve, reject);
+      });
+    });
+    if (result.e) reject(result.v);
+    return capability.promise;
+  }
+});
+
+/***/ }),
+/* 76 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+module.exports = function (it, Constructor, name, forbiddenField) {
+  if (!(it instanceof Constructor) || forbiddenField !== undefined && forbiddenField in it) {
+    throw TypeError(name + ': incorrect invocation!');
+  }
+  return it;
+};
+
+/***/ }),
+/* 77 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var ctx = __w_pdfjs_require__(23);
+var call = __w_pdfjs_require__(78);
+var isArrayIter = __w_pdfjs_require__(79);
+var anObject = __w_pdfjs_require__(12);
+var toLength = __w_pdfjs_require__(38);
+var getIterFn = __w_pdfjs_require__(80);
+var BREAK = {};
+var RETURN = {};
+var _exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {
+  var iterFn = ITERATOR ? function () {
+    return iterable;
+  } : getIterFn(iterable);
+  var f = ctx(fn, that, entries ? 2 : 1);
+  var index = 0;
+  var length, step, iterator, result;
+  if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');
+  if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) {
+    result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);
+    if (result === BREAK || result === RETURN) return result;
+  } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {
+    result = call(iterator, f, step.value, entries);
+    if (result === BREAK || result === RETURN) return result;
+  }
+};
+_exports.BREAK = BREAK;
+_exports.RETURN = RETURN;
+
+/***/ }),
+/* 78 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var anObject = __w_pdfjs_require__(12);
+module.exports = function (iterator, fn, value, entries) {
+  try {
+    return entries ? fn(anObject(value)[0], value[1]) : fn(value);
+  } catch (e) {
+    var ret = iterator['return'];
+    if (ret !== undefined) anObject(ret.call(iterator));
+    throw e;
+  }
+};
+
+/***/ }),
+/* 79 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var Iterators = __w_pdfjs_require__(65);
+var ITERATOR = __w_pdfjs_require__(28)('iterator');
+var ArrayProto = Array.prototype;
+module.exports = function (it) {
+  return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);
+};
+
+/***/ }),
+/* 80 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var classof = __w_pdfjs_require__(61);
+var ITERATOR = __w_pdfjs_require__(28)('iterator');
+var Iterators = __w_pdfjs_require__(65);
+module.exports = __w_pdfjs_require__(9).getIteratorMethod = function (it) {
+  if (it != undefined) return it[ITERATOR] || it['@@iterator'] || Iterators[classof(it)];
+};
+
+/***/ }),
+/* 81 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var anObject = __w_pdfjs_require__(12);
+var aFunction = __w_pdfjs_require__(24);
+var SPECIES = __w_pdfjs_require__(28)('species');
+module.exports = function (O, D) {
+  var C = anObject(O).constructor;
+  var S;
+  return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);
+};
+
+/***/ }),
+/* 82 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var ctx = __w_pdfjs_require__(23);
+var invoke = __w_pdfjs_require__(83);
+var html = __w_pdfjs_require__(69);
+var cel = __w_pdfjs_require__(17);
+var global = __w_pdfjs_require__(8);
+var process = global.process;
+var setTask = global.setImmediate;
+var clearTask = global.clearImmediate;
+var MessageChannel = global.MessageChannel;
+var Dispatch = global.Dispatch;
+var counter = 0;
+var queue = {};
+var ONREADYSTATECHANGE = 'onreadystatechange';
+var defer, channel, port;
+var run = function run() {
+  var id = +this;
+  if (queue.hasOwnProperty(id)) {
+    var fn = queue[id];
+    delete queue[id];
+    fn();
+  }
+};
+var listener = function listener(event) {
+  run.call(event.data);
+};
+if (!setTask || !clearTask) {
+  setTask = function setImmediate(fn) {
+    var args = [];
+    var i = 1;
+    while (arguments.length > i) {
+      args.push(arguments[i++]);
+    }queue[++counter] = function () {
+      invoke(typeof fn == 'function' ? fn : Function(fn), args);
+    };
+    defer(counter);
+    return counter;
+  };
+  clearTask = function clearImmediate(id) {
+    delete queue[id];
+  };
+  if (__w_pdfjs_require__(27)(process) == 'process') {
+    defer = function defer(id) {
+      process.nextTick(ctx(run, id, 1));
+    };
+  } else if (Dispatch && Dispatch.now) {
+    defer = function defer(id) {
+      Dispatch.now(ctx(run, id, 1));
+    };
+  } else if (MessageChannel) {
+    channel = new MessageChannel();
+    port = channel.port2;
+    channel.port1.onmessage = listener;
+    defer = ctx(port.postMessage, port, 1);
+  } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) {
+    defer = function defer(id) {
+      global.postMessage(id + '', '*');
+    };
+    global.addEventListener('message', listener, false);
+  } else if (ONREADYSTATECHANGE in cel('script')) {
+    defer = function defer(id) {
+      html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () {
+        html.removeChild(this);
+        run.call(id);
+      };
+    };
+  } else {
+    defer = function defer(id) {
+      setTimeout(ctx(run, id, 1), 0);
+    };
+  }
+}
+module.exports = {
+  set: setTask,
+  clear: clearTask
+};
+
+/***/ }),
+/* 83 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+module.exports = function (fn, args, that) {
+  var un = that === undefined;
+  switch (args.length) {
+    case 0:
+      return un ? fn() : fn.call(that);
+    case 1:
+      return un ? fn(args[0]) : fn.call(that, args[0]);
+    case 2:
+      return un ? fn(args[0], args[1]) : fn.call(that, args[0], args[1]);
+    case 3:
+      return un ? fn(args[0], args[1], args[2]) : fn.call(that, args[0], args[1], args[2]);
+    case 4:
+      return un ? fn(args[0], args[1], args[2], args[3]) : fn.call(that, args[0], args[1], args[2], args[3]);
+  }
+  return fn.apply(that, args);
+};
+
+/***/ }),
+/* 84 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var global = __w_pdfjs_require__(8);
+var macrotask = __w_pdfjs_require__(82).set;
+var Observer = global.MutationObserver || global.WebKitMutationObserver;
+var process = global.process;
+var Promise = global.Promise;
+var isNode = __w_pdfjs_require__(27)(process) == 'process';
+module.exports = function () {
+  var head, last, notify;
+  var flush = function flush() {
+    var parent, fn;
+    if (isNode && (parent = process.domain)) parent.exit();
+    while (head) {
+      fn = head.fn;
+      head = head.next;
+      try {
+        fn();
+      } catch (e) {
+        if (head) notify();else last = undefined;
+        throw e;
+      }
+    }
+    last = undefined;
+    if (parent) parent.enter();
+  };
+  if (isNode) {
+    notify = function notify() {
+      process.nextTick(flush);
+    };
+  } else if (Observer && !(global.navigator && global.navigator.standalone)) {
+    var toggle = true;
+    var node = document.createTextNode('');
+    new Observer(flush).observe(node, { characterData: true });
+    notify = function notify() {
+      node.data = toggle = !toggle;
+    };
+  } else if (Promise && Promise.resolve) {
+    var promise = Promise.resolve(undefined);
+    notify = function notify() {
+      promise.then(flush);
+    };
+  } else {
+    notify = function notify() {
+      macrotask.call(global, flush);
+    };
+  }
+  return function (fn) {
+    var task = {
+      fn: fn,
+      next: undefined
+    };
+    if (last) last.next = task;
+    if (!head) {
+      head = task;
+      notify();
+    }
+    last = task;
+  };
+};
+
+/***/ }),
+/* 85 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var aFunction = __w_pdfjs_require__(24);
+function PromiseCapability(C) {
+  var resolve, reject;
+  this.promise = new C(function ($$resolve, $$reject) {
+    if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');
+    resolve = $$resolve;
+    reject = $$reject;
+  });
+  this.resolve = aFunction(resolve);
+  this.reject = aFunction(reject);
+}
+module.exports.f = function (C) {
+  return new PromiseCapability(C);
+};
+
+/***/ }),
+/* 86 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+module.exports = function (exec) {
+  try {
+    return {
+      e: false,
+      v: exec()
+    };
+  } catch (e) {
+    return {
+      e: true,
+      v: e
+    };
+  }
+};
+
+/***/ }),
+/* 87 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var global = __w_pdfjs_require__(8);
+var navigator = global.navigator;
+module.exports = navigator && navigator.userAgent || '';
+
+/***/ }),
+/* 88 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var anObject = __w_pdfjs_require__(12);
+var isObject = __w_pdfjs_require__(13);
+var newPromiseCapability = __w_pdfjs_require__(85);
+module.exports = function (C, x) {
+  anObject(C);
+  if (isObject(x) && x.constructor === C) return x;
+  var promiseCapability = newPromiseCapability.f(C);
+  var resolve = promiseCapability.resolve;
+  resolve(x);
+  return promiseCapability.promise;
+};
+
+/***/ }),
+/* 89 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var redefine = __w_pdfjs_require__(20);
+module.exports = function (target, src, safe) {
+  for (var key in src) {
+    redefine(target, key, src[key], safe);
+  }return target;
+};
+
+/***/ }),
+/* 90 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var global = __w_pdfjs_require__(8);
+var dP = __w_pdfjs_require__(11);
+var DESCRIPTORS = __w_pdfjs_require__(15);
+var SPECIES = __w_pdfjs_require__(28)('species');
+module.exports = function (KEY) {
+  var C = global[KEY];
+  if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, {
+    configurable: true,
+    get: function get() {
+      return this;
+    }
+  });
+};
+
+/***/ }),
+/* 91 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var ITERATOR = __w_pdfjs_require__(28)('iterator');
+var SAFE_CLOSING = false;
+try {
+  var riter = [7][ITERATOR]();
+  riter['return'] = function () {
+    SAFE_CLOSING = true;
+  };
+  Array.from(riter, function () {
+    throw 2;
+  });
+} catch (e) {}
+module.exports = function (exec, skipClosing) {
+  if (!skipClosing && !SAFE_CLOSING) return false;
+  var safe = false;
+  try {
+    var arr = [7];
+    var iter = arr[ITERATOR]();
+    iter.next = function () {
+      return { done: safe = true };
+    };
+    arr[ITERATOR] = function () {
+      return iter;
+    };
+    exec(arr);
+  } catch (e) {}
+  return safe;
+};
+
+/***/ }),
+/* 92 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var $export = __w_pdfjs_require__(7);
+var core = __w_pdfjs_require__(9);
+var global = __w_pdfjs_require__(8);
+var speciesConstructor = __w_pdfjs_require__(81);
+var promiseResolve = __w_pdfjs_require__(88);
+$export($export.P + $export.R, 'Promise', {
+  'finally': function _finally(onFinally) {
+    var C = speciesConstructor(this, core.Promise || global.Promise);
+    var isFunction = typeof onFinally == 'function';
+    return this.then(isFunction ? function (x) {
+      return promiseResolve(C, onFinally()).then(function () {
+        return x;
+      });
+    } : onFinally, isFunction ? function (e) {
+      return promiseResolve(C, onFinally()).then(function () {
+        throw e;
+      });
+    } : onFinally);
+  }
+});
+
+/***/ }),
+/* 93 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var $export = __w_pdfjs_require__(7);
+var newPromiseCapability = __w_pdfjs_require__(85);
+var perform = __w_pdfjs_require__(86);
+$export($export.S, 'Promise', {
+  'try': function _try(callbackfn) {
+    var promiseCapability = newPromiseCapability.f(this);
+    var result = perform(callbackfn);
+    (result.e ? promiseCapability.reject : promiseCapability.resolve)(result.v);
+    return promiseCapability.promise;
+  }
+});
+
+/***/ }),
+/* 94 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+__w_pdfjs_require__(60);
+__w_pdfjs_require__(72);
+__w_pdfjs_require__(95);
+__w_pdfjs_require__(107);
+__w_pdfjs_require__(109);
+module.exports = __w_pdfjs_require__(9).WeakMap;
+
+/***/ }),
+/* 95 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var each = __w_pdfjs_require__(96)(0);
+var redefine = __w_pdfjs_require__(20);
+var meta = __w_pdfjs_require__(100);
+var assign = __w_pdfjs_require__(44);
+var weak = __w_pdfjs_require__(101);
+var isObject = __w_pdfjs_require__(13);
+var fails = __w_pdfjs_require__(16);
+var validate = __w_pdfjs_require__(102);
+var WEAK_MAP = 'WeakMap';
+var getWeak = meta.getWeak;
+var isExtensible = Object.isExtensible;
+var uncaughtFrozenStore = weak.ufstore;
+var tmp = {};
+var InternalMap;
+var wrapper = function wrapper(get) {
+  return function WeakMap() {
+    return get(this, arguments.length > 0 ? arguments[0] : undefined);
+  };
+};
+var methods = {
+  get: function get(key) {
+    if (isObject(key)) {
+      var data = getWeak(key);
+      if (data === true) return uncaughtFrozenStore(validate(this, WEAK_MAP)).get(key);
+      return data ? data[this._i] : undefined;
+    }
+  },
+  set: function set(key, value) {
+    return weak.def(validate(this, WEAK_MAP), key, value);
+  }
+};
+var $WeakMap = module.exports = __w_pdfjs_require__(103)(WEAK_MAP, wrapper, methods, weak, true, true);
+if (fails(function () {
+  return new $WeakMap().set((Object.freeze || Object)(tmp), 7).get(tmp) != 7;
+})) {
+  InternalMap = weak.getConstructor(wrapper, WEAK_MAP);
+  assign(InternalMap.prototype, methods);
+  meta.NEED = true;
+  each(['delete', 'has', 'get', 'set'], function (key) {
+    var proto = $WeakMap.prototype;
+    var method = proto[key];
+    redefine(proto, key, function (a, b) {
+      if (isObject(a) && !isExtensible(a)) {
+        if (!this._f) this._f = new InternalMap();
+        var result = this._f[key](a, b);
+        return key == 'set' ? this : result;
+      }
+      return method.call(this, a, b);
+    });
+  });
+}
+
+/***/ }),
+/* 96 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var ctx = __w_pdfjs_require__(23);
+var IObject = __w_pdfjs_require__(37);
+var toObject = __w_pdfjs_require__(51);
+var toLength = __w_pdfjs_require__(38);
+var asc = __w_pdfjs_require__(97);
+module.exports = function (TYPE, $create) {
+  var IS_MAP = TYPE == 1;
+  var IS_FILTER = TYPE == 2;
+  var IS_SOME = TYPE == 3;
+  var IS_EVERY = TYPE == 4;
+  var IS_FIND_INDEX = TYPE == 6;
+  var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;
+  var create = $create || asc;
+  return function ($this, callbackfn, that) {
+    var O = toObject($this);
+    var self = IObject(O);
+    var f = ctx(callbackfn, that, 3);
+    var length = toLength(self.length);
+    var index = 0;
+    var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;
+    var val, res;
+    for (; length > index; index++) {
+      if (NO_HOLES || index in self) {
+        val = self[index];
+        res = f(val, index, O);
+        if (TYPE) {
+          if (IS_MAP) result[index] = res;else if (res) switch (TYPE) {
+            case 3:
+              return true;
+            case 5:
+              return val;
+            case 6:
+              return index;
+            case 2:
+              result.push(val);
+          } else if (IS_EVERY) return false;
+        }
+      }
+    }return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;
+  };
+};
+
+/***/ }),
+/* 97 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var speciesConstructor = __w_pdfjs_require__(98);
+module.exports = function (original, length) {
+  return new (speciesConstructor(original))(length);
+};
+
+/***/ }),
+/* 98 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var isObject = __w_pdfjs_require__(13);
+var isArray = __w_pdfjs_require__(99);
+var SPECIES = __w_pdfjs_require__(28)('species');
+module.exports = function (original) {
+  var C;
+  if (isArray(original)) {
+    C = original.constructor;
+    if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;
+    if (isObject(C)) {
+      C = C[SPECIES];
+      if (C === null) C = undefined;
+    }
+  }
+  return C === undefined ? Array : C;
+};
+
+/***/ }),
+/* 99 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var cof = __w_pdfjs_require__(27);
+module.exports = Array.isArray || function isArray(arg) {
+  return cof(arg) == 'Array';
+};
+
+/***/ }),
+/* 100 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+var META = __w_pdfjs_require__(22)('meta');
+var isObject = __w_pdfjs_require__(13);
+var has = __w_pdfjs_require__(21);
+var setDesc = __w_pdfjs_require__(11).f;
+var id = 0;
+var isExtensible = Object.isExtensible || function () {
+  return true;
+};
+var FREEZE = !__w_pdfjs_require__(16)(function () {
+  return isExtensible(Object.preventExtensions({}));
+});
+var setMeta = function setMeta(it) {
+  setDesc(it, META, {
+    value: {
+      i: 'O' + ++id,
+      w: {}
+    }
+  });
+};
+var fastKey = function fastKey(it, create) {
+  if (!isObject(it)) return (typeof it === 'undefined' ? 'undefined' : _typeof(it)) == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;
+  if (!has(it, META)) {
+    if (!isExtensible(it)) return 'F';
+    if (!create) return 'E';
+    setMeta(it);
+  }
+  return it[META].i;
+};
+var getWeak = function getWeak(it, create) {
+  if (!has(it, META)) {
+    if (!isExtensible(it)) return true;
+    if (!create) return false;
+    setMeta(it);
+  }
+  return it[META].w;
+};
+var onFreeze = function onFreeze(it) {
+  if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);
+  return it;
+};
+var meta = module.exports = {
+  KEY: META,
+  NEED: false,
+  fastKey: fastKey,
+  getWeak: getWeak,
+  onFreeze: onFreeze
+};
+
+/***/ }),
+/* 101 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var redefineAll = __w_pdfjs_require__(89);
+var getWeak = __w_pdfjs_require__(100).getWeak;
+var anObject = __w_pdfjs_require__(12);
+var isObject = __w_pdfjs_require__(13);
+var anInstance = __w_pdfjs_require__(76);
+var forOf = __w_pdfjs_require__(77);
+var createArrayMethod = __w_pdfjs_require__(96);
+var $has = __w_pdfjs_require__(21);
+var validate = __w_pdfjs_require__(102);
+var arrayFind = createArrayMethod(5);
+var arrayFindIndex = createArrayMethod(6);
+var id = 0;
+var uncaughtFrozenStore = function uncaughtFrozenStore(that) {
+  return that._l || (that._l = new UncaughtFrozenStore());
+};
+var UncaughtFrozenStore = function UncaughtFrozenStore() {
+  this.a = [];
+};
+var findUncaughtFrozen = function findUncaughtFrozen(store, key) {
+  return arrayFind(store.a, function (it) {
+    return it[0] === key;
+  });
+};
+UncaughtFrozenStore.prototype = {
+  get: function get(key) {
+    var entry = findUncaughtFrozen(this, key);
+    if (entry) return entry[1];
+  },
+  has: function has(key) {
+    return !!findUncaughtFrozen(this, key);
+  },
+  set: function set(key, value) {
+    var entry = findUncaughtFrozen(this, key);
+    if (entry) entry[1] = value;else this.a.push([key, value]);
+  },
+  'delete': function _delete(key) {
+    var index = arrayFindIndex(this.a, function (it) {
+      return it[0] === key;
+    });
+    if (~index) this.a.splice(index, 1);
+    return !!~index;
+  }
+};
+module.exports = {
+  getConstructor: function getConstructor(wrapper, NAME, IS_MAP, ADDER) {
+    var C = wrapper(function (that, iterable) {
+      anInstance(that, C, NAME, '_i');
+      that._t = NAME;
+      that._i = id++;
+      that._l = undefined;
+      if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);
+    });
+    redefineAll(C.prototype, {
+      'delete': function _delete(key) {
+        if (!isObject(key)) return false;
+        var data = getWeak(key);
+        if (data === true) return uncaughtFrozenStore(validate(this, NAME))['delete'](key);
+        return data && $has(data, this._i) && delete data[this._i];
+      },
+      has: function has(key) {
+        if (!isObject(key)) return false;
+        var data = getWeak(key);
+        if (data === true) return uncaughtFrozenStore(validate(this, NAME)).has(key);
+        return data && $has(data, this._i);
+      }
+    });
+    return C;
+  },
+  def: function def(that, key, value) {
+    var data = getWeak(anObject(key), true);
+    if (data === true) uncaughtFrozenStore(that).set(key, value);else data[that._i] = value;
+    return that;
+  },
+  ufstore: uncaughtFrozenStore
+};
+
+/***/ }),
+/* 102 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var isObject = __w_pdfjs_require__(13);
+module.exports = function (it, TYPE) {
+  if (!isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!');
+  return it;
+};
+
+/***/ }),
+/* 103 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var global = __w_pdfjs_require__(8);
+var $export = __w_pdfjs_require__(7);
+var redefine = __w_pdfjs_require__(20);
+var redefineAll = __w_pdfjs_require__(89);
+var meta = __w_pdfjs_require__(100);
+var forOf = __w_pdfjs_require__(77);
+var anInstance = __w_pdfjs_require__(76);
+var isObject = __w_pdfjs_require__(13);
+var fails = __w_pdfjs_require__(16);
+var $iterDetect = __w_pdfjs_require__(91);
+var setToStringTag = __w_pdfjs_require__(70);
+var inheritIfRequired = __w_pdfjs_require__(104);
+module.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {
+  var Base = global[NAME];
+  var C = Base;
+  var ADDER = IS_MAP ? 'set' : 'add';
+  var proto = C && C.prototype;
+  var O = {};
+  var fixMethod = function fixMethod(KEY) {
+    var fn = proto[KEY];
+    redefine(proto, KEY, KEY == 'delete' ? function (a) {
+      return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);
+    } : KEY == 'has' ? function has(a) {
+      return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);
+    } : KEY == 'get' ? function get(a) {
+      return IS_WEAK && !isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a);
+    } : KEY == 'add' ? function add(a) {
+      fn.call(this, a === 0 ? 0 : a);
+      return this;
+    } : function set(a, b) {
+      fn.call(this, a === 0 ? 0 : a, b);
+      return this;
+    });
+  };
+  if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () {
+    new C().entries().next();
+  }))) {
+    C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);
+    redefineAll(C.prototype, methods);
+    meta.NEED = true;
+  } else {
+    var instance = new C();
+    var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance;
+    var THROWS_ON_PRIMITIVES = fails(function () {
+      instance.has(1);
+    });
+    var ACCEPT_ITERABLES = $iterDetect(function (iter) {
+      new C(iter);
+    });
+    var BUGGY_ZERO = !IS_WEAK && fails(function () {
+      var $instance = new C();
+      var index = 5;
+      while (index--) {
+        $instance[ADDER](index, index);
+      }return !$instance.has(-0);
+    });
+    if (!ACCEPT_ITERABLES) {
+      C = wrapper(function (target, iterable) {
+        anInstance(target, C, NAME);
+        var that = inheritIfRequired(new Base(), target, C);
+        if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);
+        return that;
+      });
+      C.prototype = proto;
+      proto.constructor = C;
+    }
+    if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {
+      fixMethod('delete');
+      fixMethod('has');
+      IS_MAP && fixMethod('get');
+    }
+    if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);
+    if (IS_WEAK && proto.clear) delete proto.clear;
+  }
+  setToStringTag(C, NAME);
+  O[NAME] = C;
+  $export($export.G + $export.W + $export.F * (C != Base), O);
+  if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP);
+  return C;
+};
+
+/***/ }),
+/* 104 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var isObject = __w_pdfjs_require__(13);
+var setPrototypeOf = __w_pdfjs_require__(105).set;
+module.exports = function (that, target, C) {
+  var S = target.constructor;
+  var P;
+  if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) {
+    setPrototypeOf(that, P);
+  }
+  return that;
+};
+
+/***/ }),
+/* 105 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var isObject = __w_pdfjs_require__(13);
+var anObject = __w_pdfjs_require__(12);
+var check = function check(O, proto) {
+  anObject(O);
+  if (!isObject(proto) && proto !== null) throw TypeError(proto + ": can't set as prototype!");
+};
+module.exports = {
+  set: Object.setPrototypeOf || ('__proto__' in {} ? function (test, buggy, set) {
+    try {
+      set = __w_pdfjs_require__(23)(Function.call, __w_pdfjs_require__(106).f(Object.prototype, '__proto__').set, 2);
+      set(test, []);
+      buggy = !(test instanceof Array);
+    } catch (e) {
+      buggy = true;
+    }
+    return function setPrototypeOf(O, proto) {
+      check(O, proto);
+      if (buggy) O.__proto__ = proto;else set(O, proto);
+      return O;
+    };
+  }({}, false) : undefined),
+  check: check
+};
+
+/***/ }),
+/* 106 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var pIE = __w_pdfjs_require__(50);
+var createDesc = __w_pdfjs_require__(19);
+var toIObject = __w_pdfjs_require__(36);
+var toPrimitive = __w_pdfjs_require__(18);
+var has = __w_pdfjs_require__(21);
+var IE8_DOM_DEFINE = __w_pdfjs_require__(14);
+var gOPD = Object.getOwnPropertyDescriptor;
+exports.f = __w_pdfjs_require__(15) ? gOPD : function getOwnPropertyDescriptor(O, P) {
+  O = toIObject(O);
+  P = toPrimitive(P, true);
+  if (IE8_DOM_DEFINE) try {
+    return gOPD(O, P);
+  } catch (e) {}
+  if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);
+};
+
+/***/ }),
+/* 107 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+__w_pdfjs_require__(108)('WeakMap');
+
+/***/ }),
+/* 108 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var $export = __w_pdfjs_require__(7);
+module.exports = function (COLLECTION) {
+  $export($export.S, COLLECTION, {
+    of: function of() {
+      var length = arguments.length;
+      var A = new Array(length);
+      while (length--) {
+        A[length] = arguments[length];
+      }return new this(A);
+    }
+  });
+};
+
+/***/ }),
+/* 109 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+__w_pdfjs_require__(110)('WeakMap');
+
+/***/ }),
+/* 110 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var $export = __w_pdfjs_require__(7);
+var aFunction = __w_pdfjs_require__(24);
+var ctx = __w_pdfjs_require__(23);
+var forOf = __w_pdfjs_require__(77);
+module.exports = function (COLLECTION) {
+  $export($export.S, COLLECTION, {
+    from: function from(source) {
+      var mapFn = arguments[1];
+      var mapping, A, n, cb;
+      aFunction(this);
+      mapping = mapFn !== undefined;
+      if (mapping) aFunction(mapFn);
+      if (source == undefined) return new this();
+      A = [];
+      if (mapping) {
+        n = 0;
+        cb = ctx(mapFn, arguments[2], 2);
+        forOf(source, false, function (nextItem) {
+          A.push(cb(nextItem, n++));
+        });
+      } else {
+        forOf(source, false, A.push, A);
+      }
+      return new this(A);
+    }
+  });
+};
+
+/***/ }),
+/* 111 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+__w_pdfjs_require__(112);
+module.exports = __w_pdfjs_require__(9).String.codePointAt;
+
+/***/ }),
+/* 112 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var $export = __w_pdfjs_require__(7);
+var $at = __w_pdfjs_require__(63)(false);
+$export($export.P, 'String', {
+  codePointAt: function codePointAt(pos) {
+    return $at(this, pos);
+  }
+});
+
+/***/ }),
+/* 113 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+__w_pdfjs_require__(114);
+module.exports = __w_pdfjs_require__(9).String.fromCodePoint;
+
+/***/ }),
+/* 114 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var $export = __w_pdfjs_require__(7);
+var toAbsoluteIndex = __w_pdfjs_require__(40);
+var fromCharCode = String.fromCharCode;
+var $fromCodePoint = String.fromCodePoint;
+$export($export.S + $export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', {
+  fromCodePoint: function fromCodePoint(x) {
+    var res = [];
+    var aLen = arguments.length;
+    var i = 0;
+    var code;
+    while (aLen > i) {
+      code = +arguments[i++];
+      if (toAbsoluteIndex(code, 0x10ffff) !== code) throw RangeError(code + ' is not a valid code point');
+      res.push(code < 0x10000 ? fromCharCode(code) : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00));
+    }
+    return res.join('');
+  }
+});
+
+/***/ }),
+/* 115 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+__w_pdfjs_require__(116);
+__w_pdfjs_require__(60);
+module.exports = __w_pdfjs_require__(9).Symbol;
+
+/***/ }),
+/* 116 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+var global = __w_pdfjs_require__(8);
+var has = __w_pdfjs_require__(21);
+var DESCRIPTORS = __w_pdfjs_require__(15);
+var $export = __w_pdfjs_require__(7);
+var redefine = __w_pdfjs_require__(20);
+var META = __w_pdfjs_require__(100).KEY;
+var $fails = __w_pdfjs_require__(16);
+var shared = __w_pdfjs_require__(29);
+var setToStringTag = __w_pdfjs_require__(70);
+var uid = __w_pdfjs_require__(22);
+var wks = __w_pdfjs_require__(28);
+var wksExt = __w_pdfjs_require__(117);
+var wksDefine = __w_pdfjs_require__(118);
+var enumKeys = __w_pdfjs_require__(119);
+var isArray = __w_pdfjs_require__(99);
+var anObject = __w_pdfjs_require__(12);
+var isObject = __w_pdfjs_require__(13);
+var toIObject = __w_pdfjs_require__(36);
+var toPrimitive = __w_pdfjs_require__(18);
+var createDesc = __w_pdfjs_require__(19);
+var _create = __w_pdfjs_require__(67);
+var gOPNExt = __w_pdfjs_require__(120);
+var $GOPD = __w_pdfjs_require__(106);
+var $DP = __w_pdfjs_require__(11);
+var $keys = __w_pdfjs_require__(45);
+var gOPD = $GOPD.f;
+var dP = $DP.f;
+var gOPN = gOPNExt.f;
+var $Symbol = global.Symbol;
+var $JSON = global.JSON;
+var _stringify = $JSON && $JSON.stringify;
+var PROTOTYPE = 'prototype';
+var HIDDEN = wks('_hidden');
+var TO_PRIMITIVE = wks('toPrimitive');
+var isEnum = {}.propertyIsEnumerable;
+var SymbolRegistry = shared('symbol-registry');
+var AllSymbols = shared('symbols');
+var OPSymbols = shared('op-symbols');
+var ObjectProto = Object[PROTOTYPE];
+var USE_NATIVE = typeof $Symbol == 'function';
+var QObject = global.QObject;
+var setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;
+var setSymbolDesc = DESCRIPTORS && $fails(function () {
+  return _create(dP({}, 'a', {
+    get: function get() {
+      return dP(this, 'a', { value: 7 }).a;
+    }
+  })).a != 7;
+}) ? function (it, key, D) {
+  var protoDesc = gOPD(ObjectProto, key);
+  if (protoDesc) delete ObjectProto[key];
+  dP(it, key, D);
+  if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);
+} : dP;
+var wrap = function wrap(tag) {
+  var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);
+  sym._k = tag;
+  return sym;
+};
+var isSymbol = USE_NATIVE && _typeof($Symbol.iterator) == 'symbol' ? function (it) {
+  return (typeof it === 'undefined' ? 'undefined' : _typeof(it)) == 'symbol';
+} : function (it) {
+  return it instanceof $Symbol;
+};
+var $defineProperty = function defineProperty(it, key, D) {
+  if (it === ObjectProto) $defineProperty(OPSymbols, key, D);
+  anObject(it);
+  key = toPrimitive(key, true);
+  anObject(D);
+  if (has(AllSymbols, key)) {
+    if (!D.enumerable) {
+      if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));
+      it[HIDDEN][key] = true;
+    } else {
+      if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;
+      D = _create(D, { enumerable: createDesc(0, false) });
+    }
+    return setSymbolDesc(it, key, D);
+  }
+  return dP(it, key, D);
+};
+var $defineProperties = function defineProperties(it, P) {
+  anObject(it);
+  var keys = enumKeys(P = toIObject(P));
+  var i = 0;
+  var l = keys.length;
+  var key;
+  while (l > i) {
+    $defineProperty(it, key = keys[i++], P[key]);
+  }return it;
+};
+var $create = function create(it, P) {
+  return P === undefined ? _create(it) : $defineProperties(_create(it), P);
+};
+var $propertyIsEnumerable = function propertyIsEnumerable(key) {
+  var E = isEnum.call(this, key = toPrimitive(key, true));
+  if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;
+  return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;
+};
+var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {
+  it = toIObject(it);
+  key = toPrimitive(key, true);
+  if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;
+  var D = gOPD(it, key);
+  if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;
+  return D;
+};
+var $getOwnPropertyNames = function getOwnPropertyNames(it) {
+  var names = gOPN(toIObject(it));
+  var result = [];
+  var i = 0;
+  var key;
+  while (names.length > i) {
+    if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);
+  }
+  return result;
+};
+var $getOwnPropertySymbols = function getOwnPropertySymbols(it) {
+  var IS_OP = it === ObjectProto;
+  var names = gOPN(IS_OP ? OPSymbols : toIObject(it));
+  var result = [];
+  var i = 0;
+  var key;
+  while (names.length > i) {
+    if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);
+  }
+  return result;
+};
+if (!USE_NATIVE) {
+  $Symbol = function _Symbol() {
+    if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');
+    var tag = uid(arguments.length > 0 ? arguments[0] : undefined);
+    var $set = function $set(value) {
+      if (this === ObjectProto) $set.call(OPSymbols, value);
+      if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;
+      setSymbolDesc(this, tag, createDesc(1, value));
+    };
+    if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, {
+      configurable: true,
+      set: $set
+    });
+    return wrap(tag);
+  };
+  redefine($Symbol[PROTOTYPE], 'toString', function toString() {
+    return this._k;
+  });
+  $GOPD.f = $getOwnPropertyDescriptor;
+  $DP.f = $defineProperty;
+  __w_pdfjs_require__(121).f = gOPNExt.f = $getOwnPropertyNames;
+  __w_pdfjs_require__(50).f = $propertyIsEnumerable;
+  __w_pdfjs_require__(49).f = $getOwnPropertySymbols;
+  if (DESCRIPTORS && !__w_pdfjs_require__(30)) {
+    redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);
+  }
+  wksExt.f = function (name) {
+    return wrap(wks(name));
+  };
+}
+$export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol });
+for (var es6Symbols = 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'.split(','), j = 0; es6Symbols.length > j;) {
+  wks(es6Symbols[j++]);
+}for (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) {
+  wksDefine(wellKnownSymbols[k++]);
+}$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {
+  'for': function _for(key) {
+    return has(SymbolRegistry, key += '') ? SymbolRegistry[key] : SymbolRegistry[key] = $Symbol(key);
+  },
+  keyFor: function keyFor(sym) {
+    if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');
+    for (var key in SymbolRegistry) {
+      if (SymbolRegistry[key] === sym) return key;
+    }
+  },
+  useSetter: function useSetter() {
+    setter = true;
+  },
+  useSimple: function useSimple() {
+    setter = false;
+  }
+});
+$export($export.S + $export.F * !USE_NATIVE, 'Object', {
+  create: $create,
+  defineProperty: $defineProperty,
+  defineProperties: $defineProperties,
+  getOwnPropertyDescriptor: $getOwnPropertyDescriptor,
+  getOwnPropertyNames: $getOwnPropertyNames,
+  getOwnPropertySymbols: $getOwnPropertySymbols
+});
+$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {
+  var S = $Symbol();
+  return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';
+})), 'JSON', {
+  stringify: function stringify(it) {
+    var args = [it];
+    var i = 1;
+    var replacer, $replacer;
+    while (arguments.length > i) {
+      args.push(arguments[i++]);
+    }$replacer = replacer = args[1];
+    if (!isObject(replacer) && it === undefined || isSymbol(it)) return;
+    if (!isArray(replacer)) replacer = function replacer(key, value) {
+      if (typeof $replacer == 'function') value = $replacer.call(this, key, value);
+      if (!isSymbol(value)) return value;
+    };
+    args[1] = replacer;
+    return _stringify.apply($JSON, args);
+  }
+});
+$Symbol[PROTOTYPE][TO_PRIMITIVE] || __w_pdfjs_require__(10)($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);
+setToStringTag($Symbol, 'Symbol');
+setToStringTag(Math, 'Math', true);
+setToStringTag(global.JSON, 'JSON', true);
+
+/***/ }),
+/* 117 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+exports.f = __w_pdfjs_require__(28);
+
+/***/ }),
+/* 118 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var global = __w_pdfjs_require__(8);
+var core = __w_pdfjs_require__(9);
+var LIBRARY = __w_pdfjs_require__(30);
+var wksExt = __w_pdfjs_require__(117);
+var defineProperty = __w_pdfjs_require__(11).f;
+module.exports = function (name) {
+  var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});
+  if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) });
+};
+
+/***/ }),
+/* 119 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var getKeys = __w_pdfjs_require__(45);
+var gOPS = __w_pdfjs_require__(49);
+var pIE = __w_pdfjs_require__(50);
+module.exports = function (it) {
+  var result = getKeys(it);
+  var getSymbols = gOPS.f;
+  if (getSymbols) {
+    var symbols = getSymbols(it);
+    var isEnum = pIE.f;
+    var i = 0;
+    var key;
+    while (symbols.length > i) {
+      if (isEnum.call(it, key = symbols[i++])) result.push(key);
+    }
+  }
+  return result;
+};
+
+/***/ }),
+/* 120 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+var toIObject = __w_pdfjs_require__(36);
+var gOPN = __w_pdfjs_require__(121).f;
+var toString = {}.toString;
+var windowNames = (typeof window === 'undefined' ? 'undefined' : _typeof(window)) == 'object' && window && Object.getOwnPropertyNames ? Object.getOwnPropertyNames(window) : [];
+var getWindowNames = function getWindowNames(it) {
+  try {
+    return gOPN(it);
+  } catch (e) {
+    return windowNames.slice();
+  }
+};
+module.exports.f = function getOwnPropertyNames(it) {
+  return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));
+};
+
+/***/ }),
+/* 121 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var $keys = __w_pdfjs_require__(46);
+var hiddenKeys = __w_pdfjs_require__(48).concat('length', 'prototype');
+exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {
+  return $keys(O, hiddenKeys);
+};
+
+/***/ }),
+/* 122 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+__w_pdfjs_require__(123);
+module.exports = __w_pdfjs_require__(9).Object.values;
+
+/***/ }),
+/* 123 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var $export = __w_pdfjs_require__(7);
+var $values = __w_pdfjs_require__(124)(false);
+$export($export.S, 'Object', {
+  values: function values(it) {
+    return $values(it);
+  }
+});
+
+/***/ }),
+/* 124 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var getKeys = __w_pdfjs_require__(45);
+var toIObject = __w_pdfjs_require__(36);
+var isEnum = __w_pdfjs_require__(50).f;
+module.exports = function (isEntries) {
+  return function (it) {
+    var O = toIObject(it);
+    var keys = getKeys(O);
+    var length = keys.length;
+    var i = 0;
+    var result = [];
+    var key;
+    while (length > i) {
+      if (isEnum.call(O, key = keys[i++])) {
+        result.push(isEntries ? [key, O[key]] : O[key]);
+      }
+    }return result;
+  };
+};
+
+/***/ }),
+/* 125 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var isReadableStreamSupported = false;
+if (typeof ReadableStream !== 'undefined') {
+  try {
+    new ReadableStream({
+      start: function start(controller) {
+        controller.close();
+      }
+    });
+    isReadableStreamSupported = true;
+  } catch (e) {}
+}
+if (isReadableStreamSupported) {
+  exports.ReadableStream = ReadableStream;
+} else {
+  exports.ReadableStream = __w_pdfjs_require__(126).ReadableStream;
+}
+
+/***/ }),
+/* 126 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+(function (e, a) {
+  for (var i in a) {
+    e[i] = a[i];
+  }
+})(exports, function (modules) {
+  var installedModules = {};
+  function __w_pdfjs_require__(moduleId) {
+    if (installedModules[moduleId]) return installedModules[moduleId].exports;
+    var module = installedModules[moduleId] = {
+      i: moduleId,
+      l: false,
+      exports: {}
+    };
+    modules[moduleId].call(module.exports, module, module.exports, __w_pdfjs_require__);
+    module.l = true;
+    return module.exports;
+  }
+  __w_pdfjs_require__.m = modules;
+  __w_pdfjs_require__.c = installedModules;
+  __w_pdfjs_require__.i = function (value) {
+    return value;
+  };
+  __w_pdfjs_require__.d = function (exports, name, getter) {
+    if (!__w_pdfjs_require__.o(exports, name)) {
+      Object.defineProperty(exports, name, {
+        configurable: false,
+        enumerable: true,
+        get: getter
+      });
+    }
+  };
+  __w_pdfjs_require__.n = function (module) {
+    var getter = module && module.__esModule ? function getDefault() {
+      return module['default'];
+    } : function getModuleExports() {
+      return module;
+    };
+    __w_pdfjs_require__.d(getter, 'a', getter);
+    return getter;
+  };
+  __w_pdfjs_require__.o = function (object, property) {
+    return Object.prototype.hasOwnProperty.call(object, property);
+  };
+  __w_pdfjs_require__.p = "";
+  return __w_pdfjs_require__(__w_pdfjs_require__.s = 7);
+}([function (module, exports, __w_pdfjs_require__) {
+  "use strict";
+
+  var _typeof = typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol" ? function (obj) {
+    return typeof obj === 'undefined' ? 'undefined' : _typeof2(obj);
+  } : function (obj) {
+    return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj === 'undefined' ? 'undefined' : _typeof2(obj);
+  };
+  var _require = __w_pdfjs_require__(1),
+      assert = _require.assert;
+  function IsPropertyKey(argument) {
+    return typeof argument === 'string' || (typeof argument === 'undefined' ? 'undefined' : _typeof(argument)) === 'symbol';
+  }
+  exports.typeIsObject = function (x) {
+    return (typeof x === 'undefined' ? 'undefined' : _typeof(x)) === 'object' && x !== null || typeof x === 'function';
+  };
+  exports.createDataProperty = function (o, p, v) {
+    assert(exports.typeIsObject(o));
+    Object.defineProperty(o, p, {
+      value: v,
+      writable: true,
+      enumerable: true,
+      configurable: true
+    });
+  };
+  exports.createArrayFromList = function (elements) {
+    return elements.slice();
+  };
+  exports.ArrayBufferCopy = function (dest, destOffset, src, srcOffset, n) {
+    new Uint8Array(dest).set(new Uint8Array(src, srcOffset, n), destOffset);
+  };
+  exports.CreateIterResultObject = function (value, done) {
+    assert(typeof done === 'boolean');
+    var obj = {};
+    Object.defineProperty(obj, 'value', {
+      value: value,
+      enumerable: true,
+      writable: true,
+      configurable: true
+    });
+    Object.defineProperty(obj, 'done', {
+      value: done,
+      enumerable: true,
+      writable: true,
+      configurable: true
+    });
+    return obj;
+  };
+  exports.IsFiniteNonNegativeNumber = function (v) {
+    if (Number.isNaN(v)) {
+      return false;
+    }
+    if (v === Infinity) {
+      return false;
+    }
+    if (v < 0) {
+      return false;
+    }
+    return true;
+  };
+  function Call(F, V, args) {
+    if (typeof F !== 'function') {
+      throw new TypeError('Argument is not a function');
+    }
+    return Function.prototype.apply.call(F, V, args);
+  }
+  exports.InvokeOrNoop = function (O, P, args) {
+    assert(O !== undefined);
+    assert(IsPropertyKey(P));
+    assert(Array.isArray(args));
+    var method = O[P];
+    if (method === undefined) {
+      return undefined;
+    }
+    return Call(method, O, args);
+  };
+  exports.PromiseInvokeOrNoop = function (O, P, args) {
+    assert(O !== undefined);
+    assert(IsPropertyKey(P));
+    assert(Array.isArray(args));
+    try {
+      return Promise.resolve(exports.InvokeOrNoop(O, P, args));
+    } catch (returnValueE) {
+      return Promise.reject(returnValueE);
+    }
+  };
+  exports.PromiseInvokeOrPerformFallback = function (O, P, args, F, argsF) {
+    assert(O !== undefined);
+    assert(IsPropertyKey(P));
+    assert(Array.isArray(args));
+    assert(Array.isArray(argsF));
+    var method = void 0;
+    try {
+      method = O[P];
+    } catch (methodE) {
+      return Promise.reject(methodE);
+    }
+    if (method === undefined) {
+      return F.apply(null, argsF);
+    }
+    try {
+      return Promise.resolve(Call(method, O, args));
+    } catch (e) {
+      return Promise.reject(e);
+    }
+  };
+  exports.TransferArrayBuffer = function (O) {
+    return O.slice();
+  };
+  exports.ValidateAndNormalizeHighWaterMark = function (highWaterMark) {
+    highWaterMark = Number(highWaterMark);
+    if (Number.isNaN(highWaterMark) || highWaterMark < 0) {
+      throw new RangeError('highWaterMark property of a queuing strategy must be non-negative and non-NaN');
+    }
+    return highWaterMark;
+  };
+  exports.ValidateAndNormalizeQueuingStrategy = function (size, highWaterMark) {
+    if (size !== undefined && typeof size !== 'function') {
+      throw new TypeError('size property of a queuing strategy must be a function');
+    }
+    highWaterMark = exports.ValidateAndNormalizeHighWaterMark(highWaterMark);
+    return {
+      size: size,
+      highWaterMark: highWaterMark
+    };
+  };
+}, function (module, exports, __w_pdfjs_require__) {
+  "use strict";
+
+  function rethrowAssertionErrorRejection(e) {
+    if (e && e.constructor === AssertionError) {
+      setTimeout(function () {
+        throw e;
+      }, 0);
+    }
+  }
+  function AssertionError(message) {
+    this.name = 'AssertionError';
+    this.message = message || '';
+    this.stack = new Error().stack;
+  }
+  AssertionError.prototype = Object.create(Error.prototype);
+  AssertionError.prototype.constructor = AssertionError;
+  function assert(value, message) {
+    if (!value) {
+      throw new AssertionError(message);
+    }
+  }
+  module.exports = {
+    rethrowAssertionErrorRejection: rethrowAssertionErrorRejection,
+    AssertionError: AssertionError,
+    assert: assert
+  };
+}, function (module, exports, __w_pdfjs_require__) {
+  "use strict";
+
+  var _createClass = function () {
+    function defineProperties(target, props) {
+      for (var i = 0; i < props.length; i++) {
+        var descriptor = props[i];
+        descriptor.enumerable = descriptor.enumerable || false;
+        descriptor.configurable = true;
+        if ("value" in descriptor) descriptor.writable = true;
+        Object.defineProperty(target, descriptor.key, descriptor);
+      }
+    }
+    return function (Constructor, protoProps, staticProps) {
+      if (protoProps) defineProperties(Constructor.prototype, protoProps);
+      if (staticProps) defineProperties(Constructor, staticProps);
+      return Constructor;
+    };
+  }();
+  function _classCallCheck(instance, Constructor) {
+    if (!(instance instanceof Constructor)) {
+      throw new TypeError("Cannot call a class as a function");
+    }
+  }
+  var _require = __w_pdfjs_require__(0),
+      InvokeOrNoop = _require.InvokeOrNoop,
+      PromiseInvokeOrNoop = _require.PromiseInvokeOrNoop,
+      ValidateAndNormalizeQueuingStrategy = _require.ValidateAndNormalizeQueuingStrategy,
+      typeIsObject = _require.typeIsObject;
+  var _require2 = __w_pdfjs_require__(1),
+      assert = _require2.assert,
+      rethrowAssertionErrorRejection = _require2.rethrowAssertionErrorRejection;
+  var _require3 = __w_pdfjs_require__(3),
+      DequeueValue = _require3.DequeueValue,
+      EnqueueValueWithSize = _require3.EnqueueValueWithSize,
+      PeekQueueValue = _require3.PeekQueueValue,
+      ResetQueue = _require3.ResetQueue;
+  var WritableStream = function () {
+    function WritableStream() {
+      var underlyingSink = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+      var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
+          size = _ref.size,
+          _ref$highWaterMark = _ref.highWaterMark,
+          highWaterMark = _ref$highWaterMark === undefined ? 1 : _ref$highWaterMark;
+      _classCallCheck(this, WritableStream);
+      this._state = 'writable';
+      this._storedError = undefined;
+      this._writer = undefined;
+      this._writableStreamController = undefined;
+      this._writeRequests = [];
+      this._inFlightWriteRequest = undefined;
+      this._closeRequest = undefined;
+      this._inFlightCloseRequest = undefined;
+      this._pendingAbortRequest = undefined;
+      this._backpressure = false;
+      var type = underlyingSink.type;
+      if (type !== undefined) {
+        throw new RangeError('Invalid type is specified');
+      }
+      this._writableStreamController = new WritableStreamDefaultController(this, underlyingSink, size, highWaterMark);
+      this._writableStreamController.__startSteps();
+    }
+    _createClass(WritableStream, [{
+      key: 'abort',
+      value: function abort(reason) {
+        if (IsWritableStream(this) === false) {
+          return Promise.reject(streamBrandCheckException('abort'));
+        }
+        if (IsWritableStreamLocked(this) === true) {
+          return Promise.reject(new TypeError('Cannot abort a stream that already has a writer'));
+        }
+        return WritableStreamAbort(this, reason);
+      }
+    }, {
+      key: 'getWriter',
+      value: function getWriter() {
+        if (IsWritableStream(this) === false) {
+          throw streamBrandCheckException('getWriter');
+        }
+        return AcquireWritableStreamDefaultWriter(this);
+      }
+    }, {
+      key: 'locked',
+      get: function get() {
+        if (IsWritableStream(this) === false) {
+          throw streamBrandCheckException('locked');
+        }
+        return IsWritableStreamLocked(this);
+      }
+    }]);
+    return WritableStream;
+  }();
+  module.exports = {
+    AcquireWritableStreamDefaultWriter: AcquireWritableStreamDefaultWriter,
+    IsWritableStream: IsWritableStream,
+    IsWritableStreamLocked: IsWritableStreamLocked,
+    WritableStream: WritableStream,
+    WritableStreamAbort: WritableStreamAbort,
+    WritableStreamDefaultControllerError: WritableStreamDefaultControllerError,
+    WritableStreamDefaultWriterCloseWithErrorPropagation: WritableStreamDefaultWriterCloseWithErrorPropagation,
+    WritableStreamDefaultWriterRelease: WritableStreamDefaultWriterRelease,
+    WritableStreamDefaultWriterWrite: WritableStreamDefaultWriterWrite,
+    WritableStreamCloseQueuedOrInFlight: WritableStreamCloseQueuedOrInFlight
+  };
+  function AcquireWritableStreamDefaultWriter(stream) {
+    return new WritableStreamDefaultWriter(stream);
+  }
+  function IsWritableStream(x) {
+    if (!typeIsObject(x)) {
+      return false;
+    }
+    if (!Object.prototype.hasOwnProperty.call(x, '_writableStreamController')) {
+      return false;
+    }
+    return true;
+  }
+  function IsWritableStreamLocked(stream) {
+    assert(IsWritableStream(stream) === true, 'IsWritableStreamLocked should only be used on known writable streams');
+    if (stream._writer === undefined) {
+      return false;
+    }
+    return true;
+  }
+  function WritableStreamAbort(stream, reason) {
+    var state = stream._state;
+    if (state === 'closed') {
+      return Promise.resolve(undefined);
+    }
+    if (state === 'errored') {
+      return Promise.reject(stream._storedError);
+    }
+    var error = new TypeError('Requested to abort');
+    if (stream._pendingAbortRequest !== undefined) {
+      return Promise.reject(error);
+    }
+    assert(state === 'writable' || state === 'erroring', 'state must be writable or erroring');
+    var wasAlreadyErroring = false;
+    if (state === 'erroring') {
+      wasAlreadyErroring = true;
+      reason = undefined;
+    }
+    var promise = new Promise(function (resolve, reject) {
+      stream._pendingAbortRequest = {
+        _resolve: resolve,
+        _reject: reject,
+        _reason: reason,
+        _wasAlreadyErroring: wasAlreadyErroring
+      };
+    });
+    if (wasAlreadyErroring === false) {
+      WritableStreamStartErroring(stream, error);
+    }
+    return promise;
+  }
+  function WritableStreamAddWriteRequest(stream) {
+    assert(IsWritableStreamLocked(stream) === true);
+    assert(stream._state === 'writable');
+    var promise = new Promise(function (resolve, reject) {
+      var writeRequest = {
+        _resolve: resolve,
+        _reject: reject
+      };
+      stream._writeRequests.push(writeRequest);
+    });
+    return promise;
+  }
+  function WritableStreamDealWithRejection(stream, error) {
+    var state = stream._state;
+    if (state === 'writable') {
+      WritableStreamStartErroring(stream, error);
+      return;
+    }
+    assert(state === 'erroring');
+    WritableStreamFinishErroring(stream);
+  }
+  function WritableStreamStartErroring(stream, reason) {
+    assert(stream._storedError === undefined, 'stream._storedError === undefined');
+    assert(stream._state === 'writable', 'state must be writable');
+    var controller = stream._writableStreamController;
+    assert(controller !== undefined, 'controller must not be undefined');
+    stream._state = 'erroring';
+    stream._storedError = reason;
+    var writer = stream._writer;
+    if (writer !== undefined) {
+      WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, reason);
+    }
+    if (WritableStreamHasOperationMarkedInFlight(stream) === false && controller._started === true) {
+      WritableStreamFinishErroring(stream);
+    }
+  }
+  function WritableStreamFinishErroring(stream) {
+    assert(stream._state === 'erroring', 'stream._state === erroring');
+    assert(WritableStreamHasOperationMarkedInFlight(stream) === false, 'WritableStreamHasOperationMarkedInFlight(stream) === false');
+    stream._state = 'errored';
+    stream._writableStreamController.__errorSteps();
+    var storedError = stream._storedError;
+    for (var i = 0; i < stream._writeRequests.length; i++) {
+      var writeRequest = stream._writeRequests[i];
+      writeRequest._reject(storedError);
+    }
+    stream._writeRequests = [];
+    if (stream._pendingAbortRequest === undefined) {
+      WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);
+      return;
+    }
+    var abortRequest = stream._pendingAbortRequest;
+    stream._pendingAbortRequest = undefined;
+    if (abortRequest._wasAlreadyErroring === true) {
+      abortRequest._reject(storedError);
+      WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);
+      return;
+    }
+    var promise = stream._writableStreamController.__abortSteps(abortRequest._reason);
+    promise.then(function () {
+      abortRequest._resolve();
+      WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);
+    }, function (reason) {
+      abortRequest._reject(reason);
+      WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);
+    });
+  }
+  function WritableStreamFinishInFlightWrite(stream) {
+    assert(stream._inFlightWriteRequest !== undefined);
+    stream._inFlightWriteRequest._resolve(undefined);
+    stream._inFlightWriteRequest = undefined;
+  }
+  function WritableStreamFinishInFlightWriteWithError(stream, error) {
+    assert(stream._inFlightWriteRequest !== undefined);
+    stream._inFlightWriteRequest._reject(error);
+    stream._inFlightWriteRequest = undefined;
+    assert(stream._state === 'writable' || stream._state === 'erroring');
+    WritableStreamDealWithRejection(stream, error);
+  }
+  function WritableStreamFinishInFlightClose(stream) {
+    assert(stream._inFlightCloseRequest !== undefined);
+    stream._inFlightCloseRequest._resolve(undefined);
+    stream._inFlightCloseRequest = undefined;
+    var state = stream._state;
+    assert(state === 'writable' || state === 'erroring');
+    if (state === 'erroring') {
+      stream._storedError = undefined;
+      if (stream._pendingAbortRequest !== undefined) {
+        stream._pendingAbortRequest._resolve();
+        stream._pendingAbortRequest = undefined;
+      }
+    }
+    stream._state = 'closed';
+    var writer = stream._writer;
+    if (writer !== undefined) {
+      defaultWriterClosedPromiseResolve(writer);
+    }
+    assert(stream._pendingAbortRequest === undefined, 'stream._pendingAbortRequest === undefined');
+    assert(stream._storedError === undefined, 'stream._storedError === undefined');
+  }
+  function WritableStreamFinishInFlightCloseWithError(stream, error) {
+    assert(stream._inFlightCloseRequest !== undefined);
+    stream._inFlightCloseRequest._reject(error);
+    stream._inFlightCloseRequest = undefined;
+    assert(stream._state === 'writable' || stream._state === 'erroring');
+    if (stream._pendingAbortRequest !== undefined) {
+      stream._pendingAbortRequest._reject(error);
+      stream._pendingAbortRequest = undefined;
+    }
+    WritableStreamDealWithRejection(stream, error);
+  }
+  function WritableStreamCloseQueuedOrInFlight(stream) {
+    if (stream._closeRequest === undefined && stream._inFlightCloseRequest === undefined) {
+      return false;
+    }
+    return true;
+  }
+  function WritableStreamHasOperationMarkedInFlight(stream) {
+    if (stream._inFlightWriteRequest === undefined && stream._inFlightCloseRequest === undefined) {
+      return false;
+    }
+    return true;
+  }
+  function WritableStreamMarkCloseRequestInFlight(stream) {
+    assert(stream._inFlightCloseRequest === undefined);
+    assert(stream._closeRequest !== undefined);
+    stream._inFlightCloseRequest = stream._closeRequest;
+    stream._closeRequest = undefined;
+  }
+  function WritableStreamMarkFirstWriteRequestInFlight(stream) {
+    assert(stream._inFlightWriteRequest === undefined, 'there must be no pending write request');
+    assert(stream._writeRequests.length !== 0, 'writeRequests must not be empty');
+    stream._inFlightWriteRequest = stream._writeRequests.shift();
+  }
+  function WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream) {
+    assert(stream._state === 'errored', '_stream_.[[state]] is `"errored"`');
+    if (stream._closeRequest !== undefined) {
+      assert(stream._inFlightCloseRequest === undefined);
+      stream._closeRequest._reject(stream._storedError);
+      stream._closeRequest = undefined;
+    }
+    var writer = stream._writer;
+    if (writer !== undefined) {
+      defaultWriterClosedPromiseReject(writer, stream._storedError);
+      writer._closedPromise.catch(function () {});
+    }
+  }
+  function WritableStreamUpdateBackpressure(stream, backpressure) {
+    assert(stream._state === 'writable');
+    assert(WritableStreamCloseQueuedOrInFlight(stream) === false);
+    var writer = stream._writer;
+    if (writer !== undefined && backpressure !== stream._backpressure) {
+      if (backpressure === true) {
+        defaultWriterReadyPromiseReset(writer);
+      } else {
+        assert(backpressure === false);
+        defaultWriterReadyPromiseResolve(writer);
+      }
+    }
+    stream._backpressure = backpressure;
+  }
+  var WritableStreamDefaultWriter = function () {
+    function WritableStreamDefaultWriter(stream) {
+      _classCallCheck(this, WritableStreamDefaultWriter);
+      if (IsWritableStream(stream) === false) {
+        throw new TypeError('WritableStreamDefaultWriter can only be constructed with a WritableStream instance');
+      }
+      if (IsWritableStreamLocked(stream) === true) {
+        throw new TypeError('This stream has already been locked for exclusive writing by another writer');
+      }
+      this._ownerWritableStream = stream;
+      stream._writer = this;
+      var state = stream._state;
+      if (state === 'writable') {
+        if (WritableStreamCloseQueuedOrInFlight(stream) === false && stream._backpressure === true) {
+          defaultWriterReadyPromiseInitialize(this);
+        } else {
+          defaultWriterReadyPromiseInitializeAsResolved(this);
+        }
+        defaultWriterClosedPromiseInitialize(this);
+      } else if (state === 'erroring') {
+        defaultWriterReadyPromiseInitializeAsRejected(this, stream._storedError);
+        this._readyPromise.catch(function () {});
+        defaultWriterClosedPromiseInitialize(this);
+      } else if (state === 'closed') {
+        defaultWriterReadyPromiseInitializeAsResolved(this);
+        defaultWriterClosedPromiseInitializeAsResolved(this);
+      } else {
+        assert(state === 'errored', 'state must be errored');
+        var storedError = stream._storedError;
+        defaultWriterReadyPromiseInitializeAsRejected(this, storedError);
+        this._readyPromise.catch(function () {});
+        defaultWriterClosedPromiseInitializeAsRejected(this, storedError);
+        this._closedPromise.catch(function () {});
+      }
+    }
+    _createClass(WritableStreamDefaultWriter, [{
+      key: 'abort',
+      value: function abort(reason) {
+        if (IsWritableStreamDefaultWriter(this) === false) {
+          return Promise.reject(defaultWriterBrandCheckException('abort'));
+        }
+        if (this._ownerWritableStream === undefined) {
+          return Promise.reject(defaultWriterLockException('abort'));
+        }
+        return WritableStreamDefaultWriterAbort(this, reason);
+      }
+    }, {
+      key: 'close',
+      value: function close() {
+        if (IsWritableStreamDefaultWriter(this) === false) {
+          return Promise.reject(defaultWriterBrandCheckException('close'));
+        }
+        var stream = this._ownerWritableStream;
+        if (stream === undefined) {
+          return Promise.reject(defaultWriterLockException('close'));
+        }
+        if (WritableStreamCloseQueuedOrInFlight(stream) === true) {
+          return Promise.reject(new TypeError('cannot close an already-closing stream'));
+        }
+        return WritableStreamDefaultWriterClose(this);
+      }
+    }, {
+      key: 'releaseLock',
+      value: function releaseLock() {
+        if (IsWritableStreamDefaultWriter(this) === false) {
+          throw defaultWriterBrandCheckException('releaseLock');
+        }
+        var stream = this._ownerWritableStream;
+        if (stream === undefined) {
+          return;
+        }
+        assert(stream._writer !== undefined);
+        WritableStreamDefaultWriterRelease(this);
+      }
+    }, {
+      key: 'write',
+      value: function write(chunk) {
+        if (IsWritableStreamDefaultWriter(this) === false) {
+          return Promise.reject(defaultWriterBrandCheckException('write'));
+        }
+        if (this._ownerWritableStream === undefined) {
+          return Promise.reject(defaultWriterLockException('write to'));
+        }
+        return WritableStreamDefaultWriterWrite(this, chunk);
+      }
+    }, {
+      key: 'closed',
+      get: function get() {
+        if (IsWritableStreamDefaultWriter(this) === false) {
+          return Promise.reject(defaultWriterBrandCheckException('closed'));
+        }
+        return this._closedPromise;
+      }
+    }, {
+      key: 'desiredSize',
+      get: function get() {
+        if (IsWritableStreamDefaultWriter(this) === false) {
+          throw defaultWriterBrandCheckException('desiredSize');
+        }
+        if (this._ownerWritableStream === undefined) {
+          throw defaultWriterLockException('desiredSize');
+        }
+        return WritableStreamDefaultWriterGetDesiredSize(this);
+      }
+    }, {
+      key: 'ready',
+      get: function get() {
+        if (IsWritableStreamDefaultWriter(this) === false) {
+          return Promise.reject(defaultWriterBrandCheckException('ready'));
+        }
+        return this._readyPromise;
+      }
+    }]);
+    return WritableStreamDefaultWriter;
+  }();
+  function IsWritableStreamDefaultWriter(x) {
+    if (!typeIsObject(x)) {
+      return false;
+    }
+    if (!Object.prototype.hasOwnProperty.call(x, '_ownerWritableStream')) {
+      return false;
+    }
+    return true;
+  }
+  function WritableStreamDefaultWriterAbort(writer, reason) {
+    var stream = writer._ownerWritableStream;
+    assert(stream !== undefined);
+    return WritableStreamAbort(stream, reason);
+  }
+  function WritableStreamDefaultWriterClose(writer) {
+    var stream = writer._ownerWritableStream;
+    assert(stream !== undefined);
+    var state = stream._state;
+    if (state === 'closed' || state === 'errored') {
+      return Promise.reject(new TypeError('The stream (in ' + state + ' state) is not in the writable state and cannot be closed'));
+    }
+    assert(state === 'writable' || state === 'erroring');
+    assert(WritableStreamCloseQueuedOrInFlight(stream) === false);
+    var promise = new Promise(function (resolve, reject) {
+      var closeRequest = {
+        _resolve: resolve,
+        _reject: reject
+      };
+      stream._closeRequest = closeRequest;
+    });
+    if (stream._backpressure === true && state === 'writable') {
+      defaultWriterReadyPromiseResolve(writer);
+    }
+    WritableStreamDefaultControllerClose(stream._writableStreamController);
+    return promise;
+  }
+  function WritableStreamDefaultWriterCloseWithErrorPropagation(writer) {
+    var stream = writer._ownerWritableStream;
+    assert(stream !== undefined);
+    var state = stream._state;
+    if (WritableStreamCloseQueuedOrInFlight(stream) === true || state === 'closed') {
+      return Promise.resolve();
+    }
+    if (state === 'errored') {
+      return Promise.reject(stream._storedError);
+    }
+    assert(state === 'writable' || state === 'erroring');
+    return WritableStreamDefaultWriterClose(writer);
+  }
+  function WritableStreamDefaultWriterEnsureClosedPromiseRejected(writer, error) {
+    if (writer._closedPromiseState === 'pending') {
+      defaultWriterClosedPromiseReject(writer, error);
+    } else {
+      defaultWriterClosedPromiseResetToRejected(writer, error);
+    }
+    writer._closedPromise.catch(function () {});
+  }
+  function WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, error) {
+    if (writer._readyPromiseState === 'pending') {
+      defaultWriterReadyPromiseReject(writer, error);
+    } else {
+      defaultWriterReadyPromiseResetToRejected(writer, error);
+    }
+    writer._readyPromise.catch(function () {});
+  }
+  function WritableStreamDefaultWriterGetDesiredSize(writer) {
+    var stream = writer._ownerWritableStream;
+    var state = stream._state;
+    if (state === 'errored' || state === 'erroring') {
+      return null;
+    }
+    if (state === 'closed') {
+      return 0;
+    }
+    return WritableStreamDefaultControllerGetDesiredSize(stream._writableStreamController);
+  }
+  function WritableStreamDefaultWriterRelease(writer) {
+    var stream = writer._ownerWritableStream;
+    assert(stream !== undefined);
+    assert(stream._writer === writer);
+    var releasedError = new TypeError('Writer was released and can no longer be used to monitor the stream\'s closedness');
+    WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, releasedError);
+    WritableStreamDefaultWriterEnsureClosedPromiseRejected(writer, releasedError);
+    stream._writer = undefined;
+    writer._ownerWritableStream = undefined;
+  }
+  function WritableStreamDefaultWriterWrite(writer, chunk) {
+    var stream = writer._ownerWritableStream;
+    assert(stream !== undefined);
+    var controller = stream._writableStreamController;
+    var chunkSize = WritableStreamDefaultControllerGetChunkSize(controller, chunk);
+    if (stream !== writer._ownerWritableStream) {
+      return Promise.reject(defaultWriterLockException('write to'));
+    }
+    var state = stream._state;
+    if (state === 'errored') {
+      return Promise.reject(stream._storedError);
+    }
+    if (WritableStreamCloseQueuedOrInFlight(stream) === true || state === 'closed') {
+      return Promise.reject(new TypeError('The stream is closing or closed and cannot be written to'));
+    }
+    if (state === 'erroring') {
+      return Promise.reject(stream._storedError);
+    }
+    assert(state === 'writable');
+    var promise = WritableStreamAddWriteRequest(stream);
+    WritableStreamDefaultControllerWrite(controller, chunk, chunkSize);
+    return promise;
+  }
+  var WritableStreamDefaultController = function () {
+    function WritableStreamDefaultController(stream, underlyingSink, size, highWaterMark) {
+      _classCallCheck(this, WritableStreamDefaultController);
+      if (IsWritableStream(stream) === false) {
+        throw new TypeError('WritableStreamDefaultController can only be constructed with a WritableStream instance');
+      }
+      if (stream._writableStreamController !== undefined) {
+        throw new TypeError('WritableStreamDefaultController instances can only be created by the WritableStream constructor');
+      }
+      this._controlledWritableStream = stream;
+      this._underlyingSink = underlyingSink;
+      this._queue = undefined;
+      this._queueTotalSize = undefined;
+      ResetQueue(this);
+      this._started = false;
+      var normalizedStrategy = ValidateAndNormalizeQueuingStrategy(size, highWaterMark);
+      this._strategySize = normalizedStrategy.size;
+      this._strategyHWM = normalizedStrategy.highWaterMark;
+      var backpressure = WritableStreamDefaultControllerGetBackpressure(this);
+      WritableStreamUpdateBackpressure(stream, backpressure);
+    }
+    _createClass(WritableStreamDefaultController, [{
+      key: 'error',
+      value: function error(e) {
+        if (IsWritableStreamDefaultController(this) === false) {
+          throw new TypeError('WritableStreamDefaultController.prototype.error can only be used on a WritableStreamDefaultController');
+        }
+        var state = this._controlledWritableStream._state;
+        if (state !== 'writable') {
+          return;
+        }
+        WritableStreamDefaultControllerError(this, e);
+      }
+    }, {
+      key: '__abortSteps',
+      value: function __abortSteps(reason) {
+        return PromiseInvokeOrNoop(this._underlyingSink, 'abort', [reason]);
+      }
+    }, {
+      key: '__errorSteps',
+      value: function __errorSteps() {
+        ResetQueue(this);
+      }
+    }, {
+      key: '__startSteps',
+      value: function __startSteps() {
+        var _this = this;
+        var startResult = InvokeOrNoop(this._underlyingSink, 'start', [this]);
+        var stream = this._controlledWritableStream;
+        Promise.resolve(startResult).then(function () {
+          assert(stream._state === 'writable' || stream._state === 'erroring');
+          _this._started = true;
+          WritableStreamDefaultControllerAdvanceQueueIfNeeded(_this);
+        }, function (r) {
+          assert(stream._state === 'writable' || stream._state === 'erroring');
+          _this._started = true;
+          WritableStreamDealWithRejection(stream, r);
+        }).catch(rethrowAssertionErrorRejection);
+      }
+    }]);
+    return WritableStreamDefaultController;
+  }();
+  function WritableStreamDefaultControllerClose(controller) {
+    EnqueueValueWithSize(controller, 'close', 0);
+    WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller);
+  }
+  function WritableStreamDefaultControllerGetChunkSize(controller, chunk) {
+    var strategySize = controller._strategySize;
+    if (strategySize === undefined) {
+      return 1;
+    }
+    try {
+      return strategySize(chunk);
+    } catch (chunkSizeE) {
+      WritableStreamDefaultControllerErrorIfNeeded(controller, chunkSizeE);
+      return 1;
+    }
+  }
+  function WritableStreamDefaultControllerGetDesiredSize(controller) {
+    return controller._strategyHWM - controller._queueTotalSize;
+  }
+  function WritableStreamDefaultControllerWrite(controller, chunk, chunkSize) {
+    var writeRecord = { chunk: chunk };
+    try {
+      EnqueueValueWithSize(controller, writeRecord, chunkSize);
+    } catch (enqueueE) {
+      WritableStreamDefaultControllerErrorIfNeeded(controller, enqueueE);
+      return;
+    }
+    var stream = controller._controlledWritableStream;
+    if (WritableStreamCloseQueuedOrInFlight(stream) === false && stream._state === 'writable') {
+      var backpressure = WritableStreamDefaultControllerGetBackpressure(controller);
+      WritableStreamUpdateBackpressure(stream, backpressure);
+    }
+    WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller);
+  }
+  function IsWritableStreamDefaultController(x) {
+    if (!typeIsObject(x)) {
+      return false;
+    }
+    if (!Object.prototype.hasOwnProperty.call(x, '_underlyingSink')) {
+      return false;
+    }
+    return true;
+  }
+  function WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller) {
+    var stream = controller._controlledWritableStream;
+    if (controller._started === false) {
+      return;
+    }
+    if (stream._inFlightWriteRequest !== undefined) {
+      return;
+    }
+    var state = stream._state;
+    if (state === 'closed' || state === 'errored') {
+      return;
+    }
+    if (state === 'erroring') {
+      WritableStreamFinishErroring(stream);
+      return;
+    }
+    if (controller._queue.length === 0) {
+      return;
+    }
+    var writeRecord = PeekQueueValue(controller);
+    if (writeRecord === 'close') {
+      WritableStreamDefaultControllerProcessClose(controller);
+    } else {
+      WritableStreamDefaultControllerProcessWrite(controller, writeRecord.chunk);
+    }
+  }
+  function WritableStreamDefaultControllerErrorIfNeeded(controller, error) {
+    if (controller._controlledWritableStream._state === 'writable') {
+      WritableStreamDefaultControllerError(controller, error);
+    }
+  }
+  function WritableStreamDefaultControllerProcessClose(controller) {
+    var stream = controller._controlledWritableStream;
+    WritableStreamMarkCloseRequestInFlight(stream);
+    DequeueValue(controller);
+    assert(controller._queue.length === 0, 'queue must be empty once the final write record is dequeued');
+    var sinkClosePromise = PromiseInvokeOrNoop(controller._underlyingSink, 'close', []);
+    sinkClosePromise.then(function () {
+      WritableStreamFinishInFlightClose(stream);
+    }, function (reason) {
+      WritableStreamFinishInFlightCloseWithError(stream, reason);
+    }).catch(rethrowAssertionErrorRejection);
+  }
+  function WritableStreamDefaultControllerProcessWrite(controller, chunk) {
+    var stream = controller._controlledWritableStream;
+    WritableStreamMarkFirstWriteRequestInFlight(stream);
+    var sinkWritePromise = PromiseInvokeOrNoop(controller._underlyingSink, 'write', [chunk, controller]);
+    sinkWritePromise.then(function () {
+      WritableStreamFinishInFlightWrite(stream);
+      var state = stream._state;
+      assert(state === 'writable' || state === 'erroring');
+      DequeueValue(controller);
+      if (WritableStreamCloseQueuedOrInFlight(stream) === false && state === 'writable') {
+        var backpressure = WritableStreamDefaultControllerGetBackpressure(controller);
+        WritableStreamUpdateBackpressure(stream, backpressure);
+      }
+      WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller);
+    }, function (reason) {
+      WritableStreamFinishInFlightWriteWithError(stream, reason);
+    }).catch(rethrowAssertionErrorRejection);
+  }
+  function WritableStreamDefaultControllerGetBackpressure(controller) {
+    var desiredSize = WritableStreamDefaultControllerGetDesiredSize(controller);
+    return desiredSize <= 0;
+  }
+  function WritableStreamDefaultControllerError(controller, error) {
+    var stream = controller._controlledWritableStream;
+    assert(stream._state === 'writable');
+    WritableStreamStartErroring(stream, error);
+  }
+  function streamBrandCheckException(name) {
+    return new TypeError('WritableStream.prototype.' + name + ' can only be used on a WritableStream');
+  }
+  function defaultWriterBrandCheckException(name) {
+    return new TypeError('WritableStreamDefaultWriter.prototype.' + name + ' can only be used on a WritableStreamDefaultWriter');
+  }
+  function defaultWriterLockException(name) {
+    return new TypeError('Cannot ' + name + ' a stream using a released writer');
+  }
+  function defaultWriterClosedPromiseInitialize(writer) {
+    writer._closedPromise = new Promise(function (resolve, reject) {
+      writer._closedPromise_resolve = resolve;
+      writer._closedPromise_reject = reject;
+      writer._closedPromiseState = 'pending';
+    });
+  }
+  function defaultWriterClosedPromiseInitializeAsRejected(writer, reason) {
+    writer._closedPromise = Promise.reject(reason);
+    writer._closedPromise_resolve = undefined;
+    writer._closedPromise_reject = undefined;
+    writer._closedPromiseState = 'rejected';
+  }
+  function defaultWriterClosedPromiseInitializeAsResolved(writer) {
+    writer._closedPromise = Promise.resolve(undefined);
+    writer._closedPromise_resolve = undefined;
+    writer._closedPromise_reject = undefined;
+    writer._closedPromiseState = 'resolved';
+  }
+  function defaultWriterClosedPromiseReject(writer, reason) {
+    assert(writer._closedPromise_resolve !== undefined, 'writer._closedPromise_resolve !== undefined');
+    assert(writer._closedPromise_reject !== undefined, 'writer._closedPromise_reject !== undefined');
+    assert(writer._closedPromiseState === 'pending', 'writer._closedPromiseState is pending');
+    writer._closedPromise_reject(reason);
+    writer._closedPromise_resolve = undefined;
+    writer._closedPromise_reject = undefined;
+    writer._closedPromiseState = 'rejected';
+  }
+  function defaultWriterClosedPromiseResetToRejected(writer, reason) {
+    assert(writer._closedPromise_resolve === undefined, 'writer._closedPromise_resolve === undefined');
+    assert(writer._closedPromise_reject === undefined, 'writer._closedPromise_reject === undefined');
+    assert(writer._closedPromiseState !== 'pending', 'writer._closedPromiseState is not pending');
+    writer._closedPromise = Promise.reject(reason);
+    writer._closedPromiseState = 'rejected';
+  }
+  function defaultWriterClosedPromiseResolve(writer) {
+    assert(writer._closedPromise_resolve !== undefined, 'writer._closedPromise_resolve !== undefined');
+    assert(writer._closedPromise_reject !== undefined, 'writer._closedPromise_reject !== undefined');
+    assert(writer._closedPromiseState === 'pending', 'writer._closedPromiseState is pending');
+    writer._closedPromise_resolve(undefined);
+    writer._closedPromise_resolve = undefined;
+    writer._closedPromise_reject = undefined;
+    writer._closedPromiseState = 'resolved';
+  }
+  function defaultWriterReadyPromiseInitialize(writer) {
+    writer._readyPromise = new Promise(function (resolve, reject) {
+      writer._readyPromise_resolve = resolve;
+      writer._readyPromise_reject = reject;
+    });
+    writer._readyPromiseState = 'pending';
+  }
+  function defaultWriterReadyPromiseInitializeAsRejected(writer, reason) {
+    writer._readyPromise = Promise.reject(reason);
+    writer._readyPromise_resolve = undefined;
+    writer._readyPromise_reject = undefined;
+    writer._readyPromiseState = 'rejected';
+  }
+  function defaultWriterReadyPromiseInitializeAsResolved(writer) {
+    writer._readyPromise = Promise.resolve(undefined);
+    writer._readyPromise_resolve = undefined;
+    writer._readyPromise_reject = undefined;
+    writer._readyPromiseState = 'fulfilled';
+  }
+  function defaultWriterReadyPromiseReject(writer, reason) {
+    assert(writer._readyPromise_resolve !== undefined, 'writer._readyPromise_resolve !== undefined');
+    assert(writer._readyPromise_reject !== undefined, 'writer._readyPromise_reject !== undefined');
+    writer._readyPromise_reject(reason);
+    writer._readyPromise_resolve = undefined;
+    writer._readyPromise_reject = undefined;
+    writer._readyPromiseState = 'rejected';
+  }
+  function defaultWriterReadyPromiseReset(writer) {
+    assert(writer._readyPromise_resolve === undefined, 'writer._readyPromise_resolve === undefined');
+    assert(writer._readyPromise_reject === undefined, 'writer._readyPromise_reject === undefined');
+    writer._readyPromise = new Promise(function (resolve, reject) {
+      writer._readyPromise_resolve = resolve;
+      writer._readyPromise_reject = reject;
+    });
+    writer._readyPromiseState = 'pending';
+  }
+  function defaultWriterReadyPromiseResetToRejected(writer, reason) {
+    assert(writer._readyPromise_resolve === undefined, 'writer._readyPromise_resolve === undefined');
+    assert(writer._readyPromise_reject === undefined, 'writer._readyPromise_reject === undefined');
+    writer._readyPromise = Promise.reject(reason);
+    writer._readyPromiseState = 'rejected';
+  }
+  function defaultWriterReadyPromiseResolve(writer) {
+    assert(writer._readyPromise_resolve !== undefined, 'writer._readyPromise_resolve !== undefined');
+    assert(writer._readyPromise_reject !== undefined, 'writer._readyPromise_reject !== undefined');
+    writer._readyPromise_resolve(undefined);
+    writer._readyPromise_resolve = undefined;
+    writer._readyPromise_reject = undefined;
+    writer._readyPromiseState = 'fulfilled';
+  }
+}, function (module, exports, __w_pdfjs_require__) {
+  "use strict";
+
+  var _require = __w_pdfjs_require__(0),
+      IsFiniteNonNegativeNumber = _require.IsFiniteNonNegativeNumber;
+  var _require2 = __w_pdfjs_require__(1),
+      assert = _require2.assert;
+  exports.DequeueValue = function (container) {
+    assert('_queue' in container && '_queueTotalSize' in container, 'Spec-level failure: DequeueValue should only be used on containers with [[queue]] and [[queueTotalSize]].');
+    assert(container._queue.length > 0, 'Spec-level failure: should never dequeue from an empty queue.');
+    var pair = container._queue.shift();
+    container._queueTotalSize -= pair.size;
+    if (container._queueTotalSize < 0) {
+      container._queueTotalSize = 0;
+    }
+    return pair.value;
+  };
+  exports.EnqueueValueWithSize = function (container, value, size) {
+    assert('_queue' in container && '_queueTotalSize' in container, 'Spec-level failure: EnqueueValueWithSize should only be used on containers with [[queue]] and ' + '[[queueTotalSize]].');
+    size = Number(size);
+    if (!IsFiniteNonNegativeNumber(size)) {
+      throw new RangeError('Size must be a finite, non-NaN, non-negative number.');
+    }
+    container._queue.push({
+      value: value,
+      size: size
+    });
+    container._queueTotalSize += size;
+  };
+  exports.PeekQueueValue = function (container) {
+    assert('_queue' in container && '_queueTotalSize' in container, 'Spec-level failure: PeekQueueValue should only be used on containers with [[queue]] and [[queueTotalSize]].');
+    assert(container._queue.length > 0, 'Spec-level failure: should never peek at an empty queue.');
+    var pair = container._queue[0];
+    return pair.value;
+  };
+  exports.ResetQueue = function (container) {
+    assert('_queue' in container && '_queueTotalSize' in container, 'Spec-level failure: ResetQueue should only be used on containers with [[queue]] and [[queueTotalSize]].');
+    container._queue = [];
+    container._queueTotalSize = 0;
+  };
+}, function (module, exports, __w_pdfjs_require__) {
+  "use strict";
+
+  var _createClass = function () {
+    function defineProperties(target, props) {
+      for (var i = 0; i < props.length; i++) {
+        var descriptor = props[i];
+        descriptor.enumerable = descriptor.enumerable || false;
+        descriptor.configurable = true;
+        if ("value" in descriptor) descriptor.writable = true;
+        Object.defineProperty(target, descriptor.key, descriptor);
+      }
+    }
+    return function (Constructor, protoProps, staticProps) {
+      if (protoProps) defineProperties(Constructor.prototype, protoProps);
+      if (staticProps) defineProperties(Constructor, staticProps);
+      return Constructor;
+    };
+  }();
+  function _classCallCheck(instance, Constructor) {
+    if (!(instance instanceof Constructor)) {
+      throw new TypeError("Cannot call a class as a function");
+    }
+  }
+  var _require = __w_pdfjs_require__(0),
+      ArrayBufferCopy = _require.ArrayBufferCopy,
+      CreateIterResultObject = _require.CreateIterResultObject,
+      IsFiniteNonNegativeNumber = _require.IsFiniteNonNegativeNumber,
+      InvokeOrNoop = _require.InvokeOrNoop,
+      PromiseInvokeOrNoop = _require.PromiseInvokeOrNoop,
+      TransferArrayBuffer = _require.TransferArrayBuffer,
+      ValidateAndNormalizeQueuingStrategy = _require.ValidateAndNormalizeQueuingStrategy,
+      ValidateAndNormalizeHighWaterMark = _require.ValidateAndNormalizeHighWaterMark;
+  var _require2 = __w_pdfjs_require__(0),
+      createArrayFromList = _require2.createArrayFromList,
+      createDataProperty = _require2.createDataProperty,
+      typeIsObject = _require2.typeIsObject;
+  var _require3 = __w_pdfjs_require__(1),
+      assert = _require3.assert,
+      rethrowAssertionErrorRejection = _require3.rethrowAssertionErrorRejection;
+  var _require4 = __w_pdfjs_require__(3),
+      DequeueValue = _require4.DequeueValue,
+      EnqueueValueWithSize = _require4.EnqueueValueWithSize,
+      ResetQueue = _require4.ResetQueue;
+  var _require5 = __w_pdfjs_require__(2),
+      AcquireWritableStreamDefaultWriter = _require5.AcquireWritableStreamDefaultWriter,
+      IsWritableStream = _require5.IsWritableStream,
+      IsWritableStreamLocked = _require5.IsWritableStreamLocked,
+      WritableStreamAbort = _require5.WritableStreamAbort,
+      WritableStreamDefaultWriterCloseWithErrorPropagation = _require5.WritableStreamDefaultWriterCloseWithErrorPropagation,
+      WritableStreamDefaultWriterRelease = _require5.WritableStreamDefaultWriterRelease,
+      WritableStreamDefaultWriterWrite = _require5.WritableStreamDefaultWriterWrite,
+      WritableStreamCloseQueuedOrInFlight = _require5.WritableStreamCloseQueuedOrInFlight;
+  var ReadableStream = function () {
+    function ReadableStream() {
+      var underlyingSource = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+      var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
+          size = _ref.size,
+          highWaterMark = _ref.highWaterMark;
+      _classCallCheck(this, ReadableStream);
+      this._state = 'readable';
+      this._reader = undefined;
+      this._storedError = undefined;
+      this._disturbed = false;
+      this._readableStreamController = undefined;
+      var type = underlyingSource.type;
+      var typeString = String(type);
+      if (typeString === 'bytes') {
+        if (highWaterMark === undefined) {
+          highWaterMark = 0;
+        }
+        this._readableStreamController = new ReadableByteStreamController(this, underlyingSource, highWaterMark);
+      } else if (type === undefined) {
+        if (highWaterMark === undefined) {
+          highWaterMark = 1;
+        }
+        this._readableStreamController = new ReadableStreamDefaultController(this, underlyingSource, size, highWaterMark);
+      } else {
+        throw new RangeError('Invalid type is specified');
+      }
+    }
+    _createClass(ReadableStream, [{
+      key: 'cancel',
+      value: function cancel(reason) {
+        if (IsReadableStream(this) === false) {
+          return Promise.reject(streamBrandCheckException('cancel'));
+        }
+        if (IsReadableStreamLocked(this) === true) {
+          return Promise.reject(new TypeError('Cannot cancel a stream that already has a reader'));
+        }
+        return ReadableStreamCancel(this, reason);
+      }
+    }, {
+      key: 'getReader',
+      value: function getReader() {
+        var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
+            mode = _ref2.mode;
+        if (IsReadableStream(this) === false) {
+          throw streamBrandCheckException('getReader');
+        }
+        if (mode === undefined) {
+          return AcquireReadableStreamDefaultReader(this);
+        }
+        mode = String(mode);
+        if (mode === 'byob') {
+          return AcquireReadableStreamBYOBReader(this);
+        }
+        throw new RangeError('Invalid mode is specified');
+      }
+    }, {
+      key: 'pipeThrough',
+      value: function pipeThrough(_ref3, options) {
+        var writable = _ref3.writable,
+            readable = _ref3.readable;
+        var promise = this.pipeTo(writable, options);
+        ifIsObjectAndHasAPromiseIsHandledInternalSlotSetPromiseIsHandledToTrue(promise);
+        return readable;
+      }
+    }, {
+      key: 'pipeTo',
+      value: function pipeTo(dest) {
+        var _this = this;
+        var _ref4 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
+            preventClose = _ref4.preventClose,
+            preventAbort = _ref4.preventAbort,
+            preventCancel = _ref4.preventCancel;
+        if (IsReadableStream(this) === false) {
+          return Promise.reject(streamBrandCheckException('pipeTo'));
+        }
+        if (IsWritableStream(dest) === false) {
+          return Promise.reject(new TypeError('ReadableStream.prototype.pipeTo\'s first argument must be a WritableStream'));
+        }
+        preventClose = Boolean(preventClose);
+        preventAbort = Boolean(preventAbort);
+        preventCancel = Boolean(preventCancel);
+        if (IsReadableStreamLocked(this) === true) {
+          return Promise.reject(new TypeError('ReadableStream.prototype.pipeTo cannot be used on a locked ReadableStream'));
+        }
+        if (IsWritableStreamLocked(dest) === true) {
+          return Promise.reject(new TypeError('ReadableStream.prototype.pipeTo cannot be used on a locked WritableStream'));
+        }
+        var reader = AcquireReadableStreamDefaultReader(this);
+        var writer = AcquireWritableStreamDefaultWriter(dest);
+        var shuttingDown = false;
+        var currentWrite = Promise.resolve();
+        return new Promise(function (resolve, reject) {
+          function pipeLoop() {
+            currentWrite = Promise.resolve();
+            if (shuttingDown === true) {
+              return Promise.resolve();
+            }
+            return writer._readyPromise.then(function () {
+              return ReadableStreamDefaultReaderRead(reader).then(function (_ref5) {
+                var value = _ref5.value,
+                    done = _ref5.done;
+                if (done === true) {
+                  return;
+                }
+                currentWrite = WritableStreamDefaultWriterWrite(writer, value).catch(function () {});
+              });
+            }).then(pipeLoop);
+          }
+          isOrBecomesErrored(_this, reader._closedPromise, function (storedError) {
+            if (preventAbort === false) {
+              shutdownWithAction(function () {
+                return WritableStreamAbort(dest, storedError);
+              }, true, storedError);
+            } else {
+              shutdown(true, storedError);
+            }
+          });
+          isOrBecomesErrored(dest, writer._closedPromise, function (storedError) {
+            if (preventCancel === false) {
+              shutdownWithAction(function () {
+                return ReadableStreamCancel(_this, storedError);
+              }, true, storedError);
+            } else {
+              shutdown(true, storedError);
+            }
+          });
+          isOrBecomesClosed(_this, reader._closedPromise, function () {
+            if (preventClose === false) {
+              shutdownWithAction(function () {
+                return WritableStreamDefaultWriterCloseWithErrorPropagation(writer);
+              });
+            } else {
+              shutdown();
+            }
+          });
+          if (WritableStreamCloseQueuedOrInFlight(dest) === true || dest._state === 'closed') {
+            var destClosed = new TypeError('the destination writable stream closed before all data could be piped to it');
+            if (preventCancel === false) {
+              shutdownWithAction(function () {
+                return ReadableStreamCancel(_this, destClosed);
+              }, true, destClosed);
+            } else {
+              shutdown(true, destClosed);
+            }
+          }
+          pipeLoop().catch(function (err) {
+            currentWrite = Promise.resolve();
+            rethrowAssertionErrorRejection(err);
+          });
+          function waitForWritesToFinish() {
+            var oldCurrentWrite = currentWrite;
+            return currentWrite.then(function () {
+              return oldCurrentWrite !== currentWrite ? waitForWritesToFinish() : undefined;
+            });
+          }
+          function isOrBecomesErrored(stream, promise, action) {
+            if (stream._state === 'errored') {
+              action(stream._storedError);
+            } else {
+              promise.catch(action).catch(rethrowAssertionErrorRejection);
+            }
+          }
+          function isOrBecomesClosed(stream, promise, action) {
+            if (stream._state === 'closed') {
+              action();
+            } else {
+              promise.then(action).catch(rethrowAssertionErrorRejection);
+            }
+          }
+          function shutdownWithAction(action, originalIsError, originalError) {
+            if (shuttingDown === true) {
+              return;
+            }
+            shuttingDown = true;
+            if (dest._state === 'writable' && WritableStreamCloseQueuedOrInFlight(dest) === false) {
+              waitForWritesToFinish().then(doTheRest);
+            } else {
+              doTheRest();
+            }
+            function doTheRest() {
+              action().then(function () {
+                return finalize(originalIsError, originalError);
+              }, function (newError) {
+                return finalize(true, newError);
+              }).catch(rethrowAssertionErrorRejection);
+            }
+          }
+          function shutdown(isError, error) {
+            if (shuttingDown === true) {
+              return;
+            }
+            shuttingDown = true;
+            if (dest._state === 'writable' && WritableStreamCloseQueuedOrInFlight(dest) === false) {
+              waitForWritesToFinish().then(function () {
+                return finalize(isError, error);
+              }).catch(rethrowAssertionErrorRejection);
+            } else {
+              finalize(isError, error);
+            }
+          }
+          function finalize(isError, error) {
+            WritableStreamDefaultWriterRelease(writer);
+            ReadableStreamReaderGenericRelease(reader);
+            if (isError) {
+              reject(error);
+            } else {
+              resolve(undefined);
+            }
+          }
+        });
+      }
+    }, {
+      key: 'tee',
+      value: function tee() {
+        if (IsReadableStream(this) === false) {
+          throw streamBrandCheckException('tee');
+        }
+        var branches = ReadableStreamTee(this, false);
+        return createArrayFromList(branches);
+      }
+    }, {
+      key: 'locked',
+      get: function get() {
+        if (IsReadableStream(this) === false) {
+          throw streamBrandCheckException('locked');
+        }
+        return IsReadableStreamLocked(this);
+      }
+    }]);
+    return ReadableStream;
+  }();
+  module.exports = {
+    ReadableStream: ReadableStream,
+    IsReadableStreamDisturbed: IsReadableStreamDisturbed,
+    ReadableStreamDefaultControllerClose: ReadableStreamDefaultControllerClose,
+    ReadableStreamDefaultControllerEnqueue: ReadableStreamDefaultControllerEnqueue,
+    ReadableStreamDefaultControllerError: ReadableStreamDefaultControllerError,
+    ReadableStreamDefaultControllerGetDesiredSize: ReadableStreamDefaultControllerGetDesiredSize
+  };
+  function AcquireReadableStreamBYOBReader(stream) {
+    return new ReadableStreamBYOBReader(stream);
+  }
+  function AcquireReadableStreamDefaultReader(stream) {
+    return new ReadableStreamDefaultReader(stream);
+  }
+  function IsReadableStream(x) {
+    if (!typeIsObject(x)) {
+      return false;
+    }
+    if (!Object.prototype.hasOwnProperty.call(x, '_readableStreamController')) {
+      return false;
+    }
+    return true;
+  }
+  function IsReadableStreamDisturbed(stream) {
+    assert(IsReadableStream(stream) === true, 'IsReadableStreamDisturbed should only be used on known readable streams');
+    return stream._disturbed;
+  }
+  function IsReadableStreamLocked(stream) {
+    assert(IsReadableStream(stream) === true, 'IsReadableStreamLocked should only be used on known readable streams');
+    if (stream._reader === undefined) {
+      return false;
+    }
+    return true;
+  }
+  function ReadableStreamTee(stream, cloneForBranch2) {
+    assert(IsReadableStream(stream) === true);
+    assert(typeof cloneForBranch2 === 'boolean');
+    var reader = AcquireReadableStreamDefaultReader(stream);
+    var teeState = {
+      closedOrErrored: false,
+      canceled1: false,
+      canceled2: false,
+      reason1: undefined,
+      reason2: undefined
+    };
+    teeState.promise = new Promise(function (resolve) {
+      teeState._resolve = resolve;
+    });
+    var pull = create_ReadableStreamTeePullFunction();
+    pull._reader = reader;
+    pull._teeState = teeState;
+    pull._cloneForBranch2 = cloneForBranch2;
+    var cancel1 = create_ReadableStreamTeeBranch1CancelFunction();
+    cancel1._stream = stream;
+    cancel1._teeState = teeState;
+    var cancel2 = create_ReadableStreamTeeBranch2CancelFunction();
+    cancel2._stream = stream;
+    cancel2._teeState = teeState;
+    var underlyingSource1 = Object.create(Object.prototype);
+    createDataProperty(underlyingSource1, 'pull', pull);
+    createDataProperty(underlyingSource1, 'cancel', cancel1);
+    var branch1Stream = new ReadableStream(underlyingSource1);
+    var underlyingSource2 = Object.create(Object.prototype);
+    createDataProperty(underlyingSource2, 'pull', pull);
+    createDataProperty(underlyingSource2, 'cancel', cancel2);
+    var branch2Stream = new ReadableStream(underlyingSource2);
+    pull._branch1 = branch1Stream._readableStreamController;
+    pull._branch2 = branch2Stream._readableStreamController;
+    reader._closedPromise.catch(function (r) {
+      if (teeState.closedOrErrored === true) {
+        return;
+      }
+      ReadableStreamDefaultControllerError(pull._branch1, r);
+      ReadableStreamDefaultControllerError(pull._branch2, r);
+      teeState.closedOrErrored = true;
+    });
+    return [branch1Stream, branch2Stream];
+  }
+  function create_ReadableStreamTeePullFunction() {
+    function f() {
+      var reader = f._reader,
+          branch1 = f._branch1,
+          branch2 = f._branch2,
+          teeState = f._teeState;
+      return ReadableStreamDefaultReaderRead(reader).then(function (result) {
+        assert(typeIsObject(result));
+        var value = result.value;
+        var done = result.done;
+        assert(typeof done === 'boolean');
+        if (done === true && teeState.closedOrErrored === false) {
+          if (teeState.canceled1 === false) {
+            ReadableStreamDefaultControllerClose(branch1);
+          }
+          if (teeState.canceled2 === false) {
+            ReadableStreamDefaultControllerClose(branch2);
+          }
+          teeState.closedOrErrored = true;
+        }
+        if (teeState.closedOrErrored === true) {
+          return;
+        }
+        var value1 = value;
+        var value2 = value;
+        if (teeState.canceled1 === false) {
+          ReadableStreamDefaultControllerEnqueue(branch1, value1);
+        }
+        if (teeState.canceled2 === false) {
+          ReadableStreamDefaultControllerEnqueue(branch2, value2);
+        }
+      });
+    }
+    return f;
+  }
+  function create_ReadableStreamTeeBranch1CancelFunction() {
+    function f(reason) {
+      var stream = f._stream,
+          teeState = f._teeState;
+      teeState.canceled1 = true;
+      teeState.reason1 = reason;
+      if (teeState.canceled2 === true) {
+        var compositeReason = createArrayFromList([teeState.reason1, teeState.reason2]);
+        var cancelResult = ReadableStreamCancel(stream, compositeReason);
+        teeState._resolve(cancelResult);
+      }
+      return teeState.promise;
+    }
+    return f;
+  }
+  function create_ReadableStreamTeeBranch2CancelFunction() {
+    function f(reason) {
+      var stream = f._stream,
+          teeState = f._teeState;
+      teeState.canceled2 = true;
+      teeState.reason2 = reason;
+      if (teeState.canceled1 === true) {
+        var compositeReason = createArrayFromList([teeState.reason1, teeState.reason2]);
+        var cancelResult = ReadableStreamCancel(stream, compositeReason);
+        teeState._resolve(cancelResult);
+      }
+      return teeState.promise;
+    }
+    return f;
+  }
+  function ReadableStreamAddReadIntoRequest(stream) {
+    assert(IsReadableStreamBYOBReader(stream._reader) === true);
+    assert(stream._state === 'readable' || stream._state === 'closed');
+    var promise = new Promise(function (resolve, reject) {
+      var readIntoRequest = {
+        _resolve: resolve,
+        _reject: reject
+      };
+      stream._reader._readIntoRequests.push(readIntoRequest);
+    });
+    return promise;
+  }
+  function ReadableStreamAddReadRequest(stream) {
+    assert(IsReadableStreamDefaultReader(stream._reader) === true);
+    assert(stream._state === 'readable');
+    var promise = new Promise(function (resolve, reject) {
+      var readRequest = {
+        _resolve: resolve,
+        _reject: reject
+      };
+      stream._reader._readRequests.push(readRequest);
+    });
+    return promise;
+  }
+  function ReadableStreamCancel(stream, reason) {
+    stream._disturbed = true;
+    if (stream._state === 'closed') {
+      return Promise.resolve(undefined);
+    }
+    if (stream._state === 'errored') {
+      return Promise.reject(stream._storedError);
+    }
+    ReadableStreamClose(stream);
+    var sourceCancelPromise = stream._readableStreamController.__cancelSteps(reason);
+    return sourceCancelPromise.then(function () {
+      return undefined;
+    });
+  }
+  function ReadableStreamClose(stream) {
+    assert(stream._state === 'readable');
+    stream._state = 'closed';
+    var reader = stream._reader;
+    if (reader === undefined) {
+      return undefined;
+    }
+    if (IsReadableStreamDefaultReader(reader) === true) {
+      for (var i = 0; i < reader._readRequests.length; i++) {
+        var _resolve = reader._readRequests[i]._resolve;
+        _resolve(CreateIterResultObject(undefined, true));
+      }
+      reader._readRequests = [];
+    }
+    defaultReaderClosedPromiseResolve(reader);
+    return undefined;
+  }
+  function ReadableStreamError(stream, e) {
+    assert(IsReadableStream(stream) === true, 'stream must be ReadableStream');
+    assert(stream._state === 'readable', 'state must be readable');
+    stream._state = 'errored';
+    stream._storedError = e;
+    var reader = stream._reader;
+    if (reader === undefined) {
+      return undefined;
+    }
+    if (IsReadableStreamDefaultReader(reader) === true) {
+      for (var i = 0; i < reader._readRequests.length; i++) {
+        var readRequest = reader._readRequests[i];
+        readRequest._reject(e);
+      }
+      reader._readRequests = [];
+    } else {
+      assert(IsReadableStreamBYOBReader(reader), 'reader must be ReadableStreamBYOBReader');
+      for (var _i = 0; _i < reader._readIntoRequests.length; _i++) {
+        var readIntoRequest = reader._readIntoRequests[_i];
+        readIntoRequest._reject(e);
+      }
+      reader._readIntoRequests = [];
+    }
+    defaultReaderClosedPromiseReject(reader, e);
+    reader._closedPromise.catch(function () {});
+  }
+  function ReadableStreamFulfillReadIntoRequest(stream, chunk, done) {
+    var reader = stream._reader;
+    assert(reader._readIntoRequests.length > 0);
+    var readIntoRequest = reader._readIntoRequests.shift();
+    readIntoRequest._resolve(CreateIterResultObject(chunk, done));
+  }
+  function ReadableStreamFulfillReadRequest(stream, chunk, done) {
+    var reader = stream._reader;
+    assert(reader._readRequests.length > 0);
+    var readRequest = reader._readRequests.shift();
+    readRequest._resolve(CreateIterResultObject(chunk, done));
+  }
+  function ReadableStreamGetNumReadIntoRequests(stream) {
+    return stream._reader._readIntoRequests.length;
+  }
+  function ReadableStreamGetNumReadRequests(stream) {
+    return stream._reader._readRequests.length;
+  }
+  function ReadableStreamHasBYOBReader(stream) {
+    var reader = stream._reader;
+    if (reader === undefined) {
+      return false;
+    }
+    if (IsReadableStreamBYOBReader(reader) === false) {
+      return false;
+    }
+    return true;
+  }
+  function ReadableStreamHasDefaultReader(stream) {
+    var reader = stream._reader;
+    if (reader === undefined) {
+      return false;
+    }
+    if (IsReadableStreamDefaultReader(reader) === false) {
+      return false;
+    }
+    return true;
+  }
+  var ReadableStreamDefaultReader = function () {
+    function ReadableStreamDefaultReader(stream) {
+      _classCallCheck(this, ReadableStreamDefaultReader);
+      if (IsReadableStream(stream) === false) {
+        throw new TypeError('ReadableStreamDefaultReader can only be constructed with a ReadableStream instance');
+      }
+      if (IsReadableStreamLocked(stream) === true) {
+        throw new TypeError('This stream has already been locked for exclusive reading by another reader');
+      }
+      ReadableStreamReaderGenericInitialize(this, stream);
+      this._readRequests = [];
+    }
+    _createClass(ReadableStreamDefaultReader, [{
+      key: 'cancel',
+      value: function cancel(reason) {
+        if (IsReadableStreamDefaultReader(this) === false) {
+          return Promise.reject(defaultReaderBrandCheckException('cancel'));
+        }
+        if (this._ownerReadableStream === undefined) {
+          return Promise.reject(readerLockException('cancel'));
+        }
+        return ReadableStreamReaderGenericCancel(this, reason);
+      }
+    }, {
+      key: 'read',
+      value: function read() {
+        if (IsReadableStreamDefaultReader(this) === false) {
+          return Promise.reject(defaultReaderBrandCheckException('read'));
+        }
+        if (this._ownerReadableStream === undefined) {
+          return Promise.reject(readerLockException('read from'));
+        }
+        return ReadableStreamDefaultReaderRead(this);
+      }
+    }, {
+      key: 'releaseLock',
+      value: function releaseLock() {
+        if (IsReadableStreamDefaultReader(this) === false) {
+          throw defaultReaderBrandCheckException('releaseLock');
+        }
+        if (this._ownerReadableStream === undefined) {
+          return;
+        }
+        if (this._readRequests.length > 0) {
+          throw new TypeError('Tried to release a reader lock when that reader has pending read() calls un-settled');
+        }
+        ReadableStreamReaderGenericRelease(this);
+      }
+    }, {
+      key: 'closed',
+      get: function get() {
+        if (IsReadableStreamDefaultReader(this) === false) {
+          return Promise.reject(defaultReaderBrandCheckException('closed'));
+        }
+        return this._closedPromise;
+      }
+    }]);
+    return ReadableStreamDefaultReader;
+  }();
+  var ReadableStreamBYOBReader = function () {
+    function ReadableStreamBYOBReader(stream) {
+      _classCallCheck(this, ReadableStreamBYOBReader);
+      if (!IsReadableStream(stream)) {
+        throw new TypeError('ReadableStreamBYOBReader can only be constructed with a ReadableStream instance given a ' + 'byte source');
+      }
+      if (IsReadableByteStreamController(stream._readableStreamController) === false) {
+        throw new TypeError('Cannot construct a ReadableStreamBYOBReader for a stream not constructed with a byte ' + 'source');
+      }
+      if (IsReadableStreamLocked(stream)) {
+        throw new TypeError('This stream has already been locked for exclusive reading by another reader');
+      }
+      ReadableStreamReaderGenericInitialize(this, stream);
+      this._readIntoRequests = [];
+    }
+    _createClass(ReadableStreamBYOBReader, [{
+      key: 'cancel',
+      value: function cancel(reason) {
+        if (!IsReadableStreamBYOBReader(this)) {
+          return Promise.reject(byobReaderBrandCheckException('cancel'));
+        }
+        if (this._ownerReadableStream === undefined) {
+          return Promise.reject(readerLockException('cancel'));
+        }
+        return ReadableStreamReaderGenericCancel(this, reason);
+      }
+    }, {
+      key: 'read',
+      value: function read(view) {
+        if (!IsReadableStreamBYOBReader(this)) {
+          return Promise.reject(byobReaderBrandCheckException('read'));
+        }
+        if (this._ownerReadableStream === undefined) {
+          return Promise.reject(readerLockException('read from'));
+        }
+        if (!ArrayBuffer.isView(view)) {
+          return Promise.reject(new TypeError('view must be an array buffer view'));
+        }
+        if (view.byteLength === 0) {
+          return Promise.reject(new TypeError('view must have non-zero byteLength'));
+        }
+        return ReadableStreamBYOBReaderRead(this, view);
+      }
+    }, {
+      key: 'releaseLock',
+      value: function releaseLock() {
+        if (!IsReadableStreamBYOBReader(this)) {
+          throw byobReaderBrandCheckException('releaseLock');
+        }
+        if (this._ownerReadableStream === undefined) {
+          return;
+        }
+        if (this._readIntoRequests.length > 0) {
+          throw new TypeError('Tried to release a reader lock when that reader has pending read() calls un-settled');
+        }
+        ReadableStreamReaderGenericRelease(this);
+      }
+    }, {
+      key: 'closed',
+      get: function get() {
+        if (!IsReadableStreamBYOBReader(this)) {
+          return Promise.reject(byobReaderBrandCheckException('closed'));
+        }
+        return this._closedPromise;
+      }
+    }]);
+    return ReadableStreamBYOBReader;
+  }();
+  function IsReadableStreamBYOBReader(x) {
+    if (!typeIsObject(x)) {
+      return false;
+    }
+    if (!Object.prototype.hasOwnProperty.call(x, '_readIntoRequests')) {
+      return false;
+    }
+    return true;
+  }
+  function IsReadableStreamDefaultReader(x) {
+    if (!typeIsObject(x)) {
+      return false;
+    }
+    if (!Object.prototype.hasOwnProperty.call(x, '_readRequests')) {
+      return false;
+    }
+    return true;
+  }
+  function ReadableStreamReaderGenericInitialize(reader, stream) {
+    reader._ownerReadableStream = stream;
+    stream._reader = reader;
+    if (stream._state === 'readable') {
+      defaultReaderClosedPromiseInitialize(reader);
+    } else if (stream._state === 'closed') {
+      defaultReaderClosedPromiseInitializeAsResolved(reader);
+    } else {
+      assert(stream._state === 'errored', 'state must be errored');
+      defaultReaderClosedPromiseInitializeAsRejected(reader, stream._storedError);
+      reader._closedPromise.catch(function () {});
+    }
+  }
+  function ReadableStreamReaderGenericCancel(reader, reason) {
+    var stream = reader._ownerReadableStream;
+    assert(stream !== undefined);
+    return ReadableStreamCancel(stream, reason);
+  }
+  function ReadableStreamReaderGenericRelease(reader) {
+    assert(reader._ownerReadableStream !== undefined);
+    assert(reader._ownerReadableStream._reader === reader);
+    if (reader._ownerReadableStream._state === 'readable') {
+      defaultReaderClosedPromiseReject(reader, new TypeError('Reader was released and can no longer be used to monitor the stream\'s closedness'));
+    } else {
+      defaultReaderClosedPromiseResetToRejected(reader, new TypeError('Reader was released and can no longer be used to monitor the stream\'s closedness'));
+    }
+    reader._closedPromise.catch(function () {});
+    reader._ownerReadableStream._reader = undefined;
+    reader._ownerReadableStream = undefined;
+  }
+  function ReadableStreamBYOBReaderRead(reader, view) {
+    var stream = reader._ownerReadableStream;
+    assert(stream !== undefined);
+    stream._disturbed = true;
+    if (stream._state === 'errored') {
+      return Promise.reject(stream._storedError);
+    }
+    return ReadableByteStreamControllerPullInto(stream._readableStreamController, view);
+  }
+  function ReadableStreamDefaultReaderRead(reader) {
+    var stream = reader._ownerReadableStream;
+    assert(stream !== undefined);
+    stream._disturbed = true;
+    if (stream._state === 'closed') {
+      return Promise.resolve(CreateIterResultObject(undefined, true));
+    }
+    if (stream._state === 'errored') {
+      return Promise.reject(stream._storedError);
+    }
+    assert(stream._state === 'readable');
+    return stream._readableStreamController.__pullSteps();
+  }
+  var ReadableStreamDefaultController = function () {
+    function ReadableStreamDefaultController(stream, underlyingSource, size, highWaterMark) {
+      _classCallCheck(this, ReadableStreamDefaultController);
+      if (IsReadableStream(stream) === false) {
+        throw new TypeError('ReadableStreamDefaultController can only be constructed with a ReadableStream instance');
+      }
+      if (stream._readableStreamController !== undefined) {
+        throw new TypeError('ReadableStreamDefaultController instances can only be created by the ReadableStream constructor');
+      }
+      this._controlledReadableStream = stream;
+      this._underlyingSource = underlyingSource;
+      this._queue = undefined;
+      this._queueTotalSize = undefined;
+      ResetQueue(this);
+      this._started = false;
+      this._closeRequested = false;
+      this._pullAgain = false;
+      this._pulling = false;
+      var normalizedStrategy = ValidateAndNormalizeQueuingStrategy(size, highWaterMark);
+      this._strategySize = normalizedStrategy.size;
+      this._strategyHWM = normalizedStrategy.highWaterMark;
+      var controller = this;
+      var startResult = InvokeOrNoop(underlyingSource, 'start', [this]);
+      Promise.resolve(startResult).then(function () {
+        controller._started = true;
+        assert(controller._pulling === false);
+        assert(controller._pullAgain === false);
+        ReadableStreamDefaultControllerCallPullIfNeeded(controller);
+      }, function (r) {
+        ReadableStreamDefaultControllerErrorIfNeeded(controller, r);
+      }).catch(rethrowAssertionErrorRejection);
+    }
+    _createClass(ReadableStreamDefaultController, [{
+      key: 'close',
+      value: function close() {
+        if (IsReadableStreamDefaultController(this) === false) {
+          throw defaultControllerBrandCheckException('close');
+        }
+        if (this._closeRequested === true) {
+          throw new TypeError('The stream has already been closed; do not close it again!');
+        }
+        var state = this._controlledReadableStream._state;
+        if (state !== 'readable') {
+          throw new TypeError('The stream (in ' + state + ' state) is not in the readable state and cannot be closed');
+        }
+        ReadableStreamDefaultControllerClose(this);
+      }
+    }, {
+      key: 'enqueue',
+      value: function enqueue(chunk) {
+        if (IsReadableStreamDefaultController(this) === false) {
+          throw defaultControllerBrandCheckException('enqueue');
+        }
+        if (this._closeRequested === true) {
+          throw new TypeError('stream is closed or draining');
+        }
+        var state = this._controlledReadableStream._state;
+        if (state !== 'readable') {
+          throw new TypeError('The stream (in ' + state + ' state) is not in the readable state and cannot be enqueued to');
+        }
+        return ReadableStreamDefaultControllerEnqueue(this, chunk);
+      }
+    }, {
+      key: 'error',
+      value: function error(e) {
+        if (IsReadableStreamDefaultController(this) === false) {
+          throw defaultControllerBrandCheckException('error');
+        }
+        var stream = this._controlledReadableStream;
+        if (stream._state !== 'readable') {
+          throw new TypeError('The stream is ' + stream._state + ' and so cannot be errored');
+        }
+        ReadableStreamDefaultControllerError(this, e);
+      }
+    }, {
+      key: '__cancelSteps',
+      value: function __cancelSteps(reason) {
+        ResetQueue(this);
+        return PromiseInvokeOrNoop(this._underlyingSource, 'cancel', [reason]);
+      }
+    }, {
+      key: '__pullSteps',
+      value: function __pullSteps() {
+        var stream = this._controlledReadableStream;
+        if (this._queue.length > 0) {
+          var chunk = DequeueValue(this);
+          if (this._closeRequested === true && this._queue.length === 0) {
+            ReadableStreamClose(stream);
+          } else {
+            ReadableStreamDefaultControllerCallPullIfNeeded(this);
+          }
+          return Promise.resolve(CreateIterResultObject(chunk, false));
+        }
+        var pendingPromise = ReadableStreamAddReadRequest(stream);
+        ReadableStreamDefaultControllerCallPullIfNeeded(this);
+        return pendingPromise;
+      }
+    }, {
+      key: 'desiredSize',
+      get: function get() {
+        if (IsReadableStreamDefaultController(this) === false) {
+          throw defaultControllerBrandCheckException('desiredSize');
+        }
+        return ReadableStreamDefaultControllerGetDesiredSize(this);
+      }
+    }]);
+    return ReadableStreamDefaultController;
+  }();
+  function IsReadableStreamDefaultController(x) {
+    if (!typeIsObject(x)) {
+      return false;
+    }
+    if (!Object.prototype.hasOwnProperty.call(x, '_underlyingSource')) {
+      return false;
+    }
+    return true;
+  }
+  function ReadableStreamDefaultControllerCallPullIfNeeded(controller) {
+    var shouldPull = ReadableStreamDefaultControllerShouldCallPull(controller);
+    if (shouldPull === false) {
+      return undefined;
+    }
+    if (controller._pulling === true) {
+      controller._pullAgain = true;
+      return undefined;
+    }
+    assert(controller._pullAgain === false);
+    controller._pulling = true;
+    var pullPromise = PromiseInvokeOrNoop(controller._underlyingSource, 'pull', [controller]);
+    pullPromise.then(function () {
+      controller._pulling = false;
+      if (controller._pullAgain === true) {
+        controller._pullAgain = false;
+        return ReadableStreamDefaultControllerCallPullIfNeeded(controller);
+      }
+      return undefined;
+    }, function (e) {
+      ReadableStreamDefaultControllerErrorIfNeeded(controller, e);
+    }).catch(rethrowAssertionErrorRejection);
+    return undefined;
+  }
+  function ReadableStreamDefaultControllerShouldCallPull(controller) {
+    var stream = controller._controlledReadableStream;
+    if (stream._state === 'closed' || stream._state === 'errored') {
+      return false;
+    }
+    if (controller._closeRequested === true) {
+      return false;
+    }
+    if (controller._started === false) {
+      return false;
+    }
+    if (IsReadableStreamLocked(stream) === true && ReadableStreamGetNumReadRequests(stream) > 0) {
+      return true;
+    }
+    var desiredSize = ReadableStreamDefaultControllerGetDesiredSize(controller);
+    if (desiredSize > 0) {
+      return true;
+    }
+    return false;
+  }
+  function ReadableStreamDefaultControllerClose(controller) {
+    var stream = controller._controlledReadableStream;
+    assert(controller._closeRequested === false);
+    assert(stream._state === 'readable');
+    controller._closeRequested = true;
+    if (controller._queue.length === 0) {
+      ReadableStreamClose(stream);
+    }
+  }
+  function ReadableStreamDefaultControllerEnqueue(controller, chunk) {
+    var stream = controller._controlledReadableStream;
+    assert(controller._closeRequested === false);
+    assert(stream._state === 'readable');
+    if (IsReadableStreamLocked(stream) === true && ReadableStreamGetNumReadRequests(stream) > 0) {
+      ReadableStreamFulfillReadRequest(stream, chunk, false);
+    } else {
+      var chunkSize = 1;
+      if (controller._strategySize !== undefined) {
+        var strategySize = controller._strategySize;
+        try {
+          chunkSize = strategySize(chunk);
+        } catch (chunkSizeE) {
+          ReadableStreamDefaultControllerErrorIfNeeded(controller, chunkSizeE);
+          throw chunkSizeE;
+        }
+      }
+      try {
+        EnqueueValueWithSize(controller, chunk, chunkSize);
+      } catch (enqueueE) {
+        ReadableStreamDefaultControllerErrorIfNeeded(controller, enqueueE);
+        throw enqueueE;
+      }
+    }
+    ReadableStreamDefaultControllerCallPullIfNeeded(controller);
+    return undefined;
+  }
+  function ReadableStreamDefaultControllerError(controller, e) {
+    var stream = controller._controlledReadableStream;
+    assert(stream._state === 'readable');
+    ResetQueue(controller);
+    ReadableStreamError(stream, e);
+  }
+  function ReadableStreamDefaultControllerErrorIfNeeded(controller, e) {
+    if (controller._controlledReadableStream._state === 'readable') {
+      ReadableStreamDefaultControllerError(controller, e);
+    }
+  }
+  function ReadableStreamDefaultControllerGetDesiredSize(controller) {
+    var stream = controller._controlledReadableStream;
+    var state = stream._state;
+    if (state === 'errored') {
+      return null;
+    }
+    if (state === 'closed') {
+      return 0;
+    }
+    return controller._strategyHWM - controller._queueTotalSize;
+  }
+  var ReadableStreamBYOBRequest = function () {
+    function ReadableStreamBYOBRequest(controller, view) {
+      _classCallCheck(this, ReadableStreamBYOBRequest);
+      this._associatedReadableByteStreamController = controller;
+      this._view = view;
+    }
+    _createClass(ReadableStreamBYOBRequest, [{
+      key: 'respond',
+      value: function respond(bytesWritten) {
+        if (IsReadableStreamBYOBRequest(this) === false) {
+          throw byobRequestBrandCheckException('respond');
+        }
+        if (this._associatedReadableByteStreamController === undefined) {
+          throw new TypeError('This BYOB request has been invalidated');
+        }
+        ReadableByteStreamControllerRespond(this._associatedReadableByteStreamController, bytesWritten);
+      }
+    }, {
+      key: 'respondWithNewView',
+      value: function respondWithNewView(view) {
+        if (IsReadableStreamBYOBRequest(this) === false) {
+          throw byobRequestBrandCheckException('respond');
+        }
+        if (this._associatedReadableByteStreamController === undefined) {
+          throw new TypeError('This BYOB request has been invalidated');
+        }
+        if (!ArrayBuffer.isView(view)) {
+          throw new TypeError('You can only respond with array buffer views');
+        }
+        ReadableByteStreamControllerRespondWithNewView(this._associatedReadableByteStreamController, view);
+      }
+    }, {
+      key: 'view',
+      get: function get() {
+        return this._view;
+      }
+    }]);
+    return ReadableStreamBYOBRequest;
+  }();
+  var ReadableByteStreamController = function () {
+    function ReadableByteStreamController(stream, underlyingByteSource, highWaterMark) {
+      _classCallCheck(this, ReadableByteStreamController);
+      if (IsReadableStream(stream) === false) {
+        throw new TypeError('ReadableByteStreamController can only be constructed with a ReadableStream instance given ' + 'a byte source');
+      }
+      if (stream._readableStreamController !== undefined) {
+        throw new TypeError('ReadableByteStreamController instances can only be created by the ReadableStream constructor given a byte ' + 'source');
+      }
+      this._controlledReadableStream = stream;
+      this._underlyingByteSource = underlyingByteSource;
+      this._pullAgain = false;
+      this._pulling = false;
+      ReadableByteStreamControllerClearPendingPullIntos(this);
+      this._queue = this._queueTotalSize = undefined;
+      ResetQueue(this);
+      this._closeRequested = false;
+      this._started = false;
+      this._strategyHWM = ValidateAndNormalizeHighWaterMark(highWaterMark);
+      var autoAllocateChunkSize = underlyingByteSource.autoAllocateChunkSize;
+      if (autoAllocateChunkSize !== undefined) {
+        if (Number.isInteger(autoAllocateChunkSize) === false || autoAllocateChunkSize <= 0) {
+          throw new RangeError('autoAllocateChunkSize must be a positive integer');
+        }
+      }
+      this._autoAllocateChunkSize = autoAllocateChunkSize;
+      this._pendingPullIntos = [];
+      var controller = this;
+      var startResult = InvokeOrNoop(underlyingByteSource, 'start', [this]);
+      Promise.resolve(startResult).then(function () {
+        controller._started = true;
+        assert(controller._pulling === false);
+        assert(controller._pullAgain === false);
+        ReadableByteStreamControllerCallPullIfNeeded(controller);
+      }, function (r) {
+        if (stream._state === 'readable') {
+          ReadableByteStreamControllerError(controller, r);
+        }
+      }).catch(rethrowAssertionErrorRejection);
+    }
+    _createClass(ReadableByteStreamController, [{
+      key: 'close',
+      value: function close() {
+        if (IsReadableByteStreamController(this) === false) {
+          throw byteStreamControllerBrandCheckException('close');
+        }
+        if (this._closeRequested === true) {
+          throw new TypeError('The stream has already been closed; do not close it again!');
+        }
+        var state = this._controlledReadableStream._state;
+        if (state !== 'readable') {
+          throw new TypeError('The stream (in ' + state + ' state) is not in the readable state and cannot be closed');
+        }
+        ReadableByteStreamControllerClose(this);
+      }
+    }, {
+      key: 'enqueue',
+      value: function enqueue(chunk) {
+        if (IsReadableByteStreamController(this) === false) {
+          throw byteStreamControllerBrandCheckException('enqueue');
+        }
+        if (this._closeRequested === true) {
+          throw new TypeError('stream is closed or draining');
+        }
+        var state = this._controlledReadableStream._state;
+        if (state !== 'readable') {
+          throw new TypeError('The stream (in ' + state + ' state) is not in the readable state and cannot be enqueued to');
+        }
+        if (!ArrayBuffer.isView(chunk)) {
+          throw new TypeError('You can only enqueue array buffer views when using a ReadableByteStreamController');
+        }
+        ReadableByteStreamControllerEnqueue(this, chunk);
+      }
+    }, {
+      key: 'error',
+      value: function error(e) {
+        if (IsReadableByteStreamController(this) === false) {
+          throw byteStreamControllerBrandCheckException('error');
+        }
+        var stream = this._controlledReadableStream;
+        if (stream._state !== 'readable') {
+          throw new TypeError('The stream is ' + stream._state + ' and so cannot be errored');
+        }
+        ReadableByteStreamControllerError(this, e);
+      }
+    }, {
+      key: '__cancelSteps',
+      value: function __cancelSteps(reason) {
+        if (this._pendingPullIntos.length > 0) {
+          var firstDescriptor = this._pendingPullIntos[0];
+          firstDescriptor.bytesFilled = 0;
+        }
+        ResetQueue(this);
+        return PromiseInvokeOrNoop(this._underlyingByteSource, 'cancel', [reason]);
+      }
+    }, {
+      key: '__pullSteps',
+      value: function __pullSteps() {
+        var stream = this._controlledReadableStream;
+        assert(ReadableStreamHasDefaultReader(stream) === true);
+        if (this._queueTotalSize > 0) {
+          assert(ReadableStreamGetNumReadRequests(stream) === 0);
+          var entry = this._queue.shift();
+          this._queueTotalSize -= entry.byteLength;
+          ReadableByteStreamControllerHandleQueueDrain(this);
+          var view = void 0;
+          try {
+            view = new Uint8Array(entry.buffer, entry.byteOffset, entry.byteLength);
+          } catch (viewE) {
+            return Promise.reject(viewE);
+          }
+          return Promise.resolve(CreateIterResultObject(view, false));
+        }
+        var autoAllocateChunkSize = this._autoAllocateChunkSize;
+        if (autoAllocateChunkSize !== undefined) {
+          var buffer = void 0;
+          try {
+            buffer = new ArrayBuffer(autoAllocateChunkSize);
+          } catch (bufferE) {
+            return Promise.reject(bufferE);
+          }
+          var pullIntoDescriptor = {
+            buffer: buffer,
+            byteOffset: 0,
+            byteLength: autoAllocateChunkSize,
+            bytesFilled: 0,
+            elementSize: 1,
+            ctor: Uint8Array,
+            readerType: 'default'
+          };
+          this._pendingPullIntos.push(pullIntoDescriptor);
+        }
+        var promise = ReadableStreamAddReadRequest(stream);
+        ReadableByteStreamControllerCallPullIfNeeded(this);
+        return promise;
+      }
+    }, {
+      key: 'byobRequest',
+      get: function get() {
+        if (IsReadableByteStreamController(this) === false) {
+          throw byteStreamControllerBrandCheckException('byobRequest');
+        }
+        if (this._byobRequest === undefined && this._pendingPullIntos.length > 0) {
+          var firstDescriptor = this._pendingPullIntos[0];
+          var view = new Uint8Array(firstDescriptor.buffer, firstDescriptor.byteOffset + firstDescriptor.bytesFilled, firstDescriptor.byteLength - firstDescriptor.bytesFilled);
+          this._byobRequest = new ReadableStreamBYOBRequest(this, view);
+        }
+        return this._byobRequest;
+      }
+    }, {
+      key: 'desiredSize',
+      get: function get() {
+        if (IsReadableByteStreamController(this) === false) {
+          throw byteStreamControllerBrandCheckException('desiredSize');
+        }
+        return ReadableByteStreamControllerGetDesiredSize(this);
+      }
+    }]);
+    return ReadableByteStreamController;
+  }();
+  function IsReadableByteStreamController(x) {
+    if (!typeIsObject(x)) {
+      return false;
+    }
+    if (!Object.prototype.hasOwnProperty.call(x, '_underlyingByteSource')) {
+      return false;
+    }
+    return true;
+  }
+  function IsReadableStreamBYOBRequest(x) {
+    if (!typeIsObject(x)) {
+      return false;
+    }
+    if (!Object.prototype.hasOwnProperty.call(x, '_associatedReadableByteStreamController')) {
+      return false;
+    }
+    return true;
+  }
+  function ReadableByteStreamControllerCallPullIfNeeded(controller) {
+    var shouldPull = ReadableByteStreamControllerShouldCallPull(controller);
+    if (shouldPull === false) {
+      return undefined;
+    }
+    if (controller._pulling === true) {
+      controller._pullAgain = true;
+      return undefined;
+    }
+    assert(controller._pullAgain === false);
+    controller._pulling = true;
+    var pullPromise = PromiseInvokeOrNoop(controller._underlyingByteSource, 'pull', [controller]);
+    pullPromise.then(function () {
+      controller._pulling = false;
+      if (controller._pullAgain === true) {
+        controller._pullAgain = false;
+        ReadableByteStreamControllerCallPullIfNeeded(controller);
+      }
+    }, function (e) {
+      if (controller._controlledReadableStream._state === 'readable') {
+        ReadableByteStreamControllerError(controller, e);
+      }
+    }).catch(rethrowAssertionErrorRejection);
+    return undefined;
+  }
+  function ReadableByteStreamControllerClearPendingPullIntos(controller) {
+    ReadableByteStreamControllerInvalidateBYOBRequest(controller);
+    controller._pendingPullIntos = [];
+  }
+  function ReadableByteStreamControllerCommitPullIntoDescriptor(stream, pullIntoDescriptor) {
+    assert(stream._state !== 'errored', 'state must not be errored');
+    var done = false;
+    if (stream._state === 'closed') {
+      assert(pullIntoDescriptor.bytesFilled === 0);
+      done = true;
+    }
+    var filledView = ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor);
+    if (pullIntoDescriptor.readerType === 'default') {
+      ReadableStreamFulfillReadRequest(stream, filledView, done);
+    } else {
+      assert(pullIntoDescriptor.readerType === 'byob');
+      ReadableStreamFulfillReadIntoRequest(stream, filledView, done);
+    }
+  }
+  function ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor) {
+    var bytesFilled = pullIntoDescriptor.bytesFilled;
+    var elementSize = pullIntoDescriptor.elementSize;
+    assert(bytesFilled <= pullIntoDescriptor.byteLength);
+    assert(bytesFilled % elementSize === 0);
+    return new pullIntoDescriptor.ctor(pullIntoDescriptor.buffer, pullIntoDescriptor.byteOffset, bytesFilled / elementSize);
+  }
+  function ReadableByteStreamControllerEnqueueChunkToQueue(controller, buffer, byteOffset, byteLength) {
+    controller._queue.push({
+      buffer: buffer,
+      byteOffset: byteOffset,
+      byteLength: byteLength
+    });
+    controller._queueTotalSize += byteLength;
+  }
+  function ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor) {
+    var elementSize = pullIntoDescriptor.elementSize;
+    var currentAlignedBytes = pullIntoDescriptor.bytesFilled - pullIntoDescriptor.bytesFilled % elementSize;
+    var maxBytesToCopy = Math.min(controller._queueTotalSize, pullIntoDescriptor.byteLength - pullIntoDescriptor.bytesFilled);
+    var maxBytesFilled = pullIntoDescriptor.bytesFilled + maxBytesToCopy;
+    var maxAlignedBytes = maxBytesFilled - maxBytesFilled % elementSize;
+    var totalBytesToCopyRemaining = maxBytesToCopy;
+    var ready = false;
+    if (maxAlignedBytes > currentAlignedBytes) {
+      totalBytesToCopyRemaining = maxAlignedBytes - pullIntoDescriptor.bytesFilled;
+      ready = true;
+    }
+    var queue = controller._queue;
+    while (totalBytesToCopyRemaining > 0) {
+      var headOfQueue = queue[0];
+      var bytesToCopy = Math.min(totalBytesToCopyRemaining, headOfQueue.byteLength);
+      var destStart = pullIntoDescriptor.byteOffset + pullIntoDescriptor.bytesFilled;
+      ArrayBufferCopy(pullIntoDescriptor.buffer, destStart, headOfQueue.buffer, headOfQueue.byteOffset, bytesToCopy);
+      if (headOfQueue.byteLength === bytesToCopy) {
+        queue.shift();
+      } else {
+        headOfQueue.byteOffset += bytesToCopy;
+        headOfQueue.byteLength -= bytesToCopy;
+      }
+      controller._queueTotalSize -= bytesToCopy;
+      ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, bytesToCopy, pullIntoDescriptor);
+      totalBytesToCopyRemaining -= bytesToCopy;
+    }
+    if (ready === false) {
+      assert(controller._queueTotalSize === 0, 'queue must be empty');
+      assert(pullIntoDescriptor.bytesFilled > 0);
+      assert(pullIntoDescriptor.bytesFilled < pullIntoDescriptor.elementSize);
+    }
+    return ready;
+  }
+  function ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, size, pullIntoDescriptor) {
+    assert(controller._pendingPullIntos.length === 0 || controller._pendingPullIntos[0] === pullIntoDescriptor);
+    ReadableByteStreamControllerInvalidateBYOBRequest(controller);
+    pullIntoDescriptor.bytesFilled += size;
+  }
+  function ReadableByteStreamControllerHandleQueueDrain(controller) {
+    assert(controller._controlledReadableStream._state === 'readable');
+    if (controller._queueTotalSize === 0 && controller._closeRequested === true) {
+      ReadableStreamClose(controller._controlledReadableStream);
+    } else {
+      ReadableByteStreamControllerCallPullIfNeeded(controller);
+    }
+  }
+  function ReadableByteStreamControllerInvalidateBYOBRequest(controller) {
+    if (controller._byobRequest === undefined) {
+      return;
+    }
+    controller._byobRequest._associatedReadableByteStreamController = undefined;
+    controller._byobRequest._view = undefined;
+    controller._byobRequest = undefined;
+  }
+  function ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller) {
+    assert(controller._closeRequested === false);
+    while (controller._pendingPullIntos.length > 0) {
+      if (controller._queueTotalSize === 0) {
+        return;
+      }
+      var pullIntoDescriptor = controller._pendingPullIntos[0];
+      if (ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor) === true) {
+        ReadableByteStreamControllerShiftPendingPullInto(controller);
+        ReadableByteStreamControllerCommitPullIntoDescriptor(controller._controlledReadableStream, pullIntoDescriptor);
+      }
+    }
+  }
+  function ReadableByteStreamControllerPullInto(controller, view) {
+    var stream = controller._controlledReadableStream;
+    var elementSize = 1;
+    if (view.constructor !== DataView) {
+      elementSize = view.constructor.BYTES_PER_ELEMENT;
+    }
+    var ctor = view.constructor;
+    var pullIntoDescriptor = {
+      buffer: view.buffer,
+      byteOffset: view.byteOffset,
+      byteLength: view.byteLength,
+      bytesFilled: 0,
+      elementSize: elementSize,
+      ctor: ctor,
+      readerType: 'byob'
+    };
+    if (controller._pendingPullIntos.length > 0) {
+      pullIntoDescriptor.buffer = TransferArrayBuffer(pullIntoDescriptor.buffer);
+      controller._pendingPullIntos.push(pullIntoDescriptor);
+      return ReadableStreamAddReadIntoRequest(stream);
+    }
+    if (stream._state === 'closed') {
+      var emptyView = new view.constructor(pullIntoDescriptor.buffer, pullIntoDescriptor.byteOffset, 0);
+      return Promise.resolve(CreateIterResultObject(emptyView, true));
+    }
+    if (controller._queueTotalSize > 0) {
+      if (ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor) === true) {
+        var filledView = ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor);
+        ReadableByteStreamControllerHandleQueueDrain(controller);
+        return Promise.resolve(CreateIterResultObject(filledView, false));
+      }
+      if (controller._closeRequested === true) {
+        var e = new TypeError('Insufficient bytes to fill elements in the given buffer');
+        ReadableByteStreamControllerError(controller, e);
+        return Promise.reject(e);
+      }
+    }
+    pullIntoDescriptor.buffer = TransferArrayBuffer(pullIntoDescriptor.buffer);
+    controller._pendingPullIntos.push(pullIntoDescriptor);
+    var promise = ReadableStreamAddReadIntoRequest(stream);
+    ReadableByteStreamControllerCallPullIfNeeded(controller);
+    return promise;
+  }
+  function ReadableByteStreamControllerRespondInClosedState(controller, firstDescriptor) {
+    firstDescriptor.buffer = TransferArrayBuffer(firstDescriptor.buffer);
+    assert(firstDescriptor.bytesFilled === 0, 'bytesFilled must be 0');
+    var stream = controller._controlledReadableStream;
+    if (ReadableStreamHasBYOBReader(stream) === true) {
+      while (ReadableStreamGetNumReadIntoRequests(stream) > 0) {
+        var pullIntoDescriptor = ReadableByteStreamControllerShiftPendingPullInto(controller);
+        ReadableByteStreamControllerCommitPullIntoDescriptor(stream, pullIntoDescriptor);
+      }
+    }
+  }
+  function ReadableByteStreamControllerRespondInReadableState(controller, bytesWritten, pullIntoDescriptor) {
+    if (pullIntoDescriptor.bytesFilled + bytesWritten > pullIntoDescriptor.byteLength) {
+      throw new RangeError('bytesWritten out of range');
+    }
+    ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, bytesWritten, pullIntoDescriptor);
+    if (pullIntoDescriptor.bytesFilled < pullIntoDescriptor.elementSize) {
+      return;
+    }
+    ReadableByteStreamControllerShiftPendingPullInto(controller);
+    var remainderSize = pullIntoDescriptor.bytesFilled % pullIntoDescriptor.elementSize;
+    if (remainderSize > 0) {
+      var end = pullIntoDescriptor.byteOffset + pullIntoDescriptor.bytesFilled;
+      var remainder = pullIntoDescriptor.buffer.slice(end - remainderSize, end);
+      ReadableByteStreamControllerEnqueueChunkToQueue(controller, remainder, 0, remainder.byteLength);
+    }
+    pullIntoDescriptor.buffer = TransferArrayBuffer(pullIntoDescriptor.buffer);
+    pullIntoDescriptor.bytesFilled -= remainderSize;
+    ReadableByteStreamControllerCommitPullIntoDescriptor(controller._controlledReadableStream, pullIntoDescriptor);
+    ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller);
+  }
+  function ReadableByteStreamControllerRespondInternal(controller, bytesWritten) {
+    var firstDescriptor = controller._pendingPullIntos[0];
+    var stream = controller._controlledReadableStream;
+    if (stream._state === 'closed') {
+      if (bytesWritten !== 0) {
+        throw new TypeError('bytesWritten must be 0 when calling respond() on a closed stream');
+      }
+      ReadableByteStreamControllerRespondInClosedState(controller, firstDescriptor);
+    } else {
+      assert(stream._state === 'readable');
+      ReadableByteStreamControllerRespondInReadableState(controller, bytesWritten, firstDescriptor);
+    }
+  }
+  function ReadableByteStreamControllerShiftPendingPullInto(controller) {
+    var descriptor = controller._pendingPullIntos.shift();
+    ReadableByteStreamControllerInvalidateBYOBRequest(controller);
+    return descriptor;
+  }
+  function ReadableByteStreamControllerShouldCallPull(controller) {
+    var stream = controller._controlledReadableStream;
+    if (stream._state !== 'readable') {
+      return false;
+    }
+    if (controller._closeRequested === true) {
+      return false;
+    }
+    if (controller._started === false) {
+      return false;
+    }
+    if (ReadableStreamHasDefaultReader(stream) === true && ReadableStreamGetNumReadRequests(stream) > 0) {
+      return true;
+    }
+    if (ReadableStreamHasBYOBReader(stream) === true && ReadableStreamGetNumReadIntoRequests(stream) > 0) {
+      return true;
+    }
+    if (ReadableByteStreamControllerGetDesiredSize(controller) > 0) {
+      return true;
+    }
+    return false;
+  }
+  function ReadableByteStreamControllerClose(controller) {
+    var stream = controller._controlledReadableStream;
+    assert(controller._closeRequested === false);
+    assert(stream._state === 'readable');
+    if (controller._queueTotalSize > 0) {
+      controller._closeRequested = true;
+      return;
+    }
+    if (controller._pendingPullIntos.length > 0) {
+      var firstPendingPullInto = controller._pendingPullIntos[0];
+      if (firstPendingPullInto.bytesFilled > 0) {
+        var e = new TypeError('Insufficient bytes to fill elements in the given buffer');
+        ReadableByteStreamControllerError(controller, e);
+        throw e;
+      }
+    }
+    ReadableStreamClose(stream);
+  }
+  function ReadableByteStreamControllerEnqueue(controller, chunk) {
+    var stream = controller._controlledReadableStream;
+    assert(controller._closeRequested === false);
+    assert(stream._state === 'readable');
+    var buffer = chunk.buffer;
+    var byteOffset = chunk.byteOffset;
+    var byteLength = chunk.byteLength;
+    var transferredBuffer = TransferArrayBuffer(buffer);
+    if (ReadableStreamHasDefaultReader(stream) === true) {
+      if (ReadableStreamGetNumReadRequests(stream) === 0) {
+        ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength);
+      } else {
+        assert(controller._queue.length === 0);
+        var transferredView = new Uint8Array(transferredBuffer, byteOffset, byteLength);
+        ReadableStreamFulfillReadRequest(stream, transferredView, false);
+      }
+    } else if (ReadableStreamHasBYOBReader(stream) === true) {
+      ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength);
+      ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller);
+    } else {
+      assert(IsReadableStreamLocked(stream) === false, 'stream must not be locked');
+      ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength);
+    }
+  }
+  function ReadableByteStreamControllerError(controller, e) {
+    var stream = controller._controlledReadableStream;
+    assert(stream._state === 'readable');
+    ReadableByteStreamControllerClearPendingPullIntos(controller);
+    ResetQueue(controller);
+    ReadableStreamError(stream, e);
+  }
+  function ReadableByteStreamControllerGetDesiredSize(controller) {
+    var stream = controller._controlledReadableStream;
+    var state = stream._state;
+    if (state === 'errored') {
+      return null;
+    }
+    if (state === 'closed') {
+      return 0;
+    }
+    return controller._strategyHWM - controller._queueTotalSize;
+  }
+  function ReadableByteStreamControllerRespond(controller, bytesWritten) {
+    bytesWritten = Number(bytesWritten);
+    if (IsFiniteNonNegativeNumber(bytesWritten) === false) {
+      throw new RangeError('bytesWritten must be a finite');
+    }
+    assert(controller._pendingPullIntos.length > 0);
+    ReadableByteStreamControllerRespondInternal(controller, bytesWritten);
+  }
+  function ReadableByteStreamControllerRespondWithNewView(controller, view) {
+    assert(controller._pendingPullIntos.length > 0);
+    var firstDescriptor = controller._pendingPullIntos[0];
+    if (firstDescriptor.byteOffset + firstDescriptor.bytesFilled !== view.byteOffset) {
+      throw new RangeError('The region specified by view does not match byobRequest');
+    }
+    if (firstDescriptor.byteLength !== view.byteLength) {
+      throw new RangeError('The buffer of view has different capacity than byobRequest');
+    }
+    firstDescriptor.buffer = view.buffer;
+    ReadableByteStreamControllerRespondInternal(controller, view.byteLength);
+  }
+  function streamBrandCheckException(name) {
+    return new TypeError('ReadableStream.prototype.' + name + ' can only be used on a ReadableStream');
+  }
+  function readerLockException(name) {
+    return new TypeError('Cannot ' + name + ' a stream using a released reader');
+  }
+  function defaultReaderBrandCheckException(name) {
+    return new TypeError('ReadableStreamDefaultReader.prototype.' + name + ' can only be used on a ReadableStreamDefaultReader');
+  }
+  function defaultReaderClosedPromiseInitialize(reader) {
+    reader._closedPromise = new Promise(function (resolve, reject) {
+      reader._closedPromise_resolve = resolve;
+      reader._closedPromise_reject = reject;
+    });
+  }
+  function defaultReaderClosedPromiseInitializeAsRejected(reader, reason) {
+    reader._closedPromise = Promise.reject(reason);
+    reader._closedPromise_resolve = undefined;
+    reader._closedPromise_reject = undefined;
+  }
+  function defaultReaderClosedPromiseInitializeAsResolved(reader) {
+    reader._closedPromise = Promise.resolve(undefined);
+    reader._closedPromise_resolve = undefined;
+    reader._closedPromise_reject = undefined;
+  }
+  function defaultReaderClosedPromiseReject(reader, reason) {
+    assert(reader._closedPromise_resolve !== undefined);
+    assert(reader._closedPromise_reject !== undefined);
+    reader._closedPromise_reject(reason);
+    reader._closedPromise_resolve = undefined;
+    reader._closedPromise_reject = undefined;
+  }
+  function defaultReaderClosedPromiseResetToRejected(reader, reason) {
+    assert(reader._closedPromise_resolve === undefined);
+    assert(reader._closedPromise_reject === undefined);
+    reader._closedPromise = Promise.reject(reason);
+  }
+  function defaultReaderClosedPromiseResolve(reader) {
+    assert(reader._closedPromise_resolve !== undefined);
+    assert(reader._closedPromise_reject !== undefined);
+    reader._closedPromise_resolve(undefined);
+    reader._closedPromise_resolve = undefined;
+    reader._closedPromise_reject = undefined;
+  }
+  function byobReaderBrandCheckException(name) {
+    return new TypeError('ReadableStreamBYOBReader.prototype.' + name + ' can only be used on a ReadableStreamBYOBReader');
+  }
+  function defaultControllerBrandCheckException(name) {
+    return new TypeError('ReadableStreamDefaultController.prototype.' + name + ' can only be used on a ReadableStreamDefaultController');
+  }
+  function byobRequestBrandCheckException(name) {
+    return new TypeError('ReadableStreamBYOBRequest.prototype.' + name + ' can only be used on a ReadableStreamBYOBRequest');
+  }
+  function byteStreamControllerBrandCheckException(name) {
+    return new TypeError('ReadableByteStreamController.prototype.' + name + ' can only be used on a ReadableByteStreamController');
+  }
+  function ifIsObjectAndHasAPromiseIsHandledInternalSlotSetPromiseIsHandledToTrue(promise) {
+    try {
+      Promise.prototype.then.call(promise, undefined, function () {});
+    } catch (e) {}
+  }
+}, function (module, exports, __w_pdfjs_require__) {
+  "use strict";
+
+  var transformStream = __w_pdfjs_require__(6);
+  var readableStream = __w_pdfjs_require__(4);
+  var writableStream = __w_pdfjs_require__(2);
+  exports.TransformStream = transformStream.TransformStream;
+  exports.ReadableStream = readableStream.ReadableStream;
+  exports.IsReadableStreamDisturbed = readableStream.IsReadableStreamDisturbed;
+  exports.ReadableStreamDefaultControllerClose = readableStream.ReadableStreamDefaultControllerClose;
+  exports.ReadableStreamDefaultControllerEnqueue = readableStream.ReadableStreamDefaultControllerEnqueue;
+  exports.ReadableStreamDefaultControllerError = readableStream.ReadableStreamDefaultControllerError;
+  exports.ReadableStreamDefaultControllerGetDesiredSize = readableStream.ReadableStreamDefaultControllerGetDesiredSize;
+  exports.AcquireWritableStreamDefaultWriter = writableStream.AcquireWritableStreamDefaultWriter;
+  exports.IsWritableStream = writableStream.IsWritableStream;
+  exports.IsWritableStreamLocked = writableStream.IsWritableStreamLocked;
+  exports.WritableStream = writableStream.WritableStream;
+  exports.WritableStreamAbort = writableStream.WritableStreamAbort;
+  exports.WritableStreamDefaultControllerError = writableStream.WritableStreamDefaultControllerError;
+  exports.WritableStreamDefaultWriterCloseWithErrorPropagation = writableStream.WritableStreamDefaultWriterCloseWithErrorPropagation;
+  exports.WritableStreamDefaultWriterRelease = writableStream.WritableStreamDefaultWriterRelease;
+  exports.WritableStreamDefaultWriterWrite = writableStream.WritableStreamDefaultWriterWrite;
+}, function (module, exports, __w_pdfjs_require__) {
+  "use strict";
+
+  var _createClass = function () {
+    function defineProperties(target, props) {
+      for (var i = 0; i < props.length; i++) {
+        var descriptor = props[i];
+        descriptor.enumerable = descriptor.enumerable || false;
+        descriptor.configurable = true;
+        if ("value" in descriptor) descriptor.writable = true;
+        Object.defineProperty(target, descriptor.key, descriptor);
+      }
+    }
+    return function (Constructor, protoProps, staticProps) {
+      if (protoProps) defineProperties(Constructor.prototype, protoProps);
+      if (staticProps) defineProperties(Constructor, staticProps);
+      return Constructor;
+    };
+  }();
+  function _classCallCheck(instance, Constructor) {
+    if (!(instance instanceof Constructor)) {
+      throw new TypeError("Cannot call a class as a function");
+    }
+  }
+  var _require = __w_pdfjs_require__(1),
+      assert = _require.assert;
+  var _require2 = __w_pdfjs_require__(0),
+      InvokeOrNoop = _require2.InvokeOrNoop,
+      PromiseInvokeOrPerformFallback = _require2.PromiseInvokeOrPerformFallback,
+      PromiseInvokeOrNoop = _require2.PromiseInvokeOrNoop,
+      typeIsObject = _require2.typeIsObject;
+  var _require3 = __w_pdfjs_require__(4),
+      ReadableStream = _require3.ReadableStream,
+      ReadableStreamDefaultControllerClose = _require3.ReadableStreamDefaultControllerClose,
+      ReadableStreamDefaultControllerEnqueue = _require3.ReadableStreamDefaultControllerEnqueue,
+      ReadableStreamDefaultControllerError = _require3.ReadableStreamDefaultControllerError,
+      ReadableStreamDefaultControllerGetDesiredSize = _require3.ReadableStreamDefaultControllerGetDesiredSize;
+  var _require4 = __w_pdfjs_require__(2),
+      WritableStream = _require4.WritableStream,
+      WritableStreamDefaultControllerError = _require4.WritableStreamDefaultControllerError;
+  function TransformStreamCloseReadable(transformStream) {
+    if (transformStream._errored === true) {
+      throw new TypeError('TransformStream is already errored');
+    }
+    if (transformStream._readableClosed === true) {
+      throw new TypeError('Readable side is already closed');
+    }
+    TransformStreamCloseReadableInternal(transformStream);
+  }
+  function TransformStreamEnqueueToReadable(transformStream, chunk) {
+    if (transformStream._errored === true) {
+      throw new TypeError('TransformStream is already errored');
+    }
+    if (transformStream._readableClosed === true) {
+      throw new TypeError('Readable side is already closed');
+    }
+    var controller = transformStream._readableController;
+    try {
+      ReadableStreamDefaultControllerEnqueue(controller, chunk);
+    } catch (e) {
+      transformStream._readableClosed = true;
+      TransformStreamErrorIfNeeded(transformStream, e);
+      throw transformStream._storedError;
+    }
+    var desiredSize = ReadableStreamDefaultControllerGetDesiredSize(controller);
+    var maybeBackpressure = desiredSize <= 0;
+    if (maybeBackpressure === true && transformStream._backpressure === false) {
+      TransformStreamSetBackpressure(transformStream, true);
+    }
+  }
+  function TransformStreamError(transformStream, e) {
+    if (transformStream._errored === true) {
+      throw new TypeError('TransformStream is already errored');
+    }
+    TransformStreamErrorInternal(transformStream, e);
+  }
+  function TransformStreamCloseReadableInternal(transformStream) {
+    assert(transformStream._errored === false);
+    assert(transformStream._readableClosed === false);
+    try {
+      ReadableStreamDefaultControllerClose(transformStream._readableController);
+    } catch (e) {
+      assert(false);
+    }
+    transformStream._readableClosed = true;
+  }
+  function TransformStreamErrorIfNeeded(transformStream, e) {
+    if (transformStream._errored === false) {
+      TransformStreamErrorInternal(transformStream, e);
+    }
+  }
+  function TransformStreamErrorInternal(transformStream, e) {
+    assert(transformStream._errored === false);
+    transformStream._errored = true;
+    transformStream._storedError = e;
+    if (transformStream._writableDone === false) {
+      WritableStreamDefaultControllerError(transformStream._writableController, e);
+    }
+    if (transformStream._readableClosed === false) {
+      ReadableStreamDefaultControllerError(transformStream._readableController, e);
+    }
+  }
+  function TransformStreamReadableReadyPromise(transformStream) {
+    assert(transformStream._backpressureChangePromise !== undefined, '_backpressureChangePromise should have been initialized');
+    if (transformStream._backpressure === false) {
+      return Promise.resolve();
+    }
+    assert(transformStream._backpressure === true, '_backpressure should have been initialized');
+    return transformStream._backpressureChangePromise;
+  }
+  function TransformStreamSetBackpressure(transformStream, backpressure) {
+    assert(transformStream._backpressure !== backpressure, 'TransformStreamSetBackpressure() should be called only when backpressure is changed');
+    if (transformStream._backpressureChangePromise !== undefined) {
+      transformStream._backpressureChangePromise_resolve(backpressure);
+    }
+    transformStream._backpressureChangePromise = new Promise(function (resolve) {
+      transformStream._backpressureChangePromise_resolve = resolve;
+    });
+    transformStream._backpressureChangePromise.then(function (resolution) {
+      assert(resolution !== backpressure, '_backpressureChangePromise should be fulfilled only when backpressure is changed');
+    });
+    transformStream._backpressure = backpressure;
+  }
+  function TransformStreamDefaultTransform(chunk, transformStreamController) {
+    var transformStream = transformStreamController._controlledTransformStream;
+    TransformStreamEnqueueToReadable(transformStream, chunk);
+    return Promise.resolve();
+  }
+  function TransformStreamTransform(transformStream, chunk) {
+    assert(transformStream._errored === false);
+    assert(transformStream._transforming === false);
+    assert(transformStream._backpressure === false);
+    transformStream._transforming = true;
+    var transformer = transformStream._transformer;
+    var controller = transformStream._transformStreamController;
+    var transformPromise = PromiseInvokeOrPerformFallback(transformer, 'transform', [chunk, controller], TransformStreamDefaultTransform, [chunk, controller]);
+    return transformPromise.then(function () {
+      transformStream._transforming = false;
+      return TransformStreamReadableReadyPromise(transformStream);
+    }, function (e) {
+      TransformStreamErrorIfNeeded(transformStream, e);
+      return Promise.reject(e);
+    });
+  }
+  function IsTransformStreamDefaultController(x) {
+    if (!typeIsObject(x)) {
+      return false;
+    }
+    if (!Object.prototype.hasOwnProperty.call(x, '_controlledTransformStream')) {
+      return false;
+    }
+    return true;
+  }
+  function IsTransformStream(x) {
+    if (!typeIsObject(x)) {
+      return false;
+    }
+    if (!Object.prototype.hasOwnProperty.call(x, '_transformStreamController')) {
+      return false;
+    }
+    return true;
+  }
+  var TransformStreamSink = function () {
+    function TransformStreamSink(transformStream, startPromise) {
+      _classCallCheck(this, TransformStreamSink);
+      this._transformStream = transformStream;
+      this._startPromise = startPromise;
+    }
+    _createClass(TransformStreamSink, [{
+      key: 'start',
+      value: function start(c) {
+        var transformStream = this._transformStream;
+        transformStream._writableController = c;
+        return this._startPromise.then(function () {
+          return TransformStreamReadableReadyPromise(transformStream);
+        });
+      }
+    }, {
+      key: 'write',
+      value: function write(chunk) {
+        var transformStream = this._transformStream;
+        return TransformStreamTransform(transformStream, chunk);
+      }
+    }, {
+      key: 'abort',
+      value: function abort() {
+        var transformStream = this._transformStream;
+        transformStream._writableDone = true;
+        TransformStreamErrorInternal(transformStream, new TypeError('Writable side aborted'));
+      }
+    }, {
+      key: 'close',
+      value: function close() {
+        var transformStream = this._transformStream;
+        assert(transformStream._transforming === false);
+        transformStream._writableDone = true;
+        var flushPromise = PromiseInvokeOrNoop(transformStream._transformer, 'flush', [transformStream._transformStreamController]);
+        return flushPromise.then(function () {
+          if (transformStream._errored === true) {
+            return Promise.reject(transformStream._storedError);
+          }
+          if (transformStream._readableClosed === false) {
+            TransformStreamCloseReadableInternal(transformStream);
+          }
+          return Promise.resolve();
+        }).catch(function (r) {
+          TransformStreamErrorIfNeeded(transformStream, r);
+          return Promise.reject(transformStream._storedError);
+        });
+      }
+    }]);
+    return TransformStreamSink;
+  }();
+  var TransformStreamSource = function () {
+    function TransformStreamSource(transformStream, startPromise) {
+      _classCallCheck(this, TransformStreamSource);
+      this._transformStream = transformStream;
+      this._startPromise = startPromise;
+    }
+    _createClass(TransformStreamSource, [{
+      key: 'start',
+      value: function start(c) {
+        var transformStream = this._transformStream;
+        transformStream._readableController = c;
+        return this._startPromise.then(function () {
+          assert(transformStream._backpressureChangePromise !== undefined, '_backpressureChangePromise should have been initialized');
+          if (transformStream._backpressure === true) {
+            return Promise.resolve();
+          }
+          assert(transformStream._backpressure === false, '_backpressure should have been initialized');
+          return transformStream._backpressureChangePromise;
+        });
+      }
+    }, {
+      key: 'pull',
+      value: function pull() {
+        var transformStream = this._transformStream;
+        assert(transformStream._backpressure === true, 'pull() should be never called while _backpressure is false');
+        assert(transformStream._backpressureChangePromise !== undefined, '_backpressureChangePromise should have been initialized');
+        TransformStreamSetBackpressure(transformStream, false);
+        return transformStream._backpressureChangePromise;
+      }
+    }, {
+      key: 'cancel',
+      value: function cancel() {
+        var transformStream = this._transformStream;
+        transformStream._readableClosed = true;
+        TransformStreamErrorInternal(transformStream, new TypeError('Readable side canceled'));
+      }
+    }]);
+    return TransformStreamSource;
+  }();
+  var TransformStreamDefaultController = function () {
+    function TransformStreamDefaultController(transformStream) {
+      _classCallCheck(this, TransformStreamDefaultController);
+      if (IsTransformStream(transformStream) === false) {
+        throw new TypeError('TransformStreamDefaultController can only be ' + 'constructed with a TransformStream instance');
+      }
+      if (transformStream._transformStreamController !== undefined) {
+        throw new TypeError('TransformStreamDefaultController instances can ' + 'only be created by the TransformStream constructor');
+      }
+      this._controlledTransformStream = transformStream;
+    }
+    _createClass(TransformStreamDefaultController, [{
+      key: 'enqueue',
+      value: function enqueue(chunk) {
+        if (IsTransformStreamDefaultController(this) === false) {
+          throw defaultControllerBrandCheckException('enqueue');
+        }
+        TransformStreamEnqueueToReadable(this._controlledTransformStream, chunk);
+      }
+    }, {
+      key: 'close',
+      value: function close() {
+        if (IsTransformStreamDefaultController(this) === false) {
+          throw defaultControllerBrandCheckException('close');
+        }
+        TransformStreamCloseReadable(this._controlledTransformStream);
+      }
+    }, {
+      key: 'error',
+      value: function error(reason) {
+        if (IsTransformStreamDefaultController(this) === false) {
+          throw defaultControllerBrandCheckException('error');
+        }
+        TransformStreamError(this._controlledTransformStream, reason);
+      }
+    }, {
+      key: 'desiredSize',
+      get: function get() {
+        if (IsTransformStreamDefaultController(this) === false) {
+          throw defaultControllerBrandCheckException('desiredSize');
+        }
+        var transformStream = this._controlledTransformStream;
+        var readableController = transformStream._readableController;
+        return ReadableStreamDefaultControllerGetDesiredSize(readableController);
+      }
+    }]);
+    return TransformStreamDefaultController;
+  }();
+  var TransformStream = function () {
+    function TransformStream() {
+      var transformer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+      _classCallCheck(this, TransformStream);
+      this._transformer = transformer;
+      var readableStrategy = transformer.readableStrategy,
+          writableStrategy = transformer.writableStrategy;
+      this._transforming = false;
+      this._errored = false;
+      this._storedError = undefined;
+      this._writableController = undefined;
+      this._readableController = undefined;
+      this._transformStreamController = undefined;
+      this._writableDone = false;
+      this._readableClosed = false;
+      this._backpressure = undefined;
+      this._backpressureChangePromise = undefined;
+      this._backpressureChangePromise_resolve = undefined;
+      this._transformStreamController = new TransformStreamDefaultController(this);
+      var startPromise_resolve = void 0;
+      var startPromise = new Promise(function (resolve) {
+        startPromise_resolve = resolve;
+      });
+      var source = new TransformStreamSource(this, startPromise);
+      this._readable = new ReadableStream(source, readableStrategy);
+      var sink = new TransformStreamSink(this, startPromise);
+      this._writable = new WritableStream(sink, writableStrategy);
+      assert(this._writableController !== undefined);
+      assert(this._readableController !== undefined);
+      var desiredSize = ReadableStreamDefaultControllerGetDesiredSize(this._readableController);
+      TransformStreamSetBackpressure(this, desiredSize <= 0);
+      var transformStream = this;
+      var startResult = InvokeOrNoop(transformer, 'start', [transformStream._transformStreamController]);
+      startPromise_resolve(startResult);
+      startPromise.catch(function (e) {
+        if (transformStream._errored === false) {
+          transformStream._errored = true;
+          transformStream._storedError = e;
+        }
+      });
+    }
+    _createClass(TransformStream, [{
+      key: 'readable',
+      get: function get() {
+        if (IsTransformStream(this) === false) {
+          throw streamBrandCheckException('readable');
+        }
+        return this._readable;
+      }
+    }, {
+      key: 'writable',
+      get: function get() {
+        if (IsTransformStream(this) === false) {
+          throw streamBrandCheckException('writable');
+        }
+        return this._writable;
+      }
+    }]);
+    return TransformStream;
+  }();
+  module.exports = { TransformStream: TransformStream };
+  function defaultControllerBrandCheckException(name) {
+    return new TypeError('TransformStreamDefaultController.prototype.' + name + ' can only be used on a TransformStreamDefaultController');
+  }
+  function streamBrandCheckException(name) {
+    return new TypeError('TransformStream.prototype.' + name + ' can only be used on a TransformStream');
+  }
+}, function (module, exports, __w_pdfjs_require__) {
+  module.exports = __w_pdfjs_require__(5);
+}]));
+
+/***/ }),
+/* 127 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+{
+  var isURLSupported = false;
+  try {
+    if (typeof URL === 'function' && _typeof(URL.prototype) === 'object' && 'origin' in URL.prototype) {
+      var u = new URL('b', 'http://a');
+      u.pathname = 'c%20d';
+      isURLSupported = u.href === 'http://a/c%20d';
+    }
+  } catch (ex) {}
+  if (isURLSupported) {
+    exports.URL = URL;
+  } else {
+    var PolyfillURL = __w_pdfjs_require__(128).URL;
+    var OriginalURL = __w_pdfjs_require__(3).URL;
+    if (OriginalURL) {
+      PolyfillURL.createObjectURL = function (blob) {
+        return OriginalURL.createObjectURL.apply(OriginalURL, arguments);
+      };
+      PolyfillURL.revokeObjectURL = function (url) {
+        OriginalURL.revokeObjectURL(url);
+      };
+    }
+    exports.URL = PolyfillURL;
+  }
+}
+
+/***/ }),
+/* 128 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+(function URLConstructorClosure() {
+  'use strict';
+
+  var relative = Object.create(null);
+  relative['ftp'] = 21;
+  relative['file'] = 0;
+  relative['gopher'] = 70;
+  relative['http'] = 80;
+  relative['https'] = 443;
+  relative['ws'] = 80;
+  relative['wss'] = 443;
+  var relativePathDotMapping = Object.create(null);
+  relativePathDotMapping['%2e'] = '.';
+  relativePathDotMapping['.%2e'] = '..';
+  relativePathDotMapping['%2e.'] = '..';
+  relativePathDotMapping['%2e%2e'] = '..';
+  function isRelativeScheme(scheme) {
+    return relative[scheme] !== undefined;
+  }
+  function invalid() {
+    clear.call(this);
+    this._isInvalid = true;
+  }
+  function IDNAToASCII(h) {
+    if (h === '') {
+      invalid.call(this);
+    }
+    return h.toLowerCase();
+  }
+  function percentEscape(c) {
+    var unicode = c.charCodeAt(0);
+    if (unicode > 0x20 && unicode < 0x7F && [0x22, 0x23, 0x3C, 0x3E, 0x3F, 0x60].indexOf(unicode) === -1) {
+      return c;
+    }
+    return encodeURIComponent(c);
+  }
+  function percentEscapeQuery(c) {
+    var unicode = c.charCodeAt(0);
+    if (unicode > 0x20 && unicode < 0x7F && [0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) === -1) {
+      return c;
+    }
+    return encodeURIComponent(c);
+  }
+  var EOF,
+      ALPHA = /[a-zA-Z]/,
+      ALPHANUMERIC = /[a-zA-Z0-9\+\-\.]/;
+  function parse(input, stateOverride, base) {
+    function err(message) {
+      errors.push(message);
+    }
+    var state = stateOverride || 'scheme start',
+        cursor = 0,
+        buffer = '',
+        seenAt = false,
+        seenBracket = false,
+        errors = [];
+    loop: while ((input[cursor - 1] !== EOF || cursor === 0) && !this._isInvalid) {
+      var c = input[cursor];
+      switch (state) {
+        case 'scheme start':
+          if (c && ALPHA.test(c)) {
+            buffer += c.toLowerCase();
+            state = 'scheme';
+          } else if (!stateOverride) {
+            buffer = '';
+            state = 'no scheme';
+            continue;
+          } else {
+            err('Invalid scheme.');
+            break loop;
+          }
+          break;
+        case 'scheme':
+          if (c && ALPHANUMERIC.test(c)) {
+            buffer += c.toLowerCase();
+          } else if (c === ':') {
+            this._scheme = buffer;
+            buffer = '';
+            if (stateOverride) {
+              break loop;
+            }
+            if (isRelativeScheme(this._scheme)) {
+              this._isRelative = true;
+            }
+            if (this._scheme === 'file') {
+              state = 'relative';
+            } else if (this._isRelative && base && base._scheme === this._scheme) {
+              state = 'relative or authority';
+            } else if (this._isRelative) {
+              state = 'authority first slash';
+            } else {
+              state = 'scheme data';
+            }
+          } else if (!stateOverride) {
+            buffer = '';
+            cursor = 0;
+            state = 'no scheme';
+            continue;
+          } else if (c === EOF) {
+            break loop;
+          } else {
+            err('Code point not allowed in scheme: ' + c);
+            break loop;
+          }
+          break;
+        case 'scheme data':
+          if (c === '?') {
+            this._query = '?';
+            state = 'query';
+          } else if (c === '#') {
+            this._fragment = '#';
+            state = 'fragment';
+          } else {
+            if (c !== EOF && c !== '\t' && c !== '\n' && c !== '\r') {
+              this._schemeData += percentEscape(c);
+            }
+          }
+          break;
+        case 'no scheme':
+          if (!base || !isRelativeScheme(base._scheme)) {
+            err('Missing scheme.');
+            invalid.call(this);
+          } else {
+            state = 'relative';
+            continue;
+          }
+          break;
+        case 'relative or authority':
+          if (c === '/' && input[cursor + 1] === '/') {
+            state = 'authority ignore slashes';
+          } else {
+            err('Expected /, got: ' + c);
+            state = 'relative';
+            continue;
+          }
+          break;
+        case 'relative':
+          this._isRelative = true;
+          if (this._scheme !== 'file') {
+            this._scheme = base._scheme;
+          }
+          if (c === EOF) {
+            this._host = base._host;
+            this._port = base._port;
+            this._path = base._path.slice();
+            this._query = base._query;
+            this._username = base._username;
+            this._password = base._password;
+            break loop;
+          } else if (c === '/' || c === '\\') {
+            if (c === '\\') {
+              err('\\ is an invalid code point.');
+            }
+            state = 'relative slash';
+          } else if (c === '?') {
+            this._host = base._host;
+            this._port = base._port;
+            this._path = base._path.slice();
+            this._query = '?';
+            this._username = base._username;
+            this._password = base._password;
+            state = 'query';
+          } else if (c === '#') {
+            this._host = base._host;
+            this._port = base._port;
+            this._path = base._path.slice();
+            this._query = base._query;
+            this._fragment = '#';
+            this._username = base._username;
+            this._password = base._password;
+            state = 'fragment';
+          } else {
+            var nextC = input[cursor + 1];
+            var nextNextC = input[cursor + 2];
+            if (this._scheme !== 'file' || !ALPHA.test(c) || nextC !== ':' && nextC !== '|' || nextNextC !== EOF && nextNextC !== '/' && nextNextC !== '\\' && nextNextC !== '?' && nextNextC !== '#') {
+              this._host = base._host;
+              this._port = base._port;
+              this._username = base._username;
+              this._password = base._password;
+              this._path = base._path.slice();
+              this._path.pop();
+            }
+            state = 'relative path';
+            continue;
+          }
+          break;
+        case 'relative slash':
+          if (c === '/' || c === '\\') {
+            if (c === '\\') {
+              err('\\ is an invalid code point.');
+            }
+            if (this._scheme === 'file') {
+              state = 'file host';
+            } else {
+              state = 'authority ignore slashes';
+            }
+          } else {
+            if (this._scheme !== 'file') {
+              this._host = base._host;
+              this._port = base._port;
+              this._username = base._username;
+              this._password = base._password;
+            }
+            state = 'relative path';
+            continue;
+          }
+          break;
+        case 'authority first slash':
+          if (c === '/') {
+            state = 'authority second slash';
+          } else {
+            err('Expected \'/\', got: ' + c);
+            state = 'authority ignore slashes';
+            continue;
+          }
+          break;
+        case 'authority second slash':
+          state = 'authority ignore slashes';
+          if (c !== '/') {
+            err('Expected \'/\', got: ' + c);
+            continue;
+          }
+          break;
+        case 'authority ignore slashes':
+          if (c !== '/' && c !== '\\') {
+            state = 'authority';
+            continue;
+          } else {
+            err('Expected authority, got: ' + c);
+          }
+          break;
+        case 'authority':
+          if (c === '@') {
+            if (seenAt) {
+              err('@ already seen.');
+              buffer += '%40';
+            }
+            seenAt = true;
+            for (var i = 0; i < buffer.length; i++) {
+              var cp = buffer[i];
+              if (cp === '\t' || cp === '\n' || cp === '\r') {
+                err('Invalid whitespace in authority.');
+                continue;
+              }
+              if (cp === ':' && this._password === null) {
+                this._password = '';
+                continue;
+              }
+              var tempC = percentEscape(cp);
+              if (this._password !== null) {
+                this._password += tempC;
+              } else {
+                this._username += tempC;
+              }
+            }
+            buffer = '';
+          } else if (c === EOF || c === '/' || c === '\\' || c === '?' || c === '#') {
+            cursor -= buffer.length;
+            buffer = '';
+            state = 'host';
+            continue;
+          } else {
+            buffer += c;
+          }
+          break;
+        case 'file host':
+          if (c === EOF || c === '/' || c === '\\' || c === '?' || c === '#') {
+            if (buffer.length === 2 && ALPHA.test(buffer[0]) && (buffer[1] === ':' || buffer[1] === '|')) {
+              state = 'relative path';
+            } else if (buffer.length === 0) {
+              state = 'relative path start';
+            } else {
+              this._host = IDNAToASCII.call(this, buffer);
+              buffer = '';
+              state = 'relative path start';
+            }
+            continue;
+          } else if (c === '\t' || c === '\n' || c === '\r') {
+            err('Invalid whitespace in file host.');
+          } else {
+            buffer += c;
+          }
+          break;
+        case 'host':
+        case 'hostname':
+          if (c === ':' && !seenBracket) {
+            this._host = IDNAToASCII.call(this, buffer);
+            buffer = '';
+            state = 'port';
+            if (stateOverride === 'hostname') {
+              break loop;
+            }
+          } else if (c === EOF || c === '/' || c === '\\' || c === '?' || c === '#') {
+            this._host = IDNAToASCII.call(this, buffer);
+            buffer = '';
+            state = 'relative path start';
+            if (stateOverride) {
+              break loop;
+            }
+            continue;
+          } else if (c !== '\t' && c !== '\n' && c !== '\r') {
+            if (c === '[') {
+              seenBracket = true;
+            } else if (c === ']') {
+              seenBracket = false;
+            }
+            buffer += c;
+          } else {
+            err('Invalid code point in host/hostname: ' + c);
+          }
+          break;
+        case 'port':
+          if (/[0-9]/.test(c)) {
+            buffer += c;
+          } else if (c === EOF || c === '/' || c === '\\' || c === '?' || c === '#' || stateOverride) {
+            if (buffer !== '') {
+              var temp = parseInt(buffer, 10);
+              if (temp !== relative[this._scheme]) {
+                this._port = temp + '';
+              }
+              buffer = '';
+            }
+            if (stateOverride) {
+              break loop;
+            }
+            state = 'relative path start';
+            continue;
+          } else if (c === '\t' || c === '\n' || c === '\r') {
+            err('Invalid code point in port: ' + c);
+          } else {
+            invalid.call(this);
+          }
+          break;
+        case 'relative path start':
+          if (c === '\\') {
+            err('\'\\\' not allowed in path.');
+          }
+          state = 'relative path';
+          if (c !== '/' && c !== '\\') {
+            continue;
+          }
+          break;
+        case 'relative path':
+          if (c === EOF || c === '/' || c === '\\' || !stateOverride && (c === '?' || c === '#')) {
+            if (c === '\\') {
+              err('\\ not allowed in relative path.');
+            }
+            var tmp;
+            if (tmp = relativePathDotMapping[buffer.toLowerCase()]) {
+              buffer = tmp;
+            }
+            if (buffer === '..') {
+              this._path.pop();
+              if (c !== '/' && c !== '\\') {
+                this._path.push('');
+              }
+            } else if (buffer === '.' && c !== '/' && c !== '\\') {
+              this._path.push('');
+            } else if (buffer !== '.') {
+              if (this._scheme === 'file' && this._path.length === 0 && buffer.length === 2 && ALPHA.test(buffer[0]) && buffer[1] === '|') {
+                buffer = buffer[0] + ':';
+              }
+              this._path.push(buffer);
+            }
+            buffer = '';
+            if (c === '?') {
+              this._query = '?';
+              state = 'query';
+            } else if (c === '#') {
+              this._fragment = '#';
+              state = 'fragment';
+            }
+          } else if (c !== '\t' && c !== '\n' && c !== '\r') {
+            buffer += percentEscape(c);
+          }
+          break;
+        case 'query':
+          if (!stateOverride && c === '#') {
+            this._fragment = '#';
+            state = 'fragment';
+          } else if (c !== EOF && c !== '\t' && c !== '\n' && c !== '\r') {
+            this._query += percentEscapeQuery(c);
+          }
+          break;
+        case 'fragment':
+          if (c !== EOF && c !== '\t' && c !== '\n' && c !== '\r') {
+            this._fragment += c;
+          }
+          break;
+      }
+      cursor++;
+    }
+  }
+  function clear() {
+    this._scheme = '';
+    this._schemeData = '';
+    this._username = '';
+    this._password = null;
+    this._host = '';
+    this._port = '';
+    this._path = [];
+    this._query = '';
+    this._fragment = '';
+    this._isInvalid = false;
+    this._isRelative = false;
+  }
+  function JURL(url, base) {
+    if (base !== undefined && !(base instanceof JURL)) {
+      base = new JURL(String(base));
+    }
+    this._url = url;
+    clear.call(this);
+    var input = url.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g, '');
+    parse.call(this, input, null, base);
+  }
+  JURL.prototype = {
+    toString: function toString() {
+      return this.href;
+    },
+
+    get href() {
+      if (this._isInvalid) {
+        return this._url;
+      }
+      var authority = '';
+      if (this._username !== '' || this._password !== null) {
+        authority = this._username + (this._password !== null ? ':' + this._password : '') + '@';
+      }
+      return this.protocol + (this._isRelative ? '//' + authority + this.host : '') + this.pathname + this._query + this._fragment;
+    },
+    set href(value) {
+      clear.call(this);
+      parse.call(this, value);
+    },
+    get protocol() {
+      return this._scheme + ':';
+    },
+    set protocol(value) {
+      if (this._isInvalid) {
+        return;
+      }
+      parse.call(this, value + ':', 'scheme start');
+    },
+    get host() {
+      return this._isInvalid ? '' : this._port ? this._host + ':' + this._port : this._host;
+    },
+    set host(value) {
+      if (this._isInvalid || !this._isRelative) {
+        return;
+      }
+      parse.call(this, value, 'host');
+    },
+    get hostname() {
+      return this._host;
+    },
+    set hostname(value) {
+      if (this._isInvalid || !this._isRelative) {
+        return;
+      }
+      parse.call(this, value, 'hostname');
+    },
+    get port() {
+      return this._port;
+    },
+    set port(value) {
+      if (this._isInvalid || !this._isRelative) {
+        return;
+      }
+      parse.call(this, value, 'port');
+    },
+    get pathname() {
+      return this._isInvalid ? '' : this._isRelative ? '/' + this._path.join('/') : this._schemeData;
+    },
+    set pathname(value) {
+      if (this._isInvalid || !this._isRelative) {
+        return;
+      }
+      this._path = [];
+      parse.call(this, value, 'relative path start');
+    },
+    get search() {
+      return this._isInvalid || !this._query || this._query === '?' ? '' : this._query;
+    },
+    set search(value) {
+      if (this._isInvalid || !this._isRelative) {
+        return;
+      }
+      this._query = '?';
+      if (value[0] === '?') {
+        value = value.slice(1);
+      }
+      parse.call(this, value, 'query');
+    },
+    get hash() {
+      return this._isInvalid || !this._fragment || this._fragment === '#' ? '' : this._fragment;
+    },
+    set hash(value) {
+      if (this._isInvalid) {
+        return;
+      }
+      this._fragment = '#';
+      if (value[0] === '#') {
+        value = value.slice(1);
+      }
+      parse.call(this, value, 'fragment');
+    },
+    get origin() {
+      var host;
+      if (this._isInvalid || !this._scheme) {
+        return '';
+      }
+      switch (this._scheme) {
+        case 'data':
+        case 'file':
+        case 'javascript':
+        case 'mailto':
+          return 'null';
+        case 'blob':
+          try {
+            return new JURL(this._schemeData).origin || 'null';
+          } catch (_) {}
+          return 'null';
+      }
+      host = this.host;
+      if (!host) {
+        return '';
+      }
+      return this._scheme + '://' + host;
+    }
+  };
+  exports.URL = JURL;
+})();
+
+/***/ }),
+/* 129 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.build = exports.version = exports.setPDFNetworkStreamFactory = exports.PDFPageProxy = exports.PDFDocumentProxy = exports.PDFWorker = exports.PDFDataRangeTransport = exports.LoopbackPort = exports.getDocument = undefined;
+
+var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+var _util = __w_pdfjs_require__(1);
+
+var _dom_utils = __w_pdfjs_require__(130);
+
+var _font_loader = __w_pdfjs_require__(131);
+
+var _api_compatibility = __w_pdfjs_require__(132);
+
+var _canvas = __w_pdfjs_require__(133);
+
+var _global_scope = __w_pdfjs_require__(3);
+
+var _global_scope2 = _interopRequireDefault(_global_scope);
+
+var _worker_options = __w_pdfjs_require__(135);
+
+var _message_handler = __w_pdfjs_require__(136);
+
+var _metadata = __w_pdfjs_require__(141);
+
+var _transport_stream = __w_pdfjs_require__(143);
+
+var _webgl = __w_pdfjs_require__(144);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var DEFAULT_RANGE_CHUNK_SIZE = 65536;
+var isWorkerDisabled = false;
+var fallbackWorkerSrc = void 0;
+var fakeWorkerFilesLoader = null;
+{
+  var useRequireEnsure = false;
+  if (typeof window === 'undefined') {
+    isWorkerDisabled = true;
+    if (typeof require.ensure === 'undefined') {
+      require.ensure = require('node-ensure');
+    }
+    useRequireEnsure = true;
+  } else if (typeof require !== 'undefined' && typeof require.ensure === 'function') {
+    useRequireEnsure = true;
+  }
+  if (typeof requirejs !== 'undefined' && requirejs.toUrl) {
+    fallbackWorkerSrc = requirejs.toUrl('pdfjs-dist/build/pdf.worker.js');
+  }
+  var dynamicLoaderSupported = typeof requirejs !== 'undefined' && requirejs.load;
+  fakeWorkerFilesLoader = useRequireEnsure ? function () {
+    return new Promise(function (resolve, reject) {
+      require.ensure([], function () {
+        try {
+          var worker = void 0;
+          worker = require('./pdf.worker.js');
+          resolve(worker.WorkerMessageHandler);
+        } catch (ex) {
+          reject(ex);
+        }
+      }, reject, 'pdfjsWorker');
+    });
+  } : dynamicLoaderSupported ? function () {
+    return new Promise(function (resolve, reject) {
+      requirejs(['pdfjs-dist/build/pdf.worker'], function (worker) {
+        try {
+          resolve(worker.WorkerMessageHandler);
+        } catch (ex) {
+          reject(ex);
+        }
+      }, reject);
+    });
+  } : null;
+  if (!fallbackWorkerSrc && typeof document !== 'undefined') {
+    var pdfjsFilePath = document.currentScript && document.currentScript.src;
+    if (pdfjsFilePath) {
+      fallbackWorkerSrc = pdfjsFilePath.replace(/(\.(?:min\.)?js)(\?.*)?$/i, '.worker$1$2');
+    }
+  }
+}
+var createPDFNetworkStream;
+function setPDFNetworkStreamFactory(pdfNetworkStreamFactory) {
+  createPDFNetworkStream = pdfNetworkStreamFactory;
+}
+function getDocument(src) {
+  var task = new PDFDocumentLoadingTask();
+  var source;
+  if (typeof src === 'string') {
+    source = { url: src };
+  } else if ((0, _util.isArrayBuffer)(src)) {
+    source = { data: src };
+  } else if (src instanceof PDFDataRangeTransport) {
+    source = { range: src };
+  } else {
+    if ((typeof src === 'undefined' ? 'undefined' : _typeof(src)) !== 'object') {
+      throw new Error('Invalid parameter in getDocument, ' + 'need either Uint8Array, string or a parameter object');
+    }
+    if (!src.url && !src.data && !src.range) {
+      throw new Error('Invalid parameter object: need either .data, .range or .url');
+    }
+    source = src;
+  }
+  var params = Object.create(null);
+  var rangeTransport = null;
+  var worker = null;
+  for (var key in source) {
+    if (key === 'url' && typeof window !== 'undefined') {
+      params[key] = new _util.URL(source[key], window.location).href;
+      continue;
+    } else if (key === 'range') {
+      rangeTransport = source[key];
+      continue;
+    } else if (key === 'worker') {
+      worker = source[key];
+      continue;
+    } else if (key === 'data' && !(source[key] instanceof Uint8Array)) {
+      var pdfBytes = source[key];
+      if (typeof pdfBytes === 'string') {
+        params[key] = (0, _util.stringToBytes)(pdfBytes);
+      } else if ((typeof pdfBytes === 'undefined' ? 'undefined' : _typeof(pdfBytes)) === 'object' && pdfBytes !== null && !isNaN(pdfBytes.length)) {
+        params[key] = new Uint8Array(pdfBytes);
+      } else if ((0, _util.isArrayBuffer)(pdfBytes)) {
+        params[key] = new Uint8Array(pdfBytes);
+      } else {
+        throw new Error('Invalid PDF binary data: either typed array, ' + 'string or array-like object is expected in the ' + 'data property.');
+      }
+      continue;
+    }
+    params[key] = source[key];
+  }
+  params.rangeChunkSize = params.rangeChunkSize || DEFAULT_RANGE_CHUNK_SIZE;
+  params.CMapReaderFactory = params.CMapReaderFactory || _dom_utils.DOMCMapReaderFactory;
+  params.ignoreErrors = params.stopAtErrors !== true;
+  params.pdfBug = params.pdfBug === true;
+  var NativeImageDecoderValues = Object.values(_util.NativeImageDecoding);
+  if (params.nativeImageDecoderSupport === undefined || !NativeImageDecoderValues.includes(params.nativeImageDecoderSupport)) {
+    params.nativeImageDecoderSupport = _api_compatibility.apiCompatibilityParams.nativeImageDecoderSupport || _util.NativeImageDecoding.DECODE;
+  }
+  if (!Number.isInteger(params.maxImageSize)) {
+    params.maxImageSize = -1;
+  }
+  if (typeof params.isEvalSupported !== 'boolean') {
+    params.isEvalSupported = true;
+  }
+  if (typeof params.disableFontFace !== 'boolean') {
+    params.disableFontFace = _api_compatibility.apiCompatibilityParams.disableFontFace || false;
+  }
+  if (typeof params.disableRange !== 'boolean') {
+    params.disableRange = false;
+  }
+  if (typeof params.disableStream !== 'boolean') {
+    params.disableStream = false;
+  }
+  if (typeof params.disableAutoFetch !== 'boolean') {
+    params.disableAutoFetch = false;
+  }
+  if (typeof params.disableCreateObjectURL !== 'boolean') {
+    params.disableCreateObjectURL = _api_compatibility.apiCompatibilityParams.disableCreateObjectURL || false;
+  }
+  (0, _util.setVerbosityLevel)(params.verbosity);
+  if (!worker) {
+    var workerParams = {
+      postMessageTransfers: params.postMessageTransfers,
+      verbosity: params.verbosity
+    };
+    var workerPort = _worker_options.GlobalWorkerOptions.workerPort;
+    if (workerPort) {
+      workerParams.port = workerPort;
+      worker = PDFWorker.fromPort(workerParams);
+    } else {
+      worker = new PDFWorker(workerParams);
+    }
+    task._worker = worker;
+  }
+  var docId = task.docId;
+  worker.promise.then(function () {
+    if (task.destroyed) {
+      throw new Error('Loading aborted');
+    }
+    return _fetchDocument(worker, params, rangeTransport, docId).then(function (workerId) {
+      if (task.destroyed) {
+        throw new Error('Loading aborted');
+      }
+      var networkStream = void 0;
+      if (rangeTransport) {
+        networkStream = new _transport_stream.PDFDataTransportStream({
+          length: params.length,
+          initialData: params.initialData,
+          disableRange: params.disableRange,
+          disableStream: params.disableStream
+        }, rangeTransport);
+      } else if (!params.data) {
+        networkStream = createPDFNetworkStream({
+          url: params.url,
+          length: params.length,
+          httpHeaders: params.httpHeaders,
+          withCredentials: params.withCredentials,
+          rangeChunkSize: params.rangeChunkSize,
+          disableRange: params.disableRange,
+          disableStream: params.disableStream
+        });
+      }
+      var messageHandler = new _message_handler.MessageHandler(docId, workerId, worker.port);
+      messageHandler.postMessageTransfers = worker.postMessageTransfers;
+      var transport = new WorkerTransport(messageHandler, task, networkStream, params);
+      task._transport = transport;
+      messageHandler.send('Ready', null);
+    });
+  }).catch(task._capability.reject);
+  return task;
+}
+function _fetchDocument(worker, source, pdfDataRangeTransport, docId) {
+  if (worker.destroyed) {
+    return Promise.reject(new Error('Worker was destroyed'));
+  }
+  if (pdfDataRangeTransport) {
+    source.length = pdfDataRangeTransport.length;
+    source.initialData = pdfDataRangeTransport.initialData;
+  }
+  return worker.messageHandler.sendWithPromise('GetDocRequest', {
+    docId: docId,
+    apiVersion: '2.0.943',
+    source: {
+      data: source.data,
+      url: source.url,
+      password: source.password,
+      disableAutoFetch: source.disableAutoFetch,
+      rangeChunkSize: source.rangeChunkSize,
+      length: source.length
+    },
+    maxImageSize: source.maxImageSize,
+    disableFontFace: source.disableFontFace,
+    disableCreateObjectURL: source.disableCreateObjectURL,
+    postMessageTransfers: worker.postMessageTransfers,
+    docBaseUrl: source.docBaseUrl,
+    nativeImageDecoderSupport: source.nativeImageDecoderSupport,
+    ignoreErrors: source.ignoreErrors,
+    isEvalSupported: source.isEvalSupported
+  }).then(function (workerId) {
+    if (worker.destroyed) {
+      throw new Error('Worker was destroyed');
+    }
+    return workerId;
+  });
+}
+var PDFDocumentLoadingTask = function PDFDocumentLoadingTaskClosure() {
+  var nextDocumentId = 0;
+  function PDFDocumentLoadingTask() {
+    this._capability = (0, _util.createPromiseCapability)();
+    this._transport = null;
+    this._worker = null;
+    this.docId = 'd' + nextDocumentId++;
+    this.destroyed = false;
+    this.onPassword = null;
+    this.onProgress = null;
+    this.onUnsupportedFeature = null;
+  }
+  PDFDocumentLoadingTask.prototype = {
+    get promise() {
+      return this._capability.promise;
+    },
+    destroy: function destroy() {
+      var _this = this;
+
+      this.destroyed = true;
+      var transportDestroyed = !this._transport ? Promise.resolve() : this._transport.destroy();
+      return transportDestroyed.then(function () {
+        _this._transport = null;
+        if (_this._worker) {
+          _this._worker.destroy();
+          _this._worker = null;
+        }
+      });
+    },
+
+    then: function PDFDocumentLoadingTask_then(onFulfilled, onRejected) {
+      return this.promise.then.apply(this.promise, arguments);
+    }
+  };
+  return PDFDocumentLoadingTask;
+}();
+
+var PDFDataRangeTransport = function () {
+  function PDFDataRangeTransport(length, initialData) {
+    _classCallCheck(this, PDFDataRangeTransport);
+
+    this.length = length;
+    this.initialData = initialData;
+    this._rangeListeners = [];
+    this._progressListeners = [];
+    this._progressiveReadListeners = [];
+    this._readyCapability = (0, _util.createPromiseCapability)();
+  }
+
+  _createClass(PDFDataRangeTransport, [{
+    key: 'addRangeListener',
+    value: function addRangeListener(listener) {
+      this._rangeListeners.push(listener);
+    }
+  }, {
+    key: 'addProgressListener',
+    value: function addProgressListener(listener) {
+      this._progressListeners.push(listener);
+    }
+  }, {
+    key: 'addProgressiveReadListener',
+    value: function addProgressiveReadListener(listener) {
+      this._progressiveReadListeners.push(listener);
+    }
+  }, {
+    key: 'onDataRange',
+    value: function onDataRange(begin, chunk) {
+      var _iteratorNormalCompletion = true;
+      var _didIteratorError = false;
+      var _iteratorError = undefined;
+
+      try {
+        for (var _iterator = this._rangeListeners[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
+          var listener = _step.value;
+
+          listener(begin, chunk);
+        }
+      } catch (err) {
+        _didIteratorError = true;
+        _iteratorError = err;
+      } finally {
+        try {
+          if (!_iteratorNormalCompletion && _iterator.return) {
+            _iterator.return();
+          }
+        } finally {
+          if (_didIteratorError) {
+            throw _iteratorError;
+          }
+        }
+      }
+    }
+  }, {
+    key: 'onDataProgress',
+    value: function onDataProgress(loaded) {
+      var _this2 = this;
+
+      this._readyCapability.promise.then(function () {
+        var _iteratorNormalCompletion2 = true;
+        var _didIteratorError2 = false;
+        var _iteratorError2 = undefined;
+
+        try {
+          for (var _iterator2 = _this2._progressListeners[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
+            var listener = _step2.value;
+
+            listener(loaded);
+          }
+        } catch (err) {
+          _didIteratorError2 = true;
+          _iteratorError2 = err;
+        } finally {
+          try {
+            if (!_iteratorNormalCompletion2 && _iterator2.return) {
+              _iterator2.return();
+            }
+          } finally {
+            if (_didIteratorError2) {
+              throw _iteratorError2;
+            }
+          }
+        }
+      });
+    }
+  }, {
+    key: 'onDataProgressiveRead',
+    value: function onDataProgressiveRead(chunk) {
+      var _this3 = this;
+
+      this._readyCapability.promise.then(function () {
+        var _iteratorNormalCompletion3 = true;
+        var _didIteratorError3 = false;
+        var _iteratorError3 = undefined;
+
+        try {
+          for (var _iterator3 = _this3._progressiveReadListeners[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
+            var listener = _step3.value;
+
+            listener(chunk);
+          }
+        } catch (err) {
+          _didIteratorError3 = true;
+          _iteratorError3 = err;
+        } finally {
+          try {
+            if (!_iteratorNormalCompletion3 && _iterator3.return) {
+              _iterator3.return();
+            }
+          } finally {
+            if (_didIteratorError3) {
+              throw _iteratorError3;
+            }
+          }
+        }
+      });
+    }
+  }, {
+    key: 'transportReady',
+    value: function transportReady() {
+      this._readyCapability.resolve();
+    }
+  }, {
+    key: 'requestDataRange',
+    value: function requestDataRange(begin, end) {
+      (0, _util.unreachable)('Abstract method PDFDataRangeTransport.requestDataRange');
+    }
+  }, {
+    key: 'abort',
+    value: function abort() {}
+  }]);
+
+  return PDFDataRangeTransport;
+}();
+
+var PDFDocumentProxy = function () {
+  function PDFDocumentProxy(pdfInfo, transport, loadingTask) {
+    _classCallCheck(this, PDFDocumentProxy);
+
+    this.loadingTask = loadingTask;
+    this._pdfInfo = pdfInfo;
+    this._transport = transport;
+  }
+
+  _createClass(PDFDocumentProxy, [{
+    key: 'getPage',
+    value: function getPage(pageNumber) {
+      return this._transport.getPage(pageNumber);
+    }
+  }, {
+    key: 'getPageIndex',
+    value: function getPageIndex(ref) {
+      return this._transport.getPageIndex(ref);
+    }
+  }, {
+    key: 'getDestinations',
+    value: function getDestinations() {
+      return this._transport.getDestinations();
+    }
+  }, {
+    key: 'getDestination',
+    value: function getDestination(id) {
+      return this._transport.getDestination(id);
+    }
+  }, {
+    key: 'getPageLabels',
+    value: function getPageLabels() {
+      return this._transport.getPageLabels();
+    }
+  }, {
+    key: 'getPageMode',
+    value: function getPageMode() {
+      return this._transport.getPageMode();
+    }
+  }, {
+    key: 'getAttachments',
+    value: function getAttachments() {
+      return this._transport.getAttachments();
+    }
+  }, {
+    key: 'getJavaScript',
+    value: function getJavaScript() {
+      return this._transport.getJavaScript();
+    }
+  }, {
+    key: 'getOutline',
+    value: function getOutline() {
+      return this._transport.getOutline();
+    }
+  }, {
+    key: 'getPermissions',
+    value: function getPermissions() {
+      return this._transport.getPermissions();
+    }
+  }, {
+    key: 'getMetadata',
+    value: function getMetadata() {
+      return this._transport.getMetadata();
+    }
+  }, {
+    key: 'getData',
+    value: function getData() {
+      return this._transport.getData();
+    }
+  }, {
+    key: 'getDownloadInfo',
+    value: function getDownloadInfo() {
+      return this._transport.downloadInfoCapability.promise;
+    }
+  }, {
+    key: 'getStats',
+    value: function getStats() {
+      return this._transport.getStats();
+    }
+  }, {
+    key: 'cleanup',
+    value: function cleanup() {
+      this._transport.startCleanup();
+    }
+  }, {
+    key: 'destroy',
+    value: function destroy() {
+      return this.loadingTask.destroy();
+    }
+  }, {
+    key: 'numPages',
+    get: function get() {
+      return this._pdfInfo.numPages;
+    }
+  }, {
+    key: 'fingerprint',
+    get: function get() {
+      return this._pdfInfo.fingerprint;
+    }
+  }, {
+    key: 'loadingParams',
+    get: function get() {
+      return this._transport.loadingParams;
+    }
+  }]);
+
+  return PDFDocumentProxy;
+}();
+
+var PDFPageProxy = function PDFPageProxyClosure() {
+  function PDFPageProxy(pageIndex, pageInfo, transport) {
+    var pdfBug = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
+
+    this.pageIndex = pageIndex;
+    this._pageInfo = pageInfo;
+    this.transport = transport;
+    this._stats = pdfBug ? new _dom_utils.StatTimer() : _dom_utils.DummyStatTimer;
+    this._pdfBug = pdfBug;
+    this.commonObjs = transport.commonObjs;
+    this.objs = new PDFObjects();
+    this.cleanupAfterRender = false;
+    this.pendingCleanup = false;
+    this.intentStates = Object.create(null);
+    this.destroyed = false;
+  }
+  PDFPageProxy.prototype = {
+    get pageNumber() {
+      return this.pageIndex + 1;
+    },
+    get rotate() {
+      return this._pageInfo.rotate;
+    },
+    get ref() {
+      return this._pageInfo.ref;
+    },
+    get userUnit() {
+      return this._pageInfo.userUnit;
+    },
+    get view() {
+      return this._pageInfo.view;
+    },
+    getViewport: function getViewport(scale) {
+      var rotate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.rotate;
+      var dontFlip = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
+
+      return new _dom_utils.PageViewport({
+        viewBox: this.view,
+        scale: scale,
+        rotation: rotate,
+        dontFlip: dontFlip
+      });
+    },
+
+    getAnnotations: function PDFPageProxy_getAnnotations(params) {
+      var intent = params && params.intent || null;
+      if (!this.annotationsPromise || this.annotationsIntent !== intent) {
+        this.annotationsPromise = this.transport.getAnnotations(this.pageIndex, intent);
+        this.annotationsIntent = intent;
+      }
+      return this.annotationsPromise;
+    },
+    render: function PDFPageProxy_render(params) {
+      var _this4 = this;
+
+      var stats = this._stats;
+      stats.time('Overall');
+      this.pendingCleanup = false;
+      var renderingIntent = params.intent === 'print' ? 'print' : 'display';
+      var canvasFactory = params.canvasFactory || new _dom_utils.DOMCanvasFactory();
+      var webGLContext = new _webgl.WebGLContext({ enable: params.enableWebGL });
+      if (!this.intentStates[renderingIntent]) {
+        this.intentStates[renderingIntent] = Object.create(null);
+      }
+      var intentState = this.intentStates[renderingIntent];
+      if (!intentState.displayReadyCapability) {
+        intentState.receivingOperatorList = true;
+        intentState.displayReadyCapability = (0, _util.createPromiseCapability)();
+        intentState.operatorList = {
+          fnArray: [],
+          argsArray: [],
+          lastChunk: false
+        };
+        stats.time('Page Request');
+        this.transport.messageHandler.send('RenderPageRequest', {
+          pageIndex: this.pageNumber - 1,
+          intent: renderingIntent,
+          renderInteractiveForms: params.renderInteractiveForms === true
+        });
+      }
+      var complete = function complete(error) {
+        var i = intentState.renderTasks.indexOf(internalRenderTask);
+        if (i >= 0) {
+          intentState.renderTasks.splice(i, 1);
+        }
+        if (_this4.cleanupAfterRender) {
+          _this4.pendingCleanup = true;
+        }
+        _this4._tryCleanup();
+        if (error) {
+          internalRenderTask.capability.reject(error);
+        } else {
+          internalRenderTask.capability.resolve();
+        }
+        stats.timeEnd('Rendering');
+        stats.timeEnd('Overall');
+      };
+      var internalRenderTask = new InternalRenderTask(complete, params, this.objs, this.commonObjs, intentState.operatorList, this.pageNumber, canvasFactory, webGLContext, this._pdfBug);
+      internalRenderTask.useRequestAnimationFrame = renderingIntent !== 'print';
+      if (!intentState.renderTasks) {
+        intentState.renderTasks = [];
+      }
+      intentState.renderTasks.push(internalRenderTask);
+      var renderTask = internalRenderTask.task;
+      intentState.displayReadyCapability.promise.then(function (transparency) {
+        if (_this4.pendingCleanup) {
+          complete();
+          return;
+        }
+        stats.time('Rendering');
+        internalRenderTask.initializeGraphics(transparency);
+        internalRenderTask.operatorListChanged();
+      }).catch(complete);
+      return renderTask;
+    },
+    getOperatorList: function PDFPageProxy_getOperatorList() {
+      function operatorListChanged() {
+        if (intentState.operatorList.lastChunk) {
+          intentState.opListReadCapability.resolve(intentState.operatorList);
+          var i = intentState.renderTasks.indexOf(opListTask);
+          if (i >= 0) {
+            intentState.renderTasks.splice(i, 1);
+          }
+        }
+      }
+      var renderingIntent = 'oplist';
+      if (!this.intentStates[renderingIntent]) {
+        this.intentStates[renderingIntent] = Object.create(null);
+      }
+      var intentState = this.intentStates[renderingIntent];
+      var opListTask;
+      if (!intentState.opListReadCapability) {
+        opListTask = {};
+        opListTask.operatorListChanged = operatorListChanged;
+        intentState.receivingOperatorList = true;
+        intentState.opListReadCapability = (0, _util.createPromiseCapability)();
+        intentState.renderTasks = [];
+        intentState.renderTasks.push(opListTask);
+        intentState.operatorList = {
+          fnArray: [],
+          argsArray: [],
+          lastChunk: false
+        };
+        this._stats.time('Page Request');
+        this.transport.messageHandler.send('RenderPageRequest', {
+          pageIndex: this.pageIndex,
+          intent: renderingIntent
+        });
+      }
+      return intentState.opListReadCapability.promise;
+    },
+    streamTextContent: function streamTextContent() {
+      var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+
+      var TEXT_CONTENT_CHUNK_SIZE = 100;
+      return this.transport.messageHandler.sendWithStream('GetTextContent', {
+        pageIndex: this.pageNumber - 1,
+        normalizeWhitespace: params.normalizeWhitespace === true,
+        combineTextItems: params.disableCombineTextItems !== true
+      }, {
+        highWaterMark: TEXT_CONTENT_CHUNK_SIZE,
+        size: function size(textContent) {
+          return textContent.items.length;
+        }
+      });
+    },
+
+    getTextContent: function PDFPageProxy_getTextContent(params) {
+      params = params || {};
+      var readableStream = this.streamTextContent(params);
+      return new Promise(function (resolve, reject) {
+        function pump() {
+          reader.read().then(function (_ref) {
+            var _textContent$items;
+
+            var value = _ref.value,
+                done = _ref.done;
+
+            if (done) {
+              resolve(textContent);
+              return;
+            }
+            Object.assign(textContent.styles, value.styles);
+            (_textContent$items = textContent.items).push.apply(_textContent$items, _toConsumableArray(value.items));
+            pump();
+          }, reject);
+        }
+        var reader = readableStream.getReader();
+        var textContent = {
+          items: [],
+          styles: Object.create(null)
+        };
+        pump();
+      });
+    },
+    _destroy: function PDFPageProxy_destroy() {
+      this.destroyed = true;
+      this.transport.pageCache[this.pageIndex] = null;
+      var waitOn = [];
+      Object.keys(this.intentStates).forEach(function (intent) {
+        if (intent === 'oplist') {
+          return;
+        }
+        var intentState = this.intentStates[intent];
+        intentState.renderTasks.forEach(function (renderTask) {
+          var renderCompleted = renderTask.capability.promise.catch(function () {});
+          waitOn.push(renderCompleted);
+          renderTask.cancel();
+        });
+      }, this);
+      this.objs.clear();
+      this.annotationsPromise = null;
+      this.pendingCleanup = false;
+      return Promise.all(waitOn);
+    },
+    cleanup: function cleanup() {
+      var resetStats = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+
+      this.pendingCleanup = true;
+      this._tryCleanup(resetStats);
+    },
+    _tryCleanup: function _tryCleanup() {
+      var resetStats = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+
+      if (!this.pendingCleanup || Object.keys(this.intentStates).some(function (intent) {
+        var intentState = this.intentStates[intent];
+        return intentState.renderTasks.length !== 0 || intentState.receivingOperatorList;
+      }, this)) {
+        return;
+      }
+      Object.keys(this.intentStates).forEach(function (intent) {
+        delete this.intentStates[intent];
+      }, this);
+      this.objs.clear();
+      this.annotationsPromise = null;
+      if (resetStats && this._stats instanceof _dom_utils.StatTimer) {
+        this._stats = new _dom_utils.StatTimer();
+      }
+      this.pendingCleanup = false;
+    },
+
+    _startRenderPage: function PDFPageProxy_startRenderPage(transparency, intent) {
+      var intentState = this.intentStates[intent];
+      if (intentState.displayReadyCapability) {
+        intentState.displayReadyCapability.resolve(transparency);
+      }
+    },
+    _renderPageChunk: function PDFPageProxy_renderPageChunk(operatorListChunk, intent) {
+      var intentState = this.intentStates[intent];
+      var i, ii;
+      for (i = 0, ii = operatorListChunk.length; i < ii; i++) {
+        intentState.operatorList.fnArray.push(operatorListChunk.fnArray[i]);
+        intentState.operatorList.argsArray.push(operatorListChunk.argsArray[i]);
+      }
+      intentState.operatorList.lastChunk = operatorListChunk.lastChunk;
+      for (i = 0; i < intentState.renderTasks.length; i++) {
+        intentState.renderTasks[i].operatorListChanged();
+      }
+      if (operatorListChunk.lastChunk) {
+        intentState.receivingOperatorList = false;
+        this._tryCleanup();
+      }
+    },
+    get stats() {
+      return this._stats instanceof _dom_utils.StatTimer ? this._stats : null;
+    }
+  };
+  return PDFPageProxy;
+}();
+
+var LoopbackPort = function () {
+  function LoopbackPort() {
+    var defer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
+
+    _classCallCheck(this, LoopbackPort);
+
+    this._listeners = [];
+    this._defer = defer;
+    this._deferred = Promise.resolve(undefined);
+  }
+
+  _createClass(LoopbackPort, [{
+    key: 'postMessage',
+    value: function postMessage(obj, transfers) {
+      var _this5 = this;
+
+      function cloneValue(value) {
+        if ((typeof value === 'undefined' ? 'undefined' : _typeof(value)) !== 'object' || value === null) {
+          return value;
+        }
+        if (cloned.has(value)) {
+          return cloned.get(value);
+        }
+        var result;
+        var buffer;
+        if ((buffer = value.buffer) && (0, _util.isArrayBuffer)(buffer)) {
+          var transferable = transfers && transfers.includes(buffer);
+          if (value === buffer) {
+            result = value;
+          } else if (transferable) {
+            result = new value.constructor(buffer, value.byteOffset, value.byteLength);
+          } else {
+            result = new value.constructor(value);
+          }
+          cloned.set(value, result);
+          return result;
+        }
+        result = Array.isArray(value) ? [] : {};
+        cloned.set(value, result);
+        for (var i in value) {
+          var desc,
+              p = value;
+          while (!(desc = Object.getOwnPropertyDescriptor(p, i))) {
+            p = Object.getPrototypeOf(p);
+          }
+          if (typeof desc.value === 'undefined' || typeof desc.value === 'function') {
+            continue;
+          }
+          result[i] = cloneValue(desc.value);
+        }
+        return result;
+      }
+      if (!this._defer) {
+        this._listeners.forEach(function (listener) {
+          listener.call(this, { data: obj });
+        }, this);
+        return;
+      }
+      var cloned = new WeakMap();
+      var e = { data: cloneValue(obj) };
+      this._deferred.then(function () {
+        _this5._listeners.forEach(function (listener) {
+          listener.call(this, e);
+        }, _this5);
+      });
+    }
+  }, {
+    key: 'addEventListener',
+    value: function addEventListener(name, listener) {
+      this._listeners.push(listener);
+    }
+  }, {
+    key: 'removeEventListener',
+    value: function removeEventListener(name, listener) {
+      var i = this._listeners.indexOf(listener);
+      this._listeners.splice(i, 1);
+    }
+  }, {
+    key: 'terminate',
+    value: function terminate() {
+      this._listeners = [];
+    }
+  }]);
+
+  return LoopbackPort;
+}();
+
+var PDFWorker = function PDFWorkerClosure() {
+  var nextFakeWorkerId = 0;
+  function getWorkerSrc() {
+    if (_worker_options.GlobalWorkerOptions.workerSrc) {
+      return _worker_options.GlobalWorkerOptions.workerSrc;
+    }
+    if (typeof fallbackWorkerSrc !== 'undefined') {
+      return fallbackWorkerSrc;
+    }
+    throw new Error('No "GlobalWorkerOptions.workerSrc" specified.');
+  }
+  function getMainThreadWorkerMessageHandler() {
+    try {
+      if (typeof window !== 'undefined') {
+        return window.pdfjsWorker && window.pdfjsWorker.WorkerMessageHandler;
+      }
+    } catch (ex) {}
+    return null;
+  }
+  var fakeWorkerFilesLoadedCapability = void 0;
+  function setupFakeWorkerGlobal() {
+    if (fakeWorkerFilesLoadedCapability) {
+      return fakeWorkerFilesLoadedCapability.promise;
+    }
+    fakeWorkerFilesLoadedCapability = (0, _util.createPromiseCapability)();
+    var mainWorkerMessageHandler = getMainThreadWorkerMessageHandler();
+    if (mainWorkerMessageHandler) {
+      fakeWorkerFilesLoadedCapability.resolve(mainWorkerMessageHandler);
+      return fakeWorkerFilesLoadedCapability.promise;
+    }
+    var loader = fakeWorkerFilesLoader || function () {
+      return (0, _dom_utils.loadScript)(getWorkerSrc()).then(function () {
+        return window.pdfjsWorker.WorkerMessageHandler;
+      });
+    };
+    loader().then(fakeWorkerFilesLoadedCapability.resolve, fakeWorkerFilesLoadedCapability.reject);
+    return fakeWorkerFilesLoadedCapability.promise;
+  }
+  function createCDNWrapper(url) {
+    var wrapper = 'importScripts(\'' + url + '\');';
+    return _util.URL.createObjectURL(new Blob([wrapper]));
+  }
+  var pdfWorkerPorts = new WeakMap();
+  function PDFWorker() {
+    var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
+        _ref2$name = _ref2.name,
+        name = _ref2$name === undefined ? null : _ref2$name,
+        _ref2$port = _ref2.port,
+        port = _ref2$port === undefined ? null : _ref2$port,
+        _ref2$postMessageTran = _ref2.postMessageTransfers,
+        postMessageTransfers = _ref2$postMessageTran === undefined ? true : _ref2$postMessageTran,
+        _ref2$verbosity = _ref2.verbosity,
+        verbosity = _ref2$verbosity === undefined ? (0, _util.getVerbosityLevel)() : _ref2$verbosity;
+
+    if (port && pdfWorkerPorts.has(port)) {
+      throw new Error('Cannot use more than one PDFWorker per port');
+    }
+    this.name = name;
+    this.destroyed = false;
+    this.postMessageTransfers = postMessageTransfers !== false;
+    this.verbosity = verbosity;
+    this._readyCapability = (0, _util.createPromiseCapability)();
+    this._port = null;
+    this._webWorker = null;
+    this._messageHandler = null;
+    if (port) {
+      pdfWorkerPorts.set(port, this);
+      this._initializeFromPort(port);
+      return;
+    }
+    this._initialize();
+  }
+  PDFWorker.prototype = {
+    get promise() {
+      return this._readyCapability.promise;
+    },
+    get port() {
+      return this._port;
+    },
+    get messageHandler() {
+      return this._messageHandler;
+    },
+    _initializeFromPort: function PDFWorker_initializeFromPort(port) {
+      this._port = port;
+      this._messageHandler = new _message_handler.MessageHandler('main', 'worker', port);
+      this._messageHandler.on('ready', function () {});
+      this._readyCapability.resolve();
+    },
+    _initialize: function PDFWorker_initialize() {
+      var _this6 = this;
+
+      if (typeof Worker !== 'undefined' && !isWorkerDisabled && !getMainThreadWorkerMessageHandler()) {
+        var workerSrc = getWorkerSrc();
+        try {
+          if (!(0, _util.isSameOrigin)(window.location.href, workerSrc)) {
+            workerSrc = createCDNWrapper(new _util.URL(workerSrc, window.location).href);
+          }
+          var worker = new Worker(workerSrc);
+          var messageHandler = new _message_handler.MessageHandler('main', 'worker', worker);
+          var terminateEarly = function terminateEarly() {
+            worker.removeEventListener('error', onWorkerError);
+            messageHandler.destroy();
+            worker.terminate();
+            if (_this6.destroyed) {
+              _this6._readyCapability.reject(new Error('Worker was destroyed'));
+            } else {
+              _this6._setupFakeWorker();
+            }
+          };
+          var onWorkerError = function onWorkerError() {
+            if (!_this6._webWorker) {
+              terminateEarly();
+            }
+          };
+          worker.addEventListener('error', onWorkerError);
+          messageHandler.on('test', function (data) {
+            worker.removeEventListener('error', onWorkerError);
+            if (_this6.destroyed) {
+              terminateEarly();
+              return;
+            }
+            if (data && data.supportTypedArray) {
+              _this6._messageHandler = messageHandler;
+              _this6._port = worker;
+              _this6._webWorker = worker;
+              if (!data.supportTransfers) {
+                _this6.postMessageTransfers = false;
+              }
+              _this6._readyCapability.resolve();
+              messageHandler.send('configure', { verbosity: _this6.verbosity });
+            } else {
+              _this6._setupFakeWorker();
+              messageHandler.destroy();
+              worker.terminate();
+            }
+          });
+          messageHandler.on('ready', function (data) {
+            worker.removeEventListener('error', onWorkerError);
+            if (_this6.destroyed) {
+              terminateEarly();
+              return;
+            }
+            try {
+              sendTest();
+            } catch (e) {
+              _this6._setupFakeWorker();
+            }
+          });
+          var sendTest = function sendTest() {
+            var testObj = new Uint8Array([_this6.postMessageTransfers ? 255 : 0]);
+            try {
+              messageHandler.send('test', testObj, [testObj.buffer]);
+            } catch (ex) {
+              (0, _util.info)('Cannot use postMessage transfers');
+              testObj[0] = 0;
+              messageHandler.send('test', testObj);
+            }
+          };
+          sendTest();
+          return;
+        } catch (e) {
+          (0, _util.info)('The worker has been disabled.');
+        }
+      }
+      this._setupFakeWorker();
+    },
+    _setupFakeWorker: function PDFWorker_setupFakeWorker() {
+      var _this7 = this;
+
+      if (!isWorkerDisabled) {
+        (0, _util.warn)('Setting up fake worker.');
+        isWorkerDisabled = true;
+      }
+      setupFakeWorkerGlobal().then(function (WorkerMessageHandler) {
+        if (_this7.destroyed) {
+          _this7._readyCapability.reject(new Error('Worker was destroyed'));
+          return;
+        }
+        var port = new LoopbackPort();
+        _this7._port = port;
+        var id = 'fake' + nextFakeWorkerId++;
+        var workerHandler = new _message_handler.MessageHandler(id + '_worker', id, port);
+        WorkerMessageHandler.setup(workerHandler, port);
+        var messageHandler = new _message_handler.MessageHandler(id, id + '_worker', port);
+        _this7._messageHandler = messageHandler;
+        _this7._readyCapability.resolve();
+      }).catch(function (reason) {
+        _this7._readyCapability.reject(new Error('Setting up fake worker failed: "' + reason.message + '".'));
+      });
+    },
+    destroy: function PDFWorker_destroy() {
+      this.destroyed = true;
+      if (this._webWorker) {
+        this._webWorker.terminate();
+        this._webWorker = null;
+      }
+      pdfWorkerPorts.delete(this._port);
+      this._port = null;
+      if (this._messageHandler) {
+        this._messageHandler.destroy();
+        this._messageHandler = null;
+      }
+    }
+  };
+  PDFWorker.fromPort = function (params) {
+    if (!params || !params.port) {
+      throw new Error('PDFWorker.fromPort - invalid method signature.');
+    }
+    if (pdfWorkerPorts.has(params.port)) {
+      return pdfWorkerPorts.get(params.port);
+    }
+    return new PDFWorker(params);
+  };
+  PDFWorker.getWorkerSrc = function () {
+    return getWorkerSrc();
+  };
+  return PDFWorker;
+}();
+
+var WorkerTransport = function () {
+  function WorkerTransport(messageHandler, loadingTask, networkStream, params) {
+    _classCallCheck(this, WorkerTransport);
+
+    this.messageHandler = messageHandler;
+    this.loadingTask = loadingTask;
+    this.commonObjs = new PDFObjects();
+    this.fontLoader = new _font_loader.FontLoader(loadingTask.docId);
+    this._params = params;
+    this.CMapReaderFactory = new params.CMapReaderFactory({
+      baseUrl: params.cMapUrl,
+      isCompressed: params.cMapPacked
+    });
+    this.destroyed = false;
+    this.destroyCapability = null;
+    this._passwordCapability = null;
+    this._networkStream = networkStream;
+    this._fullReader = null;
+    this._lastProgress = null;
+    this.pageCache = [];
+    this.pagePromises = [];
+    this.downloadInfoCapability = (0, _util.createPromiseCapability)();
+    this.setupMessageHandler();
+  }
+
+  _createClass(WorkerTransport, [{
+    key: 'destroy',
+    value: function destroy() {
+      var _this8 = this;
+
+      if (this.destroyCapability) {
+        return this.destroyCapability.promise;
+      }
+      this.destroyed = true;
+      this.destroyCapability = (0, _util.createPromiseCapability)();
+      if (this._passwordCapability) {
+        this._passwordCapability.reject(new Error('Worker was destroyed during onPassword callback'));
+      }
+      var waitOn = [];
+      this.pageCache.forEach(function (page) {
+        if (page) {
+          waitOn.push(page._destroy());
+        }
+      });
+      this.pageCache = [];
+      this.pagePromises = [];
+      var terminated = this.messageHandler.sendWithPromise('Terminate', null);
+      waitOn.push(terminated);
+      Promise.all(waitOn).then(function () {
+        _this8.fontLoader.clear();
+        if (_this8._networkStream) {
+          _this8._networkStream.cancelAllRequests();
+        }
+        if (_this8.messageHandler) {
+          _this8.messageHandler.destroy();
+          _this8.messageHandler = null;
+        }
+        _this8.destroyCapability.resolve();
+      }, this.destroyCapability.reject);
+      return this.destroyCapability.promise;
+    }
+  }, {
+    key: 'setupMessageHandler',
+    value: function setupMessageHandler() {
+      var messageHandler = this.messageHandler,
+          loadingTask = this.loadingTask;
+
+      messageHandler.on('GetReader', function (data, sink) {
+        var _this9 = this;
+
+        (0, _util.assert)(this._networkStream);
+        this._fullReader = this._networkStream.getFullReader();
+        this._fullReader.onProgress = function (evt) {
+          _this9._lastProgress = {
+            loaded: evt.loaded,
+            total: evt.total
+          };
+        };
+        sink.onPull = function () {
+          _this9._fullReader.read().then(function (_ref3) {
+            var value = _ref3.value,
+                done = _ref3.done;
+
+            if (done) {
+              sink.close();
+              return;
+            }
+            (0, _util.assert)((0, _util.isArrayBuffer)(value));
+            sink.enqueue(new Uint8Array(value), 1, [value]);
+          }).catch(function (reason) {
+            sink.error(reason);
+          });
+        };
+        sink.onCancel = function (reason) {
+          _this9._fullReader.cancel(reason);
+        };
+      }, this);
+      messageHandler.on('ReaderHeadersReady', function (data) {
+        var _this10 = this;
+
+        var headersCapability = (0, _util.createPromiseCapability)();
+        var fullReader = this._fullReader;
+        fullReader.headersReady.then(function () {
+          if (!fullReader.isStreamingSupported || !fullReader.isRangeSupported) {
+            if (_this10._lastProgress && loadingTask.onProgress) {
+              loadingTask.onProgress(_this10._lastProgress);
+            }
+            fullReader.onProgress = function (evt) {
+              if (loadingTask.onProgress) {
+                loadingTask.onProgress({
+                  loaded: evt.loaded,
+                  total: evt.total
+                });
+              }
+            };
+          }
+          headersCapability.resolve({
+            isStreamingSupported: fullReader.isStreamingSupported,
+            isRangeSupported: fullReader.isRangeSupported,
+            contentLength: fullReader.contentLength
+          });
+        }, headersCapability.reject);
+        return headersCapability.promise;
+      }, this);
+      messageHandler.on('GetRangeReader', function (data, sink) {
+        (0, _util.assert)(this._networkStream);
+        var rangeReader = this._networkStream.getRangeReader(data.begin, data.end);
+        sink.onPull = function () {
+          rangeReader.read().then(function (_ref4) {
+            var value = _ref4.value,
+                done = _ref4.done;
+
+            if (done) {
+              sink.close();
+              return;
+            }
+            (0, _util.assert)((0, _util.isArrayBuffer)(value));
+            sink.enqueue(new Uint8Array(value), 1, [value]);
+          }).catch(function (reason) {
+            sink.error(reason);
+          });
+        };
+        sink.onCancel = function (reason) {
+          rangeReader.cancel(reason);
+        };
+      }, this);
+      messageHandler.on('GetDoc', function (_ref5) {
+        var pdfInfo = _ref5.pdfInfo;
+
+        this.numPages = pdfInfo.numPages;
+        this.pdfDocument = new PDFDocumentProxy(pdfInfo, this, loadingTask);
+        loadingTask._capability.resolve(this.pdfDocument);
+      }, this);
+      messageHandler.on('PasswordRequest', function (exception) {
+        var _this11 = this;
+
+        this._passwordCapability = (0, _util.createPromiseCapability)();
+        if (loadingTask.onPassword) {
+          var updatePassword = function updatePassword(password) {
+            _this11._passwordCapability.resolve({ password: password });
+          };
+          try {
+            loadingTask.onPassword(updatePassword, exception.code);
+          } catch (ex) {
+            this._passwordCapability.reject(ex);
+          }
+        } else {
+          this._passwordCapability.reject(new _util.PasswordException(exception.message, exception.code));
+        }
+        return this._passwordCapability.promise;
+      }, this);
+      messageHandler.on('PasswordException', function (exception) {
+        loadingTask._capability.reject(new _util.PasswordException(exception.message, exception.code));
+      }, this);
+      messageHandler.on('InvalidPDF', function (exception) {
+        loadingTask._capability.reject(new _util.InvalidPDFException(exception.message));
+      }, this);
+      messageHandler.on('MissingPDF', function (exception) {
+        loadingTask._capability.reject(new _util.MissingPDFException(exception.message));
+      }, this);
+      messageHandler.on('UnexpectedResponse', function (exception) {
+        loadingTask._capability.reject(new _util.UnexpectedResponseException(exception.message, exception.status));
+      }, this);
+      messageHandler.on('UnknownError', function (exception) {
+        loadingTask._capability.reject(new _util.UnknownErrorException(exception.message, exception.details));
+      }, this);
+      messageHandler.on('DataLoaded', function (data) {
+        if (loadingTask.onProgress) {
+          loadingTask.onProgress({
+            loaded: data.length,
+            total: data.length
+          });
+        }
+        this.downloadInfoCapability.resolve(data);
+      }, this);
+      messageHandler.on('StartRenderPage', function (data) {
+        if (this.destroyed) {
+          return;
+        }
+        var page = this.pageCache[data.pageIndex];
+        page._stats.timeEnd('Page Request');
+        page._startRenderPage(data.transparency, data.intent);
+      }, this);
+      messageHandler.on('RenderPageChunk', function (data) {
+        if (this.destroyed) {
+          return;
+        }
+        var page = this.pageCache[data.pageIndex];
+        page._renderPageChunk(data.operatorList, data.intent);
+      }, this);
+      messageHandler.on('commonobj', function (data) {
+        var _this12 = this;
+
+        if (this.destroyed) {
+          return;
+        }
+
+        var _data = _slicedToArray(data, 3),
+            id = _data[0],
+            type = _data[1],
+            exportedData = _data[2];
+
+        if (this.commonObjs.hasData(id)) {
+          return;
+        }
+        switch (type) {
+          case 'Font':
+            var params = this._params;
+            if ('error' in exportedData) {
+              var exportedError = exportedData.error;
+              (0, _util.warn)('Error during font loading: ' + exportedError);
+              this.commonObjs.resolve(id, exportedError);
+              break;
+            }
+            var fontRegistry = null;
+            if (params.pdfBug && _global_scope2.default.FontInspector && _global_scope2.default.FontInspector.enabled) {
+              fontRegistry = {
+                registerFont: function registerFont(font, url) {
+                  _global_scope2.default['FontInspector'].fontAdded(font, url);
+                }
+              };
+            }
+            var font = new _font_loader.FontFaceObject(exportedData, {
+              isEvalSupported: params.isEvalSupported,
+              disableFontFace: params.disableFontFace,
+              ignoreErrors: params.ignoreErrors,
+              onUnsupportedFeature: this._onUnsupportedFeature.bind(this),
+              fontRegistry: fontRegistry
+            });
+            var fontReady = function fontReady(fontObjs) {
+              _this12.commonObjs.resolve(id, font);
+            };
+            this.fontLoader.bind([font], fontReady);
+            break;
+          case 'FontPath':
+            this.commonObjs.resolve(id, exportedData);
+            break;
+          default:
+            throw new Error('Got unknown common object type ' + type);
+        }
+      }, this);
+      messageHandler.on('obj', function (data) {
+        if (this.destroyed) {
+          return;
+        }
+
+        var _data2 = _slicedToArray(data, 4),
+            id = _data2[0],
+            pageIndex = _data2[1],
+            type = _data2[2],
+            imageData = _data2[3];
+
+        var pageProxy = this.pageCache[pageIndex];
+        if (pageProxy.objs.hasData(id)) {
+          return;
+        }
+        switch (type) {
+          case 'JpegStream':
+            return new Promise(function (resolve, reject) {
+              var img = new Image();
+              img.onload = function () {
+                resolve(img);
+              };
+              img.onerror = function () {
+                reject(new Error('Error during JPEG image loading'));
+              };
+              img.src = imageData;
+            }).then(function (img) {
+              pageProxy.objs.resolve(id, img);
+            });
+          case 'Image':
+            pageProxy.objs.resolve(id, imageData);
+            var MAX_IMAGE_SIZE_TO_STORE = 8000000;
+            if (imageData && 'data' in imageData && imageData.data.length > MAX_IMAGE_SIZE_TO_STORE) {
+              pageProxy.cleanupAfterRender = true;
+            }
+            break;
+          default:
+            throw new Error('Got unknown object type ' + type);
+        }
+      }, this);
+      messageHandler.on('DocProgress', function (data) {
+        if (this.destroyed) {
+          return;
+        }
+        if (loadingTask.onProgress) {
+          loadingTask.onProgress({
+            loaded: data.loaded,
+            total: data.total
+          });
+        }
+      }, this);
+      messageHandler.on('PageError', function (data) {
+        if (this.destroyed) {
+          return;
+        }
+        var page = this.pageCache[data.pageNum - 1];
+        var intentState = page.intentStates[data.intent];
+        if (intentState.displayReadyCapability) {
+          intentState.displayReadyCapability.reject(data.error);
+        } else {
+          throw new Error(data.error);
+        }
+        if (intentState.operatorList) {
+          intentState.operatorList.lastChunk = true;
+          for (var i = 0; i < intentState.renderTasks.length; i++) {
+            intentState.renderTasks[i].operatorListChanged();
+          }
+        }
+      }, this);
+      messageHandler.on('UnsupportedFeature', this._onUnsupportedFeature, this);
+      messageHandler.on('JpegDecode', function (data) {
+        if (this.destroyed) {
+          return Promise.reject(new Error('Worker was destroyed'));
+        }
+        if (typeof document === 'undefined') {
+          return Promise.reject(new Error('"document" is not defined.'));
+        }
+
+        var _data3 = _slicedToArray(data, 2),
+            imageUrl = _data3[0],
+            components = _data3[1];
+
+        if (components !== 3 && components !== 1) {
+          return Promise.reject(new Error('Only 3 components or 1 component can be returned'));
+        }
+        return new Promise(function (resolve, reject) {
+          var img = new Image();
+          img.onload = function () {
+            var width = img.width;
+            var height = img.height;
+            var size = width * height;
+            var rgbaLength = size * 4;
+            var buf = new Uint8ClampedArray(size * components);
+            var tmpCanvas = document.createElement('canvas');
+            tmpCanvas.width = width;
+            tmpCanvas.height = height;
+            var tmpCtx = tmpCanvas.getContext('2d');
+            tmpCtx.drawImage(img, 0, 0);
+            var data = tmpCtx.getImageData(0, 0, width, height).data;
+            if (components === 3) {
+              for (var i = 0, j = 0; i < rgbaLength; i += 4, j += 3) {
+                buf[j] = data[i];
+                buf[j + 1] = data[i + 1];
+                buf[j + 2] = data[i + 2];
+              }
+            } else if (components === 1) {
+              for (var _i = 0, _j = 0; _i < rgbaLength; _i += 4, _j++) {
+                buf[_j] = data[_i];
+              }
+            }
+            resolve({
+              data: buf,
+              width: width,
+              height: height
+            });
+          };
+          img.onerror = function () {
+            reject(new Error('JpegDecode failed to load image'));
+          };
+          img.src = imageUrl;
+        });
+      }, this);
+      messageHandler.on('FetchBuiltInCMap', function (data) {
+        if (this.destroyed) {
+          return Promise.reject(new Error('Worker was destroyed'));
+        }
+        return this.CMapReaderFactory.fetch({ name: data.name });
+      }, this);
+    }
+  }, {
+    key: '_onUnsupportedFeature',
+    value: function _onUnsupportedFeature(_ref6) {
+      var featureId = _ref6.featureId;
+
+      if (this.destroyed) {
+        return;
+      }
+      if (this.loadingTask.onUnsupportedFeature) {
+        this.loadingTask.onUnsupportedFeature(featureId);
+      }
+    }
+  }, {
+    key: 'getData',
+    value: function getData() {
+      return this.messageHandler.sendWithPromise('GetData', null);
+    }
+  }, {
+    key: 'getPage',
+    value: function getPage(pageNumber) {
+      var _this13 = this;
+
+      if (!Number.isInteger(pageNumber) || pageNumber <= 0 || pageNumber > this.numPages) {
+        return Promise.reject(new Error('Invalid page request'));
+      }
+      var pageIndex = pageNumber - 1;
+      if (pageIndex in this.pagePromises) {
+        return this.pagePromises[pageIndex];
+      }
+      var promise = this.messageHandler.sendWithPromise('GetPage', { pageIndex: pageIndex }).then(function (pageInfo) {
+        if (_this13.destroyed) {
+          throw new Error('Transport destroyed');
+        }
+        var page = new PDFPageProxy(pageIndex, pageInfo, _this13, _this13._params.pdfBug);
+        _this13.pageCache[pageIndex] = page;
+        return page;
+      });
+      this.pagePromises[pageIndex] = promise;
+      return promise;
+    }
+  }, {
+    key: 'getPageIndex',
+    value: function getPageIndex(ref) {
+      return this.messageHandler.sendWithPromise('GetPageIndex', { ref: ref }).catch(function (reason) {
+        return Promise.reject(new Error(reason));
+      });
+    }
+  }, {
+    key: 'getAnnotations',
+    value: function getAnnotations(pageIndex, intent) {
+      return this.messageHandler.sendWithPromise('GetAnnotations', {
+        pageIndex: pageIndex,
+        intent: intent
+      });
+    }
+  }, {
+    key: 'getDestinations',
+    value: function getDestinations() {
+      return this.messageHandler.sendWithPromise('GetDestinations', null);
+    }
+  }, {
+    key: 'getDestination',
+    value: function getDestination(id) {
+      if (typeof id !== 'string') {
+        return Promise.reject(new Error('Invalid destination request.'));
+      }
+      return this.messageHandler.sendWithPromise('GetDestination', { id: id });
+    }
+  }, {
+    key: 'getPageLabels',
+    value: function getPageLabels() {
+      return this.messageHandler.sendWithPromise('GetPageLabels', null);
+    }
+  }, {
+    key: 'getPageMode',
+    value: function getPageMode() {
+      return this.messageHandler.sendWithPromise('GetPageMode', null);
+    }
+  }, {
+    key: 'getAttachments',
+    value: function getAttachments() {
+      return this.messageHandler.sendWithPromise('GetAttachments', null);
+    }
+  }, {
+    key: 'getJavaScript',
+    value: function getJavaScript() {
+      return this.messageHandler.sendWithPromise('GetJavaScript', null);
+    }
+  }, {
+    key: 'getOutline',
+    value: function getOutline() {
+      return this.messageHandler.sendWithPromise('GetOutline', null);
+    }
+  }, {
+    key: 'getPermissions',
+    value: function getPermissions() {
+      return this.messageHandler.sendWithPromise('GetPermissions', null);
+    }
+  }, {
+    key: 'getMetadata',
+    value: function getMetadata() {
+      var _this14 = this;
+
+      return this.messageHandler.sendWithPromise('GetMetadata', null).then(function (results) {
+        return {
+          info: results[0],
+          metadata: results[1] ? new _metadata.Metadata(results[1]) : null,
+          contentDispositionFilename: _this14._fullReader ? _this14._fullReader.filename : null
+        };
+      });
+    }
+  }, {
+    key: 'getStats',
+    value: function getStats() {
+      return this.messageHandler.sendWithPromise('GetStats', null);
+    }
+  }, {
+    key: 'startCleanup',
+    value: function startCleanup() {
+      var _this15 = this;
+
+      this.messageHandler.sendWithPromise('Cleanup', null).then(function () {
+        for (var i = 0, ii = _this15.pageCache.length; i < ii; i++) {
+          var page = _this15.pageCache[i];
+          if (page) {
+            page.cleanup();
+          }
+        }
+        _this15.commonObjs.clear();
+        _this15.fontLoader.clear();
+      });
+    }
+  }, {
+    key: 'loadingParams',
+    get: function get() {
+      var params = this._params;
+      return (0, _util.shadow)(this, 'loadingParams', {
+        disableAutoFetch: params.disableAutoFetch,
+        disableCreateObjectURL: params.disableCreateObjectURL,
+        disableFontFace: params.disableFontFace,
+        nativeImageDecoderSupport: params.nativeImageDecoderSupport
+      });
+    }
+  }]);
+
+  return WorkerTransport;
+}();
+
+var PDFObjects = function PDFObjectsClosure() {
+  function PDFObjects() {
+    this.objs = Object.create(null);
+  }
+  PDFObjects.prototype = {
+    ensureObj: function PDFObjects_ensureObj(objId) {
+      if (this.objs[objId]) {
+        return this.objs[objId];
+      }
+      var obj = {
+        capability: (0, _util.createPromiseCapability)(),
+        data: null,
+        resolved: false
+      };
+      this.objs[objId] = obj;
+      return obj;
+    },
+    get: function PDFObjects_get(objId, callback) {
+      if (callback) {
+        this.ensureObj(objId).capability.promise.then(callback);
+        return null;
+      }
+      var obj = this.objs[objId];
+      if (!obj || !obj.resolved) {
+        throw new Error('Requesting object that isn\'t resolved yet ' + objId);
+      }
+      return obj.data;
+    },
+    resolve: function PDFObjects_resolve(objId, data) {
+      var obj = this.ensureObj(objId);
+      obj.resolved = true;
+      obj.data = data;
+      obj.capability.resolve(data);
+    },
+    isResolved: function PDFObjects_isResolved(objId) {
+      var objs = this.objs;
+      if (!objs[objId]) {
+        return false;
+      }
+      return objs[objId].resolved;
+    },
+    hasData: function PDFObjects_hasData(objId) {
+      return this.isResolved(objId);
+    },
+    getData: function PDFObjects_getData(objId) {
+      var objs = this.objs;
+      if (!objs[objId] || !objs[objId].resolved) {
+        return null;
+      }
+      return objs[objId].data;
+    },
+    clear: function PDFObjects_clear() {
+      this.objs = Object.create(null);
+    }
+  };
+  return PDFObjects;
+}();
+var RenderTask = function RenderTaskClosure() {
+  function RenderTask(internalRenderTask) {
+    this._internalRenderTask = internalRenderTask;
+    this.onContinue = null;
+  }
+  RenderTask.prototype = {
+    get promise() {
+      return this._internalRenderTask.capability.promise;
+    },
+    cancel: function RenderTask_cancel() {
+      this._internalRenderTask.cancel();
+    },
+    then: function RenderTask_then(onFulfilled, onRejected) {
+      return this.promise.then.apply(this.promise, arguments);
+    }
+  };
+  return RenderTask;
+}();
+var InternalRenderTask = function InternalRenderTaskClosure() {
+  var canvasInRendering = new WeakMap();
+  function InternalRenderTask(callback, params, objs, commonObjs, operatorList, pageNumber, canvasFactory, webGLContext) {
+    var pdfBug = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : false;
+
+    this.callback = callback;
+    this.params = params;
+    this.objs = objs;
+    this.commonObjs = commonObjs;
+    this.operatorListIdx = null;
+    this.operatorList = operatorList;
+    this.pageNumber = pageNumber;
+    this.canvasFactory = canvasFactory;
+    this.webGLContext = webGLContext;
+    this._pdfBug = pdfBug;
+    this.running = false;
+    this.graphicsReadyCallback = null;
+    this.graphicsReady = false;
+    this.useRequestAnimationFrame = false;
+    this.cancelled = false;
+    this.capability = (0, _util.createPromiseCapability)();
+    this.task = new RenderTask(this);
+    this._continueBound = this._continue.bind(this);
+    this._scheduleNextBound = this._scheduleNext.bind(this);
+    this._nextBound = this._next.bind(this);
+    this._canvas = params.canvasContext.canvas;
+  }
+  InternalRenderTask.prototype = {
+    initializeGraphics: function initializeGraphics(transparency) {
+      if (this.cancelled) {
+        return;
+      }
+      if (this._canvas) {
+        if (canvasInRendering.has(this._canvas)) {
+          throw new Error('Cannot use the same canvas during multiple render() operations. ' + 'Use different canvas or ensure previous operations were ' + 'cancelled or completed.');
+        }
+        canvasInRendering.set(this._canvas, this);
+      }
+      if (this._pdfBug && _global_scope2.default.StepperManager && _global_scope2.default.StepperManager.enabled) {
+        this.stepper = _global_scope2.default.StepperManager.create(this.pageNumber - 1);
+        this.stepper.init(this.operatorList);
+        this.stepper.nextBreakPoint = this.stepper.getNextBreakPoint();
+      }
+      var params = this.params;
+      this.gfx = new _canvas.CanvasGraphics(params.canvasContext, this.commonObjs, this.objs, this.canvasFactory, this.webGLContext, params.imageLayer);
+      this.gfx.beginDrawing({
+        transform: params.transform,
+        viewport: params.viewport,
+        transparency: transparency,
+        background: params.background
+      });
+      this.operatorListIdx = 0;
+      this.graphicsReady = true;
+      if (this.graphicsReadyCallback) {
+        this.graphicsReadyCallback();
+      }
+    },
+
+    cancel: function InternalRenderTask_cancel() {
+      this.running = false;
+      this.cancelled = true;
+      if (this._canvas) {
+        canvasInRendering.delete(this._canvas);
+      }
+      this.callback(new _dom_utils.RenderingCancelledException('Rendering cancelled, page ' + this.pageNumber, 'canvas'));
+    },
+    operatorListChanged: function InternalRenderTask_operatorListChanged() {
+      if (!this.graphicsReady) {
+        if (!this.graphicsReadyCallback) {
+          this.graphicsReadyCallback = this._continueBound;
+        }
+        return;
+      }
+      if (this.stepper) {
+        this.stepper.updateOperatorList(this.operatorList);
+      }
+      if (this.running) {
+        return;
+      }
+      this._continue();
+    },
+    _continue: function InternalRenderTask__continue() {
+      this.running = true;
+      if (this.cancelled) {
+        return;
+      }
+      if (this.task.onContinue) {
+        this.task.onContinue(this._scheduleNextBound);
+      } else {
+        this._scheduleNext();
+      }
+    },
+    _scheduleNext: function InternalRenderTask__scheduleNext() {
+      var _this16 = this;
+
+      if (this.useRequestAnimationFrame && typeof window !== 'undefined') {
+        window.requestAnimationFrame(function () {
+          _this16._nextBound().catch(_this16.callback);
+        });
+      } else {
+        Promise.resolve().then(this._nextBound).catch(this.callback);
+      }
+    },
+    _next: function InternalRenderTask__next() {
+      var _this17 = this;
+
+      return new Promise(function () {
+        if (_this17.cancelled) {
+          return;
+        }
+        _this17.operatorListIdx = _this17.gfx.executeOperatorList(_this17.operatorList, _this17.operatorListIdx, _this17._continueBound, _this17.stepper);
+        if (_this17.operatorListIdx === _this17.operatorList.argsArray.length) {
+          _this17.running = false;
+          if (_this17.operatorList.lastChunk) {
+            _this17.gfx.endDrawing();
+            if (_this17._canvas) {
+              canvasInRendering.delete(_this17._canvas);
+            }
+            _this17.callback();
+          }
+        }
+      });
+    }
+  };
+  return InternalRenderTask;
+}();
+var version, build;
+{
+  exports.version = version = '2.0.943';
+  exports.build = build = 'dc98bf76';
+}
+exports.getDocument = getDocument;
+exports.LoopbackPort = LoopbackPort;
+exports.PDFDataRangeTransport = PDFDataRangeTransport;
+exports.PDFWorker = PDFWorker;
+exports.PDFDocumentProxy = PDFDocumentProxy;
+exports.PDFPageProxy = PDFPageProxy;
+exports.setPDFNetworkStreamFactory = setPDFNetworkStreamFactory;
+exports.version = version;
+exports.build = build;
+
+/***/ }),
+/* 130 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.loadScript = exports.DummyStatTimer = exports.StatTimer = exports.DOMSVGFactory = exports.DOMCMapReaderFactory = exports.DOMCanvasFactory = exports.DEFAULT_LINK_REL = exports.LinkTarget = exports.getFilenameFromUrl = exports.addLinkAttributes = exports.RenderingCancelledException = exports.PageViewport = undefined;
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _util = __w_pdfjs_require__(1);
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var DEFAULT_LINK_REL = 'noopener noreferrer nofollow';
+var SVG_NS = 'http://www.w3.org/2000/svg';
+
+var DOMCanvasFactory = function () {
+  function DOMCanvasFactory() {
+    _classCallCheck(this, DOMCanvasFactory);
+  }
+
+  _createClass(DOMCanvasFactory, [{
+    key: 'create',
+    value: function create(width, height) {
+      if (width <= 0 || height <= 0) {
+        throw new Error('invalid canvas size');
+      }
+      var canvas = document.createElement('canvas');
+      var context = canvas.getContext('2d');
+      canvas.width = width;
+      canvas.height = height;
+      return {
+        canvas: canvas,
+        context: context
+      };
+    }
+  }, {
+    key: 'reset',
+    value: function reset(canvasAndContext, width, height) {
+      if (!canvasAndContext.canvas) {
+        throw new Error('canvas is not specified');
+      }
+      if (width <= 0 || height <= 0) {
+        throw new Error('invalid canvas size');
+      }
+      canvasAndContext.canvas.width = width;
+      canvasAndContext.canvas.height = height;
+    }
+  }, {
+    key: 'destroy',
+    value: function destroy(canvasAndContext) {
+      if (!canvasAndContext.canvas) {
+        throw new Error('canvas is not specified');
+      }
+      canvasAndContext.canvas.width = 0;
+      canvasAndContext.canvas.height = 0;
+      canvasAndContext.canvas = null;
+      canvasAndContext.context = null;
+    }
+  }]);
+
+  return DOMCanvasFactory;
+}();
+
+var DOMCMapReaderFactory = function () {
+  function DOMCMapReaderFactory(_ref) {
+    var _ref$baseUrl = _ref.baseUrl,
+        baseUrl = _ref$baseUrl === undefined ? null : _ref$baseUrl,
+        _ref$isCompressed = _ref.isCompressed,
+        isCompressed = _ref$isCompressed === undefined ? false : _ref$isCompressed;
+
+    _classCallCheck(this, DOMCMapReaderFactory);
+
+    this.baseUrl = baseUrl;
+    this.isCompressed = isCompressed;
+  }
+
+  _createClass(DOMCMapReaderFactory, [{
+    key: 'fetch',
+    value: function fetch(_ref2) {
+      var _this = this;
+
+      var name = _ref2.name;
+
+      if (!this.baseUrl) {
+        return Promise.reject(new Error('The CMap "baseUrl" parameter must be specified, ensure that ' + 'the "cMapUrl" and "cMapPacked" API parameters are provided.'));
+      }
+      if (!name) {
+        return Promise.reject(new Error('CMap name must be specified.'));
+      }
+      return new Promise(function (resolve, reject) {
+        var url = _this.baseUrl + name + (_this.isCompressed ? '.bcmap' : '');
+        var request = new XMLHttpRequest();
+        request.open('GET', url, true);
+        if (_this.isCompressed) {
+          request.responseType = 'arraybuffer';
+        }
+        request.onreadystatechange = function () {
+          if (request.readyState !== XMLHttpRequest.DONE) {
+            return;
+          }
+          if (request.status === 200 || request.status === 0) {
+            var data = void 0;
+            if (_this.isCompressed && request.response) {
+              data = new Uint8Array(request.response);
+            } else if (!_this.isCompressed && request.responseText) {
+              data = (0, _util.stringToBytes)(request.responseText);
+            }
+            if (data) {
+              resolve({
+                cMapData: data,
+                compressionType: _this.isCompressed ? _util.CMapCompressionType.BINARY : _util.CMapCompressionType.NONE
+              });
+              return;
+            }
+          }
+          reject(new Error('Unable to load ' + (_this.isCompressed ? 'binary ' : '') + 'CMap at: ' + url));
+        };
+        request.send(null);
+      });
+    }
+  }]);
+
+  return DOMCMapReaderFactory;
+}();
+
+var DOMSVGFactory = function () {
+  function DOMSVGFactory() {
+    _classCallCheck(this, DOMSVGFactory);
+  }
+
+  _createClass(DOMSVGFactory, [{
+    key: 'create',
+    value: function create(width, height) {
+      (0, _util.assert)(width > 0 && height > 0, 'Invalid SVG dimensions');
+      var svg = document.createElementNS(SVG_NS, 'svg:svg');
+      svg.setAttribute('version', '1.1');
+      svg.setAttribute('width', width + 'px');
+      svg.setAttribute('height', height + 'px');
+      svg.setAttribute('preserveAspectRatio', 'none');
+      svg.setAttribute('viewBox', '0 0 ' + width + ' ' + height);
+      return svg;
+    }
+  }, {
+    key: 'createElement',
+    value: function createElement(type) {
+      (0, _util.assert)(typeof type === 'string', 'Invalid SVG element type');
+      return document.createElementNS(SVG_NS, type);
+    }
+  }]);
+
+  return DOMSVGFactory;
+}();
+
+var PageViewport = function () {
+  function PageViewport(_ref3) {
+    var viewBox = _ref3.viewBox,
+        scale = _ref3.scale,
+        rotation = _ref3.rotation,
+        _ref3$offsetX = _ref3.offsetX,
+        offsetX = _ref3$offsetX === undefined ? 0 : _ref3$offsetX,
+        _ref3$offsetY = _ref3.offsetY,
+        offsetY = _ref3$offsetY === undefined ? 0 : _ref3$offsetY,
+        _ref3$dontFlip = _ref3.dontFlip,
+        dontFlip = _ref3$dontFlip === undefined ? false : _ref3$dontFlip;
+
+    _classCallCheck(this, PageViewport);
+
+    this.viewBox = viewBox;
+    this.scale = scale;
+    this.rotation = rotation;
+    this.offsetX = offsetX;
+    this.offsetY = offsetY;
+    var centerX = (viewBox[2] + viewBox[0]) / 2;
+    var centerY = (viewBox[3] + viewBox[1]) / 2;
+    var rotateA = void 0,
+        rotateB = void 0,
+        rotateC = void 0,
+        rotateD = void 0;
+    rotation = rotation % 360;
+    rotation = rotation < 0 ? rotation + 360 : rotation;
+    switch (rotation) {
+      case 180:
+        rotateA = -1;
+        rotateB = 0;
+        rotateC = 0;
+        rotateD = 1;
+        break;
+      case 90:
+        rotateA = 0;
+        rotateB = 1;
+        rotateC = 1;
+        rotateD = 0;
+        break;
+      case 270:
+        rotateA = 0;
+        rotateB = -1;
+        rotateC = -1;
+        rotateD = 0;
+        break;
+      default:
+        rotateA = 1;
+        rotateB = 0;
+        rotateC = 0;
+        rotateD = -1;
+        break;
+    }
+    if (dontFlip) {
+      rotateC = -rotateC;
+      rotateD = -rotateD;
+    }
+    var offsetCanvasX = void 0,
+        offsetCanvasY = void 0;
+    var width = void 0,
+        height = void 0;
+    if (rotateA === 0) {
+      offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX;
+      offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY;
+      width = Math.abs(viewBox[3] - viewBox[1]) * scale;
+      height = Math.abs(viewBox[2] - viewBox[0]) * scale;
+    } else {
+      offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX;
+      offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY;
+      width = Math.abs(viewBox[2] - viewBox[0]) * scale;
+      height = Math.abs(viewBox[3] - viewBox[1]) * scale;
+    }
+    this.transform = [rotateA * scale, rotateB * scale, rotateC * scale, rotateD * scale, offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY, offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY];
+    this.width = width;
+    this.height = height;
+  }
+
+  _createClass(PageViewport, [{
+    key: 'clone',
+    value: function clone() {
+      var _ref4 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
+          _ref4$scale = _ref4.scale,
+          scale = _ref4$scale === undefined ? this.scale : _ref4$scale,
+          _ref4$rotation = _ref4.rotation,
+          rotation = _ref4$rotation === undefined ? this.rotation : _ref4$rotation,
+          _ref4$dontFlip = _ref4.dontFlip,
+          dontFlip = _ref4$dontFlip === undefined ? false : _ref4$dontFlip;
+
+      return new PageViewport({
+        viewBox: this.viewBox.slice(),
+        scale: scale,
+        rotation: rotation,
+        offsetX: this.offsetX,
+        offsetY: this.offsetY,
+        dontFlip: dontFlip
+      });
+    }
+  }, {
+    key: 'convertToViewportPoint',
+    value: function convertToViewportPoint(x, y) {
+      return _util.Util.applyTransform([x, y], this.transform);
+    }
+  }, {
+    key: 'convertToViewportRectangle',
+    value: function convertToViewportRectangle(rect) {
+      var tl = _util.Util.applyTransform([rect[0], rect[1]], this.transform);
+      var br = _util.Util.applyTransform([rect[2], rect[3]], this.transform);
+      return [tl[0], tl[1], br[0], br[1]];
+    }
+  }, {
+    key: 'convertToPdfPoint',
+    value: function convertToPdfPoint(x, y) {
+      return _util.Util.applyInverseTransform([x, y], this.transform);
+    }
+  }]);
+
+  return PageViewport;
+}();
+
+var RenderingCancelledException = function RenderingCancelledException() {
+  function RenderingCancelledException(msg, type) {
+    this.message = msg;
+    this.type = type;
+  }
+  RenderingCancelledException.prototype = new Error();
+  RenderingCancelledException.prototype.name = 'RenderingCancelledException';
+  RenderingCancelledException.constructor = RenderingCancelledException;
+  return RenderingCancelledException;
+}();
+var LinkTarget = {
+  NONE: 0,
+  SELF: 1,
+  BLANK: 2,
+  PARENT: 3,
+  TOP: 4
+};
+var LinkTargetStringMap = ['', '_self', '_blank', '_parent', '_top'];
+function addLinkAttributes(link) {
+  var _ref5 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
+      url = _ref5.url,
+      target = _ref5.target,
+      rel = _ref5.rel;
+
+  link.href = link.title = url ? (0, _util.removeNullCharacters)(url) : '';
+  if (url) {
+    var LinkTargetValues = Object.values(LinkTarget);
+    var targetIndex = LinkTargetValues.includes(target) ? target : LinkTarget.NONE;
+    link.target = LinkTargetStringMap[targetIndex];
+    link.rel = typeof rel === 'string' ? rel : DEFAULT_LINK_REL;
+  }
+}
+function getFilenameFromUrl(url) {
+  var anchor = url.indexOf('#');
+  var query = url.indexOf('?');
+  var end = Math.min(anchor > 0 ? anchor : url.length, query > 0 ? query : url.length);
+  return url.substring(url.lastIndexOf('/', end) + 1, end);
+}
+
+var StatTimer = function () {
+  function StatTimer() {
+    var enable = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
+
+    _classCallCheck(this, StatTimer);
+
+    this.enabled = !!enable;
+    this.started = Object.create(null);
+    this.times = [];
+  }
+
+  _createClass(StatTimer, [{
+    key: 'time',
+    value: function time(name) {
+      if (!this.enabled) {
+        return;
+      }
+      if (name in this.started) {
+        (0, _util.warn)('Timer is already running for ' + name);
+      }
+      this.started[name] = Date.now();
+    }
+  }, {
+    key: 'timeEnd',
+    value: function timeEnd(name) {
+      if (!this.enabled) {
+        return;
+      }
+      if (!(name in this.started)) {
+        (0, _util.warn)('Timer has not been started for ' + name);
+      }
+      this.times.push({
+        'name': name,
+        'start': this.started[name],
+        'end': Date.now()
+      });
+      delete this.started[name];
+    }
+  }, {
+    key: 'toString',
+    value: function toString() {
+      var times = this.times;
+      var out = '',
+          longest = 0;
+      for (var i = 0, ii = times.length; i < ii; ++i) {
+        var name = times[i]['name'];
+        if (name.length > longest) {
+          longest = name.length;
+        }
+      }
+      for (var _i = 0, _ii = times.length; _i < _ii; ++_i) {
+        var span = times[_i];
+        var duration = span.end - span.start;
+        out += span['name'].padEnd(longest) + ' ' + duration + 'ms\n';
+      }
+      return out;
+    }
+  }]);
+
+  return StatTimer;
+}();
+
+var DummyStatTimer = function () {
+  function DummyStatTimer() {
+    _classCallCheck(this, DummyStatTimer);
+
+    (0, _util.unreachable)('Cannot initialize DummyStatTimer.');
+  }
+
+  _createClass(DummyStatTimer, null, [{
+    key: 'time',
+    value: function time(name) {}
+  }, {
+    key: 'timeEnd',
+    value: function timeEnd(name) {}
+  }, {
+    key: 'toString',
+    value: function toString() {
+      return '';
+    }
+  }]);
+
+  return DummyStatTimer;
+}();
+
+function loadScript(src) {
+  return new Promise(function (resolve, reject) {
+    var script = document.createElement('script');
+    script.src = src;
+    script.onload = resolve;
+    script.onerror = function () {
+      reject(new Error('Cannot load script at: ' + script.src));
+    };
+    (document.head || document.documentElement).appendChild(script);
+  });
+}
+exports.PageViewport = PageViewport;
+exports.RenderingCancelledException = RenderingCancelledException;
+exports.addLinkAttributes = addLinkAttributes;
+exports.getFilenameFromUrl = getFilenameFromUrl;
+exports.LinkTarget = LinkTarget;
+exports.DEFAULT_LINK_REL = DEFAULT_LINK_REL;
+exports.DOMCanvasFactory = DOMCanvasFactory;
+exports.DOMCMapReaderFactory = DOMCMapReaderFactory;
+exports.DOMSVGFactory = DOMSVGFactory;
+exports.StatTimer = StatTimer;
+exports.DummyStatTimer = DummyStatTimer;
+exports.loadScript = loadScript;
+
+/***/ }),
+/* 131 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.FontLoader = exports.FontFaceObject = undefined;
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _util = __w_pdfjs_require__(1);
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var BaseFontLoader = function () {
+  function BaseFontLoader(docId) {
+    _classCallCheck(this, BaseFontLoader);
+
+    if (this.constructor === BaseFontLoader) {
+      (0, _util.unreachable)('Cannot initialize BaseFontLoader.');
+    }
+    this.docId = docId;
+    this.nativeFontFaces = [];
+    this.styleElement = null;
+    this.loadingContext = {
+      requests: [],
+      nextRequestId: 0
+    };
+  }
+
+  _createClass(BaseFontLoader, [{
+    key: 'addNativeFontFace',
+    value: function addNativeFontFace(nativeFontFace) {
+      this.nativeFontFaces.push(nativeFontFace);
+      document.fonts.add(nativeFontFace);
+    }
+  }, {
+    key: 'insertRule',
+    value: function insertRule(rule) {
+      var styleElement = this.styleElement;
+      if (!styleElement) {
+        styleElement = this.styleElement = document.createElement('style');
+        styleElement.id = 'PDFJS_FONT_STYLE_TAG_' + this.docId;
+        document.documentElement.getElementsByTagName('head')[0].appendChild(styleElement);
+      }
+      var styleSheet = styleElement.sheet;
+      styleSheet.insertRule(rule, styleSheet.cssRules.length);
+    }
+  }, {
+    key: 'clear',
+    value: function clear() {
+      this.nativeFontFaces.forEach(function (nativeFontFace) {
+        document.fonts.delete(nativeFontFace);
+      });
+      this.nativeFontFaces.length = 0;
+      if (this.styleElement) {
+        this.styleElement.remove();
+        this.styleElement = null;
+      }
+    }
+  }, {
+    key: 'bind',
+    value: function bind(fonts, callback) {
+      var rules = [];
+      var fontsToLoad = [];
+      var fontLoadPromises = [];
+      var getNativeFontPromise = function getNativeFontPromise(nativeFontFace) {
+        return nativeFontFace.loaded.catch(function (reason) {
+          (0, _util.warn)('Failed to load font "' + nativeFontFace.family + '": ' + reason);
+        });
+      };
+      var _iteratorNormalCompletion = true;
+      var _didIteratorError = false;
+      var _iteratorError = undefined;
+
+      try {
+        for (var _iterator = fonts[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
+          var font = _step.value;
+
+          if (font.attached || font.missingFile) {
+            continue;
+          }
+          font.attached = true;
+          if (this.isFontLoadingAPISupported) {
+            var nativeFontFace = font.createNativeFontFace();
+            if (nativeFontFace) {
+              this.addNativeFontFace(nativeFontFace);
+              fontLoadPromises.push(getNativeFontPromise(nativeFontFace));
+            }
+          } else {
+            var rule = font.createFontFaceRule();
+            if (rule) {
+              this.insertRule(rule);
+              rules.push(rule);
+              fontsToLoad.push(font);
+            }
+          }
+        }
+      } catch (err) {
+        _didIteratorError = true;
+        _iteratorError = err;
+      } finally {
+        try {
+          if (!_iteratorNormalCompletion && _iterator.return) {
+            _iterator.return();
+          }
+        } finally {
+          if (_didIteratorError) {
+            throw _iteratorError;
+          }
+        }
+      }
+
+      var request = this._queueLoadingCallback(callback);
+      if (this.isFontLoadingAPISupported) {
+        Promise.all(fontLoadPromises).then(request.complete);
+      } else if (rules.length > 0 && !this.isSyncFontLoadingSupported) {
+        this._prepareFontLoadEvent(rules, fontsToLoad, request);
+      } else {
+        request.complete();
+      }
+    }
+  }, {
+    key: '_queueLoadingCallback',
+    value: function _queueLoadingCallback(callback) {
+      function completeRequest() {
+        (0, _util.assert)(!request.done, 'completeRequest() cannot be called twice.');
+        request.done = true;
+        while (context.requests.length > 0 && context.requests[0].done) {
+          var otherRequest = context.requests.shift();
+          setTimeout(otherRequest.callback, 0);
+        }
+      }
+      var context = this.loadingContext;
+      var request = {
+        id: 'pdfjs-font-loading-' + context.nextRequestId++,
+        done: false,
+        complete: completeRequest,
+        callback: callback
+      };
+      context.requests.push(request);
+      return request;
+    }
+  }, {
+    key: '_prepareFontLoadEvent',
+    value: function _prepareFontLoadEvent(rules, fontsToLoad, request) {
+      (0, _util.unreachable)('Abstract method `_prepareFontLoadEvent`.');
+    }
+  }, {
+    key: 'isFontLoadingAPISupported',
+    get: function get() {
+      (0, _util.unreachable)('Abstract method `isFontLoadingAPISupported`.');
+    }
+  }, {
+    key: 'isSyncFontLoadingSupported',
+    get: function get() {
+      (0, _util.unreachable)('Abstract method `isSyncFontLoadingSupported`.');
+    }
+  }, {
+    key: '_loadTestFont',
+    get: function get() {
+      (0, _util.unreachable)('Abstract method `_loadTestFont`.');
+    }
+  }]);
+
+  return BaseFontLoader;
+}();
+
+var FontLoader = void 0;
+{
+  exports.FontLoader = FontLoader = function (_BaseFontLoader) {
+    _inherits(GenericFontLoader, _BaseFontLoader);
+
+    function GenericFontLoader(docId) {
+      _classCallCheck(this, GenericFontLoader);
+
+      var _this = _possibleConstructorReturn(this, (GenericFontLoader.__proto__ || Object.getPrototypeOf(GenericFontLoader)).call(this, docId));
+
+      _this.loadTestFontId = 0;
+      return _this;
+    }
+
+    _createClass(GenericFontLoader, [{
+      key: '_prepareFontLoadEvent',
+      value: function _prepareFontLoadEvent(rules, fonts, request) {
+        function int32(data, offset) {
+          return data.charCodeAt(offset) << 24 | data.charCodeAt(offset + 1) << 16 | data.charCodeAt(offset + 2) << 8 | data.charCodeAt(offset + 3) & 0xff;
+        }
+        function spliceString(s, offset, remove, insert) {
+          var chunk1 = s.substring(0, offset);
+          var chunk2 = s.substring(offset + remove);
+          return chunk1 + insert + chunk2;
+        }
+        var i = void 0,
+            ii = void 0;
+        var canvas = document.createElement('canvas');
+        canvas.width = 1;
+        canvas.height = 1;
+        var ctx = canvas.getContext('2d');
+        var called = 0;
+        function isFontReady(name, callback) {
+          called++;
+          if (called > 30) {
+            (0, _util.warn)('Load test font never loaded.');
+            callback();
+            return;
+          }
+          ctx.font = '30px ' + name;
+          ctx.fillText('.', 0, 20);
+          var imageData = ctx.getImageData(0, 0, 1, 1);
+          if (imageData.data[3] > 0) {
+            callback();
+            return;
+          }
+          setTimeout(isFontReady.bind(null, name, callback));
+        }
+        var loadTestFontId = 'lt' + Date.now() + this.loadTestFontId++;
+        var data = this._loadTestFont;
+        var COMMENT_OFFSET = 976;
+        data = spliceString(data, COMMENT_OFFSET, loadTestFontId.length, loadTestFontId);
+        var CFF_CHECKSUM_OFFSET = 16;
+        var XXXX_VALUE = 0x58585858;
+        var checksum = int32(data, CFF_CHECKSUM_OFFSET);
+        for (i = 0, ii = loadTestFontId.length - 3; i < ii; i += 4) {
+          checksum = checksum - XXXX_VALUE + int32(loadTestFontId, i) | 0;
+        }
+        if (i < loadTestFontId.length) {
+          checksum = checksum - XXXX_VALUE + int32(loadTestFontId + 'XXX', i) | 0;
+        }
+        data = spliceString(data, CFF_CHECKSUM_OFFSET, 4, (0, _util.string32)(checksum));
+        var url = 'url(data:font/opentype;base64,' + btoa(data) + ');';
+        var rule = '@font-face {font-family:"' + loadTestFontId + '";src:' + url + '}';
+        this.insertRule(rule);
+        var names = [];
+        for (i = 0, ii = fonts.length; i < ii; i++) {
+          names.push(fonts[i].loadedName);
+        }
+        names.push(loadTestFontId);
+        var div = document.createElement('div');
+        div.setAttribute('style', 'visibility: hidden;' + 'width: 10px; height: 10px;' + 'position: absolute; top: 0px; left: 0px;');
+        for (i = 0, ii = names.length; i < ii; ++i) {
+          var span = document.createElement('span');
+          span.textContent = 'Hi';
+          span.style.fontFamily = names[i];
+          div.appendChild(span);
+        }
+        document.body.appendChild(div);
+        isFontReady(loadTestFontId, function () {
+          document.body.removeChild(div);
+          request.complete();
+        });
+      }
+    }, {
+      key: 'isFontLoadingAPISupported',
+      get: function get() {
+        var supported = typeof document !== 'undefined' && !!document.fonts;
+        if (supported && typeof navigator !== 'undefined') {
+          var m = /Mozilla\/5.0.*?rv:(\d+).*? Gecko/.exec(navigator.userAgent);
+          if (m && m[1] < 63) {
+            supported = false;
+          }
+        }
+        return (0, _util.shadow)(this, 'isFontLoadingAPISupported', supported);
+      }
+    }, {
+      key: 'isSyncFontLoadingSupported',
+      get: function get() {
+        var supported = false;
+        if (typeof navigator === 'undefined') {
+          supported = true;
+        } else {
+          var m = /Mozilla\/5.0.*?rv:(\d+).*? Gecko/.exec(navigator.userAgent);
+          if (m && m[1] >= 14) {
+            supported = true;
+          }
+        }
+        return (0, _util.shadow)(this, 'isSyncFontLoadingSupported', supported);
+      }
+    }, {
+      key: '_loadTestFont',
+      get: function get() {
+        var getLoadTestFont = function getLoadTestFont() {
+          return atob('T1RUTwALAIAAAwAwQ0ZGIDHtZg4AAAOYAAAAgUZGVE1lkzZwAAAEHAAAABxHREVGABQA' + 'FQAABDgAAAAeT1MvMlYNYwkAAAEgAAAAYGNtYXABDQLUAAACNAAAAUJoZWFk/xVFDQAA' + 'ALwAAAA2aGhlYQdkA+oAAAD0AAAAJGhtdHgD6AAAAAAEWAAAAAZtYXhwAAJQAAAAARgA' + 'AAAGbmFtZVjmdH4AAAGAAAAAsXBvc3T/hgAzAAADeAAAACAAAQAAAAEAALZRFsRfDzz1' + 'AAsD6AAAAADOBOTLAAAAAM4KHDwAAAAAA+gDIQAAAAgAAgAAAAAAAAABAAADIQAAAFoD' + '6AAAAAAD6AABAAAAAAAAAAAAAAAAAAAAAQAAUAAAAgAAAAQD6AH0AAUAAAKKArwAAACM' + 'AooCvAAAAeAAMQECAAACAAYJAAAAAAAAAAAAAQAAAAAAAAAAAAAAAFBmRWQAwAAuAC4D' + 'IP84AFoDIQAAAAAAAQAAAAAAAAAAACAAIAABAAAADgCuAAEAAAAAAAAAAQAAAAEAAAAA' + 'AAEAAQAAAAEAAAAAAAIAAQAAAAEAAAAAAAMAAQAAAAEAAAAAAAQAAQAAAAEAAAAAAAUA' + 'AQAAAAEAAAAAAAYAAQAAAAMAAQQJAAAAAgABAAMAAQQJAAEAAgABAAMAAQQJAAIAAgAB' + 'AAMAAQQJAAMAAgABAAMAAQQJAAQAAgABAAMAAQQJAAUAAgABAAMAAQQJAAYAAgABWABY' + 'AAAAAAAAAwAAAAMAAAAcAAEAAAAAADwAAwABAAAAHAAEACAAAAAEAAQAAQAAAC7//wAA' + 'AC7////TAAEAAAAAAAABBgAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + 'AAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAD/gwAyAAAAAQAAAAAAAAAAAAAAAAAA' + 'AAABAAQEAAEBAQJYAAEBASH4DwD4GwHEAvgcA/gXBIwMAYuL+nz5tQXkD5j3CBLnEQAC' + 'AQEBIVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYAAABAQAADwACAQEEE/t3' + 'Dov6fAH6fAT+fPp8+nwHDosMCvm1Cvm1DAz6fBQAAAAAAAABAAAAAMmJbzEAAAAAzgTj' + 'FQAAAADOBOQpAAEAAAAAAAAADAAUAAQAAAABAAAAAgABAAAAAAAAAAAD6AAAAAAAAA==');
+        };
+        return (0, _util.shadow)(this, '_loadTestFont', getLoadTestFont());
+      }
+    }]);
+
+    return GenericFontLoader;
+  }(BaseFontLoader);
+}
+var IsEvalSupportedCached = {
+  get value() {
+    return (0, _util.shadow)(this, 'value', (0, _util.isEvalSupported)());
+  }
+};
+
+var FontFaceObject = function () {
+  function FontFaceObject(translatedData, _ref) {
+    var _ref$isEvalSupported = _ref.isEvalSupported,
+        isEvalSupported = _ref$isEvalSupported === undefined ? true : _ref$isEvalSupported,
+        _ref$disableFontFace = _ref.disableFontFace,
+        disableFontFace = _ref$disableFontFace === undefined ? false : _ref$disableFontFace,
+        _ref$ignoreErrors = _ref.ignoreErrors,
+        ignoreErrors = _ref$ignoreErrors === undefined ? false : _ref$ignoreErrors,
+        _ref$onUnsupportedFea = _ref.onUnsupportedFeature,
+        onUnsupportedFeature = _ref$onUnsupportedFea === undefined ? null : _ref$onUnsupportedFea,
+        _ref$fontRegistry = _ref.fontRegistry,
+        fontRegistry = _ref$fontRegistry === undefined ? null : _ref$fontRegistry;
+
+    _classCallCheck(this, FontFaceObject);
+
+    this.compiledGlyphs = Object.create(null);
+    for (var i in translatedData) {
+      this[i] = translatedData[i];
+    }
+    this.isEvalSupported = isEvalSupported !== false;
+    this.disableFontFace = disableFontFace === true;
+    this.ignoreErrors = ignoreErrors === true;
+    this._onUnsupportedFeature = onUnsupportedFeature;
+    this.fontRegistry = fontRegistry;
+  }
+
+  _createClass(FontFaceObject, [{
+    key: 'createNativeFontFace',
+    value: function createNativeFontFace() {
+      if (!this.data || this.disableFontFace) {
+        return null;
+      }
+      var nativeFontFace = new FontFace(this.loadedName, this.data, {});
+      if (this.fontRegistry) {
+        this.fontRegistry.registerFont(this);
+      }
+      return nativeFontFace;
+    }
+  }, {
+    key: 'createFontFaceRule',
+    value: function createFontFaceRule() {
+      if (!this.data || this.disableFontFace) {
+        return null;
+      }
+      var data = (0, _util.bytesToString)(new Uint8Array(this.data));
+      var url = 'url(data:' + this.mimetype + ';base64,' + btoa(data) + ');';
+      var rule = '@font-face {font-family:"' + this.loadedName + '";src:' + url + '}';
+      if (this.fontRegistry) {
+        this.fontRegistry.registerFont(this, url);
+      }
+      return rule;
+    }
+  }, {
+    key: 'getPathGenerator',
+    value: function getPathGenerator(objs, character) {
+      if (this.compiledGlyphs[character] !== undefined) {
+        return this.compiledGlyphs[character];
+      }
+      var cmds = void 0,
+          current = void 0;
+      try {
+        cmds = objs.get(this.loadedName + '_path_' + character);
+      } catch (ex) {
+        if (!this.ignoreErrors) {
+          throw ex;
+        }
+        if (this._onUnsupportedFeature) {
+          this._onUnsupportedFeature({ featureId: _util.UNSUPPORTED_FEATURES.font });
+        }
+        (0, _util.warn)('getPathGenerator - ignoring character: "' + ex + '".');
+        return this.compiledGlyphs[character] = function (c, size) {};
+      }
+      if (this.isEvalSupported && IsEvalSupportedCached.value) {
+        var args = void 0,
+            js = '';
+        for (var i = 0, ii = cmds.length; i < ii; i++) {
+          current = cmds[i];
+          if (current.args !== undefined) {
+            args = current.args.join(',');
+          } else {
+            args = '';
+          }
+          js += 'c.' + current.cmd + '(' + args + ');\n';
+        }
+        return this.compiledGlyphs[character] = new Function('c', 'size', js);
+      }
+      return this.compiledGlyphs[character] = function (c, size) {
+        for (var _i = 0, _ii = cmds.length; _i < _ii; _i++) {
+          current = cmds[_i];
+          if (current.cmd === 'scale') {
+            current.args = [size, -size];
+          }
+          c[current.cmd].apply(c, current.args);
+        }
+      };
+    }
+  }]);
+
+  return FontFaceObject;
+}();
+
+exports.FontFaceObject = FontFaceObject;
+exports.FontLoader = FontLoader;
+
+/***/ }),
+/* 132 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var compatibilityParams = Object.create(null);
+{
+  var isNodeJS = __w_pdfjs_require__(4);
+  var userAgent = typeof navigator !== 'undefined' && navigator.userAgent || '';
+  var isIE = /Trident/.test(userAgent);
+  var isIOSChrome = /CriOS/.test(userAgent);
+  (function checkOnBlobSupport() {
+    if (isIE || isIOSChrome) {
+      compatibilityParams.disableCreateObjectURL = true;
+    }
+  })();
+  (function checkFontFaceAndImage() {
+    if (isNodeJS()) {
+      compatibilityParams.disableFontFace = true;
+      compatibilityParams.nativeImageDecoderSupport = 'none';
+    }
+  })();
+}
+exports.apiCompatibilityParams = Object.freeze(compatibilityParams);
+
+/***/ }),
+/* 133 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.CanvasGraphics = undefined;
+
+var _util = __w_pdfjs_require__(1);
+
+var _pattern_helper = __w_pdfjs_require__(134);
+
+var MIN_FONT_SIZE = 16;
+var MAX_FONT_SIZE = 100;
+var MAX_GROUP_SIZE = 4096;
+var MIN_WIDTH_FACTOR = 0.65;
+var COMPILE_TYPE3_GLYPHS = true;
+var MAX_SIZE_TO_COMPILE = 1000;
+var FULL_CHUNK_HEIGHT = 16;
+var IsLittleEndianCached = {
+  get value() {
+    return (0, _util.shadow)(IsLittleEndianCached, 'value', (0, _util.isLittleEndian)());
+  }
+};
+function addContextCurrentTransform(ctx) {
+  if (!ctx.mozCurrentTransform) {
+    ctx._originalSave = ctx.save;
+    ctx._originalRestore = ctx.restore;
+    ctx._originalRotate = ctx.rotate;
+    ctx._originalScale = ctx.scale;
+    ctx._originalTranslate = ctx.translate;
+    ctx._originalTransform = ctx.transform;
+    ctx._originalSetTransform = ctx.setTransform;
+    ctx._transformMatrix = ctx._transformMatrix || [1, 0, 0, 1, 0, 0];
+    ctx._transformStack = [];
+    Object.defineProperty(ctx, 'mozCurrentTransform', {
+      get: function getCurrentTransform() {
+        return this._transformMatrix;
+      }
+    });
+    Object.defineProperty(ctx, 'mozCurrentTransformInverse', {
+      get: function getCurrentTransformInverse() {
+        var m = this._transformMatrix;
+        var a = m[0],
+            b = m[1],
+            c = m[2],
+            d = m[3],
+            e = m[4],
+            f = m[5];
+        var ad_bc = a * d - b * c;
+        var bc_ad = b * c - a * d;
+        return [d / ad_bc, b / bc_ad, c / bc_ad, a / ad_bc, (d * e - c * f) / bc_ad, (b * e - a * f) / ad_bc];
+      }
+    });
+    ctx.save = function ctxSave() {
+      var old = this._transformMatrix;
+      this._transformStack.push(old);
+      this._transformMatrix = old.slice(0, 6);
+      this._originalSave();
+    };
+    ctx.restore = function ctxRestore() {
+      var prev = this._transformStack.pop();
+      if (prev) {
+        this._transformMatrix = prev;
+        this._originalRestore();
+      }
+    };
+    ctx.translate = function ctxTranslate(x, y) {
+      var m = this._transformMatrix;
+      m[4] = m[0] * x + m[2] * y + m[4];
+      m[5] = m[1] * x + m[3] * y + m[5];
+      this._originalTranslate(x, y);
+    };
+    ctx.scale = function ctxScale(x, y) {
+      var m = this._transformMatrix;
+      m[0] = m[0] * x;
+      m[1] = m[1] * x;
+      m[2] = m[2] * y;
+      m[3] = m[3] * y;
+      this._originalScale(x, y);
+    };
+    ctx.transform = function ctxTransform(a, b, c, d, e, f) {
+      var m = this._transformMatrix;
+      this._transformMatrix = [m[0] * a + m[2] * b, m[1] * a + m[3] * b, m[0] * c + m[2] * d, m[1] * c + m[3] * d, m[0] * e + m[2] * f + m[4], m[1] * e + m[3] * f + m[5]];
+      ctx._originalTransform(a, b, c, d, e, f);
+    };
+    ctx.setTransform = function ctxSetTransform(a, b, c, d, e, f) {
+      this._transformMatrix = [a, b, c, d, e, f];
+      ctx._originalSetTransform(a, b, c, d, e, f);
+    };
+    ctx.rotate = function ctxRotate(angle) {
+      var cosValue = Math.cos(angle);
+      var sinValue = Math.sin(angle);
+      var m = this._transformMatrix;
+      this._transformMatrix = [m[0] * cosValue + m[2] * sinValue, m[1] * cosValue + m[3] * sinValue, m[0] * -sinValue + m[2] * cosValue, m[1] * -sinValue + m[3] * cosValue, m[4], m[5]];
+      this._originalRotate(angle);
+    };
+  }
+}
+var CachedCanvases = function CachedCanvasesClosure() {
+  function CachedCanvases(canvasFactory) {
+    this.canvasFactory = canvasFactory;
+    this.cache = Object.create(null);
+  }
+  CachedCanvases.prototype = {
+    getCanvas: function CachedCanvases_getCanvas(id, width, height, trackTransform) {
+      var canvasEntry;
+      if (this.cache[id] !== undefined) {
+        canvasEntry = this.cache[id];
+        this.canvasFactory.reset(canvasEntry, width, height);
+        canvasEntry.context.setTransform(1, 0, 0, 1, 0, 0);
+      } else {
+        canvasEntry = this.canvasFactory.create(width, height);
+        this.cache[id] = canvasEntry;
+      }
+      if (trackTransform) {
+        addContextCurrentTransform(canvasEntry.context);
+      }
+      return canvasEntry;
+    },
+    clear: function clear() {
+      for (var id in this.cache) {
+        var canvasEntry = this.cache[id];
+        this.canvasFactory.destroy(canvasEntry);
+        delete this.cache[id];
+      }
+    }
+  };
+  return CachedCanvases;
+}();
+function compileType3Glyph(imgData) {
+  var POINT_TO_PROCESS_LIMIT = 1000;
+  var width = imgData.width,
+      height = imgData.height;
+  var i,
+      j,
+      j0,
+      width1 = width + 1;
+  var points = new Uint8Array(width1 * (height + 1));
+  var POINT_TYPES = new Uint8Array([0, 2, 4, 0, 1, 0, 5, 4, 8, 10, 0, 8, 0, 2, 1, 0]);
+  var lineSize = width + 7 & ~7,
+      data0 = imgData.data;
+  var data = new Uint8Array(lineSize * height),
+      pos = 0,
+      ii;
+  for (i = 0, ii = data0.length; i < ii; i++) {
+    var mask = 128,
+        elem = data0[i];
+    while (mask > 0) {
+      data[pos++] = elem & mask ? 0 : 255;
+      mask >>= 1;
+    }
+  }
+  var count = 0;
+  pos = 0;
+  if (data[pos] !== 0) {
+    points[0] = 1;
+    ++count;
+  }
+  for (j = 1; j < width; j++) {
+    if (data[pos] !== data[pos + 1]) {
+      points[j] = data[pos] ? 2 : 1;
+      ++count;
+    }
+    pos++;
+  }
+  if (data[pos] !== 0) {
+    points[j] = 2;
+    ++count;
+  }
+  for (i = 1; i < height; i++) {
+    pos = i * lineSize;
+    j0 = i * width1;
+    if (data[pos - lineSize] !== data[pos]) {
+      points[j0] = data[pos] ? 1 : 8;
+      ++count;
+    }
+    var sum = (data[pos] ? 4 : 0) + (data[pos - lineSize] ? 8 : 0);
+    for (j = 1; j < width; j++) {
+      sum = (sum >> 2) + (data[pos + 1] ? 4 : 0) + (data[pos - lineSize + 1] ? 8 : 0);
+      if (POINT_TYPES[sum]) {
+        points[j0 + j] = POINT_TYPES[sum];
+        ++count;
+      }
+      pos++;
+    }
+    if (data[pos - lineSize] !== data[pos]) {
+      points[j0 + j] = data[pos] ? 2 : 4;
+      ++count;
+    }
+    if (count > POINT_TO_PROCESS_LIMIT) {
+      return null;
+    }
+  }
+  pos = lineSize * (height - 1);
+  j0 = i * width1;
+  if (data[pos] !== 0) {
+    points[j0] = 8;
+    ++count;
+  }
+  for (j = 1; j < width; j++) {
+    if (data[pos] !== data[pos + 1]) {
+      points[j0 + j] = data[pos] ? 4 : 8;
+      ++count;
+    }
+    pos++;
+  }
+  if (data[pos] !== 0) {
+    points[j0 + j] = 4;
+    ++count;
+  }
+  if (count > POINT_TO_PROCESS_LIMIT) {
+    return null;
+  }
+  var steps = new Int32Array([0, width1, -1, 0, -width1, 0, 0, 0, 1]);
+  var outlines = [];
+  for (i = 0; count && i <= height; i++) {
+    var p = i * width1;
+    var end = p + width;
+    while (p < end && !points[p]) {
+      p++;
+    }
+    if (p === end) {
+      continue;
+    }
+    var coords = [p % width1, i];
+    var type = points[p],
+        p0 = p,
+        pp;
+    do {
+      var step = steps[type];
+      do {
+        p += step;
+      } while (!points[p]);
+      pp = points[p];
+      if (pp !== 5 && pp !== 10) {
+        type = pp;
+        points[p] = 0;
+      } else {
+        type = pp & 0x33 * type >> 4;
+        points[p] &= type >> 2 | type << 2;
+      }
+      coords.push(p % width1);
+      coords.push(p / width1 | 0);
+      --count;
+    } while (p0 !== p);
+    outlines.push(coords);
+    --i;
+  }
+  var drawOutline = function drawOutline(c) {
+    c.save();
+    c.scale(1 / width, -1 / height);
+    c.translate(0, -height);
+    c.beginPath();
+    for (var i = 0, ii = outlines.length; i < ii; i++) {
+      var o = outlines[i];
+      c.moveTo(o[0], o[1]);
+      for (var j = 2, jj = o.length; j < jj; j += 2) {
+        c.lineTo(o[j], o[j + 1]);
+      }
+    }
+    c.fill();
+    c.beginPath();
+    c.restore();
+  };
+  return drawOutline;
+}
+var CanvasExtraState = function CanvasExtraStateClosure() {
+  function CanvasExtraState() {
+    this.alphaIsShape = false;
+    this.fontSize = 0;
+    this.fontSizeScale = 1;
+    this.textMatrix = _util.IDENTITY_MATRIX;
+    this.textMatrixScale = 1;
+    this.fontMatrix = _util.FONT_IDENTITY_MATRIX;
+    this.leading = 0;
+    this.x = 0;
+    this.y = 0;
+    this.lineX = 0;
+    this.lineY = 0;
+    this.charSpacing = 0;
+    this.wordSpacing = 0;
+    this.textHScale = 1;
+    this.textRenderingMode = _util.TextRenderingMode.FILL;
+    this.textRise = 0;
+    this.fillColor = '#000000';
+    this.strokeColor = '#000000';
+    this.patternFill = false;
+    this.fillAlpha = 1;
+    this.strokeAlpha = 1;
+    this.lineWidth = 1;
+    this.activeSMask = null;
+    this.resumeSMaskCtx = null;
+  }
+  CanvasExtraState.prototype = {
+    clone: function CanvasExtraState_clone() {
+      return Object.create(this);
+    },
+    setCurrentPoint: function CanvasExtraState_setCurrentPoint(x, y) {
+      this.x = x;
+      this.y = y;
+    }
+  };
+  return CanvasExtraState;
+}();
+var CanvasGraphics = function CanvasGraphicsClosure() {
+  var EXECUTION_TIME = 15;
+  var EXECUTION_STEPS = 10;
+  function CanvasGraphics(canvasCtx, commonObjs, objs, canvasFactory, webGLContext, imageLayer) {
+    this.ctx = canvasCtx;
+    this.current = new CanvasExtraState();
+    this.stateStack = [];
+    this.pendingClip = null;
+    this.pendingEOFill = false;
+    this.res = null;
+    this.xobjs = null;
+    this.commonObjs = commonObjs;
+    this.objs = objs;
+    this.canvasFactory = canvasFactory;
+    this.webGLContext = webGLContext;
+    this.imageLayer = imageLayer;
+    this.groupStack = [];
+    this.processingType3 = null;
+    this.baseTransform = null;
+    this.baseTransformStack = [];
+    this.groupLevel = 0;
+    this.smaskStack = [];
+    this.smaskCounter = 0;
+    this.tempSMask = null;
+    this.cachedCanvases = new CachedCanvases(this.canvasFactory);
+    if (canvasCtx) {
+      addContextCurrentTransform(canvasCtx);
+    }
+    this._cachedGetSinglePixelWidth = null;
+  }
+  function putBinaryImageData(ctx, imgData) {
+    if (typeof ImageData !== 'undefined' && imgData instanceof ImageData) {
+      ctx.putImageData(imgData, 0, 0);
+      return;
+    }
+    var height = imgData.height,
+        width = imgData.width;
+    var partialChunkHeight = height % FULL_CHUNK_HEIGHT;
+    var fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT;
+    var totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1;
+    var chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT);
+    var srcPos = 0,
+        destPos;
+    var src = imgData.data;
+    var dest = chunkImgData.data;
+    var i, j, thisChunkHeight, elemsInThisChunk;
+    if (imgData.kind === _util.ImageKind.GRAYSCALE_1BPP) {
+      var srcLength = src.byteLength;
+      var dest32 = new Uint32Array(dest.buffer, 0, dest.byteLength >> 2);
+      var dest32DataLength = dest32.length;
+      var fullSrcDiff = width + 7 >> 3;
+      var white = 0xFFFFFFFF;
+      var black = IsLittleEndianCached.value ? 0xFF000000 : 0x000000FF;
+      for (i = 0; i < totalChunks; i++) {
+        thisChunkHeight = i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight;
+        destPos = 0;
+        for (j = 0; j < thisChunkHeight; j++) {
+          var srcDiff = srcLength - srcPos;
+          var k = 0;
+          var kEnd = srcDiff > fullSrcDiff ? width : srcDiff * 8 - 7;
+          var kEndUnrolled = kEnd & ~7;
+          var mask = 0;
+          var srcByte = 0;
+          for (; k < kEndUnrolled; k += 8) {
+            srcByte = src[srcPos++];
+            dest32[destPos++] = srcByte & 128 ? white : black;
+            dest32[destPos++] = srcByte & 64 ? white : black;
+            dest32[destPos++] = srcByte & 32 ? white : black;
+            dest32[destPos++] = srcByte & 16 ? white : black;
+            dest32[destPos++] = srcByte & 8 ? white : black;
+            dest32[destPos++] = srcByte & 4 ? white : black;
+            dest32[destPos++] = srcByte & 2 ? white : black;
+            dest32[destPos++] = srcByte & 1 ? white : black;
+          }
+          for (; k < kEnd; k++) {
+            if (mask === 0) {
+              srcByte = src[srcPos++];
+              mask = 128;
+            }
+            dest32[destPos++] = srcByte & mask ? white : black;
+            mask >>= 1;
+          }
+        }
+        while (destPos < dest32DataLength) {
+          dest32[destPos++] = 0;
+        }
+        ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);
+      }
+    } else if (imgData.kind === _util.ImageKind.RGBA_32BPP) {
+      j = 0;
+      elemsInThisChunk = width * FULL_CHUNK_HEIGHT * 4;
+      for (i = 0; i < fullChunks; i++) {
+        dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk));
+        srcPos += elemsInThisChunk;
+        ctx.putImageData(chunkImgData, 0, j);
+        j += FULL_CHUNK_HEIGHT;
+      }
+      if (i < totalChunks) {
+        elemsInThisChunk = width * partialChunkHeight * 4;
+        dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk));
+        ctx.putImageData(chunkImgData, 0, j);
+      }
+    } else if (imgData.kind === _util.ImageKind.RGB_24BPP) {
+      thisChunkHeight = FULL_CHUNK_HEIGHT;
+      elemsInThisChunk = width * thisChunkHeight;
+      for (i = 0; i < totalChunks; i++) {
+        if (i >= fullChunks) {
+          thisChunkHeight = partialChunkHeight;
+          elemsInThisChunk = width * thisChunkHeight;
+        }
+        destPos = 0;
+        for (j = elemsInThisChunk; j--;) {
+          dest[destPos++] = src[srcPos++];
+          dest[destPos++] = src[srcPos++];
+          dest[destPos++] = src[srcPos++];
+          dest[destPos++] = 255;
+        }
+        ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);
+      }
+    } else {
+      throw new Error('bad image kind: ' + imgData.kind);
+    }
+  }
+  function putBinaryImageMask(ctx, imgData) {
+    var height = imgData.height,
+        width = imgData.width;
+    var partialChunkHeight = height % FULL_CHUNK_HEIGHT;
+    var fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT;
+    var totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1;
+    var chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT);
+    var srcPos = 0;
+    var src = imgData.data;
+    var dest = chunkImgData.data;
+    for (var i = 0; i < totalChunks; i++) {
+      var thisChunkHeight = i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight;
+      var destPos = 3;
+      for (var j = 0; j < thisChunkHeight; j++) {
+        var mask = 0;
+        for (var k = 0; k < width; k++) {
+          if (!mask) {
+            var elem = src[srcPos++];
+            mask = 128;
+          }
+          dest[destPos] = elem & mask ? 0 : 255;
+          destPos += 4;
+          mask >>= 1;
+        }
+      }
+      ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);
+    }
+  }
+  function copyCtxState(sourceCtx, destCtx) {
+    var properties = ['strokeStyle', 'fillStyle', 'fillRule', 'globalAlpha', 'lineWidth', 'lineCap', 'lineJoin', 'miterLimit', 'globalCompositeOperation', 'font'];
+    for (var i = 0, ii = properties.length; i < ii; i++) {
+      var property = properties[i];
+      if (sourceCtx[property] !== undefined) {
+        destCtx[property] = sourceCtx[property];
+      }
+    }
+    if (sourceCtx.setLineDash !== undefined) {
+      destCtx.setLineDash(sourceCtx.getLineDash());
+      destCtx.lineDashOffset = sourceCtx.lineDashOffset;
+    }
+  }
+  function resetCtxToDefault(ctx) {
+    ctx.strokeStyle = '#000000';
+    ctx.fillStyle = '#000000';
+    ctx.fillRule = 'nonzero';
+    ctx.globalAlpha = 1;
+    ctx.lineWidth = 1;
+    ctx.lineCap = 'butt';
+    ctx.lineJoin = 'miter';
+    ctx.miterLimit = 10;
+    ctx.globalCompositeOperation = 'source-over';
+    ctx.font = '10px sans-serif';
+    if (ctx.setLineDash !== undefined) {
+      ctx.setLineDash([]);
+      ctx.lineDashOffset = 0;
+    }
+  }
+  function composeSMaskBackdrop(bytes, r0, g0, b0) {
+    var length = bytes.length;
+    for (var i = 3; i < length; i += 4) {
+      var alpha = bytes[i];
+      if (alpha === 0) {
+        bytes[i - 3] = r0;
+        bytes[i - 2] = g0;
+        bytes[i - 1] = b0;
+      } else if (alpha < 255) {
+        var alpha_ = 255 - alpha;
+        bytes[i - 3] = bytes[i - 3] * alpha + r0 * alpha_ >> 8;
+        bytes[i - 2] = bytes[i - 2] * alpha + g0 * alpha_ >> 8;
+        bytes[i - 1] = bytes[i - 1] * alpha + b0 * alpha_ >> 8;
+      }
+    }
+  }
+  function composeSMaskAlpha(maskData, layerData, transferMap) {
+    var length = maskData.length;
+    var scale = 1 / 255;
+    for (var i = 3; i < length; i += 4) {
+      var alpha = transferMap ? transferMap[maskData[i]] : maskData[i];
+      layerData[i] = layerData[i] * alpha * scale | 0;
+    }
+  }
+  function composeSMaskLuminosity(maskData, layerData, transferMap) {
+    var length = maskData.length;
+    for (var i = 3; i < length; i += 4) {
+      var y = maskData[i - 3] * 77 + maskData[i - 2] * 152 + maskData[i - 1] * 28;
+      layerData[i] = transferMap ? layerData[i] * transferMap[y >> 8] >> 8 : layerData[i] * y >> 16;
+    }
+  }
+  function genericComposeSMask(maskCtx, layerCtx, width, height, subtype, backdrop, transferMap) {
+    var hasBackdrop = !!backdrop;
+    var r0 = hasBackdrop ? backdrop[0] : 0;
+    var g0 = hasBackdrop ? backdrop[1] : 0;
+    var b0 = hasBackdrop ? backdrop[2] : 0;
+    var composeFn;
+    if (subtype === 'Luminosity') {
+      composeFn = composeSMaskLuminosity;
+    } else {
+      composeFn = composeSMaskAlpha;
+    }
+    var PIXELS_TO_PROCESS = 1048576;
+    var chunkSize = Math.min(height, Math.ceil(PIXELS_TO_PROCESS / width));
+    for (var row = 0; row < height; row += chunkSize) {
+      var chunkHeight = Math.min(chunkSize, height - row);
+      var maskData = maskCtx.getImageData(0, row, width, chunkHeight);
+      var layerData = layerCtx.getImageData(0, row, width, chunkHeight);
+      if (hasBackdrop) {
+        composeSMaskBackdrop(maskData.data, r0, g0, b0);
+      }
+      composeFn(maskData.data, layerData.data, transferMap);
+      maskCtx.putImageData(layerData, 0, row);
+    }
+  }
+  function composeSMask(ctx, smask, layerCtx, webGLContext) {
+    var mask = smask.canvas;
+    var maskCtx = smask.context;
+    ctx.setTransform(smask.scaleX, 0, 0, smask.scaleY, smask.offsetX, smask.offsetY);
+    var backdrop = smask.backdrop || null;
+    if (!smask.transferMap && webGLContext.isEnabled) {
+      var composed = webGLContext.composeSMask({
+        layer: layerCtx.canvas,
+        mask: mask,
+        properties: {
+          subtype: smask.subtype,
+          backdrop: backdrop
+        }
+      });
+      ctx.setTransform(1, 0, 0, 1, 0, 0);
+      ctx.drawImage(composed, smask.offsetX, smask.offsetY);
+      return;
+    }
+    genericComposeSMask(maskCtx, layerCtx, mask.width, mask.height, smask.subtype, backdrop, smask.transferMap);
+    ctx.drawImage(mask, 0, 0);
+  }
+  var LINE_CAP_STYLES = ['butt', 'round', 'square'];
+  var LINE_JOIN_STYLES = ['miter', 'round', 'bevel'];
+  var NORMAL_CLIP = {};
+  var EO_CLIP = {};
+  CanvasGraphics.prototype = {
+    beginDrawing: function beginDrawing(_ref) {
+      var transform = _ref.transform,
+          viewport = _ref.viewport,
+          transparency = _ref.transparency,
+          _ref$background = _ref.background,
+          background = _ref$background === undefined ? null : _ref$background;
+
+      var width = this.ctx.canvas.width;
+      var height = this.ctx.canvas.height;
+      this.ctx.save();
+      this.ctx.fillStyle = background || 'rgb(255, 255, 255)';
+      this.ctx.fillRect(0, 0, width, height);
+      this.ctx.restore();
+      if (transparency) {
+        var transparentCanvas = this.cachedCanvases.getCanvas('transparent', width, height, true);
+        this.compositeCtx = this.ctx;
+        this.transparentCanvas = transparentCanvas.canvas;
+        this.ctx = transparentCanvas.context;
+        this.ctx.save();
+        this.ctx.transform.apply(this.ctx, this.compositeCtx.mozCurrentTransform);
+      }
+      this.ctx.save();
+      resetCtxToDefault(this.ctx);
+      if (transform) {
+        this.ctx.transform.apply(this.ctx, transform);
+      }
+      this.ctx.transform.apply(this.ctx, viewport.transform);
+      this.baseTransform = this.ctx.mozCurrentTransform.slice();
+      if (this.imageLayer) {
+        this.imageLayer.beginLayout();
+      }
+    },
+
+    executeOperatorList: function CanvasGraphics_executeOperatorList(operatorList, executionStartIdx, continueCallback, stepper) {
+      var argsArray = operatorList.argsArray;
+      var fnArray = operatorList.fnArray;
+      var i = executionStartIdx || 0;
+      var argsArrayLen = argsArray.length;
+      if (argsArrayLen === i) {
+        return i;
+      }
+      var chunkOperations = argsArrayLen - i > EXECUTION_STEPS && typeof continueCallback === 'function';
+      var endTime = chunkOperations ? Date.now() + EXECUTION_TIME : 0;
+      var steps = 0;
+      var commonObjs = this.commonObjs;
+      var objs = this.objs;
+      var fnId;
+      while (true) {
+        if (stepper !== undefined && i === stepper.nextBreakPoint) {
+          stepper.breakIt(i, continueCallback);
+          return i;
+        }
+        fnId = fnArray[i];
+        if (fnId !== _util.OPS.dependency) {
+          this[fnId].apply(this, argsArray[i]);
+        } else {
+          var deps = argsArray[i];
+          for (var n = 0, nn = deps.length; n < nn; n++) {
+            var depObjId = deps[n];
+            var common = depObjId[0] === 'g' && depObjId[1] === '_';
+            var objsPool = common ? commonObjs : objs;
+            if (!objsPool.isResolved(depObjId)) {
+              objsPool.get(depObjId, continueCallback);
+              return i;
+            }
+          }
+        }
+        i++;
+        if (i === argsArrayLen) {
+          return i;
+        }
+        if (chunkOperations && ++steps > EXECUTION_STEPS) {
+          if (Date.now() > endTime) {
+            continueCallback();
+            return i;
+          }
+          steps = 0;
+        }
+      }
+    },
+    endDrawing: function CanvasGraphics_endDrawing() {
+      if (this.current.activeSMask !== null) {
+        this.endSMaskGroup();
+      }
+      this.ctx.restore();
+      if (this.transparentCanvas) {
+        this.ctx = this.compositeCtx;
+        this.ctx.save();
+        this.ctx.setTransform(1, 0, 0, 1, 0, 0);
+        this.ctx.drawImage(this.transparentCanvas, 0, 0);
+        this.ctx.restore();
+        this.transparentCanvas = null;
+      }
+      this.cachedCanvases.clear();
+      this.webGLContext.clear();
+      if (this.imageLayer) {
+        this.imageLayer.endLayout();
+      }
+    },
+    setLineWidth: function CanvasGraphics_setLineWidth(width) {
+      this.current.lineWidth = width;
+      this.ctx.lineWidth = width;
+    },
+    setLineCap: function CanvasGraphics_setLineCap(style) {
+      this.ctx.lineCap = LINE_CAP_STYLES[style];
+    },
+    setLineJoin: function CanvasGraphics_setLineJoin(style) {
+      this.ctx.lineJoin = LINE_JOIN_STYLES[style];
+    },
+    setMiterLimit: function CanvasGraphics_setMiterLimit(limit) {
+      this.ctx.miterLimit = limit;
+    },
+    setDash: function CanvasGraphics_setDash(dashArray, dashPhase) {
+      var ctx = this.ctx;
+      if (ctx.setLineDash !== undefined) {
+        ctx.setLineDash(dashArray);
+        ctx.lineDashOffset = dashPhase;
+      }
+    },
+    setRenderingIntent: function CanvasGraphics_setRenderingIntent(intent) {},
+    setFlatness: function CanvasGraphics_setFlatness(flatness) {},
+    setGState: function CanvasGraphics_setGState(states) {
+      for (var i = 0, ii = states.length; i < ii; i++) {
+        var state = states[i];
+        var key = state[0];
+        var value = state[1];
+        switch (key) {
+          case 'LW':
+            this.setLineWidth(value);
+            break;
+          case 'LC':
+            this.setLineCap(value);
+            break;
+          case 'LJ':
+            this.setLineJoin(value);
+            break;
+          case 'ML':
+            this.setMiterLimit(value);
+            break;
+          case 'D':
+            this.setDash(value[0], value[1]);
+            break;
+          case 'RI':
+            this.setRenderingIntent(value);
+            break;
+          case 'FL':
+            this.setFlatness(value);
+            break;
+          case 'Font':
+            this.setFont(value[0], value[1]);
+            break;
+          case 'CA':
+            this.current.strokeAlpha = state[1];
+            break;
+          case 'ca':
+            this.current.fillAlpha = state[1];
+            this.ctx.globalAlpha = state[1];
+            break;
+          case 'BM':
+            this.ctx.globalCompositeOperation = value;
+            break;
+          case 'SMask':
+            if (this.current.activeSMask) {
+              if (this.stateStack.length > 0 && this.stateStack[this.stateStack.length - 1].activeSMask === this.current.activeSMask) {
+                this.suspendSMaskGroup();
+              } else {
+                this.endSMaskGroup();
+              }
+            }
+            this.current.activeSMask = value ? this.tempSMask : null;
+            if (this.current.activeSMask) {
+              this.beginSMaskGroup();
+            }
+            this.tempSMask = null;
+            break;
+        }
+      }
+    },
+    beginSMaskGroup: function CanvasGraphics_beginSMaskGroup() {
+      var activeSMask = this.current.activeSMask;
+      var drawnWidth = activeSMask.canvas.width;
+      var drawnHeight = activeSMask.canvas.height;
+      var cacheId = 'smaskGroupAt' + this.groupLevel;
+      var scratchCanvas = this.cachedCanvases.getCanvas(cacheId, drawnWidth, drawnHeight, true);
+      var currentCtx = this.ctx;
+      var currentTransform = currentCtx.mozCurrentTransform;
+      this.ctx.save();
+      var groupCtx = scratchCanvas.context;
+      groupCtx.scale(1 / activeSMask.scaleX, 1 / activeSMask.scaleY);
+      groupCtx.translate(-activeSMask.offsetX, -activeSMask.offsetY);
+      groupCtx.transform.apply(groupCtx, currentTransform);
+      activeSMask.startTransformInverse = groupCtx.mozCurrentTransformInverse;
+      copyCtxState(currentCtx, groupCtx);
+      this.ctx = groupCtx;
+      this.setGState([['BM', 'source-over'], ['ca', 1], ['CA', 1]]);
+      this.groupStack.push(currentCtx);
+      this.groupLevel++;
+    },
+    suspendSMaskGroup: function CanvasGraphics_endSMaskGroup() {
+      var groupCtx = this.ctx;
+      this.groupLevel--;
+      this.ctx = this.groupStack.pop();
+      composeSMask(this.ctx, this.current.activeSMask, groupCtx, this.webGLContext);
+      this.ctx.restore();
+      this.ctx.save();
+      copyCtxState(groupCtx, this.ctx);
+      this.current.resumeSMaskCtx = groupCtx;
+      var deltaTransform = _util.Util.transform(this.current.activeSMask.startTransformInverse, groupCtx.mozCurrentTransform);
+      this.ctx.transform.apply(this.ctx, deltaTransform);
+      groupCtx.save();
+      groupCtx.setTransform(1, 0, 0, 1, 0, 0);
+      groupCtx.clearRect(0, 0, groupCtx.canvas.width, groupCtx.canvas.height);
+      groupCtx.restore();
+    },
+    resumeSMaskGroup: function CanvasGraphics_endSMaskGroup() {
+      var groupCtx = this.current.resumeSMaskCtx;
+      var currentCtx = this.ctx;
+      this.ctx = groupCtx;
+      this.groupStack.push(currentCtx);
+      this.groupLevel++;
+    },
+    endSMaskGroup: function CanvasGraphics_endSMaskGroup() {
+      var groupCtx = this.ctx;
+      this.groupLevel--;
+      this.ctx = this.groupStack.pop();
+      composeSMask(this.ctx, this.current.activeSMask, groupCtx, this.webGLContext);
+      this.ctx.restore();
+      copyCtxState(groupCtx, this.ctx);
+      var deltaTransform = _util.Util.transform(this.current.activeSMask.startTransformInverse, groupCtx.mozCurrentTransform);
+      this.ctx.transform.apply(this.ctx, deltaTransform);
+    },
+    save: function CanvasGraphics_save() {
+      this.ctx.save();
+      var old = this.current;
+      this.stateStack.push(old);
+      this.current = old.clone();
+      this.current.resumeSMaskCtx = null;
+    },
+    restore: function CanvasGraphics_restore() {
+      if (this.current.resumeSMaskCtx) {
+        this.resumeSMaskGroup();
+      }
+      if (this.current.activeSMask !== null && (this.stateStack.length === 0 || this.stateStack[this.stateStack.length - 1].activeSMask !== this.current.activeSMask)) {
+        this.endSMaskGroup();
+      }
+      if (this.stateStack.length !== 0) {
+        this.current = this.stateStack.pop();
+        this.ctx.restore();
+        this.pendingClip = null;
+        this._cachedGetSinglePixelWidth = null;
+      }
+    },
+    transform: function CanvasGraphics_transform(a, b, c, d, e, f) {
+      this.ctx.transform(a, b, c, d, e, f);
+      this._cachedGetSinglePixelWidth = null;
+    },
+    constructPath: function CanvasGraphics_constructPath(ops, args) {
+      var ctx = this.ctx;
+      var current = this.current;
+      var x = current.x,
+          y = current.y;
+      for (var i = 0, j = 0, ii = ops.length; i < ii; i++) {
+        switch (ops[i] | 0) {
+          case _util.OPS.rectangle:
+            x = args[j++];
+            y = args[j++];
+            var width = args[j++];
+            var height = args[j++];
+            if (width === 0) {
+              width = this.getSinglePixelWidth();
+            }
+            if (height === 0) {
+              height = this.getSinglePixelWidth();
+            }
+            var xw = x + width;
+            var yh = y + height;
+            this.ctx.moveTo(x, y);
+            this.ctx.lineTo(xw, y);
+            this.ctx.lineTo(xw, yh);
+            this.ctx.lineTo(x, yh);
+            this.ctx.lineTo(x, y);
+            this.ctx.closePath();
+            break;
+          case _util.OPS.moveTo:
+            x = args[j++];
+            y = args[j++];
+            ctx.moveTo(x, y);
+            break;
+          case _util.OPS.lineTo:
+            x = args[j++];
+            y = args[j++];
+            ctx.lineTo(x, y);
+            break;
+          case _util.OPS.curveTo:
+            x = args[j + 4];
+            y = args[j + 5];
+            ctx.bezierCurveTo(args[j], args[j + 1], args[j + 2], args[j + 3], x, y);
+            j += 6;
+            break;
+          case _util.OPS.curveTo2:
+            ctx.bezierCurveTo(x, y, args[j], args[j + 1], args[j + 2], args[j + 3]);
+            x = args[j + 2];
+            y = args[j + 3];
+            j += 4;
+            break;
+          case _util.OPS.curveTo3:
+            x = args[j + 2];
+            y = args[j + 3];
+            ctx.bezierCurveTo(args[j], args[j + 1], x, y, x, y);
+            j += 4;
+            break;
+          case _util.OPS.closePath:
+            ctx.closePath();
+            break;
+        }
+      }
+      current.setCurrentPoint(x, y);
+    },
+    closePath: function CanvasGraphics_closePath() {
+      this.ctx.closePath();
+    },
+    stroke: function CanvasGraphics_stroke(consumePath) {
+      consumePath = typeof consumePath !== 'undefined' ? consumePath : true;
+      var ctx = this.ctx;
+      var strokeColor = this.current.strokeColor;
+      ctx.lineWidth = Math.max(this.getSinglePixelWidth() * MIN_WIDTH_FACTOR, this.current.lineWidth);
+      ctx.globalAlpha = this.current.strokeAlpha;
+      if (strokeColor && strokeColor.hasOwnProperty('type') && strokeColor.type === 'Pattern') {
+        ctx.save();
+        ctx.strokeStyle = strokeColor.getPattern(ctx, this);
+        ctx.stroke();
+        ctx.restore();
+      } else {
+        ctx.stroke();
+      }
+      if (consumePath) {
+        this.consumePath();
+      }
+      ctx.globalAlpha = this.current.fillAlpha;
+    },
+    closeStroke: function CanvasGraphics_closeStroke() {
+      this.closePath();
+      this.stroke();
+    },
+    fill: function CanvasGraphics_fill(consumePath) {
+      consumePath = typeof consumePath !== 'undefined' ? consumePath : true;
+      var ctx = this.ctx;
+      var fillColor = this.current.fillColor;
+      var isPatternFill = this.current.patternFill;
+      var needRestore = false;
+      if (isPatternFill) {
+        ctx.save();
+        if (this.baseTransform) {
+          ctx.setTransform.apply(ctx, this.baseTransform);
+        }
+        ctx.fillStyle = fillColor.getPattern(ctx, this);
+        needRestore = true;
+      }
+      if (this.pendingEOFill) {
+        ctx.fill('evenodd');
+        this.pendingEOFill = false;
+      } else {
+        ctx.fill();
+      }
+      if (needRestore) {
+        ctx.restore();
+      }
+      if (consumePath) {
+        this.consumePath();
+      }
+    },
+    eoFill: function CanvasGraphics_eoFill() {
+      this.pendingEOFill = true;
+      this.fill();
+    },
+    fillStroke: function CanvasGraphics_fillStroke() {
+      this.fill(false);
+      this.stroke(false);
+      this.consumePath();
+    },
+    eoFillStroke: function CanvasGraphics_eoFillStroke() {
+      this.pendingEOFill = true;
+      this.fillStroke();
+    },
+    closeFillStroke: function CanvasGraphics_closeFillStroke() {
+      this.closePath();
+      this.fillStroke();
+    },
+    closeEOFillStroke: function CanvasGraphics_closeEOFillStroke() {
+      this.pendingEOFill = true;
+      this.closePath();
+      this.fillStroke();
+    },
+    endPath: function CanvasGraphics_endPath() {
+      this.consumePath();
+    },
+    clip: function CanvasGraphics_clip() {
+      this.pendingClip = NORMAL_CLIP;
+    },
+    eoClip: function CanvasGraphics_eoClip() {
+      this.pendingClip = EO_CLIP;
+    },
+    beginText: function CanvasGraphics_beginText() {
+      this.current.textMatrix = _util.IDENTITY_MATRIX;
+      this.current.textMatrixScale = 1;
+      this.current.x = this.current.lineX = 0;
+      this.current.y = this.current.lineY = 0;
+    },
+    endText: function CanvasGraphics_endText() {
+      var paths = this.pendingTextPaths;
+      var ctx = this.ctx;
+      if (paths === undefined) {
+        ctx.beginPath();
+        return;
+      }
+      ctx.save();
+      ctx.beginPath();
+      for (var i = 0; i < paths.length; i++) {
+        var path = paths[i];
+        ctx.setTransform.apply(ctx, path.transform);
+        ctx.translate(path.x, path.y);
+        path.addToPath(ctx, path.fontSize);
+      }
+      ctx.restore();
+      ctx.clip();
+      ctx.beginPath();
+      delete this.pendingTextPaths;
+    },
+    setCharSpacing: function CanvasGraphics_setCharSpacing(spacing) {
+      this.current.charSpacing = spacing;
+    },
+    setWordSpacing: function CanvasGraphics_setWordSpacing(spacing) {
+      this.current.wordSpacing = spacing;
+    },
+    setHScale: function CanvasGraphics_setHScale(scale) {
+      this.current.textHScale = scale / 100;
+    },
+    setLeading: function CanvasGraphics_setLeading(leading) {
+      this.current.leading = -leading;
+    },
+    setFont: function CanvasGraphics_setFont(fontRefName, size) {
+      var fontObj = this.commonObjs.get(fontRefName);
+      var current = this.current;
+      if (!fontObj) {
+        throw new Error('Can\'t find font for ' + fontRefName);
+      }
+      current.fontMatrix = fontObj.fontMatrix ? fontObj.fontMatrix : _util.FONT_IDENTITY_MATRIX;
+      if (current.fontMatrix[0] === 0 || current.fontMatrix[3] === 0) {
+        (0, _util.warn)('Invalid font matrix for font ' + fontRefName);
+      }
+      if (size < 0) {
+        size = -size;
+        current.fontDirection = -1;
+      } else {
+        current.fontDirection = 1;
+      }
+      this.current.font = fontObj;
+      this.current.fontSize = size;
+      if (fontObj.isType3Font) {
+        return;
+      }
+      var name = fontObj.loadedName || 'sans-serif';
+      var bold = fontObj.black ? '900' : fontObj.bold ? 'bold' : 'normal';
+      var italic = fontObj.italic ? 'italic' : 'normal';
+      var typeface = '"' + name + '", ' + fontObj.fallbackName;
+      var browserFontSize = size < MIN_FONT_SIZE ? MIN_FONT_SIZE : size > MAX_FONT_SIZE ? MAX_FONT_SIZE : size;
+      this.current.fontSizeScale = size / browserFontSize;
+      var rule = italic + ' ' + bold + ' ' + browserFontSize + 'px ' + typeface;
+      this.ctx.font = rule;
+    },
+    setTextRenderingMode: function CanvasGraphics_setTextRenderingMode(mode) {
+      this.current.textRenderingMode = mode;
+    },
+    setTextRise: function CanvasGraphics_setTextRise(rise) {
+      this.current.textRise = rise;
+    },
+    moveText: function CanvasGraphics_moveText(x, y) {
+      this.current.x = this.current.lineX += x;
+      this.current.y = this.current.lineY += y;
+    },
+    setLeadingMoveText: function CanvasGraphics_setLeadingMoveText(x, y) {
+      this.setLeading(-y);
+      this.moveText(x, y);
+    },
+    setTextMatrix: function CanvasGraphics_setTextMatrix(a, b, c, d, e, f) {
+      this.current.textMatrix = [a, b, c, d, e, f];
+      this.current.textMatrixScale = Math.sqrt(a * a + b * b);
+      this.current.x = this.current.lineX = 0;
+      this.current.y = this.current.lineY = 0;
+    },
+    nextLine: function CanvasGraphics_nextLine() {
+      this.moveText(0, this.current.leading);
+    },
+    paintChar: function paintChar(character, x, y, patternTransform) {
+      var ctx = this.ctx;
+      var current = this.current;
+      var font = current.font;
+      var textRenderingMode = current.textRenderingMode;
+      var fontSize = current.fontSize / current.fontSizeScale;
+      var fillStrokeMode = textRenderingMode & _util.TextRenderingMode.FILL_STROKE_MASK;
+      var isAddToPathSet = !!(textRenderingMode & _util.TextRenderingMode.ADD_TO_PATH_FLAG);
+      var patternFill = current.patternFill && font.data;
+      var addToPath;
+      if (font.disableFontFace || isAddToPathSet || patternFill) {
+        addToPath = font.getPathGenerator(this.commonObjs, character);
+      }
+      if (font.disableFontFace || patternFill) {
+        ctx.save();
+        ctx.translate(x, y);
+        ctx.beginPath();
+        addToPath(ctx, fontSize);
+        if (patternTransform) {
+          ctx.setTransform.apply(ctx, patternTransform);
+        }
+        if (fillStrokeMode === _util.TextRenderingMode.FILL || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) {
+          ctx.fill();
+        }
+        if (fillStrokeMode === _util.TextRenderingMode.STROKE || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) {
+          ctx.stroke();
+        }
+        ctx.restore();
+      } else {
+        if (fillStrokeMode === _util.TextRenderingMode.FILL || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) {
+          ctx.fillText(character, x, y);
+        }
+        if (fillStrokeMode === _util.TextRenderingMode.STROKE || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) {
+          ctx.strokeText(character, x, y);
+        }
+      }
+      if (isAddToPathSet) {
+        var paths = this.pendingTextPaths || (this.pendingTextPaths = []);
+        paths.push({
+          transform: ctx.mozCurrentTransform,
+          x: x,
+          y: y,
+          fontSize: fontSize,
+          addToPath: addToPath
+        });
+      }
+    },
+
+    get isFontSubpixelAAEnabled() {
+      var ctx = this.canvasFactory.create(10, 10).context;
+      ctx.scale(1.5, 1);
+      ctx.fillText('I', 0, 10);
+      var data = ctx.getImageData(0, 0, 10, 10).data;
+      var enabled = false;
+      for (var i = 3; i < data.length; i += 4) {
+        if (data[i] > 0 && data[i] < 255) {
+          enabled = true;
+          break;
+        }
+      }
+      return (0, _util.shadow)(this, 'isFontSubpixelAAEnabled', enabled);
+    },
+    showText: function CanvasGraphics_showText(glyphs) {
+      var current = this.current;
+      var font = current.font;
+      if (font.isType3Font) {
+        return this.showType3Text(glyphs);
+      }
+      var fontSize = current.fontSize;
+      if (fontSize === 0) {
+        return;
+      }
+      var ctx = this.ctx;
+      var fontSizeScale = current.fontSizeScale;
+      var charSpacing = current.charSpacing;
+      var wordSpacing = current.wordSpacing;
+      var fontDirection = current.fontDirection;
+      var textHScale = current.textHScale * fontDirection;
+      var glyphsLength = glyphs.length;
+      var vertical = font.vertical;
+      var spacingDir = vertical ? 1 : -1;
+      var defaultVMetrics = font.defaultVMetrics;
+      var widthAdvanceScale = fontSize * current.fontMatrix[0];
+      var simpleFillText = current.textRenderingMode === _util.TextRenderingMode.FILL && !font.disableFontFace && !current.patternFill;
+      ctx.save();
+      var patternTransform = void 0;
+      if (current.patternFill) {
+        ctx.save();
+        var pattern = current.fillColor.getPattern(ctx, this);
+        patternTransform = ctx.mozCurrentTransform;
+        ctx.restore();
+        ctx.fillStyle = pattern;
+      }
+      ctx.transform.apply(ctx, current.textMatrix);
+      ctx.translate(current.x, current.y + current.textRise);
+      if (fontDirection > 0) {
+        ctx.scale(textHScale, -1);
+      } else {
+        ctx.scale(textHScale, 1);
+      }
+      var lineWidth = current.lineWidth;
+      var scale = current.textMatrixScale;
+      if (scale === 0 || lineWidth === 0) {
+        var fillStrokeMode = current.textRenderingMode & _util.TextRenderingMode.FILL_STROKE_MASK;
+        if (fillStrokeMode === _util.TextRenderingMode.STROKE || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) {
+          this._cachedGetSinglePixelWidth = null;
+          lineWidth = this.getSinglePixelWidth() * MIN_WIDTH_FACTOR;
+        }
+      } else {
+        lineWidth /= scale;
+      }
+      if (fontSizeScale !== 1.0) {
+        ctx.scale(fontSizeScale, fontSizeScale);
+        lineWidth /= fontSizeScale;
+      }
+      ctx.lineWidth = lineWidth;
+      var x = 0,
+          i;
+      for (i = 0; i < glyphsLength; ++i) {
+        var glyph = glyphs[i];
+        if ((0, _util.isNum)(glyph)) {
+          x += spacingDir * glyph * fontSize / 1000;
+          continue;
+        }
+        var restoreNeeded = false;
+        var spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing;
+        var character = glyph.fontChar;
+        var accent = glyph.accent;
+        var scaledX, scaledY, scaledAccentX, scaledAccentY;
+        var width = glyph.width;
+        if (vertical) {
+          var vmetric, vx, vy;
+          vmetric = glyph.vmetric || defaultVMetrics;
+          vx = glyph.vmetric ? vmetric[1] : width * 0.5;
+          vx = -vx * widthAdvanceScale;
+          vy = vmetric[2] * widthAdvanceScale;
+          width = vmetric ? -vmetric[0] : width;
+          scaledX = vx / fontSizeScale;
+          scaledY = (x + vy) / fontSizeScale;
+        } else {
+          scaledX = x / fontSizeScale;
+          scaledY = 0;
+        }
+        if (font.remeasure && width > 0) {
+          var measuredWidth = ctx.measureText(character).width * 1000 / fontSize * fontSizeScale;
+          if (width < measuredWidth && this.isFontSubpixelAAEnabled) {
+            var characterScaleX = width / measuredWidth;
+            restoreNeeded = true;
+            ctx.save();
+            ctx.scale(characterScaleX, 1);
+            scaledX /= characterScaleX;
+          } else if (width !== measuredWidth) {
+            scaledX += (width - measuredWidth) / 2000 * fontSize / fontSizeScale;
+          }
+        }
+        if (glyph.isInFont || font.missingFile) {
+          if (simpleFillText && !accent) {
+            ctx.fillText(character, scaledX, scaledY);
+          } else {
+            this.paintChar(character, scaledX, scaledY, patternTransform);
+            if (accent) {
+              scaledAccentX = scaledX + accent.offset.x / fontSizeScale;
+              scaledAccentY = scaledY - accent.offset.y / fontSizeScale;
+              this.paintChar(accent.fontChar, scaledAccentX, scaledAccentY, patternTransform);
+            }
+          }
+        }
+        var charWidth = width * widthAdvanceScale + spacing * fontDirection;
+        x += charWidth;
+        if (restoreNeeded) {
+          ctx.restore();
+        }
+      }
+      if (vertical) {
+        current.y -= x * textHScale;
+      } else {
+        current.x += x * textHScale;
+      }
+      ctx.restore();
+    },
+    showType3Text: function CanvasGraphics_showType3Text(glyphs) {
+      var ctx = this.ctx;
+      var current = this.current;
+      var font = current.font;
+      var fontSize = current.fontSize;
+      var fontDirection = current.fontDirection;
+      var spacingDir = font.vertical ? 1 : -1;
+      var charSpacing = current.charSpacing;
+      var wordSpacing = current.wordSpacing;
+      var textHScale = current.textHScale * fontDirection;
+      var fontMatrix = current.fontMatrix || _util.FONT_IDENTITY_MATRIX;
+      var glyphsLength = glyphs.length;
+      var isTextInvisible = current.textRenderingMode === _util.TextRenderingMode.INVISIBLE;
+      var i, glyph, width, spacingLength;
+      if (isTextInvisible || fontSize === 0) {
+        return;
+      }
+      this._cachedGetSinglePixelWidth = null;
+      ctx.save();
+      ctx.transform.apply(ctx, current.textMatrix);
+      ctx.translate(current.x, current.y);
+      ctx.scale(textHScale, fontDirection);
+      for (i = 0; i < glyphsLength; ++i) {
+        glyph = glyphs[i];
+        if ((0, _util.isNum)(glyph)) {
+          spacingLength = spacingDir * glyph * fontSize / 1000;
+          this.ctx.translate(spacingLength, 0);
+          current.x += spacingLength * textHScale;
+          continue;
+        }
+        var spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing;
+        var operatorList = font.charProcOperatorList[glyph.operatorListId];
+        if (!operatorList) {
+          (0, _util.warn)('Type3 character "' + glyph.operatorListId + '" is not available.');
+          continue;
+        }
+        this.processingType3 = glyph;
+        this.save();
+        ctx.scale(fontSize, fontSize);
+        ctx.transform.apply(ctx, fontMatrix);
+        this.executeOperatorList(operatorList);
+        this.restore();
+        var transformed = _util.Util.applyTransform([glyph.width, 0], fontMatrix);
+        width = transformed[0] * fontSize + spacing;
+        ctx.translate(width, 0);
+        current.x += width * textHScale;
+      }
+      ctx.restore();
+      this.processingType3 = null;
+    },
+    setCharWidth: function CanvasGraphics_setCharWidth(xWidth, yWidth) {},
+    setCharWidthAndBounds: function CanvasGraphics_setCharWidthAndBounds(xWidth, yWidth, llx, lly, urx, ury) {
+      this.ctx.rect(llx, lly, urx - llx, ury - lly);
+      this.clip();
+      this.endPath();
+    },
+    getColorN_Pattern: function CanvasGraphics_getColorN_Pattern(IR) {
+      var _this = this;
+
+      var pattern;
+      if (IR[0] === 'TilingPattern') {
+        var color = IR[1];
+        var baseTransform = this.baseTransform || this.ctx.mozCurrentTransform.slice();
+        var canvasGraphicsFactory = {
+          createCanvasGraphics: function createCanvasGraphics(ctx) {
+            return new CanvasGraphics(ctx, _this.commonObjs, _this.objs, _this.canvasFactory, _this.webGLContext);
+          }
+        };
+        pattern = new _pattern_helper.TilingPattern(IR, color, this.ctx, canvasGraphicsFactory, baseTransform);
+      } else {
+        pattern = (0, _pattern_helper.getShadingPatternFromIR)(IR);
+      }
+      return pattern;
+    },
+    setStrokeColorN: function CanvasGraphics_setStrokeColorN() {
+      this.current.strokeColor = this.getColorN_Pattern(arguments);
+    },
+    setFillColorN: function CanvasGraphics_setFillColorN() {
+      this.current.fillColor = this.getColorN_Pattern(arguments);
+      this.current.patternFill = true;
+    },
+    setStrokeRGBColor: function CanvasGraphics_setStrokeRGBColor(r, g, b) {
+      var color = _util.Util.makeCssRgb(r, g, b);
+      this.ctx.strokeStyle = color;
+      this.current.strokeColor = color;
+    },
+    setFillRGBColor: function CanvasGraphics_setFillRGBColor(r, g, b) {
+      var color = _util.Util.makeCssRgb(r, g, b);
+      this.ctx.fillStyle = color;
+      this.current.fillColor = color;
+      this.current.patternFill = false;
+    },
+    shadingFill: function CanvasGraphics_shadingFill(patternIR) {
+      var ctx = this.ctx;
+      this.save();
+      var pattern = (0, _pattern_helper.getShadingPatternFromIR)(patternIR);
+      ctx.fillStyle = pattern.getPattern(ctx, this, true);
+      var inv = ctx.mozCurrentTransformInverse;
+      if (inv) {
+        var canvas = ctx.canvas;
+        var width = canvas.width;
+        var height = canvas.height;
+        var bl = _util.Util.applyTransform([0, 0], inv);
+        var br = _util.Util.applyTransform([0, height], inv);
+        var ul = _util.Util.applyTransform([width, 0], inv);
+        var ur = _util.Util.applyTransform([width, height], inv);
+        var x0 = Math.min(bl[0], br[0], ul[0], ur[0]);
+        var y0 = Math.min(bl[1], br[1], ul[1], ur[1]);
+        var x1 = Math.max(bl[0], br[0], ul[0], ur[0]);
+        var y1 = Math.max(bl[1], br[1], ul[1], ur[1]);
+        this.ctx.fillRect(x0, y0, x1 - x0, y1 - y0);
+      } else {
+        this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10);
+      }
+      this.restore();
+    },
+    beginInlineImage: function CanvasGraphics_beginInlineImage() {
+      (0, _util.unreachable)('Should not call beginInlineImage');
+    },
+    beginImageData: function CanvasGraphics_beginImageData() {
+      (0, _util.unreachable)('Should not call beginImageData');
+    },
+    paintFormXObjectBegin: function CanvasGraphics_paintFormXObjectBegin(matrix, bbox) {
+      this.save();
+      this.baseTransformStack.push(this.baseTransform);
+      if (Array.isArray(matrix) && matrix.length === 6) {
+        this.transform.apply(this, matrix);
+      }
+      this.baseTransform = this.ctx.mozCurrentTransform;
+      if (Array.isArray(bbox) && bbox.length === 4) {
+        var width = bbox[2] - bbox[0];
+        var height = bbox[3] - bbox[1];
+        this.ctx.rect(bbox[0], bbox[1], width, height);
+        this.clip();
+        this.endPath();
+      }
+    },
+    paintFormXObjectEnd: function CanvasGraphics_paintFormXObjectEnd() {
+      this.restore();
+      this.baseTransform = this.baseTransformStack.pop();
+    },
+    beginGroup: function CanvasGraphics_beginGroup(group) {
+      this.save();
+      var currentCtx = this.ctx;
+      if (!group.isolated) {
+        (0, _util.info)('TODO: Support non-isolated groups.');
+      }
+      if (group.knockout) {
+        (0, _util.warn)('Knockout groups not supported.');
+      }
+      var currentTransform = currentCtx.mozCurrentTransform;
+      if (group.matrix) {
+        currentCtx.transform.apply(currentCtx, group.matrix);
+      }
+      if (!group.bbox) {
+        throw new Error('Bounding box is required.');
+      }
+      var bounds = _util.Util.getAxialAlignedBoundingBox(group.bbox, currentCtx.mozCurrentTransform);
+      var canvasBounds = [0, 0, currentCtx.canvas.width, currentCtx.canvas.height];
+      bounds = _util.Util.intersect(bounds, canvasBounds) || [0, 0, 0, 0];
+      var offsetX = Math.floor(bounds[0]);
+      var offsetY = Math.floor(bounds[1]);
+      var drawnWidth = Math.max(Math.ceil(bounds[2]) - offsetX, 1);
+      var drawnHeight = Math.max(Math.ceil(bounds[3]) - offsetY, 1);
+      var scaleX = 1,
+          scaleY = 1;
+      if (drawnWidth > MAX_GROUP_SIZE) {
+        scaleX = drawnWidth / MAX_GROUP_SIZE;
+        drawnWidth = MAX_GROUP_SIZE;
+      }
+      if (drawnHeight > MAX_GROUP_SIZE) {
+        scaleY = drawnHeight / MAX_GROUP_SIZE;
+        drawnHeight = MAX_GROUP_SIZE;
+      }
+      var cacheId = 'groupAt' + this.groupLevel;
+      if (group.smask) {
+        cacheId += '_smask_' + this.smaskCounter++ % 2;
+      }
+      var scratchCanvas = this.cachedCanvases.getCanvas(cacheId, drawnWidth, drawnHeight, true);
+      var groupCtx = scratchCanvas.context;
+      groupCtx.scale(1 / scaleX, 1 / scaleY);
+      groupCtx.translate(-offsetX, -offsetY);
+      groupCtx.transform.apply(groupCtx, currentTransform);
+      if (group.smask) {
+        this.smaskStack.push({
+          canvas: scratchCanvas.canvas,
+          context: groupCtx,
+          offsetX: offsetX,
+          offsetY: offsetY,
+          scaleX: scaleX,
+          scaleY: scaleY,
+          subtype: group.smask.subtype,
+          backdrop: group.smask.backdrop,
+          transferMap: group.smask.transferMap || null,
+          startTransformInverse: null
+        });
+      } else {
+        currentCtx.setTransform(1, 0, 0, 1, 0, 0);
+        currentCtx.translate(offsetX, offsetY);
+        currentCtx.scale(scaleX, scaleY);
+      }
+      copyCtxState(currentCtx, groupCtx);
+      this.ctx = groupCtx;
+      this.setGState([['BM', 'source-over'], ['ca', 1], ['CA', 1]]);
+      this.groupStack.push(currentCtx);
+      this.groupLevel++;
+      this.current.activeSMask = null;
+    },
+    endGroup: function CanvasGraphics_endGroup(group) {
+      this.groupLevel--;
+      var groupCtx = this.ctx;
+      this.ctx = this.groupStack.pop();
+      if (this.ctx.imageSmoothingEnabled !== undefined) {
+        this.ctx.imageSmoothingEnabled = false;
+      } else {
+        this.ctx.mozImageSmoothingEnabled = false;
+      }
+      if (group.smask) {
+        this.tempSMask = this.smaskStack.pop();
+      } else {
+        this.ctx.drawImage(groupCtx.canvas, 0, 0);
+      }
+      this.restore();
+    },
+    beginAnnotations: function CanvasGraphics_beginAnnotations() {
+      this.save();
+      if (this.baseTransform) {
+        this.ctx.setTransform.apply(this.ctx, this.baseTransform);
+      }
+    },
+    endAnnotations: function CanvasGraphics_endAnnotations() {
+      this.restore();
+    },
+    beginAnnotation: function CanvasGraphics_beginAnnotation(rect, transform, matrix) {
+      this.save();
+      resetCtxToDefault(this.ctx);
+      this.current = new CanvasExtraState();
+      if (Array.isArray(rect) && rect.length === 4) {
+        var width = rect[2] - rect[0];
+        var height = rect[3] - rect[1];
+        this.ctx.rect(rect[0], rect[1], width, height);
+        this.clip();
+        this.endPath();
+      }
+      this.transform.apply(this, transform);
+      this.transform.apply(this, matrix);
+    },
+    endAnnotation: function CanvasGraphics_endAnnotation() {
+      this.restore();
+    },
+    paintJpegXObject: function CanvasGraphics_paintJpegXObject(objId, w, h) {
+      var domImage = this.objs.get(objId);
+      if (!domImage) {
+        (0, _util.warn)('Dependent image isn\'t ready yet');
+        return;
+      }
+      this.save();
+      var ctx = this.ctx;
+      ctx.scale(1 / w, -1 / h);
+      ctx.drawImage(domImage, 0, 0, domImage.width, domImage.height, 0, -h, w, h);
+      if (this.imageLayer) {
+        var currentTransform = ctx.mozCurrentTransformInverse;
+        var position = this.getCanvasPosition(0, 0);
+        this.imageLayer.appendImage({
+          objId: objId,
+          left: position[0],
+          top: position[1],
+          width: w / currentTransform[0],
+          height: h / currentTransform[3]
+        });
+      }
+      this.restore();
+    },
+    paintImageMaskXObject: function CanvasGraphics_paintImageMaskXObject(img) {
+      var ctx = this.ctx;
+      var width = img.width,
+          height = img.height;
+      var fillColor = this.current.fillColor;
+      var isPatternFill = this.current.patternFill;
+      var glyph = this.processingType3;
+      if (COMPILE_TYPE3_GLYPHS && glyph && glyph.compiled === undefined) {
+        if (width <= MAX_SIZE_TO_COMPILE && height <= MAX_SIZE_TO_COMPILE) {
+          glyph.compiled = compileType3Glyph({
+            data: img.data,
+            width: width,
+            height: height
+          });
+        } else {
+          glyph.compiled = null;
+        }
+      }
+      if (glyph && glyph.compiled) {
+        glyph.compiled(ctx);
+        return;
+      }
+      var maskCanvas = this.cachedCanvases.getCanvas('maskCanvas', width, height);
+      var maskCtx = maskCanvas.context;
+      maskCtx.save();
+      putBinaryImageMask(maskCtx, img);
+      maskCtx.globalCompositeOperation = 'source-in';
+      maskCtx.fillStyle = isPatternFill ? fillColor.getPattern(maskCtx, this) : fillColor;
+      maskCtx.fillRect(0, 0, width, height);
+      maskCtx.restore();
+      this.paintInlineImageXObject(maskCanvas.canvas);
+    },
+    paintImageMaskXObjectRepeat: function CanvasGraphics_paintImageMaskXObjectRepeat(imgData, scaleX, scaleY, positions) {
+      var width = imgData.width;
+      var height = imgData.height;
+      var fillColor = this.current.fillColor;
+      var isPatternFill = this.current.patternFill;
+      var maskCanvas = this.cachedCanvases.getCanvas('maskCanvas', width, height);
+      var maskCtx = maskCanvas.context;
+      maskCtx.save();
+      putBinaryImageMask(maskCtx, imgData);
+      maskCtx.globalCompositeOperation = 'source-in';
+      maskCtx.fillStyle = isPatternFill ? fillColor.getPattern(maskCtx, this) : fillColor;
+      maskCtx.fillRect(0, 0, width, height);
+      maskCtx.restore();
+      var ctx = this.ctx;
+      for (var i = 0, ii = positions.length; i < ii; i += 2) {
+        ctx.save();
+        ctx.transform(scaleX, 0, 0, scaleY, positions[i], positions[i + 1]);
+        ctx.scale(1, -1);
+        ctx.drawImage(maskCanvas.canvas, 0, 0, width, height, 0, -1, 1, 1);
+        ctx.restore();
+      }
+    },
+    paintImageMaskXObjectGroup: function CanvasGraphics_paintImageMaskXObjectGroup(images) {
+      var ctx = this.ctx;
+      var fillColor = this.current.fillColor;
+      var isPatternFill = this.current.patternFill;
+      for (var i = 0, ii = images.length; i < ii; i++) {
+        var image = images[i];
+        var width = image.width,
+            height = image.height;
+        var maskCanvas = this.cachedCanvases.getCanvas('maskCanvas', width, height);
+        var maskCtx = maskCanvas.context;
+        maskCtx.save();
+        putBinaryImageMask(maskCtx, image);
+        maskCtx.globalCompositeOperation = 'source-in';
+        maskCtx.fillStyle = isPatternFill ? fillColor.getPattern(maskCtx, this) : fillColor;
+        maskCtx.fillRect(0, 0, width, height);
+        maskCtx.restore();
+        ctx.save();
+        ctx.transform.apply(ctx, image.transform);
+        ctx.scale(1, -1);
+        ctx.drawImage(maskCanvas.canvas, 0, 0, width, height, 0, -1, 1, 1);
+        ctx.restore();
+      }
+    },
+    paintImageXObject: function CanvasGraphics_paintImageXObject(objId) {
+      var imgData = this.objs.get(objId);
+      if (!imgData) {
+        (0, _util.warn)('Dependent image isn\'t ready yet');
+        return;
+      }
+      this.paintInlineImageXObject(imgData);
+    },
+    paintImageXObjectRepeat: function CanvasGraphics_paintImageXObjectRepeat(objId, scaleX, scaleY, positions) {
+      var imgData = this.objs.get(objId);
+      if (!imgData) {
+        (0, _util.warn)('Dependent image isn\'t ready yet');
+        return;
+      }
+      var width = imgData.width;
+      var height = imgData.height;
+      var map = [];
+      for (var i = 0, ii = positions.length; i < ii; i += 2) {
+        map.push({
+          transform: [scaleX, 0, 0, scaleY, positions[i], positions[i + 1]],
+          x: 0,
+          y: 0,
+          w: width,
+          h: height
+        });
+      }
+      this.paintInlineImageXObjectGroup(imgData, map);
+    },
+    paintInlineImageXObject: function CanvasGraphics_paintInlineImageXObject(imgData) {
+      var width = imgData.width;
+      var height = imgData.height;
+      var ctx = this.ctx;
+      this.save();
+      ctx.scale(1 / width, -1 / height);
+      var currentTransform = ctx.mozCurrentTransformInverse;
+      var a = currentTransform[0],
+          b = currentTransform[1];
+      var widthScale = Math.max(Math.sqrt(a * a + b * b), 1);
+      var c = currentTransform[2],
+          d = currentTransform[3];
+      var heightScale = Math.max(Math.sqrt(c * c + d * d), 1);
+      var imgToPaint, tmpCanvas;
+      if (typeof HTMLElement === 'function' && imgData instanceof HTMLElement || !imgData.data) {
+        imgToPaint = imgData;
+      } else {
+        tmpCanvas = this.cachedCanvases.getCanvas('inlineImage', width, height);
+        var tmpCtx = tmpCanvas.context;
+        putBinaryImageData(tmpCtx, imgData);
+        imgToPaint = tmpCanvas.canvas;
+      }
+      var paintWidth = width,
+          paintHeight = height;
+      var tmpCanvasId = 'prescale1';
+      while (widthScale > 2 && paintWidth > 1 || heightScale > 2 && paintHeight > 1) {
+        var newWidth = paintWidth,
+            newHeight = paintHeight;
+        if (widthScale > 2 && paintWidth > 1) {
+          newWidth = Math.ceil(paintWidth / 2);
+          widthScale /= paintWidth / newWidth;
+        }
+        if (heightScale > 2 && paintHeight > 1) {
+          newHeight = Math.ceil(paintHeight / 2);
+          heightScale /= paintHeight / newHeight;
+        }
+        tmpCanvas = this.cachedCanvases.getCanvas(tmpCanvasId, newWidth, newHeight);
+        tmpCtx = tmpCanvas.context;
+        tmpCtx.clearRect(0, 0, newWidth, newHeight);
+        tmpCtx.drawImage(imgToPaint, 0, 0, paintWidth, paintHeight, 0, 0, newWidth, newHeight);
+        imgToPaint = tmpCanvas.canvas;
+        paintWidth = newWidth;
+        paintHeight = newHeight;
+        tmpCanvasId = tmpCanvasId === 'prescale1' ? 'prescale2' : 'prescale1';
+      }
+      ctx.drawImage(imgToPaint, 0, 0, paintWidth, paintHeight, 0, -height, width, height);
+      if (this.imageLayer) {
+        var position = this.getCanvasPosition(0, -height);
+        this.imageLayer.appendImage({
+          imgData: imgData,
+          left: position[0],
+          top: position[1],
+          width: width / currentTransform[0],
+          height: height / currentTransform[3]
+        });
+      }
+      this.restore();
+    },
+    paintInlineImageXObjectGroup: function CanvasGraphics_paintInlineImageXObjectGroup(imgData, map) {
+      var ctx = this.ctx;
+      var w = imgData.width;
+      var h = imgData.height;
+      var tmpCanvas = this.cachedCanvases.getCanvas('inlineImage', w, h);
+      var tmpCtx = tmpCanvas.context;
+      putBinaryImageData(tmpCtx, imgData);
+      for (var i = 0, ii = map.length; i < ii; i++) {
+        var entry = map[i];
+        ctx.save();
+        ctx.transform.apply(ctx, entry.transform);
+        ctx.scale(1, -1);
+        ctx.drawImage(tmpCanvas.canvas, entry.x, entry.y, entry.w, entry.h, 0, -1, 1, 1);
+        if (this.imageLayer) {
+          var position = this.getCanvasPosition(entry.x, entry.y);
+          this.imageLayer.appendImage({
+            imgData: imgData,
+            left: position[0],
+            top: position[1],
+            width: w,
+            height: h
+          });
+        }
+        ctx.restore();
+      }
+    },
+    paintSolidColorImageMask: function CanvasGraphics_paintSolidColorImageMask() {
+      this.ctx.fillRect(0, 0, 1, 1);
+    },
+    paintXObject: function CanvasGraphics_paintXObject() {
+      (0, _util.warn)('Unsupported \'paintXObject\' command.');
+    },
+    markPoint: function CanvasGraphics_markPoint(tag) {},
+    markPointProps: function CanvasGraphics_markPointProps(tag, properties) {},
+    beginMarkedContent: function CanvasGraphics_beginMarkedContent(tag) {},
+    beginMarkedContentProps: function CanvasGraphics_beginMarkedContentProps(tag, properties) {},
+    endMarkedContent: function CanvasGraphics_endMarkedContent() {},
+    beginCompat: function CanvasGraphics_beginCompat() {},
+    endCompat: function CanvasGraphics_endCompat() {},
+    consumePath: function CanvasGraphics_consumePath() {
+      var ctx = this.ctx;
+      if (this.pendingClip) {
+        if (this.pendingClip === EO_CLIP) {
+          ctx.clip('evenodd');
+        } else {
+          ctx.clip();
+        }
+        this.pendingClip = null;
+      }
+      ctx.beginPath();
+    },
+    getSinglePixelWidth: function getSinglePixelWidth(scale) {
+      if (this._cachedGetSinglePixelWidth === null) {
+        var inverse = this.ctx.mozCurrentTransformInverse;
+        this._cachedGetSinglePixelWidth = Math.sqrt(Math.max(inverse[0] * inverse[0] + inverse[1] * inverse[1], inverse[2] * inverse[2] + inverse[3] * inverse[3]));
+      }
+      return this._cachedGetSinglePixelWidth;
+    },
+
+    getCanvasPosition: function CanvasGraphics_getCanvasPosition(x, y) {
+      var transform = this.ctx.mozCurrentTransform;
+      return [transform[0] * x + transform[2] * y + transform[4], transform[1] * x + transform[3] * y + transform[5]];
+    }
+  };
+  for (var op in _util.OPS) {
+    CanvasGraphics.prototype[_util.OPS[op]] = CanvasGraphics.prototype[op];
+  }
+  return CanvasGraphics;
+}();
+exports.CanvasGraphics = CanvasGraphics;
+
+/***/ }),
+/* 134 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.TilingPattern = exports.getShadingPatternFromIR = undefined;
+
+var _util = __w_pdfjs_require__(1);
+
+var ShadingIRs = {};
+ShadingIRs.RadialAxial = {
+  fromIR: function RadialAxial_fromIR(raw) {
+    var type = raw[1];
+    var colorStops = raw[2];
+    var p0 = raw[3];
+    var p1 = raw[4];
+    var r0 = raw[5];
+    var r1 = raw[6];
+    return {
+      type: 'Pattern',
+      getPattern: function RadialAxial_getPattern(ctx) {
+        var grad;
+        if (type === 'axial') {
+          grad = ctx.createLinearGradient(p0[0], p0[1], p1[0], p1[1]);
+        } else if (type === 'radial') {
+          grad = ctx.createRadialGradient(p0[0], p0[1], r0, p1[0], p1[1], r1);
+        }
+        for (var i = 0, ii = colorStops.length; i < ii; ++i) {
+          var c = colorStops[i];
+          grad.addColorStop(c[0], c[1]);
+        }
+        return grad;
+      }
+    };
+  }
+};
+var createMeshCanvas = function createMeshCanvasClosure() {
+  function drawTriangle(data, context, p1, p2, p3, c1, c2, c3) {
+    var coords = context.coords,
+        colors = context.colors;
+    var bytes = data.data,
+        rowSize = data.width * 4;
+    var tmp;
+    if (coords[p1 + 1] > coords[p2 + 1]) {
+      tmp = p1;
+      p1 = p2;
+      p2 = tmp;
+      tmp = c1;
+      c1 = c2;
+      c2 = tmp;
+    }
+    if (coords[p2 + 1] > coords[p3 + 1]) {
+      tmp = p2;
+      p2 = p3;
+      p3 = tmp;
+      tmp = c2;
+      c2 = c3;
+      c3 = tmp;
+    }
+    if (coords[p1 + 1] > coords[p2 + 1]) {
+      tmp = p1;
+      p1 = p2;
+      p2 = tmp;
+      tmp = c1;
+      c1 = c2;
+      c2 = tmp;
+    }
+    var x1 = (coords[p1] + context.offsetX) * context.scaleX;
+    var y1 = (coords[p1 + 1] + context.offsetY) * context.scaleY;
+    var x2 = (coords[p2] + context.offsetX) * context.scaleX;
+    var y2 = (coords[p2 + 1] + context.offsetY) * context.scaleY;
+    var x3 = (coords[p3] + context.offsetX) * context.scaleX;
+    var y3 = (coords[p3 + 1] + context.offsetY) * context.scaleY;
+    if (y1 >= y3) {
+      return;
+    }
+    var c1r = colors[c1],
+        c1g = colors[c1 + 1],
+        c1b = colors[c1 + 2];
+    var c2r = colors[c2],
+        c2g = colors[c2 + 1],
+        c2b = colors[c2 + 2];
+    var c3r = colors[c3],
+        c3g = colors[c3 + 1],
+        c3b = colors[c3 + 2];
+    var minY = Math.round(y1),
+        maxY = Math.round(y3);
+    var xa, car, cag, cab;
+    var xb, cbr, cbg, cbb;
+    var k;
+    for (var y = minY; y <= maxY; y++) {
+      if (y < y2) {
+        k = y < y1 ? 0 : y1 === y2 ? 1 : (y1 - y) / (y1 - y2);
+        xa = x1 - (x1 - x2) * k;
+        car = c1r - (c1r - c2r) * k;
+        cag = c1g - (c1g - c2g) * k;
+        cab = c1b - (c1b - c2b) * k;
+      } else {
+        k = y > y3 ? 1 : y2 === y3 ? 0 : (y2 - y) / (y2 - y3);
+        xa = x2 - (x2 - x3) * k;
+        car = c2r - (c2r - c3r) * k;
+        cag = c2g - (c2g - c3g) * k;
+        cab = c2b - (c2b - c3b) * k;
+      }
+      k = y < y1 ? 0 : y > y3 ? 1 : (y1 - y) / (y1 - y3);
+      xb = x1 - (x1 - x3) * k;
+      cbr = c1r - (c1r - c3r) * k;
+      cbg = c1g - (c1g - c3g) * k;
+      cbb = c1b - (c1b - c3b) * k;
+      var x1_ = Math.round(Math.min(xa, xb));
+      var x2_ = Math.round(Math.max(xa, xb));
+      var j = rowSize * y + x1_ * 4;
+      for (var x = x1_; x <= x2_; x++) {
+        k = (xa - x) / (xa - xb);
+        k = k < 0 ? 0 : k > 1 ? 1 : k;
+        bytes[j++] = car - (car - cbr) * k | 0;
+        bytes[j++] = cag - (cag - cbg) * k | 0;
+        bytes[j++] = cab - (cab - cbb) * k | 0;
+        bytes[j++] = 255;
+      }
+    }
+  }
+  function drawFigure(data, figure, context) {
+    var ps = figure.coords;
+    var cs = figure.colors;
+    var i, ii;
+    switch (figure.type) {
+      case 'lattice':
+        var verticesPerRow = figure.verticesPerRow;
+        var rows = Math.floor(ps.length / verticesPerRow) - 1;
+        var cols = verticesPerRow - 1;
+        for (i = 0; i < rows; i++) {
+          var q = i * verticesPerRow;
+          for (var j = 0; j < cols; j++, q++) {
+            drawTriangle(data, context, ps[q], ps[q + 1], ps[q + verticesPerRow], cs[q], cs[q + 1], cs[q + verticesPerRow]);
+            drawTriangle(data, context, ps[q + verticesPerRow + 1], ps[q + 1], ps[q + verticesPerRow], cs[q + verticesPerRow + 1], cs[q + 1], cs[q + verticesPerRow]);
+          }
+        }
+        break;
+      case 'triangles':
+        for (i = 0, ii = ps.length; i < ii; i += 3) {
+          drawTriangle(data, context, ps[i], ps[i + 1], ps[i + 2], cs[i], cs[i + 1], cs[i + 2]);
+        }
+        break;
+      default:
+        throw new Error('illegal figure');
+    }
+  }
+  function createMeshCanvas(bounds, combinesScale, coords, colors, figures, backgroundColor, cachedCanvases, webGLContext) {
+    var EXPECTED_SCALE = 1.1;
+    var MAX_PATTERN_SIZE = 3000;
+    var BORDER_SIZE = 2;
+    var offsetX = Math.floor(bounds[0]);
+    var offsetY = Math.floor(bounds[1]);
+    var boundsWidth = Math.ceil(bounds[2]) - offsetX;
+    var boundsHeight = Math.ceil(bounds[3]) - offsetY;
+    var width = Math.min(Math.ceil(Math.abs(boundsWidth * combinesScale[0] * EXPECTED_SCALE)), MAX_PATTERN_SIZE);
+    var height = Math.min(Math.ceil(Math.abs(boundsHeight * combinesScale[1] * EXPECTED_SCALE)), MAX_PATTERN_SIZE);
+    var scaleX = boundsWidth / width;
+    var scaleY = boundsHeight / height;
+    var context = {
+      coords: coords,
+      colors: colors,
+      offsetX: -offsetX,
+      offsetY: -offsetY,
+      scaleX: 1 / scaleX,
+      scaleY: 1 / scaleY
+    };
+    var paddedWidth = width + BORDER_SIZE * 2;
+    var paddedHeight = height + BORDER_SIZE * 2;
+    var canvas, tmpCanvas, i, ii;
+    if (webGLContext.isEnabled) {
+      canvas = webGLContext.drawFigures({
+        width: width,
+        height: height,
+        backgroundColor: backgroundColor,
+        figures: figures,
+        context: context
+      });
+      tmpCanvas = cachedCanvases.getCanvas('mesh', paddedWidth, paddedHeight, false);
+      tmpCanvas.context.drawImage(canvas, BORDER_SIZE, BORDER_SIZE);
+      canvas = tmpCanvas.canvas;
+    } else {
+      tmpCanvas = cachedCanvases.getCanvas('mesh', paddedWidth, paddedHeight, false);
+      var tmpCtx = tmpCanvas.context;
+      var data = tmpCtx.createImageData(width, height);
+      if (backgroundColor) {
+        var bytes = data.data;
+        for (i = 0, ii = bytes.length; i < ii; i += 4) {
+          bytes[i] = backgroundColor[0];
+          bytes[i + 1] = backgroundColor[1];
+          bytes[i + 2] = backgroundColor[2];
+          bytes[i + 3] = 255;
+        }
+      }
+      for (i = 0; i < figures.length; i++) {
+        drawFigure(data, figures[i], context);
+      }
+      tmpCtx.putImageData(data, BORDER_SIZE, BORDER_SIZE);
+      canvas = tmpCanvas.canvas;
+    }
+    return {
+      canvas: canvas,
+      offsetX: offsetX - BORDER_SIZE * scaleX,
+      offsetY: offsetY - BORDER_SIZE * scaleY,
+      scaleX: scaleX,
+      scaleY: scaleY
+    };
+  }
+  return createMeshCanvas;
+}();
+ShadingIRs.Mesh = {
+  fromIR: function Mesh_fromIR(raw) {
+    var coords = raw[2];
+    var colors = raw[3];
+    var figures = raw[4];
+    var bounds = raw[5];
+    var matrix = raw[6];
+    var background = raw[8];
+    return {
+      type: 'Pattern',
+      getPattern: function Mesh_getPattern(ctx, owner, shadingFill) {
+        var scale;
+        if (shadingFill) {
+          scale = _util.Util.singularValueDecompose2dScale(ctx.mozCurrentTransform);
+        } else {
+          scale = _util.Util.singularValueDecompose2dScale(owner.baseTransform);
+          if (matrix) {
+            var matrixScale = _util.Util.singularValueDecompose2dScale(matrix);
+            scale = [scale[0] * matrixScale[0], scale[1] * matrixScale[1]];
+          }
+        }
+        var temporaryPatternCanvas = createMeshCanvas(bounds, scale, coords, colors, figures, shadingFill ? null : background, owner.cachedCanvases, owner.webGLContext);
+        if (!shadingFill) {
+          ctx.setTransform.apply(ctx, owner.baseTransform);
+          if (matrix) {
+            ctx.transform.apply(ctx, matrix);
+          }
+        }
+        ctx.translate(temporaryPatternCanvas.offsetX, temporaryPatternCanvas.offsetY);
+        ctx.scale(temporaryPatternCanvas.scaleX, temporaryPatternCanvas.scaleY);
+        return ctx.createPattern(temporaryPatternCanvas.canvas, 'no-repeat');
+      }
+    };
+  }
+};
+ShadingIRs.Dummy = {
+  fromIR: function Dummy_fromIR() {
+    return {
+      type: 'Pattern',
+      getPattern: function Dummy_fromIR_getPattern() {
+        return 'hotpink';
+      }
+    };
+  }
+};
+function getShadingPatternFromIR(raw) {
+  var shadingIR = ShadingIRs[raw[0]];
+  if (!shadingIR) {
+    throw new Error('Unknown IR type: ' + raw[0]);
+  }
+  return shadingIR.fromIR(raw);
+}
+var TilingPattern = function TilingPatternClosure() {
+  var PaintType = {
+    COLORED: 1,
+    UNCOLORED: 2
+  };
+  var MAX_PATTERN_SIZE = 3000;
+  function TilingPattern(IR, color, ctx, canvasGraphicsFactory, baseTransform) {
+    this.operatorList = IR[2];
+    this.matrix = IR[3] || [1, 0, 0, 1, 0, 0];
+    this.bbox = IR[4];
+    this.xstep = IR[5];
+    this.ystep = IR[6];
+    this.paintType = IR[7];
+    this.tilingType = IR[8];
+    this.color = color;
+    this.canvasGraphicsFactory = canvasGraphicsFactory;
+    this.baseTransform = baseTransform;
+    this.type = 'Pattern';
+    this.ctx = ctx;
+  }
+  TilingPattern.prototype = {
+    createPatternCanvas: function TilinPattern_createPatternCanvas(owner) {
+      var operatorList = this.operatorList;
+      var bbox = this.bbox;
+      var xstep = this.xstep;
+      var ystep = this.ystep;
+      var paintType = this.paintType;
+      var tilingType = this.tilingType;
+      var color = this.color;
+      var canvasGraphicsFactory = this.canvasGraphicsFactory;
+      (0, _util.info)('TilingType: ' + tilingType);
+      var x0 = bbox[0],
+          y0 = bbox[1],
+          x1 = bbox[2],
+          y1 = bbox[3];
+      var topLeft = [x0, y0];
+      var botRight = [x0 + xstep, y0 + ystep];
+      var width = botRight[0] - topLeft[0];
+      var height = botRight[1] - topLeft[1];
+      var matrixScale = _util.Util.singularValueDecompose2dScale(this.matrix);
+      var curMatrixScale = _util.Util.singularValueDecompose2dScale(this.baseTransform);
+      var combinedScale = [matrixScale[0] * curMatrixScale[0], matrixScale[1] * curMatrixScale[1]];
+      width = Math.min(Math.ceil(Math.abs(width * combinedScale[0])), MAX_PATTERN_SIZE);
+      height = Math.min(Math.ceil(Math.abs(height * combinedScale[1])), MAX_PATTERN_SIZE);
+      var tmpCanvas = owner.cachedCanvases.getCanvas('pattern', width, height, true);
+      var tmpCtx = tmpCanvas.context;
+      var graphics = canvasGraphicsFactory.createCanvasGraphics(tmpCtx);
+      graphics.groupLevel = owner.groupLevel;
+      this.setFillAndStrokeStyleToContext(graphics, paintType, color);
+      this.setScale(width, height, xstep, ystep);
+      this.transformToScale(graphics);
+      var tmpTranslate = [1, 0, 0, 1, -topLeft[0], -topLeft[1]];
+      graphics.transform.apply(graphics, tmpTranslate);
+      this.clipBbox(graphics, bbox, x0, y0, x1, y1);
+      graphics.executeOperatorList(operatorList);
+      return tmpCanvas.canvas;
+    },
+    setScale: function TilingPattern_setScale(width, height, xstep, ystep) {
+      this.scale = [width / xstep, height / ystep];
+    },
+    transformToScale: function TilingPattern_transformToScale(graphics) {
+      var scale = this.scale;
+      var tmpScale = [scale[0], 0, 0, scale[1], 0, 0];
+      graphics.transform.apply(graphics, tmpScale);
+    },
+    scaleToContext: function TilingPattern_scaleToContext() {
+      var scale = this.scale;
+      this.ctx.scale(1 / scale[0], 1 / scale[1]);
+    },
+    clipBbox: function clipBbox(graphics, bbox, x0, y0, x1, y1) {
+      if (Array.isArray(bbox) && bbox.length === 4) {
+        var bboxWidth = x1 - x0;
+        var bboxHeight = y1 - y0;
+        graphics.ctx.rect(x0, y0, bboxWidth, bboxHeight);
+        graphics.clip();
+        graphics.endPath();
+      }
+    },
+    setFillAndStrokeStyleToContext: function setFillAndStrokeStyleToContext(graphics, paintType, color) {
+      var context = graphics.ctx,
+          current = graphics.current;
+      switch (paintType) {
+        case PaintType.COLORED:
+          var ctx = this.ctx;
+          context.fillStyle = ctx.fillStyle;
+          context.strokeStyle = ctx.strokeStyle;
+          current.fillColor = ctx.fillStyle;
+          current.strokeColor = ctx.strokeStyle;
+          break;
+        case PaintType.UNCOLORED:
+          var cssColor = _util.Util.makeCssRgb(color[0], color[1], color[2]);
+          context.fillStyle = cssColor;
+          context.strokeStyle = cssColor;
+          current.fillColor = cssColor;
+          current.strokeColor = cssColor;
+          break;
+        default:
+          throw new _util.FormatError('Unsupported paint type: ' + paintType);
+      }
+    },
+    getPattern: function TilingPattern_getPattern(ctx, owner) {
+      var temporaryPatternCanvas = this.createPatternCanvas(owner);
+      ctx = this.ctx;
+      ctx.setTransform.apply(ctx, this.baseTransform);
+      ctx.transform.apply(ctx, this.matrix);
+      this.scaleToContext();
+      return ctx.createPattern(temporaryPatternCanvas, 'repeat');
+    }
+  };
+  return TilingPattern;
+}();
+exports.getShadingPatternFromIR = getShadingPatternFromIR;
+exports.TilingPattern = TilingPattern;
+
+/***/ }),
+/* 135 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+var GlobalWorkerOptions = Object.create(null);
+GlobalWorkerOptions.workerPort = GlobalWorkerOptions.workerPort === undefined ? null : GlobalWorkerOptions.workerPort;
+GlobalWorkerOptions.workerSrc = GlobalWorkerOptions.workerSrc === undefined ? '' : GlobalWorkerOptions.workerSrc;
+exports.GlobalWorkerOptions = GlobalWorkerOptions;
+
+/***/ }),
+/* 136 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.MessageHandler = undefined;
+
+var _regenerator = __w_pdfjs_require__(137);
+
+var _regenerator2 = _interopRequireDefault(_regenerator);
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+var resolveCall = function () {
+  var _ref = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee(fn, args) {
+    var thisArg = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
+    return _regenerator2.default.wrap(function _callee$(_context) {
+      while (1) {
+        switch (_context.prev = _context.next) {
+          case 0:
+            if (fn) {
+              _context.next = 2;
+              break;
+            }
+
+            return _context.abrupt('return');
+
+          case 2:
+            return _context.abrupt('return', fn.apply(thisArg, args));
+
+          case 3:
+          case 'end':
+            return _context.stop();
+        }
+      }
+    }, _callee, this);
+  }));
+
+  return function resolveCall(_x2, _x3) {
+    return _ref.apply(this, arguments);
+  };
+}();
+
+var _util = __w_pdfjs_require__(1);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
+
+function wrapReason(reason) {
+  if ((typeof reason === 'undefined' ? 'undefined' : _typeof(reason)) !== 'object') {
+    return reason;
+  }
+  switch (reason.name) {
+    case 'AbortException':
+      return new _util.AbortException(reason.message);
+    case 'MissingPDFException':
+      return new _util.MissingPDFException(reason.message);
+    case 'UnexpectedResponseException':
+      return new _util.UnexpectedResponseException(reason.message, reason.status);
+    default:
+      return new _util.UnknownErrorException(reason.message, reason.details);
+  }
+}
+function makeReasonSerializable(reason) {
+  if (!(reason instanceof Error) || reason instanceof _util.AbortException || reason instanceof _util.MissingPDFException || reason instanceof _util.UnexpectedResponseException || reason instanceof _util.UnknownErrorException) {
+    return reason;
+  }
+  return new _util.UnknownErrorException(reason.message, reason.toString());
+}
+function resolveOrReject(capability, success, reason) {
+  if (success) {
+    capability.resolve();
+  } else {
+    capability.reject(reason);
+  }
+}
+function finalize(promise) {
+  return Promise.resolve(promise).catch(function () {});
+}
+function MessageHandler(sourceName, targetName, comObj) {
+  var _this = this;
+
+  this.sourceName = sourceName;
+  this.targetName = targetName;
+  this.comObj = comObj;
+  this.callbackId = 1;
+  this.streamId = 1;
+  this.postMessageTransfers = true;
+  this.streamSinks = Object.create(null);
+  this.streamControllers = Object.create(null);
+  var callbacksCapabilities = this.callbacksCapabilities = Object.create(null);
+  var ah = this.actionHandler = Object.create(null);
+  this._onComObjOnMessage = function (event) {
+    var data = event.data;
+    if (data.targetName !== _this.sourceName) {
+      return;
+    }
+    if (data.stream) {
+      _this._processStreamMessage(data);
+    } else if (data.isReply) {
+      var callbackId = data.callbackId;
+      if (data.callbackId in callbacksCapabilities) {
+        var callback = callbacksCapabilities[callbackId];
+        delete callbacksCapabilities[callbackId];
+        if ('error' in data) {
+          callback.reject(wrapReason(data.error));
+        } else {
+          callback.resolve(data.data);
+        }
+      } else {
+        throw new Error('Cannot resolve callback ' + callbackId);
+      }
+    } else if (data.action in ah) {
+      var action = ah[data.action];
+      if (data.callbackId) {
+        var _sourceName = _this.sourceName;
+        var _targetName = data.sourceName;
+        Promise.resolve().then(function () {
+          return action[0].call(action[1], data.data);
+        }).then(function (result) {
+          comObj.postMessage({
+            sourceName: _sourceName,
+            targetName: _targetName,
+            isReply: true,
+            callbackId: data.callbackId,
+            data: result
+          });
+        }, function (reason) {
+          comObj.postMessage({
+            sourceName: _sourceName,
+            targetName: _targetName,
+            isReply: true,
+            callbackId: data.callbackId,
+            error: makeReasonSerializable(reason)
+          });
+        });
+      } else if (data.streamId) {
+        _this._createStreamSink(data);
+      } else {
+        action[0].call(action[1], data.data);
+      }
+    } else {
+      throw new Error('Unknown action from worker: ' + data.action);
+    }
+  };
+  comObj.addEventListener('message', this._onComObjOnMessage);
+}
+MessageHandler.prototype = {
+  on: function on(actionName, handler, scope) {
+    var ah = this.actionHandler;
+    if (ah[actionName]) {
+      throw new Error('There is already an actionName called "' + actionName + '"');
+    }
+    ah[actionName] = [handler, scope];
+  },
+  send: function send(actionName, data, transfers) {
+    var message = {
+      sourceName: this.sourceName,
+      targetName: this.targetName,
+      action: actionName,
+      data: data
+    };
+    this.postMessage(message, transfers);
+  },
+  sendWithPromise: function sendWithPromise(actionName, data, transfers) {
+    var callbackId = this.callbackId++;
+    var message = {
+      sourceName: this.sourceName,
+      targetName: this.targetName,
+      action: actionName,
+      data: data,
+      callbackId: callbackId
+    };
+    var capability = (0, _util.createPromiseCapability)();
+    this.callbacksCapabilities[callbackId] = capability;
+    try {
+      this.postMessage(message, transfers);
+    } catch (e) {
+      capability.reject(e);
+    }
+    return capability.promise;
+  },
+  sendWithStream: function sendWithStream(actionName, data, queueingStrategy, transfers) {
+    var _this2 = this;
+
+    var streamId = this.streamId++;
+    var sourceName = this.sourceName;
+    var targetName = this.targetName;
+    return new _util.ReadableStream({
+      start: function start(controller) {
+        var startCapability = (0, _util.createPromiseCapability)();
+        _this2.streamControllers[streamId] = {
+          controller: controller,
+          startCall: startCapability,
+          isClosed: false
+        };
+        _this2.postMessage({
+          sourceName: sourceName,
+          targetName: targetName,
+          action: actionName,
+          streamId: streamId,
+          data: data,
+          desiredSize: controller.desiredSize
+        });
+        return startCapability.promise;
+      },
+      pull: function pull(controller) {
+        var pullCapability = (0, _util.createPromiseCapability)();
+        _this2.streamControllers[streamId].pullCall = pullCapability;
+        _this2.postMessage({
+          sourceName: sourceName,
+          targetName: targetName,
+          stream: 'pull',
+          streamId: streamId,
+          desiredSize: controller.desiredSize
+        });
+        return pullCapability.promise;
+      },
+      cancel: function cancel(reason) {
+        var cancelCapability = (0, _util.createPromiseCapability)();
+        _this2.streamControllers[streamId].cancelCall = cancelCapability;
+        _this2.streamControllers[streamId].isClosed = true;
+        _this2.postMessage({
+          sourceName: sourceName,
+          targetName: targetName,
+          stream: 'cancel',
+          reason: reason,
+          streamId: streamId
+        });
+        return cancelCapability.promise;
+      }
+    }, queueingStrategy);
+  },
+  _createStreamSink: function _createStreamSink(data) {
+    var _this3 = this;
+
+    var self = this;
+    var action = this.actionHandler[data.action];
+    var streamId = data.streamId;
+    var desiredSize = data.desiredSize;
+    var sourceName = this.sourceName;
+    var targetName = data.sourceName;
+    var capability = (0, _util.createPromiseCapability)();
+    var sendStreamRequest = function sendStreamRequest(_ref2) {
+      var stream = _ref2.stream,
+          chunk = _ref2.chunk,
+          transfers = _ref2.transfers,
+          success = _ref2.success,
+          reason = _ref2.reason;
+
+      _this3.postMessage({
+        sourceName: sourceName,
+        targetName: targetName,
+        stream: stream,
+        streamId: streamId,
+        chunk: chunk,
+        success: success,
+        reason: reason
+      }, transfers);
+    };
+    var streamSink = {
+      enqueue: function enqueue(chunk) {
+        var size = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
+        var transfers = arguments[2];
+
+        if (this.isCancelled) {
+          return;
+        }
+        var lastDesiredSize = this.desiredSize;
+        this.desiredSize -= size;
+        if (lastDesiredSize > 0 && this.desiredSize <= 0) {
+          this.sinkCapability = (0, _util.createPromiseCapability)();
+          this.ready = this.sinkCapability.promise;
+        }
+        sendStreamRequest({
+          stream: 'enqueue',
+          chunk: chunk,
+          transfers: transfers
+        });
+      },
+      close: function close() {
+        if (this.isCancelled) {
+          return;
+        }
+        this.isCancelled = true;
+        sendStreamRequest({ stream: 'close' });
+        delete self.streamSinks[streamId];
+      },
+      error: function error(reason) {
+        if (this.isCancelled) {
+          return;
+        }
+        this.isCancelled = true;
+        sendStreamRequest({
+          stream: 'error',
+          reason: reason
+        });
+      },
+
+      sinkCapability: capability,
+      onPull: null,
+      onCancel: null,
+      isCancelled: false,
+      desiredSize: desiredSize,
+      ready: null
+    };
+    streamSink.sinkCapability.resolve();
+    streamSink.ready = streamSink.sinkCapability.promise;
+    this.streamSinks[streamId] = streamSink;
+    resolveCall(action[0], [data.data, streamSink], action[1]).then(function () {
+      sendStreamRequest({
+        stream: 'start_complete',
+        success: true
+      });
+    }, function (reason) {
+      sendStreamRequest({
+        stream: 'start_complete',
+        success: false,
+        reason: reason
+      });
+    });
+  },
+  _processStreamMessage: function _processStreamMessage(data) {
+    var _this4 = this;
+
+    var sourceName = this.sourceName;
+    var targetName = data.sourceName;
+    var streamId = data.streamId;
+    var sendStreamResponse = function sendStreamResponse(_ref3) {
+      var stream = _ref3.stream,
+          success = _ref3.success,
+          reason = _ref3.reason;
+
+      _this4.comObj.postMessage({
+        sourceName: sourceName,
+        targetName: targetName,
+        stream: stream,
+        success: success,
+        streamId: streamId,
+        reason: reason
+      });
+    };
+    var deleteStreamController = function deleteStreamController() {
+      Promise.all([_this4.streamControllers[data.streamId].startCall, _this4.streamControllers[data.streamId].pullCall, _this4.streamControllers[data.streamId].cancelCall].map(function (capability) {
+        return capability && finalize(capability.promise);
+      })).then(function () {
+        delete _this4.streamControllers[data.streamId];
+      });
+    };
+    switch (data.stream) {
+      case 'start_complete':
+        resolveOrReject(this.streamControllers[data.streamId].startCall, data.success, wrapReason(data.reason));
+        break;
+      case 'pull_complete':
+        resolveOrReject(this.streamControllers[data.streamId].pullCall, data.success, wrapReason(data.reason));
+        break;
+      case 'pull':
+        if (!this.streamSinks[data.streamId]) {
+          sendStreamResponse({
+            stream: 'pull_complete',
+            success: true
+          });
+          break;
+        }
+        if (this.streamSinks[data.streamId].desiredSize <= 0 && data.desiredSize > 0) {
+          this.streamSinks[data.streamId].sinkCapability.resolve();
+        }
+        this.streamSinks[data.streamId].desiredSize = data.desiredSize;
+        resolveCall(this.streamSinks[data.streamId].onPull).then(function () {
+          sendStreamResponse({
+            stream: 'pull_complete',
+            success: true
+          });
+        }, function (reason) {
+          sendStreamResponse({
+            stream: 'pull_complete',
+            success: false,
+            reason: reason
+          });
+        });
+        break;
+      case 'enqueue':
+        (0, _util.assert)(this.streamControllers[data.streamId], 'enqueue should have stream controller');
+        if (!this.streamControllers[data.streamId].isClosed) {
+          this.streamControllers[data.streamId].controller.enqueue(data.chunk);
+        }
+        break;
+      case 'close':
+        (0, _util.assert)(this.streamControllers[data.streamId], 'close should have stream controller');
+        if (this.streamControllers[data.streamId].isClosed) {
+          break;
+        }
+        this.streamControllers[data.streamId].isClosed = true;
+        this.streamControllers[data.streamId].controller.close();
+        deleteStreamController();
+        break;
+      case 'error':
+        (0, _util.assert)(this.streamControllers[data.streamId], 'error should have stream controller');
+        this.streamControllers[data.streamId].controller.error(wrapReason(data.reason));
+        deleteStreamController();
+        break;
+      case 'cancel_complete':
+        resolveOrReject(this.streamControllers[data.streamId].cancelCall, data.success, wrapReason(data.reason));
+        deleteStreamController();
+        break;
+      case 'cancel':
+        if (!this.streamSinks[data.streamId]) {
+          break;
+        }
+        resolveCall(this.streamSinks[data.streamId].onCancel, [wrapReason(data.reason)]).then(function () {
+          sendStreamResponse({
+            stream: 'cancel_complete',
+            success: true
+          });
+        }, function (reason) {
+          sendStreamResponse({
+            stream: 'cancel_complete',
+            success: false,
+            reason: reason
+          });
+        });
+        this.streamSinks[data.streamId].sinkCapability.reject(wrapReason(data.reason));
+        this.streamSinks[data.streamId].isCancelled = true;
+        delete this.streamSinks[data.streamId];
+        break;
+      default:
+        throw new Error('Unexpected stream case');
+    }
+  },
+  postMessage: function postMessage(message, transfers) {
+    if (transfers && this.postMessageTransfers) {
+      this.comObj.postMessage(message, transfers);
+    } else {
+      this.comObj.postMessage(message);
+    }
+  },
+  destroy: function destroy() {
+    this.comObj.removeEventListener('message', this._onComObjOnMessage);
+  }
+};
+exports.MessageHandler = MessageHandler;
+
+/***/ }),
+/* 137 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+module.exports = __w_pdfjs_require__(138);
+
+/***/ }),
+/* 138 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var g = function () {
+  return this;
+}() || Function("return this")();
+var hadRuntime = g.regeneratorRuntime && Object.getOwnPropertyNames(g).indexOf("regeneratorRuntime") >= 0;
+var oldRuntime = hadRuntime && g.regeneratorRuntime;
+g.regeneratorRuntime = undefined;
+module.exports = __w_pdfjs_require__(139);
+if (hadRuntime) {
+  g.regeneratorRuntime = oldRuntime;
+} else {
+  try {
+    delete g.regeneratorRuntime;
+  } catch (e) {
+    g.regeneratorRuntime = undefined;
+  }
+}
+
+/***/ }),
+/* 139 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+/* WEBPACK VAR INJECTION */(function(module) {
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+!function (global) {
+  "use strict";
+
+  var Op = Object.prototype;
+  var hasOwn = Op.hasOwnProperty;
+  var undefined;
+  var $Symbol = typeof Symbol === "function" ? Symbol : {};
+  var iteratorSymbol = $Symbol.iterator || "@@iterator";
+  var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator";
+  var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";
+  var inModule = ( false ? undefined : _typeof(module)) === "object";
+  var runtime = global.regeneratorRuntime;
+  if (runtime) {
+    if (inModule) {
+      module.exports = runtime;
+    }
+    return;
+  }
+  runtime = global.regeneratorRuntime = inModule ? module.exports : {};
+  function wrap(innerFn, outerFn, self, tryLocsList) {
+    var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;
+    var generator = Object.create(protoGenerator.prototype);
+    var context = new Context(tryLocsList || []);
+    generator._invoke = makeInvokeMethod(innerFn, self, context);
+    return generator;
+  }
+  runtime.wrap = wrap;
+  function tryCatch(fn, obj, arg) {
+    try {
+      return {
+        type: "normal",
+        arg: fn.call(obj, arg)
+      };
+    } catch (err) {
+      return {
+        type: "throw",
+        arg: err
+      };
+    }
+  }
+  var GenStateSuspendedStart = "suspendedStart";
+  var GenStateSuspendedYield = "suspendedYield";
+  var GenStateExecuting = "executing";
+  var GenStateCompleted = "completed";
+  var ContinueSentinel = {};
+  function Generator() {}
+  function GeneratorFunction() {}
+  function GeneratorFunctionPrototype() {}
+  var IteratorPrototype = {};
+  IteratorPrototype[iteratorSymbol] = function () {
+    return this;
+  };
+  var getProto = Object.getPrototypeOf;
+  var NativeIteratorPrototype = getProto && getProto(getProto(values([])));
+  if (NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {
+    IteratorPrototype = NativeIteratorPrototype;
+  }
+  var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype);
+  GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;
+  GeneratorFunctionPrototype.constructor = GeneratorFunction;
+  GeneratorFunctionPrototype[toStringTagSymbol] = GeneratorFunction.displayName = "GeneratorFunction";
+  function defineIteratorMethods(prototype) {
+    ["next", "throw", "return"].forEach(function (method) {
+      prototype[method] = function (arg) {
+        return this._invoke(method, arg);
+      };
+    });
+  }
+  runtime.isGeneratorFunction = function (genFun) {
+    var ctor = typeof genFun === "function" && genFun.constructor;
+    return ctor ? ctor === GeneratorFunction || (ctor.displayName || ctor.name) === "GeneratorFunction" : false;
+  };
+  runtime.mark = function (genFun) {
+    if (Object.setPrototypeOf) {
+      Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);
+    } else {
+      genFun.__proto__ = GeneratorFunctionPrototype;
+      if (!(toStringTagSymbol in genFun)) {
+        genFun[toStringTagSymbol] = "GeneratorFunction";
+      }
+    }
+    genFun.prototype = Object.create(Gp);
+    return genFun;
+  };
+  runtime.awrap = function (arg) {
+    return { __await: arg };
+  };
+  function AsyncIterator(generator) {
+    function invoke(method, arg, resolve, reject) {
+      var record = tryCatch(generator[method], generator, arg);
+      if (record.type === "throw") {
+        reject(record.arg);
+      } else {
+        var result = record.arg;
+        var value = result.value;
+        if (value && (typeof value === "undefined" ? "undefined" : _typeof(value)) === "object" && hasOwn.call(value, "__await")) {
+          return Promise.resolve(value.__await).then(function (value) {
+            invoke("next", value, resolve, reject);
+          }, function (err) {
+            invoke("throw", err, resolve, reject);
+          });
+        }
+        return Promise.resolve(value).then(function (unwrapped) {
+          result.value = unwrapped;
+          resolve(result);
+        }, reject);
+      }
+    }
+    var previousPromise;
+    function enqueue(method, arg) {
+      function callInvokeWithMethodAndArg() {
+        return new Promise(function (resolve, reject) {
+          invoke(method, arg, resolve, reject);
+        });
+      }
+      return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();
+    }
+    this._invoke = enqueue;
+  }
+  defineIteratorMethods(AsyncIterator.prototype);
+  AsyncIterator.prototype[asyncIteratorSymbol] = function () {
+    return this;
+  };
+  runtime.AsyncIterator = AsyncIterator;
+  runtime.async = function (innerFn, outerFn, self, tryLocsList) {
+    var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList));
+    return runtime.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) {
+      return result.done ? result.value : iter.next();
+    });
+  };
+  function makeInvokeMethod(innerFn, self, context) {
+    var state = GenStateSuspendedStart;
+    return function invoke(method, arg) {
+      if (state === GenStateExecuting) {
+        throw new Error("Generator is already running");
+      }
+      if (state === GenStateCompleted) {
+        if (method === "throw") {
+          throw arg;
+        }
+        return doneResult();
+      }
+      context.method = method;
+      context.arg = arg;
+      while (true) {
+        var delegate = context.delegate;
+        if (delegate) {
+          var delegateResult = maybeInvokeDelegate(delegate, context);
+          if (delegateResult) {
+            if (delegateResult === ContinueSentinel) continue;
+            return delegateResult;
+          }
+        }
+        if (context.method === "next") {
+          context.sent = context._sent = context.arg;
+        } else if (context.method === "throw") {
+          if (state === GenStateSuspendedStart) {
+            state = GenStateCompleted;
+            throw context.arg;
+          }
+          context.dispatchException(context.arg);
+        } else if (context.method === "return") {
+          context.abrupt("return", context.arg);
+        }
+        state = GenStateExecuting;
+        var record = tryCatch(innerFn, self, context);
+        if (record.type === "normal") {
+          state = context.done ? GenStateCompleted : GenStateSuspendedYield;
+          if (record.arg === ContinueSentinel) {
+            continue;
+          }
+          return {
+            value: record.arg,
+            done: context.done
+          };
+        } else if (record.type === "throw") {
+          state = GenStateCompleted;
+          context.method = "throw";
+          context.arg = record.arg;
+        }
+      }
+    };
+  }
+  function maybeInvokeDelegate(delegate, context) {
+    var method = delegate.iterator[context.method];
+    if (method === undefined) {
+      context.delegate = null;
+      if (context.method === "throw") {
+        if (delegate.iterator.return) {
+          context.method = "return";
+          context.arg = undefined;
+          maybeInvokeDelegate(delegate, context);
+          if (context.method === "throw") {
+            return ContinueSentinel;
+          }
+        }
+        context.method = "throw";
+        context.arg = new TypeError("The iterator does not provide a 'throw' method");
+      }
+      return ContinueSentinel;
+    }
+    var record = tryCatch(method, delegate.iterator, context.arg);
+    if (record.type === "throw") {
+      context.method = "throw";
+      context.arg = record.arg;
+      context.delegate = null;
+      return ContinueSentinel;
+    }
+    var info = record.arg;
+    if (!info) {
+      context.method = "throw";
+      context.arg = new TypeError("iterator result is not an object");
+      context.delegate = null;
+      return ContinueSentinel;
+    }
+    if (info.done) {
+      context[delegate.resultName] = info.value;
+      context.next = delegate.nextLoc;
+      if (context.method !== "return") {
+        context.method = "next";
+        context.arg = undefined;
+      }
+    } else {
+      return info;
+    }
+    context.delegate = null;
+    return ContinueSentinel;
+  }
+  defineIteratorMethods(Gp);
+  Gp[toStringTagSymbol] = "Generator";
+  Gp[iteratorSymbol] = function () {
+    return this;
+  };
+  Gp.toString = function () {
+    return "[object Generator]";
+  };
+  function pushTryEntry(locs) {
+    var entry = { tryLoc: locs[0] };
+    if (1 in locs) {
+      entry.catchLoc = locs[1];
+    }
+    if (2 in locs) {
+      entry.finallyLoc = locs[2];
+      entry.afterLoc = locs[3];
+    }
+    this.tryEntries.push(entry);
+  }
+  function resetTryEntry(entry) {
+    var record = entry.completion || {};
+    record.type = "normal";
+    delete record.arg;
+    entry.completion = record;
+  }
+  function Context(tryLocsList) {
+    this.tryEntries = [{ tryLoc: "root" }];
+    tryLocsList.forEach(pushTryEntry, this);
+    this.reset(true);
+  }
+  runtime.keys = function (object) {
+    var keys = [];
+    for (var key in object) {
+      keys.push(key);
+    }
+    keys.reverse();
+    return function next() {
+      while (keys.length) {
+        var key = keys.pop();
+        if (key in object) {
+          next.value = key;
+          next.done = false;
+          return next;
+        }
+      }
+      next.done = true;
+      return next;
+    };
+  };
+  function values(iterable) {
+    if (iterable) {
+      var iteratorMethod = iterable[iteratorSymbol];
+      if (iteratorMethod) {
+        return iteratorMethod.call(iterable);
+      }
+      if (typeof iterable.next === "function") {
+        return iterable;
+      }
+      if (!isNaN(iterable.length)) {
+        var i = -1,
+            next = function next() {
+          while (++i < iterable.length) {
+            if (hasOwn.call(iterable, i)) {
+              next.value = iterable[i];
+              next.done = false;
+              return next;
+            }
+          }
+          next.value = undefined;
+          next.done = true;
+          return next;
+        };
+        return next.next = next;
+      }
+    }
+    return { next: doneResult };
+  }
+  runtime.values = values;
+  function doneResult() {
+    return {
+      value: undefined,
+      done: true
+    };
+  }
+  Context.prototype = {
+    constructor: Context,
+    reset: function reset(skipTempReset) {
+      this.prev = 0;
+      this.next = 0;
+      this.sent = this._sent = undefined;
+      this.done = false;
+      this.delegate = null;
+      this.method = "next";
+      this.arg = undefined;
+      this.tryEntries.forEach(resetTryEntry);
+      if (!skipTempReset) {
+        for (var name in this) {
+          if (name.charAt(0) === "t" && hasOwn.call(this, name) && !isNaN(+name.slice(1))) {
+            this[name] = undefined;
+          }
+        }
+      }
+    },
+    stop: function stop() {
+      this.done = true;
+      var rootEntry = this.tryEntries[0];
+      var rootRecord = rootEntry.completion;
+      if (rootRecord.type === "throw") {
+        throw rootRecord.arg;
+      }
+      return this.rval;
+    },
+    dispatchException: function dispatchException(exception) {
+      if (this.done) {
+        throw exception;
+      }
+      var context = this;
+      function handle(loc, caught) {
+        record.type = "throw";
+        record.arg = exception;
+        context.next = loc;
+        if (caught) {
+          context.method = "next";
+          context.arg = undefined;
+        }
+        return !!caught;
+      }
+      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
+        var entry = this.tryEntries[i];
+        var record = entry.completion;
+        if (entry.tryLoc === "root") {
+          return handle("end");
+        }
+        if (entry.tryLoc <= this.prev) {
+          var hasCatch = hasOwn.call(entry, "catchLoc");
+          var hasFinally = hasOwn.call(entry, "finallyLoc");
+          if (hasCatch && hasFinally) {
+            if (this.prev < entry.catchLoc) {
+              return handle(entry.catchLoc, true);
+            } else if (this.prev < entry.finallyLoc) {
+              return handle(entry.finallyLoc);
+            }
+          } else if (hasCatch) {
+            if (this.prev < entry.catchLoc) {
+              return handle(entry.catchLoc, true);
+            }
+          } else if (hasFinally) {
+            if (this.prev < entry.finallyLoc) {
+              return handle(entry.finallyLoc);
+            }
+          } else {
+            throw new Error("try statement without catch or finally");
+          }
+        }
+      }
+    },
+    abrupt: function abrupt(type, arg) {
+      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
+        var entry = this.tryEntries[i];
+        if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) {
+          var finallyEntry = entry;
+          break;
+        }
+      }
+      if (finallyEntry && (type === "break" || type === "continue") && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc) {
+        finallyEntry = null;
+      }
+      var record = finallyEntry ? finallyEntry.completion : {};
+      record.type = type;
+      record.arg = arg;
+      if (finallyEntry) {
+        this.method = "next";
+        this.next = finallyEntry.finallyLoc;
+        return ContinueSentinel;
+      }
+      return this.complete(record);
+    },
+    complete: function complete(record, afterLoc) {
+      if (record.type === "throw") {
+        throw record.arg;
+      }
+      if (record.type === "break" || record.type === "continue") {
+        this.next = record.arg;
+      } else if (record.type === "return") {
+        this.rval = this.arg = record.arg;
+        this.method = "return";
+        this.next = "end";
+      } else if (record.type === "normal" && afterLoc) {
+        this.next = afterLoc;
+      }
+      return ContinueSentinel;
+    },
+    finish: function finish(finallyLoc) {
+      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
+        var entry = this.tryEntries[i];
+        if (entry.finallyLoc === finallyLoc) {
+          this.complete(entry.completion, entry.afterLoc);
+          resetTryEntry(entry);
+          return ContinueSentinel;
+        }
+      }
+    },
+    "catch": function _catch(tryLoc) {
+      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
+        var entry = this.tryEntries[i];
+        if (entry.tryLoc === tryLoc) {
+          var record = entry.completion;
+          if (record.type === "throw") {
+            var thrown = record.arg;
+            resetTryEntry(entry);
+          }
+          return thrown;
+        }
+      }
+      throw new Error("illegal catch attempt");
+    },
+    delegateYield: function delegateYield(iterable, resultName, nextLoc) {
+      this.delegate = {
+        iterator: values(iterable),
+        resultName: resultName,
+        nextLoc: nextLoc
+      };
+      if (this.method === "next") {
+        this.arg = undefined;
+      }
+      return ContinueSentinel;
+    }
+  };
+}(function () {
+  return this;
+}() || Function("return this")());
+/* WEBPACK VAR INJECTION */}.call(this, __w_pdfjs_require__(140)(module)))
+
+/***/ }),
+/* 140 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+module.exports = function (module) {
+  if (!module.webpackPolyfill) {
+    module.deprecate = function () {};
+    module.paths = [];
+    if (!module.children) module.children = [];
+    Object.defineProperty(module, "loaded", {
+      enumerable: true,
+      get: function get() {
+        return module.l;
+      }
+    });
+    Object.defineProperty(module, "id", {
+      enumerable: true,
+      get: function get() {
+        return module.i;
+      }
+    });
+    module.webpackPolyfill = 1;
+  }
+  return module;
+};
+
+/***/ }),
+/* 141 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.Metadata = undefined;
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _util = __w_pdfjs_require__(1);
+
+var _xml_parser = __w_pdfjs_require__(142);
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var Metadata = function () {
+  function Metadata(data) {
+    _classCallCheck(this, Metadata);
+
+    (0, _util.assert)(typeof data === 'string', 'Metadata: input is not a string');
+    data = this._repair(data);
+    var parser = new _xml_parser.SimpleXMLParser();
+    var xmlDocument = parser.parseFromString(data);
+    this._metadata = Object.create(null);
+    if (xmlDocument) {
+      this._parse(xmlDocument);
+    }
+  }
+
+  _createClass(Metadata, [{
+    key: '_repair',
+    value: function _repair(data) {
+      return data.replace(/>\\376\\377([^<]+)/g, function (all, codes) {
+        var bytes = codes.replace(/\\([0-3])([0-7])([0-7])/g, function (code, d1, d2, d3) {
+          return String.fromCharCode(d1 * 64 + d2 * 8 + d3 * 1);
+        }).replace(/&(amp|apos|gt|lt|quot);/g, function (str, name) {
+          switch (name) {
+            case 'amp':
+              return '&';
+            case 'apos':
+              return '\'';
+            case 'gt':
+              return '>';
+            case 'lt':
+              return '<';
+            case 'quot':
+              return '\"';
+          }
+          throw new Error('_repair: ' + name + ' isn\'t defined.');
+        });
+        var chars = '';
+        for (var i = 0, ii = bytes.length; i < ii; i += 2) {
+          var code = bytes.charCodeAt(i) * 256 + bytes.charCodeAt(i + 1);
+          if (code >= 32 && code < 127 && code !== 60 && code !== 62 && code !== 38) {
+            chars += String.fromCharCode(code);
+          } else {
+            chars += '&#x' + (0x10000 + code).toString(16).substring(1) + ';';
+          }
+        }
+        return '>' + chars;
+      });
+    }
+  }, {
+    key: '_parse',
+    value: function _parse(xmlDocument) {
+      var rdf = xmlDocument.documentElement;
+      if (rdf.nodeName.toLowerCase() !== 'rdf:rdf') {
+        rdf = rdf.firstChild;
+        while (rdf && rdf.nodeName.toLowerCase() !== 'rdf:rdf') {
+          rdf = rdf.nextSibling;
+        }
+      }
+      var nodeName = rdf ? rdf.nodeName.toLowerCase() : null;
+      if (!rdf || nodeName !== 'rdf:rdf' || !rdf.hasChildNodes()) {
+        return;
+      }
+      var children = rdf.childNodes;
+      for (var i = 0, ii = children.length; i < ii; i++) {
+        var desc = children[i];
+        if (desc.nodeName.toLowerCase() !== 'rdf:description') {
+          continue;
+        }
+        for (var j = 0, jj = desc.childNodes.length; j < jj; j++) {
+          if (desc.childNodes[j].nodeName.toLowerCase() !== '#text') {
+            var entry = desc.childNodes[j];
+            var name = entry.nodeName.toLowerCase();
+            this._metadata[name] = entry.textContent.trim();
+          }
+        }
+      }
+    }
+  }, {
+    key: 'get',
+    value: function get(name) {
+      return this._metadata[name] || null;
+    }
+  }, {
+    key: 'getAll',
+    value: function getAll() {
+      return this._metadata;
+    }
+  }, {
+    key: 'has',
+    value: function has(name) {
+      return typeof this._metadata[name] !== 'undefined';
+    }
+  }]);
+
+  return Metadata;
+}();
+
+exports.Metadata = Metadata;
+
+/***/ }),
+/* 142 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
+
+var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var XMLParserErrorCode = {
+  NoError: 0,
+  EndOfDocument: -1,
+  UnterminatedCdat: -2,
+  UnterminatedXmlDeclaration: -3,
+  UnterminatedDoctypeDeclaration: -4,
+  UnterminatedComment: -5,
+  MalformedElement: -6,
+  OutOfMemory: -7,
+  UnterminatedAttributeValue: -8,
+  UnterminatedElement: -9,
+  ElementNeverBegun: -10
+};
+function isWhitespace(s, index) {
+  var ch = s[index];
+  return ch === ' ' || ch === '\n' || ch === '\r' || ch === '\t';
+}
+function isWhitespaceString(s) {
+  for (var i = 0, ii = s.length; i < ii; i++) {
+    if (!isWhitespace(s, i)) {
+      return false;
+    }
+  }
+  return true;
+}
+
+var XMLParserBase = function () {
+  function XMLParserBase() {
+    _classCallCheck(this, XMLParserBase);
+  }
+
+  _createClass(XMLParserBase, [{
+    key: '_resolveEntities',
+    value: function _resolveEntities(s) {
+      return s.replace(/&([^;]+);/g, function (all, entity) {
+        if (entity.substring(0, 2) === '#x') {
+          return String.fromCharCode(parseInt(entity.substring(2), 16));
+        } else if (entity.substring(0, 1) === '#') {
+          return String.fromCharCode(parseInt(entity.substring(1), 10));
+        }
+        switch (entity) {
+          case 'lt':
+            return '<';
+          case 'gt':
+            return '>';
+          case 'amp':
+            return '&';
+          case 'quot':
+            return '\"';
+        }
+        return this.onResolveEntity(entity);
+      });
+    }
+  }, {
+    key: '_parseContent',
+    value: function _parseContent(s, start) {
+      var pos = start,
+          name = void 0,
+          attributes = [];
+      function skipWs() {
+        while (pos < s.length && isWhitespace(s, pos)) {
+          ++pos;
+        }
+      }
+      while (pos < s.length && !isWhitespace(s, pos) && s[pos] !== '>' && s[pos] !== '/') {
+        ++pos;
+      }
+      name = s.substring(start, pos);
+      skipWs();
+      while (pos < s.length && s[pos] !== '>' && s[pos] !== '/' && s[pos] !== '?') {
+        skipWs();
+        var attrName = '',
+            attrValue = '';
+        while (pos < s.length && !isWhitespace(s, pos) && s[pos] !== '=') {
+          attrName += s[pos];
+          ++pos;
+        }
+        skipWs();
+        if (s[pos] !== '=') {
+          return null;
+        }
+        ++pos;
+        skipWs();
+        var attrEndChar = s[pos];
+        if (attrEndChar !== '\"' && attrEndChar !== '\'') {
+          return null;
+        }
+        var attrEndIndex = s.indexOf(attrEndChar, ++pos);
+        if (attrEndIndex < 0) {
+          return null;
+        }
+        attrValue = s.substring(pos, attrEndIndex);
+        attributes.push({
+          name: attrName,
+          value: this._resolveEntities(attrValue)
+        });
+        pos = attrEndIndex + 1;
+        skipWs();
+      }
+      return {
+        name: name,
+        attributes: attributes,
+        parsed: pos - start
+      };
+    }
+  }, {
+    key: '_parseProcessingInstruction',
+    value: function _parseProcessingInstruction(s, start) {
+      var pos = start,
+          name = void 0,
+          value = void 0;
+      function skipWs() {
+        while (pos < s.length && isWhitespace(s, pos)) {
+          ++pos;
+        }
+      }
+      while (pos < s.length && !isWhitespace(s, pos) && s[pos] !== '>' && s[pos] !== '/') {
+        ++pos;
+      }
+      name = s.substring(start, pos);
+      skipWs();
+      var attrStart = pos;
+      while (pos < s.length && (s[pos] !== '?' || s[pos + 1] !== '>')) {
+        ++pos;
+      }
+      value = s.substring(attrStart, pos);
+      return {
+        name: name,
+        value: value,
+        parsed: pos - start
+      };
+    }
+  }, {
+    key: 'parseXml',
+    value: function parseXml(s) {
+      var i = 0;
+      while (i < s.length) {
+        var ch = s[i];
+        var j = i;
+        if (ch === '<') {
+          ++j;
+          var ch2 = s[j];
+          var q = void 0;
+          switch (ch2) {
+            case '/':
+              ++j;
+              q = s.indexOf('>', j);
+              if (q < 0) {
+                this.onError(XMLParserErrorCode.UnterminatedElement);
+                return;
+              }
+              this.onEndElement(s.substring(j, q));
+              j = q + 1;
+              break;
+            case '?':
+              ++j;
+              var pi = this._parseProcessingInstruction(s, j);
+              if (s.substring(j + pi.parsed, j + pi.parsed + 2) !== '?>') {
+                this.onError(XMLParserErrorCode.UnterminatedXmlDeclaration);
+                return;
+              }
+              this.onPi(pi.name, pi.value);
+              j += pi.parsed + 2;
+              break;
+            case '!':
+              if (s.substring(j + 1, j + 3) === '--') {
+                q = s.indexOf('-->', j + 3);
+                if (q < 0) {
+                  this.onError(XMLParserErrorCode.UnterminatedComment);
+                  return;
+                }
+                this.onComment(s.substring(j + 3, q));
+                j = q + 3;
+              } else if (s.substring(j + 1, j + 8) === '[CDATA[') {
+                q = s.indexOf(']]>', j + 8);
+                if (q < 0) {
+                  this.onError(XMLParserErrorCode.UnterminatedCdat);
+                  return;
+                }
+                this.onCdata(s.substring(j + 8, q));
+                j = q + 3;
+              } else if (s.substring(j + 1, j + 8) === 'DOCTYPE') {
+                var q2 = s.indexOf('[', j + 8);
+                var complexDoctype = false;
+                q = s.indexOf('>', j + 8);
+                if (q < 0) {
+                  this.onError(XMLParserErrorCode.UnterminatedDoctypeDeclaration);
+                  return;
+                }
+                if (q2 > 0 && q > q2) {
+                  q = s.indexOf(']>', j + 8);
+                  if (q < 0) {
+                    this.onError(XMLParserErrorCode.UnterminatedDoctypeDeclaration);
+                    return;
+                  }
+                  complexDoctype = true;
+                }
+                var doctypeContent = s.substring(j + 8, q + (complexDoctype ? 1 : 0));
+                this.onDoctype(doctypeContent);
+                j = q + (complexDoctype ? 2 : 1);
+              } else {
+                this.onError(XMLParserErrorCode.MalformedElement);
+                return;
+              }
+              break;
+            default:
+              var content = this._parseContent(s, j);
+              if (content === null) {
+                this.onError(XMLParserErrorCode.MalformedElement);
+                return;
+              }
+              var isClosed = false;
+              if (s.substring(j + content.parsed, j + content.parsed + 2) === '/>') {
+                isClosed = true;
+              } else if (s.substring(j + content.parsed, j + content.parsed + 1) !== '>') {
+                this.onError(XMLParserErrorCode.UnterminatedElement);
+                return;
+              }
+              this.onBeginElement(content.name, content.attributes, isClosed);
+              j += content.parsed + (isClosed ? 2 : 1);
+              break;
+          }
+        } else {
+          while (j < s.length && s[j] !== '<') {
+            j++;
+          }
+          var text = s.substring(i, j);
+          this.onText(this._resolveEntities(text));
+        }
+        i = j;
+      }
+    }
+  }, {
+    key: 'onResolveEntity',
+    value: function onResolveEntity(name) {
+      return '&' + name + ';';
+    }
+  }, {
+    key: 'onPi',
+    value: function onPi(name, value) {}
+  }, {
+    key: 'onComment',
+    value: function onComment(text) {}
+  }, {
+    key: 'onCdata',
+    value: function onCdata(text) {}
+  }, {
+    key: 'onDoctype',
+    value: function onDoctype(doctypeContent) {}
+  }, {
+    key: 'onText',
+    value: function onText(text) {}
+  }, {
+    key: 'onBeginElement',
+    value: function onBeginElement(name, attributes, isEmpty) {}
+  }, {
+    key: 'onEndElement',
+    value: function onEndElement(name) {}
+  }, {
+    key: 'onError',
+    value: function onError(code) {}
+  }]);
+
+  return XMLParserBase;
+}();
+
+var SimpleDOMNode = function () {
+  function SimpleDOMNode(nodeName, nodeValue) {
+    _classCallCheck(this, SimpleDOMNode);
+
+    this.nodeName = nodeName;
+    this.nodeValue = nodeValue;
+    Object.defineProperty(this, 'parentNode', {
+      value: null,
+      writable: true
+    });
+  }
+
+  _createClass(SimpleDOMNode, [{
+    key: 'hasChildNodes',
+    value: function hasChildNodes() {
+      return this.childNodes && this.childNodes.length > 0;
+    }
+  }, {
+    key: 'firstChild',
+    get: function get() {
+      return this.childNodes[0];
+    }
+  }, {
+    key: 'nextSibling',
+    get: function get() {
+      var index = this.parentNode.childNodes.indexOf(this);
+      return this.parentNode.childNodes[index + 1];
+    }
+  }, {
+    key: 'textContent',
+    get: function get() {
+      if (!this.childNodes) {
+        return this.nodeValue || '';
+      }
+      return this.childNodes.map(function (child) {
+        return child.textContent;
+      }).join('');
+    }
+  }]);
+
+  return SimpleDOMNode;
+}();
+
+var SimpleXMLParser = function (_XMLParserBase) {
+  _inherits(SimpleXMLParser, _XMLParserBase);
+
+  function SimpleXMLParser() {
+    _classCallCheck(this, SimpleXMLParser);
+
+    var _this = _possibleConstructorReturn(this, (SimpleXMLParser.__proto__ || Object.getPrototypeOf(SimpleXMLParser)).call(this));
+
+    _this._currentFragment = null;
+    _this._stack = null;
+    _this._errorCode = XMLParserErrorCode.NoError;
+    return _this;
+  }
+
+  _createClass(SimpleXMLParser, [{
+    key: 'parseFromString',
+    value: function parseFromString(data) {
+      this._currentFragment = [];
+      this._stack = [];
+      this._errorCode = XMLParserErrorCode.NoError;
+      this.parseXml(data);
+      if (this._errorCode !== XMLParserErrorCode.NoError) {
+        return undefined;
+      }
+
+      var _currentFragment = _slicedToArray(this._currentFragment, 1),
+          documentElement = _currentFragment[0];
+
+      if (!documentElement) {
+        return undefined;
+      }
+      return { documentElement: documentElement };
+    }
+  }, {
+    key: 'onResolveEntity',
+    value: function onResolveEntity(name) {
+      switch (name) {
+        case 'apos':
+          return '\'';
+      }
+      return _get(SimpleXMLParser.prototype.__proto__ || Object.getPrototypeOf(SimpleXMLParser.prototype), 'onResolveEntity', this).call(this, name);
+    }
+  }, {
+    key: 'onText',
+    value: function onText(text) {
+      if (isWhitespaceString(text)) {
+        return;
+      }
+      var node = new SimpleDOMNode('#text', text);
+      this._currentFragment.push(node);
+    }
+  }, {
+    key: 'onCdata',
+    value: function onCdata(text) {
+      var node = new SimpleDOMNode('#text', text);
+      this._currentFragment.push(node);
+    }
+  }, {
+    key: 'onBeginElement',
+    value: function onBeginElement(name, attributes, isEmpty) {
+      var node = new SimpleDOMNode(name);
+      node.childNodes = [];
+      this._currentFragment.push(node);
+      if (isEmpty) {
+        return;
+      }
+      this._stack.push(this._currentFragment);
+      this._currentFragment = node.childNodes;
+    }
+  }, {
+    key: 'onEndElement',
+    value: function onEndElement(name) {
+      this._currentFragment = this._stack.pop();
+      var lastElement = this._currentFragment[this._currentFragment.length - 1];
+      for (var i = 0, ii = lastElement.childNodes.length; i < ii; i++) {
+        lastElement.childNodes[i].parentNode = lastElement;
+      }
+    }
+  }, {
+    key: 'onError',
+    value: function onError(code) {
+      this._errorCode = code;
+    }
+  }]);
+
+  return SimpleXMLParser;
+}(XMLParserBase);
+
+exports.SimpleXMLParser = SimpleXMLParser;
+
+/***/ }),
+/* 143 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.PDFDataTransportStream = undefined;
+
+var _regenerator = __w_pdfjs_require__(137);
+
+var _regenerator2 = _interopRequireDefault(_regenerator);
+
+var _util = __w_pdfjs_require__(1);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
+
+var PDFDataTransportStream = function PDFDataTransportStreamClosure() {
+  function PDFDataTransportStream(params, pdfDataRangeTransport) {
+    var _this = this;
+
+    (0, _util.assert)(pdfDataRangeTransport);
+    this._queuedChunks = [];
+    var initialData = params.initialData;
+    if (initialData && initialData.length > 0) {
+      var buffer = new Uint8Array(initialData).buffer;
+      this._queuedChunks.push(buffer);
+    }
+    this._pdfDataRangeTransport = pdfDataRangeTransport;
+    this._isStreamingSupported = !params.disableStream;
+    this._isRangeSupported = !params.disableRange;
+    this._contentLength = params.length;
+    this._fullRequestReader = null;
+    this._rangeReaders = [];
+    this._pdfDataRangeTransport.addRangeListener(function (begin, chunk) {
+      _this._onReceiveData({
+        begin: begin,
+        chunk: chunk
+      });
+    });
+    this._pdfDataRangeTransport.addProgressListener(function (loaded) {
+      _this._onProgress({ loaded: loaded });
+    });
+    this._pdfDataRangeTransport.addProgressiveReadListener(function (chunk) {
+      _this._onReceiveData({ chunk: chunk });
+    });
+    this._pdfDataRangeTransport.transportReady();
+  }
+  PDFDataTransportStream.prototype = {
+    _onReceiveData: function PDFDataTransportStream_onReceiveData(args) {
+      var buffer = new Uint8Array(args.chunk).buffer;
+      if (args.begin === undefined) {
+        if (this._fullRequestReader) {
+          this._fullRequestReader._enqueue(buffer);
+        } else {
+          this._queuedChunks.push(buffer);
+        }
+      } else {
+        var found = this._rangeReaders.some(function (rangeReader) {
+          if (rangeReader._begin !== args.begin) {
+            return false;
+          }
+          rangeReader._enqueue(buffer);
+          return true;
+        });
+        (0, _util.assert)(found);
+      }
+    },
+    _onProgress: function PDFDataTransportStream_onDataProgress(evt) {
+      if (this._rangeReaders.length > 0) {
+        var firstReader = this._rangeReaders[0];
+        if (firstReader.onProgress) {
+          firstReader.onProgress({ loaded: evt.loaded });
+        }
+      }
+    },
+    _removeRangeReader: function PDFDataTransportStream_removeRangeReader(reader) {
+      var i = this._rangeReaders.indexOf(reader);
+      if (i >= 0) {
+        this._rangeReaders.splice(i, 1);
+      }
+    },
+    getFullReader: function PDFDataTransportStream_getFullReader() {
+      (0, _util.assert)(!this._fullRequestReader);
+      var queuedChunks = this._queuedChunks;
+      this._queuedChunks = null;
+      return new PDFDataTransportStreamReader(this, queuedChunks);
+    },
+    getRangeReader: function PDFDataTransportStream_getRangeReader(begin, end) {
+      var reader = new PDFDataTransportStreamRangeReader(this, begin, end);
+      this._pdfDataRangeTransport.requestDataRange(begin, end);
+      this._rangeReaders.push(reader);
+      return reader;
+    },
+    cancelAllRequests: function PDFDataTransportStream_cancelAllRequests(reason) {
+      if (this._fullRequestReader) {
+        this._fullRequestReader.cancel(reason);
+      }
+      var readers = this._rangeReaders.slice(0);
+      readers.forEach(function (rangeReader) {
+        rangeReader.cancel(reason);
+      });
+      this._pdfDataRangeTransport.abort();
+    }
+  };
+  function PDFDataTransportStreamReader(stream, queuedChunks) {
+    this._stream = stream;
+    this._done = false;
+    this._filename = null;
+    this._queuedChunks = queuedChunks || [];
+    this._requests = [];
+    this._headersReady = Promise.resolve();
+    stream._fullRequestReader = this;
+    this.onProgress = null;
+  }
+  PDFDataTransportStreamReader.prototype = {
+    _enqueue: function PDFDataTransportStreamReader_enqueue(chunk) {
+      if (this._done) {
+        return;
+      }
+      if (this._requests.length > 0) {
+        var requestCapability = this._requests.shift();
+        requestCapability.resolve({
+          value: chunk,
+          done: false
+        });
+        return;
+      }
+      this._queuedChunks.push(chunk);
+    },
+    get headersReady() {
+      return this._headersReady;
+    },
+    get filename() {
+      return this._filename;
+    },
+    get isRangeSupported() {
+      return this._stream._isRangeSupported;
+    },
+    get isStreamingSupported() {
+      return this._stream._isStreamingSupported;
+    },
+    get contentLength() {
+      return this._stream._contentLength;
+    },
+    read: function () {
+      var _ref = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee() {
+        var chunk, requestCapability;
+        return _regenerator2.default.wrap(function _callee$(_context) {
+          while (1) {
+            switch (_context.prev = _context.next) {
+              case 0:
+                if (!(this._queuedChunks.length > 0)) {
+                  _context.next = 3;
+                  break;
+                }
+
+                chunk = this._queuedChunks.shift();
+                return _context.abrupt('return', {
+                  value: chunk,
+                  done: false
+                });
+
+              case 3:
+                if (!this._done) {
+                  _context.next = 5;
+                  break;
+                }
+
+                return _context.abrupt('return', {
+                  value: undefined,
+                  done: true
+                });
+
+              case 5:
+                requestCapability = (0, _util.createPromiseCapability)();
+
+                this._requests.push(requestCapability);
+                return _context.abrupt('return', requestCapability.promise);
+
+              case 8:
+              case 'end':
+                return _context.stop();
+            }
+          }
+        }, _callee, this);
+      }));
+
+      function read() {
+        return _ref.apply(this, arguments);
+      }
+
+      return read;
+    }(),
+
+    cancel: function PDFDataTransportStreamReader_cancel(reason) {
+      this._done = true;
+      this._requests.forEach(function (requestCapability) {
+        requestCapability.resolve({
+          value: undefined,
+          done: true
+        });
+      });
+      this._requests = [];
+    }
+  };
+  function PDFDataTransportStreamRangeReader(stream, begin, end) {
+    this._stream = stream;
+    this._begin = begin;
+    this._end = end;
+    this._queuedChunk = null;
+    this._requests = [];
+    this._done = false;
+    this.onProgress = null;
+  }
+  PDFDataTransportStreamRangeReader.prototype = {
+    _enqueue: function PDFDataTransportStreamRangeReader_enqueue(chunk) {
+      if (this._done) {
+        return;
+      }
+      if (this._requests.length === 0) {
+        this._queuedChunk = chunk;
+      } else {
+        var requestsCapability = this._requests.shift();
+        requestsCapability.resolve({
+          value: chunk,
+          done: false
+        });
+        this._requests.forEach(function (requestCapability) {
+          requestCapability.resolve({
+            value: undefined,
+            done: true
+          });
+        });
+        this._requests = [];
+      }
+      this._done = true;
+      this._stream._removeRangeReader(this);
+    },
+    get isStreamingSupported() {
+      return false;
+    },
+    read: function () {
+      var _ref2 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee2() {
+        var chunk, requestCapability;
+        return _regenerator2.default.wrap(function _callee2$(_context2) {
+          while (1) {
+            switch (_context2.prev = _context2.next) {
+              case 0:
+                if (!this._queuedChunk) {
+                  _context2.next = 4;
+                  break;
+                }
+
+                chunk = this._queuedChunk;
+
+                this._queuedChunk = null;
+                return _context2.abrupt('return', {
+                  value: chunk,
+                  done: false
+                });
+
+              case 4:
+                if (!this._done) {
+                  _context2.next = 6;
+                  break;
+                }
+
+                return _context2.abrupt('return', {
+                  value: undefined,
+                  done: true
+                });
+
+              case 6:
+                requestCapability = (0, _util.createPromiseCapability)();
+
+                this._requests.push(requestCapability);
+                return _context2.abrupt('return', requestCapability.promise);
+
+              case 9:
+              case 'end':
+                return _context2.stop();
+            }
+          }
+        }, _callee2, this);
+      }));
+
+      function read() {
+        return _ref2.apply(this, arguments);
+      }
+
+      return read;
+    }(),
+
+    cancel: function PDFDataTransportStreamRangeReader_cancel(reason) {
+      this._done = true;
+      this._requests.forEach(function (requestCapability) {
+        requestCapability.resolve({
+          value: undefined,
+          done: true
+        });
+      });
+      this._requests = [];
+      this._stream._removeRangeReader(this);
+    }
+  };
+  return PDFDataTransportStream;
+}();
+exports.PDFDataTransportStream = PDFDataTransportStream;
+
+/***/ }),
+/* 144 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.WebGLContext = undefined;
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _util = __w_pdfjs_require__(1);
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var WebGLContext = function () {
+  function WebGLContext(_ref) {
+    var _ref$enable = _ref.enable,
+        enable = _ref$enable === undefined ? false : _ref$enable;
+
+    _classCallCheck(this, WebGLContext);
+
+    this._enabled = enable === true;
+  }
+
+  _createClass(WebGLContext, [{
+    key: 'composeSMask',
+    value: function composeSMask(_ref2) {
+      var layer = _ref2.layer,
+          mask = _ref2.mask,
+          properties = _ref2.properties;
+
+      return WebGLUtils.composeSMask(layer, mask, properties);
+    }
+  }, {
+    key: 'drawFigures',
+    value: function drawFigures(_ref3) {
+      var width = _ref3.width,
+          height = _ref3.height,
+          backgroundColor = _ref3.backgroundColor,
+          figures = _ref3.figures,
+          context = _ref3.context;
+
+      return WebGLUtils.drawFigures(width, height, backgroundColor, figures, context);
+    }
+  }, {
+    key: 'clear',
+    value: function clear() {
+      WebGLUtils.cleanup();
+    }
+  }, {
+    key: 'isEnabled',
+    get: function get() {
+      var enabled = this._enabled;
+      if (enabled) {
+        enabled = WebGLUtils.tryInitGL();
+      }
+      return (0, _util.shadow)(this, 'isEnabled', enabled);
+    }
+  }]);
+
+  return WebGLContext;
+}();
+
+var WebGLUtils = function WebGLUtilsClosure() {
+  function loadShader(gl, code, shaderType) {
+    var shader = gl.createShader(shaderType);
+    gl.shaderSource(shader, code);
+    gl.compileShader(shader);
+    var compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS);
+    if (!compiled) {
+      var errorMsg = gl.getShaderInfoLog(shader);
+      throw new Error('Error during shader compilation: ' + errorMsg);
+    }
+    return shader;
+  }
+  function createVertexShader(gl, code) {
+    return loadShader(gl, code, gl.VERTEX_SHADER);
+  }
+  function createFragmentShader(gl, code) {
+    return loadShader(gl, code, gl.FRAGMENT_SHADER);
+  }
+  function createProgram(gl, shaders) {
+    var program = gl.createProgram();
+    for (var i = 0, ii = shaders.length; i < ii; ++i) {
+      gl.attachShader(program, shaders[i]);
+    }
+    gl.linkProgram(program);
+    var linked = gl.getProgramParameter(program, gl.LINK_STATUS);
+    if (!linked) {
+      var errorMsg = gl.getProgramInfoLog(program);
+      throw new Error('Error during program linking: ' + errorMsg);
+    }
+    return program;
+  }
+  function createTexture(gl, image, textureId) {
+    gl.activeTexture(textureId);
+    var texture = gl.createTexture();
+    gl.bindTexture(gl.TEXTURE_2D, texture);
+    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
+    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
+    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
+    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
+    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);
+    return texture;
+  }
+  var currentGL, currentCanvas;
+  function generateGL() {
+    if (currentGL) {
+      return;
+    }
+    currentCanvas = document.createElement('canvas');
+    currentGL = currentCanvas.getContext('webgl', { premultipliedalpha: false });
+  }
+  var smaskVertexShaderCode = '\
+  attribute vec2 a_position;                                    \
+  attribute vec2 a_texCoord;                                    \
+                                                                \
+  uniform vec2 u_resolution;                                    \
+                                                                \
+  varying vec2 v_texCoord;                                      \
+                                                                \
+  void main() {                                                 \
+    vec2 clipSpace = (a_position / u_resolution) * 2.0 - 1.0;   \
+    gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);          \
+                                                                \
+    v_texCoord = a_texCoord;                                    \
+  }                                                             ';
+  var smaskFragmentShaderCode = '\
+  precision mediump float;                                      \
+                                                                \
+  uniform vec4 u_backdrop;                                      \
+  uniform int u_subtype;                                        \
+  uniform sampler2D u_image;                                    \
+  uniform sampler2D u_mask;                                     \
+                                                                \
+  varying vec2 v_texCoord;                                      \
+                                                                \
+  void main() {                                                 \
+    vec4 imageColor = texture2D(u_image, v_texCoord);           \
+    vec4 maskColor = texture2D(u_mask, v_texCoord);             \
+    if (u_backdrop.a > 0.0) {                                   \
+      maskColor.rgb = maskColor.rgb * maskColor.a +             \
+                      u_backdrop.rgb * (1.0 - maskColor.a);     \
+    }                                                           \
+    float lum;                                                  \
+    if (u_subtype == 0) {                                       \
+      lum = maskColor.a;                                        \
+    } else {                                                    \
+      lum = maskColor.r * 0.3 + maskColor.g * 0.59 +            \
+            maskColor.b * 0.11;                                 \
+    }                                                           \
+    imageColor.a *= lum;                                        \
+    imageColor.rgb *= imageColor.a;                             \
+    gl_FragColor = imageColor;                                  \
+  }                                                             ';
+  var smaskCache = null;
+  function initSmaskGL() {
+    var canvas, gl;
+    generateGL();
+    canvas = currentCanvas;
+    currentCanvas = null;
+    gl = currentGL;
+    currentGL = null;
+    var vertexShader = createVertexShader(gl, smaskVertexShaderCode);
+    var fragmentShader = createFragmentShader(gl, smaskFragmentShaderCode);
+    var program = createProgram(gl, [vertexShader, fragmentShader]);
+    gl.useProgram(program);
+    var cache = {};
+    cache.gl = gl;
+    cache.canvas = canvas;
+    cache.resolutionLocation = gl.getUniformLocation(program, 'u_resolution');
+    cache.positionLocation = gl.getAttribLocation(program, 'a_position');
+    cache.backdropLocation = gl.getUniformLocation(program, 'u_backdrop');
+    cache.subtypeLocation = gl.getUniformLocation(program, 'u_subtype');
+    var texCoordLocation = gl.getAttribLocation(program, 'a_texCoord');
+    var texLayerLocation = gl.getUniformLocation(program, 'u_image');
+    var texMaskLocation = gl.getUniformLocation(program, 'u_mask');
+    var texCoordBuffer = gl.createBuffer();
+    gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);
+    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0]), gl.STATIC_DRAW);
+    gl.enableVertexAttribArray(texCoordLocation);
+    gl.vertexAttribPointer(texCoordLocation, 2, gl.FLOAT, false, 0, 0);
+    gl.uniform1i(texLayerLocation, 0);
+    gl.uniform1i(texMaskLocation, 1);
+    smaskCache = cache;
+  }
+  function composeSMask(layer, mask, properties) {
+    var width = layer.width,
+        height = layer.height;
+    if (!smaskCache) {
+      initSmaskGL();
+    }
+    var cache = smaskCache,
+        canvas = cache.canvas,
+        gl = cache.gl;
+    canvas.width = width;
+    canvas.height = height;
+    gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);
+    gl.uniform2f(cache.resolutionLocation, width, height);
+    if (properties.backdrop) {
+      gl.uniform4f(cache.resolutionLocation, properties.backdrop[0], properties.backdrop[1], properties.backdrop[2], 1);
+    } else {
+      gl.uniform4f(cache.resolutionLocation, 0, 0, 0, 0);
+    }
+    gl.uniform1i(cache.subtypeLocation, properties.subtype === 'Luminosity' ? 1 : 0);
+    var texture = createTexture(gl, layer, gl.TEXTURE0);
+    var maskTexture = createTexture(gl, mask, gl.TEXTURE1);
+    var buffer = gl.createBuffer();
+    gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
+    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([0, 0, width, 0, 0, height, 0, height, width, 0, width, height]), gl.STATIC_DRAW);
+    gl.enableVertexAttribArray(cache.positionLocation);
+    gl.vertexAttribPointer(cache.positionLocation, 2, gl.FLOAT, false, 0, 0);
+    gl.clearColor(0, 0, 0, 0);
+    gl.enable(gl.BLEND);
+    gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);
+    gl.clear(gl.COLOR_BUFFER_BIT);
+    gl.drawArrays(gl.TRIANGLES, 0, 6);
+    gl.flush();
+    gl.deleteTexture(texture);
+    gl.deleteTexture(maskTexture);
+    gl.deleteBuffer(buffer);
+    return canvas;
+  }
+  var figuresVertexShaderCode = '\
+  attribute vec2 a_position;                                    \
+  attribute vec3 a_color;                                       \
+                                                                \
+  uniform vec2 u_resolution;                                    \
+  uniform vec2 u_scale;                                         \
+  uniform vec2 u_offset;                                        \
+                                                                \
+  varying vec4 v_color;                                         \
+                                                                \
+  void main() {                                                 \
+    vec2 position = (a_position + u_offset) * u_scale;          \
+    vec2 clipSpace = (position / u_resolution) * 2.0 - 1.0;     \
+    gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);          \
+                                                                \
+    v_color = vec4(a_color / 255.0, 1.0);                       \
+  }                                                             ';
+  var figuresFragmentShaderCode = '\
+  precision mediump float;                                      \
+                                                                \
+  varying vec4 v_color;                                         \
+                                                                \
+  void main() {                                                 \
+    gl_FragColor = v_color;                                     \
+  }                                                             ';
+  var figuresCache = null;
+  function initFiguresGL() {
+    var canvas, gl;
+    generateGL();
+    canvas = currentCanvas;
+    currentCanvas = null;
+    gl = currentGL;
+    currentGL = null;
+    var vertexShader = createVertexShader(gl, figuresVertexShaderCode);
+    var fragmentShader = createFragmentShader(gl, figuresFragmentShaderCode);
+    var program = createProgram(gl, [vertexShader, fragmentShader]);
+    gl.useProgram(program);
+    var cache = {};
+    cache.gl = gl;
+    cache.canvas = canvas;
+    cache.resolutionLocation = gl.getUniformLocation(program, 'u_resolution');
+    cache.scaleLocation = gl.getUniformLocation(program, 'u_scale');
+    cache.offsetLocation = gl.getUniformLocation(program, 'u_offset');
+    cache.positionLocation = gl.getAttribLocation(program, 'a_position');
+    cache.colorLocation = gl.getAttribLocation(program, 'a_color');
+    figuresCache = cache;
+  }
+  function drawFigures(width, height, backgroundColor, figures, context) {
+    if (!figuresCache) {
+      initFiguresGL();
+    }
+    var cache = figuresCache,
+        canvas = cache.canvas,
+        gl = cache.gl;
+    canvas.width = width;
+    canvas.height = height;
+    gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);
+    gl.uniform2f(cache.resolutionLocation, width, height);
+    var count = 0;
+    var i, ii, rows;
+    for (i = 0, ii = figures.length; i < ii; i++) {
+      switch (figures[i].type) {
+        case 'lattice':
+          rows = figures[i].coords.length / figures[i].verticesPerRow | 0;
+          count += (rows - 1) * (figures[i].verticesPerRow - 1) * 6;
+          break;
+        case 'triangles':
+          count += figures[i].coords.length;
+          break;
+      }
+    }
+    var coords = new Float32Array(count * 2);
+    var colors = new Uint8Array(count * 3);
+    var coordsMap = context.coords,
+        colorsMap = context.colors;
+    var pIndex = 0,
+        cIndex = 0;
+    for (i = 0, ii = figures.length; i < ii; i++) {
+      var figure = figures[i],
+          ps = figure.coords,
+          cs = figure.colors;
+      switch (figure.type) {
+        case 'lattice':
+          var cols = figure.verticesPerRow;
+          rows = ps.length / cols | 0;
+          for (var row = 1; row < rows; row++) {
+            var offset = row * cols + 1;
+            for (var col = 1; col < cols; col++, offset++) {
+              coords[pIndex] = coordsMap[ps[offset - cols - 1]];
+              coords[pIndex + 1] = coordsMap[ps[offset - cols - 1] + 1];
+              coords[pIndex + 2] = coordsMap[ps[offset - cols]];
+              coords[pIndex + 3] = coordsMap[ps[offset - cols] + 1];
+              coords[pIndex + 4] = coordsMap[ps[offset - 1]];
+              coords[pIndex + 5] = coordsMap[ps[offset - 1] + 1];
+              colors[cIndex] = colorsMap[cs[offset - cols - 1]];
+              colors[cIndex + 1] = colorsMap[cs[offset - cols - 1] + 1];
+              colors[cIndex + 2] = colorsMap[cs[offset - cols - 1] + 2];
+              colors[cIndex + 3] = colorsMap[cs[offset - cols]];
+              colors[cIndex + 4] = colorsMap[cs[offset - cols] + 1];
+              colors[cIndex + 5] = colorsMap[cs[offset - cols] + 2];
+              colors[cIndex + 6] = colorsMap[cs[offset - 1]];
+              colors[cIndex + 7] = colorsMap[cs[offset - 1] + 1];
+              colors[cIndex + 8] = colorsMap[cs[offset - 1] + 2];
+              coords[pIndex + 6] = coords[pIndex + 2];
+              coords[pIndex + 7] = coords[pIndex + 3];
+              coords[pIndex + 8] = coords[pIndex + 4];
+              coords[pIndex + 9] = coords[pIndex + 5];
+              coords[pIndex + 10] = coordsMap[ps[offset]];
+              coords[pIndex + 11] = coordsMap[ps[offset] + 1];
+              colors[cIndex + 9] = colors[cIndex + 3];
+              colors[cIndex + 10] = colors[cIndex + 4];
+              colors[cIndex + 11] = colors[cIndex + 5];
+              colors[cIndex + 12] = colors[cIndex + 6];
+              colors[cIndex + 13] = colors[cIndex + 7];
+              colors[cIndex + 14] = colors[cIndex + 8];
+              colors[cIndex + 15] = colorsMap[cs[offset]];
+              colors[cIndex + 16] = colorsMap[cs[offset] + 1];
+              colors[cIndex + 17] = colorsMap[cs[offset] + 2];
+              pIndex += 12;
+              cIndex += 18;
+            }
+          }
+          break;
+        case 'triangles':
+          for (var j = 0, jj = ps.length; j < jj; j++) {
+            coords[pIndex] = coordsMap[ps[j]];
+            coords[pIndex + 1] = coordsMap[ps[j] + 1];
+            colors[cIndex] = colorsMap[cs[j]];
+            colors[cIndex + 1] = colorsMap[cs[j] + 1];
+            colors[cIndex + 2] = colorsMap[cs[j] + 2];
+            pIndex += 2;
+            cIndex += 3;
+          }
+          break;
+      }
+    }
+    if (backgroundColor) {
+      gl.clearColor(backgroundColor[0] / 255, backgroundColor[1] / 255, backgroundColor[2] / 255, 1.0);
+    } else {
+      gl.clearColor(0, 0, 0, 0);
+    }
+    gl.clear(gl.COLOR_BUFFER_BIT);
+    var coordsBuffer = gl.createBuffer();
+    gl.bindBuffer(gl.ARRAY_BUFFER, coordsBuffer);
+    gl.bufferData(gl.ARRAY_BUFFER, coords, gl.STATIC_DRAW);
+    gl.enableVertexAttribArray(cache.positionLocation);
+    gl.vertexAttribPointer(cache.positionLocation, 2, gl.FLOAT, false, 0, 0);
+    var colorsBuffer = gl.createBuffer();
+    gl.bindBuffer(gl.ARRAY_BUFFER, colorsBuffer);
+    gl.bufferData(gl.ARRAY_BUFFER, colors, gl.STATIC_DRAW);
+    gl.enableVertexAttribArray(cache.colorLocation);
+    gl.vertexAttribPointer(cache.colorLocation, 3, gl.UNSIGNED_BYTE, false, 0, 0);
+    gl.uniform2f(cache.scaleLocation, context.scaleX, context.scaleY);
+    gl.uniform2f(cache.offsetLocation, context.offsetX, context.offsetY);
+    gl.drawArrays(gl.TRIANGLES, 0, count);
+    gl.flush();
+    gl.deleteBuffer(coordsBuffer);
+    gl.deleteBuffer(colorsBuffer);
+    return canvas;
+  }
+  return {
+    tryInitGL: function tryInitGL() {
+      try {
+        generateGL();
+        return !!currentGL;
+      } catch (ex) {}
+      return false;
+    },
+
+    composeSMask: composeSMask,
+    drawFigures: drawFigures,
+    cleanup: function cleanup() {
+      if (smaskCache && smaskCache.canvas) {
+        smaskCache.canvas.width = 0;
+        smaskCache.canvas.height = 0;
+      }
+      if (figuresCache && figuresCache.canvas) {
+        figuresCache.canvas.width = 0;
+        figuresCache.canvas.height = 0;
+      }
+      smaskCache = null;
+      figuresCache = null;
+    }
+  };
+}();
+exports.WebGLContext = WebGLContext;
+
+/***/ }),
+/* 145 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.renderTextLayer = undefined;
+
+var _util = __w_pdfjs_require__(1);
+
+var _global_scope = __w_pdfjs_require__(3);
+
+var _global_scope2 = _interopRequireDefault(_global_scope);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var renderTextLayer = function renderTextLayerClosure() {
+  var MAX_TEXT_DIVS_TO_RENDER = 100000;
+  var NonWhitespaceRegexp = /\S/;
+  function isAllWhitespace(str) {
+    return !NonWhitespaceRegexp.test(str);
+  }
+  var styleBuf = ['left: ', 0, 'px; top: ', 0, 'px; font-size: ', 0, 'px; font-family: ', '', ';'];
+  function appendText(task, geom, styles) {
+    var textDiv = document.createElement('div');
+    var textDivProperties = {
+      style: null,
+      angle: 0,
+      canvasWidth: 0,
+      isWhitespace: false,
+      originalTransform: null,
+      paddingBottom: 0,
+      paddingLeft: 0,
+      paddingRight: 0,
+      paddingTop: 0,
+      scale: 1
+    };
+    task._textDivs.push(textDiv);
+    if (isAllWhitespace(geom.str)) {
+      textDivProperties.isWhitespace = true;
+      task._textDivProperties.set(textDiv, textDivProperties);
+      return;
+    }
+    var tx = _util.Util.transform(task._viewport.transform, geom.transform);
+    var angle = Math.atan2(tx[1], tx[0]);
+    var style = styles[geom.fontName];
+    if (style.vertical) {
+      angle += Math.PI / 2;
+    }
+    var fontHeight = Math.sqrt(tx[2] * tx[2] + tx[3] * tx[3]);
+    var fontAscent = fontHeight;
+    if (style.ascent) {
+      fontAscent = style.ascent * fontAscent;
+    } else if (style.descent) {
+      fontAscent = (1 + style.descent) * fontAscent;
+    }
+    var left;
+    var top;
+    if (angle === 0) {
+      left = tx[4];
+      top = tx[5] - fontAscent;
+    } else {
+      left = tx[4] + fontAscent * Math.sin(angle);
+      top = tx[5] - fontAscent * Math.cos(angle);
+    }
+    styleBuf[1] = left;
+    styleBuf[3] = top;
+    styleBuf[5] = fontHeight;
+    styleBuf[7] = style.fontFamily;
+    textDivProperties.style = styleBuf.join('');
+    textDiv.setAttribute('style', textDivProperties.style);
+    textDiv.textContent = geom.str;
+    if (task._fontInspectorEnabled) {
+      textDiv.dataset.fontName = geom.fontName;
+    }
+    if (angle !== 0) {
+      textDivProperties.angle = angle * (180 / Math.PI);
+    }
+    if (geom.str.length > 1) {
+      if (style.vertical) {
+        textDivProperties.canvasWidth = geom.height * task._viewport.scale;
+      } else {
+        textDivProperties.canvasWidth = geom.width * task._viewport.scale;
+      }
+    }
+    task._textDivProperties.set(textDiv, textDivProperties);
+    if (task._textContentStream) {
+      task._layoutText(textDiv);
+    }
+    if (task._enhanceTextSelection) {
+      var angleCos = 1,
+          angleSin = 0;
+      if (angle !== 0) {
+        angleCos = Math.cos(angle);
+        angleSin = Math.sin(angle);
+      }
+      var divWidth = (style.vertical ? geom.height : geom.width) * task._viewport.scale;
+      var divHeight = fontHeight;
+      var m, b;
+      if (angle !== 0) {
+        m = [angleCos, angleSin, -angleSin, angleCos, left, top];
+        b = _util.Util.getAxialAlignedBoundingBox([0, 0, divWidth, divHeight], m);
+      } else {
+        b = [left, top, left + divWidth, top + divHeight];
+      }
+      task._bounds.push({
+        left: b[0],
+        top: b[1],
+        right: b[2],
+        bottom: b[3],
+        div: textDiv,
+        size: [divWidth, divHeight],
+        m: m
+      });
+    }
+  }
+  function render(task) {
+    if (task._canceled) {
+      return;
+    }
+    var textDivs = task._textDivs;
+    var capability = task._capability;
+    var textDivsLength = textDivs.length;
+    if (textDivsLength > MAX_TEXT_DIVS_TO_RENDER) {
+      task._renderingDone = true;
+      capability.resolve();
+      return;
+    }
+    if (!task._textContentStream) {
+      for (var i = 0; i < textDivsLength; i++) {
+        task._layoutText(textDivs[i]);
+      }
+    }
+    task._renderingDone = true;
+    capability.resolve();
+  }
+  function expand(task) {
+    var bounds = task._bounds;
+    var viewport = task._viewport;
+    var expanded = expandBounds(viewport.width, viewport.height, bounds);
+    for (var i = 0; i < expanded.length; i++) {
+      var div = bounds[i].div;
+      var divProperties = task._textDivProperties.get(div);
+      if (divProperties.angle === 0) {
+        divProperties.paddingLeft = bounds[i].left - expanded[i].left;
+        divProperties.paddingTop = bounds[i].top - expanded[i].top;
+        divProperties.paddingRight = expanded[i].right - bounds[i].right;
+        divProperties.paddingBottom = expanded[i].bottom - bounds[i].bottom;
+        task._textDivProperties.set(div, divProperties);
+        continue;
+      }
+      var e = expanded[i],
+          b = bounds[i];
+      var m = b.m,
+          c = m[0],
+          s = m[1];
+      var points = [[0, 0], [0, b.size[1]], [b.size[0], 0], b.size];
+      var ts = new Float64Array(64);
+      points.forEach(function (p, i) {
+        var t = _util.Util.applyTransform(p, m);
+        ts[i + 0] = c && (e.left - t[0]) / c;
+        ts[i + 4] = s && (e.top - t[1]) / s;
+        ts[i + 8] = c && (e.right - t[0]) / c;
+        ts[i + 12] = s && (e.bottom - t[1]) / s;
+        ts[i + 16] = s && (e.left - t[0]) / -s;
+        ts[i + 20] = c && (e.top - t[1]) / c;
+        ts[i + 24] = s && (e.right - t[0]) / -s;
+        ts[i + 28] = c && (e.bottom - t[1]) / c;
+        ts[i + 32] = c && (e.left - t[0]) / -c;
+        ts[i + 36] = s && (e.top - t[1]) / -s;
+        ts[i + 40] = c && (e.right - t[0]) / -c;
+        ts[i + 44] = s && (e.bottom - t[1]) / -s;
+        ts[i + 48] = s && (e.left - t[0]) / s;
+        ts[i + 52] = c && (e.top - t[1]) / -c;
+        ts[i + 56] = s && (e.right - t[0]) / s;
+        ts[i + 60] = c && (e.bottom - t[1]) / -c;
+      });
+      var findPositiveMin = function findPositiveMin(ts, offset, count) {
+        var result = 0;
+        for (var i = 0; i < count; i++) {
+          var t = ts[offset++];
+          if (t > 0) {
+            result = result ? Math.min(t, result) : t;
+          }
+        }
+        return result;
+      };
+      var boxScale = 1 + Math.min(Math.abs(c), Math.abs(s));
+      divProperties.paddingLeft = findPositiveMin(ts, 32, 16) / boxScale;
+      divProperties.paddingTop = findPositiveMin(ts, 48, 16) / boxScale;
+      divProperties.paddingRight = findPositiveMin(ts, 0, 16) / boxScale;
+      divProperties.paddingBottom = findPositiveMin(ts, 16, 16) / boxScale;
+      task._textDivProperties.set(div, divProperties);
+    }
+  }
+  function expandBounds(width, height, boxes) {
+    var bounds = boxes.map(function (box, i) {
+      return {
+        x1: box.left,
+        y1: box.top,
+        x2: box.right,
+        y2: box.bottom,
+        index: i,
+        x1New: undefined,
+        x2New: undefined
+      };
+    });
+    expandBoundsLTR(width, bounds);
+    var expanded = new Array(boxes.length);
+    bounds.forEach(function (b) {
+      var i = b.index;
+      expanded[i] = {
+        left: b.x1New,
+        top: 0,
+        right: b.x2New,
+        bottom: 0
+      };
+    });
+    boxes.map(function (box, i) {
+      var e = expanded[i],
+          b = bounds[i];
+      b.x1 = box.top;
+      b.y1 = width - e.right;
+      b.x2 = box.bottom;
+      b.y2 = width - e.left;
+      b.index = i;
+      b.x1New = undefined;
+      b.x2New = undefined;
+    });
+    expandBoundsLTR(height, bounds);
+    bounds.forEach(function (b) {
+      var i = b.index;
+      expanded[i].top = b.x1New;
+      expanded[i].bottom = b.x2New;
+    });
+    return expanded;
+  }
+  function expandBoundsLTR(width, bounds) {
+    bounds.sort(function (a, b) {
+      return a.x1 - b.x1 || a.index - b.index;
+    });
+    var fakeBoundary = {
+      x1: -Infinity,
+      y1: -Infinity,
+      x2: 0,
+      y2: Infinity,
+      index: -1,
+      x1New: 0,
+      x2New: 0
+    };
+    var horizon = [{
+      start: -Infinity,
+      end: Infinity,
+      boundary: fakeBoundary
+    }];
+    bounds.forEach(function (boundary) {
+      var i = 0;
+      while (i < horizon.length && horizon[i].end <= boundary.y1) {
+        i++;
+      }
+      var j = horizon.length - 1;
+      while (j >= 0 && horizon[j].start >= boundary.y2) {
+        j--;
+      }
+      var horizonPart, affectedBoundary;
+      var q,
+          k,
+          maxXNew = -Infinity;
+      for (q = i; q <= j; q++) {
+        horizonPart = horizon[q];
+        affectedBoundary = horizonPart.boundary;
+        var xNew;
+        if (affectedBoundary.x2 > boundary.x1) {
+          xNew = affectedBoundary.index > boundary.index ? affectedBoundary.x1New : boundary.x1;
+        } else if (affectedBoundary.x2New === undefined) {
+          xNew = (affectedBoundary.x2 + boundary.x1) / 2;
+        } else {
+          xNew = affectedBoundary.x2New;
+        }
+        if (xNew > maxXNew) {
+          maxXNew = xNew;
+        }
+      }
+      boundary.x1New = maxXNew;
+      for (q = i; q <= j; q++) {
+        horizonPart = horizon[q];
+        affectedBoundary = horizonPart.boundary;
+        if (affectedBoundary.x2New === undefined) {
+          if (affectedBoundary.x2 > boundary.x1) {
+            if (affectedBoundary.index > boundary.index) {
+              affectedBoundary.x2New = affectedBoundary.x2;
+            }
+          } else {
+            affectedBoundary.x2New = maxXNew;
+          }
+        } else if (affectedBoundary.x2New > maxXNew) {
+          affectedBoundary.x2New = Math.max(maxXNew, affectedBoundary.x2);
+        }
+      }
+      var changedHorizon = [],
+          lastBoundary = null;
+      for (q = i; q <= j; q++) {
+        horizonPart = horizon[q];
+        affectedBoundary = horizonPart.boundary;
+        var useBoundary = affectedBoundary.x2 > boundary.x2 ? affectedBoundary : boundary;
+        if (lastBoundary === useBoundary) {
+          changedHorizon[changedHorizon.length - 1].end = horizonPart.end;
+        } else {
+          changedHorizon.push({
+            start: horizonPart.start,
+            end: horizonPart.end,
+            boundary: useBoundary
+          });
+          lastBoundary = useBoundary;
+        }
+      }
+      if (horizon[i].start < boundary.y1) {
+        changedHorizon[0].start = boundary.y1;
+        changedHorizon.unshift({
+          start: horizon[i].start,
+          end: boundary.y1,
+          boundary: horizon[i].boundary
+        });
+      }
+      if (boundary.y2 < horizon[j].end) {
+        changedHorizon[changedHorizon.length - 1].end = boundary.y2;
+        changedHorizon.push({
+          start: boundary.y2,
+          end: horizon[j].end,
+          boundary: horizon[j].boundary
+        });
+      }
+      for (q = i; q <= j; q++) {
+        horizonPart = horizon[q];
+        affectedBoundary = horizonPart.boundary;
+        if (affectedBoundary.x2New !== undefined) {
+          continue;
+        }
+        var used = false;
+        for (k = i - 1; !used && k >= 0 && horizon[k].start >= affectedBoundary.y1; k--) {
+          used = horizon[k].boundary === affectedBoundary;
+        }
+        for (k = j + 1; !used && k < horizon.length && horizon[k].end <= affectedBoundary.y2; k++) {
+          used = horizon[k].boundary === affectedBoundary;
+        }
+        for (k = 0; !used && k < changedHorizon.length; k++) {
+          used = changedHorizon[k].boundary === affectedBoundary;
+        }
+        if (!used) {
+          affectedBoundary.x2New = maxXNew;
+        }
+      }
+      Array.prototype.splice.apply(horizon, [i, j - i + 1].concat(changedHorizon));
+    });
+    horizon.forEach(function (horizonPart) {
+      var affectedBoundary = horizonPart.boundary;
+      if (affectedBoundary.x2New === undefined) {
+        affectedBoundary.x2New = Math.max(width, affectedBoundary.x2);
+      }
+    });
+  }
+  function TextLayerRenderTask(_ref) {
+    var textContent = _ref.textContent,
+        textContentStream = _ref.textContentStream,
+        container = _ref.container,
+        viewport = _ref.viewport,
+        textDivs = _ref.textDivs,
+        textContentItemsStr = _ref.textContentItemsStr,
+        enhanceTextSelection = _ref.enhanceTextSelection;
+
+    this._textContent = textContent;
+    this._textContentStream = textContentStream;
+    this._container = container;
+    this._viewport = viewport;
+    this._textDivs = textDivs || [];
+    this._textContentItemsStr = textContentItemsStr || [];
+    this._enhanceTextSelection = !!enhanceTextSelection;
+    this._fontInspectorEnabled = !!(_global_scope2.default.FontInspector && _global_scope2.default.FontInspector.enabled);
+    this._reader = null;
+    this._layoutTextLastFontSize = null;
+    this._layoutTextLastFontFamily = null;
+    this._layoutTextCtx = null;
+    this._textDivProperties = new WeakMap();
+    this._renderingDone = false;
+    this._canceled = false;
+    this._capability = (0, _util.createPromiseCapability)();
+    this._renderTimer = null;
+    this._bounds = [];
+  }
+  TextLayerRenderTask.prototype = {
+    get promise() {
+      return this._capability.promise;
+    },
+    cancel: function TextLayer_cancel() {
+      if (this._reader) {
+        this._reader.cancel(new _util.AbortException('text layer task cancelled'));
+        this._reader = null;
+      }
+      this._canceled = true;
+      if (this._renderTimer !== null) {
+        clearTimeout(this._renderTimer);
+        this._renderTimer = null;
+      }
+      this._capability.reject('canceled');
+    },
+    _processItems: function _processItems(items, styleCache) {
+      for (var i = 0, len = items.length; i < len; i++) {
+        this._textContentItemsStr.push(items[i].str);
+        appendText(this, items[i], styleCache);
+      }
+    },
+    _layoutText: function _layoutText(textDiv) {
+      var textLayerFrag = this._container;
+      var textDivProperties = this._textDivProperties.get(textDiv);
+      if (textDivProperties.isWhitespace) {
+        return;
+      }
+      var fontSize = textDiv.style.fontSize;
+      var fontFamily = textDiv.style.fontFamily;
+      if (fontSize !== this._layoutTextLastFontSize || fontFamily !== this._layoutTextLastFontFamily) {
+        this._layoutTextCtx.font = fontSize + ' ' + fontFamily;
+        this._layoutTextLastFontSize = fontSize;
+        this._layoutTextLastFontFamily = fontFamily;
+      }
+      var width = this._layoutTextCtx.measureText(textDiv.textContent).width;
+      var transform = '';
+      if (textDivProperties.canvasWidth !== 0 && width > 0) {
+        textDivProperties.scale = textDivProperties.canvasWidth / width;
+        transform = 'scaleX(' + textDivProperties.scale + ')';
+      }
+      if (textDivProperties.angle !== 0) {
+        transform = 'rotate(' + textDivProperties.angle + 'deg) ' + transform;
+      }
+      if (transform !== '') {
+        textDivProperties.originalTransform = transform;
+        textDiv.style.transform = transform;
+      }
+      this._textDivProperties.set(textDiv, textDivProperties);
+      textLayerFrag.appendChild(textDiv);
+    },
+
+    _render: function TextLayer_render(timeout) {
+      var _this = this;
+
+      var capability = (0, _util.createPromiseCapability)();
+      var styleCache = Object.create(null);
+      var canvas = document.createElement('canvas');
+      canvas.mozOpaque = true;
+      this._layoutTextCtx = canvas.getContext('2d', { alpha: false });
+      if (this._textContent) {
+        var textItems = this._textContent.items;
+        var textStyles = this._textContent.styles;
+        this._processItems(textItems, textStyles);
+        capability.resolve();
+      } else if (this._textContentStream) {
+        var pump = function pump() {
+          _this._reader.read().then(function (_ref2) {
+            var value = _ref2.value,
+                done = _ref2.done;
+
+            if (done) {
+              capability.resolve();
+              return;
+            }
+            Object.assign(styleCache, value.styles);
+            _this._processItems(value.items, styleCache);
+            pump();
+          }, capability.reject);
+        };
+        this._reader = this._textContentStream.getReader();
+        pump();
+      } else {
+        throw new Error('Neither "textContent" nor "textContentStream"' + ' parameters specified.');
+      }
+      capability.promise.then(function () {
+        styleCache = null;
+        if (!timeout) {
+          render(_this);
+        } else {
+          _this._renderTimer = setTimeout(function () {
+            render(_this);
+            _this._renderTimer = null;
+          }, timeout);
+        }
+      }, this._capability.reject);
+    },
+    expandTextDivs: function TextLayer_expandTextDivs(expandDivs) {
+      if (!this._enhanceTextSelection || !this._renderingDone) {
+        return;
+      }
+      if (this._bounds !== null) {
+        expand(this);
+        this._bounds = null;
+      }
+      for (var i = 0, ii = this._textDivs.length; i < ii; i++) {
+        var div = this._textDivs[i];
+        var divProperties = this._textDivProperties.get(div);
+        if (divProperties.isWhitespace) {
+          continue;
+        }
+        if (expandDivs) {
+          var transform = '',
+              padding = '';
+          if (divProperties.scale !== 1) {
+            transform = 'scaleX(' + divProperties.scale + ')';
+          }
+          if (divProperties.angle !== 0) {
+            transform = 'rotate(' + divProperties.angle + 'deg) ' + transform;
+          }
+          if (divProperties.paddingLeft !== 0) {
+            padding += ' padding-left: ' + divProperties.paddingLeft / divProperties.scale + 'px;';
+            transform += ' translateX(' + -divProperties.paddingLeft / divProperties.scale + 'px)';
+          }
+          if (divProperties.paddingTop !== 0) {
+            padding += ' padding-top: ' + divProperties.paddingTop + 'px;';
+            transform += ' translateY(' + -divProperties.paddingTop + 'px)';
+          }
+          if (divProperties.paddingRight !== 0) {
+            padding += ' padding-right: ' + divProperties.paddingRight / divProperties.scale + 'px;';
+          }
+          if (divProperties.paddingBottom !== 0) {
+            padding += ' padding-bottom: ' + divProperties.paddingBottom + 'px;';
+          }
+          if (padding !== '') {
+            div.setAttribute('style', divProperties.style + padding);
+          }
+          if (transform !== '') {
+            div.style.transform = transform;
+          }
+        } else {
+          div.style.padding = 0;
+          div.style.transform = divProperties.originalTransform || '';
+        }
+      }
+    }
+  };
+  function renderTextLayer(renderParameters) {
+    var task = new TextLayerRenderTask({
+      textContent: renderParameters.textContent,
+      textContentStream: renderParameters.textContentStream,
+      container: renderParameters.container,
+      viewport: renderParameters.viewport,
+      textDivs: renderParameters.textDivs,
+      textContentItemsStr: renderParameters.textContentItemsStr,
+      enhanceTextSelection: renderParameters.enhanceTextSelection
+    });
+    task._render(renderParameters.timeout);
+    return task;
+  }
+  return renderTextLayer;
+}();
+exports.renderTextLayer = renderTextLayer;
+
+/***/ }),
+/* 146 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.AnnotationLayer = undefined;
+
+var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _dom_utils = __w_pdfjs_require__(130);
+
+var _util = __w_pdfjs_require__(1);
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var AnnotationElementFactory = function () {
+  function AnnotationElementFactory() {
+    _classCallCheck(this, AnnotationElementFactory);
+  }
+
+  _createClass(AnnotationElementFactory, null, [{
+    key: 'create',
+    value: function create(parameters) {
+      var subtype = parameters.data.annotationType;
+      switch (subtype) {
+        case _util.AnnotationType.LINK:
+          return new LinkAnnotationElement(parameters);
+        case _util.AnnotationType.TEXT:
+          return new TextAnnotationElement(parameters);
+        case _util.AnnotationType.WIDGET:
+          var fieldType = parameters.data.fieldType;
+          switch (fieldType) {
+            case 'Tx':
+              return new TextWidgetAnnotationElement(parameters);
+            case 'Btn':
+              if (parameters.data.radioButton) {
+                return new RadioButtonWidgetAnnotationElement(parameters);
+              } else if (parameters.data.checkBox) {
+                return new CheckboxWidgetAnnotationElement(parameters);
+              }
+              return new PushButtonWidgetAnnotationElement(parameters);
+            case 'Ch':
+              return new ChoiceWidgetAnnotationElement(parameters);
+          }
+          return new WidgetAnnotationElement(parameters);
+        case _util.AnnotationType.POPUP:
+          return new PopupAnnotationElement(parameters);
+        case _util.AnnotationType.LINE:
+          return new LineAnnotationElement(parameters);
+        case _util.AnnotationType.SQUARE:
+          return new SquareAnnotationElement(parameters);
+        case _util.AnnotationType.CIRCLE:
+          return new CircleAnnotationElement(parameters);
+        case _util.AnnotationType.POLYLINE:
+          return new PolylineAnnotationElement(parameters);
+        case _util.AnnotationType.INK:
+          return new InkAnnotationElement(parameters);
+        case _util.AnnotationType.POLYGON:
+          return new PolygonAnnotationElement(parameters);
+        case _util.AnnotationType.HIGHLIGHT:
+          return new HighlightAnnotationElement(parameters);
+        case _util.AnnotationType.UNDERLINE:
+          return new UnderlineAnnotationElement(parameters);
+        case _util.AnnotationType.SQUIGGLY:
+          return new SquigglyAnnotationElement(parameters);
+        case _util.AnnotationType.STRIKEOUT:
+          return new StrikeOutAnnotationElement(parameters);
+        case _util.AnnotationType.STAMP:
+          return new StampAnnotationElement(parameters);
+        case _util.AnnotationType.FILEATTACHMENT:
+          return new FileAttachmentAnnotationElement(parameters);
+        default:
+          return new AnnotationElement(parameters);
+      }
+    }
+  }]);
+
+  return AnnotationElementFactory;
+}();
+
+var AnnotationElement = function () {
+  function AnnotationElement(parameters) {
+    var isRenderable = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+    var ignoreBorder = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
+
+    _classCallCheck(this, AnnotationElement);
+
+    this.isRenderable = isRenderable;
+    this.data = parameters.data;
+    this.layer = parameters.layer;
+    this.page = parameters.page;
+    this.viewport = parameters.viewport;
+    this.linkService = parameters.linkService;
+    this.downloadManager = parameters.downloadManager;
+    this.imageResourcesPath = parameters.imageResourcesPath;
+    this.renderInteractiveForms = parameters.renderInteractiveForms;
+    this.svgFactory = parameters.svgFactory;
+    if (isRenderable) {
+      this.container = this._createContainer(ignoreBorder);
+    }
+  }
+
+  _createClass(AnnotationElement, [{
+    key: '_createContainer',
+    value: function _createContainer() {
+      var ignoreBorder = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+
+      var data = this.data,
+          page = this.page,
+          viewport = this.viewport;
+      var container = document.createElement('section');
+      var width = data.rect[2] - data.rect[0];
+      var height = data.rect[3] - data.rect[1];
+      container.setAttribute('data-annotation-id', data.id);
+      var rect = _util.Util.normalizeRect([data.rect[0], page.view[3] - data.rect[1] + page.view[1], data.rect[2], page.view[3] - data.rect[3] + page.view[1]]);
+      container.style.transform = 'matrix(' + viewport.transform.join(',') + ')';
+      container.style.transformOrigin = -rect[0] + 'px ' + -rect[1] + 'px';
+      if (!ignoreBorder && data.borderStyle.width > 0) {
+        container.style.borderWidth = data.borderStyle.width + 'px';
+        if (data.borderStyle.style !== _util.AnnotationBorderStyleType.UNDERLINE) {
+          width = width - 2 * data.borderStyle.width;
+          height = height - 2 * data.borderStyle.width;
+        }
+        var horizontalRadius = data.borderStyle.horizontalCornerRadius;
+        var verticalRadius = data.borderStyle.verticalCornerRadius;
+        if (horizontalRadius > 0 || verticalRadius > 0) {
+          var radius = horizontalRadius + 'px / ' + verticalRadius + 'px';
+          container.style.borderRadius = radius;
+        }
+        switch (data.borderStyle.style) {
+          case _util.AnnotationBorderStyleType.SOLID:
+            container.style.borderStyle = 'solid';
+            break;
+          case _util.AnnotationBorderStyleType.DASHED:
+            container.style.borderStyle = 'dashed';
+            break;
+          case _util.AnnotationBorderStyleType.BEVELED:
+            (0, _util.warn)('Unimplemented border style: beveled');
+            break;
+          case _util.AnnotationBorderStyleType.INSET:
+            (0, _util.warn)('Unimplemented border style: inset');
+            break;
+          case _util.AnnotationBorderStyleType.UNDERLINE:
+            container.style.borderBottomStyle = 'solid';
+            break;
+          default:
+            break;
+        }
+        if (data.color) {
+          container.style.borderColor = _util.Util.makeCssRgb(data.color[0] | 0, data.color[1] | 0, data.color[2] | 0);
+        } else {
+          container.style.borderWidth = 0;
+        }
+      }
+      container.style.left = rect[0] + 'px';
+      container.style.top = rect[1] + 'px';
+      container.style.width = width + 'px';
+      container.style.height = height + 'px';
+      return container;
+    }
+  }, {
+    key: '_createPopup',
+    value: function _createPopup(container, trigger, data) {
+      if (!trigger) {
+        trigger = document.createElement('div');
+        trigger.style.height = container.style.height;
+        trigger.style.width = container.style.width;
+        container.appendChild(trigger);
+      }
+      var popupElement = new PopupElement({
+        container: container,
+        trigger: trigger,
+        color: data.color,
+        title: data.title,
+        contents: data.contents,
+        hideWrapper: true
+      });
+      var popup = popupElement.render();
+      popup.style.left = container.style.width;
+      container.appendChild(popup);
+    }
+  }, {
+    key: 'render',
+    value: function render() {
+      (0, _util.unreachable)('Abstract method `AnnotationElement.render` called');
+    }
+  }]);
+
+  return AnnotationElement;
+}();
+
+var LinkAnnotationElement = function (_AnnotationElement) {
+  _inherits(LinkAnnotationElement, _AnnotationElement);
+
+  function LinkAnnotationElement(parameters) {
+    _classCallCheck(this, LinkAnnotationElement);
+
+    var isRenderable = !!(parameters.data.url || parameters.data.dest || parameters.data.action);
+    return _possibleConstructorReturn(this, (LinkAnnotationElement.__proto__ || Object.getPrototypeOf(LinkAnnotationElement)).call(this, parameters, isRenderable));
+  }
+
+  _createClass(LinkAnnotationElement, [{
+    key: 'render',
+    value: function render() {
+      this.container.className = 'linkAnnotation';
+      var data = this.data,
+          linkService = this.linkService;
+
+      var link = document.createElement('a');
+      (0, _dom_utils.addLinkAttributes)(link, {
+        url: data.url,
+        target: data.newWindow ? _dom_utils.LinkTarget.BLANK : linkService.externalLinkTarget,
+        rel: linkService.externalLinkRel
+      });
+      if (!data.url) {
+        if (data.action) {
+          this._bindNamedAction(link, data.action);
+        } else {
+          this._bindLink(link, data.dest);
+        }
+      }
+      this.container.appendChild(link);
+      return this.container;
+    }
+  }, {
+    key: '_bindLink',
+    value: function _bindLink(link, destination) {
+      var _this2 = this;
+
+      link.href = this.linkService.getDestinationHash(destination);
+      link.onclick = function () {
+        if (destination) {
+          _this2.linkService.navigateTo(destination);
+        }
+        return false;
+      };
+      if (destination) {
+        link.className = 'internalLink';
+      }
+    }
+  }, {
+    key: '_bindNamedAction',
+    value: function _bindNamedAction(link, action) {
+      var _this3 = this;
+
+      link.href = this.linkService.getAnchorUrl('');
+      link.onclick = function () {
+        _this3.linkService.executeNamedAction(action);
+        return false;
+      };
+      link.className = 'internalLink';
+    }
+  }]);
+
+  return LinkAnnotationElement;
+}(AnnotationElement);
+
+var TextAnnotationElement = function (_AnnotationElement2) {
+  _inherits(TextAnnotationElement, _AnnotationElement2);
+
+  function TextAnnotationElement(parameters) {
+    _classCallCheck(this, TextAnnotationElement);
+
+    var isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);
+    return _possibleConstructorReturn(this, (TextAnnotationElement.__proto__ || Object.getPrototypeOf(TextAnnotationElement)).call(this, parameters, isRenderable));
+  }
+
+  _createClass(TextAnnotationElement, [{
+    key: 'render',
+    value: function render() {
+      this.container.className = 'textAnnotation';
+      var image = document.createElement('img');
+      image.style.height = this.container.style.height;
+      image.style.width = this.container.style.width;
+      image.src = this.imageResourcesPath + 'annotation-' + this.data.name.toLowerCase() + '.svg';
+      image.alt = '[{{type}} Annotation]';
+      image.dataset.l10nId = 'text_annotation_type';
+      image.dataset.l10nArgs = JSON.stringify({ type: this.data.name });
+      if (!this.data.hasPopup) {
+        this._createPopup(this.container, image, this.data);
+      }
+      this.container.appendChild(image);
+      return this.container;
+    }
+  }]);
+
+  return TextAnnotationElement;
+}(AnnotationElement);
+
+var WidgetAnnotationElement = function (_AnnotationElement3) {
+  _inherits(WidgetAnnotationElement, _AnnotationElement3);
+
+  function WidgetAnnotationElement() {
+    _classCallCheck(this, WidgetAnnotationElement);
+
+    return _possibleConstructorReturn(this, (WidgetAnnotationElement.__proto__ || Object.getPrototypeOf(WidgetAnnotationElement)).apply(this, arguments));
+  }
+
+  _createClass(WidgetAnnotationElement, [{
+    key: 'render',
+    value: function render() {
+      return this.container;
+    }
+  }]);
+
+  return WidgetAnnotationElement;
+}(AnnotationElement);
+
+var TextWidgetAnnotationElement = function (_WidgetAnnotationElem) {
+  _inherits(TextWidgetAnnotationElement, _WidgetAnnotationElem);
+
+  function TextWidgetAnnotationElement(parameters) {
+    _classCallCheck(this, TextWidgetAnnotationElement);
+
+    var isRenderable = parameters.renderInteractiveForms || !parameters.data.hasAppearance && !!parameters.data.fieldValue;
+    return _possibleConstructorReturn(this, (TextWidgetAnnotationElement.__proto__ || Object.getPrototypeOf(TextWidgetAnnotationElement)).call(this, parameters, isRenderable));
+  }
+
+  _createClass(TextWidgetAnnotationElement, [{
+    key: 'render',
+    value: function render() {
+      var TEXT_ALIGNMENT = ['left', 'center', 'right'];
+      this.container.className = 'textWidgetAnnotation';
+      var element = null;
+      if (this.renderInteractiveForms) {
+        if (this.data.multiLine) {
+          element = document.createElement('textarea');
+          element.textContent = this.data.fieldValue;
+        } else {
+          element = document.createElement('input');
+          element.type = 'text';
+          element.setAttribute('value', this.data.fieldValue);
+        }
+        element.disabled = this.data.readOnly;
+        if (this.data.maxLen !== null) {
+          element.maxLength = this.data.maxLen;
+        }
+        if (this.data.comb) {
+          var fieldWidth = this.data.rect[2] - this.data.rect[0];
+          var combWidth = fieldWidth / this.data.maxLen;
+          element.classList.add('comb');
+          element.style.letterSpacing = 'calc(' + combWidth + 'px - 1ch)';
+        }
+      } else {
+        element = document.createElement('div');
+        element.textContent = this.data.fieldValue;
+        element.style.verticalAlign = 'middle';
+        element.style.display = 'table-cell';
+        var font = null;
+        if (this.data.fontRefName) {
+          font = this.page.commonObjs.getData(this.data.fontRefName);
+        }
+        this._setTextStyle(element, font);
+      }
+      if (this.data.textAlignment !== null) {
+        element.style.textAlign = TEXT_ALIGNMENT[this.data.textAlignment];
+      }
+      this.container.appendChild(element);
+      return this.container;
+    }
+  }, {
+    key: '_setTextStyle',
+    value: function _setTextStyle(element, font) {
+      var style = element.style;
+      style.fontSize = this.data.fontSize + 'px';
+      style.direction = this.data.fontDirection < 0 ? 'rtl' : 'ltr';
+      if (!font) {
+        return;
+      }
+      style.fontWeight = font.black ? font.bold ? '900' : 'bold' : font.bold ? 'bold' : 'normal';
+      style.fontStyle = font.italic ? 'italic' : 'normal';
+      var fontFamily = font.loadedName ? '"' + font.loadedName + '", ' : '';
+      var fallbackName = font.fallbackName || 'Helvetica, sans-serif';
+      style.fontFamily = fontFamily + fallbackName;
+    }
+  }]);
+
+  return TextWidgetAnnotationElement;
+}(WidgetAnnotationElement);
+
+var CheckboxWidgetAnnotationElement = function (_WidgetAnnotationElem2) {
+  _inherits(CheckboxWidgetAnnotationElement, _WidgetAnnotationElem2);
+
+  function CheckboxWidgetAnnotationElement(parameters) {
+    _classCallCheck(this, CheckboxWidgetAnnotationElement);
+
+    return _possibleConstructorReturn(this, (CheckboxWidgetAnnotationElement.__proto__ || Object.getPrototypeOf(CheckboxWidgetAnnotationElement)).call(this, parameters, parameters.renderInteractiveForms));
+  }
+
+  _createClass(CheckboxWidgetAnnotationElement, [{
+    key: 'render',
+    value: function render() {
+      this.container.className = 'buttonWidgetAnnotation checkBox';
+      var element = document.createElement('input');
+      element.disabled = this.data.readOnly;
+      element.type = 'checkbox';
+      if (this.data.fieldValue && this.data.fieldValue !== 'Off') {
+        element.setAttribute('checked', true);
+      }
+      this.container.appendChild(element);
+      return this.container;
+    }
+  }]);
+
+  return CheckboxWidgetAnnotationElement;
+}(WidgetAnnotationElement);
+
+var RadioButtonWidgetAnnotationElement = function (_WidgetAnnotationElem3) {
+  _inherits(RadioButtonWidgetAnnotationElement, _WidgetAnnotationElem3);
+
+  function RadioButtonWidgetAnnotationElement(parameters) {
+    _classCallCheck(this, RadioButtonWidgetAnnotationElement);
+
+    return _possibleConstructorReturn(this, (RadioButtonWidgetAnnotationElement.__proto__ || Object.getPrototypeOf(RadioButtonWidgetAnnotationElement)).call(this, parameters, parameters.renderInteractiveForms));
+  }
+
+  _createClass(RadioButtonWidgetAnnotationElement, [{
+    key: 'render',
+    value: function render() {
+      this.container.className = 'buttonWidgetAnnotation radioButton';
+      var element = document.createElement('input');
+      element.disabled = this.data.readOnly;
+      element.type = 'radio';
+      element.name = this.data.fieldName;
+      if (this.data.fieldValue === this.data.buttonValue) {
+        element.setAttribute('checked', true);
+      }
+      this.container.appendChild(element);
+      return this.container;
+    }
+  }]);
+
+  return RadioButtonWidgetAnnotationElement;
+}(WidgetAnnotationElement);
+
+var PushButtonWidgetAnnotationElement = function (_LinkAnnotationElemen) {
+  _inherits(PushButtonWidgetAnnotationElement, _LinkAnnotationElemen);
+
+  function PushButtonWidgetAnnotationElement() {
+    _classCallCheck(this, PushButtonWidgetAnnotationElement);
+
+    return _possibleConstructorReturn(this, (PushButtonWidgetAnnotationElement.__proto__ || Object.getPrototypeOf(PushButtonWidgetAnnotationElement)).apply(this, arguments));
+  }
+
+  _createClass(PushButtonWidgetAnnotationElement, [{
+    key: 'render',
+    value: function render() {
+      var container = _get(PushButtonWidgetAnnotationElement.prototype.__proto__ || Object.getPrototypeOf(PushButtonWidgetAnnotationElement.prototype), 'render', this).call(this);
+      container.className = 'buttonWidgetAnnotation pushButton';
+      return container;
+    }
+  }]);
+
+  return PushButtonWidgetAnnotationElement;
+}(LinkAnnotationElement);
+
+var ChoiceWidgetAnnotationElement = function (_WidgetAnnotationElem4) {
+  _inherits(ChoiceWidgetAnnotationElement, _WidgetAnnotationElem4);
+
+  function ChoiceWidgetAnnotationElement(parameters) {
+    _classCallCheck(this, ChoiceWidgetAnnotationElement);
+
+    return _possibleConstructorReturn(this, (ChoiceWidgetAnnotationElement.__proto__ || Object.getPrototypeOf(ChoiceWidgetAnnotationElement)).call(this, parameters, parameters.renderInteractiveForms));
+  }
+
+  _createClass(ChoiceWidgetAnnotationElement, [{
+    key: 'render',
+    value: function render() {
+      this.container.className = 'choiceWidgetAnnotation';
+      var selectElement = document.createElement('select');
+      selectElement.disabled = this.data.readOnly;
+      if (!this.data.combo) {
+        selectElement.size = this.data.options.length;
+        if (this.data.multiSelect) {
+          selectElement.multiple = true;
+        }
+      }
+      for (var i = 0, ii = this.data.options.length; i < ii; i++) {
+        var option = this.data.options[i];
+        var optionElement = document.createElement('option');
+        optionElement.textContent = option.displayValue;
+        optionElement.value = option.exportValue;
+        if (this.data.fieldValue.includes(option.displayValue)) {
+          optionElement.setAttribute('selected', true);
+        }
+        selectElement.appendChild(optionElement);
+      }
+      this.container.appendChild(selectElement);
+      return this.container;
+    }
+  }]);
+
+  return ChoiceWidgetAnnotationElement;
+}(WidgetAnnotationElement);
+
+var PopupAnnotationElement = function (_AnnotationElement4) {
+  _inherits(PopupAnnotationElement, _AnnotationElement4);
+
+  function PopupAnnotationElement(parameters) {
+    _classCallCheck(this, PopupAnnotationElement);
+
+    var isRenderable = !!(parameters.data.title || parameters.data.contents);
+    return _possibleConstructorReturn(this, (PopupAnnotationElement.__proto__ || Object.getPrototypeOf(PopupAnnotationElement)).call(this, parameters, isRenderable));
+  }
+
+  _createClass(PopupAnnotationElement, [{
+    key: 'render',
+    value: function render() {
+      var IGNORE_TYPES = ['Line', 'Square', 'Circle', 'PolyLine', 'Polygon', 'Ink'];
+      this.container.className = 'popupAnnotation';
+      if (IGNORE_TYPES.includes(this.data.parentType)) {
+        return this.container;
+      }
+      var selector = '[data-annotation-id="' + this.data.parentId + '"]';
+      var parentElement = this.layer.querySelector(selector);
+      if (!parentElement) {
+        return this.container;
+      }
+      var popup = new PopupElement({
+        container: this.container,
+        trigger: parentElement,
+        color: this.data.color,
+        title: this.data.title,
+        contents: this.data.contents
+      });
+      var parentLeft = parseFloat(parentElement.style.left);
+      var parentWidth = parseFloat(parentElement.style.width);
+      this.container.style.transformOrigin = -(parentLeft + parentWidth) + 'px -' + parentElement.style.top;
+      this.container.style.left = parentLeft + parentWidth + 'px';
+      this.container.appendChild(popup.render());
+      return this.container;
+    }
+  }]);
+
+  return PopupAnnotationElement;
+}(AnnotationElement);
+
+var PopupElement = function () {
+  function PopupElement(parameters) {
+    _classCallCheck(this, PopupElement);
+
+    this.container = parameters.container;
+    this.trigger = parameters.trigger;
+    this.color = parameters.color;
+    this.title = parameters.title;
+    this.contents = parameters.contents;
+    this.hideWrapper = parameters.hideWrapper || false;
+    this.pinned = false;
+  }
+
+  _createClass(PopupElement, [{
+    key: 'render',
+    value: function render() {
+      var BACKGROUND_ENLIGHT = 0.7;
+      var wrapper = document.createElement('div');
+      wrapper.className = 'popupWrapper';
+      this.hideElement = this.hideWrapper ? wrapper : this.container;
+      this.hideElement.setAttribute('hidden', true);
+      var popup = document.createElement('div');
+      popup.className = 'popup';
+      var color = this.color;
+      if (color) {
+        var r = BACKGROUND_ENLIGHT * (255 - color[0]) + color[0];
+        var g = BACKGROUND_ENLIGHT * (255 - color[1]) + color[1];
+        var b = BACKGROUND_ENLIGHT * (255 - color[2]) + color[2];
+        popup.style.backgroundColor = _util.Util.makeCssRgb(r | 0, g | 0, b | 0);
+      }
+      var contents = this._formatContents(this.contents);
+      var title = document.createElement('h1');
+      title.textContent = this.title;
+      this.trigger.addEventListener('click', this._toggle.bind(this));
+      this.trigger.addEventListener('mouseover', this._show.bind(this, false));
+      this.trigger.addEventListener('mouseout', this._hide.bind(this, false));
+      popup.addEventListener('click', this._hide.bind(this, true));
+      popup.appendChild(title);
+      popup.appendChild(contents);
+      wrapper.appendChild(popup);
+      return wrapper;
+    }
+  }, {
+    key: '_formatContents',
+    value: function _formatContents(contents) {
+      var p = document.createElement('p');
+      var lines = contents.split(/(?:\r\n?|\n)/);
+      for (var i = 0, ii = lines.length; i < ii; ++i) {
+        var line = lines[i];
+        p.appendChild(document.createTextNode(line));
+        if (i < ii - 1) {
+          p.appendChild(document.createElement('br'));
+        }
+      }
+      return p;
+    }
+  }, {
+    key: '_toggle',
+    value: function _toggle() {
+      if (this.pinned) {
+        this._hide(true);
+      } else {
+        this._show(true);
+      }
+    }
+  }, {
+    key: '_show',
+    value: function _show() {
+      var pin = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+
+      if (pin) {
+        this.pinned = true;
+      }
+      if (this.hideElement.hasAttribute('hidden')) {
+        this.hideElement.removeAttribute('hidden');
+        this.container.style.zIndex += 1;
+      }
+    }
+  }, {
+    key: '_hide',
+    value: function _hide() {
+      var unpin = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
+
+      if (unpin) {
+        this.pinned = false;
+      }
+      if (!this.hideElement.hasAttribute('hidden') && !this.pinned) {
+        this.hideElement.setAttribute('hidden', true);
+        this.container.style.zIndex -= 1;
+      }
+    }
+  }]);
+
+  return PopupElement;
+}();
+
+var LineAnnotationElement = function (_AnnotationElement5) {
+  _inherits(LineAnnotationElement, _AnnotationElement5);
+
+  function LineAnnotationElement(parameters) {
+    _classCallCheck(this, LineAnnotationElement);
+
+    var isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);
+    return _possibleConstructorReturn(this, (LineAnnotationElement.__proto__ || Object.getPrototypeOf(LineAnnotationElement)).call(this, parameters, isRenderable, true));
+  }
+
+  _createClass(LineAnnotationElement, [{
+    key: 'render',
+    value: function render() {
+      this.container.className = 'lineAnnotation';
+      var data = this.data;
+      var width = data.rect[2] - data.rect[0];
+      var height = data.rect[3] - data.rect[1];
+      var svg = this.svgFactory.create(width, height);
+      var line = this.svgFactory.createElement('svg:line');
+      line.setAttribute('x1', data.rect[2] - data.lineCoordinates[0]);
+      line.setAttribute('y1', data.rect[3] - data.lineCoordinates[1]);
+      line.setAttribute('x2', data.rect[2] - data.lineCoordinates[2]);
+      line.setAttribute('y2', data.rect[3] - data.lineCoordinates[3]);
+      line.setAttribute('stroke-width', data.borderStyle.width);
+      line.setAttribute('stroke', 'transparent');
+      svg.appendChild(line);
+      this.container.append(svg);
+      this._createPopup(this.container, line, data);
+      return this.container;
+    }
+  }]);
+
+  return LineAnnotationElement;
+}(AnnotationElement);
+
+var SquareAnnotationElement = function (_AnnotationElement6) {
+  _inherits(SquareAnnotationElement, _AnnotationElement6);
+
+  function SquareAnnotationElement(parameters) {
+    _classCallCheck(this, SquareAnnotationElement);
+
+    var isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);
+    return _possibleConstructorReturn(this, (SquareAnnotationElement.__proto__ || Object.getPrototypeOf(SquareAnnotationElement)).call(this, parameters, isRenderable, true));
+  }
+
+  _createClass(SquareAnnotationElement, [{
+    key: 'render',
+    value: function render() {
+      this.container.className = 'squareAnnotation';
+      var data = this.data;
+      var width = data.rect[2] - data.rect[0];
+      var height = data.rect[3] - data.rect[1];
+      var svg = this.svgFactory.create(width, height);
+      var borderWidth = data.borderStyle.width;
+      var square = this.svgFactory.createElement('svg:rect');
+      square.setAttribute('x', borderWidth / 2);
+      square.setAttribute('y', borderWidth / 2);
+      square.setAttribute('width', width - borderWidth);
+      square.setAttribute('height', height - borderWidth);
+      square.setAttribute('stroke-width', borderWidth);
+      square.setAttribute('stroke', 'transparent');
+      square.setAttribute('fill', 'none');
+      svg.appendChild(square);
+      this.container.append(svg);
+      this._createPopup(this.container, square, data);
+      return this.container;
+    }
+  }]);
+
+  return SquareAnnotationElement;
+}(AnnotationElement);
+
+var CircleAnnotationElement = function (_AnnotationElement7) {
+  _inherits(CircleAnnotationElement, _AnnotationElement7);
+
+  function CircleAnnotationElement(parameters) {
+    _classCallCheck(this, CircleAnnotationElement);
+
+    var isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);
+    return _possibleConstructorReturn(this, (CircleAnnotationElement.__proto__ || Object.getPrototypeOf(CircleAnnotationElement)).call(this, parameters, isRenderable, true));
+  }
+
+  _createClass(CircleAnnotationElement, [{
+    key: 'render',
+    value: function render() {
+      this.container.className = 'circleAnnotation';
+      var data = this.data;
+      var width = data.rect[2] - data.rect[0];
+      var height = data.rect[3] - data.rect[1];
+      var svg = this.svgFactory.create(width, height);
+      var borderWidth = data.borderStyle.width;
+      var circle = this.svgFactory.createElement('svg:ellipse');
+      circle.setAttribute('cx', width / 2);
+      circle.setAttribute('cy', height / 2);
+      circle.setAttribute('rx', width / 2 - borderWidth / 2);
+      circle.setAttribute('ry', height / 2 - borderWidth / 2);
+      circle.setAttribute('stroke-width', borderWidth);
+      circle.setAttribute('stroke', 'transparent');
+      circle.setAttribute('fill', 'none');
+      svg.appendChild(circle);
+      this.container.append(svg);
+      this._createPopup(this.container, circle, data);
+      return this.container;
+    }
+  }]);
+
+  return CircleAnnotationElement;
+}(AnnotationElement);
+
+var PolylineAnnotationElement = function (_AnnotationElement8) {
+  _inherits(PolylineAnnotationElement, _AnnotationElement8);
+
+  function PolylineAnnotationElement(parameters) {
+    _classCallCheck(this, PolylineAnnotationElement);
+
+    var isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);
+
+    var _this15 = _possibleConstructorReturn(this, (PolylineAnnotationElement.__proto__ || Object.getPrototypeOf(PolylineAnnotationElement)).call(this, parameters, isRenderable, true));
+
+    _this15.containerClassName = 'polylineAnnotation';
+    _this15.svgElementName = 'svg:polyline';
+    return _this15;
+  }
+
+  _createClass(PolylineAnnotationElement, [{
+    key: 'render',
+    value: function render() {
+      this.container.className = this.containerClassName;
+      var data = this.data;
+      var width = data.rect[2] - data.rect[0];
+      var height = data.rect[3] - data.rect[1];
+      var svg = this.svgFactory.create(width, height);
+      var vertices = data.vertices;
+      var points = [];
+      for (var i = 0, ii = vertices.length; i < ii; i++) {
+        var x = vertices[i].x - data.rect[0];
+        var y = data.rect[3] - vertices[i].y;
+        points.push(x + ',' + y);
+      }
+      points = points.join(' ');
+      var borderWidth = data.borderStyle.width;
+      var polyline = this.svgFactory.createElement(this.svgElementName);
+      polyline.setAttribute('points', points);
+      polyline.setAttribute('stroke-width', borderWidth);
+      polyline.setAttribute('stroke', 'transparent');
+      polyline.setAttribute('fill', 'none');
+      svg.appendChild(polyline);
+      this.container.append(svg);
+      this._createPopup(this.container, polyline, data);
+      return this.container;
+    }
+  }]);
+
+  return PolylineAnnotationElement;
+}(AnnotationElement);
+
+var PolygonAnnotationElement = function (_PolylineAnnotationEl) {
+  _inherits(PolygonAnnotationElement, _PolylineAnnotationEl);
+
+  function PolygonAnnotationElement(parameters) {
+    _classCallCheck(this, PolygonAnnotationElement);
+
+    var _this16 = _possibleConstructorReturn(this, (PolygonAnnotationElement.__proto__ || Object.getPrototypeOf(PolygonAnnotationElement)).call(this, parameters));
+
+    _this16.containerClassName = 'polygonAnnotation';
+    _this16.svgElementName = 'svg:polygon';
+    return _this16;
+  }
+
+  return PolygonAnnotationElement;
+}(PolylineAnnotationElement);
+
+var InkAnnotationElement = function (_AnnotationElement9) {
+  _inherits(InkAnnotationElement, _AnnotationElement9);
+
+  function InkAnnotationElement(parameters) {
+    _classCallCheck(this, InkAnnotationElement);
+
+    var isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);
+
+    var _this17 = _possibleConstructorReturn(this, (InkAnnotationElement.__proto__ || Object.getPrototypeOf(InkAnnotationElement)).call(this, parameters, isRenderable, true));
+
+    _this17.containerClassName = 'inkAnnotation';
+    _this17.svgElementName = 'svg:polyline';
+    return _this17;
+  }
+
+  _createClass(InkAnnotationElement, [{
+    key: 'render',
+    value: function render() {
+      this.container.className = this.containerClassName;
+      var data = this.data;
+      var width = data.rect[2] - data.rect[0];
+      var height = data.rect[3] - data.rect[1];
+      var svg = this.svgFactory.create(width, height);
+      var inkLists = data.inkLists;
+      for (var i = 0, ii = inkLists.length; i < ii; i++) {
+        var inkList = inkLists[i];
+        var points = [];
+        for (var j = 0, jj = inkList.length; j < jj; j++) {
+          var x = inkList[j].x - data.rect[0];
+          var y = data.rect[3] - inkList[j].y;
+          points.push(x + ',' + y);
+        }
+        points = points.join(' ');
+        var borderWidth = data.borderStyle.width;
+        var polyline = this.svgFactory.createElement(this.svgElementName);
+        polyline.setAttribute('points', points);
+        polyline.setAttribute('stroke-width', borderWidth);
+        polyline.setAttribute('stroke', 'transparent');
+        polyline.setAttribute('fill', 'none');
+        this._createPopup(this.container, polyline, data);
+        svg.appendChild(polyline);
+      }
+      this.container.append(svg);
+      return this.container;
+    }
+  }]);
+
+  return InkAnnotationElement;
+}(AnnotationElement);
+
+var HighlightAnnotationElement = function (_AnnotationElement10) {
+  _inherits(HighlightAnnotationElement, _AnnotationElement10);
+
+  function HighlightAnnotationElement(parameters) {
+    _classCallCheck(this, HighlightAnnotationElement);
+
+    var isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);
+    return _possibleConstructorReturn(this, (HighlightAnnotationElement.__proto__ || Object.getPrototypeOf(HighlightAnnotationElement)).call(this, parameters, isRenderable, true));
+  }
+
+  _createClass(HighlightAnnotationElement, [{
+    key: 'render',
+    value: function render() {
+      this.container.className = 'highlightAnnotation';
+      if (!this.data.hasPopup) {
+        this._createPopup(this.container, null, this.data);
+      }
+      return this.container;
+    }
+  }]);
+
+  return HighlightAnnotationElement;
+}(AnnotationElement);
+
+var UnderlineAnnotationElement = function (_AnnotationElement11) {
+  _inherits(UnderlineAnnotationElement, _AnnotationElement11);
+
+  function UnderlineAnnotationElement(parameters) {
+    _classCallCheck(this, UnderlineAnnotationElement);
+
+    var isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);
+    return _possibleConstructorReturn(this, (UnderlineAnnotationElement.__proto__ || Object.getPrototypeOf(UnderlineAnnotationElement)).call(this, parameters, isRenderable, true));
+  }
+
+  _createClass(UnderlineAnnotationElement, [{
+    key: 'render',
+    value: function render() {
+      this.container.className = 'underlineAnnotation';
+      if (!this.data.hasPopup) {
+        this._createPopup(this.container, null, this.data);
+      }
+      return this.container;
+    }
+  }]);
+
+  return UnderlineAnnotationElement;
+}(AnnotationElement);
+
+var SquigglyAnnotationElement = function (_AnnotationElement12) {
+  _inherits(SquigglyAnnotationElement, _AnnotationElement12);
+
+  function SquigglyAnnotationElement(parameters) {
+    _classCallCheck(this, SquigglyAnnotationElement);
+
+    var isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);
+    return _possibleConstructorReturn(this, (SquigglyAnnotationElement.__proto__ || Object.getPrototypeOf(SquigglyAnnotationElement)).call(this, parameters, isRenderable, true));
+  }
+
+  _createClass(SquigglyAnnotationElement, [{
+    key: 'render',
+    value: function render() {
+      this.container.className = 'squigglyAnnotation';
+      if (!this.data.hasPopup) {
+        this._createPopup(this.container, null, this.data);
+      }
+      return this.container;
+    }
+  }]);
+
+  return SquigglyAnnotationElement;
+}(AnnotationElement);
+
+var StrikeOutAnnotationElement = function (_AnnotationElement13) {
+  _inherits(StrikeOutAnnotationElement, _AnnotationElement13);
+
+  function StrikeOutAnnotationElement(parameters) {
+    _classCallCheck(this, StrikeOutAnnotationElement);
+
+    var isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);
+    return _possibleConstructorReturn(this, (StrikeOutAnnotationElement.__proto__ || Object.getPrototypeOf(StrikeOutAnnotationElement)).call(this, parameters, isRenderable, true));
+  }
+
+  _createClass(StrikeOutAnnotationElement, [{
+    key: 'render',
+    value: function render() {
+      this.container.className = 'strikeoutAnnotation';
+      if (!this.data.hasPopup) {
+        this._createPopup(this.container, null, this.data);
+      }
+      return this.container;
+    }
+  }]);
+
+  return StrikeOutAnnotationElement;
+}(AnnotationElement);
+
+var StampAnnotationElement = function (_AnnotationElement14) {
+  _inherits(StampAnnotationElement, _AnnotationElement14);
+
+  function StampAnnotationElement(parameters) {
+    _classCallCheck(this, StampAnnotationElement);
+
+    var isRenderable = !!(parameters.data.hasPopup || parameters.data.title || parameters.data.contents);
+    return _possibleConstructorReturn(this, (StampAnnotationElement.__proto__ || Object.getPrototypeOf(StampAnnotationElement)).call(this, parameters, isRenderable, true));
+  }
+
+  _createClass(StampAnnotationElement, [{
+    key: 'render',
+    value: function render() {
+      this.container.className = 'stampAnnotation';
+      if (!this.data.hasPopup) {
+        this._createPopup(this.container, null, this.data);
+      }
+      return this.container;
+    }
+  }]);
+
+  return StampAnnotationElement;
+}(AnnotationElement);
+
+var FileAttachmentAnnotationElement = function (_AnnotationElement15) {
+  _inherits(FileAttachmentAnnotationElement, _AnnotationElement15);
+
+  function FileAttachmentAnnotationElement(parameters) {
+    _classCallCheck(this, FileAttachmentAnnotationElement);
+
+    var _this23 = _possibleConstructorReturn(this, (FileAttachmentAnnotationElement.__proto__ || Object.getPrototypeOf(FileAttachmentAnnotationElement)).call(this, parameters, true));
+
+    var _this23$data$file = _this23.data.file,
+        filename = _this23$data$file.filename,
+        content = _this23$data$file.content;
+
+    _this23.filename = (0, _dom_utils.getFilenameFromUrl)(filename);
+    _this23.content = content;
+    if (_this23.linkService.eventBus) {
+      _this23.linkService.eventBus.dispatch('fileattachmentannotation', {
+        source: _this23,
+        id: (0, _util.stringToPDFString)(filename),
+        filename: filename,
+        content: content
+      });
+    }
+    return _this23;
+  }
+
+  _createClass(FileAttachmentAnnotationElement, [{
+    key: 'render',
+    value: function render() {
+      this.container.className = 'fileAttachmentAnnotation';
+      var trigger = document.createElement('div');
+      trigger.style.height = this.container.style.height;
+      trigger.style.width = this.container.style.width;
+      trigger.addEventListener('dblclick', this._download.bind(this));
+      if (!this.data.hasPopup && (this.data.title || this.data.contents)) {
+        this._createPopup(this.container, trigger, this.data);
+      }
+      this.container.appendChild(trigger);
+      return this.container;
+    }
+  }, {
+    key: '_download',
+    value: function _download() {
+      if (!this.downloadManager) {
+        (0, _util.warn)('Download cannot be started due to unavailable download manager');
+        return;
+      }
+      this.downloadManager.downloadData(this.content, this.filename, '');
+    }
+  }]);
+
+  return FileAttachmentAnnotationElement;
+}(AnnotationElement);
+
+var AnnotationLayer = function () {
+  function AnnotationLayer() {
+    _classCallCheck(this, AnnotationLayer);
+  }
+
+  _createClass(AnnotationLayer, null, [{
+    key: 'render',
+    value: function render(parameters) {
+      for (var i = 0, ii = parameters.annotations.length; i < ii; i++) {
+        var data = parameters.annotations[i];
+        if (!data) {
+          continue;
+        }
+        var element = AnnotationElementFactory.create({
+          data: data,
+          layer: parameters.div,
+          page: parameters.page,
+          viewport: parameters.viewport,
+          linkService: parameters.linkService,
+          downloadManager: parameters.downloadManager,
+          imageResourcesPath: parameters.imageResourcesPath || '',
+          renderInteractiveForms: parameters.renderInteractiveForms || false,
+          svgFactory: new _dom_utils.DOMSVGFactory()
+        });
+        if (element.isRenderable) {
+          parameters.div.appendChild(element.render());
+        }
+      }
+    }
+  }, {
+    key: 'update',
+    value: function update(parameters) {
+      for (var i = 0, ii = parameters.annotations.length; i < ii; i++) {
+        var data = parameters.annotations[i];
+        var element = parameters.div.querySelector('[data-annotation-id="' + data.id + '"]');
+        if (element) {
+          element.style.transform = 'matrix(' + parameters.viewport.transform.join(',') + ')';
+        }
+      }
+      parameters.div.removeAttribute('hidden');
+    }
+  }]);
+
+  return AnnotationLayer;
+}();
+
+exports.AnnotationLayer = AnnotationLayer;
+
+/***/ }),
+/* 147 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.SVGGraphics = undefined;
+
+var _util = __w_pdfjs_require__(1);
+
+var _dom_utils = __w_pdfjs_require__(130);
+
+var _is_node = __w_pdfjs_require__(4);
+
+var _is_node2 = _interopRequireDefault(_is_node);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var SVGGraphics = function SVGGraphics() {
+  throw new Error('Not implemented: SVGGraphics');
+};
+{
+  var SVG_DEFAULTS = {
+    fontStyle: 'normal',
+    fontWeight: 'normal',
+    fillColor: '#000000'
+  };
+  var convertImgDataToPng = function convertImgDataToPngClosure() {
+    var PNG_HEADER = new Uint8Array([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);
+    var CHUNK_WRAPPER_SIZE = 12;
+    var crcTable = new Int32Array(256);
+    for (var i = 0; i < 256; i++) {
+      var c = i;
+      for (var h = 0; h < 8; h++) {
+        if (c & 1) {
+          c = 0xedB88320 ^ c >> 1 & 0x7fffffff;
+        } else {
+          c = c >> 1 & 0x7fffffff;
+        }
+      }
+      crcTable[i] = c;
+    }
+    function crc32(data, start, end) {
+      var crc = -1;
+      for (var i = start; i < end; i++) {
+        var a = (crc ^ data[i]) & 0xff;
+        var b = crcTable[a];
+        crc = crc >>> 8 ^ b;
+      }
+      return crc ^ -1;
+    }
+    function writePngChunk(type, body, data, offset) {
+      var p = offset;
+      var len = body.length;
+      data[p] = len >> 24 & 0xff;
+      data[p + 1] = len >> 16 & 0xff;
+      data[p + 2] = len >> 8 & 0xff;
+      data[p + 3] = len & 0xff;
+      p += 4;
+      data[p] = type.charCodeAt(0) & 0xff;
+      data[p + 1] = type.charCodeAt(1) & 0xff;
+      data[p + 2] = type.charCodeAt(2) & 0xff;
+      data[p + 3] = type.charCodeAt(3) & 0xff;
+      p += 4;
+      data.set(body, p);
+      p += body.length;
+      var crc = crc32(data, offset + 4, p);
+      data[p] = crc >> 24 & 0xff;
+      data[p + 1] = crc >> 16 & 0xff;
+      data[p + 2] = crc >> 8 & 0xff;
+      data[p + 3] = crc & 0xff;
+    }
+    function adler32(data, start, end) {
+      var a = 1;
+      var b = 0;
+      for (var i = start; i < end; ++i) {
+        a = (a + (data[i] & 0xff)) % 65521;
+        b = (b + a) % 65521;
+      }
+      return b << 16 | a;
+    }
+    function deflateSync(literals) {
+      if (!(0, _is_node2.default)()) {
+        return deflateSyncUncompressed(literals);
+      }
+      try {
+        var input;
+        if (parseInt(process.versions.node) >= 8) {
+          input = literals;
+        } else {
+          input = new Buffer(literals);
+        }
+        var output = require('zlib').deflateSync(input, { level: 9 });
+        return output instanceof Uint8Array ? output : new Uint8Array(output);
+      } catch (e) {
+        (0, _util.warn)('Not compressing PNG because zlib.deflateSync is unavailable: ' + e);
+      }
+      return deflateSyncUncompressed(literals);
+    }
+    function deflateSyncUncompressed(literals) {
+      var len = literals.length;
+      var maxBlockLength = 0xFFFF;
+      var deflateBlocks = Math.ceil(len / maxBlockLength);
+      var idat = new Uint8Array(2 + len + deflateBlocks * 5 + 4);
+      var pi = 0;
+      idat[pi++] = 0x78;
+      idat[pi++] = 0x9c;
+      var pos = 0;
+      while (len > maxBlockLength) {
+        idat[pi++] = 0x00;
+        idat[pi++] = 0xff;
+        idat[pi++] = 0xff;
+        idat[pi++] = 0x00;
+        idat[pi++] = 0x00;
+        idat.set(literals.subarray(pos, pos + maxBlockLength), pi);
+        pi += maxBlockLength;
+        pos += maxBlockLength;
+        len -= maxBlockLength;
+      }
+      idat[pi++] = 0x01;
+      idat[pi++] = len & 0xff;
+      idat[pi++] = len >> 8 & 0xff;
+      idat[pi++] = ~len & 0xffff & 0xff;
+      idat[pi++] = (~len & 0xffff) >> 8 & 0xff;
+      idat.set(literals.subarray(pos), pi);
+      pi += literals.length - pos;
+      var adler = adler32(literals, 0, literals.length);
+      idat[pi++] = adler >> 24 & 0xff;
+      idat[pi++] = adler >> 16 & 0xff;
+      idat[pi++] = adler >> 8 & 0xff;
+      idat[pi++] = adler & 0xff;
+      return idat;
+    }
+    function encode(imgData, kind, forceDataSchema, isMask) {
+      var width = imgData.width;
+      var height = imgData.height;
+      var bitDepth, colorType, lineSize;
+      var bytes = imgData.data;
+      switch (kind) {
+        case _util.ImageKind.GRAYSCALE_1BPP:
+          colorType = 0;
+          bitDepth = 1;
+          lineSize = width + 7 >> 3;
+          break;
+        case _util.ImageKind.RGB_24BPP:
+          colorType = 2;
+          bitDepth = 8;
+          lineSize = width * 3;
+          break;
+        case _util.ImageKind.RGBA_32BPP:
+          colorType = 6;
+          bitDepth = 8;
+          lineSize = width * 4;
+          break;
+        default:
+          throw new Error('invalid format');
+      }
+      var literals = new Uint8Array((1 + lineSize) * height);
+      var offsetLiterals = 0,
+          offsetBytes = 0;
+      var y, i;
+      for (y = 0; y < height; ++y) {
+        literals[offsetLiterals++] = 0;
+        literals.set(bytes.subarray(offsetBytes, offsetBytes + lineSize), offsetLiterals);
+        offsetBytes += lineSize;
+        offsetLiterals += lineSize;
+      }
+      if (kind === _util.ImageKind.GRAYSCALE_1BPP && isMask) {
+        offsetLiterals = 0;
+        for (y = 0; y < height; y++) {
+          offsetLiterals++;
+          for (i = 0; i < lineSize; i++) {
+            literals[offsetLiterals++] ^= 0xFF;
+          }
+        }
+      }
+      var ihdr = new Uint8Array([width >> 24 & 0xff, width >> 16 & 0xff, width >> 8 & 0xff, width & 0xff, height >> 24 & 0xff, height >> 16 & 0xff, height >> 8 & 0xff, height & 0xff, bitDepth, colorType, 0x00, 0x00, 0x00]);
+      var idat = deflateSync(literals);
+      var pngLength = PNG_HEADER.length + CHUNK_WRAPPER_SIZE * 3 + ihdr.length + idat.length;
+      var data = new Uint8Array(pngLength);
+      var offset = 0;
+      data.set(PNG_HEADER, offset);
+      offset += PNG_HEADER.length;
+      writePngChunk('IHDR', ihdr, data, offset);
+      offset += CHUNK_WRAPPER_SIZE + ihdr.length;
+      writePngChunk('IDATA', idat, data, offset);
+      offset += CHUNK_WRAPPER_SIZE + idat.length;
+      writePngChunk('IEND', new Uint8Array(0), data, offset);
+      return (0, _util.createObjectURL)(data, 'image/png', forceDataSchema);
+    }
+    return function convertImgDataToPng(imgData, forceDataSchema, isMask) {
+      var kind = imgData.kind === undefined ? _util.ImageKind.GRAYSCALE_1BPP : imgData.kind;
+      return encode(imgData, kind, forceDataSchema, isMask);
+    };
+  }();
+  var SVGExtraState = function SVGExtraStateClosure() {
+    function SVGExtraState() {
+      this.fontSizeScale = 1;
+      this.fontWeight = SVG_DEFAULTS.fontWeight;
+      this.fontSize = 0;
+      this.textMatrix = _util.IDENTITY_MATRIX;
+      this.fontMatrix = _util.FONT_IDENTITY_MATRIX;
+      this.leading = 0;
+      this.textRenderingMode = _util.TextRenderingMode.FILL;
+      this.x = 0;
+      this.y = 0;
+      this.lineX = 0;
+      this.lineY = 0;
+      this.charSpacing = 0;
+      this.wordSpacing = 0;
+      this.textHScale = 1;
+      this.textRise = 0;
+      this.fillColor = SVG_DEFAULTS.fillColor;
+      this.strokeColor = '#000000';
+      this.fillAlpha = 1;
+      this.strokeAlpha = 1;
+      this.lineWidth = 1;
+      this.lineJoin = '';
+      this.lineCap = '';
+      this.miterLimit = 0;
+      this.dashArray = [];
+      this.dashPhase = 0;
+      this.dependencies = [];
+      this.activeClipUrl = null;
+      this.clipGroup = null;
+      this.maskId = '';
+    }
+    SVGExtraState.prototype = {
+      clone: function SVGExtraState_clone() {
+        return Object.create(this);
+      },
+      setCurrentPoint: function SVGExtraState_setCurrentPoint(x, y) {
+        this.x = x;
+        this.y = y;
+      }
+    };
+    return SVGExtraState;
+  }();
+  exports.SVGGraphics = SVGGraphics = function SVGGraphicsClosure() {
+    function opListToTree(opList) {
+      var opTree = [];
+      var tmp = [];
+      var opListLen = opList.length;
+      for (var x = 0; x < opListLen; x++) {
+        if (opList[x].fn === 'save') {
+          opTree.push({
+            'fnId': 92,
+            'fn': 'group',
+            'items': []
+          });
+          tmp.push(opTree);
+          opTree = opTree[opTree.length - 1].items;
+          continue;
+        }
+        if (opList[x].fn === 'restore') {
+          opTree = tmp.pop();
+        } else {
+          opTree.push(opList[x]);
+        }
+      }
+      return opTree;
+    }
+    function pf(value) {
+      if (Number.isInteger(value)) {
+        return value.toString();
+      }
+      var s = value.toFixed(10);
+      var i = s.length - 1;
+      if (s[i] !== '0') {
+        return s;
+      }
+      do {
+        i--;
+      } while (s[i] === '0');
+      return s.substring(0, s[i] === '.' ? i : i + 1);
+    }
+    function pm(m) {
+      if (m[4] === 0 && m[5] === 0) {
+        if (m[1] === 0 && m[2] === 0) {
+          if (m[0] === 1 && m[3] === 1) {
+            return '';
+          }
+          return 'scale(' + pf(m[0]) + ' ' + pf(m[3]) + ')';
+        }
+        if (m[0] === m[3] && m[1] === -m[2]) {
+          var a = Math.acos(m[0]) * 180 / Math.PI;
+          return 'rotate(' + pf(a) + ')';
+        }
+      } else {
+        if (m[0] === 1 && m[1] === 0 && m[2] === 0 && m[3] === 1) {
+          return 'translate(' + pf(m[4]) + ' ' + pf(m[5]) + ')';
+        }
+      }
+      return 'matrix(' + pf(m[0]) + ' ' + pf(m[1]) + ' ' + pf(m[2]) + ' ' + pf(m[3]) + ' ' + pf(m[4]) + ' ' + pf(m[5]) + ')';
+    }
+    function SVGGraphics(commonObjs, objs, forceDataSchema) {
+      this.svgFactory = new _dom_utils.DOMSVGFactory();
+      this.current = new SVGExtraState();
+      this.transformMatrix = _util.IDENTITY_MATRIX;
+      this.transformStack = [];
+      this.extraStack = [];
+      this.commonObjs = commonObjs;
+      this.objs = objs;
+      this.pendingClip = null;
+      this.pendingEOFill = false;
+      this.embedFonts = false;
+      this.embeddedFonts = Object.create(null);
+      this.cssStyle = null;
+      this.forceDataSchema = !!forceDataSchema;
+    }
+    var XML_NS = 'http://www.w3.org/XML/1998/namespace';
+    var XLINK_NS = 'http://www.w3.org/1999/xlink';
+    var LINE_CAP_STYLES = ['butt', 'round', 'square'];
+    var LINE_JOIN_STYLES = ['miter', 'round', 'bevel'];
+    var clipCount = 0;
+    var maskCount = 0;
+    SVGGraphics.prototype = {
+      save: function SVGGraphics_save() {
+        this.transformStack.push(this.transformMatrix);
+        var old = this.current;
+        this.extraStack.push(old);
+        this.current = old.clone();
+      },
+      restore: function SVGGraphics_restore() {
+        this.transformMatrix = this.transformStack.pop();
+        this.current = this.extraStack.pop();
+        this.pendingClip = null;
+        this.tgrp = null;
+      },
+      group: function SVGGraphics_group(items) {
+        this.save();
+        this.executeOpTree(items);
+        this.restore();
+      },
+      loadDependencies: function SVGGraphics_loadDependencies(operatorList) {
+        var _this = this;
+
+        var fnArray = operatorList.fnArray;
+        var fnArrayLen = fnArray.length;
+        var argsArray = operatorList.argsArray;
+        for (var i = 0; i < fnArrayLen; i++) {
+          if (_util.OPS.dependency === fnArray[i]) {
+            var deps = argsArray[i];
+            for (var n = 0, nn = deps.length; n < nn; n++) {
+              var obj = deps[n];
+              var common = obj.substring(0, 2) === 'g_';
+              var promise;
+              if (common) {
+                promise = new Promise(function (resolve) {
+                  _this.commonObjs.get(obj, resolve);
+                });
+              } else {
+                promise = new Promise(function (resolve) {
+                  _this.objs.get(obj, resolve);
+                });
+              }
+              this.current.dependencies.push(promise);
+            }
+          }
+        }
+        return Promise.all(this.current.dependencies);
+      },
+      transform: function SVGGraphics_transform(a, b, c, d, e, f) {
+        var transformMatrix = [a, b, c, d, e, f];
+        this.transformMatrix = _util.Util.transform(this.transformMatrix, transformMatrix);
+        this.tgrp = null;
+      },
+      getSVG: function SVGGraphics_getSVG(operatorList, viewport) {
+        var _this2 = this;
+
+        this.viewport = viewport;
+        var svgElement = this._initialize(viewport);
+        return this.loadDependencies(operatorList).then(function () {
+          _this2.transformMatrix = _util.IDENTITY_MATRIX;
+          var opTree = _this2.convertOpList(operatorList);
+          _this2.executeOpTree(opTree);
+          return svgElement;
+        });
+      },
+      convertOpList: function SVGGraphics_convertOpList(operatorList) {
+        var argsArray = operatorList.argsArray;
+        var fnArray = operatorList.fnArray;
+        var fnArrayLen = fnArray.length;
+        var REVOPS = [];
+        var opList = [];
+        for (var op in _util.OPS) {
+          REVOPS[_util.OPS[op]] = op;
+        }
+        for (var x = 0; x < fnArrayLen; x++) {
+          var fnId = fnArray[x];
+          opList.push({
+            'fnId': fnId,
+            'fn': REVOPS[fnId],
+            'args': argsArray[x]
+          });
+        }
+        return opListToTree(opList);
+      },
+      executeOpTree: function SVGGraphics_executeOpTree(opTree) {
+        var opTreeLen = opTree.length;
+        for (var x = 0; x < opTreeLen; x++) {
+          var fn = opTree[x].fn;
+          var fnId = opTree[x].fnId;
+          var args = opTree[x].args;
+          switch (fnId | 0) {
+            case _util.OPS.beginText:
+              this.beginText();
+              break;
+            case _util.OPS.dependency:
+              break;
+            case _util.OPS.setLeading:
+              this.setLeading(args);
+              break;
+            case _util.OPS.setLeadingMoveText:
+              this.setLeadingMoveText(args[0], args[1]);
+              break;
+            case _util.OPS.setFont:
+              this.setFont(args);
+              break;
+            case _util.OPS.showText:
+              this.showText(args[0]);
+              break;
+            case _util.OPS.showSpacedText:
+              this.showText(args[0]);
+              break;
+            case _util.OPS.endText:
+              this.endText();
+              break;
+            case _util.OPS.moveText:
+              this.moveText(args[0], args[1]);
+              break;
+            case _util.OPS.setCharSpacing:
+              this.setCharSpacing(args[0]);
+              break;
+            case _util.OPS.setWordSpacing:
+              this.setWordSpacing(args[0]);
+              break;
+            case _util.OPS.setHScale:
+              this.setHScale(args[0]);
+              break;
+            case _util.OPS.setTextMatrix:
+              this.setTextMatrix(args[0], args[1], args[2], args[3], args[4], args[5]);
+              break;
+            case _util.OPS.setTextRise:
+              this.setTextRise(args[0]);
+              break;
+            case _util.OPS.setTextRenderingMode:
+              this.setTextRenderingMode(args[0]);
+              break;
+            case _util.OPS.setLineWidth:
+              this.setLineWidth(args[0]);
+              break;
+            case _util.OPS.setLineJoin:
+              this.setLineJoin(args[0]);
+              break;
+            case _util.OPS.setLineCap:
+              this.setLineCap(args[0]);
+              break;
+            case _util.OPS.setMiterLimit:
+              this.setMiterLimit(args[0]);
+              break;
+            case _util.OPS.setFillRGBColor:
+              this.setFillRGBColor(args[0], args[1], args[2]);
+              break;
+            case _util.OPS.setStrokeRGBColor:
+              this.setStrokeRGBColor(args[0], args[1], args[2]);
+              break;
+            case _util.OPS.setDash:
+              this.setDash(args[0], args[1]);
+              break;
+            case _util.OPS.setGState:
+              this.setGState(args[0]);
+              break;
+            case _util.OPS.fill:
+              this.fill();
+              break;
+            case _util.OPS.eoFill:
+              this.eoFill();
+              break;
+            case _util.OPS.stroke:
+              this.stroke();
+              break;
+            case _util.OPS.fillStroke:
+              this.fillStroke();
+              break;
+            case _util.OPS.eoFillStroke:
+              this.eoFillStroke();
+              break;
+            case _util.OPS.clip:
+              this.clip('nonzero');
+              break;
+            case _util.OPS.eoClip:
+              this.clip('evenodd');
+              break;
+            case _util.OPS.paintSolidColorImageMask:
+              this.paintSolidColorImageMask();
+              break;
+            case _util.OPS.paintJpegXObject:
+              this.paintJpegXObject(args[0], args[1], args[2]);
+              break;
+            case _util.OPS.paintImageXObject:
+              this.paintImageXObject(args[0]);
+              break;
+            case _util.OPS.paintInlineImageXObject:
+              this.paintInlineImageXObject(args[0]);
+              break;
+            case _util.OPS.paintImageMaskXObject:
+              this.paintImageMaskXObject(args[0]);
+              break;
+            case _util.OPS.paintFormXObjectBegin:
+              this.paintFormXObjectBegin(args[0], args[1]);
+              break;
+            case _util.OPS.paintFormXObjectEnd:
+              this.paintFormXObjectEnd();
+              break;
+            case _util.OPS.closePath:
+              this.closePath();
+              break;
+            case _util.OPS.closeStroke:
+              this.closeStroke();
+              break;
+            case _util.OPS.closeFillStroke:
+              this.closeFillStroke();
+              break;
+            case _util.OPS.closeEOFillStroke:
+              this.closeEOFillStroke();
+              break;
+            case _util.OPS.nextLine:
+              this.nextLine();
+              break;
+            case _util.OPS.transform:
+              this.transform(args[0], args[1], args[2], args[3], args[4], args[5]);
+              break;
+            case _util.OPS.constructPath:
+              this.constructPath(args[0], args[1]);
+              break;
+            case _util.OPS.endPath:
+              this.endPath();
+              break;
+            case 92:
+              this.group(opTree[x].items);
+              break;
+            default:
+              (0, _util.warn)('Unimplemented operator ' + fn);
+              break;
+          }
+        }
+      },
+      setWordSpacing: function SVGGraphics_setWordSpacing(wordSpacing) {
+        this.current.wordSpacing = wordSpacing;
+      },
+      setCharSpacing: function SVGGraphics_setCharSpacing(charSpacing) {
+        this.current.charSpacing = charSpacing;
+      },
+      nextLine: function SVGGraphics_nextLine() {
+        this.moveText(0, this.current.leading);
+      },
+      setTextMatrix: function SVGGraphics_setTextMatrix(a, b, c, d, e, f) {
+        var current = this.current;
+        this.current.textMatrix = this.current.lineMatrix = [a, b, c, d, e, f];
+        this.current.x = this.current.lineX = 0;
+        this.current.y = this.current.lineY = 0;
+        current.xcoords = [];
+        current.tspan = this.svgFactory.createElement('svg:tspan');
+        current.tspan.setAttributeNS(null, 'font-family', current.fontFamily);
+        current.tspan.setAttributeNS(null, 'font-size', pf(current.fontSize) + 'px');
+        current.tspan.setAttributeNS(null, 'y', pf(-current.y));
+        current.txtElement = this.svgFactory.createElement('svg:text');
+        current.txtElement.appendChild(current.tspan);
+      },
+      beginText: function SVGGraphics_beginText() {
+        this.current.x = this.current.lineX = 0;
+        this.current.y = this.current.lineY = 0;
+        this.current.textMatrix = _util.IDENTITY_MATRIX;
+        this.current.lineMatrix = _util.IDENTITY_MATRIX;
+        this.current.tspan = this.svgFactory.createElement('svg:tspan');
+        this.current.txtElement = this.svgFactory.createElement('svg:text');
+        this.current.txtgrp = this.svgFactory.createElement('svg:g');
+        this.current.xcoords = [];
+      },
+      moveText: function SVGGraphics_moveText(x, y) {
+        var current = this.current;
+        this.current.x = this.current.lineX += x;
+        this.current.y = this.current.lineY += y;
+        current.xcoords = [];
+        current.tspan = this.svgFactory.createElement('svg:tspan');
+        current.tspan.setAttributeNS(null, 'font-family', current.fontFamily);
+        current.tspan.setAttributeNS(null, 'font-size', pf(current.fontSize) + 'px');
+        current.tspan.setAttributeNS(null, 'y', pf(-current.y));
+      },
+      showText: function SVGGraphics_showText(glyphs) {
+        var current = this.current;
+        var font = current.font;
+        var fontSize = current.fontSize;
+        if (fontSize === 0) {
+          return;
+        }
+        var charSpacing = current.charSpacing;
+        var wordSpacing = current.wordSpacing;
+        var fontDirection = current.fontDirection;
+        var textHScale = current.textHScale * fontDirection;
+        var glyphsLength = glyphs.length;
+        var vertical = font.vertical;
+        var widthAdvanceScale = fontSize * current.fontMatrix[0];
+        var x = 0,
+            i;
+        for (i = 0; i < glyphsLength; ++i) {
+          var glyph = glyphs[i];
+          if (glyph === null) {
+            x += fontDirection * wordSpacing;
+            continue;
+          } else if ((0, _util.isNum)(glyph)) {
+            x += -glyph * fontSize * 0.001;
+            continue;
+          }
+          var width = glyph.width;
+          var character = glyph.fontChar;
+          var spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing;
+          var charWidth = width * widthAdvanceScale + spacing * fontDirection;
+          if (!glyph.isInFont && !font.missingFile) {
+            x += charWidth;
+            continue;
+          }
+          current.xcoords.push(current.x + x * textHScale);
+          current.tspan.textContent += character;
+          x += charWidth;
+        }
+        if (vertical) {
+          current.y -= x * textHScale;
+        } else {
+          current.x += x * textHScale;
+        }
+        current.tspan.setAttributeNS(null, 'x', current.xcoords.map(pf).join(' '));
+        current.tspan.setAttributeNS(null, 'y', pf(-current.y));
+        current.tspan.setAttributeNS(null, 'font-family', current.fontFamily);
+        current.tspan.setAttributeNS(null, 'font-size', pf(current.fontSize) + 'px');
+        if (current.fontStyle !== SVG_DEFAULTS.fontStyle) {
+          current.tspan.setAttributeNS(null, 'font-style', current.fontStyle);
+        }
+        if (current.fontWeight !== SVG_DEFAULTS.fontWeight) {
+          current.tspan.setAttributeNS(null, 'font-weight', current.fontWeight);
+        }
+        var fillStrokeMode = current.textRenderingMode & _util.TextRenderingMode.FILL_STROKE_MASK;
+        if (fillStrokeMode === _util.TextRenderingMode.FILL || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) {
+          if (current.fillColor !== SVG_DEFAULTS.fillColor) {
+            current.tspan.setAttributeNS(null, 'fill', current.fillColor);
+          }
+          if (current.fillAlpha < 1) {
+            current.tspan.setAttributeNS(null, 'fill-opacity', current.fillAlpha);
+          }
+        } else if (current.textRenderingMode === _util.TextRenderingMode.ADD_TO_PATH) {
+          current.tspan.setAttributeNS(null, 'fill', 'transparent');
+        } else {
+          current.tspan.setAttributeNS(null, 'fill', 'none');
+        }
+        if (fillStrokeMode === _util.TextRenderingMode.STROKE || fillStrokeMode === _util.TextRenderingMode.FILL_STROKE) {
+          this._setStrokeAttributes(current.tspan);
+        }
+        var textMatrix = current.textMatrix;
+        if (current.textRise !== 0) {
+          textMatrix = textMatrix.slice();
+          textMatrix[5] += current.textRise;
+        }
+        current.txtElement.setAttributeNS(null, 'transform', pm(textMatrix) + ' scale(1, -1)');
+        current.txtElement.setAttributeNS(XML_NS, 'xml:space', 'preserve');
+        current.txtElement.appendChild(current.tspan);
+        current.txtgrp.appendChild(current.txtElement);
+        this._ensureTransformGroup().appendChild(current.txtElement);
+      },
+      setLeadingMoveText: function SVGGraphics_setLeadingMoveText(x, y) {
+        this.setLeading(-y);
+        this.moveText(x, y);
+      },
+      addFontStyle: function SVGGraphics_addFontStyle(fontObj) {
+        if (!this.cssStyle) {
+          this.cssStyle = this.svgFactory.createElement('svg:style');
+          this.cssStyle.setAttributeNS(null, 'type', 'text/css');
+          this.defs.appendChild(this.cssStyle);
+        }
+        var url = (0, _util.createObjectURL)(fontObj.data, fontObj.mimetype, this.forceDataSchema);
+        this.cssStyle.textContent += '@font-face { font-family: "' + fontObj.loadedName + '";' + ' src: url(' + url + '); }\n';
+      },
+      setFont: function SVGGraphics_setFont(details) {
+        var current = this.current;
+        var fontObj = this.commonObjs.get(details[0]);
+        var size = details[1];
+        this.current.font = fontObj;
+        if (this.embedFonts && fontObj.data && !this.embeddedFonts[fontObj.loadedName]) {
+          this.addFontStyle(fontObj);
+          this.embeddedFonts[fontObj.loadedName] = fontObj;
+        }
+        current.fontMatrix = fontObj.fontMatrix ? fontObj.fontMatrix : _util.FONT_IDENTITY_MATRIX;
+        var bold = fontObj.black ? fontObj.bold ? 'bolder' : 'bold' : fontObj.bold ? 'bold' : 'normal';
+        var italic = fontObj.italic ? 'italic' : 'normal';
+        if (size < 0) {
+          size = -size;
+          current.fontDirection = -1;
+        } else {
+          current.fontDirection = 1;
+        }
+        current.fontSize = size;
+        current.fontFamily = fontObj.loadedName;
+        current.fontWeight = bold;
+        current.fontStyle = italic;
+        current.tspan = this.svgFactory.createElement('svg:tspan');
+        current.tspan.setAttributeNS(null, 'y', pf(-current.y));
+        current.xcoords = [];
+      },
+      endText: function endText() {
+        var current = this.current;
+        if (current.textRenderingMode & _util.TextRenderingMode.ADD_TO_PATH_FLAG && current.txtElement && current.txtElement.hasChildNodes()) {
+          current.element = current.txtElement;
+          this.clip('nonzero');
+          this.endPath();
+        }
+      },
+
+      setLineWidth: function SVGGraphics_setLineWidth(width) {
+        this.current.lineWidth = width;
+      },
+      setLineCap: function SVGGraphics_setLineCap(style) {
+        this.current.lineCap = LINE_CAP_STYLES[style];
+      },
+      setLineJoin: function SVGGraphics_setLineJoin(style) {
+        this.current.lineJoin = LINE_JOIN_STYLES[style];
+      },
+      setMiterLimit: function SVGGraphics_setMiterLimit(limit) {
+        this.current.miterLimit = limit;
+      },
+      setStrokeAlpha: function SVGGraphics_setStrokeAlpha(strokeAlpha) {
+        this.current.strokeAlpha = strokeAlpha;
+      },
+      setStrokeRGBColor: function SVGGraphics_setStrokeRGBColor(r, g, b) {
+        var color = _util.Util.makeCssRgb(r, g, b);
+        this.current.strokeColor = color;
+      },
+      setFillAlpha: function SVGGraphics_setFillAlpha(fillAlpha) {
+        this.current.fillAlpha = fillAlpha;
+      },
+      setFillRGBColor: function SVGGraphics_setFillRGBColor(r, g, b) {
+        var color = _util.Util.makeCssRgb(r, g, b);
+        this.current.fillColor = color;
+        this.current.tspan = this.svgFactory.createElement('svg:tspan');
+        this.current.xcoords = [];
+      },
+      setDash: function SVGGraphics_setDash(dashArray, dashPhase) {
+        this.current.dashArray = dashArray;
+        this.current.dashPhase = dashPhase;
+      },
+      constructPath: function SVGGraphics_constructPath(ops, args) {
+        var current = this.current;
+        var x = current.x,
+            y = current.y;
+        current.path = this.svgFactory.createElement('svg:path');
+        var d = [];
+        var opLength = ops.length;
+        for (var i = 0, j = 0; i < opLength; i++) {
+          switch (ops[i] | 0) {
+            case _util.OPS.rectangle:
+              x = args[j++];
+              y = args[j++];
+              var width = args[j++];
+              var height = args[j++];
+              var xw = x + width;
+              var yh = y + height;
+              d.push('M', pf(x), pf(y), 'L', pf(xw), pf(y), 'L', pf(xw), pf(yh), 'L', pf(x), pf(yh), 'Z');
+              break;
+            case _util.OPS.moveTo:
+              x = args[j++];
+              y = args[j++];
+              d.push('M', pf(x), pf(y));
+              break;
+            case _util.OPS.lineTo:
+              x = args[j++];
+              y = args[j++];
+              d.push('L', pf(x), pf(y));
+              break;
+            case _util.OPS.curveTo:
+              x = args[j + 4];
+              y = args[j + 5];
+              d.push('C', pf(args[j]), pf(args[j + 1]), pf(args[j + 2]), pf(args[j + 3]), pf(x), pf(y));
+              j += 6;
+              break;
+            case _util.OPS.curveTo2:
+              x = args[j + 2];
+              y = args[j + 3];
+              d.push('C', pf(x), pf(y), pf(args[j]), pf(args[j + 1]), pf(args[j + 2]), pf(args[j + 3]));
+              j += 4;
+              break;
+            case _util.OPS.curveTo3:
+              x = args[j + 2];
+              y = args[j + 3];
+              d.push('C', pf(args[j]), pf(args[j + 1]), pf(x), pf(y), pf(x), pf(y));
+              j += 4;
+              break;
+            case _util.OPS.closePath:
+              d.push('Z');
+              break;
+          }
+        }
+        current.path.setAttributeNS(null, 'd', d.join(' '));
+        current.path.setAttributeNS(null, 'fill', 'none');
+        this._ensureTransformGroup().appendChild(current.path);
+        current.element = current.path;
+        current.setCurrentPoint(x, y);
+      },
+      endPath: function SVGGraphics_endPath() {
+        if (!this.pendingClip) {
+          return;
+        }
+        var current = this.current;
+        var clipId = 'clippath' + clipCount;
+        clipCount++;
+        var clipPath = this.svgFactory.createElement('svg:clipPath');
+        clipPath.setAttributeNS(null, 'id', clipId);
+        clipPath.setAttributeNS(null, 'transform', pm(this.transformMatrix));
+        var clipElement = current.element.cloneNode(true);
+        if (this.pendingClip === 'evenodd') {
+          clipElement.setAttributeNS(null, 'clip-rule', 'evenodd');
+        } else {
+          clipElement.setAttributeNS(null, 'clip-rule', 'nonzero');
+        }
+        this.pendingClip = null;
+        clipPath.appendChild(clipElement);
+        this.defs.appendChild(clipPath);
+        if (current.activeClipUrl) {
+          current.clipGroup = null;
+          this.extraStack.forEach(function (prev) {
+            prev.clipGroup = null;
+          });
+          clipPath.setAttributeNS(null, 'clip-path', current.activeClipUrl);
+        }
+        current.activeClipUrl = 'url(#' + clipId + ')';
+        this.tgrp = null;
+      },
+      clip: function SVGGraphics_clip(type) {
+        this.pendingClip = type;
+      },
+      closePath: function SVGGraphics_closePath() {
+        var current = this.current;
+        if (current.path) {
+          var d = current.path.getAttributeNS(null, 'd');
+          d += 'Z';
+          current.path.setAttributeNS(null, 'd', d);
+        }
+      },
+      setLeading: function SVGGraphics_setLeading(leading) {
+        this.current.leading = -leading;
+      },
+      setTextRise: function SVGGraphics_setTextRise(textRise) {
+        this.current.textRise = textRise;
+      },
+      setTextRenderingMode: function setTextRenderingMode(textRenderingMode) {
+        this.current.textRenderingMode = textRenderingMode;
+      },
+
+      setHScale: function SVGGraphics_setHScale(scale) {
+        this.current.textHScale = scale / 100;
+      },
+      setGState: function SVGGraphics_setGState(states) {
+        for (var i = 0, ii = states.length; i < ii; i++) {
+          var state = states[i];
+          var key = state[0];
+          var value = state[1];
+          switch (key) {
+            case 'LW':
+              this.setLineWidth(value);
+              break;
+            case 'LC':
+              this.setLineCap(value);
+              break;
+            case 'LJ':
+              this.setLineJoin(value);
+              break;
+            case 'ML':
+              this.setMiterLimit(value);
+              break;
+            case 'D':
+              this.setDash(value[0], value[1]);
+              break;
+            case 'Font':
+              this.setFont(value);
+              break;
+            case 'CA':
+              this.setStrokeAlpha(value);
+              break;
+            case 'ca':
+              this.setFillAlpha(value);
+              break;
+            default:
+              (0, _util.warn)('Unimplemented graphic state ' + key);
+              break;
+          }
+        }
+      },
+      fill: function SVGGraphics_fill() {
+        var current = this.current;
+        if (current.element) {
+          current.element.setAttributeNS(null, 'fill', current.fillColor);
+          current.element.setAttributeNS(null, 'fill-opacity', current.fillAlpha);
+          this.endPath();
+        }
+      },
+      stroke: function SVGGraphics_stroke() {
+        var current = this.current;
+        if (current.element) {
+          this._setStrokeAttributes(current.element);
+          current.element.setAttributeNS(null, 'fill', 'none');
+          this.endPath();
+        }
+      },
+      _setStrokeAttributes: function _setStrokeAttributes(element) {
+        var current = this.current;
+        element.setAttributeNS(null, 'stroke', current.strokeColor);
+        element.setAttributeNS(null, 'stroke-opacity', current.strokeAlpha);
+        element.setAttributeNS(null, 'stroke-miterlimit', pf(current.miterLimit));
+        element.setAttributeNS(null, 'stroke-linecap', current.lineCap);
+        element.setAttributeNS(null, 'stroke-linejoin', current.lineJoin);
+        element.setAttributeNS(null, 'stroke-width', pf(current.lineWidth) + 'px');
+        element.setAttributeNS(null, 'stroke-dasharray', current.dashArray.map(pf).join(' '));
+        element.setAttributeNS(null, 'stroke-dashoffset', pf(current.dashPhase) + 'px');
+      },
+
+      eoFill: function SVGGraphics_eoFill() {
+        if (this.current.element) {
+          this.current.element.setAttributeNS(null, 'fill-rule', 'evenodd');
+        }
+        this.fill();
+      },
+      fillStroke: function SVGGraphics_fillStroke() {
+        this.stroke();
+        this.fill();
+      },
+      eoFillStroke: function SVGGraphics_eoFillStroke() {
+        if (this.current.element) {
+          this.current.element.setAttributeNS(null, 'fill-rule', 'evenodd');
+        }
+        this.fillStroke();
+      },
+      closeStroke: function SVGGraphics_closeStroke() {
+        this.closePath();
+        this.stroke();
+      },
+      closeFillStroke: function SVGGraphics_closeFillStroke() {
+        this.closePath();
+        this.fillStroke();
+      },
+      closeEOFillStroke: function closeEOFillStroke() {
+        this.closePath();
+        this.eoFillStroke();
+      },
+
+      paintSolidColorImageMask: function SVGGraphics_paintSolidColorImageMask() {
+        var current = this.current;
+        var rect = this.svgFactory.createElement('svg:rect');
+        rect.setAttributeNS(null, 'x', '0');
+        rect.setAttributeNS(null, 'y', '0');
+        rect.setAttributeNS(null, 'width', '1px');
+        rect.setAttributeNS(null, 'height', '1px');
+        rect.setAttributeNS(null, 'fill', current.fillColor);
+        this._ensureTransformGroup().appendChild(rect);
+      },
+      paintJpegXObject: function SVGGraphics_paintJpegXObject(objId, w, h) {
+        var imgObj = this.objs.get(objId);
+        var imgEl = this.svgFactory.createElement('svg:image');
+        imgEl.setAttributeNS(XLINK_NS, 'xlink:href', imgObj.src);
+        imgEl.setAttributeNS(null, 'width', pf(w));
+        imgEl.setAttributeNS(null, 'height', pf(h));
+        imgEl.setAttributeNS(null, 'x', '0');
+        imgEl.setAttributeNS(null, 'y', pf(-h));
+        imgEl.setAttributeNS(null, 'transform', 'scale(' + pf(1 / w) + ' ' + pf(-1 / h) + ')');
+        this._ensureTransformGroup().appendChild(imgEl);
+      },
+      paintImageXObject: function SVGGraphics_paintImageXObject(objId) {
+        var imgData = this.objs.get(objId);
+        if (!imgData) {
+          (0, _util.warn)('Dependent image isn\'t ready yet');
+          return;
+        }
+        this.paintInlineImageXObject(imgData);
+      },
+      paintInlineImageXObject: function SVGGraphics_paintInlineImageXObject(imgData, mask) {
+        var width = imgData.width;
+        var height = imgData.height;
+        var imgSrc = convertImgDataToPng(imgData, this.forceDataSchema, !!mask);
+        var cliprect = this.svgFactory.createElement('svg:rect');
+        cliprect.setAttributeNS(null, 'x', '0');
+        cliprect.setAttributeNS(null, 'y', '0');
+        cliprect.setAttributeNS(null, 'width', pf(width));
+        cliprect.setAttributeNS(null, 'height', pf(height));
+        this.current.element = cliprect;
+        this.clip('nonzero');
+        var imgEl = this.svgFactory.createElement('svg:image');
+        imgEl.setAttributeNS(XLINK_NS, 'xlink:href', imgSrc);
+        imgEl.setAttributeNS(null, 'x', '0');
+        imgEl.setAttributeNS(null, 'y', pf(-height));
+        imgEl.setAttributeNS(null, 'width', pf(width) + 'px');
+        imgEl.setAttributeNS(null, 'height', pf(height) + 'px');
+        imgEl.setAttributeNS(null, 'transform', 'scale(' + pf(1 / width) + ' ' + pf(-1 / height) + ')');
+        if (mask) {
+          mask.appendChild(imgEl);
+        } else {
+          this._ensureTransformGroup().appendChild(imgEl);
+        }
+      },
+      paintImageMaskXObject: function SVGGraphics_paintImageMaskXObject(imgData) {
+        var current = this.current;
+        var width = imgData.width;
+        var height = imgData.height;
+        var fillColor = current.fillColor;
+        current.maskId = 'mask' + maskCount++;
+        var mask = this.svgFactory.createElement('svg:mask');
+        mask.setAttributeNS(null, 'id', current.maskId);
+        var rect = this.svgFactory.createElement('svg:rect');
+        rect.setAttributeNS(null, 'x', '0');
+        rect.setAttributeNS(null, 'y', '0');
+        rect.setAttributeNS(null, 'width', pf(width));
+        rect.setAttributeNS(null, 'height', pf(height));
+        rect.setAttributeNS(null, 'fill', fillColor);
+        rect.setAttributeNS(null, 'mask', 'url(#' + current.maskId + ')');
+        this.defs.appendChild(mask);
+        this._ensureTransformGroup().appendChild(rect);
+        this.paintInlineImageXObject(imgData, mask);
+      },
+      paintFormXObjectBegin: function SVGGraphics_paintFormXObjectBegin(matrix, bbox) {
+        if (Array.isArray(matrix) && matrix.length === 6) {
+          this.transform(matrix[0], matrix[1], matrix[2], matrix[3], matrix[4], matrix[5]);
+        }
+        if (Array.isArray(bbox) && bbox.length === 4) {
+          var width = bbox[2] - bbox[0];
+          var height = bbox[3] - bbox[1];
+          var cliprect = this.svgFactory.createElement('svg:rect');
+          cliprect.setAttributeNS(null, 'x', bbox[0]);
+          cliprect.setAttributeNS(null, 'y', bbox[1]);
+          cliprect.setAttributeNS(null, 'width', pf(width));
+          cliprect.setAttributeNS(null, 'height', pf(height));
+          this.current.element = cliprect;
+          this.clip('nonzero');
+          this.endPath();
+        }
+      },
+      paintFormXObjectEnd: function SVGGraphics_paintFormXObjectEnd() {},
+      _initialize: function _initialize(viewport) {
+        var svg = this.svgFactory.create(viewport.width, viewport.height);
+        var definitions = this.svgFactory.createElement('svg:defs');
+        svg.appendChild(definitions);
+        this.defs = definitions;
+        var rootGroup = this.svgFactory.createElement('svg:g');
+        rootGroup.setAttributeNS(null, 'transform', pm(viewport.transform));
+        svg.appendChild(rootGroup);
+        this.svg = rootGroup;
+        return svg;
+      },
+
+      _ensureClipGroup: function SVGGraphics_ensureClipGroup() {
+        if (!this.current.clipGroup) {
+          var clipGroup = this.svgFactory.createElement('svg:g');
+          clipGroup.setAttributeNS(null, 'clip-path', this.current.activeClipUrl);
+          this.svg.appendChild(clipGroup);
+          this.current.clipGroup = clipGroup;
+        }
+        return this.current.clipGroup;
+      },
+      _ensureTransformGroup: function SVGGraphics_ensureTransformGroup() {
+        if (!this.tgrp) {
+          this.tgrp = this.svgFactory.createElement('svg:g');
+          this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix));
+          if (this.current.activeClipUrl) {
+            this._ensureClipGroup().appendChild(this.tgrp);
+          } else {
+            this.svg.appendChild(this.tgrp);
+          }
+        }
+        return this.tgrp;
+      }
+    };
+    return SVGGraphics;
+  }();
+}
+exports.SVGGraphics = SVGGraphics;
+
+/***/ }),
+/* 148 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.PDFNodeStream = undefined;
+
+var _regenerator = __w_pdfjs_require__(137);
+
+var _regenerator2 = _interopRequireDefault(_regenerator);
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _util = __w_pdfjs_require__(1);
+
+var _network_utils = __w_pdfjs_require__(149);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var fs = require('fs');
+var http = require('http');
+var https = require('https');
+var url = require('url');
+
+var fileUriRegex = /^file:\/\/\/[a-zA-Z]:\//;
+function parseUrl(sourceUrl) {
+  var parsedUrl = url.parse(sourceUrl);
+  if (parsedUrl.protocol === 'file:' || parsedUrl.host) {
+    return parsedUrl;
+  }
+  if (/^[a-z]:[/\\]/i.test(sourceUrl)) {
+    return url.parse('file:///' + sourceUrl);
+  }
+  if (!parsedUrl.host) {
+    parsedUrl.protocol = 'file:';
+  }
+  return parsedUrl;
+}
+
+var PDFNodeStream = function () {
+  function PDFNodeStream(source) {
+    _classCallCheck(this, PDFNodeStream);
+
+    this.source = source;
+    this.url = parseUrl(source.url);
+    this.isHttp = this.url.protocol === 'http:' || this.url.protocol === 'https:';
+    this.isFsUrl = this.url.protocol === 'file:';
+    this.httpHeaders = this.isHttp && source.httpHeaders || {};
+    this._fullRequest = null;
+    this._rangeRequestReaders = [];
+  }
+
+  _createClass(PDFNodeStream, [{
+    key: 'getFullReader',
+    value: function getFullReader() {
+      (0, _util.assert)(!this._fullRequest);
+      this._fullRequest = this.isFsUrl ? new PDFNodeStreamFsFullReader(this) : new PDFNodeStreamFullReader(this);
+      return this._fullRequest;
+    }
+  }, {
+    key: 'getRangeReader',
+    value: function getRangeReader(start, end) {
+      var rangeReader = this.isFsUrl ? new PDFNodeStreamFsRangeReader(this, start, end) : new PDFNodeStreamRangeReader(this, start, end);
+      this._rangeRequestReaders.push(rangeReader);
+      return rangeReader;
+    }
+  }, {
+    key: 'cancelAllRequests',
+    value: function cancelAllRequests(reason) {
+      if (this._fullRequest) {
+        this._fullRequest.cancel(reason);
+      }
+      var readers = this._rangeRequestReaders.slice(0);
+      readers.forEach(function (reader) {
+        reader.cancel(reason);
+      });
+    }
+  }]);
+
+  return PDFNodeStream;
+}();
+
+var BaseFullReader = function () {
+  function BaseFullReader(stream) {
+    _classCallCheck(this, BaseFullReader);
+
+    this._url = stream.url;
+    this._done = false;
+    this._storedError = null;
+    this.onProgress = null;
+    var source = stream.source;
+    this._contentLength = source.length;
+    this._loaded = 0;
+    this._filename = null;
+    this._disableRange = source.disableRange || false;
+    this._rangeChunkSize = source.rangeChunkSize;
+    if (!this._rangeChunkSize && !this._disableRange) {
+      this._disableRange = true;
+    }
+    this._isStreamingSupported = !source.disableStream;
+    this._isRangeSupported = !source.disableRange;
+    this._readableStream = null;
+    this._readCapability = (0, _util.createPromiseCapability)();
+    this._headersCapability = (0, _util.createPromiseCapability)();
+  }
+
+  _createClass(BaseFullReader, [{
+    key: 'read',
+    value: function () {
+      var _ref = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee() {
+        var chunk, buffer;
+        return _regenerator2.default.wrap(function _callee$(_context) {
+          while (1) {
+            switch (_context.prev = _context.next) {
+              case 0:
+                _context.next = 2;
+                return this._readCapability.promise;
+
+              case 2:
+                if (!this._done) {
+                  _context.next = 4;
+                  break;
+                }
+
+                return _context.abrupt('return', {
+                  value: undefined,
+                  done: true
+                });
+
+              case 4:
+                if (!this._storedError) {
+                  _context.next = 6;
+                  break;
+                }
+
+                throw this._storedError;
+
+              case 6:
+                chunk = this._readableStream.read();
+
+                if (!(chunk === null)) {
+                  _context.next = 10;
+                  break;
+                }
+
+                this._readCapability = (0, _util.createPromiseCapability)();
+                return _context.abrupt('return', this.read());
+
+              case 10:
+                this._loaded += chunk.length;
+                if (this.onProgress) {
+                  this.onProgress({
+                    loaded: this._loaded,
+                    total: this._contentLength
+                  });
+                }
+                buffer = new Uint8Array(chunk).buffer;
+                return _context.abrupt('return', {
+                  value: buffer,
+                  done: false
+                });
+
+              case 14:
+              case 'end':
+                return _context.stop();
+            }
+          }
+        }, _callee, this);
+      }));
+
+      function read() {
+        return _ref.apply(this, arguments);
+      }
+
+      return read;
+    }()
+  }, {
+    key: 'cancel',
+    value: function cancel(reason) {
+      if (!this._readableStream) {
+        this._error(reason);
+        return;
+      }
+      this._readableStream.destroy(reason);
+    }
+  }, {
+    key: '_error',
+    value: function _error(reason) {
+      this._storedError = reason;
+      this._readCapability.resolve();
+    }
+  }, {
+    key: '_setReadableStream',
+    value: function _setReadableStream(readableStream) {
+      var _this = this;
+
+      this._readableStream = readableStream;
+      readableStream.on('readable', function () {
+        _this._readCapability.resolve();
+      });
+      readableStream.on('end', function () {
+        readableStream.destroy();
+        _this._done = true;
+        _this._readCapability.resolve();
+      });
+      readableStream.on('error', function (reason) {
+        _this._error(reason);
+      });
+      if (!this._isStreamingSupported && this._isRangeSupported) {
+        this._error(new _util.AbortException('streaming is disabled'));
+      }
+      if (this._storedError) {
+        this._readableStream.destroy(this._storedError);
+      }
+    }
+  }, {
+    key: 'headersReady',
+    get: function get() {
+      return this._headersCapability.promise;
+    }
+  }, {
+    key: 'filename',
+    get: function get() {
+      return this._filename;
+    }
+  }, {
+    key: 'contentLength',
+    get: function get() {
+      return this._contentLength;
+    }
+  }, {
+    key: 'isRangeSupported',
+    get: function get() {
+      return this._isRangeSupported;
+    }
+  }, {
+    key: 'isStreamingSupported',
+    get: function get() {
+      return this._isStreamingSupported;
+    }
+  }]);
+
+  return BaseFullReader;
+}();
+
+var BaseRangeReader = function () {
+  function BaseRangeReader(stream) {
+    _classCallCheck(this, BaseRangeReader);
+
+    this._url = stream.url;
+    this._done = false;
+    this._storedError = null;
+    this.onProgress = null;
+    this._loaded = 0;
+    this._readableStream = null;
+    this._readCapability = (0, _util.createPromiseCapability)();
+    var source = stream.source;
+    this._isStreamingSupported = !source.disableStream;
+  }
+
+  _createClass(BaseRangeReader, [{
+    key: 'read',
+    value: function () {
+      var _ref2 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee2() {
+        var chunk, buffer;
+        return _regenerator2.default.wrap(function _callee2$(_context2) {
+          while (1) {
+            switch (_context2.prev = _context2.next) {
+              case 0:
+                _context2.next = 2;
+                return this._readCapability.promise;
+
+              case 2:
+                if (!this._done) {
+                  _context2.next = 4;
+                  break;
+                }
+
+                return _context2.abrupt('return', {
+                  value: undefined,
+                  done: true
+                });
+
+              case 4:
+                if (!this._storedError) {
+                  _context2.next = 6;
+                  break;
+                }
+
+                throw this._storedError;
+
+              case 6:
+                chunk = this._readableStream.read();
+
+                if (!(chunk === null)) {
+                  _context2.next = 10;
+                  break;
+                }
+
+                this._readCapability = (0, _util.createPromiseCapability)();
+                return _context2.abrupt('return', this.read());
+
+              case 10:
+                this._loaded += chunk.length;
+                if (this.onProgress) {
+                  this.onProgress({ loaded: this._loaded });
+                }
+                buffer = new Uint8Array(chunk).buffer;
+                return _context2.abrupt('return', {
+                  value: buffer,
+                  done: false
+                });
+
+              case 14:
+              case 'end':
+                return _context2.stop();
+            }
+          }
+        }, _callee2, this);
+      }));
+
+      function read() {
+        return _ref2.apply(this, arguments);
+      }
+
+      return read;
+    }()
+  }, {
+    key: 'cancel',
+    value: function cancel(reason) {
+      if (!this._readableStream) {
+        this._error(reason);
+        return;
+      }
+      this._readableStream.destroy(reason);
+    }
+  }, {
+    key: '_error',
+    value: function _error(reason) {
+      this._storedError = reason;
+      this._readCapability.resolve();
+    }
+  }, {
+    key: '_setReadableStream',
+    value: function _setReadableStream(readableStream) {
+      var _this2 = this;
+
+      this._readableStream = readableStream;
+      readableStream.on('readable', function () {
+        _this2._readCapability.resolve();
+      });
+      readableStream.on('end', function () {
+        readableStream.destroy();
+        _this2._done = true;
+        _this2._readCapability.resolve();
+      });
+      readableStream.on('error', function (reason) {
+        _this2._error(reason);
+      });
+      if (this._storedError) {
+        this._readableStream.destroy(this._storedError);
+      }
+    }
+  }, {
+    key: 'isStreamingSupported',
+    get: function get() {
+      return this._isStreamingSupported;
+    }
+  }]);
+
+  return BaseRangeReader;
+}();
+
+function createRequestOptions(url, headers) {
+  return {
+    protocol: url.protocol,
+    auth: url.auth,
+    host: url.hostname,
+    port: url.port,
+    path: url.path,
+    method: 'GET',
+    headers: headers
+  };
+}
+
+var PDFNodeStreamFullReader = function (_BaseFullReader) {
+  _inherits(PDFNodeStreamFullReader, _BaseFullReader);
+
+  function PDFNodeStreamFullReader(stream) {
+    _classCallCheck(this, PDFNodeStreamFullReader);
+
+    var _this3 = _possibleConstructorReturn(this, (PDFNodeStreamFullReader.__proto__ || Object.getPrototypeOf(PDFNodeStreamFullReader)).call(this, stream));
+
+    var handleResponse = function handleResponse(response) {
+      if (response.statusCode === 404) {
+        var error = new _util.MissingPDFException('Missing PDF "' + _this3._url + '".');
+        _this3._storedError = error;
+        _this3._headersCapability.reject(error);
+        return;
+      }
+      _this3._headersCapability.resolve();
+      _this3._setReadableStream(response);
+      var getResponseHeader = function getResponseHeader(name) {
+        return _this3._readableStream.headers[name.toLowerCase()];
+      };
+
+      var _validateRangeRequest = (0, _network_utils.validateRangeRequestCapabilities)({
+        getResponseHeader: getResponseHeader,
+        isHttp: stream.isHttp,
+        rangeChunkSize: _this3._rangeChunkSize,
+        disableRange: _this3._disableRange
+      }),
+          allowRangeRequests = _validateRangeRequest.allowRangeRequests,
+          suggestedLength = _validateRangeRequest.suggestedLength;
+
+      _this3._isRangeSupported = allowRangeRequests;
+      _this3._contentLength = suggestedLength || _this3._contentLength;
+      _this3._filename = (0, _network_utils.extractFilenameFromHeader)(getResponseHeader);
+    };
+    _this3._request = null;
+    if (_this3._url.protocol === 'http:') {
+      _this3._request = http.request(createRequestOptions(_this3._url, stream.httpHeaders), handleResponse);
+    } else {
+      _this3._request = https.request(createRequestOptions(_this3._url, stream.httpHeaders), handleResponse);
+    }
+    _this3._request.on('error', function (reason) {
+      _this3._storedError = reason;
+      _this3._headersCapability.reject(reason);
+    });
+    _this3._request.end();
+    return _this3;
+  }
+
+  return PDFNodeStreamFullReader;
+}(BaseFullReader);
+
+var PDFNodeStreamRangeReader = function (_BaseRangeReader) {
+  _inherits(PDFNodeStreamRangeReader, _BaseRangeReader);
+
+  function PDFNodeStreamRangeReader(stream, start, end) {
+    _classCallCheck(this, PDFNodeStreamRangeReader);
+
+    var _this4 = _possibleConstructorReturn(this, (PDFNodeStreamRangeReader.__proto__ || Object.getPrototypeOf(PDFNodeStreamRangeReader)).call(this, stream));
+
+    _this4._httpHeaders = {};
+    for (var property in stream.httpHeaders) {
+      var value = stream.httpHeaders[property];
+      if (typeof value === 'undefined') {
+        continue;
+      }
+      _this4._httpHeaders[property] = value;
+    }
+    _this4._httpHeaders['Range'] = 'bytes=' + start + '-' + (end - 1);
+    var handleResponse = function handleResponse(response) {
+      if (response.statusCode === 404) {
+        var error = new _util.MissingPDFException('Missing PDF "' + _this4._url + '".');
+        _this4._storedError = error;
+        return;
+      }
+      _this4._setReadableStream(response);
+    };
+    _this4._request = null;
+    if (_this4._url.protocol === 'http:') {
+      _this4._request = http.request(createRequestOptions(_this4._url, _this4._httpHeaders), handleResponse);
+    } else {
+      _this4._request = https.request(createRequestOptions(_this4._url, _this4._httpHeaders), handleResponse);
+    }
+    _this4._request.on('error', function (reason) {
+      _this4._storedError = reason;
+    });
+    _this4._request.end();
+    return _this4;
+  }
+
+  return PDFNodeStreamRangeReader;
+}(BaseRangeReader);
+
+var PDFNodeStreamFsFullReader = function (_BaseFullReader2) {
+  _inherits(PDFNodeStreamFsFullReader, _BaseFullReader2);
+
+  function PDFNodeStreamFsFullReader(stream) {
+    _classCallCheck(this, PDFNodeStreamFsFullReader);
+
+    var _this5 = _possibleConstructorReturn(this, (PDFNodeStreamFsFullReader.__proto__ || Object.getPrototypeOf(PDFNodeStreamFsFullReader)).call(this, stream));
+
+    var path = decodeURIComponent(_this5._url.path);
+    if (fileUriRegex.test(_this5._url.href)) {
+      path = path.replace(/^\//, '');
+    }
+    fs.lstat(path, function (error, stat) {
+      if (error) {
+        if (error.code === 'ENOENT') {
+          error = new _util.MissingPDFException('Missing PDF "' + path + '".');
+        }
+        _this5._storedError = error;
+        _this5._headersCapability.reject(error);
+        return;
+      }
+      _this5._contentLength = stat.size;
+      _this5._setReadableStream(fs.createReadStream(path));
+      _this5._headersCapability.resolve();
+    });
+    return _this5;
+  }
+
+  return PDFNodeStreamFsFullReader;
+}(BaseFullReader);
+
+var PDFNodeStreamFsRangeReader = function (_BaseRangeReader2) {
+  _inherits(PDFNodeStreamFsRangeReader, _BaseRangeReader2);
+
+  function PDFNodeStreamFsRangeReader(stream, start, end) {
+    _classCallCheck(this, PDFNodeStreamFsRangeReader);
+
+    var _this6 = _possibleConstructorReturn(this, (PDFNodeStreamFsRangeReader.__proto__ || Object.getPrototypeOf(PDFNodeStreamFsRangeReader)).call(this, stream));
+
+    var path = decodeURIComponent(_this6._url.path);
+    if (fileUriRegex.test(_this6._url.href)) {
+      path = path.replace(/^\//, '');
+    }
+    _this6._setReadableStream(fs.createReadStream(path, {
+      start: start,
+      end: end - 1
+    }));
+    return _this6;
+  }
+
+  return PDFNodeStreamFsRangeReader;
+}(BaseRangeReader);
+
+exports.PDFNodeStream = PDFNodeStream;
+
+/***/ }),
+/* 149 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.validateResponseStatus = exports.validateRangeRequestCapabilities = exports.extractFilenameFromHeader = exports.createResponseStatusError = undefined;
+
+var _util = __w_pdfjs_require__(1);
+
+var _content_disposition = __w_pdfjs_require__(150);
+
+function validateRangeRequestCapabilities(_ref) {
+  var getResponseHeader = _ref.getResponseHeader,
+      isHttp = _ref.isHttp,
+      rangeChunkSize = _ref.rangeChunkSize,
+      disableRange = _ref.disableRange;
+
+  (0, _util.assert)(rangeChunkSize > 0, 'Range chunk size must be larger than zero');
+  var returnValues = {
+    allowRangeRequests: false,
+    suggestedLength: undefined
+  };
+  var length = parseInt(getResponseHeader('Content-Length'), 10);
+  if (!Number.isInteger(length)) {
+    return returnValues;
+  }
+  returnValues.suggestedLength = length;
+  if (length <= 2 * rangeChunkSize) {
+    return returnValues;
+  }
+  if (disableRange || !isHttp) {
+    return returnValues;
+  }
+  if (getResponseHeader('Accept-Ranges') !== 'bytes') {
+    return returnValues;
+  }
+  var contentEncoding = getResponseHeader('Content-Encoding') || 'identity';
+  if (contentEncoding !== 'identity') {
+    return returnValues;
+  }
+  returnValues.allowRangeRequests = true;
+  return returnValues;
+}
+function extractFilenameFromHeader(getResponseHeader) {
+  var contentDisposition = getResponseHeader('Content-Disposition');
+  if (contentDisposition) {
+    var filename = (0, _content_disposition.getFilenameFromContentDispositionHeader)(contentDisposition);
+    if (/\.pdf$/i.test(filename)) {
+      return filename;
+    }
+  }
+  return null;
+}
+function createResponseStatusError(status, url) {
+  if (status === 404 || status === 0 && /^file:/.test(url)) {
+    return new _util.MissingPDFException('Missing PDF "' + url + '".');
+  }
+  return new _util.UnexpectedResponseException('Unexpected server response (' + status + ') while retrieving PDF "' + url + '".', status);
+}
+function validateResponseStatus(status) {
+  return status === 200 || status === 206;
+}
+exports.createResponseStatusError = createResponseStatusError;
+exports.extractFilenameFromHeader = extractFilenameFromHeader;
+exports.validateRangeRequestCapabilities = validateRangeRequestCapabilities;
+exports.validateResponseStatus = validateResponseStatus;
+
+/***/ }),
+/* 150 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
+
+function getFilenameFromContentDispositionHeader(contentDisposition) {
+  var needsEncodingFixup = true;
+  var tmp = toParamRegExp('filename\\*', 'i').exec(contentDisposition);
+  if (tmp) {
+    tmp = tmp[1];
+    var filename = rfc2616unquote(tmp);
+    filename = unescape(filename);
+    filename = rfc5987decode(filename);
+    filename = rfc2047decode(filename);
+    return fixupEncoding(filename);
+  }
+  tmp = rfc2231getparam(contentDisposition);
+  if (tmp) {
+    var _filename = rfc2047decode(tmp);
+    return fixupEncoding(_filename);
+  }
+  tmp = toParamRegExp('filename', 'i').exec(contentDisposition);
+  if (tmp) {
+    tmp = tmp[1];
+    var _filename2 = rfc2616unquote(tmp);
+    _filename2 = rfc2047decode(_filename2);
+    return fixupEncoding(_filename2);
+  }
+  function toParamRegExp(attributePattern, flags) {
+    return new RegExp('(?:^|;)\\s*' + attributePattern + '\\s*=\\s*' + '(' + '[^";\\s][^;\\s]*' + '|' + '"(?:[^"\\\\]|\\\\"?)+"?' + ')', flags);
+  }
+  function textdecode(encoding, value) {
+    if (encoding) {
+      if (!/^[\x00-\xFF]+$/.test(value)) {
+        return value;
+      }
+      try {
+        var decoder = new TextDecoder(encoding, { fatal: true });
+        var bytes = new Array(value.length);
+        for (var i = 0; i < value.length; ++i) {
+          bytes[i] = value.charCodeAt(i);
+        }
+        value = decoder.decode(new Uint8Array(bytes));
+        needsEncodingFixup = false;
+      } catch (e) {
+        if (/^utf-?8$/i.test(encoding)) {
+          try {
+            value = decodeURIComponent(escape(value));
+            needsEncodingFixup = false;
+          } catch (err) {}
+        }
+      }
+    }
+    return value;
+  }
+  function fixupEncoding(value) {
+    if (needsEncodingFixup && /[\x80-\xff]/.test(value)) {
+      value = textdecode('utf-8', value);
+      if (needsEncodingFixup) {
+        value = textdecode('iso-8859-1', value);
+      }
+    }
+    return value;
+  }
+  function rfc2231getparam(contentDisposition) {
+    var matches = [],
+        match = void 0;
+    var iter = toParamRegExp('filename\\*((?!0\\d)\\d+)(\\*?)', 'ig');
+    while ((match = iter.exec(contentDisposition)) !== null) {
+      var _match = match,
+          _match2 = _slicedToArray(_match, 4),
+          n = _match2[1],
+          quot = _match2[2],
+          part = _match2[3];
+
+      n = parseInt(n, 10);
+      if (n in matches) {
+        if (n === 0) {
+          break;
+        }
+        continue;
+      }
+      matches[n] = [quot, part];
+    }
+    var parts = [];
+    for (var _n = 0; _n < matches.length; ++_n) {
+      if (!(_n in matches)) {
+        break;
+      }
+
+      var _matches$_n = _slicedToArray(matches[_n], 2),
+          _quot = _matches$_n[0],
+          _part = _matches$_n[1];
+
+      _part = rfc2616unquote(_part);
+      if (_quot) {
+        _part = unescape(_part);
+        if (_n === 0) {
+          _part = rfc5987decode(_part);
+        }
+      }
+      parts.push(_part);
+    }
+    return parts.join('');
+  }
+  function rfc2616unquote(value) {
+    if (value.charAt(0) === '"') {
+      var parts = value.slice(1).split('\\"');
+      for (var i = 0; i < parts.length; ++i) {
+        var quotindex = parts[i].indexOf('"');
+        if (quotindex !== -1) {
+          parts[i] = parts[i].slice(0, quotindex);
+          parts.length = i + 1;
+        }
+        parts[i] = parts[i].replace(/\\(.)/g, '$1');
+      }
+      value = parts.join('"');
+    }
+    return value;
+  }
+  function rfc5987decode(extvalue) {
+    var encodingend = extvalue.indexOf('\'');
+    if (encodingend === -1) {
+      return extvalue;
+    }
+    var encoding = extvalue.slice(0, encodingend);
+    var langvalue = extvalue.slice(encodingend + 1);
+    var value = langvalue.replace(/^[^']*'/, '');
+    return textdecode(encoding, value);
+  }
+  function rfc2047decode(value) {
+    if (value.slice(0, 2) !== '=?' || /[\x00-\x19\x80-\xff]/.test(value)) {
+      return value;
+    }
+    return value.replace(/=\?([\w-]*)\?([QqBb])\?((?:[^?]|\?(?!=))*)\?=/g, function (_, charset, encoding, text) {
+      if (encoding === 'q' || encoding === 'Q') {
+        text = text.replace(/_/g, ' ');
+        text = text.replace(/=([0-9a-fA-F]{2})/g, function (_, hex) {
+          return String.fromCharCode(parseInt(hex, 16));
+        });
+        return textdecode(charset, text);
+      }
+      try {
+        text = atob(text);
+      } catch (e) {}
+      return textdecode(charset, text);
+    });
+  }
+  return '';
+}
+exports.getFilenameFromContentDispositionHeader = getFilenameFromContentDispositionHeader;
+
+/***/ }),
+/* 151 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.PDFFetchStream = undefined;
+
+var _regenerator = __w_pdfjs_require__(137);
+
+var _regenerator2 = _interopRequireDefault(_regenerator);
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _util = __w_pdfjs_require__(1);
+
+var _network_utils = __w_pdfjs_require__(149);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function createFetchOptions(headers, withCredentials, abortController) {
+  return {
+    method: 'GET',
+    headers: headers,
+    signal: abortController && abortController.signal,
+    mode: 'cors',
+    credentials: withCredentials ? 'include' : 'same-origin',
+    redirect: 'follow'
+  };
+}
+
+var PDFFetchStream = function () {
+  function PDFFetchStream(source) {
+    _classCallCheck(this, PDFFetchStream);
+
+    this.source = source;
+    this.isHttp = /^https?:/i.test(source.url);
+    this.httpHeaders = this.isHttp && source.httpHeaders || {};
+    this._fullRequestReader = null;
+    this._rangeRequestReaders = [];
+  }
+
+  _createClass(PDFFetchStream, [{
+    key: 'getFullReader',
+    value: function getFullReader() {
+      (0, _util.assert)(!this._fullRequestReader);
+      this._fullRequestReader = new PDFFetchStreamReader(this);
+      return this._fullRequestReader;
+    }
+  }, {
+    key: 'getRangeReader',
+    value: function getRangeReader(begin, end) {
+      var reader = new PDFFetchStreamRangeReader(this, begin, end);
+      this._rangeRequestReaders.push(reader);
+      return reader;
+    }
+  }, {
+    key: 'cancelAllRequests',
+    value: function cancelAllRequests(reason) {
+      if (this._fullRequestReader) {
+        this._fullRequestReader.cancel(reason);
+      }
+      var readers = this._rangeRequestReaders.slice(0);
+      readers.forEach(function (reader) {
+        reader.cancel(reason);
+      });
+    }
+  }]);
+
+  return PDFFetchStream;
+}();
+
+var PDFFetchStreamReader = function () {
+  function PDFFetchStreamReader(stream) {
+    var _this = this;
+
+    _classCallCheck(this, PDFFetchStreamReader);
+
+    this._stream = stream;
+    this._reader = null;
+    this._loaded = 0;
+    this._filename = null;
+    var source = stream.source;
+    this._withCredentials = source.withCredentials;
+    this._contentLength = source.length;
+    this._headersCapability = (0, _util.createPromiseCapability)();
+    this._disableRange = source.disableRange || false;
+    this._rangeChunkSize = source.rangeChunkSize;
+    if (!this._rangeChunkSize && !this._disableRange) {
+      this._disableRange = true;
+    }
+    if (typeof AbortController !== 'undefined') {
+      this._abortController = new AbortController();
+    }
+    this._isStreamingSupported = !source.disableStream;
+    this._isRangeSupported = !source.disableRange;
+    this._headers = new Headers();
+    for (var property in this._stream.httpHeaders) {
+      var value = this._stream.httpHeaders[property];
+      if (typeof value === 'undefined') {
+        continue;
+      }
+      this._headers.append(property, value);
+    }
+    var url = source.url;
+    fetch(url, createFetchOptions(this._headers, this._withCredentials, this._abortController)).then(function (response) {
+      if (!(0, _network_utils.validateResponseStatus)(response.status)) {
+        throw (0, _network_utils.createResponseStatusError)(response.status, url);
+      }
+      _this._reader = response.body.getReader();
+      _this._headersCapability.resolve();
+      var getResponseHeader = function getResponseHeader(name) {
+        return response.headers.get(name);
+      };
+
+      var _validateRangeRequest = (0, _network_utils.validateRangeRequestCapabilities)({
+        getResponseHeader: getResponseHeader,
+        isHttp: _this._stream.isHttp,
+        rangeChunkSize: _this._rangeChunkSize,
+        disableRange: _this._disableRange
+      }),
+          allowRangeRequests = _validateRangeRequest.allowRangeRequests,
+          suggestedLength = _validateRangeRequest.suggestedLength;
+
+      _this._isRangeSupported = allowRangeRequests;
+      _this._contentLength = suggestedLength || _this._contentLength;
+      _this._filename = (0, _network_utils.extractFilenameFromHeader)(getResponseHeader);
+      if (!_this._isStreamingSupported && _this._isRangeSupported) {
+        _this.cancel(new _util.AbortException('streaming is disabled'));
+      }
+    }).catch(this._headersCapability.reject);
+    this.onProgress = null;
+  }
+
+  _createClass(PDFFetchStreamReader, [{
+    key: 'read',
+    value: function () {
+      var _ref = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee() {
+        var _ref2, value, done, buffer;
+
+        return _regenerator2.default.wrap(function _callee$(_context) {
+          while (1) {
+            switch (_context.prev = _context.next) {
+              case 0:
+                _context.next = 2;
+                return this._headersCapability.promise;
+
+              case 2:
+                _context.next = 4;
+                return this._reader.read();
+
+              case 4:
+                _ref2 = _context.sent;
+                value = _ref2.value;
+                done = _ref2.done;
+
+                if (!done) {
+                  _context.next = 9;
+                  break;
+                }
+
+                return _context.abrupt('return', {
+                  value: value,
+                  done: done
+                });
+
+              case 9:
+                this._loaded += value.byteLength;
+                if (this.onProgress) {
+                  this.onProgress({
+                    loaded: this._loaded,
+                    total: this._contentLength
+                  });
+                }
+                buffer = new Uint8Array(value).buffer;
+                return _context.abrupt('return', {
+                  value: buffer,
+                  done: false
+                });
+
+              case 13:
+              case 'end':
+                return _context.stop();
+            }
+          }
+        }, _callee, this);
+      }));
+
+      function read() {
+        return _ref.apply(this, arguments);
+      }
+
+      return read;
+    }()
+  }, {
+    key: 'cancel',
+    value: function cancel(reason) {
+      if (this._reader) {
+        this._reader.cancel(reason);
+      }
+      if (this._abortController) {
+        this._abortController.abort();
+      }
+    }
+  }, {
+    key: 'headersReady',
+    get: function get() {
+      return this._headersCapability.promise;
+    }
+  }, {
+    key: 'filename',
+    get: function get() {
+      return this._filename;
+    }
+  }, {
+    key: 'contentLength',
+    get: function get() {
+      return this._contentLength;
+    }
+  }, {
+    key: 'isRangeSupported',
+    get: function get() {
+      return this._isRangeSupported;
+    }
+  }, {
+    key: 'isStreamingSupported',
+    get: function get() {
+      return this._isStreamingSupported;
+    }
+  }]);
+
+  return PDFFetchStreamReader;
+}();
+
+var PDFFetchStreamRangeReader = function () {
+  function PDFFetchStreamRangeReader(stream, begin, end) {
+    var _this2 = this;
+
+    _classCallCheck(this, PDFFetchStreamRangeReader);
+
+    this._stream = stream;
+    this._reader = null;
+    this._loaded = 0;
+    var source = stream.source;
+    this._withCredentials = source.withCredentials;
+    this._readCapability = (0, _util.createPromiseCapability)();
+    this._isStreamingSupported = !source.disableStream;
+    if (typeof AbortController !== 'undefined') {
+      this._abortController = new AbortController();
+    }
+    this._headers = new Headers();
+    for (var property in this._stream.httpHeaders) {
+      var value = this._stream.httpHeaders[property];
+      if (typeof value === 'undefined') {
+        continue;
+      }
+      this._headers.append(property, value);
+    }
+    var rangeStr = begin + '-' + (end - 1);
+    this._headers.append('Range', 'bytes=' + rangeStr);
+    var url = source.url;
+    fetch(url, createFetchOptions(this._headers, this._withCredentials, this._abortController)).then(function (response) {
+      if (!(0, _network_utils.validateResponseStatus)(response.status)) {
+        throw (0, _network_utils.createResponseStatusError)(response.status, url);
+      }
+      _this2._readCapability.resolve();
+      _this2._reader = response.body.getReader();
+    });
+    this.onProgress = null;
+  }
+
+  _createClass(PDFFetchStreamRangeReader, [{
+    key: 'read',
+    value: function () {
+      var _ref3 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee2() {
+        var _ref4, value, done, buffer;
+
+        return _regenerator2.default.wrap(function _callee2$(_context2) {
+          while (1) {
+            switch (_context2.prev = _context2.next) {
+              case 0:
+                _context2.next = 2;
+                return this._readCapability.promise;
+
+              case 2:
+                _context2.next = 4;
+                return this._reader.read();
+
+              case 4:
+                _ref4 = _context2.sent;
+                value = _ref4.value;
+                done = _ref4.done;
+
+                if (!done) {
+                  _context2.next = 9;
+                  break;
+                }
+
+                return _context2.abrupt('return', {
+                  value: value,
+                  done: done
+                });
+
+              case 9:
+                this._loaded += value.byteLength;
+                if (this.onProgress) {
+                  this.onProgress({ loaded: this._loaded });
+                }
+                buffer = new Uint8Array(value).buffer;
+                return _context2.abrupt('return', {
+                  value: buffer,
+                  done: false
+                });
+
+              case 13:
+              case 'end':
+                return _context2.stop();
+            }
+          }
+        }, _callee2, this);
+      }));
+
+      function read() {
+        return _ref3.apply(this, arguments);
+      }
+
+      return read;
+    }()
+  }, {
+    key: 'cancel',
+    value: function cancel(reason) {
+      if (this._reader) {
+        this._reader.cancel(reason);
+      }
+      if (this._abortController) {
+        this._abortController.abort();
+      }
+    }
+  }, {
+    key: 'isStreamingSupported',
+    get: function get() {
+      return this._isStreamingSupported;
+    }
+  }]);
+
+  return PDFFetchStreamRangeReader;
+}();
+
+exports.PDFFetchStream = PDFFetchStream;
+
+/***/ }),
+/* 152 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.NetworkManager = exports.PDFNetworkStream = undefined;
+
+var _regenerator = __w_pdfjs_require__(137);
+
+var _regenerator2 = _interopRequireDefault(_regenerator);
+
+var _util = __w_pdfjs_require__(1);
+
+var _network_utils = __w_pdfjs_require__(149);
+
+var _global_scope = __w_pdfjs_require__(3);
+
+var _global_scope2 = _interopRequireDefault(_global_scope);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
+
+;
+var OK_RESPONSE = 200;
+var PARTIAL_CONTENT_RESPONSE = 206;
+function NetworkManager(url, args) {
+  this.url = url;
+  args = args || {};
+  this.isHttp = /^https?:/i.test(url);
+  this.httpHeaders = this.isHttp && args.httpHeaders || {};
+  this.withCredentials = args.withCredentials || false;
+  this.getXhr = args.getXhr || function NetworkManager_getXhr() {
+    return new XMLHttpRequest();
+  };
+  this.currXhrId = 0;
+  this.pendingRequests = Object.create(null);
+  this.loadedRequests = Object.create(null);
+}
+function getArrayBuffer(xhr) {
+  var data = xhr.response;
+  if (typeof data !== 'string') {
+    return data;
+  }
+  var array = (0, _util.stringToBytes)(data);
+  return array.buffer;
+}
+var supportsMozChunked = function supportsMozChunkedClosure() {
+  try {
+    var x = new XMLHttpRequest();
+    x.open('GET', _global_scope2.default.location.href);
+    x.responseType = 'moz-chunked-arraybuffer';
+    return x.responseType === 'moz-chunked-arraybuffer';
+  } catch (e) {
+    return false;
+  }
+}();
+NetworkManager.prototype = {
+  requestRange: function NetworkManager_requestRange(begin, end, listeners) {
+    var args = {
+      begin: begin,
+      end: end
+    };
+    for (var prop in listeners) {
+      args[prop] = listeners[prop];
+    }
+    return this.request(args);
+  },
+  requestFull: function NetworkManager_requestFull(listeners) {
+    return this.request(listeners);
+  },
+  request: function NetworkManager_request(args) {
+    var xhr = this.getXhr();
+    var xhrId = this.currXhrId++;
+    var pendingRequest = this.pendingRequests[xhrId] = { xhr: xhr };
+    xhr.open('GET', this.url);
+    xhr.withCredentials = this.withCredentials;
+    for (var property in this.httpHeaders) {
+      var value = this.httpHeaders[property];
+      if (typeof value === 'undefined') {
+        continue;
+      }
+      xhr.setRequestHeader(property, value);
+    }
+    if (this.isHttp && 'begin' in args && 'end' in args) {
+      var rangeStr = args.begin + '-' + (args.end - 1);
+      xhr.setRequestHeader('Range', 'bytes=' + rangeStr);
+      pendingRequest.expectedStatus = 206;
+    } else {
+      pendingRequest.expectedStatus = 200;
+    }
+    var useMozChunkedLoading = supportsMozChunked && !!args.onProgressiveData;
+    if (useMozChunkedLoading) {
+      xhr.responseType = 'moz-chunked-arraybuffer';
+      pendingRequest.onProgressiveData = args.onProgressiveData;
+      pendingRequest.mozChunked = true;
+    } else {
+      xhr.responseType = 'arraybuffer';
+    }
+    if (args.onError) {
+      xhr.onerror = function (evt) {
+        args.onError(xhr.status);
+      };
+    }
+    xhr.onreadystatechange = this.onStateChange.bind(this, xhrId);
+    xhr.onprogress = this.onProgress.bind(this, xhrId);
+    pendingRequest.onHeadersReceived = args.onHeadersReceived;
+    pendingRequest.onDone = args.onDone;
+    pendingRequest.onError = args.onError;
+    pendingRequest.onProgress = args.onProgress;
+    xhr.send(null);
+    return xhrId;
+  },
+  onProgress: function NetworkManager_onProgress(xhrId, evt) {
+    var pendingRequest = this.pendingRequests[xhrId];
+    if (!pendingRequest) {
+      return;
+    }
+    if (pendingRequest.mozChunked) {
+      var chunk = getArrayBuffer(pendingRequest.xhr);
+      pendingRequest.onProgressiveData(chunk);
+    }
+    var onProgress = pendingRequest.onProgress;
+    if (onProgress) {
+      onProgress(evt);
+    }
+  },
+  onStateChange: function NetworkManager_onStateChange(xhrId, evt) {
+    var pendingRequest = this.pendingRequests[xhrId];
+    if (!pendingRequest) {
+      return;
+    }
+    var xhr = pendingRequest.xhr;
+    if (xhr.readyState >= 2 && pendingRequest.onHeadersReceived) {
+      pendingRequest.onHeadersReceived();
+      delete pendingRequest.onHeadersReceived;
+    }
+    if (xhr.readyState !== 4) {
+      return;
+    }
+    if (!(xhrId in this.pendingRequests)) {
+      return;
+    }
+    delete this.pendingRequests[xhrId];
+    if (xhr.status === 0 && this.isHttp) {
+      if (pendingRequest.onError) {
+        pendingRequest.onError(xhr.status);
+      }
+      return;
+    }
+    var xhrStatus = xhr.status || OK_RESPONSE;
+    var ok_response_on_range_request = xhrStatus === OK_RESPONSE && pendingRequest.expectedStatus === PARTIAL_CONTENT_RESPONSE;
+    if (!ok_response_on_range_request && xhrStatus !== pendingRequest.expectedStatus) {
+      if (pendingRequest.onError) {
+        pendingRequest.onError(xhr.status);
+      }
+      return;
+    }
+    this.loadedRequests[xhrId] = true;
+    var chunk = getArrayBuffer(xhr);
+    if (xhrStatus === PARTIAL_CONTENT_RESPONSE) {
+      var rangeHeader = xhr.getResponseHeader('Content-Range');
+      var matches = /bytes (\d+)-(\d+)\/(\d+)/.exec(rangeHeader);
+      var begin = parseInt(matches[1], 10);
+      pendingRequest.onDone({
+        begin: begin,
+        chunk: chunk
+      });
+    } else if (pendingRequest.onProgressiveData) {
+      pendingRequest.onDone(null);
+    } else if (chunk) {
+      pendingRequest.onDone({
+        begin: 0,
+        chunk: chunk
+      });
+    } else if (pendingRequest.onError) {
+      pendingRequest.onError(xhr.status);
+    }
+  },
+  hasPendingRequests: function NetworkManager_hasPendingRequests() {
+    for (var xhrId in this.pendingRequests) {
+      return true;
+    }
+    return false;
+  },
+  getRequestXhr: function NetworkManager_getXhr(xhrId) {
+    return this.pendingRequests[xhrId].xhr;
+  },
+  isStreamingRequest: function NetworkManager_isStreamingRequest(xhrId) {
+    return !!this.pendingRequests[xhrId].onProgressiveData;
+  },
+  isPendingRequest: function NetworkManager_isPendingRequest(xhrId) {
+    return xhrId in this.pendingRequests;
+  },
+  isLoadedRequest: function NetworkManager_isLoadedRequest(xhrId) {
+    return xhrId in this.loadedRequests;
+  },
+  abortAllRequests: function NetworkManager_abortAllRequests() {
+    for (var xhrId in this.pendingRequests) {
+      this.abortRequest(xhrId | 0);
+    }
+  },
+  abortRequest: function NetworkManager_abortRequest(xhrId) {
+    var xhr = this.pendingRequests[xhrId].xhr;
+    delete this.pendingRequests[xhrId];
+    xhr.abort();
+  }
+};
+function PDFNetworkStream(source) {
+  this._source = source;
+  this._manager = new NetworkManager(source.url, {
+    httpHeaders: source.httpHeaders,
+    withCredentials: source.withCredentials
+  });
+  this._rangeChunkSize = source.rangeChunkSize;
+  this._fullRequestReader = null;
+  this._rangeRequestReaders = [];
+}
+PDFNetworkStream.prototype = {
+  _onRangeRequestReaderClosed: function PDFNetworkStream_onRangeRequestReaderClosed(reader) {
+    var i = this._rangeRequestReaders.indexOf(reader);
+    if (i >= 0) {
+      this._rangeRequestReaders.splice(i, 1);
+    }
+  },
+  getFullReader: function PDFNetworkStream_getFullReader() {
+    (0, _util.assert)(!this._fullRequestReader);
+    this._fullRequestReader = new PDFNetworkStreamFullRequestReader(this._manager, this._source);
+    return this._fullRequestReader;
+  },
+  getRangeReader: function PDFNetworkStream_getRangeReader(begin, end) {
+    var reader = new PDFNetworkStreamRangeRequestReader(this._manager, begin, end);
+    reader.onClosed = this._onRangeRequestReaderClosed.bind(this);
+    this._rangeRequestReaders.push(reader);
+    return reader;
+  },
+  cancelAllRequests: function PDFNetworkStream_cancelAllRequests(reason) {
+    if (this._fullRequestReader) {
+      this._fullRequestReader.cancel(reason);
+    }
+    var readers = this._rangeRequestReaders.slice(0);
+    readers.forEach(function (reader) {
+      reader.cancel(reason);
+    });
+  }
+};
+function PDFNetworkStreamFullRequestReader(manager, source) {
+  this._manager = manager;
+  var args = {
+    onHeadersReceived: this._onHeadersReceived.bind(this),
+    onProgressiveData: source.disableStream ? null : this._onProgressiveData.bind(this),
+    onDone: this._onDone.bind(this),
+    onError: this._onError.bind(this),
+    onProgress: this._onProgress.bind(this)
+  };
+  this._url = source.url;
+  this._fullRequestId = manager.requestFull(args);
+  this._headersReceivedCapability = (0, _util.createPromiseCapability)();
+  this._disableRange = source.disableRange || false;
+  this._contentLength = source.length;
+  this._rangeChunkSize = source.rangeChunkSize;
+  if (!this._rangeChunkSize && !this._disableRange) {
+    this._disableRange = true;
+  }
+  this._isStreamingSupported = false;
+  this._isRangeSupported = false;
+  this._cachedChunks = [];
+  this._requests = [];
+  this._done = false;
+  this._storedError = undefined;
+  this._filename = null;
+  this.onProgress = null;
+}
+PDFNetworkStreamFullRequestReader.prototype = {
+  _onHeadersReceived: function PDFNetworkStreamFullRequestReader_onHeadersReceived() {
+    var fullRequestXhrId = this._fullRequestId;
+    var fullRequestXhr = this._manager.getRequestXhr(fullRequestXhrId);
+    var getResponseHeader = function getResponseHeader(name) {
+      return fullRequestXhr.getResponseHeader(name);
+    };
+
+    var _validateRangeRequest = (0, _network_utils.validateRangeRequestCapabilities)({
+      getResponseHeader: getResponseHeader,
+      isHttp: this._manager.isHttp,
+      rangeChunkSize: this._rangeChunkSize,
+      disableRange: this._disableRange
+    }),
+        allowRangeRequests = _validateRangeRequest.allowRangeRequests,
+        suggestedLength = _validateRangeRequest.suggestedLength;
+
+    if (allowRangeRequests) {
+      this._isRangeSupported = true;
+    }
+    this._contentLength = suggestedLength || this._contentLength;
+    this._filename = (0, _network_utils.extractFilenameFromHeader)(getResponseHeader);
+    var networkManager = this._manager;
+    if (networkManager.isStreamingRequest(fullRequestXhrId)) {
+      this._isStreamingSupported = true;
+    } else if (this._isRangeSupported) {
+      networkManager.abortRequest(fullRequestXhrId);
+    }
+    this._headersReceivedCapability.resolve();
+  },
+  _onProgressiveData: function PDFNetworkStreamFullRequestReader_onProgressiveData(chunk) {
+    if (this._requests.length > 0) {
+      var requestCapability = this._requests.shift();
+      requestCapability.resolve({
+        value: chunk,
+        done: false
+      });
+    } else {
+      this._cachedChunks.push(chunk);
+    }
+  },
+  _onDone: function PDFNetworkStreamFullRequestReader_onDone(args) {
+    if (args) {
+      this._onProgressiveData(args.chunk);
+    }
+    this._done = true;
+    if (this._cachedChunks.length > 0) {
+      return;
+    }
+    this._requests.forEach(function (requestCapability) {
+      requestCapability.resolve({
+        value: undefined,
+        done: true
+      });
+    });
+    this._requests = [];
+  },
+  _onError: function PDFNetworkStreamFullRequestReader_onError(status) {
+    var url = this._url;
+    var exception = (0, _network_utils.createResponseStatusError)(status, url);
+    this._storedError = exception;
+    this._headersReceivedCapability.reject(exception);
+    this._requests.forEach(function (requestCapability) {
+      requestCapability.reject(exception);
+    });
+    this._requests = [];
+    this._cachedChunks = [];
+  },
+  _onProgress: function PDFNetworkStreamFullRequestReader_onProgress(data) {
+    if (this.onProgress) {
+      this.onProgress({
+        loaded: data.loaded,
+        total: data.lengthComputable ? data.total : this._contentLength
+      });
+    }
+  },
+  get filename() {
+    return this._filename;
+  },
+  get isRangeSupported() {
+    return this._isRangeSupported;
+  },
+  get isStreamingSupported() {
+    return this._isStreamingSupported;
+  },
+  get contentLength() {
+    return this._contentLength;
+  },
+  get headersReady() {
+    return this._headersReceivedCapability.promise;
+  },
+  read: function () {
+    var _ref = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee() {
+      var chunk, requestCapability;
+      return _regenerator2.default.wrap(function _callee$(_context) {
+        while (1) {
+          switch (_context.prev = _context.next) {
+            case 0:
+              if (!this._storedError) {
+                _context.next = 2;
+                break;
+              }
+
+              throw this._storedError;
+
+            case 2:
+              if (!(this._cachedChunks.length > 0)) {
+                _context.next = 5;
+                break;
+              }
+
+              chunk = this._cachedChunks.shift();
+              return _context.abrupt('return', {
+                value: chunk,
+                done: false
+              });
+
+            case 5:
+              if (!this._done) {
+                _context.next = 7;
+                break;
+              }
+
+              return _context.abrupt('return', {
+                value: undefined,
+                done: true
+              });
+
+            case 7:
+              requestCapability = (0, _util.createPromiseCapability)();
+
+              this._requests.push(requestCapability);
+              return _context.abrupt('return', requestCapability.promise);
+
+            case 10:
+            case 'end':
+              return _context.stop();
+          }
+        }
+      }, _callee, this);
+    }));
+
+    function read() {
+      return _ref.apply(this, arguments);
+    }
+
+    return read;
+  }(),
+
+  cancel: function PDFNetworkStreamFullRequestReader_cancel(reason) {
+    this._done = true;
+    this._headersReceivedCapability.reject(reason);
+    this._requests.forEach(function (requestCapability) {
+      requestCapability.resolve({
+        value: undefined,
+        done: true
+      });
+    });
+    this._requests = [];
+    if (this._manager.isPendingRequest(this._fullRequestId)) {
+      this._manager.abortRequest(this._fullRequestId);
+    }
+    this._fullRequestReader = null;
+  }
+};
+function PDFNetworkStreamRangeRequestReader(manager, begin, end) {
+  this._manager = manager;
+  var args = {
+    onDone: this._onDone.bind(this),
+    onProgress: this._onProgress.bind(this)
+  };
+  this._requestId = manager.requestRange(begin, end, args);
+  this._requests = [];
+  this._queuedChunk = null;
+  this._done = false;
+  this.onProgress = null;
+  this.onClosed = null;
+}
+PDFNetworkStreamRangeRequestReader.prototype = {
+  _close: function PDFNetworkStreamRangeRequestReader_close() {
+    if (this.onClosed) {
+      this.onClosed(this);
+    }
+  },
+  _onDone: function PDFNetworkStreamRangeRequestReader_onDone(data) {
+    var chunk = data.chunk;
+    if (this._requests.length > 0) {
+      var requestCapability = this._requests.shift();
+      requestCapability.resolve({
+        value: chunk,
+        done: false
+      });
+    } else {
+      this._queuedChunk = chunk;
+    }
+    this._done = true;
+    this._requests.forEach(function (requestCapability) {
+      requestCapability.resolve({
+        value: undefined,
+        done: true
+      });
+    });
+    this._requests = [];
+    this._close();
+  },
+  _onProgress: function PDFNetworkStreamRangeRequestReader_onProgress(evt) {
+    if (!this.isStreamingSupported && this.onProgress) {
+      this.onProgress({ loaded: evt.loaded });
+    }
+  },
+  get isStreamingSupported() {
+    return false;
+  },
+  read: function () {
+    var _ref2 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee2() {
+      var chunk, requestCapability;
+      return _regenerator2.default.wrap(function _callee2$(_context2) {
+        while (1) {
+          switch (_context2.prev = _context2.next) {
+            case 0:
+              if (!(this._queuedChunk !== null)) {
+                _context2.next = 4;
+                break;
+              }
+
+              chunk = this._queuedChunk;
+
+              this._queuedChunk = null;
+              return _context2.abrupt('return', {
+                value: chunk,
+                done: false
+              });
+
+            case 4:
+              if (!this._done) {
+                _context2.next = 6;
+                break;
+              }
+
+              return _context2.abrupt('return', {
+                value: undefined,
+                done: true
+              });
+
+            case 6:
+              requestCapability = (0, _util.createPromiseCapability)();
+
+              this._requests.push(requestCapability);
+              return _context2.abrupt('return', requestCapability.promise);
+
+            case 9:
+            case 'end':
+              return _context2.stop();
+          }
+        }
+      }, _callee2, this);
+    }));
+
+    function read() {
+      return _ref2.apply(this, arguments);
+    }
+
+    return read;
+  }(),
+
+  cancel: function PDFNetworkStreamRangeRequestReader_cancel(reason) {
+    this._done = true;
+    this._requests.forEach(function (requestCapability) {
+      requestCapability.resolve({
+        value: undefined,
+        done: true
+      });
+    });
+    this._requests = [];
+    if (this._manager.isPendingRequest(this._requestId)) {
+      this._manager.abortRequest(this._requestId);
+    }
+    this._close();
+  }
+};
+exports.PDFNetworkStream = PDFNetworkStream;
+exports.NetworkManager = NetworkManager;
+
+/***/ })
+/******/ ]);
+});
+//# sourceMappingURL=pdf.js.map
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/build/pdf.js.map b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/build/pdf.js.map
new file mode 100644
index 0000000..57e89d8
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/build/pdf.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack://pdfjs-dist/build/pdf/webpack/universalModuleDefinition","webpack://pdfjs-dist/build/pdf/webpack/bootstrap","webpack://pdfjs-dist/build/pdf/src/pdf.js","webpack://pdfjs-dist/build/pdf/src/shared/util.js","webpack://pdfjs-dist/build/pdf/src/shared/compatibility.js","webpack://pdfjs-dist/build/pdf/src/shared/global_scope.js","webpack://pdfjs-dist/build/pdf/src/shared/is_node.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/fn/string/includes.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/es6.string.includes.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_export.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_global.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_core.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_hide.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_object-dp.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_an-object.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_is-object.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_ie8-dom-define.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_descriptors.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_fails.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_dom-create.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_to-primitive.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_property-desc.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_redefine.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_has.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_uid.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_ctx.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_a-function.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_string-context.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_is-regexp.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_cof.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_wks.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_shared.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_library.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_defined.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_fails-is-regexp.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/fn/array/includes.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/es7.array.includes.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_array-includes.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_to-iobject.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_iobject.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_to-length.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_to-integer.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_to-absolute-index.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_add-to-unscopables.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/fn/object/assign.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/es6.object.assign.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_object-assign.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_object-keys.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_object-keys-internal.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_shared-key.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_enum-bug-keys.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_object-gops.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_object-pie.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_to-object.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/fn/math/log2.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/es6.math.log2.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/fn/number/is-nan.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/es6.number.is-nan.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/fn/number/is-integer.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/es6.number.is-integer.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_is-integer.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/fn/promise.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/es6.object.to-string.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_classof.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/es6.string.iterator.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_string-at.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_iter-define.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_iterators.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_iter-create.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_object-create.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_object-dps.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_html.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_set-to-string-tag.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_object-gpo.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/web.dom.iterable.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/es6.array.iterator.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_iter-step.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/es6.promise.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_an-instance.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_for-of.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_iter-call.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_is-array-iter.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/core.get-iterator-method.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_species-constructor.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_task.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_invoke.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_microtask.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_new-promise-capability.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_perform.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_user-agent.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_promise-resolve.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_redefine-all.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_set-species.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_iter-detect.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/es7.promise.finally.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/es7.promise.try.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/fn/weak-map.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/es6.weak-map.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_array-methods.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_array-species-create.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_array-species-constructor.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_is-array.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_meta.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_collection-weak.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_validate-collection.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_collection.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_inherit-if-required.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_set-proto.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_object-gopd.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/es7.weak-map.of.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_set-collection-of.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/es7.weak-map.from.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_set-collection-from.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/fn/string/code-point-at.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/es6.string.code-point-at.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/fn/string/from-code-point.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/es6.string.from-code-point.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/es6/symbol.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/es6.symbol.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_wks-ext.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_wks-define.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_enum-keys.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_object-gopn-ext.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_object-gopn.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/fn/object/values.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/es7.object.values.js","webpack://pdfjs-dist/build/pdf/node_modules/core-js/modules/_object-to-array.js","webpack://pdfjs-dist/build/pdf/src/shared/streams_polyfill.js","webpack://pdfjs-dist/build/pdf/external/streams/streams-lib.js","webpack://pdfjs-dist/build/pdf/src/shared/url_polyfill.js","webpack://pdfjs-dist/build/pdf/external/url/url-lib.js","webpack://pdfjs-dist/build/pdf/src/display/api.js","webpack://pdfjs-dist/build/pdf/src/display/dom_utils.js","webpack://pdfjs-dist/build/pdf/src/display/font_loader.js","webpack://pdfjs-dist/build/pdf/src/display/api_compatibility.js","webpack://pdfjs-dist/build/pdf/src/display/canvas.js","webpack://pdfjs-dist/build/pdf/src/display/pattern_helper.js","webpack://pdfjs-dist/build/pdf/src/display/worker_options.js","webpack://pdfjs-dist/build/pdf/src/shared/message_handler.js","webpack://pdfjs-dist/build/pdf/node_modules/babel-runtime/regenerator/index.js","webpack://pdfjs-dist/build/pdf/node_modules/regenerator-runtime/runtime-module.js","webpack://pdfjs-dist/build/pdf/node_modules/regenerator-runtime/runtime.js","webpack://pdfjs-dist/build/pdf/node_modules/webpack/buildin/module.js","webpack://pdfjs-dist/build/pdf/src/display/metadata.js","webpack://pdfjs-dist/build/pdf/src/display/xml_parser.js","webpack://pdfjs-dist/build/pdf/src/display/transport_stream.js","webpack://pdfjs-dist/build/pdf/src/display/webgl.js","webpack://pdfjs-dist/build/pdf/src/display/text_layer.js","webpack://pdfjs-dist/build/pdf/src/display/annotation_layer.js","webpack://pdfjs-dist/build/pdf/src/display/svg.js","webpack://pdfjs-dist/build/pdf/src/display/node_stream.js","webpack://pdfjs-dist/build/pdf/src/display/network_utils.js","webpack://pdfjs-dist/build/pdf/src/display/content_disposition.js","webpack://pdfjs-dist/build/pdf/src/display/fetch_stream.js","webpack://pdfjs-dist/build/pdf/src/display/network.js"],"names":["pdfjsVersion","pdfjsBuild","pdfjsSharedUtil","require","pdfjsDisplayAPI","pdfjsDisplayTextLayer","pdfjsDisplayAnnotationLayer","pdfjsDisplayDOMUtils","pdfjsDisplaySVG","pdfjsDisplayWorkerOptions","pdfjsDisplayAPICompatibility","isNodeJS","PDFNodeStream","Response","PDFFetchStream","PDFNetworkStream","exports","IDENTITY_MATRIX","FONT_IDENTITY_MATRIX","NativeImageDecoding","NONE","DECODE","DISPLAY","PermissionFlag","PRINT","MODIFY_CONTENTS","COPY","MODIFY_ANNOTATIONS","FILL_INTERACTIVE_FORMS","COPY_FOR_ACCESSIBILITY","ASSEMBLE","PRINT_HIGH_QUALITY","TextRenderingMode","FILL","STROKE","FILL_STROKE","INVISIBLE","FILL_ADD_TO_PATH","STROKE_ADD_TO_PATH","FILL_STROKE_ADD_TO_PATH","ADD_TO_PATH","FILL_STROKE_MASK","ADD_TO_PATH_FLAG","ImageKind","GRAYSCALE_1BPP","RGB_24BPP","RGBA_32BPP","AnnotationType","TEXT","LINK","FREETEXT","LINE","SQUARE","CIRCLE","POLYGON","POLYLINE","HIGHLIGHT","UNDERLINE","SQUIGGLY","STRIKEOUT","STAMP","CARET","INK","POPUP","FILEATTACHMENT","SOUND","MOVIE","WIDGET","SCREEN","PRINTERMARK","TRAPNET","WATERMARK","THREED","REDACT","AnnotationFlag","HIDDEN","NOZOOM","NOROTATE","NOVIEW","READONLY","LOCKED","TOGGLENOVIEW","LOCKEDCONTENTS","AnnotationFieldFlag","REQUIRED","NOEXPORT","MULTILINE","PASSWORD","NOTOGGLETOOFF","RADIO","PUSHBUTTON","COMBO","EDIT","SORT","FILESELECT","MULTISELECT","DONOTSPELLCHECK","DONOTSCROLL","COMB","RICHTEXT","RADIOSINUNISON","COMMITONSELCHANGE","AnnotationBorderStyleType","SOLID","DASHED","BEVELED","INSET","StreamType","UNKNOWN","FLATE","LZW","DCT","JPX","JBIG","A85","AHX","CCF","RL","FontType","TYPE1","TYPE1C","CIDFONTTYPE0","CIDFONTTYPE0C","TRUETYPE","CIDFONTTYPE2","TYPE3","OPENTYPE","TYPE0","MMTYPE1","VerbosityLevel","ERRORS","WARNINGS","INFOS","CMapCompressionType","BINARY","STREAM","OPS","dependency","setLineWidth","setLineCap","setLineJoin","setMiterLimit","setDash","setRenderingIntent","setFlatness","setGState","save","restore","transform","moveTo","lineTo","curveTo","curveTo2","curveTo3","closePath","rectangle","stroke","closeStroke","fill","eoFill","fillStroke","eoFillStroke","closeFillStroke","closeEOFillStroke","endPath","clip","eoClip","beginText","endText","setCharSpacing","setWordSpacing","setHScale","setLeading","setFont","setTextRenderingMode","setTextRise","moveText","setLeadingMoveText","setTextMatrix","nextLine","showText","showSpacedText","nextLineShowText","nextLineSetSpacingShowText","setCharWidth","setCharWidthAndBounds","setStrokeColorSpace","setFillColorSpace","setStrokeColor","setStrokeColorN","setFillColor","setFillColorN","setStrokeGray","setFillGray","setStrokeRGBColor","setFillRGBColor","setStrokeCMYKColor","setFillCMYKColor","shadingFill","beginInlineImage","beginImageData","endInlineImage","paintXObject","markPoint","markPointProps","beginMarkedContent","beginMarkedContentProps","endMarkedContent","beginCompat","endCompat","paintFormXObjectBegin","paintFormXObjectEnd","beginGroup","endGroup","beginAnnotations","endAnnotations","beginAnnotation","endAnnotation","paintJpegXObject","paintImageMaskXObject","paintImageMaskXObjectGroup","paintImageXObject","paintInlineImageXObject","paintInlineImageXObjectGroup","paintImageXObjectRepeat","paintImageMaskXObjectRepeat","paintSolidColorImageMask","constructPath","UNSUPPORTED_FEATURES","unknown","forms","javaScript","smask","shadingPattern","font","PasswordResponses","NEED_PASSWORD","INCORRECT_PASSWORD","verbosity","Number","console","unreachable","base","other","url","absoluteUrl","baseUrl","_isValidProtocol","Object","enumerable","configurable","writable","lookup","initializer","PasswordException","UnknownErrorException","InvalidPDFException","MissingPDFException","UnexpectedResponseException","MissingDataException","XRefParseException","FormatError","AbortException","NullCharactersRegExp","warn","str","assert","bytes","length","MAX_ARGUMENT_COUNT","String","strBuf","i","chunkEnd","Math","chunk","arr","resultLength","ii","item","itemLength","arrayByteLength","pos","data","stringToBytes","value","x","offset","buffer8","view32","getArray","stopWhenFound","LOOP_LIMIT","loopCount","dict","values","Util","rgbBuf","m1","m2","xt","p","m","yt","d","p1","p2","r","p3","p4","v","transpose","a","b","c","first","second","sx","sy","rect","orderedX","rect1","rect2","orderedY","result","ROMAN_NUMBER_MAP","lowerCase","number","romanBuf","romanStr","PDFStringTranslateTable","n","code","decodeURIComponent","escape","unescape","encodeURIComponent","ch","capability","createObjectURL","digits","forceDataSchema","URL","blob","type","buffer","b1","b2","b3","d1","d2","d3","d4","globalScope","hasDOM","Buffer","get","scripts","document","Element","div","originalDOMTokenListToggle","DOMTokenList","arguments","force","Array","module","window","global","self","process","$export","context","INCLUDES","includes","core","hide","redefine","ctx","PROTOTYPE","IS_FORCED","IS_GLOBAL","IS_STATIC","IS_PROTO","IS_BIND","target","expProto","source","own","out","exp","Function","__g","version","__e","dP","createDesc","object","anObject","IE8_DOM_DEFINE","toPrimitive","P","TypeError","O","Attributes","isObject","it","is","S","val","fn","has","SRC","TO_STRING","$toString","TPL","isFunction","hasOwnProperty","id","px","key","aFunction","that","isRegExp","defined","cof","MATCH","toString","store","uid","Symbol","USE_SYMBOL","$exports","SHARED","mode","copyright","re","$includes","toIObject","toLength","toAbsoluteIndex","index","IS_INCLUDES","el","IObject","toInteger","min","ceil","floor","isNaN","max","UNSCOPABLES","ArrayProto","assign","getKeys","gOPS","pIE","toObject","$assign","A","B","K","T","aLen","getSymbols","isEnum","keys","j","$keys","enumBugKeys","arrayIndexOf","IE_PROTO","names","shared","log2","isInteger","isFinite","classof","test","TAG","ARG","tryGet","$at","done","point","s","l","LIBRARY","Iterators","$iterCreate","setToStringTag","getPrototypeOf","ITERATOR","BUGGY","FF_ITERATOR","KEYS","VALUES","returnThis","getMethod","kind","proto","NAME","DEF_VALUES","DEFAULT","VALUES_BUG","Base","$native","$default","$entries","$anyNative","IteratorPrototype","methods","IS_SET","entries","create","descriptor","Constructor","next","dPs","Empty","createDict","iframe","lt","gt","iframeDocument","Properties","def","stat","ObjectProto","$iterators","wks","TO_STRING_TAG","ArrayValues","DOMIterables","CSSRuleList","CSSStyleDeclaration","CSSValueList","ClientRectList","DOMRectList","DOMStringList","DataTransferItemList","FileList","HTMLAllCollection","HTMLCollection","HTMLFormElement","HTMLSelectElement","MediaList","MimeTypeArray","NamedNodeMap","NodeList","PaintRequestList","Plugin","PluginArray","SVGLengthList","SVGNumberList","SVGPathSegList","SVGPointList","SVGStringList","SVGTransformList","SourceBufferList","StyleSheetList","TextTrackCueList","TextTrackList","TouchList","collections","explicit","Collection","addToUnscopables","step","anInstance","forOf","speciesConstructor","task","microtask","newPromiseCapabilityModule","perform","userAgent","promiseResolve","PROMISE","versions","v8","$Promise","isNode","empty","newPromiseCapability","newGenericPromiseCapability","USE_NATIVE","promise","FakePromise","exec","isThenable","notify","chain","ok","run","handler","reaction","resolve","reject","domain","onHandleUnhandled","exited","then","isReject","onUnhandled","unhandled","isUnhandled","reason","$reject","$resolve","wrapper","_w","_d","Internal","executor","OwnPromiseCapability","C","Promise","Wrapper","$$reject","all","remaining","$index","alreadyCalled","race","forbiddenField","name","call","isArrayIter","getIterFn","BREAK","RETURN","iterFn","f","iterable","iterator","ret","SPECIES","invoke","html","cel","setTask","clearTask","MessageChannel","Dispatch","counter","queue","ONREADYSTATECHANGE","listener","event","args","defer","channel","port","setTimeout","set","clear","un","macrotask","Observer","flush","parent","head","last","toggle","node","characterData","e","navigator","promiseCapability","src","DESCRIPTORS","SAFE_CLOSING","riter","safe","iter","each","meta","weak","fails","validate","WEAK_MAP","getWeak","isExtensible","uncaughtFrozenStore","tmp","$WeakMap","InternalMap","method","asc","IS_MAP","TYPE","IS_FILTER","IS_SOME","IS_EVERY","IS_FIND_INDEX","NO_HOLES","$create","res","isArray","original","META","setDesc","FREEZE","setMeta","w","fastKey","onFreeze","KEY","NEED","redefineAll","createArrayMethod","$has","arrayFind","arrayFindIndex","UncaughtFrozenStore","findUncaughtFrozen","entry","getConstructor","ufstore","$iterDetect","inheritIfRequired","ADDER","fixMethod","IS_WEAK","common","instance","HASNT_CHAINING","THROWS_ON_PRIMITIVES","ACCEPT_ITERABLES","BUGGY_ZERO","$instance","setPrototypeOf","check","buggy","gOPD","of","from","mapFn","mapping","cb","codePointAt","fromCharCode","$fromCodePoint","fromCodePoint","RangeError","$fails","wksExt","wksDefine","enumKeys","_create","gOPNExt","$GOPD","$DP","gOPN","$Symbol","$JSON","_stringify","TO_PRIMITIVE","SymbolRegistry","AllSymbols","OPSymbols","QObject","setter","setSymbolDesc","protoDesc","wrap","sym","isSymbol","$defineProperty","D","$defineProperties","$propertyIsEnumerable","E","$getOwnPropertyDescriptor","$getOwnPropertyNames","$getOwnPropertySymbols","IS_OP","tag","$set","es6Symbols","wellKnownSymbols","k","keyFor","useSetter","useSimple","defineProperty","defineProperties","getOwnPropertyDescriptor","getOwnPropertyNames","getOwnPropertySymbols","stringify","$replacer","replacer","symbols","windowNames","getWindowNames","hiddenKeys","$values","isReadableStreamSupported","start","controller","installedModules","modules","__w_pdfjs_require__","getter","_typeof","obj","_require","elements","IsPropertyKey","Call","F","highWaterMark","size","message","AssertionError","Error","rethrowAssertionErrorRejection","_createClass","props","InvokeOrNoop","PromiseInvokeOrNoop","ValidateAndNormalizeQueuingStrategy","typeIsObject","_require2","_require3","DequeueValue","EnqueueValueWithSize","PeekQueueValue","ResetQueue","WritableStream","underlyingSink","_ref","_ref$highWaterMark","_classCallCheck","IsWritableStream","streamBrandCheckException","IsWritableStreamLocked","WritableStreamAbort","AcquireWritableStreamDefaultWriter","WritableStreamDefaultControllerError","WritableStreamDefaultWriterCloseWithErrorPropagation","WritableStreamDefaultWriterRelease","WritableStreamDefaultWriterWrite","WritableStreamCloseQueuedOrInFlight","stream","state","error","wasAlreadyErroring","_resolve","_reject","_reason","_wasAlreadyErroring","WritableStreamStartErroring","writeRequest","WritableStreamFinishErroring","writer","WritableStreamDefaultWriterEnsureReadyPromiseRejected","WritableStreamHasOperationMarkedInFlight","storedError","WritableStreamRejectCloseAndClosedPromiseIfNeeded","abortRequest","WritableStreamDealWithRejection","defaultWriterClosedPromiseResolve","defaultWriterClosedPromiseReject","backpressure","defaultWriterReadyPromiseReset","defaultWriterReadyPromiseResolve","WritableStreamDefaultWriter","defaultWriterReadyPromiseInitialize","defaultWriterReadyPromiseInitializeAsResolved","defaultWriterClosedPromiseInitialize","defaultWriterReadyPromiseInitializeAsRejected","defaultWriterClosedPromiseInitializeAsResolved","defaultWriterClosedPromiseInitializeAsRejected","IsWritableStreamDefaultWriter","defaultWriterBrandCheckException","defaultWriterLockException","WritableStreamDefaultWriterAbort","WritableStreamDefaultWriterClose","WritableStreamDefaultWriterGetDesiredSize","closeRequest","WritableStreamDefaultControllerClose","defaultWriterClosedPromiseResetToRejected","defaultWriterReadyPromiseReject","defaultWriterReadyPromiseResetToRejected","WritableStreamDefaultControllerGetDesiredSize","releasedError","WritableStreamDefaultWriterEnsureClosedPromiseRejected","chunkSize","WritableStreamDefaultControllerGetChunkSize","WritableStreamAddWriteRequest","WritableStreamDefaultControllerWrite","WritableStreamDefaultController","normalizedStrategy","WritableStreamDefaultControllerGetBackpressure","WritableStreamUpdateBackpressure","IsWritableStreamDefaultController","_this","startResult","WritableStreamDefaultControllerAdvanceQueueIfNeeded","strategySize","WritableStreamDefaultControllerErrorIfNeeded","writeRecord","WritableStreamDefaultControllerProcessClose","WritableStreamDefaultControllerProcessWrite","WritableStreamMarkCloseRequestInFlight","sinkClosePromise","WritableStreamFinishInFlightClose","WritableStreamFinishInFlightCloseWithError","WritableStreamMarkFirstWriteRequestInFlight","sinkWritePromise","WritableStreamFinishInFlightWrite","WritableStreamFinishInFlightWriteWithError","desiredSize","IsFiniteNonNegativeNumber","container","pair","ArrayBufferCopy","CreateIterResultObject","TransferArrayBuffer","ValidateAndNormalizeHighWaterMark","createArrayFromList","createDataProperty","_require4","_require5","ReadableStream","underlyingSource","typeString","IsReadableStream","IsReadableStreamLocked","ReadableStreamCancel","_ref2","AcquireReadableStreamDefaultReader","AcquireReadableStreamBYOBReader","_ref3","readable","ifIsObjectAndHasAPromiseIsHandledInternalSlotSetPromiseIsHandledToTrue","_ref4","preventClose","preventAbort","preventCancel","Boolean","reader","shuttingDown","currentWrite","_ref5","isOrBecomesErrored","shutdownWithAction","shutdown","isOrBecomesClosed","dest","destClosed","pipeLoop","oldCurrentWrite","action","waitForWritesToFinish","finalize","ReadableStreamReaderGenericRelease","branches","ReadableStreamTee","IsReadableStreamDisturbed","ReadableStreamDefaultControllerClose","ReadableStreamDefaultControllerEnqueue","ReadableStreamDefaultControllerError","ReadableStreamDefaultControllerGetDesiredSize","teeState","closedOrErrored","canceled1","canceled2","reason1","reason2","pull","cancel1","cancel2","underlyingSource1","branch1Stream","underlyingSource2","branch2Stream","branch1","branch2","value1","value2","compositeReason","cancelResult","IsReadableStreamBYOBReader","readIntoRequest","IsReadableStreamDefaultReader","readRequest","ReadableStreamClose","sourceCancelPromise","defaultReaderClosedPromiseResolve","_i","defaultReaderClosedPromiseReject","ReadableStreamDefaultReader","ReadableStreamReaderGenericInitialize","defaultReaderBrandCheckException","readerLockException","ReadableStreamReaderGenericCancel","ReadableStreamDefaultReaderRead","ReadableStreamBYOBReader","IsReadableByteStreamController","byobReaderBrandCheckException","ArrayBuffer","view","ReadableStreamBYOBReaderRead","defaultReaderClosedPromiseInitialize","defaultReaderClosedPromiseInitializeAsResolved","defaultReaderClosedPromiseInitializeAsRejected","defaultReaderClosedPromiseResetToRejected","ReadableByteStreamControllerPullInto","ReadableStreamDefaultController","ReadableStreamDefaultControllerCallPullIfNeeded","ReadableStreamDefaultControllerErrorIfNeeded","IsReadableStreamDefaultController","defaultControllerBrandCheckException","pendingPromise","ReadableStreamAddReadRequest","shouldPull","ReadableStreamDefaultControllerShouldCallPull","pullPromise","ReadableStreamGetNumReadRequests","ReadableStreamFulfillReadRequest","ReadableStreamError","ReadableStreamBYOBRequest","IsReadableStreamBYOBRequest","byobRequestBrandCheckException","ReadableByteStreamControllerRespond","ReadableByteStreamControllerRespondWithNewView","ReadableByteStreamController","ReadableByteStreamControllerClearPendingPullIntos","autoAllocateChunkSize","underlyingByteSource","ReadableByteStreamControllerCallPullIfNeeded","ReadableByteStreamControllerError","byteStreamControllerBrandCheckException","ReadableByteStreamControllerClose","ReadableByteStreamControllerEnqueue","firstDescriptor","ReadableStreamHasDefaultReader","ReadableByteStreamControllerHandleQueueDrain","pullIntoDescriptor","byteOffset","byteLength","bytesFilled","elementSize","ctor","readerType","ReadableByteStreamControllerGetDesiredSize","ReadableByteStreamControllerShouldCallPull","ReadableByteStreamControllerInvalidateBYOBRequest","filledView","ReadableByteStreamControllerConvertPullIntoDescriptor","ReadableStreamFulfillReadIntoRequest","currentAlignedBytes","maxBytesToCopy","maxBytesFilled","maxAlignedBytes","totalBytesToCopyRemaining","ready","headOfQueue","bytesToCopy","destStart","ReadableByteStreamControllerFillHeadPullIntoDescriptor","ReadableByteStreamControllerFillPullIntoDescriptorFromQueue","ReadableByteStreamControllerShiftPendingPullInto","ReadableByteStreamControllerCommitPullIntoDescriptor","ReadableStreamAddReadIntoRequest","emptyView","ReadableStreamHasBYOBReader","ReadableStreamGetNumReadIntoRequests","remainderSize","end","remainder","ReadableByteStreamControllerEnqueueChunkToQueue","ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue","bytesWritten","ReadableByteStreamControllerRespondInClosedState","ReadableByteStreamControllerRespondInReadableState","firstPendingPullInto","transferredBuffer","transferredView","ReadableByteStreamControllerRespondInternal","transformStream","readableStream","writableStream","PromiseInvokeOrPerformFallback","TransformStreamCloseReadableInternal","TransformStreamErrorIfNeeded","maybeBackpressure","TransformStreamSetBackpressure","TransformStreamErrorInternal","resolution","transformStreamController","TransformStreamEnqueueToReadable","transformer","transformPromise","TransformStreamReadableReadyPromise","TransformStreamSink","TransformStreamTransform","flushPromise","TransformStreamSource","TransformStreamDefaultController","IsTransformStream","IsTransformStreamDefaultController","TransformStreamCloseReadable","TransformStreamError","readableController","TransformStream","readableStrategy","writableStrategy","startPromise_resolve","startPromise","sink","isURLSupported","u","PolyfillURL","OriginalURL","relative","relativePathDotMapping","h","invalid","unicode","ALPHA","ALPHANUMERIC","errors","stateOverride","cursor","seenAt","seenBracket","input","err","isRelativeScheme","percentEscape","nextC","nextNextC","cp","tempC","IDNAToASCII","temp","parseInt","percentEscapeQuery","parse","JURL","authority","host","DEFAULT_RANGE_CHUNK_SIZE","isWorkerDisabled","fakeWorkerFilesLoader","useRequireEnsure","__non_webpack_require__","requirejs","fallbackWorkerSrc","dynamicLoaderSupported","worker","pdfjsFilePath","createPDFNetworkStream","isArrayBuffer","range","params","rangeTransport","pdfBytes","NativeImageDecoderValues","apiCompatibilityParams","setVerbosityLevel","workerParams","postMessageTransfers","workerPort","GlobalWorkerOptions","PDFWorker","docId","networkStream","initialData","disableRange","disableStream","httpHeaders","withCredentials","rangeChunkSize","messageHandler","transport","pdfDataRangeTransport","apiVersion","password","disableAutoFetch","maxImageSize","disableFontFace","disableCreateObjectURL","docBaseUrl","nativeImageDecoderSupport","ignoreErrors","isEvalSupported","PDFDocumentLoadingTask","nextDocumentId","destroy","transportDestroyed","constructor","addRangeListener","addProgressListener","addProgressiveReadListener","onDataRange","onDataProgress","onDataProgressiveRead","requestDataRange","getPage","getPageIndex","getDestination","PDFPageProxy","pdfBug","getViewport","rotate","dontFlip","viewBox","rotation","getAnnotations","intent","render","stats","renderingIntent","canvasFactory","webGLContext","enable","intentState","fnArray","argsArray","lastChunk","pageIndex","renderInteractiveForms","complete","internalRenderTask","renderTask","getOperatorList","opListTask","streamTextContent","TEXT_CONTENT_CHUNK_SIZE","normalizeWhitespace","combineTextItems","textContent","getTextContent","items","styles","_destroy","waitOn","renderCompleted","cleanup","resetStats","_tryCleanup","_startRenderPage","_renderPageChunk","operatorListChunk","postMessage","cloned","transferable","transfers","desc","cloneValue","addEventListener","removeEventListener","nextFakeWorkerId","fakeWorkerFilesLoadedCapability","mainWorkerMessageHandler","loader","pdfWorkerPorts","_initializeFromPort","_initialize","workerSrc","isSameOrigin","createCDNWrapper","terminateEarly","onWorkerError","sendTest","testObj","info","_setupFakeWorker","setupFakeWorkerGlobal","workerHandler","WorkerMessageHandler","loadingTask","isCompressed","page","terminated","loaded","evt","total","headersCapability","fullReader","isStreamingSupported","isRangeSupported","contentLength","rangeReader","pdfInfo","updatePassword","exception","exportedError","exportedData","fontRegistry","registerFont","onUnsupportedFeature","fontReady","pageProxy","img","MAX_IMAGE_SIZE_TO_STORE","imageData","components","width","height","rgbaLength","buf","tmpCanvas","tmpCtx","_onUnsupportedFeature","pageNumber","results","metadata","contentDispositionFilename","PDFObjects","ensureObj","resolved","isResolved","objs","hasData","getData","RenderTask","cancel","InternalRenderTask","canvasInRendering","initializeGraphics","viewport","background","operatorListChanged","_continue","_scheduleNext","_next","build","DEFAULT_LINK_REL","SVG_NS","canvas","reset","canvasAndContext","fetch","request","XMLHttpRequest","cMapData","compressionType","svg","createElement","offsetX","offsetY","centerX","centerY","rotateA","rotateB","rotateC","rotateD","offsetCanvasX","offsetCanvasY","clone","scale","convertToViewportPoint","convertToViewportRectangle","tl","br","convertToPdfPoint","RenderingCancelledException","LinkTarget","SELF","BLANK","PARENT","TOP","LinkTargetStringMap","link","removeNullCharacters","LinkTargetValues","targetIndex","anchor","query","time","Date","timeEnd","times","longest","span","duration","script","requests","nextRequestId","addNativeFontFace","insertRule","styleElement","styleSheet","bind","rules","fontsToLoad","fontLoadPromises","getNativeFontPromise","nativeFontFace","rule","_queueLoadingCallback","otherRequest","_prepareFontLoadEvent","FontLoader","chunk1","chunk2","called","isFontReady","loadTestFontId","COMMENT_OFFSET","spliceString","CFF_CHECKSUM_OFFSET","XXXX_VALUE","checksum","int32","string32","btoa","fonts","supported","shadow","getLoadTestFont","atob","IsEvalSupportedCached","translatedData","bytesToString","getPathGenerator","cmds","featureId","js","current","compatibilityParams","isIE","isIOSChrome","MIN_FONT_SIZE","MAX_FONT_SIZE","MAX_GROUP_SIZE","MIN_WIDTH_FACTOR","COMPILE_TYPE3_GLYPHS","MAX_SIZE_TO_COMPILE","FULL_CHUNK_HEIGHT","IsLittleEndianCached","ad_bc","bc_ad","old","prev","cosValue","sinValue","CachedCanvases","getCanvas","canvasEntry","addContextCurrentTransform","POINT_TO_PROCESS_LIMIT","imgData","width1","points","POINT_TYPES","lineSize","data0","mask","elem","count","j0","sum","steps","outlines","coords","p0","pp","drawOutline","o","jj","CanvasExtraState","setCurrentPoint","CanvasGraphics","EXECUTION_TIME","EXECUTION_STEPS","partialChunkHeight","fullChunks","totalChunks","chunkImgData","srcPos","srcLength","dest32","dest32DataLength","fullSrcDiff","white","black","thisChunkHeight","destPos","srcDiff","kEnd","kEndUnrolled","srcByte","elemsInThisChunk","properties","property","sourceCtx","destCtx","alpha","alpha_","r0","g0","b0","maskData","transferMap","layerData","y","hasBackdrop","backdrop","subtype","composeFn","PIXELS_TO_PROCESS","row","chunkHeight","maskCtx","layerCtx","composeSMaskBackdrop","composed","layer","genericComposeSMask","LINE_CAP_STYLES","LINE_JOIN_STYLES","NORMAL_CLIP","EO_CLIP","beginDrawing","transparentCanvas","resetCtxToDefault","executeOperatorList","operatorList","executionStartIdx","argsArrayLen","chunkOperations","endTime","commonObjs","stepper","fnId","deps","nn","depObjId","objsPool","endDrawing","states","beginSMaskGroup","activeSMask","drawnWidth","drawnHeight","cacheId","scratchCanvas","currentCtx","currentTransform","groupCtx","copyCtxState","suspendSMaskGroup","composeSMask","deltaTransform","resumeSMaskGroup","endSMaskGroup","ops","xw","yh","consumePath","strokeColor","fillColor","isPatternFill","needRestore","paths","path","fontObj","bold","italic","typeface","browserFontSize","paintChar","textRenderingMode","fontSize","fillStrokeMode","isAddToPathSet","patternFill","addToPath","enabled","fontSizeScale","charSpacing","wordSpacing","fontDirection","textHScale","glyphsLength","glyphs","vertical","spacingDir","defaultVMetrics","widthAdvanceScale","simpleFillText","pattern","patternTransform","lineWidth","glyph","isNum","restoreNeeded","spacing","character","accent","vmetric","vx","vy","scaledX","scaledY","measuredWidth","characterScaleX","scaledAccentX","scaledAccentY","charWidth","showType3Text","fontMatrix","isTextInvisible","spacingLength","transformed","urx","ury","getColorN_Pattern","IR","color","baseTransform","canvasGraphicsFactory","createCanvasGraphics","getShadingPatternFromIR","inv","bl","ul","ur","x0","y0","x1","y1","matrix","bbox","group","bounds","canvasBounds","scaleX","scaleY","startTransformInverse","domImage","position","left","top","maskCanvas","putBinaryImageMask","positions","images","image","map","widthScale","heightScale","imgToPaint","putBinaryImageData","paintWidth","paintHeight","tmpCanvasId","newWidth","newHeight","getSinglePixelWidth","inverse","getCanvasPosition","ShadingIRs","fromIR","raw","colorStops","r1","getPattern","grad","createMeshCanvas","colors","rowSize","c1","c2","c3","x2","y2","x3","y3","c1r","c1g","c1b","c2r","c2g","c2b","c3r","c3g","c3b","minY","maxY","xa","car","cag","cab","xb","cbr","cbg","cbb","x1_","x2_","ps","figure","cs","verticesPerRow","rows","cols","q","drawTriangle","EXPECTED_SCALE","MAX_PATTERN_SIZE","BORDER_SIZE","boundsWidth","boundsHeight","combinesScale","paddedWidth","paddedHeight","cachedCanvases","backgroundColor","figures","drawFigure","owner","matrixScale","temporaryPatternCanvas","shadingIR","TilingPattern","PaintType","COLORED","UNCOLORED","createPatternCanvas","xstep","ystep","paintType","tilingType","topLeft","botRight","curMatrixScale","combinedScale","graphics","tmpTranslate","setScale","transformToScale","tmpScale","scaleToContext","clipBbox","bboxWidth","bboxHeight","setFillAndStrokeStyleToContext","cssColor","thisArg","callbacksCapabilities","ah","callbackId","callback","wrapReason","sourceName","targetName","comObj","isReply","makeReasonSerializable","MessageHandler","on","send","sendWithPromise","sendWithStream","streamId","startCapability","startCall","isClosed","pullCapability","cancelCapability","_createStreamSink","sendStreamRequest","streamSink","enqueue","lastDesiredSize","close","sinkCapability","onPull","onCancel","isCancelled","resolveCall","success","_processStreamMessage","sendStreamResponse","deleteStreamController","resolveOrReject","g","hadRuntime","oldRuntime","Op","hasOwn","iteratorSymbol","asyncIteratorSymbol","toStringTagSymbol","inModule","runtime","protoGenerator","outerFn","generator","tryLocsList","makeInvokeMethod","arg","GenStateSuspendedStart","GenStateSuspendedYield","GenStateExecuting","GenStateCompleted","ContinueSentinel","getProto","NativeIteratorPrototype","Gp","GeneratorFunctionPrototype","Generator","GeneratorFunction","prototype","genFun","__await","record","tryCatch","previousPromise","defineIteratorMethods","AsyncIterator","delegate","delegateResult","maybeInvokeDelegate","tryLoc","locs","iteratorMethod","Context","stop","rootEntry","rootRecord","dispatchException","handle","hasCatch","hasFinally","abrupt","finallyEntry","finish","resetTryEntry","thrown","delegateYield","resultName","nextLoc","parser","xmlDocument","_repair","chars","_parse","rdf","nodeName","children","XMLParserErrorCode","NoError","EndOfDocument","UnterminatedCdat","UnterminatedXmlDeclaration","UnterminatedDoctypeDeclaration","UnterminatedComment","MalformedElement","OutOfMemory","UnterminatedAttributeValue","UnterminatedElement","ElementNeverBegun","isWhitespace","_resolveEntities","entity","_parseContent","attributes","attrName","attrValue","attrEndChar","attrEndIndex","parsed","_parseProcessingInstruction","attrStart","parseXml","ch2","pi","q2","complexDoctype","doctypeContent","content","text","onResolveEntity","onPi","onComment","onCdata","onDoctype","onText","onBeginElement","onEndElement","onError","child","parseFromString","isWhitespaceString","lastElement","PDFDataTransportStream","_onReceiveData","found","_onProgress","firstReader","_removeRangeReader","getFullReader","queuedChunks","getRangeReader","cancelAllRequests","readers","PDFDataTransportStreamReader","_enqueue","requestCapability","PDFDataTransportStreamRangeReader","requestsCapability","WebGLUtils","drawFigures","shader","gl","compiled","errorMsg","loadShader","program","shaders","linked","texture","currentCanvas","currentGL","premultipliedalpha","smaskVertexShaderCode","smaskFragmentShaderCode","smaskCache","vertexShader","createVertexShader","fragmentShader","createFragmentShader","cache","texCoordLocation","texLayerLocation","texMaskLocation","texCoordBuffer","createTexture","maskTexture","figuresVertexShaderCode","figuresFragmentShaderCode","figuresCache","coordsMap","colorsMap","pIndex","cIndex","col","coordsBuffer","colorsBuffer","tryInitGL","renderTextLayer","MAX_TEXT_DIVS_TO_RENDER","NonWhitespaceRegexp","styleBuf","textDiv","textDivProperties","style","angle","canvasWidth","originalTransform","paddingBottom","paddingLeft","paddingRight","paddingTop","isAllWhitespace","geom","tx","fontHeight","fontAscent","angleCos","angleSin","divWidth","divHeight","right","bottom","textDivs","textDivsLength","expanded","expandBounds","divProperties","ts","t","findPositiveMin","boxScale","box","x1New","x2New","expandBoundsLTR","boxes","fakeBoundary","horizon","boundary","maxXNew","horizonPart","affectedBoundary","xNew","changedHorizon","lastBoundary","useBoundary","used","textContentItemsStr","TextLayerRenderTask","clearTimeout","_processItems","len","appendText","_layoutText","textLayerFrag","fontFamily","_render","styleCache","textItems","textStyles","pump","expandTextDivs","expand","padding","renderParameters","textContentStream","enhanceTextSelection","parameters","fieldType","isRenderable","ignoreBorder","_createContainer","horizontalRadius","verticalRadius","radius","_createPopup","trigger","popupElement","title","contents","hideWrapper","popup","addLinkAttributes","linkService","rel","_bindLink","_bindNamedAction","JSON","TEXT_ALIGNMENT","element","fieldWidth","combWidth","_setTextStyle","fallbackName","selectElement","option","optionElement","IGNORE_TYPES","selector","parentElement","parentLeft","parseFloat","parentWidth","BACKGROUND_ENLIGHT","_formatContents","lines","line","pin","_show","unpin","_hide","borderWidth","square","circle","vertices","polyline","inkLists","inkList","getFilenameFromUrl","stringToPDFString","downloadManager","imageResourcesPath","svgFactory","SVGGraphics","SVG_DEFAULTS","fontStyle","fontWeight","convertImgDataToPng","PNG_HEADER","CHUNK_WRAPPER_SIZE","crcTable","crc","body","crc32","deflateSyncUncompressed","output","level","literals","maxBlockLength","deflateBlocks","idat","adler","adler32","colorType","bitDepth","offsetLiterals","offsetBytes","ihdr","deflateSync","pngLength","writePngChunk","encode","SVGExtraState","opTree","opListLen","opList","pf","XML_NS","XLINK_NS","clipCount","maskCount","loadDependencies","fnArrayLen","transformMatrix","getSVG","svgElement","convertOpList","REVOPS","opListToTree","executeOpTree","opTreeLen","textMatrix","pm","addFontStyle","details","setStrokeAlpha","setFillAlpha","opLength","clipId","clipPath","clipElement","_setStrokeAttributes","imgObj","imgEl","imgSrc","cliprect","definitions","rootGroup","_ensureClipGroup","clipGroup","_ensureTransformGroup","fs","http","https","fileUriRegex","parsedUrl","parseUrl","_error","_setReadableStream","protocol","auth","handleResponse","response","getResponseHeader","isHttp","suggestedLength","extractFilenameFromHeader","createRequestOptions","returnValues","allowRangeRequests","contentEncoding","contentDisposition","filename","getFilenameFromContentDispositionHeader","status","needsEncodingFixup","toParamRegExp","rfc2616unquote","rfc5987decode","rfc2047decode","fixupEncoding","rfc2231getparam","decoder","fatal","textdecode","matches","parts","part","quotindex","encodingend","extvalue","encoding","langvalue","signal","abortController","credentials","redirect","createFetchOptions","validateResponseStatus","createResponseStatusError","rangeStr","begin","OK_RESPONSE","PARTIAL_CONTENT_RESPONSE","xhr","array","supportsMozChunked","NetworkManager","requestRange","listeners","requestFull","xhrId","pendingRequest","useMozChunkedLoading","onProgress","getArrayBuffer","onStateChange","xhrStatus","ok_response_on_range_request","rangeHeader","hasPendingRequests","getRequestXhr","isStreamingRequest","isPendingRequest","isLoadedRequest","abortAllRequests","_onRangeRequestReaderClosed","onHeadersReceived","onProgressiveData","onDone","manager","PDFNetworkStreamFullRequestReader","_onHeadersReceived","fullRequestXhrId","fullRequestXhr","networkManager","_onProgressiveData","_onDone","_onError","PDFNetworkStreamRangeRequestReader","_close"],"mappings":"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","file":"pdf.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"pdfjs-dist/build/pdf\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"pdfjs-dist/build/pdf\"] = factory();\n\telse\n\t\troot[\"pdfjs-dist/build/pdf\"] = factory();\n})(this, function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __w_pdfjs_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __w_pdfjs_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__w_pdfjs_require__.m = modules;\n\n \t// expose the module cache\n \t__w_pdfjs_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__w_pdfjs_require__.d = function(exports, name, getter) {\n \t\tif(!__w_pdfjs_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__w_pdfjs_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__w_pdfjs_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __w_pdfjs_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__w_pdfjs_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __w_pdfjs_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__w_pdfjs_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__w_pdfjs_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__w_pdfjs_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__w_pdfjs_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __w_pdfjs_require__(__w_pdfjs_require__.s = 0);\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* eslint-disable no-unused-vars, no-restricted-globals */\n\n'use strict';\n\nvar pdfjsVersion =\n  typeof PDFJSDev !== 'undefined' ? PDFJSDev.eval('BUNDLE_VERSION') : void 0;\nvar pdfjsBuild =\n  typeof PDFJSDev !== 'undefined' ? PDFJSDev.eval('BUNDLE_BUILD') : void 0;\n\nvar pdfjsSharedUtil = require('./shared/util.js');\nvar pdfjsDisplayAPI = require('./display/api.js');\nvar pdfjsDisplayTextLayer = require('./display/text_layer.js');\nvar pdfjsDisplayAnnotationLayer = require('./display/annotation_layer.js');\nvar pdfjsDisplayDOMUtils = require('./display/dom_utils.js');\nvar pdfjsDisplaySVG = require('./display/svg.js');\nlet pdfjsDisplayWorkerOptions = require('./display/worker_options.js');\nlet pdfjsDisplayAPICompatibility = require('./display/api_compatibility.js');\n\nif (typeof PDFJSDev === 'undefined' || PDFJSDev.test('GENERIC')) {\n  const isNodeJS = require('./shared/is_node.js');\n  if (isNodeJS()) {\n    let PDFNodeStream = require('./display/node_stream.js').PDFNodeStream;\n    pdfjsDisplayAPI.setPDFNetworkStreamFactory((params) => {\n      return new PDFNodeStream(params);\n    });\n  } else if (typeof Response !== 'undefined' && 'body' in Response.prototype &&\n             typeof ReadableStream !== 'undefined') {\n    let PDFFetchStream = require('./display/fetch_stream.js').PDFFetchStream;\n    pdfjsDisplayAPI.setPDFNetworkStreamFactory((params) => {\n      return new PDFFetchStream(params);\n    });\n  } else {\n    let PDFNetworkStream = require('./display/network.js').PDFNetworkStream;\n    pdfjsDisplayAPI.setPDFNetworkStreamFactory((params) => {\n      return new PDFNetworkStream(params);\n    });\n  }\n} else if (typeof PDFJSDev !== 'undefined' && PDFJSDev.test('CHROME')) {\n  let PDFNetworkStream = require('./display/network.js').PDFNetworkStream;\n  let PDFFetchStream;\n  let isChromeWithFetchCredentials = function() {\n    // fetch does not include credentials until Chrome 61.0.3138.0 and later.\n    // https://chromium.googlesource.com/chromium/src/+/2e231cf052ca5e68e22baf0008ac9e5e29121707\n    try {\n      // Indexed properties on window are read-only in Chrome 61.0.3151.0+\n      // https://chromium.googlesource.com/chromium/src.git/+/58ab4a971b06dec13e4edf9de8382ca6847f6190\n      window[999] = 123; // should throw. Note: JS strict mode MUST be enabled.\n      delete window[999];\n      return false;\n    } catch (e) {\n      return true;\n    }\n  };\n  if (typeof Response !== 'undefined' && 'body' in Response.prototype &&\n      typeof ReadableStream !== 'undefined' && isChromeWithFetchCredentials()) {\n    PDFFetchStream = require('./display/fetch_stream.js').PDFFetchStream;\n  }\n  pdfjsDisplayAPI.setPDFNetworkStreamFactory((params) => {\n    if (PDFFetchStream && /^https?:/i.test(params.url)) {\n      // \"fetch\" is only supported for http(s), not file/ftp.\n      return new PDFFetchStream(params);\n    }\n    return new PDFNetworkStream(params);\n  });\n}\n\nexports.build = pdfjsDisplayAPI.build;\nexports.version = pdfjsDisplayAPI.version;\nexports.getDocument = pdfjsDisplayAPI.getDocument;\nexports.LoopbackPort = pdfjsDisplayAPI.LoopbackPort;\nexports.PDFDataRangeTransport = pdfjsDisplayAPI.PDFDataRangeTransport;\nexports.PDFWorker = pdfjsDisplayAPI.PDFWorker;\nexports.renderTextLayer = pdfjsDisplayTextLayer.renderTextLayer;\nexports.AnnotationLayer = pdfjsDisplayAnnotationLayer.AnnotationLayer;\nexports.createPromiseCapability = pdfjsSharedUtil.createPromiseCapability;\nexports.PasswordResponses = pdfjsSharedUtil.PasswordResponses;\nexports.InvalidPDFException = pdfjsSharedUtil.InvalidPDFException;\nexports.MissingPDFException = pdfjsSharedUtil.MissingPDFException;\nexports.SVGGraphics = pdfjsDisplaySVG.SVGGraphics;\nexports.NativeImageDecoding = pdfjsSharedUtil.NativeImageDecoding;\nexports.CMapCompressionType = pdfjsSharedUtil.CMapCompressionType;\nexports.PermissionFlag = pdfjsSharedUtil.PermissionFlag;\nexports.UnexpectedResponseException =\n  pdfjsSharedUtil.UnexpectedResponseException;\nexports.OPS = pdfjsSharedUtil.OPS;\nexports.VerbosityLevel = pdfjsSharedUtil.VerbosityLevel;\nexports.UNSUPPORTED_FEATURES = pdfjsSharedUtil.UNSUPPORTED_FEATURES;\nexports.createValidAbsoluteUrl = pdfjsSharedUtil.createValidAbsoluteUrl;\nexports.createObjectURL = pdfjsSharedUtil.createObjectURL;\nexports.removeNullCharacters = pdfjsSharedUtil.removeNullCharacters;\nexports.shadow = pdfjsSharedUtil.shadow;\nexports.Util = pdfjsSharedUtil.Util;\nexports.ReadableStream = pdfjsSharedUtil.ReadableStream;\nexports.URL = pdfjsSharedUtil.URL;\nexports.RenderingCancelledException =\n  pdfjsDisplayDOMUtils.RenderingCancelledException;\nexports.getFilenameFromUrl = pdfjsDisplayDOMUtils.getFilenameFromUrl;\nexports.LinkTarget = pdfjsDisplayDOMUtils.LinkTarget;\nexports.addLinkAttributes = pdfjsDisplayDOMUtils.addLinkAttributes;\nexports.loadScript = pdfjsDisplayDOMUtils.loadScript;\nexports.GlobalWorkerOptions = pdfjsDisplayWorkerOptions.GlobalWorkerOptions;\nexports.apiCompatibilityParams =\n  pdfjsDisplayAPICompatibility.apiCompatibilityParams;\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport './compatibility';\nimport { ReadableStream } from './streams_polyfill';\nimport { URL } from './url_polyfill';\n\nconst IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0];\nconst FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0];\n\nconst NativeImageDecoding = {\n  NONE: 'none',\n  DECODE: 'decode',\n  DISPLAY: 'display',\n};\n\n// Permission flags from Table 22, Section 7.6.3.2 of the PDF specification.\nconst PermissionFlag = {\n  PRINT: 0x04,\n  MODIFY_CONTENTS: 0x08,\n  COPY: 0x10,\n  MODIFY_ANNOTATIONS: 0x20,\n  FILL_INTERACTIVE_FORMS: 0x100,\n  COPY_FOR_ACCESSIBILITY: 0x200,\n  ASSEMBLE: 0x400,\n  PRINT_HIGH_QUALITY: 0x800,\n};\n\nconst TextRenderingMode = {\n  FILL: 0,\n  STROKE: 1,\n  FILL_STROKE: 2,\n  INVISIBLE: 3,\n  FILL_ADD_TO_PATH: 4,\n  STROKE_ADD_TO_PATH: 5,\n  FILL_STROKE_ADD_TO_PATH: 6,\n  ADD_TO_PATH: 7,\n  FILL_STROKE_MASK: 3,\n  ADD_TO_PATH_FLAG: 4,\n};\n\nconst ImageKind = {\n  GRAYSCALE_1BPP: 1,\n  RGB_24BPP: 2,\n  RGBA_32BPP: 3,\n};\n\nconst AnnotationType = {\n  TEXT: 1,\n  LINK: 2,\n  FREETEXT: 3,\n  LINE: 4,\n  SQUARE: 5,\n  CIRCLE: 6,\n  POLYGON: 7,\n  POLYLINE: 8,\n  HIGHLIGHT: 9,\n  UNDERLINE: 10,\n  SQUIGGLY: 11,\n  STRIKEOUT: 12,\n  STAMP: 13,\n  CARET: 14,\n  INK: 15,\n  POPUP: 16,\n  FILEATTACHMENT: 17,\n  SOUND: 18,\n  MOVIE: 19,\n  WIDGET: 20,\n  SCREEN: 21,\n  PRINTERMARK: 22,\n  TRAPNET: 23,\n  WATERMARK: 24,\n  THREED: 25,\n  REDACT: 26,\n};\n\nconst AnnotationFlag = {\n  INVISIBLE: 0x01,\n  HIDDEN: 0x02,\n  PRINT: 0x04,\n  NOZOOM: 0x08,\n  NOROTATE: 0x10,\n  NOVIEW: 0x20,\n  READONLY: 0x40,\n  LOCKED: 0x80,\n  TOGGLENOVIEW: 0x100,\n  LOCKEDCONTENTS: 0x200,\n};\n\nconst AnnotationFieldFlag = {\n  READONLY: 0x0000001,\n  REQUIRED: 0x0000002,\n  NOEXPORT: 0x0000004,\n  MULTILINE: 0x0001000,\n  PASSWORD: 0x0002000,\n  NOTOGGLETOOFF: 0x0004000,\n  RADIO: 0x0008000,\n  PUSHBUTTON: 0x0010000,\n  COMBO: 0x0020000,\n  EDIT: 0x0040000,\n  SORT: 0x0080000,\n  FILESELECT: 0x0100000,\n  MULTISELECT: 0x0200000,\n  DONOTSPELLCHECK: 0x0400000,\n  DONOTSCROLL: 0x0800000,\n  COMB: 0x1000000,\n  RICHTEXT: 0x2000000,\n  RADIOSINUNISON: 0x2000000,\n  COMMITONSELCHANGE: 0x4000000,\n};\n\nconst AnnotationBorderStyleType = {\n  SOLID: 1,\n  DASHED: 2,\n  BEVELED: 3,\n  INSET: 4,\n  UNDERLINE: 5,\n};\n\nconst StreamType = {\n  UNKNOWN: 0,\n  FLATE: 1,\n  LZW: 2,\n  DCT: 3,\n  JPX: 4,\n  JBIG: 5,\n  A85: 6,\n  AHX: 7,\n  CCF: 8,\n  RL: 9,\n};\n\nconst FontType = {\n  UNKNOWN: 0,\n  TYPE1: 1,\n  TYPE1C: 2,\n  CIDFONTTYPE0: 3,\n  CIDFONTTYPE0C: 4,\n  TRUETYPE: 5,\n  CIDFONTTYPE2: 6,\n  TYPE3: 7,\n  OPENTYPE: 8,\n  TYPE0: 9,\n  MMTYPE1: 10,\n};\n\nconst VerbosityLevel = {\n  ERRORS: 0,\n  WARNINGS: 1,\n  INFOS: 5,\n};\n\nconst CMapCompressionType = {\n  NONE: 0,\n  BINARY: 1,\n  STREAM: 2,\n};\n\n// All the possible operations for an operator list.\nconst OPS = {\n  // Intentionally start from 1 so it is easy to spot bad operators that will be\n  // 0's.\n  dependency: 1,\n  setLineWidth: 2,\n  setLineCap: 3,\n  setLineJoin: 4,\n  setMiterLimit: 5,\n  setDash: 6,\n  setRenderingIntent: 7,\n  setFlatness: 8,\n  setGState: 9,\n  save: 10,\n  restore: 11,\n  transform: 12,\n  moveTo: 13,\n  lineTo: 14,\n  curveTo: 15,\n  curveTo2: 16,\n  curveTo3: 17,\n  closePath: 18,\n  rectangle: 19,\n  stroke: 20,\n  closeStroke: 21,\n  fill: 22,\n  eoFill: 23,\n  fillStroke: 24,\n  eoFillStroke: 25,\n  closeFillStroke: 26,\n  closeEOFillStroke: 27,\n  endPath: 28,\n  clip: 29,\n  eoClip: 30,\n  beginText: 31,\n  endText: 32,\n  setCharSpacing: 33,\n  setWordSpacing: 34,\n  setHScale: 35,\n  setLeading: 36,\n  setFont: 37,\n  setTextRenderingMode: 38,\n  setTextRise: 39,\n  moveText: 40,\n  setLeadingMoveText: 41,\n  setTextMatrix: 42,\n  nextLine: 43,\n  showText: 44,\n  showSpacedText: 45,\n  nextLineShowText: 46,\n  nextLineSetSpacingShowText: 47,\n  setCharWidth: 48,\n  setCharWidthAndBounds: 49,\n  setStrokeColorSpace: 50,\n  setFillColorSpace: 51,\n  setStrokeColor: 52,\n  setStrokeColorN: 53,\n  setFillColor: 54,\n  setFillColorN: 55,\n  setStrokeGray: 56,\n  setFillGray: 57,\n  setStrokeRGBColor: 58,\n  setFillRGBColor: 59,\n  setStrokeCMYKColor: 60,\n  setFillCMYKColor: 61,\n  shadingFill: 62,\n  beginInlineImage: 63,\n  beginImageData: 64,\n  endInlineImage: 65,\n  paintXObject: 66,\n  markPoint: 67,\n  markPointProps: 68,\n  beginMarkedContent: 69,\n  beginMarkedContentProps: 70,\n  endMarkedContent: 71,\n  beginCompat: 72,\n  endCompat: 73,\n  paintFormXObjectBegin: 74,\n  paintFormXObjectEnd: 75,\n  beginGroup: 76,\n  endGroup: 77,\n  beginAnnotations: 78,\n  endAnnotations: 79,\n  beginAnnotation: 80,\n  endAnnotation: 81,\n  paintJpegXObject: 82,\n  paintImageMaskXObject: 83,\n  paintImageMaskXObjectGroup: 84,\n  paintImageXObject: 85,\n  paintInlineImageXObject: 86,\n  paintInlineImageXObjectGroup: 87,\n  paintImageXObjectRepeat: 88,\n  paintImageMaskXObjectRepeat: 89,\n  paintSolidColorImageMask: 90,\n  constructPath: 91,\n};\n\nconst UNSUPPORTED_FEATURES = {\n  unknown: 'unknown',\n  forms: 'forms',\n  javaScript: 'javaScript',\n  smask: 'smask',\n  shadingPattern: 'shadingPattern',\n  font: 'font',\n};\n\nconst PasswordResponses = {\n  NEED_PASSWORD: 1,\n  INCORRECT_PASSWORD: 2,\n};\n\nlet verbosity = VerbosityLevel.WARNINGS;\n\nfunction setVerbosityLevel(level) {\n  if (Number.isInteger(level)) {\n    verbosity = level;\n  }\n}\n\nfunction getVerbosityLevel() {\n  return verbosity;\n}\n\n// A notice for devs. These are good for things that are helpful to devs, such\n// as warning that Workers were disabled, which is important to devs but not\n// end users.\nfunction info(msg) {\n  if (verbosity >= VerbosityLevel.INFOS) {\n    console.log('Info: ' + msg);\n  }\n}\n\n// Non-fatal warnings.\nfunction warn(msg) {\n  if (verbosity >= VerbosityLevel.WARNINGS) {\n    console.log('Warning: ' + msg);\n  }\n}\n\n// Deprecated API function -- display regardless of the `verbosity` setting.\nfunction deprecated(details) {\n  console.log('Deprecated API usage: ' + details);\n}\n\nfunction unreachable(msg) {\n  throw new Error(msg);\n}\n\nfunction assert(cond, msg) {\n  if (!cond) {\n    unreachable(msg);\n  }\n}\n\n// Checks if URLs have the same origin. For non-HTTP based URLs, returns false.\nfunction isSameOrigin(baseUrl, otherUrl) {\n  try {\n    var base = new URL(baseUrl);\n    if (!base.origin || base.origin === 'null') {\n      return false; // non-HTTP url\n    }\n  } catch (e) {\n    return false;\n  }\n\n  var other = new URL(otherUrl, base);\n  return base.origin === other.origin;\n}\n\n// Checks if URLs use one of the whitelisted protocols, e.g. to avoid XSS.\nfunction _isValidProtocol(url) {\n  if (!url) {\n    return false;\n  }\n  switch (url.protocol) {\n    case 'http:':\n    case 'https:':\n    case 'ftp:':\n    case 'mailto:':\n    case 'tel:':\n      return true;\n    default:\n      return false;\n  }\n}\n\n/**\n * Attempts to create a valid absolute URL.\n *\n * @param {URL|string} url - An absolute, or relative, URL.\n * @param {URL|string} baseUrl - An absolute URL.\n * @returns Either a valid {URL}, or `null` otherwise.\n */\nfunction createValidAbsoluteUrl(url, baseUrl) {\n  if (!url) {\n    return null;\n  }\n  try {\n    var absoluteUrl = baseUrl ? new URL(url, baseUrl) : new URL(url);\n    if (_isValidProtocol(absoluteUrl)) {\n      return absoluteUrl;\n    }\n  } catch (ex) { /* `new URL()` will throw on incorrect data. */ }\n  return null;\n}\n\nfunction shadow(obj, prop, value) {\n  Object.defineProperty(obj, prop, { value,\n                                     enumerable: true,\n                                     configurable: true,\n                                     writable: false, });\n  return value;\n}\n\nfunction getLookupTableFactory(initializer) {\n  var lookup;\n  return function () {\n    if (initializer) {\n      lookup = Object.create(null);\n      initializer(lookup);\n      initializer = null;\n    }\n    return lookup;\n  };\n}\n\nvar PasswordException = (function PasswordExceptionClosure() {\n  function PasswordException(msg, code) {\n    this.name = 'PasswordException';\n    this.message = msg;\n    this.code = code;\n  }\n\n  PasswordException.prototype = new Error();\n  PasswordException.constructor = PasswordException;\n\n  return PasswordException;\n})();\n\nvar UnknownErrorException = (function UnknownErrorExceptionClosure() {\n  function UnknownErrorException(msg, details) {\n    this.name = 'UnknownErrorException';\n    this.message = msg;\n    this.details = details;\n  }\n\n  UnknownErrorException.prototype = new Error();\n  UnknownErrorException.constructor = UnknownErrorException;\n\n  return UnknownErrorException;\n})();\n\nvar InvalidPDFException = (function InvalidPDFExceptionClosure() {\n  function InvalidPDFException(msg) {\n    this.name = 'InvalidPDFException';\n    this.message = msg;\n  }\n\n  InvalidPDFException.prototype = new Error();\n  InvalidPDFException.constructor = InvalidPDFException;\n\n  return InvalidPDFException;\n})();\n\nvar MissingPDFException = (function MissingPDFExceptionClosure() {\n  function MissingPDFException(msg) {\n    this.name = 'MissingPDFException';\n    this.message = msg;\n  }\n\n  MissingPDFException.prototype = new Error();\n  MissingPDFException.constructor = MissingPDFException;\n\n  return MissingPDFException;\n})();\n\nvar UnexpectedResponseException =\n    (function UnexpectedResponseExceptionClosure() {\n  function UnexpectedResponseException(msg, status) {\n    this.name = 'UnexpectedResponseException';\n    this.message = msg;\n    this.status = status;\n  }\n\n  UnexpectedResponseException.prototype = new Error();\n  UnexpectedResponseException.constructor = UnexpectedResponseException;\n\n  return UnexpectedResponseException;\n})();\n\nvar MissingDataException = (function MissingDataExceptionClosure() {\n  function MissingDataException(begin, end) {\n    this.begin = begin;\n    this.end = end;\n    this.message = 'Missing data [' + begin + ', ' + end + ')';\n  }\n\n  MissingDataException.prototype = new Error();\n  MissingDataException.prototype.name = 'MissingDataException';\n  MissingDataException.constructor = MissingDataException;\n\n  return MissingDataException;\n})();\n\nvar XRefParseException = (function XRefParseExceptionClosure() {\n  function XRefParseException(msg) {\n    this.message = msg;\n  }\n\n  XRefParseException.prototype = new Error();\n  XRefParseException.prototype.name = 'XRefParseException';\n  XRefParseException.constructor = XRefParseException;\n\n  return XRefParseException;\n})();\n\n/**\n * Error caused during parsing PDF data.\n */\nlet FormatError = (function FormatErrorClosure() {\n  function FormatError(msg) {\n    this.message = msg;\n  }\n\n  FormatError.prototype = new Error();\n  FormatError.prototype.name = 'FormatError';\n  FormatError.constructor = FormatError;\n\n  return FormatError;\n})();\n\n/**\n * Error used to indicate task cancellation.\n */\nlet AbortException = (function AbortExceptionClosure() {\n  function AbortException(msg) {\n    this.name = 'AbortException';\n    this.message = msg;\n  }\n\n  AbortException.prototype = new Error();\n  AbortException.constructor = AbortException;\n\n  return AbortException;\n})();\n\nvar NullCharactersRegExp = /\\x00/g;\n\nfunction removeNullCharacters(str) {\n  if (typeof str !== 'string') {\n    warn('The argument for removeNullCharacters must be a string.');\n    return str;\n  }\n  return str.replace(NullCharactersRegExp, '');\n}\n\nfunction bytesToString(bytes) {\n  assert(bytes !== null && typeof bytes === 'object' &&\n         bytes.length !== undefined, 'Invalid argument for bytesToString');\n  var length = bytes.length;\n  var MAX_ARGUMENT_COUNT = 8192;\n  if (length < MAX_ARGUMENT_COUNT) {\n    return String.fromCharCode.apply(null, bytes);\n  }\n  var strBuf = [];\n  for (var i = 0; i < length; i += MAX_ARGUMENT_COUNT) {\n    var chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length);\n    var chunk = bytes.subarray(i, chunkEnd);\n    strBuf.push(String.fromCharCode.apply(null, chunk));\n  }\n  return strBuf.join('');\n}\n\nfunction stringToBytes(str) {\n  assert(typeof str === 'string', 'Invalid argument for stringToBytes');\n  var length = str.length;\n  var bytes = new Uint8Array(length);\n  for (var i = 0; i < length; ++i) {\n    bytes[i] = str.charCodeAt(i) & 0xFF;\n  }\n  return bytes;\n}\n\n/**\n * Gets length of the array (Array, Uint8Array, or string) in bytes.\n * @param {Array|Uint8Array|string} arr\n * @returns {number}\n */\nfunction arrayByteLength(arr) {\n  if (arr.length !== undefined) {\n    return arr.length;\n  }\n  assert(arr.byteLength !== undefined);\n  return arr.byteLength;\n}\n\n/**\n * Combines array items (arrays) into single Uint8Array object.\n * @param {Array} arr - the array of the arrays (Array, Uint8Array, or string).\n * @returns {Uint8Array}\n */\nfunction arraysToBytes(arr) {\n  // Shortcut: if first and only item is Uint8Array, return it.\n  if (arr.length === 1 && (arr[0] instanceof Uint8Array)) {\n    return arr[0];\n  }\n  var resultLength = 0;\n  var i, ii = arr.length;\n  var item, itemLength;\n  for (i = 0; i < ii; i++) {\n    item = arr[i];\n    itemLength = arrayByteLength(item);\n    resultLength += itemLength;\n  }\n  var pos = 0;\n  var data = new Uint8Array(resultLength);\n  for (i = 0; i < ii; i++) {\n    item = arr[i];\n    if (!(item instanceof Uint8Array)) {\n      if (typeof item === 'string') {\n        item = stringToBytes(item);\n      } else {\n        item = new Uint8Array(item);\n      }\n    }\n    itemLength = item.byteLength;\n    data.set(item, pos);\n    pos += itemLength;\n  }\n  return data;\n}\n\nfunction string32(value) {\n  return String.fromCharCode((value >> 24) & 0xff, (value >> 16) & 0xff,\n                             (value >> 8) & 0xff, value & 0xff);\n}\n\n// Calculate the base 2 logarithm of the number `x`. This differs from the\n// native function in the sense that it returns the ceiling value and that it\n// returns 0 instead of `Infinity`/`NaN` for `x` values smaller than/equal to 0.\nfunction log2(x) {\n  if (x <= 0) {\n    return 0;\n  }\n  return Math.ceil(Math.log2(x));\n}\n\nfunction readInt8(data, start) {\n  return (data[start] << 24) >> 24;\n}\n\nfunction readUint16(data, offset) {\n  return (data[offset] << 8) | data[offset + 1];\n}\n\nfunction readUint32(data, offset) {\n  return ((data[offset] << 24) | (data[offset + 1] << 16) |\n         (data[offset + 2] << 8) | data[offset + 3]) >>> 0;\n}\n\n// Lazy test the endianness of the platform\n// NOTE: This will be 'true' for simulated TypedArrays\nfunction isLittleEndian() {\n  var buffer8 = new Uint8Array(4);\n  buffer8[0] = 1;\n  var view32 = new Uint32Array(buffer8.buffer, 0, 1);\n  return (view32[0] === 1);\n}\n\n// Checks if it's possible to eval JS expressions.\nfunction isEvalSupported() {\n  try {\n    new Function(''); // eslint-disable-line no-new, no-new-func\n    return true;\n  } catch (e) {\n    return false;\n  }\n}\n\n/**\n * Get the value of an inheritable property.\n *\n * If the PDF specification explicitly lists a property in a dictionary as\n * inheritable, then the value of the property may be present in the dictionary\n * itself or in one or more parents of the dictionary.\n *\n * If the key is not found in the tree, `undefined` is returned. Otherwise,\n * the value for the key is returned or, if `stopWhenFound` is `false`, a list\n * of values is returned. To avoid infinite loops, the traversal is stopped when\n * the loop limit is reached.\n *\n * @param {Dict} dict - Dictionary from where to start the traversal.\n * @param {string} key - The key of the property to find the value for.\n * @param {boolean} getArray - Whether or not the value should be fetched as an\n *   array. The default value is `false`.\n * @param {boolean} stopWhenFound - Whether or not to stop the traversal when\n *   the key is found. If set to `false`, we always walk up the entire parent\n *   chain, for example to be able to find `\\Resources` placed on multiple\n *   levels of the tree. The default value is `true`.\n */\nfunction getInheritableProperty({ dict, key, getArray = false,\n                                  stopWhenFound = true, }) {\n  const LOOP_LIMIT = 100;\n  let loopCount = 0;\n  let values;\n\n  while (dict) {\n    const value = getArray ? dict.getArray(key) : dict.get(key);\n    if (value !== undefined) {\n      if (stopWhenFound) {\n        return value;\n      }\n      if (!values) {\n        values = [];\n      }\n      values.push(value);\n    }\n    if (++loopCount > LOOP_LIMIT) {\n      warn(`getInheritableProperty: maximum loop count exceeded for \"${key}\"`);\n      break;\n    }\n    dict = dict.get('Parent');\n  }\n  return values;\n}\n\nvar Util = (function UtilClosure() {\n  function Util() {}\n\n  var rgbBuf = ['rgb(', 0, ',', 0, ',', 0, ')'];\n\n  // makeCssRgb() can be called thousands of times. Using |rgbBuf| avoids\n  // creating many intermediate strings.\n  Util.makeCssRgb = function Util_makeCssRgb(r, g, b) {\n    rgbBuf[1] = r;\n    rgbBuf[3] = g;\n    rgbBuf[5] = b;\n    return rgbBuf.join('');\n  };\n\n  // Concatenates two transformation matrices together and returns the result.\n  Util.transform = function Util_transform(m1, m2) {\n    return [\n      m1[0] * m2[0] + m1[2] * m2[1],\n      m1[1] * m2[0] + m1[3] * m2[1],\n      m1[0] * m2[2] + m1[2] * m2[3],\n      m1[1] * m2[2] + m1[3] * m2[3],\n      m1[0] * m2[4] + m1[2] * m2[5] + m1[4],\n      m1[1] * m2[4] + m1[3] * m2[5] + m1[5]\n    ];\n  };\n\n  // For 2d affine transforms\n  Util.applyTransform = function Util_applyTransform(p, m) {\n    var xt = p[0] * m[0] + p[1] * m[2] + m[4];\n    var yt = p[0] * m[1] + p[1] * m[3] + m[5];\n    return [xt, yt];\n  };\n\n  Util.applyInverseTransform = function Util_applyInverseTransform(p, m) {\n    var d = m[0] * m[3] - m[1] * m[2];\n    var xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d;\n    var yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d;\n    return [xt, yt];\n  };\n\n  // Applies the transform to the rectangle and finds the minimum axially\n  // aligned bounding box.\n  Util.getAxialAlignedBoundingBox =\n    function Util_getAxialAlignedBoundingBox(r, m) {\n\n    var p1 = Util.applyTransform(r, m);\n    var p2 = Util.applyTransform(r.slice(2, 4), m);\n    var p3 = Util.applyTransform([r[0], r[3]], m);\n    var p4 = Util.applyTransform([r[2], r[1]], m);\n    return [\n      Math.min(p1[0], p2[0], p3[0], p4[0]),\n      Math.min(p1[1], p2[1], p3[1], p4[1]),\n      Math.max(p1[0], p2[0], p3[0], p4[0]),\n      Math.max(p1[1], p2[1], p3[1], p4[1])\n    ];\n  };\n\n  Util.inverseTransform = function Util_inverseTransform(m) {\n    var d = m[0] * m[3] - m[1] * m[2];\n    return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d,\n      (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d];\n  };\n\n  // Apply a generic 3d matrix M on a 3-vector v:\n  //   | a b c |   | X |\n  //   | d e f | x | Y |\n  //   | g h i |   | Z |\n  // M is assumed to be serialized as [a,b,c,d,e,f,g,h,i],\n  // with v as [X,Y,Z]\n  Util.apply3dTransform = function Util_apply3dTransform(m, v) {\n    return [\n      m[0] * v[0] + m[1] * v[1] + m[2] * v[2],\n      m[3] * v[0] + m[4] * v[1] + m[5] * v[2],\n      m[6] * v[0] + m[7] * v[1] + m[8] * v[2]\n    ];\n  };\n\n  // This calculation uses Singular Value Decomposition.\n  // The SVD can be represented with formula A = USV. We are interested in the\n  // matrix S here because it represents the scale values.\n  Util.singularValueDecompose2dScale =\n    function Util_singularValueDecompose2dScale(m) {\n\n    var transpose = [m[0], m[2], m[1], m[3]];\n\n    // Multiply matrix m with its transpose.\n    var a = m[0] * transpose[0] + m[1] * transpose[2];\n    var b = m[0] * transpose[1] + m[1] * transpose[3];\n    var c = m[2] * transpose[0] + m[3] * transpose[2];\n    var d = m[2] * transpose[1] + m[3] * transpose[3];\n\n    // Solve the second degree polynomial to get roots.\n    var first = (a + d) / 2;\n    var second = Math.sqrt((a + d) * (a + d) - 4 * (a * d - c * b)) / 2;\n    var sx = first + second || 1;\n    var sy = first - second || 1;\n\n    // Scale values are the square roots of the eigenvalues.\n    return [Math.sqrt(sx), Math.sqrt(sy)];\n  };\n\n  // Normalize rectangle rect=[x1, y1, x2, y2] so that (x1,y1) < (x2,y2)\n  // For coordinate systems whose origin lies in the bottom-left, this\n  // means normalization to (BL,TR) ordering. For systems with origin in the\n  // top-left, this means (TL,BR) ordering.\n  Util.normalizeRect = function Util_normalizeRect(rect) {\n    var r = rect.slice(0); // clone rect\n    if (rect[0] > rect[2]) {\n      r[0] = rect[2];\n      r[2] = rect[0];\n    }\n    if (rect[1] > rect[3]) {\n      r[1] = rect[3];\n      r[3] = rect[1];\n    }\n    return r;\n  };\n\n  // Returns a rectangle [x1, y1, x2, y2] corresponding to the\n  // intersection of rect1 and rect2. If no intersection, returns 'false'\n  // The rectangle coordinates of rect1, rect2 should be [x1, y1, x2, y2]\n  Util.intersect = function Util_intersect(rect1, rect2) {\n    function compare(a, b) {\n      return a - b;\n    }\n\n    // Order points along the axes\n    var orderedX = [rect1[0], rect1[2], rect2[0], rect2[2]].sort(compare),\n        orderedY = [rect1[1], rect1[3], rect2[1], rect2[3]].sort(compare),\n        result = [];\n\n    rect1 = Util.normalizeRect(rect1);\n    rect2 = Util.normalizeRect(rect2);\n\n    // X: first and second points belong to different rectangles?\n    if ((orderedX[0] === rect1[0] && orderedX[1] === rect2[0]) ||\n        (orderedX[0] === rect2[0] && orderedX[1] === rect1[0])) {\n      // Intersection must be between second and third points\n      result[0] = orderedX[1];\n      result[2] = orderedX[2];\n    } else {\n      return false;\n    }\n\n    // Y: first and second points belong to different rectangles?\n    if ((orderedY[0] === rect1[1] && orderedY[1] === rect2[1]) ||\n        (orderedY[0] === rect2[1] && orderedY[1] === rect1[1])) {\n      // Intersection must be between second and third points\n      result[1] = orderedY[1];\n      result[3] = orderedY[2];\n    } else {\n      return false;\n    }\n\n    return result;\n  };\n\n  return Util;\n})();\n\nconst ROMAN_NUMBER_MAP = [\n  '', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM',\n  '', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC',\n  '', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX'\n];\n\n/**\n * Converts positive integers to (upper case) Roman numerals.\n * @param {integer} number - The number that should be converted.\n * @param {boolean} lowerCase - Indicates if the result should be converted\n *   to lower case letters. The default value is `false`.\n * @return {string} The resulting Roman number.\n */\nfunction toRomanNumerals(number, lowerCase = false) {\n  assert(Number.isInteger(number) && number > 0,\n         'The number should be a positive integer.');\n  let pos, romanBuf = [];\n  // Thousands\n  while (number >= 1000) {\n    number -= 1000;\n    romanBuf.push('M');\n  }\n  // Hundreds\n  pos = (number / 100) | 0;\n  number %= 100;\n  romanBuf.push(ROMAN_NUMBER_MAP[pos]);\n  // Tens\n  pos = (number / 10) | 0;\n  number %= 10;\n  romanBuf.push(ROMAN_NUMBER_MAP[10 + pos]);\n  // Ones\n  romanBuf.push(ROMAN_NUMBER_MAP[20 + number]);\n\n  const romanStr = romanBuf.join('');\n  return (lowerCase ? romanStr.toLowerCase() : romanStr);\n}\n\nconst PDFStringTranslateTable = [\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0x2D8, 0x2C7, 0x2C6, 0x2D9, 0x2DD, 0x2DB, 0x2DA, 0x2DC, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014,\n  0x2013, 0x192, 0x2044, 0x2039, 0x203A, 0x2212, 0x2030, 0x201E, 0x201C,\n  0x201D, 0x2018, 0x2019, 0x201A, 0x2122, 0xFB01, 0xFB02, 0x141, 0x152, 0x160,\n  0x178, 0x17D, 0x131, 0x142, 0x153, 0x161, 0x17E, 0, 0x20AC\n];\n\nfunction stringToPDFString(str) {\n  var i, n = str.length, strBuf = [];\n  if (str[0] === '\\xFE' && str[1] === '\\xFF') {\n    // UTF16BE BOM\n    for (i = 2; i < n; i += 2) {\n      strBuf.push(String.fromCharCode(\n        (str.charCodeAt(i) << 8) | str.charCodeAt(i + 1)));\n    }\n  } else {\n    for (i = 0; i < n; ++i) {\n      var code = PDFStringTranslateTable[str.charCodeAt(i)];\n      strBuf.push(code ? String.fromCharCode(code) : str.charAt(i));\n    }\n  }\n  return strBuf.join('');\n}\n\nfunction stringToUTF8String(str) {\n  return decodeURIComponent(escape(str));\n}\n\nfunction utf8StringToString(str) {\n  return unescape(encodeURIComponent(str));\n}\n\nfunction isEmptyObj(obj) {\n  for (var key in obj) {\n    return false;\n  }\n  return true;\n}\n\nfunction isBool(v) {\n  return typeof v === 'boolean';\n}\n\nfunction isNum(v) {\n  return typeof v === 'number';\n}\n\nfunction isString(v) {\n  return typeof v === 'string';\n}\n\nfunction isArrayBuffer(v) {\n  return typeof v === 'object' && v !== null && v.byteLength !== undefined;\n}\n\n// Checks if ch is one of the following characters: SPACE, TAB, CR or LF.\nfunction isSpace(ch) {\n  return (ch === 0x20 || ch === 0x09 || ch === 0x0D || ch === 0x0A);\n}\n\n/**\n * Promise Capability object.\n *\n * @typedef {Object} PromiseCapability\n * @property {Promise} promise - A promise object.\n * @property {function} resolve - Fulfills the promise.\n * @property {function} reject - Rejects the promise.\n */\n\n/**\n * Creates a promise capability object.\n * @alias createPromiseCapability\n *\n * @return {PromiseCapability} A capability object contains:\n * - a Promise, resolve and reject methods.\n */\nfunction createPromiseCapability() {\n  var capability = {};\n  capability.promise = new Promise(function (resolve, reject) {\n    capability.resolve = resolve;\n    capability.reject = reject;\n  });\n  return capability;\n}\n\nvar createObjectURL = (function createObjectURLClosure() {\n  // Blob/createObjectURL is not available, falling back to data schema.\n  var digits =\n    'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n\n  return function createObjectURL(data, contentType, forceDataSchema = false) {\n    if (!forceDataSchema && URL.createObjectURL) {\n      const blob = new Blob([data], { type: contentType, });\n      return URL.createObjectURL(blob);\n    }\n\n    var buffer = 'data:' + contentType + ';base64,';\n    for (var i = 0, ii = data.length; i < ii; i += 3) {\n      var b1 = data[i] & 0xFF;\n      var b2 = data[i + 1] & 0xFF;\n      var b3 = data[i + 2] & 0xFF;\n      var d1 = b1 >> 2, d2 = ((b1 & 3) << 4) | (b2 >> 4);\n      var d3 = i + 1 < ii ? ((b2 & 0xF) << 2) | (b3 >> 6) : 64;\n      var d4 = i + 2 < ii ? (b3 & 0x3F) : 64;\n      buffer += digits[d1] + digits[d2] + digits[d3] + digits[d4];\n    }\n    return buffer;\n  };\n})();\n\nexport {\n  FONT_IDENTITY_MATRIX,\n  IDENTITY_MATRIX,\n  OPS,\n  VerbosityLevel,\n  UNSUPPORTED_FEATURES,\n  AnnotationBorderStyleType,\n  AnnotationFieldFlag,\n  AnnotationFlag,\n  AnnotationType,\n  FontType,\n  ImageKind,\n  CMapCompressionType,\n  AbortException,\n  InvalidPDFException,\n  MissingDataException,\n  MissingPDFException,\n  NativeImageDecoding,\n  PasswordException,\n  PasswordResponses,\n  PermissionFlag,\n  StreamType,\n  TextRenderingMode,\n  UnexpectedResponseException,\n  UnknownErrorException,\n  Util,\n  toRomanNumerals,\n  XRefParseException,\n  FormatError,\n  arrayByteLength,\n  arraysToBytes,\n  assert,\n  bytesToString,\n  createPromiseCapability,\n  createObjectURL,\n  deprecated,\n  getInheritableProperty,\n  getLookupTableFactory,\n  getVerbosityLevel,\n  info,\n  isArrayBuffer,\n  isBool,\n  isEmptyObj,\n  isNum,\n  isString,\n  isSpace,\n  isSameOrigin,\n  createValidAbsoluteUrl,\n  isLittleEndian,\n  isEvalSupported,\n  log2,\n  readInt8,\n  readUint16,\n  readUint32,\n  removeNullCharacters,\n  ReadableStream,\n  URL,\n  setVerbosityLevel,\n  shadow,\n  string32,\n  stringToBytes,\n  stringToPDFString,\n  stringToUTF8String,\n  utf8StringToString,\n  warn,\n  unreachable,\n};\n","/* Copyright 2017 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst globalScope = require('./global_scope');\n\n// Skip compatibility checks for the extensions and if we already ran\n// this module.\nif ((typeof PDFJSDev === 'undefined' ||\n     !PDFJSDev.test('FIREFOX || MOZCENTRAL')) &&\n    !globalScope._pdfjsCompatibilityChecked) {\n\nglobalScope._pdfjsCompatibilityChecked = true;\n\n// In the Chrome extension, most of the polyfills are unnecessary.\n// We support down to Chrome 49, because it's still commonly used by Windows XP\n// users - https://github.com/mozilla/pdf.js/issues/9397\nif (typeof PDFJSDev === 'undefined' || !PDFJSDev.test('CHROME')) {\n\nconst isNodeJS = require('./is_node');\n\nconst hasDOM = typeof window === 'object' && typeof document === 'object';\n\n// Support: Node.js\n(function checkNodeBtoa() {\n  if (globalScope.btoa || !isNodeJS()) {\n    return;\n  }\n  globalScope.btoa = function(chars) {\n    // eslint-disable-next-line no-undef\n    return Buffer.from(chars, 'binary').toString('base64');\n  };\n})();\n\n// Support: Node.js\n(function checkNodeAtob() {\n  if (globalScope.atob || !isNodeJS()) {\n    return;\n  }\n  globalScope.atob = function(input) {\n    // eslint-disable-next-line no-undef\n    return Buffer.from(input, 'base64').toString('binary');\n  };\n})();\n\n// Provides document.currentScript support\n// Support: IE, Chrome<29.\n(function checkCurrentScript() {\n  if (!hasDOM) {\n    return;\n  }\n  if ('currentScript' in document) {\n    return;\n  }\n  Object.defineProperty(document, 'currentScript', {\n    get() {\n      var scripts = document.getElementsByTagName('script');\n      return scripts[scripts.length - 1];\n    },\n    enumerable: true,\n    configurable: true,\n  });\n})();\n\n// Provides support for ChildNode.remove in legacy browsers.\n// Support: IE.\n(function checkChildNodeRemove() {\n  if (!hasDOM) {\n    return;\n  }\n  if (typeof Element.prototype.remove !== 'undefined') {\n    return;\n  }\n  Element.prototype.remove = function () {\n    if (this.parentNode) {\n      // eslint-disable-next-line mozilla/avoid-removeChild\n      this.parentNode.removeChild(this);\n    }\n  };\n})();\n\n// Provides support for DOMTokenList.prototype.toggle, with the optional\n// \"force\" parameter, in legacy browsers.\n// Support: IE\n(function checkDOMTokenListToggle() {\n  if (!hasDOM || isNodeJS()) {\n    return;\n  }\n  const div = document.createElement('div');\n  if (div.classList.toggle('test', 0) === false) {\n    return;\n  }\n  const originalDOMTokenListToggle = DOMTokenList.prototype.toggle;\n\n  DOMTokenList.prototype.toggle = function(token) {\n    if (arguments.length > 1) {\n      const force = !!arguments[1];\n      return (this[force ? 'add' : 'remove'](token), force);\n    }\n    return originalDOMTokenListToggle(token);\n  };\n})();\n\n// Provides support for String.prototype.includes in legacy browsers.\n// Support: IE, Chrome<41\n(function checkStringIncludes() {\n  if (String.prototype.includes) {\n    return;\n  }\n  require('core-js/fn/string/includes');\n})();\n\n// Provides support for Array.prototype.includes in legacy browsers.\n// Support: IE, Chrome<47\n(function checkArrayIncludes() {\n  if (Array.prototype.includes) {\n    return;\n  }\n  require('core-js/fn/array/includes');\n})();\n\n// Provides support for Object.assign in legacy browsers.\n// Support: IE\n(function checkObjectAssign() {\n  if (Object.assign) {\n    return;\n  }\n  require('core-js/fn/object/assign');\n})();\n\n// Provides support for Math.log2 in legacy browsers.\n// Support: IE, Chrome<38\n(function checkMathLog2() {\n  if (Math.log2) {\n    return;\n  }\n  Math.log2 = require('core-js/fn/math/log2');\n})();\n\n// Provides support for Number.isNaN in legacy browsers.\n// Support: IE.\n(function checkNumberIsNaN() {\n  if (Number.isNaN) {\n    return;\n  }\n  Number.isNaN = require('core-js/fn/number/is-nan');\n})();\n\n// Provides support for Number.isInteger in legacy browsers.\n// Support: IE, Chrome<34\n(function checkNumberIsInteger() {\n  if (Number.isInteger) {\n    return;\n  }\n  Number.isInteger = require('core-js/fn/number/is-integer');\n})();\n\n// Support: IE, Safari<8, Chrome<32\n(function checkPromise() {\n  if (typeof PDFJSDev !== 'undefined' && PDFJSDev.test('IMAGE_DECODERS')) {\n    // The current image decoders are synchronous, hence `Promise` shouldn't\n    // need to be polyfilled for the IMAGE_DECODERS build target.\n    return;\n  }\n  if (globalScope.Promise) {\n    return;\n  }\n  globalScope.Promise = require('core-js/fn/promise');\n})();\n\n// Support: IE<11, Safari<8, Chrome<36\n(function checkWeakMap() {\n  if (globalScope.WeakMap) {\n    return;\n  }\n  globalScope.WeakMap = require('core-js/fn/weak-map');\n})();\n\n// Provides support for String.codePointAt in legacy browsers.\n// Support: IE11.\n(function checkStringCodePointAt() {\n  if (String.codePointAt) {\n    return;\n  }\n  String.codePointAt = require('core-js/fn/string/code-point-at');\n})();\n\n// Provides support for String.fromCodePoint in legacy browsers.\n// Support: IE11.\n(function checkStringFromCodePoint() {\n  if (String.fromCodePoint) {\n    return;\n  }\n  String.fromCodePoint = require('core-js/fn/string/from-code-point');\n})();\n\n// Support: IE\n(function checkSymbol() {\n  if (globalScope.Symbol) {\n    return;\n  }\n  require('core-js/es6/symbol');\n})();\n\n} // End of !PDFJSDev.test('CHROME')\n\n// Provides support for Object.values in legacy browsers.\n// Support: IE, Chrome<54\n(function checkObjectValues() {\n  if (Object.values) {\n    return;\n  }\n  Object.values = require('core-js/fn/object/values');\n})();\n\n}\n","/* Copyright 2017 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* globals module */\n\nmodule.exports =\n  (typeof window !== 'undefined' && window.Math === Math) ? window :\n  // eslint-disable-next-line no-undef\n  (typeof global !== 'undefined' && global.Math === Math) ? global :\n  (typeof self !== 'undefined' && self.Math === Math) ? self : {};\n","/* Copyright 2018 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* globals module, process */\n\nmodule.exports = function isNodeJS() {\n  return typeof process === 'object' && process + '' === '[object process]';\n};\n","require('../../modules/es6.string.includes');\nmodule.exports = require('../../modules/_core').String.includes;\n","// 21.1.3.7 String.prototype.includes(searchString, position = 0)\n'use strict';\nvar $export = require('./_export');\nvar context = require('./_string-context');\nvar INCLUDES = 'includes';\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(INCLUDES), 'String', {\n  includes: function includes(searchString /* , position = 0 */) {\n    return !!~context(this, searchString, INCLUDES)\n      .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n","var global = require('./_global');\nvar core = require('./_core');\nvar hide = require('./_hide');\nvar redefine = require('./_redefine');\nvar ctx = require('./_ctx');\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n  var IS_FORCED = type & $export.F;\n  var IS_GLOBAL = type & $export.G;\n  var IS_STATIC = type & $export.S;\n  var IS_PROTO = type & $export.P;\n  var IS_BIND = type & $export.B;\n  var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE];\n  var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n  var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});\n  var key, own, out, exp;\n  if (IS_GLOBAL) source = name;\n  for (key in source) {\n    // contains in native\n    own = !IS_FORCED && target && target[key] !== undefined;\n    // export native or passed\n    out = (own ? target : source)[key];\n    // bind timers to global for call from export context\n    exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n    // extend global\n    if (target) redefine(target, key, out, type & $export.U);\n    // export\n    if (exports[key] != out) hide(exports, key, exp);\n    if (IS_PROTO && expProto[key] != out) expProto[key] = out;\n  }\n};\nglobal.core = core;\n// type bitmap\n$export.F = 1;   // forced\n$export.G = 2;   // global\n$export.S = 4;   // static\n$export.P = 8;   // proto\n$export.B = 16;  // bind\n$export.W = 32;  // wrap\n$export.U = 64;  // safe\n$export.R = 128; // real proto method for `library`\nmodule.exports = $export;\n","// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n  ? window : typeof self != 'undefined' && self.Math == Math ? self\n  // eslint-disable-next-line no-new-func\n  : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n","var core = module.exports = { version: '2.5.7' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n","var dP = require('./_object-dp');\nvar createDesc = require('./_property-desc');\nmodule.exports = require('./_descriptors') ? function (object, key, value) {\n  return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n  object[key] = value;\n  return object;\n};\n","var anObject = require('./_an-object');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar toPrimitive = require('./_to-primitive');\nvar dP = Object.defineProperty;\n\nexports.f = require('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n  anObject(O);\n  P = toPrimitive(P, true);\n  anObject(Attributes);\n  if (IE8_DOM_DEFINE) try {\n    return dP(O, P, Attributes);\n  } catch (e) { /* empty */ }\n  if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n  if ('value' in Attributes) O[P] = Attributes.value;\n  return O;\n};\n","var isObject = require('./_is-object');\nmodule.exports = function (it) {\n  if (!isObject(it)) throw TypeError(it + ' is not an object!');\n  return it;\n};\n","module.exports = function (it) {\n  return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n","module.exports = !require('./_descriptors') && !require('./_fails')(function () {\n  return Object.defineProperty(require('./_dom-create')('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n","// Thank's IE8 for his funny defineProperty\nmodule.exports = !require('./_fails')(function () {\n  return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n","module.exports = function (exec) {\n  try {\n    return !!exec();\n  } catch (e) {\n    return true;\n  }\n};\n","var isObject = require('./_is-object');\nvar document = require('./_global').document;\n// typeof document.createElement is 'object' in old IE\nvar is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n  return is ? document.createElement(it) : {};\n};\n","// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = require('./_is-object');\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n  if (!isObject(it)) return it;\n  var fn, val;\n  if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n  if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n  if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n  throw TypeError(\"Can't convert object to primitive value\");\n};\n","module.exports = function (bitmap, value) {\n  return {\n    enumerable: !(bitmap & 1),\n    configurable: !(bitmap & 2),\n    writable: !(bitmap & 4),\n    value: value\n  };\n};\n","var global = require('./_global');\nvar hide = require('./_hide');\nvar has = require('./_has');\nvar SRC = require('./_uid')('src');\nvar TO_STRING = 'toString';\nvar $toString = Function[TO_STRING];\nvar TPL = ('' + $toString).split(TO_STRING);\n\nrequire('./_core').inspectSource = function (it) {\n  return $toString.call(it);\n};\n\n(module.exports = function (O, key, val, safe) {\n  var isFunction = typeof val == 'function';\n  if (isFunction) has(val, 'name') || hide(val, 'name', key);\n  if (O[key] === val) return;\n  if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));\n  if (O === global) {\n    O[key] = val;\n  } else if (!safe) {\n    delete O[key];\n    hide(O, key, val);\n  } else if (O[key]) {\n    O[key] = val;\n  } else {\n    hide(O, key, val);\n  }\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, TO_STRING, function toString() {\n  return typeof this == 'function' && this[SRC] || $toString.call(this);\n});\n","var hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n  return hasOwnProperty.call(it, key);\n};\n","var id = 0;\nvar px = Math.random();\nmodule.exports = function (key) {\n  return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n","// optional / simple context binding\nvar aFunction = require('./_a-function');\nmodule.exports = function (fn, that, length) {\n  aFunction(fn);\n  if (that === undefined) return fn;\n  switch (length) {\n    case 1: return function (a) {\n      return fn.call(that, a);\n    };\n    case 2: return function (a, b) {\n      return fn.call(that, a, b);\n    };\n    case 3: return function (a, b, c) {\n      return fn.call(that, a, b, c);\n    };\n  }\n  return function (/* ...args */) {\n    return fn.apply(that, arguments);\n  };\n};\n","module.exports = function (it) {\n  if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n  return it;\n};\n","// helper for String#{startsWith, endsWith, includes}\nvar isRegExp = require('./_is-regexp');\nvar defined = require('./_defined');\n\nmodule.exports = function (that, searchString, NAME) {\n  if (isRegExp(searchString)) throw TypeError('String#' + NAME + \" doesn't accept regex!\");\n  return String(defined(that));\n};\n","// 7.2.8 IsRegExp(argument)\nvar isObject = require('./_is-object');\nvar cof = require('./_cof');\nvar MATCH = require('./_wks')('match');\nmodule.exports = function (it) {\n  var isRegExp;\n  return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp');\n};\n","var toString = {}.toString;\n\nmodule.exports = function (it) {\n  return toString.call(it).slice(8, -1);\n};\n","var store = require('./_shared')('wks');\nvar uid = require('./_uid');\nvar Symbol = require('./_global').Symbol;\nvar USE_SYMBOL = typeof Symbol == 'function';\n\nvar $exports = module.exports = function (name) {\n  return store[name] || (store[name] =\n    USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n\n$exports.store = store;\n","var core = require('./_core');\nvar global = require('./_global');\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\n\n(module.exports = function (key, value) {\n  return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n  version: core.version,\n  mode: require('./_library') ? 'pure' : 'global',\n  copyright: '漏 2018 Denis Pushkarev (zloirock.ru)'\n});\n","module.exports = false;\n","// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n  if (it == undefined) throw TypeError(\"Can't call method on  \" + it);\n  return it;\n};\n","var MATCH = require('./_wks')('match');\nmodule.exports = function (KEY) {\n  var re = /./;\n  try {\n    '/./'[KEY](re);\n  } catch (e) {\n    try {\n      re[MATCH] = false;\n      return !'/./'[KEY](re);\n    } catch (f) { /* empty */ }\n  } return true;\n};\n","require('../../modules/es7.array.includes');\nmodule.exports = require('../../modules/_core').Array.includes;\n","'use strict';\n// https://github.com/tc39/Array.prototype.includes\nvar $export = require('./_export');\nvar $includes = require('./_array-includes')(true);\n\n$export($export.P, 'Array', {\n  includes: function includes(el /* , fromIndex = 0 */) {\n    return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n\nrequire('./_add-to-unscopables')('includes');\n","// false -> Array#indexOf\n// true  -> Array#includes\nvar toIObject = require('./_to-iobject');\nvar toLength = require('./_to-length');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nmodule.exports = function (IS_INCLUDES) {\n  return function ($this, el, fromIndex) {\n    var O = toIObject($this);\n    var length = toLength(O.length);\n    var index = toAbsoluteIndex(fromIndex, length);\n    var value;\n    // Array#includes uses SameValueZero equality algorithm\n    // eslint-disable-next-line no-self-compare\n    if (IS_INCLUDES && el != el) while (length > index) {\n      value = O[index++];\n      // eslint-disable-next-line no-self-compare\n      if (value != value) return true;\n    // Array#indexOf ignores holes, Array#includes - not\n    } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n      if (O[index] === el) return IS_INCLUDES || index || 0;\n    } return !IS_INCLUDES && -1;\n  };\n};\n","// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = require('./_iobject');\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n  return IObject(defined(it));\n};\n","// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = require('./_cof');\n// eslint-disable-next-line no-prototype-builtins\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n  return cof(it) == 'String' ? it.split('') : Object(it);\n};\n","// 7.1.15 ToLength\nvar toInteger = require('./_to-integer');\nvar min = Math.min;\nmodule.exports = function (it) {\n  return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n","// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nmodule.exports = function (it) {\n  return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n","var toInteger = require('./_to-integer');\nvar max = Math.max;\nvar min = Math.min;\nmodule.exports = function (index, length) {\n  index = toInteger(index);\n  return index < 0 ? max(index + length, 0) : min(index, length);\n};\n","// 22.1.3.31 Array.prototype[@@unscopables]\nvar UNSCOPABLES = require('./_wks')('unscopables');\nvar ArrayProto = Array.prototype;\nif (ArrayProto[UNSCOPABLES] == undefined) require('./_hide')(ArrayProto, UNSCOPABLES, {});\nmodule.exports = function (key) {\n  ArrayProto[UNSCOPABLES][key] = true;\n};\n","require('../../modules/es6.object.assign');\nmodule.exports = require('../../modules/_core').Object.assign;\n","// 19.1.3.1 Object.assign(target, source)\nvar $export = require('./_export');\n\n$export($export.S + $export.F, 'Object', { assign: require('./_object-assign') });\n","'use strict';\n// 19.1.2.1 Object.assign(target, source, ...)\nvar getKeys = require('./_object-keys');\nvar gOPS = require('./_object-gops');\nvar pIE = require('./_object-pie');\nvar toObject = require('./_to-object');\nvar IObject = require('./_iobject');\nvar $assign = Object.assign;\n\n// should work with symbols and should have deterministic property order (V8 bug)\nmodule.exports = !$assign || require('./_fails')(function () {\n  var A = {};\n  var B = {};\n  // eslint-disable-next-line no-undef\n  var S = Symbol();\n  var K = 'abcdefghijklmnopqrst';\n  A[S] = 7;\n  K.split('').forEach(function (k) { B[k] = k; });\n  return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n  var T = toObject(target);\n  var aLen = arguments.length;\n  var index = 1;\n  var getSymbols = gOPS.f;\n  var isEnum = pIE.f;\n  while (aLen > index) {\n    var S = IObject(arguments[index++]);\n    var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S);\n    var length = keys.length;\n    var j = 0;\n    var key;\n    while (length > j) if (isEnum.call(S, key = keys[j++])) T[key] = S[key];\n  } return T;\n} : $assign;\n","// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = require('./_object-keys-internal');\nvar enumBugKeys = require('./_enum-bug-keys');\n\nmodule.exports = Object.keys || function keys(O) {\n  return $keys(O, enumBugKeys);\n};\n","var has = require('./_has');\nvar toIObject = require('./_to-iobject');\nvar arrayIndexOf = require('./_array-includes')(false);\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\n\nmodule.exports = function (object, names) {\n  var O = toIObject(object);\n  var i = 0;\n  var result = [];\n  var key;\n  for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);\n  // Don't enum bug & hidden keys\n  while (names.length > i) if (has(O, key = names[i++])) {\n    ~arrayIndexOf(result, key) || result.push(key);\n  }\n  return result;\n};\n","var shared = require('./_shared')('keys');\nvar uid = require('./_uid');\nmodule.exports = function (key) {\n  return shared[key] || (shared[key] = uid(key));\n};\n","// IE 8- don't enum bug keys\nmodule.exports = (\n  'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n","exports.f = Object.getOwnPropertySymbols;\n","exports.f = {}.propertyIsEnumerable;\n","// 7.1.13 ToObject(argument)\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n  return Object(defined(it));\n};\n","require('../../modules/es6.math.log2');\nmodule.exports = require('../../modules/_core').Math.log2;\n","// 20.2.2.22 Math.log2(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n  log2: function log2(x) {\n    return Math.log(x) / Math.LN2;\n  }\n});\n","require('../../modules/es6.number.is-nan');\nmodule.exports = require('../../modules/_core').Number.isNaN;\n","// 20.1.2.4 Number.isNaN(number)\nvar $export = require('./_export');\n\n$export($export.S, 'Number', {\n  isNaN: function isNaN(number) {\n    // eslint-disable-next-line no-self-compare\n    return number != number;\n  }\n});\n","require('../../modules/es6.number.is-integer');\nmodule.exports = require('../../modules/_core').Number.isInteger;\n","// 20.1.2.3 Number.isInteger(number)\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { isInteger: require('./_is-integer') });\n","// 20.1.2.3 Number.isInteger(number)\nvar isObject = require('./_is-object');\nvar floor = Math.floor;\nmodule.exports = function isInteger(it) {\n  return !isObject(it) && isFinite(it) && floor(it) === it;\n};\n","require('../modules/es6.object.to-string');\nrequire('../modules/es6.string.iterator');\nrequire('../modules/web.dom.iterable');\nrequire('../modules/es6.promise');\nrequire('../modules/es7.promise.finally');\nrequire('../modules/es7.promise.try');\nmodule.exports = require('../modules/_core').Promise;\n","'use strict';\n// 19.1.3.6 Object.prototype.toString()\nvar classof = require('./_classof');\nvar test = {};\ntest[require('./_wks')('toStringTag')] = 'z';\nif (test + '' != '[object z]') {\n  require('./_redefine')(Object.prototype, 'toString', function toString() {\n    return '[object ' + classof(this) + ']';\n  }, true);\n}\n","// getting tag from 19.1.3.6 Object.prototype.toString()\nvar cof = require('./_cof');\nvar TAG = require('./_wks')('toStringTag');\n// ES3 wrong here\nvar ARG = cof(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n  try {\n    return it[key];\n  } catch (e) { /* empty */ }\n};\n\nmodule.exports = function (it) {\n  var O, T, B;\n  return it === undefined ? 'Undefined' : it === null ? 'Null'\n    // @@toStringTag case\n    : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T\n    // builtinTag case\n    : ARG ? cof(O)\n    // ES3 arguments fallback\n    : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n};\n","'use strict';\nvar $at = require('./_string-at')(true);\n\n// 21.1.3.27 String.prototype[@@iterator]()\nrequire('./_iter-define')(String, 'String', function (iterated) {\n  this._t = String(iterated); // target\n  this._i = 0;                // next index\n// 21.1.5.2.1 %StringIteratorPrototype%.next()\n}, function () {\n  var O = this._t;\n  var index = this._i;\n  var point;\n  if (index >= O.length) return { value: undefined, done: true };\n  point = $at(O, index);\n  this._i += point.length;\n  return { value: point, done: false };\n});\n","var toInteger = require('./_to-integer');\nvar defined = require('./_defined');\n// true  -> String#at\n// false -> String#codePointAt\nmodule.exports = function (TO_STRING) {\n  return function (that, pos) {\n    var s = String(defined(that));\n    var i = toInteger(pos);\n    var l = s.length;\n    var a, b;\n    if (i < 0 || i >= l) return TO_STRING ? '' : undefined;\n    a = s.charCodeAt(i);\n    return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n      ? TO_STRING ? s.charAt(i) : a\n      : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n  };\n};\n","'use strict';\nvar LIBRARY = require('./_library');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar hide = require('./_hide');\nvar Iterators = require('./_iterators');\nvar $iterCreate = require('./_iter-create');\nvar setToStringTag = require('./_set-to-string-tag');\nvar getPrototypeOf = require('./_object-gpo');\nvar ITERATOR = require('./_wks')('iterator');\nvar BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`\nvar FF_ITERATOR = '@@iterator';\nvar KEYS = 'keys';\nvar VALUES = 'values';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {\n  $iterCreate(Constructor, NAME, next);\n  var getMethod = function (kind) {\n    if (!BUGGY && kind in proto) return proto[kind];\n    switch (kind) {\n      case KEYS: return function keys() { return new Constructor(this, kind); };\n      case VALUES: return function values() { return new Constructor(this, kind); };\n    } return function entries() { return new Constructor(this, kind); };\n  };\n  var TAG = NAME + ' Iterator';\n  var DEF_VALUES = DEFAULT == VALUES;\n  var VALUES_BUG = false;\n  var proto = Base.prototype;\n  var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];\n  var $default = $native || getMethod(DEFAULT);\n  var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;\n  var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;\n  var methods, key, IteratorPrototype;\n  // Fix native\n  if ($anyNative) {\n    IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));\n    if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {\n      // Set @@toStringTag to native iterators\n      setToStringTag(IteratorPrototype, TAG, true);\n      // fix for some old engines\n      if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);\n    }\n  }\n  // fix Array#{values, @@iterator}.name in V8 / FF\n  if (DEF_VALUES && $native && $native.name !== VALUES) {\n    VALUES_BUG = true;\n    $default = function values() { return $native.call(this); };\n  }\n  // Define iterator\n  if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {\n    hide(proto, ITERATOR, $default);\n  }\n  // Plug for library\n  Iterators[NAME] = $default;\n  Iterators[TAG] = returnThis;\n  if (DEFAULT) {\n    methods = {\n      values: DEF_VALUES ? $default : getMethod(VALUES),\n      keys: IS_SET ? $default : getMethod(KEYS),\n      entries: $entries\n    };\n    if (FORCED) for (key in methods) {\n      if (!(key in proto)) redefine(proto, key, methods[key]);\n    } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n  }\n  return methods;\n};\n","module.exports = {};\n","'use strict';\nvar create = require('./_object-create');\nvar descriptor = require('./_property-desc');\nvar setToStringTag = require('./_set-to-string-tag');\nvar IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\nrequire('./_hide')(IteratorPrototype, require('./_wks')('iterator'), function () { return this; });\n\nmodule.exports = function (Constructor, NAME, next) {\n  Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });\n  setToStringTag(Constructor, NAME + ' Iterator');\n};\n","// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = require('./_an-object');\nvar dPs = require('./_object-dps');\nvar enumBugKeys = require('./_enum-bug-keys');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar Empty = function () { /* empty */ };\nvar PROTOTYPE = 'prototype';\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n  // Thrash, waste and sodomy: IE GC bug\n  var iframe = require('./_dom-create')('iframe');\n  var i = enumBugKeys.length;\n  var lt = '<';\n  var gt = '>';\n  var iframeDocument;\n  iframe.style.display = 'none';\n  require('./_html').appendChild(iframe);\n  iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n  // createDict = iframe.contentWindow.Object;\n  // html.removeChild(iframe);\n  iframeDocument = iframe.contentWindow.document;\n  iframeDocument.open();\n  iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n  iframeDocument.close();\n  createDict = iframeDocument.F;\n  while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];\n  return createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties) {\n  var result;\n  if (O !== null) {\n    Empty[PROTOTYPE] = anObject(O);\n    result = new Empty();\n    Empty[PROTOTYPE] = null;\n    // add \"__proto__\" for Object.getPrototypeOf polyfill\n    result[IE_PROTO] = O;\n  } else result = createDict();\n  return Properties === undefined ? result : dPs(result, Properties);\n};\n","var dP = require('./_object-dp');\nvar anObject = require('./_an-object');\nvar getKeys = require('./_object-keys');\n\nmodule.exports = require('./_descriptors') ? Object.defineProperties : function defineProperties(O, Properties) {\n  anObject(O);\n  var keys = getKeys(Properties);\n  var length = keys.length;\n  var i = 0;\n  var P;\n  while (length > i) dP.f(O, P = keys[i++], Properties[P]);\n  return O;\n};\n","var document = require('./_global').document;\nmodule.exports = document && document.documentElement;\n","var def = require('./_object-dp').f;\nvar has = require('./_has');\nvar TAG = require('./_wks')('toStringTag');\n\nmodule.exports = function (it, tag, stat) {\n  if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });\n};\n","// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nvar has = require('./_has');\nvar toObject = require('./_to-object');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar ObjectProto = Object.prototype;\n\nmodule.exports = Object.getPrototypeOf || function (O) {\n  O = toObject(O);\n  if (has(O, IE_PROTO)) return O[IE_PROTO];\n  if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n    return O.constructor.prototype;\n  } return O instanceof Object ? ObjectProto : null;\n};\n","var $iterators = require('./es6.array.iterator');\nvar getKeys = require('./_object-keys');\nvar redefine = require('./_redefine');\nvar global = require('./_global');\nvar hide = require('./_hide');\nvar Iterators = require('./_iterators');\nvar wks = require('./_wks');\nvar ITERATOR = wks('iterator');\nvar TO_STRING_TAG = wks('toStringTag');\nvar ArrayValues = Iterators.Array;\n\nvar DOMIterables = {\n  CSSRuleList: true, // TODO: Not spec compliant, should be false.\n  CSSStyleDeclaration: false,\n  CSSValueList: false,\n  ClientRectList: false,\n  DOMRectList: false,\n  DOMStringList: false,\n  DOMTokenList: true,\n  DataTransferItemList: false,\n  FileList: false,\n  HTMLAllCollection: false,\n  HTMLCollection: false,\n  HTMLFormElement: false,\n  HTMLSelectElement: false,\n  MediaList: true, // TODO: Not spec compliant, should be false.\n  MimeTypeArray: false,\n  NamedNodeMap: false,\n  NodeList: true,\n  PaintRequestList: false,\n  Plugin: false,\n  PluginArray: false,\n  SVGLengthList: false,\n  SVGNumberList: false,\n  SVGPathSegList: false,\n  SVGPointList: false,\n  SVGStringList: false,\n  SVGTransformList: false,\n  SourceBufferList: false,\n  StyleSheetList: true, // TODO: Not spec compliant, should be false.\n  TextTrackCueList: false,\n  TextTrackList: false,\n  TouchList: false\n};\n\nfor (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) {\n  var NAME = collections[i];\n  var explicit = DOMIterables[NAME];\n  var Collection = global[NAME];\n  var proto = Collection && Collection.prototype;\n  var key;\n  if (proto) {\n    if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues);\n    if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);\n    Iterators[NAME] = ArrayValues;\n    if (explicit) for (key in $iterators) if (!proto[key]) redefine(proto, key, $iterators[key], true);\n  }\n}\n","'use strict';\nvar addToUnscopables = require('./_add-to-unscopables');\nvar step = require('./_iter-step');\nvar Iterators = require('./_iterators');\nvar toIObject = require('./_to-iobject');\n\n// 22.1.3.4 Array.prototype.entries()\n// 22.1.3.13 Array.prototype.keys()\n// 22.1.3.29 Array.prototype.values()\n// 22.1.3.30 Array.prototype[@@iterator]()\nmodule.exports = require('./_iter-define')(Array, 'Array', function (iterated, kind) {\n  this._t = toIObject(iterated); // target\n  this._i = 0;                   // next index\n  this._k = kind;                // kind\n// 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n}, function () {\n  var O = this._t;\n  var kind = this._k;\n  var index = this._i++;\n  if (!O || index >= O.length) {\n    this._t = undefined;\n    return step(1);\n  }\n  if (kind == 'keys') return step(0, index);\n  if (kind == 'values') return step(0, O[index]);\n  return step(0, [index, O[index]]);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\nIterators.Arguments = Iterators.Array;\n\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n","module.exports = function (done, value) {\n  return { value: value, done: !!done };\n};\n","'use strict';\nvar LIBRARY = require('./_library');\nvar global = require('./_global');\nvar ctx = require('./_ctx');\nvar classof = require('./_classof');\nvar $export = require('./_export');\nvar isObject = require('./_is-object');\nvar aFunction = require('./_a-function');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar speciesConstructor = require('./_species-constructor');\nvar task = require('./_task').set;\nvar microtask = require('./_microtask')();\nvar newPromiseCapabilityModule = require('./_new-promise-capability');\nvar perform = require('./_perform');\nvar userAgent = require('./_user-agent');\nvar promiseResolve = require('./_promise-resolve');\nvar PROMISE = 'Promise';\nvar TypeError = global.TypeError;\nvar process = global.process;\nvar versions = process && process.versions;\nvar v8 = versions && versions.v8 || '';\nvar $Promise = global[PROMISE];\nvar isNode = classof(process) == 'process';\nvar empty = function () { /* empty */ };\nvar Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;\nvar newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f;\n\nvar USE_NATIVE = !!function () {\n  try {\n    // correct subclassing with @@species support\n    var promise = $Promise.resolve(1);\n    var FakePromise = (promise.constructor = {})[require('./_wks')('species')] = function (exec) {\n      exec(empty, empty);\n    };\n    // unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n    return (isNode || typeof PromiseRejectionEvent == 'function')\n      && promise.then(empty) instanceof FakePromise\n      // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables\n      // https://bugs.chromium.org/p/chromium/issues/detail?id=830565\n      // we can't detect it synchronously, so just check versions\n      && v8.indexOf('6.6') !== 0\n      && userAgent.indexOf('Chrome/66') === -1;\n  } catch (e) { /* empty */ }\n}();\n\n// helpers\nvar isThenable = function (it) {\n  var then;\n  return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\nvar notify = function (promise, isReject) {\n  if (promise._n) return;\n  promise._n = true;\n  var chain = promise._c;\n  microtask(function () {\n    var value = promise._v;\n    var ok = promise._s == 1;\n    var i = 0;\n    var run = function (reaction) {\n      var handler = ok ? reaction.ok : reaction.fail;\n      var resolve = reaction.resolve;\n      var reject = reaction.reject;\n      var domain = reaction.domain;\n      var result, then, exited;\n      try {\n        if (handler) {\n          if (!ok) {\n            if (promise._h == 2) onHandleUnhandled(promise);\n            promise._h = 1;\n          }\n          if (handler === true) result = value;\n          else {\n            if (domain) domain.enter();\n            result = handler(value); // may throw\n            if (domain) {\n              domain.exit();\n              exited = true;\n            }\n          }\n          if (result === reaction.promise) {\n            reject(TypeError('Promise-chain cycle'));\n          } else if (then = isThenable(result)) {\n            then.call(result, resolve, reject);\n          } else resolve(result);\n        } else reject(value);\n      } catch (e) {\n        if (domain && !exited) domain.exit();\n        reject(e);\n      }\n    };\n    while (chain.length > i) run(chain[i++]); // variable length - can't use forEach\n    promise._c = [];\n    promise._n = false;\n    if (isReject && !promise._h) onUnhandled(promise);\n  });\n};\nvar onUnhandled = function (promise) {\n  task.call(global, function () {\n    var value = promise._v;\n    var unhandled = isUnhandled(promise);\n    var result, handler, console;\n    if (unhandled) {\n      result = perform(function () {\n        if (isNode) {\n          process.emit('unhandledRejection', value, promise);\n        } else if (handler = global.onunhandledrejection) {\n          handler({ promise: promise, reason: value });\n        } else if ((console = global.console) && console.error) {\n          console.error('Unhandled promise rejection', value);\n        }\n      });\n      // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n      promise._h = isNode || isUnhandled(promise) ? 2 : 1;\n    } promise._a = undefined;\n    if (unhandled && result.e) throw result.v;\n  });\n};\nvar isUnhandled = function (promise) {\n  return promise._h !== 1 && (promise._a || promise._c).length === 0;\n};\nvar onHandleUnhandled = function (promise) {\n  task.call(global, function () {\n    var handler;\n    if (isNode) {\n      process.emit('rejectionHandled', promise);\n    } else if (handler = global.onrejectionhandled) {\n      handler({ promise: promise, reason: promise._v });\n    }\n  });\n};\nvar $reject = function (value) {\n  var promise = this;\n  if (promise._d) return;\n  promise._d = true;\n  promise = promise._w || promise; // unwrap\n  promise._v = value;\n  promise._s = 2;\n  if (!promise._a) promise._a = promise._c.slice();\n  notify(promise, true);\n};\nvar $resolve = function (value) {\n  var promise = this;\n  var then;\n  if (promise._d) return;\n  promise._d = true;\n  promise = promise._w || promise; // unwrap\n  try {\n    if (promise === value) throw TypeError(\"Promise can't be resolved itself\");\n    if (then = isThenable(value)) {\n      microtask(function () {\n        var wrapper = { _w: promise, _d: false }; // wrap\n        try {\n          then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));\n        } catch (e) {\n          $reject.call(wrapper, e);\n        }\n      });\n    } else {\n      promise._v = value;\n      promise._s = 1;\n      notify(promise, false);\n    }\n  } catch (e) {\n    $reject.call({ _w: promise, _d: false }, e); // wrap\n  }\n};\n\n// constructor polyfill\nif (!USE_NATIVE) {\n  // 25.4.3.1 Promise(executor)\n  $Promise = function Promise(executor) {\n    anInstance(this, $Promise, PROMISE, '_h');\n    aFunction(executor);\n    Internal.call(this);\n    try {\n      executor(ctx($resolve, this, 1), ctx($reject, this, 1));\n    } catch (err) {\n      $reject.call(this, err);\n    }\n  };\n  // eslint-disable-next-line no-unused-vars\n  Internal = function Promise(executor) {\n    this._c = [];             // <- awaiting reactions\n    this._a = undefined;      // <- checked in isUnhandled reactions\n    this._s = 0;              // <- state\n    this._d = false;          // <- done\n    this._v = undefined;      // <- value\n    this._h = 0;              // <- rejection state, 0 - default, 1 - handled, 2 - unhandled\n    this._n = false;          // <- notify\n  };\n  Internal.prototype = require('./_redefine-all')($Promise.prototype, {\n    // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)\n    then: function then(onFulfilled, onRejected) {\n      var reaction = newPromiseCapability(speciesConstructor(this, $Promise));\n      reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n      reaction.fail = typeof onRejected == 'function' && onRejected;\n      reaction.domain = isNode ? process.domain : undefined;\n      this._c.push(reaction);\n      if (this._a) this._a.push(reaction);\n      if (this._s) notify(this, false);\n      return reaction.promise;\n    },\n    // 25.4.5.1 Promise.prototype.catch(onRejected)\n    'catch': function (onRejected) {\n      return this.then(undefined, onRejected);\n    }\n  });\n  OwnPromiseCapability = function () {\n    var promise = new Internal();\n    this.promise = promise;\n    this.resolve = ctx($resolve, promise, 1);\n    this.reject = ctx($reject, promise, 1);\n  };\n  newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n    return C === $Promise || C === Wrapper\n      ? new OwnPromiseCapability(C)\n      : newGenericPromiseCapability(C);\n  };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Promise: $Promise });\nrequire('./_set-to-string-tag')($Promise, PROMISE);\nrequire('./_set-species')(PROMISE);\nWrapper = require('./_core')[PROMISE];\n\n// statics\n$export($export.S + $export.F * !USE_NATIVE, PROMISE, {\n  // 25.4.4.5 Promise.reject(r)\n  reject: function reject(r) {\n    var capability = newPromiseCapability(this);\n    var $$reject = capability.reject;\n    $$reject(r);\n    return capability.promise;\n  }\n});\n$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, {\n  // 25.4.4.6 Promise.resolve(x)\n  resolve: function resolve(x) {\n    return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x);\n  }\n});\n$export($export.S + $export.F * !(USE_NATIVE && require('./_iter-detect')(function (iter) {\n  $Promise.all(iter)['catch'](empty);\n})), PROMISE, {\n  // 25.4.4.1 Promise.all(iterable)\n  all: function all(iterable) {\n    var C = this;\n    var capability = newPromiseCapability(C);\n    var resolve = capability.resolve;\n    var reject = capability.reject;\n    var result = perform(function () {\n      var values = [];\n      var index = 0;\n      var remaining = 1;\n      forOf(iterable, false, function (promise) {\n        var $index = index++;\n        var alreadyCalled = false;\n        values.push(undefined);\n        remaining++;\n        C.resolve(promise).then(function (value) {\n          if (alreadyCalled) return;\n          alreadyCalled = true;\n          values[$index] = value;\n          --remaining || resolve(values);\n        }, reject);\n      });\n      --remaining || resolve(values);\n    });\n    if (result.e) reject(result.v);\n    return capability.promise;\n  },\n  // 25.4.4.4 Promise.race(iterable)\n  race: function race(iterable) {\n    var C = this;\n    var capability = newPromiseCapability(C);\n    var reject = capability.reject;\n    var result = perform(function () {\n      forOf(iterable, false, function (promise) {\n        C.resolve(promise).then(capability.resolve, reject);\n      });\n    });\n    if (result.e) reject(result.v);\n    return capability.promise;\n  }\n});\n","module.exports = function (it, Constructor, name, forbiddenField) {\n  if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) {\n    throw TypeError(name + ': incorrect invocation!');\n  } return it;\n};\n","var ctx = require('./_ctx');\nvar call = require('./_iter-call');\nvar isArrayIter = require('./_is-array-iter');\nvar anObject = require('./_an-object');\nvar toLength = require('./_to-length');\nvar getIterFn = require('./core.get-iterator-method');\nvar BREAK = {};\nvar RETURN = {};\nvar exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {\n  var iterFn = ITERATOR ? function () { return iterable; } : getIterFn(iterable);\n  var f = ctx(fn, that, entries ? 2 : 1);\n  var index = 0;\n  var length, step, iterator, result;\n  if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');\n  // fast case for arrays with default iterator\n  if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) {\n    result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);\n    if (result === BREAK || result === RETURN) return result;\n  } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {\n    result = call(iterator, f, step.value, entries);\n    if (result === BREAK || result === RETURN) return result;\n  }\n};\nexports.BREAK = BREAK;\nexports.RETURN = RETURN;\n","// call something on iterator step with safe closing on error\nvar anObject = require('./_an-object');\nmodule.exports = function (iterator, fn, value, entries) {\n  try {\n    return entries ? fn(anObject(value)[0], value[1]) : fn(value);\n  // 7.4.6 IteratorClose(iterator, completion)\n  } catch (e) {\n    var ret = iterator['return'];\n    if (ret !== undefined) anObject(ret.call(iterator));\n    throw e;\n  }\n};\n","// check on default Array iterator\nvar Iterators = require('./_iterators');\nvar ITERATOR = require('./_wks')('iterator');\nvar ArrayProto = Array.prototype;\n\nmodule.exports = function (it) {\n  return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);\n};\n","var classof = require('./_classof');\nvar ITERATOR = require('./_wks')('iterator');\nvar Iterators = require('./_iterators');\nmodule.exports = require('./_core').getIteratorMethod = function (it) {\n  if (it != undefined) return it[ITERATOR]\n    || it['@@iterator']\n    || Iterators[classof(it)];\n};\n","// 7.3.20 SpeciesConstructor(O, defaultConstructor)\nvar anObject = require('./_an-object');\nvar aFunction = require('./_a-function');\nvar SPECIES = require('./_wks')('species');\nmodule.exports = function (O, D) {\n  var C = anObject(O).constructor;\n  var S;\n  return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);\n};\n","var ctx = require('./_ctx');\nvar invoke = require('./_invoke');\nvar html = require('./_html');\nvar cel = require('./_dom-create');\nvar global = require('./_global');\nvar process = global.process;\nvar setTask = global.setImmediate;\nvar clearTask = global.clearImmediate;\nvar MessageChannel = global.MessageChannel;\nvar Dispatch = global.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\nvar run = function () {\n  var id = +this;\n  // eslint-disable-next-line no-prototype-builtins\n  if (queue.hasOwnProperty(id)) {\n    var fn = queue[id];\n    delete queue[id];\n    fn();\n  }\n};\nvar listener = function (event) {\n  run.call(event.data);\n};\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!setTask || !clearTask) {\n  setTask = function setImmediate(fn) {\n    var args = [];\n    var i = 1;\n    while (arguments.length > i) args.push(arguments[i++]);\n    queue[++counter] = function () {\n      // eslint-disable-next-line no-new-func\n      invoke(typeof fn == 'function' ? fn : Function(fn), args);\n    };\n    defer(counter);\n    return counter;\n  };\n  clearTask = function clearImmediate(id) {\n    delete queue[id];\n  };\n  // Node.js 0.8-\n  if (require('./_cof')(process) == 'process') {\n    defer = function (id) {\n      process.nextTick(ctx(run, id, 1));\n    };\n  // Sphere (JS game engine) Dispatch API\n  } else if (Dispatch && Dispatch.now) {\n    defer = function (id) {\n      Dispatch.now(ctx(run, id, 1));\n    };\n  // Browsers with MessageChannel, includes WebWorkers\n  } else if (MessageChannel) {\n    channel = new MessageChannel();\n    port = channel.port2;\n    channel.port1.onmessage = listener;\n    defer = ctx(port.postMessage, port, 1);\n  // Browsers with postMessage, skip WebWorkers\n  // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n  } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) {\n    defer = function (id) {\n      global.postMessage(id + '', '*');\n    };\n    global.addEventListener('message', listener, false);\n  // IE8-\n  } else if (ONREADYSTATECHANGE in cel('script')) {\n    defer = function (id) {\n      html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () {\n        html.removeChild(this);\n        run.call(id);\n      };\n    };\n  // Rest old browsers\n  } else {\n    defer = function (id) {\n      setTimeout(ctx(run, id, 1), 0);\n    };\n  }\n}\nmodule.exports = {\n  set: setTask,\n  clear: clearTask\n};\n","// fast apply, http://jsperf.lnkit.com/fast-apply/5\nmodule.exports = function (fn, args, that) {\n  var un = that === undefined;\n  switch (args.length) {\n    case 0: return un ? fn()\n                      : fn.call(that);\n    case 1: return un ? fn(args[0])\n                      : fn.call(that, args[0]);\n    case 2: return un ? fn(args[0], args[1])\n                      : fn.call(that, args[0], args[1]);\n    case 3: return un ? fn(args[0], args[1], args[2])\n                      : fn.call(that, args[0], args[1], args[2]);\n    case 4: return un ? fn(args[0], args[1], args[2], args[3])\n                      : fn.call(that, args[0], args[1], args[2], args[3]);\n  } return fn.apply(that, args);\n};\n","var global = require('./_global');\nvar macrotask = require('./_task').set;\nvar Observer = global.MutationObserver || global.WebKitMutationObserver;\nvar process = global.process;\nvar Promise = global.Promise;\nvar isNode = require('./_cof')(process) == 'process';\n\nmodule.exports = function () {\n  var head, last, notify;\n\n  var flush = function () {\n    var parent, fn;\n    if (isNode && (parent = process.domain)) parent.exit();\n    while (head) {\n      fn = head.fn;\n      head = head.next;\n      try {\n        fn();\n      } catch (e) {\n        if (head) notify();\n        else last = undefined;\n        throw e;\n      }\n    } last = undefined;\n    if (parent) parent.enter();\n  };\n\n  // Node.js\n  if (isNode) {\n    notify = function () {\n      process.nextTick(flush);\n    };\n  // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339\n  } else if (Observer && !(global.navigator && global.navigator.standalone)) {\n    var toggle = true;\n    var node = document.createTextNode('');\n    new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new\n    notify = function () {\n      node.data = toggle = !toggle;\n    };\n  // environments with maybe non-completely correct, but existent Promise\n  } else if (Promise && Promise.resolve) {\n    // Promise.resolve without an argument throws an error in LG WebOS 2\n    var promise = Promise.resolve(undefined);\n    notify = function () {\n      promise.then(flush);\n    };\n  // for other environments - macrotask based on:\n  // - setImmediate\n  // - MessageChannel\n  // - window.postMessag\n  // - onreadystatechange\n  // - setTimeout\n  } else {\n    notify = function () {\n      // strange IE + webpack dev server bug - use .call(global)\n      macrotask.call(global, flush);\n    };\n  }\n\n  return function (fn) {\n    var task = { fn: fn, next: undefined };\n    if (last) last.next = task;\n    if (!head) {\n      head = task;\n      notify();\n    } last = task;\n  };\n};\n","'use strict';\n// 25.4.1.5 NewPromiseCapability(C)\nvar aFunction = require('./_a-function');\n\nfunction PromiseCapability(C) {\n  var resolve, reject;\n  this.promise = new C(function ($$resolve, $$reject) {\n    if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n    resolve = $$resolve;\n    reject = $$reject;\n  });\n  this.resolve = aFunction(resolve);\n  this.reject = aFunction(reject);\n}\n\nmodule.exports.f = function (C) {\n  return new PromiseCapability(C);\n};\n","module.exports = function (exec) {\n  try {\n    return { e: false, v: exec() };\n  } catch (e) {\n    return { e: true, v: e };\n  }\n};\n","var global = require('./_global');\nvar navigator = global.navigator;\n\nmodule.exports = navigator && navigator.userAgent || '';\n","var anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar newPromiseCapability = require('./_new-promise-capability');\n\nmodule.exports = function (C, x) {\n  anObject(C);\n  if (isObject(x) && x.constructor === C) return x;\n  var promiseCapability = newPromiseCapability.f(C);\n  var resolve = promiseCapability.resolve;\n  resolve(x);\n  return promiseCapability.promise;\n};\n","var redefine = require('./_redefine');\nmodule.exports = function (target, src, safe) {\n  for (var key in src) redefine(target, key, src[key], safe);\n  return target;\n};\n","'use strict';\nvar global = require('./_global');\nvar dP = require('./_object-dp');\nvar DESCRIPTORS = require('./_descriptors');\nvar SPECIES = require('./_wks')('species');\n\nmodule.exports = function (KEY) {\n  var C = global[KEY];\n  if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, {\n    configurable: true,\n    get: function () { return this; }\n  });\n};\n","var ITERATOR = require('./_wks')('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n  var riter = [7][ITERATOR]();\n  riter['return'] = function () { SAFE_CLOSING = true; };\n  // eslint-disable-next-line no-throw-literal\n  Array.from(riter, function () { throw 2; });\n} catch (e) { /* empty */ }\n\nmodule.exports = function (exec, skipClosing) {\n  if (!skipClosing && !SAFE_CLOSING) return false;\n  var safe = false;\n  try {\n    var arr = [7];\n    var iter = arr[ITERATOR]();\n    iter.next = function () { return { done: safe = true }; };\n    arr[ITERATOR] = function () { return iter; };\n    exec(arr);\n  } catch (e) { /* empty */ }\n  return safe;\n};\n","// https://github.com/tc39/proposal-promise-finally\n'use strict';\nvar $export = require('./_export');\nvar core = require('./_core');\nvar global = require('./_global');\nvar speciesConstructor = require('./_species-constructor');\nvar promiseResolve = require('./_promise-resolve');\n\n$export($export.P + $export.R, 'Promise', { 'finally': function (onFinally) {\n  var C = speciesConstructor(this, core.Promise || global.Promise);\n  var isFunction = typeof onFinally == 'function';\n  return this.then(\n    isFunction ? function (x) {\n      return promiseResolve(C, onFinally()).then(function () { return x; });\n    } : onFinally,\n    isFunction ? function (e) {\n      return promiseResolve(C, onFinally()).then(function () { throw e; });\n    } : onFinally\n  );\n} });\n","'use strict';\n// https://github.com/tc39/proposal-promise-try\nvar $export = require('./_export');\nvar newPromiseCapability = require('./_new-promise-capability');\nvar perform = require('./_perform');\n\n$export($export.S, 'Promise', { 'try': function (callbackfn) {\n  var promiseCapability = newPromiseCapability.f(this);\n  var result = perform(callbackfn);\n  (result.e ? promiseCapability.reject : promiseCapability.resolve)(result.v);\n  return promiseCapability.promise;\n} });\n","require('../modules/es6.object.to-string');\nrequire('../modules/web.dom.iterable');\nrequire('../modules/es6.weak-map');\nrequire('../modules/es7.weak-map.of');\nrequire('../modules/es7.weak-map.from');\nmodule.exports = require('../modules/_core').WeakMap;\n","'use strict';\nvar each = require('./_array-methods')(0);\nvar redefine = require('./_redefine');\nvar meta = require('./_meta');\nvar assign = require('./_object-assign');\nvar weak = require('./_collection-weak');\nvar isObject = require('./_is-object');\nvar fails = require('./_fails');\nvar validate = require('./_validate-collection');\nvar WEAK_MAP = 'WeakMap';\nvar getWeak = meta.getWeak;\nvar isExtensible = Object.isExtensible;\nvar uncaughtFrozenStore = weak.ufstore;\nvar tmp = {};\nvar InternalMap;\n\nvar wrapper = function (get) {\n  return function WeakMap() {\n    return get(this, arguments.length > 0 ? arguments[0] : undefined);\n  };\n};\n\nvar methods = {\n  // 23.3.3.3 WeakMap.prototype.get(key)\n  get: function get(key) {\n    if (isObject(key)) {\n      var data = getWeak(key);\n      if (data === true) return uncaughtFrozenStore(validate(this, WEAK_MAP)).get(key);\n      return data ? data[this._i] : undefined;\n    }\n  },\n  // 23.3.3.5 WeakMap.prototype.set(key, value)\n  set: function set(key, value) {\n    return weak.def(validate(this, WEAK_MAP), key, value);\n  }\n};\n\n// 23.3 WeakMap Objects\nvar $WeakMap = module.exports = require('./_collection')(WEAK_MAP, wrapper, methods, weak, true, true);\n\n// IE11 WeakMap frozen keys fix\nif (fails(function () { return new $WeakMap().set((Object.freeze || Object)(tmp), 7).get(tmp) != 7; })) {\n  InternalMap = weak.getConstructor(wrapper, WEAK_MAP);\n  assign(InternalMap.prototype, methods);\n  meta.NEED = true;\n  each(['delete', 'has', 'get', 'set'], function (key) {\n    var proto = $WeakMap.prototype;\n    var method = proto[key];\n    redefine(proto, key, function (a, b) {\n      // store frozen objects on internal weakmap shim\n      if (isObject(a) && !isExtensible(a)) {\n        if (!this._f) this._f = new InternalMap();\n        var result = this._f[key](a, b);\n        return key == 'set' ? this : result;\n      // store all the rest on native weakmap\n      } return method.call(this, a, b);\n    });\n  });\n}\n","// 0 -> Array#forEach\n// 1 -> Array#map\n// 2 -> Array#filter\n// 3 -> Array#some\n// 4 -> Array#every\n// 5 -> Array#find\n// 6 -> Array#findIndex\nvar ctx = require('./_ctx');\nvar IObject = require('./_iobject');\nvar toObject = require('./_to-object');\nvar toLength = require('./_to-length');\nvar asc = require('./_array-species-create');\nmodule.exports = function (TYPE, $create) {\n  var IS_MAP = TYPE == 1;\n  var IS_FILTER = TYPE == 2;\n  var IS_SOME = TYPE == 3;\n  var IS_EVERY = TYPE == 4;\n  var IS_FIND_INDEX = TYPE == 6;\n  var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n  var create = $create || asc;\n  return function ($this, callbackfn, that) {\n    var O = toObject($this);\n    var self = IObject(O);\n    var f = ctx(callbackfn, that, 3);\n    var length = toLength(self.length);\n    var index = 0;\n    var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n    var val, res;\n    for (;length > index; index++) if (NO_HOLES || index in self) {\n      val = self[index];\n      res = f(val, index, O);\n      if (TYPE) {\n        if (IS_MAP) result[index] = res;   // map\n        else if (res) switch (TYPE) {\n          case 3: return true;             // some\n          case 5: return val;              // find\n          case 6: return index;            // findIndex\n          case 2: result.push(val);        // filter\n        } else if (IS_EVERY) return false; // every\n      }\n    }\n    return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;\n  };\n};\n","// 9.4.2.3 ArraySpeciesCreate(originalArray, length)\nvar speciesConstructor = require('./_array-species-constructor');\n\nmodule.exports = function (original, length) {\n  return new (speciesConstructor(original))(length);\n};\n","var isObject = require('./_is-object');\nvar isArray = require('./_is-array');\nvar SPECIES = require('./_wks')('species');\n\nmodule.exports = function (original) {\n  var C;\n  if (isArray(original)) {\n    C = original.constructor;\n    // cross-realm fallback\n    if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n    if (isObject(C)) {\n      C = C[SPECIES];\n      if (C === null) C = undefined;\n    }\n  } return C === undefined ? Array : C;\n};\n","// 7.2.2 IsArray(argument)\nvar cof = require('./_cof');\nmodule.exports = Array.isArray || function isArray(arg) {\n  return cof(arg) == 'Array';\n};\n","var META = require('./_uid')('meta');\nvar isObject = require('./_is-object');\nvar has = require('./_has');\nvar setDesc = require('./_object-dp').f;\nvar id = 0;\nvar isExtensible = Object.isExtensible || function () {\n  return true;\n};\nvar FREEZE = !require('./_fails')(function () {\n  return isExtensible(Object.preventExtensions({}));\n});\nvar setMeta = function (it) {\n  setDesc(it, META, { value: {\n    i: 'O' + ++id, // object ID\n    w: {}          // weak collections IDs\n  } });\n};\nvar fastKey = function (it, create) {\n  // return primitive with prefix\n  if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n  if (!has(it, META)) {\n    // can't set metadata to uncaught frozen object\n    if (!isExtensible(it)) return 'F';\n    // not necessary to add metadata\n    if (!create) return 'E';\n    // add missing metadata\n    setMeta(it);\n  // return object ID\n  } return it[META].i;\n};\nvar getWeak = function (it, create) {\n  if (!has(it, META)) {\n    // can't set metadata to uncaught frozen object\n    if (!isExtensible(it)) return true;\n    // not necessary to add metadata\n    if (!create) return false;\n    // add missing metadata\n    setMeta(it);\n  // return hash weak collections IDs\n  } return it[META].w;\n};\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n  if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);\n  return it;\n};\nvar meta = module.exports = {\n  KEY: META,\n  NEED: false,\n  fastKey: fastKey,\n  getWeak: getWeak,\n  onFreeze: onFreeze\n};\n","'use strict';\nvar redefineAll = require('./_redefine-all');\nvar getWeak = require('./_meta').getWeak;\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar createArrayMethod = require('./_array-methods');\nvar $has = require('./_has');\nvar validate = require('./_validate-collection');\nvar arrayFind = createArrayMethod(5);\nvar arrayFindIndex = createArrayMethod(6);\nvar id = 0;\n\n// fallback for uncaught frozen keys\nvar uncaughtFrozenStore = function (that) {\n  return that._l || (that._l = new UncaughtFrozenStore());\n};\nvar UncaughtFrozenStore = function () {\n  this.a = [];\n};\nvar findUncaughtFrozen = function (store, key) {\n  return arrayFind(store.a, function (it) {\n    return it[0] === key;\n  });\n};\nUncaughtFrozenStore.prototype = {\n  get: function (key) {\n    var entry = findUncaughtFrozen(this, key);\n    if (entry) return entry[1];\n  },\n  has: function (key) {\n    return !!findUncaughtFrozen(this, key);\n  },\n  set: function (key, value) {\n    var entry = findUncaughtFrozen(this, key);\n    if (entry) entry[1] = value;\n    else this.a.push([key, value]);\n  },\n  'delete': function (key) {\n    var index = arrayFindIndex(this.a, function (it) {\n      return it[0] === key;\n    });\n    if (~index) this.a.splice(index, 1);\n    return !!~index;\n  }\n};\n\nmodule.exports = {\n  getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {\n    var C = wrapper(function (that, iterable) {\n      anInstance(that, C, NAME, '_i');\n      that._t = NAME;      // collection type\n      that._i = id++;      // collection id\n      that._l = undefined; // leak store for uncaught frozen objects\n      if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n    });\n    redefineAll(C.prototype, {\n      // 23.3.3.2 WeakMap.prototype.delete(key)\n      // 23.4.3.3 WeakSet.prototype.delete(value)\n      'delete': function (key) {\n        if (!isObject(key)) return false;\n        var data = getWeak(key);\n        if (data === true) return uncaughtFrozenStore(validate(this, NAME))['delete'](key);\n        return data && $has(data, this._i) && delete data[this._i];\n      },\n      // 23.3.3.4 WeakMap.prototype.has(key)\n      // 23.4.3.4 WeakSet.prototype.has(value)\n      has: function has(key) {\n        if (!isObject(key)) return false;\n        var data = getWeak(key);\n        if (data === true) return uncaughtFrozenStore(validate(this, NAME)).has(key);\n        return data && $has(data, this._i);\n      }\n    });\n    return C;\n  },\n  def: function (that, key, value) {\n    var data = getWeak(anObject(key), true);\n    if (data === true) uncaughtFrozenStore(that).set(key, value);\n    else data[that._i] = value;\n    return that;\n  },\n  ufstore: uncaughtFrozenStore\n};\n","var isObject = require('./_is-object');\nmodule.exports = function (it, TYPE) {\n  if (!isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!');\n  return it;\n};\n","'use strict';\nvar global = require('./_global');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar redefineAll = require('./_redefine-all');\nvar meta = require('./_meta');\nvar forOf = require('./_for-of');\nvar anInstance = require('./_an-instance');\nvar isObject = require('./_is-object');\nvar fails = require('./_fails');\nvar $iterDetect = require('./_iter-detect');\nvar setToStringTag = require('./_set-to-string-tag');\nvar inheritIfRequired = require('./_inherit-if-required');\n\nmodule.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {\n  var Base = global[NAME];\n  var C = Base;\n  var ADDER = IS_MAP ? 'set' : 'add';\n  var proto = C && C.prototype;\n  var O = {};\n  var fixMethod = function (KEY) {\n    var fn = proto[KEY];\n    redefine(proto, KEY,\n      KEY == 'delete' ? function (a) {\n        return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n      } : KEY == 'has' ? function has(a) {\n        return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n      } : KEY == 'get' ? function get(a) {\n        return IS_WEAK && !isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a);\n      } : KEY == 'add' ? function add(a) { fn.call(this, a === 0 ? 0 : a); return this; }\n        : function set(a, b) { fn.call(this, a === 0 ? 0 : a, b); return this; }\n    );\n  };\n  if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () {\n    new C().entries().next();\n  }))) {\n    // create collection constructor\n    C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);\n    redefineAll(C.prototype, methods);\n    meta.NEED = true;\n  } else {\n    var instance = new C();\n    // early implementations not supports chaining\n    var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance;\n    // V8 ~  Chromium 40- weak-collections throws on primitives, but should return false\n    var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); });\n    // most early implementations doesn't supports iterables, most modern - not close it correctly\n    var ACCEPT_ITERABLES = $iterDetect(function (iter) { new C(iter); }); // eslint-disable-line no-new\n    // for early implementations -0 and +0 not the same\n    var BUGGY_ZERO = !IS_WEAK && fails(function () {\n      // V8 ~ Chromium 42- fails only with 5+ elements\n      var $instance = new C();\n      var index = 5;\n      while (index--) $instance[ADDER](index, index);\n      return !$instance.has(-0);\n    });\n    if (!ACCEPT_ITERABLES) {\n      C = wrapper(function (target, iterable) {\n        anInstance(target, C, NAME);\n        var that = inheritIfRequired(new Base(), target, C);\n        if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n        return that;\n      });\n      C.prototype = proto;\n      proto.constructor = C;\n    }\n    if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n      fixMethod('delete');\n      fixMethod('has');\n      IS_MAP && fixMethod('get');\n    }\n    if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n    // weak collections should not contains .clear method\n    if (IS_WEAK && proto.clear) delete proto.clear;\n  }\n\n  setToStringTag(C, NAME);\n\n  O[NAME] = C;\n  $export($export.G + $export.W + $export.F * (C != Base), O);\n\n  if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP);\n\n  return C;\n};\n","var isObject = require('./_is-object');\nvar setPrototypeOf = require('./_set-proto').set;\nmodule.exports = function (that, target, C) {\n  var S = target.constructor;\n  var P;\n  if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) {\n    setPrototypeOf(that, P);\n  } return that;\n};\n","// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nvar isObject = require('./_is-object');\nvar anObject = require('./_an-object');\nvar check = function (O, proto) {\n  anObject(O);\n  if (!isObject(proto) && proto !== null) throw TypeError(proto + \": can't set as prototype!\");\n};\nmodule.exports = {\n  set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line\n    function (test, buggy, set) {\n      try {\n        set = require('./_ctx')(Function.call, require('./_object-gopd').f(Object.prototype, '__proto__').set, 2);\n        set(test, []);\n        buggy = !(test instanceof Array);\n      } catch (e) { buggy = true; }\n      return function setPrototypeOf(O, proto) {\n        check(O, proto);\n        if (buggy) O.__proto__ = proto;\n        else set(O, proto);\n        return O;\n      };\n    }({}, false) : undefined),\n  check: check\n};\n","var pIE = require('./_object-pie');\nvar createDesc = require('./_property-desc');\nvar toIObject = require('./_to-iobject');\nvar toPrimitive = require('./_to-primitive');\nvar has = require('./_has');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nexports.f = require('./_descriptors') ? gOPD : function getOwnPropertyDescriptor(O, P) {\n  O = toIObject(O);\n  P = toPrimitive(P, true);\n  if (IE8_DOM_DEFINE) try {\n    return gOPD(O, P);\n  } catch (e) { /* empty */ }\n  if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);\n};\n","// https://tc39.github.io/proposal-setmap-offrom/#sec-weakmap.of\nrequire('./_set-collection-of')('WeakMap');\n","'use strict';\n// https://tc39.github.io/proposal-setmap-offrom/\nvar $export = require('./_export');\n\nmodule.exports = function (COLLECTION) {\n  $export($export.S, COLLECTION, { of: function of() {\n    var length = arguments.length;\n    var A = new Array(length);\n    while (length--) A[length] = arguments[length];\n    return new this(A);\n  } });\n};\n","// https://tc39.github.io/proposal-setmap-offrom/#sec-weakmap.from\nrequire('./_set-collection-from')('WeakMap');\n","'use strict';\n// https://tc39.github.io/proposal-setmap-offrom/\nvar $export = require('./_export');\nvar aFunction = require('./_a-function');\nvar ctx = require('./_ctx');\nvar forOf = require('./_for-of');\n\nmodule.exports = function (COLLECTION) {\n  $export($export.S, COLLECTION, { from: function from(source /* , mapFn, thisArg */) {\n    var mapFn = arguments[1];\n    var mapping, A, n, cb;\n    aFunction(this);\n    mapping = mapFn !== undefined;\n    if (mapping) aFunction(mapFn);\n    if (source == undefined) return new this();\n    A = [];\n    if (mapping) {\n      n = 0;\n      cb = ctx(mapFn, arguments[2], 2);\n      forOf(source, false, function (nextItem) {\n        A.push(cb(nextItem, n++));\n      });\n    } else {\n      forOf(source, false, A.push, A);\n    }\n    return new this(A);\n  } });\n};\n","require('../../modules/es6.string.code-point-at');\nmodule.exports = require('../../modules/_core').String.codePointAt;\n","'use strict';\nvar $export = require('./_export');\nvar $at = require('./_string-at')(false);\n$export($export.P, 'String', {\n  // 21.1.3.3 String.prototype.codePointAt(pos)\n  codePointAt: function codePointAt(pos) {\n    return $at(this, pos);\n  }\n});\n","require('../../modules/es6.string.from-code-point');\nmodule.exports = require('../../modules/_core').String.fromCodePoint;\n","var $export = require('./_export');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar fromCharCode = String.fromCharCode;\nvar $fromCodePoint = String.fromCodePoint;\n\n// length should be 1, old FF problem\n$export($export.S + $export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', {\n  // 21.1.2.2 String.fromCodePoint(...codePoints)\n  fromCodePoint: function fromCodePoint(x) { // eslint-disable-line no-unused-vars\n    var res = [];\n    var aLen = arguments.length;\n    var i = 0;\n    var code;\n    while (aLen > i) {\n      code = +arguments[i++];\n      if (toAbsoluteIndex(code, 0x10ffff) !== code) throw RangeError(code + ' is not a valid code point');\n      res.push(code < 0x10000\n        ? fromCharCode(code)\n        : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00)\n      );\n    } return res.join('');\n  }\n});\n","require('../modules/es6.symbol');\nrequire('../modules/es6.object.to-string');\nmodule.exports = require('../modules/_core').Symbol;\n","'use strict';\n// ECMAScript 6 symbols shim\nvar global = require('./_global');\nvar has = require('./_has');\nvar DESCRIPTORS = require('./_descriptors');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar META = require('./_meta').KEY;\nvar $fails = require('./_fails');\nvar shared = require('./_shared');\nvar setToStringTag = require('./_set-to-string-tag');\nvar uid = require('./_uid');\nvar wks = require('./_wks');\nvar wksExt = require('./_wks-ext');\nvar wksDefine = require('./_wks-define');\nvar enumKeys = require('./_enum-keys');\nvar isArray = require('./_is-array');\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar toIObject = require('./_to-iobject');\nvar toPrimitive = require('./_to-primitive');\nvar createDesc = require('./_property-desc');\nvar _create = require('./_object-create');\nvar gOPNExt = require('./_object-gopn-ext');\nvar $GOPD = require('./_object-gopd');\nvar $DP = require('./_object-dp');\nvar $keys = require('./_object-keys');\nvar gOPD = $GOPD.f;\nvar dP = $DP.f;\nvar gOPN = gOPNExt.f;\nvar $Symbol = global.Symbol;\nvar $JSON = global.JSON;\nvar _stringify = $JSON && $JSON.stringify;\nvar PROTOTYPE = 'prototype';\nvar HIDDEN = wks('_hidden');\nvar TO_PRIMITIVE = wks('toPrimitive');\nvar isEnum = {}.propertyIsEnumerable;\nvar SymbolRegistry = shared('symbol-registry');\nvar AllSymbols = shared('symbols');\nvar OPSymbols = shared('op-symbols');\nvar ObjectProto = Object[PROTOTYPE];\nvar USE_NATIVE = typeof $Symbol == 'function';\nvar QObject = global.QObject;\n// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\nvar setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\n\n// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\nvar setSymbolDesc = DESCRIPTORS && $fails(function () {\n  return _create(dP({}, 'a', {\n    get: function () { return dP(this, 'a', { value: 7 }).a; }\n  })).a != 7;\n}) ? function (it, key, D) {\n  var protoDesc = gOPD(ObjectProto, key);\n  if (protoDesc) delete ObjectProto[key];\n  dP(it, key, D);\n  if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);\n} : dP;\n\nvar wrap = function (tag) {\n  var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);\n  sym._k = tag;\n  return sym;\n};\n\nvar isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) {\n  return typeof it == 'symbol';\n} : function (it) {\n  return it instanceof $Symbol;\n};\n\nvar $defineProperty = function defineProperty(it, key, D) {\n  if (it === ObjectProto) $defineProperty(OPSymbols, key, D);\n  anObject(it);\n  key = toPrimitive(key, true);\n  anObject(D);\n  if (has(AllSymbols, key)) {\n    if (!D.enumerable) {\n      if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));\n      it[HIDDEN][key] = true;\n    } else {\n      if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;\n      D = _create(D, { enumerable: createDesc(0, false) });\n    } return setSymbolDesc(it, key, D);\n  } return dP(it, key, D);\n};\nvar $defineProperties = function defineProperties(it, P) {\n  anObject(it);\n  var keys = enumKeys(P = toIObject(P));\n  var i = 0;\n  var l = keys.length;\n  var key;\n  while (l > i) $defineProperty(it, key = keys[i++], P[key]);\n  return it;\n};\nvar $create = function create(it, P) {\n  return P === undefined ? _create(it) : $defineProperties(_create(it), P);\n};\nvar $propertyIsEnumerable = function propertyIsEnumerable(key) {\n  var E = isEnum.call(this, key = toPrimitive(key, true));\n  if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;\n  return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;\n};\nvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {\n  it = toIObject(it);\n  key = toPrimitive(key, true);\n  if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;\n  var D = gOPD(it, key);\n  if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;\n  return D;\n};\nvar $getOwnPropertyNames = function getOwnPropertyNames(it) {\n  var names = gOPN(toIObject(it));\n  var result = [];\n  var i = 0;\n  var key;\n  while (names.length > i) {\n    if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);\n  } return result;\n};\nvar $getOwnPropertySymbols = function getOwnPropertySymbols(it) {\n  var IS_OP = it === ObjectProto;\n  var names = gOPN(IS_OP ? OPSymbols : toIObject(it));\n  var result = [];\n  var i = 0;\n  var key;\n  while (names.length > i) {\n    if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);\n  } return result;\n};\n\n// 19.4.1.1 Symbol([description])\nif (!USE_NATIVE) {\n  $Symbol = function Symbol() {\n    if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');\n    var tag = uid(arguments.length > 0 ? arguments[0] : undefined);\n    var $set = function (value) {\n      if (this === ObjectProto) $set.call(OPSymbols, value);\n      if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n      setSymbolDesc(this, tag, createDesc(1, value));\n    };\n    if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set });\n    return wrap(tag);\n  };\n  redefine($Symbol[PROTOTYPE], 'toString', function toString() {\n    return this._k;\n  });\n\n  $GOPD.f = $getOwnPropertyDescriptor;\n  $DP.f = $defineProperty;\n  require('./_object-gopn').f = gOPNExt.f = $getOwnPropertyNames;\n  require('./_object-pie').f = $propertyIsEnumerable;\n  require('./_object-gops').f = $getOwnPropertySymbols;\n\n  if (DESCRIPTORS && !require('./_library')) {\n    redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);\n  }\n\n  wksExt.f = function (name) {\n    return wrap(wks(name));\n  };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol });\n\nfor (var es6Symbols = (\n  // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14\n  'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'\n).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]);\n\nfor (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]);\n\n$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {\n  // 19.4.2.1 Symbol.for(key)\n  'for': function (key) {\n    return has(SymbolRegistry, key += '')\n      ? SymbolRegistry[key]\n      : SymbolRegistry[key] = $Symbol(key);\n  },\n  // 19.4.2.5 Symbol.keyFor(sym)\n  keyFor: function keyFor(sym) {\n    if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');\n    for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;\n  },\n  useSetter: function () { setter = true; },\n  useSimple: function () { setter = false; }\n});\n\n$export($export.S + $export.F * !USE_NATIVE, 'Object', {\n  // 19.1.2.2 Object.create(O [, Properties])\n  create: $create,\n  // 19.1.2.4 Object.defineProperty(O, P, Attributes)\n  defineProperty: $defineProperty,\n  // 19.1.2.3 Object.defineProperties(O, Properties)\n  defineProperties: $defineProperties,\n  // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\n  getOwnPropertyDescriptor: $getOwnPropertyDescriptor,\n  // 19.1.2.7 Object.getOwnPropertyNames(O)\n  getOwnPropertyNames: $getOwnPropertyNames,\n  // 19.1.2.8 Object.getOwnPropertySymbols(O)\n  getOwnPropertySymbols: $getOwnPropertySymbols\n});\n\n// 24.3.2 JSON.stringify(value [, replacer [, space]])\n$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {\n  var S = $Symbol();\n  // MS Edge converts symbol values to JSON as {}\n  // WebKit converts symbol values to JSON as null\n  // V8 throws on boxed symbols\n  return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';\n})), 'JSON', {\n  stringify: function stringify(it) {\n    var args = [it];\n    var i = 1;\n    var replacer, $replacer;\n    while (arguments.length > i) args.push(arguments[i++]);\n    $replacer = replacer = args[1];\n    if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined\n    if (!isArray(replacer)) replacer = function (key, value) {\n      if (typeof $replacer == 'function') value = $replacer.call(this, key, value);\n      if (!isSymbol(value)) return value;\n    };\n    args[1] = replacer;\n    return _stringify.apply($JSON, args);\n  }\n});\n\n// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)\n$Symbol[PROTOTYPE][TO_PRIMITIVE] || require('./_hide')($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);\n// 19.4.3.5 Symbol.prototype[@@toStringTag]\nsetToStringTag($Symbol, 'Symbol');\n// 20.2.1.9 Math[@@toStringTag]\nsetToStringTag(Math, 'Math', true);\n// 24.3.3 JSON[@@toStringTag]\nsetToStringTag(global.JSON, 'JSON', true);\n","exports.f = require('./_wks');\n","var global = require('./_global');\nvar core = require('./_core');\nvar LIBRARY = require('./_library');\nvar wksExt = require('./_wks-ext');\nvar defineProperty = require('./_object-dp').f;\nmodule.exports = function (name) {\n  var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});\n  if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) });\n};\n","// all enumerable object keys, includes symbols\nvar getKeys = require('./_object-keys');\nvar gOPS = require('./_object-gops');\nvar pIE = require('./_object-pie');\nmodule.exports = function (it) {\n  var result = getKeys(it);\n  var getSymbols = gOPS.f;\n  if (getSymbols) {\n    var symbols = getSymbols(it);\n    var isEnum = pIE.f;\n    var i = 0;\n    var key;\n    while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key);\n  } return result;\n};\n","// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nvar toIObject = require('./_to-iobject');\nvar gOPN = require('./_object-gopn').f;\nvar toString = {}.toString;\n\nvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n  ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function (it) {\n  try {\n    return gOPN(it);\n  } catch (e) {\n    return windowNames.slice();\n  }\n};\n\nmodule.exports.f = function getOwnPropertyNames(it) {\n  return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));\n};\n","// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\nvar $keys = require('./_object-keys-internal');\nvar hiddenKeys = require('./_enum-bug-keys').concat('length', 'prototype');\n\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n  return $keys(O, hiddenKeys);\n};\n","require('../../modules/es7.object.values');\nmodule.exports = require('../../modules/_core').Object.values;\n","// https://github.com/tc39/proposal-object-values-entries\nvar $export = require('./_export');\nvar $values = require('./_object-to-array')(false);\n\n$export($export.S, 'Object', {\n  values: function values(it) {\n    return $values(it);\n  }\n});\n","var getKeys = require('./_object-keys');\nvar toIObject = require('./_to-iobject');\nvar isEnum = require('./_object-pie').f;\nmodule.exports = function (isEntries) {\n  return function (it) {\n    var O = toIObject(it);\n    var keys = getKeys(O);\n    var length = keys.length;\n    var i = 0;\n    var result = [];\n    var key;\n    while (length > i) if (isEnum.call(O, key = keys[i++])) {\n      result.push(isEntries ? [key, O[key]] : O[key]);\n    } return result;\n  };\n};\n","/* Copyright 2017 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* eslint-disable no-restricted-globals */\n\nlet isReadableStreamSupported = false;\nif (typeof ReadableStream !== 'undefined') {\n  // MS Edge may say it has ReadableStream but they are not up to spec yet.\n  try {\n    // eslint-disable-next-line no-new\n    new ReadableStream({\n      start(controller) {\n        controller.close();\n      },\n    });\n    isReadableStreamSupported = true;\n  } catch (e) {\n    // The ReadableStream constructor cannot be used.\n  }\n}\nif (isReadableStreamSupported) {\n  exports.ReadableStream = ReadableStream;\n} else {\n  if (typeof PDFJSDev !== 'undefined' && PDFJSDev.test('IMAGE_DECODERS')) {\n    class DummyReadableStream {\n      constructor() {\n        throw new Error('The current image decoders are synchronous, ' +\n                        'hence `ReadableStream` shouldn\\'t need to be ' +\n                        'polyfilled for the IMAGE_DECODERS build target.');\n      }\n    }\n    exports.ReadableStream = DummyReadableStream;\n  } else {\n    exports.ReadableStream =\n      require('../../external/streams/streams-lib').ReadableStream;\n  }\n}\n","/*\n * To the extent possible under law, the authors have dedicated all copyright\n * and related and neighboring rights to this software to the public\n * domain worldwide. This software is distributed without any warranty.\n *\n * You should have received a copy of the CC0 Public Domain Dedication along\n * with this software. If not, see https://creativecommons.org/publicdomain/zero/1.0/.\n */\n\n(function(e, a) { for(var i in a) e[i] = a[i]; }(exports, /******/ (function(modules) { // webpackBootstrap\n/******/  // The module cache\n/******/  var installedModules = {};\n/******/\n/******/  // The require function\n/******/  function __w_pdfjs_require__(moduleId) {\n/******/\n/******/    // Check if module is in cache\n/******/    if(installedModules[moduleId])\n/******/      return installedModules[moduleId].exports;\n/******/\n/******/    // Create a new module (and put it into the cache)\n/******/    var module = installedModules[moduleId] = {\n/******/      i: moduleId,\n/******/      l: false,\n/******/      exports: {}\n/******/    };\n/******/\n/******/    // Execute the module function\n/******/    modules[moduleId].call(module.exports, module, module.exports, __w_pdfjs_require__);\n/******/\n/******/    // Flag the module as loaded\n/******/    module.l = true;\n/******/\n/******/    // Return the exports of the module\n/******/    return module.exports;\n/******/  }\n/******/\n/******/\n/******/  // expose the modules object (__webpack_modules__)\n/******/  __w_pdfjs_require__.m = modules;\n/******/\n/******/  // expose the module cache\n/******/  __w_pdfjs_require__.c = installedModules;\n/******/\n/******/  // identity function for calling harmony imports with the correct context\n/******/  __w_pdfjs_require__.i = function(value) { return value; };\n/******/\n/******/  // define getter function for harmony exports\n/******/  __w_pdfjs_require__.d = function(exports, name, getter) {\n/******/    if(!__w_pdfjs_require__.o(exports, name)) {\n/******/      Object.defineProperty(exports, name, {\n/******/        configurable: false,\n/******/        enumerable: true,\n/******/        get: getter\n/******/      });\n/******/    }\n/******/  };\n/******/\n/******/  // getDefaultExport function for compatibility with non-harmony modules\n/******/  __w_pdfjs_require__.n = function(module) {\n/******/    var getter = module && module.__esModule ?\n/******/      function getDefault() { return module['default']; } :\n/******/      function getModuleExports() { return module; };\n/******/    __w_pdfjs_require__.d(getter, 'a', getter);\n/******/    return getter;\n/******/  };\n/******/\n/******/  // Object.prototype.hasOwnProperty.call\n/******/  __w_pdfjs_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/  // __webpack_public_path__\n/******/  __w_pdfjs_require__.p = \"\";\n/******/\n/******/  // Load entry module and return exports\n/******/  return __w_pdfjs_require__(__w_pdfjs_require__.s = 7);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _require = __w_pdfjs_require__(1),\n    assert = _require.assert;\n\nfunction IsPropertyKey(argument) {\n  return typeof argument === 'string' || (typeof argument === 'undefined' ? 'undefined' : _typeof(argument)) === 'symbol';\n}\n\nexports.typeIsObject = function (x) {\n  return (typeof x === 'undefined' ? 'undefined' : _typeof(x)) === 'object' && x !== null || typeof x === 'function';\n};\n\nexports.createDataProperty = function (o, p, v) {\n  assert(exports.typeIsObject(o));\n  Object.defineProperty(o, p, { value: v, writable: true, enumerable: true, configurable: true });\n};\n\nexports.createArrayFromList = function (elements) {\n  // We use arrays to represent lists, so this is basically a no-op.\n  // Do a slice though just in case we happen to depend on the unique-ness.\n  return elements.slice();\n};\n\nexports.ArrayBufferCopy = function (dest, destOffset, src, srcOffset, n) {\n  new Uint8Array(dest).set(new Uint8Array(src, srcOffset, n), destOffset);\n};\n\nexports.CreateIterResultObject = function (value, done) {\n  assert(typeof done === 'boolean');\n  var obj = {};\n  Object.defineProperty(obj, 'value', { value: value, enumerable: true, writable: true, configurable: true });\n  Object.defineProperty(obj, 'done', { value: done, enumerable: true, writable: true, configurable: true });\n  return obj;\n};\n\nexports.IsFiniteNonNegativeNumber = function (v) {\n  if (Number.isNaN(v)) {\n    return false;\n  }\n  if (v === Infinity) {\n    return false;\n  }\n  if (v < 0) {\n    return false;\n  }\n\n  return true;\n};\n\nfunction Call(F, V, args) {\n  if (typeof F !== 'function') {\n    throw new TypeError('Argument is not a function');\n  }\n\n  return Function.prototype.apply.call(F, V, args);\n}\n\nexports.InvokeOrNoop = function (O, P, args) {\n  assert(O !== undefined);\n  assert(IsPropertyKey(P));\n  assert(Array.isArray(args));\n\n  var method = O[P];\n  if (method === undefined) {\n    return undefined;\n  }\n\n  return Call(method, O, args);\n};\n\nexports.PromiseInvokeOrNoop = function (O, P, args) {\n  assert(O !== undefined);\n  assert(IsPropertyKey(P));\n  assert(Array.isArray(args));\n  try {\n    return Promise.resolve(exports.InvokeOrNoop(O, P, args));\n  } catch (returnValueE) {\n    return Promise.reject(returnValueE);\n  }\n};\n\nexports.PromiseInvokeOrPerformFallback = function (O, P, args, F, argsF) {\n  assert(O !== undefined);\n  assert(IsPropertyKey(P));\n  assert(Array.isArray(args));\n  assert(Array.isArray(argsF));\n\n  var method = void 0;\n  try {\n    method = O[P];\n  } catch (methodE) {\n    return Promise.reject(methodE);\n  }\n\n  if (method === undefined) {\n    return F.apply(null, argsF);\n  }\n\n  try {\n    return Promise.resolve(Call(method, O, args));\n  } catch (e) {\n    return Promise.reject(e);\n  }\n};\n\n// Not implemented correctly\nexports.TransferArrayBuffer = function (O) {\n  return O.slice();\n};\n\nexports.ValidateAndNormalizeHighWaterMark = function (highWaterMark) {\n  highWaterMark = Number(highWaterMark);\n  if (Number.isNaN(highWaterMark) || highWaterMark < 0) {\n    throw new RangeError('highWaterMark property of a queuing strategy must be non-negative and non-NaN');\n  }\n\n  return highWaterMark;\n};\n\nexports.ValidateAndNormalizeQueuingStrategy = function (size, highWaterMark) {\n  if (size !== undefined && typeof size !== 'function') {\n    throw new TypeError('size property of a queuing strategy must be a function');\n  }\n\n  highWaterMark = exports.ValidateAndNormalizeHighWaterMark(highWaterMark);\n\n  return { size: size, highWaterMark: highWaterMark };\n};\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nfunction rethrowAssertionErrorRejection(e) {\n  // Used throughout the reference implementation, as `.catch(rethrowAssertionErrorRejection)`, to ensure any errors\n  // get shown. There are places in the spec where we do promise transformations and purposefully ignore or don't\n  // expect any errors, but assertion errors are always problematic.\n  if (e && e.constructor === AssertionError) {\n    setTimeout(function () {\n      throw e;\n    }, 0);\n  }\n};\n\nfunction AssertionError(message) {\n  this.name = 'AssertionError';\n  this.message = message || '';\n  this.stack = new Error().stack;\n}\nAssertionError.prototype = Object.create(Error.prototype);\nAssertionError.prototype.constructor = AssertionError;\n\nfunction assert(value, message) {\n  if (!value) {\n    throw new AssertionError(message);\n  }\n}\n\nmodule.exports = {\n  rethrowAssertionErrorRejection: rethrowAssertionErrorRejection,\n  AssertionError: AssertionError,\n  assert: assert\n};\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar _require = __w_pdfjs_require__(0),\n    InvokeOrNoop = _require.InvokeOrNoop,\n    PromiseInvokeOrNoop = _require.PromiseInvokeOrNoop,\n    ValidateAndNormalizeQueuingStrategy = _require.ValidateAndNormalizeQueuingStrategy,\n    typeIsObject = _require.typeIsObject;\n\nvar _require2 = __w_pdfjs_require__(1),\n    assert = _require2.assert,\n    rethrowAssertionErrorRejection = _require2.rethrowAssertionErrorRejection;\n\nvar _require3 = __w_pdfjs_require__(3),\n    DequeueValue = _require3.DequeueValue,\n    EnqueueValueWithSize = _require3.EnqueueValueWithSize,\n    PeekQueueValue = _require3.PeekQueueValue,\n    ResetQueue = _require3.ResetQueue;\n\nvar WritableStream = function () {\n  function WritableStream() {\n    var underlyingSink = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n    var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n        size = _ref.size,\n        _ref$highWaterMark = _ref.highWaterMark,\n        highWaterMark = _ref$highWaterMark === undefined ? 1 : _ref$highWaterMark;\n\n    _classCallCheck(this, WritableStream);\n\n    this._state = 'writable';\n\n    // The error that will be reported by new method calls once the state becomes errored. Only set when [[state]] is\n    // 'erroring' or 'errored'. May be set to an undefined value.\n    this._storedError = undefined;\n\n    this._writer = undefined;\n\n    // Initialize to undefined first because the constructor of the controller checks this\n    // variable to validate the caller.\n    this._writableStreamController = undefined;\n\n    // This queue is placed here instead of the writer class in order to allow for passing a writer to the next data\n    // producer without waiting for the queued writes to finish.\n    this._writeRequests = [];\n\n    // Write requests are removed from _writeRequests when write() is called on the underlying sink. This prevents\n    // them from being erroneously rejected on error. If a write() call is in-flight, the request is stored here.\n    this._inFlightWriteRequest = undefined;\n\n    // The promise that was returned from writer.close(). Stored here because it may be fulfilled after the writer\n    // has been detached.\n    this._closeRequest = undefined;\n\n    // Close request is removed from _closeRequest when close() is called on the underlying sink. This prevents it\n    // from being erroneously rejected on error. If a close() call is in-flight, the request is stored here.\n    this._inFlightCloseRequest = undefined;\n\n    // The promise that was returned from writer.abort(). This may also be fulfilled after the writer has detached.\n    this._pendingAbortRequest = undefined;\n\n    // The backpressure signal set by the controller.\n    this._backpressure = false;\n\n    var type = underlyingSink.type;\n\n    if (type !== undefined) {\n      throw new RangeError('Invalid type is specified');\n    }\n\n    this._writableStreamController = new WritableStreamDefaultController(this, underlyingSink, size, highWaterMark);\n    this._writableStreamController.__startSteps();\n  }\n\n  _createClass(WritableStream, [{\n    key: 'abort',\n    value: function abort(reason) {\n      if (IsWritableStream(this) === false) {\n        return Promise.reject(streamBrandCheckException('abort'));\n      }\n\n      if (IsWritableStreamLocked(this) === true) {\n        return Promise.reject(new TypeError('Cannot abort a stream that already has a writer'));\n      }\n\n      return WritableStreamAbort(this, reason);\n    }\n  }, {\n    key: 'getWriter',\n    value: function getWriter() {\n      if (IsWritableStream(this) === false) {\n        throw streamBrandCheckException('getWriter');\n      }\n\n      return AcquireWritableStreamDefaultWriter(this);\n    }\n  }, {\n    key: 'locked',\n    get: function get() {\n      if (IsWritableStream(this) === false) {\n        throw streamBrandCheckException('locked');\n      }\n\n      return IsWritableStreamLocked(this);\n    }\n  }]);\n\n  return WritableStream;\n}();\n\nmodule.exports = {\n  AcquireWritableStreamDefaultWriter: AcquireWritableStreamDefaultWriter,\n  IsWritableStream: IsWritableStream,\n  IsWritableStreamLocked: IsWritableStreamLocked,\n  WritableStream: WritableStream,\n  WritableStreamAbort: WritableStreamAbort,\n  WritableStreamDefaultControllerError: WritableStreamDefaultControllerError,\n  WritableStreamDefaultWriterCloseWithErrorPropagation: WritableStreamDefaultWriterCloseWithErrorPropagation,\n  WritableStreamDefaultWriterRelease: WritableStreamDefaultWriterRelease,\n  WritableStreamDefaultWriterWrite: WritableStreamDefaultWriterWrite,\n  WritableStreamCloseQueuedOrInFlight: WritableStreamCloseQueuedOrInFlight\n};\n\n// Abstract operations for the WritableStream.\n\nfunction AcquireWritableStreamDefaultWriter(stream) {\n  return new WritableStreamDefaultWriter(stream);\n}\n\nfunction IsWritableStream(x) {\n  if (!typeIsObject(x)) {\n    return false;\n  }\n\n  if (!Object.prototype.hasOwnProperty.call(x, '_writableStreamController')) {\n    return false;\n  }\n\n  return true;\n}\n\nfunction IsWritableStreamLocked(stream) {\n  assert(IsWritableStream(stream) === true, 'IsWritableStreamLocked should only be used on known writable streams');\n\n  if (stream._writer === undefined) {\n    return false;\n  }\n\n  return true;\n}\n\nfunction WritableStreamAbort(stream, reason) {\n  var state = stream._state;\n  if (state === 'closed') {\n    return Promise.resolve(undefined);\n  }\n  if (state === 'errored') {\n    return Promise.reject(stream._storedError);\n  }\n  var error = new TypeError('Requested to abort');\n  if (stream._pendingAbortRequest !== undefined) {\n    return Promise.reject(error);\n  }\n\n  assert(state === 'writable' || state === 'erroring', 'state must be writable or erroring');\n\n  var wasAlreadyErroring = false;\n  if (state === 'erroring') {\n    wasAlreadyErroring = true;\n    // reason will not be used, so don't keep a reference to it.\n    reason = undefined;\n  }\n\n  var promise = new Promise(function (resolve, reject) {\n    stream._pendingAbortRequest = {\n      _resolve: resolve,\n      _reject: reject,\n      _reason: reason,\n      _wasAlreadyErroring: wasAlreadyErroring\n    };\n  });\n\n  if (wasAlreadyErroring === false) {\n    WritableStreamStartErroring(stream, error);\n  }\n\n  return promise;\n}\n\n// WritableStream API exposed for controllers.\n\nfunction WritableStreamAddWriteRequest(stream) {\n  assert(IsWritableStreamLocked(stream) === true);\n  assert(stream._state === 'writable');\n\n  var promise = new Promise(function (resolve, reject) {\n    var writeRequest = {\n      _resolve: resolve,\n      _reject: reject\n    };\n\n    stream._writeRequests.push(writeRequest);\n  });\n\n  return promise;\n}\n\nfunction WritableStreamDealWithRejection(stream, error) {\n  var state = stream._state;\n\n  if (state === 'writable') {\n    WritableStreamStartErroring(stream, error);\n    return;\n  }\n\n  assert(state === 'erroring');\n  WritableStreamFinishErroring(stream);\n}\n\nfunction WritableStreamStartErroring(stream, reason) {\n  assert(stream._storedError === undefined, 'stream._storedError === undefined');\n  assert(stream._state === 'writable', 'state must be writable');\n\n  var controller = stream._writableStreamController;\n  assert(controller !== undefined, 'controller must not be undefined');\n\n  stream._state = 'erroring';\n  stream._storedError = reason;\n  var writer = stream._writer;\n  if (writer !== undefined) {\n    WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, reason);\n  }\n\n  if (WritableStreamHasOperationMarkedInFlight(stream) === false && controller._started === true) {\n    WritableStreamFinishErroring(stream);\n  }\n}\n\nfunction WritableStreamFinishErroring(stream) {\n  assert(stream._state === 'erroring', 'stream._state === erroring');\n  assert(WritableStreamHasOperationMarkedInFlight(stream) === false, 'WritableStreamHasOperationMarkedInFlight(stream) === false');\n  stream._state = 'errored';\n  stream._writableStreamController.__errorSteps();\n\n  var storedError = stream._storedError;\n  for (var i = 0; i < stream._writeRequests.length; i++) {\n    var writeRequest = stream._writeRequests[i];\n    writeRequest._reject(storedError);\n  }\n  stream._writeRequests = [];\n\n  if (stream._pendingAbortRequest === undefined) {\n    WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);\n    return;\n  }\n\n  var abortRequest = stream._pendingAbortRequest;\n  stream._pendingAbortRequest = undefined;\n\n  if (abortRequest._wasAlreadyErroring === true) {\n    abortRequest._reject(storedError);\n    WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);\n    return;\n  }\n\n  var promise = stream._writableStreamController.__abortSteps(abortRequest._reason);\n  promise.then(function () {\n    abortRequest._resolve();\n    WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);\n  }, function (reason) {\n    abortRequest._reject(reason);\n    WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);\n  });\n}\n\nfunction WritableStreamFinishInFlightWrite(stream) {\n  assert(stream._inFlightWriteRequest !== undefined);\n  stream._inFlightWriteRequest._resolve(undefined);\n  stream._inFlightWriteRequest = undefined;\n}\n\nfunction WritableStreamFinishInFlightWriteWithError(stream, error) {\n  assert(stream._inFlightWriteRequest !== undefined);\n  stream._inFlightWriteRequest._reject(error);\n  stream._inFlightWriteRequest = undefined;\n\n  assert(stream._state === 'writable' || stream._state === 'erroring');\n\n  WritableStreamDealWithRejection(stream, error);\n}\n\nfunction WritableStreamFinishInFlightClose(stream) {\n  assert(stream._inFlightCloseRequest !== undefined);\n  stream._inFlightCloseRequest._resolve(undefined);\n  stream._inFlightCloseRequest = undefined;\n\n  var state = stream._state;\n\n  assert(state === 'writable' || state === 'erroring');\n\n  if (state === 'erroring') {\n    // The error was too late to do anything, so it is ignored.\n    stream._storedError = undefined;\n    if (stream._pendingAbortRequest !== undefined) {\n      stream._pendingAbortRequest._resolve();\n      stream._pendingAbortRequest = undefined;\n    }\n  }\n\n  stream._state = 'closed';\n\n  var writer = stream._writer;\n  if (writer !== undefined) {\n    defaultWriterClosedPromiseResolve(writer);\n  }\n\n  assert(stream._pendingAbortRequest === undefined, 'stream._pendingAbortRequest === undefined');\n  assert(stream._storedError === undefined, 'stream._storedError === undefined');\n}\n\nfunction WritableStreamFinishInFlightCloseWithError(stream, error) {\n  assert(stream._inFlightCloseRequest !== undefined);\n  stream._inFlightCloseRequest._reject(error);\n  stream._inFlightCloseRequest = undefined;\n\n  assert(stream._state === 'writable' || stream._state === 'erroring');\n\n  // Never execute sink abort() after sink close().\n  if (stream._pendingAbortRequest !== undefined) {\n    stream._pendingAbortRequest._reject(error);\n    stream._pendingAbortRequest = undefined;\n  }\n  WritableStreamDealWithRejection(stream, error);\n}\n\n// TODO(ricea): Fix alphabetical order.\nfunction WritableStreamCloseQueuedOrInFlight(stream) {\n  if (stream._closeRequest === undefined && stream._inFlightCloseRequest === undefined) {\n    return false;\n  }\n\n  return true;\n}\n\nfunction WritableStreamHasOperationMarkedInFlight(stream) {\n  if (stream._inFlightWriteRequest === undefined && stream._inFlightCloseRequest === undefined) {\n    return false;\n  }\n\n  return true;\n}\n\nfunction WritableStreamMarkCloseRequestInFlight(stream) {\n  assert(stream._inFlightCloseRequest === undefined);\n  assert(stream._closeRequest !== undefined);\n  stream._inFlightCloseRequest = stream._closeRequest;\n  stream._closeRequest = undefined;\n}\n\nfunction WritableStreamMarkFirstWriteRequestInFlight(stream) {\n  assert(stream._inFlightWriteRequest === undefined, 'there must be no pending write request');\n  assert(stream._writeRequests.length !== 0, 'writeRequests must not be empty');\n  stream._inFlightWriteRequest = stream._writeRequests.shift();\n}\n\nfunction WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream) {\n  assert(stream._state === 'errored', '_stream_.[[state]] is `\"errored\"`');\n  if (stream._closeRequest !== undefined) {\n    assert(stream._inFlightCloseRequest === undefined);\n\n    stream._closeRequest._reject(stream._storedError);\n    stream._closeRequest = undefined;\n  }\n  var writer = stream._writer;\n  if (writer !== undefined) {\n    defaultWriterClosedPromiseReject(writer, stream._storedError);\n    writer._closedPromise.catch(function () {});\n  }\n}\n\nfunction WritableStreamUpdateBackpressure(stream, backpressure) {\n  assert(stream._state === 'writable');\n  assert(WritableStreamCloseQueuedOrInFlight(stream) === false);\n\n  var writer = stream._writer;\n  if (writer !== undefined && backpressure !== stream._backpressure) {\n    if (backpressure === true) {\n      defaultWriterReadyPromiseReset(writer);\n    } else {\n      assert(backpressure === false);\n\n      defaultWriterReadyPromiseResolve(writer);\n    }\n  }\n\n  stream._backpressure = backpressure;\n}\n\nvar WritableStreamDefaultWriter = function () {\n  function WritableStreamDefaultWriter(stream) {\n    _classCallCheck(this, WritableStreamDefaultWriter);\n\n    if (IsWritableStream(stream) === false) {\n      throw new TypeError('WritableStreamDefaultWriter can only be constructed with a WritableStream instance');\n    }\n    if (IsWritableStreamLocked(stream) === true) {\n      throw new TypeError('This stream has already been locked for exclusive writing by another writer');\n    }\n\n    this._ownerWritableStream = stream;\n    stream._writer = this;\n\n    var state = stream._state;\n\n    if (state === 'writable') {\n      if (WritableStreamCloseQueuedOrInFlight(stream) === false && stream._backpressure === true) {\n        defaultWriterReadyPromiseInitialize(this);\n      } else {\n        defaultWriterReadyPromiseInitializeAsResolved(this);\n      }\n\n      defaultWriterClosedPromiseInitialize(this);\n    } else if (state === 'erroring') {\n      defaultWriterReadyPromiseInitializeAsRejected(this, stream._storedError);\n      this._readyPromise.catch(function () {});\n      defaultWriterClosedPromiseInitialize(this);\n    } else if (state === 'closed') {\n      defaultWriterReadyPromiseInitializeAsResolved(this);\n      defaultWriterClosedPromiseInitializeAsResolved(this);\n    } else {\n      assert(state === 'errored', 'state must be errored');\n\n      var storedError = stream._storedError;\n      defaultWriterReadyPromiseInitializeAsRejected(this, storedError);\n      this._readyPromise.catch(function () {});\n      defaultWriterClosedPromiseInitializeAsRejected(this, storedError);\n      this._closedPromise.catch(function () {});\n    }\n  }\n\n  _createClass(WritableStreamDefaultWriter, [{\n    key: 'abort',\n    value: function abort(reason) {\n      if (IsWritableStreamDefaultWriter(this) === false) {\n        return Promise.reject(defaultWriterBrandCheckException('abort'));\n      }\n\n      if (this._ownerWritableStream === undefined) {\n        return Promise.reject(defaultWriterLockException('abort'));\n      }\n\n      return WritableStreamDefaultWriterAbort(this, reason);\n    }\n  }, {\n    key: 'close',\n    value: function close() {\n      if (IsWritableStreamDefaultWriter(this) === false) {\n        return Promise.reject(defaultWriterBrandCheckException('close'));\n      }\n\n      var stream = this._ownerWritableStream;\n\n      if (stream === undefined) {\n        return Promise.reject(defaultWriterLockException('close'));\n      }\n\n      if (WritableStreamCloseQueuedOrInFlight(stream) === true) {\n        return Promise.reject(new TypeError('cannot close an already-closing stream'));\n      }\n\n      return WritableStreamDefaultWriterClose(this);\n    }\n  }, {\n    key: 'releaseLock',\n    value: function releaseLock() {\n      if (IsWritableStreamDefaultWriter(this) === false) {\n        throw defaultWriterBrandCheckException('releaseLock');\n      }\n\n      var stream = this._ownerWritableStream;\n\n      if (stream === undefined) {\n        return;\n      }\n\n      assert(stream._writer !== undefined);\n\n      WritableStreamDefaultWriterRelease(this);\n    }\n  }, {\n    key: 'write',\n    value: function write(chunk) {\n      if (IsWritableStreamDefaultWriter(this) === false) {\n        return Promise.reject(defaultWriterBrandCheckException('write'));\n      }\n\n      if (this._ownerWritableStream === undefined) {\n        return Promise.reject(defaultWriterLockException('write to'));\n      }\n\n      return WritableStreamDefaultWriterWrite(this, chunk);\n    }\n  }, {\n    key: 'closed',\n    get: function get() {\n      if (IsWritableStreamDefaultWriter(this) === false) {\n        return Promise.reject(defaultWriterBrandCheckException('closed'));\n      }\n\n      return this._closedPromise;\n    }\n  }, {\n    key: 'desiredSize',\n    get: function get() {\n      if (IsWritableStreamDefaultWriter(this) === false) {\n        throw defaultWriterBrandCheckException('desiredSize');\n      }\n\n      if (this._ownerWritableStream === undefined) {\n        throw defaultWriterLockException('desiredSize');\n      }\n\n      return WritableStreamDefaultWriterGetDesiredSize(this);\n    }\n  }, {\n    key: 'ready',\n    get: function get() {\n      if (IsWritableStreamDefaultWriter(this) === false) {\n        return Promise.reject(defaultWriterBrandCheckException('ready'));\n      }\n\n      return this._readyPromise;\n    }\n  }]);\n\n  return WritableStreamDefaultWriter;\n}();\n\n// Abstract operations for the WritableStreamDefaultWriter.\n\nfunction IsWritableStreamDefaultWriter(x) {\n  if (!typeIsObject(x)) {\n    return false;\n  }\n\n  if (!Object.prototype.hasOwnProperty.call(x, '_ownerWritableStream')) {\n    return false;\n  }\n\n  return true;\n}\n\n// A client of WritableStreamDefaultWriter may use these functions directly to bypass state check.\n\nfunction WritableStreamDefaultWriterAbort(writer, reason) {\n  var stream = writer._ownerWritableStream;\n\n  assert(stream !== undefined);\n\n  return WritableStreamAbort(stream, reason);\n}\n\nfunction WritableStreamDefaultWriterClose(writer) {\n  var stream = writer._ownerWritableStream;\n\n  assert(stream !== undefined);\n\n  var state = stream._state;\n  if (state === 'closed' || state === 'errored') {\n    return Promise.reject(new TypeError('The stream (in ' + state + ' state) is not in the writable state and cannot be closed'));\n  }\n\n  assert(state === 'writable' || state === 'erroring');\n  assert(WritableStreamCloseQueuedOrInFlight(stream) === false);\n\n  var promise = new Promise(function (resolve, reject) {\n    var closeRequest = {\n      _resolve: resolve,\n      _reject: reject\n    };\n\n    stream._closeRequest = closeRequest;\n  });\n\n  if (stream._backpressure === true && state === 'writable') {\n    defaultWriterReadyPromiseResolve(writer);\n  }\n\n  WritableStreamDefaultControllerClose(stream._writableStreamController);\n\n  return promise;\n}\n\nfunction WritableStreamDefaultWriterCloseWithErrorPropagation(writer) {\n  var stream = writer._ownerWritableStream;\n\n  assert(stream !== undefined);\n\n  var state = stream._state;\n  if (WritableStreamCloseQueuedOrInFlight(stream) === true || state === 'closed') {\n    return Promise.resolve();\n  }\n\n  if (state === 'errored') {\n    return Promise.reject(stream._storedError);\n  }\n\n  assert(state === 'writable' || state === 'erroring');\n\n  return WritableStreamDefaultWriterClose(writer);\n}\n\nfunction WritableStreamDefaultWriterEnsureClosedPromiseRejected(writer, error) {\n  if (writer._closedPromiseState === 'pending') {\n    defaultWriterClosedPromiseReject(writer, error);\n  } else {\n    defaultWriterClosedPromiseResetToRejected(writer, error);\n  }\n  writer._closedPromise.catch(function () {});\n}\n\nfunction WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, error) {\n  if (writer._readyPromiseState === 'pending') {\n    defaultWriterReadyPromiseReject(writer, error);\n  } else {\n    defaultWriterReadyPromiseResetToRejected(writer, error);\n  }\n  writer._readyPromise.catch(function () {});\n}\n\nfunction WritableStreamDefaultWriterGetDesiredSize(writer) {\n  var stream = writer._ownerWritableStream;\n  var state = stream._state;\n\n  if (state === 'errored' || state === 'erroring') {\n    return null;\n  }\n\n  if (state === 'closed') {\n    return 0;\n  }\n\n  return WritableStreamDefaultControllerGetDesiredSize(stream._writableStreamController);\n}\n\nfunction WritableStreamDefaultWriterRelease(writer) {\n  var stream = writer._ownerWritableStream;\n  assert(stream !== undefined);\n  assert(stream._writer === writer);\n\n  var releasedError = new TypeError('Writer was released and can no longer be used to monitor the stream\\'s closedness');\n\n  WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, releasedError);\n\n  // The state transitions to \"errored\" before the sink abort() method runs, but the writer.closed promise is not\n  // rejected until afterwards. This means that simply testing state will not work.\n  WritableStreamDefaultWriterEnsureClosedPromiseRejected(writer, releasedError);\n\n  stream._writer = undefined;\n  writer._ownerWritableStream = undefined;\n}\n\nfunction WritableStreamDefaultWriterWrite(writer, chunk) {\n  var stream = writer._ownerWritableStream;\n\n  assert(stream !== undefined);\n\n  var controller = stream._writableStreamController;\n\n  var chunkSize = WritableStreamDefaultControllerGetChunkSize(controller, chunk);\n\n  if (stream !== writer._ownerWritableStream) {\n    return Promise.reject(defaultWriterLockException('write to'));\n  }\n\n  var state = stream._state;\n  if (state === 'errored') {\n    return Promise.reject(stream._storedError);\n  }\n  if (WritableStreamCloseQueuedOrInFlight(stream) === true || state === 'closed') {\n    return Promise.reject(new TypeError('The stream is closing or closed and cannot be written to'));\n  }\n  if (state === 'erroring') {\n    return Promise.reject(stream._storedError);\n  }\n\n  assert(state === 'writable');\n\n  var promise = WritableStreamAddWriteRequest(stream);\n\n  WritableStreamDefaultControllerWrite(controller, chunk, chunkSize);\n\n  return promise;\n}\n\nvar WritableStreamDefaultController = function () {\n  function WritableStreamDefaultController(stream, underlyingSink, size, highWaterMark) {\n    _classCallCheck(this, WritableStreamDefaultController);\n\n    if (IsWritableStream(stream) === false) {\n      throw new TypeError('WritableStreamDefaultController can only be constructed with a WritableStream instance');\n    }\n\n    if (stream._writableStreamController !== undefined) {\n      throw new TypeError('WritableStreamDefaultController instances can only be created by the WritableStream constructor');\n    }\n\n    this._controlledWritableStream = stream;\n\n    this._underlyingSink = underlyingSink;\n\n    // Need to set the slots so that the assert doesn't fire. In the spec the slots already exist implicitly.\n    this._queue = undefined;\n    this._queueTotalSize = undefined;\n    ResetQueue(this);\n\n    this._started = false;\n\n    var normalizedStrategy = ValidateAndNormalizeQueuingStrategy(size, highWaterMark);\n    this._strategySize = normalizedStrategy.size;\n    this._strategyHWM = normalizedStrategy.highWaterMark;\n\n    var backpressure = WritableStreamDefaultControllerGetBackpressure(this);\n    WritableStreamUpdateBackpressure(stream, backpressure);\n  }\n\n  _createClass(WritableStreamDefaultController, [{\n    key: 'error',\n    value: function error(e) {\n      if (IsWritableStreamDefaultController(this) === false) {\n        throw new TypeError('WritableStreamDefaultController.prototype.error can only be used on a WritableStreamDefaultController');\n      }\n      var state = this._controlledWritableStream._state;\n      if (state !== 'writable') {\n        // The stream is closed, errored or will be soon. The sink can't do anything useful if it gets an error here, so\n        // just treat it as a no-op.\n        return;\n      }\n\n      WritableStreamDefaultControllerError(this, e);\n    }\n  }, {\n    key: '__abortSteps',\n    value: function __abortSteps(reason) {\n      return PromiseInvokeOrNoop(this._underlyingSink, 'abort', [reason]);\n    }\n  }, {\n    key: '__errorSteps',\n    value: function __errorSteps() {\n      ResetQueue(this);\n    }\n  }, {\n    key: '__startSteps',\n    value: function __startSteps() {\n      var _this = this;\n\n      var startResult = InvokeOrNoop(this._underlyingSink, 'start', [this]);\n      var stream = this._controlledWritableStream;\n\n      Promise.resolve(startResult).then(function () {\n        assert(stream._state === 'writable' || stream._state === 'erroring');\n        _this._started = true;\n        WritableStreamDefaultControllerAdvanceQueueIfNeeded(_this);\n      }, function (r) {\n        assert(stream._state === 'writable' || stream._state === 'erroring');\n        _this._started = true;\n        WritableStreamDealWithRejection(stream, r);\n      }).catch(rethrowAssertionErrorRejection);\n    }\n  }]);\n\n  return WritableStreamDefaultController;\n}();\n\n// Abstract operations implementing interface required by the WritableStream.\n\nfunction WritableStreamDefaultControllerClose(controller) {\n  EnqueueValueWithSize(controller, 'close', 0);\n  WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller);\n}\n\nfunction WritableStreamDefaultControllerGetChunkSize(controller, chunk) {\n  var strategySize = controller._strategySize;\n\n  if (strategySize === undefined) {\n    return 1;\n  }\n\n  try {\n    return strategySize(chunk);\n  } catch (chunkSizeE) {\n    WritableStreamDefaultControllerErrorIfNeeded(controller, chunkSizeE);\n    return 1;\n  }\n}\n\nfunction WritableStreamDefaultControllerGetDesiredSize(controller) {\n  return controller._strategyHWM - controller._queueTotalSize;\n}\n\nfunction WritableStreamDefaultControllerWrite(controller, chunk, chunkSize) {\n  var writeRecord = { chunk: chunk };\n\n  try {\n    EnqueueValueWithSize(controller, writeRecord, chunkSize);\n  } catch (enqueueE) {\n    WritableStreamDefaultControllerErrorIfNeeded(controller, enqueueE);\n    return;\n  }\n\n  var stream = controller._controlledWritableStream;\n  if (WritableStreamCloseQueuedOrInFlight(stream) === false && stream._state === 'writable') {\n    var backpressure = WritableStreamDefaultControllerGetBackpressure(controller);\n    WritableStreamUpdateBackpressure(stream, backpressure);\n  }\n\n  WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller);\n}\n\n// Abstract operations for the WritableStreamDefaultController.\n\nfunction IsWritableStreamDefaultController(x) {\n  if (!typeIsObject(x)) {\n    return false;\n  }\n\n  if (!Object.prototype.hasOwnProperty.call(x, '_underlyingSink')) {\n    return false;\n  }\n\n  return true;\n}\n\nfunction WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller) {\n  var stream = controller._controlledWritableStream;\n\n  if (controller._started === false) {\n    return;\n  }\n\n  if (stream._inFlightWriteRequest !== undefined) {\n    return;\n  }\n\n  var state = stream._state;\n  if (state === 'closed' || state === 'errored') {\n    return;\n  }\n  if (state === 'erroring') {\n    WritableStreamFinishErroring(stream);\n    return;\n  }\n\n  if (controller._queue.length === 0) {\n    return;\n  }\n\n  var writeRecord = PeekQueueValue(controller);\n  if (writeRecord === 'close') {\n    WritableStreamDefaultControllerProcessClose(controller);\n  } else {\n    WritableStreamDefaultControllerProcessWrite(controller, writeRecord.chunk);\n  }\n}\n\nfunction WritableStreamDefaultControllerErrorIfNeeded(controller, error) {\n  if (controller._controlledWritableStream._state === 'writable') {\n    WritableStreamDefaultControllerError(controller, error);\n  }\n}\n\nfunction WritableStreamDefaultControllerProcessClose(controller) {\n  var stream = controller._controlledWritableStream;\n\n  WritableStreamMarkCloseRequestInFlight(stream);\n\n  DequeueValue(controller);\n  assert(controller._queue.length === 0, 'queue must be empty once the final write record is dequeued');\n\n  var sinkClosePromise = PromiseInvokeOrNoop(controller._underlyingSink, 'close', []);\n  sinkClosePromise.then(function () {\n    WritableStreamFinishInFlightClose(stream);\n  }, function (reason) {\n    WritableStreamFinishInFlightCloseWithError(stream, reason);\n  }).catch(rethrowAssertionErrorRejection);\n}\n\nfunction WritableStreamDefaultControllerProcessWrite(controller, chunk) {\n  var stream = controller._controlledWritableStream;\n\n  WritableStreamMarkFirstWriteRequestInFlight(stream);\n\n  var sinkWritePromise = PromiseInvokeOrNoop(controller._underlyingSink, 'write', [chunk, controller]);\n  sinkWritePromise.then(function () {\n    WritableStreamFinishInFlightWrite(stream);\n\n    var state = stream._state;\n    assert(state === 'writable' || state === 'erroring');\n\n    DequeueValue(controller);\n\n    if (WritableStreamCloseQueuedOrInFlight(stream) === false && state === 'writable') {\n      var backpressure = WritableStreamDefaultControllerGetBackpressure(controller);\n      WritableStreamUpdateBackpressure(stream, backpressure);\n    }\n\n    WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller);\n  }, function (reason) {\n    WritableStreamFinishInFlightWriteWithError(stream, reason);\n  }).catch(rethrowAssertionErrorRejection);\n}\n\nfunction WritableStreamDefaultControllerGetBackpressure(controller) {\n  var desiredSize = WritableStreamDefaultControllerGetDesiredSize(controller);\n  return desiredSize <= 0;\n}\n\n// A client of WritableStreamDefaultController may use these functions directly to bypass state check.\n\nfunction WritableStreamDefaultControllerError(controller, error) {\n  var stream = controller._controlledWritableStream;\n\n  assert(stream._state === 'writable');\n\n  WritableStreamStartErroring(stream, error);\n}\n\n// Helper functions for the WritableStream.\n\nfunction streamBrandCheckException(name) {\n  return new TypeError('WritableStream.prototype.' + name + ' can only be used on a WritableStream');\n}\n\n// Helper functions for the WritableStreamDefaultWriter.\n\nfunction defaultWriterBrandCheckException(name) {\n  return new TypeError('WritableStreamDefaultWriter.prototype.' + name + ' can only be used on a WritableStreamDefaultWriter');\n}\n\nfunction defaultWriterLockException(name) {\n  return new TypeError('Cannot ' + name + ' a stream using a released writer');\n}\n\nfunction defaultWriterClosedPromiseInitialize(writer) {\n  writer._closedPromise = new Promise(function (resolve, reject) {\n    writer._closedPromise_resolve = resolve;\n    writer._closedPromise_reject = reject;\n    writer._closedPromiseState = 'pending';\n  });\n}\n\nfunction defaultWriterClosedPromiseInitializeAsRejected(writer, reason) {\n  writer._closedPromise = Promise.reject(reason);\n  writer._closedPromise_resolve = undefined;\n  writer._closedPromise_reject = undefined;\n  writer._closedPromiseState = 'rejected';\n}\n\nfunction defaultWriterClosedPromiseInitializeAsResolved(writer) {\n  writer._closedPromise = Promise.resolve(undefined);\n  writer._closedPromise_resolve = undefined;\n  writer._closedPromise_reject = undefined;\n  writer._closedPromiseState = 'resolved';\n}\n\nfunction defaultWriterClosedPromiseReject(writer, reason) {\n  assert(writer._closedPromise_resolve !== undefined, 'writer._closedPromise_resolve !== undefined');\n  assert(writer._closedPromise_reject !== undefined, 'writer._closedPromise_reject !== undefined');\n  assert(writer._closedPromiseState === 'pending', 'writer._closedPromiseState is pending');\n\n  writer._closedPromise_reject(reason);\n  writer._closedPromise_resolve = undefined;\n  writer._closedPromise_reject = undefined;\n  writer._closedPromiseState = 'rejected';\n}\n\nfunction defaultWriterClosedPromiseResetToRejected(writer, reason) {\n  assert(writer._closedPromise_resolve === undefined, 'writer._closedPromise_resolve === undefined');\n  assert(writer._closedPromise_reject === undefined, 'writer._closedPromise_reject === undefined');\n  assert(writer._closedPromiseState !== 'pending', 'writer._closedPromiseState is not pending');\n\n  writer._closedPromise = Promise.reject(reason);\n  writer._closedPromiseState = 'rejected';\n}\n\nfunction defaultWriterClosedPromiseResolve(writer) {\n  assert(writer._closedPromise_resolve !== undefined, 'writer._closedPromise_resolve !== undefined');\n  assert(writer._closedPromise_reject !== undefined, 'writer._closedPromise_reject !== undefined');\n  assert(writer._closedPromiseState === 'pending', 'writer._closedPromiseState is pending');\n\n  writer._closedPromise_resolve(undefined);\n  writer._closedPromise_resolve = undefined;\n  writer._closedPromise_reject = undefined;\n  writer._closedPromiseState = 'resolved';\n}\n\nfunction defaultWriterReadyPromiseInitialize(writer) {\n  writer._readyPromise = new Promise(function (resolve, reject) {\n    writer._readyPromise_resolve = resolve;\n    writer._readyPromise_reject = reject;\n  });\n  writer._readyPromiseState = 'pending';\n}\n\nfunction defaultWriterReadyPromiseInitializeAsRejected(writer, reason) {\n  writer._readyPromise = Promise.reject(reason);\n  writer._readyPromise_resolve = undefined;\n  writer._readyPromise_reject = undefined;\n  writer._readyPromiseState = 'rejected';\n}\n\nfunction defaultWriterReadyPromiseInitializeAsResolved(writer) {\n  writer._readyPromise = Promise.resolve(undefined);\n  writer._readyPromise_resolve = undefined;\n  writer._readyPromise_reject = undefined;\n  writer._readyPromiseState = 'fulfilled';\n}\n\nfunction defaultWriterReadyPromiseReject(writer, reason) {\n  assert(writer._readyPromise_resolve !== undefined, 'writer._readyPromise_resolve !== undefined');\n  assert(writer._readyPromise_reject !== undefined, 'writer._readyPromise_reject !== undefined');\n\n  writer._readyPromise_reject(reason);\n  writer._readyPromise_resolve = undefined;\n  writer._readyPromise_reject = undefined;\n  writer._readyPromiseState = 'rejected';\n}\n\nfunction defaultWriterReadyPromiseReset(writer) {\n  assert(writer._readyPromise_resolve === undefined, 'writer._readyPromise_resolve === undefined');\n  assert(writer._readyPromise_reject === undefined, 'writer._readyPromise_reject === undefined');\n\n  writer._readyPromise = new Promise(function (resolve, reject) {\n    writer._readyPromise_resolve = resolve;\n    writer._readyPromise_reject = reject;\n  });\n  writer._readyPromiseState = 'pending';\n}\n\nfunction defaultWriterReadyPromiseResetToRejected(writer, reason) {\n  assert(writer._readyPromise_resolve === undefined, 'writer._readyPromise_resolve === undefined');\n  assert(writer._readyPromise_reject === undefined, 'writer._readyPromise_reject === undefined');\n\n  writer._readyPromise = Promise.reject(reason);\n  writer._readyPromiseState = 'rejected';\n}\n\nfunction defaultWriterReadyPromiseResolve(writer) {\n  assert(writer._readyPromise_resolve !== undefined, 'writer._readyPromise_resolve !== undefined');\n  assert(writer._readyPromise_reject !== undefined, 'writer._readyPromise_reject !== undefined');\n\n  writer._readyPromise_resolve(undefined);\n  writer._readyPromise_resolve = undefined;\n  writer._readyPromise_reject = undefined;\n  writer._readyPromiseState = 'fulfilled';\n}\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nvar _require = __w_pdfjs_require__(0),\n    IsFiniteNonNegativeNumber = _require.IsFiniteNonNegativeNumber;\n\nvar _require2 = __w_pdfjs_require__(1),\n    assert = _require2.assert;\n\nexports.DequeueValue = function (container) {\n  assert('_queue' in container && '_queueTotalSize' in container, 'Spec-level failure: DequeueValue should only be used on containers with [[queue]] and [[queueTotalSize]].');\n  assert(container._queue.length > 0, 'Spec-level failure: should never dequeue from an empty queue.');\n\n  var pair = container._queue.shift();\n  container._queueTotalSize -= pair.size;\n  if (container._queueTotalSize < 0) {\n    container._queueTotalSize = 0;\n  }\n\n  return pair.value;\n};\n\nexports.EnqueueValueWithSize = function (container, value, size) {\n  assert('_queue' in container && '_queueTotalSize' in container, 'Spec-level failure: EnqueueValueWithSize should only be used on containers with [[queue]] and ' + '[[queueTotalSize]].');\n\n  size = Number(size);\n  if (!IsFiniteNonNegativeNumber(size)) {\n    throw new RangeError('Size must be a finite, non-NaN, non-negative number.');\n  }\n\n  container._queue.push({ value: value, size: size });\n  container._queueTotalSize += size;\n};\n\nexports.PeekQueueValue = function (container) {\n  assert('_queue' in container && '_queueTotalSize' in container, 'Spec-level failure: PeekQueueValue should only be used on containers with [[queue]] and [[queueTotalSize]].');\n  assert(container._queue.length > 0, 'Spec-level failure: should never peek at an empty queue.');\n\n  var pair = container._queue[0];\n  return pair.value;\n};\n\nexports.ResetQueue = function (container) {\n  assert('_queue' in container && '_queueTotalSize' in container, 'Spec-level failure: ResetQueue should only be used on containers with [[queue]] and [[queueTotalSize]].');\n\n  container._queue = [];\n  container._queueTotalSize = 0;\n};\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar _require = __w_pdfjs_require__(0),\n    ArrayBufferCopy = _require.ArrayBufferCopy,\n    CreateIterResultObject = _require.CreateIterResultObject,\n    IsFiniteNonNegativeNumber = _require.IsFiniteNonNegativeNumber,\n    InvokeOrNoop = _require.InvokeOrNoop,\n    PromiseInvokeOrNoop = _require.PromiseInvokeOrNoop,\n    TransferArrayBuffer = _require.TransferArrayBuffer,\n    ValidateAndNormalizeQueuingStrategy = _require.ValidateAndNormalizeQueuingStrategy,\n    ValidateAndNormalizeHighWaterMark = _require.ValidateAndNormalizeHighWaterMark;\n\nvar _require2 = __w_pdfjs_require__(0),\n    createArrayFromList = _require2.createArrayFromList,\n    createDataProperty = _require2.createDataProperty,\n    typeIsObject = _require2.typeIsObject;\n\nvar _require3 = __w_pdfjs_require__(1),\n    assert = _require3.assert,\n    rethrowAssertionErrorRejection = _require3.rethrowAssertionErrorRejection;\n\nvar _require4 = __w_pdfjs_require__(3),\n    DequeueValue = _require4.DequeueValue,\n    EnqueueValueWithSize = _require4.EnqueueValueWithSize,\n    ResetQueue = _require4.ResetQueue;\n\nvar _require5 = __w_pdfjs_require__(2),\n    AcquireWritableStreamDefaultWriter = _require5.AcquireWritableStreamDefaultWriter,\n    IsWritableStream = _require5.IsWritableStream,\n    IsWritableStreamLocked = _require5.IsWritableStreamLocked,\n    WritableStreamAbort = _require5.WritableStreamAbort,\n    WritableStreamDefaultWriterCloseWithErrorPropagation = _require5.WritableStreamDefaultWriterCloseWithErrorPropagation,\n    WritableStreamDefaultWriterRelease = _require5.WritableStreamDefaultWriterRelease,\n    WritableStreamDefaultWriterWrite = _require5.WritableStreamDefaultWriterWrite,\n    WritableStreamCloseQueuedOrInFlight = _require5.WritableStreamCloseQueuedOrInFlight;\n\nvar ReadableStream = function () {\n  function ReadableStream() {\n    var underlyingSource = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n    var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n        size = _ref.size,\n        highWaterMark = _ref.highWaterMark;\n\n    _classCallCheck(this, ReadableStream);\n\n    // Exposed to controllers.\n    this._state = 'readable';\n\n    this._reader = undefined;\n    this._storedError = undefined;\n\n    this._disturbed = false;\n\n    // Initialize to undefined first because the constructor of the controller checks this\n    // variable to validate the caller.\n    this._readableStreamController = undefined;\n    var type = underlyingSource.type;\n    var typeString = String(type);\n    if (typeString === 'bytes') {\n      if (highWaterMark === undefined) {\n        highWaterMark = 0;\n      }\n      this._readableStreamController = new ReadableByteStreamController(this, underlyingSource, highWaterMark);\n    } else if (type === undefined) {\n      if (highWaterMark === undefined) {\n        highWaterMark = 1;\n      }\n      this._readableStreamController = new ReadableStreamDefaultController(this, underlyingSource, size, highWaterMark);\n    } else {\n      throw new RangeError('Invalid type is specified');\n    }\n  }\n\n  _createClass(ReadableStream, [{\n    key: 'cancel',\n    value: function cancel(reason) {\n      if (IsReadableStream(this) === false) {\n        return Promise.reject(streamBrandCheckException('cancel'));\n      }\n\n      if (IsReadableStreamLocked(this) === true) {\n        return Promise.reject(new TypeError('Cannot cancel a stream that already has a reader'));\n      }\n\n      return ReadableStreamCancel(this, reason);\n    }\n  }, {\n    key: 'getReader',\n    value: function getReader() {\n      var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n          mode = _ref2.mode;\n\n      if (IsReadableStream(this) === false) {\n        throw streamBrandCheckException('getReader');\n      }\n\n      if (mode === undefined) {\n        return AcquireReadableStreamDefaultReader(this);\n      }\n\n      mode = String(mode);\n\n      if (mode === 'byob') {\n        return AcquireReadableStreamBYOBReader(this);\n      }\n\n      throw new RangeError('Invalid mode is specified');\n    }\n  }, {\n    key: 'pipeThrough',\n    value: function pipeThrough(_ref3, options) {\n      var writable = _ref3.writable,\n          readable = _ref3.readable;\n\n      var promise = this.pipeTo(writable, options);\n\n      ifIsObjectAndHasAPromiseIsHandledInternalSlotSetPromiseIsHandledToTrue(promise);\n\n      return readable;\n    }\n  }, {\n    key: 'pipeTo',\n    value: function pipeTo(dest) {\n      var _this = this;\n\n      var _ref4 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n          preventClose = _ref4.preventClose,\n          preventAbort = _ref4.preventAbort,\n          preventCancel = _ref4.preventCancel;\n\n      if (IsReadableStream(this) === false) {\n        return Promise.reject(streamBrandCheckException('pipeTo'));\n      }\n      if (IsWritableStream(dest) === false) {\n        return Promise.reject(new TypeError('ReadableStream.prototype.pipeTo\\'s first argument must be a WritableStream'));\n      }\n\n      preventClose = Boolean(preventClose);\n      preventAbort = Boolean(preventAbort);\n      preventCancel = Boolean(preventCancel);\n\n      if (IsReadableStreamLocked(this) === true) {\n        return Promise.reject(new TypeError('ReadableStream.prototype.pipeTo cannot be used on a locked ReadableStream'));\n      }\n      if (IsWritableStreamLocked(dest) === true) {\n        return Promise.reject(new TypeError('ReadableStream.prototype.pipeTo cannot be used on a locked WritableStream'));\n      }\n\n      var reader = AcquireReadableStreamDefaultReader(this);\n      var writer = AcquireWritableStreamDefaultWriter(dest);\n\n      var shuttingDown = false;\n\n      // This is used to keep track of the spec's requirement that we wait for ongoing writes during shutdown.\n      var currentWrite = Promise.resolve();\n\n      return new Promise(function (resolve, reject) {\n        // Using reader and writer, read all chunks from this and write them to dest\n        // - Backpressure must be enforced\n        // - Shutdown must stop all activity\n        function pipeLoop() {\n          currentWrite = Promise.resolve();\n\n          if (shuttingDown === true) {\n            return Promise.resolve();\n          }\n\n          return writer._readyPromise.then(function () {\n            return ReadableStreamDefaultReaderRead(reader).then(function (_ref5) {\n              var value = _ref5.value,\n                  done = _ref5.done;\n\n              if (done === true) {\n                return;\n              }\n\n              currentWrite = WritableStreamDefaultWriterWrite(writer, value).catch(function () {});\n            });\n          }).then(pipeLoop);\n        }\n\n        // Errors must be propagated forward\n        isOrBecomesErrored(_this, reader._closedPromise, function (storedError) {\n          if (preventAbort === false) {\n            shutdownWithAction(function () {\n              return WritableStreamAbort(dest, storedError);\n            }, true, storedError);\n          } else {\n            shutdown(true, storedError);\n          }\n        });\n\n        // Errors must be propagated backward\n        isOrBecomesErrored(dest, writer._closedPromise, function (storedError) {\n          if (preventCancel === false) {\n            shutdownWithAction(function () {\n              return ReadableStreamCancel(_this, storedError);\n            }, true, storedError);\n          } else {\n            shutdown(true, storedError);\n          }\n        });\n\n        // Closing must be propagated forward\n        isOrBecomesClosed(_this, reader._closedPromise, function () {\n          if (preventClose === false) {\n            shutdownWithAction(function () {\n              return WritableStreamDefaultWriterCloseWithErrorPropagation(writer);\n            });\n          } else {\n            shutdown();\n          }\n        });\n\n        // Closing must be propagated backward\n        if (WritableStreamCloseQueuedOrInFlight(dest) === true || dest._state === 'closed') {\n          var destClosed = new TypeError('the destination writable stream closed before all data could be piped to it');\n\n          if (preventCancel === false) {\n            shutdownWithAction(function () {\n              return ReadableStreamCancel(_this, destClosed);\n            }, true, destClosed);\n          } else {\n            shutdown(true, destClosed);\n          }\n        }\n\n        pipeLoop().catch(function (err) {\n          currentWrite = Promise.resolve();\n          rethrowAssertionErrorRejection(err);\n        });\n\n        function waitForWritesToFinish() {\n          // Another write may have started while we were waiting on this currentWrite, so we have to be sure to wait\n          // for that too.\n          var oldCurrentWrite = currentWrite;\n          return currentWrite.then(function () {\n            return oldCurrentWrite !== currentWrite ? waitForWritesToFinish() : undefined;\n          });\n        }\n\n        function isOrBecomesErrored(stream, promise, action) {\n          if (stream._state === 'errored') {\n            action(stream._storedError);\n          } else {\n            promise.catch(action).catch(rethrowAssertionErrorRejection);\n          }\n        }\n\n        function isOrBecomesClosed(stream, promise, action) {\n          if (stream._state === 'closed') {\n            action();\n          } else {\n            promise.then(action).catch(rethrowAssertionErrorRejection);\n          }\n        }\n\n        function shutdownWithAction(action, originalIsError, originalError) {\n          if (shuttingDown === true) {\n            return;\n          }\n          shuttingDown = true;\n\n          if (dest._state === 'writable' && WritableStreamCloseQueuedOrInFlight(dest) === false) {\n            waitForWritesToFinish().then(doTheRest);\n          } else {\n            doTheRest();\n          }\n\n          function doTheRest() {\n            action().then(function () {\n              return finalize(originalIsError, originalError);\n            }, function (newError) {\n              return finalize(true, newError);\n            }).catch(rethrowAssertionErrorRejection);\n          }\n        }\n\n        function shutdown(isError, error) {\n          if (shuttingDown === true) {\n            return;\n          }\n          shuttingDown = true;\n\n          if (dest._state === 'writable' && WritableStreamCloseQueuedOrInFlight(dest) === false) {\n            waitForWritesToFinish().then(function () {\n              return finalize(isError, error);\n            }).catch(rethrowAssertionErrorRejection);\n          } else {\n            finalize(isError, error);\n          }\n        }\n\n        function finalize(isError, error) {\n          WritableStreamDefaultWriterRelease(writer);\n          ReadableStreamReaderGenericRelease(reader);\n\n          if (isError) {\n            reject(error);\n          } else {\n            resolve(undefined);\n          }\n        }\n      });\n    }\n  }, {\n    key: 'tee',\n    value: function tee() {\n      if (IsReadableStream(this) === false) {\n        throw streamBrandCheckException('tee');\n      }\n\n      var branches = ReadableStreamTee(this, false);\n      return createArrayFromList(branches);\n    }\n  }, {\n    key: 'locked',\n    get: function get() {\n      if (IsReadableStream(this) === false) {\n        throw streamBrandCheckException('locked');\n      }\n\n      return IsReadableStreamLocked(this);\n    }\n  }]);\n\n  return ReadableStream;\n}();\n\nmodule.exports = {\n  ReadableStream: ReadableStream,\n  IsReadableStreamDisturbed: IsReadableStreamDisturbed,\n  ReadableStreamDefaultControllerClose: ReadableStreamDefaultControllerClose,\n  ReadableStreamDefaultControllerEnqueue: ReadableStreamDefaultControllerEnqueue,\n  ReadableStreamDefaultControllerError: ReadableStreamDefaultControllerError,\n  ReadableStreamDefaultControllerGetDesiredSize: ReadableStreamDefaultControllerGetDesiredSize\n};\n\n// Abstract operations for the ReadableStream.\n\nfunction AcquireReadableStreamBYOBReader(stream) {\n  return new ReadableStreamBYOBReader(stream);\n}\n\nfunction AcquireReadableStreamDefaultReader(stream) {\n  return new ReadableStreamDefaultReader(stream);\n}\n\nfunction IsReadableStream(x) {\n  if (!typeIsObject(x)) {\n    return false;\n  }\n\n  if (!Object.prototype.hasOwnProperty.call(x, '_readableStreamController')) {\n    return false;\n  }\n\n  return true;\n}\n\nfunction IsReadableStreamDisturbed(stream) {\n  assert(IsReadableStream(stream) === true, 'IsReadableStreamDisturbed should only be used on known readable streams');\n\n  return stream._disturbed;\n}\n\nfunction IsReadableStreamLocked(stream) {\n  assert(IsReadableStream(stream) === true, 'IsReadableStreamLocked should only be used on known readable streams');\n\n  if (stream._reader === undefined) {\n    return false;\n  }\n\n  return true;\n}\n\nfunction ReadableStreamTee(stream, cloneForBranch2) {\n  assert(IsReadableStream(stream) === true);\n  assert(typeof cloneForBranch2 === 'boolean');\n\n  var reader = AcquireReadableStreamDefaultReader(stream);\n\n  var teeState = {\n    closedOrErrored: false,\n    canceled1: false,\n    canceled2: false,\n    reason1: undefined,\n    reason2: undefined\n  };\n  teeState.promise = new Promise(function (resolve) {\n    teeState._resolve = resolve;\n  });\n\n  var pull = create_ReadableStreamTeePullFunction();\n  pull._reader = reader;\n  pull._teeState = teeState;\n  pull._cloneForBranch2 = cloneForBranch2;\n\n  var cancel1 = create_ReadableStreamTeeBranch1CancelFunction();\n  cancel1._stream = stream;\n  cancel1._teeState = teeState;\n\n  var cancel2 = create_ReadableStreamTeeBranch2CancelFunction();\n  cancel2._stream = stream;\n  cancel2._teeState = teeState;\n\n  var underlyingSource1 = Object.create(Object.prototype);\n  createDataProperty(underlyingSource1, 'pull', pull);\n  createDataProperty(underlyingSource1, 'cancel', cancel1);\n  var branch1Stream = new ReadableStream(underlyingSource1);\n\n  var underlyingSource2 = Object.create(Object.prototype);\n  createDataProperty(underlyingSource2, 'pull', pull);\n  createDataProperty(underlyingSource2, 'cancel', cancel2);\n  var branch2Stream = new ReadableStream(underlyingSource2);\n\n  pull._branch1 = branch1Stream._readableStreamController;\n  pull._branch2 = branch2Stream._readableStreamController;\n\n  reader._closedPromise.catch(function (r) {\n    if (teeState.closedOrErrored === true) {\n      return;\n    }\n\n    ReadableStreamDefaultControllerError(pull._branch1, r);\n    ReadableStreamDefaultControllerError(pull._branch2, r);\n    teeState.closedOrErrored = true;\n  });\n\n  return [branch1Stream, branch2Stream];\n}\n\nfunction create_ReadableStreamTeePullFunction() {\n  function f() {\n    var reader = f._reader,\n        branch1 = f._branch1,\n        branch2 = f._branch2,\n        teeState = f._teeState;\n\n\n    return ReadableStreamDefaultReaderRead(reader).then(function (result) {\n      assert(typeIsObject(result));\n      var value = result.value;\n      var done = result.done;\n      assert(typeof done === 'boolean');\n\n      if (done === true && teeState.closedOrErrored === false) {\n        if (teeState.canceled1 === false) {\n          ReadableStreamDefaultControllerClose(branch1);\n        }\n        if (teeState.canceled2 === false) {\n          ReadableStreamDefaultControllerClose(branch2);\n        }\n        teeState.closedOrErrored = true;\n      }\n\n      if (teeState.closedOrErrored === true) {\n        return;\n      }\n\n      var value1 = value;\n      var value2 = value;\n\n      // There is no way to access the cloning code right now in the reference implementation.\n      // If we add one then we'll need an implementation for serializable objects.\n      // if (teeState.canceled2 === false && cloneForBranch2 === true) {\n      //   value2 = StructuredDeserialize(StructuredSerialize(value2));\n      // }\n\n      if (teeState.canceled1 === false) {\n        ReadableStreamDefaultControllerEnqueue(branch1, value1);\n      }\n\n      if (teeState.canceled2 === false) {\n        ReadableStreamDefaultControllerEnqueue(branch2, value2);\n      }\n    });\n  }\n  return f;\n}\n\nfunction create_ReadableStreamTeeBranch1CancelFunction() {\n  function f(reason) {\n    var stream = f._stream,\n        teeState = f._teeState;\n\n\n    teeState.canceled1 = true;\n    teeState.reason1 = reason;\n    if (teeState.canceled2 === true) {\n      var compositeReason = createArrayFromList([teeState.reason1, teeState.reason2]);\n      var cancelResult = ReadableStreamCancel(stream, compositeReason);\n      teeState._resolve(cancelResult);\n    }\n    return teeState.promise;\n  }\n  return f;\n}\n\nfunction create_ReadableStreamTeeBranch2CancelFunction() {\n  function f(reason) {\n    var stream = f._stream,\n        teeState = f._teeState;\n\n\n    teeState.canceled2 = true;\n    teeState.reason2 = reason;\n    if (teeState.canceled1 === true) {\n      var compositeReason = createArrayFromList([teeState.reason1, teeState.reason2]);\n      var cancelResult = ReadableStreamCancel(stream, compositeReason);\n      teeState._resolve(cancelResult);\n    }\n    return teeState.promise;\n  }\n  return f;\n}\n\n// ReadableStream API exposed for controllers.\n\nfunction ReadableStreamAddReadIntoRequest(stream) {\n  assert(IsReadableStreamBYOBReader(stream._reader) === true);\n  assert(stream._state === 'readable' || stream._state === 'closed');\n\n  var promise = new Promise(function (resolve, reject) {\n    var readIntoRequest = {\n      _resolve: resolve,\n      _reject: reject\n    };\n\n    stream._reader._readIntoRequests.push(readIntoRequest);\n  });\n\n  return promise;\n}\n\nfunction ReadableStreamAddReadRequest(stream) {\n  assert(IsReadableStreamDefaultReader(stream._reader) === true);\n  assert(stream._state === 'readable');\n\n  var promise = new Promise(function (resolve, reject) {\n    var readRequest = {\n      _resolve: resolve,\n      _reject: reject\n    };\n\n    stream._reader._readRequests.push(readRequest);\n  });\n\n  return promise;\n}\n\nfunction ReadableStreamCancel(stream, reason) {\n  stream._disturbed = true;\n\n  if (stream._state === 'closed') {\n    return Promise.resolve(undefined);\n  }\n  if (stream._state === 'errored') {\n    return Promise.reject(stream._storedError);\n  }\n\n  ReadableStreamClose(stream);\n\n  var sourceCancelPromise = stream._readableStreamController.__cancelSteps(reason);\n  return sourceCancelPromise.then(function () {\n    return undefined;\n  });\n}\n\nfunction ReadableStreamClose(stream) {\n  assert(stream._state === 'readable');\n\n  stream._state = 'closed';\n\n  var reader = stream._reader;\n\n  if (reader === undefined) {\n    return undefined;\n  }\n\n  if (IsReadableStreamDefaultReader(reader) === true) {\n    for (var i = 0; i < reader._readRequests.length; i++) {\n      var _resolve = reader._readRequests[i]._resolve;\n\n      _resolve(CreateIterResultObject(undefined, true));\n    }\n    reader._readRequests = [];\n  }\n\n  defaultReaderClosedPromiseResolve(reader);\n\n  return undefined;\n}\n\nfunction ReadableStreamError(stream, e) {\n  assert(IsReadableStream(stream) === true, 'stream must be ReadableStream');\n  assert(stream._state === 'readable', 'state must be readable');\n\n  stream._state = 'errored';\n  stream._storedError = e;\n\n  var reader = stream._reader;\n\n  if (reader === undefined) {\n    return undefined;\n  }\n\n  if (IsReadableStreamDefaultReader(reader) === true) {\n    for (var i = 0; i < reader._readRequests.length; i++) {\n      var readRequest = reader._readRequests[i];\n      readRequest._reject(e);\n    }\n\n    reader._readRequests = [];\n  } else {\n    assert(IsReadableStreamBYOBReader(reader), 'reader must be ReadableStreamBYOBReader');\n\n    for (var _i = 0; _i < reader._readIntoRequests.length; _i++) {\n      var readIntoRequest = reader._readIntoRequests[_i];\n      readIntoRequest._reject(e);\n    }\n\n    reader._readIntoRequests = [];\n  }\n\n  defaultReaderClosedPromiseReject(reader, e);\n  reader._closedPromise.catch(function () {});\n}\n\nfunction ReadableStreamFulfillReadIntoRequest(stream, chunk, done) {\n  var reader = stream._reader;\n\n  assert(reader._readIntoRequests.length > 0);\n\n  var readIntoRequest = reader._readIntoRequests.shift();\n  readIntoRequest._resolve(CreateIterResultObject(chunk, done));\n}\n\nfunction ReadableStreamFulfillReadRequest(stream, chunk, done) {\n  var reader = stream._reader;\n\n  assert(reader._readRequests.length > 0);\n\n  var readRequest = reader._readRequests.shift();\n  readRequest._resolve(CreateIterResultObject(chunk, done));\n}\n\nfunction ReadableStreamGetNumReadIntoRequests(stream) {\n  return stream._reader._readIntoRequests.length;\n}\n\nfunction ReadableStreamGetNumReadRequests(stream) {\n  return stream._reader._readRequests.length;\n}\n\nfunction ReadableStreamHasBYOBReader(stream) {\n  var reader = stream._reader;\n\n  if (reader === undefined) {\n    return false;\n  }\n\n  if (IsReadableStreamBYOBReader(reader) === false) {\n    return false;\n  }\n\n  return true;\n}\n\nfunction ReadableStreamHasDefaultReader(stream) {\n  var reader = stream._reader;\n\n  if (reader === undefined) {\n    return false;\n  }\n\n  if (IsReadableStreamDefaultReader(reader) === false) {\n    return false;\n  }\n\n  return true;\n}\n\n// Readers\n\nvar ReadableStreamDefaultReader = function () {\n  function ReadableStreamDefaultReader(stream) {\n    _classCallCheck(this, ReadableStreamDefaultReader);\n\n    if (IsReadableStream(stream) === false) {\n      throw new TypeError('ReadableStreamDefaultReader can only be constructed with a ReadableStream instance');\n    }\n    if (IsReadableStreamLocked(stream) === true) {\n      throw new TypeError('This stream has already been locked for exclusive reading by another reader');\n    }\n\n    ReadableStreamReaderGenericInitialize(this, stream);\n\n    this._readRequests = [];\n  }\n\n  _createClass(ReadableStreamDefaultReader, [{\n    key: 'cancel',\n    value: function cancel(reason) {\n      if (IsReadableStreamDefaultReader(this) === false) {\n        return Promise.reject(defaultReaderBrandCheckException('cancel'));\n      }\n\n      if (this._ownerReadableStream === undefined) {\n        return Promise.reject(readerLockException('cancel'));\n      }\n\n      return ReadableStreamReaderGenericCancel(this, reason);\n    }\n  }, {\n    key: 'read',\n    value: function read() {\n      if (IsReadableStreamDefaultReader(this) === false) {\n        return Promise.reject(defaultReaderBrandCheckException('read'));\n      }\n\n      if (this._ownerReadableStream === undefined) {\n        return Promise.reject(readerLockException('read from'));\n      }\n\n      return ReadableStreamDefaultReaderRead(this);\n    }\n  }, {\n    key: 'releaseLock',\n    value: function releaseLock() {\n      if (IsReadableStreamDefaultReader(this) === false) {\n        throw defaultReaderBrandCheckException('releaseLock');\n      }\n\n      if (this._ownerReadableStream === undefined) {\n        return;\n      }\n\n      if (this._readRequests.length > 0) {\n        throw new TypeError('Tried to release a reader lock when that reader has pending read() calls un-settled');\n      }\n\n      ReadableStreamReaderGenericRelease(this);\n    }\n  }, {\n    key: 'closed',\n    get: function get() {\n      if (IsReadableStreamDefaultReader(this) === false) {\n        return Promise.reject(defaultReaderBrandCheckException('closed'));\n      }\n\n      return this._closedPromise;\n    }\n  }]);\n\n  return ReadableStreamDefaultReader;\n}();\n\nvar ReadableStreamBYOBReader = function () {\n  function ReadableStreamBYOBReader(stream) {\n    _classCallCheck(this, ReadableStreamBYOBReader);\n\n    if (!IsReadableStream(stream)) {\n      throw new TypeError('ReadableStreamBYOBReader can only be constructed with a ReadableStream instance given a ' + 'byte source');\n    }\n    if (IsReadableByteStreamController(stream._readableStreamController) === false) {\n      throw new TypeError('Cannot construct a ReadableStreamBYOBReader for a stream not constructed with a byte ' + 'source');\n    }\n    if (IsReadableStreamLocked(stream)) {\n      throw new TypeError('This stream has already been locked for exclusive reading by another reader');\n    }\n\n    ReadableStreamReaderGenericInitialize(this, stream);\n\n    this._readIntoRequests = [];\n  }\n\n  _createClass(ReadableStreamBYOBReader, [{\n    key: 'cancel',\n    value: function cancel(reason) {\n      if (!IsReadableStreamBYOBReader(this)) {\n        return Promise.reject(byobReaderBrandCheckException('cancel'));\n      }\n\n      if (this._ownerReadableStream === undefined) {\n        return Promise.reject(readerLockException('cancel'));\n      }\n\n      return ReadableStreamReaderGenericCancel(this, reason);\n    }\n  }, {\n    key: 'read',\n    value: function read(view) {\n      if (!IsReadableStreamBYOBReader(this)) {\n        return Promise.reject(byobReaderBrandCheckException('read'));\n      }\n\n      if (this._ownerReadableStream === undefined) {\n        return Promise.reject(readerLockException('read from'));\n      }\n\n      if (!ArrayBuffer.isView(view)) {\n        return Promise.reject(new TypeError('view must be an array buffer view'));\n      }\n\n      if (view.byteLength === 0) {\n        return Promise.reject(new TypeError('view must have non-zero byteLength'));\n      }\n\n      return ReadableStreamBYOBReaderRead(this, view);\n    }\n  }, {\n    key: 'releaseLock',\n    value: function releaseLock() {\n      if (!IsReadableStreamBYOBReader(this)) {\n        throw byobReaderBrandCheckException('releaseLock');\n      }\n\n      if (this._ownerReadableStream === undefined) {\n        return;\n      }\n\n      if (this._readIntoRequests.length > 0) {\n        throw new TypeError('Tried to release a reader lock when that reader has pending read() calls un-settled');\n      }\n\n      ReadableStreamReaderGenericRelease(this);\n    }\n  }, {\n    key: 'closed',\n    get: function get() {\n      if (!IsReadableStreamBYOBReader(this)) {\n        return Promise.reject(byobReaderBrandCheckException('closed'));\n      }\n\n      return this._closedPromise;\n    }\n  }]);\n\n  return ReadableStreamBYOBReader;\n}();\n\n// Abstract operations for the readers.\n\nfunction IsReadableStreamBYOBReader(x) {\n  if (!typeIsObject(x)) {\n    return false;\n  }\n\n  if (!Object.prototype.hasOwnProperty.call(x, '_readIntoRequests')) {\n    return false;\n  }\n\n  return true;\n}\n\nfunction IsReadableStreamDefaultReader(x) {\n  if (!typeIsObject(x)) {\n    return false;\n  }\n\n  if (!Object.prototype.hasOwnProperty.call(x, '_readRequests')) {\n    return false;\n  }\n\n  return true;\n}\n\nfunction ReadableStreamReaderGenericInitialize(reader, stream) {\n  reader._ownerReadableStream = stream;\n  stream._reader = reader;\n\n  if (stream._state === 'readable') {\n    defaultReaderClosedPromiseInitialize(reader);\n  } else if (stream._state === 'closed') {\n    defaultReaderClosedPromiseInitializeAsResolved(reader);\n  } else {\n    assert(stream._state === 'errored', 'state must be errored');\n\n    defaultReaderClosedPromiseInitializeAsRejected(reader, stream._storedError);\n    reader._closedPromise.catch(function () {});\n  }\n}\n\n// A client of ReadableStreamDefaultReader and ReadableStreamBYOBReader may use these functions directly to bypass state\n// check.\n\nfunction ReadableStreamReaderGenericCancel(reader, reason) {\n  var stream = reader._ownerReadableStream;\n  assert(stream !== undefined);\n  return ReadableStreamCancel(stream, reason);\n}\n\nfunction ReadableStreamReaderGenericRelease(reader) {\n  assert(reader._ownerReadableStream !== undefined);\n  assert(reader._ownerReadableStream._reader === reader);\n\n  if (reader._ownerReadableStream._state === 'readable') {\n    defaultReaderClosedPromiseReject(reader, new TypeError('Reader was released and can no longer be used to monitor the stream\\'s closedness'));\n  } else {\n    defaultReaderClosedPromiseResetToRejected(reader, new TypeError('Reader was released and can no longer be used to monitor the stream\\'s closedness'));\n  }\n  reader._closedPromise.catch(function () {});\n\n  reader._ownerReadableStream._reader = undefined;\n  reader._ownerReadableStream = undefined;\n}\n\nfunction ReadableStreamBYOBReaderRead(reader, view) {\n  var stream = reader._ownerReadableStream;\n\n  assert(stream !== undefined);\n\n  stream._disturbed = true;\n\n  if (stream._state === 'errored') {\n    return Promise.reject(stream._storedError);\n  }\n\n  // Controllers must implement this.\n  return ReadableByteStreamControllerPullInto(stream._readableStreamController, view);\n}\n\nfunction ReadableStreamDefaultReaderRead(reader) {\n  var stream = reader._ownerReadableStream;\n\n  assert(stream !== undefined);\n\n  stream._disturbed = true;\n\n  if (stream._state === 'closed') {\n    return Promise.resolve(CreateIterResultObject(undefined, true));\n  }\n\n  if (stream._state === 'errored') {\n    return Promise.reject(stream._storedError);\n  }\n\n  assert(stream._state === 'readable');\n\n  return stream._readableStreamController.__pullSteps();\n}\n\n// Controllers\n\nvar ReadableStreamDefaultController = function () {\n  function ReadableStreamDefaultController(stream, underlyingSource, size, highWaterMark) {\n    _classCallCheck(this, ReadableStreamDefaultController);\n\n    if (IsReadableStream(stream) === false) {\n      throw new TypeError('ReadableStreamDefaultController can only be constructed with a ReadableStream instance');\n    }\n\n    if (stream._readableStreamController !== undefined) {\n      throw new TypeError('ReadableStreamDefaultController instances can only be created by the ReadableStream constructor');\n    }\n\n    this._controlledReadableStream = stream;\n\n    this._underlyingSource = underlyingSource;\n\n    // Need to set the slots so that the assert doesn't fire. In the spec the slots already exist implicitly.\n    this._queue = undefined;\n    this._queueTotalSize = undefined;\n    ResetQueue(this);\n\n    this._started = false;\n    this._closeRequested = false;\n    this._pullAgain = false;\n    this._pulling = false;\n\n    var normalizedStrategy = ValidateAndNormalizeQueuingStrategy(size, highWaterMark);\n    this._strategySize = normalizedStrategy.size;\n    this._strategyHWM = normalizedStrategy.highWaterMark;\n\n    var controller = this;\n\n    var startResult = InvokeOrNoop(underlyingSource, 'start', [this]);\n    Promise.resolve(startResult).then(function () {\n      controller._started = true;\n\n      assert(controller._pulling === false);\n      assert(controller._pullAgain === false);\n\n      ReadableStreamDefaultControllerCallPullIfNeeded(controller);\n    }, function (r) {\n      ReadableStreamDefaultControllerErrorIfNeeded(controller, r);\n    }).catch(rethrowAssertionErrorRejection);\n  }\n\n  _createClass(ReadableStreamDefaultController, [{\n    key: 'close',\n    value: function close() {\n      if (IsReadableStreamDefaultController(this) === false) {\n        throw defaultControllerBrandCheckException('close');\n      }\n\n      if (this._closeRequested === true) {\n        throw new TypeError('The stream has already been closed; do not close it again!');\n      }\n\n      var state = this._controlledReadableStream._state;\n      if (state !== 'readable') {\n        throw new TypeError('The stream (in ' + state + ' state) is not in the readable state and cannot be closed');\n      }\n\n      ReadableStreamDefaultControllerClose(this);\n    }\n  }, {\n    key: 'enqueue',\n    value: function enqueue(chunk) {\n      if (IsReadableStreamDefaultController(this) === false) {\n        throw defaultControllerBrandCheckException('enqueue');\n      }\n\n      if (this._closeRequested === true) {\n        throw new TypeError('stream is closed or draining');\n      }\n\n      var state = this._controlledReadableStream._state;\n      if (state !== 'readable') {\n        throw new TypeError('The stream (in ' + state + ' state) is not in the readable state and cannot be enqueued to');\n      }\n\n      return ReadableStreamDefaultControllerEnqueue(this, chunk);\n    }\n  }, {\n    key: 'error',\n    value: function error(e) {\n      if (IsReadableStreamDefaultController(this) === false) {\n        throw defaultControllerBrandCheckException('error');\n      }\n\n      var stream = this._controlledReadableStream;\n      if (stream._state !== 'readable') {\n        throw new TypeError('The stream is ' + stream._state + ' and so cannot be errored');\n      }\n\n      ReadableStreamDefaultControllerError(this, e);\n    }\n  }, {\n    key: '__cancelSteps',\n    value: function __cancelSteps(reason) {\n      ResetQueue(this);\n      return PromiseInvokeOrNoop(this._underlyingSource, 'cancel', [reason]);\n    }\n  }, {\n    key: '__pullSteps',\n    value: function __pullSteps() {\n      var stream = this._controlledReadableStream;\n\n      if (this._queue.length > 0) {\n        var chunk = DequeueValue(this);\n\n        if (this._closeRequested === true && this._queue.length === 0) {\n          ReadableStreamClose(stream);\n        } else {\n          ReadableStreamDefaultControllerCallPullIfNeeded(this);\n        }\n\n        return Promise.resolve(CreateIterResultObject(chunk, false));\n      }\n\n      var pendingPromise = ReadableStreamAddReadRequest(stream);\n      ReadableStreamDefaultControllerCallPullIfNeeded(this);\n      return pendingPromise;\n    }\n  }, {\n    key: 'desiredSize',\n    get: function get() {\n      if (IsReadableStreamDefaultController(this) === false) {\n        throw defaultControllerBrandCheckException('desiredSize');\n      }\n\n      return ReadableStreamDefaultControllerGetDesiredSize(this);\n    }\n  }]);\n\n  return ReadableStreamDefaultController;\n}();\n\n// Abstract operations for the ReadableStreamDefaultController.\n\nfunction IsReadableStreamDefaultController(x) {\n  if (!typeIsObject(x)) {\n    return false;\n  }\n\n  if (!Object.prototype.hasOwnProperty.call(x, '_underlyingSource')) {\n    return false;\n  }\n\n  return true;\n}\n\nfunction ReadableStreamDefaultControllerCallPullIfNeeded(controller) {\n  var shouldPull = ReadableStreamDefaultControllerShouldCallPull(controller);\n  if (shouldPull === false) {\n    return undefined;\n  }\n\n  if (controller._pulling === true) {\n    controller._pullAgain = true;\n    return undefined;\n  }\n\n  assert(controller._pullAgain === false);\n\n  controller._pulling = true;\n\n  var pullPromise = PromiseInvokeOrNoop(controller._underlyingSource, 'pull', [controller]);\n  pullPromise.then(function () {\n    controller._pulling = false;\n\n    if (controller._pullAgain === true) {\n      controller._pullAgain = false;\n      return ReadableStreamDefaultControllerCallPullIfNeeded(controller);\n    }\n    return undefined;\n  }, function (e) {\n    ReadableStreamDefaultControllerErrorIfNeeded(controller, e);\n  }).catch(rethrowAssertionErrorRejection);\n\n  return undefined;\n}\n\nfunction ReadableStreamDefaultControllerShouldCallPull(controller) {\n  var stream = controller._controlledReadableStream;\n\n  if (stream._state === 'closed' || stream._state === 'errored') {\n    return false;\n  }\n\n  if (controller._closeRequested === true) {\n    return false;\n  }\n\n  if (controller._started === false) {\n    return false;\n  }\n\n  if (IsReadableStreamLocked(stream) === true && ReadableStreamGetNumReadRequests(stream) > 0) {\n    return true;\n  }\n\n  var desiredSize = ReadableStreamDefaultControllerGetDesiredSize(controller);\n  if (desiredSize > 0) {\n    return true;\n  }\n\n  return false;\n}\n\n// A client of ReadableStreamDefaultController may use these functions directly to bypass state check.\n\nfunction ReadableStreamDefaultControllerClose(controller) {\n  var stream = controller._controlledReadableStream;\n\n  assert(controller._closeRequested === false);\n  assert(stream._state === 'readable');\n\n  controller._closeRequested = true;\n\n  if (controller._queue.length === 0) {\n    ReadableStreamClose(stream);\n  }\n}\n\nfunction ReadableStreamDefaultControllerEnqueue(controller, chunk) {\n  var stream = controller._controlledReadableStream;\n\n  assert(controller._closeRequested === false);\n  assert(stream._state === 'readable');\n\n  if (IsReadableStreamLocked(stream) === true && ReadableStreamGetNumReadRequests(stream) > 0) {\n    ReadableStreamFulfillReadRequest(stream, chunk, false);\n  } else {\n    var chunkSize = 1;\n\n    if (controller._strategySize !== undefined) {\n      var strategySize = controller._strategySize;\n      try {\n        chunkSize = strategySize(chunk);\n      } catch (chunkSizeE) {\n        ReadableStreamDefaultControllerErrorIfNeeded(controller, chunkSizeE);\n        throw chunkSizeE;\n      }\n    }\n\n    try {\n      EnqueueValueWithSize(controller, chunk, chunkSize);\n    } catch (enqueueE) {\n      ReadableStreamDefaultControllerErrorIfNeeded(controller, enqueueE);\n      throw enqueueE;\n    }\n  }\n\n  ReadableStreamDefaultControllerCallPullIfNeeded(controller);\n\n  return undefined;\n}\n\nfunction ReadableStreamDefaultControllerError(controller, e) {\n  var stream = controller._controlledReadableStream;\n\n  assert(stream._state === 'readable');\n\n  ResetQueue(controller);\n\n  ReadableStreamError(stream, e);\n}\n\nfunction ReadableStreamDefaultControllerErrorIfNeeded(controller, e) {\n  if (controller._controlledReadableStream._state === 'readable') {\n    ReadableStreamDefaultControllerError(controller, e);\n  }\n}\n\nfunction ReadableStreamDefaultControllerGetDesiredSize(controller) {\n  var stream = controller._controlledReadableStream;\n  var state = stream._state;\n\n  if (state === 'errored') {\n    return null;\n  }\n  if (state === 'closed') {\n    return 0;\n  }\n\n  return controller._strategyHWM - controller._queueTotalSize;\n}\n\nvar ReadableStreamBYOBRequest = function () {\n  function ReadableStreamBYOBRequest(controller, view) {\n    _classCallCheck(this, ReadableStreamBYOBRequest);\n\n    this._associatedReadableByteStreamController = controller;\n    this._view = view;\n  }\n\n  _createClass(ReadableStreamBYOBRequest, [{\n    key: 'respond',\n    value: function respond(bytesWritten) {\n      if (IsReadableStreamBYOBRequest(this) === false) {\n        throw byobRequestBrandCheckException('respond');\n      }\n\n      if (this._associatedReadableByteStreamController === undefined) {\n        throw new TypeError('This BYOB request has been invalidated');\n      }\n\n      ReadableByteStreamControllerRespond(this._associatedReadableByteStreamController, bytesWritten);\n    }\n  }, {\n    key: 'respondWithNewView',\n    value: function respondWithNewView(view) {\n      if (IsReadableStreamBYOBRequest(this) === false) {\n        throw byobRequestBrandCheckException('respond');\n      }\n\n      if (this._associatedReadableByteStreamController === undefined) {\n        throw new TypeError('This BYOB request has been invalidated');\n      }\n\n      if (!ArrayBuffer.isView(view)) {\n        throw new TypeError('You can only respond with array buffer views');\n      }\n\n      ReadableByteStreamControllerRespondWithNewView(this._associatedReadableByteStreamController, view);\n    }\n  }, {\n    key: 'view',\n    get: function get() {\n      return this._view;\n    }\n  }]);\n\n  return ReadableStreamBYOBRequest;\n}();\n\nvar ReadableByteStreamController = function () {\n  function ReadableByteStreamController(stream, underlyingByteSource, highWaterMark) {\n    _classCallCheck(this, ReadableByteStreamController);\n\n    if (IsReadableStream(stream) === false) {\n      throw new TypeError('ReadableByteStreamController can only be constructed with a ReadableStream instance given ' + 'a byte source');\n    }\n\n    if (stream._readableStreamController !== undefined) {\n      throw new TypeError('ReadableByteStreamController instances can only be created by the ReadableStream constructor given a byte ' + 'source');\n    }\n\n    this._controlledReadableStream = stream;\n\n    this._underlyingByteSource = underlyingByteSource;\n\n    this._pullAgain = false;\n    this._pulling = false;\n\n    ReadableByteStreamControllerClearPendingPullIntos(this);\n\n    // Need to set the slots so that the assert doesn't fire. In the spec the slots already exist implicitly.\n    this._queue = this._queueTotalSize = undefined;\n    ResetQueue(this);\n\n    this._closeRequested = false;\n    this._started = false;\n\n    this._strategyHWM = ValidateAndNormalizeHighWaterMark(highWaterMark);\n\n    var autoAllocateChunkSize = underlyingByteSource.autoAllocateChunkSize;\n    if (autoAllocateChunkSize !== undefined) {\n      if (Number.isInteger(autoAllocateChunkSize) === false || autoAllocateChunkSize <= 0) {\n        throw new RangeError('autoAllocateChunkSize must be a positive integer');\n      }\n    }\n    this._autoAllocateChunkSize = autoAllocateChunkSize;\n\n    this._pendingPullIntos = [];\n\n    var controller = this;\n\n    var startResult = InvokeOrNoop(underlyingByteSource, 'start', [this]);\n    Promise.resolve(startResult).then(function () {\n      controller._started = true;\n\n      assert(controller._pulling === false);\n      assert(controller._pullAgain === false);\n\n      ReadableByteStreamControllerCallPullIfNeeded(controller);\n    }, function (r) {\n      if (stream._state === 'readable') {\n        ReadableByteStreamControllerError(controller, r);\n      }\n    }).catch(rethrowAssertionErrorRejection);\n  }\n\n  _createClass(ReadableByteStreamController, [{\n    key: 'close',\n    value: function close() {\n      if (IsReadableByteStreamController(this) === false) {\n        throw byteStreamControllerBrandCheckException('close');\n      }\n\n      if (this._closeRequested === true) {\n        throw new TypeError('The stream has already been closed; do not close it again!');\n      }\n\n      var state = this._controlledReadableStream._state;\n      if (state !== 'readable') {\n        throw new TypeError('The stream (in ' + state + ' state) is not in the readable state and cannot be closed');\n      }\n\n      ReadableByteStreamControllerClose(this);\n    }\n  }, {\n    key: 'enqueue',\n    value: function enqueue(chunk) {\n      if (IsReadableByteStreamController(this) === false) {\n        throw byteStreamControllerBrandCheckException('enqueue');\n      }\n\n      if (this._closeRequested === true) {\n        throw new TypeError('stream is closed or draining');\n      }\n\n      var state = this._controlledReadableStream._state;\n      if (state !== 'readable') {\n        throw new TypeError('The stream (in ' + state + ' state) is not in the readable state and cannot be enqueued to');\n      }\n\n      if (!ArrayBuffer.isView(chunk)) {\n        throw new TypeError('You can only enqueue array buffer views when using a ReadableByteStreamController');\n      }\n\n      ReadableByteStreamControllerEnqueue(this, chunk);\n    }\n  }, {\n    key: 'error',\n    value: function error(e) {\n      if (IsReadableByteStreamController(this) === false) {\n        throw byteStreamControllerBrandCheckException('error');\n      }\n\n      var stream = this._controlledReadableStream;\n      if (stream._state !== 'readable') {\n        throw new TypeError('The stream is ' + stream._state + ' and so cannot be errored');\n      }\n\n      ReadableByteStreamControllerError(this, e);\n    }\n  }, {\n    key: '__cancelSteps',\n    value: function __cancelSteps(reason) {\n      if (this._pendingPullIntos.length > 0) {\n        var firstDescriptor = this._pendingPullIntos[0];\n        firstDescriptor.bytesFilled = 0;\n      }\n\n      ResetQueue(this);\n\n      return PromiseInvokeOrNoop(this._underlyingByteSource, 'cancel', [reason]);\n    }\n  }, {\n    key: '__pullSteps',\n    value: function __pullSteps() {\n      var stream = this._controlledReadableStream;\n      assert(ReadableStreamHasDefaultReader(stream) === true);\n\n      if (this._queueTotalSize > 0) {\n        assert(ReadableStreamGetNumReadRequests(stream) === 0);\n\n        var entry = this._queue.shift();\n        this._queueTotalSize -= entry.byteLength;\n\n        ReadableByteStreamControllerHandleQueueDrain(this);\n\n        var view = void 0;\n        try {\n          view = new Uint8Array(entry.buffer, entry.byteOffset, entry.byteLength);\n        } catch (viewE) {\n          return Promise.reject(viewE);\n        }\n\n        return Promise.resolve(CreateIterResultObject(view, false));\n      }\n\n      var autoAllocateChunkSize = this._autoAllocateChunkSize;\n      if (autoAllocateChunkSize !== undefined) {\n        var buffer = void 0;\n        try {\n          buffer = new ArrayBuffer(autoAllocateChunkSize);\n        } catch (bufferE) {\n          return Promise.reject(bufferE);\n        }\n\n        var pullIntoDescriptor = {\n          buffer: buffer,\n          byteOffset: 0,\n          byteLength: autoAllocateChunkSize,\n          bytesFilled: 0,\n          elementSize: 1,\n          ctor: Uint8Array,\n          readerType: 'default'\n        };\n\n        this._pendingPullIntos.push(pullIntoDescriptor);\n      }\n\n      var promise = ReadableStreamAddReadRequest(stream);\n\n      ReadableByteStreamControllerCallPullIfNeeded(this);\n\n      return promise;\n    }\n  }, {\n    key: 'byobRequest',\n    get: function get() {\n      if (IsReadableByteStreamController(this) === false) {\n        throw byteStreamControllerBrandCheckException('byobRequest');\n      }\n\n      if (this._byobRequest === undefined && this._pendingPullIntos.length > 0) {\n        var firstDescriptor = this._pendingPullIntos[0];\n        var view = new Uint8Array(firstDescriptor.buffer, firstDescriptor.byteOffset + firstDescriptor.bytesFilled, firstDescriptor.byteLength - firstDescriptor.bytesFilled);\n\n        this._byobRequest = new ReadableStreamBYOBRequest(this, view);\n      }\n\n      return this._byobRequest;\n    }\n  }, {\n    key: 'desiredSize',\n    get: function get() {\n      if (IsReadableByteStreamController(this) === false) {\n        throw byteStreamControllerBrandCheckException('desiredSize');\n      }\n\n      return ReadableByteStreamControllerGetDesiredSize(this);\n    }\n  }]);\n\n  return ReadableByteStreamController;\n}();\n\n// Abstract operations for the ReadableByteStreamController.\n\nfunction IsReadableByteStreamController(x) {\n  if (!typeIsObject(x)) {\n    return false;\n  }\n\n  if (!Object.prototype.hasOwnProperty.call(x, '_underlyingByteSource')) {\n    return false;\n  }\n\n  return true;\n}\n\nfunction IsReadableStreamBYOBRequest(x) {\n  if (!typeIsObject(x)) {\n    return false;\n  }\n\n  if (!Object.prototype.hasOwnProperty.call(x, '_associatedReadableByteStreamController')) {\n    return false;\n  }\n\n  return true;\n}\n\nfunction ReadableByteStreamControllerCallPullIfNeeded(controller) {\n  var shouldPull = ReadableByteStreamControllerShouldCallPull(controller);\n  if (shouldPull === false) {\n    return undefined;\n  }\n\n  if (controller._pulling === true) {\n    controller._pullAgain = true;\n    return undefined;\n  }\n\n  assert(controller._pullAgain === false);\n\n  controller._pulling = true;\n\n  // TODO: Test controller argument\n  var pullPromise = PromiseInvokeOrNoop(controller._underlyingByteSource, 'pull', [controller]);\n  pullPromise.then(function () {\n    controller._pulling = false;\n\n    if (controller._pullAgain === true) {\n      controller._pullAgain = false;\n      ReadableByteStreamControllerCallPullIfNeeded(controller);\n    }\n  }, function (e) {\n    if (controller._controlledReadableStream._state === 'readable') {\n      ReadableByteStreamControllerError(controller, e);\n    }\n  }).catch(rethrowAssertionErrorRejection);\n\n  return undefined;\n}\n\nfunction ReadableByteStreamControllerClearPendingPullIntos(controller) {\n  ReadableByteStreamControllerInvalidateBYOBRequest(controller);\n  controller._pendingPullIntos = [];\n}\n\nfunction ReadableByteStreamControllerCommitPullIntoDescriptor(stream, pullIntoDescriptor) {\n  assert(stream._state !== 'errored', 'state must not be errored');\n\n  var done = false;\n  if (stream._state === 'closed') {\n    assert(pullIntoDescriptor.bytesFilled === 0);\n    done = true;\n  }\n\n  var filledView = ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor);\n  if (pullIntoDescriptor.readerType === 'default') {\n    ReadableStreamFulfillReadRequest(stream, filledView, done);\n  } else {\n    assert(pullIntoDescriptor.readerType === 'byob');\n    ReadableStreamFulfillReadIntoRequest(stream, filledView, done);\n  }\n}\n\nfunction ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor) {\n  var bytesFilled = pullIntoDescriptor.bytesFilled;\n  var elementSize = pullIntoDescriptor.elementSize;\n\n  assert(bytesFilled <= pullIntoDescriptor.byteLength);\n  assert(bytesFilled % elementSize === 0);\n\n  return new pullIntoDescriptor.ctor(pullIntoDescriptor.buffer, pullIntoDescriptor.byteOffset, bytesFilled / elementSize);\n}\n\nfunction ReadableByteStreamControllerEnqueueChunkToQueue(controller, buffer, byteOffset, byteLength) {\n  controller._queue.push({ buffer: buffer, byteOffset: byteOffset, byteLength: byteLength });\n  controller._queueTotalSize += byteLength;\n}\n\nfunction ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor) {\n  var elementSize = pullIntoDescriptor.elementSize;\n\n  var currentAlignedBytes = pullIntoDescriptor.bytesFilled - pullIntoDescriptor.bytesFilled % elementSize;\n\n  var maxBytesToCopy = Math.min(controller._queueTotalSize, pullIntoDescriptor.byteLength - pullIntoDescriptor.bytesFilled);\n  var maxBytesFilled = pullIntoDescriptor.bytesFilled + maxBytesToCopy;\n  var maxAlignedBytes = maxBytesFilled - maxBytesFilled % elementSize;\n\n  var totalBytesToCopyRemaining = maxBytesToCopy;\n  var ready = false;\n  if (maxAlignedBytes > currentAlignedBytes) {\n    totalBytesToCopyRemaining = maxAlignedBytes - pullIntoDescriptor.bytesFilled;\n    ready = true;\n  }\n\n  var queue = controller._queue;\n\n  while (totalBytesToCopyRemaining > 0) {\n    var headOfQueue = queue[0];\n\n    var bytesToCopy = Math.min(totalBytesToCopyRemaining, headOfQueue.byteLength);\n\n    var destStart = pullIntoDescriptor.byteOffset + pullIntoDescriptor.bytesFilled;\n    ArrayBufferCopy(pullIntoDescriptor.buffer, destStart, headOfQueue.buffer, headOfQueue.byteOffset, bytesToCopy);\n\n    if (headOfQueue.byteLength === bytesToCopy) {\n      queue.shift();\n    } else {\n      headOfQueue.byteOffset += bytesToCopy;\n      headOfQueue.byteLength -= bytesToCopy;\n    }\n    controller._queueTotalSize -= bytesToCopy;\n\n    ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, bytesToCopy, pullIntoDescriptor);\n\n    totalBytesToCopyRemaining -= bytesToCopy;\n  }\n\n  if (ready === false) {\n    assert(controller._queueTotalSize === 0, 'queue must be empty');\n    assert(pullIntoDescriptor.bytesFilled > 0);\n    assert(pullIntoDescriptor.bytesFilled < pullIntoDescriptor.elementSize);\n  }\n\n  return ready;\n}\n\nfunction ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, size, pullIntoDescriptor) {\n  assert(controller._pendingPullIntos.length === 0 || controller._pendingPullIntos[0] === pullIntoDescriptor);\n\n  ReadableByteStreamControllerInvalidateBYOBRequest(controller);\n  pullIntoDescriptor.bytesFilled += size;\n}\n\nfunction ReadableByteStreamControllerHandleQueueDrain(controller) {\n  assert(controller._controlledReadableStream._state === 'readable');\n\n  if (controller._queueTotalSize === 0 && controller._closeRequested === true) {\n    ReadableStreamClose(controller._controlledReadableStream);\n  } else {\n    ReadableByteStreamControllerCallPullIfNeeded(controller);\n  }\n}\n\nfunction ReadableByteStreamControllerInvalidateBYOBRequest(controller) {\n  if (controller._byobRequest === undefined) {\n    return;\n  }\n\n  controller._byobRequest._associatedReadableByteStreamController = undefined;\n  controller._byobRequest._view = undefined;\n  controller._byobRequest = undefined;\n}\n\nfunction ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller) {\n  assert(controller._closeRequested === false);\n\n  while (controller._pendingPullIntos.length > 0) {\n    if (controller._queueTotalSize === 0) {\n      return;\n    }\n\n    var pullIntoDescriptor = controller._pendingPullIntos[0];\n\n    if (ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor) === true) {\n      ReadableByteStreamControllerShiftPendingPullInto(controller);\n\n      ReadableByteStreamControllerCommitPullIntoDescriptor(controller._controlledReadableStream, pullIntoDescriptor);\n    }\n  }\n}\n\nfunction ReadableByteStreamControllerPullInto(controller, view) {\n  var stream = controller._controlledReadableStream;\n\n  var elementSize = 1;\n  if (view.constructor !== DataView) {\n    elementSize = view.constructor.BYTES_PER_ELEMENT;\n  }\n\n  var ctor = view.constructor;\n\n  var pullIntoDescriptor = {\n    buffer: view.buffer,\n    byteOffset: view.byteOffset,\n    byteLength: view.byteLength,\n    bytesFilled: 0,\n    elementSize: elementSize,\n    ctor: ctor,\n    readerType: 'byob'\n  };\n\n  if (controller._pendingPullIntos.length > 0) {\n    pullIntoDescriptor.buffer = TransferArrayBuffer(pullIntoDescriptor.buffer);\n    controller._pendingPullIntos.push(pullIntoDescriptor);\n\n    // No ReadableByteStreamControllerCallPullIfNeeded() call since:\n    // - No change happens on desiredSize\n    // - The source has already been notified of that there's at least 1 pending read(view)\n\n    return ReadableStreamAddReadIntoRequest(stream);\n  }\n\n  if (stream._state === 'closed') {\n    var emptyView = new view.constructor(pullIntoDescriptor.buffer, pullIntoDescriptor.byteOffset, 0);\n    return Promise.resolve(CreateIterResultObject(emptyView, true));\n  }\n\n  if (controller._queueTotalSize > 0) {\n    if (ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor) === true) {\n      var filledView = ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor);\n\n      ReadableByteStreamControllerHandleQueueDrain(controller);\n\n      return Promise.resolve(CreateIterResultObject(filledView, false));\n    }\n\n    if (controller._closeRequested === true) {\n      var e = new TypeError('Insufficient bytes to fill elements in the given buffer');\n      ReadableByteStreamControllerError(controller, e);\n\n      return Promise.reject(e);\n    }\n  }\n\n  pullIntoDescriptor.buffer = TransferArrayBuffer(pullIntoDescriptor.buffer);\n  controller._pendingPullIntos.push(pullIntoDescriptor);\n\n  var promise = ReadableStreamAddReadIntoRequest(stream);\n\n  ReadableByteStreamControllerCallPullIfNeeded(controller);\n\n  return promise;\n}\n\nfunction ReadableByteStreamControllerRespondInClosedState(controller, firstDescriptor) {\n  firstDescriptor.buffer = TransferArrayBuffer(firstDescriptor.buffer);\n\n  assert(firstDescriptor.bytesFilled === 0, 'bytesFilled must be 0');\n\n  var stream = controller._controlledReadableStream;\n  if (ReadableStreamHasBYOBReader(stream) === true) {\n    while (ReadableStreamGetNumReadIntoRequests(stream) > 0) {\n      var pullIntoDescriptor = ReadableByteStreamControllerShiftPendingPullInto(controller);\n      ReadableByteStreamControllerCommitPullIntoDescriptor(stream, pullIntoDescriptor);\n    }\n  }\n}\n\nfunction ReadableByteStreamControllerRespondInReadableState(controller, bytesWritten, pullIntoDescriptor) {\n  if (pullIntoDescriptor.bytesFilled + bytesWritten > pullIntoDescriptor.byteLength) {\n    throw new RangeError('bytesWritten out of range');\n  }\n\n  ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, bytesWritten, pullIntoDescriptor);\n\n  if (pullIntoDescriptor.bytesFilled < pullIntoDescriptor.elementSize) {\n    // TODO: Figure out whether we should detach the buffer or not here.\n    return;\n  }\n\n  ReadableByteStreamControllerShiftPendingPullInto(controller);\n\n  var remainderSize = pullIntoDescriptor.bytesFilled % pullIntoDescriptor.elementSize;\n  if (remainderSize > 0) {\n    var end = pullIntoDescriptor.byteOffset + pullIntoDescriptor.bytesFilled;\n    var remainder = pullIntoDescriptor.buffer.slice(end - remainderSize, end);\n    ReadableByteStreamControllerEnqueueChunkToQueue(controller, remainder, 0, remainder.byteLength);\n  }\n\n  pullIntoDescriptor.buffer = TransferArrayBuffer(pullIntoDescriptor.buffer);\n  pullIntoDescriptor.bytesFilled -= remainderSize;\n  ReadableByteStreamControllerCommitPullIntoDescriptor(controller._controlledReadableStream, pullIntoDescriptor);\n\n  ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller);\n}\n\nfunction ReadableByteStreamControllerRespondInternal(controller, bytesWritten) {\n  var firstDescriptor = controller._pendingPullIntos[0];\n\n  var stream = controller._controlledReadableStream;\n\n  if (stream._state === 'closed') {\n    if (bytesWritten !== 0) {\n      throw new TypeError('bytesWritten must be 0 when calling respond() on a closed stream');\n    }\n\n    ReadableByteStreamControllerRespondInClosedState(controller, firstDescriptor);\n  } else {\n    assert(stream._state === 'readable');\n\n    ReadableByteStreamControllerRespondInReadableState(controller, bytesWritten, firstDescriptor);\n  }\n}\n\nfunction ReadableByteStreamControllerShiftPendingPullInto(controller) {\n  var descriptor = controller._pendingPullIntos.shift();\n  ReadableByteStreamControllerInvalidateBYOBRequest(controller);\n  return descriptor;\n}\n\nfunction ReadableByteStreamControllerShouldCallPull(controller) {\n  var stream = controller._controlledReadableStream;\n\n  if (stream._state !== 'readable') {\n    return false;\n  }\n\n  if (controller._closeRequested === true) {\n    return false;\n  }\n\n  if (controller._started === false) {\n    return false;\n  }\n\n  if (ReadableStreamHasDefaultReader(stream) === true && ReadableStreamGetNumReadRequests(stream) > 0) {\n    return true;\n  }\n\n  if (ReadableStreamHasBYOBReader(stream) === true && ReadableStreamGetNumReadIntoRequests(stream) > 0) {\n    return true;\n  }\n\n  if (ReadableByteStreamControllerGetDesiredSize(controller) > 0) {\n    return true;\n  }\n\n  return false;\n}\n\n// A client of ReadableByteStreamController may use these functions directly to bypass state check.\n\nfunction ReadableByteStreamControllerClose(controller) {\n  var stream = controller._controlledReadableStream;\n\n  assert(controller._closeRequested === false);\n  assert(stream._state === 'readable');\n\n  if (controller._queueTotalSize > 0) {\n    controller._closeRequested = true;\n\n    return;\n  }\n\n  if (controller._pendingPullIntos.length > 0) {\n    var firstPendingPullInto = controller._pendingPullIntos[0];\n    if (firstPendingPullInto.bytesFilled > 0) {\n      var e = new TypeError('Insufficient bytes to fill elements in the given buffer');\n      ReadableByteStreamControllerError(controller, e);\n\n      throw e;\n    }\n  }\n\n  ReadableStreamClose(stream);\n}\n\nfunction ReadableByteStreamControllerEnqueue(controller, chunk) {\n  var stream = controller._controlledReadableStream;\n\n  assert(controller._closeRequested === false);\n  assert(stream._state === 'readable');\n\n  var buffer = chunk.buffer;\n  var byteOffset = chunk.byteOffset;\n  var byteLength = chunk.byteLength;\n  var transferredBuffer = TransferArrayBuffer(buffer);\n\n  if (ReadableStreamHasDefaultReader(stream) === true) {\n    if (ReadableStreamGetNumReadRequests(stream) === 0) {\n      ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength);\n    } else {\n      assert(controller._queue.length === 0);\n\n      var transferredView = new Uint8Array(transferredBuffer, byteOffset, byteLength);\n      ReadableStreamFulfillReadRequest(stream, transferredView, false);\n    }\n  } else if (ReadableStreamHasBYOBReader(stream) === true) {\n    // TODO: Ideally in this branch detaching should happen only if the buffer is not consumed fully.\n    ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength);\n    ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller);\n  } else {\n    assert(IsReadableStreamLocked(stream) === false, 'stream must not be locked');\n    ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength);\n  }\n}\n\nfunction ReadableByteStreamControllerError(controller, e) {\n  var stream = controller._controlledReadableStream;\n\n  assert(stream._state === 'readable');\n\n  ReadableByteStreamControllerClearPendingPullIntos(controller);\n\n  ResetQueue(controller);\n  ReadableStreamError(stream, e);\n}\n\nfunction ReadableByteStreamControllerGetDesiredSize(controller) {\n  var stream = controller._controlledReadableStream;\n  var state = stream._state;\n\n  if (state === 'errored') {\n    return null;\n  }\n  if (state === 'closed') {\n    return 0;\n  }\n\n  return controller._strategyHWM - controller._queueTotalSize;\n}\n\nfunction ReadableByteStreamControllerRespond(controller, bytesWritten) {\n  bytesWritten = Number(bytesWritten);\n  if (IsFiniteNonNegativeNumber(bytesWritten) === false) {\n    throw new RangeError('bytesWritten must be a finite');\n  }\n\n  assert(controller._pendingPullIntos.length > 0);\n\n  ReadableByteStreamControllerRespondInternal(controller, bytesWritten);\n}\n\nfunction ReadableByteStreamControllerRespondWithNewView(controller, view) {\n  assert(controller._pendingPullIntos.length > 0);\n\n  var firstDescriptor = controller._pendingPullIntos[0];\n\n  if (firstDescriptor.byteOffset + firstDescriptor.bytesFilled !== view.byteOffset) {\n    throw new RangeError('The region specified by view does not match byobRequest');\n  }\n  if (firstDescriptor.byteLength !== view.byteLength) {\n    throw new RangeError('The buffer of view has different capacity than byobRequest');\n  }\n\n  firstDescriptor.buffer = view.buffer;\n\n  ReadableByteStreamControllerRespondInternal(controller, view.byteLength);\n}\n\n// Helper functions for the ReadableStream.\n\nfunction streamBrandCheckException(name) {\n  return new TypeError('ReadableStream.prototype.' + name + ' can only be used on a ReadableStream');\n}\n\n// Helper functions for the readers.\n\nfunction readerLockException(name) {\n  return new TypeError('Cannot ' + name + ' a stream using a released reader');\n}\n\n// Helper functions for the ReadableStreamDefaultReader.\n\nfunction defaultReaderBrandCheckException(name) {\n  return new TypeError('ReadableStreamDefaultReader.prototype.' + name + ' can only be used on a ReadableStreamDefaultReader');\n}\n\nfunction defaultReaderClosedPromiseInitialize(reader) {\n  reader._closedPromise = new Promise(function (resolve, reject) {\n    reader._closedPromise_resolve = resolve;\n    reader._closedPromise_reject = reject;\n  });\n}\n\nfunction defaultReaderClosedPromiseInitializeAsRejected(reader, reason) {\n  reader._closedPromise = Promise.reject(reason);\n  reader._closedPromise_resolve = undefined;\n  reader._closedPromise_reject = undefined;\n}\n\nfunction defaultReaderClosedPromiseInitializeAsResolved(reader) {\n  reader._closedPromise = Promise.resolve(undefined);\n  reader._closedPromise_resolve = undefined;\n  reader._closedPromise_reject = undefined;\n}\n\nfunction defaultReaderClosedPromiseReject(reader, reason) {\n  assert(reader._closedPromise_resolve !== undefined);\n  assert(reader._closedPromise_reject !== undefined);\n\n  reader._closedPromise_reject(reason);\n  reader._closedPromise_resolve = undefined;\n  reader._closedPromise_reject = undefined;\n}\n\nfunction defaultReaderClosedPromiseResetToRejected(reader, reason) {\n  assert(reader._closedPromise_resolve === undefined);\n  assert(reader._closedPromise_reject === undefined);\n\n  reader._closedPromise = Promise.reject(reason);\n}\n\nfunction defaultReaderClosedPromiseResolve(reader) {\n  assert(reader._closedPromise_resolve !== undefined);\n  assert(reader._closedPromise_reject !== undefined);\n\n  reader._closedPromise_resolve(undefined);\n  reader._closedPromise_resolve = undefined;\n  reader._closedPromise_reject = undefined;\n}\n\n// Helper functions for the ReadableStreamDefaultReader.\n\nfunction byobReaderBrandCheckException(name) {\n  return new TypeError('ReadableStreamBYOBReader.prototype.' + name + ' can only be used on a ReadableStreamBYOBReader');\n}\n\n// Helper functions for the ReadableStreamDefaultController.\n\nfunction defaultControllerBrandCheckException(name) {\n  return new TypeError('ReadableStreamDefaultController.prototype.' + name + ' can only be used on a ReadableStreamDefaultController');\n}\n\n// Helper functions for the ReadableStreamBYOBRequest.\n\nfunction byobRequestBrandCheckException(name) {\n  return new TypeError('ReadableStreamBYOBRequest.prototype.' + name + ' can only be used on a ReadableStreamBYOBRequest');\n}\n\n// Helper functions for the ReadableByteStreamController.\n\nfunction byteStreamControllerBrandCheckException(name) {\n  return new TypeError('ReadableByteStreamController.prototype.' + name + ' can only be used on a ReadableByteStreamController');\n}\n\n// Helper function for ReadableStream pipeThrough\n\nfunction ifIsObjectAndHasAPromiseIsHandledInternalSlotSetPromiseIsHandledToTrue(promise) {\n  try {\n    // This relies on the brand-check that is enforced by Promise.prototype.then(). As with the rest of the reference\n    // implementation, it doesn't attempt to do the right thing if someone has modified the global environment.\n    Promise.prototype.then.call(promise, undefined, function () {});\n  } catch (e) {\n    // The brand check failed, therefore the internal slot is not present and there's nothing further to do.\n  }\n}\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nvar transformStream = __w_pdfjs_require__(6);\nvar readableStream = __w_pdfjs_require__(4);\nvar writableStream = __w_pdfjs_require__(2);\n\nexports.TransformStream = transformStream.TransformStream;\nexports.ReadableStream = readableStream.ReadableStream;\nexports.IsReadableStreamDisturbed = readableStream.IsReadableStreamDisturbed;\nexports.ReadableStreamDefaultControllerClose = readableStream.ReadableStreamDefaultControllerClose;\nexports.ReadableStreamDefaultControllerEnqueue = readableStream.ReadableStreamDefaultControllerEnqueue;\nexports.ReadableStreamDefaultControllerError = readableStream.ReadableStreamDefaultControllerError;\nexports.ReadableStreamDefaultControllerGetDesiredSize = readableStream.ReadableStreamDefaultControllerGetDesiredSize;\nexports.AcquireWritableStreamDefaultWriter = writableStream.AcquireWritableStreamDefaultWriter;\nexports.IsWritableStream = writableStream.IsWritableStream;\nexports.IsWritableStreamLocked = writableStream.IsWritableStreamLocked;\nexports.WritableStream = writableStream.WritableStream;\nexports.WritableStreamAbort = writableStream.WritableStreamAbort;\nexports.WritableStreamDefaultControllerError = writableStream.WritableStreamDefaultControllerError;\nexports.WritableStreamDefaultWriterCloseWithErrorPropagation = writableStream.WritableStreamDefaultWriterCloseWithErrorPropagation;\nexports.WritableStreamDefaultWriterRelease = writableStream.WritableStreamDefaultWriterRelease;\nexports.WritableStreamDefaultWriterWrite = writableStream.WritableStreamDefaultWriterWrite;\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar _require = __w_pdfjs_require__(1),\n    assert = _require.assert;\n\nvar _require2 = __w_pdfjs_require__(0),\n    InvokeOrNoop = _require2.InvokeOrNoop,\n    PromiseInvokeOrPerformFallback = _require2.PromiseInvokeOrPerformFallback,\n    PromiseInvokeOrNoop = _require2.PromiseInvokeOrNoop,\n    typeIsObject = _require2.typeIsObject;\n\nvar _require3 = __w_pdfjs_require__(4),\n    ReadableStream = _require3.ReadableStream,\n    ReadableStreamDefaultControllerClose = _require3.ReadableStreamDefaultControllerClose,\n    ReadableStreamDefaultControllerEnqueue = _require3.ReadableStreamDefaultControllerEnqueue,\n    ReadableStreamDefaultControllerError = _require3.ReadableStreamDefaultControllerError,\n    ReadableStreamDefaultControllerGetDesiredSize = _require3.ReadableStreamDefaultControllerGetDesiredSize;\n\nvar _require4 = __w_pdfjs_require__(2),\n    WritableStream = _require4.WritableStream,\n    WritableStreamDefaultControllerError = _require4.WritableStreamDefaultControllerError;\n\n// Methods on the transform stream controller object\n\nfunction TransformStreamCloseReadable(transformStream) {\n  // console.log('TransformStreamCloseReadable()');\n\n  if (transformStream._errored === true) {\n    throw new TypeError('TransformStream is already errored');\n  }\n\n  if (transformStream._readableClosed === true) {\n    throw new TypeError('Readable side is already closed');\n  }\n\n  TransformStreamCloseReadableInternal(transformStream);\n}\n\nfunction TransformStreamEnqueueToReadable(transformStream, chunk) {\n  // console.log('TransformStreamEnqueueToReadable()');\n\n  if (transformStream._errored === true) {\n    throw new TypeError('TransformStream is already errored');\n  }\n\n  if (transformStream._readableClosed === true) {\n    throw new TypeError('Readable side is already closed');\n  }\n\n  // We throttle transformer.transform invocation based on the backpressure of the ReadableStream, but we still\n  // accept TransformStreamEnqueueToReadable() calls.\n\n  var controller = transformStream._readableController;\n\n  try {\n    ReadableStreamDefaultControllerEnqueue(controller, chunk);\n  } catch (e) {\n    // This happens when readableStrategy.size() throws.\n    // The ReadableStream has already errored itself.\n    transformStream._readableClosed = true;\n    TransformStreamErrorIfNeeded(transformStream, e);\n\n    throw transformStream._storedError;\n  }\n\n  var desiredSize = ReadableStreamDefaultControllerGetDesiredSize(controller);\n  var maybeBackpressure = desiredSize <= 0;\n\n  if (maybeBackpressure === true && transformStream._backpressure === false) {\n    // This allows pull() again. When desiredSize is 0, it's possible that a pull() will happen immediately (but\n    // asynchronously) after this because of pending read()s and set _backpressure back to false.\n    //\n    // If pull() could be called from inside enqueue(), then this logic would be wrong. This cannot happen\n    // because there is always a promise pending from start() or pull() when _backpressure is false.\n    TransformStreamSetBackpressure(transformStream, true);\n  }\n}\n\nfunction TransformStreamError(transformStream, e) {\n  if (transformStream._errored === true) {\n    throw new TypeError('TransformStream is already errored');\n  }\n\n  TransformStreamErrorInternal(transformStream, e);\n}\n\n// Abstract operations.\n\nfunction TransformStreamCloseReadableInternal(transformStream) {\n  assert(transformStream._errored === false);\n  assert(transformStream._readableClosed === false);\n\n  try {\n    ReadableStreamDefaultControllerClose(transformStream._readableController);\n  } catch (e) {\n    assert(false);\n  }\n\n  transformStream._readableClosed = true;\n}\n\nfunction TransformStreamErrorIfNeeded(transformStream, e) {\n  if (transformStream._errored === false) {\n    TransformStreamErrorInternal(transformStream, e);\n  }\n}\n\nfunction TransformStreamErrorInternal(transformStream, e) {\n  // console.log('TransformStreamErrorInternal()');\n\n  assert(transformStream._errored === false);\n\n  transformStream._errored = true;\n  transformStream._storedError = e;\n\n  if (transformStream._writableDone === false) {\n    WritableStreamDefaultControllerError(transformStream._writableController, e);\n  }\n  if (transformStream._readableClosed === false) {\n    ReadableStreamDefaultControllerError(transformStream._readableController, e);\n  }\n}\n\n// Used for preventing the next write() call on TransformStreamSink until there\n// is no longer backpressure.\nfunction TransformStreamReadableReadyPromise(transformStream) {\n  assert(transformStream._backpressureChangePromise !== undefined, '_backpressureChangePromise should have been initialized');\n\n  if (transformStream._backpressure === false) {\n    return Promise.resolve();\n  }\n\n  assert(transformStream._backpressure === true, '_backpressure should have been initialized');\n\n  return transformStream._backpressureChangePromise;\n}\n\nfunction TransformStreamSetBackpressure(transformStream, backpressure) {\n  // console.log(`TransformStreamSetBackpressure(${backpressure})`);\n\n  // Passes also when called during construction.\n  assert(transformStream._backpressure !== backpressure, 'TransformStreamSetBackpressure() should be called only when backpressure is changed');\n\n  if (transformStream._backpressureChangePromise !== undefined) {\n    // The fulfillment value is just for a sanity check.\n    transformStream._backpressureChangePromise_resolve(backpressure);\n  }\n\n  transformStream._backpressureChangePromise = new Promise(function (resolve) {\n    transformStream._backpressureChangePromise_resolve = resolve;\n  });\n\n  transformStream._backpressureChangePromise.then(function (resolution) {\n    assert(resolution !== backpressure, '_backpressureChangePromise should be fulfilled only when backpressure is changed');\n  });\n\n  transformStream._backpressure = backpressure;\n}\n\nfunction TransformStreamDefaultTransform(chunk, transformStreamController) {\n  var transformStream = transformStreamController._controlledTransformStream;\n  TransformStreamEnqueueToReadable(transformStream, chunk);\n  return Promise.resolve();\n}\n\nfunction TransformStreamTransform(transformStream, chunk) {\n  // console.log('TransformStreamTransform()');\n\n  assert(transformStream._errored === false);\n  assert(transformStream._transforming === false);\n  assert(transformStream._backpressure === false);\n\n  transformStream._transforming = true;\n\n  var transformer = transformStream._transformer;\n  var controller = transformStream._transformStreamController;\n\n  var transformPromise = PromiseInvokeOrPerformFallback(transformer, 'transform', [chunk, controller], TransformStreamDefaultTransform, [chunk, controller]);\n\n  return transformPromise.then(function () {\n    transformStream._transforming = false;\n\n    return TransformStreamReadableReadyPromise(transformStream);\n  }, function (e) {\n    TransformStreamErrorIfNeeded(transformStream, e);\n    return Promise.reject(e);\n  });\n}\n\nfunction IsTransformStreamDefaultController(x) {\n  if (!typeIsObject(x)) {\n    return false;\n  }\n\n  if (!Object.prototype.hasOwnProperty.call(x, '_controlledTransformStream')) {\n    return false;\n  }\n\n  return true;\n}\n\nfunction IsTransformStream(x) {\n  if (!typeIsObject(x)) {\n    return false;\n  }\n\n  if (!Object.prototype.hasOwnProperty.call(x, '_transformStreamController')) {\n    return false;\n  }\n\n  return true;\n}\n\nvar TransformStreamSink = function () {\n  function TransformStreamSink(transformStream, startPromise) {\n    _classCallCheck(this, TransformStreamSink);\n\n    this._transformStream = transformStream;\n    this._startPromise = startPromise;\n  }\n\n  _createClass(TransformStreamSink, [{\n    key: 'start',\n    value: function start(c) {\n      var transformStream = this._transformStream;\n\n      transformStream._writableController = c;\n\n      return this._startPromise.then(function () {\n        return TransformStreamReadableReadyPromise(transformStream);\n      });\n    }\n  }, {\n    key: 'write',\n    value: function write(chunk) {\n      // console.log('TransformStreamSink.write()');\n\n      var transformStream = this._transformStream;\n\n      return TransformStreamTransform(transformStream, chunk);\n    }\n  }, {\n    key: 'abort',\n    value: function abort() {\n      var transformStream = this._transformStream;\n      transformStream._writableDone = true;\n      TransformStreamErrorInternal(transformStream, new TypeError('Writable side aborted'));\n    }\n  }, {\n    key: 'close',\n    value: function close() {\n      // console.log('TransformStreamSink.close()');\n\n      var transformStream = this._transformStream;\n\n      assert(transformStream._transforming === false);\n\n      transformStream._writableDone = true;\n\n      var flushPromise = PromiseInvokeOrNoop(transformStream._transformer, 'flush', [transformStream._transformStreamController]);\n      // Return a promise that is fulfilled with undefined on success.\n      return flushPromise.then(function () {\n        if (transformStream._errored === true) {\n          return Promise.reject(transformStream._storedError);\n        }\n        if (transformStream._readableClosed === false) {\n          TransformStreamCloseReadableInternal(transformStream);\n        }\n        return Promise.resolve();\n      }).catch(function (r) {\n        TransformStreamErrorIfNeeded(transformStream, r);\n        return Promise.reject(transformStream._storedError);\n      });\n    }\n  }]);\n\n  return TransformStreamSink;\n}();\n\nvar TransformStreamSource = function () {\n  function TransformStreamSource(transformStream, startPromise) {\n    _classCallCheck(this, TransformStreamSource);\n\n    this._transformStream = transformStream;\n    this._startPromise = startPromise;\n  }\n\n  _createClass(TransformStreamSource, [{\n    key: 'start',\n    value: function start(c) {\n      var transformStream = this._transformStream;\n\n      transformStream._readableController = c;\n\n      return this._startPromise.then(function () {\n        // Prevent the first pull() call until there is backpressure.\n\n        assert(transformStream._backpressureChangePromise !== undefined, '_backpressureChangePromise should have been initialized');\n\n        if (transformStream._backpressure === true) {\n          return Promise.resolve();\n        }\n\n        assert(transformStream._backpressure === false, '_backpressure should have been initialized');\n\n        return transformStream._backpressureChangePromise;\n      });\n    }\n  }, {\n    key: 'pull',\n    value: function pull() {\n      // console.log('TransformStreamSource.pull()');\n\n      var transformStream = this._transformStream;\n\n      // Invariant. Enforced by the promises returned by start() and pull().\n      assert(transformStream._backpressure === true, 'pull() should be never called while _backpressure is false');\n\n      assert(transformStream._backpressureChangePromise !== undefined, '_backpressureChangePromise should have been initialized');\n\n      TransformStreamSetBackpressure(transformStream, false);\n\n      // Prevent the next pull() call until there is backpressure.\n      return transformStream._backpressureChangePromise;\n    }\n  }, {\n    key: 'cancel',\n    value: function cancel() {\n      var transformStream = this._transformStream;\n      transformStream._readableClosed = true;\n      TransformStreamErrorInternal(transformStream, new TypeError('Readable side canceled'));\n    }\n  }]);\n\n  return TransformStreamSource;\n}();\n\nvar TransformStreamDefaultController = function () {\n  function TransformStreamDefaultController(transformStream) {\n    _classCallCheck(this, TransformStreamDefaultController);\n\n    if (IsTransformStream(transformStream) === false) {\n      throw new TypeError('TransformStreamDefaultController can only be ' + 'constructed with a TransformStream instance');\n    }\n\n    if (transformStream._transformStreamController !== undefined) {\n      throw new TypeError('TransformStreamDefaultController instances can ' + 'only be created by the TransformStream constructor');\n    }\n\n    this._controlledTransformStream = transformStream;\n  }\n\n  _createClass(TransformStreamDefaultController, [{\n    key: 'enqueue',\n    value: function enqueue(chunk) {\n      if (IsTransformStreamDefaultController(this) === false) {\n        throw defaultControllerBrandCheckException('enqueue');\n      }\n\n      TransformStreamEnqueueToReadable(this._controlledTransformStream, chunk);\n    }\n  }, {\n    key: 'close',\n    value: function close() {\n      if (IsTransformStreamDefaultController(this) === false) {\n        throw defaultControllerBrandCheckException('close');\n      }\n\n      TransformStreamCloseReadable(this._controlledTransformStream);\n    }\n  }, {\n    key: 'error',\n    value: function error(reason) {\n      if (IsTransformStreamDefaultController(this) === false) {\n        throw defaultControllerBrandCheckException('error');\n      }\n\n      TransformStreamError(this._controlledTransformStream, reason);\n    }\n  }, {\n    key: 'desiredSize',\n    get: function get() {\n      if (IsTransformStreamDefaultController(this) === false) {\n        throw defaultControllerBrandCheckException('desiredSize');\n      }\n\n      var transformStream = this._controlledTransformStream;\n      var readableController = transformStream._readableController;\n\n      return ReadableStreamDefaultControllerGetDesiredSize(readableController);\n    }\n  }]);\n\n  return TransformStreamDefaultController;\n}();\n\nvar TransformStream = function () {\n  function TransformStream() {\n    var transformer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n    _classCallCheck(this, TransformStream);\n\n    this._transformer = transformer;\n    var readableStrategy = transformer.readableStrategy,\n        writableStrategy = transformer.writableStrategy;\n\n\n    this._transforming = false;\n    this._errored = false;\n    this._storedError = undefined;\n\n    this._writableController = undefined;\n    this._readableController = undefined;\n    this._transformStreamController = undefined;\n\n    this._writableDone = false;\n    this._readableClosed = false;\n\n    this._backpressure = undefined;\n    this._backpressureChangePromise = undefined;\n    this._backpressureChangePromise_resolve = undefined;\n\n    this._transformStreamController = new TransformStreamDefaultController(this);\n\n    var startPromise_resolve = void 0;\n    var startPromise = new Promise(function (resolve) {\n      startPromise_resolve = resolve;\n    });\n\n    var source = new TransformStreamSource(this, startPromise);\n\n    this._readable = new ReadableStream(source, readableStrategy);\n\n    var sink = new TransformStreamSink(this, startPromise);\n\n    this._writable = new WritableStream(sink, writableStrategy);\n\n    assert(this._writableController !== undefined);\n    assert(this._readableController !== undefined);\n\n    var desiredSize = ReadableStreamDefaultControllerGetDesiredSize(this._readableController);\n    // Set _backpressure based on desiredSize. As there is no read() at this point, we can just interpret\n    // desiredSize being non-positive as backpressure.\n    TransformStreamSetBackpressure(this, desiredSize <= 0);\n\n    var transformStream = this;\n    var startResult = InvokeOrNoop(transformer, 'start', [transformStream._transformStreamController]);\n    startPromise_resolve(startResult);\n    startPromise.catch(function (e) {\n      // The underlyingSink and underlyingSource will error the readable and writable ends on their own.\n      if (transformStream._errored === false) {\n        transformStream._errored = true;\n        transformStream._storedError = e;\n      }\n    });\n  }\n\n  _createClass(TransformStream, [{\n    key: 'readable',\n    get: function get() {\n      if (IsTransformStream(this) === false) {\n        throw streamBrandCheckException('readable');\n      }\n\n      return this._readable;\n    }\n  }, {\n    key: 'writable',\n    get: function get() {\n      if (IsTransformStream(this) === false) {\n        throw streamBrandCheckException('writable');\n      }\n\n      return this._writable;\n    }\n  }]);\n\n  return TransformStream;\n}();\n\nmodule.exports = { TransformStream: TransformStream };\n\n// Helper functions for the TransformStreamDefaultController.\n\nfunction defaultControllerBrandCheckException(name) {\n  return new TypeError('TransformStreamDefaultController.prototype.' + name + ' can only be used on a TransformStreamDefaultController');\n}\n\n// Helper functions for the TransformStream.\n\nfunction streamBrandCheckException(name) {\n  return new TypeError('TransformStream.prototype.' + name + ' can only be used on a TransformStream');\n}\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\nmodule.exports = __w_pdfjs_require__(5);\n\n\n/***/ })\n/******/ ])));","/* Copyright 2018 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* eslint-disable no-restricted-globals */\n\nif (typeof PDFJSDev !== 'undefined' && !PDFJSDev.test('GENERIC')) {\n  // The `URL` constructor is assumed to be available in the extension builds.\n  exports.URL = URL;\n} else {\n  let isURLSupported = false;\n  try {\n    if (typeof URL === 'function' && typeof URL.prototype === 'object' &&\n        ('origin' in URL.prototype)) {\n      const u = new URL('b', 'http://a');\n      u.pathname = 'c%20d';\n      isURLSupported = (u.href === 'http://a/c%20d');\n    }\n  } catch (ex) {\n    // The `URL` constructor cannot be used.\n  }\n\n  if (isURLSupported) {\n    exports.URL = URL;\n  } else {\n    if (typeof PDFJSDev !== 'undefined' && PDFJSDev.test('IMAGE_DECODERS')) {\n      class DummyURL {\n        constructor() {\n          throw new Error('The current image decoders doesn\\'t utilize the ' +\n                          '`URL` constructor, hence it shouldn\\'t need to be ' +\n                          'polyfilled for the IMAGE_DECODERS build target.');\n        }\n      }\n      exports.URL = DummyURL;\n    } else {\n      const PolyfillURL = require('../../external/url/url-lib').URL;\n\n      // Attempt to copy over the static methods.\n      const OriginalURL = require('./global_scope').URL;\n      if (OriginalURL) {\n        PolyfillURL.createObjectURL = function(blob) {\n          // IE extension allows a second optional options argument, see\n          // http://msdn.microsoft.com/en-us/library/ie/hh772302(v=vs.85).aspx\n          return OriginalURL.createObjectURL.apply(OriginalURL, arguments);\n        };\n        PolyfillURL.revokeObjectURL = function(url) {\n          OriginalURL.revokeObjectURL(url);\n        };\n      }\n      exports.URL = PolyfillURL;\n    }\n  }\n}\n","/* Any copyright is dedicated to the Public Domain.\n * http://creativecommons.org/publicdomain/zero/1.0/\n */\n\n// Polyfill obtained from: https://github.com/Polymer/URL\n\n(function URLConstructorClosure() {\n  'use strict';\n\n  var relative = Object.create(null);\n  relative['ftp'] = 21;\n  relative['file'] = 0;\n  relative['gopher'] = 70;\n  relative['http'] = 80;\n  relative['https'] = 443;\n  relative['ws'] = 80;\n  relative['wss'] = 443;\n\n  var relativePathDotMapping = Object.create(null);\n  relativePathDotMapping['%2e'] = '.';\n  relativePathDotMapping['.%2e'] = '..';\n  relativePathDotMapping['%2e.'] = '..';\n  relativePathDotMapping['%2e%2e'] = '..';\n\n  function isRelativeScheme(scheme) {\n    return relative[scheme] !== undefined;\n  }\n\n  function invalid() {\n    clear.call(this);\n    this._isInvalid = true;\n  }\n\n  function IDNAToASCII(h) {\n    if (h === '') {\n      invalid.call(this);\n    }\n    // XXX\n    return h.toLowerCase();\n  }\n\n  function percentEscape(c) {\n    var unicode = c.charCodeAt(0);\n    if (unicode > 0x20 &&\n       unicode < 0x7F &&\n       // \" # < > ? `\n       [0x22, 0x23, 0x3C, 0x3E, 0x3F, 0x60].indexOf(unicode) === -1\n      ) {\n      return c;\n    }\n    return encodeURIComponent(c);\n  }\n\n  function percentEscapeQuery(c) {\n    // XXX This actually needs to encode c using encoding and then\n    // convert the bytes one-by-one.\n\n    var unicode = c.charCodeAt(0);\n    if (unicode > 0x20 &&\n       unicode < 0x7F &&\n       // \" # < > ` (do not escape '?')\n       [0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) === -1\n      ) {\n      return c;\n    }\n    return encodeURIComponent(c);\n  }\n\n  var EOF, ALPHA = /[a-zA-Z]/,\n      ALPHANUMERIC = /[a-zA-Z0-9\\+\\-\\.]/;\n\n  function parse(input, stateOverride, base) {\n    function err(message) {\n      errors.push(message);\n    }\n\n    var state = stateOverride || 'scheme start',\n        cursor = 0,\n        buffer = '',\n        seenAt = false,\n        seenBracket = false,\n        errors = [];\n\n    loop: while ((input[cursor - 1] !== EOF || cursor === 0) &&\n                 !this._isInvalid) {\n      var c = input[cursor];\n      switch (state) {\n        case 'scheme start':\n          if (c && ALPHA.test(c)) {\n            buffer += c.toLowerCase(); // ASCII-safe\n            state = 'scheme';\n          } else if (!stateOverride) {\n            buffer = '';\n            state = 'no scheme';\n            continue;\n          } else {\n            err('Invalid scheme.');\n            break loop;\n          }\n          break;\n\n        case 'scheme':\n          if (c && ALPHANUMERIC.test(c)) {\n            buffer += c.toLowerCase(); // ASCII-safe\n          } else if (c === ':') {\n            this._scheme = buffer;\n            buffer = '';\n            if (stateOverride) {\n              break loop;\n            }\n            if (isRelativeScheme(this._scheme)) {\n              this._isRelative = true;\n            }\n            if (this._scheme === 'file') {\n              state = 'relative';\n            } else if (this._isRelative && base &&\n                       base._scheme === this._scheme) {\n              state = 'relative or authority';\n            } else if (this._isRelative) {\n              state = 'authority first slash';\n            } else {\n              state = 'scheme data';\n            }\n          } else if (!stateOverride) {\n            buffer = '';\n            cursor = 0;\n            state = 'no scheme';\n            continue;\n          } else if (c === EOF) {\n            break loop;\n          } else {\n            err('Code point not allowed in scheme: ' + c);\n            break loop;\n          }\n          break;\n\n        case 'scheme data':\n          if (c === '?') {\n            this._query = '?';\n            state = 'query';\n          } else if (c === '#') {\n            this._fragment = '#';\n            state = 'fragment';\n          } else {\n            // XXX error handling\n            if (c !== EOF && c !== '\\t' && c !== '\\n' && c !== '\\r') {\n              this._schemeData += percentEscape(c);\n            }\n          }\n          break;\n\n        case 'no scheme':\n          if (!base || !(isRelativeScheme(base._scheme))) {\n            err('Missing scheme.');\n            invalid.call(this);\n          } else {\n            state = 'relative';\n            continue;\n          }\n          break;\n\n        case 'relative or authority':\n          if (c === '/' && input[cursor + 1] === '/') {\n            state = 'authority ignore slashes';\n          } else {\n            err('Expected /, got: ' + c);\n            state = 'relative';\n            continue;\n          }\n          break;\n\n        case 'relative':\n          this._isRelative = true;\n          if (this._scheme !== 'file') {\n            this._scheme = base._scheme;\n          }\n          if (c === EOF) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = base._query;\n            this._username = base._username;\n            this._password = base._password;\n            break loop;\n          } else if (c === '/' || c === '\\\\') {\n            if (c === '\\\\') {\n              err('\\\\ is an invalid code point.');\n            }\n            state = 'relative slash';\n          } else if (c === '?') {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = '?';\n            this._username = base._username;\n            this._password = base._password;\n            state = 'query';\n          } else if (c === '#') {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = base._query;\n            this._fragment = '#';\n            this._username = base._username;\n            this._password = base._password;\n            state = 'fragment';\n          } else {\n            var nextC = input[cursor + 1];\n            var nextNextC = input[cursor + 2];\n            if (this._scheme !== 'file' || !ALPHA.test(c) ||\n                (nextC !== ':' && nextC !== '|') ||\n                (nextNextC !== EOF && nextNextC !== '/' && nextNextC !== '\\\\' &&\n                 nextNextC !== '?' && nextNextC !== '#')) {\n              this._host = base._host;\n              this._port = base._port;\n              this._username = base._username;\n              this._password = base._password;\n              this._path = base._path.slice();\n              this._path.pop();\n            }\n            state = 'relative path';\n            continue;\n          }\n          break;\n\n        case 'relative slash':\n          if (c === '/' || c === '\\\\') {\n            if (c === '\\\\') {\n              err('\\\\ is an invalid code point.');\n            }\n            if (this._scheme === 'file') {\n              state = 'file host';\n            } else {\n              state = 'authority ignore slashes';\n            }\n          } else {\n            if (this._scheme !== 'file') {\n              this._host = base._host;\n              this._port = base._port;\n              this._username = base._username;\n              this._password = base._password;\n            }\n            state = 'relative path';\n            continue;\n          }\n          break;\n\n        case 'authority first slash':\n          if (c === '/') {\n            state = 'authority second slash';\n          } else {\n            err('Expected \\'/\\', got: ' + c);\n            state = 'authority ignore slashes';\n            continue;\n          }\n          break;\n\n        case 'authority second slash':\n          state = 'authority ignore slashes';\n          if (c !== '/') {\n            err('Expected \\'/\\', got: ' + c);\n            continue;\n          }\n          break;\n\n        case 'authority ignore slashes':\n          if (c !== '/' && c !== '\\\\') {\n            state = 'authority';\n            continue;\n          } else {\n            err('Expected authority, got: ' + c);\n          }\n          break;\n\n        case 'authority':\n          if (c === '@') {\n            if (seenAt) {\n              err('@ already seen.');\n              buffer += '%40';\n            }\n            seenAt = true;\n            for (var i = 0; i < buffer.length; i++) {\n              var cp = buffer[i];\n              if (cp === '\\t' || cp === '\\n' || cp === '\\r') {\n                err('Invalid whitespace in authority.');\n                continue;\n              }\n              // XXX check URL code points\n              if (cp === ':' && this._password === null) {\n                this._password = '';\n                continue;\n              }\n              var tempC = percentEscape(cp);\n              if (this._password !== null) {\n                this._password += tempC;\n              } else {\n                this._username += tempC;\n              }\n            }\n            buffer = '';\n          } else if (c === EOF || c === '/' || c === '\\\\' ||\n                     c === '?' || c === '#') {\n            cursor -= buffer.length;\n            buffer = '';\n            state = 'host';\n            continue;\n          } else {\n            buffer += c;\n          }\n          break;\n\n        case 'file host':\n          if (c === EOF || c === '/' || c === '\\\\' || c === '?' || c === '#') {\n            if (buffer.length === 2 && ALPHA.test(buffer[0]) &&\n                (buffer[1] === ':' || buffer[1] === '|')) {\n              state = 'relative path';\n            } else if (buffer.length === 0) {\n              state = 'relative path start';\n            } else {\n              this._host = IDNAToASCII.call(this, buffer);\n              buffer = '';\n              state = 'relative path start';\n            }\n            continue;\n          } else if (c === '\\t' || c === '\\n' || c === '\\r') {\n            err('Invalid whitespace in file host.');\n          } else {\n            buffer += c;\n          }\n          break;\n\n        case 'host':\n        case 'hostname':\n          if (c === ':' && !seenBracket) {\n            // XXX host parsing\n            this._host = IDNAToASCII.call(this, buffer);\n            buffer = '';\n            state = 'port';\n            if (stateOverride === 'hostname') {\n              break loop;\n            }\n          } else if (c === EOF || c === '/' ||\n                     c === '\\\\' || c === '?' || c === '#') {\n            this._host = IDNAToASCII.call(this, buffer);\n            buffer = '';\n            state = 'relative path start';\n            if (stateOverride) {\n              break loop;\n            }\n            continue;\n          } else if (c !== '\\t' && c !== '\\n' && c !== '\\r') {\n            if (c === '[') {\n              seenBracket = true;\n            } else if (c === ']') {\n              seenBracket = false;\n            }\n            buffer += c;\n          } else {\n            err('Invalid code point in host/hostname: ' + c);\n          }\n          break;\n\n        case 'port':\n          if (/[0-9]/.test(c)) {\n            buffer += c;\n          } else if (c === EOF || c === '/' || c === '\\\\' ||\n                     c === '?' || c === '#' || stateOverride) {\n            if (buffer !== '') {\n              var temp = parseInt(buffer, 10);\n              if (temp !== relative[this._scheme]) {\n                this._port = temp + '';\n              }\n              buffer = '';\n            }\n            if (stateOverride) {\n              break loop;\n            }\n            state = 'relative path start';\n            continue;\n          } else if (c === '\\t' || c === '\\n' || c === '\\r') {\n            err('Invalid code point in port: ' + c);\n          } else {\n            invalid.call(this);\n          }\n          break;\n\n        case 'relative path start':\n          if (c === '\\\\') {\n            err('\\'\\\\\\' not allowed in path.');\n          }\n          state = 'relative path';\n          if (c !== '/' && c !== '\\\\') {\n            continue;\n          }\n          break;\n\n        case 'relative path':\n          if (c === EOF || c === '/' || c === '\\\\' ||\n              (!stateOverride && (c === '?' || c === '#'))) {\n            if (c === '\\\\') {\n              err('\\\\ not allowed in relative path.');\n            }\n            var tmp;\n            if ((tmp = relativePathDotMapping[buffer.toLowerCase()])) {\n              buffer = tmp;\n            }\n            if (buffer === '..') {\n              this._path.pop();\n              if (c !== '/' && c !== '\\\\') {\n                this._path.push('');\n              }\n            } else if (buffer === '.' && c !== '/' && c !== '\\\\') {\n              this._path.push('');\n            } else if (buffer !== '.') {\n              if (this._scheme === 'file' && this._path.length === 0 &&\n                  buffer.length === 2 && ALPHA.test(buffer[0]) &&\n                  buffer[1] === '|') {\n                buffer = buffer[0] + ':';\n              }\n              this._path.push(buffer);\n            }\n            buffer = '';\n            if (c === '?') {\n              this._query = '?';\n              state = 'query';\n            } else if (c === '#') {\n              this._fragment = '#';\n              state = 'fragment';\n            }\n          } else if (c !== '\\t' && c !== '\\n' && c !== '\\r') {\n            buffer += percentEscape(c);\n          }\n          break;\n\n        case 'query':\n          if (!stateOverride && c === '#') {\n            this._fragment = '#';\n            state = 'fragment';\n          } else if (c !== EOF && c !== '\\t' && c !== '\\n' && c !== '\\r') {\n            this._query += percentEscapeQuery(c);\n          }\n          break;\n\n        case 'fragment':\n          if (c !== EOF && c !== '\\t' && c !== '\\n' && c !== '\\r') {\n            this._fragment += c;\n          }\n          break;\n      }\n\n      cursor++;\n    }\n  }\n\n  function clear() {\n    this._scheme = '';\n    this._schemeData = '';\n    this._username = '';\n    this._password = null;\n    this._host = '';\n    this._port = '';\n    this._path = [];\n    this._query = '';\n    this._fragment = '';\n    this._isInvalid = false;\n    this._isRelative = false;\n  }\n\n  // Does not process domain names or IP addresses.\n  // Does not handle encoding for the query parameter.\n  function JURL(url, base /* , encoding */) {\n    if (base !== undefined && !(base instanceof JURL)) {\n      base = new JURL(String(base));\n    }\n\n    this._url = url;\n    clear.call(this);\n\n    var input = url.replace(/^[ \\t\\r\\n\\f]+|[ \\t\\r\\n\\f]+$/g, '');\n    // encoding = encoding || 'utf-8'\n\n    parse.call(this, input, null, base);\n  }\n\n  JURL.prototype = {\n    toString() {\n      return this.href;\n    },\n    get href() {\n      if (this._isInvalid) {\n        return this._url;\n      }\n      var authority = '';\n      if (this._username !== '' || this._password !== null) {\n        authority = this._username +\n          (this._password !== null ? ':' + this._password : '') + '@';\n      }\n\n      return this.protocol +\n          (this._isRelative ? '//' + authority + this.host : '') +\n          this.pathname + this._query + this._fragment;\n    },\n    // The named parameter should be different from the setter's function name.\n    // Otherwise Safari 5 will throw an error (see issue 8541)\n    set href(value) {\n      clear.call(this);\n      parse.call(this, value);\n    },\n\n    get protocol() {\n      return this._scheme + ':';\n    },\n    set protocol(value) {\n      if (this._isInvalid) {\n        return;\n      }\n      parse.call(this, value + ':', 'scheme start');\n    },\n\n    get host() {\n      return this._isInvalid ? '' : this._port ?\n          this._host + ':' + this._port : this._host;\n    },\n    set host(value) {\n      if (this._isInvalid || !this._isRelative) {\n        return;\n      }\n      parse.call(this, value, 'host');\n    },\n\n    get hostname() {\n      return this._host;\n    },\n    set hostname(value) {\n      if (this._isInvalid || !this._isRelative) {\n        return;\n      }\n      parse.call(this, value, 'hostname');\n    },\n\n    get port() {\n      return this._port;\n    },\n    set port(value) {\n      if (this._isInvalid || !this._isRelative) {\n        return;\n      }\n      parse.call(this, value, 'port');\n    },\n\n    get pathname() {\n      return this._isInvalid ? '' : this._isRelative ?\n          '/' + this._path.join('/') : this._schemeData;\n    },\n    set pathname(value) {\n      if (this._isInvalid || !this._isRelative) {\n        return;\n      }\n      this._path = [];\n      parse.call(this, value, 'relative path start');\n    },\n\n    get search() {\n      return this._isInvalid || !this._query || this._query === '?' ?\n          '' : this._query;\n    },\n    set search(value) {\n      if (this._isInvalid || !this._isRelative) {\n        return;\n      }\n      this._query = '?';\n      if (value[0] === '?') {\n        value = value.slice(1);\n      }\n      parse.call(this, value, 'query');\n    },\n\n    get hash() {\n      return this._isInvalid || !this._fragment || this._fragment === '#' ?\n          '' : this._fragment;\n    },\n    set hash(value) {\n      if (this._isInvalid) {\n        return;\n      }\n      this._fragment = '#';\n      if (value[0] === '#') {\n        value = value.slice(1);\n      }\n      parse.call(this, value, 'fragment');\n    },\n\n    get origin() {\n      var host;\n      if (this._isInvalid || !this._scheme) {\n        return '';\n      }\n      // javascript: Gecko returns String(\"\"), WebKit/Blink String(\"null\")\n      // Gecko throws error for \"data://\"\n      // data: Gecko returns \"\", Blink returns \"data://\", WebKit returns \"null\"\n      // Gecko returns String(\"\") for file: mailto:\n      // WebKit/Blink returns String(\"SCHEME://\") for file: mailto:\n      switch (this._scheme) {\n        case 'data':\n        case 'file':\n        case 'javascript':\n        case 'mailto':\n          return 'null';\n        case 'blob':\n          // Special case of blob: -- returns valid origin of _schemeData.\n          try {\n            return new JURL(this._schemeData).origin || 'null';\n          } catch (_) {\n            // Invalid _schemeData origin -- ignoring errors.\n          }\n          return 'null';\n      }\n      host = this.host;\n      if (!host) {\n        return '';\n      }\n      return this._scheme + '://' + host;\n    },\n  };\n\n  exports.URL = JURL;\n})();\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* globals requirejs, __non_webpack_require__ */\n\nimport {\n  assert, createPromiseCapability, getVerbosityLevel, info, InvalidPDFException,\n  isArrayBuffer, isSameOrigin, MissingPDFException, NativeImageDecoding,\n  PasswordException, setVerbosityLevel, shadow, stringToBytes,\n  UnexpectedResponseException, UnknownErrorException, unreachable, URL, warn\n} from '../shared/util';\nimport {\n  DOMCanvasFactory, DOMCMapReaderFactory, DummyStatTimer, loadScript,\n  PageViewport, RenderingCancelledException, StatTimer\n} from './dom_utils';\nimport { FontFaceObject, FontLoader } from './font_loader';\nimport { apiCompatibilityParams } from './api_compatibility';\nimport { CanvasGraphics } from './canvas';\nimport globalScope from '../shared/global_scope';\nimport { GlobalWorkerOptions } from './worker_options';\nimport { MessageHandler } from '../shared/message_handler';\nimport { Metadata } from './metadata';\nimport { PDFDataTransportStream } from './transport_stream';\nimport { WebGLContext } from './webgl';\n\nconst DEFAULT_RANGE_CHUNK_SIZE = 65536; // 2^16 = 65536\n\nlet isWorkerDisabled = false;\nlet fallbackWorkerSrc;\n\nlet fakeWorkerFilesLoader = null;\nif (typeof PDFJSDev !== 'undefined' && PDFJSDev.test('GENERIC')) {\n  let useRequireEnsure = false;\n  // For GENERIC build we need to add support for different fake file loaders\n  // for different frameworks.\n  if (typeof window === 'undefined') {\n    // node.js - disable worker and set require.ensure.\n    isWorkerDisabled = true;\n    if (typeof __non_webpack_require__.ensure === 'undefined') {\n      __non_webpack_require__.ensure = __non_webpack_require__('node-ensure');\n    }\n    useRequireEnsure = true;\n  } else if (typeof __non_webpack_require__ !== 'undefined' &&\n             typeof __non_webpack_require__.ensure === 'function') {\n    useRequireEnsure = true;\n  }\n  if (typeof requirejs !== 'undefined' && requirejs.toUrl) {\n    fallbackWorkerSrc = requirejs.toUrl('pdfjs-dist/build/pdf.worker.js');\n  }\n  const dynamicLoaderSupported =\n    typeof requirejs !== 'undefined' && requirejs.load;\n  fakeWorkerFilesLoader = useRequireEnsure ? (function() {\n    return new Promise(function(resolve, reject) {\n      __non_webpack_require__.ensure([], function() {\n        try {\n          let worker;\n          if (typeof PDFJSDev !== 'undefined' && PDFJSDev.test('LIB')) {\n            worker = __non_webpack_require__('../pdf.worker.js');\n          } else {\n            worker = __non_webpack_require__('./pdf.worker.js');\n          }\n          resolve(worker.WorkerMessageHandler);\n        } catch (ex) {\n          reject(ex);\n        }\n      }, reject, 'pdfjsWorker');\n    });\n  }) : dynamicLoaderSupported ? (function() {\n    return new Promise(function(resolve, reject) {\n      requirejs(['pdfjs-dist/build/pdf.worker'], function(worker) {\n        try {\n          resolve(worker.WorkerMessageHandler);\n        } catch (ex) {\n          reject(ex);\n        }\n      }, reject);\n    });\n  }) : null;\n\n  if (!fallbackWorkerSrc && typeof document !== 'undefined') {\n    const pdfjsFilePath = document.currentScript && document.currentScript.src;\n    if (pdfjsFilePath) {\n      fallbackWorkerSrc =\n        pdfjsFilePath.replace(/(\\.(?:min\\.)?js)(\\?.*)?$/i, '.worker$1$2');\n    }\n  }\n}\n\n/**\n * @typedef {function} IPDFStreamFactory\n * @param {DocumentInitParameters} params The document initialization\n * parameters. The \"url\" key is always present.\n * @return {IPDFStream}\n */\n\n/** @type IPDFStreamFactory */\nvar createPDFNetworkStream;\n\n/**\n * Sets the function that instantiates a IPDFStream as an alternative PDF data\n * transport.\n * @param {IPDFStreamFactory} pdfNetworkStreamFactory - the factory function\n * that takes document initialization parameters (including a \"url\") and returns\n * an instance of IPDFStream.\n */\nfunction setPDFNetworkStreamFactory(pdfNetworkStreamFactory) {\n  createPDFNetworkStream = pdfNetworkStreamFactory;\n}\n\n/**\n * Document initialization / loading parameters object.\n *\n * @typedef {Object} DocumentInitParameters\n * @property {string}     url   - The URL of the PDF.\n * @property {TypedArray|Array|string} data - Binary PDF data. Use typed arrays\n *   (Uint8Array) to improve the memory usage. If PDF data is BASE64-encoded,\n *   use atob() to convert it to a binary string first.\n * @property {Object}     httpHeaders - Basic authentication headers.\n * @property {boolean}    withCredentials - Indicates whether or not cross-site\n *   Access-Control requests should be made using credentials such as cookies\n *   or authorization headers. The default is false.\n * @property {string}     password - For decrypting password-protected PDFs.\n * @property {TypedArray} initialData - A typed array with the first portion or\n *   all of the pdf data. Used by the extension since some data is already\n *   loaded before the switch to range requests.\n * @property {number}     length - The PDF file length. It's used for progress\n *   reports and range requests operations.\n * @property {PDFDataRangeTransport} range\n * @property {number}     rangeChunkSize - Optional parameter to specify\n *   maximum number of bytes fetched per range request. The default value is\n *   2^16 = 65536.\n * @property {PDFWorker}  worker - (optional) The worker that will be used for\n *   the loading and parsing of the PDF data.\n * @property {boolean} postMessageTransfers - (optional) Enables transfer usage\n *   in postMessage for ArrayBuffers. The default value is `true`.\n * @property {number} verbosity - (optional) Controls the logging level; the\n *   constants from {VerbosityLevel} should be used.\n * @property {string} docBaseUrl - (optional) The base URL of the document,\n *   used when attempting to recover valid absolute URLs for annotations, and\n *   outline items, that (incorrectly) only specify relative URLs.\n * @property {string} nativeImageDecoderSupport - (optional) Strategy for\n *   decoding certain (simple) JPEG images in the browser. This is useful for\n *   environments without DOM image and canvas support, such as e.g. Node.js.\n *   Valid values are 'decode', 'display' or 'none'; where 'decode' is intended\n *   for browsers with full image/canvas support, 'display' for environments\n *   with limited image support through stubs (useful for SVG conversion),\n *   and 'none' where JPEG images will be decoded entirely by PDF.js.\n *   The default value is 'decode'.\n * @property {string} cMapUrl - (optional) The URL where the predefined\n *   Adobe CMaps are located. Include trailing slash.\n * @property {boolean} cMapPacked - (optional) Specifies if the Adobe CMaps are\n *   binary packed.\n * @property {Object} CMapReaderFactory - (optional) The factory that will be\n *   used when reading built-in CMap files. Providing a custom factory is useful\n *   for environments without `XMLHttpRequest` support, such as e.g. Node.js.\n *   The default value is {DOMCMapReaderFactory}.\n * @property {boolean} stopAtErrors - (optional) Reject certain promises, e.g.\n *   `getOperatorList`, `getTextContent`, and `RenderTask`, when the associated\n *   PDF data cannot be successfully parsed, instead of attempting to recover\n *   whatever possible of the data. The default value is `false`.\n * @property {number} maxImageSize - (optional) The maximum allowed image size\n *   in total pixels, i.e. width * height. Images above this value will not be\n *   rendered. Use -1 for no limit, which is also the default value.\n * @property {boolean} isEvalSupported - (optional) Determines if we can eval\n *   strings as JS. Primarily used to improve performance of font rendering,\n *   and when parsing PDF functions. The default value is `true`.\n * @property {boolean} disableFontFace - (optional) By default fonts are\n *   converted to OpenType fonts and loaded via font face rules. If disabled,\n *   fonts will be rendered using a built-in font renderer that constructs the\n *   glyphs with primitive path commands. The default value is `false`.\n * @property {boolean} disableRange - (optional) Disable range request loading\n *   of PDF files. When enabled, and if the server supports partial content\n *   requests, then the PDF will be fetched in chunks.\n *   The default value is `false`.\n * @property {boolean} disableStream - (optional) Disable streaming of PDF file\n *   data. By default PDF.js attempts to load PDFs in chunks.\n *   The default value is `false`.\n * @property {boolean} disableAutoFetch - (optional) Disable pre-fetching of PDF\n *   file data. When range requests are enabled PDF.js will automatically keep\n *   fetching more data even if it isn't needed to display the current page.\n *   The default value is `false`.\n *   NOTE: It is also necessary to disable streaming, see above,\n *         in order for disabling of pre-fetching to work correctly.\n * @property {boolean} disableCreateObjectURL - (optional) Disable the use of\n *   `URL.createObjectURL`, for compatibility with older browsers.\n *   The default value is `false`.\n * @property {boolean} pdfBug - (optional) Enables special hooks for debugging\n *   PDF.js (see `web/debugger.js`). The default value is `false`.\n */\n\n/**\n * @typedef {Object} PDFDocumentStats\n * @property {Array} streamTypes - Used stream types in the document (an item\n *   is set to true if specific stream ID was used in the document).\n * @property {Array} fontTypes - Used font type in the document (an item is set\n *   to true if specific font ID was used in the document).\n */\n\n/**\n * This is the main entry point for loading a PDF and interacting with it.\n * NOTE: If a URL is used to fetch the PDF data a standard XMLHttpRequest(XHR)\n * is used, which means it must follow the same origin rules that any XHR does\n * e.g. No cross domain requests without CORS.\n *\n * @param {string|TypedArray|DocumentInitParameters|PDFDataRangeTransport} src\n * Can be a url to where a PDF is located, a typed array (Uint8Array)\n * already populated with data or parameter object.\n *\n * @return {PDFDocumentLoadingTask}\n */\nfunction getDocument(src) {\n  var task = new PDFDocumentLoadingTask();\n\n  var source;\n  if (typeof src === 'string') {\n    source = { url: src, };\n  } else if (isArrayBuffer(src)) {\n    source = { data: src, };\n  } else if (src instanceof PDFDataRangeTransport) {\n    source = { range: src, };\n  } else {\n    if (typeof src !== 'object') {\n      throw new Error('Invalid parameter in getDocument, ' +\n                      'need either Uint8Array, string or a parameter object');\n    }\n    if (!src.url && !src.data && !src.range) {\n      throw new Error(\n        'Invalid parameter object: need either .data, .range or .url');\n    }\n\n    source = src;\n  }\n\n  let params = Object.create(null);\n  var rangeTransport = null;\n  let worker = null;\n\n  for (var key in source) {\n    if (key === 'url' && typeof window !== 'undefined') {\n      // The full path is required in the 'url' field.\n      params[key] = new URL(source[key], window.location).href;\n      continue;\n    } else if (key === 'range') {\n      rangeTransport = source[key];\n      continue;\n    } else if (key === 'worker') {\n      worker = source[key];\n      continue;\n    } else if (key === 'data' && !(source[key] instanceof Uint8Array)) {\n      // Converting string or array-like data to Uint8Array.\n      var pdfBytes = source[key];\n      if (typeof pdfBytes === 'string') {\n        params[key] = stringToBytes(pdfBytes);\n      } else if (typeof pdfBytes === 'object' && pdfBytes !== null &&\n                 !isNaN(pdfBytes.length)) {\n        params[key] = new Uint8Array(pdfBytes);\n      } else if (isArrayBuffer(pdfBytes)) {\n        params[key] = new Uint8Array(pdfBytes);\n      } else {\n        throw new Error('Invalid PDF binary data: either typed array, ' +\n                        'string or array-like object is expected in the ' +\n                        'data property.');\n      }\n      continue;\n    }\n    params[key] = source[key];\n  }\n\n  params.rangeChunkSize = params.rangeChunkSize || DEFAULT_RANGE_CHUNK_SIZE;\n  params.CMapReaderFactory = params.CMapReaderFactory || DOMCMapReaderFactory;\n  params.ignoreErrors = params.stopAtErrors !== true;\n  params.pdfBug = params.pdfBug === true;\n\n  const NativeImageDecoderValues = Object.values(NativeImageDecoding);\n  if (params.nativeImageDecoderSupport === undefined ||\n      !NativeImageDecoderValues.includes(params.nativeImageDecoderSupport)) {\n    params.nativeImageDecoderSupport =\n      (apiCompatibilityParams.nativeImageDecoderSupport ||\n       NativeImageDecoding.DECODE);\n  }\n  if (!Number.isInteger(params.maxImageSize)) {\n    params.maxImageSize = -1;\n  }\n  if (typeof params.isEvalSupported !== 'boolean') {\n    params.isEvalSupported = true;\n  }\n  if (typeof params.disableFontFace !== 'boolean') {\n    params.disableFontFace = apiCompatibilityParams.disableFontFace || false;\n  }\n\n  if (typeof params.disableRange !== 'boolean') {\n    params.disableRange = false;\n  }\n  if (typeof params.disableStream !== 'boolean') {\n    params.disableStream = false;\n  }\n  if (typeof params.disableAutoFetch !== 'boolean') {\n    params.disableAutoFetch = false;\n  }\n  if (typeof params.disableCreateObjectURL !== 'boolean') {\n    params.disableCreateObjectURL =\n      apiCompatibilityParams.disableCreateObjectURL || false;\n  }\n\n  // Set the main-thread verbosity level.\n  setVerbosityLevel(params.verbosity);\n\n  if (!worker) {\n    const workerParams = {\n      postMessageTransfers: params.postMessageTransfers,\n      verbosity: params.verbosity,\n    };\n    // Worker was not provided -- creating and owning our own. If message port\n    // is specified in global worker options, using it.\n    let workerPort = GlobalWorkerOptions.workerPort;\n    if (workerPort) {\n      workerParams.port = workerPort;\n      worker = PDFWorker.fromPort(workerParams);\n    } else {\n      worker = new PDFWorker(workerParams);\n    }\n    task._worker = worker;\n  }\n  var docId = task.docId;\n  worker.promise.then(function () {\n    if (task.destroyed) {\n      throw new Error('Loading aborted');\n    }\n    return _fetchDocument(worker, params, rangeTransport, docId).then(\n        function (workerId) {\n      if (task.destroyed) {\n        throw new Error('Loading aborted');\n      }\n\n      let networkStream;\n      if (rangeTransport) {\n        networkStream = new PDFDataTransportStream({\n          length: params.length,\n          initialData: params.initialData,\n          disableRange: params.disableRange,\n          disableStream: params.disableStream,\n        }, rangeTransport);\n      } else if (!params.data) {\n        networkStream = createPDFNetworkStream({\n          url: params.url,\n          length: params.length,\n          httpHeaders: params.httpHeaders,\n          withCredentials: params.withCredentials,\n          rangeChunkSize: params.rangeChunkSize,\n          disableRange: params.disableRange,\n          disableStream: params.disableStream,\n        });\n      }\n\n      var messageHandler = new MessageHandler(docId, workerId, worker.port);\n      messageHandler.postMessageTransfers = worker.postMessageTransfers;\n      var transport = new WorkerTransport(messageHandler, task, networkStream,\n                                          params);\n      task._transport = transport;\n      messageHandler.send('Ready', null);\n    });\n  }).catch(task._capability.reject);\n\n  return task;\n}\n\n/**\n * Starts fetching of specified PDF document/data.\n * @param {PDFWorker} worker\n * @param {Object} source\n * @param {PDFDataRangeTransport} pdfDataRangeTransport\n * @param {string} docId Unique document id, used as MessageHandler id.\n * @returns {Promise} The promise, which is resolved when worker id of\n *                    MessageHandler is known.\n * @private\n */\nfunction _fetchDocument(worker, source, pdfDataRangeTransport, docId) {\n  if (worker.destroyed) {\n    return Promise.reject(new Error('Worker was destroyed'));\n  }\n\n  if (pdfDataRangeTransport) {\n    source.length = pdfDataRangeTransport.length;\n    source.initialData = pdfDataRangeTransport.initialData;\n  }\n  return worker.messageHandler.sendWithPromise('GetDocRequest', {\n    docId,\n    apiVersion: (typeof PDFJSDev !== 'undefined' ?\n                 PDFJSDev.eval('BUNDLE_VERSION') : null),\n    source: { // Only send the required properties, and *not* the entire object.\n      data: source.data,\n      url: source.url,\n      password: source.password,\n      disableAutoFetch: source.disableAutoFetch,\n      rangeChunkSize: source.rangeChunkSize,\n      length: source.length,\n    },\n    maxImageSize: source.maxImageSize,\n    disableFontFace: source.disableFontFace,\n    disableCreateObjectURL: source.disableCreateObjectURL,\n    postMessageTransfers: worker.postMessageTransfers,\n    docBaseUrl: source.docBaseUrl,\n    nativeImageDecoderSupport: source.nativeImageDecoderSupport,\n    ignoreErrors: source.ignoreErrors,\n    isEvalSupported: source.isEvalSupported,\n  }).then(function (workerId) {\n    if (worker.destroyed) {\n      throw new Error('Worker was destroyed');\n    }\n    return workerId;\n  });\n}\n\n/**\n * PDF document loading operation.\n * @class\n * @alias PDFDocumentLoadingTask\n */\nvar PDFDocumentLoadingTask = (function PDFDocumentLoadingTaskClosure() {\n  var nextDocumentId = 0;\n\n  /** @constructs PDFDocumentLoadingTask */\n  function PDFDocumentLoadingTask() {\n    this._capability = createPromiseCapability();\n    this._transport = null;\n    this._worker = null;\n\n    /**\n     * Unique document loading task id -- used in MessageHandlers.\n     * @type {string}\n     */\n    this.docId = 'd' + (nextDocumentId++);\n\n    /**\n     * Shows if loading task is destroyed.\n     * @type {boolean}\n     */\n    this.destroyed = false;\n\n    /**\n     * Callback to request a password if wrong or no password was provided.\n     * The callback receives two parameters: function that needs to be called\n     * with new password and reason (see {PasswordResponses}).\n     */\n    this.onPassword = null;\n\n    /**\n     * Callback to be able to monitor the loading progress of the PDF file\n     * (necessary to implement e.g. a loading bar). The callback receives\n     * an {Object} with the properties: {number} loaded and {number} total.\n     */\n    this.onProgress = null;\n\n    /**\n     * Callback to when unsupported feature is used. The callback receives\n     * an {UNSUPPORTED_FEATURES} argument.\n     */\n    this.onUnsupportedFeature = null;\n  }\n\n  PDFDocumentLoadingTask.prototype =\n      /** @lends PDFDocumentLoadingTask.prototype */ {\n    /**\n     * @return {Promise}\n     */\n    get promise() {\n      return this._capability.promise;\n    },\n\n    /**\n     * Aborts all network requests and destroys worker.\n     * @return {Promise} A promise that is resolved after destruction activity\n     *                   is completed.\n     */\n    destroy() {\n      this.destroyed = true;\n\n      var transportDestroyed = !this._transport ? Promise.resolve() :\n        this._transport.destroy();\n      return transportDestroyed.then(() => {\n        this._transport = null;\n        if (this._worker) {\n          this._worker.destroy();\n          this._worker = null;\n        }\n      });\n    },\n\n    /**\n     * Registers callbacks to indicate the document loading completion.\n     *\n     * @param {function} onFulfilled The callback for the loading completion.\n     * @param {function} onRejected The callback for the loading failure.\n     * @return {Promise} A promise that is resolved after the onFulfilled or\n     *                   onRejected callback.\n     */\n    then: function PDFDocumentLoadingTask_then(onFulfilled, onRejected) {\n      return this.promise.then.apply(this.promise, arguments);\n    },\n  };\n\n  return PDFDocumentLoadingTask;\n})();\n\n/**\n * Abstract class to support range requests file loading.\n * @param {number} length\n * @param {Uint8Array} initialData\n */\nclass PDFDataRangeTransport {\n  constructor(length, initialData) {\n    this.length = length;\n    this.initialData = initialData;\n\n    this._rangeListeners = [];\n    this._progressListeners = [];\n    this._progressiveReadListeners = [];\n    this._readyCapability = createPromiseCapability();\n  }\n\n  addRangeListener(listener) {\n    this._rangeListeners.push(listener);\n  }\n\n  addProgressListener(listener) {\n    this._progressListeners.push(listener);\n  }\n\n  addProgressiveReadListener(listener) {\n    this._progressiveReadListeners.push(listener);\n  }\n\n  onDataRange(begin, chunk) {\n    for (const listener of this._rangeListeners) {\n      listener(begin, chunk);\n    }\n  }\n\n  onDataProgress(loaded) {\n    this._readyCapability.promise.then(() => {\n      for (const listener of this._progressListeners) {\n        listener(loaded);\n      }\n    });\n  }\n\n  onDataProgressiveRead(chunk) {\n    this._readyCapability.promise.then(() => {\n      for (const listener of this._progressiveReadListeners) {\n        listener(chunk);\n      }\n    });\n  }\n\n  transportReady() {\n    this._readyCapability.resolve();\n  }\n\n  requestDataRange(begin, end) {\n    unreachable('Abstract method PDFDataRangeTransport.requestDataRange');\n  }\n\n  abort() {}\n}\n\n/**\n * Proxy to a PDFDocument in the worker thread. Also, contains commonly used\n * properties that can be read synchronously.\n */\nclass PDFDocumentProxy {\n  constructor(pdfInfo, transport, loadingTask) {\n    this.loadingTask = loadingTask;\n\n    this._pdfInfo = pdfInfo;\n    this._transport = transport;\n  }\n\n  /**\n   * @return {number} Total number of pages the PDF contains.\n   */\n  get numPages() {\n    return this._pdfInfo.numPages;\n  }\n\n  /**\n   * @return {string} A (not guaranteed to be) unique ID to identify a PDF.\n   */\n  get fingerprint() {\n    return this._pdfInfo.fingerprint;\n  }\n\n  /**\n   * @param {number} pageNumber - The page number to get. The first page is 1.\n   * @return {Promise} A promise that is resolved with a {@link PDFPageProxy}\n   *   object.\n   */\n  getPage(pageNumber) {\n    return this._transport.getPage(pageNumber);\n  }\n\n  /**\n   * @param {{num: number, gen: number}} ref - The page reference. Must have\n   *   the `num` and `gen` properties.\n   * @return {Promise} A promise that is resolved with the page index that is\n   *   associated with the reference.\n   */\n  getPageIndex(ref) {\n    return this._transport.getPageIndex(ref);\n  }\n\n  /**\n   * @return {Promise} A promise that is resolved with a lookup table for\n   *   mapping named destinations to reference numbers.\n   *\n   * This can be slow for large documents. Use `getDestination` instead.\n   */\n  getDestinations() {\n    return this._transport.getDestinations();\n  }\n\n  /**\n   * @param {string} id - The named destination to get.\n   * @return {Promise} A promise that is resolved with all information\n   *   of the given named destination.\n   */\n  getDestination(id) {\n    return this._transport.getDestination(id);\n  }\n\n  /**\n   * @return {Promise} A promise that is resolved with an {Array} containing\n   *   the page labels that correspond to the page indexes, or `null` when\n   *   no page labels are present in the PDF file.\n   */\n  getPageLabels() {\n    return this._transport.getPageLabels();\n  }\n\n  /**\n   * @return {Promise} A promise that is resolved with a {string} containing\n   *   the page mode name.\n   */\n  getPageMode() {\n    return this._transport.getPageMode();\n  }\n\n  /**\n   * @return {Promise} A promise that is resolved with a lookup table for\n   *   mapping named attachments to their content.\n   */\n  getAttachments() {\n    return this._transport.getAttachments();\n  }\n\n  /**\n   * @return {Promise} A promise that is resolved with an {Array} of all the\n   *   JavaScript strings in the name tree, or `null` if no JavaScript exists.\n   */\n  getJavaScript() {\n    return this._transport.getJavaScript();\n  }\n\n  /**\n   * @return {Promise} A promise that is resolved with an {Array} that is a\n   * tree outline (if it has one) of the PDF. The tree is in the format of:\n   * [\n   *   {\n   *     title: string,\n   *     bold: boolean,\n   *     italic: boolean,\n   *     color: rgb Uint8ClampedArray,\n   *     dest: dest obj,\n   *     url: string,\n   *     items: array of more items like this\n   *   },\n   *   ...\n   * ]\n   */\n  getOutline() {\n    return this._transport.getOutline();\n  }\n\n  /**\n   * @return {Promise} A promise that is resolved with an {Array} that contains\n   *   the permission flags for the PDF document, or `null` when\n   *   no permissions are present in the PDF file.\n   */\n  getPermissions() {\n    return this._transport.getPermissions();\n  }\n\n  /**\n   * @return {Promise} A promise that is resolved with an {Object} that has\n   *   `info` and `metadata` properties. `info` is an {Object} filled with\n   *   anything available in the information dictionary and similarly\n   *   `metadata` is a {Metadata} object with information from the metadata\n   *   section of the PDF.\n   */\n  getMetadata() {\n    return this._transport.getMetadata();\n  }\n\n  /**\n   * @return {Promise} A promise that is resolved with a {TypedArray} that has\n   * the raw data from the PDF.\n   */\n  getData() {\n    return this._transport.getData();\n  }\n\n  /**\n   * @return {Promise} A promise that is resolved when the document's data\n   *   is loaded. It is resolved with an {Object} that contains the `length`\n   *   property that indicates size of the PDF data in bytes.\n   */\n  getDownloadInfo() {\n    return this._transport.downloadInfoCapability.promise;\n  }\n\n  /**\n   * @return {Promise} A promise this is resolved with current statistics about\n   *   document structures (see {@link PDFDocumentStats}).\n   */\n  getStats() {\n    return this._transport.getStats();\n  }\n\n  /**\n   * Cleans up resources allocated by the document, e.g. created `@font-face`.\n   */\n  cleanup() {\n    this._transport.startCleanup();\n  }\n\n  /**\n   * Destroys the current document instance and terminates the worker.\n   */\n  destroy() {\n    return this.loadingTask.destroy();\n  }\n\n  /**\n   * @return {Object} A subset of the current {DocumentInitParameters},\n   *   which are either needed in the viewer and/or whose default values\n   *   may be affected by the `apiCompatibilityParams`.\n   */\n  get loadingParams() {\n    return this._transport.loadingParams;\n  }\n}\n\n/**\n * Page getTextContent parameters.\n *\n * @typedef {Object} getTextContentParameters\n * @property {boolean} normalizeWhitespace - replaces all occurrences of\n *   whitespace with standard spaces (0x20). The default value is `false`.\n * @property {boolean} disableCombineTextItems - do not attempt to combine\n *   same line {@link TextItem}'s. The default value is `false`.\n */\n\n/**\n * Page text content.\n *\n * @typedef {Object} TextContent\n * @property {array} items - array of {@link TextItem}\n * @property {Object} styles - {@link TextStyles} objects, indexed by font name.\n */\n\n/**\n * Page text content part.\n *\n * @typedef {Object} TextItem\n * @property {string} str - text content.\n * @property {string} dir - text direction: 'ttb', 'ltr' or 'rtl'.\n * @property {array} transform - transformation matrix.\n * @property {number} width - width in device space.\n * @property {number} height - height in device space.\n * @property {string} fontName - font name used by pdf.js for converted font.\n */\n\n/**\n * Text style.\n *\n * @typedef {Object} TextStyle\n * @property {number} ascent - font ascent.\n * @property {number} descent - font descent.\n * @property {boolean} vertical - text is in vertical mode.\n * @property {string} fontFamily - possible font family\n */\n\n/**\n * Page annotation parameters.\n *\n * @typedef {Object} GetAnnotationsParameters\n * @property {string} intent - Determines the annotations that will be fetched,\n *                    can be either 'display' (viewable annotations) or 'print'\n *                    (printable annotations).\n *                    If the parameter is omitted, all annotations are fetched.\n */\n\n/**\n * Page render parameters.\n *\n * @typedef {Object} RenderParameters\n * @property {Object} canvasContext - A 2D context of a DOM Canvas object.\n * @property {PageViewport} viewport - Rendering viewport obtained by\n *                                calling of PDFPage.getViewport method.\n * @property {string} intent - Rendering intent, can be 'display' or 'print'\n *                    (default value is 'display').\n * @property {boolean} enableWebGL - (optional) Enables WebGL accelerated\n *   rendering for some operations. The default value is `false`.\n * @property {boolean} renderInteractiveForms - (optional) Whether or not\n *                     interactive form elements are rendered in the display\n *                     layer. If so, we do not render them on canvas as well.\n * @property {Array}  transform - (optional) Additional transform, applied\n *                    just before viewport transform.\n * @property {Object} imageLayer - (optional) An object that has beginLayout,\n *                    endLayout and appendImage functions.\n * @property {Object} canvasFactory - (optional) The factory that will be used\n *                    when creating canvases. The default value is\n *                    {DOMCanvasFactory}.\n * @property {Object} background - (optional) Background to use for the canvas.\n *                    Can use any valid canvas.fillStyle: A DOMString parsed as\n *                    CSS <color> value, a CanvasGradient object (a linear or\n *                    radial gradient) or a CanvasPattern object (a repetitive\n *                    image). The default value is 'rgb(255,255,255)'.\n */\n\n/**\n * PDF page operator list.\n *\n * @typedef {Object} PDFOperatorList\n * @property {Array} fnArray - Array containing the operator functions.\n * @property {Array} argsArray - Array containing the arguments of the\n *                               functions.\n */\n\n/**\n * Proxy to a PDFPage in the worker thread.\n * @class\n * @alias PDFPageProxy\n */\nvar PDFPageProxy = (function PDFPageProxyClosure() {\n  function PDFPageProxy(pageIndex, pageInfo, transport, pdfBug = false) {\n    this.pageIndex = pageIndex;\n    this._pageInfo = pageInfo;\n    this.transport = transport;\n    this._stats = (pdfBug ? new StatTimer() : DummyStatTimer);\n    this._pdfBug = pdfBug;\n    this.commonObjs = transport.commonObjs;\n    this.objs = new PDFObjects();\n    this.cleanupAfterRender = false;\n    this.pendingCleanup = false;\n    this.intentStates = Object.create(null);\n    this.destroyed = false;\n  }\n  PDFPageProxy.prototype = /** @lends PDFPageProxy.prototype */ {\n    /**\n     * @return {number} Page number of the page. First page is 1.\n     */\n    get pageNumber() {\n      return this.pageIndex + 1;\n    },\n    /**\n     * @return {number} The number of degrees the page is rotated clockwise.\n     */\n    get rotate() {\n      return this._pageInfo.rotate;\n    },\n    /**\n     * @return {Object} The reference that points to this page. It has 'num' and\n     * 'gen' properties.\n     */\n    get ref() {\n      return this._pageInfo.ref;\n    },\n    /**\n     * @return {number} The default size of units in 1/72nds of an inch.\n     */\n    get userUnit() {\n      return this._pageInfo.userUnit;\n    },\n    /**\n     * @return {Array} An array of the visible portion of the PDF page in the\n     * user space units - [x1, y1, x2, y2].\n     */\n    get view() {\n      return this._pageInfo.view;\n    },\n\n    /**\n     * @param {number} scale The desired scale of the viewport.\n     * @param {number} rotate Degrees to rotate the viewport. If omitted this\n     * defaults to the page rotation.\n     * @param {boolean} dontFlip (optional) If true, axis Y will not be flipped.\n     * @return {PageViewport} Contains 'width' and 'height' properties\n     * along with transforms required for rendering.\n     */\n    getViewport(scale, rotate = this.rotate, dontFlip = false) {\n      return new PageViewport({\n        viewBox: this.view,\n        scale,\n        rotation: rotate,\n        dontFlip,\n      });\n    },\n    /**\n     * @param {GetAnnotationsParameters} params - Annotation parameters.\n     * @return {Promise} A promise that is resolved with an {Array} of the\n     * annotation objects.\n     */\n    getAnnotations: function PDFPageProxy_getAnnotations(params) {\n      var intent = (params && params.intent) || null;\n\n      if (!this.annotationsPromise || this.annotationsIntent !== intent) {\n        this.annotationsPromise = this.transport.getAnnotations(this.pageIndex,\n                                                                intent);\n        this.annotationsIntent = intent;\n      }\n      return this.annotationsPromise;\n    },\n    /**\n     * Begins the process of rendering a page to the desired context.\n     * @param {RenderParameters} params Page render parameters.\n     * @return {RenderTask} An object that contains the promise, which\n     *                      is resolved when the page finishes rendering.\n     */\n    render: function PDFPageProxy_render(params) {\n      let stats = this._stats;\n      stats.time('Overall');\n\n      // If there was a pending destroy cancel it so no cleanup happens during\n      // this call to render.\n      this.pendingCleanup = false;\n\n      var renderingIntent = (params.intent === 'print' ? 'print' : 'display');\n      var canvasFactory = params.canvasFactory || new DOMCanvasFactory();\n      let webGLContext = new WebGLContext({\n        enable: params.enableWebGL,\n      });\n\n      if (!this.intentStates[renderingIntent]) {\n        this.intentStates[renderingIntent] = Object.create(null);\n      }\n      var intentState = this.intentStates[renderingIntent];\n\n      // If there's no displayReadyCapability yet, then the operatorList\n      // was never requested before. Make the request and create the promise.\n      if (!intentState.displayReadyCapability) {\n        intentState.receivingOperatorList = true;\n        intentState.displayReadyCapability = createPromiseCapability();\n        intentState.operatorList = {\n          fnArray: [],\n          argsArray: [],\n          lastChunk: false,\n        };\n\n        stats.time('Page Request');\n        this.transport.messageHandler.send('RenderPageRequest', {\n          pageIndex: this.pageNumber - 1,\n          intent: renderingIntent,\n          renderInteractiveForms: (params.renderInteractiveForms === true),\n        });\n      }\n\n      var complete = (error) => {\n        var i = intentState.renderTasks.indexOf(internalRenderTask);\n        if (i >= 0) {\n          intentState.renderTasks.splice(i, 1);\n        }\n\n        if (this.cleanupAfterRender) {\n          this.pendingCleanup = true;\n        }\n        this._tryCleanup();\n\n        if (error) {\n          internalRenderTask.capability.reject(error);\n        } else {\n          internalRenderTask.capability.resolve();\n        }\n        stats.timeEnd('Rendering');\n        stats.timeEnd('Overall');\n      };\n\n      var internalRenderTask = new InternalRenderTask(complete, params,\n                                                      this.objs,\n                                                      this.commonObjs,\n                                                      intentState.operatorList,\n                                                      this.pageNumber,\n                                                      canvasFactory,\n                                                      webGLContext,\n                                                      this._pdfBug);\n      internalRenderTask.useRequestAnimationFrame = renderingIntent !== 'print';\n      if (!intentState.renderTasks) {\n        intentState.renderTasks = [];\n      }\n      intentState.renderTasks.push(internalRenderTask);\n      var renderTask = internalRenderTask.task;\n\n      intentState.displayReadyCapability.promise.then((transparency) => {\n        if (this.pendingCleanup) {\n          complete();\n          return;\n        }\n        stats.time('Rendering');\n        internalRenderTask.initializeGraphics(transparency);\n        internalRenderTask.operatorListChanged();\n      }).catch(complete);\n\n      return renderTask;\n    },\n\n    /**\n     * @return {Promise} A promise resolved with an {@link PDFOperatorList}\n     *   object that represents page's operator list.\n     */\n    getOperatorList: function PDFPageProxy_getOperatorList() {\n      function operatorListChanged() {\n        if (intentState.operatorList.lastChunk) {\n          intentState.opListReadCapability.resolve(intentState.operatorList);\n\n          var i = intentState.renderTasks.indexOf(opListTask);\n          if (i >= 0) {\n            intentState.renderTasks.splice(i, 1);\n          }\n        }\n      }\n\n      var renderingIntent = 'oplist';\n      if (!this.intentStates[renderingIntent]) {\n        this.intentStates[renderingIntent] = Object.create(null);\n      }\n      var intentState = this.intentStates[renderingIntent];\n      var opListTask;\n\n      if (!intentState.opListReadCapability) {\n        opListTask = {};\n        opListTask.operatorListChanged = operatorListChanged;\n        intentState.receivingOperatorList = true;\n        intentState.opListReadCapability = createPromiseCapability();\n        intentState.renderTasks = [];\n        intentState.renderTasks.push(opListTask);\n        intentState.operatorList = {\n          fnArray: [],\n          argsArray: [],\n          lastChunk: false,\n        };\n\n        this._stats.time('Page Request');\n        this.transport.messageHandler.send('RenderPageRequest', {\n          pageIndex: this.pageIndex,\n          intent: renderingIntent,\n        });\n      }\n      return intentState.opListReadCapability.promise;\n    },\n\n    /**\n     * @param {getTextContentParameters} params - getTextContent parameters.\n     * @return {ReadableStream} ReadableStream to read textContent chunks.\n     */\n    streamTextContent(params = {}) {\n      const TEXT_CONTENT_CHUNK_SIZE = 100;\n      return this.transport.messageHandler.sendWithStream('GetTextContent', {\n        pageIndex: this.pageNumber - 1,\n        normalizeWhitespace: (params.normalizeWhitespace === true),\n        combineTextItems: (params.disableCombineTextItems !== true),\n      }, {\n        highWaterMark: TEXT_CONTENT_CHUNK_SIZE,\n        size(textContent) {\n          return textContent.items.length;\n        },\n      });\n    },\n\n    /**\n     * @param {getTextContentParameters} params - getTextContent parameters.\n     * @return {Promise} That is resolved a {@link TextContent}\n     * object that represent the page text content.\n     */\n    getTextContent: function PDFPageProxy_getTextContent(params) {\n      params = params || {};\n      let readableStream = this.streamTextContent(params);\n\n      return new Promise(function(resolve, reject) {\n        function pump() {\n          reader.read().then(function({ value, done, }) {\n            if (done) {\n              resolve(textContent);\n              return;\n            }\n            Object.assign(textContent.styles, value.styles);\n            textContent.items.push(...value.items);\n            pump();\n          }, reject);\n        }\n\n        let reader = readableStream.getReader();\n        let textContent = {\n          items: [],\n          styles: Object.create(null),\n        };\n\n        pump();\n      });\n    },\n\n    /**\n     * Destroys page object.\n     */\n    _destroy: function PDFPageProxy_destroy() {\n      this.destroyed = true;\n      this.transport.pageCache[this.pageIndex] = null;\n\n      var waitOn = [];\n      Object.keys(this.intentStates).forEach(function(intent) {\n        if (intent === 'oplist') {\n          // Avoid errors below, since the renderTasks are just stubs.\n          return;\n        }\n        var intentState = this.intentStates[intent];\n        intentState.renderTasks.forEach(function(renderTask) {\n          var renderCompleted = renderTask.capability.promise.\n            catch(function () {}); // ignoring failures\n          waitOn.push(renderCompleted);\n          renderTask.cancel();\n        });\n      }, this);\n      this.objs.clear();\n      this.annotationsPromise = null;\n      this.pendingCleanup = false;\n      return Promise.all(waitOn);\n    },\n\n    /**\n     * Cleans up resources allocated by the page.\n     * @param {boolean} resetStats - (optional) Reset page stats, if enabled.\n     *   The default value is `false`.\n     */\n    cleanup(resetStats = false) {\n      this.pendingCleanup = true;\n      this._tryCleanup(resetStats);\n    },\n    /**\n     * For internal use only. Attempts to clean up if rendering is in a state\n     * where that's possible.\n     * @ignore\n     */\n    _tryCleanup(resetStats = false) {\n      if (!this.pendingCleanup ||\n          Object.keys(this.intentStates).some(function(intent) {\n            var intentState = this.intentStates[intent];\n            return (intentState.renderTasks.length !== 0 ||\n                    intentState.receivingOperatorList);\n          }, this)) {\n        return;\n      }\n\n      Object.keys(this.intentStates).forEach(function(intent) {\n        delete this.intentStates[intent];\n      }, this);\n      this.objs.clear();\n      this.annotationsPromise = null;\n      if (resetStats && this._stats instanceof StatTimer) {\n        this._stats = new StatTimer();\n      }\n      this.pendingCleanup = false;\n    },\n    /**\n     * For internal use only.\n     * @ignore\n     */\n    _startRenderPage: function PDFPageProxy_startRenderPage(transparency,\n                                                            intent) {\n      var intentState = this.intentStates[intent];\n      // TODO Refactor RenderPageRequest to separate rendering\n      // and operator list logic\n      if (intentState.displayReadyCapability) {\n        intentState.displayReadyCapability.resolve(transparency);\n      }\n    },\n    /**\n     * For internal use only.\n     * @ignore\n     */\n    _renderPageChunk: function PDFPageProxy_renderPageChunk(operatorListChunk,\n                                                            intent) {\n      var intentState = this.intentStates[intent];\n      var i, ii;\n      // Add the new chunk to the current operator list.\n      for (i = 0, ii = operatorListChunk.length; i < ii; i++) {\n        intentState.operatorList.fnArray.push(operatorListChunk.fnArray[i]);\n        intentState.operatorList.argsArray.push(\n          operatorListChunk.argsArray[i]);\n      }\n      intentState.operatorList.lastChunk = operatorListChunk.lastChunk;\n\n      // Notify all the rendering tasks there are more operators to be consumed.\n      for (i = 0; i < intentState.renderTasks.length; i++) {\n        intentState.renderTasks[i].operatorListChanged();\n      }\n\n      if (operatorListChunk.lastChunk) {\n        intentState.receivingOperatorList = false;\n        this._tryCleanup();\n      }\n    },\n\n    /**\n     * @return {Object} Returns page stats, if enabled.\n     */\n    get stats() {\n      return (this._stats instanceof StatTimer ? this._stats : null);\n    },\n  };\n  return PDFPageProxy;\n})();\n\nclass LoopbackPort {\n  constructor(defer = true) {\n    this._listeners = [];\n    this._defer = defer;\n    this._deferred = Promise.resolve(undefined);\n  }\n\n  postMessage(obj, transfers) {\n    function cloneValue(value) {\n      // Trying to perform a structured clone close to the spec, including\n      // transfers.\n      if (typeof value !== 'object' || value === null) {\n        return value;\n      }\n      if (cloned.has(value)) { // already cloned the object\n        return cloned.get(value);\n      }\n      var result;\n      var buffer;\n      if ((buffer = value.buffer) && isArrayBuffer(buffer)) {\n        // We found object with ArrayBuffer (typed array).\n        var transferable = transfers && transfers.includes(buffer);\n        if (value === buffer) {\n          // Special case when we are faking typed arrays in compatibility.js.\n          result = value;\n        } else if (transferable) {\n          result = new value.constructor(buffer, value.byteOffset,\n                                         value.byteLength);\n        } else {\n          result = new value.constructor(value);\n        }\n        cloned.set(value, result);\n        return result;\n      }\n      result = Array.isArray(value) ? [] : {};\n      cloned.set(value, result); // adding to cache now for cyclic references\n      // Cloning all value and object properties, however ignoring properties\n      // defined via getter.\n      for (var i in value) {\n        var desc, p = value;\n        while (!(desc = Object.getOwnPropertyDescriptor(p, i))) {\n          p = Object.getPrototypeOf(p);\n        }\n        if (typeof desc.value === 'undefined' ||\n            typeof desc.value === 'function') {\n          continue;\n        }\n        result[i] = cloneValue(desc.value);\n      }\n      return result;\n    }\n\n    if (!this._defer) {\n      this._listeners.forEach(function (listener) {\n        listener.call(this, { data: obj, });\n      }, this);\n      return;\n    }\n\n    var cloned = new WeakMap();\n    var e = { data: cloneValue(obj), };\n    this._deferred.then(() => {\n      this._listeners.forEach(function (listener) {\n        listener.call(this, e);\n      }, this);\n    });\n  }\n\n  addEventListener(name, listener) {\n    this._listeners.push(listener);\n  }\n\n  removeEventListener(name, listener) {\n    var i = this._listeners.indexOf(listener);\n    this._listeners.splice(i, 1);\n  }\n\n  terminate() {\n    this._listeners = [];\n  }\n}\n\n/**\n * @typedef {Object} PDFWorkerParameters\n * @property {string} name - (optional) The name of the worker.\n * @property {Object} port - (optional) The `workerPort`.\n * @property {boolean} postMessageTransfers - (optional) Enables transfer usage\n *   in postMessage for ArrayBuffers. The default value is `true`.\n * @property {number} verbosity - (optional) Controls the logging level; the\n *   constants from {VerbosityLevel} should be used.\n */\n\n/**\n * PDF.js web worker abstraction, it controls instantiation of PDF documents and\n * WorkerTransport for them. If creation of a web worker is not possible,\n * a \"fake\" worker will be used instead.\n * @class\n */\nvar PDFWorker = (function PDFWorkerClosure() {\n  let nextFakeWorkerId = 0;\n\n  function getWorkerSrc() {\n    if (GlobalWorkerOptions.workerSrc) {\n      return GlobalWorkerOptions.workerSrc;\n    }\n    if (typeof fallbackWorkerSrc !== 'undefined') {\n      return fallbackWorkerSrc;\n    }\n    throw new Error('No \"GlobalWorkerOptions.workerSrc\" specified.');\n  }\n\n  function getMainThreadWorkerMessageHandler() {\n    try {\n      if (typeof window !== 'undefined') {\n        return (window.pdfjsWorker && window.pdfjsWorker.WorkerMessageHandler);\n      }\n    } catch (ex) { }\n    return null;\n  }\n\n  let fakeWorkerFilesLoadedCapability;\n\n  // Loads worker code into main thread.\n  function setupFakeWorkerGlobal() {\n    if (fakeWorkerFilesLoadedCapability) {\n      return fakeWorkerFilesLoadedCapability.promise;\n    }\n    fakeWorkerFilesLoadedCapability = createPromiseCapability();\n\n    let mainWorkerMessageHandler = getMainThreadWorkerMessageHandler();\n    if (mainWorkerMessageHandler) {\n      // The worker was already loaded using a `<script>` tag.\n      fakeWorkerFilesLoadedCapability.resolve(mainWorkerMessageHandler);\n      return fakeWorkerFilesLoadedCapability.promise;\n    }\n    // In the developer build load worker_loader.js which in turn loads all the\n    // other files and resolves the promise. In production only the\n    // pdf.worker.js file is needed.\n    if (typeof PDFJSDev === 'undefined' || !PDFJSDev.test('PRODUCTION')) {\n      if (typeof SystemJS === 'object') {\n        SystemJS.import('pdfjs/core/worker').then((worker) => {\n          fakeWorkerFilesLoadedCapability.resolve(worker.WorkerMessageHandler);\n        }).catch(fakeWorkerFilesLoadedCapability.reject);\n      } else if (typeof require === 'function') {\n        try {\n          let worker = require('../core/worker.js');\n          fakeWorkerFilesLoadedCapability.resolve(worker.WorkerMessageHandler);\n        } catch (ex) {\n          fakeWorkerFilesLoadedCapability.reject(ex);\n        }\n      } else {\n        fakeWorkerFilesLoadedCapability.reject(new Error(\n          'SystemJS or CommonJS must be used to load fake worker.'));\n      }\n    } else {\n      const loader = fakeWorkerFilesLoader || function() {\n        return loadScript(getWorkerSrc()).then(function() {\n          return window.pdfjsWorker.WorkerMessageHandler;\n        });\n      };\n      loader().then(fakeWorkerFilesLoadedCapability.resolve,\n                    fakeWorkerFilesLoadedCapability.reject);\n    }\n    return fakeWorkerFilesLoadedCapability.promise;\n  }\n\n  function createCDNWrapper(url) {\n    // We will rely on blob URL's property to specify origin.\n    // We want this function to fail in case if createObjectURL or Blob do not\n    // exist or fail for some reason -- our Worker creation will fail anyway.\n    var wrapper = 'importScripts(\\'' + url + '\\');';\n    return URL.createObjectURL(new Blob([wrapper]));\n  }\n\n  let pdfWorkerPorts = new WeakMap();\n\n  /**\n   * @param {PDFWorkerParameters} params - The worker initialization parameters.\n   */\n  function PDFWorker({ name = null, port = null,\n                       postMessageTransfers = true,\n                       verbosity = getVerbosityLevel(), } = {}) {\n    if (port && pdfWorkerPorts.has(port)) {\n      throw new Error('Cannot use more than one PDFWorker per port');\n    }\n\n    this.name = name;\n    this.destroyed = false;\n    this.postMessageTransfers = postMessageTransfers !== false;\n    this.verbosity = verbosity;\n\n    this._readyCapability = createPromiseCapability();\n    this._port = null;\n    this._webWorker = null;\n    this._messageHandler = null;\n\n    if (port) {\n      pdfWorkerPorts.set(port, this);\n      this._initializeFromPort(port);\n      return;\n    }\n\n    this._initialize();\n  }\n\n  PDFWorker.prototype = /** @lends PDFWorker.prototype */ {\n    get promise() {\n      return this._readyCapability.promise;\n    },\n\n    get port() {\n      return this._port;\n    },\n\n    get messageHandler() {\n      return this._messageHandler;\n    },\n\n    _initializeFromPort: function PDFWorker_initializeFromPort(port) {\n      this._port = port;\n      this._messageHandler = new MessageHandler('main', 'worker', port);\n      this._messageHandler.on('ready', function () {\n        // Ignoring 'ready' event -- MessageHandler shall be already initialized\n        // and ready to accept the messages.\n      });\n      this._readyCapability.resolve();\n    },\n\n    _initialize: function PDFWorker_initialize() {\n      // If worker support isn't disabled explicit and the browser has worker\n      // support, create a new web worker and test if it/the browser fulfills\n      // all requirements to run parts of pdf.js in a web worker.\n      // Right now, the requirement is, that an Uint8Array is still an\n      // Uint8Array as it arrives on the worker. (Chrome added this with v.15.)\n      if (typeof Worker !== 'undefined' && !isWorkerDisabled &&\n          !getMainThreadWorkerMessageHandler()) {\n        let workerSrc = getWorkerSrc();\n\n        try {\n          // Wraps workerSrc path into blob URL, if the former does not belong\n          // to the same origin.\n          if (typeof PDFJSDev !== 'undefined' && PDFJSDev.test('GENERIC') &&\n              !isSameOrigin(window.location.href, workerSrc)) {\n            workerSrc = createCDNWrapper(\n              new URL(workerSrc, window.location).href);\n          }\n\n          // Some versions of FF can't create a worker on localhost, see:\n          // https://bugzilla.mozilla.org/show_bug.cgi?id=683280\n          var worker = new Worker(workerSrc);\n          var messageHandler = new MessageHandler('main', 'worker', worker);\n          var terminateEarly = () => {\n            worker.removeEventListener('error', onWorkerError);\n            messageHandler.destroy();\n            worker.terminate();\n            if (this.destroyed) {\n              this._readyCapability.reject(new Error('Worker was destroyed'));\n            } else {\n              // Fall back to fake worker if the termination is caused by an\n              // error (e.g. NetworkError / SecurityError).\n              this._setupFakeWorker();\n            }\n          };\n\n          var onWorkerError = () => {\n            if (!this._webWorker) {\n              // Worker failed to initialize due to an error. Clean up and fall\n              // back to the fake worker.\n              terminateEarly();\n            }\n          };\n          worker.addEventListener('error', onWorkerError);\n\n          messageHandler.on('test', (data) => {\n            worker.removeEventListener('error', onWorkerError);\n            if (this.destroyed) {\n              terminateEarly();\n              return; // worker was destroyed\n            }\n            if (data && data.supportTypedArray) {\n              this._messageHandler = messageHandler;\n              this._port = worker;\n              this._webWorker = worker;\n              if (!data.supportTransfers) {\n                this.postMessageTransfers = false;\n              }\n              this._readyCapability.resolve();\n              // Send global setting, e.g. verbosity level.\n              messageHandler.send('configure', {\n                verbosity: this.verbosity,\n              });\n            } else {\n              this._setupFakeWorker();\n              messageHandler.destroy();\n              worker.terminate();\n            }\n          });\n\n          messageHandler.on('ready', (data) => {\n            worker.removeEventListener('error', onWorkerError);\n            if (this.destroyed) {\n              terminateEarly();\n              return; // worker was destroyed\n            }\n            try {\n              sendTest();\n            } catch (e) {\n              // We need fallback to a faked worker.\n              this._setupFakeWorker();\n            }\n          });\n\n          const sendTest = () => {\n            let testObj = new Uint8Array([this.postMessageTransfers ? 255 : 0]);\n            // Some versions of Opera throw a DATA_CLONE_ERR on serializing the\n            // typed array. Also, checking if we can use transfers.\n            try {\n              messageHandler.send('test', testObj, [testObj.buffer]);\n            } catch (ex) {\n              info('Cannot use postMessage transfers');\n              testObj[0] = 0;\n              messageHandler.send('test', testObj);\n            }\n          };\n\n          // It might take time for worker to initialize (especially when AMD\n          // loader is used). We will try to send test immediately, and then\n          // when 'ready' message will arrive. The worker shall process only\n          // first received 'test'.\n          sendTest();\n          return;\n        } catch (e) {\n          info('The worker has been disabled.');\n        }\n      }\n      // Either workers are disabled, not supported or have thrown an exception.\n      // Thus, we fallback to a faked worker.\n      this._setupFakeWorker();\n    },\n\n    _setupFakeWorker: function PDFWorker_setupFakeWorker() {\n      if (!isWorkerDisabled) {\n        warn('Setting up fake worker.');\n        isWorkerDisabled = true;\n      }\n\n      setupFakeWorkerGlobal().then((WorkerMessageHandler) => {\n        if (this.destroyed) {\n          this._readyCapability.reject(new Error('Worker was destroyed'));\n          return;\n        }\n        let port = new LoopbackPort();\n        this._port = port;\n\n        // All fake workers use the same port, making id unique.\n        var id = 'fake' + (nextFakeWorkerId++);\n\n        // If the main thread is our worker, setup the handling for the\n        // messages -- the main thread sends to it self.\n        var workerHandler = new MessageHandler(id + '_worker', id, port);\n        WorkerMessageHandler.setup(workerHandler, port);\n\n        var messageHandler = new MessageHandler(id, id + '_worker', port);\n        this._messageHandler = messageHandler;\n        this._readyCapability.resolve();\n      }).catch((reason) => {\n        this._readyCapability.reject(\n          new Error(`Setting up fake worker failed: \"${reason.message}\".`));\n      });\n    },\n\n    /**\n     * Destroys the worker instance.\n     */\n    destroy: function PDFWorker_destroy() {\n      this.destroyed = true;\n      if (this._webWorker) {\n        // We need to terminate only web worker created resource.\n        this._webWorker.terminate();\n        this._webWorker = null;\n      }\n      pdfWorkerPorts.delete(this._port);\n      this._port = null;\n      if (this._messageHandler) {\n        this._messageHandler.destroy();\n        this._messageHandler = null;\n      }\n    },\n  };\n\n  /**\n   * @param {PDFWorkerParameters} params - The worker initialization parameters.\n   */\n  PDFWorker.fromPort = function(params) {\n    if (!params || !params.port) {\n      throw new Error('PDFWorker.fromPort - invalid method signature.');\n    }\n    if (pdfWorkerPorts.has(params.port)) {\n      return pdfWorkerPorts.get(params.port);\n    }\n    return new PDFWorker(params);\n  };\n\n  PDFWorker.getWorkerSrc = function() {\n    return getWorkerSrc();\n  };\n\n  return PDFWorker;\n})();\n\n/**\n * For internal use only.\n * @ignore\n */\nclass WorkerTransport {\n  constructor(messageHandler, loadingTask, networkStream, params) {\n    this.messageHandler = messageHandler;\n    this.loadingTask = loadingTask;\n    this.commonObjs = new PDFObjects();\n    this.fontLoader = new FontLoader(loadingTask.docId);\n    this._params = params;\n    this.CMapReaderFactory = new params.CMapReaderFactory({\n      baseUrl: params.cMapUrl,\n      isCompressed: params.cMapPacked,\n    });\n\n    this.destroyed = false;\n    this.destroyCapability = null;\n    this._passwordCapability = null;\n\n    this._networkStream = networkStream;\n    this._fullReader = null;\n    this._lastProgress = null;\n\n    this.pageCache = [];\n    this.pagePromises = [];\n    this.downloadInfoCapability = createPromiseCapability();\n\n    this.setupMessageHandler();\n  }\n\n  destroy() {\n    if (this.destroyCapability) {\n      return this.destroyCapability.promise;\n    }\n\n    this.destroyed = true;\n    this.destroyCapability = createPromiseCapability();\n\n    if (this._passwordCapability) {\n      this._passwordCapability.reject(\n        new Error('Worker was destroyed during onPassword callback'));\n    }\n\n    const waitOn = [];\n    // We need to wait for all renderings to be completed, e.g.\n    // timeout/rAF can take a long time.\n    this.pageCache.forEach(function(page) {\n      if (page) {\n        waitOn.push(page._destroy());\n      }\n    });\n    this.pageCache = [];\n    this.pagePromises = [];\n    // We also need to wait for the worker to finish its long running tasks.\n    const terminated = this.messageHandler.sendWithPromise('Terminate', null);\n    waitOn.push(terminated);\n    Promise.all(waitOn).then(() => {\n      this.fontLoader.clear();\n      if (this._networkStream) {\n        this._networkStream.cancelAllRequests();\n      }\n\n      if (this.messageHandler) {\n        this.messageHandler.destroy();\n        this.messageHandler = null;\n      }\n      this.destroyCapability.resolve();\n    }, this.destroyCapability.reject);\n    return this.destroyCapability.promise;\n  }\n\n  setupMessageHandler() {\n    const { messageHandler, loadingTask, } = this;\n\n    messageHandler.on('GetReader', function(data, sink) {\n      assert(this._networkStream);\n      this._fullReader = this._networkStream.getFullReader();\n      this._fullReader.onProgress = (evt) => {\n        this._lastProgress = {\n          loaded: evt.loaded,\n          total: evt.total,\n        };\n      };\n      sink.onPull = () => {\n        this._fullReader.read().then(function({ value, done, }) {\n          if (done) {\n            sink.close();\n            return;\n          }\n          assert(isArrayBuffer(value));\n          // Enqueue data chunk into sink, and transfer it\n          // to other side as `Transferable` object.\n          sink.enqueue(new Uint8Array(value), 1, [value]);\n        }).catch((reason) => {\n          sink.error(reason);\n        });\n      };\n\n      sink.onCancel = (reason) => {\n        this._fullReader.cancel(reason);\n      };\n    }, this);\n\n    messageHandler.on('ReaderHeadersReady', function(data) {\n      const headersCapability = createPromiseCapability();\n      const fullReader = this._fullReader;\n      fullReader.headersReady.then(() => {\n        // If stream or range are disabled, it's our only way to report\n        // loading progress.\n        if (!fullReader.isStreamingSupported || !fullReader.isRangeSupported) {\n          if (this._lastProgress && loadingTask.onProgress) {\n            loadingTask.onProgress(this._lastProgress);\n          }\n          fullReader.onProgress = (evt) => {\n            if (loadingTask.onProgress) {\n              loadingTask.onProgress({\n                loaded: evt.loaded,\n                total: evt.total,\n              });\n            }\n          };\n        }\n\n        headersCapability.resolve({\n          isStreamingSupported: fullReader.isStreamingSupported,\n          isRangeSupported: fullReader.isRangeSupported,\n          contentLength: fullReader.contentLength,\n        });\n      }, headersCapability.reject);\n\n      return headersCapability.promise;\n    }, this);\n\n    messageHandler.on('GetRangeReader', function(data, sink) {\n      assert(this._networkStream);\n      const rangeReader =\n        this._networkStream.getRangeReader(data.begin, data.end);\n\n      sink.onPull = () => {\n        rangeReader.read().then(function({ value, done, }) {\n          if (done) {\n            sink.close();\n            return;\n          }\n          assert(isArrayBuffer(value));\n          sink.enqueue(new Uint8Array(value), 1, [value]);\n        }).catch((reason) => {\n          sink.error(reason);\n        });\n      };\n\n      sink.onCancel = (reason) => {\n        rangeReader.cancel(reason);\n      };\n    }, this);\n\n    messageHandler.on('GetDoc', function({ pdfInfo, }) {\n      this.numPages = pdfInfo.numPages;\n      this.pdfDocument = new PDFDocumentProxy(pdfInfo, this, loadingTask);\n      loadingTask._capability.resolve(this.pdfDocument);\n    }, this);\n\n    messageHandler.on('PasswordRequest', function(exception) {\n      this._passwordCapability = createPromiseCapability();\n\n      if (loadingTask.onPassword) {\n        const updatePassword = (password) => {\n          this._passwordCapability.resolve({\n            password,\n          });\n        };\n        try {\n          loadingTask.onPassword(updatePassword, exception.code);\n        } catch (ex) {\n          this._passwordCapability.reject(ex);\n        }\n      } else {\n        this._passwordCapability.reject(\n          new PasswordException(exception.message, exception.code));\n      }\n      return this._passwordCapability.promise;\n    }, this);\n\n    messageHandler.on('PasswordException', function(exception) {\n      loadingTask._capability.reject(\n        new PasswordException(exception.message, exception.code));\n    }, this);\n\n    messageHandler.on('InvalidPDF', function(exception) {\n      loadingTask._capability.reject(\n        new InvalidPDFException(exception.message));\n    }, this);\n\n    messageHandler.on('MissingPDF', function(exception) {\n      loadingTask._capability.reject(\n        new MissingPDFException(exception.message));\n    }, this);\n\n    messageHandler.on('UnexpectedResponse', function(exception) {\n      loadingTask._capability.reject(\n        new UnexpectedResponseException(exception.message, exception.status));\n    }, this);\n\n    messageHandler.on('UnknownError', function(exception) {\n      loadingTask._capability.reject(\n        new UnknownErrorException(exception.message, exception.details));\n    }, this);\n\n    messageHandler.on('DataLoaded', function(data) {\n      // For consistency: Ensure that progress is always reported when the\n      // entire PDF file has been loaded, regardless of how it was fetched.\n      if (loadingTask.onProgress) {\n        loadingTask.onProgress({\n          loaded: data.length,\n          total: data.length,\n        });\n      }\n      this.downloadInfoCapability.resolve(data);\n    }, this);\n\n    messageHandler.on('StartRenderPage', function(data) {\n      if (this.destroyed) {\n        return; // Ignore any pending requests if the worker was terminated.\n      }\n\n      const page = this.pageCache[data.pageIndex];\n      page._stats.timeEnd('Page Request');\n      page._startRenderPage(data.transparency, data.intent);\n    }, this);\n\n    messageHandler.on('RenderPageChunk', function(data) {\n      if (this.destroyed) {\n        return; // Ignore any pending requests if the worker was terminated.\n      }\n\n      const page = this.pageCache[data.pageIndex];\n      page._renderPageChunk(data.operatorList, data.intent);\n    }, this);\n\n    messageHandler.on('commonobj', function(data) {\n      if (this.destroyed) {\n        return; // Ignore any pending requests if the worker was terminated.\n      }\n\n      const [id, type, exportedData] = data;\n      if (this.commonObjs.hasData(id)) {\n        return;\n      }\n\n      switch (type) {\n        case 'Font':\n          const params = this._params;\n\n          if ('error' in exportedData) {\n            const exportedError = exportedData.error;\n            warn(`Error during font loading: ${exportedError}`);\n            this.commonObjs.resolve(id, exportedError);\n            break;\n          }\n\n          let fontRegistry = null;\n          if (params.pdfBug && globalScope.FontInspector &&\n              globalScope.FontInspector.enabled) {\n            fontRegistry = {\n              registerFont(font, url) {\n                globalScope['FontInspector'].fontAdded(font, url);\n              },\n            };\n          }\n          const font = new FontFaceObject(exportedData, {\n            isEvalSupported: params.isEvalSupported,\n            disableFontFace: params.disableFontFace,\n            ignoreErrors: params.ignoreErrors,\n            onUnsupportedFeature: this._onUnsupportedFeature.bind(this),\n            fontRegistry,\n          });\n          const fontReady = (fontObjs) => {\n            this.commonObjs.resolve(id, font);\n          };\n\n          this.fontLoader.bind([font], fontReady);\n          break;\n        case 'FontPath':\n          this.commonObjs.resolve(id, exportedData);\n          break;\n        default:\n          throw new Error(`Got unknown common object type ${type}`);\n      }\n    }, this);\n\n    messageHandler.on('obj', function(data) {\n      if (this.destroyed) {\n        return; // Ignore any pending requests if the worker was terminated.\n      }\n\n      const [id, pageIndex, type, imageData] = data;\n      const pageProxy = this.pageCache[pageIndex];\n      if (pageProxy.objs.hasData(id)) {\n        return;\n      }\n\n      switch (type) {\n        case 'JpegStream':\n          return new Promise((resolve, reject) => {\n            const img = new Image();\n            img.onload = function() {\n              resolve(img);\n            };\n            img.onerror = function() {\n              reject(new Error('Error during JPEG image loading'));\n              // Note that when the browser image loading/decoding fails,\n              // we'll fallback to the built-in PDF.js JPEG decoder; see\n              // `PartialEvaluator.buildPaintImageXObject` in the\n              // `src/core/evaluator.js` file.\n            };\n            img.src = imageData;\n          }).then((img) => {\n            pageProxy.objs.resolve(id, img);\n          });\n        case 'Image':\n          pageProxy.objs.resolve(id, imageData);\n\n          // Heuristic that will allow us not to store large data.\n          const MAX_IMAGE_SIZE_TO_STORE = 8000000;\n          if (imageData && 'data' in imageData &&\n              imageData.data.length > MAX_IMAGE_SIZE_TO_STORE) {\n            pageProxy.cleanupAfterRender = true;\n          }\n          break;\n        default:\n          throw new Error(`Got unknown object type ${type}`);\n      }\n    }, this);\n\n    messageHandler.on('DocProgress', function(data) {\n      if (this.destroyed) {\n        return; // Ignore any pending requests if the worker was terminated.\n      }\n\n      if (loadingTask.onProgress) {\n        loadingTask.onProgress({\n          loaded: data.loaded,\n          total: data.total,\n        });\n      }\n    }, this);\n\n    messageHandler.on('PageError', function(data) {\n      if (this.destroyed) {\n        return; // Ignore any pending requests if the worker was terminated.\n      }\n\n      const page = this.pageCache[data.pageNum - 1];\n      const intentState = page.intentStates[data.intent];\n\n      if (intentState.displayReadyCapability) {\n        intentState.displayReadyCapability.reject(data.error);\n      } else {\n        throw new Error(data.error);\n      }\n\n      if (intentState.operatorList) {\n        // Mark operator list as complete.\n        intentState.operatorList.lastChunk = true;\n        for (let i = 0; i < intentState.renderTasks.length; i++) {\n          intentState.renderTasks[i].operatorListChanged();\n        }\n      }\n    }, this);\n\n    messageHandler.on('UnsupportedFeature', this._onUnsupportedFeature, this);\n\n    messageHandler.on('JpegDecode', function(data) {\n      if (this.destroyed) {\n        return Promise.reject(new Error('Worker was destroyed'));\n      }\n\n      if (typeof document === 'undefined') {\n        // Make sure that this code is not executing in node.js, as\n        // it's using DOM image, and there is no library to support that.\n        return Promise.reject(new Error('\"document\" is not defined.'));\n      }\n\n      const [imageUrl, components] = data;\n      if (components !== 3 && components !== 1) {\n        return Promise.reject(\n          new Error('Only 3 components or 1 component can be returned'));\n      }\n\n      return new Promise(function (resolve, reject) {\n        const img = new Image();\n        img.onload = function () {\n          const width = img.width;\n          const height = img.height;\n          const size = width * height;\n          const rgbaLength = size * 4;\n          const buf = new Uint8ClampedArray(size * components);\n          const tmpCanvas = document.createElement('canvas');\n          tmpCanvas.width = width;\n          tmpCanvas.height = height;\n          const tmpCtx = tmpCanvas.getContext('2d');\n          tmpCtx.drawImage(img, 0, 0);\n          const data = tmpCtx.getImageData(0, 0, width, height).data;\n\n          if (components === 3) {\n            for (let i = 0, j = 0; i < rgbaLength; i += 4, j += 3) {\n              buf[j] = data[i];\n              buf[j + 1] = data[i + 1];\n              buf[j + 2] = data[i + 2];\n            }\n          } else if (components === 1) {\n            for (let i = 0, j = 0; i < rgbaLength; i += 4, j++) {\n              buf[j] = data[i];\n            }\n          }\n          resolve({ data: buf, width, height, });\n        };\n        img.onerror = function () {\n          reject(new Error('JpegDecode failed to load image'));\n        };\n        img.src = imageUrl;\n      });\n    }, this);\n\n    messageHandler.on('FetchBuiltInCMap', function(data) {\n      if (this.destroyed) {\n        return Promise.reject(new Error('Worker was destroyed'));\n      }\n      return this.CMapReaderFactory.fetch({\n        name: data.name,\n      });\n    }, this);\n  }\n\n  _onUnsupportedFeature({ featureId, }) {\n    if (this.destroyed) {\n      return; // Ignore any pending requests if the worker was terminated.\n    }\n    if (this.loadingTask.onUnsupportedFeature) {\n      this.loadingTask.onUnsupportedFeature(featureId);\n    }\n  }\n\n  getData() {\n    return this.messageHandler.sendWithPromise('GetData', null);\n  }\n\n  getPage(pageNumber) {\n    if (!Number.isInteger(pageNumber) ||\n        pageNumber <= 0 || pageNumber > this.numPages) {\n      return Promise.reject(new Error('Invalid page request'));\n    }\n\n    const pageIndex = pageNumber - 1;\n    if (pageIndex in this.pagePromises) {\n      return this.pagePromises[pageIndex];\n    }\n    const promise = this.messageHandler.sendWithPromise('GetPage', {\n      pageIndex,\n    }).then((pageInfo) => {\n      if (this.destroyed) {\n        throw new Error('Transport destroyed');\n      }\n      const page = new PDFPageProxy(pageIndex, pageInfo, this,\n                                    this._params.pdfBug);\n      this.pageCache[pageIndex] = page;\n      return page;\n    });\n    this.pagePromises[pageIndex] = promise;\n    return promise;\n  }\n\n  getPageIndex(ref) {\n    return this.messageHandler.sendWithPromise('GetPageIndex', {\n      ref,\n    }).catch(function(reason) {\n      return Promise.reject(new Error(reason));\n    });\n  }\n\n  getAnnotations(pageIndex, intent) {\n    return this.messageHandler.sendWithPromise('GetAnnotations', {\n      pageIndex,\n      intent,\n    });\n  }\n\n  getDestinations() {\n    return this.messageHandler.sendWithPromise('GetDestinations', null);\n  }\n\n  getDestination(id) {\n    if (typeof id !== 'string') {\n      return Promise.reject(new Error('Invalid destination request.'));\n    }\n    return this.messageHandler.sendWithPromise('GetDestination', {\n      id,\n    });\n  }\n\n  getPageLabels() {\n    return this.messageHandler.sendWithPromise('GetPageLabels', null);\n  }\n\n  getPageMode() {\n    return this.messageHandler.sendWithPromise('GetPageMode', null);\n  }\n\n  getAttachments() {\n    return this.messageHandler.sendWithPromise('GetAttachments', null);\n  }\n\n  getJavaScript() {\n    return this.messageHandler.sendWithPromise('GetJavaScript', null);\n  }\n\n  getOutline() {\n    return this.messageHandler.sendWithPromise('GetOutline', null);\n  }\n\n  getPermissions() {\n    return this.messageHandler.sendWithPromise('GetPermissions', null);\n  }\n\n  getMetadata() {\n    return this.messageHandler.sendWithPromise('GetMetadata', null).\n        then((results) => {\n      return {\n        info: results[0],\n        metadata: (results[1] ? new Metadata(results[1]) : null),\n        contentDispositionFilename: (this._fullReader ?\n                                     this._fullReader.filename : null),\n      };\n    });\n  }\n\n  getStats() {\n    return this.messageHandler.sendWithPromise('GetStats', null);\n  }\n\n  startCleanup() {\n    this.messageHandler.sendWithPromise('Cleanup', null).then(() => {\n      for (let i = 0, ii = this.pageCache.length; i < ii; i++) {\n        const page = this.pageCache[i];\n        if (page) {\n          page.cleanup();\n        }\n      }\n      this.commonObjs.clear();\n      this.fontLoader.clear();\n    });\n  }\n\n  get loadingParams() {\n    const params = this._params;\n    return shadow(this, 'loadingParams', {\n      disableAutoFetch: params.disableAutoFetch,\n      disableCreateObjectURL: params.disableCreateObjectURL,\n      disableFontFace: params.disableFontFace,\n      nativeImageDecoderSupport: params.nativeImageDecoderSupport,\n    });\n  }\n}\n\n/**\n * A PDF document and page is built of many objects. E.g. there are objects\n * for fonts, images, rendering code and such. These objects might get processed\n * inside of a worker. The `PDFObjects` implements some basic functions to\n * manage these objects.\n * @ignore\n */\nvar PDFObjects = (function PDFObjectsClosure() {\n  function PDFObjects() {\n    this.objs = Object.create(null);\n  }\n\n  PDFObjects.prototype = {\n    /**\n     * Internal function.\n     * Ensures there is an object defined for `objId`.\n     */\n    ensureObj: function PDFObjects_ensureObj(objId) {\n      if (this.objs[objId]) {\n        return this.objs[objId];\n      }\n\n      var obj = {\n        capability: createPromiseCapability(),\n        data: null,\n        resolved: false,\n      };\n      this.objs[objId] = obj;\n\n      return obj;\n    },\n\n    /**\n     * If called *without* callback, this returns the data of `objId` but the\n     * object needs to be resolved. If it isn't, this function throws.\n     *\n     * If called *with* a callback, the callback is called with the data of the\n     * object once the object is resolved. That means, if you call this\n     * function and the object is already resolved, the callback gets called\n     * right away.\n     */\n    get: function PDFObjects_get(objId, callback) {\n      // If there is a callback, then the get can be async and the object is\n      // not required to be resolved right now\n      if (callback) {\n        this.ensureObj(objId).capability.promise.then(callback);\n        return null;\n      }\n\n      // If there isn't a callback, the user expects to get the resolved data\n      // directly.\n      var obj = this.objs[objId];\n\n      // If there isn't an object yet or the object isn't resolved, then the\n      // data isn't ready yet!\n      if (!obj || !obj.resolved) {\n        throw new Error(`Requesting object that isn't resolved yet ${objId}`);\n      }\n\n      return obj.data;\n    },\n\n    /**\n     * Resolves the object `objId` with optional `data`.\n     */\n    resolve: function PDFObjects_resolve(objId, data) {\n      var obj = this.ensureObj(objId);\n\n      obj.resolved = true;\n      obj.data = data;\n      obj.capability.resolve(data);\n    },\n\n    isResolved: function PDFObjects_isResolved(objId) {\n      var objs = this.objs;\n\n      if (!objs[objId]) {\n        return false;\n      }\n      return objs[objId].resolved;\n    },\n\n    hasData: function PDFObjects_hasData(objId) {\n      return this.isResolved(objId);\n    },\n\n    /**\n     * Returns the data of `objId` if object exists, null otherwise.\n     */\n    getData: function PDFObjects_getData(objId) {\n      var objs = this.objs;\n      if (!objs[objId] || !objs[objId].resolved) {\n        return null;\n      }\n      return objs[objId].data;\n    },\n\n    clear: function PDFObjects_clear() {\n      this.objs = Object.create(null);\n    },\n  };\n  return PDFObjects;\n})();\n\n/**\n * Allows controlling of the rendering tasks.\n * @class\n * @alias RenderTask\n */\nvar RenderTask = (function RenderTaskClosure() {\n  function RenderTask(internalRenderTask) {\n    this._internalRenderTask = internalRenderTask;\n\n    /**\n     * Callback for incremental rendering -- a function that will be called\n     * each time the rendering is paused.  To continue rendering call the\n     * function that is the first argument to the callback.\n     * @type {function}\n     */\n    this.onContinue = null;\n  }\n\n  RenderTask.prototype = /** @lends RenderTask.prototype */ {\n    /**\n     * Promise for rendering task completion.\n     * @return {Promise}\n     */\n    get promise() {\n      return this._internalRenderTask.capability.promise;\n    },\n\n    /**\n     * Cancels the rendering task. If the task is currently rendering it will\n     * not be cancelled until graphics pauses with a timeout. The promise that\n     * this object extends will be rejected when cancelled.\n     */\n    cancel: function RenderTask_cancel() {\n      this._internalRenderTask.cancel();\n    },\n\n    /**\n     * Registers callbacks to indicate the rendering task completion.\n     *\n     * @param {function} onFulfilled The callback for the rendering completion.\n     * @param {function} onRejected The callback for the rendering failure.\n     * @return {Promise} A promise that is resolved after the onFulfilled or\n     *                   onRejected callback.\n     */\n    then: function RenderTask_then(onFulfilled, onRejected) {\n      return this.promise.then.apply(this.promise, arguments);\n    },\n  };\n\n  return RenderTask;\n})();\n\n/**\n * For internal use only.\n * @ignore\n */\nvar InternalRenderTask = (function InternalRenderTaskClosure() {\n  let canvasInRendering = new WeakMap();\n\n  function InternalRenderTask(callback, params, objs, commonObjs, operatorList,\n                              pageNumber, canvasFactory, webGLContext,\n                              pdfBug = false) {\n    this.callback = callback;\n    this.params = params;\n    this.objs = objs;\n    this.commonObjs = commonObjs;\n    this.operatorListIdx = null;\n    this.operatorList = operatorList;\n    this.pageNumber = pageNumber;\n    this.canvasFactory = canvasFactory;\n    this.webGLContext = webGLContext;\n    this._pdfBug = pdfBug;\n\n    this.running = false;\n    this.graphicsReadyCallback = null;\n    this.graphicsReady = false;\n    this.useRequestAnimationFrame = false;\n    this.cancelled = false;\n    this.capability = createPromiseCapability();\n    this.task = new RenderTask(this);\n    // caching this-bound methods\n    this._continueBound = this._continue.bind(this);\n    this._scheduleNextBound = this._scheduleNext.bind(this);\n    this._nextBound = this._next.bind(this);\n    this._canvas = params.canvasContext.canvas;\n  }\n\n  InternalRenderTask.prototype = {\n\n    initializeGraphics(transparency) {\n      if (this.cancelled) {\n        return;\n      }\n      if (this._canvas) {\n        if (canvasInRendering.has(this._canvas)) {\n          throw new Error(\n            'Cannot use the same canvas during multiple render() operations. ' +\n            'Use different canvas or ensure previous operations were ' +\n            'cancelled or completed.');\n        }\n        canvasInRendering.set(this._canvas, this);\n      }\n\n      if (this._pdfBug && globalScope.StepperManager &&\n          globalScope.StepperManager.enabled) {\n        this.stepper = globalScope.StepperManager.create(this.pageNumber - 1);\n        this.stepper.init(this.operatorList);\n        this.stepper.nextBreakPoint = this.stepper.getNextBreakPoint();\n      }\n\n      var params = this.params;\n      this.gfx = new CanvasGraphics(params.canvasContext, this.commonObjs,\n                                    this.objs, this.canvasFactory,\n                                    this.webGLContext, params.imageLayer);\n\n      this.gfx.beginDrawing({\n        transform: params.transform,\n        viewport: params.viewport,\n        transparency,\n        background: params.background,\n      });\n      this.operatorListIdx = 0;\n      this.graphicsReady = true;\n      if (this.graphicsReadyCallback) {\n        this.graphicsReadyCallback();\n      }\n    },\n\n    cancel: function InternalRenderTask_cancel() {\n      this.running = false;\n      this.cancelled = true;\n      if (this._canvas) {\n        canvasInRendering.delete(this._canvas);\n      }\n      this.callback(new RenderingCancelledException(\n        'Rendering cancelled, page ' + this.pageNumber, 'canvas'));\n    },\n\n    operatorListChanged: function InternalRenderTask_operatorListChanged() {\n      if (!this.graphicsReady) {\n        if (!this.graphicsReadyCallback) {\n          this.graphicsReadyCallback = this._continueBound;\n        }\n        return;\n      }\n\n      if (this.stepper) {\n        this.stepper.updateOperatorList(this.operatorList);\n      }\n\n      if (this.running) {\n        return;\n      }\n      this._continue();\n    },\n\n    _continue: function InternalRenderTask__continue() {\n      this.running = true;\n      if (this.cancelled) {\n        return;\n      }\n      if (this.task.onContinue) {\n        this.task.onContinue(this._scheduleNextBound);\n      } else {\n        this._scheduleNext();\n      }\n    },\n\n    _scheduleNext: function InternalRenderTask__scheduleNext() {\n      if (this.useRequestAnimationFrame && typeof window !== 'undefined') {\n        window.requestAnimationFrame(() => {\n          this._nextBound().catch(this.callback);\n        });\n      } else {\n        Promise.resolve().then(this._nextBound).catch(this.callback);\n      }\n    },\n\n    _next: function InternalRenderTask__next() {\n      return new Promise(() => {\n        if (this.cancelled) {\n          return;\n        }\n        this.operatorListIdx = this.gfx.executeOperatorList(this.operatorList,\n                                          this.operatorListIdx,\n                                          this._continueBound,\n                                          this.stepper);\n        if (this.operatorListIdx === this.operatorList.argsArray.length) {\n          this.running = false;\n          if (this.operatorList.lastChunk) {\n            this.gfx.endDrawing();\n            if (this._canvas) {\n              canvasInRendering.delete(this._canvas);\n            }\n            this.callback();\n          }\n        }\n      });\n    },\n\n  };\n\n  return InternalRenderTask;\n})();\n\nvar version, build;\nif (typeof PDFJSDev !== 'undefined') {\n  version = PDFJSDev.eval('BUNDLE_VERSION');\n  build = PDFJSDev.eval('BUNDLE_BUILD');\n}\n\nexport {\n  getDocument,\n  LoopbackPort,\n  PDFDataRangeTransport,\n  PDFWorker,\n  PDFDocumentProxy,\n  PDFPageProxy,\n  setPDFNetworkStreamFactory,\n  version,\n  build,\n};\n","/* Copyright 2015 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  assert, CMapCompressionType, removeNullCharacters, stringToBytes,\n  unreachable, Util, warn\n} from '../shared/util';\n\nconst DEFAULT_LINK_REL = 'noopener noreferrer nofollow';\nconst SVG_NS = 'http://www.w3.org/2000/svg';\n\nclass DOMCanvasFactory {\n  create(width, height) {\n    if (width <= 0 || height <= 0) {\n      throw new Error('invalid canvas size');\n    }\n    let canvas = document.createElement('canvas');\n    let context = canvas.getContext('2d');\n    canvas.width = width;\n    canvas.height = height;\n    return {\n      canvas,\n      context,\n    };\n  }\n\n  reset(canvasAndContext, width, height) {\n    if (!canvasAndContext.canvas) {\n      throw new Error('canvas is not specified');\n    }\n    if (width <= 0 || height <= 0) {\n      throw new Error('invalid canvas size');\n    }\n    canvasAndContext.canvas.width = width;\n    canvasAndContext.canvas.height = height;\n  }\n\n  destroy(canvasAndContext) {\n    if (!canvasAndContext.canvas) {\n      throw new Error('canvas is not specified');\n    }\n    // Zeroing the width and height cause Firefox to release graphics\n    // resources immediately, which can greatly reduce memory consumption.\n    canvasAndContext.canvas.width = 0;\n    canvasAndContext.canvas.height = 0;\n    canvasAndContext.canvas = null;\n    canvasAndContext.context = null;\n  }\n}\n\nclass DOMCMapReaderFactory {\n  constructor({ baseUrl = null, isCompressed = false, }) {\n    this.baseUrl = baseUrl;\n    this.isCompressed = isCompressed;\n  }\n\n  fetch({ name, }) {\n    if (!this.baseUrl) {\n      return Promise.reject(new Error(\n        'The CMap \"baseUrl\" parameter must be specified, ensure that ' +\n        'the \"cMapUrl\" and \"cMapPacked\" API parameters are provided.'));\n    }\n    if (!name) {\n      return Promise.reject(new Error('CMap name must be specified.'));\n    }\n    return new Promise((resolve, reject) => {\n      let url = this.baseUrl + name + (this.isCompressed ? '.bcmap' : '');\n\n      let request = new XMLHttpRequest();\n      request.open('GET', url, true);\n\n      if (this.isCompressed) {\n        request.responseType = 'arraybuffer';\n      }\n      request.onreadystatechange = () => {\n        if (request.readyState !== XMLHttpRequest.DONE) {\n          return;\n        }\n        if (request.status === 200 || request.status === 0) {\n          let data;\n          if (this.isCompressed && request.response) {\n            data = new Uint8Array(request.response);\n          } else if (!this.isCompressed && request.responseText) {\n            data = stringToBytes(request.responseText);\n          }\n          if (data) {\n            resolve({\n              cMapData: data,\n              compressionType: this.isCompressed ?\n                CMapCompressionType.BINARY : CMapCompressionType.NONE,\n            });\n            return;\n          }\n        }\n        reject(new Error('Unable to load ' +\n                         (this.isCompressed ? 'binary ' : '') +\n                         'CMap at: ' + url));\n      };\n\n      request.send(null);\n    });\n  }\n}\n\nclass DOMSVGFactory {\n  create(width, height) {\n    assert(width > 0 && height > 0, 'Invalid SVG dimensions');\n\n    let svg = document.createElementNS(SVG_NS, 'svg:svg');\n    svg.setAttribute('version', '1.1');\n    svg.setAttribute('width', width + 'px');\n    svg.setAttribute('height', height + 'px');\n    svg.setAttribute('preserveAspectRatio', 'none');\n    svg.setAttribute('viewBox', '0 0 ' + width + ' ' + height);\n\n    return svg;\n  }\n\n  createElement(type) {\n    assert(typeof type === 'string', 'Invalid SVG element type');\n\n    return document.createElementNS(SVG_NS, type);\n  }\n}\n\n/**\n * @typedef {Object} PageViewportParameters\n * @property {Array} viewBox - The xMin, yMin, xMax and yMax coordinates.\n * @property {number} scale - The scale of the viewport.\n * @property {number} rotation - The rotation, in degrees, of the viewport.\n * @property {number} offsetX - (optional) The vertical, i.e. x-axis, offset.\n *   The default value is `0`.\n * @property {number} offsetY - (optional) The horizontal, i.e. y-axis, offset.\n *   The default value is `0`.\n * @property {boolean} dontFlip - (optional) If true, the x-axis will not be\n *   flipped. The default value is `false`.\n */\n\n/**\n * @typedef {Object} PageViewportCloneParameters\n * @property {number} scale - (optional) The scale, overriding the one in the\n *   cloned viewport. The default value is `this.scale`.\n * @property {number} rotation - (optional) The rotation, in degrees, overriding\n *   the one in the cloned viewport. The default value is `this.rotation`.\n * @property {boolean} dontFlip - (optional) If true, the x-axis will not be\n *   flipped. The default value is `false`.\n */\n\n/**\n * PDF page viewport created based on scale, rotation and offset.\n */\nclass PageViewport {\n  /**\n   * @param {PageViewportParameters}\n   */\n  constructor({ viewBox, scale, rotation, offsetX = 0, offsetY = 0,\n                dontFlip = false, }) {\n    this.viewBox = viewBox;\n    this.scale = scale;\n    this.rotation = rotation;\n    this.offsetX = offsetX;\n    this.offsetY = offsetY;\n\n    // creating transform to convert pdf coordinate system to the normal\n    // canvas like coordinates taking in account scale and rotation\n    let centerX = (viewBox[2] + viewBox[0]) / 2;\n    let centerY = (viewBox[3] + viewBox[1]) / 2;\n    let rotateA, rotateB, rotateC, rotateD;\n    rotation = rotation % 360;\n    rotation = rotation < 0 ? rotation + 360 : rotation;\n    switch (rotation) {\n      case 180:\n        rotateA = -1; rotateB = 0; rotateC = 0; rotateD = 1;\n        break;\n      case 90:\n        rotateA = 0; rotateB = 1; rotateC = 1; rotateD = 0;\n        break;\n      case 270:\n        rotateA = 0; rotateB = -1; rotateC = -1; rotateD = 0;\n        break;\n      // case 0:\n      default:\n        rotateA = 1; rotateB = 0; rotateC = 0; rotateD = -1;\n        break;\n    }\n\n    if (dontFlip) {\n      rotateC = -rotateC; rotateD = -rotateD;\n    }\n\n    let offsetCanvasX, offsetCanvasY;\n    let width, height;\n    if (rotateA === 0) {\n      offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX;\n      offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY;\n      width = Math.abs(viewBox[3] - viewBox[1]) * scale;\n      height = Math.abs(viewBox[2] - viewBox[0]) * scale;\n    } else {\n      offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX;\n      offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY;\n      width = Math.abs(viewBox[2] - viewBox[0]) * scale;\n      height = Math.abs(viewBox[3] - viewBox[1]) * scale;\n    }\n    // creating transform for the following operations:\n    // translate(-centerX, -centerY), rotate and flip vertically,\n    // scale, and translate(offsetCanvasX, offsetCanvasY)\n    this.transform = [\n      rotateA * scale,\n      rotateB * scale,\n      rotateC * scale,\n      rotateD * scale,\n      offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY,\n      offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY\n    ];\n\n    this.width = width;\n    this.height = height;\n  }\n\n  /**\n   * Clones viewport, with optional additional properties.\n   * @param {PageViewportCloneParameters} - (optional)\n   * @return {PageViewport} Cloned viewport.\n   */\n  clone({ scale = this.scale, rotation = this.rotation,\n          dontFlip = false, } = {}) {\n    return new PageViewport({\n      viewBox: this.viewBox.slice(),\n      scale,\n      rotation,\n      offsetX: this.offsetX,\n      offsetY: this.offsetY,\n      dontFlip,\n    });\n  }\n\n  /**\n   * Converts PDF point to the viewport coordinates. For examples, useful for\n   * converting PDF location into canvas pixel coordinates.\n   * @param {number} x - The x-coordinate.\n   * @param {number} y - The y-coordinate.\n   * @return {Object} Object containing `x` and `y` properties of the\n   *   point in the viewport coordinate space.\n   * @see {@link convertToPdfPoint}\n   * @see {@link convertToViewportRectangle}\n   */\n  convertToViewportPoint(x, y) {\n    return Util.applyTransform([x, y], this.transform);\n  }\n\n  /**\n   * Converts PDF rectangle to the viewport coordinates.\n   * @param {Array} rect - The xMin, yMin, xMax and yMax coordinates.\n   * @return {Array} Array containing corresponding coordinates of the rectangle\n   *   in the viewport coordinate space.\n   * @see {@link convertToViewportPoint}\n   */\n  convertToViewportRectangle(rect) {\n    let tl = Util.applyTransform([rect[0], rect[1]], this.transform);\n    let br = Util.applyTransform([rect[2], rect[3]], this.transform);\n    return [tl[0], tl[1], br[0], br[1]];\n  }\n\n  /**\n   * Converts viewport coordinates to the PDF location. For examples, useful\n   * for converting canvas pixel location into PDF one.\n   * @param {number} x - The x-coordinate.\n   * @param {number} y - The y-coordinate.\n   * @return {Object} Object containing `x` and `y` properties of the\n   *   point in the PDF coordinate space.\n   * @see {@link convertToViewportPoint}\n   */\n  convertToPdfPoint(x, y) {\n    return Util.applyInverseTransform([x, y], this.transform);\n  }\n}\n\nvar RenderingCancelledException = (function RenderingCancelledException() {\n  function RenderingCancelledException(msg, type) {\n    this.message = msg;\n    this.type = type;\n  }\n\n  RenderingCancelledException.prototype = new Error();\n  RenderingCancelledException.prototype.name = 'RenderingCancelledException';\n  RenderingCancelledException.constructor = RenderingCancelledException;\n\n  return RenderingCancelledException;\n})();\n\nconst LinkTarget = {\n  NONE: 0, // Default value.\n  SELF: 1,\n  BLANK: 2,\n  PARENT: 3,\n  TOP: 4,\n};\n\nconst LinkTargetStringMap = [\n  '',\n  '_self',\n  '_blank',\n  '_parent',\n  '_top'\n];\n\n/**\n * @typedef ExternalLinkParameters\n * @typedef {Object} ExternalLinkParameters\n * @property {string} url - An absolute URL.\n * @property {LinkTarget} target - (optional) The link target.\n *   The default value is `LinkTarget.NONE`.\n * @property {string} rel - (optional) The link relationship.\n *   The default value is `DEFAULT_LINK_REL`.\n */\n\n/**\n * Adds various attributes (href, title, target, rel) to hyperlinks.\n * @param {HTMLLinkElement} link - The link element.\n * @param {ExternalLinkParameters} params\n */\nfunction addLinkAttributes(link, { url, target, rel, } = {}) {\n  link.href = link.title = (url ? removeNullCharacters(url) : '');\n\n  if (url) {\n    const LinkTargetValues = Object.values(LinkTarget);\n    let targetIndex =\n      LinkTargetValues.includes(target) ? target : LinkTarget.NONE;\n    link.target = LinkTargetStringMap[targetIndex];\n\n    link.rel = (typeof rel === 'string' ? rel : DEFAULT_LINK_REL);\n  }\n}\n\n// Gets the file name from a given URL.\nfunction getFilenameFromUrl(url) {\n  var anchor = url.indexOf('#');\n  var query = url.indexOf('?');\n  var end = Math.min(\n    anchor > 0 ? anchor : url.length,\n    query > 0 ? query : url.length);\n  return url.substring(url.lastIndexOf('/', end) + 1, end);\n}\n\nclass StatTimer {\n  constructor(enable = true) {\n    this.enabled = !!enable;\n    this.started = Object.create(null);\n    this.times = [];\n  }\n\n  time(name) {\n    if (!this.enabled) {\n      return;\n    }\n    if (name in this.started) {\n      warn('Timer is already running for ' + name);\n    }\n    this.started[name] = Date.now();\n  }\n\n  timeEnd(name) {\n    if (!this.enabled) {\n      return;\n    }\n    if (!(name in this.started)) {\n      warn('Timer has not been started for ' + name);\n    }\n    this.times.push({\n      'name': name,\n      'start': this.started[name],\n      'end': Date.now(),\n    });\n    // Remove timer from started so it can be called again.\n    delete this.started[name];\n  }\n\n  toString() {\n    let times = this.times;\n    // Find the longest name for padding purposes.\n    let out = '', longest = 0;\n    for (let i = 0, ii = times.length; i < ii; ++i) {\n      let name = times[i]['name'];\n      if (name.length > longest) {\n        longest = name.length;\n      }\n    }\n    for (let i = 0, ii = times.length; i < ii; ++i) {\n      let span = times[i];\n      let duration = span.end - span.start;\n      out += `${span['name'].padEnd(longest)} ${duration}ms\\n`;\n    }\n    return out;\n  }\n}\n\n/**\n * Helps avoid having to initialize {StatTimer} instances, e.g. one for every\n * page, in cases where the collected stats are not actually being used.\n * This (dummy) class can thus, since all its methods are `static`, be directly\n * shared between multiple call-sites without the need to be initialized first.\n *\n * NOTE: This must implement the same interface as {StatTimer}.\n */\nclass DummyStatTimer {\n  constructor() {\n    unreachable('Cannot initialize DummyStatTimer.');\n  }\n\n  static time(name) {}\n\n  static timeEnd(name) {}\n\n  static toString() {\n    return '';\n  }\n}\n\nfunction loadScript(src) {\n  return new Promise((resolve, reject) => {\n    let script = document.createElement('script');\n    script.src = src;\n\n    script.onload = resolve;\n    script.onerror = function() {\n      reject(new Error(`Cannot load script at: ${script.src}`));\n    };\n    (document.head || document.documentElement).appendChild(script);\n  });\n}\n\nexport {\n  PageViewport,\n  RenderingCancelledException,\n  addLinkAttributes,\n  getFilenameFromUrl,\n  LinkTarget,\n  DEFAULT_LINK_REL,\n  DOMCanvasFactory,\n  DOMCMapReaderFactory,\n  DOMSVGFactory,\n  StatTimer,\n  DummyStatTimer,\n  loadScript,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  assert, bytesToString, isEvalSupported, shadow, string32, unreachable,\n  UNSUPPORTED_FEATURES, warn\n} from '../shared/util';\n\nclass BaseFontLoader {\n  constructor(docId) {\n    if (this.constructor === BaseFontLoader) {\n      unreachable('Cannot initialize BaseFontLoader.');\n    }\n    this.docId = docId;\n\n    this.nativeFontFaces = [];\n    this.styleElement = null;\n    this.loadingContext = {\n      requests: [],\n      nextRequestId: 0,\n    };\n  }\n\n  addNativeFontFace(nativeFontFace) {\n    this.nativeFontFaces.push(nativeFontFace);\n    document.fonts.add(nativeFontFace);\n  }\n\n  insertRule(rule) {\n    let styleElement = this.styleElement;\n    if (!styleElement) {\n      styleElement = this.styleElement = document.createElement('style');\n      styleElement.id = `PDFJS_FONT_STYLE_TAG_${this.docId}`;\n      document.documentElement.getElementsByTagName('head')[0].appendChild(\n        styleElement);\n    }\n\n    const styleSheet = styleElement.sheet;\n    styleSheet.insertRule(rule, styleSheet.cssRules.length);\n  }\n\n  clear() {\n    this.nativeFontFaces.forEach(function(nativeFontFace) {\n      document.fonts.delete(nativeFontFace);\n    });\n    this.nativeFontFaces.length = 0;\n\n    if (this.styleElement) {\n      // Note: ChildNode.remove doesn't throw if the parentNode is undefined.\n      this.styleElement.remove();\n      this.styleElement = null;\n    }\n  }\n\n  bind(fonts, callback) {\n    const rules = [];\n    const fontsToLoad = [];\n    const fontLoadPromises = [];\n    const getNativeFontPromise = function(nativeFontFace) {\n      // Return a promise that is always fulfilled, even when the font fails to\n      // load.\n      return nativeFontFace.loaded.catch(function(reason) {\n        warn(`Failed to load font \"${nativeFontFace.family}\": ${reason}`);\n      });\n    };\n\n    for (const font of fonts) {\n      // Add the font to the DOM only once; skip if the font is already loaded.\n      if (font.attached || font.missingFile) {\n        continue;\n      }\n      font.attached = true;\n\n      if (this.isFontLoadingAPISupported) {\n        const nativeFontFace = font.createNativeFontFace();\n        if (nativeFontFace) {\n          this.addNativeFontFace(nativeFontFace);\n          fontLoadPromises.push(getNativeFontPromise(nativeFontFace));\n        }\n      } else {\n        const rule = font.createFontFaceRule();\n        if (rule) {\n          this.insertRule(rule);\n          rules.push(rule);\n          fontsToLoad.push(font);\n        }\n      }\n    }\n\n    const request = this._queueLoadingCallback(callback);\n    if (this.isFontLoadingAPISupported) {\n      Promise.all(fontLoadPromises).then(request.complete);\n    } else if (rules.length > 0 && !this.isSyncFontLoadingSupported) {\n      this._prepareFontLoadEvent(rules, fontsToLoad, request);\n    } else {\n      request.complete();\n    }\n  }\n\n  _queueLoadingCallback(callback) {\n    function completeRequest() {\n      assert(!request.done, 'completeRequest() cannot be called twice.');\n      request.done = true;\n\n      // Sending all completed requests in order of how they were queued.\n      while (context.requests.length > 0 && context.requests[0].done) {\n        const otherRequest = context.requests.shift();\n        setTimeout(otherRequest.callback, 0);\n      }\n    }\n\n    const context = this.loadingContext;\n    const request = {\n      id: `pdfjs-font-loading-${context.nextRequestId++}`,\n      done: false,\n      complete: completeRequest,\n      callback,\n    };\n    context.requests.push(request);\n    return request;\n  }\n\n  get isFontLoadingAPISupported() {\n    unreachable('Abstract method `isFontLoadingAPISupported`.');\n  }\n\n  get isSyncFontLoadingSupported() {\n    unreachable('Abstract method `isSyncFontLoadingSupported`.');\n  }\n\n  get _loadTestFont() {\n    unreachable('Abstract method `_loadTestFont`.');\n  }\n\n  _prepareFontLoadEvent(rules, fontsToLoad, request) {\n    unreachable('Abstract method `_prepareFontLoadEvent`.');\n  }\n}\n\nlet FontLoader;\nif (typeof PDFJSDev !== 'undefined' && PDFJSDev.test('MOZCENTRAL')) {\n\nFontLoader = class MozcentralFontLoader extends BaseFontLoader {\n  get isFontLoadingAPISupported() {\n    return shadow(this, 'isFontLoadingAPISupported',\n                  typeof document !== 'undefined' && !!document.fonts);\n  }\n\n  get isSyncFontLoadingSupported() {\n    return shadow(this, 'isSyncFontLoadingSupported', true);\n  }\n};\n\n} else { // PDFJSDev.test('CHROME || GENERIC')\n\nFontLoader = class GenericFontLoader extends BaseFontLoader {\n  constructor(docId) {\n    super(docId);\n    this.loadTestFontId = 0;\n  }\n\n  get isFontLoadingAPISupported() {\n    let supported = (typeof document !== 'undefined' && !!document.fonts);\n\n    if ((typeof PDFJSDev === 'undefined' || !PDFJSDev.test('CHROME')) &&\n        (supported && typeof navigator !== 'undefined')) {\n      // The Firefox Font Loading API does not work with `mozPrintCallback`\n      // prior to version 63; see https://bugzilla.mozilla.org/show_bug.cgi?id=1473742\n      const m = /Mozilla\\/5.0.*?rv:(\\d+).*? Gecko/.exec(navigator.userAgent);\n      if (m && m[1] < 63) {\n        supported = false;\n      }\n    }\n    return shadow(this, 'isFontLoadingAPISupported', supported);\n  }\n\n  get isSyncFontLoadingSupported() {\n    let supported = false;\n    if (typeof PDFJSDev === 'undefined' || !PDFJSDev.test('CHROME')) {\n      if (typeof navigator === 'undefined') {\n        // Node.js - we can pretend that sync font loading is supported.\n        supported = true;\n      } else {\n        // User agent string sniffing is bad, but there is no reliable way to\n        // tell if the font is fully loaded and ready to be used with canvas.\n        const m = /Mozilla\\/5.0.*?rv:(\\d+).*? Gecko/.exec(navigator.userAgent);\n        if (m && m[1] >= 14) {\n          supported = true;\n        }\n        // TODO - other browsers...\n      }\n    }\n    return shadow(this, 'isSyncFontLoadingSupported', supported);\n  }\n\n  get _loadTestFont() {\n    const getLoadTestFont = function() {\n      // This is a CFF font with 1 glyph for '.' that fills its entire width and\n      // height.\n      return atob(\n        'T1RUTwALAIAAAwAwQ0ZGIDHtZg4AAAOYAAAAgUZGVE1lkzZwAAAEHAAAABxHREVGABQA' +\n        'FQAABDgAAAAeT1MvMlYNYwkAAAEgAAAAYGNtYXABDQLUAAACNAAAAUJoZWFk/xVFDQAA' +\n        'ALwAAAA2aGhlYQdkA+oAAAD0AAAAJGhtdHgD6AAAAAAEWAAAAAZtYXhwAAJQAAAAARgA' +\n        'AAAGbmFtZVjmdH4AAAGAAAAAsXBvc3T/hgAzAAADeAAAACAAAQAAAAEAALZRFsRfDzz1' +\n        'AAsD6AAAAADOBOTLAAAAAM4KHDwAAAAAA+gDIQAAAAgAAgAAAAAAAAABAAADIQAAAFoD' +\n        '6AAAAAAD6AABAAAAAAAAAAAAAAAAAAAAAQAAUAAAAgAAAAQD6AH0AAUAAAKKArwAAACM' +\n        'AooCvAAAAeAAMQECAAACAAYJAAAAAAAAAAAAAQAAAAAAAAAAAAAAAFBmRWQAwAAuAC4D' +\n        'IP84AFoDIQAAAAAAAQAAAAAAAAAAACAAIAABAAAADgCuAAEAAAAAAAAAAQAAAAEAAAAA' +\n        'AAEAAQAAAAEAAAAAAAIAAQAAAAEAAAAAAAMAAQAAAAEAAAAAAAQAAQAAAAEAAAAAAAUA' +\n        'AQAAAAEAAAAAAAYAAQAAAAMAAQQJAAAAAgABAAMAAQQJAAEAAgABAAMAAQQJAAIAAgAB' +\n        'AAMAAQQJAAMAAgABAAMAAQQJAAQAAgABAAMAAQQJAAUAAgABAAMAAQQJAAYAAgABWABY' +\n        'AAAAAAAAAwAAAAMAAAAcAAEAAAAAADwAAwABAAAAHAAEACAAAAAEAAQAAQAAAC7//wAA' +\n        'AC7////TAAEAAAAAAAABBgAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +\n        'AAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +\n        'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +\n        'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +\n        'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +\n        'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAD/gwAyAAAAAQAAAAAAAAAAAAAAAAAA' +\n        'AAABAAQEAAEBAQJYAAEBASH4DwD4GwHEAvgcA/gXBIwMAYuL+nz5tQXkD5j3CBLnEQAC' +\n        'AQEBIVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYAAABAQAADwACAQEEE/t3' +\n        'Dov6fAH6fAT+fPp8+nwHDosMCvm1Cvm1DAz6fBQAAAAAAAABAAAAAMmJbzEAAAAAzgTj' +\n        'FQAAAADOBOQpAAEAAAAAAAAADAAUAAQAAAABAAAAAgABAAAAAAAAAAAD6AAAAAAAAA==');\n    };\n    return shadow(this, '_loadTestFont', getLoadTestFont());\n  }\n\n  _prepareFontLoadEvent(rules, fonts, request) {\n    /** Hack begin */\n    // There's currently no event when a font has finished downloading so the\n    // following code is a dirty hack to 'guess' when a font is ready.\n    // It's assumed fonts are loaded in order, so add a known test font after\n    // the desired fonts and then test for the loading of that test font.\n\n    function int32(data, offset) {\n      return (data.charCodeAt(offset) << 24) |\n             (data.charCodeAt(offset + 1) << 16) |\n             (data.charCodeAt(offset + 2) << 8) |\n             (data.charCodeAt(offset + 3) & 0xff);\n    }\n    function spliceString(s, offset, remove, insert) {\n      let chunk1 = s.substring(0, offset);\n      let chunk2 = s.substring(offset + remove);\n      return chunk1 + insert + chunk2;\n    }\n    let i, ii;\n\n    // The temporary canvas is used to determine if fonts are loaded.\n    let canvas = document.createElement('canvas');\n    canvas.width = 1;\n    canvas.height = 1;\n    let ctx = canvas.getContext('2d');\n\n    let called = 0;\n    function isFontReady(name, callback) {\n      called++;\n      // With setTimeout clamping this gives the font ~100ms to load.\n      if (called > 30) {\n        warn('Load test font never loaded.');\n        callback();\n        return;\n      }\n      ctx.font = '30px ' + name;\n      ctx.fillText('.', 0, 20);\n      let imageData = ctx.getImageData(0, 0, 1, 1);\n      if (imageData.data[3] > 0) {\n        callback();\n        return;\n      }\n      setTimeout(isFontReady.bind(null, name, callback));\n    }\n\n    const loadTestFontId = `lt${Date.now()}${this.loadTestFontId++}`;\n    // Chromium seems to cache fonts based on a hash of the actual font data,\n    // so the font must be modified for each load test else it will appear to\n    // be loaded already.\n    // TODO: This could maybe be made faster by avoiding the btoa of the full\n    // font by splitting it in chunks before hand and padding the font id.\n    let data = this._loadTestFont;\n    let COMMENT_OFFSET = 976; // has to be on 4 byte boundary (for checksum)\n    data = spliceString(data, COMMENT_OFFSET, loadTestFontId.length,\n                        loadTestFontId);\n    // CFF checksum is important for IE, adjusting it\n    let CFF_CHECKSUM_OFFSET = 16;\n    let XXXX_VALUE = 0x58585858; // the \"comment\" filled with 'X'\n    let checksum = int32(data, CFF_CHECKSUM_OFFSET);\n    for (i = 0, ii = loadTestFontId.length - 3; i < ii; i += 4) {\n      checksum = (checksum - XXXX_VALUE + int32(loadTestFontId, i)) | 0;\n    }\n    if (i < loadTestFontId.length) { // align to 4 bytes boundary\n      checksum = (checksum - XXXX_VALUE + int32(loadTestFontId + 'XXX', i)) | 0;\n    }\n    data = spliceString(data, CFF_CHECKSUM_OFFSET, 4, string32(checksum));\n\n    const url = `url(data:font/opentype;base64,${btoa(data)});`;\n    const rule = `@font-face {font-family:\"${loadTestFontId}\";src:${url}}`;\n    this.insertRule(rule);\n\n    let names = [];\n    for (i = 0, ii = fonts.length; i < ii; i++) {\n      names.push(fonts[i].loadedName);\n    }\n    names.push(loadTestFontId);\n\n    let div = document.createElement('div');\n    div.setAttribute('style', 'visibility: hidden;' +\n                              'width: 10px; height: 10px;' +\n                              'position: absolute; top: 0px; left: 0px;');\n    for (i = 0, ii = names.length; i < ii; ++i) {\n      let span = document.createElement('span');\n      span.textContent = 'Hi';\n      span.style.fontFamily = names[i];\n      div.appendChild(span);\n    }\n    document.body.appendChild(div);\n\n    isFontReady(loadTestFontId, function() {\n      document.body.removeChild(div);\n      request.complete();\n    });\n    /** Hack end */\n  }\n};\n\n} // End of PDFJSDev.test('CHROME || GENERIC')\n\nconst IsEvalSupportedCached = {\n  get value() {\n    return shadow(this, 'value', isEvalSupported());\n  },\n};\n\nclass FontFaceObject {\n  constructor(translatedData, { isEvalSupported = true,\n                                disableFontFace = false,\n                                ignoreErrors = false,\n                                onUnsupportedFeature = null,\n                                fontRegistry = null, }) {\n    this.compiledGlyphs = Object.create(null);\n    // importing translated data\n    for (let i in translatedData) {\n      this[i] = translatedData[i];\n    }\n    this.isEvalSupported = isEvalSupported !== false;\n    this.disableFontFace = disableFontFace === true;\n    this.ignoreErrors = ignoreErrors === true;\n    this._onUnsupportedFeature = onUnsupportedFeature;\n    this.fontRegistry = fontRegistry;\n  }\n\n  createNativeFontFace() {\n    if (!this.data || this.disableFontFace) {\n      return null;\n    }\n    const nativeFontFace = new FontFace(this.loadedName, this.data, {});\n\n    if (this.fontRegistry) {\n      this.fontRegistry.registerFont(this);\n    }\n    return nativeFontFace;\n  }\n\n  createFontFaceRule() {\n    if (!this.data || this.disableFontFace) {\n      return null;\n    }\n    const data = bytesToString(new Uint8Array(this.data));\n    // Add the @font-face rule to the document.\n    const url = `url(data:${this.mimetype};base64,${btoa(data)});`;\n    const rule = `@font-face {font-family:\"${this.loadedName}\";src:${url}}`;\n\n    if (this.fontRegistry) {\n      this.fontRegistry.registerFont(this, url);\n    }\n    return rule;\n  }\n\n  getPathGenerator(objs, character) {\n    if (this.compiledGlyphs[character] !== undefined) {\n      return this.compiledGlyphs[character];\n    }\n\n    let cmds, current;\n    try {\n      cmds = objs.get(this.loadedName + '_path_' + character);\n    } catch (ex) {\n      if (!this.ignoreErrors) {\n        throw ex;\n      }\n      if (this._onUnsupportedFeature) {\n        this._onUnsupportedFeature({ featureId: UNSUPPORTED_FEATURES.font, });\n      }\n      warn(`getPathGenerator - ignoring character: \"${ex}\".`);\n\n      return this.compiledGlyphs[character] = function(c, size) {\n        // No-op function, to allow rendering to continue.\n      };\n    }\n\n    // If we can, compile cmds into JS for MAXIMUM SPEED...\n    if (this.isEvalSupported && IsEvalSupportedCached.value) {\n      let args, js = '';\n      for (let i = 0, ii = cmds.length; i < ii; i++) {\n        current = cmds[i];\n\n        if (current.args !== undefined) {\n          args = current.args.join(',');\n        } else {\n          args = '';\n        }\n        js += 'c.' + current.cmd + '(' + args + ');\\n';\n      }\n      // eslint-disable-next-line no-new-func\n      return this.compiledGlyphs[character] = new Function('c', 'size', js);\n    }\n    // ... but fall back on using Function.prototype.apply() if we're\n    // blocked from using eval() for whatever reason (like CSP policies).\n    return this.compiledGlyphs[character] = function(c, size) {\n      for (let i = 0, ii = cmds.length; i < ii; i++) {\n        current = cmds[i];\n\n        if (current.cmd === 'scale') {\n          current.args = [size, -size];\n        }\n        c[current.cmd].apply(c, current.args);\n      }\n    };\n  }\n}\n\nexport {\n  FontFaceObject,\n  FontLoader,\n};\n","/* Copyright 2018 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nlet compatibilityParams = Object.create(null);\nif (typeof PDFJSDev === 'undefined' || PDFJSDev.test('GENERIC')) {\n  const isNodeJS = require('../shared/is_node');\n\n  const userAgent =\n    (typeof navigator !== 'undefined' && navigator.userAgent) || '';\n  const isIE = /Trident/.test(userAgent);\n  const isIOSChrome = /CriOS/.test(userAgent);\n\n  // Checks if possible to use URL.createObjectURL()\n  // Support: IE, Chrome on iOS\n  (function checkOnBlobSupport() {\n    // Sometimes IE and Chrome on iOS losing the data created with\n    // createObjectURL(), see issues #3977 and #8081.\n    if (isIE || isIOSChrome) {\n      compatibilityParams.disableCreateObjectURL = true;\n    }\n  })();\n\n  // Support: Node.js\n  (function checkFontFaceAndImage() {\n    // Node.js is missing native support for `@font-face` and `Image`.\n    if (isNodeJS()) {\n      compatibilityParams.disableFontFace = true;\n      compatibilityParams.nativeImageDecoderSupport = 'none';\n    }\n  })();\n}\n\nexports.apiCompatibilityParams = Object.freeze(compatibilityParams);\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  FONT_IDENTITY_MATRIX, IDENTITY_MATRIX, ImageKind, info, isLittleEndian, isNum,\n  OPS, shadow, TextRenderingMode, unreachable, Util, warn\n} from '../shared/util';\nimport { getShadingPatternFromIR, TilingPattern } from './pattern_helper';\n\n// <canvas> contexts store most of the state we need natively.\n// However, PDF needs a bit more state, which we store here.\n\n// Minimal font size that would be used during canvas fillText operations.\nvar MIN_FONT_SIZE = 16;\n// Maximum font size that would be used during canvas fillText operations.\nvar MAX_FONT_SIZE = 100;\nvar MAX_GROUP_SIZE = 4096;\n\n// Heuristic value used when enforcing minimum line widths.\nvar MIN_WIDTH_FACTOR = 0.65;\n\nvar COMPILE_TYPE3_GLYPHS = true;\nvar MAX_SIZE_TO_COMPILE = 1000;\n\nvar FULL_CHUNK_HEIGHT = 16;\n\nvar IsLittleEndianCached = {\n  get value() {\n    return shadow(IsLittleEndianCached, 'value', isLittleEndian());\n  },\n};\n\nfunction addContextCurrentTransform(ctx) {\n  // If the context doesn't expose a `mozCurrentTransform`, add a JS based one.\n  if (!ctx.mozCurrentTransform) {\n    ctx._originalSave = ctx.save;\n    ctx._originalRestore = ctx.restore;\n    ctx._originalRotate = ctx.rotate;\n    ctx._originalScale = ctx.scale;\n    ctx._originalTranslate = ctx.translate;\n    ctx._originalTransform = ctx.transform;\n    ctx._originalSetTransform = ctx.setTransform;\n\n    ctx._transformMatrix = ctx._transformMatrix || [1, 0, 0, 1, 0, 0];\n    ctx._transformStack = [];\n\n    Object.defineProperty(ctx, 'mozCurrentTransform', {\n      get: function getCurrentTransform() {\n        return this._transformMatrix;\n      },\n    });\n\n    Object.defineProperty(ctx, 'mozCurrentTransformInverse', {\n      get: function getCurrentTransformInverse() {\n        // Calculation done using WolframAlpha:\n        // http://www.wolframalpha.com/input/?\n        //   i=Inverse+{{a%2C+c%2C+e}%2C+{b%2C+d%2C+f}%2C+{0%2C+0%2C+1}}\n\n        var m = this._transformMatrix;\n        var a = m[0], b = m[1], c = m[2], d = m[3], e = m[4], f = m[5];\n\n        var ad_bc = a * d - b * c;\n        var bc_ad = b * c - a * d;\n\n        return [\n          d / ad_bc,\n          b / bc_ad,\n          c / bc_ad,\n          a / ad_bc,\n          (d * e - c * f) / bc_ad,\n          (b * e - a * f) / ad_bc\n        ];\n      },\n    });\n\n    ctx.save = function ctxSave() {\n      var old = this._transformMatrix;\n      this._transformStack.push(old);\n      this._transformMatrix = old.slice(0, 6);\n\n      this._originalSave();\n    };\n\n    ctx.restore = function ctxRestore() {\n      var prev = this._transformStack.pop();\n      if (prev) {\n        this._transformMatrix = prev;\n        this._originalRestore();\n      }\n    };\n\n    ctx.translate = function ctxTranslate(x, y) {\n      var m = this._transformMatrix;\n      m[4] = m[0] * x + m[2] * y + m[4];\n      m[5] = m[1] * x + m[3] * y + m[5];\n\n      this._originalTranslate(x, y);\n    };\n\n    ctx.scale = function ctxScale(x, y) {\n      var m = this._transformMatrix;\n      m[0] = m[0] * x;\n      m[1] = m[1] * x;\n      m[2] = m[2] * y;\n      m[3] = m[3] * y;\n\n      this._originalScale(x, y);\n    };\n\n    ctx.transform = function ctxTransform(a, b, c, d, e, f) {\n      var m = this._transformMatrix;\n      this._transformMatrix = [\n        m[0] * a + m[2] * b,\n        m[1] * a + m[3] * b,\n        m[0] * c + m[2] * d,\n        m[1] * c + m[3] * d,\n        m[0] * e + m[2] * f + m[4],\n        m[1] * e + m[3] * f + m[5]\n      ];\n\n      ctx._originalTransform(a, b, c, d, e, f);\n    };\n\n    ctx.setTransform = function ctxSetTransform(a, b, c, d, e, f) {\n      this._transformMatrix = [a, b, c, d, e, f];\n\n      ctx._originalSetTransform(a, b, c, d, e, f);\n    };\n\n    ctx.rotate = function ctxRotate(angle) {\n      var cosValue = Math.cos(angle);\n      var sinValue = Math.sin(angle);\n\n      var m = this._transformMatrix;\n      this._transformMatrix = [\n        m[0] * cosValue + m[2] * sinValue,\n        m[1] * cosValue + m[3] * sinValue,\n        m[0] * (-sinValue) + m[2] * cosValue,\n        m[1] * (-sinValue) + m[3] * cosValue,\n        m[4],\n        m[5]\n      ];\n\n      this._originalRotate(angle);\n    };\n  }\n}\n\nvar CachedCanvases = (function CachedCanvasesClosure() {\n  function CachedCanvases(canvasFactory) {\n    this.canvasFactory = canvasFactory;\n    this.cache = Object.create(null);\n  }\n  CachedCanvases.prototype = {\n    getCanvas: function CachedCanvases_getCanvas(id, width, height,\n                                                 trackTransform) {\n      var canvasEntry;\n      if (this.cache[id] !== undefined) {\n        canvasEntry = this.cache[id];\n        this.canvasFactory.reset(canvasEntry, width, height);\n        // reset canvas transform for emulated mozCurrentTransform, if needed\n        canvasEntry.context.setTransform(1, 0, 0, 1, 0, 0);\n      } else {\n        canvasEntry = this.canvasFactory.create(width, height);\n        this.cache[id] = canvasEntry;\n      }\n      if (trackTransform) {\n        addContextCurrentTransform(canvasEntry.context);\n      }\n      return canvasEntry;\n    },\n    clear() {\n      for (var id in this.cache) {\n        var canvasEntry = this.cache[id];\n        this.canvasFactory.destroy(canvasEntry);\n        delete this.cache[id];\n      }\n    },\n  };\n  return CachedCanvases;\n})();\n\nfunction compileType3Glyph(imgData) {\n  var POINT_TO_PROCESS_LIMIT = 1000;\n\n  var width = imgData.width, height = imgData.height;\n  var i, j, j0, width1 = width + 1;\n  var points = new Uint8Array(width1 * (height + 1));\n  var POINT_TYPES =\n      new Uint8Array([0, 2, 4, 0, 1, 0, 5, 4, 8, 10, 0, 8, 0, 2, 1, 0]);\n\n  // decodes bit-packed mask data\n  var lineSize = (width + 7) & ~7, data0 = imgData.data;\n  var data = new Uint8Array(lineSize * height), pos = 0, ii;\n  for (i = 0, ii = data0.length; i < ii; i++) {\n    var mask = 128, elem = data0[i];\n    while (mask > 0) {\n      data[pos++] = (elem & mask) ? 0 : 255;\n      mask >>= 1;\n    }\n  }\n\n  // finding interesting points: every point is located between mask pixels,\n  // so there will be points of the (width + 1)x(height + 1) grid. Every point\n  // will have flags assigned based on neighboring mask pixels:\n  //   4 | 8\n  //   --P--\n  //   2 | 1\n  // We are interested only in points with the flags:\n  //   - outside corners: 1, 2, 4, 8;\n  //   - inside corners: 7, 11, 13, 14;\n  //   - and, intersections: 5, 10.\n  var count = 0;\n  pos = 0;\n  if (data[pos] !== 0) {\n    points[0] = 1;\n    ++count;\n  }\n  for (j = 1; j < width; j++) {\n    if (data[pos] !== data[pos + 1]) {\n      points[j] = data[pos] ? 2 : 1;\n      ++count;\n    }\n    pos++;\n  }\n  if (data[pos] !== 0) {\n    points[j] = 2;\n    ++count;\n  }\n  for (i = 1; i < height; i++) {\n    pos = i * lineSize;\n    j0 = i * width1;\n    if (data[pos - lineSize] !== data[pos]) {\n      points[j0] = data[pos] ? 1 : 8;\n      ++count;\n    }\n    // 'sum' is the position of the current pixel configuration in the 'TYPES'\n    // array (in order 8-1-2-4, so we can use '>>2' to shift the column).\n    var sum = (data[pos] ? 4 : 0) + (data[pos - lineSize] ? 8 : 0);\n    for (j = 1; j < width; j++) {\n      sum = (sum >> 2) + (data[pos + 1] ? 4 : 0) +\n            (data[pos - lineSize + 1] ? 8 : 0);\n      if (POINT_TYPES[sum]) {\n        points[j0 + j] = POINT_TYPES[sum];\n        ++count;\n      }\n      pos++;\n    }\n    if (data[pos - lineSize] !== data[pos]) {\n      points[j0 + j] = data[pos] ? 2 : 4;\n      ++count;\n    }\n\n    if (count > POINT_TO_PROCESS_LIMIT) {\n      return null;\n    }\n  }\n\n  pos = lineSize * (height - 1);\n  j0 = i * width1;\n  if (data[pos] !== 0) {\n    points[j0] = 8;\n    ++count;\n  }\n  for (j = 1; j < width; j++) {\n    if (data[pos] !== data[pos + 1]) {\n      points[j0 + j] = data[pos] ? 4 : 8;\n      ++count;\n    }\n    pos++;\n  }\n  if (data[pos] !== 0) {\n    points[j0 + j] = 4;\n    ++count;\n  }\n  if (count > POINT_TO_PROCESS_LIMIT) {\n    return null;\n  }\n\n  // building outlines\n  var steps = new Int32Array([0, width1, -1, 0, -width1, 0, 0, 0, 1]);\n  var outlines = [];\n  for (i = 0; count && i <= height; i++) {\n    var p = i * width1;\n    var end = p + width;\n    while (p < end && !points[p]) {\n      p++;\n    }\n    if (p === end) {\n      continue;\n    }\n    var coords = [p % width1, i];\n\n    var type = points[p], p0 = p, pp;\n    do {\n      var step = steps[type];\n      do {\n        p += step;\n      } while (!points[p]);\n\n      pp = points[p];\n      if (pp !== 5 && pp !== 10) {\n        // set new direction\n        type = pp;\n        // delete mark\n        points[p] = 0;\n      } else { // type is 5 or 10, ie, a crossing\n        // set new direction\n        type = pp & ((0x33 * type) >> 4);\n        // set new type for \"future hit\"\n        points[p] &= (type >> 2 | type << 2);\n      }\n\n      coords.push(p % width1);\n      coords.push((p / width1) | 0);\n      --count;\n    } while (p0 !== p);\n    outlines.push(coords);\n    --i;\n  }\n\n  var drawOutline = function(c) {\n    c.save();\n    // the path shall be painted in [0..1]x[0..1] space\n    c.scale(1 / width, -1 / height);\n    c.translate(0, -height);\n    c.beginPath();\n    for (var i = 0, ii = outlines.length; i < ii; i++) {\n      var o = outlines[i];\n      c.moveTo(o[0], o[1]);\n      for (var j = 2, jj = o.length; j < jj; j += 2) {\n        c.lineTo(o[j], o[j + 1]);\n      }\n    }\n    c.fill();\n    c.beginPath();\n    c.restore();\n  };\n\n  return drawOutline;\n}\n\nvar CanvasExtraState = (function CanvasExtraStateClosure() {\n  function CanvasExtraState() {\n    // Are soft masks and alpha values shapes or opacities?\n    this.alphaIsShape = false;\n    this.fontSize = 0;\n    this.fontSizeScale = 1;\n    this.textMatrix = IDENTITY_MATRIX;\n    this.textMatrixScale = 1;\n    this.fontMatrix = FONT_IDENTITY_MATRIX;\n    this.leading = 0;\n    // Current point (in user coordinates)\n    this.x = 0;\n    this.y = 0;\n    // Start of text line (in text coordinates)\n    this.lineX = 0;\n    this.lineY = 0;\n    // Character and word spacing\n    this.charSpacing = 0;\n    this.wordSpacing = 0;\n    this.textHScale = 1;\n    this.textRenderingMode = TextRenderingMode.FILL;\n    this.textRise = 0;\n    // Default fore and background colors\n    this.fillColor = '#000000';\n    this.strokeColor = '#000000';\n    this.patternFill = false;\n    // Note: fill alpha applies to all non-stroking operations\n    this.fillAlpha = 1;\n    this.strokeAlpha = 1;\n    this.lineWidth = 1;\n    this.activeSMask = null;\n    this.resumeSMaskCtx = null; // nonclonable field (see the save method below)\n  }\n\n  CanvasExtraState.prototype = {\n    clone: function CanvasExtraState_clone() {\n      return Object.create(this);\n    },\n    setCurrentPoint: function CanvasExtraState_setCurrentPoint(x, y) {\n      this.x = x;\n      this.y = y;\n    },\n  };\n  return CanvasExtraState;\n})();\n\nvar CanvasGraphics = (function CanvasGraphicsClosure() {\n  // Defines the time the executeOperatorList is going to be executing\n  // before it stops and shedules a continue of execution.\n  var EXECUTION_TIME = 15;\n  // Defines the number of steps before checking the execution time\n  var EXECUTION_STEPS = 10;\n\n  function CanvasGraphics(canvasCtx, commonObjs, objs, canvasFactory,\n                          webGLContext, imageLayer) {\n    this.ctx = canvasCtx;\n    this.current = new CanvasExtraState();\n    this.stateStack = [];\n    this.pendingClip = null;\n    this.pendingEOFill = false;\n    this.res = null;\n    this.xobjs = null;\n    this.commonObjs = commonObjs;\n    this.objs = objs;\n    this.canvasFactory = canvasFactory;\n    this.webGLContext = webGLContext;\n    this.imageLayer = imageLayer;\n    this.groupStack = [];\n    this.processingType3 = null;\n    // Patterns are painted relative to the initial page/form transform, see pdf\n    // spec 8.7.2 NOTE 1.\n    this.baseTransform = null;\n    this.baseTransformStack = [];\n    this.groupLevel = 0;\n    this.smaskStack = [];\n    this.smaskCounter = 0;\n    this.tempSMask = null;\n    this.cachedCanvases = new CachedCanvases(this.canvasFactory);\n    if (canvasCtx) {\n      // NOTE: if mozCurrentTransform is polyfilled, then the current state of\n      // the transformation must already be set in canvasCtx._transformMatrix.\n      addContextCurrentTransform(canvasCtx);\n    }\n    this._cachedGetSinglePixelWidth = null;\n  }\n\n  function putBinaryImageData(ctx, imgData) {\n    if (typeof ImageData !== 'undefined' && imgData instanceof ImageData) {\n      ctx.putImageData(imgData, 0, 0);\n      return;\n    }\n\n    // Put the image data to the canvas in chunks, rather than putting the\n    // whole image at once.  This saves JS memory, because the ImageData object\n    // is smaller. It also possibly saves C++ memory within the implementation\n    // of putImageData(). (E.g. in Firefox we make two short-lived copies of\n    // the data passed to putImageData()). |n| shouldn't be too small, however,\n    // because too many putImageData() calls will slow things down.\n    //\n    // Note: as written, if the last chunk is partial, the putImageData() call\n    // will (conceptually) put pixels past the bounds of the canvas.  But\n    // that's ok; any such pixels are ignored.\n\n    var height = imgData.height, width = imgData.width;\n    var partialChunkHeight = height % FULL_CHUNK_HEIGHT;\n    var fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT;\n    var totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1;\n\n    var chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT);\n    var srcPos = 0, destPos;\n    var src = imgData.data;\n    var dest = chunkImgData.data;\n    var i, j, thisChunkHeight, elemsInThisChunk;\n\n    // There are multiple forms in which the pixel data can be passed, and\n    // imgData.kind tells us which one this is.\n    if (imgData.kind === ImageKind.GRAYSCALE_1BPP) {\n      // Grayscale, 1 bit per pixel (i.e. black-and-white).\n      var srcLength = src.byteLength;\n      var dest32 = new Uint32Array(dest.buffer, 0, dest.byteLength >> 2);\n      var dest32DataLength = dest32.length;\n      var fullSrcDiff = (width + 7) >> 3;\n      var white = 0xFFFFFFFF;\n      var black = IsLittleEndianCached.value ? 0xFF000000 : 0x000000FF;\n      for (i = 0; i < totalChunks; i++) {\n        thisChunkHeight =\n          (i < fullChunks) ? FULL_CHUNK_HEIGHT : partialChunkHeight;\n        destPos = 0;\n        for (j = 0; j < thisChunkHeight; j++) {\n          var srcDiff = srcLength - srcPos;\n          var k = 0;\n          var kEnd = (srcDiff > fullSrcDiff) ? width : srcDiff * 8 - 7;\n          var kEndUnrolled = kEnd & ~7;\n          var mask = 0;\n          var srcByte = 0;\n          for (; k < kEndUnrolled; k += 8) {\n            srcByte = src[srcPos++];\n            dest32[destPos++] = (srcByte & 128) ? white : black;\n            dest32[destPos++] = (srcByte & 64) ? white : black;\n            dest32[destPos++] = (srcByte & 32) ? white : black;\n            dest32[destPos++] = (srcByte & 16) ? white : black;\n            dest32[destPos++] = (srcByte & 8) ? white : black;\n            dest32[destPos++] = (srcByte & 4) ? white : black;\n            dest32[destPos++] = (srcByte & 2) ? white : black;\n            dest32[destPos++] = (srcByte & 1) ? white : black;\n          }\n          for (; k < kEnd; k++) {\n             if (mask === 0) {\n               srcByte = src[srcPos++];\n               mask = 128;\n             }\n\n            dest32[destPos++] = (srcByte & mask) ? white : black;\n            mask >>= 1;\n          }\n        }\n        // We ran out of input. Make all remaining pixels transparent.\n        while (destPos < dest32DataLength) {\n          dest32[destPos++] = 0;\n        }\n\n        ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);\n      }\n    } else if (imgData.kind === ImageKind.RGBA_32BPP) {\n      // RGBA, 32-bits per pixel.\n\n      j = 0;\n      elemsInThisChunk = width * FULL_CHUNK_HEIGHT * 4;\n      for (i = 0; i < fullChunks; i++) {\n        dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk));\n        srcPos += elemsInThisChunk;\n\n        ctx.putImageData(chunkImgData, 0, j);\n        j += FULL_CHUNK_HEIGHT;\n      }\n      if (i < totalChunks) {\n        elemsInThisChunk = width * partialChunkHeight * 4;\n        dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk));\n        ctx.putImageData(chunkImgData, 0, j);\n      }\n\n    } else if (imgData.kind === ImageKind.RGB_24BPP) {\n      // RGB, 24-bits per pixel.\n      thisChunkHeight = FULL_CHUNK_HEIGHT;\n      elemsInThisChunk = width * thisChunkHeight;\n      for (i = 0; i < totalChunks; i++) {\n        if (i >= fullChunks) {\n          thisChunkHeight = partialChunkHeight;\n          elemsInThisChunk = width * thisChunkHeight;\n        }\n\n        destPos = 0;\n        for (j = elemsInThisChunk; j--;) {\n          dest[destPos++] = src[srcPos++];\n          dest[destPos++] = src[srcPos++];\n          dest[destPos++] = src[srcPos++];\n          dest[destPos++] = 255;\n        }\n        ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);\n      }\n    } else {\n      throw new Error(`bad image kind: ${imgData.kind}`);\n    }\n  }\n\n  function putBinaryImageMask(ctx, imgData) {\n    var height = imgData.height, width = imgData.width;\n    var partialChunkHeight = height % FULL_CHUNK_HEIGHT;\n    var fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT;\n    var totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1;\n\n    var chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT);\n    var srcPos = 0;\n    var src = imgData.data;\n    var dest = chunkImgData.data;\n\n    for (var i = 0; i < totalChunks; i++) {\n      var thisChunkHeight =\n        (i < fullChunks) ? FULL_CHUNK_HEIGHT : partialChunkHeight;\n\n      // Expand the mask so it can be used by the canvas.  Any required\n      // inversion has already been handled.\n      var destPos = 3; // alpha component offset\n      for (var j = 0; j < thisChunkHeight; j++) {\n        var mask = 0;\n        for (var k = 0; k < width; k++) {\n          if (!mask) {\n            var elem = src[srcPos++];\n            mask = 128;\n          }\n          dest[destPos] = (elem & mask) ? 0 : 255;\n          destPos += 4;\n          mask >>= 1;\n        }\n      }\n      ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);\n    }\n  }\n\n  function copyCtxState(sourceCtx, destCtx) {\n    var properties = ['strokeStyle', 'fillStyle', 'fillRule', 'globalAlpha',\n                      'lineWidth', 'lineCap', 'lineJoin', 'miterLimit',\n                      'globalCompositeOperation', 'font'];\n    for (var i = 0, ii = properties.length; i < ii; i++) {\n      var property = properties[i];\n      if (sourceCtx[property] !== undefined) {\n        destCtx[property] = sourceCtx[property];\n      }\n    }\n    if (sourceCtx.setLineDash !== undefined) {\n      destCtx.setLineDash(sourceCtx.getLineDash());\n      destCtx.lineDashOffset = sourceCtx.lineDashOffset;\n    }\n  }\n\n  function resetCtxToDefault(ctx) {\n    ctx.strokeStyle = '#000000';\n    ctx.fillStyle = '#000000';\n    ctx.fillRule = 'nonzero';\n    ctx.globalAlpha = 1;\n    ctx.lineWidth = 1;\n    ctx.lineCap = 'butt';\n    ctx.lineJoin = 'miter';\n    ctx.miterLimit = 10;\n    ctx.globalCompositeOperation = 'source-over';\n    ctx.font = '10px sans-serif';\n    if (ctx.setLineDash !== undefined) {\n      ctx.setLineDash([]);\n      ctx.lineDashOffset = 0;\n    }\n  }\n\n  function composeSMaskBackdrop(bytes, r0, g0, b0) {\n    var length = bytes.length;\n    for (var i = 3; i < length; i += 4) {\n      var alpha = bytes[i];\n      if (alpha === 0) {\n        bytes[i - 3] = r0;\n        bytes[i - 2] = g0;\n        bytes[i - 1] = b0;\n      } else if (alpha < 255) {\n        var alpha_ = 255 - alpha;\n        bytes[i - 3] = (bytes[i - 3] * alpha + r0 * alpha_) >> 8;\n        bytes[i - 2] = (bytes[i - 2] * alpha + g0 * alpha_) >> 8;\n        bytes[i - 1] = (bytes[i - 1] * alpha + b0 * alpha_) >> 8;\n      }\n    }\n  }\n\n  function composeSMaskAlpha(maskData, layerData, transferMap) {\n    var length = maskData.length;\n    var scale = 1 / 255;\n    for (var i = 3; i < length; i += 4) {\n      var alpha = transferMap ? transferMap[maskData[i]] : maskData[i];\n      layerData[i] = (layerData[i] * alpha * scale) | 0;\n    }\n  }\n\n  function composeSMaskLuminosity(maskData, layerData, transferMap) {\n    var length = maskData.length;\n    for (var i = 3; i < length; i += 4) {\n      var y = (maskData[i - 3] * 77) +  // * 0.3 / 255 * 0x10000\n              (maskData[i - 2] * 152) + // * 0.59 ....\n              (maskData[i - 1] * 28);   // * 0.11 ....\n      layerData[i] = transferMap ?\n        (layerData[i] * transferMap[y >> 8]) >> 8 :\n        (layerData[i] * y) >> 16;\n    }\n  }\n\n  function genericComposeSMask(maskCtx, layerCtx, width, height,\n                               subtype, backdrop, transferMap) {\n    var hasBackdrop = !!backdrop;\n    var r0 = hasBackdrop ? backdrop[0] : 0;\n    var g0 = hasBackdrop ? backdrop[1] : 0;\n    var b0 = hasBackdrop ? backdrop[2] : 0;\n\n    var composeFn;\n    if (subtype === 'Luminosity') {\n      composeFn = composeSMaskLuminosity;\n    } else {\n      composeFn = composeSMaskAlpha;\n    }\n\n    // processing image in chunks to save memory\n    var PIXELS_TO_PROCESS = 1048576;\n    var chunkSize = Math.min(height, Math.ceil(PIXELS_TO_PROCESS / width));\n    for (var row = 0; row < height; row += chunkSize) {\n      var chunkHeight = Math.min(chunkSize, height - row);\n      var maskData = maskCtx.getImageData(0, row, width, chunkHeight);\n      var layerData = layerCtx.getImageData(0, row, width, chunkHeight);\n\n      if (hasBackdrop) {\n        composeSMaskBackdrop(maskData.data, r0, g0, b0);\n      }\n      composeFn(maskData.data, layerData.data, transferMap);\n\n      maskCtx.putImageData(layerData, 0, row);\n    }\n  }\n\n  function composeSMask(ctx, smask, layerCtx, webGLContext) {\n    var mask = smask.canvas;\n    var maskCtx = smask.context;\n\n    ctx.setTransform(smask.scaleX, 0, 0, smask.scaleY,\n                     smask.offsetX, smask.offsetY);\n\n    var backdrop = smask.backdrop || null;\n    if (!smask.transferMap && webGLContext.isEnabled) {\n      let composed = webGLContext.composeSMask({\n        layer: layerCtx.canvas,\n        mask,\n        properties: {\n          subtype: smask.subtype,\n          backdrop,\n        },\n      });\n      ctx.setTransform(1, 0, 0, 1, 0, 0);\n      ctx.drawImage(composed, smask.offsetX, smask.offsetY);\n      return;\n    }\n    genericComposeSMask(maskCtx, layerCtx, mask.width, mask.height,\n                        smask.subtype, backdrop, smask.transferMap);\n    ctx.drawImage(mask, 0, 0);\n  }\n\n  var LINE_CAP_STYLES = ['butt', 'round', 'square'];\n  var LINE_JOIN_STYLES = ['miter', 'round', 'bevel'];\n  var NORMAL_CLIP = {};\n  var EO_CLIP = {};\n\n  CanvasGraphics.prototype = {\n\n    beginDrawing({ transform, viewport, transparency,\n                   background = null, }) {\n      // For pdfs that use blend modes we have to clear the canvas else certain\n      // blend modes can look wrong since we'd be blending with a white\n      // backdrop. The problem with a transparent backdrop though is we then\n      // don't get sub pixel anti aliasing on text, creating temporary\n      // transparent canvas when we have blend modes.\n      var width = this.ctx.canvas.width;\n      var height = this.ctx.canvas.height;\n\n      this.ctx.save();\n      this.ctx.fillStyle = background || 'rgb(255, 255, 255)';\n      this.ctx.fillRect(0, 0, width, height);\n      this.ctx.restore();\n\n      if (transparency) {\n        var transparentCanvas = this.cachedCanvases.getCanvas(\n          'transparent', width, height, true);\n        this.compositeCtx = this.ctx;\n        this.transparentCanvas = transparentCanvas.canvas;\n        this.ctx = transparentCanvas.context;\n        this.ctx.save();\n        // The transform can be applied before rendering, transferring it to\n        // the new canvas.\n        this.ctx.transform.apply(this.ctx,\n                                 this.compositeCtx.mozCurrentTransform);\n      }\n\n      this.ctx.save();\n      resetCtxToDefault(this.ctx);\n      if (transform) {\n        this.ctx.transform.apply(this.ctx, transform);\n      }\n      this.ctx.transform.apply(this.ctx, viewport.transform);\n\n      this.baseTransform = this.ctx.mozCurrentTransform.slice();\n\n      if (this.imageLayer) {\n        this.imageLayer.beginLayout();\n      }\n    },\n\n    executeOperatorList: function CanvasGraphics_executeOperatorList(\n                                    operatorList,\n                                    executionStartIdx, continueCallback,\n                                    stepper) {\n      var argsArray = operatorList.argsArray;\n      var fnArray = operatorList.fnArray;\n      var i = executionStartIdx || 0;\n      var argsArrayLen = argsArray.length;\n\n      // Sometimes the OperatorList to execute is empty.\n      if (argsArrayLen === i) {\n        return i;\n      }\n\n      var chunkOperations = (argsArrayLen - i > EXECUTION_STEPS &&\n                             typeof continueCallback === 'function');\n      var endTime = chunkOperations ? Date.now() + EXECUTION_TIME : 0;\n      var steps = 0;\n\n      var commonObjs = this.commonObjs;\n      var objs = this.objs;\n      var fnId;\n\n      while (true) {\n        if (stepper !== undefined && i === stepper.nextBreakPoint) {\n          stepper.breakIt(i, continueCallback);\n          return i;\n        }\n\n        fnId = fnArray[i];\n\n        if (fnId !== OPS.dependency) {\n          this[fnId].apply(this, argsArray[i]);\n        } else {\n          var deps = argsArray[i];\n          for (var n = 0, nn = deps.length; n < nn; n++) {\n            var depObjId = deps[n];\n            var common = depObjId[0] === 'g' && depObjId[1] === '_';\n            var objsPool = common ? commonObjs : objs;\n\n            // If the promise isn't resolved yet, add the continueCallback\n            // to the promise and bail out.\n            if (!objsPool.isResolved(depObjId)) {\n              objsPool.get(depObjId, continueCallback);\n              return i;\n            }\n          }\n        }\n\n        i++;\n\n        // If the entire operatorList was executed, stop as were done.\n        if (i === argsArrayLen) {\n          return i;\n        }\n\n        // If the execution took longer then a certain amount of time and\n        // `continueCallback` is specified, interrupt the execution.\n        if (chunkOperations && ++steps > EXECUTION_STEPS) {\n          if (Date.now() > endTime) {\n            continueCallback();\n            return i;\n          }\n          steps = 0;\n        }\n\n        // If the operatorList isn't executed completely yet OR the execution\n        // time was short enough, do another execution round.\n      }\n    },\n\n    endDrawing: function CanvasGraphics_endDrawing() {\n      // Finishing all opened operations such as SMask group painting.\n      if (this.current.activeSMask !== null) {\n        this.endSMaskGroup();\n      }\n\n      this.ctx.restore();\n\n      if (this.transparentCanvas) {\n        this.ctx = this.compositeCtx;\n        this.ctx.save();\n        this.ctx.setTransform(1, 0, 0, 1, 0, 0); // Avoid apply transform twice\n        this.ctx.drawImage(this.transparentCanvas, 0, 0);\n        this.ctx.restore();\n        this.transparentCanvas = null;\n      }\n\n      this.cachedCanvases.clear();\n      this.webGLContext.clear();\n\n      if (this.imageLayer) {\n        this.imageLayer.endLayout();\n      }\n    },\n\n    // Graphics state\n    setLineWidth: function CanvasGraphics_setLineWidth(width) {\n      this.current.lineWidth = width;\n      this.ctx.lineWidth = width;\n    },\n    setLineCap: function CanvasGraphics_setLineCap(style) {\n      this.ctx.lineCap = LINE_CAP_STYLES[style];\n    },\n    setLineJoin: function CanvasGraphics_setLineJoin(style) {\n      this.ctx.lineJoin = LINE_JOIN_STYLES[style];\n    },\n    setMiterLimit: function CanvasGraphics_setMiterLimit(limit) {\n      this.ctx.miterLimit = limit;\n    },\n    setDash: function CanvasGraphics_setDash(dashArray, dashPhase) {\n      var ctx = this.ctx;\n      if (ctx.setLineDash !== undefined) {\n        ctx.setLineDash(dashArray);\n        ctx.lineDashOffset = dashPhase;\n      }\n    },\n    setRenderingIntent: function CanvasGraphics_setRenderingIntent(intent) {\n      // Maybe if we one day fully support color spaces this will be important\n      // for now we can ignore.\n      // TODO set rendering intent?\n    },\n    setFlatness: function CanvasGraphics_setFlatness(flatness) {\n      // There's no way to control this with canvas, but we can safely ignore.\n      // TODO set flatness?\n    },\n    setGState: function CanvasGraphics_setGState(states) {\n      for (var i = 0, ii = states.length; i < ii; i++) {\n        var state = states[i];\n        var key = state[0];\n        var value = state[1];\n\n        switch (key) {\n          case 'LW':\n            this.setLineWidth(value);\n            break;\n          case 'LC':\n            this.setLineCap(value);\n            break;\n          case 'LJ':\n            this.setLineJoin(value);\n            break;\n          case 'ML':\n            this.setMiterLimit(value);\n            break;\n          case 'D':\n            this.setDash(value[0], value[1]);\n            break;\n          case 'RI':\n            this.setRenderingIntent(value);\n            break;\n          case 'FL':\n            this.setFlatness(value);\n            break;\n          case 'Font':\n            this.setFont(value[0], value[1]);\n            break;\n          case 'CA':\n            this.current.strokeAlpha = state[1];\n            break;\n          case 'ca':\n            this.current.fillAlpha = state[1];\n            this.ctx.globalAlpha = state[1];\n            break;\n          case 'BM':\n            this.ctx.globalCompositeOperation = value;\n            break;\n          case 'SMask':\n            if (this.current.activeSMask) {\n              // If SMask is currrenly used, it needs to be suspended or\n              // finished. Suspend only makes sense when at least one save()\n              // was performed and state needs to be reverted on restore().\n              if (this.stateStack.length > 0 &&\n                  (this.stateStack[this.stateStack.length - 1].activeSMask ===\n                   this.current.activeSMask)) {\n                this.suspendSMaskGroup();\n              } else {\n                this.endSMaskGroup();\n              }\n            }\n            this.current.activeSMask = value ? this.tempSMask : null;\n            if (this.current.activeSMask) {\n              this.beginSMaskGroup();\n            }\n            this.tempSMask = null;\n            break;\n        }\n      }\n    },\n    beginSMaskGroup: function CanvasGraphics_beginSMaskGroup() {\n\n      var activeSMask = this.current.activeSMask;\n      var drawnWidth = activeSMask.canvas.width;\n      var drawnHeight = activeSMask.canvas.height;\n      var cacheId = 'smaskGroupAt' + this.groupLevel;\n      var scratchCanvas = this.cachedCanvases.getCanvas(\n        cacheId, drawnWidth, drawnHeight, true);\n\n      var currentCtx = this.ctx;\n      var currentTransform = currentCtx.mozCurrentTransform;\n      this.ctx.save();\n\n      var groupCtx = scratchCanvas.context;\n      groupCtx.scale(1 / activeSMask.scaleX, 1 / activeSMask.scaleY);\n      groupCtx.translate(-activeSMask.offsetX, -activeSMask.offsetY);\n      groupCtx.transform.apply(groupCtx, currentTransform);\n\n      activeSMask.startTransformInverse = groupCtx.mozCurrentTransformInverse;\n\n      copyCtxState(currentCtx, groupCtx);\n      this.ctx = groupCtx;\n      this.setGState([\n        ['BM', 'source-over'],\n        ['ca', 1],\n        ['CA', 1]\n      ]);\n      this.groupStack.push(currentCtx);\n      this.groupLevel++;\n    },\n    suspendSMaskGroup: function CanvasGraphics_endSMaskGroup() {\n      // Similar to endSMaskGroup, the intermediate canvas has to be composed\n      // and future ctx state restored.\n      var groupCtx = this.ctx;\n      this.groupLevel--;\n      this.ctx = this.groupStack.pop();\n\n      composeSMask(this.ctx, this.current.activeSMask, groupCtx,\n                   this.webGLContext);\n      this.ctx.restore();\n      this.ctx.save(); // save is needed since SMask will be resumed.\n      copyCtxState(groupCtx, this.ctx);\n\n      // Saving state for resuming.\n      this.current.resumeSMaskCtx = groupCtx;\n      // Transform was changed in the SMask canvas, reflecting this change on\n      // this.ctx.\n      var deltaTransform = Util.transform(\n        this.current.activeSMask.startTransformInverse,\n        groupCtx.mozCurrentTransform);\n      this.ctx.transform.apply(this.ctx, deltaTransform);\n\n      // SMask was composed, the results at the groupCtx can be cleared.\n      groupCtx.save();\n      groupCtx.setTransform(1, 0, 0, 1, 0, 0);\n      groupCtx.clearRect(0, 0, groupCtx.canvas.width, groupCtx.canvas.height);\n      groupCtx.restore();\n    },\n    resumeSMaskGroup: function CanvasGraphics_endSMaskGroup() {\n      // Resuming state saved by suspendSMaskGroup. We don't need to restore\n      // any groupCtx state since restore() command (the only caller) will do\n      // that for us. See also beginSMaskGroup.\n      var groupCtx = this.current.resumeSMaskCtx;\n      var currentCtx = this.ctx;\n      this.ctx = groupCtx;\n      this.groupStack.push(currentCtx);\n      this.groupLevel++;\n    },\n    endSMaskGroup: function CanvasGraphics_endSMaskGroup() {\n      var groupCtx = this.ctx;\n      this.groupLevel--;\n      this.ctx = this.groupStack.pop();\n\n      composeSMask(this.ctx, this.current.activeSMask, groupCtx,\n                   this.webGLContext);\n      this.ctx.restore();\n      copyCtxState(groupCtx, this.ctx);\n      // Transform was changed in the SMask canvas, reflecting this change on\n      // this.ctx.\n      var deltaTransform = Util.transform(\n        this.current.activeSMask.startTransformInverse,\n        groupCtx.mozCurrentTransform);\n      this.ctx.transform.apply(this.ctx, deltaTransform);\n    },\n    save: function CanvasGraphics_save() {\n      this.ctx.save();\n      var old = this.current;\n      this.stateStack.push(old);\n      this.current = old.clone();\n      this.current.resumeSMaskCtx = null;\n    },\n    restore: function CanvasGraphics_restore() {\n      // SMask was suspended, we just need to resume it.\n      if (this.current.resumeSMaskCtx) {\n        this.resumeSMaskGroup();\n      }\n      // SMask has to be finished once there is no states that are using the\n      // same SMask.\n      if (this.current.activeSMask !== null && (this.stateStack.length === 0 ||\n          this.stateStack[this.stateStack.length - 1].activeSMask !==\n          this.current.activeSMask)) {\n        this.endSMaskGroup();\n      }\n\n      if (this.stateStack.length !== 0) {\n        this.current = this.stateStack.pop();\n        this.ctx.restore();\n\n        // Ensure that the clipping path is reset (fixes issue6413.pdf).\n        this.pendingClip = null;\n\n        this._cachedGetSinglePixelWidth = null;\n      }\n    },\n    transform: function CanvasGraphics_transform(a, b, c, d, e, f) {\n      this.ctx.transform(a, b, c, d, e, f);\n\n      this._cachedGetSinglePixelWidth = null;\n    },\n\n    // Path\n    constructPath: function CanvasGraphics_constructPath(ops, args) {\n      var ctx = this.ctx;\n      var current = this.current;\n      var x = current.x, y = current.y;\n      for (var i = 0, j = 0, ii = ops.length; i < ii; i++) {\n        switch (ops[i] | 0) {\n          case OPS.rectangle:\n            x = args[j++];\n            y = args[j++];\n            var width = args[j++];\n            var height = args[j++];\n            if (width === 0) {\n              width = this.getSinglePixelWidth();\n            }\n            if (height === 0) {\n              height = this.getSinglePixelWidth();\n            }\n            var xw = x + width;\n            var yh = y + height;\n            this.ctx.moveTo(x, y);\n            this.ctx.lineTo(xw, y);\n            this.ctx.lineTo(xw, yh);\n            this.ctx.lineTo(x, yh);\n            this.ctx.lineTo(x, y);\n            this.ctx.closePath();\n            break;\n          case OPS.moveTo:\n            x = args[j++];\n            y = args[j++];\n            ctx.moveTo(x, y);\n            break;\n          case OPS.lineTo:\n            x = args[j++];\n            y = args[j++];\n            ctx.lineTo(x, y);\n            break;\n          case OPS.curveTo:\n            x = args[j + 4];\n            y = args[j + 5];\n            ctx.bezierCurveTo(args[j], args[j + 1], args[j + 2], args[j + 3],\n                              x, y);\n            j += 6;\n            break;\n          case OPS.curveTo2:\n            ctx.bezierCurveTo(x, y, args[j], args[j + 1],\n                              args[j + 2], args[j + 3]);\n            x = args[j + 2];\n            y = args[j + 3];\n            j += 4;\n            break;\n          case OPS.curveTo3:\n            x = args[j + 2];\n            y = args[j + 3];\n            ctx.bezierCurveTo(args[j], args[j + 1], x, y, x, y);\n            j += 4;\n            break;\n          case OPS.closePath:\n            ctx.closePath();\n            break;\n        }\n      }\n      current.setCurrentPoint(x, y);\n    },\n    closePath: function CanvasGraphics_closePath() {\n      this.ctx.closePath();\n    },\n    stroke: function CanvasGraphics_stroke(consumePath) {\n      consumePath = typeof consumePath !== 'undefined' ? consumePath : true;\n      var ctx = this.ctx;\n      var strokeColor = this.current.strokeColor;\n      // Prevent drawing too thin lines by enforcing a minimum line width.\n      ctx.lineWidth = Math.max(this.getSinglePixelWidth() * MIN_WIDTH_FACTOR,\n                               this.current.lineWidth);\n      // For stroke we want to temporarily change the global alpha to the\n      // stroking alpha.\n      ctx.globalAlpha = this.current.strokeAlpha;\n      if (strokeColor && strokeColor.hasOwnProperty('type') &&\n          strokeColor.type === 'Pattern') {\n        // for patterns, we transform to pattern space, calculate\n        // the pattern, call stroke, and restore to user space\n        ctx.save();\n        ctx.strokeStyle = strokeColor.getPattern(ctx, this);\n        ctx.stroke();\n        ctx.restore();\n      } else {\n        ctx.stroke();\n      }\n      if (consumePath) {\n        this.consumePath();\n      }\n      // Restore the global alpha to the fill alpha\n      ctx.globalAlpha = this.current.fillAlpha;\n    },\n    closeStroke: function CanvasGraphics_closeStroke() {\n      this.closePath();\n      this.stroke();\n    },\n    fill: function CanvasGraphics_fill(consumePath) {\n      consumePath = typeof consumePath !== 'undefined' ? consumePath : true;\n      var ctx = this.ctx;\n      var fillColor = this.current.fillColor;\n      var isPatternFill = this.current.patternFill;\n      var needRestore = false;\n\n      if (isPatternFill) {\n        ctx.save();\n        if (this.baseTransform) {\n          ctx.setTransform.apply(ctx, this.baseTransform);\n        }\n        ctx.fillStyle = fillColor.getPattern(ctx, this);\n        needRestore = true;\n      }\n\n      if (this.pendingEOFill) {\n        ctx.fill('evenodd');\n        this.pendingEOFill = false;\n      } else {\n        ctx.fill();\n      }\n\n      if (needRestore) {\n        ctx.restore();\n      }\n      if (consumePath) {\n        this.consumePath();\n      }\n    },\n    eoFill: function CanvasGraphics_eoFill() {\n      this.pendingEOFill = true;\n      this.fill();\n    },\n    fillStroke: function CanvasGraphics_fillStroke() {\n      this.fill(false);\n      this.stroke(false);\n\n      this.consumePath();\n    },\n    eoFillStroke: function CanvasGraphics_eoFillStroke() {\n      this.pendingEOFill = true;\n      this.fillStroke();\n    },\n    closeFillStroke: function CanvasGraphics_closeFillStroke() {\n      this.closePath();\n      this.fillStroke();\n    },\n    closeEOFillStroke: function CanvasGraphics_closeEOFillStroke() {\n      this.pendingEOFill = true;\n      this.closePath();\n      this.fillStroke();\n    },\n    endPath: function CanvasGraphics_endPath() {\n      this.consumePath();\n    },\n\n    // Clipping\n    clip: function CanvasGraphics_clip() {\n      this.pendingClip = NORMAL_CLIP;\n    },\n    eoClip: function CanvasGraphics_eoClip() {\n      this.pendingClip = EO_CLIP;\n    },\n\n    // Text\n    beginText: function CanvasGraphics_beginText() {\n      this.current.textMatrix = IDENTITY_MATRIX;\n      this.current.textMatrixScale = 1;\n      this.current.x = this.current.lineX = 0;\n      this.current.y = this.current.lineY = 0;\n    },\n    endText: function CanvasGraphics_endText() {\n      var paths = this.pendingTextPaths;\n      var ctx = this.ctx;\n      if (paths === undefined) {\n        ctx.beginPath();\n        return;\n      }\n\n      ctx.save();\n      ctx.beginPath();\n      for (var i = 0; i < paths.length; i++) {\n        var path = paths[i];\n        ctx.setTransform.apply(ctx, path.transform);\n        ctx.translate(path.x, path.y);\n        path.addToPath(ctx, path.fontSize);\n      }\n      ctx.restore();\n      ctx.clip();\n      ctx.beginPath();\n      delete this.pendingTextPaths;\n    },\n    setCharSpacing: function CanvasGraphics_setCharSpacing(spacing) {\n      this.current.charSpacing = spacing;\n    },\n    setWordSpacing: function CanvasGraphics_setWordSpacing(spacing) {\n      this.current.wordSpacing = spacing;\n    },\n    setHScale: function CanvasGraphics_setHScale(scale) {\n      this.current.textHScale = scale / 100;\n    },\n    setLeading: function CanvasGraphics_setLeading(leading) {\n      this.current.leading = -leading;\n    },\n    setFont: function CanvasGraphics_setFont(fontRefName, size) {\n      var fontObj = this.commonObjs.get(fontRefName);\n      var current = this.current;\n\n      if (!fontObj) {\n        throw new Error(`Can't find font for ${fontRefName}`);\n      }\n\n      current.fontMatrix = (fontObj.fontMatrix ?\n                            fontObj.fontMatrix : FONT_IDENTITY_MATRIX);\n\n      // A valid matrix needs all main diagonal elements to be non-zero\n      // This also ensures we bypass FF bugzilla bug #719844.\n      if (current.fontMatrix[0] === 0 ||\n          current.fontMatrix[3] === 0) {\n        warn('Invalid font matrix for font ' + fontRefName);\n      }\n\n      // The spec for Tf (setFont) says that 'size' specifies the font 'scale',\n      // and in some docs this can be negative (inverted x-y axes).\n      if (size < 0) {\n        size = -size;\n        current.fontDirection = -1;\n      } else {\n        current.fontDirection = 1;\n      }\n\n      this.current.font = fontObj;\n      this.current.fontSize = size;\n\n      if (fontObj.isType3Font) {\n        return; // we don't need ctx.font for Type3 fonts\n      }\n\n      var name = fontObj.loadedName || 'sans-serif';\n      var bold = fontObj.black ? '900' : (fontObj.bold ? 'bold' : 'normal');\n      var italic = fontObj.italic ? 'italic' : 'normal';\n      var typeface = '\"' + name + '\", ' + fontObj.fallbackName;\n\n      // Some font backends cannot handle fonts below certain size.\n      // Keeping the font at minimal size and using the fontSizeScale to change\n      // the current transformation matrix before the fillText/strokeText.\n      // See https://bugzilla.mozilla.org/show_bug.cgi?id=726227\n      var browserFontSize = size < MIN_FONT_SIZE ? MIN_FONT_SIZE :\n                            size > MAX_FONT_SIZE ? MAX_FONT_SIZE : size;\n      this.current.fontSizeScale = size / browserFontSize;\n\n      var rule = italic + ' ' + bold + ' ' + browserFontSize + 'px ' + typeface;\n      this.ctx.font = rule;\n    },\n    setTextRenderingMode: function CanvasGraphics_setTextRenderingMode(mode) {\n      this.current.textRenderingMode = mode;\n    },\n    setTextRise: function CanvasGraphics_setTextRise(rise) {\n      this.current.textRise = rise;\n    },\n    moveText: function CanvasGraphics_moveText(x, y) {\n      this.current.x = this.current.lineX += x;\n      this.current.y = this.current.lineY += y;\n    },\n    setLeadingMoveText: function CanvasGraphics_setLeadingMoveText(x, y) {\n      this.setLeading(-y);\n      this.moveText(x, y);\n    },\n    setTextMatrix: function CanvasGraphics_setTextMatrix(a, b, c, d, e, f) {\n      this.current.textMatrix = [a, b, c, d, e, f];\n      this.current.textMatrixScale = Math.sqrt(a * a + b * b);\n\n      this.current.x = this.current.lineX = 0;\n      this.current.y = this.current.lineY = 0;\n    },\n    nextLine: function CanvasGraphics_nextLine() {\n      this.moveText(0, this.current.leading);\n    },\n\n    paintChar(character, x, y, patternTransform) {\n      var ctx = this.ctx;\n      var current = this.current;\n      var font = current.font;\n      var textRenderingMode = current.textRenderingMode;\n      var fontSize = current.fontSize / current.fontSizeScale;\n      var fillStrokeMode = textRenderingMode &\n        TextRenderingMode.FILL_STROKE_MASK;\n      var isAddToPathSet = !!(textRenderingMode &\n        TextRenderingMode.ADD_TO_PATH_FLAG);\n      let patternFill = current.patternFill && font.data;\n\n      var addToPath;\n      if (font.disableFontFace || isAddToPathSet || patternFill) {\n        addToPath = font.getPathGenerator(this.commonObjs, character);\n      }\n\n      if (font.disableFontFace || patternFill) {\n        ctx.save();\n        ctx.translate(x, y);\n        ctx.beginPath();\n        addToPath(ctx, fontSize);\n        if (patternTransform) {\n          ctx.setTransform.apply(ctx, patternTransform);\n        }\n        if (fillStrokeMode === TextRenderingMode.FILL ||\n            fillStrokeMode === TextRenderingMode.FILL_STROKE) {\n          ctx.fill();\n        }\n        if (fillStrokeMode === TextRenderingMode.STROKE ||\n            fillStrokeMode === TextRenderingMode.FILL_STROKE) {\n          ctx.stroke();\n        }\n        ctx.restore();\n      } else {\n        if (fillStrokeMode === TextRenderingMode.FILL ||\n            fillStrokeMode === TextRenderingMode.FILL_STROKE) {\n          ctx.fillText(character, x, y);\n        }\n        if (fillStrokeMode === TextRenderingMode.STROKE ||\n            fillStrokeMode === TextRenderingMode.FILL_STROKE) {\n          ctx.strokeText(character, x, y);\n        }\n      }\n\n      if (isAddToPathSet) {\n        var paths = this.pendingTextPaths || (this.pendingTextPaths = []);\n        paths.push({\n          transform: ctx.mozCurrentTransform,\n          x,\n          y,\n          fontSize,\n          addToPath,\n        });\n      }\n    },\n\n    get isFontSubpixelAAEnabled() {\n      // Checks if anti-aliasing is enabled when scaled text is painted.\n      // On Windows GDI scaled fonts looks bad.\n      var ctx = this.canvasFactory.create(10, 10).context;\n      ctx.scale(1.5, 1);\n      ctx.fillText('I', 0, 10);\n      var data = ctx.getImageData(0, 0, 10, 10).data;\n      var enabled = false;\n      for (var i = 3; i < data.length; i += 4) {\n        if (data[i] > 0 && data[i] < 255) {\n          enabled = true;\n          break;\n        }\n      }\n      return shadow(this, 'isFontSubpixelAAEnabled', enabled);\n    },\n\n    showText: function CanvasGraphics_showText(glyphs) {\n      var current = this.current;\n      var font = current.font;\n      if (font.isType3Font) {\n        return this.showType3Text(glyphs);\n      }\n\n      var fontSize = current.fontSize;\n      if (fontSize === 0) {\n        return;\n      }\n\n      var ctx = this.ctx;\n      var fontSizeScale = current.fontSizeScale;\n      var charSpacing = current.charSpacing;\n      var wordSpacing = current.wordSpacing;\n      var fontDirection = current.fontDirection;\n      var textHScale = current.textHScale * fontDirection;\n      var glyphsLength = glyphs.length;\n      var vertical = font.vertical;\n      var spacingDir = vertical ? 1 : -1;\n      var defaultVMetrics = font.defaultVMetrics;\n      var widthAdvanceScale = fontSize * current.fontMatrix[0];\n\n      var simpleFillText =\n        current.textRenderingMode === TextRenderingMode.FILL &&\n        !font.disableFontFace && !current.patternFill;\n\n      ctx.save();\n      let patternTransform;\n      if (current.patternFill) {\n        // TODO: Patterns are not applied correctly to text if a non-embedded\n        // font is used. E.g. issue 8111 and ShowText-ShadingPattern.pdf.\n        ctx.save();\n        let pattern = current.fillColor.getPattern(ctx, this);\n        patternTransform = ctx.mozCurrentTransform;\n        ctx.restore();\n        ctx.fillStyle = pattern;\n      }\n      ctx.transform.apply(ctx, current.textMatrix);\n      ctx.translate(current.x, current.y + current.textRise);\n\n      if (fontDirection > 0) {\n        ctx.scale(textHScale, -1);\n      } else {\n        ctx.scale(textHScale, 1);\n      }\n\n      var lineWidth = current.lineWidth;\n      var scale = current.textMatrixScale;\n      if (scale === 0 || lineWidth === 0) {\n        var fillStrokeMode = current.textRenderingMode &\n          TextRenderingMode.FILL_STROKE_MASK;\n        if (fillStrokeMode === TextRenderingMode.STROKE ||\n            fillStrokeMode === TextRenderingMode.FILL_STROKE) {\n          this._cachedGetSinglePixelWidth = null;\n          lineWidth = this.getSinglePixelWidth() * MIN_WIDTH_FACTOR;\n        }\n      } else {\n        lineWidth /= scale;\n      }\n\n      if (fontSizeScale !== 1.0) {\n        ctx.scale(fontSizeScale, fontSizeScale);\n        lineWidth /= fontSizeScale;\n      }\n\n      ctx.lineWidth = lineWidth;\n\n      var x = 0, i;\n      for (i = 0; i < glyphsLength; ++i) {\n        var glyph = glyphs[i];\n        if (isNum(glyph)) {\n          x += spacingDir * glyph * fontSize / 1000;\n          continue;\n        }\n\n        var restoreNeeded = false;\n        var spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing;\n        var character = glyph.fontChar;\n        var accent = glyph.accent;\n        var scaledX, scaledY, scaledAccentX, scaledAccentY;\n        var width = glyph.width;\n        if (vertical) {\n          var vmetric, vx, vy;\n          vmetric = glyph.vmetric || defaultVMetrics;\n          vx = glyph.vmetric ? vmetric[1] : width * 0.5;\n          vx = -vx * widthAdvanceScale;\n          vy = vmetric[2] * widthAdvanceScale;\n\n          width = vmetric ? -vmetric[0] : width;\n          scaledX = vx / fontSizeScale;\n          scaledY = (x + vy) / fontSizeScale;\n        } else {\n          scaledX = x / fontSizeScale;\n          scaledY = 0;\n        }\n\n        if (font.remeasure && width > 0) {\n          // Some standard fonts may not have the exact width: rescale per\n          // character if measured width is greater than expected glyph width\n          // and subpixel-aa is enabled, otherwise just center the glyph.\n          var measuredWidth = ctx.measureText(character).width * 1000 /\n            fontSize * fontSizeScale;\n          if (width < measuredWidth && this.isFontSubpixelAAEnabled) {\n            var characterScaleX = width / measuredWidth;\n            restoreNeeded = true;\n            ctx.save();\n            ctx.scale(characterScaleX, 1);\n            scaledX /= characterScaleX;\n          } else if (width !== measuredWidth) {\n            scaledX += (width - measuredWidth) / 2000 *\n              fontSize / fontSizeScale;\n          }\n        }\n\n        // Only attempt to draw the glyph if it is actually in the embedded font\n        // file or if there isn't a font file so the fallback font is shown.\n        if (glyph.isInFont || font.missingFile) {\n          if (simpleFillText && !accent) {\n            // common case\n            ctx.fillText(character, scaledX, scaledY);\n          } else {\n            this.paintChar(character, scaledX, scaledY, patternTransform);\n            if (accent) {\n              scaledAccentX = scaledX + accent.offset.x / fontSizeScale;\n              scaledAccentY = scaledY - accent.offset.y / fontSizeScale;\n              this.paintChar(accent.fontChar, scaledAccentX, scaledAccentY,\n                             patternTransform);\n            }\n          }\n        }\n\n        var charWidth = width * widthAdvanceScale + spacing * fontDirection;\n        x += charWidth;\n\n        if (restoreNeeded) {\n          ctx.restore();\n        }\n      }\n      if (vertical) {\n        current.y -= x * textHScale;\n      } else {\n        current.x += x * textHScale;\n      }\n      ctx.restore();\n    },\n\n    showType3Text: function CanvasGraphics_showType3Text(glyphs) {\n      // Type3 fonts - each glyph is a \"mini-PDF\"\n      var ctx = this.ctx;\n      var current = this.current;\n      var font = current.font;\n      var fontSize = current.fontSize;\n      var fontDirection = current.fontDirection;\n      var spacingDir = font.vertical ? 1 : -1;\n      var charSpacing = current.charSpacing;\n      var wordSpacing = current.wordSpacing;\n      var textHScale = current.textHScale * fontDirection;\n      var fontMatrix = current.fontMatrix || FONT_IDENTITY_MATRIX;\n      var glyphsLength = glyphs.length;\n      var isTextInvisible =\n        current.textRenderingMode === TextRenderingMode.INVISIBLE;\n      var i, glyph, width, spacingLength;\n\n      if (isTextInvisible || fontSize === 0) {\n        return;\n      }\n      this._cachedGetSinglePixelWidth = null;\n\n      ctx.save();\n      ctx.transform.apply(ctx, current.textMatrix);\n      ctx.translate(current.x, current.y);\n\n      ctx.scale(textHScale, fontDirection);\n\n      for (i = 0; i < glyphsLength; ++i) {\n        glyph = glyphs[i];\n        if (isNum(glyph)) {\n          spacingLength = spacingDir * glyph * fontSize / 1000;\n          this.ctx.translate(spacingLength, 0);\n          current.x += spacingLength * textHScale;\n          continue;\n        }\n\n        var spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing;\n        var operatorList = font.charProcOperatorList[glyph.operatorListId];\n        if (!operatorList) {\n          warn(`Type3 character \"${glyph.operatorListId}\" is not available.`);\n          continue;\n        }\n        this.processingType3 = glyph;\n        this.save();\n        ctx.scale(fontSize, fontSize);\n        ctx.transform.apply(ctx, fontMatrix);\n        this.executeOperatorList(operatorList);\n        this.restore();\n\n        var transformed = Util.applyTransform([glyph.width, 0], fontMatrix);\n        width = transformed[0] * fontSize + spacing;\n\n        ctx.translate(width, 0);\n        current.x += width * textHScale;\n      }\n      ctx.restore();\n      this.processingType3 = null;\n    },\n\n    // Type3 fonts\n    setCharWidth: function CanvasGraphics_setCharWidth(xWidth, yWidth) {\n      // We can safely ignore this since the width should be the same\n      // as the width in the Widths array.\n    },\n    setCharWidthAndBounds: function CanvasGraphics_setCharWidthAndBounds(xWidth,\n                                                                        yWidth,\n                                                                        llx,\n                                                                        lly,\n                                                                        urx,\n                                                                        ury) {\n      // TODO According to the spec we're also suppose to ignore any operators\n      // that set color or include images while processing this type3 font.\n      this.ctx.rect(llx, lly, urx - llx, ury - lly);\n      this.clip();\n      this.endPath();\n    },\n\n    // Color\n    getColorN_Pattern: function CanvasGraphics_getColorN_Pattern(IR) {\n      var pattern;\n      if (IR[0] === 'TilingPattern') {\n        var color = IR[1];\n        var baseTransform = this.baseTransform ||\n                            this.ctx.mozCurrentTransform.slice();\n        var canvasGraphicsFactory = {\n          createCanvasGraphics: (ctx) => {\n            return new CanvasGraphics(ctx, this.commonObjs, this.objs,\n                                      this.canvasFactory, this.webGLContext);\n          },\n        };\n        pattern = new TilingPattern(IR, color, this.ctx, canvasGraphicsFactory,\n                                    baseTransform);\n      } else {\n        pattern = getShadingPatternFromIR(IR);\n      }\n      return pattern;\n    },\n    setStrokeColorN: function CanvasGraphics_setStrokeColorN() {\n      this.current.strokeColor = this.getColorN_Pattern(arguments);\n    },\n    setFillColorN: function CanvasGraphics_setFillColorN() {\n      this.current.fillColor = this.getColorN_Pattern(arguments);\n      this.current.patternFill = true;\n    },\n    setStrokeRGBColor: function CanvasGraphics_setStrokeRGBColor(r, g, b) {\n      var color = Util.makeCssRgb(r, g, b);\n      this.ctx.strokeStyle = color;\n      this.current.strokeColor = color;\n    },\n    setFillRGBColor: function CanvasGraphics_setFillRGBColor(r, g, b) {\n      var color = Util.makeCssRgb(r, g, b);\n      this.ctx.fillStyle = color;\n      this.current.fillColor = color;\n      this.current.patternFill = false;\n    },\n\n    shadingFill: function CanvasGraphics_shadingFill(patternIR) {\n      var ctx = this.ctx;\n\n      this.save();\n      var pattern = getShadingPatternFromIR(patternIR);\n      ctx.fillStyle = pattern.getPattern(ctx, this, true);\n\n      var inv = ctx.mozCurrentTransformInverse;\n      if (inv) {\n        var canvas = ctx.canvas;\n        var width = canvas.width;\n        var height = canvas.height;\n\n        var bl = Util.applyTransform([0, 0], inv);\n        var br = Util.applyTransform([0, height], inv);\n        var ul = Util.applyTransform([width, 0], inv);\n        var ur = Util.applyTransform([width, height], inv);\n\n        var x0 = Math.min(bl[0], br[0], ul[0], ur[0]);\n        var y0 = Math.min(bl[1], br[1], ul[1], ur[1]);\n        var x1 = Math.max(bl[0], br[0], ul[0], ur[0]);\n        var y1 = Math.max(bl[1], br[1], ul[1], ur[1]);\n\n        this.ctx.fillRect(x0, y0, x1 - x0, y1 - y0);\n      } else {\n        // HACK to draw the gradient onto an infinite rectangle.\n        // PDF gradients are drawn across the entire image while\n        // Canvas only allows gradients to be drawn in a rectangle\n        // The following bug should allow us to remove this.\n        // https://bugzilla.mozilla.org/show_bug.cgi?id=664884\n\n        this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10);\n      }\n\n      this.restore();\n    },\n\n    // Images\n    beginInlineImage: function CanvasGraphics_beginInlineImage() {\n      unreachable('Should not call beginInlineImage');\n    },\n    beginImageData: function CanvasGraphics_beginImageData() {\n      unreachable('Should not call beginImageData');\n    },\n\n    paintFormXObjectBegin: function CanvasGraphics_paintFormXObjectBegin(matrix,\n                                                                        bbox) {\n      this.save();\n      this.baseTransformStack.push(this.baseTransform);\n\n      if (Array.isArray(matrix) && matrix.length === 6) {\n        this.transform.apply(this, matrix);\n      }\n\n      this.baseTransform = this.ctx.mozCurrentTransform;\n\n      if (Array.isArray(bbox) && bbox.length === 4) {\n        var width = bbox[2] - bbox[0];\n        var height = bbox[3] - bbox[1];\n        this.ctx.rect(bbox[0], bbox[1], width, height);\n        this.clip();\n        this.endPath();\n      }\n    },\n\n    paintFormXObjectEnd: function CanvasGraphics_paintFormXObjectEnd() {\n      this.restore();\n      this.baseTransform = this.baseTransformStack.pop();\n    },\n\n    beginGroup: function CanvasGraphics_beginGroup(group) {\n      this.save();\n      var currentCtx = this.ctx;\n      // TODO non-isolated groups - according to Rik at adobe non-isolated\n      // group results aren't usually that different and they even have tools\n      // that ignore this setting. Notes from Rik on implementing:\n      // - When you encounter an transparency group, create a new canvas with\n      // the dimensions of the bbox\n      // - copy the content from the previous canvas to the new canvas\n      // - draw as usual\n      // - remove the backdrop alpha:\n      // alphaNew = 1 - (1 - alpha)/(1 - alphaBackdrop) with 'alpha' the alpha\n      // value of your transparency group and 'alphaBackdrop' the alpha of the\n      // backdrop\n      // - remove background color:\n      // colorNew = color - alphaNew *colorBackdrop /(1 - alphaNew)\n      if (!group.isolated) {\n        info('TODO: Support non-isolated groups.');\n      }\n\n      // TODO knockout - supposedly possible with the clever use of compositing\n      // modes.\n      if (group.knockout) {\n        warn('Knockout groups not supported.');\n      }\n\n      var currentTransform = currentCtx.mozCurrentTransform;\n      if (group.matrix) {\n        currentCtx.transform.apply(currentCtx, group.matrix);\n      }\n      if (!group.bbox) {\n        throw new Error('Bounding box is required.');\n      }\n\n      // Based on the current transform figure out how big the bounding box\n      // will actually be.\n      var bounds = Util.getAxialAlignedBoundingBox(\n                    group.bbox,\n                    currentCtx.mozCurrentTransform);\n      // Clip the bounding box to the current canvas.\n      var canvasBounds = [0,\n                          0,\n                          currentCtx.canvas.width,\n                          currentCtx.canvas.height];\n      bounds = Util.intersect(bounds, canvasBounds) || [0, 0, 0, 0];\n      // Use ceil in case we're between sizes so we don't create canvas that is\n      // too small and make the canvas at least 1x1 pixels.\n      var offsetX = Math.floor(bounds[0]);\n      var offsetY = Math.floor(bounds[1]);\n      var drawnWidth = Math.max(Math.ceil(bounds[2]) - offsetX, 1);\n      var drawnHeight = Math.max(Math.ceil(bounds[3]) - offsetY, 1);\n      var scaleX = 1, scaleY = 1;\n      if (drawnWidth > MAX_GROUP_SIZE) {\n        scaleX = drawnWidth / MAX_GROUP_SIZE;\n        drawnWidth = MAX_GROUP_SIZE;\n      }\n      if (drawnHeight > MAX_GROUP_SIZE) {\n        scaleY = drawnHeight / MAX_GROUP_SIZE;\n        drawnHeight = MAX_GROUP_SIZE;\n      }\n\n      var cacheId = 'groupAt' + this.groupLevel;\n      if (group.smask) {\n        // Using two cache entries is case if masks are used one after another.\n        cacheId += '_smask_' + ((this.smaskCounter++) % 2);\n      }\n      var scratchCanvas = this.cachedCanvases.getCanvas(\n        cacheId, drawnWidth, drawnHeight, true);\n      var groupCtx = scratchCanvas.context;\n\n      // Since we created a new canvas that is just the size of the bounding box\n      // we have to translate the group ctx.\n      groupCtx.scale(1 / scaleX, 1 / scaleY);\n      groupCtx.translate(-offsetX, -offsetY);\n      groupCtx.transform.apply(groupCtx, currentTransform);\n\n      if (group.smask) {\n        // Saving state and cached mask to be used in setGState.\n        this.smaskStack.push({\n          canvas: scratchCanvas.canvas,\n          context: groupCtx,\n          offsetX,\n          offsetY,\n          scaleX,\n          scaleY,\n          subtype: group.smask.subtype,\n          backdrop: group.smask.backdrop,\n          transferMap: group.smask.transferMap || null,\n          startTransformInverse: null, // used during suspend operation\n        });\n      } else {\n        // Setup the current ctx so when the group is popped we draw it at the\n        // right location.\n        currentCtx.setTransform(1, 0, 0, 1, 0, 0);\n        currentCtx.translate(offsetX, offsetY);\n        currentCtx.scale(scaleX, scaleY);\n      }\n      // The transparency group inherits all off the current graphics state\n      // except the blend mode, soft mask, and alpha constants.\n      copyCtxState(currentCtx, groupCtx);\n      this.ctx = groupCtx;\n      this.setGState([\n        ['BM', 'source-over'],\n        ['ca', 1],\n        ['CA', 1]\n      ]);\n      this.groupStack.push(currentCtx);\n      this.groupLevel++;\n\n      // Reseting mask state, masks will be applied on restore of the group.\n      this.current.activeSMask = null;\n    },\n\n    endGroup: function CanvasGraphics_endGroup(group) {\n      this.groupLevel--;\n      var groupCtx = this.ctx;\n      this.ctx = this.groupStack.pop();\n      // Turn off image smoothing to avoid sub pixel interpolation which can\n      // look kind of blurry for some pdfs.\n      if (this.ctx.imageSmoothingEnabled !== undefined) {\n        this.ctx.imageSmoothingEnabled = false;\n      } else {\n        this.ctx.mozImageSmoothingEnabled = false;\n      }\n      if (group.smask) {\n        this.tempSMask = this.smaskStack.pop();\n      } else {\n        this.ctx.drawImage(groupCtx.canvas, 0, 0);\n      }\n      this.restore();\n    },\n\n    beginAnnotations: function CanvasGraphics_beginAnnotations() {\n      this.save();\n      if (this.baseTransform) {\n        this.ctx.setTransform.apply(this.ctx, this.baseTransform);\n      }\n    },\n\n    endAnnotations: function CanvasGraphics_endAnnotations() {\n      this.restore();\n    },\n\n    beginAnnotation: function CanvasGraphics_beginAnnotation(rect, transform,\n                                                             matrix) {\n      this.save();\n      resetCtxToDefault(this.ctx);\n      this.current = new CanvasExtraState();\n\n      if (Array.isArray(rect) && rect.length === 4) {\n        var width = rect[2] - rect[0];\n        var height = rect[3] - rect[1];\n        this.ctx.rect(rect[0], rect[1], width, height);\n        this.clip();\n        this.endPath();\n      }\n\n      this.transform.apply(this, transform);\n      this.transform.apply(this, matrix);\n    },\n\n    endAnnotation: function CanvasGraphics_endAnnotation() {\n      this.restore();\n    },\n\n    paintJpegXObject: function CanvasGraphics_paintJpegXObject(objId, w, h) {\n      var domImage = this.objs.get(objId);\n      if (!domImage) {\n        warn('Dependent image isn\\'t ready yet');\n        return;\n      }\n\n      this.save();\n\n      var ctx = this.ctx;\n      // scale the image to the unit square\n      ctx.scale(1 / w, -1 / h);\n\n      ctx.drawImage(domImage, 0, 0, domImage.width, domImage.height,\n                    0, -h, w, h);\n      if (this.imageLayer) {\n        var currentTransform = ctx.mozCurrentTransformInverse;\n        var position = this.getCanvasPosition(0, 0);\n        this.imageLayer.appendImage({\n          objId,\n          left: position[0],\n          top: position[1],\n          width: w / currentTransform[0],\n          height: h / currentTransform[3],\n        });\n      }\n      this.restore();\n    },\n\n    paintImageMaskXObject: function CanvasGraphics_paintImageMaskXObject(img) {\n      var ctx = this.ctx;\n      var width = img.width, height = img.height;\n      var fillColor = this.current.fillColor;\n      var isPatternFill = this.current.patternFill;\n\n      var glyph = this.processingType3;\n\n      if (COMPILE_TYPE3_GLYPHS && glyph && glyph.compiled === undefined) {\n        if (width <= MAX_SIZE_TO_COMPILE && height <= MAX_SIZE_TO_COMPILE) {\n          glyph.compiled =\n            compileType3Glyph({ data: img.data, width, height, });\n        } else {\n          glyph.compiled = null;\n        }\n      }\n\n      if (glyph && glyph.compiled) {\n        glyph.compiled(ctx);\n        return;\n      }\n\n      var maskCanvas = this.cachedCanvases.getCanvas('maskCanvas',\n                                                     width, height);\n      var maskCtx = maskCanvas.context;\n      maskCtx.save();\n\n      putBinaryImageMask(maskCtx, img);\n\n      maskCtx.globalCompositeOperation = 'source-in';\n\n      maskCtx.fillStyle = isPatternFill ?\n                          fillColor.getPattern(maskCtx, this) : fillColor;\n      maskCtx.fillRect(0, 0, width, height);\n\n      maskCtx.restore();\n\n      this.paintInlineImageXObject(maskCanvas.canvas);\n    },\n\n    paintImageMaskXObjectRepeat:\n      function CanvasGraphics_paintImageMaskXObjectRepeat(imgData, scaleX,\n                                                          scaleY, positions) {\n      var width = imgData.width;\n      var height = imgData.height;\n      var fillColor = this.current.fillColor;\n      var isPatternFill = this.current.patternFill;\n\n      var maskCanvas = this.cachedCanvases.getCanvas('maskCanvas',\n                                                     width, height);\n      var maskCtx = maskCanvas.context;\n      maskCtx.save();\n\n      putBinaryImageMask(maskCtx, imgData);\n\n      maskCtx.globalCompositeOperation = 'source-in';\n\n      maskCtx.fillStyle = isPatternFill ?\n                          fillColor.getPattern(maskCtx, this) : fillColor;\n      maskCtx.fillRect(0, 0, width, height);\n\n      maskCtx.restore();\n\n      var ctx = this.ctx;\n      for (var i = 0, ii = positions.length; i < ii; i += 2) {\n        ctx.save();\n        ctx.transform(scaleX, 0, 0, scaleY, positions[i], positions[i + 1]);\n        ctx.scale(1, -1);\n        ctx.drawImage(maskCanvas.canvas, 0, 0, width, height,\n          0, -1, 1, 1);\n        ctx.restore();\n      }\n    },\n\n    paintImageMaskXObjectGroup:\n      function CanvasGraphics_paintImageMaskXObjectGroup(images) {\n      var ctx = this.ctx;\n\n      var fillColor = this.current.fillColor;\n      var isPatternFill = this.current.patternFill;\n      for (var i = 0, ii = images.length; i < ii; i++) {\n        var image = images[i];\n        var width = image.width, height = image.height;\n\n        var maskCanvas = this.cachedCanvases.getCanvas('maskCanvas',\n                                                       width, height);\n        var maskCtx = maskCanvas.context;\n        maskCtx.save();\n\n        putBinaryImageMask(maskCtx, image);\n\n        maskCtx.globalCompositeOperation = 'source-in';\n\n        maskCtx.fillStyle = isPatternFill ?\n                            fillColor.getPattern(maskCtx, this) : fillColor;\n        maskCtx.fillRect(0, 0, width, height);\n\n        maskCtx.restore();\n\n        ctx.save();\n        ctx.transform.apply(ctx, image.transform);\n        ctx.scale(1, -1);\n        ctx.drawImage(maskCanvas.canvas, 0, 0, width, height,\n                      0, -1, 1, 1);\n        ctx.restore();\n      }\n    },\n\n    paintImageXObject: function CanvasGraphics_paintImageXObject(objId) {\n      var imgData = this.objs.get(objId);\n      if (!imgData) {\n        warn('Dependent image isn\\'t ready yet');\n        return;\n      }\n\n      this.paintInlineImageXObject(imgData);\n    },\n\n    paintImageXObjectRepeat:\n      function CanvasGraphics_paintImageXObjectRepeat(objId, scaleX, scaleY,\n                                                          positions) {\n      var imgData = this.objs.get(objId);\n      if (!imgData) {\n        warn('Dependent image isn\\'t ready yet');\n        return;\n      }\n\n      var width = imgData.width;\n      var height = imgData.height;\n      var map = [];\n      for (var i = 0, ii = positions.length; i < ii; i += 2) {\n        map.push({ transform: [scaleX, 0, 0, scaleY, positions[i],\n                   positions[i + 1]], x: 0, y: 0, w: width, h: height, });\n      }\n      this.paintInlineImageXObjectGroup(imgData, map);\n    },\n\n    paintInlineImageXObject:\n      function CanvasGraphics_paintInlineImageXObject(imgData) {\n      var width = imgData.width;\n      var height = imgData.height;\n      var ctx = this.ctx;\n\n      this.save();\n      // scale the image to the unit square\n      ctx.scale(1 / width, -1 / height);\n\n      var currentTransform = ctx.mozCurrentTransformInverse;\n      var a = currentTransform[0], b = currentTransform[1];\n      var widthScale = Math.max(Math.sqrt(a * a + b * b), 1);\n      var c = currentTransform[2], d = currentTransform[3];\n      var heightScale = Math.max(Math.sqrt(c * c + d * d), 1);\n\n      var imgToPaint, tmpCanvas;\n      // typeof check is needed due to node.js support, see issue #8489\n      if ((typeof HTMLElement === 'function' &&\n           imgData instanceof HTMLElement) || !imgData.data) {\n        imgToPaint = imgData;\n      } else {\n        tmpCanvas = this.cachedCanvases.getCanvas('inlineImage',\n                                                  width, height);\n        var tmpCtx = tmpCanvas.context;\n        putBinaryImageData(tmpCtx, imgData);\n        imgToPaint = tmpCanvas.canvas;\n      }\n\n      var paintWidth = width, paintHeight = height;\n      var tmpCanvasId = 'prescale1';\n      // Vertial or horizontal scaling shall not be more than 2 to not loose the\n      // pixels during drawImage operation, painting on the temporary canvas(es)\n      // that are twice smaller in size\n      while ((widthScale > 2 && paintWidth > 1) ||\n             (heightScale > 2 && paintHeight > 1)) {\n        var newWidth = paintWidth, newHeight = paintHeight;\n        if (widthScale > 2 && paintWidth > 1) {\n          newWidth = Math.ceil(paintWidth / 2);\n          widthScale /= paintWidth / newWidth;\n        }\n        if (heightScale > 2 && paintHeight > 1) {\n          newHeight = Math.ceil(paintHeight / 2);\n          heightScale /= paintHeight / newHeight;\n        }\n        tmpCanvas = this.cachedCanvases.getCanvas(tmpCanvasId,\n                                                  newWidth, newHeight);\n        tmpCtx = tmpCanvas.context;\n        tmpCtx.clearRect(0, 0, newWidth, newHeight);\n        tmpCtx.drawImage(imgToPaint, 0, 0, paintWidth, paintHeight,\n                                     0, 0, newWidth, newHeight);\n        imgToPaint = tmpCanvas.canvas;\n        paintWidth = newWidth;\n        paintHeight = newHeight;\n        tmpCanvasId = tmpCanvasId === 'prescale1' ? 'prescale2' : 'prescale1';\n      }\n      ctx.drawImage(imgToPaint, 0, 0, paintWidth, paintHeight,\n                                0, -height, width, height);\n\n      if (this.imageLayer) {\n        var position = this.getCanvasPosition(0, -height);\n        this.imageLayer.appendImage({\n          imgData,\n          left: position[0],\n          top: position[1],\n          width: width / currentTransform[0],\n          height: height / currentTransform[3],\n        });\n      }\n      this.restore();\n    },\n\n    paintInlineImageXObjectGroup:\n      function CanvasGraphics_paintInlineImageXObjectGroup(imgData, map) {\n      var ctx = this.ctx;\n      var w = imgData.width;\n      var h = imgData.height;\n\n      var tmpCanvas = this.cachedCanvases.getCanvas('inlineImage', w, h);\n      var tmpCtx = tmpCanvas.context;\n      putBinaryImageData(tmpCtx, imgData);\n\n      for (var i = 0, ii = map.length; i < ii; i++) {\n        var entry = map[i];\n        ctx.save();\n        ctx.transform.apply(ctx, entry.transform);\n        ctx.scale(1, -1);\n        ctx.drawImage(tmpCanvas.canvas, entry.x, entry.y, entry.w, entry.h,\n                      0, -1, 1, 1);\n        if (this.imageLayer) {\n          var position = this.getCanvasPosition(entry.x, entry.y);\n          this.imageLayer.appendImage({\n            imgData,\n            left: position[0],\n            top: position[1],\n            width: w,\n            height: h,\n          });\n        }\n        ctx.restore();\n      }\n    },\n\n    paintSolidColorImageMask:\n      function CanvasGraphics_paintSolidColorImageMask() {\n        this.ctx.fillRect(0, 0, 1, 1);\n    },\n\n    paintXObject: function CanvasGraphics_paintXObject() {\n      warn('Unsupported \\'paintXObject\\' command.');\n    },\n\n    // Marked content\n\n    markPoint: function CanvasGraphics_markPoint(tag) {\n      // TODO Marked content.\n    },\n    markPointProps: function CanvasGraphics_markPointProps(tag, properties) {\n      // TODO Marked content.\n    },\n    beginMarkedContent: function CanvasGraphics_beginMarkedContent(tag) {\n      // TODO Marked content.\n    },\n    beginMarkedContentProps: function CanvasGraphics_beginMarkedContentProps(\n                                        tag, properties) {\n      // TODO Marked content.\n    },\n    endMarkedContent: function CanvasGraphics_endMarkedContent() {\n      // TODO Marked content.\n    },\n\n    // Compatibility\n\n    beginCompat: function CanvasGraphics_beginCompat() {\n      // TODO ignore undefined operators (should we do that anyway?)\n    },\n    endCompat: function CanvasGraphics_endCompat() {\n      // TODO stop ignoring undefined operators\n    },\n\n    // Helper functions\n\n    consumePath: function CanvasGraphics_consumePath() {\n      var ctx = this.ctx;\n      if (this.pendingClip) {\n        if (this.pendingClip === EO_CLIP) {\n          ctx.clip('evenodd');\n        } else {\n          ctx.clip();\n        }\n        this.pendingClip = null;\n      }\n      ctx.beginPath();\n    },\n    getSinglePixelWidth(scale) {\n      if (this._cachedGetSinglePixelWidth === null) {\n        const inverse = this.ctx.mozCurrentTransformInverse;\n        // max of the current horizontal and vertical scale\n        this._cachedGetSinglePixelWidth = Math.sqrt(Math.max(\n          (inverse[0] * inverse[0] + inverse[1] * inverse[1]),\n          (inverse[2] * inverse[2] + inverse[3] * inverse[3])));\n      }\n      return this._cachedGetSinglePixelWidth;\n    },\n    getCanvasPosition: function CanvasGraphics_getCanvasPosition(x, y) {\n      var transform = this.ctx.mozCurrentTransform;\n      return [\n        transform[0] * x + transform[2] * y + transform[4],\n        transform[1] * x + transform[3] * y + transform[5]\n      ];\n    },\n  };\n\n  for (var op in OPS) {\n    CanvasGraphics.prototype[OPS[op]] = CanvasGraphics.prototype[op];\n  }\n\n  return CanvasGraphics;\n})();\n\nexport {\n  CanvasGraphics,\n};\n","/* Copyright 2014 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FormatError, info, Util } from '../shared/util';\n\nvar ShadingIRs = {};\n\nShadingIRs.RadialAxial = {\n  fromIR: function RadialAxial_fromIR(raw) {\n    var type = raw[1];\n    var colorStops = raw[2];\n    var p0 = raw[3];\n    var p1 = raw[4];\n    var r0 = raw[5];\n    var r1 = raw[6];\n    return {\n      type: 'Pattern',\n      getPattern: function RadialAxial_getPattern(ctx) {\n        var grad;\n        if (type === 'axial') {\n          grad = ctx.createLinearGradient(p0[0], p0[1], p1[0], p1[1]);\n        } else if (type === 'radial') {\n          grad = ctx.createRadialGradient(p0[0], p0[1], r0, p1[0], p1[1], r1);\n        }\n\n        for (var i = 0, ii = colorStops.length; i < ii; ++i) {\n          var c = colorStops[i];\n          grad.addColorStop(c[0], c[1]);\n        }\n        return grad;\n      },\n    };\n  },\n};\n\nvar createMeshCanvas = (function createMeshCanvasClosure() {\n  function drawTriangle(data, context, p1, p2, p3, c1, c2, c3) {\n    // Very basic Gouraud-shaded triangle rasterization algorithm.\n    var coords = context.coords, colors = context.colors;\n    var bytes = data.data, rowSize = data.width * 4;\n    var tmp;\n    if (coords[p1 + 1] > coords[p2 + 1]) {\n      tmp = p1; p1 = p2; p2 = tmp; tmp = c1; c1 = c2; c2 = tmp;\n    }\n    if (coords[p2 + 1] > coords[p3 + 1]) {\n      tmp = p2; p2 = p3; p3 = tmp; tmp = c2; c2 = c3; c3 = tmp;\n    }\n    if (coords[p1 + 1] > coords[p2 + 1]) {\n      tmp = p1; p1 = p2; p2 = tmp; tmp = c1; c1 = c2; c2 = tmp;\n    }\n    var x1 = (coords[p1] + context.offsetX) * context.scaleX;\n    var y1 = (coords[p1 + 1] + context.offsetY) * context.scaleY;\n    var x2 = (coords[p2] + context.offsetX) * context.scaleX;\n    var y2 = (coords[p2 + 1] + context.offsetY) * context.scaleY;\n    var x3 = (coords[p3] + context.offsetX) * context.scaleX;\n    var y3 = (coords[p3 + 1] + context.offsetY) * context.scaleY;\n    if (y1 >= y3) {\n      return;\n    }\n    var c1r = colors[c1], c1g = colors[c1 + 1], c1b = colors[c1 + 2];\n    var c2r = colors[c2], c2g = colors[c2 + 1], c2b = colors[c2 + 2];\n    var c3r = colors[c3], c3g = colors[c3 + 1], c3b = colors[c3 + 2];\n\n    var minY = Math.round(y1), maxY = Math.round(y3);\n    var xa, car, cag, cab;\n    var xb, cbr, cbg, cbb;\n    var k;\n    for (var y = minY; y <= maxY; y++) {\n      if (y < y2) {\n        k = y < y1 ? 0 : y1 === y2 ? 1 : (y1 - y) / (y1 - y2);\n        xa = x1 - (x1 - x2) * k;\n        car = c1r - (c1r - c2r) * k;\n        cag = c1g - (c1g - c2g) * k;\n        cab = c1b - (c1b - c2b) * k;\n      } else {\n        k = y > y3 ? 1 : y2 === y3 ? 0 : (y2 - y) / (y2 - y3);\n        xa = x2 - (x2 - x3) * k;\n        car = c2r - (c2r - c3r) * k;\n        cag = c2g - (c2g - c3g) * k;\n        cab = c2b - (c2b - c3b) * k;\n      }\n      k = y < y1 ? 0 : y > y3 ? 1 : (y1 - y) / (y1 - y3);\n      xb = x1 - (x1 - x3) * k;\n      cbr = c1r - (c1r - c3r) * k;\n      cbg = c1g - (c1g - c3g) * k;\n      cbb = c1b - (c1b - c3b) * k;\n      var x1_ = Math.round(Math.min(xa, xb));\n      var x2_ = Math.round(Math.max(xa, xb));\n      var j = rowSize * y + x1_ * 4;\n      for (var x = x1_; x <= x2_; x++) {\n        k = (xa - x) / (xa - xb);\n        k = k < 0 ? 0 : k > 1 ? 1 : k;\n        bytes[j++] = (car - (car - cbr) * k) | 0;\n        bytes[j++] = (cag - (cag - cbg) * k) | 0;\n        bytes[j++] = (cab - (cab - cbb) * k) | 0;\n        bytes[j++] = 255;\n      }\n    }\n  }\n\n  function drawFigure(data, figure, context) {\n    var ps = figure.coords;\n    var cs = figure.colors;\n    var i, ii;\n    switch (figure.type) {\n      case 'lattice':\n        var verticesPerRow = figure.verticesPerRow;\n        var rows = Math.floor(ps.length / verticesPerRow) - 1;\n        var cols = verticesPerRow - 1;\n        for (i = 0; i < rows; i++) {\n          var q = i * verticesPerRow;\n          for (var j = 0; j < cols; j++, q++) {\n            drawTriangle(data, context,\n              ps[q], ps[q + 1], ps[q + verticesPerRow],\n              cs[q], cs[q + 1], cs[q + verticesPerRow]);\n            drawTriangle(data, context,\n              ps[q + verticesPerRow + 1], ps[q + 1], ps[q + verticesPerRow],\n              cs[q + verticesPerRow + 1], cs[q + 1], cs[q + verticesPerRow]);\n          }\n        }\n        break;\n      case 'triangles':\n        for (i = 0, ii = ps.length; i < ii; i += 3) {\n          drawTriangle(data, context,\n            ps[i], ps[i + 1], ps[i + 2],\n            cs[i], cs[i + 1], cs[i + 2]);\n        }\n        break;\n      default:\n        throw new Error('illegal figure');\n    }\n  }\n\n  function createMeshCanvas(bounds, combinesScale, coords, colors, figures,\n                            backgroundColor, cachedCanvases, webGLContext) {\n    // we will increase scale on some weird factor to let antialiasing take\n    // care of \"rough\" edges\n    var EXPECTED_SCALE = 1.1;\n    // MAX_PATTERN_SIZE is used to avoid OOM situation.\n    var MAX_PATTERN_SIZE = 3000; // 10in @ 300dpi shall be enough\n    // We need to keep transparent border around our pattern for fill():\n    // createPattern with 'no-repeat' will bleed edges across entire area.\n    var BORDER_SIZE = 2;\n\n    var offsetX = Math.floor(bounds[0]);\n    var offsetY = Math.floor(bounds[1]);\n    var boundsWidth = Math.ceil(bounds[2]) - offsetX;\n    var boundsHeight = Math.ceil(bounds[3]) - offsetY;\n\n    var width = Math.min(Math.ceil(Math.abs(boundsWidth * combinesScale[0] *\n      EXPECTED_SCALE)), MAX_PATTERN_SIZE);\n    var height = Math.min(Math.ceil(Math.abs(boundsHeight * combinesScale[1] *\n      EXPECTED_SCALE)), MAX_PATTERN_SIZE);\n    var scaleX = boundsWidth / width;\n    var scaleY = boundsHeight / height;\n\n    var context = {\n      coords,\n      colors,\n      offsetX: -offsetX,\n      offsetY: -offsetY,\n      scaleX: 1 / scaleX,\n      scaleY: 1 / scaleY,\n    };\n\n    var paddedWidth = width + BORDER_SIZE * 2;\n    var paddedHeight = height + BORDER_SIZE * 2;\n\n    var canvas, tmpCanvas, i, ii;\n    if (webGLContext.isEnabled) {\n      canvas = webGLContext.drawFigures({\n        width,\n        height,\n        backgroundColor,\n        figures,\n        context,\n      });\n      // https://bugzilla.mozilla.org/show_bug.cgi?id=972126\n      tmpCanvas = cachedCanvases.getCanvas('mesh', paddedWidth, paddedHeight,\n                                           false);\n      tmpCanvas.context.drawImage(canvas, BORDER_SIZE, BORDER_SIZE);\n      canvas = tmpCanvas.canvas;\n    } else {\n      tmpCanvas = cachedCanvases.getCanvas('mesh', paddedWidth, paddedHeight,\n                                           false);\n      var tmpCtx = tmpCanvas.context;\n\n      var data = tmpCtx.createImageData(width, height);\n      if (backgroundColor) {\n        var bytes = data.data;\n        for (i = 0, ii = bytes.length; i < ii; i += 4) {\n          bytes[i] = backgroundColor[0];\n          bytes[i + 1] = backgroundColor[1];\n          bytes[i + 2] = backgroundColor[2];\n          bytes[i + 3] = 255;\n        }\n      }\n      for (i = 0; i < figures.length; i++) {\n        drawFigure(data, figures[i], context);\n      }\n      tmpCtx.putImageData(data, BORDER_SIZE, BORDER_SIZE);\n      canvas = tmpCanvas.canvas;\n    }\n\n    return {\n      canvas,\n      offsetX: offsetX - BORDER_SIZE * scaleX,\n      offsetY: offsetY - BORDER_SIZE * scaleY,\n      scaleX,\n      scaleY,\n    };\n  }\n  return createMeshCanvas;\n})();\n\nShadingIRs.Mesh = {\n  fromIR: function Mesh_fromIR(raw) {\n    // var type = raw[1];\n    var coords = raw[2];\n    var colors = raw[3];\n    var figures = raw[4];\n    var bounds = raw[5];\n    var matrix = raw[6];\n    // var bbox = raw[7];\n    var background = raw[8];\n    return {\n      type: 'Pattern',\n      getPattern: function Mesh_getPattern(ctx, owner, shadingFill) {\n        var scale;\n        if (shadingFill) {\n          scale = Util.singularValueDecompose2dScale(ctx.mozCurrentTransform);\n        } else {\n          // Obtain scale from matrix and current transformation matrix.\n          scale = Util.singularValueDecompose2dScale(owner.baseTransform);\n          if (matrix) {\n            var matrixScale = Util.singularValueDecompose2dScale(matrix);\n            scale = [scale[0] * matrixScale[0],\n                     scale[1] * matrixScale[1]];\n          }\n        }\n\n        // Rasterizing on the main thread since sending/queue large canvases\n        // might cause OOM.\n        var temporaryPatternCanvas = createMeshCanvas(bounds, scale, coords,\n          colors, figures, shadingFill ? null : background,\n          owner.cachedCanvases, owner.webGLContext);\n\n        if (!shadingFill) {\n          ctx.setTransform.apply(ctx, owner.baseTransform);\n          if (matrix) {\n            ctx.transform.apply(ctx, matrix);\n          }\n        }\n\n        ctx.translate(temporaryPatternCanvas.offsetX,\n                      temporaryPatternCanvas.offsetY);\n        ctx.scale(temporaryPatternCanvas.scaleX,\n                  temporaryPatternCanvas.scaleY);\n\n        return ctx.createPattern(temporaryPatternCanvas.canvas, 'no-repeat');\n      },\n    };\n  },\n};\n\nShadingIRs.Dummy = {\n  fromIR: function Dummy_fromIR() {\n    return {\n      type: 'Pattern',\n      getPattern: function Dummy_fromIR_getPattern() {\n        return 'hotpink';\n      },\n    };\n  },\n};\n\nfunction getShadingPatternFromIR(raw) {\n  var shadingIR = ShadingIRs[raw[0]];\n  if (!shadingIR) {\n    throw new Error(`Unknown IR type: ${raw[0]}`);\n  }\n  return shadingIR.fromIR(raw);\n}\n\nvar TilingPattern = (function TilingPatternClosure() {\n  var PaintType = {\n    COLORED: 1,\n    UNCOLORED: 2,\n  };\n\n  var MAX_PATTERN_SIZE = 3000; // 10in @ 300dpi shall be enough\n\n  function TilingPattern(IR, color, ctx, canvasGraphicsFactory, baseTransform) {\n    this.operatorList = IR[2];\n    this.matrix = IR[3] || [1, 0, 0, 1, 0, 0];\n    this.bbox = IR[4];\n    this.xstep = IR[5];\n    this.ystep = IR[6];\n    this.paintType = IR[7];\n    this.tilingType = IR[8];\n    this.color = color;\n    this.canvasGraphicsFactory = canvasGraphicsFactory;\n    this.baseTransform = baseTransform;\n    this.type = 'Pattern';\n    this.ctx = ctx;\n  }\n\n  TilingPattern.prototype = {\n    createPatternCanvas: function TilinPattern_createPatternCanvas(owner) {\n      var operatorList = this.operatorList;\n      var bbox = this.bbox;\n      var xstep = this.xstep;\n      var ystep = this.ystep;\n      var paintType = this.paintType;\n      var tilingType = this.tilingType;\n      var color = this.color;\n      var canvasGraphicsFactory = this.canvasGraphicsFactory;\n\n      info('TilingType: ' + tilingType);\n\n      var x0 = bbox[0], y0 = bbox[1], x1 = bbox[2], y1 = bbox[3];\n\n      var topLeft = [x0, y0];\n      // we want the canvas to be as large as the step size\n      var botRight = [x0 + xstep, y0 + ystep];\n\n      var width = botRight[0] - topLeft[0];\n      var height = botRight[1] - topLeft[1];\n\n      // Obtain scale from matrix and current transformation matrix.\n      var matrixScale = Util.singularValueDecompose2dScale(this.matrix);\n      var curMatrixScale = Util.singularValueDecompose2dScale(\n        this.baseTransform);\n      var combinedScale = [matrixScale[0] * curMatrixScale[0],\n        matrixScale[1] * curMatrixScale[1]];\n\n      // MAX_PATTERN_SIZE is used to avoid OOM situation.\n      // Use width and height values that are as close as possible to the end\n      // result when the pattern is used. Too low value makes the pattern look\n      // blurry. Too large value makes it look too crispy.\n      width = Math.min(Math.ceil(Math.abs(width * combinedScale[0])),\n        MAX_PATTERN_SIZE);\n\n      height = Math.min(Math.ceil(Math.abs(height * combinedScale[1])),\n        MAX_PATTERN_SIZE);\n\n      var tmpCanvas = owner.cachedCanvases.getCanvas('pattern',\n        width, height, true);\n      var tmpCtx = tmpCanvas.context;\n      var graphics = canvasGraphicsFactory.createCanvasGraphics(tmpCtx);\n      graphics.groupLevel = owner.groupLevel;\n\n      this.setFillAndStrokeStyleToContext(graphics, paintType, color);\n\n      this.setScale(width, height, xstep, ystep);\n      this.transformToScale(graphics);\n\n      // transform coordinates to pattern space\n      var tmpTranslate = [1, 0, 0, 1, -topLeft[0], -topLeft[1]];\n      graphics.transform.apply(graphics, tmpTranslate);\n\n      this.clipBbox(graphics, bbox, x0, y0, x1, y1);\n\n      graphics.executeOperatorList(operatorList);\n      return tmpCanvas.canvas;\n    },\n\n    setScale: function TilingPattern_setScale(width, height, xstep, ystep) {\n      this.scale = [width / xstep, height / ystep];\n    },\n\n    transformToScale: function TilingPattern_transformToScale(graphics) {\n      var scale = this.scale;\n      var tmpScale = [scale[0], 0, 0, scale[1], 0, 0];\n      graphics.transform.apply(graphics, tmpScale);\n    },\n\n    scaleToContext: function TilingPattern_scaleToContext() {\n      var scale = this.scale;\n      this.ctx.scale(1 / scale[0], 1 / scale[1]);\n    },\n\n    clipBbox: function clipBbox(graphics, bbox, x0, y0, x1, y1) {\n      if (Array.isArray(bbox) && bbox.length === 4) {\n        var bboxWidth = x1 - x0;\n        var bboxHeight = y1 - y0;\n        graphics.ctx.rect(x0, y0, bboxWidth, bboxHeight);\n        graphics.clip();\n        graphics.endPath();\n      }\n    },\n\n    setFillAndStrokeStyleToContext:\n      function setFillAndStrokeStyleToContext(graphics, paintType, color) {\n        let context = graphics.ctx, current = graphics.current;\n        switch (paintType) {\n          case PaintType.COLORED:\n            var ctx = this.ctx;\n            context.fillStyle = ctx.fillStyle;\n            context.strokeStyle = ctx.strokeStyle;\n            current.fillColor = ctx.fillStyle;\n            current.strokeColor = ctx.strokeStyle;\n            break;\n          case PaintType.UNCOLORED:\n            var cssColor = Util.makeCssRgb(color[0], color[1], color[2]);\n            context.fillStyle = cssColor;\n            context.strokeStyle = cssColor;\n            // Set color needed by image masks (fixes issues 3226 and 8741).\n            current.fillColor = cssColor;\n            current.strokeColor = cssColor;\n            break;\n          default:\n            throw new FormatError(`Unsupported paint type: ${paintType}`);\n        }\n      },\n\n    getPattern: function TilingPattern_getPattern(ctx, owner) {\n      var temporaryPatternCanvas = this.createPatternCanvas(owner);\n\n      ctx = this.ctx;\n      ctx.setTransform.apply(ctx, this.baseTransform);\n      ctx.transform.apply(ctx, this.matrix);\n      this.scaleToContext();\n\n      return ctx.createPattern(temporaryPatternCanvas, 'repeat');\n    },\n  };\n\n  return TilingPattern;\n})();\n\nexport {\n  getShadingPatternFromIR,\n  TilingPattern,\n};\n","/* Copyright 2018 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst GlobalWorkerOptions = Object.create(null);\n\n/**\n * Defines global port for worker process. Overrides the `workerSrc` option.\n * @var {Object}\n */\nGlobalWorkerOptions.workerPort = (GlobalWorkerOptions.workerPort === undefined ?\n                                  null : GlobalWorkerOptions.workerPort);\n\n/**\n * Path and filename of the worker file. Required when workers are enabled in\n * development mode. If unspecified in production builds, the worker will be\n * loaded based on the location of the `pdf.js` file.\n *\n * NOTE: The `workerSrc` should always be set in custom applications, in order\n *       to prevent issues caused by third-party frameworks and libraries.\n * @var {string}\n */\nGlobalWorkerOptions.workerSrc = (GlobalWorkerOptions.workerSrc === undefined ?\n                                 '' : GlobalWorkerOptions.workerSrc);\n\nexport {\n  GlobalWorkerOptions,\n};\n","/* Copyright 2018 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  AbortException, assert, createPromiseCapability, MissingPDFException,\n  ReadableStream, UnexpectedResponseException, UnknownErrorException\n} from './util';\n\nasync function resolveCall(fn, args, thisArg = null) {\n  if (!fn) {\n    return;\n  }\n  return fn.apply(thisArg, args);\n}\n\nfunction wrapReason(reason) {\n  if (typeof reason !== 'object') {\n    return reason;\n  }\n  switch (reason.name) {\n    case 'AbortException':\n      return new AbortException(reason.message);\n    case 'MissingPDFException':\n      return new MissingPDFException(reason.message);\n    case 'UnexpectedResponseException':\n      return new UnexpectedResponseException(reason.message, reason.status);\n    default:\n      return new UnknownErrorException(reason.message, reason.details);\n  }\n}\n\nfunction makeReasonSerializable(reason) {\n  if (!(reason instanceof Error) ||\n      reason instanceof AbortException ||\n      reason instanceof MissingPDFException ||\n      reason instanceof UnexpectedResponseException ||\n      reason instanceof UnknownErrorException) {\n    return reason;\n  }\n  return new UnknownErrorException(reason.message, reason.toString());\n}\n\nfunction resolveOrReject(capability, success, reason) {\n  if (success) {\n    capability.resolve();\n  } else {\n    capability.reject(reason);\n  }\n}\n\nfunction finalize(promise) {\n  return Promise.resolve(promise).catch(() => {});\n}\n\nfunction MessageHandler(sourceName, targetName, comObj) {\n  this.sourceName = sourceName;\n  this.targetName = targetName;\n  this.comObj = comObj;\n  this.callbackId = 1;\n  this.streamId = 1;\n  this.postMessageTransfers = true;\n  this.streamSinks = Object.create(null);\n  this.streamControllers = Object.create(null);\n  let callbacksCapabilities = this.callbacksCapabilities = Object.create(null);\n  let ah = this.actionHandler = Object.create(null);\n\n  this._onComObjOnMessage = (event) => {\n    let data = event.data;\n    if (data.targetName !== this.sourceName) {\n      return;\n    }\n    if (data.stream) {\n      this._processStreamMessage(data);\n    } else if (data.isReply) {\n      let callbackId = data.callbackId;\n      if (data.callbackId in callbacksCapabilities) {\n        let callback = callbacksCapabilities[callbackId];\n        delete callbacksCapabilities[callbackId];\n        if ('error' in data) {\n          callback.reject(wrapReason(data.error));\n        } else {\n          callback.resolve(data.data);\n        }\n      } else {\n        throw new Error(`Cannot resolve callback ${callbackId}`);\n      }\n    } else if (data.action in ah) {\n      let action = ah[data.action];\n      if (data.callbackId) {\n        let sourceName = this.sourceName;\n        let targetName = data.sourceName;\n        Promise.resolve().then(function () {\n          return action[0].call(action[1], data.data);\n        }).then((result) => {\n          comObj.postMessage({\n            sourceName,\n            targetName,\n            isReply: true,\n            callbackId: data.callbackId,\n            data: result,\n          });\n        }, (reason) => {\n          comObj.postMessage({\n            sourceName,\n            targetName,\n            isReply: true,\n            callbackId: data.callbackId,\n            error: makeReasonSerializable(reason),\n          });\n        });\n      } else if (data.streamId) {\n        this._createStreamSink(data);\n      } else {\n        action[0].call(action[1], data.data);\n      }\n    } else {\n      throw new Error(`Unknown action from worker: ${data.action}`);\n    }\n  };\n  comObj.addEventListener('message', this._onComObjOnMessage);\n}\n\nMessageHandler.prototype = {\n  on(actionName, handler, scope) {\n    var ah = this.actionHandler;\n    if (ah[actionName]) {\n      throw new Error(`There is already an actionName called \"${actionName}\"`);\n    }\n    ah[actionName] = [handler, scope];\n  },\n  /**\n   * Sends a message to the comObj to invoke the action with the supplied data.\n   * @param {String} actionName - Action to call.\n   * @param {JSON} data - JSON data to send.\n   * @param {Array} [transfers] - Optional list of transfers/ArrayBuffers\n   */\n  send(actionName, data, transfers) {\n    var message = {\n      sourceName: this.sourceName,\n      targetName: this.targetName,\n      action: actionName,\n      data,\n    };\n    this.postMessage(message, transfers);\n  },\n  /**\n   * Sends a message to the comObj to invoke the action with the supplied data.\n   * Expects that the other side will callback with the response.\n   * @param {String} actionName - Action to call.\n   * @param {JSON} data - JSON data to send.\n   * @param {Array} [transfers] - Optional list of transfers/ArrayBuffers.\n   * @returns {Promise} Promise to be resolved with response data.\n   */\n  sendWithPromise(actionName, data, transfers) {\n    var callbackId = this.callbackId++;\n    var message = {\n      sourceName: this.sourceName,\n      targetName: this.targetName,\n      action: actionName,\n      data,\n      callbackId,\n    };\n    var capability = createPromiseCapability();\n    this.callbacksCapabilities[callbackId] = capability;\n    try {\n      this.postMessage(message, transfers);\n    } catch (e) {\n      capability.reject(e);\n    }\n    return capability.promise;\n  },\n  /**\n   * Sends a message to the comObj to invoke the action with the supplied data.\n   * Expect that the other side will callback to signal 'start_complete'.\n   * @param {String} actionName - Action to call.\n   * @param {JSON} data - JSON data to send.\n   * @param {Object} queueingStrategy - strategy to signal backpressure based on\n   *                 internal queue.\n   * @param {Array} [transfers] - Optional list of transfers/ArrayBuffers.\n   * @return {ReadableStream} ReadableStream to read data in chunks.\n   */\n  sendWithStream(actionName, data, queueingStrategy, transfers) {\n    let streamId = this.streamId++;\n    let sourceName = this.sourceName;\n    let targetName = this.targetName;\n\n    return new ReadableStream({\n      start: (controller) => {\n        let startCapability = createPromiseCapability();\n        this.streamControllers[streamId] = {\n          controller,\n          startCall: startCapability,\n          isClosed: false,\n        };\n        this.postMessage({\n          sourceName,\n          targetName,\n          action: actionName,\n          streamId,\n          data,\n          desiredSize: controller.desiredSize,\n        });\n        // Return Promise for Async process, to signal success/failure.\n        return startCapability.promise;\n      },\n\n      pull: (controller) => {\n        let pullCapability = createPromiseCapability();\n        this.streamControllers[streamId].pullCall = pullCapability;\n        this.postMessage({\n          sourceName,\n          targetName,\n          stream: 'pull',\n          streamId,\n          desiredSize: controller.desiredSize,\n        });\n        // Returning Promise will not call \"pull\"\n        // again until current pull is resolved.\n        return pullCapability.promise;\n      },\n\n      cancel: (reason) => {\n        let cancelCapability = createPromiseCapability();\n        this.streamControllers[streamId].cancelCall = cancelCapability;\n        this.streamControllers[streamId].isClosed = true;\n        this.postMessage({\n          sourceName,\n          targetName,\n          stream: 'cancel',\n          reason,\n          streamId,\n        });\n        // Return Promise to signal success or failure.\n        return cancelCapability.promise;\n      },\n    }, queueingStrategy);\n  },\n\n  _createStreamSink(data) {\n    let self = this;\n    let action = this.actionHandler[data.action];\n    let streamId = data.streamId;\n    let desiredSize = data.desiredSize;\n    let sourceName = this.sourceName;\n    let targetName = data.sourceName;\n    let capability = createPromiseCapability();\n\n    let sendStreamRequest = ({ stream, chunk, transfers,\n                               success, reason, }) => {\n      this.postMessage({ sourceName, targetName, stream, streamId,\n                         chunk, success, reason, }, transfers);\n    };\n\n    let streamSink = {\n      enqueue(chunk, size = 1, transfers) {\n        if (this.isCancelled) {\n          return;\n        }\n        let lastDesiredSize = this.desiredSize;\n        this.desiredSize -= size;\n        // Enqueue decreases the desiredSize property of sink,\n        // so when it changes from positive to negative,\n        // set ready as unresolved promise.\n        if (lastDesiredSize > 0 && this.desiredSize <= 0) {\n          this.sinkCapability = createPromiseCapability();\n          this.ready = this.sinkCapability.promise;\n        }\n        sendStreamRequest({ stream: 'enqueue', chunk, transfers, });\n      },\n\n      close() {\n        if (this.isCancelled) {\n          return;\n        }\n        this.isCancelled = true;\n        sendStreamRequest({ stream: 'close', });\n        delete self.streamSinks[streamId];\n      },\n\n      error(reason) {\n        if (this.isCancelled) {\n          return;\n        }\n        this.isCancelled = true;\n        sendStreamRequest({ stream: 'error', reason, });\n      },\n\n      sinkCapability: capability,\n      onPull: null,\n      onCancel: null,\n      isCancelled: false,\n      desiredSize,\n      ready: null,\n    };\n\n    streamSink.sinkCapability.resolve();\n    streamSink.ready = streamSink.sinkCapability.promise;\n    this.streamSinks[streamId] = streamSink;\n    resolveCall(action[0], [data.data, streamSink], action[1]).then(() => {\n      sendStreamRequest({ stream: 'start_complete', success: true, });\n    }, (reason) => {\n      sendStreamRequest({ stream: 'start_complete', success: false, reason, });\n    });\n  },\n\n  _processStreamMessage(data) {\n    let sourceName = this.sourceName;\n    let targetName = data.sourceName;\n    let streamId = data.streamId;\n\n    let sendStreamResponse = ({ stream, success, reason, }) => {\n      this.comObj.postMessage({ sourceName, targetName, stream,\n                                success, streamId, reason, });\n    };\n\n    let deleteStreamController = () => {\n      // Delete streamController only when start, pull and\n      // cancel callbacks are resolved, to avoid \"TypeError\".\n      Promise.all([\n        this.streamControllers[data.streamId].startCall,\n        this.streamControllers[data.streamId].pullCall,\n        this.streamControllers[data.streamId].cancelCall\n      ].map(function(capability) {\n        return capability && finalize(capability.promise);\n      })).then(() => {\n        delete this.streamControllers[data.streamId];\n      });\n    };\n\n    switch (data.stream) {\n      case 'start_complete':\n        resolveOrReject(this.streamControllers[data.streamId].startCall,\n                        data.success, wrapReason(data.reason));\n        break;\n      case 'pull_complete':\n        resolveOrReject(this.streamControllers[data.streamId].pullCall,\n                        data.success, wrapReason(data.reason));\n        break;\n      case 'pull':\n        // Ignore any pull after close is called.\n        if (!this.streamSinks[data.streamId]) {\n          sendStreamResponse({ stream: 'pull_complete', success: true, });\n          break;\n        }\n        // Pull increases the desiredSize property of sink,\n        // so when it changes from negative to positive,\n        // set ready property as resolved promise.\n        if (this.streamSinks[data.streamId].desiredSize <= 0 &&\n            data.desiredSize > 0) {\n          this.streamSinks[data.streamId].sinkCapability.resolve();\n        }\n        // Reset desiredSize property of sink on every pull.\n        this.streamSinks[data.streamId].desiredSize = data.desiredSize;\n        resolveCall(this.streamSinks[data.streamId].onPull).then(() => {\n          sendStreamResponse({ stream: 'pull_complete', success: true, });\n        }, (reason) => {\n          sendStreamResponse({ stream: 'pull_complete',\n                               success: false, reason, });\n        });\n        break;\n      case 'enqueue':\n        assert(this.streamControllers[data.streamId],\n               'enqueue should have stream controller');\n        if (!this.streamControllers[data.streamId].isClosed) {\n          this.streamControllers[data.streamId].controller.enqueue(data.chunk);\n        }\n        break;\n      case 'close':\n        assert(this.streamControllers[data.streamId],\n               'close should have stream controller');\n        if (this.streamControllers[data.streamId].isClosed) {\n          break;\n        }\n        this.streamControllers[data.streamId].isClosed = true;\n        this.streamControllers[data.streamId].controller.close();\n        deleteStreamController();\n        break;\n      case 'error':\n        assert(this.streamControllers[data.streamId],\n               'error should have stream controller');\n        this.streamControllers[data.streamId].controller.\n          error(wrapReason(data.reason));\n        deleteStreamController();\n        break;\n      case 'cancel_complete':\n        resolveOrReject(this.streamControllers[data.streamId].cancelCall,\n                        data.success, wrapReason(data.reason));\n        deleteStreamController();\n        break;\n      case 'cancel':\n        if (!this.streamSinks[data.streamId]) {\n          break;\n        }\n        resolveCall(this.streamSinks[data.streamId].onCancel,\n                    [wrapReason(data.reason)]).then(() => {\n          sendStreamResponse({ stream: 'cancel_complete', success: true, });\n        }, (reason) => {\n          sendStreamResponse({ stream: 'cancel_complete',\n                               success: false, reason, });\n        });\n        this.streamSinks[data.streamId].sinkCapability.\n          reject(wrapReason(data.reason));\n        this.streamSinks[data.streamId].isCancelled = true;\n        delete this.streamSinks[data.streamId];\n        break;\n      default:\n        throw new Error('Unexpected stream case');\n    }\n  },\n\n  /**\n   * Sends raw message to the comObj.\n   * @private\n   * @param {Object} message - Raw message.\n   * @param transfers List of transfers/ArrayBuffers, or undefined.\n   */\n  postMessage(message, transfers) {\n    if (transfers && this.postMessageTransfers) {\n      this.comObj.postMessage(message, transfers);\n    } else {\n      this.comObj.postMessage(message);\n    }\n  },\n\n  destroy() {\n    this.comObj.removeEventListener('message', this._onComObjOnMessage);\n  },\n};\n\nexport {\n  MessageHandler,\n};\n","module.exports = require(\"regenerator-runtime\");\n","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n// This method of obtaining a reference to the global object needs to be\n// kept identical to the way it is obtained in runtime.js\nvar g = (function() { return this })() || Function(\"return this\")();\n\n// Use `getOwnPropertyNames` because not all browsers support calling\n// `hasOwnProperty` on the global `self` object in a worker. See #183.\nvar hadRuntime = g.regeneratorRuntime &&\n  Object.getOwnPropertyNames(g).indexOf(\"regeneratorRuntime\") >= 0;\n\n// Save the old regeneratorRuntime in case it needs to be restored later.\nvar oldRuntime = hadRuntime && g.regeneratorRuntime;\n\n// Force reevalutation of runtime.js.\ng.regeneratorRuntime = undefined;\n\nmodule.exports = require(\"./runtime\");\n\nif (hadRuntime) {\n  // Restore the original runtime.\n  g.regeneratorRuntime = oldRuntime;\n} else {\n  // Remove the global property added by runtime.js.\n  try {\n    delete g.regeneratorRuntime;\n  } catch(e) {\n    g.regeneratorRuntime = undefined;\n  }\n}\n","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n!(function(global) {\n  \"use strict\";\n\n  var Op = Object.prototype;\n  var hasOwn = Op.hasOwnProperty;\n  var undefined; // More compressible than void 0.\n  var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n  var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n  var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n  var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n  var inModule = typeof module === \"object\";\n  var runtime = global.regeneratorRuntime;\n  if (runtime) {\n    if (inModule) {\n      // If regeneratorRuntime is defined globally and we're in a module,\n      // make the exports object identical to regeneratorRuntime.\n      module.exports = runtime;\n    }\n    // Don't bother evaluating the rest of this file if the runtime was\n    // already defined globally.\n    return;\n  }\n\n  // Define the runtime globally (as expected by generated code) as either\n  // module.exports (if we're in a module) or a new, empty object.\n  runtime = global.regeneratorRuntime = inModule ? module.exports : {};\n\n  function wrap(innerFn, outerFn, self, tryLocsList) {\n    // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n    var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n    var generator = Object.create(protoGenerator.prototype);\n    var context = new Context(tryLocsList || []);\n\n    // The ._invoke method unifies the implementations of the .next,\n    // .throw, and .return methods.\n    generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n    return generator;\n  }\n  runtime.wrap = wrap;\n\n  // Try/catch helper to minimize deoptimizations. Returns a completion\n  // record like context.tryEntries[i].completion. This interface could\n  // have been (and was previously) designed to take a closure to be\n  // invoked without arguments, but in all the cases we care about we\n  // already have an existing method we want to call, so there's no need\n  // to create a new function object. We can even get away with assuming\n  // the method takes exactly one argument, since that happens to be true\n  // in every case, so we don't have to touch the arguments object. The\n  // only additional allocation required is the completion record, which\n  // has a stable shape and so hopefully should be cheap to allocate.\n  function tryCatch(fn, obj, arg) {\n    try {\n      return { type: \"normal\", arg: fn.call(obj, arg) };\n    } catch (err) {\n      return { type: \"throw\", arg: err };\n    }\n  }\n\n  var GenStateSuspendedStart = \"suspendedStart\";\n  var GenStateSuspendedYield = \"suspendedYield\";\n  var GenStateExecuting = \"executing\";\n  var GenStateCompleted = \"completed\";\n\n  // Returning this object from the innerFn has the same effect as\n  // breaking out of the dispatch switch statement.\n  var ContinueSentinel = {};\n\n  // Dummy constructor functions that we use as the .constructor and\n  // .constructor.prototype properties for functions that return Generator\n  // objects. For full spec compliance, you may wish to configure your\n  // minifier not to mangle the names of these two functions.\n  function Generator() {}\n  function GeneratorFunction() {}\n  function GeneratorFunctionPrototype() {}\n\n  // This is a polyfill for %IteratorPrototype% for environments that\n  // don't natively support it.\n  var IteratorPrototype = {};\n  IteratorPrototype[iteratorSymbol] = function () {\n    return this;\n  };\n\n  var getProto = Object.getPrototypeOf;\n  var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n  if (NativeIteratorPrototype &&\n      NativeIteratorPrototype !== Op &&\n      hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n    // This environment has a native %IteratorPrototype%; use it instead\n    // of the polyfill.\n    IteratorPrototype = NativeIteratorPrototype;\n  }\n\n  var Gp = GeneratorFunctionPrototype.prototype =\n    Generator.prototype = Object.create(IteratorPrototype);\n  GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n  GeneratorFunctionPrototype.constructor = GeneratorFunction;\n  GeneratorFunctionPrototype[toStringTagSymbol] =\n    GeneratorFunction.displayName = \"GeneratorFunction\";\n\n  // Helper for defining the .next, .throw, and .return methods of the\n  // Iterator interface in terms of a single ._invoke method.\n  function defineIteratorMethods(prototype) {\n    [\"next\", \"throw\", \"return\"].forEach(function(method) {\n      prototype[method] = function(arg) {\n        return this._invoke(method, arg);\n      };\n    });\n  }\n\n  runtime.isGeneratorFunction = function(genFun) {\n    var ctor = typeof genFun === \"function\" && genFun.constructor;\n    return ctor\n      ? ctor === GeneratorFunction ||\n        // For the native GeneratorFunction constructor, the best we can\n        // do is to check its .name property.\n        (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n      : false;\n  };\n\n  runtime.mark = function(genFun) {\n    if (Object.setPrototypeOf) {\n      Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n    } else {\n      genFun.__proto__ = GeneratorFunctionPrototype;\n      if (!(toStringTagSymbol in genFun)) {\n        genFun[toStringTagSymbol] = \"GeneratorFunction\";\n      }\n    }\n    genFun.prototype = Object.create(Gp);\n    return genFun;\n  };\n\n  // Within the body of any async function, `await x` is transformed to\n  // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n  // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n  // meant to be awaited.\n  runtime.awrap = function(arg) {\n    return { __await: arg };\n  };\n\n  function AsyncIterator(generator) {\n    function invoke(method, arg, resolve, reject) {\n      var record = tryCatch(generator[method], generator, arg);\n      if (record.type === \"throw\") {\n        reject(record.arg);\n      } else {\n        var result = record.arg;\n        var value = result.value;\n        if (value &&\n            typeof value === \"object\" &&\n            hasOwn.call(value, \"__await\")) {\n          return Promise.resolve(value.__await).then(function(value) {\n            invoke(\"next\", value, resolve, reject);\n          }, function(err) {\n            invoke(\"throw\", err, resolve, reject);\n          });\n        }\n\n        return Promise.resolve(value).then(function(unwrapped) {\n          // When a yielded Promise is resolved, its final value becomes\n          // the .value of the Promise<{value,done}> result for the\n          // current iteration. If the Promise is rejected, however, the\n          // result for this iteration will be rejected with the same\n          // reason. Note that rejections of yielded Promises are not\n          // thrown back into the generator function, as is the case\n          // when an awaited Promise is rejected. This difference in\n          // behavior between yield and await is important, because it\n          // allows the consumer to decide what to do with the yielded\n          // rejection (swallow it and continue, manually .throw it back\n          // into the generator, abandon iteration, whatever). With\n          // await, by contrast, there is no opportunity to examine the\n          // rejection reason outside the generator function, so the\n          // only option is to throw it from the await expression, and\n          // let the generator function handle the exception.\n          result.value = unwrapped;\n          resolve(result);\n        }, reject);\n      }\n    }\n\n    var previousPromise;\n\n    function enqueue(method, arg) {\n      function callInvokeWithMethodAndArg() {\n        return new Promise(function(resolve, reject) {\n          invoke(method, arg, resolve, reject);\n        });\n      }\n\n      return previousPromise =\n        // If enqueue has been called before, then we want to wait until\n        // all previous Promises have been resolved before calling invoke,\n        // so that results are always delivered in the correct order. If\n        // enqueue has not been called before, then it is important to\n        // call invoke immediately, without waiting on a callback to fire,\n        // so that the async generator function has the opportunity to do\n        // any necessary setup in a predictable way. This predictability\n        // is why the Promise constructor synchronously invokes its\n        // executor callback, and why async functions synchronously\n        // execute code before the first await. Since we implement simple\n        // async functions in terms of async generators, it is especially\n        // important to get this right, even though it requires care.\n        previousPromise ? previousPromise.then(\n          callInvokeWithMethodAndArg,\n          // Avoid propagating failures to Promises returned by later\n          // invocations of the iterator.\n          callInvokeWithMethodAndArg\n        ) : callInvokeWithMethodAndArg();\n    }\n\n    // Define the unified helper method that is used to implement .next,\n    // .throw, and .return (see defineIteratorMethods).\n    this._invoke = enqueue;\n  }\n\n  defineIteratorMethods(AsyncIterator.prototype);\n  AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n    return this;\n  };\n  runtime.AsyncIterator = AsyncIterator;\n\n  // Note that simple async functions are implemented on top of\n  // AsyncIterator objects; they just return a Promise for the value of\n  // the final result produced by the iterator.\n  runtime.async = function(innerFn, outerFn, self, tryLocsList) {\n    var iter = new AsyncIterator(\n      wrap(innerFn, outerFn, self, tryLocsList)\n    );\n\n    return runtime.isGeneratorFunction(outerFn)\n      ? iter // If outerFn is a generator, return the full iterator.\n      : iter.next().then(function(result) {\n          return result.done ? result.value : iter.next();\n        });\n  };\n\n  function makeInvokeMethod(innerFn, self, context) {\n    var state = GenStateSuspendedStart;\n\n    return function invoke(method, arg) {\n      if (state === GenStateExecuting) {\n        throw new Error(\"Generator is already running\");\n      }\n\n      if (state === GenStateCompleted) {\n        if (method === \"throw\") {\n          throw arg;\n        }\n\n        // Be forgiving, per 25.3.3.3.3 of the spec:\n        // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n        return doneResult();\n      }\n\n      context.method = method;\n      context.arg = arg;\n\n      while (true) {\n        var delegate = context.delegate;\n        if (delegate) {\n          var delegateResult = maybeInvokeDelegate(delegate, context);\n          if (delegateResult) {\n            if (delegateResult === ContinueSentinel) continue;\n            return delegateResult;\n          }\n        }\n\n        if (context.method === \"next\") {\n          // Setting context._sent for legacy support of Babel's\n          // function.sent implementation.\n          context.sent = context._sent = context.arg;\n\n        } else if (context.method === \"throw\") {\n          if (state === GenStateSuspendedStart) {\n            state = GenStateCompleted;\n            throw context.arg;\n          }\n\n          context.dispatchException(context.arg);\n\n        } else if (context.method === \"return\") {\n          context.abrupt(\"return\", context.arg);\n        }\n\n        state = GenStateExecuting;\n\n        var record = tryCatch(innerFn, self, context);\n        if (record.type === \"normal\") {\n          // If an exception is thrown from innerFn, we leave state ===\n          // GenStateExecuting and loop back for another invocation.\n          state = context.done\n            ? GenStateCompleted\n            : GenStateSuspendedYield;\n\n          if (record.arg === ContinueSentinel) {\n            continue;\n          }\n\n          return {\n            value: record.arg,\n            done: context.done\n          };\n\n        } else if (record.type === \"throw\") {\n          state = GenStateCompleted;\n          // Dispatch the exception by looping back around to the\n          // context.dispatchException(context.arg) call above.\n          context.method = \"throw\";\n          context.arg = record.arg;\n        }\n      }\n    };\n  }\n\n  // Call delegate.iterator[context.method](context.arg) and handle the\n  // result, either by returning a { value, done } result from the\n  // delegate iterator, or by modifying context.method and context.arg,\n  // setting context.delegate to null, and returning the ContinueSentinel.\n  function maybeInvokeDelegate(delegate, context) {\n    var method = delegate.iterator[context.method];\n    if (method === undefined) {\n      // A .throw or .return when the delegate iterator has no .throw\n      // method always terminates the yield* loop.\n      context.delegate = null;\n\n      if (context.method === \"throw\") {\n        if (delegate.iterator.return) {\n          // If the delegate iterator has a return method, give it a\n          // chance to clean up.\n          context.method = \"return\";\n          context.arg = undefined;\n          maybeInvokeDelegate(delegate, context);\n\n          if (context.method === \"throw\") {\n            // If maybeInvokeDelegate(context) changed context.method from\n            // \"return\" to \"throw\", let that override the TypeError below.\n            return ContinueSentinel;\n          }\n        }\n\n        context.method = \"throw\";\n        context.arg = new TypeError(\n          \"The iterator does not provide a 'throw' method\");\n      }\n\n      return ContinueSentinel;\n    }\n\n    var record = tryCatch(method, delegate.iterator, context.arg);\n\n    if (record.type === \"throw\") {\n      context.method = \"throw\";\n      context.arg = record.arg;\n      context.delegate = null;\n      return ContinueSentinel;\n    }\n\n    var info = record.arg;\n\n    if (! info) {\n      context.method = \"throw\";\n      context.arg = new TypeError(\"iterator result is not an object\");\n      context.delegate = null;\n      return ContinueSentinel;\n    }\n\n    if (info.done) {\n      // Assign the result of the finished delegate to the temporary\n      // variable specified by delegate.resultName (see delegateYield).\n      context[delegate.resultName] = info.value;\n\n      // Resume execution at the desired location (see delegateYield).\n      context.next = delegate.nextLoc;\n\n      // If context.method was \"throw\" but the delegate handled the\n      // exception, let the outer generator proceed normally. If\n      // context.method was \"next\", forget context.arg since it has been\n      // \"consumed\" by the delegate iterator. If context.method was\n      // \"return\", allow the original .return call to continue in the\n      // outer generator.\n      if (context.method !== \"return\") {\n        context.method = \"next\";\n        context.arg = undefined;\n      }\n\n    } else {\n      // Re-yield the result returned by the delegate method.\n      return info;\n    }\n\n    // The delegate iterator is finished, so forget it and continue with\n    // the outer generator.\n    context.delegate = null;\n    return ContinueSentinel;\n  }\n\n  // Define Generator.prototype.{next,throw,return} in terms of the\n  // unified ._invoke helper method.\n  defineIteratorMethods(Gp);\n\n  Gp[toStringTagSymbol] = \"Generator\";\n\n  // A Generator should always return itself as the iterator object when the\n  // @@iterator function is called on it. Some browsers' implementations of the\n  // iterator prototype chain incorrectly implement this, causing the Generator\n  // object to not be returned from this call. This ensures that doesn't happen.\n  // See https://github.com/facebook/regenerator/issues/274 for more details.\n  Gp[iteratorSymbol] = function() {\n    return this;\n  };\n\n  Gp.toString = function() {\n    return \"[object Generator]\";\n  };\n\n  function pushTryEntry(locs) {\n    var entry = { tryLoc: locs[0] };\n\n    if (1 in locs) {\n      entry.catchLoc = locs[1];\n    }\n\n    if (2 in locs) {\n      entry.finallyLoc = locs[2];\n      entry.afterLoc = locs[3];\n    }\n\n    this.tryEntries.push(entry);\n  }\n\n  function resetTryEntry(entry) {\n    var record = entry.completion || {};\n    record.type = \"normal\";\n    delete record.arg;\n    entry.completion = record;\n  }\n\n  function Context(tryLocsList) {\n    // The root entry object (effectively a try statement without a catch\n    // or a finally block) gives us a place to store values thrown from\n    // locations where there is no enclosing try statement.\n    this.tryEntries = [{ tryLoc: \"root\" }];\n    tryLocsList.forEach(pushTryEntry, this);\n    this.reset(true);\n  }\n\n  runtime.keys = function(object) {\n    var keys = [];\n    for (var key in object) {\n      keys.push(key);\n    }\n    keys.reverse();\n\n    // Rather than returning an object with a next method, we keep\n    // things simple and return the next function itself.\n    return function next() {\n      while (keys.length) {\n        var key = keys.pop();\n        if (key in object) {\n          next.value = key;\n          next.done = false;\n          return next;\n        }\n      }\n\n      // To avoid creating an additional object, we just hang the .value\n      // and .done properties off the next function object itself. This\n      // also ensures that the minifier will not anonymize the function.\n      next.done = true;\n      return next;\n    };\n  };\n\n  function values(iterable) {\n    if (iterable) {\n      var iteratorMethod = iterable[iteratorSymbol];\n      if (iteratorMethod) {\n        return iteratorMethod.call(iterable);\n      }\n\n      if (typeof iterable.next === \"function\") {\n        return iterable;\n      }\n\n      if (!isNaN(iterable.length)) {\n        var i = -1, next = function next() {\n          while (++i < iterable.length) {\n            if (hasOwn.call(iterable, i)) {\n              next.value = iterable[i];\n              next.done = false;\n              return next;\n            }\n          }\n\n          next.value = undefined;\n          next.done = true;\n\n          return next;\n        };\n\n        return next.next = next;\n      }\n    }\n\n    // Return an iterator with no values.\n    return { next: doneResult };\n  }\n  runtime.values = values;\n\n  function doneResult() {\n    return { value: undefined, done: true };\n  }\n\n  Context.prototype = {\n    constructor: Context,\n\n    reset: function(skipTempReset) {\n      this.prev = 0;\n      this.next = 0;\n      // Resetting context._sent for legacy support of Babel's\n      // function.sent implementation.\n      this.sent = this._sent = undefined;\n      this.done = false;\n      this.delegate = null;\n\n      this.method = \"next\";\n      this.arg = undefined;\n\n      this.tryEntries.forEach(resetTryEntry);\n\n      if (!skipTempReset) {\n        for (var name in this) {\n          // Not sure about the optimal order of these conditions:\n          if (name.charAt(0) === \"t\" &&\n              hasOwn.call(this, name) &&\n              !isNaN(+name.slice(1))) {\n            this[name] = undefined;\n          }\n        }\n      }\n    },\n\n    stop: function() {\n      this.done = true;\n\n      var rootEntry = this.tryEntries[0];\n      var rootRecord = rootEntry.completion;\n      if (rootRecord.type === \"throw\") {\n        throw rootRecord.arg;\n      }\n\n      return this.rval;\n    },\n\n    dispatchException: function(exception) {\n      if (this.done) {\n        throw exception;\n      }\n\n      var context = this;\n      function handle(loc, caught) {\n        record.type = \"throw\";\n        record.arg = exception;\n        context.next = loc;\n\n        if (caught) {\n          // If the dispatched exception was caught by a catch block,\n          // then let that catch block handle the exception normally.\n          context.method = \"next\";\n          context.arg = undefined;\n        }\n\n        return !! caught;\n      }\n\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        var record = entry.completion;\n\n        if (entry.tryLoc === \"root\") {\n          // Exception thrown outside of any try block that could handle\n          // it, so set the completion value of the entire function to\n          // throw the exception.\n          return handle(\"end\");\n        }\n\n        if (entry.tryLoc <= this.prev) {\n          var hasCatch = hasOwn.call(entry, \"catchLoc\");\n          var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n          if (hasCatch && hasFinally) {\n            if (this.prev < entry.catchLoc) {\n              return handle(entry.catchLoc, true);\n            } else if (this.prev < entry.finallyLoc) {\n              return handle(entry.finallyLoc);\n            }\n\n          } else if (hasCatch) {\n            if (this.prev < entry.catchLoc) {\n              return handle(entry.catchLoc, true);\n            }\n\n          } else if (hasFinally) {\n            if (this.prev < entry.finallyLoc) {\n              return handle(entry.finallyLoc);\n            }\n\n          } else {\n            throw new Error(\"try statement without catch or finally\");\n          }\n        }\n      }\n    },\n\n    abrupt: function(type, arg) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.tryLoc <= this.prev &&\n            hasOwn.call(entry, \"finallyLoc\") &&\n            this.prev < entry.finallyLoc) {\n          var finallyEntry = entry;\n          break;\n        }\n      }\n\n      if (finallyEntry &&\n          (type === \"break\" ||\n           type === \"continue\") &&\n          finallyEntry.tryLoc <= arg &&\n          arg <= finallyEntry.finallyLoc) {\n        // Ignore the finally entry if control is not jumping to a\n        // location outside the try/catch block.\n        finallyEntry = null;\n      }\n\n      var record = finallyEntry ? finallyEntry.completion : {};\n      record.type = type;\n      record.arg = arg;\n\n      if (finallyEntry) {\n        this.method = \"next\";\n        this.next = finallyEntry.finallyLoc;\n        return ContinueSentinel;\n      }\n\n      return this.complete(record);\n    },\n\n    complete: function(record, afterLoc) {\n      if (record.type === \"throw\") {\n        throw record.arg;\n      }\n\n      if (record.type === \"break\" ||\n          record.type === \"continue\") {\n        this.next = record.arg;\n      } else if (record.type === \"return\") {\n        this.rval = this.arg = record.arg;\n        this.method = \"return\";\n        this.next = \"end\";\n      } else if (record.type === \"normal\" && afterLoc) {\n        this.next = afterLoc;\n      }\n\n      return ContinueSentinel;\n    },\n\n    finish: function(finallyLoc) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.finallyLoc === finallyLoc) {\n          this.complete(entry.completion, entry.afterLoc);\n          resetTryEntry(entry);\n          return ContinueSentinel;\n        }\n      }\n    },\n\n    \"catch\": function(tryLoc) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.tryLoc === tryLoc) {\n          var record = entry.completion;\n          if (record.type === \"throw\") {\n            var thrown = record.arg;\n            resetTryEntry(entry);\n          }\n          return thrown;\n        }\n      }\n\n      // The context.catch method must only be called with a location\n      // argument that corresponds to a known catch block.\n      throw new Error(\"illegal catch attempt\");\n    },\n\n    delegateYield: function(iterable, resultName, nextLoc) {\n      this.delegate = {\n        iterator: values(iterable),\n        resultName: resultName,\n        nextLoc: nextLoc\n      };\n\n      if (this.method === \"next\") {\n        // Deliberately forget the last sent value so that we don't\n        // accidentally pass it on to the delegate.\n        this.arg = undefined;\n      }\n\n      return ContinueSentinel;\n    }\n  };\n})(\n  // In sloppy mode, unbound `this` refers to the global object, fallback to\n  // Function constructor if we're in global strict mode. That is sadly a form\n  // of indirect eval which violates Content Security Policy.\n  (function() { return this })() || Function(\"return this\")()\n);\n","module.exports = function(module) {\r\n\tif (!module.webpackPolyfill) {\r\n\t\tmodule.deprecate = function() {};\r\n\t\tmodule.paths = [];\r\n\t\t// module.parent = undefined by default\r\n\t\tif (!module.children) module.children = [];\r\n\t\tObject.defineProperty(module, \"loaded\", {\r\n\t\t\tenumerable: true,\r\n\t\t\tget: function() {\r\n\t\t\t\treturn module.l;\r\n\t\t\t}\r\n\t\t});\r\n\t\tObject.defineProperty(module, \"id\", {\r\n\t\t\tenumerable: true,\r\n\t\t\tget: function() {\r\n\t\t\t\treturn module.i;\r\n\t\t\t}\r\n\t\t});\r\n\t\tmodule.webpackPolyfill = 1;\r\n\t}\r\n\treturn module;\r\n};\r\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert } from '../shared/util';\nimport { SimpleXMLParser } from './xml_parser';\n\nclass Metadata {\n  constructor(data) {\n    assert(typeof data === 'string', 'Metadata: input is not a string');\n\n    // Ghostscript may produce invalid metadata, so try to repair that first.\n    data = this._repair(data);\n\n    // Convert the string to an XML document.\n    let parser = new SimpleXMLParser();\n    const xmlDocument = parser.parseFromString(data);\n\n    this._metadata = Object.create(null);\n\n    if (xmlDocument) {\n      this._parse(xmlDocument);\n    }\n  }\n\n  _repair(data) {\n    return data.replace(/>\\\\376\\\\377([^<]+)/g, function(all, codes) {\n      let bytes = codes.replace(/\\\\([0-3])([0-7])([0-7])/g,\n          function(code, d1, d2, d3) {\n        return String.fromCharCode(d1 * 64 + d2 * 8 + d3 * 1);\n      }).replace(/&(amp|apos|gt|lt|quot);/g, function(str, name) {\n        switch (name) {\n          case 'amp':\n            return '&';\n          case 'apos':\n            return '\\'';\n          case 'gt':\n            return '>';\n          case 'lt':\n            return '<';\n          case 'quot':\n            return '\\\"';\n        }\n        throw new Error(`_repair: ${name} isn't defined.`);\n      });\n\n      let chars = '';\n      for (let i = 0, ii = bytes.length; i < ii; i += 2) {\n        let code = bytes.charCodeAt(i) * 256 + bytes.charCodeAt(i + 1);\n        if (code >= 32 && code < 127 && code !== 60 && code !== 62 &&\n            code !== 38) {\n          chars += String.fromCharCode(code);\n        } else {\n          chars += '&#x' + (0x10000 + code).toString(16).substring(1) + ';';\n        }\n      }\n\n      return '>' + chars;\n    });\n  }\n\n  _parse(xmlDocument) {\n    let rdf = xmlDocument.documentElement;\n\n    if (rdf.nodeName.toLowerCase() !== 'rdf:rdf') { // Wrapped in <xmpmeta>\n      rdf = rdf.firstChild;\n      while (rdf && rdf.nodeName.toLowerCase() !== 'rdf:rdf') {\n        rdf = rdf.nextSibling;\n      }\n    }\n\n    let nodeName = rdf ? rdf.nodeName.toLowerCase() : null;\n    if (!rdf || nodeName !== 'rdf:rdf' || !rdf.hasChildNodes()) {\n      return;\n    }\n\n    let children = rdf.childNodes;\n    for (let i = 0, ii = children.length; i < ii; i++) {\n      let desc = children[i];\n      if (desc.nodeName.toLowerCase() !== 'rdf:description') {\n        continue;\n      }\n\n      for (let j = 0, jj = desc.childNodes.length; j < jj; j++) {\n        if (desc.childNodes[j].nodeName.toLowerCase() !== '#text') {\n          let entry = desc.childNodes[j];\n          let name = entry.nodeName.toLowerCase();\n\n          this._metadata[name] = entry.textContent.trim();\n        }\n      }\n    }\n  }\n\n  get(name) {\n    return this._metadata[name] || null;\n  }\n\n  getAll() {\n    return this._metadata;\n  }\n\n  has(name) {\n    return typeof this._metadata[name] !== 'undefined';\n  }\n}\n\nexport {\n  Metadata,\n};\n","/* Copyright 2018 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// The code for XMLParserBase copied from\n// https://github.com/mozilla/shumway/blob/16451d8836fa85f4b16eeda8b4bda2fa9e2b22b0/src/avm2/natives/xml.ts\n\nconst XMLParserErrorCode = {\n  NoError: 0,\n  EndOfDocument: -1,\n  UnterminatedCdat: -2,\n  UnterminatedXmlDeclaration: -3,\n  UnterminatedDoctypeDeclaration: -4,\n  UnterminatedComment: -5,\n  MalformedElement: -6,\n  OutOfMemory: -7,\n  UnterminatedAttributeValue: -8,\n  UnterminatedElement: -9,\n  ElementNeverBegun: -10,\n};\n\nfunction isWhitespace(s, index) {\n  const ch = s[index];\n  return ch === ' ' || ch === '\\n' || ch === '\\r' || ch === '\\t';\n}\n\nfunction isWhitespaceString(s) {\n  for (let i = 0, ii = s.length; i < ii; i++) {\n    if (!isWhitespace(s, i)) {\n      return false;\n    }\n  }\n  return true;\n}\n\nclass XMLParserBase {\n  _resolveEntities(s) {\n    return s.replace(/&([^;]+);/g, function (all, entity) {\n      if (entity.substring(0, 2) === '#x') {\n        return String.fromCharCode(parseInt(entity.substring(2), 16));\n      } else if (entity.substring(0, 1) === '#') {\n        return String.fromCharCode(parseInt(entity.substring(1), 10));\n      }\n      switch (entity) {\n        case 'lt':\n          return '<';\n        case 'gt':\n          return '>';\n        case 'amp':\n          return '&';\n        case 'quot':\n          return '\\\"';\n      }\n      return this.onResolveEntity(entity);\n    });\n  }\n\n  _parseContent(s, start) {\n    let pos = start, name, attributes = [];\n\n    function skipWs() {\n      while (pos < s.length && isWhitespace(s, pos)) {\n        ++pos;\n      }\n    }\n\n    while (pos < s.length && !isWhitespace(s, pos) &&\n           s[pos] !== '>' && s[pos] !== '/') {\n      ++pos;\n    }\n    name = s.substring(start, pos);\n    skipWs();\n    while (pos < s.length && s[pos] !== '>' &&\n           s[pos] !== '/' && s[pos] !== '?') {\n      skipWs();\n      let attrName = '', attrValue = '';\n      while (pos < s.length && !isWhitespace(s, pos) && s[pos] !== '=') {\n        attrName += s[pos];\n        ++pos;\n      }\n      skipWs();\n      if (s[pos] !== '=') {\n        return null;\n      }\n      ++pos;\n      skipWs();\n      const attrEndChar = s[pos];\n      if (attrEndChar !== '\\\"' && attrEndChar !== '\\'') {\n        return null;\n      }\n      const attrEndIndex = s.indexOf(attrEndChar, ++pos);\n      if (attrEndIndex < 0) {\n        return null;\n      }\n      attrValue = s.substring(pos, attrEndIndex);\n      attributes.push({\n        name: attrName,\n        value: this._resolveEntities(attrValue),\n      });\n      pos = attrEndIndex + 1;\n      skipWs();\n    }\n    return {\n      name,\n      attributes,\n      parsed: pos - start,\n    };\n  }\n\n  _parseProcessingInstruction(s, start) {\n    let pos = start, name, value;\n\n    function skipWs() {\n      while (pos < s.length && isWhitespace(s, pos)) {\n        ++pos;\n      }\n    }\n\n    while (pos < s.length && !isWhitespace(s, pos) &&\n           s[pos] !== '>' && s[pos] !== '/') {\n      ++pos;\n    }\n    name = s.substring(start, pos);\n    skipWs();\n    const attrStart = pos;\n    while (pos < s.length && (s[pos] !== '?' || s[pos + 1] !== '>')) {\n      ++pos;\n    }\n    value = s.substring(attrStart, pos);\n    return {\n      name,\n      value,\n      parsed: pos - start,\n    };\n  }\n\n  parseXml(s) {\n    let i = 0;\n    while (i < s.length) {\n      const ch = s[i];\n      let j = i;\n      if (ch === '<') {\n        ++j;\n        const ch2 = s[j];\n        let q;\n        switch (ch2) {\n          case '/':\n            ++j;\n            q = s.indexOf('>', j);\n            if (q < 0) {\n              this.onError(XMLParserErrorCode.UnterminatedElement);\n              return;\n            }\n            this.onEndElement(s.substring(j, q));\n            j = q + 1;\n            break;\n          case '?':\n            ++j;\n            const pi = this._parseProcessingInstruction(s, j);\n            if (s.substring(j + pi.parsed, j + pi.parsed + 2) !== '?>') {\n              this.onError(XMLParserErrorCode.UnterminatedXmlDeclaration);\n              return;\n            }\n            this.onPi(pi.name, pi.value);\n            j += pi.parsed + 2;\n            break;\n          case '!':\n            if (s.substring(j + 1, j + 3) === '--') {\n              q = s.indexOf('-->', j + 3);\n              if (q < 0) {\n                this.onError(XMLParserErrorCode.UnterminatedComment);\n                return;\n              }\n              this.onComment(s.substring(j + 3, q));\n              j = q + 3;\n            } else if (s.substring(j + 1, j + 8) === '[CDATA[') {\n              q = s.indexOf(']]>', j + 8);\n              if (q < 0) {\n                this.onError(XMLParserErrorCode.UnterminatedCdat);\n                return;\n              }\n              this.onCdata(s.substring(j + 8, q));\n              j = q + 3;\n            } else if (s.substring(j + 1, j + 8) === 'DOCTYPE') {\n              const q2 = s.indexOf('[', j + 8);\n              let complexDoctype = false;\n              q = s.indexOf('>', j + 8);\n              if (q < 0) {\n                this.onError(XMLParserErrorCode.UnterminatedDoctypeDeclaration);\n                return;\n              }\n              if (q2 > 0 && q > q2) {\n                q = s.indexOf(']>', j + 8);\n                if (q < 0) {\n                  this.onError(\n                    XMLParserErrorCode.UnterminatedDoctypeDeclaration);\n                  return;\n                }\n                complexDoctype = true;\n              }\n              const doctypeContent =\n                s.substring(j + 8, q + (complexDoctype ? 1 : 0));\n              this.onDoctype(doctypeContent);\n              j = q + (complexDoctype ? 2 : 1);\n            } else {\n              this.onError(XMLParserErrorCode.MalformedElement);\n              return;\n            }\n            break;\n          default:\n            const content = this._parseContent(s, j);\n            if (content === null) {\n              this.onError(XMLParserErrorCode.MalformedElement);\n              return;\n            }\n            let isClosed = false;\n            if (s.substring(j + content.parsed,\n                            j + content.parsed + 2) === '/>') {\n              isClosed = true;\n            } else if (s.substring(j + content.parsed,\n                       j + content.parsed + 1) !== '>') {\n              this.onError(XMLParserErrorCode.UnterminatedElement);\n              return;\n            }\n            this.onBeginElement(content.name, content.attributes, isClosed);\n            j += content.parsed + (isClosed ? 2 : 1);\n            break;\n        }\n      } else {\n        while (j < s.length && s[j] !== '<') {\n          j++;\n        }\n        const text = s.substring(i, j);\n        this.onText(this._resolveEntities(text));\n      }\n      i = j;\n    }\n  }\n\n  onResolveEntity(name) {\n    return `&${name};`;\n  }\n\n  onPi(name, value) { }\n\n  onComment(text) { }\n\n  onCdata(text) { }\n\n  onDoctype(doctypeContent) { }\n\n  onText(text) { }\n\n  onBeginElement(name, attributes, isEmpty) { }\n\n  onEndElement(name) { }\n\n  onError(code) { }\n}\n\nclass SimpleDOMNode {\n  constructor(nodeName, nodeValue) {\n    this.nodeName = nodeName;\n    this.nodeValue = nodeValue;\n\n    Object.defineProperty(this, 'parentNode', { value: null, writable: true, });\n  }\n\n  get firstChild() {\n    return this.childNodes[0];\n  }\n\n  get nextSibling() {\n    let index = this.parentNode.childNodes.indexOf(this);\n    return this.parentNode.childNodes[index + 1];\n  }\n\n  get textContent() {\n    if (!this.childNodes) {\n      return this.nodeValue || '';\n    }\n    return this.childNodes.map(function(child) {\n      return child.textContent;\n    }).join('');\n  }\n\n  hasChildNodes() {\n    return this.childNodes && this.childNodes.length > 0;\n  }\n}\n\nclass SimpleXMLParser extends XMLParserBase {\n  constructor() {\n    super();\n    this._currentFragment = null;\n    this._stack = null;\n    this._errorCode = XMLParserErrorCode.NoError;\n  }\n\n  parseFromString(data) {\n    this._currentFragment = [];\n    this._stack = [];\n    this._errorCode = XMLParserErrorCode.NoError;\n\n    this.parseXml(data);\n\n    if (this._errorCode !== XMLParserErrorCode.NoError) {\n      return undefined; // return undefined on error\n    }\n\n    // We should only have one root.\n    const [documentElement] = this._currentFragment;\n    if (!documentElement) {\n      return undefined; // Return undefined if no root was found.\n    }\n    return { documentElement, };\n  }\n\n  onResolveEntity(name) {\n    switch (name) {\n      case 'apos':\n        return '\\'';\n    }\n    return super.onResolveEntity(name);\n  }\n\n  onText(text) {\n    if (isWhitespaceString(text)) {\n      return;\n    }\n    const node = new SimpleDOMNode('#text', text);\n    this._currentFragment.push(node);\n  }\n\n  onCdata(text) {\n    const node = new SimpleDOMNode('#text', text);\n    this._currentFragment.push(node);\n  }\n\n  onBeginElement(name, attributes, isEmpty) {\n    const node = new SimpleDOMNode(name);\n    node.childNodes = [];\n    this._currentFragment.push(node);\n    if (isEmpty) {\n      return;\n    }\n    this._stack.push(this._currentFragment);\n    this._currentFragment = node.childNodes;\n  }\n\n  onEndElement(name) {\n    this._currentFragment = this._stack.pop();\n    const lastElement = this._currentFragment[this._currentFragment.length - 1];\n    for (let i = 0, ii = lastElement.childNodes.length; i < ii; i++) {\n      lastElement.childNodes[i].parentNode = lastElement;\n    }\n  }\n\n  onError(code) {\n    this._errorCode = code;\n  }\n}\n\nexport {\n  SimpleXMLParser,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert, createPromiseCapability } from '../shared/util';\n\n /** @implements {IPDFStream} */\nvar PDFDataTransportStream = (function PDFDataTransportStreamClosure() {\n  function PDFDataTransportStream(params, pdfDataRangeTransport) {\n    assert(pdfDataRangeTransport);\n\n    this._queuedChunks = [];\n    var initialData = params.initialData;\n    if (initialData && initialData.length > 0) {\n      let buffer = new Uint8Array(initialData).buffer;\n      this._queuedChunks.push(buffer);\n    }\n\n    this._pdfDataRangeTransport = pdfDataRangeTransport;\n    this._isStreamingSupported = !params.disableStream;\n    this._isRangeSupported = !params.disableRange;\n    this._contentLength = params.length;\n\n    this._fullRequestReader = null;\n    this._rangeReaders = [];\n\n    this._pdfDataRangeTransport.addRangeListener((begin, chunk) => {\n      this._onReceiveData({ begin, chunk, });\n    });\n\n    this._pdfDataRangeTransport.addProgressListener((loaded) => {\n      this._onProgress({ loaded, });\n    });\n\n    this._pdfDataRangeTransport.addProgressiveReadListener((chunk) => {\n      this._onReceiveData({ chunk, });\n    });\n\n    this._pdfDataRangeTransport.transportReady();\n  }\n  PDFDataTransportStream.prototype = {\n    _onReceiveData: function PDFDataTransportStream_onReceiveData(args) {\n       let buffer = new Uint8Array(args.chunk).buffer;\n       if (args.begin === undefined) {\n         if (this._fullRequestReader) {\n           this._fullRequestReader._enqueue(buffer);\n         } else {\n           this._queuedChunks.push(buffer);\n         }\n       } else {\n         var found = this._rangeReaders.some(function (rangeReader) {\n           if (rangeReader._begin !== args.begin) {\n             return false;\n           }\n           rangeReader._enqueue(buffer);\n           return true;\n         });\n         assert(found);\n       }\n    },\n\n    _onProgress: function PDFDataTransportStream_onDataProgress(evt) {\n       if (this._rangeReaders.length > 0) {\n         // Reporting to first range reader.\n         var firstReader = this._rangeReaders[0];\n         if (firstReader.onProgress) {\n           firstReader.onProgress({ loaded: evt.loaded, });\n         }\n       }\n    },\n\n    _removeRangeReader:\n        function PDFDataTransportStream_removeRangeReader(reader) {\n      var i = this._rangeReaders.indexOf(reader);\n      if (i >= 0) {\n        this._rangeReaders.splice(i, 1);\n      }\n    },\n\n    getFullReader: function PDFDataTransportStream_getFullReader() {\n      assert(!this._fullRequestReader);\n      var queuedChunks = this._queuedChunks;\n      this._queuedChunks = null;\n      return new PDFDataTransportStreamReader(this, queuedChunks);\n    },\n\n    getRangeReader: function PDFDataTransportStream_getRangeReader(begin, end) {\n      var reader = new PDFDataTransportStreamRangeReader(this, begin, end);\n      this._pdfDataRangeTransport.requestDataRange(begin, end);\n      this._rangeReaders.push(reader);\n      return reader;\n    },\n\n    cancelAllRequests:\n        function PDFDataTransportStream_cancelAllRequests(reason) {\n      if (this._fullRequestReader) {\n        this._fullRequestReader.cancel(reason);\n      }\n      var readers = this._rangeReaders.slice(0);\n      readers.forEach(function (rangeReader) {\n        rangeReader.cancel(reason);\n      });\n      this._pdfDataRangeTransport.abort();\n    },\n  };\n\n  /** @implements {IPDFStreamReader} */\n  function PDFDataTransportStreamReader(stream, queuedChunks) {\n    this._stream = stream;\n    this._done = false;\n    this._filename = null;\n    this._queuedChunks = queuedChunks || [];\n    this._requests = [];\n    this._headersReady = Promise.resolve();\n    stream._fullRequestReader = this;\n\n    this.onProgress = null; // not used\n  }\n  PDFDataTransportStreamReader.prototype = {\n    _enqueue: function PDFDataTransportStreamReader_enqueue(chunk) {\n      if (this._done) {\n        return; // ignore new data\n      }\n      if (this._requests.length > 0) {\n        var requestCapability = this._requests.shift();\n        requestCapability.resolve({ value: chunk, done: false, });\n        return;\n      }\n      this._queuedChunks.push(chunk);\n    },\n\n    get headersReady() {\n      return this._headersReady;\n    },\n\n    get filename() {\n      return this._filename;\n    },\n\n    get isRangeSupported() {\n      return this._stream._isRangeSupported;\n    },\n\n    get isStreamingSupported() {\n      return this._stream._isStreamingSupported;\n    },\n\n    get contentLength() {\n      return this._stream._contentLength;\n    },\n\n    async read() {\n      if (this._queuedChunks.length > 0) {\n        var chunk = this._queuedChunks.shift();\n        return { value: chunk, done: false, };\n      }\n      if (this._done) {\n        return { value: undefined, done: true, };\n      }\n      var requestCapability = createPromiseCapability();\n      this._requests.push(requestCapability);\n      return requestCapability.promise;\n    },\n\n    cancel: function PDFDataTransportStreamReader_cancel(reason) {\n      this._done = true;\n      this._requests.forEach(function (requestCapability) {\n        requestCapability.resolve({ value: undefined, done: true, });\n      });\n      this._requests = [];\n    },\n  };\n\n  /** @implements {IPDFStreamRangeReader} */\n  function PDFDataTransportStreamRangeReader(stream, begin, end) {\n    this._stream = stream;\n    this._begin = begin;\n    this._end = end;\n    this._queuedChunk = null;\n    this._requests = [];\n    this._done = false;\n\n    this.onProgress = null;\n  }\n  PDFDataTransportStreamRangeReader.prototype = {\n    _enqueue: function PDFDataTransportStreamRangeReader_enqueue(chunk) {\n      if (this._done) {\n        return; // ignore new data\n      }\n      if (this._requests.length === 0) {\n        this._queuedChunk = chunk;\n      } else {\n        var requestsCapability = this._requests.shift();\n        requestsCapability.resolve({ value: chunk, done: false, });\n        this._requests.forEach(function (requestCapability) {\n          requestCapability.resolve({ value: undefined, done: true, });\n        });\n        this._requests = [];\n      }\n      this._done = true;\n      this._stream._removeRangeReader(this);\n    },\n\n    get isStreamingSupported() {\n      return false;\n    },\n\n    async read() {\n      if (this._queuedChunk) {\n        let chunk = this._queuedChunk;\n        this._queuedChunk = null;\n        return { value: chunk, done: false, };\n      }\n      if (this._done) {\n        return { value: undefined, done: true, };\n      }\n      var requestCapability = createPromiseCapability();\n      this._requests.push(requestCapability);\n      return requestCapability.promise;\n    },\n\n    cancel: function PDFDataTransportStreamRangeReader_cancel(reason) {\n      this._done = true;\n      this._requests.forEach(function (requestCapability) {\n        requestCapability.resolve({ value: undefined, done: true, });\n      });\n      this._requests = [];\n      this._stream._removeRangeReader(this);\n    },\n  };\n\n  return PDFDataTransportStream;\n})();\n\nexport {\n  PDFDataTransportStream,\n};\n","/* Copyright 2014 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* eslint-disable no-multi-str */\n\nimport { shadow } from '../shared/util';\n\nclass WebGLContext {\n  constructor({ enable = false, }) {\n    this._enabled = enable === true;\n  }\n\n  get isEnabled() {\n    let enabled = this._enabled;\n    if (enabled) {\n      enabled = WebGLUtils.tryInitGL();\n    }\n    return shadow(this, 'isEnabled', enabled);\n  }\n\n  composeSMask({ layer, mask, properties, }) {\n    return WebGLUtils.composeSMask(layer, mask, properties);\n  }\n\n  drawFigures({ width, height, backgroundColor, figures, context, }) {\n    return WebGLUtils.drawFigures(width, height, backgroundColor, figures,\n                                  context);\n  }\n\n  clear() {\n    WebGLUtils.cleanup();\n  }\n}\n\nvar WebGLUtils = (function WebGLUtilsClosure() {\n  function loadShader(gl, code, shaderType) {\n    var shader = gl.createShader(shaderType);\n    gl.shaderSource(shader, code);\n    gl.compileShader(shader);\n    var compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n    if (!compiled) {\n      var errorMsg = gl.getShaderInfoLog(shader);\n      throw new Error('Error during shader compilation: ' + errorMsg);\n    }\n    return shader;\n  }\n  function createVertexShader(gl, code) {\n    return loadShader(gl, code, gl.VERTEX_SHADER);\n  }\n  function createFragmentShader(gl, code) {\n    return loadShader(gl, code, gl.FRAGMENT_SHADER);\n  }\n  function createProgram(gl, shaders) {\n    var program = gl.createProgram();\n    for (var i = 0, ii = shaders.length; i < ii; ++i) {\n      gl.attachShader(program, shaders[i]);\n    }\n    gl.linkProgram(program);\n    var linked = gl.getProgramParameter(program, gl.LINK_STATUS);\n    if (!linked) {\n      var errorMsg = gl.getProgramInfoLog(program);\n      throw new Error('Error during program linking: ' + errorMsg);\n    }\n    return program;\n  }\n  function createTexture(gl, image, textureId) {\n    gl.activeTexture(textureId);\n    var texture = gl.createTexture();\n    gl.bindTexture(gl.TEXTURE_2D, texture);\n\n    // Set the parameters so we can render any size image.\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n\n    // Upload the image into the texture.\n    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);\n    return texture;\n  }\n\n  var currentGL, currentCanvas;\n  function generateGL() {\n    if (currentGL) {\n      return;\n    }\n\n    // The temporary canvas is used in the WebGL context.\n    currentCanvas = document.createElement('canvas');\n    currentGL = currentCanvas.getContext('webgl',\n      { premultipliedalpha: false, });\n  }\n\n  var smaskVertexShaderCode = '\\\n  attribute vec2 a_position;                                    \\\n  attribute vec2 a_texCoord;                                    \\\n                                                                \\\n  uniform vec2 u_resolution;                                    \\\n                                                                \\\n  varying vec2 v_texCoord;                                      \\\n                                                                \\\n  void main() {                                                 \\\n    vec2 clipSpace = (a_position / u_resolution) * 2.0 - 1.0;   \\\n    gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);          \\\n                                                                \\\n    v_texCoord = a_texCoord;                                    \\\n  }                                                             ';\n\n  var smaskFragmentShaderCode = '\\\n  precision mediump float;                                      \\\n                                                                \\\n  uniform vec4 u_backdrop;                                      \\\n  uniform int u_subtype;                                        \\\n  uniform sampler2D u_image;                                    \\\n  uniform sampler2D u_mask;                                     \\\n                                                                \\\n  varying vec2 v_texCoord;                                      \\\n                                                                \\\n  void main() {                                                 \\\n    vec4 imageColor = texture2D(u_image, v_texCoord);           \\\n    vec4 maskColor = texture2D(u_mask, v_texCoord);             \\\n    if (u_backdrop.a > 0.0) {                                   \\\n      maskColor.rgb = maskColor.rgb * maskColor.a +             \\\n                      u_backdrop.rgb * (1.0 - maskColor.a);     \\\n    }                                                           \\\n    float lum;                                                  \\\n    if (u_subtype == 0) {                                       \\\n      lum = maskColor.a;                                        \\\n    } else {                                                    \\\n      lum = maskColor.r * 0.3 + maskColor.g * 0.59 +            \\\n            maskColor.b * 0.11;                                 \\\n    }                                                           \\\n    imageColor.a *= lum;                                        \\\n    imageColor.rgb *= imageColor.a;                             \\\n    gl_FragColor = imageColor;                                  \\\n  }                                                             ';\n\n  var smaskCache = null;\n\n  function initSmaskGL() {\n    var canvas, gl;\n\n    generateGL();\n    canvas = currentCanvas;\n    currentCanvas = null;\n    gl = currentGL;\n    currentGL = null;\n\n    // setup a GLSL program\n    var vertexShader = createVertexShader(gl, smaskVertexShaderCode);\n    var fragmentShader = createFragmentShader(gl, smaskFragmentShaderCode);\n    var program = createProgram(gl, [vertexShader, fragmentShader]);\n    gl.useProgram(program);\n\n    var cache = {};\n    cache.gl = gl;\n    cache.canvas = canvas;\n    cache.resolutionLocation = gl.getUniformLocation(program, 'u_resolution');\n    cache.positionLocation = gl.getAttribLocation(program, 'a_position');\n    cache.backdropLocation = gl.getUniformLocation(program, 'u_backdrop');\n    cache.subtypeLocation = gl.getUniformLocation(program, 'u_subtype');\n\n    var texCoordLocation = gl.getAttribLocation(program, 'a_texCoord');\n    var texLayerLocation = gl.getUniformLocation(program, 'u_image');\n    var texMaskLocation = gl.getUniformLocation(program, 'u_mask');\n\n    // provide texture coordinates for the rectangle.\n    var texCoordBuffer = gl.createBuffer();\n    gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);\n    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([\n      0.0, 0.0,\n      1.0, 0.0,\n      0.0, 1.0,\n      0.0, 1.0,\n      1.0, 0.0,\n      1.0, 1.0]), gl.STATIC_DRAW);\n    gl.enableVertexAttribArray(texCoordLocation);\n    gl.vertexAttribPointer(texCoordLocation, 2, gl.FLOAT, false, 0, 0);\n\n    gl.uniform1i(texLayerLocation, 0);\n    gl.uniform1i(texMaskLocation, 1);\n\n    smaskCache = cache;\n  }\n\n  function composeSMask(layer, mask, properties) {\n    var width = layer.width, height = layer.height;\n\n    if (!smaskCache) {\n      initSmaskGL();\n    }\n    var cache = smaskCache, canvas = cache.canvas, gl = cache.gl;\n    canvas.width = width;\n    canvas.height = height;\n    gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);\n    gl.uniform2f(cache.resolutionLocation, width, height);\n\n    if (properties.backdrop) {\n      gl.uniform4f(cache.resolutionLocation, properties.backdrop[0],\n                   properties.backdrop[1], properties.backdrop[2], 1);\n    } else {\n      gl.uniform4f(cache.resolutionLocation, 0, 0, 0, 0);\n    }\n    gl.uniform1i(cache.subtypeLocation,\n                 properties.subtype === 'Luminosity' ? 1 : 0);\n\n    // Create a textures\n    var texture = createTexture(gl, layer, gl.TEXTURE0);\n    var maskTexture = createTexture(gl, mask, gl.TEXTURE1);\n\n    // Create a buffer and put a single clipspace rectangle in\n    // it (2 triangles)\n    var buffer = gl.createBuffer();\n    gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([\n      0, 0,\n      width, 0,\n      0, height,\n      0, height,\n      width, 0,\n      width, height]), gl.STATIC_DRAW);\n    gl.enableVertexAttribArray(cache.positionLocation);\n    gl.vertexAttribPointer(cache.positionLocation, 2, gl.FLOAT, false, 0, 0);\n\n    // draw\n    gl.clearColor(0, 0, 0, 0);\n    gl.enable(gl.BLEND);\n    gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n    gl.clear(gl.COLOR_BUFFER_BIT);\n\n    gl.drawArrays(gl.TRIANGLES, 0, 6);\n\n    gl.flush();\n\n    gl.deleteTexture(texture);\n    gl.deleteTexture(maskTexture);\n    gl.deleteBuffer(buffer);\n\n    return canvas;\n  }\n\n  var figuresVertexShaderCode = '\\\n  attribute vec2 a_position;                                    \\\n  attribute vec3 a_color;                                       \\\n                                                                \\\n  uniform vec2 u_resolution;                                    \\\n  uniform vec2 u_scale;                                         \\\n  uniform vec2 u_offset;                                        \\\n                                                                \\\n  varying vec4 v_color;                                         \\\n                                                                \\\n  void main() {                                                 \\\n    vec2 position = (a_position + u_offset) * u_scale;          \\\n    vec2 clipSpace = (position / u_resolution) * 2.0 - 1.0;     \\\n    gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);          \\\n                                                                \\\n    v_color = vec4(a_color / 255.0, 1.0);                       \\\n  }                                                             ';\n\n  var figuresFragmentShaderCode = '\\\n  precision mediump float;                                      \\\n                                                                \\\n  varying vec4 v_color;                                         \\\n                                                                \\\n  void main() {                                                 \\\n    gl_FragColor = v_color;                                     \\\n  }                                                             ';\n\n  var figuresCache = null;\n\n  function initFiguresGL() {\n    var canvas, gl;\n\n    generateGL();\n    canvas = currentCanvas;\n    currentCanvas = null;\n    gl = currentGL;\n    currentGL = null;\n\n    // setup a GLSL program\n    var vertexShader = createVertexShader(gl, figuresVertexShaderCode);\n    var fragmentShader = createFragmentShader(gl, figuresFragmentShaderCode);\n    var program = createProgram(gl, [vertexShader, fragmentShader]);\n    gl.useProgram(program);\n\n    var cache = {};\n    cache.gl = gl;\n    cache.canvas = canvas;\n    cache.resolutionLocation = gl.getUniformLocation(program, 'u_resolution');\n    cache.scaleLocation = gl.getUniformLocation(program, 'u_scale');\n    cache.offsetLocation = gl.getUniformLocation(program, 'u_offset');\n    cache.positionLocation = gl.getAttribLocation(program, 'a_position');\n    cache.colorLocation = gl.getAttribLocation(program, 'a_color');\n\n    figuresCache = cache;\n  }\n\n  function drawFigures(width, height, backgroundColor, figures, context) {\n    if (!figuresCache) {\n      initFiguresGL();\n    }\n    var cache = figuresCache, canvas = cache.canvas, gl = cache.gl;\n\n    canvas.width = width;\n    canvas.height = height;\n    gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);\n    gl.uniform2f(cache.resolutionLocation, width, height);\n\n    // count triangle points\n    var count = 0;\n    var i, ii, rows;\n    for (i = 0, ii = figures.length; i < ii; i++) {\n      switch (figures[i].type) {\n        case 'lattice':\n          rows = (figures[i].coords.length / figures[i].verticesPerRow) | 0;\n          count += (rows - 1) * (figures[i].verticesPerRow - 1) * 6;\n          break;\n        case 'triangles':\n          count += figures[i].coords.length;\n          break;\n      }\n    }\n    // transfer data\n    var coords = new Float32Array(count * 2);\n    var colors = new Uint8Array(count * 3);\n    var coordsMap = context.coords, colorsMap = context.colors;\n    var pIndex = 0, cIndex = 0;\n    for (i = 0, ii = figures.length; i < ii; i++) {\n      var figure = figures[i], ps = figure.coords, cs = figure.colors;\n      switch (figure.type) {\n        case 'lattice':\n          var cols = figure.verticesPerRow;\n          rows = (ps.length / cols) | 0;\n          for (var row = 1; row < rows; row++) {\n            var offset = row * cols + 1;\n            for (var col = 1; col < cols; col++, offset++) {\n              coords[pIndex] = coordsMap[ps[offset - cols - 1]];\n              coords[pIndex + 1] = coordsMap[ps[offset - cols - 1] + 1];\n              coords[pIndex + 2] = coordsMap[ps[offset - cols]];\n              coords[pIndex + 3] = coordsMap[ps[offset - cols] + 1];\n              coords[pIndex + 4] = coordsMap[ps[offset - 1]];\n              coords[pIndex + 5] = coordsMap[ps[offset - 1] + 1];\n              colors[cIndex] = colorsMap[cs[offset - cols - 1]];\n              colors[cIndex + 1] = colorsMap[cs[offset - cols - 1] + 1];\n              colors[cIndex + 2] = colorsMap[cs[offset - cols - 1] + 2];\n              colors[cIndex + 3] = colorsMap[cs[offset - cols]];\n              colors[cIndex + 4] = colorsMap[cs[offset - cols] + 1];\n              colors[cIndex + 5] = colorsMap[cs[offset - cols] + 2];\n              colors[cIndex + 6] = colorsMap[cs[offset - 1]];\n              colors[cIndex + 7] = colorsMap[cs[offset - 1] + 1];\n              colors[cIndex + 8] = colorsMap[cs[offset - 1] + 2];\n\n              coords[pIndex + 6] = coords[pIndex + 2];\n              coords[pIndex + 7] = coords[pIndex + 3];\n              coords[pIndex + 8] = coords[pIndex + 4];\n              coords[pIndex + 9] = coords[pIndex + 5];\n              coords[pIndex + 10] = coordsMap[ps[offset]];\n              coords[pIndex + 11] = coordsMap[ps[offset] + 1];\n              colors[cIndex + 9] = colors[cIndex + 3];\n              colors[cIndex + 10] = colors[cIndex + 4];\n              colors[cIndex + 11] = colors[cIndex + 5];\n              colors[cIndex + 12] = colors[cIndex + 6];\n              colors[cIndex + 13] = colors[cIndex + 7];\n              colors[cIndex + 14] = colors[cIndex + 8];\n              colors[cIndex + 15] = colorsMap[cs[offset]];\n              colors[cIndex + 16] = colorsMap[cs[offset] + 1];\n              colors[cIndex + 17] = colorsMap[cs[offset] + 2];\n              pIndex += 12;\n              cIndex += 18;\n            }\n          }\n          break;\n        case 'triangles':\n          for (var j = 0, jj = ps.length; j < jj; j++) {\n            coords[pIndex] = coordsMap[ps[j]];\n            coords[pIndex + 1] = coordsMap[ps[j] + 1];\n            colors[cIndex] = colorsMap[cs[j]];\n            colors[cIndex + 1] = colorsMap[cs[j] + 1];\n            colors[cIndex + 2] = colorsMap[cs[j] + 2];\n            pIndex += 2;\n            cIndex += 3;\n          }\n          break;\n      }\n    }\n\n    // draw\n    if (backgroundColor) {\n      gl.clearColor(backgroundColor[0] / 255, backgroundColor[1] / 255,\n                    backgroundColor[2] / 255, 1.0);\n    } else {\n      gl.clearColor(0, 0, 0, 0);\n    }\n    gl.clear(gl.COLOR_BUFFER_BIT);\n\n    var coordsBuffer = gl.createBuffer();\n    gl.bindBuffer(gl.ARRAY_BUFFER, coordsBuffer);\n    gl.bufferData(gl.ARRAY_BUFFER, coords, gl.STATIC_DRAW);\n    gl.enableVertexAttribArray(cache.positionLocation);\n    gl.vertexAttribPointer(cache.positionLocation, 2, gl.FLOAT, false, 0, 0);\n\n    var colorsBuffer = gl.createBuffer();\n    gl.bindBuffer(gl.ARRAY_BUFFER, colorsBuffer);\n    gl.bufferData(gl.ARRAY_BUFFER, colors, gl.STATIC_DRAW);\n    gl.enableVertexAttribArray(cache.colorLocation);\n    gl.vertexAttribPointer(cache.colorLocation, 3, gl.UNSIGNED_BYTE, false,\n                           0, 0);\n\n    gl.uniform2f(cache.scaleLocation, context.scaleX, context.scaleY);\n    gl.uniform2f(cache.offsetLocation, context.offsetX, context.offsetY);\n\n    gl.drawArrays(gl.TRIANGLES, 0, count);\n\n    gl.flush();\n\n    gl.deleteBuffer(coordsBuffer);\n    gl.deleteBuffer(colorsBuffer);\n\n    return canvas;\n  }\n\n  return {\n    tryInitGL() {\n      try {\n        generateGL();\n        return !!currentGL;\n      } catch (ex) { }\n      return false;\n    },\n\n    composeSMask,\n\n    drawFigures,\n\n    cleanup() {\n      if (smaskCache && smaskCache.canvas) {\n        smaskCache.canvas.width = 0;\n        smaskCache.canvas.height = 0;\n      }\n      if (figuresCache && figuresCache.canvas) {\n        figuresCache.canvas.width = 0;\n        figuresCache.canvas.height = 0;\n      }\n      smaskCache = null;\n      figuresCache = null;\n    },\n  };\n})();\n\nexport {\n  WebGLContext,\n};\n","/* Copyright 2015 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AbortException, createPromiseCapability, Util } from '../shared/util';\nimport globalScope from '../shared/global_scope';\n\n/**\n * Text layer render parameters.\n *\n * @typedef {Object} TextLayerRenderParameters\n * @property {TextContent} textContent - (optional) Text content to render\n *   (the object is returned by the page's getTextContent() method).\n * @property {ReadableStream} textContentStream - (optional) Text content\n *   stream to render (the stream is returned by the page's\n *   streamTextContent() method).\n * @property {HTMLElement} container - HTML element that will contain text runs.\n * @property {PageViewport} viewport - The target viewport to properly\n *   layout the text runs.\n * @property {Array} textDivs - (optional) HTML elements that are correspond\n *   the text items of the textContent input. This is output and shall be\n *   initially be set to empty array.\n * @property {Array} textContentItemsStr - (optional) Strings that correspond\n *   the `str` property of the text items of textContent input. This is output\n *   and shall be initially be set to empty array.\n * @property {number} timeout - (optional) Delay in milliseconds before\n *   rendering of the text  runs occurs.\n * @property {boolean} enhanceTextSelection - (optional) Whether to turn on the\n *   text selection enhancement.\n */\nvar renderTextLayer = (function renderTextLayerClosure() {\n  var MAX_TEXT_DIVS_TO_RENDER = 100000;\n\n  var NonWhitespaceRegexp = /\\S/;\n\n  function isAllWhitespace(str) {\n    return !NonWhitespaceRegexp.test(str);\n  }\n\n  // Text layers may contain many thousands of divs, and using `styleBuf` avoids\n  // creating many intermediate strings when building their 'style' properties.\n  var styleBuf = ['left: ', 0, 'px; top: ', 0, 'px; font-size: ', 0,\n                  'px; font-family: ', '', ';'];\n\n  function appendText(task, geom, styles) {\n    // Initialize all used properties to keep the caches monomorphic.\n    var textDiv = document.createElement('div');\n    var textDivProperties = {\n      style: null,\n      angle: 0,\n      canvasWidth: 0,\n      isWhitespace: false,\n      originalTransform: null,\n      paddingBottom: 0,\n      paddingLeft: 0,\n      paddingRight: 0,\n      paddingTop: 0,\n      scale: 1,\n    };\n\n    task._textDivs.push(textDiv);\n    if (isAllWhitespace(geom.str)) {\n      textDivProperties.isWhitespace = true;\n      task._textDivProperties.set(textDiv, textDivProperties);\n      return;\n    }\n\n    var tx = Util.transform(task._viewport.transform, geom.transform);\n    var angle = Math.atan2(tx[1], tx[0]);\n    var style = styles[geom.fontName];\n    if (style.vertical) {\n      angle += Math.PI / 2;\n    }\n    var fontHeight = Math.sqrt((tx[2] * tx[2]) + (tx[3] * tx[3]));\n    var fontAscent = fontHeight;\n    if (style.ascent) {\n      fontAscent = style.ascent * fontAscent;\n    } else if (style.descent) {\n      fontAscent = (1 + style.descent) * fontAscent;\n    }\n\n    var left;\n    var top;\n    if (angle === 0) {\n      left = tx[4];\n      top = tx[5] - fontAscent;\n    } else {\n      left = tx[4] + (fontAscent * Math.sin(angle));\n      top = tx[5] - (fontAscent * Math.cos(angle));\n    }\n    styleBuf[1] = left;\n    styleBuf[3] = top;\n    styleBuf[5] = fontHeight;\n    styleBuf[7] = style.fontFamily;\n    textDivProperties.style = styleBuf.join('');\n    textDiv.setAttribute('style', textDivProperties.style);\n\n    textDiv.textContent = geom.str;\n    // `fontName` is only used by the FontInspector, and we only use `dataset`\n    // here to make the font name available in the debugger.\n    if (task._fontInspectorEnabled) {\n      textDiv.dataset.fontName = geom.fontName;\n    }\n    if (angle !== 0) {\n      textDivProperties.angle = angle * (180 / Math.PI);\n    }\n    // We don't bother scaling single-char text divs, because it has very\n    // little effect on text highlighting. This makes scrolling on docs with\n    // lots of such divs a lot faster.\n    if (geom.str.length > 1) {\n      if (style.vertical) {\n        textDivProperties.canvasWidth = geom.height * task._viewport.scale;\n      } else {\n        textDivProperties.canvasWidth = geom.width * task._viewport.scale;\n      }\n    }\n    task._textDivProperties.set(textDiv, textDivProperties);\n    if (task._textContentStream) {\n      task._layoutText(textDiv);\n    }\n\n    if (task._enhanceTextSelection) {\n      var angleCos = 1, angleSin = 0;\n      if (angle !== 0) {\n        angleCos = Math.cos(angle);\n        angleSin = Math.sin(angle);\n      }\n      var divWidth = (style.vertical ? geom.height : geom.width) *\n                     task._viewport.scale;\n      var divHeight = fontHeight;\n\n      var m, b;\n      if (angle !== 0) {\n        m = [angleCos, angleSin, -angleSin, angleCos, left, top];\n        b = Util.getAxialAlignedBoundingBox([0, 0, divWidth, divHeight], m);\n      } else {\n        b = [left, top, left + divWidth, top + divHeight];\n      }\n\n      task._bounds.push({\n        left: b[0],\n        top: b[1],\n        right: b[2],\n        bottom: b[3],\n        div: textDiv,\n        size: [divWidth, divHeight],\n        m,\n      });\n    }\n  }\n\n  function render(task) {\n    if (task._canceled) {\n      return;\n    }\n    var textDivs = task._textDivs;\n    var capability = task._capability;\n    var textDivsLength = textDivs.length;\n\n    // No point in rendering many divs as it would make the browser\n    // unusable even after the divs are rendered.\n    if (textDivsLength > MAX_TEXT_DIVS_TO_RENDER) {\n      task._renderingDone = true;\n      capability.resolve();\n      return;\n    }\n\n    if (!task._textContentStream) {\n      for (var i = 0; i < textDivsLength; i++) {\n        task._layoutText(textDivs[i]);\n      }\n    }\n\n    task._renderingDone = true;\n    capability.resolve();\n  }\n\n  function expand(task) {\n    var bounds = task._bounds;\n    var viewport = task._viewport;\n\n    var expanded = expandBounds(viewport.width, viewport.height, bounds);\n    for (var i = 0; i < expanded.length; i++) {\n      var div = bounds[i].div;\n      var divProperties = task._textDivProperties.get(div);\n      if (divProperties.angle === 0) {\n        divProperties.paddingLeft = bounds[i].left - expanded[i].left;\n        divProperties.paddingTop = bounds[i].top - expanded[i].top;\n        divProperties.paddingRight = expanded[i].right - bounds[i].right;\n        divProperties.paddingBottom = expanded[i].bottom - bounds[i].bottom;\n        task._textDivProperties.set(div, divProperties);\n        continue;\n      }\n      // Box is rotated -- trying to find padding so rotated div will not\n      // exceed its expanded bounds.\n      var e = expanded[i], b = bounds[i];\n      var m = b.m, c = m[0], s = m[1];\n      // Finding intersections with expanded box.\n      var points = [[0, 0], [0, b.size[1]], [b.size[0], 0], b.size];\n      var ts = new Float64Array(64);\n      points.forEach(function (p, i) {\n        var t = Util.applyTransform(p, m);\n        ts[i + 0] = c && (e.left - t[0]) / c;\n        ts[i + 4] = s && (e.top - t[1]) / s;\n        ts[i + 8] = c && (e.right - t[0]) / c;\n        ts[i + 12] = s && (e.bottom - t[1]) / s;\n\n        ts[i + 16] = s && (e.left - t[0]) / -s;\n        ts[i + 20] = c && (e.top - t[1]) / c;\n        ts[i + 24] = s && (e.right - t[0]) / -s;\n        ts[i + 28] = c && (e.bottom - t[1]) / c;\n\n        ts[i + 32] = c && (e.left - t[0]) / -c;\n        ts[i + 36] = s && (e.top - t[1]) / -s;\n        ts[i + 40] = c && (e.right - t[0]) / -c;\n        ts[i + 44] = s && (e.bottom - t[1]) / -s;\n\n        ts[i + 48] = s && (e.left - t[0]) / s;\n        ts[i + 52] = c && (e.top - t[1]) / -c;\n        ts[i + 56] = s && (e.right - t[0]) / s;\n        ts[i + 60] = c && (e.bottom - t[1]) / -c;\n      });\n      var findPositiveMin = function (ts, offset, count) {\n        var result = 0;\n        for (var i = 0; i < count; i++) {\n          var t = ts[offset++];\n          if (t > 0) {\n            result = result ? Math.min(t, result) : t;\n          }\n        }\n        return result;\n      };\n      // Not based on math, but to simplify calculations, using cos and sin\n      // absolute values to not exceed the box (it can but insignificantly).\n      var boxScale = 1 + Math.min(Math.abs(c), Math.abs(s));\n      divProperties.paddingLeft = findPositiveMin(ts, 32, 16) / boxScale;\n      divProperties.paddingTop = findPositiveMin(ts, 48, 16) / boxScale;\n      divProperties.paddingRight = findPositiveMin(ts, 0, 16) / boxScale;\n      divProperties.paddingBottom = findPositiveMin(ts, 16, 16) / boxScale;\n      task._textDivProperties.set(div, divProperties);\n    }\n  }\n\n  function expandBounds(width, height, boxes) {\n    var bounds = boxes.map(function (box, i) {\n      return {\n        x1: box.left,\n        y1: box.top,\n        x2: box.right,\n        y2: box.bottom,\n        index: i,\n        x1New: undefined,\n        x2New: undefined,\n      };\n    });\n    expandBoundsLTR(width, bounds);\n    var expanded = new Array(boxes.length);\n    bounds.forEach(function (b) {\n      var i = b.index;\n      expanded[i] = {\n        left: b.x1New,\n        top: 0,\n        right: b.x2New,\n        bottom: 0,\n      };\n    });\n\n    // Rotating on 90 degrees and extending extended boxes. Reusing the bounds\n    // array and objects.\n    boxes.map(function (box, i) {\n      var e = expanded[i], b = bounds[i];\n      b.x1 = box.top;\n      b.y1 = width - e.right;\n      b.x2 = box.bottom;\n      b.y2 = width - e.left;\n      b.index = i;\n      b.x1New = undefined;\n      b.x2New = undefined;\n    });\n    expandBoundsLTR(height, bounds);\n\n    bounds.forEach(function (b) {\n      var i = b.index;\n      expanded[i].top = b.x1New;\n      expanded[i].bottom = b.x2New;\n    });\n    return expanded;\n  }\n\n  function expandBoundsLTR(width, bounds) {\n    // Sorting by x1 coordinate and walk by the bounds in the same order.\n    bounds.sort(function (a, b) {\n      return a.x1 - b.x1 || a.index - b.index;\n    });\n\n    // First we see on the horizon is a fake boundary.\n    var fakeBoundary = {\n      x1: -Infinity,\n      y1: -Infinity,\n      x2: 0,\n      y2: Infinity,\n      index: -1,\n      x1New: 0,\n      x2New: 0,\n    };\n    var horizon = [{\n      start: -Infinity,\n      end: Infinity,\n      boundary: fakeBoundary,\n    }];\n\n    bounds.forEach(function (boundary) {\n      // Searching for the affected part of horizon.\n      // TODO red-black tree or simple binary search\n      var i = 0;\n      while (i < horizon.length && horizon[i].end <= boundary.y1) {\n        i++;\n      }\n      var j = horizon.length - 1;\n      while (j >= 0 && horizon[j].start >= boundary.y2) {\n        j--;\n      }\n\n      var horizonPart, affectedBoundary;\n      var q, k, maxXNew = -Infinity;\n      for (q = i; q <= j; q++) {\n        horizonPart = horizon[q];\n        affectedBoundary = horizonPart.boundary;\n        var xNew;\n        if (affectedBoundary.x2 > boundary.x1) {\n          // In the middle of the previous element, new x shall be at the\n          // boundary start. Extending if further if the affected boundary\n          // placed on top of the current one.\n          xNew = affectedBoundary.index > boundary.index ?\n            affectedBoundary.x1New : boundary.x1;\n        } else if (affectedBoundary.x2New === undefined) {\n          // We have some space in between, new x in middle will be a fair\n          // choice.\n          xNew = (affectedBoundary.x2 + boundary.x1) / 2;\n        } else {\n          // Affected boundary has x2new set, using it as new x.\n          xNew = affectedBoundary.x2New;\n        }\n        if (xNew > maxXNew) {\n          maxXNew = xNew;\n        }\n      }\n\n      // Set new x1 for current boundary.\n      boundary.x1New = maxXNew;\n\n      // Adjusts new x2 for the affected boundaries.\n      for (q = i; q <= j; q++) {\n        horizonPart = horizon[q];\n        affectedBoundary = horizonPart.boundary;\n        if (affectedBoundary.x2New === undefined) {\n          // Was not set yet, choosing new x if possible.\n          if (affectedBoundary.x2 > boundary.x1) {\n            // Current and affected boundaries intersect. If affected boundary\n            // is placed on top of the current, shrinking the affected.\n            if (affectedBoundary.index > boundary.index) {\n              affectedBoundary.x2New = affectedBoundary.x2;\n            }\n          } else {\n            affectedBoundary.x2New = maxXNew;\n          }\n        } else if (affectedBoundary.x2New > maxXNew) {\n          // Affected boundary is touching new x, pushing it back.\n          affectedBoundary.x2New = Math.max(maxXNew, affectedBoundary.x2);\n        }\n      }\n\n      // Fixing the horizon.\n      var changedHorizon = [], lastBoundary = null;\n      for (q = i; q <= j; q++) {\n        horizonPart = horizon[q];\n        affectedBoundary = horizonPart.boundary;\n        // Checking which boundary will be visible.\n        var useBoundary = affectedBoundary.x2 > boundary.x2 ?\n          affectedBoundary : boundary;\n        if (lastBoundary === useBoundary) {\n          // Merging with previous.\n          changedHorizon[changedHorizon.length - 1].end = horizonPart.end;\n        } else {\n          changedHorizon.push({\n            start: horizonPart.start,\n            end: horizonPart.end,\n            boundary: useBoundary,\n          });\n          lastBoundary = useBoundary;\n        }\n      }\n      if (horizon[i].start < boundary.y1) {\n        changedHorizon[0].start = boundary.y1;\n        changedHorizon.unshift({\n          start: horizon[i].start,\n          end: boundary.y1,\n          boundary: horizon[i].boundary,\n        });\n      }\n      if (boundary.y2 < horizon[j].end) {\n        changedHorizon[changedHorizon.length - 1].end = boundary.y2;\n        changedHorizon.push({\n          start: boundary.y2,\n          end: horizon[j].end,\n          boundary: horizon[j].boundary,\n        });\n      }\n\n      // Set x2 new of boundary that is no longer visible (see overlapping case\n      // above).\n      // TODO more efficient, e.g. via reference counting.\n      for (q = i; q <= j; q++) {\n        horizonPart = horizon[q];\n        affectedBoundary = horizonPart.boundary;\n        if (affectedBoundary.x2New !== undefined) {\n          continue;\n        }\n        var used = false;\n        for (k = i - 1; !used && k >= 0 &&\n        horizon[k].start >= affectedBoundary.y1; k--) {\n          used = horizon[k].boundary === affectedBoundary;\n        }\n        for (k = j + 1; !used && k < horizon.length &&\n        horizon[k].end <= affectedBoundary.y2; k++) {\n          used = horizon[k].boundary === affectedBoundary;\n        }\n        for (k = 0; !used && k < changedHorizon.length; k++) {\n          used = changedHorizon[k].boundary === affectedBoundary;\n        }\n        if (!used) {\n          affectedBoundary.x2New = maxXNew;\n        }\n      }\n\n      Array.prototype.splice.apply(horizon,\n        [i, j - i + 1].concat(changedHorizon));\n    });\n\n    // Set new x2 for all unset boundaries.\n    horizon.forEach(function (horizonPart) {\n      var affectedBoundary = horizonPart.boundary;\n      if (affectedBoundary.x2New === undefined) {\n        affectedBoundary.x2New = Math.max(width, affectedBoundary.x2);\n      }\n    });\n  }\n\n  /**\n   * Text layer rendering task.\n   *\n   * @param {TextContent} textContent\n   * @param {HTMLElement} container\n   * @param {PageViewport} viewport\n   * @param {Array} textDivs\n   * @param {boolean} enhanceTextSelection\n   * @private\n   */\n  function TextLayerRenderTask({ textContent, textContentStream, container,\n                                 viewport, textDivs, textContentItemsStr,\n                                 enhanceTextSelection, }) {\n    this._textContent = textContent;\n    this._textContentStream = textContentStream;\n    this._container = container;\n    this._viewport = viewport;\n    this._textDivs = textDivs || [];\n    this._textContentItemsStr = textContentItemsStr || [];\n    this._enhanceTextSelection = !!enhanceTextSelection;\n    this._fontInspectorEnabled = !!(globalScope.FontInspector &&\n                                    globalScope.FontInspector.enabled);\n\n    this._reader = null;\n    this._layoutTextLastFontSize = null;\n    this._layoutTextLastFontFamily = null;\n    this._layoutTextCtx = null;\n    this._textDivProperties = new WeakMap();\n    this._renderingDone = false;\n    this._canceled = false;\n    this._capability = createPromiseCapability();\n    this._renderTimer = null;\n    this._bounds = [];\n  }\n  TextLayerRenderTask.prototype = {\n    get promise() {\n      return this._capability.promise;\n    },\n\n    cancel: function TextLayer_cancel() {\n      if (this._reader) {\n        this._reader.cancel(new AbortException('text layer task cancelled'));\n        this._reader = null;\n      }\n      this._canceled = true;\n      if (this._renderTimer !== null) {\n        clearTimeout(this._renderTimer);\n        this._renderTimer = null;\n      }\n      this._capability.reject('canceled');\n    },\n\n    _processItems(items, styleCache) {\n      for (let i = 0, len = items.length; i < len; i++) {\n        this._textContentItemsStr.push(items[i].str);\n        appendText(this, items[i], styleCache);\n      }\n    },\n\n    _layoutText(textDiv) {\n      let textLayerFrag = this._container;\n\n      let textDivProperties = this._textDivProperties.get(textDiv);\n      if (textDivProperties.isWhitespace) {\n        return;\n      }\n\n      let fontSize = textDiv.style.fontSize;\n      let fontFamily = textDiv.style.fontFamily;\n\n      // Only build font string and set to context if different from last.\n      if (fontSize !== this._layoutTextLastFontSize ||\n          fontFamily !== this._layoutTextLastFontFamily) {\n        this._layoutTextCtx.font = fontSize + ' ' + fontFamily;\n        this._layoutTextLastFontSize = fontSize;\n        this._layoutTextLastFontFamily = fontFamily;\n      }\n\n      let width = this._layoutTextCtx.measureText(textDiv.textContent).width;\n\n      let transform = '';\n      if (textDivProperties.canvasWidth !== 0 && width > 0) {\n        textDivProperties.scale = textDivProperties.canvasWidth / width;\n        transform = 'scaleX(' + textDivProperties.scale + ')';\n      }\n      if (textDivProperties.angle !== 0) {\n        transform = 'rotate(' + textDivProperties.angle + 'deg) ' + transform;\n      }\n      if (transform !== '') {\n        textDivProperties.originalTransform = transform;\n        textDiv.style.transform = transform;\n      }\n      this._textDivProperties.set(textDiv, textDivProperties);\n      textLayerFrag.appendChild(textDiv);\n    },\n\n    _render: function TextLayer_render(timeout) {\n      let capability = createPromiseCapability();\n      let styleCache = Object.create(null);\n\n      // The temporary canvas is used to measure text length in the DOM.\n      let canvas = document.createElement('canvas');\n      if (typeof PDFJSDev === 'undefined' ||\n          PDFJSDev.test('FIREFOX || MOZCENTRAL || GENERIC')) {\n         canvas.mozOpaque = true;\n      }\n      this._layoutTextCtx = canvas.getContext('2d', { alpha: false, });\n\n      if (this._textContent) {\n        let textItems = this._textContent.items;\n        let textStyles = this._textContent.styles;\n        this._processItems(textItems, textStyles);\n        capability.resolve();\n      } else if (this._textContentStream) {\n        let pump = () => {\n          this._reader.read().then(({ value, done, }) => {\n            if (done) {\n              capability.resolve();\n              return;\n            }\n\n            Object.assign(styleCache, value.styles);\n            this._processItems(value.items, styleCache);\n            pump();\n          }, capability.reject);\n        };\n\n        this._reader = this._textContentStream.getReader();\n        pump();\n      } else {\n        throw new Error('Neither \"textContent\" nor \"textContentStream\"' +\n          ' parameters specified.');\n      }\n\n      capability.promise.then(() => {\n        styleCache = null;\n        if (!timeout) { // Render right away\n          render(this);\n        } else { // Schedule\n          this._renderTimer = setTimeout(() => {\n            render(this);\n            this._renderTimer = null;\n          }, timeout);\n        }\n      }, this._capability.reject);\n    },\n\n    expandTextDivs: function TextLayer_expandTextDivs(expandDivs) {\n      if (!this._enhanceTextSelection || !this._renderingDone) {\n        return;\n      }\n      if (this._bounds !== null) {\n        expand(this);\n        this._bounds = null;\n      }\n\n      for (var i = 0, ii = this._textDivs.length; i < ii; i++) {\n        var div = this._textDivs[i];\n        var divProperties = this._textDivProperties.get(div);\n\n        if (divProperties.isWhitespace) {\n          continue;\n        }\n        if (expandDivs) {\n          var transform = '', padding = '';\n\n          if (divProperties.scale !== 1) {\n            transform = 'scaleX(' + divProperties.scale + ')';\n          }\n          if (divProperties.angle !== 0) {\n            transform = 'rotate(' + divProperties.angle + 'deg) ' + transform;\n          }\n          if (divProperties.paddingLeft !== 0) {\n            padding += ' padding-left: ' +\n              (divProperties.paddingLeft / divProperties.scale) + 'px;';\n            transform += ' translateX(' +\n              (-divProperties.paddingLeft / divProperties.scale) + 'px)';\n          }\n          if (divProperties.paddingTop !== 0) {\n            padding += ' padding-top: ' + divProperties.paddingTop + 'px;';\n            transform += ' translateY(' + (-divProperties.paddingTop) + 'px)';\n          }\n          if (divProperties.paddingRight !== 0) {\n            padding += ' padding-right: ' +\n              (divProperties.paddingRight / divProperties.scale) + 'px;';\n          }\n          if (divProperties.paddingBottom !== 0) {\n            padding += ' padding-bottom: ' +\n              divProperties.paddingBottom + 'px;';\n          }\n\n          if (padding !== '') {\n            div.setAttribute('style', divProperties.style + padding);\n          }\n          if (transform !== '') {\n            div.style.transform = transform;\n          }\n        } else {\n          div.style.padding = 0;\n          div.style.transform = divProperties.originalTransform || '';\n        }\n      }\n    },\n  };\n\n  /**\n   * Starts rendering of the text layer.\n   *\n   * @param {TextLayerRenderParameters} renderParameters\n   * @returns {TextLayerRenderTask}\n   */\n  function renderTextLayer(renderParameters) {\n    var task = new TextLayerRenderTask({\n      textContent: renderParameters.textContent,\n      textContentStream: renderParameters.textContentStream,\n      container: renderParameters.container,\n      viewport: renderParameters.viewport,\n      textDivs: renderParameters.textDivs,\n      textContentItemsStr: renderParameters.textContentItemsStr,\n      enhanceTextSelection: renderParameters.enhanceTextSelection,\n    });\n    task._render(renderParameters.timeout);\n    return task;\n  }\n\n  return renderTextLayer;\n})();\n\nexport {\n  renderTextLayer,\n};\n","/* Copyright 2014 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  addLinkAttributes, DOMSVGFactory, getFilenameFromUrl, LinkTarget\n} from './dom_utils';\nimport {\n  AnnotationBorderStyleType, AnnotationType, stringToPDFString, unreachable,\n  Util, warn\n} from '../shared/util';\n\n/**\n * @typedef {Object} AnnotationElementParameters\n * @property {Object} data\n * @property {HTMLDivElement} layer\n * @property {PDFPage} page\n * @property {PageViewport} viewport\n * @property {IPDFLinkService} linkService\n * @property {DownloadManager} downloadManager\n * @property {string} imageResourcesPath - (optional) Path for image resources,\n *   mainly for annotation icons. Include trailing slash.\n * @property {boolean} renderInteractiveForms\n * @property {Object} svgFactory\n */\n\nclass AnnotationElementFactory {\n  /**\n   * @param {AnnotationElementParameters} parameters\n   * @returns {AnnotationElement}\n   */\n  static create(parameters) {\n    let subtype = parameters.data.annotationType;\n\n    switch (subtype) {\n      case AnnotationType.LINK:\n        return new LinkAnnotationElement(parameters);\n\n      case AnnotationType.TEXT:\n        return new TextAnnotationElement(parameters);\n\n      case AnnotationType.WIDGET:\n        let fieldType = parameters.data.fieldType;\n\n        switch (fieldType) {\n          case 'Tx':\n            return new TextWidgetAnnotationElement(parameters);\n          case 'Btn':\n            if (parameters.data.radioButton) {\n              return new RadioButtonWidgetAnnotationElement(parameters);\n            } else if (parameters.data.checkBox) {\n              return new CheckboxWidgetAnnotationElement(parameters);\n            }\n            return new PushButtonWidgetAnnotationElement(parameters);\n          case 'Ch':\n            return new ChoiceWidgetAnnotationElement(parameters);\n        }\n        return new WidgetAnnotationElement(parameters);\n\n      case AnnotationType.POPUP:\n        return new PopupAnnotationElement(parameters);\n\n      case AnnotationType.LINE:\n        return new LineAnnotationElement(parameters);\n\n      case AnnotationType.SQUARE:\n        return new SquareAnnotationElement(parameters);\n\n      case AnnotationType.CIRCLE:\n        return new CircleAnnotationElement(parameters);\n\n      case AnnotationType.POLYLINE:\n        return new PolylineAnnotationElement(parameters);\n\n      case AnnotationType.INK:\n        return new InkAnnotationElement(parameters);\n\n      case AnnotationType.POLYGON:\n        return new PolygonAnnotationElement(parameters);\n\n      case AnnotationType.HIGHLIGHT:\n        return new HighlightAnnotationElement(parameters);\n\n      case AnnotationType.UNDERLINE:\n        return new UnderlineAnnotationElement(parameters);\n\n      case AnnotationType.SQUIGGLY:\n        return new SquigglyAnnotationElement(parameters);\n\n      case AnnotationType.STRIKEOUT:\n        return new StrikeOutAnnotationElement(parameters);\n\n      case AnnotationType.STAMP:\n        return new StampAnnotationElement(parameters);\n\n      case AnnotationType.FILEATTACHMENT:\n        return new FileAttachmentAnnotationElement(parameters);\n\n      default:\n        return new AnnotationElement(parameters);\n    }\n  }\n}\n\nclass AnnotationElement {\n  constructor(parameters, isRenderable = false, ignoreBorder = false) {\n    this.isRenderable = isRenderable;\n    this.data = parameters.data;\n    this.layer = parameters.layer;\n    this.page = parameters.page;\n    this.viewport = parameters.viewport;\n    this.linkService = parameters.linkService;\n    this.downloadManager = parameters.downloadManager;\n    this.imageResourcesPath = parameters.imageResourcesPath;\n    this.renderInteractiveForms = parameters.renderInteractiveForms;\n    this.svgFactory = parameters.svgFactory;\n\n    if (isRenderable) {\n      this.container = this._createContainer(ignoreBorder);\n    }\n  }\n\n  /**\n   * Create an empty container for the annotation's HTML element.\n   *\n   * @private\n   * @param {boolean} ignoreBorder\n   * @memberof AnnotationElement\n   * @returns {HTMLSectionElement}\n   */\n  _createContainer(ignoreBorder = false) {\n    let data = this.data, page = this.page, viewport = this.viewport;\n    let container = document.createElement('section');\n    let width = data.rect[2] - data.rect[0];\n    let height = data.rect[3] - data.rect[1];\n\n    container.setAttribute('data-annotation-id', data.id);\n\n    // Do *not* modify `data.rect`, since that will corrupt the annotation\n    // position on subsequent calls to `_createContainer` (see issue 6804).\n    let rect = Util.normalizeRect([\n      data.rect[0],\n      page.view[3] - data.rect[1] + page.view[1],\n      data.rect[2],\n      page.view[3] - data.rect[3] + page.view[1]\n    ]);\n\n    container.style.transform = 'matrix(' + viewport.transform.join(',') + ')';\n    container.style.transformOrigin = -rect[0] + 'px ' + -rect[1] + 'px';\n\n    if (!ignoreBorder && data.borderStyle.width > 0) {\n      container.style.borderWidth = data.borderStyle.width + 'px';\n      if (data.borderStyle.style !== AnnotationBorderStyleType.UNDERLINE) {\n        // Underline styles only have a bottom border, so we do not need\n        // to adjust for all borders. This yields a similar result as\n        // Adobe Acrobat/Reader.\n        width = width - 2 * data.borderStyle.width;\n        height = height - 2 * data.borderStyle.width;\n      }\n\n      let horizontalRadius = data.borderStyle.horizontalCornerRadius;\n      let verticalRadius = data.borderStyle.verticalCornerRadius;\n      if (horizontalRadius > 0 || verticalRadius > 0) {\n        let radius = horizontalRadius + 'px / ' + verticalRadius + 'px';\n        container.style.borderRadius = radius;\n      }\n\n      switch (data.borderStyle.style) {\n        case AnnotationBorderStyleType.SOLID:\n          container.style.borderStyle = 'solid';\n          break;\n\n        case AnnotationBorderStyleType.DASHED:\n          container.style.borderStyle = 'dashed';\n          break;\n\n        case AnnotationBorderStyleType.BEVELED:\n          warn('Unimplemented border style: beveled');\n          break;\n\n        case AnnotationBorderStyleType.INSET:\n          warn('Unimplemented border style: inset');\n          break;\n\n        case AnnotationBorderStyleType.UNDERLINE:\n          container.style.borderBottomStyle = 'solid';\n          break;\n\n        default:\n          break;\n      }\n\n      if (data.color) {\n        container.style.borderColor = Util.makeCssRgb(data.color[0] | 0,\n                                                      data.color[1] | 0,\n                                                      data.color[2] | 0);\n      } else {\n        // Transparent (invisible) border, so do not draw it at all.\n        container.style.borderWidth = 0;\n      }\n    }\n\n    container.style.left = rect[0] + 'px';\n    container.style.top = rect[1] + 'px';\n\n    container.style.width = width + 'px';\n    container.style.height = height + 'px';\n\n    return container;\n  }\n\n  /**\n   * Create a popup for the annotation's HTML element. This is used for\n   * annotations that do not have a Popup entry in the dictionary, but\n   * are of a type that works with popups (such as Highlight annotations).\n   *\n   * @private\n   * @param {HTMLSectionElement} container\n   * @param {HTMLDivElement|HTMLImageElement|null} trigger\n   * @param {Object} data\n   * @memberof AnnotationElement\n   */\n  _createPopup(container, trigger, data) {\n    // If no trigger element is specified, create it.\n    if (!trigger) {\n      trigger = document.createElement('div');\n      trigger.style.height = container.style.height;\n      trigger.style.width = container.style.width;\n      container.appendChild(trigger);\n    }\n\n    let popupElement = new PopupElement({\n      container,\n      trigger,\n      color: data.color,\n      title: data.title,\n      contents: data.contents,\n      hideWrapper: true,\n    });\n    let popup = popupElement.render();\n\n    // Position the popup next to the annotation's container.\n    popup.style.left = container.style.width;\n\n    container.appendChild(popup);\n  }\n\n  /**\n   * Render the annotation's HTML element in the empty container.\n   *\n   * @public\n   * @memberof AnnotationElement\n   */\n  render() {\n    unreachable('Abstract method `AnnotationElement.render` called');\n  }\n}\n\nclass LinkAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    let isRenderable = !!(parameters.data.url || parameters.data.dest ||\n                          parameters.data.action);\n    super(parameters, isRenderable);\n  }\n\n  /**\n   * Render the link annotation's HTML element in the empty container.\n   *\n   * @public\n   * @memberof LinkAnnotationElement\n   * @returns {HTMLSectionElement}\n   */\n  render() {\n    this.container.className = 'linkAnnotation';\n\n    let { data, linkService, } = this;\n    let link = document.createElement('a');\n\n    addLinkAttributes(link, {\n      url: data.url,\n      target: (data.newWindow ?\n               LinkTarget.BLANK : linkService.externalLinkTarget),\n      rel: linkService.externalLinkRel,\n    });\n\n    if (!data.url) {\n      if (data.action) {\n        this._bindNamedAction(link, data.action);\n      } else {\n        this._bindLink(link, data.dest);\n      }\n    }\n\n    this.container.appendChild(link);\n    return this.container;\n  }\n\n  /**\n   * Bind internal links to the link element.\n   *\n   * @private\n   * @param {Object} link\n   * @param {Object} destination\n   * @memberof LinkAnnotationElement\n   */\n  _bindLink(link, destination) {\n    link.href = this.linkService.getDestinationHash(destination);\n    link.onclick = () => {\n      if (destination) {\n        this.linkService.navigateTo(destination);\n      }\n      return false;\n    };\n    if (destination) {\n      link.className = 'internalLink';\n    }\n  }\n\n  /**\n   * Bind named actions to the link element.\n   *\n   * @private\n   * @param {Object} link\n   * @param {Object} action\n   * @memberof LinkAnnotationElement\n   */\n  _bindNamedAction(link, action) {\n    link.href = this.linkService.getAnchorUrl('');\n    link.onclick = () => {\n      this.linkService.executeNamedAction(action);\n      return false;\n    };\n    link.className = 'internalLink';\n  }\n}\n\nclass TextAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    let isRenderable = !!(parameters.data.hasPopup ||\n                          parameters.data.title || parameters.data.contents);\n    super(parameters, isRenderable);\n  }\n\n  /**\n   * Render the text annotation's HTML element in the empty container.\n   *\n   * @public\n   * @memberof TextAnnotationElement\n   * @returns {HTMLSectionElement}\n   */\n  render() {\n    this.container.className = 'textAnnotation';\n\n    let image = document.createElement('img');\n    image.style.height = this.container.style.height;\n    image.style.width = this.container.style.width;\n    image.src = this.imageResourcesPath + 'annotation-' +\n      this.data.name.toLowerCase() + '.svg';\n    image.alt = '[{{type}} Annotation]';\n    image.dataset.l10nId = 'text_annotation_type';\n    image.dataset.l10nArgs = JSON.stringify({ type: this.data.name, });\n\n    if (!this.data.hasPopup) {\n      this._createPopup(this.container, image, this.data);\n    }\n\n    this.container.appendChild(image);\n    return this.container;\n  }\n}\n\nclass WidgetAnnotationElement extends AnnotationElement {\n  /**\n   * Render the widget annotation's HTML element in the empty container.\n   *\n   * @public\n   * @memberof WidgetAnnotationElement\n   * @returns {HTMLSectionElement}\n   */\n  render() {\n    // Show only the container for unsupported field types.\n    return this.container;\n  }\n}\n\nclass TextWidgetAnnotationElement extends WidgetAnnotationElement {\n  constructor(parameters) {\n    let isRenderable = parameters.renderInteractiveForms ||\n      (!parameters.data.hasAppearance && !!parameters.data.fieldValue);\n    super(parameters, isRenderable);\n  }\n\n  /**\n   * Render the text widget annotation's HTML element in the empty container.\n   *\n   * @public\n   * @memberof TextWidgetAnnotationElement\n   * @returns {HTMLSectionElement}\n   */\n  render() {\n    const TEXT_ALIGNMENT = ['left', 'center', 'right'];\n\n    this.container.className = 'textWidgetAnnotation';\n\n    let element = null;\n    if (this.renderInteractiveForms) {\n      // NOTE: We cannot set the values using `element.value` below, since it\n      //       prevents the AnnotationLayer rasterizer in `test/driver.js`\n      //       from parsing the elements correctly for the reference tests.\n      if (this.data.multiLine) {\n        element = document.createElement('textarea');\n        element.textContent = this.data.fieldValue;\n      } else {\n        element = document.createElement('input');\n        element.type = 'text';\n        element.setAttribute('value', this.data.fieldValue);\n      }\n\n      element.disabled = this.data.readOnly;\n\n      if (this.data.maxLen !== null) {\n        element.maxLength = this.data.maxLen;\n      }\n\n      if (this.data.comb) {\n        let fieldWidth = this.data.rect[2] - this.data.rect[0];\n        let combWidth = fieldWidth / this.data.maxLen;\n\n        element.classList.add('comb');\n        element.style.letterSpacing = 'calc(' + combWidth + 'px - 1ch)';\n      }\n    } else {\n      element = document.createElement('div');\n      element.textContent = this.data.fieldValue;\n      element.style.verticalAlign = 'middle';\n      element.style.display = 'table-cell';\n\n      let font = null;\n      if (this.data.fontRefName) {\n        font = this.page.commonObjs.getData(this.data.fontRefName);\n      }\n      this._setTextStyle(element, font);\n    }\n\n    if (this.data.textAlignment !== null) {\n      element.style.textAlign = TEXT_ALIGNMENT[this.data.textAlignment];\n    }\n\n    this.container.appendChild(element);\n    return this.container;\n  }\n\n  /**\n   * Apply text styles to the text in the element.\n   *\n   * @private\n   * @param {HTMLDivElement} element\n   * @param {Object} font\n   * @memberof TextWidgetAnnotationElement\n   */\n  _setTextStyle(element, font) {\n    // TODO: This duplicates some of the logic in CanvasGraphics.setFont().\n    let style = element.style;\n    style.fontSize = this.data.fontSize + 'px';\n    style.direction = (this.data.fontDirection < 0 ? 'rtl' : 'ltr');\n\n    if (!font) {\n      return;\n    }\n\n    style.fontWeight = (font.black ?\n      (font.bold ? '900' : 'bold') :\n      (font.bold ? 'bold' : 'normal'));\n    style.fontStyle = (font.italic ? 'italic' : 'normal');\n\n    // Use a reasonable default font if the font doesn't specify a fallback.\n    let fontFamily = font.loadedName ? '\"' + font.loadedName + '\", ' : '';\n    let fallbackName = font.fallbackName || 'Helvetica, sans-serif';\n    style.fontFamily = fontFamily + fallbackName;\n  }\n}\n\nclass CheckboxWidgetAnnotationElement extends WidgetAnnotationElement {\n  constructor(parameters) {\n    super(parameters, parameters.renderInteractiveForms);\n  }\n\n  /**\n   * Render the checkbox widget annotation's HTML element\n   * in the empty container.\n   *\n   * @public\n   * @memberof CheckboxWidgetAnnotationElement\n   * @returns {HTMLSectionElement}\n   */\n  render() {\n    this.container.className = 'buttonWidgetAnnotation checkBox';\n\n    let element = document.createElement('input');\n    element.disabled = this.data.readOnly;\n    element.type = 'checkbox';\n    if (this.data.fieldValue && this.data.fieldValue !== 'Off') {\n      element.setAttribute('checked', true);\n    }\n\n    this.container.appendChild(element);\n    return this.container;\n  }\n}\n\nclass RadioButtonWidgetAnnotationElement extends WidgetAnnotationElement {\n  constructor(parameters) {\n    super(parameters, parameters.renderInteractiveForms);\n  }\n\n  /**\n   * Render the radio button widget annotation's HTML element\n   * in the empty container.\n   *\n   * @public\n   * @memberof RadioButtonWidgetAnnotationElement\n   * @returns {HTMLSectionElement}\n   */\n  render() {\n    this.container.className = 'buttonWidgetAnnotation radioButton';\n\n    let element = document.createElement('input');\n    element.disabled = this.data.readOnly;\n    element.type = 'radio';\n    element.name = this.data.fieldName;\n    if (this.data.fieldValue === this.data.buttonValue) {\n      element.setAttribute('checked', true);\n    }\n\n    this.container.appendChild(element);\n    return this.container;\n  }\n}\n\nclass PushButtonWidgetAnnotationElement extends LinkAnnotationElement {\n  /**\n   * Render the push button widget annotation's HTML element\n   * in the empty container.\n   *\n   * @public\n   * @memberof PushButtonWidgetAnnotationElement\n   * @returns {HTMLSectionElement}\n   */\n  render() {\n    // The rendering and functionality of a push button widget annotation is\n    // equal to that of a link annotation, but may have more functionality, such\n    // as performing actions on form fields (resetting, submitting, et cetera).\n    let container = super.render();\n    container.className = 'buttonWidgetAnnotation pushButton';\n    return container;\n  }\n}\n\nclass ChoiceWidgetAnnotationElement extends WidgetAnnotationElement {\n  constructor(parameters) {\n    super(parameters, parameters.renderInteractiveForms);\n  }\n\n  /**\n   * Render the choice widget annotation's HTML element in the empty\n   * container.\n   *\n   * @public\n   * @memberof ChoiceWidgetAnnotationElement\n   * @returns {HTMLSectionElement}\n   */\n  render() {\n    this.container.className = 'choiceWidgetAnnotation';\n\n    let selectElement = document.createElement('select');\n    selectElement.disabled = this.data.readOnly;\n\n    if (!this.data.combo) {\n      // List boxes have a size and (optionally) multiple selection.\n      selectElement.size = this.data.options.length;\n\n      if (this.data.multiSelect) {\n        selectElement.multiple = true;\n      }\n    }\n\n    // Insert the options into the choice field.\n    for (let i = 0, ii = this.data.options.length; i < ii; i++) {\n      let option = this.data.options[i];\n\n      let optionElement = document.createElement('option');\n      optionElement.textContent = option.displayValue;\n      optionElement.value = option.exportValue;\n\n      if (this.data.fieldValue.includes(option.displayValue)) {\n        optionElement.setAttribute('selected', true);\n      }\n\n      selectElement.appendChild(optionElement);\n    }\n\n    this.container.appendChild(selectElement);\n    return this.container;\n  }\n}\n\nclass PopupAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    let isRenderable = !!(parameters.data.title || parameters.data.contents);\n    super(parameters, isRenderable);\n  }\n\n  /**\n   * Render the popup annotation's HTML element in the empty container.\n   *\n   * @public\n   * @memberof PopupAnnotationElement\n   * @returns {HTMLSectionElement}\n   */\n  render() {\n    // Do not render popup annotations for parent elements with these types as\n    // they create the popups themselves (because of custom trigger divs).\n    const IGNORE_TYPES = [\n      'Line',\n      'Square',\n      'Circle',\n      'PolyLine',\n      'Polygon',\n      'Ink',\n    ];\n\n    this.container.className = 'popupAnnotation';\n\n    if (IGNORE_TYPES.includes(this.data.parentType)) {\n      return this.container;\n    }\n\n    let selector = '[data-annotation-id=\"' + this.data.parentId + '\"]';\n    let parentElement = this.layer.querySelector(selector);\n    if (!parentElement) {\n      return this.container;\n    }\n\n    let popup = new PopupElement({\n      container: this.container,\n      trigger: parentElement,\n      color: this.data.color,\n      title: this.data.title,\n      contents: this.data.contents,\n    });\n\n    // Position the popup next to the parent annotation's container.\n    // PDF viewers ignore a popup annotation's rectangle.\n    let parentLeft = parseFloat(parentElement.style.left);\n    let parentWidth = parseFloat(parentElement.style.width);\n    this.container.style.transformOrigin =\n      -(parentLeft + parentWidth) + 'px -' + parentElement.style.top;\n    this.container.style.left = (parentLeft + parentWidth) + 'px';\n\n    this.container.appendChild(popup.render());\n    return this.container;\n  }\n}\n\nclass PopupElement {\n  constructor(parameters) {\n    this.container = parameters.container;\n    this.trigger = parameters.trigger;\n    this.color = parameters.color;\n    this.title = parameters.title;\n    this.contents = parameters.contents;\n    this.hideWrapper = parameters.hideWrapper || false;\n\n    this.pinned = false;\n  }\n\n  /**\n   * Render the popup's HTML element.\n   *\n   * @public\n   * @memberof PopupElement\n   * @returns {HTMLSectionElement}\n   */\n  render() {\n    const BACKGROUND_ENLIGHT = 0.7;\n\n    let wrapper = document.createElement('div');\n    wrapper.className = 'popupWrapper';\n\n    // For Popup annotations we hide the entire section because it contains\n    // only the popup. However, for Text annotations without a separate Popup\n    // annotation, we cannot hide the entire container as the image would\n    // disappear too. In that special case, hiding the wrapper suffices.\n    this.hideElement = (this.hideWrapper ? wrapper : this.container);\n    this.hideElement.setAttribute('hidden', true);\n\n    let popup = document.createElement('div');\n    popup.className = 'popup';\n\n    let color = this.color;\n    if (color) {\n      // Enlighten the color.\n      let r = BACKGROUND_ENLIGHT * (255 - color[0]) + color[0];\n      let g = BACKGROUND_ENLIGHT * (255 - color[1]) + color[1];\n      let b = BACKGROUND_ENLIGHT * (255 - color[2]) + color[2];\n      popup.style.backgroundColor = Util.makeCssRgb(r | 0, g | 0, b | 0);\n    }\n\n    let contents = this._formatContents(this.contents);\n    let title = document.createElement('h1');\n    title.textContent = this.title;\n\n    // Attach the event listeners to the trigger element.\n    this.trigger.addEventListener('click', this._toggle.bind(this));\n    this.trigger.addEventListener('mouseover', this._show.bind(this, false));\n    this.trigger.addEventListener('mouseout', this._hide.bind(this, false));\n    popup.addEventListener('click', this._hide.bind(this, true));\n\n    popup.appendChild(title);\n    popup.appendChild(contents);\n    wrapper.appendChild(popup);\n    return wrapper;\n  }\n\n  /**\n   * Format the contents of the popup by adding newlines where necessary.\n   *\n   * @private\n   * @param {string} contents\n   * @memberof PopupElement\n   * @returns {HTMLParagraphElement}\n   */\n  _formatContents(contents) {\n    let p = document.createElement('p');\n    let lines = contents.split(/(?:\\r\\n?|\\n)/);\n    for (let i = 0, ii = lines.length; i < ii; ++i) {\n      let line = lines[i];\n      p.appendChild(document.createTextNode(line));\n      if (i < (ii - 1)) {\n        p.appendChild(document.createElement('br'));\n      }\n    }\n    return p;\n  }\n\n  /**\n   * Toggle the visibility of the popup.\n   *\n   * @private\n   * @memberof PopupElement\n   */\n  _toggle() {\n    if (this.pinned) {\n      this._hide(true);\n    } else {\n      this._show(true);\n    }\n  }\n\n  /**\n   * Show the popup.\n   *\n   * @private\n   * @param {boolean} pin\n   * @memberof PopupElement\n   */\n  _show(pin = false) {\n    if (pin) {\n      this.pinned = true;\n    }\n    if (this.hideElement.hasAttribute('hidden')) {\n      this.hideElement.removeAttribute('hidden');\n      this.container.style.zIndex += 1;\n    }\n  }\n\n  /**\n   * Hide the popup.\n   *\n   * @private\n   * @param {boolean} unpin\n   * @memberof PopupElement\n   */\n  _hide(unpin = true) {\n    if (unpin) {\n      this.pinned = false;\n    }\n    if (!this.hideElement.hasAttribute('hidden') && !this.pinned) {\n      this.hideElement.setAttribute('hidden', true);\n      this.container.style.zIndex -= 1;\n    }\n  }\n}\n\nclass LineAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    let isRenderable = !!(parameters.data.hasPopup ||\n                          parameters.data.title || parameters.data.contents);\n    super(parameters, isRenderable, /* ignoreBorder = */ true);\n  }\n\n  /**\n   * Render the line annotation's HTML element in the empty container.\n   *\n   * @public\n   * @memberof LineAnnotationElement\n   * @returns {HTMLSectionElement}\n   */\n  render() {\n    this.container.className = 'lineAnnotation';\n\n    // Create an invisible line with the same starting and ending coordinates\n    // that acts as the trigger for the popup. Only the line itself should\n    // trigger the popup, not the entire container.\n    let data = this.data;\n    let width = data.rect[2] - data.rect[0];\n    let height = data.rect[3] - data.rect[1];\n    let svg = this.svgFactory.create(width, height);\n\n    // PDF coordinates are calculated from a bottom left origin, so transform\n    // the line coordinates to a top left origin for the SVG element.\n    let line = this.svgFactory.createElement('svg:line');\n    line.setAttribute('x1', data.rect[2] - data.lineCoordinates[0]);\n    line.setAttribute('y1', data.rect[3] - data.lineCoordinates[1]);\n    line.setAttribute('x2', data.rect[2] - data.lineCoordinates[2]);\n    line.setAttribute('y2', data.rect[3] - data.lineCoordinates[3]);\n    line.setAttribute('stroke-width', data.borderStyle.width);\n    line.setAttribute('stroke', 'transparent');\n\n    svg.appendChild(line);\n    this.container.append(svg);\n\n    // Create the popup ourselves so that we can bind it to the line instead\n    // of to the entire container (which is the default).\n    this._createPopup(this.container, line, data);\n\n    return this.container;\n  }\n}\n\nclass SquareAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    let isRenderable = !!(parameters.data.hasPopup ||\n                          parameters.data.title || parameters.data.contents);\n    super(parameters, isRenderable, /* ignoreBorder = */ true);\n  }\n\n  /**\n   * Render the square annotation's HTML element in the empty container.\n   *\n   * @public\n   * @memberof SquareAnnotationElement\n   * @returns {HTMLSectionElement}\n   */\n  render() {\n    this.container.className = 'squareAnnotation';\n\n    // Create an invisible square with the same rectangle that acts as the\n    // trigger for the popup. Only the square itself should trigger the\n    // popup, not the entire container.\n    let data = this.data;\n    let width = data.rect[2] - data.rect[0];\n    let height = data.rect[3] - data.rect[1];\n    let svg = this.svgFactory.create(width, height);\n\n    // The browser draws half of the borders inside the square and half of\n    // the borders outside the square by default. This behavior cannot be\n    // changed programmatically, so correct for that here.\n    let borderWidth = data.borderStyle.width;\n    let square = this.svgFactory.createElement('svg:rect');\n    square.setAttribute('x', borderWidth / 2);\n    square.setAttribute('y', borderWidth / 2);\n    square.setAttribute('width', width - borderWidth);\n    square.setAttribute('height', height - borderWidth);\n    square.setAttribute('stroke-width', borderWidth);\n    square.setAttribute('stroke', 'transparent');\n    square.setAttribute('fill', 'none');\n\n    svg.appendChild(square);\n    this.container.append(svg);\n\n    // Create the popup ourselves so that we can bind it to the square instead\n    // of to the entire container (which is the default).\n    this._createPopup(this.container, square, data);\n\n    return this.container;\n  }\n}\n\nclass CircleAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    let isRenderable = !!(parameters.data.hasPopup ||\n                          parameters.data.title || parameters.data.contents);\n    super(parameters, isRenderable, /* ignoreBorder = */ true);\n  }\n\n  /**\n   * Render the circle annotation's HTML element in the empty container.\n   *\n   * @public\n   * @memberof CircleAnnotationElement\n   * @returns {HTMLSectionElement}\n   */\n  render() {\n    this.container.className = 'circleAnnotation';\n\n    // Create an invisible circle with the same ellipse that acts as the\n    // trigger for the popup. Only the circle itself should trigger the\n    // popup, not the entire container.\n    let data = this.data;\n    let width = data.rect[2] - data.rect[0];\n    let height = data.rect[3] - data.rect[1];\n    let svg = this.svgFactory.create(width, height);\n\n    // The browser draws half of the borders inside the circle and half of\n    // the borders outside the circle by default. This behavior cannot be\n    // changed programmatically, so correct for that here.\n    let borderWidth = data.borderStyle.width;\n    let circle = this.svgFactory.createElement('svg:ellipse');\n    circle.setAttribute('cx', width / 2);\n    circle.setAttribute('cy', height / 2);\n    circle.setAttribute('rx', (width / 2) - (borderWidth / 2));\n    circle.setAttribute('ry', (height / 2) - (borderWidth / 2));\n    circle.setAttribute('stroke-width', borderWidth);\n    circle.setAttribute('stroke', 'transparent');\n    circle.setAttribute('fill', 'none');\n\n    svg.appendChild(circle);\n    this.container.append(svg);\n\n    // Create the popup ourselves so that we can bind it to the circle instead\n    // of to the entire container (which is the default).\n    this._createPopup(this.container, circle, data);\n\n    return this.container;\n  }\n}\n\nclass PolylineAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    let isRenderable = !!(parameters.data.hasPopup ||\n                          parameters.data.title || parameters.data.contents);\n    super(parameters, isRenderable, /* ignoreBorder = */ true);\n\n    this.containerClassName = 'polylineAnnotation';\n    this.svgElementName = 'svg:polyline';\n  }\n\n  /**\n   * Render the polyline annotation's HTML element in the empty container.\n   *\n   * @public\n   * @memberof PolylineAnnotationElement\n   * @returns {HTMLSectionElement}\n   */\n  render() {\n    this.container.className = this.containerClassName;\n\n    // Create an invisible polyline with the same points that acts as the\n    // trigger for the popup. Only the polyline itself should trigger the\n    // popup, not the entire container.\n    let data = this.data;\n    let width = data.rect[2] - data.rect[0];\n    let height = data.rect[3] - data.rect[1];\n    let svg = this.svgFactory.create(width, height);\n\n    // Convert the vertices array to a single points string that the SVG\n    // polyline element expects (\"x1,y1 x2,y2 ...\"). PDF coordinates are\n    // calculated from a bottom left origin, so transform the polyline\n    // coordinates to a top left origin for the SVG element.\n    let vertices = data.vertices;\n    let points = [];\n    for (let i = 0, ii = vertices.length; i < ii; i++) {\n      let x = vertices[i].x - data.rect[0];\n      let y = data.rect[3] - vertices[i].y;\n      points.push(x + ',' + y);\n    }\n    points = points.join(' ');\n\n    let borderWidth = data.borderStyle.width;\n    let polyline = this.svgFactory.createElement(this.svgElementName);\n    polyline.setAttribute('points', points);\n    polyline.setAttribute('stroke-width', borderWidth);\n    polyline.setAttribute('stroke', 'transparent');\n    polyline.setAttribute('fill', 'none');\n\n    svg.appendChild(polyline);\n    this.container.append(svg);\n\n    // Create the popup ourselves so that we can bind it to the polyline\n    // instead of to the entire container (which is the default).\n    this._createPopup(this.container, polyline, data);\n\n    return this.container;\n  }\n}\n\nclass PolygonAnnotationElement extends PolylineAnnotationElement {\n  constructor(parameters) {\n    // Polygons are specific forms of polylines, so reuse their logic.\n    super(parameters);\n\n    this.containerClassName = 'polygonAnnotation';\n    this.svgElementName = 'svg:polygon';\n  }\n}\n\nclass InkAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    let isRenderable = !!(parameters.data.hasPopup ||\n                          parameters.data.title || parameters.data.contents);\n    super(parameters, isRenderable, /* ignoreBorder = */ true);\n\n    this.containerClassName = 'inkAnnotation';\n\n    // Use the polyline SVG element since it allows us to use coordinates\n    // directly and to draw both straight lines and curves.\n    this.svgElementName = 'svg:polyline';\n  }\n\n  /**\n   * Render the ink annotation's HTML element in the empty container.\n   *\n   * @public\n   * @memberof InkAnnotationElement\n   * @returns {HTMLSectionElement}\n   */\n  render() {\n    this.container.className = this.containerClassName;\n\n    // Create an invisible polyline with the same points that acts as the\n    // trigger for the popup.\n    let data = this.data;\n    let width = data.rect[2] - data.rect[0];\n    let height = data.rect[3] - data.rect[1];\n    let svg = this.svgFactory.create(width, height);\n\n    let inkLists = data.inkLists;\n    for (let i = 0, ii = inkLists.length; i < ii; i++) {\n      let inkList = inkLists[i];\n      let points = [];\n\n      // Convert the ink list to a single points string that the SVG\n      // polyline element expects (\"x1,y1 x2,y2 ...\"). PDF coordinates are\n      // calculated from a bottom left origin, so transform the polyline\n      // coordinates to a top left origin for the SVG element.\n      for (let j = 0, jj = inkList.length; j < jj; j++) {\n        let x = inkList[j].x - data.rect[0];\n        let y = data.rect[3] - inkList[j].y;\n        points.push(x + ',' + y);\n      }\n\n      points = points.join(' ');\n\n      let borderWidth = data.borderStyle.width;\n      let polyline = this.svgFactory.createElement(this.svgElementName);\n      polyline.setAttribute('points', points);\n      polyline.setAttribute('stroke-width', borderWidth);\n      polyline.setAttribute('stroke', 'transparent');\n      polyline.setAttribute('fill', 'none');\n\n      // Create the popup ourselves so that we can bind it to the polyline\n      // instead of to the entire container (which is the default).\n      this._createPopup(this.container, polyline, data);\n\n      svg.appendChild(polyline);\n    }\n\n    this.container.append(svg);\n\n    return this.container;\n  }\n}\n\nclass HighlightAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    let isRenderable = !!(parameters.data.hasPopup ||\n                          parameters.data.title || parameters.data.contents);\n    super(parameters, isRenderable, /* ignoreBorder = */ true);\n  }\n\n  /**\n   * Render the highlight annotation's HTML element in the empty container.\n   *\n   * @public\n   * @memberof HighlightAnnotationElement\n   * @returns {HTMLSectionElement}\n   */\n  render() {\n    this.container.className = 'highlightAnnotation';\n\n    if (!this.data.hasPopup) {\n      this._createPopup(this.container, null, this.data);\n    }\n    return this.container;\n  }\n}\n\nclass UnderlineAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    let isRenderable = !!(parameters.data.hasPopup ||\n                          parameters.data.title || parameters.data.contents);\n    super(parameters, isRenderable, /* ignoreBorder = */ true);\n  }\n\n  /**\n   * Render the underline annotation's HTML element in the empty container.\n   *\n   * @public\n   * @memberof UnderlineAnnotationElement\n   * @returns {HTMLSectionElement}\n   */\n  render() {\n    this.container.className = 'underlineAnnotation';\n\n    if (!this.data.hasPopup) {\n      this._createPopup(this.container, null, this.data);\n    }\n    return this.container;\n  }\n}\n\nclass SquigglyAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    let isRenderable = !!(parameters.data.hasPopup ||\n                          parameters.data.title || parameters.data.contents);\n    super(parameters, isRenderable, /* ignoreBorder = */ true);\n  }\n\n  /**\n   * Render the squiggly annotation's HTML element in the empty container.\n   *\n   * @public\n   * @memberof SquigglyAnnotationElement\n   * @returns {HTMLSectionElement}\n   */\n  render() {\n    this.container.className = 'squigglyAnnotation';\n\n    if (!this.data.hasPopup) {\n      this._createPopup(this.container, null, this.data);\n    }\n    return this.container;\n  }\n}\n\nclass StrikeOutAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    let isRenderable = !!(parameters.data.hasPopup ||\n                          parameters.data.title || parameters.data.contents);\n    super(parameters, isRenderable, /* ignoreBorder = */ true);\n  }\n\n  /**\n   * Render the strikeout annotation's HTML element in the empty container.\n   *\n   * @public\n   * @memberof StrikeOutAnnotationElement\n   * @returns {HTMLSectionElement}\n   */\n  render() {\n    this.container.className = 'strikeoutAnnotation';\n\n    if (!this.data.hasPopup) {\n      this._createPopup(this.container, null, this.data);\n    }\n    return this.container;\n  }\n}\n\nclass StampAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    let isRenderable = !!(parameters.data.hasPopup ||\n                          parameters.data.title || parameters.data.contents);\n    super(parameters, isRenderable, /* ignoreBorder = */ true);\n  }\n\n  /**\n   * Render the stamp annotation's HTML element in the empty container.\n   *\n   * @public\n   * @memberof StampAnnotationElement\n   * @returns {HTMLSectionElement}\n   */\n  render() {\n    this.container.className = 'stampAnnotation';\n\n    if (!this.data.hasPopup) {\n      this._createPopup(this.container, null, this.data);\n    }\n    return this.container;\n  }\n}\n\nclass FileAttachmentAnnotationElement extends AnnotationElement {\n  constructor(parameters) {\n    super(parameters, /* isRenderable = */ true);\n\n    const { filename, content, } = this.data.file;\n    this.filename = getFilenameFromUrl(filename);\n    this.content = content;\n\n    if (this.linkService.eventBus) {\n      this.linkService.eventBus.dispatch('fileattachmentannotation', {\n        source: this,\n        id: stringToPDFString(filename),\n        filename,\n        content,\n      });\n    }\n  }\n\n  /**\n   * Render the file attachment annotation's HTML element in the empty\n   * container.\n   *\n   * @public\n   * @memberof FileAttachmentAnnotationElement\n   * @returns {HTMLSectionElement}\n   */\n  render() {\n    this.container.className = 'fileAttachmentAnnotation';\n\n    let trigger = document.createElement('div');\n    trigger.style.height = this.container.style.height;\n    trigger.style.width = this.container.style.width;\n    trigger.addEventListener('dblclick', this._download.bind(this));\n\n    if (!this.data.hasPopup && (this.data.title || this.data.contents)) {\n      this._createPopup(this.container, trigger, this.data);\n    }\n\n    this.container.appendChild(trigger);\n    return this.container;\n  }\n\n  /**\n   * Download the file attachment associated with this annotation.\n   *\n   * @private\n   * @memberof FileAttachmentAnnotationElement\n   */\n  _download() {\n    if (!this.downloadManager) {\n      warn('Download cannot be started due to unavailable download manager');\n      return;\n    }\n    this.downloadManager.downloadData(this.content, this.filename, '');\n  }\n}\n\n/**\n * @typedef {Object} AnnotationLayerParameters\n * @property {PageViewport} viewport\n * @property {HTMLDivElement} div\n * @property {Array} annotations\n * @property {PDFPage} page\n * @property {IPDFLinkService} linkService\n * @property {DownloadManager} downloadManager\n * @property {string} imageResourcesPath - (optional) Path for image resources,\n *   mainly for annotation icons. Include trailing slash.\n * @property {boolean} renderInteractiveForms\n */\n\nclass AnnotationLayer {\n  /**\n   * Render a new annotation layer with all annotation elements.\n   *\n   * @public\n   * @param {AnnotationLayerParameters} parameters\n   * @memberof AnnotationLayer\n   */\n  static render(parameters) {\n    for (let i = 0, ii = parameters.annotations.length; i < ii; i++) {\n      let data = parameters.annotations[i];\n      if (!data) {\n        continue;\n      }\n      let element = AnnotationElementFactory.create({\n        data,\n        layer: parameters.div,\n        page: parameters.page,\n        viewport: parameters.viewport,\n        linkService: parameters.linkService,\n        downloadManager: parameters.downloadManager,\n        imageResourcesPath: parameters.imageResourcesPath || '',\n        renderInteractiveForms: parameters.renderInteractiveForms || false,\n        svgFactory: new DOMSVGFactory(),\n      });\n      if (element.isRenderable) {\n        parameters.div.appendChild(element.render());\n      }\n    }\n  }\n\n  /**\n   * Update the annotation elements on existing annotation layer.\n   *\n   * @public\n   * @param {AnnotationLayerParameters} parameters\n   * @memberof AnnotationLayer\n   */\n  static update(parameters) {\n    for (let i = 0, ii = parameters.annotations.length; i < ii; i++) {\n      let data = parameters.annotations[i];\n      let element = parameters.div.querySelector(\n        '[data-annotation-id=\"' + data.id + '\"]');\n      if (element) {\n        element.style.transform =\n          'matrix(' + parameters.viewport.transform.join(',') + ')';\n      }\n    }\n    parameters.div.removeAttribute('hidden');\n  }\n}\n\nexport {\n  AnnotationLayer,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* globals __non_webpack_require__ */\n\nimport {\n  createObjectURL, FONT_IDENTITY_MATRIX, IDENTITY_MATRIX, ImageKind, isNum, OPS,\n  TextRenderingMode, Util, warn\n} from '../shared/util';\nimport { DOMSVGFactory } from './dom_utils';\nimport isNodeJS from '../shared/is_node';\n\nvar SVGGraphics = function() {\n  throw new Error('Not implemented: SVGGraphics');\n};\n\nif (typeof PDFJSDev === 'undefined' || PDFJSDev.test('GENERIC')) {\n\nvar SVG_DEFAULTS = {\n  fontStyle: 'normal',\n  fontWeight: 'normal',\n  fillColor: '#000000',\n};\n\nvar convertImgDataToPng = (function convertImgDataToPngClosure() {\n  var PNG_HEADER =\n    new Uint8Array([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);\n\n  var CHUNK_WRAPPER_SIZE = 12;\n\n  var crcTable = new Int32Array(256);\n  for (var i = 0; i < 256; i++) {\n    var c = i;\n    for (var h = 0; h < 8; h++) {\n      if (c & 1) {\n        c = 0xedB88320 ^ ((c >> 1) & 0x7fffffff);\n      } else {\n        c = (c >> 1) & 0x7fffffff;\n      }\n    }\n    crcTable[i] = c;\n  }\n\n  function crc32(data, start, end) {\n    var crc = -1;\n    for (var i = start; i < end; i++) {\n      var a = (crc ^ data[i]) & 0xff;\n      var b = crcTable[a];\n      crc = (crc >>> 8) ^ b;\n    }\n    return crc ^ -1;\n  }\n\n  function writePngChunk(type, body, data, offset) {\n    var p = offset;\n    var len = body.length;\n\n    data[p] = len >> 24 & 0xff;\n    data[p + 1] = len >> 16 & 0xff;\n    data[p + 2] = len >> 8 & 0xff;\n    data[p + 3] = len & 0xff;\n    p += 4;\n\n    data[p] = type.charCodeAt(0) & 0xff;\n    data[p + 1] = type.charCodeAt(1) & 0xff;\n    data[p + 2] = type.charCodeAt(2) & 0xff;\n    data[p + 3] = type.charCodeAt(3) & 0xff;\n    p += 4;\n\n    data.set(body, p);\n    p += body.length;\n\n    var crc = crc32(data, offset + 4, p);\n\n    data[p] = crc >> 24 & 0xff;\n    data[p + 1] = crc >> 16 & 0xff;\n    data[p + 2] = crc >> 8 & 0xff;\n    data[p + 3] = crc & 0xff;\n  }\n\n  function adler32(data, start, end) {\n    var a = 1;\n    var b = 0;\n    for (var i = start; i < end; ++i) {\n      a = (a + (data[i] & 0xff)) % 65521;\n      b = (b + a) % 65521;\n    }\n    return (b << 16) | a;\n  }\n\n  /**\n   * @param {Uint8Array} literals The input data.\n   * @returns {Uint8Array} The DEFLATE-compressed data stream in zlib format.\n   *   This is the required format for compressed streams in the PNG format:\n   *   http://www.libpng.org/pub/png/spec/1.2/PNG-Compression.html\n   */\n  function deflateSync(literals) {\n    if (!isNodeJS()) {\n      // zlib is certainly not available outside of Node.js. We can either use\n      // the pako library for client-side DEFLATE compression, or use the canvas\n      // API of the browser to obtain a more optimal PNG file.\n      return deflateSyncUncompressed(literals);\n    }\n    try {\n      // NOTE: This implementation is far from perfect, but already way better\n      // than not applying any compression.\n      //\n      // A better algorithm will try to choose a good predictor/filter and\n      // then choose a suitable zlib compression strategy (e.g. 3,Z_RLE).\n      //\n      // Node v0.11.12 zlib.deflateSync is introduced (and returns a Buffer).\n      // Node v3.0.0   Buffer inherits from Uint8Array.\n      // Node v8.0.0   zlib.deflateSync accepts Uint8Array as input.\n      var input;\n        // eslint-disable-next-line no-undef\n      if (parseInt(process.versions.node) >= 8) {\n        input = literals;\n      } else {\n        // eslint-disable-next-line no-undef\n        input = new Buffer(literals);\n      }\n      var output = __non_webpack_require__('zlib')\n        .deflateSync(input, { level: 9, });\n      return output instanceof Uint8Array ? output : new Uint8Array(output);\n    } catch (e) {\n      warn('Not compressing PNG because zlib.deflateSync is unavailable: ' + e);\n    }\n\n    return deflateSyncUncompressed(literals);\n  }\n\n  // An implementation of DEFLATE with compression level 0 (Z_NO_COMPRESSION).\n  function deflateSyncUncompressed(literals) {\n    var len = literals.length;\n    var maxBlockLength = 0xFFFF;\n\n    var deflateBlocks = Math.ceil(len / maxBlockLength);\n    var idat = new Uint8Array(2 + len + deflateBlocks * 5 + 4);\n    var pi = 0;\n    idat[pi++] = 0x78; // compression method and flags\n    idat[pi++] = 0x9c; // flags\n\n    var pos = 0;\n    while (len > maxBlockLength) {\n      // writing non-final DEFLATE blocks type 0 and length of 65535\n      idat[pi++] = 0x00;\n      idat[pi++] = 0xff;\n      idat[pi++] = 0xff;\n      idat[pi++] = 0x00;\n      idat[pi++] = 0x00;\n      idat.set(literals.subarray(pos, pos + maxBlockLength), pi);\n      pi += maxBlockLength;\n      pos += maxBlockLength;\n      len -= maxBlockLength;\n    }\n\n    // writing non-final DEFLATE blocks type 0\n    idat[pi++] = 0x01;\n    idat[pi++] = len & 0xff;\n    idat[pi++] = len >> 8 & 0xff;\n    idat[pi++] = (~len & 0xffff) & 0xff;\n    idat[pi++] = (~len & 0xffff) >> 8 & 0xff;\n    idat.set(literals.subarray(pos), pi);\n    pi += literals.length - pos;\n\n    var adler = adler32(literals, 0, literals.length); // checksum\n    idat[pi++] = adler >> 24 & 0xff;\n    idat[pi++] = adler >> 16 & 0xff;\n    idat[pi++] = adler >> 8 & 0xff;\n    idat[pi++] = adler & 0xff;\n    return idat;\n  }\n\n  function encode(imgData, kind, forceDataSchema, isMask) {\n    var width = imgData.width;\n    var height = imgData.height;\n    var bitDepth, colorType, lineSize;\n    var bytes = imgData.data;\n\n    switch (kind) {\n      case ImageKind.GRAYSCALE_1BPP:\n        colorType = 0;\n        bitDepth = 1;\n        lineSize = (width + 7) >> 3;\n        break;\n      case ImageKind.RGB_24BPP:\n        colorType = 2;\n        bitDepth = 8;\n        lineSize = width * 3;\n        break;\n      case ImageKind.RGBA_32BPP:\n        colorType = 6;\n        bitDepth = 8;\n        lineSize = width * 4;\n        break;\n      default:\n        throw new Error('invalid format');\n    }\n\n    // prefix every row with predictor 0\n    var literals = new Uint8Array((1 + lineSize) * height);\n    var offsetLiterals = 0, offsetBytes = 0;\n    var y, i;\n    for (y = 0; y < height; ++y) {\n      literals[offsetLiterals++] = 0; // no prediction\n      literals.set(bytes.subarray(offsetBytes, offsetBytes + lineSize),\n                   offsetLiterals);\n      offsetBytes += lineSize;\n      offsetLiterals += lineSize;\n    }\n\n    if (kind === ImageKind.GRAYSCALE_1BPP && isMask) {\n      // inverting for image masks\n      offsetLiterals = 0;\n      for (y = 0; y < height; y++) {\n        offsetLiterals++; // skipping predictor\n        for (i = 0; i < lineSize; i++) {\n          literals[offsetLiterals++] ^= 0xFF;\n        }\n      }\n    }\n\n    var ihdr = new Uint8Array([\n      width >> 24 & 0xff,\n      width >> 16 & 0xff,\n      width >> 8 & 0xff,\n      width & 0xff,\n      height >> 24 & 0xff,\n      height >> 16 & 0xff,\n      height >> 8 & 0xff,\n      height & 0xff,\n      bitDepth, // bit depth\n      colorType, // color type\n      0x00, // compression method\n      0x00, // filter method\n      0x00 // interlace method\n    ]);\n\n    var idat = deflateSync(literals);\n\n    // PNG will consists: header, IHDR+data, IDAT+data, and IEND.\n    var pngLength = PNG_HEADER.length + (CHUNK_WRAPPER_SIZE * 3) +\n                    ihdr.length + idat.length;\n    var data = new Uint8Array(pngLength);\n    var offset = 0;\n    data.set(PNG_HEADER, offset);\n    offset += PNG_HEADER.length;\n    writePngChunk('IHDR', ihdr, data, offset);\n    offset += CHUNK_WRAPPER_SIZE + ihdr.length;\n    writePngChunk('IDATA', idat, data, offset);\n    offset += CHUNK_WRAPPER_SIZE + idat.length;\n    writePngChunk('IEND', new Uint8Array(0), data, offset);\n\n    return createObjectURL(data, 'image/png', forceDataSchema);\n  }\n\n  return function convertImgDataToPng(imgData, forceDataSchema, isMask) {\n    var kind = (imgData.kind === undefined ?\n                ImageKind.GRAYSCALE_1BPP : imgData.kind);\n    return encode(imgData, kind, forceDataSchema, isMask);\n  };\n})();\n\nvar SVGExtraState = (function SVGExtraStateClosure() {\n  function SVGExtraState() {\n    this.fontSizeScale = 1;\n    this.fontWeight = SVG_DEFAULTS.fontWeight;\n    this.fontSize = 0;\n\n    this.textMatrix = IDENTITY_MATRIX;\n    this.fontMatrix = FONT_IDENTITY_MATRIX;\n    this.leading = 0;\n    this.textRenderingMode = TextRenderingMode.FILL;\n\n    // Current point (in user coordinates)\n    this.x = 0;\n    this.y = 0;\n\n    // Start of text line (in text coordinates)\n    this.lineX = 0;\n    this.lineY = 0;\n\n    // Character and word spacing\n    this.charSpacing = 0;\n    this.wordSpacing = 0;\n    this.textHScale = 1;\n    this.textRise = 0;\n\n    // Default foreground and background colors\n    this.fillColor = SVG_DEFAULTS.fillColor;\n    this.strokeColor = '#000000';\n\n    this.fillAlpha = 1;\n    this.strokeAlpha = 1;\n    this.lineWidth = 1;\n    this.lineJoin = '';\n    this.lineCap = '';\n    this.miterLimit = 0;\n\n    this.dashArray = [];\n    this.dashPhase = 0;\n\n    this.dependencies = [];\n\n    // Clipping\n    this.activeClipUrl = null;\n    this.clipGroup = null;\n\n    this.maskId = '';\n  }\n\n  SVGExtraState.prototype = {\n    clone: function SVGExtraState_clone() {\n      return Object.create(this);\n    },\n    setCurrentPoint: function SVGExtraState_setCurrentPoint(x, y) {\n      this.x = x;\n      this.y = y;\n    },\n  };\n  return SVGExtraState;\n})();\n\nSVGGraphics = (function SVGGraphicsClosure() {\n  function opListToTree(opList) {\n    var opTree = [];\n    var tmp = [];\n    var opListLen = opList.length;\n\n    for (var x = 0; x < opListLen; x++) {\n      if (opList[x].fn === 'save') {\n        opTree.push({ 'fnId': 92, 'fn': 'group', 'items': [], });\n        tmp.push(opTree);\n        opTree = opTree[opTree.length - 1].items;\n        continue;\n      }\n\n      if (opList[x].fn === 'restore') {\n        opTree = tmp.pop();\n      } else {\n        opTree.push(opList[x]);\n      }\n    }\n    return opTree;\n  }\n\n  /**\n   * Formats float number.\n   * @param value {number} number to format.\n   * @returns {string}\n   */\n  function pf(value) {\n    if (Number.isInteger(value)) {\n      return value.toString();\n    }\n    var s = value.toFixed(10);\n    var i = s.length - 1;\n    if (s[i] !== '0') {\n      return s;\n    }\n    // removing trailing zeros\n    do {\n      i--;\n    } while (s[i] === '0');\n    return s.substring(0, s[i] === '.' ? i : i + 1);\n  }\n\n  /**\n   * Formats transform matrix. The standard rotation, scale and translate\n   * matrices are replaced by their shorter forms, and for identity matrix\n   * returns empty string to save the memory.\n   * @param m {Array} matrix to format.\n   * @returns {string}\n   */\n  function pm(m) {\n    if (m[4] === 0 && m[5] === 0) {\n      if (m[1] === 0 && m[2] === 0) {\n        if (m[0] === 1 && m[3] === 1) {\n          return '';\n        }\n        return 'scale(' + pf(m[0]) + ' ' + pf(m[3]) + ')';\n      }\n      if (m[0] === m[3] && m[1] === -m[2]) {\n        var a = Math.acos(m[0]) * 180 / Math.PI;\n        return 'rotate(' + pf(a) + ')';\n      }\n    } else {\n      if (m[0] === 1 && m[1] === 0 && m[2] === 0 && m[3] === 1) {\n        return 'translate(' + pf(m[4]) + ' ' + pf(m[5]) + ')';\n      }\n    }\n    return 'matrix(' + pf(m[0]) + ' ' + pf(m[1]) + ' ' + pf(m[2]) + ' ' +\n      pf(m[3]) + ' ' + pf(m[4]) + ' ' + pf(m[5]) + ')';\n  }\n\n  function SVGGraphics(commonObjs, objs, forceDataSchema) {\n    this.svgFactory = new DOMSVGFactory();\n\n    this.current = new SVGExtraState();\n    this.transformMatrix = IDENTITY_MATRIX; // Graphics state matrix\n    this.transformStack = [];\n    this.extraStack = [];\n    this.commonObjs = commonObjs;\n    this.objs = objs;\n    this.pendingClip = null;\n    this.pendingEOFill = false;\n\n    this.embedFonts = false;\n    this.embeddedFonts = Object.create(null);\n    this.cssStyle = null;\n    this.forceDataSchema = !!forceDataSchema;\n  }\n\n  var XML_NS = 'http://www.w3.org/XML/1998/namespace';\n  var XLINK_NS = 'http://www.w3.org/1999/xlink';\n  var LINE_CAP_STYLES = ['butt', 'round', 'square'];\n  var LINE_JOIN_STYLES = ['miter', 'round', 'bevel'];\n  var clipCount = 0;\n  var maskCount = 0;\n\n  SVGGraphics.prototype = {\n    save: function SVGGraphics_save() {\n      this.transformStack.push(this.transformMatrix);\n      var old = this.current;\n      this.extraStack.push(old);\n      this.current = old.clone();\n    },\n\n    restore: function SVGGraphics_restore() {\n      this.transformMatrix = this.transformStack.pop();\n      this.current = this.extraStack.pop();\n\n      this.pendingClip = null;\n      this.tgrp = null;\n    },\n\n    group: function SVGGraphics_group(items) {\n      this.save();\n      this.executeOpTree(items);\n      this.restore();\n    },\n\n    loadDependencies: function SVGGraphics_loadDependencies(operatorList) {\n      var fnArray = operatorList.fnArray;\n      var fnArrayLen = fnArray.length;\n      var argsArray = operatorList.argsArray;\n\n      for (var i = 0; i < fnArrayLen; i++) {\n        if (OPS.dependency === fnArray[i]) {\n          var deps = argsArray[i];\n          for (var n = 0, nn = deps.length; n < nn; n++) {\n            var obj = deps[n];\n            var common = obj.substring(0, 2) === 'g_';\n            var promise;\n            if (common) {\n              promise = new Promise((resolve) => {\n                this.commonObjs.get(obj, resolve);\n              });\n            } else {\n              promise = new Promise((resolve) => {\n                this.objs.get(obj, resolve);\n              });\n            }\n            this.current.dependencies.push(promise);\n          }\n        }\n      }\n      return Promise.all(this.current.dependencies);\n    },\n\n    transform: function SVGGraphics_transform(a, b, c, d, e, f) {\n      var transformMatrix = [a, b, c, d, e, f];\n      this.transformMatrix = Util.transform(this.transformMatrix,\n                                            transformMatrix);\n      this.tgrp = null;\n    },\n\n    getSVG: function SVGGraphics_getSVG(operatorList, viewport) {\n      this.viewport = viewport;\n\n      var svgElement = this._initialize(viewport);\n      return this.loadDependencies(operatorList).then(() => {\n        this.transformMatrix = IDENTITY_MATRIX;\n        var opTree = this.convertOpList(operatorList);\n        this.executeOpTree(opTree);\n        return svgElement;\n      });\n    },\n\n    convertOpList: function SVGGraphics_convertOpList(operatorList) {\n      var argsArray = operatorList.argsArray;\n      var fnArray = operatorList.fnArray;\n      var fnArrayLen = fnArray.length;\n      var REVOPS = [];\n      var opList = [];\n\n      for (var op in OPS) {\n        REVOPS[OPS[op]] = op;\n      }\n\n      for (var x = 0; x < fnArrayLen; x++) {\n        var fnId = fnArray[x];\n        opList.push({\n          'fnId': fnId,\n          'fn': REVOPS[fnId],\n          'args': argsArray[x],\n        });\n      }\n      return opListToTree(opList);\n    },\n\n    executeOpTree: function SVGGraphics_executeOpTree(opTree) {\n      var opTreeLen = opTree.length;\n      for (var x = 0; x < opTreeLen; x++) {\n        var fn = opTree[x].fn;\n        var fnId = opTree[x].fnId;\n        var args = opTree[x].args;\n\n        switch (fnId | 0) {\n          case OPS.beginText:\n            this.beginText();\n            break;\n          case OPS.dependency:\n            // Handled in loadDependencies, warning should not be thrown\n            break;\n          case OPS.setLeading:\n            this.setLeading(args);\n            break;\n          case OPS.setLeadingMoveText:\n            this.setLeadingMoveText(args[0], args[1]);\n            break;\n          case OPS.setFont:\n            this.setFont(args);\n            break;\n          case OPS.showText:\n            this.showText(args[0]);\n            break;\n          case OPS.showSpacedText:\n            this.showText(args[0]);\n            break;\n          case OPS.endText:\n            this.endText();\n            break;\n          case OPS.moveText:\n            this.moveText(args[0], args[1]);\n            break;\n          case OPS.setCharSpacing:\n            this.setCharSpacing(args[0]);\n            break;\n          case OPS.setWordSpacing:\n            this.setWordSpacing(args[0]);\n            break;\n          case OPS.setHScale:\n            this.setHScale(args[0]);\n            break;\n          case OPS.setTextMatrix:\n            this.setTextMatrix(args[0], args[1], args[2],\n                               args[3], args[4], args[5]);\n            break;\n          case OPS.setTextRise:\n            this.setTextRise(args[0]);\n            break;\n          case OPS.setTextRenderingMode:\n            this.setTextRenderingMode(args[0]);\n            break;\n          case OPS.setLineWidth:\n            this.setLineWidth(args[0]);\n            break;\n          case OPS.setLineJoin:\n            this.setLineJoin(args[0]);\n            break;\n          case OPS.setLineCap:\n            this.setLineCap(args[0]);\n            break;\n          case OPS.setMiterLimit:\n            this.setMiterLimit(args[0]);\n            break;\n          case OPS.setFillRGBColor:\n            this.setFillRGBColor(args[0], args[1], args[2]);\n            break;\n          case OPS.setStrokeRGBColor:\n            this.setStrokeRGBColor(args[0], args[1], args[2]);\n            break;\n          case OPS.setDash:\n            this.setDash(args[0], args[1]);\n            break;\n          case OPS.setGState:\n            this.setGState(args[0]);\n            break;\n          case OPS.fill:\n            this.fill();\n            break;\n          case OPS.eoFill:\n            this.eoFill();\n            break;\n          case OPS.stroke:\n            this.stroke();\n            break;\n          case OPS.fillStroke:\n            this.fillStroke();\n            break;\n          case OPS.eoFillStroke:\n            this.eoFillStroke();\n            break;\n          case OPS.clip:\n            this.clip('nonzero');\n            break;\n          case OPS.eoClip:\n            this.clip('evenodd');\n            break;\n          case OPS.paintSolidColorImageMask:\n            this.paintSolidColorImageMask();\n            break;\n          case OPS.paintJpegXObject:\n            this.paintJpegXObject(args[0], args[1], args[2]);\n            break;\n          case OPS.paintImageXObject:\n            this.paintImageXObject(args[0]);\n            break;\n          case OPS.paintInlineImageXObject:\n            this.paintInlineImageXObject(args[0]);\n            break;\n          case OPS.paintImageMaskXObject:\n            this.paintImageMaskXObject(args[0]);\n            break;\n          case OPS.paintFormXObjectBegin:\n            this.paintFormXObjectBegin(args[0], args[1]);\n            break;\n          case OPS.paintFormXObjectEnd:\n            this.paintFormXObjectEnd();\n            break;\n          case OPS.closePath:\n            this.closePath();\n            break;\n          case OPS.closeStroke:\n            this.closeStroke();\n            break;\n          case OPS.closeFillStroke:\n            this.closeFillStroke();\n            break;\n          case OPS.closeEOFillStroke:\n            this.closeEOFillStroke();\n            break;\n          case OPS.nextLine:\n            this.nextLine();\n            break;\n          case OPS.transform:\n            this.transform(args[0], args[1], args[2], args[3],\n                           args[4], args[5]);\n            break;\n          case OPS.constructPath:\n            this.constructPath(args[0], args[1]);\n            break;\n          case OPS.endPath:\n            this.endPath();\n            break;\n          case 92:\n            this.group(opTree[x].items);\n            break;\n          default:\n            warn('Unimplemented operator ' + fn);\n            break;\n        }\n      }\n    },\n\n    setWordSpacing: function SVGGraphics_setWordSpacing(wordSpacing) {\n      this.current.wordSpacing = wordSpacing;\n    },\n\n    setCharSpacing: function SVGGraphics_setCharSpacing(charSpacing) {\n      this.current.charSpacing = charSpacing;\n    },\n\n    nextLine: function SVGGraphics_nextLine() {\n      this.moveText(0, this.current.leading);\n    },\n\n    setTextMatrix: function SVGGraphics_setTextMatrix(a, b, c, d, e, f) {\n      var current = this.current;\n      this.current.textMatrix = this.current.lineMatrix = [a, b, c, d, e, f];\n\n      this.current.x = this.current.lineX = 0;\n      this.current.y = this.current.lineY = 0;\n\n      current.xcoords = [];\n      current.tspan = this.svgFactory.createElement('svg:tspan');\n      current.tspan.setAttributeNS(null, 'font-family', current.fontFamily);\n      current.tspan.setAttributeNS(null, 'font-size',\n                                   pf(current.fontSize) + 'px');\n      current.tspan.setAttributeNS(null, 'y', pf(-current.y));\n\n      current.txtElement = this.svgFactory.createElement('svg:text');\n      current.txtElement.appendChild(current.tspan);\n    },\n\n    beginText: function SVGGraphics_beginText() {\n      this.current.x = this.current.lineX = 0;\n      this.current.y = this.current.lineY = 0;\n      this.current.textMatrix = IDENTITY_MATRIX;\n      this.current.lineMatrix = IDENTITY_MATRIX;\n      this.current.tspan = this.svgFactory.createElement('svg:tspan');\n      this.current.txtElement = this.svgFactory.createElement('svg:text');\n      this.current.txtgrp = this.svgFactory.createElement('svg:g');\n      this.current.xcoords = [];\n    },\n\n    moveText: function SVGGraphics_moveText(x, y) {\n      var current = this.current;\n      this.current.x = this.current.lineX += x;\n      this.current.y = this.current.lineY += y;\n\n      current.xcoords = [];\n      current.tspan = this.svgFactory.createElement('svg:tspan');\n      current.tspan.setAttributeNS(null, 'font-family', current.fontFamily);\n      current.tspan.setAttributeNS(null, 'font-size',\n                                   pf(current.fontSize) + 'px');\n      current.tspan.setAttributeNS(null, 'y', pf(-current.y));\n    },\n\n    showText: function SVGGraphics_showText(glyphs) {\n      var current = this.current;\n      var font = current.font;\n      var fontSize = current.fontSize;\n\n      if (fontSize === 0) {\n        return;\n      }\n\n      var charSpacing = current.charSpacing;\n      var wordSpacing = current.wordSpacing;\n      var fontDirection = current.fontDirection;\n      var textHScale = current.textHScale * fontDirection;\n      var glyphsLength = glyphs.length;\n      var vertical = font.vertical;\n      var widthAdvanceScale = fontSize * current.fontMatrix[0];\n\n      var x = 0, i;\n      for (i = 0; i < glyphsLength; ++i) {\n        var glyph = glyphs[i];\n        if (glyph === null) {\n          // word break\n          x += fontDirection * wordSpacing;\n          continue;\n        } else if (isNum(glyph)) {\n          x += -glyph * fontSize * 0.001;\n          continue;\n        }\n\n        var width = glyph.width;\n        var character = glyph.fontChar;\n        var spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing;\n        var charWidth = width * widthAdvanceScale + spacing * fontDirection;\n\n        if (!glyph.isInFont && !font.missingFile) {\n          x += charWidth;\n          // TODO: To assist with text selection, we should replace the missing\n          // character with a space character if charWidth is not zero.\n          // But we cannot just do \"character = ' '\", because the ' ' character\n          // might actually map to a different glyph.\n          continue;\n        }\n        current.xcoords.push(current.x + x * textHScale);\n        current.tspan.textContent += character;\n        x += charWidth;\n      }\n      if (vertical) {\n        current.y -= x * textHScale;\n      } else {\n        current.x += x * textHScale;\n      }\n\n      current.tspan.setAttributeNS(null, 'x',\n                                   current.xcoords.map(pf).join(' '));\n      current.tspan.setAttributeNS(null, 'y', pf(-current.y));\n      current.tspan.setAttributeNS(null, 'font-family', current.fontFamily);\n      current.tspan.setAttributeNS(null, 'font-size',\n                                   pf(current.fontSize) + 'px');\n      if (current.fontStyle !== SVG_DEFAULTS.fontStyle) {\n        current.tspan.setAttributeNS(null, 'font-style', current.fontStyle);\n      }\n      if (current.fontWeight !== SVG_DEFAULTS.fontWeight) {\n        current.tspan.setAttributeNS(null, 'font-weight', current.fontWeight);\n      }\n\n      const fillStrokeMode = current.textRenderingMode &\n        TextRenderingMode.FILL_STROKE_MASK;\n\n      if (fillStrokeMode === TextRenderingMode.FILL ||\n          fillStrokeMode === TextRenderingMode.FILL_STROKE) {\n        if (current.fillColor !== SVG_DEFAULTS.fillColor) {\n          current.tspan.setAttributeNS(null, 'fill', current.fillColor);\n        }\n        if (current.fillAlpha < 1) {\n          current.tspan.setAttributeNS(null, 'fill-opacity', current.fillAlpha);\n        }\n      } else if (current.textRenderingMode === TextRenderingMode.ADD_TO_PATH) {\n        // Workaround for Firefox: We must set fill=\"transparent\" because\n        // fill=\"none\" would generate an empty clipping path.\n        current.tspan.setAttributeNS(null, 'fill', 'transparent');\n      } else {\n        current.tspan.setAttributeNS(null, 'fill', 'none');\n      }\n\n      if (fillStrokeMode === TextRenderingMode.STROKE ||\n          fillStrokeMode === TextRenderingMode.FILL_STROKE) {\n        this._setStrokeAttributes(current.tspan);\n      }\n\n      // Include the text rise in the text matrix since the `pm` function\n      // creates the SVG element's `translate` entry (work on a copy to avoid\n      // altering the original text matrix).\n      let textMatrix = current.textMatrix;\n      if (current.textRise !== 0) {\n        textMatrix = textMatrix.slice();\n        textMatrix[5] += current.textRise;\n      }\n\n      current.txtElement.setAttributeNS(null, 'transform',\n                                        pm(textMatrix) + ' scale(1, -1)');\n      current.txtElement.setAttributeNS(XML_NS, 'xml:space', 'preserve');\n      current.txtElement.appendChild(current.tspan);\n      current.txtgrp.appendChild(current.txtElement);\n\n      this._ensureTransformGroup().appendChild(current.txtElement);\n    },\n\n    setLeadingMoveText: function SVGGraphics_setLeadingMoveText(x, y) {\n      this.setLeading(-y);\n      this.moveText(x, y);\n    },\n\n    addFontStyle: function SVGGraphics_addFontStyle(fontObj) {\n      if (!this.cssStyle) {\n        this.cssStyle = this.svgFactory.createElement('svg:style');\n        this.cssStyle.setAttributeNS(null, 'type', 'text/css');\n        this.defs.appendChild(this.cssStyle);\n      }\n\n      var url = createObjectURL(fontObj.data, fontObj.mimetype,\n                                this.forceDataSchema);\n      this.cssStyle.textContent +=\n        '@font-face { font-family: \"' + fontObj.loadedName + '\";' +\n        ' src: url(' + url + '); }\\n';\n    },\n\n    setFont: function SVGGraphics_setFont(details) {\n      var current = this.current;\n      var fontObj = this.commonObjs.get(details[0]);\n      var size = details[1];\n      this.current.font = fontObj;\n\n      if (this.embedFonts && fontObj.data &&\n          !this.embeddedFonts[fontObj.loadedName]) {\n        this.addFontStyle(fontObj);\n        this.embeddedFonts[fontObj.loadedName] = fontObj;\n      }\n\n      current.fontMatrix = (fontObj.fontMatrix ?\n                            fontObj.fontMatrix : FONT_IDENTITY_MATRIX);\n\n      var bold = fontObj.black ? (fontObj.bold ? 'bolder' : 'bold') :\n                                 (fontObj.bold ? 'bold' : 'normal');\n      var italic = fontObj.italic ? 'italic' : 'normal';\n\n      if (size < 0) {\n        size = -size;\n        current.fontDirection = -1;\n      } else {\n        current.fontDirection = 1;\n      }\n      current.fontSize = size;\n      current.fontFamily = fontObj.loadedName;\n      current.fontWeight = bold;\n      current.fontStyle = italic;\n\n      current.tspan = this.svgFactory.createElement('svg:tspan');\n      current.tspan.setAttributeNS(null, 'y', pf(-current.y));\n      current.xcoords = [];\n    },\n\n    endText() {\n      const current = this.current;\n      if ((current.textRenderingMode & TextRenderingMode.ADD_TO_PATH_FLAG) &&\n          current.txtElement && current.txtElement.hasChildNodes()) {\n        // If no glyphs are shown (i.e. no child nodes), no clipping occurs.\n        current.element = current.txtElement;\n        this.clip('nonzero');\n        this.endPath();\n      }\n    },\n\n    // Path properties\n    setLineWidth: function SVGGraphics_setLineWidth(width) {\n      this.current.lineWidth = width;\n    },\n    setLineCap: function SVGGraphics_setLineCap(style) {\n      this.current.lineCap = LINE_CAP_STYLES[style];\n    },\n    setLineJoin: function SVGGraphics_setLineJoin(style) {\n      this.current.lineJoin = LINE_JOIN_STYLES[style];\n    },\n    setMiterLimit: function SVGGraphics_setMiterLimit(limit) {\n      this.current.miterLimit = limit;\n    },\n    setStrokeAlpha: function SVGGraphics_setStrokeAlpha(strokeAlpha) {\n      this.current.strokeAlpha = strokeAlpha;\n    },\n    setStrokeRGBColor: function SVGGraphics_setStrokeRGBColor(r, g, b) {\n      var color = Util.makeCssRgb(r, g, b);\n      this.current.strokeColor = color;\n    },\n    setFillAlpha: function SVGGraphics_setFillAlpha(fillAlpha) {\n      this.current.fillAlpha = fillAlpha;\n    },\n    setFillRGBColor: function SVGGraphics_setFillRGBColor(r, g, b) {\n      var color = Util.makeCssRgb(r, g, b);\n      this.current.fillColor = color;\n      this.current.tspan = this.svgFactory.createElement('svg:tspan');\n      this.current.xcoords = [];\n    },\n    setDash: function SVGGraphics_setDash(dashArray, dashPhase) {\n      this.current.dashArray = dashArray;\n      this.current.dashPhase = dashPhase;\n    },\n\n    constructPath: function SVGGraphics_constructPath(ops, args) {\n      var current = this.current;\n      var x = current.x, y = current.y;\n      current.path = this.svgFactory.createElement('svg:path');\n      var d = [];\n      var opLength = ops.length;\n\n      for (var i = 0, j = 0; i < opLength; i++) {\n        switch (ops[i] | 0) {\n          case OPS.rectangle:\n            x = args[j++];\n            y = args[j++];\n            var width = args[j++];\n            var height = args[j++];\n            var xw = x + width;\n            var yh = y + height;\n            d.push('M', pf(x), pf(y), 'L', pf(xw), pf(y), 'L', pf(xw), pf(yh),\n                   'L', pf(x), pf(yh), 'Z');\n            break;\n          case OPS.moveTo:\n            x = args[j++];\n            y = args[j++];\n            d.push('M', pf(x), pf(y));\n            break;\n          case OPS.lineTo:\n            x = args[j++];\n            y = args[j++];\n            d.push('L', pf(x), pf(y));\n            break;\n          case OPS.curveTo:\n            x = args[j + 4];\n            y = args[j + 5];\n            d.push('C', pf(args[j]), pf(args[j + 1]), pf(args[j + 2]),\n                   pf(args[j + 3]), pf(x), pf(y));\n            j += 6;\n            break;\n          case OPS.curveTo2:\n            x = args[j + 2];\n            y = args[j + 3];\n            d.push('C', pf(x), pf(y), pf(args[j]), pf(args[j + 1]),\n                   pf(args[j + 2]), pf(args[j + 3]));\n            j += 4;\n            break;\n          case OPS.curveTo3:\n            x = args[j + 2];\n            y = args[j + 3];\n            d.push('C', pf(args[j]), pf(args[j + 1]), pf(x), pf(y),\n                   pf(x), pf(y));\n            j += 4;\n            break;\n          case OPS.closePath:\n            d.push('Z');\n            break;\n        }\n      }\n      current.path.setAttributeNS(null, 'd', d.join(' '));\n      current.path.setAttributeNS(null, 'fill', 'none');\n\n      this._ensureTransformGroup().appendChild(current.path);\n\n      // Saving a reference in current.element so that it can be addressed\n      // in 'fill' and 'stroke'\n      current.element = current.path;\n      current.setCurrentPoint(x, y);\n    },\n\n    endPath: function SVGGraphics_endPath() {\n      if (!this.pendingClip) {\n        return;\n      }\n      var current = this.current;\n      // Add current path to clipping path\n      var clipId = 'clippath' + clipCount;\n      clipCount++;\n      var clipPath = this.svgFactory.createElement('svg:clipPath');\n      clipPath.setAttributeNS(null, 'id', clipId);\n      clipPath.setAttributeNS(null, 'transform', pm(this.transformMatrix));\n      // A deep clone is needed when text is used as a clipping path.\n      const clipElement = current.element.cloneNode(true);\n      if (this.pendingClip === 'evenodd') {\n        clipElement.setAttributeNS(null, 'clip-rule', 'evenodd');\n      } else {\n        clipElement.setAttributeNS(null, 'clip-rule', 'nonzero');\n      }\n      this.pendingClip = null;\n      clipPath.appendChild(clipElement);\n      this.defs.appendChild(clipPath);\n\n      if (current.activeClipUrl) {\n        // The previous clipping group content can go out of order -- resetting\n        // cached clipGroups.\n        current.clipGroup = null;\n        this.extraStack.forEach(function (prev) {\n          prev.clipGroup = null;\n        });\n        // Intersect with the previous clipping path.\n        clipPath.setAttributeNS(null, 'clip-path', current.activeClipUrl);\n      }\n      current.activeClipUrl = 'url(#' + clipId + ')';\n\n      this.tgrp = null;\n    },\n\n    clip: function SVGGraphics_clip(type) {\n      this.pendingClip = type;\n    },\n\n    closePath: function SVGGraphics_closePath() {\n      var current = this.current;\n      if (current.path) {\n        var d = current.path.getAttributeNS(null, 'd');\n        d += 'Z';\n        current.path.setAttributeNS(null, 'd', d);\n      }\n    },\n\n    setLeading: function SVGGraphics_setLeading(leading) {\n      this.current.leading = -leading;\n    },\n\n    setTextRise: function SVGGraphics_setTextRise(textRise) {\n      this.current.textRise = textRise;\n    },\n\n    setTextRenderingMode(textRenderingMode) {\n      this.current.textRenderingMode = textRenderingMode;\n    },\n\n    setHScale: function SVGGraphics_setHScale(scale) {\n      this.current.textHScale = scale / 100;\n    },\n\n    setGState: function SVGGraphics_setGState(states) {\n      for (var i = 0, ii = states.length; i < ii; i++) {\n        var state = states[i];\n        var key = state[0];\n        var value = state[1];\n\n        switch (key) {\n          case 'LW':\n            this.setLineWidth(value);\n            break;\n          case 'LC':\n            this.setLineCap(value);\n            break;\n          case 'LJ':\n            this.setLineJoin(value);\n            break;\n          case 'ML':\n            this.setMiterLimit(value);\n            break;\n          case 'D':\n            this.setDash(value[0], value[1]);\n            break;\n          case 'Font':\n            this.setFont(value);\n            break;\n          case 'CA':\n            this.setStrokeAlpha(value);\n            break;\n          case 'ca':\n            this.setFillAlpha(value);\n            break;\n          default:\n            warn('Unimplemented graphic state ' + key);\n            break;\n        }\n      }\n    },\n\n    fill: function SVGGraphics_fill() {\n      var current = this.current;\n      if (current.element) {\n        current.element.setAttributeNS(null, 'fill', current.fillColor);\n        current.element.setAttributeNS(null, 'fill-opacity', current.fillAlpha);\n        this.endPath();\n      }\n    },\n\n    stroke: function SVGGraphics_stroke() {\n      var current = this.current;\n\n      if (current.element) {\n        this._setStrokeAttributes(current.element);\n\n        current.element.setAttributeNS(null, 'fill', 'none');\n\n        this.endPath();\n      }\n    },\n\n    /**\n     * @private\n     */\n    _setStrokeAttributes(element) {\n      const current = this.current;\n      element.setAttributeNS(null, 'stroke', current.strokeColor);\n      element.setAttributeNS(null, 'stroke-opacity', current.strokeAlpha);\n      element.setAttributeNS(null, 'stroke-miterlimit',\n                             pf(current.miterLimit));\n      element.setAttributeNS(null, 'stroke-linecap', current.lineCap);\n      element.setAttributeNS(null, 'stroke-linejoin', current.lineJoin);\n      element.setAttributeNS(null, 'stroke-width',\n                             pf(current.lineWidth) + 'px');\n      element.setAttributeNS(null, 'stroke-dasharray',\n                             current.dashArray.map(pf).join(' '));\n      element.setAttributeNS(null, 'stroke-dashoffset',\n                             pf(current.dashPhase) + 'px');\n    },\n\n    eoFill: function SVGGraphics_eoFill() {\n      if (this.current.element) {\n        this.current.element.setAttributeNS(null, 'fill-rule', 'evenodd');\n      }\n      this.fill();\n    },\n\n    fillStroke: function SVGGraphics_fillStroke() {\n      // Order is important since stroke wants fill to be none.\n      // First stroke, then if fill needed, it will be overwritten.\n      this.stroke();\n      this.fill();\n    },\n\n    eoFillStroke: function SVGGraphics_eoFillStroke() {\n      if (this.current.element) {\n        this.current.element.setAttributeNS(null, 'fill-rule', 'evenodd');\n      }\n      this.fillStroke();\n    },\n\n    closeStroke: function SVGGraphics_closeStroke() {\n      this.closePath();\n      this.stroke();\n    },\n\n    closeFillStroke: function SVGGraphics_closeFillStroke() {\n      this.closePath();\n      this.fillStroke();\n    },\n\n    closeEOFillStroke() {\n      this.closePath();\n      this.eoFillStroke();\n    },\n\n    paintSolidColorImageMask:\n        function SVGGraphics_paintSolidColorImageMask() {\n      var current = this.current;\n      var rect = this.svgFactory.createElement('svg:rect');\n      rect.setAttributeNS(null, 'x', '0');\n      rect.setAttributeNS(null, 'y', '0');\n      rect.setAttributeNS(null, 'width', '1px');\n      rect.setAttributeNS(null, 'height', '1px');\n      rect.setAttributeNS(null, 'fill', current.fillColor);\n\n      this._ensureTransformGroup().appendChild(rect);\n    },\n\n    paintJpegXObject: function SVGGraphics_paintJpegXObject(objId, w, h) {\n      var imgObj = this.objs.get(objId);\n      var imgEl = this.svgFactory.createElement('svg:image');\n      imgEl.setAttributeNS(XLINK_NS, 'xlink:href', imgObj.src);\n      imgEl.setAttributeNS(null, 'width', pf(w));\n      imgEl.setAttributeNS(null, 'height', pf(h));\n      imgEl.setAttributeNS(null, 'x', '0');\n      imgEl.setAttributeNS(null, 'y', pf(-h));\n      imgEl.setAttributeNS(null, 'transform',\n                           'scale(' + pf(1 / w) + ' ' + pf(-1 / h) + ')');\n\n      this._ensureTransformGroup().appendChild(imgEl);\n    },\n\n    paintImageXObject: function SVGGraphics_paintImageXObject(objId) {\n      var imgData = this.objs.get(objId);\n      if (!imgData) {\n        warn('Dependent image isn\\'t ready yet');\n        return;\n      }\n      this.paintInlineImageXObject(imgData);\n    },\n\n    paintInlineImageXObject:\n        function SVGGraphics_paintInlineImageXObject(imgData, mask) {\n      var width = imgData.width;\n      var height = imgData.height;\n\n      var imgSrc = convertImgDataToPng(imgData, this.forceDataSchema, !!mask);\n      var cliprect = this.svgFactory.createElement('svg:rect');\n      cliprect.setAttributeNS(null, 'x', '0');\n      cliprect.setAttributeNS(null, 'y', '0');\n      cliprect.setAttributeNS(null, 'width', pf(width));\n      cliprect.setAttributeNS(null, 'height', pf(height));\n      this.current.element = cliprect;\n      this.clip('nonzero');\n      var imgEl = this.svgFactory.createElement('svg:image');\n      imgEl.setAttributeNS(XLINK_NS, 'xlink:href', imgSrc);\n      imgEl.setAttributeNS(null, 'x', '0');\n      imgEl.setAttributeNS(null, 'y', pf(-height));\n      imgEl.setAttributeNS(null, 'width', pf(width) + 'px');\n      imgEl.setAttributeNS(null, 'height', pf(height) + 'px');\n      imgEl.setAttributeNS(null, 'transform',\n                           'scale(' + pf(1 / width) + ' ' +\n                           pf(-1 / height) + ')');\n      if (mask) {\n        mask.appendChild(imgEl);\n      } else {\n        this._ensureTransformGroup().appendChild(imgEl);\n      }\n    },\n\n    paintImageMaskXObject:\n        function SVGGraphics_paintImageMaskXObject(imgData) {\n      var current = this.current;\n      var width = imgData.width;\n      var height = imgData.height;\n      var fillColor = current.fillColor;\n\n      current.maskId = 'mask' + maskCount++;\n      var mask = this.svgFactory.createElement('svg:mask');\n      mask.setAttributeNS(null, 'id', current.maskId);\n\n      var rect = this.svgFactory.createElement('svg:rect');\n      rect.setAttributeNS(null, 'x', '0');\n      rect.setAttributeNS(null, 'y', '0');\n      rect.setAttributeNS(null, 'width', pf(width));\n      rect.setAttributeNS(null, 'height', pf(height));\n      rect.setAttributeNS(null, 'fill', fillColor);\n      rect.setAttributeNS(null, 'mask', 'url(#' + current.maskId + ')');\n      this.defs.appendChild(mask);\n\n      this._ensureTransformGroup().appendChild(rect);\n\n      this.paintInlineImageXObject(imgData, mask);\n    },\n\n    paintFormXObjectBegin:\n        function SVGGraphics_paintFormXObjectBegin(matrix, bbox) {\n      if (Array.isArray(matrix) && matrix.length === 6) {\n        this.transform(matrix[0], matrix[1], matrix[2],\n                       matrix[3], matrix[4], matrix[5]);\n      }\n\n      if (Array.isArray(bbox) && bbox.length === 4) {\n        var width = bbox[2] - bbox[0];\n        var height = bbox[3] - bbox[1];\n\n        var cliprect = this.svgFactory.createElement('svg:rect');\n        cliprect.setAttributeNS(null, 'x', bbox[0]);\n        cliprect.setAttributeNS(null, 'y', bbox[1]);\n        cliprect.setAttributeNS(null, 'width', pf(width));\n        cliprect.setAttributeNS(null, 'height', pf(height));\n        this.current.element = cliprect;\n        this.clip('nonzero');\n        this.endPath();\n      }\n    },\n\n    paintFormXObjectEnd:\n        function SVGGraphics_paintFormXObjectEnd() {},\n\n    /**\n     * @private\n     */\n    _initialize(viewport) {\n      let svg = this.svgFactory.create(viewport.width, viewport.height);\n\n      // Create the definitions element.\n      let definitions = this.svgFactory.createElement('svg:defs');\n      svg.appendChild(definitions);\n      this.defs = definitions;\n\n      // Create the root group element, which acts a container for all other\n      // groups and applies the viewport transform.\n      let rootGroup = this.svgFactory.createElement('svg:g');\n      rootGroup.setAttributeNS(null, 'transform', pm(viewport.transform));\n      svg.appendChild(rootGroup);\n\n      // For the construction of the SVG image we are only interested in the\n      // root group, so we expose it as the entry point of the SVG image for\n      // the other code in this class.\n      this.svg = rootGroup;\n\n      return svg;\n    },\n\n    /**\n     * @private\n     */\n    _ensureClipGroup: function SVGGraphics_ensureClipGroup() {\n      if (!this.current.clipGroup) {\n        var clipGroup = this.svgFactory.createElement('svg:g');\n        clipGroup.setAttributeNS(null, 'clip-path',\n                                 this.current.activeClipUrl);\n        this.svg.appendChild(clipGroup);\n        this.current.clipGroup = clipGroup;\n      }\n      return this.current.clipGroup;\n    },\n\n    /**\n     * @private\n     */\n    _ensureTransformGroup: function SVGGraphics_ensureTransformGroup() {\n      if (!this.tgrp) {\n        this.tgrp = this.svgFactory.createElement('svg:g');\n        this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix));\n        if (this.current.activeClipUrl) {\n          this._ensureClipGroup().appendChild(this.tgrp);\n        } else {\n          this.svg.appendChild(this.tgrp);\n        }\n      }\n      return this.tgrp;\n    },\n  };\n  return SVGGraphics;\n})();\n\n}\n\nexport {\n  SVGGraphics,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* globals __non_webpack_require__ */\n\nlet fs = __non_webpack_require__('fs');\nlet http = __non_webpack_require__('http');\nlet https = __non_webpack_require__('https');\nlet url = __non_webpack_require__('url');\n\nimport {\n  AbortException, assert, createPromiseCapability, MissingPDFException\n} from '../shared/util';\nimport {\n  extractFilenameFromHeader, validateRangeRequestCapabilities\n} from './network_utils';\n\nconst fileUriRegex = /^file:\\/\\/\\/[a-zA-Z]:\\//;\n\nfunction parseUrl(sourceUrl) {\n  let parsedUrl = url.parse(sourceUrl);\n  if (parsedUrl.protocol === 'file:' || parsedUrl.host) {\n    return parsedUrl;\n  }\n  // Prepending 'file:///' to Windows absolute path.\n  if (/^[a-z]:[/\\\\]/i.test(sourceUrl)) {\n    return url.parse(`file:///${sourceUrl}`);\n  }\n  // Changes protocol to 'file:' if url refers to filesystem.\n  if (!parsedUrl.host) {\n    parsedUrl.protocol = 'file:';\n  }\n  return parsedUrl;\n}\n\nclass PDFNodeStream {\n  constructor(source) {\n    this.source = source;\n    this.url = parseUrl(source.url);\n    this.isHttp = this.url.protocol === 'http:' ||\n                  this.url.protocol === 'https:';\n    // Check if url refers to filesystem.\n    this.isFsUrl = this.url.protocol === 'file:';\n    this.httpHeaders = (this.isHttp && source.httpHeaders) || {};\n\n    this._fullRequest = null;\n    this._rangeRequestReaders = [];\n  }\n\n  getFullReader() {\n    assert(!this._fullRequest);\n    this._fullRequest = this.isFsUrl ?\n      new PDFNodeStreamFsFullReader(this) :\n      new PDFNodeStreamFullReader(this);\n    return this._fullRequest;\n  }\n\n  getRangeReader(start, end) {\n    let rangeReader = this.isFsUrl ?\n      new PDFNodeStreamFsRangeReader(this, start, end) :\n      new PDFNodeStreamRangeReader(this, start, end);\n    this._rangeRequestReaders.push(rangeReader);\n    return rangeReader;\n  }\n\n  cancelAllRequests(reason) {\n    if (this._fullRequest) {\n      this._fullRequest.cancel(reason);\n    }\n\n    let readers = this._rangeRequestReaders.slice(0);\n    readers.forEach(function(reader) {\n      reader.cancel(reason);\n    });\n  }\n}\n\nclass BaseFullReader {\n  constructor(stream) {\n    this._url = stream.url;\n    this._done = false;\n    this._storedError = null;\n    this.onProgress = null;\n    let source = stream.source;\n    this._contentLength = source.length; // optional\n    this._loaded = 0;\n    this._filename = null;\n\n    this._disableRange = source.disableRange || false;\n    this._rangeChunkSize = source.rangeChunkSize;\n    if (!this._rangeChunkSize && !this._disableRange) {\n      this._disableRange = true;\n    }\n\n    this._isStreamingSupported = !source.disableStream;\n    this._isRangeSupported = !source.disableRange;\n\n    this._readableStream = null;\n    this._readCapability = createPromiseCapability();\n    this._headersCapability = createPromiseCapability();\n  }\n\n  get headersReady() {\n    return this._headersCapability.promise;\n  }\n\n  get filename() {\n    return this._filename;\n  }\n\n  get contentLength() {\n    return this._contentLength;\n  }\n\n  get isRangeSupported() {\n    return this._isRangeSupported;\n  }\n\n  get isStreamingSupported() {\n    return this._isStreamingSupported;\n  }\n\n  async read() {\n    await this._readCapability.promise;\n    if (this._done) {\n      return { value: undefined, done: true, };\n    }\n    if (this._storedError) {\n      throw this._storedError;\n    }\n\n    let chunk = this._readableStream.read();\n    if (chunk === null) {\n      this._readCapability = createPromiseCapability();\n      return this.read();\n    }\n    this._loaded += chunk.length;\n    if (this.onProgress) {\n      this.onProgress({\n        loaded: this._loaded,\n        total: this._contentLength,\n      });\n    }\n    // Ensure that `read()` method returns ArrayBuffer.\n    let buffer = new Uint8Array(chunk).buffer;\n    return { value: buffer, done: false, };\n  }\n\n  cancel(reason) {\n    // Call `this._error()` method when cancel is called\n    // before _readableStream is set.\n    if (!this._readableStream) {\n      this._error(reason);\n      return;\n    }\n    this._readableStream.destroy(reason);\n  }\n\n  _error(reason) {\n    this._storedError = reason;\n    this._readCapability.resolve();\n  }\n\n  _setReadableStream(readableStream) {\n    this._readableStream = readableStream;\n    readableStream.on('readable', () => {\n      this._readCapability.resolve();\n    });\n\n    readableStream.on('end', () => {\n      // Destroy readable to minimize resource usage.\n      readableStream.destroy();\n      this._done = true;\n      this._readCapability.resolve();\n    });\n\n    readableStream.on('error', (reason) => {\n      this._error(reason);\n    });\n\n    // We need to stop reading when range is supported and streaming is\n    // disabled.\n    if (!this._isStreamingSupported && this._isRangeSupported) {\n      this._error(new AbortException('streaming is disabled'));\n    }\n\n    // Destroy ReadableStream if already in errored state.\n    if (this._storedError) {\n      this._readableStream.destroy(this._storedError);\n    }\n  }\n}\n\nclass BaseRangeReader {\n  constructor(stream) {\n    this._url = stream.url;\n    this._done = false;\n    this._storedError = null;\n    this.onProgress = null;\n    this._loaded = 0;\n    this._readableStream = null;\n    this._readCapability = createPromiseCapability();\n    let source = stream.source;\n    this._isStreamingSupported = !source.disableStream;\n  }\n\n  get isStreamingSupported() {\n    return this._isStreamingSupported;\n  }\n\n  async read() {\n    await this._readCapability.promise;\n    if (this._done) {\n      return { value: undefined, done: true, };\n    }\n    if (this._storedError) {\n      throw this._storedError;\n    }\n\n    let chunk = this._readableStream.read();\n    if (chunk === null) {\n      this._readCapability = createPromiseCapability();\n      return this.read();\n    }\n    this._loaded += chunk.length;\n    if (this.onProgress) {\n      this.onProgress({ loaded: this._loaded, });\n    }\n    // Ensure that `read()` method returns ArrayBuffer.\n    let buffer = new Uint8Array(chunk).buffer;\n    return { value: buffer, done: false, };\n  }\n\n  cancel(reason) {\n    // Call `this._error()` method when cancel is called\n    // before _readableStream is set.\n    if (!this._readableStream) {\n      this._error(reason);\n      return;\n    }\n    this._readableStream.destroy(reason);\n  }\n\n  _error(reason) {\n    this._storedError = reason;\n    this._readCapability.resolve();\n  }\n\n  _setReadableStream(readableStream) {\n    this._readableStream = readableStream;\n    readableStream.on('readable', () => {\n      this._readCapability.resolve();\n    });\n\n    readableStream.on('end', () => {\n      // Destroy readableStream to minimize resource usage.\n      readableStream.destroy();\n      this._done = true;\n      this._readCapability.resolve();\n    });\n\n    readableStream.on('error', (reason) => {\n      this._error(reason);\n    });\n\n    // Destroy readableStream if already in errored state.\n    if (this._storedError) {\n      this._readableStream.destroy(this._storedError);\n    }\n  }\n}\n\nfunction createRequestOptions(url, headers) {\n  return {\n    protocol: url.protocol,\n    auth: url.auth,\n    host: url.hostname,\n    port: url.port,\n    path: url.path,\n    method: 'GET',\n    headers,\n  };\n}\n\nclass PDFNodeStreamFullReader extends BaseFullReader {\n  constructor(stream) {\n    super(stream);\n\n    let handleResponse = (response) => {\n      if (response.statusCode === 404) {\n        const error = new MissingPDFException(`Missing PDF \"${this._url}\".`);\n        this._storedError = error;\n        this._headersCapability.reject(error);\n        return;\n      }\n      this._headersCapability.resolve();\n      this._setReadableStream(response);\n\n      const getResponseHeader = (name) => {\n        // Make sure that headers name are in lower case, as mentioned\n        // here: https://nodejs.org/api/http.html#http_message_headers.\n        return this._readableStream.headers[name.toLowerCase()];\n      };\n      let { allowRangeRequests, suggestedLength, } =\n        validateRangeRequestCapabilities({\n          getResponseHeader,\n          isHttp: stream.isHttp,\n          rangeChunkSize: this._rangeChunkSize,\n          disableRange: this._disableRange,\n        });\n\n      this._isRangeSupported = allowRangeRequests;\n      // Setting right content length.\n      this._contentLength = suggestedLength || this._contentLength;\n\n      this._filename = extractFilenameFromHeader(getResponseHeader);\n    };\n\n    this._request = null;\n    if (this._url.protocol === 'http:') {\n      this._request = http.request(\n        createRequestOptions(this._url, stream.httpHeaders),\n        handleResponse);\n    } else {\n      this._request = https.request(\n        createRequestOptions(this._url, stream.httpHeaders),\n        handleResponse);\n    }\n\n    this._request.on('error', (reason) => {\n      this._storedError = reason;\n      this._headersCapability.reject(reason);\n    });\n    // Note: `request.end(data)` is used to write `data` to request body\n    // and notify end of request. But one should always call `request.end()`\n    // even if there is no data to write -- (to notify the end of request).\n    this._request.end();\n  }\n}\n\nclass PDFNodeStreamRangeReader extends BaseRangeReader {\n  constructor(stream, start, end) {\n    super(stream);\n\n    this._httpHeaders = {};\n    for (let property in stream.httpHeaders) {\n      let value = stream.httpHeaders[property];\n      if (typeof value === 'undefined') {\n        continue;\n      }\n      this._httpHeaders[property] = value;\n    }\n    this._httpHeaders['Range'] = `bytes=${start}-${end - 1}`;\n\n    let handleResponse = (response) => {\n      if (response.statusCode === 404) {\n        const error = new MissingPDFException(`Missing PDF \"${this._url}\".`);\n        this._storedError = error;\n        return;\n      }\n      this._setReadableStream(response);\n    };\n\n    this._request = null;\n    if (this._url.protocol === 'http:') {\n      this._request = http.request(\n        createRequestOptions(this._url, this._httpHeaders),\n        handleResponse);\n    } else {\n      this._request = https.request(\n        createRequestOptions(this._url, this._httpHeaders),\n        handleResponse);\n    }\n\n    this._request.on('error', (reason) => {\n      this._storedError = reason;\n    });\n    this._request.end();\n  }\n}\n\nclass PDFNodeStreamFsFullReader extends BaseFullReader {\n  constructor(stream) {\n    super(stream);\n\n    let path = decodeURIComponent(this._url.path);\n\n    // Remove the extra slash to get right path from url like `file:///C:/`\n    if (fileUriRegex.test(this._url.href)) {\n      path = path.replace(/^\\//, '');\n    }\n\n    fs.lstat(path, (error, stat) => {\n      if (error) {\n        if (error.code === 'ENOENT') {\n          error = new MissingPDFException(`Missing PDF \"${path}\".`);\n        }\n        this._storedError = error;\n        this._headersCapability.reject(error);\n        return;\n      }\n      // Setting right content length.\n      this._contentLength = stat.size;\n\n      this._setReadableStream(fs.createReadStream(path));\n      this._headersCapability.resolve();\n    });\n  }\n}\n\nclass PDFNodeStreamFsRangeReader extends BaseRangeReader {\n  constructor(stream, start, end) {\n    super(stream);\n\n    let path = decodeURIComponent(this._url.path);\n\n    // Remove the extra slash to get right path from url like `file:///C:/`\n    if (fileUriRegex.test(this._url.href)) {\n      path = path.replace(/^\\//, '');\n    }\n\n    this._setReadableStream(\n      fs.createReadStream(path, { start, end: end - 1, }));\n  }\n}\n\nexport {\n  PDFNodeStream,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  assert, MissingPDFException, UnexpectedResponseException\n} from '../shared/util';\nimport {\n  getFilenameFromContentDispositionHeader\n} from './content_disposition';\n\nfunction validateRangeRequestCapabilities({ getResponseHeader, isHttp,\n                                            rangeChunkSize, disableRange, }) {\n  assert(rangeChunkSize > 0, 'Range chunk size must be larger than zero');\n  let returnValues = {\n    allowRangeRequests: false,\n    suggestedLength: undefined,\n  };\n\n  let length = parseInt(getResponseHeader('Content-Length'), 10);\n  if (!Number.isInteger(length)) {\n    return returnValues;\n  }\n\n  returnValues.suggestedLength = length;\n\n  if (length <= 2 * rangeChunkSize) {\n    // The file size is smaller than the size of two chunks, so it does not\n    // make any sense to abort the request and retry with a range request.\n    return returnValues;\n  }\n\n  if (disableRange || !isHttp) {\n    return returnValues;\n  }\n  if (getResponseHeader('Accept-Ranges') !== 'bytes') {\n    return returnValues;\n  }\n\n  let contentEncoding = getResponseHeader('Content-Encoding') || 'identity';\n  if (contentEncoding !== 'identity') {\n    return returnValues;\n  }\n\n  returnValues.allowRangeRequests = true;\n  return returnValues;\n}\n\nfunction extractFilenameFromHeader(getResponseHeader) {\n  const contentDisposition = getResponseHeader('Content-Disposition');\n  if (contentDisposition) {\n    let filename = getFilenameFromContentDispositionHeader(contentDisposition);\n    if (/\\.pdf$/i.test(filename)) {\n      return filename;\n    }\n  }\n  return null;\n}\n\nfunction createResponseStatusError(status, url) {\n  if (status === 404 || status === 0 && /^file:/.test(url)) {\n    return new MissingPDFException('Missing PDF \"' + url + '\".');\n  }\n  return new UnexpectedResponseException(\n    'Unexpected server response (' + status +\n    ') while retrieving PDF \"' + url + '\".', status);\n}\n\nfunction validateResponseStatus(status) {\n  return status === 200 || status === 206;\n}\n\nexport {\n  createResponseStatusError,\n  extractFilenameFromHeader,\n  validateRangeRequestCapabilities,\n  validateResponseStatus,\n};\n","/* Copyright 2017 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// This getFilenameFromContentDispositionHeader function is adapted from\n// https://github.com/Rob--W/open-in-browser/blob/7e2e35a38b8b4e981b11da7b2f01df0149049e92/extension/content-disposition.js\n// with the following changes:\n// - Modified to conform to PDF.js's coding style.\n// - Support UTF-8 decoding when TextDecoder is unsupported.\n// - Replace Array.from with Array + loop for compat with old browsers.\n// - Replace \"startsWith\" with other string method for compat with old browsers.\n// - Move return to the end of the function to prevent Babel from dropping the\n//   function declarations.\n\n/**\n * Extract file name from the Content-Disposition HTTP response header.\n *\n * @param {string} contentDisposition\n * @return {string} Filename, if found in the Content-Disposition header.\n */\nfunction getFilenameFromContentDispositionHeader(contentDisposition) {\n  let needsEncodingFixup = true;\n\n  // filename*=ext-value (\"ext-value\" from RFC 5987, referenced by RFC 6266).\n  let tmp = toParamRegExp('filename\\\\*', 'i').exec(contentDisposition);\n  if (tmp) {\n    tmp = tmp[1];\n    let filename = rfc2616unquote(tmp);\n    filename = unescape(filename);\n    filename = rfc5987decode(filename);\n    filename = rfc2047decode(filename);\n    return fixupEncoding(filename);\n  }\n\n  // Continuations (RFC 2231 section 3, referenced by RFC 5987 section 3.1).\n  // filename*n*=part\n  // filename*n=part\n  tmp = rfc2231getparam(contentDisposition);\n  if (tmp) {\n    // RFC 2047, section\n    let filename = rfc2047decode(tmp);\n    return fixupEncoding(filename);\n  }\n\n  // filename=value (RFC 5987, section 4.1).\n  tmp = toParamRegExp('filename', 'i').exec(contentDisposition);\n  if (tmp) {\n    tmp = tmp[1];\n    let filename = rfc2616unquote(tmp);\n    filename = rfc2047decode(filename);\n    return fixupEncoding(filename);\n  }\n\n  // After this line there are only function declarations. We cannot put\n  // \"return\" here for readability because babel would then drop the function\n  // declarations...\n  function toParamRegExp(attributePattern, flags) {\n    return new RegExp(\n      '(?:^|;)\\\\s*' + attributePattern + '\\\\s*=\\\\s*' +\n      // Captures: value = token | quoted-string\n      // (RFC 2616, section 3.6 and referenced by RFC 6266 4.1)\n      '(' +\n        '[^\";\\\\s][^;\\\\s]*' +\n      '|' +\n        '\"(?:[^\"\\\\\\\\]|\\\\\\\\\"?)+\"?' +\n      ')', flags);\n  }\n  function textdecode(encoding, value) {\n    if (encoding) {\n      if (!/^[\\x00-\\xFF]+$/.test(value)) {\n        return value;\n      }\n      try {\n        let decoder = new TextDecoder(encoding, { fatal: true, });\n        let bytes = new Array(value.length);\n        for (let i = 0; i < value.length; ++i) {\n          bytes[i] = value.charCodeAt(i);\n        }\n        value = decoder.decode(new Uint8Array(bytes));\n        needsEncodingFixup = false;\n      } catch (e) {\n        // TextDecoder constructor threw - unrecognized encoding.\n        // Or TextDecoder API is not available (in IE / Edge).\n        if (/^utf-?8$/i.test(encoding)) {\n          // UTF-8 is commonly used, try to support it in another way:\n          try {\n            value = decodeURIComponent(escape(value));\n            needsEncodingFixup = false;\n          } catch (err) {\n          }\n        }\n      }\n    }\n    return value;\n  }\n  function fixupEncoding(value) {\n    if (needsEncodingFixup && /[\\x80-\\xff]/.test(value)) {\n      // Maybe multi-byte UTF-8.\n      value = textdecode('utf-8', value);\n      if (needsEncodingFixup) {\n        // Try iso-8859-1 encoding.\n        value = textdecode('iso-8859-1', value);\n      }\n    }\n    return value;\n  }\n  function rfc2231getparam(contentDisposition) {\n    let matches = [], match;\n    // Iterate over all filename*n= and filename*n*= with n being an integer\n    // of at least zero. Any non-zero number must not start with '0'.\n    let iter = toParamRegExp('filename\\\\*((?!0\\\\d)\\\\d+)(\\\\*?)', 'ig');\n    while ((match = iter.exec(contentDisposition)) !== null) {\n      let [, n, quot, part] = match;\n      n = parseInt(n, 10);\n      if (n in matches) {\n        // Ignore anything after the invalid second filename*0.\n        if (n === 0) {\n          break;\n        }\n        continue;\n      }\n      matches[n] = [quot, part];\n    }\n    let parts = [];\n    for (let n = 0; n < matches.length; ++n) {\n      if (!(n in matches)) {\n        // Numbers must be consecutive. Truncate when there is a hole.\n        break;\n      }\n      let [quot, part] = matches[n];\n      part = rfc2616unquote(part);\n      if (quot) {\n        part = unescape(part);\n        if (n === 0) {\n          part = rfc5987decode(part);\n        }\n      }\n      parts.push(part);\n    }\n    return parts.join('');\n  }\n  function rfc2616unquote(value) {\n    if (value.charAt(0) === '\"') {\n      let parts = value.slice(1).split('\\\\\"');\n      // Find the first unescaped \" and terminate there.\n      for (let i = 0; i < parts.length; ++i) {\n        let quotindex = parts[i].indexOf('\"');\n        if (quotindex !== -1) {\n          parts[i] = parts[i].slice(0, quotindex);\n          parts.length = i + 1; // Truncates and stop the iteration.\n        }\n        parts[i] = parts[i].replace(/\\\\(.)/g, '$1');\n      }\n      value = parts.join('\"');\n    }\n    return value;\n  }\n  function rfc5987decode(extvalue) {\n    // Decodes \"ext-value\" from RFC 5987.\n    let encodingend = extvalue.indexOf('\\'');\n    if (encodingend === -1) {\n      // Some servers send \"filename*=\" without encoding 'language' prefix,\n      // e.g. in https://github.com/Rob--W/open-in-browser/issues/26\n      // Let's accept the value like Firefox (57) (Chrome 62 rejects it).\n      return extvalue;\n    }\n    let encoding = extvalue.slice(0, encodingend);\n    let langvalue = extvalue.slice(encodingend + 1);\n    // Ignore language (RFC 5987 section 3.2.1, and RFC 6266 section 4.1 ).\n    let value = langvalue.replace(/^[^']*'/, '');\n    return textdecode(encoding, value);\n  }\n  function rfc2047decode(value) {\n    // RFC 2047-decode the result. Firefox tried to drop support for it, but\n    // backed out because some servers use it - https://bugzil.la/875615\n    // Firefox's condition for decoding is here: https://searchfox.org/mozilla-central/rev/4a590a5a15e35d88a3b23dd6ac3c471cf85b04a8/netwerk/mime/nsMIMEHeaderParamImpl.cpp#742-748\n\n    // We are more strict and only recognize RFC 2047-encoding if the value\n    // starts with \"=?\", since then it is likely that the full value is\n    // RFC 2047-encoded.\n\n    // Firefox also decodes words even where RFC 2047 section 5 states:\n    // \"An 'encoded-word' MUST NOT appear within a 'quoted-string'.\"\n    if (value.slice(0, 2) !== '=?' || /[\\x00-\\x19\\x80-\\xff]/.test(value)) {\n      return value;\n    }\n    // RFC 2047, section 2.4\n    // encoded-word = \"=?\" charset \"?\" encoding \"?\" encoded-text \"?=\"\n    // charset = token (but let's restrict to characters that denote a\n    //       possibly valid encoding).\n    // encoding = q or b\n    // encoded-text = any printable ASCII character other than ? or space.\n    //        ... but Firefox permits ? and space.\n    return value.replace(/=\\?([\\w-]*)\\?([QqBb])\\?((?:[^?]|\\?(?!=))*)\\?=/g,\n      function(_, charset, encoding, text) {\n        if (encoding === 'q' || encoding === 'Q') {\n          // RFC 2047 section 4.2.\n          text = text.replace(/_/g, ' ');\n          text = text.replace(/=([0-9a-fA-F]{2})/g, function(_, hex) {\n            return String.fromCharCode(parseInt(hex, 16));\n          });\n          return textdecode(charset, text);\n        } // else encoding is b or B - base64 (RFC 2047 section 4.1)\n        try {\n          text = atob(text);\n        } catch (e) {\n        }\n        return textdecode(charset, text);\n      });\n  }\n\n  return '';\n}\n\nexport {\n  getFilenameFromContentDispositionHeader,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  AbortException, assert, createPromiseCapability\n} from '../shared/util';\nimport {\n  createResponseStatusError, extractFilenameFromHeader,\n  validateRangeRequestCapabilities, validateResponseStatus\n} from './network_utils';\n\nfunction createFetchOptions(headers, withCredentials, abortController) {\n  return {\n    method: 'GET',\n    headers,\n    signal: abortController && abortController.signal,\n    mode: 'cors',\n    credentials: withCredentials ? 'include' : 'same-origin',\n    redirect: 'follow',\n  };\n}\n\nclass PDFFetchStream {\n  constructor(source) {\n    this.source = source;\n    this.isHttp = /^https?:/i.test(source.url);\n    this.httpHeaders = (this.isHttp && source.httpHeaders) || {};\n\n    this._fullRequestReader = null;\n    this._rangeRequestReaders = [];\n  }\n\n  getFullReader() {\n    assert(!this._fullRequestReader);\n    this._fullRequestReader = new PDFFetchStreamReader(this);\n    return this._fullRequestReader;\n  }\n\n  getRangeReader(begin, end) {\n    let reader = new PDFFetchStreamRangeReader(this, begin, end);\n    this._rangeRequestReaders.push(reader);\n    return reader;\n  }\n\n  cancelAllRequests(reason) {\n    if (this._fullRequestReader) {\n      this._fullRequestReader.cancel(reason);\n    }\n    let readers = this._rangeRequestReaders.slice(0);\n    readers.forEach(function(reader) {\n      reader.cancel(reason);\n    });\n  }\n}\n\nclass PDFFetchStreamReader {\n  constructor(stream) {\n    this._stream = stream;\n    this._reader = null;\n    this._loaded = 0;\n    this._filename = null;\n    let source = stream.source;\n    this._withCredentials = source.withCredentials;\n    this._contentLength = source.length;\n    this._headersCapability = createPromiseCapability();\n    this._disableRange = source.disableRange || false;\n    this._rangeChunkSize = source.rangeChunkSize;\n    if (!this._rangeChunkSize && !this._disableRange) {\n      this._disableRange = true;\n    }\n\n    if (typeof AbortController !== 'undefined') {\n      this._abortController = new AbortController();\n    }\n    this._isStreamingSupported = !source.disableStream;\n    this._isRangeSupported = !source.disableRange;\n\n    this._headers = new Headers();\n    for (let property in this._stream.httpHeaders) {\n      let value = this._stream.httpHeaders[property];\n      if (typeof value === 'undefined') {\n        continue;\n      }\n      this._headers.append(property, value);\n    }\n\n    let url = source.url;\n    fetch(url, createFetchOptions(this._headers, this._withCredentials,\n        this._abortController)).then((response) => {\n      if (!validateResponseStatus(response.status)) {\n        throw createResponseStatusError(response.status, url);\n      }\n      this._reader = response.body.getReader();\n      this._headersCapability.resolve();\n\n      const getResponseHeader = (name) => {\n        return response.headers.get(name);\n      };\n      let { allowRangeRequests, suggestedLength, } =\n        validateRangeRequestCapabilities({\n          getResponseHeader,\n          isHttp: this._stream.isHttp,\n          rangeChunkSize: this._rangeChunkSize,\n          disableRange: this._disableRange,\n        });\n\n      this._isRangeSupported = allowRangeRequests;\n      // Setting right content length.\n      this._contentLength = suggestedLength || this._contentLength;\n\n      this._filename = extractFilenameFromHeader(getResponseHeader);\n\n      // We need to stop reading when range is supported and streaming is\n      // disabled.\n      if (!this._isStreamingSupported && this._isRangeSupported) {\n        this.cancel(new AbortException('streaming is disabled'));\n      }\n    }).catch(this._headersCapability.reject);\n\n    this.onProgress = null;\n  }\n\n  get headersReady() {\n    return this._headersCapability.promise;\n  }\n\n  get filename() {\n    return this._filename;\n  }\n\n  get contentLength() {\n    return this._contentLength;\n  }\n\n  get isRangeSupported() {\n    return this._isRangeSupported;\n  }\n\n  get isStreamingSupported() {\n    return this._isStreamingSupported;\n  }\n\n  async read() {\n    await this._headersCapability.promise;\n    const { value, done, } = await this._reader.read();\n    if (done) {\n      return { value, done, };\n    }\n    this._loaded += value.byteLength;\n    if (this.onProgress) {\n      this.onProgress({\n        loaded: this._loaded,\n        total: this._contentLength,\n      });\n    }\n    let buffer = new Uint8Array(value).buffer;\n    return { value: buffer, done: false, };\n  }\n\n  cancel(reason) {\n    if (this._reader) {\n      this._reader.cancel(reason);\n    }\n    if (this._abortController) {\n      this._abortController.abort();\n    }\n  }\n}\n\nclass PDFFetchStreamRangeReader {\n  constructor(stream, begin, end) {\n    this._stream = stream;\n    this._reader = null;\n    this._loaded = 0;\n    let source = stream.source;\n    this._withCredentials = source.withCredentials;\n    this._readCapability = createPromiseCapability();\n    this._isStreamingSupported = !source.disableStream;\n\n    if (typeof AbortController !== 'undefined') {\n      this._abortController = new AbortController();\n    }\n\n    this._headers = new Headers();\n    for (let property in this._stream.httpHeaders) {\n      let value = this._stream.httpHeaders[property];\n      if (typeof value === 'undefined') {\n        continue;\n      }\n      this._headers.append(property, value);\n    }\n\n    let rangeStr = begin + '-' + (end - 1);\n    this._headers.append('Range', 'bytes=' + rangeStr);\n    let url = source.url;\n    fetch(url, createFetchOptions(this._headers, this._withCredentials,\n        this._abortController)).then((response) => {\n      if (!validateResponseStatus(response.status)) {\n        throw createResponseStatusError(response.status, url);\n      }\n      this._readCapability.resolve();\n      this._reader = response.body.getReader();\n    });\n\n    this.onProgress = null;\n  }\n\n  get isStreamingSupported() {\n    return this._isStreamingSupported;\n  }\n\n  async read() {\n    await this._readCapability.promise;\n    const { value, done, } = await this._reader.read();\n    if (done) {\n      return { value, done, };\n    }\n    this._loaded += value.byteLength;\n    if (this.onProgress) {\n      this.onProgress({ loaded: this._loaded, });\n    }\n    let buffer = new Uint8Array(value).buffer;\n    return { value: buffer, done: false, };\n  }\n\n  cancel(reason) {\n    if (this._reader) {\n      this._reader.cancel(reason);\n    }\n    if (this._abortController) {\n      this._abortController.abort();\n    }\n  }\n}\n\nexport {\n  PDFFetchStream,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert, createPromiseCapability, stringToBytes } from '../shared/util';\nimport {\n  createResponseStatusError, extractFilenameFromHeader,\n  validateRangeRequestCapabilities\n} from './network_utils';\nimport globalScope from '../shared/global_scope';\n\nif (typeof PDFJSDev !== 'undefined' && PDFJSDev.test('FIREFOX || MOZCENTRAL')) {\n  throw new Error('Module \"./network\" shall not ' +\n                  'be used with FIREFOX or MOZCENTRAL build.');\n}\n\nvar OK_RESPONSE = 200;\nvar PARTIAL_CONTENT_RESPONSE = 206;\n\nfunction NetworkManager(url, args) {\n  this.url = url;\n  args = args || {};\n  this.isHttp = /^https?:/i.test(url);\n  this.httpHeaders = (this.isHttp && args.httpHeaders) || {};\n  this.withCredentials = args.withCredentials || false;\n  this.getXhr = args.getXhr ||\n    function NetworkManager_getXhr() {\n      return new XMLHttpRequest();\n    };\n\n  this.currXhrId = 0;\n  this.pendingRequests = Object.create(null);\n  this.loadedRequests = Object.create(null);\n}\n\nfunction getArrayBuffer(xhr) {\n  var data = xhr.response;\n  if (typeof data !== 'string') {\n    return data;\n  }\n  let array = stringToBytes(data);\n  return array.buffer;\n}\n\nvar supportsMozChunked =\n  typeof PDFJSDev !== 'undefined' && PDFJSDev.test('CHROME') ? false :\n    (function supportsMozChunkedClosure() {\n  try {\n    var x = new XMLHttpRequest();\n    // Firefox 37- required .open() to be called before setting responseType.\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=707484\n    // Even though the URL is not visited, .open() could fail if the URL is\n    // blocked, e.g. via the connect-src CSP directive or the NoScript addon.\n    // When this error occurs, this feature detection method will mistakenly\n    // report that moz-chunked-arraybuffer is not supported in Firefox 37-.\n    x.open('GET', globalScope.location.href);\n    x.responseType = 'moz-chunked-arraybuffer';\n    return x.responseType === 'moz-chunked-arraybuffer';\n  } catch (e) {\n    return false;\n  }\n})();\n\nNetworkManager.prototype = {\n  requestRange: function NetworkManager_requestRange(begin, end, listeners) {\n    var args = {\n      begin,\n      end,\n    };\n    for (var prop in listeners) {\n      args[prop] = listeners[prop];\n    }\n    return this.request(args);\n  },\n\n  requestFull: function NetworkManager_requestFull(listeners) {\n    return this.request(listeners);\n  },\n\n  request: function NetworkManager_request(args) {\n    var xhr = this.getXhr();\n    var xhrId = this.currXhrId++;\n    var pendingRequest = this.pendingRequests[xhrId] = {\n      xhr,\n    };\n\n    xhr.open('GET', this.url);\n    xhr.withCredentials = this.withCredentials;\n    for (var property in this.httpHeaders) {\n      var value = this.httpHeaders[property];\n      if (typeof value === 'undefined') {\n        continue;\n      }\n      xhr.setRequestHeader(property, value);\n    }\n    if (this.isHttp && 'begin' in args && 'end' in args) {\n      var rangeStr = args.begin + '-' + (args.end - 1);\n      xhr.setRequestHeader('Range', 'bytes=' + rangeStr);\n      pendingRequest.expectedStatus = 206;\n    } else {\n      pendingRequest.expectedStatus = 200;\n    }\n\n    var useMozChunkedLoading = supportsMozChunked && !!args.onProgressiveData;\n    if (useMozChunkedLoading) {\n      xhr.responseType = 'moz-chunked-arraybuffer';\n      pendingRequest.onProgressiveData = args.onProgressiveData;\n      pendingRequest.mozChunked = true;\n    } else {\n      xhr.responseType = 'arraybuffer';\n    }\n\n    if (args.onError) {\n      xhr.onerror = function(evt) {\n        args.onError(xhr.status);\n      };\n    }\n    xhr.onreadystatechange = this.onStateChange.bind(this, xhrId);\n    xhr.onprogress = this.onProgress.bind(this, xhrId);\n\n    pendingRequest.onHeadersReceived = args.onHeadersReceived;\n    pendingRequest.onDone = args.onDone;\n    pendingRequest.onError = args.onError;\n    pendingRequest.onProgress = args.onProgress;\n\n    xhr.send(null);\n\n    return xhrId;\n  },\n\n  onProgress: function NetworkManager_onProgress(xhrId, evt) {\n    var pendingRequest = this.pendingRequests[xhrId];\n    if (!pendingRequest) {\n      // Maybe abortRequest was called...\n      return;\n    }\n\n    if (pendingRequest.mozChunked) {\n      var chunk = getArrayBuffer(pendingRequest.xhr);\n      pendingRequest.onProgressiveData(chunk);\n    }\n\n    var onProgress = pendingRequest.onProgress;\n    if (onProgress) {\n      onProgress(evt);\n    }\n  },\n\n  onStateChange: function NetworkManager_onStateChange(xhrId, evt) {\n    var pendingRequest = this.pendingRequests[xhrId];\n    if (!pendingRequest) {\n      // Maybe abortRequest was called...\n      return;\n    }\n\n    var xhr = pendingRequest.xhr;\n    if (xhr.readyState >= 2 && pendingRequest.onHeadersReceived) {\n      pendingRequest.onHeadersReceived();\n      delete pendingRequest.onHeadersReceived;\n    }\n\n    if (xhr.readyState !== 4) {\n      return;\n    }\n\n    if (!(xhrId in this.pendingRequests)) {\n      // The XHR request might have been aborted in onHeadersReceived()\n      // callback, in which case we should abort request\n      return;\n    }\n\n    delete this.pendingRequests[xhrId];\n\n    // success status == 0 can be on ftp, file and other protocols\n    if (xhr.status === 0 && this.isHttp) {\n      if (pendingRequest.onError) {\n        pendingRequest.onError(xhr.status);\n      }\n      return;\n    }\n    var xhrStatus = xhr.status || OK_RESPONSE;\n\n    // From http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35.2:\n    // \"A server MAY ignore the Range header\". This means it's possible to\n    // get a 200 rather than a 206 response from a range request.\n    var ok_response_on_range_request =\n        xhrStatus === OK_RESPONSE &&\n        pendingRequest.expectedStatus === PARTIAL_CONTENT_RESPONSE;\n\n    if (!ok_response_on_range_request &&\n        xhrStatus !== pendingRequest.expectedStatus) {\n      if (pendingRequest.onError) {\n        pendingRequest.onError(xhr.status);\n      }\n      return;\n    }\n\n    this.loadedRequests[xhrId] = true;\n\n    var chunk = getArrayBuffer(xhr);\n    if (xhrStatus === PARTIAL_CONTENT_RESPONSE) {\n      var rangeHeader = xhr.getResponseHeader('Content-Range');\n      var matches = /bytes (\\d+)-(\\d+)\\/(\\d+)/.exec(rangeHeader);\n      var begin = parseInt(matches[1], 10);\n      pendingRequest.onDone({\n        begin,\n        chunk,\n      });\n    } else if (pendingRequest.onProgressiveData) {\n      pendingRequest.onDone(null);\n    } else if (chunk) {\n      pendingRequest.onDone({\n        begin: 0,\n        chunk,\n      });\n    } else if (pendingRequest.onError) {\n      pendingRequest.onError(xhr.status);\n    }\n  },\n\n  hasPendingRequests: function NetworkManager_hasPendingRequests() {\n    for (var xhrId in this.pendingRequests) {\n      return true;\n    }\n    return false;\n  },\n\n  getRequestXhr: function NetworkManager_getXhr(xhrId) {\n    return this.pendingRequests[xhrId].xhr;\n  },\n\n  isStreamingRequest: function NetworkManager_isStreamingRequest(xhrId) {\n    return !!(this.pendingRequests[xhrId].onProgressiveData);\n  },\n\n  isPendingRequest: function NetworkManager_isPendingRequest(xhrId) {\n    return xhrId in this.pendingRequests;\n  },\n\n  isLoadedRequest: function NetworkManager_isLoadedRequest(xhrId) {\n    return xhrId in this.loadedRequests;\n  },\n\n  abortAllRequests: function NetworkManager_abortAllRequests() {\n    for (var xhrId in this.pendingRequests) {\n      this.abortRequest(xhrId | 0);\n    }\n  },\n\n  abortRequest: function NetworkManager_abortRequest(xhrId) {\n    var xhr = this.pendingRequests[xhrId].xhr;\n    delete this.pendingRequests[xhrId];\n    xhr.abort();\n  },\n};\n\n/** @implements {IPDFStream} */\nfunction PDFNetworkStream(source) {\n  this._source = source;\n  this._manager = new NetworkManager(source.url, {\n    httpHeaders: source.httpHeaders,\n    withCredentials: source.withCredentials,\n  });\n  this._rangeChunkSize = source.rangeChunkSize;\n  this._fullRequestReader = null;\n  this._rangeRequestReaders = [];\n}\n\nPDFNetworkStream.prototype = {\n  _onRangeRequestReaderClosed:\n      function PDFNetworkStream_onRangeRequestReaderClosed(reader) {\n    var i = this._rangeRequestReaders.indexOf(reader);\n    if (i >= 0) {\n      this._rangeRequestReaders.splice(i, 1);\n    }\n  },\n\n  getFullReader: function PDFNetworkStream_getFullReader() {\n    assert(!this._fullRequestReader);\n    this._fullRequestReader =\n      new PDFNetworkStreamFullRequestReader(this._manager, this._source);\n    return this._fullRequestReader;\n  },\n\n  getRangeReader: function PDFNetworkStream_getRangeReader(begin, end) {\n    var reader = new PDFNetworkStreamRangeRequestReader(this._manager,\n                                                        begin, end);\n    reader.onClosed = this._onRangeRequestReaderClosed.bind(this);\n    this._rangeRequestReaders.push(reader);\n    return reader;\n  },\n\n  cancelAllRequests: function PDFNetworkStream_cancelAllRequests(reason) {\n    if (this._fullRequestReader) {\n      this._fullRequestReader.cancel(reason);\n    }\n    var readers = this._rangeRequestReaders.slice(0);\n    readers.forEach(function (reader) {\n      reader.cancel(reason);\n    });\n  },\n};\n\n/** @implements {IPDFStreamReader} */\nfunction PDFNetworkStreamFullRequestReader(manager, source) {\n  this._manager = manager;\n\n  var args = {\n    onHeadersReceived: this._onHeadersReceived.bind(this),\n    onProgressiveData: source.disableStream ? null :\n                       this._onProgressiveData.bind(this),\n    onDone: this._onDone.bind(this),\n    onError: this._onError.bind(this),\n    onProgress: this._onProgress.bind(this),\n  };\n  this._url = source.url;\n  this._fullRequestId = manager.requestFull(args);\n  this._headersReceivedCapability = createPromiseCapability();\n  this._disableRange = source.disableRange || false;\n  this._contentLength = source.length; // optional\n  this._rangeChunkSize = source.rangeChunkSize;\n  if (!this._rangeChunkSize && !this._disableRange) {\n    this._disableRange = true;\n  }\n\n  this._isStreamingSupported = false;\n  this._isRangeSupported = false;\n\n  this._cachedChunks = [];\n  this._requests = [];\n  this._done = false;\n  this._storedError = undefined;\n  this._filename = null;\n\n  this.onProgress = null;\n}\n\nPDFNetworkStreamFullRequestReader.prototype = {\n  _onHeadersReceived:\n      function PDFNetworkStreamFullRequestReader_onHeadersReceived() {\n    var fullRequestXhrId = this._fullRequestId;\n    var fullRequestXhr = this._manager.getRequestXhr(fullRequestXhrId);\n\n    const getResponseHeader = (name) => {\n      return fullRequestXhr.getResponseHeader(name);\n    };\n    let { allowRangeRequests, suggestedLength, } =\n      validateRangeRequestCapabilities({\n        getResponseHeader,\n        isHttp: this._manager.isHttp,\n        rangeChunkSize: this._rangeChunkSize,\n        disableRange: this._disableRange,\n      });\n\n    if (allowRangeRequests) {\n      this._isRangeSupported = true;\n    }\n    // Setting right content length.\n    this._contentLength = suggestedLength || this._contentLength;\n\n    this._filename = extractFilenameFromHeader(getResponseHeader);\n\n    var networkManager = this._manager;\n    if (networkManager.isStreamingRequest(fullRequestXhrId)) {\n      // We can continue fetching when progressive loading is enabled,\n      // and we don't need the autoFetch feature.\n      this._isStreamingSupported = true;\n    } else if (this._isRangeSupported) {\n      // NOTE: by cancelling the full request, and then issuing range\n      // requests, there will be an issue for sites where you can only\n      // request the pdf once. However, if this is the case, then the\n      // server should not be returning that it can support range\n      // requests.\n      networkManager.abortRequest(fullRequestXhrId);\n    }\n\n    this._headersReceivedCapability.resolve();\n  },\n\n  _onProgressiveData:\n      function PDFNetworkStreamFullRequestReader_onProgressiveData(chunk) {\n    if (this._requests.length > 0) {\n      var requestCapability = this._requests.shift();\n      requestCapability.resolve({ value: chunk, done: false, });\n    } else {\n      this._cachedChunks.push(chunk);\n    }\n  },\n\n  _onDone: function PDFNetworkStreamFullRequestReader_onDone(args) {\n    if (args) {\n      this._onProgressiveData(args.chunk);\n    }\n    this._done = true;\n    if (this._cachedChunks.length > 0) {\n      return;\n    }\n    this._requests.forEach(function (requestCapability) {\n      requestCapability.resolve({ value: undefined, done: true, });\n    });\n    this._requests = [];\n  },\n\n  _onError: function PDFNetworkStreamFullRequestReader_onError(status) {\n    var url = this._url;\n    var exception = createResponseStatusError(status, url);\n    this._storedError = exception;\n    this._headersReceivedCapability.reject(exception);\n    this._requests.forEach(function (requestCapability) {\n      requestCapability.reject(exception);\n    });\n    this._requests = [];\n    this._cachedChunks = [];\n  },\n\n  _onProgress: function PDFNetworkStreamFullRequestReader_onProgress(data) {\n    if (this.onProgress) {\n      this.onProgress({\n        loaded: data.loaded,\n        total: data.lengthComputable ? data.total : this._contentLength,\n      });\n    }\n  },\n\n  get filename() {\n    return this._filename;\n  },\n\n  get isRangeSupported() {\n    return this._isRangeSupported;\n  },\n\n  get isStreamingSupported() {\n    return this._isStreamingSupported;\n  },\n\n  get contentLength() {\n    return this._contentLength;\n  },\n\n  get headersReady() {\n    return this._headersReceivedCapability.promise;\n  },\n\n  async read() {\n    if (this._storedError) {\n      throw this._storedError;\n    }\n    if (this._cachedChunks.length > 0) {\n      var chunk = this._cachedChunks.shift();\n      return { value: chunk, done: false, };\n    }\n    if (this._done) {\n      return { value: undefined, done: true, };\n    }\n    var requestCapability = createPromiseCapability();\n    this._requests.push(requestCapability);\n    return requestCapability.promise;\n  },\n\n  cancel: function PDFNetworkStreamFullRequestReader_cancel(reason) {\n    this._done = true;\n    this._headersReceivedCapability.reject(reason);\n    this._requests.forEach(function (requestCapability) {\n      requestCapability.resolve({ value: undefined, done: true, });\n    });\n    this._requests = [];\n    if (this._manager.isPendingRequest(this._fullRequestId)) {\n      this._manager.abortRequest(this._fullRequestId);\n    }\n    this._fullRequestReader = null;\n  },\n};\n\n/** @implements {IPDFStreamRangeReader} */\nfunction PDFNetworkStreamRangeRequestReader(manager, begin, end) {\n  this._manager = manager;\n  var args = {\n    onDone: this._onDone.bind(this),\n    onProgress: this._onProgress.bind(this),\n  };\n  this._requestId = manager.requestRange(begin, end, args);\n  this._requests = [];\n  this._queuedChunk = null;\n  this._done = false;\n\n  this.onProgress = null;\n  this.onClosed = null;\n}\n\nPDFNetworkStreamRangeRequestReader.prototype = {\n  _close: function PDFNetworkStreamRangeRequestReader_close() {\n    if (this.onClosed) {\n      this.onClosed(this);\n    }\n  },\n\n  _onDone: function PDFNetworkStreamRangeRequestReader_onDone(data) {\n    var chunk = data.chunk;\n    if (this._requests.length > 0) {\n      var requestCapability = this._requests.shift();\n      requestCapability.resolve({ value: chunk, done: false, });\n    } else {\n      this._queuedChunk = chunk;\n    }\n    this._done = true;\n    this._requests.forEach(function (requestCapability) {\n      requestCapability.resolve({ value: undefined, done: true, });\n    });\n    this._requests = [];\n    this._close();\n  },\n\n  _onProgress: function PDFNetworkStreamRangeRequestReader_onProgress(evt) {\n    if (!this.isStreamingSupported && this.onProgress) {\n      this.onProgress({\n        loaded: evt.loaded,\n      });\n    }\n  },\n\n  get isStreamingSupported() {\n    return false; // TODO allow progressive range bytes loading\n  },\n\n  async read() {\n    if (this._queuedChunk !== null) {\n      var chunk = this._queuedChunk;\n      this._queuedChunk = null;\n      return { value: chunk, done: false, };\n    }\n    if (this._done) {\n      return { value: undefined, done: true, };\n    }\n    var requestCapability = createPromiseCapability();\n    this._requests.push(requestCapability);\n    return requestCapability.promise;\n  },\n\n  cancel: function PDFNetworkStreamRangeRequestReader_cancel(reason) {\n    this._done = true;\n    this._requests.forEach(function (requestCapability) {\n      requestCapability.resolve({ value: undefined, done: true, });\n    });\n    this._requests = [];\n    if (this._manager.isPendingRequest(this._requestId)) {\n      this._manager.abortRequest(this._requestId);\n    }\n    this._close();\n  },\n};\n\nexport {\n  PDFNetworkStream,\n  NetworkManager,\n};\n"],"sourceRoot":""}
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/build/pdf.worker.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/build/pdf.worker.js
new file mode 100644
index 0000000..2cc7faf
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/build/pdf.worker.js
@@ -0,0 +1,47057 @@
+/**
+ * @licstart The following is the entire license notice for the
+ * Javascript code in this page
+ *
+ * Copyright 2018 Mozilla Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * @licend The above is the entire license notice for the
+ * Javascript code in this page
+ */
+
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define("pdfjs-dist/build/pdf.worker", [], factory);
+	else if(typeof exports === 'object')
+		exports["pdfjs-dist/build/pdf.worker"] = factory();
+	else
+		root["pdfjs-dist/build/pdf.worker"] = root.pdfjsWorker = factory();
+})(this, function() {
+return /******/ (function(modules) { // webpackBootstrap
+/******/ 	// The module cache
+/******/ 	var installedModules = {};
+/******/
+/******/ 	// The require function
+/******/ 	function __w_pdfjs_require__(moduleId) {
+/******/
+/******/ 		// Check if module is in cache
+/******/ 		if(installedModules[moduleId]) {
+/******/ 			return installedModules[moduleId].exports;
+/******/ 		}
+/******/ 		// Create a new module (and put it into the cache)
+/******/ 		var module = installedModules[moduleId] = {
+/******/ 			i: moduleId,
+/******/ 			l: false,
+/******/ 			exports: {}
+/******/ 		};
+/******/
+/******/ 		// Execute the module function
+/******/ 		modules[moduleId].call(module.exports, module, module.exports, __w_pdfjs_require__);
+/******/
+/******/ 		// Flag the module as loaded
+/******/ 		module.l = true;
+/******/
+/******/ 		// Return the exports of the module
+/******/ 		return module.exports;
+/******/ 	}
+/******/
+/******/
+/******/ 	// expose the modules object (__webpack_modules__)
+/******/ 	__w_pdfjs_require__.m = modules;
+/******/
+/******/ 	// expose the module cache
+/******/ 	__w_pdfjs_require__.c = installedModules;
+/******/
+/******/ 	// define getter function for harmony exports
+/******/ 	__w_pdfjs_require__.d = function(exports, name, getter) {
+/******/ 		if(!__w_pdfjs_require__.o(exports, name)) {
+/******/ 			Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ 		}
+/******/ 	};
+/******/
+/******/ 	// define __esModule on exports
+/******/ 	__w_pdfjs_require__.r = function(exports) {
+/******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ 		}
+/******/ 		Object.defineProperty(exports, '__esModule', { value: true });
+/******/ 	};
+/******/
+/******/ 	// create a fake namespace object
+/******/ 	// mode & 1: value is a module id, require it
+/******/ 	// mode & 2: merge all properties of value into the ns
+/******/ 	// mode & 4: return value when already ns object
+/******/ 	// mode & 8|1: behave like require
+/******/ 	__w_pdfjs_require__.t = function(value, mode) {
+/******/ 		if(mode & 1) value = __w_pdfjs_require__(value);
+/******/ 		if(mode & 8) return value;
+/******/ 		if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ 		var ns = Object.create(null);
+/******/ 		__w_pdfjs_require__.r(ns);
+/******/ 		Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ 		if(mode & 2 && typeof value != 'string') for(var key in value) __w_pdfjs_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ 		return ns;
+/******/ 	};
+/******/
+/******/ 	// getDefaultExport function for compatibility with non-harmony modules
+/******/ 	__w_pdfjs_require__.n = function(module) {
+/******/ 		var getter = module && module.__esModule ?
+/******/ 			function getDefault() { return module['default']; } :
+/******/ 			function getModuleExports() { return module; };
+/******/ 		__w_pdfjs_require__.d(getter, 'a', getter);
+/******/ 		return getter;
+/******/ 	};
+/******/
+/******/ 	// Object.prototype.hasOwnProperty.call
+/******/ 	__w_pdfjs_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ 	// __webpack_public_path__
+/******/ 	__w_pdfjs_require__.p = "";
+/******/
+/******/
+/******/ 	// Load entry module and return exports
+/******/ 	return __w_pdfjs_require__(__w_pdfjs_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var pdfjsVersion = '2.0.943';
+var pdfjsBuild = 'dc98bf76';
+var pdfjsCoreWorker = __w_pdfjs_require__(1);
+exports.WorkerMessageHandler = pdfjsCoreWorker.WorkerMessageHandler;
+
+/***/ }),
+/* 1 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.WorkerMessageHandler = exports.WorkerTask = undefined;
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
+
+var _util = __w_pdfjs_require__(2);
+
+var _pdf_manager = __w_pdfjs_require__(130);
+
+var _is_node = __w_pdfjs_require__(5);
+
+var _is_node2 = _interopRequireDefault(_is_node);
+
+var _message_handler = __w_pdfjs_require__(172);
+
+var _primitives = __w_pdfjs_require__(138);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var WorkerTask = function WorkerTaskClosure() {
+  function WorkerTask(name) {
+    this.name = name;
+    this.terminated = false;
+    this._capability = (0, _util.createPromiseCapability)();
+  }
+  WorkerTask.prototype = {
+    get finished() {
+      return this._capability.promise;
+    },
+    finish: function finish() {
+      this._capability.resolve();
+    },
+    terminate: function terminate() {
+      this.terminated = true;
+    },
+    ensureNotTerminated: function ensureNotTerminated() {
+      if (this.terminated) {
+        throw new Error('Worker task was terminated');
+      }
+    }
+  };
+  return WorkerTask;
+}();
+;
+var PDFWorkerStream = function PDFWorkerStreamClosure() {
+  function PDFWorkerStream(msgHandler) {
+    this._msgHandler = msgHandler;
+    this._contentLength = null;
+    this._fullRequestReader = null;
+    this._rangeRequestReaders = [];
+  }
+  PDFWorkerStream.prototype = {
+    getFullReader: function getFullReader() {
+      (0, _util.assert)(!this._fullRequestReader);
+      this._fullRequestReader = new PDFWorkerStreamReader(this._msgHandler);
+      return this._fullRequestReader;
+    },
+    getRangeReader: function getRangeReader(begin, end) {
+      var reader = new PDFWorkerStreamRangeReader(begin, end, this._msgHandler);
+      this._rangeRequestReaders.push(reader);
+      return reader;
+    },
+    cancelAllRequests: function cancelAllRequests(reason) {
+      if (this._fullRequestReader) {
+        this._fullRequestReader.cancel(reason);
+      }
+      var readers = this._rangeRequestReaders.slice(0);
+      readers.forEach(function (reader) {
+        reader.cancel(reason);
+      });
+    }
+  };
+  function PDFWorkerStreamReader(msgHandler) {
+    var _this = this;
+
+    this._msgHandler = msgHandler;
+    this._contentLength = null;
+    this._isRangeSupported = false;
+    this._isStreamingSupported = false;
+    var readableStream = this._msgHandler.sendWithStream('GetReader');
+    this._reader = readableStream.getReader();
+    this._headersReady = this._msgHandler.sendWithPromise('ReaderHeadersReady').then(function (data) {
+      _this._isStreamingSupported = data.isStreamingSupported;
+      _this._isRangeSupported = data.isRangeSupported;
+      _this._contentLength = data.contentLength;
+    });
+  }
+  PDFWorkerStreamReader.prototype = {
+    get headersReady() {
+      return this._headersReady;
+    },
+    get contentLength() {
+      return this._contentLength;
+    },
+    get isStreamingSupported() {
+      return this._isStreamingSupported;
+    },
+    get isRangeSupported() {
+      return this._isRangeSupported;
+    },
+    read: function read() {
+      return this._reader.read().then(function (_ref) {
+        var value = _ref.value,
+            done = _ref.done;
+
+        if (done) {
+          return {
+            value: undefined,
+            done: true
+          };
+        }
+        return {
+          value: value.buffer,
+          done: false
+        };
+      });
+    },
+    cancel: function cancel(reason) {
+      this._reader.cancel(reason);
+    }
+  };
+  function PDFWorkerStreamRangeReader(begin, end, msgHandler) {
+    this._msgHandler = msgHandler;
+    this.onProgress = null;
+    var readableStream = this._msgHandler.sendWithStream('GetRangeReader', {
+      begin: begin,
+      end: end
+    });
+    this._reader = readableStream.getReader();
+  }
+  PDFWorkerStreamRangeReader.prototype = {
+    get isStreamingSupported() {
+      return false;
+    },
+    read: function read() {
+      return this._reader.read().then(function (_ref2) {
+        var value = _ref2.value,
+            done = _ref2.done;
+
+        if (done) {
+          return {
+            value: undefined,
+            done: true
+          };
+        }
+        return {
+          value: value.buffer,
+          done: false
+        };
+      });
+    },
+    cancel: function cancel(reason) {
+      this._reader.cancel(reason);
+    }
+  };
+  return PDFWorkerStream;
+}();
+var WorkerMessageHandler = {
+  setup: function setup(handler, port) {
+    var testMessageProcessed = false;
+    handler.on('test', function wphSetupTest(data) {
+      if (testMessageProcessed) {
+        return;
+      }
+      testMessageProcessed = true;
+      if (!(data instanceof Uint8Array)) {
+        handler.send('test', false);
+        return;
+      }
+      var supportTransfers = data[0] === 255;
+      handler.postMessageTransfers = supportTransfers;
+      var xhr = new XMLHttpRequest();
+      var responseExists = 'response' in xhr;
+      try {
+        xhr.responseType;
+      } catch (e) {
+        responseExists = false;
+      }
+      if (!responseExists) {
+        handler.send('test', false);
+        return;
+      }
+      handler.send('test', {
+        supportTypedArray: true,
+        supportTransfers: supportTransfers
+      });
+    });
+    handler.on('configure', function wphConfigure(data) {
+      (0, _util.setVerbosityLevel)(data.verbosity);
+    });
+    handler.on('GetDocRequest', function wphSetupDoc(data) {
+      return WorkerMessageHandler.createDocumentHandler(data, port);
+    });
+  },
+  createDocumentHandler: function createDocumentHandler(docParams, port) {
+    var pdfManager;
+    var terminated = false;
+    var cancelXHRs = null;
+    var WorkerTasks = [];
+    var apiVersion = docParams.apiVersion;
+    var workerVersion = '2.0.943';
+    if (apiVersion !== workerVersion) {
+      throw new Error('The API version "' + apiVersion + '" does not match ' + ('the Worker version "' + workerVersion + '".'));
+    }
+    var docId = docParams.docId;
+    var docBaseUrl = docParams.docBaseUrl;
+    var workerHandlerName = docParams.docId + '_worker';
+    var handler = new _message_handler.MessageHandler(workerHandlerName, docId, port);
+    handler.postMessageTransfers = docParams.postMessageTransfers;
+    function ensureNotTerminated() {
+      if (terminated) {
+        throw new Error('Worker was terminated');
+      }
+    }
+    function startWorkerTask(task) {
+      WorkerTasks.push(task);
+    }
+    function finishWorkerTask(task) {
+      task.finish();
+      var i = WorkerTasks.indexOf(task);
+      WorkerTasks.splice(i, 1);
+    }
+    function loadDocument(recoveryMode) {
+      var loadDocumentCapability = (0, _util.createPromiseCapability)();
+      var parseSuccess = function parseSuccess() {
+        Promise.all([pdfManager.ensureDoc('numPages'), pdfManager.ensureDoc('fingerprint')]).then(function (_ref3) {
+          var _ref4 = _slicedToArray(_ref3, 2),
+              numPages = _ref4[0],
+              fingerprint = _ref4[1];
+
+          loadDocumentCapability.resolve({
+            numPages: numPages,
+            fingerprint: fingerprint
+          });
+        }, parseFailure);
+      };
+      var parseFailure = function parseFailure(e) {
+        loadDocumentCapability.reject(e);
+      };
+      pdfManager.ensureDoc('checkHeader', []).then(function () {
+        pdfManager.ensureDoc('parseStartXRef', []).then(function () {
+          pdfManager.ensureDoc('parse', [recoveryMode]).then(parseSuccess, parseFailure);
+        }, parseFailure);
+      }, parseFailure);
+      return loadDocumentCapability.promise;
+    }
+    function getPdfManager(data, evaluatorOptions) {
+      var pdfManagerCapability = (0, _util.createPromiseCapability)();
+      var pdfManager;
+      var source = data.source;
+      if (source.data) {
+        try {
+          pdfManager = new _pdf_manager.LocalPdfManager(docId, source.data, source.password, evaluatorOptions, docBaseUrl);
+          pdfManagerCapability.resolve(pdfManager);
+        } catch (ex) {
+          pdfManagerCapability.reject(ex);
+        }
+        return pdfManagerCapability.promise;
+      }
+      var pdfStream,
+          cachedChunks = [];
+      try {
+        pdfStream = new PDFWorkerStream(handler);
+      } catch (ex) {
+        pdfManagerCapability.reject(ex);
+        return pdfManagerCapability.promise;
+      }
+      var fullRequest = pdfStream.getFullReader();
+      fullRequest.headersReady.then(function () {
+        if (!fullRequest.isRangeSupported) {
+          return;
+        }
+        var disableAutoFetch = source.disableAutoFetch || fullRequest.isStreamingSupported;
+        pdfManager = new _pdf_manager.NetworkPdfManager(docId, pdfStream, {
+          msgHandler: handler,
+          url: source.url,
+          password: source.password,
+          length: fullRequest.contentLength,
+          disableAutoFetch: disableAutoFetch,
+          rangeChunkSize: source.rangeChunkSize
+        }, evaluatorOptions, docBaseUrl);
+        for (var i = 0; i < cachedChunks.length; i++) {
+          pdfManager.sendProgressiveData(cachedChunks[i]);
+        }
+        cachedChunks = [];
+        pdfManagerCapability.resolve(pdfManager);
+        cancelXHRs = null;
+      }).catch(function (reason) {
+        pdfManagerCapability.reject(reason);
+        cancelXHRs = null;
+      });
+      var loaded = 0;
+      var flushChunks = function flushChunks() {
+        var pdfFile = (0, _util.arraysToBytes)(cachedChunks);
+        if (source.length && pdfFile.length !== source.length) {
+          (0, _util.warn)('reported HTTP length is different from actual');
+        }
+        try {
+          pdfManager = new _pdf_manager.LocalPdfManager(docId, pdfFile, source.password, evaluatorOptions, docBaseUrl);
+          pdfManagerCapability.resolve(pdfManager);
+        } catch (ex) {
+          pdfManagerCapability.reject(ex);
+        }
+        cachedChunks = [];
+      };
+      var readPromise = new Promise(function (resolve, reject) {
+        var readChunk = function readChunk(chunk) {
+          try {
+            ensureNotTerminated();
+            if (chunk.done) {
+              if (!pdfManager) {
+                flushChunks();
+              }
+              cancelXHRs = null;
+              return;
+            }
+            var data = chunk.value;
+            loaded += (0, _util.arrayByteLength)(data);
+            if (!fullRequest.isStreamingSupported) {
+              handler.send('DocProgress', {
+                loaded: loaded,
+                total: Math.max(loaded, fullRequest.contentLength || 0)
+              });
+            }
+            if (pdfManager) {
+              pdfManager.sendProgressiveData(data);
+            } else {
+              cachedChunks.push(data);
+            }
+            fullRequest.read().then(readChunk, reject);
+          } catch (e) {
+            reject(e);
+          }
+        };
+        fullRequest.read().then(readChunk, reject);
+      });
+      readPromise.catch(function (e) {
+        pdfManagerCapability.reject(e);
+        cancelXHRs = null;
+      });
+      cancelXHRs = function cancelXHRs() {
+        pdfStream.cancelAllRequests('abort');
+      };
+      return pdfManagerCapability.promise;
+    }
+    function setupDoc(data) {
+      function onSuccess(doc) {
+        ensureNotTerminated();
+        handler.send('GetDoc', { pdfInfo: doc });
+      }
+      function onFailure(e) {
+        ensureNotTerminated();
+        if (e instanceof _util.PasswordException) {
+          var task = new WorkerTask('PasswordException: response ' + e.code);
+          startWorkerTask(task);
+          handler.sendWithPromise('PasswordRequest', e).then(function (data) {
+            finishWorkerTask(task);
+            pdfManager.updatePassword(data.password);
+            pdfManagerReady();
+          }).catch(function (boundException) {
+            finishWorkerTask(task);
+            handler.send('PasswordException', boundException);
+          }.bind(null, e));
+        } else if (e instanceof _util.InvalidPDFException) {
+          handler.send('InvalidPDF', e);
+        } else if (e instanceof _util.MissingPDFException) {
+          handler.send('MissingPDF', e);
+        } else if (e instanceof _util.UnexpectedResponseException) {
+          handler.send('UnexpectedResponse', e);
+        } else {
+          handler.send('UnknownError', new _util.UnknownErrorException(e.message, e.toString()));
+        }
+      }
+      function pdfManagerReady() {
+        ensureNotTerminated();
+        loadDocument(false).then(onSuccess, function loadFailure(ex) {
+          ensureNotTerminated();
+          if (!(ex instanceof _util.XRefParseException)) {
+            onFailure(ex);
+            return;
+          }
+          pdfManager.requestLoadedStream();
+          pdfManager.onLoadedStream().then(function () {
+            ensureNotTerminated();
+            loadDocument(true).then(onSuccess, onFailure);
+          });
+        }, onFailure);
+      }
+      ensureNotTerminated();
+      var evaluatorOptions = {
+        forceDataSchema: data.disableCreateObjectURL,
+        maxImageSize: data.maxImageSize,
+        disableFontFace: data.disableFontFace,
+        nativeImageDecoderSupport: data.nativeImageDecoderSupport,
+        ignoreErrors: data.ignoreErrors,
+        isEvalSupported: data.isEvalSupported
+      };
+      getPdfManager(data, evaluatorOptions).then(function (newPdfManager) {
+        if (terminated) {
+          newPdfManager.terminate();
+          throw new Error('Worker was terminated');
+        }
+        pdfManager = newPdfManager;
+        pdfManager.onLoadedStream().then(function (stream) {
+          handler.send('DataLoaded', { length: stream.bytes.byteLength });
+        });
+      }).then(pdfManagerReady, onFailure);
+    }
+    handler.on('GetPage', function wphSetupGetPage(data) {
+      return pdfManager.getPage(data.pageIndex).then(function (page) {
+        return Promise.all([pdfManager.ensure(page, 'rotate'), pdfManager.ensure(page, 'ref'), pdfManager.ensure(page, 'userUnit'), pdfManager.ensure(page, 'view')]).then(function (_ref5) {
+          var _ref6 = _slicedToArray(_ref5, 4),
+              rotate = _ref6[0],
+              ref = _ref6[1],
+              userUnit = _ref6[2],
+              view = _ref6[3];
+
+          return {
+            rotate: rotate,
+            ref: ref,
+            userUnit: userUnit,
+            view: view
+          };
+        });
+      });
+    });
+    handler.on('GetPageIndex', function wphSetupGetPageIndex(data) {
+      var ref = new _primitives.Ref(data.ref.num, data.ref.gen);
+      var catalog = pdfManager.pdfDocument.catalog;
+      return catalog.getPageIndex(ref);
+    });
+    handler.on('GetDestinations', function wphSetupGetDestinations(data) {
+      return pdfManager.ensureCatalog('destinations');
+    });
+    handler.on('GetDestination', function wphSetupGetDestination(data) {
+      return pdfManager.ensureCatalog('getDestination', [data.id]);
+    });
+    handler.on('GetPageLabels', function wphSetupGetPageLabels(data) {
+      return pdfManager.ensureCatalog('pageLabels');
+    });
+    handler.on('GetPageMode', function wphSetupGetPageMode(data) {
+      return pdfManager.ensureCatalog('pageMode');
+    });
+    handler.on('GetAttachments', function wphSetupGetAttachments(data) {
+      return pdfManager.ensureCatalog('attachments');
+    });
+    handler.on('GetJavaScript', function wphSetupGetJavaScript(data) {
+      return pdfManager.ensureCatalog('javaScript');
+    });
+    handler.on('GetOutline', function wphSetupGetOutline(data) {
+      return pdfManager.ensureCatalog('documentOutline');
+    });
+    handler.on('GetPermissions', function (data) {
+      return pdfManager.ensureCatalog('permissions');
+    });
+    handler.on('GetMetadata', function wphSetupGetMetadata(data) {
+      return Promise.all([pdfManager.ensureDoc('documentInfo'), pdfManager.ensureCatalog('metadata')]);
+    });
+    handler.on('GetData', function wphSetupGetData(data) {
+      pdfManager.requestLoadedStream();
+      return pdfManager.onLoadedStream().then(function (stream) {
+        return stream.bytes;
+      });
+    });
+    handler.on('GetStats', function wphSetupGetStats(data) {
+      return pdfManager.pdfDocument.xref.stats;
+    });
+    handler.on('GetAnnotations', function (_ref7) {
+      var pageIndex = _ref7.pageIndex,
+          intent = _ref7.intent;
+
+      return pdfManager.getPage(pageIndex).then(function (page) {
+        return page.getAnnotationsData(intent);
+      });
+    });
+    handler.on('RenderPageRequest', function wphSetupRenderPage(data) {
+      var pageIndex = data.pageIndex;
+      pdfManager.getPage(pageIndex).then(function (page) {
+        var task = new WorkerTask('RenderPageRequest: page ' + pageIndex);
+        startWorkerTask(task);
+        var pageNum = pageIndex + 1;
+        var start = Date.now();
+        page.getOperatorList({
+          handler: handler,
+          task: task,
+          intent: data.intent,
+          renderInteractiveForms: data.renderInteractiveForms
+        }).then(function (operatorList) {
+          finishWorkerTask(task);
+          (0, _util.info)('page=' + pageNum + ' - getOperatorList: time=' + (Date.now() - start) + 'ms, len=' + operatorList.totalLength);
+        }, function (e) {
+          finishWorkerTask(task);
+          if (task.terminated) {
+            return;
+          }
+          handler.send('UnsupportedFeature', { featureId: _util.UNSUPPORTED_FEATURES.unknown });
+          var minimumStackMessage = 'worker.js: while trying to getPage() and getOperatorList()';
+          var wrappedException;
+          if (typeof e === 'string') {
+            wrappedException = {
+              message: e,
+              stack: minimumStackMessage
+            };
+          } else if ((typeof e === 'undefined' ? 'undefined' : _typeof(e)) === 'object') {
+            wrappedException = {
+              message: e.message || e.toString(),
+              stack: e.stack || minimumStackMessage
+            };
+          } else {
+            wrappedException = {
+              message: 'Unknown exception type: ' + (typeof e === 'undefined' ? 'undefined' : _typeof(e)),
+              stack: minimumStackMessage
+            };
+          }
+          handler.send('PageError', {
+            pageNum: pageNum,
+            error: wrappedException,
+            intent: data.intent
+          });
+        });
+      });
+    }, this);
+    handler.on('GetTextContent', function wphExtractText(data, sink) {
+      var pageIndex = data.pageIndex;
+      sink.onPull = function (desiredSize) {};
+      sink.onCancel = function (reason) {};
+      pdfManager.getPage(pageIndex).then(function (page) {
+        var task = new WorkerTask('GetTextContent: page ' + pageIndex);
+        startWorkerTask(task);
+        var pageNum = pageIndex + 1;
+        var start = Date.now();
+        page.extractTextContent({
+          handler: handler,
+          task: task,
+          sink: sink,
+          normalizeWhitespace: data.normalizeWhitespace,
+          combineTextItems: data.combineTextItems
+        }).then(function () {
+          finishWorkerTask(task);
+          (0, _util.info)('text indexing: page=' + pageNum + ' - time=' + (Date.now() - start) + 'ms');
+          sink.close();
+        }, function (reason) {
+          finishWorkerTask(task);
+          if (task.terminated) {
+            return;
+          }
+          sink.error(reason);
+          throw reason;
+        });
+      });
+    });
+    handler.on('Cleanup', function wphCleanup(data) {
+      return pdfManager.cleanup();
+    });
+    handler.on('Terminate', function wphTerminate(data) {
+      terminated = true;
+      if (pdfManager) {
+        pdfManager.terminate();
+        pdfManager = null;
+      }
+      if (cancelXHRs) {
+        cancelXHRs();
+      }
+      var waitOn = [];
+      WorkerTasks.forEach(function (task) {
+        waitOn.push(task.finished);
+        task.terminate();
+      });
+      return Promise.all(waitOn).then(function () {
+        handler.destroy();
+        handler = null;
+      });
+    });
+    handler.on('Ready', function wphReady(data) {
+      setupDoc(docParams);
+      docParams = null;
+    });
+    return workerHandlerName;
+  },
+  initializeFromPort: function initializeFromPort(port) {
+    var handler = new _message_handler.MessageHandler('worker', 'main', port);
+    WorkerMessageHandler.setup(handler, port);
+    handler.send('ready', null);
+  }
+};
+function isMessagePort(maybePort) {
+  return typeof maybePort.postMessage === 'function' && 'onmessage' in maybePort;
+}
+if (typeof window === 'undefined' && !(0, _is_node2.default)() && typeof self !== 'undefined' && isMessagePort(self)) {
+  WorkerMessageHandler.initializeFromPort(self);
+}
+exports.WorkerTask = WorkerTask;
+exports.WorkerMessageHandler = WorkerMessageHandler;
+
+/***/ }),
+/* 2 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.unreachable = exports.warn = exports.utf8StringToString = exports.stringToUTF8String = exports.stringToPDFString = exports.stringToBytes = exports.string32 = exports.shadow = exports.setVerbosityLevel = exports.URL = exports.ReadableStream = exports.removeNullCharacters = exports.readUint32 = exports.readUint16 = exports.readInt8 = exports.log2 = exports.isEvalSupported = exports.isLittleEndian = exports.createValidAbsoluteUrl = exports.isSameOrigin = exports.isSpace = exports.isString = exports.isNum = exports.isEmptyObj = exports.isBool = exports.isArrayBuffer = exports.info = exports.getVerbosityLevel = exports.getLookupTableFactory = exports.getInheritableProperty = exports.deprecated = exports.createObjectURL = exports.createPromiseCapability = exports.bytesToString = exports.assert = exports.arraysToBytes = exports.arrayByteLength = exports.FormatError = exports.XRefParseException = exports.toRomanNumerals = exports.Util = exports.UnknownErrorException = exports.UnexpectedResponseException = exports.TextRenderingMode = exports.StreamType = exports.PermissionFlag = exports.PasswordResponses = exports.PasswordException = exports.NativeImageDecoding = exports.MissingPDFException = exports.MissingDataException = exports.InvalidPDFException = exports.AbortException = exports.CMapCompressionType = exports.ImageKind = exports.FontType = exports.AnnotationType = exports.AnnotationFlag = exports.AnnotationFieldFlag = exports.AnnotationBorderStyleType = exports.UNSUPPORTED_FEATURES = exports.VerbosityLevel = exports.OPS = exports.IDENTITY_MATRIX = exports.FONT_IDENTITY_MATRIX = undefined;
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+__w_pdfjs_require__(3);
+
+var _streams_polyfill = __w_pdfjs_require__(126);
+
+var _url_polyfill = __w_pdfjs_require__(128);
+
+var IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0];
+var FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0];
+var NativeImageDecoding = {
+  NONE: 'none',
+  DECODE: 'decode',
+  DISPLAY: 'display'
+};
+var PermissionFlag = {
+  PRINT: 0x04,
+  MODIFY_CONTENTS: 0x08,
+  COPY: 0x10,
+  MODIFY_ANNOTATIONS: 0x20,
+  FILL_INTERACTIVE_FORMS: 0x100,
+  COPY_FOR_ACCESSIBILITY: 0x200,
+  ASSEMBLE: 0x400,
+  PRINT_HIGH_QUALITY: 0x800
+};
+var TextRenderingMode = {
+  FILL: 0,
+  STROKE: 1,
+  FILL_STROKE: 2,
+  INVISIBLE: 3,
+  FILL_ADD_TO_PATH: 4,
+  STROKE_ADD_TO_PATH: 5,
+  FILL_STROKE_ADD_TO_PATH: 6,
+  ADD_TO_PATH: 7,
+  FILL_STROKE_MASK: 3,
+  ADD_TO_PATH_FLAG: 4
+};
+var ImageKind = {
+  GRAYSCALE_1BPP: 1,
+  RGB_24BPP: 2,
+  RGBA_32BPP: 3
+};
+var AnnotationType = {
+  TEXT: 1,
+  LINK: 2,
+  FREETEXT: 3,
+  LINE: 4,
+  SQUARE: 5,
+  CIRCLE: 6,
+  POLYGON: 7,
+  POLYLINE: 8,
+  HIGHLIGHT: 9,
+  UNDERLINE: 10,
+  SQUIGGLY: 11,
+  STRIKEOUT: 12,
+  STAMP: 13,
+  CARET: 14,
+  INK: 15,
+  POPUP: 16,
+  FILEATTACHMENT: 17,
+  SOUND: 18,
+  MOVIE: 19,
+  WIDGET: 20,
+  SCREEN: 21,
+  PRINTERMARK: 22,
+  TRAPNET: 23,
+  WATERMARK: 24,
+  THREED: 25,
+  REDACT: 26
+};
+var AnnotationFlag = {
+  INVISIBLE: 0x01,
+  HIDDEN: 0x02,
+  PRINT: 0x04,
+  NOZOOM: 0x08,
+  NOROTATE: 0x10,
+  NOVIEW: 0x20,
+  READONLY: 0x40,
+  LOCKED: 0x80,
+  TOGGLENOVIEW: 0x100,
+  LOCKEDCONTENTS: 0x200
+};
+var AnnotationFieldFlag = {
+  READONLY: 0x0000001,
+  REQUIRED: 0x0000002,
+  NOEXPORT: 0x0000004,
+  MULTILINE: 0x0001000,
+  PASSWORD: 0x0002000,
+  NOTOGGLETOOFF: 0x0004000,
+  RADIO: 0x0008000,
+  PUSHBUTTON: 0x0010000,
+  COMBO: 0x0020000,
+  EDIT: 0x0040000,
+  SORT: 0x0080000,
+  FILESELECT: 0x0100000,
+  MULTISELECT: 0x0200000,
+  DONOTSPELLCHECK: 0x0400000,
+  DONOTSCROLL: 0x0800000,
+  COMB: 0x1000000,
+  RICHTEXT: 0x2000000,
+  RADIOSINUNISON: 0x2000000,
+  COMMITONSELCHANGE: 0x4000000
+};
+var AnnotationBorderStyleType = {
+  SOLID: 1,
+  DASHED: 2,
+  BEVELED: 3,
+  INSET: 4,
+  UNDERLINE: 5
+};
+var StreamType = {
+  UNKNOWN: 0,
+  FLATE: 1,
+  LZW: 2,
+  DCT: 3,
+  JPX: 4,
+  JBIG: 5,
+  A85: 6,
+  AHX: 7,
+  CCF: 8,
+  RL: 9
+};
+var FontType = {
+  UNKNOWN: 0,
+  TYPE1: 1,
+  TYPE1C: 2,
+  CIDFONTTYPE0: 3,
+  CIDFONTTYPE0C: 4,
+  TRUETYPE: 5,
+  CIDFONTTYPE2: 6,
+  TYPE3: 7,
+  OPENTYPE: 8,
+  TYPE0: 9,
+  MMTYPE1: 10
+};
+var VerbosityLevel = {
+  ERRORS: 0,
+  WARNINGS: 1,
+  INFOS: 5
+};
+var CMapCompressionType = {
+  NONE: 0,
+  BINARY: 1,
+  STREAM: 2
+};
+var OPS = {
+  dependency: 1,
+  setLineWidth: 2,
+  setLineCap: 3,
+  setLineJoin: 4,
+  setMiterLimit: 5,
+  setDash: 6,
+  setRenderingIntent: 7,
+  setFlatness: 8,
+  setGState: 9,
+  save: 10,
+  restore: 11,
+  transform: 12,
+  moveTo: 13,
+  lineTo: 14,
+  curveTo: 15,
+  curveTo2: 16,
+  curveTo3: 17,
+  closePath: 18,
+  rectangle: 19,
+  stroke: 20,
+  closeStroke: 21,
+  fill: 22,
+  eoFill: 23,
+  fillStroke: 24,
+  eoFillStroke: 25,
+  closeFillStroke: 26,
+  closeEOFillStroke: 27,
+  endPath: 28,
+  clip: 29,
+  eoClip: 30,
+  beginText: 31,
+  endText: 32,
+  setCharSpacing: 33,
+  setWordSpacing: 34,
+  setHScale: 35,
+  setLeading: 36,
+  setFont: 37,
+  setTextRenderingMode: 38,
+  setTextRise: 39,
+  moveText: 40,
+  setLeadingMoveText: 41,
+  setTextMatrix: 42,
+  nextLine: 43,
+  showText: 44,
+  showSpacedText: 45,
+  nextLineShowText: 46,
+  nextLineSetSpacingShowText: 47,
+  setCharWidth: 48,
+  setCharWidthAndBounds: 49,
+  setStrokeColorSpace: 50,
+  setFillColorSpace: 51,
+  setStrokeColor: 52,
+  setStrokeColorN: 53,
+  setFillColor: 54,
+  setFillColorN: 55,
+  setStrokeGray: 56,
+  setFillGray: 57,
+  setStrokeRGBColor: 58,
+  setFillRGBColor: 59,
+  setStrokeCMYKColor: 60,
+  setFillCMYKColor: 61,
+  shadingFill: 62,
+  beginInlineImage: 63,
+  beginImageData: 64,
+  endInlineImage: 65,
+  paintXObject: 66,
+  markPoint: 67,
+  markPointProps: 68,
+  beginMarkedContent: 69,
+  beginMarkedContentProps: 70,
+  endMarkedContent: 71,
+  beginCompat: 72,
+  endCompat: 73,
+  paintFormXObjectBegin: 74,
+  paintFormXObjectEnd: 75,
+  beginGroup: 76,
+  endGroup: 77,
+  beginAnnotations: 78,
+  endAnnotations: 79,
+  beginAnnotation: 80,
+  endAnnotation: 81,
+  paintJpegXObject: 82,
+  paintImageMaskXObject: 83,
+  paintImageMaskXObjectGroup: 84,
+  paintImageXObject: 85,
+  paintInlineImageXObject: 86,
+  paintInlineImageXObjectGroup: 87,
+  paintImageXObjectRepeat: 88,
+  paintImageMaskXObjectRepeat: 89,
+  paintSolidColorImageMask: 90,
+  constructPath: 91
+};
+var UNSUPPORTED_FEATURES = {
+  unknown: 'unknown',
+  forms: 'forms',
+  javaScript: 'javaScript',
+  smask: 'smask',
+  shadingPattern: 'shadingPattern',
+  font: 'font'
+};
+var PasswordResponses = {
+  NEED_PASSWORD: 1,
+  INCORRECT_PASSWORD: 2
+};
+var verbosity = VerbosityLevel.WARNINGS;
+function setVerbosityLevel(level) {
+  if (Number.isInteger(level)) {
+    verbosity = level;
+  }
+}
+function getVerbosityLevel() {
+  return verbosity;
+}
+function info(msg) {
+  if (verbosity >= VerbosityLevel.INFOS) {
+    console.log('Info: ' + msg);
+  }
+}
+function warn(msg) {
+  if (verbosity >= VerbosityLevel.WARNINGS) {
+    console.log('Warning: ' + msg);
+  }
+}
+function deprecated(details) {
+  console.log('Deprecated API usage: ' + details);
+}
+function unreachable(msg) {
+  throw new Error(msg);
+}
+function assert(cond, msg) {
+  if (!cond) {
+    unreachable(msg);
+  }
+}
+function isSameOrigin(baseUrl, otherUrl) {
+  try {
+    var base = new _url_polyfill.URL(baseUrl);
+    if (!base.origin || base.origin === 'null') {
+      return false;
+    }
+  } catch (e) {
+    return false;
+  }
+  var other = new _url_polyfill.URL(otherUrl, base);
+  return base.origin === other.origin;
+}
+function _isValidProtocol(url) {
+  if (!url) {
+    return false;
+  }
+  switch (url.protocol) {
+    case 'http:':
+    case 'https:':
+    case 'ftp:':
+    case 'mailto:':
+    case 'tel:':
+      return true;
+    default:
+      return false;
+  }
+}
+function createValidAbsoluteUrl(url, baseUrl) {
+  if (!url) {
+    return null;
+  }
+  try {
+    var absoluteUrl = baseUrl ? new _url_polyfill.URL(url, baseUrl) : new _url_polyfill.URL(url);
+    if (_isValidProtocol(absoluteUrl)) {
+      return absoluteUrl;
+    }
+  } catch (ex) {}
+  return null;
+}
+function shadow(obj, prop, value) {
+  Object.defineProperty(obj, prop, {
+    value: value,
+    enumerable: true,
+    configurable: true,
+    writable: false
+  });
+  return value;
+}
+function getLookupTableFactory(initializer) {
+  var lookup;
+  return function () {
+    if (initializer) {
+      lookup = Object.create(null);
+      initializer(lookup);
+      initializer = null;
+    }
+    return lookup;
+  };
+}
+var PasswordException = function PasswordExceptionClosure() {
+  function PasswordException(msg, code) {
+    this.name = 'PasswordException';
+    this.message = msg;
+    this.code = code;
+  }
+  PasswordException.prototype = new Error();
+  PasswordException.constructor = PasswordException;
+  return PasswordException;
+}();
+var UnknownErrorException = function UnknownErrorExceptionClosure() {
+  function UnknownErrorException(msg, details) {
+    this.name = 'UnknownErrorException';
+    this.message = msg;
+    this.details = details;
+  }
+  UnknownErrorException.prototype = new Error();
+  UnknownErrorException.constructor = UnknownErrorException;
+  return UnknownErrorException;
+}();
+var InvalidPDFException = function InvalidPDFExceptionClosure() {
+  function InvalidPDFException(msg) {
+    this.name = 'InvalidPDFException';
+    this.message = msg;
+  }
+  InvalidPDFException.prototype = new Error();
+  InvalidPDFException.constructor = InvalidPDFException;
+  return InvalidPDFException;
+}();
+var MissingPDFException = function MissingPDFExceptionClosure() {
+  function MissingPDFException(msg) {
+    this.name = 'MissingPDFException';
+    this.message = msg;
+  }
+  MissingPDFException.prototype = new Error();
+  MissingPDFException.constructor = MissingPDFException;
+  return MissingPDFException;
+}();
+var UnexpectedResponseException = function UnexpectedResponseExceptionClosure() {
+  function UnexpectedResponseException(msg, status) {
+    this.name = 'UnexpectedResponseException';
+    this.message = msg;
+    this.status = status;
+  }
+  UnexpectedResponseException.prototype = new Error();
+  UnexpectedResponseException.constructor = UnexpectedResponseException;
+  return UnexpectedResponseException;
+}();
+var MissingDataException = function MissingDataExceptionClosure() {
+  function MissingDataException(begin, end) {
+    this.begin = begin;
+    this.end = end;
+    this.message = 'Missing data [' + begin + ', ' + end + ')';
+  }
+  MissingDataException.prototype = new Error();
+  MissingDataException.prototype.name = 'MissingDataException';
+  MissingDataException.constructor = MissingDataException;
+  return MissingDataException;
+}();
+var XRefParseException = function XRefParseExceptionClosure() {
+  function XRefParseException(msg) {
+    this.message = msg;
+  }
+  XRefParseException.prototype = new Error();
+  XRefParseException.prototype.name = 'XRefParseException';
+  XRefParseException.constructor = XRefParseException;
+  return XRefParseException;
+}();
+var FormatError = function FormatErrorClosure() {
+  function FormatError(msg) {
+    this.message = msg;
+  }
+  FormatError.prototype = new Error();
+  FormatError.prototype.name = 'FormatError';
+  FormatError.constructor = FormatError;
+  return FormatError;
+}();
+var AbortException = function AbortExceptionClosure() {
+  function AbortException(msg) {
+    this.name = 'AbortException';
+    this.message = msg;
+  }
+  AbortException.prototype = new Error();
+  AbortException.constructor = AbortException;
+  return AbortException;
+}();
+var NullCharactersRegExp = /\x00/g;
+function removeNullCharacters(str) {
+  if (typeof str !== 'string') {
+    warn('The argument for removeNullCharacters must be a string.');
+    return str;
+  }
+  return str.replace(NullCharactersRegExp, '');
+}
+function bytesToString(bytes) {
+  assert(bytes !== null && (typeof bytes === 'undefined' ? 'undefined' : _typeof(bytes)) === 'object' && bytes.length !== undefined, 'Invalid argument for bytesToString');
+  var length = bytes.length;
+  var MAX_ARGUMENT_COUNT = 8192;
+  if (length < MAX_ARGUMENT_COUNT) {
+    return String.fromCharCode.apply(null, bytes);
+  }
+  var strBuf = [];
+  for (var i = 0; i < length; i += MAX_ARGUMENT_COUNT) {
+    var chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length);
+    var chunk = bytes.subarray(i, chunkEnd);
+    strBuf.push(String.fromCharCode.apply(null, chunk));
+  }
+  return strBuf.join('');
+}
+function stringToBytes(str) {
+  assert(typeof str === 'string', 'Invalid argument for stringToBytes');
+  var length = str.length;
+  var bytes = new Uint8Array(length);
+  for (var i = 0; i < length; ++i) {
+    bytes[i] = str.charCodeAt(i) & 0xFF;
+  }
+  return bytes;
+}
+function arrayByteLength(arr) {
+  if (arr.length !== undefined) {
+    return arr.length;
+  }
+  assert(arr.byteLength !== undefined);
+  return arr.byteLength;
+}
+function arraysToBytes(arr) {
+  if (arr.length === 1 && arr[0] instanceof Uint8Array) {
+    return arr[0];
+  }
+  var resultLength = 0;
+  var i,
+      ii = arr.length;
+  var item, itemLength;
+  for (i = 0; i < ii; i++) {
+    item = arr[i];
+    itemLength = arrayByteLength(item);
+    resultLength += itemLength;
+  }
+  var pos = 0;
+  var data = new Uint8Array(resultLength);
+  for (i = 0; i < ii; i++) {
+    item = arr[i];
+    if (!(item instanceof Uint8Array)) {
+      if (typeof item === 'string') {
+        item = stringToBytes(item);
+      } else {
+        item = new Uint8Array(item);
+      }
+    }
+    itemLength = item.byteLength;
+    data.set(item, pos);
+    pos += itemLength;
+  }
+  return data;
+}
+function string32(value) {
+  return String.fromCharCode(value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff);
+}
+function log2(x) {
+  if (x <= 0) {
+    return 0;
+  }
+  return Math.ceil(Math.log2(x));
+}
+function readInt8(data, start) {
+  return data[start] << 24 >> 24;
+}
+function readUint16(data, offset) {
+  return data[offset] << 8 | data[offset + 1];
+}
+function readUint32(data, offset) {
+  return (data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3]) >>> 0;
+}
+function isLittleEndian() {
+  var buffer8 = new Uint8Array(4);
+  buffer8[0] = 1;
+  var view32 = new Uint32Array(buffer8.buffer, 0, 1);
+  return view32[0] === 1;
+}
+function isEvalSupported() {
+  try {
+    new Function('');
+    return true;
+  } catch (e) {
+    return false;
+  }
+}
+function getInheritableProperty(_ref) {
+  var dict = _ref.dict,
+      key = _ref.key,
+      _ref$getArray = _ref.getArray,
+      getArray = _ref$getArray === undefined ? false : _ref$getArray,
+      _ref$stopWhenFound = _ref.stopWhenFound,
+      stopWhenFound = _ref$stopWhenFound === undefined ? true : _ref$stopWhenFound;
+
+  var LOOP_LIMIT = 100;
+  var loopCount = 0;
+  var values = void 0;
+  while (dict) {
+    var value = getArray ? dict.getArray(key) : dict.get(key);
+    if (value !== undefined) {
+      if (stopWhenFound) {
+        return value;
+      }
+      if (!values) {
+        values = [];
+      }
+      values.push(value);
+    }
+    if (++loopCount > LOOP_LIMIT) {
+      warn('getInheritableProperty: maximum loop count exceeded for "' + key + '"');
+      break;
+    }
+    dict = dict.get('Parent');
+  }
+  return values;
+}
+var Util = function UtilClosure() {
+  function Util() {}
+  var rgbBuf = ['rgb(', 0, ',', 0, ',', 0, ')'];
+  Util.makeCssRgb = function Util_makeCssRgb(r, g, b) {
+    rgbBuf[1] = r;
+    rgbBuf[3] = g;
+    rgbBuf[5] = b;
+    return rgbBuf.join('');
+  };
+  Util.transform = function Util_transform(m1, m2) {
+    return [m1[0] * m2[0] + m1[2] * m2[1], m1[1] * m2[0] + m1[3] * m2[1], m1[0] * m2[2] + m1[2] * m2[3], m1[1] * m2[2] + m1[3] * m2[3], m1[0] * m2[4] + m1[2] * m2[5] + m1[4], m1[1] * m2[4] + m1[3] * m2[5] + m1[5]];
+  };
+  Util.applyTransform = function Util_applyTransform(p, m) {
+    var xt = p[0] * m[0] + p[1] * m[2] + m[4];
+    var yt = p[0] * m[1] + p[1] * m[3] + m[5];
+    return [xt, yt];
+  };
+  Util.applyInverseTransform = function Util_applyInverseTransform(p, m) {
+    var d = m[0] * m[3] - m[1] * m[2];
+    var xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d;
+    var yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d;
+    return [xt, yt];
+  };
+  Util.getAxialAlignedBoundingBox = function Util_getAxialAlignedBoundingBox(r, m) {
+    var p1 = Util.applyTransform(r, m);
+    var p2 = Util.applyTransform(r.slice(2, 4), m);
+    var p3 = Util.applyTransform([r[0], r[3]], m);
+    var p4 = Util.applyTransform([r[2], r[1]], m);
+    return [Math.min(p1[0], p2[0], p3[0], p4[0]), Math.min(p1[1], p2[1], p3[1], p4[1]), Math.max(p1[0], p2[0], p3[0], p4[0]), Math.max(p1[1], p2[1], p3[1], p4[1])];
+  };
+  Util.inverseTransform = function Util_inverseTransform(m) {
+    var d = m[0] * m[3] - m[1] * m[2];
+    return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d, (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d];
+  };
+  Util.apply3dTransform = function Util_apply3dTransform(m, v) {
+    return [m[0] * v[0] + m[1] * v[1] + m[2] * v[2], m[3] * v[0] + m[4] * v[1] + m[5] * v[2], m[6] * v[0] + m[7] * v[1] + m[8] * v[2]];
+  };
+  Util.singularValueDecompose2dScale = function Util_singularValueDecompose2dScale(m) {
+    var transpose = [m[0], m[2], m[1], m[3]];
+    var a = m[0] * transpose[0] + m[1] * transpose[2];
+    var b = m[0] * transpose[1] + m[1] * transpose[3];
+    var c = m[2] * transpose[0] + m[3] * transpose[2];
+    var d = m[2] * transpose[1] + m[3] * transpose[3];
+    var first = (a + d) / 2;
+    var second = Math.sqrt((a + d) * (a + d) - 4 * (a * d - c * b)) / 2;
+    var sx = first + second || 1;
+    var sy = first - second || 1;
+    return [Math.sqrt(sx), Math.sqrt(sy)];
+  };
+  Util.normalizeRect = function Util_normalizeRect(rect) {
+    var r = rect.slice(0);
+    if (rect[0] > rect[2]) {
+      r[0] = rect[2];
+      r[2] = rect[0];
+    }
+    if (rect[1] > rect[3]) {
+      r[1] = rect[3];
+      r[3] = rect[1];
+    }
+    return r;
+  };
+  Util.intersect = function Util_intersect(rect1, rect2) {
+    function compare(a, b) {
+      return a - b;
+    }
+    var orderedX = [rect1[0], rect1[2], rect2[0], rect2[2]].sort(compare),
+        orderedY = [rect1[1], rect1[3], rect2[1], rect2[3]].sort(compare),
+        result = [];
+    rect1 = Util.normalizeRect(rect1);
+    rect2 = Util.normalizeRect(rect2);
+    if (orderedX[0] === rect1[0] && orderedX[1] === rect2[0] || orderedX[0] === rect2[0] && orderedX[1] === rect1[0]) {
+      result[0] = orderedX[1];
+      result[2] = orderedX[2];
+    } else {
+      return false;
+    }
+    if (orderedY[0] === rect1[1] && orderedY[1] === rect2[1] || orderedY[0] === rect2[1] && orderedY[1] === rect1[1]) {
+      result[1] = orderedY[1];
+      result[3] = orderedY[2];
+    } else {
+      return false;
+    }
+    return result;
+  };
+  return Util;
+}();
+var ROMAN_NUMBER_MAP = ['', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM', '', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC', '', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX'];
+function toRomanNumerals(number) {
+  var lowerCase = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+
+  assert(Number.isInteger(number) && number > 0, 'The number should be a positive integer.');
+  var pos = void 0,
+      romanBuf = [];
+  while (number >= 1000) {
+    number -= 1000;
+    romanBuf.push('M');
+  }
+  pos = number / 100 | 0;
+  number %= 100;
+  romanBuf.push(ROMAN_NUMBER_MAP[pos]);
+  pos = number / 10 | 0;
+  number %= 10;
+  romanBuf.push(ROMAN_NUMBER_MAP[10 + pos]);
+  romanBuf.push(ROMAN_NUMBER_MAP[20 + number]);
+  var romanStr = romanBuf.join('');
+  return lowerCase ? romanStr.toLowerCase() : romanStr;
+}
+var PDFStringTranslateTable = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2D8, 0x2C7, 0x2C6, 0x2D9, 0x2DD, 0x2DB, 0x2DA, 0x2DC, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x192, 0x2044, 0x2039, 0x203A, 0x2212, 0x2030, 0x201E, 0x201C, 0x201D, 0x2018, 0x2019, 0x201A, 0x2122, 0xFB01, 0xFB02, 0x141, 0x152, 0x160, 0x178, 0x17D, 0x131, 0x142, 0x153, 0x161, 0x17E, 0, 0x20AC];
+function stringToPDFString(str) {
+  var i,
+      n = str.length,
+      strBuf = [];
+  if (str[0] === '\xFE' && str[1] === '\xFF') {
+    for (i = 2; i < n; i += 2) {
+      strBuf.push(String.fromCharCode(str.charCodeAt(i) << 8 | str.charCodeAt(i + 1)));
+    }
+  } else {
+    for (i = 0; i < n; ++i) {
+      var code = PDFStringTranslateTable[str.charCodeAt(i)];
+      strBuf.push(code ? String.fromCharCode(code) : str.charAt(i));
+    }
+  }
+  return strBuf.join('');
+}
+function stringToUTF8String(str) {
+  return decodeURIComponent(escape(str));
+}
+function utf8StringToString(str) {
+  return unescape(encodeURIComponent(str));
+}
+function isEmptyObj(obj) {
+  for (var key in obj) {
+    return false;
+  }
+  return true;
+}
+function isBool(v) {
+  return typeof v === 'boolean';
+}
+function isNum(v) {
+  return typeof v === 'number';
+}
+function isString(v) {
+  return typeof v === 'string';
+}
+function isArrayBuffer(v) {
+  return (typeof v === 'undefined' ? 'undefined' : _typeof(v)) === 'object' && v !== null && v.byteLength !== undefined;
+}
+function isSpace(ch) {
+  return ch === 0x20 || ch === 0x09 || ch === 0x0D || ch === 0x0A;
+}
+function createPromiseCapability() {
+  var capability = {};
+  capability.promise = new Promise(function (resolve, reject) {
+    capability.resolve = resolve;
+    capability.reject = reject;
+  });
+  return capability;
+}
+var createObjectURL = function createObjectURLClosure() {
+  var digits = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
+  return function createObjectURL(data, contentType) {
+    var forceDataSchema = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
+
+    if (!forceDataSchema && _url_polyfill.URL.createObjectURL) {
+      var blob = new Blob([data], { type: contentType });
+      return _url_polyfill.URL.createObjectURL(blob);
+    }
+    var buffer = 'data:' + contentType + ';base64,';
+    for (var i = 0, ii = data.length; i < ii; i += 3) {
+      var b1 = data[i] & 0xFF;
+      var b2 = data[i + 1] & 0xFF;
+      var b3 = data[i + 2] & 0xFF;
+      var d1 = b1 >> 2,
+          d2 = (b1 & 3) << 4 | b2 >> 4;
+      var d3 = i + 1 < ii ? (b2 & 0xF) << 2 | b3 >> 6 : 64;
+      var d4 = i + 2 < ii ? b3 & 0x3F : 64;
+      buffer += digits[d1] + digits[d2] + digits[d3] + digits[d4];
+    }
+    return buffer;
+  };
+}();
+exports.FONT_IDENTITY_MATRIX = FONT_IDENTITY_MATRIX;
+exports.IDENTITY_MATRIX = IDENTITY_MATRIX;
+exports.OPS = OPS;
+exports.VerbosityLevel = VerbosityLevel;
+exports.UNSUPPORTED_FEATURES = UNSUPPORTED_FEATURES;
+exports.AnnotationBorderStyleType = AnnotationBorderStyleType;
+exports.AnnotationFieldFlag = AnnotationFieldFlag;
+exports.AnnotationFlag = AnnotationFlag;
+exports.AnnotationType = AnnotationType;
+exports.FontType = FontType;
+exports.ImageKind = ImageKind;
+exports.CMapCompressionType = CMapCompressionType;
+exports.AbortException = AbortException;
+exports.InvalidPDFException = InvalidPDFException;
+exports.MissingDataException = MissingDataException;
+exports.MissingPDFException = MissingPDFException;
+exports.NativeImageDecoding = NativeImageDecoding;
+exports.PasswordException = PasswordException;
+exports.PasswordResponses = PasswordResponses;
+exports.PermissionFlag = PermissionFlag;
+exports.StreamType = StreamType;
+exports.TextRenderingMode = TextRenderingMode;
+exports.UnexpectedResponseException = UnexpectedResponseException;
+exports.UnknownErrorException = UnknownErrorException;
+exports.Util = Util;
+exports.toRomanNumerals = toRomanNumerals;
+exports.XRefParseException = XRefParseException;
+exports.FormatError = FormatError;
+exports.arrayByteLength = arrayByteLength;
+exports.arraysToBytes = arraysToBytes;
+exports.assert = assert;
+exports.bytesToString = bytesToString;
+exports.createPromiseCapability = createPromiseCapability;
+exports.createObjectURL = createObjectURL;
+exports.deprecated = deprecated;
+exports.getInheritableProperty = getInheritableProperty;
+exports.getLookupTableFactory = getLookupTableFactory;
+exports.getVerbosityLevel = getVerbosityLevel;
+exports.info = info;
+exports.isArrayBuffer = isArrayBuffer;
+exports.isBool = isBool;
+exports.isEmptyObj = isEmptyObj;
+exports.isNum = isNum;
+exports.isString = isString;
+exports.isSpace = isSpace;
+exports.isSameOrigin = isSameOrigin;
+exports.createValidAbsoluteUrl = createValidAbsoluteUrl;
+exports.isLittleEndian = isLittleEndian;
+exports.isEvalSupported = isEvalSupported;
+exports.log2 = log2;
+exports.readInt8 = readInt8;
+exports.readUint16 = readUint16;
+exports.readUint32 = readUint32;
+exports.removeNullCharacters = removeNullCharacters;
+exports.ReadableStream = _streams_polyfill.ReadableStream;
+exports.URL = _url_polyfill.URL;
+exports.setVerbosityLevel = setVerbosityLevel;
+exports.shadow = shadow;
+exports.string32 = string32;
+exports.stringToBytes = stringToBytes;
+exports.stringToPDFString = stringToPDFString;
+exports.stringToUTF8String = stringToUTF8String;
+exports.utf8StringToString = utf8StringToString;
+exports.warn = warn;
+exports.unreachable = unreachable;
+
+/***/ }),
+/* 3 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+var globalScope = __w_pdfjs_require__(4);
+if (!globalScope._pdfjsCompatibilityChecked) {
+  globalScope._pdfjsCompatibilityChecked = true;
+  var isNodeJS = __w_pdfjs_require__(5);
+  var hasDOM = (typeof window === 'undefined' ? 'undefined' : _typeof(window)) === 'object' && (typeof document === 'undefined' ? 'undefined' : _typeof(document)) === 'object';
+  (function checkNodeBtoa() {
+    if (globalScope.btoa || !isNodeJS()) {
+      return;
+    }
+    globalScope.btoa = function (chars) {
+      return Buffer.from(chars, 'binary').toString('base64');
+    };
+  })();
+  (function checkNodeAtob() {
+    if (globalScope.atob || !isNodeJS()) {
+      return;
+    }
+    globalScope.atob = function (input) {
+      return Buffer.from(input, 'base64').toString('binary');
+    };
+  })();
+  (function checkCurrentScript() {
+    if (!hasDOM) {
+      return;
+    }
+    if ('currentScript' in document) {
+      return;
+    }
+    Object.defineProperty(document, 'currentScript', {
+      get: function get() {
+        var scripts = document.getElementsByTagName('script');
+        return scripts[scripts.length - 1];
+      },
+
+      enumerable: true,
+      configurable: true
+    });
+  })();
+  (function checkChildNodeRemove() {
+    if (!hasDOM) {
+      return;
+    }
+    if (typeof Element.prototype.remove !== 'undefined') {
+      return;
+    }
+    Element.prototype.remove = function () {
+      if (this.parentNode) {
+        this.parentNode.removeChild(this);
+      }
+    };
+  })();
+  (function checkDOMTokenListToggle() {
+    if (!hasDOM || isNodeJS()) {
+      return;
+    }
+    var div = document.createElement('div');
+    if (div.classList.toggle('test', 0) === false) {
+      return;
+    }
+    var originalDOMTokenListToggle = DOMTokenList.prototype.toggle;
+    DOMTokenList.prototype.toggle = function (token) {
+      if (arguments.length > 1) {
+        var force = !!arguments[1];
+        return this[force ? 'add' : 'remove'](token), force;
+      }
+      return originalDOMTokenListToggle(token);
+    };
+  })();
+  (function checkStringIncludes() {
+    if (String.prototype.includes) {
+      return;
+    }
+    __w_pdfjs_require__(6);
+  })();
+  (function checkArrayIncludes() {
+    if (Array.prototype.includes) {
+      return;
+    }
+    __w_pdfjs_require__(34);
+  })();
+  (function checkObjectAssign() {
+    if (Object.assign) {
+      return;
+    }
+    __w_pdfjs_require__(43);
+  })();
+  (function checkMathLog2() {
+    if (Math.log2) {
+      return;
+    }
+    Math.log2 = __w_pdfjs_require__(53);
+  })();
+  (function checkNumberIsNaN() {
+    if (Number.isNaN) {
+      return;
+    }
+    Number.isNaN = __w_pdfjs_require__(55);
+  })();
+  (function checkNumberIsInteger() {
+    if (Number.isInteger) {
+      return;
+    }
+    Number.isInteger = __w_pdfjs_require__(57);
+  })();
+  (function checkPromise() {
+    if (globalScope.Promise) {
+      return;
+    }
+    globalScope.Promise = __w_pdfjs_require__(60);
+  })();
+  (function checkWeakMap() {
+    if (globalScope.WeakMap) {
+      return;
+    }
+    globalScope.WeakMap = __w_pdfjs_require__(95);
+  })();
+  (function checkStringCodePointAt() {
+    if (String.codePointAt) {
+      return;
+    }
+    String.codePointAt = __w_pdfjs_require__(112);
+  })();
+  (function checkStringFromCodePoint() {
+    if (String.fromCodePoint) {
+      return;
+    }
+    String.fromCodePoint = __w_pdfjs_require__(114);
+  })();
+  (function checkSymbol() {
+    if (globalScope.Symbol) {
+      return;
+    }
+    __w_pdfjs_require__(116);
+  })();
+  (function checkObjectValues() {
+    if (Object.values) {
+      return;
+    }
+    Object.values = __w_pdfjs_require__(123);
+  })();
+}
+
+/***/ }),
+/* 4 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+module.exports = typeof window !== 'undefined' && window.Math === Math ? window : typeof global !== 'undefined' && global.Math === Math ? global : typeof self !== 'undefined' && self.Math === Math ? self : {};
+
+/***/ }),
+/* 5 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+module.exports = function isNodeJS() {
+  return (typeof process === 'undefined' ? 'undefined' : _typeof(process)) === 'object' && process + '' === '[object process]';
+};
+
+/***/ }),
+/* 6 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+__w_pdfjs_require__(7);
+module.exports = __w_pdfjs_require__(10).String.includes;
+
+/***/ }),
+/* 7 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var $export = __w_pdfjs_require__(8);
+var context = __w_pdfjs_require__(26);
+var INCLUDES = 'includes';
+$export($export.P + $export.F * __w_pdfjs_require__(33)(INCLUDES), 'String', {
+  includes: function includes(searchString) {
+    return !!~context(this, searchString, INCLUDES).indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);
+  }
+});
+
+/***/ }),
+/* 8 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var global = __w_pdfjs_require__(9);
+var core = __w_pdfjs_require__(10);
+var hide = __w_pdfjs_require__(11);
+var redefine = __w_pdfjs_require__(21);
+var ctx = __w_pdfjs_require__(24);
+var PROTOTYPE = 'prototype';
+var $export = function $export(type, name, source) {
+  var IS_FORCED = type & $export.F;
+  var IS_GLOBAL = type & $export.G;
+  var IS_STATIC = type & $export.S;
+  var IS_PROTO = type & $export.P;
+  var IS_BIND = type & $export.B;
+  var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE];
+  var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});
+  var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});
+  var key, own, out, exp;
+  if (IS_GLOBAL) source = name;
+  for (key in source) {
+    own = !IS_FORCED && target && target[key] !== undefined;
+    out = (own ? target : source)[key];
+    exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;
+    if (target) redefine(target, key, out, type & $export.U);
+    if (exports[key] != out) hide(exports, key, exp);
+    if (IS_PROTO && expProto[key] != out) expProto[key] = out;
+  }
+};
+global.core = core;
+$export.F = 1;
+$export.G = 2;
+$export.S = 4;
+$export.P = 8;
+$export.B = 16;
+$export.W = 32;
+$export.U = 64;
+$export.R = 128;
+module.exports = $export;
+
+/***/ }),
+/* 9 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var global = module.exports = typeof window != 'undefined' && window.Math == Math ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')();
+if (typeof __g == 'number') __g = global;
+
+/***/ }),
+/* 10 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var core = module.exports = { version: '2.5.7' };
+if (typeof __e == 'number') __e = core;
+
+/***/ }),
+/* 11 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var dP = __w_pdfjs_require__(12);
+var createDesc = __w_pdfjs_require__(20);
+module.exports = __w_pdfjs_require__(16) ? function (object, key, value) {
+  return dP.f(object, key, createDesc(1, value));
+} : function (object, key, value) {
+  object[key] = value;
+  return object;
+};
+
+/***/ }),
+/* 12 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var anObject = __w_pdfjs_require__(13);
+var IE8_DOM_DEFINE = __w_pdfjs_require__(15);
+var toPrimitive = __w_pdfjs_require__(19);
+var dP = Object.defineProperty;
+exports.f = __w_pdfjs_require__(16) ? Object.defineProperty : function defineProperty(O, P, Attributes) {
+  anObject(O);
+  P = toPrimitive(P, true);
+  anObject(Attributes);
+  if (IE8_DOM_DEFINE) try {
+    return dP(O, P, Attributes);
+  } catch (e) {}
+  if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');
+  if ('value' in Attributes) O[P] = Attributes.value;
+  return O;
+};
+
+/***/ }),
+/* 13 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var isObject = __w_pdfjs_require__(14);
+module.exports = function (it) {
+  if (!isObject(it)) throw TypeError(it + ' is not an object!');
+  return it;
+};
+
+/***/ }),
+/* 14 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+module.exports = function (it) {
+  return (typeof it === 'undefined' ? 'undefined' : _typeof(it)) === 'object' ? it !== null : typeof it === 'function';
+};
+
+/***/ }),
+/* 15 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+module.exports = !__w_pdfjs_require__(16) && !__w_pdfjs_require__(17)(function () {
+  return Object.defineProperty(__w_pdfjs_require__(18)('div'), 'a', {
+    get: function get() {
+      return 7;
+    }
+  }).a != 7;
+});
+
+/***/ }),
+/* 16 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+module.exports = !__w_pdfjs_require__(17)(function () {
+  return Object.defineProperty({}, 'a', {
+    get: function get() {
+      return 7;
+    }
+  }).a != 7;
+});
+
+/***/ }),
+/* 17 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+module.exports = function (exec) {
+  try {
+    return !!exec();
+  } catch (e) {
+    return true;
+  }
+};
+
+/***/ }),
+/* 18 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var isObject = __w_pdfjs_require__(14);
+var document = __w_pdfjs_require__(9).document;
+var is = isObject(document) && isObject(document.createElement);
+module.exports = function (it) {
+  return is ? document.createElement(it) : {};
+};
+
+/***/ }),
+/* 19 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var isObject = __w_pdfjs_require__(14);
+module.exports = function (it, S) {
+  if (!isObject(it)) return it;
+  var fn, val;
+  if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;
+  if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;
+  if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;
+  throw TypeError("Can't convert object to primitive value");
+};
+
+/***/ }),
+/* 20 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+module.exports = function (bitmap, value) {
+  return {
+    enumerable: !(bitmap & 1),
+    configurable: !(bitmap & 2),
+    writable: !(bitmap & 4),
+    value: value
+  };
+};
+
+/***/ }),
+/* 21 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var global = __w_pdfjs_require__(9);
+var hide = __w_pdfjs_require__(11);
+var has = __w_pdfjs_require__(22);
+var SRC = __w_pdfjs_require__(23)('src');
+var TO_STRING = 'toString';
+var $toString = Function[TO_STRING];
+var TPL = ('' + $toString).split(TO_STRING);
+__w_pdfjs_require__(10).inspectSource = function (it) {
+  return $toString.call(it);
+};
+(module.exports = function (O, key, val, safe) {
+  var isFunction = typeof val == 'function';
+  if (isFunction) has(val, 'name') || hide(val, 'name', key);
+  if (O[key] === val) return;
+  if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));
+  if (O === global) {
+    O[key] = val;
+  } else if (!safe) {
+    delete O[key];
+    hide(O, key, val);
+  } else if (O[key]) {
+    O[key] = val;
+  } else {
+    hide(O, key, val);
+  }
+})(Function.prototype, TO_STRING, function toString() {
+  return typeof this == 'function' && this[SRC] || $toString.call(this);
+});
+
+/***/ }),
+/* 22 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var hasOwnProperty = {}.hasOwnProperty;
+module.exports = function (it, key) {
+  return hasOwnProperty.call(it, key);
+};
+
+/***/ }),
+/* 23 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var id = 0;
+var px = Math.random();
+module.exports = function (key) {
+  return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));
+};
+
+/***/ }),
+/* 24 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var aFunction = __w_pdfjs_require__(25);
+module.exports = function (fn, that, length) {
+  aFunction(fn);
+  if (that === undefined) return fn;
+  switch (length) {
+    case 1:
+      return function (a) {
+        return fn.call(that, a);
+      };
+    case 2:
+      return function (a, b) {
+        return fn.call(that, a, b);
+      };
+    case 3:
+      return function (a, b, c) {
+        return fn.call(that, a, b, c);
+      };
+  }
+  return function () {
+    return fn.apply(that, arguments);
+  };
+};
+
+/***/ }),
+/* 25 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+module.exports = function (it) {
+  if (typeof it != 'function') throw TypeError(it + ' is not a function!');
+  return it;
+};
+
+/***/ }),
+/* 26 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var isRegExp = __w_pdfjs_require__(27);
+var defined = __w_pdfjs_require__(32);
+module.exports = function (that, searchString, NAME) {
+  if (isRegExp(searchString)) throw TypeError('String#' + NAME + " doesn't accept regex!");
+  return String(defined(that));
+};
+
+/***/ }),
+/* 27 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var isObject = __w_pdfjs_require__(14);
+var cof = __w_pdfjs_require__(28);
+var MATCH = __w_pdfjs_require__(29)('match');
+module.exports = function (it) {
+  var isRegExp;
+  return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp');
+};
+
+/***/ }),
+/* 28 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var toString = {}.toString;
+module.exports = function (it) {
+  return toString.call(it).slice(8, -1);
+};
+
+/***/ }),
+/* 29 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var store = __w_pdfjs_require__(30)('wks');
+var uid = __w_pdfjs_require__(23);
+var _Symbol = __w_pdfjs_require__(9).Symbol;
+var USE_SYMBOL = typeof _Symbol == 'function';
+var $exports = module.exports = function (name) {
+  return store[name] || (store[name] = USE_SYMBOL && _Symbol[name] || (USE_SYMBOL ? _Symbol : uid)('Symbol.' + name));
+};
+$exports.store = store;
+
+/***/ }),
+/* 30 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var core = __w_pdfjs_require__(10);
+var global = __w_pdfjs_require__(9);
+var SHARED = '__core-js_shared__';
+var store = global[SHARED] || (global[SHARED] = {});
+(module.exports = function (key, value) {
+  return store[key] || (store[key] = value !== undefined ? value : {});
+})('versions', []).push({
+  version: core.version,
+  mode: __w_pdfjs_require__(31) ? 'pure' : 'global',
+  copyright: '漏 2018 Denis Pushkarev (zloirock.ru)'
+});
+
+/***/ }),
+/* 31 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+module.exports = false;
+
+/***/ }),
+/* 32 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+module.exports = function (it) {
+  if (it == undefined) throw TypeError("Can't call method on  " + it);
+  return it;
+};
+
+/***/ }),
+/* 33 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var MATCH = __w_pdfjs_require__(29)('match');
+module.exports = function (KEY) {
+  var re = /./;
+  try {
+    '/./'[KEY](re);
+  } catch (e) {
+    try {
+      re[MATCH] = false;
+      return !'/./'[KEY](re);
+    } catch (f) {}
+  }
+  return true;
+};
+
+/***/ }),
+/* 34 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+__w_pdfjs_require__(35);
+module.exports = __w_pdfjs_require__(10).Array.includes;
+
+/***/ }),
+/* 35 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var $export = __w_pdfjs_require__(8);
+var $includes = __w_pdfjs_require__(36)(true);
+$export($export.P, 'Array', {
+  includes: function includes(el) {
+    return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);
+  }
+});
+__w_pdfjs_require__(42)('includes');
+
+/***/ }),
+/* 36 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var toIObject = __w_pdfjs_require__(37);
+var toLength = __w_pdfjs_require__(39);
+var toAbsoluteIndex = __w_pdfjs_require__(41);
+module.exports = function (IS_INCLUDES) {
+  return function ($this, el, fromIndex) {
+    var O = toIObject($this);
+    var length = toLength(O.length);
+    var index = toAbsoluteIndex(fromIndex, length);
+    var value;
+    if (IS_INCLUDES && el != el) while (length > index) {
+      value = O[index++];
+      if (value != value) return true;
+    } else for (; length > index; index++) {
+      if (IS_INCLUDES || index in O) {
+        if (O[index] === el) return IS_INCLUDES || index || 0;
+      }
+    }return !IS_INCLUDES && -1;
+  };
+};
+
+/***/ }),
+/* 37 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var IObject = __w_pdfjs_require__(38);
+var defined = __w_pdfjs_require__(32);
+module.exports = function (it) {
+  return IObject(defined(it));
+};
+
+/***/ }),
+/* 38 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var cof = __w_pdfjs_require__(28);
+module.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {
+  return cof(it) == 'String' ? it.split('') : Object(it);
+};
+
+/***/ }),
+/* 39 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var toInteger = __w_pdfjs_require__(40);
+var min = Math.min;
+module.exports = function (it) {
+  return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0;
+};
+
+/***/ }),
+/* 40 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var ceil = Math.ceil;
+var floor = Math.floor;
+module.exports = function (it) {
+  return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);
+};
+
+/***/ }),
+/* 41 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var toInteger = __w_pdfjs_require__(40);
+var max = Math.max;
+var min = Math.min;
+module.exports = function (index, length) {
+  index = toInteger(index);
+  return index < 0 ? max(index + length, 0) : min(index, length);
+};
+
+/***/ }),
+/* 42 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var UNSCOPABLES = __w_pdfjs_require__(29)('unscopables');
+var ArrayProto = Array.prototype;
+if (ArrayProto[UNSCOPABLES] == undefined) __w_pdfjs_require__(11)(ArrayProto, UNSCOPABLES, {});
+module.exports = function (key) {
+  ArrayProto[UNSCOPABLES][key] = true;
+};
+
+/***/ }),
+/* 43 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+__w_pdfjs_require__(44);
+module.exports = __w_pdfjs_require__(10).Object.assign;
+
+/***/ }),
+/* 44 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var $export = __w_pdfjs_require__(8);
+$export($export.S + $export.F, 'Object', { assign: __w_pdfjs_require__(45) });
+
+/***/ }),
+/* 45 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var getKeys = __w_pdfjs_require__(46);
+var gOPS = __w_pdfjs_require__(50);
+var pIE = __w_pdfjs_require__(51);
+var toObject = __w_pdfjs_require__(52);
+var IObject = __w_pdfjs_require__(38);
+var $assign = Object.assign;
+module.exports = !$assign || __w_pdfjs_require__(17)(function () {
+  var A = {};
+  var B = {};
+  var S = Symbol();
+  var K = 'abcdefghijklmnopqrst';
+  A[S] = 7;
+  K.split('').forEach(function (k) {
+    B[k] = k;
+  });
+  return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;
+}) ? function assign(target, source) {
+  var T = toObject(target);
+  var aLen = arguments.length;
+  var index = 1;
+  var getSymbols = gOPS.f;
+  var isEnum = pIE.f;
+  while (aLen > index) {
+    var S = IObject(arguments[index++]);
+    var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S);
+    var length = keys.length;
+    var j = 0;
+    var key;
+    while (length > j) {
+      if (isEnum.call(S, key = keys[j++])) T[key] = S[key];
+    }
+  }
+  return T;
+} : $assign;
+
+/***/ }),
+/* 46 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var $keys = __w_pdfjs_require__(47);
+var enumBugKeys = __w_pdfjs_require__(49);
+module.exports = Object.keys || function keys(O) {
+  return $keys(O, enumBugKeys);
+};
+
+/***/ }),
+/* 47 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var has = __w_pdfjs_require__(22);
+var toIObject = __w_pdfjs_require__(37);
+var arrayIndexOf = __w_pdfjs_require__(36)(false);
+var IE_PROTO = __w_pdfjs_require__(48)('IE_PROTO');
+module.exports = function (object, names) {
+  var O = toIObject(object);
+  var i = 0;
+  var result = [];
+  var key;
+  for (key in O) {
+    if (key != IE_PROTO) has(O, key) && result.push(key);
+  }while (names.length > i) {
+    if (has(O, key = names[i++])) {
+      ~arrayIndexOf(result, key) || result.push(key);
+    }
+  }return result;
+};
+
+/***/ }),
+/* 48 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var shared = __w_pdfjs_require__(30)('keys');
+var uid = __w_pdfjs_require__(23);
+module.exports = function (key) {
+  return shared[key] || (shared[key] = uid(key));
+};
+
+/***/ }),
+/* 49 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+module.exports = 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'.split(',');
+
+/***/ }),
+/* 50 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+exports.f = Object.getOwnPropertySymbols;
+
+/***/ }),
+/* 51 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+exports.f = {}.propertyIsEnumerable;
+
+/***/ }),
+/* 52 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var defined = __w_pdfjs_require__(32);
+module.exports = function (it) {
+  return Object(defined(it));
+};
+
+/***/ }),
+/* 53 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+__w_pdfjs_require__(54);
+module.exports = __w_pdfjs_require__(10).Math.log2;
+
+/***/ }),
+/* 54 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var $export = __w_pdfjs_require__(8);
+$export($export.S, 'Math', {
+  log2: function log2(x) {
+    return Math.log(x) / Math.LN2;
+  }
+});
+
+/***/ }),
+/* 55 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+__w_pdfjs_require__(56);
+module.exports = __w_pdfjs_require__(10).Number.isNaN;
+
+/***/ }),
+/* 56 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var $export = __w_pdfjs_require__(8);
+$export($export.S, 'Number', {
+  isNaN: function isNaN(number) {
+    return number != number;
+  }
+});
+
+/***/ }),
+/* 57 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+__w_pdfjs_require__(58);
+module.exports = __w_pdfjs_require__(10).Number.isInteger;
+
+/***/ }),
+/* 58 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var $export = __w_pdfjs_require__(8);
+$export($export.S, 'Number', { isInteger: __w_pdfjs_require__(59) });
+
+/***/ }),
+/* 59 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var isObject = __w_pdfjs_require__(14);
+var floor = Math.floor;
+module.exports = function isInteger(it) {
+  return !isObject(it) && isFinite(it) && floor(it) === it;
+};
+
+/***/ }),
+/* 60 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+__w_pdfjs_require__(61);
+__w_pdfjs_require__(63);
+__w_pdfjs_require__(73);
+__w_pdfjs_require__(76);
+__w_pdfjs_require__(93);
+__w_pdfjs_require__(94);
+module.exports = __w_pdfjs_require__(10).Promise;
+
+/***/ }),
+/* 61 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var classof = __w_pdfjs_require__(62);
+var test = {};
+test[__w_pdfjs_require__(29)('toStringTag')] = 'z';
+if (test + '' != '[object z]') {
+  __w_pdfjs_require__(21)(Object.prototype, 'toString', function toString() {
+    return '[object ' + classof(this) + ']';
+  }, true);
+}
+
+/***/ }),
+/* 62 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var cof = __w_pdfjs_require__(28);
+var TAG = __w_pdfjs_require__(29)('toStringTag');
+var ARG = cof(function () {
+  return arguments;
+}()) == 'Arguments';
+var tryGet = function tryGet(it, key) {
+  try {
+    return it[key];
+  } catch (e) {}
+};
+module.exports = function (it) {
+  var O, T, B;
+  return it === undefined ? 'Undefined' : it === null ? 'Null' : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T : ARG ? cof(O) : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;
+};
+
+/***/ }),
+/* 63 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var $at = __w_pdfjs_require__(64)(true);
+__w_pdfjs_require__(65)(String, 'String', function (iterated) {
+  this._t = String(iterated);
+  this._i = 0;
+}, function () {
+  var O = this._t;
+  var index = this._i;
+  var point;
+  if (index >= O.length) return {
+    value: undefined,
+    done: true
+  };
+  point = $at(O, index);
+  this._i += point.length;
+  return {
+    value: point,
+    done: false
+  };
+});
+
+/***/ }),
+/* 64 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var toInteger = __w_pdfjs_require__(40);
+var defined = __w_pdfjs_require__(32);
+module.exports = function (TO_STRING) {
+  return function (that, pos) {
+    var s = String(defined(that));
+    var i = toInteger(pos);
+    var l = s.length;
+    var a, b;
+    if (i < 0 || i >= l) return TO_STRING ? '' : undefined;
+    a = s.charCodeAt(i);
+    return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff ? TO_STRING ? s.charAt(i) : a : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;
+  };
+};
+
+/***/ }),
+/* 65 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var LIBRARY = __w_pdfjs_require__(31);
+var $export = __w_pdfjs_require__(8);
+var redefine = __w_pdfjs_require__(21);
+var hide = __w_pdfjs_require__(11);
+var Iterators = __w_pdfjs_require__(66);
+var $iterCreate = __w_pdfjs_require__(67);
+var setToStringTag = __w_pdfjs_require__(71);
+var getPrototypeOf = __w_pdfjs_require__(72);
+var ITERATOR = __w_pdfjs_require__(29)('iterator');
+var BUGGY = !([].keys && 'next' in [].keys());
+var FF_ITERATOR = '@@iterator';
+var KEYS = 'keys';
+var VALUES = 'values';
+var returnThis = function returnThis() {
+  return this;
+};
+module.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {
+  $iterCreate(Constructor, NAME, next);
+  var getMethod = function getMethod(kind) {
+    if (!BUGGY && kind in proto) return proto[kind];
+    switch (kind) {
+      case KEYS:
+        return function keys() {
+          return new Constructor(this, kind);
+        };
+      case VALUES:
+        return function values() {
+          return new Constructor(this, kind);
+        };
+    }
+    return function entries() {
+      return new Constructor(this, kind);
+    };
+  };
+  var TAG = NAME + ' Iterator';
+  var DEF_VALUES = DEFAULT == VALUES;
+  var VALUES_BUG = false;
+  var proto = Base.prototype;
+  var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];
+  var $default = $native || getMethod(DEFAULT);
+  var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;
+  var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;
+  var methods, key, IteratorPrototype;
+  if ($anyNative) {
+    IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));
+    if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {
+      setToStringTag(IteratorPrototype, TAG, true);
+      if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);
+    }
+  }
+  if (DEF_VALUES && $native && $native.name !== VALUES) {
+    VALUES_BUG = true;
+    $default = function values() {
+      return $native.call(this);
+    };
+  }
+  if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {
+    hide(proto, ITERATOR, $default);
+  }
+  Iterators[NAME] = $default;
+  Iterators[TAG] = returnThis;
+  if (DEFAULT) {
+    methods = {
+      values: DEF_VALUES ? $default : getMethod(VALUES),
+      keys: IS_SET ? $default : getMethod(KEYS),
+      entries: $entries
+    };
+    if (FORCED) for (key in methods) {
+      if (!(key in proto)) redefine(proto, key, methods[key]);
+    } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);
+  }
+  return methods;
+};
+
+/***/ }),
+/* 66 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+module.exports = {};
+
+/***/ }),
+/* 67 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var create = __w_pdfjs_require__(68);
+var descriptor = __w_pdfjs_require__(20);
+var setToStringTag = __w_pdfjs_require__(71);
+var IteratorPrototype = {};
+__w_pdfjs_require__(11)(IteratorPrototype, __w_pdfjs_require__(29)('iterator'), function () {
+  return this;
+});
+module.exports = function (Constructor, NAME, next) {
+  Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });
+  setToStringTag(Constructor, NAME + ' Iterator');
+};
+
+/***/ }),
+/* 68 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var anObject = __w_pdfjs_require__(13);
+var dPs = __w_pdfjs_require__(69);
+var enumBugKeys = __w_pdfjs_require__(49);
+var IE_PROTO = __w_pdfjs_require__(48)('IE_PROTO');
+var Empty = function Empty() {};
+var PROTOTYPE = 'prototype';
+var _createDict = function createDict() {
+  var iframe = __w_pdfjs_require__(18)('iframe');
+  var i = enumBugKeys.length;
+  var lt = '<';
+  var gt = '>';
+  var iframeDocument;
+  iframe.style.display = 'none';
+  __w_pdfjs_require__(70).appendChild(iframe);
+  iframe.src = 'javascript:';
+  iframeDocument = iframe.contentWindow.document;
+  iframeDocument.open();
+  iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);
+  iframeDocument.close();
+  _createDict = iframeDocument.F;
+  while (i--) {
+    delete _createDict[PROTOTYPE][enumBugKeys[i]];
+  }return _createDict();
+};
+module.exports = Object.create || function create(O, Properties) {
+  var result;
+  if (O !== null) {
+    Empty[PROTOTYPE] = anObject(O);
+    result = new Empty();
+    Empty[PROTOTYPE] = null;
+    result[IE_PROTO] = O;
+  } else result = _createDict();
+  return Properties === undefined ? result : dPs(result, Properties);
+};
+
+/***/ }),
+/* 69 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var dP = __w_pdfjs_require__(12);
+var anObject = __w_pdfjs_require__(13);
+var getKeys = __w_pdfjs_require__(46);
+module.exports = __w_pdfjs_require__(16) ? Object.defineProperties : function defineProperties(O, Properties) {
+  anObject(O);
+  var keys = getKeys(Properties);
+  var length = keys.length;
+  var i = 0;
+  var P;
+  while (length > i) {
+    dP.f(O, P = keys[i++], Properties[P]);
+  }return O;
+};
+
+/***/ }),
+/* 70 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var document = __w_pdfjs_require__(9).document;
+module.exports = document && document.documentElement;
+
+/***/ }),
+/* 71 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var def = __w_pdfjs_require__(12).f;
+var has = __w_pdfjs_require__(22);
+var TAG = __w_pdfjs_require__(29)('toStringTag');
+module.exports = function (it, tag, stat) {
+  if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, {
+    configurable: true,
+    value: tag
+  });
+};
+
+/***/ }),
+/* 72 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var has = __w_pdfjs_require__(22);
+var toObject = __w_pdfjs_require__(52);
+var IE_PROTO = __w_pdfjs_require__(48)('IE_PROTO');
+var ObjectProto = Object.prototype;
+module.exports = Object.getPrototypeOf || function (O) {
+  O = toObject(O);
+  if (has(O, IE_PROTO)) return O[IE_PROTO];
+  if (typeof O.constructor == 'function' && O instanceof O.constructor) {
+    return O.constructor.prototype;
+  }
+  return O instanceof Object ? ObjectProto : null;
+};
+
+/***/ }),
+/* 73 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var $iterators = __w_pdfjs_require__(74);
+var getKeys = __w_pdfjs_require__(46);
+var redefine = __w_pdfjs_require__(21);
+var global = __w_pdfjs_require__(9);
+var hide = __w_pdfjs_require__(11);
+var Iterators = __w_pdfjs_require__(66);
+var wks = __w_pdfjs_require__(29);
+var ITERATOR = wks('iterator');
+var TO_STRING_TAG = wks('toStringTag');
+var ArrayValues = Iterators.Array;
+var DOMIterables = {
+  CSSRuleList: true,
+  CSSStyleDeclaration: false,
+  CSSValueList: false,
+  ClientRectList: false,
+  DOMRectList: false,
+  DOMStringList: false,
+  DOMTokenList: true,
+  DataTransferItemList: false,
+  FileList: false,
+  HTMLAllCollection: false,
+  HTMLCollection: false,
+  HTMLFormElement: false,
+  HTMLSelectElement: false,
+  MediaList: true,
+  MimeTypeArray: false,
+  NamedNodeMap: false,
+  NodeList: true,
+  PaintRequestList: false,
+  Plugin: false,
+  PluginArray: false,
+  SVGLengthList: false,
+  SVGNumberList: false,
+  SVGPathSegList: false,
+  SVGPointList: false,
+  SVGStringList: false,
+  SVGTransformList: false,
+  SourceBufferList: false,
+  StyleSheetList: true,
+  TextTrackCueList: false,
+  TextTrackList: false,
+  TouchList: false
+};
+for (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) {
+  var NAME = collections[i];
+  var explicit = DOMIterables[NAME];
+  var Collection = global[NAME];
+  var proto = Collection && Collection.prototype;
+  var key;
+  if (proto) {
+    if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues);
+    if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);
+    Iterators[NAME] = ArrayValues;
+    if (explicit) for (key in $iterators) {
+      if (!proto[key]) redefine(proto, key, $iterators[key], true);
+    }
+  }
+}
+
+/***/ }),
+/* 74 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var addToUnscopables = __w_pdfjs_require__(42);
+var step = __w_pdfjs_require__(75);
+var Iterators = __w_pdfjs_require__(66);
+var toIObject = __w_pdfjs_require__(37);
+module.exports = __w_pdfjs_require__(65)(Array, 'Array', function (iterated, kind) {
+  this._t = toIObject(iterated);
+  this._i = 0;
+  this._k = kind;
+}, function () {
+  var O = this._t;
+  var kind = this._k;
+  var index = this._i++;
+  if (!O || index >= O.length) {
+    this._t = undefined;
+    return step(1);
+  }
+  if (kind == 'keys') return step(0, index);
+  if (kind == 'values') return step(0, O[index]);
+  return step(0, [index, O[index]]);
+}, 'values');
+Iterators.Arguments = Iterators.Array;
+addToUnscopables('keys');
+addToUnscopables('values');
+addToUnscopables('entries');
+
+/***/ }),
+/* 75 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+module.exports = function (done, value) {
+  return {
+    value: value,
+    done: !!done
+  };
+};
+
+/***/ }),
+/* 76 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var LIBRARY = __w_pdfjs_require__(31);
+var global = __w_pdfjs_require__(9);
+var ctx = __w_pdfjs_require__(24);
+var classof = __w_pdfjs_require__(62);
+var $export = __w_pdfjs_require__(8);
+var isObject = __w_pdfjs_require__(14);
+var aFunction = __w_pdfjs_require__(25);
+var anInstance = __w_pdfjs_require__(77);
+var forOf = __w_pdfjs_require__(78);
+var speciesConstructor = __w_pdfjs_require__(82);
+var task = __w_pdfjs_require__(83).set;
+var microtask = __w_pdfjs_require__(85)();
+var newPromiseCapabilityModule = __w_pdfjs_require__(86);
+var perform = __w_pdfjs_require__(87);
+var userAgent = __w_pdfjs_require__(88);
+var promiseResolve = __w_pdfjs_require__(89);
+var PROMISE = 'Promise';
+var TypeError = global.TypeError;
+var process = global.process;
+var versions = process && process.versions;
+var v8 = versions && versions.v8 || '';
+var $Promise = global[PROMISE];
+var isNode = classof(process) == 'process';
+var empty = function empty() {};
+var Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;
+var newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f;
+var USE_NATIVE = !!function () {
+  try {
+    var promise = $Promise.resolve(1);
+    var FakePromise = (promise.constructor = {})[__w_pdfjs_require__(29)('species')] = function (exec) {
+      exec(empty, empty);
+    };
+    return (isNode || typeof PromiseRejectionEvent == 'function') && promise.then(empty) instanceof FakePromise && v8.indexOf('6.6') !== 0 && userAgent.indexOf('Chrome/66') === -1;
+  } catch (e) {}
+}();
+var isThenable = function isThenable(it) {
+  var then;
+  return isObject(it) && typeof (then = it.then) == 'function' ? then : false;
+};
+var notify = function notify(promise, isReject) {
+  if (promise._n) return;
+  promise._n = true;
+  var chain = promise._c;
+  microtask(function () {
+    var value = promise._v;
+    var ok = promise._s == 1;
+    var i = 0;
+    var run = function run(reaction) {
+      var handler = ok ? reaction.ok : reaction.fail;
+      var resolve = reaction.resolve;
+      var reject = reaction.reject;
+      var domain = reaction.domain;
+      var result, then, exited;
+      try {
+        if (handler) {
+          if (!ok) {
+            if (promise._h == 2) onHandleUnhandled(promise);
+            promise._h = 1;
+          }
+          if (handler === true) result = value;else {
+            if (domain) domain.enter();
+            result = handler(value);
+            if (domain) {
+              domain.exit();
+              exited = true;
+            }
+          }
+          if (result === reaction.promise) {
+            reject(TypeError('Promise-chain cycle'));
+          } else if (then = isThenable(result)) {
+            then.call(result, resolve, reject);
+          } else resolve(result);
+        } else reject(value);
+      } catch (e) {
+        if (domain && !exited) domain.exit();
+        reject(e);
+      }
+    };
+    while (chain.length > i) {
+      run(chain[i++]);
+    }promise._c = [];
+    promise._n = false;
+    if (isReject && !promise._h) onUnhandled(promise);
+  });
+};
+var onUnhandled = function onUnhandled(promise) {
+  task.call(global, function () {
+    var value = promise._v;
+    var unhandled = isUnhandled(promise);
+    var result, handler, console;
+    if (unhandled) {
+      result = perform(function () {
+        if (isNode) {
+          process.emit('unhandledRejection', value, promise);
+        } else if (handler = global.onunhandledrejection) {
+          handler({
+            promise: promise,
+            reason: value
+          });
+        } else if ((console = global.console) && console.error) {
+          console.error('Unhandled promise rejection', value);
+        }
+      });
+      promise._h = isNode || isUnhandled(promise) ? 2 : 1;
+    }
+    promise._a = undefined;
+    if (unhandled && result.e) throw result.v;
+  });
+};
+var isUnhandled = function isUnhandled(promise) {
+  return promise._h !== 1 && (promise._a || promise._c).length === 0;
+};
+var onHandleUnhandled = function onHandleUnhandled(promise) {
+  task.call(global, function () {
+    var handler;
+    if (isNode) {
+      process.emit('rejectionHandled', promise);
+    } else if (handler = global.onrejectionhandled) {
+      handler({
+        promise: promise,
+        reason: promise._v
+      });
+    }
+  });
+};
+var $reject = function $reject(value) {
+  var promise = this;
+  if (promise._d) return;
+  promise._d = true;
+  promise = promise._w || promise;
+  promise._v = value;
+  promise._s = 2;
+  if (!promise._a) promise._a = promise._c.slice();
+  notify(promise, true);
+};
+var $resolve = function $resolve(value) {
+  var promise = this;
+  var then;
+  if (promise._d) return;
+  promise._d = true;
+  promise = promise._w || promise;
+  try {
+    if (promise === value) throw TypeError("Promise can't be resolved itself");
+    if (then = isThenable(value)) {
+      microtask(function () {
+        var wrapper = {
+          _w: promise,
+          _d: false
+        };
+        try {
+          then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));
+        } catch (e) {
+          $reject.call(wrapper, e);
+        }
+      });
+    } else {
+      promise._v = value;
+      promise._s = 1;
+      notify(promise, false);
+    }
+  } catch (e) {
+    $reject.call({
+      _w: promise,
+      _d: false
+    }, e);
+  }
+};
+if (!USE_NATIVE) {
+  $Promise = function Promise(executor) {
+    anInstance(this, $Promise, PROMISE, '_h');
+    aFunction(executor);
+    Internal.call(this);
+    try {
+      executor(ctx($resolve, this, 1), ctx($reject, this, 1));
+    } catch (err) {
+      $reject.call(this, err);
+    }
+  };
+  Internal = function Promise(executor) {
+    this._c = [];
+    this._a = undefined;
+    this._s = 0;
+    this._d = false;
+    this._v = undefined;
+    this._h = 0;
+    this._n = false;
+  };
+  Internal.prototype = __w_pdfjs_require__(90)($Promise.prototype, {
+    then: function then(onFulfilled, onRejected) {
+      var reaction = newPromiseCapability(speciesConstructor(this, $Promise));
+      reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;
+      reaction.fail = typeof onRejected == 'function' && onRejected;
+      reaction.domain = isNode ? process.domain : undefined;
+      this._c.push(reaction);
+      if (this._a) this._a.push(reaction);
+      if (this._s) notify(this, false);
+      return reaction.promise;
+    },
+    'catch': function _catch(onRejected) {
+      return this.then(undefined, onRejected);
+    }
+  });
+  OwnPromiseCapability = function OwnPromiseCapability() {
+    var promise = new Internal();
+    this.promise = promise;
+    this.resolve = ctx($resolve, promise, 1);
+    this.reject = ctx($reject, promise, 1);
+  };
+  newPromiseCapabilityModule.f = newPromiseCapability = function newPromiseCapability(C) {
+    return C === $Promise || C === Wrapper ? new OwnPromiseCapability(C) : newGenericPromiseCapability(C);
+  };
+}
+$export($export.G + $export.W + $export.F * !USE_NATIVE, { Promise: $Promise });
+__w_pdfjs_require__(71)($Promise, PROMISE);
+__w_pdfjs_require__(91)(PROMISE);
+Wrapper = __w_pdfjs_require__(10)[PROMISE];
+$export($export.S + $export.F * !USE_NATIVE, PROMISE, {
+  reject: function reject(r) {
+    var capability = newPromiseCapability(this);
+    var $$reject = capability.reject;
+    $$reject(r);
+    return capability.promise;
+  }
+});
+$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, {
+  resolve: function resolve(x) {
+    return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x);
+  }
+});
+$export($export.S + $export.F * !(USE_NATIVE && __w_pdfjs_require__(92)(function (iter) {
+  $Promise.all(iter)['catch'](empty);
+})), PROMISE, {
+  all: function all(iterable) {
+    var C = this;
+    var capability = newPromiseCapability(C);
+    var resolve = capability.resolve;
+    var reject = capability.reject;
+    var result = perform(function () {
+      var values = [];
+      var index = 0;
+      var remaining = 1;
+      forOf(iterable, false, function (promise) {
+        var $index = index++;
+        var alreadyCalled = false;
+        values.push(undefined);
+        remaining++;
+        C.resolve(promise).then(function (value) {
+          if (alreadyCalled) return;
+          alreadyCalled = true;
+          values[$index] = value;
+          --remaining || resolve(values);
+        }, reject);
+      });
+      --remaining || resolve(values);
+    });
+    if (result.e) reject(result.v);
+    return capability.promise;
+  },
+  race: function race(iterable) {
+    var C = this;
+    var capability = newPromiseCapability(C);
+    var reject = capability.reject;
+    var result = perform(function () {
+      forOf(iterable, false, function (promise) {
+        C.resolve(promise).then(capability.resolve, reject);
+      });
+    });
+    if (result.e) reject(result.v);
+    return capability.promise;
+  }
+});
+
+/***/ }),
+/* 77 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+module.exports = function (it, Constructor, name, forbiddenField) {
+  if (!(it instanceof Constructor) || forbiddenField !== undefined && forbiddenField in it) {
+    throw TypeError(name + ': incorrect invocation!');
+  }
+  return it;
+};
+
+/***/ }),
+/* 78 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var ctx = __w_pdfjs_require__(24);
+var call = __w_pdfjs_require__(79);
+var isArrayIter = __w_pdfjs_require__(80);
+var anObject = __w_pdfjs_require__(13);
+var toLength = __w_pdfjs_require__(39);
+var getIterFn = __w_pdfjs_require__(81);
+var BREAK = {};
+var RETURN = {};
+var _exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {
+  var iterFn = ITERATOR ? function () {
+    return iterable;
+  } : getIterFn(iterable);
+  var f = ctx(fn, that, entries ? 2 : 1);
+  var index = 0;
+  var length, step, iterator, result;
+  if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');
+  if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) {
+    result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);
+    if (result === BREAK || result === RETURN) return result;
+  } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {
+    result = call(iterator, f, step.value, entries);
+    if (result === BREAK || result === RETURN) return result;
+  }
+};
+_exports.BREAK = BREAK;
+_exports.RETURN = RETURN;
+
+/***/ }),
+/* 79 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var anObject = __w_pdfjs_require__(13);
+module.exports = function (iterator, fn, value, entries) {
+  try {
+    return entries ? fn(anObject(value)[0], value[1]) : fn(value);
+  } catch (e) {
+    var ret = iterator['return'];
+    if (ret !== undefined) anObject(ret.call(iterator));
+    throw e;
+  }
+};
+
+/***/ }),
+/* 80 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var Iterators = __w_pdfjs_require__(66);
+var ITERATOR = __w_pdfjs_require__(29)('iterator');
+var ArrayProto = Array.prototype;
+module.exports = function (it) {
+  return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);
+};
+
+/***/ }),
+/* 81 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var classof = __w_pdfjs_require__(62);
+var ITERATOR = __w_pdfjs_require__(29)('iterator');
+var Iterators = __w_pdfjs_require__(66);
+module.exports = __w_pdfjs_require__(10).getIteratorMethod = function (it) {
+  if (it != undefined) return it[ITERATOR] || it['@@iterator'] || Iterators[classof(it)];
+};
+
+/***/ }),
+/* 82 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var anObject = __w_pdfjs_require__(13);
+var aFunction = __w_pdfjs_require__(25);
+var SPECIES = __w_pdfjs_require__(29)('species');
+module.exports = function (O, D) {
+  var C = anObject(O).constructor;
+  var S;
+  return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);
+};
+
+/***/ }),
+/* 83 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var ctx = __w_pdfjs_require__(24);
+var invoke = __w_pdfjs_require__(84);
+var html = __w_pdfjs_require__(70);
+var cel = __w_pdfjs_require__(18);
+var global = __w_pdfjs_require__(9);
+var process = global.process;
+var setTask = global.setImmediate;
+var clearTask = global.clearImmediate;
+var MessageChannel = global.MessageChannel;
+var Dispatch = global.Dispatch;
+var counter = 0;
+var queue = {};
+var ONREADYSTATECHANGE = 'onreadystatechange';
+var defer, channel, port;
+var run = function run() {
+  var id = +this;
+  if (queue.hasOwnProperty(id)) {
+    var fn = queue[id];
+    delete queue[id];
+    fn();
+  }
+};
+var listener = function listener(event) {
+  run.call(event.data);
+};
+if (!setTask || !clearTask) {
+  setTask = function setImmediate(fn) {
+    var args = [];
+    var i = 1;
+    while (arguments.length > i) {
+      args.push(arguments[i++]);
+    }queue[++counter] = function () {
+      invoke(typeof fn == 'function' ? fn : Function(fn), args);
+    };
+    defer(counter);
+    return counter;
+  };
+  clearTask = function clearImmediate(id) {
+    delete queue[id];
+  };
+  if (__w_pdfjs_require__(28)(process) == 'process') {
+    defer = function defer(id) {
+      process.nextTick(ctx(run, id, 1));
+    };
+  } else if (Dispatch && Dispatch.now) {
+    defer = function defer(id) {
+      Dispatch.now(ctx(run, id, 1));
+    };
+  } else if (MessageChannel) {
+    channel = new MessageChannel();
+    port = channel.port2;
+    channel.port1.onmessage = listener;
+    defer = ctx(port.postMessage, port, 1);
+  } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) {
+    defer = function defer(id) {
+      global.postMessage(id + '', '*');
+    };
+    global.addEventListener('message', listener, false);
+  } else if (ONREADYSTATECHANGE in cel('script')) {
+    defer = function defer(id) {
+      html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () {
+        html.removeChild(this);
+        run.call(id);
+      };
+    };
+  } else {
+    defer = function defer(id) {
+      setTimeout(ctx(run, id, 1), 0);
+    };
+  }
+}
+module.exports = {
+  set: setTask,
+  clear: clearTask
+};
+
+/***/ }),
+/* 84 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+module.exports = function (fn, args, that) {
+  var un = that === undefined;
+  switch (args.length) {
+    case 0:
+      return un ? fn() : fn.call(that);
+    case 1:
+      return un ? fn(args[0]) : fn.call(that, args[0]);
+    case 2:
+      return un ? fn(args[0], args[1]) : fn.call(that, args[0], args[1]);
+    case 3:
+      return un ? fn(args[0], args[1], args[2]) : fn.call(that, args[0], args[1], args[2]);
+    case 4:
+      return un ? fn(args[0], args[1], args[2], args[3]) : fn.call(that, args[0], args[1], args[2], args[3]);
+  }
+  return fn.apply(that, args);
+};
+
+/***/ }),
+/* 85 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var global = __w_pdfjs_require__(9);
+var macrotask = __w_pdfjs_require__(83).set;
+var Observer = global.MutationObserver || global.WebKitMutationObserver;
+var process = global.process;
+var Promise = global.Promise;
+var isNode = __w_pdfjs_require__(28)(process) == 'process';
+module.exports = function () {
+  var head, last, notify;
+  var flush = function flush() {
+    var parent, fn;
+    if (isNode && (parent = process.domain)) parent.exit();
+    while (head) {
+      fn = head.fn;
+      head = head.next;
+      try {
+        fn();
+      } catch (e) {
+        if (head) notify();else last = undefined;
+        throw e;
+      }
+    }
+    last = undefined;
+    if (parent) parent.enter();
+  };
+  if (isNode) {
+    notify = function notify() {
+      process.nextTick(flush);
+    };
+  } else if (Observer && !(global.navigator && global.navigator.standalone)) {
+    var toggle = true;
+    var node = document.createTextNode('');
+    new Observer(flush).observe(node, { characterData: true });
+    notify = function notify() {
+      node.data = toggle = !toggle;
+    };
+  } else if (Promise && Promise.resolve) {
+    var promise = Promise.resolve(undefined);
+    notify = function notify() {
+      promise.then(flush);
+    };
+  } else {
+    notify = function notify() {
+      macrotask.call(global, flush);
+    };
+  }
+  return function (fn) {
+    var task = {
+      fn: fn,
+      next: undefined
+    };
+    if (last) last.next = task;
+    if (!head) {
+      head = task;
+      notify();
+    }
+    last = task;
+  };
+};
+
+/***/ }),
+/* 86 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var aFunction = __w_pdfjs_require__(25);
+function PromiseCapability(C) {
+  var resolve, reject;
+  this.promise = new C(function ($$resolve, $$reject) {
+    if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');
+    resolve = $$resolve;
+    reject = $$reject;
+  });
+  this.resolve = aFunction(resolve);
+  this.reject = aFunction(reject);
+}
+module.exports.f = function (C) {
+  return new PromiseCapability(C);
+};
+
+/***/ }),
+/* 87 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+module.exports = function (exec) {
+  try {
+    return {
+      e: false,
+      v: exec()
+    };
+  } catch (e) {
+    return {
+      e: true,
+      v: e
+    };
+  }
+};
+
+/***/ }),
+/* 88 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var global = __w_pdfjs_require__(9);
+var navigator = global.navigator;
+module.exports = navigator && navigator.userAgent || '';
+
+/***/ }),
+/* 89 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var anObject = __w_pdfjs_require__(13);
+var isObject = __w_pdfjs_require__(14);
+var newPromiseCapability = __w_pdfjs_require__(86);
+module.exports = function (C, x) {
+  anObject(C);
+  if (isObject(x) && x.constructor === C) return x;
+  var promiseCapability = newPromiseCapability.f(C);
+  var resolve = promiseCapability.resolve;
+  resolve(x);
+  return promiseCapability.promise;
+};
+
+/***/ }),
+/* 90 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var redefine = __w_pdfjs_require__(21);
+module.exports = function (target, src, safe) {
+  for (var key in src) {
+    redefine(target, key, src[key], safe);
+  }return target;
+};
+
+/***/ }),
+/* 91 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var global = __w_pdfjs_require__(9);
+var dP = __w_pdfjs_require__(12);
+var DESCRIPTORS = __w_pdfjs_require__(16);
+var SPECIES = __w_pdfjs_require__(29)('species');
+module.exports = function (KEY) {
+  var C = global[KEY];
+  if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, {
+    configurable: true,
+    get: function get() {
+      return this;
+    }
+  });
+};
+
+/***/ }),
+/* 92 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var ITERATOR = __w_pdfjs_require__(29)('iterator');
+var SAFE_CLOSING = false;
+try {
+  var riter = [7][ITERATOR]();
+  riter['return'] = function () {
+    SAFE_CLOSING = true;
+  };
+  Array.from(riter, function () {
+    throw 2;
+  });
+} catch (e) {}
+module.exports = function (exec, skipClosing) {
+  if (!skipClosing && !SAFE_CLOSING) return false;
+  var safe = false;
+  try {
+    var arr = [7];
+    var iter = arr[ITERATOR]();
+    iter.next = function () {
+      return { done: safe = true };
+    };
+    arr[ITERATOR] = function () {
+      return iter;
+    };
+    exec(arr);
+  } catch (e) {}
+  return safe;
+};
+
+/***/ }),
+/* 93 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var $export = __w_pdfjs_require__(8);
+var core = __w_pdfjs_require__(10);
+var global = __w_pdfjs_require__(9);
+var speciesConstructor = __w_pdfjs_require__(82);
+var promiseResolve = __w_pdfjs_require__(89);
+$export($export.P + $export.R, 'Promise', {
+  'finally': function _finally(onFinally) {
+    var C = speciesConstructor(this, core.Promise || global.Promise);
+    var isFunction = typeof onFinally == 'function';
+    return this.then(isFunction ? function (x) {
+      return promiseResolve(C, onFinally()).then(function () {
+        return x;
+      });
+    } : onFinally, isFunction ? function (e) {
+      return promiseResolve(C, onFinally()).then(function () {
+        throw e;
+      });
+    } : onFinally);
+  }
+});
+
+/***/ }),
+/* 94 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var $export = __w_pdfjs_require__(8);
+var newPromiseCapability = __w_pdfjs_require__(86);
+var perform = __w_pdfjs_require__(87);
+$export($export.S, 'Promise', {
+  'try': function _try(callbackfn) {
+    var promiseCapability = newPromiseCapability.f(this);
+    var result = perform(callbackfn);
+    (result.e ? promiseCapability.reject : promiseCapability.resolve)(result.v);
+    return promiseCapability.promise;
+  }
+});
+
+/***/ }),
+/* 95 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+__w_pdfjs_require__(61);
+__w_pdfjs_require__(73);
+__w_pdfjs_require__(96);
+__w_pdfjs_require__(108);
+__w_pdfjs_require__(110);
+module.exports = __w_pdfjs_require__(10).WeakMap;
+
+/***/ }),
+/* 96 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var each = __w_pdfjs_require__(97)(0);
+var redefine = __w_pdfjs_require__(21);
+var meta = __w_pdfjs_require__(101);
+var assign = __w_pdfjs_require__(45);
+var weak = __w_pdfjs_require__(102);
+var isObject = __w_pdfjs_require__(14);
+var fails = __w_pdfjs_require__(17);
+var validate = __w_pdfjs_require__(103);
+var WEAK_MAP = 'WeakMap';
+var getWeak = meta.getWeak;
+var isExtensible = Object.isExtensible;
+var uncaughtFrozenStore = weak.ufstore;
+var tmp = {};
+var InternalMap;
+var wrapper = function wrapper(get) {
+  return function WeakMap() {
+    return get(this, arguments.length > 0 ? arguments[0] : undefined);
+  };
+};
+var methods = {
+  get: function get(key) {
+    if (isObject(key)) {
+      var data = getWeak(key);
+      if (data === true) return uncaughtFrozenStore(validate(this, WEAK_MAP)).get(key);
+      return data ? data[this._i] : undefined;
+    }
+  },
+  set: function set(key, value) {
+    return weak.def(validate(this, WEAK_MAP), key, value);
+  }
+};
+var $WeakMap = module.exports = __w_pdfjs_require__(104)(WEAK_MAP, wrapper, methods, weak, true, true);
+if (fails(function () {
+  return new $WeakMap().set((Object.freeze || Object)(tmp), 7).get(tmp) != 7;
+})) {
+  InternalMap = weak.getConstructor(wrapper, WEAK_MAP);
+  assign(InternalMap.prototype, methods);
+  meta.NEED = true;
+  each(['delete', 'has', 'get', 'set'], function (key) {
+    var proto = $WeakMap.prototype;
+    var method = proto[key];
+    redefine(proto, key, function (a, b) {
+      if (isObject(a) && !isExtensible(a)) {
+        if (!this._f) this._f = new InternalMap();
+        var result = this._f[key](a, b);
+        return key == 'set' ? this : result;
+      }
+      return method.call(this, a, b);
+    });
+  });
+}
+
+/***/ }),
+/* 97 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var ctx = __w_pdfjs_require__(24);
+var IObject = __w_pdfjs_require__(38);
+var toObject = __w_pdfjs_require__(52);
+var toLength = __w_pdfjs_require__(39);
+var asc = __w_pdfjs_require__(98);
+module.exports = function (TYPE, $create) {
+  var IS_MAP = TYPE == 1;
+  var IS_FILTER = TYPE == 2;
+  var IS_SOME = TYPE == 3;
+  var IS_EVERY = TYPE == 4;
+  var IS_FIND_INDEX = TYPE == 6;
+  var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;
+  var create = $create || asc;
+  return function ($this, callbackfn, that) {
+    var O = toObject($this);
+    var self = IObject(O);
+    var f = ctx(callbackfn, that, 3);
+    var length = toLength(self.length);
+    var index = 0;
+    var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;
+    var val, res;
+    for (; length > index; index++) {
+      if (NO_HOLES || index in self) {
+        val = self[index];
+        res = f(val, index, O);
+        if (TYPE) {
+          if (IS_MAP) result[index] = res;else if (res) switch (TYPE) {
+            case 3:
+              return true;
+            case 5:
+              return val;
+            case 6:
+              return index;
+            case 2:
+              result.push(val);
+          } else if (IS_EVERY) return false;
+        }
+      }
+    }return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;
+  };
+};
+
+/***/ }),
+/* 98 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var speciesConstructor = __w_pdfjs_require__(99);
+module.exports = function (original, length) {
+  return new (speciesConstructor(original))(length);
+};
+
+/***/ }),
+/* 99 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var isObject = __w_pdfjs_require__(14);
+var isArray = __w_pdfjs_require__(100);
+var SPECIES = __w_pdfjs_require__(29)('species');
+module.exports = function (original) {
+  var C;
+  if (isArray(original)) {
+    C = original.constructor;
+    if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;
+    if (isObject(C)) {
+      C = C[SPECIES];
+      if (C === null) C = undefined;
+    }
+  }
+  return C === undefined ? Array : C;
+};
+
+/***/ }),
+/* 100 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var cof = __w_pdfjs_require__(28);
+module.exports = Array.isArray || function isArray(arg) {
+  return cof(arg) == 'Array';
+};
+
+/***/ }),
+/* 101 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+var META = __w_pdfjs_require__(23)('meta');
+var isObject = __w_pdfjs_require__(14);
+var has = __w_pdfjs_require__(22);
+var setDesc = __w_pdfjs_require__(12).f;
+var id = 0;
+var isExtensible = Object.isExtensible || function () {
+  return true;
+};
+var FREEZE = !__w_pdfjs_require__(17)(function () {
+  return isExtensible(Object.preventExtensions({}));
+});
+var setMeta = function setMeta(it) {
+  setDesc(it, META, {
+    value: {
+      i: 'O' + ++id,
+      w: {}
+    }
+  });
+};
+var fastKey = function fastKey(it, create) {
+  if (!isObject(it)) return (typeof it === 'undefined' ? 'undefined' : _typeof(it)) == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;
+  if (!has(it, META)) {
+    if (!isExtensible(it)) return 'F';
+    if (!create) return 'E';
+    setMeta(it);
+  }
+  return it[META].i;
+};
+var getWeak = function getWeak(it, create) {
+  if (!has(it, META)) {
+    if (!isExtensible(it)) return true;
+    if (!create) return false;
+    setMeta(it);
+  }
+  return it[META].w;
+};
+var onFreeze = function onFreeze(it) {
+  if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);
+  return it;
+};
+var meta = module.exports = {
+  KEY: META,
+  NEED: false,
+  fastKey: fastKey,
+  getWeak: getWeak,
+  onFreeze: onFreeze
+};
+
+/***/ }),
+/* 102 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var redefineAll = __w_pdfjs_require__(90);
+var getWeak = __w_pdfjs_require__(101).getWeak;
+var anObject = __w_pdfjs_require__(13);
+var isObject = __w_pdfjs_require__(14);
+var anInstance = __w_pdfjs_require__(77);
+var forOf = __w_pdfjs_require__(78);
+var createArrayMethod = __w_pdfjs_require__(97);
+var $has = __w_pdfjs_require__(22);
+var validate = __w_pdfjs_require__(103);
+var arrayFind = createArrayMethod(5);
+var arrayFindIndex = createArrayMethod(6);
+var id = 0;
+var uncaughtFrozenStore = function uncaughtFrozenStore(that) {
+  return that._l || (that._l = new UncaughtFrozenStore());
+};
+var UncaughtFrozenStore = function UncaughtFrozenStore() {
+  this.a = [];
+};
+var findUncaughtFrozen = function findUncaughtFrozen(store, key) {
+  return arrayFind(store.a, function (it) {
+    return it[0] === key;
+  });
+};
+UncaughtFrozenStore.prototype = {
+  get: function get(key) {
+    var entry = findUncaughtFrozen(this, key);
+    if (entry) return entry[1];
+  },
+  has: function has(key) {
+    return !!findUncaughtFrozen(this, key);
+  },
+  set: function set(key, value) {
+    var entry = findUncaughtFrozen(this, key);
+    if (entry) entry[1] = value;else this.a.push([key, value]);
+  },
+  'delete': function _delete(key) {
+    var index = arrayFindIndex(this.a, function (it) {
+      return it[0] === key;
+    });
+    if (~index) this.a.splice(index, 1);
+    return !!~index;
+  }
+};
+module.exports = {
+  getConstructor: function getConstructor(wrapper, NAME, IS_MAP, ADDER) {
+    var C = wrapper(function (that, iterable) {
+      anInstance(that, C, NAME, '_i');
+      that._t = NAME;
+      that._i = id++;
+      that._l = undefined;
+      if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);
+    });
+    redefineAll(C.prototype, {
+      'delete': function _delete(key) {
+        if (!isObject(key)) return false;
+        var data = getWeak(key);
+        if (data === true) return uncaughtFrozenStore(validate(this, NAME))['delete'](key);
+        return data && $has(data, this._i) && delete data[this._i];
+      },
+      has: function has(key) {
+        if (!isObject(key)) return false;
+        var data = getWeak(key);
+        if (data === true) return uncaughtFrozenStore(validate(this, NAME)).has(key);
+        return data && $has(data, this._i);
+      }
+    });
+    return C;
+  },
+  def: function def(that, key, value) {
+    var data = getWeak(anObject(key), true);
+    if (data === true) uncaughtFrozenStore(that).set(key, value);else data[that._i] = value;
+    return that;
+  },
+  ufstore: uncaughtFrozenStore
+};
+
+/***/ }),
+/* 103 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var isObject = __w_pdfjs_require__(14);
+module.exports = function (it, TYPE) {
+  if (!isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!');
+  return it;
+};
+
+/***/ }),
+/* 104 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var global = __w_pdfjs_require__(9);
+var $export = __w_pdfjs_require__(8);
+var redefine = __w_pdfjs_require__(21);
+var redefineAll = __w_pdfjs_require__(90);
+var meta = __w_pdfjs_require__(101);
+var forOf = __w_pdfjs_require__(78);
+var anInstance = __w_pdfjs_require__(77);
+var isObject = __w_pdfjs_require__(14);
+var fails = __w_pdfjs_require__(17);
+var $iterDetect = __w_pdfjs_require__(92);
+var setToStringTag = __w_pdfjs_require__(71);
+var inheritIfRequired = __w_pdfjs_require__(105);
+module.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {
+  var Base = global[NAME];
+  var C = Base;
+  var ADDER = IS_MAP ? 'set' : 'add';
+  var proto = C && C.prototype;
+  var O = {};
+  var fixMethod = function fixMethod(KEY) {
+    var fn = proto[KEY];
+    redefine(proto, KEY, KEY == 'delete' ? function (a) {
+      return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);
+    } : KEY == 'has' ? function has(a) {
+      return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);
+    } : KEY == 'get' ? function get(a) {
+      return IS_WEAK && !isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a);
+    } : KEY == 'add' ? function add(a) {
+      fn.call(this, a === 0 ? 0 : a);
+      return this;
+    } : function set(a, b) {
+      fn.call(this, a === 0 ? 0 : a, b);
+      return this;
+    });
+  };
+  if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () {
+    new C().entries().next();
+  }))) {
+    C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);
+    redefineAll(C.prototype, methods);
+    meta.NEED = true;
+  } else {
+    var instance = new C();
+    var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance;
+    var THROWS_ON_PRIMITIVES = fails(function () {
+      instance.has(1);
+    });
+    var ACCEPT_ITERABLES = $iterDetect(function (iter) {
+      new C(iter);
+    });
+    var BUGGY_ZERO = !IS_WEAK && fails(function () {
+      var $instance = new C();
+      var index = 5;
+      while (index--) {
+        $instance[ADDER](index, index);
+      }return !$instance.has(-0);
+    });
+    if (!ACCEPT_ITERABLES) {
+      C = wrapper(function (target, iterable) {
+        anInstance(target, C, NAME);
+        var that = inheritIfRequired(new Base(), target, C);
+        if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);
+        return that;
+      });
+      C.prototype = proto;
+      proto.constructor = C;
+    }
+    if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {
+      fixMethod('delete');
+      fixMethod('has');
+      IS_MAP && fixMethod('get');
+    }
+    if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);
+    if (IS_WEAK && proto.clear) delete proto.clear;
+  }
+  setToStringTag(C, NAME);
+  O[NAME] = C;
+  $export($export.G + $export.W + $export.F * (C != Base), O);
+  if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP);
+  return C;
+};
+
+/***/ }),
+/* 105 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var isObject = __w_pdfjs_require__(14);
+var setPrototypeOf = __w_pdfjs_require__(106).set;
+module.exports = function (that, target, C) {
+  var S = target.constructor;
+  var P;
+  if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) {
+    setPrototypeOf(that, P);
+  }
+  return that;
+};
+
+/***/ }),
+/* 106 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var isObject = __w_pdfjs_require__(14);
+var anObject = __w_pdfjs_require__(13);
+var check = function check(O, proto) {
+  anObject(O);
+  if (!isObject(proto) && proto !== null) throw TypeError(proto + ": can't set as prototype!");
+};
+module.exports = {
+  set: Object.setPrototypeOf || ('__proto__' in {} ? function (test, buggy, set) {
+    try {
+      set = __w_pdfjs_require__(24)(Function.call, __w_pdfjs_require__(107).f(Object.prototype, '__proto__').set, 2);
+      set(test, []);
+      buggy = !(test instanceof Array);
+    } catch (e) {
+      buggy = true;
+    }
+    return function setPrototypeOf(O, proto) {
+      check(O, proto);
+      if (buggy) O.__proto__ = proto;else set(O, proto);
+      return O;
+    };
+  }({}, false) : undefined),
+  check: check
+};
+
+/***/ }),
+/* 107 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var pIE = __w_pdfjs_require__(51);
+var createDesc = __w_pdfjs_require__(20);
+var toIObject = __w_pdfjs_require__(37);
+var toPrimitive = __w_pdfjs_require__(19);
+var has = __w_pdfjs_require__(22);
+var IE8_DOM_DEFINE = __w_pdfjs_require__(15);
+var gOPD = Object.getOwnPropertyDescriptor;
+exports.f = __w_pdfjs_require__(16) ? gOPD : function getOwnPropertyDescriptor(O, P) {
+  O = toIObject(O);
+  P = toPrimitive(P, true);
+  if (IE8_DOM_DEFINE) try {
+    return gOPD(O, P);
+  } catch (e) {}
+  if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);
+};
+
+/***/ }),
+/* 108 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+__w_pdfjs_require__(109)('WeakMap');
+
+/***/ }),
+/* 109 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var $export = __w_pdfjs_require__(8);
+module.exports = function (COLLECTION) {
+  $export($export.S, COLLECTION, {
+    of: function of() {
+      var length = arguments.length;
+      var A = new Array(length);
+      while (length--) {
+        A[length] = arguments[length];
+      }return new this(A);
+    }
+  });
+};
+
+/***/ }),
+/* 110 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+__w_pdfjs_require__(111)('WeakMap');
+
+/***/ }),
+/* 111 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var $export = __w_pdfjs_require__(8);
+var aFunction = __w_pdfjs_require__(25);
+var ctx = __w_pdfjs_require__(24);
+var forOf = __w_pdfjs_require__(78);
+module.exports = function (COLLECTION) {
+  $export($export.S, COLLECTION, {
+    from: function from(source) {
+      var mapFn = arguments[1];
+      var mapping, A, n, cb;
+      aFunction(this);
+      mapping = mapFn !== undefined;
+      if (mapping) aFunction(mapFn);
+      if (source == undefined) return new this();
+      A = [];
+      if (mapping) {
+        n = 0;
+        cb = ctx(mapFn, arguments[2], 2);
+        forOf(source, false, function (nextItem) {
+          A.push(cb(nextItem, n++));
+        });
+      } else {
+        forOf(source, false, A.push, A);
+      }
+      return new this(A);
+    }
+  });
+};
+
+/***/ }),
+/* 112 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+__w_pdfjs_require__(113);
+module.exports = __w_pdfjs_require__(10).String.codePointAt;
+
+/***/ }),
+/* 113 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var $export = __w_pdfjs_require__(8);
+var $at = __w_pdfjs_require__(64)(false);
+$export($export.P, 'String', {
+  codePointAt: function codePointAt(pos) {
+    return $at(this, pos);
+  }
+});
+
+/***/ }),
+/* 114 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+__w_pdfjs_require__(115);
+module.exports = __w_pdfjs_require__(10).String.fromCodePoint;
+
+/***/ }),
+/* 115 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var $export = __w_pdfjs_require__(8);
+var toAbsoluteIndex = __w_pdfjs_require__(41);
+var fromCharCode = String.fromCharCode;
+var $fromCodePoint = String.fromCodePoint;
+$export($export.S + $export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', {
+  fromCodePoint: function fromCodePoint(x) {
+    var res = [];
+    var aLen = arguments.length;
+    var i = 0;
+    var code;
+    while (aLen > i) {
+      code = +arguments[i++];
+      if (toAbsoluteIndex(code, 0x10ffff) !== code) throw RangeError(code + ' is not a valid code point');
+      res.push(code < 0x10000 ? fromCharCode(code) : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00));
+    }
+    return res.join('');
+  }
+});
+
+/***/ }),
+/* 116 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+__w_pdfjs_require__(117);
+__w_pdfjs_require__(61);
+module.exports = __w_pdfjs_require__(10).Symbol;
+
+/***/ }),
+/* 117 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+var global = __w_pdfjs_require__(9);
+var has = __w_pdfjs_require__(22);
+var DESCRIPTORS = __w_pdfjs_require__(16);
+var $export = __w_pdfjs_require__(8);
+var redefine = __w_pdfjs_require__(21);
+var META = __w_pdfjs_require__(101).KEY;
+var $fails = __w_pdfjs_require__(17);
+var shared = __w_pdfjs_require__(30);
+var setToStringTag = __w_pdfjs_require__(71);
+var uid = __w_pdfjs_require__(23);
+var wks = __w_pdfjs_require__(29);
+var wksExt = __w_pdfjs_require__(118);
+var wksDefine = __w_pdfjs_require__(119);
+var enumKeys = __w_pdfjs_require__(120);
+var isArray = __w_pdfjs_require__(100);
+var anObject = __w_pdfjs_require__(13);
+var isObject = __w_pdfjs_require__(14);
+var toIObject = __w_pdfjs_require__(37);
+var toPrimitive = __w_pdfjs_require__(19);
+var createDesc = __w_pdfjs_require__(20);
+var _create = __w_pdfjs_require__(68);
+var gOPNExt = __w_pdfjs_require__(121);
+var $GOPD = __w_pdfjs_require__(107);
+var $DP = __w_pdfjs_require__(12);
+var $keys = __w_pdfjs_require__(46);
+var gOPD = $GOPD.f;
+var dP = $DP.f;
+var gOPN = gOPNExt.f;
+var $Symbol = global.Symbol;
+var $JSON = global.JSON;
+var _stringify = $JSON && $JSON.stringify;
+var PROTOTYPE = 'prototype';
+var HIDDEN = wks('_hidden');
+var TO_PRIMITIVE = wks('toPrimitive');
+var isEnum = {}.propertyIsEnumerable;
+var SymbolRegistry = shared('symbol-registry');
+var AllSymbols = shared('symbols');
+var OPSymbols = shared('op-symbols');
+var ObjectProto = Object[PROTOTYPE];
+var USE_NATIVE = typeof $Symbol == 'function';
+var QObject = global.QObject;
+var setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;
+var setSymbolDesc = DESCRIPTORS && $fails(function () {
+  return _create(dP({}, 'a', {
+    get: function get() {
+      return dP(this, 'a', { value: 7 }).a;
+    }
+  })).a != 7;
+}) ? function (it, key, D) {
+  var protoDesc = gOPD(ObjectProto, key);
+  if (protoDesc) delete ObjectProto[key];
+  dP(it, key, D);
+  if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);
+} : dP;
+var wrap = function wrap(tag) {
+  var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);
+  sym._k = tag;
+  return sym;
+};
+var isSymbol = USE_NATIVE && _typeof($Symbol.iterator) == 'symbol' ? function (it) {
+  return (typeof it === 'undefined' ? 'undefined' : _typeof(it)) == 'symbol';
+} : function (it) {
+  return it instanceof $Symbol;
+};
+var $defineProperty = function defineProperty(it, key, D) {
+  if (it === ObjectProto) $defineProperty(OPSymbols, key, D);
+  anObject(it);
+  key = toPrimitive(key, true);
+  anObject(D);
+  if (has(AllSymbols, key)) {
+    if (!D.enumerable) {
+      if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));
+      it[HIDDEN][key] = true;
+    } else {
+      if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;
+      D = _create(D, { enumerable: createDesc(0, false) });
+    }
+    return setSymbolDesc(it, key, D);
+  }
+  return dP(it, key, D);
+};
+var $defineProperties = function defineProperties(it, P) {
+  anObject(it);
+  var keys = enumKeys(P = toIObject(P));
+  var i = 0;
+  var l = keys.length;
+  var key;
+  while (l > i) {
+    $defineProperty(it, key = keys[i++], P[key]);
+  }return it;
+};
+var $create = function create(it, P) {
+  return P === undefined ? _create(it) : $defineProperties(_create(it), P);
+};
+var $propertyIsEnumerable = function propertyIsEnumerable(key) {
+  var E = isEnum.call(this, key = toPrimitive(key, true));
+  if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;
+  return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;
+};
+var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {
+  it = toIObject(it);
+  key = toPrimitive(key, true);
+  if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;
+  var D = gOPD(it, key);
+  if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;
+  return D;
+};
+var $getOwnPropertyNames = function getOwnPropertyNames(it) {
+  var names = gOPN(toIObject(it));
+  var result = [];
+  var i = 0;
+  var key;
+  while (names.length > i) {
+    if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);
+  }
+  return result;
+};
+var $getOwnPropertySymbols = function getOwnPropertySymbols(it) {
+  var IS_OP = it === ObjectProto;
+  var names = gOPN(IS_OP ? OPSymbols : toIObject(it));
+  var result = [];
+  var i = 0;
+  var key;
+  while (names.length > i) {
+    if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);
+  }
+  return result;
+};
+if (!USE_NATIVE) {
+  $Symbol = function _Symbol() {
+    if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');
+    var tag = uid(arguments.length > 0 ? arguments[0] : undefined);
+    var $set = function $set(value) {
+      if (this === ObjectProto) $set.call(OPSymbols, value);
+      if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;
+      setSymbolDesc(this, tag, createDesc(1, value));
+    };
+    if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, {
+      configurable: true,
+      set: $set
+    });
+    return wrap(tag);
+  };
+  redefine($Symbol[PROTOTYPE], 'toString', function toString() {
+    return this._k;
+  });
+  $GOPD.f = $getOwnPropertyDescriptor;
+  $DP.f = $defineProperty;
+  __w_pdfjs_require__(122).f = gOPNExt.f = $getOwnPropertyNames;
+  __w_pdfjs_require__(51).f = $propertyIsEnumerable;
+  __w_pdfjs_require__(50).f = $getOwnPropertySymbols;
+  if (DESCRIPTORS && !__w_pdfjs_require__(31)) {
+    redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);
+  }
+  wksExt.f = function (name) {
+    return wrap(wks(name));
+  };
+}
+$export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol });
+for (var es6Symbols = 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'.split(','), j = 0; es6Symbols.length > j;) {
+  wks(es6Symbols[j++]);
+}for (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) {
+  wksDefine(wellKnownSymbols[k++]);
+}$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {
+  'for': function _for(key) {
+    return has(SymbolRegistry, key += '') ? SymbolRegistry[key] : SymbolRegistry[key] = $Symbol(key);
+  },
+  keyFor: function keyFor(sym) {
+    if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');
+    for (var key in SymbolRegistry) {
+      if (SymbolRegistry[key] === sym) return key;
+    }
+  },
+  useSetter: function useSetter() {
+    setter = true;
+  },
+  useSimple: function useSimple() {
+    setter = false;
+  }
+});
+$export($export.S + $export.F * !USE_NATIVE, 'Object', {
+  create: $create,
+  defineProperty: $defineProperty,
+  defineProperties: $defineProperties,
+  getOwnPropertyDescriptor: $getOwnPropertyDescriptor,
+  getOwnPropertyNames: $getOwnPropertyNames,
+  getOwnPropertySymbols: $getOwnPropertySymbols
+});
+$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {
+  var S = $Symbol();
+  return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';
+})), 'JSON', {
+  stringify: function stringify(it) {
+    var args = [it];
+    var i = 1;
+    var replacer, $replacer;
+    while (arguments.length > i) {
+      args.push(arguments[i++]);
+    }$replacer = replacer = args[1];
+    if (!isObject(replacer) && it === undefined || isSymbol(it)) return;
+    if (!isArray(replacer)) replacer = function replacer(key, value) {
+      if (typeof $replacer == 'function') value = $replacer.call(this, key, value);
+      if (!isSymbol(value)) return value;
+    };
+    args[1] = replacer;
+    return _stringify.apply($JSON, args);
+  }
+});
+$Symbol[PROTOTYPE][TO_PRIMITIVE] || __w_pdfjs_require__(11)($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);
+setToStringTag($Symbol, 'Symbol');
+setToStringTag(Math, 'Math', true);
+setToStringTag(global.JSON, 'JSON', true);
+
+/***/ }),
+/* 118 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+exports.f = __w_pdfjs_require__(29);
+
+/***/ }),
+/* 119 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var global = __w_pdfjs_require__(9);
+var core = __w_pdfjs_require__(10);
+var LIBRARY = __w_pdfjs_require__(31);
+var wksExt = __w_pdfjs_require__(118);
+var defineProperty = __w_pdfjs_require__(12).f;
+module.exports = function (name) {
+  var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});
+  if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) });
+};
+
+/***/ }),
+/* 120 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var getKeys = __w_pdfjs_require__(46);
+var gOPS = __w_pdfjs_require__(50);
+var pIE = __w_pdfjs_require__(51);
+module.exports = function (it) {
+  var result = getKeys(it);
+  var getSymbols = gOPS.f;
+  if (getSymbols) {
+    var symbols = getSymbols(it);
+    var isEnum = pIE.f;
+    var i = 0;
+    var key;
+    while (symbols.length > i) {
+      if (isEnum.call(it, key = symbols[i++])) result.push(key);
+    }
+  }
+  return result;
+};
+
+/***/ }),
+/* 121 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+var toIObject = __w_pdfjs_require__(37);
+var gOPN = __w_pdfjs_require__(122).f;
+var toString = {}.toString;
+var windowNames = (typeof window === 'undefined' ? 'undefined' : _typeof(window)) == 'object' && window && Object.getOwnPropertyNames ? Object.getOwnPropertyNames(window) : [];
+var getWindowNames = function getWindowNames(it) {
+  try {
+    return gOPN(it);
+  } catch (e) {
+    return windowNames.slice();
+  }
+};
+module.exports.f = function getOwnPropertyNames(it) {
+  return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));
+};
+
+/***/ }),
+/* 122 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var $keys = __w_pdfjs_require__(47);
+var hiddenKeys = __w_pdfjs_require__(49).concat('length', 'prototype');
+exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {
+  return $keys(O, hiddenKeys);
+};
+
+/***/ }),
+/* 123 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+__w_pdfjs_require__(124);
+module.exports = __w_pdfjs_require__(10).Object.values;
+
+/***/ }),
+/* 124 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var $export = __w_pdfjs_require__(8);
+var $values = __w_pdfjs_require__(125)(false);
+$export($export.S, 'Object', {
+  values: function values(it) {
+    return $values(it);
+  }
+});
+
+/***/ }),
+/* 125 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var getKeys = __w_pdfjs_require__(46);
+var toIObject = __w_pdfjs_require__(37);
+var isEnum = __w_pdfjs_require__(51).f;
+module.exports = function (isEntries) {
+  return function (it) {
+    var O = toIObject(it);
+    var keys = getKeys(O);
+    var length = keys.length;
+    var i = 0;
+    var result = [];
+    var key;
+    while (length > i) {
+      if (isEnum.call(O, key = keys[i++])) {
+        result.push(isEntries ? [key, O[key]] : O[key]);
+      }
+    }return result;
+  };
+};
+
+/***/ }),
+/* 126 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var isReadableStreamSupported = false;
+if (typeof ReadableStream !== 'undefined') {
+  try {
+    new ReadableStream({
+      start: function start(controller) {
+        controller.close();
+      }
+    });
+    isReadableStreamSupported = true;
+  } catch (e) {}
+}
+if (isReadableStreamSupported) {
+  exports.ReadableStream = ReadableStream;
+} else {
+  exports.ReadableStream = __w_pdfjs_require__(127).ReadableStream;
+}
+
+/***/ }),
+/* 127 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+(function (e, a) {
+  for (var i in a) {
+    e[i] = a[i];
+  }
+})(exports, function (modules) {
+  var installedModules = {};
+  function __w_pdfjs_require__(moduleId) {
+    if (installedModules[moduleId]) return installedModules[moduleId].exports;
+    var module = installedModules[moduleId] = {
+      i: moduleId,
+      l: false,
+      exports: {}
+    };
+    modules[moduleId].call(module.exports, module, module.exports, __w_pdfjs_require__);
+    module.l = true;
+    return module.exports;
+  }
+  __w_pdfjs_require__.m = modules;
+  __w_pdfjs_require__.c = installedModules;
+  __w_pdfjs_require__.i = function (value) {
+    return value;
+  };
+  __w_pdfjs_require__.d = function (exports, name, getter) {
+    if (!__w_pdfjs_require__.o(exports, name)) {
+      Object.defineProperty(exports, name, {
+        configurable: false,
+        enumerable: true,
+        get: getter
+      });
+    }
+  };
+  __w_pdfjs_require__.n = function (module) {
+    var getter = module && module.__esModule ? function getDefault() {
+      return module['default'];
+    } : function getModuleExports() {
+      return module;
+    };
+    __w_pdfjs_require__.d(getter, 'a', getter);
+    return getter;
+  };
+  __w_pdfjs_require__.o = function (object, property) {
+    return Object.prototype.hasOwnProperty.call(object, property);
+  };
+  __w_pdfjs_require__.p = "";
+  return __w_pdfjs_require__(__w_pdfjs_require__.s = 7);
+}([function (module, exports, __w_pdfjs_require__) {
+  "use strict";
+
+  var _typeof = typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol" ? function (obj) {
+    return typeof obj === 'undefined' ? 'undefined' : _typeof2(obj);
+  } : function (obj) {
+    return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj === 'undefined' ? 'undefined' : _typeof2(obj);
+  };
+  var _require = __w_pdfjs_require__(1),
+      assert = _require.assert;
+  function IsPropertyKey(argument) {
+    return typeof argument === 'string' || (typeof argument === 'undefined' ? 'undefined' : _typeof(argument)) === 'symbol';
+  }
+  exports.typeIsObject = function (x) {
+    return (typeof x === 'undefined' ? 'undefined' : _typeof(x)) === 'object' && x !== null || typeof x === 'function';
+  };
+  exports.createDataProperty = function (o, p, v) {
+    assert(exports.typeIsObject(o));
+    Object.defineProperty(o, p, {
+      value: v,
+      writable: true,
+      enumerable: true,
+      configurable: true
+    });
+  };
+  exports.createArrayFromList = function (elements) {
+    return elements.slice();
+  };
+  exports.ArrayBufferCopy = function (dest, destOffset, src, srcOffset, n) {
+    new Uint8Array(dest).set(new Uint8Array(src, srcOffset, n), destOffset);
+  };
+  exports.CreateIterResultObject = function (value, done) {
+    assert(typeof done === 'boolean');
+    var obj = {};
+    Object.defineProperty(obj, 'value', {
+      value: value,
+      enumerable: true,
+      writable: true,
+      configurable: true
+    });
+    Object.defineProperty(obj, 'done', {
+      value: done,
+      enumerable: true,
+      writable: true,
+      configurable: true
+    });
+    return obj;
+  };
+  exports.IsFiniteNonNegativeNumber = function (v) {
+    if (Number.isNaN(v)) {
+      return false;
+    }
+    if (v === Infinity) {
+      return false;
+    }
+    if (v < 0) {
+      return false;
+    }
+    return true;
+  };
+  function Call(F, V, args) {
+    if (typeof F !== 'function') {
+      throw new TypeError('Argument is not a function');
+    }
+    return Function.prototype.apply.call(F, V, args);
+  }
+  exports.InvokeOrNoop = function (O, P, args) {
+    assert(O !== undefined);
+    assert(IsPropertyKey(P));
+    assert(Array.isArray(args));
+    var method = O[P];
+    if (method === undefined) {
+      return undefined;
+    }
+    return Call(method, O, args);
+  };
+  exports.PromiseInvokeOrNoop = function (O, P, args) {
+    assert(O !== undefined);
+    assert(IsPropertyKey(P));
+    assert(Array.isArray(args));
+    try {
+      return Promise.resolve(exports.InvokeOrNoop(O, P, args));
+    } catch (returnValueE) {
+      return Promise.reject(returnValueE);
+    }
+  };
+  exports.PromiseInvokeOrPerformFallback = function (O, P, args, F, argsF) {
+    assert(O !== undefined);
+    assert(IsPropertyKey(P));
+    assert(Array.isArray(args));
+    assert(Array.isArray(argsF));
+    var method = void 0;
+    try {
+      method = O[P];
+    } catch (methodE) {
+      return Promise.reject(methodE);
+    }
+    if (method === undefined) {
+      return F.apply(null, argsF);
+    }
+    try {
+      return Promise.resolve(Call(method, O, args));
+    } catch (e) {
+      return Promise.reject(e);
+    }
+  };
+  exports.TransferArrayBuffer = function (O) {
+    return O.slice();
+  };
+  exports.ValidateAndNormalizeHighWaterMark = function (highWaterMark) {
+    highWaterMark = Number(highWaterMark);
+    if (Number.isNaN(highWaterMark) || highWaterMark < 0) {
+      throw new RangeError('highWaterMark property of a queuing strategy must be non-negative and non-NaN');
+    }
+    return highWaterMark;
+  };
+  exports.ValidateAndNormalizeQueuingStrategy = function (size, highWaterMark) {
+    if (size !== undefined && typeof size !== 'function') {
+      throw new TypeError('size property of a queuing strategy must be a function');
+    }
+    highWaterMark = exports.ValidateAndNormalizeHighWaterMark(highWaterMark);
+    return {
+      size: size,
+      highWaterMark: highWaterMark
+    };
+  };
+}, function (module, exports, __w_pdfjs_require__) {
+  "use strict";
+
+  function rethrowAssertionErrorRejection(e) {
+    if (e && e.constructor === AssertionError) {
+      setTimeout(function () {
+        throw e;
+      }, 0);
+    }
+  }
+  function AssertionError(message) {
+    this.name = 'AssertionError';
+    this.message = message || '';
+    this.stack = new Error().stack;
+  }
+  AssertionError.prototype = Object.create(Error.prototype);
+  AssertionError.prototype.constructor = AssertionError;
+  function assert(value, message) {
+    if (!value) {
+      throw new AssertionError(message);
+    }
+  }
+  module.exports = {
+    rethrowAssertionErrorRejection: rethrowAssertionErrorRejection,
+    AssertionError: AssertionError,
+    assert: assert
+  };
+}, function (module, exports, __w_pdfjs_require__) {
+  "use strict";
+
+  var _createClass = function () {
+    function defineProperties(target, props) {
+      for (var i = 0; i < props.length; i++) {
+        var descriptor = props[i];
+        descriptor.enumerable = descriptor.enumerable || false;
+        descriptor.configurable = true;
+        if ("value" in descriptor) descriptor.writable = true;
+        Object.defineProperty(target, descriptor.key, descriptor);
+      }
+    }
+    return function (Constructor, protoProps, staticProps) {
+      if (protoProps) defineProperties(Constructor.prototype, protoProps);
+      if (staticProps) defineProperties(Constructor, staticProps);
+      return Constructor;
+    };
+  }();
+  function _classCallCheck(instance, Constructor) {
+    if (!(instance instanceof Constructor)) {
+      throw new TypeError("Cannot call a class as a function");
+    }
+  }
+  var _require = __w_pdfjs_require__(0),
+      InvokeOrNoop = _require.InvokeOrNoop,
+      PromiseInvokeOrNoop = _require.PromiseInvokeOrNoop,
+      ValidateAndNormalizeQueuingStrategy = _require.ValidateAndNormalizeQueuingStrategy,
+      typeIsObject = _require.typeIsObject;
+  var _require2 = __w_pdfjs_require__(1),
+      assert = _require2.assert,
+      rethrowAssertionErrorRejection = _require2.rethrowAssertionErrorRejection;
+  var _require3 = __w_pdfjs_require__(3),
+      DequeueValue = _require3.DequeueValue,
+      EnqueueValueWithSize = _require3.EnqueueValueWithSize,
+      PeekQueueValue = _require3.PeekQueueValue,
+      ResetQueue = _require3.ResetQueue;
+  var WritableStream = function () {
+    function WritableStream() {
+      var underlyingSink = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+      var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
+          size = _ref.size,
+          _ref$highWaterMark = _ref.highWaterMark,
+          highWaterMark = _ref$highWaterMark === undefined ? 1 : _ref$highWaterMark;
+      _classCallCheck(this, WritableStream);
+      this._state = 'writable';
+      this._storedError = undefined;
+      this._writer = undefined;
+      this._writableStreamController = undefined;
+      this._writeRequests = [];
+      this._inFlightWriteRequest = undefined;
+      this._closeRequest = undefined;
+      this._inFlightCloseRequest = undefined;
+      this._pendingAbortRequest = undefined;
+      this._backpressure = false;
+      var type = underlyingSink.type;
+      if (type !== undefined) {
+        throw new RangeError('Invalid type is specified');
+      }
+      this._writableStreamController = new WritableStreamDefaultController(this, underlyingSink, size, highWaterMark);
+      this._writableStreamController.__startSteps();
+    }
+    _createClass(WritableStream, [{
+      key: 'abort',
+      value: function abort(reason) {
+        if (IsWritableStream(this) === false) {
+          return Promise.reject(streamBrandCheckException('abort'));
+        }
+        if (IsWritableStreamLocked(this) === true) {
+          return Promise.reject(new TypeError('Cannot abort a stream that already has a writer'));
+        }
+        return WritableStreamAbort(this, reason);
+      }
+    }, {
+      key: 'getWriter',
+      value: function getWriter() {
+        if (IsWritableStream(this) === false) {
+          throw streamBrandCheckException('getWriter');
+        }
+        return AcquireWritableStreamDefaultWriter(this);
+      }
+    }, {
+      key: 'locked',
+      get: function get() {
+        if (IsWritableStream(this) === false) {
+          throw streamBrandCheckException('locked');
+        }
+        return IsWritableStreamLocked(this);
+      }
+    }]);
+    return WritableStream;
+  }();
+  module.exports = {
+    AcquireWritableStreamDefaultWriter: AcquireWritableStreamDefaultWriter,
+    IsWritableStream: IsWritableStream,
+    IsWritableStreamLocked: IsWritableStreamLocked,
+    WritableStream: WritableStream,
+    WritableStreamAbort: WritableStreamAbort,
+    WritableStreamDefaultControllerError: WritableStreamDefaultControllerError,
+    WritableStreamDefaultWriterCloseWithErrorPropagation: WritableStreamDefaultWriterCloseWithErrorPropagation,
+    WritableStreamDefaultWriterRelease: WritableStreamDefaultWriterRelease,
+    WritableStreamDefaultWriterWrite: WritableStreamDefaultWriterWrite,
+    WritableStreamCloseQueuedOrInFlight: WritableStreamCloseQueuedOrInFlight
+  };
+  function AcquireWritableStreamDefaultWriter(stream) {
+    return new WritableStreamDefaultWriter(stream);
+  }
+  function IsWritableStream(x) {
+    if (!typeIsObject(x)) {
+      return false;
+    }
+    if (!Object.prototype.hasOwnProperty.call(x, '_writableStreamController')) {
+      return false;
+    }
+    return true;
+  }
+  function IsWritableStreamLocked(stream) {
+    assert(IsWritableStream(stream) === true, 'IsWritableStreamLocked should only be used on known writable streams');
+    if (stream._writer === undefined) {
+      return false;
+    }
+    return true;
+  }
+  function WritableStreamAbort(stream, reason) {
+    var state = stream._state;
+    if (state === 'closed') {
+      return Promise.resolve(undefined);
+    }
+    if (state === 'errored') {
+      return Promise.reject(stream._storedError);
+    }
+    var error = new TypeError('Requested to abort');
+    if (stream._pendingAbortRequest !== undefined) {
+      return Promise.reject(error);
+    }
+    assert(state === 'writable' || state === 'erroring', 'state must be writable or erroring');
+    var wasAlreadyErroring = false;
+    if (state === 'erroring') {
+      wasAlreadyErroring = true;
+      reason = undefined;
+    }
+    var promise = new Promise(function (resolve, reject) {
+      stream._pendingAbortRequest = {
+        _resolve: resolve,
+        _reject: reject,
+        _reason: reason,
+        _wasAlreadyErroring: wasAlreadyErroring
+      };
+    });
+    if (wasAlreadyErroring === false) {
+      WritableStreamStartErroring(stream, error);
+    }
+    return promise;
+  }
+  function WritableStreamAddWriteRequest(stream) {
+    assert(IsWritableStreamLocked(stream) === true);
+    assert(stream._state === 'writable');
+    var promise = new Promise(function (resolve, reject) {
+      var writeRequest = {
+        _resolve: resolve,
+        _reject: reject
+      };
+      stream._writeRequests.push(writeRequest);
+    });
+    return promise;
+  }
+  function WritableStreamDealWithRejection(stream, error) {
+    var state = stream._state;
+    if (state === 'writable') {
+      WritableStreamStartErroring(stream, error);
+      return;
+    }
+    assert(state === 'erroring');
+    WritableStreamFinishErroring(stream);
+  }
+  function WritableStreamStartErroring(stream, reason) {
+    assert(stream._storedError === undefined, 'stream._storedError === undefined');
+    assert(stream._state === 'writable', 'state must be writable');
+    var controller = stream._writableStreamController;
+    assert(controller !== undefined, 'controller must not be undefined');
+    stream._state = 'erroring';
+    stream._storedError = reason;
+    var writer = stream._writer;
+    if (writer !== undefined) {
+      WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, reason);
+    }
+    if (WritableStreamHasOperationMarkedInFlight(stream) === false && controller._started === true) {
+      WritableStreamFinishErroring(stream);
+    }
+  }
+  function WritableStreamFinishErroring(stream) {
+    assert(stream._state === 'erroring', 'stream._state === erroring');
+    assert(WritableStreamHasOperationMarkedInFlight(stream) === false, 'WritableStreamHasOperationMarkedInFlight(stream) === false');
+    stream._state = 'errored';
+    stream._writableStreamController.__errorSteps();
+    var storedError = stream._storedError;
+    for (var i = 0; i < stream._writeRequests.length; i++) {
+      var writeRequest = stream._writeRequests[i];
+      writeRequest._reject(storedError);
+    }
+    stream._writeRequests = [];
+    if (stream._pendingAbortRequest === undefined) {
+      WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);
+      return;
+    }
+    var abortRequest = stream._pendingAbortRequest;
+    stream._pendingAbortRequest = undefined;
+    if (abortRequest._wasAlreadyErroring === true) {
+      abortRequest._reject(storedError);
+      WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);
+      return;
+    }
+    var promise = stream._writableStreamController.__abortSteps(abortRequest._reason);
+    promise.then(function () {
+      abortRequest._resolve();
+      WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);
+    }, function (reason) {
+      abortRequest._reject(reason);
+      WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);
+    });
+  }
+  function WritableStreamFinishInFlightWrite(stream) {
+    assert(stream._inFlightWriteRequest !== undefined);
+    stream._inFlightWriteRequest._resolve(undefined);
+    stream._inFlightWriteRequest = undefined;
+  }
+  function WritableStreamFinishInFlightWriteWithError(stream, error) {
+    assert(stream._inFlightWriteRequest !== undefined);
+    stream._inFlightWriteRequest._reject(error);
+    stream._inFlightWriteRequest = undefined;
+    assert(stream._state === 'writable' || stream._state === 'erroring');
+    WritableStreamDealWithRejection(stream, error);
+  }
+  function WritableStreamFinishInFlightClose(stream) {
+    assert(stream._inFlightCloseRequest !== undefined);
+    stream._inFlightCloseRequest._resolve(undefined);
+    stream._inFlightCloseRequest = undefined;
+    var state = stream._state;
+    assert(state === 'writable' || state === 'erroring');
+    if (state === 'erroring') {
+      stream._storedError = undefined;
+      if (stream._pendingAbortRequest !== undefined) {
+        stream._pendingAbortRequest._resolve();
+        stream._pendingAbortRequest = undefined;
+      }
+    }
+    stream._state = 'closed';
+    var writer = stream._writer;
+    if (writer !== undefined) {
+      defaultWriterClosedPromiseResolve(writer);
+    }
+    assert(stream._pendingAbortRequest === undefined, 'stream._pendingAbortRequest === undefined');
+    assert(stream._storedError === undefined, 'stream._storedError === undefined');
+  }
+  function WritableStreamFinishInFlightCloseWithError(stream, error) {
+    assert(stream._inFlightCloseRequest !== undefined);
+    stream._inFlightCloseRequest._reject(error);
+    stream._inFlightCloseRequest = undefined;
+    assert(stream._state === 'writable' || stream._state === 'erroring');
+    if (stream._pendingAbortRequest !== undefined) {
+      stream._pendingAbortRequest._reject(error);
+      stream._pendingAbortRequest = undefined;
+    }
+    WritableStreamDealWithRejection(stream, error);
+  }
+  function WritableStreamCloseQueuedOrInFlight(stream) {
+    if (stream._closeRequest === undefined && stream._inFlightCloseRequest === undefined) {
+      return false;
+    }
+    return true;
+  }
+  function WritableStreamHasOperationMarkedInFlight(stream) {
+    if (stream._inFlightWriteRequest === undefined && stream._inFlightCloseRequest === undefined) {
+      return false;
+    }
+    return true;
+  }
+  function WritableStreamMarkCloseRequestInFlight(stream) {
+    assert(stream._inFlightCloseRequest === undefined);
+    assert(stream._closeRequest !== undefined);
+    stream._inFlightCloseRequest = stream._closeRequest;
+    stream._closeRequest = undefined;
+  }
+  function WritableStreamMarkFirstWriteRequestInFlight(stream) {
+    assert(stream._inFlightWriteRequest === undefined, 'there must be no pending write request');
+    assert(stream._writeRequests.length !== 0, 'writeRequests must not be empty');
+    stream._inFlightWriteRequest = stream._writeRequests.shift();
+  }
+  function WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream) {
+    assert(stream._state === 'errored', '_stream_.[[state]] is `"errored"`');
+    if (stream._closeRequest !== undefined) {
+      assert(stream._inFlightCloseRequest === undefined);
+      stream._closeRequest._reject(stream._storedError);
+      stream._closeRequest = undefined;
+    }
+    var writer = stream._writer;
+    if (writer !== undefined) {
+      defaultWriterClosedPromiseReject(writer, stream._storedError);
+      writer._closedPromise.catch(function () {});
+    }
+  }
+  function WritableStreamUpdateBackpressure(stream, backpressure) {
+    assert(stream._state === 'writable');
+    assert(WritableStreamCloseQueuedOrInFlight(stream) === false);
+    var writer = stream._writer;
+    if (writer !== undefined && backpressure !== stream._backpressure) {
+      if (backpressure === true) {
+        defaultWriterReadyPromiseReset(writer);
+      } else {
+        assert(backpressure === false);
+        defaultWriterReadyPromiseResolve(writer);
+      }
+    }
+    stream._backpressure = backpressure;
+  }
+  var WritableStreamDefaultWriter = function () {
+    function WritableStreamDefaultWriter(stream) {
+      _classCallCheck(this, WritableStreamDefaultWriter);
+      if (IsWritableStream(stream) === false) {
+        throw new TypeError('WritableStreamDefaultWriter can only be constructed with a WritableStream instance');
+      }
+      if (IsWritableStreamLocked(stream) === true) {
+        throw new TypeError('This stream has already been locked for exclusive writing by another writer');
+      }
+      this._ownerWritableStream = stream;
+      stream._writer = this;
+      var state = stream._state;
+      if (state === 'writable') {
+        if (WritableStreamCloseQueuedOrInFlight(stream) === false && stream._backpressure === true) {
+          defaultWriterReadyPromiseInitialize(this);
+        } else {
+          defaultWriterReadyPromiseInitializeAsResolved(this);
+        }
+        defaultWriterClosedPromiseInitialize(this);
+      } else if (state === 'erroring') {
+        defaultWriterReadyPromiseInitializeAsRejected(this, stream._storedError);
+        this._readyPromise.catch(function () {});
+        defaultWriterClosedPromiseInitialize(this);
+      } else if (state === 'closed') {
+        defaultWriterReadyPromiseInitializeAsResolved(this);
+        defaultWriterClosedPromiseInitializeAsResolved(this);
+      } else {
+        assert(state === 'errored', 'state must be errored');
+        var storedError = stream._storedError;
+        defaultWriterReadyPromiseInitializeAsRejected(this, storedError);
+        this._readyPromise.catch(function () {});
+        defaultWriterClosedPromiseInitializeAsRejected(this, storedError);
+        this._closedPromise.catch(function () {});
+      }
+    }
+    _createClass(WritableStreamDefaultWriter, [{
+      key: 'abort',
+      value: function abort(reason) {
+        if (IsWritableStreamDefaultWriter(this) === false) {
+          return Promise.reject(defaultWriterBrandCheckException('abort'));
+        }
+        if (this._ownerWritableStream === undefined) {
+          return Promise.reject(defaultWriterLockException('abort'));
+        }
+        return WritableStreamDefaultWriterAbort(this, reason);
+      }
+    }, {
+      key: 'close',
+      value: function close() {
+        if (IsWritableStreamDefaultWriter(this) === false) {
+          return Promise.reject(defaultWriterBrandCheckException('close'));
+        }
+        var stream = this._ownerWritableStream;
+        if (stream === undefined) {
+          return Promise.reject(defaultWriterLockException('close'));
+        }
+        if (WritableStreamCloseQueuedOrInFlight(stream) === true) {
+          return Promise.reject(new TypeError('cannot close an already-closing stream'));
+        }
+        return WritableStreamDefaultWriterClose(this);
+      }
+    }, {
+      key: 'releaseLock',
+      value: function releaseLock() {
+        if (IsWritableStreamDefaultWriter(this) === false) {
+          throw defaultWriterBrandCheckException('releaseLock');
+        }
+        var stream = this._ownerWritableStream;
+        if (stream === undefined) {
+          return;
+        }
+        assert(stream._writer !== undefined);
+        WritableStreamDefaultWriterRelease(this);
+      }
+    }, {
+      key: 'write',
+      value: function write(chunk) {
+        if (IsWritableStreamDefaultWriter(this) === false) {
+          return Promise.reject(defaultWriterBrandCheckException('write'));
+        }
+        if (this._ownerWritableStream === undefined) {
+          return Promise.reject(defaultWriterLockException('write to'));
+        }
+        return WritableStreamDefaultWriterWrite(this, chunk);
+      }
+    }, {
+      key: 'closed',
+      get: function get() {
+        if (IsWritableStreamDefaultWriter(this) === false) {
+          return Promise.reject(defaultWriterBrandCheckException('closed'));
+        }
+        return this._closedPromise;
+      }
+    }, {
+      key: 'desiredSize',
+      get: function get() {
+        if (IsWritableStreamDefaultWriter(this) === false) {
+          throw defaultWriterBrandCheckException('desiredSize');
+        }
+        if (this._ownerWritableStream === undefined) {
+          throw defaultWriterLockException('desiredSize');
+        }
+        return WritableStreamDefaultWriterGetDesiredSize(this);
+      }
+    }, {
+      key: 'ready',
+      get: function get() {
+        if (IsWritableStreamDefaultWriter(this) === false) {
+          return Promise.reject(defaultWriterBrandCheckException('ready'));
+        }
+        return this._readyPromise;
+      }
+    }]);
+    return WritableStreamDefaultWriter;
+  }();
+  function IsWritableStreamDefaultWriter(x) {
+    if (!typeIsObject(x)) {
+      return false;
+    }
+    if (!Object.prototype.hasOwnProperty.call(x, '_ownerWritableStream')) {
+      return false;
+    }
+    return true;
+  }
+  function WritableStreamDefaultWriterAbort(writer, reason) {
+    var stream = writer._ownerWritableStream;
+    assert(stream !== undefined);
+    return WritableStreamAbort(stream, reason);
+  }
+  function WritableStreamDefaultWriterClose(writer) {
+    var stream = writer._ownerWritableStream;
+    assert(stream !== undefined);
+    var state = stream._state;
+    if (state === 'closed' || state === 'errored') {
+      return Promise.reject(new TypeError('The stream (in ' + state + ' state) is not in the writable state and cannot be closed'));
+    }
+    assert(state === 'writable' || state === 'erroring');
+    assert(WritableStreamCloseQueuedOrInFlight(stream) === false);
+    var promise = new Promise(function (resolve, reject) {
+      var closeRequest = {
+        _resolve: resolve,
+        _reject: reject
+      };
+      stream._closeRequest = closeRequest;
+    });
+    if (stream._backpressure === true && state === 'writable') {
+      defaultWriterReadyPromiseResolve(writer);
+    }
+    WritableStreamDefaultControllerClose(stream._writableStreamController);
+    return promise;
+  }
+  function WritableStreamDefaultWriterCloseWithErrorPropagation(writer) {
+    var stream = writer._ownerWritableStream;
+    assert(stream !== undefined);
+    var state = stream._state;
+    if (WritableStreamCloseQueuedOrInFlight(stream) === true || state === 'closed') {
+      return Promise.resolve();
+    }
+    if (state === 'errored') {
+      return Promise.reject(stream._storedError);
+    }
+    assert(state === 'writable' || state === 'erroring');
+    return WritableStreamDefaultWriterClose(writer);
+  }
+  function WritableStreamDefaultWriterEnsureClosedPromiseRejected(writer, error) {
+    if (writer._closedPromiseState === 'pending') {
+      defaultWriterClosedPromiseReject(writer, error);
+    } else {
+      defaultWriterClosedPromiseResetToRejected(writer, error);
+    }
+    writer._closedPromise.catch(function () {});
+  }
+  function WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, error) {
+    if (writer._readyPromiseState === 'pending') {
+      defaultWriterReadyPromiseReject(writer, error);
+    } else {
+      defaultWriterReadyPromiseResetToRejected(writer, error);
+    }
+    writer._readyPromise.catch(function () {});
+  }
+  function WritableStreamDefaultWriterGetDesiredSize(writer) {
+    var stream = writer._ownerWritableStream;
+    var state = stream._state;
+    if (state === 'errored' || state === 'erroring') {
+      return null;
+    }
+    if (state === 'closed') {
+      return 0;
+    }
+    return WritableStreamDefaultControllerGetDesiredSize(stream._writableStreamController);
+  }
+  function WritableStreamDefaultWriterRelease(writer) {
+    var stream = writer._ownerWritableStream;
+    assert(stream !== undefined);
+    assert(stream._writer === writer);
+    var releasedError = new TypeError('Writer was released and can no longer be used to monitor the stream\'s closedness');
+    WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, releasedError);
+    WritableStreamDefaultWriterEnsureClosedPromiseRejected(writer, releasedError);
+    stream._writer = undefined;
+    writer._ownerWritableStream = undefined;
+  }
+  function WritableStreamDefaultWriterWrite(writer, chunk) {
+    var stream = writer._ownerWritableStream;
+    assert(stream !== undefined);
+    var controller = stream._writableStreamController;
+    var chunkSize = WritableStreamDefaultControllerGetChunkSize(controller, chunk);
+    if (stream !== writer._ownerWritableStream) {
+      return Promise.reject(defaultWriterLockException('write to'));
+    }
+    var state = stream._state;
+    if (state === 'errored') {
+      return Promise.reject(stream._storedError);
+    }
+    if (WritableStreamCloseQueuedOrInFlight(stream) === true || state === 'closed') {
+      return Promise.reject(new TypeError('The stream is closing or closed and cannot be written to'));
+    }
+    if (state === 'erroring') {
+      return Promise.reject(stream._storedError);
+    }
+    assert(state === 'writable');
+    var promise = WritableStreamAddWriteRequest(stream);
+    WritableStreamDefaultControllerWrite(controller, chunk, chunkSize);
+    return promise;
+  }
+  var WritableStreamDefaultController = function () {
+    function WritableStreamDefaultController(stream, underlyingSink, size, highWaterMark) {
+      _classCallCheck(this, WritableStreamDefaultController);
+      if (IsWritableStream(stream) === false) {
+        throw new TypeError('WritableStreamDefaultController can only be constructed with a WritableStream instance');
+      }
+      if (stream._writableStreamController !== undefined) {
+        throw new TypeError('WritableStreamDefaultController instances can only be created by the WritableStream constructor');
+      }
+      this._controlledWritableStream = stream;
+      this._underlyingSink = underlyingSink;
+      this._queue = undefined;
+      this._queueTotalSize = undefined;
+      ResetQueue(this);
+      this._started = false;
+      var normalizedStrategy = ValidateAndNormalizeQueuingStrategy(size, highWaterMark);
+      this._strategySize = normalizedStrategy.size;
+      this._strategyHWM = normalizedStrategy.highWaterMark;
+      var backpressure = WritableStreamDefaultControllerGetBackpressure(this);
+      WritableStreamUpdateBackpressure(stream, backpressure);
+    }
+    _createClass(WritableStreamDefaultController, [{
+      key: 'error',
+      value: function error(e) {
+        if (IsWritableStreamDefaultController(this) === false) {
+          throw new TypeError('WritableStreamDefaultController.prototype.error can only be used on a WritableStreamDefaultController');
+        }
+        var state = this._controlledWritableStream._state;
+        if (state !== 'writable') {
+          return;
+        }
+        WritableStreamDefaultControllerError(this, e);
+      }
+    }, {
+      key: '__abortSteps',
+      value: function __abortSteps(reason) {
+        return PromiseInvokeOrNoop(this._underlyingSink, 'abort', [reason]);
+      }
+    }, {
+      key: '__errorSteps',
+      value: function __errorSteps() {
+        ResetQueue(this);
+      }
+    }, {
+      key: '__startSteps',
+      value: function __startSteps() {
+        var _this = this;
+        var startResult = InvokeOrNoop(this._underlyingSink, 'start', [this]);
+        var stream = this._controlledWritableStream;
+        Promise.resolve(startResult).then(function () {
+          assert(stream._state === 'writable' || stream._state === 'erroring');
+          _this._started = true;
+          WritableStreamDefaultControllerAdvanceQueueIfNeeded(_this);
+        }, function (r) {
+          assert(stream._state === 'writable' || stream._state === 'erroring');
+          _this._started = true;
+          WritableStreamDealWithRejection(stream, r);
+        }).catch(rethrowAssertionErrorRejection);
+      }
+    }]);
+    return WritableStreamDefaultController;
+  }();
+  function WritableStreamDefaultControllerClose(controller) {
+    EnqueueValueWithSize(controller, 'close', 0);
+    WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller);
+  }
+  function WritableStreamDefaultControllerGetChunkSize(controller, chunk) {
+    var strategySize = controller._strategySize;
+    if (strategySize === undefined) {
+      return 1;
+    }
+    try {
+      return strategySize(chunk);
+    } catch (chunkSizeE) {
+      WritableStreamDefaultControllerErrorIfNeeded(controller, chunkSizeE);
+      return 1;
+    }
+  }
+  function WritableStreamDefaultControllerGetDesiredSize(controller) {
+    return controller._strategyHWM - controller._queueTotalSize;
+  }
+  function WritableStreamDefaultControllerWrite(controller, chunk, chunkSize) {
+    var writeRecord = { chunk: chunk };
+    try {
+      EnqueueValueWithSize(controller, writeRecord, chunkSize);
+    } catch (enqueueE) {
+      WritableStreamDefaultControllerErrorIfNeeded(controller, enqueueE);
+      return;
+    }
+    var stream = controller._controlledWritableStream;
+    if (WritableStreamCloseQueuedOrInFlight(stream) === false && stream._state === 'writable') {
+      var backpressure = WritableStreamDefaultControllerGetBackpressure(controller);
+      WritableStreamUpdateBackpressure(stream, backpressure);
+    }
+    WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller);
+  }
+  function IsWritableStreamDefaultController(x) {
+    if (!typeIsObject(x)) {
+      return false;
+    }
+    if (!Object.prototype.hasOwnProperty.call(x, '_underlyingSink')) {
+      return false;
+    }
+    return true;
+  }
+  function WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller) {
+    var stream = controller._controlledWritableStream;
+    if (controller._started === false) {
+      return;
+    }
+    if (stream._inFlightWriteRequest !== undefined) {
+      return;
+    }
+    var state = stream._state;
+    if (state === 'closed' || state === 'errored') {
+      return;
+    }
+    if (state === 'erroring') {
+      WritableStreamFinishErroring(stream);
+      return;
+    }
+    if (controller._queue.length === 0) {
+      return;
+    }
+    var writeRecord = PeekQueueValue(controller);
+    if (writeRecord === 'close') {
+      WritableStreamDefaultControllerProcessClose(controller);
+    } else {
+      WritableStreamDefaultControllerProcessWrite(controller, writeRecord.chunk);
+    }
+  }
+  function WritableStreamDefaultControllerErrorIfNeeded(controller, error) {
+    if (controller._controlledWritableStream._state === 'writable') {
+      WritableStreamDefaultControllerError(controller, error);
+    }
+  }
+  function WritableStreamDefaultControllerProcessClose(controller) {
+    var stream = controller._controlledWritableStream;
+    WritableStreamMarkCloseRequestInFlight(stream);
+    DequeueValue(controller);
+    assert(controller._queue.length === 0, 'queue must be empty once the final write record is dequeued');
+    var sinkClosePromise = PromiseInvokeOrNoop(controller._underlyingSink, 'close', []);
+    sinkClosePromise.then(function () {
+      WritableStreamFinishInFlightClose(stream);
+    }, function (reason) {
+      WritableStreamFinishInFlightCloseWithError(stream, reason);
+    }).catch(rethrowAssertionErrorRejection);
+  }
+  function WritableStreamDefaultControllerProcessWrite(controller, chunk) {
+    var stream = controller._controlledWritableStream;
+    WritableStreamMarkFirstWriteRequestInFlight(stream);
+    var sinkWritePromise = PromiseInvokeOrNoop(controller._underlyingSink, 'write', [chunk, controller]);
+    sinkWritePromise.then(function () {
+      WritableStreamFinishInFlightWrite(stream);
+      var state = stream._state;
+      assert(state === 'writable' || state === 'erroring');
+      DequeueValue(controller);
+      if (WritableStreamCloseQueuedOrInFlight(stream) === false && state === 'writable') {
+        var backpressure = WritableStreamDefaultControllerGetBackpressure(controller);
+        WritableStreamUpdateBackpressure(stream, backpressure);
+      }
+      WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller);
+    }, function (reason) {
+      WritableStreamFinishInFlightWriteWithError(stream, reason);
+    }).catch(rethrowAssertionErrorRejection);
+  }
+  function WritableStreamDefaultControllerGetBackpressure(controller) {
+    var desiredSize = WritableStreamDefaultControllerGetDesiredSize(controller);
+    return desiredSize <= 0;
+  }
+  function WritableStreamDefaultControllerError(controller, error) {
+    var stream = controller._controlledWritableStream;
+    assert(stream._state === 'writable');
+    WritableStreamStartErroring(stream, error);
+  }
+  function streamBrandCheckException(name) {
+    return new TypeError('WritableStream.prototype.' + name + ' can only be used on a WritableStream');
+  }
+  function defaultWriterBrandCheckException(name) {
+    return new TypeError('WritableStreamDefaultWriter.prototype.' + name + ' can only be used on a WritableStreamDefaultWriter');
+  }
+  function defaultWriterLockException(name) {
+    return new TypeError('Cannot ' + name + ' a stream using a released writer');
+  }
+  function defaultWriterClosedPromiseInitialize(writer) {
+    writer._closedPromise = new Promise(function (resolve, reject) {
+      writer._closedPromise_resolve = resolve;
+      writer._closedPromise_reject = reject;
+      writer._closedPromiseState = 'pending';
+    });
+  }
+  function defaultWriterClosedPromiseInitializeAsRejected(writer, reason) {
+    writer._closedPromise = Promise.reject(reason);
+    writer._closedPromise_resolve = undefined;
+    writer._closedPromise_reject = undefined;
+    writer._closedPromiseState = 'rejected';
+  }
+  function defaultWriterClosedPromiseInitializeAsResolved(writer) {
+    writer._closedPromise = Promise.resolve(undefined);
+    writer._closedPromise_resolve = undefined;
+    writer._closedPromise_reject = undefined;
+    writer._closedPromiseState = 'resolved';
+  }
+  function defaultWriterClosedPromiseReject(writer, reason) {
+    assert(writer._closedPromise_resolve !== undefined, 'writer._closedPromise_resolve !== undefined');
+    assert(writer._closedPromise_reject !== undefined, 'writer._closedPromise_reject !== undefined');
+    assert(writer._closedPromiseState === 'pending', 'writer._closedPromiseState is pending');
+    writer._closedPromise_reject(reason);
+    writer._closedPromise_resolve = undefined;
+    writer._closedPromise_reject = undefined;
+    writer._closedPromiseState = 'rejected';
+  }
+  function defaultWriterClosedPromiseResetToRejected(writer, reason) {
+    assert(writer._closedPromise_resolve === undefined, 'writer._closedPromise_resolve === undefined');
+    assert(writer._closedPromise_reject === undefined, 'writer._closedPromise_reject === undefined');
+    assert(writer._closedPromiseState !== 'pending', 'writer._closedPromiseState is not pending');
+    writer._closedPromise = Promise.reject(reason);
+    writer._closedPromiseState = 'rejected';
+  }
+  function defaultWriterClosedPromiseResolve(writer) {
+    assert(writer._closedPromise_resolve !== undefined, 'writer._closedPromise_resolve !== undefined');
+    assert(writer._closedPromise_reject !== undefined, 'writer._closedPromise_reject !== undefined');
+    assert(writer._closedPromiseState === 'pending', 'writer._closedPromiseState is pending');
+    writer._closedPromise_resolve(undefined);
+    writer._closedPromise_resolve = undefined;
+    writer._closedPromise_reject = undefined;
+    writer._closedPromiseState = 'resolved';
+  }
+  function defaultWriterReadyPromiseInitialize(writer) {
+    writer._readyPromise = new Promise(function (resolve, reject) {
+      writer._readyPromise_resolve = resolve;
+      writer._readyPromise_reject = reject;
+    });
+    writer._readyPromiseState = 'pending';
+  }
+  function defaultWriterReadyPromiseInitializeAsRejected(writer, reason) {
+    writer._readyPromise = Promise.reject(reason);
+    writer._readyPromise_resolve = undefined;
+    writer._readyPromise_reject = undefined;
+    writer._readyPromiseState = 'rejected';
+  }
+  function defaultWriterReadyPromiseInitializeAsResolved(writer) {
+    writer._readyPromise = Promise.resolve(undefined);
+    writer._readyPromise_resolve = undefined;
+    writer._readyPromise_reject = undefined;
+    writer._readyPromiseState = 'fulfilled';
+  }
+  function defaultWriterReadyPromiseReject(writer, reason) {
+    assert(writer._readyPromise_resolve !== undefined, 'writer._readyPromise_resolve !== undefined');
+    assert(writer._readyPromise_reject !== undefined, 'writer._readyPromise_reject !== undefined');
+    writer._readyPromise_reject(reason);
+    writer._readyPromise_resolve = undefined;
+    writer._readyPromise_reject = undefined;
+    writer._readyPromiseState = 'rejected';
+  }
+  function defaultWriterReadyPromiseReset(writer) {
+    assert(writer._readyPromise_resolve === undefined, 'writer._readyPromise_resolve === undefined');
+    assert(writer._readyPromise_reject === undefined, 'writer._readyPromise_reject === undefined');
+    writer._readyPromise = new Promise(function (resolve, reject) {
+      writer._readyPromise_resolve = resolve;
+      writer._readyPromise_reject = reject;
+    });
+    writer._readyPromiseState = 'pending';
+  }
+  function defaultWriterReadyPromiseResetToRejected(writer, reason) {
+    assert(writer._readyPromise_resolve === undefined, 'writer._readyPromise_resolve === undefined');
+    assert(writer._readyPromise_reject === undefined, 'writer._readyPromise_reject === undefined');
+    writer._readyPromise = Promise.reject(reason);
+    writer._readyPromiseState = 'rejected';
+  }
+  function defaultWriterReadyPromiseResolve(writer) {
+    assert(writer._readyPromise_resolve !== undefined, 'writer._readyPromise_resolve !== undefined');
+    assert(writer._readyPromise_reject !== undefined, 'writer._readyPromise_reject !== undefined');
+    writer._readyPromise_resolve(undefined);
+    writer._readyPromise_resolve = undefined;
+    writer._readyPromise_reject = undefined;
+    writer._readyPromiseState = 'fulfilled';
+  }
+}, function (module, exports, __w_pdfjs_require__) {
+  "use strict";
+
+  var _require = __w_pdfjs_require__(0),
+      IsFiniteNonNegativeNumber = _require.IsFiniteNonNegativeNumber;
+  var _require2 = __w_pdfjs_require__(1),
+      assert = _require2.assert;
+  exports.DequeueValue = function (container) {
+    assert('_queue' in container && '_queueTotalSize' in container, 'Spec-level failure: DequeueValue should only be used on containers with [[queue]] and [[queueTotalSize]].');
+    assert(container._queue.length > 0, 'Spec-level failure: should never dequeue from an empty queue.');
+    var pair = container._queue.shift();
+    container._queueTotalSize -= pair.size;
+    if (container._queueTotalSize < 0) {
+      container._queueTotalSize = 0;
+    }
+    return pair.value;
+  };
+  exports.EnqueueValueWithSize = function (container, value, size) {
+    assert('_queue' in container && '_queueTotalSize' in container, 'Spec-level failure: EnqueueValueWithSize should only be used on containers with [[queue]] and ' + '[[queueTotalSize]].');
+    size = Number(size);
+    if (!IsFiniteNonNegativeNumber(size)) {
+      throw new RangeError('Size must be a finite, non-NaN, non-negative number.');
+    }
+    container._queue.push({
+      value: value,
+      size: size
+    });
+    container._queueTotalSize += size;
+  };
+  exports.PeekQueueValue = function (container) {
+    assert('_queue' in container && '_queueTotalSize' in container, 'Spec-level failure: PeekQueueValue should only be used on containers with [[queue]] and [[queueTotalSize]].');
+    assert(container._queue.length > 0, 'Spec-level failure: should never peek at an empty queue.');
+    var pair = container._queue[0];
+    return pair.value;
+  };
+  exports.ResetQueue = function (container) {
+    assert('_queue' in container && '_queueTotalSize' in container, 'Spec-level failure: ResetQueue should only be used on containers with [[queue]] and [[queueTotalSize]].');
+    container._queue = [];
+    container._queueTotalSize = 0;
+  };
+}, function (module, exports, __w_pdfjs_require__) {
+  "use strict";
+
+  var _createClass = function () {
+    function defineProperties(target, props) {
+      for (var i = 0; i < props.length; i++) {
+        var descriptor = props[i];
+        descriptor.enumerable = descriptor.enumerable || false;
+        descriptor.configurable = true;
+        if ("value" in descriptor) descriptor.writable = true;
+        Object.defineProperty(target, descriptor.key, descriptor);
+      }
+    }
+    return function (Constructor, protoProps, staticProps) {
+      if (protoProps) defineProperties(Constructor.prototype, protoProps);
+      if (staticProps) defineProperties(Constructor, staticProps);
+      return Constructor;
+    };
+  }();
+  function _classCallCheck(instance, Constructor) {
+    if (!(instance instanceof Constructor)) {
+      throw new TypeError("Cannot call a class as a function");
+    }
+  }
+  var _require = __w_pdfjs_require__(0),
+      ArrayBufferCopy = _require.ArrayBufferCopy,
+      CreateIterResultObject = _require.CreateIterResultObject,
+      IsFiniteNonNegativeNumber = _require.IsFiniteNonNegativeNumber,
+      InvokeOrNoop = _require.InvokeOrNoop,
+      PromiseInvokeOrNoop = _require.PromiseInvokeOrNoop,
+      TransferArrayBuffer = _require.TransferArrayBuffer,
+      ValidateAndNormalizeQueuingStrategy = _require.ValidateAndNormalizeQueuingStrategy,
+      ValidateAndNormalizeHighWaterMark = _require.ValidateAndNormalizeHighWaterMark;
+  var _require2 = __w_pdfjs_require__(0),
+      createArrayFromList = _require2.createArrayFromList,
+      createDataProperty = _require2.createDataProperty,
+      typeIsObject = _require2.typeIsObject;
+  var _require3 = __w_pdfjs_require__(1),
+      assert = _require3.assert,
+      rethrowAssertionErrorRejection = _require3.rethrowAssertionErrorRejection;
+  var _require4 = __w_pdfjs_require__(3),
+      DequeueValue = _require4.DequeueValue,
+      EnqueueValueWithSize = _require4.EnqueueValueWithSize,
+      ResetQueue = _require4.ResetQueue;
+  var _require5 = __w_pdfjs_require__(2),
+      AcquireWritableStreamDefaultWriter = _require5.AcquireWritableStreamDefaultWriter,
+      IsWritableStream = _require5.IsWritableStream,
+      IsWritableStreamLocked = _require5.IsWritableStreamLocked,
+      WritableStreamAbort = _require5.WritableStreamAbort,
+      WritableStreamDefaultWriterCloseWithErrorPropagation = _require5.WritableStreamDefaultWriterCloseWithErrorPropagation,
+      WritableStreamDefaultWriterRelease = _require5.WritableStreamDefaultWriterRelease,
+      WritableStreamDefaultWriterWrite = _require5.WritableStreamDefaultWriterWrite,
+      WritableStreamCloseQueuedOrInFlight = _require5.WritableStreamCloseQueuedOrInFlight;
+  var ReadableStream = function () {
+    function ReadableStream() {
+      var underlyingSource = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+      var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
+          size = _ref.size,
+          highWaterMark = _ref.highWaterMark;
+      _classCallCheck(this, ReadableStream);
+      this._state = 'readable';
+      this._reader = undefined;
+      this._storedError = undefined;
+      this._disturbed = false;
+      this._readableStreamController = undefined;
+      var type = underlyingSource.type;
+      var typeString = String(type);
+      if (typeString === 'bytes') {
+        if (highWaterMark === undefined) {
+          highWaterMark = 0;
+        }
+        this._readableStreamController = new ReadableByteStreamController(this, underlyingSource, highWaterMark);
+      } else if (type === undefined) {
+        if (highWaterMark === undefined) {
+          highWaterMark = 1;
+        }
+        this._readableStreamController = new ReadableStreamDefaultController(this, underlyingSource, size, highWaterMark);
+      } else {
+        throw new RangeError('Invalid type is specified');
+      }
+    }
+    _createClass(ReadableStream, [{
+      key: 'cancel',
+      value: function cancel(reason) {
+        if (IsReadableStream(this) === false) {
+          return Promise.reject(streamBrandCheckException('cancel'));
+        }
+        if (IsReadableStreamLocked(this) === true) {
+          return Promise.reject(new TypeError('Cannot cancel a stream that already has a reader'));
+        }
+        return ReadableStreamCancel(this, reason);
+      }
+    }, {
+      key: 'getReader',
+      value: function getReader() {
+        var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
+            mode = _ref2.mode;
+        if (IsReadableStream(this) === false) {
+          throw streamBrandCheckException('getReader');
+        }
+        if (mode === undefined) {
+          return AcquireReadableStreamDefaultReader(this);
+        }
+        mode = String(mode);
+        if (mode === 'byob') {
+          return AcquireReadableStreamBYOBReader(this);
+        }
+        throw new RangeError('Invalid mode is specified');
+      }
+    }, {
+      key: 'pipeThrough',
+      value: function pipeThrough(_ref3, options) {
+        var writable = _ref3.writable,
+            readable = _ref3.readable;
+        var promise = this.pipeTo(writable, options);
+        ifIsObjectAndHasAPromiseIsHandledInternalSlotSetPromiseIsHandledToTrue(promise);
+        return readable;
+      }
+    }, {
+      key: 'pipeTo',
+      value: function pipeTo(dest) {
+        var _this = this;
+        var _ref4 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
+            preventClose = _ref4.preventClose,
+            preventAbort = _ref4.preventAbort,
+            preventCancel = _ref4.preventCancel;
+        if (IsReadableStream(this) === false) {
+          return Promise.reject(streamBrandCheckException('pipeTo'));
+        }
+        if (IsWritableStream(dest) === false) {
+          return Promise.reject(new TypeError('ReadableStream.prototype.pipeTo\'s first argument must be a WritableStream'));
+        }
+        preventClose = Boolean(preventClose);
+        preventAbort = Boolean(preventAbort);
+        preventCancel = Boolean(preventCancel);
+        if (IsReadableStreamLocked(this) === true) {
+          return Promise.reject(new TypeError('ReadableStream.prototype.pipeTo cannot be used on a locked ReadableStream'));
+        }
+        if (IsWritableStreamLocked(dest) === true) {
+          return Promise.reject(new TypeError('ReadableStream.prototype.pipeTo cannot be used on a locked WritableStream'));
+        }
+        var reader = AcquireReadableStreamDefaultReader(this);
+        var writer = AcquireWritableStreamDefaultWriter(dest);
+        var shuttingDown = false;
+        var currentWrite = Promise.resolve();
+        return new Promise(function (resolve, reject) {
+          function pipeLoop() {
+            currentWrite = Promise.resolve();
+            if (shuttingDown === true) {
+              return Promise.resolve();
+            }
+            return writer._readyPromise.then(function () {
+              return ReadableStreamDefaultReaderRead(reader).then(function (_ref5) {
+                var value = _ref5.value,
+                    done = _ref5.done;
+                if (done === true) {
+                  return;
+                }
+                currentWrite = WritableStreamDefaultWriterWrite(writer, value).catch(function () {});
+              });
+            }).then(pipeLoop);
+          }
+          isOrBecomesErrored(_this, reader._closedPromise, function (storedError) {
+            if (preventAbort === false) {
+              shutdownWithAction(function () {
+                return WritableStreamAbort(dest, storedError);
+              }, true, storedError);
+            } else {
+              shutdown(true, storedError);
+            }
+          });
+          isOrBecomesErrored(dest, writer._closedPromise, function (storedError) {
+            if (preventCancel === false) {
+              shutdownWithAction(function () {
+                return ReadableStreamCancel(_this, storedError);
+              }, true, storedError);
+            } else {
+              shutdown(true, storedError);
+            }
+          });
+          isOrBecomesClosed(_this, reader._closedPromise, function () {
+            if (preventClose === false) {
+              shutdownWithAction(function () {
+                return WritableStreamDefaultWriterCloseWithErrorPropagation(writer);
+              });
+            } else {
+              shutdown();
+            }
+          });
+          if (WritableStreamCloseQueuedOrInFlight(dest) === true || dest._state === 'closed') {
+            var destClosed = new TypeError('the destination writable stream closed before all data could be piped to it');
+            if (preventCancel === false) {
+              shutdownWithAction(function () {
+                return ReadableStreamCancel(_this, destClosed);
+              }, true, destClosed);
+            } else {
+              shutdown(true, destClosed);
+            }
+          }
+          pipeLoop().catch(function (err) {
+            currentWrite = Promise.resolve();
+            rethrowAssertionErrorRejection(err);
+          });
+          function waitForWritesToFinish() {
+            var oldCurrentWrite = currentWrite;
+            return currentWrite.then(function () {
+              return oldCurrentWrite !== currentWrite ? waitForWritesToFinish() : undefined;
+            });
+          }
+          function isOrBecomesErrored(stream, promise, action) {
+            if (stream._state === 'errored') {
+              action(stream._storedError);
+            } else {
+              promise.catch(action).catch(rethrowAssertionErrorRejection);
+            }
+          }
+          function isOrBecomesClosed(stream, promise, action) {
+            if (stream._state === 'closed') {
+              action();
+            } else {
+              promise.then(action).catch(rethrowAssertionErrorRejection);
+            }
+          }
+          function shutdownWithAction(action, originalIsError, originalError) {
+            if (shuttingDown === true) {
+              return;
+            }
+            shuttingDown = true;
+            if (dest._state === 'writable' && WritableStreamCloseQueuedOrInFlight(dest) === false) {
+              waitForWritesToFinish().then(doTheRest);
+            } else {
+              doTheRest();
+            }
+            function doTheRest() {
+              action().then(function () {
+                return finalize(originalIsError, originalError);
+              }, function (newError) {
+                return finalize(true, newError);
+              }).catch(rethrowAssertionErrorRejection);
+            }
+          }
+          function shutdown(isError, error) {
+            if (shuttingDown === true) {
+              return;
+            }
+            shuttingDown = true;
+            if (dest._state === 'writable' && WritableStreamCloseQueuedOrInFlight(dest) === false) {
+              waitForWritesToFinish().then(function () {
+                return finalize(isError, error);
+              }).catch(rethrowAssertionErrorRejection);
+            } else {
+              finalize(isError, error);
+            }
+          }
+          function finalize(isError, error) {
+            WritableStreamDefaultWriterRelease(writer);
+            ReadableStreamReaderGenericRelease(reader);
+            if (isError) {
+              reject(error);
+            } else {
+              resolve(undefined);
+            }
+          }
+        });
+      }
+    }, {
+      key: 'tee',
+      value: function tee() {
+        if (IsReadableStream(this) === false) {
+          throw streamBrandCheckException('tee');
+        }
+        var branches = ReadableStreamTee(this, false);
+        return createArrayFromList(branches);
+      }
+    }, {
+      key: 'locked',
+      get: function get() {
+        if (IsReadableStream(this) === false) {
+          throw streamBrandCheckException('locked');
+        }
+        return IsReadableStreamLocked(this);
+      }
+    }]);
+    return ReadableStream;
+  }();
+  module.exports = {
+    ReadableStream: ReadableStream,
+    IsReadableStreamDisturbed: IsReadableStreamDisturbed,
+    ReadableStreamDefaultControllerClose: ReadableStreamDefaultControllerClose,
+    ReadableStreamDefaultControllerEnqueue: ReadableStreamDefaultControllerEnqueue,
+    ReadableStreamDefaultControllerError: ReadableStreamDefaultControllerError,
+    ReadableStreamDefaultControllerGetDesiredSize: ReadableStreamDefaultControllerGetDesiredSize
+  };
+  function AcquireReadableStreamBYOBReader(stream) {
+    return new ReadableStreamBYOBReader(stream);
+  }
+  function AcquireReadableStreamDefaultReader(stream) {
+    return new ReadableStreamDefaultReader(stream);
+  }
+  function IsReadableStream(x) {
+    if (!typeIsObject(x)) {
+      return false;
+    }
+    if (!Object.prototype.hasOwnProperty.call(x, '_readableStreamController')) {
+      return false;
+    }
+    return true;
+  }
+  function IsReadableStreamDisturbed(stream) {
+    assert(IsReadableStream(stream) === true, 'IsReadableStreamDisturbed should only be used on known readable streams');
+    return stream._disturbed;
+  }
+  function IsReadableStreamLocked(stream) {
+    assert(IsReadableStream(stream) === true, 'IsReadableStreamLocked should only be used on known readable streams');
+    if (stream._reader === undefined) {
+      return false;
+    }
+    return true;
+  }
+  function ReadableStreamTee(stream, cloneForBranch2) {
+    assert(IsReadableStream(stream) === true);
+    assert(typeof cloneForBranch2 === 'boolean');
+    var reader = AcquireReadableStreamDefaultReader(stream);
+    var teeState = {
+      closedOrErrored: false,
+      canceled1: false,
+      canceled2: false,
+      reason1: undefined,
+      reason2: undefined
+    };
+    teeState.promise = new Promise(function (resolve) {
+      teeState._resolve = resolve;
+    });
+    var pull = create_ReadableStreamTeePullFunction();
+    pull._reader = reader;
+    pull._teeState = teeState;
+    pull._cloneForBranch2 = cloneForBranch2;
+    var cancel1 = create_ReadableStreamTeeBranch1CancelFunction();
+    cancel1._stream = stream;
+    cancel1._teeState = teeState;
+    var cancel2 = create_ReadableStreamTeeBranch2CancelFunction();
+    cancel2._stream = stream;
+    cancel2._teeState = teeState;
+    var underlyingSource1 = Object.create(Object.prototype);
+    createDataProperty(underlyingSource1, 'pull', pull);
+    createDataProperty(underlyingSource1, 'cancel', cancel1);
+    var branch1Stream = new ReadableStream(underlyingSource1);
+    var underlyingSource2 = Object.create(Object.prototype);
+    createDataProperty(underlyingSource2, 'pull', pull);
+    createDataProperty(underlyingSource2, 'cancel', cancel2);
+    var branch2Stream = new ReadableStream(underlyingSource2);
+    pull._branch1 = branch1Stream._readableStreamController;
+    pull._branch2 = branch2Stream._readableStreamController;
+    reader._closedPromise.catch(function (r) {
+      if (teeState.closedOrErrored === true) {
+        return;
+      }
+      ReadableStreamDefaultControllerError(pull._branch1, r);
+      ReadableStreamDefaultControllerError(pull._branch2, r);
+      teeState.closedOrErrored = true;
+    });
+    return [branch1Stream, branch2Stream];
+  }
+  function create_ReadableStreamTeePullFunction() {
+    function f() {
+      var reader = f._reader,
+          branch1 = f._branch1,
+          branch2 = f._branch2,
+          teeState = f._teeState;
+      return ReadableStreamDefaultReaderRead(reader).then(function (result) {
+        assert(typeIsObject(result));
+        var value = result.value;
+        var done = result.done;
+        assert(typeof done === 'boolean');
+        if (done === true && teeState.closedOrErrored === false) {
+          if (teeState.canceled1 === false) {
+            ReadableStreamDefaultControllerClose(branch1);
+          }
+          if (teeState.canceled2 === false) {
+            ReadableStreamDefaultControllerClose(branch2);
+          }
+          teeState.closedOrErrored = true;
+        }
+        if (teeState.closedOrErrored === true) {
+          return;
+        }
+        var value1 = value;
+        var value2 = value;
+        if (teeState.canceled1 === false) {
+          ReadableStreamDefaultControllerEnqueue(branch1, value1);
+        }
+        if (teeState.canceled2 === false) {
+          ReadableStreamDefaultControllerEnqueue(branch2, value2);
+        }
+      });
+    }
+    return f;
+  }
+  function create_ReadableStreamTeeBranch1CancelFunction() {
+    function f(reason) {
+      var stream = f._stream,
+          teeState = f._teeState;
+      teeState.canceled1 = true;
+      teeState.reason1 = reason;
+      if (teeState.canceled2 === true) {
+        var compositeReason = createArrayFromList([teeState.reason1, teeState.reason2]);
+        var cancelResult = ReadableStreamCancel(stream, compositeReason);
+        teeState._resolve(cancelResult);
+      }
+      return teeState.promise;
+    }
+    return f;
+  }
+  function create_ReadableStreamTeeBranch2CancelFunction() {
+    function f(reason) {
+      var stream = f._stream,
+          teeState = f._teeState;
+      teeState.canceled2 = true;
+      teeState.reason2 = reason;
+      if (teeState.canceled1 === true) {
+        var compositeReason = createArrayFromList([teeState.reason1, teeState.reason2]);
+        var cancelResult = ReadableStreamCancel(stream, compositeReason);
+        teeState._resolve(cancelResult);
+      }
+      return teeState.promise;
+    }
+    return f;
+  }
+  function ReadableStreamAddReadIntoRequest(stream) {
+    assert(IsReadableStreamBYOBReader(stream._reader) === true);
+    assert(stream._state === 'readable' || stream._state === 'closed');
+    var promise = new Promise(function (resolve, reject) {
+      var readIntoRequest = {
+        _resolve: resolve,
+        _reject: reject
+      };
+      stream._reader._readIntoRequests.push(readIntoRequest);
+    });
+    return promise;
+  }
+  function ReadableStreamAddReadRequest(stream) {
+    assert(IsReadableStreamDefaultReader(stream._reader) === true);
+    assert(stream._state === 'readable');
+    var promise = new Promise(function (resolve, reject) {
+      var readRequest = {
+        _resolve: resolve,
+        _reject: reject
+      };
+      stream._reader._readRequests.push(readRequest);
+    });
+    return promise;
+  }
+  function ReadableStreamCancel(stream, reason) {
+    stream._disturbed = true;
+    if (stream._state === 'closed') {
+      return Promise.resolve(undefined);
+    }
+    if (stream._state === 'errored') {
+      return Promise.reject(stream._storedError);
+    }
+    ReadableStreamClose(stream);
+    var sourceCancelPromise = stream._readableStreamController.__cancelSteps(reason);
+    return sourceCancelPromise.then(function () {
+      return undefined;
+    });
+  }
+  function ReadableStreamClose(stream) {
+    assert(stream._state === 'readable');
+    stream._state = 'closed';
+    var reader = stream._reader;
+    if (reader === undefined) {
+      return undefined;
+    }
+    if (IsReadableStreamDefaultReader(reader) === true) {
+      for (var i = 0; i < reader._readRequests.length; i++) {
+        var _resolve = reader._readRequests[i]._resolve;
+        _resolve(CreateIterResultObject(undefined, true));
+      }
+      reader._readRequests = [];
+    }
+    defaultReaderClosedPromiseResolve(reader);
+    return undefined;
+  }
+  function ReadableStreamError(stream, e) {
+    assert(IsReadableStream(stream) === true, 'stream must be ReadableStream');
+    assert(stream._state === 'readable', 'state must be readable');
+    stream._state = 'errored';
+    stream._storedError = e;
+    var reader = stream._reader;
+    if (reader === undefined) {
+      return undefined;
+    }
+    if (IsReadableStreamDefaultReader(reader) === true) {
+      for (var i = 0; i < reader._readRequests.length; i++) {
+        var readRequest = reader._readRequests[i];
+        readRequest._reject(e);
+      }
+      reader._readRequests = [];
+    } else {
+      assert(IsReadableStreamBYOBReader(reader), 'reader must be ReadableStreamBYOBReader');
+      for (var _i = 0; _i < reader._readIntoRequests.length; _i++) {
+        var readIntoRequest = reader._readIntoRequests[_i];
+        readIntoRequest._reject(e);
+      }
+      reader._readIntoRequests = [];
+    }
+    defaultReaderClosedPromiseReject(reader, e);
+    reader._closedPromise.catch(function () {});
+  }
+  function ReadableStreamFulfillReadIntoRequest(stream, chunk, done) {
+    var reader = stream._reader;
+    assert(reader._readIntoRequests.length > 0);
+    var readIntoRequest = reader._readIntoRequests.shift();
+    readIntoRequest._resolve(CreateIterResultObject(chunk, done));
+  }
+  function ReadableStreamFulfillReadRequest(stream, chunk, done) {
+    var reader = stream._reader;
+    assert(reader._readRequests.length > 0);
+    var readRequest = reader._readRequests.shift();
+    readRequest._resolve(CreateIterResultObject(chunk, done));
+  }
+  function ReadableStreamGetNumReadIntoRequests(stream) {
+    return stream._reader._readIntoRequests.length;
+  }
+  function ReadableStreamGetNumReadRequests(stream) {
+    return stream._reader._readRequests.length;
+  }
+  function ReadableStreamHasBYOBReader(stream) {
+    var reader = stream._reader;
+    if (reader === undefined) {
+      return false;
+    }
+    if (IsReadableStreamBYOBReader(reader) === false) {
+      return false;
+    }
+    return true;
+  }
+  function ReadableStreamHasDefaultReader(stream) {
+    var reader = stream._reader;
+    if (reader === undefined) {
+      return false;
+    }
+    if (IsReadableStreamDefaultReader(reader) === false) {
+      return false;
+    }
+    return true;
+  }
+  var ReadableStreamDefaultReader = function () {
+    function ReadableStreamDefaultReader(stream) {
+      _classCallCheck(this, ReadableStreamDefaultReader);
+      if (IsReadableStream(stream) === false) {
+        throw new TypeError('ReadableStreamDefaultReader can only be constructed with a ReadableStream instance');
+      }
+      if (IsReadableStreamLocked(stream) === true) {
+        throw new TypeError('This stream has already been locked for exclusive reading by another reader');
+      }
+      ReadableStreamReaderGenericInitialize(this, stream);
+      this._readRequests = [];
+    }
+    _createClass(ReadableStreamDefaultReader, [{
+      key: 'cancel',
+      value: function cancel(reason) {
+        if (IsReadableStreamDefaultReader(this) === false) {
+          return Promise.reject(defaultReaderBrandCheckException('cancel'));
+        }
+        if (this._ownerReadableStream === undefined) {
+          return Promise.reject(readerLockException('cancel'));
+        }
+        return ReadableStreamReaderGenericCancel(this, reason);
+      }
+    }, {
+      key: 'read',
+      value: function read() {
+        if (IsReadableStreamDefaultReader(this) === false) {
+          return Promise.reject(defaultReaderBrandCheckException('read'));
+        }
+        if (this._ownerReadableStream === undefined) {
+          return Promise.reject(readerLockException('read from'));
+        }
+        return ReadableStreamDefaultReaderRead(this);
+      }
+    }, {
+      key: 'releaseLock',
+      value: function releaseLock() {
+        if (IsReadableStreamDefaultReader(this) === false) {
+          throw defaultReaderBrandCheckException('releaseLock');
+        }
+        if (this._ownerReadableStream === undefined) {
+          return;
+        }
+        if (this._readRequests.length > 0) {
+          throw new TypeError('Tried to release a reader lock when that reader has pending read() calls un-settled');
+        }
+        ReadableStreamReaderGenericRelease(this);
+      }
+    }, {
+      key: 'closed',
+      get: function get() {
+        if (IsReadableStreamDefaultReader(this) === false) {
+          return Promise.reject(defaultReaderBrandCheckException('closed'));
+        }
+        return this._closedPromise;
+      }
+    }]);
+    return ReadableStreamDefaultReader;
+  }();
+  var ReadableStreamBYOBReader = function () {
+    function ReadableStreamBYOBReader(stream) {
+      _classCallCheck(this, ReadableStreamBYOBReader);
+      if (!IsReadableStream(stream)) {
+        throw new TypeError('ReadableStreamBYOBReader can only be constructed with a ReadableStream instance given a ' + 'byte source');
+      }
+      if (IsReadableByteStreamController(stream._readableStreamController) === false) {
+        throw new TypeError('Cannot construct a ReadableStreamBYOBReader for a stream not constructed with a byte ' + 'source');
+      }
+      if (IsReadableStreamLocked(stream)) {
+        throw new TypeError('This stream has already been locked for exclusive reading by another reader');
+      }
+      ReadableStreamReaderGenericInitialize(this, stream);
+      this._readIntoRequests = [];
+    }
+    _createClass(ReadableStreamBYOBReader, [{
+      key: 'cancel',
+      value: function cancel(reason) {
+        if (!IsReadableStreamBYOBReader(this)) {
+          return Promise.reject(byobReaderBrandCheckException('cancel'));
+        }
+        if (this._ownerReadableStream === undefined) {
+          return Promise.reject(readerLockException('cancel'));
+        }
+        return ReadableStreamReaderGenericCancel(this, reason);
+      }
+    }, {
+      key: 'read',
+      value: function read(view) {
+        if (!IsReadableStreamBYOBReader(this)) {
+          return Promise.reject(byobReaderBrandCheckException('read'));
+        }
+        if (this._ownerReadableStream === undefined) {
+          return Promise.reject(readerLockException('read from'));
+        }
+        if (!ArrayBuffer.isView(view)) {
+          return Promise.reject(new TypeError('view must be an array buffer view'));
+        }
+        if (view.byteLength === 0) {
+          return Promise.reject(new TypeError('view must have non-zero byteLength'));
+        }
+        return ReadableStreamBYOBReaderRead(this, view);
+      }
+    }, {
+      key: 'releaseLock',
+      value: function releaseLock() {
+        if (!IsReadableStreamBYOBReader(this)) {
+          throw byobReaderBrandCheckException('releaseLock');
+        }
+        if (this._ownerReadableStream === undefined) {
+          return;
+        }
+        if (this._readIntoRequests.length > 0) {
+          throw new TypeError('Tried to release a reader lock when that reader has pending read() calls un-settled');
+        }
+        ReadableStreamReaderGenericRelease(this);
+      }
+    }, {
+      key: 'closed',
+      get: function get() {
+        if (!IsReadableStreamBYOBReader(this)) {
+          return Promise.reject(byobReaderBrandCheckException('closed'));
+        }
+        return this._closedPromise;
+      }
+    }]);
+    return ReadableStreamBYOBReader;
+  }();
+  function IsReadableStreamBYOBReader(x) {
+    if (!typeIsObject(x)) {
+      return false;
+    }
+    if (!Object.prototype.hasOwnProperty.call(x, '_readIntoRequests')) {
+      return false;
+    }
+    return true;
+  }
+  function IsReadableStreamDefaultReader(x) {
+    if (!typeIsObject(x)) {
+      return false;
+    }
+    if (!Object.prototype.hasOwnProperty.call(x, '_readRequests')) {
+      return false;
+    }
+    return true;
+  }
+  function ReadableStreamReaderGenericInitialize(reader, stream) {
+    reader._ownerReadableStream = stream;
+    stream._reader = reader;
+    if (stream._state === 'readable') {
+      defaultReaderClosedPromiseInitialize(reader);
+    } else if (stream._state === 'closed') {
+      defaultReaderClosedPromiseInitializeAsResolved(reader);
+    } else {
+      assert(stream._state === 'errored', 'state must be errored');
+      defaultReaderClosedPromiseInitializeAsRejected(reader, stream._storedError);
+      reader._closedPromise.catch(function () {});
+    }
+  }
+  function ReadableStreamReaderGenericCancel(reader, reason) {
+    var stream = reader._ownerReadableStream;
+    assert(stream !== undefined);
+    return ReadableStreamCancel(stream, reason);
+  }
+  function ReadableStreamReaderGenericRelease(reader) {
+    assert(reader._ownerReadableStream !== undefined);
+    assert(reader._ownerReadableStream._reader === reader);
+    if (reader._ownerReadableStream._state === 'readable') {
+      defaultReaderClosedPromiseReject(reader, new TypeError('Reader was released and can no longer be used to monitor the stream\'s closedness'));
+    } else {
+      defaultReaderClosedPromiseResetToRejected(reader, new TypeError('Reader was released and can no longer be used to monitor the stream\'s closedness'));
+    }
+    reader._closedPromise.catch(function () {});
+    reader._ownerReadableStream._reader = undefined;
+    reader._ownerReadableStream = undefined;
+  }
+  function ReadableStreamBYOBReaderRead(reader, view) {
+    var stream = reader._ownerReadableStream;
+    assert(stream !== undefined);
+    stream._disturbed = true;
+    if (stream._state === 'errored') {
+      return Promise.reject(stream._storedError);
+    }
+    return ReadableByteStreamControllerPullInto(stream._readableStreamController, view);
+  }
+  function ReadableStreamDefaultReaderRead(reader) {
+    var stream = reader._ownerReadableStream;
+    assert(stream !== undefined);
+    stream._disturbed = true;
+    if (stream._state === 'closed') {
+      return Promise.resolve(CreateIterResultObject(undefined, true));
+    }
+    if (stream._state === 'errored') {
+      return Promise.reject(stream._storedError);
+    }
+    assert(stream._state === 'readable');
+    return stream._readableStreamController.__pullSteps();
+  }
+  var ReadableStreamDefaultController = function () {
+    function ReadableStreamDefaultController(stream, underlyingSource, size, highWaterMark) {
+      _classCallCheck(this, ReadableStreamDefaultController);
+      if (IsReadableStream(stream) === false) {
+        throw new TypeError('ReadableStreamDefaultController can only be constructed with a ReadableStream instance');
+      }
+      if (stream._readableStreamController !== undefined) {
+        throw new TypeError('ReadableStreamDefaultController instances can only be created by the ReadableStream constructor');
+      }
+      this._controlledReadableStream = stream;
+      this._underlyingSource = underlyingSource;
+      this._queue = undefined;
+      this._queueTotalSize = undefined;
+      ResetQueue(this);
+      this._started = false;
+      this._closeRequested = false;
+      this._pullAgain = false;
+      this._pulling = false;
+      var normalizedStrategy = ValidateAndNormalizeQueuingStrategy(size, highWaterMark);
+      this._strategySize = normalizedStrategy.size;
+      this._strategyHWM = normalizedStrategy.highWaterMark;
+      var controller = this;
+      var startResult = InvokeOrNoop(underlyingSource, 'start', [this]);
+      Promise.resolve(startResult).then(function () {
+        controller._started = true;
+        assert(controller._pulling === false);
+        assert(controller._pullAgain === false);
+        ReadableStreamDefaultControllerCallPullIfNeeded(controller);
+      }, function (r) {
+        ReadableStreamDefaultControllerErrorIfNeeded(controller, r);
+      }).catch(rethrowAssertionErrorRejection);
+    }
+    _createClass(ReadableStreamDefaultController, [{
+      key: 'close',
+      value: function close() {
+        if (IsReadableStreamDefaultController(this) === false) {
+          throw defaultControllerBrandCheckException('close');
+        }
+        if (this._closeRequested === true) {
+          throw new TypeError('The stream has already been closed; do not close it again!');
+        }
+        var state = this._controlledReadableStream._state;
+        if (state !== 'readable') {
+          throw new TypeError('The stream (in ' + state + ' state) is not in the readable state and cannot be closed');
+        }
+        ReadableStreamDefaultControllerClose(this);
+      }
+    }, {
+      key: 'enqueue',
+      value: function enqueue(chunk) {
+        if (IsReadableStreamDefaultController(this) === false) {
+          throw defaultControllerBrandCheckException('enqueue');
+        }
+        if (this._closeRequested === true) {
+          throw new TypeError('stream is closed or draining');
+        }
+        var state = this._controlledReadableStream._state;
+        if (state !== 'readable') {
+          throw new TypeError('The stream (in ' + state + ' state) is not in the readable state and cannot be enqueued to');
+        }
+        return ReadableStreamDefaultControllerEnqueue(this, chunk);
+      }
+    }, {
+      key: 'error',
+      value: function error(e) {
+        if (IsReadableStreamDefaultController(this) === false) {
+          throw defaultControllerBrandCheckException('error');
+        }
+        var stream = this._controlledReadableStream;
+        if (stream._state !== 'readable') {
+          throw new TypeError('The stream is ' + stream._state + ' and so cannot be errored');
+        }
+        ReadableStreamDefaultControllerError(this, e);
+      }
+    }, {
+      key: '__cancelSteps',
+      value: function __cancelSteps(reason) {
+        ResetQueue(this);
+        return PromiseInvokeOrNoop(this._underlyingSource, 'cancel', [reason]);
+      }
+    }, {
+      key: '__pullSteps',
+      value: function __pullSteps() {
+        var stream = this._controlledReadableStream;
+        if (this._queue.length > 0) {
+          var chunk = DequeueValue(this);
+          if (this._closeRequested === true && this._queue.length === 0) {
+            ReadableStreamClose(stream);
+          } else {
+            ReadableStreamDefaultControllerCallPullIfNeeded(this);
+          }
+          return Promise.resolve(CreateIterResultObject(chunk, false));
+        }
+        var pendingPromise = ReadableStreamAddReadRequest(stream);
+        ReadableStreamDefaultControllerCallPullIfNeeded(this);
+        return pendingPromise;
+      }
+    }, {
+      key: 'desiredSize',
+      get: function get() {
+        if (IsReadableStreamDefaultController(this) === false) {
+          throw defaultControllerBrandCheckException('desiredSize');
+        }
+        return ReadableStreamDefaultControllerGetDesiredSize(this);
+      }
+    }]);
+    return ReadableStreamDefaultController;
+  }();
+  function IsReadableStreamDefaultController(x) {
+    if (!typeIsObject(x)) {
+      return false;
+    }
+    if (!Object.prototype.hasOwnProperty.call(x, '_underlyingSource')) {
+      return false;
+    }
+    return true;
+  }
+  function ReadableStreamDefaultControllerCallPullIfNeeded(controller) {
+    var shouldPull = ReadableStreamDefaultControllerShouldCallPull(controller);
+    if (shouldPull === false) {
+      return undefined;
+    }
+    if (controller._pulling === true) {
+      controller._pullAgain = true;
+      return undefined;
+    }
+    assert(controller._pullAgain === false);
+    controller._pulling = true;
+    var pullPromise = PromiseInvokeOrNoop(controller._underlyingSource, 'pull', [controller]);
+    pullPromise.then(function () {
+      controller._pulling = false;
+      if (controller._pullAgain === true) {
+        controller._pullAgain = false;
+        return ReadableStreamDefaultControllerCallPullIfNeeded(controller);
+      }
+      return undefined;
+    }, function (e) {
+      ReadableStreamDefaultControllerErrorIfNeeded(controller, e);
+    }).catch(rethrowAssertionErrorRejection);
+    return undefined;
+  }
+  function ReadableStreamDefaultControllerShouldCallPull(controller) {
+    var stream = controller._controlledReadableStream;
+    if (stream._state === 'closed' || stream._state === 'errored') {
+      return false;
+    }
+    if (controller._closeRequested === true) {
+      return false;
+    }
+    if (controller._started === false) {
+      return false;
+    }
+    if (IsReadableStreamLocked(stream) === true && ReadableStreamGetNumReadRequests(stream) > 0) {
+      return true;
+    }
+    var desiredSize = ReadableStreamDefaultControllerGetDesiredSize(controller);
+    if (desiredSize > 0) {
+      return true;
+    }
+    return false;
+  }
+  function ReadableStreamDefaultControllerClose(controller) {
+    var stream = controller._controlledReadableStream;
+    assert(controller._closeRequested === false);
+    assert(stream._state === 'readable');
+    controller._closeRequested = true;
+    if (controller._queue.length === 0) {
+      ReadableStreamClose(stream);
+    }
+  }
+  function ReadableStreamDefaultControllerEnqueue(controller, chunk) {
+    var stream = controller._controlledReadableStream;
+    assert(controller._closeRequested === false);
+    assert(stream._state === 'readable');
+    if (IsReadableStreamLocked(stream) === true && ReadableStreamGetNumReadRequests(stream) > 0) {
+      ReadableStreamFulfillReadRequest(stream, chunk, false);
+    } else {
+      var chunkSize = 1;
+      if (controller._strategySize !== undefined) {
+        var strategySize = controller._strategySize;
+        try {
+          chunkSize = strategySize(chunk);
+        } catch (chunkSizeE) {
+          ReadableStreamDefaultControllerErrorIfNeeded(controller, chunkSizeE);
+          throw chunkSizeE;
+        }
+      }
+      try {
+        EnqueueValueWithSize(controller, chunk, chunkSize);
+      } catch (enqueueE) {
+        ReadableStreamDefaultControllerErrorIfNeeded(controller, enqueueE);
+        throw enqueueE;
+      }
+    }
+    ReadableStreamDefaultControllerCallPullIfNeeded(controller);
+    return undefined;
+  }
+  function ReadableStreamDefaultControllerError(controller, e) {
+    var stream = controller._controlledReadableStream;
+    assert(stream._state === 'readable');
+    ResetQueue(controller);
+    ReadableStreamError(stream, e);
+  }
+  function ReadableStreamDefaultControllerErrorIfNeeded(controller, e) {
+    if (controller._controlledReadableStream._state === 'readable') {
+      ReadableStreamDefaultControllerError(controller, e);
+    }
+  }
+  function ReadableStreamDefaultControllerGetDesiredSize(controller) {
+    var stream = controller._controlledReadableStream;
+    var state = stream._state;
+    if (state === 'errored') {
+      return null;
+    }
+    if (state === 'closed') {
+      return 0;
+    }
+    return controller._strategyHWM - controller._queueTotalSize;
+  }
+  var ReadableStreamBYOBRequest = function () {
+    function ReadableStreamBYOBRequest(controller, view) {
+      _classCallCheck(this, ReadableStreamBYOBRequest);
+      this._associatedReadableByteStreamController = controller;
+      this._view = view;
+    }
+    _createClass(ReadableStreamBYOBRequest, [{
+      key: 'respond',
+      value: function respond(bytesWritten) {
+        if (IsReadableStreamBYOBRequest(this) === false) {
+          throw byobRequestBrandCheckException('respond');
+        }
+        if (this._associatedReadableByteStreamController === undefined) {
+          throw new TypeError('This BYOB request has been invalidated');
+        }
+        ReadableByteStreamControllerRespond(this._associatedReadableByteStreamController, bytesWritten);
+      }
+    }, {
+      key: 'respondWithNewView',
+      value: function respondWithNewView(view) {
+        if (IsReadableStreamBYOBRequest(this) === false) {
+          throw byobRequestBrandCheckException('respond');
+        }
+        if (this._associatedReadableByteStreamController === undefined) {
+          throw new TypeError('This BYOB request has been invalidated');
+        }
+        if (!ArrayBuffer.isView(view)) {
+          throw new TypeError('You can only respond with array buffer views');
+        }
+        ReadableByteStreamControllerRespondWithNewView(this._associatedReadableByteStreamController, view);
+      }
+    }, {
+      key: 'view',
+      get: function get() {
+        return this._view;
+      }
+    }]);
+    return ReadableStreamBYOBRequest;
+  }();
+  var ReadableByteStreamController = function () {
+    function ReadableByteStreamController(stream, underlyingByteSource, highWaterMark) {
+      _classCallCheck(this, ReadableByteStreamController);
+      if (IsReadableStream(stream) === false) {
+        throw new TypeError('ReadableByteStreamController can only be constructed with a ReadableStream instance given ' + 'a byte source');
+      }
+      if (stream._readableStreamController !== undefined) {
+        throw new TypeError('ReadableByteStreamController instances can only be created by the ReadableStream constructor given a byte ' + 'source');
+      }
+      this._controlledReadableStream = stream;
+      this._underlyingByteSource = underlyingByteSource;
+      this._pullAgain = false;
+      this._pulling = false;
+      ReadableByteStreamControllerClearPendingPullIntos(this);
+      this._queue = this._queueTotalSize = undefined;
+      ResetQueue(this);
+      this._closeRequested = false;
+      this._started = false;
+      this._strategyHWM = ValidateAndNormalizeHighWaterMark(highWaterMark);
+      var autoAllocateChunkSize = underlyingByteSource.autoAllocateChunkSize;
+      if (autoAllocateChunkSize !== undefined) {
+        if (Number.isInteger(autoAllocateChunkSize) === false || autoAllocateChunkSize <= 0) {
+          throw new RangeError('autoAllocateChunkSize must be a positive integer');
+        }
+      }
+      this._autoAllocateChunkSize = autoAllocateChunkSize;
+      this._pendingPullIntos = [];
+      var controller = this;
+      var startResult = InvokeOrNoop(underlyingByteSource, 'start', [this]);
+      Promise.resolve(startResult).then(function () {
+        controller._started = true;
+        assert(controller._pulling === false);
+        assert(controller._pullAgain === false);
+        ReadableByteStreamControllerCallPullIfNeeded(controller);
+      }, function (r) {
+        if (stream._state === 'readable') {
+          ReadableByteStreamControllerError(controller, r);
+        }
+      }).catch(rethrowAssertionErrorRejection);
+    }
+    _createClass(ReadableByteStreamController, [{
+      key: 'close',
+      value: function close() {
+        if (IsReadableByteStreamController(this) === false) {
+          throw byteStreamControllerBrandCheckException('close');
+        }
+        if (this._closeRequested === true) {
+          throw new TypeError('The stream has already been closed; do not close it again!');
+        }
+        var state = this._controlledReadableStream._state;
+        if (state !== 'readable') {
+          throw new TypeError('The stream (in ' + state + ' state) is not in the readable state and cannot be closed');
+        }
+        ReadableByteStreamControllerClose(this);
+      }
+    }, {
+      key: 'enqueue',
+      value: function enqueue(chunk) {
+        if (IsReadableByteStreamController(this) === false) {
+          throw byteStreamControllerBrandCheckException('enqueue');
+        }
+        if (this._closeRequested === true) {
+          throw new TypeError('stream is closed or draining');
+        }
+        var state = this._controlledReadableStream._state;
+        if (state !== 'readable') {
+          throw new TypeError('The stream (in ' + state + ' state) is not in the readable state and cannot be enqueued to');
+        }
+        if (!ArrayBuffer.isView(chunk)) {
+          throw new TypeError('You can only enqueue array buffer views when using a ReadableByteStreamController');
+        }
+        ReadableByteStreamControllerEnqueue(this, chunk);
+      }
+    }, {
+      key: 'error',
+      value: function error(e) {
+        if (IsReadableByteStreamController(this) === false) {
+          throw byteStreamControllerBrandCheckException('error');
+        }
+        var stream = this._controlledReadableStream;
+        if (stream._state !== 'readable') {
+          throw new TypeError('The stream is ' + stream._state + ' and so cannot be errored');
+        }
+        ReadableByteStreamControllerError(this, e);
+      }
+    }, {
+      key: '__cancelSteps',
+      value: function __cancelSteps(reason) {
+        if (this._pendingPullIntos.length > 0) {
+          var firstDescriptor = this._pendingPullIntos[0];
+          firstDescriptor.bytesFilled = 0;
+        }
+        ResetQueue(this);
+        return PromiseInvokeOrNoop(this._underlyingByteSource, 'cancel', [reason]);
+      }
+    }, {
+      key: '__pullSteps',
+      value: function __pullSteps() {
+        var stream = this._controlledReadableStream;
+        assert(ReadableStreamHasDefaultReader(stream) === true);
+        if (this._queueTotalSize > 0) {
+          assert(ReadableStreamGetNumReadRequests(stream) === 0);
+          var entry = this._queue.shift();
+          this._queueTotalSize -= entry.byteLength;
+          ReadableByteStreamControllerHandleQueueDrain(this);
+          var view = void 0;
+          try {
+            view = new Uint8Array(entry.buffer, entry.byteOffset, entry.byteLength);
+          } catch (viewE) {
+            return Promise.reject(viewE);
+          }
+          return Promise.resolve(CreateIterResultObject(view, false));
+        }
+        var autoAllocateChunkSize = this._autoAllocateChunkSize;
+        if (autoAllocateChunkSize !== undefined) {
+          var buffer = void 0;
+          try {
+            buffer = new ArrayBuffer(autoAllocateChunkSize);
+          } catch (bufferE) {
+            return Promise.reject(bufferE);
+          }
+          var pullIntoDescriptor = {
+            buffer: buffer,
+            byteOffset: 0,
+            byteLength: autoAllocateChunkSize,
+            bytesFilled: 0,
+            elementSize: 1,
+            ctor: Uint8Array,
+            readerType: 'default'
+          };
+          this._pendingPullIntos.push(pullIntoDescriptor);
+        }
+        var promise = ReadableStreamAddReadRequest(stream);
+        ReadableByteStreamControllerCallPullIfNeeded(this);
+        return promise;
+      }
+    }, {
+      key: 'byobRequest',
+      get: function get() {
+        if (IsReadableByteStreamController(this) === false) {
+          throw byteStreamControllerBrandCheckException('byobRequest');
+        }
+        if (this._byobRequest === undefined && this._pendingPullIntos.length > 0) {
+          var firstDescriptor = this._pendingPullIntos[0];
+          var view = new Uint8Array(firstDescriptor.buffer, firstDescriptor.byteOffset + firstDescriptor.bytesFilled, firstDescriptor.byteLength - firstDescriptor.bytesFilled);
+          this._byobRequest = new ReadableStreamBYOBRequest(this, view);
+        }
+        return this._byobRequest;
+      }
+    }, {
+      key: 'desiredSize',
+      get: function get() {
+        if (IsReadableByteStreamController(this) === false) {
+          throw byteStreamControllerBrandCheckException('desiredSize');
+        }
+        return ReadableByteStreamControllerGetDesiredSize(this);
+      }
+    }]);
+    return ReadableByteStreamController;
+  }();
+  function IsReadableByteStreamController(x) {
+    if (!typeIsObject(x)) {
+      return false;
+    }
+    if (!Object.prototype.hasOwnProperty.call(x, '_underlyingByteSource')) {
+      return false;
+    }
+    return true;
+  }
+  function IsReadableStreamBYOBRequest(x) {
+    if (!typeIsObject(x)) {
+      return false;
+    }
+    if (!Object.prototype.hasOwnProperty.call(x, '_associatedReadableByteStreamController')) {
+      return false;
+    }
+    return true;
+  }
+  function ReadableByteStreamControllerCallPullIfNeeded(controller) {
+    var shouldPull = ReadableByteStreamControllerShouldCallPull(controller);
+    if (shouldPull === false) {
+      return undefined;
+    }
+    if (controller._pulling === true) {
+      controller._pullAgain = true;
+      return undefined;
+    }
+    assert(controller._pullAgain === false);
+    controller._pulling = true;
+    var pullPromise = PromiseInvokeOrNoop(controller._underlyingByteSource, 'pull', [controller]);
+    pullPromise.then(function () {
+      controller._pulling = false;
+      if (controller._pullAgain === true) {
+        controller._pullAgain = false;
+        ReadableByteStreamControllerCallPullIfNeeded(controller);
+      }
+    }, function (e) {
+      if (controller._controlledReadableStream._state === 'readable') {
+        ReadableByteStreamControllerError(controller, e);
+      }
+    }).catch(rethrowAssertionErrorRejection);
+    return undefined;
+  }
+  function ReadableByteStreamControllerClearPendingPullIntos(controller) {
+    ReadableByteStreamControllerInvalidateBYOBRequest(controller);
+    controller._pendingPullIntos = [];
+  }
+  function ReadableByteStreamControllerCommitPullIntoDescriptor(stream, pullIntoDescriptor) {
+    assert(stream._state !== 'errored', 'state must not be errored');
+    var done = false;
+    if (stream._state === 'closed') {
+      assert(pullIntoDescriptor.bytesFilled === 0);
+      done = true;
+    }
+    var filledView = ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor);
+    if (pullIntoDescriptor.readerType === 'default') {
+      ReadableStreamFulfillReadRequest(stream, filledView, done);
+    } else {
+      assert(pullIntoDescriptor.readerType === 'byob');
+      ReadableStreamFulfillReadIntoRequest(stream, filledView, done);
+    }
+  }
+  function ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor) {
+    var bytesFilled = pullIntoDescriptor.bytesFilled;
+    var elementSize = pullIntoDescriptor.elementSize;
+    assert(bytesFilled <= pullIntoDescriptor.byteLength);
+    assert(bytesFilled % elementSize === 0);
+    return new pullIntoDescriptor.ctor(pullIntoDescriptor.buffer, pullIntoDescriptor.byteOffset, bytesFilled / elementSize);
+  }
+  function ReadableByteStreamControllerEnqueueChunkToQueue(controller, buffer, byteOffset, byteLength) {
+    controller._queue.push({
+      buffer: buffer,
+      byteOffset: byteOffset,
+      byteLength: byteLength
+    });
+    controller._queueTotalSize += byteLength;
+  }
+  function ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor) {
+    var elementSize = pullIntoDescriptor.elementSize;
+    var currentAlignedBytes = pullIntoDescriptor.bytesFilled - pullIntoDescriptor.bytesFilled % elementSize;
+    var maxBytesToCopy = Math.min(controller._queueTotalSize, pullIntoDescriptor.byteLength - pullIntoDescriptor.bytesFilled);
+    var maxBytesFilled = pullIntoDescriptor.bytesFilled + maxBytesToCopy;
+    var maxAlignedBytes = maxBytesFilled - maxBytesFilled % elementSize;
+    var totalBytesToCopyRemaining = maxBytesToCopy;
+    var ready = false;
+    if (maxAlignedBytes > currentAlignedBytes) {
+      totalBytesToCopyRemaining = maxAlignedBytes - pullIntoDescriptor.bytesFilled;
+      ready = true;
+    }
+    var queue = controller._queue;
+    while (totalBytesToCopyRemaining > 0) {
+      var headOfQueue = queue[0];
+      var bytesToCopy = Math.min(totalBytesToCopyRemaining, headOfQueue.byteLength);
+      var destStart = pullIntoDescriptor.byteOffset + pullIntoDescriptor.bytesFilled;
+      ArrayBufferCopy(pullIntoDescriptor.buffer, destStart, headOfQueue.buffer, headOfQueue.byteOffset, bytesToCopy);
+      if (headOfQueue.byteLength === bytesToCopy) {
+        queue.shift();
+      } else {
+        headOfQueue.byteOffset += bytesToCopy;
+        headOfQueue.byteLength -= bytesToCopy;
+      }
+      controller._queueTotalSize -= bytesToCopy;
+      ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, bytesToCopy, pullIntoDescriptor);
+      totalBytesToCopyRemaining -= bytesToCopy;
+    }
+    if (ready === false) {
+      assert(controller._queueTotalSize === 0, 'queue must be empty');
+      assert(pullIntoDescriptor.bytesFilled > 0);
+      assert(pullIntoDescriptor.bytesFilled < pullIntoDescriptor.elementSize);
+    }
+    return ready;
+  }
+  function ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, size, pullIntoDescriptor) {
+    assert(controller._pendingPullIntos.length === 0 || controller._pendingPullIntos[0] === pullIntoDescriptor);
+    ReadableByteStreamControllerInvalidateBYOBRequest(controller);
+    pullIntoDescriptor.bytesFilled += size;
+  }
+  function ReadableByteStreamControllerHandleQueueDrain(controller) {
+    assert(controller._controlledReadableStream._state === 'readable');
+    if (controller._queueTotalSize === 0 && controller._closeRequested === true) {
+      ReadableStreamClose(controller._controlledReadableStream);
+    } else {
+      ReadableByteStreamControllerCallPullIfNeeded(controller);
+    }
+  }
+  function ReadableByteStreamControllerInvalidateBYOBRequest(controller) {
+    if (controller._byobRequest === undefined) {
+      return;
+    }
+    controller._byobRequest._associatedReadableByteStreamController = undefined;
+    controller._byobRequest._view = undefined;
+    controller._byobRequest = undefined;
+  }
+  function ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller) {
+    assert(controller._closeRequested === false);
+    while (controller._pendingPullIntos.length > 0) {
+      if (controller._queueTotalSize === 0) {
+        return;
+      }
+      var pullIntoDescriptor = controller._pendingPullIntos[0];
+      if (ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor) === true) {
+        ReadableByteStreamControllerShiftPendingPullInto(controller);
+        ReadableByteStreamControllerCommitPullIntoDescriptor(controller._controlledReadableStream, pullIntoDescriptor);
+      }
+    }
+  }
+  function ReadableByteStreamControllerPullInto(controller, view) {
+    var stream = controller._controlledReadableStream;
+    var elementSize = 1;
+    if (view.constructor !== DataView) {
+      elementSize = view.constructor.BYTES_PER_ELEMENT;
+    }
+    var ctor = view.constructor;
+    var pullIntoDescriptor = {
+      buffer: view.buffer,
+      byteOffset: view.byteOffset,
+      byteLength: view.byteLength,
+      bytesFilled: 0,
+      elementSize: elementSize,
+      ctor: ctor,
+      readerType: 'byob'
+    };
+    if (controller._pendingPullIntos.length > 0) {
+      pullIntoDescriptor.buffer = TransferArrayBuffer(pullIntoDescriptor.buffer);
+      controller._pendingPullIntos.push(pullIntoDescriptor);
+      return ReadableStreamAddReadIntoRequest(stream);
+    }
+    if (stream._state === 'closed') {
+      var emptyView = new view.constructor(pullIntoDescriptor.buffer, pullIntoDescriptor.byteOffset, 0);
+      return Promise.resolve(CreateIterResultObject(emptyView, true));
+    }
+    if (controller._queueTotalSize > 0) {
+      if (ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor) === true) {
+        var filledView = ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor);
+        ReadableByteStreamControllerHandleQueueDrain(controller);
+        return Promise.resolve(CreateIterResultObject(filledView, false));
+      }
+      if (controller._closeRequested === true) {
+        var e = new TypeError('Insufficient bytes to fill elements in the given buffer');
+        ReadableByteStreamControllerError(controller, e);
+        return Promise.reject(e);
+      }
+    }
+    pullIntoDescriptor.buffer = TransferArrayBuffer(pullIntoDescriptor.buffer);
+    controller._pendingPullIntos.push(pullIntoDescriptor);
+    var promise = ReadableStreamAddReadIntoRequest(stream);
+    ReadableByteStreamControllerCallPullIfNeeded(controller);
+    return promise;
+  }
+  function ReadableByteStreamControllerRespondInClosedState(controller, firstDescriptor) {
+    firstDescriptor.buffer = TransferArrayBuffer(firstDescriptor.buffer);
+    assert(firstDescriptor.bytesFilled === 0, 'bytesFilled must be 0');
+    var stream = controller._controlledReadableStream;
+    if (ReadableStreamHasBYOBReader(stream) === true) {
+      while (ReadableStreamGetNumReadIntoRequests(stream) > 0) {
+        var pullIntoDescriptor = ReadableByteStreamControllerShiftPendingPullInto(controller);
+        ReadableByteStreamControllerCommitPullIntoDescriptor(stream, pullIntoDescriptor);
+      }
+    }
+  }
+  function ReadableByteStreamControllerRespondInReadableState(controller, bytesWritten, pullIntoDescriptor) {
+    if (pullIntoDescriptor.bytesFilled + bytesWritten > pullIntoDescriptor.byteLength) {
+      throw new RangeError('bytesWritten out of range');
+    }
+    ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, bytesWritten, pullIntoDescriptor);
+    if (pullIntoDescriptor.bytesFilled < pullIntoDescriptor.elementSize) {
+      return;
+    }
+    ReadableByteStreamControllerShiftPendingPullInto(controller);
+    var remainderSize = pullIntoDescriptor.bytesFilled % pullIntoDescriptor.elementSize;
+    if (remainderSize > 0) {
+      var end = pullIntoDescriptor.byteOffset + pullIntoDescriptor.bytesFilled;
+      var remainder = pullIntoDescriptor.buffer.slice(end - remainderSize, end);
+      ReadableByteStreamControllerEnqueueChunkToQueue(controller, remainder, 0, remainder.byteLength);
+    }
+    pullIntoDescriptor.buffer = TransferArrayBuffer(pullIntoDescriptor.buffer);
+    pullIntoDescriptor.bytesFilled -= remainderSize;
+    ReadableByteStreamControllerCommitPullIntoDescriptor(controller._controlledReadableStream, pullIntoDescriptor);
+    ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller);
+  }
+  function ReadableByteStreamControllerRespondInternal(controller, bytesWritten) {
+    var firstDescriptor = controller._pendingPullIntos[0];
+    var stream = controller._controlledReadableStream;
+    if (stream._state === 'closed') {
+      if (bytesWritten !== 0) {
+        throw new TypeError('bytesWritten must be 0 when calling respond() on a closed stream');
+      }
+      ReadableByteStreamControllerRespondInClosedState(controller, firstDescriptor);
+    } else {
+      assert(stream._state === 'readable');
+      ReadableByteStreamControllerRespondInReadableState(controller, bytesWritten, firstDescriptor);
+    }
+  }
+  function ReadableByteStreamControllerShiftPendingPullInto(controller) {
+    var descriptor = controller._pendingPullIntos.shift();
+    ReadableByteStreamControllerInvalidateBYOBRequest(controller);
+    return descriptor;
+  }
+  function ReadableByteStreamControllerShouldCallPull(controller) {
+    var stream = controller._controlledReadableStream;
+    if (stream._state !== 'readable') {
+      return false;
+    }
+    if (controller._closeRequested === true) {
+      return false;
+    }
+    if (controller._started === false) {
+      return false;
+    }
+    if (ReadableStreamHasDefaultReader(stream) === true && ReadableStreamGetNumReadRequests(stream) > 0) {
+      return true;
+    }
+    if (ReadableStreamHasBYOBReader(stream) === true && ReadableStreamGetNumReadIntoRequests(stream) > 0) {
+      return true;
+    }
+    if (ReadableByteStreamControllerGetDesiredSize(controller) > 0) {
+      return true;
+    }
+    return false;
+  }
+  function ReadableByteStreamControllerClose(controller) {
+    var stream = controller._controlledReadableStream;
+    assert(controller._closeRequested === false);
+    assert(stream._state === 'readable');
+    if (controller._queueTotalSize > 0) {
+      controller._closeRequested = true;
+      return;
+    }
+    if (controller._pendingPullIntos.length > 0) {
+      var firstPendingPullInto = controller._pendingPullIntos[0];
+      if (firstPendingPullInto.bytesFilled > 0) {
+        var e = new TypeError('Insufficient bytes to fill elements in the given buffer');
+        ReadableByteStreamControllerError(controller, e);
+        throw e;
+      }
+    }
+    ReadableStreamClose(stream);
+  }
+  function ReadableByteStreamControllerEnqueue(controller, chunk) {
+    var stream = controller._controlledReadableStream;
+    assert(controller._closeRequested === false);
+    assert(stream._state === 'readable');
+    var buffer = chunk.buffer;
+    var byteOffset = chunk.byteOffset;
+    var byteLength = chunk.byteLength;
+    var transferredBuffer = TransferArrayBuffer(buffer);
+    if (ReadableStreamHasDefaultReader(stream) === true) {
+      if (ReadableStreamGetNumReadRequests(stream) === 0) {
+        ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength);
+      } else {
+        assert(controller._queue.length === 0);
+        var transferredView = new Uint8Array(transferredBuffer, byteOffset, byteLength);
+        ReadableStreamFulfillReadRequest(stream, transferredView, false);
+      }
+    } else if (ReadableStreamHasBYOBReader(stream) === true) {
+      ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength);
+      ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller);
+    } else {
+      assert(IsReadableStreamLocked(stream) === false, 'stream must not be locked');
+      ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength);
+    }
+  }
+  function ReadableByteStreamControllerError(controller, e) {
+    var stream = controller._controlledReadableStream;
+    assert(stream._state === 'readable');
+    ReadableByteStreamControllerClearPendingPullIntos(controller);
+    ResetQueue(controller);
+    ReadableStreamError(stream, e);
+  }
+  function ReadableByteStreamControllerGetDesiredSize(controller) {
+    var stream = controller._controlledReadableStream;
+    var state = stream._state;
+    if (state === 'errored') {
+      return null;
+    }
+    if (state === 'closed') {
+      return 0;
+    }
+    return controller._strategyHWM - controller._queueTotalSize;
+  }
+  function ReadableByteStreamControllerRespond(controller, bytesWritten) {
+    bytesWritten = Number(bytesWritten);
+    if (IsFiniteNonNegativeNumber(bytesWritten) === false) {
+      throw new RangeError('bytesWritten must be a finite');
+    }
+    assert(controller._pendingPullIntos.length > 0);
+    ReadableByteStreamControllerRespondInternal(controller, bytesWritten);
+  }
+  function ReadableByteStreamControllerRespondWithNewView(controller, view) {
+    assert(controller._pendingPullIntos.length > 0);
+    var firstDescriptor = controller._pendingPullIntos[0];
+    if (firstDescriptor.byteOffset + firstDescriptor.bytesFilled !== view.byteOffset) {
+      throw new RangeError('The region specified by view does not match byobRequest');
+    }
+    if (firstDescriptor.byteLength !== view.byteLength) {
+      throw new RangeError('The buffer of view has different capacity than byobRequest');
+    }
+    firstDescriptor.buffer = view.buffer;
+    ReadableByteStreamControllerRespondInternal(controller, view.byteLength);
+  }
+  function streamBrandCheckException(name) {
+    return new TypeError('ReadableStream.prototype.' + name + ' can only be used on a ReadableStream');
+  }
+  function readerLockException(name) {
+    return new TypeError('Cannot ' + name + ' a stream using a released reader');
+  }
+  function defaultReaderBrandCheckException(name) {
+    return new TypeError('ReadableStreamDefaultReader.prototype.' + name + ' can only be used on a ReadableStreamDefaultReader');
+  }
+  function defaultReaderClosedPromiseInitialize(reader) {
+    reader._closedPromise = new Promise(function (resolve, reject) {
+      reader._closedPromise_resolve = resolve;
+      reader._closedPromise_reject = reject;
+    });
+  }
+  function defaultReaderClosedPromiseInitializeAsRejected(reader, reason) {
+    reader._closedPromise = Promise.reject(reason);
+    reader._closedPromise_resolve = undefined;
+    reader._closedPromise_reject = undefined;
+  }
+  function defaultReaderClosedPromiseInitializeAsResolved(reader) {
+    reader._closedPromise = Promise.resolve(undefined);
+    reader._closedPromise_resolve = undefined;
+    reader._closedPromise_reject = undefined;
+  }
+  function defaultReaderClosedPromiseReject(reader, reason) {
+    assert(reader._closedPromise_resolve !== undefined);
+    assert(reader._closedPromise_reject !== undefined);
+    reader._closedPromise_reject(reason);
+    reader._closedPromise_resolve = undefined;
+    reader._closedPromise_reject = undefined;
+  }
+  function defaultReaderClosedPromiseResetToRejected(reader, reason) {
+    assert(reader._closedPromise_resolve === undefined);
+    assert(reader._closedPromise_reject === undefined);
+    reader._closedPromise = Promise.reject(reason);
+  }
+  function defaultReaderClosedPromiseResolve(reader) {
+    assert(reader._closedPromise_resolve !== undefined);
+    assert(reader._closedPromise_reject !== undefined);
+    reader._closedPromise_resolve(undefined);
+    reader._closedPromise_resolve = undefined;
+    reader._closedPromise_reject = undefined;
+  }
+  function byobReaderBrandCheckException(name) {
+    return new TypeError('ReadableStreamBYOBReader.prototype.' + name + ' can only be used on a ReadableStreamBYOBReader');
+  }
+  function defaultControllerBrandCheckException(name) {
+    return new TypeError('ReadableStreamDefaultController.prototype.' + name + ' can only be used on a ReadableStreamDefaultController');
+  }
+  function byobRequestBrandCheckException(name) {
+    return new TypeError('ReadableStreamBYOBRequest.prototype.' + name + ' can only be used on a ReadableStreamBYOBRequest');
+  }
+  function byteStreamControllerBrandCheckException(name) {
+    return new TypeError('ReadableByteStreamController.prototype.' + name + ' can only be used on a ReadableByteStreamController');
+  }
+  function ifIsObjectAndHasAPromiseIsHandledInternalSlotSetPromiseIsHandledToTrue(promise) {
+    try {
+      Promise.prototype.then.call(promise, undefined, function () {});
+    } catch (e) {}
+  }
+}, function (module, exports, __w_pdfjs_require__) {
+  "use strict";
+
+  var transformStream = __w_pdfjs_require__(6);
+  var readableStream = __w_pdfjs_require__(4);
+  var writableStream = __w_pdfjs_require__(2);
+  exports.TransformStream = transformStream.TransformStream;
+  exports.ReadableStream = readableStream.ReadableStream;
+  exports.IsReadableStreamDisturbed = readableStream.IsReadableStreamDisturbed;
+  exports.ReadableStreamDefaultControllerClose = readableStream.ReadableStreamDefaultControllerClose;
+  exports.ReadableStreamDefaultControllerEnqueue = readableStream.ReadableStreamDefaultControllerEnqueue;
+  exports.ReadableStreamDefaultControllerError = readableStream.ReadableStreamDefaultControllerError;
+  exports.ReadableStreamDefaultControllerGetDesiredSize = readableStream.ReadableStreamDefaultControllerGetDesiredSize;
+  exports.AcquireWritableStreamDefaultWriter = writableStream.AcquireWritableStreamDefaultWriter;
+  exports.IsWritableStream = writableStream.IsWritableStream;
+  exports.IsWritableStreamLocked = writableStream.IsWritableStreamLocked;
+  exports.WritableStream = writableStream.WritableStream;
+  exports.WritableStreamAbort = writableStream.WritableStreamAbort;
+  exports.WritableStreamDefaultControllerError = writableStream.WritableStreamDefaultControllerError;
+  exports.WritableStreamDefaultWriterCloseWithErrorPropagation = writableStream.WritableStreamDefaultWriterCloseWithErrorPropagation;
+  exports.WritableStreamDefaultWriterRelease = writableStream.WritableStreamDefaultWriterRelease;
+  exports.WritableStreamDefaultWriterWrite = writableStream.WritableStreamDefaultWriterWrite;
+}, function (module, exports, __w_pdfjs_require__) {
+  "use strict";
+
+  var _createClass = function () {
+    function defineProperties(target, props) {
+      for (var i = 0; i < props.length; i++) {
+        var descriptor = props[i];
+        descriptor.enumerable = descriptor.enumerable || false;
+        descriptor.configurable = true;
+        if ("value" in descriptor) descriptor.writable = true;
+        Object.defineProperty(target, descriptor.key, descriptor);
+      }
+    }
+    return function (Constructor, protoProps, staticProps) {
+      if (protoProps) defineProperties(Constructor.prototype, protoProps);
+      if (staticProps) defineProperties(Constructor, staticProps);
+      return Constructor;
+    };
+  }();
+  function _classCallCheck(instance, Constructor) {
+    if (!(instance instanceof Constructor)) {
+      throw new TypeError("Cannot call a class as a function");
+    }
+  }
+  var _require = __w_pdfjs_require__(1),
+      assert = _require.assert;
+  var _require2 = __w_pdfjs_require__(0),
+      InvokeOrNoop = _require2.InvokeOrNoop,
+      PromiseInvokeOrPerformFallback = _require2.PromiseInvokeOrPerformFallback,
+      PromiseInvokeOrNoop = _require2.PromiseInvokeOrNoop,
+      typeIsObject = _require2.typeIsObject;
+  var _require3 = __w_pdfjs_require__(4),
+      ReadableStream = _require3.ReadableStream,
+      ReadableStreamDefaultControllerClose = _require3.ReadableStreamDefaultControllerClose,
+      ReadableStreamDefaultControllerEnqueue = _require3.ReadableStreamDefaultControllerEnqueue,
+      ReadableStreamDefaultControllerError = _require3.ReadableStreamDefaultControllerError,
+      ReadableStreamDefaultControllerGetDesiredSize = _require3.ReadableStreamDefaultControllerGetDesiredSize;
+  var _require4 = __w_pdfjs_require__(2),
+      WritableStream = _require4.WritableStream,
+      WritableStreamDefaultControllerError = _require4.WritableStreamDefaultControllerError;
+  function TransformStreamCloseReadable(transformStream) {
+    if (transformStream._errored === true) {
+      throw new TypeError('TransformStream is already errored');
+    }
+    if (transformStream._readableClosed === true) {
+      throw new TypeError('Readable side is already closed');
+    }
+    TransformStreamCloseReadableInternal(transformStream);
+  }
+  function TransformStreamEnqueueToReadable(transformStream, chunk) {
+    if (transformStream._errored === true) {
+      throw new TypeError('TransformStream is already errored');
+    }
+    if (transformStream._readableClosed === true) {
+      throw new TypeError('Readable side is already closed');
+    }
+    var controller = transformStream._readableController;
+    try {
+      ReadableStreamDefaultControllerEnqueue(controller, chunk);
+    } catch (e) {
+      transformStream._readableClosed = true;
+      TransformStreamErrorIfNeeded(transformStream, e);
+      throw transformStream._storedError;
+    }
+    var desiredSize = ReadableStreamDefaultControllerGetDesiredSize(controller);
+    var maybeBackpressure = desiredSize <= 0;
+    if (maybeBackpressure === true && transformStream._backpressure === false) {
+      TransformStreamSetBackpressure(transformStream, true);
+    }
+  }
+  function TransformStreamError(transformStream, e) {
+    if (transformStream._errored === true) {
+      throw new TypeError('TransformStream is already errored');
+    }
+    TransformStreamErrorInternal(transformStream, e);
+  }
+  function TransformStreamCloseReadableInternal(transformStream) {
+    assert(transformStream._errored === false);
+    assert(transformStream._readableClosed === false);
+    try {
+      ReadableStreamDefaultControllerClose(transformStream._readableController);
+    } catch (e) {
+      assert(false);
+    }
+    transformStream._readableClosed = true;
+  }
+  function TransformStreamErrorIfNeeded(transformStream, e) {
+    if (transformStream._errored === false) {
+      TransformStreamErrorInternal(transformStream, e);
+    }
+  }
+  function TransformStreamErrorInternal(transformStream, e) {
+    assert(transformStream._errored === false);
+    transformStream._errored = true;
+    transformStream._storedError = e;
+    if (transformStream._writableDone === false) {
+      WritableStreamDefaultControllerError(transformStream._writableController, e);
+    }
+    if (transformStream._readableClosed === false) {
+      ReadableStreamDefaultControllerError(transformStream._readableController, e);
+    }
+  }
+  function TransformStreamReadableReadyPromise(transformStream) {
+    assert(transformStream._backpressureChangePromise !== undefined, '_backpressureChangePromise should have been initialized');
+    if (transformStream._backpressure === false) {
+      return Promise.resolve();
+    }
+    assert(transformStream._backpressure === true, '_backpressure should have been initialized');
+    return transformStream._backpressureChangePromise;
+  }
+  function TransformStreamSetBackpressure(transformStream, backpressure) {
+    assert(transformStream._backpressure !== backpressure, 'TransformStreamSetBackpressure() should be called only when backpressure is changed');
+    if (transformStream._backpressureChangePromise !== undefined) {
+      transformStream._backpressureChangePromise_resolve(backpressure);
+    }
+    transformStream._backpressureChangePromise = new Promise(function (resolve) {
+      transformStream._backpressureChangePromise_resolve = resolve;
+    });
+    transformStream._backpressureChangePromise.then(function (resolution) {
+      assert(resolution !== backpressure, '_backpressureChangePromise should be fulfilled only when backpressure is changed');
+    });
+    transformStream._backpressure = backpressure;
+  }
+  function TransformStreamDefaultTransform(chunk, transformStreamController) {
+    var transformStream = transformStreamController._controlledTransformStream;
+    TransformStreamEnqueueToReadable(transformStream, chunk);
+    return Promise.resolve();
+  }
+  function TransformStreamTransform(transformStream, chunk) {
+    assert(transformStream._errored === false);
+    assert(transformStream._transforming === false);
+    assert(transformStream._backpressure === false);
+    transformStream._transforming = true;
+    var transformer = transformStream._transformer;
+    var controller = transformStream._transformStreamController;
+    var transformPromise = PromiseInvokeOrPerformFallback(transformer, 'transform', [chunk, controller], TransformStreamDefaultTransform, [chunk, controller]);
+    return transformPromise.then(function () {
+      transformStream._transforming = false;
+      return TransformStreamReadableReadyPromise(transformStream);
+    }, function (e) {
+      TransformStreamErrorIfNeeded(transformStream, e);
+      return Promise.reject(e);
+    });
+  }
+  function IsTransformStreamDefaultController(x) {
+    if (!typeIsObject(x)) {
+      return false;
+    }
+    if (!Object.prototype.hasOwnProperty.call(x, '_controlledTransformStream')) {
+      return false;
+    }
+    return true;
+  }
+  function IsTransformStream(x) {
+    if (!typeIsObject(x)) {
+      return false;
+    }
+    if (!Object.prototype.hasOwnProperty.call(x, '_transformStreamController')) {
+      return false;
+    }
+    return true;
+  }
+  var TransformStreamSink = function () {
+    function TransformStreamSink(transformStream, startPromise) {
+      _classCallCheck(this, TransformStreamSink);
+      this._transformStream = transformStream;
+      this._startPromise = startPromise;
+    }
+    _createClass(TransformStreamSink, [{
+      key: 'start',
+      value: function start(c) {
+        var transformStream = this._transformStream;
+        transformStream._writableController = c;
+        return this._startPromise.then(function () {
+          return TransformStreamReadableReadyPromise(transformStream);
+        });
+      }
+    }, {
+      key: 'write',
+      value: function write(chunk) {
+        var transformStream = this._transformStream;
+        return TransformStreamTransform(transformStream, chunk);
+      }
+    }, {
+      key: 'abort',
+      value: function abort() {
+        var transformStream = this._transformStream;
+        transformStream._writableDone = true;
+        TransformStreamErrorInternal(transformStream, new TypeError('Writable side aborted'));
+      }
+    }, {
+      key: 'close',
+      value: function close() {
+        var transformStream = this._transformStream;
+        assert(transformStream._transforming === false);
+        transformStream._writableDone = true;
+        var flushPromise = PromiseInvokeOrNoop(transformStream._transformer, 'flush', [transformStream._transformStreamController]);
+        return flushPromise.then(function () {
+          if (transformStream._errored === true) {
+            return Promise.reject(transformStream._storedError);
+          }
+          if (transformStream._readableClosed === false) {
+            TransformStreamCloseReadableInternal(transformStream);
+          }
+          return Promise.resolve();
+        }).catch(function (r) {
+          TransformStreamErrorIfNeeded(transformStream, r);
+          return Promise.reject(transformStream._storedError);
+        });
+      }
+    }]);
+    return TransformStreamSink;
+  }();
+  var TransformStreamSource = function () {
+    function TransformStreamSource(transformStream, startPromise) {
+      _classCallCheck(this, TransformStreamSource);
+      this._transformStream = transformStream;
+      this._startPromise = startPromise;
+    }
+    _createClass(TransformStreamSource, [{
+      key: 'start',
+      value: function start(c) {
+        var transformStream = this._transformStream;
+        transformStream._readableController = c;
+        return this._startPromise.then(function () {
+          assert(transformStream._backpressureChangePromise !== undefined, '_backpressureChangePromise should have been initialized');
+          if (transformStream._backpressure === true) {
+            return Promise.resolve();
+          }
+          assert(transformStream._backpressure === false, '_backpressure should have been initialized');
+          return transformStream._backpressureChangePromise;
+        });
+      }
+    }, {
+      key: 'pull',
+      value: function pull() {
+        var transformStream = this._transformStream;
+        assert(transformStream._backpressure === true, 'pull() should be never called while _backpressure is false');
+        assert(transformStream._backpressureChangePromise !== undefined, '_backpressureChangePromise should have been initialized');
+        TransformStreamSetBackpressure(transformStream, false);
+        return transformStream._backpressureChangePromise;
+      }
+    }, {
+      key: 'cancel',
+      value: function cancel() {
+        var transformStream = this._transformStream;
+        transformStream._readableClosed = true;
+        TransformStreamErrorInternal(transformStream, new TypeError('Readable side canceled'));
+      }
+    }]);
+    return TransformStreamSource;
+  }();
+  var TransformStreamDefaultController = function () {
+    function TransformStreamDefaultController(transformStream) {
+      _classCallCheck(this, TransformStreamDefaultController);
+      if (IsTransformStream(transformStream) === false) {
+        throw new TypeError('TransformStreamDefaultController can only be ' + 'constructed with a TransformStream instance');
+      }
+      if (transformStream._transformStreamController !== undefined) {
+        throw new TypeError('TransformStreamDefaultController instances can ' + 'only be created by the TransformStream constructor');
+      }
+      this._controlledTransformStream = transformStream;
+    }
+    _createClass(TransformStreamDefaultController, [{
+      key: 'enqueue',
+      value: function enqueue(chunk) {
+        if (IsTransformStreamDefaultController(this) === false) {
+          throw defaultControllerBrandCheckException('enqueue');
+        }
+        TransformStreamEnqueueToReadable(this._controlledTransformStream, chunk);
+      }
+    }, {
+      key: 'close',
+      value: function close() {
+        if (IsTransformStreamDefaultController(this) === false) {
+          throw defaultControllerBrandCheckException('close');
+        }
+        TransformStreamCloseReadable(this._controlledTransformStream);
+      }
+    }, {
+      key: 'error',
+      value: function error(reason) {
+        if (IsTransformStreamDefaultController(this) === false) {
+          throw defaultControllerBrandCheckException('error');
+        }
+        TransformStreamError(this._controlledTransformStream, reason);
+      }
+    }, {
+      key: 'desiredSize',
+      get: function get() {
+        if (IsTransformStreamDefaultController(this) === false) {
+          throw defaultControllerBrandCheckException('desiredSize');
+        }
+        var transformStream = this._controlledTransformStream;
+        var readableController = transformStream._readableController;
+        return ReadableStreamDefaultControllerGetDesiredSize(readableController);
+      }
+    }]);
+    return TransformStreamDefaultController;
+  }();
+  var TransformStream = function () {
+    function TransformStream() {
+      var transformer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+      _classCallCheck(this, TransformStream);
+      this._transformer = transformer;
+      var readableStrategy = transformer.readableStrategy,
+          writableStrategy = transformer.writableStrategy;
+      this._transforming = false;
+      this._errored = false;
+      this._storedError = undefined;
+      this._writableController = undefined;
+      this._readableController = undefined;
+      this._transformStreamController = undefined;
+      this._writableDone = false;
+      this._readableClosed = false;
+      this._backpressure = undefined;
+      this._backpressureChangePromise = undefined;
+      this._backpressureChangePromise_resolve = undefined;
+      this._transformStreamController = new TransformStreamDefaultController(this);
+      var startPromise_resolve = void 0;
+      var startPromise = new Promise(function (resolve) {
+        startPromise_resolve = resolve;
+      });
+      var source = new TransformStreamSource(this, startPromise);
+      this._readable = new ReadableStream(source, readableStrategy);
+      var sink = new TransformStreamSink(this, startPromise);
+      this._writable = new WritableStream(sink, writableStrategy);
+      assert(this._writableController !== undefined);
+      assert(this._readableController !== undefined);
+      var desiredSize = ReadableStreamDefaultControllerGetDesiredSize(this._readableController);
+      TransformStreamSetBackpressure(this, desiredSize <= 0);
+      var transformStream = this;
+      var startResult = InvokeOrNoop(transformer, 'start', [transformStream._transformStreamController]);
+      startPromise_resolve(startResult);
+      startPromise.catch(function (e) {
+        if (transformStream._errored === false) {
+          transformStream._errored = true;
+          transformStream._storedError = e;
+        }
+      });
+    }
+    _createClass(TransformStream, [{
+      key: 'readable',
+      get: function get() {
+        if (IsTransformStream(this) === false) {
+          throw streamBrandCheckException('readable');
+        }
+        return this._readable;
+      }
+    }, {
+      key: 'writable',
+      get: function get() {
+        if (IsTransformStream(this) === false) {
+          throw streamBrandCheckException('writable');
+        }
+        return this._writable;
+      }
+    }]);
+    return TransformStream;
+  }();
+  module.exports = { TransformStream: TransformStream };
+  function defaultControllerBrandCheckException(name) {
+    return new TypeError('TransformStreamDefaultController.prototype.' + name + ' can only be used on a TransformStreamDefaultController');
+  }
+  function streamBrandCheckException(name) {
+    return new TypeError('TransformStream.prototype.' + name + ' can only be used on a TransformStream');
+  }
+}, function (module, exports, __w_pdfjs_require__) {
+  module.exports = __w_pdfjs_require__(5);
+}]));
+
+/***/ }),
+/* 128 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+{
+  var isURLSupported = false;
+  try {
+    if (typeof URL === 'function' && _typeof(URL.prototype) === 'object' && 'origin' in URL.prototype) {
+      var u = new URL('b', 'http://a');
+      u.pathname = 'c%20d';
+      isURLSupported = u.href === 'http://a/c%20d';
+    }
+  } catch (ex) {}
+  if (isURLSupported) {
+    exports.URL = URL;
+  } else {
+    var PolyfillURL = __w_pdfjs_require__(129).URL;
+    var OriginalURL = __w_pdfjs_require__(4).URL;
+    if (OriginalURL) {
+      PolyfillURL.createObjectURL = function (blob) {
+        return OriginalURL.createObjectURL.apply(OriginalURL, arguments);
+      };
+      PolyfillURL.revokeObjectURL = function (url) {
+        OriginalURL.revokeObjectURL(url);
+      };
+    }
+    exports.URL = PolyfillURL;
+  }
+}
+
+/***/ }),
+/* 129 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+(function URLConstructorClosure() {
+  'use strict';
+
+  var relative = Object.create(null);
+  relative['ftp'] = 21;
+  relative['file'] = 0;
+  relative['gopher'] = 70;
+  relative['http'] = 80;
+  relative['https'] = 443;
+  relative['ws'] = 80;
+  relative['wss'] = 443;
+  var relativePathDotMapping = Object.create(null);
+  relativePathDotMapping['%2e'] = '.';
+  relativePathDotMapping['.%2e'] = '..';
+  relativePathDotMapping['%2e.'] = '..';
+  relativePathDotMapping['%2e%2e'] = '..';
+  function isRelativeScheme(scheme) {
+    return relative[scheme] !== undefined;
+  }
+  function invalid() {
+    clear.call(this);
+    this._isInvalid = true;
+  }
+  function IDNAToASCII(h) {
+    if (h === '') {
+      invalid.call(this);
+    }
+    return h.toLowerCase();
+  }
+  function percentEscape(c) {
+    var unicode = c.charCodeAt(0);
+    if (unicode > 0x20 && unicode < 0x7F && [0x22, 0x23, 0x3C, 0x3E, 0x3F, 0x60].indexOf(unicode) === -1) {
+      return c;
+    }
+    return encodeURIComponent(c);
+  }
+  function percentEscapeQuery(c) {
+    var unicode = c.charCodeAt(0);
+    if (unicode > 0x20 && unicode < 0x7F && [0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) === -1) {
+      return c;
+    }
+    return encodeURIComponent(c);
+  }
+  var EOF,
+      ALPHA = /[a-zA-Z]/,
+      ALPHANUMERIC = /[a-zA-Z0-9\+\-\.]/;
+  function parse(input, stateOverride, base) {
+    function err(message) {
+      errors.push(message);
+    }
+    var state = stateOverride || 'scheme start',
+        cursor = 0,
+        buffer = '',
+        seenAt = false,
+        seenBracket = false,
+        errors = [];
+    loop: while ((input[cursor - 1] !== EOF || cursor === 0) && !this._isInvalid) {
+      var c = input[cursor];
+      switch (state) {
+        case 'scheme start':
+          if (c && ALPHA.test(c)) {
+            buffer += c.toLowerCase();
+            state = 'scheme';
+          } else if (!stateOverride) {
+            buffer = '';
+            state = 'no scheme';
+            continue;
+          } else {
+            err('Invalid scheme.');
+            break loop;
+          }
+          break;
+        case 'scheme':
+          if (c && ALPHANUMERIC.test(c)) {
+            buffer += c.toLowerCase();
+          } else if (c === ':') {
+            this._scheme = buffer;
+            buffer = '';
+            if (stateOverride) {
+              break loop;
+            }
+            if (isRelativeScheme(this._scheme)) {
+              this._isRelative = true;
+            }
+            if (this._scheme === 'file') {
+              state = 'relative';
+            } else if (this._isRelative && base && base._scheme === this._scheme) {
+              state = 'relative or authority';
+            } else if (this._isRelative) {
+              state = 'authority first slash';
+            } else {
+              state = 'scheme data';
+            }
+          } else if (!stateOverride) {
+            buffer = '';
+            cursor = 0;
+            state = 'no scheme';
+            continue;
+          } else if (c === EOF) {
+            break loop;
+          } else {
+            err('Code point not allowed in scheme: ' + c);
+            break loop;
+          }
+          break;
+        case 'scheme data':
+          if (c === '?') {
+            this._query = '?';
+            state = 'query';
+          } else if (c === '#') {
+            this._fragment = '#';
+            state = 'fragment';
+          } else {
+            if (c !== EOF && c !== '\t' && c !== '\n' && c !== '\r') {
+              this._schemeData += percentEscape(c);
+            }
+          }
+          break;
+        case 'no scheme':
+          if (!base || !isRelativeScheme(base._scheme)) {
+            err('Missing scheme.');
+            invalid.call(this);
+          } else {
+            state = 'relative';
+            continue;
+          }
+          break;
+        case 'relative or authority':
+          if (c === '/' && input[cursor + 1] === '/') {
+            state = 'authority ignore slashes';
+          } else {
+            err('Expected /, got: ' + c);
+            state = 'relative';
+            continue;
+          }
+          break;
+        case 'relative':
+          this._isRelative = true;
+          if (this._scheme !== 'file') {
+            this._scheme = base._scheme;
+          }
+          if (c === EOF) {
+            this._host = base._host;
+            this._port = base._port;
+            this._path = base._path.slice();
+            this._query = base._query;
+            this._username = base._username;
+            this._password = base._password;
+            break loop;
+          } else if (c === '/' || c === '\\') {
+            if (c === '\\') {
+              err('\\ is an invalid code point.');
+            }
+            state = 'relative slash';
+          } else if (c === '?') {
+            this._host = base._host;
+            this._port = base._port;
+            this._path = base._path.slice();
+            this._query = '?';
+            this._username = base._username;
+            this._password = base._password;
+            state = 'query';
+          } else if (c === '#') {
+            this._host = base._host;
+            this._port = base._port;
+            this._path = base._path.slice();
+            this._query = base._query;
+            this._fragment = '#';
+            this._username = base._username;
+            this._password = base._password;
+            state = 'fragment';
+          } else {
+            var nextC = input[cursor + 1];
+            var nextNextC = input[cursor + 2];
+            if (this._scheme !== 'file' || !ALPHA.test(c) || nextC !== ':' && nextC !== '|' || nextNextC !== EOF && nextNextC !== '/' && nextNextC !== '\\' && nextNextC !== '?' && nextNextC !== '#') {
+              this._host = base._host;
+              this._port = base._port;
+              this._username = base._username;
+              this._password = base._password;
+              this._path = base._path.slice();
+              this._path.pop();
+            }
+            state = 'relative path';
+            continue;
+          }
+          break;
+        case 'relative slash':
+          if (c === '/' || c === '\\') {
+            if (c === '\\') {
+              err('\\ is an invalid code point.');
+            }
+            if (this._scheme === 'file') {
+              state = 'file host';
+            } else {
+              state = 'authority ignore slashes';
+            }
+          } else {
+            if (this._scheme !== 'file') {
+              this._host = base._host;
+              this._port = base._port;
+              this._username = base._username;
+              this._password = base._password;
+            }
+            state = 'relative path';
+            continue;
+          }
+          break;
+        case 'authority first slash':
+          if (c === '/') {
+            state = 'authority second slash';
+          } else {
+            err('Expected \'/\', got: ' + c);
+            state = 'authority ignore slashes';
+            continue;
+          }
+          break;
+        case 'authority second slash':
+          state = 'authority ignore slashes';
+          if (c !== '/') {
+            err('Expected \'/\', got: ' + c);
+            continue;
+          }
+          break;
+        case 'authority ignore slashes':
+          if (c !== '/' && c !== '\\') {
+            state = 'authority';
+            continue;
+          } else {
+            err('Expected authority, got: ' + c);
+          }
+          break;
+        case 'authority':
+          if (c === '@') {
+            if (seenAt) {
+              err('@ already seen.');
+              buffer += '%40';
+            }
+            seenAt = true;
+            for (var i = 0; i < buffer.length; i++) {
+              var cp = buffer[i];
+              if (cp === '\t' || cp === '\n' || cp === '\r') {
+                err('Invalid whitespace in authority.');
+                continue;
+              }
+              if (cp === ':' && this._password === null) {
+                this._password = '';
+                continue;
+              }
+              var tempC = percentEscape(cp);
+              if (this._password !== null) {
+                this._password += tempC;
+              } else {
+                this._username += tempC;
+              }
+            }
+            buffer = '';
+          } else if (c === EOF || c === '/' || c === '\\' || c === '?' || c === '#') {
+            cursor -= buffer.length;
+            buffer = '';
+            state = 'host';
+            continue;
+          } else {
+            buffer += c;
+          }
+          break;
+        case 'file host':
+          if (c === EOF || c === '/' || c === '\\' || c === '?' || c === '#') {
+            if (buffer.length === 2 && ALPHA.test(buffer[0]) && (buffer[1] === ':' || buffer[1] === '|')) {
+              state = 'relative path';
+            } else if (buffer.length === 0) {
+              state = 'relative path start';
+            } else {
+              this._host = IDNAToASCII.call(this, buffer);
+              buffer = '';
+              state = 'relative path start';
+            }
+            continue;
+          } else if (c === '\t' || c === '\n' || c === '\r') {
+            err('Invalid whitespace in file host.');
+          } else {
+            buffer += c;
+          }
+          break;
+        case 'host':
+        case 'hostname':
+          if (c === ':' && !seenBracket) {
+            this._host = IDNAToASCII.call(this, buffer);
+            buffer = '';
+            state = 'port';
+            if (stateOverride === 'hostname') {
+              break loop;
+            }
+          } else if (c === EOF || c === '/' || c === '\\' || c === '?' || c === '#') {
+            this._host = IDNAToASCII.call(this, buffer);
+            buffer = '';
+            state = 'relative path start';
+            if (stateOverride) {
+              break loop;
+            }
+            continue;
+          } else if (c !== '\t' && c !== '\n' && c !== '\r') {
+            if (c === '[') {
+              seenBracket = true;
+            } else if (c === ']') {
+              seenBracket = false;
+            }
+            buffer += c;
+          } else {
+            err('Invalid code point in host/hostname: ' + c);
+          }
+          break;
+        case 'port':
+          if (/[0-9]/.test(c)) {
+            buffer += c;
+          } else if (c === EOF || c === '/' || c === '\\' || c === '?' || c === '#' || stateOverride) {
+            if (buffer !== '') {
+              var temp = parseInt(buffer, 10);
+              if (temp !== relative[this._scheme]) {
+                this._port = temp + '';
+              }
+              buffer = '';
+            }
+            if (stateOverride) {
+              break loop;
+            }
+            state = 'relative path start';
+            continue;
+          } else if (c === '\t' || c === '\n' || c === '\r') {
+            err('Invalid code point in port: ' + c);
+          } else {
+            invalid.call(this);
+          }
+          break;
+        case 'relative path start':
+          if (c === '\\') {
+            err('\'\\\' not allowed in path.');
+          }
+          state = 'relative path';
+          if (c !== '/' && c !== '\\') {
+            continue;
+          }
+          break;
+        case 'relative path':
+          if (c === EOF || c === '/' || c === '\\' || !stateOverride && (c === '?' || c === '#')) {
+            if (c === '\\') {
+              err('\\ not allowed in relative path.');
+            }
+            var tmp;
+            if (tmp = relativePathDotMapping[buffer.toLowerCase()]) {
+              buffer = tmp;
+            }
+            if (buffer === '..') {
+              this._path.pop();
+              if (c !== '/' && c !== '\\') {
+                this._path.push('');
+              }
+            } else if (buffer === '.' && c !== '/' && c !== '\\') {
+              this._path.push('');
+            } else if (buffer !== '.') {
+              if (this._scheme === 'file' && this._path.length === 0 && buffer.length === 2 && ALPHA.test(buffer[0]) && buffer[1] === '|') {
+                buffer = buffer[0] + ':';
+              }
+              this._path.push(buffer);
+            }
+            buffer = '';
+            if (c === '?') {
+              this._query = '?';
+              state = 'query';
+            } else if (c === '#') {
+              this._fragment = '#';
+              state = 'fragment';
+            }
+          } else if (c !== '\t' && c !== '\n' && c !== '\r') {
+            buffer += percentEscape(c);
+          }
+          break;
+        case 'query':
+          if (!stateOverride && c === '#') {
+            this._fragment = '#';
+            state = 'fragment';
+          } else if (c !== EOF && c !== '\t' && c !== '\n' && c !== '\r') {
+            this._query += percentEscapeQuery(c);
+          }
+          break;
+        case 'fragment':
+          if (c !== EOF && c !== '\t' && c !== '\n' && c !== '\r') {
+            this._fragment += c;
+          }
+          break;
+      }
+      cursor++;
+    }
+  }
+  function clear() {
+    this._scheme = '';
+    this._schemeData = '';
+    this._username = '';
+    this._password = null;
+    this._host = '';
+    this._port = '';
+    this._path = [];
+    this._query = '';
+    this._fragment = '';
+    this._isInvalid = false;
+    this._isRelative = false;
+  }
+  function JURL(url, base) {
+    if (base !== undefined && !(base instanceof JURL)) {
+      base = new JURL(String(base));
+    }
+    this._url = url;
+    clear.call(this);
+    var input = url.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g, '');
+    parse.call(this, input, null, base);
+  }
+  JURL.prototype = {
+    toString: function toString() {
+      return this.href;
+    },
+
+    get href() {
+      if (this._isInvalid) {
+        return this._url;
+      }
+      var authority = '';
+      if (this._username !== '' || this._password !== null) {
+        authority = this._username + (this._password !== null ? ':' + this._password : '') + '@';
+      }
+      return this.protocol + (this._isRelative ? '//' + authority + this.host : '') + this.pathname + this._query + this._fragment;
+    },
+    set href(value) {
+      clear.call(this);
+      parse.call(this, value);
+    },
+    get protocol() {
+      return this._scheme + ':';
+    },
+    set protocol(value) {
+      if (this._isInvalid) {
+        return;
+      }
+      parse.call(this, value + ':', 'scheme start');
+    },
+    get host() {
+      return this._isInvalid ? '' : this._port ? this._host + ':' + this._port : this._host;
+    },
+    set host(value) {
+      if (this._isInvalid || !this._isRelative) {
+        return;
+      }
+      parse.call(this, value, 'host');
+    },
+    get hostname() {
+      return this._host;
+    },
+    set hostname(value) {
+      if (this._isInvalid || !this._isRelative) {
+        return;
+      }
+      parse.call(this, value, 'hostname');
+    },
+    get port() {
+      return this._port;
+    },
+    set port(value) {
+      if (this._isInvalid || !this._isRelative) {
+        return;
+      }
+      parse.call(this, value, 'port');
+    },
+    get pathname() {
+      return this._isInvalid ? '' : this._isRelative ? '/' + this._path.join('/') : this._schemeData;
+    },
+    set pathname(value) {
+      if (this._isInvalid || !this._isRelative) {
+        return;
+      }
+      this._path = [];
+      parse.call(this, value, 'relative path start');
+    },
+    get search() {
+      return this._isInvalid || !this._query || this._query === '?' ? '' : this._query;
+    },
+    set search(value) {
+      if (this._isInvalid || !this._isRelative) {
+        return;
+      }
+      this._query = '?';
+      if (value[0] === '?') {
+        value = value.slice(1);
+      }
+      parse.call(this, value, 'query');
+    },
+    get hash() {
+      return this._isInvalid || !this._fragment || this._fragment === '#' ? '' : this._fragment;
+    },
+    set hash(value) {
+      if (this._isInvalid) {
+        return;
+      }
+      this._fragment = '#';
+      if (value[0] === '#') {
+        value = value.slice(1);
+      }
+      parse.call(this, value, 'fragment');
+    },
+    get origin() {
+      var host;
+      if (this._isInvalid || !this._scheme) {
+        return '';
+      }
+      switch (this._scheme) {
+        case 'data':
+        case 'file':
+        case 'javascript':
+        case 'mailto':
+          return 'null';
+        case 'blob':
+          try {
+            return new JURL(this._schemeData).origin || 'null';
+          } catch (_) {}
+          return 'null';
+      }
+      host = this.host;
+      if (!host) {
+        return '';
+      }
+      return this._scheme + '://' + host;
+    }
+  };
+  exports.URL = JURL;
+})();
+
+/***/ }),
+/* 130 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.NetworkPdfManager = exports.LocalPdfManager = undefined;
+
+var _regenerator = __w_pdfjs_require__(131);
+
+var _regenerator2 = _interopRequireDefault(_regenerator);
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _util = __w_pdfjs_require__(2);
+
+var _chunked_stream = __w_pdfjs_require__(135);
+
+var _document = __w_pdfjs_require__(136);
+
+var _stream = __w_pdfjs_require__(140);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var BasePdfManager = function () {
+  function BasePdfManager() {
+    _classCallCheck(this, BasePdfManager);
+
+    if (this.constructor === BasePdfManager) {
+      (0, _util.unreachable)('Cannot initialize BasePdfManager.');
+    }
+  }
+
+  _createClass(BasePdfManager, [{
+    key: 'onLoadedStream',
+    value: function onLoadedStream() {
+      (0, _util.unreachable)('Abstract method `onLoadedStream` called');
+    }
+  }, {
+    key: 'ensureDoc',
+    value: function ensureDoc(prop, args) {
+      return this.ensure(this.pdfDocument, prop, args);
+    }
+  }, {
+    key: 'ensureXRef',
+    value: function ensureXRef(prop, args) {
+      return this.ensure(this.pdfDocument.xref, prop, args);
+    }
+  }, {
+    key: 'ensureCatalog',
+    value: function ensureCatalog(prop, args) {
+      return this.ensure(this.pdfDocument.catalog, prop, args);
+    }
+  }, {
+    key: 'getPage',
+    value: function getPage(pageIndex) {
+      return this.pdfDocument.getPage(pageIndex);
+    }
+  }, {
+    key: 'cleanup',
+    value: function cleanup() {
+      return this.pdfDocument.cleanup();
+    }
+  }, {
+    key: 'ensure',
+    value: function () {
+      var _ref = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee(obj, prop, args) {
+        return _regenerator2.default.wrap(function _callee$(_context) {
+          while (1) {
+            switch (_context.prev = _context.next) {
+              case 0:
+                (0, _util.unreachable)('Abstract method `ensure` called');
+
+              case 1:
+              case 'end':
+                return _context.stop();
+            }
+          }
+        }, _callee, this);
+      }));
+
+      function ensure(_x, _x2, _x3) {
+        return _ref.apply(this, arguments);
+      }
+
+      return ensure;
+    }()
+  }, {
+    key: 'requestRange',
+    value: function requestRange(begin, end) {
+      (0, _util.unreachable)('Abstract method `requestRange` called');
+    }
+  }, {
+    key: 'requestLoadedStream',
+    value: function requestLoadedStream() {
+      (0, _util.unreachable)('Abstract method `requestLoadedStream` called');
+    }
+  }, {
+    key: 'sendProgressiveData',
+    value: function sendProgressiveData(chunk) {
+      (0, _util.unreachable)('Abstract method `sendProgressiveData` called');
+    }
+  }, {
+    key: 'updatePassword',
+    value: function updatePassword(password) {
+      this._password = password;
+    }
+  }, {
+    key: 'terminate',
+    value: function terminate() {
+      (0, _util.unreachable)('Abstract method `terminate` called');
+    }
+  }, {
+    key: 'docId',
+    get: function get() {
+      return this._docId;
+    }
+  }, {
+    key: 'password',
+    get: function get() {
+      return this._password;
+    }
+  }, {
+    key: 'docBaseUrl',
+    get: function get() {
+      var docBaseUrl = null;
+      if (this._docBaseUrl) {
+        var absoluteUrl = (0, _util.createValidAbsoluteUrl)(this._docBaseUrl);
+        if (absoluteUrl) {
+          docBaseUrl = absoluteUrl.href;
+        } else {
+          (0, _util.warn)('Invalid absolute docBaseUrl: "' + this._docBaseUrl + '".');
+        }
+      }
+      return (0, _util.shadow)(this, 'docBaseUrl', docBaseUrl);
+    }
+  }]);
+
+  return BasePdfManager;
+}();
+
+var LocalPdfManager = function (_BasePdfManager) {
+  _inherits(LocalPdfManager, _BasePdfManager);
+
+  function LocalPdfManager(docId, data, password, evaluatorOptions, docBaseUrl) {
+    _classCallCheck(this, LocalPdfManager);
+
+    var _this = _possibleConstructorReturn(this, (LocalPdfManager.__proto__ || Object.getPrototypeOf(LocalPdfManager)).call(this));
+
+    _this._docId = docId;
+    _this._password = password;
+    _this._docBaseUrl = docBaseUrl;
+    _this.evaluatorOptions = evaluatorOptions;
+    var stream = new _stream.Stream(data);
+    _this.pdfDocument = new _document.PDFDocument(_this, stream);
+    _this._loadedStreamPromise = Promise.resolve(stream);
+    return _this;
+  }
+
+  _createClass(LocalPdfManager, [{
+    key: 'ensure',
+    value: function () {
+      var _ref2 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee2(obj, prop, args) {
+        var value;
+        return _regenerator2.default.wrap(function _callee2$(_context2) {
+          while (1) {
+            switch (_context2.prev = _context2.next) {
+              case 0:
+                value = obj[prop];
+
+                if (!(typeof value === 'function')) {
+                  _context2.next = 3;
+                  break;
+                }
+
+                return _context2.abrupt('return', value.apply(obj, args));
+
+              case 3:
+                return _context2.abrupt('return', value);
+
+              case 4:
+              case 'end':
+                return _context2.stop();
+            }
+          }
+        }, _callee2, this);
+      }));
+
+      function ensure(_x4, _x5, _x6) {
+        return _ref2.apply(this, arguments);
+      }
+
+      return ensure;
+    }()
+  }, {
+    key: 'requestRange',
+    value: function requestRange(begin, end) {
+      return Promise.resolve();
+    }
+  }, {
+    key: 'requestLoadedStream',
+    value: function requestLoadedStream() {}
+  }, {
+    key: 'onLoadedStream',
+    value: function onLoadedStream() {
+      return this._loadedStreamPromise;
+    }
+  }, {
+    key: 'terminate',
+    value: function terminate() {}
+  }]);
+
+  return LocalPdfManager;
+}(BasePdfManager);
+
+var NetworkPdfManager = function (_BasePdfManager2) {
+  _inherits(NetworkPdfManager, _BasePdfManager2);
+
+  function NetworkPdfManager(docId, pdfNetworkStream, args, evaluatorOptions, docBaseUrl) {
+    _classCallCheck(this, NetworkPdfManager);
+
+    var _this2 = _possibleConstructorReturn(this, (NetworkPdfManager.__proto__ || Object.getPrototypeOf(NetworkPdfManager)).call(this));
+
+    _this2._docId = docId;
+    _this2._password = args.password;
+    _this2._docBaseUrl = docBaseUrl;
+    _this2.msgHandler = args.msgHandler;
+    _this2.evaluatorOptions = evaluatorOptions;
+    _this2.streamManager = new _chunked_stream.ChunkedStreamManager(pdfNetworkStream, {
+      msgHandler: args.msgHandler,
+      url: args.url,
+      length: args.length,
+      disableAutoFetch: args.disableAutoFetch,
+      rangeChunkSize: args.rangeChunkSize
+    });
+    _this2.pdfDocument = new _document.PDFDocument(_this2, _this2.streamManager.getStream());
+    return _this2;
+  }
+
+  _createClass(NetworkPdfManager, [{
+    key: 'ensure',
+    value: function () {
+      var _ref3 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee3(obj, prop, args) {
+        var value;
+        return _regenerator2.default.wrap(function _callee3$(_context3) {
+          while (1) {
+            switch (_context3.prev = _context3.next) {
+              case 0:
+                _context3.prev = 0;
+                value = obj[prop];
+
+                if (!(typeof value === 'function')) {
+                  _context3.next = 4;
+                  break;
+                }
+
+                return _context3.abrupt('return', value.apply(obj, args));
+
+              case 4:
+                return _context3.abrupt('return', value);
+
+              case 7:
+                _context3.prev = 7;
+                _context3.t0 = _context3['catch'](0);
+
+                if (_context3.t0 instanceof _util.MissingDataException) {
+                  _context3.next = 11;
+                  break;
+                }
+
+                throw _context3.t0;
+
+              case 11:
+                _context3.next = 13;
+                return this.requestRange(_context3.t0.begin, _context3.t0.end);
+
+              case 13:
+                return _context3.abrupt('return', this.ensure(obj, prop, args));
+
+              case 14:
+              case 'end':
+                return _context3.stop();
+            }
+          }
+        }, _callee3, this, [[0, 7]]);
+      }));
+
+      function ensure(_x7, _x8, _x9) {
+        return _ref3.apply(this, arguments);
+      }
+
+      return ensure;
+    }()
+  }, {
+    key: 'requestRange',
+    value: function requestRange(begin, end) {
+      return this.streamManager.requestRange(begin, end);
+    }
+  }, {
+    key: 'requestLoadedStream',
+    value: function requestLoadedStream() {
+      this.streamManager.requestAllChunks();
+    }
+  }, {
+    key: 'sendProgressiveData',
+    value: function sendProgressiveData(chunk) {
+      this.streamManager.onReceiveData({ chunk: chunk });
+    }
+  }, {
+    key: 'onLoadedStream',
+    value: function onLoadedStream() {
+      return this.streamManager.onLoadedStream();
+    }
+  }, {
+    key: 'terminate',
+    value: function terminate() {
+      this.streamManager.abort();
+    }
+  }]);
+
+  return NetworkPdfManager;
+}(BasePdfManager);
+
+exports.LocalPdfManager = LocalPdfManager;
+exports.NetworkPdfManager = NetworkPdfManager;
+
+/***/ }),
+/* 131 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+module.exports = __w_pdfjs_require__(132);
+
+/***/ }),
+/* 132 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+var g = function () {
+  return this;
+}() || Function("return this")();
+var hadRuntime = g.regeneratorRuntime && Object.getOwnPropertyNames(g).indexOf("regeneratorRuntime") >= 0;
+var oldRuntime = hadRuntime && g.regeneratorRuntime;
+g.regeneratorRuntime = undefined;
+module.exports = __w_pdfjs_require__(133);
+if (hadRuntime) {
+  g.regeneratorRuntime = oldRuntime;
+} else {
+  try {
+    delete g.regeneratorRuntime;
+  } catch (e) {
+    g.regeneratorRuntime = undefined;
+  }
+}
+
+/***/ }),
+/* 133 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+/* WEBPACK VAR INJECTION */(function(module) {
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+!function (global) {
+  "use strict";
+
+  var Op = Object.prototype;
+  var hasOwn = Op.hasOwnProperty;
+  var undefined;
+  var $Symbol = typeof Symbol === "function" ? Symbol : {};
+  var iteratorSymbol = $Symbol.iterator || "@@iterator";
+  var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator";
+  var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";
+  var inModule = ( false ? undefined : _typeof(module)) === "object";
+  var runtime = global.regeneratorRuntime;
+  if (runtime) {
+    if (inModule) {
+      module.exports = runtime;
+    }
+    return;
+  }
+  runtime = global.regeneratorRuntime = inModule ? module.exports : {};
+  function wrap(innerFn, outerFn, self, tryLocsList) {
+    var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;
+    var generator = Object.create(protoGenerator.prototype);
+    var context = new Context(tryLocsList || []);
+    generator._invoke = makeInvokeMethod(innerFn, self, context);
+    return generator;
+  }
+  runtime.wrap = wrap;
+  function tryCatch(fn, obj, arg) {
+    try {
+      return {
+        type: "normal",
+        arg: fn.call(obj, arg)
+      };
+    } catch (err) {
+      return {
+        type: "throw",
+        arg: err
+      };
+    }
+  }
+  var GenStateSuspendedStart = "suspendedStart";
+  var GenStateSuspendedYield = "suspendedYield";
+  var GenStateExecuting = "executing";
+  var GenStateCompleted = "completed";
+  var ContinueSentinel = {};
+  function Generator() {}
+  function GeneratorFunction() {}
+  function GeneratorFunctionPrototype() {}
+  var IteratorPrototype = {};
+  IteratorPrototype[iteratorSymbol] = function () {
+    return this;
+  };
+  var getProto = Object.getPrototypeOf;
+  var NativeIteratorPrototype = getProto && getProto(getProto(values([])));
+  if (NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {
+    IteratorPrototype = NativeIteratorPrototype;
+  }
+  var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype);
+  GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;
+  GeneratorFunctionPrototype.constructor = GeneratorFunction;
+  GeneratorFunctionPrototype[toStringTagSymbol] = GeneratorFunction.displayName = "GeneratorFunction";
+  function defineIteratorMethods(prototype) {
+    ["next", "throw", "return"].forEach(function (method) {
+      prototype[method] = function (arg) {
+        return this._invoke(method, arg);
+      };
+    });
+  }
+  runtime.isGeneratorFunction = function (genFun) {
+    var ctor = typeof genFun === "function" && genFun.constructor;
+    return ctor ? ctor === GeneratorFunction || (ctor.displayName || ctor.name) === "GeneratorFunction" : false;
+  };
+  runtime.mark = function (genFun) {
+    if (Object.setPrototypeOf) {
+      Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);
+    } else {
+      genFun.__proto__ = GeneratorFunctionPrototype;
+      if (!(toStringTagSymbol in genFun)) {
+        genFun[toStringTagSymbol] = "GeneratorFunction";
+      }
+    }
+    genFun.prototype = Object.create(Gp);
+    return genFun;
+  };
+  runtime.awrap = function (arg) {
+    return { __await: arg };
+  };
+  function AsyncIterator(generator) {
+    function invoke(method, arg, resolve, reject) {
+      var record = tryCatch(generator[method], generator, arg);
+      if (record.type === "throw") {
+        reject(record.arg);
+      } else {
+        var result = record.arg;
+        var value = result.value;
+        if (value && (typeof value === "undefined" ? "undefined" : _typeof(value)) === "object" && hasOwn.call(value, "__await")) {
+          return Promise.resolve(value.__await).then(function (value) {
+            invoke("next", value, resolve, reject);
+          }, function (err) {
+            invoke("throw", err, resolve, reject);
+          });
+        }
+        return Promise.resolve(value).then(function (unwrapped) {
+          result.value = unwrapped;
+          resolve(result);
+        }, reject);
+      }
+    }
+    var previousPromise;
+    function enqueue(method, arg) {
+      function callInvokeWithMethodAndArg() {
+        return new Promise(function (resolve, reject) {
+          invoke(method, arg, resolve, reject);
+        });
+      }
+      return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();
+    }
+    this._invoke = enqueue;
+  }
+  defineIteratorMethods(AsyncIterator.prototype);
+  AsyncIterator.prototype[asyncIteratorSymbol] = function () {
+    return this;
+  };
+  runtime.AsyncIterator = AsyncIterator;
+  runtime.async = function (innerFn, outerFn, self, tryLocsList) {
+    var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList));
+    return runtime.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) {
+      return result.done ? result.value : iter.next();
+    });
+  };
+  function makeInvokeMethod(innerFn, self, context) {
+    var state = GenStateSuspendedStart;
+    return function invoke(method, arg) {
+      if (state === GenStateExecuting) {
+        throw new Error("Generator is already running");
+      }
+      if (state === GenStateCompleted) {
+        if (method === "throw") {
+          throw arg;
+        }
+        return doneResult();
+      }
+      context.method = method;
+      context.arg = arg;
+      while (true) {
+        var delegate = context.delegate;
+        if (delegate) {
+          var delegateResult = maybeInvokeDelegate(delegate, context);
+          if (delegateResult) {
+            if (delegateResult === ContinueSentinel) continue;
+            return delegateResult;
+          }
+        }
+        if (context.method === "next") {
+          context.sent = context._sent = context.arg;
+        } else if (context.method === "throw") {
+          if (state === GenStateSuspendedStart) {
+            state = GenStateCompleted;
+            throw context.arg;
+          }
+          context.dispatchException(context.arg);
+        } else if (context.method === "return") {
+          context.abrupt("return", context.arg);
+        }
+        state = GenStateExecuting;
+        var record = tryCatch(innerFn, self, context);
+        if (record.type === "normal") {
+          state = context.done ? GenStateCompleted : GenStateSuspendedYield;
+          if (record.arg === ContinueSentinel) {
+            continue;
+          }
+          return {
+            value: record.arg,
+            done: context.done
+          };
+        } else if (record.type === "throw") {
+          state = GenStateCompleted;
+          context.method = "throw";
+          context.arg = record.arg;
+        }
+      }
+    };
+  }
+  function maybeInvokeDelegate(delegate, context) {
+    var method = delegate.iterator[context.method];
+    if (method === undefined) {
+      context.delegate = null;
+      if (context.method === "throw") {
+        if (delegate.iterator.return) {
+          context.method = "return";
+          context.arg = undefined;
+          maybeInvokeDelegate(delegate, context);
+          if (context.method === "throw") {
+            return ContinueSentinel;
+          }
+        }
+        context.method = "throw";
+        context.arg = new TypeError("The iterator does not provide a 'throw' method");
+      }
+      return ContinueSentinel;
+    }
+    var record = tryCatch(method, delegate.iterator, context.arg);
+    if (record.type === "throw") {
+      context.method = "throw";
+      context.arg = record.arg;
+      context.delegate = null;
+      return ContinueSentinel;
+    }
+    var info = record.arg;
+    if (!info) {
+      context.method = "throw";
+      context.arg = new TypeError("iterator result is not an object");
+      context.delegate = null;
+      return ContinueSentinel;
+    }
+    if (info.done) {
+      context[delegate.resultName] = info.value;
+      context.next = delegate.nextLoc;
+      if (context.method !== "return") {
+        context.method = "next";
+        context.arg = undefined;
+      }
+    } else {
+      return info;
+    }
+    context.delegate = null;
+    return ContinueSentinel;
+  }
+  defineIteratorMethods(Gp);
+  Gp[toStringTagSymbol] = "Generator";
+  Gp[iteratorSymbol] = function () {
+    return this;
+  };
+  Gp.toString = function () {
+    return "[object Generator]";
+  };
+  function pushTryEntry(locs) {
+    var entry = { tryLoc: locs[0] };
+    if (1 in locs) {
+      entry.catchLoc = locs[1];
+    }
+    if (2 in locs) {
+      entry.finallyLoc = locs[2];
+      entry.afterLoc = locs[3];
+    }
+    this.tryEntries.push(entry);
+  }
+  function resetTryEntry(entry) {
+    var record = entry.completion || {};
+    record.type = "normal";
+    delete record.arg;
+    entry.completion = record;
+  }
+  function Context(tryLocsList) {
+    this.tryEntries = [{ tryLoc: "root" }];
+    tryLocsList.forEach(pushTryEntry, this);
+    this.reset(true);
+  }
+  runtime.keys = function (object) {
+    var keys = [];
+    for (var key in object) {
+      keys.push(key);
+    }
+    keys.reverse();
+    return function next() {
+      while (keys.length) {
+        var key = keys.pop();
+        if (key in object) {
+          next.value = key;
+          next.done = false;
+          return next;
+        }
+      }
+      next.done = true;
+      return next;
+    };
+  };
+  function values(iterable) {
+    if (iterable) {
+      var iteratorMethod = iterable[iteratorSymbol];
+      if (iteratorMethod) {
+        return iteratorMethod.call(iterable);
+      }
+      if (typeof iterable.next === "function") {
+        return iterable;
+      }
+      if (!isNaN(iterable.length)) {
+        var i = -1,
+            next = function next() {
+          while (++i < iterable.length) {
+            if (hasOwn.call(iterable, i)) {
+              next.value = iterable[i];
+              next.done = false;
+              return next;
+            }
+          }
+          next.value = undefined;
+          next.done = true;
+          return next;
+        };
+        return next.next = next;
+      }
+    }
+    return { next: doneResult };
+  }
+  runtime.values = values;
+  function doneResult() {
+    return {
+      value: undefined,
+      done: true
+    };
+  }
+  Context.prototype = {
+    constructor: Context,
+    reset: function reset(skipTempReset) {
+      this.prev = 0;
+      this.next = 0;
+      this.sent = this._sent = undefined;
+      this.done = false;
+      this.delegate = null;
+      this.method = "next";
+      this.arg = undefined;
+      this.tryEntries.forEach(resetTryEntry);
+      if (!skipTempReset) {
+        for (var name in this) {
+          if (name.charAt(0) === "t" && hasOwn.call(this, name) && !isNaN(+name.slice(1))) {
+            this[name] = undefined;
+          }
+        }
+      }
+    },
+    stop: function stop() {
+      this.done = true;
+      var rootEntry = this.tryEntries[0];
+      var rootRecord = rootEntry.completion;
+      if (rootRecord.type === "throw") {
+        throw rootRecord.arg;
+      }
+      return this.rval;
+    },
+    dispatchException: function dispatchException(exception) {
+      if (this.done) {
+        throw exception;
+      }
+      var context = this;
+      function handle(loc, caught) {
+        record.type = "throw";
+        record.arg = exception;
+        context.next = loc;
+        if (caught) {
+          context.method = "next";
+          context.arg = undefined;
+        }
+        return !!caught;
+      }
+      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
+        var entry = this.tryEntries[i];
+        var record = entry.completion;
+        if (entry.tryLoc === "root") {
+          return handle("end");
+        }
+        if (entry.tryLoc <= this.prev) {
+          var hasCatch = hasOwn.call(entry, "catchLoc");
+          var hasFinally = hasOwn.call(entry, "finallyLoc");
+          if (hasCatch && hasFinally) {
+            if (this.prev < entry.catchLoc) {
+              return handle(entry.catchLoc, true);
+            } else if (this.prev < entry.finallyLoc) {
+              return handle(entry.finallyLoc);
+            }
+          } else if (hasCatch) {
+            if (this.prev < entry.catchLoc) {
+              return handle(entry.catchLoc, true);
+            }
+          } else if (hasFinally) {
+            if (this.prev < entry.finallyLoc) {
+              return handle(entry.finallyLoc);
+            }
+          } else {
+            throw new Error("try statement without catch or finally");
+          }
+        }
+      }
+    },
+    abrupt: function abrupt(type, arg) {
+      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
+        var entry = this.tryEntries[i];
+        if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) {
+          var finallyEntry = entry;
+          break;
+        }
+      }
+      if (finallyEntry && (type === "break" || type === "continue") && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc) {
+        finallyEntry = null;
+      }
+      var record = finallyEntry ? finallyEntry.completion : {};
+      record.type = type;
+      record.arg = arg;
+      if (finallyEntry) {
+        this.method = "next";
+        this.next = finallyEntry.finallyLoc;
+        return ContinueSentinel;
+      }
+      return this.complete(record);
+    },
+    complete: function complete(record, afterLoc) {
+      if (record.type === "throw") {
+        throw record.arg;
+      }
+      if (record.type === "break" || record.type === "continue") {
+        this.next = record.arg;
+      } else if (record.type === "return") {
+        this.rval = this.arg = record.arg;
+        this.method = "return";
+        this.next = "end";
+      } else if (record.type === "normal" && afterLoc) {
+        this.next = afterLoc;
+      }
+      return ContinueSentinel;
+    },
+    finish: function finish(finallyLoc) {
+      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
+        var entry = this.tryEntries[i];
+        if (entry.finallyLoc === finallyLoc) {
+          this.complete(entry.completion, entry.afterLoc);
+          resetTryEntry(entry);
+          return ContinueSentinel;
+        }
+      }
+    },
+    "catch": function _catch(tryLoc) {
+      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
+        var entry = this.tryEntries[i];
+        if (entry.tryLoc === tryLoc) {
+          var record = entry.completion;
+          if (record.type === "throw") {
+            var thrown = record.arg;
+            resetTryEntry(entry);
+          }
+          return thrown;
+        }
+      }
+      throw new Error("illegal catch attempt");
+    },
+    delegateYield: function delegateYield(iterable, resultName, nextLoc) {
+      this.delegate = {
+        iterator: values(iterable),
+        resultName: resultName,
+        nextLoc: nextLoc
+      };
+      if (this.method === "next") {
+        this.arg = undefined;
+      }
+      return ContinueSentinel;
+    }
+  };
+}(function () {
+  return this;
+}() || Function("return this")());
+/* WEBPACK VAR INJECTION */}.call(this, __w_pdfjs_require__(134)(module)))
+
+/***/ }),
+/* 134 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+module.exports = function (module) {
+  if (!module.webpackPolyfill) {
+    module.deprecate = function () {};
+    module.paths = [];
+    if (!module.children) module.children = [];
+    Object.defineProperty(module, "loaded", {
+      enumerable: true,
+      get: function get() {
+        return module.l;
+      }
+    });
+    Object.defineProperty(module, "id", {
+      enumerable: true,
+      get: function get() {
+        return module.i;
+      }
+    });
+    module.webpackPolyfill = 1;
+  }
+  return module;
+};
+
+/***/ }),
+/* 135 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.ChunkedStreamManager = exports.ChunkedStream = undefined;
+
+var _util = __w_pdfjs_require__(2);
+
+var ChunkedStream = function ChunkedStreamClosure() {
+  function ChunkedStream(length, chunkSize, manager) {
+    this.bytes = new Uint8Array(length);
+    this.start = 0;
+    this.pos = 0;
+    this.end = length;
+    this.chunkSize = chunkSize;
+    this.loadedChunks = [];
+    this.numChunksLoaded = 0;
+    this.numChunks = Math.ceil(length / chunkSize);
+    this.manager = manager;
+    this.progressiveDataLength = 0;
+    this.lastSuccessfulEnsureByteChunk = -1;
+  }
+  ChunkedStream.prototype = {
+    getMissingChunks: function ChunkedStream_getMissingChunks() {
+      var chunks = [];
+      for (var chunk = 0, n = this.numChunks; chunk < n; ++chunk) {
+        if (!this.loadedChunks[chunk]) {
+          chunks.push(chunk);
+        }
+      }
+      return chunks;
+    },
+    getBaseStreams: function ChunkedStream_getBaseStreams() {
+      return [this];
+    },
+    allChunksLoaded: function ChunkedStream_allChunksLoaded() {
+      return this.numChunksLoaded === this.numChunks;
+    },
+    onReceiveData: function ChunkedStream_onReceiveData(begin, chunk) {
+      var end = begin + chunk.byteLength;
+      if (begin % this.chunkSize !== 0) {
+        throw new Error('Bad begin offset: ' + begin);
+      }
+      var length = this.bytes.length;
+      if (end % this.chunkSize !== 0 && end !== length) {
+        throw new Error('Bad end offset: ' + end);
+      }
+      this.bytes.set(new Uint8Array(chunk), begin);
+      var chunkSize = this.chunkSize;
+      var beginChunk = Math.floor(begin / chunkSize);
+      var endChunk = Math.floor((end - 1) / chunkSize) + 1;
+      var curChunk;
+      for (curChunk = beginChunk; curChunk < endChunk; ++curChunk) {
+        if (!this.loadedChunks[curChunk]) {
+          this.loadedChunks[curChunk] = true;
+          ++this.numChunksLoaded;
+        }
+      }
+    },
+    onReceiveProgressiveData: function ChunkedStream_onReceiveProgressiveData(data) {
+      var position = this.progressiveDataLength;
+      var beginChunk = Math.floor(position / this.chunkSize);
+      this.bytes.set(new Uint8Array(data), position);
+      position += data.byteLength;
+      this.progressiveDataLength = position;
+      var endChunk = position >= this.end ? this.numChunks : Math.floor(position / this.chunkSize);
+      var curChunk;
+      for (curChunk = beginChunk; curChunk < endChunk; ++curChunk) {
+        if (!this.loadedChunks[curChunk]) {
+          this.loadedChunks[curChunk] = true;
+          ++this.numChunksLoaded;
+        }
+      }
+    },
+    ensureByte: function ChunkedStream_ensureByte(pos) {
+      var chunk = Math.floor(pos / this.chunkSize);
+      if (chunk === this.lastSuccessfulEnsureByteChunk) {
+        return;
+      }
+      if (!this.loadedChunks[chunk]) {
+        throw new _util.MissingDataException(pos, pos + 1);
+      }
+      this.lastSuccessfulEnsureByteChunk = chunk;
+    },
+    ensureRange: function ChunkedStream_ensureRange(begin, end) {
+      if (begin >= end) {
+        return;
+      }
+      if (end <= this.progressiveDataLength) {
+        return;
+      }
+      var chunkSize = this.chunkSize;
+      var beginChunk = Math.floor(begin / chunkSize);
+      var endChunk = Math.floor((end - 1) / chunkSize) + 1;
+      for (var chunk = beginChunk; chunk < endChunk; ++chunk) {
+        if (!this.loadedChunks[chunk]) {
+          throw new _util.MissingDataException(begin, end);
+        }
+      }
+    },
+    nextEmptyChunk: function ChunkedStream_nextEmptyChunk(beginChunk) {
+      var chunk,
+          numChunks = this.numChunks;
+      for (var i = 0; i < numChunks; ++i) {
+        chunk = (beginChunk + i) % numChunks;
+        if (!this.loadedChunks[chunk]) {
+          return chunk;
+        }
+      }
+      return null;
+    },
+    hasChunk: function ChunkedStream_hasChunk(chunk) {
+      return !!this.loadedChunks[chunk];
+    },
+    get length() {
+      return this.end - this.start;
+    },
+    get isEmpty() {
+      return this.length === 0;
+    },
+    getByte: function ChunkedStream_getByte() {
+      var pos = this.pos;
+      if (pos >= this.end) {
+        return -1;
+      }
+      this.ensureByte(pos);
+      return this.bytes[this.pos++];
+    },
+    getUint16: function ChunkedStream_getUint16() {
+      var b0 = this.getByte();
+      var b1 = this.getByte();
+      if (b0 === -1 || b1 === -1) {
+        return -1;
+      }
+      return (b0 << 8) + b1;
+    },
+    getInt32: function ChunkedStream_getInt32() {
+      var b0 = this.getByte();
+      var b1 = this.getByte();
+      var b2 = this.getByte();
+      var b3 = this.getByte();
+      return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;
+    },
+    getBytes: function getBytes(length) {
+      var forceClamped = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+
+      var bytes = this.bytes;
+      var pos = this.pos;
+      var strEnd = this.end;
+      if (!length) {
+        this.ensureRange(pos, strEnd);
+        var _subarray = bytes.subarray(pos, strEnd);
+        return forceClamped ? new Uint8ClampedArray(_subarray) : _subarray;
+      }
+      var end = pos + length;
+      if (end > strEnd) {
+        end = strEnd;
+      }
+      this.ensureRange(pos, end);
+      this.pos = end;
+      var subarray = bytes.subarray(pos, end);
+      return forceClamped ? new Uint8ClampedArray(subarray) : subarray;
+    },
+
+    peekByte: function ChunkedStream_peekByte() {
+      var peekedByte = this.getByte();
+      this.pos--;
+      return peekedByte;
+    },
+    peekBytes: function peekBytes(length) {
+      var forceClamped = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+
+      var bytes = this.getBytes(length, forceClamped);
+      this.pos -= bytes.length;
+      return bytes;
+    },
+
+    getByteRange: function ChunkedStream_getBytes(begin, end) {
+      this.ensureRange(begin, end);
+      return this.bytes.subarray(begin, end);
+    },
+    skip: function ChunkedStream_skip(n) {
+      if (!n) {
+        n = 1;
+      }
+      this.pos += n;
+    },
+    reset: function ChunkedStream_reset() {
+      this.pos = this.start;
+    },
+    moveStart: function ChunkedStream_moveStart() {
+      this.start = this.pos;
+    },
+    makeSubStream: function ChunkedStream_makeSubStream(start, length, dict) {
+      this.ensureRange(start, start + length);
+      function ChunkedStreamSubstream() {}
+      ChunkedStreamSubstream.prototype = Object.create(this);
+      ChunkedStreamSubstream.prototype.getMissingChunks = function () {
+        var chunkSize = this.chunkSize;
+        var beginChunk = Math.floor(this.start / chunkSize);
+        var endChunk = Math.floor((this.end - 1) / chunkSize) + 1;
+        var missingChunks = [];
+        for (var chunk = beginChunk; chunk < endChunk; ++chunk) {
+          if (!this.loadedChunks[chunk]) {
+            missingChunks.push(chunk);
+          }
+        }
+        return missingChunks;
+      };
+      var subStream = new ChunkedStreamSubstream();
+      subStream.pos = subStream.start = start;
+      subStream.end = start + length || this.end;
+      subStream.dict = dict;
+      return subStream;
+    }
+  };
+  return ChunkedStream;
+}();
+var ChunkedStreamManager = function ChunkedStreamManagerClosure() {
+  function ChunkedStreamManager(pdfNetworkStream, args) {
+    var chunkSize = args.rangeChunkSize;
+    var length = args.length;
+    this.stream = new ChunkedStream(length, chunkSize, this);
+    this.length = length;
+    this.chunkSize = chunkSize;
+    this.pdfNetworkStream = pdfNetworkStream;
+    this.url = args.url;
+    this.disableAutoFetch = args.disableAutoFetch;
+    this.msgHandler = args.msgHandler;
+    this.currRequestId = 0;
+    this.chunksNeededByRequest = Object.create(null);
+    this.requestsByChunk = Object.create(null);
+    this.promisesByRequest = Object.create(null);
+    this.progressiveDataLength = 0;
+    this.aborted = false;
+    this._loadedStreamCapability = (0, _util.createPromiseCapability)();
+  }
+  ChunkedStreamManager.prototype = {
+    onLoadedStream: function ChunkedStreamManager_getLoadedStream() {
+      return this._loadedStreamCapability.promise;
+    },
+    sendRequest: function ChunkedStreamManager_sendRequest(begin, end) {
+      var _this = this;
+
+      var rangeReader = this.pdfNetworkStream.getRangeReader(begin, end);
+      if (!rangeReader.isStreamingSupported) {
+        rangeReader.onProgress = this.onProgress.bind(this);
+      }
+      var chunks = [],
+          loaded = 0;
+      var manager = this;
+      var promise = new Promise(function (resolve, reject) {
+        var readChunk = function readChunk(chunk) {
+          try {
+            if (!chunk.done) {
+              var data = chunk.value;
+              chunks.push(data);
+              loaded += (0, _util.arrayByteLength)(data);
+              if (rangeReader.isStreamingSupported) {
+                manager.onProgress({ loaded: loaded });
+              }
+              rangeReader.read().then(readChunk, reject);
+              return;
+            }
+            var chunkData = (0, _util.arraysToBytes)(chunks);
+            chunks = null;
+            resolve(chunkData);
+          } catch (e) {
+            reject(e);
+          }
+        };
+        rangeReader.read().then(readChunk, reject);
+      });
+      promise.then(function (data) {
+        if (_this.aborted) {
+          return;
+        }
+        _this.onReceiveData({
+          chunk: data,
+          begin: begin
+        });
+      });
+    },
+    requestAllChunks: function ChunkedStreamManager_requestAllChunks() {
+      var missingChunks = this.stream.getMissingChunks();
+      this._requestChunks(missingChunks);
+      return this._loadedStreamCapability.promise;
+    },
+    _requestChunks: function ChunkedStreamManager_requestChunks(chunks) {
+      var requestId = this.currRequestId++;
+      var i, ii;
+      var chunksNeeded = Object.create(null);
+      this.chunksNeededByRequest[requestId] = chunksNeeded;
+      for (i = 0, ii = chunks.length; i < ii; i++) {
+        if (!this.stream.hasChunk(chunks[i])) {
+          chunksNeeded[chunks[i]] = true;
+        }
+      }
+      if ((0, _util.isEmptyObj)(chunksNeeded)) {
+        return Promise.resolve();
+      }
+      var capability = (0, _util.createPromiseCapability)();
+      this.promisesByRequest[requestId] = capability;
+      var chunksToRequest = [];
+      for (var chunk in chunksNeeded) {
+        chunk = chunk | 0;
+        if (!(chunk in this.requestsByChunk)) {
+          this.requestsByChunk[chunk] = [];
+          chunksToRequest.push(chunk);
+        }
+        this.requestsByChunk[chunk].push(requestId);
+      }
+      if (!chunksToRequest.length) {
+        return capability.promise;
+      }
+      var groupedChunksToRequest = this.groupChunks(chunksToRequest);
+      for (i = 0; i < groupedChunksToRequest.length; ++i) {
+        var groupedChunk = groupedChunksToRequest[i];
+        var begin = groupedChunk.beginChunk * this.chunkSize;
+        var end = Math.min(groupedChunk.endChunk * this.chunkSize, this.length);
+        this.sendRequest(begin, end);
+      }
+      return capability.promise;
+    },
+    getStream: function ChunkedStreamManager_getStream() {
+      return this.stream;
+    },
+    requestRange: function ChunkedStreamManager_requestRange(begin, end) {
+      end = Math.min(end, this.length);
+      var beginChunk = this.getBeginChunk(begin);
+      var endChunk = this.getEndChunk(end);
+      var chunks = [];
+      for (var chunk = beginChunk; chunk < endChunk; ++chunk) {
+        chunks.push(chunk);
+      }
+      return this._requestChunks(chunks);
+    },
+    requestRanges: function ChunkedStreamManager_requestRanges(ranges) {
+      ranges = ranges || [];
+      var chunksToRequest = [];
+      for (var i = 0; i < ranges.length; i++) {
+        var beginChunk = this.getBeginChunk(ranges[i].begin);
+        var endChunk = this.getEndChunk(ranges[i].end);
+        for (var chunk = beginChunk; chunk < endChunk; ++chunk) {
+          if (!chunksToRequest.includes(chunk)) {
+            chunksToRequest.push(chunk);
+          }
+        }
+      }
+      chunksToRequest.sort(function (a, b) {
+        return a - b;
+      });
+      return this._requestChunks(chunksToRequest);
+    },
+    groupChunks: function ChunkedStreamManager_groupChunks(chunks) {
+      var groupedChunks = [];
+      var beginChunk = -1;
+      var prevChunk = -1;
+      for (var i = 0; i < chunks.length; ++i) {
+        var chunk = chunks[i];
+        if (beginChunk < 0) {
+          beginChunk = chunk;
+        }
+        if (prevChunk >= 0 && prevChunk + 1 !== chunk) {
+          groupedChunks.push({
+            beginChunk: beginChunk,
+            endChunk: prevChunk + 1
+          });
+          beginChunk = chunk;
+        }
+        if (i + 1 === chunks.length) {
+          groupedChunks.push({
+            beginChunk: beginChunk,
+            endChunk: chunk + 1
+          });
+        }
+        prevChunk = chunk;
+      }
+      return groupedChunks;
+    },
+    onProgress: function ChunkedStreamManager_onProgress(args) {
+      var bytesLoaded = this.stream.numChunksLoaded * this.chunkSize + args.loaded;
+      this.msgHandler.send('DocProgress', {
+        loaded: bytesLoaded,
+        total: this.length
+      });
+    },
+    onReceiveData: function ChunkedStreamManager_onReceiveData(args) {
+      var chunk = args.chunk;
+      var isProgressive = args.begin === undefined;
+      var begin = isProgressive ? this.progressiveDataLength : args.begin;
+      var end = begin + chunk.byteLength;
+      var beginChunk = Math.floor(begin / this.chunkSize);
+      var endChunk = end < this.length ? Math.floor(end / this.chunkSize) : Math.ceil(end / this.chunkSize);
+      if (isProgressive) {
+        this.stream.onReceiveProgressiveData(chunk);
+        this.progressiveDataLength = end;
+      } else {
+        this.stream.onReceiveData(begin, chunk);
+      }
+      if (this.stream.allChunksLoaded()) {
+        this._loadedStreamCapability.resolve(this.stream);
+      }
+      var loadedRequests = [];
+      var i, requestId;
+      for (chunk = beginChunk; chunk < endChunk; ++chunk) {
+        var requestIds = this.requestsByChunk[chunk] || [];
+        delete this.requestsByChunk[chunk];
+        for (i = 0; i < requestIds.length; ++i) {
+          requestId = requestIds[i];
+          var chunksNeeded = this.chunksNeededByRequest[requestId];
+          if (chunk in chunksNeeded) {
+            delete chunksNeeded[chunk];
+          }
+          if (!(0, _util.isEmptyObj)(chunksNeeded)) {
+            continue;
+          }
+          loadedRequests.push(requestId);
+        }
+      }
+      if (!this.disableAutoFetch && (0, _util.isEmptyObj)(this.requestsByChunk)) {
+        var nextEmptyChunk;
+        if (this.stream.numChunksLoaded === 1) {
+          var lastChunk = this.stream.numChunks - 1;
+          if (!this.stream.hasChunk(lastChunk)) {
+            nextEmptyChunk = lastChunk;
+          }
+        } else {
+          nextEmptyChunk = this.stream.nextEmptyChunk(endChunk);
+        }
+        if (Number.isInteger(nextEmptyChunk)) {
+          this._requestChunks([nextEmptyChunk]);
+        }
+      }
+      for (i = 0; i < loadedRequests.length; ++i) {
+        requestId = loadedRequests[i];
+        var capability = this.promisesByRequest[requestId];
+        delete this.promisesByRequest[requestId];
+        capability.resolve();
+      }
+      this.msgHandler.send('DocProgress', {
+        loaded: this.stream.numChunksLoaded * this.chunkSize,
+        total: this.length
+      });
+    },
+    onError: function ChunkedStreamManager_onError(err) {
+      this._loadedStreamCapability.reject(err);
+    },
+    getBeginChunk: function ChunkedStreamManager_getBeginChunk(begin) {
+      var chunk = Math.floor(begin / this.chunkSize);
+      return chunk;
+    },
+    getEndChunk: function ChunkedStreamManager_getEndChunk(end) {
+      var chunk = Math.floor((end - 1) / this.chunkSize) + 1;
+      return chunk;
+    },
+    abort: function ChunkedStreamManager_abort() {
+      this.aborted = true;
+      if (this.pdfNetworkStream) {
+        this.pdfNetworkStream.cancelAllRequests('abort');
+      }
+      for (var requestId in this.promisesByRequest) {
+        var capability = this.promisesByRequest[requestId];
+        capability.reject(new Error('Request was aborted'));
+      }
+    }
+  };
+  return ChunkedStreamManager;
+}();
+exports.ChunkedStream = ChunkedStream;
+exports.ChunkedStreamManager = ChunkedStreamManager;
+
+/***/ }),
+/* 136 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.PDFDocument = exports.Page = undefined;
+
+var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
+
+var _util = __w_pdfjs_require__(2);
+
+var _obj = __w_pdfjs_require__(137);
+
+var _primitives = __w_pdfjs_require__(138);
+
+var _stream = __w_pdfjs_require__(140);
+
+var _annotation = __w_pdfjs_require__(152);
+
+var _crypto = __w_pdfjs_require__(150);
+
+var _parser = __w_pdfjs_require__(139);
+
+var _operator_list = __w_pdfjs_require__(153);
+
+var _evaluator = __w_pdfjs_require__(154);
+
+var _function = __w_pdfjs_require__(168);
+
+var Page = function PageClosure() {
+  var DEFAULT_USER_UNIT = 1.0;
+  var LETTER_SIZE_MEDIABOX = [0, 0, 612, 792];
+  function isAnnotationRenderable(annotation, intent) {
+    return intent === 'display' && annotation.viewable || intent === 'print' && annotation.printable;
+  }
+  function Page(_ref) {
+    var pdfManager = _ref.pdfManager,
+        xref = _ref.xref,
+        pageIndex = _ref.pageIndex,
+        pageDict = _ref.pageDict,
+        ref = _ref.ref,
+        fontCache = _ref.fontCache,
+        builtInCMapCache = _ref.builtInCMapCache,
+        pdfFunctionFactory = _ref.pdfFunctionFactory;
+
+    this.pdfManager = pdfManager;
+    this.pageIndex = pageIndex;
+    this.pageDict = pageDict;
+    this.xref = xref;
+    this.ref = ref;
+    this.fontCache = fontCache;
+    this.builtInCMapCache = builtInCMapCache;
+    this.pdfFunctionFactory = pdfFunctionFactory;
+    this.evaluatorOptions = pdfManager.evaluatorOptions;
+    this.resourcesPromise = null;
+    var uniquePrefix = 'p' + this.pageIndex + '_';
+    var idCounters = { obj: 0 };
+    this.idFactory = {
+      createObjId: function createObjId() {
+        return uniquePrefix + ++idCounters.obj;
+      }
+    };
+  }
+  Page.prototype = {
+    _getInheritableProperty: function _getInheritableProperty(key) {
+      var getArray = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+
+      var value = (0, _util.getInheritableProperty)({
+        dict: this.pageDict,
+        key: key,
+        getArray: getArray,
+        stopWhenFound: false
+      });
+      if (!Array.isArray(value)) {
+        return value;
+      }
+      if (value.length === 1 || !(0, _primitives.isDict)(value[0])) {
+        return value[0];
+      }
+      return _primitives.Dict.merge(this.xref, value);
+    },
+
+    get content() {
+      return this.pageDict.get('Contents');
+    },
+    get resources() {
+      return (0, _util.shadow)(this, 'resources', this._getInheritableProperty('Resources') || _primitives.Dict.empty);
+    },
+    get mediaBox() {
+      var mediaBox = this._getInheritableProperty('MediaBox', true);
+      if (!Array.isArray(mediaBox) || mediaBox.length !== 4) {
+        return (0, _util.shadow)(this, 'mediaBox', LETTER_SIZE_MEDIABOX);
+      }
+      return (0, _util.shadow)(this, 'mediaBox', mediaBox);
+    },
+    get cropBox() {
+      var cropBox = this._getInheritableProperty('CropBox', true);
+      if (!Array.isArray(cropBox) || cropBox.length !== 4) {
+        return (0, _util.shadow)(this, 'cropBox', this.mediaBox);
+      }
+      return (0, _util.shadow)(this, 'cropBox', cropBox);
+    },
+    get userUnit() {
+      var obj = this.pageDict.get('UserUnit');
+      if (!(0, _util.isNum)(obj) || obj <= 0) {
+        obj = DEFAULT_USER_UNIT;
+      }
+      return (0, _util.shadow)(this, 'userUnit', obj);
+    },
+    get view() {
+      var mediaBox = this.mediaBox,
+          cropBox = this.cropBox;
+      if (mediaBox === cropBox) {
+        return (0, _util.shadow)(this, 'view', mediaBox);
+      }
+      var intersection = _util.Util.intersect(cropBox, mediaBox);
+      return (0, _util.shadow)(this, 'view', intersection || mediaBox);
+    },
+    get rotate() {
+      var rotate = this._getInheritableProperty('Rotate') || 0;
+      if (rotate % 90 !== 0) {
+        rotate = 0;
+      } else if (rotate >= 360) {
+        rotate = rotate % 360;
+      } else if (rotate < 0) {
+        rotate = (rotate % 360 + 360) % 360;
+      }
+      return (0, _util.shadow)(this, 'rotate', rotate);
+    },
+    getContentStream: function Page_getContentStream() {
+      var content = this.content;
+      var stream;
+      if (Array.isArray(content)) {
+        var xref = this.xref;
+        var i,
+            n = content.length;
+        var streams = [];
+        for (i = 0; i < n; ++i) {
+          streams.push(xref.fetchIfRef(content[i]));
+        }
+        stream = new _stream.StreamsSequenceStream(streams);
+      } else if ((0, _primitives.isStream)(content)) {
+        stream = content;
+      } else {
+        stream = new _stream.NullStream();
+      }
+      return stream;
+    },
+    loadResources: function Page_loadResources(keys) {
+      var _this = this;
+
+      if (!this.resourcesPromise) {
+        this.resourcesPromise = this.pdfManager.ensure(this, 'resources');
+      }
+      return this.resourcesPromise.then(function () {
+        var objectLoader = new _obj.ObjectLoader(_this.resources, keys, _this.xref);
+        return objectLoader.load();
+      });
+    },
+    getOperatorList: function getOperatorList(_ref2) {
+      var _this2 = this;
+
+      var handler = _ref2.handler,
+          task = _ref2.task,
+          intent = _ref2.intent,
+          renderInteractiveForms = _ref2.renderInteractiveForms;
+
+      var contentStreamPromise = this.pdfManager.ensure(this, 'getContentStream');
+      var resourcesPromise = this.loadResources(['ExtGState', 'ColorSpace', 'Pattern', 'Shading', 'XObject', 'Font']);
+      var partialEvaluator = new _evaluator.PartialEvaluator({
+        pdfManager: this.pdfManager,
+        xref: this.xref,
+        handler: handler,
+        pageIndex: this.pageIndex,
+        idFactory: this.idFactory,
+        fontCache: this.fontCache,
+        builtInCMapCache: this.builtInCMapCache,
+        options: this.evaluatorOptions,
+        pdfFunctionFactory: this.pdfFunctionFactory
+      });
+      var dataPromises = Promise.all([contentStreamPromise, resourcesPromise]);
+      var pageListPromise = dataPromises.then(function (_ref3) {
+        var _ref4 = _slicedToArray(_ref3, 1),
+            contentStream = _ref4[0];
+
+        var opList = new _operator_list.OperatorList(intent, handler, _this2.pageIndex);
+        handler.send('StartRenderPage', {
+          transparency: partialEvaluator.hasBlendModes(_this2.resources),
+          pageIndex: _this2.pageIndex,
+          intent: intent
+        });
+        return partialEvaluator.getOperatorList({
+          stream: contentStream,
+          task: task,
+          resources: _this2.resources,
+          operatorList: opList
+        }).then(function () {
+          return opList;
+        });
+      });
+      return Promise.all([pageListPromise, this._parsedAnnotations]).then(function (_ref5) {
+        var _ref6 = _slicedToArray(_ref5, 2),
+            pageOpList = _ref6[0],
+            annotations = _ref6[1];
+
+        if (annotations.length === 0) {
+          pageOpList.flush(true);
+          return pageOpList;
+        }
+        var i,
+            ii,
+            opListPromises = [];
+        for (i = 0, ii = annotations.length; i < ii; i++) {
+          if (isAnnotationRenderable(annotations[i], intent)) {
+            opListPromises.push(annotations[i].getOperatorList(partialEvaluator, task, renderInteractiveForms));
+          }
+        }
+        return Promise.all(opListPromises).then(function (opLists) {
+          pageOpList.addOp(_util.OPS.beginAnnotations, []);
+          for (i = 0, ii = opLists.length; i < ii; i++) {
+            pageOpList.addOpList(opLists[i]);
+          }
+          pageOpList.addOp(_util.OPS.endAnnotations, []);
+          pageOpList.flush(true);
+          return pageOpList;
+        });
+      });
+    },
+    extractTextContent: function extractTextContent(_ref7) {
+      var _this3 = this;
+
+      var handler = _ref7.handler,
+          task = _ref7.task,
+          normalizeWhitespace = _ref7.normalizeWhitespace,
+          sink = _ref7.sink,
+          combineTextItems = _ref7.combineTextItems;
+
+      var contentStreamPromise = this.pdfManager.ensure(this, 'getContentStream');
+      var resourcesPromise = this.loadResources(['ExtGState', 'XObject', 'Font']);
+      var dataPromises = Promise.all([contentStreamPromise, resourcesPromise]);
+      return dataPromises.then(function (_ref8) {
+        var _ref9 = _slicedToArray(_ref8, 1),
+            contentStream = _ref9[0];
+
+        var partialEvaluator = new _evaluator.PartialEvaluator({
+          pdfManager: _this3.pdfManager,
+          xref: _this3.xref,
+          handler: handler,
+          pageIndex: _this3.pageIndex,
+          idFactory: _this3.idFactory,
+          fontCache: _this3.fontCache,
+          builtInCMapCache: _this3.builtInCMapCache,
+          options: _this3.evaluatorOptions,
+          pdfFunctionFactory: _this3.pdfFunctionFactory
+        });
+        return partialEvaluator.getTextContent({
+          stream: contentStream,
+          task: task,
+          resources: _this3.resources,
+          normalizeWhitespace: normalizeWhitespace,
+          combineTextItems: combineTextItems,
+          sink: sink
+        });
+      });
+    },
+    getAnnotationsData: function getAnnotationsData(intent) {
+      return this._parsedAnnotations.then(function (annotations) {
+        var annotationsData = [];
+        for (var i = 0, ii = annotations.length; i < ii; i++) {
+          if (!intent || isAnnotationRenderable(annotations[i], intent)) {
+            annotationsData.push(annotations[i].data);
+          }
+        }
+        return annotationsData;
+      });
+    },
+
+    get annotations() {
+      return (0, _util.shadow)(this, 'annotations', this._getInheritableProperty('Annots') || []);
+    },
+    get _parsedAnnotations() {
+      var _this4 = this;
+
+      var parsedAnnotations = this.pdfManager.ensure(this, 'annotations').then(function () {
+        var annotationRefs = _this4.annotations;
+        var annotationPromises = [];
+        for (var i = 0, ii = annotationRefs.length; i < ii; i++) {
+          annotationPromises.push(_annotation.AnnotationFactory.create(_this4.xref, annotationRefs[i], _this4.pdfManager, _this4.idFactory));
+        }
+        return Promise.all(annotationPromises).then(function (annotations) {
+          return annotations.filter(function isDefined(annotation) {
+            return !!annotation;
+          });
+        }, function (reason) {
+          (0, _util.warn)('_parsedAnnotations: "' + reason + '".');
+          return [];
+        });
+      });
+      return (0, _util.shadow)(this, '_parsedAnnotations', parsedAnnotations);
+    }
+  };
+  return Page;
+}();
+var PDFDocument = function PDFDocumentClosure() {
+  var FINGERPRINT_FIRST_BYTES = 1024;
+  var EMPTY_FINGERPRINT = '\x00\x00\x00\x00\x00\x00\x00' + '\x00\x00\x00\x00\x00\x00\x00\x00\x00';
+  function PDFDocument(pdfManager, arg) {
+    var stream;
+    if ((0, _primitives.isStream)(arg)) {
+      stream = arg;
+    } else if ((0, _util.isArrayBuffer)(arg)) {
+      stream = new _stream.Stream(arg);
+    } else {
+      throw new Error('PDFDocument: Unknown argument type');
+    }
+    if (stream.length <= 0) {
+      throw new Error('PDFDocument: stream must have data');
+    }
+    this.pdfManager = pdfManager;
+    this.stream = stream;
+    this.xref = new _obj.XRef(stream, pdfManager);
+    var evaluatorOptions = pdfManager.evaluatorOptions;
+    this.pdfFunctionFactory = new _function.PDFFunctionFactory({
+      xref: this.xref,
+      isEvalSupported: evaluatorOptions.isEvalSupported
+    });
+    this._pagePromises = [];
+  }
+  function find(stream, needle, limit, backwards) {
+    var pos = stream.pos;
+    var end = stream.end;
+    var strBuf = [];
+    if (pos + limit > end) {
+      limit = end - pos;
+    }
+    for (var n = 0; n < limit; ++n) {
+      strBuf.push(String.fromCharCode(stream.getByte()));
+    }
+    var str = strBuf.join('');
+    stream.pos = pos;
+    var index = backwards ? str.lastIndexOf(needle) : str.indexOf(needle);
+    if (index === -1) {
+      return false;
+    }
+    stream.pos += index;
+    return true;
+  }
+  var DocumentInfoValidators = {
+    Title: _util.isString,
+    Author: _util.isString,
+    Subject: _util.isString,
+    Keywords: _util.isString,
+    Creator: _util.isString,
+    Producer: _util.isString,
+    CreationDate: _util.isString,
+    ModDate: _util.isString,
+    Trapped: _primitives.isName
+  };
+  PDFDocument.prototype = {
+    parse: function PDFDocument_parse(recoveryMode) {
+      this.setup(recoveryMode);
+      var version = this.catalog.catDict.get('Version');
+      if ((0, _primitives.isName)(version)) {
+        this.pdfFormatVersion = version.name;
+      }
+      try {
+        this.acroForm = this.catalog.catDict.get('AcroForm');
+        if (this.acroForm) {
+          this.xfa = this.acroForm.get('XFA');
+          var fields = this.acroForm.get('Fields');
+          if ((!fields || !Array.isArray(fields) || fields.length === 0) && !this.xfa) {
+            this.acroForm = null;
+          }
+        }
+      } catch (ex) {
+        if (ex instanceof _util.MissingDataException) {
+          throw ex;
+        }
+        (0, _util.info)('Something wrong with AcroForm entry');
+        this.acroForm = null;
+      }
+    },
+    get linearization() {
+      var linearization = null;
+      try {
+        linearization = _parser.Linearization.create(this.stream);
+      } catch (err) {
+        if (err instanceof _util.MissingDataException) {
+          throw err;
+        }
+        (0, _util.info)(err);
+      }
+      return (0, _util.shadow)(this, 'linearization', linearization);
+    },
+    get startXRef() {
+      var stream = this.stream;
+      var startXRef = 0;
+      var linearization = this.linearization;
+      if (linearization) {
+        stream.reset();
+        if (find(stream, 'endobj', 1024)) {
+          startXRef = stream.pos + 6;
+        }
+      } else {
+        var step = 1024;
+        var found = false,
+            pos = stream.end;
+        while (!found && pos > 0) {
+          pos -= step - 'startxref'.length;
+          if (pos < 0) {
+            pos = 0;
+          }
+          stream.pos = pos;
+          found = find(stream, 'startxref', step, true);
+        }
+        if (found) {
+          stream.skip(9);
+          var ch;
+          do {
+            ch = stream.getByte();
+          } while ((0, _util.isSpace)(ch));
+          var str = '';
+          while (ch >= 0x20 && ch <= 0x39) {
+            str += String.fromCharCode(ch);
+            ch = stream.getByte();
+          }
+          startXRef = parseInt(str, 10);
+          if (isNaN(startXRef)) {
+            startXRef = 0;
+          }
+        }
+      }
+      return (0, _util.shadow)(this, 'startXRef', startXRef);
+    },
+    checkHeader: function PDFDocument_checkHeader() {
+      var stream = this.stream;
+      stream.reset();
+      if (find(stream, '%PDF-', 1024)) {
+        stream.moveStart();
+        var MAX_VERSION_LENGTH = 12;
+        var version = '',
+            ch;
+        while ((ch = stream.getByte()) > 0x20) {
+          if (version.length >= MAX_VERSION_LENGTH) {
+            break;
+          }
+          version += String.fromCharCode(ch);
+        }
+        if (!this.pdfFormatVersion) {
+          this.pdfFormatVersion = version.substring(5);
+        }
+        return;
+      }
+    },
+    parseStartXRef: function PDFDocument_parseStartXRef() {
+      var startXRef = this.startXRef;
+      this.xref.setStartXRef(startXRef);
+    },
+    setup: function PDFDocument_setup(recoveryMode) {
+      this.xref.parse(recoveryMode);
+      this.catalog = new _obj.Catalog(this.pdfManager, this.xref);
+    },
+    get numPages() {
+      var linearization = this.linearization;
+      var num = linearization ? linearization.numPages : this.catalog.numPages;
+      return (0, _util.shadow)(this, 'numPages', num);
+    },
+    get documentInfo() {
+      var docInfo = {
+        PDFFormatVersion: this.pdfFormatVersion,
+        IsLinearized: !!this.linearization,
+        IsAcroFormPresent: !!this.acroForm,
+        IsXFAPresent: !!this.xfa
+      };
+      var infoDict = void 0;
+      try {
+        infoDict = this.xref.trailer.get('Info');
+      } catch (err) {
+        if (err instanceof _util.MissingDataException) {
+          throw err;
+        }
+        (0, _util.info)('The document information dictionary is invalid.');
+      }
+      if ((0, _primitives.isDict)(infoDict)) {
+        for (var key in DocumentInfoValidators) {
+          if (infoDict.has(key)) {
+            var value = infoDict.get(key);
+            if (DocumentInfoValidators[key](value)) {
+              docInfo[key] = typeof value !== 'string' ? value : (0, _util.stringToPDFString)(value);
+            } else {
+              (0, _util.info)('Bad value in document info for "' + key + '"');
+            }
+          }
+        }
+      }
+      return (0, _util.shadow)(this, 'documentInfo', docInfo);
+    },
+    get fingerprint() {
+      var xref = this.xref,
+          hash,
+          fileID = '';
+      var idArray = xref.trailer.get('ID');
+      if (Array.isArray(idArray) && idArray[0] && (0, _util.isString)(idArray[0]) && idArray[0] !== EMPTY_FINGERPRINT) {
+        hash = (0, _util.stringToBytes)(idArray[0]);
+      } else {
+        if (this.stream.ensureRange) {
+          this.stream.ensureRange(0, Math.min(FINGERPRINT_FIRST_BYTES, this.stream.end));
+        }
+        hash = (0, _crypto.calculateMD5)(this.stream.bytes.subarray(0, FINGERPRINT_FIRST_BYTES), 0, FINGERPRINT_FIRST_BYTES);
+      }
+      for (var i = 0, n = hash.length; i < n; i++) {
+        var hex = hash[i].toString(16);
+        fileID += hex.length === 1 ? '0' + hex : hex;
+      }
+      return (0, _util.shadow)(this, 'fingerprint', fileID);
+    },
+    _getLinearizationPage: function _getLinearizationPage(pageIndex) {
+      var catalog = this.catalog,
+          linearization = this.linearization;
+
+      (0, _util.assert)(linearization && linearization.pageFirst === pageIndex);
+      var ref = new _primitives.Ref(linearization.objectNumberFirst, 0);
+      return this.xref.fetchAsync(ref).then(function (obj) {
+        if ((0, _primitives.isDict)(obj, 'Page') || (0, _primitives.isDict)(obj) && !obj.has('Type') && obj.has('Contents')) {
+          if (ref && !catalog.pageKidsCountCache.has(ref)) {
+            catalog.pageKidsCountCache.put(ref, 1);
+          }
+          return [obj, ref];
+        }
+        throw new _util.FormatError('The Linearization dictionary doesn\'t point ' + 'to a valid Page dictionary.');
+      }).catch(function (reason) {
+        (0, _util.info)(reason);
+        return catalog.getPageDict(pageIndex);
+      });
+    },
+    getPage: function getPage(pageIndex) {
+      var _this5 = this;
+
+      if (this._pagePromises[pageIndex] !== undefined) {
+        return this._pagePromises[pageIndex];
+      }
+      var catalog = this.catalog,
+          linearization = this.linearization;
+
+      var promise = linearization && linearization.pageFirst === pageIndex ? this._getLinearizationPage(pageIndex) : catalog.getPageDict(pageIndex);
+      return this._pagePromises[pageIndex] = promise.then(function (_ref10) {
+        var _ref11 = _slicedToArray(_ref10, 2),
+            pageDict = _ref11[0],
+            ref = _ref11[1];
+
+        return new Page({
+          pdfManager: _this5.pdfManager,
+          xref: _this5.xref,
+          pageIndex: pageIndex,
+          pageDict: pageDict,
+          ref: ref,
+          fontCache: catalog.fontCache,
+          builtInCMapCache: catalog.builtInCMapCache,
+          pdfFunctionFactory: _this5.pdfFunctionFactory
+        });
+      });
+    },
+
+    cleanup: function PDFDocument_cleanup() {
+      return this.catalog.cleanup();
+    }
+  };
+  return PDFDocument;
+}();
+exports.Page = Page;
+exports.PDFDocument = PDFDocument;
+
+/***/ }),
+/* 137 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.FileSpec = exports.XRef = exports.ObjectLoader = exports.Catalog = undefined;
+
+var _regenerator = __w_pdfjs_require__(131);
+
+var _regenerator2 = _interopRequireDefault(_regenerator);
+
+var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _util = __w_pdfjs_require__(2);
+
+var _primitives = __w_pdfjs_require__(138);
+
+var _parser = __w_pdfjs_require__(139);
+
+var _chunked_stream = __w_pdfjs_require__(135);
+
+var _crypto = __w_pdfjs_require__(150);
+
+var _colorspace = __w_pdfjs_require__(151);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function fetchDestination(dest) {
+  return (0, _primitives.isDict)(dest) ? dest.get('D') : dest;
+}
+
+var Catalog = function () {
+  function Catalog(pdfManager, xref) {
+    _classCallCheck(this, Catalog);
+
+    this.pdfManager = pdfManager;
+    this.xref = xref;
+    this.catDict = xref.getCatalogObj();
+    if (!(0, _primitives.isDict)(this.catDict)) {
+      throw new _util.FormatError('Catalog object is not a dictionary.');
+    }
+    this.fontCache = new _primitives.RefSetCache();
+    this.builtInCMapCache = new Map();
+    this.pageKidsCountCache = new _primitives.RefSetCache();
+  }
+
+  _createClass(Catalog, [{
+    key: '_readDocumentOutline',
+    value: function _readDocumentOutline() {
+      var obj = this.catDict.get('Outlines');
+      if (!(0, _primitives.isDict)(obj)) {
+        return null;
+      }
+      obj = obj.getRaw('First');
+      if (!(0, _primitives.isRef)(obj)) {
+        return null;
+      }
+      var root = { items: [] };
+      var queue = [{
+        obj: obj,
+        parent: root
+      }];
+      var processed = new _primitives.RefSet();
+      processed.put(obj);
+      var xref = this.xref,
+          blackColor = new Uint8ClampedArray(3);
+      while (queue.length > 0) {
+        var i = queue.shift();
+        var outlineDict = xref.fetchIfRef(i.obj);
+        if (outlineDict === null) {
+          continue;
+        }
+        if (!outlineDict.has('Title')) {
+          throw new _util.FormatError('Invalid outline item encountered.');
+        }
+        var data = {
+          url: null,
+          dest: null
+        };
+        Catalog.parseDestDictionary({
+          destDict: outlineDict,
+          resultObj: data,
+          docBaseUrl: this.pdfManager.docBaseUrl
+        });
+        var title = outlineDict.get('Title');
+        var flags = outlineDict.get('F') || 0;
+        var color = outlineDict.getArray('C');
+        var rgbColor = blackColor;
+        if (Array.isArray(color) && color.length === 3 && (color[0] !== 0 || color[1] !== 0 || color[2] !== 0)) {
+          rgbColor = _colorspace.ColorSpace.singletons.rgb.getRgb(color, 0);
+        }
+        var outlineItem = {
+          dest: data.dest,
+          url: data.url,
+          unsafeUrl: data.unsafeUrl,
+          newWindow: data.newWindow,
+          title: (0, _util.stringToPDFString)(title),
+          color: rgbColor,
+          count: outlineDict.get('Count'),
+          bold: !!(flags & 2),
+          italic: !!(flags & 1),
+          items: []
+        };
+        i.parent.items.push(outlineItem);
+        obj = outlineDict.getRaw('First');
+        if ((0, _primitives.isRef)(obj) && !processed.has(obj)) {
+          queue.push({
+            obj: obj,
+            parent: outlineItem
+          });
+          processed.put(obj);
+        }
+        obj = outlineDict.getRaw('Next');
+        if ((0, _primitives.isRef)(obj) && !processed.has(obj)) {
+          queue.push({
+            obj: obj,
+            parent: i.parent
+          });
+          processed.put(obj);
+        }
+      }
+      return root.items.length > 0 ? root.items : null;
+    }
+  }, {
+    key: '_readPermissions',
+    value: function _readPermissions() {
+      var encrypt = this.xref.trailer.get('Encrypt');
+      if (!(0, _primitives.isDict)(encrypt)) {
+        return null;
+      }
+      var flags = encrypt.get('P');
+      if (!(0, _util.isNum)(flags)) {
+        return null;
+      }
+      flags += Math.pow(2, 32);
+      var permissions = [];
+      for (var key in _util.PermissionFlag) {
+        var value = _util.PermissionFlag[key];
+        if (flags & value) {
+          permissions.push(value);
+        }
+      }
+      return permissions;
+    }
+  }, {
+    key: 'getDestination',
+    value: function getDestination(destinationId) {
+      var obj = this._readDests();
+      if (obj instanceof NameTree || obj instanceof _primitives.Dict) {
+        return fetchDestination(obj.get(destinationId) || null);
+      }
+      return null;
+    }
+  }, {
+    key: '_readDests',
+    value: function _readDests() {
+      var obj = this.catDict.get('Names');
+      if (obj && obj.has('Dests')) {
+        return new NameTree(obj.getRaw('Dests'), this.xref);
+      } else if (this.catDict.has('Dests')) {
+        return this.catDict.get('Dests');
+      }
+    }
+  }, {
+    key: '_readPageLabels',
+    value: function _readPageLabels() {
+      var obj = this.catDict.getRaw('PageLabels');
+      if (!obj) {
+        return null;
+      }
+      var pageLabels = new Array(this.numPages);
+      var style = null,
+          prefix = '';
+      var numberTree = new NumberTree(obj, this.xref);
+      var nums = numberTree.getAll();
+      var currentLabel = '',
+          currentIndex = 1;
+      for (var i = 0, ii = this.numPages; i < ii; i++) {
+        if (i in nums) {
+          var labelDict = nums[i];
+          if (!(0, _primitives.isDict)(labelDict)) {
+            throw new _util.FormatError('PageLabel is not a dictionary.');
+          }
+          if (labelDict.has('Type') && !(0, _primitives.isName)(labelDict.get('Type'), 'PageLabel')) {
+            throw new _util.FormatError('Invalid type in PageLabel dictionary.');
+          }
+          if (labelDict.has('S')) {
+            var s = labelDict.get('S');
+            if (!(0, _primitives.isName)(s)) {
+              throw new _util.FormatError('Invalid style in PageLabel dictionary.');
+            }
+            style = s.name;
+          } else {
+            style = null;
+          }
+          if (labelDict.has('P')) {
+            var p = labelDict.get('P');
+            if (!(0, _util.isString)(p)) {
+              throw new _util.FormatError('Invalid prefix in PageLabel dictionary.');
+            }
+            prefix = (0, _util.stringToPDFString)(p);
+          } else {
+            prefix = '';
+          }
+          if (labelDict.has('St')) {
+            var st = labelDict.get('St');
+            if (!(Number.isInteger(st) && st >= 1)) {
+              throw new _util.FormatError('Invalid start in PageLabel dictionary.');
+            }
+            currentIndex = st;
+          } else {
+            currentIndex = 1;
+          }
+        }
+        switch (style) {
+          case 'D':
+            currentLabel = currentIndex;
+            break;
+          case 'R':
+          case 'r':
+            currentLabel = (0, _util.toRomanNumerals)(currentIndex, style === 'r');
+            break;
+          case 'A':
+          case 'a':
+            var LIMIT = 26;
+            var A_UPPER_CASE = 0x41,
+                A_LOWER_CASE = 0x61;
+            var baseCharCode = style === 'a' ? A_LOWER_CASE : A_UPPER_CASE;
+            var letterIndex = currentIndex - 1;
+            var character = String.fromCharCode(baseCharCode + letterIndex % LIMIT);
+            var charBuf = [];
+            for (var j = 0, jj = letterIndex / LIMIT | 0; j <= jj; j++) {
+              charBuf.push(character);
+            }
+            currentLabel = charBuf.join('');
+            break;
+          default:
+            if (style) {
+              throw new _util.FormatError('Invalid style "' + style + '" in PageLabel dictionary.');
+            }
+            currentLabel = '';
+        }
+        pageLabels[i] = prefix + currentLabel;
+        currentIndex++;
+      }
+      return pageLabels;
+    }
+  }, {
+    key: 'cleanup',
+    value: function cleanup() {
+      var _this = this;
+
+      this.pageKidsCountCache.clear();
+      var promises = [];
+      this.fontCache.forEach(function (promise) {
+        promises.push(promise);
+      });
+      return Promise.all(promises).then(function (translatedFonts) {
+        for (var i = 0, ii = translatedFonts.length; i < ii; i++) {
+          var font = translatedFonts[i].dict;
+          delete font.translated;
+        }
+        _this.fontCache.clear();
+        _this.builtInCMapCache.clear();
+      });
+    }
+  }, {
+    key: 'getPageDict',
+    value: function getPageDict(pageIndex) {
+      var capability = (0, _util.createPromiseCapability)();
+      var nodesToVisit = [this.catDict.getRaw('Pages')];
+      var xref = this.xref,
+          pageKidsCountCache = this.pageKidsCountCache;
+      var count = void 0,
+          currentPageIndex = 0;
+      function next() {
+        var _loop = function _loop() {
+          var currentNode = nodesToVisit.pop();
+          if ((0, _primitives.isRef)(currentNode)) {
+            count = pageKidsCountCache.get(currentNode);
+            if (count > 0 && currentPageIndex + count < pageIndex) {
+              currentPageIndex += count;
+              return 'continue';
+            }
+            xref.fetchAsync(currentNode).then(function (obj) {
+              if ((0, _primitives.isDict)(obj, 'Page') || (0, _primitives.isDict)(obj) && !obj.has('Kids')) {
+                if (pageIndex === currentPageIndex) {
+                  if (currentNode && !pageKidsCountCache.has(currentNode)) {
+                    pageKidsCountCache.put(currentNode, 1);
+                  }
+                  capability.resolve([obj, currentNode]);
+                } else {
+                  currentPageIndex++;
+                  next();
+                }
+                return;
+              }
+              nodesToVisit.push(obj);
+              next();
+            }, capability.reject);
+            return {
+              v: void 0
+            };
+          }
+          if (!(0, _primitives.isDict)(currentNode)) {
+            capability.reject(new _util.FormatError('Page dictionary kid reference points to wrong type of object.'));
+            return {
+              v: void 0
+            };
+          }
+          count = currentNode.get('Count');
+          if (Number.isInteger(count) && count >= 0) {
+            var objId = currentNode.objId;
+            if (objId && !pageKidsCountCache.has(objId)) {
+              pageKidsCountCache.put(objId, count);
+            }
+            if (currentPageIndex + count <= pageIndex) {
+              currentPageIndex += count;
+              return 'continue';
+            }
+          }
+          var kids = currentNode.get('Kids');
+          if (!Array.isArray(kids)) {
+            if ((0, _primitives.isName)(currentNode.get('Type'), 'Page') || !currentNode.has('Type') && currentNode.has('Contents')) {
+              if (currentPageIndex === pageIndex) {
+                capability.resolve([currentNode, null]);
+                return {
+                  v: void 0
+                };
+              }
+              currentPageIndex++;
+              return 'continue';
+            }
+            capability.reject(new _util.FormatError('Page dictionary kids object is not an array.'));
+            return {
+              v: void 0
+            };
+          }
+          for (var last = kids.length - 1; last >= 0; last--) {
+            nodesToVisit.push(kids[last]);
+          }
+        };
+
+        while (nodesToVisit.length) {
+          var _ret = _loop();
+
+          switch (_ret) {
+            case 'continue':
+              continue;
+
+            default:
+              if ((typeof _ret === 'undefined' ? 'undefined' : _typeof(_ret)) === "object") return _ret.v;
+          }
+        }
+        capability.reject(new Error('Page index ' + pageIndex + ' not found.'));
+      }
+      next();
+      return capability.promise;
+    }
+  }, {
+    key: 'getPageIndex',
+    value: function getPageIndex(pageRef) {
+      var xref = this.xref;
+      function pagesBeforeRef(kidRef) {
+        var total = 0,
+            parentRef = void 0;
+        return xref.fetchAsync(kidRef).then(function (node) {
+          if ((0, _primitives.isRefsEqual)(kidRef, pageRef) && !(0, _primitives.isDict)(node, 'Page') && !((0, _primitives.isDict)(node) && !node.has('Type') && node.has('Contents'))) {
+            throw new _util.FormatError('The reference does not point to a /Page dictionary.');
+          }
+          if (!node) {
+            return null;
+          }
+          if (!(0, _primitives.isDict)(node)) {
+            throw new _util.FormatError('Node must be a dictionary.');
+          }
+          parentRef = node.getRaw('Parent');
+          return node.getAsync('Parent');
+        }).then(function (parent) {
+          if (!parent) {
+            return null;
+          }
+          if (!(0, _primitives.isDict)(parent)) {
+            throw new _util.FormatError('Parent must be a dictionary.');
+          }
+          return parent.getAsync('Kids');
+        }).then(function (kids) {
+          if (!kids) {
+            return null;
+          }
+          var kidPromises = [];
+          var found = false;
+          for (var i = 0, ii = kids.length; i < ii; i++) {
+            var kid = kids[i];
+            if (!(0, _primitives.isRef)(kid)) {
+              throw new _util.FormatError('Kid must be a reference.');
+            }
+            if ((0, _primitives.isRefsEqual)(kid, kidRef)) {
+              found = true;
+              break;
+            }
+            kidPromises.push(xref.fetchAsync(kid).then(function (kid) {
+              if (!(0, _primitives.isDict)(kid)) {
+                throw new _util.FormatError('Kid node must be a dictionary.');
+              }
+              if (kid.has('Count')) {
+                total += kid.get('Count');
+              } else {
+                total++;
+              }
+            }));
+          }
+          if (!found) {
+            throw new _util.FormatError('Kid reference not found in parent\'s kids.');
+          }
+          return Promise.all(kidPromises).then(function () {
+            return [total, parentRef];
+          });
+        });
+      }
+      var total = 0;
+      function next(ref) {
+        return pagesBeforeRef(ref).then(function (args) {
+          if (!args) {
+            return total;
+          }
+
+          var _args = _slicedToArray(args, 2),
+              count = _args[0],
+              parentRef = _args[1];
+
+          total += count;
+          return next(parentRef);
+        });
+      }
+      return next(pageRef);
+    }
+  }, {
+    key: 'metadata',
+    get: function get() {
+      var streamRef = this.catDict.getRaw('Metadata');
+      if (!(0, _primitives.isRef)(streamRef)) {
+        return (0, _util.shadow)(this, 'metadata', null);
+      }
+      var suppressEncryption = !(this.xref.encrypt && this.xref.encrypt.encryptMetadata);
+      var stream = this.xref.fetch(streamRef, suppressEncryption);
+      var metadata = void 0;
+      if (stream && (0, _primitives.isDict)(stream.dict)) {
+        var type = stream.dict.get('Type');
+        var subtype = stream.dict.get('Subtype');
+        if ((0, _primitives.isName)(type, 'Metadata') && (0, _primitives.isName)(subtype, 'XML')) {
+          try {
+            metadata = (0, _util.stringToUTF8String)((0, _util.bytesToString)(stream.getBytes()));
+          } catch (e) {
+            if (e instanceof _util.MissingDataException) {
+              throw e;
+            }
+            (0, _util.info)('Skipping invalid metadata.');
+          }
+        }
+      }
+      return (0, _util.shadow)(this, 'metadata', metadata);
+    }
+  }, {
+    key: 'toplevelPagesDict',
+    get: function get() {
+      var pagesObj = this.catDict.get('Pages');
+      if (!(0, _primitives.isDict)(pagesObj)) {
+        throw new _util.FormatError('Invalid top-level pages dictionary.');
+      }
+      return (0, _util.shadow)(this, 'toplevelPagesDict', pagesObj);
+    }
+  }, {
+    key: 'documentOutline',
+    get: function get() {
+      var obj = null;
+      try {
+        obj = this._readDocumentOutline();
+      } catch (ex) {
+        if (ex instanceof _util.MissingDataException) {
+          throw ex;
+        }
+        (0, _util.warn)('Unable to read document outline.');
+      }
+      return (0, _util.shadow)(this, 'documentOutline', obj);
+    }
+  }, {
+    key: 'permissions',
+    get: function get() {
+      var permissions = null;
+      try {
+        permissions = this._readPermissions();
+      } catch (ex) {
+        if (ex instanceof _util.MissingDataException) {
+          throw ex;
+        }
+        (0, _util.warn)('Unable to read permissions.');
+      }
+      return (0, _util.shadow)(this, 'permissions', permissions);
+    }
+  }, {
+    key: 'numPages',
+    get: function get() {
+      var obj = this.toplevelPagesDict.get('Count');
+      if (!Number.isInteger(obj)) {
+        throw new _util.FormatError('Page count in top-level pages dictionary is not an integer.');
+      }
+      return (0, _util.shadow)(this, 'numPages', obj);
+    }
+  }, {
+    key: 'destinations',
+    get: function get() {
+      var obj = this._readDests(),
+          dests = Object.create(null);
+      if (obj instanceof NameTree) {
+        var names = obj.getAll();
+        for (var name in names) {
+          dests[name] = fetchDestination(names[name]);
+        }
+      } else if (obj instanceof _primitives.Dict) {
+        obj.forEach(function (key, value) {
+          if (value) {
+            dests[key] = fetchDestination(value);
+          }
+        });
+      }
+      return (0, _util.shadow)(this, 'destinations', dests);
+    }
+  }, {
+    key: 'pageLabels',
+    get: function get() {
+      var obj = null;
+      try {
+        obj = this._readPageLabels();
+      } catch (ex) {
+        if (ex instanceof _util.MissingDataException) {
+          throw ex;
+        }
+        (0, _util.warn)('Unable to read page labels.');
+      }
+      return (0, _util.shadow)(this, 'pageLabels', obj);
+    }
+  }, {
+    key: 'pageMode',
+    get: function get() {
+      var obj = this.catDict.get('PageMode');
+      var pageMode = 'UseNone';
+      if ((0, _primitives.isName)(obj)) {
+        switch (obj.name) {
+          case 'UseNone':
+          case 'UseOutlines':
+          case 'UseThumbs':
+          case 'FullScreen':
+          case 'UseOC':
+          case 'UseAttachments':
+            pageMode = obj.name;
+        }
+      }
+      return (0, _util.shadow)(this, 'pageMode', pageMode);
+    }
+  }, {
+    key: 'attachments',
+    get: function get() {
+      var obj = this.catDict.get('Names');
+      var attachments = null;
+      if (obj && obj.has('EmbeddedFiles')) {
+        var nameTree = new NameTree(obj.getRaw('EmbeddedFiles'), this.xref);
+        var names = nameTree.getAll();
+        for (var name in names) {
+          var fs = new FileSpec(names[name], this.xref);
+          if (!attachments) {
+            attachments = Object.create(null);
+          }
+          attachments[(0, _util.stringToPDFString)(name)] = fs.serializable;
+        }
+      }
+      return (0, _util.shadow)(this, 'attachments', attachments);
+    }
+  }, {
+    key: 'javaScript',
+    get: function get() {
+      var obj = this.catDict.get('Names');
+      var javaScript = null;
+      function appendIfJavaScriptDict(jsDict) {
+        var type = jsDict.get('S');
+        if (!(0, _primitives.isName)(type, 'JavaScript')) {
+          return;
+        }
+        var js = jsDict.get('JS');
+        if ((0, _primitives.isStream)(js)) {
+          js = (0, _util.bytesToString)(js.getBytes());
+        } else if (!(0, _util.isString)(js)) {
+          return;
+        }
+        if (!javaScript) {
+          javaScript = [];
+        }
+        javaScript.push((0, _util.stringToPDFString)(js));
+      }
+      if (obj && obj.has('JavaScript')) {
+        var nameTree = new NameTree(obj.getRaw('JavaScript'), this.xref);
+        var names = nameTree.getAll();
+        for (var name in names) {
+          var jsDict = names[name];
+          if ((0, _primitives.isDict)(jsDict)) {
+            appendIfJavaScriptDict(jsDict);
+          }
+        }
+      }
+      var openActionDict = this.catDict.get('OpenAction');
+      if ((0, _primitives.isDict)(openActionDict, 'Action')) {
+        var actionType = openActionDict.get('S');
+        if ((0, _primitives.isName)(actionType, 'Named')) {
+          var action = openActionDict.get('N');
+          if ((0, _primitives.isName)(action, 'Print')) {
+            if (!javaScript) {
+              javaScript = [];
+            }
+            javaScript.push('print({});');
+          }
+        } else {
+          appendIfJavaScriptDict(openActionDict);
+        }
+      }
+      return (0, _util.shadow)(this, 'javaScript', javaScript);
+    }
+  }], [{
+    key: 'parseDestDictionary',
+    value: function parseDestDictionary(params) {
+      function addDefaultProtocolToUrl(url) {
+        if (url.indexOf('www.') === 0) {
+          return 'http://' + url;
+        }
+        return url;
+      }
+      function tryConvertUrlEncoding(url) {
+        try {
+          return (0, _util.stringToUTF8String)(url);
+        } catch (e) {
+          return url;
+        }
+      }
+      var destDict = params.destDict;
+      if (!(0, _primitives.isDict)(destDict)) {
+        (0, _util.warn)('parseDestDictionary: `destDict` must be a dictionary.');
+        return;
+      }
+      var resultObj = params.resultObj;
+      if ((typeof resultObj === 'undefined' ? 'undefined' : _typeof(resultObj)) !== 'object') {
+        (0, _util.warn)('parseDestDictionary: `resultObj` must be an object.');
+        return;
+      }
+      var docBaseUrl = params.docBaseUrl || null;
+      var action = destDict.get('A'),
+          url = void 0,
+          dest = void 0;
+      if (!(0, _primitives.isDict)(action) && destDict.has('Dest')) {
+        action = destDict.get('Dest');
+      }
+      if ((0, _primitives.isDict)(action)) {
+        var actionType = action.get('S');
+        if (!(0, _primitives.isName)(actionType)) {
+          (0, _util.warn)('parseDestDictionary: Invalid type in Action dictionary.');
+          return;
+        }
+        var actionName = actionType.name;
+        switch (actionName) {
+          case 'URI':
+            url = action.get('URI');
+            if ((0, _primitives.isName)(url)) {
+              url = '/' + url.name;
+            } else if ((0, _util.isString)(url)) {
+              url = addDefaultProtocolToUrl(url);
+            }
+            break;
+          case 'GoTo':
+            dest = action.get('D');
+            break;
+          case 'Launch':
+          case 'GoToR':
+            var urlDict = action.get('F');
+            if ((0, _primitives.isDict)(urlDict)) {
+              url = urlDict.get('F') || null;
+            } else if ((0, _util.isString)(urlDict)) {
+              url = urlDict;
+            }
+            var remoteDest = action.get('D');
+            if (remoteDest) {
+              if ((0, _primitives.isName)(remoteDest)) {
+                remoteDest = remoteDest.name;
+              }
+              if ((0, _util.isString)(url)) {
+                var baseUrl = url.split('#')[0];
+                if ((0, _util.isString)(remoteDest)) {
+                  url = baseUrl + '#' + remoteDest;
+                } else if (Array.isArray(remoteDest)) {
+                  url = baseUrl + '#' + JSON.stringify(remoteDest);
+                }
+              }
+            }
+            var newWindow = action.get('NewWindow');
+            if ((0, _util.isBool)(newWindow)) {
+              resultObj.newWindow = newWindow;
+            }
+            break;
+          case 'Named':
+            var namedAction = action.get('N');
+            if ((0, _primitives.isName)(namedAction)) {
+              resultObj.action = namedAction.name;
+            }
+            break;
+          case 'JavaScript':
+            var jsAction = action.get('JS');
+            var js = void 0;
+            if ((0, _primitives.isStream)(jsAction)) {
+              js = (0, _util.bytesToString)(jsAction.getBytes());
+            } else if ((0, _util.isString)(jsAction)) {
+              js = jsAction;
+            }
+            if (js) {
+              var URL_OPEN_METHODS = ['app.launchURL', 'window.open'];
+              var regex = new RegExp('^\\s*(' + URL_OPEN_METHODS.join('|').split('.').join('\\.') + ')\\((?:\'|\")([^\'\"]*)(?:\'|\")(?:,\\s*(\\w+)\\)|\\))', 'i');
+              var jsUrl = regex.exec((0, _util.stringToPDFString)(js));
+              if (jsUrl && jsUrl[2]) {
+                url = jsUrl[2];
+                if (jsUrl[3] === 'true' && jsUrl[1] === 'app.launchURL') {
+                  resultObj.newWindow = true;
+                }
+                break;
+              }
+            }
+          default:
+            (0, _util.warn)('parseDestDictionary: unsupported action type "' + actionName + '".');
+            break;
+        }
+      } else if (destDict.has('Dest')) {
+        dest = destDict.get('Dest');
+      }
+      if ((0, _util.isString)(url)) {
+        url = tryConvertUrlEncoding(url);
+        var absoluteUrl = (0, _util.createValidAbsoluteUrl)(url, docBaseUrl);
+        if (absoluteUrl) {
+          resultObj.url = absoluteUrl.href;
+        }
+        resultObj.unsafeUrl = url;
+      }
+      if (dest) {
+        if ((0, _primitives.isName)(dest)) {
+          dest = dest.name;
+        }
+        if ((0, _util.isString)(dest) || Array.isArray(dest)) {
+          resultObj.dest = dest;
+        }
+      }
+    }
+  }]);
+
+  return Catalog;
+}();
+
+var XRef = function XRefClosure() {
+  function XRef(stream, pdfManager) {
+    this.stream = stream;
+    this.pdfManager = pdfManager;
+    this.entries = [];
+    this.xrefstms = Object.create(null);
+    this.cache = [];
+    this.stats = {
+      streamTypes: [],
+      fontTypes: []
+    };
+  }
+  XRef.prototype = {
+    setStartXRef: function XRef_setStartXRef(startXRef) {
+      this.startXRefQueue = [startXRef];
+    },
+    parse: function XRef_parse(recoveryMode) {
+      var trailerDict;
+      if (!recoveryMode) {
+        trailerDict = this.readXRef();
+      } else {
+        (0, _util.warn)('Indexing all PDF objects');
+        trailerDict = this.indexObjects();
+      }
+      trailerDict.assignXref(this);
+      this.trailer = trailerDict;
+      var encrypt = void 0;
+      try {
+        encrypt = trailerDict.get('Encrypt');
+      } catch (ex) {
+        if (ex instanceof _util.MissingDataException) {
+          throw ex;
+        }
+        (0, _util.warn)('XRef.parse - Invalid "Encrypt" reference: "' + ex + '".');
+      }
+      if ((0, _primitives.isDict)(encrypt)) {
+        var ids = trailerDict.get('ID');
+        var fileId = ids && ids.length ? ids[0] : '';
+        encrypt.suppressEncryption = true;
+        this.encrypt = new _crypto.CipherTransformFactory(encrypt, fileId, this.pdfManager.password);
+      }
+      var root = void 0;
+      try {
+        root = trailerDict.get('Root');
+      } catch (ex) {
+        if (ex instanceof _util.MissingDataException) {
+          throw ex;
+        }
+        (0, _util.warn)('XRef.parse - Invalid "Root" reference: "' + ex + '".');
+      }
+      if ((0, _primitives.isDict)(root) && root.has('Pages')) {
+        this.root = root;
+      } else {
+        if (!recoveryMode) {
+          throw new _util.XRefParseException();
+        }
+        throw new _util.FormatError('Invalid root reference');
+      }
+    },
+    processXRefTable: function XRef_processXRefTable(parser) {
+      if (!('tableState' in this)) {
+        this.tableState = {
+          entryNum: 0,
+          streamPos: parser.lexer.stream.pos,
+          parserBuf1: parser.buf1,
+          parserBuf2: parser.buf2
+        };
+      }
+      var obj = this.readXRefTable(parser);
+      if (!(0, _primitives.isCmd)(obj, 'trailer')) {
+        throw new _util.FormatError('Invalid XRef table: could not find trailer dictionary');
+      }
+      var dict = parser.getObj();
+      if (!(0, _primitives.isDict)(dict) && dict.dict) {
+        dict = dict.dict;
+      }
+      if (!(0, _primitives.isDict)(dict)) {
+        throw new _util.FormatError('Invalid XRef table: could not parse trailer dictionary');
+      }
+      delete this.tableState;
+      return dict;
+    },
+    readXRefTable: function XRef_readXRefTable(parser) {
+      var stream = parser.lexer.stream;
+      var tableState = this.tableState;
+      stream.pos = tableState.streamPos;
+      parser.buf1 = tableState.parserBuf1;
+      parser.buf2 = tableState.parserBuf2;
+      var obj;
+      while (true) {
+        if (!('firstEntryNum' in tableState) || !('entryCount' in tableState)) {
+          if ((0, _primitives.isCmd)(obj = parser.getObj(), 'trailer')) {
+            break;
+          }
+          tableState.firstEntryNum = obj;
+          tableState.entryCount = parser.getObj();
+        }
+        var first = tableState.firstEntryNum;
+        var count = tableState.entryCount;
+        if (!Number.isInteger(first) || !Number.isInteger(count)) {
+          throw new _util.FormatError('Invalid XRef table: wrong types in subsection header');
+        }
+        for (var i = tableState.entryNum; i < count; i++) {
+          tableState.streamPos = stream.pos;
+          tableState.entryNum = i;
+          tableState.parserBuf1 = parser.buf1;
+          tableState.parserBuf2 = parser.buf2;
+          var entry = {};
+          entry.offset = parser.getObj();
+          entry.gen = parser.getObj();
+          var type = parser.getObj();
+          if ((0, _primitives.isCmd)(type, 'f')) {
+            entry.free = true;
+          } else if ((0, _primitives.isCmd)(type, 'n')) {
+            entry.uncompressed = true;
+          }
+          if (!Number.isInteger(entry.offset) || !Number.isInteger(entry.gen) || !(entry.free || entry.uncompressed)) {
+            throw new _util.FormatError('Invalid entry in XRef subsection: ' + first + ', ' + count);
+          }
+          if (i === 0 && entry.free && first === 1) {
+            first = 0;
+          }
+          if (!this.entries[i + first]) {
+            this.entries[i + first] = entry;
+          }
+        }
+        tableState.entryNum = 0;
+        tableState.streamPos = stream.pos;
+        tableState.parserBuf1 = parser.buf1;
+        tableState.parserBuf2 = parser.buf2;
+        delete tableState.firstEntryNum;
+        delete tableState.entryCount;
+      }
+      if (this.entries[0] && !this.entries[0].free) {
+        throw new _util.FormatError('Invalid XRef table: unexpected first object');
+      }
+      return obj;
+    },
+    processXRefStream: function XRef_processXRefStream(stream) {
+      if (!('streamState' in this)) {
+        var streamParameters = stream.dict;
+        var byteWidths = streamParameters.get('W');
+        var range = streamParameters.get('Index');
+        if (!range) {
+          range = [0, streamParameters.get('Size')];
+        }
+        this.streamState = {
+          entryRanges: range,
+          byteWidths: byteWidths,
+          entryNum: 0,
+          streamPos: stream.pos
+        };
+      }
+      this.readXRefStream(stream);
+      delete this.streamState;
+      return stream.dict;
+    },
+    readXRefStream: function XRef_readXRefStream(stream) {
+      var i, j;
+      var streamState = this.streamState;
+      stream.pos = streamState.streamPos;
+      var byteWidths = streamState.byteWidths;
+      var typeFieldWidth = byteWidths[0];
+      var offsetFieldWidth = byteWidths[1];
+      var generationFieldWidth = byteWidths[2];
+      var entryRanges = streamState.entryRanges;
+      while (entryRanges.length > 0) {
+        var first = entryRanges[0];
+        var n = entryRanges[1];
+        if (!Number.isInteger(first) || !Number.isInteger(n)) {
+          throw new _util.FormatError('Invalid XRef range fields: ' + first + ', ' + n);
+        }
+        if (!Number.isInteger(typeFieldWidth) || !Number.isInteger(offsetFieldWidth) || !Number.isInteger(generationFieldWidth)) {
+          throw new _util.FormatError('Invalid XRef entry fields length: ' + first + ', ' + n);
+        }
+        for (i = streamState.entryNum; i < n; ++i) {
+          streamState.entryNum = i;
+          streamState.streamPos = stream.pos;
+          var type = 0,
+              offset = 0,
+              generation = 0;
+          for (j = 0; j < typeFieldWidth; ++j) {
+            type = type << 8 | stream.getByte();
+          }
+          if (typeFieldWidth === 0) {
+            type = 1;
+          }
+          for (j = 0; j < offsetFieldWidth; ++j) {
+            offset = offset << 8 | stream.getByte();
+          }
+          for (j = 0; j < generationFieldWidth; ++j) {
+            generation = generation << 8 | stream.getByte();
+          }
+          var entry = {};
+          entry.offset = offset;
+          entry.gen = generation;
+          switch (type) {
+            case 0:
+              entry.free = true;
+              break;
+            case 1:
+              entry.uncompressed = true;
+              break;
+            case 2:
+              break;
+            default:
+              throw new _util.FormatError('Invalid XRef entry type: ' + type);
+          }
+          if (!this.entries[first + i]) {
+            this.entries[first + i] = entry;
+          }
+        }
+        streamState.entryNum = 0;
+        streamState.streamPos = stream.pos;
+        entryRanges.splice(0, 2);
+      }
+    },
+    indexObjects: function XRef_indexObjects() {
+      var TAB = 0x9,
+          LF = 0xA,
+          CR = 0xD,
+          SPACE = 0x20;
+      var PERCENT = 0x25,
+          LT = 0x3C;
+      function readToken(data, offset) {
+        var token = '',
+            ch = data[offset];
+        while (ch !== LF && ch !== CR && ch !== LT) {
+          if (++offset >= data.length) {
+            break;
+          }
+          token += String.fromCharCode(ch);
+          ch = data[offset];
+        }
+        return token;
+      }
+      function skipUntil(data, offset, what) {
+        var length = what.length,
+            dataLength = data.length;
+        var skipped = 0;
+        while (offset < dataLength) {
+          var i = 0;
+          while (i < length && data[offset + i] === what[i]) {
+            ++i;
+          }
+          if (i >= length) {
+            break;
+          }
+          offset++;
+          skipped++;
+        }
+        return skipped;
+      }
+      var objRegExp = /^(\d+)\s+(\d+)\s+obj\b/;
+      var endobjRegExp = /\bendobj[\b\s]$/;
+      var nestedObjRegExp = /\s+(\d+\s+\d+\s+obj[\b\s])$/;
+      var CHECK_CONTENT_LENGTH = 25;
+      var trailerBytes = new Uint8Array([116, 114, 97, 105, 108, 101, 114]);
+      var startxrefBytes = new Uint8Array([115, 116, 97, 114, 116, 120, 114, 101, 102]);
+      var objBytes = new Uint8Array([111, 98, 106]);
+      var xrefBytes = new Uint8Array([47, 88, 82, 101, 102]);
+      this.entries.length = 0;
+      var stream = this.stream;
+      stream.pos = 0;
+      var buffer = stream.getBytes();
+      var position = stream.start,
+          length = buffer.length;
+      var trailers = [],
+          xrefStms = [];
+      while (position < length) {
+        var ch = buffer[position];
+        if (ch === TAB || ch === LF || ch === CR || ch === SPACE) {
+          ++position;
+          continue;
+        }
+        if (ch === PERCENT) {
+          do {
+            ++position;
+            if (position >= length) {
+              break;
+            }
+            ch = buffer[position];
+          } while (ch !== LF && ch !== CR);
+          continue;
+        }
+        var token = readToken(buffer, position);
+        var m;
+        if (token.indexOf('xref') === 0 && (token.length === 4 || /\s/.test(token[4]))) {
+          position += skipUntil(buffer, position, trailerBytes);
+          trailers.push(position);
+          position += skipUntil(buffer, position, startxrefBytes);
+        } else if (m = objRegExp.exec(token)) {
+          if (typeof this.entries[m[1]] === 'undefined') {
+            this.entries[m[1]] = {
+              offset: position - stream.start,
+              gen: m[2] | 0,
+              uncompressed: true
+            };
+          }
+          var contentLength = void 0,
+              startPos = position + token.length;
+          while (startPos < buffer.length) {
+            var endPos = startPos + skipUntil(buffer, startPos, objBytes) + 4;
+            contentLength = endPos - position;
+            var checkPos = Math.max(endPos - CHECK_CONTENT_LENGTH, startPos);
+            var tokenStr = (0, _util.bytesToString)(buffer.subarray(checkPos, endPos));
+            if (endobjRegExp.test(tokenStr)) {
+              break;
+            } else {
+              var objToken = nestedObjRegExp.exec(tokenStr);
+              if (objToken && objToken[1]) {
+                (0, _util.warn)('indexObjects: Found new "obj" inside of another "obj", ' + 'caused by missing "endobj" -- trying to recover.');
+                contentLength -= objToken[1].length;
+                break;
+              }
+            }
+            startPos = endPos;
+          }
+          var content = buffer.subarray(position, position + contentLength);
+          var xrefTagOffset = skipUntil(content, 0, xrefBytes);
+          if (xrefTagOffset < contentLength && content[xrefTagOffset + 5] < 64) {
+            xrefStms.push(position - stream.start);
+            this.xrefstms[position - stream.start] = 1;
+          }
+          position += contentLength;
+        } else if (token.indexOf('trailer') === 0 && (token.length === 7 || /\s/.test(token[7]))) {
+          trailers.push(position);
+          position += skipUntil(buffer, position, startxrefBytes);
+        } else {
+          position += token.length + 1;
+        }
+      }
+      var i, ii;
+      for (i = 0, ii = xrefStms.length; i < ii; ++i) {
+        this.startXRefQueue.push(xrefStms[i]);
+        this.readXRef(true);
+      }
+      var trailerDict = void 0;
+      for (i = 0, ii = trailers.length; i < ii; ++i) {
+        stream.pos = trailers[i];
+        var parser = new _parser.Parser(new _parser.Lexer(stream), true, this, true);
+        var obj = parser.getObj();
+        if (!(0, _primitives.isCmd)(obj, 'trailer')) {
+          continue;
+        }
+        var dict = parser.getObj();
+        if (!(0, _primitives.isDict)(dict)) {
+          continue;
+        }
+        var rootDict = void 0;
+        try {
+          rootDict = dict.get('Root');
+        } catch (ex) {
+          if (ex instanceof _util.MissingDataException) {
+            throw ex;
+          }
+          continue;
+        }
+        if (!(0, _primitives.isDict)(rootDict) || !rootDict.has('Pages')) {
+          continue;
+        }
+        if (dict.has('ID')) {
+          return dict;
+        }
+        trailerDict = dict;
+      }
+      if (trailerDict) {
+        return trailerDict;
+      }
+      throw new _util.InvalidPDFException('Invalid PDF structure');
+    },
+    readXRef: function XRef_readXRef(recoveryMode) {
+      var stream = this.stream;
+      var startXRefParsedCache = Object.create(null);
+      try {
+        while (this.startXRefQueue.length) {
+          var startXRef = this.startXRefQueue[0];
+          if (startXRefParsedCache[startXRef]) {
+            (0, _util.warn)('readXRef - skipping XRef table since it was already parsed.');
+            this.startXRefQueue.shift();
+            continue;
+          }
+          startXRefParsedCache[startXRef] = true;
+          stream.pos = startXRef + stream.start;
+          var parser = new _parser.Parser(new _parser.Lexer(stream), true, this);
+          var obj = parser.getObj();
+          var dict;
+          if ((0, _primitives.isCmd)(obj, 'xref')) {
+            dict = this.processXRefTable(parser);
+            if (!this.topDict) {
+              this.topDict = dict;
+            }
+            obj = dict.get('XRefStm');
+            if (Number.isInteger(obj)) {
+              var pos = obj;
+              if (!(pos in this.xrefstms)) {
+                this.xrefstms[pos] = 1;
+                this.startXRefQueue.push(pos);
+              }
+            }
+          } else if (Number.isInteger(obj)) {
+            if (!Number.isInteger(parser.getObj()) || !(0, _primitives.isCmd)(parser.getObj(), 'obj') || !(0, _primitives.isStream)(obj = parser.getObj())) {
+              throw new _util.FormatError('Invalid XRef stream');
+            }
+            dict = this.processXRefStream(obj);
+            if (!this.topDict) {
+              this.topDict = dict;
+            }
+            if (!dict) {
+              throw new _util.FormatError('Failed to read XRef stream');
+            }
+          } else {
+            throw new _util.FormatError('Invalid XRef stream header');
+          }
+          obj = dict.get('Prev');
+          if (Number.isInteger(obj)) {
+            this.startXRefQueue.push(obj);
+          } else if ((0, _primitives.isRef)(obj)) {
+            this.startXRefQueue.push(obj.num);
+          }
+          this.startXRefQueue.shift();
+        }
+        return this.topDict;
+      } catch (e) {
+        if (e instanceof _util.MissingDataException) {
+          throw e;
+        }
+        (0, _util.info)('(while reading XRef): ' + e);
+      }
+      if (recoveryMode) {
+        return;
+      }
+      throw new _util.XRefParseException();
+    },
+    getEntry: function XRef_getEntry(i) {
+      var xrefEntry = this.entries[i];
+      if (xrefEntry && !xrefEntry.free && xrefEntry.offset) {
+        return xrefEntry;
+      }
+      return null;
+    },
+    fetchIfRef: function XRef_fetchIfRef(obj, suppressEncryption) {
+      if (!(0, _primitives.isRef)(obj)) {
+        return obj;
+      }
+      return this.fetch(obj, suppressEncryption);
+    },
+    fetch: function XRef_fetch(ref, suppressEncryption) {
+      if (!(0, _primitives.isRef)(ref)) {
+        throw new Error('ref object is not a reference');
+      }
+      var num = ref.num;
+      if (num in this.cache) {
+        var cacheEntry = this.cache[num];
+        if (cacheEntry instanceof _primitives.Dict && !cacheEntry.objId) {
+          cacheEntry.objId = ref.toString();
+        }
+        return cacheEntry;
+      }
+      var xrefEntry = this.getEntry(num);
+      if (xrefEntry === null) {
+        return this.cache[num] = null;
+      }
+      if (xrefEntry.uncompressed) {
+        xrefEntry = this.fetchUncompressed(ref, xrefEntry, suppressEncryption);
+      } else {
+        xrefEntry = this.fetchCompressed(xrefEntry, suppressEncryption);
+      }
+      if ((0, _primitives.isDict)(xrefEntry)) {
+        xrefEntry.objId = ref.toString();
+      } else if ((0, _primitives.isStream)(xrefEntry)) {
+        xrefEntry.dict.objId = ref.toString();
+      }
+      return xrefEntry;
+    },
+    fetchUncompressed: function XRef_fetchUncompressed(ref, xrefEntry, suppressEncryption) {
+      var gen = ref.gen;
+      var num = ref.num;
+      if (xrefEntry.gen !== gen) {
+        throw new _util.FormatError('inconsistent generation in XRef');
+      }
+      var stream = this.stream.makeSubStream(xrefEntry.offset + this.stream.start);
+      var parser = new _parser.Parser(new _parser.Lexer(stream), true, this);
+      var obj1 = parser.getObj();
+      var obj2 = parser.getObj();
+      var obj3 = parser.getObj();
+      if (!Number.isInteger(obj1)) {
+        obj1 = parseInt(obj1, 10);
+      }
+      if (!Number.isInteger(obj2)) {
+        obj2 = parseInt(obj2, 10);
+      }
+      if (obj1 !== num || obj2 !== gen || !(0, _primitives.isCmd)(obj3)) {
+        throw new _util.FormatError('bad XRef entry');
+      }
+      if (obj3.cmd !== 'obj') {
+        if (obj3.cmd.indexOf('obj') === 0) {
+          num = parseInt(obj3.cmd.substring(3), 10);
+          if (!Number.isNaN(num)) {
+            return num;
+          }
+        }
+        throw new _util.FormatError('bad XRef entry');
+      }
+      if (this.encrypt && !suppressEncryption) {
+        xrefEntry = parser.getObj(this.encrypt.createCipherTransform(num, gen));
+      } else {
+        xrefEntry = parser.getObj();
+      }
+      if (!(0, _primitives.isStream)(xrefEntry)) {
+        this.cache[num] = xrefEntry;
+      }
+      return xrefEntry;
+    },
+    fetchCompressed: function XRef_fetchCompressed(xrefEntry, suppressEncryption) {
+      var tableOffset = xrefEntry.offset;
+      var stream = this.fetch(new _primitives.Ref(tableOffset, 0));
+      if (!(0, _primitives.isStream)(stream)) {
+        throw new _util.FormatError('bad ObjStm stream');
+      }
+      var first = stream.dict.get('First');
+      var n = stream.dict.get('N');
+      if (!Number.isInteger(first) || !Number.isInteger(n)) {
+        throw new _util.FormatError('invalid first and n parameters for ObjStm stream');
+      }
+      var parser = new _parser.Parser(new _parser.Lexer(stream), false, this);
+      parser.allowStreams = true;
+      var i,
+          entries = [],
+          num,
+          nums = [];
+      for (i = 0; i < n; ++i) {
+        num = parser.getObj();
+        if (!Number.isInteger(num)) {
+          throw new _util.FormatError('invalid object number in the ObjStm stream: ' + num);
+        }
+        nums.push(num);
+        var offset = parser.getObj();
+        if (!Number.isInteger(offset)) {
+          throw new _util.FormatError('invalid object offset in the ObjStm stream: ' + offset);
+        }
+      }
+      for (i = 0; i < n; ++i) {
+        entries.push(parser.getObj());
+        if ((0, _primitives.isCmd)(parser.buf1, 'endobj')) {
+          parser.shift();
+        }
+        num = nums[i];
+        var entry = this.entries[num];
+        if (entry && entry.offset === tableOffset && entry.gen === i) {
+          this.cache[num] = entries[i];
+        }
+      }
+      xrefEntry = entries[xrefEntry.gen];
+      if (xrefEntry === undefined) {
+        throw new _util.FormatError('bad XRef entry for compressed object');
+      }
+      return xrefEntry;
+    },
+    fetchIfRefAsync: function () {
+      var _ref = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee(obj, suppressEncryption) {
+        return _regenerator2.default.wrap(function _callee$(_context) {
+          while (1) {
+            switch (_context.prev = _context.next) {
+              case 0:
+                if ((0, _primitives.isRef)(obj)) {
+                  _context.next = 2;
+                  break;
+                }
+
+                return _context.abrupt('return', obj);
+
+              case 2:
+                return _context.abrupt('return', this.fetchAsync(obj, suppressEncryption));
+
+              case 3:
+              case 'end':
+                return _context.stop();
+            }
+          }
+        }, _callee, this);
+      }));
+
+      function fetchIfRefAsync(_x, _x2) {
+        return _ref.apply(this, arguments);
+      }
+
+      return fetchIfRefAsync;
+    }(),
+    fetchAsync: function () {
+      var _ref2 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee2(ref, suppressEncryption) {
+        return _regenerator2.default.wrap(function _callee2$(_context2) {
+          while (1) {
+            switch (_context2.prev = _context2.next) {
+              case 0:
+                _context2.prev = 0;
+                return _context2.abrupt('return', this.fetch(ref, suppressEncryption));
+
+              case 4:
+                _context2.prev = 4;
+                _context2.t0 = _context2['catch'](0);
+
+                if (_context2.t0 instanceof _util.MissingDataException) {
+                  _context2.next = 8;
+                  break;
+                }
+
+                throw _context2.t0;
+
+              case 8:
+                _context2.next = 10;
+                return this.pdfManager.requestRange(_context2.t0.begin, _context2.t0.end);
+
+              case 10:
+                return _context2.abrupt('return', this.fetchAsync(ref, suppressEncryption));
+
+              case 11:
+              case 'end':
+                return _context2.stop();
+            }
+          }
+        }, _callee2, this, [[0, 4]]);
+      }));
+
+      function fetchAsync(_x3, _x4) {
+        return _ref2.apply(this, arguments);
+      }
+
+      return fetchAsync;
+    }(),
+
+    getCatalogObj: function XRef_getCatalogObj() {
+      return this.root;
+    }
+  };
+  return XRef;
+}();
+
+var NameOrNumberTree = function () {
+  function NameOrNumberTree(root, xref, type) {
+    _classCallCheck(this, NameOrNumberTree);
+
+    if (this.constructor === NameOrNumberTree) {
+      (0, _util.unreachable)('Cannot initialize NameOrNumberTree.');
+    }
+    this.root = root;
+    this.xref = xref;
+    this._type = type;
+  }
+
+  _createClass(NameOrNumberTree, [{
+    key: 'getAll',
+    value: function getAll() {
+      var dict = Object.create(null);
+      if (!this.root) {
+        return dict;
+      }
+      var xref = this.xref;
+      var processed = new _primitives.RefSet();
+      processed.put(this.root);
+      var queue = [this.root];
+      while (queue.length > 0) {
+        var obj = xref.fetchIfRef(queue.shift());
+        if (!(0, _primitives.isDict)(obj)) {
+          continue;
+        }
+        if (obj.has('Kids')) {
+          var _kids = obj.get('Kids');
+          for (var i = 0, ii = _kids.length; i < ii; i++) {
+            var kid = _kids[i];
+            if (processed.has(kid)) {
+              throw new _util.FormatError('Duplicate entry in "' + this._type + '" tree.');
+            }
+            queue.push(kid);
+            processed.put(kid);
+          }
+          continue;
+        }
+        var entries = obj.get(this._type);
+        if (Array.isArray(entries)) {
+          for (var _i2 = 0, _ii = entries.length; _i2 < _ii; _i2 += 2) {
+            dict[xref.fetchIfRef(entries[_i2])] = xref.fetchIfRef(entries[_i2 + 1]);
+          }
+        }
+      }
+      return dict;
+    }
+  }, {
+    key: 'get',
+    value: function get(key) {
+      if (!this.root) {
+        return null;
+      }
+      var xref = this.xref;
+      var kidsOrEntries = xref.fetchIfRef(this.root);
+      var loopCount = 0;
+      var MAX_LEVELS = 10;
+      while (kidsOrEntries.has('Kids')) {
+        if (++loopCount > MAX_LEVELS) {
+          (0, _util.warn)('Search depth limit reached for "' + this._type + '" tree.');
+          return null;
+        }
+        var _kids2 = kidsOrEntries.get('Kids');
+        if (!Array.isArray(_kids2)) {
+          return null;
+        }
+        var l = 0,
+            r = _kids2.length - 1;
+        while (l <= r) {
+          var m = l + r >> 1;
+          var kid = xref.fetchIfRef(_kids2[m]);
+          var limits = kid.get('Limits');
+          if (key < xref.fetchIfRef(limits[0])) {
+            r = m - 1;
+          } else if (key > xref.fetchIfRef(limits[1])) {
+            l = m + 1;
+          } else {
+            kidsOrEntries = xref.fetchIfRef(_kids2[m]);
+            break;
+          }
+        }
+        if (l > r) {
+          return null;
+        }
+      }
+      var entries = kidsOrEntries.get(this._type);
+      if (Array.isArray(entries)) {
+        var _l = 0,
+            _r = entries.length - 2;
+        while (_l <= _r) {
+          var _m = _l + _r & ~1;
+          var currentKey = xref.fetchIfRef(entries[_m]);
+          if (key < currentKey) {
+            _r = _m - 2;
+          } else if (key > currentKey) {
+            _l = _m + 2;
+          } else {
+            return xref.fetchIfRef(entries[_m + 1]);
+          }
+        }
+      }
+      return null;
+    }
+  }]);
+
+  return NameOrNumberTree;
+}();
+
+var NameTree = function (_NameOrNumberTree) {
+  _inherits(NameTree, _NameOrNumberTree);
+
+  function NameTree(root, xref) {
+    _classCallCheck(this, NameTree);
+
+    return _possibleConstructorReturn(this, (NameTree.__proto__ || Object.getPrototypeOf(NameTree)).call(this, root, xref, 'Names'));
+  }
+
+  return NameTree;
+}(NameOrNumberTree);
+
+var NumberTree = function (_NameOrNumberTree2) {
+  _inherits(NumberTree, _NameOrNumberTree2);
+
+  function NumberTree(root, xref) {
+    _classCallCheck(this, NumberTree);
+
+    return _possibleConstructorReturn(this, (NumberTree.__proto__ || Object.getPrototypeOf(NumberTree)).call(this, root, xref, 'Nums'));
+  }
+
+  return NumberTree;
+}(NameOrNumberTree);
+
+var FileSpec = function FileSpecClosure() {
+  function FileSpec(root, xref) {
+    if (!root || !(0, _primitives.isDict)(root)) {
+      return;
+    }
+    this.xref = xref;
+    this.root = root;
+    if (root.has('FS')) {
+      this.fs = root.get('FS');
+    }
+    this.description = root.has('Desc') ? (0, _util.stringToPDFString)(root.get('Desc')) : '';
+    if (root.has('RF')) {
+      (0, _util.warn)('Related file specifications are not supported');
+    }
+    this.contentAvailable = true;
+    if (!root.has('EF')) {
+      this.contentAvailable = false;
+      (0, _util.warn)('Non-embedded file specifications are not supported');
+    }
+  }
+  function pickPlatformItem(dict) {
+    if (dict.has('UF')) {
+      return dict.get('UF');
+    } else if (dict.has('F')) {
+      return dict.get('F');
+    } else if (dict.has('Unix')) {
+      return dict.get('Unix');
+    } else if (dict.has('Mac')) {
+      return dict.get('Mac');
+    } else if (dict.has('DOS')) {
+      return dict.get('DOS');
+    }
+    return null;
+  }
+  FileSpec.prototype = {
+    get filename() {
+      if (!this._filename && this.root) {
+        var filename = pickPlatformItem(this.root) || 'unnamed';
+        this._filename = (0, _util.stringToPDFString)(filename).replace(/\\\\/g, '\\').replace(/\\\//g, '/').replace(/\\/g, '/');
+      }
+      return this._filename;
+    },
+    get content() {
+      if (!this.contentAvailable) {
+        return null;
+      }
+      if (!this.contentRef && this.root) {
+        this.contentRef = pickPlatformItem(this.root.get('EF'));
+      }
+      var content = null;
+      if (this.contentRef) {
+        var xref = this.xref;
+        var fileObj = xref.fetchIfRef(this.contentRef);
+        if (fileObj && (0, _primitives.isStream)(fileObj)) {
+          content = fileObj.getBytes();
+        } else {
+          (0, _util.warn)('Embedded file specification points to non-existing/invalid ' + 'content');
+        }
+      } else {
+        (0, _util.warn)('Embedded file specification does not have a content');
+      }
+      return content;
+    },
+    get serializable() {
+      return {
+        filename: this.filename,
+        content: this.content
+      };
+    }
+  };
+  return FileSpec;
+}();
+var ObjectLoader = function () {
+  function mayHaveChildren(value) {
+    return (0, _primitives.isRef)(value) || (0, _primitives.isDict)(value) || Array.isArray(value) || (0, _primitives.isStream)(value);
+  }
+  function addChildren(node, nodesToVisit) {
+    if ((0, _primitives.isDict)(node) || (0, _primitives.isStream)(node)) {
+      var dict = (0, _primitives.isDict)(node) ? node : node.dict;
+      var dictKeys = dict.getKeys();
+      for (var i = 0, ii = dictKeys.length; i < ii; i++) {
+        var rawValue = dict.getRaw(dictKeys[i]);
+        if (mayHaveChildren(rawValue)) {
+          nodesToVisit.push(rawValue);
+        }
+      }
+    } else if (Array.isArray(node)) {
+      for (var _i3 = 0, _ii2 = node.length; _i3 < _ii2; _i3++) {
+        var value = node[_i3];
+        if (mayHaveChildren(value)) {
+          nodesToVisit.push(value);
+        }
+      }
+    }
+  }
+  function ObjectLoader(dict, keys, xref) {
+    this.dict = dict;
+    this.keys = keys;
+    this.xref = xref;
+    this.refSet = null;
+    this.capability = null;
+  }
+  ObjectLoader.prototype = {
+    load: function load() {
+      this.capability = (0, _util.createPromiseCapability)();
+      if (!(this.xref.stream instanceof _chunked_stream.ChunkedStream) || this.xref.stream.getMissingChunks().length === 0) {
+        this.capability.resolve();
+        return this.capability.promise;
+      }
+      var keys = this.keys,
+          dict = this.dict;
+
+      this.refSet = new _primitives.RefSet();
+      var nodesToVisit = [];
+      for (var i = 0, ii = keys.length; i < ii; i++) {
+        var rawValue = dict.getRaw(keys[i]);
+        if (rawValue !== undefined) {
+          nodesToVisit.push(rawValue);
+        }
+      }
+      this._walk(nodesToVisit);
+      return this.capability.promise;
+    },
+    _walk: function _walk(nodesToVisit) {
+      var _this4 = this;
+
+      var nodesToRevisit = [];
+      var pendingRequests = [];
+      while (nodesToVisit.length) {
+        var _currentNode = nodesToVisit.pop();
+        if ((0, _primitives.isRef)(_currentNode)) {
+          if (this.refSet.has(_currentNode)) {
+            continue;
+          }
+          try {
+            this.refSet.put(_currentNode);
+            _currentNode = this.xref.fetch(_currentNode);
+          } catch (ex) {
+            if (!(ex instanceof _util.MissingDataException)) {
+              throw ex;
+            }
+            nodesToRevisit.push(_currentNode);
+            pendingRequests.push({
+              begin: ex.begin,
+              end: ex.end
+            });
+          }
+        }
+        if (_currentNode && _currentNode.getBaseStreams) {
+          var baseStreams = _currentNode.getBaseStreams();
+          var foundMissingData = false;
+          for (var i = 0, ii = baseStreams.length; i < ii; i++) {
+            var stream = baseStreams[i];
+            if (stream.getMissingChunks && stream.getMissingChunks().length) {
+              foundMissingData = true;
+              pendingRequests.push({
+                begin: stream.start,
+                end: stream.end
+              });
+            }
+          }
+          if (foundMissingData) {
+            nodesToRevisit.push(_currentNode);
+          }
+        }
+        addChildren(_currentNode, nodesToVisit);
+      }
+      if (pendingRequests.length) {
+        this.xref.stream.manager.requestRanges(pendingRequests).then(function () {
+          for (var _i4 = 0, _ii3 = nodesToRevisit.length; _i4 < _ii3; _i4++) {
+            var node = nodesToRevisit[_i4];
+            if ((0, _primitives.isRef)(node)) {
+              _this4.refSet.remove(node);
+            }
+          }
+          _this4._walk(nodesToRevisit);
+        }, this.capability.reject);
+        return;
+      }
+      this.refSet = null;
+      this.capability.resolve();
+    }
+  };
+  return ObjectLoader;
+}();
+exports.Catalog = Catalog;
+exports.ObjectLoader = ObjectLoader;
+exports.XRef = XRef;
+exports.FileSpec = FileSpec;
+
+/***/ }),
+/* 138 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+var EOF = {};
+var Name = function NameClosure() {
+  function Name(name) {
+    this.name = name;
+  }
+  Name.prototype = {};
+  var nameCache = Object.create(null);
+  Name.get = function Name_get(name) {
+    var nameValue = nameCache[name];
+    return nameValue ? nameValue : nameCache[name] = new Name(name);
+  };
+  return Name;
+}();
+var Cmd = function CmdClosure() {
+  function Cmd(cmd) {
+    this.cmd = cmd;
+  }
+  Cmd.prototype = {};
+  var cmdCache = Object.create(null);
+  Cmd.get = function Cmd_get(cmd) {
+    var cmdValue = cmdCache[cmd];
+    return cmdValue ? cmdValue : cmdCache[cmd] = new Cmd(cmd);
+  };
+  return Cmd;
+}();
+var Dict = function DictClosure() {
+  var nonSerializable = function nonSerializableClosure() {
+    return nonSerializable;
+  };
+  function Dict(xref) {
+    this._map = Object.create(null);
+    this.xref = xref;
+    this.objId = null;
+    this.suppressEncryption = false;
+    this.__nonSerializable__ = nonSerializable;
+  }
+  Dict.prototype = {
+    assignXref: function Dict_assignXref(newXref) {
+      this.xref = newXref;
+    },
+    get: function Dict_get(key1, key2, key3) {
+      var value;
+      var xref = this.xref,
+          suppressEncryption = this.suppressEncryption;
+      if (typeof (value = this._map[key1]) !== 'undefined' || key1 in this._map || typeof key2 === 'undefined') {
+        return xref ? xref.fetchIfRef(value, suppressEncryption) : value;
+      }
+      if (typeof (value = this._map[key2]) !== 'undefined' || key2 in this._map || typeof key3 === 'undefined') {
+        return xref ? xref.fetchIfRef(value, suppressEncryption) : value;
+      }
+      value = this._map[key3] || null;
+      return xref ? xref.fetchIfRef(value, suppressEncryption) : value;
+    },
+    getAsync: function Dict_getAsync(key1, key2, key3) {
+      var value;
+      var xref = this.xref,
+          suppressEncryption = this.suppressEncryption;
+      if (typeof (value = this._map[key1]) !== 'undefined' || key1 in this._map || typeof key2 === 'undefined') {
+        if (xref) {
+          return xref.fetchIfRefAsync(value, suppressEncryption);
+        }
+        return Promise.resolve(value);
+      }
+      if (typeof (value = this._map[key2]) !== 'undefined' || key2 in this._map || typeof key3 === 'undefined') {
+        if (xref) {
+          return xref.fetchIfRefAsync(value, suppressEncryption);
+        }
+        return Promise.resolve(value);
+      }
+      value = this._map[key3] || null;
+      if (xref) {
+        return xref.fetchIfRefAsync(value, suppressEncryption);
+      }
+      return Promise.resolve(value);
+    },
+    getArray: function Dict_getArray(key1, key2, key3) {
+      var value = this.get(key1, key2, key3);
+      var xref = this.xref,
+          suppressEncryption = this.suppressEncryption;
+      if (!Array.isArray(value) || !xref) {
+        return value;
+      }
+      value = value.slice();
+      for (var i = 0, ii = value.length; i < ii; i++) {
+        if (!isRef(value[i])) {
+          continue;
+        }
+        value[i] = xref.fetch(value[i], suppressEncryption);
+      }
+      return value;
+    },
+    getRaw: function Dict_getRaw(key) {
+      return this._map[key];
+    },
+    getKeys: function Dict_getKeys() {
+      return Object.keys(this._map);
+    },
+    set: function Dict_set(key, value) {
+      this._map[key] = value;
+    },
+    has: function Dict_has(key) {
+      return key in this._map;
+    },
+    forEach: function Dict_forEach(callback) {
+      for (var key in this._map) {
+        callback(key, this.get(key));
+      }
+    }
+  };
+  Dict.empty = new Dict(null);
+  Dict.merge = function (xref, dictArray) {
+    var mergedDict = new Dict(xref);
+    for (var i = 0, ii = dictArray.length; i < ii; i++) {
+      var dict = dictArray[i];
+      if (!isDict(dict)) {
+        continue;
+      }
+      for (var keyName in dict._map) {
+        if (mergedDict._map[keyName] !== undefined) {
+          continue;
+        }
+        mergedDict._map[keyName] = dict._map[keyName];
+      }
+    }
+    return mergedDict;
+  };
+  return Dict;
+}();
+var Ref = function RefClosure() {
+  function Ref(num, gen) {
+    this.num = num;
+    this.gen = gen;
+  }
+  Ref.prototype = {
+    toString: function Ref_toString() {
+      var str = this.num + 'R';
+      if (this.gen !== 0) {
+        str += this.gen;
+      }
+      return str;
+    }
+  };
+  return Ref;
+}();
+var RefSet = function RefSetClosure() {
+  function RefSet() {
+    this.dict = Object.create(null);
+  }
+  RefSet.prototype = {
+    has: function RefSet_has(ref) {
+      return ref.toString() in this.dict;
+    },
+    put: function RefSet_put(ref) {
+      this.dict[ref.toString()] = true;
+    },
+    remove: function RefSet_remove(ref) {
+      delete this.dict[ref.toString()];
+    }
+  };
+  return RefSet;
+}();
+var RefSetCache = function RefSetCacheClosure() {
+  function RefSetCache() {
+    this.dict = Object.create(null);
+  }
+  RefSetCache.prototype = {
+    get: function RefSetCache_get(ref) {
+      return this.dict[ref.toString()];
+    },
+    has: function RefSetCache_has(ref) {
+      return ref.toString() in this.dict;
+    },
+    put: function RefSetCache_put(ref, obj) {
+      this.dict[ref.toString()] = obj;
+    },
+    putAlias: function RefSetCache_putAlias(ref, aliasRef) {
+      this.dict[ref.toString()] = this.get(aliasRef);
+    },
+    forEach: function RefSetCache_forEach(fn, thisArg) {
+      for (var i in this.dict) {
+        fn.call(thisArg, this.dict[i]);
+      }
+    },
+    clear: function RefSetCache_clear() {
+      this.dict = Object.create(null);
+    }
+  };
+  return RefSetCache;
+}();
+function isEOF(v) {
+  return v === EOF;
+}
+function isName(v, name) {
+  return v instanceof Name && (name === undefined || v.name === name);
+}
+function isCmd(v, cmd) {
+  return v instanceof Cmd && (cmd === undefined || v.cmd === cmd);
+}
+function isDict(v, type) {
+  return v instanceof Dict && (type === undefined || isName(v.get('Type'), type));
+}
+function isRef(v) {
+  return v instanceof Ref;
+}
+function isRefsEqual(v1, v2) {
+  return v1.num === v2.num && v1.gen === v2.gen;
+}
+function isStream(v) {
+  return (typeof v === 'undefined' ? 'undefined' : _typeof(v)) === 'object' && v !== null && v.getBytes !== undefined;
+}
+exports.EOF = EOF;
+exports.Cmd = Cmd;
+exports.Dict = Dict;
+exports.Name = Name;
+exports.Ref = Ref;
+exports.RefSet = RefSet;
+exports.RefSetCache = RefSetCache;
+exports.isEOF = isEOF;
+exports.isCmd = isCmd;
+exports.isDict = isDict;
+exports.isName = isName;
+exports.isRef = isRef;
+exports.isRefsEqual = isRefsEqual;
+exports.isStream = isStream;
+
+/***/ }),
+/* 139 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.Parser = exports.Linearization = exports.Lexer = undefined;
+
+var _stream = __w_pdfjs_require__(140);
+
+var _util = __w_pdfjs_require__(2);
+
+var _primitives = __w_pdfjs_require__(138);
+
+var _ccitt_stream = __w_pdfjs_require__(141);
+
+var _jbig2_stream = __w_pdfjs_require__(143);
+
+var _jpeg_stream = __w_pdfjs_require__(146);
+
+var _jpx_stream = __w_pdfjs_require__(148);
+
+var MAX_LENGTH_TO_CACHE = 1000;
+var MAX_ADLER32_LENGTH = 5552;
+function computeAdler32(bytes) {
+  var bytesLength = bytes.length;
+  var a = 1,
+      b = 0;
+  for (var i = 0; i < bytesLength; ++i) {
+    a += bytes[i] & 0xFF;
+    b += a;
+  }
+  return b % 65521 << 16 | a % 65521;
+}
+var Parser = function ParserClosure() {
+  function Parser(lexer, allowStreams, xref, recoveryMode) {
+    this.lexer = lexer;
+    this.allowStreams = allowStreams;
+    this.xref = xref;
+    this.recoveryMode = recoveryMode || false;
+    this.imageCache = Object.create(null);
+    this.refill();
+  }
+  Parser.prototype = {
+    refill: function Parser_refill() {
+      this.buf1 = this.lexer.getObj();
+      this.buf2 = this.lexer.getObj();
+    },
+    shift: function Parser_shift() {
+      if ((0, _primitives.isCmd)(this.buf2, 'ID')) {
+        this.buf1 = this.buf2;
+        this.buf2 = null;
+      } else {
+        this.buf1 = this.buf2;
+        this.buf2 = this.lexer.getObj();
+      }
+    },
+    tryShift: function Parser_tryShift() {
+      try {
+        this.shift();
+        return true;
+      } catch (e) {
+        if (e instanceof _util.MissingDataException) {
+          throw e;
+        }
+        return false;
+      }
+    },
+    getObj: function Parser_getObj(cipherTransform) {
+      var buf1 = this.buf1;
+      this.shift();
+      if (buf1 instanceof _primitives.Cmd) {
+        switch (buf1.cmd) {
+          case 'BI':
+            return this.makeInlineImage(cipherTransform);
+          case '[':
+            var array = [];
+            while (!(0, _primitives.isCmd)(this.buf1, ']') && !(0, _primitives.isEOF)(this.buf1)) {
+              array.push(this.getObj(cipherTransform));
+            }
+            if ((0, _primitives.isEOF)(this.buf1)) {
+              if (!this.recoveryMode) {
+                throw new _util.FormatError('End of file inside array');
+              }
+              return array;
+            }
+            this.shift();
+            return array;
+          case '<<':
+            var dict = new _primitives.Dict(this.xref);
+            while (!(0, _primitives.isCmd)(this.buf1, '>>') && !(0, _primitives.isEOF)(this.buf1)) {
+              if (!(0, _primitives.isName)(this.buf1)) {
+                (0, _util.info)('Malformed dictionary: key must be a name object');
+                this.shift();
+                continue;
+              }
+              var key = this.buf1.name;
+              this.shift();
+              if ((0, _primitives.isEOF)(this.buf1)) {
+                break;
+              }
+              dict.set(key, this.getObj(cipherTransform));
+            }
+            if ((0, _primitives.isEOF)(this.buf1)) {
+              if (!this.recoveryMode) {
+                throw new _util.FormatError('End of file inside dictionary');
+              }
+              return dict;
+            }
+            if ((0, _primitives.isCmd)(this.buf2, 'stream')) {
+              return this.allowStreams ? this.makeStream(dict, cipherTransform) : dict;
+            }
+            this.shift();
+            return dict;
+          default:
+            return buf1;
+        }
+      }
+      if (Number.isInteger(buf1)) {
+        var num = buf1;
+        if (Number.isInteger(this.buf1) && (0, _primitives.isCmd)(this.buf2, 'R')) {
+          var ref = new _primitives.Ref(num, this.buf1);
+          this.shift();
+          this.shift();
+          return ref;
+        }
+        return num;
+      }
+      if ((0, _util.isString)(buf1)) {
+        var str = buf1;
+        if (cipherTransform) {
+          str = cipherTransform.decryptString(str);
+        }
+        return str;
+      }
+      return buf1;
+    },
+    findDefaultInlineStreamEnd: function findDefaultInlineStreamEnd(stream) {
+      var E = 0x45,
+          I = 0x49,
+          SPACE = 0x20,
+          LF = 0xA,
+          CR = 0xD;
+      var n = 10,
+          NUL = 0x0;
+      var startPos = stream.pos,
+          state = 0,
+          ch = void 0,
+          maybeEIPos = void 0;
+      while ((ch = stream.getByte()) !== -1) {
+        if (state === 0) {
+          state = ch === E ? 1 : 0;
+        } else if (state === 1) {
+          state = ch === I ? 2 : 0;
+        } else {
+          (0, _util.assert)(state === 2);
+          if (ch === SPACE || ch === LF || ch === CR) {
+            maybeEIPos = stream.pos;
+            var followingBytes = stream.peekBytes(n);
+            for (var i = 0, ii = followingBytes.length; i < ii; i++) {
+              ch = followingBytes[i];
+              if (ch === NUL && followingBytes[i + 1] !== NUL) {
+                continue;
+              }
+              if (ch !== LF && ch !== CR && (ch < SPACE || ch > 0x7F)) {
+                state = 0;
+                break;
+              }
+            }
+            if (state === 2) {
+              break;
+            }
+          } else {
+            state = 0;
+          }
+        }
+      }
+      if (ch === -1) {
+        (0, _util.warn)('findDefaultInlineStreamEnd: ' + 'Reached the end of the stream without finding a valid EI marker');
+        if (maybeEIPos) {
+          (0, _util.warn)('... trying to recover by using the last "EI" occurrence.');
+          stream.skip(-(stream.pos - maybeEIPos));
+        }
+      }
+      return stream.pos - 4 - startPos;
+    },
+
+    findDCTDecodeInlineStreamEnd: function Parser_findDCTDecodeInlineStreamEnd(stream) {
+      var startPos = stream.pos,
+          foundEOI = false,
+          b,
+          markerLength,
+          length;
+      while ((b = stream.getByte()) !== -1) {
+        if (b !== 0xFF) {
+          continue;
+        }
+        switch (stream.getByte()) {
+          case 0x00:
+            break;
+          case 0xFF:
+            stream.skip(-1);
+            break;
+          case 0xD9:
+            foundEOI = true;
+            break;
+          case 0xC0:
+          case 0xC1:
+          case 0xC2:
+          case 0xC3:
+          case 0xC5:
+          case 0xC6:
+          case 0xC7:
+          case 0xC9:
+          case 0xCA:
+          case 0xCB:
+          case 0xCD:
+          case 0xCE:
+          case 0xCF:
+          case 0xC4:
+          case 0xCC:
+          case 0xDA:
+          case 0xDB:
+          case 0xDC:
+          case 0xDD:
+          case 0xDE:
+          case 0xDF:
+          case 0xE0:
+          case 0xE1:
+          case 0xE2:
+          case 0xE3:
+          case 0xE4:
+          case 0xE5:
+          case 0xE6:
+          case 0xE7:
+          case 0xE8:
+          case 0xE9:
+          case 0xEA:
+          case 0xEB:
+          case 0xEC:
+          case 0xED:
+          case 0xEE:
+          case 0xEF:
+          case 0xFE:
+            markerLength = stream.getUint16();
+            if (markerLength > 2) {
+              stream.skip(markerLength - 2);
+            } else {
+              stream.skip(-2);
+            }
+            break;
+        }
+        if (foundEOI) {
+          break;
+        }
+      }
+      length = stream.pos - startPos;
+      if (b === -1) {
+        (0, _util.warn)('Inline DCTDecode image stream: ' + 'EOI marker not found, searching for /EI/ instead.');
+        stream.skip(-length);
+        return this.findDefaultInlineStreamEnd(stream);
+      }
+      this.inlineStreamSkipEI(stream);
+      return length;
+    },
+    findASCII85DecodeInlineStreamEnd: function Parser_findASCII85DecodeInlineStreamEnd(stream) {
+      var TILDE = 0x7E,
+          GT = 0x3E;
+      var startPos = stream.pos,
+          ch,
+          length;
+      while ((ch = stream.getByte()) !== -1) {
+        if (ch === TILDE && stream.peekByte() === GT) {
+          stream.skip();
+          break;
+        }
+      }
+      length = stream.pos - startPos;
+      if (ch === -1) {
+        (0, _util.warn)('Inline ASCII85Decode image stream: ' + 'EOD marker not found, searching for /EI/ instead.');
+        stream.skip(-length);
+        return this.findDefaultInlineStreamEnd(stream);
+      }
+      this.inlineStreamSkipEI(stream);
+      return length;
+    },
+    findASCIIHexDecodeInlineStreamEnd: function Parser_findASCIIHexDecodeInlineStreamEnd(stream) {
+      var GT = 0x3E;
+      var startPos = stream.pos,
+          ch,
+          length;
+      while ((ch = stream.getByte()) !== -1) {
+        if (ch === GT) {
+          break;
+        }
+      }
+      length = stream.pos - startPos;
+      if (ch === -1) {
+        (0, _util.warn)('Inline ASCIIHexDecode image stream: ' + 'EOD marker not found, searching for /EI/ instead.');
+        stream.skip(-length);
+        return this.findDefaultInlineStreamEnd(stream);
+      }
+      this.inlineStreamSkipEI(stream);
+      return length;
+    },
+    inlineStreamSkipEI: function Parser_inlineStreamSkipEI(stream) {
+      var E = 0x45,
+          I = 0x49;
+      var state = 0,
+          ch;
+      while ((ch = stream.getByte()) !== -1) {
+        if (state === 0) {
+          state = ch === E ? 1 : 0;
+        } else if (state === 1) {
+          state = ch === I ? 2 : 0;
+        } else if (state === 2) {
+          break;
+        }
+      }
+    },
+    makeInlineImage: function Parser_makeInlineImage(cipherTransform) {
+      var lexer = this.lexer;
+      var stream = lexer.stream;
+      var dict = new _primitives.Dict(this.xref),
+          dictLength = void 0;
+      while (!(0, _primitives.isCmd)(this.buf1, 'ID') && !(0, _primitives.isEOF)(this.buf1)) {
+        if (!(0, _primitives.isName)(this.buf1)) {
+          throw new _util.FormatError('Dictionary key must be a name object');
+        }
+        var key = this.buf1.name;
+        this.shift();
+        if ((0, _primitives.isEOF)(this.buf1)) {
+          break;
+        }
+        dict.set(key, this.getObj(cipherTransform));
+      }
+      if (lexer.beginInlineImagePos !== -1) {
+        dictLength = stream.pos - lexer.beginInlineImagePos;
+      }
+      var filter = dict.get('Filter', 'F'),
+          filterName;
+      if ((0, _primitives.isName)(filter)) {
+        filterName = filter.name;
+      } else if (Array.isArray(filter)) {
+        var filterZero = this.xref.fetchIfRef(filter[0]);
+        if ((0, _primitives.isName)(filterZero)) {
+          filterName = filterZero.name;
+        }
+      }
+      var startPos = stream.pos,
+          length = void 0;
+      if (filterName === 'DCTDecode' || filterName === 'DCT') {
+        length = this.findDCTDecodeInlineStreamEnd(stream);
+      } else if (filterName === 'ASCII85Decode' || filterName === 'A85') {
+        length = this.findASCII85DecodeInlineStreamEnd(stream);
+      } else if (filterName === 'ASCIIHexDecode' || filterName === 'AHx') {
+        length = this.findASCIIHexDecodeInlineStreamEnd(stream);
+      } else {
+        length = this.findDefaultInlineStreamEnd(stream);
+      }
+      var imageStream = stream.makeSubStream(startPos, length, dict);
+      var cacheKey = void 0;
+      if (length < MAX_LENGTH_TO_CACHE && dictLength < MAX_ADLER32_LENGTH) {
+        var imageBytes = imageStream.getBytes();
+        imageStream.reset();
+        var initialStreamPos = stream.pos;
+        stream.pos = lexer.beginInlineImagePos;
+        var dictBytes = stream.getBytes(dictLength);
+        stream.pos = initialStreamPos;
+        cacheKey = computeAdler32(imageBytes) + '_' + computeAdler32(dictBytes);
+        var cacheEntry = this.imageCache[cacheKey];
+        if (cacheEntry !== undefined) {
+          this.buf2 = _primitives.Cmd.get('EI');
+          this.shift();
+          cacheEntry.reset();
+          return cacheEntry;
+        }
+      }
+      if (cipherTransform) {
+        imageStream = cipherTransform.createStream(imageStream, length);
+      }
+      imageStream = this.filter(imageStream, dict, length);
+      imageStream.dict = dict;
+      if (cacheKey !== undefined) {
+        imageStream.cacheKey = 'inline_' + length + '_' + cacheKey;
+        this.imageCache[cacheKey] = imageStream;
+      }
+      this.buf2 = _primitives.Cmd.get('EI');
+      this.shift();
+      return imageStream;
+    },
+    _findStreamLength: function _findStreamLength(startPos, signature) {
+      var stream = this.lexer.stream;
+
+      stream.pos = startPos;
+      var SCAN_BLOCK_LENGTH = 2048;
+      var signatureLength = signature.length;
+      while (stream.pos < stream.end) {
+        var scanBytes = stream.peekBytes(SCAN_BLOCK_LENGTH);
+        var scanLength = scanBytes.length - signatureLength;
+        if (scanLength <= 0) {
+          break;
+        }
+        var pos = 0;
+        while (pos < scanLength) {
+          var j = 0;
+          while (j < signatureLength && scanBytes[pos + j] === signature[j]) {
+            j++;
+          }
+          if (j >= signatureLength) {
+            stream.pos += pos;
+            return stream.pos - startPos;
+          }
+          pos++;
+        }
+        stream.pos += scanLength;
+      }
+      return -1;
+    },
+
+    makeStream: function Parser_makeStream(dict, cipherTransform) {
+      var lexer = this.lexer;
+      var stream = lexer.stream;
+      lexer.skipToNextLine();
+      var startPos = stream.pos - 1;
+      var length = dict.get('Length');
+      if (!Number.isInteger(length)) {
+        (0, _util.info)('Bad ' + length + ' attribute in stream');
+        length = 0;
+      }
+      stream.pos = startPos + length;
+      lexer.nextChar();
+      if (this.tryShift() && (0, _primitives.isCmd)(this.buf2, 'endstream')) {
+        this.shift();
+      } else {
+        var ENDSTREAM_SIGNATURE = new Uint8Array([0x65, 0x6E, 0x64, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6D]);
+        var actualLength = this._findStreamLength(startPos, ENDSTREAM_SIGNATURE);
+        if (actualLength < 0) {
+          var MAX_TRUNCATION = 1;
+          for (var i = 1; i <= MAX_TRUNCATION; i++) {
+            var end = ENDSTREAM_SIGNATURE.length - i;
+            var TRUNCATED_SIGNATURE = ENDSTREAM_SIGNATURE.slice(0, end);
+            var maybeLength = this._findStreamLength(startPos, TRUNCATED_SIGNATURE);
+            if (maybeLength >= 0) {
+              var lastByte = stream.peekBytes(end + 1)[end];
+              if (!(0, _util.isSpace)(lastByte)) {
+                break;
+              }
+              (0, _util.info)('Found "' + (0, _util.bytesToString)(TRUNCATED_SIGNATURE) + '" when ' + 'searching for endstream command.');
+              actualLength = maybeLength;
+              break;
+            }
+          }
+          if (actualLength < 0) {
+            throw new _util.FormatError('Missing endstream command.');
+          }
+        }
+        length = actualLength;
+        lexer.nextChar();
+        this.shift();
+        this.shift();
+      }
+      this.shift();
+      stream = stream.makeSubStream(startPos, length, dict);
+      if (cipherTransform) {
+        stream = cipherTransform.createStream(stream, length);
+      }
+      stream = this.filter(stream, dict, length);
+      stream.dict = dict;
+      return stream;
+    },
+    filter: function Parser_filter(stream, dict, length) {
+      var filter = dict.get('Filter', 'F');
+      var params = dict.get('DecodeParms', 'DP');
+      if ((0, _primitives.isName)(filter)) {
+        if (Array.isArray(params)) {
+          (0, _util.warn)('/DecodeParms should not contain an Array, ' + 'when /Filter contains a Name.');
+        }
+        return this.makeFilter(stream, filter.name, length, params);
+      }
+      var maybeLength = length;
+      if (Array.isArray(filter)) {
+        var filterArray = filter;
+        var paramsArray = params;
+        for (var i = 0, ii = filterArray.length; i < ii; ++i) {
+          filter = this.xref.fetchIfRef(filterArray[i]);
+          if (!(0, _primitives.isName)(filter)) {
+            throw new _util.FormatError('Bad filter name: ' + filter);
+          }
+          params = null;
+          if (Array.isArray(paramsArray) && i in paramsArray) {
+            params = this.xref.fetchIfRef(paramsArray[i]);
+          }
+          stream = this.makeFilter(stream, filter.name, maybeLength, params);
+          maybeLength = null;
+        }
+      }
+      return stream;
+    },
+    makeFilter: function Parser_makeFilter(stream, name, maybeLength, params) {
+      if (maybeLength === 0) {
+        (0, _util.warn)('Empty "' + name + '" stream.');
+        return new _stream.NullStream();
+      }
+      try {
+        var xrefStreamStats = this.xref.stats.streamTypes;
+        if (name === 'FlateDecode' || name === 'Fl') {
+          xrefStreamStats[_util.StreamType.FLATE] = true;
+          if (params) {
+            return new _stream.PredictorStream(new _stream.FlateStream(stream, maybeLength), maybeLength, params);
+          }
+          return new _stream.FlateStream(stream, maybeLength);
+        }
+        if (name === 'LZWDecode' || name === 'LZW') {
+          xrefStreamStats[_util.StreamType.LZW] = true;
+          var earlyChange = 1;
+          if (params) {
+            if (params.has('EarlyChange')) {
+              earlyChange = params.get('EarlyChange');
+            }
+            return new _stream.PredictorStream(new _stream.LZWStream(stream, maybeLength, earlyChange), maybeLength, params);
+          }
+          return new _stream.LZWStream(stream, maybeLength, earlyChange);
+        }
+        if (name === 'DCTDecode' || name === 'DCT') {
+          xrefStreamStats[_util.StreamType.DCT] = true;
+          return new _jpeg_stream.JpegStream(stream, maybeLength, stream.dict, params);
+        }
+        if (name === 'JPXDecode' || name === 'JPX') {
+          xrefStreamStats[_util.StreamType.JPX] = true;
+          return new _jpx_stream.JpxStream(stream, maybeLength, stream.dict, params);
+        }
+        if (name === 'ASCII85Decode' || name === 'A85') {
+          xrefStreamStats[_util.StreamType.A85] = true;
+          return new _stream.Ascii85Stream(stream, maybeLength);
+        }
+        if (name === 'ASCIIHexDecode' || name === 'AHx') {
+          xrefStreamStats[_util.StreamType.AHX] = true;
+          return new _stream.AsciiHexStream(stream, maybeLength);
+        }
+        if (name === 'CCITTFaxDecode' || name === 'CCF') {
+          xrefStreamStats[_util.StreamType.CCF] = true;
+          return new _ccitt_stream.CCITTFaxStream(stream, maybeLength, params);
+        }
+        if (name === 'RunLengthDecode' || name === 'RL') {
+          xrefStreamStats[_util.StreamType.RL] = true;
+          return new _stream.RunLengthStream(stream, maybeLength);
+        }
+        if (name === 'JBIG2Decode') {
+          xrefStreamStats[_util.StreamType.JBIG] = true;
+          return new _jbig2_stream.Jbig2Stream(stream, maybeLength, stream.dict, params);
+        }
+        (0, _util.warn)('filter "' + name + '" not supported yet');
+        return stream;
+      } catch (ex) {
+        if (ex instanceof _util.MissingDataException) {
+          throw ex;
+        }
+        (0, _util.warn)('Invalid stream: \"' + ex + '\"');
+        return new _stream.NullStream();
+      }
+    }
+  };
+  return Parser;
+}();
+var Lexer = function LexerClosure() {
+  function Lexer(stream, knownCommands) {
+    this.stream = stream;
+    this.nextChar();
+    this.strBuf = [];
+    this.knownCommands = knownCommands;
+    this.beginInlineImagePos = -1;
+  }
+  var specialChars = [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
+  function toHexDigit(ch) {
+    if (ch >= 0x30 && ch <= 0x39) {
+      return ch & 0x0F;
+    }
+    if (ch >= 0x41 && ch <= 0x46 || ch >= 0x61 && ch <= 0x66) {
+      return (ch & 0x0F) + 9;
+    }
+    return -1;
+  }
+  Lexer.prototype = {
+    nextChar: function Lexer_nextChar() {
+      return this.currentChar = this.stream.getByte();
+    },
+    peekChar: function Lexer_peekChar() {
+      return this.stream.peekByte();
+    },
+    getNumber: function Lexer_getNumber() {
+      var ch = this.currentChar;
+      var eNotation = false;
+      var divideBy = 0;
+      var sign = 0;
+      if (ch === 0x2D) {
+        sign = -1;
+        ch = this.nextChar();
+        if (ch === 0x2D) {
+          ch = this.nextChar();
+        }
+      } else if (ch === 0x2B) {
+        sign = 1;
+        ch = this.nextChar();
+      }
+      if (ch === 0x0A || ch === 0x0D) {
+        do {
+          ch = this.nextChar();
+        } while (ch === 0x0A || ch === 0x0D);
+      }
+      if (ch === 0x2E) {
+        divideBy = 10;
+        ch = this.nextChar();
+      }
+      if (ch < 0x30 || ch > 0x39) {
+        if (divideBy === 10 && sign === 0 && ((0, _util.isSpace)(ch) || ch === -1)) {
+          (0, _util.warn)('Lexer.getNumber - treating a single decimal point as zero.');
+          return 0;
+        }
+        throw new _util.FormatError('Invalid number: ' + String.fromCharCode(ch) + ' (charCode ' + ch + ')');
+      }
+      sign = sign || 1;
+      var baseValue = ch - 0x30;
+      var powerValue = 0;
+      var powerValueSign = 1;
+      while ((ch = this.nextChar()) >= 0) {
+        if (0x30 <= ch && ch <= 0x39) {
+          var currentDigit = ch - 0x30;
+          if (eNotation) {
+            powerValue = powerValue * 10 + currentDigit;
+          } else {
+            if (divideBy !== 0) {
+              divideBy *= 10;
+            }
+            baseValue = baseValue * 10 + currentDigit;
+          }
+        } else if (ch === 0x2E) {
+          if (divideBy === 0) {
+            divideBy = 1;
+          } else {
+            break;
+          }
+        } else if (ch === 0x2D) {
+          (0, _util.warn)('Badly formatted number');
+        } else if (ch === 0x45 || ch === 0x65) {
+          ch = this.peekChar();
+          if (ch === 0x2B || ch === 0x2D) {
+            powerValueSign = ch === 0x2D ? -1 : 1;
+            this.nextChar();
+          } else if (ch < 0x30 || ch > 0x39) {
+            break;
+          }
+          eNotation = true;
+        } else {
+          break;
+        }
+      }
+      if (divideBy !== 0) {
+        baseValue /= divideBy;
+      }
+      if (eNotation) {
+        baseValue *= Math.pow(10, powerValueSign * powerValue);
+      }
+      return sign * baseValue;
+    },
+    getString: function Lexer_getString() {
+      var numParen = 1;
+      var done = false;
+      var strBuf = this.strBuf;
+      strBuf.length = 0;
+      var ch = this.nextChar();
+      while (true) {
+        var charBuffered = false;
+        switch (ch | 0) {
+          case -1:
+            (0, _util.warn)('Unterminated string');
+            done = true;
+            break;
+          case 0x28:
+            ++numParen;
+            strBuf.push('(');
+            break;
+          case 0x29:
+            if (--numParen === 0) {
+              this.nextChar();
+              done = true;
+            } else {
+              strBuf.push(')');
+            }
+            break;
+          case 0x5C:
+            ch = this.nextChar();
+            switch (ch) {
+              case -1:
+                (0, _util.warn)('Unterminated string');
+                done = true;
+                break;
+              case 0x6E:
+                strBuf.push('\n');
+                break;
+              case 0x72:
+                strBuf.push('\r');
+                break;
+              case 0x74:
+                strBuf.push('\t');
+                break;
+              case 0x62:
+                strBuf.push('\b');
+                break;
+              case 0x66:
+                strBuf.push('\f');
+                break;
+              case 0x5C:
+              case 0x28:
+              case 0x29:
+                strBuf.push(String.fromCharCode(ch));
+                break;
+              case 0x30:
+              case 0x31:
+              case 0x32:
+              case 0x33:
+              case 0x34:
+              case 0x35:
+              case 0x36:
+              case 0x37:
+                var x = ch & 0x0F;
+                ch = this.nextChar();
+                charBuffered = true;
+                if (ch >= 0x30 && ch <= 0x37) {
+                  x = (x << 3) + (ch & 0x0F);
+                  ch = this.nextChar();
+                  if (ch >= 0x30 && ch <= 0x37) {
+                    charBuffered = false;
+                    x = (x << 3) + (ch & 0x0F);
+                  }
+                }
+                strBuf.push(String.fromCharCode(x));
+                break;
+              case 0x0D:
+                if (this.peekChar() === 0x0A) {
+                  this.nextChar();
+                }
+                break;
+              case 0x0A:
+                break;
+              default:
+                strBuf.push(String.fromCharCode(ch));
+                break;
+            }
+            break;
+          default:
+            strBuf.push(String.fromCharCode(ch));
+            break;
+        }
+        if (done) {
+          break;
+        }
+        if (!charBuffered) {
+          ch = this.nextChar();
+        }
+      }
+      return strBuf.join('');
+    },
+    getName: function Lexer_getName() {
+      var ch, previousCh;
+      var strBuf = this.strBuf;
+      strBuf.length = 0;
+      while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) {
+        if (ch === 0x23) {
+          ch = this.nextChar();
+          if (specialChars[ch]) {
+            (0, _util.warn)('Lexer_getName: ' + 'NUMBER SIGN (#) should be followed by a hexadecimal number.');
+            strBuf.push('#');
+            break;
+          }
+          var x = toHexDigit(ch);
+          if (x !== -1) {
+            previousCh = ch;
+            ch = this.nextChar();
+            var x2 = toHexDigit(ch);
+            if (x2 === -1) {
+              (0, _util.warn)('Lexer_getName: Illegal digit (' + String.fromCharCode(ch) + ') in hexadecimal number.');
+              strBuf.push('#', String.fromCharCode(previousCh));
+              if (specialChars[ch]) {
+                break;
+              }
+              strBuf.push(String.fromCharCode(ch));
+              continue;
+            }
+            strBuf.push(String.fromCharCode(x << 4 | x2));
+          } else {
+            strBuf.push('#', String.fromCharCode(ch));
+          }
+        } else {
+          strBuf.push(String.fromCharCode(ch));
+        }
+      }
+      if (strBuf.length > 127) {
+        (0, _util.warn)('name token is longer than allowed by the spec: ' + strBuf.length);
+      }
+      return _primitives.Name.get(strBuf.join(''));
+    },
+    getHexString: function Lexer_getHexString() {
+      var strBuf = this.strBuf;
+      strBuf.length = 0;
+      var ch = this.currentChar;
+      var isFirstHex = true;
+      var firstDigit;
+      var secondDigit;
+      while (true) {
+        if (ch < 0) {
+          (0, _util.warn)('Unterminated hex string');
+          break;
+        } else if (ch === 0x3E) {
+          this.nextChar();
+          break;
+        } else if (specialChars[ch] === 1) {
+          ch = this.nextChar();
+          continue;
+        } else {
+          if (isFirstHex) {
+            firstDigit = toHexDigit(ch);
+            if (firstDigit === -1) {
+              (0, _util.warn)('Ignoring invalid character "' + ch + '" in hex string');
+              ch = this.nextChar();
+              continue;
+            }
+          } else {
+            secondDigit = toHexDigit(ch);
+            if (secondDigit === -1) {
+              (0, _util.warn)('Ignoring invalid character "' + ch + '" in hex string');
+              ch = this.nextChar();
+              continue;
+            }
+            strBuf.push(String.fromCharCode(firstDigit << 4 | secondDigit));
+          }
+          isFirstHex = !isFirstHex;
+          ch = this.nextChar();
+        }
+      }
+      return strBuf.join('');
+    },
+    getObj: function Lexer_getObj() {
+      var comment = false;
+      var ch = this.currentChar;
+      while (true) {
+        if (ch < 0) {
+          return _primitives.EOF;
+        }
+        if (comment) {
+          if (ch === 0x0A || ch === 0x0D) {
+            comment = false;
+          }
+        } else if (ch === 0x25) {
+          comment = true;
+        } else if (specialChars[ch] !== 1) {
+          break;
+        }
+        ch = this.nextChar();
+      }
+      switch (ch | 0) {
+        case 0x30:
+        case 0x31:
+        case 0x32:
+        case 0x33:
+        case 0x34:
+        case 0x35:
+        case 0x36:
+        case 0x37:
+        case 0x38:
+        case 0x39:
+        case 0x2B:
+        case 0x2D:
+        case 0x2E:
+          return this.getNumber();
+        case 0x28:
+          return this.getString();
+        case 0x2F:
+          return this.getName();
+        case 0x5B:
+          this.nextChar();
+          return _primitives.Cmd.get('[');
+        case 0x5D:
+          this.nextChar();
+          return _primitives.Cmd.get(']');
+        case 0x3C:
+          ch = this.nextChar();
+          if (ch === 0x3C) {
+            this.nextChar();
+            return _primitives.Cmd.get('<<');
+          }
+          return this.getHexString();
+        case 0x3E:
+          ch = this.nextChar();
+          if (ch === 0x3E) {
+            this.nextChar();
+            return _primitives.Cmd.get('>>');
+          }
+          return _primitives.Cmd.get('>');
+        case 0x7B:
+          this.nextChar();
+          return _primitives.Cmd.get('{');
+        case 0x7D:
+          this.nextChar();
+          return _primitives.Cmd.get('}');
+        case 0x29:
+          this.nextChar();
+          throw new _util.FormatError('Illegal character: ' + ch);
+      }
+      var str = String.fromCharCode(ch);
+      var knownCommands = this.knownCommands;
+      var knownCommandFound = knownCommands && knownCommands[str] !== undefined;
+      while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) {
+        var possibleCommand = str + String.fromCharCode(ch);
+        if (knownCommandFound && knownCommands[possibleCommand] === undefined) {
+          break;
+        }
+        if (str.length === 128) {
+          throw new _util.FormatError('Command token too long: ' + str.length);
+        }
+        str = possibleCommand;
+        knownCommandFound = knownCommands && knownCommands[str] !== undefined;
+      }
+      if (str === 'true') {
+        return true;
+      }
+      if (str === 'false') {
+        return false;
+      }
+      if (str === 'null') {
+        return null;
+      }
+      if (str === 'BI') {
+        this.beginInlineImagePos = this.stream.pos;
+      }
+      return _primitives.Cmd.get(str);
+    },
+    skipToNextLine: function Lexer_skipToNextLine() {
+      var ch = this.currentChar;
+      while (ch >= 0) {
+        if (ch === 0x0D) {
+          ch = this.nextChar();
+          if (ch === 0x0A) {
+            this.nextChar();
+          }
+          break;
+        } else if (ch === 0x0A) {
+          this.nextChar();
+          break;
+        }
+        ch = this.nextChar();
+      }
+    }
+  };
+  return Lexer;
+}();
+var Linearization = {
+  create: function LinearizationCreate(stream) {
+    function getInt(name, allowZeroValue) {
+      var obj = linDict.get(name);
+      if (Number.isInteger(obj) && (allowZeroValue ? obj >= 0 : obj > 0)) {
+        return obj;
+      }
+      throw new Error('The "' + name + '" parameter in the linearization ' + 'dictionary is invalid.');
+    }
+    function getHints() {
+      var hints = linDict.get('H'),
+          hintsLength,
+          item;
+      if (Array.isArray(hints) && ((hintsLength = hints.length) === 2 || hintsLength === 4)) {
+        for (var index = 0; index < hintsLength; index++) {
+          if (!(Number.isInteger(item = hints[index]) && item > 0)) {
+            throw new Error('Hint (' + index + ') in the linearization dictionary is invalid.');
+          }
+        }
+        return hints;
+      }
+      throw new Error('Hint array in the linearization dictionary is invalid.');
+    }
+    var parser = new Parser(new Lexer(stream), false, null);
+    var obj1 = parser.getObj();
+    var obj2 = parser.getObj();
+    var obj3 = parser.getObj();
+    var linDict = parser.getObj();
+    var obj, length;
+    if (!(Number.isInteger(obj1) && Number.isInteger(obj2) && (0, _primitives.isCmd)(obj3, 'obj') && (0, _primitives.isDict)(linDict) && (0, _util.isNum)(obj = linDict.get('Linearized')) && obj > 0)) {
+      return null;
+    } else if ((length = getInt('L')) !== stream.length) {
+      throw new Error('The "L" parameter in the linearization dictionary ' + 'does not equal the stream length.');
+    }
+    return {
+      length: length,
+      hints: getHints(),
+      objectNumberFirst: getInt('O'),
+      endFirst: getInt('E'),
+      numPages: getInt('N'),
+      mainXRefEntriesOffset: getInt('T'),
+      pageFirst: linDict.has('P') ? getInt('P', true) : 0
+    };
+  }
+};
+exports.Lexer = Lexer;
+exports.Linearization = Linearization;
+exports.Parser = Parser;
+
+/***/ }),
+/* 140 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.LZWStream = exports.StringStream = exports.StreamsSequenceStream = exports.Stream = exports.RunLengthStream = exports.PredictorStream = exports.NullStream = exports.FlateStream = exports.DecodeStream = exports.DecryptStream = exports.AsciiHexStream = exports.Ascii85Stream = undefined;
+
+var _util = __w_pdfjs_require__(2);
+
+var _primitives = __w_pdfjs_require__(138);
+
+function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
+
+var Stream = function StreamClosure() {
+  function Stream(arrayBuffer, start, length, dict) {
+    this.bytes = arrayBuffer instanceof Uint8Array ? arrayBuffer : new Uint8Array(arrayBuffer);
+    this.start = start || 0;
+    this.pos = this.start;
+    this.end = start + length || this.bytes.length;
+    this.dict = dict;
+  }
+  Stream.prototype = {
+    get length() {
+      return this.end - this.start;
+    },
+    get isEmpty() {
+      return this.length === 0;
+    },
+    getByte: function Stream_getByte() {
+      if (this.pos >= this.end) {
+        return -1;
+      }
+      return this.bytes[this.pos++];
+    },
+    getUint16: function Stream_getUint16() {
+      var b0 = this.getByte();
+      var b1 = this.getByte();
+      if (b0 === -1 || b1 === -1) {
+        return -1;
+      }
+      return (b0 << 8) + b1;
+    },
+    getInt32: function Stream_getInt32() {
+      var b0 = this.getByte();
+      var b1 = this.getByte();
+      var b2 = this.getByte();
+      var b3 = this.getByte();
+      return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;
+    },
+    getBytes: function getBytes(length) {
+      var forceClamped = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+
+      var bytes = this.bytes;
+      var pos = this.pos;
+      var strEnd = this.end;
+      if (!length) {
+        var _subarray = bytes.subarray(pos, strEnd);
+        return forceClamped ? new Uint8ClampedArray(_subarray) : _subarray;
+      }
+      var end = pos + length;
+      if (end > strEnd) {
+        end = strEnd;
+      }
+      this.pos = end;
+      var subarray = bytes.subarray(pos, end);
+      return forceClamped ? new Uint8ClampedArray(subarray) : subarray;
+    },
+
+    peekByte: function Stream_peekByte() {
+      var peekedByte = this.getByte();
+      this.pos--;
+      return peekedByte;
+    },
+    peekBytes: function peekBytes(length) {
+      var forceClamped = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+
+      var bytes = this.getBytes(length, forceClamped);
+      this.pos -= bytes.length;
+      return bytes;
+    },
+
+    skip: function Stream_skip(n) {
+      if (!n) {
+        n = 1;
+      }
+      this.pos += n;
+    },
+    reset: function Stream_reset() {
+      this.pos = this.start;
+    },
+    moveStart: function Stream_moveStart() {
+      this.start = this.pos;
+    },
+    makeSubStream: function Stream_makeSubStream(start, length, dict) {
+      return new Stream(this.bytes.buffer, start, length, dict);
+    }
+  };
+  return Stream;
+}();
+var StringStream = function StringStreamClosure() {
+  function StringStream(str) {
+    var bytes = (0, _util.stringToBytes)(str);
+    Stream.call(this, bytes);
+  }
+  StringStream.prototype = Stream.prototype;
+  return StringStream;
+}();
+var DecodeStream = function DecodeStreamClosure() {
+  var emptyBuffer = new Uint8Array(0);
+  function DecodeStream(maybeMinBufferLength) {
+    this._rawMinBufferLength = maybeMinBufferLength || 0;
+    this.pos = 0;
+    this.bufferLength = 0;
+    this.eof = false;
+    this.buffer = emptyBuffer;
+    this.minBufferLength = 512;
+    if (maybeMinBufferLength) {
+      while (this.minBufferLength < maybeMinBufferLength) {
+        this.minBufferLength *= 2;
+      }
+    }
+  }
+  DecodeStream.prototype = {
+    get isEmpty() {
+      while (!this.eof && this.bufferLength === 0) {
+        this.readBlock();
+      }
+      return this.bufferLength === 0;
+    },
+    ensureBuffer: function DecodeStream_ensureBuffer(requested) {
+      var buffer = this.buffer;
+      if (requested <= buffer.byteLength) {
+        return buffer;
+      }
+      var size = this.minBufferLength;
+      while (size < requested) {
+        size *= 2;
+      }
+      var buffer2 = new Uint8Array(size);
+      buffer2.set(buffer);
+      return this.buffer = buffer2;
+    },
+    getByte: function DecodeStream_getByte() {
+      var pos = this.pos;
+      while (this.bufferLength <= pos) {
+        if (this.eof) {
+          return -1;
+        }
+        this.readBlock();
+      }
+      return this.buffer[this.pos++];
+    },
+    getUint16: function DecodeStream_getUint16() {
+      var b0 = this.getByte();
+      var b1 = this.getByte();
+      if (b0 === -1 || b1 === -1) {
+        return -1;
+      }
+      return (b0 << 8) + b1;
+    },
+    getInt32: function DecodeStream_getInt32() {
+      var b0 = this.getByte();
+      var b1 = this.getByte();
+      var b2 = this.getByte();
+      var b3 = this.getByte();
+      return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;
+    },
+    getBytes: function getBytes(length) {
+      var forceClamped = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+
+      var end,
+          pos = this.pos;
+      if (length) {
+        this.ensureBuffer(pos + length);
+        end = pos + length;
+        while (!this.eof && this.bufferLength < end) {
+          this.readBlock();
+        }
+        var bufEnd = this.bufferLength;
+        if (end > bufEnd) {
+          end = bufEnd;
+        }
+      } else {
+        while (!this.eof) {
+          this.readBlock();
+        }
+        end = this.bufferLength;
+      }
+      this.pos = end;
+      var subarray = this.buffer.subarray(pos, end);
+      return forceClamped && !(subarray instanceof Uint8ClampedArray) ? new Uint8ClampedArray(subarray) : subarray;
+    },
+
+    peekByte: function DecodeStream_peekByte() {
+      var peekedByte = this.getByte();
+      this.pos--;
+      return peekedByte;
+    },
+    peekBytes: function peekBytes(length) {
+      var forceClamped = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+
+      var bytes = this.getBytes(length, forceClamped);
+      this.pos -= bytes.length;
+      return bytes;
+    },
+
+    makeSubStream: function DecodeStream_makeSubStream(start, length, dict) {
+      var end = start + length;
+      while (this.bufferLength <= end && !this.eof) {
+        this.readBlock();
+      }
+      return new Stream(this.buffer, start, length, dict);
+    },
+    skip: function DecodeStream_skip(n) {
+      if (!n) {
+        n = 1;
+      }
+      this.pos += n;
+    },
+    reset: function DecodeStream_reset() {
+      this.pos = 0;
+    },
+    getBaseStreams: function DecodeStream_getBaseStreams() {
+      if (this.str && this.str.getBaseStreams) {
+        return this.str.getBaseStreams();
+      }
+      return [];
+    }
+  };
+  return DecodeStream;
+}();
+var StreamsSequenceStream = function StreamsSequenceStreamClosure() {
+  function StreamsSequenceStream(streams) {
+    this.streams = streams;
+    var maybeLength = 0;
+    for (var i = 0, ii = streams.length; i < ii; i++) {
+      var stream = streams[i];
+      if (stream instanceof DecodeStream) {
+        maybeLength += stream._rawMinBufferLength;
+      } else {
+        maybeLength += stream.length;
+      }
+    }
+    DecodeStream.call(this, maybeLength);
+  }
+  StreamsSequenceStream.prototype = Object.create(DecodeStream.prototype);
+  StreamsSequenceStream.prototype.readBlock = function streamSequenceStreamReadBlock() {
+    var streams = this.streams;
+    if (streams.length === 0) {
+      this.eof = true;
+      return;
+    }
+    var stream = streams.shift();
+    var chunk = stream.getBytes();
+    var bufferLength = this.bufferLength;
+    var newLength = bufferLength + chunk.length;
+    var buffer = this.ensureBuffer(newLength);
+    buffer.set(chunk, bufferLength);
+    this.bufferLength = newLength;
+  };
+  StreamsSequenceStream.prototype.getBaseStreams = function StreamsSequenceStream_getBaseStreams() {
+    var baseStreams = [];
+    for (var i = 0, ii = this.streams.length; i < ii; i++) {
+      var stream = this.streams[i];
+      if (stream.getBaseStreams) {
+        baseStreams.push.apply(baseStreams, _toConsumableArray(stream.getBaseStreams()));
+      }
+    }
+    return baseStreams;
+  };
+  return StreamsSequenceStream;
+}();
+var FlateStream = function FlateStreamClosure() {
+  var codeLenCodeMap = new Int32Array([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);
+  var lengthDecode = new Int32Array([0x00003, 0x00004, 0x00005, 0x00006, 0x00007, 0x00008, 0x00009, 0x0000a, 0x1000b, 0x1000d, 0x1000f, 0x10011, 0x20013, 0x20017, 0x2001b, 0x2001f, 0x30023, 0x3002b, 0x30033, 0x3003b, 0x40043, 0x40053, 0x40063, 0x40073, 0x50083, 0x500a3, 0x500c3, 0x500e3, 0x00102, 0x00102, 0x00102]);
+  var distDecode = new Int32Array([0x00001, 0x00002, 0x00003, 0x00004, 0x10005, 0x10007, 0x20009, 0x2000d, 0x30011, 0x30019, 0x40021, 0x40031, 0x50041, 0x50061, 0x60081, 0x600c1, 0x70101, 0x70181, 0x80201, 0x80301, 0x90401, 0x90601, 0xa0801, 0xa0c01, 0xb1001, 0xb1801, 0xc2001, 0xc3001, 0xd4001, 0xd6001]);
+  var fixedLitCodeTab = [new Int32Array([0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c0, 0x70108, 0x80060, 0x80020, 0x900a0, 0x80000, 0x80080, 0x80040, 0x900e0, 0x70104, 0x80058, 0x80018, 0x90090, 0x70114, 0x80078, 0x80038, 0x900d0, 0x7010c, 0x80068, 0x80028, 0x900b0, 0x80008, 0x80088, 0x80048, 0x900f0, 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c8, 0x7010a, 0x80064, 0x80024, 0x900a8, 0x80004, 0x80084, 0x80044, 0x900e8, 0x70106, 0x8005c, 0x8001c, 0x90098, 0x70116, 0x8007c, 0x8003c, 0x900d8, 0x7010e, 0x8006c, 0x8002c, 0x900b8, 0x8000c, 0x8008c, 0x8004c, 0x900f8, 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c4, 0x70109, 0x80062, 0x80022, 0x900a4, 0x80002, 0x80082, 0x80042, 0x900e4, 0x70105, 0x8005a, 0x8001a, 0x90094, 0x70115, 0x8007a, 0x8003a, 0x900d4, 0x7010d, 0x8006a, 0x8002a, 0x900b4, 0x8000a, 0x8008a, 0x8004a, 0x900f4, 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cc, 0x7010b, 0x80066, 0x80026, 0x900ac, 0x80006, 0x80086, 0x80046, 0x900ec, 0x70107, 0x8005e, 0x8001e, 0x9009c, 0x70117, 0x8007e, 0x8003e, 0x900dc, 0x7010f, 0x8006e, 0x8002e, 0x900bc, 0x8000e, 0x8008e, 0x8004e, 0x900fc, 0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c2, 0x70108, 0x80061, 0x80021, 0x900a2, 0x80001, 0x80081, 0x80041, 0x900e2, 0x70104, 0x80059, 0x80019, 0x90092, 0x70114, 0x80079, 0x80039, 0x900d2, 0x7010c, 0x80069, 0x80029, 0x900b2, 0x80009, 0x80089, 0x80049, 0x900f2, 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900ca, 0x7010a, 0x80065, 0x80025, 0x900aa, 0x80005, 0x80085, 0x80045, 0x900ea, 0x70106, 0x8005d, 0x8001d, 0x9009a, 0x70116, 0x8007d, 0x8003d, 0x900da, 0x7010e, 0x8006d, 0x8002d, 0x900ba, 0x8000d, 0x8008d, 0x8004d, 0x900fa, 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c6, 0x70109, 0x80063, 0x80023, 0x900a6, 0x80003, 0x80083, 0x80043, 0x900e6, 0x70105, 0x8005b, 0x8001b, 0x90096, 0x70115, 0x8007b, 0x8003b, 0x900d6, 0x7010d, 0x8006b, 0x8002b, 0x900b6, 0x8000b, 0x8008b, 0x8004b, 0x900f6, 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900ce, 0x7010b, 0x80067, 0x80027, 0x900ae, 0x80007, 0x80087, 0x80047, 0x900ee, 0x70107, 0x8005f, 0x8001f, 0x9009e, 0x70117, 0x8007f, 0x8003f, 0x900de, 0x7010f, 0x8006f, 0x8002f, 0x900be, 0x8000f, 0x8008f, 0x8004f, 0x900fe, 0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c1, 0x70108, 0x80060, 0x80020, 0x900a1, 0x80000, 0x80080, 0x80040, 0x900e1, 0x70104, 0x80058, 0x80018, 0x90091, 0x70114, 0x80078, 0x80038, 0x900d1, 0x7010c, 0x80068, 0x80028, 0x900b1, 0x80008, 0x80088, 0x80048, 0x900f1, 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c9, 0x7010a, 0x80064, 0x80024, 0x900a9, 0x80004, 0x80084, 0x80044, 0x900e9, 0x70106, 0x8005c, 0x8001c, 0x90099, 0x70116, 0x8007c, 0x8003c, 0x900d9, 0x7010e, 0x8006c, 0x8002c, 0x900b9, 0x8000c, 0x8008c, 0x8004c, 0x900f9, 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c5, 0x70109, 0x80062, 0x80022, 0x900a5, 0x80002, 0x80082, 0x80042, 0x900e5, 0x70105, 0x8005a, 0x8001a, 0x90095, 0x70115, 0x8007a, 0x8003a, 0x900d5, 0x7010d, 0x8006a, 0x8002a, 0x900b5, 0x8000a, 0x8008a, 0x8004a, 0x900f5, 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cd, 0x7010b, 0x80066, 0x80026, 0x900ad, 0x80006, 0x80086, 0x80046, 0x900ed, 0x70107, 0x8005e, 0x8001e, 0x9009d, 0x70117, 0x8007e, 0x8003e, 0x900dd, 0x7010f, 0x8006e, 0x8002e, 0x900bd, 0x8000e, 0x8008e, 0x8004e, 0x900fd, 0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c3, 0x70108, 0x80061, 0x80021, 0x900a3, 0x80001, 0x80081, 0x80041, 0x900e3, 0x70104, 0x80059, 0x80019, 0x90093, 0x70114, 0x80079, 0x80039, 0x900d3, 0x7010c, 0x80069, 0x80029, 0x900b3, 0x80009, 0x80089, 0x80049, 0x900f3, 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900cb, 0x7010a, 0x80065, 0x80025, 0x900ab, 0x80005, 0x80085, 0x80045, 0x900eb, 0x70106, 0x8005d, 0x8001d, 0x9009b, 0x70116, 0x8007d, 0x8003d, 0x900db, 0x7010e, 0x8006d, 0x8002d, 0x900bb, 0x8000d, 0x8008d, 0x8004d, 0x900fb, 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c7, 0x70109, 0x80063, 0x80023, 0x900a7, 0x80003, 0x80083, 0x80043, 0x900e7, 0x70105, 0x8005b, 0x8001b, 0x90097, 0x70115, 0x8007b, 0x8003b, 0x900d7, 0x7010d, 0x8006b, 0x8002b, 0x900b7, 0x8000b, 0x8008b, 0x8004b, 0x900f7, 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900cf, 0x7010b, 0x80067, 0x80027, 0x900af, 0x80007, 0x80087, 0x80047, 0x900ef, 0x70107, 0x8005f, 0x8001f, 0x9009f, 0x70117, 0x8007f, 0x8003f, 0x900df, 0x7010f, 0x8006f, 0x8002f, 0x900bf, 0x8000f, 0x8008f, 0x8004f, 0x900ff]), 9];
+  var fixedDistCodeTab = [new Int32Array([0x50000, 0x50010, 0x50008, 0x50018, 0x50004, 0x50014, 0x5000c, 0x5001c, 0x50002, 0x50012, 0x5000a, 0x5001a, 0x50006, 0x50016, 0x5000e, 0x00000, 0x50001, 0x50011, 0x50009, 0x50019, 0x50005, 0x50015, 0x5000d, 0x5001d, 0x50003, 0x50013, 0x5000b, 0x5001b, 0x50007, 0x50017, 0x5000f, 0x00000]), 5];
+  function FlateStream(str, maybeLength) {
+    this.str = str;
+    this.dict = str.dict;
+    var cmf = str.getByte();
+    var flg = str.getByte();
+    if (cmf === -1 || flg === -1) {
+      throw new _util.FormatError('Invalid header in flate stream: ' + cmf + ', ' + flg);
+    }
+    if ((cmf & 0x0f) !== 0x08) {
+      throw new _util.FormatError('Unknown compression method in flate stream: ' + cmf + ', ' + flg);
+    }
+    if (((cmf << 8) + flg) % 31 !== 0) {
+      throw new _util.FormatError('Bad FCHECK in flate stream: ' + cmf + ', ' + flg);
+    }
+    if (flg & 0x20) {
+      throw new _util.FormatError('FDICT bit set in flate stream: ' + cmf + ', ' + flg);
+    }
+    this.codeSize = 0;
+    this.codeBuf = 0;
+    DecodeStream.call(this, maybeLength);
+  }
+  FlateStream.prototype = Object.create(DecodeStream.prototype);
+  FlateStream.prototype.getBits = function FlateStream_getBits(bits) {
+    var str = this.str;
+    var codeSize = this.codeSize;
+    var codeBuf = this.codeBuf;
+    var b;
+    while (codeSize < bits) {
+      if ((b = str.getByte()) === -1) {
+        throw new _util.FormatError('Bad encoding in flate stream');
+      }
+      codeBuf |= b << codeSize;
+      codeSize += 8;
+    }
+    b = codeBuf & (1 << bits) - 1;
+    this.codeBuf = codeBuf >> bits;
+    this.codeSize = codeSize -= bits;
+    return b;
+  };
+  FlateStream.prototype.getCode = function FlateStream_getCode(table) {
+    var str = this.str;
+    var codes = table[0];
+    var maxLen = table[1];
+    var codeSize = this.codeSize;
+    var codeBuf = this.codeBuf;
+    var b;
+    while (codeSize < maxLen) {
+      if ((b = str.getByte()) === -1) {
+        break;
+      }
+      codeBuf |= b << codeSize;
+      codeSize += 8;
+    }
+    var code = codes[codeBuf & (1 << maxLen) - 1];
+    var codeLen = code >> 16;
+    var codeVal = code & 0xffff;
+    if (codeLen < 1 || codeSize < codeLen) {
+      throw new _util.FormatError('Bad encoding in flate stream');
+    }
+    this.codeBuf = codeBuf >> codeLen;
+    this.codeSize = codeSize - codeLen;
+    return codeVal;
+  };
+  FlateStream.prototype.generateHuffmanTable = function flateStreamGenerateHuffmanTable(lengths) {
+    var n = lengths.length;
+    var maxLen = 0;
+    var i;
+    for (i = 0; i < n; ++i) {
+      if (lengths[i] > maxLen) {
+        maxLen = lengths[i];
+      }
+    }
+    var size = 1 << maxLen;
+    var codes = new Int32Array(size);
+    for (var len = 1, code = 0, skip = 2; len <= maxLen; ++len, code <<= 1, skip <<= 1) {
+      for (var val = 0; val < n; ++val) {
+        if (lengths[val] === len) {
+          var code2 = 0;
+          var t = code;
+          for (i = 0; i < len; ++i) {
+            code2 = code2 << 1 | t & 1;
+            t >>= 1;
+          }
+          for (i = code2; i < size; i += skip) {
+            codes[i] = len << 16 | val;
+          }
+          ++code;
+        }
+      }
+    }
+    return [codes, maxLen];
+  };
+  FlateStream.prototype.readBlock = function FlateStream_readBlock() {
+    var buffer, len;
+    var str = this.str;
+    var hdr = this.getBits(3);
+    if (hdr & 1) {
+      this.eof = true;
+    }
+    hdr >>= 1;
+    if (hdr === 0) {
+      var b;
+      if ((b = str.getByte()) === -1) {
+        throw new _util.FormatError('Bad block header in flate stream');
+      }
+      var blockLen = b;
+      if ((b = str.getByte()) === -1) {
+        throw new _util.FormatError('Bad block header in flate stream');
+      }
+      blockLen |= b << 8;
+      if ((b = str.getByte()) === -1) {
+        throw new _util.FormatError('Bad block header in flate stream');
+      }
+      var check = b;
+      if ((b = str.getByte()) === -1) {
+        throw new _util.FormatError('Bad block header in flate stream');
+      }
+      check |= b << 8;
+      if (check !== (~blockLen & 0xffff) && (blockLen !== 0 || check !== 0)) {
+        throw new _util.FormatError('Bad uncompressed block length in flate stream');
+      }
+      this.codeBuf = 0;
+      this.codeSize = 0;
+      var bufferLength = this.bufferLength;
+      buffer = this.ensureBuffer(bufferLength + blockLen);
+      var end = bufferLength + blockLen;
+      this.bufferLength = end;
+      if (blockLen === 0) {
+        if (str.peekByte() === -1) {
+          this.eof = true;
+        }
+      } else {
+        for (var n = bufferLength; n < end; ++n) {
+          if ((b = str.getByte()) === -1) {
+            this.eof = true;
+            break;
+          }
+          buffer[n] = b;
+        }
+      }
+      return;
+    }
+    var litCodeTable;
+    var distCodeTable;
+    if (hdr === 1) {
+      litCodeTable = fixedLitCodeTab;
+      distCodeTable = fixedDistCodeTab;
+    } else if (hdr === 2) {
+      var numLitCodes = this.getBits(5) + 257;
+      var numDistCodes = this.getBits(5) + 1;
+      var numCodeLenCodes = this.getBits(4) + 4;
+      var codeLenCodeLengths = new Uint8Array(codeLenCodeMap.length);
+      var i;
+      for (i = 0; i < numCodeLenCodes; ++i) {
+        codeLenCodeLengths[codeLenCodeMap[i]] = this.getBits(3);
+      }
+      var codeLenCodeTab = this.generateHuffmanTable(codeLenCodeLengths);
+      len = 0;
+      i = 0;
+      var codes = numLitCodes + numDistCodes;
+      var codeLengths = new Uint8Array(codes);
+      var bitsLength, bitsOffset, what;
+      while (i < codes) {
+        var code = this.getCode(codeLenCodeTab);
+        if (code === 16) {
+          bitsLength = 2;
+          bitsOffset = 3;
+          what = len;
+        } else if (code === 17) {
+          bitsLength = 3;
+          bitsOffset = 3;
+          what = len = 0;
+        } else if (code === 18) {
+          bitsLength = 7;
+          bitsOffset = 11;
+          what = len = 0;
+        } else {
+          codeLengths[i++] = len = code;
+          continue;
+        }
+        var repeatLength = this.getBits(bitsLength) + bitsOffset;
+        while (repeatLength-- > 0) {
+          codeLengths[i++] = what;
+        }
+      }
+      litCodeTable = this.generateHuffmanTable(codeLengths.subarray(0, numLitCodes));
+      distCodeTable = this.generateHuffmanTable(codeLengths.subarray(numLitCodes, codes));
+    } else {
+      throw new _util.FormatError('Unknown block type in flate stream');
+    }
+    buffer = this.buffer;
+    var limit = buffer ? buffer.length : 0;
+    var pos = this.bufferLength;
+    while (true) {
+      var code1 = this.getCode(litCodeTable);
+      if (code1 < 256) {
+        if (pos + 1 >= limit) {
+          buffer = this.ensureBuffer(pos + 1);
+          limit = buffer.length;
+        }
+        buffer[pos++] = code1;
+        continue;
+      }
+      if (code1 === 256) {
+        this.bufferLength = pos;
+        return;
+      }
+      code1 -= 257;
+      code1 = lengthDecode[code1];
+      var code2 = code1 >> 16;
+      if (code2 > 0) {
+        code2 = this.getBits(code2);
+      }
+      len = (code1 & 0xffff) + code2;
+      code1 = this.getCode(distCodeTable);
+      code1 = distDecode[code1];
+      code2 = code1 >> 16;
+      if (code2 > 0) {
+        code2 = this.getBits(code2);
+      }
+      var dist = (code1 & 0xffff) + code2;
+      if (pos + len >= limit) {
+        buffer = this.ensureBuffer(pos + len);
+        limit = buffer.length;
+      }
+      for (var k = 0; k < len; ++k, ++pos) {
+        buffer[pos] = buffer[pos - dist];
+      }
+    }
+  };
+  return FlateStream;
+}();
+var PredictorStream = function PredictorStreamClosure() {
+  function PredictorStream(str, maybeLength, params) {
+    if (!(0, _primitives.isDict)(params)) {
+      return str;
+    }
+    var predictor = this.predictor = params.get('Predictor') || 1;
+    if (predictor <= 1) {
+      return str;
+    }
+    if (predictor !== 2 && (predictor < 10 || predictor > 15)) {
+      throw new _util.FormatError('Unsupported predictor: ' + predictor);
+    }
+    if (predictor === 2) {
+      this.readBlock = this.readBlockTiff;
+    } else {
+      this.readBlock = this.readBlockPng;
+    }
+    this.str = str;
+    this.dict = str.dict;
+    var colors = this.colors = params.get('Colors') || 1;
+    var bits = this.bits = params.get('BitsPerComponent') || 8;
+    var columns = this.columns = params.get('Columns') || 1;
+    this.pixBytes = colors * bits + 7 >> 3;
+    this.rowBytes = columns * colors * bits + 7 >> 3;
+    DecodeStream.call(this, maybeLength);
+    return this;
+  }
+  PredictorStream.prototype = Object.create(DecodeStream.prototype);
+  PredictorStream.prototype.readBlockTiff = function predictorStreamReadBlockTiff() {
+    var rowBytes = this.rowBytes;
+    var bufferLength = this.bufferLength;
+    var buffer = this.ensureBuffer(bufferLength + rowBytes);
+    var bits = this.bits;
+    var colors = this.colors;
+    var rawBytes = this.str.getBytes(rowBytes);
+    this.eof = !rawBytes.length;
+    if (this.eof) {
+      return;
+    }
+    var inbuf = 0,
+        outbuf = 0;
+    var inbits = 0,
+        outbits = 0;
+    var pos = bufferLength;
+    var i;
+    if (bits === 1 && colors === 1) {
+      for (i = 0; i < rowBytes; ++i) {
+        var c = rawBytes[i] ^ inbuf;
+        c ^= c >> 1;
+        c ^= c >> 2;
+        c ^= c >> 4;
+        inbuf = (c & 1) << 7;
+        buffer[pos++] = c;
+      }
+    } else if (bits === 8) {
+      for (i = 0; i < colors; ++i) {
+        buffer[pos++] = rawBytes[i];
+      }
+      for (; i < rowBytes; ++i) {
+        buffer[pos] = buffer[pos - colors] + rawBytes[i];
+        pos++;
+      }
+    } else if (bits === 16) {
+      var bytesPerPixel = colors * 2;
+      for (i = 0; i < bytesPerPixel; ++i) {
+        buffer[pos++] = rawBytes[i];
+      }
+      for (; i < rowBytes; i += 2) {
+        var sum = ((rawBytes[i] & 0xFF) << 8) + (rawBytes[i + 1] & 0xFF) + ((buffer[pos - bytesPerPixel] & 0xFF) << 8) + (buffer[pos - bytesPerPixel + 1] & 0xFF);
+        buffer[pos++] = sum >> 8 & 0xFF;
+        buffer[pos++] = sum & 0xFF;
+      }
+    } else {
+      var compArray = new Uint8Array(colors + 1);
+      var bitMask = (1 << bits) - 1;
+      var j = 0,
+          k = bufferLength;
+      var columns = this.columns;
+      for (i = 0; i < columns; ++i) {
+        for (var kk = 0; kk < colors; ++kk) {
+          if (inbits < bits) {
+            inbuf = inbuf << 8 | rawBytes[j++] & 0xFF;
+            inbits += 8;
+          }
+          compArray[kk] = compArray[kk] + (inbuf >> inbits - bits) & bitMask;
+          inbits -= bits;
+          outbuf = outbuf << bits | compArray[kk];
+          outbits += bits;
+          if (outbits >= 8) {
+            buffer[k++] = outbuf >> outbits - 8 & 0xFF;
+            outbits -= 8;
+          }
+        }
+      }
+      if (outbits > 0) {
+        buffer[k++] = (outbuf << 8 - outbits) + (inbuf & (1 << 8 - outbits) - 1);
+      }
+    }
+    this.bufferLength += rowBytes;
+  };
+  PredictorStream.prototype.readBlockPng = function predictorStreamReadBlockPng() {
+    var rowBytes = this.rowBytes;
+    var pixBytes = this.pixBytes;
+    var predictor = this.str.getByte();
+    var rawBytes = this.str.getBytes(rowBytes);
+    this.eof = !rawBytes.length;
+    if (this.eof) {
+      return;
+    }
+    var bufferLength = this.bufferLength;
+    var buffer = this.ensureBuffer(bufferLength + rowBytes);
+    var prevRow = buffer.subarray(bufferLength - rowBytes, bufferLength);
+    if (prevRow.length === 0) {
+      prevRow = new Uint8Array(rowBytes);
+    }
+    var i,
+        j = bufferLength,
+        up,
+        c;
+    switch (predictor) {
+      case 0:
+        for (i = 0; i < rowBytes; ++i) {
+          buffer[j++] = rawBytes[i];
+        }
+        break;
+      case 1:
+        for (i = 0; i < pixBytes; ++i) {
+          buffer[j++] = rawBytes[i];
+        }
+        for (; i < rowBytes; ++i) {
+          buffer[j] = buffer[j - pixBytes] + rawBytes[i] & 0xFF;
+          j++;
+        }
+        break;
+      case 2:
+        for (i = 0; i < rowBytes; ++i) {
+          buffer[j++] = prevRow[i] + rawBytes[i] & 0xFF;
+        }
+        break;
+      case 3:
+        for (i = 0; i < pixBytes; ++i) {
+          buffer[j++] = (prevRow[i] >> 1) + rawBytes[i];
+        }
+        for (; i < rowBytes; ++i) {
+          buffer[j] = (prevRow[i] + buffer[j - pixBytes] >> 1) + rawBytes[i] & 0xFF;
+          j++;
+        }
+        break;
+      case 4:
+        for (i = 0; i < pixBytes; ++i) {
+          up = prevRow[i];
+          c = rawBytes[i];
+          buffer[j++] = up + c;
+        }
+        for (; i < rowBytes; ++i) {
+          up = prevRow[i];
+          var upLeft = prevRow[i - pixBytes];
+          var left = buffer[j - pixBytes];
+          var p = left + up - upLeft;
+          var pa = p - left;
+          if (pa < 0) {
+            pa = -pa;
+          }
+          var pb = p - up;
+          if (pb < 0) {
+            pb = -pb;
+          }
+          var pc = p - upLeft;
+          if (pc < 0) {
+            pc = -pc;
+          }
+          c = rawBytes[i];
+          if (pa <= pb && pa <= pc) {
+            buffer[j++] = left + c;
+          } else if (pb <= pc) {
+            buffer[j++] = up + c;
+          } else {
+            buffer[j++] = upLeft + c;
+          }
+        }
+        break;
+      default:
+        throw new _util.FormatError('Unsupported predictor: ' + predictor);
+    }
+    this.bufferLength += rowBytes;
+  };
+  return PredictorStream;
+}();
+var DecryptStream = function DecryptStreamClosure() {
+  function DecryptStream(str, maybeLength, decrypt) {
+    this.str = str;
+    this.dict = str.dict;
+    this.decrypt = decrypt;
+    this.nextChunk = null;
+    this.initialized = false;
+    DecodeStream.call(this, maybeLength);
+  }
+  var chunkSize = 512;
+  DecryptStream.prototype = Object.create(DecodeStream.prototype);
+  DecryptStream.prototype.readBlock = function DecryptStream_readBlock() {
+    var chunk;
+    if (this.initialized) {
+      chunk = this.nextChunk;
+    } else {
+      chunk = this.str.getBytes(chunkSize);
+      this.initialized = true;
+    }
+    if (!chunk || chunk.length === 0) {
+      this.eof = true;
+      return;
+    }
+    this.nextChunk = this.str.getBytes(chunkSize);
+    var hasMoreData = this.nextChunk && this.nextChunk.length > 0;
+    var decrypt = this.decrypt;
+    chunk = decrypt(chunk, !hasMoreData);
+    var bufferLength = this.bufferLength;
+    var i,
+        n = chunk.length;
+    var buffer = this.ensureBuffer(bufferLength + n);
+    for (i = 0; i < n; i++) {
+      buffer[bufferLength++] = chunk[i];
+    }
+    this.bufferLength = bufferLength;
+  };
+  return DecryptStream;
+}();
+var Ascii85Stream = function Ascii85StreamClosure() {
+  function Ascii85Stream(str, maybeLength) {
+    this.str = str;
+    this.dict = str.dict;
+    this.input = new Uint8Array(5);
+    if (maybeLength) {
+      maybeLength = 0.8 * maybeLength;
+    }
+    DecodeStream.call(this, maybeLength);
+  }
+  Ascii85Stream.prototype = Object.create(DecodeStream.prototype);
+  Ascii85Stream.prototype.readBlock = function Ascii85Stream_readBlock() {
+    var TILDA_CHAR = 0x7E;
+    var Z_LOWER_CHAR = 0x7A;
+    var EOF = -1;
+    var str = this.str;
+    var c = str.getByte();
+    while ((0, _util.isSpace)(c)) {
+      c = str.getByte();
+    }
+    if (c === EOF || c === TILDA_CHAR) {
+      this.eof = true;
+      return;
+    }
+    var bufferLength = this.bufferLength,
+        buffer;
+    var i;
+    if (c === Z_LOWER_CHAR) {
+      buffer = this.ensureBuffer(bufferLength + 4);
+      for (i = 0; i < 4; ++i) {
+        buffer[bufferLength + i] = 0;
+      }
+      this.bufferLength += 4;
+    } else {
+      var input = this.input;
+      input[0] = c;
+      for (i = 1; i < 5; ++i) {
+        c = str.getByte();
+        while ((0, _util.isSpace)(c)) {
+          c = str.getByte();
+        }
+        input[i] = c;
+        if (c === EOF || c === TILDA_CHAR) {
+          break;
+        }
+      }
+      buffer = this.ensureBuffer(bufferLength + i - 1);
+      this.bufferLength += i - 1;
+      if (i < 5) {
+        for (; i < 5; ++i) {
+          input[i] = 0x21 + 84;
+        }
+        this.eof = true;
+      }
+      var t = 0;
+      for (i = 0; i < 5; ++i) {
+        t = t * 85 + (input[i] - 0x21);
+      }
+      for (i = 3; i >= 0; --i) {
+        buffer[bufferLength + i] = t & 0xFF;
+        t >>= 8;
+      }
+    }
+  };
+  return Ascii85Stream;
+}();
+var AsciiHexStream = function AsciiHexStreamClosure() {
+  function AsciiHexStream(str, maybeLength) {
+    this.str = str;
+    this.dict = str.dict;
+    this.firstDigit = -1;
+    if (maybeLength) {
+      maybeLength = 0.5 * maybeLength;
+    }
+    DecodeStream.call(this, maybeLength);
+  }
+  AsciiHexStream.prototype = Object.create(DecodeStream.prototype);
+  AsciiHexStream.prototype.readBlock = function AsciiHexStream_readBlock() {
+    var UPSTREAM_BLOCK_SIZE = 8000;
+    var bytes = this.str.getBytes(UPSTREAM_BLOCK_SIZE);
+    if (!bytes.length) {
+      this.eof = true;
+      return;
+    }
+    var maxDecodeLength = bytes.length + 1 >> 1;
+    var buffer = this.ensureBuffer(this.bufferLength + maxDecodeLength);
+    var bufferLength = this.bufferLength;
+    var firstDigit = this.firstDigit;
+    for (var i = 0, ii = bytes.length; i < ii; i++) {
+      var ch = bytes[i],
+          digit;
+      if (ch >= 0x30 && ch <= 0x39) {
+        digit = ch & 0x0F;
+      } else if (ch >= 0x41 && ch <= 0x46 || ch >= 0x61 && ch <= 0x66) {
+        digit = (ch & 0x0F) + 9;
+      } else if (ch === 0x3E) {
+        this.eof = true;
+        break;
+      } else {
+        continue;
+      }
+      if (firstDigit < 0) {
+        firstDigit = digit;
+      } else {
+        buffer[bufferLength++] = firstDigit << 4 | digit;
+        firstDigit = -1;
+      }
+    }
+    if (firstDigit >= 0 && this.eof) {
+      buffer[bufferLength++] = firstDigit << 4;
+      firstDigit = -1;
+    }
+    this.firstDigit = firstDigit;
+    this.bufferLength = bufferLength;
+  };
+  return AsciiHexStream;
+}();
+var RunLengthStream = function RunLengthStreamClosure() {
+  function RunLengthStream(str, maybeLength) {
+    this.str = str;
+    this.dict = str.dict;
+    DecodeStream.call(this, maybeLength);
+  }
+  RunLengthStream.prototype = Object.create(DecodeStream.prototype);
+  RunLengthStream.prototype.readBlock = function RunLengthStream_readBlock() {
+    var repeatHeader = this.str.getBytes(2);
+    if (!repeatHeader || repeatHeader.length < 2 || repeatHeader[0] === 128) {
+      this.eof = true;
+      return;
+    }
+    var buffer;
+    var bufferLength = this.bufferLength;
+    var n = repeatHeader[0];
+    if (n < 128) {
+      buffer = this.ensureBuffer(bufferLength + n + 1);
+      buffer[bufferLength++] = repeatHeader[1];
+      if (n > 0) {
+        var source = this.str.getBytes(n);
+        buffer.set(source, bufferLength);
+        bufferLength += n;
+      }
+    } else {
+      n = 257 - n;
+      var b = repeatHeader[1];
+      buffer = this.ensureBuffer(bufferLength + n + 1);
+      for (var i = 0; i < n; i++) {
+        buffer[bufferLength++] = b;
+      }
+    }
+    this.bufferLength = bufferLength;
+  };
+  return RunLengthStream;
+}();
+var LZWStream = function LZWStreamClosure() {
+  function LZWStream(str, maybeLength, earlyChange) {
+    this.str = str;
+    this.dict = str.dict;
+    this.cachedData = 0;
+    this.bitsCached = 0;
+    var maxLzwDictionarySize = 4096;
+    var lzwState = {
+      earlyChange: earlyChange,
+      codeLength: 9,
+      nextCode: 258,
+      dictionaryValues: new Uint8Array(maxLzwDictionarySize),
+      dictionaryLengths: new Uint16Array(maxLzwDictionarySize),
+      dictionaryPrevCodes: new Uint16Array(maxLzwDictionarySize),
+      currentSequence: new Uint8Array(maxLzwDictionarySize),
+      currentSequenceLength: 0
+    };
+    for (var i = 0; i < 256; ++i) {
+      lzwState.dictionaryValues[i] = i;
+      lzwState.dictionaryLengths[i] = 1;
+    }
+    this.lzwState = lzwState;
+    DecodeStream.call(this, maybeLength);
+  }
+  LZWStream.prototype = Object.create(DecodeStream.prototype);
+  LZWStream.prototype.readBits = function LZWStream_readBits(n) {
+    var bitsCached = this.bitsCached;
+    var cachedData = this.cachedData;
+    while (bitsCached < n) {
+      var c = this.str.getByte();
+      if (c === -1) {
+        this.eof = true;
+        return null;
+      }
+      cachedData = cachedData << 8 | c;
+      bitsCached += 8;
+    }
+    this.bitsCached = bitsCached -= n;
+    this.cachedData = cachedData;
+    this.lastCode = null;
+    return cachedData >>> bitsCached & (1 << n) - 1;
+  };
+  LZWStream.prototype.readBlock = function LZWStream_readBlock() {
+    var blockSize = 512;
+    var estimatedDecodedSize = blockSize * 2,
+        decodedSizeDelta = blockSize;
+    var i, j, q;
+    var lzwState = this.lzwState;
+    if (!lzwState) {
+      return;
+    }
+    var earlyChange = lzwState.earlyChange;
+    var nextCode = lzwState.nextCode;
+    var dictionaryValues = lzwState.dictionaryValues;
+    var dictionaryLengths = lzwState.dictionaryLengths;
+    var dictionaryPrevCodes = lzwState.dictionaryPrevCodes;
+    var codeLength = lzwState.codeLength;
+    var prevCode = lzwState.prevCode;
+    var currentSequence = lzwState.currentSequence;
+    var currentSequenceLength = lzwState.currentSequenceLength;
+    var decodedLength = 0;
+    var currentBufferLength = this.bufferLength;
+    var buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize);
+    for (i = 0; i < blockSize; i++) {
+      var code = this.readBits(codeLength);
+      var hasPrev = currentSequenceLength > 0;
+      if (code < 256) {
+        currentSequence[0] = code;
+        currentSequenceLength = 1;
+      } else if (code >= 258) {
+        if (code < nextCode) {
+          currentSequenceLength = dictionaryLengths[code];
+          for (j = currentSequenceLength - 1, q = code; j >= 0; j--) {
+            currentSequence[j] = dictionaryValues[q];
+            q = dictionaryPrevCodes[q];
+          }
+        } else {
+          currentSequence[currentSequenceLength++] = currentSequence[0];
+        }
+      } else if (code === 256) {
+        codeLength = 9;
+        nextCode = 258;
+        currentSequenceLength = 0;
+        continue;
+      } else {
+        this.eof = true;
+        delete this.lzwState;
+        break;
+      }
+      if (hasPrev) {
+        dictionaryPrevCodes[nextCode] = prevCode;
+        dictionaryLengths[nextCode] = dictionaryLengths[prevCode] + 1;
+        dictionaryValues[nextCode] = currentSequence[0];
+        nextCode++;
+        codeLength = nextCode + earlyChange & nextCode + earlyChange - 1 ? codeLength : Math.min(Math.log(nextCode + earlyChange) / 0.6931471805599453 + 1, 12) | 0;
+      }
+      prevCode = code;
+      decodedLength += currentSequenceLength;
+      if (estimatedDecodedSize < decodedLength) {
+        do {
+          estimatedDecodedSize += decodedSizeDelta;
+        } while (estimatedDecodedSize < decodedLength);
+        buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize);
+      }
+      for (j = 0; j < currentSequenceLength; j++) {
+        buffer[currentBufferLength++] = currentSequence[j];
+      }
+    }
+    lzwState.nextCode = nextCode;
+    lzwState.codeLength = codeLength;
+    lzwState.prevCode = prevCode;
+    lzwState.currentSequenceLength = currentSequenceLength;
+    this.bufferLength = currentBufferLength;
+  };
+  return LZWStream;
+}();
+var NullStream = function NullStreamClosure() {
+  function NullStream() {
+    Stream.call(this, new Uint8Array(0));
+  }
+  NullStream.prototype = Stream.prototype;
+  return NullStream;
+}();
+exports.Ascii85Stream = Ascii85Stream;
+exports.AsciiHexStream = AsciiHexStream;
+exports.DecryptStream = DecryptStream;
+exports.DecodeStream = DecodeStream;
+exports.FlateStream = FlateStream;
+exports.NullStream = NullStream;
+exports.PredictorStream = PredictorStream;
+exports.RunLengthStream = RunLengthStream;
+exports.Stream = Stream;
+exports.StreamsSequenceStream = StreamsSequenceStream;
+exports.StringStream = StringStream;
+exports.LZWStream = LZWStream;
+
+/***/ }),
+/* 141 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.CCITTFaxStream = undefined;
+
+var _primitives = __w_pdfjs_require__(138);
+
+var _ccitt = __w_pdfjs_require__(142);
+
+var _stream = __w_pdfjs_require__(140);
+
+var CCITTFaxStream = function CCITTFaxStreamClosure() {
+  function CCITTFaxStream(str, maybeLength, params) {
+    this.str = str;
+    this.dict = str.dict;
+    if (!(0, _primitives.isDict)(params)) {
+      params = _primitives.Dict.empty;
+    }
+    var source = {
+      next: function next() {
+        return str.getByte();
+      }
+    };
+    this.ccittFaxDecoder = new _ccitt.CCITTFaxDecoder(source, {
+      K: params.get('K'),
+      EndOfLine: params.get('EndOfLine'),
+      EncodedByteAlign: params.get('EncodedByteAlign'),
+      Columns: params.get('Columns'),
+      Rows: params.get('Rows'),
+      EndOfBlock: params.get('EndOfBlock'),
+      BlackIs1: params.get('BlackIs1')
+    });
+    _stream.DecodeStream.call(this, maybeLength);
+  }
+  CCITTFaxStream.prototype = Object.create(_stream.DecodeStream.prototype);
+  CCITTFaxStream.prototype.readBlock = function () {
+    while (!this.eof) {
+      var c = this.ccittFaxDecoder.readNextChar();
+      if (c === -1) {
+        this.eof = true;
+        return;
+      }
+      this.ensureBuffer(this.bufferLength + 1);
+      this.buffer[this.bufferLength++] = c;
+    }
+  };
+  return CCITTFaxStream;
+}();
+exports.CCITTFaxStream = CCITTFaxStream;
+
+/***/ }),
+/* 142 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.CCITTFaxDecoder = undefined;
+
+var _util = __w_pdfjs_require__(2);
+
+var CCITTFaxDecoder = function CCITTFaxDecoder() {
+  var ccittEOL = -2;
+  var ccittEOF = -1;
+  var twoDimPass = 0;
+  var twoDimHoriz = 1;
+  var twoDimVert0 = 2;
+  var twoDimVertR1 = 3;
+  var twoDimVertL1 = 4;
+  var twoDimVertR2 = 5;
+  var twoDimVertL2 = 6;
+  var twoDimVertR3 = 7;
+  var twoDimVertL3 = 8;
+  var twoDimTable = [[-1, -1], [-1, -1], [7, twoDimVertL3], [7, twoDimVertR3], [6, twoDimVertL2], [6, twoDimVertL2], [6, twoDimVertR2], [6, twoDimVertR2], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [4, twoDimPass], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimHoriz], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertL1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [3, twoDimVertR1], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0], [1, twoDimVert0]];
+  var whiteTable1 = [[-1, -1], [12, ccittEOL], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [11, 1792], [11, 1792], [12, 1984], [12, 2048], [12, 2112], [12, 2176], [12, 2240], [12, 2304], [11, 1856], [11, 1856], [11, 1920], [11, 1920], [12, 2368], [12, 2432], [12, 2496], [12, 2560]];
+  var whiteTable2 = [[-1, -1], [-1, -1], [-1, -1], [-1, -1], [8, 29], [8, 29], [8, 30], [8, 30], [8, 45], [8, 45], [8, 46], [8, 46], [7, 22], [7, 22], [7, 22], [7, 22], [7, 23], [7, 23], [7, 23], [7, 23], [8, 47], [8, 47], [8, 48], [8, 48], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [6, 13], [7, 20], [7, 20], [7, 20], [7, 20], [8, 33], [8, 33], [8, 34], [8, 34], [8, 35], [8, 35], [8, 36], [8, 36], [8, 37], [8, 37], [8, 38], [8, 38], [7, 19], [7, 19], [7, 19], [7, 19], [8, 31], [8, 31], [8, 32], [8, 32], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 1], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], [6, 12], [8, 53], [8, 53], [8, 54], [8, 54], [7, 26], [7, 26], [7, 26], [7, 26], [8, 39], [8, 39], [8, 40], [8, 40], [8, 41], [8, 41], [8, 42], [8, 42], [8, 43], [8, 43], [8, 44], [8, 44], [7, 21], [7, 21], [7, 21], [7, 21], [7, 28], [7, 28], [7, 28], [7, 28], [8, 61], [8, 61], [8, 62], [8, 62], [8, 63], [8, 63], [8, 0], [8, 0], [8, 320], [8, 320], [8, 384], [8, 384], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 10], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [5, 11], [7, 27], [7, 27], [7, 27], [7, 27], [8, 59], [8, 59], [8, 60], [8, 60], [9, 1472], [9, 1536], [9, 1600], [9, 1728], [7, 18], [7, 18], [7, 18], [7, 18], [7, 24], [7, 24], [7, 24], [7, 24], [8, 49], [8, 49], [8, 50], [8, 50], [8, 51], [8, 51], [8, 52], [8, 52], [7, 25], [7, 25], [7, 25], [7, 25], [8, 55], [8, 55], [8, 56], [8, 56], [8, 57], [8, 57], [8, 58], [8, 58], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 192], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [6, 1664], [8, 448], [8, 448], [8, 512], [8, 512], [9, 704], [9, 768], [8, 640], [8, 640], [8, 576], [8, 576], [9, 832], [9, 896], [9, 960], [9, 1024], [9, 1088], [9, 1152], [9, 1216], [9, 1280], [9, 1344], [9, 1408], [7, 256], [7, 256], [7, 256], [7, 256], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 2], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [4, 3], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 128], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 8], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [5, 9], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 16], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [6, 17], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 14], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [6, 15], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [5, 64], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 6], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7], [4, 7]];
+  var blackTable1 = [[-1, -1], [-1, -1], [12, ccittEOL], [12, ccittEOL], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [-1, -1], [11, 1792], [11, 1792], [11, 1792], [11, 1792], [12, 1984], [12, 1984], [12, 2048], [12, 2048], [12, 2112], [12, 2112], [12, 2176], [12, 2176], [12, 2240], [12, 2240], [12, 2304], [12, 2304], [11, 1856], [11, 1856], [11, 1856], [11, 1856], [11, 1920], [11, 1920], [11, 1920], [11, 1920], [12, 2368], [12, 2368], [12, 2432], [12, 2432], [12, 2496], [12, 2496], [12, 2560], [12, 2560], [10, 18], [10, 18], [10, 18], [10, 18], [10, 18], [10, 18], [10, 18], [10, 18], [12, 52], [12, 52], [13, 640], [13, 704], [13, 768], [13, 832], [12, 55], [12, 55], [12, 56], [12, 56], [13, 1280], [13, 1344], [13, 1408], [13, 1472], [12, 59], [12, 59], [12, 60], [12, 60], [13, 1536], [13, 1600], [11, 24], [11, 24], [11, 24], [11, 24], [11, 25], [11, 25], [11, 25], [11, 25], [13, 1664], [13, 1728], [12, 320], [12, 320], [12, 384], [12, 384], [12, 448], [12, 448], [13, 512], [13, 576], [12, 53], [12, 53], [12, 54], [12, 54], [13, 896], [13, 960], [13, 1024], [13, 1088], [13, 1152], [13, 1216], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64], [10, 64]];
+  var blackTable2 = [[8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [8, 13], [11, 23], [11, 23], [12, 50], [12, 51], [12, 44], [12, 45], [12, 46], [12, 47], [12, 57], [12, 58], [12, 61], [12, 256], [10, 16], [10, 16], [10, 16], [10, 16], [10, 17], [10, 17], [10, 17], [10, 17], [12, 48], [12, 49], [12, 62], [12, 63], [12, 30], [12, 31], [12, 32], [12, 33], [12, 40], [12, 41], [11, 22], [11, 22], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [8, 14], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 10], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [7, 11], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [9, 15], [12, 128], [12, 192], [12, 26], [12, 27], [12, 28], [12, 29], [11, 19], [11, 19], [11, 20], [11, 20], [12, 34], [12, 35], [12, 36], [12, 37], [12, 38], [12, 39], [11, 21], [11, 21], [12, 42], [12, 43], [10, 0], [10, 0], [10, 0], [10, 0], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12], [7, 12]];
+  var blackTable3 = [[-1, -1], [-1, -1], [-1, -1], [-1, -1], [6, 9], [6, 8], [5, 7], [5, 7], [4, 6], [4, 6], [4, 6], [4, 6], [4, 5], [4, 5], [4, 5], [4, 5], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 1], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2]];
+  function CCITTFaxDecoder(source) {
+    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+    if (!source || typeof source.next !== 'function') {
+      throw new Error('CCITTFaxDecoder - invalid "source" parameter.');
+    }
+    this.source = source;
+    this.eof = false;
+    this.encoding = options['K'] || 0;
+    this.eoline = options['EndOfLine'] || false;
+    this.byteAlign = options['EncodedByteAlign'] || false;
+    this.columns = options['Columns'] || 1728;
+    this.rows = options['Rows'] || 0;
+    var eoblock = options['EndOfBlock'];
+    if (eoblock === null || eoblock === undefined) {
+      eoblock = true;
+    }
+    this.eoblock = eoblock;
+    this.black = options['BlackIs1'] || false;
+    this.codingLine = new Uint32Array(this.columns + 1);
+    this.refLine = new Uint32Array(this.columns + 2);
+    this.codingLine[0] = this.columns;
+    this.codingPos = 0;
+    this.row = 0;
+    this.nextLine2D = this.encoding < 0;
+    this.inputBits = 0;
+    this.inputBuf = 0;
+    this.outputBits = 0;
+    this.rowsDone = false;
+    var code1 = void 0;
+    while ((code1 = this._lookBits(12)) === 0) {
+      this._eatBits(1);
+    }
+    if (code1 === 1) {
+      this._eatBits(12);
+    }
+    if (this.encoding > 0) {
+      this.nextLine2D = !this._lookBits(1);
+      this._eatBits(1);
+    }
+  }
+  CCITTFaxDecoder.prototype = {
+    readNextChar: function readNextChar() {
+      if (this.eof) {
+        return -1;
+      }
+      var refLine = this.refLine;
+      var codingLine = this.codingLine;
+      var columns = this.columns;
+      var refPos = void 0,
+          blackPixels = void 0,
+          bits = void 0,
+          i = void 0;
+      if (this.outputBits === 0) {
+        if (this.rowsDone) {
+          this.eof = true;
+        }
+        if (this.eof) {
+          return -1;
+        }
+        this.err = false;
+        var code1 = void 0,
+            code2 = void 0,
+            code3 = void 0;
+        if (this.nextLine2D) {
+          for (i = 0; codingLine[i] < columns; ++i) {
+            refLine[i] = codingLine[i];
+          }
+          refLine[i++] = columns;
+          refLine[i] = columns;
+          codingLine[0] = 0;
+          this.codingPos = 0;
+          refPos = 0;
+          blackPixels = 0;
+          while (codingLine[this.codingPos] < columns) {
+            code1 = this._getTwoDimCode();
+            switch (code1) {
+              case twoDimPass:
+                this._addPixels(refLine[refPos + 1], blackPixels);
+                if (refLine[refPos + 1] < columns) {
+                  refPos += 2;
+                }
+                break;
+              case twoDimHoriz:
+                code1 = code2 = 0;
+                if (blackPixels) {
+                  do {
+                    code1 += code3 = this._getBlackCode();
+                  } while (code3 >= 64);
+                  do {
+                    code2 += code3 = this._getWhiteCode();
+                  } while (code3 >= 64);
+                } else {
+                  do {
+                    code1 += code3 = this._getWhiteCode();
+                  } while (code3 >= 64);
+                  do {
+                    code2 += code3 = this._getBlackCode();
+                  } while (code3 >= 64);
+                }
+                this._addPixels(codingLine[this.codingPos] + code1, blackPixels);
+                if (codingLine[this.codingPos] < columns) {
+                  this._addPixels(codingLine[this.codingPos] + code2, blackPixels ^ 1);
+                }
+                while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {
+                  refPos += 2;
+                }
+                break;
+              case twoDimVertR3:
+                this._addPixels(refLine[refPos] + 3, blackPixels);
+                blackPixels ^= 1;
+                if (codingLine[this.codingPos] < columns) {
+                  ++refPos;
+                  while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {
+                    refPos += 2;
+                  }
+                }
+                break;
+              case twoDimVertR2:
+                this._addPixels(refLine[refPos] + 2, blackPixels);
+                blackPixels ^= 1;
+                if (codingLine[this.codingPos] < columns) {
+                  ++refPos;
+                  while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {
+                    refPos += 2;
+                  }
+                }
+                break;
+              case twoDimVertR1:
+                this._addPixels(refLine[refPos] + 1, blackPixels);
+                blackPixels ^= 1;
+                if (codingLine[this.codingPos] < columns) {
+                  ++refPos;
+                  while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {
+                    refPos += 2;
+                  }
+                }
+                break;
+              case twoDimVert0:
+                this._addPixels(refLine[refPos], blackPixels);
+                blackPixels ^= 1;
+                if (codingLine[this.codingPos] < columns) {
+                  ++refPos;
+                  while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {
+                    refPos += 2;
+                  }
+                }
+                break;
+              case twoDimVertL3:
+                this._addPixelsNeg(refLine[refPos] - 3, blackPixels);
+                blackPixels ^= 1;
+                if (codingLine[this.codingPos] < columns) {
+                  if (refPos > 0) {
+                    --refPos;
+                  } else {
+                    ++refPos;
+                  }
+                  while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {
+                    refPos += 2;
+                  }
+                }
+                break;
+              case twoDimVertL2:
+                this._addPixelsNeg(refLine[refPos] - 2, blackPixels);
+                blackPixels ^= 1;
+                if (codingLine[this.codingPos] < columns) {
+                  if (refPos > 0) {
+                    --refPos;
+                  } else {
+                    ++refPos;
+                  }
+                  while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {
+                    refPos += 2;
+                  }
+                }
+                break;
+              case twoDimVertL1:
+                this._addPixelsNeg(refLine[refPos] - 1, blackPixels);
+                blackPixels ^= 1;
+                if (codingLine[this.codingPos] < columns) {
+                  if (refPos > 0) {
+                    --refPos;
+                  } else {
+                    ++refPos;
+                  }
+                  while (refLine[refPos] <= codingLine[this.codingPos] && refLine[refPos] < columns) {
+                    refPos += 2;
+                  }
+                }
+                break;
+              case ccittEOF:
+                this._addPixels(columns, 0);
+                this.eof = true;
+                break;
+              default:
+                (0, _util.info)('bad 2d code');
+                this._addPixels(columns, 0);
+                this.err = true;
+            }
+          }
+        } else {
+          codingLine[0] = 0;
+          this.codingPos = 0;
+          blackPixels = 0;
+          while (codingLine[this.codingPos] < columns) {
+            code1 = 0;
+            if (blackPixels) {
+              do {
+                code1 += code3 = this._getBlackCode();
+              } while (code3 >= 64);
+            } else {
+              do {
+                code1 += code3 = this._getWhiteCode();
+              } while (code3 >= 64);
+            }
+            this._addPixels(codingLine[this.codingPos] + code1, blackPixels);
+            blackPixels ^= 1;
+          }
+        }
+        var gotEOL = false;
+        if (this.byteAlign) {
+          this.inputBits &= ~7;
+        }
+        if (!this.eoblock && this.row === this.rows - 1) {
+          this.rowsDone = true;
+        } else {
+          code1 = this._lookBits(12);
+          if (this.eoline) {
+            while (code1 !== ccittEOF && code1 !== 1) {
+              this._eatBits(1);
+              code1 = this._lookBits(12);
+            }
+          } else {
+            while (code1 === 0) {
+              this._eatBits(1);
+              code1 = this._lookBits(12);
+            }
+          }
+          if (code1 === 1) {
+            this._eatBits(12);
+            gotEOL = true;
+          } else if (code1 === ccittEOF) {
+            this.eof = true;
+          }
+        }
+        if (!this.eof && this.encoding > 0 && !this.rowsDone) {
+          this.nextLine2D = !this._lookBits(1);
+          this._eatBits(1);
+        }
+        if (this.eoblock && gotEOL && this.byteAlign) {
+          code1 = this._lookBits(12);
+          if (code1 === 1) {
+            this._eatBits(12);
+            if (this.encoding > 0) {
+              this._lookBits(1);
+              this._eatBits(1);
+            }
+            if (this.encoding >= 0) {
+              for (i = 0; i < 4; ++i) {
+                code1 = this._lookBits(12);
+                if (code1 !== 1) {
+                  (0, _util.info)('bad rtc code: ' + code1);
+                }
+                this._eatBits(12);
+                if (this.encoding > 0) {
+                  this._lookBits(1);
+                  this._eatBits(1);
+                }
+              }
+            }
+            this.eof = true;
+          }
+        } else if (this.err && this.eoline) {
+          while (true) {
+            code1 = this._lookBits(13);
+            if (code1 === ccittEOF) {
+              this.eof = true;
+              return -1;
+            }
+            if (code1 >> 1 === 1) {
+              break;
+            }
+            this._eatBits(1);
+          }
+          this._eatBits(12);
+          if (this.encoding > 0) {
+            this._eatBits(1);
+            this.nextLine2D = !(code1 & 1);
+          }
+        }
+        if (codingLine[0] > 0) {
+          this.outputBits = codingLine[this.codingPos = 0];
+        } else {
+          this.outputBits = codingLine[this.codingPos = 1];
+        }
+        this.row++;
+      }
+      var c = void 0;
+      if (this.outputBits >= 8) {
+        c = this.codingPos & 1 ? 0 : 0xFF;
+        this.outputBits -= 8;
+        if (this.outputBits === 0 && codingLine[this.codingPos] < columns) {
+          this.codingPos++;
+          this.outputBits = codingLine[this.codingPos] - codingLine[this.codingPos - 1];
+        }
+      } else {
+        bits = 8;
+        c = 0;
+        do {
+          if (this.outputBits > bits) {
+            c <<= bits;
+            if (!(this.codingPos & 1)) {
+              c |= 0xFF >> 8 - bits;
+            }
+            this.outputBits -= bits;
+            bits = 0;
+          } else {
+            c <<= this.outputBits;
+            if (!(this.codingPos & 1)) {
+              c |= 0xFF >> 8 - this.outputBits;
+            }
+            bits -= this.outputBits;
+            this.outputBits = 0;
+            if (codingLine[this.codingPos] < columns) {
+              this.codingPos++;
+              this.outputBits = codingLine[this.codingPos] - codingLine[this.codingPos - 1];
+            } else if (bits > 0) {
+              c <<= bits;
+              bits = 0;
+            }
+          }
+        } while (bits);
+      }
+      if (this.black) {
+        c ^= 0xFF;
+      }
+      return c;
+    },
+    _addPixels: function _addPixels(a1, blackPixels) {
+      var codingLine = this.codingLine;
+      var codingPos = this.codingPos;
+      if (a1 > codingLine[codingPos]) {
+        if (a1 > this.columns) {
+          (0, _util.info)('row is wrong length');
+          this.err = true;
+          a1 = this.columns;
+        }
+        if (codingPos & 1 ^ blackPixels) {
+          ++codingPos;
+        }
+        codingLine[codingPos] = a1;
+      }
+      this.codingPos = codingPos;
+    },
+    _addPixelsNeg: function _addPixelsNeg(a1, blackPixels) {
+      var codingLine = this.codingLine;
+      var codingPos = this.codingPos;
+      if (a1 > codingLine[codingPos]) {
+        if (a1 > this.columns) {
+          (0, _util.info)('row is wrong length');
+          this.err = true;
+          a1 = this.columns;
+        }
+        if (codingPos & 1 ^ blackPixels) {
+          ++codingPos;
+        }
+        codingLine[codingPos] = a1;
+      } else if (a1 < codingLine[codingPos]) {
+        if (a1 < 0) {
+          (0, _util.info)('invalid code');
+          this.err = true;
+          a1 = 0;
+        }
+        while (codingPos > 0 && a1 < codingLine[codingPos - 1]) {
+          --codingPos;
+        }
+        codingLine[codingPos] = a1;
+      }
+      this.codingPos = codingPos;
+    },
+    _findTableCode: function _findTableCode(start, end, table, limit) {
+      var limitValue = limit || 0;
+      for (var i = start; i <= end; ++i) {
+        var code = this._lookBits(i);
+        if (code === ccittEOF) {
+          return [true, 1, false];
+        }
+        if (i < end) {
+          code <<= end - i;
+        }
+        if (!limitValue || code >= limitValue) {
+          var p = table[code - limitValue];
+          if (p[0] === i) {
+            this._eatBits(i);
+            return [true, p[1], true];
+          }
+        }
+      }
+      return [false, 0, false];
+    },
+    _getTwoDimCode: function _getTwoDimCode() {
+      var code = 0;
+      var p = void 0;
+      if (this.eoblock) {
+        code = this._lookBits(7);
+        p = twoDimTable[code];
+        if (p && p[0] > 0) {
+          this._eatBits(p[0]);
+          return p[1];
+        }
+      } else {
+        var result = this._findTableCode(1, 7, twoDimTable);
+        if (result[0] && result[2]) {
+          return result[1];
+        }
+      }
+      (0, _util.info)('Bad two dim code');
+      return ccittEOF;
+    },
+    _getWhiteCode: function _getWhiteCode() {
+      var code = 0;
+      var p = void 0;
+      if (this.eoblock) {
+        code = this._lookBits(12);
+        if (code === ccittEOF) {
+          return 1;
+        }
+        if (code >> 5 === 0) {
+          p = whiteTable1[code];
+        } else {
+          p = whiteTable2[code >> 3];
+        }
+        if (p[0] > 0) {
+          this._eatBits(p[0]);
+          return p[1];
+        }
+      } else {
+        var result = this._findTableCode(1, 9, whiteTable2);
+        if (result[0]) {
+          return result[1];
+        }
+        result = this._findTableCode(11, 12, whiteTable1);
+        if (result[0]) {
+          return result[1];
+        }
+      }
+      (0, _util.info)('bad white code');
+      this._eatBits(1);
+      return 1;
+    },
+    _getBlackCode: function _getBlackCode() {
+      var code = void 0,
+          p = void 0;
+      if (this.eoblock) {
+        code = this._lookBits(13);
+        if (code === ccittEOF) {
+          return 1;
+        }
+        if (code >> 7 === 0) {
+          p = blackTable1[code];
+        } else if (code >> 9 === 0 && code >> 7 !== 0) {
+          p = blackTable2[(code >> 1) - 64];
+        } else {
+          p = blackTable3[code >> 7];
+        }
+        if (p[0] > 0) {
+          this._eatBits(p[0]);
+          return p[1];
+        }
+      } else {
+        var result = this._findTableCode(2, 6, blackTable3);
+        if (result[0]) {
+          return result[1];
+        }
+        result = this._findTableCode(7, 12, blackTable2, 64);
+        if (result[0]) {
+          return result[1];
+        }
+        result = this._findTableCode(10, 13, blackTable1);
+        if (result[0]) {
+          return result[1];
+        }
+      }
+      (0, _util.info)('bad black code');
+      this._eatBits(1);
+      return 1;
+    },
+    _lookBits: function _lookBits(n) {
+      var c = void 0;
+      while (this.inputBits < n) {
+        if ((c = this.source.next()) === -1) {
+          if (this.inputBits === 0) {
+            return ccittEOF;
+          }
+          return this.inputBuf << n - this.inputBits & 0xFFFF >> 16 - n;
+        }
+        this.inputBuf = this.inputBuf << 8 | c;
+        this.inputBits += 8;
+      }
+      return this.inputBuf >> this.inputBits - n & 0xFFFF >> 16 - n;
+    },
+    _eatBits: function _eatBits(n) {
+      if ((this.inputBits -= n) < 0) {
+        this.inputBits = 0;
+      }
+    }
+  };
+  return CCITTFaxDecoder;
+}();
+exports.CCITTFaxDecoder = CCITTFaxDecoder;
+
+/***/ }),
+/* 143 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.Jbig2Stream = undefined;
+
+var _primitives = __w_pdfjs_require__(138);
+
+var _stream = __w_pdfjs_require__(140);
+
+var _jbig = __w_pdfjs_require__(144);
+
+var _util = __w_pdfjs_require__(2);
+
+var Jbig2Stream = function Jbig2StreamClosure() {
+  function Jbig2Stream(stream, maybeLength, dict, params) {
+    this.stream = stream;
+    this.maybeLength = maybeLength;
+    this.dict = dict;
+    this.params = params;
+    _stream.DecodeStream.call(this, maybeLength);
+  }
+  Jbig2Stream.prototype = Object.create(_stream.DecodeStream.prototype);
+  Object.defineProperty(Jbig2Stream.prototype, 'bytes', {
+    get: function get() {
+      return (0, _util.shadow)(this, 'bytes', this.stream.getBytes(this.maybeLength));
+    },
+
+    configurable: true
+  });
+  Jbig2Stream.prototype.ensureBuffer = function (requested) {};
+  Jbig2Stream.prototype.readBlock = function () {
+    if (this.eof) {
+      return;
+    }
+    var jbig2Image = new _jbig.Jbig2Image();
+    var chunks = [];
+    if ((0, _primitives.isDict)(this.params)) {
+      var globalsStream = this.params.get('JBIG2Globals');
+      if ((0, _primitives.isStream)(globalsStream)) {
+        var globals = globalsStream.getBytes();
+        chunks.push({
+          data: globals,
+          start: 0,
+          end: globals.length
+        });
+      }
+    }
+    chunks.push({
+      data: this.bytes,
+      start: 0,
+      end: this.bytes.length
+    });
+    var data = jbig2Image.parseChunks(chunks);
+    var dataLength = data.length;
+    for (var i = 0; i < dataLength; i++) {
+      data[i] ^= 0xFF;
+    }
+    this.buffer = data;
+    this.bufferLength = dataLength;
+    this.eof = true;
+  };
+  return Jbig2Stream;
+}();
+exports.Jbig2Stream = Jbig2Stream;
+
+/***/ }),
+/* 144 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.Jbig2Image = undefined;
+
+var _util = __w_pdfjs_require__(2);
+
+var _arithmetic_decoder = __w_pdfjs_require__(145);
+
+var _ccitt = __w_pdfjs_require__(142);
+
+var Jbig2Error = function Jbig2ErrorClosure() {
+  function Jbig2Error(msg) {
+    this.message = 'JBIG2 error: ' + msg;
+  }
+  Jbig2Error.prototype = new Error();
+  Jbig2Error.prototype.name = 'Jbig2Error';
+  Jbig2Error.constructor = Jbig2Error;
+  return Jbig2Error;
+}();
+var Jbig2Image = function Jbig2ImageClosure() {
+  function ContextCache() {}
+  ContextCache.prototype = {
+    getContexts: function getContexts(id) {
+      if (id in this) {
+        return this[id];
+      }
+      return this[id] = new Int8Array(1 << 16);
+    }
+  };
+  function DecodingContext(data, start, end) {
+    this.data = data;
+    this.start = start;
+    this.end = end;
+  }
+  DecodingContext.prototype = {
+    get decoder() {
+      var decoder = new _arithmetic_decoder.ArithmeticDecoder(this.data, this.start, this.end);
+      return (0, _util.shadow)(this, 'decoder', decoder);
+    },
+    get contextCache() {
+      var cache = new ContextCache();
+      return (0, _util.shadow)(this, 'contextCache', cache);
+    }
+  };
+  function decodeInteger(contextCache, procedure, decoder) {
+    var contexts = contextCache.getContexts(procedure);
+    var prev = 1;
+    function readBits(length) {
+      var v = 0;
+      for (var i = 0; i < length; i++) {
+        var bit = decoder.readBit(contexts, prev);
+        prev = prev < 256 ? prev << 1 | bit : (prev << 1 | bit) & 511 | 256;
+        v = v << 1 | bit;
+      }
+      return v >>> 0;
+    }
+    var sign = readBits(1);
+    var value = readBits(1) ? readBits(1) ? readBits(1) ? readBits(1) ? readBits(1) ? readBits(32) + 4436 : readBits(12) + 340 : readBits(8) + 84 : readBits(6) + 20 : readBits(4) + 4 : readBits(2);
+    return sign === 0 ? value : value > 0 ? -value : null;
+  }
+  function decodeIAID(contextCache, decoder, codeLength) {
+    var contexts = contextCache.getContexts('IAID');
+    var prev = 1;
+    for (var i = 0; i < codeLength; i++) {
+      var bit = decoder.readBit(contexts, prev);
+      prev = prev << 1 | bit;
+    }
+    if (codeLength < 31) {
+      return prev & (1 << codeLength) - 1;
+    }
+    return prev & 0x7FFFFFFF;
+  }
+  var SegmentTypes = ['SymbolDictionary', null, null, null, 'IntermediateTextRegion', null, 'ImmediateTextRegion', 'ImmediateLosslessTextRegion', null, null, null, null, null, null, null, null, 'PatternDictionary', null, null, null, 'IntermediateHalftoneRegion', null, 'ImmediateHalftoneRegion', 'ImmediateLosslessHalftoneRegion', null, null, null, null, null, null, null, null, null, null, null, null, 'IntermediateGenericRegion', null, 'ImmediateGenericRegion', 'ImmediateLosslessGenericRegion', 'IntermediateGenericRefinementRegion', null, 'ImmediateGenericRefinementRegion', 'ImmediateLosslessGenericRefinementRegion', null, null, null, null, 'PageInformation', 'EndOfPage', 'EndOfStripe', 'EndOfFile', 'Profiles', 'Tables', null, null, null, null, null, null, null, null, 'Extension'];
+  var CodingTemplates = [[{
+    x: -1,
+    y: -2
+  }, {
+    x: 0,
+    y: -2
+  }, {
+    x: 1,
+    y: -2
+  }, {
+    x: -2,
+    y: -1
+  }, {
+    x: -1,
+    y: -1
+  }, {
+    x: 0,
+    y: -1
+  }, {
+    x: 1,
+    y: -1
+  }, {
+    x: 2,
+    y: -1
+  }, {
+    x: -4,
+    y: 0
+  }, {
+    x: -3,
+    y: 0
+  }, {
+    x: -2,
+    y: 0
+  }, {
+    x: -1,
+    y: 0
+  }], [{
+    x: -1,
+    y: -2
+  }, {
+    x: 0,
+    y: -2
+  }, {
+    x: 1,
+    y: -2
+  }, {
+    x: 2,
+    y: -2
+  }, {
+    x: -2,
+    y: -1
+  }, {
+    x: -1,
+    y: -1
+  }, {
+    x: 0,
+    y: -1
+  }, {
+    x: 1,
+    y: -1
+  }, {
+    x: 2,
+    y: -1
+  }, {
+    x: -3,
+    y: 0
+  }, {
+    x: -2,
+    y: 0
+  }, {
+    x: -1,
+    y: 0
+  }], [{
+    x: -1,
+    y: -2
+  }, {
+    x: 0,
+    y: -2
+  }, {
+    x: 1,
+    y: -2
+  }, {
+    x: -2,
+    y: -1
+  }, {
+    x: -1,
+    y: -1
+  }, {
+    x: 0,
+    y: -1
+  }, {
+    x: 1,
+    y: -1
+  }, {
+    x: -2,
+    y: 0
+  }, {
+    x: -1,
+    y: 0
+  }], [{
+    x: -3,
+    y: -1
+  }, {
+    x: -2,
+    y: -1
+  }, {
+    x: -1,
+    y: -1
+  }, {
+    x: 0,
+    y: -1
+  }, {
+    x: 1,
+    y: -1
+  }, {
+    x: -4,
+    y: 0
+  }, {
+    x: -3,
+    y: 0
+  }, {
+    x: -2,
+    y: 0
+  }, {
+    x: -1,
+    y: 0
+  }]];
+  var RefinementTemplates = [{
+    coding: [{
+      x: 0,
+      y: -1
+    }, {
+      x: 1,
+      y: -1
+    }, {
+      x: -1,
+      y: 0
+    }],
+    reference: [{
+      x: 0,
+      y: -1
+    }, {
+      x: 1,
+      y: -1
+    }, {
+      x: -1,
+      y: 0
+    }, {
+      x: 0,
+      y: 0
+    }, {
+      x: 1,
+      y: 0
+    }, {
+      x: -1,
+      y: 1
+    }, {
+      x: 0,
+      y: 1
+    }, {
+      x: 1,
+      y: 1
+    }]
+  }, {
+    coding: [{
+      x: -1,
+      y: -1
+    }, {
+      x: 0,
+      y: -1
+    }, {
+      x: 1,
+      y: -1
+    }, {
+      x: -1,
+      y: 0
+    }],
+    reference: [{
+      x: 0,
+      y: -1
+    }, {
+      x: -1,
+      y: 0
+    }, {
+      x: 0,
+      y: 0
+    }, {
+      x: 1,
+      y: 0
+    }, {
+      x: 0,
+      y: 1
+    }, {
+      x: 1,
+      y: 1
+    }]
+  }];
+  var ReusedContexts = [0x9B25, 0x0795, 0x00E5, 0x0195];
+  var RefinementReusedContexts = [0x0020, 0x0008];
+  function decodeBitmapTemplate0(width, height, decodingContext) {
+    var decoder = decodingContext.decoder;
+    var contexts = decodingContext.contextCache.getContexts('GB');
+    var contextLabel,
+        i,
+        j,
+        pixel,
+        row,
+        row1,
+        row2,
+        bitmap = [];
+    var OLD_PIXEL_MASK = 0x7BF7;
+    for (i = 0; i < height; i++) {
+      row = bitmap[i] = new Uint8Array(width);
+      row1 = i < 1 ? row : bitmap[i - 1];
+      row2 = i < 2 ? row : bitmap[i - 2];
+      contextLabel = row2[0] << 13 | row2[1] << 12 | row2[2] << 11 | row1[0] << 7 | row1[1] << 6 | row1[2] << 5 | row1[3] << 4;
+      for (j = 0; j < width; j++) {
+        row[j] = pixel = decoder.readBit(contexts, contextLabel);
+        contextLabel = (contextLabel & OLD_PIXEL_MASK) << 1 | (j + 3 < width ? row2[j + 3] << 11 : 0) | (j + 4 < width ? row1[j + 4] << 4 : 0) | pixel;
+      }
+    }
+    return bitmap;
+  }
+  function decodeBitmap(mmr, width, height, templateIndex, prediction, skip, at, decodingContext) {
+    if (mmr) {
+      var input = new Reader(decodingContext.data, decodingContext.start, decodingContext.end);
+      return decodeMMRBitmap(input, width, height, false);
+    }
+    if (templateIndex === 0 && !skip && !prediction && at.length === 4 && at[0].x === 3 && at[0].y === -1 && at[1].x === -3 && at[1].y === -1 && at[2].x === 2 && at[2].y === -2 && at[3].x === -2 && at[3].y === -2) {
+      return decodeBitmapTemplate0(width, height, decodingContext);
+    }
+    var useskip = !!skip;
+    var template = CodingTemplates[templateIndex].concat(at);
+    template.sort(function (a, b) {
+      return a.y - b.y || a.x - b.x;
+    });
+    var templateLength = template.length;
+    var templateX = new Int8Array(templateLength);
+    var templateY = new Int8Array(templateLength);
+    var changingTemplateEntries = [];
+    var reuseMask = 0,
+        minX = 0,
+        maxX = 0,
+        minY = 0;
+    var c, k;
+    for (k = 0; k < templateLength; k++) {
+      templateX[k] = template[k].x;
+      templateY[k] = template[k].y;
+      minX = Math.min(minX, template[k].x);
+      maxX = Math.max(maxX, template[k].x);
+      minY = Math.min(minY, template[k].y);
+      if (k < templateLength - 1 && template[k].y === template[k + 1].y && template[k].x === template[k + 1].x - 1) {
+        reuseMask |= 1 << templateLength - 1 - k;
+      } else {
+        changingTemplateEntries.push(k);
+      }
+    }
+    var changingEntriesLength = changingTemplateEntries.length;
+    var changingTemplateX = new Int8Array(changingEntriesLength);
+    var changingTemplateY = new Int8Array(changingEntriesLength);
+    var changingTemplateBit = new Uint16Array(changingEntriesLength);
+    for (c = 0; c < changingEntriesLength; c++) {
+      k = changingTemplateEntries[c];
+      changingTemplateX[c] = template[k].x;
+      changingTemplateY[c] = template[k].y;
+      changingTemplateBit[c] = 1 << templateLength - 1 - k;
+    }
+    var sbb_left = -minX;
+    var sbb_top = -minY;
+    var sbb_right = width - maxX;
+    var pseudoPixelContext = ReusedContexts[templateIndex];
+    var row = new Uint8Array(width);
+    var bitmap = [];
+    var decoder = decodingContext.decoder;
+    var contexts = decodingContext.contextCache.getContexts('GB');
+    var ltp = 0,
+        j,
+        i0,
+        j0,
+        contextLabel = 0,
+        bit,
+        shift;
+    for (var i = 0; i < height; i++) {
+      if (prediction) {
+        var sltp = decoder.readBit(contexts, pseudoPixelContext);
+        ltp ^= sltp;
+        if (ltp) {
+          bitmap.push(row);
+          continue;
+        }
+      }
+      row = new Uint8Array(row);
+      bitmap.push(row);
+      for (j = 0; j < width; j++) {
+        if (useskip && skip[i][j]) {
+          row[j] = 0;
+          continue;
+        }
+        if (j >= sbb_left && j < sbb_right && i >= sbb_top) {
+          contextLabel = contextLabel << 1 & reuseMask;
+          for (k = 0; k < changingEntriesLength; k++) {
+            i0 = i + changingTemplateY[k];
+            j0 = j + changingTemplateX[k];
+            bit = bitmap[i0][j0];
+            if (bit) {
+              bit = changingTemplateBit[k];
+              contextLabel |= bit;
+            }
+          }
+        } else {
+          contextLabel = 0;
+          shift = templateLength - 1;
+          for (k = 0; k < templateLength; k++, shift--) {
+            j0 = j + templateX[k];
+            if (j0 >= 0 && j0 < width) {
+              i0 = i + templateY[k];
+              if (i0 >= 0) {
+                bit = bitmap[i0][j0];
+                if (bit) {
+                  contextLabel |= bit << shift;
+                }
+              }
+            }
+          }
+        }
+        var pixel = decoder.readBit(contexts, contextLabel);
+        row[j] = pixel;
+      }
+    }
+    return bitmap;
+  }
+  function decodeRefinement(width, height, templateIndex, referenceBitmap, offsetX, offsetY, prediction, at, decodingContext) {
+    var codingTemplate = RefinementTemplates[templateIndex].coding;
+    if (templateIndex === 0) {
+      codingTemplate = codingTemplate.concat([at[0]]);
+    }
+    var codingTemplateLength = codingTemplate.length;
+    var codingTemplateX = new Int32Array(codingTemplateLength);
+    var codingTemplateY = new Int32Array(codingTemplateLength);
+    var k;
+    for (k = 0; k < codingTemplateLength; k++) {
+      codingTemplateX[k] = codingTemplate[k].x;
+      codingTemplateY[k] = codingTemplate[k].y;
+    }
+    var referenceTemplate = RefinementTemplates[templateIndex].reference;
+    if (templateIndex === 0) {
+      referenceTemplate = referenceTemplate.concat([at[1]]);
+    }
+    var referenceTemplateLength = referenceTemplate.length;
+    var referenceTemplateX = new Int32Array(referenceTemplateLength);
+    var referenceTemplateY = new Int32Array(referenceTemplateLength);
+    for (k = 0; k < referenceTemplateLength; k++) {
+      referenceTemplateX[k] = referenceTemplate[k].x;
+      referenceTemplateY[k] = referenceTemplate[k].y;
+    }
+    var referenceWidth = referenceBitmap[0].length;
+    var referenceHeight = referenceBitmap.length;
+    var pseudoPixelContext = RefinementReusedContexts[templateIndex];
+    var bitmap = [];
+    var decoder = decodingContext.decoder;
+    var contexts = decodingContext.contextCache.getContexts('GR');
+    var ltp = 0;
+    for (var i = 0; i < height; i++) {
+      if (prediction) {
+        var sltp = decoder.readBit(contexts, pseudoPixelContext);
+        ltp ^= sltp;
+        if (ltp) {
+          throw new Jbig2Error('prediction is not supported');
+        }
+      }
+      var row = new Uint8Array(width);
+      bitmap.push(row);
+      for (var j = 0; j < width; j++) {
+        var i0, j0;
+        var contextLabel = 0;
+        for (k = 0; k < codingTemplateLength; k++) {
+          i0 = i + codingTemplateY[k];
+          j0 = j + codingTemplateX[k];
+          if (i0 < 0 || j0 < 0 || j0 >= width) {
+            contextLabel <<= 1;
+          } else {
+            contextLabel = contextLabel << 1 | bitmap[i0][j0];
+          }
+        }
+        for (k = 0; k < referenceTemplateLength; k++) {
+          i0 = i + referenceTemplateY[k] - offsetY;
+          j0 = j + referenceTemplateX[k] - offsetX;
+          if (i0 < 0 || i0 >= referenceHeight || j0 < 0 || j0 >= referenceWidth) {
+            contextLabel <<= 1;
+          } else {
+            contextLabel = contextLabel << 1 | referenceBitmap[i0][j0];
+          }
+        }
+        var pixel = decoder.readBit(contexts, contextLabel);
+        row[j] = pixel;
+      }
+    }
+    return bitmap;
+  }
+  function decodeSymbolDictionary(huffman, refinement, symbols, numberOfNewSymbols, numberOfExportedSymbols, huffmanTables, templateIndex, at, refinementTemplateIndex, refinementAt, decodingContext, huffmanInput) {
+    if (huffman && refinement) {
+      throw new Jbig2Error('symbol refinement with Huffman is not supported');
+    }
+    var newSymbols = [];
+    var currentHeight = 0;
+    var symbolCodeLength = (0, _util.log2)(symbols.length + numberOfNewSymbols);
+    var decoder = decodingContext.decoder;
+    var contextCache = decodingContext.contextCache;
+    var tableB1 = void 0,
+        symbolWidths = void 0;
+    if (huffman) {
+      tableB1 = getStandardTable(1);
+      symbolWidths = [];
+      symbolCodeLength = Math.max(symbolCodeLength, 1);
+    }
+    while (newSymbols.length < numberOfNewSymbols) {
+      var deltaHeight = huffman ? huffmanTables.tableDeltaHeight.decode(huffmanInput) : decodeInteger(contextCache, 'IADH', decoder);
+      currentHeight += deltaHeight;
+      var currentWidth = 0,
+          totalWidth = 0;
+      var firstSymbol = huffman ? symbolWidths.length : 0;
+      while (true) {
+        var deltaWidth = huffman ? huffmanTables.tableDeltaWidth.decode(huffmanInput) : decodeInteger(contextCache, 'IADW', decoder);
+        if (deltaWidth === null) {
+          break;
+        }
+        currentWidth += deltaWidth;
+        totalWidth += currentWidth;
+        var bitmap;
+        if (refinement) {
+          var numberOfInstances = decodeInteger(contextCache, 'IAAI', decoder);
+          if (numberOfInstances > 1) {
+            bitmap = decodeTextRegion(huffman, refinement, currentWidth, currentHeight, 0, numberOfInstances, 1, symbols.concat(newSymbols), symbolCodeLength, 0, 0, 1, 0, huffmanTables, refinementTemplateIndex, refinementAt, decodingContext, 0, huffmanInput);
+          } else {
+            var symbolId = decodeIAID(contextCache, decoder, symbolCodeLength);
+            var rdx = decodeInteger(contextCache, 'IARDX', decoder);
+            var rdy = decodeInteger(contextCache, 'IARDY', decoder);
+            var symbol = symbolId < symbols.length ? symbols[symbolId] : newSymbols[symbolId - symbols.length];
+            bitmap = decodeRefinement(currentWidth, currentHeight, refinementTemplateIndex, symbol, rdx, rdy, false, refinementAt, decodingContext);
+          }
+          newSymbols.push(bitmap);
+        } else if (huffman) {
+          symbolWidths.push(currentWidth);
+        } else {
+          bitmap = decodeBitmap(false, currentWidth, currentHeight, templateIndex, false, null, at, decodingContext);
+          newSymbols.push(bitmap);
+        }
+      }
+      if (huffman && !refinement) {
+        var bitmapSize = huffmanTables.tableBitmapSize.decode(huffmanInput);
+        huffmanInput.byteAlign();
+        var collectiveBitmap = void 0;
+        if (bitmapSize === 0) {
+          collectiveBitmap = readUncompressedBitmap(huffmanInput, totalWidth, currentHeight);
+        } else {
+          var originalEnd = huffmanInput.end;
+          var bitmapEnd = huffmanInput.position + bitmapSize;
+          huffmanInput.end = bitmapEnd;
+          collectiveBitmap = decodeMMRBitmap(huffmanInput, totalWidth, currentHeight, false);
+          huffmanInput.end = originalEnd;
+          huffmanInput.position = bitmapEnd;
+        }
+        var numberOfSymbolsDecoded = symbolWidths.length;
+        if (firstSymbol === numberOfSymbolsDecoded - 1) {
+          newSymbols.push(collectiveBitmap);
+        } else {
+          var _i = void 0,
+              y = void 0,
+              xMin = 0,
+              xMax = void 0,
+              bitmapWidth = void 0,
+              symbolBitmap = void 0;
+          for (_i = firstSymbol; _i < numberOfSymbolsDecoded; _i++) {
+            bitmapWidth = symbolWidths[_i];
+            xMax = xMin + bitmapWidth;
+            symbolBitmap = [];
+            for (y = 0; y < currentHeight; y++) {
+              symbolBitmap.push(collectiveBitmap[y].subarray(xMin, xMax));
+            }
+            newSymbols.push(symbolBitmap);
+            xMin = xMax;
+          }
+        }
+      }
+    }
+    var exportedSymbols = [];
+    var flags = [],
+        currentFlag = false;
+    var totalSymbolsLength = symbols.length + numberOfNewSymbols;
+    while (flags.length < totalSymbolsLength) {
+      var runLength = huffman ? tableB1.decode(huffmanInput) : decodeInteger(contextCache, 'IAEX', decoder);
+      while (runLength--) {
+        flags.push(currentFlag);
+      }
+      currentFlag = !currentFlag;
+    }
+    for (var i = 0, ii = symbols.length; i < ii; i++) {
+      if (flags[i]) {
+        exportedSymbols.push(symbols[i]);
+      }
+    }
+    for (var j = 0; j < numberOfNewSymbols; i++, j++) {
+      if (flags[i]) {
+        exportedSymbols.push(newSymbols[j]);
+      }
+    }
+    return exportedSymbols;
+  }
+  function decodeTextRegion(huffman, refinement, width, height, defaultPixelValue, numberOfSymbolInstances, stripSize, inputSymbols, symbolCodeLength, transposed, dsOffset, referenceCorner, combinationOperator, huffmanTables, refinementTemplateIndex, refinementAt, decodingContext, logStripSize, huffmanInput) {
+    if (huffman && refinement) {
+      throw new Jbig2Error('refinement with Huffman is not supported');
+    }
+    var bitmap = [];
+    var i, row;
+    for (i = 0; i < height; i++) {
+      row = new Uint8Array(width);
+      if (defaultPixelValue) {
+        for (var j = 0; j < width; j++) {
+          row[j] = defaultPixelValue;
+        }
+      }
+      bitmap.push(row);
+    }
+    var decoder = decodingContext.decoder;
+    var contextCache = decodingContext.contextCache;
+    var stripT = huffman ? -huffmanTables.tableDeltaT.decode(huffmanInput) : -decodeInteger(contextCache, 'IADT', decoder);
+    var firstS = 0;
+    i = 0;
+    while (i < numberOfSymbolInstances) {
+      var deltaT = huffman ? huffmanTables.tableDeltaT.decode(huffmanInput) : decodeInteger(contextCache, 'IADT', decoder);
+      stripT += deltaT;
+      var deltaFirstS = huffman ? huffmanTables.tableFirstS.decode(huffmanInput) : decodeInteger(contextCache, 'IAFS', decoder);
+      firstS += deltaFirstS;
+      var currentS = firstS;
+      do {
+        var currentT = 0;
+        if (stripSize > 1) {
+          currentT = huffman ? huffmanInput.readBits(logStripSize) : decodeInteger(contextCache, 'IAIT', decoder);
+        }
+        var t = stripSize * stripT + currentT;
+        var symbolId = huffman ? huffmanTables.symbolIDTable.decode(huffmanInput) : decodeIAID(contextCache, decoder, symbolCodeLength);
+        var applyRefinement = refinement && (huffman ? huffmanInput.readBit() : decodeInteger(contextCache, 'IARI', decoder));
+        var symbolBitmap = inputSymbols[symbolId];
+        var symbolWidth = symbolBitmap[0].length;
+        var symbolHeight = symbolBitmap.length;
+        if (applyRefinement) {
+          var rdw = decodeInteger(contextCache, 'IARDW', decoder);
+          var rdh = decodeInteger(contextCache, 'IARDH', decoder);
+          var rdx = decodeInteger(contextCache, 'IARDX', decoder);
+          var rdy = decodeInteger(contextCache, 'IARDY', decoder);
+          symbolWidth += rdw;
+          symbolHeight += rdh;
+          symbolBitmap = decodeRefinement(symbolWidth, symbolHeight, refinementTemplateIndex, symbolBitmap, (rdw >> 1) + rdx, (rdh >> 1) + rdy, false, refinementAt, decodingContext);
+        }
+        var offsetT = t - (referenceCorner & 1 ? 0 : symbolHeight - 1);
+        var offsetS = currentS - (referenceCorner & 2 ? symbolWidth - 1 : 0);
+        var s2, t2, symbolRow;
+        if (transposed) {
+          for (s2 = 0; s2 < symbolHeight; s2++) {
+            row = bitmap[offsetS + s2];
+            if (!row) {
+              continue;
+            }
+            symbolRow = symbolBitmap[s2];
+            var maxWidth = Math.min(width - offsetT, symbolWidth);
+            switch (combinationOperator) {
+              case 0:
+                for (t2 = 0; t2 < maxWidth; t2++) {
+                  row[offsetT + t2] |= symbolRow[t2];
+                }
+                break;
+              case 2:
+                for (t2 = 0; t2 < maxWidth; t2++) {
+                  row[offsetT + t2] ^= symbolRow[t2];
+                }
+                break;
+              default:
+                throw new Jbig2Error('operator ' + combinationOperator + ' is not supported');
+            }
+          }
+          currentS += symbolHeight - 1;
+        } else {
+          for (t2 = 0; t2 < symbolHeight; t2++) {
+            row = bitmap[offsetT + t2];
+            if (!row) {
+              continue;
+            }
+            symbolRow = symbolBitmap[t2];
+            switch (combinationOperator) {
+              case 0:
+                for (s2 = 0; s2 < symbolWidth; s2++) {
+                  row[offsetS + s2] |= symbolRow[s2];
+                }
+                break;
+              case 2:
+                for (s2 = 0; s2 < symbolWidth; s2++) {
+                  row[offsetS + s2] ^= symbolRow[s2];
+                }
+                break;
+              default:
+                throw new Jbig2Error('operator ' + combinationOperator + ' is not supported');
+            }
+          }
+          currentS += symbolWidth - 1;
+        }
+        i++;
+        var deltaS = huffman ? huffmanTables.tableDeltaS.decode(huffmanInput) : decodeInteger(contextCache, 'IADS', decoder);
+        if (deltaS === null) {
+          break;
+        }
+        currentS += deltaS + dsOffset;
+      } while (true);
+    }
+    return bitmap;
+  }
+  function decodePatternDictionary(mmr, patternWidth, patternHeight, maxPatternIndex, template, decodingContext) {
+    var at = [];
+    if (!mmr) {
+      at.push({
+        x: -patternWidth,
+        y: 0
+      });
+      if (template === 0) {
+        at.push({
+          x: -3,
+          y: -1
+        });
+        at.push({
+          x: 2,
+          y: -2
+        });
+        at.push({
+          x: -2,
+          y: -2
+        });
+      }
+    }
+    var collectiveWidth = (maxPatternIndex + 1) * patternWidth;
+    var collectiveBitmap = decodeBitmap(mmr, collectiveWidth, patternHeight, template, false, null, at, decodingContext);
+    var patterns = [],
+        i = 0,
+        patternBitmap = void 0,
+        xMin = void 0,
+        xMax = void 0,
+        y = void 0;
+    while (i <= maxPatternIndex) {
+      patternBitmap = [];
+      xMin = patternWidth * i;
+      xMax = xMin + patternWidth;
+      for (y = 0; y < patternHeight; y++) {
+        patternBitmap.push(collectiveBitmap[y].subarray(xMin, xMax));
+      }
+      patterns.push(patternBitmap);
+      i++;
+    }
+    return patterns;
+  }
+  function decodeHalftoneRegion(mmr, patterns, template, regionWidth, regionHeight, defaultPixelValue, enableSkip, combinationOperator, gridWidth, gridHeight, gridOffsetX, gridOffsetY, gridVectorX, gridVectorY, decodingContext) {
+    var skip = null;
+    if (enableSkip) {
+      throw new Jbig2Error('skip is not supported');
+    }
+    if (combinationOperator !== 0) {
+      throw new Jbig2Error('operator ' + combinationOperator + ' is not supported in halftone region');
+    }
+    var regionBitmap = [];
+    var i = void 0,
+        j = void 0,
+        row = void 0;
+    for (i = 0; i < regionHeight; i++) {
+      row = new Uint8Array(regionWidth);
+      if (defaultPixelValue) {
+        for (j = 0; j < regionWidth; j++) {
+          row[j] = defaultPixelValue;
+        }
+      }
+      regionBitmap.push(row);
+    }
+    var numberOfPatterns = patterns.length;
+    var pattern0 = patterns[0];
+    var patternWidth = pattern0[0].length,
+        patternHeight = pattern0.length;
+    var bitsPerValue = (0, _util.log2)(numberOfPatterns);
+    var at = [];
+    if (!mmr) {
+      at.push({
+        x: template <= 1 ? 3 : 2,
+        y: -1
+      });
+      if (template === 0) {
+        at.push({
+          x: -3,
+          y: -1
+        });
+        at.push({
+          x: 2,
+          y: -2
+        });
+        at.push({
+          x: -2,
+          y: -2
+        });
+      }
+    }
+    var grayScaleBitPlanes = [],
+        mmrInput = void 0,
+        bitmap = void 0;
+    if (mmr) {
+      mmrInput = new Reader(decodingContext.data, decodingContext.start, decodingContext.end);
+    }
+    for (i = bitsPerValue - 1; i >= 0; i--) {
+      if (mmr) {
+        bitmap = decodeMMRBitmap(mmrInput, gridWidth, gridHeight, true);
+      } else {
+        bitmap = decodeBitmap(false, gridWidth, gridHeight, template, false, skip, at, decodingContext);
+      }
+      grayScaleBitPlanes[i] = bitmap;
+    }
+    var mg = void 0,
+        ng = void 0,
+        bit = void 0,
+        patternIndex = void 0,
+        patternBitmap = void 0,
+        x = void 0,
+        y = void 0,
+        patternRow = void 0,
+        regionRow = void 0;
+    for (mg = 0; mg < gridHeight; mg++) {
+      for (ng = 0; ng < gridWidth; ng++) {
+        bit = 0;
+        patternIndex = 0;
+        for (j = bitsPerValue - 1; j >= 0; j--) {
+          bit = grayScaleBitPlanes[j][mg][ng] ^ bit;
+          patternIndex |= bit << j;
+        }
+        patternBitmap = patterns[patternIndex];
+        x = gridOffsetX + mg * gridVectorY + ng * gridVectorX >> 8;
+        y = gridOffsetY + mg * gridVectorX - ng * gridVectorY >> 8;
+        if (x >= 0 && x + patternWidth <= regionWidth && y >= 0 && y + patternHeight <= regionHeight) {
+          for (i = 0; i < patternHeight; i++) {
+            regionRow = regionBitmap[y + i];
+            patternRow = patternBitmap[i];
+            for (j = 0; j < patternWidth; j++) {
+              regionRow[x + j] |= patternRow[j];
+            }
+          }
+        } else {
+          var regionX = void 0,
+              regionY = void 0;
+          for (i = 0; i < patternHeight; i++) {
+            regionY = y + i;
+            if (regionY < 0 || regionY >= regionHeight) {
+              continue;
+            }
+            regionRow = regionBitmap[regionY];
+            patternRow = patternBitmap[i];
+            for (j = 0; j < patternWidth; j++) {
+              regionX = x + j;
+              if (regionX >= 0 && regionX < regionWidth) {
+                regionRow[regionX] |= patternRow[j];
+              }
+            }
+          }
+        }
+      }
+    }
+    return regionBitmap;
+  }
+  function readSegmentHeader(data, start) {
+    var segmentHeader = {};
+    segmentHeader.number = (0, _util.readUint32)(data, start);
+    var flags = data[start + 4];
+    var segmentType = flags & 0x3F;
+    if (!SegmentTypes[segmentType]) {
+      throw new Jbig2Error('invalid segment type: ' + segmentType);
+    }
+    segmentHeader.type = segmentType;
+    segmentHeader.typeName = SegmentTypes[segmentType];
+    segmentHeader.deferredNonRetain = !!(flags & 0x80);
+    var pageAssociationFieldSize = !!(flags & 0x40);
+    var referredFlags = data[start + 5];
+    var referredToCount = referredFlags >> 5 & 7;
+    var retainBits = [referredFlags & 31];
+    var position = start + 6;
+    if (referredFlags === 7) {
+      referredToCount = (0, _util.readUint32)(data, position - 1) & 0x1FFFFFFF;
+      position += 3;
+      var bytes = referredToCount + 7 >> 3;
+      retainBits[0] = data[position++];
+      while (--bytes > 0) {
+        retainBits.push(data[position++]);
+      }
+    } else if (referredFlags === 5 || referredFlags === 6) {
+      throw new Jbig2Error('invalid referred-to flags');
+    }
+    segmentHeader.retainBits = retainBits;
+    var referredToSegmentNumberSize = segmentHeader.number <= 256 ? 1 : segmentHeader.number <= 65536 ? 2 : 4;
+    var referredTo = [];
+    var i, ii;
+    for (i = 0; i < referredToCount; i++) {
+      var number = referredToSegmentNumberSize === 1 ? data[position] : referredToSegmentNumberSize === 2 ? (0, _util.readUint16)(data, position) : (0, _util.readUint32)(data, position);
+      referredTo.push(number);
+      position += referredToSegmentNumberSize;
+    }
+    segmentHeader.referredTo = referredTo;
+    if (!pageAssociationFieldSize) {
+      segmentHeader.pageAssociation = data[position++];
+    } else {
+      segmentHeader.pageAssociation = (0, _util.readUint32)(data, position);
+      position += 4;
+    }
+    segmentHeader.length = (0, _util.readUint32)(data, position);
+    position += 4;
+    if (segmentHeader.length === 0xFFFFFFFF) {
+      if (segmentType === 38) {
+        var genericRegionInfo = readRegionSegmentInformation(data, position);
+        var genericRegionSegmentFlags = data[position + RegionSegmentInformationFieldLength];
+        var genericRegionMmr = !!(genericRegionSegmentFlags & 1);
+        var searchPatternLength = 6;
+        var searchPattern = new Uint8Array(searchPatternLength);
+        if (!genericRegionMmr) {
+          searchPattern[0] = 0xFF;
+          searchPattern[1] = 0xAC;
+        }
+        searchPattern[2] = genericRegionInfo.height >>> 24 & 0xFF;
+        searchPattern[3] = genericRegionInfo.height >> 16 & 0xFF;
+        searchPattern[4] = genericRegionInfo.height >> 8 & 0xFF;
+        searchPattern[5] = genericRegionInfo.height & 0xFF;
+        for (i = position, ii = data.length; i < ii; i++) {
+          var j = 0;
+          while (j < searchPatternLength && searchPattern[j] === data[i + j]) {
+            j++;
+          }
+          if (j === searchPatternLength) {
+            segmentHeader.length = i + searchPatternLength;
+            break;
+          }
+        }
+        if (segmentHeader.length === 0xFFFFFFFF) {
+          throw new Jbig2Error('segment end was not found');
+        }
+      } else {
+        throw new Jbig2Error('invalid unknown segment length');
+      }
+    }
+    segmentHeader.headerEnd = position;
+    return segmentHeader;
+  }
+  function readSegments(header, data, start, end) {
+    var segments = [];
+    var position = start;
+    while (position < end) {
+      var segmentHeader = readSegmentHeader(data, position);
+      position = segmentHeader.headerEnd;
+      var segment = {
+        header: segmentHeader,
+        data: data
+      };
+      if (!header.randomAccess) {
+        segment.start = position;
+        position += segmentHeader.length;
+        segment.end = position;
+      }
+      segments.push(segment);
+      if (segmentHeader.type === 51) {
+        break;
+      }
+    }
+    if (header.randomAccess) {
+      for (var i = 0, ii = segments.length; i < ii; i++) {
+        segments[i].start = position;
+        position += segments[i].header.length;
+        segments[i].end = position;
+      }
+    }
+    return segments;
+  }
+  function readRegionSegmentInformation(data, start) {
+    return {
+      width: (0, _util.readUint32)(data, start),
+      height: (0, _util.readUint32)(data, start + 4),
+      x: (0, _util.readUint32)(data, start + 8),
+      y: (0, _util.readUint32)(data, start + 12),
+      combinationOperator: data[start + 16] & 7
+    };
+  }
+  var RegionSegmentInformationFieldLength = 17;
+  function processSegment(segment, visitor) {
+    var header = segment.header;
+    var data = segment.data,
+        position = segment.start,
+        end = segment.end;
+    var args, at, i, atLength;
+    switch (header.type) {
+      case 0:
+        var dictionary = {};
+        var dictionaryFlags = (0, _util.readUint16)(data, position);
+        dictionary.huffman = !!(dictionaryFlags & 1);
+        dictionary.refinement = !!(dictionaryFlags & 2);
+        dictionary.huffmanDHSelector = dictionaryFlags >> 2 & 3;
+        dictionary.huffmanDWSelector = dictionaryFlags >> 4 & 3;
+        dictionary.bitmapSizeSelector = dictionaryFlags >> 6 & 1;
+        dictionary.aggregationInstancesSelector = dictionaryFlags >> 7 & 1;
+        dictionary.bitmapCodingContextUsed = !!(dictionaryFlags & 256);
+        dictionary.bitmapCodingContextRetained = !!(dictionaryFlags & 512);
+        dictionary.template = dictionaryFlags >> 10 & 3;
+        dictionary.refinementTemplate = dictionaryFlags >> 12 & 1;
+        position += 2;
+        if (!dictionary.huffman) {
+          atLength = dictionary.template === 0 ? 4 : 1;
+          at = [];
+          for (i = 0; i < atLength; i++) {
+            at.push({
+              x: (0, _util.readInt8)(data, position),
+              y: (0, _util.readInt8)(data, position + 1)
+            });
+            position += 2;
+          }
+          dictionary.at = at;
+        }
+        if (dictionary.refinement && !dictionary.refinementTemplate) {
+          at = [];
+          for (i = 0; i < 2; i++) {
+            at.push({
+              x: (0, _util.readInt8)(data, position),
+              y: (0, _util.readInt8)(data, position + 1)
+            });
+            position += 2;
+          }
+          dictionary.refinementAt = at;
+        }
+        dictionary.numberOfExportedSymbols = (0, _util.readUint32)(data, position);
+        position += 4;
+        dictionary.numberOfNewSymbols = (0, _util.readUint32)(data, position);
+        position += 4;
+        args = [dictionary, header.number, header.referredTo, data, position, end];
+        break;
+      case 6:
+      case 7:
+        var textRegion = {};
+        textRegion.info = readRegionSegmentInformation(data, position);
+        position += RegionSegmentInformationFieldLength;
+        var textRegionSegmentFlags = (0, _util.readUint16)(data, position);
+        position += 2;
+        textRegion.huffman = !!(textRegionSegmentFlags & 1);
+        textRegion.refinement = !!(textRegionSegmentFlags & 2);
+        textRegion.logStripSize = textRegionSegmentFlags >> 2 & 3;
+        textRegion.stripSize = 1 << textRegion.logStripSize;
+        textRegion.referenceCorner = textRegionSegmentFlags >> 4 & 3;
+        textRegion.transposed = !!(textRegionSegmentFlags & 64);
+        textRegion.combinationOperator = textRegionSegmentFlags >> 7 & 3;
+        textRegion.defaultPixelValue = textRegionSegmentFlags >> 9 & 1;
+        textRegion.dsOffset = textRegionSegmentFlags << 17 >> 27;
+        textRegion.refinementTemplate = textRegionSegmentFlags >> 15 & 1;
+        if (textRegion.huffman) {
+          var textRegionHuffmanFlags = (0, _util.readUint16)(data, position);
+          position += 2;
+          textRegion.huffmanFS = textRegionHuffmanFlags & 3;
+          textRegion.huffmanDS = textRegionHuffmanFlags >> 2 & 3;
+          textRegion.huffmanDT = textRegionHuffmanFlags >> 4 & 3;
+          textRegion.huffmanRefinementDW = textRegionHuffmanFlags >> 6 & 3;
+          textRegion.huffmanRefinementDH = textRegionHuffmanFlags >> 8 & 3;
+          textRegion.huffmanRefinementDX = textRegionHuffmanFlags >> 10 & 3;
+          textRegion.huffmanRefinementDY = textRegionHuffmanFlags >> 12 & 3;
+          textRegion.huffmanRefinementSizeSelector = !!(textRegionHuffmanFlags & 0x4000);
+        }
+        if (textRegion.refinement && !textRegion.refinementTemplate) {
+          at = [];
+          for (i = 0; i < 2; i++) {
+            at.push({
+              x: (0, _util.readInt8)(data, position),
+              y: (0, _util.readInt8)(data, position + 1)
+            });
+            position += 2;
+          }
+          textRegion.refinementAt = at;
+        }
+        textRegion.numberOfSymbolInstances = (0, _util.readUint32)(data, position);
+        position += 4;
+        args = [textRegion, header.referredTo, data, position, end];
+        break;
+      case 16:
+        var patternDictionary = {};
+        var patternDictionaryFlags = data[position++];
+        patternDictionary.mmr = !!(patternDictionaryFlags & 1);
+        patternDictionary.template = patternDictionaryFlags >> 1 & 3;
+        patternDictionary.patternWidth = data[position++];
+        patternDictionary.patternHeight = data[position++];
+        patternDictionary.maxPatternIndex = (0, _util.readUint32)(data, position);
+        position += 4;
+        args = [patternDictionary, header.number, data, position, end];
+        break;
+      case 22:
+      case 23:
+        var halftoneRegion = {};
+        halftoneRegion.info = readRegionSegmentInformation(data, position);
+        position += RegionSegmentInformationFieldLength;
+        var halftoneRegionFlags = data[position++];
+        halftoneRegion.mmr = !!(halftoneRegionFlags & 1);
+        halftoneRegion.template = halftoneRegionFlags >> 1 & 3;
+        halftoneRegion.enableSkip = !!(halftoneRegionFlags & 8);
+        halftoneRegion.combinationOperator = halftoneRegionFlags >> 4 & 7;
+        halftoneRegion.defaultPixelValue = halftoneRegionFlags >> 7 & 1;
+        halftoneRegion.gridWidth = (0, _util.readUint32)(data, position);
+        position += 4;
+        halftoneRegion.gridHeight = (0, _util.readUint32)(data, position);
+        position += 4;
+        halftoneRegion.gridOffsetX = (0, _util.readUint32)(data, position) & 0xFFFFFFFF;
+        position += 4;
+        halftoneRegion.gridOffsetY = (0, _util.readUint32)(data, position) & 0xFFFFFFFF;
+        position += 4;
+        halftoneRegion.gridVectorX = (0, _util.readUint16)(data, position);
+        position += 2;
+        halftoneRegion.gridVectorY = (0, _util.readUint16)(data, position);
+        position += 2;
+        args = [halftoneRegion, header.referredTo, data, position, end];
+        break;
+      case 38:
+      case 39:
+        var genericRegion = {};
+        genericRegion.info = readRegionSegmentInformation(data, position);
+        position += RegionSegmentInformationFieldLength;
+        var genericRegionSegmentFlags = data[position++];
+        genericRegion.mmr = !!(genericRegionSegmentFlags & 1);
+        genericRegion.template = genericRegionSegmentFlags >> 1 & 3;
+        genericRegion.prediction = !!(genericRegionSegmentFlags & 8);
+        if (!genericRegion.mmr) {
+          atLength = genericRegion.template === 0 ? 4 : 1;
+          at = [];
+          for (i = 0; i < atLength; i++) {
+            at.push({
+              x: (0, _util.readInt8)(data, position),
+              y: (0, _util.readInt8)(data, position + 1)
+            });
+            position += 2;
+          }
+          genericRegion.at = at;
+        }
+        args = [genericRegion, data, position, end];
+        break;
+      case 48:
+        var pageInfo = {
+          width: (0, _util.readUint32)(data, position),
+          height: (0, _util.readUint32)(data, position + 4),
+          resolutionX: (0, _util.readUint32)(data, position + 8),
+          resolutionY: (0, _util.readUint32)(data, position + 12)
+        };
+        if (pageInfo.height === 0xFFFFFFFF) {
+          delete pageInfo.height;
+        }
+        var pageSegmentFlags = data[position + 16];
+        (0, _util.readUint16)(data, position + 17);
+        pageInfo.lossless = !!(pageSegmentFlags & 1);
+        pageInfo.refinement = !!(pageSegmentFlags & 2);
+        pageInfo.defaultPixelValue = pageSegmentFlags >> 2 & 1;
+        pageInfo.combinationOperator = pageSegmentFlags >> 3 & 3;
+        pageInfo.requiresBuffer = !!(pageSegmentFlags & 32);
+        pageInfo.combinationOperatorOverride = !!(pageSegmentFlags & 64);
+        args = [pageInfo];
+        break;
+      case 49:
+        break;
+      case 50:
+        break;
+      case 51:
+        break;
+      case 53:
+        args = [header.number, data, position, end];
+        break;
+      case 62:
+        break;
+      default:
+        throw new Jbig2Error('segment type ' + header.typeName + '(' + header.type + ')' + ' is not implemented');
+    }
+    var callbackName = 'on' + header.typeName;
+    if (callbackName in visitor) {
+      visitor[callbackName].apply(visitor, args);
+    }
+  }
+  function processSegments(segments, visitor) {
+    for (var i = 0, ii = segments.length; i < ii; i++) {
+      processSegment(segments[i], visitor);
+    }
+  }
+  function parseJbig2Chunks(chunks) {
+    var visitor = new SimpleSegmentVisitor();
+    for (var i = 0, ii = chunks.length; i < ii; i++) {
+      var chunk = chunks[i];
+      var segments = readSegments({}, chunk.data, chunk.start, chunk.end);
+      processSegments(segments, visitor);
+    }
+    return visitor.buffer;
+  }
+  function parseJbig2(data) {
+    var position = 0,
+        end = data.length;
+    if (data[position] !== 0x97 || data[position + 1] !== 0x4A || data[position + 2] !== 0x42 || data[position + 3] !== 0x32 || data[position + 4] !== 0x0D || data[position + 5] !== 0x0A || data[position + 6] !== 0x1A || data[position + 7] !== 0x0A) {
+      throw new Jbig2Error('parseJbig2 - invalid header.');
+    }
+    var header = Object.create(null);
+    position += 8;
+    var flags = data[position++];
+    header.randomAccess = !(flags & 1);
+    if (!(flags & 2)) {
+      header.numberOfPages = (0, _util.readUint32)(data, position);
+      position += 4;
+    }
+    var segments = readSegments(header, data, position, end);
+    var visitor = new SimpleSegmentVisitor();
+    processSegments(segments, visitor);
+    var _visitor$currentPageI = visitor.currentPageInfo,
+        width = _visitor$currentPageI.width,
+        height = _visitor$currentPageI.height;
+
+    var bitPacked = visitor.buffer;
+    var imgData = new Uint8ClampedArray(width * height);
+    var q = 0,
+        k = 0;
+    for (var i = 0; i < height; i++) {
+      var mask = 0,
+          buffer = void 0;
+      for (var j = 0; j < width; j++) {
+        if (!mask) {
+          mask = 128;
+          buffer = bitPacked[k++];
+        }
+        imgData[q++] = buffer & mask ? 0 : 255;
+        mask >>= 1;
+      }
+    }
+    return {
+      imgData: imgData,
+      width: width,
+      height: height
+    };
+  }
+  function SimpleSegmentVisitor() {}
+  SimpleSegmentVisitor.prototype = {
+    onPageInformation: function SimpleSegmentVisitor_onPageInformation(info) {
+      this.currentPageInfo = info;
+      var rowSize = info.width + 7 >> 3;
+      var buffer = new Uint8ClampedArray(rowSize * info.height);
+      if (info.defaultPixelValue) {
+        for (var i = 0, ii = buffer.length; i < ii; i++) {
+          buffer[i] = 0xFF;
+        }
+      }
+      this.buffer = buffer;
+    },
+    drawBitmap: function SimpleSegmentVisitor_drawBitmap(regionInfo, bitmap) {
+      var pageInfo = this.currentPageInfo;
+      var width = regionInfo.width,
+          height = regionInfo.height;
+      var rowSize = pageInfo.width + 7 >> 3;
+      var combinationOperator = pageInfo.combinationOperatorOverride ? regionInfo.combinationOperator : pageInfo.combinationOperator;
+      var buffer = this.buffer;
+      var mask0 = 128 >> (regionInfo.x & 7);
+      var offset0 = regionInfo.y * rowSize + (regionInfo.x >> 3);
+      var i, j, mask, offset;
+      switch (combinationOperator) {
+        case 0:
+          for (i = 0; i < height; i++) {
+            mask = mask0;
+            offset = offset0;
+            for (j = 0; j < width; j++) {
+              if (bitmap[i][j]) {
+                buffer[offset] |= mask;
+              }
+              mask >>= 1;
+              if (!mask) {
+                mask = 128;
+                offset++;
+              }
+            }
+            offset0 += rowSize;
+          }
+          break;
+        case 2:
+          for (i = 0; i < height; i++) {
+            mask = mask0;
+            offset = offset0;
+            for (j = 0; j < width; j++) {
+              if (bitmap[i][j]) {
+                buffer[offset] ^= mask;
+              }
+              mask >>= 1;
+              if (!mask) {
+                mask = 128;
+                offset++;
+              }
+            }
+            offset0 += rowSize;
+          }
+          break;
+        default:
+          throw new Jbig2Error('operator ' + combinationOperator + ' is not supported');
+      }
+    },
+    onImmediateGenericRegion: function SimpleSegmentVisitor_onImmediateGenericRegion(region, data, start, end) {
+      var regionInfo = region.info;
+      var decodingContext = new DecodingContext(data, start, end);
+      var bitmap = decodeBitmap(region.mmr, regionInfo.width, regionInfo.height, region.template, region.prediction, null, region.at, decodingContext);
+      this.drawBitmap(regionInfo, bitmap);
+    },
+    onImmediateLosslessGenericRegion: function SimpleSegmentVisitor_onImmediateLosslessGenericRegion() {
+      this.onImmediateGenericRegion.apply(this, arguments);
+    },
+    onSymbolDictionary: function SimpleSegmentVisitor_onSymbolDictionary(dictionary, currentSegment, referredSegments, data, start, end) {
+      var huffmanTables = void 0,
+          huffmanInput = void 0;
+      if (dictionary.huffman) {
+        huffmanTables = getSymbolDictionaryHuffmanTables(dictionary, referredSegments, this.customTables);
+        huffmanInput = new Reader(data, start, end);
+      }
+      var symbols = this.symbols;
+      if (!symbols) {
+        this.symbols = symbols = {};
+      }
+      var inputSymbols = [];
+      for (var i = 0, ii = referredSegments.length; i < ii; i++) {
+        var referredSymbols = symbols[referredSegments[i]];
+        if (referredSymbols) {
+          inputSymbols = inputSymbols.concat(referredSymbols);
+        }
+      }
+      var decodingContext = new DecodingContext(data, start, end);
+      symbols[currentSegment] = decodeSymbolDictionary(dictionary.huffman, dictionary.refinement, inputSymbols, dictionary.numberOfNewSymbols, dictionary.numberOfExportedSymbols, huffmanTables, dictionary.template, dictionary.at, dictionary.refinementTemplate, dictionary.refinementAt, decodingContext, huffmanInput);
+    },
+    onImmediateTextRegion: function SimpleSegmentVisitor_onImmediateTextRegion(region, referredSegments, data, start, end) {
+      var regionInfo = region.info;
+      var huffmanTables = void 0,
+          huffmanInput = void 0;
+      var symbols = this.symbols;
+      var inputSymbols = [];
+      for (var i = 0, ii = referredSegments.length; i < ii; i++) {
+        var referredSymbols = symbols[referredSegments[i]];
+        if (referredSymbols) {
+          inputSymbols = inputSymbols.concat(referredSymbols);
+        }
+      }
+      var symbolCodeLength = (0, _util.log2)(inputSymbols.length);
+      if (region.huffman) {
+        huffmanInput = new Reader(data, start, end);
+        huffmanTables = getTextRegionHuffmanTables(region, referredSegments, this.customTables, inputSymbols.length, huffmanInput);
+      }
+      var decodingContext = new DecodingContext(data, start, end);
+      var bitmap = decodeTextRegion(region.huffman, region.refinement, regionInfo.width, regionInfo.height, region.defaultPixelValue, region.numberOfSymbolInstances, region.stripSize, inputSymbols, symbolCodeLength, region.transposed, region.dsOffset, region.referenceCorner, region.combinationOperator, huffmanTables, region.refinementTemplate, region.refinementAt, decodingContext, region.logStripSize, huffmanInput);
+      this.drawBitmap(regionInfo, bitmap);
+    },
+    onImmediateLosslessTextRegion: function SimpleSegmentVisitor_onImmediateLosslessTextRegion() {
+      this.onImmediateTextRegion.apply(this, arguments);
+    },
+    onPatternDictionary: function onPatternDictionary(dictionary, currentSegment, data, start, end) {
+      var patterns = this.patterns;
+      if (!patterns) {
+        this.patterns = patterns = {};
+      }
+      var decodingContext = new DecodingContext(data, start, end);
+      patterns[currentSegment] = decodePatternDictionary(dictionary.mmr, dictionary.patternWidth, dictionary.patternHeight, dictionary.maxPatternIndex, dictionary.template, decodingContext);
+    },
+    onImmediateHalftoneRegion: function onImmediateHalftoneRegion(region, referredSegments, data, start, end) {
+      var patterns = this.patterns[referredSegments[0]];
+      var regionInfo = region.info;
+      var decodingContext = new DecodingContext(data, start, end);
+      var bitmap = decodeHalftoneRegion(region.mmr, patterns, region.template, regionInfo.width, regionInfo.height, region.defaultPixelValue, region.enableSkip, region.combinationOperator, region.gridWidth, region.gridHeight, region.gridOffsetX, region.gridOffsetY, region.gridVectorX, region.gridVectorY, decodingContext);
+      this.drawBitmap(regionInfo, bitmap);
+    },
+    onImmediateLosslessHalftoneRegion: function onImmediateLosslessHalftoneRegion() {
+      this.onImmediateHalftoneRegion.apply(this, arguments);
+    },
+    onTables: function onTables(currentSegment, data, start, end) {
+      var customTables = this.customTables;
+      if (!customTables) {
+        this.customTables = customTables = {};
+      }
+      customTables[currentSegment] = decodeTablesSegment(data, start, end);
+    }
+  };
+  function HuffmanLine(lineData) {
+    if (lineData.length === 2) {
+      this.isOOB = true;
+      this.rangeLow = 0;
+      this.prefixLength = lineData[0];
+      this.rangeLength = 0;
+      this.prefixCode = lineData[1];
+      this.isLowerRange = false;
+    } else {
+      this.isOOB = false;
+      this.rangeLow = lineData[0];
+      this.prefixLength = lineData[1];
+      this.rangeLength = lineData[2];
+      this.prefixCode = lineData[3];
+      this.isLowerRange = lineData[4] === 'lower';
+    }
+  }
+  function HuffmanTreeNode(line) {
+    this.children = [];
+    if (line) {
+      this.isLeaf = true;
+      this.rangeLength = line.rangeLength;
+      this.rangeLow = line.rangeLow;
+      this.isLowerRange = line.isLowerRange;
+      this.isOOB = line.isOOB;
+    } else {
+      this.isLeaf = false;
+    }
+  }
+  HuffmanTreeNode.prototype = {
+    buildTree: function buildTree(line, shift) {
+      var bit = line.prefixCode >> shift & 1;
+      if (shift <= 0) {
+        this.children[bit] = new HuffmanTreeNode(line);
+      } else {
+        var node = this.children[bit];
+        if (!node) {
+          this.children[bit] = node = new HuffmanTreeNode(null);
+        }
+        node.buildTree(line, shift - 1);
+      }
+    },
+    decodeNode: function decodeNode(reader) {
+      if (this.isLeaf) {
+        if (this.isOOB) {
+          return null;
+        }
+        var htOffset = reader.readBits(this.rangeLength);
+        return this.rangeLow + (this.isLowerRange ? -htOffset : htOffset);
+      }
+      var node = this.children[reader.readBit()];
+      if (!node) {
+        throw new Jbig2Error('invalid Huffman data');
+      }
+      return node.decodeNode(reader);
+    }
+  };
+  function HuffmanTable(lines, prefixCodesDone) {
+    if (!prefixCodesDone) {
+      this.assignPrefixCodes(lines);
+    }
+    this.rootNode = new HuffmanTreeNode(null);
+    var i = void 0,
+        ii = lines.length,
+        line = void 0;
+    for (i = 0; i < ii; i++) {
+      line = lines[i];
+      if (line.prefixLength > 0) {
+        this.rootNode.buildTree(line, line.prefixLength - 1);
+      }
+    }
+  }
+  HuffmanTable.prototype = {
+    decode: function decode(reader) {
+      return this.rootNode.decodeNode(reader);
+    },
+    assignPrefixCodes: function assignPrefixCodes(lines) {
+      var linesLength = lines.length,
+          prefixLengthMax = 0,
+          i = void 0;
+      for (i = 0; i < linesLength; i++) {
+        prefixLengthMax = Math.max(prefixLengthMax, lines[i].prefixLength);
+      }
+      var histogram = new Uint32Array(prefixLengthMax + 1);
+      for (i = 0; i < linesLength; i++) {
+        histogram[lines[i].prefixLength]++;
+      }
+      var currentLength = 1,
+          firstCode = 0,
+          currentCode = void 0,
+          currentTemp = void 0,
+          line = void 0;
+      histogram[0] = 0;
+      while (currentLength <= prefixLengthMax) {
+        firstCode = firstCode + histogram[currentLength - 1] << 1;
+        currentCode = firstCode;
+        currentTemp = 0;
+        while (currentTemp < linesLength) {
+          line = lines[currentTemp];
+          if (line.prefixLength === currentLength) {
+            line.prefixCode = currentCode;
+            currentCode++;
+          }
+          currentTemp++;
+        }
+        currentLength++;
+      }
+    }
+  };
+  function decodeTablesSegment(data, start, end) {
+    var flags = data[start];
+    var lowestValue = (0, _util.readUint32)(data, start + 1) & 0xFFFFFFFF;
+    var highestValue = (0, _util.readUint32)(data, start + 5) & 0xFFFFFFFF;
+    var reader = new Reader(data, start + 9, end);
+    var prefixSizeBits = (flags >> 1 & 7) + 1;
+    var rangeSizeBits = (flags >> 4 & 7) + 1;
+    var lines = [];
+    var prefixLength = void 0,
+        rangeLength = void 0,
+        currentRangeLow = lowestValue;
+    do {
+      prefixLength = reader.readBits(prefixSizeBits);
+      rangeLength = reader.readBits(rangeSizeBits);
+      lines.push(new HuffmanLine([currentRangeLow, prefixLength, rangeLength, 0]));
+      currentRangeLow += 1 << rangeLength;
+    } while (currentRangeLow < highestValue);
+    prefixLength = reader.readBits(prefixSizeBits);
+    lines.push(new HuffmanLine([lowestValue - 1, prefixLength, 32, 0, 'lower']));
+    prefixLength = reader.readBits(prefixSizeBits);
+    lines.push(new HuffmanLine([highestValue, prefixLength, 32, 0]));
+    if (flags & 1) {
+      prefixLength = reader.readBits(prefixSizeBits);
+      lines.push(new HuffmanLine([prefixLength, 0]));
+    }
+    return new HuffmanTable(lines, false);
+  }
+  var standardTablesCache = {};
+  function getStandardTable(number) {
+    var table = standardTablesCache[number];
+    if (table) {
+      return table;
+    }
+    var lines = void 0;
+    switch (number) {
+      case 1:
+        lines = [[0, 1, 4, 0x0], [16, 2, 8, 0x2], [272, 3, 16, 0x6], [65808, 3, 32, 0x7]];
+        break;
+      case 2:
+        lines = [[0, 1, 0, 0x0], [1, 2, 0, 0x2], [2, 3, 0, 0x6], [3, 4, 3, 0xE], [11, 5, 6, 0x1E], [75, 6, 32, 0x3E], [6, 0x3F]];
+        break;
+      case 3:
+        lines = [[-256, 8, 8, 0xFE], [0, 1, 0, 0x0], [1, 2, 0, 0x2], [2, 3, 0, 0x6], [3, 4, 3, 0xE], [11, 5, 6, 0x1E], [-257, 8, 32, 0xFF, 'lower'], [75, 7, 32, 0x7E], [6, 0x3E]];
+        break;
+      case 4:
+        lines = [[1, 1, 0, 0x0], [2, 2, 0, 0x2], [3, 3, 0, 0x6], [4, 4, 3, 0xE], [12, 5, 6, 0x1E], [76, 5, 32, 0x1F]];
+        break;
+      case 5:
+        lines = [[-255, 7, 8, 0x7E], [1, 1, 0, 0x0], [2, 2, 0, 0x2], [3, 3, 0, 0x6], [4, 4, 3, 0xE], [12, 5, 6, 0x1E], [-256, 7, 32, 0x7F, 'lower'], [76, 6, 32, 0x3E]];
+        break;
+      case 6:
+        lines = [[-2048, 5, 10, 0x1C], [-1024, 4, 9, 0x8], [-512, 4, 8, 0x9], [-256, 4, 7, 0xA], [-128, 5, 6, 0x1D], [-64, 5, 5, 0x1E], [-32, 4, 5, 0xB], [0, 2, 7, 0x0], [128, 3, 7, 0x2], [256, 3, 8, 0x3], [512, 4, 9, 0xC], [1024, 4, 10, 0xD], [-2049, 6, 32, 0x3E, 'lower'], [2048, 6, 32, 0x3F]];
+        break;
+      case 7:
+        lines = [[-1024, 4, 9, 0x8], [-512, 3, 8, 0x0], [-256, 4, 7, 0x9], [-128, 5, 6, 0x1A], [-64, 5, 5, 0x1B], [-32, 4, 5, 0xA], [0, 4, 5, 0xB], [32, 5, 5, 0x1C], [64, 5, 6, 0x1D], [128, 4, 7, 0xC], [256, 3, 8, 0x1], [512, 3, 9, 0x2], [1024, 3, 10, 0x3], [-1025, 5, 32, 0x1E, 'lower'], [2048, 5, 32, 0x1F]];
+        break;
+      case 8:
+        lines = [[-15, 8, 3, 0xFC], [-7, 9, 1, 0x1FC], [-5, 8, 1, 0xFD], [-3, 9, 0, 0x1FD], [-2, 7, 0, 0x7C], [-1, 4, 0, 0xA], [0, 2, 1, 0x0], [2, 5, 0, 0x1A], [3, 6, 0, 0x3A], [4, 3, 4, 0x4], [20, 6, 1, 0x3B], [22, 4, 4, 0xB], [38, 4, 5, 0xC], [70, 5, 6, 0x1B], [134, 5, 7, 0x1C], [262, 6, 7, 0x3C], [390, 7, 8, 0x7D], [646, 6, 10, 0x3D], [-16, 9, 32, 0x1FE, 'lower'], [1670, 9, 32, 0x1FF], [2, 0x1]];
+        break;
+      case 9:
+        lines = [[-31, 8, 4, 0xFC], [-15, 9, 2, 0x1FC], [-11, 8, 2, 0xFD], [-7, 9, 1, 0x1FD], [-5, 7, 1, 0x7C], [-3, 4, 1, 0xA], [-1, 3, 1, 0x2], [1, 3, 1, 0x3], [3, 5, 1, 0x1A], [5, 6, 1, 0x3A], [7, 3, 5, 0x4], [39, 6, 2, 0x3B], [43, 4, 5, 0xB], [75, 4, 6, 0xC], [139, 5, 7, 0x1B], [267, 5, 8, 0x1C], [523, 6, 8, 0x3C], [779, 7, 9, 0x7D], [1291, 6, 11, 0x3D], [-32, 9, 32, 0x1FE, 'lower'], [3339, 9, 32, 0x1FF], [2, 0x0]];
+        break;
+      case 10:
+        lines = [[-21, 7, 4, 0x7A], [-5, 8, 0, 0xFC], [-4, 7, 0, 0x7B], [-3, 5, 0, 0x18], [-2, 2, 2, 0x0], [2, 5, 0, 0x19], [3, 6, 0, 0x36], [4, 7, 0, 0x7C], [5, 8, 0, 0xFD], [6, 2, 6, 0x1], [70, 5, 5, 0x1A], [102, 6, 5, 0x37], [134, 6, 6, 0x38], [198, 6, 7, 0x39], [326, 6, 8, 0x3A], [582, 6, 9, 0x3B], [1094, 6, 10, 0x3C], [2118, 7, 11, 0x7D], [-22, 8, 32, 0xFE, 'lower'], [4166, 8, 32, 0xFF], [2, 0x2]];
+        break;
+      case 11:
+        lines = [[1, 1, 0, 0x0], [2, 2, 1, 0x2], [4, 4, 0, 0xC], [5, 4, 1, 0xD], [7, 5, 1, 0x1C], [9, 5, 2, 0x1D], [13, 6, 2, 0x3C], [17, 7, 2, 0x7A], [21, 7, 3, 0x7B], [29, 7, 4, 0x7C], [45, 7, 5, 0x7D], [77, 7, 6, 0x7E], [141, 7, 32, 0x7F]];
+        break;
+      case 12:
+        lines = [[1, 1, 0, 0x0], [2, 2, 0, 0x2], [3, 3, 1, 0x6], [5, 5, 0, 0x1C], [6, 5, 1, 0x1D], [8, 6, 1, 0x3C], [10, 7, 0, 0x7A], [11, 7, 1, 0x7B], [13, 7, 2, 0x7C], [17, 7, 3, 0x7D], [25, 7, 4, 0x7E], [41, 8, 5, 0xFE], [73, 8, 32, 0xFF]];
+        break;
+      case 13:
+        lines = [[1, 1, 0, 0x0], [2, 3, 0, 0x4], [3, 4, 0, 0xC], [4, 5, 0, 0x1C], [5, 4, 1, 0xD], [7, 3, 3, 0x5], [15, 6, 1, 0x3A], [17, 6, 2, 0x3B], [21, 6, 3, 0x3C], [29, 6, 4, 0x3D], [45, 6, 5, 0x3E], [77, 7, 6, 0x7E], [141, 7, 32, 0x7F]];
+        break;
+      case 14:
+        lines = [[-2, 3, 0, 0x4], [-1, 3, 0, 0x5], [0, 1, 0, 0x0], [1, 3, 0, 0x6], [2, 3, 0, 0x7]];
+        break;
+      case 15:
+        lines = [[-24, 7, 4, 0x7C], [-8, 6, 2, 0x3C], [-4, 5, 1, 0x1C], [-2, 4, 0, 0xC], [-1, 3, 0, 0x4], [0, 1, 0, 0x0], [1, 3, 0, 0x5], [2, 4, 0, 0xD], [3, 5, 1, 0x1D], [5, 6, 2, 0x3D], [9, 7, 4, 0x7D], [-25, 7, 32, 0x7E, 'lower'], [25, 7, 32, 0x7F]];
+        break;
+      default:
+        throw new Jbig2Error('standard table B.' + number + ' does not exist');
+    }
+    var length = lines.length,
+        i = void 0;
+    for (i = 0; i < length; i++) {
+      lines[i] = new HuffmanLine(lines[i]);
+    }
+    table = new HuffmanTable(lines, true);
+    standardTablesCache[number] = table;
+    return table;
+  }
+  function Reader(data, start, end) {
+    this.data = data;
+    this.start = start;
+    this.end = end;
+    this.position = start;
+    this.shift = -1;
+    this.currentByte = 0;
+  }
+  Reader.prototype = {
+    readBit: function readBit() {
+      if (this.shift < 0) {
+        if (this.position >= this.end) {
+          throw new Jbig2Error('end of data while reading bit');
+        }
+        this.currentByte = this.data[this.position++];
+        this.shift = 7;
+      }
+      var bit = this.currentByte >> this.shift & 1;
+      this.shift--;
+      return bit;
+    },
+    readBits: function readBits(numBits) {
+      var result = 0,
+          i = void 0;
+      for (i = numBits - 1; i >= 0; i--) {
+        result |= this.readBit() << i;
+      }
+      return result;
+    },
+    byteAlign: function byteAlign() {
+      this.shift = -1;
+    },
+    next: function next() {
+      if (this.position >= this.end) {
+        return -1;
+      }
+      return this.data[this.position++];
+    }
+  };
+  function getCustomHuffmanTable(index, referredTo, customTables) {
+    var currentIndex = 0,
+        i = void 0,
+        ii = referredTo.length,
+        table = void 0;
+    for (i = 0; i < ii; i++) {
+      table = customTables[referredTo[i]];
+      if (table) {
+        if (index === currentIndex) {
+          return table;
+        }
+        currentIndex++;
+      }
+    }
+    throw new Jbig2Error('can\'t find custom Huffman table');
+  }
+  function getTextRegionHuffmanTables(textRegion, referredTo, customTables, numberOfSymbols, reader) {
+    var codes = [],
+        i = void 0,
+        codeLength = void 0;
+    for (i = 0; i <= 34; i++) {
+      codeLength = reader.readBits(4);
+      codes.push(new HuffmanLine([i, codeLength, 0, 0]));
+    }
+    var runCodesTable = new HuffmanTable(codes, false);
+    codes.length = 0;
+    for (i = 0; i < numberOfSymbols;) {
+      codeLength = runCodesTable.decode(reader);
+      if (codeLength >= 32) {
+        var repeatedLength = void 0,
+            numberOfRepeats = void 0,
+            j = void 0;
+        switch (codeLength) {
+          case 32:
+            if (i === 0) {
+              throw new Jbig2Error('no previous value in symbol ID table');
+            }
+            numberOfRepeats = reader.readBits(2) + 3;
+            repeatedLength = codes[i - 1].prefixLength;
+            break;
+          case 33:
+            numberOfRepeats = reader.readBits(3) + 3;
+            repeatedLength = 0;
+            break;
+          case 34:
+            numberOfRepeats = reader.readBits(7) + 11;
+            repeatedLength = 0;
+            break;
+          default:
+            throw new Jbig2Error('invalid code length in symbol ID table');
+        }
+        for (j = 0; j < numberOfRepeats; j++) {
+          codes.push(new HuffmanLine([i, repeatedLength, 0, 0]));
+          i++;
+        }
+      } else {
+        codes.push(new HuffmanLine([i, codeLength, 0, 0]));
+        i++;
+      }
+    }
+    reader.byteAlign();
+    var symbolIDTable = new HuffmanTable(codes, false);
+    var customIndex = 0,
+        tableFirstS = void 0,
+        tableDeltaS = void 0,
+        tableDeltaT = void 0;
+    switch (textRegion.huffmanFS) {
+      case 0:
+      case 1:
+        tableFirstS = getStandardTable(textRegion.huffmanFS + 6);
+        break;
+      case 3:
+        tableFirstS = getCustomHuffmanTable(customIndex, referredTo, customTables);
+        customIndex++;
+        break;
+      default:
+        throw new Jbig2Error('invalid Huffman FS selector');
+    }
+    switch (textRegion.huffmanDS) {
+      case 0:
+      case 1:
+      case 2:
+        tableDeltaS = getStandardTable(textRegion.huffmanDS + 8);
+        break;
+      case 3:
+        tableDeltaS = getCustomHuffmanTable(customIndex, referredTo, customTables);
+        customIndex++;
+        break;
+      default:
+        throw new Jbig2Error('invalid Huffman DS selector');
+    }
+    switch (textRegion.huffmanDT) {
+      case 0:
+      case 1:
+      case 2:
+        tableDeltaT = getStandardTable(textRegion.huffmanDT + 11);
+        break;
+      case 3:
+        tableDeltaT = getCustomHuffmanTable(customIndex, referredTo, customTables);
+        customIndex++;
+        break;
+      default:
+        throw new Jbig2Error('invalid Huffman DT selector');
+    }
+    if (textRegion.refinement) {
+      throw new Jbig2Error('refinement with Huffman is not supported');
+    }
+    return {
+      symbolIDTable: symbolIDTable,
+      tableFirstS: tableFirstS,
+      tableDeltaS: tableDeltaS,
+      tableDeltaT: tableDeltaT
+    };
+  }
+  function getSymbolDictionaryHuffmanTables(dictionary, referredTo, customTables) {
+    var customIndex = 0,
+        tableDeltaHeight = void 0,
+        tableDeltaWidth = void 0;
+    switch (dictionary.huffmanDHSelector) {
+      case 0:
+      case 1:
+        tableDeltaHeight = getStandardTable(dictionary.huffmanDHSelector + 4);
+        break;
+      case 3:
+        tableDeltaHeight = getCustomHuffmanTable(customIndex, referredTo, customTables);
+        customIndex++;
+        break;
+      default:
+        throw new Jbig2Error('invalid Huffman DH selector');
+    }
+    switch (dictionary.huffmanDWSelector) {
+      case 0:
+      case 1:
+        tableDeltaWidth = getStandardTable(dictionary.huffmanDWSelector + 2);
+        break;
+      case 3:
+        tableDeltaWidth = getCustomHuffmanTable(customIndex, referredTo, customTables);
+        customIndex++;
+        break;
+      default:
+        throw new Jbig2Error('invalid Huffman DW selector');
+    }
+    var tableBitmapSize = void 0,
+        tableAggregateInstances = void 0;
+    if (dictionary.bitmapSizeSelector) {
+      tableBitmapSize = getCustomHuffmanTable(customIndex, referredTo, customTables);
+      customIndex++;
+    } else {
+      tableBitmapSize = getStandardTable(1);
+    }
+    if (dictionary.aggregationInstancesSelector) {
+      tableAggregateInstances = getCustomHuffmanTable(customIndex, referredTo, customTables);
+    } else {
+      tableAggregateInstances = getStandardTable(1);
+    }
+    return {
+      tableDeltaHeight: tableDeltaHeight,
+      tableDeltaWidth: tableDeltaWidth,
+      tableBitmapSize: tableBitmapSize,
+      tableAggregateInstances: tableAggregateInstances
+    };
+  }
+  function readUncompressedBitmap(reader, width, height) {
+    var bitmap = [],
+        x = void 0,
+        y = void 0,
+        row = void 0;
+    for (y = 0; y < height; y++) {
+      row = new Uint8Array(width);
+      bitmap.push(row);
+      for (x = 0; x < width; x++) {
+        row[x] = reader.readBit();
+      }
+      reader.byteAlign();
+    }
+    return bitmap;
+  }
+  function decodeMMRBitmap(input, width, height, endOfBlock) {
+    var params = {
+      K: -1,
+      Columns: width,
+      Rows: height,
+      BlackIs1: true,
+      EndOfBlock: endOfBlock
+    };
+    var decoder = new _ccitt.CCITTFaxDecoder(input, params);
+    var bitmap = [],
+        x = void 0,
+        y = void 0,
+        row = void 0,
+        currentByte = void 0,
+        shift = void 0,
+        eof = false;
+    for (y = 0; y < height; y++) {
+      row = new Uint8Array(width);
+      bitmap.push(row);
+      shift = -1;
+      for (x = 0; x < width; x++) {
+        if (shift < 0) {
+          currentByte = decoder.readNextChar();
+          if (currentByte === -1) {
+            currentByte = 0;
+            eof = true;
+          }
+          shift = 7;
+        }
+        row[x] = currentByte >> shift & 1;
+        shift--;
+      }
+    }
+    if (endOfBlock && !eof) {
+      var lookForEOFLimit = 5;
+      for (var i = 0; i < lookForEOFLimit; i++) {
+        if (decoder.readNextChar() === -1) {
+          break;
+        }
+      }
+    }
+    return bitmap;
+  }
+  function Jbig2Image() {}
+  Jbig2Image.prototype = {
+    parseChunks: function parseChunks(chunks) {
+      return parseJbig2Chunks(chunks);
+    },
+    parse: function parse(data) {
+      var _parseJbig = parseJbig2(data),
+          imgData = _parseJbig.imgData,
+          width = _parseJbig.width,
+          height = _parseJbig.height;
+
+      this.width = width;
+      this.height = height;
+      return imgData;
+    }
+  };
+  return Jbig2Image;
+}();
+exports.Jbig2Image = Jbig2Image;
+
+/***/ }),
+/* 145 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+var ArithmeticDecoder = function ArithmeticDecoderClosure() {
+  var QeTable = [{
+    qe: 0x5601,
+    nmps: 1,
+    nlps: 1,
+    switchFlag: 1
+  }, {
+    qe: 0x3401,
+    nmps: 2,
+    nlps: 6,
+    switchFlag: 0
+  }, {
+    qe: 0x1801,
+    nmps: 3,
+    nlps: 9,
+    switchFlag: 0
+  }, {
+    qe: 0x0AC1,
+    nmps: 4,
+    nlps: 12,
+    switchFlag: 0
+  }, {
+    qe: 0x0521,
+    nmps: 5,
+    nlps: 29,
+    switchFlag: 0
+  }, {
+    qe: 0x0221,
+    nmps: 38,
+    nlps: 33,
+    switchFlag: 0
+  }, {
+    qe: 0x5601,
+    nmps: 7,
+    nlps: 6,
+    switchFlag: 1
+  }, {
+    qe: 0x5401,
+    nmps: 8,
+    nlps: 14,
+    switchFlag: 0
+  }, {
+    qe: 0x4801,
+    nmps: 9,
+    nlps: 14,
+    switchFlag: 0
+  }, {
+    qe: 0x3801,
+    nmps: 10,
+    nlps: 14,
+    switchFlag: 0
+  }, {
+    qe: 0x3001,
+    nmps: 11,
+    nlps: 17,
+    switchFlag: 0
+  }, {
+    qe: 0x2401,
+    nmps: 12,
+    nlps: 18,
+    switchFlag: 0
+  }, {
+    qe: 0x1C01,
+    nmps: 13,
+    nlps: 20,
+    switchFlag: 0
+  }, {
+    qe: 0x1601,
+    nmps: 29,
+    nlps: 21,
+    switchFlag: 0
+  }, {
+    qe: 0x5601,
+    nmps: 15,
+    nlps: 14,
+    switchFlag: 1
+  }, {
+    qe: 0x5401,
+    nmps: 16,
+    nlps: 14,
+    switchFlag: 0
+  }, {
+    qe: 0x5101,
+    nmps: 17,
+    nlps: 15,
+    switchFlag: 0
+  }, {
+    qe: 0x4801,
+    nmps: 18,
+    nlps: 16,
+    switchFlag: 0
+  }, {
+    qe: 0x3801,
+    nmps: 19,
+    nlps: 17,
+    switchFlag: 0
+  }, {
+    qe: 0x3401,
+    nmps: 20,
+    nlps: 18,
+    switchFlag: 0
+  }, {
+    qe: 0x3001,
+    nmps: 21,
+    nlps: 19,
+    switchFlag: 0
+  }, {
+    qe: 0x2801,
+    nmps: 22,
+    nlps: 19,
+    switchFlag: 0
+  }, {
+    qe: 0x2401,
+    nmps: 23,
+    nlps: 20,
+    switchFlag: 0
+  }, {
+    qe: 0x2201,
+    nmps: 24,
+    nlps: 21,
+    switchFlag: 0
+  }, {
+    qe: 0x1C01,
+    nmps: 25,
+    nlps: 22,
+    switchFlag: 0
+  }, {
+    qe: 0x1801,
+    nmps: 26,
+    nlps: 23,
+    switchFlag: 0
+  }, {
+    qe: 0x1601,
+    nmps: 27,
+    nlps: 24,
+    switchFlag: 0
+  }, {
+    qe: 0x1401,
+    nmps: 28,
+    nlps: 25,
+    switchFlag: 0
+  }, {
+    qe: 0x1201,
+    nmps: 29,
+    nlps: 26,
+    switchFlag: 0
+  }, {
+    qe: 0x1101,
+    nmps: 30,
+    nlps: 27,
+    switchFlag: 0
+  }, {
+    qe: 0x0AC1,
+    nmps: 31,
+    nlps: 28,
+    switchFlag: 0
+  }, {
+    qe: 0x09C1,
+    nmps: 32,
+    nlps: 29,
+    switchFlag: 0
+  }, {
+    qe: 0x08A1,
+    nmps: 33,
+    nlps: 30,
+    switchFlag: 0
+  }, {
+    qe: 0x0521,
+    nmps: 34,
+    nlps: 31,
+    switchFlag: 0
+  }, {
+    qe: 0x0441,
+    nmps: 35,
+    nlps: 32,
+    switchFlag: 0
+  }, {
+    qe: 0x02A1,
+    nmps: 36,
+    nlps: 33,
+    switchFlag: 0
+  }, {
+    qe: 0x0221,
+    nmps: 37,
+    nlps: 34,
+    switchFlag: 0
+  }, {
+    qe: 0x0141,
+    nmps: 38,
+    nlps: 35,
+    switchFlag: 0
+  }, {
+    qe: 0x0111,
+    nmps: 39,
+    nlps: 36,
+    switchFlag: 0
+  }, {
+    qe: 0x0085,
+    nmps: 40,
+    nlps: 37,
+    switchFlag: 0
+  }, {
+    qe: 0x0049,
+    nmps: 41,
+    nlps: 38,
+    switchFlag: 0
+  }, {
+    qe: 0x0025,
+    nmps: 42,
+    nlps: 39,
+    switchFlag: 0
+  }, {
+    qe: 0x0015,
+    nmps: 43,
+    nlps: 40,
+    switchFlag: 0
+  }, {
+    qe: 0x0009,
+    nmps: 44,
+    nlps: 41,
+    switchFlag: 0
+  }, {
+    qe: 0x0005,
+    nmps: 45,
+    nlps: 42,
+    switchFlag: 0
+  }, {
+    qe: 0x0001,
+    nmps: 45,
+    nlps: 43,
+    switchFlag: 0
+  }, {
+    qe: 0x5601,
+    nmps: 46,
+    nlps: 46,
+    switchFlag: 0
+  }];
+  function ArithmeticDecoder(data, start, end) {
+    this.data = data;
+    this.bp = start;
+    this.dataEnd = end;
+    this.chigh = data[start];
+    this.clow = 0;
+    this.byteIn();
+    this.chigh = this.chigh << 7 & 0xFFFF | this.clow >> 9 & 0x7F;
+    this.clow = this.clow << 7 & 0xFFFF;
+    this.ct -= 7;
+    this.a = 0x8000;
+  }
+  ArithmeticDecoder.prototype = {
+    byteIn: function ArithmeticDecoder_byteIn() {
+      var data = this.data;
+      var bp = this.bp;
+      if (data[bp] === 0xFF) {
+        var b1 = data[bp + 1];
+        if (b1 > 0x8F) {
+          this.clow += 0xFF00;
+          this.ct = 8;
+        } else {
+          bp++;
+          this.clow += data[bp] << 9;
+          this.ct = 7;
+          this.bp = bp;
+        }
+      } else {
+        bp++;
+        this.clow += bp < this.dataEnd ? data[bp] << 8 : 0xFF00;
+        this.ct = 8;
+        this.bp = bp;
+      }
+      if (this.clow > 0xFFFF) {
+        this.chigh += this.clow >> 16;
+        this.clow &= 0xFFFF;
+      }
+    },
+    readBit: function ArithmeticDecoder_readBit(contexts, pos) {
+      var cx_index = contexts[pos] >> 1,
+          cx_mps = contexts[pos] & 1;
+      var qeTableIcx = QeTable[cx_index];
+      var qeIcx = qeTableIcx.qe;
+      var d;
+      var a = this.a - qeIcx;
+      if (this.chigh < qeIcx) {
+        if (a < qeIcx) {
+          a = qeIcx;
+          d = cx_mps;
+          cx_index = qeTableIcx.nmps;
+        } else {
+          a = qeIcx;
+          d = 1 ^ cx_mps;
+          if (qeTableIcx.switchFlag === 1) {
+            cx_mps = d;
+          }
+          cx_index = qeTableIcx.nlps;
+        }
+      } else {
+        this.chigh -= qeIcx;
+        if ((a & 0x8000) !== 0) {
+          this.a = a;
+          return cx_mps;
+        }
+        if (a < qeIcx) {
+          d = 1 ^ cx_mps;
+          if (qeTableIcx.switchFlag === 1) {
+            cx_mps = d;
+          }
+          cx_index = qeTableIcx.nlps;
+        } else {
+          d = cx_mps;
+          cx_index = qeTableIcx.nmps;
+        }
+      }
+      do {
+        if (this.ct === 0) {
+          this.byteIn();
+        }
+        a <<= 1;
+        this.chigh = this.chigh << 1 & 0xFFFF | this.clow >> 15 & 1;
+        this.clow = this.clow << 1 & 0xFFFF;
+        this.ct--;
+      } while ((a & 0x8000) === 0);
+      this.a = a;
+      contexts[pos] = cx_index << 1 | cx_mps;
+      return d;
+    }
+  };
+  return ArithmeticDecoder;
+}();
+exports.ArithmeticDecoder = ArithmeticDecoder;
+
+/***/ }),
+/* 146 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.JpegStream = undefined;
+
+var _util = __w_pdfjs_require__(2);
+
+var _stream = __w_pdfjs_require__(140);
+
+var _primitives = __w_pdfjs_require__(138);
+
+var _jpg = __w_pdfjs_require__(147);
+
+var JpegStream = function JpegStreamClosure() {
+  function JpegStream(stream, maybeLength, dict, params) {
+    var ch = void 0;
+    while ((ch = stream.getByte()) !== -1) {
+      if (ch === 0xFF) {
+        stream.skip(-1);
+        break;
+      }
+    }
+    this.stream = stream;
+    this.maybeLength = maybeLength;
+    this.dict = dict;
+    this.params = params;
+    _stream.DecodeStream.call(this, maybeLength);
+  }
+  JpegStream.prototype = Object.create(_stream.DecodeStream.prototype);
+  Object.defineProperty(JpegStream.prototype, 'bytes', {
+    get: function JpegStream_bytes() {
+      return (0, _util.shadow)(this, 'bytes', this.stream.getBytes(this.maybeLength));
+    },
+    configurable: true
+  });
+  JpegStream.prototype.ensureBuffer = function (requested) {};
+  JpegStream.prototype.readBlock = function () {
+    if (this.eof) {
+      return;
+    }
+    var jpegOptions = {
+      decodeTransform: undefined,
+      colorTransform: undefined
+    };
+    var decodeArr = this.dict.getArray('Decode', 'D');
+    if (this.forceRGB && Array.isArray(decodeArr)) {
+      var bitsPerComponent = this.dict.get('BitsPerComponent') || 8;
+      var decodeArrLength = decodeArr.length;
+      var transform = new Int32Array(decodeArrLength);
+      var transformNeeded = false;
+      var maxValue = (1 << bitsPerComponent) - 1;
+      for (var i = 0; i < decodeArrLength; i += 2) {
+        transform[i] = (decodeArr[i + 1] - decodeArr[i]) * 256 | 0;
+        transform[i + 1] = decodeArr[i] * maxValue | 0;
+        if (transform[i] !== 256 || transform[i + 1] !== 0) {
+          transformNeeded = true;
+        }
+      }
+      if (transformNeeded) {
+        jpegOptions.decodeTransform = transform;
+      }
+    }
+    if ((0, _primitives.isDict)(this.params)) {
+      var colorTransform = this.params.get('ColorTransform');
+      if (Number.isInteger(colorTransform)) {
+        jpegOptions.colorTransform = colorTransform;
+      }
+    }
+    var jpegImage = new _jpg.JpegImage(jpegOptions);
+    jpegImage.parse(this.bytes);
+    var data = jpegImage.getData({
+      width: this.drawWidth,
+      height: this.drawHeight,
+      forceRGB: this.forceRGB,
+      isSourcePDF: true
+    });
+    this.buffer = data;
+    this.bufferLength = data.length;
+    this.eof = true;
+  };
+  JpegStream.prototype.getIR = function () {
+    var forceDataSchema = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+
+    return (0, _util.createObjectURL)(this.bytes, 'image/jpeg', forceDataSchema);
+  };
+  return JpegStream;
+}();
+exports.JpegStream = JpegStream;
+
+/***/ }),
+/* 147 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.JpegImage = undefined;
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+var _util = __w_pdfjs_require__(2);
+
+var JpegError = function JpegErrorClosure() {
+  function JpegError(msg) {
+    this.message = 'JPEG error: ' + msg;
+  }
+  JpegError.prototype = new Error();
+  JpegError.prototype.name = 'JpegError';
+  JpegError.constructor = JpegError;
+  return JpegError;
+}();
+var DNLMarkerError = function DNLMarkerErrorClosure() {
+  function DNLMarkerError(message, scanLines) {
+    this.message = message;
+    this.scanLines = scanLines;
+  }
+  DNLMarkerError.prototype = new Error();
+  DNLMarkerError.prototype.name = 'DNLMarkerError';
+  DNLMarkerError.constructor = DNLMarkerError;
+  return DNLMarkerError;
+}();
+var EOIMarkerError = function EOIMarkerErrorClosure() {
+  function EOIMarkerError(message) {
+    this.message = message;
+  }
+  EOIMarkerError.prototype = new Error();
+  EOIMarkerError.prototype.name = 'EOIMarkerError';
+  EOIMarkerError.constructor = EOIMarkerError;
+  return EOIMarkerError;
+}();
+var JpegImage = function JpegImageClosure() {
+  var dctZigZag = new Uint8Array([0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51, 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63]);
+  var dctCos1 = 4017;
+  var dctSin1 = 799;
+  var dctCos3 = 3406;
+  var dctSin3 = 2276;
+  var dctCos6 = 1567;
+  var dctSin6 = 3784;
+  var dctSqrt2 = 5793;
+  var dctSqrt1d2 = 2896;
+  function JpegImage() {
+    var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
+        _ref$decodeTransform = _ref.decodeTransform,
+        decodeTransform = _ref$decodeTransform === undefined ? null : _ref$decodeTransform,
+        _ref$colorTransform = _ref.colorTransform,
+        colorTransform = _ref$colorTransform === undefined ? -1 : _ref$colorTransform;
+
+    this._decodeTransform = decodeTransform;
+    this._colorTransform = colorTransform;
+  }
+  function buildHuffmanTable(codeLengths, values) {
+    var k = 0,
+        code = [],
+        i,
+        j,
+        length = 16;
+    while (length > 0 && !codeLengths[length - 1]) {
+      length--;
+    }
+    code.push({
+      children: [],
+      index: 0
+    });
+    var p = code[0],
+        q;
+    for (i = 0; i < length; i++) {
+      for (j = 0; j < codeLengths[i]; j++) {
+        p = code.pop();
+        p.children[p.index] = values[k];
+        while (p.index > 0) {
+          p = code.pop();
+        }
+        p.index++;
+        code.push(p);
+        while (code.length <= i) {
+          code.push(q = {
+            children: [],
+            index: 0
+          });
+          p.children[p.index] = q.children;
+          p = q;
+        }
+        k++;
+      }
+      if (i + 1 < length) {
+        code.push(q = {
+          children: [],
+          index: 0
+        });
+        p.children[p.index] = q.children;
+        p = q;
+      }
+    }
+    return code[0].children;
+  }
+  function getBlockBufferOffset(component, row, col) {
+    return 64 * ((component.blocksPerLine + 1) * row + col);
+  }
+  function decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successivePrev, successive) {
+    var parseDNLMarker = arguments.length > 9 && arguments[9] !== undefined ? arguments[9] : false;
+
+    var mcusPerLine = frame.mcusPerLine;
+    var progressive = frame.progressive;
+    var startOffset = offset,
+        bitsData = 0,
+        bitsCount = 0;
+    function readBit() {
+      if (bitsCount > 0) {
+        bitsCount--;
+        return bitsData >> bitsCount & 1;
+      }
+      bitsData = data[offset++];
+      if (bitsData === 0xFF) {
+        var nextByte = data[offset++];
+        if (nextByte) {
+          if (nextByte === 0xDC && parseDNLMarker) {
+            offset += 2;
+            var scanLines = data[offset++] << 8 | data[offset++];
+            if (scanLines > 0 && scanLines !== frame.scanLines) {
+              throw new DNLMarkerError('Found DNL marker (0xFFDC) while parsing scan data', scanLines);
+            }
+          } else if (nextByte === 0xD9) {
+            throw new EOIMarkerError('Found EOI marker (0xFFD9) while parsing scan data');
+          }
+          throw new JpegError('unexpected marker ' + (bitsData << 8 | nextByte).toString(16));
+        }
+      }
+      bitsCount = 7;
+      return bitsData >>> 7;
+    }
+    function decodeHuffman(tree) {
+      var node = tree;
+      while (true) {
+        node = node[readBit()];
+        if (typeof node === 'number') {
+          return node;
+        }
+        if ((typeof node === 'undefined' ? 'undefined' : _typeof(node)) !== 'object') {
+          throw new JpegError('invalid huffman sequence');
+        }
+      }
+    }
+    function receive(length) {
+      var n = 0;
+      while (length > 0) {
+        n = n << 1 | readBit();
+        length--;
+      }
+      return n;
+    }
+    function receiveAndExtend(length) {
+      if (length === 1) {
+        return readBit() === 1 ? 1 : -1;
+      }
+      var n = receive(length);
+      if (n >= 1 << length - 1) {
+        return n;
+      }
+      return n + (-1 << length) + 1;
+    }
+    function decodeBaseline(component, offset) {
+      var t = decodeHuffman(component.huffmanTableDC);
+      var diff = t === 0 ? 0 : receiveAndExtend(t);
+      component.blockData[offset] = component.pred += diff;
+      var k = 1;
+      while (k < 64) {
+        var rs = decodeHuffman(component.huffmanTableAC);
+        var s = rs & 15,
+            r = rs >> 4;
+        if (s === 0) {
+          if (r < 15) {
+            break;
+          }
+          k += 16;
+          continue;
+        }
+        k += r;
+        var z = dctZigZag[k];
+        component.blockData[offset + z] = receiveAndExtend(s);
+        k++;
+      }
+    }
+    function decodeDCFirst(component, offset) {
+      var t = decodeHuffman(component.huffmanTableDC);
+      var diff = t === 0 ? 0 : receiveAndExtend(t) << successive;
+      component.blockData[offset] = component.pred += diff;
+    }
+    function decodeDCSuccessive(component, offset) {
+      component.blockData[offset] |= readBit() << successive;
+    }
+    var eobrun = 0;
+    function decodeACFirst(component, offset) {
+      if (eobrun > 0) {
+        eobrun--;
+        return;
+      }
+      var k = spectralStart,
+          e = spectralEnd;
+      while (k <= e) {
+        var rs = decodeHuffman(component.huffmanTableAC);
+        var s = rs & 15,
+            r = rs >> 4;
+        if (s === 0) {
+          if (r < 15) {
+            eobrun = receive(r) + (1 << r) - 1;
+            break;
+          }
+          k += 16;
+          continue;
+        }
+        k += r;
+        var z = dctZigZag[k];
+        component.blockData[offset + z] = receiveAndExtend(s) * (1 << successive);
+        k++;
+      }
+    }
+    var successiveACState = 0,
+        successiveACNextValue;
+    function decodeACSuccessive(component, offset) {
+      var k = spectralStart;
+      var e = spectralEnd;
+      var r = 0;
+      var s;
+      var rs;
+      while (k <= e) {
+        var offsetZ = offset + dctZigZag[k];
+        var sign = component.blockData[offsetZ] < 0 ? -1 : 1;
+        switch (successiveACState) {
+          case 0:
+            rs = decodeHuffman(component.huffmanTableAC);
+            s = rs & 15;
+            r = rs >> 4;
+            if (s === 0) {
+              if (r < 15) {
+                eobrun = receive(r) + (1 << r);
+                successiveACState = 4;
+              } else {
+                r = 16;
+                successiveACState = 1;
+              }
+            } else {
+              if (s !== 1) {
+                throw new JpegError('invalid ACn encoding');
+              }
+              successiveACNextValue = receiveAndExtend(s);
+              successiveACState = r ? 2 : 3;
+            }
+            continue;
+          case 1:
+          case 2:
+            if (component.blockData[offsetZ]) {
+              component.blockData[offsetZ] += sign * (readBit() << successive);
+            } else {
+              r--;
+              if (r === 0) {
+                successiveACState = successiveACState === 2 ? 3 : 0;
+              }
+            }
+            break;
+          case 3:
+            if (component.blockData[offsetZ]) {
+              component.blockData[offsetZ] += sign * (readBit() << successive);
+            } else {
+              component.blockData[offsetZ] = successiveACNextValue << successive;
+              successiveACState = 0;
+            }
+            break;
+          case 4:
+            if (component.blockData[offsetZ]) {
+              component.blockData[offsetZ] += sign * (readBit() << successive);
+            }
+            break;
+        }
+        k++;
+      }
+      if (successiveACState === 4) {
+        eobrun--;
+        if (eobrun === 0) {
+          successiveACState = 0;
+        }
+      }
+    }
+    function decodeMcu(component, decode, mcu, row, col) {
+      var mcuRow = mcu / mcusPerLine | 0;
+      var mcuCol = mcu % mcusPerLine;
+      var blockRow = mcuRow * component.v + row;
+      var blockCol = mcuCol * component.h + col;
+      var offset = getBlockBufferOffset(component, blockRow, blockCol);
+      decode(component, offset);
+    }
+    function decodeBlock(component, decode, mcu) {
+      var blockRow = mcu / component.blocksPerLine | 0;
+      var blockCol = mcu % component.blocksPerLine;
+      var offset = getBlockBufferOffset(component, blockRow, blockCol);
+      decode(component, offset);
+    }
+    var componentsLength = components.length;
+    var component, i, j, k, n;
+    var decodeFn;
+    if (progressive) {
+      if (spectralStart === 0) {
+        decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive;
+      } else {
+        decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive;
+      }
+    } else {
+      decodeFn = decodeBaseline;
+    }
+    var mcu = 0,
+        fileMarker;
+    var mcuExpected;
+    if (componentsLength === 1) {
+      mcuExpected = components[0].blocksPerLine * components[0].blocksPerColumn;
+    } else {
+      mcuExpected = mcusPerLine * frame.mcusPerColumn;
+    }
+    var h, v;
+    while (mcu < mcuExpected) {
+      var mcuToRead = resetInterval ? Math.min(mcuExpected - mcu, resetInterval) : mcuExpected;
+      for (i = 0; i < componentsLength; i++) {
+        components[i].pred = 0;
+      }
+      eobrun = 0;
+      if (componentsLength === 1) {
+        component = components[0];
+        for (n = 0; n < mcuToRead; n++) {
+          decodeBlock(component, decodeFn, mcu);
+          mcu++;
+        }
+      } else {
+        for (n = 0; n < mcuToRead; n++) {
+          for (i = 0; i < componentsLength; i++) {
+            component = components[i];
+            h = component.h;
+            v = component.v;
+            for (j = 0; j < v; j++) {
+              for (k = 0; k < h; k++) {
+                decodeMcu(component, decodeFn, mcu, j, k);
+              }
+            }
+          }
+          mcu++;
+        }
+      }
+      bitsCount = 0;
+      fileMarker = findNextFileMarker(data, offset);
+      if (fileMarker && fileMarker.invalid) {
+        (0, _util.warn)('decodeScan - unexpected MCU data, current marker is: ' + fileMarker.invalid);
+        offset = fileMarker.offset;
+      }
+      var marker = fileMarker && fileMarker.marker;
+      if (!marker || marker <= 0xFF00) {
+        throw new JpegError('marker was not found');
+      }
+      if (marker >= 0xFFD0 && marker <= 0xFFD7) {
+        offset += 2;
+      } else {
+        break;
+      }
+    }
+    fileMarker = findNextFileMarker(data, offset);
+    if (fileMarker && fileMarker.invalid) {
+      (0, _util.warn)('decodeScan - unexpected Scan data, current marker is: ' + fileMarker.invalid);
+      offset = fileMarker.offset;
+    }
+    return offset - startOffset;
+  }
+  function quantizeAndInverse(component, blockBufferOffset, p) {
+    var qt = component.quantizationTable,
+        blockData = component.blockData;
+    var v0, v1, v2, v3, v4, v5, v6, v7;
+    var p0, p1, p2, p3, p4, p5, p6, p7;
+    var t;
+    if (!qt) {
+      throw new JpegError('missing required Quantization Table.');
+    }
+    for (var row = 0; row < 64; row += 8) {
+      p0 = blockData[blockBufferOffset + row];
+      p1 = blockData[blockBufferOffset + row + 1];
+      p2 = blockData[blockBufferOffset + row + 2];
+      p3 = blockData[blockBufferOffset + row + 3];
+      p4 = blockData[blockBufferOffset + row + 4];
+      p5 = blockData[blockBufferOffset + row + 5];
+      p6 = blockData[blockBufferOffset + row + 6];
+      p7 = blockData[blockBufferOffset + row + 7];
+      p0 *= qt[row];
+      if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) {
+        t = dctSqrt2 * p0 + 512 >> 10;
+        p[row] = t;
+        p[row + 1] = t;
+        p[row + 2] = t;
+        p[row + 3] = t;
+        p[row + 4] = t;
+        p[row + 5] = t;
+        p[row + 6] = t;
+        p[row + 7] = t;
+        continue;
+      }
+      p1 *= qt[row + 1];
+      p2 *= qt[row + 2];
+      p3 *= qt[row + 3];
+      p4 *= qt[row + 4];
+      p5 *= qt[row + 5];
+      p6 *= qt[row + 6];
+      p7 *= qt[row + 7];
+      v0 = dctSqrt2 * p0 + 128 >> 8;
+      v1 = dctSqrt2 * p4 + 128 >> 8;
+      v2 = p2;
+      v3 = p6;
+      v4 = dctSqrt1d2 * (p1 - p7) + 128 >> 8;
+      v7 = dctSqrt1d2 * (p1 + p7) + 128 >> 8;
+      v5 = p3 << 4;
+      v6 = p5 << 4;
+      v0 = v0 + v1 + 1 >> 1;
+      v1 = v0 - v1;
+      t = v2 * dctSin6 + v3 * dctCos6 + 128 >> 8;
+      v2 = v2 * dctCos6 - v3 * dctSin6 + 128 >> 8;
+      v3 = t;
+      v4 = v4 + v6 + 1 >> 1;
+      v6 = v4 - v6;
+      v7 = v7 + v5 + 1 >> 1;
+      v5 = v7 - v5;
+      v0 = v0 + v3 + 1 >> 1;
+      v3 = v0 - v3;
+      v1 = v1 + v2 + 1 >> 1;
+      v2 = v1 - v2;
+      t = v4 * dctSin3 + v7 * dctCos3 + 2048 >> 12;
+      v4 = v4 * dctCos3 - v7 * dctSin3 + 2048 >> 12;
+      v7 = t;
+      t = v5 * dctSin1 + v6 * dctCos1 + 2048 >> 12;
+      v5 = v5 * dctCos1 - v6 * dctSin1 + 2048 >> 12;
+      v6 = t;
+      p[row] = v0 + v7;
+      p[row + 7] = v0 - v7;
+      p[row + 1] = v1 + v6;
+      p[row + 6] = v1 - v6;
+      p[row + 2] = v2 + v5;
+      p[row + 5] = v2 - v5;
+      p[row + 3] = v3 + v4;
+      p[row + 4] = v3 - v4;
+    }
+    for (var col = 0; col < 8; ++col) {
+      p0 = p[col];
+      p1 = p[col + 8];
+      p2 = p[col + 16];
+      p3 = p[col + 24];
+      p4 = p[col + 32];
+      p5 = p[col + 40];
+      p6 = p[col + 48];
+      p7 = p[col + 56];
+      if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) {
+        t = dctSqrt2 * p0 + 8192 >> 14;
+        t = t < -2040 ? 0 : t >= 2024 ? 255 : t + 2056 >> 4;
+        blockData[blockBufferOffset + col] = t;
+        blockData[blockBufferOffset + col + 8] = t;
+        blockData[blockBufferOffset + col + 16] = t;
+        blockData[blockBufferOffset + col + 24] = t;
+        blockData[blockBufferOffset + col + 32] = t;
+        blockData[blockBufferOffset + col + 40] = t;
+        blockData[blockBufferOffset + col + 48] = t;
+        blockData[blockBufferOffset + col + 56] = t;
+        continue;
+      }
+      v0 = dctSqrt2 * p0 + 2048 >> 12;
+      v1 = dctSqrt2 * p4 + 2048 >> 12;
+      v2 = p2;
+      v3 = p6;
+      v4 = dctSqrt1d2 * (p1 - p7) + 2048 >> 12;
+      v7 = dctSqrt1d2 * (p1 + p7) + 2048 >> 12;
+      v5 = p3;
+      v6 = p5;
+      v0 = (v0 + v1 + 1 >> 1) + 4112;
+      v1 = v0 - v1;
+      t = v2 * dctSin6 + v3 * dctCos6 + 2048 >> 12;
+      v2 = v2 * dctCos6 - v3 * dctSin6 + 2048 >> 12;
+      v3 = t;
+      v4 = v4 + v6 + 1 >> 1;
+      v6 = v4 - v6;
+      v7 = v7 + v5 + 1 >> 1;
+      v5 = v7 - v5;
+      v0 = v0 + v3 + 1 >> 1;
+      v3 = v0 - v3;
+      v1 = v1 + v2 + 1 >> 1;
+      v2 = v1 - v2;
+      t = v4 * dctSin3 + v7 * dctCos3 + 2048 >> 12;
+      v4 = v4 * dctCos3 - v7 * dctSin3 + 2048 >> 12;
+      v7 = t;
+      t = v5 * dctSin1 + v6 * dctCos1 + 2048 >> 12;
+      v5 = v5 * dctCos1 - v6 * dctSin1 + 2048 >> 12;
+      v6 = t;
+      p0 = v0 + v7;
+      p7 = v0 - v7;
+      p1 = v1 + v6;
+      p6 = v1 - v6;
+      p2 = v2 + v5;
+      p5 = v2 - v5;
+      p3 = v3 + v4;
+      p4 = v3 - v4;
+      p0 = p0 < 16 ? 0 : p0 >= 4080 ? 255 : p0 >> 4;
+      p1 = p1 < 16 ? 0 : p1 >= 4080 ? 255 : p1 >> 4;
+      p2 = p2 < 16 ? 0 : p2 >= 4080 ? 255 : p2 >> 4;
+      p3 = p3 < 16 ? 0 : p3 >= 4080 ? 255 : p3 >> 4;
+      p4 = p4 < 16 ? 0 : p4 >= 4080 ? 255 : p4 >> 4;
+      p5 = p5 < 16 ? 0 : p5 >= 4080 ? 255 : p5 >> 4;
+      p6 = p6 < 16 ? 0 : p6 >= 4080 ? 255 : p6 >> 4;
+      p7 = p7 < 16 ? 0 : p7 >= 4080 ? 255 : p7 >> 4;
+      blockData[blockBufferOffset + col] = p0;
+      blockData[blockBufferOffset + col + 8] = p1;
+      blockData[blockBufferOffset + col + 16] = p2;
+      blockData[blockBufferOffset + col + 24] = p3;
+      blockData[blockBufferOffset + col + 32] = p4;
+      blockData[blockBufferOffset + col + 40] = p5;
+      blockData[blockBufferOffset + col + 48] = p6;
+      blockData[blockBufferOffset + col + 56] = p7;
+    }
+  }
+  function buildComponentData(frame, component) {
+    var blocksPerLine = component.blocksPerLine;
+    var blocksPerColumn = component.blocksPerColumn;
+    var computationBuffer = new Int16Array(64);
+    for (var blockRow = 0; blockRow < blocksPerColumn; blockRow++) {
+      for (var blockCol = 0; blockCol < blocksPerLine; blockCol++) {
+        var offset = getBlockBufferOffset(component, blockRow, blockCol);
+        quantizeAndInverse(component, offset, computationBuffer);
+      }
+    }
+    return component.blockData;
+  }
+  function findNextFileMarker(data, currentPos) {
+    var startPos = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : currentPos;
+
+    function peekUint16(pos) {
+      return data[pos] << 8 | data[pos + 1];
+    }
+    var maxPos = data.length - 1;
+    var newPos = startPos < currentPos ? startPos : currentPos;
+    if (currentPos >= maxPos) {
+      return null;
+    }
+    var currentMarker = peekUint16(currentPos);
+    if (currentMarker >= 0xFFC0 && currentMarker <= 0xFFFE) {
+      return {
+        invalid: null,
+        marker: currentMarker,
+        offset: currentPos
+      };
+    }
+    var newMarker = peekUint16(newPos);
+    while (!(newMarker >= 0xFFC0 && newMarker <= 0xFFFE)) {
+      if (++newPos >= maxPos) {
+        return null;
+      }
+      newMarker = peekUint16(newPos);
+    }
+    return {
+      invalid: currentMarker.toString(16),
+      marker: newMarker,
+      offset: newPos
+    };
+  }
+  JpegImage.prototype = {
+    parse: function parse(data) {
+      var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
+          _ref2$dnlScanLines = _ref2.dnlScanLines,
+          dnlScanLines = _ref2$dnlScanLines === undefined ? null : _ref2$dnlScanLines;
+
+      function readUint16() {
+        var value = data[offset] << 8 | data[offset + 1];
+        offset += 2;
+        return value;
+      }
+      function readDataBlock() {
+        var length = readUint16();
+        var endOffset = offset + length - 2;
+        var fileMarker = findNextFileMarker(data, endOffset, offset);
+        if (fileMarker && fileMarker.invalid) {
+          (0, _util.warn)('readDataBlock - incorrect length, current marker is: ' + fileMarker.invalid);
+          endOffset = fileMarker.offset;
+        }
+        var array = data.subarray(offset, endOffset);
+        offset += array.length;
+        return array;
+      }
+      function prepareComponents(frame) {
+        var mcusPerLine = Math.ceil(frame.samplesPerLine / 8 / frame.maxH);
+        var mcusPerColumn = Math.ceil(frame.scanLines / 8 / frame.maxV);
+        for (var i = 0; i < frame.components.length; i++) {
+          component = frame.components[i];
+          var blocksPerLine = Math.ceil(Math.ceil(frame.samplesPerLine / 8) * component.h / frame.maxH);
+          var blocksPerColumn = Math.ceil(Math.ceil(frame.scanLines / 8) * component.v / frame.maxV);
+          var blocksPerLineForMcu = mcusPerLine * component.h;
+          var blocksPerColumnForMcu = mcusPerColumn * component.v;
+          var blocksBufferSize = 64 * blocksPerColumnForMcu * (blocksPerLineForMcu + 1);
+          component.blockData = new Int16Array(blocksBufferSize);
+          component.blocksPerLine = blocksPerLine;
+          component.blocksPerColumn = blocksPerColumn;
+        }
+        frame.mcusPerLine = mcusPerLine;
+        frame.mcusPerColumn = mcusPerColumn;
+      }
+      var offset = 0;
+      var jfif = null;
+      var adobe = null;
+      var frame, resetInterval;
+      var numSOSMarkers = 0;
+      var quantizationTables = [];
+      var huffmanTablesAC = [],
+          huffmanTablesDC = [];
+      var fileMarker = readUint16();
+      if (fileMarker !== 0xFFD8) {
+        throw new JpegError('SOI not found');
+      }
+      fileMarker = readUint16();
+      markerLoop: while (fileMarker !== 0xFFD9) {
+        var i, j, l;
+        switch (fileMarker) {
+          case 0xFFE0:
+          case 0xFFE1:
+          case 0xFFE2:
+          case 0xFFE3:
+          case 0xFFE4:
+          case 0xFFE5:
+          case 0xFFE6:
+          case 0xFFE7:
+          case 0xFFE8:
+          case 0xFFE9:
+          case 0xFFEA:
+          case 0xFFEB:
+          case 0xFFEC:
+          case 0xFFED:
+          case 0xFFEE:
+          case 0xFFEF:
+          case 0xFFFE:
+            var appData = readDataBlock();
+            if (fileMarker === 0xFFE0) {
+              if (appData[0] === 0x4A && appData[1] === 0x46 && appData[2] === 0x49 && appData[3] === 0x46 && appData[4] === 0) {
+                jfif = {
+                  version: {
+                    major: appData[5],
+                    minor: appData[6]
+                  },
+                  densityUnits: appData[7],
+                  xDensity: appData[8] << 8 | appData[9],
+                  yDensity: appData[10] << 8 | appData[11],
+                  thumbWidth: appData[12],
+                  thumbHeight: appData[13],
+                  thumbData: appData.subarray(14, 14 + 3 * appData[12] * appData[13])
+                };
+              }
+            }
+            if (fileMarker === 0xFFEE) {
+              if (appData[0] === 0x41 && appData[1] === 0x64 && appData[2] === 0x6F && appData[3] === 0x62 && appData[4] === 0x65) {
+                adobe = {
+                  version: appData[5] << 8 | appData[6],
+                  flags0: appData[7] << 8 | appData[8],
+                  flags1: appData[9] << 8 | appData[10],
+                  transformCode: appData[11]
+                };
+              }
+            }
+            break;
+          case 0xFFDB:
+            var quantizationTablesLength = readUint16();
+            var quantizationTablesEnd = quantizationTablesLength + offset - 2;
+            var z;
+            while (offset < quantizationTablesEnd) {
+              var quantizationTableSpec = data[offset++];
+              var tableData = new Uint16Array(64);
+              if (quantizationTableSpec >> 4 === 0) {
+                for (j = 0; j < 64; j++) {
+                  z = dctZigZag[j];
+                  tableData[z] = data[offset++];
+                }
+              } else if (quantizationTableSpec >> 4 === 1) {
+                for (j = 0; j < 64; j++) {
+                  z = dctZigZag[j];
+                  tableData[z] = readUint16();
+                }
+              } else {
+                throw new JpegError('DQT - invalid table spec');
+              }
+              quantizationTables[quantizationTableSpec & 15] = tableData;
+            }
+            break;
+          case 0xFFC0:
+          case 0xFFC1:
+          case 0xFFC2:
+            if (frame) {
+              throw new JpegError('Only single frame JPEGs supported');
+            }
+            readUint16();
+            frame = {};
+            frame.extended = fileMarker === 0xFFC1;
+            frame.progressive = fileMarker === 0xFFC2;
+            frame.precision = data[offset++];
+            var sofScanLines = readUint16();
+            frame.scanLines = dnlScanLines || sofScanLines;
+            frame.samplesPerLine = readUint16();
+            frame.components = [];
+            frame.componentIds = {};
+            var componentsCount = data[offset++],
+                componentId;
+            var maxH = 0,
+                maxV = 0;
+            for (i = 0; i < componentsCount; i++) {
+              componentId = data[offset];
+              var h = data[offset + 1] >> 4;
+              var v = data[offset + 1] & 15;
+              if (maxH < h) {
+                maxH = h;
+              }
+              if (maxV < v) {
+                maxV = v;
+              }
+              var qId = data[offset + 2];
+              l = frame.components.push({
+                h: h,
+                v: v,
+                quantizationId: qId,
+                quantizationTable: null
+              });
+              frame.componentIds[componentId] = l - 1;
+              offset += 3;
+            }
+            frame.maxH = maxH;
+            frame.maxV = maxV;
+            prepareComponents(frame);
+            break;
+          case 0xFFC4:
+            var huffmanLength = readUint16();
+            for (i = 2; i < huffmanLength;) {
+              var huffmanTableSpec = data[offset++];
+              var codeLengths = new Uint8Array(16);
+              var codeLengthSum = 0;
+              for (j = 0; j < 16; j++, offset++) {
+                codeLengthSum += codeLengths[j] = data[offset];
+              }
+              var huffmanValues = new Uint8Array(codeLengthSum);
+              for (j = 0; j < codeLengthSum; j++, offset++) {
+                huffmanValues[j] = data[offset];
+              }
+              i += 17 + codeLengthSum;
+              (huffmanTableSpec >> 4 === 0 ? huffmanTablesDC : huffmanTablesAC)[huffmanTableSpec & 15] = buildHuffmanTable(codeLengths, huffmanValues);
+            }
+            break;
+          case 0xFFDD:
+            readUint16();
+            resetInterval = readUint16();
+            break;
+          case 0xFFDA:
+            var parseDNLMarker = ++numSOSMarkers === 1 && !dnlScanLines;
+            readUint16();
+            var selectorsCount = data[offset++];
+            var components = [],
+                component;
+            for (i = 0; i < selectorsCount; i++) {
+              var componentIndex = frame.componentIds[data[offset++]];
+              component = frame.components[componentIndex];
+              var tableSpec = data[offset++];
+              component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4];
+              component.huffmanTableAC = huffmanTablesAC[tableSpec & 15];
+              components.push(component);
+            }
+            var spectralStart = data[offset++];
+            var spectralEnd = data[offset++];
+            var successiveApproximation = data[offset++];
+            try {
+              var processed = decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successiveApproximation >> 4, successiveApproximation & 15, parseDNLMarker);
+              offset += processed;
+            } catch (ex) {
+              if (ex instanceof DNLMarkerError) {
+                (0, _util.warn)(ex.message + ' -- attempting to re-parse the JPEG image.');
+                return this.parse(data, { dnlScanLines: ex.scanLines });
+              } else if (ex instanceof EOIMarkerError) {
+                (0, _util.warn)(ex.message + ' -- ignoring the rest of the image data.');
+                break markerLoop;
+              }
+              throw ex;
+            }
+            break;
+          case 0xFFDC:
+            offset += 4;
+            break;
+          case 0xFFFF:
+            if (data[offset] !== 0xFF) {
+              offset--;
+            }
+            break;
+          default:
+            if (data[offset - 3] === 0xFF && data[offset - 2] >= 0xC0 && data[offset - 2] <= 0xFE) {
+              offset -= 3;
+              break;
+            }
+            var nextFileMarker = findNextFileMarker(data, offset - 2);
+            if (nextFileMarker && nextFileMarker.invalid) {
+              (0, _util.warn)('JpegImage.parse - unexpected data, current marker is: ' + nextFileMarker.invalid);
+              offset = nextFileMarker.offset;
+              break;
+            }
+            throw new JpegError('unknown marker ' + fileMarker.toString(16));
+        }
+        fileMarker = readUint16();
+      }
+      this.width = frame.samplesPerLine;
+      this.height = frame.scanLines;
+      this.jfif = jfif;
+      this.adobe = adobe;
+      this.components = [];
+      for (i = 0; i < frame.components.length; i++) {
+        component = frame.components[i];
+        var quantizationTable = quantizationTables[component.quantizationId];
+        if (quantizationTable) {
+          component.quantizationTable = quantizationTable;
+        }
+        this.components.push({
+          output: buildComponentData(frame, component),
+          scaleX: component.h / frame.maxH,
+          scaleY: component.v / frame.maxV,
+          blocksPerLine: component.blocksPerLine,
+          blocksPerColumn: component.blocksPerColumn
+        });
+      }
+      this.numComponents = this.components.length;
+    },
+    _getLinearizedBlockData: function _getLinearizedBlockData(width, height) {
+      var isSourcePDF = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
+
+      var scaleX = this.width / width,
+          scaleY = this.height / height;
+      var component, componentScaleX, componentScaleY, blocksPerScanline;
+      var x, y, i, j, k;
+      var index;
+      var offset = 0;
+      var output;
+      var numComponents = this.components.length;
+      var dataLength = width * height * numComponents;
+      var data = new Uint8ClampedArray(dataLength);
+      var xScaleBlockOffset = new Uint32Array(width);
+      var mask3LSB = 0xfffffff8;
+      for (i = 0; i < numComponents; i++) {
+        component = this.components[i];
+        componentScaleX = component.scaleX * scaleX;
+        componentScaleY = component.scaleY * scaleY;
+        offset = i;
+        output = component.output;
+        blocksPerScanline = component.blocksPerLine + 1 << 3;
+        for (x = 0; x < width; x++) {
+          j = 0 | x * componentScaleX;
+          xScaleBlockOffset[x] = (j & mask3LSB) << 3 | j & 7;
+        }
+        for (y = 0; y < height; y++) {
+          j = 0 | y * componentScaleY;
+          index = blocksPerScanline * (j & mask3LSB) | (j & 7) << 3;
+          for (x = 0; x < width; x++) {
+            data[offset] = output[index + xScaleBlockOffset[x]];
+            offset += numComponents;
+          }
+        }
+      }
+      var transform = this._decodeTransform;
+      if (!isSourcePDF && numComponents === 4 && !transform) {
+        transform = new Int32Array([-256, 255, -256, 255, -256, 255, -256, 255]);
+      }
+      if (transform) {
+        for (i = 0; i < dataLength;) {
+          for (j = 0, k = 0; j < numComponents; j++, i++, k += 2) {
+            data[i] = (data[i] * transform[k] >> 8) + transform[k + 1];
+          }
+        }
+      }
+      return data;
+    },
+
+    get _isColorConversionNeeded() {
+      if (this.adobe) {
+        return !!this.adobe.transformCode;
+      }
+      if (this.numComponents === 3) {
+        if (this._colorTransform === 0) {
+          return false;
+        }
+        return true;
+      }
+      if (this._colorTransform === 1) {
+        return true;
+      }
+      return false;
+    },
+    _convertYccToRgb: function convertYccToRgb(data) {
+      var Y, Cb, Cr;
+      for (var i = 0, length = data.length; i < length; i += 3) {
+        Y = data[i];
+        Cb = data[i + 1];
+        Cr = data[i + 2];
+        data[i] = Y - 179.456 + 1.402 * Cr;
+        data[i + 1] = Y + 135.459 - 0.344 * Cb - 0.714 * Cr;
+        data[i + 2] = Y - 226.816 + 1.772 * Cb;
+      }
+      return data;
+    },
+    _convertYcckToRgb: function convertYcckToRgb(data) {
+      var Y, Cb, Cr, k;
+      var offset = 0;
+      for (var i = 0, length = data.length; i < length; i += 4) {
+        Y = data[i];
+        Cb = data[i + 1];
+        Cr = data[i + 2];
+        k = data[i + 3];
+        data[offset++] = -122.67195406894 + Cb * (-6.60635669420364e-5 * Cb + 0.000437130475926232 * Cr - 5.4080610064599e-5 * Y + 0.00048449797120281 * k - 0.154362151871126) + Cr * (-0.000957964378445773 * Cr + 0.000817076911346625 * Y - 0.00477271405408747 * k + 1.53380253221734) + Y * (0.000961250184130688 * Y - 0.00266257332283933 * k + 0.48357088451265) + k * (-0.000336197177618394 * k + 0.484791561490776);
+        data[offset++] = 107.268039397724 + Cb * (2.19927104525741e-5 * Cb - 0.000640992018297945 * Cr + 0.000659397001245577 * Y + 0.000426105652938837 * k - 0.176491792462875) + Cr * (-0.000778269941513683 * Cr + 0.00130872261408275 * Y + 0.000770482631801132 * k - 0.151051492775562) + Y * (0.00126935368114843 * Y - 0.00265090189010898 * k + 0.25802910206845) + k * (-0.000318913117588328 * k - 0.213742400323665);
+        data[offset++] = -20.810012546947 + Cb * (-0.000570115196973677 * Cb - 2.63409051004589e-5 * Cr + 0.0020741088115012 * Y - 0.00288260236853442 * k + 0.814272968359295) + Cr * (-1.53496057440975e-5 * Cr - 0.000132689043961446 * Y + 0.000560833691242812 * k - 0.195152027534049) + Y * (0.00174418132927582 * Y - 0.00255243321439347 * k + 0.116935020465145) + k * (-0.000343531996510555 * k + 0.24165260232407);
+      }
+      return data.subarray(0, offset);
+    },
+    _convertYcckToCmyk: function convertYcckToCmyk(data) {
+      var Y, Cb, Cr;
+      for (var i = 0, length = data.length; i < length; i += 4) {
+        Y = data[i];
+        Cb = data[i + 1];
+        Cr = data[i + 2];
+        data[i] = 434.456 - Y - 1.402 * Cr;
+        data[i + 1] = 119.541 - Y + 0.344 * Cb + 0.714 * Cr;
+        data[i + 2] = 481.816 - Y - 1.772 * Cb;
+      }
+      return data;
+    },
+    _convertCmykToRgb: function convertCmykToRgb(data) {
+      var c, m, y, k;
+      var offset = 0;
+      var scale = 1 / 255;
+      for (var i = 0, length = data.length; i < length; i += 4) {
+        c = data[i] * scale;
+        m = data[i + 1] * scale;
+        y = data[i + 2] * scale;
+        k = data[i + 3] * scale;
+        data[offset++] = 255 + c * (-4.387332384609988 * c + 54.48615194189176 * m + 18.82290502165302 * y + 212.25662451639585 * k - 285.2331026137004) + m * (1.7149763477362134 * m - 5.6096736904047315 * y - 17.873870861415444 * k - 5.497006427196366) + y * (-2.5217340131683033 * y - 21.248923337353073 * k + 17.5119270841813) - k * (21.86122147463605 * k + 189.48180835922747);
+        data[offset++] = 255 + c * (8.841041422036149 * c + 60.118027045597366 * m + 6.871425592049007 * y + 31.159100130055922 * k - 79.2970844816548) + m * (-15.310361306967817 * m + 17.575251261109482 * y + 131.35250912493976 * k - 190.9453302588951) + y * (4.444339102852739 * y + 9.8632861493405 * k - 24.86741582555878) - k * (20.737325471181034 * k + 187.80453709719578);
+        data[offset++] = 255 + c * (0.8842522430003296 * c + 8.078677503112928 * m + 30.89978309703729 * y - 0.23883238689178934 * k - 14.183576799673286) + m * (10.49593273432072 * m + 63.02378494754052 * y + 50.606957656360734 * k - 112.23884253719248) + y * (0.03296041114873217 * y + 115.60384449646641 * k - 193.58209356861505) - k * (22.33816807309886 * k + 180.12613974708367);
+      }
+      return data.subarray(0, offset);
+    },
+    getData: function getData(_ref3) {
+      var width = _ref3.width,
+          height = _ref3.height,
+          _ref3$forceRGB = _ref3.forceRGB,
+          forceRGB = _ref3$forceRGB === undefined ? false : _ref3$forceRGB,
+          _ref3$isSourcePDF = _ref3.isSourcePDF,
+          isSourcePDF = _ref3$isSourcePDF === undefined ? false : _ref3$isSourcePDF;
+
+      if (this.numComponents > 4) {
+        throw new JpegError('Unsupported color mode');
+      }
+      var data = this._getLinearizedBlockData(width, height, isSourcePDF);
+      if (this.numComponents === 1 && forceRGB) {
+        var dataLength = data.length;
+        var rgbData = new Uint8ClampedArray(dataLength * 3);
+        var offset = 0;
+        for (var i = 0; i < dataLength; i++) {
+          var grayColor = data[i];
+          rgbData[offset++] = grayColor;
+          rgbData[offset++] = grayColor;
+          rgbData[offset++] = grayColor;
+        }
+        return rgbData;
+      } else if (this.numComponents === 3 && this._isColorConversionNeeded) {
+        return this._convertYccToRgb(data);
+      } else if (this.numComponents === 4) {
+        if (this._isColorConversionNeeded) {
+          if (forceRGB) {
+            return this._convertYcckToRgb(data);
+          }
+          return this._convertYcckToCmyk(data);
+        } else if (forceRGB) {
+          return this._convertCmykToRgb(data);
+        }
+      }
+      return data;
+    }
+  };
+  return JpegImage;
+}();
+exports.JpegImage = JpegImage;
+
+/***/ }),
+/* 148 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.JpxStream = undefined;
+
+var _stream = __w_pdfjs_require__(140);
+
+var _jpx = __w_pdfjs_require__(149);
+
+var _util = __w_pdfjs_require__(2);
+
+var JpxStream = function JpxStreamClosure() {
+  function JpxStream(stream, maybeLength, dict, params) {
+    this.stream = stream;
+    this.maybeLength = maybeLength;
+    this.dict = dict;
+    this.params = params;
+    _stream.DecodeStream.call(this, maybeLength);
+  }
+  JpxStream.prototype = Object.create(_stream.DecodeStream.prototype);
+  Object.defineProperty(JpxStream.prototype, 'bytes', {
+    get: function JpxStream_bytes() {
+      return (0, _util.shadow)(this, 'bytes', this.stream.getBytes(this.maybeLength));
+    },
+    configurable: true
+  });
+  JpxStream.prototype.ensureBuffer = function (requested) {};
+  JpxStream.prototype.readBlock = function () {
+    if (this.eof) {
+      return;
+    }
+    var jpxImage = new _jpx.JpxImage();
+    jpxImage.parse(this.bytes);
+    var width = jpxImage.width;
+    var height = jpxImage.height;
+    var componentsCount = jpxImage.componentsCount;
+    var tileCount = jpxImage.tiles.length;
+    if (tileCount === 1) {
+      this.buffer = jpxImage.tiles[0].items;
+    } else {
+      var data = new Uint8ClampedArray(width * height * componentsCount);
+      for (var k = 0; k < tileCount; k++) {
+        var tileComponents = jpxImage.tiles[k];
+        var tileWidth = tileComponents.width;
+        var tileHeight = tileComponents.height;
+        var tileLeft = tileComponents.left;
+        var tileTop = tileComponents.top;
+        var src = tileComponents.items;
+        var srcPosition = 0;
+        var dataPosition = (width * tileTop + tileLeft) * componentsCount;
+        var imgRowSize = width * componentsCount;
+        var tileRowSize = tileWidth * componentsCount;
+        for (var j = 0; j < tileHeight; j++) {
+          var rowBytes = src.subarray(srcPosition, srcPosition + tileRowSize);
+          data.set(rowBytes, dataPosition);
+          srcPosition += tileRowSize;
+          dataPosition += imgRowSize;
+        }
+      }
+      this.buffer = data;
+    }
+    this.bufferLength = this.buffer.length;
+    this.eof = true;
+  };
+  return JpxStream;
+}();
+exports.JpxStream = JpxStream;
+
+/***/ }),
+/* 149 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.JpxImage = undefined;
+
+var _util = __w_pdfjs_require__(2);
+
+var _arithmetic_decoder = __w_pdfjs_require__(145);
+
+var JpxError = function JpxErrorClosure() {
+  function JpxError(msg) {
+    this.message = 'JPX error: ' + msg;
+  }
+  JpxError.prototype = new Error();
+  JpxError.prototype.name = 'JpxError';
+  JpxError.constructor = JpxError;
+  return JpxError;
+}();
+var JpxImage = function JpxImageClosure() {
+  var SubbandsGainLog2 = {
+    'LL': 0,
+    'LH': 1,
+    'HL': 1,
+    'HH': 2
+  };
+  function JpxImage() {
+    this.failOnCorruptedImage = false;
+  }
+  JpxImage.prototype = {
+    parse: function JpxImage_parse(data) {
+      var head = (0, _util.readUint16)(data, 0);
+      if (head === 0xFF4F) {
+        this.parseCodestream(data, 0, data.length);
+        return;
+      }
+      var position = 0,
+          length = data.length;
+      while (position < length) {
+        var headerSize = 8;
+        var lbox = (0, _util.readUint32)(data, position);
+        var tbox = (0, _util.readUint32)(data, position + 4);
+        position += headerSize;
+        if (lbox === 1) {
+          lbox = (0, _util.readUint32)(data, position) * 4294967296 + (0, _util.readUint32)(data, position + 4);
+          position += 8;
+          headerSize += 8;
+        }
+        if (lbox === 0) {
+          lbox = length - position + headerSize;
+        }
+        if (lbox < headerSize) {
+          throw new JpxError('Invalid box field size');
+        }
+        var dataLength = lbox - headerSize;
+        var jumpDataLength = true;
+        switch (tbox) {
+          case 0x6A703268:
+            jumpDataLength = false;
+            break;
+          case 0x636F6C72:
+            var method = data[position];
+            if (method === 1) {
+              var colorspace = (0, _util.readUint32)(data, position + 3);
+              switch (colorspace) {
+                case 16:
+                case 17:
+                case 18:
+                  break;
+                default:
+                  (0, _util.warn)('Unknown colorspace ' + colorspace);
+                  break;
+              }
+            } else if (method === 2) {
+              (0, _util.info)('ICC profile not supported');
+            }
+            break;
+          case 0x6A703263:
+            this.parseCodestream(data, position, position + dataLength);
+            break;
+          case 0x6A502020:
+            if ((0, _util.readUint32)(data, position) !== 0x0d0a870a) {
+              (0, _util.warn)('Invalid JP2 signature');
+            }
+            break;
+          case 0x6A501A1A:
+          case 0x66747970:
+          case 0x72726571:
+          case 0x72657320:
+          case 0x69686472:
+            break;
+          default:
+            var headerType = String.fromCharCode(tbox >> 24 & 0xFF, tbox >> 16 & 0xFF, tbox >> 8 & 0xFF, tbox & 0xFF);
+            (0, _util.warn)('Unsupported header type ' + tbox + ' (' + headerType + ')');
+            break;
+        }
+        if (jumpDataLength) {
+          position += dataLength;
+        }
+      }
+    },
+    parseImageProperties: function JpxImage_parseImageProperties(stream) {
+      var newByte = stream.getByte();
+      while (newByte >= 0) {
+        var oldByte = newByte;
+        newByte = stream.getByte();
+        var code = oldByte << 8 | newByte;
+        if (code === 0xFF51) {
+          stream.skip(4);
+          var Xsiz = stream.getInt32() >>> 0;
+          var Ysiz = stream.getInt32() >>> 0;
+          var XOsiz = stream.getInt32() >>> 0;
+          var YOsiz = stream.getInt32() >>> 0;
+          stream.skip(16);
+          var Csiz = stream.getUint16();
+          this.width = Xsiz - XOsiz;
+          this.height = Ysiz - YOsiz;
+          this.componentsCount = Csiz;
+          this.bitsPerComponent = 8;
+          return;
+        }
+      }
+      throw new JpxError('No size marker found in JPX stream');
+    },
+    parseCodestream: function JpxImage_parseCodestream(data, start, end) {
+      var context = {};
+      var doNotRecover = false;
+      try {
+        var position = start;
+        while (position + 1 < end) {
+          var code = (0, _util.readUint16)(data, position);
+          position += 2;
+          var length = 0,
+              j,
+              sqcd,
+              spqcds,
+              spqcdSize,
+              scalarExpounded,
+              tile;
+          switch (code) {
+            case 0xFF4F:
+              context.mainHeader = true;
+              break;
+            case 0xFFD9:
+              break;
+            case 0xFF51:
+              length = (0, _util.readUint16)(data, position);
+              var siz = {};
+              siz.Xsiz = (0, _util.readUint32)(data, position + 4);
+              siz.Ysiz = (0, _util.readUint32)(data, position + 8);
+              siz.XOsiz = (0, _util.readUint32)(data, position + 12);
+              siz.YOsiz = (0, _util.readUint32)(data, position + 16);
+              siz.XTsiz = (0, _util.readUint32)(data, position + 20);
+              siz.YTsiz = (0, _util.readUint32)(data, position + 24);
+              siz.XTOsiz = (0, _util.readUint32)(data, position + 28);
+              siz.YTOsiz = (0, _util.readUint32)(data, position + 32);
+              var componentsCount = (0, _util.readUint16)(data, position + 36);
+              siz.Csiz = componentsCount;
+              var components = [];
+              j = position + 38;
+              for (var i = 0; i < componentsCount; i++) {
+                var component = {
+                  precision: (data[j] & 0x7F) + 1,
+                  isSigned: !!(data[j] & 0x80),
+                  XRsiz: data[j + 1],
+                  YRsiz: data[j + 2]
+                };
+                j += 3;
+                calculateComponentDimensions(component, siz);
+                components.push(component);
+              }
+              context.SIZ = siz;
+              context.components = components;
+              calculateTileGrids(context, components);
+              context.QCC = [];
+              context.COC = [];
+              break;
+            case 0xFF5C:
+              length = (0, _util.readUint16)(data, position);
+              var qcd = {};
+              j = position + 2;
+              sqcd = data[j++];
+              switch (sqcd & 0x1F) {
+                case 0:
+                  spqcdSize = 8;
+                  scalarExpounded = true;
+                  break;
+                case 1:
+                  spqcdSize = 16;
+                  scalarExpounded = false;
+                  break;
+                case 2:
+                  spqcdSize = 16;
+                  scalarExpounded = true;
+                  break;
+                default:
+                  throw new Error('Invalid SQcd value ' + sqcd);
+              }
+              qcd.noQuantization = spqcdSize === 8;
+              qcd.scalarExpounded = scalarExpounded;
+              qcd.guardBits = sqcd >> 5;
+              spqcds = [];
+              while (j < length + position) {
+                var spqcd = {};
+                if (spqcdSize === 8) {
+                  spqcd.epsilon = data[j++] >> 3;
+                  spqcd.mu = 0;
+                } else {
+                  spqcd.epsilon = data[j] >> 3;
+                  spqcd.mu = (data[j] & 0x7) << 8 | data[j + 1];
+                  j += 2;
+                }
+                spqcds.push(spqcd);
+              }
+              qcd.SPqcds = spqcds;
+              if (context.mainHeader) {
+                context.QCD = qcd;
+              } else {
+                context.currentTile.QCD = qcd;
+                context.currentTile.QCC = [];
+              }
+              break;
+            case 0xFF5D:
+              length = (0, _util.readUint16)(data, position);
+              var qcc = {};
+              j = position + 2;
+              var cqcc;
+              if (context.SIZ.Csiz < 257) {
+                cqcc = data[j++];
+              } else {
+                cqcc = (0, _util.readUint16)(data, j);
+                j += 2;
+              }
+              sqcd = data[j++];
+              switch (sqcd & 0x1F) {
+                case 0:
+                  spqcdSize = 8;
+                  scalarExpounded = true;
+                  break;
+                case 1:
+                  spqcdSize = 16;
+                  scalarExpounded = false;
+                  break;
+                case 2:
+                  spqcdSize = 16;
+                  scalarExpounded = true;
+                  break;
+                default:
+                  throw new Error('Invalid SQcd value ' + sqcd);
+              }
+              qcc.noQuantization = spqcdSize === 8;
+              qcc.scalarExpounded = scalarExpounded;
+              qcc.guardBits = sqcd >> 5;
+              spqcds = [];
+              while (j < length + position) {
+                spqcd = {};
+                if (spqcdSize === 8) {
+                  spqcd.epsilon = data[j++] >> 3;
+                  spqcd.mu = 0;
+                } else {
+                  spqcd.epsilon = data[j] >> 3;
+                  spqcd.mu = (data[j] & 0x7) << 8 | data[j + 1];
+                  j += 2;
+                }
+                spqcds.push(spqcd);
+              }
+              qcc.SPqcds = spqcds;
+              if (context.mainHeader) {
+                context.QCC[cqcc] = qcc;
+              } else {
+                context.currentTile.QCC[cqcc] = qcc;
+              }
+              break;
+            case 0xFF52:
+              length = (0, _util.readUint16)(data, position);
+              var cod = {};
+              j = position + 2;
+              var scod = data[j++];
+              cod.entropyCoderWithCustomPrecincts = !!(scod & 1);
+              cod.sopMarkerUsed = !!(scod & 2);
+              cod.ephMarkerUsed = !!(scod & 4);
+              cod.progressionOrder = data[j++];
+              cod.layersCount = (0, _util.readUint16)(data, j);
+              j += 2;
+              cod.multipleComponentTransform = data[j++];
+              cod.decompositionLevelsCount = data[j++];
+              cod.xcb = (data[j++] & 0xF) + 2;
+              cod.ycb = (data[j++] & 0xF) + 2;
+              var blockStyle = data[j++];
+              cod.selectiveArithmeticCodingBypass = !!(blockStyle & 1);
+              cod.resetContextProbabilities = !!(blockStyle & 2);
+              cod.terminationOnEachCodingPass = !!(blockStyle & 4);
+              cod.verticallyStripe = !!(blockStyle & 8);
+              cod.predictableTermination = !!(blockStyle & 16);
+              cod.segmentationSymbolUsed = !!(blockStyle & 32);
+              cod.reversibleTransformation = data[j++];
+              if (cod.entropyCoderWithCustomPrecincts) {
+                var precinctsSizes = [];
+                while (j < length + position) {
+                  var precinctsSize = data[j++];
+                  precinctsSizes.push({
+                    PPx: precinctsSize & 0xF,
+                    PPy: precinctsSize >> 4
+                  });
+                }
+                cod.precinctsSizes = precinctsSizes;
+              }
+              var unsupported = [];
+              if (cod.selectiveArithmeticCodingBypass) {
+                unsupported.push('selectiveArithmeticCodingBypass');
+              }
+              if (cod.resetContextProbabilities) {
+                unsupported.push('resetContextProbabilities');
+              }
+              if (cod.terminationOnEachCodingPass) {
+                unsupported.push('terminationOnEachCodingPass');
+              }
+              if (cod.verticallyStripe) {
+                unsupported.push('verticallyStripe');
+              }
+              if (cod.predictableTermination) {
+                unsupported.push('predictableTermination');
+              }
+              if (unsupported.length > 0) {
+                doNotRecover = true;
+                throw new Error('Unsupported COD options (' + unsupported.join(', ') + ')');
+              }
+              if (context.mainHeader) {
+                context.COD = cod;
+              } else {
+                context.currentTile.COD = cod;
+                context.currentTile.COC = [];
+              }
+              break;
+            case 0xFF90:
+              length = (0, _util.readUint16)(data, position);
+              tile = {};
+              tile.index = (0, _util.readUint16)(data, position + 2);
+              tile.length = (0, _util.readUint32)(data, position + 4);
+              tile.dataEnd = tile.length + position - 2;
+              tile.partIndex = data[position + 8];
+              tile.partsCount = data[position + 9];
+              context.mainHeader = false;
+              if (tile.partIndex === 0) {
+                tile.COD = context.COD;
+                tile.COC = context.COC.slice(0);
+                tile.QCD = context.QCD;
+                tile.QCC = context.QCC.slice(0);
+              }
+              context.currentTile = tile;
+              break;
+            case 0xFF93:
+              tile = context.currentTile;
+              if (tile.partIndex === 0) {
+                initializeTile(context, tile.index);
+                buildPackets(context);
+              }
+              length = tile.dataEnd - position;
+              parseTilePackets(context, data, position, length);
+              break;
+            case 0xFF55:
+            case 0xFF57:
+            case 0xFF58:
+            case 0xFF64:
+              length = (0, _util.readUint16)(data, position);
+              break;
+            case 0xFF53:
+              throw new Error('Codestream code 0xFF53 (COC) is ' + 'not implemented');
+            default:
+              throw new Error('Unknown codestream code: ' + code.toString(16));
+          }
+          position += length;
+        }
+      } catch (e) {
+        if (doNotRecover || this.failOnCorruptedImage) {
+          throw new JpxError(e.message);
+        } else {
+          (0, _util.warn)('JPX: Trying to recover from: ' + e.message);
+        }
+      }
+      this.tiles = transformComponents(context);
+      this.width = context.SIZ.Xsiz - context.SIZ.XOsiz;
+      this.height = context.SIZ.Ysiz - context.SIZ.YOsiz;
+      this.componentsCount = context.SIZ.Csiz;
+    }
+  };
+  function calculateComponentDimensions(component, siz) {
+    component.x0 = Math.ceil(siz.XOsiz / component.XRsiz);
+    component.x1 = Math.ceil(siz.Xsiz / component.XRsiz);
+    component.y0 = Math.ceil(siz.YOsiz / component.YRsiz);
+    component.y1 = Math.ceil(siz.Ysiz / component.YRsiz);
+    component.width = component.x1 - component.x0;
+    component.height = component.y1 - component.y0;
+  }
+  function calculateTileGrids(context, components) {
+    var siz = context.SIZ;
+    var tile,
+        tiles = [];
+    var numXtiles = Math.ceil((siz.Xsiz - siz.XTOsiz) / siz.XTsiz);
+    var numYtiles = Math.ceil((siz.Ysiz - siz.YTOsiz) / siz.YTsiz);
+    for (var q = 0; q < numYtiles; q++) {
+      for (var p = 0; p < numXtiles; p++) {
+        tile = {};
+        tile.tx0 = Math.max(siz.XTOsiz + p * siz.XTsiz, siz.XOsiz);
+        tile.ty0 = Math.max(siz.YTOsiz + q * siz.YTsiz, siz.YOsiz);
+        tile.tx1 = Math.min(siz.XTOsiz + (p + 1) * siz.XTsiz, siz.Xsiz);
+        tile.ty1 = Math.min(siz.YTOsiz + (q + 1) * siz.YTsiz, siz.Ysiz);
+        tile.width = tile.tx1 - tile.tx0;
+        tile.height = tile.ty1 - tile.ty0;
+        tile.components = [];
+        tiles.push(tile);
+      }
+    }
+    context.tiles = tiles;
+    var componentsCount = siz.Csiz;
+    for (var i = 0, ii = componentsCount; i < ii; i++) {
+      var component = components[i];
+      for (var j = 0, jj = tiles.length; j < jj; j++) {
+        var tileComponent = {};
+        tile = tiles[j];
+        tileComponent.tcx0 = Math.ceil(tile.tx0 / component.XRsiz);
+        tileComponent.tcy0 = Math.ceil(tile.ty0 / component.YRsiz);
+        tileComponent.tcx1 = Math.ceil(tile.tx1 / component.XRsiz);
+        tileComponent.tcy1 = Math.ceil(tile.ty1 / component.YRsiz);
+        tileComponent.width = tileComponent.tcx1 - tileComponent.tcx0;
+        tileComponent.height = tileComponent.tcy1 - tileComponent.tcy0;
+        tile.components[i] = tileComponent;
+      }
+    }
+  }
+  function getBlocksDimensions(context, component, r) {
+    var codOrCoc = component.codingStyleParameters;
+    var result = {};
+    if (!codOrCoc.entropyCoderWithCustomPrecincts) {
+      result.PPx = 15;
+      result.PPy = 15;
+    } else {
+      result.PPx = codOrCoc.precinctsSizes[r].PPx;
+      result.PPy = codOrCoc.precinctsSizes[r].PPy;
+    }
+    result.xcb_ = r > 0 ? Math.min(codOrCoc.xcb, result.PPx - 1) : Math.min(codOrCoc.xcb, result.PPx);
+    result.ycb_ = r > 0 ? Math.min(codOrCoc.ycb, result.PPy - 1) : Math.min(codOrCoc.ycb, result.PPy);
+    return result;
+  }
+  function buildPrecincts(context, resolution, dimensions) {
+    var precinctWidth = 1 << dimensions.PPx;
+    var precinctHeight = 1 << dimensions.PPy;
+    var isZeroRes = resolution.resLevel === 0;
+    var precinctWidthInSubband = 1 << dimensions.PPx + (isZeroRes ? 0 : -1);
+    var precinctHeightInSubband = 1 << dimensions.PPy + (isZeroRes ? 0 : -1);
+    var numprecinctswide = resolution.trx1 > resolution.trx0 ? Math.ceil(resolution.trx1 / precinctWidth) - Math.floor(resolution.trx0 / precinctWidth) : 0;
+    var numprecinctshigh = resolution.try1 > resolution.try0 ? Math.ceil(resolution.try1 / precinctHeight) - Math.floor(resolution.try0 / precinctHeight) : 0;
+    var numprecincts = numprecinctswide * numprecinctshigh;
+    resolution.precinctParameters = {
+      precinctWidth: precinctWidth,
+      precinctHeight: precinctHeight,
+      numprecinctswide: numprecinctswide,
+      numprecinctshigh: numprecinctshigh,
+      numprecincts: numprecincts,
+      precinctWidthInSubband: precinctWidthInSubband,
+      precinctHeightInSubband: precinctHeightInSubband
+    };
+  }
+  function buildCodeblocks(context, subband, dimensions) {
+    var xcb_ = dimensions.xcb_;
+    var ycb_ = dimensions.ycb_;
+    var codeblockWidth = 1 << xcb_;
+    var codeblockHeight = 1 << ycb_;
+    var cbx0 = subband.tbx0 >> xcb_;
+    var cby0 = subband.tby0 >> ycb_;
+    var cbx1 = subband.tbx1 + codeblockWidth - 1 >> xcb_;
+    var cby1 = subband.tby1 + codeblockHeight - 1 >> ycb_;
+    var precinctParameters = subband.resolution.precinctParameters;
+    var codeblocks = [];
+    var precincts = [];
+    var i, j, codeblock, precinctNumber;
+    for (j = cby0; j < cby1; j++) {
+      for (i = cbx0; i < cbx1; i++) {
+        codeblock = {
+          cbx: i,
+          cby: j,
+          tbx0: codeblockWidth * i,
+          tby0: codeblockHeight * j,
+          tbx1: codeblockWidth * (i + 1),
+          tby1: codeblockHeight * (j + 1)
+        };
+        codeblock.tbx0_ = Math.max(subband.tbx0, codeblock.tbx0);
+        codeblock.tby0_ = Math.max(subband.tby0, codeblock.tby0);
+        codeblock.tbx1_ = Math.min(subband.tbx1, codeblock.tbx1);
+        codeblock.tby1_ = Math.min(subband.tby1, codeblock.tby1);
+        var pi = Math.floor((codeblock.tbx0_ - subband.tbx0) / precinctParameters.precinctWidthInSubband);
+        var pj = Math.floor((codeblock.tby0_ - subband.tby0) / precinctParameters.precinctHeightInSubband);
+        precinctNumber = pi + pj * precinctParameters.numprecinctswide;
+        codeblock.precinctNumber = precinctNumber;
+        codeblock.subbandType = subband.type;
+        codeblock.Lblock = 3;
+        if (codeblock.tbx1_ <= codeblock.tbx0_ || codeblock.tby1_ <= codeblock.tby0_) {
+          continue;
+        }
+        codeblocks.push(codeblock);
+        var precinct = precincts[precinctNumber];
+        if (precinct !== undefined) {
+          if (i < precinct.cbxMin) {
+            precinct.cbxMin = i;
+          } else if (i > precinct.cbxMax) {
+            precinct.cbxMax = i;
+          }
+          if (j < precinct.cbyMin) {
+            precinct.cbxMin = j;
+          } else if (j > precinct.cbyMax) {
+            precinct.cbyMax = j;
+          }
+        } else {
+          precincts[precinctNumber] = precinct = {
+            cbxMin: i,
+            cbyMin: j,
+            cbxMax: i,
+            cbyMax: j
+          };
+        }
+        codeblock.precinct = precinct;
+      }
+    }
+    subband.codeblockParameters = {
+      codeblockWidth: xcb_,
+      codeblockHeight: ycb_,
+      numcodeblockwide: cbx1 - cbx0 + 1,
+      numcodeblockhigh: cby1 - cby0 + 1
+    };
+    subband.codeblocks = codeblocks;
+    subband.precincts = precincts;
+  }
+  function createPacket(resolution, precinctNumber, layerNumber) {
+    var precinctCodeblocks = [];
+    var subbands = resolution.subbands;
+    for (var i = 0, ii = subbands.length; i < ii; i++) {
+      var subband = subbands[i];
+      var codeblocks = subband.codeblocks;
+      for (var j = 0, jj = codeblocks.length; j < jj; j++) {
+        var codeblock = codeblocks[j];
+        if (codeblock.precinctNumber !== precinctNumber) {
+          continue;
+        }
+        precinctCodeblocks.push(codeblock);
+      }
+    }
+    return {
+      layerNumber: layerNumber,
+      codeblocks: precinctCodeblocks
+    };
+  }
+  function LayerResolutionComponentPositionIterator(context) {
+    var siz = context.SIZ;
+    var tileIndex = context.currentTile.index;
+    var tile = context.tiles[tileIndex];
+    var layersCount = tile.codingStyleDefaultParameters.layersCount;
+    var componentsCount = siz.Csiz;
+    var maxDecompositionLevelsCount = 0;
+    for (var q = 0; q < componentsCount; q++) {
+      maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, tile.components[q].codingStyleParameters.decompositionLevelsCount);
+    }
+    var l = 0,
+        r = 0,
+        i = 0,
+        k = 0;
+    this.nextPacket = function JpxImage_nextPacket() {
+      for (; l < layersCount; l++) {
+        for (; r <= maxDecompositionLevelsCount; r++) {
+          for (; i < componentsCount; i++) {
+            var component = tile.components[i];
+            if (r > component.codingStyleParameters.decompositionLevelsCount) {
+              continue;
+            }
+            var resolution = component.resolutions[r];
+            var numprecincts = resolution.precinctParameters.numprecincts;
+            for (; k < numprecincts;) {
+              var packet = createPacket(resolution, k, l);
+              k++;
+              return packet;
+            }
+            k = 0;
+          }
+          i = 0;
+        }
+        r = 0;
+      }
+      throw new JpxError('Out of packets');
+    };
+  }
+  function ResolutionLayerComponentPositionIterator(context) {
+    var siz = context.SIZ;
+    var tileIndex = context.currentTile.index;
+    var tile = context.tiles[tileIndex];
+    var layersCount = tile.codingStyleDefaultParameters.layersCount;
+    var componentsCount = siz.Csiz;
+    var maxDecompositionLevelsCount = 0;
+    for (var q = 0; q < componentsCount; q++) {
+      maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, tile.components[q].codingStyleParameters.decompositionLevelsCount);
+    }
+    var r = 0,
+        l = 0,
+        i = 0,
+        k = 0;
+    this.nextPacket = function JpxImage_nextPacket() {
+      for (; r <= maxDecompositionLevelsCount; r++) {
+        for (; l < layersCount; l++) {
+          for (; i < componentsCount; i++) {
+            var component = tile.components[i];
+            if (r > component.codingStyleParameters.decompositionLevelsCount) {
+              continue;
+            }
+            var resolution = component.resolutions[r];
+            var numprecincts = resolution.precinctParameters.numprecincts;
+            for (; k < numprecincts;) {
+              var packet = createPacket(resolution, k, l);
+              k++;
+              return packet;
+            }
+            k = 0;
+          }
+          i = 0;
+        }
+        l = 0;
+      }
+      throw new JpxError('Out of packets');
+    };
+  }
+  function ResolutionPositionComponentLayerIterator(context) {
+    var siz = context.SIZ;
+    var tileIndex = context.currentTile.index;
+    var tile = context.tiles[tileIndex];
+    var layersCount = tile.codingStyleDefaultParameters.layersCount;
+    var componentsCount = siz.Csiz;
+    var l, r, c, p;
+    var maxDecompositionLevelsCount = 0;
+    for (c = 0; c < componentsCount; c++) {
+      var component = tile.components[c];
+      maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, component.codingStyleParameters.decompositionLevelsCount);
+    }
+    var maxNumPrecinctsInLevel = new Int32Array(maxDecompositionLevelsCount + 1);
+    for (r = 0; r <= maxDecompositionLevelsCount; ++r) {
+      var maxNumPrecincts = 0;
+      for (c = 0; c < componentsCount; ++c) {
+        var resolutions = tile.components[c].resolutions;
+        if (r < resolutions.length) {
+          maxNumPrecincts = Math.max(maxNumPrecincts, resolutions[r].precinctParameters.numprecincts);
+        }
+      }
+      maxNumPrecinctsInLevel[r] = maxNumPrecincts;
+    }
+    l = 0;
+    r = 0;
+    c = 0;
+    p = 0;
+    this.nextPacket = function JpxImage_nextPacket() {
+      for (; r <= maxDecompositionLevelsCount; r++) {
+        for (; p < maxNumPrecinctsInLevel[r]; p++) {
+          for (; c < componentsCount; c++) {
+            var component = tile.components[c];
+            if (r > component.codingStyleParameters.decompositionLevelsCount) {
+              continue;
+            }
+            var resolution = component.resolutions[r];
+            var numprecincts = resolution.precinctParameters.numprecincts;
+            if (p >= numprecincts) {
+              continue;
+            }
+            for (; l < layersCount;) {
+              var packet = createPacket(resolution, p, l);
+              l++;
+              return packet;
+            }
+            l = 0;
+          }
+          c = 0;
+        }
+        p = 0;
+      }
+      throw new JpxError('Out of packets');
+    };
+  }
+  function PositionComponentResolutionLayerIterator(context) {
+    var siz = context.SIZ;
+    var tileIndex = context.currentTile.index;
+    var tile = context.tiles[tileIndex];
+    var layersCount = tile.codingStyleDefaultParameters.layersCount;
+    var componentsCount = siz.Csiz;
+    var precinctsSizes = getPrecinctSizesInImageScale(tile);
+    var precinctsIterationSizes = precinctsSizes;
+    var l = 0,
+        r = 0,
+        c = 0,
+        px = 0,
+        py = 0;
+    this.nextPacket = function JpxImage_nextPacket() {
+      for (; py < precinctsIterationSizes.maxNumHigh; py++) {
+        for (; px < precinctsIterationSizes.maxNumWide; px++) {
+          for (; c < componentsCount; c++) {
+            var component = tile.components[c];
+            var decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount;
+            for (; r <= decompositionLevelsCount; r++) {
+              var resolution = component.resolutions[r];
+              var sizeInImageScale = precinctsSizes.components[c].resolutions[r];
+              var k = getPrecinctIndexIfExist(px, py, sizeInImageScale, precinctsIterationSizes, resolution);
+              if (k === null) {
+                continue;
+              }
+              for (; l < layersCount;) {
+                var packet = createPacket(resolution, k, l);
+                l++;
+                return packet;
+              }
+              l = 0;
+            }
+            r = 0;
+          }
+          c = 0;
+        }
+        px = 0;
+      }
+      throw new JpxError('Out of packets');
+    };
+  }
+  function ComponentPositionResolutionLayerIterator(context) {
+    var siz = context.SIZ;
+    var tileIndex = context.currentTile.index;
+    var tile = context.tiles[tileIndex];
+    var layersCount = tile.codingStyleDefaultParameters.layersCount;
+    var componentsCount = siz.Csiz;
+    var precinctsSizes = getPrecinctSizesInImageScale(tile);
+    var l = 0,
+        r = 0,
+        c = 0,
+        px = 0,
+        py = 0;
+    this.nextPacket = function JpxImage_nextPacket() {
+      for (; c < componentsCount; ++c) {
+        var component = tile.components[c];
+        var precinctsIterationSizes = precinctsSizes.components[c];
+        var decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount;
+        for (; py < precinctsIterationSizes.maxNumHigh; py++) {
+          for (; px < precinctsIterationSizes.maxNumWide; px++) {
+            for (; r <= decompositionLevelsCount; r++) {
+              var resolution = component.resolutions[r];
+              var sizeInImageScale = precinctsIterationSizes.resolutions[r];
+              var k = getPrecinctIndexIfExist(px, py, sizeInImageScale, precinctsIterationSizes, resolution);
+              if (k === null) {
+                continue;
+              }
+              for (; l < layersCount;) {
+                var packet = createPacket(resolution, k, l);
+                l++;
+                return packet;
+              }
+              l = 0;
+            }
+            r = 0;
+          }
+          px = 0;
+        }
+        py = 0;
+      }
+      throw new JpxError('Out of packets');
+    };
+  }
+  function getPrecinctIndexIfExist(pxIndex, pyIndex, sizeInImageScale, precinctIterationSizes, resolution) {
+    var posX = pxIndex * precinctIterationSizes.minWidth;
+    var posY = pyIndex * precinctIterationSizes.minHeight;
+    if (posX % sizeInImageScale.width !== 0 || posY % sizeInImageScale.height !== 0) {
+      return null;
+    }
+    var startPrecinctRowIndex = posY / sizeInImageScale.width * resolution.precinctParameters.numprecinctswide;
+    return posX / sizeInImageScale.height + startPrecinctRowIndex;
+  }
+  function getPrecinctSizesInImageScale(tile) {
+    var componentsCount = tile.components.length;
+    var minWidth = Number.MAX_VALUE;
+    var minHeight = Number.MAX_VALUE;
+    var maxNumWide = 0;
+    var maxNumHigh = 0;
+    var sizePerComponent = new Array(componentsCount);
+    for (var c = 0; c < componentsCount; c++) {
+      var component = tile.components[c];
+      var decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount;
+      var sizePerResolution = new Array(decompositionLevelsCount + 1);
+      var minWidthCurrentComponent = Number.MAX_VALUE;
+      var minHeightCurrentComponent = Number.MAX_VALUE;
+      var maxNumWideCurrentComponent = 0;
+      var maxNumHighCurrentComponent = 0;
+      var scale = 1;
+      for (var r = decompositionLevelsCount; r >= 0; --r) {
+        var resolution = component.resolutions[r];
+        var widthCurrentResolution = scale * resolution.precinctParameters.precinctWidth;
+        var heightCurrentResolution = scale * resolution.precinctParameters.precinctHeight;
+        minWidthCurrentComponent = Math.min(minWidthCurrentComponent, widthCurrentResolution);
+        minHeightCurrentComponent = Math.min(minHeightCurrentComponent, heightCurrentResolution);
+        maxNumWideCurrentComponent = Math.max(maxNumWideCurrentComponent, resolution.precinctParameters.numprecinctswide);
+        maxNumHighCurrentComponent = Math.max(maxNumHighCurrentComponent, resolution.precinctParameters.numprecinctshigh);
+        sizePerResolution[r] = {
+          width: widthCurrentResolution,
+          height: heightCurrentResolution
+        };
+        scale <<= 1;
+      }
+      minWidth = Math.min(minWidth, minWidthCurrentComponent);
+      minHeight = Math.min(minHeight, minHeightCurrentComponent);
+      maxNumWide = Math.max(maxNumWide, maxNumWideCurrentComponent);
+      maxNumHigh = Math.max(maxNumHigh, maxNumHighCurrentComponent);
+      sizePerComponent[c] = {
+        resolutions: sizePerResolution,
+        minWidth: minWidthCurrentComponent,
+        minHeight: minHeightCurrentComponent,
+        maxNumWide: maxNumWideCurrentComponent,
+        maxNumHigh: maxNumHighCurrentComponent
+      };
+    }
+    return {
+      components: sizePerComponent,
+      minWidth: minWidth,
+      minHeight: minHeight,
+      maxNumWide: maxNumWide,
+      maxNumHigh: maxNumHigh
+    };
+  }
+  function buildPackets(context) {
+    var siz = context.SIZ;
+    var tileIndex = context.currentTile.index;
+    var tile = context.tiles[tileIndex];
+    var componentsCount = siz.Csiz;
+    for (var c = 0; c < componentsCount; c++) {
+      var component = tile.components[c];
+      var decompositionLevelsCount = component.codingStyleParameters.decompositionLevelsCount;
+      var resolutions = [];
+      var subbands = [];
+      for (var r = 0; r <= decompositionLevelsCount; r++) {
+        var blocksDimensions = getBlocksDimensions(context, component, r);
+        var resolution = {};
+        var scale = 1 << decompositionLevelsCount - r;
+        resolution.trx0 = Math.ceil(component.tcx0 / scale);
+        resolution.try0 = Math.ceil(component.tcy0 / scale);
+        resolution.trx1 = Math.ceil(component.tcx1 / scale);
+        resolution.try1 = Math.ceil(component.tcy1 / scale);
+        resolution.resLevel = r;
+        buildPrecincts(context, resolution, blocksDimensions);
+        resolutions.push(resolution);
+        var subband;
+        if (r === 0) {
+          subband = {};
+          subband.type = 'LL';
+          subband.tbx0 = Math.ceil(component.tcx0 / scale);
+          subband.tby0 = Math.ceil(component.tcy0 / scale);
+          subband.tbx1 = Math.ceil(component.tcx1 / scale);
+          subband.tby1 = Math.ceil(component.tcy1 / scale);
+          subband.resolution = resolution;
+          buildCodeblocks(context, subband, blocksDimensions);
+          subbands.push(subband);
+          resolution.subbands = [subband];
+        } else {
+          var bscale = 1 << decompositionLevelsCount - r + 1;
+          var resolutionSubbands = [];
+          subband = {};
+          subband.type = 'HL';
+          subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5);
+          subband.tby0 = Math.ceil(component.tcy0 / bscale);
+          subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5);
+          subband.tby1 = Math.ceil(component.tcy1 / bscale);
+          subband.resolution = resolution;
+          buildCodeblocks(context, subband, blocksDimensions);
+          subbands.push(subband);
+          resolutionSubbands.push(subband);
+          subband = {};
+          subband.type = 'LH';
+          subband.tbx0 = Math.ceil(component.tcx0 / bscale);
+          subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5);
+          subband.tbx1 = Math.ceil(component.tcx1 / bscale);
+          subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5);
+          subband.resolution = resolution;
+          buildCodeblocks(context, subband, blocksDimensions);
+          subbands.push(subband);
+          resolutionSubbands.push(subband);
+          subband = {};
+          subband.type = 'HH';
+          subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5);
+          subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5);
+          subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5);
+          subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5);
+          subband.resolution = resolution;
+          buildCodeblocks(context, subband, blocksDimensions);
+          subbands.push(subband);
+          resolutionSubbands.push(subband);
+          resolution.subbands = resolutionSubbands;
+        }
+      }
+      component.resolutions = resolutions;
+      component.subbands = subbands;
+    }
+    var progressionOrder = tile.codingStyleDefaultParameters.progressionOrder;
+    switch (progressionOrder) {
+      case 0:
+        tile.packetsIterator = new LayerResolutionComponentPositionIterator(context);
+        break;
+      case 1:
+        tile.packetsIterator = new ResolutionLayerComponentPositionIterator(context);
+        break;
+      case 2:
+        tile.packetsIterator = new ResolutionPositionComponentLayerIterator(context);
+        break;
+      case 3:
+        tile.packetsIterator = new PositionComponentResolutionLayerIterator(context);
+        break;
+      case 4:
+        tile.packetsIterator = new ComponentPositionResolutionLayerIterator(context);
+        break;
+      default:
+        throw new JpxError('Unsupported progression order ' + progressionOrder);
+    }
+  }
+  function parseTilePackets(context, data, offset, dataLength) {
+    var position = 0;
+    var buffer,
+        bufferSize = 0,
+        skipNextBit = false;
+    function readBits(count) {
+      while (bufferSize < count) {
+        var b = data[offset + position];
+        position++;
+        if (skipNextBit) {
+          buffer = buffer << 7 | b;
+          bufferSize += 7;
+          skipNextBit = false;
+        } else {
+          buffer = buffer << 8 | b;
+          bufferSize += 8;
+        }
+        if (b === 0xFF) {
+          skipNextBit = true;
+        }
+      }
+      bufferSize -= count;
+      return buffer >>> bufferSize & (1 << count) - 1;
+    }
+    function skipMarkerIfEqual(value) {
+      if (data[offset + position - 1] === 0xFF && data[offset + position] === value) {
+        skipBytes(1);
+        return true;
+      } else if (data[offset + position] === 0xFF && data[offset + position + 1] === value) {
+        skipBytes(2);
+        return true;
+      }
+      return false;
+    }
+    function skipBytes(count) {
+      position += count;
+    }
+    function alignToByte() {
+      bufferSize = 0;
+      if (skipNextBit) {
+        position++;
+        skipNextBit = false;
+      }
+    }
+    function readCodingpasses() {
+      if (readBits(1) === 0) {
+        return 1;
+      }
+      if (readBits(1) === 0) {
+        return 2;
+      }
+      var value = readBits(2);
+      if (value < 3) {
+        return value + 3;
+      }
+      value = readBits(5);
+      if (value < 31) {
+        return value + 6;
+      }
+      value = readBits(7);
+      return value + 37;
+    }
+    var tileIndex = context.currentTile.index;
+    var tile = context.tiles[tileIndex];
+    var sopMarkerUsed = context.COD.sopMarkerUsed;
+    var ephMarkerUsed = context.COD.ephMarkerUsed;
+    var packetsIterator = tile.packetsIterator;
+    while (position < dataLength) {
+      alignToByte();
+      if (sopMarkerUsed && skipMarkerIfEqual(0x91)) {
+        skipBytes(4);
+      }
+      var packet = packetsIterator.nextPacket();
+      if (!readBits(1)) {
+        continue;
+      }
+      var layerNumber = packet.layerNumber;
+      var queue = [],
+          codeblock;
+      for (var i = 0, ii = packet.codeblocks.length; i < ii; i++) {
+        codeblock = packet.codeblocks[i];
+        var precinct = codeblock.precinct;
+        var codeblockColumn = codeblock.cbx - precinct.cbxMin;
+        var codeblockRow = codeblock.cby - precinct.cbyMin;
+        var codeblockIncluded = false;
+        var firstTimeInclusion = false;
+        var valueReady;
+        if (codeblock['included'] !== undefined) {
+          codeblockIncluded = !!readBits(1);
+        } else {
+          precinct = codeblock.precinct;
+          var inclusionTree, zeroBitPlanesTree;
+          if (precinct['inclusionTree'] !== undefined) {
+            inclusionTree = precinct.inclusionTree;
+          } else {
+            var width = precinct.cbxMax - precinct.cbxMin + 1;
+            var height = precinct.cbyMax - precinct.cbyMin + 1;
+            inclusionTree = new InclusionTree(width, height, layerNumber);
+            zeroBitPlanesTree = new TagTree(width, height);
+            precinct.inclusionTree = inclusionTree;
+            precinct.zeroBitPlanesTree = zeroBitPlanesTree;
+          }
+          if (inclusionTree.reset(codeblockColumn, codeblockRow, layerNumber)) {
+            while (true) {
+              if (readBits(1)) {
+                valueReady = !inclusionTree.nextLevel();
+                if (valueReady) {
+                  codeblock.included = true;
+                  codeblockIncluded = firstTimeInclusion = true;
+                  break;
+                }
+              } else {
+                inclusionTree.incrementValue(layerNumber);
+                break;
+              }
+            }
+          }
+        }
+        if (!codeblockIncluded) {
+          continue;
+        }
+        if (firstTimeInclusion) {
+          zeroBitPlanesTree = precinct.zeroBitPlanesTree;
+          zeroBitPlanesTree.reset(codeblockColumn, codeblockRow);
+          while (true) {
+            if (readBits(1)) {
+              valueReady = !zeroBitPlanesTree.nextLevel();
+              if (valueReady) {
+                break;
+              }
+            } else {
+              zeroBitPlanesTree.incrementValue();
+            }
+          }
+          codeblock.zeroBitPlanes = zeroBitPlanesTree.value;
+        }
+        var codingpasses = readCodingpasses();
+        while (readBits(1)) {
+          codeblock.Lblock++;
+        }
+        var codingpassesLog2 = (0, _util.log2)(codingpasses);
+        var bits = (codingpasses < 1 << codingpassesLog2 ? codingpassesLog2 - 1 : codingpassesLog2) + codeblock.Lblock;
+        var codedDataLength = readBits(bits);
+        queue.push({
+          codeblock: codeblock,
+          codingpasses: codingpasses,
+          dataLength: codedDataLength
+        });
+      }
+      alignToByte();
+      if (ephMarkerUsed) {
+        skipMarkerIfEqual(0x92);
+      }
+      while (queue.length > 0) {
+        var packetItem = queue.shift();
+        codeblock = packetItem.codeblock;
+        if (codeblock['data'] === undefined) {
+          codeblock.data = [];
+        }
+        codeblock.data.push({
+          data: data,
+          start: offset + position,
+          end: offset + position + packetItem.dataLength,
+          codingpasses: packetItem.codingpasses
+        });
+        position += packetItem.dataLength;
+      }
+    }
+    return position;
+  }
+  function copyCoefficients(coefficients, levelWidth, levelHeight, subband, delta, mb, reversible, segmentationSymbolUsed) {
+    var x0 = subband.tbx0;
+    var y0 = subband.tby0;
+    var width = subband.tbx1 - subband.tbx0;
+    var codeblocks = subband.codeblocks;
+    var right = subband.type.charAt(0) === 'H' ? 1 : 0;
+    var bottom = subband.type.charAt(1) === 'H' ? levelWidth : 0;
+    for (var i = 0, ii = codeblocks.length; i < ii; ++i) {
+      var codeblock = codeblocks[i];
+      var blockWidth = codeblock.tbx1_ - codeblock.tbx0_;
+      var blockHeight = codeblock.tby1_ - codeblock.tby0_;
+      if (blockWidth === 0 || blockHeight === 0) {
+        continue;
+      }
+      if (codeblock['data'] === undefined) {
+        continue;
+      }
+      var bitModel, currentCodingpassType;
+      bitModel = new BitModel(blockWidth, blockHeight, codeblock.subbandType, codeblock.zeroBitPlanes, mb);
+      currentCodingpassType = 2;
+      var data = codeblock.data,
+          totalLength = 0,
+          codingpasses = 0;
+      var j, jj, dataItem;
+      for (j = 0, jj = data.length; j < jj; j++) {
+        dataItem = data[j];
+        totalLength += dataItem.end - dataItem.start;
+        codingpasses += dataItem.codingpasses;
+      }
+      var encodedData = new Uint8Array(totalLength);
+      var position = 0;
+      for (j = 0, jj = data.length; j < jj; j++) {
+        dataItem = data[j];
+        var chunk = dataItem.data.subarray(dataItem.start, dataItem.end);
+        encodedData.set(chunk, position);
+        position += chunk.length;
+      }
+      var decoder = new _arithmetic_decoder.ArithmeticDecoder(encodedData, 0, totalLength);
+      bitModel.setDecoder(decoder);
+      for (j = 0; j < codingpasses; j++) {
+        switch (currentCodingpassType) {
+          case 0:
+            bitModel.runSignificancePropagationPass();
+            break;
+          case 1:
+            bitModel.runMagnitudeRefinementPass();
+            break;
+          case 2:
+            bitModel.runCleanupPass();
+            if (segmentationSymbolUsed) {
+              bitModel.checkSegmentationSymbol();
+            }
+            break;
+        }
+        currentCodingpassType = (currentCodingpassType + 1) % 3;
+      }
+      var offset = codeblock.tbx0_ - x0 + (codeblock.tby0_ - y0) * width;
+      var sign = bitModel.coefficentsSign;
+      var magnitude = bitModel.coefficentsMagnitude;
+      var bitsDecoded = bitModel.bitsDecoded;
+      var magnitudeCorrection = reversible ? 0 : 0.5;
+      var k, n, nb;
+      position = 0;
+      var interleave = subband.type !== 'LL';
+      for (j = 0; j < blockHeight; j++) {
+        var row = offset / width | 0;
+        var levelOffset = 2 * row * (levelWidth - width) + right + bottom;
+        for (k = 0; k < blockWidth; k++) {
+          n = magnitude[position];
+          if (n !== 0) {
+            n = (n + magnitudeCorrection) * delta;
+            if (sign[position] !== 0) {
+              n = -n;
+            }
+            nb = bitsDecoded[position];
+            var pos = interleave ? levelOffset + (offset << 1) : offset;
+            if (reversible && nb >= mb) {
+              coefficients[pos] = n;
+            } else {
+              coefficients[pos] = n * (1 << mb - nb);
+            }
+          }
+          offset++;
+          position++;
+        }
+        offset += width - blockWidth;
+      }
+    }
+  }
+  function transformTile(context, tile, c) {
+    var component = tile.components[c];
+    var codingStyleParameters = component.codingStyleParameters;
+    var quantizationParameters = component.quantizationParameters;
+    var decompositionLevelsCount = codingStyleParameters.decompositionLevelsCount;
+    var spqcds = quantizationParameters.SPqcds;
+    var scalarExpounded = quantizationParameters.scalarExpounded;
+    var guardBits = quantizationParameters.guardBits;
+    var segmentationSymbolUsed = codingStyleParameters.segmentationSymbolUsed;
+    var precision = context.components[c].precision;
+    var reversible = codingStyleParameters.reversibleTransformation;
+    var transform = reversible ? new ReversibleTransform() : new IrreversibleTransform();
+    var subbandCoefficients = [];
+    var b = 0;
+    for (var i = 0; i <= decompositionLevelsCount; i++) {
+      var resolution = component.resolutions[i];
+      var width = resolution.trx1 - resolution.trx0;
+      var height = resolution.try1 - resolution.try0;
+      var coefficients = new Float32Array(width * height);
+      for (var j = 0, jj = resolution.subbands.length; j < jj; j++) {
+        var mu, epsilon;
+        if (!scalarExpounded) {
+          mu = spqcds[0].mu;
+          epsilon = spqcds[0].epsilon + (i > 0 ? 1 - i : 0);
+        } else {
+          mu = spqcds[b].mu;
+          epsilon = spqcds[b].epsilon;
+          b++;
+        }
+        var subband = resolution.subbands[j];
+        var gainLog2 = SubbandsGainLog2[subband.type];
+        var delta = reversible ? 1 : Math.pow(2, precision + gainLog2 - epsilon) * (1 + mu / 2048);
+        var mb = guardBits + epsilon - 1;
+        copyCoefficients(coefficients, width, height, subband, delta, mb, reversible, segmentationSymbolUsed);
+      }
+      subbandCoefficients.push({
+        width: width,
+        height: height,
+        items: coefficients
+      });
+    }
+    var result = transform.calculate(subbandCoefficients, component.tcx0, component.tcy0);
+    return {
+      left: component.tcx0,
+      top: component.tcy0,
+      width: result.width,
+      height: result.height,
+      items: result.items
+    };
+  }
+  function transformComponents(context) {
+    var siz = context.SIZ;
+    var components = context.components;
+    var componentsCount = siz.Csiz;
+    var resultImages = [];
+    for (var i = 0, ii = context.tiles.length; i < ii; i++) {
+      var tile = context.tiles[i];
+      var transformedTiles = [];
+      var c;
+      for (c = 0; c < componentsCount; c++) {
+        transformedTiles[c] = transformTile(context, tile, c);
+      }
+      var tile0 = transformedTiles[0];
+      var out = new Uint8ClampedArray(tile0.items.length * componentsCount);
+      var result = {
+        left: tile0.left,
+        top: tile0.top,
+        width: tile0.width,
+        height: tile0.height,
+        items: out
+      };
+      var shift, offset;
+      var pos = 0,
+          j,
+          jj,
+          y0,
+          y1,
+          y2;
+      if (tile.codingStyleDefaultParameters.multipleComponentTransform) {
+        var fourComponents = componentsCount === 4;
+        var y0items = transformedTiles[0].items;
+        var y1items = transformedTiles[1].items;
+        var y2items = transformedTiles[2].items;
+        var y3items = fourComponents ? transformedTiles[3].items : null;
+        shift = components[0].precision - 8;
+        offset = (128 << shift) + 0.5;
+        var component0 = tile.components[0];
+        var alpha01 = componentsCount - 3;
+        jj = y0items.length;
+        if (!component0.codingStyleParameters.reversibleTransformation) {
+          for (j = 0; j < jj; j++, pos += alpha01) {
+            y0 = y0items[j] + offset;
+            y1 = y1items[j];
+            y2 = y2items[j];
+            out[pos++] = y0 + 1.402 * y2 >> shift;
+            out[pos++] = y0 - 0.34413 * y1 - 0.71414 * y2 >> shift;
+            out[pos++] = y0 + 1.772 * y1 >> shift;
+          }
+        } else {
+          for (j = 0; j < jj; j++, pos += alpha01) {
+            y0 = y0items[j] + offset;
+            y1 = y1items[j];
+            y2 = y2items[j];
+            var g = y0 - (y2 + y1 >> 2);
+            out[pos++] = g + y2 >> shift;
+            out[pos++] = g >> shift;
+            out[pos++] = g + y1 >> shift;
+          }
+        }
+        if (fourComponents) {
+          for (j = 0, pos = 3; j < jj; j++, pos += 4) {
+            out[pos] = y3items[j] + offset >> shift;
+          }
+        }
+      } else {
+        for (c = 0; c < componentsCount; c++) {
+          var items = transformedTiles[c].items;
+          shift = components[c].precision - 8;
+          offset = (128 << shift) + 0.5;
+          for (pos = c, j = 0, jj = items.length; j < jj; j++) {
+            out[pos] = items[j] + offset >> shift;
+            pos += componentsCount;
+          }
+        }
+      }
+      resultImages.push(result);
+    }
+    return resultImages;
+  }
+  function initializeTile(context, tileIndex) {
+    var siz = context.SIZ;
+    var componentsCount = siz.Csiz;
+    var tile = context.tiles[tileIndex];
+    for (var c = 0; c < componentsCount; c++) {
+      var component = tile.components[c];
+      var qcdOrQcc = context.currentTile.QCC[c] !== undefined ? context.currentTile.QCC[c] : context.currentTile.QCD;
+      component.quantizationParameters = qcdOrQcc;
+      var codOrCoc = context.currentTile.COC[c] !== undefined ? context.currentTile.COC[c] : context.currentTile.COD;
+      component.codingStyleParameters = codOrCoc;
+    }
+    tile.codingStyleDefaultParameters = context.currentTile.COD;
+  }
+  var TagTree = function TagTreeClosure() {
+    function TagTree(width, height) {
+      var levelsLength = (0, _util.log2)(Math.max(width, height)) + 1;
+      this.levels = [];
+      for (var i = 0; i < levelsLength; i++) {
+        var level = {
+          width: width,
+          height: height,
+          items: []
+        };
+        this.levels.push(level);
+        width = Math.ceil(width / 2);
+        height = Math.ceil(height / 2);
+      }
+    }
+    TagTree.prototype = {
+      reset: function TagTree_reset(i, j) {
+        var currentLevel = 0,
+            value = 0,
+            level;
+        while (currentLevel < this.levels.length) {
+          level = this.levels[currentLevel];
+          var index = i + j * level.width;
+          if (level.items[index] !== undefined) {
+            value = level.items[index];
+            break;
+          }
+          level.index = index;
+          i >>= 1;
+          j >>= 1;
+          currentLevel++;
+        }
+        currentLevel--;
+        level = this.levels[currentLevel];
+        level.items[level.index] = value;
+        this.currentLevel = currentLevel;
+        delete this.value;
+      },
+      incrementValue: function TagTree_incrementValue() {
+        var level = this.levels[this.currentLevel];
+        level.items[level.index]++;
+      },
+      nextLevel: function TagTree_nextLevel() {
+        var currentLevel = this.currentLevel;
+        var level = this.levels[currentLevel];
+        var value = level.items[level.index];
+        currentLevel--;
+        if (currentLevel < 0) {
+          this.value = value;
+          return false;
+        }
+        this.currentLevel = currentLevel;
+        level = this.levels[currentLevel];
+        level.items[level.index] = value;
+        return true;
+      }
+    };
+    return TagTree;
+  }();
+  var InclusionTree = function InclusionTreeClosure() {
+    function InclusionTree(width, height, defaultValue) {
+      var levelsLength = (0, _util.log2)(Math.max(width, height)) + 1;
+      this.levels = [];
+      for (var i = 0; i < levelsLength; i++) {
+        var items = new Uint8Array(width * height);
+        for (var j = 0, jj = items.length; j < jj; j++) {
+          items[j] = defaultValue;
+        }
+        var level = {
+          width: width,
+          height: height,
+          items: items
+        };
+        this.levels.push(level);
+        width = Math.ceil(width / 2);
+        height = Math.ceil(height / 2);
+      }
+    }
+    InclusionTree.prototype = {
+      reset: function InclusionTree_reset(i, j, stopValue) {
+        var currentLevel = 0;
+        while (currentLevel < this.levels.length) {
+          var level = this.levels[currentLevel];
+          var index = i + j * level.width;
+          level.index = index;
+          var value = level.items[index];
+          if (value === 0xFF) {
+            break;
+          }
+          if (value > stopValue) {
+            this.currentLevel = currentLevel;
+            this.propagateValues();
+            return false;
+          }
+          i >>= 1;
+          j >>= 1;
+          currentLevel++;
+        }
+        this.currentLevel = currentLevel - 1;
+        return true;
+      },
+      incrementValue: function InclusionTree_incrementValue(stopValue) {
+        var level = this.levels[this.currentLevel];
+        level.items[level.index] = stopValue + 1;
+        this.propagateValues();
+      },
+      propagateValues: function InclusionTree_propagateValues() {
+        var levelIndex = this.currentLevel;
+        var level = this.levels[levelIndex];
+        var currentValue = level.items[level.index];
+        while (--levelIndex >= 0) {
+          level = this.levels[levelIndex];
+          level.items[level.index] = currentValue;
+        }
+      },
+      nextLevel: function InclusionTree_nextLevel() {
+        var currentLevel = this.currentLevel;
+        var level = this.levels[currentLevel];
+        var value = level.items[level.index];
+        level.items[level.index] = 0xFF;
+        currentLevel--;
+        if (currentLevel < 0) {
+          return false;
+        }
+        this.currentLevel = currentLevel;
+        level = this.levels[currentLevel];
+        level.items[level.index] = value;
+        return true;
+      }
+    };
+    return InclusionTree;
+  }();
+  var BitModel = function BitModelClosure() {
+    var UNIFORM_CONTEXT = 17;
+    var RUNLENGTH_CONTEXT = 18;
+    var LLAndLHContextsLabel = new Uint8Array([0, 5, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 1, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8]);
+    var HLContextLabel = new Uint8Array([0, 3, 4, 0, 5, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 1, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8]);
+    var HHContextLabel = new Uint8Array([0, 1, 2, 0, 1, 2, 2, 0, 2, 2, 2, 0, 0, 0, 0, 0, 3, 4, 5, 0, 4, 5, 5, 0, 5, 5, 5, 0, 0, 0, 0, 0, 6, 7, 7, 0, 7, 7, 7, 0, 7, 7, 7, 0, 0, 0, 0, 0, 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8, 0, 0, 0, 0, 0, 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8]);
+    function BitModel(width, height, subband, zeroBitPlanes, mb) {
+      this.width = width;
+      this.height = height;
+      this.contextLabelTable = subband === 'HH' ? HHContextLabel : subband === 'HL' ? HLContextLabel : LLAndLHContextsLabel;
+      var coefficientCount = width * height;
+      this.neighborsSignificance = new Uint8Array(coefficientCount);
+      this.coefficentsSign = new Uint8Array(coefficientCount);
+      this.coefficentsMagnitude = mb > 14 ? new Uint32Array(coefficientCount) : mb > 6 ? new Uint16Array(coefficientCount) : new Uint8Array(coefficientCount);
+      this.processingFlags = new Uint8Array(coefficientCount);
+      var bitsDecoded = new Uint8Array(coefficientCount);
+      if (zeroBitPlanes !== 0) {
+        for (var i = 0; i < coefficientCount; i++) {
+          bitsDecoded[i] = zeroBitPlanes;
+        }
+      }
+      this.bitsDecoded = bitsDecoded;
+      this.reset();
+    }
+    BitModel.prototype = {
+      setDecoder: function BitModel_setDecoder(decoder) {
+        this.decoder = decoder;
+      },
+      reset: function BitModel_reset() {
+        this.contexts = new Int8Array(19);
+        this.contexts[0] = 4 << 1 | 0;
+        this.contexts[UNIFORM_CONTEXT] = 46 << 1 | 0;
+        this.contexts[RUNLENGTH_CONTEXT] = 3 << 1 | 0;
+      },
+      setNeighborsSignificance: function BitModel_setNeighborsSignificance(row, column, index) {
+        var neighborsSignificance = this.neighborsSignificance;
+        var width = this.width,
+            height = this.height;
+        var left = column > 0;
+        var right = column + 1 < width;
+        var i;
+        if (row > 0) {
+          i = index - width;
+          if (left) {
+            neighborsSignificance[i - 1] += 0x10;
+          }
+          if (right) {
+            neighborsSignificance[i + 1] += 0x10;
+          }
+          neighborsSignificance[i] += 0x04;
+        }
+        if (row + 1 < height) {
+          i = index + width;
+          if (left) {
+            neighborsSignificance[i - 1] += 0x10;
+          }
+          if (right) {
+            neighborsSignificance[i + 1] += 0x10;
+          }
+          neighborsSignificance[i] += 0x04;
+        }
+        if (left) {
+          neighborsSignificance[index - 1] += 0x01;
+        }
+        if (right) {
+          neighborsSignificance[index + 1] += 0x01;
+        }
+        neighborsSignificance[index] |= 0x80;
+      },
+      runSignificancePropagationPass: function BitModel_runSignificancePropagationPass() {
+        var decoder = this.decoder;
+        var width = this.width,
+            height = this.height;
+        var coefficentsMagnitude = this.coefficentsMagnitude;
+        var coefficentsSign = this.coefficentsSign;
+        var neighborsSignificance = this.neighborsSignificance;
+        var processingFlags = this.processingFlags;
+        var contexts = this.contexts;
+        var labels = this.contextLabelTable;
+        var bitsDecoded = this.bitsDecoded;
+        var processedInverseMask = ~1;
+        var processedMask = 1;
+        var firstMagnitudeBitMask = 2;
+        for (var i0 = 0; i0 < height; i0 += 4) {
+          for (var j = 0; j < width; j++) {
+            var index = i0 * width + j;
+            for (var i1 = 0; i1 < 4; i1++, index += width) {
+              var i = i0 + i1;
+              if (i >= height) {
+                break;
+              }
+              processingFlags[index] &= processedInverseMask;
+              if (coefficentsMagnitude[index] || !neighborsSignificance[index]) {
+                continue;
+              }
+              var contextLabel = labels[neighborsSignificance[index]];
+              var decision = decoder.readBit(contexts, contextLabel);
+              if (decision) {
+                var sign = this.decodeSignBit(i, j, index);
+                coefficentsSign[index] = sign;
+                coefficentsMagnitude[index] = 1;
+                this.setNeighborsSignificance(i, j, index);
+                processingFlags[index] |= firstMagnitudeBitMask;
+              }
+              bitsDecoded[index]++;
+              processingFlags[index] |= processedMask;
+            }
+          }
+        }
+      },
+      decodeSignBit: function BitModel_decodeSignBit(row, column, index) {
+        var width = this.width,
+            height = this.height;
+        var coefficentsMagnitude = this.coefficentsMagnitude;
+        var coefficentsSign = this.coefficentsSign;
+        var contribution, sign0, sign1, significance1;
+        var contextLabel, decoded;
+        significance1 = column > 0 && coefficentsMagnitude[index - 1] !== 0;
+        if (column + 1 < width && coefficentsMagnitude[index + 1] !== 0) {
+          sign1 = coefficentsSign[index + 1];
+          if (significance1) {
+            sign0 = coefficentsSign[index - 1];
+            contribution = 1 - sign1 - sign0;
+          } else {
+            contribution = 1 - sign1 - sign1;
+          }
+        } else if (significance1) {
+          sign0 = coefficentsSign[index - 1];
+          contribution = 1 - sign0 - sign0;
+        } else {
+          contribution = 0;
+        }
+        var horizontalContribution = 3 * contribution;
+        significance1 = row > 0 && coefficentsMagnitude[index - width] !== 0;
+        if (row + 1 < height && coefficentsMagnitude[index + width] !== 0) {
+          sign1 = coefficentsSign[index + width];
+          if (significance1) {
+            sign0 = coefficentsSign[index - width];
+            contribution = 1 - sign1 - sign0 + horizontalContribution;
+          } else {
+            contribution = 1 - sign1 - sign1 + horizontalContribution;
+          }
+        } else if (significance1) {
+          sign0 = coefficentsSign[index - width];
+          contribution = 1 - sign0 - sign0 + horizontalContribution;
+        } else {
+          contribution = horizontalContribution;
+        }
+        if (contribution >= 0) {
+          contextLabel = 9 + contribution;
+          decoded = this.decoder.readBit(this.contexts, contextLabel);
+        } else {
+          contextLabel = 9 - contribution;
+          decoded = this.decoder.readBit(this.contexts, contextLabel) ^ 1;
+        }
+        return decoded;
+      },
+      runMagnitudeRefinementPass: function BitModel_runMagnitudeRefinementPass() {
+        var decoder = this.decoder;
+        var width = this.width,
+            height = this.height;
+        var coefficentsMagnitude = this.coefficentsMagnitude;
+        var neighborsSignificance = this.neighborsSignificance;
+        var contexts = this.contexts;
+        var bitsDecoded = this.bitsDecoded;
+        var processingFlags = this.processingFlags;
+        var processedMask = 1;
+        var firstMagnitudeBitMask = 2;
+        var length = width * height;
+        var width4 = width * 4;
+        for (var index0 = 0, indexNext; index0 < length; index0 = indexNext) {
+          indexNext = Math.min(length, index0 + width4);
+          for (var j = 0; j < width; j++) {
+            for (var index = index0 + j; index < indexNext; index += width) {
+              if (!coefficentsMagnitude[index] || (processingFlags[index] & processedMask) !== 0) {
+                continue;
+              }
+              var contextLabel = 16;
+              if ((processingFlags[index] & firstMagnitudeBitMask) !== 0) {
+                processingFlags[index] ^= firstMagnitudeBitMask;
+                var significance = neighborsSignificance[index] & 127;
+                contextLabel = significance === 0 ? 15 : 14;
+              }
+              var bit = decoder.readBit(contexts, contextLabel);
+              coefficentsMagnitude[index] = coefficentsMagnitude[index] << 1 | bit;
+              bitsDecoded[index]++;
+              processingFlags[index] |= processedMask;
+            }
+          }
+        }
+      },
+      runCleanupPass: function BitModel_runCleanupPass() {
+        var decoder = this.decoder;
+        var width = this.width,
+            height = this.height;
+        var neighborsSignificance = this.neighborsSignificance;
+        var coefficentsMagnitude = this.coefficentsMagnitude;
+        var coefficentsSign = this.coefficentsSign;
+        var contexts = this.contexts;
+        var labels = this.contextLabelTable;
+        var bitsDecoded = this.bitsDecoded;
+        var processingFlags = this.processingFlags;
+        var processedMask = 1;
+        var firstMagnitudeBitMask = 2;
+        var oneRowDown = width;
+        var twoRowsDown = width * 2;
+        var threeRowsDown = width * 3;
+        var iNext;
+        for (var i0 = 0; i0 < height; i0 = iNext) {
+          iNext = Math.min(i0 + 4, height);
+          var indexBase = i0 * width;
+          var checkAllEmpty = i0 + 3 < height;
+          for (var j = 0; j < width; j++) {
+            var index0 = indexBase + j;
+            var allEmpty = checkAllEmpty && processingFlags[index0] === 0 && processingFlags[index0 + oneRowDown] === 0 && processingFlags[index0 + twoRowsDown] === 0 && processingFlags[index0 + threeRowsDown] === 0 && neighborsSignificance[index0] === 0 && neighborsSignificance[index0 + oneRowDown] === 0 && neighborsSignificance[index0 + twoRowsDown] === 0 && neighborsSignificance[index0 + threeRowsDown] === 0;
+            var i1 = 0,
+                index = index0;
+            var i = i0,
+                sign;
+            if (allEmpty) {
+              var hasSignificantCoefficent = decoder.readBit(contexts, RUNLENGTH_CONTEXT);
+              if (!hasSignificantCoefficent) {
+                bitsDecoded[index0]++;
+                bitsDecoded[index0 + oneRowDown]++;
+                bitsDecoded[index0 + twoRowsDown]++;
+                bitsDecoded[index0 + threeRowsDown]++;
+                continue;
+              }
+              i1 = decoder.readBit(contexts, UNIFORM_CONTEXT) << 1 | decoder.readBit(contexts, UNIFORM_CONTEXT);
+              if (i1 !== 0) {
+                i = i0 + i1;
+                index += i1 * width;
+              }
+              sign = this.decodeSignBit(i, j, index);
+              coefficentsSign[index] = sign;
+              coefficentsMagnitude[index] = 1;
+              this.setNeighborsSignificance(i, j, index);
+              processingFlags[index] |= firstMagnitudeBitMask;
+              index = index0;
+              for (var i2 = i0; i2 <= i; i2++, index += width) {
+                bitsDecoded[index]++;
+              }
+              i1++;
+            }
+            for (i = i0 + i1; i < iNext; i++, index += width) {
+              if (coefficentsMagnitude[index] || (processingFlags[index] & processedMask) !== 0) {
+                continue;
+              }
+              var contextLabel = labels[neighborsSignificance[index]];
+              var decision = decoder.readBit(contexts, contextLabel);
+              if (decision === 1) {
+                sign = this.decodeSignBit(i, j, index);
+                coefficentsSign[index] = sign;
+                coefficentsMagnitude[index] = 1;
+                this.setNeighborsSignificance(i, j, index);
+                processingFlags[index] |= firstMagnitudeBitMask;
+              }
+              bitsDecoded[index]++;
+            }
+          }
+        }
+      },
+      checkSegmentationSymbol: function BitModel_checkSegmentationSymbol() {
+        var decoder = this.decoder;
+        var contexts = this.contexts;
+        var symbol = decoder.readBit(contexts, UNIFORM_CONTEXT) << 3 | decoder.readBit(contexts, UNIFORM_CONTEXT) << 2 | decoder.readBit(contexts, UNIFORM_CONTEXT) << 1 | decoder.readBit(contexts, UNIFORM_CONTEXT);
+        if (symbol !== 0xA) {
+          throw new JpxError('Invalid segmentation symbol');
+        }
+      }
+    };
+    return BitModel;
+  }();
+  var Transform = function TransformClosure() {
+    function Transform() {}
+    Transform.prototype.calculate = function transformCalculate(subbands, u0, v0) {
+      var ll = subbands[0];
+      for (var i = 1, ii = subbands.length; i < ii; i++) {
+        ll = this.iterate(ll, subbands[i], u0, v0);
+      }
+      return ll;
+    };
+    Transform.prototype.extend = function extend(buffer, offset, size) {
+      var i1 = offset - 1,
+          j1 = offset + 1;
+      var i2 = offset + size - 2,
+          j2 = offset + size;
+      buffer[i1--] = buffer[j1++];
+      buffer[j2++] = buffer[i2--];
+      buffer[i1--] = buffer[j1++];
+      buffer[j2++] = buffer[i2--];
+      buffer[i1--] = buffer[j1++];
+      buffer[j2++] = buffer[i2--];
+      buffer[i1] = buffer[j1];
+      buffer[j2] = buffer[i2];
+    };
+    Transform.prototype.iterate = function Transform_iterate(ll, hl_lh_hh, u0, v0) {
+      var llWidth = ll.width,
+          llHeight = ll.height,
+          llItems = ll.items;
+      var width = hl_lh_hh.width;
+      var height = hl_lh_hh.height;
+      var items = hl_lh_hh.items;
+      var i, j, k, l, u, v;
+      for (k = 0, i = 0; i < llHeight; i++) {
+        l = i * 2 * width;
+        for (j = 0; j < llWidth; j++, k++, l += 2) {
+          items[l] = llItems[k];
+        }
+      }
+      llItems = ll.items = null;
+      var bufferPadding = 4;
+      var rowBuffer = new Float32Array(width + 2 * bufferPadding);
+      if (width === 1) {
+        if ((u0 & 1) !== 0) {
+          for (v = 0, k = 0; v < height; v++, k += width) {
+            items[k] *= 0.5;
+          }
+        }
+      } else {
+        for (v = 0, k = 0; v < height; v++, k += width) {
+          rowBuffer.set(items.subarray(k, k + width), bufferPadding);
+          this.extend(rowBuffer, bufferPadding, width);
+          this.filter(rowBuffer, bufferPadding, width);
+          items.set(rowBuffer.subarray(bufferPadding, bufferPadding + width), k);
+        }
+      }
+      var numBuffers = 16;
+      var colBuffers = [];
+      for (i = 0; i < numBuffers; i++) {
+        colBuffers.push(new Float32Array(height + 2 * bufferPadding));
+      }
+      var b,
+          currentBuffer = 0;
+      ll = bufferPadding + height;
+      if (height === 1) {
+        if ((v0 & 1) !== 0) {
+          for (u = 0; u < width; u++) {
+            items[u] *= 0.5;
+          }
+        }
+      } else {
+        for (u = 0; u < width; u++) {
+          if (currentBuffer === 0) {
+            numBuffers = Math.min(width - u, numBuffers);
+            for (k = u, l = bufferPadding; l < ll; k += width, l++) {
+              for (b = 0; b < numBuffers; b++) {
+                colBuffers[b][l] = items[k + b];
+              }
+            }
+            currentBuffer = numBuffers;
+          }
+          currentBuffer--;
+          var buffer = colBuffers[currentBuffer];
+          this.extend(buffer, bufferPadding, height);
+          this.filter(buffer, bufferPadding, height);
+          if (currentBuffer === 0) {
+            k = u - numBuffers + 1;
+            for (l = bufferPadding; l < ll; k += width, l++) {
+              for (b = 0; b < numBuffers; b++) {
+                items[k + b] = colBuffers[b][l];
+              }
+            }
+          }
+        }
+      }
+      return {
+        width: width,
+        height: height,
+        items: items
+      };
+    };
+    return Transform;
+  }();
+  var IrreversibleTransform = function IrreversibleTransformClosure() {
+    function IrreversibleTransform() {
+      Transform.call(this);
+    }
+    IrreversibleTransform.prototype = Object.create(Transform.prototype);
+    IrreversibleTransform.prototype.filter = function irreversibleTransformFilter(x, offset, length) {
+      var len = length >> 1;
+      offset = offset | 0;
+      var j, n, current, next;
+      var alpha = -1.586134342059924;
+      var beta = -0.052980118572961;
+      var gamma = 0.882911075530934;
+      var delta = 0.443506852043971;
+      var K = 1.230174104914001;
+      var K_ = 1 / K;
+      j = offset - 3;
+      for (n = len + 4; n--; j += 2) {
+        x[j] *= K_;
+      }
+      j = offset - 2;
+      current = delta * x[j - 1];
+      for (n = len + 3; n--; j += 2) {
+        next = delta * x[j + 1];
+        x[j] = K * x[j] - current - next;
+        if (n--) {
+          j += 2;
+          current = delta * x[j + 1];
+          x[j] = K * x[j] - current - next;
+        } else {
+          break;
+        }
+      }
+      j = offset - 1;
+      current = gamma * x[j - 1];
+      for (n = len + 2; n--; j += 2) {
+        next = gamma * x[j + 1];
+        x[j] -= current + next;
+        if (n--) {
+          j += 2;
+          current = gamma * x[j + 1];
+          x[j] -= current + next;
+        } else {
+          break;
+        }
+      }
+      j = offset;
+      current = beta * x[j - 1];
+      for (n = len + 1; n--; j += 2) {
+        next = beta * x[j + 1];
+        x[j] -= current + next;
+        if (n--) {
+          j += 2;
+          current = beta * x[j + 1];
+          x[j] -= current + next;
+        } else {
+          break;
+        }
+      }
+      if (len !== 0) {
+        j = offset + 1;
+        current = alpha * x[j - 1];
+        for (n = len; n--; j += 2) {
+          next = alpha * x[j + 1];
+          x[j] -= current + next;
+          if (n--) {
+            j += 2;
+            current = alpha * x[j + 1];
+            x[j] -= current + next;
+          } else {
+            break;
+          }
+        }
+      }
+    };
+    return IrreversibleTransform;
+  }();
+  var ReversibleTransform = function ReversibleTransformClosure() {
+    function ReversibleTransform() {
+      Transform.call(this);
+    }
+    ReversibleTransform.prototype = Object.create(Transform.prototype);
+    ReversibleTransform.prototype.filter = function reversibleTransformFilter(x, offset, length) {
+      var len = length >> 1;
+      offset = offset | 0;
+      var j, n;
+      for (j = offset, n = len + 1; n--; j += 2) {
+        x[j] -= x[j - 1] + x[j + 1] + 2 >> 2;
+      }
+      for (j = offset + 1, n = len; n--; j += 2) {
+        x[j] += x[j - 1] + x[j + 1] >> 1;
+      }
+    };
+    return ReversibleTransform;
+  }();
+  return JpxImage;
+}();
+exports.JpxImage = JpxImage;
+
+/***/ }),
+/* 150 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.calculateSHA512 = exports.calculateSHA384 = exports.calculateSHA256 = exports.calculateMD5 = exports.PDF20 = exports.PDF17 = exports.CipherTransformFactory = exports.ARCFourCipher = exports.AES256Cipher = exports.AES128Cipher = undefined;
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _util = __w_pdfjs_require__(2);
+
+var _primitives = __w_pdfjs_require__(138);
+
+var _stream = __w_pdfjs_require__(140);
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var ARCFourCipher = function ARCFourCipherClosure() {
+  function ARCFourCipher(key) {
+    this.a = 0;
+    this.b = 0;
+    var s = new Uint8Array(256);
+    var i,
+        j = 0,
+        tmp,
+        keyLength = key.length;
+    for (i = 0; i < 256; ++i) {
+      s[i] = i;
+    }
+    for (i = 0; i < 256; ++i) {
+      tmp = s[i];
+      j = j + tmp + key[i % keyLength] & 0xFF;
+      s[i] = s[j];
+      s[j] = tmp;
+    }
+    this.s = s;
+  }
+  ARCFourCipher.prototype = {
+    encryptBlock: function ARCFourCipher_encryptBlock(data) {
+      var i,
+          n = data.length,
+          tmp,
+          tmp2;
+      var a = this.a,
+          b = this.b,
+          s = this.s;
+      var output = new Uint8Array(n);
+      for (i = 0; i < n; ++i) {
+        a = a + 1 & 0xFF;
+        tmp = s[a];
+        b = b + tmp & 0xFF;
+        tmp2 = s[b];
+        s[a] = tmp2;
+        s[b] = tmp;
+        output[i] = data[i] ^ s[tmp + tmp2 & 0xFF];
+      }
+      this.a = a;
+      this.b = b;
+      return output;
+    }
+  };
+  ARCFourCipher.prototype.decryptBlock = ARCFourCipher.prototype.encryptBlock;
+  return ARCFourCipher;
+}();
+var calculateMD5 = function calculateMD5Closure() {
+  var r = new Uint8Array([7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21]);
+  var k = new Int32Array([-680876936, -389564586, 606105819, -1044525330, -176418897, 1200080426, -1473231341, -45705983, 1770035416, -1958414417, -42063, -1990404162, 1804603682, -40341101, -1502002290, 1236535329, -165796510, -1069501632, 643717713, -373897302, -701558691, 38016083, -660478335, -405537848, 568446438, -1019803690, -187363961, 1163531501, -1444681467, -51403784, 1735328473, -1926607734, -378558, -2022574463, 1839030562, -35309556, -1530992060, 1272893353, -155497632, -1094730640, 681279174, -358537222, -722521979, 76029189, -640364487, -421815835, 530742520, -995338651, -198630844, 1126891415, -1416354905, -57434055, 1700485571, -1894986606, -1051523, -2054922799, 1873313359, -30611744, -1560198380, 1309151649, -145523070, -1120210379, 718787259, -343485551]);
+  function hash(data, offset, length) {
+    var h0 = 1732584193,
+        h1 = -271733879,
+        h2 = -1732584194,
+        h3 = 271733878;
+    var paddedLength = length + 72 & ~63;
+    var padded = new Uint8Array(paddedLength);
+    var i, j, n;
+    for (i = 0; i < length; ++i) {
+      padded[i] = data[offset++];
+    }
+    padded[i++] = 0x80;
+    n = paddedLength - 8;
+    while (i < n) {
+      padded[i++] = 0;
+    }
+    padded[i++] = length << 3 & 0xFF;
+    padded[i++] = length >> 5 & 0xFF;
+    padded[i++] = length >> 13 & 0xFF;
+    padded[i++] = length >> 21 & 0xFF;
+    padded[i++] = length >>> 29 & 0xFF;
+    padded[i++] = 0;
+    padded[i++] = 0;
+    padded[i++] = 0;
+    var w = new Int32Array(16);
+    for (i = 0; i < paddedLength;) {
+      for (j = 0; j < 16; ++j, i += 4) {
+        w[j] = padded[i] | padded[i + 1] << 8 | padded[i + 2] << 16 | padded[i + 3] << 24;
+      }
+      var a = h0,
+          b = h1,
+          c = h2,
+          d = h3,
+          f,
+          g;
+      for (j = 0; j < 64; ++j) {
+        if (j < 16) {
+          f = b & c | ~b & d;
+          g = j;
+        } else if (j < 32) {
+          f = d & b | ~d & c;
+          g = 5 * j + 1 & 15;
+        } else if (j < 48) {
+          f = b ^ c ^ d;
+          g = 3 * j + 5 & 15;
+        } else {
+          f = c ^ (b | ~d);
+          g = 7 * j & 15;
+        }
+        var tmp = d,
+            rotateArg = a + f + k[j] + w[g] | 0,
+            rotate = r[j];
+        d = c;
+        c = b;
+        b = b + (rotateArg << rotate | rotateArg >>> 32 - rotate) | 0;
+        a = tmp;
+      }
+      h0 = h0 + a | 0;
+      h1 = h1 + b | 0;
+      h2 = h2 + c | 0;
+      h3 = h3 + d | 0;
+    }
+    return new Uint8Array([h0 & 0xFF, h0 >> 8 & 0xFF, h0 >> 16 & 0xFF, h0 >>> 24 & 0xFF, h1 & 0xFF, h1 >> 8 & 0xFF, h1 >> 16 & 0xFF, h1 >>> 24 & 0xFF, h2 & 0xFF, h2 >> 8 & 0xFF, h2 >> 16 & 0xFF, h2 >>> 24 & 0xFF, h3 & 0xFF, h3 >> 8 & 0xFF, h3 >> 16 & 0xFF, h3 >>> 24 & 0xFF]);
+  }
+  return hash;
+}();
+var Word64 = function Word64Closure() {
+  function Word64(highInteger, lowInteger) {
+    this.high = highInteger | 0;
+    this.low = lowInteger | 0;
+  }
+  Word64.prototype = {
+    and: function Word64_and(word) {
+      this.high &= word.high;
+      this.low &= word.low;
+    },
+    xor: function Word64_xor(word) {
+      this.high ^= word.high;
+      this.low ^= word.low;
+    },
+    or: function Word64_or(word) {
+      this.high |= word.high;
+      this.low |= word.low;
+    },
+    shiftRight: function Word64_shiftRight(places) {
+      if (places >= 32) {
+        this.low = this.high >>> places - 32 | 0;
+        this.high = 0;
+      } else {
+        this.low = this.low >>> places | this.high << 32 - places;
+        this.high = this.high >>> places | 0;
+      }
+    },
+    shiftLeft: function Word64_shiftLeft(places) {
+      if (places >= 32) {
+        this.high = this.low << places - 32;
+        this.low = 0;
+      } else {
+        this.high = this.high << places | this.low >>> 32 - places;
+        this.low = this.low << places;
+      }
+    },
+    rotateRight: function Word64_rotateRight(places) {
+      var low, high;
+      if (places & 32) {
+        high = this.low;
+        low = this.high;
+      } else {
+        low = this.low;
+        high = this.high;
+      }
+      places &= 31;
+      this.low = low >>> places | high << 32 - places;
+      this.high = high >>> places | low << 32 - places;
+    },
+    not: function Word64_not() {
+      this.high = ~this.high;
+      this.low = ~this.low;
+    },
+    add: function Word64_add(word) {
+      var lowAdd = (this.low >>> 0) + (word.low >>> 0);
+      var highAdd = (this.high >>> 0) + (word.high >>> 0);
+      if (lowAdd > 0xFFFFFFFF) {
+        highAdd += 1;
+      }
+      this.low = lowAdd | 0;
+      this.high = highAdd | 0;
+    },
+    copyTo: function Word64_copyTo(bytes, offset) {
+      bytes[offset] = this.high >>> 24 & 0xFF;
+      bytes[offset + 1] = this.high >> 16 & 0xFF;
+      bytes[offset + 2] = this.high >> 8 & 0xFF;
+      bytes[offset + 3] = this.high & 0xFF;
+      bytes[offset + 4] = this.low >>> 24 & 0xFF;
+      bytes[offset + 5] = this.low >> 16 & 0xFF;
+      bytes[offset + 6] = this.low >> 8 & 0xFF;
+      bytes[offset + 7] = this.low & 0xFF;
+    },
+    assign: function Word64_assign(word) {
+      this.high = word.high;
+      this.low = word.low;
+    }
+  };
+  return Word64;
+}();
+var calculateSHA256 = function calculateSHA256Closure() {
+  function rotr(x, n) {
+    return x >>> n | x << 32 - n;
+  }
+  function ch(x, y, z) {
+    return x & y ^ ~x & z;
+  }
+  function maj(x, y, z) {
+    return x & y ^ x & z ^ y & z;
+  }
+  function sigma(x) {
+    return rotr(x, 2) ^ rotr(x, 13) ^ rotr(x, 22);
+  }
+  function sigmaPrime(x) {
+    return rotr(x, 6) ^ rotr(x, 11) ^ rotr(x, 25);
+  }
+  function littleSigma(x) {
+    return rotr(x, 7) ^ rotr(x, 18) ^ x >>> 3;
+  }
+  function littleSigmaPrime(x) {
+    return rotr(x, 17) ^ rotr(x, 19) ^ x >>> 10;
+  }
+  var k = [0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2];
+  function hash(data, offset, length) {
+    var h0 = 0x6a09e667,
+        h1 = 0xbb67ae85,
+        h2 = 0x3c6ef372,
+        h3 = 0xa54ff53a,
+        h4 = 0x510e527f,
+        h5 = 0x9b05688c,
+        h6 = 0x1f83d9ab,
+        h7 = 0x5be0cd19;
+    var paddedLength = Math.ceil((length + 9) / 64) * 64;
+    var padded = new Uint8Array(paddedLength);
+    var i, j, n;
+    for (i = 0; i < length; ++i) {
+      padded[i] = data[offset++];
+    }
+    padded[i++] = 0x80;
+    n = paddedLength - 8;
+    while (i < n) {
+      padded[i++] = 0;
+    }
+    padded[i++] = 0;
+    padded[i++] = 0;
+    padded[i++] = 0;
+    padded[i++] = length >>> 29 & 0xFF;
+    padded[i++] = length >> 21 & 0xFF;
+    padded[i++] = length >> 13 & 0xFF;
+    padded[i++] = length >> 5 & 0xFF;
+    padded[i++] = length << 3 & 0xFF;
+    var w = new Uint32Array(64);
+    for (i = 0; i < paddedLength;) {
+      for (j = 0; j < 16; ++j) {
+        w[j] = padded[i] << 24 | padded[i + 1] << 16 | padded[i + 2] << 8 | padded[i + 3];
+        i += 4;
+      }
+      for (j = 16; j < 64; ++j) {
+        w[j] = littleSigmaPrime(w[j - 2]) + w[j - 7] + littleSigma(w[j - 15]) + w[j - 16] | 0;
+      }
+      var a = h0,
+          b = h1,
+          c = h2,
+          d = h3,
+          e = h4,
+          f = h5,
+          g = h6,
+          h = h7,
+          t1,
+          t2;
+      for (j = 0; j < 64; ++j) {
+        t1 = h + sigmaPrime(e) + ch(e, f, g) + k[j] + w[j];
+        t2 = sigma(a) + maj(a, b, c);
+        h = g;
+        g = f;
+        f = e;
+        e = d + t1 | 0;
+        d = c;
+        c = b;
+        b = a;
+        a = t1 + t2 | 0;
+      }
+      h0 = h0 + a | 0;
+      h1 = h1 + b | 0;
+      h2 = h2 + c | 0;
+      h3 = h3 + d | 0;
+      h4 = h4 + e | 0;
+      h5 = h5 + f | 0;
+      h6 = h6 + g | 0;
+      h7 = h7 + h | 0;
+    }
+    return new Uint8Array([h0 >> 24 & 0xFF, h0 >> 16 & 0xFF, h0 >> 8 & 0xFF, h0 & 0xFF, h1 >> 24 & 0xFF, h1 >> 16 & 0xFF, h1 >> 8 & 0xFF, h1 & 0xFF, h2 >> 24 & 0xFF, h2 >> 16 & 0xFF, h2 >> 8 & 0xFF, h2 & 0xFF, h3 >> 24 & 0xFF, h3 >> 16 & 0xFF, h3 >> 8 & 0xFF, h3 & 0xFF, h4 >> 24 & 0xFF, h4 >> 16 & 0xFF, h4 >> 8 & 0xFF, h4 & 0xFF, h5 >> 24 & 0xFF, h5 >> 16 & 0xFF, h5 >> 8 & 0xFF, h5 & 0xFF, h6 >> 24 & 0xFF, h6 >> 16 & 0xFF, h6 >> 8 & 0xFF, h6 & 0xFF, h7 >> 24 & 0xFF, h7 >> 16 & 0xFF, h7 >> 8 & 0xFF, h7 & 0xFF]);
+  }
+  return hash;
+}();
+var calculateSHA512 = function calculateSHA512Closure() {
+  function ch(result, x, y, z, tmp) {
+    result.assign(x);
+    result.and(y);
+    tmp.assign(x);
+    tmp.not();
+    tmp.and(z);
+    result.xor(tmp);
+  }
+  function maj(result, x, y, z, tmp) {
+    result.assign(x);
+    result.and(y);
+    tmp.assign(x);
+    tmp.and(z);
+    result.xor(tmp);
+    tmp.assign(y);
+    tmp.and(z);
+    result.xor(tmp);
+  }
+  function sigma(result, x, tmp) {
+    result.assign(x);
+    result.rotateRight(28);
+    tmp.assign(x);
+    tmp.rotateRight(34);
+    result.xor(tmp);
+    tmp.assign(x);
+    tmp.rotateRight(39);
+    result.xor(tmp);
+  }
+  function sigmaPrime(result, x, tmp) {
+    result.assign(x);
+    result.rotateRight(14);
+    tmp.assign(x);
+    tmp.rotateRight(18);
+    result.xor(tmp);
+    tmp.assign(x);
+    tmp.rotateRight(41);
+    result.xor(tmp);
+  }
+  function littleSigma(result, x, tmp) {
+    result.assign(x);
+    result.rotateRight(1);
+    tmp.assign(x);
+    tmp.rotateRight(8);
+    result.xor(tmp);
+    tmp.assign(x);
+    tmp.shiftRight(7);
+    result.xor(tmp);
+  }
+  function littleSigmaPrime(result, x, tmp) {
+    result.assign(x);
+    result.rotateRight(19);
+    tmp.assign(x);
+    tmp.rotateRight(61);
+    result.xor(tmp);
+    tmp.assign(x);
+    tmp.shiftRight(6);
+    result.xor(tmp);
+  }
+  var k = [new Word64(0x428a2f98, 0xd728ae22), new Word64(0x71374491, 0x23ef65cd), new Word64(0xb5c0fbcf, 0xec4d3b2f), new Word64(0xe9b5dba5, 0x8189dbbc), new Word64(0x3956c25b, 0xf348b538), new Word64(0x59f111f1, 0xb605d019), new Word64(0x923f82a4, 0xaf194f9b), new Word64(0xab1c5ed5, 0xda6d8118), new Word64(0xd807aa98, 0xa3030242), new Word64(0x12835b01, 0x45706fbe), new Word64(0x243185be, 0x4ee4b28c), new Word64(0x550c7dc3, 0xd5ffb4e2), new Word64(0x72be5d74, 0xf27b896f), new Word64(0x80deb1fe, 0x3b1696b1), new Word64(0x9bdc06a7, 0x25c71235), new Word64(0xc19bf174, 0xcf692694), new Word64(0xe49b69c1, 0x9ef14ad2), new Word64(0xefbe4786, 0x384f25e3), new Word64(0x0fc19dc6, 0x8b8cd5b5), new Word64(0x240ca1cc, 0x77ac9c65), new Word64(0x2de92c6f, 0x592b0275), new Word64(0x4a7484aa, 0x6ea6e483), new Word64(0x5cb0a9dc, 0xbd41fbd4), new Word64(0x76f988da, 0x831153b5), new Word64(0x983e5152, 0xee66dfab), new Word64(0xa831c66d, 0x2db43210), new Word64(0xb00327c8, 0x98fb213f), new Word64(0xbf597fc7, 0xbeef0ee4), new Word64(0xc6e00bf3, 0x3da88fc2), new Word64(0xd5a79147, 0x930aa725), new Word64(0x06ca6351, 0xe003826f), new Word64(0x14292967, 0x0a0e6e70), new Word64(0x27b70a85, 0x46d22ffc), new Word64(0x2e1b2138, 0x5c26c926), new Word64(0x4d2c6dfc, 0x5ac42aed), new Word64(0x53380d13, 0x9d95b3df), new Word64(0x650a7354, 0x8baf63de), new Word64(0x766a0abb, 0x3c77b2a8), new Word64(0x81c2c92e, 0x47edaee6), new Word64(0x92722c85, 0x1482353b), new Word64(0xa2bfe8a1, 0x4cf10364), new Word64(0xa81a664b, 0xbc423001), new Word64(0xc24b8b70, 0xd0f89791), new Word64(0xc76c51a3, 0x0654be30), new Word64(0xd192e819, 0xd6ef5218), new Word64(0xd6990624, 0x5565a910), new Word64(0xf40e3585, 0x5771202a), new Word64(0x106aa070, 0x32bbd1b8), new Word64(0x19a4c116, 0xb8d2d0c8), new Word64(0x1e376c08, 0x5141ab53), new Word64(0x2748774c, 0xdf8eeb99), new Word64(0x34b0bcb5, 0xe19b48a8), new Word64(0x391c0cb3, 0xc5c95a63), new Word64(0x4ed8aa4a, 0xe3418acb), new Word64(0x5b9cca4f, 0x7763e373), new Word64(0x682e6ff3, 0xd6b2b8a3), new Word64(0x748f82ee, 0x5defb2fc), new Word64(0x78a5636f, 0x43172f60), new Word64(0x84c87814, 0xa1f0ab72), new Word64(0x8cc70208, 0x1a6439ec), new Word64(0x90befffa, 0x23631e28), new Word64(0xa4506ceb, 0xde82bde9), new Word64(0xbef9a3f7, 0xb2c67915), new Word64(0xc67178f2, 0xe372532b), new Word64(0xca273ece, 0xea26619c), new Word64(0xd186b8c7, 0x21c0c207), new Word64(0xeada7dd6, 0xcde0eb1e), new Word64(0xf57d4f7f, 0xee6ed178), new Word64(0x06f067aa, 0x72176fba), new Word64(0x0a637dc5, 0xa2c898a6), new Word64(0x113f9804, 0xbef90dae), new Word64(0x1b710b35, 0x131c471b), new Word64(0x28db77f5, 0x23047d84), new Word64(0x32caab7b, 0x40c72493), new Word64(0x3c9ebe0a, 0x15c9bebc), new Word64(0x431d67c4, 0x9c100d4c), new Word64(0x4cc5d4be, 0xcb3e42b6), new Word64(0x597f299c, 0xfc657e2a), new Word64(0x5fcb6fab, 0x3ad6faec), new Word64(0x6c44198c, 0x4a475817)];
+  function hash(data, offset, length, mode384) {
+    mode384 = !!mode384;
+    var h0, h1, h2, h3, h4, h5, h6, h7;
+    if (!mode384) {
+      h0 = new Word64(0x6a09e667, 0xf3bcc908);
+      h1 = new Word64(0xbb67ae85, 0x84caa73b);
+      h2 = new Word64(0x3c6ef372, 0xfe94f82b);
+      h3 = new Word64(0xa54ff53a, 0x5f1d36f1);
+      h4 = new Word64(0x510e527f, 0xade682d1);
+      h5 = new Word64(0x9b05688c, 0x2b3e6c1f);
+      h6 = new Word64(0x1f83d9ab, 0xfb41bd6b);
+      h7 = new Word64(0x5be0cd19, 0x137e2179);
+    } else {
+      h0 = new Word64(0xcbbb9d5d, 0xc1059ed8);
+      h1 = new Word64(0x629a292a, 0x367cd507);
+      h2 = new Word64(0x9159015a, 0x3070dd17);
+      h3 = new Word64(0x152fecd8, 0xf70e5939);
+      h4 = new Word64(0x67332667, 0xffc00b31);
+      h5 = new Word64(0x8eb44a87, 0x68581511);
+      h6 = new Word64(0xdb0c2e0d, 0x64f98fa7);
+      h7 = new Word64(0x47b5481d, 0xbefa4fa4);
+    }
+    var paddedLength = Math.ceil((length + 17) / 128) * 128;
+    var padded = new Uint8Array(paddedLength);
+    var i, j, n;
+    for (i = 0; i < length; ++i) {
+      padded[i] = data[offset++];
+    }
+    padded[i++] = 0x80;
+    n = paddedLength - 16;
+    while (i < n) {
+      padded[i++] = 0;
+    }
+    padded[i++] = 0;
+    padded[i++] = 0;
+    padded[i++] = 0;
+    padded[i++] = 0;
+    padded[i++] = 0;
+    padded[i++] = 0;
+    padded[i++] = 0;
+    padded[i++] = 0;
+    padded[i++] = 0;
+    padded[i++] = 0;
+    padded[i++] = 0;
+    padded[i++] = length >>> 29 & 0xFF;
+    padded[i++] = length >> 21 & 0xFF;
+    padded[i++] = length >> 13 & 0xFF;
+    padded[i++] = length >> 5 & 0xFF;
+    padded[i++] = length << 3 & 0xFF;
+    var w = new Array(80);
+    for (i = 0; i < 80; i++) {
+      w[i] = new Word64(0, 0);
+    }
+    var a = new Word64(0, 0),
+        b = new Word64(0, 0),
+        c = new Word64(0, 0);
+    var d = new Word64(0, 0),
+        e = new Word64(0, 0),
+        f = new Word64(0, 0);
+    var g = new Word64(0, 0),
+        h = new Word64(0, 0);
+    var t1 = new Word64(0, 0),
+        t2 = new Word64(0, 0);
+    var tmp1 = new Word64(0, 0),
+        tmp2 = new Word64(0, 0),
+        tmp3;
+    for (i = 0; i < paddedLength;) {
+      for (j = 0; j < 16; ++j) {
+        w[j].high = padded[i] << 24 | padded[i + 1] << 16 | padded[i + 2] << 8 | padded[i + 3];
+        w[j].low = padded[i + 4] << 24 | padded[i + 5] << 16 | padded[i + 6] << 8 | padded[i + 7];
+        i += 8;
+      }
+      for (j = 16; j < 80; ++j) {
+        tmp3 = w[j];
+        littleSigmaPrime(tmp3, w[j - 2], tmp2);
+        tmp3.add(w[j - 7]);
+        littleSigma(tmp1, w[j - 15], tmp2);
+        tmp3.add(tmp1);
+        tmp3.add(w[j - 16]);
+      }
+      a.assign(h0);
+      b.assign(h1);
+      c.assign(h2);
+      d.assign(h3);
+      e.assign(h4);
+      f.assign(h5);
+      g.assign(h6);
+      h.assign(h7);
+      for (j = 0; j < 80; ++j) {
+        t1.assign(h);
+        sigmaPrime(tmp1, e, tmp2);
+        t1.add(tmp1);
+        ch(tmp1, e, f, g, tmp2);
+        t1.add(tmp1);
+        t1.add(k[j]);
+        t1.add(w[j]);
+        sigma(t2, a, tmp2);
+        maj(tmp1, a, b, c, tmp2);
+        t2.add(tmp1);
+        tmp3 = h;
+        h = g;
+        g = f;
+        f = e;
+        d.add(t1);
+        e = d;
+        d = c;
+        c = b;
+        b = a;
+        tmp3.assign(t1);
+        tmp3.add(t2);
+        a = tmp3;
+      }
+      h0.add(a);
+      h1.add(b);
+      h2.add(c);
+      h3.add(d);
+      h4.add(e);
+      h5.add(f);
+      h6.add(g);
+      h7.add(h);
+    }
+    var result;
+    if (!mode384) {
+      result = new Uint8Array(64);
+      h0.copyTo(result, 0);
+      h1.copyTo(result, 8);
+      h2.copyTo(result, 16);
+      h3.copyTo(result, 24);
+      h4.copyTo(result, 32);
+      h5.copyTo(result, 40);
+      h6.copyTo(result, 48);
+      h7.copyTo(result, 56);
+    } else {
+      result = new Uint8Array(48);
+      h0.copyTo(result, 0);
+      h1.copyTo(result, 8);
+      h2.copyTo(result, 16);
+      h3.copyTo(result, 24);
+      h4.copyTo(result, 32);
+      h5.copyTo(result, 40);
+    }
+    return result;
+  }
+  return hash;
+}();
+var calculateSHA384 = function calculateSHA384Closure() {
+  function hash(data, offset, length) {
+    return calculateSHA512(data, offset, length, true);
+  }
+  return hash;
+}();
+var NullCipher = function NullCipherClosure() {
+  function NullCipher() {}
+  NullCipher.prototype = {
+    decryptBlock: function NullCipher_decryptBlock(data) {
+      return data;
+    }
+  };
+  return NullCipher;
+}();
+
+var AESBaseCipher = function () {
+  function AESBaseCipher() {
+    _classCallCheck(this, AESBaseCipher);
+
+    if (this.constructor === AESBaseCipher) {
+      (0, _util.unreachable)('Cannot initialize AESBaseCipher.');
+    }
+    this._s = new Uint8Array([0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16]);
+    this._inv_s = new Uint8Array([0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d]);
+    this._mix = new Uint32Array([0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927, 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45, 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb, 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381, 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf, 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66, 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28, 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012, 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec, 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e, 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd, 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7, 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89, 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b, 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815, 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f, 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa, 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8, 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36, 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c, 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742, 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea, 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4, 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e, 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360, 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502, 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87, 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd, 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3, 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621, 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f, 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55, 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26, 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844, 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba, 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480, 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce, 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67, 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929, 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713, 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed, 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f, 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3]);
+    this._mixCol = new Uint8Array(256);
+    for (var i = 0; i < 256; i++) {
+      if (i < 128) {
+        this._mixCol[i] = i << 1;
+      } else {
+        this._mixCol[i] = i << 1 ^ 0x1b;
+      }
+    }
+    this.buffer = new Uint8Array(16);
+    this.bufferPosition = 0;
+  }
+
+  _createClass(AESBaseCipher, [{
+    key: '_expandKey',
+    value: function _expandKey(cipherKey) {
+      (0, _util.unreachable)('Cannot call `_expandKey` on the index class');
+    }
+  }, {
+    key: '_decrypt',
+    value: function _decrypt(input, key) {
+      var t = void 0,
+          u = void 0,
+          v = void 0;
+      var state = new Uint8Array(16);
+      state.set(input);
+      for (var j = 0, k = this._keySize; j < 16; ++j, ++k) {
+        state[j] ^= key[k];
+      }
+      for (var i = this._cyclesOfRepetition - 1; i >= 1; --i) {
+        t = state[13];
+        state[13] = state[9];
+        state[9] = state[5];
+        state[5] = state[1];
+        state[1] = t;
+        t = state[14];
+        u = state[10];
+        state[14] = state[6];
+        state[10] = state[2];
+        state[6] = t;
+        state[2] = u;
+        t = state[15];
+        u = state[11];
+        v = state[7];
+        state[15] = state[3];
+        state[11] = t;
+        state[7] = u;
+        state[3] = v;
+        for (var _j = 0; _j < 16; ++_j) {
+          state[_j] = this._inv_s[state[_j]];
+        }
+        for (var _j2 = 0, _k = i * 16; _j2 < 16; ++_j2, ++_k) {
+          state[_j2] ^= key[_k];
+        }
+        for (var _j3 = 0; _j3 < 16; _j3 += 4) {
+          var s0 = this._mix[state[_j3]];
+          var s1 = this._mix[state[_j3 + 1]];
+          var s2 = this._mix[state[_j3 + 2]];
+          var s3 = this._mix[state[_j3 + 3]];
+          t = s0 ^ s1 >>> 8 ^ s1 << 24 ^ s2 >>> 16 ^ s2 << 16 ^ s3 >>> 24 ^ s3 << 8;
+          state[_j3] = t >>> 24 & 0xFF;
+          state[_j3 + 1] = t >> 16 & 0xFF;
+          state[_j3 + 2] = t >> 8 & 0xFF;
+          state[_j3 + 3] = t & 0xFF;
+        }
+      }
+      t = state[13];
+      state[13] = state[9];
+      state[9] = state[5];
+      state[5] = state[1];
+      state[1] = t;
+      t = state[14];
+      u = state[10];
+      state[14] = state[6];
+      state[10] = state[2];
+      state[6] = t;
+      state[2] = u;
+      t = state[15];
+      u = state[11];
+      v = state[7];
+      state[15] = state[3];
+      state[11] = t;
+      state[7] = u;
+      state[3] = v;
+      for (var _j4 = 0; _j4 < 16; ++_j4) {
+        state[_j4] = this._inv_s[state[_j4]];
+        state[_j4] ^= key[_j4];
+      }
+      return state;
+    }
+  }, {
+    key: '_encrypt',
+    value: function _encrypt(input, key) {
+      var s = this._s;
+      var t = void 0,
+          u = void 0,
+          v = void 0;
+      var state = new Uint8Array(16);
+      state.set(input);
+      for (var j = 0; j < 16; ++j) {
+        state[j] ^= key[j];
+      }
+      for (var i = 1; i < this._cyclesOfRepetition; i++) {
+        for (var _j5 = 0; _j5 < 16; ++_j5) {
+          state[_j5] = s[state[_j5]];
+        }
+        v = state[1];
+        state[1] = state[5];
+        state[5] = state[9];
+        state[9] = state[13];
+        state[13] = v;
+        v = state[2];
+        u = state[6];
+        state[2] = state[10];
+        state[6] = state[14];
+        state[10] = v;
+        state[14] = u;
+        v = state[3];
+        u = state[7];
+        t = state[11];
+        state[3] = state[15];
+        state[7] = v;
+        state[11] = u;
+        state[15] = t;
+        for (var _j6 = 0; _j6 < 16; _j6 += 4) {
+          var s0 = state[_j6 + 0];
+          var s1 = state[_j6 + 1];
+          var s2 = state[_j6 + 2];
+          var s3 = state[_j6 + 3];
+          t = s0 ^ s1 ^ s2 ^ s3;
+          state[_j6 + 0] ^= t ^ this._mixCol[s0 ^ s1];
+          state[_j6 + 1] ^= t ^ this._mixCol[s1 ^ s2];
+          state[_j6 + 2] ^= t ^ this._mixCol[s2 ^ s3];
+          state[_j6 + 3] ^= t ^ this._mixCol[s3 ^ s0];
+        }
+        for (var _j7 = 0, k = i * 16; _j7 < 16; ++_j7, ++k) {
+          state[_j7] ^= key[k];
+        }
+      }
+      for (var _j8 = 0; _j8 < 16; ++_j8) {
+        state[_j8] = s[state[_j8]];
+      }
+      v = state[1];
+      state[1] = state[5];
+      state[5] = state[9];
+      state[9] = state[13];
+      state[13] = v;
+      v = state[2];
+      u = state[6];
+      state[2] = state[10];
+      state[6] = state[14];
+      state[10] = v;
+      state[14] = u;
+      v = state[3];
+      u = state[7];
+      t = state[11];
+      state[3] = state[15];
+      state[7] = v;
+      state[11] = u;
+      state[15] = t;
+      for (var _j9 = 0, _k2 = this._keySize; _j9 < 16; ++_j9, ++_k2) {
+        state[_j9] ^= key[_k2];
+      }
+      return state;
+    }
+  }, {
+    key: '_decryptBlock2',
+    value: function _decryptBlock2(data, finalize) {
+      var sourceLength = data.length;
+      var buffer = this.buffer,
+          bufferLength = this.bufferPosition;
+      var result = [],
+          iv = this.iv;
+      for (var i = 0; i < sourceLength; ++i) {
+        buffer[bufferLength] = data[i];
+        ++bufferLength;
+        if (bufferLength < 16) {
+          continue;
+        }
+        var plain = this._decrypt(buffer, this._key);
+        for (var j = 0; j < 16; ++j) {
+          plain[j] ^= iv[j];
+        }
+        iv = buffer;
+        result.push(plain);
+        buffer = new Uint8Array(16);
+        bufferLength = 0;
+      }
+      this.buffer = buffer;
+      this.bufferLength = bufferLength;
+      this.iv = iv;
+      if (result.length === 0) {
+        return new Uint8Array(0);
+      }
+      var outputLength = 16 * result.length;
+      if (finalize) {
+        var lastBlock = result[result.length - 1];
+        var psLen = lastBlock[15];
+        if (psLen <= 16) {
+          for (var _i = 15, ii = 16 - psLen; _i >= ii; --_i) {
+            if (lastBlock[_i] !== psLen) {
+              psLen = 0;
+              break;
+            }
+          }
+          outputLength -= psLen;
+          result[result.length - 1] = lastBlock.subarray(0, 16 - psLen);
+        }
+      }
+      var output = new Uint8Array(outputLength);
+      for (var _i2 = 0, _j10 = 0, _ii = result.length; _i2 < _ii; ++_i2, _j10 += 16) {
+        output.set(result[_i2], _j10);
+      }
+      return output;
+    }
+  }, {
+    key: 'decryptBlock',
+    value: function decryptBlock(data, finalize) {
+      var iv = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
+
+      var sourceLength = data.length;
+      var buffer = this.buffer,
+          bufferLength = this.bufferPosition;
+      if (iv) {
+        this.iv = iv;
+      } else {
+        for (var i = 0; bufferLength < 16 && i < sourceLength; ++i, ++bufferLength) {
+          buffer[bufferLength] = data[i];
+        }
+        if (bufferLength < 16) {
+          this.bufferLength = bufferLength;
+          return new Uint8Array(0);
+        }
+        this.iv = buffer;
+        data = data.subarray(16);
+      }
+      this.buffer = new Uint8Array(16);
+      this.bufferLength = 0;
+      this.decryptBlock = this._decryptBlock2;
+      return this.decryptBlock(data, finalize);
+    }
+  }, {
+    key: 'encrypt',
+    value: function encrypt(data, iv) {
+      var sourceLength = data.length;
+      var buffer = this.buffer,
+          bufferLength = this.bufferPosition;
+      var result = [];
+      if (!iv) {
+        iv = new Uint8Array(16);
+      }
+      for (var i = 0; i < sourceLength; ++i) {
+        buffer[bufferLength] = data[i];
+        ++bufferLength;
+        if (bufferLength < 16) {
+          continue;
+        }
+        for (var j = 0; j < 16; ++j) {
+          buffer[j] ^= iv[j];
+        }
+        var cipher = this._encrypt(buffer, this._key);
+        iv = cipher;
+        result.push(cipher);
+        buffer = new Uint8Array(16);
+        bufferLength = 0;
+      }
+      this.buffer = buffer;
+      this.bufferLength = bufferLength;
+      this.iv = iv;
+      if (result.length === 0) {
+        return new Uint8Array(0);
+      }
+      var outputLength = 16 * result.length;
+      var output = new Uint8Array(outputLength);
+      for (var _i3 = 0, _j11 = 0, ii = result.length; _i3 < ii; ++_i3, _j11 += 16) {
+        output.set(result[_i3], _j11);
+      }
+      return output;
+    }
+  }]);
+
+  return AESBaseCipher;
+}();
+
+var AES128Cipher = function (_AESBaseCipher) {
+  _inherits(AES128Cipher, _AESBaseCipher);
+
+  function AES128Cipher(key) {
+    _classCallCheck(this, AES128Cipher);
+
+    var _this = _possibleConstructorReturn(this, (AES128Cipher.__proto__ || Object.getPrototypeOf(AES128Cipher)).call(this));
+
+    _this._cyclesOfRepetition = 10;
+    _this._keySize = 160;
+    _this._rcon = new Uint8Array([0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d]);
+    _this._key = _this._expandKey(key);
+    return _this;
+  }
+
+  _createClass(AES128Cipher, [{
+    key: '_expandKey',
+    value: function _expandKey(cipherKey) {
+      var b = 176;
+      var s = this._s;
+      var rcon = this._rcon;
+      var result = new Uint8Array(b);
+      result.set(cipherKey);
+      for (var j = 16, i = 1; j < b; ++i) {
+        var t1 = result[j - 3];
+        var t2 = result[j - 2];
+        var t3 = result[j - 1];
+        var t4 = result[j - 4];
+        t1 = s[t1];
+        t2 = s[t2];
+        t3 = s[t3];
+        t4 = s[t4];
+        t1 = t1 ^ rcon[i];
+        for (var n = 0; n < 4; ++n) {
+          result[j] = t1 ^= result[j - 16];
+          j++;
+          result[j] = t2 ^= result[j - 16];
+          j++;
+          result[j] = t3 ^= result[j - 16];
+          j++;
+          result[j] = t4 ^= result[j - 16];
+          j++;
+        }
+      }
+      return result;
+    }
+  }]);
+
+  return AES128Cipher;
+}(AESBaseCipher);
+
+var AES256Cipher = function (_AESBaseCipher2) {
+  _inherits(AES256Cipher, _AESBaseCipher2);
+
+  function AES256Cipher(key) {
+    _classCallCheck(this, AES256Cipher);
+
+    var _this2 = _possibleConstructorReturn(this, (AES256Cipher.__proto__ || Object.getPrototypeOf(AES256Cipher)).call(this));
+
+    _this2._cyclesOfRepetition = 14;
+    _this2._keySize = 224;
+    _this2._key = _this2._expandKey(key);
+    return _this2;
+  }
+
+  _createClass(AES256Cipher, [{
+    key: '_expandKey',
+    value: function _expandKey(cipherKey) {
+      var b = 240;
+      var s = this._s;
+      var result = new Uint8Array(b);
+      result.set(cipherKey);
+      var r = 1;
+      var t1 = void 0,
+          t2 = void 0,
+          t3 = void 0,
+          t4 = void 0;
+      for (var j = 32, i = 1; j < b; ++i) {
+        if (j % 32 === 16) {
+          t1 = s[t1];
+          t2 = s[t2];
+          t3 = s[t3];
+          t4 = s[t4];
+        } else if (j % 32 === 0) {
+          t1 = result[j - 3];
+          t2 = result[j - 2];
+          t3 = result[j - 1];
+          t4 = result[j - 4];
+          t1 = s[t1];
+          t2 = s[t2];
+          t3 = s[t3];
+          t4 = s[t4];
+          t1 = t1 ^ r;
+          if ((r <<= 1) >= 256) {
+            r = (r ^ 0x1b) & 0xFF;
+          }
+        }
+        for (var n = 0; n < 4; ++n) {
+          result[j] = t1 ^= result[j - 32];
+          j++;
+          result[j] = t2 ^= result[j - 32];
+          j++;
+          result[j] = t3 ^= result[j - 32];
+          j++;
+          result[j] = t4 ^= result[j - 32];
+          j++;
+        }
+      }
+      return result;
+    }
+  }]);
+
+  return AES256Cipher;
+}(AESBaseCipher);
+
+var PDF17 = function PDF17Closure() {
+  function compareByteArrays(array1, array2) {
+    if (array1.length !== array2.length) {
+      return false;
+    }
+    for (var i = 0; i < array1.length; i++) {
+      if (array1[i] !== array2[i]) {
+        return false;
+      }
+    }
+    return true;
+  }
+  function PDF17() {}
+  PDF17.prototype = {
+    checkOwnerPassword: function PDF17_checkOwnerPassword(password, ownerValidationSalt, userBytes, ownerPassword) {
+      var hashData = new Uint8Array(password.length + 56);
+      hashData.set(password, 0);
+      hashData.set(ownerValidationSalt, password.length);
+      hashData.set(userBytes, password.length + ownerValidationSalt.length);
+      var result = calculateSHA256(hashData, 0, hashData.length);
+      return compareByteArrays(result, ownerPassword);
+    },
+    checkUserPassword: function PDF17_checkUserPassword(password, userValidationSalt, userPassword) {
+      var hashData = new Uint8Array(password.length + 8);
+      hashData.set(password, 0);
+      hashData.set(userValidationSalt, password.length);
+      var result = calculateSHA256(hashData, 0, hashData.length);
+      return compareByteArrays(result, userPassword);
+    },
+    getOwnerKey: function PDF17_getOwnerKey(password, ownerKeySalt, userBytes, ownerEncryption) {
+      var hashData = new Uint8Array(password.length + 56);
+      hashData.set(password, 0);
+      hashData.set(ownerKeySalt, password.length);
+      hashData.set(userBytes, password.length + ownerKeySalt.length);
+      var key = calculateSHA256(hashData, 0, hashData.length);
+      var cipher = new AES256Cipher(key);
+      return cipher.decryptBlock(ownerEncryption, false, new Uint8Array(16));
+    },
+    getUserKey: function PDF17_getUserKey(password, userKeySalt, userEncryption) {
+      var hashData = new Uint8Array(password.length + 8);
+      hashData.set(password, 0);
+      hashData.set(userKeySalt, password.length);
+      var key = calculateSHA256(hashData, 0, hashData.length);
+      var cipher = new AES256Cipher(key);
+      return cipher.decryptBlock(userEncryption, false, new Uint8Array(16));
+    }
+  };
+  return PDF17;
+}();
+var PDF20 = function PDF20Closure() {
+  function concatArrays(array1, array2) {
+    var t = new Uint8Array(array1.length + array2.length);
+    t.set(array1, 0);
+    t.set(array2, array1.length);
+    return t;
+  }
+  function calculatePDF20Hash(password, input, userBytes) {
+    var k = calculateSHA256(input, 0, input.length).subarray(0, 32);
+    var e = [0];
+    var i = 0;
+    while (i < 64 || e[e.length - 1] > i - 32) {
+      var arrayLength = password.length + k.length + userBytes.length;
+      var k1 = new Uint8Array(arrayLength * 64);
+      var array = concatArrays(password, k);
+      array = concatArrays(array, userBytes);
+      for (var j = 0, pos = 0; j < 64; j++, pos += arrayLength) {
+        k1.set(array, pos);
+      }
+      var cipher = new AES128Cipher(k.subarray(0, 16));
+      e = cipher.encrypt(k1, k.subarray(16, 32));
+      var remainder = 0;
+      for (var z = 0; z < 16; z++) {
+        remainder *= 256 % 3;
+        remainder %= 3;
+        remainder += (e[z] >>> 0) % 3;
+        remainder %= 3;
+      }
+      if (remainder === 0) {
+        k = calculateSHA256(e, 0, e.length);
+      } else if (remainder === 1) {
+        k = calculateSHA384(e, 0, e.length);
+      } else if (remainder === 2) {
+        k = calculateSHA512(e, 0, e.length);
+      }
+      i++;
+    }
+    return k.subarray(0, 32);
+  }
+  function PDF20() {}
+  function compareByteArrays(array1, array2) {
+    if (array1.length !== array2.length) {
+      return false;
+    }
+    for (var i = 0; i < array1.length; i++) {
+      if (array1[i] !== array2[i]) {
+        return false;
+      }
+    }
+    return true;
+  }
+  PDF20.prototype = {
+    hash: function PDF20_hash(password, concatBytes, userBytes) {
+      return calculatePDF20Hash(password, concatBytes, userBytes);
+    },
+    checkOwnerPassword: function PDF20_checkOwnerPassword(password, ownerValidationSalt, userBytes, ownerPassword) {
+      var hashData = new Uint8Array(password.length + 56);
+      hashData.set(password, 0);
+      hashData.set(ownerValidationSalt, password.length);
+      hashData.set(userBytes, password.length + ownerValidationSalt.length);
+      var result = calculatePDF20Hash(password, hashData, userBytes);
+      return compareByteArrays(result, ownerPassword);
+    },
+    checkUserPassword: function PDF20_checkUserPassword(password, userValidationSalt, userPassword) {
+      var hashData = new Uint8Array(password.length + 8);
+      hashData.set(password, 0);
+      hashData.set(userValidationSalt, password.length);
+      var result = calculatePDF20Hash(password, hashData, []);
+      return compareByteArrays(result, userPassword);
+    },
+    getOwnerKey: function PDF20_getOwnerKey(password, ownerKeySalt, userBytes, ownerEncryption) {
+      var hashData = new Uint8Array(password.length + 56);
+      hashData.set(password, 0);
+      hashData.set(ownerKeySalt, password.length);
+      hashData.set(userBytes, password.length + ownerKeySalt.length);
+      var key = calculatePDF20Hash(password, hashData, userBytes);
+      var cipher = new AES256Cipher(key);
+      return cipher.decryptBlock(ownerEncryption, false, new Uint8Array(16));
+    },
+    getUserKey: function PDF20_getUserKey(password, userKeySalt, userEncryption) {
+      var hashData = new Uint8Array(password.length + 8);
+      hashData.set(password, 0);
+      hashData.set(userKeySalt, password.length);
+      var key = calculatePDF20Hash(password, hashData, []);
+      var cipher = new AES256Cipher(key);
+      return cipher.decryptBlock(userEncryption, false, new Uint8Array(16));
+    }
+  };
+  return PDF20;
+}();
+var CipherTransform = function CipherTransformClosure() {
+  function CipherTransform(stringCipherConstructor, streamCipherConstructor) {
+    this.StringCipherConstructor = stringCipherConstructor;
+    this.StreamCipherConstructor = streamCipherConstructor;
+  }
+  CipherTransform.prototype = {
+    createStream: function CipherTransform_createStream(stream, length) {
+      var cipher = new this.StreamCipherConstructor();
+      return new _stream.DecryptStream(stream, length, function cipherTransformDecryptStream(data, finalize) {
+        return cipher.decryptBlock(data, finalize);
+      });
+    },
+    decryptString: function CipherTransform_decryptString(s) {
+      var cipher = new this.StringCipherConstructor();
+      var data = (0, _util.stringToBytes)(s);
+      data = cipher.decryptBlock(data, true);
+      return (0, _util.bytesToString)(data);
+    }
+  };
+  return CipherTransform;
+}();
+var CipherTransformFactory = function CipherTransformFactoryClosure() {
+  var defaultPasswordBytes = new Uint8Array([0x28, 0xBF, 0x4E, 0x5E, 0x4E, 0x75, 0x8A, 0x41, 0x64, 0x00, 0x4E, 0x56, 0xFF, 0xFA, 0x01, 0x08, 0x2E, 0x2E, 0x00, 0xB6, 0xD0, 0x68, 0x3E, 0x80, 0x2F, 0x0C, 0xA9, 0xFE, 0x64, 0x53, 0x69, 0x7A]);
+  function createEncryptionKey20(revision, password, ownerPassword, ownerValidationSalt, ownerKeySalt, uBytes, userPassword, userValidationSalt, userKeySalt, ownerEncryption, userEncryption, perms) {
+    if (password) {
+      var passwordLength = Math.min(127, password.length);
+      password = password.subarray(0, passwordLength);
+    } else {
+      password = [];
+    }
+    var pdfAlgorithm;
+    if (revision === 6) {
+      pdfAlgorithm = new PDF20();
+    } else {
+      pdfAlgorithm = new PDF17();
+    }
+    if (pdfAlgorithm.checkUserPassword(password, userValidationSalt, userPassword)) {
+      return pdfAlgorithm.getUserKey(password, userKeySalt, userEncryption);
+    } else if (password.length && pdfAlgorithm.checkOwnerPassword(password, ownerValidationSalt, uBytes, ownerPassword)) {
+      return pdfAlgorithm.getOwnerKey(password, ownerKeySalt, uBytes, ownerEncryption);
+    }
+    return null;
+  }
+  function prepareKeyData(fileId, password, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata) {
+    var hashDataSize = 40 + ownerPassword.length + fileId.length;
+    var hashData = new Uint8Array(hashDataSize),
+        i = 0,
+        j,
+        n;
+    if (password) {
+      n = Math.min(32, password.length);
+      for (; i < n; ++i) {
+        hashData[i] = password[i];
+      }
+    }
+    j = 0;
+    while (i < 32) {
+      hashData[i++] = defaultPasswordBytes[j++];
+    }
+    for (j = 0, n = ownerPassword.length; j < n; ++j) {
+      hashData[i++] = ownerPassword[j];
+    }
+    hashData[i++] = flags & 0xFF;
+    hashData[i++] = flags >> 8 & 0xFF;
+    hashData[i++] = flags >> 16 & 0xFF;
+    hashData[i++] = flags >>> 24 & 0xFF;
+    for (j = 0, n = fileId.length; j < n; ++j) {
+      hashData[i++] = fileId[j];
+    }
+    if (revision >= 4 && !encryptMetadata) {
+      hashData[i++] = 0xFF;
+      hashData[i++] = 0xFF;
+      hashData[i++] = 0xFF;
+      hashData[i++] = 0xFF;
+    }
+    var hash = calculateMD5(hashData, 0, i);
+    var keyLengthInBytes = keyLength >> 3;
+    if (revision >= 3) {
+      for (j = 0; j < 50; ++j) {
+        hash = calculateMD5(hash, 0, keyLengthInBytes);
+      }
+    }
+    var encryptionKey = hash.subarray(0, keyLengthInBytes);
+    var cipher, checkData;
+    if (revision >= 3) {
+      for (i = 0; i < 32; ++i) {
+        hashData[i] = defaultPasswordBytes[i];
+      }
+      for (j = 0, n = fileId.length; j < n; ++j) {
+        hashData[i++] = fileId[j];
+      }
+      cipher = new ARCFourCipher(encryptionKey);
+      checkData = cipher.encryptBlock(calculateMD5(hashData, 0, i));
+      n = encryptionKey.length;
+      var derivedKey = new Uint8Array(n),
+          k;
+      for (j = 1; j <= 19; ++j) {
+        for (k = 0; k < n; ++k) {
+          derivedKey[k] = encryptionKey[k] ^ j;
+        }
+        cipher = new ARCFourCipher(derivedKey);
+        checkData = cipher.encryptBlock(checkData);
+      }
+      for (j = 0, n = checkData.length; j < n; ++j) {
+        if (userPassword[j] !== checkData[j]) {
+          return null;
+        }
+      }
+    } else {
+      cipher = new ARCFourCipher(encryptionKey);
+      checkData = cipher.encryptBlock(defaultPasswordBytes);
+      for (j = 0, n = checkData.length; j < n; ++j) {
+        if (userPassword[j] !== checkData[j]) {
+          return null;
+        }
+      }
+    }
+    return encryptionKey;
+  }
+  function decodeUserPassword(password, ownerPassword, revision, keyLength) {
+    var hashData = new Uint8Array(32),
+        i = 0,
+        j,
+        n;
+    n = Math.min(32, password.length);
+    for (; i < n; ++i) {
+      hashData[i] = password[i];
+    }
+    j = 0;
+    while (i < 32) {
+      hashData[i++] = defaultPasswordBytes[j++];
+    }
+    var hash = calculateMD5(hashData, 0, i);
+    var keyLengthInBytes = keyLength >> 3;
+    if (revision >= 3) {
+      for (j = 0; j < 50; ++j) {
+        hash = calculateMD5(hash, 0, hash.length);
+      }
+    }
+    var cipher, userPassword;
+    if (revision >= 3) {
+      userPassword = ownerPassword;
+      var derivedKey = new Uint8Array(keyLengthInBytes),
+          k;
+      for (j = 19; j >= 0; j--) {
+        for (k = 0; k < keyLengthInBytes; ++k) {
+          derivedKey[k] = hash[k] ^ j;
+        }
+        cipher = new ARCFourCipher(derivedKey);
+        userPassword = cipher.encryptBlock(userPassword);
+      }
+    } else {
+      cipher = new ARCFourCipher(hash.subarray(0, keyLengthInBytes));
+      userPassword = cipher.encryptBlock(ownerPassword);
+    }
+    return userPassword;
+  }
+  var identityName = _primitives.Name.get('Identity');
+  function CipherTransformFactory(dict, fileId, password) {
+    var filter = dict.get('Filter');
+    if (!(0, _primitives.isName)(filter, 'Standard')) {
+      throw new _util.FormatError('unknown encryption method');
+    }
+    this.dict = dict;
+    var algorithm = dict.get('V');
+    if (!Number.isInteger(algorithm) || algorithm !== 1 && algorithm !== 2 && algorithm !== 4 && algorithm !== 5) {
+      throw new _util.FormatError('unsupported encryption algorithm');
+    }
+    this.algorithm = algorithm;
+    var keyLength = dict.get('Length');
+    if (!keyLength) {
+      if (algorithm <= 3) {
+        keyLength = 40;
+      } else {
+        var cfDict = dict.get('CF');
+        var streamCryptoName = dict.get('StmF');
+        if ((0, _primitives.isDict)(cfDict) && (0, _primitives.isName)(streamCryptoName)) {
+          cfDict.suppressEncryption = true;
+          var handlerDict = cfDict.get(streamCryptoName.name);
+          keyLength = handlerDict && handlerDict.get('Length') || 128;
+          if (keyLength < 40) {
+            keyLength <<= 3;
+          }
+        }
+      }
+    }
+    if (!Number.isInteger(keyLength) || keyLength < 40 || keyLength % 8 !== 0) {
+      throw new _util.FormatError('invalid key length');
+    }
+    var ownerPassword = (0, _util.stringToBytes)(dict.get('O')).subarray(0, 32);
+    var userPassword = (0, _util.stringToBytes)(dict.get('U')).subarray(0, 32);
+    var flags = dict.get('P');
+    var revision = dict.get('R');
+    var encryptMetadata = (algorithm === 4 || algorithm === 5) && dict.get('EncryptMetadata') !== false;
+    this.encryptMetadata = encryptMetadata;
+    var fileIdBytes = (0, _util.stringToBytes)(fileId);
+    var passwordBytes;
+    if (password) {
+      if (revision === 6) {
+        try {
+          password = (0, _util.utf8StringToString)(password);
+        } catch (ex) {
+          (0, _util.warn)('CipherTransformFactory: ' + 'Unable to convert UTF8 encoded password.');
+        }
+      }
+      passwordBytes = (0, _util.stringToBytes)(password);
+    }
+    var encryptionKey;
+    if (algorithm !== 5) {
+      encryptionKey = prepareKeyData(fileIdBytes, passwordBytes, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata);
+    } else {
+      var ownerValidationSalt = (0, _util.stringToBytes)(dict.get('O')).subarray(32, 40);
+      var ownerKeySalt = (0, _util.stringToBytes)(dict.get('O')).subarray(40, 48);
+      var uBytes = (0, _util.stringToBytes)(dict.get('U')).subarray(0, 48);
+      var userValidationSalt = (0, _util.stringToBytes)(dict.get('U')).subarray(32, 40);
+      var userKeySalt = (0, _util.stringToBytes)(dict.get('U')).subarray(40, 48);
+      var ownerEncryption = (0, _util.stringToBytes)(dict.get('OE'));
+      var userEncryption = (0, _util.stringToBytes)(dict.get('UE'));
+      var perms = (0, _util.stringToBytes)(dict.get('Perms'));
+      encryptionKey = createEncryptionKey20(revision, passwordBytes, ownerPassword, ownerValidationSalt, ownerKeySalt, uBytes, userPassword, userValidationSalt, userKeySalt, ownerEncryption, userEncryption, perms);
+    }
+    if (!encryptionKey && !password) {
+      throw new _util.PasswordException('No password given', _util.PasswordResponses.NEED_PASSWORD);
+    } else if (!encryptionKey && password) {
+      var decodedPassword = decodeUserPassword(passwordBytes, ownerPassword, revision, keyLength);
+      encryptionKey = prepareKeyData(fileIdBytes, decodedPassword, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata);
+    }
+    if (!encryptionKey) {
+      throw new _util.PasswordException('Incorrect Password', _util.PasswordResponses.INCORRECT_PASSWORD);
+    }
+    this.encryptionKey = encryptionKey;
+    if (algorithm >= 4) {
+      var cf = dict.get('CF');
+      if ((0, _primitives.isDict)(cf)) {
+        cf.suppressEncryption = true;
+      }
+      this.cf = cf;
+      this.stmf = dict.get('StmF') || identityName;
+      this.strf = dict.get('StrF') || identityName;
+      this.eff = dict.get('EFF') || this.stmf;
+    }
+  }
+  function buildObjectKey(num, gen, encryptionKey, isAes) {
+    var key = new Uint8Array(encryptionKey.length + 9),
+        i,
+        n;
+    for (i = 0, n = encryptionKey.length; i < n; ++i) {
+      key[i] = encryptionKey[i];
+    }
+    key[i++] = num & 0xFF;
+    key[i++] = num >> 8 & 0xFF;
+    key[i++] = num >> 16 & 0xFF;
+    key[i++] = gen & 0xFF;
+    key[i++] = gen >> 8 & 0xFF;
+    if (isAes) {
+      key[i++] = 0x73;
+      key[i++] = 0x41;
+      key[i++] = 0x6C;
+      key[i++] = 0x54;
+    }
+    var hash = calculateMD5(key, 0, i);
+    return hash.subarray(0, Math.min(encryptionKey.length + 5, 16));
+  }
+  function buildCipherConstructor(cf, name, num, gen, key) {
+    if (!(0, _primitives.isName)(name)) {
+      throw new _util.FormatError('Invalid crypt filter name.');
+    }
+    var cryptFilter = cf.get(name.name);
+    var cfm;
+    if (cryptFilter !== null && cryptFilter !== undefined) {
+      cfm = cryptFilter.get('CFM');
+    }
+    if (!cfm || cfm.name === 'None') {
+      return function cipherTransformFactoryBuildCipherConstructorNone() {
+        return new NullCipher();
+      };
+    }
+    if (cfm.name === 'V2') {
+      return function cipherTransformFactoryBuildCipherConstructorV2() {
+        return new ARCFourCipher(buildObjectKey(num, gen, key, false));
+      };
+    }
+    if (cfm.name === 'AESV2') {
+      return function cipherTransformFactoryBuildCipherConstructorAESV2() {
+        return new AES128Cipher(buildObjectKey(num, gen, key, true));
+      };
+    }
+    if (cfm.name === 'AESV3') {
+      return function cipherTransformFactoryBuildCipherConstructorAESV3() {
+        return new AES256Cipher(key);
+      };
+    }
+    throw new _util.FormatError('Unknown crypto method');
+  }
+  CipherTransformFactory.prototype = {
+    createCipherTransform: function CipherTransformFactory_createCipherTransform(num, gen) {
+      if (this.algorithm === 4 || this.algorithm === 5) {
+        return new CipherTransform(buildCipherConstructor(this.cf, this.stmf, num, gen, this.encryptionKey), buildCipherConstructor(this.cf, this.strf, num, gen, this.encryptionKey));
+      }
+      var key = buildObjectKey(num, gen, this.encryptionKey, false);
+      var cipherConstructor = function buildCipherCipherConstructor() {
+        return new ARCFourCipher(key);
+      };
+      return new CipherTransform(cipherConstructor, cipherConstructor);
+    }
+  };
+  return CipherTransformFactory;
+}();
+exports.AES128Cipher = AES128Cipher;
+exports.AES256Cipher = AES256Cipher;
+exports.ARCFourCipher = ARCFourCipher;
+exports.CipherTransformFactory = CipherTransformFactory;
+exports.PDF17 = PDF17;
+exports.PDF20 = PDF20;
+exports.calculateMD5 = calculateMD5;
+exports.calculateSHA256 = calculateSHA256;
+exports.calculateSHA384 = calculateSHA384;
+exports.calculateSHA512 = calculateSHA512;
+
+/***/ }),
+/* 151 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.ColorSpace = undefined;
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _util = __w_pdfjs_require__(2);
+
+var _primitives = __w_pdfjs_require__(138);
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function resizeRgbImage(src, dest, w1, h1, w2, h2, alpha01) {
+  var COMPONENTS = 3;
+  alpha01 = alpha01 !== 1 ? 0 : alpha01;
+  var xRatio = w1 / w2;
+  var yRatio = h1 / h2;
+  var newIndex = 0,
+      oldIndex = void 0;
+  var xScaled = new Uint16Array(w2);
+  var w1Scanline = w1 * COMPONENTS;
+  for (var i = 0; i < w2; i++) {
+    xScaled[i] = Math.floor(i * xRatio) * COMPONENTS;
+  }
+  for (var _i = 0; _i < h2; _i++) {
+    var py = Math.floor(_i * yRatio) * w1Scanline;
+    for (var j = 0; j < w2; j++) {
+      oldIndex = py + xScaled[j];
+      dest[newIndex++] = src[oldIndex++];
+      dest[newIndex++] = src[oldIndex++];
+      dest[newIndex++] = src[oldIndex++];
+      newIndex += alpha01;
+    }
+  }
+}
+
+var ColorSpace = function () {
+  function ColorSpace(name, numComps) {
+    _classCallCheck(this, ColorSpace);
+
+    if (this.constructor === ColorSpace) {
+      (0, _util.unreachable)('Cannot initialize ColorSpace.');
+    }
+    this.name = name;
+    this.numComps = numComps;
+  }
+
+  _createClass(ColorSpace, [{
+    key: 'getRgb',
+    value: function getRgb(src, srcOffset) {
+      var rgb = new Uint8ClampedArray(3);
+      this.getRgbItem(src, srcOffset, rgb, 0);
+      return rgb;
+    }
+  }, {
+    key: 'getRgbItem',
+    value: function getRgbItem(src, srcOffset, dest, destOffset) {
+      (0, _util.unreachable)('Should not call ColorSpace.getRgbItem');
+    }
+  }, {
+    key: 'getRgbBuffer',
+    value: function getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
+      (0, _util.unreachable)('Should not call ColorSpace.getRgbBuffer');
+    }
+  }, {
+    key: 'getOutputLength',
+    value: function getOutputLength(inputLength, alpha01) {
+      (0, _util.unreachable)('Should not call ColorSpace.getOutputLength');
+    }
+  }, {
+    key: 'isPassthrough',
+    value: function isPassthrough(bits) {
+      return false;
+    }
+  }, {
+    key: 'fillRgb',
+    value: function fillRgb(dest, originalWidth, originalHeight, width, height, actualHeight, bpc, comps, alpha01) {
+      var count = originalWidth * originalHeight;
+      var rgbBuf = null;
+      var numComponentColors = 1 << bpc;
+      var needsResizing = originalHeight !== height || originalWidth !== width;
+      if (this.isPassthrough(bpc)) {
+        rgbBuf = comps;
+      } else if (this.numComps === 1 && count > numComponentColors && this.name !== 'DeviceGray' && this.name !== 'DeviceRGB') {
+        var allColors = bpc <= 8 ? new Uint8Array(numComponentColors) : new Uint16Array(numComponentColors);
+        for (var i = 0; i < numComponentColors; i++) {
+          allColors[i] = i;
+        }
+        var colorMap = new Uint8ClampedArray(numComponentColors * 3);
+        this.getRgbBuffer(allColors, 0, numComponentColors, colorMap, 0, bpc, 0);
+        if (!needsResizing) {
+          var destPos = 0;
+          for (var _i2 = 0; _i2 < count; ++_i2) {
+            var key = comps[_i2] * 3;
+            dest[destPos++] = colorMap[key];
+            dest[destPos++] = colorMap[key + 1];
+            dest[destPos++] = colorMap[key + 2];
+            destPos += alpha01;
+          }
+        } else {
+          rgbBuf = new Uint8Array(count * 3);
+          var rgbPos = 0;
+          for (var _i3 = 0; _i3 < count; ++_i3) {
+            var _key = comps[_i3] * 3;
+            rgbBuf[rgbPos++] = colorMap[_key];
+            rgbBuf[rgbPos++] = colorMap[_key + 1];
+            rgbBuf[rgbPos++] = colorMap[_key + 2];
+          }
+        }
+      } else {
+        if (!needsResizing) {
+          this.getRgbBuffer(comps, 0, width * actualHeight, dest, 0, bpc, alpha01);
+        } else {
+          rgbBuf = new Uint8ClampedArray(count * 3);
+          this.getRgbBuffer(comps, 0, count, rgbBuf, 0, bpc, 0);
+        }
+      }
+      if (rgbBuf) {
+        if (needsResizing) {
+          resizeRgbImage(rgbBuf, dest, originalWidth, originalHeight, width, height, alpha01);
+        } else {
+          var _destPos = 0,
+              _rgbPos = 0;
+          for (var _i4 = 0, ii = width * actualHeight; _i4 < ii; _i4++) {
+            dest[_destPos++] = rgbBuf[_rgbPos++];
+            dest[_destPos++] = rgbBuf[_rgbPos++];
+            dest[_destPos++] = rgbBuf[_rgbPos++];
+            _destPos += alpha01;
+          }
+        }
+      }
+    }
+  }, {
+    key: 'usesZeroToOneRange',
+    get: function get() {
+      return (0, _util.shadow)(this, 'usesZeroToOneRange', true);
+    }
+  }], [{
+    key: 'parse',
+    value: function parse(cs, xref, res, pdfFunctionFactory) {
+      var IR = this.parseToIR(cs, xref, res, pdfFunctionFactory);
+      return this.fromIR(IR);
+    }
+  }, {
+    key: 'fromIR',
+    value: function fromIR(IR) {
+      var name = Array.isArray(IR) ? IR[0] : IR;
+      var whitePoint = void 0,
+          blackPoint = void 0,
+          gamma = void 0;
+      switch (name) {
+        case 'DeviceGrayCS':
+          return this.singletons.gray;
+        case 'DeviceRgbCS':
+          return this.singletons.rgb;
+        case 'DeviceCmykCS':
+          return this.singletons.cmyk;
+        case 'CalGrayCS':
+          whitePoint = IR[1];
+          blackPoint = IR[2];
+          gamma = IR[3];
+          return new CalGrayCS(whitePoint, blackPoint, gamma);
+        case 'CalRGBCS':
+          whitePoint = IR[1];
+          blackPoint = IR[2];
+          gamma = IR[3];
+          var matrix = IR[4];
+          return new CalRGBCS(whitePoint, blackPoint, gamma, matrix);
+        case 'PatternCS':
+          var basePatternCS = IR[1];
+          if (basePatternCS) {
+            basePatternCS = this.fromIR(basePatternCS);
+          }
+          return new PatternCS(basePatternCS);
+        case 'IndexedCS':
+          var baseIndexedCS = IR[1];
+          var hiVal = IR[2];
+          var lookup = IR[3];
+          return new IndexedCS(this.fromIR(baseIndexedCS), hiVal, lookup);
+        case 'AlternateCS':
+          var numComps = IR[1];
+          var alt = IR[2];
+          var tintFn = IR[3];
+          return new AlternateCS(numComps, this.fromIR(alt), tintFn);
+        case 'LabCS':
+          whitePoint = IR[1];
+          blackPoint = IR[2];
+          var range = IR[3];
+          return new LabCS(whitePoint, blackPoint, range);
+        default:
+          throw new _util.FormatError('Unknown colorspace name: ' + name);
+      }
+    }
+  }, {
+    key: 'parseToIR',
+    value: function parseToIR(cs, xref) {
+      var res = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
+      var pdfFunctionFactory = arguments[3];
+
+      cs = xref.fetchIfRef(cs);
+      if ((0, _primitives.isName)(cs)) {
+        switch (cs.name) {
+          case 'DeviceGray':
+          case 'G':
+            return 'DeviceGrayCS';
+          case 'DeviceRGB':
+          case 'RGB':
+            return 'DeviceRgbCS';
+          case 'DeviceCMYK':
+          case 'CMYK':
+            return 'DeviceCmykCS';
+          case 'Pattern':
+            return ['PatternCS', null];
+          default:
+            if ((0, _primitives.isDict)(res)) {
+              var colorSpaces = res.get('ColorSpace');
+              if ((0, _primitives.isDict)(colorSpaces)) {
+                var resCS = colorSpaces.get(cs.name);
+                if (resCS) {
+                  if ((0, _primitives.isName)(resCS)) {
+                    return this.parseToIR(resCS, xref, res, pdfFunctionFactory);
+                  }
+                  cs = resCS;
+                  break;
+                }
+              }
+            }
+            throw new _util.FormatError('unrecognized colorspace ' + cs.name);
+        }
+      }
+      if (Array.isArray(cs)) {
+        var mode = xref.fetchIfRef(cs[0]).name;
+        var numComps = void 0,
+            params = void 0,
+            alt = void 0,
+            whitePoint = void 0,
+            blackPoint = void 0,
+            gamma = void 0;
+        switch (mode) {
+          case 'DeviceGray':
+          case 'G':
+            return 'DeviceGrayCS';
+          case 'DeviceRGB':
+          case 'RGB':
+            return 'DeviceRgbCS';
+          case 'DeviceCMYK':
+          case 'CMYK':
+            return 'DeviceCmykCS';
+          case 'CalGray':
+            params = xref.fetchIfRef(cs[1]);
+            whitePoint = params.getArray('WhitePoint');
+            blackPoint = params.getArray('BlackPoint');
+            gamma = params.get('Gamma');
+            return ['CalGrayCS', whitePoint, blackPoint, gamma];
+          case 'CalRGB':
+            params = xref.fetchIfRef(cs[1]);
+            whitePoint = params.getArray('WhitePoint');
+            blackPoint = params.getArray('BlackPoint');
+            gamma = params.getArray('Gamma');
+            var matrix = params.getArray('Matrix');
+            return ['CalRGBCS', whitePoint, blackPoint, gamma, matrix];
+          case 'ICCBased':
+            var stream = xref.fetchIfRef(cs[1]);
+            var dict = stream.dict;
+            numComps = dict.get('N');
+            alt = dict.get('Alternate');
+            if (alt) {
+              var altIR = this.parseToIR(alt, xref, res, pdfFunctionFactory);
+              var altCS = this.fromIR(altIR, pdfFunctionFactory);
+              if (altCS.numComps === numComps) {
+                return altIR;
+              }
+              (0, _util.warn)('ICCBased color space: Ignoring incorrect /Alternate entry.');
+            }
+            if (numComps === 1) {
+              return 'DeviceGrayCS';
+            } else if (numComps === 3) {
+              return 'DeviceRgbCS';
+            } else if (numComps === 4) {
+              return 'DeviceCmykCS';
+            }
+            break;
+          case 'Pattern':
+            var basePatternCS = cs[1] || null;
+            if (basePatternCS) {
+              basePatternCS = this.parseToIR(basePatternCS, xref, res, pdfFunctionFactory);
+            }
+            return ['PatternCS', basePatternCS];
+          case 'Indexed':
+          case 'I':
+            var baseIndexedCS = this.parseToIR(cs[1], xref, res, pdfFunctionFactory);
+            var hiVal = xref.fetchIfRef(cs[2]) + 1;
+            var lookup = xref.fetchIfRef(cs[3]);
+            if ((0, _primitives.isStream)(lookup)) {
+              lookup = lookup.getBytes();
+            }
+            return ['IndexedCS', baseIndexedCS, hiVal, lookup];
+          case 'Separation':
+          case 'DeviceN':
+            var name = xref.fetchIfRef(cs[1]);
+            numComps = Array.isArray(name) ? name.length : 1;
+            alt = this.parseToIR(cs[2], xref, res, pdfFunctionFactory);
+            var tintFn = pdfFunctionFactory.create(xref.fetchIfRef(cs[3]));
+            return ['AlternateCS', numComps, alt, tintFn];
+          case 'Lab':
+            params = xref.fetchIfRef(cs[1]);
+            whitePoint = params.getArray('WhitePoint');
+            blackPoint = params.getArray('BlackPoint');
+            var range = params.getArray('Range');
+            return ['LabCS', whitePoint, blackPoint, range];
+          default:
+            throw new _util.FormatError('unimplemented color space object "' + mode + '"');
+        }
+      }
+      throw new _util.FormatError('unrecognized color space object: "' + cs + '"');
+    }
+  }, {
+    key: 'isDefaultDecode',
+    value: function isDefaultDecode(decode, n) {
+      if (!Array.isArray(decode)) {
+        return true;
+      }
+      if (n * 2 !== decode.length) {
+        (0, _util.warn)('The decode map is not the correct length');
+        return true;
+      }
+      for (var i = 0, ii = decode.length; i < ii; i += 2) {
+        if (decode[i] !== 0 || decode[i + 1] !== 1) {
+          return false;
+        }
+      }
+      return true;
+    }
+  }, {
+    key: 'singletons',
+    get: function get() {
+      return (0, _util.shadow)(this, 'singletons', {
+        get gray() {
+          return (0, _util.shadow)(this, 'gray', new DeviceGrayCS());
+        },
+        get rgb() {
+          return (0, _util.shadow)(this, 'rgb', new DeviceRgbCS());
+        },
+        get cmyk() {
+          return (0, _util.shadow)(this, 'cmyk', new DeviceCmykCS());
+        }
+      });
+    }
+  }]);
+
+  return ColorSpace;
+}();
+
+var AlternateCS = function (_ColorSpace) {
+  _inherits(AlternateCS, _ColorSpace);
+
+  function AlternateCS(numComps, base, tintFn) {
+    _classCallCheck(this, AlternateCS);
+
+    var _this = _possibleConstructorReturn(this, (AlternateCS.__proto__ || Object.getPrototypeOf(AlternateCS)).call(this, 'Alternate', numComps));
+
+    _this.base = base;
+    _this.tintFn = tintFn;
+    _this.tmpBuf = new Float32Array(base.numComps);
+    return _this;
+  }
+
+  _createClass(AlternateCS, [{
+    key: 'getRgbItem',
+    value: function getRgbItem(src, srcOffset, dest, destOffset) {
+      var tmpBuf = this.tmpBuf;
+      this.tintFn(src, srcOffset, tmpBuf, 0);
+      this.base.getRgbItem(tmpBuf, 0, dest, destOffset);
+    }
+  }, {
+    key: 'getRgbBuffer',
+    value: function getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
+      var tintFn = this.tintFn;
+      var base = this.base;
+      var scale = 1 / ((1 << bits) - 1);
+      var baseNumComps = base.numComps;
+      var usesZeroToOneRange = base.usesZeroToOneRange;
+      var isPassthrough = (base.isPassthrough(8) || !usesZeroToOneRange) && alpha01 === 0;
+      var pos = isPassthrough ? destOffset : 0;
+      var baseBuf = isPassthrough ? dest : new Uint8ClampedArray(baseNumComps * count);
+      var numComps = this.numComps;
+      var scaled = new Float32Array(numComps);
+      var tinted = new Float32Array(baseNumComps);
+      var i = void 0,
+          j = void 0;
+      for (i = 0; i < count; i++) {
+        for (j = 0; j < numComps; j++) {
+          scaled[j] = src[srcOffset++] * scale;
+        }
+        tintFn(scaled, 0, tinted, 0);
+        if (usesZeroToOneRange) {
+          for (j = 0; j < baseNumComps; j++) {
+            baseBuf[pos++] = tinted[j] * 255;
+          }
+        } else {
+          base.getRgbItem(tinted, 0, baseBuf, pos);
+          pos += baseNumComps;
+        }
+      }
+      if (!isPassthrough) {
+        base.getRgbBuffer(baseBuf, 0, count, dest, destOffset, 8, alpha01);
+      }
+    }
+  }, {
+    key: 'getOutputLength',
+    value: function getOutputLength(inputLength, alpha01) {
+      return this.base.getOutputLength(inputLength * this.base.numComps / this.numComps, alpha01);
+    }
+  }, {
+    key: 'isDefaultDecode',
+    value: function isDefaultDecode(decodeMap) {
+      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
+    }
+  }]);
+
+  return AlternateCS;
+}(ColorSpace);
+
+var PatternCS = function (_ColorSpace2) {
+  _inherits(PatternCS, _ColorSpace2);
+
+  function PatternCS(baseCS) {
+    _classCallCheck(this, PatternCS);
+
+    var _this2 = _possibleConstructorReturn(this, (PatternCS.__proto__ || Object.getPrototypeOf(PatternCS)).call(this, 'Pattern', null));
+
+    _this2.base = baseCS;
+    return _this2;
+  }
+
+  return PatternCS;
+}(ColorSpace);
+
+var IndexedCS = function (_ColorSpace3) {
+  _inherits(IndexedCS, _ColorSpace3);
+
+  function IndexedCS(base, highVal, lookup) {
+    _classCallCheck(this, IndexedCS);
+
+    var _this3 = _possibleConstructorReturn(this, (IndexedCS.__proto__ || Object.getPrototypeOf(IndexedCS)).call(this, 'Indexed', 1));
+
+    _this3.base = base;
+    _this3.highVal = highVal;
+    var baseNumComps = base.numComps;
+    var length = baseNumComps * highVal;
+    if ((0, _primitives.isStream)(lookup)) {
+      _this3.lookup = new Uint8Array(length);
+      var bytes = lookup.getBytes(length);
+      _this3.lookup.set(bytes);
+    } else if ((0, _util.isString)(lookup)) {
+      _this3.lookup = new Uint8Array(length);
+      for (var i = 0; i < length; ++i) {
+        _this3.lookup[i] = lookup.charCodeAt(i);
+      }
+    } else if (lookup instanceof Uint8Array) {
+      _this3.lookup = lookup;
+    } else {
+      throw new _util.FormatError('Unrecognized lookup table: ' + lookup);
+    }
+    return _this3;
+  }
+
+  _createClass(IndexedCS, [{
+    key: 'getRgbItem',
+    value: function getRgbItem(src, srcOffset, dest, destOffset) {
+      var numComps = this.base.numComps;
+      var start = src[srcOffset] * numComps;
+      this.base.getRgbBuffer(this.lookup, start, 1, dest, destOffset, 8, 0);
+    }
+  }, {
+    key: 'getRgbBuffer',
+    value: function getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
+      var base = this.base;
+      var numComps = base.numComps;
+      var outputDelta = base.getOutputLength(numComps, alpha01);
+      var lookup = this.lookup;
+      for (var i = 0; i < count; ++i) {
+        var lookupPos = src[srcOffset++] * numComps;
+        base.getRgbBuffer(lookup, lookupPos, 1, dest, destOffset, 8, alpha01);
+        destOffset += outputDelta;
+      }
+    }
+  }, {
+    key: 'getOutputLength',
+    value: function getOutputLength(inputLength, alpha01) {
+      return this.base.getOutputLength(inputLength * this.base.numComps, alpha01);
+    }
+  }, {
+    key: 'isDefaultDecode',
+    value: function isDefaultDecode(decodeMap) {
+      return true;
+    }
+  }]);
+
+  return IndexedCS;
+}(ColorSpace);
+
+var DeviceGrayCS = function (_ColorSpace4) {
+  _inherits(DeviceGrayCS, _ColorSpace4);
+
+  function DeviceGrayCS() {
+    _classCallCheck(this, DeviceGrayCS);
+
+    return _possibleConstructorReturn(this, (DeviceGrayCS.__proto__ || Object.getPrototypeOf(DeviceGrayCS)).call(this, 'DeviceGray', 1));
+  }
+
+  _createClass(DeviceGrayCS, [{
+    key: 'getRgbItem',
+    value: function getRgbItem(src, srcOffset, dest, destOffset) {
+      var c = src[srcOffset] * 255;
+      dest[destOffset] = dest[destOffset + 1] = dest[destOffset + 2] = c;
+    }
+  }, {
+    key: 'getRgbBuffer',
+    value: function getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
+      var scale = 255 / ((1 << bits) - 1);
+      var j = srcOffset,
+          q = destOffset;
+      for (var i = 0; i < count; ++i) {
+        var c = scale * src[j++];
+        dest[q++] = c;
+        dest[q++] = c;
+        dest[q++] = c;
+        q += alpha01;
+      }
+    }
+  }, {
+    key: 'getOutputLength',
+    value: function getOutputLength(inputLength, alpha01) {
+      return inputLength * (3 + alpha01);
+    }
+  }, {
+    key: 'isDefaultDecode',
+    value: function isDefaultDecode(decodeMap) {
+      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
+    }
+  }]);
+
+  return DeviceGrayCS;
+}(ColorSpace);
+
+var DeviceRgbCS = function (_ColorSpace5) {
+  _inherits(DeviceRgbCS, _ColorSpace5);
+
+  function DeviceRgbCS() {
+    _classCallCheck(this, DeviceRgbCS);
+
+    return _possibleConstructorReturn(this, (DeviceRgbCS.__proto__ || Object.getPrototypeOf(DeviceRgbCS)).call(this, 'DeviceRGB', 3));
+  }
+
+  _createClass(DeviceRgbCS, [{
+    key: 'getRgbItem',
+    value: function getRgbItem(src, srcOffset, dest, destOffset) {
+      dest[destOffset] = src[srcOffset] * 255;
+      dest[destOffset + 1] = src[srcOffset + 1] * 255;
+      dest[destOffset + 2] = src[srcOffset + 2] * 255;
+    }
+  }, {
+    key: 'getRgbBuffer',
+    value: function getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
+      if (bits === 8 && alpha01 === 0) {
+        dest.set(src.subarray(srcOffset, srcOffset + count * 3), destOffset);
+        return;
+      }
+      var scale = 255 / ((1 << bits) - 1);
+      var j = srcOffset,
+          q = destOffset;
+      for (var i = 0; i < count; ++i) {
+        dest[q++] = scale * src[j++];
+        dest[q++] = scale * src[j++];
+        dest[q++] = scale * src[j++];
+        q += alpha01;
+      }
+    }
+  }, {
+    key: 'getOutputLength',
+    value: function getOutputLength(inputLength, alpha01) {
+      return inputLength * (3 + alpha01) / 3 | 0;
+    }
+  }, {
+    key: 'isPassthrough',
+    value: function isPassthrough(bits) {
+      return bits === 8;
+    }
+  }, {
+    key: 'isDefaultDecode',
+    value: function isDefaultDecode(decodeMap) {
+      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
+    }
+  }]);
+
+  return DeviceRgbCS;
+}(ColorSpace);
+
+var DeviceCmykCS = function DeviceCmykCSClosure() {
+  function convertToRgb(src, srcOffset, srcScale, dest, destOffset) {
+    var c = src[srcOffset] * srcScale;
+    var m = src[srcOffset + 1] * srcScale;
+    var y = src[srcOffset + 2] * srcScale;
+    var k = src[srcOffset + 3] * srcScale;
+    dest[destOffset] = 255 + c * (-4.387332384609988 * c + 54.48615194189176 * m + 18.82290502165302 * y + 212.25662451639585 * k + -285.2331026137004) + m * (1.7149763477362134 * m - 5.6096736904047315 * y + -17.873870861415444 * k - 5.497006427196366) + y * (-2.5217340131683033 * y - 21.248923337353073 * k + 17.5119270841813) + k * (-21.86122147463605 * k - 189.48180835922747);
+    dest[destOffset + 1] = 255 + c * (8.841041422036149 * c + 60.118027045597366 * m + 6.871425592049007 * y + 31.159100130055922 * k + -79.2970844816548) + m * (-15.310361306967817 * m + 17.575251261109482 * y + 131.35250912493976 * k - 190.9453302588951) + y * (4.444339102852739 * y + 9.8632861493405 * k - 24.86741582555878) + k * (-20.737325471181034 * k - 187.80453709719578);
+    dest[destOffset + 2] = 255 + c * (0.8842522430003296 * c + 8.078677503112928 * m + 30.89978309703729 * y - 0.23883238689178934 * k + -14.183576799673286) + m * (10.49593273432072 * m + 63.02378494754052 * y + 50.606957656360734 * k - 112.23884253719248) + y * (0.03296041114873217 * y + 115.60384449646641 * k + -193.58209356861505) + k * (-22.33816807309886 * k - 180.12613974708367);
+  }
+
+  var DeviceCmykCS = function (_ColorSpace6) {
+    _inherits(DeviceCmykCS, _ColorSpace6);
+
+    function DeviceCmykCS() {
+      _classCallCheck(this, DeviceCmykCS);
+
+      return _possibleConstructorReturn(this, (DeviceCmykCS.__proto__ || Object.getPrototypeOf(DeviceCmykCS)).call(this, 'DeviceCMYK', 4));
+    }
+
+    _createClass(DeviceCmykCS, [{
+      key: 'getRgbItem',
+      value: function getRgbItem(src, srcOffset, dest, destOffset) {
+        convertToRgb(src, srcOffset, 1, dest, destOffset);
+      }
+    }, {
+      key: 'getRgbBuffer',
+      value: function getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
+        var scale = 1 / ((1 << bits) - 1);
+        for (var i = 0; i < count; i++) {
+          convertToRgb(src, srcOffset, scale, dest, destOffset);
+          srcOffset += 4;
+          destOffset += 3 + alpha01;
+        }
+      }
+    }, {
+      key: 'getOutputLength',
+      value: function getOutputLength(inputLength, alpha01) {
+        return inputLength / 4 * (3 + alpha01) | 0;
+      }
+    }, {
+      key: 'isDefaultDecode',
+      value: function isDefaultDecode(decodeMap) {
+        return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
+      }
+    }]);
+
+    return DeviceCmykCS;
+  }(ColorSpace);
+
+  return DeviceCmykCS;
+}();
+var CalGrayCS = function CalGrayCSClosure() {
+  function convertToRgb(cs, src, srcOffset, dest, destOffset, scale) {
+    var A = src[srcOffset] * scale;
+    var AG = Math.pow(A, cs.G);
+    var L = cs.YW * AG;
+    var val = Math.max(295.8 * Math.pow(L, 0.333333333333333333) - 40.8, 0);
+    dest[destOffset] = val;
+    dest[destOffset + 1] = val;
+    dest[destOffset + 2] = val;
+  }
+
+  var CalGrayCS = function (_ColorSpace7) {
+    _inherits(CalGrayCS, _ColorSpace7);
+
+    function CalGrayCS(whitePoint, blackPoint, gamma) {
+      _classCallCheck(this, CalGrayCS);
+
+      var _this7 = _possibleConstructorReturn(this, (CalGrayCS.__proto__ || Object.getPrototypeOf(CalGrayCS)).call(this, 'CalGray', 1));
+
+      if (!whitePoint) {
+        throw new _util.FormatError('WhitePoint missing - required for color space CalGray');
+      }
+      blackPoint = blackPoint || [0, 0, 0];
+      gamma = gamma || 1;
+      _this7.XW = whitePoint[0];
+      _this7.YW = whitePoint[1];
+      _this7.ZW = whitePoint[2];
+      _this7.XB = blackPoint[0];
+      _this7.YB = blackPoint[1];
+      _this7.ZB = blackPoint[2];
+      _this7.G = gamma;
+      if (_this7.XW < 0 || _this7.ZW < 0 || _this7.YW !== 1) {
+        throw new _util.FormatError('Invalid WhitePoint components for ' + _this7.name + ', no fallback available');
+      }
+      if (_this7.XB < 0 || _this7.YB < 0 || _this7.ZB < 0) {
+        (0, _util.info)('Invalid BlackPoint for ' + _this7.name + ', falling back to default.');
+        _this7.XB = _this7.YB = _this7.ZB = 0;
+      }
+      if (_this7.XB !== 0 || _this7.YB !== 0 || _this7.ZB !== 0) {
+        (0, _util.warn)(_this7.name + ', BlackPoint: XB: ' + _this7.XB + ', YB: ' + _this7.YB + ', ' + ('ZB: ' + _this7.ZB + ', only default values are supported.'));
+      }
+      if (_this7.G < 1) {
+        (0, _util.info)('Invalid Gamma: ' + _this7.G + ' for ' + _this7.name + ', ' + 'falling back to default.');
+        _this7.G = 1;
+      }
+      return _this7;
+    }
+
+    _createClass(CalGrayCS, [{
+      key: 'getRgbItem',
+      value: function getRgbItem(src, srcOffset, dest, destOffset) {
+        convertToRgb(this, src, srcOffset, dest, destOffset, 1);
+      }
+    }, {
+      key: 'getRgbBuffer',
+      value: function getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
+        var scale = 1 / ((1 << bits) - 1);
+        for (var i = 0; i < count; ++i) {
+          convertToRgb(this, src, srcOffset, dest, destOffset, scale);
+          srcOffset += 1;
+          destOffset += 3 + alpha01;
+        }
+      }
+    }, {
+      key: 'getOutputLength',
+      value: function getOutputLength(inputLength, alpha01) {
+        return inputLength * (3 + alpha01);
+      }
+    }, {
+      key: 'isDefaultDecode',
+      value: function isDefaultDecode(decodeMap) {
+        return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
+      }
+    }]);
+
+    return CalGrayCS;
+  }(ColorSpace);
+
+  return CalGrayCS;
+}();
+var CalRGBCS = function CalRGBCSClosure() {
+  var BRADFORD_SCALE_MATRIX = new Float32Array([0.8951, 0.2664, -0.1614, -0.7502, 1.7135, 0.0367, 0.0389, -0.0685, 1.0296]);
+  var BRADFORD_SCALE_INVERSE_MATRIX = new Float32Array([0.9869929, -0.1470543, 0.1599627, 0.4323053, 0.5183603, 0.0492912, -0.0085287, 0.0400428, 0.9684867]);
+  var SRGB_D65_XYZ_TO_RGB_MATRIX = new Float32Array([3.2404542, -1.5371385, -0.4985314, -0.9692660, 1.8760108, 0.0415560, 0.0556434, -0.2040259, 1.0572252]);
+  var FLAT_WHITEPOINT_MATRIX = new Float32Array([1, 1, 1]);
+  var tempNormalizeMatrix = new Float32Array(3);
+  var tempConvertMatrix1 = new Float32Array(3);
+  var tempConvertMatrix2 = new Float32Array(3);
+  var DECODE_L_CONSTANT = Math.pow((8 + 16) / 116, 3) / 8.0;
+  function matrixProduct(a, b, result) {
+    result[0] = a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
+    result[1] = a[3] * b[0] + a[4] * b[1] + a[5] * b[2];
+    result[2] = a[6] * b[0] + a[7] * b[1] + a[8] * b[2];
+  }
+  function convertToFlat(sourceWhitePoint, LMS, result) {
+    result[0] = LMS[0] * 1 / sourceWhitePoint[0];
+    result[1] = LMS[1] * 1 / sourceWhitePoint[1];
+    result[2] = LMS[2] * 1 / sourceWhitePoint[2];
+  }
+  function convertToD65(sourceWhitePoint, LMS, result) {
+    var D65X = 0.95047;
+    var D65Y = 1;
+    var D65Z = 1.08883;
+    result[0] = LMS[0] * D65X / sourceWhitePoint[0];
+    result[1] = LMS[1] * D65Y / sourceWhitePoint[1];
+    result[2] = LMS[2] * D65Z / sourceWhitePoint[2];
+  }
+  function sRGBTransferFunction(color) {
+    if (color <= 0.0031308) {
+      return adjustToRange(0, 1, 12.92 * color);
+    }
+    return adjustToRange(0, 1, (1 + 0.055) * Math.pow(color, 1 / 2.4) - 0.055);
+  }
+  function adjustToRange(min, max, value) {
+    return Math.max(min, Math.min(max, value));
+  }
+  function decodeL(L) {
+    if (L < 0) {
+      return -decodeL(-L);
+    }
+    if (L > 8.0) {
+      return Math.pow((L + 16) / 116, 3);
+    }
+    return L * DECODE_L_CONSTANT;
+  }
+  function compensateBlackPoint(sourceBlackPoint, XYZ_Flat, result) {
+    if (sourceBlackPoint[0] === 0 && sourceBlackPoint[1] === 0 && sourceBlackPoint[2] === 0) {
+      result[0] = XYZ_Flat[0];
+      result[1] = XYZ_Flat[1];
+      result[2] = XYZ_Flat[2];
+      return;
+    }
+    var zeroDecodeL = decodeL(0);
+    var X_DST = zeroDecodeL;
+    var X_SRC = decodeL(sourceBlackPoint[0]);
+    var Y_DST = zeroDecodeL;
+    var Y_SRC = decodeL(sourceBlackPoint[1]);
+    var Z_DST = zeroDecodeL;
+    var Z_SRC = decodeL(sourceBlackPoint[2]);
+    var X_Scale = (1 - X_DST) / (1 - X_SRC);
+    var X_Offset = 1 - X_Scale;
+    var Y_Scale = (1 - Y_DST) / (1 - Y_SRC);
+    var Y_Offset = 1 - Y_Scale;
+    var Z_Scale = (1 - Z_DST) / (1 - Z_SRC);
+    var Z_Offset = 1 - Z_Scale;
+    result[0] = XYZ_Flat[0] * X_Scale + X_Offset;
+    result[1] = XYZ_Flat[1] * Y_Scale + Y_Offset;
+    result[2] = XYZ_Flat[2] * Z_Scale + Z_Offset;
+  }
+  function normalizeWhitePointToFlat(sourceWhitePoint, XYZ_In, result) {
+    if (sourceWhitePoint[0] === 1 && sourceWhitePoint[2] === 1) {
+      result[0] = XYZ_In[0];
+      result[1] = XYZ_In[1];
+      result[2] = XYZ_In[2];
+      return;
+    }
+    var LMS = result;
+    matrixProduct(BRADFORD_SCALE_MATRIX, XYZ_In, LMS);
+    var LMS_Flat = tempNormalizeMatrix;
+    convertToFlat(sourceWhitePoint, LMS, LMS_Flat);
+    matrixProduct(BRADFORD_SCALE_INVERSE_MATRIX, LMS_Flat, result);
+  }
+  function normalizeWhitePointToD65(sourceWhitePoint, XYZ_In, result) {
+    var LMS = result;
+    matrixProduct(BRADFORD_SCALE_MATRIX, XYZ_In, LMS);
+    var LMS_D65 = tempNormalizeMatrix;
+    convertToD65(sourceWhitePoint, LMS, LMS_D65);
+    matrixProduct(BRADFORD_SCALE_INVERSE_MATRIX, LMS_D65, result);
+  }
+  function convertToRgb(cs, src, srcOffset, dest, destOffset, scale) {
+    var A = adjustToRange(0, 1, src[srcOffset] * scale);
+    var B = adjustToRange(0, 1, src[srcOffset + 1] * scale);
+    var C = adjustToRange(0, 1, src[srcOffset + 2] * scale);
+    var AGR = Math.pow(A, cs.GR);
+    var BGG = Math.pow(B, cs.GG);
+    var CGB = Math.pow(C, cs.GB);
+    var X = cs.MXA * AGR + cs.MXB * BGG + cs.MXC * CGB;
+    var Y = cs.MYA * AGR + cs.MYB * BGG + cs.MYC * CGB;
+    var Z = cs.MZA * AGR + cs.MZB * BGG + cs.MZC * CGB;
+    var XYZ = tempConvertMatrix1;
+    XYZ[0] = X;
+    XYZ[1] = Y;
+    XYZ[2] = Z;
+    var XYZ_Flat = tempConvertMatrix2;
+    normalizeWhitePointToFlat(cs.whitePoint, XYZ, XYZ_Flat);
+    var XYZ_Black = tempConvertMatrix1;
+    compensateBlackPoint(cs.blackPoint, XYZ_Flat, XYZ_Black);
+    var XYZ_D65 = tempConvertMatrix2;
+    normalizeWhitePointToD65(FLAT_WHITEPOINT_MATRIX, XYZ_Black, XYZ_D65);
+    var SRGB = tempConvertMatrix1;
+    matrixProduct(SRGB_D65_XYZ_TO_RGB_MATRIX, XYZ_D65, SRGB);
+    dest[destOffset] = sRGBTransferFunction(SRGB[0]) * 255;
+    dest[destOffset + 1] = sRGBTransferFunction(SRGB[1]) * 255;
+    dest[destOffset + 2] = sRGBTransferFunction(SRGB[2]) * 255;
+  }
+
+  var CalRGBCS = function (_ColorSpace8) {
+    _inherits(CalRGBCS, _ColorSpace8);
+
+    function CalRGBCS(whitePoint, blackPoint, gamma, matrix) {
+      _classCallCheck(this, CalRGBCS);
+
+      var _this8 = _possibleConstructorReturn(this, (CalRGBCS.__proto__ || Object.getPrototypeOf(CalRGBCS)).call(this, 'CalRGB', 3));
+
+      if (!whitePoint) {
+        throw new _util.FormatError('WhitePoint missing - required for color space CalRGB');
+      }
+      blackPoint = blackPoint || new Float32Array(3);
+      gamma = gamma || new Float32Array([1, 1, 1]);
+      matrix = matrix || new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]);
+      var XW = whitePoint[0];
+      var YW = whitePoint[1];
+      var ZW = whitePoint[2];
+      _this8.whitePoint = whitePoint;
+      var XB = blackPoint[0];
+      var YB = blackPoint[1];
+      var ZB = blackPoint[2];
+      _this8.blackPoint = blackPoint;
+      _this8.GR = gamma[0];
+      _this8.GG = gamma[1];
+      _this8.GB = gamma[2];
+      _this8.MXA = matrix[0];
+      _this8.MYA = matrix[1];
+      _this8.MZA = matrix[2];
+      _this8.MXB = matrix[3];
+      _this8.MYB = matrix[4];
+      _this8.MZB = matrix[5];
+      _this8.MXC = matrix[6];
+      _this8.MYC = matrix[7];
+      _this8.MZC = matrix[8];
+      if (XW < 0 || ZW < 0 || YW !== 1) {
+        throw new _util.FormatError('Invalid WhitePoint components for ' + _this8.name + ', no fallback available');
+      }
+      if (XB < 0 || YB < 0 || ZB < 0) {
+        (0, _util.info)('Invalid BlackPoint for ' + _this8.name + ' [' + XB + ', ' + YB + ', ' + ZB + '], ' + 'falling back to default.');
+        _this8.blackPoint = new Float32Array(3);
+      }
+      if (_this8.GR < 0 || _this8.GG < 0 || _this8.GB < 0) {
+        (0, _util.info)('Invalid Gamma [' + _this8.GR + ', ' + _this8.GG + ', ' + _this8.GB + '] for ' + (_this8.name + ', falling back to default.'));
+        _this8.GR = _this8.GG = _this8.GB = 1;
+      }
+      return _this8;
+    }
+
+    _createClass(CalRGBCS, [{
+      key: 'getRgbItem',
+      value: function getRgbItem(src, srcOffset, dest, destOffset) {
+        convertToRgb(this, src, srcOffset, dest, destOffset, 1);
+      }
+    }, {
+      key: 'getRgbBuffer',
+      value: function getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
+        var scale = 1 / ((1 << bits) - 1);
+        for (var i = 0; i < count; ++i) {
+          convertToRgb(this, src, srcOffset, dest, destOffset, scale);
+          srcOffset += 3;
+          destOffset += 3 + alpha01;
+        }
+      }
+    }, {
+      key: 'getOutputLength',
+      value: function getOutputLength(inputLength, alpha01) {
+        return inputLength * (3 + alpha01) / 3 | 0;
+      }
+    }, {
+      key: 'isDefaultDecode',
+      value: function isDefaultDecode(decodeMap) {
+        return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
+      }
+    }]);
+
+    return CalRGBCS;
+  }(ColorSpace);
+
+  return CalRGBCS;
+}();
+var LabCS = function LabCSClosure() {
+  function fn_g(x) {
+    var result = void 0;
+    if (x >= 6 / 29) {
+      result = x * x * x;
+    } else {
+      result = 108 / 841 * (x - 4 / 29);
+    }
+    return result;
+  }
+  function decode(value, high1, low2, high2) {
+    return low2 + value * (high2 - low2) / high1;
+  }
+  function convertToRgb(cs, src, srcOffset, maxVal, dest, destOffset) {
+    var Ls = src[srcOffset];
+    var as = src[srcOffset + 1];
+    var bs = src[srcOffset + 2];
+    if (maxVal !== false) {
+      Ls = decode(Ls, maxVal, 0, 100);
+      as = decode(as, maxVal, cs.amin, cs.amax);
+      bs = decode(bs, maxVal, cs.bmin, cs.bmax);
+    }
+    as = as > cs.amax ? cs.amax : as < cs.amin ? cs.amin : as;
+    bs = bs > cs.bmax ? cs.bmax : bs < cs.bmin ? cs.bmin : bs;
+    var M = (Ls + 16) / 116;
+    var L = M + as / 500;
+    var N = M - bs / 200;
+    var X = cs.XW * fn_g(L);
+    var Y = cs.YW * fn_g(M);
+    var Z = cs.ZW * fn_g(N);
+    var r = void 0,
+        g = void 0,
+        b = void 0;
+    if (cs.ZW < 1) {
+      r = X * 3.1339 + Y * -1.6170 + Z * -0.4906;
+      g = X * -0.9785 + Y * 1.9160 + Z * 0.0333;
+      b = X * 0.0720 + Y * -0.2290 + Z * 1.4057;
+    } else {
+      r = X * 3.2406 + Y * -1.5372 + Z * -0.4986;
+      g = X * -0.9689 + Y * 1.8758 + Z * 0.0415;
+      b = X * 0.0557 + Y * -0.2040 + Z * 1.0570;
+    }
+    dest[destOffset] = Math.sqrt(r) * 255;
+    dest[destOffset + 1] = Math.sqrt(g) * 255;
+    dest[destOffset + 2] = Math.sqrt(b) * 255;
+  }
+
+  var LabCS = function (_ColorSpace9) {
+    _inherits(LabCS, _ColorSpace9);
+
+    function LabCS(whitePoint, blackPoint, range) {
+      _classCallCheck(this, LabCS);
+
+      var _this9 = _possibleConstructorReturn(this, (LabCS.__proto__ || Object.getPrototypeOf(LabCS)).call(this, 'Lab', 3));
+
+      if (!whitePoint) {
+        throw new _util.FormatError('WhitePoint missing - required for color space Lab');
+      }
+      blackPoint = blackPoint || [0, 0, 0];
+      range = range || [-100, 100, -100, 100];
+      _this9.XW = whitePoint[0];
+      _this9.YW = whitePoint[1];
+      _this9.ZW = whitePoint[2];
+      _this9.amin = range[0];
+      _this9.amax = range[1];
+      _this9.bmin = range[2];
+      _this9.bmax = range[3];
+      _this9.XB = blackPoint[0];
+      _this9.YB = blackPoint[1];
+      _this9.ZB = blackPoint[2];
+      if (_this9.XW < 0 || _this9.ZW < 0 || _this9.YW !== 1) {
+        throw new _util.FormatError('Invalid WhitePoint components, no fallback available');
+      }
+      if (_this9.XB < 0 || _this9.YB < 0 || _this9.ZB < 0) {
+        (0, _util.info)('Invalid BlackPoint, falling back to default');
+        _this9.XB = _this9.YB = _this9.ZB = 0;
+      }
+      if (_this9.amin > _this9.amax || _this9.bmin > _this9.bmax) {
+        (0, _util.info)('Invalid Range, falling back to defaults');
+        _this9.amin = -100;
+        _this9.amax = 100;
+        _this9.bmin = -100;
+        _this9.bmax = 100;
+      }
+      return _this9;
+    }
+
+    _createClass(LabCS, [{
+      key: 'getRgbItem',
+      value: function getRgbItem(src, srcOffset, dest, destOffset) {
+        convertToRgb(this, src, srcOffset, false, dest, destOffset);
+      }
+    }, {
+      key: 'getRgbBuffer',
+      value: function getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {
+        var maxVal = (1 << bits) - 1;
+        for (var i = 0; i < count; i++) {
+          convertToRgb(this, src, srcOffset, maxVal, dest, destOffset);
+          srcOffset += 3;
+          destOffset += 3 + alpha01;
+        }
+      }
+    }, {
+      key: 'getOutputLength',
+      value: function getOutputLength(inputLength, alpha01) {
+        return inputLength * (3 + alpha01) / 3 | 0;
+      }
+    }, {
+      key: 'isDefaultDecode',
+      value: function isDefaultDecode(decodeMap) {
+        return true;
+      }
+    }, {
+      key: 'usesZeroToOneRange',
+      get: function get() {
+        return (0, _util.shadow)(this, 'usesZeroToOneRange', false);
+      }
+    }]);
+
+    return LabCS;
+  }(ColorSpace);
+
+  return LabCS;
+}();
+exports.ColorSpace = ColorSpace;
+
+/***/ }),
+/* 152 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.AnnotationFactory = exports.AnnotationBorderStyle = exports.Annotation = undefined;
+
+var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _util = __w_pdfjs_require__(2);
+
+var _obj = __w_pdfjs_require__(137);
+
+var _primitives = __w_pdfjs_require__(138);
+
+var _colorspace = __w_pdfjs_require__(151);
+
+var _operator_list = __w_pdfjs_require__(153);
+
+var _stream = __w_pdfjs_require__(140);
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var AnnotationFactory = function () {
+  function AnnotationFactory() {
+    _classCallCheck(this, AnnotationFactory);
+  }
+
+  _createClass(AnnotationFactory, null, [{
+    key: 'create',
+    value: function create(xref, ref, pdfManager, idFactory) {
+      return pdfManager.ensure(this, '_create', [xref, ref, pdfManager, idFactory]);
+    }
+  }, {
+    key: '_create',
+    value: function _create(xref, ref, pdfManager, idFactory) {
+      var dict = xref.fetchIfRef(ref);
+      if (!(0, _primitives.isDict)(dict)) {
+        return;
+      }
+      var id = (0, _primitives.isRef)(ref) ? ref.toString() : 'annot_' + idFactory.createObjId();
+      var subtype = dict.get('Subtype');
+      subtype = (0, _primitives.isName)(subtype) ? subtype.name : null;
+      var parameters = {
+        xref: xref,
+        dict: dict,
+        ref: (0, _primitives.isRef)(ref) ? ref : null,
+        subtype: subtype,
+        id: id,
+        pdfManager: pdfManager
+      };
+      switch (subtype) {
+        case 'Link':
+          return new LinkAnnotation(parameters);
+        case 'Text':
+          return new TextAnnotation(parameters);
+        case 'Widget':
+          var fieldType = (0, _util.getInheritableProperty)({
+            dict: dict,
+            key: 'FT'
+          });
+          fieldType = (0, _primitives.isName)(fieldType) ? fieldType.name : null;
+          switch (fieldType) {
+            case 'Tx':
+              return new TextWidgetAnnotation(parameters);
+            case 'Btn':
+              return new ButtonWidgetAnnotation(parameters);
+            case 'Ch':
+              return new ChoiceWidgetAnnotation(parameters);
+          }
+          (0, _util.warn)('Unimplemented widget field type "' + fieldType + '", ' + 'falling back to index field type.');
+          return new WidgetAnnotation(parameters);
+        case 'Popup':
+          return new PopupAnnotation(parameters);
+        case 'Line':
+          return new LineAnnotation(parameters);
+        case 'Square':
+          return new SquareAnnotation(parameters);
+        case 'Circle':
+          return new CircleAnnotation(parameters);
+        case 'PolyLine':
+          return new PolylineAnnotation(parameters);
+        case 'Polygon':
+          return new PolygonAnnotation(parameters);
+        case 'Ink':
+          return new InkAnnotation(parameters);
+        case 'Highlight':
+          return new HighlightAnnotation(parameters);
+        case 'Underline':
+          return new UnderlineAnnotation(parameters);
+        case 'Squiggly':
+          return new SquigglyAnnotation(parameters);
+        case 'StrikeOut':
+          return new StrikeOutAnnotation(parameters);
+        case 'Stamp':
+          return new StampAnnotation(parameters);
+        case 'FileAttachment':
+          return new FileAttachmentAnnotation(parameters);
+        default:
+          if (!subtype) {
+            (0, _util.warn)('Annotation is missing the required /Subtype.');
+          } else {
+            (0, _util.warn)('Unimplemented annotation type "' + subtype + '", ' + 'falling back to index annotation.');
+          }
+          return new Annotation(parameters);
+      }
+    }
+  }]);
+
+  return AnnotationFactory;
+}();
+
+function getTransformMatrix(rect, bbox, matrix) {
+  var bounds = _util.Util.getAxialAlignedBoundingBox(bbox, matrix);
+  var minX = bounds[0];
+  var minY = bounds[1];
+  var maxX = bounds[2];
+  var maxY = bounds[3];
+  if (minX === maxX || minY === maxY) {
+    return [1, 0, 0, 1, rect[0], rect[1]];
+  }
+  var xRatio = (rect[2] - rect[0]) / (maxX - minX);
+  var yRatio = (rect[3] - rect[1]) / (maxY - minY);
+  return [xRatio, 0, 0, yRatio, rect[0] - minX * xRatio, rect[1] - minY * yRatio];
+}
+
+var Annotation = function () {
+  function Annotation(params) {
+    _classCallCheck(this, Annotation);
+
+    var dict = params.dict;
+    this.setFlags(dict.get('F'));
+    this.setRectangle(dict.getArray('Rect'));
+    this.setColor(dict.getArray('C'));
+    this.setBorderStyle(dict);
+    this.setAppearance(dict);
+    this.data = {
+      annotationFlags: this.flags,
+      borderStyle: this.borderStyle,
+      color: this.color,
+      hasAppearance: !!this.appearance,
+      id: params.id,
+      rect: this.rectangle,
+      subtype: params.subtype
+    };
+  }
+
+  _createClass(Annotation, [{
+    key: '_hasFlag',
+    value: function _hasFlag(flags, flag) {
+      return !!(flags & flag);
+    }
+  }, {
+    key: '_isViewable',
+    value: function _isViewable(flags) {
+      return !this._hasFlag(flags, _util.AnnotationFlag.INVISIBLE) && !this._hasFlag(flags, _util.AnnotationFlag.HIDDEN) && !this._hasFlag(flags, _util.AnnotationFlag.NOVIEW);
+    }
+  }, {
+    key: '_isPrintable',
+    value: function _isPrintable(flags) {
+      return this._hasFlag(flags, _util.AnnotationFlag.PRINT) && !this._hasFlag(flags, _util.AnnotationFlag.INVISIBLE) && !this._hasFlag(flags, _util.AnnotationFlag.HIDDEN);
+    }
+  }, {
+    key: 'setFlags',
+    value: function setFlags(flags) {
+      this.flags = Number.isInteger(flags) && flags > 0 ? flags : 0;
+    }
+  }, {
+    key: 'hasFlag',
+    value: function hasFlag(flag) {
+      return this._hasFlag(this.flags, flag);
+    }
+  }, {
+    key: 'setRectangle',
+    value: function setRectangle(rectangle) {
+      if (Array.isArray(rectangle) && rectangle.length === 4) {
+        this.rectangle = _util.Util.normalizeRect(rectangle);
+      } else {
+        this.rectangle = [0, 0, 0, 0];
+      }
+    }
+  }, {
+    key: 'setColor',
+    value: function setColor(color) {
+      var rgbColor = new Uint8ClampedArray(3);
+      if (!Array.isArray(color)) {
+        this.color = rgbColor;
+        return;
+      }
+      switch (color.length) {
+        case 0:
+          this.color = null;
+          break;
+        case 1:
+          _colorspace.ColorSpace.singletons.gray.getRgbItem(color, 0, rgbColor, 0);
+          this.color = rgbColor;
+          break;
+        case 3:
+          _colorspace.ColorSpace.singletons.rgb.getRgbItem(color, 0, rgbColor, 0);
+          this.color = rgbColor;
+          break;
+        case 4:
+          _colorspace.ColorSpace.singletons.cmyk.getRgbItem(color, 0, rgbColor, 0);
+          this.color = rgbColor;
+          break;
+        default:
+          this.color = rgbColor;
+          break;
+      }
+    }
+  }, {
+    key: 'setBorderStyle',
+    value: function setBorderStyle(borderStyle) {
+      this.borderStyle = new AnnotationBorderStyle();
+      if (!(0, _primitives.isDict)(borderStyle)) {
+        return;
+      }
+      if (borderStyle.has('BS')) {
+        var dict = borderStyle.get('BS');
+        var dictType = dict.get('Type');
+        if (!dictType || (0, _primitives.isName)(dictType, 'Border')) {
+          this.borderStyle.setWidth(dict.get('W'));
+          this.borderStyle.setStyle(dict.get('S'));
+          this.borderStyle.setDashArray(dict.getArray('D'));
+        }
+      } else if (borderStyle.has('Border')) {
+        var array = borderStyle.getArray('Border');
+        if (Array.isArray(array) && array.length >= 3) {
+          this.borderStyle.setHorizontalCornerRadius(array[0]);
+          this.borderStyle.setVerticalCornerRadius(array[1]);
+          this.borderStyle.setWidth(array[2]);
+          if (array.length === 4) {
+            this.borderStyle.setDashArray(array[3]);
+          }
+        }
+      } else {
+        this.borderStyle.setWidth(0);
+      }
+    }
+  }, {
+    key: 'setAppearance',
+    value: function setAppearance(dict) {
+      this.appearance = null;
+      var appearanceStates = dict.get('AP');
+      if (!(0, _primitives.isDict)(appearanceStates)) {
+        return;
+      }
+      var normalAppearanceState = appearanceStates.get('N');
+      if ((0, _primitives.isStream)(normalAppearanceState)) {
+        this.appearance = normalAppearanceState;
+        return;
+      }
+      if (!(0, _primitives.isDict)(normalAppearanceState)) {
+        return;
+      }
+      var as = dict.get('AS');
+      if (!(0, _primitives.isName)(as) || !normalAppearanceState.has(as.name)) {
+        return;
+      }
+      this.appearance = normalAppearanceState.get(as.name);
+    }
+  }, {
+    key: '_preparePopup',
+    value: function _preparePopup(dict) {
+      if (!dict.has('C')) {
+        this.data.color = null;
+      }
+      this.data.hasPopup = dict.has('Popup');
+      this.data.title = (0, _util.stringToPDFString)(dict.get('T') || '');
+      this.data.contents = (0, _util.stringToPDFString)(dict.get('Contents') || '');
+    }
+  }, {
+    key: 'loadResources',
+    value: function loadResources(keys) {
+      return this.appearance.dict.getAsync('Resources').then(function (resources) {
+        if (!resources) {
+          return;
+        }
+        var objectLoader = new _obj.ObjectLoader(resources, keys, resources.xref);
+        return objectLoader.load().then(function () {
+          return resources;
+        });
+      });
+    }
+  }, {
+    key: 'getOperatorList',
+    value: function getOperatorList(evaluator, task, renderForms) {
+      var _this = this;
+
+      if (!this.appearance) {
+        return Promise.resolve(new _operator_list.OperatorList());
+      }
+      var data = this.data;
+      var appearanceDict = this.appearance.dict;
+      var resourcesPromise = this.loadResources(['ExtGState', 'ColorSpace', 'Pattern', 'Shading', 'XObject', 'Font']);
+      var bbox = appearanceDict.getArray('BBox') || [0, 0, 1, 1];
+      var matrix = appearanceDict.getArray('Matrix') || [1, 0, 0, 1, 0, 0];
+      var transform = getTransformMatrix(data.rect, bbox, matrix);
+      return resourcesPromise.then(function (resources) {
+        var opList = new _operator_list.OperatorList();
+        opList.addOp(_util.OPS.beginAnnotation, [data.rect, transform, matrix]);
+        return evaluator.getOperatorList({
+          stream: _this.appearance,
+          task: task,
+          resources: resources,
+          operatorList: opList
+        }).then(function () {
+          opList.addOp(_util.OPS.endAnnotation, []);
+          _this.appearance.reset();
+          return opList;
+        });
+      });
+    }
+  }, {
+    key: 'viewable',
+    get: function get() {
+      if (this.flags === 0) {
+        return true;
+      }
+      return this._isViewable(this.flags);
+    }
+  }, {
+    key: 'printable',
+    get: function get() {
+      if (this.flags === 0) {
+        return false;
+      }
+      return this._isPrintable(this.flags);
+    }
+  }]);
+
+  return Annotation;
+}();
+
+var AnnotationBorderStyle = function () {
+  function AnnotationBorderStyle() {
+    _classCallCheck(this, AnnotationBorderStyle);
+
+    this.width = 1;
+    this.style = _util.AnnotationBorderStyleType.SOLID;
+    this.dashArray = [3];
+    this.horizontalCornerRadius = 0;
+    this.verticalCornerRadius = 0;
+  }
+
+  _createClass(AnnotationBorderStyle, [{
+    key: 'setWidth',
+    value: function setWidth(width) {
+      if (Number.isInteger(width)) {
+        this.width = width;
+      }
+    }
+  }, {
+    key: 'setStyle',
+    value: function setStyle(style) {
+      if (!style) {
+        return;
+      }
+      switch (style.name) {
+        case 'S':
+          this.style = _util.AnnotationBorderStyleType.SOLID;
+          break;
+        case 'D':
+          this.style = _util.AnnotationBorderStyleType.DASHED;
+          break;
+        case 'B':
+          this.style = _util.AnnotationBorderStyleType.BEVELED;
+          break;
+        case 'I':
+          this.style = _util.AnnotationBorderStyleType.INSET;
+          break;
+        case 'U':
+          this.style = _util.AnnotationBorderStyleType.UNDERLINE;
+          break;
+        default:
+          break;
+      }
+    }
+  }, {
+    key: 'setDashArray',
+    value: function setDashArray(dashArray) {
+      if (Array.isArray(dashArray) && dashArray.length > 0) {
+        var isValid = true;
+        var allZeros = true;
+        for (var i = 0, len = dashArray.length; i < len; i++) {
+          var element = dashArray[i];
+          var validNumber = +element >= 0;
+          if (!validNumber) {
+            isValid = false;
+            break;
+          } else if (element > 0) {
+            allZeros = false;
+          }
+        }
+        if (isValid && !allZeros) {
+          this.dashArray = dashArray;
+        } else {
+          this.width = 0;
+        }
+      } else if (dashArray) {
+        this.width = 0;
+      }
+    }
+  }, {
+    key: 'setHorizontalCornerRadius',
+    value: function setHorizontalCornerRadius(radius) {
+      if (Number.isInteger(radius)) {
+        this.horizontalCornerRadius = radius;
+      }
+    }
+  }, {
+    key: 'setVerticalCornerRadius',
+    value: function setVerticalCornerRadius(radius) {
+      if (Number.isInteger(radius)) {
+        this.verticalCornerRadius = radius;
+      }
+    }
+  }]);
+
+  return AnnotationBorderStyle;
+}();
+
+var WidgetAnnotation = function (_Annotation) {
+  _inherits(WidgetAnnotation, _Annotation);
+
+  function WidgetAnnotation(params) {
+    _classCallCheck(this, WidgetAnnotation);
+
+    var _this2 = _possibleConstructorReturn(this, (WidgetAnnotation.__proto__ || Object.getPrototypeOf(WidgetAnnotation)).call(this, params));
+
+    var dict = params.dict;
+    var data = _this2.data;
+    data.annotationType = _util.AnnotationType.WIDGET;
+    data.fieldName = _this2._constructFieldName(dict);
+    data.fieldValue = (0, _util.getInheritableProperty)({
+      dict: dict,
+      key: 'V',
+      getArray: true
+    });
+    data.alternativeText = (0, _util.stringToPDFString)(dict.get('TU') || '');
+    data.defaultAppearance = (0, _util.getInheritableProperty)({
+      dict: dict,
+      key: 'DA'
+    }) || '';
+    var fieldType = (0, _util.getInheritableProperty)({
+      dict: dict,
+      key: 'FT'
+    });
+    data.fieldType = (0, _primitives.isName)(fieldType) ? fieldType.name : null;
+    _this2.fieldResources = (0, _util.getInheritableProperty)({
+      dict: dict,
+      key: 'DR'
+    }) || _primitives.Dict.empty;
+    data.fieldFlags = (0, _util.getInheritableProperty)({
+      dict: dict,
+      key: 'Ff'
+    });
+    if (!Number.isInteger(data.fieldFlags) || data.fieldFlags < 0) {
+      data.fieldFlags = 0;
+    }
+    data.readOnly = _this2.hasFieldFlag(_util.AnnotationFieldFlag.READONLY);
+    if (data.fieldType === 'Sig') {
+      _this2.setFlags(_util.AnnotationFlag.HIDDEN);
+    }
+    return _this2;
+  }
+
+  _createClass(WidgetAnnotation, [{
+    key: '_constructFieldName',
+    value: function _constructFieldName(dict) {
+      if (!dict.has('T') && !dict.has('Parent')) {
+        (0, _util.warn)('Unknown field name, falling back to empty field name.');
+        return '';
+      }
+      if (!dict.has('Parent')) {
+        return (0, _util.stringToPDFString)(dict.get('T'));
+      }
+      var fieldName = [];
+      if (dict.has('T')) {
+        fieldName.unshift((0, _util.stringToPDFString)(dict.get('T')));
+      }
+      var loopDict = dict;
+      while (loopDict.has('Parent')) {
+        loopDict = loopDict.get('Parent');
+        if (!(0, _primitives.isDict)(loopDict)) {
+          break;
+        }
+        if (loopDict.has('T')) {
+          fieldName.unshift((0, _util.stringToPDFString)(loopDict.get('T')));
+        }
+      }
+      return fieldName.join('.');
+    }
+  }, {
+    key: 'hasFieldFlag',
+    value: function hasFieldFlag(flag) {
+      return !!(this.data.fieldFlags & flag);
+    }
+  }, {
+    key: 'getOperatorList',
+    value: function getOperatorList(evaluator, task, renderForms) {
+      if (renderForms) {
+        return Promise.resolve(new _operator_list.OperatorList());
+      }
+      return _get(WidgetAnnotation.prototype.__proto__ || Object.getPrototypeOf(WidgetAnnotation.prototype), 'getOperatorList', this).call(this, evaluator, task, renderForms);
+    }
+  }]);
+
+  return WidgetAnnotation;
+}(Annotation);
+
+var TextWidgetAnnotation = function (_WidgetAnnotation) {
+  _inherits(TextWidgetAnnotation, _WidgetAnnotation);
+
+  function TextWidgetAnnotation(params) {
+    _classCallCheck(this, TextWidgetAnnotation);
+
+    var _this3 = _possibleConstructorReturn(this, (TextWidgetAnnotation.__proto__ || Object.getPrototypeOf(TextWidgetAnnotation)).call(this, params));
+
+    var dict = params.dict;
+    _this3.data.fieldValue = (0, _util.stringToPDFString)(_this3.data.fieldValue || '');
+    var alignment = (0, _util.getInheritableProperty)({
+      dict: dict,
+      key: 'Q'
+    });
+    if (!Number.isInteger(alignment) || alignment < 0 || alignment > 2) {
+      alignment = null;
+    }
+    _this3.data.textAlignment = alignment;
+    var maximumLength = (0, _util.getInheritableProperty)({
+      dict: dict,
+      key: 'MaxLen'
+    });
+    if (!Number.isInteger(maximumLength) || maximumLength < 0) {
+      maximumLength = null;
+    }
+    _this3.data.maxLen = maximumLength;
+    _this3.data.multiLine = _this3.hasFieldFlag(_util.AnnotationFieldFlag.MULTILINE);
+    _this3.data.comb = _this3.hasFieldFlag(_util.AnnotationFieldFlag.COMB) && !_this3.hasFieldFlag(_util.AnnotationFieldFlag.MULTILINE) && !_this3.hasFieldFlag(_util.AnnotationFieldFlag.PASSWORD) && !_this3.hasFieldFlag(_util.AnnotationFieldFlag.FILESELECT) && _this3.data.maxLen !== null;
+    return _this3;
+  }
+
+  _createClass(TextWidgetAnnotation, [{
+    key: 'getOperatorList',
+    value: function getOperatorList(evaluator, task, renderForms) {
+      if (renderForms || this.appearance) {
+        return _get(TextWidgetAnnotation.prototype.__proto__ || Object.getPrototypeOf(TextWidgetAnnotation.prototype), 'getOperatorList', this).call(this, evaluator, task, renderForms);
+      }
+      var operatorList = new _operator_list.OperatorList();
+      if (!this.data.defaultAppearance) {
+        return Promise.resolve(operatorList);
+      }
+      var stream = new _stream.Stream((0, _util.stringToBytes)(this.data.defaultAppearance));
+      return evaluator.getOperatorList({
+        stream: stream,
+        task: task,
+        resources: this.fieldResources,
+        operatorList: operatorList
+      }).then(function () {
+        return operatorList;
+      });
+    }
+  }]);
+
+  return TextWidgetAnnotation;
+}(WidgetAnnotation);
+
+var ButtonWidgetAnnotation = function (_WidgetAnnotation2) {
+  _inherits(ButtonWidgetAnnotation, _WidgetAnnotation2);
+
+  function ButtonWidgetAnnotation(params) {
+    _classCallCheck(this, ButtonWidgetAnnotation);
+
+    var _this4 = _possibleConstructorReturn(this, (ButtonWidgetAnnotation.__proto__ || Object.getPrototypeOf(ButtonWidgetAnnotation)).call(this, params));
+
+    _this4.data.checkBox = !_this4.hasFieldFlag(_util.AnnotationFieldFlag.RADIO) && !_this4.hasFieldFlag(_util.AnnotationFieldFlag.PUSHBUTTON);
+    _this4.data.radioButton = _this4.hasFieldFlag(_util.AnnotationFieldFlag.RADIO) && !_this4.hasFieldFlag(_util.AnnotationFieldFlag.PUSHBUTTON);
+    _this4.data.pushButton = _this4.hasFieldFlag(_util.AnnotationFieldFlag.PUSHBUTTON);
+    if (_this4.data.checkBox) {
+      _this4._processCheckBox(params);
+    } else if (_this4.data.radioButton) {
+      _this4._processRadioButton(params);
+    } else if (_this4.data.pushButton) {
+      _this4._processPushButton(params);
+    } else {
+      (0, _util.warn)('Invalid field flags for button widget annotation');
+    }
+    return _this4;
+  }
+
+  _createClass(ButtonWidgetAnnotation, [{
+    key: '_processCheckBox',
+    value: function _processCheckBox(params) {
+      if ((0, _primitives.isName)(this.data.fieldValue)) {
+        this.data.fieldValue = this.data.fieldValue.name;
+      }
+      var customAppearance = params.dict.get('AP');
+      if (!(0, _primitives.isDict)(customAppearance)) {
+        return;
+      }
+      var exportValueOptionsDict = customAppearance.get('D');
+      if (!(0, _primitives.isDict)(exportValueOptionsDict)) {
+        return;
+      }
+      var exportValues = exportValueOptionsDict.getKeys();
+      var hasCorrectOptionCount = exportValues.length === 2;
+      if (!hasCorrectOptionCount) {
+        return;
+      }
+      this.data.exportValue = exportValues[0] === 'Off' ? exportValues[1] : exportValues[0];
+    }
+  }, {
+    key: '_processRadioButton',
+    value: function _processRadioButton(params) {
+      this.data.fieldValue = this.data.buttonValue = null;
+      var fieldParent = params.dict.get('Parent');
+      if ((0, _primitives.isDict)(fieldParent) && fieldParent.has('V')) {
+        var fieldParentValue = fieldParent.get('V');
+        if ((0, _primitives.isName)(fieldParentValue)) {
+          this.data.fieldValue = fieldParentValue.name;
+        }
+      }
+      var appearanceStates = params.dict.get('AP');
+      if (!(0, _primitives.isDict)(appearanceStates)) {
+        return;
+      }
+      var normalAppearanceState = appearanceStates.get('N');
+      if (!(0, _primitives.isDict)(normalAppearanceState)) {
+        return;
+      }
+      var keys = normalAppearanceState.getKeys();
+      for (var i = 0, ii = keys.length; i < ii; i++) {
+        if (keys[i] !== 'Off') {
+          this.data.buttonValue = keys[i];
+          break;
+        }
+      }
+    }
+  }, {
+    key: '_processPushButton',
+    value: function _processPushButton(params) {
+      if (!params.dict.has('A')) {
+        (0, _util.warn)('Push buttons without action dictionaries are not supported');
+        return;
+      }
+      _obj.Catalog.parseDestDictionary({
+        destDict: params.dict,
+        resultObj: this.data,
+        docBaseUrl: params.pdfManager.docBaseUrl
+      });
+    }
+  }]);
+
+  return ButtonWidgetAnnotation;
+}(WidgetAnnotation);
+
+var ChoiceWidgetAnnotation = function (_WidgetAnnotation3) {
+  _inherits(ChoiceWidgetAnnotation, _WidgetAnnotation3);
+
+  function ChoiceWidgetAnnotation(params) {
+    _classCallCheck(this, ChoiceWidgetAnnotation);
+
+    var _this5 = _possibleConstructorReturn(this, (ChoiceWidgetAnnotation.__proto__ || Object.getPrototypeOf(ChoiceWidgetAnnotation)).call(this, params));
+
+    _this5.data.options = [];
+    var options = (0, _util.getInheritableProperty)({
+      dict: params.dict,
+      key: 'Opt'
+    });
+    if (Array.isArray(options)) {
+      var xref = params.xref;
+      for (var i = 0, ii = options.length; i < ii; i++) {
+        var option = xref.fetchIfRef(options[i]);
+        var isOptionArray = Array.isArray(option);
+        _this5.data.options[i] = {
+          exportValue: isOptionArray ? xref.fetchIfRef(option[0]) : option,
+          displayValue: (0, _util.stringToPDFString)(isOptionArray ? xref.fetchIfRef(option[1]) : option)
+        };
+      }
+    }
+    if (!Array.isArray(_this5.data.fieldValue)) {
+      _this5.data.fieldValue = [_this5.data.fieldValue];
+    }
+    _this5.data.combo = _this5.hasFieldFlag(_util.AnnotationFieldFlag.COMBO);
+    _this5.data.multiSelect = _this5.hasFieldFlag(_util.AnnotationFieldFlag.MULTISELECT);
+    return _this5;
+  }
+
+  return ChoiceWidgetAnnotation;
+}(WidgetAnnotation);
+
+var TextAnnotation = function (_Annotation2) {
+  _inherits(TextAnnotation, _Annotation2);
+
+  function TextAnnotation(parameters) {
+    _classCallCheck(this, TextAnnotation);
+
+    var DEFAULT_ICON_SIZE = 22;
+
+    var _this6 = _possibleConstructorReturn(this, (TextAnnotation.__proto__ || Object.getPrototypeOf(TextAnnotation)).call(this, parameters));
+
+    _this6.data.annotationType = _util.AnnotationType.TEXT;
+    if (_this6.data.hasAppearance) {
+      _this6.data.name = 'NoIcon';
+    } else {
+      _this6.data.rect[1] = _this6.data.rect[3] - DEFAULT_ICON_SIZE;
+      _this6.data.rect[2] = _this6.data.rect[0] + DEFAULT_ICON_SIZE;
+      _this6.data.name = parameters.dict.has('Name') ? parameters.dict.get('Name').name : 'Note';
+    }
+    _this6._preparePopup(parameters.dict);
+    return _this6;
+  }
+
+  return TextAnnotation;
+}(Annotation);
+
+var LinkAnnotation = function (_Annotation3) {
+  _inherits(LinkAnnotation, _Annotation3);
+
+  function LinkAnnotation(params) {
+    _classCallCheck(this, LinkAnnotation);
+
+    var _this7 = _possibleConstructorReturn(this, (LinkAnnotation.__proto__ || Object.getPrototypeOf(LinkAnnotation)).call(this, params));
+
+    _this7.data.annotationType = _util.AnnotationType.LINK;
+    _obj.Catalog.parseDestDictionary({
+      destDict: params.dict,
+      resultObj: _this7.data,
+      docBaseUrl: params.pdfManager.docBaseUrl
+    });
+    return _this7;
+  }
+
+  return LinkAnnotation;
+}(Annotation);
+
+var PopupAnnotation = function (_Annotation4) {
+  _inherits(PopupAnnotation, _Annotation4);
+
+  function PopupAnnotation(parameters) {
+    _classCallCheck(this, PopupAnnotation);
+
+    var _this8 = _possibleConstructorReturn(this, (PopupAnnotation.__proto__ || Object.getPrototypeOf(PopupAnnotation)).call(this, parameters));
+
+    _this8.data.annotationType = _util.AnnotationType.POPUP;
+    var dict = parameters.dict;
+    var parentItem = dict.get('Parent');
+    if (!parentItem) {
+      (0, _util.warn)('Popup annotation has a missing or invalid parent annotation.');
+      return _possibleConstructorReturn(_this8);
+    }
+    var parentSubtype = parentItem.get('Subtype');
+    _this8.data.parentType = (0, _primitives.isName)(parentSubtype) ? parentSubtype.name : null;
+    _this8.data.parentId = dict.getRaw('Parent').toString();
+    _this8.data.title = (0, _util.stringToPDFString)(parentItem.get('T') || '');
+    _this8.data.contents = (0, _util.stringToPDFString)(parentItem.get('Contents') || '');
+    if (!parentItem.has('C')) {
+      _this8.data.color = null;
+    } else {
+      _this8.setColor(parentItem.getArray('C'));
+      _this8.data.color = _this8.color;
+    }
+    if (!_this8.viewable) {
+      var parentFlags = parentItem.get('F');
+      if (_this8._isViewable(parentFlags)) {
+        _this8.setFlags(parentFlags);
+      }
+    }
+    return _this8;
+  }
+
+  return PopupAnnotation;
+}(Annotation);
+
+var LineAnnotation = function (_Annotation5) {
+  _inherits(LineAnnotation, _Annotation5);
+
+  function LineAnnotation(parameters) {
+    _classCallCheck(this, LineAnnotation);
+
+    var _this9 = _possibleConstructorReturn(this, (LineAnnotation.__proto__ || Object.getPrototypeOf(LineAnnotation)).call(this, parameters));
+
+    _this9.data.annotationType = _util.AnnotationType.LINE;
+    var dict = parameters.dict;
+    _this9.data.lineCoordinates = _util.Util.normalizeRect(dict.getArray('L'));
+    _this9._preparePopup(dict);
+    return _this9;
+  }
+
+  return LineAnnotation;
+}(Annotation);
+
+var SquareAnnotation = function (_Annotation6) {
+  _inherits(SquareAnnotation, _Annotation6);
+
+  function SquareAnnotation(parameters) {
+    _classCallCheck(this, SquareAnnotation);
+
+    var _this10 = _possibleConstructorReturn(this, (SquareAnnotation.__proto__ || Object.getPrototypeOf(SquareAnnotation)).call(this, parameters));
+
+    _this10.data.annotationType = _util.AnnotationType.SQUARE;
+    _this10._preparePopup(parameters.dict);
+    return _this10;
+  }
+
+  return SquareAnnotation;
+}(Annotation);
+
+var CircleAnnotation = function (_Annotation7) {
+  _inherits(CircleAnnotation, _Annotation7);
+
+  function CircleAnnotation(parameters) {
+    _classCallCheck(this, CircleAnnotation);
+
+    var _this11 = _possibleConstructorReturn(this, (CircleAnnotation.__proto__ || Object.getPrototypeOf(CircleAnnotation)).call(this, parameters));
+
+    _this11.data.annotationType = _util.AnnotationType.CIRCLE;
+    _this11._preparePopup(parameters.dict);
+    return _this11;
+  }
+
+  return CircleAnnotation;
+}(Annotation);
+
+var PolylineAnnotation = function (_Annotation8) {
+  _inherits(PolylineAnnotation, _Annotation8);
+
+  function PolylineAnnotation(parameters) {
+    _classCallCheck(this, PolylineAnnotation);
+
+    var _this12 = _possibleConstructorReturn(this, (PolylineAnnotation.__proto__ || Object.getPrototypeOf(PolylineAnnotation)).call(this, parameters));
+
+    _this12.data.annotationType = _util.AnnotationType.POLYLINE;
+    var dict = parameters.dict;
+    var rawVertices = dict.getArray('Vertices');
+    _this12.data.vertices = [];
+    for (var i = 0, ii = rawVertices.length; i < ii; i += 2) {
+      _this12.data.vertices.push({
+        x: rawVertices[i],
+        y: rawVertices[i + 1]
+      });
+    }
+    _this12._preparePopup(dict);
+    return _this12;
+  }
+
+  return PolylineAnnotation;
+}(Annotation);
+
+var PolygonAnnotation = function (_PolylineAnnotation) {
+  _inherits(PolygonAnnotation, _PolylineAnnotation);
+
+  function PolygonAnnotation(parameters) {
+    _classCallCheck(this, PolygonAnnotation);
+
+    var _this13 = _possibleConstructorReturn(this, (PolygonAnnotation.__proto__ || Object.getPrototypeOf(PolygonAnnotation)).call(this, parameters));
+
+    _this13.data.annotationType = _util.AnnotationType.POLYGON;
+    return _this13;
+  }
+
+  return PolygonAnnotation;
+}(PolylineAnnotation);
+
+var InkAnnotation = function (_Annotation9) {
+  _inherits(InkAnnotation, _Annotation9);
+
+  function InkAnnotation(parameters) {
+    _classCallCheck(this, InkAnnotation);
+
+    var _this14 = _possibleConstructorReturn(this, (InkAnnotation.__proto__ || Object.getPrototypeOf(InkAnnotation)).call(this, parameters));
+
+    _this14.data.annotationType = _util.AnnotationType.INK;
+    var dict = parameters.dict;
+    var xref = parameters.xref;
+    var originalInkLists = dict.getArray('InkList');
+    _this14.data.inkLists = [];
+    for (var i = 0, ii = originalInkLists.length; i < ii; ++i) {
+      _this14.data.inkLists.push([]);
+      for (var j = 0, jj = originalInkLists[i].length; j < jj; j += 2) {
+        _this14.data.inkLists[i].push({
+          x: xref.fetchIfRef(originalInkLists[i][j]),
+          y: xref.fetchIfRef(originalInkLists[i][j + 1])
+        });
+      }
+    }
+    _this14._preparePopup(dict);
+    return _this14;
+  }
+
+  return InkAnnotation;
+}(Annotation);
+
+var HighlightAnnotation = function (_Annotation10) {
+  _inherits(HighlightAnnotation, _Annotation10);
+
+  function HighlightAnnotation(parameters) {
+    _classCallCheck(this, HighlightAnnotation);
+
+    var _this15 = _possibleConstructorReturn(this, (HighlightAnnotation.__proto__ || Object.getPrototypeOf(HighlightAnnotation)).call(this, parameters));
+
+    _this15.data.annotationType = _util.AnnotationType.HIGHLIGHT;
+    _this15._preparePopup(parameters.dict);
+    return _this15;
+  }
+
+  return HighlightAnnotation;
+}(Annotation);
+
+var UnderlineAnnotation = function (_Annotation11) {
+  _inherits(UnderlineAnnotation, _Annotation11);
+
+  function UnderlineAnnotation(parameters) {
+    _classCallCheck(this, UnderlineAnnotation);
+
+    var _this16 = _possibleConstructorReturn(this, (UnderlineAnnotation.__proto__ || Object.getPrototypeOf(UnderlineAnnotation)).call(this, parameters));
+
+    _this16.data.annotationType = _util.AnnotationType.UNDERLINE;
+    _this16._preparePopup(parameters.dict);
+    return _this16;
+  }
+
+  return UnderlineAnnotation;
+}(Annotation);
+
+var SquigglyAnnotation = function (_Annotation12) {
+  _inherits(SquigglyAnnotation, _Annotation12);
+
+  function SquigglyAnnotation(parameters) {
+    _classCallCheck(this, SquigglyAnnotation);
+
+    var _this17 = _possibleConstructorReturn(this, (SquigglyAnnotation.__proto__ || Object.getPrototypeOf(SquigglyAnnotation)).call(this, parameters));
+
+    _this17.data.annotationType = _util.AnnotationType.SQUIGGLY;
+    _this17._preparePopup(parameters.dict);
+    return _this17;
+  }
+
+  return SquigglyAnnotation;
+}(Annotation);
+
+var StrikeOutAnnotation = function (_Annotation13) {
+  _inherits(StrikeOutAnnotation, _Annotation13);
+
+  function StrikeOutAnnotation(parameters) {
+    _classCallCheck(this, StrikeOutAnnotation);
+
+    var _this18 = _possibleConstructorReturn(this, (StrikeOutAnnotation.__proto__ || Object.getPrototypeOf(StrikeOutAnnotation)).call(this, parameters));
+
+    _this18.data.annotationType = _util.AnnotationType.STRIKEOUT;
+    _this18._preparePopup(parameters.dict);
+    return _this18;
+  }
+
+  return StrikeOutAnnotation;
+}(Annotation);
+
+var StampAnnotation = function (_Annotation14) {
+  _inherits(StampAnnotation, _Annotation14);
+
+  function StampAnnotation(parameters) {
+    _classCallCheck(this, StampAnnotation);
+
+    var _this19 = _possibleConstructorReturn(this, (StampAnnotation.__proto__ || Object.getPrototypeOf(StampAnnotation)).call(this, parameters));
+
+    _this19.data.annotationType = _util.AnnotationType.STAMP;
+    _this19._preparePopup(parameters.dict);
+    return _this19;
+  }
+
+  return StampAnnotation;
+}(Annotation);
+
+var FileAttachmentAnnotation = function (_Annotation15) {
+  _inherits(FileAttachmentAnnotation, _Annotation15);
+
+  function FileAttachmentAnnotation(parameters) {
+    _classCallCheck(this, FileAttachmentAnnotation);
+
+    var _this20 = _possibleConstructorReturn(this, (FileAttachmentAnnotation.__proto__ || Object.getPrototypeOf(FileAttachmentAnnotation)).call(this, parameters));
+
+    var file = new _obj.FileSpec(parameters.dict.get('FS'), parameters.xref);
+    _this20.data.annotationType = _util.AnnotationType.FILEATTACHMENT;
+    _this20.data.file = file.serializable;
+    _this20._preparePopup(parameters.dict);
+    return _this20;
+  }
+
+  return FileAttachmentAnnotation;
+}(Annotation);
+
+exports.Annotation = Annotation;
+exports.AnnotationBorderStyle = AnnotationBorderStyle;
+exports.AnnotationFactory = AnnotationFactory;
+
+/***/ }),
+/* 153 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.OperatorList = undefined;
+
+var _util = __w_pdfjs_require__(2);
+
+var QueueOptimizer = function QueueOptimizerClosure() {
+  function addState(parentState, pattern, checkFn, iterateFn, processFn) {
+    var state = parentState;
+    for (var i = 0, ii = pattern.length - 1; i < ii; i++) {
+      var item = pattern[i];
+      state = state[item] || (state[item] = []);
+    }
+    state[pattern[pattern.length - 1]] = {
+      checkFn: checkFn,
+      iterateFn: iterateFn,
+      processFn: processFn
+    };
+  }
+  function handlePaintSolidColorImageMask(iFirstSave, count, fnArray, argsArray) {
+    var iFirstPIMXO = iFirstSave + 2;
+    for (var i = 0; i < count; i++) {
+      var arg = argsArray[iFirstPIMXO + 4 * i];
+      var imageMask = arg.length === 1 && arg[0];
+      if (imageMask && imageMask.width === 1 && imageMask.height === 1 && (!imageMask.data.length || imageMask.data.length === 1 && imageMask.data[0] === 0)) {
+        fnArray[iFirstPIMXO + 4 * i] = _util.OPS.paintSolidColorImageMask;
+        continue;
+      }
+      break;
+    }
+    return count - i;
+  }
+  var InitialState = [];
+  addState(InitialState, [_util.OPS.save, _util.OPS.transform, _util.OPS.paintInlineImageXObject, _util.OPS.restore], null, function iterateInlineImageGroup(context, i) {
+    var fnArray = context.fnArray;
+    var iFirstSave = context.iCurr - 3;
+    var pos = (i - iFirstSave) % 4;
+    switch (pos) {
+      case 0:
+        return fnArray[i] === _util.OPS.save;
+      case 1:
+        return fnArray[i] === _util.OPS.transform;
+      case 2:
+        return fnArray[i] === _util.OPS.paintInlineImageXObject;
+      case 3:
+        return fnArray[i] === _util.OPS.restore;
+    }
+  }, function foundInlineImageGroup(context, i) {
+    var MIN_IMAGES_IN_INLINE_IMAGES_BLOCK = 10;
+    var MAX_IMAGES_IN_INLINE_IMAGES_BLOCK = 200;
+    var MAX_WIDTH = 1000;
+    var IMAGE_PADDING = 1;
+    var fnArray = context.fnArray,
+        argsArray = context.argsArray;
+    var curr = context.iCurr;
+    var iFirstSave = curr - 3;
+    var iFirstTransform = curr - 2;
+    var iFirstPIIXO = curr - 1;
+    var count = Math.min(Math.floor((i - iFirstSave) / 4), MAX_IMAGES_IN_INLINE_IMAGES_BLOCK);
+    if (count < MIN_IMAGES_IN_INLINE_IMAGES_BLOCK) {
+      return i - (i - iFirstSave) % 4;
+    }
+    var maxX = 0;
+    var map = [],
+        maxLineHeight = 0;
+    var currentX = IMAGE_PADDING,
+        currentY = IMAGE_PADDING;
+    var q;
+    for (q = 0; q < count; q++) {
+      var transform = argsArray[iFirstTransform + (q << 2)];
+      var img = argsArray[iFirstPIIXO + (q << 2)][0];
+      if (currentX + img.width > MAX_WIDTH) {
+        maxX = Math.max(maxX, currentX);
+        currentY += maxLineHeight + 2 * IMAGE_PADDING;
+        currentX = 0;
+        maxLineHeight = 0;
+      }
+      map.push({
+        transform: transform,
+        x: currentX,
+        y: currentY,
+        w: img.width,
+        h: img.height
+      });
+      currentX += img.width + 2 * IMAGE_PADDING;
+      maxLineHeight = Math.max(maxLineHeight, img.height);
+    }
+    var imgWidth = Math.max(maxX, currentX) + IMAGE_PADDING;
+    var imgHeight = currentY + maxLineHeight + IMAGE_PADDING;
+    var imgData = new Uint8ClampedArray(imgWidth * imgHeight * 4);
+    var imgRowSize = imgWidth << 2;
+    for (q = 0; q < count; q++) {
+      var data = argsArray[iFirstPIIXO + (q << 2)][0].data;
+      var rowSize = map[q].w << 2;
+      var dataOffset = 0;
+      var offset = map[q].x + map[q].y * imgWidth << 2;
+      imgData.set(data.subarray(0, rowSize), offset - imgRowSize);
+      for (var k = 0, kk = map[q].h; k < kk; k++) {
+        imgData.set(data.subarray(dataOffset, dataOffset + rowSize), offset);
+        dataOffset += rowSize;
+        offset += imgRowSize;
+      }
+      imgData.set(data.subarray(dataOffset - rowSize, dataOffset), offset);
+      while (offset >= 0) {
+        data[offset - 4] = data[offset];
+        data[offset - 3] = data[offset + 1];
+        data[offset - 2] = data[offset + 2];
+        data[offset - 1] = data[offset + 3];
+        data[offset + rowSize] = data[offset + rowSize - 4];
+        data[offset + rowSize + 1] = data[offset + rowSize - 3];
+        data[offset + rowSize + 2] = data[offset + rowSize - 2];
+        data[offset + rowSize + 3] = data[offset + rowSize - 1];
+        offset -= imgRowSize;
+      }
+    }
+    fnArray.splice(iFirstSave, count * 4, _util.OPS.paintInlineImageXObjectGroup);
+    argsArray.splice(iFirstSave, count * 4, [{
+      width: imgWidth,
+      height: imgHeight,
+      kind: _util.ImageKind.RGBA_32BPP,
+      data: imgData
+    }, map]);
+    return iFirstSave + 1;
+  });
+  addState(InitialState, [_util.OPS.save, _util.OPS.transform, _util.OPS.paintImageMaskXObject, _util.OPS.restore], null, function iterateImageMaskGroup(context, i) {
+    var fnArray = context.fnArray;
+    var iFirstSave = context.iCurr - 3;
+    var pos = (i - iFirstSave) % 4;
+    switch (pos) {
+      case 0:
+        return fnArray[i] === _util.OPS.save;
+      case 1:
+        return fnArray[i] === _util.OPS.transform;
+      case 2:
+        return fnArray[i] === _util.OPS.paintImageMaskXObject;
+      case 3:
+        return fnArray[i] === _util.OPS.restore;
+    }
+  }, function foundImageMaskGroup(context, i) {
+    var MIN_IMAGES_IN_MASKS_BLOCK = 10;
+    var MAX_IMAGES_IN_MASKS_BLOCK = 100;
+    var MAX_SAME_IMAGES_IN_MASKS_BLOCK = 1000;
+    var fnArray = context.fnArray,
+        argsArray = context.argsArray;
+    var curr = context.iCurr;
+    var iFirstSave = curr - 3;
+    var iFirstTransform = curr - 2;
+    var iFirstPIMXO = curr - 1;
+    var count = Math.floor((i - iFirstSave) / 4);
+    count = handlePaintSolidColorImageMask(iFirstSave, count, fnArray, argsArray);
+    if (count < MIN_IMAGES_IN_MASKS_BLOCK) {
+      return i - (i - iFirstSave) % 4;
+    }
+    var q;
+    var isSameImage = false;
+    var iTransform, transformArgs;
+    var firstPIMXOArg0 = argsArray[iFirstPIMXO][0];
+    if (argsArray[iFirstTransform][1] === 0 && argsArray[iFirstTransform][2] === 0) {
+      isSameImage = true;
+      var firstTransformArg0 = argsArray[iFirstTransform][0];
+      var firstTransformArg3 = argsArray[iFirstTransform][3];
+      iTransform = iFirstTransform + 4;
+      var iPIMXO = iFirstPIMXO + 4;
+      for (q = 1; q < count; q++, iTransform += 4, iPIMXO += 4) {
+        transformArgs = argsArray[iTransform];
+        if (argsArray[iPIMXO][0] !== firstPIMXOArg0 || transformArgs[0] !== firstTransformArg0 || transformArgs[1] !== 0 || transformArgs[2] !== 0 || transformArgs[3] !== firstTransformArg3) {
+          if (q < MIN_IMAGES_IN_MASKS_BLOCK) {
+            isSameImage = false;
+          } else {
+            count = q;
+          }
+          break;
+        }
+      }
+    }
+    if (isSameImage) {
+      count = Math.min(count, MAX_SAME_IMAGES_IN_MASKS_BLOCK);
+      var positions = new Float32Array(count * 2);
+      iTransform = iFirstTransform;
+      for (q = 0; q < count; q++, iTransform += 4) {
+        transformArgs = argsArray[iTransform];
+        positions[q << 1] = transformArgs[4];
+        positions[(q << 1) + 1] = transformArgs[5];
+      }
+      fnArray.splice(iFirstSave, count * 4, _util.OPS.paintImageMaskXObjectRepeat);
+      argsArray.splice(iFirstSave, count * 4, [firstPIMXOArg0, firstTransformArg0, firstTransformArg3, positions]);
+    } else {
+      count = Math.min(count, MAX_IMAGES_IN_MASKS_BLOCK);
+      var images = [];
+      for (q = 0; q < count; q++) {
+        transformArgs = argsArray[iFirstTransform + (q << 2)];
+        var maskParams = argsArray[iFirstPIMXO + (q << 2)][0];
+        images.push({
+          data: maskParams.data,
+          width: maskParams.width,
+          height: maskParams.height,
+          transform: transformArgs
+        });
+      }
+      fnArray.splice(iFirstSave, count * 4, _util.OPS.paintImageMaskXObjectGroup);
+      argsArray.splice(iFirstSave, count * 4, [images]);
+    }
+    return iFirstSave + 1;
+  });
+  addState(InitialState, [_util.OPS.save, _util.OPS.transform, _util.OPS.paintImageXObject, _util.OPS.restore], function (context) {
+    var argsArray = context.argsArray;
+    var iFirstTransform = context.iCurr - 2;
+    return argsArray[iFirstTransform][1] === 0 && argsArray[iFirstTransform][2] === 0;
+  }, function (context, i) {
+    var fnArray = context.fnArray,
+        argsArray = context.argsArray;
+    var iFirstSave = context.iCurr - 3;
+    var pos = (i - iFirstSave) % 4;
+    switch (pos) {
+      case 0:
+        return fnArray[i] === _util.OPS.save;
+      case 1:
+        if (fnArray[i] !== _util.OPS.transform) {
+          return false;
+        }
+        var iFirstTransform = context.iCurr - 2;
+        var firstTransformArg0 = argsArray[iFirstTransform][0];
+        var firstTransformArg3 = argsArray[iFirstTransform][3];
+        if (argsArray[i][0] !== firstTransformArg0 || argsArray[i][1] !== 0 || argsArray[i][2] !== 0 || argsArray[i][3] !== firstTransformArg3) {
+          return false;
+        }
+        return true;
+      case 2:
+        if (fnArray[i] !== _util.OPS.paintImageXObject) {
+          return false;
+        }
+        var iFirstPIXO = context.iCurr - 1;
+        var firstPIXOArg0 = argsArray[iFirstPIXO][0];
+        if (argsArray[i][0] !== firstPIXOArg0) {
+          return false;
+        }
+        return true;
+      case 3:
+        return fnArray[i] === _util.OPS.restore;
+    }
+  }, function (context, i) {
+    var MIN_IMAGES_IN_BLOCK = 3;
+    var MAX_IMAGES_IN_BLOCK = 1000;
+    var fnArray = context.fnArray,
+        argsArray = context.argsArray;
+    var curr = context.iCurr;
+    var iFirstSave = curr - 3;
+    var iFirstTransform = curr - 2;
+    var iFirstPIXO = curr - 1;
+    var firstPIXOArg0 = argsArray[iFirstPIXO][0];
+    var firstTransformArg0 = argsArray[iFirstTransform][0];
+    var firstTransformArg3 = argsArray[iFirstTransform][3];
+    var count = Math.min(Math.floor((i - iFirstSave) / 4), MAX_IMAGES_IN_BLOCK);
+    if (count < MIN_IMAGES_IN_BLOCK) {
+      return i - (i - iFirstSave) % 4;
+    }
+    var positions = new Float32Array(count * 2);
+    var iTransform = iFirstTransform;
+    for (var q = 0; q < count; q++, iTransform += 4) {
+      var transformArgs = argsArray[iTransform];
+      positions[q << 1] = transformArgs[4];
+      positions[(q << 1) + 1] = transformArgs[5];
+    }
+    var args = [firstPIXOArg0, firstTransformArg0, firstTransformArg3, positions];
+    fnArray.splice(iFirstSave, count * 4, _util.OPS.paintImageXObjectRepeat);
+    argsArray.splice(iFirstSave, count * 4, args);
+    return iFirstSave + 1;
+  });
+  addState(InitialState, [_util.OPS.beginText, _util.OPS.setFont, _util.OPS.setTextMatrix, _util.OPS.showText, _util.OPS.endText], null, function (context, i) {
+    var fnArray = context.fnArray,
+        argsArray = context.argsArray;
+    var iFirstSave = context.iCurr - 4;
+    var pos = (i - iFirstSave) % 5;
+    switch (pos) {
+      case 0:
+        return fnArray[i] === _util.OPS.beginText;
+      case 1:
+        return fnArray[i] === _util.OPS.setFont;
+      case 2:
+        return fnArray[i] === _util.OPS.setTextMatrix;
+      case 3:
+        if (fnArray[i] !== _util.OPS.showText) {
+          return false;
+        }
+        var iFirstSetFont = context.iCurr - 3;
+        var firstSetFontArg0 = argsArray[iFirstSetFont][0];
+        var firstSetFontArg1 = argsArray[iFirstSetFont][1];
+        if (argsArray[i][0] !== firstSetFontArg0 || argsArray[i][1] !== firstSetFontArg1) {
+          return false;
+        }
+        return true;
+      case 4:
+        return fnArray[i] === _util.OPS.endText;
+    }
+  }, function (context, i) {
+    var MIN_CHARS_IN_BLOCK = 3;
+    var MAX_CHARS_IN_BLOCK = 1000;
+    var fnArray = context.fnArray,
+        argsArray = context.argsArray;
+    var curr = context.iCurr;
+    var iFirstBeginText = curr - 4;
+    var iFirstSetFont = curr - 3;
+    var iFirstSetTextMatrix = curr - 2;
+    var iFirstShowText = curr - 1;
+    var iFirstEndText = curr;
+    var firstSetFontArg0 = argsArray[iFirstSetFont][0];
+    var firstSetFontArg1 = argsArray[iFirstSetFont][1];
+    var count = Math.min(Math.floor((i - iFirstBeginText) / 5), MAX_CHARS_IN_BLOCK);
+    if (count < MIN_CHARS_IN_BLOCK) {
+      return i - (i - iFirstBeginText) % 5;
+    }
+    var iFirst = iFirstBeginText;
+    if (iFirstBeginText >= 4 && fnArray[iFirstBeginText - 4] === fnArray[iFirstSetFont] && fnArray[iFirstBeginText - 3] === fnArray[iFirstSetTextMatrix] && fnArray[iFirstBeginText - 2] === fnArray[iFirstShowText] && fnArray[iFirstBeginText - 1] === fnArray[iFirstEndText] && argsArray[iFirstBeginText - 4][0] === firstSetFontArg0 && argsArray[iFirstBeginText - 4][1] === firstSetFontArg1) {
+      count++;
+      iFirst -= 5;
+    }
+    var iEndText = iFirst + 4;
+    for (var q = 1; q < count; q++) {
+      fnArray.splice(iEndText, 3);
+      argsArray.splice(iEndText, 3);
+      iEndText += 2;
+    }
+    return iEndText + 1;
+  });
+  function QueueOptimizer(queue) {
+    this.queue = queue;
+    this.state = null;
+    this.context = {
+      iCurr: 0,
+      fnArray: queue.fnArray,
+      argsArray: queue.argsArray
+    };
+    this.match = null;
+    this.lastProcessed = 0;
+  }
+  QueueOptimizer.prototype = {
+    _optimize: function _optimize() {
+      var fnArray = this.queue.fnArray;
+      var i = this.lastProcessed,
+          ii = fnArray.length;
+      var state = this.state;
+      var match = this.match;
+      if (!state && !match && i + 1 === ii && !InitialState[fnArray[i]]) {
+        this.lastProcessed = ii;
+        return;
+      }
+      var context = this.context;
+      while (i < ii) {
+        if (match) {
+          var iterate = (0, match.iterateFn)(context, i);
+          if (iterate) {
+            i++;
+            continue;
+          }
+          i = (0, match.processFn)(context, i + 1);
+          ii = fnArray.length;
+          match = null;
+          state = null;
+          if (i >= ii) {
+            break;
+          }
+        }
+        state = (state || InitialState)[fnArray[i]];
+        if (!state || Array.isArray(state)) {
+          i++;
+          continue;
+        }
+        context.iCurr = i;
+        i++;
+        if (state.checkFn && !(0, state.checkFn)(context)) {
+          state = null;
+          continue;
+        }
+        match = state;
+        state = null;
+      }
+      this.state = state;
+      this.match = match;
+      this.lastProcessed = i;
+    },
+    push: function push(fn, args) {
+      this.queue.fnArray.push(fn);
+      this.queue.argsArray.push(args);
+      this._optimize();
+    },
+    flush: function flush() {
+      while (this.match) {
+        var length = this.queue.fnArray.length;
+        this.lastProcessed = (0, this.match.processFn)(this.context, length);
+        this.match = null;
+        this.state = null;
+        this._optimize();
+      }
+    },
+    reset: function reset() {
+      this.state = null;
+      this.match = null;
+      this.lastProcessed = 0;
+    }
+  };
+  return QueueOptimizer;
+}();
+var NullOptimizer = function NullOptimizerClosure() {
+  function NullOptimizer(queue) {
+    this.queue = queue;
+  }
+  NullOptimizer.prototype = {
+    push: function push(fn, args) {
+      this.queue.fnArray.push(fn);
+      this.queue.argsArray.push(args);
+    },
+    flush: function flush() {}
+  };
+  return NullOptimizer;
+}();
+var OperatorList = function OperatorListClosure() {
+  var CHUNK_SIZE = 1000;
+  var CHUNK_SIZE_ABOUT = CHUNK_SIZE - 5;
+  function getTransfers(queue) {
+    var transfers = [];
+    var fnArray = queue.fnArray,
+        argsArray = queue.argsArray;
+    for (var i = 0, ii = queue.length; i < ii; i++) {
+      switch (fnArray[i]) {
+        case _util.OPS.paintInlineImageXObject:
+        case _util.OPS.paintInlineImageXObjectGroup:
+        case _util.OPS.paintImageMaskXObject:
+          var arg = argsArray[i][0];
+          ;
+          if (!arg.cached) {
+            transfers.push(arg.data.buffer);
+          }
+          break;
+      }
+    }
+    return transfers;
+  }
+  function OperatorList(intent, messageHandler, pageIndex) {
+    this.messageHandler = messageHandler;
+    this.fnArray = [];
+    this.argsArray = [];
+    if (messageHandler && this.intent !== 'oplist') {
+      this.optimizer = new QueueOptimizer(this);
+    } else {
+      this.optimizer = new NullOptimizer(this);
+    }
+    this.dependencies = Object.create(null);
+    this._totalLength = 0;
+    this.pageIndex = pageIndex;
+    this.intent = intent;
+    this.weight = 0;
+  }
+  OperatorList.prototype = {
+    get length() {
+      return this.argsArray.length;
+    },
+    get totalLength() {
+      return this._totalLength + this.length;
+    },
+    addOp: function addOp(fn, args) {
+      this.optimizer.push(fn, args);
+      this.weight++;
+      if (this.messageHandler) {
+        if (this.weight >= CHUNK_SIZE) {
+          this.flush();
+        } else if (this.weight >= CHUNK_SIZE_ABOUT && (fn === _util.OPS.restore || fn === _util.OPS.endText)) {
+          this.flush();
+        }
+      }
+    },
+    addDependency: function addDependency(dependency) {
+      if (dependency in this.dependencies) {
+        return;
+      }
+      this.dependencies[dependency] = true;
+      this.addOp(_util.OPS.dependency, [dependency]);
+    },
+    addDependencies: function addDependencies(dependencies) {
+      for (var key in dependencies) {
+        this.addDependency(key);
+      }
+    },
+    addOpList: function addOpList(opList) {
+      Object.assign(this.dependencies, opList.dependencies);
+      for (var i = 0, ii = opList.length; i < ii; i++) {
+        this.addOp(opList.fnArray[i], opList.argsArray[i]);
+      }
+    },
+    getIR: function getIR() {
+      return {
+        fnArray: this.fnArray,
+        argsArray: this.argsArray,
+        length: this.length
+      };
+    },
+    flush: function flush(lastChunk) {
+      this.optimizer.flush();
+      var transfers = getTransfers(this);
+      var length = this.length;
+      this._totalLength += length;
+      this.messageHandler.send('RenderPageChunk', {
+        operatorList: {
+          fnArray: this.fnArray,
+          argsArray: this.argsArray,
+          lastChunk: lastChunk,
+          length: length
+        },
+        pageIndex: this.pageIndex,
+        intent: this.intent
+      }, transfers);
+      this.dependencies = Object.create(null);
+      this.fnArray.length = 0;
+      this.argsArray.length = 0;
+      this.weight = 0;
+      this.optimizer.reset();
+    }
+  };
+  return OperatorList;
+}();
+exports.OperatorList = OperatorList;
+
+/***/ }),
+/* 154 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.PartialEvaluator = undefined;
+
+var _regenerator = __w_pdfjs_require__(131);
+
+var _regenerator2 = _interopRequireDefault(_regenerator);
+
+var _util = __w_pdfjs_require__(2);
+
+var _cmap = __w_pdfjs_require__(155);
+
+var _stream = __w_pdfjs_require__(140);
+
+var _primitives = __w_pdfjs_require__(138);
+
+var _fonts = __w_pdfjs_require__(156);
+
+var _encodings = __w_pdfjs_require__(159);
+
+var _unicode = __w_pdfjs_require__(162);
+
+var _standard_fonts = __w_pdfjs_require__(161);
+
+var _pattern = __w_pdfjs_require__(165);
+
+var _parser = __w_pdfjs_require__(139);
+
+var _bidi = __w_pdfjs_require__(166);
+
+var _colorspace = __w_pdfjs_require__(151);
+
+var _glyphlist = __w_pdfjs_require__(160);
+
+var _metrics = __w_pdfjs_require__(167);
+
+var _function = __w_pdfjs_require__(168);
+
+var _jpeg_stream = __w_pdfjs_require__(146);
+
+var _murmurhash = __w_pdfjs_require__(170);
+
+var _operator_list = __w_pdfjs_require__(153);
+
+var _image = __w_pdfjs_require__(171);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
+
+var PartialEvaluator = function PartialEvaluatorClosure() {
+  var DefaultPartialEvaluatorOptions = {
+    forceDataSchema: false,
+    maxImageSize: -1,
+    disableFontFace: false,
+    nativeImageDecoderSupport: _util.NativeImageDecoding.DECODE,
+    ignoreErrors: false,
+    isEvalSupported: true
+  };
+  function NativeImageDecoder(_ref) {
+    var xref = _ref.xref,
+        resources = _ref.resources,
+        handler = _ref.handler,
+        _ref$forceDataSchema = _ref.forceDataSchema,
+        forceDataSchema = _ref$forceDataSchema === undefined ? false : _ref$forceDataSchema,
+        pdfFunctionFactory = _ref.pdfFunctionFactory;
+
+    this.xref = xref;
+    this.resources = resources;
+    this.handler = handler;
+    this.forceDataSchema = forceDataSchema;
+    this.pdfFunctionFactory = pdfFunctionFactory;
+  }
+  NativeImageDecoder.prototype = {
+    canDecode: function canDecode(image) {
+      return image instanceof _jpeg_stream.JpegStream && NativeImageDecoder.isDecodable(image, this.xref, this.resources, this.pdfFunctionFactory);
+    },
+    decode: function decode(image) {
+      var dict = image.dict;
+      var colorSpace = dict.get('ColorSpace', 'CS');
+      colorSpace = _colorspace.ColorSpace.parse(colorSpace, this.xref, this.resources, this.pdfFunctionFactory);
+      return this.handler.sendWithPromise('JpegDecode', [image.getIR(this.forceDataSchema), colorSpace.numComps]).then(function (_ref2) {
+        var data = _ref2.data,
+            width = _ref2.width,
+            height = _ref2.height;
+
+        return new _stream.Stream(data, 0, data.length, image.dict);
+      });
+    }
+  };
+  NativeImageDecoder.isSupported = function (image, xref, res, pdfFunctionFactory) {
+    var dict = image.dict;
+    if (dict.has('DecodeParms') || dict.has('DP')) {
+      return false;
+    }
+    var cs = _colorspace.ColorSpace.parse(dict.get('ColorSpace', 'CS'), xref, res, pdfFunctionFactory);
+    return (cs.name === 'DeviceGray' || cs.name === 'DeviceRGB') && cs.isDefaultDecode(dict.getArray('Decode', 'D'));
+  };
+  NativeImageDecoder.isDecodable = function (image, xref, res, pdfFunctionFactory) {
+    var dict = image.dict;
+    if (dict.has('DecodeParms') || dict.has('DP')) {
+      return false;
+    }
+    var cs = _colorspace.ColorSpace.parse(dict.get('ColorSpace', 'CS'), xref, res, pdfFunctionFactory);
+    return (cs.numComps === 1 || cs.numComps === 3) && cs.isDefaultDecode(dict.getArray('Decode', 'D'));
+  };
+  function PartialEvaluator(_ref3) {
+    var _this = this;
+
+    var pdfManager = _ref3.pdfManager,
+        xref = _ref3.xref,
+        handler = _ref3.handler,
+        pageIndex = _ref3.pageIndex,
+        idFactory = _ref3.idFactory,
+        fontCache = _ref3.fontCache,
+        builtInCMapCache = _ref3.builtInCMapCache,
+        _ref3$options = _ref3.options,
+        options = _ref3$options === undefined ? null : _ref3$options,
+        pdfFunctionFactory = _ref3.pdfFunctionFactory;
+
+    this.pdfManager = pdfManager;
+    this.xref = xref;
+    this.handler = handler;
+    this.pageIndex = pageIndex;
+    this.idFactory = idFactory;
+    this.fontCache = fontCache;
+    this.builtInCMapCache = builtInCMapCache;
+    this.options = options || DefaultPartialEvaluatorOptions;
+    this.pdfFunctionFactory = pdfFunctionFactory;
+    this.fetchBuiltInCMap = function () {
+      var _ref4 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee(name) {
+        var data;
+        return _regenerator2.default.wrap(function _callee$(_context) {
+          while (1) {
+            switch (_context.prev = _context.next) {
+              case 0:
+                if (!_this.builtInCMapCache.has(name)) {
+                  _context.next = 2;
+                  break;
+                }
+
+                return _context.abrupt('return', _this.builtInCMapCache.get(name));
+
+              case 2:
+                _context.next = 4;
+                return _this.handler.sendWithPromise('FetchBuiltInCMap', { name: name });
+
+              case 4:
+                data = _context.sent;
+
+                if (data.compressionType !== _util.CMapCompressionType.NONE) {
+                  _this.builtInCMapCache.set(name, data);
+                }
+                return _context.abrupt('return', data);
+
+              case 7:
+              case 'end':
+                return _context.stop();
+            }
+          }
+        }, _callee, _this);
+      }));
+
+      return function (_x) {
+        return _ref4.apply(this, arguments);
+      };
+    }();
+  }
+  var TIME_SLOT_DURATION_MS = 20;
+  var CHECK_TIME_EVERY = 100;
+  function TimeSlotManager() {
+    this.reset();
+  }
+  TimeSlotManager.prototype = {
+    check: function TimeSlotManager_check() {
+      if (++this.checked < CHECK_TIME_EVERY) {
+        return false;
+      }
+      this.checked = 0;
+      return this.endTime <= Date.now();
+    },
+    reset: function TimeSlotManager_reset() {
+      this.endTime = Date.now() + TIME_SLOT_DURATION_MS;
+      this.checked = 0;
+    }
+  };
+  function normalizeBlendMode(value) {
+    if (!(0, _primitives.isName)(value)) {
+      return 'source-over';
+    }
+    switch (value.name) {
+      case 'Normal':
+      case 'Compatible':
+        return 'source-over';
+      case 'Multiply':
+        return 'multiply';
+      case 'Screen':
+        return 'screen';
+      case 'Overlay':
+        return 'overlay';
+      case 'Darken':
+        return 'darken';
+      case 'Lighten':
+        return 'lighten';
+      case 'ColorDodge':
+        return 'color-dodge';
+      case 'ColorBurn':
+        return 'color-burn';
+      case 'HardLight':
+        return 'hard-light';
+      case 'SoftLight':
+        return 'soft-light';
+      case 'Difference':
+        return 'difference';
+      case 'Exclusion':
+        return 'exclusion';
+      case 'Hue':
+        return 'hue';
+      case 'Saturation':
+        return 'saturation';
+      case 'Color':
+        return 'color';
+      case 'Luminosity':
+        return 'luminosity';
+    }
+    (0, _util.warn)('Unsupported blend mode: ' + value.name);
+    return 'source-over';
+  }
+  var deferred = Promise.resolve();
+  var TILING_PATTERN = 1,
+      SHADING_PATTERN = 2;
+  PartialEvaluator.prototype = {
+    clone: function clone() {
+      var newOptions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DefaultPartialEvaluatorOptions;
+
+      var newEvaluator = Object.create(this);
+      newEvaluator.options = newOptions;
+      return newEvaluator;
+    },
+
+    hasBlendModes: function PartialEvaluator_hasBlendModes(resources) {
+      if (!(0, _primitives.isDict)(resources)) {
+        return false;
+      }
+      var processed = Object.create(null);
+      if (resources.objId) {
+        processed[resources.objId] = true;
+      }
+      var nodes = [resources],
+          xref = this.xref;
+      while (nodes.length) {
+        var key, i, ii;
+        var node = nodes.shift();
+        var graphicStates = node.get('ExtGState');
+        if ((0, _primitives.isDict)(graphicStates)) {
+          var graphicStatesKeys = graphicStates.getKeys();
+          for (i = 0, ii = graphicStatesKeys.length; i < ii; i++) {
+            key = graphicStatesKeys[i];
+            var graphicState = graphicStates.get(key);
+            var bm = graphicState.get('BM');
+            if ((0, _primitives.isName)(bm) && bm.name !== 'Normal') {
+              return true;
+            }
+          }
+        }
+        var xObjects = node.get('XObject');
+        if (!(0, _primitives.isDict)(xObjects)) {
+          continue;
+        }
+        var xObjectsKeys = xObjects.getKeys();
+        for (i = 0, ii = xObjectsKeys.length; i < ii; i++) {
+          key = xObjectsKeys[i];
+          var xObject = xObjects.getRaw(key);
+          if ((0, _primitives.isRef)(xObject)) {
+            if (processed[xObject.toString()]) {
+              continue;
+            }
+            xObject = xref.fetch(xObject);
+          }
+          if (!(0, _primitives.isStream)(xObject)) {
+            continue;
+          }
+          if (xObject.dict.objId) {
+            if (processed[xObject.dict.objId]) {
+              continue;
+            }
+            processed[xObject.dict.objId] = true;
+          }
+          var xResources = xObject.dict.get('Resources');
+          if ((0, _primitives.isDict)(xResources) && (!xResources.objId || !processed[xResources.objId])) {
+            nodes.push(xResources);
+            if (xResources.objId) {
+              processed[xResources.objId] = true;
+            }
+          }
+        }
+      }
+      return false;
+    },
+    buildFormXObject: function PartialEvaluator_buildFormXObject(resources, xobj, smask, operatorList, task, initialState) {
+      var dict = xobj.dict;
+      var matrix = dict.getArray('Matrix');
+      var bbox = dict.getArray('BBox');
+      var group = dict.get('Group');
+      if (group) {
+        var groupOptions = {
+          matrix: matrix,
+          bbox: bbox,
+          smask: smask,
+          isolated: false,
+          knockout: false
+        };
+        var groupSubtype = group.get('S');
+        var colorSpace = null;
+        if ((0, _primitives.isName)(groupSubtype, 'Transparency')) {
+          groupOptions.isolated = group.get('I') || false;
+          groupOptions.knockout = group.get('K') || false;
+          if (group.has('CS')) {
+            colorSpace = _colorspace.ColorSpace.parse(group.get('CS'), this.xref, resources, this.pdfFunctionFactory);
+          }
+        }
+        if (smask && smask.backdrop) {
+          colorSpace = colorSpace || _colorspace.ColorSpace.singletons.rgb;
+          smask.backdrop = colorSpace.getRgb(smask.backdrop, 0);
+        }
+        operatorList.addOp(_util.OPS.beginGroup, [groupOptions]);
+      }
+      operatorList.addOp(_util.OPS.paintFormXObjectBegin, [matrix, bbox]);
+      return this.getOperatorList({
+        stream: xobj,
+        task: task,
+        resources: dict.get('Resources') || resources,
+        operatorList: operatorList,
+        initialState: initialState
+      }).then(function () {
+        operatorList.addOp(_util.OPS.paintFormXObjectEnd, []);
+        if (group) {
+          operatorList.addOp(_util.OPS.endGroup, [groupOptions]);
+        }
+      });
+    },
+    buildPaintImageXObject: function buildPaintImageXObject(_ref5) {
+      var _this2 = this;
+
+      var resources = _ref5.resources,
+          image = _ref5.image,
+          _ref5$isInline = _ref5.isInline,
+          isInline = _ref5$isInline === undefined ? false : _ref5$isInline,
+          operatorList = _ref5.operatorList,
+          cacheKey = _ref5.cacheKey,
+          imageCache = _ref5.imageCache,
+          _ref5$forceDisableNat = _ref5.forceDisableNativeImageDecoder,
+          forceDisableNativeImageDecoder = _ref5$forceDisableNat === undefined ? false : _ref5$forceDisableNat;
+
+      var dict = image.dict;
+      var w = dict.get('Width', 'W');
+      var h = dict.get('Height', 'H');
+      if (!(w && (0, _util.isNum)(w)) || !(h && (0, _util.isNum)(h))) {
+        (0, _util.warn)('Image dimensions are missing, or not numbers.');
+        return Promise.resolve();
+      }
+      var maxImageSize = this.options.maxImageSize;
+      if (maxImageSize !== -1 && w * h > maxImageSize) {
+        (0, _util.warn)('Image exceeded maximum allowed size and was removed.');
+        return Promise.resolve();
+      }
+      var imageMask = dict.get('ImageMask', 'IM') || false;
+      var imgData, args;
+      if (imageMask) {
+        var width = dict.get('Width', 'W');
+        var height = dict.get('Height', 'H');
+        var bitStrideLength = width + 7 >> 3;
+        var imgArray = image.getBytes(bitStrideLength * height, true);
+        var decode = dict.getArray('Decode', 'D');
+        imgData = _image.PDFImage.createMask({
+          imgArray: imgArray,
+          width: width,
+          height: height,
+          imageIsFromDecodeStream: image instanceof _stream.DecodeStream,
+          inverseDecode: !!decode && decode[0] > 0
+        });
+        imgData.cached = true;
+        args = [imgData];
+        operatorList.addOp(_util.OPS.paintImageMaskXObject, args);
+        if (cacheKey) {
+          imageCache[cacheKey] = {
+            fn: _util.OPS.paintImageMaskXObject,
+            args: args
+          };
+        }
+        return Promise.resolve();
+      }
+      var softMask = dict.get('SMask', 'SM') || false;
+      var mask = dict.get('Mask') || false;
+      var SMALL_IMAGE_DIMENSIONS = 200;
+      if (isInline && !softMask && !mask && !(image instanceof _jpeg_stream.JpegStream) && w + h < SMALL_IMAGE_DIMENSIONS) {
+        var imageObj = new _image.PDFImage({
+          xref: this.xref,
+          res: resources,
+          image: image,
+          isInline: isInline,
+          pdfFunctionFactory: this.pdfFunctionFactory
+        });
+        imgData = imageObj.createImageData(true);
+        operatorList.addOp(_util.OPS.paintInlineImageXObject, [imgData]);
+        return Promise.resolve();
+      }
+      var nativeImageDecoderSupport = forceDisableNativeImageDecoder ? _util.NativeImageDecoding.NONE : this.options.nativeImageDecoderSupport;
+      var objId = 'img_' + this.idFactory.createObjId();
+      if (nativeImageDecoderSupport !== _util.NativeImageDecoding.NONE && !softMask && !mask && image instanceof _jpeg_stream.JpegStream && NativeImageDecoder.isSupported(image, this.xref, resources, this.pdfFunctionFactory)) {
+        return this.handler.sendWithPromise('obj', [objId, this.pageIndex, 'JpegStream', image.getIR(this.options.forceDataSchema)]).then(function () {
+          operatorList.addDependency(objId);
+          args = [objId, w, h];
+          operatorList.addOp(_util.OPS.paintJpegXObject, args);
+          if (cacheKey) {
+            imageCache[cacheKey] = {
+              fn: _util.OPS.paintJpegXObject,
+              args: args
+            };
+          }
+        }, function (reason) {
+          (0, _util.warn)('Native JPEG decoding failed -- trying to recover: ' + (reason && reason.message));
+          return _this2.buildPaintImageXObject({
+            resources: resources,
+            image: image,
+            isInline: isInline,
+            operatorList: operatorList,
+            cacheKey: cacheKey,
+            imageCache: imageCache,
+            forceDisableNativeImageDecoder: true
+          });
+        });
+      }
+      var nativeImageDecoder = null;
+      if (nativeImageDecoderSupport === _util.NativeImageDecoding.DECODE && (image instanceof _jpeg_stream.JpegStream || mask instanceof _jpeg_stream.JpegStream || softMask instanceof _jpeg_stream.JpegStream)) {
+        nativeImageDecoder = new NativeImageDecoder({
+          xref: this.xref,
+          resources: resources,
+          handler: this.handler,
+          forceDataSchema: this.options.forceDataSchema,
+          pdfFunctionFactory: this.pdfFunctionFactory
+        });
+      }
+      operatorList.addDependency(objId);
+      args = [objId, w, h];
+      _image.PDFImage.buildImage({
+        handler: this.handler,
+        xref: this.xref,
+        res: resources,
+        image: image,
+        isInline: isInline,
+        nativeDecoder: nativeImageDecoder,
+        pdfFunctionFactory: this.pdfFunctionFactory
+      }).then(function (imageObj) {
+        var imgData = imageObj.createImageData(false);
+        _this2.handler.send('obj', [objId, _this2.pageIndex, 'Image', imgData], [imgData.data.buffer]);
+      }).catch(function (reason) {
+        (0, _util.warn)('Unable to decode image: ' + reason);
+        _this2.handler.send('obj', [objId, _this2.pageIndex, 'Image', null]);
+      });
+      operatorList.addOp(_util.OPS.paintImageXObject, args);
+      if (cacheKey) {
+        imageCache[cacheKey] = {
+          fn: _util.OPS.paintImageXObject,
+          args: args
+        };
+      }
+      return Promise.resolve();
+    },
+
+    handleSMask: function PartialEvaluator_handleSmask(smask, resources, operatorList, task, stateManager) {
+      var smaskContent = smask.get('G');
+      var smaskOptions = {
+        subtype: smask.get('S').name,
+        backdrop: smask.get('BC')
+      };
+      var transferObj = smask.get('TR');
+      if ((0, _function.isPDFFunction)(transferObj)) {
+        var transferFn = this.pdfFunctionFactory.create(transferObj);
+        var transferMap = new Uint8Array(256);
+        var tmp = new Float32Array(1);
+        for (var i = 0; i < 256; i++) {
+          tmp[0] = i / 255;
+          transferFn(tmp, 0, tmp, 0);
+          transferMap[i] = tmp[0] * 255 | 0;
+        }
+        smaskOptions.transferMap = transferMap;
+      }
+      return this.buildFormXObject(resources, smaskContent, smaskOptions, operatorList, task, stateManager.state.clone());
+    },
+    handleTilingType: function handleTilingType(fn, args, resources, pattern, patternDict, operatorList, task) {
+      var _this3 = this;
+
+      var tilingOpList = new _operator_list.OperatorList();
+      var resourcesArray = [patternDict.get('Resources'), resources];
+      var patternResources = _primitives.Dict.merge(this.xref, resourcesArray);
+      return this.getOperatorList({
+        stream: pattern,
+        task: task,
+        resources: patternResources,
+        operatorList: tilingOpList
+      }).then(function () {
+        return (0, _pattern.getTilingPatternIR)({
+          fnArray: tilingOpList.fnArray,
+          argsArray: tilingOpList.argsArray
+        }, patternDict, args);
+      }).then(function (tilingPatternIR) {
+        operatorList.addDependencies(tilingOpList.dependencies);
+        operatorList.addOp(fn, tilingPatternIR);
+      }, function (reason) {
+        if (_this3.options.ignoreErrors) {
+          _this3.handler.send('UnsupportedFeature', { featureId: _util.UNSUPPORTED_FEATURES.unknown });
+          (0, _util.warn)('handleTilingType - ignoring pattern: "' + reason + '".');
+          return;
+        }
+        throw reason;
+      });
+    },
+
+    handleSetFont: function PartialEvaluator_handleSetFont(resources, fontArgs, fontRef, operatorList, task, state) {
+      var _this4 = this;
+
+      var fontName;
+      if (fontArgs) {
+        fontArgs = fontArgs.slice();
+        fontName = fontArgs[0].name;
+      }
+      return this.loadFont(fontName, fontRef, resources).then(function (translated) {
+        if (!translated.font.isType3Font) {
+          return translated;
+        }
+        return translated.loadType3Data(_this4, resources, operatorList, task).then(function () {
+          return translated;
+        }).catch(function (reason) {
+          _this4.handler.send('UnsupportedFeature', { featureId: _util.UNSUPPORTED_FEATURES.font });
+          return new TranslatedFont('g_font_error', new _fonts.ErrorFont('Type3 font load error: ' + reason), translated.font);
+        });
+      }).then(function (translated) {
+        state.font = translated.font;
+        translated.send(_this4.handler);
+        return translated.loadedName;
+      });
+    },
+    handleText: function PartialEvaluator_handleText(chars, state) {
+      var _this5 = this;
+
+      var font = state.font;
+      var glyphs = font.charsToGlyphs(chars);
+      var isAddToPathSet = !!(state.textRenderingMode & _util.TextRenderingMode.ADD_TO_PATH_FLAG);
+      if (font.data && (isAddToPathSet || this.options.disableFontFace || state.fillColorSpace.name === 'Pattern')) {
+        var buildPath = function buildPath(fontChar) {
+          if (!font.renderer.hasBuiltPath(fontChar)) {
+            var path = font.renderer.getPathJs(fontChar);
+            _this5.handler.send('commonobj', [font.loadedName + '_path_' + fontChar, 'FontPath', path]);
+          }
+        };
+        for (var i = 0, ii = glyphs.length; i < ii; i++) {
+          var glyph = glyphs[i];
+          buildPath(glyph.fontChar);
+          var accent = glyph.accent;
+          if (accent && accent.fontChar) {
+            buildPath(accent.fontChar);
+          }
+        }
+      }
+      return glyphs;
+    },
+    setGState: function PartialEvaluator_setGState(resources, gState, operatorList, task, stateManager) {
+      var _this6 = this;
+
+      var gStateObj = [];
+      var gStateKeys = gState.getKeys();
+      var promise = Promise.resolve();
+
+      var _loop = function _loop() {
+        var key = gStateKeys[i];
+        var value = gState.get(key);
+        switch (key) {
+          case 'Type':
+            break;
+          case 'LW':
+          case 'LC':
+          case 'LJ':
+          case 'ML':
+          case 'D':
+          case 'RI':
+          case 'FL':
+          case 'CA':
+          case 'ca':
+            gStateObj.push([key, value]);
+            break;
+          case 'Font':
+            promise = promise.then(function () {
+              return _this6.handleSetFont(resources, null, value[0], operatorList, task, stateManager.state).then(function (loadedName) {
+                operatorList.addDependency(loadedName);
+                gStateObj.push([key, [loadedName, value[1]]]);
+              });
+            });
+            break;
+          case 'BM':
+            gStateObj.push([key, normalizeBlendMode(value)]);
+            break;
+          case 'SMask':
+            if ((0, _primitives.isName)(value, 'None')) {
+              gStateObj.push([key, false]);
+              break;
+            }
+            if ((0, _primitives.isDict)(value)) {
+              promise = promise.then(function () {
+                return _this6.handleSMask(value, resources, operatorList, task, stateManager);
+              });
+              gStateObj.push([key, true]);
+            } else {
+              (0, _util.warn)('Unsupported SMask type');
+            }
+            break;
+          case 'OP':
+          case 'op':
+          case 'OPM':
+          case 'BG':
+          case 'BG2':
+          case 'UCR':
+          case 'UCR2':
+          case 'TR':
+          case 'TR2':
+          case 'HT':
+          case 'SM':
+          case 'SA':
+          case 'AIS':
+          case 'TK':
+            (0, _util.info)('graphic state operator ' + key);
+            break;
+          default:
+            (0, _util.info)('Unknown graphic state operator ' + key);
+            break;
+        }
+      };
+
+      for (var i = 0, ii = gStateKeys.length; i < ii; i++) {
+        _loop();
+      }
+      return promise.then(function () {
+        if (gStateObj.length > 0) {
+          operatorList.addOp(_util.OPS.setGState, [gStateObj]);
+        }
+      });
+    },
+    loadFont: function PartialEvaluator_loadFont(fontName, font, resources) {
+      var _this7 = this;
+
+      function errorFont() {
+        return Promise.resolve(new TranslatedFont('g_font_error', new _fonts.ErrorFont('Font ' + fontName + ' is not available'), font));
+      }
+      var fontRef,
+          xref = this.xref;
+      if (font) {
+        if (!(0, _primitives.isRef)(font)) {
+          throw new Error('The "font" object should be a reference.');
+        }
+        fontRef = font;
+      } else {
+        var fontRes = resources.get('Font');
+        if (fontRes) {
+          fontRef = fontRes.getRaw(fontName);
+        } else {
+          (0, _util.warn)('fontRes not available');
+          return errorFont();
+        }
+      }
+      if (!fontRef) {
+        (0, _util.warn)('fontRef not available');
+        return errorFont();
+      }
+      if (this.fontCache.has(fontRef)) {
+        return this.fontCache.get(fontRef);
+      }
+      font = xref.fetchIfRef(fontRef);
+      if (!(0, _primitives.isDict)(font)) {
+        return errorFont();
+      }
+      if (font.translated) {
+        return font.translated;
+      }
+      var fontCapability = (0, _util.createPromiseCapability)();
+      var preEvaluatedFont = this.preEvaluateFont(font);
+      var descriptor = preEvaluatedFont.descriptor;
+      var fontRefIsRef = (0, _primitives.isRef)(fontRef),
+          fontID;
+      if (fontRefIsRef) {
+        fontID = fontRef.toString();
+      }
+      if ((0, _primitives.isDict)(descriptor)) {
+        if (!descriptor.fontAliases) {
+          descriptor.fontAliases = Object.create(null);
+        }
+        var fontAliases = descriptor.fontAliases;
+        var hash = preEvaluatedFont.hash;
+        if (fontAliases[hash]) {
+          var aliasFontRef = fontAliases[hash].aliasRef;
+          if (fontRefIsRef && aliasFontRef && this.fontCache.has(aliasFontRef)) {
+            this.fontCache.putAlias(fontRef, aliasFontRef);
+            return this.fontCache.get(fontRef);
+          }
+        } else {
+          fontAliases[hash] = { fontID: _fonts.Font.getFontID() };
+        }
+        if (fontRefIsRef) {
+          fontAliases[hash].aliasRef = fontRef;
+        }
+        fontID = fontAliases[hash].fontID;
+      }
+      if (fontRefIsRef) {
+        this.fontCache.put(fontRef, fontCapability.promise);
+      } else {
+        if (!fontID) {
+          fontID = this.idFactory.createObjId();
+        }
+        this.fontCache.put('id_' + fontID, fontCapability.promise);
+      }
+      (0, _util.assert)(fontID, 'The "fontID" must be defined.');
+      font.loadedName = 'g_' + this.pdfManager.docId + '_f' + fontID;
+      font.translated = fontCapability.promise;
+      var translatedPromise;
+      try {
+        translatedPromise = this.translateFont(preEvaluatedFont);
+      } catch (e) {
+        translatedPromise = Promise.reject(e);
+      }
+      translatedPromise.then(function (translatedFont) {
+        if (translatedFont.fontType !== undefined) {
+          var xrefFontStats = xref.stats.fontTypes;
+          xrefFontStats[translatedFont.fontType] = true;
+        }
+        fontCapability.resolve(new TranslatedFont(font.loadedName, translatedFont, font));
+      }).catch(function (reason) {
+        _this7.handler.send('UnsupportedFeature', { featureId: _util.UNSUPPORTED_FEATURES.font });
+        try {
+          var descriptor = preEvaluatedFont.descriptor;
+          var fontFile3 = descriptor && descriptor.get('FontFile3');
+          var subtype = fontFile3 && fontFile3.get('Subtype');
+          var fontType = (0, _fonts.getFontType)(preEvaluatedFont.type, subtype && subtype.name);
+          var xrefFontStats = xref.stats.fontTypes;
+          xrefFontStats[fontType] = true;
+        } catch (ex) {}
+        fontCapability.resolve(new TranslatedFont(font.loadedName, new _fonts.ErrorFont(reason instanceof Error ? reason.message : reason), font));
+      });
+      return fontCapability.promise;
+    },
+    buildPath: function PartialEvaluator_buildPath(operatorList, fn, args) {
+      var lastIndex = operatorList.length - 1;
+      if (!args) {
+        args = [];
+      }
+      if (lastIndex < 0 || operatorList.fnArray[lastIndex] !== _util.OPS.constructPath) {
+        operatorList.addOp(_util.OPS.constructPath, [[fn], args]);
+      } else {
+        var opArgs = operatorList.argsArray[lastIndex];
+        opArgs[0].push(fn);
+        Array.prototype.push.apply(opArgs[1], args);
+      }
+    },
+    handleColorN: function PartialEvaluator_handleColorN(operatorList, fn, args, cs, patterns, resources, task) {
+      var patternName = args[args.length - 1];
+      var pattern;
+      if ((0, _primitives.isName)(patternName) && (pattern = patterns.get(patternName.name))) {
+        var dict = (0, _primitives.isStream)(pattern) ? pattern.dict : pattern;
+        var typeNum = dict.get('PatternType');
+        if (typeNum === TILING_PATTERN) {
+          var color = cs.base ? cs.base.getRgb(args, 0) : null;
+          return this.handleTilingType(fn, color, resources, pattern, dict, operatorList, task);
+        } else if (typeNum === SHADING_PATTERN) {
+          var shading = dict.get('Shading');
+          var matrix = dict.getArray('Matrix');
+          pattern = _pattern.Pattern.parseShading(shading, matrix, this.xref, resources, this.handler, this.pdfFunctionFactory);
+          operatorList.addOp(fn, pattern.getIR());
+          return Promise.resolve();
+        }
+        return Promise.reject(new Error('Unknown PatternType: ' + typeNum));
+      }
+      operatorList.addOp(fn, args);
+      return Promise.resolve();
+    },
+    getOperatorList: function getOperatorList(_ref6) {
+      var _this8 = this;
+
+      var stream = _ref6.stream,
+          task = _ref6.task,
+          resources = _ref6.resources,
+          operatorList = _ref6.operatorList,
+          _ref6$initialState = _ref6.initialState,
+          initialState = _ref6$initialState === undefined ? null : _ref6$initialState;
+
+      resources = resources || _primitives.Dict.empty;
+      initialState = initialState || new EvalState();
+      if (!operatorList) {
+        throw new Error('getOperatorList: missing "operatorList" parameter');
+      }
+      var self = this;
+      var xref = this.xref;
+      var imageCache = Object.create(null);
+      var xobjs = resources.get('XObject') || _primitives.Dict.empty;
+      var patterns = resources.get('Pattern') || _primitives.Dict.empty;
+      var stateManager = new StateManager(initialState);
+      var preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager);
+      var timeSlotManager = new TimeSlotManager();
+      function closePendingRestoreOPS(argument) {
+        for (var i = 0, ii = preprocessor.savedStatesDepth; i < ii; i++) {
+          operatorList.addOp(_util.OPS.restore, []);
+        }
+      }
+      return new Promise(function promiseBody(resolve, reject) {
+        var next = function next(promise) {
+          promise.then(function () {
+            try {
+              promiseBody(resolve, reject);
+            } catch (ex) {
+              reject(ex);
+            }
+          }, reject);
+        };
+        task.ensureNotTerminated();
+        timeSlotManager.reset();
+        var stop,
+            operation = {},
+            i,
+            ii,
+            cs;
+        while (!(stop = timeSlotManager.check())) {
+          operation.args = null;
+          if (!preprocessor.read(operation)) {
+            break;
+          }
+          var args = operation.args;
+          var fn = operation.fn;
+          switch (fn | 0) {
+            case _util.OPS.paintXObject:
+              var name = args[0].name;
+              if (name && imageCache[name] !== undefined) {
+                operatorList.addOp(imageCache[name].fn, imageCache[name].args);
+                args = null;
+                continue;
+              }
+              next(new Promise(function (resolveXObject, rejectXObject) {
+                if (!name) {
+                  throw new _util.FormatError('XObject must be referred to by name.');
+                }
+                var xobj = xobjs.get(name);
+                if (!xobj) {
+                  operatorList.addOp(fn, args);
+                  resolveXObject();
+                  return;
+                }
+                if (!(0, _primitives.isStream)(xobj)) {
+                  throw new _util.FormatError('XObject should be a stream');
+                }
+                var type = xobj.dict.get('Subtype');
+                if (!(0, _primitives.isName)(type)) {
+                  throw new _util.FormatError('XObject should have a Name subtype');
+                }
+                if (type.name === 'Form') {
+                  stateManager.save();
+                  self.buildFormXObject(resources, xobj, null, operatorList, task, stateManager.state.clone()).then(function () {
+                    stateManager.restore();
+                    resolveXObject();
+                  }, rejectXObject);
+                  return;
+                } else if (type.name === 'Image') {
+                  self.buildPaintImageXObject({
+                    resources: resources,
+                    image: xobj,
+                    operatorList: operatorList,
+                    cacheKey: name,
+                    imageCache: imageCache
+                  }).then(resolveXObject, rejectXObject);
+                  return;
+                } else if (type.name === 'PS') {
+                  (0, _util.info)('Ignored XObject subtype PS');
+                } else {
+                  throw new _util.FormatError('Unhandled XObject subtype ' + type.name);
+                }
+                resolveXObject();
+              }).catch(function (reason) {
+                if (self.options.ignoreErrors) {
+                  self.handler.send('UnsupportedFeature', { featureId: _util.UNSUPPORTED_FEATURES.unknown });
+                  (0, _util.warn)('getOperatorList - ignoring XObject: "' + reason + '".');
+                  return;
+                }
+                throw reason;
+              }));
+              return;
+            case _util.OPS.setFont:
+              var fontSize = args[1];
+              next(self.handleSetFont(resources, args, null, operatorList, task, stateManager.state).then(function (loadedName) {
+                operatorList.addDependency(loadedName);
+                operatorList.addOp(_util.OPS.setFont, [loadedName, fontSize]);
+              }));
+              return;
+            case _util.OPS.endInlineImage:
+              var cacheKey = args[0].cacheKey;
+              if (cacheKey) {
+                var cacheEntry = imageCache[cacheKey];
+                if (cacheEntry !== undefined) {
+                  operatorList.addOp(cacheEntry.fn, cacheEntry.args);
+                  args = null;
+                  continue;
+                }
+              }
+              next(self.buildPaintImageXObject({
+                resources: resources,
+                image: args[0],
+                isInline: true,
+                operatorList: operatorList,
+                cacheKey: cacheKey,
+                imageCache: imageCache
+              }));
+              return;
+            case _util.OPS.showText:
+              args[0] = self.handleText(args[0], stateManager.state);
+              break;
+            case _util.OPS.showSpacedText:
+              var arr = args[0];
+              var combinedGlyphs = [];
+              var arrLength = arr.length;
+              var state = stateManager.state;
+              for (i = 0; i < arrLength; ++i) {
+                var arrItem = arr[i];
+                if ((0, _util.isString)(arrItem)) {
+                  Array.prototype.push.apply(combinedGlyphs, self.handleText(arrItem, state));
+                } else if ((0, _util.isNum)(arrItem)) {
+                  combinedGlyphs.push(arrItem);
+                }
+              }
+              args[0] = combinedGlyphs;
+              fn = _util.OPS.showText;
+              break;
+            case _util.OPS.nextLineShowText:
+              operatorList.addOp(_util.OPS.nextLine);
+              args[0] = self.handleText(args[0], stateManager.state);
+              fn = _util.OPS.showText;
+              break;
+            case _util.OPS.nextLineSetSpacingShowText:
+              operatorList.addOp(_util.OPS.nextLine);
+              operatorList.addOp(_util.OPS.setWordSpacing, [args.shift()]);
+              operatorList.addOp(_util.OPS.setCharSpacing, [args.shift()]);
+              args[0] = self.handleText(args[0], stateManager.state);
+              fn = _util.OPS.showText;
+              break;
+            case _util.OPS.setTextRenderingMode:
+              stateManager.state.textRenderingMode = args[0];
+              break;
+            case _util.OPS.setFillColorSpace:
+              stateManager.state.fillColorSpace = _colorspace.ColorSpace.parse(args[0], xref, resources, self.pdfFunctionFactory);
+              continue;
+            case _util.OPS.setStrokeColorSpace:
+              stateManager.state.strokeColorSpace = _colorspace.ColorSpace.parse(args[0], xref, resources, self.pdfFunctionFactory);
+              continue;
+            case _util.OPS.setFillColor:
+              cs = stateManager.state.fillColorSpace;
+              args = cs.getRgb(args, 0);
+              fn = _util.OPS.setFillRGBColor;
+              break;
+            case _util.OPS.setStrokeColor:
+              cs = stateManager.state.strokeColorSpace;
+              args = cs.getRgb(args, 0);
+              fn = _util.OPS.setStrokeRGBColor;
+              break;
+            case _util.OPS.setFillGray:
+              stateManager.state.fillColorSpace = _colorspace.ColorSpace.singletons.gray;
+              args = _colorspace.ColorSpace.singletons.gray.getRgb(args, 0);
+              fn = _util.OPS.setFillRGBColor;
+              break;
+            case _util.OPS.setStrokeGray:
+              stateManager.state.strokeColorSpace = _colorspace.ColorSpace.singletons.gray;
+              args = _colorspace.ColorSpace.singletons.gray.getRgb(args, 0);
+              fn = _util.OPS.setStrokeRGBColor;
+              break;
+            case _util.OPS.setFillCMYKColor:
+              stateManager.state.fillColorSpace = _colorspace.ColorSpace.singletons.cmyk;
+              args = _colorspace.ColorSpace.singletons.cmyk.getRgb(args, 0);
+              fn = _util.OPS.setFillRGBColor;
+              break;
+            case _util.OPS.setStrokeCMYKColor:
+              stateManager.state.strokeColorSpace = _colorspace.ColorSpace.singletons.cmyk;
+              args = _colorspace.ColorSpace.singletons.cmyk.getRgb(args, 0);
+              fn = _util.OPS.setStrokeRGBColor;
+              break;
+            case _util.OPS.setFillRGBColor:
+              stateManager.state.fillColorSpace = _colorspace.ColorSpace.singletons.rgb;
+              args = _colorspace.ColorSpace.singletons.rgb.getRgb(args, 0);
+              break;
+            case _util.OPS.setStrokeRGBColor:
+              stateManager.state.strokeColorSpace = _colorspace.ColorSpace.singletons.rgb;
+              args = _colorspace.ColorSpace.singletons.rgb.getRgb(args, 0);
+              break;
+            case _util.OPS.setFillColorN:
+              cs = stateManager.state.fillColorSpace;
+              if (cs.name === 'Pattern') {
+                next(self.handleColorN(operatorList, _util.OPS.setFillColorN, args, cs, patterns, resources, task));
+                return;
+              }
+              args = cs.getRgb(args, 0);
+              fn = _util.OPS.setFillRGBColor;
+              break;
+            case _util.OPS.setStrokeColorN:
+              cs = stateManager.state.strokeColorSpace;
+              if (cs.name === 'Pattern') {
+                next(self.handleColorN(operatorList, _util.OPS.setStrokeColorN, args, cs, patterns, resources, task));
+                return;
+              }
+              args = cs.getRgb(args, 0);
+              fn = _util.OPS.setStrokeRGBColor;
+              break;
+            case _util.OPS.shadingFill:
+              var shadingRes = resources.get('Shading');
+              if (!shadingRes) {
+                throw new _util.FormatError('No shading resource found');
+              }
+              var shading = shadingRes.get(args[0].name);
+              if (!shading) {
+                throw new _util.FormatError('No shading object found');
+              }
+              var shadingFill = _pattern.Pattern.parseShading(shading, null, xref, resources, self.handler, self.pdfFunctionFactory);
+              var patternIR = shadingFill.getIR();
+              args = [patternIR];
+              fn = _util.OPS.shadingFill;
+              break;
+            case _util.OPS.setGState:
+              var dictName = args[0];
+              var extGState = resources.get('ExtGState');
+              if (!(0, _primitives.isDict)(extGState) || !extGState.has(dictName.name)) {
+                break;
+              }
+              var gState = extGState.get(dictName.name);
+              next(self.setGState(resources, gState, operatorList, task, stateManager));
+              return;
+            case _util.OPS.moveTo:
+            case _util.OPS.lineTo:
+            case _util.OPS.curveTo:
+            case _util.OPS.curveTo2:
+            case _util.OPS.curveTo3:
+            case _util.OPS.closePath:
+              self.buildPath(operatorList, fn, args);
+              continue;
+            case _util.OPS.rectangle:
+              self.buildPath(operatorList, fn, args);
+              continue;
+            case _util.OPS.markPoint:
+            case _util.OPS.markPointProps:
+            case _util.OPS.beginMarkedContent:
+            case _util.OPS.beginMarkedContentProps:
+            case _util.OPS.endMarkedContent:
+            case _util.OPS.beginCompat:
+            case _util.OPS.endCompat:
+              continue;
+            default:
+              if (args !== null) {
+                for (i = 0, ii = args.length; i < ii; i++) {
+                  if (args[i] instanceof _primitives.Dict) {
+                    break;
+                  }
+                }
+                if (i < ii) {
+                  (0, _util.warn)('getOperatorList - ignoring operator: ' + fn);
+                  continue;
+                }
+              }
+          }
+          operatorList.addOp(fn, args);
+        }
+        if (stop) {
+          next(deferred);
+          return;
+        }
+        closePendingRestoreOPS();
+        resolve();
+      }).catch(function (reason) {
+        if (_this8.options.ignoreErrors) {
+          _this8.handler.send('UnsupportedFeature', { featureId: _util.UNSUPPORTED_FEATURES.unknown });
+          (0, _util.warn)('getOperatorList - ignoring errors during "' + task.name + '" ' + ('task: "' + reason + '".'));
+          closePendingRestoreOPS();
+          return;
+        }
+        throw reason;
+      });
+    },
+    getTextContent: function getTextContent(_ref7) {
+      var _this9 = this;
+
+      var stream = _ref7.stream,
+          task = _ref7.task,
+          resources = _ref7.resources,
+          _ref7$stateManager = _ref7.stateManager,
+          stateManager = _ref7$stateManager === undefined ? null : _ref7$stateManager,
+          _ref7$normalizeWhites = _ref7.normalizeWhitespace,
+          normalizeWhitespace = _ref7$normalizeWhites === undefined ? false : _ref7$normalizeWhites,
+          _ref7$combineTextItem = _ref7.combineTextItems,
+          combineTextItems = _ref7$combineTextItem === undefined ? false : _ref7$combineTextItem,
+          sink = _ref7.sink,
+          _ref7$seenStyles = _ref7.seenStyles,
+          seenStyles = _ref7$seenStyles === undefined ? Object.create(null) : _ref7$seenStyles;
+
+      resources = resources || _primitives.Dict.empty;
+      stateManager = stateManager || new StateManager(new TextState());
+      var WhitespaceRegexp = /\s/g;
+      var textContent = {
+        items: [],
+        styles: Object.create(null)
+      };
+      var textContentItem = {
+        initialized: false,
+        str: [],
+        width: 0,
+        height: 0,
+        vertical: false,
+        lastAdvanceWidth: 0,
+        lastAdvanceHeight: 0,
+        textAdvanceScale: 0,
+        spaceWidth: 0,
+        fakeSpaceMin: Infinity,
+        fakeMultiSpaceMin: Infinity,
+        fakeMultiSpaceMax: -0,
+        textRunBreakAllowed: false,
+        transform: null,
+        fontName: null
+      };
+      var SPACE_FACTOR = 0.3;
+      var MULTI_SPACE_FACTOR = 1.5;
+      var MULTI_SPACE_FACTOR_MAX = 4;
+      var self = this;
+      var xref = this.xref;
+      var xobjs = null;
+      var skipEmptyXObjs = Object.create(null);
+      var preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager);
+      var textState;
+      function ensureTextContentItem() {
+        if (textContentItem.initialized) {
+          return textContentItem;
+        }
+        var font = textState.font;
+        if (!(font.loadedName in seenStyles)) {
+          seenStyles[font.loadedName] = true;
+          textContent.styles[font.loadedName] = {
+            fontFamily: font.fallbackName,
+            ascent: font.ascent,
+            descent: font.descent,
+            vertical: font.vertical
+          };
+        }
+        textContentItem.fontName = font.loadedName;
+        var tsm = [textState.fontSize * textState.textHScale, 0, 0, textState.fontSize, 0, textState.textRise];
+        if (font.isType3Font && textState.fontMatrix !== _util.FONT_IDENTITY_MATRIX && textState.fontSize === 1) {
+          var glyphHeight = font.bbox[3] - font.bbox[1];
+          if (glyphHeight > 0) {
+            glyphHeight = glyphHeight * textState.fontMatrix[3];
+            tsm[3] *= glyphHeight;
+          }
+        }
+        var trm = _util.Util.transform(textState.ctm, _util.Util.transform(textState.textMatrix, tsm));
+        textContentItem.transform = trm;
+        if (!font.vertical) {
+          textContentItem.width = 0;
+          textContentItem.height = Math.sqrt(trm[2] * trm[2] + trm[3] * trm[3]);
+          textContentItem.vertical = false;
+        } else {
+          textContentItem.width = Math.sqrt(trm[0] * trm[0] + trm[1] * trm[1]);
+          textContentItem.height = 0;
+          textContentItem.vertical = true;
+        }
+        var a = textState.textLineMatrix[0];
+        var b = textState.textLineMatrix[1];
+        var scaleLineX = Math.sqrt(a * a + b * b);
+        a = textState.ctm[0];
+        b = textState.ctm[1];
+        var scaleCtmX = Math.sqrt(a * a + b * b);
+        textContentItem.textAdvanceScale = scaleCtmX * scaleLineX;
+        textContentItem.lastAdvanceWidth = 0;
+        textContentItem.lastAdvanceHeight = 0;
+        var spaceWidth = font.spaceWidth / 1000 * textState.fontSize;
+        if (spaceWidth) {
+          textContentItem.spaceWidth = spaceWidth;
+          textContentItem.fakeSpaceMin = spaceWidth * SPACE_FACTOR;
+          textContentItem.fakeMultiSpaceMin = spaceWidth * MULTI_SPACE_FACTOR;
+          textContentItem.fakeMultiSpaceMax = spaceWidth * MULTI_SPACE_FACTOR_MAX;
+          textContentItem.textRunBreakAllowed = !font.isMonospace;
+        } else {
+          textContentItem.spaceWidth = 0;
+          textContentItem.fakeSpaceMin = Infinity;
+          textContentItem.fakeMultiSpaceMin = Infinity;
+          textContentItem.fakeMultiSpaceMax = 0;
+          textContentItem.textRunBreakAllowed = false;
+        }
+        textContentItem.initialized = true;
+        return textContentItem;
+      }
+      function replaceWhitespace(str) {
+        var i = 0,
+            ii = str.length,
+            code;
+        while (i < ii && (code = str.charCodeAt(i)) >= 0x20 && code <= 0x7F) {
+          i++;
+        }
+        return i < ii ? str.replace(WhitespaceRegexp, ' ') : str;
+      }
+      function runBidiTransform(textChunk) {
+        var str = textChunk.str.join('');
+        var bidiResult = (0, _bidi.bidi)(str, -1, textChunk.vertical);
+        return {
+          str: normalizeWhitespace ? replaceWhitespace(bidiResult.str) : bidiResult.str,
+          dir: bidiResult.dir,
+          width: textChunk.width,
+          height: textChunk.height,
+          transform: textChunk.transform,
+          fontName: textChunk.fontName
+        };
+      }
+      function handleSetFont(fontName, fontRef) {
+        return self.loadFont(fontName, fontRef, resources).then(function (translated) {
+          textState.font = translated.font;
+          textState.fontMatrix = translated.font.fontMatrix || _util.FONT_IDENTITY_MATRIX;
+        });
+      }
+      function buildTextContentItem(chars) {
+        var font = textState.font;
+        var textChunk = ensureTextContentItem();
+        var width = 0;
+        var height = 0;
+        var glyphs = font.charsToGlyphs(chars);
+        for (var i = 0; i < glyphs.length; i++) {
+          var glyph = glyphs[i];
+          var glyphWidth = null;
+          if (font.vertical && glyph.vmetric) {
+            glyphWidth = glyph.vmetric[0];
+          } else {
+            glyphWidth = glyph.width;
+          }
+          var glyphUnicode = glyph.unicode;
+          var NormalizedUnicodes = (0, _unicode.getNormalizedUnicodes)();
+          if (NormalizedUnicodes[glyphUnicode] !== undefined) {
+            glyphUnicode = NormalizedUnicodes[glyphUnicode];
+          }
+          glyphUnicode = (0, _unicode.reverseIfRtl)(glyphUnicode);
+          var charSpacing = textState.charSpacing;
+          if (glyph.isSpace) {
+            var wordSpacing = textState.wordSpacing;
+            charSpacing += wordSpacing;
+            if (wordSpacing > 0) {
+              addFakeSpaces(wordSpacing, textChunk.str);
+            }
+          }
+          var tx = 0;
+          var ty = 0;
+          if (!font.vertical) {
+            var w0 = glyphWidth * textState.fontMatrix[0];
+            tx = (w0 * textState.fontSize + charSpacing) * textState.textHScale;
+            width += tx;
+          } else {
+            var w1 = glyphWidth * textState.fontMatrix[0];
+            ty = w1 * textState.fontSize + charSpacing;
+            height += ty;
+          }
+          textState.translateTextMatrix(tx, ty);
+          textChunk.str.push(glyphUnicode);
+        }
+        if (!font.vertical) {
+          textChunk.lastAdvanceWidth = width;
+          textChunk.width += width;
+        } else {
+          textChunk.lastAdvanceHeight = height;
+          textChunk.height += Math.abs(height);
+        }
+        return textChunk;
+      }
+      function addFakeSpaces(width, strBuf) {
+        if (width < textContentItem.fakeSpaceMin) {
+          return;
+        }
+        if (width < textContentItem.fakeMultiSpaceMin) {
+          strBuf.push(' ');
+          return;
+        }
+        var fakeSpaces = Math.round(width / textContentItem.spaceWidth);
+        while (fakeSpaces-- > 0) {
+          strBuf.push(' ');
+        }
+      }
+      function flushTextContentItem() {
+        if (!textContentItem.initialized) {
+          return;
+        }
+        textContentItem.width *= textContentItem.textAdvanceScale;
+        textContentItem.height *= textContentItem.textAdvanceScale;
+        textContent.items.push(runBidiTransform(textContentItem));
+        textContentItem.initialized = false;
+        textContentItem.str.length = 0;
+      }
+      function enqueueChunk() {
+        var length = textContent.items.length;
+        if (length > 0) {
+          sink.enqueue(textContent, length);
+          textContent.items = [];
+          textContent.styles = Object.create(null);
+        }
+      }
+      var timeSlotManager = new TimeSlotManager();
+      return new Promise(function promiseBody(resolve, reject) {
+        var next = function next(promise) {
+          enqueueChunk();
+          Promise.all([promise, sink.ready]).then(function () {
+            try {
+              promiseBody(resolve, reject);
+            } catch (ex) {
+              reject(ex);
+            }
+          }, reject);
+        };
+        task.ensureNotTerminated();
+        timeSlotManager.reset();
+        var stop,
+            operation = {},
+            args = [];
+        while (!(stop = timeSlotManager.check())) {
+          args.length = 0;
+          operation.args = args;
+          if (!preprocessor.read(operation)) {
+            break;
+          }
+          textState = stateManager.state;
+          var fn = operation.fn;
+          args = operation.args;
+          var advance, diff;
+          switch (fn | 0) {
+            case _util.OPS.setFont:
+              var fontNameArg = args[0].name,
+                  fontSizeArg = args[1];
+              if (textState.font && fontNameArg === textState.fontName && fontSizeArg === textState.fontSize) {
+                break;
+              }
+              flushTextContentItem();
+              textState.fontName = fontNameArg;
+              textState.fontSize = fontSizeArg;
+              next(handleSetFont(fontNameArg, null));
+              return;
+            case _util.OPS.setTextRise:
+              flushTextContentItem();
+              textState.textRise = args[0];
+              break;
+            case _util.OPS.setHScale:
+              flushTextContentItem();
+              textState.textHScale = args[0] / 100;
+              break;
+            case _util.OPS.setLeading:
+              flushTextContentItem();
+              textState.leading = args[0];
+              break;
+            case _util.OPS.moveText:
+              var isSameTextLine = !textState.font ? false : (textState.font.vertical ? args[0] : args[1]) === 0;
+              advance = args[0] - args[1];
+              if (combineTextItems && isSameTextLine && textContentItem.initialized && advance > 0 && advance <= textContentItem.fakeMultiSpaceMax) {
+                textState.translateTextLineMatrix(args[0], args[1]);
+                textContentItem.width += args[0] - textContentItem.lastAdvanceWidth;
+                textContentItem.height += args[1] - textContentItem.lastAdvanceHeight;
+                diff = args[0] - textContentItem.lastAdvanceWidth - (args[1] - textContentItem.lastAdvanceHeight);
+                addFakeSpaces(diff, textContentItem.str);
+                break;
+              }
+              flushTextContentItem();
+              textState.translateTextLineMatrix(args[0], args[1]);
+              textState.textMatrix = textState.textLineMatrix.slice();
+              break;
+            case _util.OPS.setLeadingMoveText:
+              flushTextContentItem();
+              textState.leading = -args[1];
+              textState.translateTextLineMatrix(args[0], args[1]);
+              textState.textMatrix = textState.textLineMatrix.slice();
+              break;
+            case _util.OPS.nextLine:
+              flushTextContentItem();
+              textState.carriageReturn();
+              break;
+            case _util.OPS.setTextMatrix:
+              advance = textState.calcTextLineMatrixAdvance(args[0], args[1], args[2], args[3], args[4], args[5]);
+              if (combineTextItems && advance !== null && textContentItem.initialized && advance.value > 0 && advance.value <= textContentItem.fakeMultiSpaceMax) {
+                textState.translateTextLineMatrix(advance.width, advance.height);
+                textContentItem.width += advance.width - textContentItem.lastAdvanceWidth;
+                textContentItem.height += advance.height - textContentItem.lastAdvanceHeight;
+                diff = advance.width - textContentItem.lastAdvanceWidth - (advance.height - textContentItem.lastAdvanceHeight);
+                addFakeSpaces(diff, textContentItem.str);
+                break;
+              }
+              flushTextContentItem();
+              textState.setTextMatrix(args[0], args[1], args[2], args[3], args[4], args[5]);
+              textState.setTextLineMatrix(args[0], args[1], args[2], args[3], args[4], args[5]);
+              break;
+            case _util.OPS.setCharSpacing:
+              textState.charSpacing = args[0];
+              break;
+            case _util.OPS.setWordSpacing:
+              textState.wordSpacing = args[0];
+              break;
+            case _util.OPS.beginText:
+              flushTextContentItem();
+              textState.textMatrix = _util.IDENTITY_MATRIX.slice();
+              textState.textLineMatrix = _util.IDENTITY_MATRIX.slice();
+              break;
+            case _util.OPS.showSpacedText:
+              var items = args[0];
+              var offset;
+              for (var j = 0, jj = items.length; j < jj; j++) {
+                if (typeof items[j] === 'string') {
+                  buildTextContentItem(items[j]);
+                } else if ((0, _util.isNum)(items[j])) {
+                  ensureTextContentItem();
+                  advance = items[j] * textState.fontSize / 1000;
+                  var breakTextRun = false;
+                  if (textState.font.vertical) {
+                    offset = advance;
+                    textState.translateTextMatrix(0, offset);
+                    breakTextRun = textContentItem.textRunBreakAllowed && advance > textContentItem.fakeMultiSpaceMax;
+                    if (!breakTextRun) {
+                      textContentItem.height += offset;
+                    }
+                  } else {
+                    advance = -advance;
+                    offset = advance * textState.textHScale;
+                    textState.translateTextMatrix(offset, 0);
+                    breakTextRun = textContentItem.textRunBreakAllowed && advance > textContentItem.fakeMultiSpaceMax;
+                    if (!breakTextRun) {
+                      textContentItem.width += offset;
+                    }
+                  }
+                  if (breakTextRun) {
+                    flushTextContentItem();
+                  } else if (advance > 0) {
+                    addFakeSpaces(advance, textContentItem.str);
+                  }
+                }
+              }
+              break;
+            case _util.OPS.showText:
+              buildTextContentItem(args[0]);
+              break;
+            case _util.OPS.nextLineShowText:
+              flushTextContentItem();
+              textState.carriageReturn();
+              buildTextContentItem(args[0]);
+              break;
+            case _util.OPS.nextLineSetSpacingShowText:
+              flushTextContentItem();
+              textState.wordSpacing = args[0];
+              textState.charSpacing = args[1];
+              textState.carriageReturn();
+              buildTextContentItem(args[2]);
+              break;
+            case _util.OPS.paintXObject:
+              flushTextContentItem();
+              if (!xobjs) {
+                xobjs = resources.get('XObject') || _primitives.Dict.empty;
+              }
+              var name = args[0].name;
+              if (name && skipEmptyXObjs[name] !== undefined) {
+                break;
+              }
+              next(new Promise(function (resolveXObject, rejectXObject) {
+                if (!name) {
+                  throw new _util.FormatError('XObject must be referred to by name.');
+                }
+                var xobj = xobjs.get(name);
+                if (!xobj) {
+                  resolveXObject();
+                  return;
+                }
+                if (!(0, _primitives.isStream)(xobj)) {
+                  throw new _util.FormatError('XObject should be a stream');
+                }
+                var type = xobj.dict.get('Subtype');
+                if (!(0, _primitives.isName)(type)) {
+                  throw new _util.FormatError('XObject should have a Name subtype');
+                }
+                if (type.name !== 'Form') {
+                  skipEmptyXObjs[name] = true;
+                  resolveXObject();
+                  return;
+                }
+                var currentState = stateManager.state.clone();
+                var xObjStateManager = new StateManager(currentState);
+                var matrix = xobj.dict.getArray('Matrix');
+                if (Array.isArray(matrix) && matrix.length === 6) {
+                  xObjStateManager.transform(matrix);
+                }
+                enqueueChunk();
+                var sinkWrapper = {
+                  enqueueInvoked: false,
+                  enqueue: function enqueue(chunk, size) {
+                    this.enqueueInvoked = true;
+                    sink.enqueue(chunk, size);
+                  },
+
+                  get desiredSize() {
+                    return sink.desiredSize;
+                  },
+                  get ready() {
+                    return sink.ready;
+                  }
+                };
+                self.getTextContent({
+                  stream: xobj,
+                  task: task,
+                  resources: xobj.dict.get('Resources') || resources,
+                  stateManager: xObjStateManager,
+                  normalizeWhitespace: normalizeWhitespace,
+                  combineTextItems: combineTextItems,
+                  sink: sinkWrapper,
+                  seenStyles: seenStyles
+                }).then(function () {
+                  if (!sinkWrapper.enqueueInvoked) {
+                    skipEmptyXObjs[name] = true;
+                  }
+                  resolveXObject();
+                }, rejectXObject);
+              }).catch(function (reason) {
+                if (reason instanceof _util.AbortException) {
+                  return;
+                }
+                if (self.options.ignoreErrors) {
+                  (0, _util.warn)('getTextContent - ignoring XObject: "' + reason + '".');
+                  return;
+                }
+                throw reason;
+              }));
+              return;
+            case _util.OPS.setGState:
+              flushTextContentItem();
+              var dictName = args[0];
+              var extGState = resources.get('ExtGState');
+              if (!(0, _primitives.isDict)(extGState) || !(0, _primitives.isName)(dictName)) {
+                break;
+              }
+              var gState = extGState.get(dictName.name);
+              if (!(0, _primitives.isDict)(gState)) {
+                break;
+              }
+              var gStateFont = gState.get('Font');
+              if (gStateFont) {
+                textState.fontName = null;
+                textState.fontSize = gStateFont[1];
+                next(handleSetFont(null, gStateFont[0]));
+                return;
+              }
+              break;
+          }
+          if (textContent.items.length >= sink.desiredSize) {
+            stop = true;
+            break;
+          }
+        }
+        if (stop) {
+          next(deferred);
+          return;
+        }
+        flushTextContentItem();
+        enqueueChunk();
+        resolve();
+      }).catch(function (reason) {
+        if (reason instanceof _util.AbortException) {
+          return;
+        }
+        if (_this9.options.ignoreErrors) {
+          (0, _util.warn)('getTextContent - ignoring errors during "' + task.name + '" ' + ('task: "' + reason + '".'));
+          flushTextContentItem();
+          enqueueChunk();
+          return;
+        }
+        throw reason;
+      });
+    },
+
+    extractDataStructures: function PartialEvaluator_extractDataStructures(dict, baseDict, properties) {
+      var _this10 = this;
+
+      var xref = this.xref;
+      var toUnicode = dict.get('ToUnicode') || baseDict.get('ToUnicode');
+      var toUnicodePromise = toUnicode ? this.readToUnicode(toUnicode) : Promise.resolve(undefined);
+      if (properties.composite) {
+        var cidSystemInfo = dict.get('CIDSystemInfo');
+        if ((0, _primitives.isDict)(cidSystemInfo)) {
+          properties.cidSystemInfo = {
+            registry: (0, _util.stringToPDFString)(cidSystemInfo.get('Registry')),
+            ordering: (0, _util.stringToPDFString)(cidSystemInfo.get('Ordering')),
+            supplement: cidSystemInfo.get('Supplement')
+          };
+        }
+        var cidToGidMap = dict.get('CIDToGIDMap');
+        if ((0, _primitives.isStream)(cidToGidMap)) {
+          properties.cidToGidMap = this.readCidToGidMap(cidToGidMap);
+        }
+      }
+      var differences = [];
+      var baseEncodingName = null;
+      var encoding;
+      if (dict.has('Encoding')) {
+        encoding = dict.get('Encoding');
+        if ((0, _primitives.isDict)(encoding)) {
+          baseEncodingName = encoding.get('BaseEncoding');
+          baseEncodingName = (0, _primitives.isName)(baseEncodingName) ? baseEncodingName.name : null;
+          if (encoding.has('Differences')) {
+            var diffEncoding = encoding.get('Differences');
+            var index = 0;
+            for (var j = 0, jj = diffEncoding.length; j < jj; j++) {
+              var data = xref.fetchIfRef(diffEncoding[j]);
+              if ((0, _util.isNum)(data)) {
+                index = data;
+              } else if ((0, _primitives.isName)(data)) {
+                differences[index++] = data.name;
+              } else {
+                throw new _util.FormatError('Invalid entry in \'Differences\' array: ' + data);
+              }
+            }
+          }
+        } else if ((0, _primitives.isName)(encoding)) {
+          baseEncodingName = encoding.name;
+        } else {
+          throw new _util.FormatError('Encoding is not a Name nor a Dict');
+        }
+        if (baseEncodingName !== 'MacRomanEncoding' && baseEncodingName !== 'MacExpertEncoding' && baseEncodingName !== 'WinAnsiEncoding') {
+          baseEncodingName = null;
+        }
+      }
+      if (baseEncodingName) {
+        properties.defaultEncoding = (0, _encodings.getEncoding)(baseEncodingName).slice();
+      } else {
+        var isSymbolicFont = !!(properties.flags & _fonts.FontFlags.Symbolic);
+        var isNonsymbolicFont = !!(properties.flags & _fonts.FontFlags.Nonsymbolic);
+        encoding = _encodings.StandardEncoding;
+        if (properties.type === 'TrueType' && !isNonsymbolicFont) {
+          encoding = _encodings.WinAnsiEncoding;
+        }
+        if (isSymbolicFont) {
+          encoding = _encodings.MacRomanEncoding;
+          if (!properties.file) {
+            if (/Symbol/i.test(properties.name)) {
+              encoding = _encodings.SymbolSetEncoding;
+            } else if (/Dingbats/i.test(properties.name)) {
+              encoding = _encodings.ZapfDingbatsEncoding;
+            }
+          }
+        }
+        properties.defaultEncoding = encoding;
+      }
+      properties.differences = differences;
+      properties.baseEncodingName = baseEncodingName;
+      properties.hasEncoding = !!baseEncodingName || differences.length > 0;
+      properties.dict = dict;
+      return toUnicodePromise.then(function (toUnicode) {
+        properties.toUnicode = toUnicode;
+        return _this10.buildToUnicode(properties);
+      }).then(function (toUnicode) {
+        properties.toUnicode = toUnicode;
+        return properties;
+      });
+    },
+    _buildSimpleFontToUnicode: function _buildSimpleFontToUnicode(properties) {
+      (0, _util.assert)(!properties.composite, 'Must be a simple font.');
+      var toUnicode = [],
+          charcode = void 0,
+          glyphName = void 0;
+      var encoding = properties.defaultEncoding.slice();
+      var baseEncodingName = properties.baseEncodingName;
+      var differences = properties.differences;
+      for (charcode in differences) {
+        glyphName = differences[charcode];
+        if (glyphName === '.notdef') {
+          continue;
+        }
+        encoding[charcode] = glyphName;
+      }
+      var glyphsUnicodeMap = (0, _glyphlist.getGlyphsUnicode)();
+      for (charcode in encoding) {
+        glyphName = encoding[charcode];
+        if (glyphName === '') {
+          continue;
+        } else if (glyphsUnicodeMap[glyphName] === undefined) {
+          var code = 0;
+          switch (glyphName[0]) {
+            case 'G':
+              if (glyphName.length === 3) {
+                code = parseInt(glyphName.substring(1), 16);
+              }
+              break;
+            case 'g':
+              if (glyphName.length === 5) {
+                code = parseInt(glyphName.substring(1), 16);
+              }
+              break;
+            case 'C':
+            case 'c':
+              if (glyphName.length >= 3) {
+                code = +glyphName.substring(1);
+              }
+              break;
+            default:
+              var unicode = (0, _unicode.getUnicodeForGlyph)(glyphName, glyphsUnicodeMap);
+              if (unicode !== -1) {
+                code = unicode;
+              }
+          }
+          if (code) {
+            if (baseEncodingName && code === +charcode) {
+              var baseEncoding = (0, _encodings.getEncoding)(baseEncodingName);
+              if (baseEncoding && (glyphName = baseEncoding[charcode])) {
+                toUnicode[charcode] = String.fromCharCode(glyphsUnicodeMap[glyphName]);
+                continue;
+              }
+            }
+            toUnicode[charcode] = String.fromCharCode(code);
+          }
+          continue;
+        }
+        toUnicode[charcode] = String.fromCharCode(glyphsUnicodeMap[glyphName]);
+      }
+      return new _fonts.ToUnicodeMap(toUnicode);
+    },
+    buildToUnicode: function buildToUnicode(properties) {
+      properties.hasIncludedToUnicodeMap = !!properties.toUnicode && properties.toUnicode.length > 0;
+      if (properties.hasIncludedToUnicodeMap) {
+        if (!properties.composite && properties.hasEncoding) {
+          properties.fallbackToUnicode = this._buildSimpleFontToUnicode(properties);
+        }
+        return Promise.resolve(properties.toUnicode);
+      }
+      if (!properties.composite) {
+        return Promise.resolve(this._buildSimpleFontToUnicode(properties));
+      }
+      if (properties.composite && (properties.cMap.builtInCMap && !(properties.cMap instanceof _cmap.IdentityCMap) || properties.cidSystemInfo.registry === 'Adobe' && (properties.cidSystemInfo.ordering === 'GB1' || properties.cidSystemInfo.ordering === 'CNS1' || properties.cidSystemInfo.ordering === 'Japan1' || properties.cidSystemInfo.ordering === 'Korea1'))) {
+        var registry = properties.cidSystemInfo.registry;
+        var ordering = properties.cidSystemInfo.ordering;
+        var ucs2CMapName = _primitives.Name.get(registry + '-' + ordering + '-UCS2');
+        return _cmap.CMapFactory.create({
+          encoding: ucs2CMapName,
+          fetchBuiltInCMap: this.fetchBuiltInCMap,
+          useCMap: null
+        }).then(function (ucs2CMap) {
+          var cMap = properties.cMap;
+          var toUnicode = [];
+          cMap.forEach(function (charcode, cid) {
+            if (cid > 0xffff) {
+              throw new _util.FormatError('Max size of CID is 65,535');
+            }
+            var ucs2 = ucs2CMap.lookup(cid);
+            if (ucs2) {
+              toUnicode[charcode] = String.fromCharCode((ucs2.charCodeAt(0) << 8) + ucs2.charCodeAt(1));
+            }
+          });
+          return new _fonts.ToUnicodeMap(toUnicode);
+        });
+      }
+      return Promise.resolve(new _fonts.IdentityToUnicodeMap(properties.firstChar, properties.lastChar));
+    },
+
+    readToUnicode: function PartialEvaluator_readToUnicode(toUnicode) {
+      var cmapObj = toUnicode;
+      if ((0, _primitives.isName)(cmapObj)) {
+        return _cmap.CMapFactory.create({
+          encoding: cmapObj,
+          fetchBuiltInCMap: this.fetchBuiltInCMap,
+          useCMap: null
+        }).then(function (cmap) {
+          if (cmap instanceof _cmap.IdentityCMap) {
+            return new _fonts.IdentityToUnicodeMap(0, 0xFFFF);
+          }
+          return new _fonts.ToUnicodeMap(cmap.getMap());
+        });
+      } else if ((0, _primitives.isStream)(cmapObj)) {
+        return _cmap.CMapFactory.create({
+          encoding: cmapObj,
+          fetchBuiltInCMap: this.fetchBuiltInCMap,
+          useCMap: null
+        }).then(function (cmap) {
+          if (cmap instanceof _cmap.IdentityCMap) {
+            return new _fonts.IdentityToUnicodeMap(0, 0xFFFF);
+          }
+          var map = new Array(cmap.length);
+          cmap.forEach(function (charCode, token) {
+            var str = [];
+            for (var k = 0; k < token.length; k += 2) {
+              var w1 = token.charCodeAt(k) << 8 | token.charCodeAt(k + 1);
+              if ((w1 & 0xF800) !== 0xD800) {
+                str.push(w1);
+                continue;
+              }
+              k += 2;
+              var w2 = token.charCodeAt(k) << 8 | token.charCodeAt(k + 1);
+              str.push(((w1 & 0x3ff) << 10) + (w2 & 0x3ff) + 0x10000);
+            }
+            map[charCode] = String.fromCharCode.apply(String, str);
+          });
+          return new _fonts.ToUnicodeMap(map);
+        });
+      }
+      return Promise.resolve(null);
+    },
+    readCidToGidMap: function PartialEvaluator_readCidToGidMap(cidToGidStream) {
+      var glyphsData = cidToGidStream.getBytes();
+      var result = [];
+      for (var j = 0, jj = glyphsData.length; j < jj; j++) {
+        var glyphID = glyphsData[j++] << 8 | glyphsData[j];
+        if (glyphID === 0) {
+          continue;
+        }
+        var code = j >> 1;
+        result[code] = glyphID;
+      }
+      return result;
+    },
+    extractWidths: function PartialEvaluator_extractWidths(dict, descriptor, properties) {
+      var xref = this.xref;
+      var glyphsWidths = [];
+      var defaultWidth = 0;
+      var glyphsVMetrics = [];
+      var defaultVMetrics;
+      var i, ii, j, jj, start, code, widths;
+      if (properties.composite) {
+        defaultWidth = dict.has('DW') ? dict.get('DW') : 1000;
+        widths = dict.get('W');
+        if (widths) {
+          for (i = 0, ii = widths.length; i < ii; i++) {
+            start = xref.fetchIfRef(widths[i++]);
+            code = xref.fetchIfRef(widths[i]);
+            if (Array.isArray(code)) {
+              for (j = 0, jj = code.length; j < jj; j++) {
+                glyphsWidths[start++] = xref.fetchIfRef(code[j]);
+              }
+            } else {
+              var width = xref.fetchIfRef(widths[++i]);
+              for (j = start; j <= code; j++) {
+                glyphsWidths[j] = width;
+              }
+            }
+          }
+        }
+        if (properties.vertical) {
+          var vmetrics = dict.getArray('DW2') || [880, -1000];
+          defaultVMetrics = [vmetrics[1], defaultWidth * 0.5, vmetrics[0]];
+          vmetrics = dict.get('W2');
+          if (vmetrics) {
+            for (i = 0, ii = vmetrics.length; i < ii; i++) {
+              start = xref.fetchIfRef(vmetrics[i++]);
+              code = xref.fetchIfRef(vmetrics[i]);
+              if (Array.isArray(code)) {
+                for (j = 0, jj = code.length; j < jj; j++) {
+                  glyphsVMetrics[start++] = [xref.fetchIfRef(code[j++]), xref.fetchIfRef(code[j++]), xref.fetchIfRef(code[j])];
+                }
+              } else {
+                var vmetric = [xref.fetchIfRef(vmetrics[++i]), xref.fetchIfRef(vmetrics[++i]), xref.fetchIfRef(vmetrics[++i])];
+                for (j = start; j <= code; j++) {
+                  glyphsVMetrics[j] = vmetric;
+                }
+              }
+            }
+          }
+        }
+      } else {
+        var firstChar = properties.firstChar;
+        widths = dict.get('Widths');
+        if (widths) {
+          j = firstChar;
+          for (i = 0, ii = widths.length; i < ii; i++) {
+            glyphsWidths[j++] = xref.fetchIfRef(widths[i]);
+          }
+          defaultWidth = parseFloat(descriptor.get('MissingWidth')) || 0;
+        } else {
+          var baseFontName = dict.get('BaseFont');
+          if ((0, _primitives.isName)(baseFontName)) {
+            var metrics = this.getBaseFontMetrics(baseFontName.name);
+            glyphsWidths = this.buildCharCodeToWidth(metrics.widths, properties);
+            defaultWidth = metrics.defaultWidth;
+          }
+        }
+      }
+      var isMonospace = true;
+      var firstWidth = defaultWidth;
+      for (var glyph in glyphsWidths) {
+        var glyphWidth = glyphsWidths[glyph];
+        if (!glyphWidth) {
+          continue;
+        }
+        if (!firstWidth) {
+          firstWidth = glyphWidth;
+          continue;
+        }
+        if (firstWidth !== glyphWidth) {
+          isMonospace = false;
+          break;
+        }
+      }
+      if (isMonospace) {
+        properties.flags |= _fonts.FontFlags.FixedPitch;
+      }
+      properties.defaultWidth = defaultWidth;
+      properties.widths = glyphsWidths;
+      properties.defaultVMetrics = defaultVMetrics;
+      properties.vmetrics = glyphsVMetrics;
+    },
+    isSerifFont: function PartialEvaluator_isSerifFont(baseFontName) {
+      var fontNameWoStyle = baseFontName.split('-')[0];
+      return fontNameWoStyle in (0, _standard_fonts.getSerifFonts)() || fontNameWoStyle.search(/serif/gi) !== -1;
+    },
+    getBaseFontMetrics: function PartialEvaluator_getBaseFontMetrics(name) {
+      var defaultWidth = 0;
+      var widths = [];
+      var monospace = false;
+      var stdFontMap = (0, _standard_fonts.getStdFontMap)();
+      var lookupName = stdFontMap[name] || name;
+      var Metrics = (0, _metrics.getMetrics)();
+      if (!(lookupName in Metrics)) {
+        if (this.isSerifFont(name)) {
+          lookupName = 'Times-Roman';
+        } else {
+          lookupName = 'Helvetica';
+        }
+      }
+      var glyphWidths = Metrics[lookupName];
+      if ((0, _util.isNum)(glyphWidths)) {
+        defaultWidth = glyphWidths;
+        monospace = true;
+      } else {
+        widths = glyphWidths();
+      }
+      return {
+        defaultWidth: defaultWidth,
+        monospace: monospace,
+        widths: widths
+      };
+    },
+    buildCharCodeToWidth: function PartialEvaluator_bulildCharCodeToWidth(widthsByGlyphName, properties) {
+      var widths = Object.create(null);
+      var differences = properties.differences;
+      var encoding = properties.defaultEncoding;
+      for (var charCode = 0; charCode < 256; charCode++) {
+        if (charCode in differences && widthsByGlyphName[differences[charCode]]) {
+          widths[charCode] = widthsByGlyphName[differences[charCode]];
+          continue;
+        }
+        if (charCode in encoding && widthsByGlyphName[encoding[charCode]]) {
+          widths[charCode] = widthsByGlyphName[encoding[charCode]];
+          continue;
+        }
+      }
+      return widths;
+    },
+    preEvaluateFont: function PartialEvaluator_preEvaluateFont(dict) {
+      var baseDict = dict;
+      var type = dict.get('Subtype');
+      if (!(0, _primitives.isName)(type)) {
+        throw new _util.FormatError('invalid font Subtype');
+      }
+      var composite = false;
+      var uint8array;
+      if (type.name === 'Type0') {
+        var df = dict.get('DescendantFonts');
+        if (!df) {
+          throw new _util.FormatError('Descendant fonts are not specified');
+        }
+        dict = Array.isArray(df) ? this.xref.fetchIfRef(df[0]) : df;
+        type = dict.get('Subtype');
+        if (!(0, _primitives.isName)(type)) {
+          throw new _util.FormatError('invalid font Subtype');
+        }
+        composite = true;
+      }
+      var descriptor = dict.get('FontDescriptor');
+      if (descriptor) {
+        var hash = new _murmurhash.MurmurHash3_64();
+        var encoding = baseDict.getRaw('Encoding');
+        if ((0, _primitives.isName)(encoding)) {
+          hash.update(encoding.name);
+        } else if ((0, _primitives.isRef)(encoding)) {
+          hash.update(encoding.toString());
+        } else if ((0, _primitives.isDict)(encoding)) {
+          var keys = encoding.getKeys();
+          for (var i = 0, ii = keys.length; i < ii; i++) {
+            var entry = encoding.getRaw(keys[i]);
+            if ((0, _primitives.isName)(entry)) {
+              hash.update(entry.name);
+            } else if ((0, _primitives.isRef)(entry)) {
+              hash.update(entry.toString());
+            } else if (Array.isArray(entry)) {
+              var diffLength = entry.length,
+                  diffBuf = new Array(diffLength);
+              for (var j = 0; j < diffLength; j++) {
+                var diffEntry = entry[j];
+                if ((0, _primitives.isName)(diffEntry)) {
+                  diffBuf[j] = diffEntry.name;
+                } else if ((0, _util.isNum)(diffEntry) || (0, _primitives.isRef)(diffEntry)) {
+                  diffBuf[j] = diffEntry.toString();
+                }
+              }
+              hash.update(diffBuf.join());
+            }
+          }
+        }
+        var toUnicode = dict.get('ToUnicode') || baseDict.get('ToUnicode');
+        if ((0, _primitives.isStream)(toUnicode)) {
+          var stream = toUnicode.str || toUnicode;
+          uint8array = stream.buffer ? new Uint8Array(stream.buffer.buffer, 0, stream.bufferLength) : new Uint8Array(stream.bytes.buffer, stream.start, stream.end - stream.start);
+          hash.update(uint8array);
+        } else if ((0, _primitives.isName)(toUnicode)) {
+          hash.update(toUnicode.name);
+        }
+        var widths = dict.get('Widths') || baseDict.get('Widths');
+        if (widths) {
+          uint8array = new Uint8Array(new Uint32Array(widths).buffer);
+          hash.update(uint8array);
+        }
+      }
+      return {
+        descriptor: descriptor,
+        dict: dict,
+        baseDict: baseDict,
+        composite: composite,
+        type: type.name,
+        hash: hash ? hash.hexdigest() : ''
+      };
+    },
+    translateFont: function PartialEvaluator_translateFont(preEvaluatedFont) {
+      var _this11 = this;
+
+      var baseDict = preEvaluatedFont.baseDict;
+      var dict = preEvaluatedFont.dict;
+      var composite = preEvaluatedFont.composite;
+      var descriptor = preEvaluatedFont.descriptor;
+      var type = preEvaluatedFont.type;
+      var maxCharIndex = composite ? 0xFFFF : 0xFF;
+      var properties;
+      if (!descriptor) {
+        if (type === 'Type3') {
+          descriptor = new _primitives.Dict(null);
+          descriptor.set('FontName', _primitives.Name.get(type));
+          descriptor.set('FontBBox', dict.getArray('FontBBox'));
+        } else {
+          var baseFontName = dict.get('BaseFont');
+          if (!(0, _primitives.isName)(baseFontName)) {
+            throw new _util.FormatError('Base font is not specified');
+          }
+          baseFontName = baseFontName.name.replace(/[,_]/g, '-');
+          var metrics = this.getBaseFontMetrics(baseFontName);
+          var fontNameWoStyle = baseFontName.split('-')[0];
+          var flags = (this.isSerifFont(fontNameWoStyle) ? _fonts.FontFlags.Serif : 0) | (metrics.monospace ? _fonts.FontFlags.FixedPitch : 0) | ((0, _standard_fonts.getSymbolsFonts)()[fontNameWoStyle] ? _fonts.FontFlags.Symbolic : _fonts.FontFlags.Nonsymbolic);
+          properties = {
+            type: type,
+            name: baseFontName,
+            widths: metrics.widths,
+            defaultWidth: metrics.defaultWidth,
+            flags: flags,
+            firstChar: 0,
+            lastChar: maxCharIndex
+          };
+          return this.extractDataStructures(dict, dict, properties).then(function (properties) {
+            properties.widths = _this11.buildCharCodeToWidth(metrics.widths, properties);
+            return new _fonts.Font(baseFontName, null, properties);
+          });
+        }
+      }
+      var firstChar = dict.get('FirstChar') || 0;
+      var lastChar = dict.get('LastChar') || maxCharIndex;
+      var fontName = descriptor.get('FontName');
+      var baseFont = dict.get('BaseFont');
+      if ((0, _util.isString)(fontName)) {
+        fontName = _primitives.Name.get(fontName);
+      }
+      if ((0, _util.isString)(baseFont)) {
+        baseFont = _primitives.Name.get(baseFont);
+      }
+      if (type !== 'Type3') {
+        var fontNameStr = fontName && fontName.name;
+        var baseFontStr = baseFont && baseFont.name;
+        if (fontNameStr !== baseFontStr) {
+          (0, _util.info)('The FontDescriptor\'s FontName is "' + fontNameStr + '" but should be the same as the Font\'s BaseFont "' + baseFontStr + '"');
+          if (fontNameStr && baseFontStr && baseFontStr.indexOf(fontNameStr) === 0) {
+            fontName = baseFont;
+          }
+        }
+      }
+      fontName = fontName || baseFont;
+      if (!(0, _primitives.isName)(fontName)) {
+        throw new _util.FormatError('invalid font name');
+      }
+      var fontFile = descriptor.get('FontFile', 'FontFile2', 'FontFile3');
+      if (fontFile) {
+        if (fontFile.dict) {
+          var subtype = fontFile.dict.get('Subtype');
+          if (subtype) {
+            subtype = subtype.name;
+          }
+          var length1 = fontFile.dict.get('Length1');
+          var length2 = fontFile.dict.get('Length2');
+          var length3 = fontFile.dict.get('Length3');
+        }
+      }
+      properties = {
+        type: type,
+        name: fontName.name,
+        subtype: subtype,
+        file: fontFile,
+        length1: length1,
+        length2: length2,
+        length3: length3,
+        loadedName: baseDict.loadedName,
+        composite: composite,
+        wideChars: composite,
+        fixedPitch: false,
+        fontMatrix: dict.getArray('FontMatrix') || _util.FONT_IDENTITY_MATRIX,
+        firstChar: firstChar || 0,
+        lastChar: lastChar || maxCharIndex,
+        bbox: descriptor.getArray('FontBBox'),
+        ascent: descriptor.get('Ascent'),
+        descent: descriptor.get('Descent'),
+        xHeight: descriptor.get('XHeight'),
+        capHeight: descriptor.get('CapHeight'),
+        flags: descriptor.get('Flags'),
+        italicAngle: descriptor.get('ItalicAngle'),
+        isType3Font: false
+      };
+      var cMapPromise;
+      if (composite) {
+        var cidEncoding = baseDict.get('Encoding');
+        if ((0, _primitives.isName)(cidEncoding)) {
+          properties.cidEncoding = cidEncoding.name;
+        }
+        cMapPromise = _cmap.CMapFactory.create({
+          encoding: cidEncoding,
+          fetchBuiltInCMap: this.fetchBuiltInCMap,
+          useCMap: null
+        }).then(function (cMap) {
+          properties.cMap = cMap;
+          properties.vertical = properties.cMap.vertical;
+        });
+      } else {
+        cMapPromise = Promise.resolve(undefined);
+      }
+      return cMapPromise.then(function () {
+        return _this11.extractDataStructures(dict, baseDict, properties);
+      }).then(function (properties) {
+        _this11.extractWidths(dict, descriptor, properties);
+        if (type === 'Type3') {
+          properties.isType3Font = true;
+        }
+        return new _fonts.Font(fontName.name, fontFile, properties);
+      });
+    }
+  };
+  return PartialEvaluator;
+}();
+var TranslatedFont = function TranslatedFontClosure() {
+  function TranslatedFont(loadedName, font, dict) {
+    this.loadedName = loadedName;
+    this.font = font;
+    this.dict = dict;
+    this.type3Loaded = null;
+    this.sent = false;
+  }
+  TranslatedFont.prototype = {
+    send: function send(handler) {
+      if (this.sent) {
+        return;
+      }
+      var fontData = this.font.exportData();
+      handler.send('commonobj', [this.loadedName, 'Font', fontData]);
+      this.sent = true;
+    },
+    loadType3Data: function loadType3Data(evaluator, resources, parentOperatorList, task) {
+      if (!this.font.isType3Font) {
+        throw new Error('Must be a Type3 font.');
+      }
+      if (this.type3Loaded) {
+        return this.type3Loaded;
+      }
+      var type3Options = Object.create(evaluator.options);
+      type3Options.ignoreErrors = false;
+      var type3Evaluator = evaluator.clone(type3Options);
+      var translatedFont = this.font;
+      var loadCharProcsPromise = Promise.resolve();
+      var charProcs = this.dict.get('CharProcs');
+      var fontResources = this.dict.get('Resources') || resources;
+      var charProcKeys = charProcs.getKeys();
+      var charProcOperatorList = Object.create(null);
+
+      var _loop2 = function _loop2() {
+        var key = charProcKeys[i];
+        loadCharProcsPromise = loadCharProcsPromise.then(function () {
+          var glyphStream = charProcs.get(key);
+          var operatorList = new _operator_list.OperatorList();
+          return type3Evaluator.getOperatorList({
+            stream: glyphStream,
+            task: task,
+            resources: fontResources,
+            operatorList: operatorList
+          }).then(function () {
+            charProcOperatorList[key] = operatorList.getIR();
+            parentOperatorList.addDependencies(operatorList.dependencies);
+          }).catch(function (reason) {
+            (0, _util.warn)('Type3 font resource "' + key + '" is not available.');
+            var operatorList = new _operator_list.OperatorList();
+            charProcOperatorList[key] = operatorList.getIR();
+          });
+        });
+      };
+
+      for (var i = 0, n = charProcKeys.length; i < n; ++i) {
+        _loop2();
+      }
+      this.type3Loaded = loadCharProcsPromise.then(function () {
+        translatedFont.charProcOperatorList = charProcOperatorList;
+      });
+      return this.type3Loaded;
+    }
+  };
+  return TranslatedFont;
+}();
+var StateManager = function StateManagerClosure() {
+  function StateManager(initialState) {
+    this.state = initialState;
+    this.stateStack = [];
+  }
+  StateManager.prototype = {
+    save: function save() {
+      var old = this.state;
+      this.stateStack.push(this.state);
+      this.state = old.clone();
+    },
+    restore: function restore() {
+      var prev = this.stateStack.pop();
+      if (prev) {
+        this.state = prev;
+      }
+    },
+    transform: function transform(args) {
+      this.state.ctm = _util.Util.transform(this.state.ctm, args);
+    }
+  };
+  return StateManager;
+}();
+var TextState = function TextStateClosure() {
+  function TextState() {
+    this.ctm = new Float32Array(_util.IDENTITY_MATRIX);
+    this.fontName = null;
+    this.fontSize = 0;
+    this.font = null;
+    this.fontMatrix = _util.FONT_IDENTITY_MATRIX;
+    this.textMatrix = _util.IDENTITY_MATRIX.slice();
+    this.textLineMatrix = _util.IDENTITY_MATRIX.slice();
+    this.charSpacing = 0;
+    this.wordSpacing = 0;
+    this.leading = 0;
+    this.textHScale = 1;
+    this.textRise = 0;
+  }
+  TextState.prototype = {
+    setTextMatrix: function TextState_setTextMatrix(a, b, c, d, e, f) {
+      var m = this.textMatrix;
+      m[0] = a;
+      m[1] = b;
+      m[2] = c;
+      m[3] = d;
+      m[4] = e;
+      m[5] = f;
+    },
+    setTextLineMatrix: function TextState_setTextMatrix(a, b, c, d, e, f) {
+      var m = this.textLineMatrix;
+      m[0] = a;
+      m[1] = b;
+      m[2] = c;
+      m[3] = d;
+      m[4] = e;
+      m[5] = f;
+    },
+    translateTextMatrix: function TextState_translateTextMatrix(x, y) {
+      var m = this.textMatrix;
+      m[4] = m[0] * x + m[2] * y + m[4];
+      m[5] = m[1] * x + m[3] * y + m[5];
+    },
+    translateTextLineMatrix: function TextState_translateTextMatrix(x, y) {
+      var m = this.textLineMatrix;
+      m[4] = m[0] * x + m[2] * y + m[4];
+      m[5] = m[1] * x + m[3] * y + m[5];
+    },
+    calcTextLineMatrixAdvance: function TextState_calcTextLineMatrixAdvance(a, b, c, d, e, f) {
+      var font = this.font;
+      if (!font) {
+        return null;
+      }
+      var m = this.textLineMatrix;
+      if (!(a === m[0] && b === m[1] && c === m[2] && d === m[3])) {
+        return null;
+      }
+      var txDiff = e - m[4],
+          tyDiff = f - m[5];
+      if (font.vertical && txDiff !== 0 || !font.vertical && tyDiff !== 0) {
+        return null;
+      }
+      var tx,
+          ty,
+          denominator = a * d - b * c;
+      if (font.vertical) {
+        tx = -tyDiff * c / denominator;
+        ty = tyDiff * a / denominator;
+      } else {
+        tx = txDiff * d / denominator;
+        ty = -txDiff * b / denominator;
+      }
+      return {
+        width: tx,
+        height: ty,
+        value: font.vertical ? ty : tx
+      };
+    },
+    calcRenderMatrix: function TextState_calcRendeMatrix(ctm) {
+      var tsm = [this.fontSize * this.textHScale, 0, 0, this.fontSize, 0, this.textRise];
+      return _util.Util.transform(ctm, _util.Util.transform(this.textMatrix, tsm));
+    },
+    carriageReturn: function TextState_carriageReturn() {
+      this.translateTextLineMatrix(0, -this.leading);
+      this.textMatrix = this.textLineMatrix.slice();
+    },
+    clone: function TextState_clone() {
+      var clone = Object.create(this);
+      clone.textMatrix = this.textMatrix.slice();
+      clone.textLineMatrix = this.textLineMatrix.slice();
+      clone.fontMatrix = this.fontMatrix.slice();
+      return clone;
+    }
+  };
+  return TextState;
+}();
+var EvalState = function EvalStateClosure() {
+  function EvalState() {
+    this.ctm = new Float32Array(_util.IDENTITY_MATRIX);
+    this.font = null;
+    this.textRenderingMode = _util.TextRenderingMode.FILL;
+    this.fillColorSpace = _colorspace.ColorSpace.singletons.gray;
+    this.strokeColorSpace = _colorspace.ColorSpace.singletons.gray;
+  }
+  EvalState.prototype = {
+    clone: function CanvasExtraState_clone() {
+      return Object.create(this);
+    }
+  };
+  return EvalState;
+}();
+var EvaluatorPreprocessor = function EvaluatorPreprocessorClosure() {
+  var getOPMap = (0, _util.getLookupTableFactory)(function (t) {
+    t['w'] = {
+      id: _util.OPS.setLineWidth,
+      numArgs: 1,
+      variableArgs: false
+    };
+    t['J'] = {
+      id: _util.OPS.setLineCap,
+      numArgs: 1,
+      variableArgs: false
+    };
+    t['j'] = {
+      id: _util.OPS.setLineJoin,
+      numArgs: 1,
+      variableArgs: false
+    };
+    t['M'] = {
+      id: _util.OPS.setMiterLimit,
+      numArgs: 1,
+      variableArgs: false
+    };
+    t['d'] = {
+      id: _util.OPS.setDash,
+      numArgs: 2,
+      variableArgs: false
+    };
+    t['ri'] = {
+      id: _util.OPS.setRenderingIntent,
+      numArgs: 1,
+      variableArgs: false
+    };
+    t['i'] = {
+      id: _util.OPS.setFlatness,
+      numArgs: 1,
+      variableArgs: false
+    };
+    t['gs'] = {
+      id: _util.OPS.setGState,
+      numArgs: 1,
+      variableArgs: false
+    };
+    t['q'] = {
+      id: _util.OPS.save,
+      numArgs: 0,
+      variableArgs: false
+    };
+    t['Q'] = {
+      id: _util.OPS.restore,
+      numArgs: 0,
+      variableArgs: false
+    };
+    t['cm'] = {
+      id: _util.OPS.transform,
+      numArgs: 6,
+      variableArgs: false
+    };
+    t['m'] = {
+      id: _util.OPS.moveTo,
+      numArgs: 2,
+      variableArgs: false
+    };
+    t['l'] = {
+      id: _util.OPS.lineTo,
+      numArgs: 2,
+      variableArgs: false
+    };
+    t['c'] = {
+      id: _util.OPS.curveTo,
+      numArgs: 6,
+      variableArgs: false
+    };
+    t['v'] = {
+      id: _util.OPS.curveTo2,
+      numArgs: 4,
+      variableArgs: false
+    };
+    t['y'] = {
+      id: _util.OPS.curveTo3,
+      numArgs: 4,
+      variableArgs: false
+    };
+    t['h'] = {
+      id: _util.OPS.closePath,
+      numArgs: 0,
+      variableArgs: false
+    };
+    t['re'] = {
+      id: _util.OPS.rectangle,
+      numArgs: 4,
+      variableArgs: false
+    };
+    t['S'] = {
+      id: _util.OPS.stroke,
+      numArgs: 0,
+      variableArgs: false
+    };
+    t['s'] = {
+      id: _util.OPS.closeStroke,
+      numArgs: 0,
+      variableArgs: false
+    };
+    t['f'] = {
+      id: _util.OPS.fill,
+      numArgs: 0,
+      variableArgs: false
+    };
+    t['F'] = {
+      id: _util.OPS.fill,
+      numArgs: 0,
+      variableArgs: false
+    };
+    t['f*'] = {
+      id: _util.OPS.eoFill,
+      numArgs: 0,
+      variableArgs: false
+    };
+    t['B'] = {
+      id: _util.OPS.fillStroke,
+      numArgs: 0,
+      variableArgs: false
+    };
+    t['B*'] = {
+      id: _util.OPS.eoFillStroke,
+      numArgs: 0,
+      variableArgs: false
+    };
+    t['b'] = {
+      id: _util.OPS.closeFillStroke,
+      numArgs: 0,
+      variableArgs: false
+    };
+    t['b*'] = {
+      id: _util.OPS.closeEOFillStroke,
+      numArgs: 0,
+      variableArgs: false
+    };
+    t['n'] = {
+      id: _util.OPS.endPath,
+      numArgs: 0,
+      variableArgs: false
+    };
+    t['W'] = {
+      id: _util.OPS.clip,
+      numArgs: 0,
+      variableArgs: false
+    };
+    t['W*'] = {
+      id: _util.OPS.eoClip,
+      numArgs: 0,
+      variableArgs: false
+    };
+    t['BT'] = {
+      id: _util.OPS.beginText,
+      numArgs: 0,
+      variableArgs: false
+    };
+    t['ET'] = {
+      id: _util.OPS.endText,
+      numArgs: 0,
+      variableArgs: false
+    };
+    t['Tc'] = {
+      id: _util.OPS.setCharSpacing,
+      numArgs: 1,
+      variableArgs: false
+    };
+    t['Tw'] = {
+      id: _util.OPS.setWordSpacing,
+      numArgs: 1,
+      variableArgs: false
+    };
+    t['Tz'] = {
+      id: _util.OPS.setHScale,
+      numArgs: 1,
+      variableArgs: false
+    };
+    t['TL'] = {
+      id: _util.OPS.setLeading,
+      numArgs: 1,
+      variableArgs: false
+    };
+    t['Tf'] = {
+      id: _util.OPS.setFont,
+      numArgs: 2,
+      variableArgs: false
+    };
+    t['Tr'] = {
+      id: _util.OPS.setTextRenderingMode,
+      numArgs: 1,
+      variableArgs: false
+    };
+    t['Ts'] = {
+      id: _util.OPS.setTextRise,
+      numArgs: 1,
+      variableArgs: false
+    };
+    t['Td'] = {
+      id: _util.OPS.moveText,
+      numArgs: 2,
+      variableArgs: false
+    };
+    t['TD'] = {
+      id: _util.OPS.setLeadingMoveText,
+      numArgs: 2,
+      variableArgs: false
+    };
+    t['Tm'] = {
+      id: _util.OPS.setTextMatrix,
+      numArgs: 6,
+      variableArgs: false
+    };
+    t['T*'] = {
+      id: _util.OPS.nextLine,
+      numArgs: 0,
+      variableArgs: false
+    };
+    t['Tj'] = {
+      id: _util.OPS.showText,
+      numArgs: 1,
+      variableArgs: false
+    };
+    t['TJ'] = {
+      id: _util.OPS.showSpacedText,
+      numArgs: 1,
+      variableArgs: false
+    };
+    t['\''] = {
+      id: _util.OPS.nextLineShowText,
+      numArgs: 1,
+      variableArgs: false
+    };
+    t['"'] = {
+      id: _util.OPS.nextLineSetSpacingShowText,
+      numArgs: 3,
+      variableArgs: false
+    };
+    t['d0'] = {
+      id: _util.OPS.setCharWidth,
+      numArgs: 2,
+      variableArgs: false
+    };
+    t['d1'] = {
+      id: _util.OPS.setCharWidthAndBounds,
+      numArgs: 6,
+      variableArgs: false
+    };
+    t['CS'] = {
+      id: _util.OPS.setStrokeColorSpace,
+      numArgs: 1,
+      variableArgs: false
+    };
+    t['cs'] = {
+      id: _util.OPS.setFillColorSpace,
+      numArgs: 1,
+      variableArgs: false
+    };
+    t['SC'] = {
+      id: _util.OPS.setStrokeColor,
+      numArgs: 4,
+      variableArgs: true
+    };
+    t['SCN'] = {
+      id: _util.OPS.setStrokeColorN,
+      numArgs: 33,
+      variableArgs: true
+    };
+    t['sc'] = {
+      id: _util.OPS.setFillColor,
+      numArgs: 4,
+      variableArgs: true
+    };
+    t['scn'] = {
+      id: _util.OPS.setFillColorN,
+      numArgs: 33,
+      variableArgs: true
+    };
+    t['G'] = {
+      id: _util.OPS.setStrokeGray,
+      numArgs: 1,
+      variableArgs: false
+    };
+    t['g'] = {
+      id: _util.OPS.setFillGray,
+      numArgs: 1,
+      variableArgs: false
+    };
+    t['RG'] = {
+      id: _util.OPS.setStrokeRGBColor,
+      numArgs: 3,
+      variableArgs: false
+    };
+    t['rg'] = {
+      id: _util.OPS.setFillRGBColor,
+      numArgs: 3,
+      variableArgs: false
+    };
+    t['K'] = {
+      id: _util.OPS.setStrokeCMYKColor,
+      numArgs: 4,
+      variableArgs: false
+    };
+    t['k'] = {
+      id: _util.OPS.setFillCMYKColor,
+      numArgs: 4,
+      variableArgs: false
+    };
+    t['sh'] = {
+      id: _util.OPS.shadingFill,
+      numArgs: 1,
+      variableArgs: false
+    };
+    t['BI'] = {
+      id: _util.OPS.beginInlineImage,
+      numArgs: 0,
+      variableArgs: false
+    };
+    t['ID'] = {
+      id: _util.OPS.beginImageData,
+      numArgs: 0,
+      variableArgs: false
+    };
+    t['EI'] = {
+      id: _util.OPS.endInlineImage,
+      numArgs: 1,
+      variableArgs: false
+    };
+    t['Do'] = {
+      id: _util.OPS.paintXObject,
+      numArgs: 1,
+      variableArgs: false
+    };
+    t['MP'] = {
+      id: _util.OPS.markPoint,
+      numArgs: 1,
+      variableArgs: false
+    };
+    t['DP'] = {
+      id: _util.OPS.markPointProps,
+      numArgs: 2,
+      variableArgs: false
+    };
+    t['BMC'] = {
+      id: _util.OPS.beginMarkedContent,
+      numArgs: 1,
+      variableArgs: false
+    };
+    t['BDC'] = {
+      id: _util.OPS.beginMarkedContentProps,
+      numArgs: 2,
+      variableArgs: false
+    };
+    t['EMC'] = {
+      id: _util.OPS.endMarkedContent,
+      numArgs: 0,
+      variableArgs: false
+    };
+    t['BX'] = {
+      id: _util.OPS.beginCompat,
+      numArgs: 0,
+      variableArgs: false
+    };
+    t['EX'] = {
+      id: _util.OPS.endCompat,
+      numArgs: 0,
+      variableArgs: false
+    };
+    t['BM'] = null;
+    t['BD'] = null;
+    t['true'] = null;
+    t['fa'] = null;
+    t['fal'] = null;
+    t['fals'] = null;
+    t['false'] = null;
+    t['nu'] = null;
+    t['nul'] = null;
+    t['null'] = null;
+  });
+  var MAX_INVALID_PATH_OPS = 20;
+  function EvaluatorPreprocessor(stream, xref, stateManager) {
+    this.opMap = getOPMap();
+    this.parser = new _parser.Parser(new _parser.Lexer(stream, this.opMap), false, xref);
+    this.stateManager = stateManager;
+    this.nonProcessedArgs = [];
+    this._numInvalidPathOPS = 0;
+  }
+  EvaluatorPreprocessor.prototype = {
+    get savedStatesDepth() {
+      return this.stateManager.stateStack.length;
+    },
+    read: function EvaluatorPreprocessor_read(operation) {
+      var args = operation.args;
+      while (true) {
+        var obj = this.parser.getObj();
+        if ((0, _primitives.isCmd)(obj)) {
+          var cmd = obj.cmd;
+          var opSpec = this.opMap[cmd];
+          if (!opSpec) {
+            (0, _util.warn)('Unknown command "' + cmd + '".');
+            continue;
+          }
+          var fn = opSpec.id;
+          var numArgs = opSpec.numArgs;
+          var argsLength = args !== null ? args.length : 0;
+          if (!opSpec.variableArgs) {
+            if (argsLength !== numArgs) {
+              var nonProcessedArgs = this.nonProcessedArgs;
+              while (argsLength > numArgs) {
+                nonProcessedArgs.push(args.shift());
+                argsLength--;
+              }
+              while (argsLength < numArgs && nonProcessedArgs.length !== 0) {
+                if (args === null) {
+                  args = [];
+                }
+                args.unshift(nonProcessedArgs.pop());
+                argsLength++;
+              }
+            }
+            if (argsLength < numArgs) {
+              var partialMsg = 'command ' + cmd + ': expected ' + numArgs + ' args, ' + ('but received ' + argsLength + ' args.');
+              if (fn >= _util.OPS.moveTo && fn <= _util.OPS.endPath && ++this._numInvalidPathOPS > MAX_INVALID_PATH_OPS) {
+                throw new _util.FormatError('Invalid ' + partialMsg);
+              }
+              (0, _util.warn)('Skipping ' + partialMsg);
+              if (args !== null) {
+                args.length = 0;
+              }
+              continue;
+            }
+          } else if (argsLength > numArgs) {
+            (0, _util.info)('Command ' + cmd + ': expected [0, ' + numArgs + '] args, ' + ('but received ' + argsLength + ' args.'));
+          }
+          this.preprocessCommand(fn, args);
+          operation.fn = fn;
+          operation.args = args;
+          return true;
+        }
+        if ((0, _primitives.isEOF)(obj)) {
+          return false;
+        }
+        if (obj !== null) {
+          if (args === null) {
+            args = [];
+          }
+          args.push(obj);
+          if (args.length > 33) {
+            throw new _util.FormatError('Too many arguments');
+          }
+        }
+      }
+    },
+    preprocessCommand: function EvaluatorPreprocessor_preprocessCommand(fn, args) {
+      switch (fn | 0) {
+        case _util.OPS.save:
+          this.stateManager.save();
+          break;
+        case _util.OPS.restore:
+          this.stateManager.restore();
+          break;
+        case _util.OPS.transform:
+          this.stateManager.transform(args);
+          break;
+      }
+    }
+  };
+  return EvaluatorPreprocessor;
+}();
+exports.PartialEvaluator = PartialEvaluator;
+
+/***/ }),
+/* 155 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.CMapFactory = exports.IdentityCMap = exports.CMap = undefined;
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _util = __w_pdfjs_require__(2);
+
+var _primitives = __w_pdfjs_require__(138);
+
+var _parser = __w_pdfjs_require__(139);
+
+var _stream = __w_pdfjs_require__(140);
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var BUILT_IN_CMAPS = ['Adobe-GB1-UCS2', 'Adobe-CNS1-UCS2', 'Adobe-Japan1-UCS2', 'Adobe-Korea1-UCS2', '78-EUC-H', '78-EUC-V', '78-H', '78-RKSJ-H', '78-RKSJ-V', '78-V', '78ms-RKSJ-H', '78ms-RKSJ-V', '83pv-RKSJ-H', '90ms-RKSJ-H', '90ms-RKSJ-V', '90msp-RKSJ-H', '90msp-RKSJ-V', '90pv-RKSJ-H', '90pv-RKSJ-V', 'Add-H', 'Add-RKSJ-H', 'Add-RKSJ-V', 'Add-V', 'Adobe-CNS1-0', 'Adobe-CNS1-1', 'Adobe-CNS1-2', 'Adobe-CNS1-3', 'Adobe-CNS1-4', 'Adobe-CNS1-5', 'Adobe-CNS1-6', 'Adobe-GB1-0', 'Adobe-GB1-1', 'Adobe-GB1-2', 'Adobe-GB1-3', 'Adobe-GB1-4', 'Adobe-GB1-5', 'Adobe-Japan1-0', 'Adobe-Japan1-1', 'Adobe-Japan1-2', 'Adobe-Japan1-3', 'Adobe-Japan1-4', 'Adobe-Japan1-5', 'Adobe-Japan1-6', 'Adobe-Korea1-0', 'Adobe-Korea1-1', 'Adobe-Korea1-2', 'B5-H', 'B5-V', 'B5pc-H', 'B5pc-V', 'CNS-EUC-H', 'CNS-EUC-V', 'CNS1-H', 'CNS1-V', 'CNS2-H', 'CNS2-V', 'ETHK-B5-H', 'ETHK-B5-V', 'ETen-B5-H', 'ETen-B5-V', 'ETenms-B5-H', 'ETenms-B5-V', 'EUC-H', 'EUC-V', 'Ext-H', 'Ext-RKSJ-H', 'Ext-RKSJ-V', 'Ext-V', 'GB-EUC-H', 'GB-EUC-V', 'GB-H', 'GB-V', 'GBK-EUC-H', 'GBK-EUC-V', 'GBK2K-H', 'GBK2K-V', 'GBKp-EUC-H', 'GBKp-EUC-V', 'GBT-EUC-H', 'GBT-EUC-V', 'GBT-H', 'GBT-V', 'GBTpc-EUC-H', 'GBTpc-EUC-V', 'GBpc-EUC-H', 'GBpc-EUC-V', 'H', 'HKdla-B5-H', 'HKdla-B5-V', 'HKdlb-B5-H', 'HKdlb-B5-V', 'HKgccs-B5-H', 'HKgccs-B5-V', 'HKm314-B5-H', 'HKm314-B5-V', 'HKm471-B5-H', 'HKm471-B5-V', 'HKscs-B5-H', 'HKscs-B5-V', 'Hankaku', 'Hiragana', 'KSC-EUC-H', 'KSC-EUC-V', 'KSC-H', 'KSC-Johab-H', 'KSC-Johab-V', 'KSC-V', 'KSCms-UHC-H', 'KSCms-UHC-HW-H', 'KSCms-UHC-HW-V', 'KSCms-UHC-V', 'KSCpc-EUC-H', 'KSCpc-EUC-V', 'Katakana', 'NWP-H', 'NWP-V', 'RKSJ-H', 'RKSJ-V', 'Roman', 'UniCNS-UCS2-H', 'UniCNS-UCS2-V', 'UniCNS-UTF16-H', 'UniCNS-UTF16-V', 'UniCNS-UTF32-H', 'UniCNS-UTF32-V', 'UniCNS-UTF8-H', 'UniCNS-UTF8-V', 'UniGB-UCS2-H', 'UniGB-UCS2-V', 'UniGB-UTF16-H', 'UniGB-UTF16-V', 'UniGB-UTF32-H', 'UniGB-UTF32-V', 'UniGB-UTF8-H', 'UniGB-UTF8-V', 'UniJIS-UCS2-H', 'UniJIS-UCS2-HW-H', 'UniJIS-UCS2-HW-V', 'UniJIS-UCS2-V', 'UniJIS-UTF16-H', 'UniJIS-UTF16-V', 'UniJIS-UTF32-H', 'UniJIS-UTF32-V', 'UniJIS-UTF8-H', 'UniJIS-UTF8-V', 'UniJIS2004-UTF16-H', 'UniJIS2004-UTF16-V', 'UniJIS2004-UTF32-H', 'UniJIS2004-UTF32-V', 'UniJIS2004-UTF8-H', 'UniJIS2004-UTF8-V', 'UniJISPro-UCS2-HW-V', 'UniJISPro-UCS2-V', 'UniJISPro-UTF8-V', 'UniJISX0213-UTF32-H', 'UniJISX0213-UTF32-V', 'UniJISX02132004-UTF32-H', 'UniJISX02132004-UTF32-V', 'UniKS-UCS2-H', 'UniKS-UCS2-V', 'UniKS-UTF16-H', 'UniKS-UTF16-V', 'UniKS-UTF32-H', 'UniKS-UTF32-V', 'UniKS-UTF8-H', 'UniKS-UTF8-V', 'V', 'WP-Symbol'];
+
+var CMap = function () {
+  function CMap() {
+    var builtInCMap = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+
+    _classCallCheck(this, CMap);
+
+    this.codespaceRanges = [[], [], [], []];
+    this.numCodespaceRanges = 0;
+    this._map = [];
+    this.name = '';
+    this.vertical = false;
+    this.useCMap = null;
+    this.builtInCMap = builtInCMap;
+  }
+
+  _createClass(CMap, [{
+    key: 'addCodespaceRange',
+    value: function addCodespaceRange(n, low, high) {
+      this.codespaceRanges[n - 1].push(low, high);
+      this.numCodespaceRanges++;
+    }
+  }, {
+    key: 'mapCidRange',
+    value: function mapCidRange(low, high, dstLow) {
+      while (low <= high) {
+        this._map[low++] = dstLow++;
+      }
+    }
+  }, {
+    key: 'mapBfRange',
+    value: function mapBfRange(low, high, dstLow) {
+      var lastByte = dstLow.length - 1;
+      while (low <= high) {
+        this._map[low++] = dstLow;
+        dstLow = dstLow.substring(0, lastByte) + String.fromCharCode(dstLow.charCodeAt(lastByte) + 1);
+      }
+    }
+  }, {
+    key: 'mapBfRangeToArray',
+    value: function mapBfRangeToArray(low, high, array) {
+      var i = 0,
+          ii = array.length;
+      while (low <= high && i < ii) {
+        this._map[low] = array[i++];
+        ++low;
+      }
+    }
+  }, {
+    key: 'mapOne',
+    value: function mapOne(src, dst) {
+      this._map[src] = dst;
+    }
+  }, {
+    key: 'lookup',
+    value: function lookup(code) {
+      return this._map[code];
+    }
+  }, {
+    key: 'contains',
+    value: function contains(code) {
+      return this._map[code] !== undefined;
+    }
+  }, {
+    key: 'forEach',
+    value: function forEach(callback) {
+      var map = this._map;
+      var length = map.length;
+      if (length <= 0x10000) {
+        for (var i = 0; i < length; i++) {
+          if (map[i] !== undefined) {
+            callback(i, map[i]);
+          }
+        }
+      } else {
+        for (var _i in map) {
+          callback(_i, map[_i]);
+        }
+      }
+    }
+  }, {
+    key: 'charCodeOf',
+    value: function charCodeOf(value) {
+      var map = this._map;
+      if (map.length <= 0x10000) {
+        return map.indexOf(value);
+      }
+      for (var charCode in map) {
+        if (map[charCode] === value) {
+          return charCode | 0;
+        }
+      }
+      return -1;
+    }
+  }, {
+    key: 'getMap',
+    value: function getMap() {
+      return this._map;
+    }
+  }, {
+    key: 'readCharCode',
+    value: function readCharCode(str, offset, out) {
+      var c = 0;
+      var codespaceRanges = this.codespaceRanges;
+      for (var n = 0, nn = codespaceRanges.length; n < nn; n++) {
+        c = (c << 8 | str.charCodeAt(offset + n)) >>> 0;
+        var codespaceRange = codespaceRanges[n];
+        for (var k = 0, kk = codespaceRange.length; k < kk;) {
+          var low = codespaceRange[k++];
+          var high = codespaceRange[k++];
+          if (c >= low && c <= high) {
+            out.charcode = c;
+            out.length = n + 1;
+            return;
+          }
+        }
+      }
+      out.charcode = 0;
+      out.length = 1;
+    }
+  }, {
+    key: 'length',
+    get: function get() {
+      return this._map.length;
+    }
+  }, {
+    key: 'isIdentityCMap',
+    get: function get() {
+      if (!(this.name === 'Identity-H' || this.name === 'Identity-V')) {
+        return false;
+      }
+      if (this._map.length !== 0x10000) {
+        return false;
+      }
+      for (var i = 0; i < 0x10000; i++) {
+        if (this._map[i] !== i) {
+          return false;
+        }
+      }
+      return true;
+    }
+  }]);
+
+  return CMap;
+}();
+
+var IdentityCMap = function (_CMap) {
+  _inherits(IdentityCMap, _CMap);
+
+  function IdentityCMap(vertical, n) {
+    _classCallCheck(this, IdentityCMap);
+
+    var _this = _possibleConstructorReturn(this, (IdentityCMap.__proto__ || Object.getPrototypeOf(IdentityCMap)).call(this));
+
+    _this.vertical = vertical;
+    _this.addCodespaceRange(n, 0, 0xffff);
+    return _this;
+  }
+
+  _createClass(IdentityCMap, [{
+    key: 'mapCidRange',
+    value: function mapCidRange(low, high, dstLow) {
+      (0, _util.unreachable)('should not call mapCidRange');
+    }
+  }, {
+    key: 'mapBfRange',
+    value: function mapBfRange(low, high, dstLow) {
+      (0, _util.unreachable)('should not call mapBfRange');
+    }
+  }, {
+    key: 'mapBfRangeToArray',
+    value: function mapBfRangeToArray(low, high, array) {
+      (0, _util.unreachable)('should not call mapBfRangeToArray');
+    }
+  }, {
+    key: 'mapOne',
+    value: function mapOne(src, dst) {
+      (0, _util.unreachable)('should not call mapCidOne');
+    }
+  }, {
+    key: 'lookup',
+    value: function lookup(code) {
+      return Number.isInteger(code) && code <= 0xffff ? code : undefined;
+    }
+  }, {
+    key: 'contains',
+    value: function contains(code) {
+      return Number.isInteger(code) && code <= 0xffff;
+    }
+  }, {
+    key: 'forEach',
+    value: function forEach(callback) {
+      for (var i = 0; i <= 0xffff; i++) {
+        callback(i, i);
+      }
+    }
+  }, {
+    key: 'charCodeOf',
+    value: function charCodeOf(value) {
+      return Number.isInteger(value) && value <= 0xffff ? value : -1;
+    }
+  }, {
+    key: 'getMap',
+    value: function getMap() {
+      var map = new Array(0x10000);
+      for (var i = 0; i <= 0xffff; i++) {
+        map[i] = i;
+      }
+      return map;
+    }
+  }, {
+    key: 'length',
+    get: function get() {
+      return 0x10000;
+    }
+  }, {
+    key: 'isIdentityCMap',
+    get: function get() {
+      (0, _util.unreachable)('should not access .isIdentityCMap');
+    }
+  }]);
+
+  return IdentityCMap;
+}(CMap);
+
+var BinaryCMapReader = function BinaryCMapReaderClosure() {
+  function hexToInt(a, size) {
+    var n = 0;
+    for (var i = 0; i <= size; i++) {
+      n = n << 8 | a[i];
+    }
+    return n >>> 0;
+  }
+  function hexToStr(a, size) {
+    if (size === 1) {
+      return String.fromCharCode(a[0], a[1]);
+    }
+    if (size === 3) {
+      return String.fromCharCode(a[0], a[1], a[2], a[3]);
+    }
+    return String.fromCharCode.apply(null, a.subarray(0, size + 1));
+  }
+  function addHex(a, b, size) {
+    var c = 0;
+    for (var i = size; i >= 0; i--) {
+      c += a[i] + b[i];
+      a[i] = c & 255;
+      c >>= 8;
+    }
+  }
+  function incHex(a, size) {
+    var c = 1;
+    for (var i = size; i >= 0 && c > 0; i--) {
+      c += a[i];
+      a[i] = c & 255;
+      c >>= 8;
+    }
+  }
+  var MAX_NUM_SIZE = 16;
+  var MAX_ENCODED_NUM_SIZE = 19;
+  function BinaryCMapStream(data) {
+    this.buffer = data;
+    this.pos = 0;
+    this.end = data.length;
+    this.tmpBuf = new Uint8Array(MAX_ENCODED_NUM_SIZE);
+  }
+  BinaryCMapStream.prototype = {
+    readByte: function readByte() {
+      if (this.pos >= this.end) {
+        return -1;
+      }
+      return this.buffer[this.pos++];
+    },
+    readNumber: function readNumber() {
+      var n = 0;
+      var last;
+      do {
+        var b = this.readByte();
+        if (b < 0) {
+          throw new _util.FormatError('unexpected EOF in bcmap');
+        }
+        last = !(b & 0x80);
+        n = n << 7 | b & 0x7F;
+      } while (!last);
+      return n;
+    },
+    readSigned: function readSigned() {
+      var n = this.readNumber();
+      return n & 1 ? ~(n >>> 1) : n >>> 1;
+    },
+    readHex: function readHex(num, size) {
+      num.set(this.buffer.subarray(this.pos, this.pos + size + 1));
+      this.pos += size + 1;
+    },
+    readHexNumber: function readHexNumber(num, size) {
+      var last;
+      var stack = this.tmpBuf,
+          sp = 0;
+      do {
+        var b = this.readByte();
+        if (b < 0) {
+          throw new _util.FormatError('unexpected EOF in bcmap');
+        }
+        last = !(b & 0x80);
+        stack[sp++] = b & 0x7F;
+      } while (!last);
+      var i = size,
+          buffer = 0,
+          bufferSize = 0;
+      while (i >= 0) {
+        while (bufferSize < 8 && stack.length > 0) {
+          buffer = stack[--sp] << bufferSize | buffer;
+          bufferSize += 7;
+        }
+        num[i] = buffer & 255;
+        i--;
+        buffer >>= 8;
+        bufferSize -= 8;
+      }
+    },
+    readHexSigned: function readHexSigned(num, size) {
+      this.readHexNumber(num, size);
+      var sign = num[size] & 1 ? 255 : 0;
+      var c = 0;
+      for (var i = 0; i <= size; i++) {
+        c = (c & 1) << 8 | num[i];
+        num[i] = c >> 1 ^ sign;
+      }
+    },
+    readString: function readString() {
+      var len = this.readNumber();
+      var s = '';
+      for (var i = 0; i < len; i++) {
+        s += String.fromCharCode(this.readNumber());
+      }
+      return s;
+    }
+  };
+  function processBinaryCMap(data, cMap, extend) {
+    return new Promise(function (resolve, reject) {
+      var stream = new BinaryCMapStream(data);
+      var header = stream.readByte();
+      cMap.vertical = !!(header & 1);
+      var useCMap = null;
+      var start = new Uint8Array(MAX_NUM_SIZE);
+      var end = new Uint8Array(MAX_NUM_SIZE);
+      var char = new Uint8Array(MAX_NUM_SIZE);
+      var charCode = new Uint8Array(MAX_NUM_SIZE);
+      var tmp = new Uint8Array(MAX_NUM_SIZE);
+      var code;
+      var b;
+      while ((b = stream.readByte()) >= 0) {
+        var type = b >> 5;
+        if (type === 7) {
+          switch (b & 0x1F) {
+            case 0:
+              stream.readString();
+              break;
+            case 1:
+              useCMap = stream.readString();
+              break;
+          }
+          continue;
+        }
+        var sequence = !!(b & 0x10);
+        var dataSize = b & 15;
+        if (dataSize + 1 > MAX_NUM_SIZE) {
+          throw new Error('processBinaryCMap: Invalid dataSize.');
+        }
+        var ucs2DataSize = 1;
+        var subitemsCount = stream.readNumber();
+        var i;
+        switch (type) {
+          case 0:
+            stream.readHex(start, dataSize);
+            stream.readHexNumber(end, dataSize);
+            addHex(end, start, dataSize);
+            cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize), hexToInt(end, dataSize));
+            for (i = 1; i < subitemsCount; i++) {
+              incHex(end, dataSize);
+              stream.readHexNumber(start, dataSize);
+              addHex(start, end, dataSize);
+              stream.readHexNumber(end, dataSize);
+              addHex(end, start, dataSize);
+              cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize), hexToInt(end, dataSize));
+            }
+            break;
+          case 1:
+            stream.readHex(start, dataSize);
+            stream.readHexNumber(end, dataSize);
+            addHex(end, start, dataSize);
+            stream.readNumber();
+            for (i = 1; i < subitemsCount; i++) {
+              incHex(end, dataSize);
+              stream.readHexNumber(start, dataSize);
+              addHex(start, end, dataSize);
+              stream.readHexNumber(end, dataSize);
+              addHex(end, start, dataSize);
+              stream.readNumber();
+            }
+            break;
+          case 2:
+            stream.readHex(char, dataSize);
+            code = stream.readNumber();
+            cMap.mapOne(hexToInt(char, dataSize), code);
+            for (i = 1; i < subitemsCount; i++) {
+              incHex(char, dataSize);
+              if (!sequence) {
+                stream.readHexNumber(tmp, dataSize);
+                addHex(char, tmp, dataSize);
+              }
+              code = stream.readSigned() + (code + 1);
+              cMap.mapOne(hexToInt(char, dataSize), code);
+            }
+            break;
+          case 3:
+            stream.readHex(start, dataSize);
+            stream.readHexNumber(end, dataSize);
+            addHex(end, start, dataSize);
+            code = stream.readNumber();
+            cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize), code);
+            for (i = 1; i < subitemsCount; i++) {
+              incHex(end, dataSize);
+              if (!sequence) {
+                stream.readHexNumber(start, dataSize);
+                addHex(start, end, dataSize);
+              } else {
+                start.set(end);
+              }
+              stream.readHexNumber(end, dataSize);
+              addHex(end, start, dataSize);
+              code = stream.readNumber();
+              cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize), code);
+            }
+            break;
+          case 4:
+            stream.readHex(char, ucs2DataSize);
+            stream.readHex(charCode, dataSize);
+            cMap.mapOne(hexToInt(char, ucs2DataSize), hexToStr(charCode, dataSize));
+            for (i = 1; i < subitemsCount; i++) {
+              incHex(char, ucs2DataSize);
+              if (!sequence) {
+                stream.readHexNumber(tmp, ucs2DataSize);
+                addHex(char, tmp, ucs2DataSize);
+              }
+              incHex(charCode, dataSize);
+              stream.readHexSigned(tmp, dataSize);
+              addHex(charCode, tmp, dataSize);
+              cMap.mapOne(hexToInt(char, ucs2DataSize), hexToStr(charCode, dataSize));
+            }
+            break;
+          case 5:
+            stream.readHex(start, ucs2DataSize);
+            stream.readHexNumber(end, ucs2DataSize);
+            addHex(end, start, ucs2DataSize);
+            stream.readHex(charCode, dataSize);
+            cMap.mapBfRange(hexToInt(start, ucs2DataSize), hexToInt(end, ucs2DataSize), hexToStr(charCode, dataSize));
+            for (i = 1; i < subitemsCount; i++) {
+              incHex(end, ucs2DataSize);
+              if (!sequence) {
+                stream.readHexNumber(start, ucs2DataSize);
+                addHex(start, end, ucs2DataSize);
+              } else {
+                start.set(end);
+              }
+              stream.readHexNumber(end, ucs2DataSize);
+              addHex(end, start, ucs2DataSize);
+              stream.readHex(charCode, dataSize);
+              cMap.mapBfRange(hexToInt(start, ucs2DataSize), hexToInt(end, ucs2DataSize), hexToStr(charCode, dataSize));
+            }
+            break;
+          default:
+            reject(new Error('processBinaryCMap: Unknown type: ' + type));
+            return;
+        }
+      }
+      if (useCMap) {
+        resolve(extend(useCMap));
+        return;
+      }
+      resolve(cMap);
+    });
+  }
+  function BinaryCMapReader() {}
+  BinaryCMapReader.prototype = { process: processBinaryCMap };
+  return BinaryCMapReader;
+}();
+var CMapFactory = function CMapFactoryClosure() {
+  function strToInt(str) {
+    var a = 0;
+    for (var i = 0; i < str.length; i++) {
+      a = a << 8 | str.charCodeAt(i);
+    }
+    return a >>> 0;
+  }
+  function expectString(obj) {
+    if (!(0, _util.isString)(obj)) {
+      throw new _util.FormatError('Malformed CMap: expected string.');
+    }
+  }
+  function expectInt(obj) {
+    if (!Number.isInteger(obj)) {
+      throw new _util.FormatError('Malformed CMap: expected int.');
+    }
+  }
+  function parseBfChar(cMap, lexer) {
+    while (true) {
+      var obj = lexer.getObj();
+      if ((0, _primitives.isEOF)(obj)) {
+        break;
+      }
+      if ((0, _primitives.isCmd)(obj, 'endbfchar')) {
+        return;
+      }
+      expectString(obj);
+      var src = strToInt(obj);
+      obj = lexer.getObj();
+      expectString(obj);
+      var dst = obj;
+      cMap.mapOne(src, dst);
+    }
+  }
+  function parseBfRange(cMap, lexer) {
+    while (true) {
+      var obj = lexer.getObj();
+      if ((0, _primitives.isEOF)(obj)) {
+        break;
+      }
+      if ((0, _primitives.isCmd)(obj, 'endbfrange')) {
+        return;
+      }
+      expectString(obj);
+      var low = strToInt(obj);
+      obj = lexer.getObj();
+      expectString(obj);
+      var high = strToInt(obj);
+      obj = lexer.getObj();
+      if (Number.isInteger(obj) || (0, _util.isString)(obj)) {
+        var dstLow = Number.isInteger(obj) ? String.fromCharCode(obj) : obj;
+        cMap.mapBfRange(low, high, dstLow);
+      } else if ((0, _primitives.isCmd)(obj, '[')) {
+        obj = lexer.getObj();
+        var array = [];
+        while (!(0, _primitives.isCmd)(obj, ']') && !(0, _primitives.isEOF)(obj)) {
+          array.push(obj);
+          obj = lexer.getObj();
+        }
+        cMap.mapBfRangeToArray(low, high, array);
+      } else {
+        break;
+      }
+    }
+    throw new _util.FormatError('Invalid bf range.');
+  }
+  function parseCidChar(cMap, lexer) {
+    while (true) {
+      var obj = lexer.getObj();
+      if ((0, _primitives.isEOF)(obj)) {
+        break;
+      }
+      if ((0, _primitives.isCmd)(obj, 'endcidchar')) {
+        return;
+      }
+      expectString(obj);
+      var src = strToInt(obj);
+      obj = lexer.getObj();
+      expectInt(obj);
+      var dst = obj;
+      cMap.mapOne(src, dst);
+    }
+  }
+  function parseCidRange(cMap, lexer) {
+    while (true) {
+      var obj = lexer.getObj();
+      if ((0, _primitives.isEOF)(obj)) {
+        break;
+      }
+      if ((0, _primitives.isCmd)(obj, 'endcidrange')) {
+        return;
+      }
+      expectString(obj);
+      var low = strToInt(obj);
+      obj = lexer.getObj();
+      expectString(obj);
+      var high = strToInt(obj);
+      obj = lexer.getObj();
+      expectInt(obj);
+      var dstLow = obj;
+      cMap.mapCidRange(low, high, dstLow);
+    }
+  }
+  function parseCodespaceRange(cMap, lexer) {
+    while (true) {
+      var obj = lexer.getObj();
+      if ((0, _primitives.isEOF)(obj)) {
+        break;
+      }
+      if ((0, _primitives.isCmd)(obj, 'endcodespacerange')) {
+        return;
+      }
+      if (!(0, _util.isString)(obj)) {
+        break;
+      }
+      var low = strToInt(obj);
+      obj = lexer.getObj();
+      if (!(0, _util.isString)(obj)) {
+        break;
+      }
+      var high = strToInt(obj);
+      cMap.addCodespaceRange(obj.length, low, high);
+    }
+    throw new _util.FormatError('Invalid codespace range.');
+  }
+  function parseWMode(cMap, lexer) {
+    var obj = lexer.getObj();
+    if (Number.isInteger(obj)) {
+      cMap.vertical = !!obj;
+    }
+  }
+  function parseCMapName(cMap, lexer) {
+    var obj = lexer.getObj();
+    if ((0, _primitives.isName)(obj) && (0, _util.isString)(obj.name)) {
+      cMap.name = obj.name;
+    }
+  }
+  function parseCMap(cMap, lexer, fetchBuiltInCMap, useCMap) {
+    var previous;
+    var embeddedUseCMap;
+    objLoop: while (true) {
+      try {
+        var obj = lexer.getObj();
+        if ((0, _primitives.isEOF)(obj)) {
+          break;
+        } else if ((0, _primitives.isName)(obj)) {
+          if (obj.name === 'WMode') {
+            parseWMode(cMap, lexer);
+          } else if (obj.name === 'CMapName') {
+            parseCMapName(cMap, lexer);
+          }
+          previous = obj;
+        } else if ((0, _primitives.isCmd)(obj)) {
+          switch (obj.cmd) {
+            case 'endcmap':
+              break objLoop;
+            case 'usecmap':
+              if ((0, _primitives.isName)(previous)) {
+                embeddedUseCMap = previous.name;
+              }
+              break;
+            case 'begincodespacerange':
+              parseCodespaceRange(cMap, lexer);
+              break;
+            case 'beginbfchar':
+              parseBfChar(cMap, lexer);
+              break;
+            case 'begincidchar':
+              parseCidChar(cMap, lexer);
+              break;
+            case 'beginbfrange':
+              parseBfRange(cMap, lexer);
+              break;
+            case 'begincidrange':
+              parseCidRange(cMap, lexer);
+              break;
+          }
+        }
+      } catch (ex) {
+        if (ex instanceof _util.MissingDataException) {
+          throw ex;
+        }
+        (0, _util.warn)('Invalid cMap data: ' + ex);
+        continue;
+      }
+    }
+    if (!useCMap && embeddedUseCMap) {
+      useCMap = embeddedUseCMap;
+    }
+    if (useCMap) {
+      return extendCMap(cMap, fetchBuiltInCMap, useCMap);
+    }
+    return Promise.resolve(cMap);
+  }
+  function extendCMap(cMap, fetchBuiltInCMap, useCMap) {
+    return createBuiltInCMap(useCMap, fetchBuiltInCMap).then(function (newCMap) {
+      cMap.useCMap = newCMap;
+      if (cMap.numCodespaceRanges === 0) {
+        var useCodespaceRanges = cMap.useCMap.codespaceRanges;
+        for (var i = 0; i < useCodespaceRanges.length; i++) {
+          cMap.codespaceRanges[i] = useCodespaceRanges[i].slice();
+        }
+        cMap.numCodespaceRanges = cMap.useCMap.numCodespaceRanges;
+      }
+      cMap.useCMap.forEach(function (key, value) {
+        if (!cMap.contains(key)) {
+          cMap.mapOne(key, cMap.useCMap.lookup(key));
+        }
+      });
+      return cMap;
+    });
+  }
+  function createBuiltInCMap(name, fetchBuiltInCMap) {
+    if (name === 'Identity-H') {
+      return Promise.resolve(new IdentityCMap(false, 2));
+    } else if (name === 'Identity-V') {
+      return Promise.resolve(new IdentityCMap(true, 2));
+    }
+    if (!BUILT_IN_CMAPS.includes(name)) {
+      return Promise.reject(new Error('Unknown CMap name: ' + name));
+    }
+    if (!fetchBuiltInCMap) {
+      return Promise.reject(new Error('Built-in CMap parameters are not provided.'));
+    }
+    return fetchBuiltInCMap(name).then(function (data) {
+      var cMapData = data.cMapData,
+          compressionType = data.compressionType;
+      var cMap = new CMap(true);
+      if (compressionType === _util.CMapCompressionType.BINARY) {
+        return new BinaryCMapReader().process(cMapData, cMap, function (useCMap) {
+          return extendCMap(cMap, fetchBuiltInCMap, useCMap);
+        });
+      }
+      if (compressionType === _util.CMapCompressionType.NONE) {
+        var lexer = new _parser.Lexer(new _stream.Stream(cMapData));
+        return parseCMap(cMap, lexer, fetchBuiltInCMap, null);
+      }
+      return Promise.reject(new Error('TODO: Only BINARY/NONE CMap compression is currently supported.'));
+    });
+  }
+  return {
+    create: function create(params) {
+      var encoding = params.encoding;
+      var fetchBuiltInCMap = params.fetchBuiltInCMap;
+      var useCMap = params.useCMap;
+      if ((0, _primitives.isName)(encoding)) {
+        return createBuiltInCMap(encoding.name, fetchBuiltInCMap);
+      } else if ((0, _primitives.isStream)(encoding)) {
+        var cMap = new CMap();
+        var lexer = new _parser.Lexer(encoding);
+        return parseCMap(cMap, lexer, fetchBuiltInCMap, useCMap).then(function (parsedCMap) {
+          if (parsedCMap.isIdentityCMap) {
+            return createBuiltInCMap(parsedCMap.name, fetchBuiltInCMap);
+          }
+          return parsedCMap;
+        });
+      }
+      return Promise.reject(new Error('Encoding required.'));
+    }
+  };
+}();
+exports.CMap = CMap;
+exports.IdentityCMap = IdentityCMap;
+exports.CMapFactory = CMapFactory;
+
+/***/ }),
+/* 156 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.getFontType = exports.IdentityToUnicodeMap = exports.ToUnicodeMap = exports.FontFlags = exports.Font = exports.ErrorFont = exports.SEAC_ANALYSIS_ENABLED = undefined;
+
+var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
+
+var _util = __w_pdfjs_require__(2);
+
+var _cff_parser = __w_pdfjs_require__(157);
+
+var _glyphlist = __w_pdfjs_require__(160);
+
+var _encodings = __w_pdfjs_require__(159);
+
+var _standard_fonts = __w_pdfjs_require__(161);
+
+var _unicode = __w_pdfjs_require__(162);
+
+var _font_renderer = __w_pdfjs_require__(163);
+
+var _cmap = __w_pdfjs_require__(155);
+
+var _stream = __w_pdfjs_require__(140);
+
+var _type1_parser = __w_pdfjs_require__(164);
+
+var PRIVATE_USE_AREAS = [[0xE000, 0xF8FF], [0x100000, 0x10FFFD]];
+var PDF_GLYPH_SPACE_UNITS = 1000;
+var SEAC_ANALYSIS_ENABLED = true;
+var FontFlags = {
+  FixedPitch: 1,
+  Serif: 2,
+  Symbolic: 4,
+  Script: 8,
+  Nonsymbolic: 32,
+  Italic: 64,
+  AllCap: 65536,
+  SmallCap: 131072,
+  ForceBold: 262144
+};
+var MacStandardGlyphOrdering = ['.notdef', '.null', 'nonmarkingreturn', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', 'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde', 'Odieresis', 'Udieresis', 'aacute', 'agrave', 'acircumflex', 'adieresis', 'atilde', 'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis', 'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute', 'ograve', 'ocircumflex', 'odieresis', 'otilde', 'uacute', 'ugrave', 'ucircumflex', 'udieresis', 'dagger', 'degree', 'cent', 'sterling', 'section', 'bullet', 'paragraph', 'germandbls', 'registered', 'copyright', 'trademark', 'acute', 'dieresis', 'notequal', 'AE', 'Oslash', 'infinity', 'plusminus', 'lessequal', 'greaterequal', 'yen', 'mu', 'partialdiff', 'summation', 'product', 'pi', 'integral', 'ordfeminine', 'ordmasculine', 'Omega', 'ae', 'oslash', 'questiondown', 'exclamdown', 'logicalnot', 'radical', 'florin', 'approxequal', 'Delta', 'guillemotleft', 'guillemotright', 'ellipsis', 'nonbreakingspace', 'Agrave', 'Atilde', 'Otilde', 'OE', 'oe', 'endash', 'emdash', 'quotedblleft', 'quotedblright', 'quoteleft', 'quoteright', 'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction', 'currency', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl', 'periodcentered', 'quotesinglbase', 'quotedblbase', 'perthousand', 'Acircumflex', 'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple', 'Ograve', 'Uacute', 'Ucircumflex', 'Ugrave', 'dotlessi', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron', 'Lslash', 'lslash', 'Scaron', 'scaron', 'Zcaron', 'zcaron', 'brokenbar', 'Eth', 'eth', 'Yacute', 'yacute', 'Thorn', 'thorn', 'minus', 'multiply', 'onesuperior', 'twosuperior', 'threesuperior', 'onehalf', 'onequarter', 'threequarters', 'franc', 'Gbreve', 'gbreve', 'Idotaccent', 'Scedilla', 'scedilla', 'Cacute', 'cacute', 'Ccaron', 'ccaron', 'dcroat'];
+function adjustWidths(properties) {
+  if (!properties.fontMatrix) {
+    return;
+  }
+  if (properties.fontMatrix[0] === _util.FONT_IDENTITY_MATRIX[0]) {
+    return;
+  }
+  var scale = 0.001 / properties.fontMatrix[0];
+  var glyphsWidths = properties.widths;
+  for (var glyph in glyphsWidths) {
+    glyphsWidths[glyph] *= scale;
+  }
+  properties.defaultWidth *= scale;
+}
+function adjustToUnicode(properties, builtInEncoding) {
+  if (properties.hasIncludedToUnicodeMap) {
+    return;
+  }
+  if (properties.hasEncoding) {
+    return;
+  }
+  if (builtInEncoding === properties.defaultEncoding) {
+    return;
+  }
+  if (properties.toUnicode instanceof IdentityToUnicodeMap) {
+    return;
+  }
+  var toUnicode = [],
+      glyphsUnicodeMap = (0, _glyphlist.getGlyphsUnicode)();
+  for (var charCode in builtInEncoding) {
+    var glyphName = builtInEncoding[charCode];
+    var unicode = (0, _unicode.getUnicodeForGlyph)(glyphName, glyphsUnicodeMap);
+    if (unicode !== -1) {
+      toUnicode[charCode] = String.fromCharCode(unicode);
+    }
+  }
+  properties.toUnicode.amend(toUnicode);
+}
+function getFontType(type, subtype) {
+  switch (type) {
+    case 'Type1':
+      return subtype === 'Type1C' ? _util.FontType.TYPE1C : _util.FontType.TYPE1;
+    case 'CIDFontType0':
+      return subtype === 'CIDFontType0C' ? _util.FontType.CIDFONTTYPE0C : _util.FontType.CIDFONTTYPE0;
+    case 'OpenType':
+      return _util.FontType.OPENTYPE;
+    case 'TrueType':
+      return _util.FontType.TRUETYPE;
+    case 'CIDFontType2':
+      return _util.FontType.CIDFONTTYPE2;
+    case 'MMType1':
+      return _util.FontType.MMTYPE1;
+    case 'Type0':
+      return _util.FontType.TYPE0;
+    default:
+      return _util.FontType.UNKNOWN;
+  }
+}
+function recoverGlyphName(name, glyphsUnicodeMap) {
+  if (glyphsUnicodeMap[name] !== undefined) {
+    return name;
+  }
+  var unicode = (0, _unicode.getUnicodeForGlyph)(name, glyphsUnicodeMap);
+  if (unicode !== -1) {
+    for (var key in glyphsUnicodeMap) {
+      if (glyphsUnicodeMap[key] === unicode) {
+        return key;
+      }
+    }
+  }
+  (0, _util.info)('Unable to recover a standard glyph name for: ' + name);
+  return name;
+}
+var Glyph = function GlyphClosure() {
+  function Glyph(fontChar, unicode, accent, width, vmetric, operatorListId, isSpace, isInFont) {
+    this.fontChar = fontChar;
+    this.unicode = unicode;
+    this.accent = accent;
+    this.width = width;
+    this.vmetric = vmetric;
+    this.operatorListId = operatorListId;
+    this.isSpace = isSpace;
+    this.isInFont = isInFont;
+  }
+  Glyph.prototype.matchesForCache = function (fontChar, unicode, accent, width, vmetric, operatorListId, isSpace, isInFont) {
+    return this.fontChar === fontChar && this.unicode === unicode && this.accent === accent && this.width === width && this.vmetric === vmetric && this.operatorListId === operatorListId && this.isSpace === isSpace && this.isInFont === isInFont;
+  };
+  return Glyph;
+}();
+var ToUnicodeMap = function ToUnicodeMapClosure() {
+  function ToUnicodeMap() {
+    var cmap = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
+
+    this._map = cmap;
+  }
+  ToUnicodeMap.prototype = {
+    get length() {
+      return this._map.length;
+    },
+    forEach: function forEach(callback) {
+      for (var charCode in this._map) {
+        callback(charCode, this._map[charCode].charCodeAt(0));
+      }
+    },
+    has: function has(i) {
+      return this._map[i] !== undefined;
+    },
+    get: function get(i) {
+      return this._map[i];
+    },
+    charCodeOf: function charCodeOf(value) {
+      var map = this._map;
+      if (map.length <= 0x10000) {
+        return map.indexOf(value);
+      }
+      for (var charCode in map) {
+        if (map[charCode] === value) {
+          return charCode | 0;
+        }
+      }
+      return -1;
+    },
+    amend: function amend(map) {
+      for (var charCode in map) {
+        this._map[charCode] = map[charCode];
+      }
+    }
+  };
+  return ToUnicodeMap;
+}();
+var IdentityToUnicodeMap = function IdentityToUnicodeMapClosure() {
+  function IdentityToUnicodeMap(firstChar, lastChar) {
+    this.firstChar = firstChar;
+    this.lastChar = lastChar;
+  }
+  IdentityToUnicodeMap.prototype = {
+    get length() {
+      return this.lastChar + 1 - this.firstChar;
+    },
+    forEach: function forEach(callback) {
+      for (var i = this.firstChar, ii = this.lastChar; i <= ii; i++) {
+        callback(i, i);
+      }
+    },
+    has: function has(i) {
+      return this.firstChar <= i && i <= this.lastChar;
+    },
+    get: function get(i) {
+      if (this.firstChar <= i && i <= this.lastChar) {
+        return String.fromCharCode(i);
+      }
+      return undefined;
+    },
+    charCodeOf: function charCodeOf(v) {
+      return Number.isInteger(v) && v >= this.firstChar && v <= this.lastChar ? v : -1;
+    },
+    amend: function amend(map) {
+      (0, _util.unreachable)('Should not call amend()');
+    }
+  };
+  return IdentityToUnicodeMap;
+}();
+var OpenTypeFileBuilder = function OpenTypeFileBuilderClosure() {
+  function writeInt16(dest, offset, num) {
+    dest[offset] = num >> 8 & 0xFF;
+    dest[offset + 1] = num & 0xFF;
+  }
+  function writeInt32(dest, offset, num) {
+    dest[offset] = num >> 24 & 0xFF;
+    dest[offset + 1] = num >> 16 & 0xFF;
+    dest[offset + 2] = num >> 8 & 0xFF;
+    dest[offset + 3] = num & 0xFF;
+  }
+  function writeData(dest, offset, data) {
+    var i, ii;
+    if (data instanceof Uint8Array) {
+      dest.set(data, offset);
+    } else if (typeof data === 'string') {
+      for (i = 0, ii = data.length; i < ii; i++) {
+        dest[offset++] = data.charCodeAt(i) & 0xFF;
+      }
+    } else {
+      for (i = 0, ii = data.length; i < ii; i++) {
+        dest[offset++] = data[i] & 0xFF;
+      }
+    }
+  }
+  function OpenTypeFileBuilder(sfnt) {
+    this.sfnt = sfnt;
+    this.tables = Object.create(null);
+  }
+  OpenTypeFileBuilder.getSearchParams = function OpenTypeFileBuilder_getSearchParams(entriesCount, entrySize) {
+    var maxPower2 = 1,
+        log2 = 0;
+    while ((maxPower2 ^ entriesCount) > maxPower2) {
+      maxPower2 <<= 1;
+      log2++;
+    }
+    var searchRange = maxPower2 * entrySize;
+    return {
+      range: searchRange,
+      entry: log2,
+      rangeShift: entrySize * entriesCount - searchRange
+    };
+  };
+  var OTF_HEADER_SIZE = 12;
+  var OTF_TABLE_ENTRY_SIZE = 16;
+  OpenTypeFileBuilder.prototype = {
+    toArray: function OpenTypeFileBuilder_toArray() {
+      var sfnt = this.sfnt;
+      var tables = this.tables;
+      var tablesNames = Object.keys(tables);
+      tablesNames.sort();
+      var numTables = tablesNames.length;
+      var i, j, jj, table, tableName;
+      var offset = OTF_HEADER_SIZE + numTables * OTF_TABLE_ENTRY_SIZE;
+      var tableOffsets = [offset];
+      for (i = 0; i < numTables; i++) {
+        table = tables[tablesNames[i]];
+        var paddedLength = (table.length + 3 & ~3) >>> 0;
+        offset += paddedLength;
+        tableOffsets.push(offset);
+      }
+      var file = new Uint8Array(offset);
+      for (i = 0; i < numTables; i++) {
+        table = tables[tablesNames[i]];
+        writeData(file, tableOffsets[i], table);
+      }
+      if (sfnt === 'true') {
+        sfnt = (0, _util.string32)(0x00010000);
+      }
+      file[0] = sfnt.charCodeAt(0) & 0xFF;
+      file[1] = sfnt.charCodeAt(1) & 0xFF;
+      file[2] = sfnt.charCodeAt(2) & 0xFF;
+      file[3] = sfnt.charCodeAt(3) & 0xFF;
+      writeInt16(file, 4, numTables);
+      var searchParams = OpenTypeFileBuilder.getSearchParams(numTables, 16);
+      writeInt16(file, 6, searchParams.range);
+      writeInt16(file, 8, searchParams.entry);
+      writeInt16(file, 10, searchParams.rangeShift);
+      offset = OTF_HEADER_SIZE;
+      for (i = 0; i < numTables; i++) {
+        tableName = tablesNames[i];
+        file[offset] = tableName.charCodeAt(0) & 0xFF;
+        file[offset + 1] = tableName.charCodeAt(1) & 0xFF;
+        file[offset + 2] = tableName.charCodeAt(2) & 0xFF;
+        file[offset + 3] = tableName.charCodeAt(3) & 0xFF;
+        var checksum = 0;
+        for (j = tableOffsets[i], jj = tableOffsets[i + 1]; j < jj; j += 4) {
+          var quad = (0, _util.readUint32)(file, j);
+          checksum = checksum + quad >>> 0;
+        }
+        writeInt32(file, offset + 4, checksum);
+        writeInt32(file, offset + 8, tableOffsets[i]);
+        writeInt32(file, offset + 12, tables[tableName].length);
+        offset += OTF_TABLE_ENTRY_SIZE;
+      }
+      return file;
+    },
+    addTable: function OpenTypeFileBuilder_addTable(tag, data) {
+      if (tag in this.tables) {
+        throw new Error('Table ' + tag + ' already exists');
+      }
+      this.tables[tag] = data;
+    }
+  };
+  return OpenTypeFileBuilder;
+}();
+var Font = function FontClosure() {
+  function Font(name, file, properties) {
+    var charCode;
+    this.name = name;
+    this.loadedName = properties.loadedName;
+    this.isType3Font = properties.isType3Font;
+    this.sizes = [];
+    this.missingFile = false;
+    this.glyphCache = Object.create(null);
+    this.isSerifFont = !!(properties.flags & FontFlags.Serif);
+    this.isSymbolicFont = !!(properties.flags & FontFlags.Symbolic);
+    this.isMonospace = !!(properties.flags & FontFlags.FixedPitch);
+    var type = properties.type;
+    var subtype = properties.subtype;
+    this.type = type;
+    this.subtype = subtype;
+    this.fallbackName = this.isMonospace ? 'monospace' : this.isSerifFont ? 'serif' : 'sans-serif';
+    this.differences = properties.differences;
+    this.widths = properties.widths;
+    this.defaultWidth = properties.defaultWidth;
+    this.composite = properties.composite;
+    this.wideChars = properties.wideChars;
+    this.cMap = properties.cMap;
+    this.ascent = properties.ascent / PDF_GLYPH_SPACE_UNITS;
+    this.descent = properties.descent / PDF_GLYPH_SPACE_UNITS;
+    this.fontMatrix = properties.fontMatrix;
+    this.bbox = properties.bbox;
+    this.defaultEncoding = properties.defaultEncoding;
+    this.toUnicode = properties.toUnicode;
+    this.fallbackToUnicode = properties.fallbackToUnicode || new ToUnicodeMap();
+    this.toFontChar = [];
+    if (properties.type === 'Type3') {
+      for (charCode = 0; charCode < 256; charCode++) {
+        this.toFontChar[charCode] = this.differences[charCode] || properties.defaultEncoding[charCode];
+      }
+      this.fontType = _util.FontType.TYPE3;
+      return;
+    }
+    this.cidEncoding = properties.cidEncoding;
+    this.vertical = properties.vertical;
+    if (this.vertical) {
+      this.vmetrics = properties.vmetrics;
+      this.defaultVMetrics = properties.defaultVMetrics;
+    }
+    if (!file || file.isEmpty) {
+      if (file) {
+        (0, _util.warn)('Font file is empty in "' + name + '" (' + this.loadedName + ')');
+      }
+      this.fallbackToSystemFont();
+      return;
+    }
+
+    var _getFontFileType = getFontFileType(file, properties);
+
+    var _getFontFileType2 = _slicedToArray(_getFontFileType, 2);
+
+    type = _getFontFileType2[0];
+    subtype = _getFontFileType2[1];
+
+    if (type !== this.type || subtype !== this.subtype) {
+      (0, _util.info)('Inconsistent font file Type/SubType, expected: ' + (this.type + '/' + this.subtype + ' but found: ' + type + '/' + subtype + '.'));
+    }
+    try {
+      var data;
+      switch (type) {
+        case 'MMType1':
+          (0, _util.info)('MMType1 font (' + name + '), falling back to Type1.');
+        case 'Type1':
+        case 'CIDFontType0':
+          this.mimetype = 'font/opentype';
+          var cff = subtype === 'Type1C' || subtype === 'CIDFontType0C' ? new CFFFont(file, properties) : new Type1Font(name, file, properties);
+          adjustWidths(properties);
+          data = this.convert(name, cff, properties);
+          break;
+        case 'OpenType':
+        case 'TrueType':
+        case 'CIDFontType2':
+          this.mimetype = 'font/opentype';
+          data = this.checkAndRepair(name, file, properties);
+          if (this.isOpenType) {
+            adjustWidths(properties);
+            type = 'OpenType';
+          }
+          break;
+        default:
+          throw new _util.FormatError('Font ' + type + ' is not supported');
+      }
+    } catch (e) {
+      (0, _util.warn)(e);
+      this.fallbackToSystemFont();
+      return;
+    }
+    this.data = data;
+    this.fontType = getFontType(type, subtype);
+    this.fontMatrix = properties.fontMatrix;
+    this.widths = properties.widths;
+    this.defaultWidth = properties.defaultWidth;
+    this.toUnicode = properties.toUnicode;
+    this.encoding = properties.baseEncoding;
+    this.seacMap = properties.seacMap;
+  }
+  Font.getFontID = function () {
+    var ID = 1;
+    return function Font_getFontID() {
+      return String(ID++);
+    };
+  }();
+  function int16(b0, b1) {
+    return (b0 << 8) + b1;
+  }
+  function writeSignedInt16(bytes, index, value) {
+    bytes[index + 1] = value;
+    bytes[index] = value >>> 8;
+  }
+  function signedInt16(b0, b1) {
+    var value = (b0 << 8) + b1;
+    return value & 1 << 15 ? value - 0x10000 : value;
+  }
+  function int32(b0, b1, b2, b3) {
+    return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;
+  }
+  function string16(value) {
+    return String.fromCharCode(value >> 8 & 0xff, value & 0xff);
+  }
+  function safeString16(value) {
+    value = value > 0x7FFF ? 0x7FFF : value < -0x8000 ? -0x8000 : value;
+    return String.fromCharCode(value >> 8 & 0xff, value & 0xff);
+  }
+  function isTrueTypeFile(file) {
+    var header = file.peekBytes(4);
+    return (0, _util.readUint32)(header, 0) === 0x00010000 || (0, _util.bytesToString)(header) === 'true';
+  }
+  function isTrueTypeCollectionFile(file) {
+    var header = file.peekBytes(4);
+    return (0, _util.bytesToString)(header) === 'ttcf';
+  }
+  function isOpenTypeFile(file) {
+    var header = file.peekBytes(4);
+    return (0, _util.bytesToString)(header) === 'OTTO';
+  }
+  function isType1File(file) {
+    var header = file.peekBytes(2);
+    if (header[0] === 0x25 && header[1] === 0x21) {
+      return true;
+    }
+    if (header[0] === 0x80 && header[1] === 0x01) {
+      return true;
+    }
+    return false;
+  }
+  function isCFFFile(file) {
+    var header = file.peekBytes(4);
+    if (header[0] >= 1 && header[3] >= 1 && header[3] <= 4) {
+      return true;
+    }
+    return false;
+  }
+  function getFontFileType(file, _ref) {
+    var type = _ref.type,
+        subtype = _ref.subtype,
+        composite = _ref.composite;
+
+    var fileType = void 0,
+        fileSubtype = void 0;
+    if (isTrueTypeFile(file) || isTrueTypeCollectionFile(file)) {
+      if (composite) {
+        fileType = 'CIDFontType2';
+      } else {
+        fileType = 'TrueType';
+      }
+    } else if (isOpenTypeFile(file)) {
+      if (composite) {
+        fileType = 'CIDFontType2';
+      } else {
+        fileType = 'OpenType';
+      }
+    } else if (isType1File(file)) {
+      if (composite) {
+        fileType = 'CIDFontType0';
+      } else {
+        fileType = type === 'MMType1' ? 'MMType1' : 'Type1';
+      }
+    } else if (isCFFFile(file)) {
+      if (composite) {
+        fileType = 'CIDFontType0';
+        fileSubtype = 'CIDFontType0C';
+      } else {
+        fileType = type === 'MMType1' ? 'MMType1' : 'Type1';
+        fileSubtype = 'Type1C';
+      }
+    } else {
+      (0, _util.warn)('getFontFileType: Unable to detect correct font file Type/Subtype.');
+      fileType = type;
+      fileSubtype = subtype;
+    }
+    return [fileType, fileSubtype];
+  }
+  function buildToFontChar(encoding, glyphsUnicodeMap, differences) {
+    var toFontChar = [],
+        unicode;
+    for (var i = 0, ii = encoding.length; i < ii; i++) {
+      unicode = (0, _unicode.getUnicodeForGlyph)(encoding[i], glyphsUnicodeMap);
+      if (unicode !== -1) {
+        toFontChar[i] = unicode;
+      }
+    }
+    for (var charCode in differences) {
+      unicode = (0, _unicode.getUnicodeForGlyph)(differences[charCode], glyphsUnicodeMap);
+      if (unicode !== -1) {
+        toFontChar[+charCode] = unicode;
+      }
+    }
+    return toFontChar;
+  }
+  function adjustMapping(charCodeToGlyphId, hasGlyph, newGlyphZeroId) {
+    var newMap = Object.create(null);
+    var toFontChar = [];
+    var privateUseAreaIndex = 0;
+    var nextAvailableFontCharCode = PRIVATE_USE_AREAS[privateUseAreaIndex][0];
+    var privateUseOffetEnd = PRIVATE_USE_AREAS[privateUseAreaIndex][1];
+    for (var originalCharCode in charCodeToGlyphId) {
+      originalCharCode |= 0;
+      var glyphId = charCodeToGlyphId[originalCharCode];
+      if (!hasGlyph(glyphId)) {
+        continue;
+      }
+      if (nextAvailableFontCharCode > privateUseOffetEnd) {
+        privateUseAreaIndex++;
+        if (privateUseAreaIndex >= PRIVATE_USE_AREAS.length) {
+          (0, _util.warn)('Ran out of space in font private use area.');
+          break;
+        }
+        nextAvailableFontCharCode = PRIVATE_USE_AREAS[privateUseAreaIndex][0];
+        privateUseOffetEnd = PRIVATE_USE_AREAS[privateUseAreaIndex][1];
+      }
+      var fontCharCode = nextAvailableFontCharCode++;
+      if (glyphId === 0) {
+        glyphId = newGlyphZeroId;
+      }
+      newMap[fontCharCode] = glyphId;
+      toFontChar[originalCharCode] = fontCharCode;
+    }
+    return {
+      toFontChar: toFontChar,
+      charCodeToGlyphId: newMap,
+      nextAvailableFontCharCode: nextAvailableFontCharCode
+    };
+  }
+  function getRanges(glyphs, numGlyphs) {
+    var codes = [];
+    for (var charCode in glyphs) {
+      if (glyphs[charCode] >= numGlyphs) {
+        continue;
+      }
+      codes.push({
+        fontCharCode: charCode | 0,
+        glyphId: glyphs[charCode]
+      });
+    }
+    if (codes.length === 0) {
+      codes.push({
+        fontCharCode: 0,
+        glyphId: 0
+      });
+    }
+    codes.sort(function fontGetRangesSort(a, b) {
+      return a.fontCharCode - b.fontCharCode;
+    });
+    var ranges = [];
+    var length = codes.length;
+    for (var n = 0; n < length;) {
+      var start = codes[n].fontCharCode;
+      var codeIndices = [codes[n].glyphId];
+      ++n;
+      var end = start;
+      while (n < length && end + 1 === codes[n].fontCharCode) {
+        codeIndices.push(codes[n].glyphId);
+        ++end;
+        ++n;
+        if (end === 0xFFFF) {
+          break;
+        }
+      }
+      ranges.push([start, end, codeIndices]);
+    }
+    return ranges;
+  }
+  function createCmapTable(glyphs, numGlyphs) {
+    var ranges = getRanges(glyphs, numGlyphs);
+    var numTables = ranges[ranges.length - 1][1] > 0xFFFF ? 2 : 1;
+    var cmap = '\x00\x00' + string16(numTables) + '\x00\x03' + '\x00\x01' + (0, _util.string32)(4 + numTables * 8);
+    var i, ii, j, jj;
+    for (i = ranges.length - 1; i >= 0; --i) {
+      if (ranges[i][0] <= 0xFFFF) {
+        break;
+      }
+    }
+    var bmpLength = i + 1;
+    if (ranges[i][0] < 0xFFFF && ranges[i][1] === 0xFFFF) {
+      ranges[i][1] = 0xFFFE;
+    }
+    var trailingRangesCount = ranges[i][1] < 0xFFFF ? 1 : 0;
+    var segCount = bmpLength + trailingRangesCount;
+    var searchParams = OpenTypeFileBuilder.getSearchParams(segCount, 2);
+    var startCount = '';
+    var endCount = '';
+    var idDeltas = '';
+    var idRangeOffsets = '';
+    var glyphsIds = '';
+    var bias = 0;
+    var range, start, end, codes;
+    for (i = 0, ii = bmpLength; i < ii; i++) {
+      range = ranges[i];
+      start = range[0];
+      end = range[1];
+      startCount += string16(start);
+      endCount += string16(end);
+      codes = range[2];
+      var contiguous = true;
+      for (j = 1, jj = codes.length; j < jj; ++j) {
+        if (codes[j] !== codes[j - 1] + 1) {
+          contiguous = false;
+          break;
+        }
+      }
+      if (!contiguous) {
+        var offset = (segCount - i) * 2 + bias * 2;
+        bias += end - start + 1;
+        idDeltas += string16(0);
+        idRangeOffsets += string16(offset);
+        for (j = 0, jj = codes.length; j < jj; ++j) {
+          glyphsIds += string16(codes[j]);
+        }
+      } else {
+        var startCode = codes[0];
+        idDeltas += string16(startCode - start & 0xFFFF);
+        idRangeOffsets += string16(0);
+      }
+    }
+    if (trailingRangesCount > 0) {
+      endCount += '\xFF\xFF';
+      startCount += '\xFF\xFF';
+      idDeltas += '\x00\x01';
+      idRangeOffsets += '\x00\x00';
+    }
+    var format314 = '\x00\x00' + string16(2 * segCount) + string16(searchParams.range) + string16(searchParams.entry) + string16(searchParams.rangeShift) + endCount + '\x00\x00' + startCount + idDeltas + idRangeOffsets + glyphsIds;
+    var format31012 = '';
+    var header31012 = '';
+    if (numTables > 1) {
+      cmap += '\x00\x03' + '\x00\x0A' + (0, _util.string32)(4 + numTables * 8 + 4 + format314.length);
+      format31012 = '';
+      for (i = 0, ii = ranges.length; i < ii; i++) {
+        range = ranges[i];
+        start = range[0];
+        codes = range[2];
+        var code = codes[0];
+        for (j = 1, jj = codes.length; j < jj; ++j) {
+          if (codes[j] !== codes[j - 1] + 1) {
+            end = range[0] + j - 1;
+            format31012 += (0, _util.string32)(start) + (0, _util.string32)(end) + (0, _util.string32)(code);
+            start = end + 1;
+            code = codes[j];
+          }
+        }
+        format31012 += (0, _util.string32)(start) + (0, _util.string32)(range[1]) + (0, _util.string32)(code);
+      }
+      header31012 = '\x00\x0C' + '\x00\x00' + (0, _util.string32)(format31012.length + 16) + '\x00\x00\x00\x00' + (0, _util.string32)(format31012.length / 12);
+    }
+    return cmap + '\x00\x04' + string16(format314.length + 4) + format314 + header31012 + format31012;
+  }
+  function validateOS2Table(os2) {
+    var stream = new _stream.Stream(os2.data);
+    var version = stream.getUint16();
+    stream.getBytes(60);
+    var selection = stream.getUint16();
+    if (version < 4 && selection & 0x0300) {
+      return false;
+    }
+    var firstChar = stream.getUint16();
+    var lastChar = stream.getUint16();
+    if (firstChar > lastChar) {
+      return false;
+    }
+    stream.getBytes(6);
+    var usWinAscent = stream.getUint16();
+    if (usWinAscent === 0) {
+      return false;
+    }
+    os2.data[8] = os2.data[9] = 0;
+    return true;
+  }
+  function createOS2Table(properties, charstrings, override) {
+    override = override || {
+      unitsPerEm: 0,
+      yMax: 0,
+      yMin: 0,
+      ascent: 0,
+      descent: 0
+    };
+    var ulUnicodeRange1 = 0;
+    var ulUnicodeRange2 = 0;
+    var ulUnicodeRange3 = 0;
+    var ulUnicodeRange4 = 0;
+    var firstCharIndex = null;
+    var lastCharIndex = 0;
+    if (charstrings) {
+      for (var code in charstrings) {
+        code |= 0;
+        if (firstCharIndex > code || !firstCharIndex) {
+          firstCharIndex = code;
+        }
+        if (lastCharIndex < code) {
+          lastCharIndex = code;
+        }
+        var position = (0, _unicode.getUnicodeRangeFor)(code);
+        if (position < 32) {
+          ulUnicodeRange1 |= 1 << position;
+        } else if (position < 64) {
+          ulUnicodeRange2 |= 1 << position - 32;
+        } else if (position < 96) {
+          ulUnicodeRange3 |= 1 << position - 64;
+        } else if (position < 123) {
+          ulUnicodeRange4 |= 1 << position - 96;
+        } else {
+          throw new _util.FormatError('Unicode ranges Bits > 123 are reserved for internal usage');
+        }
+      }
+      if (lastCharIndex > 0xFFFF) {
+        lastCharIndex = 0xFFFF;
+      }
+    } else {
+      firstCharIndex = 0;
+      lastCharIndex = 255;
+    }
+    var bbox = properties.bbox || [0, 0, 0, 0];
+    var unitsPerEm = override.unitsPerEm || 1 / (properties.fontMatrix || _util.FONT_IDENTITY_MATRIX)[0];
+    var scale = properties.ascentScaled ? 1.0 : unitsPerEm / PDF_GLYPH_SPACE_UNITS;
+    var typoAscent = override.ascent || Math.round(scale * (properties.ascent || bbox[3]));
+    var typoDescent = override.descent || Math.round(scale * (properties.descent || bbox[1]));
+    if (typoDescent > 0 && properties.descent > 0 && bbox[1] < 0) {
+      typoDescent = -typoDescent;
+    }
+    var winAscent = override.yMax || typoAscent;
+    var winDescent = -override.yMin || -typoDescent;
+    return '\x00\x03' + '\x02\x24' + '\x01\xF4' + '\x00\x05' + '\x00\x00' + '\x02\x8A' + '\x02\xBB' + '\x00\x00' + '\x00\x8C' + '\x02\x8A' + '\x02\xBB' + '\x00\x00' + '\x01\xDF' + '\x00\x31' + '\x01\x02' + '\x00\x00' + '\x00\x00\x06' + String.fromCharCode(properties.fixedPitch ? 0x09 : 0x00) + '\x00\x00\x00\x00\x00\x00' + (0, _util.string32)(ulUnicodeRange1) + (0, _util.string32)(ulUnicodeRange2) + (0, _util.string32)(ulUnicodeRange3) + (0, _util.string32)(ulUnicodeRange4) + '\x2A\x32\x31\x2A' + string16(properties.italicAngle ? 1 : 0) + string16(firstCharIndex || properties.firstChar) + string16(lastCharIndex || properties.lastChar) + string16(typoAscent) + string16(typoDescent) + '\x00\x64' + string16(winAscent) + string16(winDescent) + '\x00\x00\x00\x00' + '\x00\x00\x00\x00' + string16(properties.xHeight) + string16(properties.capHeight) + string16(0) + string16(firstCharIndex || properties.firstChar) + '\x00\x03';
+  }
+  function createPostTable(properties) {
+    var angle = Math.floor(properties.italicAngle * Math.pow(2, 16));
+    return '\x00\x03\x00\x00' + (0, _util.string32)(angle) + '\x00\x00' + '\x00\x00' + (0, _util.string32)(properties.fixedPitch) + '\x00\x00\x00\x00' + '\x00\x00\x00\x00' + '\x00\x00\x00\x00' + '\x00\x00\x00\x00';
+  }
+  function createNameTable(name, proto) {
+    if (!proto) {
+      proto = [[], []];
+    }
+    var strings = [proto[0][0] || 'Original licence', proto[0][1] || name, proto[0][2] || 'Unknown', proto[0][3] || 'uniqueID', proto[0][4] || name, proto[0][5] || 'Version 0.11', proto[0][6] || '', proto[0][7] || 'Unknown', proto[0][8] || 'Unknown', proto[0][9] || 'Unknown'];
+    var stringsUnicode = [];
+    var i, ii, j, jj, str;
+    for (i = 0, ii = strings.length; i < ii; i++) {
+      str = proto[1][i] || strings[i];
+      var strBufUnicode = [];
+      for (j = 0, jj = str.length; j < jj; j++) {
+        strBufUnicode.push(string16(str.charCodeAt(j)));
+      }
+      stringsUnicode.push(strBufUnicode.join(''));
+    }
+    var names = [strings, stringsUnicode];
+    var platforms = ['\x00\x01', '\x00\x03'];
+    var encodings = ['\x00\x00', '\x00\x01'];
+    var languages = ['\x00\x00', '\x04\x09'];
+    var namesRecordCount = strings.length * platforms.length;
+    var nameTable = '\x00\x00' + string16(namesRecordCount) + string16(namesRecordCount * 12 + 6);
+    var strOffset = 0;
+    for (i = 0, ii = platforms.length; i < ii; i++) {
+      var strs = names[i];
+      for (j = 0, jj = strs.length; j < jj; j++) {
+        str = strs[j];
+        var nameRecord = platforms[i] + encodings[i] + languages[i] + string16(j) + string16(str.length) + string16(strOffset);
+        nameTable += nameRecord;
+        strOffset += str.length;
+      }
+    }
+    nameTable += strings.join('') + stringsUnicode.join('');
+    return nameTable;
+  }
+  Font.prototype = {
+    name: null,
+    font: null,
+    mimetype: null,
+    encoding: null,
+    get renderer() {
+      var renderer = _font_renderer.FontRendererFactory.create(this, SEAC_ANALYSIS_ENABLED);
+      return (0, _util.shadow)(this, 'renderer', renderer);
+    },
+    exportData: function Font_exportData() {
+      var data = {};
+      for (var i in this) {
+        if (this.hasOwnProperty(i)) {
+          data[i] = this[i];
+        }
+      }
+      return data;
+    },
+    fallbackToSystemFont: function Font_fallbackToSystemFont() {
+      var _this = this;
+
+      this.missingFile = true;
+      var charCode, unicode;
+      var name = this.name;
+      var type = this.type;
+      var subtype = this.subtype;
+      var fontName = name.replace(/[,_]/g, '-');
+      var stdFontMap = (0, _standard_fonts.getStdFontMap)(),
+          nonStdFontMap = (0, _standard_fonts.getNonStdFontMap)();
+      var isStandardFont = !!stdFontMap[fontName] || !!(nonStdFontMap[fontName] && stdFontMap[nonStdFontMap[fontName]]);
+      fontName = stdFontMap[fontName] || nonStdFontMap[fontName] || fontName;
+      this.bold = fontName.search(/bold/gi) !== -1;
+      this.italic = fontName.search(/oblique/gi) !== -1 || fontName.search(/italic/gi) !== -1;
+      this.black = name.search(/Black/g) !== -1;
+      this.remeasure = Object.keys(this.widths).length > 0;
+      if (isStandardFont && type === 'CIDFontType2' && this.cidEncoding.indexOf('Identity-') === 0) {
+        var GlyphMapForStandardFonts = (0, _standard_fonts.getGlyphMapForStandardFonts)();
+        var map = [];
+        for (charCode in GlyphMapForStandardFonts) {
+          map[+charCode] = GlyphMapForStandardFonts[charCode];
+        }
+        if (/Arial-?Black/i.test(name)) {
+          var SupplementalGlyphMapForArialBlack = (0, _standard_fonts.getSupplementalGlyphMapForArialBlack)();
+          for (charCode in SupplementalGlyphMapForArialBlack) {
+            map[+charCode] = SupplementalGlyphMapForArialBlack[charCode];
+          }
+        } else if (/Calibri/i.test(name)) {
+          var SupplementalGlyphMapForCalibri = (0, _standard_fonts.getSupplementalGlyphMapForCalibri)();
+          for (charCode in SupplementalGlyphMapForCalibri) {
+            map[+charCode] = SupplementalGlyphMapForCalibri[charCode];
+          }
+        }
+        var isIdentityUnicode = this.toUnicode instanceof IdentityToUnicodeMap;
+        if (!isIdentityUnicode) {
+          this.toUnicode.forEach(function (charCode, unicodeCharCode) {
+            map[+charCode] = unicodeCharCode;
+          });
+        }
+        this.toFontChar = map;
+        this.toUnicode = new ToUnicodeMap(map);
+      } else if (/Symbol/i.test(fontName)) {
+        this.toFontChar = buildToFontChar(_encodings.SymbolSetEncoding, (0, _glyphlist.getGlyphsUnicode)(), this.differences);
+      } else if (/Dingbats/i.test(fontName)) {
+        if (/Wingdings/i.test(name)) {
+          (0, _util.warn)('Non-embedded Wingdings font, falling back to ZapfDingbats.');
+        }
+        this.toFontChar = buildToFontChar(_encodings.ZapfDingbatsEncoding, (0, _glyphlist.getDingbatsGlyphsUnicode)(), this.differences);
+      } else if (isStandardFont) {
+        this.toFontChar = buildToFontChar(this.defaultEncoding, (0, _glyphlist.getGlyphsUnicode)(), this.differences);
+      } else {
+        var glyphsUnicodeMap = (0, _glyphlist.getGlyphsUnicode)();
+        this.toUnicode.forEach(function (charCode, unicodeCharCode) {
+          if (!_this.composite) {
+            var glyphName = _this.differences[charCode] || _this.defaultEncoding[charCode];
+            unicode = (0, _unicode.getUnicodeForGlyph)(glyphName, glyphsUnicodeMap);
+            if (unicode !== -1) {
+              unicodeCharCode = unicode;
+            }
+          }
+          _this.toFontChar[charCode] = unicodeCharCode;
+        });
+      }
+      this.loadedName = fontName.split('-')[0];
+      this.fontType = getFontType(type, subtype);
+    },
+    checkAndRepair: function Font_checkAndRepair(name, font, properties) {
+      var VALID_TABLES = ['OS/2', 'cmap', 'head', 'hhea', 'hmtx', 'maxp', 'name', 'post', 'loca', 'glyf', 'fpgm', 'prep', 'cvt ', 'CFF '];
+      function readTables(file, numTables) {
+        var tables = Object.create(null);
+        tables['OS/2'] = null;
+        tables['cmap'] = null;
+        tables['head'] = null;
+        tables['hhea'] = null;
+        tables['hmtx'] = null;
+        tables['maxp'] = null;
+        tables['name'] = null;
+        tables['post'] = null;
+        for (var i = 0; i < numTables; i++) {
+          var table = readTableEntry(font);
+          if (!VALID_TABLES.includes(table.tag)) {
+            continue;
+          }
+          if (table.length === 0) {
+            continue;
+          }
+          tables[table.tag] = table;
+        }
+        return tables;
+      }
+      function readTableEntry(file) {
+        var tag = (0, _util.bytesToString)(file.getBytes(4));
+        var checksum = file.getInt32() >>> 0;
+        var offset = file.getInt32() >>> 0;
+        var length = file.getInt32() >>> 0;
+        var previousPosition = file.pos;
+        file.pos = file.start ? file.start : 0;
+        file.skip(offset);
+        var data = file.getBytes(length);
+        file.pos = previousPosition;
+        if (tag === 'head') {
+          data[8] = data[9] = data[10] = data[11] = 0;
+          data[17] |= 0x20;
+        }
+        return {
+          tag: tag,
+          checksum: checksum,
+          length: length,
+          offset: offset,
+          data: data
+        };
+      }
+      function readOpenTypeHeader(ttf) {
+        return {
+          version: (0, _util.bytesToString)(ttf.getBytes(4)),
+          numTables: ttf.getUint16(),
+          searchRange: ttf.getUint16(),
+          entrySelector: ttf.getUint16(),
+          rangeShift: ttf.getUint16()
+        };
+      }
+      function readTrueTypeCollectionHeader(ttc) {
+        var ttcTag = (0, _util.bytesToString)(ttc.getBytes(4));
+        (0, _util.assert)(ttcTag === 'ttcf', 'Must be a TrueType Collection font.');
+        var majorVersion = ttc.getUint16();
+        var minorVersion = ttc.getUint16();
+        var numFonts = ttc.getInt32() >>> 0;
+        var offsetTable = [];
+        for (var i = 0; i < numFonts; i++) {
+          offsetTable.push(ttc.getInt32() >>> 0);
+        }
+        var header = {
+          ttcTag: ttcTag,
+          majorVersion: majorVersion,
+          minorVersion: minorVersion,
+          numFonts: numFonts,
+          offsetTable: offsetTable
+        };
+        switch (majorVersion) {
+          case 1:
+            return header;
+          case 2:
+            header.dsigTag = ttc.getInt32() >>> 0;
+            header.dsigLength = ttc.getInt32() >>> 0;
+            header.dsigOffset = ttc.getInt32() >>> 0;
+            return header;
+        }
+        throw new _util.FormatError('Invalid TrueType Collection majorVersion: ' + majorVersion + '.');
+      }
+      function readTrueTypeCollectionData(ttc, fontName) {
+        var _readTrueTypeCollecti = readTrueTypeCollectionHeader(ttc),
+            numFonts = _readTrueTypeCollecti.numFonts,
+            offsetTable = _readTrueTypeCollecti.offsetTable;
+
+        for (var i = 0; i < numFonts; i++) {
+          ttc.pos = (ttc.start || 0) + offsetTable[i];
+          var potentialHeader = readOpenTypeHeader(ttc);
+          var potentialTables = readTables(ttc, potentialHeader.numTables);
+          if (!potentialTables['name']) {
+            throw new _util.FormatError('TrueType Collection font must contain a "name" table.');
+          }
+          var nameTable = readNameTable(potentialTables['name']);
+          for (var j = 0, jj = nameTable.length; j < jj; j++) {
+            for (var k = 0, kk = nameTable[j].length; k < kk; k++) {
+              var nameEntry = nameTable[j][k];
+              if (nameEntry && nameEntry.replace(/\s/g, '') === fontName) {
+                return {
+                  header: potentialHeader,
+                  tables: potentialTables
+                };
+              }
+            }
+          }
+        }
+        throw new _util.FormatError('TrueType Collection does not contain "' + fontName + '" font.');
+      }
+      function readCmapTable(cmap, font, isSymbolicFont, hasEncoding) {
+        if (!cmap) {
+          (0, _util.warn)('No cmap table available.');
+          return {
+            platformId: -1,
+            encodingId: -1,
+            mappings: [],
+            hasShortCmap: false
+          };
+        }
+        var segment;
+        var start = (font.start ? font.start : 0) + cmap.offset;
+        font.pos = start;
+        font.getUint16();
+        var numTables = font.getUint16();
+        var potentialTable;
+        var canBreak = false;
+        for (var i = 0; i < numTables; i++) {
+          var platformId = font.getUint16();
+          var encodingId = font.getUint16();
+          var offset = font.getInt32() >>> 0;
+          var useTable = false;
+          if (potentialTable && potentialTable.platformId === platformId && potentialTable.encodingId === encodingId) {
+            continue;
+          }
+          if (platformId === 0 && encodingId === 0) {
+            useTable = true;
+          } else if (platformId === 1 && encodingId === 0) {
+            useTable = true;
+          } else if (platformId === 3 && encodingId === 1 && (hasEncoding || !potentialTable)) {
+            useTable = true;
+            if (!isSymbolicFont) {
+              canBreak = true;
+            }
+          } else if (isSymbolicFont && platformId === 3 && encodingId === 0) {
+            useTable = true;
+            canBreak = true;
+          }
+          if (useTable) {
+            potentialTable = {
+              platformId: platformId,
+              encodingId: encodingId,
+              offset: offset
+            };
+          }
+          if (canBreak) {
+            break;
+          }
+        }
+        if (potentialTable) {
+          font.pos = start + potentialTable.offset;
+        }
+        if (!potentialTable || font.peekByte() === -1) {
+          (0, _util.warn)('Could not find a preferred cmap table.');
+          return {
+            platformId: -1,
+            encodingId: -1,
+            mappings: [],
+            hasShortCmap: false
+          };
+        }
+        var format = font.getUint16();
+        font.getUint16();
+        font.getUint16();
+        var hasShortCmap = false;
+        var mappings = [];
+        var j, glyphId;
+        if (format === 0) {
+          for (j = 0; j < 256; j++) {
+            var index = font.getByte();
+            if (!index) {
+              continue;
+            }
+            mappings.push({
+              charCode: j,
+              glyphId: index
+            });
+          }
+          hasShortCmap = true;
+        } else if (format === 4) {
+          var segCount = font.getUint16() >> 1;
+          font.getBytes(6);
+          var segIndex,
+              segments = [];
+          for (segIndex = 0; segIndex < segCount; segIndex++) {
+            segments.push({ end: font.getUint16() });
+          }
+          font.getUint16();
+          for (segIndex = 0; segIndex < segCount; segIndex++) {
+            segments[segIndex].start = font.getUint16();
+          }
+          for (segIndex = 0; segIndex < segCount; segIndex++) {
+            segments[segIndex].delta = font.getUint16();
+          }
+          var offsetsCount = 0;
+          for (segIndex = 0; segIndex < segCount; segIndex++) {
+            segment = segments[segIndex];
+            var rangeOffset = font.getUint16();
+            if (!rangeOffset) {
+              segment.offsetIndex = -1;
+              continue;
+            }
+            var offsetIndex = (rangeOffset >> 1) - (segCount - segIndex);
+            segment.offsetIndex = offsetIndex;
+            offsetsCount = Math.max(offsetsCount, offsetIndex + segment.end - segment.start + 1);
+          }
+          var offsets = [];
+          for (j = 0; j < offsetsCount; j++) {
+            offsets.push(font.getUint16());
+          }
+          for (segIndex = 0; segIndex < segCount; segIndex++) {
+            segment = segments[segIndex];
+            start = segment.start;
+            var end = segment.end;
+            var delta = segment.delta;
+            offsetIndex = segment.offsetIndex;
+            for (j = start; j <= end; j++) {
+              if (j === 0xFFFF) {
+                continue;
+              }
+              glyphId = offsetIndex < 0 ? j : offsets[offsetIndex + j - start];
+              glyphId = glyphId + delta & 0xFFFF;
+              mappings.push({
+                charCode: j,
+                glyphId: glyphId
+              });
+            }
+          }
+        } else if (format === 6) {
+          var firstCode = font.getUint16();
+          var entryCount = font.getUint16();
+          for (j = 0; j < entryCount; j++) {
+            glyphId = font.getUint16();
+            var charCode = firstCode + j;
+            mappings.push({
+              charCode: charCode,
+              glyphId: glyphId
+            });
+          }
+        } else {
+          (0, _util.warn)('cmap table has unsupported format: ' + format);
+          return {
+            platformId: -1,
+            encodingId: -1,
+            mappings: [],
+            hasShortCmap: false
+          };
+        }
+        mappings.sort(function (a, b) {
+          return a.charCode - b.charCode;
+        });
+        for (i = 1; i < mappings.length; i++) {
+          if (mappings[i - 1].charCode === mappings[i].charCode) {
+            mappings.splice(i, 1);
+            i--;
+          }
+        }
+        return {
+          platformId: potentialTable.platformId,
+          encodingId: potentialTable.encodingId,
+          mappings: mappings,
+          hasShortCmap: hasShortCmap
+        };
+      }
+      function sanitizeMetrics(font, header, metrics, numGlyphs) {
+        if (!header) {
+          if (metrics) {
+            metrics.data = null;
+          }
+          return;
+        }
+        font.pos = (font.start ? font.start : 0) + header.offset;
+        font.pos += header.length - 2;
+        var numOfMetrics = font.getUint16();
+        if (numOfMetrics > numGlyphs) {
+          (0, _util.info)('The numOfMetrics (' + numOfMetrics + ') should not be ' + 'greater than the numGlyphs (' + numGlyphs + ')');
+          numOfMetrics = numGlyphs;
+          header.data[34] = (numOfMetrics & 0xff00) >> 8;
+          header.data[35] = numOfMetrics & 0x00ff;
+        }
+        var numOfSidebearings = numGlyphs - numOfMetrics;
+        var numMissing = numOfSidebearings - (metrics.length - numOfMetrics * 4 >> 1);
+        if (numMissing > 0) {
+          var entries = new Uint8Array(metrics.length + numMissing * 2);
+          entries.set(metrics.data);
+          metrics.data = entries;
+        }
+      }
+      function sanitizeGlyph(source, sourceStart, sourceEnd, dest, destStart, hintsValid) {
+        var glyphProfile = {
+          length: 0,
+          sizeOfInstructions: 0
+        };
+        if (sourceEnd - sourceStart <= 12) {
+          return glyphProfile;
+        }
+        var glyf = source.subarray(sourceStart, sourceEnd);
+        var contoursCount = signedInt16(glyf[0], glyf[1]);
+        if (contoursCount < 0) {
+          contoursCount = -1;
+          writeSignedInt16(glyf, 0, contoursCount);
+          dest.set(glyf, destStart);
+          glyphProfile.length = glyf.length;
+          return glyphProfile;
+        }
+        var i,
+            j = 10,
+            flagsCount = 0;
+        for (i = 0; i < contoursCount; i++) {
+          var endPoint = glyf[j] << 8 | glyf[j + 1];
+          flagsCount = endPoint + 1;
+          j += 2;
+        }
+        var instructionsStart = j;
+        var instructionsLength = glyf[j] << 8 | glyf[j + 1];
+        glyphProfile.sizeOfInstructions = instructionsLength;
+        j += 2 + instructionsLength;
+        var instructionsEnd = j;
+        var coordinatesLength = 0;
+        for (i = 0; i < flagsCount; i++) {
+          var flag = glyf[j++];
+          if (flag & 0xC0) {
+            glyf[j - 1] = flag & 0x3F;
+          }
+          var xyLength = (flag & 2 ? 1 : flag & 16 ? 0 : 2) + (flag & 4 ? 1 : flag & 32 ? 0 : 2);
+          coordinatesLength += xyLength;
+          if (flag & 8) {
+            var repeat = glyf[j++];
+            i += repeat;
+            coordinatesLength += repeat * xyLength;
+          }
+        }
+        if (coordinatesLength === 0) {
+          return glyphProfile;
+        }
+        var glyphDataLength = j + coordinatesLength;
+        if (glyphDataLength > glyf.length) {
+          return glyphProfile;
+        }
+        if (!hintsValid && instructionsLength > 0) {
+          dest.set(glyf.subarray(0, instructionsStart), destStart);
+          dest.set([0, 0], destStart + instructionsStart);
+          dest.set(glyf.subarray(instructionsEnd, glyphDataLength), destStart + instructionsStart + 2);
+          glyphDataLength -= instructionsLength;
+          if (glyf.length - glyphDataLength > 3) {
+            glyphDataLength = glyphDataLength + 3 & ~3;
+          }
+          glyphProfile.length = glyphDataLength;
+          return glyphProfile;
+        }
+        if (glyf.length - glyphDataLength > 3) {
+          glyphDataLength = glyphDataLength + 3 & ~3;
+          dest.set(glyf.subarray(0, glyphDataLength), destStart);
+          glyphProfile.length = glyphDataLength;
+          return glyphProfile;
+        }
+        dest.set(glyf, destStart);
+        glyphProfile.length = glyf.length;
+        return glyphProfile;
+      }
+      function sanitizeHead(head, numGlyphs, locaLength) {
+        var data = head.data;
+        var version = int32(data[0], data[1], data[2], data[3]);
+        if (version >> 16 !== 1) {
+          (0, _util.info)('Attempting to fix invalid version in head table: ' + version);
+          data[0] = 0;
+          data[1] = 1;
+          data[2] = 0;
+          data[3] = 0;
+        }
+        var indexToLocFormat = int16(data[50], data[51]);
+        if (indexToLocFormat < 0 || indexToLocFormat > 1) {
+          (0, _util.info)('Attempting to fix invalid indexToLocFormat in head table: ' + indexToLocFormat);
+          var numGlyphsPlusOne = numGlyphs + 1;
+          if (locaLength === numGlyphsPlusOne << 1) {
+            data[50] = 0;
+            data[51] = 0;
+          } else if (locaLength === numGlyphsPlusOne << 2) {
+            data[50] = 0;
+            data[51] = 1;
+          } else {
+            throw new _util.FormatError('Could not fix indexToLocFormat: ' + indexToLocFormat);
+          }
+        }
+      }
+      function sanitizeGlyphLocations(loca, glyf, numGlyphs, isGlyphLocationsLong, hintsValid, dupFirstEntry, maxSizeOfInstructions) {
+        var itemSize, itemDecode, itemEncode;
+        if (isGlyphLocationsLong) {
+          itemSize = 4;
+          itemDecode = function fontItemDecodeLong(data, offset) {
+            return data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3];
+          };
+          itemEncode = function fontItemEncodeLong(data, offset, value) {
+            data[offset] = value >>> 24 & 0xFF;
+            data[offset + 1] = value >> 16 & 0xFF;
+            data[offset + 2] = value >> 8 & 0xFF;
+            data[offset + 3] = value & 0xFF;
+          };
+        } else {
+          itemSize = 2;
+          itemDecode = function fontItemDecode(data, offset) {
+            return data[offset] << 9 | data[offset + 1] << 1;
+          };
+          itemEncode = function fontItemEncode(data, offset, value) {
+            data[offset] = value >> 9 & 0xFF;
+            data[offset + 1] = value >> 1 & 0xFF;
+          };
+        }
+        var numGlyphsOut = dupFirstEntry ? numGlyphs + 1 : numGlyphs;
+        var locaData = loca.data;
+        var locaDataSize = itemSize * (1 + numGlyphsOut);
+        locaData = new Uint8Array(locaDataSize);
+        locaData.set(loca.data.subarray(0, locaDataSize));
+        loca.data = locaData;
+        var oldGlyfData = glyf.data;
+        var oldGlyfDataLength = oldGlyfData.length;
+        var newGlyfData = new Uint8Array(oldGlyfDataLength);
+        var startOffset = itemDecode(locaData, 0);
+        var writeOffset = 0;
+        var missingGlyphs = Object.create(null);
+        itemEncode(locaData, 0, writeOffset);
+        var i, j;
+        for (i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize) {
+          var endOffset = itemDecode(locaData, j);
+          if (endOffset === 0) {
+            endOffset = startOffset;
+          }
+          if (endOffset > oldGlyfDataLength && (oldGlyfDataLength + 3 & ~3) === endOffset) {
+            endOffset = oldGlyfDataLength;
+          }
+          if (endOffset > oldGlyfDataLength) {
+            startOffset = endOffset;
+          }
+          var glyphProfile = sanitizeGlyph(oldGlyfData, startOffset, endOffset, newGlyfData, writeOffset, hintsValid);
+          var newLength = glyphProfile.length;
+          if (newLength === 0) {
+            missingGlyphs[i] = true;
+          }
+          if (glyphProfile.sizeOfInstructions > maxSizeOfInstructions) {
+            maxSizeOfInstructions = glyphProfile.sizeOfInstructions;
+          }
+          writeOffset += newLength;
+          itemEncode(locaData, j, writeOffset);
+          startOffset = endOffset;
+        }
+        if (writeOffset === 0) {
+          var simpleGlyph = new Uint8Array([0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0]);
+          for (i = 0, j = itemSize; i < numGlyphsOut; i++, j += itemSize) {
+            itemEncode(locaData, j, simpleGlyph.length);
+          }
+          glyf.data = simpleGlyph;
+        } else if (dupFirstEntry) {
+          var firstEntryLength = itemDecode(locaData, itemSize);
+          if (newGlyfData.length > firstEntryLength + writeOffset) {
+            glyf.data = newGlyfData.subarray(0, firstEntryLength + writeOffset);
+          } else {
+            glyf.data = new Uint8Array(firstEntryLength + writeOffset);
+            glyf.data.set(newGlyfData.subarray(0, writeOffset));
+          }
+          glyf.data.set(newGlyfData.subarray(0, firstEntryLength), writeOffset);
+          itemEncode(loca.data, locaData.length - itemSize, writeOffset + firstEntryLength);
+        } else {
+          glyf.data = newGlyfData.subarray(0, writeOffset);
+        }
+        return {
+          missingGlyphs: missingGlyphs,
+          maxSizeOfInstructions: maxSizeOfInstructions
+        };
+      }
+      function readPostScriptTable(post, properties, maxpNumGlyphs) {
+        var start = (font.start ? font.start : 0) + post.offset;
+        font.pos = start;
+        var length = post.length,
+            end = start + length;
+        var version = font.getInt32();
+        font.getBytes(28);
+        var glyphNames;
+        var valid = true;
+        var i;
+        switch (version) {
+          case 0x00010000:
+            glyphNames = MacStandardGlyphOrdering;
+            break;
+          case 0x00020000:
+            var numGlyphs = font.getUint16();
+            if (numGlyphs !== maxpNumGlyphs) {
+              valid = false;
+              break;
+            }
+            var glyphNameIndexes = [];
+            for (i = 0; i < numGlyphs; ++i) {
+              var index = font.getUint16();
+              if (index >= 32768) {
+                valid = false;
+                break;
+              }
+              glyphNameIndexes.push(index);
+            }
+            if (!valid) {
+              break;
+            }
+            var customNames = [];
+            var strBuf = [];
+            while (font.pos < end) {
+              var stringLength = font.getByte();
+              strBuf.length = stringLength;
+              for (i = 0; i < stringLength; ++i) {
+                strBuf[i] = String.fromCharCode(font.getByte());
+              }
+              customNames.push(strBuf.join(''));
+            }
+            glyphNames = [];
+            for (i = 0; i < numGlyphs; ++i) {
+              var j = glyphNameIndexes[i];
+              if (j < 258) {
+                glyphNames.push(MacStandardGlyphOrdering[j]);
+                continue;
+              }
+              glyphNames.push(customNames[j - 258]);
+            }
+            break;
+          case 0x00030000:
+            break;
+          default:
+            (0, _util.warn)('Unknown/unsupported post table version ' + version);
+            valid = false;
+            if (properties.defaultEncoding) {
+              glyphNames = properties.defaultEncoding;
+            }
+            break;
+        }
+        properties.glyphNames = glyphNames;
+        return valid;
+      }
+      function readNameTable(nameTable) {
+        var start = (font.start ? font.start : 0) + nameTable.offset;
+        font.pos = start;
+        var names = [[], []];
+        var length = nameTable.length,
+            end = start + length;
+        var format = font.getUint16();
+        var FORMAT_0_HEADER_LENGTH = 6;
+        if (format !== 0 || length < FORMAT_0_HEADER_LENGTH) {
+          return names;
+        }
+        var numRecords = font.getUint16();
+        var stringsStart = font.getUint16();
+        var records = [];
+        var NAME_RECORD_LENGTH = 12;
+        var i, ii;
+        for (i = 0; i < numRecords && font.pos + NAME_RECORD_LENGTH <= end; i++) {
+          var r = {
+            platform: font.getUint16(),
+            encoding: font.getUint16(),
+            language: font.getUint16(),
+            name: font.getUint16(),
+            length: font.getUint16(),
+            offset: font.getUint16()
+          };
+          if (r.platform === 1 && r.encoding === 0 && r.language === 0 || r.platform === 3 && r.encoding === 1 && r.language === 0x409) {
+            records.push(r);
+          }
+        }
+        for (i = 0, ii = records.length; i < ii; i++) {
+          var record = records[i];
+          if (record.length <= 0) {
+            continue;
+          }
+          var pos = start + stringsStart + record.offset;
+          if (pos + record.length > end) {
+            continue;
+          }
+          font.pos = pos;
+          var nameIndex = record.name;
+          if (record.encoding) {
+            var str = '';
+            for (var j = 0, jj = record.length; j < jj; j += 2) {
+              str += String.fromCharCode(font.getUint16());
+            }
+            names[1][nameIndex] = str;
+          } else {
+            names[0][nameIndex] = (0, _util.bytesToString)(font.getBytes(record.length));
+          }
+        }
+        return names;
+      }
+      var TTOpsStackDeltas = [0, 0, 0, 0, 0, 0, 0, 0, -2, -2, -2, -2, 0, 0, -2, -5, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, -1, -1, 1, -1, -999, 0, 1, 0, -1, -2, 0, -1, -2, -1, -1, 0, -1, -1, 0, 0, -999, -999, -1, -1, -1, -1, -2, -999, -2, -2, -999, 0, -2, -2, 0, 0, -2, 0, -2, 0, 0, 0, -2, -1, -1, 1, 1, 0, 0, -1, -1, -1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, 0, -999, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -2, -999, -999, -999, -999, -999, -1, -1, -2, -2, 0, 0, 0, 0, -1, -1, -999, -2, -2, 0, 0, -1, -2, -2, 0, 0, 0, -1, -1, -1, -2];
+      function sanitizeTTProgram(table, ttContext) {
+        var data = table.data;
+        var i = 0,
+            j,
+            n,
+            b,
+            funcId,
+            pc,
+            lastEndf = 0,
+            lastDeff = 0;
+        var stack = [];
+        var callstack = [];
+        var functionsCalled = [];
+        var tooComplexToFollowFunctions = ttContext.tooComplexToFollowFunctions;
+        var inFDEF = false,
+            ifLevel = 0,
+            inELSE = 0;
+        for (var ii = data.length; i < ii;) {
+          var op = data[i++];
+          if (op === 0x40) {
+            n = data[i++];
+            if (inFDEF || inELSE) {
+              i += n;
+            } else {
+              for (j = 0; j < n; j++) {
+                stack.push(data[i++]);
+              }
+            }
+          } else if (op === 0x41) {
+            n = data[i++];
+            if (inFDEF || inELSE) {
+              i += n * 2;
+            } else {
+              for (j = 0; j < n; j++) {
+                b = data[i++];
+                stack.push(b << 8 | data[i++]);
+              }
+            }
+          } else if ((op & 0xF8) === 0xB0) {
+            n = op - 0xB0 + 1;
+            if (inFDEF || inELSE) {
+              i += n;
+            } else {
+              for (j = 0; j < n; j++) {
+                stack.push(data[i++]);
+              }
+            }
+          } else if ((op & 0xF8) === 0xB8) {
+            n = op - 0xB8 + 1;
+            if (inFDEF || inELSE) {
+              i += n * 2;
+            } else {
+              for (j = 0; j < n; j++) {
+                b = data[i++];
+                stack.push(b << 8 | data[i++]);
+              }
+            }
+          } else if (op === 0x2B && !tooComplexToFollowFunctions) {
+            if (!inFDEF && !inELSE) {
+              funcId = stack[stack.length - 1];
+              if (isNaN(funcId)) {
+                (0, _util.info)('TT: CALL empty stack (or invalid entry).');
+              } else {
+                ttContext.functionsUsed[funcId] = true;
+                if (funcId in ttContext.functionsStackDeltas) {
+                  var newStackLength = stack.length + ttContext.functionsStackDeltas[funcId];
+                  if (newStackLength < 0) {
+                    (0, _util.warn)('TT: CALL invalid functions stack delta.');
+                    ttContext.hintsValid = false;
+                    return;
+                  }
+                  stack.length = newStackLength;
+                } else if (funcId in ttContext.functionsDefined && !functionsCalled.includes(funcId)) {
+                  callstack.push({
+                    data: data,
+                    i: i,
+                    stackTop: stack.length - 1
+                  });
+                  functionsCalled.push(funcId);
+                  pc = ttContext.functionsDefined[funcId];
+                  if (!pc) {
+                    (0, _util.warn)('TT: CALL non-existent function');
+                    ttContext.hintsValid = false;
+                    return;
+                  }
+                  data = pc.data;
+                  i = pc.i;
+                }
+              }
+            }
+          } else if (op === 0x2C && !tooComplexToFollowFunctions) {
+            if (inFDEF || inELSE) {
+              (0, _util.warn)('TT: nested FDEFs not allowed');
+              tooComplexToFollowFunctions = true;
+            }
+            inFDEF = true;
+            lastDeff = i;
+            funcId = stack.pop();
+            ttContext.functionsDefined[funcId] = {
+              data: data,
+              i: i
+            };
+          } else if (op === 0x2D) {
+            if (inFDEF) {
+              inFDEF = false;
+              lastEndf = i;
+            } else {
+              pc = callstack.pop();
+              if (!pc) {
+                (0, _util.warn)('TT: ENDF bad stack');
+                ttContext.hintsValid = false;
+                return;
+              }
+              funcId = functionsCalled.pop();
+              data = pc.data;
+              i = pc.i;
+              ttContext.functionsStackDeltas[funcId] = stack.length - pc.stackTop;
+            }
+          } else if (op === 0x89) {
+            if (inFDEF || inELSE) {
+              (0, _util.warn)('TT: nested IDEFs not allowed');
+              tooComplexToFollowFunctions = true;
+            }
+            inFDEF = true;
+            lastDeff = i;
+          } else if (op === 0x58) {
+            ++ifLevel;
+          } else if (op === 0x1B) {
+            inELSE = ifLevel;
+          } else if (op === 0x59) {
+            if (inELSE === ifLevel) {
+              inELSE = 0;
+            }
+            --ifLevel;
+          } else if (op === 0x1C) {
+            if (!inFDEF && !inELSE) {
+              var offset = stack[stack.length - 1];
+              if (offset > 0) {
+                i += offset - 1;
+              }
+            }
+          }
+          if (!inFDEF && !inELSE) {
+            var stackDelta = op <= 0x8E ? TTOpsStackDeltas[op] : op >= 0xC0 && op <= 0xDF ? -1 : op >= 0xE0 ? -2 : 0;
+            if (op >= 0x71 && op <= 0x75) {
+              n = stack.pop();
+              if (!isNaN(n)) {
+                stackDelta = -n * 2;
+              }
+            }
+            while (stackDelta < 0 && stack.length > 0) {
+              stack.pop();
+              stackDelta++;
+            }
+            while (stackDelta > 0) {
+              stack.push(NaN);
+              stackDelta--;
+            }
+          }
+        }
+        ttContext.tooComplexToFollowFunctions = tooComplexToFollowFunctions;
+        var content = [data];
+        if (i > data.length) {
+          content.push(new Uint8Array(i - data.length));
+        }
+        if (lastDeff > lastEndf) {
+          (0, _util.warn)('TT: complementing a missing function tail');
+          content.push(new Uint8Array([0x22, 0x2D]));
+        }
+        foldTTTable(table, content);
+      }
+      function checkInvalidFunctions(ttContext, maxFunctionDefs) {
+        if (ttContext.tooComplexToFollowFunctions) {
+          return;
+        }
+        if (ttContext.functionsDefined.length > maxFunctionDefs) {
+          (0, _util.warn)('TT: more functions defined than expected');
+          ttContext.hintsValid = false;
+          return;
+        }
+        for (var j = 0, jj = ttContext.functionsUsed.length; j < jj; j++) {
+          if (j > maxFunctionDefs) {
+            (0, _util.warn)('TT: invalid function id: ' + j);
+            ttContext.hintsValid = false;
+            return;
+          }
+          if (ttContext.functionsUsed[j] && !ttContext.functionsDefined[j]) {
+            (0, _util.warn)('TT: undefined function: ' + j);
+            ttContext.hintsValid = false;
+            return;
+          }
+        }
+      }
+      function foldTTTable(table, content) {
+        if (content.length > 1) {
+          var newLength = 0;
+          var j, jj;
+          for (j = 0, jj = content.length; j < jj; j++) {
+            newLength += content[j].length;
+          }
+          newLength = newLength + 3 & ~3;
+          var result = new Uint8Array(newLength);
+          var pos = 0;
+          for (j = 0, jj = content.length; j < jj; j++) {
+            result.set(content[j], pos);
+            pos += content[j].length;
+          }
+          table.data = result;
+          table.length = newLength;
+        }
+      }
+      function sanitizeTTPrograms(fpgm, prep, cvt, maxFunctionDefs) {
+        var ttContext = {
+          functionsDefined: [],
+          functionsUsed: [],
+          functionsStackDeltas: [],
+          tooComplexToFollowFunctions: false,
+          hintsValid: true
+        };
+        if (fpgm) {
+          sanitizeTTProgram(fpgm, ttContext);
+        }
+        if (prep) {
+          sanitizeTTProgram(prep, ttContext);
+        }
+        if (fpgm) {
+          checkInvalidFunctions(ttContext, maxFunctionDefs);
+        }
+        if (cvt && cvt.length & 1) {
+          var cvtData = new Uint8Array(cvt.length + 1);
+          cvtData.set(cvt.data);
+          cvt.data = cvtData;
+        }
+        return ttContext.hintsValid;
+      }
+      font = new _stream.Stream(new Uint8Array(font.getBytes()));
+      var header = void 0,
+          tables = void 0;
+      if (isTrueTypeCollectionFile(font)) {
+        var ttcData = readTrueTypeCollectionData(font, this.name);
+        header = ttcData.header;
+        tables = ttcData.tables;
+      } else {
+        header = readOpenTypeHeader(font);
+        tables = readTables(font, header.numTables);
+      }
+      var cff = void 0,
+          cffFile = void 0;
+      var isTrueType = !tables['CFF '];
+      if (!isTrueType) {
+        var isComposite = properties.composite && ((properties.cidToGidMap || []).length > 0 || !(properties.cMap instanceof _cmap.IdentityCMap));
+        if (header.version === 'OTTO' && !isComposite || !tables['head'] || !tables['hhea'] || !tables['maxp'] || !tables['post']) {
+          cffFile = new _stream.Stream(tables['CFF '].data);
+          cff = new CFFFont(cffFile, properties);
+          adjustWidths(properties);
+          return this.convert(name, cff, properties);
+        }
+        delete tables['glyf'];
+        delete tables['loca'];
+        delete tables['fpgm'];
+        delete tables['prep'];
+        delete tables['cvt '];
+        this.isOpenType = true;
+      } else {
+        if (!tables['loca']) {
+          throw new _util.FormatError('Required "loca" table is not found');
+        }
+        if (!tables['glyf']) {
+          (0, _util.warn)('Required "glyf" table is not found -- trying to recover.');
+          tables['glyf'] = {
+            tag: 'glyf',
+            data: new Uint8Array(0)
+          };
+        }
+        this.isOpenType = false;
+      }
+      if (!tables['maxp']) {
+        throw new _util.FormatError('Required "maxp" table is not found');
+      }
+      font.pos = (font.start || 0) + tables['maxp'].offset;
+      var version = font.getInt32();
+      var numGlyphs = font.getUint16();
+      var numGlyphsOut = numGlyphs + 1;
+      var dupFirstEntry = true;
+      if (numGlyphsOut > 0xFFFF) {
+        dupFirstEntry = false;
+        numGlyphsOut = numGlyphs;
+        (0, _util.warn)('Not enough space in glyfs to duplicate first glyph.');
+      }
+      var maxFunctionDefs = 0;
+      var maxSizeOfInstructions = 0;
+      if (version >= 0x00010000 && tables['maxp'].length >= 22) {
+        font.pos += 8;
+        var maxZones = font.getUint16();
+        if (maxZones > 2) {
+          tables['maxp'].data[14] = 0;
+          tables['maxp'].data[15] = 2;
+        }
+        font.pos += 4;
+        maxFunctionDefs = font.getUint16();
+        font.pos += 4;
+        maxSizeOfInstructions = font.getUint16();
+      }
+      tables['maxp'].data[4] = numGlyphsOut >> 8;
+      tables['maxp'].data[5] = numGlyphsOut & 255;
+      var hintsValid = sanitizeTTPrograms(tables['fpgm'], tables['prep'], tables['cvt '], maxFunctionDefs);
+      if (!hintsValid) {
+        delete tables['fpgm'];
+        delete tables['prep'];
+        delete tables['cvt '];
+      }
+      sanitizeMetrics(font, tables['hhea'], tables['hmtx'], numGlyphsOut);
+      if (!tables['head']) {
+        throw new _util.FormatError('Required "head" table is not found');
+      }
+      sanitizeHead(tables['head'], numGlyphs, isTrueType ? tables['loca'].length : 0);
+      var missingGlyphs = Object.create(null);
+      if (isTrueType) {
+        var isGlyphLocationsLong = int16(tables['head'].data[50], tables['head'].data[51]);
+        var glyphsInfo = sanitizeGlyphLocations(tables['loca'], tables['glyf'], numGlyphs, isGlyphLocationsLong, hintsValid, dupFirstEntry, maxSizeOfInstructions);
+        missingGlyphs = glyphsInfo.missingGlyphs;
+        if (version >= 0x00010000 && tables['maxp'].length >= 22) {
+          tables['maxp'].data[26] = glyphsInfo.maxSizeOfInstructions >> 8;
+          tables['maxp'].data[27] = glyphsInfo.maxSizeOfInstructions & 255;
+        }
+      }
+      if (!tables['hhea']) {
+        throw new _util.FormatError('Required "hhea" table is not found');
+      }
+      if (tables['hhea'].data[10] === 0 && tables['hhea'].data[11] === 0) {
+        tables['hhea'].data[10] = 0xFF;
+        tables['hhea'].data[11] = 0xFF;
+      }
+      var metricsOverride = {
+        unitsPerEm: int16(tables['head'].data[18], tables['head'].data[19]),
+        yMax: int16(tables['head'].data[42], tables['head'].data[43]),
+        yMin: signedInt16(tables['head'].data[38], tables['head'].data[39]),
+        ascent: int16(tables['hhea'].data[4], tables['hhea'].data[5]),
+        descent: signedInt16(tables['hhea'].data[6], tables['hhea'].data[7])
+      };
+      this.ascent = metricsOverride.ascent / metricsOverride.unitsPerEm;
+      this.descent = metricsOverride.descent / metricsOverride.unitsPerEm;
+      if (tables['post']) {
+        readPostScriptTable(tables['post'], properties, numGlyphs);
+      }
+      tables['post'] = {
+        tag: 'post',
+        data: createPostTable(properties)
+      };
+      var charCodeToGlyphId = [],
+          charCode;
+      function hasGlyph(glyphId) {
+        return !missingGlyphs[glyphId];
+      }
+      if (properties.composite) {
+        var cidToGidMap = properties.cidToGidMap || [];
+        var isCidToGidMapEmpty = cidToGidMap.length === 0;
+        properties.cMap.forEach(function (charCode, cid) {
+          if (cid > 0xffff) {
+            throw new _util.FormatError('Max size of CID is 65,535');
+          }
+          var glyphId = -1;
+          if (isCidToGidMapEmpty) {
+            glyphId = cid;
+          } else if (cidToGidMap[cid] !== undefined) {
+            glyphId = cidToGidMap[cid];
+          }
+          if (glyphId >= 0 && glyphId < numGlyphs && hasGlyph(glyphId)) {
+            charCodeToGlyphId[charCode] = glyphId;
+          }
+        });
+      } else {
+        var cmapTable = readCmapTable(tables['cmap'], font, this.isSymbolicFont, properties.hasEncoding);
+        var cmapPlatformId = cmapTable.platformId;
+        var cmapEncodingId = cmapTable.encodingId;
+        var cmapMappings = cmapTable.mappings;
+        var cmapMappingsLength = cmapMappings.length;
+        if (properties.hasEncoding && (cmapPlatformId === 3 && cmapEncodingId === 1 || cmapPlatformId === 1 && cmapEncodingId === 0) || cmapPlatformId === -1 && cmapEncodingId === -1 && !!(0, _encodings.getEncoding)(properties.baseEncodingName)) {
+          var baseEncoding = [];
+          if (properties.baseEncodingName === 'MacRomanEncoding' || properties.baseEncodingName === 'WinAnsiEncoding') {
+            baseEncoding = (0, _encodings.getEncoding)(properties.baseEncodingName);
+          }
+          var glyphsUnicodeMap = (0, _glyphlist.getGlyphsUnicode)();
+          for (charCode = 0; charCode < 256; charCode++) {
+            var glyphName, standardGlyphName;
+            if (this.differences && charCode in this.differences) {
+              glyphName = this.differences[charCode];
+            } else if (charCode in baseEncoding && baseEncoding[charCode] !== '') {
+              glyphName = baseEncoding[charCode];
+            } else {
+              glyphName = _encodings.StandardEncoding[charCode];
+            }
+            if (!glyphName) {
+              continue;
+            }
+            standardGlyphName = recoverGlyphName(glyphName, glyphsUnicodeMap);
+            var unicodeOrCharCode;
+            if (cmapPlatformId === 3 && cmapEncodingId === 1) {
+              unicodeOrCharCode = glyphsUnicodeMap[standardGlyphName];
+            } else if (cmapPlatformId === 1 && cmapEncodingId === 0) {
+              unicodeOrCharCode = _encodings.MacRomanEncoding.indexOf(standardGlyphName);
+            }
+            var found = false;
+            for (var i = 0; i < cmapMappingsLength; ++i) {
+              if (cmapMappings[i].charCode !== unicodeOrCharCode) {
+                continue;
+              }
+              charCodeToGlyphId[charCode] = cmapMappings[i].glyphId;
+              found = true;
+              break;
+            }
+            if (!found && properties.glyphNames) {
+              var glyphId = properties.glyphNames.indexOf(glyphName);
+              if (glyphId === -1 && standardGlyphName !== glyphName) {
+                glyphId = properties.glyphNames.indexOf(standardGlyphName);
+              }
+              if (glyphId > 0 && hasGlyph(glyphId)) {
+                charCodeToGlyphId[charCode] = glyphId;
+              }
+            }
+          }
+        } else if (cmapPlatformId === 0 && cmapEncodingId === 0) {
+          for (var _i = 0; _i < cmapMappingsLength; ++_i) {
+            charCodeToGlyphId[cmapMappings[_i].charCode] = cmapMappings[_i].glyphId;
+          }
+        } else {
+          for (var _i2 = 0; _i2 < cmapMappingsLength; ++_i2) {
+            charCode = cmapMappings[_i2].charCode;
+            if (cmapPlatformId === 3 && charCode >= 0xF000 && charCode <= 0xF0FF) {
+              charCode &= 0xFF;
+            }
+            charCodeToGlyphId[charCode] = cmapMappings[_i2].glyphId;
+          }
+        }
+      }
+      if (charCodeToGlyphId.length === 0) {
+        charCodeToGlyphId[0] = 0;
+      }
+      var glyphZeroId = numGlyphsOut - 1;
+      if (!dupFirstEntry) {
+        glyphZeroId = 0;
+      }
+      var newMapping = adjustMapping(charCodeToGlyphId, hasGlyph, glyphZeroId);
+      this.toFontChar = newMapping.toFontChar;
+      tables['cmap'] = {
+        tag: 'cmap',
+        data: createCmapTable(newMapping.charCodeToGlyphId, numGlyphsOut)
+      };
+      if (!tables['OS/2'] || !validateOS2Table(tables['OS/2'])) {
+        tables['OS/2'] = {
+          tag: 'OS/2',
+          data: createOS2Table(properties, newMapping.charCodeToGlyphId, metricsOverride)
+        };
+      }
+      if (!isTrueType) {
+        try {
+          cffFile = new _stream.Stream(tables['CFF '].data);
+          var parser = new _cff_parser.CFFParser(cffFile, properties, SEAC_ANALYSIS_ENABLED);
+          cff = parser.parse();
+          cff.duplicateFirstGlyph();
+          var compiler = new _cff_parser.CFFCompiler(cff);
+          tables['CFF '].data = compiler.compile();
+        } catch (e) {
+          (0, _util.warn)('Failed to compile font ' + properties.loadedName);
+        }
+      }
+      if (!tables['name']) {
+        tables['name'] = {
+          tag: 'name',
+          data: createNameTable(this.name)
+        };
+      } else {
+        var namePrototype = readNameTable(tables['name']);
+        tables['name'].data = createNameTable(name, namePrototype);
+      }
+      var builder = new OpenTypeFileBuilder(header.version);
+      for (var tableTag in tables) {
+        builder.addTable(tableTag, tables[tableTag].data);
+      }
+      return builder.toArray();
+    },
+    convert: function Font_convert(fontName, font, properties) {
+      properties.fixedPitch = false;
+      if (properties.builtInEncoding) {
+        adjustToUnicode(properties, properties.builtInEncoding);
+      }
+      var glyphZeroId = 1;
+      if (font instanceof CFFFont) {
+        glyphZeroId = font.numGlyphs - 1;
+      }
+      var mapping = font.getGlyphMapping(properties);
+      var newMapping = adjustMapping(mapping, font.hasGlyphId.bind(font), glyphZeroId);
+      this.toFontChar = newMapping.toFontChar;
+      var numGlyphs = font.numGlyphs;
+      function getCharCodes(charCodeToGlyphId, glyphId) {
+        var charCodes = null;
+        for (var charCode in charCodeToGlyphId) {
+          if (glyphId === charCodeToGlyphId[charCode]) {
+            if (!charCodes) {
+              charCodes = [];
+            }
+            charCodes.push(charCode | 0);
+          }
+        }
+        return charCodes;
+      }
+      function createCharCode(charCodeToGlyphId, glyphId) {
+        for (var charCode in charCodeToGlyphId) {
+          if (glyphId === charCodeToGlyphId[charCode]) {
+            return charCode | 0;
+          }
+        }
+        newMapping.charCodeToGlyphId[newMapping.nextAvailableFontCharCode] = glyphId;
+        return newMapping.nextAvailableFontCharCode++;
+      }
+      var seacs = font.seacs;
+      if (SEAC_ANALYSIS_ENABLED && seacs && seacs.length) {
+        var matrix = properties.fontMatrix || _util.FONT_IDENTITY_MATRIX;
+        var charset = font.getCharset();
+        var seacMap = Object.create(null);
+        for (var glyphId in seacs) {
+          glyphId |= 0;
+          var seac = seacs[glyphId];
+          var baseGlyphName = _encodings.StandardEncoding[seac[2]];
+          var accentGlyphName = _encodings.StandardEncoding[seac[3]];
+          var baseGlyphId = charset.indexOf(baseGlyphName);
+          var accentGlyphId = charset.indexOf(accentGlyphName);
+          if (baseGlyphId < 0 || accentGlyphId < 0) {
+            continue;
+          }
+          var accentOffset = {
+            x: seac[0] * matrix[0] + seac[1] * matrix[2] + matrix[4],
+            y: seac[0] * matrix[1] + seac[1] * matrix[3] + matrix[5]
+          };
+          var charCodes = getCharCodes(mapping, glyphId);
+          if (!charCodes) {
+            continue;
+          }
+          for (var i = 0, ii = charCodes.length; i < ii; i++) {
+            var charCode = charCodes[i];
+            var charCodeToGlyphId = newMapping.charCodeToGlyphId;
+            var baseFontCharCode = createCharCode(charCodeToGlyphId, baseGlyphId);
+            var accentFontCharCode = createCharCode(charCodeToGlyphId, accentGlyphId);
+            seacMap[charCode] = {
+              baseFontCharCode: baseFontCharCode,
+              accentFontCharCode: accentFontCharCode,
+              accentOffset: accentOffset
+            };
+          }
+        }
+        properties.seacMap = seacMap;
+      }
+      var unitsPerEm = 1 / (properties.fontMatrix || _util.FONT_IDENTITY_MATRIX)[0];
+      var builder = new OpenTypeFileBuilder('\x4F\x54\x54\x4F');
+      builder.addTable('CFF ', font.data);
+      builder.addTable('OS/2', createOS2Table(properties, newMapping.charCodeToGlyphId));
+      builder.addTable('cmap', createCmapTable(newMapping.charCodeToGlyphId, numGlyphs));
+      builder.addTable('head', '\x00\x01\x00\x00' + '\x00\x00\x10\x00' + '\x00\x00\x00\x00' + '\x5F\x0F\x3C\xF5' + '\x00\x00' + safeString16(unitsPerEm) + '\x00\x00\x00\x00\x9e\x0b\x7e\x27' + '\x00\x00\x00\x00\x9e\x0b\x7e\x27' + '\x00\x00' + safeString16(properties.descent) + '\x0F\xFF' + safeString16(properties.ascent) + string16(properties.italicAngle ? 2 : 0) + '\x00\x11' + '\x00\x00' + '\x00\x00' + '\x00\x00');
+      builder.addTable('hhea', '\x00\x01\x00\x00' + safeString16(properties.ascent) + safeString16(properties.descent) + '\x00\x00' + '\xFF\xFF' + '\x00\x00' + '\x00\x00' + '\x00\x00' + safeString16(properties.capHeight) + safeString16(Math.tan(properties.italicAngle) * properties.xHeight) + '\x00\x00' + '\x00\x00' + '\x00\x00' + '\x00\x00' + '\x00\x00' + '\x00\x00' + string16(numGlyphs));
+      builder.addTable('hmtx', function fontFieldsHmtx() {
+        var charstrings = font.charstrings;
+        var cffWidths = font.cff ? font.cff.widths : null;
+        var hmtx = '\x00\x00\x00\x00';
+        for (var i = 1, ii = numGlyphs; i < ii; i++) {
+          var width = 0;
+          if (charstrings) {
+            var charstring = charstrings[i - 1];
+            width = 'width' in charstring ? charstring.width : 0;
+          } else if (cffWidths) {
+            width = Math.ceil(cffWidths[i] || 0);
+          }
+          hmtx += string16(width) + string16(0);
+        }
+        return hmtx;
+      }());
+      builder.addTable('maxp', '\x00\x00\x50\x00' + string16(numGlyphs));
+      builder.addTable('name', createNameTable(fontName));
+      builder.addTable('post', createPostTable(properties));
+      return builder.toArray();
+    },
+    get spaceWidth() {
+      if ('_shadowWidth' in this) {
+        return this._shadowWidth;
+      }
+      var possibleSpaceReplacements = ['space', 'minus', 'one', 'i', 'I'];
+      var width;
+      for (var i = 0, ii = possibleSpaceReplacements.length; i < ii; i++) {
+        var glyphName = possibleSpaceReplacements[i];
+        if (glyphName in this.widths) {
+          width = this.widths[glyphName];
+          break;
+        }
+        var glyphsUnicodeMap = (0, _glyphlist.getGlyphsUnicode)();
+        var glyphUnicode = glyphsUnicodeMap[glyphName];
+        var charcode = 0;
+        if (this.composite) {
+          if (this.cMap.contains(glyphUnicode)) {
+            charcode = this.cMap.lookup(glyphUnicode);
+          }
+        }
+        if (!charcode && this.toUnicode) {
+          charcode = this.toUnicode.charCodeOf(glyphUnicode);
+        }
+        if (charcode <= 0) {
+          charcode = glyphUnicode;
+        }
+        width = this.widths[charcode];
+        if (width) {
+          break;
+        }
+      }
+      width = width || this.defaultWidth;
+      this._shadowWidth = width;
+      return width;
+    },
+    charToGlyph: function Font_charToGlyph(charcode, isSpace) {
+      var fontCharCode, width, operatorListId;
+      var widthCode = charcode;
+      if (this.cMap && this.cMap.contains(charcode)) {
+        widthCode = this.cMap.lookup(charcode);
+      }
+      width = this.widths[widthCode];
+      width = (0, _util.isNum)(width) ? width : this.defaultWidth;
+      var vmetric = this.vmetrics && this.vmetrics[widthCode];
+      var unicode = this.toUnicode.get(charcode) || this.fallbackToUnicode.get(charcode) || charcode;
+      if (typeof unicode === 'number') {
+        unicode = String.fromCharCode(unicode);
+      }
+      var isInFont = charcode in this.toFontChar;
+      fontCharCode = this.toFontChar[charcode] || charcode;
+      if (this.missingFile) {
+        fontCharCode = (0, _unicode.mapSpecialUnicodeValues)(fontCharCode);
+      }
+      if (this.isType3Font) {
+        operatorListId = fontCharCode;
+      }
+      var accent = null;
+      if (this.seacMap && this.seacMap[charcode]) {
+        isInFont = true;
+        var seac = this.seacMap[charcode];
+        fontCharCode = seac.baseFontCharCode;
+        accent = {
+          fontChar: String.fromCodePoint(seac.accentFontCharCode),
+          offset: seac.accentOffset
+        };
+      }
+      var fontChar = typeof fontCharCode === 'number' ? String.fromCodePoint(fontCharCode) : '';
+      var glyph = this.glyphCache[charcode];
+      if (!glyph || !glyph.matchesForCache(fontChar, unicode, accent, width, vmetric, operatorListId, isSpace, isInFont)) {
+        glyph = new Glyph(fontChar, unicode, accent, width, vmetric, operatorListId, isSpace, isInFont);
+        this.glyphCache[charcode] = glyph;
+      }
+      return glyph;
+    },
+    charsToGlyphs: function Font_charsToGlyphs(chars) {
+      var charsCache = this.charsCache;
+      var glyphs, glyph, charcode;
+      if (charsCache) {
+        glyphs = charsCache[chars];
+        if (glyphs) {
+          return glyphs;
+        }
+      }
+      if (!charsCache) {
+        charsCache = this.charsCache = Object.create(null);
+      }
+      glyphs = [];
+      var charsCacheKey = chars;
+      var i = 0,
+          ii;
+      if (this.cMap) {
+        var c = Object.create(null);
+        while (i < chars.length) {
+          this.cMap.readCharCode(chars, i, c);
+          charcode = c.charcode;
+          var length = c.length;
+          i += length;
+          var isSpace = length === 1 && chars.charCodeAt(i - 1) === 0x20;
+          glyph = this.charToGlyph(charcode, isSpace);
+          glyphs.push(glyph);
+        }
+      } else {
+        for (i = 0, ii = chars.length; i < ii; ++i) {
+          charcode = chars.charCodeAt(i);
+          glyph = this.charToGlyph(charcode, charcode === 0x20);
+          glyphs.push(glyph);
+        }
+      }
+      return charsCache[charsCacheKey] = glyphs;
+    }
+  };
+  return Font;
+}();
+var ErrorFont = function ErrorFontClosure() {
+  function ErrorFont(error) {
+    this.error = error;
+    this.loadedName = 'g_font_error';
+    this.missingFile = true;
+  }
+  ErrorFont.prototype = {
+    charsToGlyphs: function ErrorFont_charsToGlyphs() {
+      return [];
+    },
+    exportData: function ErrorFont_exportData() {
+      return { error: this.error };
+    }
+  };
+  return ErrorFont;
+}();
+function type1FontGlyphMapping(properties, builtInEncoding, glyphNames) {
+  var charCodeToGlyphId = Object.create(null);
+  var glyphId, charCode, baseEncoding;
+  var isSymbolicFont = !!(properties.flags & FontFlags.Symbolic);
+  if (properties.baseEncodingName) {
+    baseEncoding = (0, _encodings.getEncoding)(properties.baseEncodingName);
+    for (charCode = 0; charCode < baseEncoding.length; charCode++) {
+      glyphId = glyphNames.indexOf(baseEncoding[charCode]);
+      if (glyphId >= 0) {
+        charCodeToGlyphId[charCode] = glyphId;
+      } else {
+        charCodeToGlyphId[charCode] = 0;
+      }
+    }
+  } else if (isSymbolicFont) {
+    for (charCode in builtInEncoding) {
+      charCodeToGlyphId[charCode] = builtInEncoding[charCode];
+    }
+  } else {
+    baseEncoding = _encodings.StandardEncoding;
+    for (charCode = 0; charCode < baseEncoding.length; charCode++) {
+      glyphId = glyphNames.indexOf(baseEncoding[charCode]);
+      if (glyphId >= 0) {
+        charCodeToGlyphId[charCode] = glyphId;
+      } else {
+        charCodeToGlyphId[charCode] = 0;
+      }
+    }
+  }
+  var differences = properties.differences,
+      glyphsUnicodeMap;
+  if (differences) {
+    for (charCode in differences) {
+      var glyphName = differences[charCode];
+      glyphId = glyphNames.indexOf(glyphName);
+      if (glyphId === -1) {
+        if (!glyphsUnicodeMap) {
+          glyphsUnicodeMap = (0, _glyphlist.getGlyphsUnicode)();
+        }
+        var standardGlyphName = recoverGlyphName(glyphName, glyphsUnicodeMap);
+        if (standardGlyphName !== glyphName) {
+          glyphId = glyphNames.indexOf(standardGlyphName);
+        }
+      }
+      if (glyphId >= 0) {
+        charCodeToGlyphId[charCode] = glyphId;
+      } else {
+        charCodeToGlyphId[charCode] = 0;
+      }
+    }
+  }
+  return charCodeToGlyphId;
+}
+var Type1Font = function Type1FontClosure() {
+  function findBlock(streamBytes, signature, startIndex) {
+    var streamBytesLength = streamBytes.length;
+    var signatureLength = signature.length;
+    var scanLength = streamBytesLength - signatureLength;
+    var i = startIndex,
+        j,
+        found = false;
+    while (i < scanLength) {
+      j = 0;
+      while (j < signatureLength && streamBytes[i + j] === signature[j]) {
+        j++;
+      }
+      if (j >= signatureLength) {
+        i += j;
+        while (i < streamBytesLength && (0, _util.isSpace)(streamBytes[i])) {
+          i++;
+        }
+        found = true;
+        break;
+      }
+      i++;
+    }
+    return {
+      found: found,
+      length: i
+    };
+  }
+  function getHeaderBlock(stream, suggestedLength) {
+    var EEXEC_SIGNATURE = [0x65, 0x65, 0x78, 0x65, 0x63];
+    var streamStartPos = stream.pos;
+    var headerBytes, headerBytesLength, block;
+    try {
+      headerBytes = stream.getBytes(suggestedLength);
+      headerBytesLength = headerBytes.length;
+    } catch (ex) {
+      if (ex instanceof _util.MissingDataException) {
+        throw ex;
+      }
+    }
+    if (headerBytesLength === suggestedLength) {
+      block = findBlock(headerBytes, EEXEC_SIGNATURE, suggestedLength - 2 * EEXEC_SIGNATURE.length);
+      if (block.found && block.length === suggestedLength) {
+        return {
+          stream: new _stream.Stream(headerBytes),
+          length: suggestedLength
+        };
+      }
+    }
+    (0, _util.warn)('Invalid "Length1" property in Type1 font -- trying to recover.');
+    stream.pos = streamStartPos;
+    var SCAN_BLOCK_LENGTH = 2048;
+    var actualLength;
+    while (true) {
+      var scanBytes = stream.peekBytes(SCAN_BLOCK_LENGTH);
+      block = findBlock(scanBytes, EEXEC_SIGNATURE, 0);
+      if (block.length === 0) {
+        break;
+      }
+      stream.pos += block.length;
+      if (block.found) {
+        actualLength = stream.pos - streamStartPos;
+        break;
+      }
+    }
+    stream.pos = streamStartPos;
+    if (actualLength) {
+      return {
+        stream: new _stream.Stream(stream.getBytes(actualLength)),
+        length: actualLength
+      };
+    }
+    (0, _util.warn)('Unable to recover "Length1" property in Type1 font -- using as is.');
+    return {
+      stream: new _stream.Stream(stream.getBytes(suggestedLength)),
+      length: suggestedLength
+    };
+  }
+  function getEexecBlock(stream, suggestedLength) {
+    var eexecBytes = stream.getBytes();
+    return {
+      stream: new _stream.Stream(eexecBytes),
+      length: eexecBytes.length
+    };
+  }
+  function Type1Font(name, file, properties) {
+    var PFB_HEADER_SIZE = 6;
+    var headerBlockLength = properties.length1;
+    var eexecBlockLength = properties.length2;
+    var pfbHeader = file.peekBytes(PFB_HEADER_SIZE);
+    var pfbHeaderPresent = pfbHeader[0] === 0x80 && pfbHeader[1] === 0x01;
+    if (pfbHeaderPresent) {
+      file.skip(PFB_HEADER_SIZE);
+      headerBlockLength = pfbHeader[5] << 24 | pfbHeader[4] << 16 | pfbHeader[3] << 8 | pfbHeader[2];
+    }
+    var headerBlock = getHeaderBlock(file, headerBlockLength);
+    var headerBlockParser = new _type1_parser.Type1Parser(headerBlock.stream, false, SEAC_ANALYSIS_ENABLED);
+    headerBlockParser.extractFontHeader(properties);
+    if (pfbHeaderPresent) {
+      pfbHeader = file.getBytes(PFB_HEADER_SIZE);
+      eexecBlockLength = pfbHeader[5] << 24 | pfbHeader[4] << 16 | pfbHeader[3] << 8 | pfbHeader[2];
+    }
+    var eexecBlock = getEexecBlock(file, eexecBlockLength);
+    var eexecBlockParser = new _type1_parser.Type1Parser(eexecBlock.stream, true, SEAC_ANALYSIS_ENABLED);
+    var data = eexecBlockParser.extractFontProgram();
+    for (var info in data.properties) {
+      properties[info] = data.properties[info];
+    }
+    var charstrings = data.charstrings;
+    var type2Charstrings = this.getType2Charstrings(charstrings);
+    var subrs = this.getType2Subrs(data.subrs);
+    this.charstrings = charstrings;
+    this.data = this.wrap(name, type2Charstrings, this.charstrings, subrs, properties);
+    this.seacs = this.getSeacs(data.charstrings);
+  }
+  Type1Font.prototype = {
+    get numGlyphs() {
+      return this.charstrings.length + 1;
+    },
+    getCharset: function Type1Font_getCharset() {
+      var charset = ['.notdef'];
+      var charstrings = this.charstrings;
+      for (var glyphId = 0; glyphId < charstrings.length; glyphId++) {
+        charset.push(charstrings[glyphId].glyphName);
+      }
+      return charset;
+    },
+    getGlyphMapping: function Type1Font_getGlyphMapping(properties) {
+      var charstrings = this.charstrings;
+      var glyphNames = ['.notdef'],
+          glyphId;
+      for (glyphId = 0; glyphId < charstrings.length; glyphId++) {
+        glyphNames.push(charstrings[glyphId].glyphName);
+      }
+      var encoding = properties.builtInEncoding;
+      if (encoding) {
+        var builtInEncoding = Object.create(null);
+        for (var charCode in encoding) {
+          glyphId = glyphNames.indexOf(encoding[charCode]);
+          if (glyphId >= 0) {
+            builtInEncoding[charCode] = glyphId;
+          }
+        }
+      }
+      return type1FontGlyphMapping(properties, builtInEncoding, glyphNames);
+    },
+    hasGlyphId: function Type1Font_hasGlyphID(id) {
+      if (id < 0 || id >= this.numGlyphs) {
+        return false;
+      }
+      if (id === 0) {
+        return true;
+      }
+      var glyph = this.charstrings[id - 1];
+      return glyph.charstring.length > 0;
+    },
+    getSeacs: function Type1Font_getSeacs(charstrings) {
+      var i, ii;
+      var seacMap = [];
+      for (i = 0, ii = charstrings.length; i < ii; i++) {
+        var charstring = charstrings[i];
+        if (charstring.seac) {
+          seacMap[i + 1] = charstring.seac;
+        }
+      }
+      return seacMap;
+    },
+    getType2Charstrings: function Type1Font_getType2Charstrings(type1Charstrings) {
+      var type2Charstrings = [];
+      for (var i = 0, ii = type1Charstrings.length; i < ii; i++) {
+        type2Charstrings.push(type1Charstrings[i].charstring);
+      }
+      return type2Charstrings;
+    },
+    getType2Subrs: function Type1Font_getType2Subrs(type1Subrs) {
+      var bias = 0;
+      var count = type1Subrs.length;
+      if (count < 1133) {
+        bias = 107;
+      } else if (count < 33769) {
+        bias = 1131;
+      } else {
+        bias = 32768;
+      }
+      var type2Subrs = [];
+      var i;
+      for (i = 0; i < bias; i++) {
+        type2Subrs.push([0x0B]);
+      }
+      for (i = 0; i < count; i++) {
+        type2Subrs.push(type1Subrs[i]);
+      }
+      return type2Subrs;
+    },
+    wrap: function Type1Font_wrap(name, glyphs, charstrings, subrs, properties) {
+      var cff = new _cff_parser.CFF();
+      cff.header = new _cff_parser.CFFHeader(1, 0, 4, 4);
+      cff.names = [name];
+      var topDict = new _cff_parser.CFFTopDict();
+      topDict.setByName('version', 391);
+      topDict.setByName('Notice', 392);
+      topDict.setByName('FullName', 393);
+      topDict.setByName('FamilyName', 394);
+      topDict.setByName('Weight', 395);
+      topDict.setByName('Encoding', null);
+      topDict.setByName('FontMatrix', properties.fontMatrix);
+      topDict.setByName('FontBBox', properties.bbox);
+      topDict.setByName('charset', null);
+      topDict.setByName('CharStrings', null);
+      topDict.setByName('Private', null);
+      cff.topDict = topDict;
+      var strings = new _cff_parser.CFFStrings();
+      strings.add('Version 0.11');
+      strings.add('See original notice');
+      strings.add(name);
+      strings.add(name);
+      strings.add('Medium');
+      cff.strings = strings;
+      cff.globalSubrIndex = new _cff_parser.CFFIndex();
+      var count = glyphs.length;
+      var charsetArray = [0];
+      var i, ii;
+      for (i = 0; i < count; i++) {
+        var index = _cff_parser.CFFStandardStrings.indexOf(charstrings[i].glyphName);
+        if (index === -1) {
+          index = 0;
+        }
+        charsetArray.push(index >> 8 & 0xff, index & 0xff);
+      }
+      cff.charset = new _cff_parser.CFFCharset(false, 0, [], charsetArray);
+      var charStringsIndex = new _cff_parser.CFFIndex();
+      charStringsIndex.add([0x8B, 0x0E]);
+      for (i = 0; i < count; i++) {
+        charStringsIndex.add(glyphs[i]);
+      }
+      cff.charStrings = charStringsIndex;
+      var privateDict = new _cff_parser.CFFPrivateDict();
+      privateDict.setByName('Subrs', null);
+      var fields = ['BlueValues', 'OtherBlues', 'FamilyBlues', 'FamilyOtherBlues', 'StemSnapH', 'StemSnapV', 'BlueShift', 'BlueFuzz', 'BlueScale', 'LanguageGroup', 'ExpansionFactor', 'ForceBold', 'StdHW', 'StdVW'];
+      for (i = 0, ii = fields.length; i < ii; i++) {
+        var field = fields[i];
+        if (!(field in properties.privateData)) {
+          continue;
+        }
+        var value = properties.privateData[field];
+        if (Array.isArray(value)) {
+          for (var j = value.length - 1; j > 0; j--) {
+            value[j] -= value[j - 1];
+          }
+        }
+        privateDict.setByName(field, value);
+      }
+      cff.topDict.privateDict = privateDict;
+      var subrIndex = new _cff_parser.CFFIndex();
+      for (i = 0, ii = subrs.length; i < ii; i++) {
+        subrIndex.add(subrs[i]);
+      }
+      privateDict.subrsIndex = subrIndex;
+      var compiler = new _cff_parser.CFFCompiler(cff);
+      return compiler.compile();
+    }
+  };
+  return Type1Font;
+}();
+var CFFFont = function CFFFontClosure() {
+  function CFFFont(file, properties) {
+    this.properties = properties;
+    var parser = new _cff_parser.CFFParser(file, properties, SEAC_ANALYSIS_ENABLED);
+    this.cff = parser.parse();
+    this.cff.duplicateFirstGlyph();
+    var compiler = new _cff_parser.CFFCompiler(this.cff);
+    this.seacs = this.cff.seacs;
+    try {
+      this.data = compiler.compile();
+    } catch (e) {
+      (0, _util.warn)('Failed to compile font ' + properties.loadedName);
+      this.data = file;
+    }
+  }
+  CFFFont.prototype = {
+    get numGlyphs() {
+      return this.cff.charStrings.count;
+    },
+    getCharset: function CFFFont_getCharset() {
+      return this.cff.charset.charset;
+    },
+    getGlyphMapping: function CFFFont_getGlyphMapping() {
+      var cff = this.cff;
+      var properties = this.properties;
+      var charsets = cff.charset.charset;
+      var charCodeToGlyphId;
+      var glyphId;
+      if (properties.composite) {
+        charCodeToGlyphId = Object.create(null);
+        if (cff.isCIDFont) {
+          for (glyphId = 0; glyphId < charsets.length; glyphId++) {
+            var cid = charsets[glyphId];
+            var charCode = properties.cMap.charCodeOf(cid);
+            charCodeToGlyphId[charCode] = glyphId;
+          }
+        } else {
+          for (glyphId = 0; glyphId < cff.charStrings.count; glyphId++) {
+            charCodeToGlyphId[glyphId] = glyphId;
+          }
+        }
+        return charCodeToGlyphId;
+      }
+      var encoding = cff.encoding ? cff.encoding.encoding : null;
+      charCodeToGlyphId = type1FontGlyphMapping(properties, encoding, charsets);
+      return charCodeToGlyphId;
+    },
+    hasGlyphId: function CFFFont_hasGlyphID(id) {
+      return this.cff.hasGlyphId(id);
+    }
+  };
+  return CFFFont;
+}();
+exports.SEAC_ANALYSIS_ENABLED = SEAC_ANALYSIS_ENABLED;
+exports.ErrorFont = ErrorFont;
+exports.Font = Font;
+exports.FontFlags = FontFlags;
+exports.ToUnicodeMap = ToUnicodeMap;
+exports.IdentityToUnicodeMap = IdentityToUnicodeMap;
+exports.getFontType = getFontType;
+
+/***/ }),
+/* 157 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.CFFFDSelect = exports.CFFCompiler = exports.CFFPrivateDict = exports.CFFTopDict = exports.CFFCharset = exports.CFFIndex = exports.CFFStrings = exports.CFFHeader = exports.CFF = exports.CFFParser = exports.CFFStandardStrings = undefined;
+
+var _util = __w_pdfjs_require__(2);
+
+var _charsets = __w_pdfjs_require__(158);
+
+var _encodings = __w_pdfjs_require__(159);
+
+var MAX_SUBR_NESTING = 10;
+var CFFStandardStrings = ['.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent', 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency', 'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl', 'periodcentered', 'paragraph', 'bullet', 'quotesinglbase', 'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis', 'perthousand', 'questiondown', 'grave', 'acute', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent', 'dieresis', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron', 'emdash', 'AE', 'ordfeminine', 'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae', 'dotlessi', 'lslash', 'oslash', 'oe', 'germandbls', 'onesuperior', 'logicalnot', 'mu', 'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn', 'onequarter', 'divide', 'brokenbar', 'degree', 'thorn', 'threequarters', 'twosuperior', 'registered', 'minus', 'eth', 'multiply', 'threesuperior', 'copyright', 'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring', 'Atilde', 'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute', 'Ocircumflex', 'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute', 'Ucircumflex', 'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron', 'aacute', 'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde', 'ccedilla', 'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute', 'icircumflex', 'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex', 'odieresis', 'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex', 'udieresis', 'ugrave', 'yacute', 'ydieresis', 'zcaron', 'exclamsmall', 'Hungarumlautsmall', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'commasuperior', 'threequartersemdash', 'periodsuperior', 'questionsmall', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior', 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior', 'tsuperior', 'ff', 'ffi', 'ffl', 'parenleftinferior', 'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall', 'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah', 'Tildesmall', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall', 'Caronsmall', 'Dotaccentsmall', 'Macronsmall', 'figuredash', 'hypheninferior', 'Ogoneksmall', 'Ringsmall', 'Cedillasmall', 'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior', 'commainferior', 'Agravesmall', 'Aacutesmall', 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', 'Aringsmall', 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall', 'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall', 'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall', 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall', 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall', 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall', 'Ydieresissmall', '001.000', '001.001', '001.002', '001.003', 'Black', 'Bold', 'Book', 'Light', 'Medium', 'Regular', 'Roman', 'Semibold'];
+var CFFParser = function CFFParserClosure() {
+  var CharstringValidationData = [null, {
+    id: 'hstem',
+    min: 2,
+    stackClearing: true,
+    stem: true
+  }, null, {
+    id: 'vstem',
+    min: 2,
+    stackClearing: true,
+    stem: true
+  }, {
+    id: 'vmoveto',
+    min: 1,
+    stackClearing: true
+  }, {
+    id: 'rlineto',
+    min: 2,
+    resetStack: true
+  }, {
+    id: 'hlineto',
+    min: 1,
+    resetStack: true
+  }, {
+    id: 'vlineto',
+    min: 1,
+    resetStack: true
+  }, {
+    id: 'rrcurveto',
+    min: 6,
+    resetStack: true
+  }, null, {
+    id: 'callsubr',
+    min: 1,
+    undefStack: true
+  }, {
+    id: 'return',
+    min: 0,
+    undefStack: true
+  }, null, null, {
+    id: 'endchar',
+    min: 0,
+    stackClearing: true
+  }, null, null, null, {
+    id: 'hstemhm',
+    min: 2,
+    stackClearing: true,
+    stem: true
+  }, {
+    id: 'hintmask',
+    min: 0,
+    stackClearing: true
+  }, {
+    id: 'cntrmask',
+    min: 0,
+    stackClearing: true
+  }, {
+    id: 'rmoveto',
+    min: 2,
+    stackClearing: true
+  }, {
+    id: 'hmoveto',
+    min: 1,
+    stackClearing: true
+  }, {
+    id: 'vstemhm',
+    min: 2,
+    stackClearing: true,
+    stem: true
+  }, {
+    id: 'rcurveline',
+    min: 8,
+    resetStack: true
+  }, {
+    id: 'rlinecurve',
+    min: 8,
+    resetStack: true
+  }, {
+    id: 'vvcurveto',
+    min: 4,
+    resetStack: true
+  }, {
+    id: 'hhcurveto',
+    min: 4,
+    resetStack: true
+  }, null, {
+    id: 'callgsubr',
+    min: 1,
+    undefStack: true
+  }, {
+    id: 'vhcurveto',
+    min: 4,
+    resetStack: true
+  }, {
+    id: 'hvcurveto',
+    min: 4,
+    resetStack: true
+  }];
+  var CharstringValidationData12 = [null, null, null, {
+    id: 'and',
+    min: 2,
+    stackDelta: -1
+  }, {
+    id: 'or',
+    min: 2,
+    stackDelta: -1
+  }, {
+    id: 'not',
+    min: 1,
+    stackDelta: 0
+  }, null, null, null, {
+    id: 'abs',
+    min: 1,
+    stackDelta: 0
+  }, {
+    id: 'add',
+    min: 2,
+    stackDelta: -1,
+    stackFn: function stack_div(stack, index) {
+      stack[index - 2] = stack[index - 2] + stack[index - 1];
+    }
+  }, {
+    id: 'sub',
+    min: 2,
+    stackDelta: -1,
+    stackFn: function stack_div(stack, index) {
+      stack[index - 2] = stack[index - 2] - stack[index - 1];
+    }
+  }, {
+    id: 'div',
+    min: 2,
+    stackDelta: -1,
+    stackFn: function stack_div(stack, index) {
+      stack[index - 2] = stack[index - 2] / stack[index - 1];
+    }
+  }, null, {
+    id: 'neg',
+    min: 1,
+    stackDelta: 0,
+    stackFn: function stack_div(stack, index) {
+      stack[index - 1] = -stack[index - 1];
+    }
+  }, {
+    id: 'eq',
+    min: 2,
+    stackDelta: -1
+  }, null, null, {
+    id: 'drop',
+    min: 1,
+    stackDelta: -1
+  }, null, {
+    id: 'put',
+    min: 2,
+    stackDelta: -2
+  }, {
+    id: 'get',
+    min: 1,
+    stackDelta: 0
+  }, {
+    id: 'ifelse',
+    min: 4,
+    stackDelta: -3
+  }, {
+    id: 'random',
+    min: 0,
+    stackDelta: 1
+  }, {
+    id: 'mul',
+    min: 2,
+    stackDelta: -1,
+    stackFn: function stack_div(stack, index) {
+      stack[index - 2] = stack[index - 2] * stack[index - 1];
+    }
+  }, null, {
+    id: 'sqrt',
+    min: 1,
+    stackDelta: 0
+  }, {
+    id: 'dup',
+    min: 1,
+    stackDelta: 1
+  }, {
+    id: 'exch',
+    min: 2,
+    stackDelta: 0
+  }, {
+    id: 'index',
+    min: 2,
+    stackDelta: 0
+  }, {
+    id: 'roll',
+    min: 3,
+    stackDelta: -2
+  }, null, null, null, {
+    id: 'hflex',
+    min: 7,
+    resetStack: true
+  }, {
+    id: 'flex',
+    min: 13,
+    resetStack: true
+  }, {
+    id: 'hflex1',
+    min: 9,
+    resetStack: true
+  }, {
+    id: 'flex1',
+    min: 11,
+    resetStack: true
+  }];
+  function CFFParser(file, properties, seacAnalysisEnabled) {
+    this.bytes = file.getBytes();
+    this.properties = properties;
+    this.seacAnalysisEnabled = !!seacAnalysisEnabled;
+  }
+  CFFParser.prototype = {
+    parse: function CFFParser_parse() {
+      var properties = this.properties;
+      var cff = new CFF();
+      this.cff = cff;
+      var header = this.parseHeader();
+      var nameIndex = this.parseIndex(header.endPos);
+      var topDictIndex = this.parseIndex(nameIndex.endPos);
+      var stringIndex = this.parseIndex(topDictIndex.endPos);
+      var globalSubrIndex = this.parseIndex(stringIndex.endPos);
+      var topDictParsed = this.parseDict(topDictIndex.obj.get(0));
+      var topDict = this.createDict(CFFTopDict, topDictParsed, cff.strings);
+      cff.header = header.obj;
+      cff.names = this.parseNameIndex(nameIndex.obj);
+      cff.strings = this.parseStringIndex(stringIndex.obj);
+      cff.topDict = topDict;
+      cff.globalSubrIndex = globalSubrIndex.obj;
+      this.parsePrivateDict(cff.topDict);
+      cff.isCIDFont = topDict.hasName('ROS');
+      var charStringOffset = topDict.getByName('CharStrings');
+      var charStringIndex = this.parseIndex(charStringOffset).obj;
+      var fontMatrix = topDict.getByName('FontMatrix');
+      if (fontMatrix) {
+        properties.fontMatrix = fontMatrix;
+      }
+      var fontBBox = topDict.getByName('FontBBox');
+      if (fontBBox) {
+        properties.ascent = Math.max(fontBBox[3], fontBBox[1]);
+        properties.descent = Math.min(fontBBox[1], fontBBox[3]);
+        properties.ascentScaled = true;
+      }
+      var charset, encoding;
+      if (cff.isCIDFont) {
+        var fdArrayIndex = this.parseIndex(topDict.getByName('FDArray')).obj;
+        for (var i = 0, ii = fdArrayIndex.count; i < ii; ++i) {
+          var dictRaw = fdArrayIndex.get(i);
+          var fontDict = this.createDict(CFFTopDict, this.parseDict(dictRaw), cff.strings);
+          this.parsePrivateDict(fontDict);
+          cff.fdArray.push(fontDict);
+        }
+        encoding = null;
+        charset = this.parseCharsets(topDict.getByName('charset'), charStringIndex.count, cff.strings, true);
+        cff.fdSelect = this.parseFDSelect(topDict.getByName('FDSelect'), charStringIndex.count);
+      } else {
+        charset = this.parseCharsets(topDict.getByName('charset'), charStringIndex.count, cff.strings, false);
+        encoding = this.parseEncoding(topDict.getByName('Encoding'), properties, cff.strings, charset.charset);
+      }
+      cff.charset = charset;
+      cff.encoding = encoding;
+      var charStringsAndSeacs = this.parseCharStrings({
+        charStrings: charStringIndex,
+        localSubrIndex: topDict.privateDict.subrsIndex,
+        globalSubrIndex: globalSubrIndex.obj,
+        fdSelect: cff.fdSelect,
+        fdArray: cff.fdArray,
+        privateDict: topDict.privateDict
+      });
+      cff.charStrings = charStringsAndSeacs.charStrings;
+      cff.seacs = charStringsAndSeacs.seacs;
+      cff.widths = charStringsAndSeacs.widths;
+      return cff;
+    },
+    parseHeader: function CFFParser_parseHeader() {
+      var bytes = this.bytes;
+      var bytesLength = bytes.length;
+      var offset = 0;
+      while (offset < bytesLength && bytes[offset] !== 1) {
+        ++offset;
+      }
+      if (offset >= bytesLength) {
+        throw new _util.FormatError('Invalid CFF header');
+      }
+      if (offset !== 0) {
+        (0, _util.info)('cff data is shifted');
+        bytes = bytes.subarray(offset);
+        this.bytes = bytes;
+      }
+      var major = bytes[0];
+      var minor = bytes[1];
+      var hdrSize = bytes[2];
+      var offSize = bytes[3];
+      var header = new CFFHeader(major, minor, hdrSize, offSize);
+      return {
+        obj: header,
+        endPos: hdrSize
+      };
+    },
+    parseDict: function CFFParser_parseDict(dict) {
+      var pos = 0;
+      function parseOperand() {
+        var value = dict[pos++];
+        if (value === 30) {
+          return parseFloatOperand();
+        } else if (value === 28) {
+          value = dict[pos++];
+          value = (value << 24 | dict[pos++] << 16) >> 16;
+          return value;
+        } else if (value === 29) {
+          value = dict[pos++];
+          value = value << 8 | dict[pos++];
+          value = value << 8 | dict[pos++];
+          value = value << 8 | dict[pos++];
+          return value;
+        } else if (value >= 32 && value <= 246) {
+          return value - 139;
+        } else if (value >= 247 && value <= 250) {
+          return (value - 247) * 256 + dict[pos++] + 108;
+        } else if (value >= 251 && value <= 254) {
+          return -((value - 251) * 256) - dict[pos++] - 108;
+        }
+        (0, _util.warn)('CFFParser_parseDict: "' + value + '" is a reserved command.');
+        return NaN;
+      }
+      function parseFloatOperand() {
+        var str = '';
+        var eof = 15;
+        var lookup = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', 'E', 'E-', null, '-'];
+        var length = dict.length;
+        while (pos < length) {
+          var b = dict[pos++];
+          var b1 = b >> 4;
+          var b2 = b & 15;
+          if (b1 === eof) {
+            break;
+          }
+          str += lookup[b1];
+          if (b2 === eof) {
+            break;
+          }
+          str += lookup[b2];
+        }
+        return parseFloat(str);
+      }
+      var operands = [];
+      var entries = [];
+      pos = 0;
+      var end = dict.length;
+      while (pos < end) {
+        var b = dict[pos];
+        if (b <= 21) {
+          if (b === 12) {
+            b = b << 8 | dict[++pos];
+          }
+          entries.push([b, operands]);
+          operands = [];
+          ++pos;
+        } else {
+          operands.push(parseOperand());
+        }
+      }
+      return entries;
+    },
+    parseIndex: function CFFParser_parseIndex(pos) {
+      var cffIndex = new CFFIndex();
+      var bytes = this.bytes;
+      var count = bytes[pos++] << 8 | bytes[pos++];
+      var offsets = [];
+      var end = pos;
+      var i, ii;
+      if (count !== 0) {
+        var offsetSize = bytes[pos++];
+        var startPos = pos + (count + 1) * offsetSize - 1;
+        for (i = 0, ii = count + 1; i < ii; ++i) {
+          var offset = 0;
+          for (var j = 0; j < offsetSize; ++j) {
+            offset <<= 8;
+            offset += bytes[pos++];
+          }
+          offsets.push(startPos + offset);
+        }
+        end = offsets[count];
+      }
+      for (i = 0, ii = offsets.length - 1; i < ii; ++i) {
+        var offsetStart = offsets[i];
+        var offsetEnd = offsets[i + 1];
+        cffIndex.add(bytes.subarray(offsetStart, offsetEnd));
+      }
+      return {
+        obj: cffIndex,
+        endPos: end
+      };
+    },
+    parseNameIndex: function CFFParser_parseNameIndex(index) {
+      var names = [];
+      for (var i = 0, ii = index.count; i < ii; ++i) {
+        var name = index.get(i);
+        names.push((0, _util.bytesToString)(name));
+      }
+      return names;
+    },
+    parseStringIndex: function CFFParser_parseStringIndex(index) {
+      var strings = new CFFStrings();
+      for (var i = 0, ii = index.count; i < ii; ++i) {
+        var data = index.get(i);
+        strings.add((0, _util.bytesToString)(data));
+      }
+      return strings;
+    },
+    createDict: function CFFParser_createDict(Type, dict, strings) {
+      var cffDict = new Type(strings);
+      for (var i = 0, ii = dict.length; i < ii; ++i) {
+        var pair = dict[i];
+        var key = pair[0];
+        var value = pair[1];
+        cffDict.setByKey(key, value);
+      }
+      return cffDict;
+    },
+    parseCharString: function CFFParser_parseCharString(state, data, localSubrIndex, globalSubrIndex) {
+      if (!data || state.callDepth > MAX_SUBR_NESTING) {
+        return false;
+      }
+      var stackSize = state.stackSize;
+      var stack = state.stack;
+      var length = data.length;
+      for (var j = 0; j < length;) {
+        var value = data[j++];
+        var validationCommand = null;
+        if (value === 12) {
+          var q = data[j++];
+          if (q === 0) {
+            data[j - 2] = 139;
+            data[j - 1] = 22;
+            stackSize = 0;
+          } else {
+            validationCommand = CharstringValidationData12[q];
+          }
+        } else if (value === 28) {
+          stack[stackSize] = (data[j] << 24 | data[j + 1] << 16) >> 16;
+          j += 2;
+          stackSize++;
+        } else if (value === 14) {
+          if (stackSize >= 4) {
+            stackSize -= 4;
+            if (this.seacAnalysisEnabled) {
+              state.seac = stack.slice(stackSize, stackSize + 4);
+              return false;
+            }
+          }
+          validationCommand = CharstringValidationData[value];
+        } else if (value >= 32 && value <= 246) {
+          stack[stackSize] = value - 139;
+          stackSize++;
+        } else if (value >= 247 && value <= 254) {
+          stack[stackSize] = value < 251 ? (value - 247 << 8) + data[j] + 108 : -(value - 251 << 8) - data[j] - 108;
+          j++;
+          stackSize++;
+        } else if (value === 255) {
+          stack[stackSize] = (data[j] << 24 | data[j + 1] << 16 | data[j + 2] << 8 | data[j + 3]) / 65536;
+          j += 4;
+          stackSize++;
+        } else if (value === 19 || value === 20) {
+          state.hints += stackSize >> 1;
+          j += state.hints + 7 >> 3;
+          stackSize %= 2;
+          validationCommand = CharstringValidationData[value];
+        } else if (value === 10 || value === 29) {
+          var subrsIndex;
+          if (value === 10) {
+            subrsIndex = localSubrIndex;
+          } else {
+            subrsIndex = globalSubrIndex;
+          }
+          if (!subrsIndex) {
+            validationCommand = CharstringValidationData[value];
+            (0, _util.warn)('Missing subrsIndex for ' + validationCommand.id);
+            return false;
+          }
+          var bias = 32768;
+          if (subrsIndex.count < 1240) {
+            bias = 107;
+          } else if (subrsIndex.count < 33900) {
+            bias = 1131;
+          }
+          var subrNumber = stack[--stackSize] + bias;
+          if (subrNumber < 0 || subrNumber >= subrsIndex.count || isNaN(subrNumber)) {
+            validationCommand = CharstringValidationData[value];
+            (0, _util.warn)('Out of bounds subrIndex for ' + validationCommand.id);
+            return false;
+          }
+          state.stackSize = stackSize;
+          state.callDepth++;
+          var valid = this.parseCharString(state, subrsIndex.get(subrNumber), localSubrIndex, globalSubrIndex);
+          if (!valid) {
+            return false;
+          }
+          state.callDepth--;
+          stackSize = state.stackSize;
+          continue;
+        } else if (value === 11) {
+          state.stackSize = stackSize;
+          return true;
+        } else {
+          validationCommand = CharstringValidationData[value];
+        }
+        if (validationCommand) {
+          if (validationCommand.stem) {
+            state.hints += stackSize >> 1;
+          }
+          if ('min' in validationCommand) {
+            if (!state.undefStack && stackSize < validationCommand.min) {
+              (0, _util.warn)('Not enough parameters for ' + validationCommand.id + '; actual: ' + stackSize + ', expected: ' + validationCommand.min);
+              return false;
+            }
+          }
+          if (state.firstStackClearing && validationCommand.stackClearing) {
+            state.firstStackClearing = false;
+            stackSize -= validationCommand.min;
+            if (stackSize >= 2 && validationCommand.stem) {
+              stackSize %= 2;
+            } else if (stackSize > 1) {
+              (0, _util.warn)('Found too many parameters for stack-clearing command');
+            }
+            if (stackSize > 0 && stack[stackSize - 1] >= 0) {
+              state.width = stack[stackSize - 1];
+            }
+          }
+          if ('stackDelta' in validationCommand) {
+            if ('stackFn' in validationCommand) {
+              validationCommand.stackFn(stack, stackSize);
+            }
+            stackSize += validationCommand.stackDelta;
+          } else if (validationCommand.stackClearing) {
+            stackSize = 0;
+          } else if (validationCommand.resetStack) {
+            stackSize = 0;
+            state.undefStack = false;
+          } else if (validationCommand.undefStack) {
+            stackSize = 0;
+            state.undefStack = true;
+            state.firstStackClearing = false;
+          }
+        }
+      }
+      state.stackSize = stackSize;
+      return true;
+    },
+    parseCharStrings: function parseCharStrings(_ref) {
+      var charStrings = _ref.charStrings,
+          localSubrIndex = _ref.localSubrIndex,
+          globalSubrIndex = _ref.globalSubrIndex,
+          fdSelect = _ref.fdSelect,
+          fdArray = _ref.fdArray,
+          privateDict = _ref.privateDict;
+
+      var seacs = [];
+      var widths = [];
+      var count = charStrings.count;
+      for (var i = 0; i < count; i++) {
+        var charstring = charStrings.get(i);
+        var state = {
+          callDepth: 0,
+          stackSize: 0,
+          stack: [],
+          undefStack: true,
+          hints: 0,
+          firstStackClearing: true,
+          seac: null,
+          width: null
+        };
+        var valid = true;
+        var localSubrToUse = null;
+        var privateDictToUse = privateDict;
+        if (fdSelect && fdArray.length) {
+          var fdIndex = fdSelect.getFDIndex(i);
+          if (fdIndex === -1) {
+            (0, _util.warn)('Glyph index is not in fd select.');
+            valid = false;
+          }
+          if (fdIndex >= fdArray.length) {
+            (0, _util.warn)('Invalid fd index for glyph index.');
+            valid = false;
+          }
+          if (valid) {
+            privateDictToUse = fdArray[fdIndex].privateDict;
+            localSubrToUse = privateDictToUse.subrsIndex;
+          }
+        } else if (localSubrIndex) {
+          localSubrToUse = localSubrIndex;
+        }
+        if (valid) {
+          valid = this.parseCharString(state, charstring, localSubrToUse, globalSubrIndex);
+        }
+        if (state.width !== null) {
+          var nominalWidth = privateDictToUse.getByName('nominalWidthX');
+          widths[i] = nominalWidth + state.width;
+        } else {
+          var defaultWidth = privateDictToUse.getByName('defaultWidthX');
+          widths[i] = defaultWidth;
+        }
+        if (state.seac !== null) {
+          seacs[i] = state.seac;
+        }
+        if (!valid) {
+          charStrings.set(i, new Uint8Array([14]));
+        }
+      }
+      return {
+        charStrings: charStrings,
+        seacs: seacs,
+        widths: widths
+      };
+    },
+
+    emptyPrivateDictionary: function CFFParser_emptyPrivateDictionary(parentDict) {
+      var privateDict = this.createDict(CFFPrivateDict, [], parentDict.strings);
+      parentDict.setByKey(18, [0, 0]);
+      parentDict.privateDict = privateDict;
+    },
+    parsePrivateDict: function CFFParser_parsePrivateDict(parentDict) {
+      if (!parentDict.hasName('Private')) {
+        this.emptyPrivateDictionary(parentDict);
+        return;
+      }
+      var privateOffset = parentDict.getByName('Private');
+      if (!Array.isArray(privateOffset) || privateOffset.length !== 2) {
+        parentDict.removeByName('Private');
+        return;
+      }
+      var size = privateOffset[0];
+      var offset = privateOffset[1];
+      if (size === 0 || offset >= this.bytes.length) {
+        this.emptyPrivateDictionary(parentDict);
+        return;
+      }
+      var privateDictEnd = offset + size;
+      var dictData = this.bytes.subarray(offset, privateDictEnd);
+      var dict = this.parseDict(dictData);
+      var privateDict = this.createDict(CFFPrivateDict, dict, parentDict.strings);
+      parentDict.privateDict = privateDict;
+      if (!privateDict.getByName('Subrs')) {
+        return;
+      }
+      var subrsOffset = privateDict.getByName('Subrs');
+      var relativeOffset = offset + subrsOffset;
+      if (subrsOffset === 0 || relativeOffset >= this.bytes.length) {
+        this.emptyPrivateDictionary(parentDict);
+        return;
+      }
+      var subrsIndex = this.parseIndex(relativeOffset);
+      privateDict.subrsIndex = subrsIndex.obj;
+    },
+    parseCharsets: function CFFParser_parseCharsets(pos, length, strings, cid) {
+      if (pos === 0) {
+        return new CFFCharset(true, CFFCharsetPredefinedTypes.ISO_ADOBE, _charsets.ISOAdobeCharset);
+      } else if (pos === 1) {
+        return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT, _charsets.ExpertCharset);
+      } else if (pos === 2) {
+        return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT_SUBSET, _charsets.ExpertSubsetCharset);
+      }
+      var bytes = this.bytes;
+      var start = pos;
+      var format = bytes[pos++];
+      var charset = ['.notdef'];
+      var id, count, i;
+      length -= 1;
+      switch (format) {
+        case 0:
+          for (i = 0; i < length; i++) {
+            id = bytes[pos++] << 8 | bytes[pos++];
+            charset.push(cid ? id : strings.get(id));
+          }
+          break;
+        case 1:
+          while (charset.length <= length) {
+            id = bytes[pos++] << 8 | bytes[pos++];
+            count = bytes[pos++];
+            for (i = 0; i <= count; i++) {
+              charset.push(cid ? id++ : strings.get(id++));
+            }
+          }
+          break;
+        case 2:
+          while (charset.length <= length) {
+            id = bytes[pos++] << 8 | bytes[pos++];
+            count = bytes[pos++] << 8 | bytes[pos++];
+            for (i = 0; i <= count; i++) {
+              charset.push(cid ? id++ : strings.get(id++));
+            }
+          }
+          break;
+        default:
+          throw new _util.FormatError('Unknown charset format');
+      }
+      var end = pos;
+      var raw = bytes.subarray(start, end);
+      return new CFFCharset(false, format, charset, raw);
+    },
+    parseEncoding: function CFFParser_parseEncoding(pos, properties, strings, charset) {
+      var encoding = Object.create(null);
+      var bytes = this.bytes;
+      var predefined = false;
+      var format, i, ii;
+      var raw = null;
+      function readSupplement() {
+        var supplementsCount = bytes[pos++];
+        for (i = 0; i < supplementsCount; i++) {
+          var code = bytes[pos++];
+          var sid = (bytes[pos++] << 8) + (bytes[pos++] & 0xff);
+          encoding[code] = charset.indexOf(strings.get(sid));
+        }
+      }
+      if (pos === 0 || pos === 1) {
+        predefined = true;
+        format = pos;
+        var baseEncoding = pos ? _encodings.ExpertEncoding : _encodings.StandardEncoding;
+        for (i = 0, ii = charset.length; i < ii; i++) {
+          var index = baseEncoding.indexOf(charset[i]);
+          if (index !== -1) {
+            encoding[index] = i;
+          }
+        }
+      } else {
+        var dataStart = pos;
+        format = bytes[pos++];
+        switch (format & 0x7f) {
+          case 0:
+            var glyphsCount = bytes[pos++];
+            for (i = 1; i <= glyphsCount; i++) {
+              encoding[bytes[pos++]] = i;
+            }
+            break;
+          case 1:
+            var rangesCount = bytes[pos++];
+            var gid = 1;
+            for (i = 0; i < rangesCount; i++) {
+              var start = bytes[pos++];
+              var left = bytes[pos++];
+              for (var j = start; j <= start + left; j++) {
+                encoding[j] = gid++;
+              }
+            }
+            break;
+          default:
+            throw new _util.FormatError('Unknown encoding format: ' + format + ' in CFF');
+        }
+        var dataEnd = pos;
+        if (format & 0x80) {
+          bytes[dataStart] &= 0x7f;
+          readSupplement();
+        }
+        raw = bytes.subarray(dataStart, dataEnd);
+      }
+      format = format & 0x7f;
+      return new CFFEncoding(predefined, format, encoding, raw);
+    },
+    parseFDSelect: function CFFParser_parseFDSelect(pos, length) {
+      var bytes = this.bytes;
+      var format = bytes[pos++];
+      var fdSelect = [];
+      var i;
+      switch (format) {
+        case 0:
+          for (i = 0; i < length; ++i) {
+            var id = bytes[pos++];
+            fdSelect.push(id);
+          }
+          break;
+        case 3:
+          var rangesCount = bytes[pos++] << 8 | bytes[pos++];
+          for (i = 0; i < rangesCount; ++i) {
+            var first = bytes[pos++] << 8 | bytes[pos++];
+            if (i === 0 && first !== 0) {
+              (0, _util.warn)('parseFDSelect: The first range must have a first GID of 0' + ' -- trying to recover.');
+              first = 0;
+            }
+            var fdIndex = bytes[pos++];
+            var next = bytes[pos] << 8 | bytes[pos + 1];
+            for (var j = first; j < next; ++j) {
+              fdSelect.push(fdIndex);
+            }
+          }
+          pos += 2;
+          break;
+        default:
+          throw new _util.FormatError('parseFDSelect: Unknown format "' + format + '".');
+      }
+      if (fdSelect.length !== length) {
+        throw new _util.FormatError('parseFDSelect: Invalid font data.');
+      }
+      return new CFFFDSelect(format, fdSelect);
+    }
+  };
+  return CFFParser;
+}();
+var CFF = function CFFClosure() {
+  function CFF() {
+    this.header = null;
+    this.names = [];
+    this.topDict = null;
+    this.strings = new CFFStrings();
+    this.globalSubrIndex = null;
+    this.encoding = null;
+    this.charset = null;
+    this.charStrings = null;
+    this.fdArray = [];
+    this.fdSelect = null;
+    this.isCIDFont = false;
+  }
+  CFF.prototype = {
+    duplicateFirstGlyph: function CFF_duplicateFirstGlyph() {
+      if (this.charStrings.count >= 65535) {
+        (0, _util.warn)('Not enough space in charstrings to duplicate first glyph.');
+        return;
+      }
+      var glyphZero = this.charStrings.get(0);
+      this.charStrings.add(glyphZero);
+      if (this.isCIDFont) {
+        this.fdSelect.fdSelect.push(this.fdSelect.fdSelect[0]);
+      }
+    },
+    hasGlyphId: function CFF_hasGlyphID(id) {
+      if (id < 0 || id >= this.charStrings.count) {
+        return false;
+      }
+      var glyph = this.charStrings.get(id);
+      return glyph.length > 0;
+    }
+  };
+  return CFF;
+}();
+var CFFHeader = function CFFHeaderClosure() {
+  function CFFHeader(major, minor, hdrSize, offSize) {
+    this.major = major;
+    this.minor = minor;
+    this.hdrSize = hdrSize;
+    this.offSize = offSize;
+  }
+  return CFFHeader;
+}();
+var CFFStrings = function CFFStringsClosure() {
+  function CFFStrings() {
+    this.strings = [];
+  }
+  CFFStrings.prototype = {
+    get: function CFFStrings_get(index) {
+      if (index >= 0 && index <= 390) {
+        return CFFStandardStrings[index];
+      }
+      if (index - 391 <= this.strings.length) {
+        return this.strings[index - 391];
+      }
+      return CFFStandardStrings[0];
+    },
+    add: function CFFStrings_add(value) {
+      this.strings.push(value);
+    },
+    get count() {
+      return this.strings.length;
+    }
+  };
+  return CFFStrings;
+}();
+var CFFIndex = function CFFIndexClosure() {
+  function CFFIndex() {
+    this.objects = [];
+    this.length = 0;
+  }
+  CFFIndex.prototype = {
+    add: function CFFIndex_add(data) {
+      this.length += data.length;
+      this.objects.push(data);
+    },
+    set: function CFFIndex_set(index, data) {
+      this.length += data.length - this.objects[index].length;
+      this.objects[index] = data;
+    },
+    get: function CFFIndex_get(index) {
+      return this.objects[index];
+    },
+    get count() {
+      return this.objects.length;
+    }
+  };
+  return CFFIndex;
+}();
+var CFFDict = function CFFDictClosure() {
+  function CFFDict(tables, strings) {
+    this.keyToNameMap = tables.keyToNameMap;
+    this.nameToKeyMap = tables.nameToKeyMap;
+    this.defaults = tables.defaults;
+    this.types = tables.types;
+    this.opcodes = tables.opcodes;
+    this.order = tables.order;
+    this.strings = strings;
+    this.values = Object.create(null);
+  }
+  CFFDict.prototype = {
+    setByKey: function CFFDict_setByKey(key, value) {
+      if (!(key in this.keyToNameMap)) {
+        return false;
+      }
+      var valueLength = value.length;
+      if (valueLength === 0) {
+        return true;
+      }
+      for (var i = 0; i < valueLength; i++) {
+        if (isNaN(value[i])) {
+          (0, _util.warn)('Invalid CFFDict value: "' + value + '" for key "' + key + '".');
+          return true;
+        }
+      }
+      var type = this.types[key];
+      if (type === 'num' || type === 'sid' || type === 'offset') {
+        value = value[0];
+      }
+      this.values[key] = value;
+      return true;
+    },
+    setByName: function CFFDict_setByName(name, value) {
+      if (!(name in this.nameToKeyMap)) {
+        throw new _util.FormatError('Invalid dictionary name "' + name + '"');
+      }
+      this.values[this.nameToKeyMap[name]] = value;
+    },
+    hasName: function CFFDict_hasName(name) {
+      return this.nameToKeyMap[name] in this.values;
+    },
+    getByName: function CFFDict_getByName(name) {
+      if (!(name in this.nameToKeyMap)) {
+        throw new _util.FormatError('Invalid dictionary name ' + name + '"');
+      }
+      var key = this.nameToKeyMap[name];
+      if (!(key in this.values)) {
+        return this.defaults[key];
+      }
+      return this.values[key];
+    },
+    removeByName: function CFFDict_removeByName(name) {
+      delete this.values[this.nameToKeyMap[name]];
+    }
+  };
+  CFFDict.createTables = function CFFDict_createTables(layout) {
+    var tables = {
+      keyToNameMap: {},
+      nameToKeyMap: {},
+      defaults: {},
+      types: {},
+      opcodes: {},
+      order: []
+    };
+    for (var i = 0, ii = layout.length; i < ii; ++i) {
+      var entry = layout[i];
+      var key = Array.isArray(entry[0]) ? (entry[0][0] << 8) + entry[0][1] : entry[0];
+      tables.keyToNameMap[key] = entry[1];
+      tables.nameToKeyMap[entry[1]] = key;
+      tables.types[key] = entry[2];
+      tables.defaults[key] = entry[3];
+      tables.opcodes[key] = Array.isArray(entry[0]) ? entry[0] : [entry[0]];
+      tables.order.push(key);
+    }
+    return tables;
+  };
+  return CFFDict;
+}();
+var CFFTopDict = function CFFTopDictClosure() {
+  var layout = [[[12, 30], 'ROS', ['sid', 'sid', 'num'], null], [[12, 20], 'SyntheticBase', 'num', null], [0, 'version', 'sid', null], [1, 'Notice', 'sid', null], [[12, 0], 'Copyright', 'sid', null], [2, 'FullName', 'sid', null], [3, 'FamilyName', 'sid', null], [4, 'Weight', 'sid', null], [[12, 1], 'isFixedPitch', 'num', 0], [[12, 2], 'ItalicAngle', 'num', 0], [[12, 3], 'UnderlinePosition', 'num', -100], [[12, 4], 'UnderlineThickness', 'num', 50], [[12, 5], 'PaintType', 'num', 0], [[12, 6], 'CharstringType', 'num', 2], [[12, 7], 'FontMatrix', ['num', 'num', 'num', 'num', 'num', 'num'], [0.001, 0, 0, 0.001, 0, 0]], [13, 'UniqueID', 'num', null], [5, 'FontBBox', ['num', 'num', 'num', 'num'], [0, 0, 0, 0]], [[12, 8], 'StrokeWidth', 'num', 0], [14, 'XUID', 'array', null], [15, 'charset', 'offset', 0], [16, 'Encoding', 'offset', 0], [17, 'CharStrings', 'offset', 0], [18, 'Private', ['offset', 'offset'], null], [[12, 21], 'PostScript', 'sid', null], [[12, 22], 'BaseFontName', 'sid', null], [[12, 23], 'BaseFontBlend', 'delta', null], [[12, 31], 'CIDFontVersion', 'num', 0], [[12, 32], 'CIDFontRevision', 'num', 0], [[12, 33], 'CIDFontType', 'num', 0], [[12, 34], 'CIDCount', 'num', 8720], [[12, 35], 'UIDBase', 'num', null], [[12, 37], 'FDSelect', 'offset', null], [[12, 36], 'FDArray', 'offset', null], [[12, 38], 'FontName', 'sid', null]];
+  var tables = null;
+  function CFFTopDict(strings) {
+    if (tables === null) {
+      tables = CFFDict.createTables(layout);
+    }
+    CFFDict.call(this, tables, strings);
+    this.privateDict = null;
+  }
+  CFFTopDict.prototype = Object.create(CFFDict.prototype);
+  return CFFTopDict;
+}();
+var CFFPrivateDict = function CFFPrivateDictClosure() {
+  var layout = [[6, 'BlueValues', 'delta', null], [7, 'OtherBlues', 'delta', null], [8, 'FamilyBlues', 'delta', null], [9, 'FamilyOtherBlues', 'delta', null], [[12, 9], 'BlueScale', 'num', 0.039625], [[12, 10], 'BlueShift', 'num', 7], [[12, 11], 'BlueFuzz', 'num', 1], [10, 'StdHW', 'num', null], [11, 'StdVW', 'num', null], [[12, 12], 'StemSnapH', 'delta', null], [[12, 13], 'StemSnapV', 'delta', null], [[12, 14], 'ForceBold', 'num', 0], [[12, 17], 'LanguageGroup', 'num', 0], [[12, 18], 'ExpansionFactor', 'num', 0.06], [[12, 19], 'initialRandomSeed', 'num', 0], [20, 'defaultWidthX', 'num', 0], [21, 'nominalWidthX', 'num', 0], [19, 'Subrs', 'offset', null]];
+  var tables = null;
+  function CFFPrivateDict(strings) {
+    if (tables === null) {
+      tables = CFFDict.createTables(layout);
+    }
+    CFFDict.call(this, tables, strings);
+    this.subrsIndex = null;
+  }
+  CFFPrivateDict.prototype = Object.create(CFFDict.prototype);
+  return CFFPrivateDict;
+}();
+var CFFCharsetPredefinedTypes = {
+  ISO_ADOBE: 0,
+  EXPERT: 1,
+  EXPERT_SUBSET: 2
+};
+var CFFCharset = function CFFCharsetClosure() {
+  function CFFCharset(predefined, format, charset, raw) {
+    this.predefined = predefined;
+    this.format = format;
+    this.charset = charset;
+    this.raw = raw;
+  }
+  return CFFCharset;
+}();
+var CFFEncoding = function CFFEncodingClosure() {
+  function CFFEncoding(predefined, format, encoding, raw) {
+    this.predefined = predefined;
+    this.format = format;
+    this.encoding = encoding;
+    this.raw = raw;
+  }
+  return CFFEncoding;
+}();
+var CFFFDSelect = function CFFFDSelectClosure() {
+  function CFFFDSelect(format, fdSelect) {
+    this.format = format;
+    this.fdSelect = fdSelect;
+  }
+  CFFFDSelect.prototype = {
+    getFDIndex: function CFFFDSelect_get(glyphIndex) {
+      if (glyphIndex < 0 || glyphIndex >= this.fdSelect.length) {
+        return -1;
+      }
+      return this.fdSelect[glyphIndex];
+    }
+  };
+  return CFFFDSelect;
+}();
+var CFFOffsetTracker = function CFFOffsetTrackerClosure() {
+  function CFFOffsetTracker() {
+    this.offsets = Object.create(null);
+  }
+  CFFOffsetTracker.prototype = {
+    isTracking: function CFFOffsetTracker_isTracking(key) {
+      return key in this.offsets;
+    },
+    track: function CFFOffsetTracker_track(key, location) {
+      if (key in this.offsets) {
+        throw new _util.FormatError('Already tracking location of ' + key);
+      }
+      this.offsets[key] = location;
+    },
+    offset: function CFFOffsetTracker_offset(value) {
+      for (var key in this.offsets) {
+        this.offsets[key] += value;
+      }
+    },
+    setEntryLocation: function CFFOffsetTracker_setEntryLocation(key, values, output) {
+      if (!(key in this.offsets)) {
+        throw new _util.FormatError('Not tracking location of ' + key);
+      }
+      var data = output.data;
+      var dataOffset = this.offsets[key];
+      var size = 5;
+      for (var i = 0, ii = values.length; i < ii; ++i) {
+        var offset0 = i * size + dataOffset;
+        var offset1 = offset0 + 1;
+        var offset2 = offset0 + 2;
+        var offset3 = offset0 + 3;
+        var offset4 = offset0 + 4;
+        if (data[offset0] !== 0x1d || data[offset1] !== 0 || data[offset2] !== 0 || data[offset3] !== 0 || data[offset4] !== 0) {
+          throw new _util.FormatError('writing to an offset that is not empty');
+        }
+        var value = values[i];
+        data[offset0] = 0x1d;
+        data[offset1] = value >> 24 & 0xFF;
+        data[offset2] = value >> 16 & 0xFF;
+        data[offset3] = value >> 8 & 0xFF;
+        data[offset4] = value & 0xFF;
+      }
+    }
+  };
+  return CFFOffsetTracker;
+}();
+var CFFCompiler = function CFFCompilerClosure() {
+  function CFFCompiler(cff) {
+    this.cff = cff;
+  }
+  CFFCompiler.prototype = {
+    compile: function CFFCompiler_compile() {
+      var cff = this.cff;
+      var output = {
+        data: [],
+        length: 0,
+        add: function CFFCompiler_add(data) {
+          this.data = this.data.concat(data);
+          this.length = this.data.length;
+        }
+      };
+      var header = this.compileHeader(cff.header);
+      output.add(header);
+      var nameIndex = this.compileNameIndex(cff.names);
+      output.add(nameIndex);
+      if (cff.isCIDFont) {
+        if (cff.topDict.hasName('FontMatrix')) {
+          var base = cff.topDict.getByName('FontMatrix');
+          cff.topDict.removeByName('FontMatrix');
+          for (var i = 0, ii = cff.fdArray.length; i < ii; i++) {
+            var subDict = cff.fdArray[i];
+            var matrix = base.slice(0);
+            if (subDict.hasName('FontMatrix')) {
+              matrix = _util.Util.transform(matrix, subDict.getByName('FontMatrix'));
+            }
+            subDict.setByName('FontMatrix', matrix);
+          }
+        }
+      }
+      cff.topDict.setByName('charset', 0);
+      var compiled = this.compileTopDicts([cff.topDict], output.length, cff.isCIDFont);
+      output.add(compiled.output);
+      var topDictTracker = compiled.trackers[0];
+      var stringIndex = this.compileStringIndex(cff.strings.strings);
+      output.add(stringIndex);
+      var globalSubrIndex = this.compileIndex(cff.globalSubrIndex);
+      output.add(globalSubrIndex);
+      if (cff.encoding && cff.topDict.hasName('Encoding')) {
+        if (cff.encoding.predefined) {
+          topDictTracker.setEntryLocation('Encoding', [cff.encoding.format], output);
+        } else {
+          var encoding = this.compileEncoding(cff.encoding);
+          topDictTracker.setEntryLocation('Encoding', [output.length], output);
+          output.add(encoding);
+        }
+      }
+      var charset = this.compileCharset(cff.charset);
+      topDictTracker.setEntryLocation('charset', [output.length], output);
+      output.add(charset);
+      var charStrings = this.compileCharStrings(cff.charStrings);
+      topDictTracker.setEntryLocation('CharStrings', [output.length], output);
+      output.add(charStrings);
+      if (cff.isCIDFont) {
+        topDictTracker.setEntryLocation('FDSelect', [output.length], output);
+        var fdSelect = this.compileFDSelect(cff.fdSelect);
+        output.add(fdSelect);
+        compiled = this.compileTopDicts(cff.fdArray, output.length, true);
+        topDictTracker.setEntryLocation('FDArray', [output.length], output);
+        output.add(compiled.output);
+        var fontDictTrackers = compiled.trackers;
+        this.compilePrivateDicts(cff.fdArray, fontDictTrackers, output);
+      }
+      this.compilePrivateDicts([cff.topDict], [topDictTracker], output);
+      output.add([0]);
+      return output.data;
+    },
+    encodeNumber: function CFFCompiler_encodeNumber(value) {
+      if (parseFloat(value) === parseInt(value, 10) && !isNaN(value)) {
+        return this.encodeInteger(value);
+      }
+      return this.encodeFloat(value);
+    },
+    encodeFloat: function CFFCompiler_encodeFloat(num) {
+      var value = num.toString();
+      var m = /\.(\d*?)(?:9{5,20}|0{5,20})\d{0,2}(?:e(.+)|$)/.exec(value);
+      if (m) {
+        var epsilon = parseFloat('1e' + ((m[2] ? +m[2] : 0) + m[1].length));
+        value = (Math.round(num * epsilon) / epsilon).toString();
+      }
+      var nibbles = '';
+      var i, ii;
+      for (i = 0, ii = value.length; i < ii; ++i) {
+        var a = value[i];
+        if (a === 'e') {
+          nibbles += value[++i] === '-' ? 'c' : 'b';
+        } else if (a === '.') {
+          nibbles += 'a';
+        } else if (a === '-') {
+          nibbles += 'e';
+        } else {
+          nibbles += a;
+        }
+      }
+      nibbles += nibbles.length & 1 ? 'f' : 'ff';
+      var out = [30];
+      for (i = 0, ii = nibbles.length; i < ii; i += 2) {
+        out.push(parseInt(nibbles.substring(i, i + 2), 16));
+      }
+      return out;
+    },
+    encodeInteger: function CFFCompiler_encodeInteger(value) {
+      var code;
+      if (value >= -107 && value <= 107) {
+        code = [value + 139];
+      } else if (value >= 108 && value <= 1131) {
+        value = value - 108;
+        code = [(value >> 8) + 247, value & 0xFF];
+      } else if (value >= -1131 && value <= -108) {
+        value = -value - 108;
+        code = [(value >> 8) + 251, value & 0xFF];
+      } else if (value >= -32768 && value <= 32767) {
+        code = [0x1c, value >> 8 & 0xFF, value & 0xFF];
+      } else {
+        code = [0x1d, value >> 24 & 0xFF, value >> 16 & 0xFF, value >> 8 & 0xFF, value & 0xFF];
+      }
+      return code;
+    },
+    compileHeader: function CFFCompiler_compileHeader(header) {
+      return [header.major, header.minor, header.hdrSize, header.offSize];
+    },
+    compileNameIndex: function CFFCompiler_compileNameIndex(names) {
+      var nameIndex = new CFFIndex();
+      for (var i = 0, ii = names.length; i < ii; ++i) {
+        var name = names[i];
+        var length = Math.min(name.length, 127);
+        var sanitizedName = new Array(length);
+        for (var j = 0; j < length; j++) {
+          var char = name[j];
+          if (char < '!' || char > '~' || char === '[' || char === ']' || char === '(' || char === ')' || char === '{' || char === '}' || char === '<' || char === '>' || char === '/' || char === '%') {
+            char = '_';
+          }
+          sanitizedName[j] = char;
+        }
+        sanitizedName = sanitizedName.join('');
+        if (sanitizedName === '') {
+          sanitizedName = 'Bad_Font_Name';
+        }
+        nameIndex.add((0, _util.stringToBytes)(sanitizedName));
+      }
+      return this.compileIndex(nameIndex);
+    },
+    compileTopDicts: function CFFCompiler_compileTopDicts(dicts, length, removeCidKeys) {
+      var fontDictTrackers = [];
+      var fdArrayIndex = new CFFIndex();
+      for (var i = 0, ii = dicts.length; i < ii; ++i) {
+        var fontDict = dicts[i];
+        if (removeCidKeys) {
+          fontDict.removeByName('CIDFontVersion');
+          fontDict.removeByName('CIDFontRevision');
+          fontDict.removeByName('CIDFontType');
+          fontDict.removeByName('CIDCount');
+          fontDict.removeByName('UIDBase');
+        }
+        var fontDictTracker = new CFFOffsetTracker();
+        var fontDictData = this.compileDict(fontDict, fontDictTracker);
+        fontDictTrackers.push(fontDictTracker);
+        fdArrayIndex.add(fontDictData);
+        fontDictTracker.offset(length);
+      }
+      fdArrayIndex = this.compileIndex(fdArrayIndex, fontDictTrackers);
+      return {
+        trackers: fontDictTrackers,
+        output: fdArrayIndex
+      };
+    },
+    compilePrivateDicts: function CFFCompiler_compilePrivateDicts(dicts, trackers, output) {
+      for (var i = 0, ii = dicts.length; i < ii; ++i) {
+        var fontDict = dicts[i];
+        var privateDict = fontDict.privateDict;
+        if (!privateDict || !fontDict.hasName('Private')) {
+          throw new _util.FormatError('There must be a private dictionary.');
+        }
+        var privateDictTracker = new CFFOffsetTracker();
+        var privateDictData = this.compileDict(privateDict, privateDictTracker);
+        var outputLength = output.length;
+        privateDictTracker.offset(outputLength);
+        if (!privateDictData.length) {
+          outputLength = 0;
+        }
+        trackers[i].setEntryLocation('Private', [privateDictData.length, outputLength], output);
+        output.add(privateDictData);
+        if (privateDict.subrsIndex && privateDict.hasName('Subrs')) {
+          var subrs = this.compileIndex(privateDict.subrsIndex);
+          privateDictTracker.setEntryLocation('Subrs', [privateDictData.length], output);
+          output.add(subrs);
+        }
+      }
+    },
+    compileDict: function CFFCompiler_compileDict(dict, offsetTracker) {
+      var out = [];
+      var order = dict.order;
+      for (var i = 0; i < order.length; ++i) {
+        var key = order[i];
+        if (!(key in dict.values)) {
+          continue;
+        }
+        var values = dict.values[key];
+        var types = dict.types[key];
+        if (!Array.isArray(types)) {
+          types = [types];
+        }
+        if (!Array.isArray(values)) {
+          values = [values];
+        }
+        if (values.length === 0) {
+          continue;
+        }
+        for (var j = 0, jj = types.length; j < jj; ++j) {
+          var type = types[j];
+          var value = values[j];
+          switch (type) {
+            case 'num':
+            case 'sid':
+              out = out.concat(this.encodeNumber(value));
+              break;
+            case 'offset':
+              var name = dict.keyToNameMap[key];
+              if (!offsetTracker.isTracking(name)) {
+                offsetTracker.track(name, out.length);
+              }
+              out = out.concat([0x1d, 0, 0, 0, 0]);
+              break;
+            case 'array':
+            case 'delta':
+              out = out.concat(this.encodeNumber(value));
+              for (var k = 1, kk = values.length; k < kk; ++k) {
+                out = out.concat(this.encodeNumber(values[k]));
+              }
+              break;
+            default:
+              throw new _util.FormatError('Unknown data type of ' + type);
+          }
+        }
+        out = out.concat(dict.opcodes[key]);
+      }
+      return out;
+    },
+    compileStringIndex: function CFFCompiler_compileStringIndex(strings) {
+      var stringIndex = new CFFIndex();
+      for (var i = 0, ii = strings.length; i < ii; ++i) {
+        stringIndex.add((0, _util.stringToBytes)(strings[i]));
+      }
+      return this.compileIndex(stringIndex);
+    },
+    compileGlobalSubrIndex: function CFFCompiler_compileGlobalSubrIndex() {
+      var globalSubrIndex = this.cff.globalSubrIndex;
+      this.out.writeByteArray(this.compileIndex(globalSubrIndex));
+    },
+    compileCharStrings: function CFFCompiler_compileCharStrings(charStrings) {
+      var charStringsIndex = new CFFIndex();
+      for (var i = 0; i < charStrings.count; i++) {
+        var glyph = charStrings.get(i);
+        if (glyph.length === 0) {
+          charStringsIndex.add(new Uint8Array([0x8B, 0x0E]));
+          continue;
+        }
+        charStringsIndex.add(glyph);
+      }
+      return this.compileIndex(charStringsIndex);
+    },
+    compileCharset: function CFFCompiler_compileCharset(charset) {
+      var length = 1 + (this.cff.charStrings.count - 1) * 2;
+      var out = new Uint8Array(length);
+      return this.compileTypedArray(out);
+    },
+    compileEncoding: function CFFCompiler_compileEncoding(encoding) {
+      return this.compileTypedArray(encoding.raw);
+    },
+    compileFDSelect: function CFFCompiler_compileFDSelect(fdSelect) {
+      var format = fdSelect.format;
+      var out = void 0,
+          i = void 0;
+      switch (format) {
+        case 0:
+          out = new Uint8Array(1 + fdSelect.fdSelect.length);
+          out[0] = format;
+          for (i = 0; i < fdSelect.fdSelect.length; i++) {
+            out[i + 1] = fdSelect.fdSelect[i];
+          }
+          break;
+        case 3:
+          var start = 0;
+          var lastFD = fdSelect.fdSelect[0];
+          var ranges = [format, 0, 0, start >> 8 & 0xFF, start & 0xFF, lastFD];
+          for (i = 1; i < fdSelect.fdSelect.length; i++) {
+            var currentFD = fdSelect.fdSelect[i];
+            if (currentFD !== lastFD) {
+              ranges.push(i >> 8 & 0xFF, i & 0xFF, currentFD);
+              lastFD = currentFD;
+            }
+          }
+          var numRanges = (ranges.length - 3) / 3;
+          ranges[1] = numRanges >> 8 & 0xFF;
+          ranges[2] = numRanges & 0xFF;
+          ranges.push(i >> 8 & 0xFF, i & 0xFF);
+          out = new Uint8Array(ranges);
+          break;
+      }
+      return this.compileTypedArray(out);
+    },
+    compileTypedArray: function CFFCompiler_compileTypedArray(data) {
+      var out = [];
+      for (var i = 0, ii = data.length; i < ii; ++i) {
+        out[i] = data[i];
+      }
+      return out;
+    },
+    compileIndex: function CFFCompiler_compileIndex(index, trackers) {
+      trackers = trackers || [];
+      var objects = index.objects;
+      var count = objects.length;
+      if (count === 0) {
+        return [0, 0, 0];
+      }
+      var data = [count >> 8 & 0xFF, count & 0xff];
+      var lastOffset = 1,
+          i;
+      for (i = 0; i < count; ++i) {
+        lastOffset += objects[i].length;
+      }
+      var offsetSize;
+      if (lastOffset < 0x100) {
+        offsetSize = 1;
+      } else if (lastOffset < 0x10000) {
+        offsetSize = 2;
+      } else if (lastOffset < 0x1000000) {
+        offsetSize = 3;
+      } else {
+        offsetSize = 4;
+      }
+      data.push(offsetSize);
+      var relativeOffset = 1;
+      for (i = 0; i < count + 1; i++) {
+        if (offsetSize === 1) {
+          data.push(relativeOffset & 0xFF);
+        } else if (offsetSize === 2) {
+          data.push(relativeOffset >> 8 & 0xFF, relativeOffset & 0xFF);
+        } else if (offsetSize === 3) {
+          data.push(relativeOffset >> 16 & 0xFF, relativeOffset >> 8 & 0xFF, relativeOffset & 0xFF);
+        } else {
+          data.push(relativeOffset >>> 24 & 0xFF, relativeOffset >> 16 & 0xFF, relativeOffset >> 8 & 0xFF, relativeOffset & 0xFF);
+        }
+        if (objects[i]) {
+          relativeOffset += objects[i].length;
+        }
+      }
+      for (i = 0; i < count; i++) {
+        if (trackers[i]) {
+          trackers[i].offset(data.length);
+        }
+        for (var j = 0, jj = objects[i].length; j < jj; j++) {
+          data.push(objects[i][j]);
+        }
+      }
+      return data;
+    }
+  };
+  return CFFCompiler;
+}();
+exports.CFFStandardStrings = CFFStandardStrings;
+exports.CFFParser = CFFParser;
+exports.CFF = CFF;
+exports.CFFHeader = CFFHeader;
+exports.CFFStrings = CFFStrings;
+exports.CFFIndex = CFFIndex;
+exports.CFFCharset = CFFCharset;
+exports.CFFTopDict = CFFTopDict;
+exports.CFFPrivateDict = CFFPrivateDict;
+exports.CFFCompiler = CFFCompiler;
+exports.CFFFDSelect = CFFFDSelect;
+
+/***/ }),
+/* 158 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+var ISOAdobeCharset = ['.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent', 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency', 'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl', 'periodcentered', 'paragraph', 'bullet', 'quotesinglbase', 'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis', 'perthousand', 'questiondown', 'grave', 'acute', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent', 'dieresis', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron', 'emdash', 'AE', 'ordfeminine', 'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae', 'dotlessi', 'lslash', 'oslash', 'oe', 'germandbls', 'onesuperior', 'logicalnot', 'mu', 'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn', 'onequarter', 'divide', 'brokenbar', 'degree', 'thorn', 'threequarters', 'twosuperior', 'registered', 'minus', 'eth', 'multiply', 'threesuperior', 'copyright', 'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring', 'Atilde', 'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute', 'Ocircumflex', 'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute', 'Ucircumflex', 'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron', 'aacute', 'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde', 'ccedilla', 'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute', 'icircumflex', 'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex', 'odieresis', 'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex', 'udieresis', 'ugrave', 'yacute', 'ydieresis', 'zcaron'];
+var ExpertCharset = ['.notdef', 'space', 'exclamsmall', 'Hungarumlautsmall', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', 'commasuperior', 'threequartersemdash', 'periodsuperior', 'questionsmall', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior', 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior', 'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', 'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall', 'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah', 'Tildesmall', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall', 'Caronsmall', 'Dotaccentsmall', 'Macronsmall', 'figuredash', 'hypheninferior', 'Ogoneksmall', 'Ringsmall', 'Cedillasmall', 'onequarter', 'onehalf', 'threequarters', 'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior', 'commainferior', 'Agravesmall', 'Aacutesmall', 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', 'Aringsmall', 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall', 'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall', 'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall', 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall', 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall', 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall', 'Ydieresissmall'];
+var ExpertSubsetCharset = ['.notdef', 'space', 'dollaroldstyle', 'dollarsuperior', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', 'commasuperior', 'threequartersemdash', 'periodsuperior', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior', 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior', 'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', 'parenrightinferior', 'hyphensuperior', 'colonmonetary', 'onefitted', 'rupiah', 'centoldstyle', 'figuredash', 'hypheninferior', 'onequarter', 'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior', 'commainferior'];
+exports.ISOAdobeCharset = ISOAdobeCharset;
+exports.ExpertCharset = ExpertCharset;
+exports.ExpertSubsetCharset = ExpertSubsetCharset;
+
+/***/ }),
+/* 159 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+var ExpertEncoding = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'space', 'exclamsmall', 'Hungarumlautsmall', '', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', 'commasuperior', 'threequartersemdash', 'periodsuperior', 'questionsmall', '', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', '', '', '', 'isuperior', '', '', 'lsuperior', 'msuperior', 'nsuperior', 'osuperior', '', '', 'rsuperior', 'ssuperior', 'tsuperior', '', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', '', 'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall', 'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah', 'Tildesmall', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall', '', '', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall', 'Caronsmall', '', 'Dotaccentsmall', '', '', 'Macronsmall', '', '', 'figuredash', 'hypheninferior', '', '', 'Ogoneksmall', 'Ringsmall', 'Cedillasmall', '', '', '', 'onequarter', 'onehalf', 'threequarters', 'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', '', '', 'zerosuperior', 'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior', 'commainferior', 'Agravesmall', 'Aacutesmall', 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', 'Aringsmall', 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall', 'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall', 'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall', 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall', 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall', 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall', 'Ydieresissmall'];
+var MacExpertEncoding = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'space', 'exclamsmall', 'Hungarumlautsmall', 'centoldstyle', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', '', 'threequartersemdash', '', 'questionsmall', '', '', '', '', 'Ethsmall', '', '', 'onequarter', 'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', '', '', '', '', '', '', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', '', 'parenrightinferior', 'Circumflexsmall', 'hypheninferior', 'Gravesmall', 'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah', 'Tildesmall', '', '', 'asuperior', 'centsuperior', '', '', '', '', 'Aacutesmall', 'Agravesmall', 'Acircumflexsmall', 'Adieresissmall', 'Atildesmall', 'Aringsmall', 'Ccedillasmall', 'Eacutesmall', 'Egravesmall', 'Ecircumflexsmall', 'Edieresissmall', 'Iacutesmall', 'Igravesmall', 'Icircumflexsmall', 'Idieresissmall', 'Ntildesmall', 'Oacutesmall', 'Ogravesmall', 'Ocircumflexsmall', 'Odieresissmall', 'Otildesmall', 'Uacutesmall', 'Ugravesmall', 'Ucircumflexsmall', 'Udieresissmall', '', 'eightsuperior', 'fourinferior', 'threeinferior', 'sixinferior', 'eightinferior', 'seveninferior', 'Scaronsmall', '', 'centinferior', 'twoinferior', '', 'Dieresissmall', '', 'Caronsmall', 'osuperior', 'fiveinferior', '', 'commainferior', 'periodinferior', 'Yacutesmall', '', 'dollarinferior', '', '', 'Thornsmall', '', 'nineinferior', 'zeroinferior', 'Zcaronsmall', 'AEsmall', 'Oslashsmall', 'questiondownsmall', 'oneinferior', 'Lslashsmall', '', '', '', '', '', '', 'Cedillasmall', '', '', '', '', '', 'OEsmall', 'figuredash', 'hyphensuperior', '', '', '', '', 'exclamdownsmall', '', 'Ydieresissmall', '', 'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', 'sevensuperior', 'ninesuperior', 'zerosuperior', '', 'esuperior', 'rsuperior', 'tsuperior', '', '', 'isuperior', 'ssuperior', 'dsuperior', '', '', '', '', '', 'lsuperior', 'Ogoneksmall', 'Brevesmall', 'Macronsmall', 'bsuperior', 'nsuperior', 'msuperior', 'commasuperior', 'periodsuperior', 'Dotaccentsmall', 'Ringsmall', '', '', '', ''];
+var MacRomanEncoding = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', '', 'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde', 'Odieresis', 'Udieresis', 'aacute', 'agrave', 'acircumflex', 'adieresis', 'atilde', 'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis', 'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute', 'ograve', 'ocircumflex', 'odieresis', 'otilde', 'uacute', 'ugrave', 'ucircumflex', 'udieresis', 'dagger', 'degree', 'cent', 'sterling', 'section', 'bullet', 'paragraph', 'germandbls', 'registered', 'copyright', 'trademark', 'acute', 'dieresis', 'notequal', 'AE', 'Oslash', 'infinity', 'plusminus', 'lessequal', 'greaterequal', 'yen', 'mu', 'partialdiff', 'summation', 'product', 'pi', 'integral', 'ordfeminine', 'ordmasculine', 'Omega', 'ae', 'oslash', 'questiondown', 'exclamdown', 'logicalnot', 'radical', 'florin', 'approxequal', 'Delta', 'guillemotleft', 'guillemotright', 'ellipsis', 'space', 'Agrave', 'Atilde', 'Otilde', 'OE', 'oe', 'endash', 'emdash', 'quotedblleft', 'quotedblright', 'quoteleft', 'quoteright', 'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction', 'currency', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl', 'periodcentered', 'quotesinglbase', 'quotedblbase', 'perthousand', 'Acircumflex', 'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple', 'Ograve', 'Uacute', 'Ucircumflex', 'Ugrave', 'dotlessi', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron'];
+var StandardEncoding = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'exclamdown', 'cent', 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency', 'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', '', 'endash', 'dagger', 'daggerdbl', 'periodcentered', '', 'paragraph', 'bullet', 'quotesinglbase', 'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis', 'perthousand', '', 'questiondown', '', 'grave', 'acute', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent', 'dieresis', '', 'ring', 'cedilla', '', 'hungarumlaut', 'ogonek', 'caron', 'emdash', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'AE', '', 'ordfeminine', '', '', '', '', 'Lslash', 'Oslash', 'OE', 'ordmasculine', '', '', '', '', '', 'ae', '', '', '', 'dotlessi', '', '', 'lslash', 'oslash', 'oe', 'germandbls', '', '', '', ''];
+var WinAnsiEncoding = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', 'bullet', 'Euro', 'bullet', 'quotesinglbase', 'florin', 'quotedblbase', 'ellipsis', 'dagger', 'daggerdbl', 'circumflex', 'perthousand', 'Scaron', 'guilsinglleft', 'OE', 'bullet', 'Zcaron', 'bullet', 'bullet', 'quoteleft', 'quoteright', 'quotedblleft', 'quotedblright', 'bullet', 'endash', 'emdash', 'tilde', 'trademark', 'scaron', 'guilsinglright', 'oe', 'bullet', 'zcaron', 'Ydieresis', 'space', 'exclamdown', 'cent', 'sterling', 'currency', 'yen', 'brokenbar', 'section', 'dieresis', 'copyright', 'ordfeminine', 'guillemotleft', 'logicalnot', 'hyphen', 'registered', 'macron', 'degree', 'plusminus', 'twosuperior', 'threesuperior', 'acute', 'mu', 'paragraph', 'periodcentered', 'cedilla', 'onesuperior', 'ordmasculine', 'guillemotright', 'onequarter', 'onehalf', 'threequarters', 'questiondown', 'Agrave', 'Aacute', 'Acircumflex', 'Atilde', 'Adieresis', 'Aring', 'AE', 'Ccedilla', 'Egrave', 'Eacute', 'Ecircumflex', 'Edieresis', 'Igrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Eth', 'Ntilde', 'Ograve', 'Oacute', 'Ocircumflex', 'Otilde', 'Odieresis', 'multiply', 'Oslash', 'Ugrave', 'Uacute', 'Ucircumflex', 'Udieresis', 'Yacute', 'Thorn', 'germandbls', 'agrave', 'aacute', 'acircumflex', 'atilde', 'adieresis', 'aring', 'ae', 'ccedilla', 'egrave', 'eacute', 'ecircumflex', 'edieresis', 'igrave', 'iacute', 'icircumflex', 'idieresis', 'eth', 'ntilde', 'ograve', 'oacute', 'ocircumflex', 'otilde', 'odieresis', 'divide', 'oslash', 'ugrave', 'uacute', 'ucircumflex', 'udieresis', 'yacute', 'thorn', 'ydieresis'];
+var SymbolSetEncoding = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'space', 'exclam', 'universal', 'numbersign', 'existential', 'percent', 'ampersand', 'suchthat', 'parenleft', 'parenright', 'asteriskmath', 'plus', 'comma', 'minus', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'congruent', 'Alpha', 'Beta', 'Chi', 'Delta', 'Epsilon', 'Phi', 'Gamma', 'Eta', 'Iota', 'theta1', 'Kappa', 'Lambda', 'Mu', 'Nu', 'Omicron', 'Pi', 'Theta', 'Rho', 'Sigma', 'Tau', 'Upsilon', 'sigma1', 'Omega', 'Xi', 'Psi', 'Zeta', 'bracketleft', 'therefore', 'bracketright', 'perpendicular', 'underscore', 'radicalex', 'alpha', 'beta', 'chi', 'delta', 'epsilon', 'phi', 'gamma', 'eta', 'iota', 'phi1', 'kappa', 'lambda', 'mu', 'nu', 'omicron', 'pi', 'theta', 'rho', 'sigma', 'tau', 'upsilon', 'omega1', 'omega', 'xi', 'psi', 'zeta', 'braceleft', 'bar', 'braceright', 'similar', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'Euro', 'Upsilon1', 'minute', 'lessequal', 'fraction', 'infinity', 'florin', 'club', 'diamond', 'heart', 'spade', 'arrowboth', 'arrowleft', 'arrowup', 'arrowright', 'arrowdown', 'degree', 'plusminus', 'second', 'greaterequal', 'multiply', 'proportional', 'partialdiff', 'bullet', 'divide', 'notequal', 'equivalence', 'approxequal', 'ellipsis', 'arrowvertex', 'arrowhorizex', 'carriagereturn', 'aleph', 'Ifraktur', 'Rfraktur', 'weierstrass', 'circlemultiply', 'circleplus', 'emptyset', 'intersection', 'union', 'propersuperset', 'reflexsuperset', 'notsubset', 'propersubset', 'reflexsubset', 'element', 'notelement', 'angle', 'gradient', 'registerserif', 'copyrightserif', 'trademarkserif', 'product', 'radical', 'dotmath', 'logicalnot', 'logicaland', 'logicalor', 'arrowdblboth', 'arrowdblleft', 'arrowdblup', 'arrowdblright', 'arrowdbldown', 'lozenge', 'angleleft', 'registersans', 'copyrightsans', 'trademarksans', 'summation', 'parenlefttp', 'parenleftex', 'parenleftbt', 'bracketlefttp', 'bracketleftex', 'bracketleftbt', 'bracelefttp', 'braceleftmid', 'braceleftbt', 'braceex', '', 'angleright', 'integral', 'integraltp', 'integralex', 'integralbt', 'parenrighttp', 'parenrightex', 'parenrightbt', 'bracketrighttp', 'bracketrightex', 'bracketrightbt', 'bracerighttp', 'bracerightmid', 'bracerightbt', ''];
+var ZapfDingbatsEncoding = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'space', 'a1', 'a2', 'a202', 'a3', 'a4', 'a5', 'a119', 'a118', 'a117', 'a11', 'a12', 'a13', 'a14', 'a15', 'a16', 'a105', 'a17', 'a18', 'a19', 'a20', 'a21', 'a22', 'a23', 'a24', 'a25', 'a26', 'a27', 'a28', 'a6', 'a7', 'a8', 'a9', 'a10', 'a29', 'a30', 'a31', 'a32', 'a33', 'a34', 'a35', 'a36', 'a37', 'a38', 'a39', 'a40', 'a41', 'a42', 'a43', 'a44', 'a45', 'a46', 'a47', 'a48', 'a49', 'a50', 'a51', 'a52', 'a53', 'a54', 'a55', 'a56', 'a57', 'a58', 'a59', 'a60', 'a61', 'a62', 'a63', 'a64', 'a65', 'a66', 'a67', 'a68', 'a69', 'a70', 'a71', 'a72', 'a73', 'a74', 'a203', 'a75', 'a204', 'a76', 'a77', 'a78', 'a79', 'a81', 'a82', 'a83', 'a84', 'a97', 'a98', 'a99', 'a100', '', 'a89', 'a90', 'a93', 'a94', 'a91', 'a92', 'a205', 'a85', 'a206', 'a86', 'a87', 'a88', 'a95', 'a96', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'a101', 'a102', 'a103', 'a104', 'a106', 'a107', 'a108', 'a112', 'a111', 'a110', 'a109', 'a120', 'a121', 'a122', 'a123', 'a124', 'a125', 'a126', 'a127', 'a128', 'a129', 'a130', 'a131', 'a132', 'a133', 'a134', 'a135', 'a136', 'a137', 'a138', 'a139', 'a140', 'a141', 'a142', 'a143', 'a144', 'a145', 'a146', 'a147', 'a148', 'a149', 'a150', 'a151', 'a152', 'a153', 'a154', 'a155', 'a156', 'a157', 'a158', 'a159', 'a160', 'a161', 'a163', 'a164', 'a196', 'a165', 'a192', 'a166', 'a167', 'a168', 'a169', 'a170', 'a171', 'a172', 'a173', 'a162', 'a174', 'a175', 'a176', 'a177', 'a178', 'a179', 'a193', 'a180', 'a199', 'a181', 'a200', 'a182', '', 'a201', 'a183', 'a184', 'a197', 'a185', 'a194', 'a198', 'a186', 'a195', 'a187', 'a188', 'a189', 'a190', 'a191', ''];
+function getEncoding(encodingName) {
+  switch (encodingName) {
+    case 'WinAnsiEncoding':
+      return WinAnsiEncoding;
+    case 'StandardEncoding':
+      return StandardEncoding;
+    case 'MacRomanEncoding':
+      return MacRomanEncoding;
+    case 'SymbolSetEncoding':
+      return SymbolSetEncoding;
+    case 'ZapfDingbatsEncoding':
+      return ZapfDingbatsEncoding;
+    case 'ExpertEncoding':
+      return ExpertEncoding;
+    case 'MacExpertEncoding':
+      return MacExpertEncoding;
+    default:
+      return null;
+  }
+}
+exports.WinAnsiEncoding = WinAnsiEncoding;
+exports.StandardEncoding = StandardEncoding;
+exports.MacRomanEncoding = MacRomanEncoding;
+exports.SymbolSetEncoding = SymbolSetEncoding;
+exports.ZapfDingbatsEncoding = ZapfDingbatsEncoding;
+exports.ExpertEncoding = ExpertEncoding;
+exports.getEncoding = getEncoding;
+
+/***/ }),
+/* 160 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+var getLookupTableFactory = __w_pdfjs_require__(2).getLookupTableFactory;
+var getGlyphsUnicode = getLookupTableFactory(function (t) {
+ t['A'] = 0x0041;
+ t['AE'] = 0x00C6;
+ t['AEacute'] = 0x01FC;
+ t['AEmacron'] = 0x01E2;
+ t['AEsmall'] = 0xF7E6;
+ t['Aacute'] = 0x00C1;
+ t['Aacutesmall'] = 0xF7E1;
+ t['Abreve'] = 0x0102;
+ t['Abreveacute'] = 0x1EAE;
+ t['Abrevecyrillic'] = 0x04D0;
+ t['Abrevedotbelow'] = 0x1EB6;
+ t['Abrevegrave'] = 0x1EB0;
+ t['Abrevehookabove'] = 0x1EB2;
+ t['Abrevetilde'] = 0x1EB4;
+ t['Acaron'] = 0x01CD;
+ t['Acircle'] = 0x24B6;
+ t['Acircumflex'] = 0x00C2;
+ t['Acircumflexacute'] = 0x1EA4;
+ t['Acircumflexdotbelow'] = 0x1EAC;
+ t['Acircumflexgrave'] = 0x1EA6;
+ t['Acircumflexhookabove'] = 0x1EA8;
+ t['Acircumflexsmall'] = 0xF7E2;
+ t['Acircumflextilde'] = 0x1EAA;
+ t['Acute'] = 0xF6C9;
+ t['Acutesmall'] = 0xF7B4;
+ t['Acyrillic'] = 0x0410;
+ t['Adblgrave'] = 0x0200;
+ t['Adieresis'] = 0x00C4;
+ t['Adieresiscyrillic'] = 0x04D2;
+ t['Adieresismacron'] = 0x01DE;
+ t['Adieresissmall'] = 0xF7E4;
+ t['Adotbelow'] = 0x1EA0;
+ t['Adotmacron'] = 0x01E0;
+ t['Agrave'] = 0x00C0;
+ t['Agravesmall'] = 0xF7E0;
+ t['Ahookabove'] = 0x1EA2;
+ t['Aiecyrillic'] = 0x04D4;
+ t['Ainvertedbreve'] = 0x0202;
+ t['Alpha'] = 0x0391;
+ t['Alphatonos'] = 0x0386;
+ t['Amacron'] = 0x0100;
+ t['Amonospace'] = 0xFF21;
+ t['Aogonek'] = 0x0104;
+ t['Aring'] = 0x00C5;
+ t['Aringacute'] = 0x01FA;
+ t['Aringbelow'] = 0x1E00;
+ t['Aringsmall'] = 0xF7E5;
+ t['Asmall'] = 0xF761;
+ t['Atilde'] = 0x00C3;
+ t['Atildesmall'] = 0xF7E3;
+ t['Aybarmenian'] = 0x0531;
+ t['B'] = 0x0042;
+ t['Bcircle'] = 0x24B7;
+ t['Bdotaccent'] = 0x1E02;
+ t['Bdotbelow'] = 0x1E04;
+ t['Becyrillic'] = 0x0411;
+ t['Benarmenian'] = 0x0532;
+ t['Beta'] = 0x0392;
+ t['Bhook'] = 0x0181;
+ t['Blinebelow'] = 0x1E06;
+ t['Bmonospace'] = 0xFF22;
+ t['Brevesmall'] = 0xF6F4;
+ t['Bsmall'] = 0xF762;
+ t['Btopbar'] = 0x0182;
+ t['C'] = 0x0043;
+ t['Caarmenian'] = 0x053E;
+ t['Cacute'] = 0x0106;
+ t['Caron'] = 0xF6CA;
+ t['Caronsmall'] = 0xF6F5;
+ t['Ccaron'] = 0x010C;
+ t['Ccedilla'] = 0x00C7;
+ t['Ccedillaacute'] = 0x1E08;
+ t['Ccedillasmall'] = 0xF7E7;
+ t['Ccircle'] = 0x24B8;
+ t['Ccircumflex'] = 0x0108;
+ t['Cdot'] = 0x010A;
+ t['Cdotaccent'] = 0x010A;
+ t['Cedillasmall'] = 0xF7B8;
+ t['Chaarmenian'] = 0x0549;
+ t['Cheabkhasiancyrillic'] = 0x04BC;
+ t['Checyrillic'] = 0x0427;
+ t['Chedescenderabkhasiancyrillic'] = 0x04BE;
+ t['Chedescendercyrillic'] = 0x04B6;
+ t['Chedieresiscyrillic'] = 0x04F4;
+ t['Cheharmenian'] = 0x0543;
+ t['Chekhakassiancyrillic'] = 0x04CB;
+ t['Cheverticalstrokecyrillic'] = 0x04B8;
+ t['Chi'] = 0x03A7;
+ t['Chook'] = 0x0187;
+ t['Circumflexsmall'] = 0xF6F6;
+ t['Cmonospace'] = 0xFF23;
+ t['Coarmenian'] = 0x0551;
+ t['Csmall'] = 0xF763;
+ t['D'] = 0x0044;
+ t['DZ'] = 0x01F1;
+ t['DZcaron'] = 0x01C4;
+ t['Daarmenian'] = 0x0534;
+ t['Dafrican'] = 0x0189;
+ t['Dcaron'] = 0x010E;
+ t['Dcedilla'] = 0x1E10;
+ t['Dcircle'] = 0x24B9;
+ t['Dcircumflexbelow'] = 0x1E12;
+ t['Dcroat'] = 0x0110;
+ t['Ddotaccent'] = 0x1E0A;
+ t['Ddotbelow'] = 0x1E0C;
+ t['Decyrillic'] = 0x0414;
+ t['Deicoptic'] = 0x03EE;
+ t['Delta'] = 0x2206;
+ t['Deltagreek'] = 0x0394;
+ t['Dhook'] = 0x018A;
+ t['Dieresis'] = 0xF6CB;
+ t['DieresisAcute'] = 0xF6CC;
+ t['DieresisGrave'] = 0xF6CD;
+ t['Dieresissmall'] = 0xF7A8;
+ t['Digammagreek'] = 0x03DC;
+ t['Djecyrillic'] = 0x0402;
+ t['Dlinebelow'] = 0x1E0E;
+ t['Dmonospace'] = 0xFF24;
+ t['Dotaccentsmall'] = 0xF6F7;
+ t['Dslash'] = 0x0110;
+ t['Dsmall'] = 0xF764;
+ t['Dtopbar'] = 0x018B;
+ t['Dz'] = 0x01F2;
+ t['Dzcaron'] = 0x01C5;
+ t['Dzeabkhasiancyrillic'] = 0x04E0;
+ t['Dzecyrillic'] = 0x0405;
+ t['Dzhecyrillic'] = 0x040F;
+ t['E'] = 0x0045;
+ t['Eacute'] = 0x00C9;
+ t['Eacutesmall'] = 0xF7E9;
+ t['Ebreve'] = 0x0114;
+ t['Ecaron'] = 0x011A;
+ t['Ecedillabreve'] = 0x1E1C;
+ t['Echarmenian'] = 0x0535;
+ t['Ecircle'] = 0x24BA;
+ t['Ecircumflex'] = 0x00CA;
+ t['Ecircumflexacute'] = 0x1EBE;
+ t['Ecircumflexbelow'] = 0x1E18;
+ t['Ecircumflexdotbelow'] = 0x1EC6;
+ t['Ecircumflexgrave'] = 0x1EC0;
+ t['Ecircumflexhookabove'] = 0x1EC2;
+ t['Ecircumflexsmall'] = 0xF7EA;
+ t['Ecircumflextilde'] = 0x1EC4;
+ t['Ecyrillic'] = 0x0404;
+ t['Edblgrave'] = 0x0204;
+ t['Edieresis'] = 0x00CB;
+ t['Edieresissmall'] = 0xF7EB;
+ t['Edot'] = 0x0116;
+ t['Edotaccent'] = 0x0116;
+ t['Edotbelow'] = 0x1EB8;
+ t['Efcyrillic'] = 0x0424;
+ t['Egrave'] = 0x00C8;
+ t['Egravesmall'] = 0xF7E8;
+ t['Eharmenian'] = 0x0537;
+ t['Ehookabove'] = 0x1EBA;
+ t['Eightroman'] = 0x2167;
+ t['Einvertedbreve'] = 0x0206;
+ t['Eiotifiedcyrillic'] = 0x0464;
+ t['Elcyrillic'] = 0x041B;
+ t['Elevenroman'] = 0x216A;
+ t['Emacron'] = 0x0112;
+ t['Emacronacute'] = 0x1E16;
+ t['Emacrongrave'] = 0x1E14;
+ t['Emcyrillic'] = 0x041C;
+ t['Emonospace'] = 0xFF25;
+ t['Encyrillic'] = 0x041D;
+ t['Endescendercyrillic'] = 0x04A2;
+ t['Eng'] = 0x014A;
+ t['Enghecyrillic'] = 0x04A4;
+ t['Enhookcyrillic'] = 0x04C7;
+ t['Eogonek'] = 0x0118;
+ t['Eopen'] = 0x0190;
+ t['Epsilon'] = 0x0395;
+ t['Epsilontonos'] = 0x0388;
+ t['Ercyrillic'] = 0x0420;
+ t['Ereversed'] = 0x018E;
+ t['Ereversedcyrillic'] = 0x042D;
+ t['Escyrillic'] = 0x0421;
+ t['Esdescendercyrillic'] = 0x04AA;
+ t['Esh'] = 0x01A9;
+ t['Esmall'] = 0xF765;
+ t['Eta'] = 0x0397;
+ t['Etarmenian'] = 0x0538;
+ t['Etatonos'] = 0x0389;
+ t['Eth'] = 0x00D0;
+ t['Ethsmall'] = 0xF7F0;
+ t['Etilde'] = 0x1EBC;
+ t['Etildebelow'] = 0x1E1A;
+ t['Euro'] = 0x20AC;
+ t['Ezh'] = 0x01B7;
+ t['Ezhcaron'] = 0x01EE;
+ t['Ezhreversed'] = 0x01B8;
+ t['F'] = 0x0046;
+ t['Fcircle'] = 0x24BB;
+ t['Fdotaccent'] = 0x1E1E;
+ t['Feharmenian'] = 0x0556;
+ t['Feicoptic'] = 0x03E4;
+ t['Fhook'] = 0x0191;
+ t['Fitacyrillic'] = 0x0472;
+ t['Fiveroman'] = 0x2164;
+ t['Fmonospace'] = 0xFF26;
+ t['Fourroman'] = 0x2163;
+ t['Fsmall'] = 0xF766;
+ t['G'] = 0x0047;
+ t['GBsquare'] = 0x3387;
+ t['Gacute'] = 0x01F4;
+ t['Gamma'] = 0x0393;
+ t['Gammaafrican'] = 0x0194;
+ t['Gangiacoptic'] = 0x03EA;
+ t['Gbreve'] = 0x011E;
+ t['Gcaron'] = 0x01E6;
+ t['Gcedilla'] = 0x0122;
+ t['Gcircle'] = 0x24BC;
+ t['Gcircumflex'] = 0x011C;
+ t['Gcommaaccent'] = 0x0122;
+ t['Gdot'] = 0x0120;
+ t['Gdotaccent'] = 0x0120;
+ t['Gecyrillic'] = 0x0413;
+ t['Ghadarmenian'] = 0x0542;
+ t['Ghemiddlehookcyrillic'] = 0x0494;
+ t['Ghestrokecyrillic'] = 0x0492;
+ t['Gheupturncyrillic'] = 0x0490;
+ t['Ghook'] = 0x0193;
+ t['Gimarmenian'] = 0x0533;
+ t['Gjecyrillic'] = 0x0403;
+ t['Gmacron'] = 0x1E20;
+ t['Gmonospace'] = 0xFF27;
+ t['Grave'] = 0xF6CE;
+ t['Gravesmall'] = 0xF760;
+ t['Gsmall'] = 0xF767;
+ t['Gsmallhook'] = 0x029B;
+ t['Gstroke'] = 0x01E4;
+ t['H'] = 0x0048;
+ t['H18533'] = 0x25CF;
+ t['H18543'] = 0x25AA;
+ t['H18551'] = 0x25AB;
+ t['H22073'] = 0x25A1;
+ t['HPsquare'] = 0x33CB;
+ t['Haabkhasiancyrillic'] = 0x04A8;
+ t['Hadescendercyrillic'] = 0x04B2;
+ t['Hardsigncyrillic'] = 0x042A;
+ t['Hbar'] = 0x0126;
+ t['Hbrevebelow'] = 0x1E2A;
+ t['Hcedilla'] = 0x1E28;
+ t['Hcircle'] = 0x24BD;
+ t['Hcircumflex'] = 0x0124;
+ t['Hdieresis'] = 0x1E26;
+ t['Hdotaccent'] = 0x1E22;
+ t['Hdotbelow'] = 0x1E24;
+ t['Hmonospace'] = 0xFF28;
+ t['Hoarmenian'] = 0x0540;
+ t['Horicoptic'] = 0x03E8;
+ t['Hsmall'] = 0xF768;
+ t['Hungarumlaut'] = 0xF6CF;
+ t['Hungarumlautsmall'] = 0xF6F8;
+ t['Hzsquare'] = 0x3390;
+ t['I'] = 0x0049;
+ t['IAcyrillic'] = 0x042F;
+ t['IJ'] = 0x0132;
+ t['IUcyrillic'] = 0x042E;
+ t['Iacute'] = 0x00CD;
+ t['Iacutesmall'] = 0xF7ED;
+ t['Ibreve'] = 0x012C;
+ t['Icaron'] = 0x01CF;
+ t['Icircle'] = 0x24BE;
+ t['Icircumflex'] = 0x00CE;
+ t['Icircumflexsmall'] = 0xF7EE;
+ t['Icyrillic'] = 0x0406;
+ t['Idblgrave'] = 0x0208;
+ t['Idieresis'] = 0x00CF;
+ t['Idieresisacute'] = 0x1E2E;
+ t['Idieresiscyrillic'] = 0x04E4;
+ t['Idieresissmall'] = 0xF7EF;
+ t['Idot'] = 0x0130;
+ t['Idotaccent'] = 0x0130;
+ t['Idotbelow'] = 0x1ECA;
+ t['Iebrevecyrillic'] = 0x04D6;
+ t['Iecyrillic'] = 0x0415;
+ t['Ifraktur'] = 0x2111;
+ t['Igrave'] = 0x00CC;
+ t['Igravesmall'] = 0xF7EC;
+ t['Ihookabove'] = 0x1EC8;
+ t['Iicyrillic'] = 0x0418;
+ t['Iinvertedbreve'] = 0x020A;
+ t['Iishortcyrillic'] = 0x0419;
+ t['Imacron'] = 0x012A;
+ t['Imacroncyrillic'] = 0x04E2;
+ t['Imonospace'] = 0xFF29;
+ t['Iniarmenian'] = 0x053B;
+ t['Iocyrillic'] = 0x0401;
+ t['Iogonek'] = 0x012E;
+ t['Iota'] = 0x0399;
+ t['Iotaafrican'] = 0x0196;
+ t['Iotadieresis'] = 0x03AA;
+ t['Iotatonos'] = 0x038A;
+ t['Ismall'] = 0xF769;
+ t['Istroke'] = 0x0197;
+ t['Itilde'] = 0x0128;
+ t['Itildebelow'] = 0x1E2C;
+ t['Izhitsacyrillic'] = 0x0474;
+ t['Izhitsadblgravecyrillic'] = 0x0476;
+ t['J'] = 0x004A;
+ t['Jaarmenian'] = 0x0541;
+ t['Jcircle'] = 0x24BF;
+ t['Jcircumflex'] = 0x0134;
+ t['Jecyrillic'] = 0x0408;
+ t['Jheharmenian'] = 0x054B;
+ t['Jmonospace'] = 0xFF2A;
+ t['Jsmall'] = 0xF76A;
+ t['K'] = 0x004B;
+ t['KBsquare'] = 0x3385;
+ t['KKsquare'] = 0x33CD;
+ t['Kabashkircyrillic'] = 0x04A0;
+ t['Kacute'] = 0x1E30;
+ t['Kacyrillic'] = 0x041A;
+ t['Kadescendercyrillic'] = 0x049A;
+ t['Kahookcyrillic'] = 0x04C3;
+ t['Kappa'] = 0x039A;
+ t['Kastrokecyrillic'] = 0x049E;
+ t['Kaverticalstrokecyrillic'] = 0x049C;
+ t['Kcaron'] = 0x01E8;
+ t['Kcedilla'] = 0x0136;
+ t['Kcircle'] = 0x24C0;
+ t['Kcommaaccent'] = 0x0136;
+ t['Kdotbelow'] = 0x1E32;
+ t['Keharmenian'] = 0x0554;
+ t['Kenarmenian'] = 0x053F;
+ t['Khacyrillic'] = 0x0425;
+ t['Kheicoptic'] = 0x03E6;
+ t['Khook'] = 0x0198;
+ t['Kjecyrillic'] = 0x040C;
+ t['Klinebelow'] = 0x1E34;
+ t['Kmonospace'] = 0xFF2B;
+ t['Koppacyrillic'] = 0x0480;
+ t['Koppagreek'] = 0x03DE;
+ t['Ksicyrillic'] = 0x046E;
+ t['Ksmall'] = 0xF76B;
+ t['L'] = 0x004C;
+ t['LJ'] = 0x01C7;
+ t['LL'] = 0xF6BF;
+ t['Lacute'] = 0x0139;
+ t['Lambda'] = 0x039B;
+ t['Lcaron'] = 0x013D;
+ t['Lcedilla'] = 0x013B;
+ t['Lcircle'] = 0x24C1;
+ t['Lcircumflexbelow'] = 0x1E3C;
+ t['Lcommaaccent'] = 0x013B;
+ t['Ldot'] = 0x013F;
+ t['Ldotaccent'] = 0x013F;
+ t['Ldotbelow'] = 0x1E36;
+ t['Ldotbelowmacron'] = 0x1E38;
+ t['Liwnarmenian'] = 0x053C;
+ t['Lj'] = 0x01C8;
+ t['Ljecyrillic'] = 0x0409;
+ t['Llinebelow'] = 0x1E3A;
+ t['Lmonospace'] = 0xFF2C;
+ t['Lslash'] = 0x0141;
+ t['Lslashsmall'] = 0xF6F9;
+ t['Lsmall'] = 0xF76C;
+ t['M'] = 0x004D;
+ t['MBsquare'] = 0x3386;
+ t['Macron'] = 0xF6D0;
+ t['Macronsmall'] = 0xF7AF;
+ t['Macute'] = 0x1E3E;
+ t['Mcircle'] = 0x24C2;
+ t['Mdotaccent'] = 0x1E40;
+ t['Mdotbelow'] = 0x1E42;
+ t['Menarmenian'] = 0x0544;
+ t['Mmonospace'] = 0xFF2D;
+ t['Msmall'] = 0xF76D;
+ t['Mturned'] = 0x019C;
+ t['Mu'] = 0x039C;
+ t['N'] = 0x004E;
+ t['NJ'] = 0x01CA;
+ t['Nacute'] = 0x0143;
+ t['Ncaron'] = 0x0147;
+ t['Ncedilla'] = 0x0145;
+ t['Ncircle'] = 0x24C3;
+ t['Ncircumflexbelow'] = 0x1E4A;
+ t['Ncommaaccent'] = 0x0145;
+ t['Ndotaccent'] = 0x1E44;
+ t['Ndotbelow'] = 0x1E46;
+ t['Nhookleft'] = 0x019D;
+ t['Nineroman'] = 0x2168;
+ t['Nj'] = 0x01CB;
+ t['Njecyrillic'] = 0x040A;
+ t['Nlinebelow'] = 0x1E48;
+ t['Nmonospace'] = 0xFF2E;
+ t['Nowarmenian'] = 0x0546;
+ t['Nsmall'] = 0xF76E;
+ t['Ntilde'] = 0x00D1;
+ t['Ntildesmall'] = 0xF7F1;
+ t['Nu'] = 0x039D;
+ t['O'] = 0x004F;
+ t['OE'] = 0x0152;
+ t['OEsmall'] = 0xF6FA;
+ t['Oacute'] = 0x00D3;
+ t['Oacutesmall'] = 0xF7F3;
+ t['Obarredcyrillic'] = 0x04E8;
+ t['Obarreddieresiscyrillic'] = 0x04EA;
+ t['Obreve'] = 0x014E;
+ t['Ocaron'] = 0x01D1;
+ t['Ocenteredtilde'] = 0x019F;
+ t['Ocircle'] = 0x24C4;
+ t['Ocircumflex'] = 0x00D4;
+ t['Ocircumflexacute'] = 0x1ED0;
+ t['Ocircumflexdotbelow'] = 0x1ED8;
+ t['Ocircumflexgrave'] = 0x1ED2;
+ t['Ocircumflexhookabove'] = 0x1ED4;
+ t['Ocircumflexsmall'] = 0xF7F4;
+ t['Ocircumflextilde'] = 0x1ED6;
+ t['Ocyrillic'] = 0x041E;
+ t['Odblacute'] = 0x0150;
+ t['Odblgrave'] = 0x020C;
+ t['Odieresis'] = 0x00D6;
+ t['Odieresiscyrillic'] = 0x04E6;
+ t['Odieresissmall'] = 0xF7F6;
+ t['Odotbelow'] = 0x1ECC;
+ t['Ogoneksmall'] = 0xF6FB;
+ t['Ograve'] = 0x00D2;
+ t['Ogravesmall'] = 0xF7F2;
+ t['Oharmenian'] = 0x0555;
+ t['Ohm'] = 0x2126;
+ t['Ohookabove'] = 0x1ECE;
+ t['Ohorn'] = 0x01A0;
+ t['Ohornacute'] = 0x1EDA;
+ t['Ohorndotbelow'] = 0x1EE2;
+ t['Ohorngrave'] = 0x1EDC;
+ t['Ohornhookabove'] = 0x1EDE;
+ t['Ohorntilde'] = 0x1EE0;
+ t['Ohungarumlaut'] = 0x0150;
+ t['Oi'] = 0x01A2;
+ t['Oinvertedbreve'] = 0x020E;
+ t['Omacron'] = 0x014C;
+ t['Omacronacute'] = 0x1E52;
+ t['Omacrongrave'] = 0x1E50;
+ t['Omega'] = 0x2126;
+ t['Omegacyrillic'] = 0x0460;
+ t['Omegagreek'] = 0x03A9;
+ t['Omegaroundcyrillic'] = 0x047A;
+ t['Omegatitlocyrillic'] = 0x047C;
+ t['Omegatonos'] = 0x038F;
+ t['Omicron'] = 0x039F;
+ t['Omicrontonos'] = 0x038C;
+ t['Omonospace'] = 0xFF2F;
+ t['Oneroman'] = 0x2160;
+ t['Oogonek'] = 0x01EA;
+ t['Oogonekmacron'] = 0x01EC;
+ t['Oopen'] = 0x0186;
+ t['Oslash'] = 0x00D8;
+ t['Oslashacute'] = 0x01FE;
+ t['Oslashsmall'] = 0xF7F8;
+ t['Osmall'] = 0xF76F;
+ t['Ostrokeacute'] = 0x01FE;
+ t['Otcyrillic'] = 0x047E;
+ t['Otilde'] = 0x00D5;
+ t['Otildeacute'] = 0x1E4C;
+ t['Otildedieresis'] = 0x1E4E;
+ t['Otildesmall'] = 0xF7F5;
+ t['P'] = 0x0050;
+ t['Pacute'] = 0x1E54;
+ t['Pcircle'] = 0x24C5;
+ t['Pdotaccent'] = 0x1E56;
+ t['Pecyrillic'] = 0x041F;
+ t['Peharmenian'] = 0x054A;
+ t['Pemiddlehookcyrillic'] = 0x04A6;
+ t['Phi'] = 0x03A6;
+ t['Phook'] = 0x01A4;
+ t['Pi'] = 0x03A0;
+ t['Piwrarmenian'] = 0x0553;
+ t['Pmonospace'] = 0xFF30;
+ t['Psi'] = 0x03A8;
+ t['Psicyrillic'] = 0x0470;
+ t['Psmall'] = 0xF770;
+ t['Q'] = 0x0051;
+ t['Qcircle'] = 0x24C6;
+ t['Qmonospace'] = 0xFF31;
+ t['Qsmall'] = 0xF771;
+ t['R'] = 0x0052;
+ t['Raarmenian'] = 0x054C;
+ t['Racute'] = 0x0154;
+ t['Rcaron'] = 0x0158;
+ t['Rcedilla'] = 0x0156;
+ t['Rcircle'] = 0x24C7;
+ t['Rcommaaccent'] = 0x0156;
+ t['Rdblgrave'] = 0x0210;
+ t['Rdotaccent'] = 0x1E58;
+ t['Rdotbelow'] = 0x1E5A;
+ t['Rdotbelowmacron'] = 0x1E5C;
+ t['Reharmenian'] = 0x0550;
+ t['Rfraktur'] = 0x211C;
+ t['Rho'] = 0x03A1;
+ t['Ringsmall'] = 0xF6FC;
+ t['Rinvertedbreve'] = 0x0212;
+ t['Rlinebelow'] = 0x1E5E;
+ t['Rmonospace'] = 0xFF32;
+ t['Rsmall'] = 0xF772;
+ t['Rsmallinverted'] = 0x0281;
+ t['Rsmallinvertedsuperior'] = 0x02B6;
+ t['S'] = 0x0053;
+ t['SF010000'] = 0x250C;
+ t['SF020000'] = 0x2514;
+ t['SF030000'] = 0x2510;
+ t['SF040000'] = 0x2518;
+ t['SF050000'] = 0x253C;
+ t['SF060000'] = 0x252C;
+ t['SF070000'] = 0x2534;
+ t['SF080000'] = 0x251C;
+ t['SF090000'] = 0x2524;
+ t['SF100000'] = 0x2500;
+ t['SF110000'] = 0x2502;
+ t['SF190000'] = 0x2561;
+ t['SF200000'] = 0x2562;
+ t['SF210000'] = 0x2556;
+ t['SF220000'] = 0x2555;
+ t['SF230000'] = 0x2563;
+ t['SF240000'] = 0x2551;
+ t['SF250000'] = 0x2557;
+ t['SF260000'] = 0x255D;
+ t['SF270000'] = 0x255C;
+ t['SF280000'] = 0x255B;
+ t['SF360000'] = 0x255E;
+ t['SF370000'] = 0x255F;
+ t['SF380000'] = 0x255A;
+ t['SF390000'] = 0x2554;
+ t['SF400000'] = 0x2569;
+ t['SF410000'] = 0x2566;
+ t['SF420000'] = 0x2560;
+ t['SF430000'] = 0x2550;
+ t['SF440000'] = 0x256C;
+ t['SF450000'] = 0x2567;
+ t['SF460000'] = 0x2568;
+ t['SF470000'] = 0x2564;
+ t['SF480000'] = 0x2565;
+ t['SF490000'] = 0x2559;
+ t['SF500000'] = 0x2558;
+ t['SF510000'] = 0x2552;
+ t['SF520000'] = 0x2553;
+ t['SF530000'] = 0x256B;
+ t['SF540000'] = 0x256A;
+ t['Sacute'] = 0x015A;
+ t['Sacutedotaccent'] = 0x1E64;
+ t['Sampigreek'] = 0x03E0;
+ t['Scaron'] = 0x0160;
+ t['Scarondotaccent'] = 0x1E66;
+ t['Scaronsmall'] = 0xF6FD;
+ t['Scedilla'] = 0x015E;
+ t['Schwa'] = 0x018F;
+ t['Schwacyrillic'] = 0x04D8;
+ t['Schwadieresiscyrillic'] = 0x04DA;
+ t['Scircle'] = 0x24C8;
+ t['Scircumflex'] = 0x015C;
+ t['Scommaaccent'] = 0x0218;
+ t['Sdotaccent'] = 0x1E60;
+ t['Sdotbelow'] = 0x1E62;
+ t['Sdotbelowdotaccent'] = 0x1E68;
+ t['Seharmenian'] = 0x054D;
+ t['Sevenroman'] = 0x2166;
+ t['Shaarmenian'] = 0x0547;
+ t['Shacyrillic'] = 0x0428;
+ t['Shchacyrillic'] = 0x0429;
+ t['Sheicoptic'] = 0x03E2;
+ t['Shhacyrillic'] = 0x04BA;
+ t['Shimacoptic'] = 0x03EC;
+ t['Sigma'] = 0x03A3;
+ t['Sixroman'] = 0x2165;
+ t['Smonospace'] = 0xFF33;
+ t['Softsigncyrillic'] = 0x042C;
+ t['Ssmall'] = 0xF773;
+ t['Stigmagreek'] = 0x03DA;
+ t['T'] = 0x0054;
+ t['Tau'] = 0x03A4;
+ t['Tbar'] = 0x0166;
+ t['Tcaron'] = 0x0164;
+ t['Tcedilla'] = 0x0162;
+ t['Tcircle'] = 0x24C9;
+ t['Tcircumflexbelow'] = 0x1E70;
+ t['Tcommaaccent'] = 0x0162;
+ t['Tdotaccent'] = 0x1E6A;
+ t['Tdotbelow'] = 0x1E6C;
+ t['Tecyrillic'] = 0x0422;
+ t['Tedescendercyrillic'] = 0x04AC;
+ t['Tenroman'] = 0x2169;
+ t['Tetsecyrillic'] = 0x04B4;
+ t['Theta'] = 0x0398;
+ t['Thook'] = 0x01AC;
+ t['Thorn'] = 0x00DE;
+ t['Thornsmall'] = 0xF7FE;
+ t['Threeroman'] = 0x2162;
+ t['Tildesmall'] = 0xF6FE;
+ t['Tiwnarmenian'] = 0x054F;
+ t['Tlinebelow'] = 0x1E6E;
+ t['Tmonospace'] = 0xFF34;
+ t['Toarmenian'] = 0x0539;
+ t['Tonefive'] = 0x01BC;
+ t['Tonesix'] = 0x0184;
+ t['Tonetwo'] = 0x01A7;
+ t['Tretroflexhook'] = 0x01AE;
+ t['Tsecyrillic'] = 0x0426;
+ t['Tshecyrillic'] = 0x040B;
+ t['Tsmall'] = 0xF774;
+ t['Twelveroman'] = 0x216B;
+ t['Tworoman'] = 0x2161;
+ t['U'] = 0x0055;
+ t['Uacute'] = 0x00DA;
+ t['Uacutesmall'] = 0xF7FA;
+ t['Ubreve'] = 0x016C;
+ t['Ucaron'] = 0x01D3;
+ t['Ucircle'] = 0x24CA;
+ t['Ucircumflex'] = 0x00DB;
+ t['Ucircumflexbelow'] = 0x1E76;
+ t['Ucircumflexsmall'] = 0xF7FB;
+ t['Ucyrillic'] = 0x0423;
+ t['Udblacute'] = 0x0170;
+ t['Udblgrave'] = 0x0214;
+ t['Udieresis'] = 0x00DC;
+ t['Udieresisacute'] = 0x01D7;
+ t['Udieresisbelow'] = 0x1E72;
+ t['Udieresiscaron'] = 0x01D9;
+ t['Udieresiscyrillic'] = 0x04F0;
+ t['Udieresisgrave'] = 0x01DB;
+ t['Udieresismacron'] = 0x01D5;
+ t['Udieresissmall'] = 0xF7FC;
+ t['Udotbelow'] = 0x1EE4;
+ t['Ugrave'] = 0x00D9;
+ t['Ugravesmall'] = 0xF7F9;
+ t['Uhookabove'] = 0x1EE6;
+ t['Uhorn'] = 0x01AF;
+ t['Uhornacute'] = 0x1EE8;
+ t['Uhorndotbelow'] = 0x1EF0;
+ t['Uhorngrave'] = 0x1EEA;
+ t['Uhornhookabove'] = 0x1EEC;
+ t['Uhorntilde'] = 0x1EEE;
+ t['Uhungarumlaut'] = 0x0170;
+ t['Uhungarumlautcyrillic'] = 0x04F2;
+ t['Uinvertedbreve'] = 0x0216;
+ t['Ukcyrillic'] = 0x0478;
+ t['Umacron'] = 0x016A;
+ t['Umacroncyrillic'] = 0x04EE;
+ t['Umacrondieresis'] = 0x1E7A;
+ t['Umonospace'] = 0xFF35;
+ t['Uogonek'] = 0x0172;
+ t['Upsilon'] = 0x03A5;
+ t['Upsilon1'] = 0x03D2;
+ t['Upsilonacutehooksymbolgreek'] = 0x03D3;
+ t['Upsilonafrican'] = 0x01B1;
+ t['Upsilondieresis'] = 0x03AB;
+ t['Upsilondieresishooksymbolgreek'] = 0x03D4;
+ t['Upsilonhooksymbol'] = 0x03D2;
+ t['Upsilontonos'] = 0x038E;
+ t['Uring'] = 0x016E;
+ t['Ushortcyrillic'] = 0x040E;
+ t['Usmall'] = 0xF775;
+ t['Ustraightcyrillic'] = 0x04AE;
+ t['Ustraightstrokecyrillic'] = 0x04B0;
+ t['Utilde'] = 0x0168;
+ t['Utildeacute'] = 0x1E78;
+ t['Utildebelow'] = 0x1E74;
+ t['V'] = 0x0056;
+ t['Vcircle'] = 0x24CB;
+ t['Vdotbelow'] = 0x1E7E;
+ t['Vecyrillic'] = 0x0412;
+ t['Vewarmenian'] = 0x054E;
+ t['Vhook'] = 0x01B2;
+ t['Vmonospace'] = 0xFF36;
+ t['Voarmenian'] = 0x0548;
+ t['Vsmall'] = 0xF776;
+ t['Vtilde'] = 0x1E7C;
+ t['W'] = 0x0057;
+ t['Wacute'] = 0x1E82;
+ t['Wcircle'] = 0x24CC;
+ t['Wcircumflex'] = 0x0174;
+ t['Wdieresis'] = 0x1E84;
+ t['Wdotaccent'] = 0x1E86;
+ t['Wdotbelow'] = 0x1E88;
+ t['Wgrave'] = 0x1E80;
+ t['Wmonospace'] = 0xFF37;
+ t['Wsmall'] = 0xF777;
+ t['X'] = 0x0058;
+ t['Xcircle'] = 0x24CD;
+ t['Xdieresis'] = 0x1E8C;
+ t['Xdotaccent'] = 0x1E8A;
+ t['Xeharmenian'] = 0x053D;
+ t['Xi'] = 0x039E;
+ t['Xmonospace'] = 0xFF38;
+ t['Xsmall'] = 0xF778;
+ t['Y'] = 0x0059;
+ t['Yacute'] = 0x00DD;
+ t['Yacutesmall'] = 0xF7FD;
+ t['Yatcyrillic'] = 0x0462;
+ t['Ycircle'] = 0x24CE;
+ t['Ycircumflex'] = 0x0176;
+ t['Ydieresis'] = 0x0178;
+ t['Ydieresissmall'] = 0xF7FF;
+ t['Ydotaccent'] = 0x1E8E;
+ t['Ydotbelow'] = 0x1EF4;
+ t['Yericyrillic'] = 0x042B;
+ t['Yerudieresiscyrillic'] = 0x04F8;
+ t['Ygrave'] = 0x1EF2;
+ t['Yhook'] = 0x01B3;
+ t['Yhookabove'] = 0x1EF6;
+ t['Yiarmenian'] = 0x0545;
+ t['Yicyrillic'] = 0x0407;
+ t['Yiwnarmenian'] = 0x0552;
+ t['Ymonospace'] = 0xFF39;
+ t['Ysmall'] = 0xF779;
+ t['Ytilde'] = 0x1EF8;
+ t['Yusbigcyrillic'] = 0x046A;
+ t['Yusbigiotifiedcyrillic'] = 0x046C;
+ t['Yuslittlecyrillic'] = 0x0466;
+ t['Yuslittleiotifiedcyrillic'] = 0x0468;
+ t['Z'] = 0x005A;
+ t['Zaarmenian'] = 0x0536;
+ t['Zacute'] = 0x0179;
+ t['Zcaron'] = 0x017D;
+ t['Zcaronsmall'] = 0xF6FF;
+ t['Zcircle'] = 0x24CF;
+ t['Zcircumflex'] = 0x1E90;
+ t['Zdot'] = 0x017B;
+ t['Zdotaccent'] = 0x017B;
+ t['Zdotbelow'] = 0x1E92;
+ t['Zecyrillic'] = 0x0417;
+ t['Zedescendercyrillic'] = 0x0498;
+ t['Zedieresiscyrillic'] = 0x04DE;
+ t['Zeta'] = 0x0396;
+ t['Zhearmenian'] = 0x053A;
+ t['Zhebrevecyrillic'] = 0x04C1;
+ t['Zhecyrillic'] = 0x0416;
+ t['Zhedescendercyrillic'] = 0x0496;
+ t['Zhedieresiscyrillic'] = 0x04DC;
+ t['Zlinebelow'] = 0x1E94;
+ t['Zmonospace'] = 0xFF3A;
+ t['Zsmall'] = 0xF77A;
+ t['Zstroke'] = 0x01B5;
+ t['a'] = 0x0061;
+ t['aabengali'] = 0x0986;
+ t['aacute'] = 0x00E1;
+ t['aadeva'] = 0x0906;
+ t['aagujarati'] = 0x0A86;
+ t['aagurmukhi'] = 0x0A06;
+ t['aamatragurmukhi'] = 0x0A3E;
+ t['aarusquare'] = 0x3303;
+ t['aavowelsignbengali'] = 0x09BE;
+ t['aavowelsigndeva'] = 0x093E;
+ t['aavowelsigngujarati'] = 0x0ABE;
+ t['abbreviationmarkarmenian'] = 0x055F;
+ t['abbreviationsigndeva'] = 0x0970;
+ t['abengali'] = 0x0985;
+ t['abopomofo'] = 0x311A;
+ t['abreve'] = 0x0103;
+ t['abreveacute'] = 0x1EAF;
+ t['abrevecyrillic'] = 0x04D1;
+ t['abrevedotbelow'] = 0x1EB7;
+ t['abrevegrave'] = 0x1EB1;
+ t['abrevehookabove'] = 0x1EB3;
+ t['abrevetilde'] = 0x1EB5;
+ t['acaron'] = 0x01CE;
+ t['acircle'] = 0x24D0;
+ t['acircumflex'] = 0x00E2;
+ t['acircumflexacute'] = 0x1EA5;
+ t['acircumflexdotbelow'] = 0x1EAD;
+ t['acircumflexgrave'] = 0x1EA7;
+ t['acircumflexhookabove'] = 0x1EA9;
+ t['acircumflextilde'] = 0x1EAB;
+ t['acute'] = 0x00B4;
+ t['acutebelowcmb'] = 0x0317;
+ t['acutecmb'] = 0x0301;
+ t['acutecomb'] = 0x0301;
+ t['acutedeva'] = 0x0954;
+ t['acutelowmod'] = 0x02CF;
+ t['acutetonecmb'] = 0x0341;
+ t['acyrillic'] = 0x0430;
+ t['adblgrave'] = 0x0201;
+ t['addakgurmukhi'] = 0x0A71;
+ t['adeva'] = 0x0905;
+ t['adieresis'] = 0x00E4;
+ t['adieresiscyrillic'] = 0x04D3;
+ t['adieresismacron'] = 0x01DF;
+ t['adotbelow'] = 0x1EA1;
+ t['adotmacron'] = 0x01E1;
+ t['ae'] = 0x00E6;
+ t['aeacute'] = 0x01FD;
+ t['aekorean'] = 0x3150;
+ t['aemacron'] = 0x01E3;
+ t['afii00208'] = 0x2015;
+ t['afii08941'] = 0x20A4;
+ t['afii10017'] = 0x0410;
+ t['afii10018'] = 0x0411;
+ t['afii10019'] = 0x0412;
+ t['afii10020'] = 0x0413;
+ t['afii10021'] = 0x0414;
+ t['afii10022'] = 0x0415;
+ t['afii10023'] = 0x0401;
+ t['afii10024'] = 0x0416;
+ t['afii10025'] = 0x0417;
+ t['afii10026'] = 0x0418;
+ t['afii10027'] = 0x0419;
+ t['afii10028'] = 0x041A;
+ t['afii10029'] = 0x041B;
+ t['afii10030'] = 0x041C;
+ t['afii10031'] = 0x041D;
+ t['afii10032'] = 0x041E;
+ t['afii10033'] = 0x041F;
+ t['afii10034'] = 0x0420;
+ t['afii10035'] = 0x0421;
+ t['afii10036'] = 0x0422;
+ t['afii10037'] = 0x0423;
+ t['afii10038'] = 0x0424;
+ t['afii10039'] = 0x0425;
+ t['afii10040'] = 0x0426;
+ t['afii10041'] = 0x0427;
+ t['afii10042'] = 0x0428;
+ t['afii10043'] = 0x0429;
+ t['afii10044'] = 0x042A;
+ t['afii10045'] = 0x042B;
+ t['afii10046'] = 0x042C;
+ t['afii10047'] = 0x042D;
+ t['afii10048'] = 0x042E;
+ t['afii10049'] = 0x042F;
+ t['afii10050'] = 0x0490;
+ t['afii10051'] = 0x0402;
+ t['afii10052'] = 0x0403;
+ t['afii10053'] = 0x0404;
+ t['afii10054'] = 0x0405;
+ t['afii10055'] = 0x0406;
+ t['afii10056'] = 0x0407;
+ t['afii10057'] = 0x0408;
+ t['afii10058'] = 0x0409;
+ t['afii10059'] = 0x040A;
+ t['afii10060'] = 0x040B;
+ t['afii10061'] = 0x040C;
+ t['afii10062'] = 0x040E;
+ t['afii10063'] = 0xF6C4;
+ t['afii10064'] = 0xF6C5;
+ t['afii10065'] = 0x0430;
+ t['afii10066'] = 0x0431;
+ t['afii10067'] = 0x0432;
+ t['afii10068'] = 0x0433;
+ t['afii10069'] = 0x0434;
+ t['afii10070'] = 0x0435;
+ t['afii10071'] = 0x0451;
+ t['afii10072'] = 0x0436;
+ t['afii10073'] = 0x0437;
+ t['afii10074'] = 0x0438;
+ t['afii10075'] = 0x0439;
+ t['afii10076'] = 0x043A;
+ t['afii10077'] = 0x043B;
+ t['afii10078'] = 0x043C;
+ t['afii10079'] = 0x043D;
+ t['afii10080'] = 0x043E;
+ t['afii10081'] = 0x043F;
+ t['afii10082'] = 0x0440;
+ t['afii10083'] = 0x0441;
+ t['afii10084'] = 0x0442;
+ t['afii10085'] = 0x0443;
+ t['afii10086'] = 0x0444;
+ t['afii10087'] = 0x0445;
+ t['afii10088'] = 0x0446;
+ t['afii10089'] = 0x0447;
+ t['afii10090'] = 0x0448;
+ t['afii10091'] = 0x0449;
+ t['afii10092'] = 0x044A;
+ t['afii10093'] = 0x044B;
+ t['afii10094'] = 0x044C;
+ t['afii10095'] = 0x044D;
+ t['afii10096'] = 0x044E;
+ t['afii10097'] = 0x044F;
+ t['afii10098'] = 0x0491;
+ t['afii10099'] = 0x0452;
+ t['afii10100'] = 0x0453;
+ t['afii10101'] = 0x0454;
+ t['afii10102'] = 0x0455;
+ t['afii10103'] = 0x0456;
+ t['afii10104'] = 0x0457;
+ t['afii10105'] = 0x0458;
+ t['afii10106'] = 0x0459;
+ t['afii10107'] = 0x045A;
+ t['afii10108'] = 0x045B;
+ t['afii10109'] = 0x045C;
+ t['afii10110'] = 0x045E;
+ t['afii10145'] = 0x040F;
+ t['afii10146'] = 0x0462;
+ t['afii10147'] = 0x0472;
+ t['afii10148'] = 0x0474;
+ t['afii10192'] = 0xF6C6;
+ t['afii10193'] = 0x045F;
+ t['afii10194'] = 0x0463;
+ t['afii10195'] = 0x0473;
+ t['afii10196'] = 0x0475;
+ t['afii10831'] = 0xF6C7;
+ t['afii10832'] = 0xF6C8;
+ t['afii10846'] = 0x04D9;
+ t['afii299'] = 0x200E;
+ t['afii300'] = 0x200F;
+ t['afii301'] = 0x200D;
+ t['afii57381'] = 0x066A;
+ t['afii57388'] = 0x060C;
+ t['afii57392'] = 0x0660;
+ t['afii57393'] = 0x0661;
+ t['afii57394'] = 0x0662;
+ t['afii57395'] = 0x0663;
+ t['afii57396'] = 0x0664;
+ t['afii57397'] = 0x0665;
+ t['afii57398'] = 0x0666;
+ t['afii57399'] = 0x0667;
+ t['afii57400'] = 0x0668;
+ t['afii57401'] = 0x0669;
+ t['afii57403'] = 0x061B;
+ t['afii57407'] = 0x061F;
+ t['afii57409'] = 0x0621;
+ t['afii57410'] = 0x0622;
+ t['afii57411'] = 0x0623;
+ t['afii57412'] = 0x0624;
+ t['afii57413'] = 0x0625;
+ t['afii57414'] = 0x0626;
+ t['afii57415'] = 0x0627;
+ t['afii57416'] = 0x0628;
+ t['afii57417'] = 0x0629;
+ t['afii57418'] = 0x062A;
+ t['afii57419'] = 0x062B;
+ t['afii57420'] = 0x062C;
+ t['afii57421'] = 0x062D;
+ t['afii57422'] = 0x062E;
+ t['afii57423'] = 0x062F;
+ t['afii57424'] = 0x0630;
+ t['afii57425'] = 0x0631;
+ t['afii57426'] = 0x0632;
+ t['afii57427'] = 0x0633;
+ t['afii57428'] = 0x0634;
+ t['afii57429'] = 0x0635;
+ t['afii57430'] = 0x0636;
+ t['afii57431'] = 0x0637;
+ t['afii57432'] = 0x0638;
+ t['afii57433'] = 0x0639;
+ t['afii57434'] = 0x063A;
+ t['afii57440'] = 0x0640;
+ t['afii57441'] = 0x0641;
+ t['afii57442'] = 0x0642;
+ t['afii57443'] = 0x0643;
+ t['afii57444'] = 0x0644;
+ t['afii57445'] = 0x0645;
+ t['afii57446'] = 0x0646;
+ t['afii57448'] = 0x0648;
+ t['afii57449'] = 0x0649;
+ t['afii57450'] = 0x064A;
+ t['afii57451'] = 0x064B;
+ t['afii57452'] = 0x064C;
+ t['afii57453'] = 0x064D;
+ t['afii57454'] = 0x064E;
+ t['afii57455'] = 0x064F;
+ t['afii57456'] = 0x0650;
+ t['afii57457'] = 0x0651;
+ t['afii57458'] = 0x0652;
+ t['afii57470'] = 0x0647;
+ t['afii57505'] = 0x06A4;
+ t['afii57506'] = 0x067E;
+ t['afii57507'] = 0x0686;
+ t['afii57508'] = 0x0698;
+ t['afii57509'] = 0x06AF;
+ t['afii57511'] = 0x0679;
+ t['afii57512'] = 0x0688;
+ t['afii57513'] = 0x0691;
+ t['afii57514'] = 0x06BA;
+ t['afii57519'] = 0x06D2;
+ t['afii57534'] = 0x06D5;
+ t['afii57636'] = 0x20AA;
+ t['afii57645'] = 0x05BE;
+ t['afii57658'] = 0x05C3;
+ t['afii57664'] = 0x05D0;
+ t['afii57665'] = 0x05D1;
+ t['afii57666'] = 0x05D2;
+ t['afii57667'] = 0x05D3;
+ t['afii57668'] = 0x05D4;
+ t['afii57669'] = 0x05D5;
+ t['afii57670'] = 0x05D6;
+ t['afii57671'] = 0x05D7;
+ t['afii57672'] = 0x05D8;
+ t['afii57673'] = 0x05D9;
+ t['afii57674'] = 0x05DA;
+ t['afii57675'] = 0x05DB;
+ t['afii57676'] = 0x05DC;
+ t['afii57677'] = 0x05DD;
+ t['afii57678'] = 0x05DE;
+ t['afii57679'] = 0x05DF;
+ t['afii57680'] = 0x05E0;
+ t['afii57681'] = 0x05E1;
+ t['afii57682'] = 0x05E2;
+ t['afii57683'] = 0x05E3;
+ t['afii57684'] = 0x05E4;
+ t['afii57685'] = 0x05E5;
+ t['afii57686'] = 0x05E6;
+ t['afii57687'] = 0x05E7;
+ t['afii57688'] = 0x05E8;
+ t['afii57689'] = 0x05E9;
+ t['afii57690'] = 0x05EA;
+ t['afii57694'] = 0xFB2A;
+ t['afii57695'] = 0xFB2B;
+ t['afii57700'] = 0xFB4B;
+ t['afii57705'] = 0xFB1F;
+ t['afii57716'] = 0x05F0;
+ t['afii57717'] = 0x05F1;
+ t['afii57718'] = 0x05F2;
+ t['afii57723'] = 0xFB35;
+ t['afii57793'] = 0x05B4;
+ t['afii57794'] = 0x05B5;
+ t['afii57795'] = 0x05B6;
+ t['afii57796'] = 0x05BB;
+ t['afii57797'] = 0x05B8;
+ t['afii57798'] = 0x05B7;
+ t['afii57799'] = 0x05B0;
+ t['afii57800'] = 0x05B2;
+ t['afii57801'] = 0x05B1;
+ t['afii57802'] = 0x05B3;
+ t['afii57803'] = 0x05C2;
+ t['afii57804'] = 0x05C1;
+ t['afii57806'] = 0x05B9;
+ t['afii57807'] = 0x05BC;
+ t['afii57839'] = 0x05BD;
+ t['afii57841'] = 0x05BF;
+ t['afii57842'] = 0x05C0;
+ t['afii57929'] = 0x02BC;
+ t['afii61248'] = 0x2105;
+ t['afii61289'] = 0x2113;
+ t['afii61352'] = 0x2116;
+ t['afii61573'] = 0x202C;
+ t['afii61574'] = 0x202D;
+ t['afii61575'] = 0x202E;
+ t['afii61664'] = 0x200C;
+ t['afii63167'] = 0x066D;
+ t['afii64937'] = 0x02BD;
+ t['agrave'] = 0x00E0;
+ t['agujarati'] = 0x0A85;
+ t['agurmukhi'] = 0x0A05;
+ t['ahiragana'] = 0x3042;
+ t['ahookabove'] = 0x1EA3;
+ t['aibengali'] = 0x0990;
+ t['aibopomofo'] = 0x311E;
+ t['aideva'] = 0x0910;
+ t['aiecyrillic'] = 0x04D5;
+ t['aigujarati'] = 0x0A90;
+ t['aigurmukhi'] = 0x0A10;
+ t['aimatragurmukhi'] = 0x0A48;
+ t['ainarabic'] = 0x0639;
+ t['ainfinalarabic'] = 0xFECA;
+ t['aininitialarabic'] = 0xFECB;
+ t['ainmedialarabic'] = 0xFECC;
+ t['ainvertedbreve'] = 0x0203;
+ t['aivowelsignbengali'] = 0x09C8;
+ t['aivowelsigndeva'] = 0x0948;
+ t['aivowelsigngujarati'] = 0x0AC8;
+ t['akatakana'] = 0x30A2;
+ t['akatakanahalfwidth'] = 0xFF71;
+ t['akorean'] = 0x314F;
+ t['alef'] = 0x05D0;
+ t['alefarabic'] = 0x0627;
+ t['alefdageshhebrew'] = 0xFB30;
+ t['aleffinalarabic'] = 0xFE8E;
+ t['alefhamzaabovearabic'] = 0x0623;
+ t['alefhamzaabovefinalarabic'] = 0xFE84;
+ t['alefhamzabelowarabic'] = 0x0625;
+ t['alefhamzabelowfinalarabic'] = 0xFE88;
+ t['alefhebrew'] = 0x05D0;
+ t['aleflamedhebrew'] = 0xFB4F;
+ t['alefmaddaabovearabic'] = 0x0622;
+ t['alefmaddaabovefinalarabic'] = 0xFE82;
+ t['alefmaksuraarabic'] = 0x0649;
+ t['alefmaksurafinalarabic'] = 0xFEF0;
+ t['alefmaksurainitialarabic'] = 0xFEF3;
+ t['alefmaksuramedialarabic'] = 0xFEF4;
+ t['alefpatahhebrew'] = 0xFB2E;
+ t['alefqamatshebrew'] = 0xFB2F;
+ t['aleph'] = 0x2135;
+ t['allequal'] = 0x224C;
+ t['alpha'] = 0x03B1;
+ t['alphatonos'] = 0x03AC;
+ t['amacron'] = 0x0101;
+ t['amonospace'] = 0xFF41;
+ t['ampersand'] = 0x0026;
+ t['ampersandmonospace'] = 0xFF06;
+ t['ampersandsmall'] = 0xF726;
+ t['amsquare'] = 0x33C2;
+ t['anbopomofo'] = 0x3122;
+ t['angbopomofo'] = 0x3124;
+ t['angbracketleft'] = 0x3008;
+ t['angbracketright'] = 0x3009;
+ t['angkhankhuthai'] = 0x0E5A;
+ t['angle'] = 0x2220;
+ t['anglebracketleft'] = 0x3008;
+ t['anglebracketleftvertical'] = 0xFE3F;
+ t['anglebracketright'] = 0x3009;
+ t['anglebracketrightvertical'] = 0xFE40;
+ t['angleleft'] = 0x2329;
+ t['angleright'] = 0x232A;
+ t['angstrom'] = 0x212B;
+ t['anoteleia'] = 0x0387;
+ t['anudattadeva'] = 0x0952;
+ t['anusvarabengali'] = 0x0982;
+ t['anusvaradeva'] = 0x0902;
+ t['anusvaragujarati'] = 0x0A82;
+ t['aogonek'] = 0x0105;
+ t['apaatosquare'] = 0x3300;
+ t['aparen'] = 0x249C;
+ t['apostrophearmenian'] = 0x055A;
+ t['apostrophemod'] = 0x02BC;
+ t['apple'] = 0xF8FF;
+ t['approaches'] = 0x2250;
+ t['approxequal'] = 0x2248;
+ t['approxequalorimage'] = 0x2252;
+ t['approximatelyequal'] = 0x2245;
+ t['araeaekorean'] = 0x318E;
+ t['araeakorean'] = 0x318D;
+ t['arc'] = 0x2312;
+ t['arighthalfring'] = 0x1E9A;
+ t['aring'] = 0x00E5;
+ t['aringacute'] = 0x01FB;
+ t['aringbelow'] = 0x1E01;
+ t['arrowboth'] = 0x2194;
+ t['arrowdashdown'] = 0x21E3;
+ t['arrowdashleft'] = 0x21E0;
+ t['arrowdashright'] = 0x21E2;
+ t['arrowdashup'] = 0x21E1;
+ t['arrowdblboth'] = 0x21D4;
+ t['arrowdbldown'] = 0x21D3;
+ t['arrowdblleft'] = 0x21D0;
+ t['arrowdblright'] = 0x21D2;
+ t['arrowdblup'] = 0x21D1;
+ t['arrowdown'] = 0x2193;
+ t['arrowdownleft'] = 0x2199;
+ t['arrowdownright'] = 0x2198;
+ t['arrowdownwhite'] = 0x21E9;
+ t['arrowheaddownmod'] = 0x02C5;
+ t['arrowheadleftmod'] = 0x02C2;
+ t['arrowheadrightmod'] = 0x02C3;
+ t['arrowheadupmod'] = 0x02C4;
+ t['arrowhorizex'] = 0xF8E7;
+ t['arrowleft'] = 0x2190;
+ t['arrowleftdbl'] = 0x21D0;
+ t['arrowleftdblstroke'] = 0x21CD;
+ t['arrowleftoverright'] = 0x21C6;
+ t['arrowleftwhite'] = 0x21E6;
+ t['arrowright'] = 0x2192;
+ t['arrowrightdblstroke'] = 0x21CF;
+ t['arrowrightheavy'] = 0x279E;
+ t['arrowrightoverleft'] = 0x21C4;
+ t['arrowrightwhite'] = 0x21E8;
+ t['arrowtableft'] = 0x21E4;
+ t['arrowtabright'] = 0x21E5;
+ t['arrowup'] = 0x2191;
+ t['arrowupdn'] = 0x2195;
+ t['arrowupdnbse'] = 0x21A8;
+ t['arrowupdownbase'] = 0x21A8;
+ t['arrowupleft'] = 0x2196;
+ t['arrowupleftofdown'] = 0x21C5;
+ t['arrowupright'] = 0x2197;
+ t['arrowupwhite'] = 0x21E7;
+ t['arrowvertex'] = 0xF8E6;
+ t['asciicircum'] = 0x005E;
+ t['asciicircummonospace'] = 0xFF3E;
+ t['asciitilde'] = 0x007E;
+ t['asciitildemonospace'] = 0xFF5E;
+ t['ascript'] = 0x0251;
+ t['ascriptturned'] = 0x0252;
+ t['asmallhiragana'] = 0x3041;
+ t['asmallkatakana'] = 0x30A1;
+ t['asmallkatakanahalfwidth'] = 0xFF67;
+ t['asterisk'] = 0x002A;
+ t['asteriskaltonearabic'] = 0x066D;
+ t['asteriskarabic'] = 0x066D;
+ t['asteriskmath'] = 0x2217;
+ t['asteriskmonospace'] = 0xFF0A;
+ t['asterisksmall'] = 0xFE61;
+ t['asterism'] = 0x2042;
+ t['asuperior'] = 0xF6E9;
+ t['asymptoticallyequal'] = 0x2243;
+ t['at'] = 0x0040;
+ t['atilde'] = 0x00E3;
+ t['atmonospace'] = 0xFF20;
+ t['atsmall'] = 0xFE6B;
+ t['aturned'] = 0x0250;
+ t['aubengali'] = 0x0994;
+ t['aubopomofo'] = 0x3120;
+ t['audeva'] = 0x0914;
+ t['augujarati'] = 0x0A94;
+ t['augurmukhi'] = 0x0A14;
+ t['aulengthmarkbengali'] = 0x09D7;
+ t['aumatragurmukhi'] = 0x0A4C;
+ t['auvowelsignbengali'] = 0x09CC;
+ t['auvowelsigndeva'] = 0x094C;
+ t['auvowelsigngujarati'] = 0x0ACC;
+ t['avagrahadeva'] = 0x093D;
+ t['aybarmenian'] = 0x0561;
+ t['ayin'] = 0x05E2;
+ t['ayinaltonehebrew'] = 0xFB20;
+ t['ayinhebrew'] = 0x05E2;
+ t['b'] = 0x0062;
+ t['babengali'] = 0x09AC;
+ t['backslash'] = 0x005C;
+ t['backslashmonospace'] = 0xFF3C;
+ t['badeva'] = 0x092C;
+ t['bagujarati'] = 0x0AAC;
+ t['bagurmukhi'] = 0x0A2C;
+ t['bahiragana'] = 0x3070;
+ t['bahtthai'] = 0x0E3F;
+ t['bakatakana'] = 0x30D0;
+ t['bar'] = 0x007C;
+ t['barmonospace'] = 0xFF5C;
+ t['bbopomofo'] = 0x3105;
+ t['bcircle'] = 0x24D1;
+ t['bdotaccent'] = 0x1E03;
+ t['bdotbelow'] = 0x1E05;
+ t['beamedsixteenthnotes'] = 0x266C;
+ t['because'] = 0x2235;
+ t['becyrillic'] = 0x0431;
+ t['beharabic'] = 0x0628;
+ t['behfinalarabic'] = 0xFE90;
+ t['behinitialarabic'] = 0xFE91;
+ t['behiragana'] = 0x3079;
+ t['behmedialarabic'] = 0xFE92;
+ t['behmeeminitialarabic'] = 0xFC9F;
+ t['behmeemisolatedarabic'] = 0xFC08;
+ t['behnoonfinalarabic'] = 0xFC6D;
+ t['bekatakana'] = 0x30D9;
+ t['benarmenian'] = 0x0562;
+ t['bet'] = 0x05D1;
+ t['beta'] = 0x03B2;
+ t['betasymbolgreek'] = 0x03D0;
+ t['betdagesh'] = 0xFB31;
+ t['betdageshhebrew'] = 0xFB31;
+ t['bethebrew'] = 0x05D1;
+ t['betrafehebrew'] = 0xFB4C;
+ t['bhabengali'] = 0x09AD;
+ t['bhadeva'] = 0x092D;
+ t['bhagujarati'] = 0x0AAD;
+ t['bhagurmukhi'] = 0x0A2D;
+ t['bhook'] = 0x0253;
+ t['bihiragana'] = 0x3073;
+ t['bikatakana'] = 0x30D3;
+ t['bilabialclick'] = 0x0298;
+ t['bindigurmukhi'] = 0x0A02;
+ t['birusquare'] = 0x3331;
+ t['blackcircle'] = 0x25CF;
+ t['blackdiamond'] = 0x25C6;
+ t['blackdownpointingtriangle'] = 0x25BC;
+ t['blackleftpointingpointer'] = 0x25C4;
+ t['blackleftpointingtriangle'] = 0x25C0;
+ t['blacklenticularbracketleft'] = 0x3010;
+ t['blacklenticularbracketleftvertical'] = 0xFE3B;
+ t['blacklenticularbracketright'] = 0x3011;
+ t['blacklenticularbracketrightvertical'] = 0xFE3C;
+ t['blacklowerlefttriangle'] = 0x25E3;
+ t['blacklowerrighttriangle'] = 0x25E2;
+ t['blackrectangle'] = 0x25AC;
+ t['blackrightpointingpointer'] = 0x25BA;
+ t['blackrightpointingtriangle'] = 0x25B6;
+ t['blacksmallsquare'] = 0x25AA;
+ t['blacksmilingface'] = 0x263B;
+ t['blacksquare'] = 0x25A0;
+ t['blackstar'] = 0x2605;
+ t['blackupperlefttriangle'] = 0x25E4;
+ t['blackupperrighttriangle'] = 0x25E5;
+ t['blackuppointingsmalltriangle'] = 0x25B4;
+ t['blackuppointingtriangle'] = 0x25B2;
+ t['blank'] = 0x2423;
+ t['blinebelow'] = 0x1E07;
+ t['block'] = 0x2588;
+ t['bmonospace'] = 0xFF42;
+ t['bobaimaithai'] = 0x0E1A;
+ t['bohiragana'] = 0x307C;
+ t['bokatakana'] = 0x30DC;
+ t['bparen'] = 0x249D;
+ t['bqsquare'] = 0x33C3;
+ t['braceex'] = 0xF8F4;
+ t['braceleft'] = 0x007B;
+ t['braceleftbt'] = 0xF8F3;
+ t['braceleftmid'] = 0xF8F2;
+ t['braceleftmonospace'] = 0xFF5B;
+ t['braceleftsmall'] = 0xFE5B;
+ t['bracelefttp'] = 0xF8F1;
+ t['braceleftvertical'] = 0xFE37;
+ t['braceright'] = 0x007D;
+ t['bracerightbt'] = 0xF8FE;
+ t['bracerightmid'] = 0xF8FD;
+ t['bracerightmonospace'] = 0xFF5D;
+ t['bracerightsmall'] = 0xFE5C;
+ t['bracerighttp'] = 0xF8FC;
+ t['bracerightvertical'] = 0xFE38;
+ t['bracketleft'] = 0x005B;
+ t['bracketleftbt'] = 0xF8F0;
+ t['bracketleftex'] = 0xF8EF;
+ t['bracketleftmonospace'] = 0xFF3B;
+ t['bracketlefttp'] = 0xF8EE;
+ t['bracketright'] = 0x005D;
+ t['bracketrightbt'] = 0xF8FB;
+ t['bracketrightex'] = 0xF8FA;
+ t['bracketrightmonospace'] = 0xFF3D;
+ t['bracketrighttp'] = 0xF8F9;
+ t['breve'] = 0x02D8;
+ t['brevebelowcmb'] = 0x032E;
+ t['brevecmb'] = 0x0306;
+ t['breveinvertedbelowcmb'] = 0x032F;
+ t['breveinvertedcmb'] = 0x0311;
+ t['breveinverteddoublecmb'] = 0x0361;
+ t['bridgebelowcmb'] = 0x032A;
+ t['bridgeinvertedbelowcmb'] = 0x033A;
+ t['brokenbar'] = 0x00A6;
+ t['bstroke'] = 0x0180;
+ t['bsuperior'] = 0xF6EA;
+ t['btopbar'] = 0x0183;
+ t['buhiragana'] = 0x3076;
+ t['bukatakana'] = 0x30D6;
+ t['bullet'] = 0x2022;
+ t['bulletinverse'] = 0x25D8;
+ t['bulletoperator'] = 0x2219;
+ t['bullseye'] = 0x25CE;
+ t['c'] = 0x0063;
+ t['caarmenian'] = 0x056E;
+ t['cabengali'] = 0x099A;
+ t['cacute'] = 0x0107;
+ t['cadeva'] = 0x091A;
+ t['cagujarati'] = 0x0A9A;
+ t['cagurmukhi'] = 0x0A1A;
+ t['calsquare'] = 0x3388;
+ t['candrabindubengali'] = 0x0981;
+ t['candrabinducmb'] = 0x0310;
+ t['candrabindudeva'] = 0x0901;
+ t['candrabindugujarati'] = 0x0A81;
+ t['capslock'] = 0x21EA;
+ t['careof'] = 0x2105;
+ t['caron'] = 0x02C7;
+ t['caronbelowcmb'] = 0x032C;
+ t['caroncmb'] = 0x030C;
+ t['carriagereturn'] = 0x21B5;
+ t['cbopomofo'] = 0x3118;
+ t['ccaron'] = 0x010D;
+ t['ccedilla'] = 0x00E7;
+ t['ccedillaacute'] = 0x1E09;
+ t['ccircle'] = 0x24D2;
+ t['ccircumflex'] = 0x0109;
+ t['ccurl'] = 0x0255;
+ t['cdot'] = 0x010B;
+ t['cdotaccent'] = 0x010B;
+ t['cdsquare'] = 0x33C5;
+ t['cedilla'] = 0x00B8;
+ t['cedillacmb'] = 0x0327;
+ t['cent'] = 0x00A2;
+ t['centigrade'] = 0x2103;
+ t['centinferior'] = 0xF6DF;
+ t['centmonospace'] = 0xFFE0;
+ t['centoldstyle'] = 0xF7A2;
+ t['centsuperior'] = 0xF6E0;
+ t['chaarmenian'] = 0x0579;
+ t['chabengali'] = 0x099B;
+ t['chadeva'] = 0x091B;
+ t['chagujarati'] = 0x0A9B;
+ t['chagurmukhi'] = 0x0A1B;
+ t['chbopomofo'] = 0x3114;
+ t['cheabkhasiancyrillic'] = 0x04BD;
+ t['checkmark'] = 0x2713;
+ t['checyrillic'] = 0x0447;
+ t['chedescenderabkhasiancyrillic'] = 0x04BF;
+ t['chedescendercyrillic'] = 0x04B7;
+ t['chedieresiscyrillic'] = 0x04F5;
+ t['cheharmenian'] = 0x0573;
+ t['chekhakassiancyrillic'] = 0x04CC;
+ t['cheverticalstrokecyrillic'] = 0x04B9;
+ t['chi'] = 0x03C7;
+ t['chieuchacirclekorean'] = 0x3277;
+ t['chieuchaparenkorean'] = 0x3217;
+ t['chieuchcirclekorean'] = 0x3269;
+ t['chieuchkorean'] = 0x314A;
+ t['chieuchparenkorean'] = 0x3209;
+ t['chochangthai'] = 0x0E0A;
+ t['chochanthai'] = 0x0E08;
+ t['chochingthai'] = 0x0E09;
+ t['chochoethai'] = 0x0E0C;
+ t['chook'] = 0x0188;
+ t['cieucacirclekorean'] = 0x3276;
+ t['cieucaparenkorean'] = 0x3216;
+ t['cieuccirclekorean'] = 0x3268;
+ t['cieuckorean'] = 0x3148;
+ t['cieucparenkorean'] = 0x3208;
+ t['cieucuparenkorean'] = 0x321C;
+ t['circle'] = 0x25CB;
+ t['circlecopyrt'] = 0x00A9;
+ t['circlemultiply'] = 0x2297;
+ t['circleot'] = 0x2299;
+ t['circleplus'] = 0x2295;
+ t['circlepostalmark'] = 0x3036;
+ t['circlewithlefthalfblack'] = 0x25D0;
+ t['circlewithrighthalfblack'] = 0x25D1;
+ t['circumflex'] = 0x02C6;
+ t['circumflexbelowcmb'] = 0x032D;
+ t['circumflexcmb'] = 0x0302;
+ t['clear'] = 0x2327;
+ t['clickalveolar'] = 0x01C2;
+ t['clickdental'] = 0x01C0;
+ t['clicklateral'] = 0x01C1;
+ t['clickretroflex'] = 0x01C3;
+ t['club'] = 0x2663;
+ t['clubsuitblack'] = 0x2663;
+ t['clubsuitwhite'] = 0x2667;
+ t['cmcubedsquare'] = 0x33A4;
+ t['cmonospace'] = 0xFF43;
+ t['cmsquaredsquare'] = 0x33A0;
+ t['coarmenian'] = 0x0581;
+ t['colon'] = 0x003A;
+ t['colonmonetary'] = 0x20A1;
+ t['colonmonospace'] = 0xFF1A;
+ t['colonsign'] = 0x20A1;
+ t['colonsmall'] = 0xFE55;
+ t['colontriangularhalfmod'] = 0x02D1;
+ t['colontriangularmod'] = 0x02D0;
+ t['comma'] = 0x002C;
+ t['commaabovecmb'] = 0x0313;
+ t['commaaboverightcmb'] = 0x0315;
+ t['commaaccent'] = 0xF6C3;
+ t['commaarabic'] = 0x060C;
+ t['commaarmenian'] = 0x055D;
+ t['commainferior'] = 0xF6E1;
+ t['commamonospace'] = 0xFF0C;
+ t['commareversedabovecmb'] = 0x0314;
+ t['commareversedmod'] = 0x02BD;
+ t['commasmall'] = 0xFE50;
+ t['commasuperior'] = 0xF6E2;
+ t['commaturnedabovecmb'] = 0x0312;
+ t['commaturnedmod'] = 0x02BB;
+ t['compass'] = 0x263C;
+ t['congruent'] = 0x2245;
+ t['contourintegral'] = 0x222E;
+ t['control'] = 0x2303;
+ t['controlACK'] = 0x0006;
+ t['controlBEL'] = 0x0007;
+ t['controlBS'] = 0x0008;
+ t['controlCAN'] = 0x0018;
+ t['controlCR'] = 0x000D;
+ t['controlDC1'] = 0x0011;
+ t['controlDC2'] = 0x0012;
+ t['controlDC3'] = 0x0013;
+ t['controlDC4'] = 0x0014;
+ t['controlDEL'] = 0x007F;
+ t['controlDLE'] = 0x0010;
+ t['controlEM'] = 0x0019;
+ t['controlENQ'] = 0x0005;
+ t['controlEOT'] = 0x0004;
+ t['controlESC'] = 0x001B;
+ t['controlETB'] = 0x0017;
+ t['controlETX'] = 0x0003;
+ t['controlFF'] = 0x000C;
+ t['controlFS'] = 0x001C;
+ t['controlGS'] = 0x001D;
+ t['controlHT'] = 0x0009;
+ t['controlLF'] = 0x000A;
+ t['controlNAK'] = 0x0015;
+ t['controlNULL'] = 0x0000;
+ t['controlRS'] = 0x001E;
+ t['controlSI'] = 0x000F;
+ t['controlSO'] = 0x000E;
+ t['controlSOT'] = 0x0002;
+ t['controlSTX'] = 0x0001;
+ t['controlSUB'] = 0x001A;
+ t['controlSYN'] = 0x0016;
+ t['controlUS'] = 0x001F;
+ t['controlVT'] = 0x000B;
+ t['copyright'] = 0x00A9;
+ t['copyrightsans'] = 0xF8E9;
+ t['copyrightserif'] = 0xF6D9;
+ t['cornerbracketleft'] = 0x300C;
+ t['cornerbracketlefthalfwidth'] = 0xFF62;
+ t['cornerbracketleftvertical'] = 0xFE41;
+ t['cornerbracketright'] = 0x300D;
+ t['cornerbracketrighthalfwidth'] = 0xFF63;
+ t['cornerbracketrightvertical'] = 0xFE42;
+ t['corporationsquare'] = 0x337F;
+ t['cosquare'] = 0x33C7;
+ t['coverkgsquare'] = 0x33C6;
+ t['cparen'] = 0x249E;
+ t['cruzeiro'] = 0x20A2;
+ t['cstretched'] = 0x0297;
+ t['curlyand'] = 0x22CF;
+ t['curlyor'] = 0x22CE;
+ t['currency'] = 0x00A4;
+ t['cyrBreve'] = 0xF6D1;
+ t['cyrFlex'] = 0xF6D2;
+ t['cyrbreve'] = 0xF6D4;
+ t['cyrflex'] = 0xF6D5;
+ t['d'] = 0x0064;
+ t['daarmenian'] = 0x0564;
+ t['dabengali'] = 0x09A6;
+ t['dadarabic'] = 0x0636;
+ t['dadeva'] = 0x0926;
+ t['dadfinalarabic'] = 0xFEBE;
+ t['dadinitialarabic'] = 0xFEBF;
+ t['dadmedialarabic'] = 0xFEC0;
+ t['dagesh'] = 0x05BC;
+ t['dageshhebrew'] = 0x05BC;
+ t['dagger'] = 0x2020;
+ t['daggerdbl'] = 0x2021;
+ t['dagujarati'] = 0x0AA6;
+ t['dagurmukhi'] = 0x0A26;
+ t['dahiragana'] = 0x3060;
+ t['dakatakana'] = 0x30C0;
+ t['dalarabic'] = 0x062F;
+ t['dalet'] = 0x05D3;
+ t['daletdagesh'] = 0xFB33;
+ t['daletdageshhebrew'] = 0xFB33;
+ t['dalethebrew'] = 0x05D3;
+ t['dalfinalarabic'] = 0xFEAA;
+ t['dammaarabic'] = 0x064F;
+ t['dammalowarabic'] = 0x064F;
+ t['dammatanaltonearabic'] = 0x064C;
+ t['dammatanarabic'] = 0x064C;
+ t['danda'] = 0x0964;
+ t['dargahebrew'] = 0x05A7;
+ t['dargalefthebrew'] = 0x05A7;
+ t['dasiapneumatacyrilliccmb'] = 0x0485;
+ t['dblGrave'] = 0xF6D3;
+ t['dblanglebracketleft'] = 0x300A;
+ t['dblanglebracketleftvertical'] = 0xFE3D;
+ t['dblanglebracketright'] = 0x300B;
+ t['dblanglebracketrightvertical'] = 0xFE3E;
+ t['dblarchinvertedbelowcmb'] = 0x032B;
+ t['dblarrowleft'] = 0x21D4;
+ t['dblarrowright'] = 0x21D2;
+ t['dbldanda'] = 0x0965;
+ t['dblgrave'] = 0xF6D6;
+ t['dblgravecmb'] = 0x030F;
+ t['dblintegral'] = 0x222C;
+ t['dbllowline'] = 0x2017;
+ t['dbllowlinecmb'] = 0x0333;
+ t['dbloverlinecmb'] = 0x033F;
+ t['dblprimemod'] = 0x02BA;
+ t['dblverticalbar'] = 0x2016;
+ t['dblverticallineabovecmb'] = 0x030E;
+ t['dbopomofo'] = 0x3109;
+ t['dbsquare'] = 0x33C8;
+ t['dcaron'] = 0x010F;
+ t['dcedilla'] = 0x1E11;
+ t['dcircle'] = 0x24D3;
+ t['dcircumflexbelow'] = 0x1E13;
+ t['dcroat'] = 0x0111;
+ t['ddabengali'] = 0x09A1;
+ t['ddadeva'] = 0x0921;
+ t['ddagujarati'] = 0x0AA1;
+ t['ddagurmukhi'] = 0x0A21;
+ t['ddalarabic'] = 0x0688;
+ t['ddalfinalarabic'] = 0xFB89;
+ t['dddhadeva'] = 0x095C;
+ t['ddhabengali'] = 0x09A2;
+ t['ddhadeva'] = 0x0922;
+ t['ddhagujarati'] = 0x0AA2;
+ t['ddhagurmukhi'] = 0x0A22;
+ t['ddotaccent'] = 0x1E0B;
+ t['ddotbelow'] = 0x1E0D;
+ t['decimalseparatorarabic'] = 0x066B;
+ t['decimalseparatorpersian'] = 0x066B;
+ t['decyrillic'] = 0x0434;
+ t['degree'] = 0x00B0;
+ t['dehihebrew'] = 0x05AD;
+ t['dehiragana'] = 0x3067;
+ t['deicoptic'] = 0x03EF;
+ t['dekatakana'] = 0x30C7;
+ t['deleteleft'] = 0x232B;
+ t['deleteright'] = 0x2326;
+ t['delta'] = 0x03B4;
+ t['deltaturned'] = 0x018D;
+ t['denominatorminusonenumeratorbengali'] = 0x09F8;
+ t['dezh'] = 0x02A4;
+ t['dhabengali'] = 0x09A7;
+ t['dhadeva'] = 0x0927;
+ t['dhagujarati'] = 0x0AA7;
+ t['dhagurmukhi'] = 0x0A27;
+ t['dhook'] = 0x0257;
+ t['dialytikatonos'] = 0x0385;
+ t['dialytikatonoscmb'] = 0x0344;
+ t['diamond'] = 0x2666;
+ t['diamondsuitwhite'] = 0x2662;
+ t['dieresis'] = 0x00A8;
+ t['dieresisacute'] = 0xF6D7;
+ t['dieresisbelowcmb'] = 0x0324;
+ t['dieresiscmb'] = 0x0308;
+ t['dieresisgrave'] = 0xF6D8;
+ t['dieresistonos'] = 0x0385;
+ t['dihiragana'] = 0x3062;
+ t['dikatakana'] = 0x30C2;
+ t['dittomark'] = 0x3003;
+ t['divide'] = 0x00F7;
+ t['divides'] = 0x2223;
+ t['divisionslash'] = 0x2215;
+ t['djecyrillic'] = 0x0452;
+ t['dkshade'] = 0x2593;
+ t['dlinebelow'] = 0x1E0F;
+ t['dlsquare'] = 0x3397;
+ t['dmacron'] = 0x0111;
+ t['dmonospace'] = 0xFF44;
+ t['dnblock'] = 0x2584;
+ t['dochadathai'] = 0x0E0E;
+ t['dodekthai'] = 0x0E14;
+ t['dohiragana'] = 0x3069;
+ t['dokatakana'] = 0x30C9;
+ t['dollar'] = 0x0024;
+ t['dollarinferior'] = 0xF6E3;
+ t['dollarmonospace'] = 0xFF04;
+ t['dollaroldstyle'] = 0xF724;
+ t['dollarsmall'] = 0xFE69;
+ t['dollarsuperior'] = 0xF6E4;
+ t['dong'] = 0x20AB;
+ t['dorusquare'] = 0x3326;
+ t['dotaccent'] = 0x02D9;
+ t['dotaccentcmb'] = 0x0307;
+ t['dotbelowcmb'] = 0x0323;
+ t['dotbelowcomb'] = 0x0323;
+ t['dotkatakana'] = 0x30FB;
+ t['dotlessi'] = 0x0131;
+ t['dotlessj'] = 0xF6BE;
+ t['dotlessjstrokehook'] = 0x0284;
+ t['dotmath'] = 0x22C5;
+ t['dottedcircle'] = 0x25CC;
+ t['doubleyodpatah'] = 0xFB1F;
+ t['doubleyodpatahhebrew'] = 0xFB1F;
+ t['downtackbelowcmb'] = 0x031E;
+ t['downtackmod'] = 0x02D5;
+ t['dparen'] = 0x249F;
+ t['dsuperior'] = 0xF6EB;
+ t['dtail'] = 0x0256;
+ t['dtopbar'] = 0x018C;
+ t['duhiragana'] = 0x3065;
+ t['dukatakana'] = 0x30C5;
+ t['dz'] = 0x01F3;
+ t['dzaltone'] = 0x02A3;
+ t['dzcaron'] = 0x01C6;
+ t['dzcurl'] = 0x02A5;
+ t['dzeabkhasiancyrillic'] = 0x04E1;
+ t['dzecyrillic'] = 0x0455;
+ t['dzhecyrillic'] = 0x045F;
+ t['e'] = 0x0065;
+ t['eacute'] = 0x00E9;
+ t['earth'] = 0x2641;
+ t['ebengali'] = 0x098F;
+ t['ebopomofo'] = 0x311C;
+ t['ebreve'] = 0x0115;
+ t['ecandradeva'] = 0x090D;
+ t['ecandragujarati'] = 0x0A8D;
+ t['ecandravowelsigndeva'] = 0x0945;
+ t['ecandravowelsigngujarati'] = 0x0AC5;
+ t['ecaron'] = 0x011B;
+ t['ecedillabreve'] = 0x1E1D;
+ t['echarmenian'] = 0x0565;
+ t['echyiwnarmenian'] = 0x0587;
+ t['ecircle'] = 0x24D4;
+ t['ecircumflex'] = 0x00EA;
+ t['ecircumflexacute'] = 0x1EBF;
+ t['ecircumflexbelow'] = 0x1E19;
+ t['ecircumflexdotbelow'] = 0x1EC7;
+ t['ecircumflexgrave'] = 0x1EC1;
+ t['ecircumflexhookabove'] = 0x1EC3;
+ t['ecircumflextilde'] = 0x1EC5;
+ t['ecyrillic'] = 0x0454;
+ t['edblgrave'] = 0x0205;
+ t['edeva'] = 0x090F;
+ t['edieresis'] = 0x00EB;
+ t['edot'] = 0x0117;
+ t['edotaccent'] = 0x0117;
+ t['edotbelow'] = 0x1EB9;
+ t['eegurmukhi'] = 0x0A0F;
+ t['eematragurmukhi'] = 0x0A47;
+ t['efcyrillic'] = 0x0444;
+ t['egrave'] = 0x00E8;
+ t['egujarati'] = 0x0A8F;
+ t['eharmenian'] = 0x0567;
+ t['ehbopomofo'] = 0x311D;
+ t['ehiragana'] = 0x3048;
+ t['ehookabove'] = 0x1EBB;
+ t['eibopomofo'] = 0x311F;
+ t['eight'] = 0x0038;
+ t['eightarabic'] = 0x0668;
+ t['eightbengali'] = 0x09EE;
+ t['eightcircle'] = 0x2467;
+ t['eightcircleinversesansserif'] = 0x2791;
+ t['eightdeva'] = 0x096E;
+ t['eighteencircle'] = 0x2471;
+ t['eighteenparen'] = 0x2485;
+ t['eighteenperiod'] = 0x2499;
+ t['eightgujarati'] = 0x0AEE;
+ t['eightgurmukhi'] = 0x0A6E;
+ t['eighthackarabic'] = 0x0668;
+ t['eighthangzhou'] = 0x3028;
+ t['eighthnotebeamed'] = 0x266B;
+ t['eightideographicparen'] = 0x3227;
+ t['eightinferior'] = 0x2088;
+ t['eightmonospace'] = 0xFF18;
+ t['eightoldstyle'] = 0xF738;
+ t['eightparen'] = 0x247B;
+ t['eightperiod'] = 0x248F;
+ t['eightpersian'] = 0x06F8;
+ t['eightroman'] = 0x2177;
+ t['eightsuperior'] = 0x2078;
+ t['eightthai'] = 0x0E58;
+ t['einvertedbreve'] = 0x0207;
+ t['eiotifiedcyrillic'] = 0x0465;
+ t['ekatakana'] = 0x30A8;
+ t['ekatakanahalfwidth'] = 0xFF74;
+ t['ekonkargurmukhi'] = 0x0A74;
+ t['ekorean'] = 0x3154;
+ t['elcyrillic'] = 0x043B;
+ t['element'] = 0x2208;
+ t['elevencircle'] = 0x246A;
+ t['elevenparen'] = 0x247E;
+ t['elevenperiod'] = 0x2492;
+ t['elevenroman'] = 0x217A;
+ t['ellipsis'] = 0x2026;
+ t['ellipsisvertical'] = 0x22EE;
+ t['emacron'] = 0x0113;
+ t['emacronacute'] = 0x1E17;
+ t['emacrongrave'] = 0x1E15;
+ t['emcyrillic'] = 0x043C;
+ t['emdash'] = 0x2014;
+ t['emdashvertical'] = 0xFE31;
+ t['emonospace'] = 0xFF45;
+ t['emphasismarkarmenian'] = 0x055B;
+ t['emptyset'] = 0x2205;
+ t['enbopomofo'] = 0x3123;
+ t['encyrillic'] = 0x043D;
+ t['endash'] = 0x2013;
+ t['endashvertical'] = 0xFE32;
+ t['endescendercyrillic'] = 0x04A3;
+ t['eng'] = 0x014B;
+ t['engbopomofo'] = 0x3125;
+ t['enghecyrillic'] = 0x04A5;
+ t['enhookcyrillic'] = 0x04C8;
+ t['enspace'] = 0x2002;
+ t['eogonek'] = 0x0119;
+ t['eokorean'] = 0x3153;
+ t['eopen'] = 0x025B;
+ t['eopenclosed'] = 0x029A;
+ t['eopenreversed'] = 0x025C;
+ t['eopenreversedclosed'] = 0x025E;
+ t['eopenreversedhook'] = 0x025D;
+ t['eparen'] = 0x24A0;
+ t['epsilon'] = 0x03B5;
+ t['epsilontonos'] = 0x03AD;
+ t['equal'] = 0x003D;
+ t['equalmonospace'] = 0xFF1D;
+ t['equalsmall'] = 0xFE66;
+ t['equalsuperior'] = 0x207C;
+ t['equivalence'] = 0x2261;
+ t['erbopomofo'] = 0x3126;
+ t['ercyrillic'] = 0x0440;
+ t['ereversed'] = 0x0258;
+ t['ereversedcyrillic'] = 0x044D;
+ t['escyrillic'] = 0x0441;
+ t['esdescendercyrillic'] = 0x04AB;
+ t['esh'] = 0x0283;
+ t['eshcurl'] = 0x0286;
+ t['eshortdeva'] = 0x090E;
+ t['eshortvowelsigndeva'] = 0x0946;
+ t['eshreversedloop'] = 0x01AA;
+ t['eshsquatreversed'] = 0x0285;
+ t['esmallhiragana'] = 0x3047;
+ t['esmallkatakana'] = 0x30A7;
+ t['esmallkatakanahalfwidth'] = 0xFF6A;
+ t['estimated'] = 0x212E;
+ t['esuperior'] = 0xF6EC;
+ t['eta'] = 0x03B7;
+ t['etarmenian'] = 0x0568;
+ t['etatonos'] = 0x03AE;
+ t['eth'] = 0x00F0;
+ t['etilde'] = 0x1EBD;
+ t['etildebelow'] = 0x1E1B;
+ t['etnahtafoukhhebrew'] = 0x0591;
+ t['etnahtafoukhlefthebrew'] = 0x0591;
+ t['etnahtahebrew'] = 0x0591;
+ t['etnahtalefthebrew'] = 0x0591;
+ t['eturned'] = 0x01DD;
+ t['eukorean'] = 0x3161;
+ t['euro'] = 0x20AC;
+ t['evowelsignbengali'] = 0x09C7;
+ t['evowelsigndeva'] = 0x0947;
+ t['evowelsigngujarati'] = 0x0AC7;
+ t['exclam'] = 0x0021;
+ t['exclamarmenian'] = 0x055C;
+ t['exclamdbl'] = 0x203C;
+ t['exclamdown'] = 0x00A1;
+ t['exclamdownsmall'] = 0xF7A1;
+ t['exclammonospace'] = 0xFF01;
+ t['exclamsmall'] = 0xF721;
+ t['existential'] = 0x2203;
+ t['ezh'] = 0x0292;
+ t['ezhcaron'] = 0x01EF;
+ t['ezhcurl'] = 0x0293;
+ t['ezhreversed'] = 0x01B9;
+ t['ezhtail'] = 0x01BA;
+ t['f'] = 0x0066;
+ t['fadeva'] = 0x095E;
+ t['fagurmukhi'] = 0x0A5E;
+ t['fahrenheit'] = 0x2109;
+ t['fathaarabic'] = 0x064E;
+ t['fathalowarabic'] = 0x064E;
+ t['fathatanarabic'] = 0x064B;
+ t['fbopomofo'] = 0x3108;
+ t['fcircle'] = 0x24D5;
+ t['fdotaccent'] = 0x1E1F;
+ t['feharabic'] = 0x0641;
+ t['feharmenian'] = 0x0586;
+ t['fehfinalarabic'] = 0xFED2;
+ t['fehinitialarabic'] = 0xFED3;
+ t['fehmedialarabic'] = 0xFED4;
+ t['feicoptic'] = 0x03E5;
+ t['female'] = 0x2640;
+ t['ff'] = 0xFB00;
+ t['ffi'] = 0xFB03;
+ t['ffl'] = 0xFB04;
+ t['fi'] = 0xFB01;
+ t['fifteencircle'] = 0x246E;
+ t['fifteenparen'] = 0x2482;
+ t['fifteenperiod'] = 0x2496;
+ t['figuredash'] = 0x2012;
+ t['filledbox'] = 0x25A0;
+ t['filledrect'] = 0x25AC;
+ t['finalkaf'] = 0x05DA;
+ t['finalkafdagesh'] = 0xFB3A;
+ t['finalkafdageshhebrew'] = 0xFB3A;
+ t['finalkafhebrew'] = 0x05DA;
+ t['finalmem'] = 0x05DD;
+ t['finalmemhebrew'] = 0x05DD;
+ t['finalnun'] = 0x05DF;
+ t['finalnunhebrew'] = 0x05DF;
+ t['finalpe'] = 0x05E3;
+ t['finalpehebrew'] = 0x05E3;
+ t['finaltsadi'] = 0x05E5;
+ t['finaltsadihebrew'] = 0x05E5;
+ t['firsttonechinese'] = 0x02C9;
+ t['fisheye'] = 0x25C9;
+ t['fitacyrillic'] = 0x0473;
+ t['five'] = 0x0035;
+ t['fivearabic'] = 0x0665;
+ t['fivebengali'] = 0x09EB;
+ t['fivecircle'] = 0x2464;
+ t['fivecircleinversesansserif'] = 0x278E;
+ t['fivedeva'] = 0x096B;
+ t['fiveeighths'] = 0x215D;
+ t['fivegujarati'] = 0x0AEB;
+ t['fivegurmukhi'] = 0x0A6B;
+ t['fivehackarabic'] = 0x0665;
+ t['fivehangzhou'] = 0x3025;
+ t['fiveideographicparen'] = 0x3224;
+ t['fiveinferior'] = 0x2085;
+ t['fivemonospace'] = 0xFF15;
+ t['fiveoldstyle'] = 0xF735;
+ t['fiveparen'] = 0x2478;
+ t['fiveperiod'] = 0x248C;
+ t['fivepersian'] = 0x06F5;
+ t['fiveroman'] = 0x2174;
+ t['fivesuperior'] = 0x2075;
+ t['fivethai'] = 0x0E55;
+ t['fl'] = 0xFB02;
+ t['florin'] = 0x0192;
+ t['fmonospace'] = 0xFF46;
+ t['fmsquare'] = 0x3399;
+ t['fofanthai'] = 0x0E1F;
+ t['fofathai'] = 0x0E1D;
+ t['fongmanthai'] = 0x0E4F;
+ t['forall'] = 0x2200;
+ t['four'] = 0x0034;
+ t['fourarabic'] = 0x0664;
+ t['fourbengali'] = 0x09EA;
+ t['fourcircle'] = 0x2463;
+ t['fourcircleinversesansserif'] = 0x278D;
+ t['fourdeva'] = 0x096A;
+ t['fourgujarati'] = 0x0AEA;
+ t['fourgurmukhi'] = 0x0A6A;
+ t['fourhackarabic'] = 0x0664;
+ t['fourhangzhou'] = 0x3024;
+ t['fourideographicparen'] = 0x3223;
+ t['fourinferior'] = 0x2084;
+ t['fourmonospace'] = 0xFF14;
+ t['fournumeratorbengali'] = 0x09F7;
+ t['fouroldstyle'] = 0xF734;
+ t['fourparen'] = 0x2477;
+ t['fourperiod'] = 0x248B;
+ t['fourpersian'] = 0x06F4;
+ t['fourroman'] = 0x2173;
+ t['foursuperior'] = 0x2074;
+ t['fourteencircle'] = 0x246D;
+ t['fourteenparen'] = 0x2481;
+ t['fourteenperiod'] = 0x2495;
+ t['fourthai'] = 0x0E54;
+ t['fourthtonechinese'] = 0x02CB;
+ t['fparen'] = 0x24A1;
+ t['fraction'] = 0x2044;
+ t['franc'] = 0x20A3;
+ t['g'] = 0x0067;
+ t['gabengali'] = 0x0997;
+ t['gacute'] = 0x01F5;
+ t['gadeva'] = 0x0917;
+ t['gafarabic'] = 0x06AF;
+ t['gaffinalarabic'] = 0xFB93;
+ t['gafinitialarabic'] = 0xFB94;
+ t['gafmedialarabic'] = 0xFB95;
+ t['gagujarati'] = 0x0A97;
+ t['gagurmukhi'] = 0x0A17;
+ t['gahiragana'] = 0x304C;
+ t['gakatakana'] = 0x30AC;
+ t['gamma'] = 0x03B3;
+ t['gammalatinsmall'] = 0x0263;
+ t['gammasuperior'] = 0x02E0;
+ t['gangiacoptic'] = 0x03EB;
+ t['gbopomofo'] = 0x310D;
+ t['gbreve'] = 0x011F;
+ t['gcaron'] = 0x01E7;
+ t['gcedilla'] = 0x0123;
+ t['gcircle'] = 0x24D6;
+ t['gcircumflex'] = 0x011D;
+ t['gcommaaccent'] = 0x0123;
+ t['gdot'] = 0x0121;
+ t['gdotaccent'] = 0x0121;
+ t['gecyrillic'] = 0x0433;
+ t['gehiragana'] = 0x3052;
+ t['gekatakana'] = 0x30B2;
+ t['geometricallyequal'] = 0x2251;
+ t['gereshaccenthebrew'] = 0x059C;
+ t['gereshhebrew'] = 0x05F3;
+ t['gereshmuqdamhebrew'] = 0x059D;
+ t['germandbls'] = 0x00DF;
+ t['gershayimaccenthebrew'] = 0x059E;
+ t['gershayimhebrew'] = 0x05F4;
+ t['getamark'] = 0x3013;
+ t['ghabengali'] = 0x0998;
+ t['ghadarmenian'] = 0x0572;
+ t['ghadeva'] = 0x0918;
+ t['ghagujarati'] = 0x0A98;
+ t['ghagurmukhi'] = 0x0A18;
+ t['ghainarabic'] = 0x063A;
+ t['ghainfinalarabic'] = 0xFECE;
+ t['ghaininitialarabic'] = 0xFECF;
+ t['ghainmedialarabic'] = 0xFED0;
+ t['ghemiddlehookcyrillic'] = 0x0495;
+ t['ghestrokecyrillic'] = 0x0493;
+ t['gheupturncyrillic'] = 0x0491;
+ t['ghhadeva'] = 0x095A;
+ t['ghhagurmukhi'] = 0x0A5A;
+ t['ghook'] = 0x0260;
+ t['ghzsquare'] = 0x3393;
+ t['gihiragana'] = 0x304E;
+ t['gikatakana'] = 0x30AE;
+ t['gimarmenian'] = 0x0563;
+ t['gimel'] = 0x05D2;
+ t['gimeldagesh'] = 0xFB32;
+ t['gimeldageshhebrew'] = 0xFB32;
+ t['gimelhebrew'] = 0x05D2;
+ t['gjecyrillic'] = 0x0453;
+ t['glottalinvertedstroke'] = 0x01BE;
+ t['glottalstop'] = 0x0294;
+ t['glottalstopinverted'] = 0x0296;
+ t['glottalstopmod'] = 0x02C0;
+ t['glottalstopreversed'] = 0x0295;
+ t['glottalstopreversedmod'] = 0x02C1;
+ t['glottalstopreversedsuperior'] = 0x02E4;
+ t['glottalstopstroke'] = 0x02A1;
+ t['glottalstopstrokereversed'] = 0x02A2;
+ t['gmacron'] = 0x1E21;
+ t['gmonospace'] = 0xFF47;
+ t['gohiragana'] = 0x3054;
+ t['gokatakana'] = 0x30B4;
+ t['gparen'] = 0x24A2;
+ t['gpasquare'] = 0x33AC;
+ t['gradient'] = 0x2207;
+ t['grave'] = 0x0060;
+ t['gravebelowcmb'] = 0x0316;
+ t['gravecmb'] = 0x0300;
+ t['gravecomb'] = 0x0300;
+ t['gravedeva'] = 0x0953;
+ t['gravelowmod'] = 0x02CE;
+ t['gravemonospace'] = 0xFF40;
+ t['gravetonecmb'] = 0x0340;
+ t['greater'] = 0x003E;
+ t['greaterequal'] = 0x2265;
+ t['greaterequalorless'] = 0x22DB;
+ t['greatermonospace'] = 0xFF1E;
+ t['greaterorequivalent'] = 0x2273;
+ t['greaterorless'] = 0x2277;
+ t['greateroverequal'] = 0x2267;
+ t['greatersmall'] = 0xFE65;
+ t['gscript'] = 0x0261;
+ t['gstroke'] = 0x01E5;
+ t['guhiragana'] = 0x3050;
+ t['guillemotleft'] = 0x00AB;
+ t['guillemotright'] = 0x00BB;
+ t['guilsinglleft'] = 0x2039;
+ t['guilsinglright'] = 0x203A;
+ t['gukatakana'] = 0x30B0;
+ t['guramusquare'] = 0x3318;
+ t['gysquare'] = 0x33C9;
+ t['h'] = 0x0068;
+ t['haabkhasiancyrillic'] = 0x04A9;
+ t['haaltonearabic'] = 0x06C1;
+ t['habengali'] = 0x09B9;
+ t['hadescendercyrillic'] = 0x04B3;
+ t['hadeva'] = 0x0939;
+ t['hagujarati'] = 0x0AB9;
+ t['hagurmukhi'] = 0x0A39;
+ t['haharabic'] = 0x062D;
+ t['hahfinalarabic'] = 0xFEA2;
+ t['hahinitialarabic'] = 0xFEA3;
+ t['hahiragana'] = 0x306F;
+ t['hahmedialarabic'] = 0xFEA4;
+ t['haitusquare'] = 0x332A;
+ t['hakatakana'] = 0x30CF;
+ t['hakatakanahalfwidth'] = 0xFF8A;
+ t['halantgurmukhi'] = 0x0A4D;
+ t['hamzaarabic'] = 0x0621;
+ t['hamzalowarabic'] = 0x0621;
+ t['hangulfiller'] = 0x3164;
+ t['hardsigncyrillic'] = 0x044A;
+ t['harpoonleftbarbup'] = 0x21BC;
+ t['harpoonrightbarbup'] = 0x21C0;
+ t['hasquare'] = 0x33CA;
+ t['hatafpatah'] = 0x05B2;
+ t['hatafpatah16'] = 0x05B2;
+ t['hatafpatah23'] = 0x05B2;
+ t['hatafpatah2f'] = 0x05B2;
+ t['hatafpatahhebrew'] = 0x05B2;
+ t['hatafpatahnarrowhebrew'] = 0x05B2;
+ t['hatafpatahquarterhebrew'] = 0x05B2;
+ t['hatafpatahwidehebrew'] = 0x05B2;
+ t['hatafqamats'] = 0x05B3;
+ t['hatafqamats1b'] = 0x05B3;
+ t['hatafqamats28'] = 0x05B3;
+ t['hatafqamats34'] = 0x05B3;
+ t['hatafqamatshebrew'] = 0x05B3;
+ t['hatafqamatsnarrowhebrew'] = 0x05B3;
+ t['hatafqamatsquarterhebrew'] = 0x05B3;
+ t['hatafqamatswidehebrew'] = 0x05B3;
+ t['hatafsegol'] = 0x05B1;
+ t['hatafsegol17'] = 0x05B1;
+ t['hatafsegol24'] = 0x05B1;
+ t['hatafsegol30'] = 0x05B1;
+ t['hatafsegolhebrew'] = 0x05B1;
+ t['hatafsegolnarrowhebrew'] = 0x05B1;
+ t['hatafsegolquarterhebrew'] = 0x05B1;
+ t['hatafsegolwidehebrew'] = 0x05B1;
+ t['hbar'] = 0x0127;
+ t['hbopomofo'] = 0x310F;
+ t['hbrevebelow'] = 0x1E2B;
+ t['hcedilla'] = 0x1E29;
+ t['hcircle'] = 0x24D7;
+ t['hcircumflex'] = 0x0125;
+ t['hdieresis'] = 0x1E27;
+ t['hdotaccent'] = 0x1E23;
+ t['hdotbelow'] = 0x1E25;
+ t['he'] = 0x05D4;
+ t['heart'] = 0x2665;
+ t['heartsuitblack'] = 0x2665;
+ t['heartsuitwhite'] = 0x2661;
+ t['hedagesh'] = 0xFB34;
+ t['hedageshhebrew'] = 0xFB34;
+ t['hehaltonearabic'] = 0x06C1;
+ t['heharabic'] = 0x0647;
+ t['hehebrew'] = 0x05D4;
+ t['hehfinalaltonearabic'] = 0xFBA7;
+ t['hehfinalalttwoarabic'] = 0xFEEA;
+ t['hehfinalarabic'] = 0xFEEA;
+ t['hehhamzaabovefinalarabic'] = 0xFBA5;
+ t['hehhamzaaboveisolatedarabic'] = 0xFBA4;
+ t['hehinitialaltonearabic'] = 0xFBA8;
+ t['hehinitialarabic'] = 0xFEEB;
+ t['hehiragana'] = 0x3078;
+ t['hehmedialaltonearabic'] = 0xFBA9;
+ t['hehmedialarabic'] = 0xFEEC;
+ t['heiseierasquare'] = 0x337B;
+ t['hekatakana'] = 0x30D8;
+ t['hekatakanahalfwidth'] = 0xFF8D;
+ t['hekutaarusquare'] = 0x3336;
+ t['henghook'] = 0x0267;
+ t['herutusquare'] = 0x3339;
+ t['het'] = 0x05D7;
+ t['hethebrew'] = 0x05D7;
+ t['hhook'] = 0x0266;
+ t['hhooksuperior'] = 0x02B1;
+ t['hieuhacirclekorean'] = 0x327B;
+ t['hieuhaparenkorean'] = 0x321B;
+ t['hieuhcirclekorean'] = 0x326D;
+ t['hieuhkorean'] = 0x314E;
+ t['hieuhparenkorean'] = 0x320D;
+ t['hihiragana'] = 0x3072;
+ t['hikatakana'] = 0x30D2;
+ t['hikatakanahalfwidth'] = 0xFF8B;
+ t['hiriq'] = 0x05B4;
+ t['hiriq14'] = 0x05B4;
+ t['hiriq21'] = 0x05B4;
+ t['hiriq2d'] = 0x05B4;
+ t['hiriqhebrew'] = 0x05B4;
+ t['hiriqnarrowhebrew'] = 0x05B4;
+ t['hiriqquarterhebrew'] = 0x05B4;
+ t['hiriqwidehebrew'] = 0x05B4;
+ t['hlinebelow'] = 0x1E96;
+ t['hmonospace'] = 0xFF48;
+ t['hoarmenian'] = 0x0570;
+ t['hohipthai'] = 0x0E2B;
+ t['hohiragana'] = 0x307B;
+ t['hokatakana'] = 0x30DB;
+ t['hokatakanahalfwidth'] = 0xFF8E;
+ t['holam'] = 0x05B9;
+ t['holam19'] = 0x05B9;
+ t['holam26'] = 0x05B9;
+ t['holam32'] = 0x05B9;
+ t['holamhebrew'] = 0x05B9;
+ t['holamnarrowhebrew'] = 0x05B9;
+ t['holamquarterhebrew'] = 0x05B9;
+ t['holamwidehebrew'] = 0x05B9;
+ t['honokhukthai'] = 0x0E2E;
+ t['hookabovecomb'] = 0x0309;
+ t['hookcmb'] = 0x0309;
+ t['hookpalatalizedbelowcmb'] = 0x0321;
+ t['hookretroflexbelowcmb'] = 0x0322;
+ t['hoonsquare'] = 0x3342;
+ t['horicoptic'] = 0x03E9;
+ t['horizontalbar'] = 0x2015;
+ t['horncmb'] = 0x031B;
+ t['hotsprings'] = 0x2668;
+ t['house'] = 0x2302;
+ t['hparen'] = 0x24A3;
+ t['hsuperior'] = 0x02B0;
+ t['hturned'] = 0x0265;
+ t['huhiragana'] = 0x3075;
+ t['huiitosquare'] = 0x3333;
+ t['hukatakana'] = 0x30D5;
+ t['hukatakanahalfwidth'] = 0xFF8C;
+ t['hungarumlaut'] = 0x02DD;
+ t['hungarumlautcmb'] = 0x030B;
+ t['hv'] = 0x0195;
+ t['hyphen'] = 0x002D;
+ t['hypheninferior'] = 0xF6E5;
+ t['hyphenmonospace'] = 0xFF0D;
+ t['hyphensmall'] = 0xFE63;
+ t['hyphensuperior'] = 0xF6E6;
+ t['hyphentwo'] = 0x2010;
+ t['i'] = 0x0069;
+ t['iacute'] = 0x00ED;
+ t['iacyrillic'] = 0x044F;
+ t['ibengali'] = 0x0987;
+ t['ibopomofo'] = 0x3127;
+ t['ibreve'] = 0x012D;
+ t['icaron'] = 0x01D0;
+ t['icircle'] = 0x24D8;
+ t['icircumflex'] = 0x00EE;
+ t['icyrillic'] = 0x0456;
+ t['idblgrave'] = 0x0209;
+ t['ideographearthcircle'] = 0x328F;
+ t['ideographfirecircle'] = 0x328B;
+ t['ideographicallianceparen'] = 0x323F;
+ t['ideographiccallparen'] = 0x323A;
+ t['ideographiccentrecircle'] = 0x32A5;
+ t['ideographicclose'] = 0x3006;
+ t['ideographiccomma'] = 0x3001;
+ t['ideographiccommaleft'] = 0xFF64;
+ t['ideographiccongratulationparen'] = 0x3237;
+ t['ideographiccorrectcircle'] = 0x32A3;
+ t['ideographicearthparen'] = 0x322F;
+ t['ideographicenterpriseparen'] = 0x323D;
+ t['ideographicexcellentcircle'] = 0x329D;
+ t['ideographicfestivalparen'] = 0x3240;
+ t['ideographicfinancialcircle'] = 0x3296;
+ t['ideographicfinancialparen'] = 0x3236;
+ t['ideographicfireparen'] = 0x322B;
+ t['ideographichaveparen'] = 0x3232;
+ t['ideographichighcircle'] = 0x32A4;
+ t['ideographiciterationmark'] = 0x3005;
+ t['ideographiclaborcircle'] = 0x3298;
+ t['ideographiclaborparen'] = 0x3238;
+ t['ideographicleftcircle'] = 0x32A7;
+ t['ideographiclowcircle'] = 0x32A6;
+ t['ideographicmedicinecircle'] = 0x32A9;
+ t['ideographicmetalparen'] = 0x322E;
+ t['ideographicmoonparen'] = 0x322A;
+ t['ideographicnameparen'] = 0x3234;
+ t['ideographicperiod'] = 0x3002;
+ t['ideographicprintcircle'] = 0x329E;
+ t['ideographicreachparen'] = 0x3243;
+ t['ideographicrepresentparen'] = 0x3239;
+ t['ideographicresourceparen'] = 0x323E;
+ t['ideographicrightcircle'] = 0x32A8;
+ t['ideographicsecretcircle'] = 0x3299;
+ t['ideographicselfparen'] = 0x3242;
+ t['ideographicsocietyparen'] = 0x3233;
+ t['ideographicspace'] = 0x3000;
+ t['ideographicspecialparen'] = 0x3235;
+ t['ideographicstockparen'] = 0x3231;
+ t['ideographicstudyparen'] = 0x323B;
+ t['ideographicsunparen'] = 0x3230;
+ t['ideographicsuperviseparen'] = 0x323C;
+ t['ideographicwaterparen'] = 0x322C;
+ t['ideographicwoodparen'] = 0x322D;
+ t['ideographiczero'] = 0x3007;
+ t['ideographmetalcircle'] = 0x328E;
+ t['ideographmooncircle'] = 0x328A;
+ t['ideographnamecircle'] = 0x3294;
+ t['ideographsuncircle'] = 0x3290;
+ t['ideographwatercircle'] = 0x328C;
+ t['ideographwoodcircle'] = 0x328D;
+ t['ideva'] = 0x0907;
+ t['idieresis'] = 0x00EF;
+ t['idieresisacute'] = 0x1E2F;
+ t['idieresiscyrillic'] = 0x04E5;
+ t['idotbelow'] = 0x1ECB;
+ t['iebrevecyrillic'] = 0x04D7;
+ t['iecyrillic'] = 0x0435;
+ t['ieungacirclekorean'] = 0x3275;
+ t['ieungaparenkorean'] = 0x3215;
+ t['ieungcirclekorean'] = 0x3267;
+ t['ieungkorean'] = 0x3147;
+ t['ieungparenkorean'] = 0x3207;
+ t['igrave'] = 0x00EC;
+ t['igujarati'] = 0x0A87;
+ t['igurmukhi'] = 0x0A07;
+ t['ihiragana'] = 0x3044;
+ t['ihookabove'] = 0x1EC9;
+ t['iibengali'] = 0x0988;
+ t['iicyrillic'] = 0x0438;
+ t['iideva'] = 0x0908;
+ t['iigujarati'] = 0x0A88;
+ t['iigurmukhi'] = 0x0A08;
+ t['iimatragurmukhi'] = 0x0A40;
+ t['iinvertedbreve'] = 0x020B;
+ t['iishortcyrillic'] = 0x0439;
+ t['iivowelsignbengali'] = 0x09C0;
+ t['iivowelsigndeva'] = 0x0940;
+ t['iivowelsigngujarati'] = 0x0AC0;
+ t['ij'] = 0x0133;
+ t['ikatakana'] = 0x30A4;
+ t['ikatakanahalfwidth'] = 0xFF72;
+ t['ikorean'] = 0x3163;
+ t['ilde'] = 0x02DC;
+ t['iluyhebrew'] = 0x05AC;
+ t['imacron'] = 0x012B;
+ t['imacroncyrillic'] = 0x04E3;
+ t['imageorapproximatelyequal'] = 0x2253;
+ t['imatragurmukhi'] = 0x0A3F;
+ t['imonospace'] = 0xFF49;
+ t['increment'] = 0x2206;
+ t['infinity'] = 0x221E;
+ t['iniarmenian'] = 0x056B;
+ t['integral'] = 0x222B;
+ t['integralbottom'] = 0x2321;
+ t['integralbt'] = 0x2321;
+ t['integralex'] = 0xF8F5;
+ t['integraltop'] = 0x2320;
+ t['integraltp'] = 0x2320;
+ t['intersection'] = 0x2229;
+ t['intisquare'] = 0x3305;
+ t['invbullet'] = 0x25D8;
+ t['invcircle'] = 0x25D9;
+ t['invsmileface'] = 0x263B;
+ t['iocyrillic'] = 0x0451;
+ t['iogonek'] = 0x012F;
+ t['iota'] = 0x03B9;
+ t['iotadieresis'] = 0x03CA;
+ t['iotadieresistonos'] = 0x0390;
+ t['iotalatin'] = 0x0269;
+ t['iotatonos'] = 0x03AF;
+ t['iparen'] = 0x24A4;
+ t['irigurmukhi'] = 0x0A72;
+ t['ismallhiragana'] = 0x3043;
+ t['ismallkatakana'] = 0x30A3;
+ t['ismallkatakanahalfwidth'] = 0xFF68;
+ t['issharbengali'] = 0x09FA;
+ t['istroke'] = 0x0268;
+ t['isuperior'] = 0xF6ED;
+ t['iterationhiragana'] = 0x309D;
+ t['iterationkatakana'] = 0x30FD;
+ t['itilde'] = 0x0129;
+ t['itildebelow'] = 0x1E2D;
+ t['iubopomofo'] = 0x3129;
+ t['iucyrillic'] = 0x044E;
+ t['ivowelsignbengali'] = 0x09BF;
+ t['ivowelsigndeva'] = 0x093F;
+ t['ivowelsigngujarati'] = 0x0ABF;
+ t['izhitsacyrillic'] = 0x0475;
+ t['izhitsadblgravecyrillic'] = 0x0477;
+ t['j'] = 0x006A;
+ t['jaarmenian'] = 0x0571;
+ t['jabengali'] = 0x099C;
+ t['jadeva'] = 0x091C;
+ t['jagujarati'] = 0x0A9C;
+ t['jagurmukhi'] = 0x0A1C;
+ t['jbopomofo'] = 0x3110;
+ t['jcaron'] = 0x01F0;
+ t['jcircle'] = 0x24D9;
+ t['jcircumflex'] = 0x0135;
+ t['jcrossedtail'] = 0x029D;
+ t['jdotlessstroke'] = 0x025F;
+ t['jecyrillic'] = 0x0458;
+ t['jeemarabic'] = 0x062C;
+ t['jeemfinalarabic'] = 0xFE9E;
+ t['jeeminitialarabic'] = 0xFE9F;
+ t['jeemmedialarabic'] = 0xFEA0;
+ t['jeharabic'] = 0x0698;
+ t['jehfinalarabic'] = 0xFB8B;
+ t['jhabengali'] = 0x099D;
+ t['jhadeva'] = 0x091D;
+ t['jhagujarati'] = 0x0A9D;
+ t['jhagurmukhi'] = 0x0A1D;
+ t['jheharmenian'] = 0x057B;
+ t['jis'] = 0x3004;
+ t['jmonospace'] = 0xFF4A;
+ t['jparen'] = 0x24A5;
+ t['jsuperior'] = 0x02B2;
+ t['k'] = 0x006B;
+ t['kabashkircyrillic'] = 0x04A1;
+ t['kabengali'] = 0x0995;
+ t['kacute'] = 0x1E31;
+ t['kacyrillic'] = 0x043A;
+ t['kadescendercyrillic'] = 0x049B;
+ t['kadeva'] = 0x0915;
+ t['kaf'] = 0x05DB;
+ t['kafarabic'] = 0x0643;
+ t['kafdagesh'] = 0xFB3B;
+ t['kafdageshhebrew'] = 0xFB3B;
+ t['kaffinalarabic'] = 0xFEDA;
+ t['kafhebrew'] = 0x05DB;
+ t['kafinitialarabic'] = 0xFEDB;
+ t['kafmedialarabic'] = 0xFEDC;
+ t['kafrafehebrew'] = 0xFB4D;
+ t['kagujarati'] = 0x0A95;
+ t['kagurmukhi'] = 0x0A15;
+ t['kahiragana'] = 0x304B;
+ t['kahookcyrillic'] = 0x04C4;
+ t['kakatakana'] = 0x30AB;
+ t['kakatakanahalfwidth'] = 0xFF76;
+ t['kappa'] = 0x03BA;
+ t['kappasymbolgreek'] = 0x03F0;
+ t['kapyeounmieumkorean'] = 0x3171;
+ t['kapyeounphieuphkorean'] = 0x3184;
+ t['kapyeounpieupkorean'] = 0x3178;
+ t['kapyeounssangpieupkorean'] = 0x3179;
+ t['karoriisquare'] = 0x330D;
+ t['kashidaautoarabic'] = 0x0640;
+ t['kashidaautonosidebearingarabic'] = 0x0640;
+ t['kasmallkatakana'] = 0x30F5;
+ t['kasquare'] = 0x3384;
+ t['kasraarabic'] = 0x0650;
+ t['kasratanarabic'] = 0x064D;
+ t['kastrokecyrillic'] = 0x049F;
+ t['katahiraprolongmarkhalfwidth'] = 0xFF70;
+ t['kaverticalstrokecyrillic'] = 0x049D;
+ t['kbopomofo'] = 0x310E;
+ t['kcalsquare'] = 0x3389;
+ t['kcaron'] = 0x01E9;
+ t['kcedilla'] = 0x0137;
+ t['kcircle'] = 0x24DA;
+ t['kcommaaccent'] = 0x0137;
+ t['kdotbelow'] = 0x1E33;
+ t['keharmenian'] = 0x0584;
+ t['kehiragana'] = 0x3051;
+ t['kekatakana'] = 0x30B1;
+ t['kekatakanahalfwidth'] = 0xFF79;
+ t['kenarmenian'] = 0x056F;
+ t['kesmallkatakana'] = 0x30F6;
+ t['kgreenlandic'] = 0x0138;
+ t['khabengali'] = 0x0996;
+ t['khacyrillic'] = 0x0445;
+ t['khadeva'] = 0x0916;
+ t['khagujarati'] = 0x0A96;
+ t['khagurmukhi'] = 0x0A16;
+ t['khaharabic'] = 0x062E;
+ t['khahfinalarabic'] = 0xFEA6;
+ t['khahinitialarabic'] = 0xFEA7;
+ t['khahmedialarabic'] = 0xFEA8;
+ t['kheicoptic'] = 0x03E7;
+ t['khhadeva'] = 0x0959;
+ t['khhagurmukhi'] = 0x0A59;
+ t['khieukhacirclekorean'] = 0x3278;
+ t['khieukhaparenkorean'] = 0x3218;
+ t['khieukhcirclekorean'] = 0x326A;
+ t['khieukhkorean'] = 0x314B;
+ t['khieukhparenkorean'] = 0x320A;
+ t['khokhaithai'] = 0x0E02;
+ t['khokhonthai'] = 0x0E05;
+ t['khokhuatthai'] = 0x0E03;
+ t['khokhwaithai'] = 0x0E04;
+ t['khomutthai'] = 0x0E5B;
+ t['khook'] = 0x0199;
+ t['khorakhangthai'] = 0x0E06;
+ t['khzsquare'] = 0x3391;
+ t['kihiragana'] = 0x304D;
+ t['kikatakana'] = 0x30AD;
+ t['kikatakanahalfwidth'] = 0xFF77;
+ t['kiroguramusquare'] = 0x3315;
+ t['kiromeetorusquare'] = 0x3316;
+ t['kirosquare'] = 0x3314;
+ t['kiyeokacirclekorean'] = 0x326E;
+ t['kiyeokaparenkorean'] = 0x320E;
+ t['kiyeokcirclekorean'] = 0x3260;
+ t['kiyeokkorean'] = 0x3131;
+ t['kiyeokparenkorean'] = 0x3200;
+ t['kiyeoksioskorean'] = 0x3133;
+ t['kjecyrillic'] = 0x045C;
+ t['klinebelow'] = 0x1E35;
+ t['klsquare'] = 0x3398;
+ t['kmcubedsquare'] = 0x33A6;
+ t['kmonospace'] = 0xFF4B;
+ t['kmsquaredsquare'] = 0x33A2;
+ t['kohiragana'] = 0x3053;
+ t['kohmsquare'] = 0x33C0;
+ t['kokaithai'] = 0x0E01;
+ t['kokatakana'] = 0x30B3;
+ t['kokatakanahalfwidth'] = 0xFF7A;
+ t['kooposquare'] = 0x331E;
+ t['koppacyrillic'] = 0x0481;
+ t['koreanstandardsymbol'] = 0x327F;
+ t['koroniscmb'] = 0x0343;
+ t['kparen'] = 0x24A6;
+ t['kpasquare'] = 0x33AA;
+ t['ksicyrillic'] = 0x046F;
+ t['ktsquare'] = 0x33CF;
+ t['kturned'] = 0x029E;
+ t['kuhiragana'] = 0x304F;
+ t['kukatakana'] = 0x30AF;
+ t['kukatakanahalfwidth'] = 0xFF78;
+ t['kvsquare'] = 0x33B8;
+ t['kwsquare'] = 0x33BE;
+ t['l'] = 0x006C;
+ t['labengali'] = 0x09B2;
+ t['lacute'] = 0x013A;
+ t['ladeva'] = 0x0932;
+ t['lagujarati'] = 0x0AB2;
+ t['lagurmukhi'] = 0x0A32;
+ t['lakkhangyaothai'] = 0x0E45;
+ t['lamaleffinalarabic'] = 0xFEFC;
+ t['lamalefhamzaabovefinalarabic'] = 0xFEF8;
+ t['lamalefhamzaaboveisolatedarabic'] = 0xFEF7;
+ t['lamalefhamzabelowfinalarabic'] = 0xFEFA;
+ t['lamalefhamzabelowisolatedarabic'] = 0xFEF9;
+ t['lamalefisolatedarabic'] = 0xFEFB;
+ t['lamalefmaddaabovefinalarabic'] = 0xFEF6;
+ t['lamalefmaddaaboveisolatedarabic'] = 0xFEF5;
+ t['lamarabic'] = 0x0644;
+ t['lambda'] = 0x03BB;
+ t['lambdastroke'] = 0x019B;
+ t['lamed'] = 0x05DC;
+ t['lameddagesh'] = 0xFB3C;
+ t['lameddageshhebrew'] = 0xFB3C;
+ t['lamedhebrew'] = 0x05DC;
+ t['lamfinalarabic'] = 0xFEDE;
+ t['lamhahinitialarabic'] = 0xFCCA;
+ t['laminitialarabic'] = 0xFEDF;
+ t['lamjeeminitialarabic'] = 0xFCC9;
+ t['lamkhahinitialarabic'] = 0xFCCB;
+ t['lamlamhehisolatedarabic'] = 0xFDF2;
+ t['lammedialarabic'] = 0xFEE0;
+ t['lammeemhahinitialarabic'] = 0xFD88;
+ t['lammeeminitialarabic'] = 0xFCCC;
+ t['largecircle'] = 0x25EF;
+ t['lbar'] = 0x019A;
+ t['lbelt'] = 0x026C;
+ t['lbopomofo'] = 0x310C;
+ t['lcaron'] = 0x013E;
+ t['lcedilla'] = 0x013C;
+ t['lcircle'] = 0x24DB;
+ t['lcircumflexbelow'] = 0x1E3D;
+ t['lcommaaccent'] = 0x013C;
+ t['ldot'] = 0x0140;
+ t['ldotaccent'] = 0x0140;
+ t['ldotbelow'] = 0x1E37;
+ t['ldotbelowmacron'] = 0x1E39;
+ t['leftangleabovecmb'] = 0x031A;
+ t['lefttackbelowcmb'] = 0x0318;
+ t['less'] = 0x003C;
+ t['lessequal'] = 0x2264;
+ t['lessequalorgreater'] = 0x22DA;
+ t['lessmonospace'] = 0xFF1C;
+ t['lessorequivalent'] = 0x2272;
+ t['lessorgreater'] = 0x2276;
+ t['lessoverequal'] = 0x2266;
+ t['lesssmall'] = 0xFE64;
+ t['lezh'] = 0x026E;
+ t['lfblock'] = 0x258C;
+ t['lhookretroflex'] = 0x026D;
+ t['lira'] = 0x20A4;
+ t['liwnarmenian'] = 0x056C;
+ t['lj'] = 0x01C9;
+ t['ljecyrillic'] = 0x0459;
+ t['ll'] = 0xF6C0;
+ t['lladeva'] = 0x0933;
+ t['llagujarati'] = 0x0AB3;
+ t['llinebelow'] = 0x1E3B;
+ t['llladeva'] = 0x0934;
+ t['llvocalicbengali'] = 0x09E1;
+ t['llvocalicdeva'] = 0x0961;
+ t['llvocalicvowelsignbengali'] = 0x09E3;
+ t['llvocalicvowelsigndeva'] = 0x0963;
+ t['lmiddletilde'] = 0x026B;
+ t['lmonospace'] = 0xFF4C;
+ t['lmsquare'] = 0x33D0;
+ t['lochulathai'] = 0x0E2C;
+ t['logicaland'] = 0x2227;
+ t['logicalnot'] = 0x00AC;
+ t['logicalnotreversed'] = 0x2310;
+ t['logicalor'] = 0x2228;
+ t['lolingthai'] = 0x0E25;
+ t['longs'] = 0x017F;
+ t['lowlinecenterline'] = 0xFE4E;
+ t['lowlinecmb'] = 0x0332;
+ t['lowlinedashed'] = 0xFE4D;
+ t['lozenge'] = 0x25CA;
+ t['lparen'] = 0x24A7;
+ t['lslash'] = 0x0142;
+ t['lsquare'] = 0x2113;
+ t['lsuperior'] = 0xF6EE;
+ t['ltshade'] = 0x2591;
+ t['luthai'] = 0x0E26;
+ t['lvocalicbengali'] = 0x098C;
+ t['lvocalicdeva'] = 0x090C;
+ t['lvocalicvowelsignbengali'] = 0x09E2;
+ t['lvocalicvowelsigndeva'] = 0x0962;
+ t['lxsquare'] = 0x33D3;
+ t['m'] = 0x006D;
+ t['mabengali'] = 0x09AE;
+ t['macron'] = 0x00AF;
+ t['macronbelowcmb'] = 0x0331;
+ t['macroncmb'] = 0x0304;
+ t['macronlowmod'] = 0x02CD;
+ t['macronmonospace'] = 0xFFE3;
+ t['macute'] = 0x1E3F;
+ t['madeva'] = 0x092E;
+ t['magujarati'] = 0x0AAE;
+ t['magurmukhi'] = 0x0A2E;
+ t['mahapakhhebrew'] = 0x05A4;
+ t['mahapakhlefthebrew'] = 0x05A4;
+ t['mahiragana'] = 0x307E;
+ t['maichattawalowleftthai'] = 0xF895;
+ t['maichattawalowrightthai'] = 0xF894;
+ t['maichattawathai'] = 0x0E4B;
+ t['maichattawaupperleftthai'] = 0xF893;
+ t['maieklowleftthai'] = 0xF88C;
+ t['maieklowrightthai'] = 0xF88B;
+ t['maiekthai'] = 0x0E48;
+ t['maiekupperleftthai'] = 0xF88A;
+ t['maihanakatleftthai'] = 0xF884;
+ t['maihanakatthai'] = 0x0E31;
+ t['maitaikhuleftthai'] = 0xF889;
+ t['maitaikhuthai'] = 0x0E47;
+ t['maitholowleftthai'] = 0xF88F;
+ t['maitholowrightthai'] = 0xF88E;
+ t['maithothai'] = 0x0E49;
+ t['maithoupperleftthai'] = 0xF88D;
+ t['maitrilowleftthai'] = 0xF892;
+ t['maitrilowrightthai'] = 0xF891;
+ t['maitrithai'] = 0x0E4A;
+ t['maitriupperleftthai'] = 0xF890;
+ t['maiyamokthai'] = 0x0E46;
+ t['makatakana'] = 0x30DE;
+ t['makatakanahalfwidth'] = 0xFF8F;
+ t['male'] = 0x2642;
+ t['mansyonsquare'] = 0x3347;
+ t['maqafhebrew'] = 0x05BE;
+ t['mars'] = 0x2642;
+ t['masoracirclehebrew'] = 0x05AF;
+ t['masquare'] = 0x3383;
+ t['mbopomofo'] = 0x3107;
+ t['mbsquare'] = 0x33D4;
+ t['mcircle'] = 0x24DC;
+ t['mcubedsquare'] = 0x33A5;
+ t['mdotaccent'] = 0x1E41;
+ t['mdotbelow'] = 0x1E43;
+ t['meemarabic'] = 0x0645;
+ t['meemfinalarabic'] = 0xFEE2;
+ t['meeminitialarabic'] = 0xFEE3;
+ t['meemmedialarabic'] = 0xFEE4;
+ t['meemmeeminitialarabic'] = 0xFCD1;
+ t['meemmeemisolatedarabic'] = 0xFC48;
+ t['meetorusquare'] = 0x334D;
+ t['mehiragana'] = 0x3081;
+ t['meizierasquare'] = 0x337E;
+ t['mekatakana'] = 0x30E1;
+ t['mekatakanahalfwidth'] = 0xFF92;
+ t['mem'] = 0x05DE;
+ t['memdagesh'] = 0xFB3E;
+ t['memdageshhebrew'] = 0xFB3E;
+ t['memhebrew'] = 0x05DE;
+ t['menarmenian'] = 0x0574;
+ t['merkhahebrew'] = 0x05A5;
+ t['merkhakefulahebrew'] = 0x05A6;
+ t['merkhakefulalefthebrew'] = 0x05A6;
+ t['merkhalefthebrew'] = 0x05A5;
+ t['mhook'] = 0x0271;
+ t['mhzsquare'] = 0x3392;
+ t['middledotkatakanahalfwidth'] = 0xFF65;
+ t['middot'] = 0x00B7;
+ t['mieumacirclekorean'] = 0x3272;
+ t['mieumaparenkorean'] = 0x3212;
+ t['mieumcirclekorean'] = 0x3264;
+ t['mieumkorean'] = 0x3141;
+ t['mieumpansioskorean'] = 0x3170;
+ t['mieumparenkorean'] = 0x3204;
+ t['mieumpieupkorean'] = 0x316E;
+ t['mieumsioskorean'] = 0x316F;
+ t['mihiragana'] = 0x307F;
+ t['mikatakana'] = 0x30DF;
+ t['mikatakanahalfwidth'] = 0xFF90;
+ t['minus'] = 0x2212;
+ t['minusbelowcmb'] = 0x0320;
+ t['minuscircle'] = 0x2296;
+ t['minusmod'] = 0x02D7;
+ t['minusplus'] = 0x2213;
+ t['minute'] = 0x2032;
+ t['miribaarusquare'] = 0x334A;
+ t['mirisquare'] = 0x3349;
+ t['mlonglegturned'] = 0x0270;
+ t['mlsquare'] = 0x3396;
+ t['mmcubedsquare'] = 0x33A3;
+ t['mmonospace'] = 0xFF4D;
+ t['mmsquaredsquare'] = 0x339F;
+ t['mohiragana'] = 0x3082;
+ t['mohmsquare'] = 0x33C1;
+ t['mokatakana'] = 0x30E2;
+ t['mokatakanahalfwidth'] = 0xFF93;
+ t['molsquare'] = 0x33D6;
+ t['momathai'] = 0x0E21;
+ t['moverssquare'] = 0x33A7;
+ t['moverssquaredsquare'] = 0x33A8;
+ t['mparen'] = 0x24A8;
+ t['mpasquare'] = 0x33AB;
+ t['mssquare'] = 0x33B3;
+ t['msuperior'] = 0xF6EF;
+ t['mturned'] = 0x026F;
+ t['mu'] = 0x00B5;
+ t['mu1'] = 0x00B5;
+ t['muasquare'] = 0x3382;
+ t['muchgreater'] = 0x226B;
+ t['muchless'] = 0x226A;
+ t['mufsquare'] = 0x338C;
+ t['mugreek'] = 0x03BC;
+ t['mugsquare'] = 0x338D;
+ t['muhiragana'] = 0x3080;
+ t['mukatakana'] = 0x30E0;
+ t['mukatakanahalfwidth'] = 0xFF91;
+ t['mulsquare'] = 0x3395;
+ t['multiply'] = 0x00D7;
+ t['mumsquare'] = 0x339B;
+ t['munahhebrew'] = 0x05A3;
+ t['munahlefthebrew'] = 0x05A3;
+ t['musicalnote'] = 0x266A;
+ t['musicalnotedbl'] = 0x266B;
+ t['musicflatsign'] = 0x266D;
+ t['musicsharpsign'] = 0x266F;
+ t['mussquare'] = 0x33B2;
+ t['muvsquare'] = 0x33B6;
+ t['muwsquare'] = 0x33BC;
+ t['mvmegasquare'] = 0x33B9;
+ t['mvsquare'] = 0x33B7;
+ t['mwmegasquare'] = 0x33BF;
+ t['mwsquare'] = 0x33BD;
+ t['n'] = 0x006E;
+ t['nabengali'] = 0x09A8;
+ t['nabla'] = 0x2207;
+ t['nacute'] = 0x0144;
+ t['nadeva'] = 0x0928;
+ t['nagujarati'] = 0x0AA8;
+ t['nagurmukhi'] = 0x0A28;
+ t['nahiragana'] = 0x306A;
+ t['nakatakana'] = 0x30CA;
+ t['nakatakanahalfwidth'] = 0xFF85;
+ t['napostrophe'] = 0x0149;
+ t['nasquare'] = 0x3381;
+ t['nbopomofo'] = 0x310B;
+ t['nbspace'] = 0x00A0;
+ t['ncaron'] = 0x0148;
+ t['ncedilla'] = 0x0146;
+ t['ncircle'] = 0x24DD;
+ t['ncircumflexbelow'] = 0x1E4B;
+ t['ncommaaccent'] = 0x0146;
+ t['ndotaccent'] = 0x1E45;
+ t['ndotbelow'] = 0x1E47;
+ t['nehiragana'] = 0x306D;
+ t['nekatakana'] = 0x30CD;
+ t['nekatakanahalfwidth'] = 0xFF88;
+ t['newsheqelsign'] = 0x20AA;
+ t['nfsquare'] = 0x338B;
+ t['ngabengali'] = 0x0999;
+ t['ngadeva'] = 0x0919;
+ t['ngagujarati'] = 0x0A99;
+ t['ngagurmukhi'] = 0x0A19;
+ t['ngonguthai'] = 0x0E07;
+ t['nhiragana'] = 0x3093;
+ t['nhookleft'] = 0x0272;
+ t['nhookretroflex'] = 0x0273;
+ t['nieunacirclekorean'] = 0x326F;
+ t['nieunaparenkorean'] = 0x320F;
+ t['nieuncieuckorean'] = 0x3135;
+ t['nieuncirclekorean'] = 0x3261;
+ t['nieunhieuhkorean'] = 0x3136;
+ t['nieunkorean'] = 0x3134;
+ t['nieunpansioskorean'] = 0x3168;
+ t['nieunparenkorean'] = 0x3201;
+ t['nieunsioskorean'] = 0x3167;
+ t['nieuntikeutkorean'] = 0x3166;
+ t['nihiragana'] = 0x306B;
+ t['nikatakana'] = 0x30CB;
+ t['nikatakanahalfwidth'] = 0xFF86;
+ t['nikhahitleftthai'] = 0xF899;
+ t['nikhahitthai'] = 0x0E4D;
+ t['nine'] = 0x0039;
+ t['ninearabic'] = 0x0669;
+ t['ninebengali'] = 0x09EF;
+ t['ninecircle'] = 0x2468;
+ t['ninecircleinversesansserif'] = 0x2792;
+ t['ninedeva'] = 0x096F;
+ t['ninegujarati'] = 0x0AEF;
+ t['ninegurmukhi'] = 0x0A6F;
+ t['ninehackarabic'] = 0x0669;
+ t['ninehangzhou'] = 0x3029;
+ t['nineideographicparen'] = 0x3228;
+ t['nineinferior'] = 0x2089;
+ t['ninemonospace'] = 0xFF19;
+ t['nineoldstyle'] = 0xF739;
+ t['nineparen'] = 0x247C;
+ t['nineperiod'] = 0x2490;
+ t['ninepersian'] = 0x06F9;
+ t['nineroman'] = 0x2178;
+ t['ninesuperior'] = 0x2079;
+ t['nineteencircle'] = 0x2472;
+ t['nineteenparen'] = 0x2486;
+ t['nineteenperiod'] = 0x249A;
+ t['ninethai'] = 0x0E59;
+ t['nj'] = 0x01CC;
+ t['njecyrillic'] = 0x045A;
+ t['nkatakana'] = 0x30F3;
+ t['nkatakanahalfwidth'] = 0xFF9D;
+ t['nlegrightlong'] = 0x019E;
+ t['nlinebelow'] = 0x1E49;
+ t['nmonospace'] = 0xFF4E;
+ t['nmsquare'] = 0x339A;
+ t['nnabengali'] = 0x09A3;
+ t['nnadeva'] = 0x0923;
+ t['nnagujarati'] = 0x0AA3;
+ t['nnagurmukhi'] = 0x0A23;
+ t['nnnadeva'] = 0x0929;
+ t['nohiragana'] = 0x306E;
+ t['nokatakana'] = 0x30CE;
+ t['nokatakanahalfwidth'] = 0xFF89;
+ t['nonbreakingspace'] = 0x00A0;
+ t['nonenthai'] = 0x0E13;
+ t['nonuthai'] = 0x0E19;
+ t['noonarabic'] = 0x0646;
+ t['noonfinalarabic'] = 0xFEE6;
+ t['noonghunnaarabic'] = 0x06BA;
+ t['noonghunnafinalarabic'] = 0xFB9F;
+ t['nooninitialarabic'] = 0xFEE7;
+ t['noonjeeminitialarabic'] = 0xFCD2;
+ t['noonjeemisolatedarabic'] = 0xFC4B;
+ t['noonmedialarabic'] = 0xFEE8;
+ t['noonmeeminitialarabic'] = 0xFCD5;
+ t['noonmeemisolatedarabic'] = 0xFC4E;
+ t['noonnoonfinalarabic'] = 0xFC8D;
+ t['notcontains'] = 0x220C;
+ t['notelement'] = 0x2209;
+ t['notelementof'] = 0x2209;
+ t['notequal'] = 0x2260;
+ t['notgreater'] = 0x226F;
+ t['notgreaternorequal'] = 0x2271;
+ t['notgreaternorless'] = 0x2279;
+ t['notidentical'] = 0x2262;
+ t['notless'] = 0x226E;
+ t['notlessnorequal'] = 0x2270;
+ t['notparallel'] = 0x2226;
+ t['notprecedes'] = 0x2280;
+ t['notsubset'] = 0x2284;
+ t['notsucceeds'] = 0x2281;
+ t['notsuperset'] = 0x2285;
+ t['nowarmenian'] = 0x0576;
+ t['nparen'] = 0x24A9;
+ t['nssquare'] = 0x33B1;
+ t['nsuperior'] = 0x207F;
+ t['ntilde'] = 0x00F1;
+ t['nu'] = 0x03BD;
+ t['nuhiragana'] = 0x306C;
+ t['nukatakana'] = 0x30CC;
+ t['nukatakanahalfwidth'] = 0xFF87;
+ t['nuktabengali'] = 0x09BC;
+ t['nuktadeva'] = 0x093C;
+ t['nuktagujarati'] = 0x0ABC;
+ t['nuktagurmukhi'] = 0x0A3C;
+ t['numbersign'] = 0x0023;
+ t['numbersignmonospace'] = 0xFF03;
+ t['numbersignsmall'] = 0xFE5F;
+ t['numeralsigngreek'] = 0x0374;
+ t['numeralsignlowergreek'] = 0x0375;
+ t['numero'] = 0x2116;
+ t['nun'] = 0x05E0;
+ t['nundagesh'] = 0xFB40;
+ t['nundageshhebrew'] = 0xFB40;
+ t['nunhebrew'] = 0x05E0;
+ t['nvsquare'] = 0x33B5;
+ t['nwsquare'] = 0x33BB;
+ t['nyabengali'] = 0x099E;
+ t['nyadeva'] = 0x091E;
+ t['nyagujarati'] = 0x0A9E;
+ t['nyagurmukhi'] = 0x0A1E;
+ t['o'] = 0x006F;
+ t['oacute'] = 0x00F3;
+ t['oangthai'] = 0x0E2D;
+ t['obarred'] = 0x0275;
+ t['obarredcyrillic'] = 0x04E9;
+ t['obarreddieresiscyrillic'] = 0x04EB;
+ t['obengali'] = 0x0993;
+ t['obopomofo'] = 0x311B;
+ t['obreve'] = 0x014F;
+ t['ocandradeva'] = 0x0911;
+ t['ocandragujarati'] = 0x0A91;
+ t['ocandravowelsigndeva'] = 0x0949;
+ t['ocandravowelsigngujarati'] = 0x0AC9;
+ t['ocaron'] = 0x01D2;
+ t['ocircle'] = 0x24DE;
+ t['ocircumflex'] = 0x00F4;
+ t['ocircumflexacute'] = 0x1ED1;
+ t['ocircumflexdotbelow'] = 0x1ED9;
+ t['ocircumflexgrave'] = 0x1ED3;
+ t['ocircumflexhookabove'] = 0x1ED5;
+ t['ocircumflextilde'] = 0x1ED7;
+ t['ocyrillic'] = 0x043E;
+ t['odblacute'] = 0x0151;
+ t['odblgrave'] = 0x020D;
+ t['odeva'] = 0x0913;
+ t['odieresis'] = 0x00F6;
+ t['odieresiscyrillic'] = 0x04E7;
+ t['odotbelow'] = 0x1ECD;
+ t['oe'] = 0x0153;
+ t['oekorean'] = 0x315A;
+ t['ogonek'] = 0x02DB;
+ t['ogonekcmb'] = 0x0328;
+ t['ograve'] = 0x00F2;
+ t['ogujarati'] = 0x0A93;
+ t['oharmenian'] = 0x0585;
+ t['ohiragana'] = 0x304A;
+ t['ohookabove'] = 0x1ECF;
+ t['ohorn'] = 0x01A1;
+ t['ohornacute'] = 0x1EDB;
+ t['ohorndotbelow'] = 0x1EE3;
+ t['ohorngrave'] = 0x1EDD;
+ t['ohornhookabove'] = 0x1EDF;
+ t['ohorntilde'] = 0x1EE1;
+ t['ohungarumlaut'] = 0x0151;
+ t['oi'] = 0x01A3;
+ t['oinvertedbreve'] = 0x020F;
+ t['okatakana'] = 0x30AA;
+ t['okatakanahalfwidth'] = 0xFF75;
+ t['okorean'] = 0x3157;
+ t['olehebrew'] = 0x05AB;
+ t['omacron'] = 0x014D;
+ t['omacronacute'] = 0x1E53;
+ t['omacrongrave'] = 0x1E51;
+ t['omdeva'] = 0x0950;
+ t['omega'] = 0x03C9;
+ t['omega1'] = 0x03D6;
+ t['omegacyrillic'] = 0x0461;
+ t['omegalatinclosed'] = 0x0277;
+ t['omegaroundcyrillic'] = 0x047B;
+ t['omegatitlocyrillic'] = 0x047D;
+ t['omegatonos'] = 0x03CE;
+ t['omgujarati'] = 0x0AD0;
+ t['omicron'] = 0x03BF;
+ t['omicrontonos'] = 0x03CC;
+ t['omonospace'] = 0xFF4F;
+ t['one'] = 0x0031;
+ t['onearabic'] = 0x0661;
+ t['onebengali'] = 0x09E7;
+ t['onecircle'] = 0x2460;
+ t['onecircleinversesansserif'] = 0x278A;
+ t['onedeva'] = 0x0967;
+ t['onedotenleader'] = 0x2024;
+ t['oneeighth'] = 0x215B;
+ t['onefitted'] = 0xF6DC;
+ t['onegujarati'] = 0x0AE7;
+ t['onegurmukhi'] = 0x0A67;
+ t['onehackarabic'] = 0x0661;
+ t['onehalf'] = 0x00BD;
+ t['onehangzhou'] = 0x3021;
+ t['oneideographicparen'] = 0x3220;
+ t['oneinferior'] = 0x2081;
+ t['onemonospace'] = 0xFF11;
+ t['onenumeratorbengali'] = 0x09F4;
+ t['oneoldstyle'] = 0xF731;
+ t['oneparen'] = 0x2474;
+ t['oneperiod'] = 0x2488;
+ t['onepersian'] = 0x06F1;
+ t['onequarter'] = 0x00BC;
+ t['oneroman'] = 0x2170;
+ t['onesuperior'] = 0x00B9;
+ t['onethai'] = 0x0E51;
+ t['onethird'] = 0x2153;
+ t['oogonek'] = 0x01EB;
+ t['oogonekmacron'] = 0x01ED;
+ t['oogurmukhi'] = 0x0A13;
+ t['oomatragurmukhi'] = 0x0A4B;
+ t['oopen'] = 0x0254;
+ t['oparen'] = 0x24AA;
+ t['openbullet'] = 0x25E6;
+ t['option'] = 0x2325;
+ t['ordfeminine'] = 0x00AA;
+ t['ordmasculine'] = 0x00BA;
+ t['orthogonal'] = 0x221F;
+ t['oshortdeva'] = 0x0912;
+ t['oshortvowelsigndeva'] = 0x094A;
+ t['oslash'] = 0x00F8;
+ t['oslashacute'] = 0x01FF;
+ t['osmallhiragana'] = 0x3049;
+ t['osmallkatakana'] = 0x30A9;
+ t['osmallkatakanahalfwidth'] = 0xFF6B;
+ t['ostrokeacute'] = 0x01FF;
+ t['osuperior'] = 0xF6F0;
+ t['otcyrillic'] = 0x047F;
+ t['otilde'] = 0x00F5;
+ t['otildeacute'] = 0x1E4D;
+ t['otildedieresis'] = 0x1E4F;
+ t['oubopomofo'] = 0x3121;
+ t['overline'] = 0x203E;
+ t['overlinecenterline'] = 0xFE4A;
+ t['overlinecmb'] = 0x0305;
+ t['overlinedashed'] = 0xFE49;
+ t['overlinedblwavy'] = 0xFE4C;
+ t['overlinewavy'] = 0xFE4B;
+ t['overscore'] = 0x00AF;
+ t['ovowelsignbengali'] = 0x09CB;
+ t['ovowelsigndeva'] = 0x094B;
+ t['ovowelsigngujarati'] = 0x0ACB;
+ t['p'] = 0x0070;
+ t['paampssquare'] = 0x3380;
+ t['paasentosquare'] = 0x332B;
+ t['pabengali'] = 0x09AA;
+ t['pacute'] = 0x1E55;
+ t['padeva'] = 0x092A;
+ t['pagedown'] = 0x21DF;
+ t['pageup'] = 0x21DE;
+ t['pagujarati'] = 0x0AAA;
+ t['pagurmukhi'] = 0x0A2A;
+ t['pahiragana'] = 0x3071;
+ t['paiyannoithai'] = 0x0E2F;
+ t['pakatakana'] = 0x30D1;
+ t['palatalizationcyrilliccmb'] = 0x0484;
+ t['palochkacyrillic'] = 0x04C0;
+ t['pansioskorean'] = 0x317F;
+ t['paragraph'] = 0x00B6;
+ t['parallel'] = 0x2225;
+ t['parenleft'] = 0x0028;
+ t['parenleftaltonearabic'] = 0xFD3E;
+ t['parenleftbt'] = 0xF8ED;
+ t['parenleftex'] = 0xF8EC;
+ t['parenleftinferior'] = 0x208D;
+ t['parenleftmonospace'] = 0xFF08;
+ t['parenleftsmall'] = 0xFE59;
+ t['parenleftsuperior'] = 0x207D;
+ t['parenlefttp'] = 0xF8EB;
+ t['parenleftvertical'] = 0xFE35;
+ t['parenright'] = 0x0029;
+ t['parenrightaltonearabic'] = 0xFD3F;
+ t['parenrightbt'] = 0xF8F8;
+ t['parenrightex'] = 0xF8F7;
+ t['parenrightinferior'] = 0x208E;
+ t['parenrightmonospace'] = 0xFF09;
+ t['parenrightsmall'] = 0xFE5A;
+ t['parenrightsuperior'] = 0x207E;
+ t['parenrighttp'] = 0xF8F6;
+ t['parenrightvertical'] = 0xFE36;
+ t['partialdiff'] = 0x2202;
+ t['paseqhebrew'] = 0x05C0;
+ t['pashtahebrew'] = 0x0599;
+ t['pasquare'] = 0x33A9;
+ t['patah'] = 0x05B7;
+ t['patah11'] = 0x05B7;
+ t['patah1d'] = 0x05B7;
+ t['patah2a'] = 0x05B7;
+ t['patahhebrew'] = 0x05B7;
+ t['patahnarrowhebrew'] = 0x05B7;
+ t['patahquarterhebrew'] = 0x05B7;
+ t['patahwidehebrew'] = 0x05B7;
+ t['pazerhebrew'] = 0x05A1;
+ t['pbopomofo'] = 0x3106;
+ t['pcircle'] = 0x24DF;
+ t['pdotaccent'] = 0x1E57;
+ t['pe'] = 0x05E4;
+ t['pecyrillic'] = 0x043F;
+ t['pedagesh'] = 0xFB44;
+ t['pedageshhebrew'] = 0xFB44;
+ t['peezisquare'] = 0x333B;
+ t['pefinaldageshhebrew'] = 0xFB43;
+ t['peharabic'] = 0x067E;
+ t['peharmenian'] = 0x057A;
+ t['pehebrew'] = 0x05E4;
+ t['pehfinalarabic'] = 0xFB57;
+ t['pehinitialarabic'] = 0xFB58;
+ t['pehiragana'] = 0x307A;
+ t['pehmedialarabic'] = 0xFB59;
+ t['pekatakana'] = 0x30DA;
+ t['pemiddlehookcyrillic'] = 0x04A7;
+ t['perafehebrew'] = 0xFB4E;
+ t['percent'] = 0x0025;
+ t['percentarabic'] = 0x066A;
+ t['percentmonospace'] = 0xFF05;
+ t['percentsmall'] = 0xFE6A;
+ t['period'] = 0x002E;
+ t['periodarmenian'] = 0x0589;
+ t['periodcentered'] = 0x00B7;
+ t['periodhalfwidth'] = 0xFF61;
+ t['periodinferior'] = 0xF6E7;
+ t['periodmonospace'] = 0xFF0E;
+ t['periodsmall'] = 0xFE52;
+ t['periodsuperior'] = 0xF6E8;
+ t['perispomenigreekcmb'] = 0x0342;
+ t['perpendicular'] = 0x22A5;
+ t['perthousand'] = 0x2030;
+ t['peseta'] = 0x20A7;
+ t['pfsquare'] = 0x338A;
+ t['phabengali'] = 0x09AB;
+ t['phadeva'] = 0x092B;
+ t['phagujarati'] = 0x0AAB;
+ t['phagurmukhi'] = 0x0A2B;
+ t['phi'] = 0x03C6;
+ t['phi1'] = 0x03D5;
+ t['phieuphacirclekorean'] = 0x327A;
+ t['phieuphaparenkorean'] = 0x321A;
+ t['phieuphcirclekorean'] = 0x326C;
+ t['phieuphkorean'] = 0x314D;
+ t['phieuphparenkorean'] = 0x320C;
+ t['philatin'] = 0x0278;
+ t['phinthuthai'] = 0x0E3A;
+ t['phisymbolgreek'] = 0x03D5;
+ t['phook'] = 0x01A5;
+ t['phophanthai'] = 0x0E1E;
+ t['phophungthai'] = 0x0E1C;
+ t['phosamphaothai'] = 0x0E20;
+ t['pi'] = 0x03C0;
+ t['pieupacirclekorean'] = 0x3273;
+ t['pieupaparenkorean'] = 0x3213;
+ t['pieupcieuckorean'] = 0x3176;
+ t['pieupcirclekorean'] = 0x3265;
+ t['pieupkiyeokkorean'] = 0x3172;
+ t['pieupkorean'] = 0x3142;
+ t['pieupparenkorean'] = 0x3205;
+ t['pieupsioskiyeokkorean'] = 0x3174;
+ t['pieupsioskorean'] = 0x3144;
+ t['pieupsiostikeutkorean'] = 0x3175;
+ t['pieupthieuthkorean'] = 0x3177;
+ t['pieuptikeutkorean'] = 0x3173;
+ t['pihiragana'] = 0x3074;
+ t['pikatakana'] = 0x30D4;
+ t['pisymbolgreek'] = 0x03D6;
+ t['piwrarmenian'] = 0x0583;
+ t['plus'] = 0x002B;
+ t['plusbelowcmb'] = 0x031F;
+ t['pluscircle'] = 0x2295;
+ t['plusminus'] = 0x00B1;
+ t['plusmod'] = 0x02D6;
+ t['plusmonospace'] = 0xFF0B;
+ t['plussmall'] = 0xFE62;
+ t['plussuperior'] = 0x207A;
+ t['pmonospace'] = 0xFF50;
+ t['pmsquare'] = 0x33D8;
+ t['pohiragana'] = 0x307D;
+ t['pointingindexdownwhite'] = 0x261F;
+ t['pointingindexleftwhite'] = 0x261C;
+ t['pointingindexrightwhite'] = 0x261E;
+ t['pointingindexupwhite'] = 0x261D;
+ t['pokatakana'] = 0x30DD;
+ t['poplathai'] = 0x0E1B;
+ t['postalmark'] = 0x3012;
+ t['postalmarkface'] = 0x3020;
+ t['pparen'] = 0x24AB;
+ t['precedes'] = 0x227A;
+ t['prescription'] = 0x211E;
+ t['primemod'] = 0x02B9;
+ t['primereversed'] = 0x2035;
+ t['product'] = 0x220F;
+ t['projective'] = 0x2305;
+ t['prolongedkana'] = 0x30FC;
+ t['propellor'] = 0x2318;
+ t['propersubset'] = 0x2282;
+ t['propersuperset'] = 0x2283;
+ t['proportion'] = 0x2237;
+ t['proportional'] = 0x221D;
+ t['psi'] = 0x03C8;
+ t['psicyrillic'] = 0x0471;
+ t['psilipneumatacyrilliccmb'] = 0x0486;
+ t['pssquare'] = 0x33B0;
+ t['puhiragana'] = 0x3077;
+ t['pukatakana'] = 0x30D7;
+ t['pvsquare'] = 0x33B4;
+ t['pwsquare'] = 0x33BA;
+ t['q'] = 0x0071;
+ t['qadeva'] = 0x0958;
+ t['qadmahebrew'] = 0x05A8;
+ t['qafarabic'] = 0x0642;
+ t['qaffinalarabic'] = 0xFED6;
+ t['qafinitialarabic'] = 0xFED7;
+ t['qafmedialarabic'] = 0xFED8;
+ t['qamats'] = 0x05B8;
+ t['qamats10'] = 0x05B8;
+ t['qamats1a'] = 0x05B8;
+ t['qamats1c'] = 0x05B8;
+ t['qamats27'] = 0x05B8;
+ t['qamats29'] = 0x05B8;
+ t['qamats33'] = 0x05B8;
+ t['qamatsde'] = 0x05B8;
+ t['qamatshebrew'] = 0x05B8;
+ t['qamatsnarrowhebrew'] = 0x05B8;
+ t['qamatsqatanhebrew'] = 0x05B8;
+ t['qamatsqatannarrowhebrew'] = 0x05B8;
+ t['qamatsqatanquarterhebrew'] = 0x05B8;
+ t['qamatsqatanwidehebrew'] = 0x05B8;
+ t['qamatsquarterhebrew'] = 0x05B8;
+ t['qamatswidehebrew'] = 0x05B8;
+ t['qarneyparahebrew'] = 0x059F;
+ t['qbopomofo'] = 0x3111;
+ t['qcircle'] = 0x24E0;
+ t['qhook'] = 0x02A0;
+ t['qmonospace'] = 0xFF51;
+ t['qof'] = 0x05E7;
+ t['qofdagesh'] = 0xFB47;
+ t['qofdageshhebrew'] = 0xFB47;
+ t['qofhebrew'] = 0x05E7;
+ t['qparen'] = 0x24AC;
+ t['quarternote'] = 0x2669;
+ t['qubuts'] = 0x05BB;
+ t['qubuts18'] = 0x05BB;
+ t['qubuts25'] = 0x05BB;
+ t['qubuts31'] = 0x05BB;
+ t['qubutshebrew'] = 0x05BB;
+ t['qubutsnarrowhebrew'] = 0x05BB;
+ t['qubutsquarterhebrew'] = 0x05BB;
+ t['qubutswidehebrew'] = 0x05BB;
+ t['question'] = 0x003F;
+ t['questionarabic'] = 0x061F;
+ t['questionarmenian'] = 0x055E;
+ t['questiondown'] = 0x00BF;
+ t['questiondownsmall'] = 0xF7BF;
+ t['questiongreek'] = 0x037E;
+ t['questionmonospace'] = 0xFF1F;
+ t['questionsmall'] = 0xF73F;
+ t['quotedbl'] = 0x0022;
+ t['quotedblbase'] = 0x201E;
+ t['quotedblleft'] = 0x201C;
+ t['quotedblmonospace'] = 0xFF02;
+ t['quotedblprime'] = 0x301E;
+ t['quotedblprimereversed'] = 0x301D;
+ t['quotedblright'] = 0x201D;
+ t['quoteleft'] = 0x2018;
+ t['quoteleftreversed'] = 0x201B;
+ t['quotereversed'] = 0x201B;
+ t['quoteright'] = 0x2019;
+ t['quoterightn'] = 0x0149;
+ t['quotesinglbase'] = 0x201A;
+ t['quotesingle'] = 0x0027;
+ t['quotesinglemonospace'] = 0xFF07;
+ t['r'] = 0x0072;
+ t['raarmenian'] = 0x057C;
+ t['rabengali'] = 0x09B0;
+ t['racute'] = 0x0155;
+ t['radeva'] = 0x0930;
+ t['radical'] = 0x221A;
+ t['radicalex'] = 0xF8E5;
+ t['radoverssquare'] = 0x33AE;
+ t['radoverssquaredsquare'] = 0x33AF;
+ t['radsquare'] = 0x33AD;
+ t['rafe'] = 0x05BF;
+ t['rafehebrew'] = 0x05BF;
+ t['ragujarati'] = 0x0AB0;
+ t['ragurmukhi'] = 0x0A30;
+ t['rahiragana'] = 0x3089;
+ t['rakatakana'] = 0x30E9;
+ t['rakatakanahalfwidth'] = 0xFF97;
+ t['ralowerdiagonalbengali'] = 0x09F1;
+ t['ramiddlediagonalbengali'] = 0x09F0;
+ t['ramshorn'] = 0x0264;
+ t['ratio'] = 0x2236;
+ t['rbopomofo'] = 0x3116;
+ t['rcaron'] = 0x0159;
+ t['rcedilla'] = 0x0157;
+ t['rcircle'] = 0x24E1;
+ t['rcommaaccent'] = 0x0157;
+ t['rdblgrave'] = 0x0211;
+ t['rdotaccent'] = 0x1E59;
+ t['rdotbelow'] = 0x1E5B;
+ t['rdotbelowmacron'] = 0x1E5D;
+ t['referencemark'] = 0x203B;
+ t['reflexsubset'] = 0x2286;
+ t['reflexsuperset'] = 0x2287;
+ t['registered'] = 0x00AE;
+ t['registersans'] = 0xF8E8;
+ t['registerserif'] = 0xF6DA;
+ t['reharabic'] = 0x0631;
+ t['reharmenian'] = 0x0580;
+ t['rehfinalarabic'] = 0xFEAE;
+ t['rehiragana'] = 0x308C;
+ t['rekatakana'] = 0x30EC;
+ t['rekatakanahalfwidth'] = 0xFF9A;
+ t['resh'] = 0x05E8;
+ t['reshdageshhebrew'] = 0xFB48;
+ t['reshhebrew'] = 0x05E8;
+ t['reversedtilde'] = 0x223D;
+ t['reviahebrew'] = 0x0597;
+ t['reviamugrashhebrew'] = 0x0597;
+ t['revlogicalnot'] = 0x2310;
+ t['rfishhook'] = 0x027E;
+ t['rfishhookreversed'] = 0x027F;
+ t['rhabengali'] = 0x09DD;
+ t['rhadeva'] = 0x095D;
+ t['rho'] = 0x03C1;
+ t['rhook'] = 0x027D;
+ t['rhookturned'] = 0x027B;
+ t['rhookturnedsuperior'] = 0x02B5;
+ t['rhosymbolgreek'] = 0x03F1;
+ t['rhotichookmod'] = 0x02DE;
+ t['rieulacirclekorean'] = 0x3271;
+ t['rieulaparenkorean'] = 0x3211;
+ t['rieulcirclekorean'] = 0x3263;
+ t['rieulhieuhkorean'] = 0x3140;
+ t['rieulkiyeokkorean'] = 0x313A;
+ t['rieulkiyeoksioskorean'] = 0x3169;
+ t['rieulkorean'] = 0x3139;
+ t['rieulmieumkorean'] = 0x313B;
+ t['rieulpansioskorean'] = 0x316C;
+ t['rieulparenkorean'] = 0x3203;
+ t['rieulphieuphkorean'] = 0x313F;
+ t['rieulpieupkorean'] = 0x313C;
+ t['rieulpieupsioskorean'] = 0x316B;
+ t['rieulsioskorean'] = 0x313D;
+ t['rieulthieuthkorean'] = 0x313E;
+ t['rieultikeutkorean'] = 0x316A;
+ t['rieulyeorinhieuhkorean'] = 0x316D;
+ t['rightangle'] = 0x221F;
+ t['righttackbelowcmb'] = 0x0319;
+ t['righttriangle'] = 0x22BF;
+ t['rihiragana'] = 0x308A;
+ t['rikatakana'] = 0x30EA;
+ t['rikatakanahalfwidth'] = 0xFF98;
+ t['ring'] = 0x02DA;
+ t['ringbelowcmb'] = 0x0325;
+ t['ringcmb'] = 0x030A;
+ t['ringhalfleft'] = 0x02BF;
+ t['ringhalfleftarmenian'] = 0x0559;
+ t['ringhalfleftbelowcmb'] = 0x031C;
+ t['ringhalfleftcentered'] = 0x02D3;
+ t['ringhalfright'] = 0x02BE;
+ t['ringhalfrightbelowcmb'] = 0x0339;
+ t['ringhalfrightcentered'] = 0x02D2;
+ t['rinvertedbreve'] = 0x0213;
+ t['rittorusquare'] = 0x3351;
+ t['rlinebelow'] = 0x1E5F;
+ t['rlongleg'] = 0x027C;
+ t['rlonglegturned'] = 0x027A;
+ t['rmonospace'] = 0xFF52;
+ t['rohiragana'] = 0x308D;
+ t['rokatakana'] = 0x30ED;
+ t['rokatakanahalfwidth'] = 0xFF9B;
+ t['roruathai'] = 0x0E23;
+ t['rparen'] = 0x24AD;
+ t['rrabengali'] = 0x09DC;
+ t['rradeva'] = 0x0931;
+ t['rragurmukhi'] = 0x0A5C;
+ t['rreharabic'] = 0x0691;
+ t['rrehfinalarabic'] = 0xFB8D;
+ t['rrvocalicbengali'] = 0x09E0;
+ t['rrvocalicdeva'] = 0x0960;
+ t['rrvocalicgujarati'] = 0x0AE0;
+ t['rrvocalicvowelsignbengali'] = 0x09C4;
+ t['rrvocalicvowelsigndeva'] = 0x0944;
+ t['rrvocalicvowelsigngujarati'] = 0x0AC4;
+ t['rsuperior'] = 0xF6F1;
+ t['rtblock'] = 0x2590;
+ t['rturned'] = 0x0279;
+ t['rturnedsuperior'] = 0x02B4;
+ t['ruhiragana'] = 0x308B;
+ t['rukatakana'] = 0x30EB;
+ t['rukatakanahalfwidth'] = 0xFF99;
+ t['rupeemarkbengali'] = 0x09F2;
+ t['rupeesignbengali'] = 0x09F3;
+ t['rupiah'] = 0xF6DD;
+ t['ruthai'] = 0x0E24;
+ t['rvocalicbengali'] = 0x098B;
+ t['rvocalicdeva'] = 0x090B;
+ t['rvocalicgujarati'] = 0x0A8B;
+ t['rvocalicvowelsignbengali'] = 0x09C3;
+ t['rvocalicvowelsigndeva'] = 0x0943;
+ t['rvocalicvowelsigngujarati'] = 0x0AC3;
+ t['s'] = 0x0073;
+ t['sabengali'] = 0x09B8;
+ t['sacute'] = 0x015B;
+ t['sacutedotaccent'] = 0x1E65;
+ t['sadarabic'] = 0x0635;
+ t['sadeva'] = 0x0938;
+ t['sadfinalarabic'] = 0xFEBA;
+ t['sadinitialarabic'] = 0xFEBB;
+ t['sadmedialarabic'] = 0xFEBC;
+ t['sagujarati'] = 0x0AB8;
+ t['sagurmukhi'] = 0x0A38;
+ t['sahiragana'] = 0x3055;
+ t['sakatakana'] = 0x30B5;
+ t['sakatakanahalfwidth'] = 0xFF7B;
+ t['sallallahoualayhewasallamarabic'] = 0xFDFA;
+ t['samekh'] = 0x05E1;
+ t['samekhdagesh'] = 0xFB41;
+ t['samekhdageshhebrew'] = 0xFB41;
+ t['samekhhebrew'] = 0x05E1;
+ t['saraaathai'] = 0x0E32;
+ t['saraaethai'] = 0x0E41;
+ t['saraaimaimalaithai'] = 0x0E44;
+ t['saraaimaimuanthai'] = 0x0E43;
+ t['saraamthai'] = 0x0E33;
+ t['saraathai'] = 0x0E30;
+ t['saraethai'] = 0x0E40;
+ t['saraiileftthai'] = 0xF886;
+ t['saraiithai'] = 0x0E35;
+ t['saraileftthai'] = 0xF885;
+ t['saraithai'] = 0x0E34;
+ t['saraothai'] = 0x0E42;
+ t['saraueeleftthai'] = 0xF888;
+ t['saraueethai'] = 0x0E37;
+ t['saraueleftthai'] = 0xF887;
+ t['sarauethai'] = 0x0E36;
+ t['sarauthai'] = 0x0E38;
+ t['sarauuthai'] = 0x0E39;
+ t['sbopomofo'] = 0x3119;
+ t['scaron'] = 0x0161;
+ t['scarondotaccent'] = 0x1E67;
+ t['scedilla'] = 0x015F;
+ t['schwa'] = 0x0259;
+ t['schwacyrillic'] = 0x04D9;
+ t['schwadieresiscyrillic'] = 0x04DB;
+ t['schwahook'] = 0x025A;
+ t['scircle'] = 0x24E2;
+ t['scircumflex'] = 0x015D;
+ t['scommaaccent'] = 0x0219;
+ t['sdotaccent'] = 0x1E61;
+ t['sdotbelow'] = 0x1E63;
+ t['sdotbelowdotaccent'] = 0x1E69;
+ t['seagullbelowcmb'] = 0x033C;
+ t['second'] = 0x2033;
+ t['secondtonechinese'] = 0x02CA;
+ t['section'] = 0x00A7;
+ t['seenarabic'] = 0x0633;
+ t['seenfinalarabic'] = 0xFEB2;
+ t['seeninitialarabic'] = 0xFEB3;
+ t['seenmedialarabic'] = 0xFEB4;
+ t['segol'] = 0x05B6;
+ t['segol13'] = 0x05B6;
+ t['segol1f'] = 0x05B6;
+ t['segol2c'] = 0x05B6;
+ t['segolhebrew'] = 0x05B6;
+ t['segolnarrowhebrew'] = 0x05B6;
+ t['segolquarterhebrew'] = 0x05B6;
+ t['segoltahebrew'] = 0x0592;
+ t['segolwidehebrew'] = 0x05B6;
+ t['seharmenian'] = 0x057D;
+ t['sehiragana'] = 0x305B;
+ t['sekatakana'] = 0x30BB;
+ t['sekatakanahalfwidth'] = 0xFF7E;
+ t['semicolon'] = 0x003B;
+ t['semicolonarabic'] = 0x061B;
+ t['semicolonmonospace'] = 0xFF1B;
+ t['semicolonsmall'] = 0xFE54;
+ t['semivoicedmarkkana'] = 0x309C;
+ t['semivoicedmarkkanahalfwidth'] = 0xFF9F;
+ t['sentisquare'] = 0x3322;
+ t['sentosquare'] = 0x3323;
+ t['seven'] = 0x0037;
+ t['sevenarabic'] = 0x0667;
+ t['sevenbengali'] = 0x09ED;
+ t['sevencircle'] = 0x2466;
+ t['sevencircleinversesansserif'] = 0x2790;
+ t['sevendeva'] = 0x096D;
+ t['seveneighths'] = 0x215E;
+ t['sevengujarati'] = 0x0AED;
+ t['sevengurmukhi'] = 0x0A6D;
+ t['sevenhackarabic'] = 0x0667;
+ t['sevenhangzhou'] = 0x3027;
+ t['sevenideographicparen'] = 0x3226;
+ t['seveninferior'] = 0x2087;
+ t['sevenmonospace'] = 0xFF17;
+ t['sevenoldstyle'] = 0xF737;
+ t['sevenparen'] = 0x247A;
+ t['sevenperiod'] = 0x248E;
+ t['sevenpersian'] = 0x06F7;
+ t['sevenroman'] = 0x2176;
+ t['sevensuperior'] = 0x2077;
+ t['seventeencircle'] = 0x2470;
+ t['seventeenparen'] = 0x2484;
+ t['seventeenperiod'] = 0x2498;
+ t['seventhai'] = 0x0E57;
+ t['sfthyphen'] = 0x00AD;
+ t['shaarmenian'] = 0x0577;
+ t['shabengali'] = 0x09B6;
+ t['shacyrillic'] = 0x0448;
+ t['shaddaarabic'] = 0x0651;
+ t['shaddadammaarabic'] = 0xFC61;
+ t['shaddadammatanarabic'] = 0xFC5E;
+ t['shaddafathaarabic'] = 0xFC60;
+ t['shaddakasraarabic'] = 0xFC62;
+ t['shaddakasratanarabic'] = 0xFC5F;
+ t['shade'] = 0x2592;
+ t['shadedark'] = 0x2593;
+ t['shadelight'] = 0x2591;
+ t['shademedium'] = 0x2592;
+ t['shadeva'] = 0x0936;
+ t['shagujarati'] = 0x0AB6;
+ t['shagurmukhi'] = 0x0A36;
+ t['shalshelethebrew'] = 0x0593;
+ t['shbopomofo'] = 0x3115;
+ t['shchacyrillic'] = 0x0449;
+ t['sheenarabic'] = 0x0634;
+ t['sheenfinalarabic'] = 0xFEB6;
+ t['sheeninitialarabic'] = 0xFEB7;
+ t['sheenmedialarabic'] = 0xFEB8;
+ t['sheicoptic'] = 0x03E3;
+ t['sheqel'] = 0x20AA;
+ t['sheqelhebrew'] = 0x20AA;
+ t['sheva'] = 0x05B0;
+ t['sheva115'] = 0x05B0;
+ t['sheva15'] = 0x05B0;
+ t['sheva22'] = 0x05B0;
+ t['sheva2e'] = 0x05B0;
+ t['shevahebrew'] = 0x05B0;
+ t['shevanarrowhebrew'] = 0x05B0;
+ t['shevaquarterhebrew'] = 0x05B0;
+ t['shevawidehebrew'] = 0x05B0;
+ t['shhacyrillic'] = 0x04BB;
+ t['shimacoptic'] = 0x03ED;
+ t['shin'] = 0x05E9;
+ t['shindagesh'] = 0xFB49;
+ t['shindageshhebrew'] = 0xFB49;
+ t['shindageshshindot'] = 0xFB2C;
+ t['shindageshshindothebrew'] = 0xFB2C;
+ t['shindageshsindot'] = 0xFB2D;
+ t['shindageshsindothebrew'] = 0xFB2D;
+ t['shindothebrew'] = 0x05C1;
+ t['shinhebrew'] = 0x05E9;
+ t['shinshindot'] = 0xFB2A;
+ t['shinshindothebrew'] = 0xFB2A;
+ t['shinsindot'] = 0xFB2B;
+ t['shinsindothebrew'] = 0xFB2B;
+ t['shook'] = 0x0282;
+ t['sigma'] = 0x03C3;
+ t['sigma1'] = 0x03C2;
+ t['sigmafinal'] = 0x03C2;
+ t['sigmalunatesymbolgreek'] = 0x03F2;
+ t['sihiragana'] = 0x3057;
+ t['sikatakana'] = 0x30B7;
+ t['sikatakanahalfwidth'] = 0xFF7C;
+ t['siluqhebrew'] = 0x05BD;
+ t['siluqlefthebrew'] = 0x05BD;
+ t['similar'] = 0x223C;
+ t['sindothebrew'] = 0x05C2;
+ t['siosacirclekorean'] = 0x3274;
+ t['siosaparenkorean'] = 0x3214;
+ t['sioscieuckorean'] = 0x317E;
+ t['sioscirclekorean'] = 0x3266;
+ t['sioskiyeokkorean'] = 0x317A;
+ t['sioskorean'] = 0x3145;
+ t['siosnieunkorean'] = 0x317B;
+ t['siosparenkorean'] = 0x3206;
+ t['siospieupkorean'] = 0x317D;
+ t['siostikeutkorean'] = 0x317C;
+ t['six'] = 0x0036;
+ t['sixarabic'] = 0x0666;
+ t['sixbengali'] = 0x09EC;
+ t['sixcircle'] = 0x2465;
+ t['sixcircleinversesansserif'] = 0x278F;
+ t['sixdeva'] = 0x096C;
+ t['sixgujarati'] = 0x0AEC;
+ t['sixgurmukhi'] = 0x0A6C;
+ t['sixhackarabic'] = 0x0666;
+ t['sixhangzhou'] = 0x3026;
+ t['sixideographicparen'] = 0x3225;
+ t['sixinferior'] = 0x2086;
+ t['sixmonospace'] = 0xFF16;
+ t['sixoldstyle'] = 0xF736;
+ t['sixparen'] = 0x2479;
+ t['sixperiod'] = 0x248D;
+ t['sixpersian'] = 0x06F6;
+ t['sixroman'] = 0x2175;
+ t['sixsuperior'] = 0x2076;
+ t['sixteencircle'] = 0x246F;
+ t['sixteencurrencydenominatorbengali'] = 0x09F9;
+ t['sixteenparen'] = 0x2483;
+ t['sixteenperiod'] = 0x2497;
+ t['sixthai'] = 0x0E56;
+ t['slash'] = 0x002F;
+ t['slashmonospace'] = 0xFF0F;
+ t['slong'] = 0x017F;
+ t['slongdotaccent'] = 0x1E9B;
+ t['smileface'] = 0x263A;
+ t['smonospace'] = 0xFF53;
+ t['sofpasuqhebrew'] = 0x05C3;
+ t['softhyphen'] = 0x00AD;
+ t['softsigncyrillic'] = 0x044C;
+ t['sohiragana'] = 0x305D;
+ t['sokatakana'] = 0x30BD;
+ t['sokatakanahalfwidth'] = 0xFF7F;
+ t['soliduslongoverlaycmb'] = 0x0338;
+ t['solidusshortoverlaycmb'] = 0x0337;
+ t['sorusithai'] = 0x0E29;
+ t['sosalathai'] = 0x0E28;
+ t['sosothai'] = 0x0E0B;
+ t['sosuathai'] = 0x0E2A;
+ t['space'] = 0x0020;
+ t['spacehackarabic'] = 0x0020;
+ t['spade'] = 0x2660;
+ t['spadesuitblack'] = 0x2660;
+ t['spadesuitwhite'] = 0x2664;
+ t['sparen'] = 0x24AE;
+ t['squarebelowcmb'] = 0x033B;
+ t['squarecc'] = 0x33C4;
+ t['squarecm'] = 0x339D;
+ t['squarediagonalcrosshatchfill'] = 0x25A9;
+ t['squarehorizontalfill'] = 0x25A4;
+ t['squarekg'] = 0x338F;
+ t['squarekm'] = 0x339E;
+ t['squarekmcapital'] = 0x33CE;
+ t['squareln'] = 0x33D1;
+ t['squarelog'] = 0x33D2;
+ t['squaremg'] = 0x338E;
+ t['squaremil'] = 0x33D5;
+ t['squaremm'] = 0x339C;
+ t['squaremsquared'] = 0x33A1;
+ t['squareorthogonalcrosshatchfill'] = 0x25A6;
+ t['squareupperlefttolowerrightfill'] = 0x25A7;
+ t['squareupperrighttolowerleftfill'] = 0x25A8;
+ t['squareverticalfill'] = 0x25A5;
+ t['squarewhitewithsmallblack'] = 0x25A3;
+ t['srsquare'] = 0x33DB;
+ t['ssabengali'] = 0x09B7;
+ t['ssadeva'] = 0x0937;
+ t['ssagujarati'] = 0x0AB7;
+ t['ssangcieuckorean'] = 0x3149;
+ t['ssanghieuhkorean'] = 0x3185;
+ t['ssangieungkorean'] = 0x3180;
+ t['ssangkiyeokkorean'] = 0x3132;
+ t['ssangnieunkorean'] = 0x3165;
+ t['ssangpieupkorean'] = 0x3143;
+ t['ssangsioskorean'] = 0x3146;
+ t['ssangtikeutkorean'] = 0x3138;
+ t['ssuperior'] = 0xF6F2;
+ t['sterling'] = 0x00A3;
+ t['sterlingmonospace'] = 0xFFE1;
+ t['strokelongoverlaycmb'] = 0x0336;
+ t['strokeshortoverlaycmb'] = 0x0335;
+ t['subset'] = 0x2282;
+ t['subsetnotequal'] = 0x228A;
+ t['subsetorequal'] = 0x2286;
+ t['succeeds'] = 0x227B;
+ t['suchthat'] = 0x220B;
+ t['suhiragana'] = 0x3059;
+ t['sukatakana'] = 0x30B9;
+ t['sukatakanahalfwidth'] = 0xFF7D;
+ t['sukunarabic'] = 0x0652;
+ t['summation'] = 0x2211;
+ t['sun'] = 0x263C;
+ t['superset'] = 0x2283;
+ t['supersetnotequal'] = 0x228B;
+ t['supersetorequal'] = 0x2287;
+ t['svsquare'] = 0x33DC;
+ t['syouwaerasquare'] = 0x337C;
+ t['t'] = 0x0074;
+ t['tabengali'] = 0x09A4;
+ t['tackdown'] = 0x22A4;
+ t['tackleft'] = 0x22A3;
+ t['tadeva'] = 0x0924;
+ t['tagujarati'] = 0x0AA4;
+ t['tagurmukhi'] = 0x0A24;
+ t['taharabic'] = 0x0637;
+ t['tahfinalarabic'] = 0xFEC2;
+ t['tahinitialarabic'] = 0xFEC3;
+ t['tahiragana'] = 0x305F;
+ t['tahmedialarabic'] = 0xFEC4;
+ t['taisyouerasquare'] = 0x337D;
+ t['takatakana'] = 0x30BF;
+ t['takatakanahalfwidth'] = 0xFF80;
+ t['tatweelarabic'] = 0x0640;
+ t['tau'] = 0x03C4;
+ t['tav'] = 0x05EA;
+ t['tavdages'] = 0xFB4A;
+ t['tavdagesh'] = 0xFB4A;
+ t['tavdageshhebrew'] = 0xFB4A;
+ t['tavhebrew'] = 0x05EA;
+ t['tbar'] = 0x0167;
+ t['tbopomofo'] = 0x310A;
+ t['tcaron'] = 0x0165;
+ t['tccurl'] = 0x02A8;
+ t['tcedilla'] = 0x0163;
+ t['tcheharabic'] = 0x0686;
+ t['tchehfinalarabic'] = 0xFB7B;
+ t['tchehinitialarabic'] = 0xFB7C;
+ t['tchehmedialarabic'] = 0xFB7D;
+ t['tcircle'] = 0x24E3;
+ t['tcircumflexbelow'] = 0x1E71;
+ t['tcommaaccent'] = 0x0163;
+ t['tdieresis'] = 0x1E97;
+ t['tdotaccent'] = 0x1E6B;
+ t['tdotbelow'] = 0x1E6D;
+ t['tecyrillic'] = 0x0442;
+ t['tedescendercyrillic'] = 0x04AD;
+ t['teharabic'] = 0x062A;
+ t['tehfinalarabic'] = 0xFE96;
+ t['tehhahinitialarabic'] = 0xFCA2;
+ t['tehhahisolatedarabic'] = 0xFC0C;
+ t['tehinitialarabic'] = 0xFE97;
+ t['tehiragana'] = 0x3066;
+ t['tehjeeminitialarabic'] = 0xFCA1;
+ t['tehjeemisolatedarabic'] = 0xFC0B;
+ t['tehmarbutaarabic'] = 0x0629;
+ t['tehmarbutafinalarabic'] = 0xFE94;
+ t['tehmedialarabic'] = 0xFE98;
+ t['tehmeeminitialarabic'] = 0xFCA4;
+ t['tehmeemisolatedarabic'] = 0xFC0E;
+ t['tehnoonfinalarabic'] = 0xFC73;
+ t['tekatakana'] = 0x30C6;
+ t['tekatakanahalfwidth'] = 0xFF83;
+ t['telephone'] = 0x2121;
+ t['telephoneblack'] = 0x260E;
+ t['telishagedolahebrew'] = 0x05A0;
+ t['telishaqetanahebrew'] = 0x05A9;
+ t['tencircle'] = 0x2469;
+ t['tenideographicparen'] = 0x3229;
+ t['tenparen'] = 0x247D;
+ t['tenperiod'] = 0x2491;
+ t['tenroman'] = 0x2179;
+ t['tesh'] = 0x02A7;
+ t['tet'] = 0x05D8;
+ t['tetdagesh'] = 0xFB38;
+ t['tetdageshhebrew'] = 0xFB38;
+ t['tethebrew'] = 0x05D8;
+ t['tetsecyrillic'] = 0x04B5;
+ t['tevirhebrew'] = 0x059B;
+ t['tevirlefthebrew'] = 0x059B;
+ t['thabengali'] = 0x09A5;
+ t['thadeva'] = 0x0925;
+ t['thagujarati'] = 0x0AA5;
+ t['thagurmukhi'] = 0x0A25;
+ t['thalarabic'] = 0x0630;
+ t['thalfinalarabic'] = 0xFEAC;
+ t['thanthakhatlowleftthai'] = 0xF898;
+ t['thanthakhatlowrightthai'] = 0xF897;
+ t['thanthakhatthai'] = 0x0E4C;
+ t['thanthakhatupperleftthai'] = 0xF896;
+ t['theharabic'] = 0x062B;
+ t['thehfinalarabic'] = 0xFE9A;
+ t['thehinitialarabic'] = 0xFE9B;
+ t['thehmedialarabic'] = 0xFE9C;
+ t['thereexists'] = 0x2203;
+ t['therefore'] = 0x2234;
+ t['theta'] = 0x03B8;
+ t['theta1'] = 0x03D1;
+ t['thetasymbolgreek'] = 0x03D1;
+ t['thieuthacirclekorean'] = 0x3279;
+ t['thieuthaparenkorean'] = 0x3219;
+ t['thieuthcirclekorean'] = 0x326B;
+ t['thieuthkorean'] = 0x314C;
+ t['thieuthparenkorean'] = 0x320B;
+ t['thirteencircle'] = 0x246C;
+ t['thirteenparen'] = 0x2480;
+ t['thirteenperiod'] = 0x2494;
+ t['thonangmonthothai'] = 0x0E11;
+ t['thook'] = 0x01AD;
+ t['thophuthaothai'] = 0x0E12;
+ t['thorn'] = 0x00FE;
+ t['thothahanthai'] = 0x0E17;
+ t['thothanthai'] = 0x0E10;
+ t['thothongthai'] = 0x0E18;
+ t['thothungthai'] = 0x0E16;
+ t['thousandcyrillic'] = 0x0482;
+ t['thousandsseparatorarabic'] = 0x066C;
+ t['thousandsseparatorpersian'] = 0x066C;
+ t['three'] = 0x0033;
+ t['threearabic'] = 0x0663;
+ t['threebengali'] = 0x09E9;
+ t['threecircle'] = 0x2462;
+ t['threecircleinversesansserif'] = 0x278C;
+ t['threedeva'] = 0x0969;
+ t['threeeighths'] = 0x215C;
+ t['threegujarati'] = 0x0AE9;
+ t['threegurmukhi'] = 0x0A69;
+ t['threehackarabic'] = 0x0663;
+ t['threehangzhou'] = 0x3023;
+ t['threeideographicparen'] = 0x3222;
+ t['threeinferior'] = 0x2083;
+ t['threemonospace'] = 0xFF13;
+ t['threenumeratorbengali'] = 0x09F6;
+ t['threeoldstyle'] = 0xF733;
+ t['threeparen'] = 0x2476;
+ t['threeperiod'] = 0x248A;
+ t['threepersian'] = 0x06F3;
+ t['threequarters'] = 0x00BE;
+ t['threequartersemdash'] = 0xF6DE;
+ t['threeroman'] = 0x2172;
+ t['threesuperior'] = 0x00B3;
+ t['threethai'] = 0x0E53;
+ t['thzsquare'] = 0x3394;
+ t['tihiragana'] = 0x3061;
+ t['tikatakana'] = 0x30C1;
+ t['tikatakanahalfwidth'] = 0xFF81;
+ t['tikeutacirclekorean'] = 0x3270;
+ t['tikeutaparenkorean'] = 0x3210;
+ t['tikeutcirclekorean'] = 0x3262;
+ t['tikeutkorean'] = 0x3137;
+ t['tikeutparenkorean'] = 0x3202;
+ t['tilde'] = 0x02DC;
+ t['tildebelowcmb'] = 0x0330;
+ t['tildecmb'] = 0x0303;
+ t['tildecomb'] = 0x0303;
+ t['tildedoublecmb'] = 0x0360;
+ t['tildeoperator'] = 0x223C;
+ t['tildeoverlaycmb'] = 0x0334;
+ t['tildeverticalcmb'] = 0x033E;
+ t['timescircle'] = 0x2297;
+ t['tipehahebrew'] = 0x0596;
+ t['tipehalefthebrew'] = 0x0596;
+ t['tippigurmukhi'] = 0x0A70;
+ t['titlocyrilliccmb'] = 0x0483;
+ t['tiwnarmenian'] = 0x057F;
+ t['tlinebelow'] = 0x1E6F;
+ t['tmonospace'] = 0xFF54;
+ t['toarmenian'] = 0x0569;
+ t['tohiragana'] = 0x3068;
+ t['tokatakana'] = 0x30C8;
+ t['tokatakanahalfwidth'] = 0xFF84;
+ t['tonebarextrahighmod'] = 0x02E5;
+ t['tonebarextralowmod'] = 0x02E9;
+ t['tonebarhighmod'] = 0x02E6;
+ t['tonebarlowmod'] = 0x02E8;
+ t['tonebarmidmod'] = 0x02E7;
+ t['tonefive'] = 0x01BD;
+ t['tonesix'] = 0x0185;
+ t['tonetwo'] = 0x01A8;
+ t['tonos'] = 0x0384;
+ t['tonsquare'] = 0x3327;
+ t['topatakthai'] = 0x0E0F;
+ t['tortoiseshellbracketleft'] = 0x3014;
+ t['tortoiseshellbracketleftsmall'] = 0xFE5D;
+ t['tortoiseshellbracketleftvertical'] = 0xFE39;
+ t['tortoiseshellbracketright'] = 0x3015;
+ t['tortoiseshellbracketrightsmall'] = 0xFE5E;
+ t['tortoiseshellbracketrightvertical'] = 0xFE3A;
+ t['totaothai'] = 0x0E15;
+ t['tpalatalhook'] = 0x01AB;
+ t['tparen'] = 0x24AF;
+ t['trademark'] = 0x2122;
+ t['trademarksans'] = 0xF8EA;
+ t['trademarkserif'] = 0xF6DB;
+ t['tretroflexhook'] = 0x0288;
+ t['triagdn'] = 0x25BC;
+ t['triaglf'] = 0x25C4;
+ t['triagrt'] = 0x25BA;
+ t['triagup'] = 0x25B2;
+ t['ts'] = 0x02A6;
+ t['tsadi'] = 0x05E6;
+ t['tsadidagesh'] = 0xFB46;
+ t['tsadidageshhebrew'] = 0xFB46;
+ t['tsadihebrew'] = 0x05E6;
+ t['tsecyrillic'] = 0x0446;
+ t['tsere'] = 0x05B5;
+ t['tsere12'] = 0x05B5;
+ t['tsere1e'] = 0x05B5;
+ t['tsere2b'] = 0x05B5;
+ t['tserehebrew'] = 0x05B5;
+ t['tserenarrowhebrew'] = 0x05B5;
+ t['tserequarterhebrew'] = 0x05B5;
+ t['tserewidehebrew'] = 0x05B5;
+ t['tshecyrillic'] = 0x045B;
+ t['tsuperior'] = 0xF6F3;
+ t['ttabengali'] = 0x099F;
+ t['ttadeva'] = 0x091F;
+ t['ttagujarati'] = 0x0A9F;
+ t['ttagurmukhi'] = 0x0A1F;
+ t['tteharabic'] = 0x0679;
+ t['ttehfinalarabic'] = 0xFB67;
+ t['ttehinitialarabic'] = 0xFB68;
+ t['ttehmedialarabic'] = 0xFB69;
+ t['tthabengali'] = 0x09A0;
+ t['tthadeva'] = 0x0920;
+ t['tthagujarati'] = 0x0AA0;
+ t['tthagurmukhi'] = 0x0A20;
+ t['tturned'] = 0x0287;
+ t['tuhiragana'] = 0x3064;
+ t['tukatakana'] = 0x30C4;
+ t['tukatakanahalfwidth'] = 0xFF82;
+ t['tusmallhiragana'] = 0x3063;
+ t['tusmallkatakana'] = 0x30C3;
+ t['tusmallkatakanahalfwidth'] = 0xFF6F;
+ t['twelvecircle'] = 0x246B;
+ t['twelveparen'] = 0x247F;
+ t['twelveperiod'] = 0x2493;
+ t['twelveroman'] = 0x217B;
+ t['twentycircle'] = 0x2473;
+ t['twentyhangzhou'] = 0x5344;
+ t['twentyparen'] = 0x2487;
+ t['twentyperiod'] = 0x249B;
+ t['two'] = 0x0032;
+ t['twoarabic'] = 0x0662;
+ t['twobengali'] = 0x09E8;
+ t['twocircle'] = 0x2461;
+ t['twocircleinversesansserif'] = 0x278B;
+ t['twodeva'] = 0x0968;
+ t['twodotenleader'] = 0x2025;
+ t['twodotleader'] = 0x2025;
+ t['twodotleadervertical'] = 0xFE30;
+ t['twogujarati'] = 0x0AE8;
+ t['twogurmukhi'] = 0x0A68;
+ t['twohackarabic'] = 0x0662;
+ t['twohangzhou'] = 0x3022;
+ t['twoideographicparen'] = 0x3221;
+ t['twoinferior'] = 0x2082;
+ t['twomonospace'] = 0xFF12;
+ t['twonumeratorbengali'] = 0x09F5;
+ t['twooldstyle'] = 0xF732;
+ t['twoparen'] = 0x2475;
+ t['twoperiod'] = 0x2489;
+ t['twopersian'] = 0x06F2;
+ t['tworoman'] = 0x2171;
+ t['twostroke'] = 0x01BB;
+ t['twosuperior'] = 0x00B2;
+ t['twothai'] = 0x0E52;
+ t['twothirds'] = 0x2154;
+ t['u'] = 0x0075;
+ t['uacute'] = 0x00FA;
+ t['ubar'] = 0x0289;
+ t['ubengali'] = 0x0989;
+ t['ubopomofo'] = 0x3128;
+ t['ubreve'] = 0x016D;
+ t['ucaron'] = 0x01D4;
+ t['ucircle'] = 0x24E4;
+ t['ucircumflex'] = 0x00FB;
+ t['ucircumflexbelow'] = 0x1E77;
+ t['ucyrillic'] = 0x0443;
+ t['udattadeva'] = 0x0951;
+ t['udblacute'] = 0x0171;
+ t['udblgrave'] = 0x0215;
+ t['udeva'] = 0x0909;
+ t['udieresis'] = 0x00FC;
+ t['udieresisacute'] = 0x01D8;
+ t['udieresisbelow'] = 0x1E73;
+ t['udieresiscaron'] = 0x01DA;
+ t['udieresiscyrillic'] = 0x04F1;
+ t['udieresisgrave'] = 0x01DC;
+ t['udieresismacron'] = 0x01D6;
+ t['udotbelow'] = 0x1EE5;
+ t['ugrave'] = 0x00F9;
+ t['ugujarati'] = 0x0A89;
+ t['ugurmukhi'] = 0x0A09;
+ t['uhiragana'] = 0x3046;
+ t['uhookabove'] = 0x1EE7;
+ t['uhorn'] = 0x01B0;
+ t['uhornacute'] = 0x1EE9;
+ t['uhorndotbelow'] = 0x1EF1;
+ t['uhorngrave'] = 0x1EEB;
+ t['uhornhookabove'] = 0x1EED;
+ t['uhorntilde'] = 0x1EEF;
+ t['uhungarumlaut'] = 0x0171;
+ t['uhungarumlautcyrillic'] = 0x04F3;
+ t['uinvertedbreve'] = 0x0217;
+ t['ukatakana'] = 0x30A6;
+ t['ukatakanahalfwidth'] = 0xFF73;
+ t['ukcyrillic'] = 0x0479;
+ t['ukorean'] = 0x315C;
+ t['umacron'] = 0x016B;
+ t['umacroncyrillic'] = 0x04EF;
+ t['umacrondieresis'] = 0x1E7B;
+ t['umatragurmukhi'] = 0x0A41;
+ t['umonospace'] = 0xFF55;
+ t['underscore'] = 0x005F;
+ t['underscoredbl'] = 0x2017;
+ t['underscoremonospace'] = 0xFF3F;
+ t['underscorevertical'] = 0xFE33;
+ t['underscorewavy'] = 0xFE4F;
+ t['union'] = 0x222A;
+ t['universal'] = 0x2200;
+ t['uogonek'] = 0x0173;
+ t['uparen'] = 0x24B0;
+ t['upblock'] = 0x2580;
+ t['upperdothebrew'] = 0x05C4;
+ t['upsilon'] = 0x03C5;
+ t['upsilondieresis'] = 0x03CB;
+ t['upsilondieresistonos'] = 0x03B0;
+ t['upsilonlatin'] = 0x028A;
+ t['upsilontonos'] = 0x03CD;
+ t['uptackbelowcmb'] = 0x031D;
+ t['uptackmod'] = 0x02D4;
+ t['uragurmukhi'] = 0x0A73;
+ t['uring'] = 0x016F;
+ t['ushortcyrillic'] = 0x045E;
+ t['usmallhiragana'] = 0x3045;
+ t['usmallkatakana'] = 0x30A5;
+ t['usmallkatakanahalfwidth'] = 0xFF69;
+ t['ustraightcyrillic'] = 0x04AF;
+ t['ustraightstrokecyrillic'] = 0x04B1;
+ t['utilde'] = 0x0169;
+ t['utildeacute'] = 0x1E79;
+ t['utildebelow'] = 0x1E75;
+ t['uubengali'] = 0x098A;
+ t['uudeva'] = 0x090A;
+ t['uugujarati'] = 0x0A8A;
+ t['uugurmukhi'] = 0x0A0A;
+ t['uumatragurmukhi'] = 0x0A42;
+ t['uuvowelsignbengali'] = 0x09C2;
+ t['uuvowelsigndeva'] = 0x0942;
+ t['uuvowelsigngujarati'] = 0x0AC2;
+ t['uvowelsignbengali'] = 0x09C1;
+ t['uvowelsigndeva'] = 0x0941;
+ t['uvowelsigngujarati'] = 0x0AC1;
+ t['v'] = 0x0076;
+ t['vadeva'] = 0x0935;
+ t['vagujarati'] = 0x0AB5;
+ t['vagurmukhi'] = 0x0A35;
+ t['vakatakana'] = 0x30F7;
+ t['vav'] = 0x05D5;
+ t['vavdagesh'] = 0xFB35;
+ t['vavdagesh65'] = 0xFB35;
+ t['vavdageshhebrew'] = 0xFB35;
+ t['vavhebrew'] = 0x05D5;
+ t['vavholam'] = 0xFB4B;
+ t['vavholamhebrew'] = 0xFB4B;
+ t['vavvavhebrew'] = 0x05F0;
+ t['vavyodhebrew'] = 0x05F1;
+ t['vcircle'] = 0x24E5;
+ t['vdotbelow'] = 0x1E7F;
+ t['vecyrillic'] = 0x0432;
+ t['veharabic'] = 0x06A4;
+ t['vehfinalarabic'] = 0xFB6B;
+ t['vehinitialarabic'] = 0xFB6C;
+ t['vehmedialarabic'] = 0xFB6D;
+ t['vekatakana'] = 0x30F9;
+ t['venus'] = 0x2640;
+ t['verticalbar'] = 0x007C;
+ t['verticallineabovecmb'] = 0x030D;
+ t['verticallinebelowcmb'] = 0x0329;
+ t['verticallinelowmod'] = 0x02CC;
+ t['verticallinemod'] = 0x02C8;
+ t['vewarmenian'] = 0x057E;
+ t['vhook'] = 0x028B;
+ t['vikatakana'] = 0x30F8;
+ t['viramabengali'] = 0x09CD;
+ t['viramadeva'] = 0x094D;
+ t['viramagujarati'] = 0x0ACD;
+ t['visargabengali'] = 0x0983;
+ t['visargadeva'] = 0x0903;
+ t['visargagujarati'] = 0x0A83;
+ t['vmonospace'] = 0xFF56;
+ t['voarmenian'] = 0x0578;
+ t['voicediterationhiragana'] = 0x309E;
+ t['voicediterationkatakana'] = 0x30FE;
+ t['voicedmarkkana'] = 0x309B;
+ t['voicedmarkkanahalfwidth'] = 0xFF9E;
+ t['vokatakana'] = 0x30FA;
+ t['vparen'] = 0x24B1;
+ t['vtilde'] = 0x1E7D;
+ t['vturned'] = 0x028C;
+ t['vuhiragana'] = 0x3094;
+ t['vukatakana'] = 0x30F4;
+ t['w'] = 0x0077;
+ t['wacute'] = 0x1E83;
+ t['waekorean'] = 0x3159;
+ t['wahiragana'] = 0x308F;
+ t['wakatakana'] = 0x30EF;
+ t['wakatakanahalfwidth'] = 0xFF9C;
+ t['wakorean'] = 0x3158;
+ t['wasmallhiragana'] = 0x308E;
+ t['wasmallkatakana'] = 0x30EE;
+ t['wattosquare'] = 0x3357;
+ t['wavedash'] = 0x301C;
+ t['wavyunderscorevertical'] = 0xFE34;
+ t['wawarabic'] = 0x0648;
+ t['wawfinalarabic'] = 0xFEEE;
+ t['wawhamzaabovearabic'] = 0x0624;
+ t['wawhamzaabovefinalarabic'] = 0xFE86;
+ t['wbsquare'] = 0x33DD;
+ t['wcircle'] = 0x24E6;
+ t['wcircumflex'] = 0x0175;
+ t['wdieresis'] = 0x1E85;
+ t['wdotaccent'] = 0x1E87;
+ t['wdotbelow'] = 0x1E89;
+ t['wehiragana'] = 0x3091;
+ t['weierstrass'] = 0x2118;
+ t['wekatakana'] = 0x30F1;
+ t['wekorean'] = 0x315E;
+ t['weokorean'] = 0x315D;
+ t['wgrave'] = 0x1E81;
+ t['whitebullet'] = 0x25E6;
+ t['whitecircle'] = 0x25CB;
+ t['whitecircleinverse'] = 0x25D9;
+ t['whitecornerbracketleft'] = 0x300E;
+ t['whitecornerbracketleftvertical'] = 0xFE43;
+ t['whitecornerbracketright'] = 0x300F;
+ t['whitecornerbracketrightvertical'] = 0xFE44;
+ t['whitediamond'] = 0x25C7;
+ t['whitediamondcontainingblacksmalldiamond'] = 0x25C8;
+ t['whitedownpointingsmalltriangle'] = 0x25BF;
+ t['whitedownpointingtriangle'] = 0x25BD;
+ t['whiteleftpointingsmalltriangle'] = 0x25C3;
+ t['whiteleftpointingtriangle'] = 0x25C1;
+ t['whitelenticularbracketleft'] = 0x3016;
+ t['whitelenticularbracketright'] = 0x3017;
+ t['whiterightpointingsmalltriangle'] = 0x25B9;
+ t['whiterightpointingtriangle'] = 0x25B7;
+ t['whitesmallsquare'] = 0x25AB;
+ t['whitesmilingface'] = 0x263A;
+ t['whitesquare'] = 0x25A1;
+ t['whitestar'] = 0x2606;
+ t['whitetelephone'] = 0x260F;
+ t['whitetortoiseshellbracketleft'] = 0x3018;
+ t['whitetortoiseshellbracketright'] = 0x3019;
+ t['whiteuppointingsmalltriangle'] = 0x25B5;
+ t['whiteuppointingtriangle'] = 0x25B3;
+ t['wihiragana'] = 0x3090;
+ t['wikatakana'] = 0x30F0;
+ t['wikorean'] = 0x315F;
+ t['wmonospace'] = 0xFF57;
+ t['wohiragana'] = 0x3092;
+ t['wokatakana'] = 0x30F2;
+ t['wokatakanahalfwidth'] = 0xFF66;
+ t['won'] = 0x20A9;
+ t['wonmonospace'] = 0xFFE6;
+ t['wowaenthai'] = 0x0E27;
+ t['wparen'] = 0x24B2;
+ t['wring'] = 0x1E98;
+ t['wsuperior'] = 0x02B7;
+ t['wturned'] = 0x028D;
+ t['wynn'] = 0x01BF;
+ t['x'] = 0x0078;
+ t['xabovecmb'] = 0x033D;
+ t['xbopomofo'] = 0x3112;
+ t['xcircle'] = 0x24E7;
+ t['xdieresis'] = 0x1E8D;
+ t['xdotaccent'] = 0x1E8B;
+ t['xeharmenian'] = 0x056D;
+ t['xi'] = 0x03BE;
+ t['xmonospace'] = 0xFF58;
+ t['xparen'] = 0x24B3;
+ t['xsuperior'] = 0x02E3;
+ t['y'] = 0x0079;
+ t['yaadosquare'] = 0x334E;
+ t['yabengali'] = 0x09AF;
+ t['yacute'] = 0x00FD;
+ t['yadeva'] = 0x092F;
+ t['yaekorean'] = 0x3152;
+ t['yagujarati'] = 0x0AAF;
+ t['yagurmukhi'] = 0x0A2F;
+ t['yahiragana'] = 0x3084;
+ t['yakatakana'] = 0x30E4;
+ t['yakatakanahalfwidth'] = 0xFF94;
+ t['yakorean'] = 0x3151;
+ t['yamakkanthai'] = 0x0E4E;
+ t['yasmallhiragana'] = 0x3083;
+ t['yasmallkatakana'] = 0x30E3;
+ t['yasmallkatakanahalfwidth'] = 0xFF6C;
+ t['yatcyrillic'] = 0x0463;
+ t['ycircle'] = 0x24E8;
+ t['ycircumflex'] = 0x0177;
+ t['ydieresis'] = 0x00FF;
+ t['ydotaccent'] = 0x1E8F;
+ t['ydotbelow'] = 0x1EF5;
+ t['yeharabic'] = 0x064A;
+ t['yehbarreearabic'] = 0x06D2;
+ t['yehbarreefinalarabic'] = 0xFBAF;
+ t['yehfinalarabic'] = 0xFEF2;
+ t['yehhamzaabovearabic'] = 0x0626;
+ t['yehhamzaabovefinalarabic'] = 0xFE8A;
+ t['yehhamzaaboveinitialarabic'] = 0xFE8B;
+ t['yehhamzaabovemedialarabic'] = 0xFE8C;
+ t['yehinitialarabic'] = 0xFEF3;
+ t['yehmedialarabic'] = 0xFEF4;
+ t['yehmeeminitialarabic'] = 0xFCDD;
+ t['yehmeemisolatedarabic'] = 0xFC58;
+ t['yehnoonfinalarabic'] = 0xFC94;
+ t['yehthreedotsbelowarabic'] = 0x06D1;
+ t['yekorean'] = 0x3156;
+ t['yen'] = 0x00A5;
+ t['yenmonospace'] = 0xFFE5;
+ t['yeokorean'] = 0x3155;
+ t['yeorinhieuhkorean'] = 0x3186;
+ t['yerahbenyomohebrew'] = 0x05AA;
+ t['yerahbenyomolefthebrew'] = 0x05AA;
+ t['yericyrillic'] = 0x044B;
+ t['yerudieresiscyrillic'] = 0x04F9;
+ t['yesieungkorean'] = 0x3181;
+ t['yesieungpansioskorean'] = 0x3183;
+ t['yesieungsioskorean'] = 0x3182;
+ t['yetivhebrew'] = 0x059A;
+ t['ygrave'] = 0x1EF3;
+ t['yhook'] = 0x01B4;
+ t['yhookabove'] = 0x1EF7;
+ t['yiarmenian'] = 0x0575;
+ t['yicyrillic'] = 0x0457;
+ t['yikorean'] = 0x3162;
+ t['yinyang'] = 0x262F;
+ t['yiwnarmenian'] = 0x0582;
+ t['ymonospace'] = 0xFF59;
+ t['yod'] = 0x05D9;
+ t['yoddagesh'] = 0xFB39;
+ t['yoddageshhebrew'] = 0xFB39;
+ t['yodhebrew'] = 0x05D9;
+ t['yodyodhebrew'] = 0x05F2;
+ t['yodyodpatahhebrew'] = 0xFB1F;
+ t['yohiragana'] = 0x3088;
+ t['yoikorean'] = 0x3189;
+ t['yokatakana'] = 0x30E8;
+ t['yokatakanahalfwidth'] = 0xFF96;
+ t['yokorean'] = 0x315B;
+ t['yosmallhiragana'] = 0x3087;
+ t['yosmallkatakana'] = 0x30E7;
+ t['yosmallkatakanahalfwidth'] = 0xFF6E;
+ t['yotgreek'] = 0x03F3;
+ t['yoyaekorean'] = 0x3188;
+ t['yoyakorean'] = 0x3187;
+ t['yoyakthai'] = 0x0E22;
+ t['yoyingthai'] = 0x0E0D;
+ t['yparen'] = 0x24B4;
+ t['ypogegrammeni'] = 0x037A;
+ t['ypogegrammenigreekcmb'] = 0x0345;
+ t['yr'] = 0x01A6;
+ t['yring'] = 0x1E99;
+ t['ysuperior'] = 0x02B8;
+ t['ytilde'] = 0x1EF9;
+ t['yturned'] = 0x028E;
+ t['yuhiragana'] = 0x3086;
+ t['yuikorean'] = 0x318C;
+ t['yukatakana'] = 0x30E6;
+ t['yukatakanahalfwidth'] = 0xFF95;
+ t['yukorean'] = 0x3160;
+ t['yusbigcyrillic'] = 0x046B;
+ t['yusbigiotifiedcyrillic'] = 0x046D;
+ t['yuslittlecyrillic'] = 0x0467;
+ t['yuslittleiotifiedcyrillic'] = 0x0469;
+ t['yusmallhiragana'] = 0x3085;
+ t['yusmallkatakana'] = 0x30E5;
+ t['yusmallkatakanahalfwidth'] = 0xFF6D;
+ t['yuyekorean'] = 0x318B;
+ t['yuyeokorean'] = 0x318A;
+ t['yyabengali'] = 0x09DF;
+ t['yyadeva'] = 0x095F;
+ t['z'] = 0x007A;
+ t['zaarmenian'] = 0x0566;
+ t['zacute'] = 0x017A;
+ t['zadeva'] = 0x095B;
+ t['zagurmukhi'] = 0x0A5B;
+ t['zaharabic'] = 0x0638;
+ t['zahfinalarabic'] = 0xFEC6;
+ t['zahinitialarabic'] = 0xFEC7;
+ t['zahiragana'] = 0x3056;
+ t['zahmedialarabic'] = 0xFEC8;
+ t['zainarabic'] = 0x0632;
+ t['zainfinalarabic'] = 0xFEB0;
+ t['zakatakana'] = 0x30B6;
+ t['zaqefgadolhebrew'] = 0x0595;
+ t['zaqefqatanhebrew'] = 0x0594;
+ t['zarqahebrew'] = 0x0598;
+ t['zayin'] = 0x05D6;
+ t['zayindagesh'] = 0xFB36;
+ t['zayindageshhebrew'] = 0xFB36;
+ t['zayinhebrew'] = 0x05D6;
+ t['zbopomofo'] = 0x3117;
+ t['zcaron'] = 0x017E;
+ t['zcircle'] = 0x24E9;
+ t['zcircumflex'] = 0x1E91;
+ t['zcurl'] = 0x0291;
+ t['zdot'] = 0x017C;
+ t['zdotaccent'] = 0x017C;
+ t['zdotbelow'] = 0x1E93;
+ t['zecyrillic'] = 0x0437;
+ t['zedescendercyrillic'] = 0x0499;
+ t['zedieresiscyrillic'] = 0x04DF;
+ t['zehiragana'] = 0x305C;
+ t['zekatakana'] = 0x30BC;
+ t['zero'] = 0x0030;
+ t['zeroarabic'] = 0x0660;
+ t['zerobengali'] = 0x09E6;
+ t['zerodeva'] = 0x0966;
+ t['zerogujarati'] = 0x0AE6;
+ t['zerogurmukhi'] = 0x0A66;
+ t['zerohackarabic'] = 0x0660;
+ t['zeroinferior'] = 0x2080;
+ t['zeromonospace'] = 0xFF10;
+ t['zerooldstyle'] = 0xF730;
+ t['zeropersian'] = 0x06F0;
+ t['zerosuperior'] = 0x2070;
+ t['zerothai'] = 0x0E50;
+ t['zerowidthjoiner'] = 0xFEFF;
+ t['zerowidthnonjoiner'] = 0x200C;
+ t['zerowidthspace'] = 0x200B;
+ t['zeta'] = 0x03B6;
+ t['zhbopomofo'] = 0x3113;
+ t['zhearmenian'] = 0x056A;
+ t['zhebrevecyrillic'] = 0x04C2;
+ t['zhecyrillic'] = 0x0436;
+ t['zhedescendercyrillic'] = 0x0497;
+ t['zhedieresiscyrillic'] = 0x04DD;
+ t['zihiragana'] = 0x3058;
+ t['zikatakana'] = 0x30B8;
+ t['zinorhebrew'] = 0x05AE;
+ t['zlinebelow'] = 0x1E95;
+ t['zmonospace'] = 0xFF5A;
+ t['zohiragana'] = 0x305E;
+ t['zokatakana'] = 0x30BE;
+ t['zparen'] = 0x24B5;
+ t['zretroflexhook'] = 0x0290;
+ t['zstroke'] = 0x01B6;
+ t['zuhiragana'] = 0x305A;
+ t['zukatakana'] = 0x30BA;
+ t['.notdef'] = 0x0000;
+ t['angbracketleftbig'] = 0x2329;
+ t['angbracketleftBig'] = 0x2329;
+ t['angbracketleftbigg'] = 0x2329;
+ t['angbracketleftBigg'] = 0x2329;
+ t['angbracketrightBig'] = 0x232A;
+ t['angbracketrightbig'] = 0x232A;
+ t['angbracketrightBigg'] = 0x232A;
+ t['angbracketrightbigg'] = 0x232A;
+ t['arrowhookleft'] = 0x21AA;
+ t['arrowhookright'] = 0x21A9;
+ t['arrowlefttophalf'] = 0x21BC;
+ t['arrowleftbothalf'] = 0x21BD;
+ t['arrownortheast'] = 0x2197;
+ t['arrownorthwest'] = 0x2196;
+ t['arrowrighttophalf'] = 0x21C0;
+ t['arrowrightbothalf'] = 0x21C1;
+ t['arrowsoutheast'] = 0x2198;
+ t['arrowsouthwest'] = 0x2199;
+ t['backslashbig'] = 0x2216;
+ t['backslashBig'] = 0x2216;
+ t['backslashBigg'] = 0x2216;
+ t['backslashbigg'] = 0x2216;
+ t['bardbl'] = 0x2016;
+ t['bracehtipdownleft'] = 0xFE37;
+ t['bracehtipdownright'] = 0xFE37;
+ t['bracehtipupleft'] = 0xFE38;
+ t['bracehtipupright'] = 0xFE38;
+ t['braceleftBig'] = 0x007B;
+ t['braceleftbig'] = 0x007B;
+ t['braceleftbigg'] = 0x007B;
+ t['braceleftBigg'] = 0x007B;
+ t['bracerightBig'] = 0x007D;
+ t['bracerightbig'] = 0x007D;
+ t['bracerightbigg'] = 0x007D;
+ t['bracerightBigg'] = 0x007D;
+ t['bracketleftbig'] = 0x005B;
+ t['bracketleftBig'] = 0x005B;
+ t['bracketleftbigg'] = 0x005B;
+ t['bracketleftBigg'] = 0x005B;
+ t['bracketrightBig'] = 0x005D;
+ t['bracketrightbig'] = 0x005D;
+ t['bracketrightbigg'] = 0x005D;
+ t['bracketrightBigg'] = 0x005D;
+ t['ceilingleftbig'] = 0x2308;
+ t['ceilingleftBig'] = 0x2308;
+ t['ceilingleftBigg'] = 0x2308;
+ t['ceilingleftbigg'] = 0x2308;
+ t['ceilingrightbig'] = 0x2309;
+ t['ceilingrightBig'] = 0x2309;
+ t['ceilingrightbigg'] = 0x2309;
+ t['ceilingrightBigg'] = 0x2309;
+ t['circledotdisplay'] = 0x2299;
+ t['circledottext'] = 0x2299;
+ t['circlemultiplydisplay'] = 0x2297;
+ t['circlemultiplytext'] = 0x2297;
+ t['circleplusdisplay'] = 0x2295;
+ t['circleplustext'] = 0x2295;
+ t['contintegraldisplay'] = 0x222E;
+ t['contintegraltext'] = 0x222E;
+ t['coproductdisplay'] = 0x2210;
+ t['coproducttext'] = 0x2210;
+ t['floorleftBig'] = 0x230A;
+ t['floorleftbig'] = 0x230A;
+ t['floorleftbigg'] = 0x230A;
+ t['floorleftBigg'] = 0x230A;
+ t['floorrightbig'] = 0x230B;
+ t['floorrightBig'] = 0x230B;
+ t['floorrightBigg'] = 0x230B;
+ t['floorrightbigg'] = 0x230B;
+ t['hatwide'] = 0x0302;
+ t['hatwider'] = 0x0302;
+ t['hatwidest'] = 0x0302;
+ t['intercal'] = 0x1D40;
+ t['integraldisplay'] = 0x222B;
+ t['integraltext'] = 0x222B;
+ t['intersectiondisplay'] = 0x22C2;
+ t['intersectiontext'] = 0x22C2;
+ t['logicalanddisplay'] = 0x2227;
+ t['logicalandtext'] = 0x2227;
+ t['logicalordisplay'] = 0x2228;
+ t['logicalortext'] = 0x2228;
+ t['parenleftBig'] = 0x0028;
+ t['parenleftbig'] = 0x0028;
+ t['parenleftBigg'] = 0x0028;
+ t['parenleftbigg'] = 0x0028;
+ t['parenrightBig'] = 0x0029;
+ t['parenrightbig'] = 0x0029;
+ t['parenrightBigg'] = 0x0029;
+ t['parenrightbigg'] = 0x0029;
+ t['prime'] = 0x2032;
+ t['productdisplay'] = 0x220F;
+ t['producttext'] = 0x220F;
+ t['radicalbig'] = 0x221A;
+ t['radicalBig'] = 0x221A;
+ t['radicalBigg'] = 0x221A;
+ t['radicalbigg'] = 0x221A;
+ t['radicalbt'] = 0x221A;
+ t['radicaltp'] = 0x221A;
+ t['radicalvertex'] = 0x221A;
+ t['slashbig'] = 0x002F;
+ t['slashBig'] = 0x002F;
+ t['slashBigg'] = 0x002F;
+ t['slashbigg'] = 0x002F;
+ t['summationdisplay'] = 0x2211;
+ t['summationtext'] = 0x2211;
+ t['tildewide'] = 0x02DC;
+ t['tildewider'] = 0x02DC;
+ t['tildewidest'] = 0x02DC;
+ t['uniondisplay'] = 0x22C3;
+ t['unionmultidisplay'] = 0x228E;
+ t['unionmultitext'] = 0x228E;
+ t['unionsqdisplay'] = 0x2294;
+ t['unionsqtext'] = 0x2294;
+ t['uniontext'] = 0x22C3;
+ t['vextenddouble'] = 0x2225;
+ t['vextendsingle'] = 0x2223;
+});
+var getDingbatsGlyphsUnicode = getLookupTableFactory(function (t) {
+ t['space'] = 0x0020;
+ t['a1'] = 0x2701;
+ t['a2'] = 0x2702;
+ t['a202'] = 0x2703;
+ t['a3'] = 0x2704;
+ t['a4'] = 0x260E;
+ t['a5'] = 0x2706;
+ t['a119'] = 0x2707;
+ t['a118'] = 0x2708;
+ t['a117'] = 0x2709;
+ t['a11'] = 0x261B;
+ t['a12'] = 0x261E;
+ t['a13'] = 0x270C;
+ t['a14'] = 0x270D;
+ t['a15'] = 0x270E;
+ t['a16'] = 0x270F;
+ t['a105'] = 0x2710;
+ t['a17'] = 0x2711;
+ t['a18'] = 0x2712;
+ t['a19'] = 0x2713;
+ t['a20'] = 0x2714;
+ t['a21'] = 0x2715;
+ t['a22'] = 0x2716;
+ t['a23'] = 0x2717;
+ t['a24'] = 0x2718;
+ t['a25'] = 0x2719;
+ t['a26'] = 0x271A;
+ t['a27'] = 0x271B;
+ t['a28'] = 0x271C;
+ t['a6'] = 0x271D;
+ t['a7'] = 0x271E;
+ t['a8'] = 0x271F;
+ t['a9'] = 0x2720;
+ t['a10'] = 0x2721;
+ t['a29'] = 0x2722;
+ t['a30'] = 0x2723;
+ t['a31'] = 0x2724;
+ t['a32'] = 0x2725;
+ t['a33'] = 0x2726;
+ t['a34'] = 0x2727;
+ t['a35'] = 0x2605;
+ t['a36'] = 0x2729;
+ t['a37'] = 0x272A;
+ t['a38'] = 0x272B;
+ t['a39'] = 0x272C;
+ t['a40'] = 0x272D;
+ t['a41'] = 0x272E;
+ t['a42'] = 0x272F;
+ t['a43'] = 0x2730;
+ t['a44'] = 0x2731;
+ t['a45'] = 0x2732;
+ t['a46'] = 0x2733;
+ t['a47'] = 0x2734;
+ t['a48'] = 0x2735;
+ t['a49'] = 0x2736;
+ t['a50'] = 0x2737;
+ t['a51'] = 0x2738;
+ t['a52'] = 0x2739;
+ t['a53'] = 0x273A;
+ t['a54'] = 0x273B;
+ t['a55'] = 0x273C;
+ t['a56'] = 0x273D;
+ t['a57'] = 0x273E;
+ t['a58'] = 0x273F;
+ t['a59'] = 0x2740;
+ t['a60'] = 0x2741;
+ t['a61'] = 0x2742;
+ t['a62'] = 0x2743;
+ t['a63'] = 0x2744;
+ t['a64'] = 0x2745;
+ t['a65'] = 0x2746;
+ t['a66'] = 0x2747;
+ t['a67'] = 0x2748;
+ t['a68'] = 0x2749;
+ t['a69'] = 0x274A;
+ t['a70'] = 0x274B;
+ t['a71'] = 0x25CF;
+ t['a72'] = 0x274D;
+ t['a73'] = 0x25A0;
+ t['a74'] = 0x274F;
+ t['a203'] = 0x2750;
+ t['a75'] = 0x2751;
+ t['a204'] = 0x2752;
+ t['a76'] = 0x25B2;
+ t['a77'] = 0x25BC;
+ t['a78'] = 0x25C6;
+ t['a79'] = 0x2756;
+ t['a81'] = 0x25D7;
+ t['a82'] = 0x2758;
+ t['a83'] = 0x2759;
+ t['a84'] = 0x275A;
+ t['a97'] = 0x275B;
+ t['a98'] = 0x275C;
+ t['a99'] = 0x275D;
+ t['a100'] = 0x275E;
+ t['a101'] = 0x2761;
+ t['a102'] = 0x2762;
+ t['a103'] = 0x2763;
+ t['a104'] = 0x2764;
+ t['a106'] = 0x2765;
+ t['a107'] = 0x2766;
+ t['a108'] = 0x2767;
+ t['a112'] = 0x2663;
+ t['a111'] = 0x2666;
+ t['a110'] = 0x2665;
+ t['a109'] = 0x2660;
+ t['a120'] = 0x2460;
+ t['a121'] = 0x2461;
+ t['a122'] = 0x2462;
+ t['a123'] = 0x2463;
+ t['a124'] = 0x2464;
+ t['a125'] = 0x2465;
+ t['a126'] = 0x2466;
+ t['a127'] = 0x2467;
+ t['a128'] = 0x2468;
+ t['a129'] = 0x2469;
+ t['a130'] = 0x2776;
+ t['a131'] = 0x2777;
+ t['a132'] = 0x2778;
+ t['a133'] = 0x2779;
+ t['a134'] = 0x277A;
+ t['a135'] = 0x277B;
+ t['a136'] = 0x277C;
+ t['a137'] = 0x277D;
+ t['a138'] = 0x277E;
+ t['a139'] = 0x277F;
+ t['a140'] = 0x2780;
+ t['a141'] = 0x2781;
+ t['a142'] = 0x2782;
+ t['a143'] = 0x2783;
+ t['a144'] = 0x2784;
+ t['a145'] = 0x2785;
+ t['a146'] = 0x2786;
+ t['a147'] = 0x2787;
+ t['a148'] = 0x2788;
+ t['a149'] = 0x2789;
+ t['a150'] = 0x278A;
+ t['a151'] = 0x278B;
+ t['a152'] = 0x278C;
+ t['a153'] = 0x278D;
+ t['a154'] = 0x278E;
+ t['a155'] = 0x278F;
+ t['a156'] = 0x2790;
+ t['a157'] = 0x2791;
+ t['a158'] = 0x2792;
+ t['a159'] = 0x2793;
+ t['a160'] = 0x2794;
+ t['a161'] = 0x2192;
+ t['a163'] = 0x2194;
+ t['a164'] = 0x2195;
+ t['a196'] = 0x2798;
+ t['a165'] = 0x2799;
+ t['a192'] = 0x279A;
+ t['a166'] = 0x279B;
+ t['a167'] = 0x279C;
+ t['a168'] = 0x279D;
+ t['a169'] = 0x279E;
+ t['a170'] = 0x279F;
+ t['a171'] = 0x27A0;
+ t['a172'] = 0x27A1;
+ t['a173'] = 0x27A2;
+ t['a162'] = 0x27A3;
+ t['a174'] = 0x27A4;
+ t['a175'] = 0x27A5;
+ t['a176'] = 0x27A6;
+ t['a177'] = 0x27A7;
+ t['a178'] = 0x27A8;
+ t['a179'] = 0x27A9;
+ t['a193'] = 0x27AA;
+ t['a180'] = 0x27AB;
+ t['a199'] = 0x27AC;
+ t['a181'] = 0x27AD;
+ t['a200'] = 0x27AE;
+ t['a182'] = 0x27AF;
+ t['a201'] = 0x27B1;
+ t['a183'] = 0x27B2;
+ t['a184'] = 0x27B3;
+ t['a197'] = 0x27B4;
+ t['a185'] = 0x27B5;
+ t['a194'] = 0x27B6;
+ t['a198'] = 0x27B7;
+ t['a186'] = 0x27B8;
+ t['a195'] = 0x27B9;
+ t['a187'] = 0x27BA;
+ t['a188'] = 0x27BB;
+ t['a189'] = 0x27BC;
+ t['a190'] = 0x27BD;
+ t['a191'] = 0x27BE;
+ t['a89'] = 0x2768;
+ t['a90'] = 0x2769;
+ t['a93'] = 0x276A;
+ t['a94'] = 0x276B;
+ t['a91'] = 0x276C;
+ t['a92'] = 0x276D;
+ t['a205'] = 0x276E;
+ t['a85'] = 0x276F;
+ t['a206'] = 0x2770;
+ t['a86'] = 0x2771;
+ t['a87'] = 0x2772;
+ t['a88'] = 0x2773;
+ t['a95'] = 0x2774;
+ t['a96'] = 0x2775;
+ t['.notdef'] = 0x0000;
+});
+exports.getGlyphsUnicode = getGlyphsUnicode;
+exports.getDingbatsGlyphsUnicode = getDingbatsGlyphsUnicode;
+
+/***/ }),
+/* 161 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.getSupplementalGlyphMapForCalibri = exports.getSupplementalGlyphMapForArialBlack = exports.getGlyphMapForStandardFonts = exports.getSymbolsFonts = exports.getSerifFonts = exports.getNonStdFontMap = exports.getStdFontMap = undefined;
+
+var _util = __w_pdfjs_require__(2);
+
+var getStdFontMap = (0, _util.getLookupTableFactory)(function (t) {
+  t['ArialNarrow'] = 'Helvetica';
+  t['ArialNarrow-Bold'] = 'Helvetica-Bold';
+  t['ArialNarrow-BoldItalic'] = 'Helvetica-BoldOblique';
+  t['ArialNarrow-Italic'] = 'Helvetica-Oblique';
+  t['ArialBlack'] = 'Helvetica';
+  t['ArialBlack-Bold'] = 'Helvetica-Bold';
+  t['ArialBlack-BoldItalic'] = 'Helvetica-BoldOblique';
+  t['ArialBlack-Italic'] = 'Helvetica-Oblique';
+  t['Arial-Black'] = 'Helvetica';
+  t['Arial-Black-Bold'] = 'Helvetica-Bold';
+  t['Arial-Black-BoldItalic'] = 'Helvetica-BoldOblique';
+  t['Arial-Black-Italic'] = 'Helvetica-Oblique';
+  t['Arial'] = 'Helvetica';
+  t['Arial-Bold'] = 'Helvetica-Bold';
+  t['Arial-BoldItalic'] = 'Helvetica-BoldOblique';
+  t['Arial-Italic'] = 'Helvetica-Oblique';
+  t['Arial-BoldItalicMT'] = 'Helvetica-BoldOblique';
+  t['Arial-BoldMT'] = 'Helvetica-Bold';
+  t['Arial-ItalicMT'] = 'Helvetica-Oblique';
+  t['ArialMT'] = 'Helvetica';
+  t['Courier-Bold'] = 'Courier-Bold';
+  t['Courier-BoldItalic'] = 'Courier-BoldOblique';
+  t['Courier-Italic'] = 'Courier-Oblique';
+  t['CourierNew'] = 'Courier';
+  t['CourierNew-Bold'] = 'Courier-Bold';
+  t['CourierNew-BoldItalic'] = 'Courier-BoldOblique';
+  t['CourierNew-Italic'] = 'Courier-Oblique';
+  t['CourierNewPS-BoldItalicMT'] = 'Courier-BoldOblique';
+  t['CourierNewPS-BoldMT'] = 'Courier-Bold';
+  t['CourierNewPS-ItalicMT'] = 'Courier-Oblique';
+  t['CourierNewPSMT'] = 'Courier';
+  t['Helvetica'] = 'Helvetica';
+  t['Helvetica-Bold'] = 'Helvetica-Bold';
+  t['Helvetica-BoldItalic'] = 'Helvetica-BoldOblique';
+  t['Helvetica-BoldOblique'] = 'Helvetica-BoldOblique';
+  t['Helvetica-Italic'] = 'Helvetica-Oblique';
+  t['Helvetica-Oblique'] = 'Helvetica-Oblique';
+  t['SegoeUISymbol'] = 'Helvetica';
+  t['Symbol-Bold'] = 'Symbol';
+  t['Symbol-BoldItalic'] = 'Symbol';
+  t['Symbol-Italic'] = 'Symbol';
+  t['TimesNewRoman'] = 'Times-Roman';
+  t['TimesNewRoman-Bold'] = 'Times-Bold';
+  t['TimesNewRoman-BoldItalic'] = 'Times-BoldItalic';
+  t['TimesNewRoman-Italic'] = 'Times-Italic';
+  t['TimesNewRomanPS'] = 'Times-Roman';
+  t['TimesNewRomanPS-Bold'] = 'Times-Bold';
+  t['TimesNewRomanPS-BoldItalic'] = 'Times-BoldItalic';
+  t['TimesNewRomanPS-BoldItalicMT'] = 'Times-BoldItalic';
+  t['TimesNewRomanPS-BoldMT'] = 'Times-Bold';
+  t['TimesNewRomanPS-Italic'] = 'Times-Italic';
+  t['TimesNewRomanPS-ItalicMT'] = 'Times-Italic';
+  t['TimesNewRomanPSMT'] = 'Times-Roman';
+  t['TimesNewRomanPSMT-Bold'] = 'Times-Bold';
+  t['TimesNewRomanPSMT-BoldItalic'] = 'Times-BoldItalic';
+  t['TimesNewRomanPSMT-Italic'] = 'Times-Italic';
+});
+var getNonStdFontMap = (0, _util.getLookupTableFactory)(function (t) {
+  t['Calibri'] = 'Helvetica';
+  t['Calibri-Bold'] = 'Helvetica-Bold';
+  t['Calibri-BoldItalic'] = 'Helvetica-BoldOblique';
+  t['Calibri-Italic'] = 'Helvetica-Oblique';
+  t['CenturyGothic'] = 'Helvetica';
+  t['CenturyGothic-Bold'] = 'Helvetica-Bold';
+  t['CenturyGothic-BoldItalic'] = 'Helvetica-BoldOblique';
+  t['CenturyGothic-Italic'] = 'Helvetica-Oblique';
+  t['ComicSansMS'] = 'Comic Sans MS';
+  t['ComicSansMS-Bold'] = 'Comic Sans MS-Bold';
+  t['ComicSansMS-BoldItalic'] = 'Comic Sans MS-BoldItalic';
+  t['ComicSansMS-Italic'] = 'Comic Sans MS-Italic';
+  t['LucidaConsole'] = 'Courier';
+  t['LucidaConsole-Bold'] = 'Courier-Bold';
+  t['LucidaConsole-BoldItalic'] = 'Courier-BoldOblique';
+  t['LucidaConsole-Italic'] = 'Courier-Oblique';
+  t['LucidaSans-Demi'] = 'Helvetica-Bold';
+  t['MS-Gothic'] = 'MS Gothic';
+  t['MS-Gothic-Bold'] = 'MS Gothic-Bold';
+  t['MS-Gothic-BoldItalic'] = 'MS Gothic-BoldItalic';
+  t['MS-Gothic-Italic'] = 'MS Gothic-Italic';
+  t['MS-Mincho'] = 'MS Mincho';
+  t['MS-Mincho-Bold'] = 'MS Mincho-Bold';
+  t['MS-Mincho-BoldItalic'] = 'MS Mincho-BoldItalic';
+  t['MS-Mincho-Italic'] = 'MS Mincho-Italic';
+  t['MS-PGothic'] = 'MS PGothic';
+  t['MS-PGothic-Bold'] = 'MS PGothic-Bold';
+  t['MS-PGothic-BoldItalic'] = 'MS PGothic-BoldItalic';
+  t['MS-PGothic-Italic'] = 'MS PGothic-Italic';
+  t['MS-PMincho'] = 'MS PMincho';
+  t['MS-PMincho-Bold'] = 'MS PMincho-Bold';
+  t['MS-PMincho-BoldItalic'] = 'MS PMincho-BoldItalic';
+  t['MS-PMincho-Italic'] = 'MS PMincho-Italic';
+  t['NuptialScript'] = 'Times-Italic';
+  t['Wingdings'] = 'ZapfDingbats';
+});
+var getSerifFonts = (0, _util.getLookupTableFactory)(function (t) {
+  t['Adobe Jenson'] = true;
+  t['Adobe Text'] = true;
+  t['Albertus'] = true;
+  t['Aldus'] = true;
+  t['Alexandria'] = true;
+  t['Algerian'] = true;
+  t['American Typewriter'] = true;
+  t['Antiqua'] = true;
+  t['Apex'] = true;
+  t['Arno'] = true;
+  t['Aster'] = true;
+  t['Aurora'] = true;
+  t['Baskerville'] = true;
+  t['Bell'] = true;
+  t['Bembo'] = true;
+  t['Bembo Schoolbook'] = true;
+  t['Benguiat'] = true;
+  t['Berkeley Old Style'] = true;
+  t['Bernhard Modern'] = true;
+  t['Berthold City'] = true;
+  t['Bodoni'] = true;
+  t['Bauer Bodoni'] = true;
+  t['Book Antiqua'] = true;
+  t['Bookman'] = true;
+  t['Bordeaux Roman'] = true;
+  t['Californian FB'] = true;
+  t['Calisto'] = true;
+  t['Calvert'] = true;
+  t['Capitals'] = true;
+  t['Cambria'] = true;
+  t['Cartier'] = true;
+  t['Caslon'] = true;
+  t['Catull'] = true;
+  t['Centaur'] = true;
+  t['Century Old Style'] = true;
+  t['Century Schoolbook'] = true;
+  t['Chaparral'] = true;
+  t['Charis SIL'] = true;
+  t['Cheltenham'] = true;
+  t['Cholla Slab'] = true;
+  t['Clarendon'] = true;
+  t['Clearface'] = true;
+  t['Cochin'] = true;
+  t['Colonna'] = true;
+  t['Computer Modern'] = true;
+  t['Concrete Roman'] = true;
+  t['Constantia'] = true;
+  t['Cooper Black'] = true;
+  t['Corona'] = true;
+  t['Ecotype'] = true;
+  t['Egyptienne'] = true;
+  t['Elephant'] = true;
+  t['Excelsior'] = true;
+  t['Fairfield'] = true;
+  t['FF Scala'] = true;
+  t['Folkard'] = true;
+  t['Footlight'] = true;
+  t['FreeSerif'] = true;
+  t['Friz Quadrata'] = true;
+  t['Garamond'] = true;
+  t['Gentium'] = true;
+  t['Georgia'] = true;
+  t['Gloucester'] = true;
+  t['Goudy Old Style'] = true;
+  t['Goudy Schoolbook'] = true;
+  t['Goudy Pro Font'] = true;
+  t['Granjon'] = true;
+  t['Guardian Egyptian'] = true;
+  t['Heather'] = true;
+  t['Hercules'] = true;
+  t['High Tower Text'] = true;
+  t['Hiroshige'] = true;
+  t['Hoefler Text'] = true;
+  t['Humana Serif'] = true;
+  t['Imprint'] = true;
+  t['Ionic No. 5'] = true;
+  t['Janson'] = true;
+  t['Joanna'] = true;
+  t['Korinna'] = true;
+  t['Lexicon'] = true;
+  t['Liberation Serif'] = true;
+  t['Linux Libertine'] = true;
+  t['Literaturnaya'] = true;
+  t['Lucida'] = true;
+  t['Lucida Bright'] = true;
+  t['Melior'] = true;
+  t['Memphis'] = true;
+  t['Miller'] = true;
+  t['Minion'] = true;
+  t['Modern'] = true;
+  t['Mona Lisa'] = true;
+  t['Mrs Eaves'] = true;
+  t['MS Serif'] = true;
+  t['Museo Slab'] = true;
+  t['New York'] = true;
+  t['Nimbus Roman'] = true;
+  t['NPS Rawlinson Roadway'] = true;
+  t['NuptialScript'] = true;
+  t['Palatino'] = true;
+  t['Perpetua'] = true;
+  t['Plantin'] = true;
+  t['Plantin Schoolbook'] = true;
+  t['Playbill'] = true;
+  t['Poor Richard'] = true;
+  t['Rawlinson Roadway'] = true;
+  t['Renault'] = true;
+  t['Requiem'] = true;
+  t['Rockwell'] = true;
+  t['Roman'] = true;
+  t['Rotis Serif'] = true;
+  t['Sabon'] = true;
+  t['Scala'] = true;
+  t['Seagull'] = true;
+  t['Sistina'] = true;
+  t['Souvenir'] = true;
+  t['STIX'] = true;
+  t['Stone Informal'] = true;
+  t['Stone Serif'] = true;
+  t['Sylfaen'] = true;
+  t['Times'] = true;
+  t['Trajan'] = true;
+  t['Trinit茅'] = true;
+  t['Trump Mediaeval'] = true;
+  t['Utopia'] = true;
+  t['Vale Type'] = true;
+  t['Bitstream Vera'] = true;
+  t['Vera Serif'] = true;
+  t['Versailles'] = true;
+  t['Wanted'] = true;
+  t['Weiss'] = true;
+  t['Wide Latin'] = true;
+  t['Windsor'] = true;
+  t['XITS'] = true;
+});
+var getSymbolsFonts = (0, _util.getLookupTableFactory)(function (t) {
+  t['Dingbats'] = true;
+  t['Symbol'] = true;
+  t['ZapfDingbats'] = true;
+});
+var getGlyphMapForStandardFonts = (0, _util.getLookupTableFactory)(function (t) {
+  t[2] = 10;
+  t[3] = 32;
+  t[4] = 33;
+  t[5] = 34;
+  t[6] = 35;
+  t[7] = 36;
+  t[8] = 37;
+  t[9] = 38;
+  t[10] = 39;
+  t[11] = 40;
+  t[12] = 41;
+  t[13] = 42;
+  t[14] = 43;
+  t[15] = 44;
+  t[16] = 45;
+  t[17] = 46;
+  t[18] = 47;
+  t[19] = 48;
+  t[20] = 49;
+  t[21] = 50;
+  t[22] = 51;
+  t[23] = 52;
+  t[24] = 53;
+  t[25] = 54;
+  t[26] = 55;
+  t[27] = 56;
+  t[28] = 57;
+  t[29] = 58;
+  t[30] = 894;
+  t[31] = 60;
+  t[32] = 61;
+  t[33] = 62;
+  t[34] = 63;
+  t[35] = 64;
+  t[36] = 65;
+  t[37] = 66;
+  t[38] = 67;
+  t[39] = 68;
+  t[40] = 69;
+  t[41] = 70;
+  t[42] = 71;
+  t[43] = 72;
+  t[44] = 73;
+  t[45] = 74;
+  t[46] = 75;
+  t[47] = 76;
+  t[48] = 77;
+  t[49] = 78;
+  t[50] = 79;
+  t[51] = 80;
+  t[52] = 81;
+  t[53] = 82;
+  t[54] = 83;
+  t[55] = 84;
+  t[56] = 85;
+  t[57] = 86;
+  t[58] = 87;
+  t[59] = 88;
+  t[60] = 89;
+  t[61] = 90;
+  t[62] = 91;
+  t[63] = 92;
+  t[64] = 93;
+  t[65] = 94;
+  t[66] = 95;
+  t[67] = 96;
+  t[68] = 97;
+  t[69] = 98;
+  t[70] = 99;
+  t[71] = 100;
+  t[72] = 101;
+  t[73] = 102;
+  t[74] = 103;
+  t[75] = 104;
+  t[76] = 105;
+  t[77] = 106;
+  t[78] = 107;
+  t[79] = 108;
+  t[80] = 109;
+  t[81] = 110;
+  t[82] = 111;
+  t[83] = 112;
+  t[84] = 113;
+  t[85] = 114;
+  t[86] = 115;
+  t[87] = 116;
+  t[88] = 117;
+  t[89] = 118;
+  t[90] = 119;
+  t[91] = 120;
+  t[92] = 121;
+  t[93] = 122;
+  t[94] = 123;
+  t[95] = 124;
+  t[96] = 125;
+  t[97] = 126;
+  t[98] = 196;
+  t[99] = 197;
+  t[100] = 199;
+  t[101] = 201;
+  t[102] = 209;
+  t[103] = 214;
+  t[104] = 220;
+  t[105] = 225;
+  t[106] = 224;
+  t[107] = 226;
+  t[108] = 228;
+  t[109] = 227;
+  t[110] = 229;
+  t[111] = 231;
+  t[112] = 233;
+  t[113] = 232;
+  t[114] = 234;
+  t[115] = 235;
+  t[116] = 237;
+  t[117] = 236;
+  t[118] = 238;
+  t[119] = 239;
+  t[120] = 241;
+  t[121] = 243;
+  t[122] = 242;
+  t[123] = 244;
+  t[124] = 246;
+  t[125] = 245;
+  t[126] = 250;
+  t[127] = 249;
+  t[128] = 251;
+  t[129] = 252;
+  t[130] = 8224;
+  t[131] = 176;
+  t[132] = 162;
+  t[133] = 163;
+  t[134] = 167;
+  t[135] = 8226;
+  t[136] = 182;
+  t[137] = 223;
+  t[138] = 174;
+  t[139] = 169;
+  t[140] = 8482;
+  t[141] = 180;
+  t[142] = 168;
+  t[143] = 8800;
+  t[144] = 198;
+  t[145] = 216;
+  t[146] = 8734;
+  t[147] = 177;
+  t[148] = 8804;
+  t[149] = 8805;
+  t[150] = 165;
+  t[151] = 181;
+  t[152] = 8706;
+  t[153] = 8721;
+  t[154] = 8719;
+  t[156] = 8747;
+  t[157] = 170;
+  t[158] = 186;
+  t[159] = 8486;
+  t[160] = 230;
+  t[161] = 248;
+  t[162] = 191;
+  t[163] = 161;
+  t[164] = 172;
+  t[165] = 8730;
+  t[166] = 402;
+  t[167] = 8776;
+  t[168] = 8710;
+  t[169] = 171;
+  t[170] = 187;
+  t[171] = 8230;
+  t[210] = 218;
+  t[223] = 711;
+  t[224] = 321;
+  t[225] = 322;
+  t[227] = 353;
+  t[229] = 382;
+  t[234] = 253;
+  t[252] = 263;
+  t[253] = 268;
+  t[254] = 269;
+  t[258] = 258;
+  t[260] = 260;
+  t[261] = 261;
+  t[265] = 280;
+  t[266] = 281;
+  t[268] = 283;
+  t[269] = 313;
+  t[275] = 323;
+  t[276] = 324;
+  t[278] = 328;
+  t[284] = 345;
+  t[285] = 346;
+  t[286] = 347;
+  t[292] = 367;
+  t[295] = 377;
+  t[296] = 378;
+  t[298] = 380;
+  t[305] = 963;
+  t[306] = 964;
+  t[307] = 966;
+  t[308] = 8215;
+  t[309] = 8252;
+  t[310] = 8319;
+  t[311] = 8359;
+  t[312] = 8592;
+  t[313] = 8593;
+  t[337] = 9552;
+  t[493] = 1039;
+  t[494] = 1040;
+  t[705] = 1524;
+  t[706] = 8362;
+  t[710] = 64288;
+  t[711] = 64298;
+  t[759] = 1617;
+  t[761] = 1776;
+  t[763] = 1778;
+  t[775] = 1652;
+  t[777] = 1764;
+  t[778] = 1780;
+  t[779] = 1781;
+  t[780] = 1782;
+  t[782] = 771;
+  t[783] = 64726;
+  t[786] = 8363;
+  t[788] = 8532;
+  t[790] = 768;
+  t[791] = 769;
+  t[792] = 768;
+  t[795] = 803;
+  t[797] = 64336;
+  t[798] = 64337;
+  t[799] = 64342;
+  t[800] = 64343;
+  t[801] = 64344;
+  t[802] = 64345;
+  t[803] = 64362;
+  t[804] = 64363;
+  t[805] = 64364;
+  t[2424] = 7821;
+  t[2425] = 7822;
+  t[2426] = 7823;
+  t[2427] = 7824;
+  t[2428] = 7825;
+  t[2429] = 7826;
+  t[2430] = 7827;
+  t[2433] = 7682;
+  t[2678] = 8045;
+  t[2679] = 8046;
+  t[2830] = 1552;
+  t[2838] = 686;
+  t[2840] = 751;
+  t[2842] = 753;
+  t[2843] = 754;
+  t[2844] = 755;
+  t[2846] = 757;
+  t[2856] = 767;
+  t[2857] = 848;
+  t[2858] = 849;
+  t[2862] = 853;
+  t[2863] = 854;
+  t[2864] = 855;
+  t[2865] = 861;
+  t[2866] = 862;
+  t[2906] = 7460;
+  t[2908] = 7462;
+  t[2909] = 7463;
+  t[2910] = 7464;
+  t[2912] = 7466;
+  t[2913] = 7467;
+  t[2914] = 7468;
+  t[2916] = 7470;
+  t[2917] = 7471;
+  t[2918] = 7472;
+  t[2920] = 7474;
+  t[2921] = 7475;
+  t[2922] = 7476;
+  t[2924] = 7478;
+  t[2925] = 7479;
+  t[2926] = 7480;
+  t[2928] = 7482;
+  t[2929] = 7483;
+  t[2930] = 7484;
+  t[2932] = 7486;
+  t[2933] = 7487;
+  t[2934] = 7488;
+  t[2936] = 7490;
+  t[2937] = 7491;
+  t[2938] = 7492;
+  t[2940] = 7494;
+  t[2941] = 7495;
+  t[2942] = 7496;
+  t[2944] = 7498;
+  t[2946] = 7500;
+  t[2948] = 7502;
+  t[2950] = 7504;
+  t[2951] = 7505;
+  t[2952] = 7506;
+  t[2954] = 7508;
+  t[2955] = 7509;
+  t[2956] = 7510;
+  t[2958] = 7512;
+  t[2959] = 7513;
+  t[2960] = 7514;
+  t[2962] = 7516;
+  t[2963] = 7517;
+  t[2964] = 7518;
+  t[2966] = 7520;
+  t[2967] = 7521;
+  t[2968] = 7522;
+  t[2970] = 7524;
+  t[2971] = 7525;
+  t[2972] = 7526;
+  t[2974] = 7528;
+  t[2975] = 7529;
+  t[2976] = 7530;
+  t[2978] = 1537;
+  t[2979] = 1538;
+  t[2980] = 1539;
+  t[2982] = 1549;
+  t[2983] = 1551;
+  t[2984] = 1552;
+  t[2986] = 1554;
+  t[2987] = 1555;
+  t[2988] = 1556;
+  t[2990] = 1623;
+  t[2991] = 1624;
+  t[2995] = 1775;
+  t[2999] = 1791;
+  t[3002] = 64290;
+  t[3003] = 64291;
+  t[3004] = 64292;
+  t[3006] = 64294;
+  t[3007] = 64295;
+  t[3008] = 64296;
+  t[3011] = 1900;
+  t[3014] = 8223;
+  t[3015] = 8244;
+  t[3017] = 7532;
+  t[3018] = 7533;
+  t[3019] = 7534;
+  t[3075] = 7590;
+  t[3076] = 7591;
+  t[3079] = 7594;
+  t[3080] = 7595;
+  t[3083] = 7598;
+  t[3084] = 7599;
+  t[3087] = 7602;
+  t[3088] = 7603;
+  t[3091] = 7606;
+  t[3092] = 7607;
+  t[3095] = 7610;
+  t[3096] = 7611;
+  t[3099] = 7614;
+  t[3100] = 7615;
+  t[3103] = 7618;
+  t[3104] = 7619;
+  t[3107] = 8337;
+  t[3108] = 8338;
+  t[3116] = 1884;
+  t[3119] = 1885;
+  t[3120] = 1885;
+  t[3123] = 1886;
+  t[3124] = 1886;
+  t[3127] = 1887;
+  t[3128] = 1887;
+  t[3131] = 1888;
+  t[3132] = 1888;
+  t[3135] = 1889;
+  t[3136] = 1889;
+  t[3139] = 1890;
+  t[3140] = 1890;
+  t[3143] = 1891;
+  t[3144] = 1891;
+  t[3147] = 1892;
+  t[3148] = 1892;
+  t[3153] = 580;
+  t[3154] = 581;
+  t[3157] = 584;
+  t[3158] = 585;
+  t[3161] = 588;
+  t[3162] = 589;
+  t[3165] = 891;
+  t[3166] = 892;
+  t[3169] = 1274;
+  t[3170] = 1275;
+  t[3173] = 1278;
+  t[3174] = 1279;
+  t[3181] = 7622;
+  t[3182] = 7623;
+  t[3282] = 11799;
+  t[3316] = 578;
+  t[3379] = 42785;
+  t[3393] = 1159;
+  t[3416] = 8377;
+});
+var getSupplementalGlyphMapForArialBlack = (0, _util.getLookupTableFactory)(function (t) {
+  t[227] = 322;
+  t[264] = 261;
+  t[291] = 346;
+});
+var getSupplementalGlyphMapForCalibri = (0, _util.getLookupTableFactory)(function (t) {
+  t[1] = 32;
+  t[4] = 65;
+  t[17] = 66;
+  t[18] = 67;
+  t[24] = 68;
+  t[28] = 69;
+  t[38] = 70;
+  t[39] = 71;
+  t[44] = 72;
+  t[47] = 73;
+  t[58] = 74;
+  t[60] = 75;
+  t[62] = 76;
+  t[68] = 77;
+  t[69] = 78;
+  t[75] = 79;
+  t[87] = 80;
+  t[89] = 81;
+  t[90] = 82;
+  t[94] = 83;
+  t[100] = 84;
+  t[104] = 85;
+  t[115] = 86;
+  t[116] = 87;
+  t[121] = 88;
+  t[122] = 89;
+  t[127] = 90;
+  t[258] = 97;
+  t[268] = 261;
+  t[271] = 98;
+  t[272] = 99;
+  t[273] = 263;
+  t[282] = 100;
+  t[286] = 101;
+  t[295] = 281;
+  t[296] = 102;
+  t[336] = 103;
+  t[346] = 104;
+  t[349] = 105;
+  t[361] = 106;
+  t[364] = 107;
+  t[367] = 108;
+  t[371] = 322;
+  t[373] = 109;
+  t[374] = 110;
+  t[381] = 111;
+  t[383] = 243;
+  t[393] = 112;
+  t[395] = 113;
+  t[396] = 114;
+  t[400] = 115;
+  t[401] = 347;
+  t[410] = 116;
+  t[437] = 117;
+  t[448] = 118;
+  t[449] = 119;
+  t[454] = 120;
+  t[455] = 121;
+  t[460] = 122;
+  t[463] = 380;
+  t[853] = 44;
+  t[855] = 58;
+  t[856] = 46;
+  t[876] = 47;
+  t[878] = 45;
+  t[882] = 45;
+  t[894] = 40;
+  t[895] = 41;
+  t[896] = 91;
+  t[897] = 93;
+  t[923] = 64;
+  t[1004] = 48;
+  t[1005] = 49;
+  t[1006] = 50;
+  t[1007] = 51;
+  t[1008] = 52;
+  t[1009] = 53;
+  t[1010] = 54;
+  t[1011] = 55;
+  t[1012] = 56;
+  t[1013] = 57;
+  t[1081] = 37;
+  t[1085] = 43;
+  t[1086] = 45;
+});
+exports.getStdFontMap = getStdFontMap;
+exports.getNonStdFontMap = getNonStdFontMap;
+exports.getSerifFonts = getSerifFonts;
+exports.getSymbolsFonts = getSymbolsFonts;
+exports.getGlyphMapForStandardFonts = getGlyphMapForStandardFonts;
+exports.getSupplementalGlyphMapForArialBlack = getSupplementalGlyphMapForArialBlack;
+exports.getSupplementalGlyphMapForCalibri = getSupplementalGlyphMapForCalibri;
+
+/***/ }),
+/* 162 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+var getLookupTableFactory = __w_pdfjs_require__(2).getLookupTableFactory;
+var getSpecialPUASymbols = getLookupTableFactory(function (t) {
+ t[63721] = 0x00A9;
+ t[63193] = 0x00A9;
+ t[63720] = 0x00AE;
+ t[63194] = 0x00AE;
+ t[63722] = 0x2122;
+ t[63195] = 0x2122;
+ t[63729] = 0x23A7;
+ t[63730] = 0x23A8;
+ t[63731] = 0x23A9;
+ t[63740] = 0x23AB;
+ t[63741] = 0x23AC;
+ t[63742] = 0x23AD;
+ t[63726] = 0x23A1;
+ t[63727] = 0x23A2;
+ t[63728] = 0x23A3;
+ t[63737] = 0x23A4;
+ t[63738] = 0x23A5;
+ t[63739] = 0x23A6;
+ t[63723] = 0x239B;
+ t[63724] = 0x239C;
+ t[63725] = 0x239D;
+ t[63734] = 0x239E;
+ t[63735] = 0x239F;
+ t[63736] = 0x23A0;
+});
+function mapSpecialUnicodeValues(code) {
+ if (code >= 0xFFF0 && code <= 0xFFFF) {
+  return 0;
+ } else if (code >= 0xF600 && code <= 0xF8FF) {
+  return getSpecialPUASymbols()[code] || code;
+ } else if (code === 0x00AD) {
+  return 0x002D;
+ }
+ return code;
+}
+function getUnicodeForGlyph(name, glyphsUnicodeMap) {
+ var unicode = glyphsUnicodeMap[name];
+ if (unicode !== undefined) {
+  return unicode;
+ }
+ if (!name) {
+  return -1;
+ }
+ if (name[0] === 'u') {
+  var nameLen = name.length, hexStr;
+  if (nameLen === 7 && name[1] === 'n' && name[2] === 'i') {
+   hexStr = name.substring(3);
+  } else if (nameLen >= 5 && nameLen <= 7) {
+   hexStr = name.substring(1);
+  } else {
+   return -1;
+  }
+  if (hexStr === hexStr.toUpperCase()) {
+   unicode = parseInt(hexStr, 16);
+   if (unicode >= 0) {
+    return unicode;
+   }
+  }
+ }
+ return -1;
+}
+var UnicodeRanges = [
+ {
+  'begin': 0x0000,
+  'end': 0x007F
+ },
+ {
+  'begin': 0x0080,
+  'end': 0x00FF
+ },
+ {
+  'begin': 0x0100,
+  'end': 0x017F
+ },
+ {
+  'begin': 0x0180,
+  'end': 0x024F
+ },
+ {
+  'begin': 0x0250,
+  'end': 0x02AF
+ },
+ {
+  'begin': 0x02B0,
+  'end': 0x02FF
+ },
+ {
+  'begin': 0x0300,
+  'end': 0x036F
+ },
+ {
+  'begin': 0x0370,
+  'end': 0x03FF
+ },
+ {
+  'begin': 0x2C80,
+  'end': 0x2CFF
+ },
+ {
+  'begin': 0x0400,
+  'end': 0x04FF
+ },
+ {
+  'begin': 0x0530,
+  'end': 0x058F
+ },
+ {
+  'begin': 0x0590,
+  'end': 0x05FF
+ },
+ {
+  'begin': 0xA500,
+  'end': 0xA63F
+ },
+ {
+  'begin': 0x0600,
+  'end': 0x06FF
+ },
+ {
+  'begin': 0x07C0,
+  'end': 0x07FF
+ },
+ {
+  'begin': 0x0900,
+  'end': 0x097F
+ },
+ {
+  'begin': 0x0980,
+  'end': 0x09FF
+ },
+ {
+  'begin': 0x0A00,
+  'end': 0x0A7F
+ },
+ {
+  'begin': 0x0A80,
+  'end': 0x0AFF
+ },
+ {
+  'begin': 0x0B00,
+  'end': 0x0B7F
+ },
+ {
+  'begin': 0x0B80,
+  'end': 0x0BFF
+ },
+ {
+  'begin': 0x0C00,
+  'end': 0x0C7F
+ },
+ {
+  'begin': 0x0C80,
+  'end': 0x0CFF
+ },
+ {
+  'begin': 0x0D00,
+  'end': 0x0D7F
+ },
+ {
+  'begin': 0x0E00,
+  'end': 0x0E7F
+ },
+ {
+  'begin': 0x0E80,
+  'end': 0x0EFF
+ },
+ {
+  'begin': 0x10A0,
+  'end': 0x10FF
+ },
+ {
+  'begin': 0x1B00,
+  'end': 0x1B7F
+ },
+ {
+  'begin': 0x1100,
+  'end': 0x11FF
+ },
+ {
+  'begin': 0x1E00,
+  'end': 0x1EFF
+ },
+ {
+  'begin': 0x1F00,
+  'end': 0x1FFF
+ },
+ {
+  'begin': 0x2000,
+  'end': 0x206F
+ },
+ {
+  'begin': 0x2070,
+  'end': 0x209F
+ },
+ {
+  'begin': 0x20A0,
+  'end': 0x20CF
+ },
+ {
+  'begin': 0x20D0,
+  'end': 0x20FF
+ },
+ {
+  'begin': 0x2100,
+  'end': 0x214F
+ },
+ {
+  'begin': 0x2150,
+  'end': 0x218F
+ },
+ {
+  'begin': 0x2190,
+  'end': 0x21FF
+ },
+ {
+  'begin': 0x2200,
+  'end': 0x22FF
+ },
+ {
+  'begin': 0x2300,
+  'end': 0x23FF
+ },
+ {
+  'begin': 0x2400,
+  'end': 0x243F
+ },
+ {
+  'begin': 0x2440,
+  'end': 0x245F
+ },
+ {
+  'begin': 0x2460,
+  'end': 0x24FF
+ },
+ {
+  'begin': 0x2500,
+  'end': 0x257F
+ },
+ {
+  'begin': 0x2580,
+  'end': 0x259F
+ },
+ {
+  'begin': 0x25A0,
+  'end': 0x25FF
+ },
+ {
+  'begin': 0x2600,
+  'end': 0x26FF
+ },
+ {
+  'begin': 0x2700,
+  'end': 0x27BF
+ },
+ {
+  'begin': 0x3000,
+  'end': 0x303F
+ },
+ {
+  'begin': 0x3040,
+  'end': 0x309F
+ },
+ {
+  'begin': 0x30A0,
+  'end': 0x30FF
+ },
+ {
+  'begin': 0x3100,
+  'end': 0x312F
+ },
+ {
+  'begin': 0x3130,
+  'end': 0x318F
+ },
+ {
+  'begin': 0xA840,
+  'end': 0xA87F
+ },
+ {
+  'begin': 0x3200,
+  'end': 0x32FF
+ },
+ {
+  'begin': 0x3300,
+  'end': 0x33FF
+ },
+ {
+  'begin': 0xAC00,
+  'end': 0xD7AF
+ },
+ {
+  'begin': 0xD800,
+  'end': 0xDFFF
+ },
+ {
+  'begin': 0x10900,
+  'end': 0x1091F
+ },
+ {
+  'begin': 0x4E00,
+  'end': 0x9FFF
+ },
+ {
+  'begin': 0xE000,
+  'end': 0xF8FF
+ },
+ {
+  'begin': 0x31C0,
+  'end': 0x31EF
+ },
+ {
+  'begin': 0xFB00,
+  'end': 0xFB4F
+ },
+ {
+  'begin': 0xFB50,
+  'end': 0xFDFF
+ },
+ {
+  'begin': 0xFE20,
+  'end': 0xFE2F
+ },
+ {
+  'begin': 0xFE10,
+  'end': 0xFE1F
+ },
+ {
+  'begin': 0xFE50,
+  'end': 0xFE6F
+ },
+ {
+  'begin': 0xFE70,
+  'end': 0xFEFF
+ },
+ {
+  'begin': 0xFF00,
+  'end': 0xFFEF
+ },
+ {
+  'begin': 0xFFF0,
+  'end': 0xFFFF
+ },
+ {
+  'begin': 0x0F00,
+  'end': 0x0FFF
+ },
+ {
+  'begin': 0x0700,
+  'end': 0x074F
+ },
+ {
+  'begin': 0x0780,
+  'end': 0x07BF
+ },
+ {
+  'begin': 0x0D80,
+  'end': 0x0DFF
+ },
+ {
+  'begin': 0x1000,
+  'end': 0x109F
+ },
+ {
+  'begin': 0x1200,
+  'end': 0x137F
+ },
+ {
+  'begin': 0x13A0,
+  'end': 0x13FF
+ },
+ {
+  'begin': 0x1400,
+  'end': 0x167F
+ },
+ {
+  'begin': 0x1680,
+  'end': 0x169F
+ },
+ {
+  'begin': 0x16A0,
+  'end': 0x16FF
+ },
+ {
+  'begin': 0x1780,
+  'end': 0x17FF
+ },
+ {
+  'begin': 0x1800,
+  'end': 0x18AF
+ },
+ {
+  'begin': 0x2800,
+  'end': 0x28FF
+ },
+ {
+  'begin': 0xA000,
+  'end': 0xA48F
+ },
+ {
+  'begin': 0x1700,
+  'end': 0x171F
+ },
+ {
+  'begin': 0x10300,
+  'end': 0x1032F
+ },
+ {
+  'begin': 0x10330,
+  'end': 0x1034F
+ },
+ {
+  'begin': 0x10400,
+  'end': 0x1044F
+ },
+ {
+  'begin': 0x1D000,
+  'end': 0x1D0FF
+ },
+ {
+  'begin': 0x1D400,
+  'end': 0x1D7FF
+ },
+ {
+  'begin': 0xFF000,
+  'end': 0xFFFFD
+ },
+ {
+  'begin': 0xFE00,
+  'end': 0xFE0F
+ },
+ {
+  'begin': 0xE0000,
+  'end': 0xE007F
+ },
+ {
+  'begin': 0x1900,
+  'end': 0x194F
+ },
+ {
+  'begin': 0x1950,
+  'end': 0x197F
+ },
+ {
+  'begin': 0x1980,
+  'end': 0x19DF
+ },
+ {
+  'begin': 0x1A00,
+  'end': 0x1A1F
+ },
+ {
+  'begin': 0x2C00,
+  'end': 0x2C5F
+ },
+ {
+  'begin': 0x2D30,
+  'end': 0x2D7F
+ },
+ {
+  'begin': 0x4DC0,
+  'end': 0x4DFF
+ },
+ {
+  'begin': 0xA800,
+  'end': 0xA82F
+ },
+ {
+  'begin': 0x10000,
+  'end': 0x1007F
+ },
+ {
+  'begin': 0x10140,
+  'end': 0x1018F
+ },
+ {
+  'begin': 0x10380,
+  'end': 0x1039F
+ },
+ {
+  'begin': 0x103A0,
+  'end': 0x103DF
+ },
+ {
+  'begin': 0x10450,
+  'end': 0x1047F
+ },
+ {
+  'begin': 0x10480,
+  'end': 0x104AF
+ },
+ {
+  'begin': 0x10800,
+  'end': 0x1083F
+ },
+ {
+  'begin': 0x10A00,
+  'end': 0x10A5F
+ },
+ {
+  'begin': 0x1D300,
+  'end': 0x1D35F
+ },
+ {
+  'begin': 0x12000,
+  'end': 0x123FF
+ },
+ {
+  'begin': 0x1D360,
+  'end': 0x1D37F
+ },
+ {
+  'begin': 0x1B80,
+  'end': 0x1BBF
+ },
+ {
+  'begin': 0x1C00,
+  'end': 0x1C4F
+ },
+ {
+  'begin': 0x1C50,
+  'end': 0x1C7F
+ },
+ {
+  'begin': 0xA880,
+  'end': 0xA8DF
+ },
+ {
+  'begin': 0xA900,
+  'end': 0xA92F
+ },
+ {
+  'begin': 0xA930,
+  'end': 0xA95F
+ },
+ {
+  'begin': 0xAA00,
+  'end': 0xAA5F
+ },
+ {
+  'begin': 0x10190,
+  'end': 0x101CF
+ },
+ {
+  'begin': 0x101D0,
+  'end': 0x101FF
+ },
+ {
+  'begin': 0x102A0,
+  'end': 0x102DF
+ },
+ {
+  'begin': 0x1F030,
+  'end': 0x1F09F
+ }
+];
+function getUnicodeRangeFor(value) {
+ for (var i = 0, ii = UnicodeRanges.length; i < ii; i++) {
+  var range = UnicodeRanges[i];
+  if (value >= range.begin && value < range.end) {
+   return i;
+  }
+ }
+ return -1;
+}
+function isRTLRangeFor(value) {
+ var range = UnicodeRanges[13];
+ if (value >= range.begin && value < range.end) {
+  return true;
+ }
+ range = UnicodeRanges[11];
+ if (value >= range.begin && value < range.end) {
+  return true;
+ }
+ return false;
+}
+var getNormalizedUnicodes = getLookupTableFactory(function (t) {
+ t['\u00A8'] = '\u0020\u0308';
+ t['\u00AF'] = '\u0020\u0304';
+ t['\u00B4'] = '\u0020\u0301';
+ t['\u00B5'] = '\u03BC';
+ t['\u00B8'] = '\u0020\u0327';
+ t['\u0132'] = '\u0049\u004A';
+ t['\u0133'] = '\u0069\u006A';
+ t['\u013F'] = '\u004C\u00B7';
+ t['\u0140'] = '\u006C\u00B7';
+ t['\u0149'] = '\u02BC\u006E';
+ t['\u017F'] = '\u0073';
+ t['\u01C4'] = '\u0044\u017D';
+ t['\u01C5'] = '\u0044\u017E';
+ t['\u01C6'] = '\u0064\u017E';
+ t['\u01C7'] = '\u004C\u004A';
+ t['\u01C8'] = '\u004C\u006A';
+ t['\u01C9'] = '\u006C\u006A';
+ t['\u01CA'] = '\u004E\u004A';
+ t['\u01CB'] = '\u004E\u006A';
+ t['\u01CC'] = '\u006E\u006A';
+ t['\u01F1'] = '\u0044\u005A';
+ t['\u01F2'] = '\u0044\u007A';
+ t['\u01F3'] = '\u0064\u007A';
+ t['\u02D8'] = '\u0020\u0306';
+ t['\u02D9'] = '\u0020\u0307';
+ t['\u02DA'] = '\u0020\u030A';
+ t['\u02DB'] = '\u0020\u0328';
+ t['\u02DC'] = '\u0020\u0303';
+ t['\u02DD'] = '\u0020\u030B';
+ t['\u037A'] = '\u0020\u0345';
+ t['\u0384'] = '\u0020\u0301';
+ t['\u03D0'] = '\u03B2';
+ t['\u03D1'] = '\u03B8';
+ t['\u03D2'] = '\u03A5';
+ t['\u03D5'] = '\u03C6';
+ t['\u03D6'] = '\u03C0';
+ t['\u03F0'] = '\u03BA';
+ t['\u03F1'] = '\u03C1';
+ t['\u03F2'] = '\u03C2';
+ t['\u03F4'] = '\u0398';
+ t['\u03F5'] = '\u03B5';
+ t['\u03F9'] = '\u03A3';
+ t['\u0587'] = '\u0565\u0582';
+ t['\u0675'] = '\u0627\u0674';
+ t['\u0676'] = '\u0648\u0674';
+ t['\u0677'] = '\u06C7\u0674';
+ t['\u0678'] = '\u064A\u0674';
+ t['\u0E33'] = '\u0E4D\u0E32';
+ t['\u0EB3'] = '\u0ECD\u0EB2';
+ t['\u0EDC'] = '\u0EAB\u0E99';
+ t['\u0EDD'] = '\u0EAB\u0EA1';
+ t['\u0F77'] = '\u0FB2\u0F81';
+ t['\u0F79'] = '\u0FB3\u0F81';
+ t['\u1E9A'] = '\u0061\u02BE';
+ t['\u1FBD'] = '\u0020\u0313';
+ t['\u1FBF'] = '\u0020\u0313';
+ t['\u1FC0'] = '\u0020\u0342';
+ t['\u1FFE'] = '\u0020\u0314';
+ t['\u2002'] = '\u0020';
+ t['\u2003'] = '\u0020';
+ t['\u2004'] = '\u0020';
+ t['\u2005'] = '\u0020';
+ t['\u2006'] = '\u0020';
+ t['\u2008'] = '\u0020';
+ t['\u2009'] = '\u0020';
+ t['\u200A'] = '\u0020';
+ t['\u2017'] = '\u0020\u0333';
+ t['\u2024'] = '\u002E';
+ t['\u2025'] = '\u002E\u002E';
+ t['\u2026'] = '\u002E\u002E\u002E';
+ t['\u2033'] = '\u2032\u2032';
+ t['\u2034'] = '\u2032\u2032\u2032';
+ t['\u2036'] = '\u2035\u2035';
+ t['\u2037'] = '\u2035\u2035\u2035';
+ t['\u203C'] = '\u0021\u0021';
+ t['\u203E'] = '\u0020\u0305';
+ t['\u2047'] = '\u003F\u003F';
+ t['\u2048'] = '\u003F\u0021';
+ t['\u2049'] = '\u0021\u003F';
+ t['\u2057'] = '\u2032\u2032\u2032\u2032';
+ t['\u205F'] = '\u0020';
+ t['\u20A8'] = '\u0052\u0073';
+ t['\u2100'] = '\u0061\u002F\u0063';
+ t['\u2101'] = '\u0061\u002F\u0073';
+ t['\u2103'] = '\u00B0\u0043';
+ t['\u2105'] = '\u0063\u002F\u006F';
+ t['\u2106'] = '\u0063\u002F\u0075';
+ t['\u2107'] = '\u0190';
+ t['\u2109'] = '\u00B0\u0046';
+ t['\u2116'] = '\u004E\u006F';
+ t['\u2121'] = '\u0054\u0045\u004C';
+ t['\u2135'] = '\u05D0';
+ t['\u2136'] = '\u05D1';
+ t['\u2137'] = '\u05D2';
+ t['\u2138'] = '\u05D3';
+ t['\u213B'] = '\u0046\u0041\u0058';
+ t['\u2160'] = '\u0049';
+ t['\u2161'] = '\u0049\u0049';
+ t['\u2162'] = '\u0049\u0049\u0049';
+ t['\u2163'] = '\u0049\u0056';
+ t['\u2164'] = '\u0056';
+ t['\u2165'] = '\u0056\u0049';
+ t['\u2166'] = '\u0056\u0049\u0049';
+ t['\u2167'] = '\u0056\u0049\u0049\u0049';
+ t['\u2168'] = '\u0049\u0058';
+ t['\u2169'] = '\u0058';
+ t['\u216A'] = '\u0058\u0049';
+ t['\u216B'] = '\u0058\u0049\u0049';
+ t['\u216C'] = '\u004C';
+ t['\u216D'] = '\u0043';
+ t['\u216E'] = '\u0044';
+ t['\u216F'] = '\u004D';
+ t['\u2170'] = '\u0069';
+ t['\u2171'] = '\u0069\u0069';
+ t['\u2172'] = '\u0069\u0069\u0069';
+ t['\u2173'] = '\u0069\u0076';
+ t['\u2174'] = '\u0076';
+ t['\u2175'] = '\u0076\u0069';
+ t['\u2176'] = '\u0076\u0069\u0069';
+ t['\u2177'] = '\u0076\u0069\u0069\u0069';
+ t['\u2178'] = '\u0069\u0078';
+ t['\u2179'] = '\u0078';
+ t['\u217A'] = '\u0078\u0069';
+ t['\u217B'] = '\u0078\u0069\u0069';
+ t['\u217C'] = '\u006C';
+ t['\u217D'] = '\u0063';
+ t['\u217E'] = '\u0064';
+ t['\u217F'] = '\u006D';
+ t['\u222C'] = '\u222B\u222B';
+ t['\u222D'] = '\u222B\u222B\u222B';
+ t['\u222F'] = '\u222E\u222E';
+ t['\u2230'] = '\u222E\u222E\u222E';
+ t['\u2474'] = '\u0028\u0031\u0029';
+ t['\u2475'] = '\u0028\u0032\u0029';
+ t['\u2476'] = '\u0028\u0033\u0029';
+ t['\u2477'] = '\u0028\u0034\u0029';
+ t['\u2478'] = '\u0028\u0035\u0029';
+ t['\u2479'] = '\u0028\u0036\u0029';
+ t['\u247A'] = '\u0028\u0037\u0029';
+ t['\u247B'] = '\u0028\u0038\u0029';
+ t['\u247C'] = '\u0028\u0039\u0029';
+ t['\u247D'] = '\u0028\u0031\u0030\u0029';
+ t['\u247E'] = '\u0028\u0031\u0031\u0029';
+ t['\u247F'] = '\u0028\u0031\u0032\u0029';
+ t['\u2480'] = '\u0028\u0031\u0033\u0029';
+ t['\u2481'] = '\u0028\u0031\u0034\u0029';
+ t['\u2482'] = '\u0028\u0031\u0035\u0029';
+ t['\u2483'] = '\u0028\u0031\u0036\u0029';
+ t['\u2484'] = '\u0028\u0031\u0037\u0029';
+ t['\u2485'] = '\u0028\u0031\u0038\u0029';
+ t['\u2486'] = '\u0028\u0031\u0039\u0029';
+ t['\u2487'] = '\u0028\u0032\u0030\u0029';
+ t['\u2488'] = '\u0031\u002E';
+ t['\u2489'] = '\u0032\u002E';
+ t['\u248A'] = '\u0033\u002E';
+ t['\u248B'] = '\u0034\u002E';
+ t['\u248C'] = '\u0035\u002E';
+ t['\u248D'] = '\u0036\u002E';
+ t['\u248E'] = '\u0037\u002E';
+ t['\u248F'] = '\u0038\u002E';
+ t['\u2490'] = '\u0039\u002E';
+ t['\u2491'] = '\u0031\u0030\u002E';
+ t['\u2492'] = '\u0031\u0031\u002E';
+ t['\u2493'] = '\u0031\u0032\u002E';
+ t['\u2494'] = '\u0031\u0033\u002E';
+ t['\u2495'] = '\u0031\u0034\u002E';
+ t['\u2496'] = '\u0031\u0035\u002E';
+ t['\u2497'] = '\u0031\u0036\u002E';
+ t['\u2498'] = '\u0031\u0037\u002E';
+ t['\u2499'] = '\u0031\u0038\u002E';
+ t['\u249A'] = '\u0031\u0039\u002E';
+ t['\u249B'] = '\u0032\u0030\u002E';
+ t['\u249C'] = '\u0028\u0061\u0029';
+ t['\u249D'] = '\u0028\u0062\u0029';
+ t['\u249E'] = '\u0028\u0063\u0029';
+ t['\u249F'] = '\u0028\u0064\u0029';
+ t['\u24A0'] = '\u0028\u0065\u0029';
+ t['\u24A1'] = '\u0028\u0066\u0029';
+ t['\u24A2'] = '\u0028\u0067\u0029';
+ t['\u24A3'] = '\u0028\u0068\u0029';
+ t['\u24A4'] = '\u0028\u0069\u0029';
+ t['\u24A5'] = '\u0028\u006A\u0029';
+ t['\u24A6'] = '\u0028\u006B\u0029';
+ t['\u24A7'] = '\u0028\u006C\u0029';
+ t['\u24A8'] = '\u0028\u006D\u0029';
+ t['\u24A9'] = '\u0028\u006E\u0029';
+ t['\u24AA'] = '\u0028\u006F\u0029';
+ t['\u24AB'] = '\u0028\u0070\u0029';
+ t['\u24AC'] = '\u0028\u0071\u0029';
+ t['\u24AD'] = '\u0028\u0072\u0029';
+ t['\u24AE'] = '\u0028\u0073\u0029';
+ t['\u24AF'] = '\u0028\u0074\u0029';
+ t['\u24B0'] = '\u0028\u0075\u0029';
+ t['\u24B1'] = '\u0028\u0076\u0029';
+ t['\u24B2'] = '\u0028\u0077\u0029';
+ t['\u24B3'] = '\u0028\u0078\u0029';
+ t['\u24B4'] = '\u0028\u0079\u0029';
+ t['\u24B5'] = '\u0028\u007A\u0029';
+ t['\u2A0C'] = '\u222B\u222B\u222B\u222B';
+ t['\u2A74'] = '\u003A\u003A\u003D';
+ t['\u2A75'] = '\u003D\u003D';
+ t['\u2A76'] = '\u003D\u003D\u003D';
+ t['\u2E9F'] = '\u6BCD';
+ t['\u2EF3'] = '\u9F9F';
+ t['\u2F00'] = '\u4E00';
+ t['\u2F01'] = '\u4E28';
+ t['\u2F02'] = '\u4E36';
+ t['\u2F03'] = '\u4E3F';
+ t['\u2F04'] = '\u4E59';
+ t['\u2F05'] = '\u4E85';
+ t['\u2F06'] = '\u4E8C';
+ t['\u2F07'] = '\u4EA0';
+ t['\u2F08'] = '\u4EBA';
+ t['\u2F09'] = '\u513F';
+ t['\u2F0A'] = '\u5165';
+ t['\u2F0B'] = '\u516B';
+ t['\u2F0C'] = '\u5182';
+ t['\u2F0D'] = '\u5196';
+ t['\u2F0E'] = '\u51AB';
+ t['\u2F0F'] = '\u51E0';
+ t['\u2F10'] = '\u51F5';
+ t['\u2F11'] = '\u5200';
+ t['\u2F12'] = '\u529B';
+ t['\u2F13'] = '\u52F9';
+ t['\u2F14'] = '\u5315';
+ t['\u2F15'] = '\u531A';
+ t['\u2F16'] = '\u5338';
+ t['\u2F17'] = '\u5341';
+ t['\u2F18'] = '\u535C';
+ t['\u2F19'] = '\u5369';
+ t['\u2F1A'] = '\u5382';
+ t['\u2F1B'] = '\u53B6';
+ t['\u2F1C'] = '\u53C8';
+ t['\u2F1D'] = '\u53E3';
+ t['\u2F1E'] = '\u56D7';
+ t['\u2F1F'] = '\u571F';
+ t['\u2F20'] = '\u58EB';
+ t['\u2F21'] = '\u5902';
+ t['\u2F22'] = '\u590A';
+ t['\u2F23'] = '\u5915';
+ t['\u2F24'] = '\u5927';
+ t['\u2F25'] = '\u5973';
+ t['\u2F26'] = '\u5B50';
+ t['\u2F27'] = '\u5B80';
+ t['\u2F28'] = '\u5BF8';
+ t['\u2F29'] = '\u5C0F';
+ t['\u2F2A'] = '\u5C22';
+ t['\u2F2B'] = '\u5C38';
+ t['\u2F2C'] = '\u5C6E';
+ t['\u2F2D'] = '\u5C71';
+ t['\u2F2E'] = '\u5DDB';
+ t['\u2F2F'] = '\u5DE5';
+ t['\u2F30'] = '\u5DF1';
+ t['\u2F31'] = '\u5DFE';
+ t['\u2F32'] = '\u5E72';
+ t['\u2F33'] = '\u5E7A';
+ t['\u2F34'] = '\u5E7F';
+ t['\u2F35'] = '\u5EF4';
+ t['\u2F36'] = '\u5EFE';
+ t['\u2F37'] = '\u5F0B';
+ t['\u2F38'] = '\u5F13';
+ t['\u2F39'] = '\u5F50';
+ t['\u2F3A'] = '\u5F61';
+ t['\u2F3B'] = '\u5F73';
+ t['\u2F3C'] = '\u5FC3';
+ t['\u2F3D'] = '\u6208';
+ t['\u2F3E'] = '\u6236';
+ t['\u2F3F'] = '\u624B';
+ t['\u2F40'] = '\u652F';
+ t['\u2F41'] = '\u6534';
+ t['\u2F42'] = '\u6587';
+ t['\u2F43'] = '\u6597';
+ t['\u2F44'] = '\u65A4';
+ t['\u2F45'] = '\u65B9';
+ t['\u2F46'] = '\u65E0';
+ t['\u2F47'] = '\u65E5';
+ t['\u2F48'] = '\u66F0';
+ t['\u2F49'] = '\u6708';
+ t['\u2F4A'] = '\u6728';
+ t['\u2F4B'] = '\u6B20';
+ t['\u2F4C'] = '\u6B62';
+ t['\u2F4D'] = '\u6B79';
+ t['\u2F4E'] = '\u6BB3';
+ t['\u2F4F'] = '\u6BCB';
+ t['\u2F50'] = '\u6BD4';
+ t['\u2F51'] = '\u6BDB';
+ t['\u2F52'] = '\u6C0F';
+ t['\u2F53'] = '\u6C14';
+ t['\u2F54'] = '\u6C34';
+ t['\u2F55'] = '\u706B';
+ t['\u2F56'] = '\u722A';
+ t['\u2F57'] = '\u7236';
+ t['\u2F58'] = '\u723B';
+ t['\u2F59'] = '\u723F';
+ t['\u2F5A'] = '\u7247';
+ t['\u2F5B'] = '\u7259';
+ t['\u2F5C'] = '\u725B';
+ t['\u2F5D'] = '\u72AC';
+ t['\u2F5E'] = '\u7384';
+ t['\u2F5F'] = '\u7389';
+ t['\u2F60'] = '\u74DC';
+ t['\u2F61'] = '\u74E6';
+ t['\u2F62'] = '\u7518';
+ t['\u2F63'] = '\u751F';
+ t['\u2F64'] = '\u7528';
+ t['\u2F65'] = '\u7530';
+ t['\u2F66'] = '\u758B';
+ t['\u2F67'] = '\u7592';
+ t['\u2F68'] = '\u7676';
+ t['\u2F69'] = '\u767D';
+ t['\u2F6A'] = '\u76AE';
+ t['\u2F6B'] = '\u76BF';
+ t['\u2F6C'] = '\u76EE';
+ t['\u2F6D'] = '\u77DB';
+ t['\u2F6E'] = '\u77E2';
+ t['\u2F6F'] = '\u77F3';
+ t['\u2F70'] = '\u793A';
+ t['\u2F71'] = '\u79B8';
+ t['\u2F72'] = '\u79BE';
+ t['\u2F73'] = '\u7A74';
+ t['\u2F74'] = '\u7ACB';
+ t['\u2F75'] = '\u7AF9';
+ t['\u2F76'] = '\u7C73';
+ t['\u2F77'] = '\u7CF8';
+ t['\u2F78'] = '\u7F36';
+ t['\u2F79'] = '\u7F51';
+ t['\u2F7A'] = '\u7F8A';
+ t['\u2F7B'] = '\u7FBD';
+ t['\u2F7C'] = '\u8001';
+ t['\u2F7D'] = '\u800C';
+ t['\u2F7E'] = '\u8012';
+ t['\u2F7F'] = '\u8033';
+ t['\u2F80'] = '\u807F';
+ t['\u2F81'] = '\u8089';
+ t['\u2F82'] = '\u81E3';
+ t['\u2F83'] = '\u81EA';
+ t['\u2F84'] = '\u81F3';
+ t['\u2F85'] = '\u81FC';
+ t['\u2F86'] = '\u820C';
+ t['\u2F87'] = '\u821B';
+ t['\u2F88'] = '\u821F';
+ t['\u2F89'] = '\u826E';
+ t['\u2F8A'] = '\u8272';
+ t['\u2F8B'] = '\u8278';
+ t['\u2F8C'] = '\u864D';
+ t['\u2F8D'] = '\u866B';
+ t['\u2F8E'] = '\u8840';
+ t['\u2F8F'] = '\u884C';
+ t['\u2F90'] = '\u8863';
+ t['\u2F91'] = '\u897E';
+ t['\u2F92'] = '\u898B';
+ t['\u2F93'] = '\u89D2';
+ t['\u2F94'] = '\u8A00';
+ t['\u2F95'] = '\u8C37';
+ t['\u2F96'] = '\u8C46';
+ t['\u2F97'] = '\u8C55';
+ t['\u2F98'] = '\u8C78';
+ t['\u2F99'] = '\u8C9D';
+ t['\u2F9A'] = '\u8D64';
+ t['\u2F9B'] = '\u8D70';
+ t['\u2F9C'] = '\u8DB3';
+ t['\u2F9D'] = '\u8EAB';
+ t['\u2F9E'] = '\u8ECA';
+ t['\u2F9F'] = '\u8F9B';
+ t['\u2FA0'] = '\u8FB0';
+ t['\u2FA1'] = '\u8FB5';
+ t['\u2FA2'] = '\u9091';
+ t['\u2FA3'] = '\u9149';
+ t['\u2FA4'] = '\u91C6';
+ t['\u2FA5'] = '\u91CC';
+ t['\u2FA6'] = '\u91D1';
+ t['\u2FA7'] = '\u9577';
+ t['\u2FA8'] = '\u9580';
+ t['\u2FA9'] = '\u961C';
+ t['\u2FAA'] = '\u96B6';
+ t['\u2FAB'] = '\u96B9';
+ t['\u2FAC'] = '\u96E8';
+ t['\u2FAD'] = '\u9751';
+ t['\u2FAE'] = '\u975E';
+ t['\u2FAF'] = '\u9762';
+ t['\u2FB0'] = '\u9769';
+ t['\u2FB1'] = '\u97CB';
+ t['\u2FB2'] = '\u97ED';
+ t['\u2FB3'] = '\u97F3';
+ t['\u2FB4'] = '\u9801';
+ t['\u2FB5'] = '\u98A8';
+ t['\u2FB6'] = '\u98DB';
+ t['\u2FB7'] = '\u98DF';
+ t['\u2FB8'] = '\u9996';
+ t['\u2FB9'] = '\u9999';
+ t['\u2FBA'] = '\u99AC';
+ t['\u2FBB'] = '\u9AA8';
+ t['\u2FBC'] = '\u9AD8';
+ t['\u2FBD'] = '\u9ADF';
+ t['\u2FBE'] = '\u9B25';
+ t['\u2FBF'] = '\u9B2F';
+ t['\u2FC0'] = '\u9B32';
+ t['\u2FC1'] = '\u9B3C';
+ t['\u2FC2'] = '\u9B5A';
+ t['\u2FC3'] = '\u9CE5';
+ t['\u2FC4'] = '\u9E75';
+ t['\u2FC5'] = '\u9E7F';
+ t['\u2FC6'] = '\u9EA5';
+ t['\u2FC7'] = '\u9EBB';
+ t['\u2FC8'] = '\u9EC3';
+ t['\u2FC9'] = '\u9ECD';
+ t['\u2FCA'] = '\u9ED1';
+ t['\u2FCB'] = '\u9EF9';
+ t['\u2FCC'] = '\u9EFD';
+ t['\u2FCD'] = '\u9F0E';
+ t['\u2FCE'] = '\u9F13';
+ t['\u2FCF'] = '\u9F20';
+ t['\u2FD0'] = '\u9F3B';
+ t['\u2FD1'] = '\u9F4A';
+ t['\u2FD2'] = '\u9F52';
+ t['\u2FD3'] = '\u9F8D';
+ t['\u2FD4'] = '\u9F9C';
+ t['\u2FD5'] = '\u9FA0';
+ t['\u3036'] = '\u3012';
+ t['\u3038'] = '\u5341';
+ t['\u3039'] = '\u5344';
+ t['\u303A'] = '\u5345';
+ t['\u309B'] = '\u0020\u3099';
+ t['\u309C'] = '\u0020\u309A';
+ t['\u3131'] = '\u1100';
+ t['\u3132'] = '\u1101';
+ t['\u3133'] = '\u11AA';
+ t['\u3134'] = '\u1102';
+ t['\u3135'] = '\u11AC';
+ t['\u3136'] = '\u11AD';
+ t['\u3137'] = '\u1103';
+ t['\u3138'] = '\u1104';
+ t['\u3139'] = '\u1105';
+ t['\u313A'] = '\u11B0';
+ t['\u313B'] = '\u11B1';
+ t['\u313C'] = '\u11B2';
+ t['\u313D'] = '\u11B3';
+ t['\u313E'] = '\u11B4';
+ t['\u313F'] = '\u11B5';
+ t['\u3140'] = '\u111A';
+ t['\u3141'] = '\u1106';
+ t['\u3142'] = '\u1107';
+ t['\u3143'] = '\u1108';
+ t['\u3144'] = '\u1121';
+ t['\u3145'] = '\u1109';
+ t['\u3146'] = '\u110A';
+ t['\u3147'] = '\u110B';
+ t['\u3148'] = '\u110C';
+ t['\u3149'] = '\u110D';
+ t['\u314A'] = '\u110E';
+ t['\u314B'] = '\u110F';
+ t['\u314C'] = '\u1110';
+ t['\u314D'] = '\u1111';
+ t['\u314E'] = '\u1112';
+ t['\u314F'] = '\u1161';
+ t['\u3150'] = '\u1162';
+ t['\u3151'] = '\u1163';
+ t['\u3152'] = '\u1164';
+ t['\u3153'] = '\u1165';
+ t['\u3154'] = '\u1166';
+ t['\u3155'] = '\u1167';
+ t['\u3156'] = '\u1168';
+ t['\u3157'] = '\u1169';
+ t['\u3158'] = '\u116A';
+ t['\u3159'] = '\u116B';
+ t['\u315A'] = '\u116C';
+ t['\u315B'] = '\u116D';
+ t['\u315C'] = '\u116E';
+ t['\u315D'] = '\u116F';
+ t['\u315E'] = '\u1170';
+ t['\u315F'] = '\u1171';
+ t['\u3160'] = '\u1172';
+ t['\u3161'] = '\u1173';
+ t['\u3162'] = '\u1174';
+ t['\u3163'] = '\u1175';
+ t['\u3164'] = '\u1160';
+ t['\u3165'] = '\u1114';
+ t['\u3166'] = '\u1115';
+ t['\u3167'] = '\u11C7';
+ t['\u3168'] = '\u11C8';
+ t['\u3169'] = '\u11CC';
+ t['\u316A'] = '\u11CE';
+ t['\u316B'] = '\u11D3';
+ t['\u316C'] = '\u11D7';
+ t['\u316D'] = '\u11D9';
+ t['\u316E'] = '\u111C';
+ t['\u316F'] = '\u11DD';
+ t['\u3170'] = '\u11DF';
+ t['\u3171'] = '\u111D';
+ t['\u3172'] = '\u111E';
+ t['\u3173'] = '\u1120';
+ t['\u3174'] = '\u1122';
+ t['\u3175'] = '\u1123';
+ t['\u3176'] = '\u1127';
+ t['\u3177'] = '\u1129';
+ t['\u3178'] = '\u112B';
+ t['\u3179'] = '\u112C';
+ t['\u317A'] = '\u112D';
+ t['\u317B'] = '\u112E';
+ t['\u317C'] = '\u112F';
+ t['\u317D'] = '\u1132';
+ t['\u317E'] = '\u1136';
+ t['\u317F'] = '\u1140';
+ t['\u3180'] = '\u1147';
+ t['\u3181'] = '\u114C';
+ t['\u3182'] = '\u11F1';
+ t['\u3183'] = '\u11F2';
+ t['\u3184'] = '\u1157';
+ t['\u3185'] = '\u1158';
+ t['\u3186'] = '\u1159';
+ t['\u3187'] = '\u1184';
+ t['\u3188'] = '\u1185';
+ t['\u3189'] = '\u1188';
+ t['\u318A'] = '\u1191';
+ t['\u318B'] = '\u1192';
+ t['\u318C'] = '\u1194';
+ t['\u318D'] = '\u119E';
+ t['\u318E'] = '\u11A1';
+ t['\u3200'] = '\u0028\u1100\u0029';
+ t['\u3201'] = '\u0028\u1102\u0029';
+ t['\u3202'] = '\u0028\u1103\u0029';
+ t['\u3203'] = '\u0028\u1105\u0029';
+ t['\u3204'] = '\u0028\u1106\u0029';
+ t['\u3205'] = '\u0028\u1107\u0029';
+ t['\u3206'] = '\u0028\u1109\u0029';
+ t['\u3207'] = '\u0028\u110B\u0029';
+ t['\u3208'] = '\u0028\u110C\u0029';
+ t['\u3209'] = '\u0028\u110E\u0029';
+ t['\u320A'] = '\u0028\u110F\u0029';
+ t['\u320B'] = '\u0028\u1110\u0029';
+ t['\u320C'] = '\u0028\u1111\u0029';
+ t['\u320D'] = '\u0028\u1112\u0029';
+ t['\u320E'] = '\u0028\u1100\u1161\u0029';
+ t['\u320F'] = '\u0028\u1102\u1161\u0029';
+ t['\u3210'] = '\u0028\u1103\u1161\u0029';
+ t['\u3211'] = '\u0028\u1105\u1161\u0029';
+ t['\u3212'] = '\u0028\u1106\u1161\u0029';
+ t['\u3213'] = '\u0028\u1107\u1161\u0029';
+ t['\u3214'] = '\u0028\u1109\u1161\u0029';
+ t['\u3215'] = '\u0028\u110B\u1161\u0029';
+ t['\u3216'] = '\u0028\u110C\u1161\u0029';
+ t['\u3217'] = '\u0028\u110E\u1161\u0029';
+ t['\u3218'] = '\u0028\u110F\u1161\u0029';
+ t['\u3219'] = '\u0028\u1110\u1161\u0029';
+ t['\u321A'] = '\u0028\u1111\u1161\u0029';
+ t['\u321B'] = '\u0028\u1112\u1161\u0029';
+ t['\u321C'] = '\u0028\u110C\u116E\u0029';
+ t['\u321D'] = '\u0028\u110B\u1169\u110C\u1165\u11AB\u0029';
+ t['\u321E'] = '\u0028\u110B\u1169\u1112\u116E\u0029';
+ t['\u3220'] = '\u0028\u4E00\u0029';
+ t['\u3221'] = '\u0028\u4E8C\u0029';
+ t['\u3222'] = '\u0028\u4E09\u0029';
+ t['\u3223'] = '\u0028\u56DB\u0029';
+ t['\u3224'] = '\u0028\u4E94\u0029';
+ t['\u3225'] = '\u0028\u516D\u0029';
+ t['\u3226'] = '\u0028\u4E03\u0029';
+ t['\u3227'] = '\u0028\u516B\u0029';
+ t['\u3228'] = '\u0028\u4E5D\u0029';
+ t['\u3229'] = '\u0028\u5341\u0029';
+ t['\u322A'] = '\u0028\u6708\u0029';
+ t['\u322B'] = '\u0028\u706B\u0029';
+ t['\u322C'] = '\u0028\u6C34\u0029';
+ t['\u322D'] = '\u0028\u6728\u0029';
+ t['\u322E'] = '\u0028\u91D1\u0029';
+ t['\u322F'] = '\u0028\u571F\u0029';
+ t['\u3230'] = '\u0028\u65E5\u0029';
+ t['\u3231'] = '\u0028\u682A\u0029';
+ t['\u3232'] = '\u0028\u6709\u0029';
+ t['\u3233'] = '\u0028\u793E\u0029';
+ t['\u3234'] = '\u0028\u540D\u0029';
+ t['\u3235'] = '\u0028\u7279\u0029';
+ t['\u3236'] = '\u0028\u8CA1\u0029';
+ t['\u3237'] = '\u0028\u795D\u0029';
+ t['\u3238'] = '\u0028\u52B4\u0029';
+ t['\u3239'] = '\u0028\u4EE3\u0029';
+ t['\u323A'] = '\u0028\u547C\u0029';
+ t['\u323B'] = '\u0028\u5B66\u0029';
+ t['\u323C'] = '\u0028\u76E3\u0029';
+ t['\u323D'] = '\u0028\u4F01\u0029';
+ t['\u323E'] = '\u0028\u8CC7\u0029';
+ t['\u323F'] = '\u0028\u5354\u0029';
+ t['\u3240'] = '\u0028\u796D\u0029';
+ t['\u3241'] = '\u0028\u4F11\u0029';
+ t['\u3242'] = '\u0028\u81EA\u0029';
+ t['\u3243'] = '\u0028\u81F3\u0029';
+ t['\u32C0'] = '\u0031\u6708';
+ t['\u32C1'] = '\u0032\u6708';
+ t['\u32C2'] = '\u0033\u6708';
+ t['\u32C3'] = '\u0034\u6708';
+ t['\u32C4'] = '\u0035\u6708';
+ t['\u32C5'] = '\u0036\u6708';
+ t['\u32C6'] = '\u0037\u6708';
+ t['\u32C7'] = '\u0038\u6708';
+ t['\u32C8'] = '\u0039\u6708';
+ t['\u32C9'] = '\u0031\u0030\u6708';
+ t['\u32CA'] = '\u0031\u0031\u6708';
+ t['\u32CB'] = '\u0031\u0032\u6708';
+ t['\u3358'] = '\u0030\u70B9';
+ t['\u3359'] = '\u0031\u70B9';
+ t['\u335A'] = '\u0032\u70B9';
+ t['\u335B'] = '\u0033\u70B9';
+ t['\u335C'] = '\u0034\u70B9';
+ t['\u335D'] = '\u0035\u70B9';
+ t['\u335E'] = '\u0036\u70B9';
+ t['\u335F'] = '\u0037\u70B9';
+ t['\u3360'] = '\u0038\u70B9';
+ t['\u3361'] = '\u0039\u70B9';
+ t['\u3362'] = '\u0031\u0030\u70B9';
+ t['\u3363'] = '\u0031\u0031\u70B9';
+ t['\u3364'] = '\u0031\u0032\u70B9';
+ t['\u3365'] = '\u0031\u0033\u70B9';
+ t['\u3366'] = '\u0031\u0034\u70B9';
+ t['\u3367'] = '\u0031\u0035\u70B9';
+ t['\u3368'] = '\u0031\u0036\u70B9';
+ t['\u3369'] = '\u0031\u0037\u70B9';
+ t['\u336A'] = '\u0031\u0038\u70B9';
+ t['\u336B'] = '\u0031\u0039\u70B9';
+ t['\u336C'] = '\u0032\u0030\u70B9';
+ t['\u336D'] = '\u0032\u0031\u70B9';
+ t['\u336E'] = '\u0032\u0032\u70B9';
+ t['\u336F'] = '\u0032\u0033\u70B9';
+ t['\u3370'] = '\u0032\u0034\u70B9';
+ t['\u33E0'] = '\u0031\u65E5';
+ t['\u33E1'] = '\u0032\u65E5';
+ t['\u33E2'] = '\u0033\u65E5';
+ t['\u33E3'] = '\u0034\u65E5';
+ t['\u33E4'] = '\u0035\u65E5';
+ t['\u33E5'] = '\u0036\u65E5';
+ t['\u33E6'] = '\u0037\u65E5';
+ t['\u33E7'] = '\u0038\u65E5';
+ t['\u33E8'] = '\u0039\u65E5';
+ t['\u33E9'] = '\u0031\u0030\u65E5';
+ t['\u33EA'] = '\u0031\u0031\u65E5';
+ t['\u33EB'] = '\u0031\u0032\u65E5';
+ t['\u33EC'] = '\u0031\u0033\u65E5';
+ t['\u33ED'] = '\u0031\u0034\u65E5';
+ t['\u33EE'] = '\u0031\u0035\u65E5';
+ t['\u33EF'] = '\u0031\u0036\u65E5';
+ t['\u33F0'] = '\u0031\u0037\u65E5';
+ t['\u33F1'] = '\u0031\u0038\u65E5';
+ t['\u33F2'] = '\u0031\u0039\u65E5';
+ t['\u33F3'] = '\u0032\u0030\u65E5';
+ t['\u33F4'] = '\u0032\u0031\u65E5';
+ t['\u33F5'] = '\u0032\u0032\u65E5';
+ t['\u33F6'] = '\u0032\u0033\u65E5';
+ t['\u33F7'] = '\u0032\u0034\u65E5';
+ t['\u33F8'] = '\u0032\u0035\u65E5';
+ t['\u33F9'] = '\u0032\u0036\u65E5';
+ t['\u33FA'] = '\u0032\u0037\u65E5';
+ t['\u33FB'] = '\u0032\u0038\u65E5';
+ t['\u33FC'] = '\u0032\u0039\u65E5';
+ t['\u33FD'] = '\u0033\u0030\u65E5';
+ t['\u33FE'] = '\u0033\u0031\u65E5';
+ t['\uFB00'] = '\u0066\u0066';
+ t['\uFB01'] = '\u0066\u0069';
+ t['\uFB02'] = '\u0066\u006C';
+ t['\uFB03'] = '\u0066\u0066\u0069';
+ t['\uFB04'] = '\u0066\u0066\u006C';
+ t['\uFB05'] = '\u017F\u0074';
+ t['\uFB06'] = '\u0073\u0074';
+ t['\uFB13'] = '\u0574\u0576';
+ t['\uFB14'] = '\u0574\u0565';
+ t['\uFB15'] = '\u0574\u056B';
+ t['\uFB16'] = '\u057E\u0576';
+ t['\uFB17'] = '\u0574\u056D';
+ t['\uFB4F'] = '\u05D0\u05DC';
+ t['\uFB50'] = '\u0671';
+ t['\uFB51'] = '\u0671';
+ t['\uFB52'] = '\u067B';
+ t['\uFB53'] = '\u067B';
+ t['\uFB54'] = '\u067B';
+ t['\uFB55'] = '\u067B';
+ t['\uFB56'] = '\u067E';
+ t['\uFB57'] = '\u067E';
+ t['\uFB58'] = '\u067E';
+ t['\uFB59'] = '\u067E';
+ t['\uFB5A'] = '\u0680';
+ t['\uFB5B'] = '\u0680';
+ t['\uFB5C'] = '\u0680';
+ t['\uFB5D'] = '\u0680';
+ t['\uFB5E'] = '\u067A';
+ t['\uFB5F'] = '\u067A';
+ t['\uFB60'] = '\u067A';
+ t['\uFB61'] = '\u067A';
+ t['\uFB62'] = '\u067F';
+ t['\uFB63'] = '\u067F';
+ t['\uFB64'] = '\u067F';
+ t['\uFB65'] = '\u067F';
+ t['\uFB66'] = '\u0679';
+ t['\uFB67'] = '\u0679';
+ t['\uFB68'] = '\u0679';
+ t['\uFB69'] = '\u0679';
+ t['\uFB6A'] = '\u06A4';
+ t['\uFB6B'] = '\u06A4';
+ t['\uFB6C'] = '\u06A4';
+ t['\uFB6D'] = '\u06A4';
+ t['\uFB6E'] = '\u06A6';
+ t['\uFB6F'] = '\u06A6';
+ t['\uFB70'] = '\u06A6';
+ t['\uFB71'] = '\u06A6';
+ t['\uFB72'] = '\u0684';
+ t['\uFB73'] = '\u0684';
+ t['\uFB74'] = '\u0684';
+ t['\uFB75'] = '\u0684';
+ t['\uFB76'] = '\u0683';
+ t['\uFB77'] = '\u0683';
+ t['\uFB78'] = '\u0683';
+ t['\uFB79'] = '\u0683';
+ t['\uFB7A'] = '\u0686';
+ t['\uFB7B'] = '\u0686';
+ t['\uFB7C'] = '\u0686';
+ t['\uFB7D'] = '\u0686';
+ t['\uFB7E'] = '\u0687';
+ t['\uFB7F'] = '\u0687';
+ t['\uFB80'] = '\u0687';
+ t['\uFB81'] = '\u0687';
+ t['\uFB82'] = '\u068D';
+ t['\uFB83'] = '\u068D';
+ t['\uFB84'] = '\u068C';
+ t['\uFB85'] = '\u068C';
+ t['\uFB86'] = '\u068E';
+ t['\uFB87'] = '\u068E';
+ t['\uFB88'] = '\u0688';
+ t['\uFB89'] = '\u0688';
+ t['\uFB8A'] = '\u0698';
+ t['\uFB8B'] = '\u0698';
+ t['\uFB8C'] = '\u0691';
+ t['\uFB8D'] = '\u0691';
+ t['\uFB8E'] = '\u06A9';
+ t['\uFB8F'] = '\u06A9';
+ t['\uFB90'] = '\u06A9';
+ t['\uFB91'] = '\u06A9';
+ t['\uFB92'] = '\u06AF';
+ t['\uFB93'] = '\u06AF';
+ t['\uFB94'] = '\u06AF';
+ t['\uFB95'] = '\u06AF';
+ t['\uFB96'] = '\u06B3';
+ t['\uFB97'] = '\u06B3';
+ t['\uFB98'] = '\u06B3';
+ t['\uFB99'] = '\u06B3';
+ t['\uFB9A'] = '\u06B1';
+ t['\uFB9B'] = '\u06B1';
+ t['\uFB9C'] = '\u06B1';
+ t['\uFB9D'] = '\u06B1';
+ t['\uFB9E'] = '\u06BA';
+ t['\uFB9F'] = '\u06BA';
+ t['\uFBA0'] = '\u06BB';
+ t['\uFBA1'] = '\u06BB';
+ t['\uFBA2'] = '\u06BB';
+ t['\uFBA3'] = '\u06BB';
+ t['\uFBA4'] = '\u06C0';
+ t['\uFBA5'] = '\u06C0';
+ t['\uFBA6'] = '\u06C1';
+ t['\uFBA7'] = '\u06C1';
+ t['\uFBA8'] = '\u06C1';
+ t['\uFBA9'] = '\u06C1';
+ t['\uFBAA'] = '\u06BE';
+ t['\uFBAB'] = '\u06BE';
+ t['\uFBAC'] = '\u06BE';
+ t['\uFBAD'] = '\u06BE';
+ t['\uFBAE'] = '\u06D2';
+ t['\uFBAF'] = '\u06D2';
+ t['\uFBB0'] = '\u06D3';
+ t['\uFBB1'] = '\u06D3';
+ t['\uFBD3'] = '\u06AD';
+ t['\uFBD4'] = '\u06AD';
+ t['\uFBD5'] = '\u06AD';
+ t['\uFBD6'] = '\u06AD';
+ t['\uFBD7'] = '\u06C7';
+ t['\uFBD8'] = '\u06C7';
+ t['\uFBD9'] = '\u06C6';
+ t['\uFBDA'] = '\u06C6';
+ t['\uFBDB'] = '\u06C8';
+ t['\uFBDC'] = '\u06C8';
+ t['\uFBDD'] = '\u0677';
+ t['\uFBDE'] = '\u06CB';
+ t['\uFBDF'] = '\u06CB';
+ t['\uFBE0'] = '\u06C5';
+ t['\uFBE1'] = '\u06C5';
+ t['\uFBE2'] = '\u06C9';
+ t['\uFBE3'] = '\u06C9';
+ t['\uFBE4'] = '\u06D0';
+ t['\uFBE5'] = '\u06D0';
+ t['\uFBE6'] = '\u06D0';
+ t['\uFBE7'] = '\u06D0';
+ t['\uFBE8'] = '\u0649';
+ t['\uFBE9'] = '\u0649';
+ t['\uFBEA'] = '\u0626\u0627';
+ t['\uFBEB'] = '\u0626\u0627';
+ t['\uFBEC'] = '\u0626\u06D5';
+ t['\uFBED'] = '\u0626\u06D5';
+ t['\uFBEE'] = '\u0626\u0648';
+ t['\uFBEF'] = '\u0626\u0648';
+ t['\uFBF0'] = '\u0626\u06C7';
+ t['\uFBF1'] = '\u0626\u06C7';
+ t['\uFBF2'] = '\u0626\u06C6';
+ t['\uFBF3'] = '\u0626\u06C6';
+ t['\uFBF4'] = '\u0626\u06C8';
+ t['\uFBF5'] = '\u0626\u06C8';
+ t['\uFBF6'] = '\u0626\u06D0';
+ t['\uFBF7'] = '\u0626\u06D0';
+ t['\uFBF8'] = '\u0626\u06D0';
+ t['\uFBF9'] = '\u0626\u0649';
+ t['\uFBFA'] = '\u0626\u0649';
+ t['\uFBFB'] = '\u0626\u0649';
+ t['\uFBFC'] = '\u06CC';
+ t['\uFBFD'] = '\u06CC';
+ t['\uFBFE'] = '\u06CC';
+ t['\uFBFF'] = '\u06CC';
+ t['\uFC00'] = '\u0626\u062C';
+ t['\uFC01'] = '\u0626\u062D';
+ t['\uFC02'] = '\u0626\u0645';
+ t['\uFC03'] = '\u0626\u0649';
+ t['\uFC04'] = '\u0626\u064A';
+ t['\uFC05'] = '\u0628\u062C';
+ t['\uFC06'] = '\u0628\u062D';
+ t['\uFC07'] = '\u0628\u062E';
+ t['\uFC08'] = '\u0628\u0645';
+ t['\uFC09'] = '\u0628\u0649';
+ t['\uFC0A'] = '\u0628\u064A';
+ t['\uFC0B'] = '\u062A\u062C';
+ t['\uFC0C'] = '\u062A\u062D';
+ t['\uFC0D'] = '\u062A\u062E';
+ t['\uFC0E'] = '\u062A\u0645';
+ t['\uFC0F'] = '\u062A\u0649';
+ t['\uFC10'] = '\u062A\u064A';
+ t['\uFC11'] = '\u062B\u062C';
+ t['\uFC12'] = '\u062B\u0645';
+ t['\uFC13'] = '\u062B\u0649';
+ t['\uFC14'] = '\u062B\u064A';
+ t['\uFC15'] = '\u062C\u062D';
+ t['\uFC16'] = '\u062C\u0645';
+ t['\uFC17'] = '\u062D\u062C';
+ t['\uFC18'] = '\u062D\u0645';
+ t['\uFC19'] = '\u062E\u062C';
+ t['\uFC1A'] = '\u062E\u062D';
+ t['\uFC1B'] = '\u062E\u0645';
+ t['\uFC1C'] = '\u0633\u062C';
+ t['\uFC1D'] = '\u0633\u062D';
+ t['\uFC1E'] = '\u0633\u062E';
+ t['\uFC1F'] = '\u0633\u0645';
+ t['\uFC20'] = '\u0635\u062D';
+ t['\uFC21'] = '\u0635\u0645';
+ t['\uFC22'] = '\u0636\u062C';
+ t['\uFC23'] = '\u0636\u062D';
+ t['\uFC24'] = '\u0636\u062E';
+ t['\uFC25'] = '\u0636\u0645';
+ t['\uFC26'] = '\u0637\u062D';
+ t['\uFC27'] = '\u0637\u0645';
+ t['\uFC28'] = '\u0638\u0645';
+ t['\uFC29'] = '\u0639\u062C';
+ t['\uFC2A'] = '\u0639\u0645';
+ t['\uFC2B'] = '\u063A\u062C';
+ t['\uFC2C'] = '\u063A\u0645';
+ t['\uFC2D'] = '\u0641\u062C';
+ t['\uFC2E'] = '\u0641\u062D';
+ t['\uFC2F'] = '\u0641\u062E';
+ t['\uFC30'] = '\u0641\u0645';
+ t['\uFC31'] = '\u0641\u0649';
+ t['\uFC32'] = '\u0641\u064A';
+ t['\uFC33'] = '\u0642\u062D';
+ t['\uFC34'] = '\u0642\u0645';
+ t['\uFC35'] = '\u0642\u0649';
+ t['\uFC36'] = '\u0642\u064A';
+ t['\uFC37'] = '\u0643\u0627';
+ t['\uFC38'] = '\u0643\u062C';
+ t['\uFC39'] = '\u0643\u062D';
+ t['\uFC3A'] = '\u0643\u062E';
+ t['\uFC3B'] = '\u0643\u0644';
+ t['\uFC3C'] = '\u0643\u0645';
+ t['\uFC3D'] = '\u0643\u0649';
+ t['\uFC3E'] = '\u0643\u064A';
+ t['\uFC3F'] = '\u0644\u062C';
+ t['\uFC40'] = '\u0644\u062D';
+ t['\uFC41'] = '\u0644\u062E';
+ t['\uFC42'] = '\u0644\u0645';
+ t['\uFC43'] = '\u0644\u0649';
+ t['\uFC44'] = '\u0644\u064A';
+ t['\uFC45'] = '\u0645\u062C';
+ t['\uFC46'] = '\u0645\u062D';
+ t['\uFC47'] = '\u0645\u062E';
+ t['\uFC48'] = '\u0645\u0645';
+ t['\uFC49'] = '\u0645\u0649';
+ t['\uFC4A'] = '\u0645\u064A';
+ t['\uFC4B'] = '\u0646\u062C';
+ t['\uFC4C'] = '\u0646\u062D';
+ t['\uFC4D'] = '\u0646\u062E';
+ t['\uFC4E'] = '\u0646\u0645';
+ t['\uFC4F'] = '\u0646\u0649';
+ t['\uFC50'] = '\u0646\u064A';
+ t['\uFC51'] = '\u0647\u062C';
+ t['\uFC52'] = '\u0647\u0645';
+ t['\uFC53'] = '\u0647\u0649';
+ t['\uFC54'] = '\u0647\u064A';
+ t['\uFC55'] = '\u064A\u062C';
+ t['\uFC56'] = '\u064A\u062D';
+ t['\uFC57'] = '\u064A\u062E';
+ t['\uFC58'] = '\u064A\u0645';
+ t['\uFC59'] = '\u064A\u0649';
+ t['\uFC5A'] = '\u064A\u064A';
+ t['\uFC5B'] = '\u0630\u0670';
+ t['\uFC5C'] = '\u0631\u0670';
+ t['\uFC5D'] = '\u0649\u0670';
+ t['\uFC5E'] = '\u0020\u064C\u0651';
+ t['\uFC5F'] = '\u0020\u064D\u0651';
+ t['\uFC60'] = '\u0020\u064E\u0651';
+ t['\uFC61'] = '\u0020\u064F\u0651';
+ t['\uFC62'] = '\u0020\u0650\u0651';
+ t['\uFC63'] = '\u0020\u0651\u0670';
+ t['\uFC64'] = '\u0626\u0631';
+ t['\uFC65'] = '\u0626\u0632';
+ t['\uFC66'] = '\u0626\u0645';
+ t['\uFC67'] = '\u0626\u0646';
+ t['\uFC68'] = '\u0626\u0649';
+ t['\uFC69'] = '\u0626\u064A';
+ t['\uFC6A'] = '\u0628\u0631';
+ t['\uFC6B'] = '\u0628\u0632';
+ t['\uFC6C'] = '\u0628\u0645';
+ t['\uFC6D'] = '\u0628\u0646';
+ t['\uFC6E'] = '\u0628\u0649';
+ t['\uFC6F'] = '\u0628\u064A';
+ t['\uFC70'] = '\u062A\u0631';
+ t['\uFC71'] = '\u062A\u0632';
+ t['\uFC72'] = '\u062A\u0645';
+ t['\uFC73'] = '\u062A\u0646';
+ t['\uFC74'] = '\u062A\u0649';
+ t['\uFC75'] = '\u062A\u064A';
+ t['\uFC76'] = '\u062B\u0631';
+ t['\uFC77'] = '\u062B\u0632';
+ t['\uFC78'] = '\u062B\u0645';
+ t['\uFC79'] = '\u062B\u0646';
+ t['\uFC7A'] = '\u062B\u0649';
+ t['\uFC7B'] = '\u062B\u064A';
+ t['\uFC7C'] = '\u0641\u0649';
+ t['\uFC7D'] = '\u0641\u064A';
+ t['\uFC7E'] = '\u0642\u0649';
+ t['\uFC7F'] = '\u0642\u064A';
+ t['\uFC80'] = '\u0643\u0627';
+ t['\uFC81'] = '\u0643\u0644';
+ t['\uFC82'] = '\u0643\u0645';
+ t['\uFC83'] = '\u0643\u0649';
+ t['\uFC84'] = '\u0643\u064A';
+ t['\uFC85'] = '\u0644\u0645';
+ t['\uFC86'] = '\u0644\u0649';
+ t['\uFC87'] = '\u0644\u064A';
+ t['\uFC88'] = '\u0645\u0627';
+ t['\uFC89'] = '\u0645\u0645';
+ t['\uFC8A'] = '\u0646\u0631';
+ t['\uFC8B'] = '\u0646\u0632';
+ t['\uFC8C'] = '\u0646\u0645';
+ t['\uFC8D'] = '\u0646\u0646';
+ t['\uFC8E'] = '\u0646\u0649';
+ t['\uFC8F'] = '\u0646\u064A';
+ t['\uFC90'] = '\u0649\u0670';
+ t['\uFC91'] = '\u064A\u0631';
+ t['\uFC92'] = '\u064A\u0632';
+ t['\uFC93'] = '\u064A\u0645';
+ t['\uFC94'] = '\u064A\u0646';
+ t['\uFC95'] = '\u064A\u0649';
+ t['\uFC96'] = '\u064A\u064A';
+ t['\uFC97'] = '\u0626\u062C';
+ t['\uFC98'] = '\u0626\u062D';
+ t['\uFC99'] = '\u0626\u062E';
+ t['\uFC9A'] = '\u0626\u0645';
+ t['\uFC9B'] = '\u0626\u0647';
+ t['\uFC9C'] = '\u0628\u062C';
+ t['\uFC9D'] = '\u0628\u062D';
+ t['\uFC9E'] = '\u0628\u062E';
+ t['\uFC9F'] = '\u0628\u0645';
+ t['\uFCA0'] = '\u0628\u0647';
+ t['\uFCA1'] = '\u062A\u062C';
+ t['\uFCA2'] = '\u062A\u062D';
+ t['\uFCA3'] = '\u062A\u062E';
+ t['\uFCA4'] = '\u062A\u0645';
+ t['\uFCA5'] = '\u062A\u0647';
+ t['\uFCA6'] = '\u062B\u0645';
+ t['\uFCA7'] = '\u062C\u062D';
+ t['\uFCA8'] = '\u062C\u0645';
+ t['\uFCA9'] = '\u062D\u062C';
+ t['\uFCAA'] = '\u062D\u0645';
+ t['\uFCAB'] = '\u062E\u062C';
+ t['\uFCAC'] = '\u062E\u0645';
+ t['\uFCAD'] = '\u0633\u062C';
+ t['\uFCAE'] = '\u0633\u062D';
+ t['\uFCAF'] = '\u0633\u062E';
+ t['\uFCB0'] = '\u0633\u0645';
+ t['\uFCB1'] = '\u0635\u062D';
+ t['\uFCB2'] = '\u0635\u062E';
+ t['\uFCB3'] = '\u0635\u0645';
+ t['\uFCB4'] = '\u0636\u062C';
+ t['\uFCB5'] = '\u0636\u062D';
+ t['\uFCB6'] = '\u0636\u062E';
+ t['\uFCB7'] = '\u0636\u0645';
+ t['\uFCB8'] = '\u0637\u062D';
+ t['\uFCB9'] = '\u0638\u0645';
+ t['\uFCBA'] = '\u0639\u062C';
+ t['\uFCBB'] = '\u0639\u0645';
+ t['\uFCBC'] = '\u063A\u062C';
+ t['\uFCBD'] = '\u063A\u0645';
+ t['\uFCBE'] = '\u0641\u062C';
+ t['\uFCBF'] = '\u0641\u062D';
+ t['\uFCC0'] = '\u0641\u062E';
+ t['\uFCC1'] = '\u0641\u0645';
+ t['\uFCC2'] = '\u0642\u062D';
+ t['\uFCC3'] = '\u0642\u0645';
+ t['\uFCC4'] = '\u0643\u062C';
+ t['\uFCC5'] = '\u0643\u062D';
+ t['\uFCC6'] = '\u0643\u062E';
+ t['\uFCC7'] = '\u0643\u0644';
+ t['\uFCC8'] = '\u0643\u0645';
+ t['\uFCC9'] = '\u0644\u062C';
+ t['\uFCCA'] = '\u0644\u062D';
+ t['\uFCCB'] = '\u0644\u062E';
+ t['\uFCCC'] = '\u0644\u0645';
+ t['\uFCCD'] = '\u0644\u0647';
+ t['\uFCCE'] = '\u0645\u062C';
+ t['\uFCCF'] = '\u0645\u062D';
+ t['\uFCD0'] = '\u0645\u062E';
+ t['\uFCD1'] = '\u0645\u0645';
+ t['\uFCD2'] = '\u0646\u062C';
+ t['\uFCD3'] = '\u0646\u062D';
+ t['\uFCD4'] = '\u0646\u062E';
+ t['\uFCD5'] = '\u0646\u0645';
+ t['\uFCD6'] = '\u0646\u0647';
+ t['\uFCD7'] = '\u0647\u062C';
+ t['\uFCD8'] = '\u0647\u0645';
+ t['\uFCD9'] = '\u0647\u0670';
+ t['\uFCDA'] = '\u064A\u062C';
+ t['\uFCDB'] = '\u064A\u062D';
+ t['\uFCDC'] = '\u064A\u062E';
+ t['\uFCDD'] = '\u064A\u0645';
+ t['\uFCDE'] = '\u064A\u0647';
+ t['\uFCDF'] = '\u0626\u0645';
+ t['\uFCE0'] = '\u0626\u0647';
+ t['\uFCE1'] = '\u0628\u0645';
+ t['\uFCE2'] = '\u0628\u0647';
+ t['\uFCE3'] = '\u062A\u0645';
+ t['\uFCE4'] = '\u062A\u0647';
+ t['\uFCE5'] = '\u062B\u0645';
+ t['\uFCE6'] = '\u062B\u0647';
+ t['\uFCE7'] = '\u0633\u0645';
+ t['\uFCE8'] = '\u0633\u0647';
+ t['\uFCE9'] = '\u0634\u0645';
+ t['\uFCEA'] = '\u0634\u0647';
+ t['\uFCEB'] = '\u0643\u0644';
+ t['\uFCEC'] = '\u0643\u0645';
+ t['\uFCED'] = '\u0644\u0645';
+ t['\uFCEE'] = '\u0646\u0645';
+ t['\uFCEF'] = '\u0646\u0647';
+ t['\uFCF0'] = '\u064A\u0645';
+ t['\uFCF1'] = '\u064A\u0647';
+ t['\uFCF2'] = '\u0640\u064E\u0651';
+ t['\uFCF3'] = '\u0640\u064F\u0651';
+ t['\uFCF4'] = '\u0640\u0650\u0651';
+ t['\uFCF5'] = '\u0637\u0649';
+ t['\uFCF6'] = '\u0637\u064A';
+ t['\uFCF7'] = '\u0639\u0649';
+ t['\uFCF8'] = '\u0639\u064A';
+ t['\uFCF9'] = '\u063A\u0649';
+ t['\uFCFA'] = '\u063A\u064A';
+ t['\uFCFB'] = '\u0633\u0649';
+ t['\uFCFC'] = '\u0633\u064A';
+ t['\uFCFD'] = '\u0634\u0649';
+ t['\uFCFE'] = '\u0634\u064A';
+ t['\uFCFF'] = '\u062D\u0649';
+ t['\uFD00'] = '\u062D\u064A';
+ t['\uFD01'] = '\u062C\u0649';
+ t['\uFD02'] = '\u062C\u064A';
+ t['\uFD03'] = '\u062E\u0649';
+ t['\uFD04'] = '\u062E\u064A';
+ t['\uFD05'] = '\u0635\u0649';
+ t['\uFD06'] = '\u0635\u064A';
+ t['\uFD07'] = '\u0636\u0649';
+ t['\uFD08'] = '\u0636\u064A';
+ t['\uFD09'] = '\u0634\u062C';
+ t['\uFD0A'] = '\u0634\u062D';
+ t['\uFD0B'] = '\u0634\u062E';
+ t['\uFD0C'] = '\u0634\u0645';
+ t['\uFD0D'] = '\u0634\u0631';
+ t['\uFD0E'] = '\u0633\u0631';
+ t['\uFD0F'] = '\u0635\u0631';
+ t['\uFD10'] = '\u0636\u0631';
+ t['\uFD11'] = '\u0637\u0649';
+ t['\uFD12'] = '\u0637\u064A';
+ t['\uFD13'] = '\u0639\u0649';
+ t['\uFD14'] = '\u0639\u064A';
+ t['\uFD15'] = '\u063A\u0649';
+ t['\uFD16'] = '\u063A\u064A';
+ t['\uFD17'] = '\u0633\u0649';
+ t['\uFD18'] = '\u0633\u064A';
+ t['\uFD19'] = '\u0634\u0649';
+ t['\uFD1A'] = '\u0634\u064A';
+ t['\uFD1B'] = '\u062D\u0649';
+ t['\uFD1C'] = '\u062D\u064A';
+ t['\uFD1D'] = '\u062C\u0649';
+ t['\uFD1E'] = '\u062C\u064A';
+ t['\uFD1F'] = '\u062E\u0649';
+ t['\uFD20'] = '\u062E\u064A';
+ t['\uFD21'] = '\u0635\u0649';
+ t['\uFD22'] = '\u0635\u064A';
+ t['\uFD23'] = '\u0636\u0649';
+ t['\uFD24'] = '\u0636\u064A';
+ t['\uFD25'] = '\u0634\u062C';
+ t['\uFD26'] = '\u0634\u062D';
+ t['\uFD27'] = '\u0634\u062E';
+ t['\uFD28'] = '\u0634\u0645';
+ t['\uFD29'] = '\u0634\u0631';
+ t['\uFD2A'] = '\u0633\u0631';
+ t['\uFD2B'] = '\u0635\u0631';
+ t['\uFD2C'] = '\u0636\u0631';
+ t['\uFD2D'] = '\u0634\u062C';
+ t['\uFD2E'] = '\u0634\u062D';
+ t['\uFD2F'] = '\u0634\u062E';
+ t['\uFD30'] = '\u0634\u0645';
+ t['\uFD31'] = '\u0633\u0647';
+ t['\uFD32'] = '\u0634\u0647';
+ t['\uFD33'] = '\u0637\u0645';
+ t['\uFD34'] = '\u0633\u062C';
+ t['\uFD35'] = '\u0633\u062D';
+ t['\uFD36'] = '\u0633\u062E';
+ t['\uFD37'] = '\u0634\u062C';
+ t['\uFD38'] = '\u0634\u062D';
+ t['\uFD39'] = '\u0634\u062E';
+ t['\uFD3A'] = '\u0637\u0645';
+ t['\uFD3B'] = '\u0638\u0645';
+ t['\uFD3C'] = '\u0627\u064B';
+ t['\uFD3D'] = '\u0627\u064B';
+ t['\uFD50'] = '\u062A\u062C\u0645';
+ t['\uFD51'] = '\u062A\u062D\u062C';
+ t['\uFD52'] = '\u062A\u062D\u062C';
+ t['\uFD53'] = '\u062A\u062D\u0645';
+ t['\uFD54'] = '\u062A\u062E\u0645';
+ t['\uFD55'] = '\u062A\u0645\u062C';
+ t['\uFD56'] = '\u062A\u0645\u062D';
+ t['\uFD57'] = '\u062A\u0645\u062E';
+ t['\uFD58'] = '\u062C\u0645\u062D';
+ t['\uFD59'] = '\u062C\u0645\u062D';
+ t['\uFD5A'] = '\u062D\u0645\u064A';
+ t['\uFD5B'] = '\u062D\u0645\u0649';
+ t['\uFD5C'] = '\u0633\u062D\u062C';
+ t['\uFD5D'] = '\u0633\u062C\u062D';
+ t['\uFD5E'] = '\u0633\u062C\u0649';
+ t['\uFD5F'] = '\u0633\u0645\u062D';
+ t['\uFD60'] = '\u0633\u0645\u062D';
+ t['\uFD61'] = '\u0633\u0645\u062C';
+ t['\uFD62'] = '\u0633\u0645\u0645';
+ t['\uFD63'] = '\u0633\u0645\u0645';
+ t['\uFD64'] = '\u0635\u062D\u062D';
+ t['\uFD65'] = '\u0635\u062D\u062D';
+ t['\uFD66'] = '\u0635\u0645\u0645';
+ t['\uFD67'] = '\u0634\u062D\u0645';
+ t['\uFD68'] = '\u0634\u062D\u0645';
+ t['\uFD69'] = '\u0634\u062C\u064A';
+ t['\uFD6A'] = '\u0634\u0645\u062E';
+ t['\uFD6B'] = '\u0634\u0645\u062E';
+ t['\uFD6C'] = '\u0634\u0645\u0645';
+ t['\uFD6D'] = '\u0634\u0645\u0645';
+ t['\uFD6E'] = '\u0636\u062D\u0649';
+ t['\uFD6F'] = '\u0636\u062E\u0645';
+ t['\uFD70'] = '\u0636\u062E\u0645';
+ t['\uFD71'] = '\u0637\u0645\u062D';
+ t['\uFD72'] = '\u0637\u0645\u062D';
+ t['\uFD73'] = '\u0637\u0645\u0645';
+ t['\uFD74'] = '\u0637\u0645\u064A';
+ t['\uFD75'] = '\u0639\u062C\u0645';
+ t['\uFD76'] = '\u0639\u0645\u0645';
+ t['\uFD77'] = '\u0639\u0645\u0645';
+ t['\uFD78'] = '\u0639\u0645\u0649';
+ t['\uFD79'] = '\u063A\u0645\u0645';
+ t['\uFD7A'] = '\u063A\u0645\u064A';
+ t['\uFD7B'] = '\u063A\u0645\u0649';
+ t['\uFD7C'] = '\u0641\u062E\u0645';
+ t['\uFD7D'] = '\u0641\u062E\u0645';
+ t['\uFD7E'] = '\u0642\u0645\u062D';
+ t['\uFD7F'] = '\u0642\u0645\u0645';
+ t['\uFD80'] = '\u0644\u062D\u0645';
+ t['\uFD81'] = '\u0644\u062D\u064A';
+ t['\uFD82'] = '\u0644\u062D\u0649';
+ t['\uFD83'] = '\u0644\u062C\u062C';
+ t['\uFD84'] = '\u0644\u062C\u062C';
+ t['\uFD85'] = '\u0644\u062E\u0645';
+ t['\uFD86'] = '\u0644\u062E\u0645';
+ t['\uFD87'] = '\u0644\u0645\u062D';
+ t['\uFD88'] = '\u0644\u0645\u062D';
+ t['\uFD89'] = '\u0645\u062D\u062C';
+ t['\uFD8A'] = '\u0645\u062D\u0645';
+ t['\uFD8B'] = '\u0645\u062D\u064A';
+ t['\uFD8C'] = '\u0645\u062C\u062D';
+ t['\uFD8D'] = '\u0645\u062C\u0645';
+ t['\uFD8E'] = '\u0645\u062E\u062C';
+ t['\uFD8F'] = '\u0645\u062E\u0645';
+ t['\uFD92'] = '\u0645\u062C\u062E';
+ t['\uFD93'] = '\u0647\u0645\u062C';
+ t['\uFD94'] = '\u0647\u0645\u0645';
+ t['\uFD95'] = '\u0646\u062D\u0645';
+ t['\uFD96'] = '\u0646\u062D\u0649';
+ t['\uFD97'] = '\u0646\u062C\u0645';
+ t['\uFD98'] = '\u0646\u062C\u0645';
+ t['\uFD99'] = '\u0646\u062C\u0649';
+ t['\uFD9A'] = '\u0646\u0645\u064A';
+ t['\uFD9B'] = '\u0646\u0645\u0649';
+ t['\uFD9C'] = '\u064A\u0645\u0645';
+ t['\uFD9D'] = '\u064A\u0645\u0645';
+ t['\uFD9E'] = '\u0628\u062E\u064A';
+ t['\uFD9F'] = '\u062A\u062C\u064A';
+ t['\uFDA0'] = '\u062A\u062C\u0649';
+ t['\uFDA1'] = '\u062A\u062E\u064A';
+ t['\uFDA2'] = '\u062A\u062E\u0649';
+ t['\uFDA3'] = '\u062A\u0645\u064A';
+ t['\uFDA4'] = '\u062A\u0645\u0649';
+ t['\uFDA5'] = '\u062C\u0645\u064A';
+ t['\uFDA6'] = '\u062C\u062D\u0649';
+ t['\uFDA7'] = '\u062C\u0645\u0649';
+ t['\uFDA8'] = '\u0633\u062E\u0649';
+ t['\uFDA9'] = '\u0635\u062D\u064A';
+ t['\uFDAA'] = '\u0634\u062D\u064A';
+ t['\uFDAB'] = '\u0636\u062D\u064A';
+ t['\uFDAC'] = '\u0644\u062C\u064A';
+ t['\uFDAD'] = '\u0644\u0645\u064A';
+ t['\uFDAE'] = '\u064A\u062D\u064A';
+ t['\uFDAF'] = '\u064A\u062C\u064A';
+ t['\uFDB0'] = '\u064A\u0645\u064A';
+ t['\uFDB1'] = '\u0645\u0645\u064A';
+ t['\uFDB2'] = '\u0642\u0645\u064A';
+ t['\uFDB3'] = '\u0646\u062D\u064A';
+ t['\uFDB4'] = '\u0642\u0645\u062D';
+ t['\uFDB5'] = '\u0644\u062D\u0645';
+ t['\uFDB6'] = '\u0639\u0645\u064A';
+ t['\uFDB7'] = '\u0643\u0645\u064A';
+ t['\uFDB8'] = '\u0646\u062C\u062D';
+ t['\uFDB9'] = '\u0645\u062E\u064A';
+ t['\uFDBA'] = '\u0644\u062C\u0645';
+ t['\uFDBB'] = '\u0643\u0645\u0645';
+ t['\uFDBC'] = '\u0644\u062C\u0645';
+ t['\uFDBD'] = '\u0646\u062C\u062D';
+ t['\uFDBE'] = '\u062C\u062D\u064A';
+ t['\uFDBF'] = '\u062D\u062C\u064A';
+ t['\uFDC0'] = '\u0645\u062C\u064A';
+ t['\uFDC1'] = '\u0641\u0645\u064A';
+ t['\uFDC2'] = '\u0628\u062D\u064A';
+ t['\uFDC3'] = '\u0643\u0645\u0645';
+ t['\uFDC4'] = '\u0639\u062C\u0645';
+ t['\uFDC5'] = '\u0635\u0645\u0645';
+ t['\uFDC6'] = '\u0633\u062E\u064A';
+ t['\uFDC7'] = '\u0646\u062C\u064A';
+ t['\uFE49'] = '\u203E';
+ t['\uFE4A'] = '\u203E';
+ t['\uFE4B'] = '\u203E';
+ t['\uFE4C'] = '\u203E';
+ t['\uFE4D'] = '\u005F';
+ t['\uFE4E'] = '\u005F';
+ t['\uFE4F'] = '\u005F';
+ t['\uFE80'] = '\u0621';
+ t['\uFE81'] = '\u0622';
+ t['\uFE82'] = '\u0622';
+ t['\uFE83'] = '\u0623';
+ t['\uFE84'] = '\u0623';
+ t['\uFE85'] = '\u0624';
+ t['\uFE86'] = '\u0624';
+ t['\uFE87'] = '\u0625';
+ t['\uFE88'] = '\u0625';
+ t['\uFE89'] = '\u0626';
+ t['\uFE8A'] = '\u0626';
+ t['\uFE8B'] = '\u0626';
+ t['\uFE8C'] = '\u0626';
+ t['\uFE8D'] = '\u0627';
+ t['\uFE8E'] = '\u0627';
+ t['\uFE8F'] = '\u0628';
+ t['\uFE90'] = '\u0628';
+ t['\uFE91'] = '\u0628';
+ t['\uFE92'] = '\u0628';
+ t['\uFE93'] = '\u0629';
+ t['\uFE94'] = '\u0629';
+ t['\uFE95'] = '\u062A';
+ t['\uFE96'] = '\u062A';
+ t['\uFE97'] = '\u062A';
+ t['\uFE98'] = '\u062A';
+ t['\uFE99'] = '\u062B';
+ t['\uFE9A'] = '\u062B';
+ t['\uFE9B'] = '\u062B';
+ t['\uFE9C'] = '\u062B';
+ t['\uFE9D'] = '\u062C';
+ t['\uFE9E'] = '\u062C';
+ t['\uFE9F'] = '\u062C';
+ t['\uFEA0'] = '\u062C';
+ t['\uFEA1'] = '\u062D';
+ t['\uFEA2'] = '\u062D';
+ t['\uFEA3'] = '\u062D';
+ t['\uFEA4'] = '\u062D';
+ t['\uFEA5'] = '\u062E';
+ t['\uFEA6'] = '\u062E';
+ t['\uFEA7'] = '\u062E';
+ t['\uFEA8'] = '\u062E';
+ t['\uFEA9'] = '\u062F';
+ t['\uFEAA'] = '\u062F';
+ t['\uFEAB'] = '\u0630';
+ t['\uFEAC'] = '\u0630';
+ t['\uFEAD'] = '\u0631';
+ t['\uFEAE'] = '\u0631';
+ t['\uFEAF'] = '\u0632';
+ t['\uFEB0'] = '\u0632';
+ t['\uFEB1'] = '\u0633';
+ t['\uFEB2'] = '\u0633';
+ t['\uFEB3'] = '\u0633';
+ t['\uFEB4'] = '\u0633';
+ t['\uFEB5'] = '\u0634';
+ t['\uFEB6'] = '\u0634';
+ t['\uFEB7'] = '\u0634';
+ t['\uFEB8'] = '\u0634';
+ t['\uFEB9'] = '\u0635';
+ t['\uFEBA'] = '\u0635';
+ t['\uFEBB'] = '\u0635';
+ t['\uFEBC'] = '\u0635';
+ t['\uFEBD'] = '\u0636';
+ t['\uFEBE'] = '\u0636';
+ t['\uFEBF'] = '\u0636';
+ t['\uFEC0'] = '\u0636';
+ t['\uFEC1'] = '\u0637';
+ t['\uFEC2'] = '\u0637';
+ t['\uFEC3'] = '\u0637';
+ t['\uFEC4'] = '\u0637';
+ t['\uFEC5'] = '\u0638';
+ t['\uFEC6'] = '\u0638';
+ t['\uFEC7'] = '\u0638';
+ t['\uFEC8'] = '\u0638';
+ t['\uFEC9'] = '\u0639';
+ t['\uFECA'] = '\u0639';
+ t['\uFECB'] = '\u0639';
+ t['\uFECC'] = '\u0639';
+ t['\uFECD'] = '\u063A';
+ t['\uFECE'] = '\u063A';
+ t['\uFECF'] = '\u063A';
+ t['\uFED0'] = '\u063A';
+ t['\uFED1'] = '\u0641';
+ t['\uFED2'] = '\u0641';
+ t['\uFED3'] = '\u0641';
+ t['\uFED4'] = '\u0641';
+ t['\uFED5'] = '\u0642';
+ t['\uFED6'] = '\u0642';
+ t['\uFED7'] = '\u0642';
+ t['\uFED8'] = '\u0642';
+ t['\uFED9'] = '\u0643';
+ t['\uFEDA'] = '\u0643';
+ t['\uFEDB'] = '\u0643';
+ t['\uFEDC'] = '\u0643';
+ t['\uFEDD'] = '\u0644';
+ t['\uFEDE'] = '\u0644';
+ t['\uFEDF'] = '\u0644';
+ t['\uFEE0'] = '\u0644';
+ t['\uFEE1'] = '\u0645';
+ t['\uFEE2'] = '\u0645';
+ t['\uFEE3'] = '\u0645';
+ t['\uFEE4'] = '\u0645';
+ t['\uFEE5'] = '\u0646';
+ t['\uFEE6'] = '\u0646';
+ t['\uFEE7'] = '\u0646';
+ t['\uFEE8'] = '\u0646';
+ t['\uFEE9'] = '\u0647';
+ t['\uFEEA'] = '\u0647';
+ t['\uFEEB'] = '\u0647';
+ t['\uFEEC'] = '\u0647';
+ t['\uFEED'] = '\u0648';
+ t['\uFEEE'] = '\u0648';
+ t['\uFEEF'] = '\u0649';
+ t['\uFEF0'] = '\u0649';
+ t['\uFEF1'] = '\u064A';
+ t['\uFEF2'] = '\u064A';
+ t['\uFEF3'] = '\u064A';
+ t['\uFEF4'] = '\u064A';
+ t['\uFEF5'] = '\u0644\u0622';
+ t['\uFEF6'] = '\u0644\u0622';
+ t['\uFEF7'] = '\u0644\u0623';
+ t['\uFEF8'] = '\u0644\u0623';
+ t['\uFEF9'] = '\u0644\u0625';
+ t['\uFEFA'] = '\u0644\u0625';
+ t['\uFEFB'] = '\u0644\u0627';
+ t['\uFEFC'] = '\u0644\u0627';
+});
+function reverseIfRtl(chars) {
+ var charsLength = chars.length;
+ if (charsLength <= 1 || !isRTLRangeFor(chars.charCodeAt(0))) {
+  return chars;
+ }
+ var s = '';
+ for (var ii = charsLength - 1; ii >= 0; ii--) {
+  s += chars[ii];
+ }
+ return s;
+}
+exports.mapSpecialUnicodeValues = mapSpecialUnicodeValues;
+exports.reverseIfRtl = reverseIfRtl;
+exports.getUnicodeRangeFor = getUnicodeRangeFor;
+exports.getNormalizedUnicodes = getNormalizedUnicodes;
+exports.getUnicodeForGlyph = getUnicodeForGlyph;
+
+/***/ }),
+/* 163 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.FontRendererFactory = undefined;
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _util = __w_pdfjs_require__(2);
+
+var _cff_parser = __w_pdfjs_require__(157);
+
+var _glyphlist = __w_pdfjs_require__(160);
+
+var _encodings = __w_pdfjs_require__(159);
+
+var _stream = __w_pdfjs_require__(140);
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var FontRendererFactory = function FontRendererFactoryClosure() {
+  function getLong(data, offset) {
+    return data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3];
+  }
+  function getUshort(data, offset) {
+    return data[offset] << 8 | data[offset + 1];
+  }
+  function parseCmap(data, start, end) {
+    var offset = getUshort(data, start + 2) === 1 ? getLong(data, start + 8) : getLong(data, start + 16);
+    var format = getUshort(data, start + offset);
+    var ranges, p, i;
+    if (format === 4) {
+      getUshort(data, start + offset + 2);
+      var segCount = getUshort(data, start + offset + 6) >> 1;
+      p = start + offset + 14;
+      ranges = [];
+      for (i = 0; i < segCount; i++, p += 2) {
+        ranges[i] = { end: getUshort(data, p) };
+      }
+      p += 2;
+      for (i = 0; i < segCount; i++, p += 2) {
+        ranges[i].start = getUshort(data, p);
+      }
+      for (i = 0; i < segCount; i++, p += 2) {
+        ranges[i].idDelta = getUshort(data, p);
+      }
+      for (i = 0; i < segCount; i++, p += 2) {
+        var idOffset = getUshort(data, p);
+        if (idOffset === 0) {
+          continue;
+        }
+        ranges[i].ids = [];
+        for (var j = 0, jj = ranges[i].end - ranges[i].start + 1; j < jj; j++) {
+          ranges[i].ids[j] = getUshort(data, p + idOffset);
+          idOffset += 2;
+        }
+      }
+      return ranges;
+    } else if (format === 12) {
+      getLong(data, start + offset + 4);
+      var groups = getLong(data, start + offset + 12);
+      p = start + offset + 16;
+      ranges = [];
+      for (i = 0; i < groups; i++) {
+        ranges.push({
+          start: getLong(data, p),
+          end: getLong(data, p + 4),
+          idDelta: getLong(data, p + 8) - getLong(data, p)
+        });
+        p += 12;
+      }
+      return ranges;
+    }
+    throw new _util.FormatError('unsupported cmap: ' + format);
+  }
+  function parseCff(data, start, end, seacAnalysisEnabled) {
+    var properties = {};
+    var parser = new _cff_parser.CFFParser(new _stream.Stream(data, start, end - start), properties, seacAnalysisEnabled);
+    var cff = parser.parse();
+    return {
+      glyphs: cff.charStrings.objects,
+      subrs: cff.topDict.privateDict && cff.topDict.privateDict.subrsIndex && cff.topDict.privateDict.subrsIndex.objects,
+      gsubrs: cff.globalSubrIndex && cff.globalSubrIndex.objects,
+      isCFFCIDFont: cff.isCIDFont,
+      fdSelect: cff.fdSelect,
+      fdArray: cff.fdArray
+    };
+  }
+  function parseGlyfTable(glyf, loca, isGlyphLocationsLong) {
+    var itemSize, itemDecode;
+    if (isGlyphLocationsLong) {
+      itemSize = 4;
+      itemDecode = function fontItemDecodeLong(data, offset) {
+        return data[offset] << 24 | data[offset + 1] << 16 | data[offset + 2] << 8 | data[offset + 3];
+      };
+    } else {
+      itemSize = 2;
+      itemDecode = function fontItemDecode(data, offset) {
+        return data[offset] << 9 | data[offset + 1] << 1;
+      };
+    }
+    var glyphs = [];
+    var startOffset = itemDecode(loca, 0);
+    for (var j = itemSize; j < loca.length; j += itemSize) {
+      var endOffset = itemDecode(loca, j);
+      glyphs.push(glyf.subarray(startOffset, endOffset));
+      startOffset = endOffset;
+    }
+    return glyphs;
+  }
+  function lookupCmap(ranges, unicode) {
+    var code = unicode.codePointAt(0),
+        gid = 0;
+    var l = 0,
+        r = ranges.length - 1;
+    while (l < r) {
+      var c = l + r + 1 >> 1;
+      if (code < ranges[c].start) {
+        r = c - 1;
+      } else {
+        l = c;
+      }
+    }
+    if (ranges[l].start <= code && code <= ranges[l].end) {
+      gid = ranges[l].idDelta + (ranges[l].ids ? ranges[l].ids[code - ranges[l].start] : code) & 0xFFFF;
+    }
+    return {
+      charCode: code,
+      glyphId: gid
+    };
+  }
+  function compileGlyf(code, cmds, font) {
+    function moveTo(x, y) {
+      cmds.push({
+        cmd: 'moveTo',
+        args: [x, y]
+      });
+    }
+    function lineTo(x, y) {
+      cmds.push({
+        cmd: 'lineTo',
+        args: [x, y]
+      });
+    }
+    function quadraticCurveTo(xa, ya, x, y) {
+      cmds.push({
+        cmd: 'quadraticCurveTo',
+        args: [xa, ya, x, y]
+      });
+    }
+    var i = 0;
+    var numberOfContours = (code[i] << 24 | code[i + 1] << 16) >> 16;
+    var flags;
+    var x = 0,
+        y = 0;
+    i += 10;
+    if (numberOfContours < 0) {
+      do {
+        flags = code[i] << 8 | code[i + 1];
+        var glyphIndex = code[i + 2] << 8 | code[i + 3];
+        i += 4;
+        var arg1, arg2;
+        if (flags & 0x01) {
+          arg1 = (code[i] << 24 | code[i + 1] << 16) >> 16;
+          arg2 = (code[i + 2] << 24 | code[i + 3] << 16) >> 16;
+          i += 4;
+        } else {
+          arg1 = code[i++];
+          arg2 = code[i++];
+        }
+        if (flags & 0x02) {
+          x = arg1;
+          y = arg2;
+        } else {
+          x = 0;
+          y = 0;
+        }
+        var scaleX = 1,
+            scaleY = 1,
+            scale01 = 0,
+            scale10 = 0;
+        if (flags & 0x08) {
+          scaleX = scaleY = (code[i] << 24 | code[i + 1] << 16) / 1073741824;
+          i += 2;
+        } else if (flags & 0x40) {
+          scaleX = (code[i] << 24 | code[i + 1] << 16) / 1073741824;
+          scaleY = (code[i + 2] << 24 | code[i + 3] << 16) / 1073741824;
+          i += 4;
+        } else if (flags & 0x80) {
+          scaleX = (code[i] << 24 | code[i + 1] << 16) / 1073741824;
+          scale01 = (code[i + 2] << 24 | code[i + 3] << 16) / 1073741824;
+          scale10 = (code[i + 4] << 24 | code[i + 5] << 16) / 1073741824;
+          scaleY = (code[i + 6] << 24 | code[i + 7] << 16) / 1073741824;
+          i += 8;
+        }
+        var subglyph = font.glyphs[glyphIndex];
+        if (subglyph) {
+          cmds.push({ cmd: 'save' });
+          cmds.push({
+            cmd: 'transform',
+            args: [scaleX, scale01, scale10, scaleY, x, y]
+          });
+          compileGlyf(subglyph, cmds, font);
+          cmds.push({ cmd: 'restore' });
+        }
+      } while (flags & 0x20);
+    } else {
+      var endPtsOfContours = [];
+      var j, jj;
+      for (j = 0; j < numberOfContours; j++) {
+        endPtsOfContours.push(code[i] << 8 | code[i + 1]);
+        i += 2;
+      }
+      var instructionLength = code[i] << 8 | code[i + 1];
+      i += 2 + instructionLength;
+      var numberOfPoints = endPtsOfContours[endPtsOfContours.length - 1] + 1;
+      var points = [];
+      while (points.length < numberOfPoints) {
+        flags = code[i++];
+        var repeat = 1;
+        if (flags & 0x08) {
+          repeat += code[i++];
+        }
+        while (repeat-- > 0) {
+          points.push({ flags: flags });
+        }
+      }
+      for (j = 0; j < numberOfPoints; j++) {
+        switch (points[j].flags & 0x12) {
+          case 0x00:
+            x += (code[i] << 24 | code[i + 1] << 16) >> 16;
+            i += 2;
+            break;
+          case 0x02:
+            x -= code[i++];
+            break;
+          case 0x12:
+            x += code[i++];
+            break;
+        }
+        points[j].x = x;
+      }
+      for (j = 0; j < numberOfPoints; j++) {
+        switch (points[j].flags & 0x24) {
+          case 0x00:
+            y += (code[i] << 24 | code[i + 1] << 16) >> 16;
+            i += 2;
+            break;
+          case 0x04:
+            y -= code[i++];
+            break;
+          case 0x24:
+            y += code[i++];
+            break;
+        }
+        points[j].y = y;
+      }
+      var startPoint = 0;
+      for (i = 0; i < numberOfContours; i++) {
+        var endPoint = endPtsOfContours[i];
+        var contour = points.slice(startPoint, endPoint + 1);
+        if (contour[0].flags & 1) {
+          contour.push(contour[0]);
+        } else if (contour[contour.length - 1].flags & 1) {
+          contour.unshift(contour[contour.length - 1]);
+        } else {
+          var p = {
+            flags: 1,
+            x: (contour[0].x + contour[contour.length - 1].x) / 2,
+            y: (contour[0].y + contour[contour.length - 1].y) / 2
+          };
+          contour.unshift(p);
+          contour.push(p);
+        }
+        moveTo(contour[0].x, contour[0].y);
+        for (j = 1, jj = contour.length; j < jj; j++) {
+          if (contour[j].flags & 1) {
+            lineTo(contour[j].x, contour[j].y);
+          } else if (contour[j + 1].flags & 1) {
+            quadraticCurveTo(contour[j].x, contour[j].y, contour[j + 1].x, contour[j + 1].y);
+            j++;
+          } else {
+            quadraticCurveTo(contour[j].x, contour[j].y, (contour[j].x + contour[j + 1].x) / 2, (contour[j].y + contour[j + 1].y) / 2);
+          }
+        }
+        startPoint = endPoint + 1;
+      }
+    }
+  }
+  function compileCharString(code, cmds, font, glyphId) {
+    var stack = [];
+    var x = 0,
+        y = 0;
+    var stems = 0;
+    function moveTo(x, y) {
+      cmds.push({
+        cmd: 'moveTo',
+        args: [x, y]
+      });
+    }
+    function lineTo(x, y) {
+      cmds.push({
+        cmd: 'lineTo',
+        args: [x, y]
+      });
+    }
+    function bezierCurveTo(x1, y1, x2, y2, x, y) {
+      cmds.push({
+        cmd: 'bezierCurveTo',
+        args: [x1, y1, x2, y2, x, y]
+      });
+    }
+    function parse(code) {
+      var i = 0;
+      while (i < code.length) {
+        var stackClean = false;
+        var v = code[i++];
+        var xa, xb, ya, yb, y1, y2, y3, n, subrCode;
+        switch (v) {
+          case 1:
+            stems += stack.length >> 1;
+            stackClean = true;
+            break;
+          case 3:
+            stems += stack.length >> 1;
+            stackClean = true;
+            break;
+          case 4:
+            y += stack.pop();
+            moveTo(x, y);
+            stackClean = true;
+            break;
+          case 5:
+            while (stack.length > 0) {
+              x += stack.shift();
+              y += stack.shift();
+              lineTo(x, y);
+            }
+            break;
+          case 6:
+            while (stack.length > 0) {
+              x += stack.shift();
+              lineTo(x, y);
+              if (stack.length === 0) {
+                break;
+              }
+              y += stack.shift();
+              lineTo(x, y);
+            }
+            break;
+          case 7:
+            while (stack.length > 0) {
+              y += stack.shift();
+              lineTo(x, y);
+              if (stack.length === 0) {
+                break;
+              }
+              x += stack.shift();
+              lineTo(x, y);
+            }
+            break;
+          case 8:
+            while (stack.length > 0) {
+              xa = x + stack.shift();
+              ya = y + stack.shift();
+              xb = xa + stack.shift();
+              yb = ya + stack.shift();
+              x = xb + stack.shift();
+              y = yb + stack.shift();
+              bezierCurveTo(xa, ya, xb, yb, x, y);
+            }
+            break;
+          case 10:
+            n = stack.pop();
+            subrCode = null;
+            if (font.isCFFCIDFont) {
+              var fdIndex = font.fdSelect.getFDIndex(glyphId);
+              if (fdIndex >= 0 && fdIndex < font.fdArray.length) {
+                var fontDict = font.fdArray[fdIndex],
+                    subrs = void 0;
+                if (fontDict.privateDict && fontDict.privateDict.subrsIndex) {
+                  subrs = fontDict.privateDict.subrsIndex.objects;
+                }
+                if (subrs) {
+                  var numSubrs = subrs.length;
+                  n += numSubrs < 1240 ? 107 : numSubrs < 33900 ? 1131 : 32768;
+                  subrCode = subrs[n];
+                }
+              } else {
+                (0, _util.warn)('Invalid fd index for glyph index.');
+              }
+            } else {
+              subrCode = font.subrs[n + font.subrsBias];
+            }
+            if (subrCode) {
+              parse(subrCode);
+            }
+            break;
+          case 11:
+            return;
+          case 12:
+            v = code[i++];
+            switch (v) {
+              case 34:
+                xa = x + stack.shift();
+                xb = xa + stack.shift();
+                y1 = y + stack.shift();
+                x = xb + stack.shift();
+                bezierCurveTo(xa, y, xb, y1, x, y1);
+                xa = x + stack.shift();
+                xb = xa + stack.shift();
+                x = xb + stack.shift();
+                bezierCurveTo(xa, y1, xb, y, x, y);
+                break;
+              case 35:
+                xa = x + stack.shift();
+                ya = y + stack.shift();
+                xb = xa + stack.shift();
+                yb = ya + stack.shift();
+                x = xb + stack.shift();
+                y = yb + stack.shift();
+                bezierCurveTo(xa, ya, xb, yb, x, y);
+                xa = x + stack.shift();
+                ya = y + stack.shift();
+                xb = xa + stack.shift();
+                yb = ya + stack.shift();
+                x = xb + stack.shift();
+                y = yb + stack.shift();
+                bezierCurveTo(xa, ya, xb, yb, x, y);
+                stack.pop();
+                break;
+              case 36:
+                xa = x + stack.shift();
+                y1 = y + stack.shift();
+                xb = xa + stack.shift();
+                y2 = y1 + stack.shift();
+                x = xb + stack.shift();
+                bezierCurveTo(xa, y1, xb, y2, x, y2);
+                xa = x + stack.shift();
+                xb = xa + stack.shift();
+                y3 = y2 + stack.shift();
+                x = xb + stack.shift();
+                bezierCurveTo(xa, y2, xb, y3, x, y);
+                break;
+              case 37:
+                var x0 = x,
+                    y0 = y;
+                xa = x + stack.shift();
+                ya = y + stack.shift();
+                xb = xa + stack.shift();
+                yb = ya + stack.shift();
+                x = xb + stack.shift();
+                y = yb + stack.shift();
+                bezierCurveTo(xa, ya, xb, yb, x, y);
+                xa = x + stack.shift();
+                ya = y + stack.shift();
+                xb = xa + stack.shift();
+                yb = ya + stack.shift();
+                x = xb;
+                y = yb;
+                if (Math.abs(x - x0) > Math.abs(y - y0)) {
+                  x += stack.shift();
+                } else {
+                  y += stack.shift();
+                }
+                bezierCurveTo(xa, ya, xb, yb, x, y);
+                break;
+              default:
+                throw new _util.FormatError('unknown operator: 12 ' + v);
+            }
+            break;
+          case 14:
+            if (stack.length >= 4) {
+              var achar = stack.pop();
+              var bchar = stack.pop();
+              y = stack.pop();
+              x = stack.pop();
+              cmds.push({ cmd: 'save' });
+              cmds.push({
+                cmd: 'translate',
+                args: [x, y]
+              });
+              var cmap = lookupCmap(font.cmap, String.fromCharCode(font.glyphNameMap[_encodings.StandardEncoding[achar]]));
+              compileCharString(font.glyphs[cmap.glyphId], cmds, font, cmap.glyphId);
+              cmds.push({ cmd: 'restore' });
+              cmap = lookupCmap(font.cmap, String.fromCharCode(font.glyphNameMap[_encodings.StandardEncoding[bchar]]));
+              compileCharString(font.glyphs[cmap.glyphId], cmds, font, cmap.glyphId);
+            }
+            return;
+          case 18:
+            stems += stack.length >> 1;
+            stackClean = true;
+            break;
+          case 19:
+            stems += stack.length >> 1;
+            i += stems + 7 >> 3;
+            stackClean = true;
+            break;
+          case 20:
+            stems += stack.length >> 1;
+            i += stems + 7 >> 3;
+            stackClean = true;
+            break;
+          case 21:
+            y += stack.pop();
+            x += stack.pop();
+            moveTo(x, y);
+            stackClean = true;
+            break;
+          case 22:
+            x += stack.pop();
+            moveTo(x, y);
+            stackClean = true;
+            break;
+          case 23:
+            stems += stack.length >> 1;
+            stackClean = true;
+            break;
+          case 24:
+            while (stack.length > 2) {
+              xa = x + stack.shift();
+              ya = y + stack.shift();
+              xb = xa + stack.shift();
+              yb = ya + stack.shift();
+              x = xb + stack.shift();
+              y = yb + stack.shift();
+              bezierCurveTo(xa, ya, xb, yb, x, y);
+            }
+            x += stack.shift();
+            y += stack.shift();
+            lineTo(x, y);
+            break;
+          case 25:
+            while (stack.length > 6) {
+              x += stack.shift();
+              y += stack.shift();
+              lineTo(x, y);
+            }
+            xa = x + stack.shift();
+            ya = y + stack.shift();
+            xb = xa + stack.shift();
+            yb = ya + stack.shift();
+            x = xb + stack.shift();
+            y = yb + stack.shift();
+            bezierCurveTo(xa, ya, xb, yb, x, y);
+            break;
+          case 26:
+            if (stack.length % 2) {
+              x += stack.shift();
+            }
+            while (stack.length > 0) {
+              xa = x;
+              ya = y + stack.shift();
+              xb = xa + stack.shift();
+              yb = ya + stack.shift();
+              x = xb;
+              y = yb + stack.shift();
+              bezierCurveTo(xa, ya, xb, yb, x, y);
+            }
+            break;
+          case 27:
+            if (stack.length % 2) {
+              y += stack.shift();
+            }
+            while (stack.length > 0) {
+              xa = x + stack.shift();
+              ya = y;
+              xb = xa + stack.shift();
+              yb = ya + stack.shift();
+              x = xb + stack.shift();
+              y = yb;
+              bezierCurveTo(xa, ya, xb, yb, x, y);
+            }
+            break;
+          case 28:
+            stack.push((code[i] << 24 | code[i + 1] << 16) >> 16);
+            i += 2;
+            break;
+          case 29:
+            n = stack.pop() + font.gsubrsBias;
+            subrCode = font.gsubrs[n];
+            if (subrCode) {
+              parse(subrCode);
+            }
+            break;
+          case 30:
+            while (stack.length > 0) {
+              xa = x;
+              ya = y + stack.shift();
+              xb = xa + stack.shift();
+              yb = ya + stack.shift();
+              x = xb + stack.shift();
+              y = yb + (stack.length === 1 ? stack.shift() : 0);
+              bezierCurveTo(xa, ya, xb, yb, x, y);
+              if (stack.length === 0) {
+                break;
+              }
+              xa = x + stack.shift();
+              ya = y;
+              xb = xa + stack.shift();
+              yb = ya + stack.shift();
+              y = yb + stack.shift();
+              x = xb + (stack.length === 1 ? stack.shift() : 0);
+              bezierCurveTo(xa, ya, xb, yb, x, y);
+            }
+            break;
+          case 31:
+            while (stack.length > 0) {
+              xa = x + stack.shift();
+              ya = y;
+              xb = xa + stack.shift();
+              yb = ya + stack.shift();
+              y = yb + stack.shift();
+              x = xb + (stack.length === 1 ? stack.shift() : 0);
+              bezierCurveTo(xa, ya, xb, yb, x, y);
+              if (stack.length === 0) {
+                break;
+              }
+              xa = x;
+              ya = y + stack.shift();
+              xb = xa + stack.shift();
+              yb = ya + stack.shift();
+              x = xb + stack.shift();
+              y = yb + (stack.length === 1 ? stack.shift() : 0);
+              bezierCurveTo(xa, ya, xb, yb, x, y);
+            }
+            break;
+          default:
+            if (v < 32) {
+              throw new _util.FormatError('unknown operator: ' + v);
+            }
+            if (v < 247) {
+              stack.push(v - 139);
+            } else if (v < 251) {
+              stack.push((v - 247) * 256 + code[i++] + 108);
+            } else if (v < 255) {
+              stack.push(-(v - 251) * 256 - code[i++] - 108);
+            } else {
+              stack.push((code[i] << 24 | code[i + 1] << 16 | code[i + 2] << 8 | code[i + 3]) / 65536);
+              i += 4;
+            }
+            break;
+        }
+        if (stackClean) {
+          stack.length = 0;
+        }
+      }
+    }
+    parse(code);
+  }
+  var NOOP = [];
+
+  var CompiledFont = function () {
+    function CompiledFont(fontMatrix) {
+      _classCallCheck(this, CompiledFont);
+
+      if (this.constructor === CompiledFont) {
+        (0, _util.unreachable)('Cannot initialize CompiledFont.');
+      }
+      this.fontMatrix = fontMatrix;
+      this.compiledGlyphs = Object.create(null);
+      this.compiledCharCodeToGlyphId = Object.create(null);
+    }
+
+    _createClass(CompiledFont, [{
+      key: 'getPathJs',
+      value: function getPathJs(unicode) {
+        var cmap = lookupCmap(this.cmap, unicode);
+        var fn = this.compiledGlyphs[cmap.glyphId];
+        if (!fn) {
+          fn = this.compileGlyph(this.glyphs[cmap.glyphId], cmap.glyphId);
+          this.compiledGlyphs[cmap.glyphId] = fn;
+        }
+        if (this.compiledCharCodeToGlyphId[cmap.charCode] === undefined) {
+          this.compiledCharCodeToGlyphId[cmap.charCode] = cmap.glyphId;
+        }
+        return fn;
+      }
+    }, {
+      key: 'compileGlyph',
+      value: function compileGlyph(code, glyphId) {
+        if (!code || code.length === 0 || code[0] === 14) {
+          return NOOP;
+        }
+        var fontMatrix = this.fontMatrix;
+        if (this.isCFFCIDFont) {
+          var fdIndex = this.fdSelect.getFDIndex(glyphId);
+          if (fdIndex >= 0 && fdIndex < this.fdArray.length) {
+            var fontDict = this.fdArray[fdIndex];
+            fontMatrix = fontDict.getByName('FontMatrix') || _util.FONT_IDENTITY_MATRIX;
+          } else {
+            (0, _util.warn)('Invalid fd index for glyph index.');
+          }
+        }
+        var cmds = [];
+        cmds.push({ cmd: 'save' });
+        cmds.push({
+          cmd: 'transform',
+          args: fontMatrix.slice()
+        });
+        cmds.push({
+          cmd: 'scale',
+          args: ['size', '-size']
+        });
+        this.compileGlyphImpl(code, cmds, glyphId);
+        cmds.push({ cmd: 'restore' });
+        return cmds;
+      }
+    }, {
+      key: 'compileGlyphImpl',
+      value: function compileGlyphImpl() {
+        (0, _util.unreachable)('Children classes should implement this.');
+      }
+    }, {
+      key: 'hasBuiltPath',
+      value: function hasBuiltPath(unicode) {
+        var cmap = lookupCmap(this.cmap, unicode);
+        return this.compiledGlyphs[cmap.glyphId] !== undefined && this.compiledCharCodeToGlyphId[cmap.charCode] !== undefined;
+      }
+    }]);
+
+    return CompiledFont;
+  }();
+
+  var TrueTypeCompiled = function (_CompiledFont) {
+    _inherits(TrueTypeCompiled, _CompiledFont);
+
+    function TrueTypeCompiled(glyphs, cmap, fontMatrix) {
+      _classCallCheck(this, TrueTypeCompiled);
+
+      var _this = _possibleConstructorReturn(this, (TrueTypeCompiled.__proto__ || Object.getPrototypeOf(TrueTypeCompiled)).call(this, fontMatrix || [0.000488, 0, 0, 0.000488, 0, 0]));
+
+      _this.glyphs = glyphs;
+      _this.cmap = cmap;
+      return _this;
+    }
+
+    _createClass(TrueTypeCompiled, [{
+      key: 'compileGlyphImpl',
+      value: function compileGlyphImpl(code, cmds) {
+        compileGlyf(code, cmds, this);
+      }
+    }]);
+
+    return TrueTypeCompiled;
+  }(CompiledFont);
+
+  var Type2Compiled = function (_CompiledFont2) {
+    _inherits(Type2Compiled, _CompiledFont2);
+
+    function Type2Compiled(cffInfo, cmap, fontMatrix, glyphNameMap) {
+      _classCallCheck(this, Type2Compiled);
+
+      var _this2 = _possibleConstructorReturn(this, (Type2Compiled.__proto__ || Object.getPrototypeOf(Type2Compiled)).call(this, fontMatrix || [0.001, 0, 0, 0.001, 0, 0]));
+
+      _this2.glyphs = cffInfo.glyphs;
+      _this2.gsubrs = cffInfo.gsubrs || [];
+      _this2.subrs = cffInfo.subrs || [];
+      _this2.cmap = cmap;
+      _this2.glyphNameMap = glyphNameMap || (0, _glyphlist.getGlyphsUnicode)();
+      _this2.gsubrsBias = _this2.gsubrs.length < 1240 ? 107 : _this2.gsubrs.length < 33900 ? 1131 : 32768;
+      _this2.subrsBias = _this2.subrs.length < 1240 ? 107 : _this2.subrs.length < 33900 ? 1131 : 32768;
+      _this2.isCFFCIDFont = cffInfo.isCFFCIDFont;
+      _this2.fdSelect = cffInfo.fdSelect;
+      _this2.fdArray = cffInfo.fdArray;
+      return _this2;
+    }
+
+    _createClass(Type2Compiled, [{
+      key: 'compileGlyphImpl',
+      value: function compileGlyphImpl(code, cmds, glyphId) {
+        compileCharString(code, cmds, this, glyphId);
+      }
+    }]);
+
+    return Type2Compiled;
+  }(CompiledFont);
+
+  return {
+    create: function FontRendererFactory_create(font, seacAnalysisEnabled) {
+      var data = new Uint8Array(font.data);
+      var cmap, glyf, loca, cff, indexToLocFormat, unitsPerEm;
+      var numTables = getUshort(data, 4);
+      for (var i = 0, p = 12; i < numTables; i++, p += 16) {
+        var tag = (0, _util.bytesToString)(data.subarray(p, p + 4));
+        var offset = getLong(data, p + 8);
+        var length = getLong(data, p + 12);
+        switch (tag) {
+          case 'cmap':
+            cmap = parseCmap(data, offset, offset + length);
+            break;
+          case 'glyf':
+            glyf = data.subarray(offset, offset + length);
+            break;
+          case 'loca':
+            loca = data.subarray(offset, offset + length);
+            break;
+          case 'head':
+            unitsPerEm = getUshort(data, offset + 18);
+            indexToLocFormat = getUshort(data, offset + 50);
+            break;
+          case 'CFF ':
+            cff = parseCff(data, offset, offset + length, seacAnalysisEnabled);
+            break;
+        }
+      }
+      if (glyf) {
+        var fontMatrix = !unitsPerEm ? font.fontMatrix : [1 / unitsPerEm, 0, 0, 1 / unitsPerEm, 0, 0];
+        return new TrueTypeCompiled(parseGlyfTable(glyf, loca, indexToLocFormat), cmap, fontMatrix);
+      }
+      return new Type2Compiled(cff, cmap, font.fontMatrix, font.glyphNameMap);
+    }
+  };
+}();
+exports.FontRendererFactory = FontRendererFactory;
+
+/***/ }),
+/* 164 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.Type1Parser = undefined;
+
+var _util = __w_pdfjs_require__(2);
+
+var _encodings = __w_pdfjs_require__(159);
+
+var _stream = __w_pdfjs_require__(140);
+
+var HINTING_ENABLED = false;
+var Type1CharString = function Type1CharStringClosure() {
+  var COMMAND_MAP = {
+    'hstem': [1],
+    'vstem': [3],
+    'vmoveto': [4],
+    'rlineto': [5],
+    'hlineto': [6],
+    'vlineto': [7],
+    'rrcurveto': [8],
+    'callsubr': [10],
+    'flex': [12, 35],
+    'drop': [12, 18],
+    'endchar': [14],
+    'rmoveto': [21],
+    'hmoveto': [22],
+    'vhcurveto': [30],
+    'hvcurveto': [31]
+  };
+  function Type1CharString() {
+    this.width = 0;
+    this.lsb = 0;
+    this.flexing = false;
+    this.output = [];
+    this.stack = [];
+  }
+  Type1CharString.prototype = {
+    convert: function Type1CharString_convert(encoded, subrs, seacAnalysisEnabled) {
+      var count = encoded.length;
+      var error = false;
+      var wx, sbx, subrNumber;
+      for (var i = 0; i < count; i++) {
+        var value = encoded[i];
+        if (value < 32) {
+          if (value === 12) {
+            value = (value << 8) + encoded[++i];
+          }
+          switch (value) {
+            case 1:
+              if (!HINTING_ENABLED) {
+                this.stack = [];
+                break;
+              }
+              error = this.executeCommand(2, COMMAND_MAP.hstem);
+              break;
+            case 3:
+              if (!HINTING_ENABLED) {
+                this.stack = [];
+                break;
+              }
+              error = this.executeCommand(2, COMMAND_MAP.vstem);
+              break;
+            case 4:
+              if (this.flexing) {
+                if (this.stack.length < 1) {
+                  error = true;
+                  break;
+                }
+                var dy = this.stack.pop();
+                this.stack.push(0, dy);
+                break;
+              }
+              error = this.executeCommand(1, COMMAND_MAP.vmoveto);
+              break;
+            case 5:
+              error = this.executeCommand(2, COMMAND_MAP.rlineto);
+              break;
+            case 6:
+              error = this.executeCommand(1, COMMAND_MAP.hlineto);
+              break;
+            case 7:
+              error = this.executeCommand(1, COMMAND_MAP.vlineto);
+              break;
+            case 8:
+              error = this.executeCommand(6, COMMAND_MAP.rrcurveto);
+              break;
+            case 9:
+              this.stack = [];
+              break;
+            case 10:
+              if (this.stack.length < 1) {
+                error = true;
+                break;
+              }
+              subrNumber = this.stack.pop();
+              if (!subrs[subrNumber]) {
+                error = true;
+                break;
+              }
+              error = this.convert(subrs[subrNumber], subrs, seacAnalysisEnabled);
+              break;
+            case 11:
+              return error;
+            case 13:
+              if (this.stack.length < 2) {
+                error = true;
+                break;
+              }
+              wx = this.stack.pop();
+              sbx = this.stack.pop();
+              this.lsb = sbx;
+              this.width = wx;
+              this.stack.push(wx, sbx);
+              error = this.executeCommand(2, COMMAND_MAP.hmoveto);
+              break;
+            case 14:
+              this.output.push(COMMAND_MAP.endchar[0]);
+              break;
+            case 21:
+              if (this.flexing) {
+                break;
+              }
+              error = this.executeCommand(2, COMMAND_MAP.rmoveto);
+              break;
+            case 22:
+              if (this.flexing) {
+                this.stack.push(0);
+                break;
+              }
+              error = this.executeCommand(1, COMMAND_MAP.hmoveto);
+              break;
+            case 30:
+              error = this.executeCommand(4, COMMAND_MAP.vhcurveto);
+              break;
+            case 31:
+              error = this.executeCommand(4, COMMAND_MAP.hvcurveto);
+              break;
+            case (12 << 8) + 0:
+              this.stack = [];
+              break;
+            case (12 << 8) + 1:
+              if (!HINTING_ENABLED) {
+                this.stack = [];
+                break;
+              }
+              error = this.executeCommand(2, COMMAND_MAP.vstem);
+              break;
+            case (12 << 8) + 2:
+              if (!HINTING_ENABLED) {
+                this.stack = [];
+                break;
+              }
+              error = this.executeCommand(2, COMMAND_MAP.hstem);
+              break;
+            case (12 << 8) + 6:
+              if (seacAnalysisEnabled) {
+                this.seac = this.stack.splice(-4, 4);
+                error = this.executeCommand(0, COMMAND_MAP.endchar);
+              } else {
+                error = this.executeCommand(4, COMMAND_MAP.endchar);
+              }
+              break;
+            case (12 << 8) + 7:
+              if (this.stack.length < 4) {
+                error = true;
+                break;
+              }
+              this.stack.pop();
+              wx = this.stack.pop();
+              var sby = this.stack.pop();
+              sbx = this.stack.pop();
+              this.lsb = sbx;
+              this.width = wx;
+              this.stack.push(wx, sbx, sby);
+              error = this.executeCommand(3, COMMAND_MAP.rmoveto);
+              break;
+            case (12 << 8) + 12:
+              if (this.stack.length < 2) {
+                error = true;
+                break;
+              }
+              var num2 = this.stack.pop();
+              var num1 = this.stack.pop();
+              this.stack.push(num1 / num2);
+              break;
+            case (12 << 8) + 16:
+              if (this.stack.length < 2) {
+                error = true;
+                break;
+              }
+              subrNumber = this.stack.pop();
+              var numArgs = this.stack.pop();
+              if (subrNumber === 0 && numArgs === 3) {
+                var flexArgs = this.stack.splice(this.stack.length - 17, 17);
+                this.stack.push(flexArgs[2] + flexArgs[0], flexArgs[3] + flexArgs[1], flexArgs[4], flexArgs[5], flexArgs[6], flexArgs[7], flexArgs[8], flexArgs[9], flexArgs[10], flexArgs[11], flexArgs[12], flexArgs[13], flexArgs[14]);
+                error = this.executeCommand(13, COMMAND_MAP.flex, true);
+                this.flexing = false;
+                this.stack.push(flexArgs[15], flexArgs[16]);
+              } else if (subrNumber === 1 && numArgs === 0) {
+                this.flexing = true;
+              }
+              break;
+            case (12 << 8) + 17:
+              break;
+            case (12 << 8) + 33:
+              this.stack = [];
+              break;
+            default:
+              (0, _util.warn)('Unknown type 1 charstring command of "' + value + '"');
+              break;
+          }
+          if (error) {
+            break;
+          }
+          continue;
+        } else if (value <= 246) {
+          value = value - 139;
+        } else if (value <= 250) {
+          value = (value - 247) * 256 + encoded[++i] + 108;
+        } else if (value <= 254) {
+          value = -((value - 251) * 256) - encoded[++i] - 108;
+        } else {
+          value = (encoded[++i] & 0xff) << 24 | (encoded[++i] & 0xff) << 16 | (encoded[++i] & 0xff) << 8 | (encoded[++i] & 0xff) << 0;
+        }
+        this.stack.push(value);
+      }
+      return error;
+    },
+    executeCommand: function executeCommand(howManyArgs, command, keepStack) {
+      var stackLength = this.stack.length;
+      if (howManyArgs > stackLength) {
+        return true;
+      }
+      var start = stackLength - howManyArgs;
+      for (var i = start; i < stackLength; i++) {
+        var value = this.stack[i];
+        if (Number.isInteger(value)) {
+          this.output.push(28, value >> 8 & 0xff, value & 0xff);
+        } else {
+          value = 65536 * value | 0;
+          this.output.push(255, value >> 24 & 0xFF, value >> 16 & 0xFF, value >> 8 & 0xFF, value & 0xFF);
+        }
+      }
+      this.output.push.apply(this.output, command);
+      if (keepStack) {
+        this.stack.splice(start, howManyArgs);
+      } else {
+        this.stack.length = 0;
+      }
+      return false;
+    }
+  };
+  return Type1CharString;
+}();
+var Type1Parser = function Type1ParserClosure() {
+  var EEXEC_ENCRYPT_KEY = 55665;
+  var CHAR_STRS_ENCRYPT_KEY = 4330;
+  function isHexDigit(code) {
+    return code >= 48 && code <= 57 || code >= 65 && code <= 70 || code >= 97 && code <= 102;
+  }
+  function decrypt(data, key, discardNumber) {
+    if (discardNumber >= data.length) {
+      return new Uint8Array(0);
+    }
+    var r = key | 0,
+        c1 = 52845,
+        c2 = 22719,
+        i,
+        j;
+    for (i = 0; i < discardNumber; i++) {
+      r = (data[i] + r) * c1 + c2 & (1 << 16) - 1;
+    }
+    var count = data.length - discardNumber;
+    var decrypted = new Uint8Array(count);
+    for (i = discardNumber, j = 0; j < count; i++, j++) {
+      var value = data[i];
+      decrypted[j] = value ^ r >> 8;
+      r = (value + r) * c1 + c2 & (1 << 16) - 1;
+    }
+    return decrypted;
+  }
+  function decryptAscii(data, key, discardNumber) {
+    var r = key | 0,
+        c1 = 52845,
+        c2 = 22719;
+    var count = data.length,
+        maybeLength = count >>> 1;
+    var decrypted = new Uint8Array(maybeLength);
+    var i, j;
+    for (i = 0, j = 0; i < count; i++) {
+      var digit1 = data[i];
+      if (!isHexDigit(digit1)) {
+        continue;
+      }
+      i++;
+      var digit2;
+      while (i < count && !isHexDigit(digit2 = data[i])) {
+        i++;
+      }
+      if (i < count) {
+        var value = parseInt(String.fromCharCode(digit1, digit2), 16);
+        decrypted[j++] = value ^ r >> 8;
+        r = (value + r) * c1 + c2 & (1 << 16) - 1;
+      }
+    }
+    return Array.prototype.slice.call(decrypted, discardNumber, j);
+  }
+  function isSpecial(c) {
+    return c === 0x2F || c === 0x5B || c === 0x5D || c === 0x7B || c === 0x7D || c === 0x28 || c === 0x29;
+  }
+  function Type1Parser(stream, encrypted, seacAnalysisEnabled) {
+    if (encrypted) {
+      var data = stream.getBytes();
+      var isBinary = !(isHexDigit(data[0]) && isHexDigit(data[1]) && isHexDigit(data[2]) && isHexDigit(data[3]));
+      stream = new _stream.Stream(isBinary ? decrypt(data, EEXEC_ENCRYPT_KEY, 4) : decryptAscii(data, EEXEC_ENCRYPT_KEY, 4));
+    }
+    this.seacAnalysisEnabled = !!seacAnalysisEnabled;
+    this.stream = stream;
+    this.nextChar();
+  }
+  Type1Parser.prototype = {
+    readNumberArray: function Type1Parser_readNumberArray() {
+      this.getToken();
+      var array = [];
+      while (true) {
+        var token = this.getToken();
+        if (token === null || token === ']' || token === '}') {
+          break;
+        }
+        array.push(parseFloat(token || 0));
+      }
+      return array;
+    },
+    readNumber: function Type1Parser_readNumber() {
+      var token = this.getToken();
+      return parseFloat(token || 0);
+    },
+    readInt: function Type1Parser_readInt() {
+      var token = this.getToken();
+      return parseInt(token || 0, 10) | 0;
+    },
+    readBoolean: function Type1Parser_readBoolean() {
+      var token = this.getToken();
+      return token === 'true' ? 1 : 0;
+    },
+    nextChar: function Type1_nextChar() {
+      return this.currentChar = this.stream.getByte();
+    },
+    getToken: function Type1Parser_getToken() {
+      var comment = false;
+      var ch = this.currentChar;
+      while (true) {
+        if (ch === -1) {
+          return null;
+        }
+        if (comment) {
+          if (ch === 0x0A || ch === 0x0D) {
+            comment = false;
+          }
+        } else if (ch === 0x25) {
+          comment = true;
+        } else if (!(0, _util.isSpace)(ch)) {
+          break;
+        }
+        ch = this.nextChar();
+      }
+      if (isSpecial(ch)) {
+        this.nextChar();
+        return String.fromCharCode(ch);
+      }
+      var token = '';
+      do {
+        token += String.fromCharCode(ch);
+        ch = this.nextChar();
+      } while (ch >= 0 && !(0, _util.isSpace)(ch) && !isSpecial(ch));
+      return token;
+    },
+    readCharStrings: function Type1Parser_readCharStrings(bytes, lenIV) {
+      if (lenIV === -1) {
+        return bytes;
+      }
+      return decrypt(bytes, CHAR_STRS_ENCRYPT_KEY, lenIV);
+    },
+    extractFontProgram: function Type1Parser_extractFontProgram() {
+      var stream = this.stream;
+      var subrs = [],
+          charstrings = [];
+      var privateData = Object.create(null);
+      privateData['lenIV'] = 4;
+      var program = {
+        subrs: [],
+        charstrings: [],
+        properties: { 'privateData': privateData }
+      };
+      var token, length, data, lenIV, encoded;
+      while ((token = this.getToken()) !== null) {
+        if (token !== '/') {
+          continue;
+        }
+        token = this.getToken();
+        switch (token) {
+          case 'CharStrings':
+            this.getToken();
+            this.getToken();
+            this.getToken();
+            this.getToken();
+            while (true) {
+              token = this.getToken();
+              if (token === null || token === 'end') {
+                break;
+              }
+              if (token !== '/') {
+                continue;
+              }
+              var glyph = this.getToken();
+              length = this.readInt();
+              this.getToken();
+              data = length > 0 ? stream.getBytes(length) : new Uint8Array(0);
+              lenIV = program.properties.privateData['lenIV'];
+              encoded = this.readCharStrings(data, lenIV);
+              this.nextChar();
+              token = this.getToken();
+              if (token === 'noaccess') {
+                this.getToken();
+              }
+              charstrings.push({
+                glyph: glyph,
+                encoded: encoded
+              });
+            }
+            break;
+          case 'Subrs':
+            this.readInt();
+            this.getToken();
+            while (this.getToken() === 'dup') {
+              var index = this.readInt();
+              length = this.readInt();
+              this.getToken();
+              data = length > 0 ? stream.getBytes(length) : new Uint8Array(0);
+              lenIV = program.properties.privateData['lenIV'];
+              encoded = this.readCharStrings(data, lenIV);
+              this.nextChar();
+              token = this.getToken();
+              if (token === 'noaccess') {
+                this.getToken();
+              }
+              subrs[index] = encoded;
+            }
+            break;
+          case 'BlueValues':
+          case 'OtherBlues':
+          case 'FamilyBlues':
+          case 'FamilyOtherBlues':
+            var blueArray = this.readNumberArray();
+            if (blueArray.length > 0 && blueArray.length % 2 === 0 && HINTING_ENABLED) {
+              program.properties.privateData[token] = blueArray;
+            }
+            break;
+          case 'StemSnapH':
+          case 'StemSnapV':
+            program.properties.privateData[token] = this.readNumberArray();
+            break;
+          case 'StdHW':
+          case 'StdVW':
+            program.properties.privateData[token] = this.readNumberArray()[0];
+            break;
+          case 'BlueShift':
+          case 'lenIV':
+          case 'BlueFuzz':
+          case 'BlueScale':
+          case 'LanguageGroup':
+          case 'ExpansionFactor':
+            program.properties.privateData[token] = this.readNumber();
+            break;
+          case 'ForceBold':
+            program.properties.privateData[token] = this.readBoolean();
+            break;
+        }
+      }
+      for (var i = 0; i < charstrings.length; i++) {
+        glyph = charstrings[i].glyph;
+        encoded = charstrings[i].encoded;
+        var charString = new Type1CharString();
+        var error = charString.convert(encoded, subrs, this.seacAnalysisEnabled);
+        var output = charString.output;
+        if (error) {
+          output = [14];
+        }
+        program.charstrings.push({
+          glyphName: glyph,
+          charstring: output,
+          width: charString.width,
+          lsb: charString.lsb,
+          seac: charString.seac
+        });
+      }
+      return program;
+    },
+    extractFontHeader: function Type1Parser_extractFontHeader(properties) {
+      var token;
+      while ((token = this.getToken()) !== null) {
+        if (token !== '/') {
+          continue;
+        }
+        token = this.getToken();
+        switch (token) {
+          case 'FontMatrix':
+            var matrix = this.readNumberArray();
+            properties.fontMatrix = matrix;
+            break;
+          case 'Encoding':
+            var encodingArg = this.getToken();
+            var encoding;
+            if (!/^\d+$/.test(encodingArg)) {
+              encoding = (0, _encodings.getEncoding)(encodingArg);
+            } else {
+              encoding = [];
+              var size = parseInt(encodingArg, 10) | 0;
+              this.getToken();
+              for (var j = 0; j < size; j++) {
+                token = this.getToken();
+                while (token !== 'dup' && token !== 'def') {
+                  token = this.getToken();
+                  if (token === null) {
+                    return;
+                  }
+                }
+                if (token === 'def') {
+                  break;
+                }
+                var index = this.readInt();
+                this.getToken();
+                var glyph = this.getToken();
+                encoding[index] = glyph;
+                this.getToken();
+              }
+            }
+            properties.builtInEncoding = encoding;
+            break;
+          case 'FontBBox':
+            var fontBBox = this.readNumberArray();
+            properties.ascent = Math.max(fontBBox[3], fontBBox[1]);
+            properties.descent = Math.min(fontBBox[1], fontBBox[3]);
+            properties.ascentScaled = true;
+            break;
+        }
+      }
+    }
+  };
+  return Type1Parser;
+}();
+exports.Type1Parser = Type1Parser;
+
+/***/ }),
+/* 165 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.getTilingPatternIR = exports.Pattern = undefined;
+
+var _util = __w_pdfjs_require__(2);
+
+var _colorspace = __w_pdfjs_require__(151);
+
+var _primitives = __w_pdfjs_require__(138);
+
+var ShadingType = {
+  FUNCTION_BASED: 1,
+  AXIAL: 2,
+  RADIAL: 3,
+  FREE_FORM_MESH: 4,
+  LATTICE_FORM_MESH: 5,
+  COONS_PATCH_MESH: 6,
+  TENSOR_PATCH_MESH: 7
+};
+var Pattern = function PatternClosure() {
+  function Pattern() {
+    (0, _util.unreachable)('should not call Pattern constructor');
+  }
+  Pattern.prototype = {
+    getPattern: function Pattern_getPattern(ctx) {
+      (0, _util.unreachable)('Should not call Pattern.getStyle: ' + ctx);
+    }
+  };
+  Pattern.parseShading = function (shading, matrix, xref, res, handler, pdfFunctionFactory) {
+    var dict = (0, _primitives.isStream)(shading) ? shading.dict : shading;
+    var type = dict.get('ShadingType');
+    try {
+      switch (type) {
+        case ShadingType.AXIAL:
+        case ShadingType.RADIAL:
+          return new Shadings.RadialAxial(dict, matrix, xref, res, pdfFunctionFactory);
+        case ShadingType.FREE_FORM_MESH:
+        case ShadingType.LATTICE_FORM_MESH:
+        case ShadingType.COONS_PATCH_MESH:
+        case ShadingType.TENSOR_PATCH_MESH:
+          return new Shadings.Mesh(shading, matrix, xref, res, pdfFunctionFactory);
+        default:
+          throw new _util.FormatError('Unsupported ShadingType: ' + type);
+      }
+    } catch (ex) {
+      if (ex instanceof _util.MissingDataException) {
+        throw ex;
+      }
+      handler.send('UnsupportedFeature', { featureId: _util.UNSUPPORTED_FEATURES.shadingPattern });
+      (0, _util.warn)(ex);
+      return new Shadings.Dummy();
+    }
+  };
+  return Pattern;
+}();
+var Shadings = {};
+Shadings.SMALL_NUMBER = 1e-6;
+Shadings.RadialAxial = function RadialAxialClosure() {
+  function RadialAxial(dict, matrix, xref, res, pdfFunctionFactory) {
+    this.matrix = matrix;
+    this.coordsArr = dict.getArray('Coords');
+    this.shadingType = dict.get('ShadingType');
+    this.type = 'Pattern';
+    var cs = dict.get('ColorSpace', 'CS');
+    cs = _colorspace.ColorSpace.parse(cs, xref, res, pdfFunctionFactory);
+    this.cs = cs;
+    var t0 = 0.0,
+        t1 = 1.0;
+    if (dict.has('Domain')) {
+      var domainArr = dict.getArray('Domain');
+      t0 = domainArr[0];
+      t1 = domainArr[1];
+    }
+    var extendStart = false,
+        extendEnd = false;
+    if (dict.has('Extend')) {
+      var extendArr = dict.getArray('Extend');
+      extendStart = extendArr[0];
+      extendEnd = extendArr[1];
+    }
+    if (this.shadingType === ShadingType.RADIAL && (!extendStart || !extendEnd)) {
+      var x1 = this.coordsArr[0];
+      var y1 = this.coordsArr[1];
+      var r1 = this.coordsArr[2];
+      var x2 = this.coordsArr[3];
+      var y2 = this.coordsArr[4];
+      var r2 = this.coordsArr[5];
+      var distance = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
+      if (r1 <= r2 + distance && r2 <= r1 + distance) {
+        (0, _util.warn)('Unsupported radial gradient.');
+      }
+    }
+    this.extendStart = extendStart;
+    this.extendEnd = extendEnd;
+    var fnObj = dict.get('Function');
+    var fn = pdfFunctionFactory.createFromArray(fnObj);
+    var diff = t1 - t0;
+    var step = diff / 10;
+    var colorStops = this.colorStops = [];
+    if (t0 >= t1 || step <= 0) {
+      (0, _util.info)('Bad shading domain.');
+      return;
+    }
+    var color = new Float32Array(cs.numComps),
+        ratio = new Float32Array(1);
+    var rgbColor;
+    for (var i = t0; i <= t1; i += step) {
+      ratio[0] = i;
+      fn(ratio, 0, color, 0);
+      rgbColor = cs.getRgb(color, 0);
+      var cssColor = _util.Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]);
+      colorStops.push([(i - t0) / diff, cssColor]);
+    }
+    var background = 'transparent';
+    if (dict.has('Background')) {
+      rgbColor = cs.getRgb(dict.get('Background'), 0);
+      background = _util.Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]);
+    }
+    if (!extendStart) {
+      colorStops.unshift([0, background]);
+      colorStops[1][0] += Shadings.SMALL_NUMBER;
+    }
+    if (!extendEnd) {
+      colorStops[colorStops.length - 1][0] -= Shadings.SMALL_NUMBER;
+      colorStops.push([1, background]);
+    }
+    this.colorStops = colorStops;
+  }
+  RadialAxial.prototype = {
+    getIR: function RadialAxial_getIR() {
+      var coordsArr = this.coordsArr;
+      var shadingType = this.shadingType;
+      var type, p0, p1, r0, r1;
+      if (shadingType === ShadingType.AXIAL) {
+        p0 = [coordsArr[0], coordsArr[1]];
+        p1 = [coordsArr[2], coordsArr[3]];
+        r0 = null;
+        r1 = null;
+        type = 'axial';
+      } else if (shadingType === ShadingType.RADIAL) {
+        p0 = [coordsArr[0], coordsArr[1]];
+        p1 = [coordsArr[3], coordsArr[4]];
+        r0 = coordsArr[2];
+        r1 = coordsArr[5];
+        type = 'radial';
+      } else {
+        (0, _util.unreachable)('getPattern type unknown: ' + shadingType);
+      }
+      var matrix = this.matrix;
+      if (matrix) {
+        p0 = _util.Util.applyTransform(p0, matrix);
+        p1 = _util.Util.applyTransform(p1, matrix);
+        if (shadingType === ShadingType.RADIAL) {
+          var scale = _util.Util.singularValueDecompose2dScale(matrix);
+          r0 *= scale[0];
+          r1 *= scale[1];
+        }
+      }
+      return ['RadialAxial', type, this.colorStops, p0, p1, r0, r1];
+    }
+  };
+  return RadialAxial;
+}();
+Shadings.Mesh = function MeshClosure() {
+  function MeshStreamReader(stream, context) {
+    this.stream = stream;
+    this.context = context;
+    this.buffer = 0;
+    this.bufferLength = 0;
+    var numComps = context.numComps;
+    this.tmpCompsBuf = new Float32Array(numComps);
+    var csNumComps = context.colorSpace.numComps;
+    this.tmpCsCompsBuf = context.colorFn ? new Float32Array(csNumComps) : this.tmpCompsBuf;
+  }
+  MeshStreamReader.prototype = {
+    get hasData() {
+      if (this.stream.end) {
+        return this.stream.pos < this.stream.end;
+      }
+      if (this.bufferLength > 0) {
+        return true;
+      }
+      var nextByte = this.stream.getByte();
+      if (nextByte < 0) {
+        return false;
+      }
+      this.buffer = nextByte;
+      this.bufferLength = 8;
+      return true;
+    },
+    readBits: function MeshStreamReader_readBits(n) {
+      var buffer = this.buffer;
+      var bufferLength = this.bufferLength;
+      if (n === 32) {
+        if (bufferLength === 0) {
+          return (this.stream.getByte() << 24 | this.stream.getByte() << 16 | this.stream.getByte() << 8 | this.stream.getByte()) >>> 0;
+        }
+        buffer = buffer << 24 | this.stream.getByte() << 16 | this.stream.getByte() << 8 | this.stream.getByte();
+        var nextByte = this.stream.getByte();
+        this.buffer = nextByte & (1 << bufferLength) - 1;
+        return (buffer << 8 - bufferLength | (nextByte & 0xFF) >> bufferLength) >>> 0;
+      }
+      if (n === 8 && bufferLength === 0) {
+        return this.stream.getByte();
+      }
+      while (bufferLength < n) {
+        buffer = buffer << 8 | this.stream.getByte();
+        bufferLength += 8;
+      }
+      bufferLength -= n;
+      this.bufferLength = bufferLength;
+      this.buffer = buffer & (1 << bufferLength) - 1;
+      return buffer >> bufferLength;
+    },
+    align: function MeshStreamReader_align() {
+      this.buffer = 0;
+      this.bufferLength = 0;
+    },
+    readFlag: function MeshStreamReader_readFlag() {
+      return this.readBits(this.context.bitsPerFlag);
+    },
+    readCoordinate: function MeshStreamReader_readCoordinate() {
+      var bitsPerCoordinate = this.context.bitsPerCoordinate;
+      var xi = this.readBits(bitsPerCoordinate);
+      var yi = this.readBits(bitsPerCoordinate);
+      var decode = this.context.decode;
+      var scale = bitsPerCoordinate < 32 ? 1 / ((1 << bitsPerCoordinate) - 1) : 2.3283064365386963e-10;
+      return [xi * scale * (decode[1] - decode[0]) + decode[0], yi * scale * (decode[3] - decode[2]) + decode[2]];
+    },
+    readComponents: function MeshStreamReader_readComponents() {
+      var numComps = this.context.numComps;
+      var bitsPerComponent = this.context.bitsPerComponent;
+      var scale = bitsPerComponent < 32 ? 1 / ((1 << bitsPerComponent) - 1) : 2.3283064365386963e-10;
+      var decode = this.context.decode;
+      var components = this.tmpCompsBuf;
+      for (var i = 0, j = 4; i < numComps; i++, j += 2) {
+        var ci = this.readBits(bitsPerComponent);
+        components[i] = ci * scale * (decode[j + 1] - decode[j]) + decode[j];
+      }
+      var color = this.tmpCsCompsBuf;
+      if (this.context.colorFn) {
+        this.context.colorFn(components, 0, color, 0);
+      }
+      return this.context.colorSpace.getRgb(color, 0);
+    }
+  };
+  function decodeType4Shading(mesh, reader) {
+    var coords = mesh.coords;
+    var colors = mesh.colors;
+    var operators = [];
+    var ps = [];
+    var verticesLeft = 0;
+    while (reader.hasData) {
+      var f = reader.readFlag();
+      var coord = reader.readCoordinate();
+      var color = reader.readComponents();
+      if (verticesLeft === 0) {
+        if (!(0 <= f && f <= 2)) {
+          throw new _util.FormatError('Unknown type4 flag');
+        }
+        switch (f) {
+          case 0:
+            verticesLeft = 3;
+            break;
+          case 1:
+            ps.push(ps[ps.length - 2], ps[ps.length - 1]);
+            verticesLeft = 1;
+            break;
+          case 2:
+            ps.push(ps[ps.length - 3], ps[ps.length - 1]);
+            verticesLeft = 1;
+            break;
+        }
+        operators.push(f);
+      }
+      ps.push(coords.length);
+      coords.push(coord);
+      colors.push(color);
+      verticesLeft--;
+      reader.align();
+    }
+    mesh.figures.push({
+      type: 'triangles',
+      coords: new Int32Array(ps),
+      colors: new Int32Array(ps)
+    });
+  }
+  function decodeType5Shading(mesh, reader, verticesPerRow) {
+    var coords = mesh.coords;
+    var colors = mesh.colors;
+    var ps = [];
+    while (reader.hasData) {
+      var coord = reader.readCoordinate();
+      var color = reader.readComponents();
+      ps.push(coords.length);
+      coords.push(coord);
+      colors.push(color);
+    }
+    mesh.figures.push({
+      type: 'lattice',
+      coords: new Int32Array(ps),
+      colors: new Int32Array(ps),
+      verticesPerRow: verticesPerRow
+    });
+  }
+  var MIN_SPLIT_PATCH_CHUNKS_AMOUNT = 3;
+  var MAX_SPLIT_PATCH_CHUNKS_AMOUNT = 20;
+  var TRIANGLE_DENSITY = 20;
+  var getB = function getBClosure() {
+    function buildB(count) {
+      var lut = [];
+      for (var i = 0; i <= count; i++) {
+        var t = i / count,
+            t_ = 1 - t;
+        lut.push(new Float32Array([t_ * t_ * t_, 3 * t * t_ * t_, 3 * t * t * t_, t * t * t]));
+      }
+      return lut;
+    }
+    var cache = [];
+    return function getB(count) {
+      if (!cache[count]) {
+        cache[count] = buildB(count);
+      }
+      return cache[count];
+    };
+  }();
+  function buildFigureFromPatch(mesh, index) {
+    var figure = mesh.figures[index];
+    (0, _util.assert)(figure.type === 'patch', 'Unexpected patch mesh figure');
+    var coords = mesh.coords,
+        colors = mesh.colors;
+    var pi = figure.coords;
+    var ci = figure.colors;
+    var figureMinX = Math.min(coords[pi[0]][0], coords[pi[3]][0], coords[pi[12]][0], coords[pi[15]][0]);
+    var figureMinY = Math.min(coords[pi[0]][1], coords[pi[3]][1], coords[pi[12]][1], coords[pi[15]][1]);
+    var figureMaxX = Math.max(coords[pi[0]][0], coords[pi[3]][0], coords[pi[12]][0], coords[pi[15]][0]);
+    var figureMaxY = Math.max(coords[pi[0]][1], coords[pi[3]][1], coords[pi[12]][1], coords[pi[15]][1]);
+    var splitXBy = Math.ceil((figureMaxX - figureMinX) * TRIANGLE_DENSITY / (mesh.bounds[2] - mesh.bounds[0]));
+    splitXBy = Math.max(MIN_SPLIT_PATCH_CHUNKS_AMOUNT, Math.min(MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitXBy));
+    var splitYBy = Math.ceil((figureMaxY - figureMinY) * TRIANGLE_DENSITY / (mesh.bounds[3] - mesh.bounds[1]));
+    splitYBy = Math.max(MIN_SPLIT_PATCH_CHUNKS_AMOUNT, Math.min(MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitYBy));
+    var verticesPerRow = splitXBy + 1;
+    var figureCoords = new Int32Array((splitYBy + 1) * verticesPerRow);
+    var figureColors = new Int32Array((splitYBy + 1) * verticesPerRow);
+    var k = 0;
+    var cl = new Uint8Array(3),
+        cr = new Uint8Array(3);
+    var c0 = colors[ci[0]],
+        c1 = colors[ci[1]],
+        c2 = colors[ci[2]],
+        c3 = colors[ci[3]];
+    var bRow = getB(splitYBy),
+        bCol = getB(splitXBy);
+    for (var row = 0; row <= splitYBy; row++) {
+      cl[0] = (c0[0] * (splitYBy - row) + c2[0] * row) / splitYBy | 0;
+      cl[1] = (c0[1] * (splitYBy - row) + c2[1] * row) / splitYBy | 0;
+      cl[2] = (c0[2] * (splitYBy - row) + c2[2] * row) / splitYBy | 0;
+      cr[0] = (c1[0] * (splitYBy - row) + c3[0] * row) / splitYBy | 0;
+      cr[1] = (c1[1] * (splitYBy - row) + c3[1] * row) / splitYBy | 0;
+      cr[2] = (c1[2] * (splitYBy - row) + c3[2] * row) / splitYBy | 0;
+      for (var col = 0; col <= splitXBy; col++, k++) {
+        if ((row === 0 || row === splitYBy) && (col === 0 || col === splitXBy)) {
+          continue;
+        }
+        var x = 0,
+            y = 0;
+        var q = 0;
+        for (var i = 0; i <= 3; i++) {
+          for (var j = 0; j <= 3; j++, q++) {
+            var m = bRow[row][i] * bCol[col][j];
+            x += coords[pi[q]][0] * m;
+            y += coords[pi[q]][1] * m;
+          }
+        }
+        figureCoords[k] = coords.length;
+        coords.push([x, y]);
+        figureColors[k] = colors.length;
+        var newColor = new Uint8Array(3);
+        newColor[0] = (cl[0] * (splitXBy - col) + cr[0] * col) / splitXBy | 0;
+        newColor[1] = (cl[1] * (splitXBy - col) + cr[1] * col) / splitXBy | 0;
+        newColor[2] = (cl[2] * (splitXBy - col) + cr[2] * col) / splitXBy | 0;
+        colors.push(newColor);
+      }
+    }
+    figureCoords[0] = pi[0];
+    figureColors[0] = ci[0];
+    figureCoords[splitXBy] = pi[3];
+    figureColors[splitXBy] = ci[1];
+    figureCoords[verticesPerRow * splitYBy] = pi[12];
+    figureColors[verticesPerRow * splitYBy] = ci[2];
+    figureCoords[verticesPerRow * splitYBy + splitXBy] = pi[15];
+    figureColors[verticesPerRow * splitYBy + splitXBy] = ci[3];
+    mesh.figures[index] = {
+      type: 'lattice',
+      coords: figureCoords,
+      colors: figureColors,
+      verticesPerRow: verticesPerRow
+    };
+  }
+  function decodeType6Shading(mesh, reader) {
+    var coords = mesh.coords;
+    var colors = mesh.colors;
+    var ps = new Int32Array(16);
+    var cs = new Int32Array(4);
+    while (reader.hasData) {
+      var f = reader.readFlag();
+      if (!(0 <= f && f <= 3)) {
+        throw new _util.FormatError('Unknown type6 flag');
+      }
+      var i, ii;
+      var pi = coords.length;
+      for (i = 0, ii = f !== 0 ? 8 : 12; i < ii; i++) {
+        coords.push(reader.readCoordinate());
+      }
+      var ci = colors.length;
+      for (i = 0, ii = f !== 0 ? 2 : 4; i < ii; i++) {
+        colors.push(reader.readComponents());
+      }
+      var tmp1, tmp2, tmp3, tmp4;
+      switch (f) {
+        case 0:
+          ps[12] = pi + 3;
+          ps[13] = pi + 4;
+          ps[14] = pi + 5;
+          ps[15] = pi + 6;
+          ps[8] = pi + 2;
+          ps[11] = pi + 7;
+          ps[4] = pi + 1;
+          ps[7] = pi + 8;
+          ps[0] = pi;
+          ps[1] = pi + 11;
+          ps[2] = pi + 10;
+          ps[3] = pi + 9;
+          cs[2] = ci + 1;
+          cs[3] = ci + 2;
+          cs[0] = ci;
+          cs[1] = ci + 3;
+          break;
+        case 1:
+          tmp1 = ps[12];
+          tmp2 = ps[13];
+          tmp3 = ps[14];
+          tmp4 = ps[15];
+          ps[12] = tmp4;
+          ps[13] = pi + 0;
+          ps[14] = pi + 1;
+          ps[15] = pi + 2;
+          ps[8] = tmp3;
+          ps[11] = pi + 3;
+          ps[4] = tmp2;
+          ps[7] = pi + 4;
+          ps[0] = tmp1;
+          ps[1] = pi + 7;
+          ps[2] = pi + 6;
+          ps[3] = pi + 5;
+          tmp1 = cs[2];
+          tmp2 = cs[3];
+          cs[2] = tmp2;
+          cs[3] = ci;
+          cs[0] = tmp1;
+          cs[1] = ci + 1;
+          break;
+        case 2:
+          tmp1 = ps[15];
+          tmp2 = ps[11];
+          ps[12] = ps[3];
+          ps[13] = pi + 0;
+          ps[14] = pi + 1;
+          ps[15] = pi + 2;
+          ps[8] = ps[7];
+          ps[11] = pi + 3;
+          ps[4] = tmp2;
+          ps[7] = pi + 4;
+          ps[0] = tmp1;
+          ps[1] = pi + 7;
+          ps[2] = pi + 6;
+          ps[3] = pi + 5;
+          tmp1 = cs[3];
+          cs[2] = cs[1];
+          cs[3] = ci;
+          cs[0] = tmp1;
+          cs[1] = ci + 1;
+          break;
+        case 3:
+          ps[12] = ps[0];
+          ps[13] = pi + 0;
+          ps[14] = pi + 1;
+          ps[15] = pi + 2;
+          ps[8] = ps[1];
+          ps[11] = pi + 3;
+          ps[4] = ps[2];
+          ps[7] = pi + 4;
+          ps[0] = ps[3];
+          ps[1] = pi + 7;
+          ps[2] = pi + 6;
+          ps[3] = pi + 5;
+          cs[2] = cs[0];
+          cs[3] = ci;
+          cs[0] = cs[1];
+          cs[1] = ci + 1;
+          break;
+      }
+      ps[5] = coords.length;
+      coords.push([(-4 * coords[ps[0]][0] - coords[ps[15]][0] + 6 * (coords[ps[4]][0] + coords[ps[1]][0]) - 2 * (coords[ps[12]][0] + coords[ps[3]][0]) + 3 * (coords[ps[13]][0] + coords[ps[7]][0])) / 9, (-4 * coords[ps[0]][1] - coords[ps[15]][1] + 6 * (coords[ps[4]][1] + coords[ps[1]][1]) - 2 * (coords[ps[12]][1] + coords[ps[3]][1]) + 3 * (coords[ps[13]][1] + coords[ps[7]][1])) / 9]);
+      ps[6] = coords.length;
+      coords.push([(-4 * coords[ps[3]][0] - coords[ps[12]][0] + 6 * (coords[ps[2]][0] + coords[ps[7]][0]) - 2 * (coords[ps[0]][0] + coords[ps[15]][0]) + 3 * (coords[ps[4]][0] + coords[ps[14]][0])) / 9, (-4 * coords[ps[3]][1] - coords[ps[12]][1] + 6 * (coords[ps[2]][1] + coords[ps[7]][1]) - 2 * (coords[ps[0]][1] + coords[ps[15]][1]) + 3 * (coords[ps[4]][1] + coords[ps[14]][1])) / 9]);
+      ps[9] = coords.length;
+      coords.push([(-4 * coords[ps[12]][0] - coords[ps[3]][0] + 6 * (coords[ps[8]][0] + coords[ps[13]][0]) - 2 * (coords[ps[0]][0] + coords[ps[15]][0]) + 3 * (coords[ps[11]][0] + coords[ps[1]][0])) / 9, (-4 * coords[ps[12]][1] - coords[ps[3]][1] + 6 * (coords[ps[8]][1] + coords[ps[13]][1]) - 2 * (coords[ps[0]][1] + coords[ps[15]][1]) + 3 * (coords[ps[11]][1] + coords[ps[1]][1])) / 9]);
+      ps[10] = coords.length;
+      coords.push([(-4 * coords[ps[15]][0] - coords[ps[0]][0] + 6 * (coords[ps[11]][0] + coords[ps[14]][0]) - 2 * (coords[ps[12]][0] + coords[ps[3]][0]) + 3 * (coords[ps[2]][0] + coords[ps[8]][0])) / 9, (-4 * coords[ps[15]][1] - coords[ps[0]][1] + 6 * (coords[ps[11]][1] + coords[ps[14]][1]) - 2 * (coords[ps[12]][1] + coords[ps[3]][1]) + 3 * (coords[ps[2]][1] + coords[ps[8]][1])) / 9]);
+      mesh.figures.push({
+        type: 'patch',
+        coords: new Int32Array(ps),
+        colors: new Int32Array(cs)
+      });
+    }
+  }
+  function decodeType7Shading(mesh, reader) {
+    var coords = mesh.coords;
+    var colors = mesh.colors;
+    var ps = new Int32Array(16);
+    var cs = new Int32Array(4);
+    while (reader.hasData) {
+      var f = reader.readFlag();
+      if (!(0 <= f && f <= 3)) {
+        throw new _util.FormatError('Unknown type7 flag');
+      }
+      var i, ii;
+      var pi = coords.length;
+      for (i = 0, ii = f !== 0 ? 12 : 16; i < ii; i++) {
+        coords.push(reader.readCoordinate());
+      }
+      var ci = colors.length;
+      for (i = 0, ii = f !== 0 ? 2 : 4; i < ii; i++) {
+        colors.push(reader.readComponents());
+      }
+      var tmp1, tmp2, tmp3, tmp4;
+      switch (f) {
+        case 0:
+          ps[12] = pi + 3;
+          ps[13] = pi + 4;
+          ps[14] = pi + 5;
+          ps[15] = pi + 6;
+          ps[8] = pi + 2;
+          ps[9] = pi + 13;
+          ps[10] = pi + 14;
+          ps[11] = pi + 7;
+          ps[4] = pi + 1;
+          ps[5] = pi + 12;
+          ps[6] = pi + 15;
+          ps[7] = pi + 8;
+          ps[0] = pi;
+          ps[1] = pi + 11;
+          ps[2] = pi + 10;
+          ps[3] = pi + 9;
+          cs[2] = ci + 1;
+          cs[3] = ci + 2;
+          cs[0] = ci;
+          cs[1] = ci + 3;
+          break;
+        case 1:
+          tmp1 = ps[12];
+          tmp2 = ps[13];
+          tmp3 = ps[14];
+          tmp4 = ps[15];
+          ps[12] = tmp4;
+          ps[13] = pi + 0;
+          ps[14] = pi + 1;
+          ps[15] = pi + 2;
+          ps[8] = tmp3;
+          ps[9] = pi + 9;
+          ps[10] = pi + 10;
+          ps[11] = pi + 3;
+          ps[4] = tmp2;
+          ps[5] = pi + 8;
+          ps[6] = pi + 11;
+          ps[7] = pi + 4;
+          ps[0] = tmp1;
+          ps[1] = pi + 7;
+          ps[2] = pi + 6;
+          ps[3] = pi + 5;
+          tmp1 = cs[2];
+          tmp2 = cs[3];
+          cs[2] = tmp2;
+          cs[3] = ci;
+          cs[0] = tmp1;
+          cs[1] = ci + 1;
+          break;
+        case 2:
+          tmp1 = ps[15];
+          tmp2 = ps[11];
+          ps[12] = ps[3];
+          ps[13] = pi + 0;
+          ps[14] = pi + 1;
+          ps[15] = pi + 2;
+          ps[8] = ps[7];
+          ps[9] = pi + 9;
+          ps[10] = pi + 10;
+          ps[11] = pi + 3;
+          ps[4] = tmp2;
+          ps[5] = pi + 8;
+          ps[6] = pi + 11;
+          ps[7] = pi + 4;
+          ps[0] = tmp1;
+          ps[1] = pi + 7;
+          ps[2] = pi + 6;
+          ps[3] = pi + 5;
+          tmp1 = cs[3];
+          cs[2] = cs[1];
+          cs[3] = ci;
+          cs[0] = tmp1;
+          cs[1] = ci + 1;
+          break;
+        case 3:
+          ps[12] = ps[0];
+          ps[13] = pi + 0;
+          ps[14] = pi + 1;
+          ps[15] = pi + 2;
+          ps[8] = ps[1];
+          ps[9] = pi + 9;
+          ps[10] = pi + 10;
+          ps[11] = pi + 3;
+          ps[4] = ps[2];
+          ps[5] = pi + 8;
+          ps[6] = pi + 11;
+          ps[7] = pi + 4;
+          ps[0] = ps[3];
+          ps[1] = pi + 7;
+          ps[2] = pi + 6;
+          ps[3] = pi + 5;
+          cs[2] = cs[0];
+          cs[3] = ci;
+          cs[0] = cs[1];
+          cs[1] = ci + 1;
+          break;
+      }
+      mesh.figures.push({
+        type: 'patch',
+        coords: new Int32Array(ps),
+        colors: new Int32Array(cs)
+      });
+    }
+  }
+  function updateBounds(mesh) {
+    var minX = mesh.coords[0][0],
+        minY = mesh.coords[0][1],
+        maxX = minX,
+        maxY = minY;
+    for (var i = 1, ii = mesh.coords.length; i < ii; i++) {
+      var x = mesh.coords[i][0],
+          y = mesh.coords[i][1];
+      minX = minX > x ? x : minX;
+      minY = minY > y ? y : minY;
+      maxX = maxX < x ? x : maxX;
+      maxY = maxY < y ? y : maxY;
+    }
+    mesh.bounds = [minX, minY, maxX, maxY];
+  }
+  function packData(mesh) {
+    var i, ii, j, jj;
+    var coords = mesh.coords;
+    var coordsPacked = new Float32Array(coords.length * 2);
+    for (i = 0, j = 0, ii = coords.length; i < ii; i++) {
+      var xy = coords[i];
+      coordsPacked[j++] = xy[0];
+      coordsPacked[j++] = xy[1];
+    }
+    mesh.coords = coordsPacked;
+    var colors = mesh.colors;
+    var colorsPacked = new Uint8Array(colors.length * 3);
+    for (i = 0, j = 0, ii = colors.length; i < ii; i++) {
+      var c = colors[i];
+      colorsPacked[j++] = c[0];
+      colorsPacked[j++] = c[1];
+      colorsPacked[j++] = c[2];
+    }
+    mesh.colors = colorsPacked;
+    var figures = mesh.figures;
+    for (i = 0, ii = figures.length; i < ii; i++) {
+      var figure = figures[i],
+          ps = figure.coords,
+          cs = figure.colors;
+      for (j = 0, jj = ps.length; j < jj; j++) {
+        ps[j] *= 2;
+        cs[j] *= 3;
+      }
+    }
+  }
+  function Mesh(stream, matrix, xref, res, pdfFunctionFactory) {
+    if (!(0, _primitives.isStream)(stream)) {
+      throw new _util.FormatError('Mesh data is not a stream');
+    }
+    var dict = stream.dict;
+    this.matrix = matrix;
+    this.shadingType = dict.get('ShadingType');
+    this.type = 'Pattern';
+    this.bbox = dict.getArray('BBox');
+    var cs = dict.get('ColorSpace', 'CS');
+    cs = _colorspace.ColorSpace.parse(cs, xref, res, pdfFunctionFactory);
+    this.cs = cs;
+    this.background = dict.has('Background') ? cs.getRgb(dict.get('Background'), 0) : null;
+    var fnObj = dict.get('Function');
+    var fn = fnObj ? pdfFunctionFactory.createFromArray(fnObj) : null;
+    this.coords = [];
+    this.colors = [];
+    this.figures = [];
+    var decodeContext = {
+      bitsPerCoordinate: dict.get('BitsPerCoordinate'),
+      bitsPerComponent: dict.get('BitsPerComponent'),
+      bitsPerFlag: dict.get('BitsPerFlag'),
+      decode: dict.getArray('Decode'),
+      colorFn: fn,
+      colorSpace: cs,
+      numComps: fn ? 1 : cs.numComps
+    };
+    var reader = new MeshStreamReader(stream, decodeContext);
+    var patchMesh = false;
+    switch (this.shadingType) {
+      case ShadingType.FREE_FORM_MESH:
+        decodeType4Shading(this, reader);
+        break;
+      case ShadingType.LATTICE_FORM_MESH:
+        var verticesPerRow = dict.get('VerticesPerRow') | 0;
+        if (verticesPerRow < 2) {
+          throw new _util.FormatError('Invalid VerticesPerRow');
+        }
+        decodeType5Shading(this, reader, verticesPerRow);
+        break;
+      case ShadingType.COONS_PATCH_MESH:
+        decodeType6Shading(this, reader);
+        patchMesh = true;
+        break;
+      case ShadingType.TENSOR_PATCH_MESH:
+        decodeType7Shading(this, reader);
+        patchMesh = true;
+        break;
+      default:
+        (0, _util.unreachable)('Unsupported mesh type.');
+        break;
+    }
+    if (patchMesh) {
+      updateBounds(this);
+      for (var i = 0, ii = this.figures.length; i < ii; i++) {
+        buildFigureFromPatch(this, i);
+      }
+    }
+    updateBounds(this);
+    packData(this);
+  }
+  Mesh.prototype = {
+    getIR: function Mesh_getIR() {
+      return ['Mesh', this.shadingType, this.coords, this.colors, this.figures, this.bounds, this.matrix, this.bbox, this.background];
+    }
+  };
+  return Mesh;
+}();
+Shadings.Dummy = function DummyClosure() {
+  function Dummy() {
+    this.type = 'Pattern';
+  }
+  Dummy.prototype = {
+    getIR: function Dummy_getIR() {
+      return ['Dummy'];
+    }
+  };
+  return Dummy;
+}();
+function getTilingPatternIR(operatorList, dict, args) {
+  var matrix = dict.getArray('Matrix');
+  var bbox = _util.Util.normalizeRect(dict.getArray('BBox'));
+  var xstep = dict.get('XStep');
+  var ystep = dict.get('YStep');
+  var paintType = dict.get('PaintType');
+  var tilingType = dict.get('TilingType');
+  if (bbox[2] - bbox[0] === 0 || bbox[3] - bbox[1] === 0) {
+    throw new _util.FormatError('Invalid getTilingPatternIR /BBox array: [' + bbox + '].');
+  }
+  return ['TilingPattern', args, operatorList, matrix, bbox, xstep, ystep, paintType, tilingType];
+}
+exports.Pattern = Pattern;
+exports.getTilingPatternIR = getTilingPatternIR;
+
+/***/ }),
+/* 166 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.bidi = undefined;
+
+var _util = __w_pdfjs_require__(2);
+
+var baseTypes = ['BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'S', 'B', 'S', 'WS', 'B', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'B', 'B', 'B', 'S', 'WS', 'ON', 'ON', 'ET', 'ET', 'ET', 'ON', 'ON', 'ON', 'ON', 'ON', 'ES', 'CS', 'ES', 'CS', 'CS', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'CS', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'ON', 'ON', 'ON', 'ON', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'B', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'CS', 'ON', 'ET', 'ET', 'ET', 'ET', 'ON', 'ON', 'ON', 'ON', 'L', 'ON', 'ON', 'BN', 'ON', 'ON', 'ET', 'ET', 'EN', 'EN', 'ON', 'L', 'ON', 'ON', 'ON', 'EN', 'L', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L'];
+var arabicTypes = ['AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'ON', 'ON', 'AL', 'ET', 'ET', 'AL', 'CS', 'AL', 'ON', 'ON', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AL', 'AL', '', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'ET', 'AN', 'AN', 'AL', 'AL', 'AL', 'NSM', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AN', 'ON', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AL', 'AL', 'NSM', 'NSM', 'ON', 'NSM', 'NSM', 'NSM', 'NSM', 'AL', 'AL', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL'];
+function isOdd(i) {
+  return (i & 1) !== 0;
+}
+function isEven(i) {
+  return (i & 1) === 0;
+}
+function findUnequal(arr, start, value) {
+  for (var j = start, jj = arr.length; j < jj; ++j) {
+    if (arr[j] !== value) {
+      return j;
+    }
+  }
+  return j;
+}
+function setValues(arr, start, end, value) {
+  for (var j = start; j < end; ++j) {
+    arr[j] = value;
+  }
+}
+function reverseValues(arr, start, end) {
+  for (var i = start, j = end - 1; i < j; ++i, --j) {
+    var temp = arr[i];
+    arr[i] = arr[j];
+    arr[j] = temp;
+  }
+}
+function createBidiText(str, isLTR, vertical) {
+  return {
+    str: str,
+    dir: vertical ? 'ttb' : isLTR ? 'ltr' : 'rtl'
+  };
+}
+var chars = [];
+var types = [];
+function bidi(str, startLevel, vertical) {
+  var isLTR = true;
+  var strLength = str.length;
+  if (strLength === 0 || vertical) {
+    return createBidiText(str, isLTR, vertical);
+  }
+  chars.length = strLength;
+  types.length = strLength;
+  var numBidi = 0;
+  var i, ii;
+  for (i = 0; i < strLength; ++i) {
+    chars[i] = str.charAt(i);
+    var charCode = str.charCodeAt(i);
+    var charType = 'L';
+    if (charCode <= 0x00ff) {
+      charType = baseTypes[charCode];
+    } else if (0x0590 <= charCode && charCode <= 0x05f4) {
+      charType = 'R';
+    } else if (0x0600 <= charCode && charCode <= 0x06ff) {
+      charType = arabicTypes[charCode & 0xff];
+      if (!charType) {
+        (0, _util.warn)('Bidi: invalid Unicode character ' + charCode.toString(16));
+      }
+    } else if (0x0700 <= charCode && charCode <= 0x08AC) {
+      charType = 'AL';
+    }
+    if (charType === 'R' || charType === 'AL' || charType === 'AN') {
+      numBidi++;
+    }
+    types[i] = charType;
+  }
+  if (numBidi === 0) {
+    isLTR = true;
+    return createBidiText(str, isLTR);
+  }
+  if (startLevel === -1) {
+    if (numBidi / strLength < 0.3) {
+      isLTR = true;
+      startLevel = 0;
+    } else {
+      isLTR = false;
+      startLevel = 1;
+    }
+  }
+  var levels = [];
+  for (i = 0; i < strLength; ++i) {
+    levels[i] = startLevel;
+  }
+  var e = isOdd(startLevel) ? 'R' : 'L';
+  var sor = e;
+  var eor = sor;
+  var lastType = sor;
+  for (i = 0; i < strLength; ++i) {
+    if (types[i] === 'NSM') {
+      types[i] = lastType;
+    } else {
+      lastType = types[i];
+    }
+  }
+  lastType = sor;
+  var t;
+  for (i = 0; i < strLength; ++i) {
+    t = types[i];
+    if (t === 'EN') {
+      types[i] = lastType === 'AL' ? 'AN' : 'EN';
+    } else if (t === 'R' || t === 'L' || t === 'AL') {
+      lastType = t;
+    }
+  }
+  for (i = 0; i < strLength; ++i) {
+    t = types[i];
+    if (t === 'AL') {
+      types[i] = 'R';
+    }
+  }
+  for (i = 1; i < strLength - 1; ++i) {
+    if (types[i] === 'ES' && types[i - 1] === 'EN' && types[i + 1] === 'EN') {
+      types[i] = 'EN';
+    }
+    if (types[i] === 'CS' && (types[i - 1] === 'EN' || types[i - 1] === 'AN') && types[i + 1] === types[i - 1]) {
+      types[i] = types[i - 1];
+    }
+  }
+  for (i = 0; i < strLength; ++i) {
+    if (types[i] === 'EN') {
+      var j;
+      for (j = i - 1; j >= 0; --j) {
+        if (types[j] !== 'ET') {
+          break;
+        }
+        types[j] = 'EN';
+      }
+      for (j = i + 1; j < strLength; ++j) {
+        if (types[j] !== 'ET') {
+          break;
+        }
+        types[j] = 'EN';
+      }
+    }
+  }
+  for (i = 0; i < strLength; ++i) {
+    t = types[i];
+    if (t === 'WS' || t === 'ES' || t === 'ET' || t === 'CS') {
+      types[i] = 'ON';
+    }
+  }
+  lastType = sor;
+  for (i = 0; i < strLength; ++i) {
+    t = types[i];
+    if (t === 'EN') {
+      types[i] = lastType === 'L' ? 'L' : 'EN';
+    } else if (t === 'R' || t === 'L') {
+      lastType = t;
+    }
+  }
+  for (i = 0; i < strLength; ++i) {
+    if (types[i] === 'ON') {
+      var end = findUnequal(types, i + 1, 'ON');
+      var before = sor;
+      if (i > 0) {
+        before = types[i - 1];
+      }
+      var after = eor;
+      if (end + 1 < strLength) {
+        after = types[end + 1];
+      }
+      if (before !== 'L') {
+        before = 'R';
+      }
+      if (after !== 'L') {
+        after = 'R';
+      }
+      if (before === after) {
+        setValues(types, i, end, before);
+      }
+      i = end - 1;
+    }
+  }
+  for (i = 0; i < strLength; ++i) {
+    if (types[i] === 'ON') {
+      types[i] = e;
+    }
+  }
+  for (i = 0; i < strLength; ++i) {
+    t = types[i];
+    if (isEven(levels[i])) {
+      if (t === 'R') {
+        levels[i] += 1;
+      } else if (t === 'AN' || t === 'EN') {
+        levels[i] += 2;
+      }
+    } else {
+      if (t === 'L' || t === 'AN' || t === 'EN') {
+        levels[i] += 1;
+      }
+    }
+  }
+  var highestLevel = -1;
+  var lowestOddLevel = 99;
+  var level;
+  for (i = 0, ii = levels.length; i < ii; ++i) {
+    level = levels[i];
+    if (highestLevel < level) {
+      highestLevel = level;
+    }
+    if (lowestOddLevel > level && isOdd(level)) {
+      lowestOddLevel = level;
+    }
+  }
+  for (level = highestLevel; level >= lowestOddLevel; --level) {
+    var start = -1;
+    for (i = 0, ii = levels.length; i < ii; ++i) {
+      if (levels[i] < level) {
+        if (start >= 0) {
+          reverseValues(chars, start, i);
+          start = -1;
+        }
+      } else if (start < 0) {
+        start = i;
+      }
+    }
+    if (start >= 0) {
+      reverseValues(chars, start, levels.length);
+    }
+  }
+  for (i = 0, ii = chars.length; i < ii; ++i) {
+    var ch = chars[i];
+    if (ch === '<' || ch === '>') {
+      chars[i] = '';
+    }
+  }
+  return createBidiText(chars.join(''), isLTR);
+}
+exports.bidi = bidi;
+
+/***/ }),
+/* 167 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.getMetrics = undefined;
+
+var _util = __w_pdfjs_require__(2);
+
+var getMetrics = (0, _util.getLookupTableFactory)(function (t) {
+  t['Courier'] = 600;
+  t['Courier-Bold'] = 600;
+  t['Courier-BoldOblique'] = 600;
+  t['Courier-Oblique'] = 600;
+  t['Helvetica'] = (0, _util.getLookupTableFactory)(function (t) {
+    t['space'] = 278;
+    t['exclam'] = 278;
+    t['quotedbl'] = 355;
+    t['numbersign'] = 556;
+    t['dollar'] = 556;
+    t['percent'] = 889;
+    t['ampersand'] = 667;
+    t['quoteright'] = 222;
+    t['parenleft'] = 333;
+    t['parenright'] = 333;
+    t['asterisk'] = 389;
+    t['plus'] = 584;
+    t['comma'] = 278;
+    t['hyphen'] = 333;
+    t['period'] = 278;
+    t['slash'] = 278;
+    t['zero'] = 556;
+    t['one'] = 556;
+    t['two'] = 556;
+    t['three'] = 556;
+    t['four'] = 556;
+    t['five'] = 556;
+    t['six'] = 556;
+    t['seven'] = 556;
+    t['eight'] = 556;
+    t['nine'] = 556;
+    t['colon'] = 278;
+    t['semicolon'] = 278;
+    t['less'] = 584;
+    t['equal'] = 584;
+    t['greater'] = 584;
+    t['question'] = 556;
+    t['at'] = 1015;
+    t['A'] = 667;
+    t['B'] = 667;
+    t['C'] = 722;
+    t['D'] = 722;
+    t['E'] = 667;
+    t['F'] = 611;
+    t['G'] = 778;
+    t['H'] = 722;
+    t['I'] = 278;
+    t['J'] = 500;
+    t['K'] = 667;
+    t['L'] = 556;
+    t['M'] = 833;
+    t['N'] = 722;
+    t['O'] = 778;
+    t['P'] = 667;
+    t['Q'] = 778;
+    t['R'] = 722;
+    t['S'] = 667;
+    t['T'] = 611;
+    t['U'] = 722;
+    t['V'] = 667;
+    t['W'] = 944;
+    t['X'] = 667;
+    t['Y'] = 667;
+    t['Z'] = 611;
+    t['bracketleft'] = 278;
+    t['backslash'] = 278;
+    t['bracketright'] = 278;
+    t['asciicircum'] = 469;
+    t['underscore'] = 556;
+    t['quoteleft'] = 222;
+    t['a'] = 556;
+    t['b'] = 556;
+    t['c'] = 500;
+    t['d'] = 556;
+    t['e'] = 556;
+    t['f'] = 278;
+    t['g'] = 556;
+    t['h'] = 556;
+    t['i'] = 222;
+    t['j'] = 222;
+    t['k'] = 500;
+    t['l'] = 222;
+    t['m'] = 833;
+    t['n'] = 556;
+    t['o'] = 556;
+    t['p'] = 556;
+    t['q'] = 556;
+    t['r'] = 333;
+    t['s'] = 500;
+    t['t'] = 278;
+    t['u'] = 556;
+    t['v'] = 500;
+    t['w'] = 722;
+    t['x'] = 500;
+    t['y'] = 500;
+    t['z'] = 500;
+    t['braceleft'] = 334;
+    t['bar'] = 260;
+    t['braceright'] = 334;
+    t['asciitilde'] = 584;
+    t['exclamdown'] = 333;
+    t['cent'] = 556;
+    t['sterling'] = 556;
+    t['fraction'] = 167;
+    t['yen'] = 556;
+    t['florin'] = 556;
+    t['section'] = 556;
+    t['currency'] = 556;
+    t['quotesingle'] = 191;
+    t['quotedblleft'] = 333;
+    t['guillemotleft'] = 556;
+    t['guilsinglleft'] = 333;
+    t['guilsinglright'] = 333;
+    t['fi'] = 500;
+    t['fl'] = 500;
+    t['endash'] = 556;
+    t['dagger'] = 556;
+    t['daggerdbl'] = 556;
+    t['periodcentered'] = 278;
+    t['paragraph'] = 537;
+    t['bullet'] = 350;
+    t['quotesinglbase'] = 222;
+    t['quotedblbase'] = 333;
+    t['quotedblright'] = 333;
+    t['guillemotright'] = 556;
+    t['ellipsis'] = 1000;
+    t['perthousand'] = 1000;
+    t['questiondown'] = 611;
+    t['grave'] = 333;
+    t['acute'] = 333;
+    t['circumflex'] = 333;
+    t['tilde'] = 333;
+    t['macron'] = 333;
+    t['breve'] = 333;
+    t['dotaccent'] = 333;
+    t['dieresis'] = 333;
+    t['ring'] = 333;
+    t['cedilla'] = 333;
+    t['hungarumlaut'] = 333;
+    t['ogonek'] = 333;
+    t['caron'] = 333;
+    t['emdash'] = 1000;
+    t['AE'] = 1000;
+    t['ordfeminine'] = 370;
+    t['Lslash'] = 556;
+    t['Oslash'] = 778;
+    t['OE'] = 1000;
+    t['ordmasculine'] = 365;
+    t['ae'] = 889;
+    t['dotlessi'] = 278;
+    t['lslash'] = 222;
+    t['oslash'] = 611;
+    t['oe'] = 944;
+    t['germandbls'] = 611;
+    t['Idieresis'] = 278;
+    t['eacute'] = 556;
+    t['abreve'] = 556;
+    t['uhungarumlaut'] = 556;
+    t['ecaron'] = 556;
+    t['Ydieresis'] = 667;
+    t['divide'] = 584;
+    t['Yacute'] = 667;
+    t['Acircumflex'] = 667;
+    t['aacute'] = 556;
+    t['Ucircumflex'] = 722;
+    t['yacute'] = 500;
+    t['scommaaccent'] = 500;
+    t['ecircumflex'] = 556;
+    t['Uring'] = 722;
+    t['Udieresis'] = 722;
+    t['aogonek'] = 556;
+    t['Uacute'] = 722;
+    t['uogonek'] = 556;
+    t['Edieresis'] = 667;
+    t['Dcroat'] = 722;
+    t['commaaccent'] = 250;
+    t['copyright'] = 737;
+    t['Emacron'] = 667;
+    t['ccaron'] = 500;
+    t['aring'] = 556;
+    t['Ncommaaccent'] = 722;
+    t['lacute'] = 222;
+    t['agrave'] = 556;
+    t['Tcommaaccent'] = 611;
+    t['Cacute'] = 722;
+    t['atilde'] = 556;
+    t['Edotaccent'] = 667;
+    t['scaron'] = 500;
+    t['scedilla'] = 500;
+    t['iacute'] = 278;
+    t['lozenge'] = 471;
+    t['Rcaron'] = 722;
+    t['Gcommaaccent'] = 778;
+    t['ucircumflex'] = 556;
+    t['acircumflex'] = 556;
+    t['Amacron'] = 667;
+    t['rcaron'] = 333;
+    t['ccedilla'] = 500;
+    t['Zdotaccent'] = 611;
+    t['Thorn'] = 667;
+    t['Omacron'] = 778;
+    t['Racute'] = 722;
+    t['Sacute'] = 667;
+    t['dcaron'] = 643;
+    t['Umacron'] = 722;
+    t['uring'] = 556;
+    t['threesuperior'] = 333;
+    t['Ograve'] = 778;
+    t['Agrave'] = 667;
+    t['Abreve'] = 667;
+    t['multiply'] = 584;
+    t['uacute'] = 556;
+    t['Tcaron'] = 611;
+    t['partialdiff'] = 476;
+    t['ydieresis'] = 500;
+    t['Nacute'] = 722;
+    t['icircumflex'] = 278;
+    t['Ecircumflex'] = 667;
+    t['adieresis'] = 556;
+    t['edieresis'] = 556;
+    t['cacute'] = 500;
+    t['nacute'] = 556;
+    t['umacron'] = 556;
+    t['Ncaron'] = 722;
+    t['Iacute'] = 278;
+    t['plusminus'] = 584;
+    t['brokenbar'] = 260;
+    t['registered'] = 737;
+    t['Gbreve'] = 778;
+    t['Idotaccent'] = 278;
+    t['summation'] = 600;
+    t['Egrave'] = 667;
+    t['racute'] = 333;
+    t['omacron'] = 556;
+    t['Zacute'] = 611;
+    t['Zcaron'] = 611;
+    t['greaterequal'] = 549;
+    t['Eth'] = 722;
+    t['Ccedilla'] = 722;
+    t['lcommaaccent'] = 222;
+    t['tcaron'] = 317;
+    t['eogonek'] = 556;
+    t['Uogonek'] = 722;
+    t['Aacute'] = 667;
+    t['Adieresis'] = 667;
+    t['egrave'] = 556;
+    t['zacute'] = 500;
+    t['iogonek'] = 222;
+    t['Oacute'] = 778;
+    t['oacute'] = 556;
+    t['amacron'] = 556;
+    t['sacute'] = 500;
+    t['idieresis'] = 278;
+    t['Ocircumflex'] = 778;
+    t['Ugrave'] = 722;
+    t['Delta'] = 612;
+    t['thorn'] = 556;
+    t['twosuperior'] = 333;
+    t['Odieresis'] = 778;
+    t['mu'] = 556;
+    t['igrave'] = 278;
+    t['ohungarumlaut'] = 556;
+    t['Eogonek'] = 667;
+    t['dcroat'] = 556;
+    t['threequarters'] = 834;
+    t['Scedilla'] = 667;
+    t['lcaron'] = 299;
+    t['Kcommaaccent'] = 667;
+    t['Lacute'] = 556;
+    t['trademark'] = 1000;
+    t['edotaccent'] = 556;
+    t['Igrave'] = 278;
+    t['Imacron'] = 278;
+    t['Lcaron'] = 556;
+    t['onehalf'] = 834;
+    t['lessequal'] = 549;
+    t['ocircumflex'] = 556;
+    t['ntilde'] = 556;
+    t['Uhungarumlaut'] = 722;
+    t['Eacute'] = 667;
+    t['emacron'] = 556;
+    t['gbreve'] = 556;
+    t['onequarter'] = 834;
+    t['Scaron'] = 667;
+    t['Scommaaccent'] = 667;
+    t['Ohungarumlaut'] = 778;
+    t['degree'] = 400;
+    t['ograve'] = 556;
+    t['Ccaron'] = 722;
+    t['ugrave'] = 556;
+    t['radical'] = 453;
+    t['Dcaron'] = 722;
+    t['rcommaaccent'] = 333;
+    t['Ntilde'] = 722;
+    t['otilde'] = 556;
+    t['Rcommaaccent'] = 722;
+    t['Lcommaaccent'] = 556;
+    t['Atilde'] = 667;
+    t['Aogonek'] = 667;
+    t['Aring'] = 667;
+    t['Otilde'] = 778;
+    t['zdotaccent'] = 500;
+    t['Ecaron'] = 667;
+    t['Iogonek'] = 278;
+    t['kcommaaccent'] = 500;
+    t['minus'] = 584;
+    t['Icircumflex'] = 278;
+    t['ncaron'] = 556;
+    t['tcommaaccent'] = 278;
+    t['logicalnot'] = 584;
+    t['odieresis'] = 556;
+    t['udieresis'] = 556;
+    t['notequal'] = 549;
+    t['gcommaaccent'] = 556;
+    t['eth'] = 556;
+    t['zcaron'] = 500;
+    t['ncommaaccent'] = 556;
+    t['onesuperior'] = 333;
+    t['imacron'] = 278;
+    t['Euro'] = 556;
+  });
+  t['Helvetica-Bold'] = (0, _util.getLookupTableFactory)(function (t) {
+    t['space'] = 278;
+    t['exclam'] = 333;
+    t['quotedbl'] = 474;
+    t['numbersign'] = 556;
+    t['dollar'] = 556;
+    t['percent'] = 889;
+    t['ampersand'] = 722;
+    t['quoteright'] = 278;
+    t['parenleft'] = 333;
+    t['parenright'] = 333;
+    t['asterisk'] = 389;
+    t['plus'] = 584;
+    t['comma'] = 278;
+    t['hyphen'] = 333;
+    t['period'] = 278;
+    t['slash'] = 278;
+    t['zero'] = 556;
+    t['one'] = 556;
+    t['two'] = 556;
+    t['three'] = 556;
+    t['four'] = 556;
+    t['five'] = 556;
+    t['six'] = 556;
+    t['seven'] = 556;
+    t['eight'] = 556;
+    t['nine'] = 556;
+    t['colon'] = 333;
+    t['semicolon'] = 333;
+    t['less'] = 584;
+    t['equal'] = 584;
+    t['greater'] = 584;
+    t['question'] = 611;
+    t['at'] = 975;
+    t['A'] = 722;
+    t['B'] = 722;
+    t['C'] = 722;
+    t['D'] = 722;
+    t['E'] = 667;
+    t['F'] = 611;
+    t['G'] = 778;
+    t['H'] = 722;
+    t['I'] = 278;
+    t['J'] = 556;
+    t['K'] = 722;
+    t['L'] = 611;
+    t['M'] = 833;
+    t['N'] = 722;
+    t['O'] = 778;
+    t['P'] = 667;
+    t['Q'] = 778;
+    t['R'] = 722;
+    t['S'] = 667;
+    t['T'] = 611;
+    t['U'] = 722;
+    t['V'] = 667;
+    t['W'] = 944;
+    t['X'] = 667;
+    t['Y'] = 667;
+    t['Z'] = 611;
+    t['bracketleft'] = 333;
+    t['backslash'] = 278;
+    t['bracketright'] = 333;
+    t['asciicircum'] = 584;
+    t['underscore'] = 556;
+    t['quoteleft'] = 278;
+    t['a'] = 556;
+    t['b'] = 611;
+    t['c'] = 556;
+    t['d'] = 611;
+    t['e'] = 556;
+    t['f'] = 333;
+    t['g'] = 611;
+    t['h'] = 611;
+    t['i'] = 278;
+    t['j'] = 278;
+    t['k'] = 556;
+    t['l'] = 278;
+    t['m'] = 889;
+    t['n'] = 611;
+    t['o'] = 611;
+    t['p'] = 611;
+    t['q'] = 611;
+    t['r'] = 389;
+    t['s'] = 556;
+    t['t'] = 333;
+    t['u'] = 611;
+    t['v'] = 556;
+    t['w'] = 778;
+    t['x'] = 556;
+    t['y'] = 556;
+    t['z'] = 500;
+    t['braceleft'] = 389;
+    t['bar'] = 280;
+    t['braceright'] = 389;
+    t['asciitilde'] = 584;
+    t['exclamdown'] = 333;
+    t['cent'] = 556;
+    t['sterling'] = 556;
+    t['fraction'] = 167;
+    t['yen'] = 556;
+    t['florin'] = 556;
+    t['section'] = 556;
+    t['currency'] = 556;
+    t['quotesingle'] = 238;
+    t['quotedblleft'] = 500;
+    t['guillemotleft'] = 556;
+    t['guilsinglleft'] = 333;
+    t['guilsinglright'] = 333;
+    t['fi'] = 611;
+    t['fl'] = 611;
+    t['endash'] = 556;
+    t['dagger'] = 556;
+    t['daggerdbl'] = 556;
+    t['periodcentered'] = 278;
+    t['paragraph'] = 556;
+    t['bullet'] = 350;
+    t['quotesinglbase'] = 278;
+    t['quotedblbase'] = 500;
+    t['quotedblright'] = 500;
+    t['guillemotright'] = 556;
+    t['ellipsis'] = 1000;
+    t['perthousand'] = 1000;
+    t['questiondown'] = 611;
+    t['grave'] = 333;
+    t['acute'] = 333;
+    t['circumflex'] = 333;
+    t['tilde'] = 333;
+    t['macron'] = 333;
+    t['breve'] = 333;
+    t['dotaccent'] = 333;
+    t['dieresis'] = 333;
+    t['ring'] = 333;
+    t['cedilla'] = 333;
+    t['hungarumlaut'] = 333;
+    t['ogonek'] = 333;
+    t['caron'] = 333;
+    t['emdash'] = 1000;
+    t['AE'] = 1000;
+    t['ordfeminine'] = 370;
+    t['Lslash'] = 611;
+    t['Oslash'] = 778;
+    t['OE'] = 1000;
+    t['ordmasculine'] = 365;
+    t['ae'] = 889;
+    t['dotlessi'] = 278;
+    t['lslash'] = 278;
+    t['oslash'] = 611;
+    t['oe'] = 944;
+    t['germandbls'] = 611;
+    t['Idieresis'] = 278;
+    t['eacute'] = 556;
+    t['abreve'] = 556;
+    t['uhungarumlaut'] = 611;
+    t['ecaron'] = 556;
+    t['Ydieresis'] = 667;
+    t['divide'] = 584;
+    t['Yacute'] = 667;
+    t['Acircumflex'] = 722;
+    t['aacute'] = 556;
+    t['Ucircumflex'] = 722;
+    t['yacute'] = 556;
+    t['scommaaccent'] = 556;
+    t['ecircumflex'] = 556;
+    t['Uring'] = 722;
+    t['Udieresis'] = 722;
+    t['aogonek'] = 556;
+    t['Uacute'] = 722;
+    t['uogonek'] = 611;
+    t['Edieresis'] = 667;
+    t['Dcroat'] = 722;
+    t['commaaccent'] = 250;
+    t['copyright'] = 737;
+    t['Emacron'] = 667;
+    t['ccaron'] = 556;
+    t['aring'] = 556;
+    t['Ncommaaccent'] = 722;
+    t['lacute'] = 278;
+    t['agrave'] = 556;
+    t['Tcommaaccent'] = 611;
+    t['Cacute'] = 722;
+    t['atilde'] = 556;
+    t['Edotaccent'] = 667;
+    t['scaron'] = 556;
+    t['scedilla'] = 556;
+    t['iacute'] = 278;
+    t['lozenge'] = 494;
+    t['Rcaron'] = 722;
+    t['Gcommaaccent'] = 778;
+    t['ucircumflex'] = 611;
+    t['acircumflex'] = 556;
+    t['Amacron'] = 722;
+    t['rcaron'] = 389;
+    t['ccedilla'] = 556;
+    t['Zdotaccent'] = 611;
+    t['Thorn'] = 667;
+    t['Omacron'] = 778;
+    t['Racute'] = 722;
+    t['Sacute'] = 667;
+    t['dcaron'] = 743;
+    t['Umacron'] = 722;
+    t['uring'] = 611;
+    t['threesuperior'] = 333;
+    t['Ograve'] = 778;
+    t['Agrave'] = 722;
+    t['Abreve'] = 722;
+    t['multiply'] = 584;
+    t['uacute'] = 611;
+    t['Tcaron'] = 611;
+    t['partialdiff'] = 494;
+    t['ydieresis'] = 556;
+    t['Nacute'] = 722;
+    t['icircumflex'] = 278;
+    t['Ecircumflex'] = 667;
+    t['adieresis'] = 556;
+    t['edieresis'] = 556;
+    t['cacute'] = 556;
+    t['nacute'] = 611;
+    t['umacron'] = 611;
+    t['Ncaron'] = 722;
+    t['Iacute'] = 278;
+    t['plusminus'] = 584;
+    t['brokenbar'] = 280;
+    t['registered'] = 737;
+    t['Gbreve'] = 778;
+    t['Idotaccent'] = 278;
+    t['summation'] = 600;
+    t['Egrave'] = 667;
+    t['racute'] = 389;
+    t['omacron'] = 611;
+    t['Zacute'] = 611;
+    t['Zcaron'] = 611;
+    t['greaterequal'] = 549;
+    t['Eth'] = 722;
+    t['Ccedilla'] = 722;
+    t['lcommaaccent'] = 278;
+    t['tcaron'] = 389;
+    t['eogonek'] = 556;
+    t['Uogonek'] = 722;
+    t['Aacute'] = 722;
+    t['Adieresis'] = 722;
+    t['egrave'] = 556;
+    t['zacute'] = 500;
+    t['iogonek'] = 278;
+    t['Oacute'] = 778;
+    t['oacute'] = 611;
+    t['amacron'] = 556;
+    t['sacute'] = 556;
+    t['idieresis'] = 278;
+    t['Ocircumflex'] = 778;
+    t['Ugrave'] = 722;
+    t['Delta'] = 612;
+    t['thorn'] = 611;
+    t['twosuperior'] = 333;
+    t['Odieresis'] = 778;
+    t['mu'] = 611;
+    t['igrave'] = 278;
+    t['ohungarumlaut'] = 611;
+    t['Eogonek'] = 667;
+    t['dcroat'] = 611;
+    t['threequarters'] = 834;
+    t['Scedilla'] = 667;
+    t['lcaron'] = 400;
+    t['Kcommaaccent'] = 722;
+    t['Lacute'] = 611;
+    t['trademark'] = 1000;
+    t['edotaccent'] = 556;
+    t['Igrave'] = 278;
+    t['Imacron'] = 278;
+    t['Lcaron'] = 611;
+    t['onehalf'] = 834;
+    t['lessequal'] = 549;
+    t['ocircumflex'] = 611;
+    t['ntilde'] = 611;
+    t['Uhungarumlaut'] = 722;
+    t['Eacute'] = 667;
+    t['emacron'] = 556;
+    t['gbreve'] = 611;
+    t['onequarter'] = 834;
+    t['Scaron'] = 667;
+    t['Scommaaccent'] = 667;
+    t['Ohungarumlaut'] = 778;
+    t['degree'] = 400;
+    t['ograve'] = 611;
+    t['Ccaron'] = 722;
+    t['ugrave'] = 611;
+    t['radical'] = 549;
+    t['Dcaron'] = 722;
+    t['rcommaaccent'] = 389;
+    t['Ntilde'] = 722;
+    t['otilde'] = 611;
+    t['Rcommaaccent'] = 722;
+    t['Lcommaaccent'] = 611;
+    t['Atilde'] = 722;
+    t['Aogonek'] = 722;
+    t['Aring'] = 722;
+    t['Otilde'] = 778;
+    t['zdotaccent'] = 500;
+    t['Ecaron'] = 667;
+    t['Iogonek'] = 278;
+    t['kcommaaccent'] = 556;
+    t['minus'] = 584;
+    t['Icircumflex'] = 278;
+    t['ncaron'] = 611;
+    t['tcommaaccent'] = 333;
+    t['logicalnot'] = 584;
+    t['odieresis'] = 611;
+    t['udieresis'] = 611;
+    t['notequal'] = 549;
+    t['gcommaaccent'] = 611;
+    t['eth'] = 611;
+    t['zcaron'] = 500;
+    t['ncommaaccent'] = 611;
+    t['onesuperior'] = 333;
+    t['imacron'] = 278;
+    t['Euro'] = 556;
+  });
+  t['Helvetica-BoldOblique'] = (0, _util.getLookupTableFactory)(function (t) {
+    t['space'] = 278;
+    t['exclam'] = 333;
+    t['quotedbl'] = 474;
+    t['numbersign'] = 556;
+    t['dollar'] = 556;
+    t['percent'] = 889;
+    t['ampersand'] = 722;
+    t['quoteright'] = 278;
+    t['parenleft'] = 333;
+    t['parenright'] = 333;
+    t['asterisk'] = 389;
+    t['plus'] = 584;
+    t['comma'] = 278;
+    t['hyphen'] = 333;
+    t['period'] = 278;
+    t['slash'] = 278;
+    t['zero'] = 556;
+    t['one'] = 556;
+    t['two'] = 556;
+    t['three'] = 556;
+    t['four'] = 556;
+    t['five'] = 556;
+    t['six'] = 556;
+    t['seven'] = 556;
+    t['eight'] = 556;
+    t['nine'] = 556;
+    t['colon'] = 333;
+    t['semicolon'] = 333;
+    t['less'] = 584;
+    t['equal'] = 584;
+    t['greater'] = 584;
+    t['question'] = 611;
+    t['at'] = 975;
+    t['A'] = 722;
+    t['B'] = 722;
+    t['C'] = 722;
+    t['D'] = 722;
+    t['E'] = 667;
+    t['F'] = 611;
+    t['G'] = 778;
+    t['H'] = 722;
+    t['I'] = 278;
+    t['J'] = 556;
+    t['K'] = 722;
+    t['L'] = 611;
+    t['M'] = 833;
+    t['N'] = 722;
+    t['O'] = 778;
+    t['P'] = 667;
+    t['Q'] = 778;
+    t['R'] = 722;
+    t['S'] = 667;
+    t['T'] = 611;
+    t['U'] = 722;
+    t['V'] = 667;
+    t['W'] = 944;
+    t['X'] = 667;
+    t['Y'] = 667;
+    t['Z'] = 611;
+    t['bracketleft'] = 333;
+    t['backslash'] = 278;
+    t['bracketright'] = 333;
+    t['asciicircum'] = 584;
+    t['underscore'] = 556;
+    t['quoteleft'] = 278;
+    t['a'] = 556;
+    t['b'] = 611;
+    t['c'] = 556;
+    t['d'] = 611;
+    t['e'] = 556;
+    t['f'] = 333;
+    t['g'] = 611;
+    t['h'] = 611;
+    t['i'] = 278;
+    t['j'] = 278;
+    t['k'] = 556;
+    t['l'] = 278;
+    t['m'] = 889;
+    t['n'] = 611;
+    t['o'] = 611;
+    t['p'] = 611;
+    t['q'] = 611;
+    t['r'] = 389;
+    t['s'] = 556;
+    t['t'] = 333;
+    t['u'] = 611;
+    t['v'] = 556;
+    t['w'] = 778;
+    t['x'] = 556;
+    t['y'] = 556;
+    t['z'] = 500;
+    t['braceleft'] = 389;
+    t['bar'] = 280;
+    t['braceright'] = 389;
+    t['asciitilde'] = 584;
+    t['exclamdown'] = 333;
+    t['cent'] = 556;
+    t['sterling'] = 556;
+    t['fraction'] = 167;
+    t['yen'] = 556;
+    t['florin'] = 556;
+    t['section'] = 556;
+    t['currency'] = 556;
+    t['quotesingle'] = 238;
+    t['quotedblleft'] = 500;
+    t['guillemotleft'] = 556;
+    t['guilsinglleft'] = 333;
+    t['guilsinglright'] = 333;
+    t['fi'] = 611;
+    t['fl'] = 611;
+    t['endash'] = 556;
+    t['dagger'] = 556;
+    t['daggerdbl'] = 556;
+    t['periodcentered'] = 278;
+    t['paragraph'] = 556;
+    t['bullet'] = 350;
+    t['quotesinglbase'] = 278;
+    t['quotedblbase'] = 500;
+    t['quotedblright'] = 500;
+    t['guillemotright'] = 556;
+    t['ellipsis'] = 1000;
+    t['perthousand'] = 1000;
+    t['questiondown'] = 611;
+    t['grave'] = 333;
+    t['acute'] = 333;
+    t['circumflex'] = 333;
+    t['tilde'] = 333;
+    t['macron'] = 333;
+    t['breve'] = 333;
+    t['dotaccent'] = 333;
+    t['dieresis'] = 333;
+    t['ring'] = 333;
+    t['cedilla'] = 333;
+    t['hungarumlaut'] = 333;
+    t['ogonek'] = 333;
+    t['caron'] = 333;
+    t['emdash'] = 1000;
+    t['AE'] = 1000;
+    t['ordfeminine'] = 370;
+    t['Lslash'] = 611;
+    t['Oslash'] = 778;
+    t['OE'] = 1000;
+    t['ordmasculine'] = 365;
+    t['ae'] = 889;
+    t['dotlessi'] = 278;
+    t['lslash'] = 278;
+    t['oslash'] = 611;
+    t['oe'] = 944;
+    t['germandbls'] = 611;
+    t['Idieresis'] = 278;
+    t['eacute'] = 556;
+    t['abreve'] = 556;
+    t['uhungarumlaut'] = 611;
+    t['ecaron'] = 556;
+    t['Ydieresis'] = 667;
+    t['divide'] = 584;
+    t['Yacute'] = 667;
+    t['Acircumflex'] = 722;
+    t['aacute'] = 556;
+    t['Ucircumflex'] = 722;
+    t['yacute'] = 556;
+    t['scommaaccent'] = 556;
+    t['ecircumflex'] = 556;
+    t['Uring'] = 722;
+    t['Udieresis'] = 722;
+    t['aogonek'] = 556;
+    t['Uacute'] = 722;
+    t['uogonek'] = 611;
+    t['Edieresis'] = 667;
+    t['Dcroat'] = 722;
+    t['commaaccent'] = 250;
+    t['copyright'] = 737;
+    t['Emacron'] = 667;
+    t['ccaron'] = 556;
+    t['aring'] = 556;
+    t['Ncommaaccent'] = 722;
+    t['lacute'] = 278;
+    t['agrave'] = 556;
+    t['Tcommaaccent'] = 611;
+    t['Cacute'] = 722;
+    t['atilde'] = 556;
+    t['Edotaccent'] = 667;
+    t['scaron'] = 556;
+    t['scedilla'] = 556;
+    t['iacute'] = 278;
+    t['lozenge'] = 494;
+    t['Rcaron'] = 722;
+    t['Gcommaaccent'] = 778;
+    t['ucircumflex'] = 611;
+    t['acircumflex'] = 556;
+    t['Amacron'] = 722;
+    t['rcaron'] = 389;
+    t['ccedilla'] = 556;
+    t['Zdotaccent'] = 611;
+    t['Thorn'] = 667;
+    t['Omacron'] = 778;
+    t['Racute'] = 722;
+    t['Sacute'] = 667;
+    t['dcaron'] = 743;
+    t['Umacron'] = 722;
+    t['uring'] = 611;
+    t['threesuperior'] = 333;
+    t['Ograve'] = 778;
+    t['Agrave'] = 722;
+    t['Abreve'] = 722;
+    t['multiply'] = 584;
+    t['uacute'] = 611;
+    t['Tcaron'] = 611;
+    t['partialdiff'] = 494;
+    t['ydieresis'] = 556;
+    t['Nacute'] = 722;
+    t['icircumflex'] = 278;
+    t['Ecircumflex'] = 667;
+    t['adieresis'] = 556;
+    t['edieresis'] = 556;
+    t['cacute'] = 556;
+    t['nacute'] = 611;
+    t['umacron'] = 611;
+    t['Ncaron'] = 722;
+    t['Iacute'] = 278;
+    t['plusminus'] = 584;
+    t['brokenbar'] = 280;
+    t['registered'] = 737;
+    t['Gbreve'] = 778;
+    t['Idotaccent'] = 278;
+    t['summation'] = 600;
+    t['Egrave'] = 667;
+    t['racute'] = 389;
+    t['omacron'] = 611;
+    t['Zacute'] = 611;
+    t['Zcaron'] = 611;
+    t['greaterequal'] = 549;
+    t['Eth'] = 722;
+    t['Ccedilla'] = 722;
+    t['lcommaaccent'] = 278;
+    t['tcaron'] = 389;
+    t['eogonek'] = 556;
+    t['Uogonek'] = 722;
+    t['Aacute'] = 722;
+    t['Adieresis'] = 722;
+    t['egrave'] = 556;
+    t['zacute'] = 500;
+    t['iogonek'] = 278;
+    t['Oacute'] = 778;
+    t['oacute'] = 611;
+    t['amacron'] = 556;
+    t['sacute'] = 556;
+    t['idieresis'] = 278;
+    t['Ocircumflex'] = 778;
+    t['Ugrave'] = 722;
+    t['Delta'] = 612;
+    t['thorn'] = 611;
+    t['twosuperior'] = 333;
+    t['Odieresis'] = 778;
+    t['mu'] = 611;
+    t['igrave'] = 278;
+    t['ohungarumlaut'] = 611;
+    t['Eogonek'] = 667;
+    t['dcroat'] = 611;
+    t['threequarters'] = 834;
+    t['Scedilla'] = 667;
+    t['lcaron'] = 400;
+    t['Kcommaaccent'] = 722;
+    t['Lacute'] = 611;
+    t['trademark'] = 1000;
+    t['edotaccent'] = 556;
+    t['Igrave'] = 278;
+    t['Imacron'] = 278;
+    t['Lcaron'] = 611;
+    t['onehalf'] = 834;
+    t['lessequal'] = 549;
+    t['ocircumflex'] = 611;
+    t['ntilde'] = 611;
+    t['Uhungarumlaut'] = 722;
+    t['Eacute'] = 667;
+    t['emacron'] = 556;
+    t['gbreve'] = 611;
+    t['onequarter'] = 834;
+    t['Scaron'] = 667;
+    t['Scommaaccent'] = 667;
+    t['Ohungarumlaut'] = 778;
+    t['degree'] = 400;
+    t['ograve'] = 611;
+    t['Ccaron'] = 722;
+    t['ugrave'] = 611;
+    t['radical'] = 549;
+    t['Dcaron'] = 722;
+    t['rcommaaccent'] = 389;
+    t['Ntilde'] = 722;
+    t['otilde'] = 611;
+    t['Rcommaaccent'] = 722;
+    t['Lcommaaccent'] = 611;
+    t['Atilde'] = 722;
+    t['Aogonek'] = 722;
+    t['Aring'] = 722;
+    t['Otilde'] = 778;
+    t['zdotaccent'] = 500;
+    t['Ecaron'] = 667;
+    t['Iogonek'] = 278;
+    t['kcommaaccent'] = 556;
+    t['minus'] = 584;
+    t['Icircumflex'] = 278;
+    t['ncaron'] = 611;
+    t['tcommaaccent'] = 333;
+    t['logicalnot'] = 584;
+    t['odieresis'] = 611;
+    t['udieresis'] = 611;
+    t['notequal'] = 549;
+    t['gcommaaccent'] = 611;
+    t['eth'] = 611;
+    t['zcaron'] = 500;
+    t['ncommaaccent'] = 611;
+    t['onesuperior'] = 333;
+    t['imacron'] = 278;
+    t['Euro'] = 556;
+  });
+  t['Helvetica-Oblique'] = (0, _util.getLookupTableFactory)(function (t) {
+    t['space'] = 278;
+    t['exclam'] = 278;
+    t['quotedbl'] = 355;
+    t['numbersign'] = 556;
+    t['dollar'] = 556;
+    t['percent'] = 889;
+    t['ampersand'] = 667;
+    t['quoteright'] = 222;
+    t['parenleft'] = 333;
+    t['parenright'] = 333;
+    t['asterisk'] = 389;
+    t['plus'] = 584;
+    t['comma'] = 278;
+    t['hyphen'] = 333;
+    t['period'] = 278;
+    t['slash'] = 278;
+    t['zero'] = 556;
+    t['one'] = 556;
+    t['two'] = 556;
+    t['three'] = 556;
+    t['four'] = 556;
+    t['five'] = 556;
+    t['six'] = 556;
+    t['seven'] = 556;
+    t['eight'] = 556;
+    t['nine'] = 556;
+    t['colon'] = 278;
+    t['semicolon'] = 278;
+    t['less'] = 584;
+    t['equal'] = 584;
+    t['greater'] = 584;
+    t['question'] = 556;
+    t['at'] = 1015;
+    t['A'] = 667;
+    t['B'] = 667;
+    t['C'] = 722;
+    t['D'] = 722;
+    t['E'] = 667;
+    t['F'] = 611;
+    t['G'] = 778;
+    t['H'] = 722;
+    t['I'] = 278;
+    t['J'] = 500;
+    t['K'] = 667;
+    t['L'] = 556;
+    t['M'] = 833;
+    t['N'] = 722;
+    t['O'] = 778;
+    t['P'] = 667;
+    t['Q'] = 778;
+    t['R'] = 722;
+    t['S'] = 667;
+    t['T'] = 611;
+    t['U'] = 722;
+    t['V'] = 667;
+    t['W'] = 944;
+    t['X'] = 667;
+    t['Y'] = 667;
+    t['Z'] = 611;
+    t['bracketleft'] = 278;
+    t['backslash'] = 278;
+    t['bracketright'] = 278;
+    t['asciicircum'] = 469;
+    t['underscore'] = 556;
+    t['quoteleft'] = 222;
+    t['a'] = 556;
+    t['b'] = 556;
+    t['c'] = 500;
+    t['d'] = 556;
+    t['e'] = 556;
+    t['f'] = 278;
+    t['g'] = 556;
+    t['h'] = 556;
+    t['i'] = 222;
+    t['j'] = 222;
+    t['k'] = 500;
+    t['l'] = 222;
+    t['m'] = 833;
+    t['n'] = 556;
+    t['o'] = 556;
+    t['p'] = 556;
+    t['q'] = 556;
+    t['r'] = 333;
+    t['s'] = 500;
+    t['t'] = 278;
+    t['u'] = 556;
+    t['v'] = 500;
+    t['w'] = 722;
+    t['x'] = 500;
+    t['y'] = 500;
+    t['z'] = 500;
+    t['braceleft'] = 334;
+    t['bar'] = 260;
+    t['braceright'] = 334;
+    t['asciitilde'] = 584;
+    t['exclamdown'] = 333;
+    t['cent'] = 556;
+    t['sterling'] = 556;
+    t['fraction'] = 167;
+    t['yen'] = 556;
+    t['florin'] = 556;
+    t['section'] = 556;
+    t['currency'] = 556;
+    t['quotesingle'] = 191;
+    t['quotedblleft'] = 333;
+    t['guillemotleft'] = 556;
+    t['guilsinglleft'] = 333;
+    t['guilsinglright'] = 333;
+    t['fi'] = 500;
+    t['fl'] = 500;
+    t['endash'] = 556;
+    t['dagger'] = 556;
+    t['daggerdbl'] = 556;
+    t['periodcentered'] = 278;
+    t['paragraph'] = 537;
+    t['bullet'] = 350;
+    t['quotesinglbase'] = 222;
+    t['quotedblbase'] = 333;
+    t['quotedblright'] = 333;
+    t['guillemotright'] = 556;
+    t['ellipsis'] = 1000;
+    t['perthousand'] = 1000;
+    t['questiondown'] = 611;
+    t['grave'] = 333;
+    t['acute'] = 333;
+    t['circumflex'] = 333;
+    t['tilde'] = 333;
+    t['macron'] = 333;
+    t['breve'] = 333;
+    t['dotaccent'] = 333;
+    t['dieresis'] = 333;
+    t['ring'] = 333;
+    t['cedilla'] = 333;
+    t['hungarumlaut'] = 333;
+    t['ogonek'] = 333;
+    t['caron'] = 333;
+    t['emdash'] = 1000;
+    t['AE'] = 1000;
+    t['ordfeminine'] = 370;
+    t['Lslash'] = 556;
+    t['Oslash'] = 778;
+    t['OE'] = 1000;
+    t['ordmasculine'] = 365;
+    t['ae'] = 889;
+    t['dotlessi'] = 278;
+    t['lslash'] = 222;
+    t['oslash'] = 611;
+    t['oe'] = 944;
+    t['germandbls'] = 611;
+    t['Idieresis'] = 278;
+    t['eacute'] = 556;
+    t['abreve'] = 556;
+    t['uhungarumlaut'] = 556;
+    t['ecaron'] = 556;
+    t['Ydieresis'] = 667;
+    t['divide'] = 584;
+    t['Yacute'] = 667;
+    t['Acircumflex'] = 667;
+    t['aacute'] = 556;
+    t['Ucircumflex'] = 722;
+    t['yacute'] = 500;
+    t['scommaaccent'] = 500;
+    t['ecircumflex'] = 556;
+    t['Uring'] = 722;
+    t['Udieresis'] = 722;
+    t['aogonek'] = 556;
+    t['Uacute'] = 722;
+    t['uogonek'] = 556;
+    t['Edieresis'] = 667;
+    t['Dcroat'] = 722;
+    t['commaaccent'] = 250;
+    t['copyright'] = 737;
+    t['Emacron'] = 667;
+    t['ccaron'] = 500;
+    t['aring'] = 556;
+    t['Ncommaaccent'] = 722;
+    t['lacute'] = 222;
+    t['agrave'] = 556;
+    t['Tcommaaccent'] = 611;
+    t['Cacute'] = 722;
+    t['atilde'] = 556;
+    t['Edotaccent'] = 667;
+    t['scaron'] = 500;
+    t['scedilla'] = 500;
+    t['iacute'] = 278;
+    t['lozenge'] = 471;
+    t['Rcaron'] = 722;
+    t['Gcommaaccent'] = 778;
+    t['ucircumflex'] = 556;
+    t['acircumflex'] = 556;
+    t['Amacron'] = 667;
+    t['rcaron'] = 333;
+    t['ccedilla'] = 500;
+    t['Zdotaccent'] = 611;
+    t['Thorn'] = 667;
+    t['Omacron'] = 778;
+    t['Racute'] = 722;
+    t['Sacute'] = 667;
+    t['dcaron'] = 643;
+    t['Umacron'] = 722;
+    t['uring'] = 556;
+    t['threesuperior'] = 333;
+    t['Ograve'] = 778;
+    t['Agrave'] = 667;
+    t['Abreve'] = 667;
+    t['multiply'] = 584;
+    t['uacute'] = 556;
+    t['Tcaron'] = 611;
+    t['partialdiff'] = 476;
+    t['ydieresis'] = 500;
+    t['Nacute'] = 722;
+    t['icircumflex'] = 278;
+    t['Ecircumflex'] = 667;
+    t['adieresis'] = 556;
+    t['edieresis'] = 556;
+    t['cacute'] = 500;
+    t['nacute'] = 556;
+    t['umacron'] = 556;
+    t['Ncaron'] = 722;
+    t['Iacute'] = 278;
+    t['plusminus'] = 584;
+    t['brokenbar'] = 260;
+    t['registered'] = 737;
+    t['Gbreve'] = 778;
+    t['Idotaccent'] = 278;
+    t['summation'] = 600;
+    t['Egrave'] = 667;
+    t['racute'] = 333;
+    t['omacron'] = 556;
+    t['Zacute'] = 611;
+    t['Zcaron'] = 611;
+    t['greaterequal'] = 549;
+    t['Eth'] = 722;
+    t['Ccedilla'] = 722;
+    t['lcommaaccent'] = 222;
+    t['tcaron'] = 317;
+    t['eogonek'] = 556;
+    t['Uogonek'] = 722;
+    t['Aacute'] = 667;
+    t['Adieresis'] = 667;
+    t['egrave'] = 556;
+    t['zacute'] = 500;
+    t['iogonek'] = 222;
+    t['Oacute'] = 778;
+    t['oacute'] = 556;
+    t['amacron'] = 556;
+    t['sacute'] = 500;
+    t['idieresis'] = 278;
+    t['Ocircumflex'] = 778;
+    t['Ugrave'] = 722;
+    t['Delta'] = 612;
+    t['thorn'] = 556;
+    t['twosuperior'] = 333;
+    t['Odieresis'] = 778;
+    t['mu'] = 556;
+    t['igrave'] = 278;
+    t['ohungarumlaut'] = 556;
+    t['Eogonek'] = 667;
+    t['dcroat'] = 556;
+    t['threequarters'] = 834;
+    t['Scedilla'] = 667;
+    t['lcaron'] = 299;
+    t['Kcommaaccent'] = 667;
+    t['Lacute'] = 556;
+    t['trademark'] = 1000;
+    t['edotaccent'] = 556;
+    t['Igrave'] = 278;
+    t['Imacron'] = 278;
+    t['Lcaron'] = 556;
+    t['onehalf'] = 834;
+    t['lessequal'] = 549;
+    t['ocircumflex'] = 556;
+    t['ntilde'] = 556;
+    t['Uhungarumlaut'] = 722;
+    t['Eacute'] = 667;
+    t['emacron'] = 556;
+    t['gbreve'] = 556;
+    t['onequarter'] = 834;
+    t['Scaron'] = 667;
+    t['Scommaaccent'] = 667;
+    t['Ohungarumlaut'] = 778;
+    t['degree'] = 400;
+    t['ograve'] = 556;
+    t['Ccaron'] = 722;
+    t['ugrave'] = 556;
+    t['radical'] = 453;
+    t['Dcaron'] = 722;
+    t['rcommaaccent'] = 333;
+    t['Ntilde'] = 722;
+    t['otilde'] = 556;
+    t['Rcommaaccent'] = 722;
+    t['Lcommaaccent'] = 556;
+    t['Atilde'] = 667;
+    t['Aogonek'] = 667;
+    t['Aring'] = 667;
+    t['Otilde'] = 778;
+    t['zdotaccent'] = 500;
+    t['Ecaron'] = 667;
+    t['Iogonek'] = 278;
+    t['kcommaaccent'] = 500;
+    t['minus'] = 584;
+    t['Icircumflex'] = 278;
+    t['ncaron'] = 556;
+    t['tcommaaccent'] = 278;
+    t['logicalnot'] = 584;
+    t['odieresis'] = 556;
+    t['udieresis'] = 556;
+    t['notequal'] = 549;
+    t['gcommaaccent'] = 556;
+    t['eth'] = 556;
+    t['zcaron'] = 500;
+    t['ncommaaccent'] = 556;
+    t['onesuperior'] = 333;
+    t['imacron'] = 278;
+    t['Euro'] = 556;
+  });
+  t['Symbol'] = (0, _util.getLookupTableFactory)(function (t) {
+    t['space'] = 250;
+    t['exclam'] = 333;
+    t['universal'] = 713;
+    t['numbersign'] = 500;
+    t['existential'] = 549;
+    t['percent'] = 833;
+    t['ampersand'] = 778;
+    t['suchthat'] = 439;
+    t['parenleft'] = 333;
+    t['parenright'] = 333;
+    t['asteriskmath'] = 500;
+    t['plus'] = 549;
+    t['comma'] = 250;
+    t['minus'] = 549;
+    t['period'] = 250;
+    t['slash'] = 278;
+    t['zero'] = 500;
+    t['one'] = 500;
+    t['two'] = 500;
+    t['three'] = 500;
+    t['four'] = 500;
+    t['five'] = 500;
+    t['six'] = 500;
+    t['seven'] = 500;
+    t['eight'] = 500;
+    t['nine'] = 500;
+    t['colon'] = 278;
+    t['semicolon'] = 278;
+    t['less'] = 549;
+    t['equal'] = 549;
+    t['greater'] = 549;
+    t['question'] = 444;
+    t['congruent'] = 549;
+    t['Alpha'] = 722;
+    t['Beta'] = 667;
+    t['Chi'] = 722;
+    t['Delta'] = 612;
+    t['Epsilon'] = 611;
+    t['Phi'] = 763;
+    t['Gamma'] = 603;
+    t['Eta'] = 722;
+    t['Iota'] = 333;
+    t['theta1'] = 631;
+    t['Kappa'] = 722;
+    t['Lambda'] = 686;
+    t['Mu'] = 889;
+    t['Nu'] = 722;
+    t['Omicron'] = 722;
+    t['Pi'] = 768;
+    t['Theta'] = 741;
+    t['Rho'] = 556;
+    t['Sigma'] = 592;
+    t['Tau'] = 611;
+    t['Upsilon'] = 690;
+    t['sigma1'] = 439;
+    t['Omega'] = 768;
+    t['Xi'] = 645;
+    t['Psi'] = 795;
+    t['Zeta'] = 611;
+    t['bracketleft'] = 333;
+    t['therefore'] = 863;
+    t['bracketright'] = 333;
+    t['perpendicular'] = 658;
+    t['underscore'] = 500;
+    t['radicalex'] = 500;
+    t['alpha'] = 631;
+    t['beta'] = 549;
+    t['chi'] = 549;
+    t['delta'] = 494;
+    t['epsilon'] = 439;
+    t['phi'] = 521;
+    t['gamma'] = 411;
+    t['eta'] = 603;
+    t['iota'] = 329;
+    t['phi1'] = 603;
+    t['kappa'] = 549;
+    t['lambda'] = 549;
+    t['mu'] = 576;
+    t['nu'] = 521;
+    t['omicron'] = 549;
+    t['pi'] = 549;
+    t['theta'] = 521;
+    t['rho'] = 549;
+    t['sigma'] = 603;
+    t['tau'] = 439;
+    t['upsilon'] = 576;
+    t['omega1'] = 713;
+    t['omega'] = 686;
+    t['xi'] = 493;
+    t['psi'] = 686;
+    t['zeta'] = 494;
+    t['braceleft'] = 480;
+    t['bar'] = 200;
+    t['braceright'] = 480;
+    t['similar'] = 549;
+    t['Euro'] = 750;
+    t['Upsilon1'] = 620;
+    t['minute'] = 247;
+    t['lessequal'] = 549;
+    t['fraction'] = 167;
+    t['infinity'] = 713;
+    t['florin'] = 500;
+    t['club'] = 753;
+    t['diamond'] = 753;
+    t['heart'] = 753;
+    t['spade'] = 753;
+    t['arrowboth'] = 1042;
+    t['arrowleft'] = 987;
+    t['arrowup'] = 603;
+    t['arrowright'] = 987;
+    t['arrowdown'] = 603;
+    t['degree'] = 400;
+    t['plusminus'] = 549;
+    t['second'] = 411;
+    t['greaterequal'] = 549;
+    t['multiply'] = 549;
+    t['proportional'] = 713;
+    t['partialdiff'] = 494;
+    t['bullet'] = 460;
+    t['divide'] = 549;
+    t['notequal'] = 549;
+    t['equivalence'] = 549;
+    t['approxequal'] = 549;
+    t['ellipsis'] = 1000;
+    t['arrowvertex'] = 603;
+    t['arrowhorizex'] = 1000;
+    t['carriagereturn'] = 658;
+    t['aleph'] = 823;
+    t['Ifraktur'] = 686;
+    t['Rfraktur'] = 795;
+    t['weierstrass'] = 987;
+    t['circlemultiply'] = 768;
+    t['circleplus'] = 768;
+    t['emptyset'] = 823;
+    t['intersection'] = 768;
+    t['union'] = 768;
+    t['propersuperset'] = 713;
+    t['reflexsuperset'] = 713;
+    t['notsubset'] = 713;
+    t['propersubset'] = 713;
+    t['reflexsubset'] = 713;
+    t['element'] = 713;
+    t['notelement'] = 713;
+    t['angle'] = 768;
+    t['gradient'] = 713;
+    t['registerserif'] = 790;
+    t['copyrightserif'] = 790;
+    t['trademarkserif'] = 890;
+    t['product'] = 823;
+    t['radical'] = 549;
+    t['dotmath'] = 250;
+    t['logicalnot'] = 713;
+    t['logicaland'] = 603;
+    t['logicalor'] = 603;
+    t['arrowdblboth'] = 1042;
+    t['arrowdblleft'] = 987;
+    t['arrowdblup'] = 603;
+    t['arrowdblright'] = 987;
+    t['arrowdbldown'] = 603;
+    t['lozenge'] = 494;
+    t['angleleft'] = 329;
+    t['registersans'] = 790;
+    t['copyrightsans'] = 790;
+    t['trademarksans'] = 786;
+    t['summation'] = 713;
+    t['parenlefttp'] = 384;
+    t['parenleftex'] = 384;
+    t['parenleftbt'] = 384;
+    t['bracketlefttp'] = 384;
+    t['bracketleftex'] = 384;
+    t['bracketleftbt'] = 384;
+    t['bracelefttp'] = 494;
+    t['braceleftmid'] = 494;
+    t['braceleftbt'] = 494;
+    t['braceex'] = 494;
+    t['angleright'] = 329;
+    t['integral'] = 274;
+    t['integraltp'] = 686;
+    t['integralex'] = 686;
+    t['integralbt'] = 686;
+    t['parenrighttp'] = 384;
+    t['parenrightex'] = 384;
+    t['parenrightbt'] = 384;
+    t['bracketrighttp'] = 384;
+    t['bracketrightex'] = 384;
+    t['bracketrightbt'] = 384;
+    t['bracerighttp'] = 494;
+    t['bracerightmid'] = 494;
+    t['bracerightbt'] = 494;
+    t['apple'] = 790;
+  });
+  t['Times-Roman'] = (0, _util.getLookupTableFactory)(function (t) {
+    t['space'] = 250;
+    t['exclam'] = 333;
+    t['quotedbl'] = 408;
+    t['numbersign'] = 500;
+    t['dollar'] = 500;
+    t['percent'] = 833;
+    t['ampersand'] = 778;
+    t['quoteright'] = 333;
+    t['parenleft'] = 333;
+    t['parenright'] = 333;
+    t['asterisk'] = 500;
+    t['plus'] = 564;
+    t['comma'] = 250;
+    t['hyphen'] = 333;
+    t['period'] = 250;
+    t['slash'] = 278;
+    t['zero'] = 500;
+    t['one'] = 500;
+    t['two'] = 500;
+    t['three'] = 500;
+    t['four'] = 500;
+    t['five'] = 500;
+    t['six'] = 500;
+    t['seven'] = 500;
+    t['eight'] = 500;
+    t['nine'] = 500;
+    t['colon'] = 278;
+    t['semicolon'] = 278;
+    t['less'] = 564;
+    t['equal'] = 564;
+    t['greater'] = 564;
+    t['question'] = 444;
+    t['at'] = 921;
+    t['A'] = 722;
+    t['B'] = 667;
+    t['C'] = 667;
+    t['D'] = 722;
+    t['E'] = 611;
+    t['F'] = 556;
+    t['G'] = 722;
+    t['H'] = 722;
+    t['I'] = 333;
+    t['J'] = 389;
+    t['K'] = 722;
+    t['L'] = 611;
+    t['M'] = 889;
+    t['N'] = 722;
+    t['O'] = 722;
+    t['P'] = 556;
+    t['Q'] = 722;
+    t['R'] = 667;
+    t['S'] = 556;
+    t['T'] = 611;
+    t['U'] = 722;
+    t['V'] = 722;
+    t['W'] = 944;
+    t['X'] = 722;
+    t['Y'] = 722;
+    t['Z'] = 611;
+    t['bracketleft'] = 333;
+    t['backslash'] = 278;
+    t['bracketright'] = 333;
+    t['asciicircum'] = 469;
+    t['underscore'] = 500;
+    t['quoteleft'] = 333;
+    t['a'] = 444;
+    t['b'] = 500;
+    t['c'] = 444;
+    t['d'] = 500;
+    t['e'] = 444;
+    t['f'] = 333;
+    t['g'] = 500;
+    t['h'] = 500;
+    t['i'] = 278;
+    t['j'] = 278;
+    t['k'] = 500;
+    t['l'] = 278;
+    t['m'] = 778;
+    t['n'] = 500;
+    t['o'] = 500;
+    t['p'] = 500;
+    t['q'] = 500;
+    t['r'] = 333;
+    t['s'] = 389;
+    t['t'] = 278;
+    t['u'] = 500;
+    t['v'] = 500;
+    t['w'] = 722;
+    t['x'] = 500;
+    t['y'] = 500;
+    t['z'] = 444;
+    t['braceleft'] = 480;
+    t['bar'] = 200;
+    t['braceright'] = 480;
+    t['asciitilde'] = 541;
+    t['exclamdown'] = 333;
+    t['cent'] = 500;
+    t['sterling'] = 500;
+    t['fraction'] = 167;
+    t['yen'] = 500;
+    t['florin'] = 500;
+    t['section'] = 500;
+    t['currency'] = 500;
+    t['quotesingle'] = 180;
+    t['quotedblleft'] = 444;
+    t['guillemotleft'] = 500;
+    t['guilsinglleft'] = 333;
+    t['guilsinglright'] = 333;
+    t['fi'] = 556;
+    t['fl'] = 556;
+    t['endash'] = 500;
+    t['dagger'] = 500;
+    t['daggerdbl'] = 500;
+    t['periodcentered'] = 250;
+    t['paragraph'] = 453;
+    t['bullet'] = 350;
+    t['quotesinglbase'] = 333;
+    t['quotedblbase'] = 444;
+    t['quotedblright'] = 444;
+    t['guillemotright'] = 500;
+    t['ellipsis'] = 1000;
+    t['perthousand'] = 1000;
+    t['questiondown'] = 444;
+    t['grave'] = 333;
+    t['acute'] = 333;
+    t['circumflex'] = 333;
+    t['tilde'] = 333;
+    t['macron'] = 333;
+    t['breve'] = 333;
+    t['dotaccent'] = 333;
+    t['dieresis'] = 333;
+    t['ring'] = 333;
+    t['cedilla'] = 333;
+    t['hungarumlaut'] = 333;
+    t['ogonek'] = 333;
+    t['caron'] = 333;
+    t['emdash'] = 1000;
+    t['AE'] = 889;
+    t['ordfeminine'] = 276;
+    t['Lslash'] = 611;
+    t['Oslash'] = 722;
+    t['OE'] = 889;
+    t['ordmasculine'] = 310;
+    t['ae'] = 667;
+    t['dotlessi'] = 278;
+    t['lslash'] = 278;
+    t['oslash'] = 500;
+    t['oe'] = 722;
+    t['germandbls'] = 500;
+    t['Idieresis'] = 333;
+    t['eacute'] = 444;
+    t['abreve'] = 444;
+    t['uhungarumlaut'] = 500;
+    t['ecaron'] = 444;
+    t['Ydieresis'] = 722;
+    t['divide'] = 564;
+    t['Yacute'] = 722;
+    t['Acircumflex'] = 722;
+    t['aacute'] = 444;
+    t['Ucircumflex'] = 722;
+    t['yacute'] = 500;
+    t['scommaaccent'] = 389;
+    t['ecircumflex'] = 444;
+    t['Uring'] = 722;
+    t['Udieresis'] = 722;
+    t['aogonek'] = 444;
+    t['Uacute'] = 722;
+    t['uogonek'] = 500;
+    t['Edieresis'] = 611;
+    t['Dcroat'] = 722;
+    t['commaaccent'] = 250;
+    t['copyright'] = 760;
+    t['Emacron'] = 611;
+    t['ccaron'] = 444;
+    t['aring'] = 444;
+    t['Ncommaaccent'] = 722;
+    t['lacute'] = 278;
+    t['agrave'] = 444;
+    t['Tcommaaccent'] = 611;
+    t['Cacute'] = 667;
+    t['atilde'] = 444;
+    t['Edotaccent'] = 611;
+    t['scaron'] = 389;
+    t['scedilla'] = 389;
+    t['iacute'] = 278;
+    t['lozenge'] = 471;
+    t['Rcaron'] = 667;
+    t['Gcommaaccent'] = 722;
+    t['ucircumflex'] = 500;
+    t['acircumflex'] = 444;
+    t['Amacron'] = 722;
+    t['rcaron'] = 333;
+    t['ccedilla'] = 444;
+    t['Zdotaccent'] = 611;
+    t['Thorn'] = 556;
+    t['Omacron'] = 722;
+    t['Racute'] = 667;
+    t['Sacute'] = 556;
+    t['dcaron'] = 588;
+    t['Umacron'] = 722;
+    t['uring'] = 500;
+    t['threesuperior'] = 300;
+    t['Ograve'] = 722;
+    t['Agrave'] = 722;
+    t['Abreve'] = 722;
+    t['multiply'] = 564;
+    t['uacute'] = 500;
+    t['Tcaron'] = 611;
+    t['partialdiff'] = 476;
+    t['ydieresis'] = 500;
+    t['Nacute'] = 722;
+    t['icircumflex'] = 278;
+    t['Ecircumflex'] = 611;
+    t['adieresis'] = 444;
+    t['edieresis'] = 444;
+    t['cacute'] = 444;
+    t['nacute'] = 500;
+    t['umacron'] = 500;
+    t['Ncaron'] = 722;
+    t['Iacute'] = 333;
+    t['plusminus'] = 564;
+    t['brokenbar'] = 200;
+    t['registered'] = 760;
+    t['Gbreve'] = 722;
+    t['Idotaccent'] = 333;
+    t['summation'] = 600;
+    t['Egrave'] = 611;
+    t['racute'] = 333;
+    t['omacron'] = 500;
+    t['Zacute'] = 611;
+    t['Zcaron'] = 611;
+    t['greaterequal'] = 549;
+    t['Eth'] = 722;
+    t['Ccedilla'] = 667;
+    t['lcommaaccent'] = 278;
+    t['tcaron'] = 326;
+    t['eogonek'] = 444;
+    t['Uogonek'] = 722;
+    t['Aacute'] = 722;
+    t['Adieresis'] = 722;
+    t['egrave'] = 444;
+    t['zacute'] = 444;
+    t['iogonek'] = 278;
+    t['Oacute'] = 722;
+    t['oacute'] = 500;
+    t['amacron'] = 444;
+    t['sacute'] = 389;
+    t['idieresis'] = 278;
+    t['Ocircumflex'] = 722;
+    t['Ugrave'] = 722;
+    t['Delta'] = 612;
+    t['thorn'] = 500;
+    t['twosuperior'] = 300;
+    t['Odieresis'] = 722;
+    t['mu'] = 500;
+    t['igrave'] = 278;
+    t['ohungarumlaut'] = 500;
+    t['Eogonek'] = 611;
+    t['dcroat'] = 500;
+    t['threequarters'] = 750;
+    t['Scedilla'] = 556;
+    t['lcaron'] = 344;
+    t['Kcommaaccent'] = 722;
+    t['Lacute'] = 611;
+    t['trademark'] = 980;
+    t['edotaccent'] = 444;
+    t['Igrave'] = 333;
+    t['Imacron'] = 333;
+    t['Lcaron'] = 611;
+    t['onehalf'] = 750;
+    t['lessequal'] = 549;
+    t['ocircumflex'] = 500;
+    t['ntilde'] = 500;
+    t['Uhungarumlaut'] = 722;
+    t['Eacute'] = 611;
+    t['emacron'] = 444;
+    t['gbreve'] = 500;
+    t['onequarter'] = 750;
+    t['Scaron'] = 556;
+    t['Scommaaccent'] = 556;
+    t['Ohungarumlaut'] = 722;
+    t['degree'] = 400;
+    t['ograve'] = 500;
+    t['Ccaron'] = 667;
+    t['ugrave'] = 500;
+    t['radical'] = 453;
+    t['Dcaron'] = 722;
+    t['rcommaaccent'] = 333;
+    t['Ntilde'] = 722;
+    t['otilde'] = 500;
+    t['Rcommaaccent'] = 667;
+    t['Lcommaaccent'] = 611;
+    t['Atilde'] = 722;
+    t['Aogonek'] = 722;
+    t['Aring'] = 722;
+    t['Otilde'] = 722;
+    t['zdotaccent'] = 444;
+    t['Ecaron'] = 611;
+    t['Iogonek'] = 333;
+    t['kcommaaccent'] = 500;
+    t['minus'] = 564;
+    t['Icircumflex'] = 333;
+    t['ncaron'] = 500;
+    t['tcommaaccent'] = 278;
+    t['logicalnot'] = 564;
+    t['odieresis'] = 500;
+    t['udieresis'] = 500;
+    t['notequal'] = 549;
+    t['gcommaaccent'] = 500;
+    t['eth'] = 500;
+    t['zcaron'] = 444;
+    t['ncommaaccent'] = 500;
+    t['onesuperior'] = 300;
+    t['imacron'] = 278;
+    t['Euro'] = 500;
+  });
+  t['Times-Bold'] = (0, _util.getLookupTableFactory)(function (t) {
+    t['space'] = 250;
+    t['exclam'] = 333;
+    t['quotedbl'] = 555;
+    t['numbersign'] = 500;
+    t['dollar'] = 500;
+    t['percent'] = 1000;
+    t['ampersand'] = 833;
+    t['quoteright'] = 333;
+    t['parenleft'] = 333;
+    t['parenright'] = 333;
+    t['asterisk'] = 500;
+    t['plus'] = 570;
+    t['comma'] = 250;
+    t['hyphen'] = 333;
+    t['period'] = 250;
+    t['slash'] = 278;
+    t['zero'] = 500;
+    t['one'] = 500;
+    t['two'] = 500;
+    t['three'] = 500;
+    t['four'] = 500;
+    t['five'] = 500;
+    t['six'] = 500;
+    t['seven'] = 500;
+    t['eight'] = 500;
+    t['nine'] = 500;
+    t['colon'] = 333;
+    t['semicolon'] = 333;
+    t['less'] = 570;
+    t['equal'] = 570;
+    t['greater'] = 570;
+    t['question'] = 500;
+    t['at'] = 930;
+    t['A'] = 722;
+    t['B'] = 667;
+    t['C'] = 722;
+    t['D'] = 722;
+    t['E'] = 667;
+    t['F'] = 611;
+    t['G'] = 778;
+    t['H'] = 778;
+    t['I'] = 389;
+    t['J'] = 500;
+    t['K'] = 778;
+    t['L'] = 667;
+    t['M'] = 944;
+    t['N'] = 722;
+    t['O'] = 778;
+    t['P'] = 611;
+    t['Q'] = 778;
+    t['R'] = 722;
+    t['S'] = 556;
+    t['T'] = 667;
+    t['U'] = 722;
+    t['V'] = 722;
+    t['W'] = 1000;
+    t['X'] = 722;
+    t['Y'] = 722;
+    t['Z'] = 667;
+    t['bracketleft'] = 333;
+    t['backslash'] = 278;
+    t['bracketright'] = 333;
+    t['asciicircum'] = 581;
+    t['underscore'] = 500;
+    t['quoteleft'] = 333;
+    t['a'] = 500;
+    t['b'] = 556;
+    t['c'] = 444;
+    t['d'] = 556;
+    t['e'] = 444;
+    t['f'] = 333;
+    t['g'] = 500;
+    t['h'] = 556;
+    t['i'] = 278;
+    t['j'] = 333;
+    t['k'] = 556;
+    t['l'] = 278;
+    t['m'] = 833;
+    t['n'] = 556;
+    t['o'] = 500;
+    t['p'] = 556;
+    t['q'] = 556;
+    t['r'] = 444;
+    t['s'] = 389;
+    t['t'] = 333;
+    t['u'] = 556;
+    t['v'] = 500;
+    t['w'] = 722;
+    t['x'] = 500;
+    t['y'] = 500;
+    t['z'] = 444;
+    t['braceleft'] = 394;
+    t['bar'] = 220;
+    t['braceright'] = 394;
+    t['asciitilde'] = 520;
+    t['exclamdown'] = 333;
+    t['cent'] = 500;
+    t['sterling'] = 500;
+    t['fraction'] = 167;
+    t['yen'] = 500;
+    t['florin'] = 500;
+    t['section'] = 500;
+    t['currency'] = 500;
+    t['quotesingle'] = 278;
+    t['quotedblleft'] = 500;
+    t['guillemotleft'] = 500;
+    t['guilsinglleft'] = 333;
+    t['guilsinglright'] = 333;
+    t['fi'] = 556;
+    t['fl'] = 556;
+    t['endash'] = 500;
+    t['dagger'] = 500;
+    t['daggerdbl'] = 500;
+    t['periodcentered'] = 250;
+    t['paragraph'] = 540;
+    t['bullet'] = 350;
+    t['quotesinglbase'] = 333;
+    t['quotedblbase'] = 500;
+    t['quotedblright'] = 500;
+    t['guillemotright'] = 500;
+    t['ellipsis'] = 1000;
+    t['perthousand'] = 1000;
+    t['questiondown'] = 500;
+    t['grave'] = 333;
+    t['acute'] = 333;
+    t['circumflex'] = 333;
+    t['tilde'] = 333;
+    t['macron'] = 333;
+    t['breve'] = 333;
+    t['dotaccent'] = 333;
+    t['dieresis'] = 333;
+    t['ring'] = 333;
+    t['cedilla'] = 333;
+    t['hungarumlaut'] = 333;
+    t['ogonek'] = 333;
+    t['caron'] = 333;
+    t['emdash'] = 1000;
+    t['AE'] = 1000;
+    t['ordfeminine'] = 300;
+    t['Lslash'] = 667;
+    t['Oslash'] = 778;
+    t['OE'] = 1000;
+    t['ordmasculine'] = 330;
+    t['ae'] = 722;
+    t['dotlessi'] = 278;
+    t['lslash'] = 278;
+    t['oslash'] = 500;
+    t['oe'] = 722;
+    t['germandbls'] = 556;
+    t['Idieresis'] = 389;
+    t['eacute'] = 444;
+    t['abreve'] = 500;
+    t['uhungarumlaut'] = 556;
+    t['ecaron'] = 444;
+    t['Ydieresis'] = 722;
+    t['divide'] = 570;
+    t['Yacute'] = 722;
+    t['Acircumflex'] = 722;
+    t['aacute'] = 500;
+    t['Ucircumflex'] = 722;
+    t['yacute'] = 500;
+    t['scommaaccent'] = 389;
+    t['ecircumflex'] = 444;
+    t['Uring'] = 722;
+    t['Udieresis'] = 722;
+    t['aogonek'] = 500;
+    t['Uacute'] = 722;
+    t['uogonek'] = 556;
+    t['Edieresis'] = 667;
+    t['Dcroat'] = 722;
+    t['commaaccent'] = 250;
+    t['copyright'] = 747;
+    t['Emacron'] = 667;
+    t['ccaron'] = 444;
+    t['aring'] = 500;
+    t['Ncommaaccent'] = 722;
+    t['lacute'] = 278;
+    t['agrave'] = 500;
+    t['Tcommaaccent'] = 667;
+    t['Cacute'] = 722;
+    t['atilde'] = 500;
+    t['Edotaccent'] = 667;
+    t['scaron'] = 389;
+    t['scedilla'] = 389;
+    t['iacute'] = 278;
+    t['lozenge'] = 494;
+    t['Rcaron'] = 722;
+    t['Gcommaaccent'] = 778;
+    t['ucircumflex'] = 556;
+    t['acircumflex'] = 500;
+    t['Amacron'] = 722;
+    t['rcaron'] = 444;
+    t['ccedilla'] = 444;
+    t['Zdotaccent'] = 667;
+    t['Thorn'] = 611;
+    t['Omacron'] = 778;
+    t['Racute'] = 722;
+    t['Sacute'] = 556;
+    t['dcaron'] = 672;
+    t['Umacron'] = 722;
+    t['uring'] = 556;
+    t['threesuperior'] = 300;
+    t['Ograve'] = 778;
+    t['Agrave'] = 722;
+    t['Abreve'] = 722;
+    t['multiply'] = 570;
+    t['uacute'] = 556;
+    t['Tcaron'] = 667;
+    t['partialdiff'] = 494;
+    t['ydieresis'] = 500;
+    t['Nacute'] = 722;
+    t['icircumflex'] = 278;
+    t['Ecircumflex'] = 667;
+    t['adieresis'] = 500;
+    t['edieresis'] = 444;
+    t['cacute'] = 444;
+    t['nacute'] = 556;
+    t['umacron'] = 556;
+    t['Ncaron'] = 722;
+    t['Iacute'] = 389;
+    t['plusminus'] = 570;
+    t['brokenbar'] = 220;
+    t['registered'] = 747;
+    t['Gbreve'] = 778;
+    t['Idotaccent'] = 389;
+    t['summation'] = 600;
+    t['Egrave'] = 667;
+    t['racute'] = 444;
+    t['omacron'] = 500;
+    t['Zacute'] = 667;
+    t['Zcaron'] = 667;
+    t['greaterequal'] = 549;
+    t['Eth'] = 722;
+    t['Ccedilla'] = 722;
+    t['lcommaaccent'] = 278;
+    t['tcaron'] = 416;
+    t['eogonek'] = 444;
+    t['Uogonek'] = 722;
+    t['Aacute'] = 722;
+    t['Adieresis'] = 722;
+    t['egrave'] = 444;
+    t['zacute'] = 444;
+    t['iogonek'] = 278;
+    t['Oacute'] = 778;
+    t['oacute'] = 500;
+    t['amacron'] = 500;
+    t['sacute'] = 389;
+    t['idieresis'] = 278;
+    t['Ocircumflex'] = 778;
+    t['Ugrave'] = 722;
+    t['Delta'] = 612;
+    t['thorn'] = 556;
+    t['twosuperior'] = 300;
+    t['Odieresis'] = 778;
+    t['mu'] = 556;
+    t['igrave'] = 278;
+    t['ohungarumlaut'] = 500;
+    t['Eogonek'] = 667;
+    t['dcroat'] = 556;
+    t['threequarters'] = 750;
+    t['Scedilla'] = 556;
+    t['lcaron'] = 394;
+    t['Kcommaaccent'] = 778;
+    t['Lacute'] = 667;
+    t['trademark'] = 1000;
+    t['edotaccent'] = 444;
+    t['Igrave'] = 389;
+    t['Imacron'] = 389;
+    t['Lcaron'] = 667;
+    t['onehalf'] = 750;
+    t['lessequal'] = 549;
+    t['ocircumflex'] = 500;
+    t['ntilde'] = 556;
+    t['Uhungarumlaut'] = 722;
+    t['Eacute'] = 667;
+    t['emacron'] = 444;
+    t['gbreve'] = 500;
+    t['onequarter'] = 750;
+    t['Scaron'] = 556;
+    t['Scommaaccent'] = 556;
+    t['Ohungarumlaut'] = 778;
+    t['degree'] = 400;
+    t['ograve'] = 500;
+    t['Ccaron'] = 722;
+    t['ugrave'] = 556;
+    t['radical'] = 549;
+    t['Dcaron'] = 722;
+    t['rcommaaccent'] = 444;
+    t['Ntilde'] = 722;
+    t['otilde'] = 500;
+    t['Rcommaaccent'] = 722;
+    t['Lcommaaccent'] = 667;
+    t['Atilde'] = 722;
+    t['Aogonek'] = 722;
+    t['Aring'] = 722;
+    t['Otilde'] = 778;
+    t['zdotaccent'] = 444;
+    t['Ecaron'] = 667;
+    t['Iogonek'] = 389;
+    t['kcommaaccent'] = 556;
+    t['minus'] = 570;
+    t['Icircumflex'] = 389;
+    t['ncaron'] = 556;
+    t['tcommaaccent'] = 333;
+    t['logicalnot'] = 570;
+    t['odieresis'] = 500;
+    t['udieresis'] = 556;
+    t['notequal'] = 549;
+    t['gcommaaccent'] = 500;
+    t['eth'] = 500;
+    t['zcaron'] = 444;
+    t['ncommaaccent'] = 556;
+    t['onesuperior'] = 300;
+    t['imacron'] = 278;
+    t['Euro'] = 500;
+  });
+  t['Times-BoldItalic'] = (0, _util.getLookupTableFactory)(function (t) {
+    t['space'] = 250;
+    t['exclam'] = 389;
+    t['quotedbl'] = 555;
+    t['numbersign'] = 500;
+    t['dollar'] = 500;
+    t['percent'] = 833;
+    t['ampersand'] = 778;
+    t['quoteright'] = 333;
+    t['parenleft'] = 333;
+    t['parenright'] = 333;
+    t['asterisk'] = 500;
+    t['plus'] = 570;
+    t['comma'] = 250;
+    t['hyphen'] = 333;
+    t['period'] = 250;
+    t['slash'] = 278;
+    t['zero'] = 500;
+    t['one'] = 500;
+    t['two'] = 500;
+    t['three'] = 500;
+    t['four'] = 500;
+    t['five'] = 500;
+    t['six'] = 500;
+    t['seven'] = 500;
+    t['eight'] = 500;
+    t['nine'] = 500;
+    t['colon'] = 333;
+    t['semicolon'] = 333;
+    t['less'] = 570;
+    t['equal'] = 570;
+    t['greater'] = 570;
+    t['question'] = 500;
+    t['at'] = 832;
+    t['A'] = 667;
+    t['B'] = 667;
+    t['C'] = 667;
+    t['D'] = 722;
+    t['E'] = 667;
+    t['F'] = 667;
+    t['G'] = 722;
+    t['H'] = 778;
+    t['I'] = 389;
+    t['J'] = 500;
+    t['K'] = 667;
+    t['L'] = 611;
+    t['M'] = 889;
+    t['N'] = 722;
+    t['O'] = 722;
+    t['P'] = 611;
+    t['Q'] = 722;
+    t['R'] = 667;
+    t['S'] = 556;
+    t['T'] = 611;
+    t['U'] = 722;
+    t['V'] = 667;
+    t['W'] = 889;
+    t['X'] = 667;
+    t['Y'] = 611;
+    t['Z'] = 611;
+    t['bracketleft'] = 333;
+    t['backslash'] = 278;
+    t['bracketright'] = 333;
+    t['asciicircum'] = 570;
+    t['underscore'] = 500;
+    t['quoteleft'] = 333;
+    t['a'] = 500;
+    t['b'] = 500;
+    t['c'] = 444;
+    t['d'] = 500;
+    t['e'] = 444;
+    t['f'] = 333;
+    t['g'] = 500;
+    t['h'] = 556;
+    t['i'] = 278;
+    t['j'] = 278;
+    t['k'] = 500;
+    t['l'] = 278;
+    t['m'] = 778;
+    t['n'] = 556;
+    t['o'] = 500;
+    t['p'] = 500;
+    t['q'] = 500;
+    t['r'] = 389;
+    t['s'] = 389;
+    t['t'] = 278;
+    t['u'] = 556;
+    t['v'] = 444;
+    t['w'] = 667;
+    t['x'] = 500;
+    t['y'] = 444;
+    t['z'] = 389;
+    t['braceleft'] = 348;
+    t['bar'] = 220;
+    t['braceright'] = 348;
+    t['asciitilde'] = 570;
+    t['exclamdown'] = 389;
+    t['cent'] = 500;
+    t['sterling'] = 500;
+    t['fraction'] = 167;
+    t['yen'] = 500;
+    t['florin'] = 500;
+    t['section'] = 500;
+    t['currency'] = 500;
+    t['quotesingle'] = 278;
+    t['quotedblleft'] = 500;
+    t['guillemotleft'] = 500;
+    t['guilsinglleft'] = 333;
+    t['guilsinglright'] = 333;
+    t['fi'] = 556;
+    t['fl'] = 556;
+    t['endash'] = 500;
+    t['dagger'] = 500;
+    t['daggerdbl'] = 500;
+    t['periodcentered'] = 250;
+    t['paragraph'] = 500;
+    t['bullet'] = 350;
+    t['quotesinglbase'] = 333;
+    t['quotedblbase'] = 500;
+    t['quotedblright'] = 500;
+    t['guillemotright'] = 500;
+    t['ellipsis'] = 1000;
+    t['perthousand'] = 1000;
+    t['questiondown'] = 500;
+    t['grave'] = 333;
+    t['acute'] = 333;
+    t['circumflex'] = 333;
+    t['tilde'] = 333;
+    t['macron'] = 333;
+    t['breve'] = 333;
+    t['dotaccent'] = 333;
+    t['dieresis'] = 333;
+    t['ring'] = 333;
+    t['cedilla'] = 333;
+    t['hungarumlaut'] = 333;
+    t['ogonek'] = 333;
+    t['caron'] = 333;
+    t['emdash'] = 1000;
+    t['AE'] = 944;
+    t['ordfeminine'] = 266;
+    t['Lslash'] = 611;
+    t['Oslash'] = 722;
+    t['OE'] = 944;
+    t['ordmasculine'] = 300;
+    t['ae'] = 722;
+    t['dotlessi'] = 278;
+    t['lslash'] = 278;
+    t['oslash'] = 500;
+    t['oe'] = 722;
+    t['germandbls'] = 500;
+    t['Idieresis'] = 389;
+    t['eacute'] = 444;
+    t['abreve'] = 500;
+    t['uhungarumlaut'] = 556;
+    t['ecaron'] = 444;
+    t['Ydieresis'] = 611;
+    t['divide'] = 570;
+    t['Yacute'] = 611;
+    t['Acircumflex'] = 667;
+    t['aacute'] = 500;
+    t['Ucircumflex'] = 722;
+    t['yacute'] = 444;
+    t['scommaaccent'] = 389;
+    t['ecircumflex'] = 444;
+    t['Uring'] = 722;
+    t['Udieresis'] = 722;
+    t['aogonek'] = 500;
+    t['Uacute'] = 722;
+    t['uogonek'] = 556;
+    t['Edieresis'] = 667;
+    t['Dcroat'] = 722;
+    t['commaaccent'] = 250;
+    t['copyright'] = 747;
+    t['Emacron'] = 667;
+    t['ccaron'] = 444;
+    t['aring'] = 500;
+    t['Ncommaaccent'] = 722;
+    t['lacute'] = 278;
+    t['agrave'] = 500;
+    t['Tcommaaccent'] = 611;
+    t['Cacute'] = 667;
+    t['atilde'] = 500;
+    t['Edotaccent'] = 667;
+    t['scaron'] = 389;
+    t['scedilla'] = 389;
+    t['iacute'] = 278;
+    t['lozenge'] = 494;
+    t['Rcaron'] = 667;
+    t['Gcommaaccent'] = 722;
+    t['ucircumflex'] = 556;
+    t['acircumflex'] = 500;
+    t['Amacron'] = 667;
+    t['rcaron'] = 389;
+    t['ccedilla'] = 444;
+    t['Zdotaccent'] = 611;
+    t['Thorn'] = 611;
+    t['Omacron'] = 722;
+    t['Racute'] = 667;
+    t['Sacute'] = 556;
+    t['dcaron'] = 608;
+    t['Umacron'] = 722;
+    t['uring'] = 556;
+    t['threesuperior'] = 300;
+    t['Ograve'] = 722;
+    t['Agrave'] = 667;
+    t['Abreve'] = 667;
+    t['multiply'] = 570;
+    t['uacute'] = 556;
+    t['Tcaron'] = 611;
+    t['partialdiff'] = 494;
+    t['ydieresis'] = 444;
+    t['Nacute'] = 722;
+    t['icircumflex'] = 278;
+    t['Ecircumflex'] = 667;
+    t['adieresis'] = 500;
+    t['edieresis'] = 444;
+    t['cacute'] = 444;
+    t['nacute'] = 556;
+    t['umacron'] = 556;
+    t['Ncaron'] = 722;
+    t['Iacute'] = 389;
+    t['plusminus'] = 570;
+    t['brokenbar'] = 220;
+    t['registered'] = 747;
+    t['Gbreve'] = 722;
+    t['Idotaccent'] = 389;
+    t['summation'] = 600;
+    t['Egrave'] = 667;
+    t['racute'] = 389;
+    t['omacron'] = 500;
+    t['Zacute'] = 611;
+    t['Zcaron'] = 611;
+    t['greaterequal'] = 549;
+    t['Eth'] = 722;
+    t['Ccedilla'] = 667;
+    t['lcommaaccent'] = 278;
+    t['tcaron'] = 366;
+    t['eogonek'] = 444;
+    t['Uogonek'] = 722;
+    t['Aacute'] = 667;
+    t['Adieresis'] = 667;
+    t['egrave'] = 444;
+    t['zacute'] = 389;
+    t['iogonek'] = 278;
+    t['Oacute'] = 722;
+    t['oacute'] = 500;
+    t['amacron'] = 500;
+    t['sacute'] = 389;
+    t['idieresis'] = 278;
+    t['Ocircumflex'] = 722;
+    t['Ugrave'] = 722;
+    t['Delta'] = 612;
+    t['thorn'] = 500;
+    t['twosuperior'] = 300;
+    t['Odieresis'] = 722;
+    t['mu'] = 576;
+    t['igrave'] = 278;
+    t['ohungarumlaut'] = 500;
+    t['Eogonek'] = 667;
+    t['dcroat'] = 500;
+    t['threequarters'] = 750;
+    t['Scedilla'] = 556;
+    t['lcaron'] = 382;
+    t['Kcommaaccent'] = 667;
+    t['Lacute'] = 611;
+    t['trademark'] = 1000;
+    t['edotaccent'] = 444;
+    t['Igrave'] = 389;
+    t['Imacron'] = 389;
+    t['Lcaron'] = 611;
+    t['onehalf'] = 750;
+    t['lessequal'] = 549;
+    t['ocircumflex'] = 500;
+    t['ntilde'] = 556;
+    t['Uhungarumlaut'] = 722;
+    t['Eacute'] = 667;
+    t['emacron'] = 444;
+    t['gbreve'] = 500;
+    t['onequarter'] = 750;
+    t['Scaron'] = 556;
+    t['Scommaaccent'] = 556;
+    t['Ohungarumlaut'] = 722;
+    t['degree'] = 400;
+    t['ograve'] = 500;
+    t['Ccaron'] = 667;
+    t['ugrave'] = 556;
+    t['radical'] = 549;
+    t['Dcaron'] = 722;
+    t['rcommaaccent'] = 389;
+    t['Ntilde'] = 722;
+    t['otilde'] = 500;
+    t['Rcommaaccent'] = 667;
+    t['Lcommaaccent'] = 611;
+    t['Atilde'] = 667;
+    t['Aogonek'] = 667;
+    t['Aring'] = 667;
+    t['Otilde'] = 722;
+    t['zdotaccent'] = 389;
+    t['Ecaron'] = 667;
+    t['Iogonek'] = 389;
+    t['kcommaaccent'] = 500;
+    t['minus'] = 606;
+    t['Icircumflex'] = 389;
+    t['ncaron'] = 556;
+    t['tcommaaccent'] = 278;
+    t['logicalnot'] = 606;
+    t['odieresis'] = 500;
+    t['udieresis'] = 556;
+    t['notequal'] = 549;
+    t['gcommaaccent'] = 500;
+    t['eth'] = 500;
+    t['zcaron'] = 389;
+    t['ncommaaccent'] = 556;
+    t['onesuperior'] = 300;
+    t['imacron'] = 278;
+    t['Euro'] = 500;
+  });
+  t['Times-Italic'] = (0, _util.getLookupTableFactory)(function (t) {
+    t['space'] = 250;
+    t['exclam'] = 333;
+    t['quotedbl'] = 420;
+    t['numbersign'] = 500;
+    t['dollar'] = 500;
+    t['percent'] = 833;
+    t['ampersand'] = 778;
+    t['quoteright'] = 333;
+    t['parenleft'] = 333;
+    t['parenright'] = 333;
+    t['asterisk'] = 500;
+    t['plus'] = 675;
+    t['comma'] = 250;
+    t['hyphen'] = 333;
+    t['period'] = 250;
+    t['slash'] = 278;
+    t['zero'] = 500;
+    t['one'] = 500;
+    t['two'] = 500;
+    t['three'] = 500;
+    t['four'] = 500;
+    t['five'] = 500;
+    t['six'] = 500;
+    t['seven'] = 500;
+    t['eight'] = 500;
+    t['nine'] = 500;
+    t['colon'] = 333;
+    t['semicolon'] = 333;
+    t['less'] = 675;
+    t['equal'] = 675;
+    t['greater'] = 675;
+    t['question'] = 500;
+    t['at'] = 920;
+    t['A'] = 611;
+    t['B'] = 611;
+    t['C'] = 667;
+    t['D'] = 722;
+    t['E'] = 611;
+    t['F'] = 611;
+    t['G'] = 722;
+    t['H'] = 722;
+    t['I'] = 333;
+    t['J'] = 444;
+    t['K'] = 667;
+    t['L'] = 556;
+    t['M'] = 833;
+    t['N'] = 667;
+    t['O'] = 722;
+    t['P'] = 611;
+    t['Q'] = 722;
+    t['R'] = 611;
+    t['S'] = 500;
+    t['T'] = 556;
+    t['U'] = 722;
+    t['V'] = 611;
+    t['W'] = 833;
+    t['X'] = 611;
+    t['Y'] = 556;
+    t['Z'] = 556;
+    t['bracketleft'] = 389;
+    t['backslash'] = 278;
+    t['bracketright'] = 389;
+    t['asciicircum'] = 422;
+    t['underscore'] = 500;
+    t['quoteleft'] = 333;
+    t['a'] = 500;
+    t['b'] = 500;
+    t['c'] = 444;
+    t['d'] = 500;
+    t['e'] = 444;
+    t['f'] = 278;
+    t['g'] = 500;
+    t['h'] = 500;
+    t['i'] = 278;
+    t['j'] = 278;
+    t['k'] = 444;
+    t['l'] = 278;
+    t['m'] = 722;
+    t['n'] = 500;
+    t['o'] = 500;
+    t['p'] = 500;
+    t['q'] = 500;
+    t['r'] = 389;
+    t['s'] = 389;
+    t['t'] = 278;
+    t['u'] = 500;
+    t['v'] = 444;
+    t['w'] = 667;
+    t['x'] = 444;
+    t['y'] = 444;
+    t['z'] = 389;
+    t['braceleft'] = 400;
+    t['bar'] = 275;
+    t['braceright'] = 400;
+    t['asciitilde'] = 541;
+    t['exclamdown'] = 389;
+    t['cent'] = 500;
+    t['sterling'] = 500;
+    t['fraction'] = 167;
+    t['yen'] = 500;
+    t['florin'] = 500;
+    t['section'] = 500;
+    t['currency'] = 500;
+    t['quotesingle'] = 214;
+    t['quotedblleft'] = 556;
+    t['guillemotleft'] = 500;
+    t['guilsinglleft'] = 333;
+    t['guilsinglright'] = 333;
+    t['fi'] = 500;
+    t['fl'] = 500;
+    t['endash'] = 500;
+    t['dagger'] = 500;
+    t['daggerdbl'] = 500;
+    t['periodcentered'] = 250;
+    t['paragraph'] = 523;
+    t['bullet'] = 350;
+    t['quotesinglbase'] = 333;
+    t['quotedblbase'] = 556;
+    t['quotedblright'] = 556;
+    t['guillemotright'] = 500;
+    t['ellipsis'] = 889;
+    t['perthousand'] = 1000;
+    t['questiondown'] = 500;
+    t['grave'] = 333;
+    t['acute'] = 333;
+    t['circumflex'] = 333;
+    t['tilde'] = 333;
+    t['macron'] = 333;
+    t['breve'] = 333;
+    t['dotaccent'] = 333;
+    t['dieresis'] = 333;
+    t['ring'] = 333;
+    t['cedilla'] = 333;
+    t['hungarumlaut'] = 333;
+    t['ogonek'] = 333;
+    t['caron'] = 333;
+    t['emdash'] = 889;
+    t['AE'] = 889;
+    t['ordfeminine'] = 276;
+    t['Lslash'] = 556;
+    t['Oslash'] = 722;
+    t['OE'] = 944;
+    t['ordmasculine'] = 310;
+    t['ae'] = 667;
+    t['dotlessi'] = 278;
+    t['lslash'] = 278;
+    t['oslash'] = 500;
+    t['oe'] = 667;
+    t['germandbls'] = 500;
+    t['Idieresis'] = 333;
+    t['eacute'] = 444;
+    t['abreve'] = 500;
+    t['uhungarumlaut'] = 500;
+    t['ecaron'] = 444;
+    t['Ydieresis'] = 556;
+    t['divide'] = 675;
+    t['Yacute'] = 556;
+    t['Acircumflex'] = 611;
+    t['aacute'] = 500;
+    t['Ucircumflex'] = 722;
+    t['yacute'] = 444;
+    t['scommaaccent'] = 389;
+    t['ecircumflex'] = 444;
+    t['Uring'] = 722;
+    t['Udieresis'] = 722;
+    t['aogonek'] = 500;
+    t['Uacute'] = 722;
+    t['uogonek'] = 500;
+    t['Edieresis'] = 611;
+    t['Dcroat'] = 722;
+    t['commaaccent'] = 250;
+    t['copyright'] = 760;
+    t['Emacron'] = 611;
+    t['ccaron'] = 444;
+    t['aring'] = 500;
+    t['Ncommaaccent'] = 667;
+    t['lacute'] = 278;
+    t['agrave'] = 500;
+    t['Tcommaaccent'] = 556;
+    t['Cacute'] = 667;
+    t['atilde'] = 500;
+    t['Edotaccent'] = 611;
+    t['scaron'] = 389;
+    t['scedilla'] = 389;
+    t['iacute'] = 278;
+    t['lozenge'] = 471;
+    t['Rcaron'] = 611;
+    t['Gcommaaccent'] = 722;
+    t['ucircumflex'] = 500;
+    t['acircumflex'] = 500;
+    t['Amacron'] = 611;
+    t['rcaron'] = 389;
+    t['ccedilla'] = 444;
+    t['Zdotaccent'] = 556;
+    t['Thorn'] = 611;
+    t['Omacron'] = 722;
+    t['Racute'] = 611;
+    t['Sacute'] = 500;
+    t['dcaron'] = 544;
+    t['Umacron'] = 722;
+    t['uring'] = 500;
+    t['threesuperior'] = 300;
+    t['Ograve'] = 722;
+    t['Agrave'] = 611;
+    t['Abreve'] = 611;
+    t['multiply'] = 675;
+    t['uacute'] = 500;
+    t['Tcaron'] = 556;
+    t['partialdiff'] = 476;
+    t['ydieresis'] = 444;
+    t['Nacute'] = 667;
+    t['icircumflex'] = 278;
+    t['Ecircumflex'] = 611;
+    t['adieresis'] = 500;
+    t['edieresis'] = 444;
+    t['cacute'] = 444;
+    t['nacute'] = 500;
+    t['umacron'] = 500;
+    t['Ncaron'] = 667;
+    t['Iacute'] = 333;
+    t['plusminus'] = 675;
+    t['brokenbar'] = 275;
+    t['registered'] = 760;
+    t['Gbreve'] = 722;
+    t['Idotaccent'] = 333;
+    t['summation'] = 600;
+    t['Egrave'] = 611;
+    t['racute'] = 389;
+    t['omacron'] = 500;
+    t['Zacute'] = 556;
+    t['Zcaron'] = 556;
+    t['greaterequal'] = 549;
+    t['Eth'] = 722;
+    t['Ccedilla'] = 667;
+    t['lcommaaccent'] = 278;
+    t['tcaron'] = 300;
+    t['eogonek'] = 444;
+    t['Uogonek'] = 722;
+    t['Aacute'] = 611;
+    t['Adieresis'] = 611;
+    t['egrave'] = 444;
+    t['zacute'] = 389;
+    t['iogonek'] = 278;
+    t['Oacute'] = 722;
+    t['oacute'] = 500;
+    t['amacron'] = 500;
+    t['sacute'] = 389;
+    t['idieresis'] = 278;
+    t['Ocircumflex'] = 722;
+    t['Ugrave'] = 722;
+    t['Delta'] = 612;
+    t['thorn'] = 500;
+    t['twosuperior'] = 300;
+    t['Odieresis'] = 722;
+    t['mu'] = 500;
+    t['igrave'] = 278;
+    t['ohungarumlaut'] = 500;
+    t['Eogonek'] = 611;
+    t['dcroat'] = 500;
+    t['threequarters'] = 750;
+    t['Scedilla'] = 500;
+    t['lcaron'] = 300;
+    t['Kcommaaccent'] = 667;
+    t['Lacute'] = 556;
+    t['trademark'] = 980;
+    t['edotaccent'] = 444;
+    t['Igrave'] = 333;
+    t['Imacron'] = 333;
+    t['Lcaron'] = 611;
+    t['onehalf'] = 750;
+    t['lessequal'] = 549;
+    t['ocircumflex'] = 500;
+    t['ntilde'] = 500;
+    t['Uhungarumlaut'] = 722;
+    t['Eacute'] = 611;
+    t['emacron'] = 444;
+    t['gbreve'] = 500;
+    t['onequarter'] = 750;
+    t['Scaron'] = 500;
+    t['Scommaaccent'] = 500;
+    t['Ohungarumlaut'] = 722;
+    t['degree'] = 400;
+    t['ograve'] = 500;
+    t['Ccaron'] = 667;
+    t['ugrave'] = 500;
+    t['radical'] = 453;
+    t['Dcaron'] = 722;
+    t['rcommaaccent'] = 389;
+    t['Ntilde'] = 667;
+    t['otilde'] = 500;
+    t['Rcommaaccent'] = 611;
+    t['Lcommaaccent'] = 556;
+    t['Atilde'] = 611;
+    t['Aogonek'] = 611;
+    t['Aring'] = 611;
+    t['Otilde'] = 722;
+    t['zdotaccent'] = 389;
+    t['Ecaron'] = 611;
+    t['Iogonek'] = 333;
+    t['kcommaaccent'] = 444;
+    t['minus'] = 675;
+    t['Icircumflex'] = 333;
+    t['ncaron'] = 500;
+    t['tcommaaccent'] = 278;
+    t['logicalnot'] = 675;
+    t['odieresis'] = 500;
+    t['udieresis'] = 500;
+    t['notequal'] = 549;
+    t['gcommaaccent'] = 500;
+    t['eth'] = 500;
+    t['zcaron'] = 389;
+    t['ncommaaccent'] = 500;
+    t['onesuperior'] = 300;
+    t['imacron'] = 278;
+    t['Euro'] = 500;
+  });
+  t['ZapfDingbats'] = (0, _util.getLookupTableFactory)(function (t) {
+    t['space'] = 278;
+    t['a1'] = 974;
+    t['a2'] = 961;
+    t['a202'] = 974;
+    t['a3'] = 980;
+    t['a4'] = 719;
+    t['a5'] = 789;
+    t['a119'] = 790;
+    t['a118'] = 791;
+    t['a117'] = 690;
+    t['a11'] = 960;
+    t['a12'] = 939;
+    t['a13'] = 549;
+    t['a14'] = 855;
+    t['a15'] = 911;
+    t['a16'] = 933;
+    t['a105'] = 911;
+    t['a17'] = 945;
+    t['a18'] = 974;
+    t['a19'] = 755;
+    t['a20'] = 846;
+    t['a21'] = 762;
+    t['a22'] = 761;
+    t['a23'] = 571;
+    t['a24'] = 677;
+    t['a25'] = 763;
+    t['a26'] = 760;
+    t['a27'] = 759;
+    t['a28'] = 754;
+    t['a6'] = 494;
+    t['a7'] = 552;
+    t['a8'] = 537;
+    t['a9'] = 577;
+    t['a10'] = 692;
+    t['a29'] = 786;
+    t['a30'] = 788;
+    t['a31'] = 788;
+    t['a32'] = 790;
+    t['a33'] = 793;
+    t['a34'] = 794;
+    t['a35'] = 816;
+    t['a36'] = 823;
+    t['a37'] = 789;
+    t['a38'] = 841;
+    t['a39'] = 823;
+    t['a40'] = 833;
+    t['a41'] = 816;
+    t['a42'] = 831;
+    t['a43'] = 923;
+    t['a44'] = 744;
+    t['a45'] = 723;
+    t['a46'] = 749;
+    t['a47'] = 790;
+    t['a48'] = 792;
+    t['a49'] = 695;
+    t['a50'] = 776;
+    t['a51'] = 768;
+    t['a52'] = 792;
+    t['a53'] = 759;
+    t['a54'] = 707;
+    t['a55'] = 708;
+    t['a56'] = 682;
+    t['a57'] = 701;
+    t['a58'] = 826;
+    t['a59'] = 815;
+    t['a60'] = 789;
+    t['a61'] = 789;
+    t['a62'] = 707;
+    t['a63'] = 687;
+    t['a64'] = 696;
+    t['a65'] = 689;
+    t['a66'] = 786;
+    t['a67'] = 787;
+    t['a68'] = 713;
+    t['a69'] = 791;
+    t['a70'] = 785;
+    t['a71'] = 791;
+    t['a72'] = 873;
+    t['a73'] = 761;
+    t['a74'] = 762;
+    t['a203'] = 762;
+    t['a75'] = 759;
+    t['a204'] = 759;
+    t['a76'] = 892;
+    t['a77'] = 892;
+    t['a78'] = 788;
+    t['a79'] = 784;
+    t['a81'] = 438;
+    t['a82'] = 138;
+    t['a83'] = 277;
+    t['a84'] = 415;
+    t['a97'] = 392;
+    t['a98'] = 392;
+    t['a99'] = 668;
+    t['a100'] = 668;
+    t['a89'] = 390;
+    t['a90'] = 390;
+    t['a93'] = 317;
+    t['a94'] = 317;
+    t['a91'] = 276;
+    t['a92'] = 276;
+    t['a205'] = 509;
+    t['a85'] = 509;
+    t['a206'] = 410;
+    t['a86'] = 410;
+    t['a87'] = 234;
+    t['a88'] = 234;
+    t['a95'] = 334;
+    t['a96'] = 334;
+    t['a101'] = 732;
+    t['a102'] = 544;
+    t['a103'] = 544;
+    t['a104'] = 910;
+    t['a106'] = 667;
+    t['a107'] = 760;
+    t['a108'] = 760;
+    t['a112'] = 776;
+    t['a111'] = 595;
+    t['a110'] = 694;
+    t['a109'] = 626;
+    t['a120'] = 788;
+    t['a121'] = 788;
+    t['a122'] = 788;
+    t['a123'] = 788;
+    t['a124'] = 788;
+    t['a125'] = 788;
+    t['a126'] = 788;
+    t['a127'] = 788;
+    t['a128'] = 788;
+    t['a129'] = 788;
+    t['a130'] = 788;
+    t['a131'] = 788;
+    t['a132'] = 788;
+    t['a133'] = 788;
+    t['a134'] = 788;
+    t['a135'] = 788;
+    t['a136'] = 788;
+    t['a137'] = 788;
+    t['a138'] = 788;
+    t['a139'] = 788;
+    t['a140'] = 788;
+    t['a141'] = 788;
+    t['a142'] = 788;
+    t['a143'] = 788;
+    t['a144'] = 788;
+    t['a145'] = 788;
+    t['a146'] = 788;
+    t['a147'] = 788;
+    t['a148'] = 788;
+    t['a149'] = 788;
+    t['a150'] = 788;
+    t['a151'] = 788;
+    t['a152'] = 788;
+    t['a153'] = 788;
+    t['a154'] = 788;
+    t['a155'] = 788;
+    t['a156'] = 788;
+    t['a157'] = 788;
+    t['a158'] = 788;
+    t['a159'] = 788;
+    t['a160'] = 894;
+    t['a161'] = 838;
+    t['a163'] = 1016;
+    t['a164'] = 458;
+    t['a196'] = 748;
+    t['a165'] = 924;
+    t['a192'] = 748;
+    t['a166'] = 918;
+    t['a167'] = 927;
+    t['a168'] = 928;
+    t['a169'] = 928;
+    t['a170'] = 834;
+    t['a171'] = 873;
+    t['a172'] = 828;
+    t['a173'] = 924;
+    t['a162'] = 924;
+    t['a174'] = 917;
+    t['a175'] = 930;
+    t['a176'] = 931;
+    t['a177'] = 463;
+    t['a178'] = 883;
+    t['a179'] = 836;
+    t['a193'] = 836;
+    t['a180'] = 867;
+    t['a199'] = 867;
+    t['a181'] = 696;
+    t['a200'] = 696;
+    t['a182'] = 874;
+    t['a201'] = 874;
+    t['a183'] = 760;
+    t['a184'] = 946;
+    t['a197'] = 771;
+    t['a185'] = 865;
+    t['a194'] = 771;
+    t['a198'] = 888;
+    t['a186'] = 967;
+    t['a195'] = 888;
+    t['a187'] = 831;
+    t['a188'] = 873;
+    t['a189'] = 927;
+    t['a190'] = 970;
+    t['a191'] = 918;
+  });
+});
+exports.getMetrics = getMetrics;
+
+/***/ }),
+/* 168 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.PostScriptCompiler = exports.PostScriptEvaluator = exports.PDFFunctionFactory = exports.isPDFFunction = undefined;
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _util = __w_pdfjs_require__(2);
+
+var _primitives = __w_pdfjs_require__(138);
+
+var _ps_parser = __w_pdfjs_require__(169);
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var IsEvalSupportedCached = {
+  get value() {
+    return (0, _util.shadow)(this, 'value', (0, _util.isEvalSupported)());
+  }
+};
+
+var PDFFunctionFactory = function () {
+  function PDFFunctionFactory(_ref) {
+    var xref = _ref.xref,
+        _ref$isEvalSupported = _ref.isEvalSupported,
+        isEvalSupported = _ref$isEvalSupported === undefined ? true : _ref$isEvalSupported;
+
+    _classCallCheck(this, PDFFunctionFactory);
+
+    this.xref = xref;
+    this.isEvalSupported = isEvalSupported !== false;
+  }
+
+  _createClass(PDFFunctionFactory, [{
+    key: 'create',
+    value: function create(fn) {
+      return PDFFunction.parse({
+        xref: this.xref,
+        isEvalSupported: this.isEvalSupported,
+        fn: fn
+      });
+    }
+  }, {
+    key: 'createFromArray',
+    value: function createFromArray(fnObj) {
+      return PDFFunction.parseArray({
+        xref: this.xref,
+        isEvalSupported: this.isEvalSupported,
+        fnObj: fnObj
+      });
+    }
+  }]);
+
+  return PDFFunctionFactory;
+}();
+
+function toNumberArray(arr) {
+  if (!Array.isArray(arr)) {
+    return null;
+  }
+  var length = arr.length;
+  for (var i = 0; i < length; i++) {
+    if (typeof arr[i] !== 'number') {
+      var result = new Array(length);
+      for (var _i = 0; _i < length; _i++) {
+        result[_i] = +arr[_i];
+      }
+      return result;
+    }
+  }
+  return arr;
+}
+var PDFFunction = function PDFFunctionClosure() {
+  var CONSTRUCT_SAMPLED = 0;
+  var CONSTRUCT_INTERPOLATED = 2;
+  var CONSTRUCT_STICHED = 3;
+  var CONSTRUCT_POSTSCRIPT = 4;
+  return {
+    getSampleArray: function getSampleArray(size, outputSize, bps, stream) {
+      var i, ii;
+      var length = 1;
+      for (i = 0, ii = size.length; i < ii; i++) {
+        length *= size[i];
+      }
+      length *= outputSize;
+      var array = new Array(length);
+      var codeSize = 0;
+      var codeBuf = 0;
+      var sampleMul = 1.0 / (Math.pow(2.0, bps) - 1);
+      var strBytes = stream.getBytes((length * bps + 7) / 8);
+      var strIdx = 0;
+      for (i = 0; i < length; i++) {
+        while (codeSize < bps) {
+          codeBuf <<= 8;
+          codeBuf |= strBytes[strIdx++];
+          codeSize += 8;
+        }
+        codeSize -= bps;
+        array[i] = (codeBuf >> codeSize) * sampleMul;
+        codeBuf &= (1 << codeSize) - 1;
+      }
+      return array;
+    },
+    getIR: function getIR(_ref2) {
+      var xref = _ref2.xref,
+          isEvalSupported = _ref2.isEvalSupported,
+          fn = _ref2.fn;
+
+      var dict = fn.dict;
+      if (!dict) {
+        dict = fn;
+      }
+      var types = [this.constructSampled, null, this.constructInterpolated, this.constructStiched, this.constructPostScript];
+      var typeNum = dict.get('FunctionType');
+      var typeFn = types[typeNum];
+      if (!typeFn) {
+        throw new _util.FormatError('Unknown type of function');
+      }
+      return typeFn.call(this, {
+        xref: xref,
+        isEvalSupported: isEvalSupported,
+        fn: fn,
+        dict: dict
+      });
+    },
+    fromIR: function fromIR(_ref3) {
+      var xref = _ref3.xref,
+          isEvalSupported = _ref3.isEvalSupported,
+          IR = _ref3.IR;
+
+      var type = IR[0];
+      switch (type) {
+        case CONSTRUCT_SAMPLED:
+          return this.constructSampledFromIR({
+            xref: xref,
+            isEvalSupported: isEvalSupported,
+            IR: IR
+          });
+        case CONSTRUCT_INTERPOLATED:
+          return this.constructInterpolatedFromIR({
+            xref: xref,
+            isEvalSupported: isEvalSupported,
+            IR: IR
+          });
+        case CONSTRUCT_STICHED:
+          return this.constructStichedFromIR({
+            xref: xref,
+            isEvalSupported: isEvalSupported,
+            IR: IR
+          });
+        default:
+          return this.constructPostScriptFromIR({
+            xref: xref,
+            isEvalSupported: isEvalSupported,
+            IR: IR
+          });
+      }
+    },
+    parse: function parse(_ref4) {
+      var xref = _ref4.xref,
+          isEvalSupported = _ref4.isEvalSupported,
+          fn = _ref4.fn;
+
+      var IR = this.getIR({
+        xref: xref,
+        isEvalSupported: isEvalSupported,
+        fn: fn
+      });
+      return this.fromIR({
+        xref: xref,
+        isEvalSupported: isEvalSupported,
+        IR: IR
+      });
+    },
+    parseArray: function parseArray(_ref5) {
+      var xref = _ref5.xref,
+          isEvalSupported = _ref5.isEvalSupported,
+          fnObj = _ref5.fnObj;
+
+      if (!Array.isArray(fnObj)) {
+        return this.parse({
+          xref: xref,
+          isEvalSupported: isEvalSupported,
+          fn: fnObj
+        });
+      }
+      var fnArray = [];
+      for (var j = 0, jj = fnObj.length; j < jj; j++) {
+        fnArray.push(this.parse({
+          xref: xref,
+          isEvalSupported: isEvalSupported,
+          fn: xref.fetchIfRef(fnObj[j])
+        }));
+      }
+      return function (src, srcOffset, dest, destOffset) {
+        for (var i = 0, ii = fnArray.length; i < ii; i++) {
+          fnArray[i](src, srcOffset, dest, destOffset + i);
+        }
+      };
+    },
+    constructSampled: function constructSampled(_ref6) {
+      var xref = _ref6.xref,
+          isEvalSupported = _ref6.isEvalSupported,
+          fn = _ref6.fn,
+          dict = _ref6.dict;
+
+      function toMultiArray(arr) {
+        var inputLength = arr.length;
+        var out = [];
+        var index = 0;
+        for (var i = 0; i < inputLength; i += 2) {
+          out[index] = [arr[i], arr[i + 1]];
+          ++index;
+        }
+        return out;
+      }
+      var domain = toNumberArray(dict.getArray('Domain'));
+      var range = toNumberArray(dict.getArray('Range'));
+      if (!domain || !range) {
+        throw new _util.FormatError('No domain or range');
+      }
+      var inputSize = domain.length / 2;
+      var outputSize = range.length / 2;
+      domain = toMultiArray(domain);
+      range = toMultiArray(range);
+      var size = toNumberArray(dict.getArray('Size'));
+      var bps = dict.get('BitsPerSample');
+      var order = dict.get('Order') || 1;
+      if (order !== 1) {
+        (0, _util.info)('No support for cubic spline interpolation: ' + order);
+      }
+      var encode = toNumberArray(dict.getArray('Encode'));
+      if (!encode) {
+        encode = [];
+        for (var i = 0; i < inputSize; ++i) {
+          encode.push([0, size[i] - 1]);
+        }
+      } else {
+        encode = toMultiArray(encode);
+      }
+      var decode = toNumberArray(dict.getArray('Decode'));
+      if (!decode) {
+        decode = range;
+      } else {
+        decode = toMultiArray(decode);
+      }
+      var samples = this.getSampleArray(size, outputSize, bps, fn);
+      return [CONSTRUCT_SAMPLED, inputSize, domain, encode, decode, samples, size, outputSize, Math.pow(2, bps) - 1, range];
+    },
+    constructSampledFromIR: function constructSampledFromIR(_ref7) {
+      var xref = _ref7.xref,
+          isEvalSupported = _ref7.isEvalSupported,
+          IR = _ref7.IR;
+
+      function interpolate(x, xmin, xmax, ymin, ymax) {
+        return ymin + (x - xmin) * ((ymax - ymin) / (xmax - xmin));
+      }
+      return function constructSampledFromIRResult(src, srcOffset, dest, destOffset) {
+        var m = IR[1];
+        var domain = IR[2];
+        var encode = IR[3];
+        var decode = IR[4];
+        var samples = IR[5];
+        var size = IR[6];
+        var n = IR[7];
+        var range = IR[9];
+        var cubeVertices = 1 << m;
+        var cubeN = new Float64Array(cubeVertices);
+        var cubeVertex = new Uint32Array(cubeVertices);
+        var i, j;
+        for (j = 0; j < cubeVertices; j++) {
+          cubeN[j] = 1;
+        }
+        var k = n,
+            pos = 1;
+        for (i = 0; i < m; ++i) {
+          var domain_2i = domain[i][0];
+          var domain_2i_1 = domain[i][1];
+          var xi = Math.min(Math.max(src[srcOffset + i], domain_2i), domain_2i_1);
+          var e = interpolate(xi, domain_2i, domain_2i_1, encode[i][0], encode[i][1]);
+          var size_i = size[i];
+          e = Math.min(Math.max(e, 0), size_i - 1);
+          var e0 = e < size_i - 1 ? Math.floor(e) : e - 1;
+          var n0 = e0 + 1 - e;
+          var n1 = e - e0;
+          var offset0 = e0 * k;
+          var offset1 = offset0 + k;
+          for (j = 0; j < cubeVertices; j++) {
+            if (j & pos) {
+              cubeN[j] *= n1;
+              cubeVertex[j] += offset1;
+            } else {
+              cubeN[j] *= n0;
+              cubeVertex[j] += offset0;
+            }
+          }
+          k *= size_i;
+          pos <<= 1;
+        }
+        for (j = 0; j < n; ++j) {
+          var rj = 0;
+          for (i = 0; i < cubeVertices; i++) {
+            rj += samples[cubeVertex[i] + j] * cubeN[i];
+          }
+          rj = interpolate(rj, 0, 1, decode[j][0], decode[j][1]);
+          dest[destOffset + j] = Math.min(Math.max(rj, range[j][0]), range[j][1]);
+        }
+      };
+    },
+    constructInterpolated: function constructInterpolated(_ref8) {
+      var xref = _ref8.xref,
+          isEvalSupported = _ref8.isEvalSupported,
+          fn = _ref8.fn,
+          dict = _ref8.dict;
+
+      var c0 = toNumberArray(dict.getArray('C0')) || [0];
+      var c1 = toNumberArray(dict.getArray('C1')) || [1];
+      var n = dict.get('N');
+      var length = c0.length;
+      var diff = [];
+      for (var i = 0; i < length; ++i) {
+        diff.push(c1[i] - c0[i]);
+      }
+      return [CONSTRUCT_INTERPOLATED, c0, diff, n];
+    },
+    constructInterpolatedFromIR: function constructInterpolatedFromIR(_ref9) {
+      var xref = _ref9.xref,
+          isEvalSupported = _ref9.isEvalSupported,
+          IR = _ref9.IR;
+
+      var c0 = IR[1];
+      var diff = IR[2];
+      var n = IR[3];
+      var length = diff.length;
+      return function constructInterpolatedFromIRResult(src, srcOffset, dest, destOffset) {
+        var x = n === 1 ? src[srcOffset] : Math.pow(src[srcOffset], n);
+        for (var j = 0; j < length; ++j) {
+          dest[destOffset + j] = c0[j] + x * diff[j];
+        }
+      };
+    },
+    constructStiched: function constructStiched(_ref10) {
+      var xref = _ref10.xref,
+          isEvalSupported = _ref10.isEvalSupported,
+          fn = _ref10.fn,
+          dict = _ref10.dict;
+
+      var domain = toNumberArray(dict.getArray('Domain'));
+      if (!domain) {
+        throw new _util.FormatError('No domain');
+      }
+      var inputSize = domain.length / 2;
+      if (inputSize !== 1) {
+        throw new _util.FormatError('Bad domain for stiched function');
+      }
+      var fnRefs = dict.get('Functions');
+      var fns = [];
+      for (var i = 0, ii = fnRefs.length; i < ii; ++i) {
+        fns.push(this.parse({
+          xref: xref,
+          isEvalSupported: isEvalSupported,
+          fn: xref.fetchIfRef(fnRefs[i])
+        }));
+      }
+      var bounds = toNumberArray(dict.getArray('Bounds'));
+      var encode = toNumberArray(dict.getArray('Encode'));
+      return [CONSTRUCT_STICHED, domain, bounds, encode, fns];
+    },
+    constructStichedFromIR: function constructStichedFromIR(_ref11) {
+      var xref = _ref11.xref,
+          isEvalSupported = _ref11.isEvalSupported,
+          IR = _ref11.IR;
+
+      var domain = IR[1];
+      var bounds = IR[2];
+      var encode = IR[3];
+      var fns = IR[4];
+      var tmpBuf = new Float32Array(1);
+      return function constructStichedFromIRResult(src, srcOffset, dest, destOffset) {
+        var clip = function constructStichedFromIRClip(v, min, max) {
+          if (v > max) {
+            v = max;
+          } else if (v < min) {
+            v = min;
+          }
+          return v;
+        };
+        var v = clip(src[srcOffset], domain[0], domain[1]);
+        for (var i = 0, ii = bounds.length; i < ii; ++i) {
+          if (v < bounds[i]) {
+            break;
+          }
+        }
+        var dmin = domain[0];
+        if (i > 0) {
+          dmin = bounds[i - 1];
+        }
+        var dmax = domain[1];
+        if (i < bounds.length) {
+          dmax = bounds[i];
+        }
+        var rmin = encode[2 * i];
+        var rmax = encode[2 * i + 1];
+        tmpBuf[0] = dmin === dmax ? rmin : rmin + (v - dmin) * (rmax - rmin) / (dmax - dmin);
+        fns[i](tmpBuf, 0, dest, destOffset);
+      };
+    },
+    constructPostScript: function constructPostScript(_ref12) {
+      var xref = _ref12.xref,
+          isEvalSupported = _ref12.isEvalSupported,
+          fn = _ref12.fn,
+          dict = _ref12.dict;
+
+      var domain = toNumberArray(dict.getArray('Domain'));
+      var range = toNumberArray(dict.getArray('Range'));
+      if (!domain) {
+        throw new _util.FormatError('No domain.');
+      }
+      if (!range) {
+        throw new _util.FormatError('No range.');
+      }
+      var lexer = new _ps_parser.PostScriptLexer(fn);
+      var parser = new _ps_parser.PostScriptParser(lexer);
+      var code = parser.parse();
+      return [CONSTRUCT_POSTSCRIPT, domain, range, code];
+    },
+    constructPostScriptFromIR: function constructPostScriptFromIR(_ref13) {
+      var xref = _ref13.xref,
+          isEvalSupported = _ref13.isEvalSupported,
+          IR = _ref13.IR;
+
+      var domain = IR[1];
+      var range = IR[2];
+      var code = IR[3];
+      if (isEvalSupported && IsEvalSupportedCached.value) {
+        var compiled = new PostScriptCompiler().compile(code, domain, range);
+        if (compiled) {
+          return new Function('src', 'srcOffset', 'dest', 'destOffset', compiled);
+        }
+      }
+      (0, _util.info)('Unable to compile PS function');
+      var numOutputs = range.length >> 1;
+      var numInputs = domain.length >> 1;
+      var evaluator = new PostScriptEvaluator(code);
+      var cache = Object.create(null);
+      var MAX_CACHE_SIZE = 2048 * 4;
+      var cache_available = MAX_CACHE_SIZE;
+      var tmpBuf = new Float32Array(numInputs);
+      return function constructPostScriptFromIRResult(src, srcOffset, dest, destOffset) {
+        var i, value;
+        var key = '';
+        var input = tmpBuf;
+        for (i = 0; i < numInputs; i++) {
+          value = src[srcOffset + i];
+          input[i] = value;
+          key += value + '_';
+        }
+        var cachedValue = cache[key];
+        if (cachedValue !== undefined) {
+          dest.set(cachedValue, destOffset);
+          return;
+        }
+        var output = new Float32Array(numOutputs);
+        var stack = evaluator.execute(input);
+        var stackIndex = stack.length - numOutputs;
+        for (i = 0; i < numOutputs; i++) {
+          value = stack[stackIndex + i];
+          var bound = range[i * 2];
+          if (value < bound) {
+            value = bound;
+          } else {
+            bound = range[i * 2 + 1];
+            if (value > bound) {
+              value = bound;
+            }
+          }
+          output[i] = value;
+        }
+        if (cache_available > 0) {
+          cache_available--;
+          cache[key] = output;
+        }
+        dest.set(output, destOffset);
+      };
+    }
+  };
+}();
+function isPDFFunction(v) {
+  var fnDict;
+  if ((typeof v === 'undefined' ? 'undefined' : _typeof(v)) !== 'object') {
+    return false;
+  } else if ((0, _primitives.isDict)(v)) {
+    fnDict = v;
+  } else if ((0, _primitives.isStream)(v)) {
+    fnDict = v.dict;
+  } else {
+    return false;
+  }
+  return fnDict.has('FunctionType');
+}
+var PostScriptStack = function PostScriptStackClosure() {
+  var MAX_STACK_SIZE = 100;
+  function PostScriptStack(initialStack) {
+    this.stack = !initialStack ? [] : Array.prototype.slice.call(initialStack, 0);
+  }
+  PostScriptStack.prototype = {
+    push: function PostScriptStack_push(value) {
+      if (this.stack.length >= MAX_STACK_SIZE) {
+        throw new Error('PostScript function stack overflow.');
+      }
+      this.stack.push(value);
+    },
+    pop: function PostScriptStack_pop() {
+      if (this.stack.length <= 0) {
+        throw new Error('PostScript function stack underflow.');
+      }
+      return this.stack.pop();
+    },
+    copy: function PostScriptStack_copy(n) {
+      if (this.stack.length + n >= MAX_STACK_SIZE) {
+        throw new Error('PostScript function stack overflow.');
+      }
+      var stack = this.stack;
+      for (var i = stack.length - n, j = n - 1; j >= 0; j--, i++) {
+        stack.push(stack[i]);
+      }
+    },
+    index: function PostScriptStack_index(n) {
+      this.push(this.stack[this.stack.length - n - 1]);
+    },
+    roll: function PostScriptStack_roll(n, p) {
+      var stack = this.stack;
+      var l = stack.length - n;
+      var r = stack.length - 1,
+          c = l + (p - Math.floor(p / n) * n),
+          i,
+          j,
+          t;
+      for (i = l, j = r; i < j; i++, j--) {
+        t = stack[i];
+        stack[i] = stack[j];
+        stack[j] = t;
+      }
+      for (i = l, j = c - 1; i < j; i++, j--) {
+        t = stack[i];
+        stack[i] = stack[j];
+        stack[j] = t;
+      }
+      for (i = c, j = r; i < j; i++, j--) {
+        t = stack[i];
+        stack[i] = stack[j];
+        stack[j] = t;
+      }
+    }
+  };
+  return PostScriptStack;
+}();
+var PostScriptEvaluator = function PostScriptEvaluatorClosure() {
+  function PostScriptEvaluator(operators) {
+    this.operators = operators;
+  }
+  PostScriptEvaluator.prototype = {
+    execute: function PostScriptEvaluator_execute(initialStack) {
+      var stack = new PostScriptStack(initialStack);
+      var counter = 0;
+      var operators = this.operators;
+      var length = operators.length;
+      var operator, a, b;
+      while (counter < length) {
+        operator = operators[counter++];
+        if (typeof operator === 'number') {
+          stack.push(operator);
+          continue;
+        }
+        switch (operator) {
+          case 'jz':
+            b = stack.pop();
+            a = stack.pop();
+            if (!a) {
+              counter = b;
+            }
+            break;
+          case 'j':
+            a = stack.pop();
+            counter = a;
+            break;
+          case 'abs':
+            a = stack.pop();
+            stack.push(Math.abs(a));
+            break;
+          case 'add':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a + b);
+            break;
+          case 'and':
+            b = stack.pop();
+            a = stack.pop();
+            if ((0, _util.isBool)(a) && (0, _util.isBool)(b)) {
+              stack.push(a && b);
+            } else {
+              stack.push(a & b);
+            }
+            break;
+          case 'atan':
+            a = stack.pop();
+            stack.push(Math.atan(a));
+            break;
+          case 'bitshift':
+            b = stack.pop();
+            a = stack.pop();
+            if (a > 0) {
+              stack.push(a << b);
+            } else {
+              stack.push(a >> b);
+            }
+            break;
+          case 'ceiling':
+            a = stack.pop();
+            stack.push(Math.ceil(a));
+            break;
+          case 'copy':
+            a = stack.pop();
+            stack.copy(a);
+            break;
+          case 'cos':
+            a = stack.pop();
+            stack.push(Math.cos(a));
+            break;
+          case 'cvi':
+            a = stack.pop() | 0;
+            stack.push(a);
+            break;
+          case 'cvr':
+            break;
+          case 'div':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a / b);
+            break;
+          case 'dup':
+            stack.copy(1);
+            break;
+          case 'eq':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a === b);
+            break;
+          case 'exch':
+            stack.roll(2, 1);
+            break;
+          case 'exp':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(Math.pow(a, b));
+            break;
+          case 'false':
+            stack.push(false);
+            break;
+          case 'floor':
+            a = stack.pop();
+            stack.push(Math.floor(a));
+            break;
+          case 'ge':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a >= b);
+            break;
+          case 'gt':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a > b);
+            break;
+          case 'idiv':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a / b | 0);
+            break;
+          case 'index':
+            a = stack.pop();
+            stack.index(a);
+            break;
+          case 'le':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a <= b);
+            break;
+          case 'ln':
+            a = stack.pop();
+            stack.push(Math.log(a));
+            break;
+          case 'log':
+            a = stack.pop();
+            stack.push(Math.log(a) / Math.LN10);
+            break;
+          case 'lt':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a < b);
+            break;
+          case 'mod':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a % b);
+            break;
+          case 'mul':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a * b);
+            break;
+          case 'ne':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a !== b);
+            break;
+          case 'neg':
+            a = stack.pop();
+            stack.push(-a);
+            break;
+          case 'not':
+            a = stack.pop();
+            if ((0, _util.isBool)(a)) {
+              stack.push(!a);
+            } else {
+              stack.push(~a);
+            }
+            break;
+          case 'or':
+            b = stack.pop();
+            a = stack.pop();
+            if ((0, _util.isBool)(a) && (0, _util.isBool)(b)) {
+              stack.push(a || b);
+            } else {
+              stack.push(a | b);
+            }
+            break;
+          case 'pop':
+            stack.pop();
+            break;
+          case 'roll':
+            b = stack.pop();
+            a = stack.pop();
+            stack.roll(a, b);
+            break;
+          case 'round':
+            a = stack.pop();
+            stack.push(Math.round(a));
+            break;
+          case 'sin':
+            a = stack.pop();
+            stack.push(Math.sin(a));
+            break;
+          case 'sqrt':
+            a = stack.pop();
+            stack.push(Math.sqrt(a));
+            break;
+          case 'sub':
+            b = stack.pop();
+            a = stack.pop();
+            stack.push(a - b);
+            break;
+          case 'true':
+            stack.push(true);
+            break;
+          case 'truncate':
+            a = stack.pop();
+            a = a < 0 ? Math.ceil(a) : Math.floor(a);
+            stack.push(a);
+            break;
+          case 'xor':
+            b = stack.pop();
+            a = stack.pop();
+            if ((0, _util.isBool)(a) && (0, _util.isBool)(b)) {
+              stack.push(a !== b);
+            } else {
+              stack.push(a ^ b);
+            }
+            break;
+          default:
+            throw new _util.FormatError('Unknown operator ' + operator);
+        }
+      }
+      return stack.stack;
+    }
+  };
+  return PostScriptEvaluator;
+}();
+var PostScriptCompiler = function PostScriptCompilerClosure() {
+  function AstNode(type) {
+    this.type = type;
+  }
+  AstNode.prototype.visit = function (visitor) {
+    (0, _util.unreachable)('abstract method');
+  };
+  function AstArgument(index, min, max) {
+    AstNode.call(this, 'args');
+    this.index = index;
+    this.min = min;
+    this.max = max;
+  }
+  AstArgument.prototype = Object.create(AstNode.prototype);
+  AstArgument.prototype.visit = function (visitor) {
+    visitor.visitArgument(this);
+  };
+  function AstLiteral(number) {
+    AstNode.call(this, 'literal');
+    this.number = number;
+    this.min = number;
+    this.max = number;
+  }
+  AstLiteral.prototype = Object.create(AstNode.prototype);
+  AstLiteral.prototype.visit = function (visitor) {
+    visitor.visitLiteral(this);
+  };
+  function AstBinaryOperation(op, arg1, arg2, min, max) {
+    AstNode.call(this, 'binary');
+    this.op = op;
+    this.arg1 = arg1;
+    this.arg2 = arg2;
+    this.min = min;
+    this.max = max;
+  }
+  AstBinaryOperation.prototype = Object.create(AstNode.prototype);
+  AstBinaryOperation.prototype.visit = function (visitor) {
+    visitor.visitBinaryOperation(this);
+  };
+  function AstMin(arg, max) {
+    AstNode.call(this, 'max');
+    this.arg = arg;
+    this.min = arg.min;
+    this.max = max;
+  }
+  AstMin.prototype = Object.create(AstNode.prototype);
+  AstMin.prototype.visit = function (visitor) {
+    visitor.visitMin(this);
+  };
+  function AstVariable(index, min, max) {
+    AstNode.call(this, 'var');
+    this.index = index;
+    this.min = min;
+    this.max = max;
+  }
+  AstVariable.prototype = Object.create(AstNode.prototype);
+  AstVariable.prototype.visit = function (visitor) {
+    visitor.visitVariable(this);
+  };
+  function AstVariableDefinition(variable, arg) {
+    AstNode.call(this, 'definition');
+    this.variable = variable;
+    this.arg = arg;
+  }
+  AstVariableDefinition.prototype = Object.create(AstNode.prototype);
+  AstVariableDefinition.prototype.visit = function (visitor) {
+    visitor.visitVariableDefinition(this);
+  };
+  function ExpressionBuilderVisitor() {
+    this.parts = [];
+  }
+  ExpressionBuilderVisitor.prototype = {
+    visitArgument: function visitArgument(arg) {
+      this.parts.push('Math.max(', arg.min, ', Math.min(', arg.max, ', src[srcOffset + ', arg.index, ']))');
+    },
+    visitVariable: function visitVariable(variable) {
+      this.parts.push('v', variable.index);
+    },
+    visitLiteral: function visitLiteral(literal) {
+      this.parts.push(literal.number);
+    },
+    visitBinaryOperation: function visitBinaryOperation(operation) {
+      this.parts.push('(');
+      operation.arg1.visit(this);
+      this.parts.push(' ', operation.op, ' ');
+      operation.arg2.visit(this);
+      this.parts.push(')');
+    },
+    visitVariableDefinition: function visitVariableDefinition(definition) {
+      this.parts.push('var ');
+      definition.variable.visit(this);
+      this.parts.push(' = ');
+      definition.arg.visit(this);
+      this.parts.push(';');
+    },
+    visitMin: function visitMin(max) {
+      this.parts.push('Math.min(');
+      max.arg.visit(this);
+      this.parts.push(', ', max.max, ')');
+    },
+    toString: function toString() {
+      return this.parts.join('');
+    }
+  };
+  function buildAddOperation(num1, num2) {
+    if (num2.type === 'literal' && num2.number === 0) {
+      return num1;
+    }
+    if (num1.type === 'literal' && num1.number === 0) {
+      return num2;
+    }
+    if (num2.type === 'literal' && num1.type === 'literal') {
+      return new AstLiteral(num1.number + num2.number);
+    }
+    return new AstBinaryOperation('+', num1, num2, num1.min + num2.min, num1.max + num2.max);
+  }
+  function buildMulOperation(num1, num2) {
+    if (num2.type === 'literal') {
+      if (num2.number === 0) {
+        return new AstLiteral(0);
+      } else if (num2.number === 1) {
+        return num1;
+      } else if (num1.type === 'literal') {
+        return new AstLiteral(num1.number * num2.number);
+      }
+    }
+    if (num1.type === 'literal') {
+      if (num1.number === 0) {
+        return new AstLiteral(0);
+      } else if (num1.number === 1) {
+        return num2;
+      }
+    }
+    var min = Math.min(num1.min * num2.min, num1.min * num2.max, num1.max * num2.min, num1.max * num2.max);
+    var max = Math.max(num1.min * num2.min, num1.min * num2.max, num1.max * num2.min, num1.max * num2.max);
+    return new AstBinaryOperation('*', num1, num2, min, max);
+  }
+  function buildSubOperation(num1, num2) {
+    if (num2.type === 'literal') {
+      if (num2.number === 0) {
+        return num1;
+      } else if (num1.type === 'literal') {
+        return new AstLiteral(num1.number - num2.number);
+      }
+    }
+    if (num2.type === 'binary' && num2.op === '-' && num1.type === 'literal' && num1.number === 1 && num2.arg1.type === 'literal' && num2.arg1.number === 1) {
+      return num2.arg2;
+    }
+    return new AstBinaryOperation('-', num1, num2, num1.min - num2.max, num1.max - num2.min);
+  }
+  function buildMinOperation(num1, max) {
+    if (num1.min >= max) {
+      return new AstLiteral(max);
+    } else if (num1.max <= max) {
+      return num1;
+    }
+    return new AstMin(num1, max);
+  }
+  function PostScriptCompiler() {}
+  PostScriptCompiler.prototype = {
+    compile: function PostScriptCompiler_compile(code, domain, range) {
+      var stack = [];
+      var i, ii;
+      var instructions = [];
+      var inputSize = domain.length >> 1,
+          outputSize = range.length >> 1;
+      var lastRegister = 0;
+      var n, j;
+      var num1, num2, ast1, ast2, tmpVar, item;
+      for (i = 0; i < inputSize; i++) {
+        stack.push(new AstArgument(i, domain[i * 2], domain[i * 2 + 1]));
+      }
+      for (i = 0, ii = code.length; i < ii; i++) {
+        item = code[i];
+        if (typeof item === 'number') {
+          stack.push(new AstLiteral(item));
+          continue;
+        }
+        switch (item) {
+          case 'add':
+            if (stack.length < 2) {
+              return null;
+            }
+            num2 = stack.pop();
+            num1 = stack.pop();
+            stack.push(buildAddOperation(num1, num2));
+            break;
+          case 'cvr':
+            if (stack.length < 1) {
+              return null;
+            }
+            break;
+          case 'mul':
+            if (stack.length < 2) {
+              return null;
+            }
+            num2 = stack.pop();
+            num1 = stack.pop();
+            stack.push(buildMulOperation(num1, num2));
+            break;
+          case 'sub':
+            if (stack.length < 2) {
+              return null;
+            }
+            num2 = stack.pop();
+            num1 = stack.pop();
+            stack.push(buildSubOperation(num1, num2));
+            break;
+          case 'exch':
+            if (stack.length < 2) {
+              return null;
+            }
+            ast1 = stack.pop();
+            ast2 = stack.pop();
+            stack.push(ast1, ast2);
+            break;
+          case 'pop':
+            if (stack.length < 1) {
+              return null;
+            }
+            stack.pop();
+            break;
+          case 'index':
+            if (stack.length < 1) {
+              return null;
+            }
+            num1 = stack.pop();
+            if (num1.type !== 'literal') {
+              return null;
+            }
+            n = num1.number;
+            if (n < 0 || !Number.isInteger(n) || stack.length < n) {
+              return null;
+            }
+            ast1 = stack[stack.length - n - 1];
+            if (ast1.type === 'literal' || ast1.type === 'var') {
+              stack.push(ast1);
+              break;
+            }
+            tmpVar = new AstVariable(lastRegister++, ast1.min, ast1.max);
+            stack[stack.length - n - 1] = tmpVar;
+            stack.push(tmpVar);
+            instructions.push(new AstVariableDefinition(tmpVar, ast1));
+            break;
+          case 'dup':
+            if (stack.length < 1) {
+              return null;
+            }
+            if (typeof code[i + 1] === 'number' && code[i + 2] === 'gt' && code[i + 3] === i + 7 && code[i + 4] === 'jz' && code[i + 5] === 'pop' && code[i + 6] === code[i + 1]) {
+              num1 = stack.pop();
+              stack.push(buildMinOperation(num1, code[i + 1]));
+              i += 6;
+              break;
+            }
+            ast1 = stack[stack.length - 1];
+            if (ast1.type === 'literal' || ast1.type === 'var') {
+              stack.push(ast1);
+              break;
+            }
+            tmpVar = new AstVariable(lastRegister++, ast1.min, ast1.max);
+            stack[stack.length - 1] = tmpVar;
+            stack.push(tmpVar);
+            instructions.push(new AstVariableDefinition(tmpVar, ast1));
+            break;
+          case 'roll':
+            if (stack.length < 2) {
+              return null;
+            }
+            num2 = stack.pop();
+            num1 = stack.pop();
+            if (num2.type !== 'literal' || num1.type !== 'literal') {
+              return null;
+            }
+            j = num2.number;
+            n = num1.number;
+            if (n <= 0 || !Number.isInteger(n) || !Number.isInteger(j) || stack.length < n) {
+              return null;
+            }
+            j = (j % n + n) % n;
+            if (j === 0) {
+              break;
+            }
+            Array.prototype.push.apply(stack, stack.splice(stack.length - n, n - j));
+            break;
+          default:
+            return null;
+        }
+      }
+      if (stack.length !== outputSize) {
+        return null;
+      }
+      var result = [];
+      instructions.forEach(function (instruction) {
+        var statementBuilder = new ExpressionBuilderVisitor();
+        instruction.visit(statementBuilder);
+        result.push(statementBuilder.toString());
+      });
+      stack.forEach(function (expr, i) {
+        var statementBuilder = new ExpressionBuilderVisitor();
+        expr.visit(statementBuilder);
+        var min = range[i * 2],
+            max = range[i * 2 + 1];
+        var out = [statementBuilder.toString()];
+        if (min > expr.min) {
+          out.unshift('Math.max(', min, ', ');
+          out.push(')');
+        }
+        if (max < expr.max) {
+          out.unshift('Math.min(', max, ', ');
+          out.push(')');
+        }
+        out.unshift('dest[destOffset + ', i, '] = ');
+        out.push(';');
+        result.push(out.join(''));
+      });
+      return result.join('\n');
+    }
+  };
+  return PostScriptCompiler;
+}();
+exports.isPDFFunction = isPDFFunction;
+exports.PDFFunctionFactory = PDFFunctionFactory;
+exports.PostScriptEvaluator = PostScriptEvaluator;
+exports.PostScriptCompiler = PostScriptCompiler;
+
+/***/ }),
+/* 169 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.PostScriptParser = exports.PostScriptLexer = undefined;
+
+var _util = __w_pdfjs_require__(2);
+
+var _primitives = __w_pdfjs_require__(138);
+
+var PostScriptParser = function PostScriptParserClosure() {
+  function PostScriptParser(lexer) {
+    this.lexer = lexer;
+    this.operators = [];
+    this.token = null;
+    this.prev = null;
+  }
+  PostScriptParser.prototype = {
+    nextToken: function PostScriptParser_nextToken() {
+      this.prev = this.token;
+      this.token = this.lexer.getToken();
+    },
+    accept: function PostScriptParser_accept(type) {
+      if (this.token.type === type) {
+        this.nextToken();
+        return true;
+      }
+      return false;
+    },
+    expect: function PostScriptParser_expect(type) {
+      if (this.accept(type)) {
+        return true;
+      }
+      throw new _util.FormatError('Unexpected symbol: found ' + this.token.type + ' expected ' + type + '.');
+    },
+    parse: function PostScriptParser_parse() {
+      this.nextToken();
+      this.expect(PostScriptTokenTypes.LBRACE);
+      this.parseBlock();
+      this.expect(PostScriptTokenTypes.RBRACE);
+      return this.operators;
+    },
+    parseBlock: function PostScriptParser_parseBlock() {
+      while (true) {
+        if (this.accept(PostScriptTokenTypes.NUMBER)) {
+          this.operators.push(this.prev.value);
+        } else if (this.accept(PostScriptTokenTypes.OPERATOR)) {
+          this.operators.push(this.prev.value);
+        } else if (this.accept(PostScriptTokenTypes.LBRACE)) {
+          this.parseCondition();
+        } else {
+          return;
+        }
+      }
+    },
+    parseCondition: function PostScriptParser_parseCondition() {
+      var conditionLocation = this.operators.length;
+      this.operators.push(null, null);
+      this.parseBlock();
+      this.expect(PostScriptTokenTypes.RBRACE);
+      if (this.accept(PostScriptTokenTypes.IF)) {
+        this.operators[conditionLocation] = this.operators.length;
+        this.operators[conditionLocation + 1] = 'jz';
+      } else if (this.accept(PostScriptTokenTypes.LBRACE)) {
+        var jumpLocation = this.operators.length;
+        this.operators.push(null, null);
+        var endOfTrue = this.operators.length;
+        this.parseBlock();
+        this.expect(PostScriptTokenTypes.RBRACE);
+        this.expect(PostScriptTokenTypes.IFELSE);
+        this.operators[jumpLocation] = this.operators.length;
+        this.operators[jumpLocation + 1] = 'j';
+        this.operators[conditionLocation] = endOfTrue;
+        this.operators[conditionLocation + 1] = 'jz';
+      } else {
+        throw new _util.FormatError('PS Function: error parsing conditional.');
+      }
+    }
+  };
+  return PostScriptParser;
+}();
+var PostScriptTokenTypes = {
+  LBRACE: 0,
+  RBRACE: 1,
+  NUMBER: 2,
+  OPERATOR: 3,
+  IF: 4,
+  IFELSE: 5
+};
+var PostScriptToken = function PostScriptTokenClosure() {
+  function PostScriptToken(type, value) {
+    this.type = type;
+    this.value = value;
+  }
+  var opCache = Object.create(null);
+  PostScriptToken.getOperator = function PostScriptToken_getOperator(op) {
+    var opValue = opCache[op];
+    if (opValue) {
+      return opValue;
+    }
+    return opCache[op] = new PostScriptToken(PostScriptTokenTypes.OPERATOR, op);
+  };
+  PostScriptToken.LBRACE = new PostScriptToken(PostScriptTokenTypes.LBRACE, '{');
+  PostScriptToken.RBRACE = new PostScriptToken(PostScriptTokenTypes.RBRACE, '}');
+  PostScriptToken.IF = new PostScriptToken(PostScriptTokenTypes.IF, 'IF');
+  PostScriptToken.IFELSE = new PostScriptToken(PostScriptTokenTypes.IFELSE, 'IFELSE');
+  return PostScriptToken;
+}();
+var PostScriptLexer = function PostScriptLexerClosure() {
+  function PostScriptLexer(stream) {
+    this.stream = stream;
+    this.nextChar();
+    this.strBuf = [];
+  }
+  PostScriptLexer.prototype = {
+    nextChar: function PostScriptLexer_nextChar() {
+      return this.currentChar = this.stream.getByte();
+    },
+    getToken: function PostScriptLexer_getToken() {
+      var comment = false;
+      var ch = this.currentChar;
+      while (true) {
+        if (ch < 0) {
+          return _primitives.EOF;
+        }
+        if (comment) {
+          if (ch === 0x0A || ch === 0x0D) {
+            comment = false;
+          }
+        } else if (ch === 0x25) {
+          comment = true;
+        } else if (!(0, _util.isSpace)(ch)) {
+          break;
+        }
+        ch = this.nextChar();
+      }
+      switch (ch | 0) {
+        case 0x30:
+        case 0x31:
+        case 0x32:
+        case 0x33:
+        case 0x34:
+        case 0x35:
+        case 0x36:
+        case 0x37:
+        case 0x38:
+        case 0x39:
+        case 0x2B:
+        case 0x2D:
+        case 0x2E:
+          return new PostScriptToken(PostScriptTokenTypes.NUMBER, this.getNumber());
+        case 0x7B:
+          this.nextChar();
+          return PostScriptToken.LBRACE;
+        case 0x7D:
+          this.nextChar();
+          return PostScriptToken.RBRACE;
+      }
+      var strBuf = this.strBuf;
+      strBuf.length = 0;
+      strBuf[0] = String.fromCharCode(ch);
+      while ((ch = this.nextChar()) >= 0 && (ch >= 0x41 && ch <= 0x5A || ch >= 0x61 && ch <= 0x7A)) {
+        strBuf.push(String.fromCharCode(ch));
+      }
+      var str = strBuf.join('');
+      switch (str.toLowerCase()) {
+        case 'if':
+          return PostScriptToken.IF;
+        case 'ifelse':
+          return PostScriptToken.IFELSE;
+        default:
+          return PostScriptToken.getOperator(str);
+      }
+    },
+    getNumber: function PostScriptLexer_getNumber() {
+      var ch = this.currentChar;
+      var strBuf = this.strBuf;
+      strBuf.length = 0;
+      strBuf[0] = String.fromCharCode(ch);
+      while ((ch = this.nextChar()) >= 0) {
+        if (ch >= 0x30 && ch <= 0x39 || ch === 0x2D || ch === 0x2E) {
+          strBuf.push(String.fromCharCode(ch));
+        } else {
+          break;
+        }
+      }
+      var value = parseFloat(strBuf.join(''));
+      if (isNaN(value)) {
+        throw new _util.FormatError('Invalid floating point number: ' + value);
+      }
+      return value;
+    }
+  };
+  return PostScriptLexer;
+}();
+exports.PostScriptLexer = PostScriptLexer;
+exports.PostScriptParser = PostScriptParser;
+
+/***/ }),
+/* 170 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.MurmurHash3_64 = undefined;
+
+var _util = __w_pdfjs_require__(2);
+
+var MurmurHash3_64 = function MurmurHash3_64Closure(seed) {
+  var MASK_HIGH = 0xffff0000;
+  var MASK_LOW = 0xffff;
+  function MurmurHash3_64(seed) {
+    var SEED = 0xc3d2e1f0;
+    this.h1 = seed ? seed & 0xffffffff : SEED;
+    this.h2 = seed ? seed & 0xffffffff : SEED;
+  }
+  MurmurHash3_64.prototype = {
+    update: function MurmurHash3_64_update(input) {
+      var data = void 0,
+          length = void 0;
+      if ((0, _util.isString)(input)) {
+        data = new Uint8Array(input.length * 2);
+        length = 0;
+        for (var i = 0, ii = input.length; i < ii; i++) {
+          var code = input.charCodeAt(i);
+          if (code <= 0xff) {
+            data[length++] = code;
+          } else {
+            data[length++] = code >>> 8;
+            data[length++] = code & 0xff;
+          }
+        }
+      } else if ((0, _util.isArrayBuffer)(input)) {
+        data = input;
+        length = data.byteLength;
+      } else {
+        throw new Error('Wrong data format in MurmurHash3_64_update. ' + 'Input must be a string or array.');
+      }
+      var blockCounts = length >> 2;
+      var tailLength = length - blockCounts * 4;
+      var dataUint32 = new Uint32Array(data.buffer, 0, blockCounts);
+      var k1 = 0;
+      var k2 = 0;
+      var h1 = this.h1;
+      var h2 = this.h2;
+      var C1 = 0xcc9e2d51;
+      var C2 = 0x1b873593;
+      var C1_LOW = C1 & MASK_LOW;
+      var C2_LOW = C2 & MASK_LOW;
+      for (var _i = 0; _i < blockCounts; _i++) {
+        if (_i & 1) {
+          k1 = dataUint32[_i];
+          k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW;
+          k1 = k1 << 15 | k1 >>> 17;
+          k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW;
+          h1 ^= k1;
+          h1 = h1 << 13 | h1 >>> 19;
+          h1 = h1 * 5 + 0xe6546b64;
+        } else {
+          k2 = dataUint32[_i];
+          k2 = k2 * C1 & MASK_HIGH | k2 * C1_LOW & MASK_LOW;
+          k2 = k2 << 15 | k2 >>> 17;
+          k2 = k2 * C2 & MASK_HIGH | k2 * C2_LOW & MASK_LOW;
+          h2 ^= k2;
+          h2 = h2 << 13 | h2 >>> 19;
+          h2 = h2 * 5 + 0xe6546b64;
+        }
+      }
+      k1 = 0;
+      switch (tailLength) {
+        case 3:
+          k1 ^= data[blockCounts * 4 + 2] << 16;
+        case 2:
+          k1 ^= data[blockCounts * 4 + 1] << 8;
+        case 1:
+          k1 ^= data[blockCounts * 4];
+          k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW;
+          k1 = k1 << 15 | k1 >>> 17;
+          k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW;
+          if (blockCounts & 1) {
+            h1 ^= k1;
+          } else {
+            h2 ^= k1;
+          }
+      }
+      this.h1 = h1;
+      this.h2 = h2;
+      return this;
+    },
+    hexdigest: function MurmurHash3_64_hexdigest() {
+      var h1 = this.h1;
+      var h2 = this.h2;
+      h1 ^= h2 >>> 1;
+      h1 = h1 * 0xed558ccd & MASK_HIGH | h1 * 0x8ccd & MASK_LOW;
+      h2 = h2 * 0xff51afd7 & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xafd7ed55 & MASK_HIGH) >>> 16;
+      h1 ^= h2 >>> 1;
+      h1 = h1 * 0x1a85ec53 & MASK_HIGH | h1 * 0xec53 & MASK_LOW;
+      h2 = h2 * 0xc4ceb9fe & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xb9fe1a85 & MASK_HIGH) >>> 16;
+      h1 ^= h2 >>> 1;
+      for (var i = 0, arr = [h1, h2], str = ''; i < arr.length; i++) {
+        var hex = (arr[i] >>> 0).toString(16);
+        while (hex.length < 8) {
+          hex = '0' + hex;
+        }
+        str += hex;
+      }
+      return str;
+    }
+  };
+  return MurmurHash3_64;
+}();
+exports.MurmurHash3_64 = MurmurHash3_64;
+
+/***/ }),
+/* 171 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.PDFImage = undefined;
+
+var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
+
+var _util = __w_pdfjs_require__(2);
+
+var _primitives = __w_pdfjs_require__(138);
+
+var _colorspace = __w_pdfjs_require__(151);
+
+var _stream = __w_pdfjs_require__(140);
+
+var _jpeg_stream = __w_pdfjs_require__(146);
+
+var _jpx = __w_pdfjs_require__(149);
+
+var PDFImage = function PDFImageClosure() {
+  function handleImageData(image, nativeDecoder) {
+    if (nativeDecoder && nativeDecoder.canDecode(image)) {
+      return nativeDecoder.decode(image).catch(function (reason) {
+        (0, _util.warn)('Native image decoding failed -- trying to recover: ' + (reason && reason.message));
+        return image;
+      });
+    }
+    return Promise.resolve(image);
+  }
+  function decodeAndClamp(value, addend, coefficient, max) {
+    value = addend + value * coefficient;
+    return value < 0 ? 0 : value > max ? max : value;
+  }
+  function resizeImageMask(src, bpc, w1, h1, w2, h2) {
+    var length = w2 * h2;
+    var dest = bpc <= 8 ? new Uint8Array(length) : bpc <= 16 ? new Uint16Array(length) : new Uint32Array(length);
+    var xRatio = w1 / w2;
+    var yRatio = h1 / h2;
+    var i,
+        j,
+        py,
+        newIndex = 0,
+        oldIndex;
+    var xScaled = new Uint16Array(w2);
+    var w1Scanline = w1;
+    for (i = 0; i < w2; i++) {
+      xScaled[i] = Math.floor(i * xRatio);
+    }
+    for (i = 0; i < h2; i++) {
+      py = Math.floor(i * yRatio) * w1Scanline;
+      for (j = 0; j < w2; j++) {
+        oldIndex = py + xScaled[j];
+        dest[newIndex++] = src[oldIndex];
+      }
+    }
+    return dest;
+  }
+  function PDFImage(_ref) {
+    var xref = _ref.xref,
+        res = _ref.res,
+        image = _ref.image,
+        _ref$isInline = _ref.isInline,
+        isInline = _ref$isInline === undefined ? false : _ref$isInline,
+        _ref$smask = _ref.smask,
+        smask = _ref$smask === undefined ? null : _ref$smask,
+        _ref$mask = _ref.mask,
+        mask = _ref$mask === undefined ? null : _ref$mask,
+        _ref$isMask = _ref.isMask,
+        isMask = _ref$isMask === undefined ? false : _ref$isMask,
+        pdfFunctionFactory = _ref.pdfFunctionFactory;
+
+    this.image = image;
+    var dict = image.dict;
+    var filter = dict.get('Filter');
+    if ((0, _primitives.isName)(filter)) {
+      switch (filter.name) {
+        case 'JPXDecode':
+          var jpxImage = new _jpx.JpxImage();
+          jpxImage.parseImageProperties(image.stream);
+          image.stream.reset();
+          image.width = jpxImage.width;
+          image.height = jpxImage.height;
+          image.bitsPerComponent = jpxImage.bitsPerComponent;
+          image.numComps = jpxImage.componentsCount;
+          break;
+        case 'JBIG2Decode':
+          image.bitsPerComponent = 1;
+          image.numComps = 1;
+          break;
+      }
+    }
+    var width = dict.get('Width', 'W');
+    var height = dict.get('Height', 'H');
+    if (Number.isInteger(image.width) && image.width > 0 && Number.isInteger(image.height) && image.height > 0 && (image.width !== width || image.height !== height)) {
+      (0, _util.warn)('PDFImage - using the Width/Height of the image data, ' + 'rather than the image dictionary.');
+      width = image.width;
+      height = image.height;
+    }
+    if (width < 1 || height < 1) {
+      throw new _util.FormatError('Invalid image width: ' + width + ' or ' + ('height: ' + height));
+    }
+    this.width = width;
+    this.height = height;
+    this.interpolate = dict.get('Interpolate', 'I') || false;
+    this.imageMask = dict.get('ImageMask', 'IM') || false;
+    this.matte = dict.get('Matte') || false;
+    var bitsPerComponent = image.bitsPerComponent;
+    if (!bitsPerComponent) {
+      bitsPerComponent = dict.get('BitsPerComponent', 'BPC');
+      if (!bitsPerComponent) {
+        if (this.imageMask) {
+          bitsPerComponent = 1;
+        } else {
+          throw new _util.FormatError('Bits per component missing in image: ' + this.imageMask);
+        }
+      }
+    }
+    this.bpc = bitsPerComponent;
+    if (!this.imageMask) {
+      var colorSpace = dict.get('ColorSpace', 'CS');
+      if (!colorSpace) {
+        (0, _util.info)('JPX images (which do not require color spaces)');
+        switch (image.numComps) {
+          case 1:
+            colorSpace = _primitives.Name.get('DeviceGray');
+            break;
+          case 3:
+            colorSpace = _primitives.Name.get('DeviceRGB');
+            break;
+          case 4:
+            colorSpace = _primitives.Name.get('DeviceCMYK');
+            break;
+          default:
+            throw new Error('JPX images with ' + image.numComps + ' ' + 'color components not supported.');
+        }
+      }
+      var resources = isInline ? res : null;
+      this.colorSpace = _colorspace.ColorSpace.parse(colorSpace, xref, resources, pdfFunctionFactory);
+      this.numComps = this.colorSpace.numComps;
+    }
+    this.decode = dict.getArray('Decode', 'D');
+    this.needsDecode = false;
+    if (this.decode && (this.colorSpace && !this.colorSpace.isDefaultDecode(this.decode) || isMask && !_colorspace.ColorSpace.isDefaultDecode(this.decode, 1))) {
+      this.needsDecode = true;
+      var max = (1 << bitsPerComponent) - 1;
+      this.decodeCoefficients = [];
+      this.decodeAddends = [];
+      for (var i = 0, j = 0; i < this.decode.length; i += 2, ++j) {
+        var dmin = this.decode[i];
+        var dmax = this.decode[i + 1];
+        this.decodeCoefficients[j] = dmax - dmin;
+        this.decodeAddends[j] = max * dmin;
+      }
+    }
+    if (smask) {
+      this.smask = new PDFImage({
+        xref: xref,
+        res: res,
+        image: smask,
+        isInline: isInline,
+        pdfFunctionFactory: pdfFunctionFactory
+      });
+    } else if (mask) {
+      if ((0, _primitives.isStream)(mask)) {
+        var maskDict = mask.dict,
+            imageMask = maskDict.get('ImageMask', 'IM');
+        if (!imageMask) {
+          (0, _util.warn)('Ignoring /Mask in image without /ImageMask.');
+        } else {
+          this.mask = new PDFImage({
+            xref: xref,
+            res: res,
+            image: mask,
+            isInline: isInline,
+            isMask: true,
+            pdfFunctionFactory: pdfFunctionFactory
+          });
+        }
+      } else {
+        this.mask = mask;
+      }
+    }
+  }
+  PDFImage.buildImage = function (_ref2) {
+    var handler = _ref2.handler,
+        xref = _ref2.xref,
+        res = _ref2.res,
+        image = _ref2.image,
+        _ref2$isInline = _ref2.isInline,
+        isInline = _ref2$isInline === undefined ? false : _ref2$isInline,
+        _ref2$nativeDecoder = _ref2.nativeDecoder,
+        nativeDecoder = _ref2$nativeDecoder === undefined ? null : _ref2$nativeDecoder,
+        pdfFunctionFactory = _ref2.pdfFunctionFactory;
+
+    var imagePromise = handleImageData(image, nativeDecoder);
+    var smaskPromise;
+    var maskPromise;
+    var smask = image.dict.get('SMask');
+    var mask = image.dict.get('Mask');
+    if (smask) {
+      smaskPromise = handleImageData(smask, nativeDecoder);
+      maskPromise = Promise.resolve(null);
+    } else {
+      smaskPromise = Promise.resolve(null);
+      if (mask) {
+        if ((0, _primitives.isStream)(mask)) {
+          maskPromise = handleImageData(mask, nativeDecoder);
+        } else if (Array.isArray(mask)) {
+          maskPromise = Promise.resolve(mask);
+        } else {
+          (0, _util.warn)('Unsupported mask format.');
+          maskPromise = Promise.resolve(null);
+        }
+      } else {
+        maskPromise = Promise.resolve(null);
+      }
+    }
+    return Promise.all([imagePromise, smaskPromise, maskPromise]).then(function (_ref3) {
+      var _ref4 = _slicedToArray(_ref3, 3),
+          imageData = _ref4[0],
+          smaskData = _ref4[1],
+          maskData = _ref4[2];
+
+      return new PDFImage({
+        xref: xref,
+        res: res,
+        image: imageData,
+        isInline: isInline,
+        smask: smaskData,
+        mask: maskData,
+        pdfFunctionFactory: pdfFunctionFactory
+      });
+    });
+  };
+  PDFImage.createMask = function (_ref5) {
+    var imgArray = _ref5.imgArray,
+        width = _ref5.width,
+        height = _ref5.height,
+        imageIsFromDecodeStream = _ref5.imageIsFromDecodeStream,
+        inverseDecode = _ref5.inverseDecode;
+
+    var computedLength = (width + 7 >> 3) * height;
+    var actualLength = imgArray.byteLength;
+    var haveFullData = computedLength === actualLength;
+    var data, i;
+    if (imageIsFromDecodeStream && (!inverseDecode || haveFullData)) {
+      data = imgArray;
+    } else if (!inverseDecode) {
+      data = new Uint8ClampedArray(actualLength);
+      data.set(imgArray);
+    } else {
+      data = new Uint8ClampedArray(computedLength);
+      data.set(imgArray);
+      for (i = actualLength; i < computedLength; i++) {
+        data[i] = 0xff;
+      }
+    }
+    if (inverseDecode) {
+      for (i = 0; i < actualLength; i++) {
+        data[i] ^= 0xFF;
+      }
+    }
+    return {
+      data: data,
+      width: width,
+      height: height
+    };
+  };
+  PDFImage.prototype = {
+    get drawWidth() {
+      return Math.max(this.width, this.smask && this.smask.width || 0, this.mask && this.mask.width || 0);
+    },
+    get drawHeight() {
+      return Math.max(this.height, this.smask && this.smask.height || 0, this.mask && this.mask.height || 0);
+    },
+    decodeBuffer: function decodeBuffer(buffer) {
+      var bpc = this.bpc;
+      var numComps = this.numComps;
+      var decodeAddends = this.decodeAddends;
+      var decodeCoefficients = this.decodeCoefficients;
+      var max = (1 << bpc) - 1;
+      var i, ii;
+      if (bpc === 1) {
+        for (i = 0, ii = buffer.length; i < ii; i++) {
+          buffer[i] = +!buffer[i];
+        }
+        return;
+      }
+      var index = 0;
+      for (i = 0, ii = this.width * this.height; i < ii; i++) {
+        for (var j = 0; j < numComps; j++) {
+          buffer[index] = decodeAndClamp(buffer[index], decodeAddends[j], decodeCoefficients[j], max);
+          index++;
+        }
+      }
+    },
+    getComponents: function getComponents(buffer) {
+      var bpc = this.bpc;
+      if (bpc === 8) {
+        return buffer;
+      }
+      var width = this.width;
+      var height = this.height;
+      var numComps = this.numComps;
+      var length = width * height * numComps;
+      var bufferPos = 0;
+      var output = bpc <= 8 ? new Uint8Array(length) : bpc <= 16 ? new Uint16Array(length) : new Uint32Array(length);
+      var rowComps = width * numComps;
+      var max = (1 << bpc) - 1;
+      var i = 0,
+          ii,
+          buf;
+      if (bpc === 1) {
+        var mask, loop1End, loop2End;
+        for (var j = 0; j < height; j++) {
+          loop1End = i + (rowComps & ~7);
+          loop2End = i + rowComps;
+          while (i < loop1End) {
+            buf = buffer[bufferPos++];
+            output[i] = buf >> 7 & 1;
+            output[i + 1] = buf >> 6 & 1;
+            output[i + 2] = buf >> 5 & 1;
+            output[i + 3] = buf >> 4 & 1;
+            output[i + 4] = buf >> 3 & 1;
+            output[i + 5] = buf >> 2 & 1;
+            output[i + 6] = buf >> 1 & 1;
+            output[i + 7] = buf & 1;
+            i += 8;
+          }
+          if (i < loop2End) {
+            buf = buffer[bufferPos++];
+            mask = 128;
+            while (i < loop2End) {
+              output[i++] = +!!(buf & mask);
+              mask >>= 1;
+            }
+          }
+        }
+      } else {
+        var bits = 0;
+        buf = 0;
+        for (i = 0, ii = length; i < ii; ++i) {
+          if (i % rowComps === 0) {
+            buf = 0;
+            bits = 0;
+          }
+          while (bits < bpc) {
+            buf = buf << 8 | buffer[bufferPos++];
+            bits += 8;
+          }
+          var remainingBits = bits - bpc;
+          var value = buf >> remainingBits;
+          output[i] = value < 0 ? 0 : value > max ? max : value;
+          buf = buf & (1 << remainingBits) - 1;
+          bits = remainingBits;
+        }
+      }
+      return output;
+    },
+    fillOpacity: function fillOpacity(rgbaBuf, width, height, actualHeight, image) {
+      var smask = this.smask;
+      var mask = this.mask;
+      var alphaBuf, sw, sh, i, ii, j;
+      if (smask) {
+        sw = smask.width;
+        sh = smask.height;
+        alphaBuf = new Uint8ClampedArray(sw * sh);
+        smask.fillGrayBuffer(alphaBuf);
+        if (sw !== width || sh !== height) {
+          alphaBuf = resizeImageMask(alphaBuf, smask.bpc, sw, sh, width, height);
+        }
+      } else if (mask) {
+        if (mask instanceof PDFImage) {
+          sw = mask.width;
+          sh = mask.height;
+          alphaBuf = new Uint8ClampedArray(sw * sh);
+          mask.numComps = 1;
+          mask.fillGrayBuffer(alphaBuf);
+          for (i = 0, ii = sw * sh; i < ii; ++i) {
+            alphaBuf[i] = 255 - alphaBuf[i];
+          }
+          if (sw !== width || sh !== height) {
+            alphaBuf = resizeImageMask(alphaBuf, mask.bpc, sw, sh, width, height);
+          }
+        } else if (Array.isArray(mask)) {
+          alphaBuf = new Uint8ClampedArray(width * height);
+          var numComps = this.numComps;
+          for (i = 0, ii = width * height; i < ii; ++i) {
+            var opacity = 0;
+            var imageOffset = i * numComps;
+            for (j = 0; j < numComps; ++j) {
+              var color = image[imageOffset + j];
+              var maskOffset = j * 2;
+              if (color < mask[maskOffset] || color > mask[maskOffset + 1]) {
+                opacity = 255;
+                break;
+              }
+            }
+            alphaBuf[i] = opacity;
+          }
+        } else {
+          throw new _util.FormatError('Unknown mask format.');
+        }
+      }
+      if (alphaBuf) {
+        for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) {
+          rgbaBuf[j] = alphaBuf[i];
+        }
+      } else {
+        for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) {
+          rgbaBuf[j] = 255;
+        }
+      }
+    },
+    undoPreblend: function undoPreblend(buffer, width, height) {
+      var matte = this.smask && this.smask.matte;
+      if (!matte) {
+        return;
+      }
+      var matteRgb = this.colorSpace.getRgb(matte, 0);
+      var matteR = matteRgb[0];
+      var matteG = matteRgb[1];
+      var matteB = matteRgb[2];
+      var length = width * height * 4;
+      for (var i = 0; i < length; i += 4) {
+        var alpha = buffer[i + 3];
+        if (alpha === 0) {
+          buffer[i] = 255;
+          buffer[i + 1] = 255;
+          buffer[i + 2] = 255;
+          continue;
+        }
+        var k = 255 / alpha;
+        buffer[i] = (buffer[i] - matteR) * k + matteR;
+        buffer[i + 1] = (buffer[i + 1] - matteG) * k + matteG;
+        buffer[i + 2] = (buffer[i + 2] - matteB) * k + matteB;
+      }
+    },
+    createImageData: function createImageData() {
+      var forceRGBA = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+
+      var drawWidth = this.drawWidth;
+      var drawHeight = this.drawHeight;
+      var imgData = {
+        width: drawWidth,
+        height: drawHeight,
+        kind: 0,
+        data: null
+      };
+      var numComps = this.numComps;
+      var originalWidth = this.width;
+      var originalHeight = this.height;
+      var bpc = this.bpc;
+      var rowBytes = originalWidth * numComps * bpc + 7 >> 3;
+      var imgArray;
+      if (!forceRGBA) {
+        var kind;
+        if (this.colorSpace.name === 'DeviceGray' && bpc === 1) {
+          kind = _util.ImageKind.GRAYSCALE_1BPP;
+        } else if (this.colorSpace.name === 'DeviceRGB' && bpc === 8 && !this.needsDecode) {
+          kind = _util.ImageKind.RGB_24BPP;
+        }
+        if (kind && !this.smask && !this.mask && drawWidth === originalWidth && drawHeight === originalHeight) {
+          imgData.kind = kind;
+          imgArray = this.getImageBytes(originalHeight * rowBytes);
+          if (this.image instanceof _stream.DecodeStream) {
+            imgData.data = imgArray;
+          } else {
+            var newArray = new Uint8ClampedArray(imgArray.length);
+            newArray.set(imgArray);
+            imgData.data = newArray;
+          }
+          if (this.needsDecode) {
+            (0, _util.assert)(kind === _util.ImageKind.GRAYSCALE_1BPP, 'PDFImage.createImageData: The image must be grayscale.');
+            var buffer = imgData.data;
+            for (var i = 0, ii = buffer.length; i < ii; i++) {
+              buffer[i] ^= 0xff;
+            }
+          }
+          return imgData;
+        }
+        if (this.image instanceof _jpeg_stream.JpegStream && !this.smask && !this.mask) {
+          var imageLength = originalHeight * rowBytes;
+          switch (this.colorSpace.name) {
+            case 'DeviceGray':
+              imageLength *= 3;
+            case 'DeviceRGB':
+            case 'DeviceCMYK':
+              imgData.kind = _util.ImageKind.RGB_24BPP;
+              imgData.data = this.getImageBytes(imageLength, drawWidth, drawHeight, true);
+              return imgData;
+          }
+        }
+      }
+      imgArray = this.getImageBytes(originalHeight * rowBytes);
+      var actualHeight = 0 | imgArray.length / rowBytes * drawHeight / originalHeight;
+      var comps = this.getComponents(imgArray);
+      var alpha01, maybeUndoPreblend;
+      if (!forceRGBA && !this.smask && !this.mask) {
+        imgData.kind = _util.ImageKind.RGB_24BPP;
+        imgData.data = new Uint8ClampedArray(drawWidth * drawHeight * 3);
+        alpha01 = 0;
+        maybeUndoPreblend = false;
+      } else {
+        imgData.kind = _util.ImageKind.RGBA_32BPP;
+        imgData.data = new Uint8ClampedArray(drawWidth * drawHeight * 4);
+        alpha01 = 1;
+        maybeUndoPreblend = true;
+        this.fillOpacity(imgData.data, drawWidth, drawHeight, actualHeight, comps);
+      }
+      if (this.needsDecode) {
+        this.decodeBuffer(comps);
+      }
+      this.colorSpace.fillRgb(imgData.data, originalWidth, originalHeight, drawWidth, drawHeight, actualHeight, bpc, comps, alpha01);
+      if (maybeUndoPreblend) {
+        this.undoPreblend(imgData.data, drawWidth, actualHeight);
+      }
+      return imgData;
+    },
+    fillGrayBuffer: function fillGrayBuffer(buffer) {
+      var numComps = this.numComps;
+      if (numComps !== 1) {
+        throw new _util.FormatError('Reading gray scale from a color image: ' + numComps);
+      }
+      var width = this.width;
+      var height = this.height;
+      var bpc = this.bpc;
+      var rowBytes = width * numComps * bpc + 7 >> 3;
+      var imgArray = this.getImageBytes(height * rowBytes);
+      var comps = this.getComponents(imgArray);
+      var i, length;
+      if (bpc === 1) {
+        length = width * height;
+        if (this.needsDecode) {
+          for (i = 0; i < length; ++i) {
+            buffer[i] = comps[i] - 1 & 255;
+          }
+        } else {
+          for (i = 0; i < length; ++i) {
+            buffer[i] = -comps[i] & 255;
+          }
+        }
+        return;
+      }
+      if (this.needsDecode) {
+        this.decodeBuffer(comps);
+      }
+      length = width * height;
+      var scale = 255 / ((1 << bpc) - 1);
+      for (i = 0; i < length; ++i) {
+        buffer[i] = scale * comps[i];
+      }
+    },
+    getImageBytes: function getImageBytes(length, drawWidth, drawHeight) {
+      var forceRGB = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
+
+      this.image.reset();
+      this.image.drawWidth = drawWidth || this.width;
+      this.image.drawHeight = drawHeight || this.height;
+      this.image.forceRGB = !!forceRGB;
+      return this.image.getBytes(length, true);
+    }
+  };
+  return PDFImage;
+}();
+exports.PDFImage = PDFImage;
+
+/***/ }),
+/* 172 */
+/***/ (function(module, exports, __w_pdfjs_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.MessageHandler = undefined;
+
+var _regenerator = __w_pdfjs_require__(131);
+
+var _regenerator2 = _interopRequireDefault(_regenerator);
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+var resolveCall = function () {
+  var _ref = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee(fn, args) {
+    var thisArg = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
+    return _regenerator2.default.wrap(function _callee$(_context) {
+      while (1) {
+        switch (_context.prev = _context.next) {
+          case 0:
+            if (fn) {
+              _context.next = 2;
+              break;
+            }
+
+            return _context.abrupt('return');
+
+          case 2:
+            return _context.abrupt('return', fn.apply(thisArg, args));
+
+          case 3:
+          case 'end':
+            return _context.stop();
+        }
+      }
+    }, _callee, this);
+  }));
+
+  return function resolveCall(_x2, _x3) {
+    return _ref.apply(this, arguments);
+  };
+}();
+
+var _util = __w_pdfjs_require__(2);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
+
+function wrapReason(reason) {
+  if ((typeof reason === 'undefined' ? 'undefined' : _typeof(reason)) !== 'object') {
+    return reason;
+  }
+  switch (reason.name) {
+    case 'AbortException':
+      return new _util.AbortException(reason.message);
+    case 'MissingPDFException':
+      return new _util.MissingPDFException(reason.message);
+    case 'UnexpectedResponseException':
+      return new _util.UnexpectedResponseException(reason.message, reason.status);
+    default:
+      return new _util.UnknownErrorException(reason.message, reason.details);
+  }
+}
+function makeReasonSerializable(reason) {
+  if (!(reason instanceof Error) || reason instanceof _util.AbortException || reason instanceof _util.MissingPDFException || reason instanceof _util.UnexpectedResponseException || reason instanceof _util.UnknownErrorException) {
+    return reason;
+  }
+  return new _util.UnknownErrorException(reason.message, reason.toString());
+}
+function resolveOrReject(capability, success, reason) {
+  if (success) {
+    capability.resolve();
+  } else {
+    capability.reject(reason);
+  }
+}
+function finalize(promise) {
+  return Promise.resolve(promise).catch(function () {});
+}
+function MessageHandler(sourceName, targetName, comObj) {
+  var _this = this;
+
+  this.sourceName = sourceName;
+  this.targetName = targetName;
+  this.comObj = comObj;
+  this.callbackId = 1;
+  this.streamId = 1;
+  this.postMessageTransfers = true;
+  this.streamSinks = Object.create(null);
+  this.streamControllers = Object.create(null);
+  var callbacksCapabilities = this.callbacksCapabilities = Object.create(null);
+  var ah = this.actionHandler = Object.create(null);
+  this._onComObjOnMessage = function (event) {
+    var data = event.data;
+    if (data.targetName !== _this.sourceName) {
+      return;
+    }
+    if (data.stream) {
+      _this._processStreamMessage(data);
+    } else if (data.isReply) {
+      var callbackId = data.callbackId;
+      if (data.callbackId in callbacksCapabilities) {
+        var callback = callbacksCapabilities[callbackId];
+        delete callbacksCapabilities[callbackId];
+        if ('error' in data) {
+          callback.reject(wrapReason(data.error));
+        } else {
+          callback.resolve(data.data);
+        }
+      } else {
+        throw new Error('Cannot resolve callback ' + callbackId);
+      }
+    } else if (data.action in ah) {
+      var action = ah[data.action];
+      if (data.callbackId) {
+        var _sourceName = _this.sourceName;
+        var _targetName = data.sourceName;
+        Promise.resolve().then(function () {
+          return action[0].call(action[1], data.data);
+        }).then(function (result) {
+          comObj.postMessage({
+            sourceName: _sourceName,
+            targetName: _targetName,
+            isReply: true,
+            callbackId: data.callbackId,
+            data: result
+          });
+        }, function (reason) {
+          comObj.postMessage({
+            sourceName: _sourceName,
+            targetName: _targetName,
+            isReply: true,
+            callbackId: data.callbackId,
+            error: makeReasonSerializable(reason)
+          });
+        });
+      } else if (data.streamId) {
+        _this._createStreamSink(data);
+      } else {
+        action[0].call(action[1], data.data);
+      }
+    } else {
+      throw new Error('Unknown action from worker: ' + data.action);
+    }
+  };
+  comObj.addEventListener('message', this._onComObjOnMessage);
+}
+MessageHandler.prototype = {
+  on: function on(actionName, handler, scope) {
+    var ah = this.actionHandler;
+    if (ah[actionName]) {
+      throw new Error('There is already an actionName called "' + actionName + '"');
+    }
+    ah[actionName] = [handler, scope];
+  },
+  send: function send(actionName, data, transfers) {
+    var message = {
+      sourceName: this.sourceName,
+      targetName: this.targetName,
+      action: actionName,
+      data: data
+    };
+    this.postMessage(message, transfers);
+  },
+  sendWithPromise: function sendWithPromise(actionName, data, transfers) {
+    var callbackId = this.callbackId++;
+    var message = {
+      sourceName: this.sourceName,
+      targetName: this.targetName,
+      action: actionName,
+      data: data,
+      callbackId: callbackId
+    };
+    var capability = (0, _util.createPromiseCapability)();
+    this.callbacksCapabilities[callbackId] = capability;
+    try {
+      this.postMessage(message, transfers);
+    } catch (e) {
+      capability.reject(e);
+    }
+    return capability.promise;
+  },
+  sendWithStream: function sendWithStream(actionName, data, queueingStrategy, transfers) {
+    var _this2 = this;
+
+    var streamId = this.streamId++;
+    var sourceName = this.sourceName;
+    var targetName = this.targetName;
+    return new _util.ReadableStream({
+      start: function start(controller) {
+        var startCapability = (0, _util.createPromiseCapability)();
+        _this2.streamControllers[streamId] = {
+          controller: controller,
+          startCall: startCapability,
+          isClosed: false
+        };
+        _this2.postMessage({
+          sourceName: sourceName,
+          targetName: targetName,
+          action: actionName,
+          streamId: streamId,
+          data: data,
+          desiredSize: controller.desiredSize
+        });
+        return startCapability.promise;
+      },
+      pull: function pull(controller) {
+        var pullCapability = (0, _util.createPromiseCapability)();
+        _this2.streamControllers[streamId].pullCall = pullCapability;
+        _this2.postMessage({
+          sourceName: sourceName,
+          targetName: targetName,
+          stream: 'pull',
+          streamId: streamId,
+          desiredSize: controller.desiredSize
+        });
+        return pullCapability.promise;
+      },
+      cancel: function cancel(reason) {
+        var cancelCapability = (0, _util.createPromiseCapability)();
+        _this2.streamControllers[streamId].cancelCall = cancelCapability;
+        _this2.streamControllers[streamId].isClosed = true;
+        _this2.postMessage({
+          sourceName: sourceName,
+          targetName: targetName,
+          stream: 'cancel',
+          reason: reason,
+          streamId: streamId
+        });
+        return cancelCapability.promise;
+      }
+    }, queueingStrategy);
+  },
+  _createStreamSink: function _createStreamSink(data) {
+    var _this3 = this;
+
+    var self = this;
+    var action = this.actionHandler[data.action];
+    var streamId = data.streamId;
+    var desiredSize = data.desiredSize;
+    var sourceName = this.sourceName;
+    var targetName = data.sourceName;
+    var capability = (0, _util.createPromiseCapability)();
+    var sendStreamRequest = function sendStreamRequest(_ref2) {
+      var stream = _ref2.stream,
+          chunk = _ref2.chunk,
+          transfers = _ref2.transfers,
+          success = _ref2.success,
+          reason = _ref2.reason;
+
+      _this3.postMessage({
+        sourceName: sourceName,
+        targetName: targetName,
+        stream: stream,
+        streamId: streamId,
+        chunk: chunk,
+        success: success,
+        reason: reason
+      }, transfers);
+    };
+    var streamSink = {
+      enqueue: function enqueue(chunk) {
+        var size = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
+        var transfers = arguments[2];
+
+        if (this.isCancelled) {
+          return;
+        }
+        var lastDesiredSize = this.desiredSize;
+        this.desiredSize -= size;
+        if (lastDesiredSize > 0 && this.desiredSize <= 0) {
+          this.sinkCapability = (0, _util.createPromiseCapability)();
+          this.ready = this.sinkCapability.promise;
+        }
+        sendStreamRequest({
+          stream: 'enqueue',
+          chunk: chunk,
+          transfers: transfers
+        });
+      },
+      close: function close() {
+        if (this.isCancelled) {
+          return;
+        }
+        this.isCancelled = true;
+        sendStreamRequest({ stream: 'close' });
+        delete self.streamSinks[streamId];
+      },
+      error: function error(reason) {
+        if (this.isCancelled) {
+          return;
+        }
+        this.isCancelled = true;
+        sendStreamRequest({
+          stream: 'error',
+          reason: reason
+        });
+      },
+
+      sinkCapability: capability,
+      onPull: null,
+      onCancel: null,
+      isCancelled: false,
+      desiredSize: desiredSize,
+      ready: null
+    };
+    streamSink.sinkCapability.resolve();
+    streamSink.ready = streamSink.sinkCapability.promise;
+    this.streamSinks[streamId] = streamSink;
+    resolveCall(action[0], [data.data, streamSink], action[1]).then(function () {
+      sendStreamRequest({
+        stream: 'start_complete',
+        success: true
+      });
+    }, function (reason) {
+      sendStreamRequest({
+        stream: 'start_complete',
+        success: false,
+        reason: reason
+      });
+    });
+  },
+  _processStreamMessage: function _processStreamMessage(data) {
+    var _this4 = this;
+
+    var sourceName = this.sourceName;
+    var targetName = data.sourceName;
+    var streamId = data.streamId;
+    var sendStreamResponse = function sendStreamResponse(_ref3) {
+      var stream = _ref3.stream,
+          success = _ref3.success,
+          reason = _ref3.reason;
+
+      _this4.comObj.postMessage({
+        sourceName: sourceName,
+        targetName: targetName,
+        stream: stream,
+        success: success,
+        streamId: streamId,
+        reason: reason
+      });
+    };
+    var deleteStreamController = function deleteStreamController() {
+      Promise.all([_this4.streamControllers[data.streamId].startCall, _this4.streamControllers[data.streamId].pullCall, _this4.streamControllers[data.streamId].cancelCall].map(function (capability) {
+        return capability && finalize(capability.promise);
+      })).then(function () {
+        delete _this4.streamControllers[data.streamId];
+      });
+    };
+    switch (data.stream) {
+      case 'start_complete':
+        resolveOrReject(this.streamControllers[data.streamId].startCall, data.success, wrapReason(data.reason));
+        break;
+      case 'pull_complete':
+        resolveOrReject(this.streamControllers[data.streamId].pullCall, data.success, wrapReason(data.reason));
+        break;
+      case 'pull':
+        if (!this.streamSinks[data.streamId]) {
+          sendStreamResponse({
+            stream: 'pull_complete',
+            success: true
+          });
+          break;
+        }
+        if (this.streamSinks[data.streamId].desiredSize <= 0 && data.desiredSize > 0) {
+          this.streamSinks[data.streamId].sinkCapability.resolve();
+        }
+        this.streamSinks[data.streamId].desiredSize = data.desiredSize;
+        resolveCall(this.streamSinks[data.streamId].onPull).then(function () {
+          sendStreamResponse({
+            stream: 'pull_complete',
+            success: true
+          });
+        }, function (reason) {
+          sendStreamResponse({
+            stream: 'pull_complete',
+            success: false,
+            reason: reason
+          });
+        });
+        break;
+      case 'enqueue':
+        (0, _util.assert)(this.streamControllers[data.streamId], 'enqueue should have stream controller');
+        if (!this.streamControllers[data.streamId].isClosed) {
+          this.streamControllers[data.streamId].controller.enqueue(data.chunk);
+        }
+        break;
+      case 'close':
+        (0, _util.assert)(this.streamControllers[data.streamId], 'close should have stream controller');
+        if (this.streamControllers[data.streamId].isClosed) {
+          break;
+        }
+        this.streamControllers[data.streamId].isClosed = true;
+        this.streamControllers[data.streamId].controller.close();
+        deleteStreamController();
+        break;
+      case 'error':
+        (0, _util.assert)(this.streamControllers[data.streamId], 'error should have stream controller');
+        this.streamControllers[data.streamId].controller.error(wrapReason(data.reason));
+        deleteStreamController();
+        break;
+      case 'cancel_complete':
+        resolveOrReject(this.streamControllers[data.streamId].cancelCall, data.success, wrapReason(data.reason));
+        deleteStreamController();
+        break;
+      case 'cancel':
+        if (!this.streamSinks[data.streamId]) {
+          break;
+        }
+        resolveCall(this.streamSinks[data.streamId].onCancel, [wrapReason(data.reason)]).then(function () {
+          sendStreamResponse({
+            stream: 'cancel_complete',
+            success: true
+          });
+        }, function (reason) {
+          sendStreamResponse({
+            stream: 'cancel_complete',
+            success: false,
+            reason: reason
+          });
+        });
+        this.streamSinks[data.streamId].sinkCapability.reject(wrapReason(data.reason));
+        this.streamSinks[data.streamId].isCancelled = true;
+        delete this.streamSinks[data.streamId];
+        break;
+      default:
+        throw new Error('Unexpected stream case');
+    }
+  },
+  postMessage: function postMessage(message, transfers) {
+    if (transfers && this.postMessageTransfers) {
+      this.comObj.postMessage(message, transfers);
+    } else {
+      this.comObj.postMessage(message);
+    }
+  },
+  destroy: function destroy() {
+    this.comObj.removeEventListener('message', this._onComObjOnMessage);
+  }
+};
+exports.MessageHandler = MessageHandler;
+
+/***/ })
+/******/ ]);
+});
+//# sourceMappingURL=pdf.worker.js.map
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/build/pdf.worker.js.map b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/build/pdf.worker.js.map
new file mode 100644
index 0000000..fd7ef02
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/build/pdf.worker.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack://pdfjs-dist/build/pdf.worker/webpack/universalModuleDefinition","webpack://pdfjs-dist/build/pdf.worker/webpack/bootstrap","webpack://pdfjs-dist/build/pdf.worker/src/pdf.worker.js","webpack://pdfjs-dist/build/pdf.worker/src/core/worker.js","webpack://pdfjs-dist/build/pdf.worker/src/shared/util.js","webpack://pdfjs-dist/build/pdf.worker/src/shared/compatibility.js","webpack://pdfjs-dist/build/pdf.worker/src/shared/global_scope.js","webpack://pdfjs-dist/build/pdf.worker/src/shared/is_node.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/fn/string/includes.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/es6.string.includes.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_export.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_global.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_core.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_hide.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_object-dp.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_an-object.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_is-object.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_ie8-dom-define.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_descriptors.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_fails.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_dom-create.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_to-primitive.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_property-desc.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_redefine.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_has.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_uid.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_ctx.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_a-function.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_string-context.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_is-regexp.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_cof.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_wks.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_shared.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_library.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_defined.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_fails-is-regexp.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/fn/array/includes.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/es7.array.includes.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_array-includes.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_to-iobject.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_iobject.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_to-length.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_to-integer.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_to-absolute-index.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_add-to-unscopables.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/fn/object/assign.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/es6.object.assign.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_object-assign.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_object-keys.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_object-keys-internal.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_shared-key.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_enum-bug-keys.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_object-gops.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_object-pie.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_to-object.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/fn/math/log2.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/es6.math.log2.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/fn/number/is-nan.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/es6.number.is-nan.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/fn/number/is-integer.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/es6.number.is-integer.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_is-integer.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/fn/promise.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/es6.object.to-string.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_classof.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/es6.string.iterator.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_string-at.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_iter-define.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_iterators.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_iter-create.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_object-create.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_object-dps.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_html.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_set-to-string-tag.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_object-gpo.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/web.dom.iterable.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/es6.array.iterator.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_iter-step.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/es6.promise.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_an-instance.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_for-of.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_iter-call.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_is-array-iter.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/core.get-iterator-method.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_species-constructor.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_task.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_invoke.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_microtask.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_new-promise-capability.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_perform.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_user-agent.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_promise-resolve.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_redefine-all.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_set-species.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_iter-detect.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/es7.promise.finally.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/es7.promise.try.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/fn/weak-map.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/es6.weak-map.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_array-methods.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_array-species-create.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_array-species-constructor.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_is-array.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_meta.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_collection-weak.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_validate-collection.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_collection.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_inherit-if-required.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_set-proto.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_object-gopd.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/es7.weak-map.of.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_set-collection-of.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/es7.weak-map.from.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_set-collection-from.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/fn/string/code-point-at.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/es6.string.code-point-at.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/fn/string/from-code-point.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/es6.string.from-code-point.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/es6/symbol.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/es6.symbol.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_wks-ext.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_wks-define.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_enum-keys.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_object-gopn-ext.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_object-gopn.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/fn/object/values.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/es7.object.values.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/core-js/modules/_object-to-array.js","webpack://pdfjs-dist/build/pdf.worker/src/shared/streams_polyfill.js","webpack://pdfjs-dist/build/pdf.worker/external/streams/streams-lib.js","webpack://pdfjs-dist/build/pdf.worker/src/shared/url_polyfill.js","webpack://pdfjs-dist/build/pdf.worker/external/url/url-lib.js","webpack://pdfjs-dist/build/pdf.worker/src/core/pdf_manager.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/babel-runtime/regenerator/index.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/regenerator-runtime/runtime-module.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/regenerator-runtime/runtime.js","webpack://pdfjs-dist/build/pdf.worker/node_modules/webpack/buildin/module.js","webpack://pdfjs-dist/build/pdf.worker/src/core/chunked_stream.js","webpack://pdfjs-dist/build/pdf.worker/src/core/document.js","webpack://pdfjs-dist/build/pdf.worker/src/core/obj.js","webpack://pdfjs-dist/build/pdf.worker/src/core/primitives.js","webpack://pdfjs-dist/build/pdf.worker/src/core/parser.js","webpack://pdfjs-dist/build/pdf.worker/src/core/stream.js","webpack://pdfjs-dist/build/pdf.worker/src/core/ccitt_stream.js","webpack://pdfjs-dist/build/pdf.worker/src/core/ccitt.js","webpack://pdfjs-dist/build/pdf.worker/src/core/jbig2_stream.js","webpack://pdfjs-dist/build/pdf.worker/src/core/jbig2.js","webpack://pdfjs-dist/build/pdf.worker/src/core/arithmetic_decoder.js","webpack://pdfjs-dist/build/pdf.worker/src/core/jpeg_stream.js","webpack://pdfjs-dist/build/pdf.worker/src/core/jpg.js","webpack://pdfjs-dist/build/pdf.worker/src/core/jpx_stream.js","webpack://pdfjs-dist/build/pdf.worker/src/core/jpx.js","webpack://pdfjs-dist/build/pdf.worker/src/core/crypto.js","webpack://pdfjs-dist/build/pdf.worker/src/core/colorspace.js","webpack://pdfjs-dist/build/pdf.worker/src/core/annotation.js","webpack://pdfjs-dist/build/pdf.worker/src/core/operator_list.js","webpack://pdfjs-dist/build/pdf.worker/src/core/evaluator.js","webpack://pdfjs-dist/build/pdf.worker/src/core/cmap.js","webpack://pdfjs-dist/build/pdf.worker/src/core/fonts.js","webpack://pdfjs-dist/build/pdf.worker/src/core/cff_parser.js","webpack://pdfjs-dist/build/pdf.worker/src/core/charsets.js","webpack://pdfjs-dist/build/pdf.worker/src/core/encodings.js","webpack://pdfjs-dist/build/pdf.worker/src/core/glyphlist.js","webpack://pdfjs-dist/build/pdf.worker/src/core/standard_fonts.js","webpack://pdfjs-dist/build/pdf.worker/src/core/unicode.js","webpack://pdfjs-dist/build/pdf.worker/src/core/font_renderer.js","webpack://pdfjs-dist/build/pdf.worker/src/core/type1_parser.js","webpack://pdfjs-dist/build/pdf.worker/src/core/pattern.js","webpack://pdfjs-dist/build/pdf.worker/src/core/bidi.js","webpack://pdfjs-dist/build/pdf.worker/src/core/metrics.js","webpack://pdfjs-dist/build/pdf.worker/src/core/function.js","webpack://pdfjs-dist/build/pdf.worker/src/core/ps_parser.js","webpack://pdfjs-dist/build/pdf.worker/src/core/murmurhash3.js","webpack://pdfjs-dist/build/pdf.worker/src/core/image.js","webpack://pdfjs-dist/build/pdf.worker/src/shared/message_handler.js"],"names":["pdfjsVersion","pdfjsBuild","pdfjsCoreWorker","require","exports","WorkerTask","finish","terminate","ensureNotTerminated","PDFWorkerStream","getFullReader","assert","getRangeReader","reader","cancelAllRequests","readers","readableStream","data","PDFWorkerStreamReader","read","value","done","cancel","PDFWorkerStreamRangeReader","WorkerMessageHandler","setup","testMessageProcessed","handler","supportTransfers","xhr","responseExists","supportTypedArray","setVerbosityLevel","createDocumentHandler","terminated","cancelXHRs","WorkerTasks","apiVersion","docParams","workerVersion","docId","docBaseUrl","workerHandlerName","task","i","loadDocumentCapability","parseSuccess","Promise","pdfManager","parseFailure","pdfManagerCapability","source","cachedChunks","pdfStream","fullRequest","disableAutoFetch","msgHandler","url","password","length","rangeChunkSize","loaded","flushChunks","pdfFile","arraysToBytes","warn","readPromise","readChunk","chunk","arrayByteLength","total","Math","reject","pdfInfo","e","startWorkerTask","finishWorkerTask","loadDocument","onFailure","evaluatorOptions","forceDataSchema","maxImageSize","disableFontFace","nativeImageDecoderSupport","ignoreErrors","isEvalSupported","getPdfManager","newPdfManager","stream","ref","catalog","page","pageIndex","pageNum","start","Date","intent","renderInteractiveForms","info","operatorList","featureId","UNSUPPORTED_FEATURES","minimumStackMessage","wrappedException","message","stack","error","sink","normalizeWhitespace","combineTextItems","waitOn","setupDoc","initializeFromPort","maybePort","isMessagePort","IDENTITY_MATRIX","FONT_IDENTITY_MATRIX","NativeImageDecoding","NONE","DECODE","DISPLAY","PermissionFlag","PRINT","MODIFY_CONTENTS","COPY","MODIFY_ANNOTATIONS","FILL_INTERACTIVE_FORMS","COPY_FOR_ACCESSIBILITY","ASSEMBLE","PRINT_HIGH_QUALITY","TextRenderingMode","FILL","STROKE","FILL_STROKE","INVISIBLE","FILL_ADD_TO_PATH","STROKE_ADD_TO_PATH","FILL_STROKE_ADD_TO_PATH","ADD_TO_PATH","FILL_STROKE_MASK","ADD_TO_PATH_FLAG","ImageKind","GRAYSCALE_1BPP","RGB_24BPP","RGBA_32BPP","AnnotationType","TEXT","LINK","FREETEXT","LINE","SQUARE","CIRCLE","POLYGON","POLYLINE","HIGHLIGHT","UNDERLINE","SQUIGGLY","STRIKEOUT","STAMP","CARET","INK","POPUP","FILEATTACHMENT","SOUND","MOVIE","WIDGET","SCREEN","PRINTERMARK","TRAPNET","WATERMARK","THREED","REDACT","AnnotationFlag","HIDDEN","NOZOOM","NOROTATE","NOVIEW","READONLY","LOCKED","TOGGLENOVIEW","LOCKEDCONTENTS","AnnotationFieldFlag","REQUIRED","NOEXPORT","MULTILINE","PASSWORD","NOTOGGLETOOFF","RADIO","PUSHBUTTON","COMBO","EDIT","SORT","FILESELECT","MULTISELECT","DONOTSPELLCHECK","DONOTSCROLL","COMB","RICHTEXT","RADIOSINUNISON","COMMITONSELCHANGE","AnnotationBorderStyleType","SOLID","DASHED","BEVELED","INSET","StreamType","UNKNOWN","FLATE","LZW","DCT","JPX","JBIG","A85","AHX","CCF","RL","FontType","TYPE1","TYPE1C","CIDFONTTYPE0","CIDFONTTYPE0C","TRUETYPE","CIDFONTTYPE2","TYPE3","OPENTYPE","TYPE0","MMTYPE1","VerbosityLevel","ERRORS","WARNINGS","INFOS","CMapCompressionType","BINARY","STREAM","OPS","dependency","setLineWidth","setLineCap","setLineJoin","setMiterLimit","setDash","setRenderingIntent","setFlatness","setGState","save","restore","transform","moveTo","lineTo","curveTo","curveTo2","curveTo3","closePath","rectangle","stroke","closeStroke","fill","eoFill","fillStroke","eoFillStroke","closeFillStroke","closeEOFillStroke","endPath","clip","eoClip","beginText","endText","setCharSpacing","setWordSpacing","setHScale","setLeading","setFont","setTextRenderingMode","setTextRise","moveText","setLeadingMoveText","setTextMatrix","nextLine","showText","showSpacedText","nextLineShowText","nextLineSetSpacingShowText","setCharWidth","setCharWidthAndBounds","setStrokeColorSpace","setFillColorSpace","setStrokeColor","setStrokeColorN","setFillColor","setFillColorN","setStrokeGray","setFillGray","setStrokeRGBColor","setFillRGBColor","setStrokeCMYKColor","setFillCMYKColor","shadingFill","beginInlineImage","beginImageData","endInlineImage","paintXObject","markPoint","markPointProps","beginMarkedContent","beginMarkedContentProps","endMarkedContent","beginCompat","endCompat","paintFormXObjectBegin","paintFormXObjectEnd","beginGroup","endGroup","beginAnnotations","endAnnotations","beginAnnotation","endAnnotation","paintJpegXObject","paintImageMaskXObject","paintImageMaskXObjectGroup","paintImageXObject","paintInlineImageXObject","paintInlineImageXObjectGroup","paintImageXObjectRepeat","paintImageMaskXObjectRepeat","paintSolidColorImageMask","constructPath","unknown","forms","javaScript","smask","shadingPattern","font","PasswordResponses","NEED_PASSWORD","INCORRECT_PASSWORD","verbosity","Number","console","unreachable","base","other","absoluteUrl","baseUrl","_isValidProtocol","Object","enumerable","configurable","writable","lookup","initializer","PasswordException","UnknownErrorException","InvalidPDFException","MissingPDFException","UnexpectedResponseException","MissingDataException","XRefParseException","FormatError","AbortException","NullCharactersRegExp","str","bytes","MAX_ARGUMENT_COUNT","String","strBuf","chunkEnd","arr","resultLength","ii","item","itemLength","pos","stringToBytes","x","offset","buffer8","view32","getArray","stopWhenFound","LOOP_LIMIT","loopCount","dict","values","Util","rgbBuf","m1","m2","xt","p","m","yt","d","p1","p2","r","p3","p4","v","transpose","a","b","c","first","second","sx","sy","rect","orderedX","rect1","rect2","orderedY","result","ROMAN_NUMBER_MAP","lowerCase","number","romanBuf","romanStr","PDFStringTranslateTable","n","code","decodeURIComponent","escape","unescape","encodeURIComponent","ch","capability","createObjectURL","digits","URL","blob","type","buffer","b1","b2","b3","d1","d2","d3","d4","globalScope","isNodeJS","hasDOM","Buffer","get","scripts","document","Element","div","originalDOMTokenListToggle","DOMTokenList","arguments","force","Array","module","window","global","self","process","$export","context","INCLUDES","includes","core","hide","redefine","ctx","PROTOTYPE","IS_FORCED","IS_GLOBAL","IS_STATIC","IS_PROTO","IS_BIND","target","expProto","own","out","exp","Function","__g","version","__e","dP","createDesc","object","anObject","IE8_DOM_DEFINE","toPrimitive","P","TypeError","O","Attributes","isObject","it","is","S","val","fn","has","SRC","TO_STRING","$toString","TPL","isFunction","hasOwnProperty","id","px","key","aFunction","that","isRegExp","defined","cof","MATCH","toString","store","uid","Symbol","USE_SYMBOL","$exports","SHARED","mode","copyright","re","$includes","toIObject","toLength","toAbsoluteIndex","index","IS_INCLUDES","el","IObject","toInteger","min","ceil","floor","isNaN","max","UNSCOPABLES","ArrayProto","assign","getKeys","gOPS","pIE","toObject","$assign","A","B","K","T","aLen","getSymbols","isEnum","keys","j","$keys","enumBugKeys","arrayIndexOf","IE_PROTO","names","shared","log2","isInteger","isFinite","classof","test","TAG","ARG","tryGet","$at","point","s","l","LIBRARY","Iterators","$iterCreate","setToStringTag","getPrototypeOf","ITERATOR","BUGGY","FF_ITERATOR","KEYS","VALUES","returnThis","getMethod","kind","proto","NAME","DEF_VALUES","DEFAULT","VALUES_BUG","Base","$native","$default","$entries","$anyNative","IteratorPrototype","methods","IS_SET","entries","create","descriptor","Constructor","next","dPs","Empty","createDict","iframe","lt","gt","iframeDocument","Properties","def","stat","ObjectProto","$iterators","wks","TO_STRING_TAG","ArrayValues","DOMIterables","CSSRuleList","CSSStyleDeclaration","CSSValueList","ClientRectList","DOMRectList","DOMStringList","DataTransferItemList","FileList","HTMLAllCollection","HTMLCollection","HTMLFormElement","HTMLSelectElement","MediaList","MimeTypeArray","NamedNodeMap","NodeList","PaintRequestList","Plugin","PluginArray","SVGLengthList","SVGNumberList","SVGPathSegList","SVGPointList","SVGStringList","SVGTransformList","SourceBufferList","StyleSheetList","TextTrackCueList","TextTrackList","TouchList","collections","explicit","Collection","addToUnscopables","step","anInstance","forOf","speciesConstructor","microtask","newPromiseCapabilityModule","perform","userAgent","promiseResolve","PROMISE","versions","v8","$Promise","isNode","empty","newPromiseCapability","newGenericPromiseCapability","USE_NATIVE","promise","FakePromise","exec","isThenable","notify","chain","ok","run","reaction","resolve","domain","onHandleUnhandled","exited","then","isReject","onUnhandled","unhandled","isUnhandled","reason","$reject","$resolve","wrapper","_w","_d","Internal","executor","OwnPromiseCapability","C","Wrapper","$$reject","all","remaining","$index","alreadyCalled","race","forbiddenField","name","call","isArrayIter","getIterFn","BREAK","RETURN","iterFn","f","iterable","iterator","ret","SPECIES","invoke","html","cel","setTask","clearTask","MessageChannel","Dispatch","counter","queue","ONREADYSTATECHANGE","listener","event","args","defer","channel","port","setTimeout","set","clear","un","macrotask","Observer","flush","parent","head","last","toggle","node","characterData","navigator","promiseCapability","src","DESCRIPTORS","SAFE_CLOSING","riter","safe","iter","each","meta","weak","fails","validate","WEAK_MAP","getWeak","isExtensible","uncaughtFrozenStore","tmp","$WeakMap","InternalMap","method","asc","IS_MAP","TYPE","IS_FILTER","IS_SOME","IS_EVERY","IS_FIND_INDEX","NO_HOLES","$create","res","isArray","original","META","setDesc","FREEZE","setMeta","w","fastKey","onFreeze","KEY","NEED","redefineAll","createArrayMethod","$has","arrayFind","arrayFindIndex","UncaughtFrozenStore","findUncaughtFrozen","entry","getConstructor","ufstore","$iterDetect","inheritIfRequired","ADDER","fixMethod","IS_WEAK","common","instance","HASNT_CHAINING","THROWS_ON_PRIMITIVES","ACCEPT_ITERABLES","BUGGY_ZERO","$instance","setPrototypeOf","check","buggy","gOPD","of","from","mapFn","mapping","cb","codePointAt","fromCharCode","$fromCodePoint","fromCodePoint","RangeError","$fails","wksExt","wksDefine","enumKeys","_create","gOPNExt","$GOPD","$DP","gOPN","$Symbol","$JSON","_stringify","TO_PRIMITIVE","SymbolRegistry","AllSymbols","OPSymbols","QObject","setter","setSymbolDesc","protoDesc","wrap","sym","isSymbol","$defineProperty","D","$defineProperties","$propertyIsEnumerable","E","$getOwnPropertyDescriptor","$getOwnPropertyNames","$getOwnPropertySymbols","IS_OP","tag","$set","es6Symbols","wellKnownSymbols","k","keyFor","useSetter","useSimple","defineProperty","defineProperties","getOwnPropertyDescriptor","getOwnPropertyNames","getOwnPropertySymbols","stringify","$replacer","replacer","symbols","windowNames","getWindowNames","hiddenKeys","$values","isReadableStreamSupported","controller","installedModules","modules","__w_pdfjs_require__","getter","_typeof","obj","_require","elements","IsPropertyKey","Call","F","highWaterMark","size","AssertionError","Error","rethrowAssertionErrorRejection","_createClass","props","InvokeOrNoop","PromiseInvokeOrNoop","ValidateAndNormalizeQueuingStrategy","typeIsObject","_require2","_require3","DequeueValue","EnqueueValueWithSize","PeekQueueValue","ResetQueue","WritableStream","underlyingSink","_ref","_ref$highWaterMark","_classCallCheck","IsWritableStream","streamBrandCheckException","IsWritableStreamLocked","WritableStreamAbort","AcquireWritableStreamDefaultWriter","WritableStreamDefaultControllerError","WritableStreamDefaultWriterCloseWithErrorPropagation","WritableStreamDefaultWriterRelease","WritableStreamDefaultWriterWrite","WritableStreamCloseQueuedOrInFlight","state","wasAlreadyErroring","_resolve","_reject","_reason","_wasAlreadyErroring","WritableStreamStartErroring","writeRequest","WritableStreamFinishErroring","writer","WritableStreamDefaultWriterEnsureReadyPromiseRejected","WritableStreamHasOperationMarkedInFlight","storedError","WritableStreamRejectCloseAndClosedPromiseIfNeeded","abortRequest","WritableStreamDealWithRejection","defaultWriterClosedPromiseResolve","defaultWriterClosedPromiseReject","backpressure","defaultWriterReadyPromiseReset","defaultWriterReadyPromiseResolve","WritableStreamDefaultWriter","defaultWriterReadyPromiseInitialize","defaultWriterReadyPromiseInitializeAsResolved","defaultWriterClosedPromiseInitialize","defaultWriterReadyPromiseInitializeAsRejected","defaultWriterClosedPromiseInitializeAsResolved","defaultWriterClosedPromiseInitializeAsRejected","IsWritableStreamDefaultWriter","defaultWriterBrandCheckException","defaultWriterLockException","WritableStreamDefaultWriterAbort","WritableStreamDefaultWriterClose","WritableStreamDefaultWriterGetDesiredSize","closeRequest","WritableStreamDefaultControllerClose","defaultWriterClosedPromiseResetToRejected","defaultWriterReadyPromiseReject","defaultWriterReadyPromiseResetToRejected","WritableStreamDefaultControllerGetDesiredSize","releasedError","WritableStreamDefaultWriterEnsureClosedPromiseRejected","chunkSize","WritableStreamDefaultControllerGetChunkSize","WritableStreamAddWriteRequest","WritableStreamDefaultControllerWrite","WritableStreamDefaultController","normalizedStrategy","WritableStreamDefaultControllerGetBackpressure","WritableStreamUpdateBackpressure","IsWritableStreamDefaultController","_this","startResult","WritableStreamDefaultControllerAdvanceQueueIfNeeded","strategySize","WritableStreamDefaultControllerErrorIfNeeded","writeRecord","WritableStreamDefaultControllerProcessClose","WritableStreamDefaultControllerProcessWrite","WritableStreamMarkCloseRequestInFlight","sinkClosePromise","WritableStreamFinishInFlightClose","WritableStreamFinishInFlightCloseWithError","WritableStreamMarkFirstWriteRequestInFlight","sinkWritePromise","WritableStreamFinishInFlightWrite","WritableStreamFinishInFlightWriteWithError","desiredSize","IsFiniteNonNegativeNumber","container","pair","ArrayBufferCopy","CreateIterResultObject","TransferArrayBuffer","ValidateAndNormalizeHighWaterMark","createArrayFromList","createDataProperty","_require4","_require5","ReadableStream","underlyingSource","typeString","IsReadableStream","IsReadableStreamLocked","ReadableStreamCancel","_ref2","AcquireReadableStreamDefaultReader","AcquireReadableStreamBYOBReader","_ref3","readable","ifIsObjectAndHasAPromiseIsHandledInternalSlotSetPromiseIsHandledToTrue","_ref4","preventClose","preventAbort","preventCancel","Boolean","shuttingDown","currentWrite","_ref5","isOrBecomesErrored","shutdownWithAction","shutdown","isOrBecomesClosed","dest","destClosed","pipeLoop","oldCurrentWrite","action","waitForWritesToFinish","finalize","ReadableStreamReaderGenericRelease","branches","ReadableStreamTee","IsReadableStreamDisturbed","ReadableStreamDefaultControllerClose","ReadableStreamDefaultControllerEnqueue","ReadableStreamDefaultControllerError","ReadableStreamDefaultControllerGetDesiredSize","teeState","closedOrErrored","canceled1","canceled2","reason1","reason2","pull","cancel1","cancel2","underlyingSource1","branch1Stream","underlyingSource2","branch2Stream","branch1","branch2","value1","value2","compositeReason","cancelResult","IsReadableStreamBYOBReader","readIntoRequest","IsReadableStreamDefaultReader","readRequest","ReadableStreamClose","sourceCancelPromise","defaultReaderClosedPromiseResolve","_i","defaultReaderClosedPromiseReject","ReadableStreamDefaultReader","ReadableStreamReaderGenericInitialize","defaultReaderBrandCheckException","readerLockException","ReadableStreamReaderGenericCancel","ReadableStreamDefaultReaderRead","ReadableStreamBYOBReader","IsReadableByteStreamController","byobReaderBrandCheckException","ArrayBuffer","view","ReadableStreamBYOBReaderRead","defaultReaderClosedPromiseInitialize","defaultReaderClosedPromiseInitializeAsResolved","defaultReaderClosedPromiseInitializeAsRejected","defaultReaderClosedPromiseResetToRejected","ReadableByteStreamControllerPullInto","ReadableStreamDefaultController","ReadableStreamDefaultControllerCallPullIfNeeded","ReadableStreamDefaultControllerErrorIfNeeded","IsReadableStreamDefaultController","defaultControllerBrandCheckException","pendingPromise","ReadableStreamAddReadRequest","shouldPull","ReadableStreamDefaultControllerShouldCallPull","pullPromise","ReadableStreamGetNumReadRequests","ReadableStreamFulfillReadRequest","ReadableStreamError","ReadableStreamBYOBRequest","IsReadableStreamBYOBRequest","byobRequestBrandCheckException","ReadableByteStreamControllerRespond","ReadableByteStreamControllerRespondWithNewView","ReadableByteStreamController","ReadableByteStreamControllerClearPendingPullIntos","autoAllocateChunkSize","underlyingByteSource","ReadableByteStreamControllerCallPullIfNeeded","ReadableByteStreamControllerError","byteStreamControllerBrandCheckException","ReadableByteStreamControllerClose","ReadableByteStreamControllerEnqueue","firstDescriptor","ReadableStreamHasDefaultReader","ReadableByteStreamControllerHandleQueueDrain","pullIntoDescriptor","byteOffset","byteLength","bytesFilled","elementSize","ctor","readerType","ReadableByteStreamControllerGetDesiredSize","ReadableByteStreamControllerShouldCallPull","ReadableByteStreamControllerInvalidateBYOBRequest","filledView","ReadableByteStreamControllerConvertPullIntoDescriptor","ReadableStreamFulfillReadIntoRequest","currentAlignedBytes","maxBytesToCopy","maxBytesFilled","maxAlignedBytes","totalBytesToCopyRemaining","ready","headOfQueue","bytesToCopy","destStart","ReadableByteStreamControllerFillHeadPullIntoDescriptor","ReadableByteStreamControllerFillPullIntoDescriptorFromQueue","ReadableByteStreamControllerShiftPendingPullInto","ReadableByteStreamControllerCommitPullIntoDescriptor","ReadableStreamAddReadIntoRequest","emptyView","ReadableStreamHasBYOBReader","ReadableStreamGetNumReadIntoRequests","remainderSize","end","remainder","ReadableByteStreamControllerEnqueueChunkToQueue","ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue","bytesWritten","ReadableByteStreamControllerRespondInClosedState","ReadableByteStreamControllerRespondInReadableState","firstPendingPullInto","transferredBuffer","transferredView","ReadableByteStreamControllerRespondInternal","transformStream","writableStream","PromiseInvokeOrPerformFallback","TransformStreamCloseReadableInternal","TransformStreamErrorIfNeeded","maybeBackpressure","TransformStreamSetBackpressure","TransformStreamErrorInternal","resolution","transformStreamController","TransformStreamEnqueueToReadable","transformer","transformPromise","TransformStreamReadableReadyPromise","TransformStreamSink","TransformStreamTransform","flushPromise","TransformStreamSource","TransformStreamDefaultController","IsTransformStream","IsTransformStreamDefaultController","TransformStreamCloseReadable","TransformStreamError","readableController","TransformStream","readableStrategy","writableStrategy","startPromise_resolve","startPromise","isURLSupported","u","PolyfillURL","OriginalURL","relative","relativePathDotMapping","h","invalid","unicode","ALPHA","ALPHANUMERIC","errors","stateOverride","cursor","seenAt","seenBracket","input","err","isRelativeScheme","percentEscape","nextC","nextNextC","cp","tempC","IDNAToASCII","temp","parseInt","percentEscapeQuery","parse","JURL","authority","host","constructor","ensureDoc","ensureXRef","ensureCatalog","getPage","requestRange","sendProgressiveData","updatePassword","createValidAbsoluteUrl","shadow","ex","g","hadRuntime","oldRuntime","Op","hasOwn","iteratorSymbol","asyncIteratorSymbol","toStringTagSymbol","inModule","runtime","protoGenerator","outerFn","generator","tryLocsList","makeInvokeMethod","arg","GenStateSuspendedStart","GenStateSuspendedYield","GenStateExecuting","GenStateCompleted","ContinueSentinel","getProto","NativeIteratorPrototype","Gp","GeneratorFunctionPrototype","Generator","GeneratorFunction","prototype","genFun","__await","record","tryCatch","previousPromise","defineIteratorMethods","AsyncIterator","delegate","delegateResult","maybeInvokeDelegate","tryLoc","locs","iteratorMethod","Context","reset","stop","rootEntry","rootRecord","dispatchException","handle","hasCatch","hasFinally","abrupt","finallyEntry","complete","resetTryEntry","thrown","delegateYield","resultName","nextLoc","ChunkedStream","getMissingChunks","chunks","getBaseStreams","allChunksLoaded","onReceiveData","begin","beginChunk","endChunk","curChunk","onReceiveProgressiveData","position","ensureByte","ensureRange","nextEmptyChunk","numChunks","hasChunk","getByte","getUint16","b0","getInt32","getBytes","forceClamped","strEnd","subarray","peekByte","peekedByte","peekBytes","getByteRange","skip","moveStart","makeSubStream","ChunkedStreamSubstream","missingChunks","subStream","ChunkedStreamManager","onLoadedStream","sendRequest","rangeReader","manager","chunkData","requestAllChunks","_requestChunks","requestId","chunksNeeded","isEmptyObj","chunksToRequest","groupedChunksToRequest","groupedChunk","getStream","requestRanges","ranges","groupChunks","groupedChunks","prevChunk","onProgress","bytesLoaded","isProgressive","loadedRequests","requestIds","lastChunk","onError","getBeginChunk","getEndChunk","abort","Page","DEFAULT_USER_UNIT","LETTER_SIZE_MEDIABOX","annotation","uniquePrefix","idCounters","createObjId","_getInheritableProperty","isDict","Dict","mediaBox","cropBox","isNum","intersection","rotate","getContentStream","content","xref","streams","isStream","loadResources","objectLoader","getOperatorList","contentStreamPromise","resourcesPromise","partialEvaluator","idFactory","fontCache","builtInCMapCache","options","pdfFunctionFactory","dataPromises","pageListPromise","opList","transparency","resources","annotations","pageOpList","opListPromises","isAnnotationRenderable","opLists","extractTextContent","getAnnotationsData","annotationsData","parsedAnnotations","annotationRefs","annotationPromises","AnnotationFactory","PDFDocument","FINGERPRINT_FIRST_BYTES","EMPTY_FINGERPRINT","isArrayBuffer","limit","backwards","DocumentInfoValidators","Title","Author","Subject","Keywords","Creator","Producer","CreationDate","ModDate","Trapped","isName","fields","linearization","Linearization","startXRef","find","found","isSpace","checkHeader","MAX_VERSION_LENGTH","parseStartXRef","num","docInfo","PDFFormatVersion","IsLinearized","IsAcroFormPresent","IsXFAPresent","infoDict","stringToPDFString","fileID","idArray","isString","hash","calculateMD5","hex","_getLinearizationPage","cleanup","isRef","root","items","processed","blackColor","outlineDict","Catalog","destDict","resultObj","title","flags","color","rgbColor","ColorSpace","outlineItem","unsafeUrl","newWindow","count","bold","italic","encrypt","permissions","getDestination","fetchDestination","pageLabels","style","prefix","numberTree","nums","currentLabel","currentIndex","labelDict","st","toRomanNumerals","LIMIT","A_UPPER_CASE","A_LOWER_CASE","baseCharCode","letterIndex","character","charBuf","jj","promises","translatedFonts","getPageDict","nodesToVisit","pageKidsCountCache","currentPageIndex","currentNode","objId","kids","getPageIndex","isRefsEqual","parentRef","kidPromises","kid","streamRef","suppressEncryption","subtype","metadata","stringToUTF8String","bytesToString","pagesObj","dests","pageMode","attachments","nameTree","fs","jsDict","js","appendIfJavaScriptDict","openActionDict","actionType","params","actionName","addDefaultProtocolToUrl","urlDict","remoteDest","JSON","isBool","namedAction","jsAction","URL_OPEN_METHODS","regex","jsUrl","tryConvertUrlEncoding","XRef","streamTypes","fontTypes","setStartXRef","trailerDict","ids","fileId","processXRefTable","entryNum","streamPos","parser","parserBuf1","parserBuf2","isCmd","readXRefTable","tableState","processXRefStream","streamParameters","byteWidths","range","entryRanges","readXRefStream","streamState","typeFieldWidth","offsetFieldWidth","generationFieldWidth","generation","indexObjects","TAB","LF","CR","SPACE","PERCENT","LT","token","what","dataLength","skipped","objRegExp","endobjRegExp","nestedObjRegExp","CHECK_CONTENT_LENGTH","trailerBytes","startxrefBytes","objBytes","xrefBytes","trailers","xrefStms","readToken","skipUntil","gen","uncompressed","startPos","endPos","contentLength","checkPos","tokenStr","objToken","xrefTagOffset","rootDict","readXRef","startXRefParsedCache","getEntry","xrefEntry","fetchIfRef","fetch","cacheEntry","fetchUncompressed","obj1","obj2","obj3","fetchCompressed","tableOffset","getCatalogObj","kidsOrEntries","MAX_LEVELS","limits","currentKey","FileSpec","filename","pickPlatformItem","fileObj","ObjectLoader","dictKeys","rawValue","mayHaveChildren","load","_walk","nodesToRevisit","pendingRequests","baseStreams","foundMissingData","addChildren","EOF","Name","nameCache","nameValue","Cmd","cmdCache","cmdValue","nonSerializable","assignXref","key1","key2","getAsync","getRaw","forEach","callback","mergedDict","dictArray","Ref","RefSet","put","remove","RefSetCache","putAlias","v1","v2","MAX_LENGTH_TO_CACHE","MAX_ADLER32_LENGTH","bytesLength","Parser","recoveryMode","refill","shift","tryShift","getObj","buf1","array","isEOF","cipherTransform","findDefaultInlineStreamEnd","I","NUL","maybeEIPos","followingBytes","findDCTDecodeInlineStreamEnd","foundEOI","markerLength","findASCII85DecodeInlineStreamEnd","TILDE","GT","findASCIIHexDecodeInlineStreamEnd","inlineStreamSkipEI","makeInlineImage","lexer","dictLength","filter","filterName","filterZero","imageStream","imageBytes","initialStreamPos","dictBytes","cacheKey","computeAdler32","_findStreamLength","SCAN_BLOCK_LENGTH","signatureLength","signature","scanBytes","scanLength","makeStream","ENDSTREAM_SIGNATURE","actualLength","MAX_TRUNCATION","TRUNCATED_SIGNATURE","maybeLength","lastByte","filterArray","paramsArray","makeFilter","xrefStreamStats","earlyChange","Lexer","specialChars","nextChar","peekChar","getNumber","eNotation","divideBy","sign","baseValue","powerValue","powerValueSign","currentDigit","getString","numParen","charBuffered","getName","toHexDigit","previousCh","x2","getHexString","isFirstHex","firstDigit","secondDigit","comment","knownCommands","knownCommandFound","possibleCommand","skipToNextLine","linDict","hints","hintsLength","getInt","objectNumberFirst","endFirst","numPages","mainXRefEntriesOffset","pageFirst","Stream","arrayBuffer","StringStream","DecodeStream","emptyBuffer","maybeMinBufferLength","ensureBuffer","requested","buffer2","bufEnd","StreamsSequenceStream","bufferLength","newLength","FlateStream","codeLenCodeMap","lengthDecode","distDecode","fixedLitCodeTab","fixedDistCodeTab","cmf","flg","codeSize","codeBuf","codes","table","maxLen","codeLen","codeVal","lengths","len","code2","t","hdr","blockLen","litCodeTable","distCodeTable","numLitCodes","numDistCodes","numCodeLenCodes","codeLenCodeLengths","codeLenCodeTab","codeLengths","bitsLength","bitsOffset","repeatLength","code1","dist","PredictorStream","predictor","colors","bits","columns","rowBytes","rawBytes","inbuf","outbuf","inbits","outbits","bytesPerPixel","sum","compArray","bitMask","kk","pixBytes","prevRow","up","upLeft","left","pa","pb","pc","DecryptStream","hasMoreData","decrypt","Ascii85Stream","TILDA_CHAR","Z_LOWER_CHAR","AsciiHexStream","UPSTREAM_BLOCK_SIZE","maxDecodeLength","digit","RunLengthStream","repeatHeader","LZWStream","maxLzwDictionarySize","lzwState","codeLength","nextCode","dictionaryValues","dictionaryLengths","dictionaryPrevCodes","currentSequence","currentSequenceLength","bitsCached","cachedData","blockSize","estimatedDecodedSize","decodedSizeDelta","prevCode","decodedLength","currentBufferLength","hasPrev","q","NullStream","CCITTFaxStream","EndOfLine","EncodedByteAlign","Columns","Rows","EndOfBlock","BlackIs1","CCITTFaxDecoder","ccittEOL","ccittEOF","twoDimPass","twoDimHoriz","twoDimVert0","twoDimVertR1","twoDimVertL1","twoDimVertR2","twoDimVertL2","twoDimVertR3","twoDimVertL3","twoDimTable","whiteTable1","whiteTable2","blackTable1","blackTable2","blackTable3","eoblock","readNextChar","refLine","codingLine","refPos","blackPixels","code3","gotEOL","_addPixels","codingPos","a1","_addPixelsNeg","_findTableCode","limitValue","_getTwoDimCode","_getWhiteCode","_getBlackCode","_lookBits","_eatBits","Jbig2Stream","jbig2Image","globalsStream","globals","Jbig2Error","Jbig2Image","ContextCache","getContexts","DecodingContext","decoder","cache","contexts","contextCache","prev","bit","readBits","SegmentTypes","CodingTemplates","y","RefinementTemplates","coding","reference","ReusedContexts","RefinementReusedContexts","decodingContext","bitmap","OLD_PIXEL_MASK","row","row1","row2","contextLabel","pixel","decodeMMRBitmap","templateIndex","at","decodeBitmapTemplate0","useskip","template","templateLength","templateX","templateY","changingTemplateEntries","reuseMask","minX","maxX","minY","changingEntriesLength","changingTemplateX","changingTemplateY","changingTemplateBit","sbb_left","sbb_top","sbb_right","width","pseudoPixelContext","ltp","sltp","i0","j0","codingTemplate","codingTemplateLength","codingTemplateX","codingTemplateY","referenceTemplate","referenceTemplateLength","referenceTemplateX","referenceTemplateY","referenceWidth","referenceBitmap","referenceHeight","huffman","newSymbols","currentHeight","symbolCodeLength","tableB1","getStandardTable","symbolWidths","deltaHeight","huffmanTables","decodeInteger","currentWidth","totalWidth","firstSymbol","deltaWidth","numberOfInstances","decodeTextRegion","symbolId","decodeIAID","rdx","rdy","symbol","decodeRefinement","decodeBitmap","bitmapSize","huffmanInput","collectiveBitmap","readUncompressedBitmap","originalEnd","bitmapEnd","numberOfSymbolsDecoded","xMin","bitmapWidth","xMax","symbolBitmap","exportedSymbols","currentFlag","totalSymbolsLength","runLength","stripT","firstS","deltaT","deltaFirstS","currentS","currentT","stripSize","applyRefinement","refinement","inputSymbols","symbolWidth","symbolHeight","rdw","rdh","offsetT","referenceCorner","offsetS","s2","symbolRow","maxWidth","t2","deltaS","collectiveWidth","patterns","patternBitmap","patternWidth","combinationOperator","regionBitmap","numberOfPatterns","pattern0","patternHeight","bitsPerValue","grayScaleBitPlanes","mmrInput","mg","ng","patternIndex","gridOffsetX","gridOffsetY","regionRow","patternRow","regionY","regionX","segmentHeader","readUint32","segmentType","pageAssociationFieldSize","referredFlags","referredToCount","retainBits","referredToSegmentNumberSize","referredTo","readUint16","genericRegionInfo","readRegionSegmentInformation","genericRegionSegmentFlags","genericRegionMmr","searchPatternLength","searchPattern","segments","readSegmentHeader","segment","header","height","RegionSegmentInformationFieldLength","dictionary","dictionaryFlags","atLength","readInt8","textRegion","textRegionSegmentFlags","textRegionHuffmanFlags","patternDictionary","patternDictionaryFlags","halftoneRegion","halftoneRegionFlags","genericRegion","pageInfo","resolutionX","resolutionY","pageSegmentFlags","callbackName","visitor","processSegment","readSegments","processSegments","bitPacked","imgData","mask","SimpleSegmentVisitor","onPageInformation","rowSize","drawBitmap","regionInfo","mask0","offset0","onImmediateGenericRegion","region","onImmediateLosslessGenericRegion","onSymbolDictionary","getSymbolDictionaryHuffmanTables","referredSegments","referredSymbols","decodeSymbolDictionary","onImmediateTextRegion","getTextRegionHuffmanTables","onImmediateLosslessTextRegion","onPatternDictionary","decodePatternDictionary","onImmediateHalftoneRegion","decodeHalftoneRegion","onImmediateLosslessHalftoneRegion","onTables","customTables","decodeTablesSegment","lineData","line","HuffmanTreeNode","buildTree","decodeNode","htOffset","lines","HuffmanTable","decode","assignPrefixCodes","linesLength","prefixLengthMax","histogram","currentLength","firstCode","currentCode","currentTemp","lowestValue","highestValue","prefixSizeBits","rangeSizeBits","currentRangeLow","prefixLength","rangeLength","standardTablesCache","Reader","readBit","numBits","byteAlign","runCodesTable","numberOfRepeats","repeatedLength","symbolIDTable","customIndex","tableFirstS","getCustomHuffmanTable","tableDeltaS","tableDeltaT","tableDeltaHeight","tableDeltaWidth","tableBitmapSize","tableAggregateInstances","eof","currentByte","endOfBlock","lookForEOFLimit","parseChunks","parseJbig2Chunks","parseJbig2","ArithmeticDecoder","QeTable","qe","nmps","nlps","switchFlag","byteIn","bp","cx_index","cx_mps","qeTableIcx","qeIcx","JpegStream","jpegOptions","decodeTransform","colorTransform","decodeArr","bitsPerComponent","decodeArrLength","transformNeeded","maxValue","jpegImage","forceRGB","isSourcePDF","JpegError","DNLMarkerError","EOIMarkerError","JpegImage","dctZigZag","dctCos1","dctSin1","dctCos3","dctSin3","dctCos6","dctSin6","dctSqrt2","dctSqrt1d2","children","parseDNLMarker","mcusPerLine","frame","progressive","startOffset","bitsData","bitsCount","nextByte","scanLines","receive","decodeHuffman","component","diff","receiveAndExtend","rs","z","eobrun","successiveACState","offsetZ","successiveACNextValue","mcuRow","mcu","mcuCol","blockRow","blockCol","getBlockBufferOffset","componentsLength","components","spectralStart","decodeFn","successivePrev","mcuExpected","mcuToRead","resetInterval","decodeBlock","decodeMcu","fileMarker","findNextFileMarker","marker","qt","blockData","p0","blockBufferOffset","p5","p6","p7","v0","v3","v4","v7","v5","v6","col","blocksPerLine","blocksPerColumn","computationBuffer","quantizeAndInverse","maxPos","newPos","currentPos","currentMarker","peekUint16","newMarker","dnlScanLines","endOffset","mcusPerColumn","blocksPerLineForMcu","blocksPerColumnForMcu","blocksBufferSize","jfif","adobe","numSOSMarkers","quantizationTables","huffmanTablesAC","huffmanTablesDC","appData","major","minor","densityUnits","xDensity","yDensity","thumbWidth","thumbHeight","thumbData","flags0","flags1","transformCode","quantizationTablesLength","quantizationTablesEnd","quantizationTableSpec","tableData","sofScanLines","componentsCount","maxH","maxV","componentId","qId","quantizationId","quantizationTable","prepareComponents","huffmanLength","huffmanTableSpec","codeLengthSum","huffmanValues","buildHuffmanTable","selectorsCount","componentIndex","tableSpec","spectralEnd","successiveApproximation","decodeScan","nextFileMarker","output","buildComponentData","scaleX","scaleY","_getLinearizedBlockData","numComponents","xScaleBlockOffset","mask3LSB","componentScaleX","componentScaleY","blocksPerScanline","_convertYccToRgb","Y","Cb","Cr","_convertYcckToRgb","_convertYcckToCmyk","_convertCmykToRgb","scale","getData","rgbData","grayColor","JpxStream","jpxImage","tileCount","tileComponents","tileWidth","tileHeight","tileLeft","tileTop","srcPosition","dataPosition","imgRowSize","tileRowSize","JpxError","JpxImage","SubbandsGainLog2","headerSize","lbox","tbox","jumpDataLength","colorspace","headerType","parseImageProperties","newByte","oldByte","Xsiz","Ysiz","XOsiz","YOsiz","Csiz","parseCodestream","doNotRecover","siz","precision","isSigned","XRsiz","YRsiz","calculateComponentDimensions","calculateTileGrids","qcd","sqcd","spqcdSize","scalarExpounded","spqcds","spqcd","qcc","cqcc","cod","scod","blockStyle","precinctsSizes","precinctsSize","PPx","PPy","unsupported","tile","initializeTile","buildPackets","parseTilePackets","transformComponents","tiles","numXtiles","numYtiles","tileComponent","codOrCoc","precinctWidth","dimensions","precinctHeight","isZeroRes","precinctWidthInSubband","precinctHeightInSubband","numprecinctswide","numprecinctshigh","numprecincts","xcb_","ycb_","codeblockWidth","codeblockHeight","cbx0","subband","cby0","cbx1","cby1","precinctParameters","codeblocks","precincts","codeblock","cbx","cby","tbx0","tby0","tbx1","tby1","pi","pj","precinctNumber","precinct","cbxMin","cbyMin","cbxMax","cbyMax","numcodeblockwide","numcodeblockhigh","precinctCodeblocks","subbands","tileIndex","layersCount","maxDecompositionLevelsCount","packet","createPacket","maxNumPrecinctsInLevel","maxNumPrecincts","resolutions","getPrecinctSizesInImageScale","precinctsIterationSizes","py","decompositionLevelsCount","sizeInImageScale","getPrecinctIndexIfExist","posX","pxIndex","precinctIterationSizes","posY","pyIndex","startPrecinctRowIndex","minWidth","minHeight","maxNumWide","maxNumHigh","sizePerComponent","sizePerResolution","minWidthCurrentComponent","minHeightCurrentComponent","maxNumWideCurrentComponent","maxNumHighCurrentComponent","widthCurrentResolution","heightCurrentResolution","blocksDimensions","getBlocksDimensions","buildPrecincts","buildCodeblocks","bscale","resolutionSubbands","progressionOrder","bufferSize","skipNextBit","skipBytes","sopMarkerUsed","ephMarkerUsed","packetsIterator","skipMarkerIfEqual","layerNumber","codeblockColumn","codeblockRow","codeblockIncluded","firstTimeInclusion","inclusionTree","zeroBitPlanesTree","valueReady","codingpasses","codingpassesLog2","codedDataLength","packetItem","x0","y0","right","bottom","blockWidth","blockHeight","bitModel","currentCodingpassType","totalLength","dataItem","encodedData","magnitude","bitsDecoded","magnitudeCorrection","reversible","interleave","levelOffset","nb","coefficients","mb","codingStyleParameters","quantizationParameters","guardBits","segmentationSymbolUsed","subbandCoefficients","mu","epsilon","gainLog2","delta","copyCoefficients","top","resultImages","transformedTiles","transformTile","tile0","fourComponents","y0items","y1items","y2items","y3items","component0","alpha01","y1","y2","qcdOrQcc","TagTree","levelsLength","level","currentLevel","incrementValue","nextLevel","InclusionTree","stopValue","propagateValues","levelIndex","currentValue","BitModel","UNIFORM_CONTEXT","RUNLENGTH_CONTEXT","LLAndLHContextsLabel","HLContextLabel","HHContextLabel","coefficientCount","zeroBitPlanes","setDecoder","setNeighborsSignificance","neighborsSignificance","column","runSignificancePropagationPass","coefficentsMagnitude","coefficentsSign","processingFlags","labels","processedInverseMask","processedMask","firstMagnitudeBitMask","i1","decision","decodeSignBit","significance1","sign1","sign0","contribution","horizontalContribution","decoded","runMagnitudeRefinementPass","width4","index0","indexNext","significance","runCleanupPass","oneRowDown","twoRowsDown","threeRowsDown","iNext","indexBase","checkAllEmpty","allEmpty","hasSignificantCoefficent","i2","checkSegmentationSymbol","Transform","ll","j1","j2","llWidth","llHeight","llItems","hl_lh_hh","bufferPadding","rowBuffer","numBuffers","colBuffers","currentBuffer","IrreversibleTransform","alpha","beta","gamma","K_","current","ReversibleTransform","ARCFourCipher","keyLength","encryptBlock","tmp2","h0","h1","h2","h3","paddedLength","padded","rotateArg","Word64","highInteger","lowInteger","and","word","xor","or","shiftRight","places","shiftLeft","rotateRight","high","low","not","add","lowAdd","highAdd","copyTo","calculateSHA256","rotr","h4","h5","h6","h7","littleSigmaPrime","littleSigma","t1","sigmaPrime","sigma","maj","calculateSHA512","mode384","tmp1","tmp3","calculateSHA384","NullCipher","decryptBlock","_expandKey","_decrypt","s0","s1","s3","_encrypt","_decryptBlock2","sourceLength","iv","plain","outputLength","lastBlock","psLen","cipher","rcon","t3","t4","PDF17","array1","array2","checkOwnerPassword","hashData","ownerValidationSalt","compareByteArrays","checkUserPassword","getOwnerKey","ownerKeySalt","getUserKey","PDF20","arrayLength","userBytes","k1","concatArrays","calculatePDF20Hash","CipherTransform","createStream","decryptString","CipherTransformFactory","defaultPasswordBytes","passwordLength","revision","pdfAlgorithm","hashDataSize","ownerPassword","keyLengthInBytes","encryptionKey","checkData","derivedKey","userPassword","identityName","algorithm","cfDict","streamCryptoName","handlerDict","encryptMetadata","fileIdBytes","utf8StringToString","passwordBytes","prepareKeyData","uBytes","userValidationSalt","userKeySalt","ownerEncryption","userEncryption","perms","createEncryptionKey20","decodedPassword","decodeUserPassword","cf","cryptFilter","cfm","buildObjectKey","createCipherTransform","buildCipherConstructor","cipherConstructor","COMPONENTS","xRatio","w1","yRatio","newIndex","xScaled","w1Scanline","oldIndex","getRgb","rgb","getRgbItem","getRgbBuffer","getOutputLength","isPassthrough","fillRgb","originalWidth","numComponentColors","needsResizing","originalHeight","allColors","bpc","colorMap","destPos","comps","rgbPos","resizeRgbImage","IR","whitePoint","blackPoint","matrix","basePatternCS","baseIndexedCS","hiVal","numComps","alt","tintFn","cs","colorSpaces","resCS","altIR","altCS","tmpBuf","baseNumComps","usesZeroToOneRange","baseBuf","scaled","tinted","inputLength","isDefaultDecode","outputDelta","lookupPos","destOffset","srcOffset","DeviceCmykCS","convertToRgb","CalGrayCS","AG","L","CalRGBCS","BRADFORD_SCALE_MATRIX","BRADFORD_SCALE_INVERSE_MATRIX","SRGB_D65_XYZ_TO_RGB_MATRIX","FLAT_WHITEPOINT_MATRIX","tempNormalizeMatrix","tempConvertMatrix1","tempConvertMatrix2","DECODE_L_CONSTANT","LMS","sourceWhitePoint","D65X","D65Y","D65Z","adjustToRange","decodeL","sourceBlackPoint","XYZ_Flat","zeroDecodeL","X_DST","X_SRC","Y_DST","Y_SRC","Z_DST","Z_SRC","X_Scale","X_Offset","Y_Scale","Y_Offset","Z_Scale","Z_Offset","XYZ_In","matrixProduct","LMS_Flat","convertToFlat","LMS_D65","convertToD65","AGR","BGG","CGB","X","Z","XYZ","normalizeWhitePointToFlat","XYZ_Black","compensateBlackPoint","XYZ_D65","normalizeWhitePointToD65","SRGB","sRGBTransferFunction","XW","YW","ZW","XB","YB","ZB","LabCS","low2","Ls","as","bs","maxVal","M","N","fn_g","parameters","fieldType","bounds","maxY","annotationFlags","borderStyle","hasAppearance","_hasFlag","_isViewable","_isPrintable","setFlags","hasFlag","setRectangle","setColor","setBorderStyle","dictType","setAppearance","appearanceStates","normalAppearanceState","_preparePopup","appearanceDict","bbox","getTransformMatrix","setWidth","setStyle","setDashArray","dashArray","isValid","allZeros","element","validNumber","setHorizontalCornerRadius","setVerticalCornerRadius","_constructFieldName","fieldName","loopDict","hasFieldFlag","alignment","maximumLength","renderForms","_processCheckBox","customAppearance","exportValueOptionsDict","exportValues","hasCorrectOptionCount","_processRadioButton","fieldParent","fieldParentValue","_processPushButton","option","isOptionArray","exportValue","displayValue","DEFAULT_ICON_SIZE","parentItem","parentSubtype","parentFlags","rawVertices","originalInkLists","file","QueueOptimizer","pattern","iFirstPIMXO","iFirstSave","argsArray","imageMask","fnArray","InitialState","addState","MIN_IMAGES_IN_INLINE_IMAGES_BLOCK","MAX_IMAGES_IN_INLINE_IMAGES_BLOCK","MAX_WIDTH","IMAGE_PADDING","curr","iFirstTransform","iFirstPIIXO","map","maxLineHeight","currentX","currentY","img","imgWidth","imgHeight","dataOffset","MIN_IMAGES_IN_MASKS_BLOCK","MAX_IMAGES_IN_MASKS_BLOCK","MAX_SAME_IMAGES_IN_MASKS_BLOCK","handlePaintSolidColorImageMask","isSameImage","firstPIMXOArg0","firstTransformArg0","firstTransformArg3","iTransform","iPIMXO","transformArgs","positions","images","maskParams","iFirstPIXO","firstPIXOArg0","MIN_IMAGES_IN_BLOCK","MAX_IMAGES_IN_BLOCK","iFirstSetFont","firstSetFontArg0","firstSetFontArg1","MIN_CHARS_IN_BLOCK","MAX_CHARS_IN_BLOCK","iFirstBeginText","iFirstSetTextMatrix","iFirstShowText","iFirstEndText","iFirst","iEndText","iCurr","_optimize","match","iterate","push","NullOptimizer","OperatorList","CHUNK_SIZE","CHUNK_SIZE_ABOUT","transfers","messageHandler","addOp","addDependency","addDependencies","addOpList","getIR","getTransfers","PartialEvaluator","DefaultPartialEvaluatorOptions","NativeImageDecoder","canDecode","image","colorSpace","TIME_SLOT_DURATION_MS","CHECK_TIME_EVERY","TimeSlotManager","deferred","TILING_PATTERN","SHADING_PATTERN","clone","newOptions","newEvaluator","hasBlendModes","nodes","graphicStates","graphicStatesKeys","graphicState","bm","xObjects","xObjectsKeys","xObject","xResources","buildFormXObject","xobj","group","groupOptions","isolated","knockout","groupSubtype","buildPaintImageXObject","isInline","forceDisableNativeImageDecoder","bitStrideLength","imgArray","imageIsFromDecodeStream","inverseDecode","imageCache","softMask","SMALL_IMAGE_DIMENSIONS","imageObj","nativeImageDecoder","PDFImage","nativeDecoder","handleSMask","smaskContent","smaskOptions","backdrop","transferObj","isPDFFunction","transferFn","transferMap","stateManager","handleTilingType","tilingOpList","resourcesArray","patternDict","patternResources","handleSetFont","fontArgs","fontName","translated","handleText","glyphs","isAddToPathSet","buildPath","path","glyph","accent","gStateObj","gStateKeys","gState","normalizeBlendMode","loadFont","fontRef","fontRes","fontCapability","preEvaluatedFont","fontRefIsRef","fontID","fontAliases","aliasFontRef","Font","translatedPromise","translatedFont","xrefFontStats","fontFile3","fontType","getFontType","lastIndex","opArgs","handleColorN","patternName","typeNum","shading","Pattern","initialState","xobjs","preprocessor","timeSlotManager","promiseBody","operation","fontSize","combinedGlyphs","arrLength","arrItem","shadingRes","patternIR","dictName","extGState","getTextContent","seenStyles","WhitespaceRegexp","textContent","styles","textContentItem","initialized","vertical","lastAdvanceWidth","lastAdvanceHeight","textAdvanceScale","spaceWidth","fakeSpaceMin","fakeMultiSpaceMin","fakeMultiSpaceMax","textRunBreakAllowed","SPACE_FACTOR","MULTI_SPACE_FACTOR","MULTI_SPACE_FACTOR_MAX","skipEmptyXObjs","textState","fontFamily","ascent","descent","tsm","glyphHeight","trm","scaleLineX","scaleCtmX","textChunk","bidiResult","bidi","replaceWhitespace","dir","glyphWidth","glyphUnicode","NormalizedUnicodes","reverseIfRtl","charSpacing","wordSpacing","addFakeSpaces","tx","ty","w0","fakeSpaces","runBidiTransform","fontNameArg","fontSizeArg","isSameTextLine","advance","buildTextContentItem","breakTextRun","currentState","xObjStateManager","sinkWrapper","enqueueInvoked","enqueue","gStateFont","extractDataStructures","toUnicode","baseDict","toUnicodePromise","properties","cidSystemInfo","registry","ordering","supplement","cidToGidMap","differences","baseEncodingName","encoding","diffEncoding","getEncoding","isSymbolicFont","FontFlags","isNonsymbolicFont","_buildSimpleFontToUnicode","glyphName","glyphsUnicodeMap","getUnicodeForGlyph","baseEncoding","buildToUnicode","ucs2CMapName","fetchBuiltInCMap","useCMap","cMap","cid","ucs2","ucs2CMap","readToUnicode","cmapObj","cmap","w2","readCidToGidMap","glyphsData","cidToGidStream","glyphID","extractWidths","glyphsWidths","defaultWidth","glyphsVMetrics","widths","vmetrics","defaultVMetrics","vmetric","firstChar","parseFloat","baseFontName","metrics","isMonospace","firstWidth","isSerifFont","fontNameWoStyle","getBaseFontMetrics","monospace","stdFontMap","lookupName","Metrics","glyphWidths","buildCharCodeToWidth","charCode","widthsByGlyphName","preEvaluateFont","composite","df","diffLength","diffBuf","diffEntry","uint8array","translateFont","maxCharIndex","lastChar","baseFont","fontNameStr","baseFontStr","fontFile","length1","length2","length3","loadedName","wideChars","fixedPitch","fontMatrix","xHeight","capHeight","italicAngle","isType3Font","cidEncoding","cMapPromise","TranslatedFont","send","fontData","loadType3Data","type3Options","evaluator","type3Evaluator","loadCharProcsPromise","charProcs","fontResources","charProcKeys","charProcOperatorList","glyphStream","parentOperatorList","StateManager","old","TextState","setTextLineMatrix","translateTextMatrix","translateTextLineMatrix","calcTextLineMatrixAdvance","txDiff","tyDiff","denominator","calcRenderMatrix","carriageReturn","EvalState","EvaluatorPreprocessor","getOPMap","numArgs","variableArgs","MAX_INVALID_PATH_OPS","cmd","opSpec","argsLength","nonProcessedArgs","partialMsg","preprocessCommand","BUILT_IN_CMAPS","builtInCMap","addCodespaceRange","mapCidRange","mapBfRange","dstLow","mapBfRangeToArray","mapOne","contains","charCodeOf","readCharCode","codespaceRanges","nn","codespaceRange","BinaryCMapReader","MAX_NUM_SIZE","MAX_ENCODED_NUM_SIZE","BinaryCMapStream","readByte","readNumber","readSigned","readHex","readHexNumber","sp","readHexSigned","readString","char","sequence","dataSize","ucs2DataSize","subitemsCount","addHex","hexToInt","incHex","hexToStr","extend","CMapFactory","expectString","strToInt","dst","expectInt","parseWMode","parseCMapName","previous","embeddedUseCMap","parseCodespaceRange","parseBfChar","parseCidChar","parseBfRange","parseCidRange","extendCMap","useCodespaceRanges","cMapData","compressionType","parseCMap","createBuiltInCMap","parsedCMap","PRIVATE_USE_AREAS","PDF_GLYPH_SPACE_UNITS","SEAC_ANALYSIS_ENABLED","FixedPitch","Serif","Symbolic","Script","Nonsymbolic","Italic","AllCap","SmallCap","ForceBold","MacStandardGlyphOrdering","builtInEncoding","Glyph","ToUnicodeMap","amend","IdentityToUnicodeMap","OpenTypeFileBuilder","maxPower2","searchRange","rangeShift","entrySize","OTF_HEADER_SIZE","OTF_TABLE_ENTRY_SIZE","toArray","sfnt","tables","tablesNames","numTables","tableOffsets","writeData","string32","writeInt16","searchParams","tableName","checksum","quad","writeInt32","addTable","getFontFileType","cff","adjustWidths","ID","isTrueTypeFile","isTrueTypeCollectionFile","fileType","isOpenTypeFile","isType1File","isCFFFile","fileSubtype","toFontChar","newMap","privateUseAreaIndex","nextAvailableFontCharCode","privateUseOffetEnd","originalCharCode","glyphId","charCodeToGlyphId","hasGlyph","fontCharCode","codeIndices","getRanges","string16","bmpLength","trailingRangesCount","segCount","startCount","endCount","idDeltas","idRangeOffsets","glyphsIds","bias","contiguous","startCode","format314","format31012","header31012","os2","selection","usWinAscent","override","unitsPerEm","yMax","yMin","ulUnicodeRange1","ulUnicodeRange2","ulUnicodeRange3","ulUnicodeRange4","firstCharIndex","lastCharIndex","getUnicodeRangeFor","typoAscent","typoDescent","winAscent","winDescent","angle","strings","stringsUnicode","strBufUnicode","platforms","encodings","languages","namesRecordCount","nameTable","strOffset","strs","nameRecord","mimetype","renderer","FontRendererFactory","exportData","fallbackToSystemFont","nonStdFontMap","isStandardFont","GlyphMapForStandardFonts","SupplementalGlyphMapForArialBlack","SupplementalGlyphMapForCalibri","isIdentityUnicode","buildToFontChar","unicodeCharCode","checkAndRepair","VALID_TABLES","readTableEntry","previousPosition","ttf","entrySelector","ttcTag","ttc","majorVersion","minorVersion","numFonts","offsetTable","readTrueTypeCollectionHeader","potentialHeader","readOpenTypeHeader","potentialTables","readTables","readNameTable","nameEntry","platformId","encodingId","mappings","hasShortCmap","canBreak","useTable","potentialTable","format","segIndex","offsetsCount","rangeOffset","offsetIndex","offsets","entryCount","numOfMetrics","numOfSidebearings","numGlyphs","numMissing","glyphProfile","sizeOfInstructions","sourceEnd","glyf","contoursCount","signedInt16","writeSignedInt16","flagsCount","endPoint","instructionsStart","instructionsLength","instructionsEnd","coordinatesLength","flag","xyLength","repeat","glyphDataLength","int32","indexToLocFormat","int16","numGlyphsPlusOne","locaLength","itemSize","itemDecode","itemEncode","numGlyphsOut","dupFirstEntry","locaData","loca","locaDataSize","oldGlyfData","oldGlyfDataLength","newGlyfData","writeOffset","missingGlyphs","sanitizeGlyph","maxSizeOfInstructions","simpleGlyph","firstEntryLength","post","valid","glyphNames","glyphNameIndexes","customNames","stringLength","FORMAT_0_HEADER_LENGTH","numRecords","stringsStart","records","NAME_RECORD_LENGTH","platform","language","nameIndex","TTOpsStackDeltas","lastEndf","lastDeff","callstack","functionsCalled","tooComplexToFollowFunctions","ttContext","inFDEF","ifLevel","inELSE","op","funcId","newStackLength","stackTop","stackDelta","foldTTTable","functionsDefined","functionsUsed","functionsStackDeltas","hintsValid","sanitizeTTProgram","checkInvalidFunctions","cvt","cvtData","ttcData","readTrueTypeCollectionData","isTrueType","isComposite","cffFile","maxFunctionDefs","maxZones","sanitizeTTPrograms","sanitizeMetrics","sanitizeHead","isGlyphLocationsLong","glyphsInfo","sanitizeGlyphLocations","metricsOverride","readPostScriptTable","createPostTable","isCidToGidMapEmpty","cmapTable","readCmapTable","cmapPlatformId","cmapEncodingId","cmapMappings","cmapMappingsLength","StandardEncoding","standardGlyphName","recoverGlyphName","unicodeOrCharCode","MacRomanEncoding","glyphZeroId","newMapping","adjustMapping","createCmapTable","validateOS2Table","createOS2Table","compiler","createNameTable","namePrototype","builder","convert","adjustToUnicode","charCodes","seacs","charset","seacMap","seac","baseGlyphName","accentGlyphName","baseGlyphId","accentGlyphId","accentOffset","getCharCodes","baseFontCharCode","createCharCode","accentFontCharCode","safeString16","charstrings","cffWidths","hmtx","charstring","possibleSpaceReplacements","charcode","charToGlyph","widthCode","isInFont","mapSpecialUnicodeValues","operatorListId","fontChar","charsToGlyphs","charsCache","charsCacheKey","chars","ErrorFont","Type1Font","streamBytesLength","streamBytes","EEXEC_SIGNATURE","streamStartPos","headerBytes","headerBytesLength","block","findBlock","suggestedLength","eexecBytes","PFB_HEADER_SIZE","headerBlockLength","eexecBlockLength","pfbHeader","pfbHeaderPresent","headerBlock","getHeaderBlock","headerBlockParser","eexecBlock","getEexecBlock","eexecBlockParser","type2Charstrings","subrs","getCharset","getGlyphMapping","type1FontGlyphMapping","hasGlyphId","getSeacs","getType2Charstrings","type1Charstrings","getType2Subrs","type1Subrs","type2Subrs","topDict","charsetArray","CFFStandardStrings","charStringsIndex","privateDict","field","subrIndex","CFFFont","charsets","MAX_SUBR_NESTING","CFFParser","CharstringValidationData","stackClearing","stem","resetStack","undefStack","CharstringValidationData12","stackFn","topDictIndex","stringIndex","globalSubrIndex","topDictParsed","charStringOffset","charStringIndex","fontBBox","fdArrayIndex","dictRaw","fontDict","charStringsAndSeacs","charStrings","localSubrIndex","fdSelect","fdArray","parseHeader","hdrSize","offSize","parseDict","operands","parseIndex","cffIndex","offsetSize","offsetStart","offsetEnd","parseNameIndex","parseStringIndex","cffDict","parseCharString","stackSize","validationCommand","subrsIndex","subrNumber","parseCharStrings","callDepth","firstStackClearing","localSubrToUse","privateDictToUse","fdIndex","nominalWidth","emptyPrivateDictionary","parentDict","parsePrivateDict","privateOffset","privateDictEnd","dictData","subrsOffset","relativeOffset","parseCharsets","CFFCharsetPredefinedTypes","raw","parseEncoding","predefined","supplementsCount","sid","dataStart","glyphsCount","rangesCount","gid","dataEnd","parseFDSelect","CFF","duplicateFirstGlyph","glyphZero","CFFHeader","CFFStrings","CFFIndex","CFFDict","setByKey","valueLength","setByName","hasName","getByName","removeByName","keyToNameMap","nameToKeyMap","defaults","types","opcodes","order","layout","CFFTopDict","CFFPrivateDict","ISO_ADOBE","EXPERT","EXPERT_SUBSET","CFFCharset","CFFEncoding","CFFFDSelect","getFDIndex","glyphIndex","CFFOffsetTracker","isTracking","track","setEntryLocation","offset1","offset2","offset3","offset4","CFFCompiler","compile","subDict","compiled","topDictTracker","fontDictTrackers","encodeNumber","encodeFloat","nibbles","encodeInteger","compileHeader","compileNameIndex","sanitizedName","compileTopDicts","dicts","fontDictTracker","fontDictData","trackers","compilePrivateDicts","privateDictTracker","privateDictData","compileDict","offsetTracker","compileStringIndex","compileGlobalSubrIndex","compileCharStrings","compileCharset","compileEncoding","compileFDSelect","lastFD","currentFD","numRanges","compileTypedArray","compileIndex","objects","lastOffset","ISOAdobeCharset","ExpertCharset","ExpertSubsetCharset","ExpertEncoding","MacExpertEncoding","WinAnsiEncoding","SymbolSetEncoding","ZapfDingbatsEncoding","getLookupTableFactory","getGlyphsUnicode","getDingbatsGlyphsUnicode","getStdFontMap","getNonStdFontMap","getSerifFonts","getSymbolsFonts","getGlyphMapForStandardFonts","getSupplementalGlyphMapForArialBlack","getSupplementalGlyphMapForCalibri","getSpecialPUASymbols","undefined","nameLen","hexStr","substring","toUpperCase","UnicodeRanges","isRTLRangeFor","getNormalizedUnicodes","charsLength","charCodeAt","getUshort","getLong","idOffset","groups","idDelta","gsubrs","isCFFCIDFont","cmds","numberOfContours","arg1","arg2","scale01","scale10","subglyph","compileGlyf","endPtsOfContours","instructionLength","numberOfPoints","points","startPoint","contour","quadraticCurveTo","stems","stackClean","xa","ya","xb","yb","bezierCurveTo","subrCode","numSubrs","y3","achar","bchar","lookupCmap","compileCharString","NOOP","getPathJs","compileGlyph","hasBuiltPath","compileGlyphImpl","cffInfo","glyphNameMap","parseCmap","parseCff","parseGlyfTable","HINTING_ENABLED","Type1CharString","COMMAND_MAP","encoded","dy","wx","sbx","sby","num2","num1","flexArgs","executeCommand","stackLength","howManyArgs","Type1Parser","EEXEC_ENCRYPT_KEY","CHAR_STRS_ENCRYPT_KEY","discardNumber","c1","c2","decrypted","digit1","isHexDigit","digit2","isBinary","decryptAscii","readNumberArray","readInt","readBoolean","getToken","isSpecial","readCharStrings","lenIV","extractFontProgram","privateData","program","blueArray","charString","lsb","extractFontHeader","encodingArg","ShadingType","FUNCTION_BASED","AXIAL","RADIAL","FREE_FORM_MESH","LATTICE_FORM_MESH","COONS_PATCH_MESH","TENSOR_PATCH_MESH","getPattern","Shadings","t0","domainArr","extendStart","extendEnd","extendArr","x1","r1","r2","distance","fnObj","colorStops","ratio","cssColor","background","RadialAxial","coordsArr","shadingType","r0","csNumComps","MeshStreamReader","align","readFlag","readCoordinate","bitsPerCoordinate","xi","yi","readComponents","ci","coords","mesh","operators","ps","verticesLeft","coord","MIN_SPLIT_PATCH_CHUNKS_AMOUNT","MAX_SPLIT_PATCH_CHUNKS_AMOUNT","TRIANGLE_DENSITY","getB","lut","t_","buildB","figure","figureMinX","figureMinY","figureMaxX","figureMaxY","splitXBy","splitYBy","verticesPerRow","figureCoords","figureColors","cl","cr","c0","c3","bRow","bCol","newColor","tmp4","coordsPacked","xy","colorsPacked","figures","decodeContext","bitsPerFlag","colorFn","patchMesh","decodeType4Shading","decodeType5Shading","decodeType6Shading","decodeType7Shading","updateBounds","buildFigureFromPatch","packData","Mesh","Dummy","xstep","ystep","paintType","tilingType","baseTypes","arabicTypes","isLTR","strLength","createBidiText","numBidi","charType","startLevel","levels","isOdd","sor","eor","lastType","findUnequal","before","after","setValues","isEven","highestLevel","lowestOddLevel","reverseValues","getMetrics","IsEvalSupportedCached","createFromArray","PDFFunction","CONSTRUCT_SAMPLED","CONSTRUCT_INTERPOLATED","CONSTRUCT_STICHED","CONSTRUCT_POSTSCRIPT","getSampleArray","sampleMul","strBytes","strIdx","typeFn","fromIR","parseArray","constructSampled","toNumberArray","inputSize","outputSize","toMultiArray","bps","encode","samples","constructSampledFromIR","ymin","cubeVertices","cubeN","cubeVertex","domain_2i","domain_2i_1","interpolate","size_i","e0","n0","n1","rj","constructInterpolated","constructInterpolatedFromIR","constructStiched","fnRefs","fns","constructStichedFromIR","dmin","dmax","rmin","rmax","constructPostScript","constructPostScriptFromIR","numOutputs","numInputs","MAX_CACHE_SIZE","cache_available","cachedValue","stackIndex","bound","fnDict","PostScriptStack","MAX_STACK_SIZE","pop","copy","roll","PostScriptEvaluator","execute","operator","PostScriptCompiler","AstNode","AstArgument","AstLiteral","AstBinaryOperation","AstMin","AstVariable","AstVariableDefinition","ExpressionBuilderVisitor","visitArgument","visitVariable","variable","visitLiteral","literal","visitBinaryOperation","visitVariableDefinition","definition","visitMin","instructions","lastRegister","buildAddOperation","buildMulOperation","buildSubOperation","ast1","ast2","tmpVar","buildMinOperation","statementBuilder","instruction","expr","PostScriptParser","nextToken","accept","expect","PostScriptTokenTypes","parseBlock","parseCondition","conditionLocation","jumpLocation","endOfTrue","LBRACE","RBRACE","NUMBER","OPERATOR","IF","IFELSE","PostScriptToken","opCache","opValue","PostScriptLexer","MurmurHash3_64","MASK_HIGH","MASK_LOW","SEED","seed","update","blockCounts","tailLength","dataUint32","k2","C1","C2","C1_LOW","C2_LOW","hexdigest","addend","isMask","maskDict","imagePromise","handleImageData","smaskPromise","maskPromise","computedLength","haveFullData","decodeBuffer","decodeAddends","decodeCoefficients","decodeAndClamp","getComponents","bufferPos","rowComps","loop1End","loop2End","buf","remainingBits","fillOpacity","sw","sh","alphaBuf","resizeImageMask","opacity","imageOffset","maskOffset","rgbaBuf","undoPreblend","matte","matteRgb","matteR","matteG","matteB","createImageData","forceRGBA","drawWidth","drawHeight","newArray","imageLength","actualHeight","maybeUndoPreblend","fillGrayBuffer","getImageBytes","thisArg","callbacksCapabilities","ah","callbackId","wrapReason","sourceName","targetName","comObj","isReply","makeReasonSerializable","MessageHandler","on","sendWithPromise","sendWithStream","streamId","startCapability","startCall","isClosed","pullCapability","cancelCapability","_createStreamSink","sendStreamRequest","streamSink","lastDesiredSize","close","sinkCapability","onPull","onCancel","isCancelled","resolveCall","success","_processStreamMessage","sendStreamResponse","deleteStreamController","resolveOrReject","postMessage","destroy"],"mappings":"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","file":"pdf.worker.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"pdfjs-dist/build/pdf.worker\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"pdfjs-dist/build/pdf.worker\"] = factory();\n\telse\n\t\troot[\"pdfjs-dist/build/pdf.worker\"] = factory();\n})(this, function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __w_pdfjs_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __w_pdfjs_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__w_pdfjs_require__.m = modules;\n\n \t// expose the module cache\n \t__w_pdfjs_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__w_pdfjs_require__.d = function(exports, name, getter) {\n \t\tif(!__w_pdfjs_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__w_pdfjs_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__w_pdfjs_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __w_pdfjs_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__w_pdfjs_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __w_pdfjs_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__w_pdfjs_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__w_pdfjs_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__w_pdfjs_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__w_pdfjs_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __w_pdfjs_require__(__w_pdfjs_require__.s = 0);\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* eslint-disable no-unused-vars */\n\n'use strict';\n\nvar pdfjsVersion = PDFJSDev.eval('BUNDLE_VERSION');\nvar pdfjsBuild = PDFJSDev.eval('BUNDLE_BUILD');\n\nvar pdfjsCoreWorker = require('./core/worker.js');\n\nexports.WorkerMessageHandler = pdfjsCoreWorker.WorkerMessageHandler;\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  arrayByteLength, arraysToBytes, assert, createPromiseCapability, info,\n  InvalidPDFException, MissingPDFException, PasswordException,\n  setVerbosityLevel, UnexpectedResponseException, UnknownErrorException,\n  UNSUPPORTED_FEATURES, warn, XRefParseException\n} from '../shared/util';\nimport { LocalPdfManager, NetworkPdfManager } from './pdf_manager';\nimport isNodeJS from '../shared/is_node';\nimport { MessageHandler } from '../shared/message_handler';\nimport { Ref } from './primitives';\n\nvar WorkerTask = (function WorkerTaskClosure() {\n  function WorkerTask(name) {\n    this.name = name;\n    this.terminated = false;\n    this._capability = createPromiseCapability();\n  }\n\n  WorkerTask.prototype = {\n    get finished() {\n      return this._capability.promise;\n    },\n\n    finish() {\n      this._capability.resolve();\n    },\n\n    terminate() {\n      this.terminated = true;\n    },\n\n    ensureNotTerminated() {\n      if (this.terminated) {\n        throw new Error('Worker task was terminated');\n      }\n    },\n  };\n\n  return WorkerTask;\n})();\n\nif (typeof PDFJSDev === 'undefined' || !PDFJSDev.test('PRODUCTION')) {\n/**\n * Interface that represents PDF data transport. If possible, it allows\n * progressively load entire or fragment of the PDF binary data.\n *\n * @interface\n */\nfunction IPDFStream() {} // eslint-disable-line no-inner-declarations\nIPDFStream.prototype = {\n  /**\n   * Gets a reader for the entire PDF data.\n   * @returns {IPDFStreamReader}\n   */\n  getFullReader() {\n    return null;\n  },\n\n  /**\n   * Gets a reader for the range of the PDF data.\n   * @param {number} begin - the start offset of the data.\n   * @param {number} end - the end offset of the data.\n   * @returns {IPDFStreamRangeReader}\n   */\n  getRangeReader(begin, end) {\n    return null;\n  },\n\n  /**\n   * Cancels all opened reader and closes all their opened requests.\n   * @param {Object} reason - the reason for cancelling\n   */\n  cancelAllRequests(reason) {},\n};\n\n/**\n * Interface for a PDF binary data reader.\n *\n * @interface\n */\nfunction IPDFStreamReader() {} // eslint-disable-line no-inner-declarations\nIPDFStreamReader.prototype = {\n  /**\n   * Gets a promise that is resolved when the headers and other metadata of\n   * the PDF data stream are available.\n   * @returns {Promise}\n   */\n  get headersReady() {\n    return null;\n  },\n\n  /**\n   * Gets the Content-Disposition filename. It is defined after the headersReady\n   * promise is resolved.\n   * @returns {string|null} The filename, or `null` if the Content-Disposition\n   *                        header is missing/invalid.\n   */\n  get filename() {\n    return null;\n  },\n\n  /**\n   * Gets PDF binary data length. It is defined after the headersReady promise\n   * is resolved.\n   * @returns {number} The data length (or 0 if unknown).\n   */\n  get contentLength() {\n    return 0;\n  },\n\n  /**\n   * Gets ability of the stream to handle range requests. It is defined after\n   * the headersReady promise is resolved. Rejected when the reader is cancelled\n   * or an error occurs.\n   * @returns {boolean}\n   */\n  get isRangeSupported() {\n    return false;\n  },\n\n  /**\n   * Gets ability of the stream to progressively load binary data. It is defined\n   * after the headersReady promise is resolved.\n   * @returns {boolean}\n   */\n  get isStreamingSupported() {\n    return false;\n  },\n\n  /**\n   * Requests a chunk of the binary data. The method returns the promise, which\n   * is resolved into object with properties \"value\" and \"done\". If the done\n   * is set to true, then the stream has reached its end, otherwise the value\n   * contains binary data. Cancelled requests will be resolved with the done is\n   * set to true.\n   * @returns {Promise}\n   */\n  read() {},\n\n  /**\n   * Cancels all pending read requests and closes the stream.\n   * @param {Object} reason\n   */\n  cancel(reason) {},\n\n  /**\n   * Sets or gets the progress callback. The callback can be useful when the\n   * isStreamingSupported property of the object is defined as false.\n   * The callback is called with one parameter: an object with the loaded and\n   * total properties.\n   */\n  onProgress: null,\n};\n\n/**\n * Interface for a PDF binary data fragment reader.\n *\n * @interface\n */\nfunction IPDFStreamRangeReader() {} // eslint-disable-line no-inner-declarations\nIPDFStreamRangeReader.prototype = {\n  /**\n   * Gets ability of the stream to progressively load binary data.\n   * @returns {boolean}\n   */\n  get isStreamingSupported() {\n    return false;\n  },\n\n  /**\n   * Requests a chunk of the binary data. The method returns the promise, which\n   * is resolved into object with properties \"value\" and \"done\". If the done\n   * is set to true, then the stream has reached its end, otherwise the value\n   * contains binary data. Cancelled requests will be resolved with the done is\n   * set to true.\n   * @returns {Promise}\n   */\n  read() {},\n\n  /**\n   * Cancels all pending read requests and closes the stream.\n   * @param {Object} reason\n   */\n  cancel(reason) {},\n\n  /**\n   * Sets or gets the progress callback. The callback can be useful when the\n   * isStreamingSupported property of the object is defined as false.\n   * The callback is called with one parameter: an object with the loaded\n   * property.\n   */\n  onProgress: null,\n};\n}\n\n/** @implements {IPDFStream} */\nvar PDFWorkerStream = (function PDFWorkerStreamClosure() {\n  function PDFWorkerStream(msgHandler) {\n    this._msgHandler = msgHandler;\n    this._contentLength = null;\n    this._fullRequestReader = null;\n    this._rangeRequestReaders = [];\n  }\n  PDFWorkerStream.prototype = {\n    getFullReader() {\n      assert(!this._fullRequestReader);\n      this._fullRequestReader = new PDFWorkerStreamReader(this._msgHandler);\n      return this._fullRequestReader;\n    },\n\n    getRangeReader(begin, end) {\n      let reader = new PDFWorkerStreamRangeReader(begin, end, this._msgHandler);\n      this._rangeRequestReaders.push(reader);\n      return reader;\n    },\n\n    cancelAllRequests(reason) {\n      if (this._fullRequestReader) {\n        this._fullRequestReader.cancel(reason);\n      }\n      let readers = this._rangeRequestReaders.slice(0);\n      readers.forEach(function (reader) {\n        reader.cancel(reason);\n      });\n    },\n  };\n\n  /** @implements {IPDFStreamReader} */\n  function PDFWorkerStreamReader(msgHandler) {\n    this._msgHandler = msgHandler;\n\n    this._contentLength = null;\n    this._isRangeSupported = false;\n    this._isStreamingSupported = false;\n\n    let readableStream = this._msgHandler.sendWithStream('GetReader');\n\n    this._reader = readableStream.getReader();\n\n    this._headersReady = this._msgHandler.sendWithPromise('ReaderHeadersReady').\n        then((data) => {\n      this._isStreamingSupported = data.isStreamingSupported;\n      this._isRangeSupported = data.isRangeSupported;\n      this._contentLength = data.contentLength;\n    });\n  }\n  PDFWorkerStreamReader.prototype = {\n    get headersReady() {\n      return this._headersReady;\n    },\n\n    get contentLength() {\n      return this._contentLength;\n    },\n\n    get isStreamingSupported() {\n      return this._isStreamingSupported;\n    },\n\n    get isRangeSupported() {\n      return this._isRangeSupported;\n    },\n\n    read() {\n      return this._reader.read().then(function({ value, done, }) {\n        if (done) {\n          return { value: undefined, done: true, };\n        }\n        // `value` is wrapped into Uint8Array, we need to\n        // unwrap it to ArrayBuffer for further processing.\n        return { value: value.buffer, done: false, };\n      });\n    },\n\n    cancel(reason) {\n      this._reader.cancel(reason);\n    },\n  };\n\n  /** @implements {IPDFStreamRangeReader} */\n  function PDFWorkerStreamRangeReader(begin, end, msgHandler) {\n    this._msgHandler = msgHandler;\n    this.onProgress = null;\n\n    let readableStream = this._msgHandler.sendWithStream('GetRangeReader',\n                                                         { begin, end, });\n\n    this._reader = readableStream.getReader();\n  }\n  PDFWorkerStreamRangeReader.prototype = {\n    get isStreamingSupported() {\n      return false;\n    },\n\n    read() {\n      return this._reader.read().then(function({ value, done, }) {\n        if (done) {\n          return { value: undefined, done: true, };\n        }\n        return { value: value.buffer, done: false, };\n      });\n    },\n\n    cancel(reason) {\n      this._reader.cancel(reason);\n    },\n  };\n\n  return PDFWorkerStream;\n})();\n\nvar WorkerMessageHandler = {\n  setup(handler, port) {\n    var testMessageProcessed = false;\n    handler.on('test', function wphSetupTest(data) {\n      if (testMessageProcessed) {\n        return; // we already processed 'test' message once\n      }\n      testMessageProcessed = true;\n\n      // check if Uint8Array can be sent to worker\n      if (!(data instanceof Uint8Array)) {\n        handler.send('test', false);\n        return;\n      }\n      // making sure postMessage transfers are working\n      var supportTransfers = data[0] === 255;\n      handler.postMessageTransfers = supportTransfers;\n      // check if the response property is supported by xhr\n      var xhr = new XMLHttpRequest();\n      var responseExists = 'response' in xhr;\n      // check if the property is actually implemented\n      try {\n        xhr.responseType; // eslint-disable-line no-unused-expressions\n      } catch (e) {\n        responseExists = false;\n      }\n      if (!responseExists) {\n        handler.send('test', false);\n        return;\n      }\n      handler.send('test', {\n        supportTypedArray: true,\n        supportTransfers,\n      });\n    });\n\n    handler.on('configure', function wphConfigure(data) {\n      setVerbosityLevel(data.verbosity);\n    });\n\n    handler.on('GetDocRequest', function wphSetupDoc(data) {\n      return WorkerMessageHandler.createDocumentHandler(data, port);\n    });\n  },\n  createDocumentHandler(docParams, port) {\n    // This context is actually holds references on pdfManager and handler,\n    // until the latter is destroyed.\n    var pdfManager;\n    var terminated = false;\n    var cancelXHRs = null;\n    var WorkerTasks = [];\n\n    let apiVersion = docParams.apiVersion;\n    let workerVersion =\n      typeof PDFJSDev !== 'undefined' ? PDFJSDev.eval('BUNDLE_VERSION') : null;\n    if ((typeof PDFJSDev !== 'undefined' && PDFJSDev.test('TESTING')) &&\n        apiVersion === null) {\n      warn('Ignoring apiVersion/workerVersion check in TESTING builds.');\n    } else if (apiVersion !== workerVersion) {\n      throw new Error(`The API version \"${apiVersion}\" does not match ` +\n                      `the Worker version \"${workerVersion}\".`);\n    }\n\n    var docId = docParams.docId;\n    var docBaseUrl = docParams.docBaseUrl;\n    var workerHandlerName = docParams.docId + '_worker';\n    var handler = new MessageHandler(workerHandlerName, docId, port);\n\n    // Ensure that postMessage transfers are always correctly enabled/disabled,\n    // to prevent \"DataCloneError\" in browsers without transfers support.\n    handler.postMessageTransfers = docParams.postMessageTransfers;\n\n    function ensureNotTerminated() {\n      if (terminated) {\n        throw new Error('Worker was terminated');\n      }\n    }\n\n    function startWorkerTask(task) {\n      WorkerTasks.push(task);\n    }\n\n    function finishWorkerTask(task) {\n      task.finish();\n      var i = WorkerTasks.indexOf(task);\n      WorkerTasks.splice(i, 1);\n    }\n\n    function loadDocument(recoveryMode) {\n      var loadDocumentCapability = createPromiseCapability();\n\n      var parseSuccess = function parseSuccess() {\n        Promise.all([\n          pdfManager.ensureDoc('numPages'),\n          pdfManager.ensureDoc('fingerprint'),\n        ]).then(function([numPages, fingerprint]) {\n          loadDocumentCapability.resolve({\n            numPages,\n            fingerprint,\n          });\n        }, parseFailure);\n      };\n\n      var parseFailure = function parseFailure(e) {\n        loadDocumentCapability.reject(e);\n      };\n\n      pdfManager.ensureDoc('checkHeader', []).then(function() {\n        pdfManager.ensureDoc('parseStartXRef', []).then(function() {\n          pdfManager.ensureDoc('parse', [recoveryMode]).then(\n            parseSuccess, parseFailure);\n        }, parseFailure);\n      }, parseFailure);\n\n      return loadDocumentCapability.promise;\n    }\n\n    function getPdfManager(data, evaluatorOptions) {\n      var pdfManagerCapability = createPromiseCapability();\n      var pdfManager;\n\n      var source = data.source;\n      if (source.data) {\n        try {\n          pdfManager = new LocalPdfManager(docId, source.data, source.password,\n                                           evaluatorOptions, docBaseUrl);\n          pdfManagerCapability.resolve(pdfManager);\n        } catch (ex) {\n          pdfManagerCapability.reject(ex);\n        }\n        return pdfManagerCapability.promise;\n      }\n\n      var pdfStream, cachedChunks = [];\n      try {\n        pdfStream = new PDFWorkerStream(handler);\n      } catch (ex) {\n        pdfManagerCapability.reject(ex);\n        return pdfManagerCapability.promise;\n      }\n\n      var fullRequest = pdfStream.getFullReader();\n      fullRequest.headersReady.then(function () {\n        if (!fullRequest.isRangeSupported) {\n          return;\n        }\n\n        // We don't need auto-fetch when streaming is enabled.\n        var disableAutoFetch = source.disableAutoFetch ||\n                               fullRequest.isStreamingSupported;\n        pdfManager = new NetworkPdfManager(docId, pdfStream, {\n          msgHandler: handler,\n          url: source.url,\n          password: source.password,\n          length: fullRequest.contentLength,\n          disableAutoFetch,\n          rangeChunkSize: source.rangeChunkSize,\n        }, evaluatorOptions, docBaseUrl);\n        // There may be a chance that `pdfManager` is not initialized\n        // for first few runs of `readchunk` block of code. Be sure\n        // to send all cached chunks, if any, to chunked_stream via\n        // pdf_manager.\n        for (let i = 0; i < cachedChunks.length; i++) {\n          pdfManager.sendProgressiveData(cachedChunks[i]);\n        }\n\n        cachedChunks = [];\n        pdfManagerCapability.resolve(pdfManager);\n        cancelXHRs = null;\n      }).catch(function (reason) {\n        pdfManagerCapability.reject(reason);\n        cancelXHRs = null;\n      });\n\n      var loaded = 0;\n      var flushChunks = function () {\n        var pdfFile = arraysToBytes(cachedChunks);\n        if (source.length && pdfFile.length !== source.length) {\n          warn('reported HTTP length is different from actual');\n        }\n        // the data is array, instantiating directly from it\n        try {\n          pdfManager = new LocalPdfManager(docId, pdfFile, source.password,\n                                           evaluatorOptions, docBaseUrl);\n          pdfManagerCapability.resolve(pdfManager);\n        } catch (ex) {\n          pdfManagerCapability.reject(ex);\n        }\n        cachedChunks = [];\n      };\n      var readPromise = new Promise(function (resolve, reject) {\n        var readChunk = function (chunk) {\n          try {\n            ensureNotTerminated();\n            if (chunk.done) {\n              if (!pdfManager) {\n                flushChunks();\n              }\n              cancelXHRs = null;\n              return;\n            }\n\n            var data = chunk.value;\n            loaded += arrayByteLength(data);\n            if (!fullRequest.isStreamingSupported) {\n              handler.send('DocProgress', {\n                loaded,\n                total: Math.max(loaded, fullRequest.contentLength || 0),\n              });\n            }\n\n            if (pdfManager) {\n              pdfManager.sendProgressiveData(data);\n            } else {\n              cachedChunks.push(data);\n            }\n\n            fullRequest.read().then(readChunk, reject);\n          } catch (e) {\n            reject(e);\n          }\n        };\n        fullRequest.read().then(readChunk, reject);\n      });\n      readPromise.catch(function (e) {\n        pdfManagerCapability.reject(e);\n        cancelXHRs = null;\n      });\n\n      cancelXHRs = function () {\n        pdfStream.cancelAllRequests('abort');\n      };\n\n      return pdfManagerCapability.promise;\n    }\n\n    function setupDoc(data) {\n      function onSuccess(doc) {\n        ensureNotTerminated();\n        handler.send('GetDoc', { pdfInfo: doc, });\n      }\n\n      function onFailure(e) {\n        ensureNotTerminated();\n\n        if (e instanceof PasswordException) {\n          var task = new WorkerTask('PasswordException: response ' + e.code);\n          startWorkerTask(task);\n\n          handler.sendWithPromise('PasswordRequest', e).then(function (data) {\n            finishWorkerTask(task);\n            pdfManager.updatePassword(data.password);\n            pdfManagerReady();\n          }).catch(function (boundException) {\n            finishWorkerTask(task);\n            handler.send('PasswordException', boundException);\n          }.bind(null, e));\n        } else if (e instanceof InvalidPDFException) {\n          handler.send('InvalidPDF', e);\n        } else if (e instanceof MissingPDFException) {\n          handler.send('MissingPDF', e);\n        } else if (e instanceof UnexpectedResponseException) {\n          handler.send('UnexpectedResponse', e);\n        } else {\n          handler.send('UnknownError',\n                       new UnknownErrorException(e.message, e.toString()));\n        }\n      }\n\n      function pdfManagerReady() {\n        ensureNotTerminated();\n\n        loadDocument(false).then(onSuccess, function loadFailure(ex) {\n          ensureNotTerminated();\n\n          // Try again with recoveryMode == true\n          if (!(ex instanceof XRefParseException)) {\n            onFailure(ex);\n            return;\n          }\n          pdfManager.requestLoadedStream();\n          pdfManager.onLoadedStream().then(function() {\n            ensureNotTerminated();\n\n            loadDocument(true).then(onSuccess, onFailure);\n          });\n        }, onFailure);\n      }\n\n      ensureNotTerminated();\n\n      var evaluatorOptions = {\n        forceDataSchema: data.disableCreateObjectURL,\n        maxImageSize: data.maxImageSize,\n        disableFontFace: data.disableFontFace,\n        nativeImageDecoderSupport: data.nativeImageDecoderSupport,\n        ignoreErrors: data.ignoreErrors,\n        isEvalSupported: data.isEvalSupported,\n      };\n\n      getPdfManager(data, evaluatorOptions).then(function (newPdfManager) {\n        if (terminated) {\n          // We were in a process of setting up the manager, but it got\n          // terminated in the middle.\n          newPdfManager.terminate();\n          throw new Error('Worker was terminated');\n        }\n        pdfManager = newPdfManager;\n\n        pdfManager.onLoadedStream().then(function(stream) {\n          handler.send('DataLoaded', { length: stream.bytes.byteLength, });\n        });\n      }).then(pdfManagerReady, onFailure);\n    }\n\n    handler.on('GetPage', function wphSetupGetPage(data) {\n      return pdfManager.getPage(data.pageIndex).then(function(page) {\n        return Promise.all([\n          pdfManager.ensure(page, 'rotate'),\n          pdfManager.ensure(page, 'ref'),\n          pdfManager.ensure(page, 'userUnit'),\n          pdfManager.ensure(page, 'view'),\n        ]).then(function([rotate, ref, userUnit, view]) {\n          return {\n            rotate,\n            ref,\n            userUnit,\n            view,\n          };\n        });\n      });\n    });\n\n    handler.on('GetPageIndex', function wphSetupGetPageIndex(data) {\n      var ref = new Ref(data.ref.num, data.ref.gen);\n      var catalog = pdfManager.pdfDocument.catalog;\n      return catalog.getPageIndex(ref);\n    });\n\n    handler.on('GetDestinations',\n      function wphSetupGetDestinations(data) {\n        return pdfManager.ensureCatalog('destinations');\n      }\n    );\n\n    handler.on('GetDestination',\n      function wphSetupGetDestination(data) {\n        return pdfManager.ensureCatalog('getDestination', [data.id]);\n      }\n    );\n\n    handler.on('GetPageLabels',\n      function wphSetupGetPageLabels(data) {\n        return pdfManager.ensureCatalog('pageLabels');\n      }\n    );\n\n    handler.on('GetPageMode', function wphSetupGetPageMode(data) {\n      return pdfManager.ensureCatalog('pageMode');\n    });\n\n    handler.on('GetAttachments',\n      function wphSetupGetAttachments(data) {\n        return pdfManager.ensureCatalog('attachments');\n      }\n    );\n\n    handler.on('GetJavaScript',\n      function wphSetupGetJavaScript(data) {\n        return pdfManager.ensureCatalog('javaScript');\n      }\n    );\n\n    handler.on('GetOutline',\n      function wphSetupGetOutline(data) {\n        return pdfManager.ensureCatalog('documentOutline');\n      }\n    );\n\n    handler.on('GetPermissions', function(data) {\n      return pdfManager.ensureCatalog('permissions');\n    });\n\n    handler.on('GetMetadata',\n      function wphSetupGetMetadata(data) {\n        return Promise.all([pdfManager.ensureDoc('documentInfo'),\n                            pdfManager.ensureCatalog('metadata')]);\n      }\n    );\n\n    handler.on('GetData', function wphSetupGetData(data) {\n      pdfManager.requestLoadedStream();\n      return pdfManager.onLoadedStream().then(function(stream) {\n        return stream.bytes;\n      });\n    });\n\n    handler.on('GetStats',\n      function wphSetupGetStats(data) {\n        return pdfManager.pdfDocument.xref.stats;\n      }\n    );\n\n    handler.on('GetAnnotations', function({ pageIndex, intent, }) {\n      return pdfManager.getPage(pageIndex).then(function(page) {\n        return page.getAnnotationsData(intent);\n      });\n    });\n\n    handler.on('RenderPageRequest', function wphSetupRenderPage(data) {\n      var pageIndex = data.pageIndex;\n      pdfManager.getPage(pageIndex).then(function(page) {\n        var task = new WorkerTask('RenderPageRequest: page ' + pageIndex);\n        startWorkerTask(task);\n\n        var pageNum = pageIndex + 1;\n        var start = Date.now();\n        // Pre compile the pdf page and fetch the fonts/images.\n        page.getOperatorList({\n          handler,\n          task,\n          intent: data.intent,\n          renderInteractiveForms: data.renderInteractiveForms,\n        }).then(function(operatorList) {\n          finishWorkerTask(task);\n\n          info('page=' + pageNum + ' - getOperatorList: time=' +\n               (Date.now() - start) + 'ms, len=' + operatorList.totalLength);\n        }, function(e) {\n          finishWorkerTask(task);\n          if (task.terminated) {\n            return; // ignoring errors from the terminated thread\n          }\n\n          // For compatibility with older behavior, generating unknown\n          // unsupported feature notification on errors.\n          handler.send('UnsupportedFeature',\n                       { featureId: UNSUPPORTED_FEATURES.unknown, });\n\n          var minimumStackMessage =\n            'worker.js: while trying to getPage() and getOperatorList()';\n\n          var wrappedException;\n\n          // Turn the error into an obj that can be serialized\n          if (typeof e === 'string') {\n            wrappedException = {\n              message: e,\n              stack: minimumStackMessage,\n            };\n          } else if (typeof e === 'object') {\n            wrappedException = {\n              message: e.message || e.toString(),\n              stack: e.stack || minimumStackMessage,\n            };\n          } else {\n            wrappedException = {\n              message: 'Unknown exception type: ' + (typeof e),\n              stack: minimumStackMessage,\n            };\n          }\n\n          handler.send('PageError', {\n            pageNum,\n            error: wrappedException,\n            intent: data.intent,\n          });\n        });\n      });\n    }, this);\n\n    handler.on('GetTextContent', function wphExtractText(data, sink) {\n      var pageIndex = data.pageIndex;\n      sink.onPull = function (desiredSize) { };\n      sink.onCancel = function (reason) { };\n\n      pdfManager.getPage(pageIndex).then(function(page) {\n        var task = new WorkerTask('GetTextContent: page ' + pageIndex);\n        startWorkerTask(task);\n\n        var pageNum = pageIndex + 1;\n        var start = Date.now();\n        page.extractTextContent({\n          handler,\n          task,\n          sink,\n          normalizeWhitespace: data.normalizeWhitespace,\n          combineTextItems: data.combineTextItems,\n        }).then(function() {\n          finishWorkerTask(task);\n\n          info('text indexing: page=' + pageNum + ' - time=' +\n               (Date.now() - start) + 'ms');\n          sink.close();\n        }, function (reason) {\n          finishWorkerTask(task);\n          if (task.terminated) {\n            return; // ignoring errors from the terminated thread\n          }\n          sink.error(reason);\n          throw reason;\n        });\n      });\n    });\n\n    handler.on('Cleanup', function wphCleanup(data) {\n      return pdfManager.cleanup();\n    });\n\n    handler.on('Terminate', function wphTerminate(data) {\n      terminated = true;\n      if (pdfManager) {\n        pdfManager.terminate();\n        pdfManager = null;\n      }\n      if (cancelXHRs) {\n        cancelXHRs();\n      }\n\n      var waitOn = [];\n      WorkerTasks.forEach(function (task) {\n        waitOn.push(task.finished);\n        task.terminate();\n      });\n\n      return Promise.all(waitOn).then(function () {\n        // Notice that even if we destroying handler, resolved response promise\n        // must be sent back.\n        handler.destroy();\n        handler = null;\n      });\n    });\n\n    handler.on('Ready', function wphReady(data) {\n      setupDoc(docParams);\n      docParams = null; // we don't need docParams anymore -- saving memory.\n    });\n    return workerHandlerName;\n  },\n  initializeFromPort(port) {\n    var handler = new MessageHandler('worker', 'main', port);\n    WorkerMessageHandler.setup(handler, port);\n    handler.send('ready', null);\n  },\n};\n\nfunction isMessagePort(maybePort) {\n  return typeof maybePort.postMessage === 'function' &&\n         ('onmessage' in maybePort);\n}\n\n// Worker thread (and not node.js)?\nif (typeof window === 'undefined' && !isNodeJS() &&\n    typeof self !== 'undefined' && isMessagePort(self)) {\n  WorkerMessageHandler.initializeFromPort(self);\n}\n\nexport {\n  WorkerTask,\n  WorkerMessageHandler,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport './compatibility';\nimport { ReadableStream } from './streams_polyfill';\nimport { URL } from './url_polyfill';\n\nconst IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0];\nconst FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0];\n\nconst NativeImageDecoding = {\n  NONE: 'none',\n  DECODE: 'decode',\n  DISPLAY: 'display',\n};\n\n// Permission flags from Table 22, Section 7.6.3.2 of the PDF specification.\nconst PermissionFlag = {\n  PRINT: 0x04,\n  MODIFY_CONTENTS: 0x08,\n  COPY: 0x10,\n  MODIFY_ANNOTATIONS: 0x20,\n  FILL_INTERACTIVE_FORMS: 0x100,\n  COPY_FOR_ACCESSIBILITY: 0x200,\n  ASSEMBLE: 0x400,\n  PRINT_HIGH_QUALITY: 0x800,\n};\n\nconst TextRenderingMode = {\n  FILL: 0,\n  STROKE: 1,\n  FILL_STROKE: 2,\n  INVISIBLE: 3,\n  FILL_ADD_TO_PATH: 4,\n  STROKE_ADD_TO_PATH: 5,\n  FILL_STROKE_ADD_TO_PATH: 6,\n  ADD_TO_PATH: 7,\n  FILL_STROKE_MASK: 3,\n  ADD_TO_PATH_FLAG: 4,\n};\n\nconst ImageKind = {\n  GRAYSCALE_1BPP: 1,\n  RGB_24BPP: 2,\n  RGBA_32BPP: 3,\n};\n\nconst AnnotationType = {\n  TEXT: 1,\n  LINK: 2,\n  FREETEXT: 3,\n  LINE: 4,\n  SQUARE: 5,\n  CIRCLE: 6,\n  POLYGON: 7,\n  POLYLINE: 8,\n  HIGHLIGHT: 9,\n  UNDERLINE: 10,\n  SQUIGGLY: 11,\n  STRIKEOUT: 12,\n  STAMP: 13,\n  CARET: 14,\n  INK: 15,\n  POPUP: 16,\n  FILEATTACHMENT: 17,\n  SOUND: 18,\n  MOVIE: 19,\n  WIDGET: 20,\n  SCREEN: 21,\n  PRINTERMARK: 22,\n  TRAPNET: 23,\n  WATERMARK: 24,\n  THREED: 25,\n  REDACT: 26,\n};\n\nconst AnnotationFlag = {\n  INVISIBLE: 0x01,\n  HIDDEN: 0x02,\n  PRINT: 0x04,\n  NOZOOM: 0x08,\n  NOROTATE: 0x10,\n  NOVIEW: 0x20,\n  READONLY: 0x40,\n  LOCKED: 0x80,\n  TOGGLENOVIEW: 0x100,\n  LOCKEDCONTENTS: 0x200,\n};\n\nconst AnnotationFieldFlag = {\n  READONLY: 0x0000001,\n  REQUIRED: 0x0000002,\n  NOEXPORT: 0x0000004,\n  MULTILINE: 0x0001000,\n  PASSWORD: 0x0002000,\n  NOTOGGLETOOFF: 0x0004000,\n  RADIO: 0x0008000,\n  PUSHBUTTON: 0x0010000,\n  COMBO: 0x0020000,\n  EDIT: 0x0040000,\n  SORT: 0x0080000,\n  FILESELECT: 0x0100000,\n  MULTISELECT: 0x0200000,\n  DONOTSPELLCHECK: 0x0400000,\n  DONOTSCROLL: 0x0800000,\n  COMB: 0x1000000,\n  RICHTEXT: 0x2000000,\n  RADIOSINUNISON: 0x2000000,\n  COMMITONSELCHANGE: 0x4000000,\n};\n\nconst AnnotationBorderStyleType = {\n  SOLID: 1,\n  DASHED: 2,\n  BEVELED: 3,\n  INSET: 4,\n  UNDERLINE: 5,\n};\n\nconst StreamType = {\n  UNKNOWN: 0,\n  FLATE: 1,\n  LZW: 2,\n  DCT: 3,\n  JPX: 4,\n  JBIG: 5,\n  A85: 6,\n  AHX: 7,\n  CCF: 8,\n  RL: 9,\n};\n\nconst FontType = {\n  UNKNOWN: 0,\n  TYPE1: 1,\n  TYPE1C: 2,\n  CIDFONTTYPE0: 3,\n  CIDFONTTYPE0C: 4,\n  TRUETYPE: 5,\n  CIDFONTTYPE2: 6,\n  TYPE3: 7,\n  OPENTYPE: 8,\n  TYPE0: 9,\n  MMTYPE1: 10,\n};\n\nconst VerbosityLevel = {\n  ERRORS: 0,\n  WARNINGS: 1,\n  INFOS: 5,\n};\n\nconst CMapCompressionType = {\n  NONE: 0,\n  BINARY: 1,\n  STREAM: 2,\n};\n\n// All the possible operations for an operator list.\nconst OPS = {\n  // Intentionally start from 1 so it is easy to spot bad operators that will be\n  // 0's.\n  dependency: 1,\n  setLineWidth: 2,\n  setLineCap: 3,\n  setLineJoin: 4,\n  setMiterLimit: 5,\n  setDash: 6,\n  setRenderingIntent: 7,\n  setFlatness: 8,\n  setGState: 9,\n  save: 10,\n  restore: 11,\n  transform: 12,\n  moveTo: 13,\n  lineTo: 14,\n  curveTo: 15,\n  curveTo2: 16,\n  curveTo3: 17,\n  closePath: 18,\n  rectangle: 19,\n  stroke: 20,\n  closeStroke: 21,\n  fill: 22,\n  eoFill: 23,\n  fillStroke: 24,\n  eoFillStroke: 25,\n  closeFillStroke: 26,\n  closeEOFillStroke: 27,\n  endPath: 28,\n  clip: 29,\n  eoClip: 30,\n  beginText: 31,\n  endText: 32,\n  setCharSpacing: 33,\n  setWordSpacing: 34,\n  setHScale: 35,\n  setLeading: 36,\n  setFont: 37,\n  setTextRenderingMode: 38,\n  setTextRise: 39,\n  moveText: 40,\n  setLeadingMoveText: 41,\n  setTextMatrix: 42,\n  nextLine: 43,\n  showText: 44,\n  showSpacedText: 45,\n  nextLineShowText: 46,\n  nextLineSetSpacingShowText: 47,\n  setCharWidth: 48,\n  setCharWidthAndBounds: 49,\n  setStrokeColorSpace: 50,\n  setFillColorSpace: 51,\n  setStrokeColor: 52,\n  setStrokeColorN: 53,\n  setFillColor: 54,\n  setFillColorN: 55,\n  setStrokeGray: 56,\n  setFillGray: 57,\n  setStrokeRGBColor: 58,\n  setFillRGBColor: 59,\n  setStrokeCMYKColor: 60,\n  setFillCMYKColor: 61,\n  shadingFill: 62,\n  beginInlineImage: 63,\n  beginImageData: 64,\n  endInlineImage: 65,\n  paintXObject: 66,\n  markPoint: 67,\n  markPointProps: 68,\n  beginMarkedContent: 69,\n  beginMarkedContentProps: 70,\n  endMarkedContent: 71,\n  beginCompat: 72,\n  endCompat: 73,\n  paintFormXObjectBegin: 74,\n  paintFormXObjectEnd: 75,\n  beginGroup: 76,\n  endGroup: 77,\n  beginAnnotations: 78,\n  endAnnotations: 79,\n  beginAnnotation: 80,\n  endAnnotation: 81,\n  paintJpegXObject: 82,\n  paintImageMaskXObject: 83,\n  paintImageMaskXObjectGroup: 84,\n  paintImageXObject: 85,\n  paintInlineImageXObject: 86,\n  paintInlineImageXObjectGroup: 87,\n  paintImageXObjectRepeat: 88,\n  paintImageMaskXObjectRepeat: 89,\n  paintSolidColorImageMask: 90,\n  constructPath: 91,\n};\n\nconst UNSUPPORTED_FEATURES = {\n  unknown: 'unknown',\n  forms: 'forms',\n  javaScript: 'javaScript',\n  smask: 'smask',\n  shadingPattern: 'shadingPattern',\n  font: 'font',\n};\n\nconst PasswordResponses = {\n  NEED_PASSWORD: 1,\n  INCORRECT_PASSWORD: 2,\n};\n\nlet verbosity = VerbosityLevel.WARNINGS;\n\nfunction setVerbosityLevel(level) {\n  if (Number.isInteger(level)) {\n    verbosity = level;\n  }\n}\n\nfunction getVerbosityLevel() {\n  return verbosity;\n}\n\n// A notice for devs. These are good for things that are helpful to devs, such\n// as warning that Workers were disabled, which is important to devs but not\n// end users.\nfunction info(msg) {\n  if (verbosity >= VerbosityLevel.INFOS) {\n    console.log('Info: ' + msg);\n  }\n}\n\n// Non-fatal warnings.\nfunction warn(msg) {\n  if (verbosity >= VerbosityLevel.WARNINGS) {\n    console.log('Warning: ' + msg);\n  }\n}\n\n// Deprecated API function -- display regardless of the `verbosity` setting.\nfunction deprecated(details) {\n  console.log('Deprecated API usage: ' + details);\n}\n\nfunction unreachable(msg) {\n  throw new Error(msg);\n}\n\nfunction assert(cond, msg) {\n  if (!cond) {\n    unreachable(msg);\n  }\n}\n\n// Checks if URLs have the same origin. For non-HTTP based URLs, returns false.\nfunction isSameOrigin(baseUrl, otherUrl) {\n  try {\n    var base = new URL(baseUrl);\n    if (!base.origin || base.origin === 'null') {\n      return false; // non-HTTP url\n    }\n  } catch (e) {\n    return false;\n  }\n\n  var other = new URL(otherUrl, base);\n  return base.origin === other.origin;\n}\n\n// Checks if URLs use one of the whitelisted protocols, e.g. to avoid XSS.\nfunction _isValidProtocol(url) {\n  if (!url) {\n    return false;\n  }\n  switch (url.protocol) {\n    case 'http:':\n    case 'https:':\n    case 'ftp:':\n    case 'mailto:':\n    case 'tel:':\n      return true;\n    default:\n      return false;\n  }\n}\n\n/**\n * Attempts to create a valid absolute URL.\n *\n * @param {URL|string} url - An absolute, or relative, URL.\n * @param {URL|string} baseUrl - An absolute URL.\n * @returns Either a valid {URL}, or `null` otherwise.\n */\nfunction createValidAbsoluteUrl(url, baseUrl) {\n  if (!url) {\n    return null;\n  }\n  try {\n    var absoluteUrl = baseUrl ? new URL(url, baseUrl) : new URL(url);\n    if (_isValidProtocol(absoluteUrl)) {\n      return absoluteUrl;\n    }\n  } catch (ex) { /* `new URL()` will throw on incorrect data. */ }\n  return null;\n}\n\nfunction shadow(obj, prop, value) {\n  Object.defineProperty(obj, prop, { value,\n                                     enumerable: true,\n                                     configurable: true,\n                                     writable: false, });\n  return value;\n}\n\nfunction getLookupTableFactory(initializer) {\n  var lookup;\n  return function () {\n    if (initializer) {\n      lookup = Object.create(null);\n      initializer(lookup);\n      initializer = null;\n    }\n    return lookup;\n  };\n}\n\nvar PasswordException = (function PasswordExceptionClosure() {\n  function PasswordException(msg, code) {\n    this.name = 'PasswordException';\n    this.message = msg;\n    this.code = code;\n  }\n\n  PasswordException.prototype = new Error();\n  PasswordException.constructor = PasswordException;\n\n  return PasswordException;\n})();\n\nvar UnknownErrorException = (function UnknownErrorExceptionClosure() {\n  function UnknownErrorException(msg, details) {\n    this.name = 'UnknownErrorException';\n    this.message = msg;\n    this.details = details;\n  }\n\n  UnknownErrorException.prototype = new Error();\n  UnknownErrorException.constructor = UnknownErrorException;\n\n  return UnknownErrorException;\n})();\n\nvar InvalidPDFException = (function InvalidPDFExceptionClosure() {\n  function InvalidPDFException(msg) {\n    this.name = 'InvalidPDFException';\n    this.message = msg;\n  }\n\n  InvalidPDFException.prototype = new Error();\n  InvalidPDFException.constructor = InvalidPDFException;\n\n  return InvalidPDFException;\n})();\n\nvar MissingPDFException = (function MissingPDFExceptionClosure() {\n  function MissingPDFException(msg) {\n    this.name = 'MissingPDFException';\n    this.message = msg;\n  }\n\n  MissingPDFException.prototype = new Error();\n  MissingPDFException.constructor = MissingPDFException;\n\n  return MissingPDFException;\n})();\n\nvar UnexpectedResponseException =\n    (function UnexpectedResponseExceptionClosure() {\n  function UnexpectedResponseException(msg, status) {\n    this.name = 'UnexpectedResponseException';\n    this.message = msg;\n    this.status = status;\n  }\n\n  UnexpectedResponseException.prototype = new Error();\n  UnexpectedResponseException.constructor = UnexpectedResponseException;\n\n  return UnexpectedResponseException;\n})();\n\nvar MissingDataException = (function MissingDataExceptionClosure() {\n  function MissingDataException(begin, end) {\n    this.begin = begin;\n    this.end = end;\n    this.message = 'Missing data [' + begin + ', ' + end + ')';\n  }\n\n  MissingDataException.prototype = new Error();\n  MissingDataException.prototype.name = 'MissingDataException';\n  MissingDataException.constructor = MissingDataException;\n\n  return MissingDataException;\n})();\n\nvar XRefParseException = (function XRefParseExceptionClosure() {\n  function XRefParseException(msg) {\n    this.message = msg;\n  }\n\n  XRefParseException.prototype = new Error();\n  XRefParseException.prototype.name = 'XRefParseException';\n  XRefParseException.constructor = XRefParseException;\n\n  return XRefParseException;\n})();\n\n/**\n * Error caused during parsing PDF data.\n */\nlet FormatError = (function FormatErrorClosure() {\n  function FormatError(msg) {\n    this.message = msg;\n  }\n\n  FormatError.prototype = new Error();\n  FormatError.prototype.name = 'FormatError';\n  FormatError.constructor = FormatError;\n\n  return FormatError;\n})();\n\n/**\n * Error used to indicate task cancellation.\n */\nlet AbortException = (function AbortExceptionClosure() {\n  function AbortException(msg) {\n    this.name = 'AbortException';\n    this.message = msg;\n  }\n\n  AbortException.prototype = new Error();\n  AbortException.constructor = AbortException;\n\n  return AbortException;\n})();\n\nvar NullCharactersRegExp = /\\x00/g;\n\nfunction removeNullCharacters(str) {\n  if (typeof str !== 'string') {\n    warn('The argument for removeNullCharacters must be a string.');\n    return str;\n  }\n  return str.replace(NullCharactersRegExp, '');\n}\n\nfunction bytesToString(bytes) {\n  assert(bytes !== null && typeof bytes === 'object' &&\n         bytes.length !== undefined, 'Invalid argument for bytesToString');\n  var length = bytes.length;\n  var MAX_ARGUMENT_COUNT = 8192;\n  if (length < MAX_ARGUMENT_COUNT) {\n    return String.fromCharCode.apply(null, bytes);\n  }\n  var strBuf = [];\n  for (var i = 0; i < length; i += MAX_ARGUMENT_COUNT) {\n    var chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length);\n    var chunk = bytes.subarray(i, chunkEnd);\n    strBuf.push(String.fromCharCode.apply(null, chunk));\n  }\n  return strBuf.join('');\n}\n\nfunction stringToBytes(str) {\n  assert(typeof str === 'string', 'Invalid argument for stringToBytes');\n  var length = str.length;\n  var bytes = new Uint8Array(length);\n  for (var i = 0; i < length; ++i) {\n    bytes[i] = str.charCodeAt(i) & 0xFF;\n  }\n  return bytes;\n}\n\n/**\n * Gets length of the array (Array, Uint8Array, or string) in bytes.\n * @param {Array|Uint8Array|string} arr\n * @returns {number}\n */\nfunction arrayByteLength(arr) {\n  if (arr.length !== undefined) {\n    return arr.length;\n  }\n  assert(arr.byteLength !== undefined);\n  return arr.byteLength;\n}\n\n/**\n * Combines array items (arrays) into single Uint8Array object.\n * @param {Array} arr - the array of the arrays (Array, Uint8Array, or string).\n * @returns {Uint8Array}\n */\nfunction arraysToBytes(arr) {\n  // Shortcut: if first and only item is Uint8Array, return it.\n  if (arr.length === 1 && (arr[0] instanceof Uint8Array)) {\n    return arr[0];\n  }\n  var resultLength = 0;\n  var i, ii = arr.length;\n  var item, itemLength;\n  for (i = 0; i < ii; i++) {\n    item = arr[i];\n    itemLength = arrayByteLength(item);\n    resultLength += itemLength;\n  }\n  var pos = 0;\n  var data = new Uint8Array(resultLength);\n  for (i = 0; i < ii; i++) {\n    item = arr[i];\n    if (!(item instanceof Uint8Array)) {\n      if (typeof item === 'string') {\n        item = stringToBytes(item);\n      } else {\n        item = new Uint8Array(item);\n      }\n    }\n    itemLength = item.byteLength;\n    data.set(item, pos);\n    pos += itemLength;\n  }\n  return data;\n}\n\nfunction string32(value) {\n  return String.fromCharCode((value >> 24) & 0xff, (value >> 16) & 0xff,\n                             (value >> 8) & 0xff, value & 0xff);\n}\n\n// Calculate the base 2 logarithm of the number `x`. This differs from the\n// native function in the sense that it returns the ceiling value and that it\n// returns 0 instead of `Infinity`/`NaN` for `x` values smaller than/equal to 0.\nfunction log2(x) {\n  if (x <= 0) {\n    return 0;\n  }\n  return Math.ceil(Math.log2(x));\n}\n\nfunction readInt8(data, start) {\n  return (data[start] << 24) >> 24;\n}\n\nfunction readUint16(data, offset) {\n  return (data[offset] << 8) | data[offset + 1];\n}\n\nfunction readUint32(data, offset) {\n  return ((data[offset] << 24) | (data[offset + 1] << 16) |\n         (data[offset + 2] << 8) | data[offset + 3]) >>> 0;\n}\n\n// Lazy test the endianness of the platform\n// NOTE: This will be 'true' for simulated TypedArrays\nfunction isLittleEndian() {\n  var buffer8 = new Uint8Array(4);\n  buffer8[0] = 1;\n  var view32 = new Uint32Array(buffer8.buffer, 0, 1);\n  return (view32[0] === 1);\n}\n\n// Checks if it's possible to eval JS expressions.\nfunction isEvalSupported() {\n  try {\n    new Function(''); // eslint-disable-line no-new, no-new-func\n    return true;\n  } catch (e) {\n    return false;\n  }\n}\n\n/**\n * Get the value of an inheritable property.\n *\n * If the PDF specification explicitly lists a property in a dictionary as\n * inheritable, then the value of the property may be present in the dictionary\n * itself or in one or more parents of the dictionary.\n *\n * If the key is not found in the tree, `undefined` is returned. Otherwise,\n * the value for the key is returned or, if `stopWhenFound` is `false`, a list\n * of values is returned. To avoid infinite loops, the traversal is stopped when\n * the loop limit is reached.\n *\n * @param {Dict} dict - Dictionary from where to start the traversal.\n * @param {string} key - The key of the property to find the value for.\n * @param {boolean} getArray - Whether or not the value should be fetched as an\n *   array. The default value is `false`.\n * @param {boolean} stopWhenFound - Whether or not to stop the traversal when\n *   the key is found. If set to `false`, we always walk up the entire parent\n *   chain, for example to be able to find `\\Resources` placed on multiple\n *   levels of the tree. The default value is `true`.\n */\nfunction getInheritableProperty({ dict, key, getArray = false,\n                                  stopWhenFound = true, }) {\n  const LOOP_LIMIT = 100;\n  let loopCount = 0;\n  let values;\n\n  while (dict) {\n    const value = getArray ? dict.getArray(key) : dict.get(key);\n    if (value !== undefined) {\n      if (stopWhenFound) {\n        return value;\n      }\n      if (!values) {\n        values = [];\n      }\n      values.push(value);\n    }\n    if (++loopCount > LOOP_LIMIT) {\n      warn(`getInheritableProperty: maximum loop count exceeded for \"${key}\"`);\n      break;\n    }\n    dict = dict.get('Parent');\n  }\n  return values;\n}\n\nvar Util = (function UtilClosure() {\n  function Util() {}\n\n  var rgbBuf = ['rgb(', 0, ',', 0, ',', 0, ')'];\n\n  // makeCssRgb() can be called thousands of times. Using |rgbBuf| avoids\n  // creating many intermediate strings.\n  Util.makeCssRgb = function Util_makeCssRgb(r, g, b) {\n    rgbBuf[1] = r;\n    rgbBuf[3] = g;\n    rgbBuf[5] = b;\n    return rgbBuf.join('');\n  };\n\n  // Concatenates two transformation matrices together and returns the result.\n  Util.transform = function Util_transform(m1, m2) {\n    return [\n      m1[0] * m2[0] + m1[2] * m2[1],\n      m1[1] * m2[0] + m1[3] * m2[1],\n      m1[0] * m2[2] + m1[2] * m2[3],\n      m1[1] * m2[2] + m1[3] * m2[3],\n      m1[0] * m2[4] + m1[2] * m2[5] + m1[4],\n      m1[1] * m2[4] + m1[3] * m2[5] + m1[5]\n    ];\n  };\n\n  // For 2d affine transforms\n  Util.applyTransform = function Util_applyTransform(p, m) {\n    var xt = p[0] * m[0] + p[1] * m[2] + m[4];\n    var yt = p[0] * m[1] + p[1] * m[3] + m[5];\n    return [xt, yt];\n  };\n\n  Util.applyInverseTransform = function Util_applyInverseTransform(p, m) {\n    var d = m[0] * m[3] - m[1] * m[2];\n    var xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d;\n    var yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d;\n    return [xt, yt];\n  };\n\n  // Applies the transform to the rectangle and finds the minimum axially\n  // aligned bounding box.\n  Util.getAxialAlignedBoundingBox =\n    function Util_getAxialAlignedBoundingBox(r, m) {\n\n    var p1 = Util.applyTransform(r, m);\n    var p2 = Util.applyTransform(r.slice(2, 4), m);\n    var p3 = Util.applyTransform([r[0], r[3]], m);\n    var p4 = Util.applyTransform([r[2], r[1]], m);\n    return [\n      Math.min(p1[0], p2[0], p3[0], p4[0]),\n      Math.min(p1[1], p2[1], p3[1], p4[1]),\n      Math.max(p1[0], p2[0], p3[0], p4[0]),\n      Math.max(p1[1], p2[1], p3[1], p4[1])\n    ];\n  };\n\n  Util.inverseTransform = function Util_inverseTransform(m) {\n    var d = m[0] * m[3] - m[1] * m[2];\n    return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d,\n      (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d];\n  };\n\n  // Apply a generic 3d matrix M on a 3-vector v:\n  //   | a b c |   | X |\n  //   | d e f | x | Y |\n  //   | g h i |   | Z |\n  // M is assumed to be serialized as [a,b,c,d,e,f,g,h,i],\n  // with v as [X,Y,Z]\n  Util.apply3dTransform = function Util_apply3dTransform(m, v) {\n    return [\n      m[0] * v[0] + m[1] * v[1] + m[2] * v[2],\n      m[3] * v[0] + m[4] * v[1] + m[5] * v[2],\n      m[6] * v[0] + m[7] * v[1] + m[8] * v[2]\n    ];\n  };\n\n  // This calculation uses Singular Value Decomposition.\n  // The SVD can be represented with formula A = USV. We are interested in the\n  // matrix S here because it represents the scale values.\n  Util.singularValueDecompose2dScale =\n    function Util_singularValueDecompose2dScale(m) {\n\n    var transpose = [m[0], m[2], m[1], m[3]];\n\n    // Multiply matrix m with its transpose.\n    var a = m[0] * transpose[0] + m[1] * transpose[2];\n    var b = m[0] * transpose[1] + m[1] * transpose[3];\n    var c = m[2] * transpose[0] + m[3] * transpose[2];\n    var d = m[2] * transpose[1] + m[3] * transpose[3];\n\n    // Solve the second degree polynomial to get roots.\n    var first = (a + d) / 2;\n    var second = Math.sqrt((a + d) * (a + d) - 4 * (a * d - c * b)) / 2;\n    var sx = first + second || 1;\n    var sy = first - second || 1;\n\n    // Scale values are the square roots of the eigenvalues.\n    return [Math.sqrt(sx), Math.sqrt(sy)];\n  };\n\n  // Normalize rectangle rect=[x1, y1, x2, y2] so that (x1,y1) < (x2,y2)\n  // For coordinate systems whose origin lies in the bottom-left, this\n  // means normalization to (BL,TR) ordering. For systems with origin in the\n  // top-left, this means (TL,BR) ordering.\n  Util.normalizeRect = function Util_normalizeRect(rect) {\n    var r = rect.slice(0); // clone rect\n    if (rect[0] > rect[2]) {\n      r[0] = rect[2];\n      r[2] = rect[0];\n    }\n    if (rect[1] > rect[3]) {\n      r[1] = rect[3];\n      r[3] = rect[1];\n    }\n    return r;\n  };\n\n  // Returns a rectangle [x1, y1, x2, y2] corresponding to the\n  // intersection of rect1 and rect2. If no intersection, returns 'false'\n  // The rectangle coordinates of rect1, rect2 should be [x1, y1, x2, y2]\n  Util.intersect = function Util_intersect(rect1, rect2) {\n    function compare(a, b) {\n      return a - b;\n    }\n\n    // Order points along the axes\n    var orderedX = [rect1[0], rect1[2], rect2[0], rect2[2]].sort(compare),\n        orderedY = [rect1[1], rect1[3], rect2[1], rect2[3]].sort(compare),\n        result = [];\n\n    rect1 = Util.normalizeRect(rect1);\n    rect2 = Util.normalizeRect(rect2);\n\n    // X: first and second points belong to different rectangles?\n    if ((orderedX[0] === rect1[0] && orderedX[1] === rect2[0]) ||\n        (orderedX[0] === rect2[0] && orderedX[1] === rect1[0])) {\n      // Intersection must be between second and third points\n      result[0] = orderedX[1];\n      result[2] = orderedX[2];\n    } else {\n      return false;\n    }\n\n    // Y: first and second points belong to different rectangles?\n    if ((orderedY[0] === rect1[1] && orderedY[1] === rect2[1]) ||\n        (orderedY[0] === rect2[1] && orderedY[1] === rect1[1])) {\n      // Intersection must be between second and third points\n      result[1] = orderedY[1];\n      result[3] = orderedY[2];\n    } else {\n      return false;\n    }\n\n    return result;\n  };\n\n  return Util;\n})();\n\nconst ROMAN_NUMBER_MAP = [\n  '', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM',\n  '', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC',\n  '', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX'\n];\n\n/**\n * Converts positive integers to (upper case) Roman numerals.\n * @param {integer} number - The number that should be converted.\n * @param {boolean} lowerCase - Indicates if the result should be converted\n *   to lower case letters. The default value is `false`.\n * @return {string} The resulting Roman number.\n */\nfunction toRomanNumerals(number, lowerCase = false) {\n  assert(Number.isInteger(number) && number > 0,\n         'The number should be a positive integer.');\n  let pos, romanBuf = [];\n  // Thousands\n  while (number >= 1000) {\n    number -= 1000;\n    romanBuf.push('M');\n  }\n  // Hundreds\n  pos = (number / 100) | 0;\n  number %= 100;\n  romanBuf.push(ROMAN_NUMBER_MAP[pos]);\n  // Tens\n  pos = (number / 10) | 0;\n  number %= 10;\n  romanBuf.push(ROMAN_NUMBER_MAP[10 + pos]);\n  // Ones\n  romanBuf.push(ROMAN_NUMBER_MAP[20 + number]);\n\n  const romanStr = romanBuf.join('');\n  return (lowerCase ? romanStr.toLowerCase() : romanStr);\n}\n\nconst PDFStringTranslateTable = [\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0x2D8, 0x2C7, 0x2C6, 0x2D9, 0x2DD, 0x2DB, 0x2DA, 0x2DC, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014,\n  0x2013, 0x192, 0x2044, 0x2039, 0x203A, 0x2212, 0x2030, 0x201E, 0x201C,\n  0x201D, 0x2018, 0x2019, 0x201A, 0x2122, 0xFB01, 0xFB02, 0x141, 0x152, 0x160,\n  0x178, 0x17D, 0x131, 0x142, 0x153, 0x161, 0x17E, 0, 0x20AC\n];\n\nfunction stringToPDFString(str) {\n  var i, n = str.length, strBuf = [];\n  if (str[0] === '\\xFE' && str[1] === '\\xFF') {\n    // UTF16BE BOM\n    for (i = 2; i < n; i += 2) {\n      strBuf.push(String.fromCharCode(\n        (str.charCodeAt(i) << 8) | str.charCodeAt(i + 1)));\n    }\n  } else {\n    for (i = 0; i < n; ++i) {\n      var code = PDFStringTranslateTable[str.charCodeAt(i)];\n      strBuf.push(code ? String.fromCharCode(code) : str.charAt(i));\n    }\n  }\n  return strBuf.join('');\n}\n\nfunction stringToUTF8String(str) {\n  return decodeURIComponent(escape(str));\n}\n\nfunction utf8StringToString(str) {\n  return unescape(encodeURIComponent(str));\n}\n\nfunction isEmptyObj(obj) {\n  for (var key in obj) {\n    return false;\n  }\n  return true;\n}\n\nfunction isBool(v) {\n  return typeof v === 'boolean';\n}\n\nfunction isNum(v) {\n  return typeof v === 'number';\n}\n\nfunction isString(v) {\n  return typeof v === 'string';\n}\n\nfunction isArrayBuffer(v) {\n  return typeof v === 'object' && v !== null && v.byteLength !== undefined;\n}\n\n// Checks if ch is one of the following characters: SPACE, TAB, CR or LF.\nfunction isSpace(ch) {\n  return (ch === 0x20 || ch === 0x09 || ch === 0x0D || ch === 0x0A);\n}\n\n/**\n * Promise Capability object.\n *\n * @typedef {Object} PromiseCapability\n * @property {Promise} promise - A promise object.\n * @property {function} resolve - Fulfills the promise.\n * @property {function} reject - Rejects the promise.\n */\n\n/**\n * Creates a promise capability object.\n * @alias createPromiseCapability\n *\n * @return {PromiseCapability} A capability object contains:\n * - a Promise, resolve and reject methods.\n */\nfunction createPromiseCapability() {\n  var capability = {};\n  capability.promise = new Promise(function (resolve, reject) {\n    capability.resolve = resolve;\n    capability.reject = reject;\n  });\n  return capability;\n}\n\nvar createObjectURL = (function createObjectURLClosure() {\n  // Blob/createObjectURL is not available, falling back to data schema.\n  var digits =\n    'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n\n  return function createObjectURL(data, contentType, forceDataSchema = false) {\n    if (!forceDataSchema && URL.createObjectURL) {\n      const blob = new Blob([data], { type: contentType, });\n      return URL.createObjectURL(blob);\n    }\n\n    var buffer = 'data:' + contentType + ';base64,';\n    for (var i = 0, ii = data.length; i < ii; i += 3) {\n      var b1 = data[i] & 0xFF;\n      var b2 = data[i + 1] & 0xFF;\n      var b3 = data[i + 2] & 0xFF;\n      var d1 = b1 >> 2, d2 = ((b1 & 3) << 4) | (b2 >> 4);\n      var d3 = i + 1 < ii ? ((b2 & 0xF) << 2) | (b3 >> 6) : 64;\n      var d4 = i + 2 < ii ? (b3 & 0x3F) : 64;\n      buffer += digits[d1] + digits[d2] + digits[d3] + digits[d4];\n    }\n    return buffer;\n  };\n})();\n\nexport {\n  FONT_IDENTITY_MATRIX,\n  IDENTITY_MATRIX,\n  OPS,\n  VerbosityLevel,\n  UNSUPPORTED_FEATURES,\n  AnnotationBorderStyleType,\n  AnnotationFieldFlag,\n  AnnotationFlag,\n  AnnotationType,\n  FontType,\n  ImageKind,\n  CMapCompressionType,\n  AbortException,\n  InvalidPDFException,\n  MissingDataException,\n  MissingPDFException,\n  NativeImageDecoding,\n  PasswordException,\n  PasswordResponses,\n  PermissionFlag,\n  StreamType,\n  TextRenderingMode,\n  UnexpectedResponseException,\n  UnknownErrorException,\n  Util,\n  toRomanNumerals,\n  XRefParseException,\n  FormatError,\n  arrayByteLength,\n  arraysToBytes,\n  assert,\n  bytesToString,\n  createPromiseCapability,\n  createObjectURL,\n  deprecated,\n  getInheritableProperty,\n  getLookupTableFactory,\n  getVerbosityLevel,\n  info,\n  isArrayBuffer,\n  isBool,\n  isEmptyObj,\n  isNum,\n  isString,\n  isSpace,\n  isSameOrigin,\n  createValidAbsoluteUrl,\n  isLittleEndian,\n  isEvalSupported,\n  log2,\n  readInt8,\n  readUint16,\n  readUint32,\n  removeNullCharacters,\n  ReadableStream,\n  URL,\n  setVerbosityLevel,\n  shadow,\n  string32,\n  stringToBytes,\n  stringToPDFString,\n  stringToUTF8String,\n  utf8StringToString,\n  warn,\n  unreachable,\n};\n","/* Copyright 2017 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst globalScope = require('./global_scope');\n\n// Skip compatibility checks for the extensions and if we already ran\n// this module.\nif ((typeof PDFJSDev === 'undefined' ||\n     !PDFJSDev.test('FIREFOX || MOZCENTRAL')) &&\n    !globalScope._pdfjsCompatibilityChecked) {\n\nglobalScope._pdfjsCompatibilityChecked = true;\n\n// In the Chrome extension, most of the polyfills are unnecessary.\n// We support down to Chrome 49, because it's still commonly used by Windows XP\n// users - https://github.com/mozilla/pdf.js/issues/9397\nif (typeof PDFJSDev === 'undefined' || !PDFJSDev.test('CHROME')) {\n\nconst isNodeJS = require('./is_node');\n\nconst hasDOM = typeof window === 'object' && typeof document === 'object';\n\n// Support: Node.js\n(function checkNodeBtoa() {\n  if (globalScope.btoa || !isNodeJS()) {\n    return;\n  }\n  globalScope.btoa = function(chars) {\n    // eslint-disable-next-line no-undef\n    return Buffer.from(chars, 'binary').toString('base64');\n  };\n})();\n\n// Support: Node.js\n(function checkNodeAtob() {\n  if (globalScope.atob || !isNodeJS()) {\n    return;\n  }\n  globalScope.atob = function(input) {\n    // eslint-disable-next-line no-undef\n    return Buffer.from(input, 'base64').toString('binary');\n  };\n})();\n\n// Provides document.currentScript support\n// Support: IE, Chrome<29.\n(function checkCurrentScript() {\n  if (!hasDOM) {\n    return;\n  }\n  if ('currentScript' in document) {\n    return;\n  }\n  Object.defineProperty(document, 'currentScript', {\n    get() {\n      var scripts = document.getElementsByTagName('script');\n      return scripts[scripts.length - 1];\n    },\n    enumerable: true,\n    configurable: true,\n  });\n})();\n\n// Provides support for ChildNode.remove in legacy browsers.\n// Support: IE.\n(function checkChildNodeRemove() {\n  if (!hasDOM) {\n    return;\n  }\n  if (typeof Element.prototype.remove !== 'undefined') {\n    return;\n  }\n  Element.prototype.remove = function () {\n    if (this.parentNode) {\n      // eslint-disable-next-line mozilla/avoid-removeChild\n      this.parentNode.removeChild(this);\n    }\n  };\n})();\n\n// Provides support for DOMTokenList.prototype.toggle, with the optional\n// \"force\" parameter, in legacy browsers.\n// Support: IE\n(function checkDOMTokenListToggle() {\n  if (!hasDOM || isNodeJS()) {\n    return;\n  }\n  const div = document.createElement('div');\n  if (div.classList.toggle('test', 0) === false) {\n    return;\n  }\n  const originalDOMTokenListToggle = DOMTokenList.prototype.toggle;\n\n  DOMTokenList.prototype.toggle = function(token) {\n    if (arguments.length > 1) {\n      const force = !!arguments[1];\n      return (this[force ? 'add' : 'remove'](token), force);\n    }\n    return originalDOMTokenListToggle(token);\n  };\n})();\n\n// Provides support for String.prototype.includes in legacy browsers.\n// Support: IE, Chrome<41\n(function checkStringIncludes() {\n  if (String.prototype.includes) {\n    return;\n  }\n  require('core-js/fn/string/includes');\n})();\n\n// Provides support for Array.prototype.includes in legacy browsers.\n// Support: IE, Chrome<47\n(function checkArrayIncludes() {\n  if (Array.prototype.includes) {\n    return;\n  }\n  require('core-js/fn/array/includes');\n})();\n\n// Provides support for Object.assign in legacy browsers.\n// Support: IE\n(function checkObjectAssign() {\n  if (Object.assign) {\n    return;\n  }\n  require('core-js/fn/object/assign');\n})();\n\n// Provides support for Math.log2 in legacy browsers.\n// Support: IE, Chrome<38\n(function checkMathLog2() {\n  if (Math.log2) {\n    return;\n  }\n  Math.log2 = require('core-js/fn/math/log2');\n})();\n\n// Provides support for Number.isNaN in legacy browsers.\n// Support: IE.\n(function checkNumberIsNaN() {\n  if (Number.isNaN) {\n    return;\n  }\n  Number.isNaN = require('core-js/fn/number/is-nan');\n})();\n\n// Provides support for Number.isInteger in legacy browsers.\n// Support: IE, Chrome<34\n(function checkNumberIsInteger() {\n  if (Number.isInteger) {\n    return;\n  }\n  Number.isInteger = require('core-js/fn/number/is-integer');\n})();\n\n// Support: IE, Safari<8, Chrome<32\n(function checkPromise() {\n  if (typeof PDFJSDev !== 'undefined' && PDFJSDev.test('IMAGE_DECODERS')) {\n    // The current image decoders are synchronous, hence `Promise` shouldn't\n    // need to be polyfilled for the IMAGE_DECODERS build target.\n    return;\n  }\n  if (globalScope.Promise) {\n    return;\n  }\n  globalScope.Promise = require('core-js/fn/promise');\n})();\n\n// Support: IE<11, Safari<8, Chrome<36\n(function checkWeakMap() {\n  if (globalScope.WeakMap) {\n    return;\n  }\n  globalScope.WeakMap = require('core-js/fn/weak-map');\n})();\n\n// Provides support for String.codePointAt in legacy browsers.\n// Support: IE11.\n(function checkStringCodePointAt() {\n  if (String.codePointAt) {\n    return;\n  }\n  String.codePointAt = require('core-js/fn/string/code-point-at');\n})();\n\n// Provides support for String.fromCodePoint in legacy browsers.\n// Support: IE11.\n(function checkStringFromCodePoint() {\n  if (String.fromCodePoint) {\n    return;\n  }\n  String.fromCodePoint = require('core-js/fn/string/from-code-point');\n})();\n\n// Support: IE\n(function checkSymbol() {\n  if (globalScope.Symbol) {\n    return;\n  }\n  require('core-js/es6/symbol');\n})();\n\n} // End of !PDFJSDev.test('CHROME')\n\n// Provides support for Object.values in legacy browsers.\n// Support: IE, Chrome<54\n(function checkObjectValues() {\n  if (Object.values) {\n    return;\n  }\n  Object.values = require('core-js/fn/object/values');\n})();\n\n}\n","/* Copyright 2017 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* globals module */\n\nmodule.exports =\n  (typeof window !== 'undefined' && window.Math === Math) ? window :\n  // eslint-disable-next-line no-undef\n  (typeof global !== 'undefined' && global.Math === Math) ? global :\n  (typeof self !== 'undefined' && self.Math === Math) ? self : {};\n","/* Copyright 2018 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* globals module, process */\n\nmodule.exports = function isNodeJS() {\n  return typeof process === 'object' && process + '' === '[object process]';\n};\n","require('../../modules/es6.string.includes');\nmodule.exports = require('../../modules/_core').String.includes;\n","// 21.1.3.7 String.prototype.includes(searchString, position = 0)\n'use strict';\nvar $export = require('./_export');\nvar context = require('./_string-context');\nvar INCLUDES = 'includes';\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(INCLUDES), 'String', {\n  includes: function includes(searchString /* , position = 0 */) {\n    return !!~context(this, searchString, INCLUDES)\n      .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n","var global = require('./_global');\nvar core = require('./_core');\nvar hide = require('./_hide');\nvar redefine = require('./_redefine');\nvar ctx = require('./_ctx');\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n  var IS_FORCED = type & $export.F;\n  var IS_GLOBAL = type & $export.G;\n  var IS_STATIC = type & $export.S;\n  var IS_PROTO = type & $export.P;\n  var IS_BIND = type & $export.B;\n  var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE];\n  var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n  var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});\n  var key, own, out, exp;\n  if (IS_GLOBAL) source = name;\n  for (key in source) {\n    // contains in native\n    own = !IS_FORCED && target && target[key] !== undefined;\n    // export native or passed\n    out = (own ? target : source)[key];\n    // bind timers to global for call from export context\n    exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n    // extend global\n    if (target) redefine(target, key, out, type & $export.U);\n    // export\n    if (exports[key] != out) hide(exports, key, exp);\n    if (IS_PROTO && expProto[key] != out) expProto[key] = out;\n  }\n};\nglobal.core = core;\n// type bitmap\n$export.F = 1;   // forced\n$export.G = 2;   // global\n$export.S = 4;   // static\n$export.P = 8;   // proto\n$export.B = 16;  // bind\n$export.W = 32;  // wrap\n$export.U = 64;  // safe\n$export.R = 128; // real proto method for `library`\nmodule.exports = $export;\n","// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n  ? window : typeof self != 'undefined' && self.Math == Math ? self\n  // eslint-disable-next-line no-new-func\n  : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n","var core = module.exports = { version: '2.5.7' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n","var dP = require('./_object-dp');\nvar createDesc = require('./_property-desc');\nmodule.exports = require('./_descriptors') ? function (object, key, value) {\n  return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n  object[key] = value;\n  return object;\n};\n","var anObject = require('./_an-object');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar toPrimitive = require('./_to-primitive');\nvar dP = Object.defineProperty;\n\nexports.f = require('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n  anObject(O);\n  P = toPrimitive(P, true);\n  anObject(Attributes);\n  if (IE8_DOM_DEFINE) try {\n    return dP(O, P, Attributes);\n  } catch (e) { /* empty */ }\n  if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n  if ('value' in Attributes) O[P] = Attributes.value;\n  return O;\n};\n","var isObject = require('./_is-object');\nmodule.exports = function (it) {\n  if (!isObject(it)) throw TypeError(it + ' is not an object!');\n  return it;\n};\n","module.exports = function (it) {\n  return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n","module.exports = !require('./_descriptors') && !require('./_fails')(function () {\n  return Object.defineProperty(require('./_dom-create')('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n","// Thank's IE8 for his funny defineProperty\nmodule.exports = !require('./_fails')(function () {\n  return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n","module.exports = function (exec) {\n  try {\n    return !!exec();\n  } catch (e) {\n    return true;\n  }\n};\n","var isObject = require('./_is-object');\nvar document = require('./_global').document;\n// typeof document.createElement is 'object' in old IE\nvar is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n  return is ? document.createElement(it) : {};\n};\n","// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = require('./_is-object');\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n  if (!isObject(it)) return it;\n  var fn, val;\n  if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n  if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n  if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n  throw TypeError(\"Can't convert object to primitive value\");\n};\n","module.exports = function (bitmap, value) {\n  return {\n    enumerable: !(bitmap & 1),\n    configurable: !(bitmap & 2),\n    writable: !(bitmap & 4),\n    value: value\n  };\n};\n","var global = require('./_global');\nvar hide = require('./_hide');\nvar has = require('./_has');\nvar SRC = require('./_uid')('src');\nvar TO_STRING = 'toString';\nvar $toString = Function[TO_STRING];\nvar TPL = ('' + $toString).split(TO_STRING);\n\nrequire('./_core').inspectSource = function (it) {\n  return $toString.call(it);\n};\n\n(module.exports = function (O, key, val, safe) {\n  var isFunction = typeof val == 'function';\n  if (isFunction) has(val, 'name') || hide(val, 'name', key);\n  if (O[key] === val) return;\n  if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));\n  if (O === global) {\n    O[key] = val;\n  } else if (!safe) {\n    delete O[key];\n    hide(O, key, val);\n  } else if (O[key]) {\n    O[key] = val;\n  } else {\n    hide(O, key, val);\n  }\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, TO_STRING, function toString() {\n  return typeof this == 'function' && this[SRC] || $toString.call(this);\n});\n","var hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n  return hasOwnProperty.call(it, key);\n};\n","var id = 0;\nvar px = Math.random();\nmodule.exports = function (key) {\n  return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n","// optional / simple context binding\nvar aFunction = require('./_a-function');\nmodule.exports = function (fn, that, length) {\n  aFunction(fn);\n  if (that === undefined) return fn;\n  switch (length) {\n    case 1: return function (a) {\n      return fn.call(that, a);\n    };\n    case 2: return function (a, b) {\n      return fn.call(that, a, b);\n    };\n    case 3: return function (a, b, c) {\n      return fn.call(that, a, b, c);\n    };\n  }\n  return function (/* ...args */) {\n    return fn.apply(that, arguments);\n  };\n};\n","module.exports = function (it) {\n  if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n  return it;\n};\n","// helper for String#{startsWith, endsWith, includes}\nvar isRegExp = require('./_is-regexp');\nvar defined = require('./_defined');\n\nmodule.exports = function (that, searchString, NAME) {\n  if (isRegExp(searchString)) throw TypeError('String#' + NAME + \" doesn't accept regex!\");\n  return String(defined(that));\n};\n","// 7.2.8 IsRegExp(argument)\nvar isObject = require('./_is-object');\nvar cof = require('./_cof');\nvar MATCH = require('./_wks')('match');\nmodule.exports = function (it) {\n  var isRegExp;\n  return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp');\n};\n","var toString = {}.toString;\n\nmodule.exports = function (it) {\n  return toString.call(it).slice(8, -1);\n};\n","var store = require('./_shared')('wks');\nvar uid = require('./_uid');\nvar Symbol = require('./_global').Symbol;\nvar USE_SYMBOL = typeof Symbol == 'function';\n\nvar $exports = module.exports = function (name) {\n  return store[name] || (store[name] =\n    USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n\n$exports.store = store;\n","var core = require('./_core');\nvar global = require('./_global');\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\n\n(module.exports = function (key, value) {\n  return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n  version: core.version,\n  mode: require('./_library') ? 'pure' : 'global',\n  copyright: '漏 2018 Denis Pushkarev (zloirock.ru)'\n});\n","module.exports = false;\n","// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n  if (it == undefined) throw TypeError(\"Can't call method on  \" + it);\n  return it;\n};\n","var MATCH = require('./_wks')('match');\nmodule.exports = function (KEY) {\n  var re = /./;\n  try {\n    '/./'[KEY](re);\n  } catch (e) {\n    try {\n      re[MATCH] = false;\n      return !'/./'[KEY](re);\n    } catch (f) { /* empty */ }\n  } return true;\n};\n","require('../../modules/es7.array.includes');\nmodule.exports = require('../../modules/_core').Array.includes;\n","'use strict';\n// https://github.com/tc39/Array.prototype.includes\nvar $export = require('./_export');\nvar $includes = require('./_array-includes')(true);\n\n$export($export.P, 'Array', {\n  includes: function includes(el /* , fromIndex = 0 */) {\n    return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n\nrequire('./_add-to-unscopables')('includes');\n","// false -> Array#indexOf\n// true  -> Array#includes\nvar toIObject = require('./_to-iobject');\nvar toLength = require('./_to-length');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nmodule.exports = function (IS_INCLUDES) {\n  return function ($this, el, fromIndex) {\n    var O = toIObject($this);\n    var length = toLength(O.length);\n    var index = toAbsoluteIndex(fromIndex, length);\n    var value;\n    // Array#includes uses SameValueZero equality algorithm\n    // eslint-disable-next-line no-self-compare\n    if (IS_INCLUDES && el != el) while (length > index) {\n      value = O[index++];\n      // eslint-disable-next-line no-self-compare\n      if (value != value) return true;\n    // Array#indexOf ignores holes, Array#includes - not\n    } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n      if (O[index] === el) return IS_INCLUDES || index || 0;\n    } return !IS_INCLUDES && -1;\n  };\n};\n","// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = require('./_iobject');\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n  return IObject(defined(it));\n};\n","// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = require('./_cof');\n// eslint-disable-next-line no-prototype-builtins\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n  return cof(it) == 'String' ? it.split('') : Object(it);\n};\n","// 7.1.15 ToLength\nvar toInteger = require('./_to-integer');\nvar min = Math.min;\nmodule.exports = function (it) {\n  return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n","// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nmodule.exports = function (it) {\n  return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n","var toInteger = require('./_to-integer');\nvar max = Math.max;\nvar min = Math.min;\nmodule.exports = function (index, length) {\n  index = toInteger(index);\n  return index < 0 ? max(index + length, 0) : min(index, length);\n};\n","// 22.1.3.31 Array.prototype[@@unscopables]\nvar UNSCOPABLES = require('./_wks')('unscopables');\nvar ArrayProto = Array.prototype;\nif (ArrayProto[UNSCOPABLES] == undefined) require('./_hide')(ArrayProto, UNSCOPABLES, {});\nmodule.exports = function (key) {\n  ArrayProto[UNSCOPABLES][key] = true;\n};\n","require('../../modules/es6.object.assign');\nmodule.exports = require('../../modules/_core').Object.assign;\n","// 19.1.3.1 Object.assign(target, source)\nvar $export = require('./_export');\n\n$export($export.S + $export.F, 'Object', { assign: require('./_object-assign') });\n","'use strict';\n// 19.1.2.1 Object.assign(target, source, ...)\nvar getKeys = require('./_object-keys');\nvar gOPS = require('./_object-gops');\nvar pIE = require('./_object-pie');\nvar toObject = require('./_to-object');\nvar IObject = require('./_iobject');\nvar $assign = Object.assign;\n\n// should work with symbols and should have deterministic property order (V8 bug)\nmodule.exports = !$assign || require('./_fails')(function () {\n  var A = {};\n  var B = {};\n  // eslint-disable-next-line no-undef\n  var S = Symbol();\n  var K = 'abcdefghijklmnopqrst';\n  A[S] = 7;\n  K.split('').forEach(function (k) { B[k] = k; });\n  return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n  var T = toObject(target);\n  var aLen = arguments.length;\n  var index = 1;\n  var getSymbols = gOPS.f;\n  var isEnum = pIE.f;\n  while (aLen > index) {\n    var S = IObject(arguments[index++]);\n    var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S);\n    var length = keys.length;\n    var j = 0;\n    var key;\n    while (length > j) if (isEnum.call(S, key = keys[j++])) T[key] = S[key];\n  } return T;\n} : $assign;\n","// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = require('./_object-keys-internal');\nvar enumBugKeys = require('./_enum-bug-keys');\n\nmodule.exports = Object.keys || function keys(O) {\n  return $keys(O, enumBugKeys);\n};\n","var has = require('./_has');\nvar toIObject = require('./_to-iobject');\nvar arrayIndexOf = require('./_array-includes')(false);\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\n\nmodule.exports = function (object, names) {\n  var O = toIObject(object);\n  var i = 0;\n  var result = [];\n  var key;\n  for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);\n  // Don't enum bug & hidden keys\n  while (names.length > i) if (has(O, key = names[i++])) {\n    ~arrayIndexOf(result, key) || result.push(key);\n  }\n  return result;\n};\n","var shared = require('./_shared')('keys');\nvar uid = require('./_uid');\nmodule.exports = function (key) {\n  return shared[key] || (shared[key] = uid(key));\n};\n","// IE 8- don't enum bug keys\nmodule.exports = (\n  'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n","exports.f = Object.getOwnPropertySymbols;\n","exports.f = {}.propertyIsEnumerable;\n","// 7.1.13 ToObject(argument)\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n  return Object(defined(it));\n};\n","require('../../modules/es6.math.log2');\nmodule.exports = require('../../modules/_core').Math.log2;\n","// 20.2.2.22 Math.log2(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n  log2: function log2(x) {\n    return Math.log(x) / Math.LN2;\n  }\n});\n","require('../../modules/es6.number.is-nan');\nmodule.exports = require('../../modules/_core').Number.isNaN;\n","// 20.1.2.4 Number.isNaN(number)\nvar $export = require('./_export');\n\n$export($export.S, 'Number', {\n  isNaN: function isNaN(number) {\n    // eslint-disable-next-line no-self-compare\n    return number != number;\n  }\n});\n","require('../../modules/es6.number.is-integer');\nmodule.exports = require('../../modules/_core').Number.isInteger;\n","// 20.1.2.3 Number.isInteger(number)\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { isInteger: require('./_is-integer') });\n","// 20.1.2.3 Number.isInteger(number)\nvar isObject = require('./_is-object');\nvar floor = Math.floor;\nmodule.exports = function isInteger(it) {\n  return !isObject(it) && isFinite(it) && floor(it) === it;\n};\n","require('../modules/es6.object.to-string');\nrequire('../modules/es6.string.iterator');\nrequire('../modules/web.dom.iterable');\nrequire('../modules/es6.promise');\nrequire('../modules/es7.promise.finally');\nrequire('../modules/es7.promise.try');\nmodule.exports = require('../modules/_core').Promise;\n","'use strict';\n// 19.1.3.6 Object.prototype.toString()\nvar classof = require('./_classof');\nvar test = {};\ntest[require('./_wks')('toStringTag')] = 'z';\nif (test + '' != '[object z]') {\n  require('./_redefine')(Object.prototype, 'toString', function toString() {\n    return '[object ' + classof(this) + ']';\n  }, true);\n}\n","// getting tag from 19.1.3.6 Object.prototype.toString()\nvar cof = require('./_cof');\nvar TAG = require('./_wks')('toStringTag');\n// ES3 wrong here\nvar ARG = cof(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n  try {\n    return it[key];\n  } catch (e) { /* empty */ }\n};\n\nmodule.exports = function (it) {\n  var O, T, B;\n  return it === undefined ? 'Undefined' : it === null ? 'Null'\n    // @@toStringTag case\n    : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T\n    // builtinTag case\n    : ARG ? cof(O)\n    // ES3 arguments fallback\n    : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n};\n","'use strict';\nvar $at = require('./_string-at')(true);\n\n// 21.1.3.27 String.prototype[@@iterator]()\nrequire('./_iter-define')(String, 'String', function (iterated) {\n  this._t = String(iterated); // target\n  this._i = 0;                // next index\n// 21.1.5.2.1 %StringIteratorPrototype%.next()\n}, function () {\n  var O = this._t;\n  var index = this._i;\n  var point;\n  if (index >= O.length) return { value: undefined, done: true };\n  point = $at(O, index);\n  this._i += point.length;\n  return { value: point, done: false };\n});\n","var toInteger = require('./_to-integer');\nvar defined = require('./_defined');\n// true  -> String#at\n// false -> String#codePointAt\nmodule.exports = function (TO_STRING) {\n  return function (that, pos) {\n    var s = String(defined(that));\n    var i = toInteger(pos);\n    var l = s.length;\n    var a, b;\n    if (i < 0 || i >= l) return TO_STRING ? '' : undefined;\n    a = s.charCodeAt(i);\n    return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n      ? TO_STRING ? s.charAt(i) : a\n      : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n  };\n};\n","'use strict';\nvar LIBRARY = require('./_library');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar hide = require('./_hide');\nvar Iterators = require('./_iterators');\nvar $iterCreate = require('./_iter-create');\nvar setToStringTag = require('./_set-to-string-tag');\nvar getPrototypeOf = require('./_object-gpo');\nvar ITERATOR = require('./_wks')('iterator');\nvar BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`\nvar FF_ITERATOR = '@@iterator';\nvar KEYS = 'keys';\nvar VALUES = 'values';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {\n  $iterCreate(Constructor, NAME, next);\n  var getMethod = function (kind) {\n    if (!BUGGY && kind in proto) return proto[kind];\n    switch (kind) {\n      case KEYS: return function keys() { return new Constructor(this, kind); };\n      case VALUES: return function values() { return new Constructor(this, kind); };\n    } return function entries() { return new Constructor(this, kind); };\n  };\n  var TAG = NAME + ' Iterator';\n  var DEF_VALUES = DEFAULT == VALUES;\n  var VALUES_BUG = false;\n  var proto = Base.prototype;\n  var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];\n  var $default = $native || getMethod(DEFAULT);\n  var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;\n  var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;\n  var methods, key, IteratorPrototype;\n  // Fix native\n  if ($anyNative) {\n    IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));\n    if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {\n      // Set @@toStringTag to native iterators\n      setToStringTag(IteratorPrototype, TAG, true);\n      // fix for some old engines\n      if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);\n    }\n  }\n  // fix Array#{values, @@iterator}.name in V8 / FF\n  if (DEF_VALUES && $native && $native.name !== VALUES) {\n    VALUES_BUG = true;\n    $default = function values() { return $native.call(this); };\n  }\n  // Define iterator\n  if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {\n    hide(proto, ITERATOR, $default);\n  }\n  // Plug for library\n  Iterators[NAME] = $default;\n  Iterators[TAG] = returnThis;\n  if (DEFAULT) {\n    methods = {\n      values: DEF_VALUES ? $default : getMethod(VALUES),\n      keys: IS_SET ? $default : getMethod(KEYS),\n      entries: $entries\n    };\n    if (FORCED) for (key in methods) {\n      if (!(key in proto)) redefine(proto, key, methods[key]);\n    } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n  }\n  return methods;\n};\n","module.exports = {};\n","'use strict';\nvar create = require('./_object-create');\nvar descriptor = require('./_property-desc');\nvar setToStringTag = require('./_set-to-string-tag');\nvar IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\nrequire('./_hide')(IteratorPrototype, require('./_wks')('iterator'), function () { return this; });\n\nmodule.exports = function (Constructor, NAME, next) {\n  Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });\n  setToStringTag(Constructor, NAME + ' Iterator');\n};\n","// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = require('./_an-object');\nvar dPs = require('./_object-dps');\nvar enumBugKeys = require('./_enum-bug-keys');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar Empty = function () { /* empty */ };\nvar PROTOTYPE = 'prototype';\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n  // Thrash, waste and sodomy: IE GC bug\n  var iframe = require('./_dom-create')('iframe');\n  var i = enumBugKeys.length;\n  var lt = '<';\n  var gt = '>';\n  var iframeDocument;\n  iframe.style.display = 'none';\n  require('./_html').appendChild(iframe);\n  iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n  // createDict = iframe.contentWindow.Object;\n  // html.removeChild(iframe);\n  iframeDocument = iframe.contentWindow.document;\n  iframeDocument.open();\n  iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n  iframeDocument.close();\n  createDict = iframeDocument.F;\n  while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];\n  return createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties) {\n  var result;\n  if (O !== null) {\n    Empty[PROTOTYPE] = anObject(O);\n    result = new Empty();\n    Empty[PROTOTYPE] = null;\n    // add \"__proto__\" for Object.getPrototypeOf polyfill\n    result[IE_PROTO] = O;\n  } else result = createDict();\n  return Properties === undefined ? result : dPs(result, Properties);\n};\n","var dP = require('./_object-dp');\nvar anObject = require('./_an-object');\nvar getKeys = require('./_object-keys');\n\nmodule.exports = require('./_descriptors') ? Object.defineProperties : function defineProperties(O, Properties) {\n  anObject(O);\n  var keys = getKeys(Properties);\n  var length = keys.length;\n  var i = 0;\n  var P;\n  while (length > i) dP.f(O, P = keys[i++], Properties[P]);\n  return O;\n};\n","var document = require('./_global').document;\nmodule.exports = document && document.documentElement;\n","var def = require('./_object-dp').f;\nvar has = require('./_has');\nvar TAG = require('./_wks')('toStringTag');\n\nmodule.exports = function (it, tag, stat) {\n  if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });\n};\n","// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nvar has = require('./_has');\nvar toObject = require('./_to-object');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar ObjectProto = Object.prototype;\n\nmodule.exports = Object.getPrototypeOf || function (O) {\n  O = toObject(O);\n  if (has(O, IE_PROTO)) return O[IE_PROTO];\n  if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n    return O.constructor.prototype;\n  } return O instanceof Object ? ObjectProto : null;\n};\n","var $iterators = require('./es6.array.iterator');\nvar getKeys = require('./_object-keys');\nvar redefine = require('./_redefine');\nvar global = require('./_global');\nvar hide = require('./_hide');\nvar Iterators = require('./_iterators');\nvar wks = require('./_wks');\nvar ITERATOR = wks('iterator');\nvar TO_STRING_TAG = wks('toStringTag');\nvar ArrayValues = Iterators.Array;\n\nvar DOMIterables = {\n  CSSRuleList: true, // TODO: Not spec compliant, should be false.\n  CSSStyleDeclaration: false,\n  CSSValueList: false,\n  ClientRectList: false,\n  DOMRectList: false,\n  DOMStringList: false,\n  DOMTokenList: true,\n  DataTransferItemList: false,\n  FileList: false,\n  HTMLAllCollection: false,\n  HTMLCollection: false,\n  HTMLFormElement: false,\n  HTMLSelectElement: false,\n  MediaList: true, // TODO: Not spec compliant, should be false.\n  MimeTypeArray: false,\n  NamedNodeMap: false,\n  NodeList: true,\n  PaintRequestList: false,\n  Plugin: false,\n  PluginArray: false,\n  SVGLengthList: false,\n  SVGNumberList: false,\n  SVGPathSegList: false,\n  SVGPointList: false,\n  SVGStringList: false,\n  SVGTransformList: false,\n  SourceBufferList: false,\n  StyleSheetList: true, // TODO: Not spec compliant, should be false.\n  TextTrackCueList: false,\n  TextTrackList: false,\n  TouchList: false\n};\n\nfor (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) {\n  var NAME = collections[i];\n  var explicit = DOMIterables[NAME];\n  var Collection = global[NAME];\n  var proto = Collection && Collection.prototype;\n  var key;\n  if (proto) {\n    if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues);\n    if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);\n    Iterators[NAME] = ArrayValues;\n    if (explicit) for (key in $iterators) if (!proto[key]) redefine(proto, key, $iterators[key], true);\n  }\n}\n","'use strict';\nvar addToUnscopables = require('./_add-to-unscopables');\nvar step = require('./_iter-step');\nvar Iterators = require('./_iterators');\nvar toIObject = require('./_to-iobject');\n\n// 22.1.3.4 Array.prototype.entries()\n// 22.1.3.13 Array.prototype.keys()\n// 22.1.3.29 Array.prototype.values()\n// 22.1.3.30 Array.prototype[@@iterator]()\nmodule.exports = require('./_iter-define')(Array, 'Array', function (iterated, kind) {\n  this._t = toIObject(iterated); // target\n  this._i = 0;                   // next index\n  this._k = kind;                // kind\n// 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n}, function () {\n  var O = this._t;\n  var kind = this._k;\n  var index = this._i++;\n  if (!O || index >= O.length) {\n    this._t = undefined;\n    return step(1);\n  }\n  if (kind == 'keys') return step(0, index);\n  if (kind == 'values') return step(0, O[index]);\n  return step(0, [index, O[index]]);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\nIterators.Arguments = Iterators.Array;\n\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n","module.exports = function (done, value) {\n  return { value: value, done: !!done };\n};\n","'use strict';\nvar LIBRARY = require('./_library');\nvar global = require('./_global');\nvar ctx = require('./_ctx');\nvar classof = require('./_classof');\nvar $export = require('./_export');\nvar isObject = require('./_is-object');\nvar aFunction = require('./_a-function');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar speciesConstructor = require('./_species-constructor');\nvar task = require('./_task').set;\nvar microtask = require('./_microtask')();\nvar newPromiseCapabilityModule = require('./_new-promise-capability');\nvar perform = require('./_perform');\nvar userAgent = require('./_user-agent');\nvar promiseResolve = require('./_promise-resolve');\nvar PROMISE = 'Promise';\nvar TypeError = global.TypeError;\nvar process = global.process;\nvar versions = process && process.versions;\nvar v8 = versions && versions.v8 || '';\nvar $Promise = global[PROMISE];\nvar isNode = classof(process) == 'process';\nvar empty = function () { /* empty */ };\nvar Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;\nvar newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f;\n\nvar USE_NATIVE = !!function () {\n  try {\n    // correct subclassing with @@species support\n    var promise = $Promise.resolve(1);\n    var FakePromise = (promise.constructor = {})[require('./_wks')('species')] = function (exec) {\n      exec(empty, empty);\n    };\n    // unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n    return (isNode || typeof PromiseRejectionEvent == 'function')\n      && promise.then(empty) instanceof FakePromise\n      // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables\n      // https://bugs.chromium.org/p/chromium/issues/detail?id=830565\n      // we can't detect it synchronously, so just check versions\n      && v8.indexOf('6.6') !== 0\n      && userAgent.indexOf('Chrome/66') === -1;\n  } catch (e) { /* empty */ }\n}();\n\n// helpers\nvar isThenable = function (it) {\n  var then;\n  return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\nvar notify = function (promise, isReject) {\n  if (promise._n) return;\n  promise._n = true;\n  var chain = promise._c;\n  microtask(function () {\n    var value = promise._v;\n    var ok = promise._s == 1;\n    var i = 0;\n    var run = function (reaction) {\n      var handler = ok ? reaction.ok : reaction.fail;\n      var resolve = reaction.resolve;\n      var reject = reaction.reject;\n      var domain = reaction.domain;\n      var result, then, exited;\n      try {\n        if (handler) {\n          if (!ok) {\n            if (promise._h == 2) onHandleUnhandled(promise);\n            promise._h = 1;\n          }\n          if (handler === true) result = value;\n          else {\n            if (domain) domain.enter();\n            result = handler(value); // may throw\n            if (domain) {\n              domain.exit();\n              exited = true;\n            }\n          }\n          if (result === reaction.promise) {\n            reject(TypeError('Promise-chain cycle'));\n          } else if (then = isThenable(result)) {\n            then.call(result, resolve, reject);\n          } else resolve(result);\n        } else reject(value);\n      } catch (e) {\n        if (domain && !exited) domain.exit();\n        reject(e);\n      }\n    };\n    while (chain.length > i) run(chain[i++]); // variable length - can't use forEach\n    promise._c = [];\n    promise._n = false;\n    if (isReject && !promise._h) onUnhandled(promise);\n  });\n};\nvar onUnhandled = function (promise) {\n  task.call(global, function () {\n    var value = promise._v;\n    var unhandled = isUnhandled(promise);\n    var result, handler, console;\n    if (unhandled) {\n      result = perform(function () {\n        if (isNode) {\n          process.emit('unhandledRejection', value, promise);\n        } else if (handler = global.onunhandledrejection) {\n          handler({ promise: promise, reason: value });\n        } else if ((console = global.console) && console.error) {\n          console.error('Unhandled promise rejection', value);\n        }\n      });\n      // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n      promise._h = isNode || isUnhandled(promise) ? 2 : 1;\n    } promise._a = undefined;\n    if (unhandled && result.e) throw result.v;\n  });\n};\nvar isUnhandled = function (promise) {\n  return promise._h !== 1 && (promise._a || promise._c).length === 0;\n};\nvar onHandleUnhandled = function (promise) {\n  task.call(global, function () {\n    var handler;\n    if (isNode) {\n      process.emit('rejectionHandled', promise);\n    } else if (handler = global.onrejectionhandled) {\n      handler({ promise: promise, reason: promise._v });\n    }\n  });\n};\nvar $reject = function (value) {\n  var promise = this;\n  if (promise._d) return;\n  promise._d = true;\n  promise = promise._w || promise; // unwrap\n  promise._v = value;\n  promise._s = 2;\n  if (!promise._a) promise._a = promise._c.slice();\n  notify(promise, true);\n};\nvar $resolve = function (value) {\n  var promise = this;\n  var then;\n  if (promise._d) return;\n  promise._d = true;\n  promise = promise._w || promise; // unwrap\n  try {\n    if (promise === value) throw TypeError(\"Promise can't be resolved itself\");\n    if (then = isThenable(value)) {\n      microtask(function () {\n        var wrapper = { _w: promise, _d: false }; // wrap\n        try {\n          then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));\n        } catch (e) {\n          $reject.call(wrapper, e);\n        }\n      });\n    } else {\n      promise._v = value;\n      promise._s = 1;\n      notify(promise, false);\n    }\n  } catch (e) {\n    $reject.call({ _w: promise, _d: false }, e); // wrap\n  }\n};\n\n// constructor polyfill\nif (!USE_NATIVE) {\n  // 25.4.3.1 Promise(executor)\n  $Promise = function Promise(executor) {\n    anInstance(this, $Promise, PROMISE, '_h');\n    aFunction(executor);\n    Internal.call(this);\n    try {\n      executor(ctx($resolve, this, 1), ctx($reject, this, 1));\n    } catch (err) {\n      $reject.call(this, err);\n    }\n  };\n  // eslint-disable-next-line no-unused-vars\n  Internal = function Promise(executor) {\n    this._c = [];             // <- awaiting reactions\n    this._a = undefined;      // <- checked in isUnhandled reactions\n    this._s = 0;              // <- state\n    this._d = false;          // <- done\n    this._v = undefined;      // <- value\n    this._h = 0;              // <- rejection state, 0 - default, 1 - handled, 2 - unhandled\n    this._n = false;          // <- notify\n  };\n  Internal.prototype = require('./_redefine-all')($Promise.prototype, {\n    // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)\n    then: function then(onFulfilled, onRejected) {\n      var reaction = newPromiseCapability(speciesConstructor(this, $Promise));\n      reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n      reaction.fail = typeof onRejected == 'function' && onRejected;\n      reaction.domain = isNode ? process.domain : undefined;\n      this._c.push(reaction);\n      if (this._a) this._a.push(reaction);\n      if (this._s) notify(this, false);\n      return reaction.promise;\n    },\n    // 25.4.5.1 Promise.prototype.catch(onRejected)\n    'catch': function (onRejected) {\n      return this.then(undefined, onRejected);\n    }\n  });\n  OwnPromiseCapability = function () {\n    var promise = new Internal();\n    this.promise = promise;\n    this.resolve = ctx($resolve, promise, 1);\n    this.reject = ctx($reject, promise, 1);\n  };\n  newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n    return C === $Promise || C === Wrapper\n      ? new OwnPromiseCapability(C)\n      : newGenericPromiseCapability(C);\n  };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Promise: $Promise });\nrequire('./_set-to-string-tag')($Promise, PROMISE);\nrequire('./_set-species')(PROMISE);\nWrapper = require('./_core')[PROMISE];\n\n// statics\n$export($export.S + $export.F * !USE_NATIVE, PROMISE, {\n  // 25.4.4.5 Promise.reject(r)\n  reject: function reject(r) {\n    var capability = newPromiseCapability(this);\n    var $$reject = capability.reject;\n    $$reject(r);\n    return capability.promise;\n  }\n});\n$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, {\n  // 25.4.4.6 Promise.resolve(x)\n  resolve: function resolve(x) {\n    return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x);\n  }\n});\n$export($export.S + $export.F * !(USE_NATIVE && require('./_iter-detect')(function (iter) {\n  $Promise.all(iter)['catch'](empty);\n})), PROMISE, {\n  // 25.4.4.1 Promise.all(iterable)\n  all: function all(iterable) {\n    var C = this;\n    var capability = newPromiseCapability(C);\n    var resolve = capability.resolve;\n    var reject = capability.reject;\n    var result = perform(function () {\n      var values = [];\n      var index = 0;\n      var remaining = 1;\n      forOf(iterable, false, function (promise) {\n        var $index = index++;\n        var alreadyCalled = false;\n        values.push(undefined);\n        remaining++;\n        C.resolve(promise).then(function (value) {\n          if (alreadyCalled) return;\n          alreadyCalled = true;\n          values[$index] = value;\n          --remaining || resolve(values);\n        }, reject);\n      });\n      --remaining || resolve(values);\n    });\n    if (result.e) reject(result.v);\n    return capability.promise;\n  },\n  // 25.4.4.4 Promise.race(iterable)\n  race: function race(iterable) {\n    var C = this;\n    var capability = newPromiseCapability(C);\n    var reject = capability.reject;\n    var result = perform(function () {\n      forOf(iterable, false, function (promise) {\n        C.resolve(promise).then(capability.resolve, reject);\n      });\n    });\n    if (result.e) reject(result.v);\n    return capability.promise;\n  }\n});\n","module.exports = function (it, Constructor, name, forbiddenField) {\n  if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) {\n    throw TypeError(name + ': incorrect invocation!');\n  } return it;\n};\n","var ctx = require('./_ctx');\nvar call = require('./_iter-call');\nvar isArrayIter = require('./_is-array-iter');\nvar anObject = require('./_an-object');\nvar toLength = require('./_to-length');\nvar getIterFn = require('./core.get-iterator-method');\nvar BREAK = {};\nvar RETURN = {};\nvar exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {\n  var iterFn = ITERATOR ? function () { return iterable; } : getIterFn(iterable);\n  var f = ctx(fn, that, entries ? 2 : 1);\n  var index = 0;\n  var length, step, iterator, result;\n  if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');\n  // fast case for arrays with default iterator\n  if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) {\n    result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);\n    if (result === BREAK || result === RETURN) return result;\n  } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {\n    result = call(iterator, f, step.value, entries);\n    if (result === BREAK || result === RETURN) return result;\n  }\n};\nexports.BREAK = BREAK;\nexports.RETURN = RETURN;\n","// call something on iterator step with safe closing on error\nvar anObject = require('./_an-object');\nmodule.exports = function (iterator, fn, value, entries) {\n  try {\n    return entries ? fn(anObject(value)[0], value[1]) : fn(value);\n  // 7.4.6 IteratorClose(iterator, completion)\n  } catch (e) {\n    var ret = iterator['return'];\n    if (ret !== undefined) anObject(ret.call(iterator));\n    throw e;\n  }\n};\n","// check on default Array iterator\nvar Iterators = require('./_iterators');\nvar ITERATOR = require('./_wks')('iterator');\nvar ArrayProto = Array.prototype;\n\nmodule.exports = function (it) {\n  return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);\n};\n","var classof = require('./_classof');\nvar ITERATOR = require('./_wks')('iterator');\nvar Iterators = require('./_iterators');\nmodule.exports = require('./_core').getIteratorMethod = function (it) {\n  if (it != undefined) return it[ITERATOR]\n    || it['@@iterator']\n    || Iterators[classof(it)];\n};\n","// 7.3.20 SpeciesConstructor(O, defaultConstructor)\nvar anObject = require('./_an-object');\nvar aFunction = require('./_a-function');\nvar SPECIES = require('./_wks')('species');\nmodule.exports = function (O, D) {\n  var C = anObject(O).constructor;\n  var S;\n  return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);\n};\n","var ctx = require('./_ctx');\nvar invoke = require('./_invoke');\nvar html = require('./_html');\nvar cel = require('./_dom-create');\nvar global = require('./_global');\nvar process = global.process;\nvar setTask = global.setImmediate;\nvar clearTask = global.clearImmediate;\nvar MessageChannel = global.MessageChannel;\nvar Dispatch = global.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\nvar run = function () {\n  var id = +this;\n  // eslint-disable-next-line no-prototype-builtins\n  if (queue.hasOwnProperty(id)) {\n    var fn = queue[id];\n    delete queue[id];\n    fn();\n  }\n};\nvar listener = function (event) {\n  run.call(event.data);\n};\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!setTask || !clearTask) {\n  setTask = function setImmediate(fn) {\n    var args = [];\n    var i = 1;\n    while (arguments.length > i) args.push(arguments[i++]);\n    queue[++counter] = function () {\n      // eslint-disable-next-line no-new-func\n      invoke(typeof fn == 'function' ? fn : Function(fn), args);\n    };\n    defer(counter);\n    return counter;\n  };\n  clearTask = function clearImmediate(id) {\n    delete queue[id];\n  };\n  // Node.js 0.8-\n  if (require('./_cof')(process) == 'process') {\n    defer = function (id) {\n      process.nextTick(ctx(run, id, 1));\n    };\n  // Sphere (JS game engine) Dispatch API\n  } else if (Dispatch && Dispatch.now) {\n    defer = function (id) {\n      Dispatch.now(ctx(run, id, 1));\n    };\n  // Browsers with MessageChannel, includes WebWorkers\n  } else if (MessageChannel) {\n    channel = new MessageChannel();\n    port = channel.port2;\n    channel.port1.onmessage = listener;\n    defer = ctx(port.postMessage, port, 1);\n  // Browsers with postMessage, skip WebWorkers\n  // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n  } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) {\n    defer = function (id) {\n      global.postMessage(id + '', '*');\n    };\n    global.addEventListener('message', listener, false);\n  // IE8-\n  } else if (ONREADYSTATECHANGE in cel('script')) {\n    defer = function (id) {\n      html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () {\n        html.removeChild(this);\n        run.call(id);\n      };\n    };\n  // Rest old browsers\n  } else {\n    defer = function (id) {\n      setTimeout(ctx(run, id, 1), 0);\n    };\n  }\n}\nmodule.exports = {\n  set: setTask,\n  clear: clearTask\n};\n","// fast apply, http://jsperf.lnkit.com/fast-apply/5\nmodule.exports = function (fn, args, that) {\n  var un = that === undefined;\n  switch (args.length) {\n    case 0: return un ? fn()\n                      : fn.call(that);\n    case 1: return un ? fn(args[0])\n                      : fn.call(that, args[0]);\n    case 2: return un ? fn(args[0], args[1])\n                      : fn.call(that, args[0], args[1]);\n    case 3: return un ? fn(args[0], args[1], args[2])\n                      : fn.call(that, args[0], args[1], args[2]);\n    case 4: return un ? fn(args[0], args[1], args[2], args[3])\n                      : fn.call(that, args[0], args[1], args[2], args[3]);\n  } return fn.apply(that, args);\n};\n","var global = require('./_global');\nvar macrotask = require('./_task').set;\nvar Observer = global.MutationObserver || global.WebKitMutationObserver;\nvar process = global.process;\nvar Promise = global.Promise;\nvar isNode = require('./_cof')(process) == 'process';\n\nmodule.exports = function () {\n  var head, last, notify;\n\n  var flush = function () {\n    var parent, fn;\n    if (isNode && (parent = process.domain)) parent.exit();\n    while (head) {\n      fn = head.fn;\n      head = head.next;\n      try {\n        fn();\n      } catch (e) {\n        if (head) notify();\n        else last = undefined;\n        throw e;\n      }\n    } last = undefined;\n    if (parent) parent.enter();\n  };\n\n  // Node.js\n  if (isNode) {\n    notify = function () {\n      process.nextTick(flush);\n    };\n  // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339\n  } else if (Observer && !(global.navigator && global.navigator.standalone)) {\n    var toggle = true;\n    var node = document.createTextNode('');\n    new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new\n    notify = function () {\n      node.data = toggle = !toggle;\n    };\n  // environments with maybe non-completely correct, but existent Promise\n  } else if (Promise && Promise.resolve) {\n    // Promise.resolve without an argument throws an error in LG WebOS 2\n    var promise = Promise.resolve(undefined);\n    notify = function () {\n      promise.then(flush);\n    };\n  // for other environments - macrotask based on:\n  // - setImmediate\n  // - MessageChannel\n  // - window.postMessag\n  // - onreadystatechange\n  // - setTimeout\n  } else {\n    notify = function () {\n      // strange IE + webpack dev server bug - use .call(global)\n      macrotask.call(global, flush);\n    };\n  }\n\n  return function (fn) {\n    var task = { fn: fn, next: undefined };\n    if (last) last.next = task;\n    if (!head) {\n      head = task;\n      notify();\n    } last = task;\n  };\n};\n","'use strict';\n// 25.4.1.5 NewPromiseCapability(C)\nvar aFunction = require('./_a-function');\n\nfunction PromiseCapability(C) {\n  var resolve, reject;\n  this.promise = new C(function ($$resolve, $$reject) {\n    if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n    resolve = $$resolve;\n    reject = $$reject;\n  });\n  this.resolve = aFunction(resolve);\n  this.reject = aFunction(reject);\n}\n\nmodule.exports.f = function (C) {\n  return new PromiseCapability(C);\n};\n","module.exports = function (exec) {\n  try {\n    return { e: false, v: exec() };\n  } catch (e) {\n    return { e: true, v: e };\n  }\n};\n","var global = require('./_global');\nvar navigator = global.navigator;\n\nmodule.exports = navigator && navigator.userAgent || '';\n","var anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar newPromiseCapability = require('./_new-promise-capability');\n\nmodule.exports = function (C, x) {\n  anObject(C);\n  if (isObject(x) && x.constructor === C) return x;\n  var promiseCapability = newPromiseCapability.f(C);\n  var resolve = promiseCapability.resolve;\n  resolve(x);\n  return promiseCapability.promise;\n};\n","var redefine = require('./_redefine');\nmodule.exports = function (target, src, safe) {\n  for (var key in src) redefine(target, key, src[key], safe);\n  return target;\n};\n","'use strict';\nvar global = require('./_global');\nvar dP = require('./_object-dp');\nvar DESCRIPTORS = require('./_descriptors');\nvar SPECIES = require('./_wks')('species');\n\nmodule.exports = function (KEY) {\n  var C = global[KEY];\n  if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, {\n    configurable: true,\n    get: function () { return this; }\n  });\n};\n","var ITERATOR = require('./_wks')('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n  var riter = [7][ITERATOR]();\n  riter['return'] = function () { SAFE_CLOSING = true; };\n  // eslint-disable-next-line no-throw-literal\n  Array.from(riter, function () { throw 2; });\n} catch (e) { /* empty */ }\n\nmodule.exports = function (exec, skipClosing) {\n  if (!skipClosing && !SAFE_CLOSING) return false;\n  var safe = false;\n  try {\n    var arr = [7];\n    var iter = arr[ITERATOR]();\n    iter.next = function () { return { done: safe = true }; };\n    arr[ITERATOR] = function () { return iter; };\n    exec(arr);\n  } catch (e) { /* empty */ }\n  return safe;\n};\n","// https://github.com/tc39/proposal-promise-finally\n'use strict';\nvar $export = require('./_export');\nvar core = require('./_core');\nvar global = require('./_global');\nvar speciesConstructor = require('./_species-constructor');\nvar promiseResolve = require('./_promise-resolve');\n\n$export($export.P + $export.R, 'Promise', { 'finally': function (onFinally) {\n  var C = speciesConstructor(this, core.Promise || global.Promise);\n  var isFunction = typeof onFinally == 'function';\n  return this.then(\n    isFunction ? function (x) {\n      return promiseResolve(C, onFinally()).then(function () { return x; });\n    } : onFinally,\n    isFunction ? function (e) {\n      return promiseResolve(C, onFinally()).then(function () { throw e; });\n    } : onFinally\n  );\n} });\n","'use strict';\n// https://github.com/tc39/proposal-promise-try\nvar $export = require('./_export');\nvar newPromiseCapability = require('./_new-promise-capability');\nvar perform = require('./_perform');\n\n$export($export.S, 'Promise', { 'try': function (callbackfn) {\n  var promiseCapability = newPromiseCapability.f(this);\n  var result = perform(callbackfn);\n  (result.e ? promiseCapability.reject : promiseCapability.resolve)(result.v);\n  return promiseCapability.promise;\n} });\n","require('../modules/es6.object.to-string');\nrequire('../modules/web.dom.iterable');\nrequire('../modules/es6.weak-map');\nrequire('../modules/es7.weak-map.of');\nrequire('../modules/es7.weak-map.from');\nmodule.exports = require('../modules/_core').WeakMap;\n","'use strict';\nvar each = require('./_array-methods')(0);\nvar redefine = require('./_redefine');\nvar meta = require('./_meta');\nvar assign = require('./_object-assign');\nvar weak = require('./_collection-weak');\nvar isObject = require('./_is-object');\nvar fails = require('./_fails');\nvar validate = require('./_validate-collection');\nvar WEAK_MAP = 'WeakMap';\nvar getWeak = meta.getWeak;\nvar isExtensible = Object.isExtensible;\nvar uncaughtFrozenStore = weak.ufstore;\nvar tmp = {};\nvar InternalMap;\n\nvar wrapper = function (get) {\n  return function WeakMap() {\n    return get(this, arguments.length > 0 ? arguments[0] : undefined);\n  };\n};\n\nvar methods = {\n  // 23.3.3.3 WeakMap.prototype.get(key)\n  get: function get(key) {\n    if (isObject(key)) {\n      var data = getWeak(key);\n      if (data === true) return uncaughtFrozenStore(validate(this, WEAK_MAP)).get(key);\n      return data ? data[this._i] : undefined;\n    }\n  },\n  // 23.3.3.5 WeakMap.prototype.set(key, value)\n  set: function set(key, value) {\n    return weak.def(validate(this, WEAK_MAP), key, value);\n  }\n};\n\n// 23.3 WeakMap Objects\nvar $WeakMap = module.exports = require('./_collection')(WEAK_MAP, wrapper, methods, weak, true, true);\n\n// IE11 WeakMap frozen keys fix\nif (fails(function () { return new $WeakMap().set((Object.freeze || Object)(tmp), 7).get(tmp) != 7; })) {\n  InternalMap = weak.getConstructor(wrapper, WEAK_MAP);\n  assign(InternalMap.prototype, methods);\n  meta.NEED = true;\n  each(['delete', 'has', 'get', 'set'], function (key) {\n    var proto = $WeakMap.prototype;\n    var method = proto[key];\n    redefine(proto, key, function (a, b) {\n      // store frozen objects on internal weakmap shim\n      if (isObject(a) && !isExtensible(a)) {\n        if (!this._f) this._f = new InternalMap();\n        var result = this._f[key](a, b);\n        return key == 'set' ? this : result;\n      // store all the rest on native weakmap\n      } return method.call(this, a, b);\n    });\n  });\n}\n","// 0 -> Array#forEach\n// 1 -> Array#map\n// 2 -> Array#filter\n// 3 -> Array#some\n// 4 -> Array#every\n// 5 -> Array#find\n// 6 -> Array#findIndex\nvar ctx = require('./_ctx');\nvar IObject = require('./_iobject');\nvar toObject = require('./_to-object');\nvar toLength = require('./_to-length');\nvar asc = require('./_array-species-create');\nmodule.exports = function (TYPE, $create) {\n  var IS_MAP = TYPE == 1;\n  var IS_FILTER = TYPE == 2;\n  var IS_SOME = TYPE == 3;\n  var IS_EVERY = TYPE == 4;\n  var IS_FIND_INDEX = TYPE == 6;\n  var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n  var create = $create || asc;\n  return function ($this, callbackfn, that) {\n    var O = toObject($this);\n    var self = IObject(O);\n    var f = ctx(callbackfn, that, 3);\n    var length = toLength(self.length);\n    var index = 0;\n    var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n    var val, res;\n    for (;length > index; index++) if (NO_HOLES || index in self) {\n      val = self[index];\n      res = f(val, index, O);\n      if (TYPE) {\n        if (IS_MAP) result[index] = res;   // map\n        else if (res) switch (TYPE) {\n          case 3: return true;             // some\n          case 5: return val;              // find\n          case 6: return index;            // findIndex\n          case 2: result.push(val);        // filter\n        } else if (IS_EVERY) return false; // every\n      }\n    }\n    return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;\n  };\n};\n","// 9.4.2.3 ArraySpeciesCreate(originalArray, length)\nvar speciesConstructor = require('./_array-species-constructor');\n\nmodule.exports = function (original, length) {\n  return new (speciesConstructor(original))(length);\n};\n","var isObject = require('./_is-object');\nvar isArray = require('./_is-array');\nvar SPECIES = require('./_wks')('species');\n\nmodule.exports = function (original) {\n  var C;\n  if (isArray(original)) {\n    C = original.constructor;\n    // cross-realm fallback\n    if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n    if (isObject(C)) {\n      C = C[SPECIES];\n      if (C === null) C = undefined;\n    }\n  } return C === undefined ? Array : C;\n};\n","// 7.2.2 IsArray(argument)\nvar cof = require('./_cof');\nmodule.exports = Array.isArray || function isArray(arg) {\n  return cof(arg) == 'Array';\n};\n","var META = require('./_uid')('meta');\nvar isObject = require('./_is-object');\nvar has = require('./_has');\nvar setDesc = require('./_object-dp').f;\nvar id = 0;\nvar isExtensible = Object.isExtensible || function () {\n  return true;\n};\nvar FREEZE = !require('./_fails')(function () {\n  return isExtensible(Object.preventExtensions({}));\n});\nvar setMeta = function (it) {\n  setDesc(it, META, { value: {\n    i: 'O' + ++id, // object ID\n    w: {}          // weak collections IDs\n  } });\n};\nvar fastKey = function (it, create) {\n  // return primitive with prefix\n  if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n  if (!has(it, META)) {\n    // can't set metadata to uncaught frozen object\n    if (!isExtensible(it)) return 'F';\n    // not necessary to add metadata\n    if (!create) return 'E';\n    // add missing metadata\n    setMeta(it);\n  // return object ID\n  } return it[META].i;\n};\nvar getWeak = function (it, create) {\n  if (!has(it, META)) {\n    // can't set metadata to uncaught frozen object\n    if (!isExtensible(it)) return true;\n    // not necessary to add metadata\n    if (!create) return false;\n    // add missing metadata\n    setMeta(it);\n  // return hash weak collections IDs\n  } return it[META].w;\n};\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n  if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);\n  return it;\n};\nvar meta = module.exports = {\n  KEY: META,\n  NEED: false,\n  fastKey: fastKey,\n  getWeak: getWeak,\n  onFreeze: onFreeze\n};\n","'use strict';\nvar redefineAll = require('./_redefine-all');\nvar getWeak = require('./_meta').getWeak;\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar createArrayMethod = require('./_array-methods');\nvar $has = require('./_has');\nvar validate = require('./_validate-collection');\nvar arrayFind = createArrayMethod(5);\nvar arrayFindIndex = createArrayMethod(6);\nvar id = 0;\n\n// fallback for uncaught frozen keys\nvar uncaughtFrozenStore = function (that) {\n  return that._l || (that._l = new UncaughtFrozenStore());\n};\nvar UncaughtFrozenStore = function () {\n  this.a = [];\n};\nvar findUncaughtFrozen = function (store, key) {\n  return arrayFind(store.a, function (it) {\n    return it[0] === key;\n  });\n};\nUncaughtFrozenStore.prototype = {\n  get: function (key) {\n    var entry = findUncaughtFrozen(this, key);\n    if (entry) return entry[1];\n  },\n  has: function (key) {\n    return !!findUncaughtFrozen(this, key);\n  },\n  set: function (key, value) {\n    var entry = findUncaughtFrozen(this, key);\n    if (entry) entry[1] = value;\n    else this.a.push([key, value]);\n  },\n  'delete': function (key) {\n    var index = arrayFindIndex(this.a, function (it) {\n      return it[0] === key;\n    });\n    if (~index) this.a.splice(index, 1);\n    return !!~index;\n  }\n};\n\nmodule.exports = {\n  getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {\n    var C = wrapper(function (that, iterable) {\n      anInstance(that, C, NAME, '_i');\n      that._t = NAME;      // collection type\n      that._i = id++;      // collection id\n      that._l = undefined; // leak store for uncaught frozen objects\n      if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n    });\n    redefineAll(C.prototype, {\n      // 23.3.3.2 WeakMap.prototype.delete(key)\n      // 23.4.3.3 WeakSet.prototype.delete(value)\n      'delete': function (key) {\n        if (!isObject(key)) return false;\n        var data = getWeak(key);\n        if (data === true) return uncaughtFrozenStore(validate(this, NAME))['delete'](key);\n        return data && $has(data, this._i) && delete data[this._i];\n      },\n      // 23.3.3.4 WeakMap.prototype.has(key)\n      // 23.4.3.4 WeakSet.prototype.has(value)\n      has: function has(key) {\n        if (!isObject(key)) return false;\n        var data = getWeak(key);\n        if (data === true) return uncaughtFrozenStore(validate(this, NAME)).has(key);\n        return data && $has(data, this._i);\n      }\n    });\n    return C;\n  },\n  def: function (that, key, value) {\n    var data = getWeak(anObject(key), true);\n    if (data === true) uncaughtFrozenStore(that).set(key, value);\n    else data[that._i] = value;\n    return that;\n  },\n  ufstore: uncaughtFrozenStore\n};\n","var isObject = require('./_is-object');\nmodule.exports = function (it, TYPE) {\n  if (!isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!');\n  return it;\n};\n","'use strict';\nvar global = require('./_global');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar redefineAll = require('./_redefine-all');\nvar meta = require('./_meta');\nvar forOf = require('./_for-of');\nvar anInstance = require('./_an-instance');\nvar isObject = require('./_is-object');\nvar fails = require('./_fails');\nvar $iterDetect = require('./_iter-detect');\nvar setToStringTag = require('./_set-to-string-tag');\nvar inheritIfRequired = require('./_inherit-if-required');\n\nmodule.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {\n  var Base = global[NAME];\n  var C = Base;\n  var ADDER = IS_MAP ? 'set' : 'add';\n  var proto = C && C.prototype;\n  var O = {};\n  var fixMethod = function (KEY) {\n    var fn = proto[KEY];\n    redefine(proto, KEY,\n      KEY == 'delete' ? function (a) {\n        return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n      } : KEY == 'has' ? function has(a) {\n        return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n      } : KEY == 'get' ? function get(a) {\n        return IS_WEAK && !isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a);\n      } : KEY == 'add' ? function add(a) { fn.call(this, a === 0 ? 0 : a); return this; }\n        : function set(a, b) { fn.call(this, a === 0 ? 0 : a, b); return this; }\n    );\n  };\n  if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () {\n    new C().entries().next();\n  }))) {\n    // create collection constructor\n    C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);\n    redefineAll(C.prototype, methods);\n    meta.NEED = true;\n  } else {\n    var instance = new C();\n    // early implementations not supports chaining\n    var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance;\n    // V8 ~  Chromium 40- weak-collections throws on primitives, but should return false\n    var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); });\n    // most early implementations doesn't supports iterables, most modern - not close it correctly\n    var ACCEPT_ITERABLES = $iterDetect(function (iter) { new C(iter); }); // eslint-disable-line no-new\n    // for early implementations -0 and +0 not the same\n    var BUGGY_ZERO = !IS_WEAK && fails(function () {\n      // V8 ~ Chromium 42- fails only with 5+ elements\n      var $instance = new C();\n      var index = 5;\n      while (index--) $instance[ADDER](index, index);\n      return !$instance.has(-0);\n    });\n    if (!ACCEPT_ITERABLES) {\n      C = wrapper(function (target, iterable) {\n        anInstance(target, C, NAME);\n        var that = inheritIfRequired(new Base(), target, C);\n        if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n        return that;\n      });\n      C.prototype = proto;\n      proto.constructor = C;\n    }\n    if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n      fixMethod('delete');\n      fixMethod('has');\n      IS_MAP && fixMethod('get');\n    }\n    if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n    // weak collections should not contains .clear method\n    if (IS_WEAK && proto.clear) delete proto.clear;\n  }\n\n  setToStringTag(C, NAME);\n\n  O[NAME] = C;\n  $export($export.G + $export.W + $export.F * (C != Base), O);\n\n  if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP);\n\n  return C;\n};\n","var isObject = require('./_is-object');\nvar setPrototypeOf = require('./_set-proto').set;\nmodule.exports = function (that, target, C) {\n  var S = target.constructor;\n  var P;\n  if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) {\n    setPrototypeOf(that, P);\n  } return that;\n};\n","// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nvar isObject = require('./_is-object');\nvar anObject = require('./_an-object');\nvar check = function (O, proto) {\n  anObject(O);\n  if (!isObject(proto) && proto !== null) throw TypeError(proto + \": can't set as prototype!\");\n};\nmodule.exports = {\n  set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line\n    function (test, buggy, set) {\n      try {\n        set = require('./_ctx')(Function.call, require('./_object-gopd').f(Object.prototype, '__proto__').set, 2);\n        set(test, []);\n        buggy = !(test instanceof Array);\n      } catch (e) { buggy = true; }\n      return function setPrototypeOf(O, proto) {\n        check(O, proto);\n        if (buggy) O.__proto__ = proto;\n        else set(O, proto);\n        return O;\n      };\n    }({}, false) : undefined),\n  check: check\n};\n","var pIE = require('./_object-pie');\nvar createDesc = require('./_property-desc');\nvar toIObject = require('./_to-iobject');\nvar toPrimitive = require('./_to-primitive');\nvar has = require('./_has');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nexports.f = require('./_descriptors') ? gOPD : function getOwnPropertyDescriptor(O, P) {\n  O = toIObject(O);\n  P = toPrimitive(P, true);\n  if (IE8_DOM_DEFINE) try {\n    return gOPD(O, P);\n  } catch (e) { /* empty */ }\n  if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);\n};\n","// https://tc39.github.io/proposal-setmap-offrom/#sec-weakmap.of\nrequire('./_set-collection-of')('WeakMap');\n","'use strict';\n// https://tc39.github.io/proposal-setmap-offrom/\nvar $export = require('./_export');\n\nmodule.exports = function (COLLECTION) {\n  $export($export.S, COLLECTION, { of: function of() {\n    var length = arguments.length;\n    var A = new Array(length);\n    while (length--) A[length] = arguments[length];\n    return new this(A);\n  } });\n};\n","// https://tc39.github.io/proposal-setmap-offrom/#sec-weakmap.from\nrequire('./_set-collection-from')('WeakMap');\n","'use strict';\n// https://tc39.github.io/proposal-setmap-offrom/\nvar $export = require('./_export');\nvar aFunction = require('./_a-function');\nvar ctx = require('./_ctx');\nvar forOf = require('./_for-of');\n\nmodule.exports = function (COLLECTION) {\n  $export($export.S, COLLECTION, { from: function from(source /* , mapFn, thisArg */) {\n    var mapFn = arguments[1];\n    var mapping, A, n, cb;\n    aFunction(this);\n    mapping = mapFn !== undefined;\n    if (mapping) aFunction(mapFn);\n    if (source == undefined) return new this();\n    A = [];\n    if (mapping) {\n      n = 0;\n      cb = ctx(mapFn, arguments[2], 2);\n      forOf(source, false, function (nextItem) {\n        A.push(cb(nextItem, n++));\n      });\n    } else {\n      forOf(source, false, A.push, A);\n    }\n    return new this(A);\n  } });\n};\n","require('../../modules/es6.string.code-point-at');\nmodule.exports = require('../../modules/_core').String.codePointAt;\n","'use strict';\nvar $export = require('./_export');\nvar $at = require('./_string-at')(false);\n$export($export.P, 'String', {\n  // 21.1.3.3 String.prototype.codePointAt(pos)\n  codePointAt: function codePointAt(pos) {\n    return $at(this, pos);\n  }\n});\n","require('../../modules/es6.string.from-code-point');\nmodule.exports = require('../../modules/_core').String.fromCodePoint;\n","var $export = require('./_export');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar fromCharCode = String.fromCharCode;\nvar $fromCodePoint = String.fromCodePoint;\n\n// length should be 1, old FF problem\n$export($export.S + $export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', {\n  // 21.1.2.2 String.fromCodePoint(...codePoints)\n  fromCodePoint: function fromCodePoint(x) { // eslint-disable-line no-unused-vars\n    var res = [];\n    var aLen = arguments.length;\n    var i = 0;\n    var code;\n    while (aLen > i) {\n      code = +arguments[i++];\n      if (toAbsoluteIndex(code, 0x10ffff) !== code) throw RangeError(code + ' is not a valid code point');\n      res.push(code < 0x10000\n        ? fromCharCode(code)\n        : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00)\n      );\n    } return res.join('');\n  }\n});\n","require('../modules/es6.symbol');\nrequire('../modules/es6.object.to-string');\nmodule.exports = require('../modules/_core').Symbol;\n","'use strict';\n// ECMAScript 6 symbols shim\nvar global = require('./_global');\nvar has = require('./_has');\nvar DESCRIPTORS = require('./_descriptors');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar META = require('./_meta').KEY;\nvar $fails = require('./_fails');\nvar shared = require('./_shared');\nvar setToStringTag = require('./_set-to-string-tag');\nvar uid = require('./_uid');\nvar wks = require('./_wks');\nvar wksExt = require('./_wks-ext');\nvar wksDefine = require('./_wks-define');\nvar enumKeys = require('./_enum-keys');\nvar isArray = require('./_is-array');\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar toIObject = require('./_to-iobject');\nvar toPrimitive = require('./_to-primitive');\nvar createDesc = require('./_property-desc');\nvar _create = require('./_object-create');\nvar gOPNExt = require('./_object-gopn-ext');\nvar $GOPD = require('./_object-gopd');\nvar $DP = require('./_object-dp');\nvar $keys = require('./_object-keys');\nvar gOPD = $GOPD.f;\nvar dP = $DP.f;\nvar gOPN = gOPNExt.f;\nvar $Symbol = global.Symbol;\nvar $JSON = global.JSON;\nvar _stringify = $JSON && $JSON.stringify;\nvar PROTOTYPE = 'prototype';\nvar HIDDEN = wks('_hidden');\nvar TO_PRIMITIVE = wks('toPrimitive');\nvar isEnum = {}.propertyIsEnumerable;\nvar SymbolRegistry = shared('symbol-registry');\nvar AllSymbols = shared('symbols');\nvar OPSymbols = shared('op-symbols');\nvar ObjectProto = Object[PROTOTYPE];\nvar USE_NATIVE = typeof $Symbol == 'function';\nvar QObject = global.QObject;\n// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\nvar setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\n\n// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\nvar setSymbolDesc = DESCRIPTORS && $fails(function () {\n  return _create(dP({}, 'a', {\n    get: function () { return dP(this, 'a', { value: 7 }).a; }\n  })).a != 7;\n}) ? function (it, key, D) {\n  var protoDesc = gOPD(ObjectProto, key);\n  if (protoDesc) delete ObjectProto[key];\n  dP(it, key, D);\n  if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);\n} : dP;\n\nvar wrap = function (tag) {\n  var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);\n  sym._k = tag;\n  return sym;\n};\n\nvar isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) {\n  return typeof it == 'symbol';\n} : function (it) {\n  return it instanceof $Symbol;\n};\n\nvar $defineProperty = function defineProperty(it, key, D) {\n  if (it === ObjectProto) $defineProperty(OPSymbols, key, D);\n  anObject(it);\n  key = toPrimitive(key, true);\n  anObject(D);\n  if (has(AllSymbols, key)) {\n    if (!D.enumerable) {\n      if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));\n      it[HIDDEN][key] = true;\n    } else {\n      if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;\n      D = _create(D, { enumerable: createDesc(0, false) });\n    } return setSymbolDesc(it, key, D);\n  } return dP(it, key, D);\n};\nvar $defineProperties = function defineProperties(it, P) {\n  anObject(it);\n  var keys = enumKeys(P = toIObject(P));\n  var i = 0;\n  var l = keys.length;\n  var key;\n  while (l > i) $defineProperty(it, key = keys[i++], P[key]);\n  return it;\n};\nvar $create = function create(it, P) {\n  return P === undefined ? _create(it) : $defineProperties(_create(it), P);\n};\nvar $propertyIsEnumerable = function propertyIsEnumerable(key) {\n  var E = isEnum.call(this, key = toPrimitive(key, true));\n  if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;\n  return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;\n};\nvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {\n  it = toIObject(it);\n  key = toPrimitive(key, true);\n  if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;\n  var D = gOPD(it, key);\n  if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;\n  return D;\n};\nvar $getOwnPropertyNames = function getOwnPropertyNames(it) {\n  var names = gOPN(toIObject(it));\n  var result = [];\n  var i = 0;\n  var key;\n  while (names.length > i) {\n    if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);\n  } return result;\n};\nvar $getOwnPropertySymbols = function getOwnPropertySymbols(it) {\n  var IS_OP = it === ObjectProto;\n  var names = gOPN(IS_OP ? OPSymbols : toIObject(it));\n  var result = [];\n  var i = 0;\n  var key;\n  while (names.length > i) {\n    if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);\n  } return result;\n};\n\n// 19.4.1.1 Symbol([description])\nif (!USE_NATIVE) {\n  $Symbol = function Symbol() {\n    if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');\n    var tag = uid(arguments.length > 0 ? arguments[0] : undefined);\n    var $set = function (value) {\n      if (this === ObjectProto) $set.call(OPSymbols, value);\n      if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n      setSymbolDesc(this, tag, createDesc(1, value));\n    };\n    if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set });\n    return wrap(tag);\n  };\n  redefine($Symbol[PROTOTYPE], 'toString', function toString() {\n    return this._k;\n  });\n\n  $GOPD.f = $getOwnPropertyDescriptor;\n  $DP.f = $defineProperty;\n  require('./_object-gopn').f = gOPNExt.f = $getOwnPropertyNames;\n  require('./_object-pie').f = $propertyIsEnumerable;\n  require('./_object-gops').f = $getOwnPropertySymbols;\n\n  if (DESCRIPTORS && !require('./_library')) {\n    redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);\n  }\n\n  wksExt.f = function (name) {\n    return wrap(wks(name));\n  };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol });\n\nfor (var es6Symbols = (\n  // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14\n  'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'\n).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]);\n\nfor (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]);\n\n$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {\n  // 19.4.2.1 Symbol.for(key)\n  'for': function (key) {\n    return has(SymbolRegistry, key += '')\n      ? SymbolRegistry[key]\n      : SymbolRegistry[key] = $Symbol(key);\n  },\n  // 19.4.2.5 Symbol.keyFor(sym)\n  keyFor: function keyFor(sym) {\n    if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');\n    for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;\n  },\n  useSetter: function () { setter = true; },\n  useSimple: function () { setter = false; }\n});\n\n$export($export.S + $export.F * !USE_NATIVE, 'Object', {\n  // 19.1.2.2 Object.create(O [, Properties])\n  create: $create,\n  // 19.1.2.4 Object.defineProperty(O, P, Attributes)\n  defineProperty: $defineProperty,\n  // 19.1.2.3 Object.defineProperties(O, Properties)\n  defineProperties: $defineProperties,\n  // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\n  getOwnPropertyDescriptor: $getOwnPropertyDescriptor,\n  // 19.1.2.7 Object.getOwnPropertyNames(O)\n  getOwnPropertyNames: $getOwnPropertyNames,\n  // 19.1.2.8 Object.getOwnPropertySymbols(O)\n  getOwnPropertySymbols: $getOwnPropertySymbols\n});\n\n// 24.3.2 JSON.stringify(value [, replacer [, space]])\n$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {\n  var S = $Symbol();\n  // MS Edge converts symbol values to JSON as {}\n  // WebKit converts symbol values to JSON as null\n  // V8 throws on boxed symbols\n  return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';\n})), 'JSON', {\n  stringify: function stringify(it) {\n    var args = [it];\n    var i = 1;\n    var replacer, $replacer;\n    while (arguments.length > i) args.push(arguments[i++]);\n    $replacer = replacer = args[1];\n    if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined\n    if (!isArray(replacer)) replacer = function (key, value) {\n      if (typeof $replacer == 'function') value = $replacer.call(this, key, value);\n      if (!isSymbol(value)) return value;\n    };\n    args[1] = replacer;\n    return _stringify.apply($JSON, args);\n  }\n});\n\n// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)\n$Symbol[PROTOTYPE][TO_PRIMITIVE] || require('./_hide')($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);\n// 19.4.3.5 Symbol.prototype[@@toStringTag]\nsetToStringTag($Symbol, 'Symbol');\n// 20.2.1.9 Math[@@toStringTag]\nsetToStringTag(Math, 'Math', true);\n// 24.3.3 JSON[@@toStringTag]\nsetToStringTag(global.JSON, 'JSON', true);\n","exports.f = require('./_wks');\n","var global = require('./_global');\nvar core = require('./_core');\nvar LIBRARY = require('./_library');\nvar wksExt = require('./_wks-ext');\nvar defineProperty = require('./_object-dp').f;\nmodule.exports = function (name) {\n  var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});\n  if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) });\n};\n","// all enumerable object keys, includes symbols\nvar getKeys = require('./_object-keys');\nvar gOPS = require('./_object-gops');\nvar pIE = require('./_object-pie');\nmodule.exports = function (it) {\n  var result = getKeys(it);\n  var getSymbols = gOPS.f;\n  if (getSymbols) {\n    var symbols = getSymbols(it);\n    var isEnum = pIE.f;\n    var i = 0;\n    var key;\n    while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key);\n  } return result;\n};\n","// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nvar toIObject = require('./_to-iobject');\nvar gOPN = require('./_object-gopn').f;\nvar toString = {}.toString;\n\nvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n  ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function (it) {\n  try {\n    return gOPN(it);\n  } catch (e) {\n    return windowNames.slice();\n  }\n};\n\nmodule.exports.f = function getOwnPropertyNames(it) {\n  return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));\n};\n","// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\nvar $keys = require('./_object-keys-internal');\nvar hiddenKeys = require('./_enum-bug-keys').concat('length', 'prototype');\n\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n  return $keys(O, hiddenKeys);\n};\n","require('../../modules/es7.object.values');\nmodule.exports = require('../../modules/_core').Object.values;\n","// https://github.com/tc39/proposal-object-values-entries\nvar $export = require('./_export');\nvar $values = require('./_object-to-array')(false);\n\n$export($export.S, 'Object', {\n  values: function values(it) {\n    return $values(it);\n  }\n});\n","var getKeys = require('./_object-keys');\nvar toIObject = require('./_to-iobject');\nvar isEnum = require('./_object-pie').f;\nmodule.exports = function (isEntries) {\n  return function (it) {\n    var O = toIObject(it);\n    var keys = getKeys(O);\n    var length = keys.length;\n    var i = 0;\n    var result = [];\n    var key;\n    while (length > i) if (isEnum.call(O, key = keys[i++])) {\n      result.push(isEntries ? [key, O[key]] : O[key]);\n    } return result;\n  };\n};\n","/* Copyright 2017 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* eslint-disable no-restricted-globals */\n\nlet isReadableStreamSupported = false;\nif (typeof ReadableStream !== 'undefined') {\n  // MS Edge may say it has ReadableStream but they are not up to spec yet.\n  try {\n    // eslint-disable-next-line no-new\n    new ReadableStream({\n      start(controller) {\n        controller.close();\n      },\n    });\n    isReadableStreamSupported = true;\n  } catch (e) {\n    // The ReadableStream constructor cannot be used.\n  }\n}\nif (isReadableStreamSupported) {\n  exports.ReadableStream = ReadableStream;\n} else {\n  if (typeof PDFJSDev !== 'undefined' && PDFJSDev.test('IMAGE_DECODERS')) {\n    class DummyReadableStream {\n      constructor() {\n        throw new Error('The current image decoders are synchronous, ' +\n                        'hence `ReadableStream` shouldn\\'t need to be ' +\n                        'polyfilled for the IMAGE_DECODERS build target.');\n      }\n    }\n    exports.ReadableStream = DummyReadableStream;\n  } else {\n    exports.ReadableStream =\n      require('../../external/streams/streams-lib').ReadableStream;\n  }\n}\n","/*\n * To the extent possible under law, the authors have dedicated all copyright\n * and related and neighboring rights to this software to the public\n * domain worldwide. This software is distributed without any warranty.\n *\n * You should have received a copy of the CC0 Public Domain Dedication along\n * with this software. If not, see https://creativecommons.org/publicdomain/zero/1.0/.\n */\n\n(function(e, a) { for(var i in a) e[i] = a[i]; }(exports, /******/ (function(modules) { // webpackBootstrap\n/******/  // The module cache\n/******/  var installedModules = {};\n/******/\n/******/  // The require function\n/******/  function __w_pdfjs_require__(moduleId) {\n/******/\n/******/    // Check if module is in cache\n/******/    if(installedModules[moduleId])\n/******/      return installedModules[moduleId].exports;\n/******/\n/******/    // Create a new module (and put it into the cache)\n/******/    var module = installedModules[moduleId] = {\n/******/      i: moduleId,\n/******/      l: false,\n/******/      exports: {}\n/******/    };\n/******/\n/******/    // Execute the module function\n/******/    modules[moduleId].call(module.exports, module, module.exports, __w_pdfjs_require__);\n/******/\n/******/    // Flag the module as loaded\n/******/    module.l = true;\n/******/\n/******/    // Return the exports of the module\n/******/    return module.exports;\n/******/  }\n/******/\n/******/\n/******/  // expose the modules object (__webpack_modules__)\n/******/  __w_pdfjs_require__.m = modules;\n/******/\n/******/  // expose the module cache\n/******/  __w_pdfjs_require__.c = installedModules;\n/******/\n/******/  // identity function for calling harmony imports with the correct context\n/******/  __w_pdfjs_require__.i = function(value) { return value; };\n/******/\n/******/  // define getter function for harmony exports\n/******/  __w_pdfjs_require__.d = function(exports, name, getter) {\n/******/    if(!__w_pdfjs_require__.o(exports, name)) {\n/******/      Object.defineProperty(exports, name, {\n/******/        configurable: false,\n/******/        enumerable: true,\n/******/        get: getter\n/******/      });\n/******/    }\n/******/  };\n/******/\n/******/  // getDefaultExport function for compatibility with non-harmony modules\n/******/  __w_pdfjs_require__.n = function(module) {\n/******/    var getter = module && module.__esModule ?\n/******/      function getDefault() { return module['default']; } :\n/******/      function getModuleExports() { return module; };\n/******/    __w_pdfjs_require__.d(getter, 'a', getter);\n/******/    return getter;\n/******/  };\n/******/\n/******/  // Object.prototype.hasOwnProperty.call\n/******/  __w_pdfjs_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/  // __webpack_public_path__\n/******/  __w_pdfjs_require__.p = \"\";\n/******/\n/******/  // Load entry module and return exports\n/******/  return __w_pdfjs_require__(__w_pdfjs_require__.s = 7);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _require = __w_pdfjs_require__(1),\n    assert = _require.assert;\n\nfunction IsPropertyKey(argument) {\n  return typeof argument === 'string' || (typeof argument === 'undefined' ? 'undefined' : _typeof(argument)) === 'symbol';\n}\n\nexports.typeIsObject = function (x) {\n  return (typeof x === 'undefined' ? 'undefined' : _typeof(x)) === 'object' && x !== null || typeof x === 'function';\n};\n\nexports.createDataProperty = function (o, p, v) {\n  assert(exports.typeIsObject(o));\n  Object.defineProperty(o, p, { value: v, writable: true, enumerable: true, configurable: true });\n};\n\nexports.createArrayFromList = function (elements) {\n  // We use arrays to represent lists, so this is basically a no-op.\n  // Do a slice though just in case we happen to depend on the unique-ness.\n  return elements.slice();\n};\n\nexports.ArrayBufferCopy = function (dest, destOffset, src, srcOffset, n) {\n  new Uint8Array(dest).set(new Uint8Array(src, srcOffset, n), destOffset);\n};\n\nexports.CreateIterResultObject = function (value, done) {\n  assert(typeof done === 'boolean');\n  var obj = {};\n  Object.defineProperty(obj, 'value', { value: value, enumerable: true, writable: true, configurable: true });\n  Object.defineProperty(obj, 'done', { value: done, enumerable: true, writable: true, configurable: true });\n  return obj;\n};\n\nexports.IsFiniteNonNegativeNumber = function (v) {\n  if (Number.isNaN(v)) {\n    return false;\n  }\n  if (v === Infinity) {\n    return false;\n  }\n  if (v < 0) {\n    return false;\n  }\n\n  return true;\n};\n\nfunction Call(F, V, args) {\n  if (typeof F !== 'function') {\n    throw new TypeError('Argument is not a function');\n  }\n\n  return Function.prototype.apply.call(F, V, args);\n}\n\nexports.InvokeOrNoop = function (O, P, args) {\n  assert(O !== undefined);\n  assert(IsPropertyKey(P));\n  assert(Array.isArray(args));\n\n  var method = O[P];\n  if (method === undefined) {\n    return undefined;\n  }\n\n  return Call(method, O, args);\n};\n\nexports.PromiseInvokeOrNoop = function (O, P, args) {\n  assert(O !== undefined);\n  assert(IsPropertyKey(P));\n  assert(Array.isArray(args));\n  try {\n    return Promise.resolve(exports.InvokeOrNoop(O, P, args));\n  } catch (returnValueE) {\n    return Promise.reject(returnValueE);\n  }\n};\n\nexports.PromiseInvokeOrPerformFallback = function (O, P, args, F, argsF) {\n  assert(O !== undefined);\n  assert(IsPropertyKey(P));\n  assert(Array.isArray(args));\n  assert(Array.isArray(argsF));\n\n  var method = void 0;\n  try {\n    method = O[P];\n  } catch (methodE) {\n    return Promise.reject(methodE);\n  }\n\n  if (method === undefined) {\n    return F.apply(null, argsF);\n  }\n\n  try {\n    return Promise.resolve(Call(method, O, args));\n  } catch (e) {\n    return Promise.reject(e);\n  }\n};\n\n// Not implemented correctly\nexports.TransferArrayBuffer = function (O) {\n  return O.slice();\n};\n\nexports.ValidateAndNormalizeHighWaterMark = function (highWaterMark) {\n  highWaterMark = Number(highWaterMark);\n  if (Number.isNaN(highWaterMark) || highWaterMark < 0) {\n    throw new RangeError('highWaterMark property of a queuing strategy must be non-negative and non-NaN');\n  }\n\n  return highWaterMark;\n};\n\nexports.ValidateAndNormalizeQueuingStrategy = function (size, highWaterMark) {\n  if (size !== undefined && typeof size !== 'function') {\n    throw new TypeError('size property of a queuing strategy must be a function');\n  }\n\n  highWaterMark = exports.ValidateAndNormalizeHighWaterMark(highWaterMark);\n\n  return { size: size, highWaterMark: highWaterMark };\n};\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nfunction rethrowAssertionErrorRejection(e) {\n  // Used throughout the reference implementation, as `.catch(rethrowAssertionErrorRejection)`, to ensure any errors\n  // get shown. There are places in the spec where we do promise transformations and purposefully ignore or don't\n  // expect any errors, but assertion errors are always problematic.\n  if (e && e.constructor === AssertionError) {\n    setTimeout(function () {\n      throw e;\n    }, 0);\n  }\n};\n\nfunction AssertionError(message) {\n  this.name = 'AssertionError';\n  this.message = message || '';\n  this.stack = new Error().stack;\n}\nAssertionError.prototype = Object.create(Error.prototype);\nAssertionError.prototype.constructor = AssertionError;\n\nfunction assert(value, message) {\n  if (!value) {\n    throw new AssertionError(message);\n  }\n}\n\nmodule.exports = {\n  rethrowAssertionErrorRejection: rethrowAssertionErrorRejection,\n  AssertionError: AssertionError,\n  assert: assert\n};\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar _require = __w_pdfjs_require__(0),\n    InvokeOrNoop = _require.InvokeOrNoop,\n    PromiseInvokeOrNoop = _require.PromiseInvokeOrNoop,\n    ValidateAndNormalizeQueuingStrategy = _require.ValidateAndNormalizeQueuingStrategy,\n    typeIsObject = _require.typeIsObject;\n\nvar _require2 = __w_pdfjs_require__(1),\n    assert = _require2.assert,\n    rethrowAssertionErrorRejection = _require2.rethrowAssertionErrorRejection;\n\nvar _require3 = __w_pdfjs_require__(3),\n    DequeueValue = _require3.DequeueValue,\n    EnqueueValueWithSize = _require3.EnqueueValueWithSize,\n    PeekQueueValue = _require3.PeekQueueValue,\n    ResetQueue = _require3.ResetQueue;\n\nvar WritableStream = function () {\n  function WritableStream() {\n    var underlyingSink = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n    var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n        size = _ref.size,\n        _ref$highWaterMark = _ref.highWaterMark,\n        highWaterMark = _ref$highWaterMark === undefined ? 1 : _ref$highWaterMark;\n\n    _classCallCheck(this, WritableStream);\n\n    this._state = 'writable';\n\n    // The error that will be reported by new method calls once the state becomes errored. Only set when [[state]] is\n    // 'erroring' or 'errored'. May be set to an undefined value.\n    this._storedError = undefined;\n\n    this._writer = undefined;\n\n    // Initialize to undefined first because the constructor of the controller checks this\n    // variable to validate the caller.\n    this._writableStreamController = undefined;\n\n    // This queue is placed here instead of the writer class in order to allow for passing a writer to the next data\n    // producer without waiting for the queued writes to finish.\n    this._writeRequests = [];\n\n    // Write requests are removed from _writeRequests when write() is called on the underlying sink. This prevents\n    // them from being erroneously rejected on error. If a write() call is in-flight, the request is stored here.\n    this._inFlightWriteRequest = undefined;\n\n    // The promise that was returned from writer.close(). Stored here because it may be fulfilled after the writer\n    // has been detached.\n    this._closeRequest = undefined;\n\n    // Close request is removed from _closeRequest when close() is called on the underlying sink. This prevents it\n    // from being erroneously rejected on error. If a close() call is in-flight, the request is stored here.\n    this._inFlightCloseRequest = undefined;\n\n    // The promise that was returned from writer.abort(). This may also be fulfilled after the writer has detached.\n    this._pendingAbortRequest = undefined;\n\n    // The backpressure signal set by the controller.\n    this._backpressure = false;\n\n    var type = underlyingSink.type;\n\n    if (type !== undefined) {\n      throw new RangeError('Invalid type is specified');\n    }\n\n    this._writableStreamController = new WritableStreamDefaultController(this, underlyingSink, size, highWaterMark);\n    this._writableStreamController.__startSteps();\n  }\n\n  _createClass(WritableStream, [{\n    key: 'abort',\n    value: function abort(reason) {\n      if (IsWritableStream(this) === false) {\n        return Promise.reject(streamBrandCheckException('abort'));\n      }\n\n      if (IsWritableStreamLocked(this) === true) {\n        return Promise.reject(new TypeError('Cannot abort a stream that already has a writer'));\n      }\n\n      return WritableStreamAbort(this, reason);\n    }\n  }, {\n    key: 'getWriter',\n    value: function getWriter() {\n      if (IsWritableStream(this) === false) {\n        throw streamBrandCheckException('getWriter');\n      }\n\n      return AcquireWritableStreamDefaultWriter(this);\n    }\n  }, {\n    key: 'locked',\n    get: function get() {\n      if (IsWritableStream(this) === false) {\n        throw streamBrandCheckException('locked');\n      }\n\n      return IsWritableStreamLocked(this);\n    }\n  }]);\n\n  return WritableStream;\n}();\n\nmodule.exports = {\n  AcquireWritableStreamDefaultWriter: AcquireWritableStreamDefaultWriter,\n  IsWritableStream: IsWritableStream,\n  IsWritableStreamLocked: IsWritableStreamLocked,\n  WritableStream: WritableStream,\n  WritableStreamAbort: WritableStreamAbort,\n  WritableStreamDefaultControllerError: WritableStreamDefaultControllerError,\n  WritableStreamDefaultWriterCloseWithErrorPropagation: WritableStreamDefaultWriterCloseWithErrorPropagation,\n  WritableStreamDefaultWriterRelease: WritableStreamDefaultWriterRelease,\n  WritableStreamDefaultWriterWrite: WritableStreamDefaultWriterWrite,\n  WritableStreamCloseQueuedOrInFlight: WritableStreamCloseQueuedOrInFlight\n};\n\n// Abstract operations for the WritableStream.\n\nfunction AcquireWritableStreamDefaultWriter(stream) {\n  return new WritableStreamDefaultWriter(stream);\n}\n\nfunction IsWritableStream(x) {\n  if (!typeIsObject(x)) {\n    return false;\n  }\n\n  if (!Object.prototype.hasOwnProperty.call(x, '_writableStreamController')) {\n    return false;\n  }\n\n  return true;\n}\n\nfunction IsWritableStreamLocked(stream) {\n  assert(IsWritableStream(stream) === true, 'IsWritableStreamLocked should only be used on known writable streams');\n\n  if (stream._writer === undefined) {\n    return false;\n  }\n\n  return true;\n}\n\nfunction WritableStreamAbort(stream, reason) {\n  var state = stream._state;\n  if (state === 'closed') {\n    return Promise.resolve(undefined);\n  }\n  if (state === 'errored') {\n    return Promise.reject(stream._storedError);\n  }\n  var error = new TypeError('Requested to abort');\n  if (stream._pendingAbortRequest !== undefined) {\n    return Promise.reject(error);\n  }\n\n  assert(state === 'writable' || state === 'erroring', 'state must be writable or erroring');\n\n  var wasAlreadyErroring = false;\n  if (state === 'erroring') {\n    wasAlreadyErroring = true;\n    // reason will not be used, so don't keep a reference to it.\n    reason = undefined;\n  }\n\n  var promise = new Promise(function (resolve, reject) {\n    stream._pendingAbortRequest = {\n      _resolve: resolve,\n      _reject: reject,\n      _reason: reason,\n      _wasAlreadyErroring: wasAlreadyErroring\n    };\n  });\n\n  if (wasAlreadyErroring === false) {\n    WritableStreamStartErroring(stream, error);\n  }\n\n  return promise;\n}\n\n// WritableStream API exposed for controllers.\n\nfunction WritableStreamAddWriteRequest(stream) {\n  assert(IsWritableStreamLocked(stream) === true);\n  assert(stream._state === 'writable');\n\n  var promise = new Promise(function (resolve, reject) {\n    var writeRequest = {\n      _resolve: resolve,\n      _reject: reject\n    };\n\n    stream._writeRequests.push(writeRequest);\n  });\n\n  return promise;\n}\n\nfunction WritableStreamDealWithRejection(stream, error) {\n  var state = stream._state;\n\n  if (state === 'writable') {\n    WritableStreamStartErroring(stream, error);\n    return;\n  }\n\n  assert(state === 'erroring');\n  WritableStreamFinishErroring(stream);\n}\n\nfunction WritableStreamStartErroring(stream, reason) {\n  assert(stream._storedError === undefined, 'stream._storedError === undefined');\n  assert(stream._state === 'writable', 'state must be writable');\n\n  var controller = stream._writableStreamController;\n  assert(controller !== undefined, 'controller must not be undefined');\n\n  stream._state = 'erroring';\n  stream._storedError = reason;\n  var writer = stream._writer;\n  if (writer !== undefined) {\n    WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, reason);\n  }\n\n  if (WritableStreamHasOperationMarkedInFlight(stream) === false && controller._started === true) {\n    WritableStreamFinishErroring(stream);\n  }\n}\n\nfunction WritableStreamFinishErroring(stream) {\n  assert(stream._state === 'erroring', 'stream._state === erroring');\n  assert(WritableStreamHasOperationMarkedInFlight(stream) === false, 'WritableStreamHasOperationMarkedInFlight(stream) === false');\n  stream._state = 'errored';\n  stream._writableStreamController.__errorSteps();\n\n  var storedError = stream._storedError;\n  for (var i = 0; i < stream._writeRequests.length; i++) {\n    var writeRequest = stream._writeRequests[i];\n    writeRequest._reject(storedError);\n  }\n  stream._writeRequests = [];\n\n  if (stream._pendingAbortRequest === undefined) {\n    WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);\n    return;\n  }\n\n  var abortRequest = stream._pendingAbortRequest;\n  stream._pendingAbortRequest = undefined;\n\n  if (abortRequest._wasAlreadyErroring === true) {\n    abortRequest._reject(storedError);\n    WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);\n    return;\n  }\n\n  var promise = stream._writableStreamController.__abortSteps(abortRequest._reason);\n  promise.then(function () {\n    abortRequest._resolve();\n    WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);\n  }, function (reason) {\n    abortRequest._reject(reason);\n    WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream);\n  });\n}\n\nfunction WritableStreamFinishInFlightWrite(stream) {\n  assert(stream._inFlightWriteRequest !== undefined);\n  stream._inFlightWriteRequest._resolve(undefined);\n  stream._inFlightWriteRequest = undefined;\n}\n\nfunction WritableStreamFinishInFlightWriteWithError(stream, error) {\n  assert(stream._inFlightWriteRequest !== undefined);\n  stream._inFlightWriteRequest._reject(error);\n  stream._inFlightWriteRequest = undefined;\n\n  assert(stream._state === 'writable' || stream._state === 'erroring');\n\n  WritableStreamDealWithRejection(stream, error);\n}\n\nfunction WritableStreamFinishInFlightClose(stream) {\n  assert(stream._inFlightCloseRequest !== undefined);\n  stream._inFlightCloseRequest._resolve(undefined);\n  stream._inFlightCloseRequest = undefined;\n\n  var state = stream._state;\n\n  assert(state === 'writable' || state === 'erroring');\n\n  if (state === 'erroring') {\n    // The error was too late to do anything, so it is ignored.\n    stream._storedError = undefined;\n    if (stream._pendingAbortRequest !== undefined) {\n      stream._pendingAbortRequest._resolve();\n      stream._pendingAbortRequest = undefined;\n    }\n  }\n\n  stream._state = 'closed';\n\n  var writer = stream._writer;\n  if (writer !== undefined) {\n    defaultWriterClosedPromiseResolve(writer);\n  }\n\n  assert(stream._pendingAbortRequest === undefined, 'stream._pendingAbortRequest === undefined');\n  assert(stream._storedError === undefined, 'stream._storedError === undefined');\n}\n\nfunction WritableStreamFinishInFlightCloseWithError(stream, error) {\n  assert(stream._inFlightCloseRequest !== undefined);\n  stream._inFlightCloseRequest._reject(error);\n  stream._inFlightCloseRequest = undefined;\n\n  assert(stream._state === 'writable' || stream._state === 'erroring');\n\n  // Never execute sink abort() after sink close().\n  if (stream._pendingAbortRequest !== undefined) {\n    stream._pendingAbortRequest._reject(error);\n    stream._pendingAbortRequest = undefined;\n  }\n  WritableStreamDealWithRejection(stream, error);\n}\n\n// TODO(ricea): Fix alphabetical order.\nfunction WritableStreamCloseQueuedOrInFlight(stream) {\n  if (stream._closeRequest === undefined && stream._inFlightCloseRequest === undefined) {\n    return false;\n  }\n\n  return true;\n}\n\nfunction WritableStreamHasOperationMarkedInFlight(stream) {\n  if (stream._inFlightWriteRequest === undefined && stream._inFlightCloseRequest === undefined) {\n    return false;\n  }\n\n  return true;\n}\n\nfunction WritableStreamMarkCloseRequestInFlight(stream) {\n  assert(stream._inFlightCloseRequest === undefined);\n  assert(stream._closeRequest !== undefined);\n  stream._inFlightCloseRequest = stream._closeRequest;\n  stream._closeRequest = undefined;\n}\n\nfunction WritableStreamMarkFirstWriteRequestInFlight(stream) {\n  assert(stream._inFlightWriteRequest === undefined, 'there must be no pending write request');\n  assert(stream._writeRequests.length !== 0, 'writeRequests must not be empty');\n  stream._inFlightWriteRequest = stream._writeRequests.shift();\n}\n\nfunction WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream) {\n  assert(stream._state === 'errored', '_stream_.[[state]] is `\"errored\"`');\n  if (stream._closeRequest !== undefined) {\n    assert(stream._inFlightCloseRequest === undefined);\n\n    stream._closeRequest._reject(stream._storedError);\n    stream._closeRequest = undefined;\n  }\n  var writer = stream._writer;\n  if (writer !== undefined) {\n    defaultWriterClosedPromiseReject(writer, stream._storedError);\n    writer._closedPromise.catch(function () {});\n  }\n}\n\nfunction WritableStreamUpdateBackpressure(stream, backpressure) {\n  assert(stream._state === 'writable');\n  assert(WritableStreamCloseQueuedOrInFlight(stream) === false);\n\n  var writer = stream._writer;\n  if (writer !== undefined && backpressure !== stream._backpressure) {\n    if (backpressure === true) {\n      defaultWriterReadyPromiseReset(writer);\n    } else {\n      assert(backpressure === false);\n\n      defaultWriterReadyPromiseResolve(writer);\n    }\n  }\n\n  stream._backpressure = backpressure;\n}\n\nvar WritableStreamDefaultWriter = function () {\n  function WritableStreamDefaultWriter(stream) {\n    _classCallCheck(this, WritableStreamDefaultWriter);\n\n    if (IsWritableStream(stream) === false) {\n      throw new TypeError('WritableStreamDefaultWriter can only be constructed with a WritableStream instance');\n    }\n    if (IsWritableStreamLocked(stream) === true) {\n      throw new TypeError('This stream has already been locked for exclusive writing by another writer');\n    }\n\n    this._ownerWritableStream = stream;\n    stream._writer = this;\n\n    var state = stream._state;\n\n    if (state === 'writable') {\n      if (WritableStreamCloseQueuedOrInFlight(stream) === false && stream._backpressure === true) {\n        defaultWriterReadyPromiseInitialize(this);\n      } else {\n        defaultWriterReadyPromiseInitializeAsResolved(this);\n      }\n\n      defaultWriterClosedPromiseInitialize(this);\n    } else if (state === 'erroring') {\n      defaultWriterReadyPromiseInitializeAsRejected(this, stream._storedError);\n      this._readyPromise.catch(function () {});\n      defaultWriterClosedPromiseInitialize(this);\n    } else if (state === 'closed') {\n      defaultWriterReadyPromiseInitializeAsResolved(this);\n      defaultWriterClosedPromiseInitializeAsResolved(this);\n    } else {\n      assert(state === 'errored', 'state must be errored');\n\n      var storedError = stream._storedError;\n      defaultWriterReadyPromiseInitializeAsRejected(this, storedError);\n      this._readyPromise.catch(function () {});\n      defaultWriterClosedPromiseInitializeAsRejected(this, storedError);\n      this._closedPromise.catch(function () {});\n    }\n  }\n\n  _createClass(WritableStreamDefaultWriter, [{\n    key: 'abort',\n    value: function abort(reason) {\n      if (IsWritableStreamDefaultWriter(this) === false) {\n        return Promise.reject(defaultWriterBrandCheckException('abort'));\n      }\n\n      if (this._ownerWritableStream === undefined) {\n        return Promise.reject(defaultWriterLockException('abort'));\n      }\n\n      return WritableStreamDefaultWriterAbort(this, reason);\n    }\n  }, {\n    key: 'close',\n    value: function close() {\n      if (IsWritableStreamDefaultWriter(this) === false) {\n        return Promise.reject(defaultWriterBrandCheckException('close'));\n      }\n\n      var stream = this._ownerWritableStream;\n\n      if (stream === undefined) {\n        return Promise.reject(defaultWriterLockException('close'));\n      }\n\n      if (WritableStreamCloseQueuedOrInFlight(stream) === true) {\n        return Promise.reject(new TypeError('cannot close an already-closing stream'));\n      }\n\n      return WritableStreamDefaultWriterClose(this);\n    }\n  }, {\n    key: 'releaseLock',\n    value: function releaseLock() {\n      if (IsWritableStreamDefaultWriter(this) === false) {\n        throw defaultWriterBrandCheckException('releaseLock');\n      }\n\n      var stream = this._ownerWritableStream;\n\n      if (stream === undefined) {\n        return;\n      }\n\n      assert(stream._writer !== undefined);\n\n      WritableStreamDefaultWriterRelease(this);\n    }\n  }, {\n    key: 'write',\n    value: function write(chunk) {\n      if (IsWritableStreamDefaultWriter(this) === false) {\n        return Promise.reject(defaultWriterBrandCheckException('write'));\n      }\n\n      if (this._ownerWritableStream === undefined) {\n        return Promise.reject(defaultWriterLockException('write to'));\n      }\n\n      return WritableStreamDefaultWriterWrite(this, chunk);\n    }\n  }, {\n    key: 'closed',\n    get: function get() {\n      if (IsWritableStreamDefaultWriter(this) === false) {\n        return Promise.reject(defaultWriterBrandCheckException('closed'));\n      }\n\n      return this._closedPromise;\n    }\n  }, {\n    key: 'desiredSize',\n    get: function get() {\n      if (IsWritableStreamDefaultWriter(this) === false) {\n        throw defaultWriterBrandCheckException('desiredSize');\n      }\n\n      if (this._ownerWritableStream === undefined) {\n        throw defaultWriterLockException('desiredSize');\n      }\n\n      return WritableStreamDefaultWriterGetDesiredSize(this);\n    }\n  }, {\n    key: 'ready',\n    get: function get() {\n      if (IsWritableStreamDefaultWriter(this) === false) {\n        return Promise.reject(defaultWriterBrandCheckException('ready'));\n      }\n\n      return this._readyPromise;\n    }\n  }]);\n\n  return WritableStreamDefaultWriter;\n}();\n\n// Abstract operations for the WritableStreamDefaultWriter.\n\nfunction IsWritableStreamDefaultWriter(x) {\n  if (!typeIsObject(x)) {\n    return false;\n  }\n\n  if (!Object.prototype.hasOwnProperty.call(x, '_ownerWritableStream')) {\n    return false;\n  }\n\n  return true;\n}\n\n// A client of WritableStreamDefaultWriter may use these functions directly to bypass state check.\n\nfunction WritableStreamDefaultWriterAbort(writer, reason) {\n  var stream = writer._ownerWritableStream;\n\n  assert(stream !== undefined);\n\n  return WritableStreamAbort(stream, reason);\n}\n\nfunction WritableStreamDefaultWriterClose(writer) {\n  var stream = writer._ownerWritableStream;\n\n  assert(stream !== undefined);\n\n  var state = stream._state;\n  if (state === 'closed' || state === 'errored') {\n    return Promise.reject(new TypeError('The stream (in ' + state + ' state) is not in the writable state and cannot be closed'));\n  }\n\n  assert(state === 'writable' || state === 'erroring');\n  assert(WritableStreamCloseQueuedOrInFlight(stream) === false);\n\n  var promise = new Promise(function (resolve, reject) {\n    var closeRequest = {\n      _resolve: resolve,\n      _reject: reject\n    };\n\n    stream._closeRequest = closeRequest;\n  });\n\n  if (stream._backpressure === true && state === 'writable') {\n    defaultWriterReadyPromiseResolve(writer);\n  }\n\n  WritableStreamDefaultControllerClose(stream._writableStreamController);\n\n  return promise;\n}\n\nfunction WritableStreamDefaultWriterCloseWithErrorPropagation(writer) {\n  var stream = writer._ownerWritableStream;\n\n  assert(stream !== undefined);\n\n  var state = stream._state;\n  if (WritableStreamCloseQueuedOrInFlight(stream) === true || state === 'closed') {\n    return Promise.resolve();\n  }\n\n  if (state === 'errored') {\n    return Promise.reject(stream._storedError);\n  }\n\n  assert(state === 'writable' || state === 'erroring');\n\n  return WritableStreamDefaultWriterClose(writer);\n}\n\nfunction WritableStreamDefaultWriterEnsureClosedPromiseRejected(writer, error) {\n  if (writer._closedPromiseState === 'pending') {\n    defaultWriterClosedPromiseReject(writer, error);\n  } else {\n    defaultWriterClosedPromiseResetToRejected(writer, error);\n  }\n  writer._closedPromise.catch(function () {});\n}\n\nfunction WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, error) {\n  if (writer._readyPromiseState === 'pending') {\n    defaultWriterReadyPromiseReject(writer, error);\n  } else {\n    defaultWriterReadyPromiseResetToRejected(writer, error);\n  }\n  writer._readyPromise.catch(function () {});\n}\n\nfunction WritableStreamDefaultWriterGetDesiredSize(writer) {\n  var stream = writer._ownerWritableStream;\n  var state = stream._state;\n\n  if (state === 'errored' || state === 'erroring') {\n    return null;\n  }\n\n  if (state === 'closed') {\n    return 0;\n  }\n\n  return WritableStreamDefaultControllerGetDesiredSize(stream._writableStreamController);\n}\n\nfunction WritableStreamDefaultWriterRelease(writer) {\n  var stream = writer._ownerWritableStream;\n  assert(stream !== undefined);\n  assert(stream._writer === writer);\n\n  var releasedError = new TypeError('Writer was released and can no longer be used to monitor the stream\\'s closedness');\n\n  WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, releasedError);\n\n  // The state transitions to \"errored\" before the sink abort() method runs, but the writer.closed promise is not\n  // rejected until afterwards. This means that simply testing state will not work.\n  WritableStreamDefaultWriterEnsureClosedPromiseRejected(writer, releasedError);\n\n  stream._writer = undefined;\n  writer._ownerWritableStream = undefined;\n}\n\nfunction WritableStreamDefaultWriterWrite(writer, chunk) {\n  var stream = writer._ownerWritableStream;\n\n  assert(stream !== undefined);\n\n  var controller = stream._writableStreamController;\n\n  var chunkSize = WritableStreamDefaultControllerGetChunkSize(controller, chunk);\n\n  if (stream !== writer._ownerWritableStream) {\n    return Promise.reject(defaultWriterLockException('write to'));\n  }\n\n  var state = stream._state;\n  if (state === 'errored') {\n    return Promise.reject(stream._storedError);\n  }\n  if (WritableStreamCloseQueuedOrInFlight(stream) === true || state === 'closed') {\n    return Promise.reject(new TypeError('The stream is closing or closed and cannot be written to'));\n  }\n  if (state === 'erroring') {\n    return Promise.reject(stream._storedError);\n  }\n\n  assert(state === 'writable');\n\n  var promise = WritableStreamAddWriteRequest(stream);\n\n  WritableStreamDefaultControllerWrite(controller, chunk, chunkSize);\n\n  return promise;\n}\n\nvar WritableStreamDefaultController = function () {\n  function WritableStreamDefaultController(stream, underlyingSink, size, highWaterMark) {\n    _classCallCheck(this, WritableStreamDefaultController);\n\n    if (IsWritableStream(stream) === false) {\n      throw new TypeError('WritableStreamDefaultController can only be constructed with a WritableStream instance');\n    }\n\n    if (stream._writableStreamController !== undefined) {\n      throw new TypeError('WritableStreamDefaultController instances can only be created by the WritableStream constructor');\n    }\n\n    this._controlledWritableStream = stream;\n\n    this._underlyingSink = underlyingSink;\n\n    // Need to set the slots so that the assert doesn't fire. In the spec the slots already exist implicitly.\n    this._queue = undefined;\n    this._queueTotalSize = undefined;\n    ResetQueue(this);\n\n    this._started = false;\n\n    var normalizedStrategy = ValidateAndNormalizeQueuingStrategy(size, highWaterMark);\n    this._strategySize = normalizedStrategy.size;\n    this._strategyHWM = normalizedStrategy.highWaterMark;\n\n    var backpressure = WritableStreamDefaultControllerGetBackpressure(this);\n    WritableStreamUpdateBackpressure(stream, backpressure);\n  }\n\n  _createClass(WritableStreamDefaultController, [{\n    key: 'error',\n    value: function error(e) {\n      if (IsWritableStreamDefaultController(this) === false) {\n        throw new TypeError('WritableStreamDefaultController.prototype.error can only be used on a WritableStreamDefaultController');\n      }\n      var state = this._controlledWritableStream._state;\n      if (state !== 'writable') {\n        // The stream is closed, errored or will be soon. The sink can't do anything useful if it gets an error here, so\n        // just treat it as a no-op.\n        return;\n      }\n\n      WritableStreamDefaultControllerError(this, e);\n    }\n  }, {\n    key: '__abortSteps',\n    value: function __abortSteps(reason) {\n      return PromiseInvokeOrNoop(this._underlyingSink, 'abort', [reason]);\n    }\n  }, {\n    key: '__errorSteps',\n    value: function __errorSteps() {\n      ResetQueue(this);\n    }\n  }, {\n    key: '__startSteps',\n    value: function __startSteps() {\n      var _this = this;\n\n      var startResult = InvokeOrNoop(this._underlyingSink, 'start', [this]);\n      var stream = this._controlledWritableStream;\n\n      Promise.resolve(startResult).then(function () {\n        assert(stream._state === 'writable' || stream._state === 'erroring');\n        _this._started = true;\n        WritableStreamDefaultControllerAdvanceQueueIfNeeded(_this);\n      }, function (r) {\n        assert(stream._state === 'writable' || stream._state === 'erroring');\n        _this._started = true;\n        WritableStreamDealWithRejection(stream, r);\n      }).catch(rethrowAssertionErrorRejection);\n    }\n  }]);\n\n  return WritableStreamDefaultController;\n}();\n\n// Abstract operations implementing interface required by the WritableStream.\n\nfunction WritableStreamDefaultControllerClose(controller) {\n  EnqueueValueWithSize(controller, 'close', 0);\n  WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller);\n}\n\nfunction WritableStreamDefaultControllerGetChunkSize(controller, chunk) {\n  var strategySize = controller._strategySize;\n\n  if (strategySize === undefined) {\n    return 1;\n  }\n\n  try {\n    return strategySize(chunk);\n  } catch (chunkSizeE) {\n    WritableStreamDefaultControllerErrorIfNeeded(controller, chunkSizeE);\n    return 1;\n  }\n}\n\nfunction WritableStreamDefaultControllerGetDesiredSize(controller) {\n  return controller._strategyHWM - controller._queueTotalSize;\n}\n\nfunction WritableStreamDefaultControllerWrite(controller, chunk, chunkSize) {\n  var writeRecord = { chunk: chunk };\n\n  try {\n    EnqueueValueWithSize(controller, writeRecord, chunkSize);\n  } catch (enqueueE) {\n    WritableStreamDefaultControllerErrorIfNeeded(controller, enqueueE);\n    return;\n  }\n\n  var stream = controller._controlledWritableStream;\n  if (WritableStreamCloseQueuedOrInFlight(stream) === false && stream._state === 'writable') {\n    var backpressure = WritableStreamDefaultControllerGetBackpressure(controller);\n    WritableStreamUpdateBackpressure(stream, backpressure);\n  }\n\n  WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller);\n}\n\n// Abstract operations for the WritableStreamDefaultController.\n\nfunction IsWritableStreamDefaultController(x) {\n  if (!typeIsObject(x)) {\n    return false;\n  }\n\n  if (!Object.prototype.hasOwnProperty.call(x, '_underlyingSink')) {\n    return false;\n  }\n\n  return true;\n}\n\nfunction WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller) {\n  var stream = controller._controlledWritableStream;\n\n  if (controller._started === false) {\n    return;\n  }\n\n  if (stream._inFlightWriteRequest !== undefined) {\n    return;\n  }\n\n  var state = stream._state;\n  if (state === 'closed' || state === 'errored') {\n    return;\n  }\n  if (state === 'erroring') {\n    WritableStreamFinishErroring(stream);\n    return;\n  }\n\n  if (controller._queue.length === 0) {\n    return;\n  }\n\n  var writeRecord = PeekQueueValue(controller);\n  if (writeRecord === 'close') {\n    WritableStreamDefaultControllerProcessClose(controller);\n  } else {\n    WritableStreamDefaultControllerProcessWrite(controller, writeRecord.chunk);\n  }\n}\n\nfunction WritableStreamDefaultControllerErrorIfNeeded(controller, error) {\n  if (controller._controlledWritableStream._state === 'writable') {\n    WritableStreamDefaultControllerError(controller, error);\n  }\n}\n\nfunction WritableStreamDefaultControllerProcessClose(controller) {\n  var stream = controller._controlledWritableStream;\n\n  WritableStreamMarkCloseRequestInFlight(stream);\n\n  DequeueValue(controller);\n  assert(controller._queue.length === 0, 'queue must be empty once the final write record is dequeued');\n\n  var sinkClosePromise = PromiseInvokeOrNoop(controller._underlyingSink, 'close', []);\n  sinkClosePromise.then(function () {\n    WritableStreamFinishInFlightClose(stream);\n  }, function (reason) {\n    WritableStreamFinishInFlightCloseWithError(stream, reason);\n  }).catch(rethrowAssertionErrorRejection);\n}\n\nfunction WritableStreamDefaultControllerProcessWrite(controller, chunk) {\n  var stream = controller._controlledWritableStream;\n\n  WritableStreamMarkFirstWriteRequestInFlight(stream);\n\n  var sinkWritePromise = PromiseInvokeOrNoop(controller._underlyingSink, 'write', [chunk, controller]);\n  sinkWritePromise.then(function () {\n    WritableStreamFinishInFlightWrite(stream);\n\n    var state = stream._state;\n    assert(state === 'writable' || state === 'erroring');\n\n    DequeueValue(controller);\n\n    if (WritableStreamCloseQueuedOrInFlight(stream) === false && state === 'writable') {\n      var backpressure = WritableStreamDefaultControllerGetBackpressure(controller);\n      WritableStreamUpdateBackpressure(stream, backpressure);\n    }\n\n    WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller);\n  }, function (reason) {\n    WritableStreamFinishInFlightWriteWithError(stream, reason);\n  }).catch(rethrowAssertionErrorRejection);\n}\n\nfunction WritableStreamDefaultControllerGetBackpressure(controller) {\n  var desiredSize = WritableStreamDefaultControllerGetDesiredSize(controller);\n  return desiredSize <= 0;\n}\n\n// A client of WritableStreamDefaultController may use these functions directly to bypass state check.\n\nfunction WritableStreamDefaultControllerError(controller, error) {\n  var stream = controller._controlledWritableStream;\n\n  assert(stream._state === 'writable');\n\n  WritableStreamStartErroring(stream, error);\n}\n\n// Helper functions for the WritableStream.\n\nfunction streamBrandCheckException(name) {\n  return new TypeError('WritableStream.prototype.' + name + ' can only be used on a WritableStream');\n}\n\n// Helper functions for the WritableStreamDefaultWriter.\n\nfunction defaultWriterBrandCheckException(name) {\n  return new TypeError('WritableStreamDefaultWriter.prototype.' + name + ' can only be used on a WritableStreamDefaultWriter');\n}\n\nfunction defaultWriterLockException(name) {\n  return new TypeError('Cannot ' + name + ' a stream using a released writer');\n}\n\nfunction defaultWriterClosedPromiseInitialize(writer) {\n  writer._closedPromise = new Promise(function (resolve, reject) {\n    writer._closedPromise_resolve = resolve;\n    writer._closedPromise_reject = reject;\n    writer._closedPromiseState = 'pending';\n  });\n}\n\nfunction defaultWriterClosedPromiseInitializeAsRejected(writer, reason) {\n  writer._closedPromise = Promise.reject(reason);\n  writer._closedPromise_resolve = undefined;\n  writer._closedPromise_reject = undefined;\n  writer._closedPromiseState = 'rejected';\n}\n\nfunction defaultWriterClosedPromiseInitializeAsResolved(writer) {\n  writer._closedPromise = Promise.resolve(undefined);\n  writer._closedPromise_resolve = undefined;\n  writer._closedPromise_reject = undefined;\n  writer._closedPromiseState = 'resolved';\n}\n\nfunction defaultWriterClosedPromiseReject(writer, reason) {\n  assert(writer._closedPromise_resolve !== undefined, 'writer._closedPromise_resolve !== undefined');\n  assert(writer._closedPromise_reject !== undefined, 'writer._closedPromise_reject !== undefined');\n  assert(writer._closedPromiseState === 'pending', 'writer._closedPromiseState is pending');\n\n  writer._closedPromise_reject(reason);\n  writer._closedPromise_resolve = undefined;\n  writer._closedPromise_reject = undefined;\n  writer._closedPromiseState = 'rejected';\n}\n\nfunction defaultWriterClosedPromiseResetToRejected(writer, reason) {\n  assert(writer._closedPromise_resolve === undefined, 'writer._closedPromise_resolve === undefined');\n  assert(writer._closedPromise_reject === undefined, 'writer._closedPromise_reject === undefined');\n  assert(writer._closedPromiseState !== 'pending', 'writer._closedPromiseState is not pending');\n\n  writer._closedPromise = Promise.reject(reason);\n  writer._closedPromiseState = 'rejected';\n}\n\nfunction defaultWriterClosedPromiseResolve(writer) {\n  assert(writer._closedPromise_resolve !== undefined, 'writer._closedPromise_resolve !== undefined');\n  assert(writer._closedPromise_reject !== undefined, 'writer._closedPromise_reject !== undefined');\n  assert(writer._closedPromiseState === 'pending', 'writer._closedPromiseState is pending');\n\n  writer._closedPromise_resolve(undefined);\n  writer._closedPromise_resolve = undefined;\n  writer._closedPromise_reject = undefined;\n  writer._closedPromiseState = 'resolved';\n}\n\nfunction defaultWriterReadyPromiseInitialize(writer) {\n  writer._readyPromise = new Promise(function (resolve, reject) {\n    writer._readyPromise_resolve = resolve;\n    writer._readyPromise_reject = reject;\n  });\n  writer._readyPromiseState = 'pending';\n}\n\nfunction defaultWriterReadyPromiseInitializeAsRejected(writer, reason) {\n  writer._readyPromise = Promise.reject(reason);\n  writer._readyPromise_resolve = undefined;\n  writer._readyPromise_reject = undefined;\n  writer._readyPromiseState = 'rejected';\n}\n\nfunction defaultWriterReadyPromiseInitializeAsResolved(writer) {\n  writer._readyPromise = Promise.resolve(undefined);\n  writer._readyPromise_resolve = undefined;\n  writer._readyPromise_reject = undefined;\n  writer._readyPromiseState = 'fulfilled';\n}\n\nfunction defaultWriterReadyPromiseReject(writer, reason) {\n  assert(writer._readyPromise_resolve !== undefined, 'writer._readyPromise_resolve !== undefined');\n  assert(writer._readyPromise_reject !== undefined, 'writer._readyPromise_reject !== undefined');\n\n  writer._readyPromise_reject(reason);\n  writer._readyPromise_resolve = undefined;\n  writer._readyPromise_reject = undefined;\n  writer._readyPromiseState = 'rejected';\n}\n\nfunction defaultWriterReadyPromiseReset(writer) {\n  assert(writer._readyPromise_resolve === undefined, 'writer._readyPromise_resolve === undefined');\n  assert(writer._readyPromise_reject === undefined, 'writer._readyPromise_reject === undefined');\n\n  writer._readyPromise = new Promise(function (resolve, reject) {\n    writer._readyPromise_resolve = resolve;\n    writer._readyPromise_reject = reject;\n  });\n  writer._readyPromiseState = 'pending';\n}\n\nfunction defaultWriterReadyPromiseResetToRejected(writer, reason) {\n  assert(writer._readyPromise_resolve === undefined, 'writer._readyPromise_resolve === undefined');\n  assert(writer._readyPromise_reject === undefined, 'writer._readyPromise_reject === undefined');\n\n  writer._readyPromise = Promise.reject(reason);\n  writer._readyPromiseState = 'rejected';\n}\n\nfunction defaultWriterReadyPromiseResolve(writer) {\n  assert(writer._readyPromise_resolve !== undefined, 'writer._readyPromise_resolve !== undefined');\n  assert(writer._readyPromise_reject !== undefined, 'writer._readyPromise_reject !== undefined');\n\n  writer._readyPromise_resolve(undefined);\n  writer._readyPromise_resolve = undefined;\n  writer._readyPromise_reject = undefined;\n  writer._readyPromiseState = 'fulfilled';\n}\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nvar _require = __w_pdfjs_require__(0),\n    IsFiniteNonNegativeNumber = _require.IsFiniteNonNegativeNumber;\n\nvar _require2 = __w_pdfjs_require__(1),\n    assert = _require2.assert;\n\nexports.DequeueValue = function (container) {\n  assert('_queue' in container && '_queueTotalSize' in container, 'Spec-level failure: DequeueValue should only be used on containers with [[queue]] and [[queueTotalSize]].');\n  assert(container._queue.length > 0, 'Spec-level failure: should never dequeue from an empty queue.');\n\n  var pair = container._queue.shift();\n  container._queueTotalSize -= pair.size;\n  if (container._queueTotalSize < 0) {\n    container._queueTotalSize = 0;\n  }\n\n  return pair.value;\n};\n\nexports.EnqueueValueWithSize = function (container, value, size) {\n  assert('_queue' in container && '_queueTotalSize' in container, 'Spec-level failure: EnqueueValueWithSize should only be used on containers with [[queue]] and ' + '[[queueTotalSize]].');\n\n  size = Number(size);\n  if (!IsFiniteNonNegativeNumber(size)) {\n    throw new RangeError('Size must be a finite, non-NaN, non-negative number.');\n  }\n\n  container._queue.push({ value: value, size: size });\n  container._queueTotalSize += size;\n};\n\nexports.PeekQueueValue = function (container) {\n  assert('_queue' in container && '_queueTotalSize' in container, 'Spec-level failure: PeekQueueValue should only be used on containers with [[queue]] and [[queueTotalSize]].');\n  assert(container._queue.length > 0, 'Spec-level failure: should never peek at an empty queue.');\n\n  var pair = container._queue[0];\n  return pair.value;\n};\n\nexports.ResetQueue = function (container) {\n  assert('_queue' in container && '_queueTotalSize' in container, 'Spec-level failure: ResetQueue should only be used on containers with [[queue]] and [[queueTotalSize]].');\n\n  container._queue = [];\n  container._queueTotalSize = 0;\n};\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar _require = __w_pdfjs_require__(0),\n    ArrayBufferCopy = _require.ArrayBufferCopy,\n    CreateIterResultObject = _require.CreateIterResultObject,\n    IsFiniteNonNegativeNumber = _require.IsFiniteNonNegativeNumber,\n    InvokeOrNoop = _require.InvokeOrNoop,\n    PromiseInvokeOrNoop = _require.PromiseInvokeOrNoop,\n    TransferArrayBuffer = _require.TransferArrayBuffer,\n    ValidateAndNormalizeQueuingStrategy = _require.ValidateAndNormalizeQueuingStrategy,\n    ValidateAndNormalizeHighWaterMark = _require.ValidateAndNormalizeHighWaterMark;\n\nvar _require2 = __w_pdfjs_require__(0),\n    createArrayFromList = _require2.createArrayFromList,\n    createDataProperty = _require2.createDataProperty,\n    typeIsObject = _require2.typeIsObject;\n\nvar _require3 = __w_pdfjs_require__(1),\n    assert = _require3.assert,\n    rethrowAssertionErrorRejection = _require3.rethrowAssertionErrorRejection;\n\nvar _require4 = __w_pdfjs_require__(3),\n    DequeueValue = _require4.DequeueValue,\n    EnqueueValueWithSize = _require4.EnqueueValueWithSize,\n    ResetQueue = _require4.ResetQueue;\n\nvar _require5 = __w_pdfjs_require__(2),\n    AcquireWritableStreamDefaultWriter = _require5.AcquireWritableStreamDefaultWriter,\n    IsWritableStream = _require5.IsWritableStream,\n    IsWritableStreamLocked = _require5.IsWritableStreamLocked,\n    WritableStreamAbort = _require5.WritableStreamAbort,\n    WritableStreamDefaultWriterCloseWithErrorPropagation = _require5.WritableStreamDefaultWriterCloseWithErrorPropagation,\n    WritableStreamDefaultWriterRelease = _require5.WritableStreamDefaultWriterRelease,\n    WritableStreamDefaultWriterWrite = _require5.WritableStreamDefaultWriterWrite,\n    WritableStreamCloseQueuedOrInFlight = _require5.WritableStreamCloseQueuedOrInFlight;\n\nvar ReadableStream = function () {\n  function ReadableStream() {\n    var underlyingSource = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n    var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n        size = _ref.size,\n        highWaterMark = _ref.highWaterMark;\n\n    _classCallCheck(this, ReadableStream);\n\n    // Exposed to controllers.\n    this._state = 'readable';\n\n    this._reader = undefined;\n    this._storedError = undefined;\n\n    this._disturbed = false;\n\n    // Initialize to undefined first because the constructor of the controller checks this\n    // variable to validate the caller.\n    this._readableStreamController = undefined;\n    var type = underlyingSource.type;\n    var typeString = String(type);\n    if (typeString === 'bytes') {\n      if (highWaterMark === undefined) {\n        highWaterMark = 0;\n      }\n      this._readableStreamController = new ReadableByteStreamController(this, underlyingSource, highWaterMark);\n    } else if (type === undefined) {\n      if (highWaterMark === undefined) {\n        highWaterMark = 1;\n      }\n      this._readableStreamController = new ReadableStreamDefaultController(this, underlyingSource, size, highWaterMark);\n    } else {\n      throw new RangeError('Invalid type is specified');\n    }\n  }\n\n  _createClass(ReadableStream, [{\n    key: 'cancel',\n    value: function cancel(reason) {\n      if (IsReadableStream(this) === false) {\n        return Promise.reject(streamBrandCheckException('cancel'));\n      }\n\n      if (IsReadableStreamLocked(this) === true) {\n        return Promise.reject(new TypeError('Cannot cancel a stream that already has a reader'));\n      }\n\n      return ReadableStreamCancel(this, reason);\n    }\n  }, {\n    key: 'getReader',\n    value: function getReader() {\n      var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n          mode = _ref2.mode;\n\n      if (IsReadableStream(this) === false) {\n        throw streamBrandCheckException('getReader');\n      }\n\n      if (mode === undefined) {\n        return AcquireReadableStreamDefaultReader(this);\n      }\n\n      mode = String(mode);\n\n      if (mode === 'byob') {\n        return AcquireReadableStreamBYOBReader(this);\n      }\n\n      throw new RangeError('Invalid mode is specified');\n    }\n  }, {\n    key: 'pipeThrough',\n    value: function pipeThrough(_ref3, options) {\n      var writable = _ref3.writable,\n          readable = _ref3.readable;\n\n      var promise = this.pipeTo(writable, options);\n\n      ifIsObjectAndHasAPromiseIsHandledInternalSlotSetPromiseIsHandledToTrue(promise);\n\n      return readable;\n    }\n  }, {\n    key: 'pipeTo',\n    value: function pipeTo(dest) {\n      var _this = this;\n\n      var _ref4 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n          preventClose = _ref4.preventClose,\n          preventAbort = _ref4.preventAbort,\n          preventCancel = _ref4.preventCancel;\n\n      if (IsReadableStream(this) === false) {\n        return Promise.reject(streamBrandCheckException('pipeTo'));\n      }\n      if (IsWritableStream(dest) === false) {\n        return Promise.reject(new TypeError('ReadableStream.prototype.pipeTo\\'s first argument must be a WritableStream'));\n      }\n\n      preventClose = Boolean(preventClose);\n      preventAbort = Boolean(preventAbort);\n      preventCancel = Boolean(preventCancel);\n\n      if (IsReadableStreamLocked(this) === true) {\n        return Promise.reject(new TypeError('ReadableStream.prototype.pipeTo cannot be used on a locked ReadableStream'));\n      }\n      if (IsWritableStreamLocked(dest) === true) {\n        return Promise.reject(new TypeError('ReadableStream.prototype.pipeTo cannot be used on a locked WritableStream'));\n      }\n\n      var reader = AcquireReadableStreamDefaultReader(this);\n      var writer = AcquireWritableStreamDefaultWriter(dest);\n\n      var shuttingDown = false;\n\n      // This is used to keep track of the spec's requirement that we wait for ongoing writes during shutdown.\n      var currentWrite = Promise.resolve();\n\n      return new Promise(function (resolve, reject) {\n        // Using reader and writer, read all chunks from this and write them to dest\n        // - Backpressure must be enforced\n        // - Shutdown must stop all activity\n        function pipeLoop() {\n          currentWrite = Promise.resolve();\n\n          if (shuttingDown === true) {\n            return Promise.resolve();\n          }\n\n          return writer._readyPromise.then(function () {\n            return ReadableStreamDefaultReaderRead(reader).then(function (_ref5) {\n              var value = _ref5.value,\n                  done = _ref5.done;\n\n              if (done === true) {\n                return;\n              }\n\n              currentWrite = WritableStreamDefaultWriterWrite(writer, value).catch(function () {});\n            });\n          }).then(pipeLoop);\n        }\n\n        // Errors must be propagated forward\n        isOrBecomesErrored(_this, reader._closedPromise, function (storedError) {\n          if (preventAbort === false) {\n            shutdownWithAction(function () {\n              return WritableStreamAbort(dest, storedError);\n            }, true, storedError);\n          } else {\n            shutdown(true, storedError);\n          }\n        });\n\n        // Errors must be propagated backward\n        isOrBecomesErrored(dest, writer._closedPromise, function (storedError) {\n          if (preventCancel === false) {\n            shutdownWithAction(function () {\n              return ReadableStreamCancel(_this, storedError);\n            }, true, storedError);\n          } else {\n            shutdown(true, storedError);\n          }\n        });\n\n        // Closing must be propagated forward\n        isOrBecomesClosed(_this, reader._closedPromise, function () {\n          if (preventClose === false) {\n            shutdownWithAction(function () {\n              return WritableStreamDefaultWriterCloseWithErrorPropagation(writer);\n            });\n          } else {\n            shutdown();\n          }\n        });\n\n        // Closing must be propagated backward\n        if (WritableStreamCloseQueuedOrInFlight(dest) === true || dest._state === 'closed') {\n          var destClosed = new TypeError('the destination writable stream closed before all data could be piped to it');\n\n          if (preventCancel === false) {\n            shutdownWithAction(function () {\n              return ReadableStreamCancel(_this, destClosed);\n            }, true, destClosed);\n          } else {\n            shutdown(true, destClosed);\n          }\n        }\n\n        pipeLoop().catch(function (err) {\n          currentWrite = Promise.resolve();\n          rethrowAssertionErrorRejection(err);\n        });\n\n        function waitForWritesToFinish() {\n          // Another write may have started while we were waiting on this currentWrite, so we have to be sure to wait\n          // for that too.\n          var oldCurrentWrite = currentWrite;\n          return currentWrite.then(function () {\n            return oldCurrentWrite !== currentWrite ? waitForWritesToFinish() : undefined;\n          });\n        }\n\n        function isOrBecomesErrored(stream, promise, action) {\n          if (stream._state === 'errored') {\n            action(stream._storedError);\n          } else {\n            promise.catch(action).catch(rethrowAssertionErrorRejection);\n          }\n        }\n\n        function isOrBecomesClosed(stream, promise, action) {\n          if (stream._state === 'closed') {\n            action();\n          } else {\n            promise.then(action).catch(rethrowAssertionErrorRejection);\n          }\n        }\n\n        function shutdownWithAction(action, originalIsError, originalError) {\n          if (shuttingDown === true) {\n            return;\n          }\n          shuttingDown = true;\n\n          if (dest._state === 'writable' && WritableStreamCloseQueuedOrInFlight(dest) === false) {\n            waitForWritesToFinish().then(doTheRest);\n          } else {\n            doTheRest();\n          }\n\n          function doTheRest() {\n            action().then(function () {\n              return finalize(originalIsError, originalError);\n            }, function (newError) {\n              return finalize(true, newError);\n            }).catch(rethrowAssertionErrorRejection);\n          }\n        }\n\n        function shutdown(isError, error) {\n          if (shuttingDown === true) {\n            return;\n          }\n          shuttingDown = true;\n\n          if (dest._state === 'writable' && WritableStreamCloseQueuedOrInFlight(dest) === false) {\n            waitForWritesToFinish().then(function () {\n              return finalize(isError, error);\n            }).catch(rethrowAssertionErrorRejection);\n          } else {\n            finalize(isError, error);\n          }\n        }\n\n        function finalize(isError, error) {\n          WritableStreamDefaultWriterRelease(writer);\n          ReadableStreamReaderGenericRelease(reader);\n\n          if (isError) {\n            reject(error);\n          } else {\n            resolve(undefined);\n          }\n        }\n      });\n    }\n  }, {\n    key: 'tee',\n    value: function tee() {\n      if (IsReadableStream(this) === false) {\n        throw streamBrandCheckException('tee');\n      }\n\n      var branches = ReadableStreamTee(this, false);\n      return createArrayFromList(branches);\n    }\n  }, {\n    key: 'locked',\n    get: function get() {\n      if (IsReadableStream(this) === false) {\n        throw streamBrandCheckException('locked');\n      }\n\n      return IsReadableStreamLocked(this);\n    }\n  }]);\n\n  return ReadableStream;\n}();\n\nmodule.exports = {\n  ReadableStream: ReadableStream,\n  IsReadableStreamDisturbed: IsReadableStreamDisturbed,\n  ReadableStreamDefaultControllerClose: ReadableStreamDefaultControllerClose,\n  ReadableStreamDefaultControllerEnqueue: ReadableStreamDefaultControllerEnqueue,\n  ReadableStreamDefaultControllerError: ReadableStreamDefaultControllerError,\n  ReadableStreamDefaultControllerGetDesiredSize: ReadableStreamDefaultControllerGetDesiredSize\n};\n\n// Abstract operations for the ReadableStream.\n\nfunction AcquireReadableStreamBYOBReader(stream) {\n  return new ReadableStreamBYOBReader(stream);\n}\n\nfunction AcquireReadableStreamDefaultReader(stream) {\n  return new ReadableStreamDefaultReader(stream);\n}\n\nfunction IsReadableStream(x) {\n  if (!typeIsObject(x)) {\n    return false;\n  }\n\n  if (!Object.prototype.hasOwnProperty.call(x, '_readableStreamController')) {\n    return false;\n  }\n\n  return true;\n}\n\nfunction IsReadableStreamDisturbed(stream) {\n  assert(IsReadableStream(stream) === true, 'IsReadableStreamDisturbed should only be used on known readable streams');\n\n  return stream._disturbed;\n}\n\nfunction IsReadableStreamLocked(stream) {\n  assert(IsReadableStream(stream) === true, 'IsReadableStreamLocked should only be used on known readable streams');\n\n  if (stream._reader === undefined) {\n    return false;\n  }\n\n  return true;\n}\n\nfunction ReadableStreamTee(stream, cloneForBranch2) {\n  assert(IsReadableStream(stream) === true);\n  assert(typeof cloneForBranch2 === 'boolean');\n\n  var reader = AcquireReadableStreamDefaultReader(stream);\n\n  var teeState = {\n    closedOrErrored: false,\n    canceled1: false,\n    canceled2: false,\n    reason1: undefined,\n    reason2: undefined\n  };\n  teeState.promise = new Promise(function (resolve) {\n    teeState._resolve = resolve;\n  });\n\n  var pull = create_ReadableStreamTeePullFunction();\n  pull._reader = reader;\n  pull._teeState = teeState;\n  pull._cloneForBranch2 = cloneForBranch2;\n\n  var cancel1 = create_ReadableStreamTeeBranch1CancelFunction();\n  cancel1._stream = stream;\n  cancel1._teeState = teeState;\n\n  var cancel2 = create_ReadableStreamTeeBranch2CancelFunction();\n  cancel2._stream = stream;\n  cancel2._teeState = teeState;\n\n  var underlyingSource1 = Object.create(Object.prototype);\n  createDataProperty(underlyingSource1, 'pull', pull);\n  createDataProperty(underlyingSource1, 'cancel', cancel1);\n  var branch1Stream = new ReadableStream(underlyingSource1);\n\n  var underlyingSource2 = Object.create(Object.prototype);\n  createDataProperty(underlyingSource2, 'pull', pull);\n  createDataProperty(underlyingSource2, 'cancel', cancel2);\n  var branch2Stream = new ReadableStream(underlyingSource2);\n\n  pull._branch1 = branch1Stream._readableStreamController;\n  pull._branch2 = branch2Stream._readableStreamController;\n\n  reader._closedPromise.catch(function (r) {\n    if (teeState.closedOrErrored === true) {\n      return;\n    }\n\n    ReadableStreamDefaultControllerError(pull._branch1, r);\n    ReadableStreamDefaultControllerError(pull._branch2, r);\n    teeState.closedOrErrored = true;\n  });\n\n  return [branch1Stream, branch2Stream];\n}\n\nfunction create_ReadableStreamTeePullFunction() {\n  function f() {\n    var reader = f._reader,\n        branch1 = f._branch1,\n        branch2 = f._branch2,\n        teeState = f._teeState;\n\n\n    return ReadableStreamDefaultReaderRead(reader).then(function (result) {\n      assert(typeIsObject(result));\n      var value = result.value;\n      var done = result.done;\n      assert(typeof done === 'boolean');\n\n      if (done === true && teeState.closedOrErrored === false) {\n        if (teeState.canceled1 === false) {\n          ReadableStreamDefaultControllerClose(branch1);\n        }\n        if (teeState.canceled2 === false) {\n          ReadableStreamDefaultControllerClose(branch2);\n        }\n        teeState.closedOrErrored = true;\n      }\n\n      if (teeState.closedOrErrored === true) {\n        return;\n      }\n\n      var value1 = value;\n      var value2 = value;\n\n      // There is no way to access the cloning code right now in the reference implementation.\n      // If we add one then we'll need an implementation for serializable objects.\n      // if (teeState.canceled2 === false && cloneForBranch2 === true) {\n      //   value2 = StructuredDeserialize(StructuredSerialize(value2));\n      // }\n\n      if (teeState.canceled1 === false) {\n        ReadableStreamDefaultControllerEnqueue(branch1, value1);\n      }\n\n      if (teeState.canceled2 === false) {\n        ReadableStreamDefaultControllerEnqueue(branch2, value2);\n      }\n    });\n  }\n  return f;\n}\n\nfunction create_ReadableStreamTeeBranch1CancelFunction() {\n  function f(reason) {\n    var stream = f._stream,\n        teeState = f._teeState;\n\n\n    teeState.canceled1 = true;\n    teeState.reason1 = reason;\n    if (teeState.canceled2 === true) {\n      var compositeReason = createArrayFromList([teeState.reason1, teeState.reason2]);\n      var cancelResult = ReadableStreamCancel(stream, compositeReason);\n      teeState._resolve(cancelResult);\n    }\n    return teeState.promise;\n  }\n  return f;\n}\n\nfunction create_ReadableStreamTeeBranch2CancelFunction() {\n  function f(reason) {\n    var stream = f._stream,\n        teeState = f._teeState;\n\n\n    teeState.canceled2 = true;\n    teeState.reason2 = reason;\n    if (teeState.canceled1 === true) {\n      var compositeReason = createArrayFromList([teeState.reason1, teeState.reason2]);\n      var cancelResult = ReadableStreamCancel(stream, compositeReason);\n      teeState._resolve(cancelResult);\n    }\n    return teeState.promise;\n  }\n  return f;\n}\n\n// ReadableStream API exposed for controllers.\n\nfunction ReadableStreamAddReadIntoRequest(stream) {\n  assert(IsReadableStreamBYOBReader(stream._reader) === true);\n  assert(stream._state === 'readable' || stream._state === 'closed');\n\n  var promise = new Promise(function (resolve, reject) {\n    var readIntoRequest = {\n      _resolve: resolve,\n      _reject: reject\n    };\n\n    stream._reader._readIntoRequests.push(readIntoRequest);\n  });\n\n  return promise;\n}\n\nfunction ReadableStreamAddReadRequest(stream) {\n  assert(IsReadableStreamDefaultReader(stream._reader) === true);\n  assert(stream._state === 'readable');\n\n  var promise = new Promise(function (resolve, reject) {\n    var readRequest = {\n      _resolve: resolve,\n      _reject: reject\n    };\n\n    stream._reader._readRequests.push(readRequest);\n  });\n\n  return promise;\n}\n\nfunction ReadableStreamCancel(stream, reason) {\n  stream._disturbed = true;\n\n  if (stream._state === 'closed') {\n    return Promise.resolve(undefined);\n  }\n  if (stream._state === 'errored') {\n    return Promise.reject(stream._storedError);\n  }\n\n  ReadableStreamClose(stream);\n\n  var sourceCancelPromise = stream._readableStreamController.__cancelSteps(reason);\n  return sourceCancelPromise.then(function () {\n    return undefined;\n  });\n}\n\nfunction ReadableStreamClose(stream) {\n  assert(stream._state === 'readable');\n\n  stream._state = 'closed';\n\n  var reader = stream._reader;\n\n  if (reader === undefined) {\n    return undefined;\n  }\n\n  if (IsReadableStreamDefaultReader(reader) === true) {\n    for (var i = 0; i < reader._readRequests.length; i++) {\n      var _resolve = reader._readRequests[i]._resolve;\n\n      _resolve(CreateIterResultObject(undefined, true));\n    }\n    reader._readRequests = [];\n  }\n\n  defaultReaderClosedPromiseResolve(reader);\n\n  return undefined;\n}\n\nfunction ReadableStreamError(stream, e) {\n  assert(IsReadableStream(stream) === true, 'stream must be ReadableStream');\n  assert(stream._state === 'readable', 'state must be readable');\n\n  stream._state = 'errored';\n  stream._storedError = e;\n\n  var reader = stream._reader;\n\n  if (reader === undefined) {\n    return undefined;\n  }\n\n  if (IsReadableStreamDefaultReader(reader) === true) {\n    for (var i = 0; i < reader._readRequests.length; i++) {\n      var readRequest = reader._readRequests[i];\n      readRequest._reject(e);\n    }\n\n    reader._readRequests = [];\n  } else {\n    assert(IsReadableStreamBYOBReader(reader), 'reader must be ReadableStreamBYOBReader');\n\n    for (var _i = 0; _i < reader._readIntoRequests.length; _i++) {\n      var readIntoRequest = reader._readIntoRequests[_i];\n      readIntoRequest._reject(e);\n    }\n\n    reader._readIntoRequests = [];\n  }\n\n  defaultReaderClosedPromiseReject(reader, e);\n  reader._closedPromise.catch(function () {});\n}\n\nfunction ReadableStreamFulfillReadIntoRequest(stream, chunk, done) {\n  var reader = stream._reader;\n\n  assert(reader._readIntoRequests.length > 0);\n\n  var readIntoRequest = reader._readIntoRequests.shift();\n  readIntoRequest._resolve(CreateIterResultObject(chunk, done));\n}\n\nfunction ReadableStreamFulfillReadRequest(stream, chunk, done) {\n  var reader = stream._reader;\n\n  assert(reader._readRequests.length > 0);\n\n  var readRequest = reader._readRequests.shift();\n  readRequest._resolve(CreateIterResultObject(chunk, done));\n}\n\nfunction ReadableStreamGetNumReadIntoRequests(stream) {\n  return stream._reader._readIntoRequests.length;\n}\n\nfunction ReadableStreamGetNumReadRequests(stream) {\n  return stream._reader._readRequests.length;\n}\n\nfunction ReadableStreamHasBYOBReader(stream) {\n  var reader = stream._reader;\n\n  if (reader === undefined) {\n    return false;\n  }\n\n  if (IsReadableStreamBYOBReader(reader) === false) {\n    return false;\n  }\n\n  return true;\n}\n\nfunction ReadableStreamHasDefaultReader(stream) {\n  var reader = stream._reader;\n\n  if (reader === undefined) {\n    return false;\n  }\n\n  if (IsReadableStreamDefaultReader(reader) === false) {\n    return false;\n  }\n\n  return true;\n}\n\n// Readers\n\nvar ReadableStreamDefaultReader = function () {\n  function ReadableStreamDefaultReader(stream) {\n    _classCallCheck(this, ReadableStreamDefaultReader);\n\n    if (IsReadableStream(stream) === false) {\n      throw new TypeError('ReadableStreamDefaultReader can only be constructed with a ReadableStream instance');\n    }\n    if (IsReadableStreamLocked(stream) === true) {\n      throw new TypeError('This stream has already been locked for exclusive reading by another reader');\n    }\n\n    ReadableStreamReaderGenericInitialize(this, stream);\n\n    this._readRequests = [];\n  }\n\n  _createClass(ReadableStreamDefaultReader, [{\n    key: 'cancel',\n    value: function cancel(reason) {\n      if (IsReadableStreamDefaultReader(this) === false) {\n        return Promise.reject(defaultReaderBrandCheckException('cancel'));\n      }\n\n      if (this._ownerReadableStream === undefined) {\n        return Promise.reject(readerLockException('cancel'));\n      }\n\n      return ReadableStreamReaderGenericCancel(this, reason);\n    }\n  }, {\n    key: 'read',\n    value: function read() {\n      if (IsReadableStreamDefaultReader(this) === false) {\n        return Promise.reject(defaultReaderBrandCheckException('read'));\n      }\n\n      if (this._ownerReadableStream === undefined) {\n        return Promise.reject(readerLockException('read from'));\n      }\n\n      return ReadableStreamDefaultReaderRead(this);\n    }\n  }, {\n    key: 'releaseLock',\n    value: function releaseLock() {\n      if (IsReadableStreamDefaultReader(this) === false) {\n        throw defaultReaderBrandCheckException('releaseLock');\n      }\n\n      if (this._ownerReadableStream === undefined) {\n        return;\n      }\n\n      if (this._readRequests.length > 0) {\n        throw new TypeError('Tried to release a reader lock when that reader has pending read() calls un-settled');\n      }\n\n      ReadableStreamReaderGenericRelease(this);\n    }\n  }, {\n    key: 'closed',\n    get: function get() {\n      if (IsReadableStreamDefaultReader(this) === false) {\n        return Promise.reject(defaultReaderBrandCheckException('closed'));\n      }\n\n      return this._closedPromise;\n    }\n  }]);\n\n  return ReadableStreamDefaultReader;\n}();\n\nvar ReadableStreamBYOBReader = function () {\n  function ReadableStreamBYOBReader(stream) {\n    _classCallCheck(this, ReadableStreamBYOBReader);\n\n    if (!IsReadableStream(stream)) {\n      throw new TypeError('ReadableStreamBYOBReader can only be constructed with a ReadableStream instance given a ' + 'byte source');\n    }\n    if (IsReadableByteStreamController(stream._readableStreamController) === false) {\n      throw new TypeError('Cannot construct a ReadableStreamBYOBReader for a stream not constructed with a byte ' + 'source');\n    }\n    if (IsReadableStreamLocked(stream)) {\n      throw new TypeError('This stream has already been locked for exclusive reading by another reader');\n    }\n\n    ReadableStreamReaderGenericInitialize(this, stream);\n\n    this._readIntoRequests = [];\n  }\n\n  _createClass(ReadableStreamBYOBReader, [{\n    key: 'cancel',\n    value: function cancel(reason) {\n      if (!IsReadableStreamBYOBReader(this)) {\n        return Promise.reject(byobReaderBrandCheckException('cancel'));\n      }\n\n      if (this._ownerReadableStream === undefined) {\n        return Promise.reject(readerLockException('cancel'));\n      }\n\n      return ReadableStreamReaderGenericCancel(this, reason);\n    }\n  }, {\n    key: 'read',\n    value: function read(view) {\n      if (!IsReadableStreamBYOBReader(this)) {\n        return Promise.reject(byobReaderBrandCheckException('read'));\n      }\n\n      if (this._ownerReadableStream === undefined) {\n        return Promise.reject(readerLockException('read from'));\n      }\n\n      if (!ArrayBuffer.isView(view)) {\n        return Promise.reject(new TypeError('view must be an array buffer view'));\n      }\n\n      if (view.byteLength === 0) {\n        return Promise.reject(new TypeError('view must have non-zero byteLength'));\n      }\n\n      return ReadableStreamBYOBReaderRead(this, view);\n    }\n  }, {\n    key: 'releaseLock',\n    value: function releaseLock() {\n      if (!IsReadableStreamBYOBReader(this)) {\n        throw byobReaderBrandCheckException('releaseLock');\n      }\n\n      if (this._ownerReadableStream === undefined) {\n        return;\n      }\n\n      if (this._readIntoRequests.length > 0) {\n        throw new TypeError('Tried to release a reader lock when that reader has pending read() calls un-settled');\n      }\n\n      ReadableStreamReaderGenericRelease(this);\n    }\n  }, {\n    key: 'closed',\n    get: function get() {\n      if (!IsReadableStreamBYOBReader(this)) {\n        return Promise.reject(byobReaderBrandCheckException('closed'));\n      }\n\n      return this._closedPromise;\n    }\n  }]);\n\n  return ReadableStreamBYOBReader;\n}();\n\n// Abstract operations for the readers.\n\nfunction IsReadableStreamBYOBReader(x) {\n  if (!typeIsObject(x)) {\n    return false;\n  }\n\n  if (!Object.prototype.hasOwnProperty.call(x, '_readIntoRequests')) {\n    return false;\n  }\n\n  return true;\n}\n\nfunction IsReadableStreamDefaultReader(x) {\n  if (!typeIsObject(x)) {\n    return false;\n  }\n\n  if (!Object.prototype.hasOwnProperty.call(x, '_readRequests')) {\n    return false;\n  }\n\n  return true;\n}\n\nfunction ReadableStreamReaderGenericInitialize(reader, stream) {\n  reader._ownerReadableStream = stream;\n  stream._reader = reader;\n\n  if (stream._state === 'readable') {\n    defaultReaderClosedPromiseInitialize(reader);\n  } else if (stream._state === 'closed') {\n    defaultReaderClosedPromiseInitializeAsResolved(reader);\n  } else {\n    assert(stream._state === 'errored', 'state must be errored');\n\n    defaultReaderClosedPromiseInitializeAsRejected(reader, stream._storedError);\n    reader._closedPromise.catch(function () {});\n  }\n}\n\n// A client of ReadableStreamDefaultReader and ReadableStreamBYOBReader may use these functions directly to bypass state\n// check.\n\nfunction ReadableStreamReaderGenericCancel(reader, reason) {\n  var stream = reader._ownerReadableStream;\n  assert(stream !== undefined);\n  return ReadableStreamCancel(stream, reason);\n}\n\nfunction ReadableStreamReaderGenericRelease(reader) {\n  assert(reader._ownerReadableStream !== undefined);\n  assert(reader._ownerReadableStream._reader === reader);\n\n  if (reader._ownerReadableStream._state === 'readable') {\n    defaultReaderClosedPromiseReject(reader, new TypeError('Reader was released and can no longer be used to monitor the stream\\'s closedness'));\n  } else {\n    defaultReaderClosedPromiseResetToRejected(reader, new TypeError('Reader was released and can no longer be used to monitor the stream\\'s closedness'));\n  }\n  reader._closedPromise.catch(function () {});\n\n  reader._ownerReadableStream._reader = undefined;\n  reader._ownerReadableStream = undefined;\n}\n\nfunction ReadableStreamBYOBReaderRead(reader, view) {\n  var stream = reader._ownerReadableStream;\n\n  assert(stream !== undefined);\n\n  stream._disturbed = true;\n\n  if (stream._state === 'errored') {\n    return Promise.reject(stream._storedError);\n  }\n\n  // Controllers must implement this.\n  return ReadableByteStreamControllerPullInto(stream._readableStreamController, view);\n}\n\nfunction ReadableStreamDefaultReaderRead(reader) {\n  var stream = reader._ownerReadableStream;\n\n  assert(stream !== undefined);\n\n  stream._disturbed = true;\n\n  if (stream._state === 'closed') {\n    return Promise.resolve(CreateIterResultObject(undefined, true));\n  }\n\n  if (stream._state === 'errored') {\n    return Promise.reject(stream._storedError);\n  }\n\n  assert(stream._state === 'readable');\n\n  return stream._readableStreamController.__pullSteps();\n}\n\n// Controllers\n\nvar ReadableStreamDefaultController = function () {\n  function ReadableStreamDefaultController(stream, underlyingSource, size, highWaterMark) {\n    _classCallCheck(this, ReadableStreamDefaultController);\n\n    if (IsReadableStream(stream) === false) {\n      throw new TypeError('ReadableStreamDefaultController can only be constructed with a ReadableStream instance');\n    }\n\n    if (stream._readableStreamController !== undefined) {\n      throw new TypeError('ReadableStreamDefaultController instances can only be created by the ReadableStream constructor');\n    }\n\n    this._controlledReadableStream = stream;\n\n    this._underlyingSource = underlyingSource;\n\n    // Need to set the slots so that the assert doesn't fire. In the spec the slots already exist implicitly.\n    this._queue = undefined;\n    this._queueTotalSize = undefined;\n    ResetQueue(this);\n\n    this._started = false;\n    this._closeRequested = false;\n    this._pullAgain = false;\n    this._pulling = false;\n\n    var normalizedStrategy = ValidateAndNormalizeQueuingStrategy(size, highWaterMark);\n    this._strategySize = normalizedStrategy.size;\n    this._strategyHWM = normalizedStrategy.highWaterMark;\n\n    var controller = this;\n\n    var startResult = InvokeOrNoop(underlyingSource, 'start', [this]);\n    Promise.resolve(startResult).then(function () {\n      controller._started = true;\n\n      assert(controller._pulling === false);\n      assert(controller._pullAgain === false);\n\n      ReadableStreamDefaultControllerCallPullIfNeeded(controller);\n    }, function (r) {\n      ReadableStreamDefaultControllerErrorIfNeeded(controller, r);\n    }).catch(rethrowAssertionErrorRejection);\n  }\n\n  _createClass(ReadableStreamDefaultController, [{\n    key: 'close',\n    value: function close() {\n      if (IsReadableStreamDefaultController(this) === false) {\n        throw defaultControllerBrandCheckException('close');\n      }\n\n      if (this._closeRequested === true) {\n        throw new TypeError('The stream has already been closed; do not close it again!');\n      }\n\n      var state = this._controlledReadableStream._state;\n      if (state !== 'readable') {\n        throw new TypeError('The stream (in ' + state + ' state) is not in the readable state and cannot be closed');\n      }\n\n      ReadableStreamDefaultControllerClose(this);\n    }\n  }, {\n    key: 'enqueue',\n    value: function enqueue(chunk) {\n      if (IsReadableStreamDefaultController(this) === false) {\n        throw defaultControllerBrandCheckException('enqueue');\n      }\n\n      if (this._closeRequested === true) {\n        throw new TypeError('stream is closed or draining');\n      }\n\n      var state = this._controlledReadableStream._state;\n      if (state !== 'readable') {\n        throw new TypeError('The stream (in ' + state + ' state) is not in the readable state and cannot be enqueued to');\n      }\n\n      return ReadableStreamDefaultControllerEnqueue(this, chunk);\n    }\n  }, {\n    key: 'error',\n    value: function error(e) {\n      if (IsReadableStreamDefaultController(this) === false) {\n        throw defaultControllerBrandCheckException('error');\n      }\n\n      var stream = this._controlledReadableStream;\n      if (stream._state !== 'readable') {\n        throw new TypeError('The stream is ' + stream._state + ' and so cannot be errored');\n      }\n\n      ReadableStreamDefaultControllerError(this, e);\n    }\n  }, {\n    key: '__cancelSteps',\n    value: function __cancelSteps(reason) {\n      ResetQueue(this);\n      return PromiseInvokeOrNoop(this._underlyingSource, 'cancel', [reason]);\n    }\n  }, {\n    key: '__pullSteps',\n    value: function __pullSteps() {\n      var stream = this._controlledReadableStream;\n\n      if (this._queue.length > 0) {\n        var chunk = DequeueValue(this);\n\n        if (this._closeRequested === true && this._queue.length === 0) {\n          ReadableStreamClose(stream);\n        } else {\n          ReadableStreamDefaultControllerCallPullIfNeeded(this);\n        }\n\n        return Promise.resolve(CreateIterResultObject(chunk, false));\n      }\n\n      var pendingPromise = ReadableStreamAddReadRequest(stream);\n      ReadableStreamDefaultControllerCallPullIfNeeded(this);\n      return pendingPromise;\n    }\n  }, {\n    key: 'desiredSize',\n    get: function get() {\n      if (IsReadableStreamDefaultController(this) === false) {\n        throw defaultControllerBrandCheckException('desiredSize');\n      }\n\n      return ReadableStreamDefaultControllerGetDesiredSize(this);\n    }\n  }]);\n\n  return ReadableStreamDefaultController;\n}();\n\n// Abstract operations for the ReadableStreamDefaultController.\n\nfunction IsReadableStreamDefaultController(x) {\n  if (!typeIsObject(x)) {\n    return false;\n  }\n\n  if (!Object.prototype.hasOwnProperty.call(x, '_underlyingSource')) {\n    return false;\n  }\n\n  return true;\n}\n\nfunction ReadableStreamDefaultControllerCallPullIfNeeded(controller) {\n  var shouldPull = ReadableStreamDefaultControllerShouldCallPull(controller);\n  if (shouldPull === false) {\n    return undefined;\n  }\n\n  if (controller._pulling === true) {\n    controller._pullAgain = true;\n    return undefined;\n  }\n\n  assert(controller._pullAgain === false);\n\n  controller._pulling = true;\n\n  var pullPromise = PromiseInvokeOrNoop(controller._underlyingSource, 'pull', [controller]);\n  pullPromise.then(function () {\n    controller._pulling = false;\n\n    if (controller._pullAgain === true) {\n      controller._pullAgain = false;\n      return ReadableStreamDefaultControllerCallPullIfNeeded(controller);\n    }\n    return undefined;\n  }, function (e) {\n    ReadableStreamDefaultControllerErrorIfNeeded(controller, e);\n  }).catch(rethrowAssertionErrorRejection);\n\n  return undefined;\n}\n\nfunction ReadableStreamDefaultControllerShouldCallPull(controller) {\n  var stream = controller._controlledReadableStream;\n\n  if (stream._state === 'closed' || stream._state === 'errored') {\n    return false;\n  }\n\n  if (controller._closeRequested === true) {\n    return false;\n  }\n\n  if (controller._started === false) {\n    return false;\n  }\n\n  if (IsReadableStreamLocked(stream) === true && ReadableStreamGetNumReadRequests(stream) > 0) {\n    return true;\n  }\n\n  var desiredSize = ReadableStreamDefaultControllerGetDesiredSize(controller);\n  if (desiredSize > 0) {\n    return true;\n  }\n\n  return false;\n}\n\n// A client of ReadableStreamDefaultController may use these functions directly to bypass state check.\n\nfunction ReadableStreamDefaultControllerClose(controller) {\n  var stream = controller._controlledReadableStream;\n\n  assert(controller._closeRequested === false);\n  assert(stream._state === 'readable');\n\n  controller._closeRequested = true;\n\n  if (controller._queue.length === 0) {\n    ReadableStreamClose(stream);\n  }\n}\n\nfunction ReadableStreamDefaultControllerEnqueue(controller, chunk) {\n  var stream = controller._controlledReadableStream;\n\n  assert(controller._closeRequested === false);\n  assert(stream._state === 'readable');\n\n  if (IsReadableStreamLocked(stream) === true && ReadableStreamGetNumReadRequests(stream) > 0) {\n    ReadableStreamFulfillReadRequest(stream, chunk, false);\n  } else {\n    var chunkSize = 1;\n\n    if (controller._strategySize !== undefined) {\n      var strategySize = controller._strategySize;\n      try {\n        chunkSize = strategySize(chunk);\n      } catch (chunkSizeE) {\n        ReadableStreamDefaultControllerErrorIfNeeded(controller, chunkSizeE);\n        throw chunkSizeE;\n      }\n    }\n\n    try {\n      EnqueueValueWithSize(controller, chunk, chunkSize);\n    } catch (enqueueE) {\n      ReadableStreamDefaultControllerErrorIfNeeded(controller, enqueueE);\n      throw enqueueE;\n    }\n  }\n\n  ReadableStreamDefaultControllerCallPullIfNeeded(controller);\n\n  return undefined;\n}\n\nfunction ReadableStreamDefaultControllerError(controller, e) {\n  var stream = controller._controlledReadableStream;\n\n  assert(stream._state === 'readable');\n\n  ResetQueue(controller);\n\n  ReadableStreamError(stream, e);\n}\n\nfunction ReadableStreamDefaultControllerErrorIfNeeded(controller, e) {\n  if (controller._controlledReadableStream._state === 'readable') {\n    ReadableStreamDefaultControllerError(controller, e);\n  }\n}\n\nfunction ReadableStreamDefaultControllerGetDesiredSize(controller) {\n  var stream = controller._controlledReadableStream;\n  var state = stream._state;\n\n  if (state === 'errored') {\n    return null;\n  }\n  if (state === 'closed') {\n    return 0;\n  }\n\n  return controller._strategyHWM - controller._queueTotalSize;\n}\n\nvar ReadableStreamBYOBRequest = function () {\n  function ReadableStreamBYOBRequest(controller, view) {\n    _classCallCheck(this, ReadableStreamBYOBRequest);\n\n    this._associatedReadableByteStreamController = controller;\n    this._view = view;\n  }\n\n  _createClass(ReadableStreamBYOBRequest, [{\n    key: 'respond',\n    value: function respond(bytesWritten) {\n      if (IsReadableStreamBYOBRequest(this) === false) {\n        throw byobRequestBrandCheckException('respond');\n      }\n\n      if (this._associatedReadableByteStreamController === undefined) {\n        throw new TypeError('This BYOB request has been invalidated');\n      }\n\n      ReadableByteStreamControllerRespond(this._associatedReadableByteStreamController, bytesWritten);\n    }\n  }, {\n    key: 'respondWithNewView',\n    value: function respondWithNewView(view) {\n      if (IsReadableStreamBYOBRequest(this) === false) {\n        throw byobRequestBrandCheckException('respond');\n      }\n\n      if (this._associatedReadableByteStreamController === undefined) {\n        throw new TypeError('This BYOB request has been invalidated');\n      }\n\n      if (!ArrayBuffer.isView(view)) {\n        throw new TypeError('You can only respond with array buffer views');\n      }\n\n      ReadableByteStreamControllerRespondWithNewView(this._associatedReadableByteStreamController, view);\n    }\n  }, {\n    key: 'view',\n    get: function get() {\n      return this._view;\n    }\n  }]);\n\n  return ReadableStreamBYOBRequest;\n}();\n\nvar ReadableByteStreamController = function () {\n  function ReadableByteStreamController(stream, underlyingByteSource, highWaterMark) {\n    _classCallCheck(this, ReadableByteStreamController);\n\n    if (IsReadableStream(stream) === false) {\n      throw new TypeError('ReadableByteStreamController can only be constructed with a ReadableStream instance given ' + 'a byte source');\n    }\n\n    if (stream._readableStreamController !== undefined) {\n      throw new TypeError('ReadableByteStreamController instances can only be created by the ReadableStream constructor given a byte ' + 'source');\n    }\n\n    this._controlledReadableStream = stream;\n\n    this._underlyingByteSource = underlyingByteSource;\n\n    this._pullAgain = false;\n    this._pulling = false;\n\n    ReadableByteStreamControllerClearPendingPullIntos(this);\n\n    // Need to set the slots so that the assert doesn't fire. In the spec the slots already exist implicitly.\n    this._queue = this._queueTotalSize = undefined;\n    ResetQueue(this);\n\n    this._closeRequested = false;\n    this._started = false;\n\n    this._strategyHWM = ValidateAndNormalizeHighWaterMark(highWaterMark);\n\n    var autoAllocateChunkSize = underlyingByteSource.autoAllocateChunkSize;\n    if (autoAllocateChunkSize !== undefined) {\n      if (Number.isInteger(autoAllocateChunkSize) === false || autoAllocateChunkSize <= 0) {\n        throw new RangeError('autoAllocateChunkSize must be a positive integer');\n      }\n    }\n    this._autoAllocateChunkSize = autoAllocateChunkSize;\n\n    this._pendingPullIntos = [];\n\n    var controller = this;\n\n    var startResult = InvokeOrNoop(underlyingByteSource, 'start', [this]);\n    Promise.resolve(startResult).then(function () {\n      controller._started = true;\n\n      assert(controller._pulling === false);\n      assert(controller._pullAgain === false);\n\n      ReadableByteStreamControllerCallPullIfNeeded(controller);\n    }, function (r) {\n      if (stream._state === 'readable') {\n        ReadableByteStreamControllerError(controller, r);\n      }\n    }).catch(rethrowAssertionErrorRejection);\n  }\n\n  _createClass(ReadableByteStreamController, [{\n    key: 'close',\n    value: function close() {\n      if (IsReadableByteStreamController(this) === false) {\n        throw byteStreamControllerBrandCheckException('close');\n      }\n\n      if (this._closeRequested === true) {\n        throw new TypeError('The stream has already been closed; do not close it again!');\n      }\n\n      var state = this._controlledReadableStream._state;\n      if (state !== 'readable') {\n        throw new TypeError('The stream (in ' + state + ' state) is not in the readable state and cannot be closed');\n      }\n\n      ReadableByteStreamControllerClose(this);\n    }\n  }, {\n    key: 'enqueue',\n    value: function enqueue(chunk) {\n      if (IsReadableByteStreamController(this) === false) {\n        throw byteStreamControllerBrandCheckException('enqueue');\n      }\n\n      if (this._closeRequested === true) {\n        throw new TypeError('stream is closed or draining');\n      }\n\n      var state = this._controlledReadableStream._state;\n      if (state !== 'readable') {\n        throw new TypeError('The stream (in ' + state + ' state) is not in the readable state and cannot be enqueued to');\n      }\n\n      if (!ArrayBuffer.isView(chunk)) {\n        throw new TypeError('You can only enqueue array buffer views when using a ReadableByteStreamController');\n      }\n\n      ReadableByteStreamControllerEnqueue(this, chunk);\n    }\n  }, {\n    key: 'error',\n    value: function error(e) {\n      if (IsReadableByteStreamController(this) === false) {\n        throw byteStreamControllerBrandCheckException('error');\n      }\n\n      var stream = this._controlledReadableStream;\n      if (stream._state !== 'readable') {\n        throw new TypeError('The stream is ' + stream._state + ' and so cannot be errored');\n      }\n\n      ReadableByteStreamControllerError(this, e);\n    }\n  }, {\n    key: '__cancelSteps',\n    value: function __cancelSteps(reason) {\n      if (this._pendingPullIntos.length > 0) {\n        var firstDescriptor = this._pendingPullIntos[0];\n        firstDescriptor.bytesFilled = 0;\n      }\n\n      ResetQueue(this);\n\n      return PromiseInvokeOrNoop(this._underlyingByteSource, 'cancel', [reason]);\n    }\n  }, {\n    key: '__pullSteps',\n    value: function __pullSteps() {\n      var stream = this._controlledReadableStream;\n      assert(ReadableStreamHasDefaultReader(stream) === true);\n\n      if (this._queueTotalSize > 0) {\n        assert(ReadableStreamGetNumReadRequests(stream) === 0);\n\n        var entry = this._queue.shift();\n        this._queueTotalSize -= entry.byteLength;\n\n        ReadableByteStreamControllerHandleQueueDrain(this);\n\n        var view = void 0;\n        try {\n          view = new Uint8Array(entry.buffer, entry.byteOffset, entry.byteLength);\n        } catch (viewE) {\n          return Promise.reject(viewE);\n        }\n\n        return Promise.resolve(CreateIterResultObject(view, false));\n      }\n\n      var autoAllocateChunkSize = this._autoAllocateChunkSize;\n      if (autoAllocateChunkSize !== undefined) {\n        var buffer = void 0;\n        try {\n          buffer = new ArrayBuffer(autoAllocateChunkSize);\n        } catch (bufferE) {\n          return Promise.reject(bufferE);\n        }\n\n        var pullIntoDescriptor = {\n          buffer: buffer,\n          byteOffset: 0,\n          byteLength: autoAllocateChunkSize,\n          bytesFilled: 0,\n          elementSize: 1,\n          ctor: Uint8Array,\n          readerType: 'default'\n        };\n\n        this._pendingPullIntos.push(pullIntoDescriptor);\n      }\n\n      var promise = ReadableStreamAddReadRequest(stream);\n\n      ReadableByteStreamControllerCallPullIfNeeded(this);\n\n      return promise;\n    }\n  }, {\n    key: 'byobRequest',\n    get: function get() {\n      if (IsReadableByteStreamController(this) === false) {\n        throw byteStreamControllerBrandCheckException('byobRequest');\n      }\n\n      if (this._byobRequest === undefined && this._pendingPullIntos.length > 0) {\n        var firstDescriptor = this._pendingPullIntos[0];\n        var view = new Uint8Array(firstDescriptor.buffer, firstDescriptor.byteOffset + firstDescriptor.bytesFilled, firstDescriptor.byteLength - firstDescriptor.bytesFilled);\n\n        this._byobRequest = new ReadableStreamBYOBRequest(this, view);\n      }\n\n      return this._byobRequest;\n    }\n  }, {\n    key: 'desiredSize',\n    get: function get() {\n      if (IsReadableByteStreamController(this) === false) {\n        throw byteStreamControllerBrandCheckException('desiredSize');\n      }\n\n      return ReadableByteStreamControllerGetDesiredSize(this);\n    }\n  }]);\n\n  return ReadableByteStreamController;\n}();\n\n// Abstract operations for the ReadableByteStreamController.\n\nfunction IsReadableByteStreamController(x) {\n  if (!typeIsObject(x)) {\n    return false;\n  }\n\n  if (!Object.prototype.hasOwnProperty.call(x, '_underlyingByteSource')) {\n    return false;\n  }\n\n  return true;\n}\n\nfunction IsReadableStreamBYOBRequest(x) {\n  if (!typeIsObject(x)) {\n    return false;\n  }\n\n  if (!Object.prototype.hasOwnProperty.call(x, '_associatedReadableByteStreamController')) {\n    return false;\n  }\n\n  return true;\n}\n\nfunction ReadableByteStreamControllerCallPullIfNeeded(controller) {\n  var shouldPull = ReadableByteStreamControllerShouldCallPull(controller);\n  if (shouldPull === false) {\n    return undefined;\n  }\n\n  if (controller._pulling === true) {\n    controller._pullAgain = true;\n    return undefined;\n  }\n\n  assert(controller._pullAgain === false);\n\n  controller._pulling = true;\n\n  // TODO: Test controller argument\n  var pullPromise = PromiseInvokeOrNoop(controller._underlyingByteSource, 'pull', [controller]);\n  pullPromise.then(function () {\n    controller._pulling = false;\n\n    if (controller._pullAgain === true) {\n      controller._pullAgain = false;\n      ReadableByteStreamControllerCallPullIfNeeded(controller);\n    }\n  }, function (e) {\n    if (controller._controlledReadableStream._state === 'readable') {\n      ReadableByteStreamControllerError(controller, e);\n    }\n  }).catch(rethrowAssertionErrorRejection);\n\n  return undefined;\n}\n\nfunction ReadableByteStreamControllerClearPendingPullIntos(controller) {\n  ReadableByteStreamControllerInvalidateBYOBRequest(controller);\n  controller._pendingPullIntos = [];\n}\n\nfunction ReadableByteStreamControllerCommitPullIntoDescriptor(stream, pullIntoDescriptor) {\n  assert(stream._state !== 'errored', 'state must not be errored');\n\n  var done = false;\n  if (stream._state === 'closed') {\n    assert(pullIntoDescriptor.bytesFilled === 0);\n    done = true;\n  }\n\n  var filledView = ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor);\n  if (pullIntoDescriptor.readerType === 'default') {\n    ReadableStreamFulfillReadRequest(stream, filledView, done);\n  } else {\n    assert(pullIntoDescriptor.readerType === 'byob');\n    ReadableStreamFulfillReadIntoRequest(stream, filledView, done);\n  }\n}\n\nfunction ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor) {\n  var bytesFilled = pullIntoDescriptor.bytesFilled;\n  var elementSize = pullIntoDescriptor.elementSize;\n\n  assert(bytesFilled <= pullIntoDescriptor.byteLength);\n  assert(bytesFilled % elementSize === 0);\n\n  return new pullIntoDescriptor.ctor(pullIntoDescriptor.buffer, pullIntoDescriptor.byteOffset, bytesFilled / elementSize);\n}\n\nfunction ReadableByteStreamControllerEnqueueChunkToQueue(controller, buffer, byteOffset, byteLength) {\n  controller._queue.push({ buffer: buffer, byteOffset: byteOffset, byteLength: byteLength });\n  controller._queueTotalSize += byteLength;\n}\n\nfunction ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor) {\n  var elementSize = pullIntoDescriptor.elementSize;\n\n  var currentAlignedBytes = pullIntoDescriptor.bytesFilled - pullIntoDescriptor.bytesFilled % elementSize;\n\n  var maxBytesToCopy = Math.min(controller._queueTotalSize, pullIntoDescriptor.byteLength - pullIntoDescriptor.bytesFilled);\n  var maxBytesFilled = pullIntoDescriptor.bytesFilled + maxBytesToCopy;\n  var maxAlignedBytes = maxBytesFilled - maxBytesFilled % elementSize;\n\n  var totalBytesToCopyRemaining = maxBytesToCopy;\n  var ready = false;\n  if (maxAlignedBytes > currentAlignedBytes) {\n    totalBytesToCopyRemaining = maxAlignedBytes - pullIntoDescriptor.bytesFilled;\n    ready = true;\n  }\n\n  var queue = controller._queue;\n\n  while (totalBytesToCopyRemaining > 0) {\n    var headOfQueue = queue[0];\n\n    var bytesToCopy = Math.min(totalBytesToCopyRemaining, headOfQueue.byteLength);\n\n    var destStart = pullIntoDescriptor.byteOffset + pullIntoDescriptor.bytesFilled;\n    ArrayBufferCopy(pullIntoDescriptor.buffer, destStart, headOfQueue.buffer, headOfQueue.byteOffset, bytesToCopy);\n\n    if (headOfQueue.byteLength === bytesToCopy) {\n      queue.shift();\n    } else {\n      headOfQueue.byteOffset += bytesToCopy;\n      headOfQueue.byteLength -= bytesToCopy;\n    }\n    controller._queueTotalSize -= bytesToCopy;\n\n    ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, bytesToCopy, pullIntoDescriptor);\n\n    totalBytesToCopyRemaining -= bytesToCopy;\n  }\n\n  if (ready === false) {\n    assert(controller._queueTotalSize === 0, 'queue must be empty');\n    assert(pullIntoDescriptor.bytesFilled > 0);\n    assert(pullIntoDescriptor.bytesFilled < pullIntoDescriptor.elementSize);\n  }\n\n  return ready;\n}\n\nfunction ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, size, pullIntoDescriptor) {\n  assert(controller._pendingPullIntos.length === 0 || controller._pendingPullIntos[0] === pullIntoDescriptor);\n\n  ReadableByteStreamControllerInvalidateBYOBRequest(controller);\n  pullIntoDescriptor.bytesFilled += size;\n}\n\nfunction ReadableByteStreamControllerHandleQueueDrain(controller) {\n  assert(controller._controlledReadableStream._state === 'readable');\n\n  if (controller._queueTotalSize === 0 && controller._closeRequested === true) {\n    ReadableStreamClose(controller._controlledReadableStream);\n  } else {\n    ReadableByteStreamControllerCallPullIfNeeded(controller);\n  }\n}\n\nfunction ReadableByteStreamControllerInvalidateBYOBRequest(controller) {\n  if (controller._byobRequest === undefined) {\n    return;\n  }\n\n  controller._byobRequest._associatedReadableByteStreamController = undefined;\n  controller._byobRequest._view = undefined;\n  controller._byobRequest = undefined;\n}\n\nfunction ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller) {\n  assert(controller._closeRequested === false);\n\n  while (controller._pendingPullIntos.length > 0) {\n    if (controller._queueTotalSize === 0) {\n      return;\n    }\n\n    var pullIntoDescriptor = controller._pendingPullIntos[0];\n\n    if (ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor) === true) {\n      ReadableByteStreamControllerShiftPendingPullInto(controller);\n\n      ReadableByteStreamControllerCommitPullIntoDescriptor(controller._controlledReadableStream, pullIntoDescriptor);\n    }\n  }\n}\n\nfunction ReadableByteStreamControllerPullInto(controller, view) {\n  var stream = controller._controlledReadableStream;\n\n  var elementSize = 1;\n  if (view.constructor !== DataView) {\n    elementSize = view.constructor.BYTES_PER_ELEMENT;\n  }\n\n  var ctor = view.constructor;\n\n  var pullIntoDescriptor = {\n    buffer: view.buffer,\n    byteOffset: view.byteOffset,\n    byteLength: view.byteLength,\n    bytesFilled: 0,\n    elementSize: elementSize,\n    ctor: ctor,\n    readerType: 'byob'\n  };\n\n  if (controller._pendingPullIntos.length > 0) {\n    pullIntoDescriptor.buffer = TransferArrayBuffer(pullIntoDescriptor.buffer);\n    controller._pendingPullIntos.push(pullIntoDescriptor);\n\n    // No ReadableByteStreamControllerCallPullIfNeeded() call since:\n    // - No change happens on desiredSize\n    // - The source has already been notified of that there's at least 1 pending read(view)\n\n    return ReadableStreamAddReadIntoRequest(stream);\n  }\n\n  if (stream._state === 'closed') {\n    var emptyView = new view.constructor(pullIntoDescriptor.buffer, pullIntoDescriptor.byteOffset, 0);\n    return Promise.resolve(CreateIterResultObject(emptyView, true));\n  }\n\n  if (controller._queueTotalSize > 0) {\n    if (ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor) === true) {\n      var filledView = ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor);\n\n      ReadableByteStreamControllerHandleQueueDrain(controller);\n\n      return Promise.resolve(CreateIterResultObject(filledView, false));\n    }\n\n    if (controller._closeRequested === true) {\n      var e = new TypeError('Insufficient bytes to fill elements in the given buffer');\n      ReadableByteStreamControllerError(controller, e);\n\n      return Promise.reject(e);\n    }\n  }\n\n  pullIntoDescriptor.buffer = TransferArrayBuffer(pullIntoDescriptor.buffer);\n  controller._pendingPullIntos.push(pullIntoDescriptor);\n\n  var promise = ReadableStreamAddReadIntoRequest(stream);\n\n  ReadableByteStreamControllerCallPullIfNeeded(controller);\n\n  return promise;\n}\n\nfunction ReadableByteStreamControllerRespondInClosedState(controller, firstDescriptor) {\n  firstDescriptor.buffer = TransferArrayBuffer(firstDescriptor.buffer);\n\n  assert(firstDescriptor.bytesFilled === 0, 'bytesFilled must be 0');\n\n  var stream = controller._controlledReadableStream;\n  if (ReadableStreamHasBYOBReader(stream) === true) {\n    while (ReadableStreamGetNumReadIntoRequests(stream) > 0) {\n      var pullIntoDescriptor = ReadableByteStreamControllerShiftPendingPullInto(controller);\n      ReadableByteStreamControllerCommitPullIntoDescriptor(stream, pullIntoDescriptor);\n    }\n  }\n}\n\nfunction ReadableByteStreamControllerRespondInReadableState(controller, bytesWritten, pullIntoDescriptor) {\n  if (pullIntoDescriptor.bytesFilled + bytesWritten > pullIntoDescriptor.byteLength) {\n    throw new RangeError('bytesWritten out of range');\n  }\n\n  ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, bytesWritten, pullIntoDescriptor);\n\n  if (pullIntoDescriptor.bytesFilled < pullIntoDescriptor.elementSize) {\n    // TODO: Figure out whether we should detach the buffer or not here.\n    return;\n  }\n\n  ReadableByteStreamControllerShiftPendingPullInto(controller);\n\n  var remainderSize = pullIntoDescriptor.bytesFilled % pullIntoDescriptor.elementSize;\n  if (remainderSize > 0) {\n    var end = pullIntoDescriptor.byteOffset + pullIntoDescriptor.bytesFilled;\n    var remainder = pullIntoDescriptor.buffer.slice(end - remainderSize, end);\n    ReadableByteStreamControllerEnqueueChunkToQueue(controller, remainder, 0, remainder.byteLength);\n  }\n\n  pullIntoDescriptor.buffer = TransferArrayBuffer(pullIntoDescriptor.buffer);\n  pullIntoDescriptor.bytesFilled -= remainderSize;\n  ReadableByteStreamControllerCommitPullIntoDescriptor(controller._controlledReadableStream, pullIntoDescriptor);\n\n  ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller);\n}\n\nfunction ReadableByteStreamControllerRespondInternal(controller, bytesWritten) {\n  var firstDescriptor = controller._pendingPullIntos[0];\n\n  var stream = controller._controlledReadableStream;\n\n  if (stream._state === 'closed') {\n    if (bytesWritten !== 0) {\n      throw new TypeError('bytesWritten must be 0 when calling respond() on a closed stream');\n    }\n\n    ReadableByteStreamControllerRespondInClosedState(controller, firstDescriptor);\n  } else {\n    assert(stream._state === 'readable');\n\n    ReadableByteStreamControllerRespondInReadableState(controller, bytesWritten, firstDescriptor);\n  }\n}\n\nfunction ReadableByteStreamControllerShiftPendingPullInto(controller) {\n  var descriptor = controller._pendingPullIntos.shift();\n  ReadableByteStreamControllerInvalidateBYOBRequest(controller);\n  return descriptor;\n}\n\nfunction ReadableByteStreamControllerShouldCallPull(controller) {\n  var stream = controller._controlledReadableStream;\n\n  if (stream._state !== 'readable') {\n    return false;\n  }\n\n  if (controller._closeRequested === true) {\n    return false;\n  }\n\n  if (controller._started === false) {\n    return false;\n  }\n\n  if (ReadableStreamHasDefaultReader(stream) === true && ReadableStreamGetNumReadRequests(stream) > 0) {\n    return true;\n  }\n\n  if (ReadableStreamHasBYOBReader(stream) === true && ReadableStreamGetNumReadIntoRequests(stream) > 0) {\n    return true;\n  }\n\n  if (ReadableByteStreamControllerGetDesiredSize(controller) > 0) {\n    return true;\n  }\n\n  return false;\n}\n\n// A client of ReadableByteStreamController may use these functions directly to bypass state check.\n\nfunction ReadableByteStreamControllerClose(controller) {\n  var stream = controller._controlledReadableStream;\n\n  assert(controller._closeRequested === false);\n  assert(stream._state === 'readable');\n\n  if (controller._queueTotalSize > 0) {\n    controller._closeRequested = true;\n\n    return;\n  }\n\n  if (controller._pendingPullIntos.length > 0) {\n    var firstPendingPullInto = controller._pendingPullIntos[0];\n    if (firstPendingPullInto.bytesFilled > 0) {\n      var e = new TypeError('Insufficient bytes to fill elements in the given buffer');\n      ReadableByteStreamControllerError(controller, e);\n\n      throw e;\n    }\n  }\n\n  ReadableStreamClose(stream);\n}\n\nfunction ReadableByteStreamControllerEnqueue(controller, chunk) {\n  var stream = controller._controlledReadableStream;\n\n  assert(controller._closeRequested === false);\n  assert(stream._state === 'readable');\n\n  var buffer = chunk.buffer;\n  var byteOffset = chunk.byteOffset;\n  var byteLength = chunk.byteLength;\n  var transferredBuffer = TransferArrayBuffer(buffer);\n\n  if (ReadableStreamHasDefaultReader(stream) === true) {\n    if (ReadableStreamGetNumReadRequests(stream) === 0) {\n      ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength);\n    } else {\n      assert(controller._queue.length === 0);\n\n      var transferredView = new Uint8Array(transferredBuffer, byteOffset, byteLength);\n      ReadableStreamFulfillReadRequest(stream, transferredView, false);\n    }\n  } else if (ReadableStreamHasBYOBReader(stream) === true) {\n    // TODO: Ideally in this branch detaching should happen only if the buffer is not consumed fully.\n    ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength);\n    ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller);\n  } else {\n    assert(IsReadableStreamLocked(stream) === false, 'stream must not be locked');\n    ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength);\n  }\n}\n\nfunction ReadableByteStreamControllerError(controller, e) {\n  var stream = controller._controlledReadableStream;\n\n  assert(stream._state === 'readable');\n\n  ReadableByteStreamControllerClearPendingPullIntos(controller);\n\n  ResetQueue(controller);\n  ReadableStreamError(stream, e);\n}\n\nfunction ReadableByteStreamControllerGetDesiredSize(controller) {\n  var stream = controller._controlledReadableStream;\n  var state = stream._state;\n\n  if (state === 'errored') {\n    return null;\n  }\n  if (state === 'closed') {\n    return 0;\n  }\n\n  return controller._strategyHWM - controller._queueTotalSize;\n}\n\nfunction ReadableByteStreamControllerRespond(controller, bytesWritten) {\n  bytesWritten = Number(bytesWritten);\n  if (IsFiniteNonNegativeNumber(bytesWritten) === false) {\n    throw new RangeError('bytesWritten must be a finite');\n  }\n\n  assert(controller._pendingPullIntos.length > 0);\n\n  ReadableByteStreamControllerRespondInternal(controller, bytesWritten);\n}\n\nfunction ReadableByteStreamControllerRespondWithNewView(controller, view) {\n  assert(controller._pendingPullIntos.length > 0);\n\n  var firstDescriptor = controller._pendingPullIntos[0];\n\n  if (firstDescriptor.byteOffset + firstDescriptor.bytesFilled !== view.byteOffset) {\n    throw new RangeError('The region specified by view does not match byobRequest');\n  }\n  if (firstDescriptor.byteLength !== view.byteLength) {\n    throw new RangeError('The buffer of view has different capacity than byobRequest');\n  }\n\n  firstDescriptor.buffer = view.buffer;\n\n  ReadableByteStreamControllerRespondInternal(controller, view.byteLength);\n}\n\n// Helper functions for the ReadableStream.\n\nfunction streamBrandCheckException(name) {\n  return new TypeError('ReadableStream.prototype.' + name + ' can only be used on a ReadableStream');\n}\n\n// Helper functions for the readers.\n\nfunction readerLockException(name) {\n  return new TypeError('Cannot ' + name + ' a stream using a released reader');\n}\n\n// Helper functions for the ReadableStreamDefaultReader.\n\nfunction defaultReaderBrandCheckException(name) {\n  return new TypeError('ReadableStreamDefaultReader.prototype.' + name + ' can only be used on a ReadableStreamDefaultReader');\n}\n\nfunction defaultReaderClosedPromiseInitialize(reader) {\n  reader._closedPromise = new Promise(function (resolve, reject) {\n    reader._closedPromise_resolve = resolve;\n    reader._closedPromise_reject = reject;\n  });\n}\n\nfunction defaultReaderClosedPromiseInitializeAsRejected(reader, reason) {\n  reader._closedPromise = Promise.reject(reason);\n  reader._closedPromise_resolve = undefined;\n  reader._closedPromise_reject = undefined;\n}\n\nfunction defaultReaderClosedPromiseInitializeAsResolved(reader) {\n  reader._closedPromise = Promise.resolve(undefined);\n  reader._closedPromise_resolve = undefined;\n  reader._closedPromise_reject = undefined;\n}\n\nfunction defaultReaderClosedPromiseReject(reader, reason) {\n  assert(reader._closedPromise_resolve !== undefined);\n  assert(reader._closedPromise_reject !== undefined);\n\n  reader._closedPromise_reject(reason);\n  reader._closedPromise_resolve = undefined;\n  reader._closedPromise_reject = undefined;\n}\n\nfunction defaultReaderClosedPromiseResetToRejected(reader, reason) {\n  assert(reader._closedPromise_resolve === undefined);\n  assert(reader._closedPromise_reject === undefined);\n\n  reader._closedPromise = Promise.reject(reason);\n}\n\nfunction defaultReaderClosedPromiseResolve(reader) {\n  assert(reader._closedPromise_resolve !== undefined);\n  assert(reader._closedPromise_reject !== undefined);\n\n  reader._closedPromise_resolve(undefined);\n  reader._closedPromise_resolve = undefined;\n  reader._closedPromise_reject = undefined;\n}\n\n// Helper functions for the ReadableStreamDefaultReader.\n\nfunction byobReaderBrandCheckException(name) {\n  return new TypeError('ReadableStreamBYOBReader.prototype.' + name + ' can only be used on a ReadableStreamBYOBReader');\n}\n\n// Helper functions for the ReadableStreamDefaultController.\n\nfunction defaultControllerBrandCheckException(name) {\n  return new TypeError('ReadableStreamDefaultController.prototype.' + name + ' can only be used on a ReadableStreamDefaultController');\n}\n\n// Helper functions for the ReadableStreamBYOBRequest.\n\nfunction byobRequestBrandCheckException(name) {\n  return new TypeError('ReadableStreamBYOBRequest.prototype.' + name + ' can only be used on a ReadableStreamBYOBRequest');\n}\n\n// Helper functions for the ReadableByteStreamController.\n\nfunction byteStreamControllerBrandCheckException(name) {\n  return new TypeError('ReadableByteStreamController.prototype.' + name + ' can only be used on a ReadableByteStreamController');\n}\n\n// Helper function for ReadableStream pipeThrough\n\nfunction ifIsObjectAndHasAPromiseIsHandledInternalSlotSetPromiseIsHandledToTrue(promise) {\n  try {\n    // This relies on the brand-check that is enforced by Promise.prototype.then(). As with the rest of the reference\n    // implementation, it doesn't attempt to do the right thing if someone has modified the global environment.\n    Promise.prototype.then.call(promise, undefined, function () {});\n  } catch (e) {\n    // The brand check failed, therefore the internal slot is not present and there's nothing further to do.\n  }\n}\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nvar transformStream = __w_pdfjs_require__(6);\nvar readableStream = __w_pdfjs_require__(4);\nvar writableStream = __w_pdfjs_require__(2);\n\nexports.TransformStream = transformStream.TransformStream;\nexports.ReadableStream = readableStream.ReadableStream;\nexports.IsReadableStreamDisturbed = readableStream.IsReadableStreamDisturbed;\nexports.ReadableStreamDefaultControllerClose = readableStream.ReadableStreamDefaultControllerClose;\nexports.ReadableStreamDefaultControllerEnqueue = readableStream.ReadableStreamDefaultControllerEnqueue;\nexports.ReadableStreamDefaultControllerError = readableStream.ReadableStreamDefaultControllerError;\nexports.ReadableStreamDefaultControllerGetDesiredSize = readableStream.ReadableStreamDefaultControllerGetDesiredSize;\nexports.AcquireWritableStreamDefaultWriter = writableStream.AcquireWritableStreamDefaultWriter;\nexports.IsWritableStream = writableStream.IsWritableStream;\nexports.IsWritableStreamLocked = writableStream.IsWritableStreamLocked;\nexports.WritableStream = writableStream.WritableStream;\nexports.WritableStreamAbort = writableStream.WritableStreamAbort;\nexports.WritableStreamDefaultControllerError = writableStream.WritableStreamDefaultControllerError;\nexports.WritableStreamDefaultWriterCloseWithErrorPropagation = writableStream.WritableStreamDefaultWriterCloseWithErrorPropagation;\nexports.WritableStreamDefaultWriterRelease = writableStream.WritableStreamDefaultWriterRelease;\nexports.WritableStreamDefaultWriterWrite = writableStream.WritableStreamDefaultWriterWrite;\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n\"use strict\";\n\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar _require = __w_pdfjs_require__(1),\n    assert = _require.assert;\n\nvar _require2 = __w_pdfjs_require__(0),\n    InvokeOrNoop = _require2.InvokeOrNoop,\n    PromiseInvokeOrPerformFallback = _require2.PromiseInvokeOrPerformFallback,\n    PromiseInvokeOrNoop = _require2.PromiseInvokeOrNoop,\n    typeIsObject = _require2.typeIsObject;\n\nvar _require3 = __w_pdfjs_require__(4),\n    ReadableStream = _require3.ReadableStream,\n    ReadableStreamDefaultControllerClose = _require3.ReadableStreamDefaultControllerClose,\n    ReadableStreamDefaultControllerEnqueue = _require3.ReadableStreamDefaultControllerEnqueue,\n    ReadableStreamDefaultControllerError = _require3.ReadableStreamDefaultControllerError,\n    ReadableStreamDefaultControllerGetDesiredSize = _require3.ReadableStreamDefaultControllerGetDesiredSize;\n\nvar _require4 = __w_pdfjs_require__(2),\n    WritableStream = _require4.WritableStream,\n    WritableStreamDefaultControllerError = _require4.WritableStreamDefaultControllerError;\n\n// Methods on the transform stream controller object\n\nfunction TransformStreamCloseReadable(transformStream) {\n  // console.log('TransformStreamCloseReadable()');\n\n  if (transformStream._errored === true) {\n    throw new TypeError('TransformStream is already errored');\n  }\n\n  if (transformStream._readableClosed === true) {\n    throw new TypeError('Readable side is already closed');\n  }\n\n  TransformStreamCloseReadableInternal(transformStream);\n}\n\nfunction TransformStreamEnqueueToReadable(transformStream, chunk) {\n  // console.log('TransformStreamEnqueueToReadable()');\n\n  if (transformStream._errored === true) {\n    throw new TypeError('TransformStream is already errored');\n  }\n\n  if (transformStream._readableClosed === true) {\n    throw new TypeError('Readable side is already closed');\n  }\n\n  // We throttle transformer.transform invocation based on the backpressure of the ReadableStream, but we still\n  // accept TransformStreamEnqueueToReadable() calls.\n\n  var controller = transformStream._readableController;\n\n  try {\n    ReadableStreamDefaultControllerEnqueue(controller, chunk);\n  } catch (e) {\n    // This happens when readableStrategy.size() throws.\n    // The ReadableStream has already errored itself.\n    transformStream._readableClosed = true;\n    TransformStreamErrorIfNeeded(transformStream, e);\n\n    throw transformStream._storedError;\n  }\n\n  var desiredSize = ReadableStreamDefaultControllerGetDesiredSize(controller);\n  var maybeBackpressure = desiredSize <= 0;\n\n  if (maybeBackpressure === true && transformStream._backpressure === false) {\n    // This allows pull() again. When desiredSize is 0, it's possible that a pull() will happen immediately (but\n    // asynchronously) after this because of pending read()s and set _backpressure back to false.\n    //\n    // If pull() could be called from inside enqueue(), then this logic would be wrong. This cannot happen\n    // because there is always a promise pending from start() or pull() when _backpressure is false.\n    TransformStreamSetBackpressure(transformStream, true);\n  }\n}\n\nfunction TransformStreamError(transformStream, e) {\n  if (transformStream._errored === true) {\n    throw new TypeError('TransformStream is already errored');\n  }\n\n  TransformStreamErrorInternal(transformStream, e);\n}\n\n// Abstract operations.\n\nfunction TransformStreamCloseReadableInternal(transformStream) {\n  assert(transformStream._errored === false);\n  assert(transformStream._readableClosed === false);\n\n  try {\n    ReadableStreamDefaultControllerClose(transformStream._readableController);\n  } catch (e) {\n    assert(false);\n  }\n\n  transformStream._readableClosed = true;\n}\n\nfunction TransformStreamErrorIfNeeded(transformStream, e) {\n  if (transformStream._errored === false) {\n    TransformStreamErrorInternal(transformStream, e);\n  }\n}\n\nfunction TransformStreamErrorInternal(transformStream, e) {\n  // console.log('TransformStreamErrorInternal()');\n\n  assert(transformStream._errored === false);\n\n  transformStream._errored = true;\n  transformStream._storedError = e;\n\n  if (transformStream._writableDone === false) {\n    WritableStreamDefaultControllerError(transformStream._writableController, e);\n  }\n  if (transformStream._readableClosed === false) {\n    ReadableStreamDefaultControllerError(transformStream._readableController, e);\n  }\n}\n\n// Used for preventing the next write() call on TransformStreamSink until there\n// is no longer backpressure.\nfunction TransformStreamReadableReadyPromise(transformStream) {\n  assert(transformStream._backpressureChangePromise !== undefined, '_backpressureChangePromise should have been initialized');\n\n  if (transformStream._backpressure === false) {\n    return Promise.resolve();\n  }\n\n  assert(transformStream._backpressure === true, '_backpressure should have been initialized');\n\n  return transformStream._backpressureChangePromise;\n}\n\nfunction TransformStreamSetBackpressure(transformStream, backpressure) {\n  // console.log(`TransformStreamSetBackpressure(${backpressure})`);\n\n  // Passes also when called during construction.\n  assert(transformStream._backpressure !== backpressure, 'TransformStreamSetBackpressure() should be called only when backpressure is changed');\n\n  if (transformStream._backpressureChangePromise !== undefined) {\n    // The fulfillment value is just for a sanity check.\n    transformStream._backpressureChangePromise_resolve(backpressure);\n  }\n\n  transformStream._backpressureChangePromise = new Promise(function (resolve) {\n    transformStream._backpressureChangePromise_resolve = resolve;\n  });\n\n  transformStream._backpressureChangePromise.then(function (resolution) {\n    assert(resolution !== backpressure, '_backpressureChangePromise should be fulfilled only when backpressure is changed');\n  });\n\n  transformStream._backpressure = backpressure;\n}\n\nfunction TransformStreamDefaultTransform(chunk, transformStreamController) {\n  var transformStream = transformStreamController._controlledTransformStream;\n  TransformStreamEnqueueToReadable(transformStream, chunk);\n  return Promise.resolve();\n}\n\nfunction TransformStreamTransform(transformStream, chunk) {\n  // console.log('TransformStreamTransform()');\n\n  assert(transformStream._errored === false);\n  assert(transformStream._transforming === false);\n  assert(transformStream._backpressure === false);\n\n  transformStream._transforming = true;\n\n  var transformer = transformStream._transformer;\n  var controller = transformStream._transformStreamController;\n\n  var transformPromise = PromiseInvokeOrPerformFallback(transformer, 'transform', [chunk, controller], TransformStreamDefaultTransform, [chunk, controller]);\n\n  return transformPromise.then(function () {\n    transformStream._transforming = false;\n\n    return TransformStreamReadableReadyPromise(transformStream);\n  }, function (e) {\n    TransformStreamErrorIfNeeded(transformStream, e);\n    return Promise.reject(e);\n  });\n}\n\nfunction IsTransformStreamDefaultController(x) {\n  if (!typeIsObject(x)) {\n    return false;\n  }\n\n  if (!Object.prototype.hasOwnProperty.call(x, '_controlledTransformStream')) {\n    return false;\n  }\n\n  return true;\n}\n\nfunction IsTransformStream(x) {\n  if (!typeIsObject(x)) {\n    return false;\n  }\n\n  if (!Object.prototype.hasOwnProperty.call(x, '_transformStreamController')) {\n    return false;\n  }\n\n  return true;\n}\n\nvar TransformStreamSink = function () {\n  function TransformStreamSink(transformStream, startPromise) {\n    _classCallCheck(this, TransformStreamSink);\n\n    this._transformStream = transformStream;\n    this._startPromise = startPromise;\n  }\n\n  _createClass(TransformStreamSink, [{\n    key: 'start',\n    value: function start(c) {\n      var transformStream = this._transformStream;\n\n      transformStream._writableController = c;\n\n      return this._startPromise.then(function () {\n        return TransformStreamReadableReadyPromise(transformStream);\n      });\n    }\n  }, {\n    key: 'write',\n    value: function write(chunk) {\n      // console.log('TransformStreamSink.write()');\n\n      var transformStream = this._transformStream;\n\n      return TransformStreamTransform(transformStream, chunk);\n    }\n  }, {\n    key: 'abort',\n    value: function abort() {\n      var transformStream = this._transformStream;\n      transformStream._writableDone = true;\n      TransformStreamErrorInternal(transformStream, new TypeError('Writable side aborted'));\n    }\n  }, {\n    key: 'close',\n    value: function close() {\n      // console.log('TransformStreamSink.close()');\n\n      var transformStream = this._transformStream;\n\n      assert(transformStream._transforming === false);\n\n      transformStream._writableDone = true;\n\n      var flushPromise = PromiseInvokeOrNoop(transformStream._transformer, 'flush', [transformStream._transformStreamController]);\n      // Return a promise that is fulfilled with undefined on success.\n      return flushPromise.then(function () {\n        if (transformStream._errored === true) {\n          return Promise.reject(transformStream._storedError);\n        }\n        if (transformStream._readableClosed === false) {\n          TransformStreamCloseReadableInternal(transformStream);\n        }\n        return Promise.resolve();\n      }).catch(function (r) {\n        TransformStreamErrorIfNeeded(transformStream, r);\n        return Promise.reject(transformStream._storedError);\n      });\n    }\n  }]);\n\n  return TransformStreamSink;\n}();\n\nvar TransformStreamSource = function () {\n  function TransformStreamSource(transformStream, startPromise) {\n    _classCallCheck(this, TransformStreamSource);\n\n    this._transformStream = transformStream;\n    this._startPromise = startPromise;\n  }\n\n  _createClass(TransformStreamSource, [{\n    key: 'start',\n    value: function start(c) {\n      var transformStream = this._transformStream;\n\n      transformStream._readableController = c;\n\n      return this._startPromise.then(function () {\n        // Prevent the first pull() call until there is backpressure.\n\n        assert(transformStream._backpressureChangePromise !== undefined, '_backpressureChangePromise should have been initialized');\n\n        if (transformStream._backpressure === true) {\n          return Promise.resolve();\n        }\n\n        assert(transformStream._backpressure === false, '_backpressure should have been initialized');\n\n        return transformStream._backpressureChangePromise;\n      });\n    }\n  }, {\n    key: 'pull',\n    value: function pull() {\n      // console.log('TransformStreamSource.pull()');\n\n      var transformStream = this._transformStream;\n\n      // Invariant. Enforced by the promises returned by start() and pull().\n      assert(transformStream._backpressure === true, 'pull() should be never called while _backpressure is false');\n\n      assert(transformStream._backpressureChangePromise !== undefined, '_backpressureChangePromise should have been initialized');\n\n      TransformStreamSetBackpressure(transformStream, false);\n\n      // Prevent the next pull() call until there is backpressure.\n      return transformStream._backpressureChangePromise;\n    }\n  }, {\n    key: 'cancel',\n    value: function cancel() {\n      var transformStream = this._transformStream;\n      transformStream._readableClosed = true;\n      TransformStreamErrorInternal(transformStream, new TypeError('Readable side canceled'));\n    }\n  }]);\n\n  return TransformStreamSource;\n}();\n\nvar TransformStreamDefaultController = function () {\n  function TransformStreamDefaultController(transformStream) {\n    _classCallCheck(this, TransformStreamDefaultController);\n\n    if (IsTransformStream(transformStream) === false) {\n      throw new TypeError('TransformStreamDefaultController can only be ' + 'constructed with a TransformStream instance');\n    }\n\n    if (transformStream._transformStreamController !== undefined) {\n      throw new TypeError('TransformStreamDefaultController instances can ' + 'only be created by the TransformStream constructor');\n    }\n\n    this._controlledTransformStream = transformStream;\n  }\n\n  _createClass(TransformStreamDefaultController, [{\n    key: 'enqueue',\n    value: function enqueue(chunk) {\n      if (IsTransformStreamDefaultController(this) === false) {\n        throw defaultControllerBrandCheckException('enqueue');\n      }\n\n      TransformStreamEnqueueToReadable(this._controlledTransformStream, chunk);\n    }\n  }, {\n    key: 'close',\n    value: function close() {\n      if (IsTransformStreamDefaultController(this) === false) {\n        throw defaultControllerBrandCheckException('close');\n      }\n\n      TransformStreamCloseReadable(this._controlledTransformStream);\n    }\n  }, {\n    key: 'error',\n    value: function error(reason) {\n      if (IsTransformStreamDefaultController(this) === false) {\n        throw defaultControllerBrandCheckException('error');\n      }\n\n      TransformStreamError(this._controlledTransformStream, reason);\n    }\n  }, {\n    key: 'desiredSize',\n    get: function get() {\n      if (IsTransformStreamDefaultController(this) === false) {\n        throw defaultControllerBrandCheckException('desiredSize');\n      }\n\n      var transformStream = this._controlledTransformStream;\n      var readableController = transformStream._readableController;\n\n      return ReadableStreamDefaultControllerGetDesiredSize(readableController);\n    }\n  }]);\n\n  return TransformStreamDefaultController;\n}();\n\nvar TransformStream = function () {\n  function TransformStream() {\n    var transformer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n    _classCallCheck(this, TransformStream);\n\n    this._transformer = transformer;\n    var readableStrategy = transformer.readableStrategy,\n        writableStrategy = transformer.writableStrategy;\n\n\n    this._transforming = false;\n    this._errored = false;\n    this._storedError = undefined;\n\n    this._writableController = undefined;\n    this._readableController = undefined;\n    this._transformStreamController = undefined;\n\n    this._writableDone = false;\n    this._readableClosed = false;\n\n    this._backpressure = undefined;\n    this._backpressureChangePromise = undefined;\n    this._backpressureChangePromise_resolve = undefined;\n\n    this._transformStreamController = new TransformStreamDefaultController(this);\n\n    var startPromise_resolve = void 0;\n    var startPromise = new Promise(function (resolve) {\n      startPromise_resolve = resolve;\n    });\n\n    var source = new TransformStreamSource(this, startPromise);\n\n    this._readable = new ReadableStream(source, readableStrategy);\n\n    var sink = new TransformStreamSink(this, startPromise);\n\n    this._writable = new WritableStream(sink, writableStrategy);\n\n    assert(this._writableController !== undefined);\n    assert(this._readableController !== undefined);\n\n    var desiredSize = ReadableStreamDefaultControllerGetDesiredSize(this._readableController);\n    // Set _backpressure based on desiredSize. As there is no read() at this point, we can just interpret\n    // desiredSize being non-positive as backpressure.\n    TransformStreamSetBackpressure(this, desiredSize <= 0);\n\n    var transformStream = this;\n    var startResult = InvokeOrNoop(transformer, 'start', [transformStream._transformStreamController]);\n    startPromise_resolve(startResult);\n    startPromise.catch(function (e) {\n      // The underlyingSink and underlyingSource will error the readable and writable ends on their own.\n      if (transformStream._errored === false) {\n        transformStream._errored = true;\n        transformStream._storedError = e;\n      }\n    });\n  }\n\n  _createClass(TransformStream, [{\n    key: 'readable',\n    get: function get() {\n      if (IsTransformStream(this) === false) {\n        throw streamBrandCheckException('readable');\n      }\n\n      return this._readable;\n    }\n  }, {\n    key: 'writable',\n    get: function get() {\n      if (IsTransformStream(this) === false) {\n        throw streamBrandCheckException('writable');\n      }\n\n      return this._writable;\n    }\n  }]);\n\n  return TransformStream;\n}();\n\nmodule.exports = { TransformStream: TransformStream };\n\n// Helper functions for the TransformStreamDefaultController.\n\nfunction defaultControllerBrandCheckException(name) {\n  return new TypeError('TransformStreamDefaultController.prototype.' + name + ' can only be used on a TransformStreamDefaultController');\n}\n\n// Helper functions for the TransformStream.\n\nfunction streamBrandCheckException(name) {\n  return new TypeError('TransformStream.prototype.' + name + ' can only be used on a TransformStream');\n}\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\nmodule.exports = __w_pdfjs_require__(5);\n\n\n/***/ })\n/******/ ])));","/* Copyright 2018 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* eslint-disable no-restricted-globals */\n\nif (typeof PDFJSDev !== 'undefined' && !PDFJSDev.test('GENERIC')) {\n  // The `URL` constructor is assumed to be available in the extension builds.\n  exports.URL = URL;\n} else {\n  let isURLSupported = false;\n  try {\n    if (typeof URL === 'function' && typeof URL.prototype === 'object' &&\n        ('origin' in URL.prototype)) {\n      const u = new URL('b', 'http://a');\n      u.pathname = 'c%20d';\n      isURLSupported = (u.href === 'http://a/c%20d');\n    }\n  } catch (ex) {\n    // The `URL` constructor cannot be used.\n  }\n\n  if (isURLSupported) {\n    exports.URL = URL;\n  } else {\n    if (typeof PDFJSDev !== 'undefined' && PDFJSDev.test('IMAGE_DECODERS')) {\n      class DummyURL {\n        constructor() {\n          throw new Error('The current image decoders doesn\\'t utilize the ' +\n                          '`URL` constructor, hence it shouldn\\'t need to be ' +\n                          'polyfilled for the IMAGE_DECODERS build target.');\n        }\n      }\n      exports.URL = DummyURL;\n    } else {\n      const PolyfillURL = require('../../external/url/url-lib').URL;\n\n      // Attempt to copy over the static methods.\n      const OriginalURL = require('./global_scope').URL;\n      if (OriginalURL) {\n        PolyfillURL.createObjectURL = function(blob) {\n          // IE extension allows a second optional options argument, see\n          // http://msdn.microsoft.com/en-us/library/ie/hh772302(v=vs.85).aspx\n          return OriginalURL.createObjectURL.apply(OriginalURL, arguments);\n        };\n        PolyfillURL.revokeObjectURL = function(url) {\n          OriginalURL.revokeObjectURL(url);\n        };\n      }\n      exports.URL = PolyfillURL;\n    }\n  }\n}\n","/* Any copyright is dedicated to the Public Domain.\n * http://creativecommons.org/publicdomain/zero/1.0/\n */\n\n// Polyfill obtained from: https://github.com/Polymer/URL\n\n(function URLConstructorClosure() {\n  'use strict';\n\n  var relative = Object.create(null);\n  relative['ftp'] = 21;\n  relative['file'] = 0;\n  relative['gopher'] = 70;\n  relative['http'] = 80;\n  relative['https'] = 443;\n  relative['ws'] = 80;\n  relative['wss'] = 443;\n\n  var relativePathDotMapping = Object.create(null);\n  relativePathDotMapping['%2e'] = '.';\n  relativePathDotMapping['.%2e'] = '..';\n  relativePathDotMapping['%2e.'] = '..';\n  relativePathDotMapping['%2e%2e'] = '..';\n\n  function isRelativeScheme(scheme) {\n    return relative[scheme] !== undefined;\n  }\n\n  function invalid() {\n    clear.call(this);\n    this._isInvalid = true;\n  }\n\n  function IDNAToASCII(h) {\n    if (h === '') {\n      invalid.call(this);\n    }\n    // XXX\n    return h.toLowerCase();\n  }\n\n  function percentEscape(c) {\n    var unicode = c.charCodeAt(0);\n    if (unicode > 0x20 &&\n       unicode < 0x7F &&\n       // \" # < > ? `\n       [0x22, 0x23, 0x3C, 0x3E, 0x3F, 0x60].indexOf(unicode) === -1\n      ) {\n      return c;\n    }\n    return encodeURIComponent(c);\n  }\n\n  function percentEscapeQuery(c) {\n    // XXX This actually needs to encode c using encoding and then\n    // convert the bytes one-by-one.\n\n    var unicode = c.charCodeAt(0);\n    if (unicode > 0x20 &&\n       unicode < 0x7F &&\n       // \" # < > ` (do not escape '?')\n       [0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) === -1\n      ) {\n      return c;\n    }\n    return encodeURIComponent(c);\n  }\n\n  var EOF, ALPHA = /[a-zA-Z]/,\n      ALPHANUMERIC = /[a-zA-Z0-9\\+\\-\\.]/;\n\n  function parse(input, stateOverride, base) {\n    function err(message) {\n      errors.push(message);\n    }\n\n    var state = stateOverride || 'scheme start',\n        cursor = 0,\n        buffer = '',\n        seenAt = false,\n        seenBracket = false,\n        errors = [];\n\n    loop: while ((input[cursor - 1] !== EOF || cursor === 0) &&\n                 !this._isInvalid) {\n      var c = input[cursor];\n      switch (state) {\n        case 'scheme start':\n          if (c && ALPHA.test(c)) {\n            buffer += c.toLowerCase(); // ASCII-safe\n            state = 'scheme';\n          } else if (!stateOverride) {\n            buffer = '';\n            state = 'no scheme';\n            continue;\n          } else {\n            err('Invalid scheme.');\n            break loop;\n          }\n          break;\n\n        case 'scheme':\n          if (c && ALPHANUMERIC.test(c)) {\n            buffer += c.toLowerCase(); // ASCII-safe\n          } else if (c === ':') {\n            this._scheme = buffer;\n            buffer = '';\n            if (stateOverride) {\n              break loop;\n            }\n            if (isRelativeScheme(this._scheme)) {\n              this._isRelative = true;\n            }\n            if (this._scheme === 'file') {\n              state = 'relative';\n            } else if (this._isRelative && base &&\n                       base._scheme === this._scheme) {\n              state = 'relative or authority';\n            } else if (this._isRelative) {\n              state = 'authority first slash';\n            } else {\n              state = 'scheme data';\n            }\n          } else if (!stateOverride) {\n            buffer = '';\n            cursor = 0;\n            state = 'no scheme';\n            continue;\n          } else if (c === EOF) {\n            break loop;\n          } else {\n            err('Code point not allowed in scheme: ' + c);\n            break loop;\n          }\n          break;\n\n        case 'scheme data':\n          if (c === '?') {\n            this._query = '?';\n            state = 'query';\n          } else if (c === '#') {\n            this._fragment = '#';\n            state = 'fragment';\n          } else {\n            // XXX error handling\n            if (c !== EOF && c !== '\\t' && c !== '\\n' && c !== '\\r') {\n              this._schemeData += percentEscape(c);\n            }\n          }\n          break;\n\n        case 'no scheme':\n          if (!base || !(isRelativeScheme(base._scheme))) {\n            err('Missing scheme.');\n            invalid.call(this);\n          } else {\n            state = 'relative';\n            continue;\n          }\n          break;\n\n        case 'relative or authority':\n          if (c === '/' && input[cursor + 1] === '/') {\n            state = 'authority ignore slashes';\n          } else {\n            err('Expected /, got: ' + c);\n            state = 'relative';\n            continue;\n          }\n          break;\n\n        case 'relative':\n          this._isRelative = true;\n          if (this._scheme !== 'file') {\n            this._scheme = base._scheme;\n          }\n          if (c === EOF) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = base._query;\n            this._username = base._username;\n            this._password = base._password;\n            break loop;\n          } else if (c === '/' || c === '\\\\') {\n            if (c === '\\\\') {\n              err('\\\\ is an invalid code point.');\n            }\n            state = 'relative slash';\n          } else if (c === '?') {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = '?';\n            this._username = base._username;\n            this._password = base._password;\n            state = 'query';\n          } else if (c === '#') {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = base._query;\n            this._fragment = '#';\n            this._username = base._username;\n            this._password = base._password;\n            state = 'fragment';\n          } else {\n            var nextC = input[cursor + 1];\n            var nextNextC = input[cursor + 2];\n            if (this._scheme !== 'file' || !ALPHA.test(c) ||\n                (nextC !== ':' && nextC !== '|') ||\n                (nextNextC !== EOF && nextNextC !== '/' && nextNextC !== '\\\\' &&\n                 nextNextC !== '?' && nextNextC !== '#')) {\n              this._host = base._host;\n              this._port = base._port;\n              this._username = base._username;\n              this._password = base._password;\n              this._path = base._path.slice();\n              this._path.pop();\n            }\n            state = 'relative path';\n            continue;\n          }\n          break;\n\n        case 'relative slash':\n          if (c === '/' || c === '\\\\') {\n            if (c === '\\\\') {\n              err('\\\\ is an invalid code point.');\n            }\n            if (this._scheme === 'file') {\n              state = 'file host';\n            } else {\n              state = 'authority ignore slashes';\n            }\n          } else {\n            if (this._scheme !== 'file') {\n              this._host = base._host;\n              this._port = base._port;\n              this._username = base._username;\n              this._password = base._password;\n            }\n            state = 'relative path';\n            continue;\n          }\n          break;\n\n        case 'authority first slash':\n          if (c === '/') {\n            state = 'authority second slash';\n          } else {\n            err('Expected \\'/\\', got: ' + c);\n            state = 'authority ignore slashes';\n            continue;\n          }\n          break;\n\n        case 'authority second slash':\n          state = 'authority ignore slashes';\n          if (c !== '/') {\n            err('Expected \\'/\\', got: ' + c);\n            continue;\n          }\n          break;\n\n        case 'authority ignore slashes':\n          if (c !== '/' && c !== '\\\\') {\n            state = 'authority';\n            continue;\n          } else {\n            err('Expected authority, got: ' + c);\n          }\n          break;\n\n        case 'authority':\n          if (c === '@') {\n            if (seenAt) {\n              err('@ already seen.');\n              buffer += '%40';\n            }\n            seenAt = true;\n            for (var i = 0; i < buffer.length; i++) {\n              var cp = buffer[i];\n              if (cp === '\\t' || cp === '\\n' || cp === '\\r') {\n                err('Invalid whitespace in authority.');\n                continue;\n              }\n              // XXX check URL code points\n              if (cp === ':' && this._password === null) {\n                this._password = '';\n                continue;\n              }\n              var tempC = percentEscape(cp);\n              if (this._password !== null) {\n                this._password += tempC;\n              } else {\n                this._username += tempC;\n              }\n            }\n            buffer = '';\n          } else if (c === EOF || c === '/' || c === '\\\\' ||\n                     c === '?' || c === '#') {\n            cursor -= buffer.length;\n            buffer = '';\n            state = 'host';\n            continue;\n          } else {\n            buffer += c;\n          }\n          break;\n\n        case 'file host':\n          if (c === EOF || c === '/' || c === '\\\\' || c === '?' || c === '#') {\n            if (buffer.length === 2 && ALPHA.test(buffer[0]) &&\n                (buffer[1] === ':' || buffer[1] === '|')) {\n              state = 'relative path';\n            } else if (buffer.length === 0) {\n              state = 'relative path start';\n            } else {\n              this._host = IDNAToASCII.call(this, buffer);\n              buffer = '';\n              state = 'relative path start';\n            }\n            continue;\n          } else if (c === '\\t' || c === '\\n' || c === '\\r') {\n            err('Invalid whitespace in file host.');\n          } else {\n            buffer += c;\n          }\n          break;\n\n        case 'host':\n        case 'hostname':\n          if (c === ':' && !seenBracket) {\n            // XXX host parsing\n            this._host = IDNAToASCII.call(this, buffer);\n            buffer = '';\n            state = 'port';\n            if (stateOverride === 'hostname') {\n              break loop;\n            }\n          } else if (c === EOF || c === '/' ||\n                     c === '\\\\' || c === '?' || c === '#') {\n            this._host = IDNAToASCII.call(this, buffer);\n            buffer = '';\n            state = 'relative path start';\n            if (stateOverride) {\n              break loop;\n            }\n            continue;\n          } else if (c !== '\\t' && c !== '\\n' && c !== '\\r') {\n            if (c === '[') {\n              seenBracket = true;\n            } else if (c === ']') {\n              seenBracket = false;\n            }\n            buffer += c;\n          } else {\n            err('Invalid code point in host/hostname: ' + c);\n          }\n          break;\n\n        case 'port':\n          if (/[0-9]/.test(c)) {\n            buffer += c;\n          } else if (c === EOF || c === '/' || c === '\\\\' ||\n                     c === '?' || c === '#' || stateOverride) {\n            if (buffer !== '') {\n              var temp = parseInt(buffer, 10);\n              if (temp !== relative[this._scheme]) {\n                this._port = temp + '';\n              }\n              buffer = '';\n            }\n            if (stateOverride) {\n              break loop;\n            }\n            state = 'relative path start';\n            continue;\n          } else if (c === '\\t' || c === '\\n' || c === '\\r') {\n            err('Invalid code point in port: ' + c);\n          } else {\n            invalid.call(this);\n          }\n          break;\n\n        case 'relative path start':\n          if (c === '\\\\') {\n            err('\\'\\\\\\' not allowed in path.');\n          }\n          state = 'relative path';\n          if (c !== '/' && c !== '\\\\') {\n            continue;\n          }\n          break;\n\n        case 'relative path':\n          if (c === EOF || c === '/' || c === '\\\\' ||\n              (!stateOverride && (c === '?' || c === '#'))) {\n            if (c === '\\\\') {\n              err('\\\\ not allowed in relative path.');\n            }\n            var tmp;\n            if ((tmp = relativePathDotMapping[buffer.toLowerCase()])) {\n              buffer = tmp;\n            }\n            if (buffer === '..') {\n              this._path.pop();\n              if (c !== '/' && c !== '\\\\') {\n                this._path.push('');\n              }\n            } else if (buffer === '.' && c !== '/' && c !== '\\\\') {\n              this._path.push('');\n            } else if (buffer !== '.') {\n              if (this._scheme === 'file' && this._path.length === 0 &&\n                  buffer.length === 2 && ALPHA.test(buffer[0]) &&\n                  buffer[1] === '|') {\n                buffer = buffer[0] + ':';\n              }\n              this._path.push(buffer);\n            }\n            buffer = '';\n            if (c === '?') {\n              this._query = '?';\n              state = 'query';\n            } else if (c === '#') {\n              this._fragment = '#';\n              state = 'fragment';\n            }\n          } else if (c !== '\\t' && c !== '\\n' && c !== '\\r') {\n            buffer += percentEscape(c);\n          }\n          break;\n\n        case 'query':\n          if (!stateOverride && c === '#') {\n            this._fragment = '#';\n            state = 'fragment';\n          } else if (c !== EOF && c !== '\\t' && c !== '\\n' && c !== '\\r') {\n            this._query += percentEscapeQuery(c);\n          }\n          break;\n\n        case 'fragment':\n          if (c !== EOF && c !== '\\t' && c !== '\\n' && c !== '\\r') {\n            this._fragment += c;\n          }\n          break;\n      }\n\n      cursor++;\n    }\n  }\n\n  function clear() {\n    this._scheme = '';\n    this._schemeData = '';\n    this._username = '';\n    this._password = null;\n    this._host = '';\n    this._port = '';\n    this._path = [];\n    this._query = '';\n    this._fragment = '';\n    this._isInvalid = false;\n    this._isRelative = false;\n  }\n\n  // Does not process domain names or IP addresses.\n  // Does not handle encoding for the query parameter.\n  function JURL(url, base /* , encoding */) {\n    if (base !== undefined && !(base instanceof JURL)) {\n      base = new JURL(String(base));\n    }\n\n    this._url = url;\n    clear.call(this);\n\n    var input = url.replace(/^[ \\t\\r\\n\\f]+|[ \\t\\r\\n\\f]+$/g, '');\n    // encoding = encoding || 'utf-8'\n\n    parse.call(this, input, null, base);\n  }\n\n  JURL.prototype = {\n    toString() {\n      return this.href;\n    },\n    get href() {\n      if (this._isInvalid) {\n        return this._url;\n      }\n      var authority = '';\n      if (this._username !== '' || this._password !== null) {\n        authority = this._username +\n          (this._password !== null ? ':' + this._password : '') + '@';\n      }\n\n      return this.protocol +\n          (this._isRelative ? '//' + authority + this.host : '') +\n          this.pathname + this._query + this._fragment;\n    },\n    // The named parameter should be different from the setter's function name.\n    // Otherwise Safari 5 will throw an error (see issue 8541)\n    set href(value) {\n      clear.call(this);\n      parse.call(this, value);\n    },\n\n    get protocol() {\n      return this._scheme + ':';\n    },\n    set protocol(value) {\n      if (this._isInvalid) {\n        return;\n      }\n      parse.call(this, value + ':', 'scheme start');\n    },\n\n    get host() {\n      return this._isInvalid ? '' : this._port ?\n          this._host + ':' + this._port : this._host;\n    },\n    set host(value) {\n      if (this._isInvalid || !this._isRelative) {\n        return;\n      }\n      parse.call(this, value, 'host');\n    },\n\n    get hostname() {\n      return this._host;\n    },\n    set hostname(value) {\n      if (this._isInvalid || !this._isRelative) {\n        return;\n      }\n      parse.call(this, value, 'hostname');\n    },\n\n    get port() {\n      return this._port;\n    },\n    set port(value) {\n      if (this._isInvalid || !this._isRelative) {\n        return;\n      }\n      parse.call(this, value, 'port');\n    },\n\n    get pathname() {\n      return this._isInvalid ? '' : this._isRelative ?\n          '/' + this._path.join('/') : this._schemeData;\n    },\n    set pathname(value) {\n      if (this._isInvalid || !this._isRelative) {\n        return;\n      }\n      this._path = [];\n      parse.call(this, value, 'relative path start');\n    },\n\n    get search() {\n      return this._isInvalid || !this._query || this._query === '?' ?\n          '' : this._query;\n    },\n    set search(value) {\n      if (this._isInvalid || !this._isRelative) {\n        return;\n      }\n      this._query = '?';\n      if (value[0] === '?') {\n        value = value.slice(1);\n      }\n      parse.call(this, value, 'query');\n    },\n\n    get hash() {\n      return this._isInvalid || !this._fragment || this._fragment === '#' ?\n          '' : this._fragment;\n    },\n    set hash(value) {\n      if (this._isInvalid) {\n        return;\n      }\n      this._fragment = '#';\n      if (value[0] === '#') {\n        value = value.slice(1);\n      }\n      parse.call(this, value, 'fragment');\n    },\n\n    get origin() {\n      var host;\n      if (this._isInvalid || !this._scheme) {\n        return '';\n      }\n      // javascript: Gecko returns String(\"\"), WebKit/Blink String(\"null\")\n      // Gecko throws error for \"data://\"\n      // data: Gecko returns \"\", Blink returns \"data://\", WebKit returns \"null\"\n      // Gecko returns String(\"\") for file: mailto:\n      // WebKit/Blink returns String(\"SCHEME://\") for file: mailto:\n      switch (this._scheme) {\n        case 'data':\n        case 'file':\n        case 'javascript':\n        case 'mailto':\n          return 'null';\n        case 'blob':\n          // Special case of blob: -- returns valid origin of _schemeData.\n          try {\n            return new JURL(this._schemeData).origin || 'null';\n          } catch (_) {\n            // Invalid _schemeData origin -- ignoring errors.\n          }\n          return 'null';\n      }\n      host = this.host;\n      if (!host) {\n        return '';\n      }\n      return this._scheme + '://' + host;\n    },\n  };\n\n  exports.URL = JURL;\n})();\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  createValidAbsoluteUrl, MissingDataException, shadow, unreachable, warn\n} from '../shared/util';\nimport { ChunkedStreamManager } from './chunked_stream';\nimport { PDFDocument } from './document';\nimport { Stream } from './stream';\n\nclass BasePdfManager {\n  constructor() {\n    if (this.constructor === BasePdfManager) {\n      unreachable('Cannot initialize BasePdfManager.');\n    }\n  }\n\n  get docId() {\n    return this._docId;\n  }\n\n  get password() {\n    return this._password;\n  }\n\n  get docBaseUrl() {\n    let docBaseUrl = null;\n    if (this._docBaseUrl) {\n      const absoluteUrl = createValidAbsoluteUrl(this._docBaseUrl);\n      if (absoluteUrl) {\n        docBaseUrl = absoluteUrl.href;\n      } else {\n        warn(`Invalid absolute docBaseUrl: \"${this._docBaseUrl}\".`);\n      }\n    }\n    return shadow(this, 'docBaseUrl', docBaseUrl);\n  }\n\n  onLoadedStream() {\n    unreachable('Abstract method `onLoadedStream` called');\n  }\n\n  ensureDoc(prop, args) {\n    return this.ensure(this.pdfDocument, prop, args);\n  }\n\n  ensureXRef(prop, args) {\n    return this.ensure(this.pdfDocument.xref, prop, args);\n  }\n\n  ensureCatalog(prop, args) {\n    return this.ensure(this.pdfDocument.catalog, prop, args);\n  }\n\n  getPage(pageIndex) {\n    return this.pdfDocument.getPage(pageIndex);\n  }\n\n  cleanup() {\n    return this.pdfDocument.cleanup();\n  }\n\n  async ensure(obj, prop, args) {\n    unreachable('Abstract method `ensure` called');\n  }\n\n  requestRange(begin, end) {\n    unreachable('Abstract method `requestRange` called');\n  }\n\n  requestLoadedStream() {\n    unreachable('Abstract method `requestLoadedStream` called');\n  }\n\n  sendProgressiveData(chunk) {\n    unreachable('Abstract method `sendProgressiveData` called');\n  }\n\n  updatePassword(password) {\n    this._password = password;\n  }\n\n  terminate() {\n    unreachable('Abstract method `terminate` called');\n  }\n}\n\nclass LocalPdfManager extends BasePdfManager {\n  constructor(docId, data, password, evaluatorOptions, docBaseUrl) {\n    super();\n\n    this._docId = docId;\n    this._password = password;\n    this._docBaseUrl = docBaseUrl;\n    this.evaluatorOptions = evaluatorOptions;\n\n    const stream = new Stream(data);\n    this.pdfDocument = new PDFDocument(this, stream);\n    this._loadedStreamPromise = Promise.resolve(stream);\n  }\n\n  async ensure(obj, prop, args) {\n    const value = obj[prop];\n    if (typeof value === 'function') {\n      return value.apply(obj, args);\n    }\n    return value;\n  }\n\n  requestRange(begin, end) {\n    return Promise.resolve();\n  }\n\n  requestLoadedStream() {}\n\n  onLoadedStream() {\n    return this._loadedStreamPromise;\n  }\n\n  terminate() {}\n}\n\nclass NetworkPdfManager extends BasePdfManager {\n  constructor(docId, pdfNetworkStream, args, evaluatorOptions, docBaseUrl) {\n    super();\n\n    this._docId = docId;\n    this._password = args.password;\n    this._docBaseUrl = docBaseUrl;\n    this.msgHandler = args.msgHandler;\n    this.evaluatorOptions = evaluatorOptions;\n\n    this.streamManager = new ChunkedStreamManager(pdfNetworkStream, {\n      msgHandler: args.msgHandler,\n      url: args.url,\n      length: args.length,\n      disableAutoFetch: args.disableAutoFetch,\n      rangeChunkSize: args.rangeChunkSize,\n    });\n    this.pdfDocument = new PDFDocument(this, this.streamManager.getStream());\n  }\n\n  async ensure(obj, prop, args) {\n    try {\n      const value = obj[prop];\n      if (typeof value === 'function') {\n        return value.apply(obj, args);\n      }\n      return value;\n    } catch (ex) {\n      if (!(ex instanceof MissingDataException)) {\n        throw ex;\n      }\n      await this.requestRange(ex.begin, ex.end);\n      return this.ensure(obj, prop, args);\n    }\n  }\n\n  requestRange(begin, end) {\n    return this.streamManager.requestRange(begin, end);\n  }\n\n  requestLoadedStream() {\n    this.streamManager.requestAllChunks();\n  }\n\n  sendProgressiveData(chunk) {\n    this.streamManager.onReceiveData({ chunk, });\n  }\n\n  onLoadedStream() {\n    return this.streamManager.onLoadedStream();\n  }\n\n  terminate() {\n    this.streamManager.abort();\n  }\n}\n\nexport {\n  LocalPdfManager,\n  NetworkPdfManager,\n};\n","module.exports = require(\"regenerator-runtime\");\n","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n// This method of obtaining a reference to the global object needs to be\n// kept identical to the way it is obtained in runtime.js\nvar g = (function() { return this })() || Function(\"return this\")();\n\n// Use `getOwnPropertyNames` because not all browsers support calling\n// `hasOwnProperty` on the global `self` object in a worker. See #183.\nvar hadRuntime = g.regeneratorRuntime &&\n  Object.getOwnPropertyNames(g).indexOf(\"regeneratorRuntime\") >= 0;\n\n// Save the old regeneratorRuntime in case it needs to be restored later.\nvar oldRuntime = hadRuntime && g.regeneratorRuntime;\n\n// Force reevalutation of runtime.js.\ng.regeneratorRuntime = undefined;\n\nmodule.exports = require(\"./runtime\");\n\nif (hadRuntime) {\n  // Restore the original runtime.\n  g.regeneratorRuntime = oldRuntime;\n} else {\n  // Remove the global property added by runtime.js.\n  try {\n    delete g.regeneratorRuntime;\n  } catch(e) {\n    g.regeneratorRuntime = undefined;\n  }\n}\n","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n!(function(global) {\n  \"use strict\";\n\n  var Op = Object.prototype;\n  var hasOwn = Op.hasOwnProperty;\n  var undefined; // More compressible than void 0.\n  var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n  var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n  var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n  var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n  var inModule = typeof module === \"object\";\n  var runtime = global.regeneratorRuntime;\n  if (runtime) {\n    if (inModule) {\n      // If regeneratorRuntime is defined globally and we're in a module,\n      // make the exports object identical to regeneratorRuntime.\n      module.exports = runtime;\n    }\n    // Don't bother evaluating the rest of this file if the runtime was\n    // already defined globally.\n    return;\n  }\n\n  // Define the runtime globally (as expected by generated code) as either\n  // module.exports (if we're in a module) or a new, empty object.\n  runtime = global.regeneratorRuntime = inModule ? module.exports : {};\n\n  function wrap(innerFn, outerFn, self, tryLocsList) {\n    // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n    var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n    var generator = Object.create(protoGenerator.prototype);\n    var context = new Context(tryLocsList || []);\n\n    // The ._invoke method unifies the implementations of the .next,\n    // .throw, and .return methods.\n    generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n    return generator;\n  }\n  runtime.wrap = wrap;\n\n  // Try/catch helper to minimize deoptimizations. Returns a completion\n  // record like context.tryEntries[i].completion. This interface could\n  // have been (and was previously) designed to take a closure to be\n  // invoked without arguments, but in all the cases we care about we\n  // already have an existing method we want to call, so there's no need\n  // to create a new function object. We can even get away with assuming\n  // the method takes exactly one argument, since that happens to be true\n  // in every case, so we don't have to touch the arguments object. The\n  // only additional allocation required is the completion record, which\n  // has a stable shape and so hopefully should be cheap to allocate.\n  function tryCatch(fn, obj, arg) {\n    try {\n      return { type: \"normal\", arg: fn.call(obj, arg) };\n    } catch (err) {\n      return { type: \"throw\", arg: err };\n    }\n  }\n\n  var GenStateSuspendedStart = \"suspendedStart\";\n  var GenStateSuspendedYield = \"suspendedYield\";\n  var GenStateExecuting = \"executing\";\n  var GenStateCompleted = \"completed\";\n\n  // Returning this object from the innerFn has the same effect as\n  // breaking out of the dispatch switch statement.\n  var ContinueSentinel = {};\n\n  // Dummy constructor functions that we use as the .constructor and\n  // .constructor.prototype properties for functions that return Generator\n  // objects. For full spec compliance, you may wish to configure your\n  // minifier not to mangle the names of these two functions.\n  function Generator() {}\n  function GeneratorFunction() {}\n  function GeneratorFunctionPrototype() {}\n\n  // This is a polyfill for %IteratorPrototype% for environments that\n  // don't natively support it.\n  var IteratorPrototype = {};\n  IteratorPrototype[iteratorSymbol] = function () {\n    return this;\n  };\n\n  var getProto = Object.getPrototypeOf;\n  var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n  if (NativeIteratorPrototype &&\n      NativeIteratorPrototype !== Op &&\n      hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n    // This environment has a native %IteratorPrototype%; use it instead\n    // of the polyfill.\n    IteratorPrototype = NativeIteratorPrototype;\n  }\n\n  var Gp = GeneratorFunctionPrototype.prototype =\n    Generator.prototype = Object.create(IteratorPrototype);\n  GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n  GeneratorFunctionPrototype.constructor = GeneratorFunction;\n  GeneratorFunctionPrototype[toStringTagSymbol] =\n    GeneratorFunction.displayName = \"GeneratorFunction\";\n\n  // Helper for defining the .next, .throw, and .return methods of the\n  // Iterator interface in terms of a single ._invoke method.\n  function defineIteratorMethods(prototype) {\n    [\"next\", \"throw\", \"return\"].forEach(function(method) {\n      prototype[method] = function(arg) {\n        return this._invoke(method, arg);\n      };\n    });\n  }\n\n  runtime.isGeneratorFunction = function(genFun) {\n    var ctor = typeof genFun === \"function\" && genFun.constructor;\n    return ctor\n      ? ctor === GeneratorFunction ||\n        // For the native GeneratorFunction constructor, the best we can\n        // do is to check its .name property.\n        (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n      : false;\n  };\n\n  runtime.mark = function(genFun) {\n    if (Object.setPrototypeOf) {\n      Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n    } else {\n      genFun.__proto__ = GeneratorFunctionPrototype;\n      if (!(toStringTagSymbol in genFun)) {\n        genFun[toStringTagSymbol] = \"GeneratorFunction\";\n      }\n    }\n    genFun.prototype = Object.create(Gp);\n    return genFun;\n  };\n\n  // Within the body of any async function, `await x` is transformed to\n  // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n  // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n  // meant to be awaited.\n  runtime.awrap = function(arg) {\n    return { __await: arg };\n  };\n\n  function AsyncIterator(generator) {\n    function invoke(method, arg, resolve, reject) {\n      var record = tryCatch(generator[method], generator, arg);\n      if (record.type === \"throw\") {\n        reject(record.arg);\n      } else {\n        var result = record.arg;\n        var value = result.value;\n        if (value &&\n            typeof value === \"object\" &&\n            hasOwn.call(value, \"__await\")) {\n          return Promise.resolve(value.__await).then(function(value) {\n            invoke(\"next\", value, resolve, reject);\n          }, function(err) {\n            invoke(\"throw\", err, resolve, reject);\n          });\n        }\n\n        return Promise.resolve(value).then(function(unwrapped) {\n          // When a yielded Promise is resolved, its final value becomes\n          // the .value of the Promise<{value,done}> result for the\n          // current iteration. If the Promise is rejected, however, the\n          // result for this iteration will be rejected with the same\n          // reason. Note that rejections of yielded Promises are not\n          // thrown back into the generator function, as is the case\n          // when an awaited Promise is rejected. This difference in\n          // behavior between yield and await is important, because it\n          // allows the consumer to decide what to do with the yielded\n          // rejection (swallow it and continue, manually .throw it back\n          // into the generator, abandon iteration, whatever). With\n          // await, by contrast, there is no opportunity to examine the\n          // rejection reason outside the generator function, so the\n          // only option is to throw it from the await expression, and\n          // let the generator function handle the exception.\n          result.value = unwrapped;\n          resolve(result);\n        }, reject);\n      }\n    }\n\n    var previousPromise;\n\n    function enqueue(method, arg) {\n      function callInvokeWithMethodAndArg() {\n        return new Promise(function(resolve, reject) {\n          invoke(method, arg, resolve, reject);\n        });\n      }\n\n      return previousPromise =\n        // If enqueue has been called before, then we want to wait until\n        // all previous Promises have been resolved before calling invoke,\n        // so that results are always delivered in the correct order. If\n        // enqueue has not been called before, then it is important to\n        // call invoke immediately, without waiting on a callback to fire,\n        // so that the async generator function has the opportunity to do\n        // any necessary setup in a predictable way. This predictability\n        // is why the Promise constructor synchronously invokes its\n        // executor callback, and why async functions synchronously\n        // execute code before the first await. Since we implement simple\n        // async functions in terms of async generators, it is especially\n        // important to get this right, even though it requires care.\n        previousPromise ? previousPromise.then(\n          callInvokeWithMethodAndArg,\n          // Avoid propagating failures to Promises returned by later\n          // invocations of the iterator.\n          callInvokeWithMethodAndArg\n        ) : callInvokeWithMethodAndArg();\n    }\n\n    // Define the unified helper method that is used to implement .next,\n    // .throw, and .return (see defineIteratorMethods).\n    this._invoke = enqueue;\n  }\n\n  defineIteratorMethods(AsyncIterator.prototype);\n  AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n    return this;\n  };\n  runtime.AsyncIterator = AsyncIterator;\n\n  // Note that simple async functions are implemented on top of\n  // AsyncIterator objects; they just return a Promise for the value of\n  // the final result produced by the iterator.\n  runtime.async = function(innerFn, outerFn, self, tryLocsList) {\n    var iter = new AsyncIterator(\n      wrap(innerFn, outerFn, self, tryLocsList)\n    );\n\n    return runtime.isGeneratorFunction(outerFn)\n      ? iter // If outerFn is a generator, return the full iterator.\n      : iter.next().then(function(result) {\n          return result.done ? result.value : iter.next();\n        });\n  };\n\n  function makeInvokeMethod(innerFn, self, context) {\n    var state = GenStateSuspendedStart;\n\n    return function invoke(method, arg) {\n      if (state === GenStateExecuting) {\n        throw new Error(\"Generator is already running\");\n      }\n\n      if (state === GenStateCompleted) {\n        if (method === \"throw\") {\n          throw arg;\n        }\n\n        // Be forgiving, per 25.3.3.3.3 of the spec:\n        // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n        return doneResult();\n      }\n\n      context.method = method;\n      context.arg = arg;\n\n      while (true) {\n        var delegate = context.delegate;\n        if (delegate) {\n          var delegateResult = maybeInvokeDelegate(delegate, context);\n          if (delegateResult) {\n            if (delegateResult === ContinueSentinel) continue;\n            return delegateResult;\n          }\n        }\n\n        if (context.method === \"next\") {\n          // Setting context._sent for legacy support of Babel's\n          // function.sent implementation.\n          context.sent = context._sent = context.arg;\n\n        } else if (context.method === \"throw\") {\n          if (state === GenStateSuspendedStart) {\n            state = GenStateCompleted;\n            throw context.arg;\n          }\n\n          context.dispatchException(context.arg);\n\n        } else if (context.method === \"return\") {\n          context.abrupt(\"return\", context.arg);\n        }\n\n        state = GenStateExecuting;\n\n        var record = tryCatch(innerFn, self, context);\n        if (record.type === \"normal\") {\n          // If an exception is thrown from innerFn, we leave state ===\n          // GenStateExecuting and loop back for another invocation.\n          state = context.done\n            ? GenStateCompleted\n            : GenStateSuspendedYield;\n\n          if (record.arg === ContinueSentinel) {\n            continue;\n          }\n\n          return {\n            value: record.arg,\n            done: context.done\n          };\n\n        } else if (record.type === \"throw\") {\n          state = GenStateCompleted;\n          // Dispatch the exception by looping back around to the\n          // context.dispatchException(context.arg) call above.\n          context.method = \"throw\";\n          context.arg = record.arg;\n        }\n      }\n    };\n  }\n\n  // Call delegate.iterator[context.method](context.arg) and handle the\n  // result, either by returning a { value, done } result from the\n  // delegate iterator, or by modifying context.method and context.arg,\n  // setting context.delegate to null, and returning the ContinueSentinel.\n  function maybeInvokeDelegate(delegate, context) {\n    var method = delegate.iterator[context.method];\n    if (method === undefined) {\n      // A .throw or .return when the delegate iterator has no .throw\n      // method always terminates the yield* loop.\n      context.delegate = null;\n\n      if (context.method === \"throw\") {\n        if (delegate.iterator.return) {\n          // If the delegate iterator has a return method, give it a\n          // chance to clean up.\n          context.method = \"return\";\n          context.arg = undefined;\n          maybeInvokeDelegate(delegate, context);\n\n          if (context.method === \"throw\") {\n            // If maybeInvokeDelegate(context) changed context.method from\n            // \"return\" to \"throw\", let that override the TypeError below.\n            return ContinueSentinel;\n          }\n        }\n\n        context.method = \"throw\";\n        context.arg = new TypeError(\n          \"The iterator does not provide a 'throw' method\");\n      }\n\n      return ContinueSentinel;\n    }\n\n    var record = tryCatch(method, delegate.iterator, context.arg);\n\n    if (record.type === \"throw\") {\n      context.method = \"throw\";\n      context.arg = record.arg;\n      context.delegate = null;\n      return ContinueSentinel;\n    }\n\n    var info = record.arg;\n\n    if (! info) {\n      context.method = \"throw\";\n      context.arg = new TypeError(\"iterator result is not an object\");\n      context.delegate = null;\n      return ContinueSentinel;\n    }\n\n    if (info.done) {\n      // Assign the result of the finished delegate to the temporary\n      // variable specified by delegate.resultName (see delegateYield).\n      context[delegate.resultName] = info.value;\n\n      // Resume execution at the desired location (see delegateYield).\n      context.next = delegate.nextLoc;\n\n      // If context.method was \"throw\" but the delegate handled the\n      // exception, let the outer generator proceed normally. If\n      // context.method was \"next\", forget context.arg since it has been\n      // \"consumed\" by the delegate iterator. If context.method was\n      // \"return\", allow the original .return call to continue in the\n      // outer generator.\n      if (context.method !== \"return\") {\n        context.method = \"next\";\n        context.arg = undefined;\n      }\n\n    } else {\n      // Re-yield the result returned by the delegate method.\n      return info;\n    }\n\n    // The delegate iterator is finished, so forget it and continue with\n    // the outer generator.\n    context.delegate = null;\n    return ContinueSentinel;\n  }\n\n  // Define Generator.prototype.{next,throw,return} in terms of the\n  // unified ._invoke helper method.\n  defineIteratorMethods(Gp);\n\n  Gp[toStringTagSymbol] = \"Generator\";\n\n  // A Generator should always return itself as the iterator object when the\n  // @@iterator function is called on it. Some browsers' implementations of the\n  // iterator prototype chain incorrectly implement this, causing the Generator\n  // object to not be returned from this call. This ensures that doesn't happen.\n  // See https://github.com/facebook/regenerator/issues/274 for more details.\n  Gp[iteratorSymbol] = function() {\n    return this;\n  };\n\n  Gp.toString = function() {\n    return \"[object Generator]\";\n  };\n\n  function pushTryEntry(locs) {\n    var entry = { tryLoc: locs[0] };\n\n    if (1 in locs) {\n      entry.catchLoc = locs[1];\n    }\n\n    if (2 in locs) {\n      entry.finallyLoc = locs[2];\n      entry.afterLoc = locs[3];\n    }\n\n    this.tryEntries.push(entry);\n  }\n\n  function resetTryEntry(entry) {\n    var record = entry.completion || {};\n    record.type = \"normal\";\n    delete record.arg;\n    entry.completion = record;\n  }\n\n  function Context(tryLocsList) {\n    // The root entry object (effectively a try statement without a catch\n    // or a finally block) gives us a place to store values thrown from\n    // locations where there is no enclosing try statement.\n    this.tryEntries = [{ tryLoc: \"root\" }];\n    tryLocsList.forEach(pushTryEntry, this);\n    this.reset(true);\n  }\n\n  runtime.keys = function(object) {\n    var keys = [];\n    for (var key in object) {\n      keys.push(key);\n    }\n    keys.reverse();\n\n    // Rather than returning an object with a next method, we keep\n    // things simple and return the next function itself.\n    return function next() {\n      while (keys.length) {\n        var key = keys.pop();\n        if (key in object) {\n          next.value = key;\n          next.done = false;\n          return next;\n        }\n      }\n\n      // To avoid creating an additional object, we just hang the .value\n      // and .done properties off the next function object itself. This\n      // also ensures that the minifier will not anonymize the function.\n      next.done = true;\n      return next;\n    };\n  };\n\n  function values(iterable) {\n    if (iterable) {\n      var iteratorMethod = iterable[iteratorSymbol];\n      if (iteratorMethod) {\n        return iteratorMethod.call(iterable);\n      }\n\n      if (typeof iterable.next === \"function\") {\n        return iterable;\n      }\n\n      if (!isNaN(iterable.length)) {\n        var i = -1, next = function next() {\n          while (++i < iterable.length) {\n            if (hasOwn.call(iterable, i)) {\n              next.value = iterable[i];\n              next.done = false;\n              return next;\n            }\n          }\n\n          next.value = undefined;\n          next.done = true;\n\n          return next;\n        };\n\n        return next.next = next;\n      }\n    }\n\n    // Return an iterator with no values.\n    return { next: doneResult };\n  }\n  runtime.values = values;\n\n  function doneResult() {\n    return { value: undefined, done: true };\n  }\n\n  Context.prototype = {\n    constructor: Context,\n\n    reset: function(skipTempReset) {\n      this.prev = 0;\n      this.next = 0;\n      // Resetting context._sent for legacy support of Babel's\n      // function.sent implementation.\n      this.sent = this._sent = undefined;\n      this.done = false;\n      this.delegate = null;\n\n      this.method = \"next\";\n      this.arg = undefined;\n\n      this.tryEntries.forEach(resetTryEntry);\n\n      if (!skipTempReset) {\n        for (var name in this) {\n          // Not sure about the optimal order of these conditions:\n          if (name.charAt(0) === \"t\" &&\n              hasOwn.call(this, name) &&\n              !isNaN(+name.slice(1))) {\n            this[name] = undefined;\n          }\n        }\n      }\n    },\n\n    stop: function() {\n      this.done = true;\n\n      var rootEntry = this.tryEntries[0];\n      var rootRecord = rootEntry.completion;\n      if (rootRecord.type === \"throw\") {\n        throw rootRecord.arg;\n      }\n\n      return this.rval;\n    },\n\n    dispatchException: function(exception) {\n      if (this.done) {\n        throw exception;\n      }\n\n      var context = this;\n      function handle(loc, caught) {\n        record.type = \"throw\";\n        record.arg = exception;\n        context.next = loc;\n\n        if (caught) {\n          // If the dispatched exception was caught by a catch block,\n          // then let that catch block handle the exception normally.\n          context.method = \"next\";\n          context.arg = undefined;\n        }\n\n        return !! caught;\n      }\n\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        var record = entry.completion;\n\n        if (entry.tryLoc === \"root\") {\n          // Exception thrown outside of any try block that could handle\n          // it, so set the completion value of the entire function to\n          // throw the exception.\n          return handle(\"end\");\n        }\n\n        if (entry.tryLoc <= this.prev) {\n          var hasCatch = hasOwn.call(entry, \"catchLoc\");\n          var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n          if (hasCatch && hasFinally) {\n            if (this.prev < entry.catchLoc) {\n              return handle(entry.catchLoc, true);\n            } else if (this.prev < entry.finallyLoc) {\n              return handle(entry.finallyLoc);\n            }\n\n          } else if (hasCatch) {\n            if (this.prev < entry.catchLoc) {\n              return handle(entry.catchLoc, true);\n            }\n\n          } else if (hasFinally) {\n            if (this.prev < entry.finallyLoc) {\n              return handle(entry.finallyLoc);\n            }\n\n          } else {\n            throw new Error(\"try statement without catch or finally\");\n          }\n        }\n      }\n    },\n\n    abrupt: function(type, arg) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.tryLoc <= this.prev &&\n            hasOwn.call(entry, \"finallyLoc\") &&\n            this.prev < entry.finallyLoc) {\n          var finallyEntry = entry;\n          break;\n        }\n      }\n\n      if (finallyEntry &&\n          (type === \"break\" ||\n           type === \"continue\") &&\n          finallyEntry.tryLoc <= arg &&\n          arg <= finallyEntry.finallyLoc) {\n        // Ignore the finally entry if control is not jumping to a\n        // location outside the try/catch block.\n        finallyEntry = null;\n      }\n\n      var record = finallyEntry ? finallyEntry.completion : {};\n      record.type = type;\n      record.arg = arg;\n\n      if (finallyEntry) {\n        this.method = \"next\";\n        this.next = finallyEntry.finallyLoc;\n        return ContinueSentinel;\n      }\n\n      return this.complete(record);\n    },\n\n    complete: function(record, afterLoc) {\n      if (record.type === \"throw\") {\n        throw record.arg;\n      }\n\n      if (record.type === \"break\" ||\n          record.type === \"continue\") {\n        this.next = record.arg;\n      } else if (record.type === \"return\") {\n        this.rval = this.arg = record.arg;\n        this.method = \"return\";\n        this.next = \"end\";\n      } else if (record.type === \"normal\" && afterLoc) {\n        this.next = afterLoc;\n      }\n\n      return ContinueSentinel;\n    },\n\n    finish: function(finallyLoc) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.finallyLoc === finallyLoc) {\n          this.complete(entry.completion, entry.afterLoc);\n          resetTryEntry(entry);\n          return ContinueSentinel;\n        }\n      }\n    },\n\n    \"catch\": function(tryLoc) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.tryLoc === tryLoc) {\n          var record = entry.completion;\n          if (record.type === \"throw\") {\n            var thrown = record.arg;\n            resetTryEntry(entry);\n          }\n          return thrown;\n        }\n      }\n\n      // The context.catch method must only be called with a location\n      // argument that corresponds to a known catch block.\n      throw new Error(\"illegal catch attempt\");\n    },\n\n    delegateYield: function(iterable, resultName, nextLoc) {\n      this.delegate = {\n        iterator: values(iterable),\n        resultName: resultName,\n        nextLoc: nextLoc\n      };\n\n      if (this.method === \"next\") {\n        // Deliberately forget the last sent value so that we don't\n        // accidentally pass it on to the delegate.\n        this.arg = undefined;\n      }\n\n      return ContinueSentinel;\n    }\n  };\n})(\n  // In sloppy mode, unbound `this` refers to the global object, fallback to\n  // Function constructor if we're in global strict mode. That is sadly a form\n  // of indirect eval which violates Content Security Policy.\n  (function() { return this })() || Function(\"return this\")()\n);\n","module.exports = function(module) {\r\n\tif (!module.webpackPolyfill) {\r\n\t\tmodule.deprecate = function() {};\r\n\t\tmodule.paths = [];\r\n\t\t// module.parent = undefined by default\r\n\t\tif (!module.children) module.children = [];\r\n\t\tObject.defineProperty(module, \"loaded\", {\r\n\t\t\tenumerable: true,\r\n\t\t\tget: function() {\r\n\t\t\t\treturn module.l;\r\n\t\t\t}\r\n\t\t});\r\n\t\tObject.defineProperty(module, \"id\", {\r\n\t\t\tenumerable: true,\r\n\t\t\tget: function() {\r\n\t\t\t\treturn module.i;\r\n\t\t\t}\r\n\t\t});\r\n\t\tmodule.webpackPolyfill = 1;\r\n\t}\r\n\treturn module;\r\n};\r\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  arrayByteLength, arraysToBytes, createPromiseCapability, isEmptyObj,\n  MissingDataException\n} from '../shared/util';\n\nvar ChunkedStream = (function ChunkedStreamClosure() {\n  function ChunkedStream(length, chunkSize, manager) {\n    this.bytes = new Uint8Array(length);\n    this.start = 0;\n    this.pos = 0;\n    this.end = length;\n    this.chunkSize = chunkSize;\n    this.loadedChunks = [];\n    this.numChunksLoaded = 0;\n    this.numChunks = Math.ceil(length / chunkSize);\n    this.manager = manager;\n    this.progressiveDataLength = 0;\n    this.lastSuccessfulEnsureByteChunk = -1;  // a single-entry cache\n  }\n\n  // required methods for a stream. if a particular stream does not\n  // implement these, an error should be thrown\n  ChunkedStream.prototype = {\n\n    getMissingChunks: function ChunkedStream_getMissingChunks() {\n      var chunks = [];\n      for (var chunk = 0, n = this.numChunks; chunk < n; ++chunk) {\n        if (!this.loadedChunks[chunk]) {\n          chunks.push(chunk);\n        }\n      }\n      return chunks;\n    },\n\n    getBaseStreams: function ChunkedStream_getBaseStreams() {\n      return [this];\n    },\n\n    allChunksLoaded: function ChunkedStream_allChunksLoaded() {\n      return this.numChunksLoaded === this.numChunks;\n    },\n\n    onReceiveData: function ChunkedStream_onReceiveData(begin, chunk) {\n      var end = begin + chunk.byteLength;\n\n      if (begin % this.chunkSize !== 0) {\n        throw new Error(`Bad begin offset: ${begin}`);\n      }\n      // Using this.length is inaccurate here since this.start can be moved\n      // See ChunkedStream.moveStart()\n      var length = this.bytes.length;\n      if (end % this.chunkSize !== 0 && end !== length) {\n        throw new Error(`Bad end offset: ${end}`);\n      }\n\n      this.bytes.set(new Uint8Array(chunk), begin);\n      var chunkSize = this.chunkSize;\n      var beginChunk = Math.floor(begin / chunkSize);\n      var endChunk = Math.floor((end - 1) / chunkSize) + 1;\n      var curChunk;\n\n      for (curChunk = beginChunk; curChunk < endChunk; ++curChunk) {\n        if (!this.loadedChunks[curChunk]) {\n          this.loadedChunks[curChunk] = true;\n          ++this.numChunksLoaded;\n        }\n      }\n    },\n\n    onReceiveProgressiveData:\n        function ChunkedStream_onReceiveProgressiveData(data) {\n      var position = this.progressiveDataLength;\n      var beginChunk = Math.floor(position / this.chunkSize);\n\n      this.bytes.set(new Uint8Array(data), position);\n      position += data.byteLength;\n      this.progressiveDataLength = position;\n      var endChunk = position >= this.end ? this.numChunks :\n                     Math.floor(position / this.chunkSize);\n      var curChunk;\n      for (curChunk = beginChunk; curChunk < endChunk; ++curChunk) {\n        if (!this.loadedChunks[curChunk]) {\n          this.loadedChunks[curChunk] = true;\n          ++this.numChunksLoaded;\n        }\n      }\n    },\n\n    ensureByte: function ChunkedStream_ensureByte(pos) {\n      var chunk = Math.floor(pos / this.chunkSize);\n      if (chunk === this.lastSuccessfulEnsureByteChunk) {\n        return;\n      }\n\n      if (!this.loadedChunks[chunk]) {\n        throw new MissingDataException(pos, pos + 1);\n      }\n      this.lastSuccessfulEnsureByteChunk = chunk;\n    },\n\n    ensureRange: function ChunkedStream_ensureRange(begin, end) {\n      if (begin >= end) {\n        return;\n      }\n\n      if (end <= this.progressiveDataLength) {\n        return;\n      }\n\n      var chunkSize = this.chunkSize;\n      var beginChunk = Math.floor(begin / chunkSize);\n      var endChunk = Math.floor((end - 1) / chunkSize) + 1;\n      for (var chunk = beginChunk; chunk < endChunk; ++chunk) {\n        if (!this.loadedChunks[chunk]) {\n          throw new MissingDataException(begin, end);\n        }\n      }\n    },\n\n    nextEmptyChunk: function ChunkedStream_nextEmptyChunk(beginChunk) {\n      var chunk, numChunks = this.numChunks;\n      for (var i = 0; i < numChunks; ++i) {\n        chunk = (beginChunk + i) % numChunks; // Wrap around to beginning\n        if (!this.loadedChunks[chunk]) {\n          return chunk;\n        }\n      }\n      return null;\n    },\n\n    hasChunk: function ChunkedStream_hasChunk(chunk) {\n      return !!this.loadedChunks[chunk];\n    },\n\n    get length() {\n      return this.end - this.start;\n    },\n\n    get isEmpty() {\n      return this.length === 0;\n    },\n\n    getByte: function ChunkedStream_getByte() {\n      var pos = this.pos;\n      if (pos >= this.end) {\n        return -1;\n      }\n      this.ensureByte(pos);\n      return this.bytes[this.pos++];\n    },\n\n    getUint16: function ChunkedStream_getUint16() {\n      var b0 = this.getByte();\n      var b1 = this.getByte();\n      if (b0 === -1 || b1 === -1) {\n        return -1;\n      }\n      return (b0 << 8) + b1;\n    },\n\n    getInt32: function ChunkedStream_getInt32() {\n      var b0 = this.getByte();\n      var b1 = this.getByte();\n      var b2 = this.getByte();\n      var b3 = this.getByte();\n      return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;\n    },\n\n    // Returns subarray of original buffer, should only be read.\n    getBytes(length, forceClamped = false) {\n      var bytes = this.bytes;\n      var pos = this.pos;\n      var strEnd = this.end;\n\n      if (!length) {\n        this.ensureRange(pos, strEnd);\n        let subarray = bytes.subarray(pos, strEnd);\n        // `this.bytes` is always a `Uint8Array` here.\n        return (forceClamped ? new Uint8ClampedArray(subarray) : subarray);\n      }\n\n      var end = pos + length;\n      if (end > strEnd) {\n        end = strEnd;\n      }\n      this.ensureRange(pos, end);\n\n      this.pos = end;\n      let subarray = bytes.subarray(pos, end);\n      // `this.bytes` is always a `Uint8Array` here.\n      return (forceClamped ? new Uint8ClampedArray(subarray) : subarray);\n    },\n\n    peekByte: function ChunkedStream_peekByte() {\n      var peekedByte = this.getByte();\n      this.pos--;\n      return peekedByte;\n    },\n\n    peekBytes(length, forceClamped = false) {\n      var bytes = this.getBytes(length, forceClamped);\n      this.pos -= bytes.length;\n      return bytes;\n    },\n\n    getByteRange: function ChunkedStream_getBytes(begin, end) {\n      this.ensureRange(begin, end);\n      return this.bytes.subarray(begin, end);\n    },\n\n    skip: function ChunkedStream_skip(n) {\n      if (!n) {\n        n = 1;\n      }\n      this.pos += n;\n    },\n\n    reset: function ChunkedStream_reset() {\n      this.pos = this.start;\n    },\n\n    moveStart: function ChunkedStream_moveStart() {\n      this.start = this.pos;\n    },\n\n    makeSubStream: function ChunkedStream_makeSubStream(start, length, dict) {\n      this.ensureRange(start, start + length);\n\n      function ChunkedStreamSubstream() {}\n      ChunkedStreamSubstream.prototype = Object.create(this);\n      ChunkedStreamSubstream.prototype.getMissingChunks = function() {\n        var chunkSize = this.chunkSize;\n        var beginChunk = Math.floor(this.start / chunkSize);\n        var endChunk = Math.floor((this.end - 1) / chunkSize) + 1;\n        var missingChunks = [];\n        for (var chunk = beginChunk; chunk < endChunk; ++chunk) {\n          if (!this.loadedChunks[chunk]) {\n            missingChunks.push(chunk);\n          }\n        }\n        return missingChunks;\n      };\n      var subStream = new ChunkedStreamSubstream();\n      subStream.pos = subStream.start = start;\n      subStream.end = start + length || this.end;\n      subStream.dict = dict;\n      return subStream;\n    },\n  };\n\n  return ChunkedStream;\n})();\n\nvar ChunkedStreamManager = (function ChunkedStreamManagerClosure() {\n\n  function ChunkedStreamManager(pdfNetworkStream, args) {\n    var chunkSize = args.rangeChunkSize;\n    var length = args.length;\n    this.stream = new ChunkedStream(length, chunkSize, this);\n    this.length = length;\n    this.chunkSize = chunkSize;\n    this.pdfNetworkStream = pdfNetworkStream;\n    this.url = args.url;\n    this.disableAutoFetch = args.disableAutoFetch;\n    this.msgHandler = args.msgHandler;\n\n    this.currRequestId = 0;\n\n    this.chunksNeededByRequest = Object.create(null);\n    this.requestsByChunk = Object.create(null);\n    this.promisesByRequest = Object.create(null);\n    this.progressiveDataLength = 0;\n    this.aborted = false;\n\n    this._loadedStreamCapability = createPromiseCapability();\n  }\n\n  ChunkedStreamManager.prototype = {\n    onLoadedStream: function ChunkedStreamManager_getLoadedStream() {\n      return this._loadedStreamCapability.promise;\n    },\n\n    sendRequest: function ChunkedStreamManager_sendRequest(begin, end) {\n      var rangeReader = this.pdfNetworkStream.getRangeReader(begin, end);\n      if (!rangeReader.isStreamingSupported) {\n        rangeReader.onProgress = this.onProgress.bind(this);\n      }\n      var chunks = [], loaded = 0;\n      var manager = this;\n      var promise = new Promise(function (resolve, reject) {\n        var readChunk = function (chunk) {\n          try {\n            if (!chunk.done) {\n              var data = chunk.value;\n              chunks.push(data);\n              loaded += arrayByteLength(data);\n              if (rangeReader.isStreamingSupported) {\n                manager.onProgress({ loaded, });\n              }\n              rangeReader.read().then(readChunk, reject);\n              return;\n            }\n            var chunkData = arraysToBytes(chunks);\n            chunks = null;\n            resolve(chunkData);\n          } catch (e) {\n            reject(e);\n          }\n        };\n        rangeReader.read().then(readChunk, reject);\n      });\n      promise.then((data) => {\n        if (this.aborted) {\n          return; // ignoring any data after abort\n        }\n        this.onReceiveData({ chunk: data, begin, });\n      });\n      // TODO check errors\n    },\n\n    // Get all the chunks that are not yet loaded and groups them into\n    // contiguous ranges to load in as few requests as possible\n    requestAllChunks: function ChunkedStreamManager_requestAllChunks() {\n      var missingChunks = this.stream.getMissingChunks();\n      this._requestChunks(missingChunks);\n      return this._loadedStreamCapability.promise;\n    },\n\n    _requestChunks: function ChunkedStreamManager_requestChunks(chunks) {\n      var requestId = this.currRequestId++;\n\n      var i, ii;\n      var chunksNeeded = Object.create(null);\n      this.chunksNeededByRequest[requestId] = chunksNeeded;\n      for (i = 0, ii = chunks.length; i < ii; i++) {\n        if (!this.stream.hasChunk(chunks[i])) {\n          chunksNeeded[chunks[i]] = true;\n        }\n      }\n\n      if (isEmptyObj(chunksNeeded)) {\n        return Promise.resolve();\n      }\n\n      var capability = createPromiseCapability();\n      this.promisesByRequest[requestId] = capability;\n\n      var chunksToRequest = [];\n      for (var chunk in chunksNeeded) {\n        chunk = chunk | 0;\n        if (!(chunk in this.requestsByChunk)) {\n          this.requestsByChunk[chunk] = [];\n          chunksToRequest.push(chunk);\n        }\n        this.requestsByChunk[chunk].push(requestId);\n      }\n\n      if (!chunksToRequest.length) {\n        return capability.promise;\n      }\n\n      var groupedChunksToRequest = this.groupChunks(chunksToRequest);\n\n      for (i = 0; i < groupedChunksToRequest.length; ++i) {\n        var groupedChunk = groupedChunksToRequest[i];\n        var begin = groupedChunk.beginChunk * this.chunkSize;\n        var end = Math.min(groupedChunk.endChunk * this.chunkSize, this.length);\n        this.sendRequest(begin, end);\n      }\n\n      return capability.promise;\n    },\n\n    getStream: function ChunkedStreamManager_getStream() {\n      return this.stream;\n    },\n\n    // Loads any chunks in the requested range that are not yet loaded\n    requestRange: function ChunkedStreamManager_requestRange(begin, end) {\n\n      end = Math.min(end, this.length);\n\n      var beginChunk = this.getBeginChunk(begin);\n      var endChunk = this.getEndChunk(end);\n\n      var chunks = [];\n      for (var chunk = beginChunk; chunk < endChunk; ++chunk) {\n        chunks.push(chunk);\n      }\n\n      return this._requestChunks(chunks);\n    },\n\n    requestRanges: function ChunkedStreamManager_requestRanges(ranges) {\n      ranges = ranges || [];\n      var chunksToRequest = [];\n\n      for (var i = 0; i < ranges.length; i++) {\n        var beginChunk = this.getBeginChunk(ranges[i].begin);\n        var endChunk = this.getEndChunk(ranges[i].end);\n        for (var chunk = beginChunk; chunk < endChunk; ++chunk) {\n          if (!chunksToRequest.includes(chunk)) {\n            chunksToRequest.push(chunk);\n          }\n        }\n      }\n\n      chunksToRequest.sort(function(a, b) {\n        return a - b;\n      });\n      return this._requestChunks(chunksToRequest);\n    },\n\n    // Groups a sorted array of chunks into as few contiguous larger\n    // chunks as possible\n    groupChunks: function ChunkedStreamManager_groupChunks(chunks) {\n      var groupedChunks = [];\n      var beginChunk = -1;\n      var prevChunk = -1;\n      for (var i = 0; i < chunks.length; ++i) {\n        var chunk = chunks[i];\n\n        if (beginChunk < 0) {\n          beginChunk = chunk;\n        }\n\n        if (prevChunk >= 0 && prevChunk + 1 !== chunk) {\n          groupedChunks.push({ beginChunk,\n                               endChunk: prevChunk + 1, });\n          beginChunk = chunk;\n        }\n        if (i + 1 === chunks.length) {\n          groupedChunks.push({ beginChunk,\n                               endChunk: chunk + 1, });\n        }\n\n        prevChunk = chunk;\n      }\n      return groupedChunks;\n    },\n\n    onProgress: function ChunkedStreamManager_onProgress(args) {\n      var bytesLoaded = (this.stream.numChunksLoaded * this.chunkSize +\n                         args.loaded);\n      this.msgHandler.send('DocProgress', {\n        loaded: bytesLoaded,\n        total: this.length,\n      });\n    },\n\n    onReceiveData: function ChunkedStreamManager_onReceiveData(args) {\n      var chunk = args.chunk;\n      var isProgressive = args.begin === undefined;\n      var begin = isProgressive ? this.progressiveDataLength : args.begin;\n      var end = begin + chunk.byteLength;\n\n      var beginChunk = Math.floor(begin / this.chunkSize);\n      var endChunk = end < this.length ? Math.floor(end / this.chunkSize) :\n                                         Math.ceil(end / this.chunkSize);\n\n      if (isProgressive) {\n        this.stream.onReceiveProgressiveData(chunk);\n        this.progressiveDataLength = end;\n      } else {\n        this.stream.onReceiveData(begin, chunk);\n      }\n\n      if (this.stream.allChunksLoaded()) {\n        this._loadedStreamCapability.resolve(this.stream);\n      }\n\n      var loadedRequests = [];\n      var i, requestId;\n      for (chunk = beginChunk; chunk < endChunk; ++chunk) {\n        // The server might return more chunks than requested\n        var requestIds = this.requestsByChunk[chunk] || [];\n        delete this.requestsByChunk[chunk];\n\n        for (i = 0; i < requestIds.length; ++i) {\n          requestId = requestIds[i];\n          var chunksNeeded = this.chunksNeededByRequest[requestId];\n          if (chunk in chunksNeeded) {\n            delete chunksNeeded[chunk];\n          }\n\n          if (!isEmptyObj(chunksNeeded)) {\n            continue;\n          }\n\n          loadedRequests.push(requestId);\n        }\n      }\n\n      // If there are no pending requests, automatically fetch the next\n      // unfetched chunk of the PDF\n      if (!this.disableAutoFetch && isEmptyObj(this.requestsByChunk)) {\n        var nextEmptyChunk;\n        if (this.stream.numChunksLoaded === 1) {\n          // This is a special optimization so that after fetching the first\n          // chunk, rather than fetching the second chunk, we fetch the last\n          // chunk.\n          var lastChunk = this.stream.numChunks - 1;\n          if (!this.stream.hasChunk(lastChunk)) {\n            nextEmptyChunk = lastChunk;\n          }\n        } else {\n          nextEmptyChunk = this.stream.nextEmptyChunk(endChunk);\n        }\n        if (Number.isInteger(nextEmptyChunk)) {\n          this._requestChunks([nextEmptyChunk]);\n        }\n      }\n\n      for (i = 0; i < loadedRequests.length; ++i) {\n        requestId = loadedRequests[i];\n        var capability = this.promisesByRequest[requestId];\n        delete this.promisesByRequest[requestId];\n        capability.resolve();\n      }\n\n      this.msgHandler.send('DocProgress', {\n        loaded: this.stream.numChunksLoaded * this.chunkSize,\n        total: this.length,\n      });\n    },\n\n    onError: function ChunkedStreamManager_onError(err) {\n      this._loadedStreamCapability.reject(err);\n    },\n\n    getBeginChunk: function ChunkedStreamManager_getBeginChunk(begin) {\n      var chunk = Math.floor(begin / this.chunkSize);\n      return chunk;\n    },\n\n    getEndChunk: function ChunkedStreamManager_getEndChunk(end) {\n      var chunk = Math.floor((end - 1) / this.chunkSize) + 1;\n      return chunk;\n    },\n\n    abort: function ChunkedStreamManager_abort() {\n      this.aborted = true;\n      if (this.pdfNetworkStream) {\n        this.pdfNetworkStream.cancelAllRequests('abort');\n      }\n      for (var requestId in this.promisesByRequest) {\n        var capability = this.promisesByRequest[requestId];\n        capability.reject(new Error('Request was aborted'));\n      }\n    },\n  };\n\n  return ChunkedStreamManager;\n})();\n\nexport {\n  ChunkedStream,\n  ChunkedStreamManager,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  assert, FormatError, getInheritableProperty, info, isArrayBuffer, isNum,\n  isSpace, isString, MissingDataException, OPS, shadow, stringToBytes,\n  stringToPDFString, Util, warn\n} from '../shared/util';\nimport { Catalog, ObjectLoader, XRef } from './obj';\nimport { Dict, isDict, isName, isStream, Ref } from './primitives';\nimport { NullStream, Stream, StreamsSequenceStream } from './stream';\nimport { AnnotationFactory } from './annotation';\nimport { calculateMD5 } from './crypto';\nimport { Linearization } from './parser';\nimport { OperatorList } from './operator_list';\nimport { PartialEvaluator } from './evaluator';\nimport { PDFFunctionFactory } from './function';\n\nvar Page = (function PageClosure() {\n\n  var DEFAULT_USER_UNIT = 1.0;\n  var LETTER_SIZE_MEDIABOX = [0, 0, 612, 792];\n\n  function isAnnotationRenderable(annotation, intent) {\n    return (intent === 'display' && annotation.viewable) ||\n           (intent === 'print' && annotation.printable);\n  }\n\n  function Page({ pdfManager, xref, pageIndex, pageDict, ref, fontCache,\n                  builtInCMapCache, pdfFunctionFactory, }) {\n    this.pdfManager = pdfManager;\n    this.pageIndex = pageIndex;\n    this.pageDict = pageDict;\n    this.xref = xref;\n    this.ref = ref;\n    this.fontCache = fontCache;\n    this.builtInCMapCache = builtInCMapCache;\n    this.pdfFunctionFactory = pdfFunctionFactory;\n    this.evaluatorOptions = pdfManager.evaluatorOptions;\n    this.resourcesPromise = null;\n\n    var uniquePrefix = 'p' + this.pageIndex + '_';\n    var idCounters = {\n      obj: 0,\n    };\n    this.idFactory = {\n      createObjId() {\n        return uniquePrefix + (++idCounters.obj);\n      },\n    };\n  }\n\n  Page.prototype = {\n    /**\n     * @private\n     */\n    _getInheritableProperty(key, getArray = false) {\n      let value = getInheritableProperty({ dict: this.pageDict, key, getArray,\n                                           stopWhenFound: false, });\n      if (!Array.isArray(value)) {\n        return value;\n      }\n      if (value.length === 1 || !isDict(value[0])) {\n        return value[0];\n      }\n      return Dict.merge(this.xref, value);\n    },\n\n    get content() {\n      return this.pageDict.get('Contents');\n    },\n\n    get resources() {\n      // For robustness: The spec states that a \\Resources entry has to be\n      // present, but can be empty. Some document omit it still, in this case\n      // we return an empty dictionary.\n      return shadow(this, 'resources',\n                    this._getInheritableProperty('Resources') || Dict.empty);\n    },\n\n    get mediaBox() {\n      var mediaBox = this._getInheritableProperty('MediaBox',\n                                                  /* getArray = */ true);\n      // Reset invalid media box to letter size.\n      if (!Array.isArray(mediaBox) || mediaBox.length !== 4) {\n        return shadow(this, 'mediaBox', LETTER_SIZE_MEDIABOX);\n      }\n      return shadow(this, 'mediaBox', mediaBox);\n    },\n\n    get cropBox() {\n      var cropBox = this._getInheritableProperty('CropBox',\n                                                 /* getArray = */ true);\n      // Reset invalid crop box to media box.\n      if (!Array.isArray(cropBox) || cropBox.length !== 4) {\n        return shadow(this, 'cropBox', this.mediaBox);\n      }\n      return shadow(this, 'cropBox', cropBox);\n    },\n\n    get userUnit() {\n      var obj = this.pageDict.get('UserUnit');\n      if (!isNum(obj) || obj <= 0) {\n        obj = DEFAULT_USER_UNIT;\n      }\n      return shadow(this, 'userUnit', obj);\n    },\n\n    get view() {\n      // From the spec, 6th ed., p.963:\n      // \"The crop, bleed, trim, and art boxes should not ordinarily\n      // extend beyond the boundaries of the media box. If they do, they are\n      // effectively reduced to their intersection with the media box.\"\n      var mediaBox = this.mediaBox, cropBox = this.cropBox;\n      if (mediaBox === cropBox) {\n        return shadow(this, 'view', mediaBox);\n      }\n      var intersection = Util.intersect(cropBox, mediaBox);\n      return shadow(this, 'view', intersection || mediaBox);\n    },\n\n    get rotate() {\n      var rotate = this._getInheritableProperty('Rotate') || 0;\n      // Normalize rotation so it's a multiple of 90 and between 0 and 270\n      if (rotate % 90 !== 0) {\n        rotate = 0;\n      } else if (rotate >= 360) {\n        rotate = rotate % 360;\n      } else if (rotate < 0) {\n        // The spec doesn't cover negatives, assume its counterclockwise\n        // rotation. The following is the other implementation of modulo.\n        rotate = ((rotate % 360) + 360) % 360;\n      }\n      return shadow(this, 'rotate', rotate);\n    },\n\n    getContentStream: function Page_getContentStream() {\n      var content = this.content;\n      var stream;\n      if (Array.isArray(content)) {\n        // fetching items\n        var xref = this.xref;\n        var i, n = content.length;\n        var streams = [];\n        for (i = 0; i < n; ++i) {\n          streams.push(xref.fetchIfRef(content[i]));\n        }\n        stream = new StreamsSequenceStream(streams);\n      } else if (isStream(content)) {\n        stream = content;\n      } else {\n        // replacing non-existent page content with empty one\n        stream = new NullStream();\n      }\n      return stream;\n    },\n\n    loadResources: function Page_loadResources(keys) {\n      if (!this.resourcesPromise) {\n        // TODO: add async `_getInheritableProperty` and remove this.\n        this.resourcesPromise = this.pdfManager.ensure(this, 'resources');\n      }\n      return this.resourcesPromise.then(() => {\n        let objectLoader = new ObjectLoader(this.resources, keys, this.xref);\n\n        return objectLoader.load();\n      });\n    },\n\n    getOperatorList({ handler, task, intent, renderInteractiveForms, }) {\n      var contentStreamPromise = this.pdfManager.ensure(this,\n                                                        'getContentStream');\n      var resourcesPromise = this.loadResources([\n        'ExtGState',\n        'ColorSpace',\n        'Pattern',\n        'Shading',\n        'XObject',\n        'Font'\n        // ProcSet\n        // Properties\n      ]);\n\n      var partialEvaluator = new PartialEvaluator({\n        pdfManager: this.pdfManager,\n        xref: this.xref,\n        handler,\n        pageIndex: this.pageIndex,\n        idFactory: this.idFactory,\n        fontCache: this.fontCache,\n        builtInCMapCache: this.builtInCMapCache,\n        options: this.evaluatorOptions,\n        pdfFunctionFactory: this.pdfFunctionFactory,\n      });\n\n      var dataPromises = Promise.all([contentStreamPromise, resourcesPromise]);\n      var pageListPromise = dataPromises.then(([contentStream]) => {\n        var opList = new OperatorList(intent, handler, this.pageIndex);\n\n        handler.send('StartRenderPage', {\n          transparency: partialEvaluator.hasBlendModes(this.resources),\n          pageIndex: this.pageIndex,\n          intent,\n        });\n        return partialEvaluator.getOperatorList({\n          stream: contentStream,\n          task,\n          resources: this.resources,\n          operatorList: opList,\n        }).then(function () {\n          return opList;\n        });\n      });\n\n      // Fetch the page's annotations and add their operator lists to the\n      // page's operator list to render them.\n      return Promise.all([pageListPromise, this._parsedAnnotations]).then(\n          function ([pageOpList, annotations]) {\n        if (annotations.length === 0) {\n          pageOpList.flush(true);\n          return pageOpList;\n        }\n\n        // Collect the operator list promises for the annotations. Each promise\n        // is resolved with the complete operator list for a single annotation.\n        var i, ii, opListPromises = [];\n        for (i = 0, ii = annotations.length; i < ii; i++) {\n          if (isAnnotationRenderable(annotations[i], intent)) {\n            opListPromises.push(annotations[i].getOperatorList(\n              partialEvaluator, task, renderInteractiveForms));\n          }\n        }\n\n        return Promise.all(opListPromises).then(function(opLists) {\n          pageOpList.addOp(OPS.beginAnnotations, []);\n          for (i = 0, ii = opLists.length; i < ii; i++) {\n            pageOpList.addOpList(opLists[i]);\n          }\n          pageOpList.addOp(OPS.endAnnotations, []);\n\n          pageOpList.flush(true);\n          return pageOpList;\n        });\n      });\n    },\n\n    extractTextContent({ handler, task, normalizeWhitespace,\n                         sink, combineTextItems, }) {\n      var contentStreamPromise = this.pdfManager.ensure(this,\n                                                        'getContentStream');\n      var resourcesPromise = this.loadResources([\n        'ExtGState',\n        'XObject',\n        'Font'\n      ]);\n\n      var dataPromises = Promise.all([contentStreamPromise, resourcesPromise]);\n      return dataPromises.then(([contentStream]) => {\n        var partialEvaluator = new PartialEvaluator({\n          pdfManager: this.pdfManager,\n          xref: this.xref,\n          handler,\n          pageIndex: this.pageIndex,\n          idFactory: this.idFactory,\n          fontCache: this.fontCache,\n          builtInCMapCache: this.builtInCMapCache,\n          options: this.evaluatorOptions,\n          pdfFunctionFactory: this.pdfFunctionFactory,\n        });\n\n        return partialEvaluator.getTextContent({\n          stream: contentStream,\n          task,\n          resources: this.resources,\n          normalizeWhitespace,\n          combineTextItems,\n          sink,\n        });\n      });\n    },\n\n    getAnnotationsData(intent) {\n      return this._parsedAnnotations.then(function(annotations) {\n        let annotationsData = [];\n        for (let i = 0, ii = annotations.length; i < ii; i++) {\n          if (!intent || isAnnotationRenderable(annotations[i], intent)) {\n            annotationsData.push(annotations[i].data);\n          }\n        }\n        return annotationsData;\n      });\n    },\n\n    get annotations() {\n      return shadow(this, 'annotations',\n                    this._getInheritableProperty('Annots') || []);\n    },\n\n    get _parsedAnnotations() {\n      const parsedAnnotations =\n        this.pdfManager.ensure(this, 'annotations').then(() => {\n          const annotationRefs = this.annotations;\n          const annotationPromises = [];\n          for (let i = 0, ii = annotationRefs.length; i < ii; i++) {\n            annotationPromises.push(AnnotationFactory.create(\n              this.xref, annotationRefs[i], this.pdfManager, this.idFactory));\n          }\n\n          return Promise.all(annotationPromises).then(function(annotations) {\n            return annotations.filter(function isDefined(annotation) {\n              return !!annotation;\n            });\n          }, function(reason) {\n            warn(`_parsedAnnotations: \"${reason}\".`);\n            return [];\n          });\n        });\n\n      return shadow(this, '_parsedAnnotations', parsedAnnotations);\n    },\n  };\n\n  return Page;\n})();\n\n/**\n * The `PDFDocument` holds all the data of the PDF file. Compared to the\n * `PDFDoc`, this one doesn't have any job management code.\n * Right now there exists one PDFDocument on the main thread + one object\n * for each worker. If there is no worker support enabled, there are two\n * `PDFDocument` objects on the main thread created.\n */\nvar PDFDocument = (function PDFDocumentClosure() {\n  var FINGERPRINT_FIRST_BYTES = 1024;\n  var EMPTY_FINGERPRINT = '\\x00\\x00\\x00\\x00\\x00\\x00\\x00' +\n    '\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00';\n\n  function PDFDocument(pdfManager, arg) {\n    var stream;\n    if (isStream(arg)) {\n      stream = arg;\n    } else if (isArrayBuffer(arg)) {\n      stream = new Stream(arg);\n    } else {\n      throw new Error('PDFDocument: Unknown argument type');\n    }\n    if (stream.length <= 0) {\n      throw new Error('PDFDocument: stream must have data');\n    }\n\n    this.pdfManager = pdfManager;\n    this.stream = stream;\n    this.xref = new XRef(stream, pdfManager);\n\n    let evaluatorOptions = pdfManager.evaluatorOptions;\n    this.pdfFunctionFactory = new PDFFunctionFactory({\n      xref: this.xref,\n      isEvalSupported: evaluatorOptions.isEvalSupported,\n    });\n    this._pagePromises = [];\n  }\n\n  function find(stream, needle, limit, backwards) {\n    var pos = stream.pos;\n    var end = stream.end;\n    var strBuf = [];\n    if (pos + limit > end) {\n      limit = end - pos;\n    }\n    for (var n = 0; n < limit; ++n) {\n      strBuf.push(String.fromCharCode(stream.getByte()));\n    }\n    var str = strBuf.join('');\n    stream.pos = pos;\n    var index = backwards ? str.lastIndexOf(needle) : str.indexOf(needle);\n    if (index === -1) {\n      return false; /* not found */\n    }\n    stream.pos += index;\n    return true; /* found */\n  }\n\n  const DocumentInfoValidators = {\n    Title: isString,\n    Author: isString,\n    Subject: isString,\n    Keywords: isString,\n    Creator: isString,\n    Producer: isString,\n    CreationDate: isString,\n    ModDate: isString,\n    Trapped: isName,\n  };\n\n  PDFDocument.prototype = {\n    parse: function PDFDocument_parse(recoveryMode) {\n      this.setup(recoveryMode);\n      var version = this.catalog.catDict.get('Version');\n      if (isName(version)) {\n        this.pdfFormatVersion = version.name;\n      }\n      try {\n        // checking if AcroForm is present\n        this.acroForm = this.catalog.catDict.get('AcroForm');\n        if (this.acroForm) {\n          this.xfa = this.acroForm.get('XFA');\n          var fields = this.acroForm.get('Fields');\n          if ((!fields || !Array.isArray(fields) || fields.length === 0) &&\n              !this.xfa) {\n            // no fields and no XFA -- not a form (?)\n            this.acroForm = null;\n          }\n        }\n      } catch (ex) {\n        if (ex instanceof MissingDataException) {\n          throw ex;\n        }\n        info('Something wrong with AcroForm entry');\n        this.acroForm = null;\n      }\n    },\n\n    get linearization() {\n      let linearization = null;\n      try {\n        linearization = Linearization.create(this.stream);\n      } catch (err) {\n        if (err instanceof MissingDataException) {\n          throw err;\n        }\n        info(err);\n      }\n      // shadow the prototype getter with a data property\n      return shadow(this, 'linearization', linearization);\n    },\n    get startXRef() {\n      var stream = this.stream;\n      var startXRef = 0;\n      var linearization = this.linearization;\n      if (linearization) {\n        // Find end of first obj.\n        stream.reset();\n        if (find(stream, 'endobj', 1024)) {\n          startXRef = stream.pos + 6;\n        }\n      } else {\n        // Find startxref by jumping backward from the end of the file.\n        var step = 1024;\n        var found = false, pos = stream.end;\n        while (!found && pos > 0) {\n          pos -= step - 'startxref'.length;\n          if (pos < 0) {\n            pos = 0;\n          }\n          stream.pos = pos;\n          found = find(stream, 'startxref', step, true);\n        }\n        if (found) {\n          stream.skip(9);\n          var ch;\n          do {\n            ch = stream.getByte();\n          } while (isSpace(ch));\n          var str = '';\n          while (ch >= 0x20 && ch <= 0x39) { // < '9'\n            str += String.fromCharCode(ch);\n            ch = stream.getByte();\n          }\n          startXRef = parseInt(str, 10);\n          if (isNaN(startXRef)) {\n            startXRef = 0;\n          }\n        }\n      }\n      // shadow the prototype getter with a data property\n      return shadow(this, 'startXRef', startXRef);\n    },\n\n    // Find the header, remove leading garbage and setup the stream\n    // starting from the header.\n    checkHeader: function PDFDocument_checkHeader() {\n      var stream = this.stream;\n      stream.reset();\n      if (find(stream, '%PDF-', 1024)) {\n        // Found the header, trim off any garbage before it.\n        stream.moveStart();\n        // Reading file format version\n        var MAX_VERSION_LENGTH = 12;\n        var version = '', ch;\n        while ((ch = stream.getByte()) > 0x20) { // SPACE\n          if (version.length >= MAX_VERSION_LENGTH) {\n            break;\n          }\n          version += String.fromCharCode(ch);\n        }\n        if (!this.pdfFormatVersion) {\n          // removing \"%PDF-\"-prefix\n          this.pdfFormatVersion = version.substring(5);\n        }\n        return;\n      }\n      // May not be a PDF file, continue anyway.\n    },\n    parseStartXRef: function PDFDocument_parseStartXRef() {\n      var startXRef = this.startXRef;\n      this.xref.setStartXRef(startXRef);\n    },\n    setup: function PDFDocument_setup(recoveryMode) {\n      this.xref.parse(recoveryMode);\n      this.catalog = new Catalog(this.pdfManager, this.xref);\n    },\n    get numPages() {\n      var linearization = this.linearization;\n      var num = linearization ? linearization.numPages : this.catalog.numPages;\n      // shadow the prototype getter\n      return shadow(this, 'numPages', num);\n    },\n    get documentInfo() {\n      const docInfo = {\n        PDFFormatVersion: this.pdfFormatVersion,\n        IsLinearized: !!this.linearization,\n        IsAcroFormPresent: !!this.acroForm,\n        IsXFAPresent: !!this.xfa,\n      };\n      let infoDict;\n      try {\n        infoDict = this.xref.trailer.get('Info');\n      } catch (err) {\n        if (err instanceof MissingDataException) {\n          throw err;\n        }\n        info('The document information dictionary is invalid.');\n      }\n      if (isDict(infoDict)) {\n        // Only fill the document info with valid entries from the spec.\n        for (let key in DocumentInfoValidators) {\n          if (infoDict.has(key)) {\n            const value = infoDict.get(key);\n            // Make sure the value conforms to the spec.\n            if (DocumentInfoValidators[key](value)) {\n              docInfo[key] = (typeof value !== 'string' ?\n                              value : stringToPDFString(value));\n            } else {\n              info('Bad value in document info for \"' + key + '\"');\n            }\n          }\n        }\n      }\n      return shadow(this, 'documentInfo', docInfo);\n    },\n    get fingerprint() {\n      var xref = this.xref, hash, fileID = '';\n      var idArray = xref.trailer.get('ID');\n\n      if (Array.isArray(idArray) && idArray[0] && isString(idArray[0]) &&\n          idArray[0] !== EMPTY_FINGERPRINT) {\n        hash = stringToBytes(idArray[0]);\n      } else {\n        if (this.stream.ensureRange) {\n          this.stream.ensureRange(0,\n            Math.min(FINGERPRINT_FIRST_BYTES, this.stream.end));\n        }\n        hash = calculateMD5(this.stream.bytes.subarray(0,\n          FINGERPRINT_FIRST_BYTES), 0, FINGERPRINT_FIRST_BYTES);\n      }\n\n      for (var i = 0, n = hash.length; i < n; i++) {\n        var hex = hash[i].toString(16);\n        fileID += hex.length === 1 ? '0' + hex : hex;\n      }\n\n      return shadow(this, 'fingerprint', fileID);\n    },\n\n    _getLinearizationPage(pageIndex) {\n      const { catalog, linearization, } = this;\n      assert(linearization && linearization.pageFirst === pageIndex);\n\n      const ref = new Ref(linearization.objectNumberFirst, 0);\n      return this.xref.fetchAsync(ref).then((obj) => {\n        // Ensure that the object that was found is actually a Page dictionary.\n        if (isDict(obj, 'Page') ||\n            (isDict(obj) && !obj.has('Type') && obj.has('Contents'))) {\n          if (ref && !catalog.pageKidsCountCache.has(ref)) {\n            catalog.pageKidsCountCache.put(ref, 1); // Cache the Page reference.\n          }\n          return [obj, ref];\n        }\n        throw new FormatError('The Linearization dictionary doesn\\'t point ' +\n                              'to a valid Page dictionary.');\n      }).catch((reason) => {\n        info(reason);\n        return catalog.getPageDict(pageIndex);\n      });\n    },\n\n    getPage(pageIndex) {\n      if (this._pagePromises[pageIndex] !== undefined) {\n        return this._pagePromises[pageIndex];\n      }\n      const { catalog, linearization, } = this;\n\n      const promise = (linearization && linearization.pageFirst === pageIndex) ?\n        this._getLinearizationPage(pageIndex) : catalog.getPageDict(pageIndex);\n\n      return this._pagePromises[pageIndex] = promise.then(([pageDict, ref]) => {\n        return new Page({\n          pdfManager: this.pdfManager,\n          xref: this.xref,\n          pageIndex,\n          pageDict,\n          ref,\n          fontCache: catalog.fontCache,\n          builtInCMapCache: catalog.builtInCMapCache,\n          pdfFunctionFactory: this.pdfFunctionFactory,\n        });\n      });\n    },\n\n    cleanup: function PDFDocument_cleanup() {\n      return this.catalog.cleanup();\n    },\n  };\n\n  return PDFDocument;\n})();\n\nexport {\n  Page,\n  PDFDocument,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  bytesToString, createPromiseCapability, createValidAbsoluteUrl, FormatError,\n  info, InvalidPDFException, isBool, isNum, isString, MissingDataException,\n  PermissionFlag, shadow, stringToPDFString, stringToUTF8String,\n  toRomanNumerals, unreachable, warn, XRefParseException\n} from '../shared/util';\nimport {\n  Dict, isCmd, isDict, isName, isRef, isRefsEqual, isStream, Ref, RefSet,\n  RefSetCache\n} from './primitives';\nimport { Lexer, Parser } from './parser';\nimport { ChunkedStream } from './chunked_stream';\nimport { CipherTransformFactory } from './crypto';\nimport { ColorSpace } from './colorspace';\n\nfunction fetchDestination(dest) {\n  return isDict(dest) ? dest.get('D') : dest;\n}\n\nclass Catalog {\n  constructor(pdfManager, xref) {\n    this.pdfManager = pdfManager;\n    this.xref = xref;\n\n    this.catDict = xref.getCatalogObj();\n    if (!isDict(this.catDict)) {\n      throw new FormatError('Catalog object is not a dictionary.');\n    }\n\n    this.fontCache = new RefSetCache();\n    this.builtInCMapCache = new Map();\n    this.pageKidsCountCache = new RefSetCache();\n  }\n\n  get metadata() {\n    const streamRef = this.catDict.getRaw('Metadata');\n    if (!isRef(streamRef)) {\n      return shadow(this, 'metadata', null);\n    }\n\n    const suppressEncryption = !(this.xref.encrypt &&\n                                 this.xref.encrypt.encryptMetadata);\n    const stream = this.xref.fetch(streamRef, suppressEncryption);\n    let metadata;\n\n    if (stream && isDict(stream.dict)) {\n      const type = stream.dict.get('Type');\n      const subtype = stream.dict.get('Subtype');\n\n      if (isName(type, 'Metadata') && isName(subtype, 'XML')) {\n        // XXX: This should examine the charset the XML document defines,\n        // however since there are currently no real means to decode\n        // arbitrary charsets, let's just hope that the author of the PDF\n        // was reasonable enough to stick with the XML default charset,\n        // which is UTF-8.\n        try {\n          metadata = stringToUTF8String(bytesToString(stream.getBytes()));\n        } catch (e) {\n          if (e instanceof MissingDataException) {\n            throw e;\n          }\n          info('Skipping invalid metadata.');\n        }\n      }\n    }\n    return shadow(this, 'metadata', metadata);\n  }\n\n  get toplevelPagesDict() {\n    const pagesObj = this.catDict.get('Pages');\n    if (!isDict(pagesObj)) {\n      throw new FormatError('Invalid top-level pages dictionary.');\n    }\n    return shadow(this, 'toplevelPagesDict', pagesObj);\n  }\n\n  get documentOutline() {\n    let obj = null;\n    try {\n      obj = this._readDocumentOutline();\n    } catch (ex) {\n      if (ex instanceof MissingDataException) {\n        throw ex;\n      }\n      warn('Unable to read document outline.');\n    }\n    return shadow(this, 'documentOutline', obj);\n  }\n\n  /**\n   * @private\n   */\n  _readDocumentOutline() {\n    let obj = this.catDict.get('Outlines');\n    if (!isDict(obj)) {\n      return null;\n    }\n    obj = obj.getRaw('First');\n    if (!isRef(obj)) {\n      return null;\n    }\n\n    const root = { items: [], };\n    const queue = [{ obj, parent: root, }];\n    // To avoid recursion, keep track of the already processed items.\n    const processed = new RefSet();\n    processed.put(obj);\n    const xref = this.xref, blackColor = new Uint8ClampedArray(3);\n\n    while (queue.length > 0) {\n      const i = queue.shift();\n      const outlineDict = xref.fetchIfRef(i.obj);\n      if (outlineDict === null) {\n        continue;\n      }\n      if (!outlineDict.has('Title')) {\n        throw new FormatError('Invalid outline item encountered.');\n      }\n\n      const data = { url: null, dest: null, };\n      Catalog.parseDestDictionary({\n        destDict: outlineDict,\n        resultObj: data,\n        docBaseUrl: this.pdfManager.docBaseUrl,\n      });\n      const title = outlineDict.get('Title');\n      const flags = outlineDict.get('F') || 0;\n      const color = outlineDict.getArray('C');\n      let rgbColor = blackColor;\n\n      // We only need to parse the color when it's valid, and non-default.\n      if (Array.isArray(color) && color.length === 3 &&\n          (color[0] !== 0 || color[1] !== 0 || color[2] !== 0)) {\n        rgbColor = ColorSpace.singletons.rgb.getRgb(color, 0);\n      }\n\n      const outlineItem = {\n        dest: data.dest,\n        url: data.url,\n        unsafeUrl: data.unsafeUrl,\n        newWindow: data.newWindow,\n        title: stringToPDFString(title),\n        color: rgbColor,\n        count: outlineDict.get('Count'),\n        bold: !!(flags & 2),\n        italic: !!(flags & 1),\n        items: [],\n      };\n\n      i.parent.items.push(outlineItem);\n      obj = outlineDict.getRaw('First');\n      if (isRef(obj) && !processed.has(obj)) {\n        queue.push({ obj, parent: outlineItem, });\n        processed.put(obj);\n      }\n      obj = outlineDict.getRaw('Next');\n      if (isRef(obj) && !processed.has(obj)) {\n        queue.push({ obj, parent: i.parent, });\n        processed.put(obj);\n      }\n    }\n    return (root.items.length > 0 ? root.items : null);\n  }\n\n  get permissions() {\n    let permissions = null;\n    try {\n      permissions = this._readPermissions();\n    } catch (ex) {\n      if (ex instanceof MissingDataException) {\n        throw ex;\n      }\n      warn('Unable to read permissions.');\n    }\n    return shadow(this, 'permissions', permissions);\n  }\n\n  /**\n   * @private\n   */\n  _readPermissions() {\n    const encrypt = this.xref.trailer.get('Encrypt');\n    if (!isDict(encrypt)) {\n      return null;\n    }\n\n    let flags = encrypt.get('P');\n    if (!isNum(flags)) {\n      return null;\n    }\n\n    // PDF integer objects are represented internally in signed 2's complement\n    // form. Therefore, convert the signed decimal integer to a signed 2's\n    // complement binary integer so we can use regular bitwise operations on it.\n    flags += 2 ** 32;\n\n    const permissions = [];\n    for (const key in PermissionFlag) {\n      const value = PermissionFlag[key];\n      if (flags & value) {\n        permissions.push(value);\n      }\n    }\n    return permissions;\n  }\n\n  get numPages() {\n    const obj = this.toplevelPagesDict.get('Count');\n    if (!Number.isInteger(obj)) {\n      throw new FormatError(\n        'Page count in top-level pages dictionary is not an integer.');\n    }\n    return shadow(this, 'numPages', obj);\n  }\n\n  get destinations() {\n    const obj = this._readDests(), dests = Object.create(null);\n    if (obj instanceof NameTree) {\n      const names = obj.getAll();\n      for (let name in names) {\n        dests[name] = fetchDestination(names[name]);\n      }\n    } else if (obj instanceof Dict) {\n      obj.forEach(function(key, value) {\n        if (value) {\n          dests[key] = fetchDestination(value);\n        }\n      });\n    }\n    return shadow(this, 'destinations', dests);\n  }\n\n  getDestination(destinationId) {\n    const obj = this._readDests();\n    if (obj instanceof NameTree || obj instanceof Dict) {\n      return fetchDestination(obj.get(destinationId) || null);\n    }\n    return null;\n  }\n\n  /**\n   * @private\n   */\n  _readDests() {\n    const obj = this.catDict.get('Names');\n    if (obj && obj.has('Dests')) {\n      return new NameTree(obj.getRaw('Dests'), this.xref);\n    } else if (this.catDict.has('Dests')) { // Simple destination dictionary.\n      return this.catDict.get('Dests');\n    }\n  }\n\n  get pageLabels() {\n    let obj = null;\n    try {\n      obj = this._readPageLabels();\n    } catch (ex) {\n      if (ex instanceof MissingDataException) {\n        throw ex;\n      }\n      warn('Unable to read page labels.');\n    }\n    return shadow(this, 'pageLabels', obj);\n  }\n\n  /**\n   * @private\n   */\n  _readPageLabels() {\n    const obj = this.catDict.getRaw('PageLabels');\n    if (!obj) {\n      return null;\n    }\n\n    const pageLabels = new Array(this.numPages);\n    let style = null, prefix = '';\n\n    const numberTree = new NumberTree(obj, this.xref);\n    const nums = numberTree.getAll();\n    let currentLabel = '', currentIndex = 1;\n\n    for (let i = 0, ii = this.numPages; i < ii; i++) {\n      if (i in nums) {\n        const labelDict = nums[i];\n        if (!isDict(labelDict)) {\n          throw new FormatError('PageLabel is not a dictionary.');\n        }\n\n        if (labelDict.has('Type') &&\n            !isName(labelDict.get('Type'), 'PageLabel')) {\n          throw new FormatError('Invalid type in PageLabel dictionary.');\n        }\n\n        if (labelDict.has('S')) {\n          const s = labelDict.get('S');\n          if (!isName(s)) {\n            throw new FormatError('Invalid style in PageLabel dictionary.');\n          }\n          style = s.name;\n        } else {\n          style = null;\n        }\n\n        if (labelDict.has('P')) {\n          const p = labelDict.get('P');\n          if (!isString(p)) {\n            throw new FormatError('Invalid prefix in PageLabel dictionary.');\n          }\n          prefix = stringToPDFString(p);\n        } else {\n          prefix = '';\n        }\n\n        if (labelDict.has('St')) {\n          const st = labelDict.get('St');\n          if (!(Number.isInteger(st) && st >= 1)) {\n            throw new FormatError('Invalid start in PageLabel dictionary.');\n          }\n          currentIndex = st;\n        } else {\n          currentIndex = 1;\n        }\n      }\n\n      switch (style) {\n        case 'D':\n          currentLabel = currentIndex;\n          break;\n        case 'R':\n        case 'r':\n          currentLabel = toRomanNumerals(currentIndex, style === 'r');\n          break;\n        case 'A':\n        case 'a':\n          const LIMIT = 26; // Use only the characters A-Z, or a-z.\n          const A_UPPER_CASE = 0x41, A_LOWER_CASE = 0x61;\n\n          const baseCharCode = (style === 'a' ? A_LOWER_CASE : A_UPPER_CASE);\n          const letterIndex = currentIndex - 1;\n          const character = String.fromCharCode(baseCharCode +\n                                                (letterIndex % LIMIT));\n          const charBuf = [];\n          for (let j = 0, jj = (letterIndex / LIMIT) | 0; j <= jj; j++) {\n            charBuf.push(character);\n          }\n          currentLabel = charBuf.join('');\n          break;\n        default:\n          if (style) {\n            throw new FormatError(\n              `Invalid style \"${style}\" in PageLabel dictionary.`);\n          }\n          currentLabel = '';\n      }\n\n      pageLabels[i] = prefix + currentLabel;\n      currentIndex++;\n    }\n    return pageLabels;\n  }\n\n  get pageMode() {\n    const obj = this.catDict.get('PageMode');\n    let pageMode = 'UseNone'; // Default value.\n\n    if (isName(obj)) {\n      switch (obj.name) {\n        case 'UseNone':\n        case 'UseOutlines':\n        case 'UseThumbs':\n        case 'FullScreen':\n        case 'UseOC':\n        case 'UseAttachments':\n          pageMode = obj.name;\n      }\n    }\n    return shadow(this, 'pageMode', pageMode);\n  }\n\n  get attachments() {\n    const obj = this.catDict.get('Names');\n    let attachments = null;\n\n    if (obj && obj.has('EmbeddedFiles')) {\n      const nameTree = new NameTree(obj.getRaw('EmbeddedFiles'), this.xref);\n      const names = nameTree.getAll();\n      for (const name in names) {\n        const fs = new FileSpec(names[name], this.xref);\n        if (!attachments) {\n          attachments = Object.create(null);\n        }\n        attachments[stringToPDFString(name)] = fs.serializable;\n      }\n    }\n    return shadow(this, 'attachments', attachments);\n  }\n\n  get javaScript() {\n    const obj = this.catDict.get('Names');\n\n    let javaScript = null;\n    function appendIfJavaScriptDict(jsDict) {\n      const type = jsDict.get('S');\n      if (!isName(type, 'JavaScript')) {\n        return;\n      }\n\n      let js = jsDict.get('JS');\n      if (isStream(js)) {\n        js = bytesToString(js.getBytes());\n      } else if (!isString(js)) {\n        return;\n      }\n\n      if (!javaScript) {\n        javaScript = [];\n      }\n      javaScript.push(stringToPDFString(js));\n    }\n\n    if (obj && obj.has('JavaScript')) {\n      const nameTree = new NameTree(obj.getRaw('JavaScript'), this.xref);\n      const names = nameTree.getAll();\n      for (const name in names) {\n        // We don't use most JavaScript in PDF documents. This code is\n        // defensive so we don't cause errors on document load.\n        const jsDict = names[name];\n        if (isDict(jsDict)) {\n          appendIfJavaScriptDict(jsDict);\n        }\n      }\n    }\n\n    // Append OpenAction actions to the JavaScript array.\n    const openActionDict = this.catDict.get('OpenAction');\n    if (isDict(openActionDict, 'Action')) {\n      const actionType = openActionDict.get('S');\n      if (isName(actionType, 'Named')) {\n        // The named Print action is not a part of the PDF 1.7 specification,\n        // but is supported by many PDF readers/writers (including Adobe's).\n        const action = openActionDict.get('N');\n        if (isName(action, 'Print')) {\n          if (!javaScript) {\n            javaScript = [];\n          }\n          javaScript.push('print({});');\n        }\n      } else {\n        appendIfJavaScriptDict(openActionDict);\n      }\n    }\n\n    return shadow(this, 'javaScript', javaScript);\n  }\n\n  cleanup() {\n    this.pageKidsCountCache.clear();\n\n    const promises = [];\n    this.fontCache.forEach(function(promise) {\n      promises.push(promise);\n    });\n\n    return Promise.all(promises).then((translatedFonts) => {\n      for (let i = 0, ii = translatedFonts.length; i < ii; i++) {\n        const font = translatedFonts[i].dict;\n        delete font.translated;\n      }\n      this.fontCache.clear();\n      this.builtInCMapCache.clear();\n    });\n  }\n\n  getPageDict(pageIndex) {\n    const capability = createPromiseCapability();\n    const nodesToVisit = [this.catDict.getRaw('Pages')];\n    const xref = this.xref, pageKidsCountCache = this.pageKidsCountCache;\n    let count, currentPageIndex = 0;\n\n    function next() {\n      while (nodesToVisit.length) {\n        const currentNode = nodesToVisit.pop();\n\n        if (isRef(currentNode)) {\n          count = pageKidsCountCache.get(currentNode);\n          // Skip nodes where the page can't be.\n          if (count > 0 && currentPageIndex + count < pageIndex) {\n            currentPageIndex += count;\n            continue;\n          }\n\n          xref.fetchAsync(currentNode).then(function(obj) {\n            if (isDict(obj, 'Page') || (isDict(obj) && !obj.has('Kids'))) {\n              if (pageIndex === currentPageIndex) {\n                // Cache the Page reference, since it can *greatly* improve\n                // performance by reducing redundant lookups in long documents\n                // where all nodes are found at *one* level of the tree.\n                if (currentNode && !pageKidsCountCache.has(currentNode)) {\n                  pageKidsCountCache.put(currentNode, 1);\n                }\n                capability.resolve([obj, currentNode]);\n              } else {\n                currentPageIndex++;\n                next();\n              }\n              return;\n            }\n            nodesToVisit.push(obj);\n            next();\n          }, capability.reject);\n          return;\n        }\n\n        // Must be a child page dictionary.\n        if (!isDict(currentNode)) {\n          capability.reject(new FormatError(\n            'Page dictionary kid reference points to wrong type of object.'));\n          return;\n        }\n\n        count = currentNode.get('Count');\n        if (Number.isInteger(count) && count >= 0) {\n          // Cache the Kids count, since it can reduce redundant lookups in\n          // documents where all nodes are found at *one* level of the tree.\n          const objId = currentNode.objId;\n          if (objId && !pageKidsCountCache.has(objId)) {\n            pageKidsCountCache.put(objId, count);\n          }\n          // Skip nodes where the page can't be.\n          if (currentPageIndex + count <= pageIndex) {\n            currentPageIndex += count;\n            continue;\n          }\n        }\n\n        const kids = currentNode.get('Kids');\n        if (!Array.isArray(kids)) {\n          // Prevent errors in corrupt PDF documents that violate the\n          // specification by *inlining* Page dicts directly in the Kids\n          // array, rather than using indirect objects (fixes issue9540.pdf).\n          if (isName(currentNode.get('Type'), 'Page') ||\n              (!currentNode.has('Type') && currentNode.has('Contents'))) {\n            if (currentPageIndex === pageIndex) {\n              capability.resolve([currentNode, null]);\n              return;\n            }\n            currentPageIndex++;\n            continue;\n          }\n\n          capability.reject(new FormatError(\n            'Page dictionary kids object is not an array.'));\n          return;\n        }\n\n        // Always check all `Kids` nodes, to avoid getting stuck in an empty\n        // node further down in the tree (see issue5644.pdf, issue8088.pdf),\n        // and to ensure that we actually find the correct `Page` dict.\n        for (let last = kids.length - 1; last >= 0; last--) {\n          nodesToVisit.push(kids[last]);\n        }\n      }\n      capability.reject(new Error(`Page index ${pageIndex} not found.`));\n    }\n    next();\n    return capability.promise;\n  }\n\n  getPageIndex(pageRef) {\n    // The page tree nodes have the count of all the leaves below them. To get\n    // how many pages are before we just have to walk up the tree and keep\n    // adding the count of siblings to the left of the node.\n    const xref = this.xref;\n\n    function pagesBeforeRef(kidRef) {\n      let total = 0, parentRef;\n\n      return xref.fetchAsync(kidRef).then(function(node) {\n        if (isRefsEqual(kidRef, pageRef) && !isDict(node, 'Page') &&\n            !(isDict(node) && !node.has('Type') && node.has('Contents'))) {\n          throw new FormatError(\n            'The reference does not point to a /Page dictionary.');\n        }\n        if (!node) {\n          return null;\n        }\n        if (!isDict(node)) {\n          throw new FormatError('Node must be a dictionary.');\n        }\n        parentRef = node.getRaw('Parent');\n        return node.getAsync('Parent');\n      }).then(function(parent) {\n        if (!parent) {\n          return null;\n        }\n        if (!isDict(parent)) {\n          throw new FormatError('Parent must be a dictionary.');\n        }\n        return parent.getAsync('Kids');\n      }).then(function(kids) {\n        if (!kids) {\n          return null;\n        }\n\n        const kidPromises = [];\n        let found = false;\n        for (let i = 0, ii = kids.length; i < ii; i++) {\n          const kid = kids[i];\n          if (!isRef(kid)) {\n            throw new FormatError('Kid must be a reference.');\n          }\n          if (isRefsEqual(kid, kidRef)) {\n            found = true;\n            break;\n          }\n          kidPromises.push(xref.fetchAsync(kid).then(function(kid) {\n            if (!isDict(kid)) {\n              throw new FormatError('Kid node must be a dictionary.');\n            }\n            if (kid.has('Count')) {\n              total += kid.get('Count');\n            } else { // Page leaf node.\n              total++;\n            }\n          }));\n        }\n        if (!found) {\n          throw new FormatError('Kid reference not found in parent\\'s kids.');\n        }\n        return Promise.all(kidPromises).then(function() {\n          return [total, parentRef];\n        });\n      });\n    }\n\n    let total = 0;\n    function next(ref) {\n      return pagesBeforeRef(ref).then(function(args) {\n        if (!args) {\n          return total;\n        }\n        const [count, parentRef] = args;\n        total += count;\n        return next(parentRef);\n      });\n    }\n\n    return next(pageRef);\n  }\n\n  /**\n   * @typedef ParseDestDictionaryParameters\n   * @property {Dict} destDict - The dictionary containing the destination.\n   * @property {Object} resultObj - The object where the parsed destination\n   *   properties will be placed.\n   * @property {string} docBaseUrl - (optional) The document base URL that is\n   *   used when attempting to recover valid absolute URLs from relative ones.\n   */\n\n  /**\n   * Helper function used to parse the contents of destination dictionaries.\n   * @param {ParseDestDictionaryParameters} params\n   */\n  static parseDestDictionary(params) {\n    // Lets URLs beginning with 'www.' default to using the 'http://' protocol.\n    function addDefaultProtocolToUrl(url) {\n      if (url.indexOf('www.') === 0) {\n        return `http://${url}`;\n      }\n      return url;\n    }\n\n    // According to ISO 32000-1:2008, section 12.6.4.7, URIs should be encoded\n    // in 7-bit ASCII. Some bad PDFs use UTF-8 encoding; see Bugzilla 1122280.\n    function tryConvertUrlEncoding(url) {\n      try {\n        return stringToUTF8String(url);\n      } catch (e) {\n        return url;\n      }\n    }\n\n    const destDict = params.destDict;\n    if (!isDict(destDict)) {\n      warn('parseDestDictionary: `destDict` must be a dictionary.');\n      return;\n    }\n    const resultObj = params.resultObj;\n    if (typeof resultObj !== 'object') {\n      warn('parseDestDictionary: `resultObj` must be an object.');\n      return;\n    }\n    const docBaseUrl = params.docBaseUrl || null;\n\n    let action = destDict.get('A'), url, dest;\n    if (!isDict(action) && destDict.has('Dest')) {\n      // A /Dest entry should *only* contain a Name or an Array, but some bad\n      // PDF generators ignore that and treat it as an /A entry.\n      action = destDict.get('Dest');\n    }\n\n    if (isDict(action)) {\n      const actionType = action.get('S');\n      if (!isName(actionType)) {\n        warn('parseDestDictionary: Invalid type in Action dictionary.');\n        return;\n      }\n      const actionName = actionType.name;\n\n      switch (actionName) {\n        case 'URI':\n          url = action.get('URI');\n          if (isName(url)) {\n            // Some bad PDFs do not put parentheses around relative URLs.\n            url = '/' + url.name;\n          } else if (isString(url)) {\n            url = addDefaultProtocolToUrl(url);\n          }\n          // TODO: pdf spec mentions urls can be relative to a Base\n          // entry in the dictionary.\n          break;\n\n        case 'GoTo':\n          dest = action.get('D');\n          break;\n\n        case 'Launch':\n          // We neither want, nor can, support arbitrary 'Launch' actions.\n          // However, in practice they are mostly used for linking to other PDF\n          // files, which we thus attempt to support (utilizing `docBaseUrl`).\n          /* falls through */\n\n        case 'GoToR':\n          const urlDict = action.get('F');\n          if (isDict(urlDict)) {\n            // We assume that we found a FileSpec dictionary\n            // and fetch the URL without checking any further.\n            url = urlDict.get('F') || null;\n          } else if (isString(urlDict)) {\n            url = urlDict;\n          }\n\n          // NOTE: the destination is relative to the *remote* document.\n          let remoteDest = action.get('D');\n          if (remoteDest) {\n            if (isName(remoteDest)) {\n              remoteDest = remoteDest.name;\n            }\n            if (isString(url)) {\n              const baseUrl = url.split('#')[0];\n              if (isString(remoteDest)) {\n                url = baseUrl + '#' + remoteDest;\n              } else if (Array.isArray(remoteDest)) {\n                url = baseUrl + '#' + JSON.stringify(remoteDest);\n              }\n            }\n          }\n          // The 'NewWindow' property, equal to `LinkTarget.BLANK`.\n          const newWindow = action.get('NewWindow');\n          if (isBool(newWindow)) {\n            resultObj.newWindow = newWindow;\n          }\n          break;\n\n        case 'Named':\n          const namedAction = action.get('N');\n          if (isName(namedAction)) {\n            resultObj.action = namedAction.name;\n          }\n          break;\n\n        case 'JavaScript':\n          const jsAction = action.get('JS');\n          let js;\n\n          if (isStream(jsAction)) {\n            js = bytesToString(jsAction.getBytes());\n          } else if (isString(jsAction)) {\n            js = jsAction;\n          }\n\n          if (js) {\n            // Attempt to recover valid URLs from `JS` entries with certain\n            // white-listed formats:\n            //  - window.open('http://example.com')\n            //  - app.launchURL('http://example.com', true)\n            const URL_OPEN_METHODS = [\n              'app.launchURL',\n              'window.open'\n            ];\n            const regex = new RegExp(\n              '^\\\\s*(' + URL_OPEN_METHODS.join('|').split('.').join('\\\\.') +\n              ')\\\\((?:\\'|\\\")([^\\'\\\"]*)(?:\\'|\\\")(?:,\\\\s*(\\\\w+)\\\\)|\\\\))', 'i');\n\n            const jsUrl = regex.exec(stringToPDFString(js));\n            if (jsUrl && jsUrl[2]) {\n              url = jsUrl[2];\n\n              if (jsUrl[3] === 'true' && jsUrl[1] === 'app.launchURL') {\n                resultObj.newWindow = true;\n              }\n              break;\n            }\n          }\n          /* falls through */\n        default:\n          warn(`parseDestDictionary: unsupported action type \"${actionName}\".`);\n          break;\n      }\n    } else if (destDict.has('Dest')) { // Simple destination.\n      dest = destDict.get('Dest');\n    }\n\n    if (isString(url)) {\n      url = tryConvertUrlEncoding(url);\n      const absoluteUrl = createValidAbsoluteUrl(url, docBaseUrl);\n      if (absoluteUrl) {\n        resultObj.url = absoluteUrl.href;\n      }\n      resultObj.unsafeUrl = url;\n    }\n    if (dest) {\n      if (isName(dest)) {\n        dest = dest.name;\n      }\n      if (isString(dest) || Array.isArray(dest)) {\n        resultObj.dest = dest;\n      }\n    }\n  }\n}\n\nvar XRef = (function XRefClosure() {\n  function XRef(stream, pdfManager) {\n    this.stream = stream;\n    this.pdfManager = pdfManager;\n    this.entries = [];\n    this.xrefstms = Object.create(null);\n    // prepare the XRef cache\n    this.cache = [];\n    this.stats = {\n      streamTypes: [],\n      fontTypes: [],\n    };\n  }\n\n  XRef.prototype = {\n    setStartXRef: function XRef_setStartXRef(startXRef) {\n      // Store the starting positions of xref tables as we process them\n      // so we can recover from missing data errors\n      this.startXRefQueue = [startXRef];\n    },\n\n    parse: function XRef_parse(recoveryMode) {\n      var trailerDict;\n      if (!recoveryMode) {\n        trailerDict = this.readXRef();\n      } else {\n        warn('Indexing all PDF objects');\n        trailerDict = this.indexObjects();\n      }\n      trailerDict.assignXref(this);\n      this.trailer = trailerDict;\n\n      let encrypt;\n      try {\n        encrypt = trailerDict.get('Encrypt');\n      } catch (ex) {\n        if (ex instanceof MissingDataException) {\n          throw ex;\n        }\n        warn(`XRef.parse - Invalid \"Encrypt\" reference: \"${ex}\".`);\n      }\n      if (isDict(encrypt)) {\n        var ids = trailerDict.get('ID');\n        var fileId = (ids && ids.length) ? ids[0] : '';\n        // The 'Encrypt' dictionary itself should not be encrypted, and by\n        // setting `suppressEncryption` we can prevent an infinite loop inside\n        // of `XRef_fetchUncompressed` if the dictionary contains indirect\n        // objects (fixes issue7665.pdf).\n        encrypt.suppressEncryption = true;\n        this.encrypt = new CipherTransformFactory(encrypt, fileId,\n                                                  this.pdfManager.password);\n      }\n\n      // Get the root dictionary (catalog) object, and do some basic validation.\n      let root;\n      try {\n        root = trailerDict.get('Root');\n      } catch (ex) {\n        if (ex instanceof MissingDataException) {\n          throw ex;\n        }\n        warn(`XRef.parse - Invalid \"Root\" reference: \"${ex}\".`);\n      }\n      if (isDict(root) && root.has('Pages')) {\n        this.root = root;\n      } else {\n        if (!recoveryMode) {\n          throw new XRefParseException();\n        }\n        throw new FormatError('Invalid root reference');\n      }\n    },\n\n    processXRefTable: function XRef_processXRefTable(parser) {\n      if (!('tableState' in this)) {\n        // Stores state of the table as we process it so we can resume\n        // from middle of table in case of missing data error\n        this.tableState = {\n          entryNum: 0,\n          streamPos: parser.lexer.stream.pos,\n          parserBuf1: parser.buf1,\n          parserBuf2: parser.buf2,\n        };\n      }\n\n      var obj = this.readXRefTable(parser);\n\n      // Sanity check\n      if (!isCmd(obj, 'trailer')) {\n        throw new FormatError(\n          'Invalid XRef table: could not find trailer dictionary');\n      }\n      // Read trailer dictionary, e.g.\n      // trailer\n      //    << /Size 22\n      //      /Root 20R\n      //      /Info 10R\n      //      /ID [ <81b14aafa313db63dbd6f981e49f94f4> ]\n      //    >>\n      // The parser goes through the entire stream << ... >> and provides\n      // a getter interface for the key-value table\n      var dict = parser.getObj();\n\n      // The pdflib PDF generator can generate a nested trailer dictionary\n      if (!isDict(dict) && dict.dict) {\n        dict = dict.dict;\n      }\n      if (!isDict(dict)) {\n        throw new FormatError(\n          'Invalid XRef table: could not parse trailer dictionary');\n      }\n      delete this.tableState;\n\n      return dict;\n    },\n\n    readXRefTable: function XRef_readXRefTable(parser) {\n      // Example of cross-reference table:\n      // xref\n      // 0 1                    <-- subsection header (first obj #, obj count)\n      // 0000000000 65535 f     <-- actual object (offset, generation #, f/n)\n      // 23 2                   <-- subsection header ... and so on ...\n      // 0000025518 00002 n\n      // 0000025635 00000 n\n      // trailer\n      // ...\n\n      var stream = parser.lexer.stream;\n      var tableState = this.tableState;\n      stream.pos = tableState.streamPos;\n      parser.buf1 = tableState.parserBuf1;\n      parser.buf2 = tableState.parserBuf2;\n\n      // Outer loop is over subsection headers\n      var obj;\n\n      while (true) {\n        if (!('firstEntryNum' in tableState) || !('entryCount' in tableState)) {\n          if (isCmd(obj = parser.getObj(), 'trailer')) {\n            break;\n          }\n          tableState.firstEntryNum = obj;\n          tableState.entryCount = parser.getObj();\n        }\n\n        var first = tableState.firstEntryNum;\n        var count = tableState.entryCount;\n        if (!Number.isInteger(first) || !Number.isInteger(count)) {\n          throw new FormatError(\n            'Invalid XRef table: wrong types in subsection header');\n        }\n        // Inner loop is over objects themselves\n        for (var i = tableState.entryNum; i < count; i++) {\n          tableState.streamPos = stream.pos;\n          tableState.entryNum = i;\n          tableState.parserBuf1 = parser.buf1;\n          tableState.parserBuf2 = parser.buf2;\n\n          var entry = {};\n          entry.offset = parser.getObj();\n          entry.gen = parser.getObj();\n          var type = parser.getObj();\n\n          if (isCmd(type, 'f')) {\n            entry.free = true;\n          } else if (isCmd(type, 'n')) {\n            entry.uncompressed = true;\n          }\n\n          // Validate entry obj\n          if (!Number.isInteger(entry.offset) || !Number.isInteger(entry.gen) ||\n              !(entry.free || entry.uncompressed)) {\n            throw new FormatError(\n              `Invalid entry in XRef subsection: ${first}, ${count}`);\n          }\n\n          // The first xref table entry, i.e. obj 0, should be free. Attempting\n          // to adjust an incorrect first obj # (fixes issue 3248 and 7229).\n          if (i === 0 && entry.free && first === 1) {\n            first = 0;\n          }\n\n          if (!this.entries[i + first]) {\n            this.entries[i + first] = entry;\n          }\n        }\n\n        tableState.entryNum = 0;\n        tableState.streamPos = stream.pos;\n        tableState.parserBuf1 = parser.buf1;\n        tableState.parserBuf2 = parser.buf2;\n        delete tableState.firstEntryNum;\n        delete tableState.entryCount;\n      }\n\n      // Sanity check: as per spec, first object must be free\n      if (this.entries[0] && !this.entries[0].free) {\n        throw new FormatError(\n          'Invalid XRef table: unexpected first object');\n      }\n      return obj;\n    },\n\n    processXRefStream: function XRef_processXRefStream(stream) {\n      if (!('streamState' in this)) {\n        // Stores state of the stream as we process it so we can resume\n        // from middle of stream in case of missing data error\n        var streamParameters = stream.dict;\n        var byteWidths = streamParameters.get('W');\n        var range = streamParameters.get('Index');\n        if (!range) {\n          range = [0, streamParameters.get('Size')];\n        }\n\n        this.streamState = {\n          entryRanges: range,\n          byteWidths,\n          entryNum: 0,\n          streamPos: stream.pos,\n        };\n      }\n      this.readXRefStream(stream);\n      delete this.streamState;\n\n      return stream.dict;\n    },\n\n    readXRefStream: function XRef_readXRefStream(stream) {\n      var i, j;\n      var streamState = this.streamState;\n      stream.pos = streamState.streamPos;\n\n      var byteWidths = streamState.byteWidths;\n      var typeFieldWidth = byteWidths[0];\n      var offsetFieldWidth = byteWidths[1];\n      var generationFieldWidth = byteWidths[2];\n\n      var entryRanges = streamState.entryRanges;\n      while (entryRanges.length > 0) {\n        var first = entryRanges[0];\n        var n = entryRanges[1];\n\n        if (!Number.isInteger(first) || !Number.isInteger(n)) {\n          throw new FormatError(\n            `Invalid XRef range fields: ${first}, ${n}`);\n        }\n        if (!Number.isInteger(typeFieldWidth) ||\n            !Number.isInteger(offsetFieldWidth) ||\n            !Number.isInteger(generationFieldWidth)) {\n          throw new FormatError(\n            `Invalid XRef entry fields length: ${first}, ${n}`);\n        }\n        for (i = streamState.entryNum; i < n; ++i) {\n          streamState.entryNum = i;\n          streamState.streamPos = stream.pos;\n\n          var type = 0, offset = 0, generation = 0;\n          for (j = 0; j < typeFieldWidth; ++j) {\n            type = (type << 8) | stream.getByte();\n          }\n          // if type field is absent, its default value is 1\n          if (typeFieldWidth === 0) {\n            type = 1;\n          }\n          for (j = 0; j < offsetFieldWidth; ++j) {\n            offset = (offset << 8) | stream.getByte();\n          }\n          for (j = 0; j < generationFieldWidth; ++j) {\n            generation = (generation << 8) | stream.getByte();\n          }\n          var entry = {};\n          entry.offset = offset;\n          entry.gen = generation;\n          switch (type) {\n            case 0:\n              entry.free = true;\n              break;\n            case 1:\n              entry.uncompressed = true;\n              break;\n            case 2:\n              break;\n            default:\n              throw new FormatError(`Invalid XRef entry type: ${type}`);\n          }\n          if (!this.entries[first + i]) {\n            this.entries[first + i] = entry;\n          }\n        }\n\n        streamState.entryNum = 0;\n        streamState.streamPos = stream.pos;\n        entryRanges.splice(0, 2);\n      }\n    },\n\n    indexObjects: function XRef_indexObjects() {\n      // Simple scan through the PDF content to find objects,\n      // trailers and XRef streams.\n      var TAB = 0x9, LF = 0xA, CR = 0xD, SPACE = 0x20;\n      var PERCENT = 0x25, LT = 0x3C;\n\n      function readToken(data, offset) {\n        var token = '', ch = data[offset];\n        while (ch !== LF && ch !== CR && ch !== LT) {\n          if (++offset >= data.length) {\n            break;\n          }\n          token += String.fromCharCode(ch);\n          ch = data[offset];\n        }\n        return token;\n      }\n      function skipUntil(data, offset, what) {\n        var length = what.length, dataLength = data.length;\n        var skipped = 0;\n        // finding byte sequence\n        while (offset < dataLength) {\n          var i = 0;\n          while (i < length && data[offset + i] === what[i]) {\n            ++i;\n          }\n          if (i >= length) {\n            break; // sequence found\n          }\n          offset++;\n          skipped++;\n        }\n        return skipped;\n      }\n      var objRegExp = /^(\\d+)\\s+(\\d+)\\s+obj\\b/;\n      const endobjRegExp = /\\bendobj[\\b\\s]$/;\n      const nestedObjRegExp = /\\s+(\\d+\\s+\\d+\\s+obj[\\b\\s])$/;\n      const CHECK_CONTENT_LENGTH = 25;\n\n      var trailerBytes = new Uint8Array([116, 114, 97, 105, 108, 101, 114]);\n      var startxrefBytes = new Uint8Array([115, 116, 97, 114, 116, 120, 114,\n                                          101, 102]);\n      const objBytes = new Uint8Array([111, 98, 106]);\n      var xrefBytes = new Uint8Array([47, 88, 82, 101, 102]);\n\n      // Clear out any existing entries, since they may be bogus.\n      this.entries.length = 0;\n\n      var stream = this.stream;\n      stream.pos = 0;\n      var buffer = stream.getBytes();\n      var position = stream.start, length = buffer.length;\n      var trailers = [], xrefStms = [];\n      while (position < length) {\n        var ch = buffer[position];\n        if (ch === TAB || ch === LF || ch === CR || ch === SPACE) {\n          ++position;\n          continue;\n        }\n        if (ch === PERCENT) { // %-comment\n          do {\n            ++position;\n            if (position >= length) {\n              break;\n            }\n            ch = buffer[position];\n          } while (ch !== LF && ch !== CR);\n          continue;\n        }\n        var token = readToken(buffer, position);\n        var m;\n        if (token.indexOf('xref') === 0 &&\n            (token.length === 4 || /\\s/.test(token[4]))) {\n          position += skipUntil(buffer, position, trailerBytes);\n          trailers.push(position);\n          position += skipUntil(buffer, position, startxrefBytes);\n        } else if ((m = objRegExp.exec(token))) {\n          if (typeof this.entries[m[1]] === 'undefined') {\n            this.entries[m[1]] = {\n              offset: position - stream.start,\n              gen: m[2] | 0,\n              uncompressed: true,\n            };\n          }\n          let contentLength, startPos = position + token.length;\n\n          // Find the next \"obj\" string, rather than \"endobj\", to ensure that\n          // we won't skip over a new 'obj' operator in corrupt files where\n          // 'endobj' operators are missing (fixes issue9105_reduced.pdf).\n          while (startPos < buffer.length) {\n            let endPos = startPos + skipUntil(buffer, startPos, objBytes) + 4;\n            contentLength = endPos - position;\n\n            let checkPos = Math.max(endPos - CHECK_CONTENT_LENGTH, startPos);\n            let tokenStr = bytesToString(buffer.subarray(checkPos, endPos));\n\n            // Check if the current object ends with an 'endobj' operator.\n            if (endobjRegExp.test(tokenStr)) {\n              break;\n            } else {\n              // Check if an \"obj\" occurrence is actually a new object,\n              // i.e. the current object is missing the 'endobj' operator.\n              let objToken = nestedObjRegExp.exec(tokenStr);\n\n              if (objToken && objToken[1]) {\n                warn('indexObjects: Found new \"obj\" inside of another \"obj\", ' +\n                     'caused by missing \"endobj\" -- trying to recover.');\n                contentLength -= objToken[1].length;\n                break;\n              }\n            }\n            startPos = endPos;\n          }\n          let content = buffer.subarray(position, position + contentLength);\n\n          // checking XRef stream suspect\n          // (it shall have '/XRef' and next char is not a letter)\n          var xrefTagOffset = skipUntil(content, 0, xrefBytes);\n          if (xrefTagOffset < contentLength &&\n              content[xrefTagOffset + 5] < 64) {\n            xrefStms.push(position - stream.start);\n            this.xrefstms[position - stream.start] = 1; // Avoid recursion\n          }\n\n          position += contentLength;\n        } else if (token.indexOf('trailer') === 0 &&\n                   (token.length === 7 || /\\s/.test(token[7]))) {\n          trailers.push(position);\n          position += skipUntil(buffer, position, startxrefBytes);\n        } else {\n          position += token.length + 1;\n        }\n      }\n      // reading XRef streams\n      var i, ii;\n      for (i = 0, ii = xrefStms.length; i < ii; ++i) {\n        this.startXRefQueue.push(xrefStms[i]);\n        this.readXRef(/* recoveryMode */ true);\n      }\n      // finding main trailer\n      let trailerDict;\n      for (i = 0, ii = trailers.length; i < ii; ++i) {\n        stream.pos = trailers[i];\n        var parser = new Parser(new Lexer(stream), /* allowStreams = */ true,\n                                /* xref = */ this, /* recoveryMode = */ true);\n        var obj = parser.getObj();\n        if (!isCmd(obj, 'trailer')) {\n          continue;\n        }\n        // read the trailer dictionary\n        let dict = parser.getObj();\n        if (!isDict(dict)) {\n          continue;\n        }\n        // Do some basic validation of the trailer/root dictionary candidate.\n        let rootDict;\n        try {\n          rootDict = dict.get('Root');\n        } catch (ex) {\n          if (ex instanceof MissingDataException) {\n            throw ex;\n          }\n          continue;\n        }\n        if (!isDict(rootDict) || !rootDict.has('Pages')) {\n          continue;\n        }\n        // taking the first one with 'ID'\n        if (dict.has('ID')) {\n          return dict;\n        }\n        // The current dictionary is a candidate, but continue searching.\n        trailerDict = dict;\n      }\n      // No trailer with 'ID', taking last one (if exists).\n      if (trailerDict) {\n        return trailerDict;\n      }\n      // nothing helps\n      throw new InvalidPDFException('Invalid PDF structure');\n    },\n\n    readXRef: function XRef_readXRef(recoveryMode) {\n      var stream = this.stream;\n      // Keep track of already parsed XRef tables, to prevent an infinite loop\n      // when parsing corrupt PDF files where e.g. the /Prev entries create a\n      // circular dependency between tables (fixes bug1393476.pdf).\n      let startXRefParsedCache = Object.create(null);\n\n      try {\n        while (this.startXRefQueue.length) {\n          var startXRef = this.startXRefQueue[0];\n\n          if (startXRefParsedCache[startXRef]) {\n            warn('readXRef - skipping XRef table since it was already parsed.');\n            this.startXRefQueue.shift();\n            continue;\n          }\n          startXRefParsedCache[startXRef] = true;\n\n          stream.pos = startXRef + stream.start;\n\n          var parser = new Parser(new Lexer(stream), true, this);\n          var obj = parser.getObj();\n          var dict;\n\n          // Get dictionary\n          if (isCmd(obj, 'xref')) {\n            // Parse end-of-file XRef\n            dict = this.processXRefTable(parser);\n            if (!this.topDict) {\n              this.topDict = dict;\n            }\n\n            // Recursively get other XRefs 'XRefStm', if any\n            obj = dict.get('XRefStm');\n            if (Number.isInteger(obj)) {\n              var pos = obj;\n              // ignore previously loaded xref streams\n              // (possible infinite recursion)\n              if (!(pos in this.xrefstms)) {\n                this.xrefstms[pos] = 1;\n                this.startXRefQueue.push(pos);\n              }\n            }\n          } else if (Number.isInteger(obj)) {\n            // Parse in-stream XRef\n            if (!Number.isInteger(parser.getObj()) ||\n                !isCmd(parser.getObj(), 'obj') ||\n                !isStream(obj = parser.getObj())) {\n              throw new FormatError('Invalid XRef stream');\n            }\n            dict = this.processXRefStream(obj);\n            if (!this.topDict) {\n              this.topDict = dict;\n            }\n            if (!dict) {\n              throw new FormatError('Failed to read XRef stream');\n            }\n          } else {\n            throw new FormatError('Invalid XRef stream header');\n          }\n\n          // Recursively get previous dictionary, if any\n          obj = dict.get('Prev');\n          if (Number.isInteger(obj)) {\n            this.startXRefQueue.push(obj);\n          } else if (isRef(obj)) {\n            // The spec says Prev must not be a reference, i.e. \"/Prev NNN\"\n            // This is a fallback for non-compliant PDFs, i.e. \"/Prev NNN 0 R\"\n            this.startXRefQueue.push(obj.num);\n          }\n\n          this.startXRefQueue.shift();\n        }\n\n        return this.topDict;\n      } catch (e) {\n        if (e instanceof MissingDataException) {\n          throw e;\n        }\n        info('(while reading XRef): ' + e);\n      }\n\n      if (recoveryMode) {\n        return;\n      }\n      throw new XRefParseException();\n    },\n\n    getEntry: function XRef_getEntry(i) {\n      var xrefEntry = this.entries[i];\n      if (xrefEntry && !xrefEntry.free && xrefEntry.offset) {\n        return xrefEntry;\n      }\n      return null;\n    },\n\n    fetchIfRef: function XRef_fetchIfRef(obj, suppressEncryption) {\n      if (!isRef(obj)) {\n        return obj;\n      }\n      return this.fetch(obj, suppressEncryption);\n    },\n\n    fetch: function XRef_fetch(ref, suppressEncryption) {\n      if (!isRef(ref)) {\n        throw new Error('ref object is not a reference');\n      }\n      var num = ref.num;\n      if (num in this.cache) {\n        var cacheEntry = this.cache[num];\n        // In documents with Object Streams, it's possible that cached `Dict`s\n        // have not been assigned an `objId` yet (see e.g. issue3115r.pdf).\n        if (cacheEntry instanceof Dict && !cacheEntry.objId) {\n          cacheEntry.objId = ref.toString();\n        }\n        return cacheEntry;\n      }\n\n      var xrefEntry = this.getEntry(num);\n\n      // the referenced entry can be free\n      if (xrefEntry === null) {\n        return (this.cache[num] = null);\n      }\n\n      if (xrefEntry.uncompressed) {\n        xrefEntry = this.fetchUncompressed(ref, xrefEntry, suppressEncryption);\n      } else {\n        xrefEntry = this.fetchCompressed(xrefEntry, suppressEncryption);\n      }\n      if (isDict(xrefEntry)) {\n        xrefEntry.objId = ref.toString();\n      } else if (isStream(xrefEntry)) {\n        xrefEntry.dict.objId = ref.toString();\n      }\n      return xrefEntry;\n    },\n\n    fetchUncompressed: function XRef_fetchUncompressed(ref, xrefEntry,\n                                                       suppressEncryption) {\n      var gen = ref.gen;\n      var num = ref.num;\n      if (xrefEntry.gen !== gen) {\n        throw new FormatError('inconsistent generation in XRef');\n      }\n      var stream = this.stream.makeSubStream(xrefEntry.offset +\n                                             this.stream.start);\n      var parser = new Parser(new Lexer(stream), true, this);\n      var obj1 = parser.getObj();\n      var obj2 = parser.getObj();\n      var obj3 = parser.getObj();\n\n      if (!Number.isInteger(obj1)) {\n        obj1 = parseInt(obj1, 10);\n      }\n      if (!Number.isInteger(obj2)) {\n        obj2 = parseInt(obj2, 10);\n      }\n      if (obj1 !== num || obj2 !== gen || !isCmd(obj3)) {\n        throw new FormatError('bad XRef entry');\n      }\n      if (obj3.cmd !== 'obj') {\n        // some bad PDFs use \"obj1234\" and really mean 1234\n        if (obj3.cmd.indexOf('obj') === 0) {\n          num = parseInt(obj3.cmd.substring(3), 10);\n          if (!Number.isNaN(num)) {\n            return num;\n          }\n        }\n        throw new FormatError('bad XRef entry');\n      }\n      if (this.encrypt && !suppressEncryption) {\n        xrefEntry = parser.getObj(this.encrypt.createCipherTransform(num, gen));\n      } else {\n        xrefEntry = parser.getObj();\n      }\n      if (!isStream(xrefEntry)) {\n        this.cache[num] = xrefEntry;\n      }\n      return xrefEntry;\n    },\n\n    fetchCompressed: function XRef_fetchCompressed(xrefEntry,\n                                                   suppressEncryption) {\n      var tableOffset = xrefEntry.offset;\n      var stream = this.fetch(new Ref(tableOffset, 0));\n      if (!isStream(stream)) {\n        throw new FormatError('bad ObjStm stream');\n      }\n      var first = stream.dict.get('First');\n      var n = stream.dict.get('N');\n      if (!Number.isInteger(first) || !Number.isInteger(n)) {\n        throw new FormatError(\n          'invalid first and n parameters for ObjStm stream');\n      }\n      var parser = new Parser(new Lexer(stream), false, this);\n      parser.allowStreams = true;\n      var i, entries = [], num, nums = [];\n      // read the object numbers to populate cache\n      for (i = 0; i < n; ++i) {\n        num = parser.getObj();\n        if (!Number.isInteger(num)) {\n          throw new FormatError(\n            `invalid object number in the ObjStm stream: ${num}`);\n        }\n        nums.push(num);\n        var offset = parser.getObj();\n        if (!Number.isInteger(offset)) {\n          throw new FormatError(\n            `invalid object offset in the ObjStm stream: ${offset}`);\n        }\n      }\n      // read stream objects for cache\n      for (i = 0; i < n; ++i) {\n        entries.push(parser.getObj());\n        // The ObjStm should not contain 'endobj'. If it's present, skip over it\n        // to support corrupt PDFs (fixes issue 5241, bug 898610, bug 1037816).\n        if (isCmd(parser.buf1, 'endobj')) {\n          parser.shift();\n        }\n        num = nums[i];\n        var entry = this.entries[num];\n        if (entry && entry.offset === tableOffset && entry.gen === i) {\n          this.cache[num] = entries[i];\n        }\n      }\n      xrefEntry = entries[xrefEntry.gen];\n      if (xrefEntry === undefined) {\n        throw new FormatError('bad XRef entry for compressed object');\n      }\n      return xrefEntry;\n    },\n\n    async fetchIfRefAsync(obj, suppressEncryption) {\n      if (!isRef(obj)) {\n        return obj;\n      }\n      return this.fetchAsync(obj, suppressEncryption);\n    },\n\n    async fetchAsync(ref, suppressEncryption) {\n      try {\n        return this.fetch(ref, suppressEncryption);\n      } catch (ex) {\n        if (!(ex instanceof MissingDataException)) {\n          throw ex;\n        }\n        await this.pdfManager.requestRange(ex.begin, ex.end);\n        return this.fetchAsync(ref, suppressEncryption);\n      }\n    },\n\n    getCatalogObj: function XRef_getCatalogObj() {\n      return this.root;\n    },\n  };\n\n  return XRef;\n})();\n\n/**\n * A NameTree/NumberTree is like a Dict but has some advantageous properties,\n * see the specification (7.9.6 and 7.9.7) for additional details.\n * TODO: implement all the Dict functions and make this more efficient.\n */\nclass NameOrNumberTree {\n  constructor(root, xref, type) {\n    if (this.constructor === NameOrNumberTree) {\n      unreachable('Cannot initialize NameOrNumberTree.');\n    }\n    this.root = root;\n    this.xref = xref;\n    this._type = type;\n  }\n\n  getAll() {\n    const dict = Object.create(null);\n    if (!this.root) {\n      return dict;\n    }\n    const xref = this.xref;\n    // Reading Name/Number tree.\n    const processed = new RefSet();\n    processed.put(this.root);\n    const queue = [this.root];\n    while (queue.length > 0) {\n      const obj = xref.fetchIfRef(queue.shift());\n      if (!isDict(obj)) {\n        continue;\n      }\n      if (obj.has('Kids')) {\n        const kids = obj.get('Kids');\n        for (let i = 0, ii = kids.length; i < ii; i++) {\n          const kid = kids[i];\n          if (processed.has(kid)) {\n            throw new FormatError(`Duplicate entry in \"${this._type}\" tree.`);\n          }\n          queue.push(kid);\n          processed.put(kid);\n        }\n        continue;\n      }\n      const entries = obj.get(this._type);\n      if (Array.isArray(entries)) {\n        for (let i = 0, ii = entries.length; i < ii; i += 2) {\n          dict[xref.fetchIfRef(entries[i])] = xref.fetchIfRef(entries[i + 1]);\n        }\n      }\n    }\n    return dict;\n  }\n\n  get(key) {\n    if (!this.root) {\n      return null;\n    }\n    const xref = this.xref;\n    let kidsOrEntries = xref.fetchIfRef(this.root);\n    let loopCount = 0;\n    const MAX_LEVELS = 10;\n\n    // Perform a binary search to quickly find the entry that\n    // contains the key we are looking for.\n    while (kidsOrEntries.has('Kids')) {\n      if (++loopCount > MAX_LEVELS) {\n        warn('Search depth limit reached for \"' + this._type + '\" tree.');\n        return null;\n      }\n\n      const kids = kidsOrEntries.get('Kids');\n      if (!Array.isArray(kids)) {\n        return null;\n      }\n\n      let l = 0, r = kids.length - 1;\n      while (l <= r) {\n        const m = (l + r) >> 1;\n        const kid = xref.fetchIfRef(kids[m]);\n        const limits = kid.get('Limits');\n\n        if (key < xref.fetchIfRef(limits[0])) {\n          r = m - 1;\n        } else if (key > xref.fetchIfRef(limits[1])) {\n          l = m + 1;\n        } else {\n          kidsOrEntries = xref.fetchIfRef(kids[m]);\n          break;\n        }\n      }\n      if (l > r) {\n        return null;\n      }\n    }\n\n    // If we get here, then we have found the right entry. Now go through the\n    // entries in the dictionary until we find the key we're looking for.\n    const entries = kidsOrEntries.get(this._type);\n    if (Array.isArray(entries)) {\n      // Perform a binary search to reduce the lookup time.\n      let l = 0, r = entries.length - 2;\n      while (l <= r) {\n        // Check only even indices (0, 2, 4, ...) because the\n        // odd indices contain the actual data.\n        const m = (l + r) & ~1;\n        const currentKey = xref.fetchIfRef(entries[m]);\n        if (key < currentKey) {\n          r = m - 2;\n        } else if (key > currentKey) {\n          l = m + 2;\n        } else {\n          return xref.fetchIfRef(entries[m + 1]);\n        }\n      }\n    }\n    return null;\n  }\n}\n\nclass NameTree extends NameOrNumberTree {\n  constructor(root, xref) {\n    super(root, xref, 'Names');\n  }\n}\n\nclass NumberTree extends NameOrNumberTree {\n  constructor(root, xref) {\n    super(root, xref, 'Nums');\n  }\n}\n\n/**\n * \"A PDF file can refer to the contents of another file by using a File\n * Specification (PDF 1.1)\", see the spec (7.11) for more details.\n * NOTE: Only embedded files are supported (as part of the attachments support)\n * TODO: support the 'URL' file system (with caching if !/V), portable\n * collections attributes and related files (/RF)\n */\nvar FileSpec = (function FileSpecClosure() {\n  function FileSpec(root, xref) {\n    if (!root || !isDict(root)) {\n      return;\n    }\n    this.xref = xref;\n    this.root = root;\n    if (root.has('FS')) {\n      this.fs = root.get('FS');\n    }\n    this.description = root.has('Desc') ?\n                         stringToPDFString(root.get('Desc')) :\n                         '';\n    if (root.has('RF')) {\n      warn('Related file specifications are not supported');\n    }\n    this.contentAvailable = true;\n    if (!root.has('EF')) {\n      this.contentAvailable = false;\n      warn('Non-embedded file specifications are not supported');\n    }\n  }\n\n  function pickPlatformItem(dict) {\n    // Look for the filename in this order:\n    // UF, F, Unix, Mac, DOS\n    if (dict.has('UF')) {\n      return dict.get('UF');\n    } else if (dict.has('F')) {\n      return dict.get('F');\n    } else if (dict.has('Unix')) {\n      return dict.get('Unix');\n    } else if (dict.has('Mac')) {\n      return dict.get('Mac');\n    } else if (dict.has('DOS')) {\n      return dict.get('DOS');\n    }\n    return null;\n  }\n\n  FileSpec.prototype = {\n    get filename() {\n      if (!this._filename && this.root) {\n        var filename = pickPlatformItem(this.root) || 'unnamed';\n        this._filename = stringToPDFString(filename).\n          replace(/\\\\\\\\/g, '\\\\').\n          replace(/\\\\\\//g, '/').\n          replace(/\\\\/g, '/');\n      }\n      return this._filename;\n    },\n    get content() {\n      if (!this.contentAvailable) {\n        return null;\n      }\n      if (!this.contentRef && this.root) {\n        this.contentRef = pickPlatformItem(this.root.get('EF'));\n      }\n      var content = null;\n      if (this.contentRef) {\n        var xref = this.xref;\n        var fileObj = xref.fetchIfRef(this.contentRef);\n        if (fileObj && isStream(fileObj)) {\n          content = fileObj.getBytes();\n        } else {\n          warn('Embedded file specification points to non-existing/invalid ' +\n            'content');\n        }\n      } else {\n        warn('Embedded file specification does not have a content');\n      }\n      return content;\n    },\n    get serializable() {\n      return {\n        filename: this.filename,\n        content: this.content,\n      };\n    },\n  };\n  return FileSpec;\n})();\n\n/**\n * A helper for loading missing data in `Dict` graphs. It traverses the graph\n * depth first and queues up any objects that have missing data. Once it has\n * has traversed as many objects that are available it attempts to bundle the\n * missing data requests and then resume from the nodes that weren't ready.\n *\n * NOTE: It provides protection from circular references by keeping track of\n * loaded references. However, you must be careful not to load any graphs\n * that have references to the catalog or other pages since that will cause the\n * entire PDF document object graph to be traversed.\n */\nlet ObjectLoader = (function() {\n  function mayHaveChildren(value) {\n    return isRef(value) || isDict(value) || Array.isArray(value) ||\n           isStream(value);\n  }\n\n  function addChildren(node, nodesToVisit) {\n    if (isDict(node) || isStream(node)) {\n      let dict = isDict(node) ? node : node.dict;\n      let dictKeys = dict.getKeys();\n      for (let i = 0, ii = dictKeys.length; i < ii; i++) {\n        let rawValue = dict.getRaw(dictKeys[i]);\n        if (mayHaveChildren(rawValue)) {\n          nodesToVisit.push(rawValue);\n        }\n      }\n    } else if (Array.isArray(node)) {\n      for (let i = 0, ii = node.length; i < ii; i++) {\n        let value = node[i];\n        if (mayHaveChildren(value)) {\n          nodesToVisit.push(value);\n        }\n      }\n    }\n  }\n\n  function ObjectLoader(dict, keys, xref) {\n    this.dict = dict;\n    this.keys = keys;\n    this.xref = xref;\n    this.refSet = null;\n    this.capability = null;\n  }\n\n  ObjectLoader.prototype = {\n    load() {\n      this.capability = createPromiseCapability();\n      // Don't walk the graph if all the data is already loaded.\n      if (!(this.xref.stream instanceof ChunkedStream) ||\n          this.xref.stream.getMissingChunks().length === 0) {\n        this.capability.resolve();\n        return this.capability.promise;\n      }\n\n      let { keys, dict, } = this;\n      this.refSet = new RefSet();\n      // Setup the initial nodes to visit.\n      let nodesToVisit = [];\n      for (let i = 0, ii = keys.length; i < ii; i++) {\n        let rawValue = dict.getRaw(keys[i]);\n        // Skip nodes that are guaranteed to be empty.\n        if (rawValue !== undefined) {\n          nodesToVisit.push(rawValue);\n        }\n      }\n\n      this._walk(nodesToVisit);\n      return this.capability.promise;\n    },\n\n    _walk(nodesToVisit) {\n      let nodesToRevisit = [];\n      let pendingRequests = [];\n      // DFS walk of the object graph.\n      while (nodesToVisit.length) {\n        let currentNode = nodesToVisit.pop();\n\n        // Only references or chunked streams can cause missing data exceptions.\n        if (isRef(currentNode)) {\n          // Skip nodes that have already been visited.\n          if (this.refSet.has(currentNode)) {\n            continue;\n          }\n          try {\n            this.refSet.put(currentNode);\n            currentNode = this.xref.fetch(currentNode);\n          } catch (ex) {\n            if (!(ex instanceof MissingDataException)) {\n              throw ex;\n            }\n            nodesToRevisit.push(currentNode);\n            pendingRequests.push({ begin: ex.begin, end: ex.end, });\n          }\n        }\n        if (currentNode && currentNode.getBaseStreams) {\n          let baseStreams = currentNode.getBaseStreams();\n          let foundMissingData = false;\n          for (let i = 0, ii = baseStreams.length; i < ii; i++) {\n            let stream = baseStreams[i];\n            if (stream.getMissingChunks && stream.getMissingChunks().length) {\n              foundMissingData = true;\n              pendingRequests.push({ begin: stream.start, end: stream.end, });\n            }\n          }\n          if (foundMissingData) {\n            nodesToRevisit.push(currentNode);\n          }\n        }\n\n        addChildren(currentNode, nodesToVisit);\n      }\n\n      if (pendingRequests.length) {\n        this.xref.stream.manager.requestRanges(pendingRequests).then(() => {\n          for (let i = 0, ii = nodesToRevisit.length; i < ii; i++) {\n            let node = nodesToRevisit[i];\n            // Remove any reference nodes from the current `RefSet` so they\n            // aren't skipped when we revist them.\n            if (isRef(node)) {\n              this.refSet.remove(node);\n            }\n          }\n          this._walk(nodesToRevisit);\n        }, this.capability.reject);\n        return;\n      }\n      // Everything is loaded.\n      this.refSet = null;\n      this.capability.resolve();\n    },\n  };\n\n  return ObjectLoader;\n})();\n\nexport {\n  Catalog,\n  ObjectLoader,\n  XRef,\n  FileSpec,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* uses XRef */\n\nvar EOF = {};\n\nvar Name = (function NameClosure() {\n  function Name(name) {\n    this.name = name;\n  }\n\n  Name.prototype = {};\n\n  var nameCache = Object.create(null);\n\n  Name.get = function Name_get(name) {\n    var nameValue = nameCache[name];\n    return (nameValue ? nameValue : (nameCache[name] = new Name(name)));\n  };\n\n  return Name;\n})();\n\nvar Cmd = (function CmdClosure() {\n  function Cmd(cmd) {\n    this.cmd = cmd;\n  }\n\n  Cmd.prototype = {};\n\n  var cmdCache = Object.create(null);\n\n  Cmd.get = function Cmd_get(cmd) {\n    var cmdValue = cmdCache[cmd];\n    return (cmdValue ? cmdValue : (cmdCache[cmd] = new Cmd(cmd)));\n  };\n\n  return Cmd;\n})();\n\nvar Dict = (function DictClosure() {\n  var nonSerializable = function nonSerializableClosure() {\n    return nonSerializable; // creating closure on some variable\n  };\n\n  // xref is optional\n  function Dict(xref) {\n    // Map should only be used internally, use functions below to access.\n    this._map = Object.create(null);\n    this.xref = xref;\n    this.objId = null;\n    this.suppressEncryption = false;\n    this.__nonSerializable__ = nonSerializable; // disable cloning of the Dict\n  }\n\n  Dict.prototype = {\n    assignXref: function Dict_assignXref(newXref) {\n      this.xref = newXref;\n    },\n\n    // automatically dereferences Ref objects\n    get: function Dict_get(key1, key2, key3) {\n      var value;\n      var xref = this.xref, suppressEncryption = this.suppressEncryption;\n      if (typeof (value = this._map[key1]) !== 'undefined' ||\n          key1 in this._map || typeof key2 === 'undefined') {\n        return xref ? xref.fetchIfRef(value, suppressEncryption) : value;\n      }\n      if (typeof (value = this._map[key2]) !== 'undefined' ||\n          key2 in this._map || typeof key3 === 'undefined') {\n        return xref ? xref.fetchIfRef(value, suppressEncryption) : value;\n      }\n      value = this._map[key3] || null;\n      return xref ? xref.fetchIfRef(value, suppressEncryption) : value;\n    },\n\n    // Same as get(), but returns a promise and uses fetchIfRefAsync().\n    getAsync: function Dict_getAsync(key1, key2, key3) {\n      var value;\n      var xref = this.xref, suppressEncryption = this.suppressEncryption;\n      if (typeof (value = this._map[key1]) !== 'undefined' ||\n          key1 in this._map || typeof key2 === 'undefined') {\n        if (xref) {\n          return xref.fetchIfRefAsync(value, suppressEncryption);\n        }\n        return Promise.resolve(value);\n      }\n      if (typeof (value = this._map[key2]) !== 'undefined' ||\n          key2 in this._map || typeof key3 === 'undefined') {\n        if (xref) {\n          return xref.fetchIfRefAsync(value, suppressEncryption);\n        }\n        return Promise.resolve(value);\n      }\n      value = this._map[key3] || null;\n      if (xref) {\n        return xref.fetchIfRefAsync(value, suppressEncryption);\n      }\n      return Promise.resolve(value);\n    },\n\n    // Same as get(), but dereferences all elements if the result is an Array.\n    getArray: function Dict_getArray(key1, key2, key3) {\n      var value = this.get(key1, key2, key3);\n      var xref = this.xref, suppressEncryption = this.suppressEncryption;\n      if (!Array.isArray(value) || !xref) {\n        return value;\n      }\n      value = value.slice(); // Ensure that we don't modify the Dict data.\n      for (var i = 0, ii = value.length; i < ii; i++) {\n        if (!isRef(value[i])) {\n          continue;\n        }\n        value[i] = xref.fetch(value[i], suppressEncryption);\n      }\n      return value;\n    },\n\n    // no dereferencing\n    getRaw: function Dict_getRaw(key) {\n      return this._map[key];\n    },\n\n    getKeys: function Dict_getKeys() {\n      return Object.keys(this._map);\n    },\n\n    set: function Dict_set(key, value) {\n      this._map[key] = value;\n    },\n\n    has: function Dict_has(key) {\n      return key in this._map;\n    },\n\n    forEach: function Dict_forEach(callback) {\n      for (var key in this._map) {\n        callback(key, this.get(key));\n      }\n    },\n  };\n\n  Dict.empty = new Dict(null);\n\n  Dict.merge = function(xref, dictArray) {\n    let mergedDict = new Dict(xref);\n\n    for (let i = 0, ii = dictArray.length; i < ii; i++) {\n      let dict = dictArray[i];\n      if (!isDict(dict)) {\n        continue;\n      }\n      for (let keyName in dict._map) {\n        if (mergedDict._map[keyName] !== undefined) {\n          continue;\n        }\n        mergedDict._map[keyName] = dict._map[keyName];\n      }\n    }\n    return mergedDict;\n  };\n\n  return Dict;\n})();\n\nvar Ref = (function RefClosure() {\n  function Ref(num, gen) {\n    this.num = num;\n    this.gen = gen;\n  }\n\n  Ref.prototype = {\n    toString: function Ref_toString() {\n      // This function is hot, so we make the string as compact as possible.\n      // |this.gen| is almost always zero, so we treat that case specially.\n      var str = this.num + 'R';\n      if (this.gen !== 0) {\n        str += this.gen;\n      }\n      return str;\n    },\n  };\n\n  return Ref;\n})();\n\n// The reference is identified by number and generation.\n// This structure stores only one instance of the reference.\nvar RefSet = (function RefSetClosure() {\n  function RefSet() {\n    this.dict = Object.create(null);\n  }\n\n  RefSet.prototype = {\n    has: function RefSet_has(ref) {\n      return ref.toString() in this.dict;\n    },\n\n    put: function RefSet_put(ref) {\n      this.dict[ref.toString()] = true;\n    },\n\n    remove: function RefSet_remove(ref) {\n      delete this.dict[ref.toString()];\n    },\n  };\n\n  return RefSet;\n})();\n\nvar RefSetCache = (function RefSetCacheClosure() {\n  function RefSetCache() {\n    this.dict = Object.create(null);\n  }\n\n  RefSetCache.prototype = {\n    get: function RefSetCache_get(ref) {\n      return this.dict[ref.toString()];\n    },\n\n    has: function RefSetCache_has(ref) {\n      return ref.toString() in this.dict;\n    },\n\n    put: function RefSetCache_put(ref, obj) {\n      this.dict[ref.toString()] = obj;\n    },\n\n    putAlias: function RefSetCache_putAlias(ref, aliasRef) {\n      this.dict[ref.toString()] = this.get(aliasRef);\n    },\n\n    forEach: function RefSetCache_forEach(fn, thisArg) {\n      for (var i in this.dict) {\n        fn.call(thisArg, this.dict[i]);\n      }\n    },\n\n    clear: function RefSetCache_clear() {\n      this.dict = Object.create(null);\n    },\n  };\n\n  return RefSetCache;\n})();\n\nfunction isEOF(v) {\n  return (v === EOF);\n}\n\nfunction isName(v, name) {\n  return v instanceof Name && (name === undefined || v.name === name);\n}\n\nfunction isCmd(v, cmd) {\n  return v instanceof Cmd && (cmd === undefined || v.cmd === cmd);\n}\n\nfunction isDict(v, type) {\n  return v instanceof Dict &&\n         (type === undefined || isName(v.get('Type'), type));\n}\n\nfunction isRef(v) {\n  return v instanceof Ref;\n}\n\nfunction isRefsEqual(v1, v2) {\n  return v1.num === v2.num && v1.gen === v2.gen;\n}\n\nfunction isStream(v) {\n  return typeof v === 'object' && v !== null && v.getBytes !== undefined;\n}\n\nexport {\n  EOF,\n  Cmd,\n  Dict,\n  Name,\n  Ref,\n  RefSet,\n  RefSetCache,\n  isEOF,\n  isCmd,\n  isDict,\n  isName,\n  isRef,\n  isRefsEqual,\n  isStream,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  Ascii85Stream, AsciiHexStream, FlateStream, LZWStream, NullStream,\n  PredictorStream, RunLengthStream\n} from './stream';\nimport {\n  assert, bytesToString, FormatError, info, isNum, isSpace, isString,\n  MissingDataException, StreamType, warn\n} from '../shared/util';\nimport {\n  Cmd, Dict, EOF, isCmd, isDict, isEOF, isName, Name, Ref\n} from './primitives';\nimport { CCITTFaxStream } from './ccitt_stream';\nimport { Jbig2Stream } from './jbig2_stream';\nimport { JpegStream } from './jpeg_stream';\nimport { JpxStream } from './jpx_stream';\n\nconst MAX_LENGTH_TO_CACHE = 1000;\nconst MAX_ADLER32_LENGTH = 5552;\n\nfunction computeAdler32(bytes) {\n  let bytesLength = bytes.length;\n  if (typeof PDFJSDev === 'undefined' ||\n      PDFJSDev.test('!PRODUCTION || TESTING')) {\n    assert(bytesLength < MAX_ADLER32_LENGTH,\n           'computeAdler32: Unsupported \"bytes\" length.');\n  }\n  let a = 1, b = 0;\n  for (let i = 0; i < bytesLength; ++i) {\n    // No modulo required in the loop if `bytesLength < 5552`.\n    a += bytes[i] & 0xFF;\n    b += a;\n  }\n  return ((b % 65521) << 16) | (a % 65521);\n}\n\nvar Parser = (function ParserClosure() {\n  function Parser(lexer, allowStreams, xref, recoveryMode) {\n    this.lexer = lexer;\n    this.allowStreams = allowStreams;\n    this.xref = xref;\n    this.recoveryMode = recoveryMode || false;\n    this.imageCache = Object.create(null);\n    this.refill();\n  }\n\n  Parser.prototype = {\n    refill: function Parser_refill() {\n      this.buf1 = this.lexer.getObj();\n      this.buf2 = this.lexer.getObj();\n    },\n    shift: function Parser_shift() {\n      if (isCmd(this.buf2, 'ID')) {\n        this.buf1 = this.buf2;\n        this.buf2 = null;\n      } else {\n        this.buf1 = this.buf2;\n        this.buf2 = this.lexer.getObj();\n      }\n    },\n    tryShift: function Parser_tryShift() {\n      try {\n        this.shift();\n        return true;\n      } catch (e) {\n        if (e instanceof MissingDataException) {\n          throw e;\n        }\n        // Upon failure, the caller should reset this.lexer.pos to a known good\n        // state and call this.shift() twice to reset the buffers.\n        return false;\n      }\n    },\n    getObj: function Parser_getObj(cipherTransform) {\n      var buf1 = this.buf1;\n      this.shift();\n\n      if (buf1 instanceof Cmd) {\n        switch (buf1.cmd) {\n          case 'BI': // inline image\n            return this.makeInlineImage(cipherTransform);\n          case '[': // array\n            var array = [];\n            while (!isCmd(this.buf1, ']') && !isEOF(this.buf1)) {\n              array.push(this.getObj(cipherTransform));\n            }\n            if (isEOF(this.buf1)) {\n              if (!this.recoveryMode) {\n                throw new FormatError('End of file inside array');\n              }\n              return array;\n            }\n            this.shift();\n            return array;\n          case '<<': // dictionary or stream\n            var dict = new Dict(this.xref);\n            while (!isCmd(this.buf1, '>>') && !isEOF(this.buf1)) {\n              if (!isName(this.buf1)) {\n                info('Malformed dictionary: key must be a name object');\n                this.shift();\n                continue;\n              }\n\n              var key = this.buf1.name;\n              this.shift();\n              if (isEOF(this.buf1)) {\n                break;\n              }\n              dict.set(key, this.getObj(cipherTransform));\n            }\n            if (isEOF(this.buf1)) {\n              if (!this.recoveryMode) {\n                throw new FormatError('End of file inside dictionary');\n              }\n              return dict;\n            }\n\n            // Stream objects are not allowed inside content streams or\n            // object streams.\n            if (isCmd(this.buf2, 'stream')) {\n              return (this.allowStreams ?\n                      this.makeStream(dict, cipherTransform) : dict);\n            }\n            this.shift();\n            return dict;\n          default: // simple object\n            return buf1;\n        }\n      }\n\n      if (Number.isInteger(buf1)) { // indirect reference or integer\n        var num = buf1;\n        if (Number.isInteger(this.buf1) && isCmd(this.buf2, 'R')) {\n          var ref = new Ref(num, this.buf1);\n          this.shift();\n          this.shift();\n          return ref;\n        }\n        return num;\n      }\n\n      if (isString(buf1)) { // string\n        var str = buf1;\n        if (cipherTransform) {\n          str = cipherTransform.decryptString(str);\n        }\n        return str;\n      }\n\n      // simple object\n      return buf1;\n    },\n    /**\n     * Find the end of the stream by searching for the /EI\\s/.\n     * @returns {number} The inline stream length.\n     */\n    findDefaultInlineStreamEnd(stream) {\n      const E = 0x45, I = 0x49, SPACE = 0x20, LF = 0xA, CR = 0xD;\n      const n = 10, NUL = 0x0;\n      let startPos = stream.pos, state = 0, ch, maybeEIPos;\n      while ((ch = stream.getByte()) !== -1) {\n        if (state === 0) {\n          state = (ch === E) ? 1 : 0;\n        } else if (state === 1) {\n          state = (ch === I) ? 2 : 0;\n        } else {\n          assert(state === 2);\n          if (ch === SPACE || ch === LF || ch === CR) {\n            maybeEIPos = stream.pos;\n            // Let's check that the next `n` bytes are ASCII... just to be sure.\n            let followingBytes = stream.peekBytes(n);\n            for (let i = 0, ii = followingBytes.length; i < ii; i++) {\n              ch = followingBytes[i];\n              if (ch === NUL && followingBytes[i + 1] !== NUL) {\n                // NUL bytes are not supposed to occur *outside* of inline\n                // images, but some PDF generators violate that assumption,\n                // thus breaking the EI detection heuristics used below.\n                //\n                // However, we can't unconditionally treat NUL bytes as \"ASCII\",\n                // since that *could* result in inline images being truncated.\n                //\n                // To attempt to address this, we'll still treat any *sequence*\n                // of NUL bytes as non-ASCII, but for a *single* NUL byte we'll\n                // continue checking the `followingBytes` (fixes issue8823.pdf).\n                continue;\n              }\n              if (ch !== LF && ch !== CR && (ch < SPACE || ch > 0x7F)) {\n                // Not a LF, CR, SPACE or any visible ASCII character, i.e.\n                // it's binary stuff. Resetting the state.\n                state = 0;\n                break;\n              }\n            }\n            if (state === 2) {\n              break;  // Finished!\n            }\n          } else {\n            state = 0;\n          }\n        }\n      }\n\n      if (ch === -1) {\n        warn('findDefaultInlineStreamEnd: ' +\n             'Reached the end of the stream without finding a valid EI marker');\n        if (maybeEIPos) {\n          warn('... trying to recover by using the last \"EI\" occurrence.');\n          stream.skip(-(stream.pos - maybeEIPos)); // Reset the stream position.\n        }\n      }\n      return ((stream.pos - 4) - startPos);\n    },\n    /**\n     * Find the EOI (end-of-image) marker 0xFFD9 of the stream.\n     * @returns {number} The inline stream length.\n     */\n    findDCTDecodeInlineStreamEnd:\n        function Parser_findDCTDecodeInlineStreamEnd(stream) {\n      var startPos = stream.pos, foundEOI = false, b, markerLength, length;\n      while ((b = stream.getByte()) !== -1) {\n        if (b !== 0xFF) { // Not a valid marker.\n          continue;\n        }\n        switch (stream.getByte()) {\n          case 0x00: // Byte stuffing.\n            // 0xFF00 appears to be a very common byte sequence in JPEG images.\n            break;\n\n          case 0xFF: // Fill byte.\n            // Avoid skipping a valid marker, resetting the stream position.\n            stream.skip(-1);\n            break;\n\n          case 0xD9: // EOI\n            foundEOI = true;\n            break;\n\n          case 0xC0: // SOF0\n          case 0xC1: // SOF1\n          case 0xC2: // SOF2\n          case 0xC3: // SOF3\n            /* falls through */\n          case 0xC5: // SOF5\n          case 0xC6: // SOF6\n          case 0xC7: // SOF7\n            /* falls through */\n          case 0xC9: // SOF9\n          case 0xCA: // SOF10\n          case 0xCB: // SOF11\n            /* falls through */\n          case 0xCD: // SOF13\n          case 0xCE: // SOF14\n          case 0xCF: // SOF15\n            /* falls through */\n          case 0xC4: // DHT\n          case 0xCC: // DAC\n            /* falls through */\n          case 0xDA: // SOS\n          case 0xDB: // DQT\n          case 0xDC: // DNL\n          case 0xDD: // DRI\n          case 0xDE: // DHP\n          case 0xDF: // EXP\n            /* falls through */\n          case 0xE0: // APP0\n          case 0xE1: // APP1\n          case 0xE2: // APP2\n          case 0xE3: // APP3\n          case 0xE4: // APP4\n          case 0xE5: // APP5\n          case 0xE6: // APP6\n          case 0xE7: // APP7\n          case 0xE8: // APP8\n          case 0xE9: // APP9\n          case 0xEA: // APP10\n          case 0xEB: // APP11\n          case 0xEC: // APP12\n          case 0xED: // APP13\n          case 0xEE: // APP14\n          case 0xEF: // APP15\n            /* falls through */\n          case 0xFE: // COM\n            // The marker should be followed by the length of the segment.\n            markerLength = stream.getUint16();\n            if (markerLength > 2) {\n              // |markerLength| contains the byte length of the marker segment,\n              // including its own length (2 bytes) and excluding the marker.\n              stream.skip(markerLength - 2); // Jump to the next marker.\n            } else {\n              // The marker length is invalid, resetting the stream position.\n              stream.skip(-2);\n            }\n            break;\n        }\n        if (foundEOI) {\n          break;\n        }\n      }\n      length = stream.pos - startPos;\n      if (b === -1) {\n        warn('Inline DCTDecode image stream: ' +\n             'EOI marker not found, searching for /EI/ instead.');\n        stream.skip(-length); // Reset the stream position.\n        return this.findDefaultInlineStreamEnd(stream);\n      }\n      this.inlineStreamSkipEI(stream);\n      return length;\n    },\n    /**\n     * Find the EOD (end-of-data) marker '~>' (i.e. TILDE + GT) of the stream.\n     * @returns {number} The inline stream length.\n     */\n    findASCII85DecodeInlineStreamEnd:\n        function Parser_findASCII85DecodeInlineStreamEnd(stream) {\n      var TILDE = 0x7E, GT = 0x3E;\n      var startPos = stream.pos, ch, length;\n      while ((ch = stream.getByte()) !== -1) {\n        if (ch === TILDE && stream.peekByte() === GT) {\n          stream.skip();\n          break;\n        }\n      }\n      length = stream.pos - startPos;\n      if (ch === -1) {\n        warn('Inline ASCII85Decode image stream: ' +\n             'EOD marker not found, searching for /EI/ instead.');\n        stream.skip(-length); // Reset the stream position.\n        return this.findDefaultInlineStreamEnd(stream);\n      }\n      this.inlineStreamSkipEI(stream);\n      return length;\n    },\n    /**\n     * Find the EOD (end-of-data) marker '>' (i.e. GT) of the stream.\n     * @returns {number} The inline stream length.\n     */\n    findASCIIHexDecodeInlineStreamEnd:\n        function Parser_findASCIIHexDecodeInlineStreamEnd(stream) {\n      var GT = 0x3E;\n      var startPos = stream.pos, ch, length;\n      while ((ch = stream.getByte()) !== -1) {\n        if (ch === GT) {\n          break;\n        }\n      }\n      length = stream.pos - startPos;\n      if (ch === -1) {\n        warn('Inline ASCIIHexDecode image stream: ' +\n             'EOD marker not found, searching for /EI/ instead.');\n        stream.skip(-length); // Reset the stream position.\n        return this.findDefaultInlineStreamEnd(stream);\n      }\n      this.inlineStreamSkipEI(stream);\n      return length;\n    },\n    /**\n     * Skip over the /EI/ for streams where we search for an EOD marker.\n     */\n    inlineStreamSkipEI: function Parser_inlineStreamSkipEI(stream) {\n      var E = 0x45, I = 0x49;\n      var state = 0, ch;\n      while ((ch = stream.getByte()) !== -1) {\n        if (state === 0) {\n          state = (ch === E) ? 1 : 0;\n        } else if (state === 1) {\n          state = (ch === I) ? 2 : 0;\n        } else if (state === 2) {\n          break;\n        }\n      }\n    },\n    makeInlineImage: function Parser_makeInlineImage(cipherTransform) {\n      var lexer = this.lexer;\n      var stream = lexer.stream;\n\n      // Parse dictionary.\n      let dict = new Dict(this.xref), dictLength;\n      while (!isCmd(this.buf1, 'ID') && !isEOF(this.buf1)) {\n        if (!isName(this.buf1)) {\n          throw new FormatError('Dictionary key must be a name object');\n        }\n        var key = this.buf1.name;\n        this.shift();\n        if (isEOF(this.buf1)) {\n          break;\n        }\n        dict.set(key, this.getObj(cipherTransform));\n      }\n      if (lexer.beginInlineImagePos !== -1) {\n        dictLength = stream.pos - lexer.beginInlineImagePos;\n      }\n\n      // Extract the name of the first (i.e. the current) image filter.\n      var filter = dict.get('Filter', 'F'), filterName;\n      if (isName(filter)) {\n        filterName = filter.name;\n      } else if (Array.isArray(filter)) {\n        var filterZero = this.xref.fetchIfRef(filter[0]);\n        if (isName(filterZero)) {\n          filterName = filterZero.name;\n        }\n      }\n\n      // Parse image stream.\n      let startPos = stream.pos, length;\n      if (filterName === 'DCTDecode' || filterName === 'DCT') {\n        length = this.findDCTDecodeInlineStreamEnd(stream);\n      } else if (filterName === 'ASCII85Decode' || filterName === 'A85') {\n        length = this.findASCII85DecodeInlineStreamEnd(stream);\n      } else if (filterName === 'ASCIIHexDecode' || filterName === 'AHx') {\n        length = this.findASCIIHexDecodeInlineStreamEnd(stream);\n      } else {\n        length = this.findDefaultInlineStreamEnd(stream);\n      }\n      var imageStream = stream.makeSubStream(startPos, length, dict);\n\n      // Cache all images below the MAX_LENGTH_TO_CACHE threshold by their\n      // adler32 checksum.\n      let cacheKey;\n      if (length < MAX_LENGTH_TO_CACHE && dictLength < MAX_ADLER32_LENGTH) {\n        var imageBytes = imageStream.getBytes();\n        imageStream.reset();\n\n        const initialStreamPos = stream.pos;\n        // Set the stream position to the beginning of the dictionary data...\n        stream.pos = lexer.beginInlineImagePos;\n        // ... and fetch the bytes of the *entire* dictionary.\n        let dictBytes = stream.getBytes(dictLength);\n        // Finally, don't forget to reset the stream position.\n        stream.pos = initialStreamPos;\n\n        cacheKey = computeAdler32(imageBytes) + '_' + computeAdler32(dictBytes);\n\n        let cacheEntry = this.imageCache[cacheKey];\n        if (cacheEntry !== undefined) {\n          this.buf2 = Cmd.get('EI');\n          this.shift();\n\n          cacheEntry.reset();\n          return cacheEntry;\n        }\n      }\n\n      if (cipherTransform) {\n        imageStream = cipherTransform.createStream(imageStream, length);\n      }\n\n      imageStream = this.filter(imageStream, dict, length);\n      imageStream.dict = dict;\n      if (cacheKey !== undefined) {\n        imageStream.cacheKey = 'inline_' + length + '_' + cacheKey;\n        this.imageCache[cacheKey] = imageStream;\n      }\n\n      this.buf2 = Cmd.get('EI');\n      this.shift();\n\n      return imageStream;\n    },\n\n    _findStreamLength(startPos, signature) {\n      const { stream, } = this.lexer;\n      stream.pos = startPos;\n\n      const SCAN_BLOCK_LENGTH = 2048;\n      const signatureLength = signature.length;\n\n      while (stream.pos < stream.end) {\n        const scanBytes = stream.peekBytes(SCAN_BLOCK_LENGTH);\n        const scanLength = scanBytes.length - signatureLength;\n\n        if (scanLength <= 0) {\n          break;\n        }\n        let pos = 0;\n        while (pos < scanLength) {\n          let j = 0;\n          while (j < signatureLength && scanBytes[pos + j] === signature[j]) {\n            j++;\n          }\n          if (j >= signatureLength) { // `signature` found.\n            stream.pos += pos;\n            return (stream.pos - startPos);\n          }\n          pos++;\n        }\n        stream.pos += scanLength;\n      }\n      return -1;\n    },\n\n    makeStream: function Parser_makeStream(dict, cipherTransform) {\n      var lexer = this.lexer;\n      var stream = lexer.stream;\n\n      // get stream start position\n      lexer.skipToNextLine();\n      const startPos = stream.pos - 1;\n\n      // get length\n      var length = dict.get('Length');\n      if (!Number.isInteger(length)) {\n        info('Bad ' + length + ' attribute in stream');\n        length = 0;\n      }\n\n      // skip over the stream data\n      stream.pos = startPos + length;\n      lexer.nextChar();\n\n      // Shift '>>' and check whether the new object marks the end of the stream\n      if (this.tryShift() && isCmd(this.buf2, 'endstream')) {\n        this.shift(); // 'stream'\n      } else {\n        // Bad stream length, scanning for endstream command.\n        const ENDSTREAM_SIGNATURE = new Uint8Array([\n          0x65, 0x6E, 0x64, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6D]);\n        let actualLength = this._findStreamLength(startPos,\n                                                  ENDSTREAM_SIGNATURE);\n        if (actualLength < 0) {\n          // Only allow limited truncation of the endstream signature,\n          // to prevent false positives.\n          const MAX_TRUNCATION = 1;\n          // Check if the PDF generator included truncated endstream commands,\n          // such as e.g. \"endstrea\" (fixes issue10004.pdf).\n          for (let i = 1; i <= MAX_TRUNCATION; i++) {\n            const end = ENDSTREAM_SIGNATURE.length - i;\n            const TRUNCATED_SIGNATURE = ENDSTREAM_SIGNATURE.slice(0, end);\n\n            let maybeLength = this._findStreamLength(startPos,\n                                                     TRUNCATED_SIGNATURE);\n            if (maybeLength >= 0) {\n              // Ensure that the byte immediately following the truncated\n              // endstream command is a space, to prevent false positives.\n              const lastByte = stream.peekBytes(end + 1)[end];\n              if (!isSpace(lastByte)) {\n                break;\n              }\n              info(`Found \"${bytesToString(TRUNCATED_SIGNATURE)}\" when ` +\n                   'searching for endstream command.');\n              actualLength = maybeLength;\n              break;\n            }\n          }\n\n          if (actualLength < 0) {\n            throw new FormatError('Missing endstream command.');\n          }\n        }\n        length = actualLength;\n\n        lexer.nextChar();\n        this.shift();\n        this.shift();\n      }\n      this.shift(); // 'endstream'\n\n      stream = stream.makeSubStream(startPos, length, dict);\n      if (cipherTransform) {\n        stream = cipherTransform.createStream(stream, length);\n      }\n      stream = this.filter(stream, dict, length);\n      stream.dict = dict;\n      return stream;\n    },\n    filter: function Parser_filter(stream, dict, length) {\n      var filter = dict.get('Filter', 'F');\n      var params = dict.get('DecodeParms', 'DP');\n      if (isName(filter)) {\n        if (Array.isArray(params)) {\n          warn('/DecodeParms should not contain an Array, ' +\n               'when /Filter contains a Name.');\n        }\n        return this.makeFilter(stream, filter.name, length, params);\n      }\n\n      var maybeLength = length;\n      if (Array.isArray(filter)) {\n        var filterArray = filter;\n        var paramsArray = params;\n        for (var i = 0, ii = filterArray.length; i < ii; ++i) {\n          filter = this.xref.fetchIfRef(filterArray[i]);\n          if (!isName(filter)) {\n            throw new FormatError('Bad filter name: ' + filter);\n          }\n\n          params = null;\n          if (Array.isArray(paramsArray) && (i in paramsArray)) {\n            params = this.xref.fetchIfRef(paramsArray[i]);\n          }\n          stream = this.makeFilter(stream, filter.name, maybeLength, params);\n          // after the first stream the length variable is invalid\n          maybeLength = null;\n        }\n      }\n      return stream;\n    },\n    makeFilter: function Parser_makeFilter(stream, name, maybeLength, params) {\n      // Since the 'Length' entry in the stream dictionary can be completely\n      // wrong, e.g. zero for non-empty streams, only skip parsing the stream\n      // when we can be absolutely certain that it actually is empty.\n      if (maybeLength === 0) {\n        warn('Empty \"' + name + '\" stream.');\n        return new NullStream();\n      }\n      try {\n        var xrefStreamStats = this.xref.stats.streamTypes;\n        if (name === 'FlateDecode' || name === 'Fl') {\n          xrefStreamStats[StreamType.FLATE] = true;\n          if (params) {\n            return new PredictorStream(new FlateStream(stream, maybeLength),\n                                       maybeLength, params);\n          }\n          return new FlateStream(stream, maybeLength);\n        }\n        if (name === 'LZWDecode' || name === 'LZW') {\n          xrefStreamStats[StreamType.LZW] = true;\n          var earlyChange = 1;\n          if (params) {\n            if (params.has('EarlyChange')) {\n              earlyChange = params.get('EarlyChange');\n            }\n            return new PredictorStream(\n              new LZWStream(stream, maybeLength, earlyChange),\n              maybeLength, params);\n          }\n          return new LZWStream(stream, maybeLength, earlyChange);\n        }\n        if (name === 'DCTDecode' || name === 'DCT') {\n          xrefStreamStats[StreamType.DCT] = true;\n          return new JpegStream(stream, maybeLength, stream.dict, params);\n        }\n        if (name === 'JPXDecode' || name === 'JPX') {\n          xrefStreamStats[StreamType.JPX] = true;\n          return new JpxStream(stream, maybeLength, stream.dict, params);\n        }\n        if (name === 'ASCII85Decode' || name === 'A85') {\n          xrefStreamStats[StreamType.A85] = true;\n          return new Ascii85Stream(stream, maybeLength);\n        }\n        if (name === 'ASCIIHexDecode' || name === 'AHx') {\n          xrefStreamStats[StreamType.AHX] = true;\n          return new AsciiHexStream(stream, maybeLength);\n        }\n        if (name === 'CCITTFaxDecode' || name === 'CCF') {\n          xrefStreamStats[StreamType.CCF] = true;\n          return new CCITTFaxStream(stream, maybeLength, params);\n        }\n        if (name === 'RunLengthDecode' || name === 'RL') {\n          xrefStreamStats[StreamType.RL] = true;\n          return new RunLengthStream(stream, maybeLength);\n        }\n        if (name === 'JBIG2Decode') {\n          xrefStreamStats[StreamType.JBIG] = true;\n          return new Jbig2Stream(stream, maybeLength, stream.dict, params);\n        }\n        warn('filter \"' + name + '\" not supported yet');\n        return stream;\n      } catch (ex) {\n        if (ex instanceof MissingDataException) {\n          throw ex;\n        }\n        warn('Invalid stream: \\\"' + ex + '\\\"');\n        return new NullStream();\n      }\n    },\n  };\n\n  return Parser;\n})();\n\nvar Lexer = (function LexerClosure() {\n  function Lexer(stream, knownCommands) {\n    this.stream = stream;\n    this.nextChar();\n\n    // While lexing, we build up many strings one char at a time. Using += for\n    // this can result in lots of garbage strings. It's better to build an\n    // array of single-char strings and then join() them together at the end.\n    // And reusing a single array (i.e. |this.strBuf|) over and over for this\n    // purpose uses less memory than using a new array for each string.\n    this.strBuf = [];\n\n    // The PDFs might have \"glued\" commands with other commands, operands or\n    // literals, e.g. \"q1\". The knownCommands is a dictionary of the valid\n    // commands and their prefixes. The prefixes are built the following way:\n    // if there a command that is a prefix of the other valid command or\n    // literal (e.g. 'f' and 'false') the following prefixes must be included,\n    // 'fa', 'fal', 'fals'. The prefixes are not needed, if the command has no\n    // other commands or literals as a prefix. The knowCommands is optional.\n    this.knownCommands = knownCommands;\n\n    this.beginInlineImagePos = -1;\n  }\n\n  // A '1' in this array means the character is white space. A '1' or\n  // '2' means the character ends a name or command.\n  var specialChars = [\n    1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, // 0x\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x\n    1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, // 2x\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, // 3x\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 4x\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 5x\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 6x\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 7x\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ax\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // bx\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // cx\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // dx\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ex\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0  // fx\n  ];\n\n  function toHexDigit(ch) {\n    if (ch >= 0x30 && ch <= 0x39) { // '0'-'9'\n      return ch & 0x0F;\n    }\n    if ((ch >= 0x41 && ch <= 0x46) || (ch >= 0x61 && ch <= 0x66)) {\n      // 'A'-'F', 'a'-'f'\n      return (ch & 0x0F) + 9;\n    }\n    return -1;\n  }\n\n  Lexer.prototype = {\n    nextChar: function Lexer_nextChar() {\n      return (this.currentChar = this.stream.getByte());\n    },\n    peekChar: function Lexer_peekChar() {\n      return this.stream.peekByte();\n    },\n    getNumber: function Lexer_getNumber() {\n      var ch = this.currentChar;\n      var eNotation = false;\n      var divideBy = 0; // different from 0 if it's a floating point value\n      var sign = 0;\n\n      if (ch === 0x2D) { // '-'\n        sign = -1;\n        ch = this.nextChar();\n\n        if (ch === 0x2D) { // '-'\n          // Ignore double negative (this is consistent with Adobe Reader).\n          ch = this.nextChar();\n        }\n      } else if (ch === 0x2B) { // '+'\n        sign = 1;\n        ch = this.nextChar();\n      }\n      if (ch === 0x0A || ch === 0x0D) { // LF, CR\n        // Ignore line-breaks (this is consistent with Adobe Reader).\n        do {\n          ch = this.nextChar();\n        } while (ch === 0x0A || ch === 0x0D);\n      }\n      if (ch === 0x2E) { // '.'\n        divideBy = 10;\n        ch = this.nextChar();\n      }\n      if (ch < 0x30 || ch > 0x39) { // '0' - '9'\n        if (divideBy === 10 && sign === 0 &&\n            (isSpace(ch) || ch === /* EOF = */ -1)) {\n          // This is consistent with Adobe Reader (fixes issue9252.pdf).\n          warn('Lexer.getNumber - treating a single decimal point as zero.');\n          return 0;\n        }\n        throw new FormatError(\n          `Invalid number: ${String.fromCharCode(ch)} (charCode ${ch})`);\n      }\n\n      sign = sign || 1;\n      var baseValue = ch - 0x30; // '0'\n      var powerValue = 0;\n      var powerValueSign = 1;\n\n      while ((ch = this.nextChar()) >= 0) {\n        if (0x30 <= ch && ch <= 0x39) { // '0' - '9'\n          var currentDigit = ch - 0x30; // '0'\n          if (eNotation) { // We are after an 'e' or 'E'\n            powerValue = powerValue * 10 + currentDigit;\n          } else {\n            if (divideBy !== 0) { // We are after a point\n              divideBy *= 10;\n            }\n            baseValue = baseValue * 10 + currentDigit;\n          }\n        } else if (ch === 0x2E) { // '.'\n          if (divideBy === 0) {\n            divideBy = 1;\n          } else {\n            // A number can have only one '.'\n            break;\n          }\n        } else if (ch === 0x2D) { // '-'\n          // ignore minus signs in the middle of numbers to match\n          // Adobe's behavior\n          warn('Badly formatted number');\n        } else if (ch === 0x45 || ch === 0x65) { // 'E', 'e'\n          // 'E' can be either a scientific notation or the beginning of a new\n          // operator\n          ch = this.peekChar();\n          if (ch === 0x2B || ch === 0x2D) { // '+', '-'\n            powerValueSign = (ch === 0x2D) ? -1 : 1;\n            this.nextChar(); // Consume the sign character\n          } else if (ch < 0x30 || ch > 0x39) { // '0' - '9'\n            // The 'E' must be the beginning of a new operator\n            break;\n          }\n          eNotation = true;\n        } else {\n          // the last character doesn't belong to us\n          break;\n        }\n      }\n\n      if (divideBy !== 0) {\n        baseValue /= divideBy;\n      }\n      if (eNotation) {\n        baseValue *= Math.pow(10, powerValueSign * powerValue);\n      }\n      return sign * baseValue;\n    },\n    getString: function Lexer_getString() {\n      var numParen = 1;\n      var done = false;\n      var strBuf = this.strBuf;\n      strBuf.length = 0;\n\n      var ch = this.nextChar();\n      while (true) {\n        var charBuffered = false;\n        switch (ch | 0) {\n          case -1:\n            warn('Unterminated string');\n            done = true;\n            break;\n          case 0x28: // '('\n            ++numParen;\n            strBuf.push('(');\n            break;\n          case 0x29: // ')'\n            if (--numParen === 0) {\n              this.nextChar(); // consume strings ')'\n              done = true;\n            } else {\n              strBuf.push(')');\n            }\n            break;\n          case 0x5C: // '\\\\'\n            ch = this.nextChar();\n            switch (ch) {\n              case -1:\n                warn('Unterminated string');\n                done = true;\n                break;\n              case 0x6E: // 'n'\n                strBuf.push('\\n');\n                break;\n              case 0x72: // 'r'\n                strBuf.push('\\r');\n                break;\n              case 0x74: // 't'\n                strBuf.push('\\t');\n                break;\n              case 0x62: // 'b'\n                strBuf.push('\\b');\n                break;\n              case 0x66: // 'f'\n                strBuf.push('\\f');\n                break;\n              case 0x5C: // '\\'\n              case 0x28: // '('\n              case 0x29: // ')'\n                strBuf.push(String.fromCharCode(ch));\n                break;\n              case 0x30: case 0x31: case 0x32: case 0x33: // '0'-'3'\n              case 0x34: case 0x35: case 0x36: case 0x37: // '4'-'7'\n                var x = ch & 0x0F;\n                ch = this.nextChar();\n                charBuffered = true;\n                if (ch >= 0x30 && ch <= 0x37) { // '0'-'7'\n                  x = (x << 3) + (ch & 0x0F);\n                  ch = this.nextChar();\n                  if (ch >= 0x30 && ch <= 0x37) {  // '0'-'7'\n                    charBuffered = false;\n                    x = (x << 3) + (ch & 0x0F);\n                  }\n                }\n                strBuf.push(String.fromCharCode(x));\n                break;\n              case 0x0D: // CR\n                if (this.peekChar() === 0x0A) { // LF\n                  this.nextChar();\n                }\n                break;\n              case 0x0A: // LF\n                break;\n              default:\n                strBuf.push(String.fromCharCode(ch));\n                break;\n            }\n            break;\n          default:\n            strBuf.push(String.fromCharCode(ch));\n            break;\n        }\n        if (done) {\n          break;\n        }\n        if (!charBuffered) {\n          ch = this.nextChar();\n        }\n      }\n      return strBuf.join('');\n    },\n    getName: function Lexer_getName() {\n      var ch, previousCh;\n      var strBuf = this.strBuf;\n      strBuf.length = 0;\n      while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) {\n        if (ch === 0x23) { // '#'\n          ch = this.nextChar();\n          if (specialChars[ch]) {\n            warn('Lexer_getName: ' +\n                 'NUMBER SIGN (#) should be followed by a hexadecimal number.');\n            strBuf.push('#');\n            break;\n          }\n          var x = toHexDigit(ch);\n          if (x !== -1) {\n            previousCh = ch;\n            ch = this.nextChar();\n            var x2 = toHexDigit(ch);\n            if (x2 === -1) {\n              warn('Lexer_getName: Illegal digit (' +\n                   String.fromCharCode(ch) + ') in hexadecimal number.');\n              strBuf.push('#', String.fromCharCode(previousCh));\n              if (specialChars[ch]) {\n                break;\n              }\n              strBuf.push(String.fromCharCode(ch));\n              continue;\n            }\n            strBuf.push(String.fromCharCode((x << 4) | x2));\n          } else {\n            strBuf.push('#', String.fromCharCode(ch));\n          }\n        } else {\n          strBuf.push(String.fromCharCode(ch));\n        }\n      }\n      if (strBuf.length > 127) {\n        warn('name token is longer than allowed by the spec: ' + strBuf.length);\n      }\n      return Name.get(strBuf.join(''));\n    },\n    getHexString: function Lexer_getHexString() {\n      var strBuf = this.strBuf;\n      strBuf.length = 0;\n      var ch = this.currentChar;\n      var isFirstHex = true;\n      var firstDigit;\n      var secondDigit;\n      while (true) {\n        if (ch < 0) {\n          warn('Unterminated hex string');\n          break;\n        } else if (ch === 0x3E) { // '>'\n          this.nextChar();\n          break;\n        } else if (specialChars[ch] === 1) {\n          ch = this.nextChar();\n          continue;\n        } else {\n          if (isFirstHex) {\n            firstDigit = toHexDigit(ch);\n            if (firstDigit === -1) {\n              warn('Ignoring invalid character \"' + ch + '\" in hex string');\n              ch = this.nextChar();\n              continue;\n            }\n          } else {\n            secondDigit = toHexDigit(ch);\n            if (secondDigit === -1) {\n              warn('Ignoring invalid character \"' + ch + '\" in hex string');\n              ch = this.nextChar();\n              continue;\n            }\n            strBuf.push(String.fromCharCode((firstDigit << 4) | secondDigit));\n          }\n          isFirstHex = !isFirstHex;\n          ch = this.nextChar();\n        }\n      }\n      return strBuf.join('');\n    },\n    getObj: function Lexer_getObj() {\n      // skip whitespace and comments\n      var comment = false;\n      var ch = this.currentChar;\n      while (true) {\n        if (ch < 0) {\n          return EOF;\n        }\n        if (comment) {\n          if (ch === 0x0A || ch === 0x0D) { // LF, CR\n            comment = false;\n          }\n        } else if (ch === 0x25) { // '%'\n          comment = true;\n        } else if (specialChars[ch] !== 1) {\n          break;\n        }\n        ch = this.nextChar();\n      }\n\n      // start reading token\n      switch (ch | 0) {\n        case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: // '0'-'4'\n        case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: // '5'-'9'\n        case 0x2B: case 0x2D: case 0x2E: // '+', '-', '.'\n          return this.getNumber();\n        case 0x28: // '('\n          return this.getString();\n        case 0x2F: // '/'\n          return this.getName();\n        // array punctuation\n        case 0x5B: // '['\n          this.nextChar();\n          return Cmd.get('[');\n        case 0x5D: // ']'\n          this.nextChar();\n          return Cmd.get(']');\n        // hex string or dict punctuation\n        case 0x3C: // '<'\n          ch = this.nextChar();\n          if (ch === 0x3C) {\n            // dict punctuation\n            this.nextChar();\n            return Cmd.get('<<');\n          }\n          return this.getHexString();\n        // dict punctuation\n        case 0x3E: // '>'\n          ch = this.nextChar();\n          if (ch === 0x3E) {\n            this.nextChar();\n            return Cmd.get('>>');\n          }\n          return Cmd.get('>');\n        case 0x7B: // '{'\n          this.nextChar();\n          return Cmd.get('{');\n        case 0x7D: // '}'\n          this.nextChar();\n          return Cmd.get('}');\n        case 0x29: // ')'\n          // Consume the current character in order to avoid permanently hanging\n          // the worker thread if `Lexer.getObject` is called from within a loop\n          // containing try-catch statements, since we would otherwise attempt\n          // to parse the *same* character over and over (fixes issue8061.pdf).\n          this.nextChar();\n          throw new FormatError(`Illegal character: ${ch}`);\n      }\n\n      // command\n      var str = String.fromCharCode(ch);\n      var knownCommands = this.knownCommands;\n      var knownCommandFound = knownCommands && knownCommands[str] !== undefined;\n      while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) {\n        // stop if known command is found and next character does not make\n        // the str a command\n        var possibleCommand = str + String.fromCharCode(ch);\n        if (knownCommandFound && knownCommands[possibleCommand] === undefined) {\n          break;\n        }\n        if (str.length === 128) {\n          throw new FormatError(`Command token too long: ${str.length}`);\n        }\n        str = possibleCommand;\n        knownCommandFound = knownCommands && knownCommands[str] !== undefined;\n      }\n      if (str === 'true') {\n        return true;\n      }\n      if (str === 'false') {\n        return false;\n      }\n      if (str === 'null') {\n        return null;\n      }\n\n      if (str === 'BI') {\n        // Keep track of the current stream position, since it's needed in order\n        // to correctly cache inline images; see `Parser.makeInlineImage`.\n        this.beginInlineImagePos = this.stream.pos;\n      }\n\n      return Cmd.get(str);\n    },\n    skipToNextLine: function Lexer_skipToNextLine() {\n      var ch = this.currentChar;\n      while (ch >= 0) {\n        if (ch === 0x0D) { // CR\n          ch = this.nextChar();\n          if (ch === 0x0A) { // LF\n            this.nextChar();\n          }\n          break;\n        } else if (ch === 0x0A) { // LF\n          this.nextChar();\n          break;\n        }\n        ch = this.nextChar();\n      }\n    },\n  };\n\n  return Lexer;\n})();\n\nvar Linearization = {\n  create: function LinearizationCreate(stream) {\n    function getInt(name, allowZeroValue) {\n      var obj = linDict.get(name);\n      if (Number.isInteger(obj) && (allowZeroValue ? obj >= 0 : obj > 0)) {\n        return obj;\n      }\n      throw new Error('The \"' + name + '\" parameter in the linearization ' +\n                      'dictionary is invalid.');\n    }\n    function getHints() {\n      var hints = linDict.get('H'), hintsLength, item;\n      if (Array.isArray(hints) &&\n          ((hintsLength = hints.length) === 2 || hintsLength === 4)) {\n        for (var index = 0; index < hintsLength; index++) {\n          if (!(Number.isInteger(item = hints[index]) && item > 0)) {\n            throw new Error('Hint (' + index +\n                            ') in the linearization dictionary is invalid.');\n          }\n        }\n        return hints;\n      }\n      throw new Error('Hint array in the linearization dictionary is invalid.');\n    }\n    var parser = new Parser(new Lexer(stream), false, null);\n    var obj1 = parser.getObj();\n    var obj2 = parser.getObj();\n    var obj3 = parser.getObj();\n    var linDict = parser.getObj();\n    var obj, length;\n    if (!(Number.isInteger(obj1) && Number.isInteger(obj2) &&\n          isCmd(obj3, 'obj') && isDict(linDict) &&\n          isNum(obj = linDict.get('Linearized')) && obj > 0)) {\n      return null; // No valid linearization dictionary found.\n    } else if ((length = getInt('L')) !== stream.length) {\n      throw new Error('The \"L\" parameter in the linearization dictionary ' +\n                      'does not equal the stream length.');\n    }\n    return {\n      length,\n      hints: getHints(),\n      objectNumberFirst: getInt('O'),\n      endFirst: getInt('E'),\n      numPages: getInt('N'),\n      mainXRefEntriesOffset: getInt('T'),\n      pageFirst: (linDict.has('P') ? getInt('P', true) : 0),\n    };\n  },\n};\n\nexport {\n  Lexer,\n  Linearization,\n  Parser,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* Copyright 1996-2003 Glyph & Cog, LLC\n *\n * The flate stream implementation contained in this file is a JavaScript port\n * of XPDF's implementation, made available under the Apache 2.0 open source\n * license.\n */\n\nimport { FormatError, isSpace, stringToBytes } from '../shared/util';\nimport { isDict } from './primitives';\n\nvar Stream = (function StreamClosure() {\n  function Stream(arrayBuffer, start, length, dict) {\n    this.bytes = (arrayBuffer instanceof Uint8Array ?\n                  arrayBuffer : new Uint8Array(arrayBuffer));\n    this.start = start || 0;\n    this.pos = this.start;\n    this.end = (start + length) || this.bytes.length;\n    this.dict = dict;\n  }\n\n  // required methods for a stream. if a particular stream does not\n  // implement these, an error should be thrown\n  Stream.prototype = {\n    get length() {\n      return this.end - this.start;\n    },\n    get isEmpty() {\n      return this.length === 0;\n    },\n    getByte: function Stream_getByte() {\n      if (this.pos >= this.end) {\n        return -1;\n      }\n      return this.bytes[this.pos++];\n    },\n    getUint16: function Stream_getUint16() {\n      var b0 = this.getByte();\n      var b1 = this.getByte();\n      if (b0 === -1 || b1 === -1) {\n        return -1;\n      }\n      return (b0 << 8) + b1;\n    },\n    getInt32: function Stream_getInt32() {\n      var b0 = this.getByte();\n      var b1 = this.getByte();\n      var b2 = this.getByte();\n      var b3 = this.getByte();\n      return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;\n    },\n    // Returns subarray of original buffer, should only be read.\n    getBytes(length, forceClamped = false) {\n      var bytes = this.bytes;\n      var pos = this.pos;\n      var strEnd = this.end;\n\n      if (!length) {\n        let subarray = bytes.subarray(pos, strEnd);\n        // `this.bytes` is always a `Uint8Array` here.\n        return (forceClamped ? new Uint8ClampedArray(subarray) : subarray);\n      }\n      var end = pos + length;\n      if (end > strEnd) {\n        end = strEnd;\n      }\n      this.pos = end;\n      let subarray = bytes.subarray(pos, end);\n      // `this.bytes` is always a `Uint8Array` here.\n      return (forceClamped ? new Uint8ClampedArray(subarray) : subarray);\n    },\n    peekByte: function Stream_peekByte() {\n      var peekedByte = this.getByte();\n      this.pos--;\n      return peekedByte;\n    },\n    peekBytes(length, forceClamped = false) {\n      var bytes = this.getBytes(length, forceClamped);\n      this.pos -= bytes.length;\n      return bytes;\n    },\n    skip: function Stream_skip(n) {\n      if (!n) {\n        n = 1;\n      }\n      this.pos += n;\n    },\n    reset: function Stream_reset() {\n      this.pos = this.start;\n    },\n    moveStart: function Stream_moveStart() {\n      this.start = this.pos;\n    },\n    makeSubStream: function Stream_makeSubStream(start, length, dict) {\n      return new Stream(this.bytes.buffer, start, length, dict);\n    },\n  };\n\n  return Stream;\n})();\n\nvar StringStream = (function StringStreamClosure() {\n  function StringStream(str) {\n    let bytes = stringToBytes(str);\n    Stream.call(this, bytes);\n  }\n\n  StringStream.prototype = Stream.prototype;\n\n  return StringStream;\n})();\n\n// super class for the decoding streams\nvar DecodeStream = (function DecodeStreamClosure() {\n  // Lots of DecodeStreams are created whose buffers are never used.  For these\n  // we share a single empty buffer. This is (a) space-efficient and (b) avoids\n  // having special cases that would be required if we used |null| for an empty\n  // buffer.\n  var emptyBuffer = new Uint8Array(0);\n\n  function DecodeStream(maybeMinBufferLength) {\n    this._rawMinBufferLength = maybeMinBufferLength || 0;\n\n    this.pos = 0;\n    this.bufferLength = 0;\n    this.eof = false;\n    this.buffer = emptyBuffer;\n    this.minBufferLength = 512;\n    if (maybeMinBufferLength) {\n      // Compute the first power of two that is as big as maybeMinBufferLength.\n      while (this.minBufferLength < maybeMinBufferLength) {\n        this.minBufferLength *= 2;\n      }\n    }\n  }\n\n  DecodeStream.prototype = {\n    get isEmpty() {\n      while (!this.eof && this.bufferLength === 0) {\n        this.readBlock();\n      }\n      return this.bufferLength === 0;\n    },\n    ensureBuffer: function DecodeStream_ensureBuffer(requested) {\n      var buffer = this.buffer;\n      if (requested <= buffer.byteLength) {\n        return buffer;\n      }\n      var size = this.minBufferLength;\n      while (size < requested) {\n        size *= 2;\n      }\n      var buffer2 = new Uint8Array(size);\n      buffer2.set(buffer);\n      return (this.buffer = buffer2);\n    },\n    getByte: function DecodeStream_getByte() {\n      var pos = this.pos;\n      while (this.bufferLength <= pos) {\n        if (this.eof) {\n          return -1;\n        }\n        this.readBlock();\n      }\n      return this.buffer[this.pos++];\n    },\n    getUint16: function DecodeStream_getUint16() {\n      var b0 = this.getByte();\n      var b1 = this.getByte();\n      if (b0 === -1 || b1 === -1) {\n        return -1;\n      }\n      return (b0 << 8) + b1;\n    },\n    getInt32: function DecodeStream_getInt32() {\n      var b0 = this.getByte();\n      var b1 = this.getByte();\n      var b2 = this.getByte();\n      var b3 = this.getByte();\n      return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;\n    },\n    getBytes(length, forceClamped = false) {\n      var end, pos = this.pos;\n\n      if (length) {\n        this.ensureBuffer(pos + length);\n        end = pos + length;\n\n        while (!this.eof && this.bufferLength < end) {\n          this.readBlock();\n        }\n        var bufEnd = this.bufferLength;\n        if (end > bufEnd) {\n          end = bufEnd;\n        }\n      } else {\n        while (!this.eof) {\n          this.readBlock();\n        }\n        end = this.bufferLength;\n      }\n\n      this.pos = end;\n      let subarray = this.buffer.subarray(pos, end);\n      // `this.buffer` is either a `Uint8Array` or `Uint8ClampedArray` here.\n      return (forceClamped && !(subarray instanceof Uint8ClampedArray) ?\n              new Uint8ClampedArray(subarray) : subarray);\n    },\n    peekByte: function DecodeStream_peekByte() {\n      var peekedByte = this.getByte();\n      this.pos--;\n      return peekedByte;\n    },\n    peekBytes(length, forceClamped = false) {\n      var bytes = this.getBytes(length, forceClamped);\n      this.pos -= bytes.length;\n      return bytes;\n    },\n    makeSubStream: function DecodeStream_makeSubStream(start, length, dict) {\n      var end = start + length;\n      while (this.bufferLength <= end && !this.eof) {\n        this.readBlock();\n      }\n      return new Stream(this.buffer, start, length, dict);\n    },\n    skip: function DecodeStream_skip(n) {\n      if (!n) {\n        n = 1;\n      }\n      this.pos += n;\n    },\n    reset: function DecodeStream_reset() {\n      this.pos = 0;\n    },\n    getBaseStreams: function DecodeStream_getBaseStreams() {\n      if (this.str && this.str.getBaseStreams) {\n        return this.str.getBaseStreams();\n      }\n      return [];\n    },\n  };\n\n  return DecodeStream;\n})();\n\nvar StreamsSequenceStream = (function StreamsSequenceStreamClosure() {\n  function StreamsSequenceStream(streams) {\n    this.streams = streams;\n\n    let maybeLength = 0;\n    for (let i = 0, ii = streams.length; i < ii; i++) {\n      const stream = streams[i];\n      if (stream instanceof DecodeStream) {\n        maybeLength += stream._rawMinBufferLength;\n      } else {\n        maybeLength += stream.length;\n      }\n    }\n    DecodeStream.call(this, maybeLength);\n  }\n\n  StreamsSequenceStream.prototype = Object.create(DecodeStream.prototype);\n\n  StreamsSequenceStream.prototype.readBlock =\n      function streamSequenceStreamReadBlock() {\n\n    var streams = this.streams;\n    if (streams.length === 0) {\n      this.eof = true;\n      return;\n    }\n    var stream = streams.shift();\n    var chunk = stream.getBytes();\n    var bufferLength = this.bufferLength;\n    var newLength = bufferLength + chunk.length;\n    var buffer = this.ensureBuffer(newLength);\n    buffer.set(chunk, bufferLength);\n    this.bufferLength = newLength;\n  };\n\n  StreamsSequenceStream.prototype.getBaseStreams =\n    function StreamsSequenceStream_getBaseStreams() {\n\n    var baseStreams = [];\n    for (var i = 0, ii = this.streams.length; i < ii; i++) {\n      var stream = this.streams[i];\n      if (stream.getBaseStreams) {\n        baseStreams.push(...stream.getBaseStreams());\n      }\n    }\n    return baseStreams;\n  };\n\n  return StreamsSequenceStream;\n})();\n\nvar FlateStream = (function FlateStreamClosure() {\n  var codeLenCodeMap = new Int32Array([\n    16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15\n  ]);\n\n  var lengthDecode = new Int32Array([\n    0x00003, 0x00004, 0x00005, 0x00006, 0x00007, 0x00008, 0x00009, 0x0000a,\n    0x1000b, 0x1000d, 0x1000f, 0x10011, 0x20013, 0x20017, 0x2001b, 0x2001f,\n    0x30023, 0x3002b, 0x30033, 0x3003b, 0x40043, 0x40053, 0x40063, 0x40073,\n    0x50083, 0x500a3, 0x500c3, 0x500e3, 0x00102, 0x00102, 0x00102\n  ]);\n\n  var distDecode = new Int32Array([\n    0x00001, 0x00002, 0x00003, 0x00004, 0x10005, 0x10007, 0x20009, 0x2000d,\n    0x30011, 0x30019, 0x40021, 0x40031, 0x50041, 0x50061, 0x60081, 0x600c1,\n    0x70101, 0x70181, 0x80201, 0x80301, 0x90401, 0x90601, 0xa0801, 0xa0c01,\n    0xb1001, 0xb1801, 0xc2001, 0xc3001, 0xd4001, 0xd6001\n  ]);\n\n  var fixedLitCodeTab = [new Int32Array([\n    0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c0,\n    0x70108, 0x80060, 0x80020, 0x900a0, 0x80000, 0x80080, 0x80040, 0x900e0,\n    0x70104, 0x80058, 0x80018, 0x90090, 0x70114, 0x80078, 0x80038, 0x900d0,\n    0x7010c, 0x80068, 0x80028, 0x900b0, 0x80008, 0x80088, 0x80048, 0x900f0,\n    0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c8,\n    0x7010a, 0x80064, 0x80024, 0x900a8, 0x80004, 0x80084, 0x80044, 0x900e8,\n    0x70106, 0x8005c, 0x8001c, 0x90098, 0x70116, 0x8007c, 0x8003c, 0x900d8,\n    0x7010e, 0x8006c, 0x8002c, 0x900b8, 0x8000c, 0x8008c, 0x8004c, 0x900f8,\n    0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c4,\n    0x70109, 0x80062, 0x80022, 0x900a4, 0x80002, 0x80082, 0x80042, 0x900e4,\n    0x70105, 0x8005a, 0x8001a, 0x90094, 0x70115, 0x8007a, 0x8003a, 0x900d4,\n    0x7010d, 0x8006a, 0x8002a, 0x900b4, 0x8000a, 0x8008a, 0x8004a, 0x900f4,\n    0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cc,\n    0x7010b, 0x80066, 0x80026, 0x900ac, 0x80006, 0x80086, 0x80046, 0x900ec,\n    0x70107, 0x8005e, 0x8001e, 0x9009c, 0x70117, 0x8007e, 0x8003e, 0x900dc,\n    0x7010f, 0x8006e, 0x8002e, 0x900bc, 0x8000e, 0x8008e, 0x8004e, 0x900fc,\n    0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c2,\n    0x70108, 0x80061, 0x80021, 0x900a2, 0x80001, 0x80081, 0x80041, 0x900e2,\n    0x70104, 0x80059, 0x80019, 0x90092, 0x70114, 0x80079, 0x80039, 0x900d2,\n    0x7010c, 0x80069, 0x80029, 0x900b2, 0x80009, 0x80089, 0x80049, 0x900f2,\n    0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900ca,\n    0x7010a, 0x80065, 0x80025, 0x900aa, 0x80005, 0x80085, 0x80045, 0x900ea,\n    0x70106, 0x8005d, 0x8001d, 0x9009a, 0x70116, 0x8007d, 0x8003d, 0x900da,\n    0x7010e, 0x8006d, 0x8002d, 0x900ba, 0x8000d, 0x8008d, 0x8004d, 0x900fa,\n    0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c6,\n    0x70109, 0x80063, 0x80023, 0x900a6, 0x80003, 0x80083, 0x80043, 0x900e6,\n    0x70105, 0x8005b, 0x8001b, 0x90096, 0x70115, 0x8007b, 0x8003b, 0x900d6,\n    0x7010d, 0x8006b, 0x8002b, 0x900b6, 0x8000b, 0x8008b, 0x8004b, 0x900f6,\n    0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900ce,\n    0x7010b, 0x80067, 0x80027, 0x900ae, 0x80007, 0x80087, 0x80047, 0x900ee,\n    0x70107, 0x8005f, 0x8001f, 0x9009e, 0x70117, 0x8007f, 0x8003f, 0x900de,\n    0x7010f, 0x8006f, 0x8002f, 0x900be, 0x8000f, 0x8008f, 0x8004f, 0x900fe,\n    0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c1,\n    0x70108, 0x80060, 0x80020, 0x900a1, 0x80000, 0x80080, 0x80040, 0x900e1,\n    0x70104, 0x80058, 0x80018, 0x90091, 0x70114, 0x80078, 0x80038, 0x900d1,\n    0x7010c, 0x80068, 0x80028, 0x900b1, 0x80008, 0x80088, 0x80048, 0x900f1,\n    0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c9,\n    0x7010a, 0x80064, 0x80024, 0x900a9, 0x80004, 0x80084, 0x80044, 0x900e9,\n    0x70106, 0x8005c, 0x8001c, 0x90099, 0x70116, 0x8007c, 0x8003c, 0x900d9,\n    0x7010e, 0x8006c, 0x8002c, 0x900b9, 0x8000c, 0x8008c, 0x8004c, 0x900f9,\n    0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c5,\n    0x70109, 0x80062, 0x80022, 0x900a5, 0x80002, 0x80082, 0x80042, 0x900e5,\n    0x70105, 0x8005a, 0x8001a, 0x90095, 0x70115, 0x8007a, 0x8003a, 0x900d5,\n    0x7010d, 0x8006a, 0x8002a, 0x900b5, 0x8000a, 0x8008a, 0x8004a, 0x900f5,\n    0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cd,\n    0x7010b, 0x80066, 0x80026, 0x900ad, 0x80006, 0x80086, 0x80046, 0x900ed,\n    0x70107, 0x8005e, 0x8001e, 0x9009d, 0x70117, 0x8007e, 0x8003e, 0x900dd,\n    0x7010f, 0x8006e, 0x8002e, 0x900bd, 0x8000e, 0x8008e, 0x8004e, 0x900fd,\n    0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c3,\n    0x70108, 0x80061, 0x80021, 0x900a3, 0x80001, 0x80081, 0x80041, 0x900e3,\n    0x70104, 0x80059, 0x80019, 0x90093, 0x70114, 0x80079, 0x80039, 0x900d3,\n    0x7010c, 0x80069, 0x80029, 0x900b3, 0x80009, 0x80089, 0x80049, 0x900f3,\n    0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900cb,\n    0x7010a, 0x80065, 0x80025, 0x900ab, 0x80005, 0x80085, 0x80045, 0x900eb,\n    0x70106, 0x8005d, 0x8001d, 0x9009b, 0x70116, 0x8007d, 0x8003d, 0x900db,\n    0x7010e, 0x8006d, 0x8002d, 0x900bb, 0x8000d, 0x8008d, 0x8004d, 0x900fb,\n    0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c7,\n    0x70109, 0x80063, 0x80023, 0x900a7, 0x80003, 0x80083, 0x80043, 0x900e7,\n    0x70105, 0x8005b, 0x8001b, 0x90097, 0x70115, 0x8007b, 0x8003b, 0x900d7,\n    0x7010d, 0x8006b, 0x8002b, 0x900b7, 0x8000b, 0x8008b, 0x8004b, 0x900f7,\n    0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900cf,\n    0x7010b, 0x80067, 0x80027, 0x900af, 0x80007, 0x80087, 0x80047, 0x900ef,\n    0x70107, 0x8005f, 0x8001f, 0x9009f, 0x70117, 0x8007f, 0x8003f, 0x900df,\n    0x7010f, 0x8006f, 0x8002f, 0x900bf, 0x8000f, 0x8008f, 0x8004f, 0x900ff\n  ]), 9];\n\n  var fixedDistCodeTab = [new Int32Array([\n    0x50000, 0x50010, 0x50008, 0x50018, 0x50004, 0x50014, 0x5000c, 0x5001c,\n    0x50002, 0x50012, 0x5000a, 0x5001a, 0x50006, 0x50016, 0x5000e, 0x00000,\n    0x50001, 0x50011, 0x50009, 0x50019, 0x50005, 0x50015, 0x5000d, 0x5001d,\n    0x50003, 0x50013, 0x5000b, 0x5001b, 0x50007, 0x50017, 0x5000f, 0x00000\n  ]), 5];\n\n  function FlateStream(str, maybeLength) {\n    this.str = str;\n    this.dict = str.dict;\n\n    var cmf = str.getByte();\n    var flg = str.getByte();\n    if (cmf === -1 || flg === -1) {\n      throw new FormatError(\n        `Invalid header in flate stream: ${cmf}, ${flg}`);\n    }\n    if ((cmf & 0x0f) !== 0x08) {\n      throw new FormatError(\n        `Unknown compression method in flate stream: ${cmf}, ${flg}`);\n    }\n    if ((((cmf << 8) + flg) % 31) !== 0) {\n      throw new FormatError(`Bad FCHECK in flate stream: ${cmf}, ${flg}`);\n    }\n    if (flg & 0x20) {\n      throw new FormatError(\n        `FDICT bit set in flate stream: ${cmf}, ${flg}`);\n    }\n\n    this.codeSize = 0;\n    this.codeBuf = 0;\n\n    DecodeStream.call(this, maybeLength);\n  }\n\n  FlateStream.prototype = Object.create(DecodeStream.prototype);\n\n  FlateStream.prototype.getBits = function FlateStream_getBits(bits) {\n    var str = this.str;\n    var codeSize = this.codeSize;\n    var codeBuf = this.codeBuf;\n\n    var b;\n    while (codeSize < bits) {\n      if ((b = str.getByte()) === -1) {\n        throw new FormatError('Bad encoding in flate stream');\n      }\n      codeBuf |= b << codeSize;\n      codeSize += 8;\n    }\n    b = codeBuf & ((1 << bits) - 1);\n    this.codeBuf = codeBuf >> bits;\n    this.codeSize = codeSize -= bits;\n\n    return b;\n  };\n\n  FlateStream.prototype.getCode = function FlateStream_getCode(table) {\n    var str = this.str;\n    var codes = table[0];\n    var maxLen = table[1];\n    var codeSize = this.codeSize;\n    var codeBuf = this.codeBuf;\n\n    var b;\n    while (codeSize < maxLen) {\n      if ((b = str.getByte()) === -1) {\n        // premature end of stream. code might however still be valid.\n        // codeSize < codeLen check below guards against incomplete codeVal.\n        break;\n      }\n      codeBuf |= (b << codeSize);\n      codeSize += 8;\n    }\n    var code = codes[codeBuf & ((1 << maxLen) - 1)];\n    var codeLen = code >> 16;\n    var codeVal = code & 0xffff;\n    if (codeLen < 1 || codeSize < codeLen) {\n      throw new FormatError('Bad encoding in flate stream');\n    }\n    this.codeBuf = (codeBuf >> codeLen);\n    this.codeSize = (codeSize - codeLen);\n    return codeVal;\n  };\n\n  FlateStream.prototype.generateHuffmanTable =\n      function flateStreamGenerateHuffmanTable(lengths) {\n    var n = lengths.length;\n\n    // find max code length\n    var maxLen = 0;\n    var i;\n    for (i = 0; i < n; ++i) {\n      if (lengths[i] > maxLen) {\n        maxLen = lengths[i];\n      }\n    }\n\n    // build the table\n    var size = 1 << maxLen;\n    var codes = new Int32Array(size);\n    for (var len = 1, code = 0, skip = 2;\n         len <= maxLen;\n         ++len, code <<= 1, skip <<= 1) {\n      for (var val = 0; val < n; ++val) {\n        if (lengths[val] === len) {\n          // bit-reverse the code\n          var code2 = 0;\n          var t = code;\n          for (i = 0; i < len; ++i) {\n            code2 = (code2 << 1) | (t & 1);\n            t >>= 1;\n          }\n\n          // fill the table entries\n          for (i = code2; i < size; i += skip) {\n            codes[i] = (len << 16) | val;\n          }\n          ++code;\n        }\n      }\n    }\n\n    return [codes, maxLen];\n  };\n\n  FlateStream.prototype.readBlock = function FlateStream_readBlock() {\n    var buffer, len;\n    var str = this.str;\n    // read block header\n    var hdr = this.getBits(3);\n    if (hdr & 1) {\n      this.eof = true;\n    }\n    hdr >>= 1;\n\n    if (hdr === 0) { // uncompressed block\n      var b;\n\n      if ((b = str.getByte()) === -1) {\n        throw new FormatError('Bad block header in flate stream');\n      }\n      var blockLen = b;\n      if ((b = str.getByte()) === -1) {\n        throw new FormatError('Bad block header in flate stream');\n      }\n      blockLen |= (b << 8);\n      if ((b = str.getByte()) === -1) {\n        throw new FormatError('Bad block header in flate stream');\n      }\n      var check = b;\n      if ((b = str.getByte()) === -1) {\n        throw new FormatError('Bad block header in flate stream');\n      }\n      check |= (b << 8);\n      if (check !== (~blockLen & 0xffff) &&\n          (blockLen !== 0 || check !== 0)) {\n        // Ignoring error for bad \"empty\" block (see issue 1277)\n        throw new FormatError(\n          'Bad uncompressed block length in flate stream');\n      }\n\n      this.codeBuf = 0;\n      this.codeSize = 0;\n\n      var bufferLength = this.bufferLength;\n      buffer = this.ensureBuffer(bufferLength + blockLen);\n      var end = bufferLength + blockLen;\n      this.bufferLength = end;\n      if (blockLen === 0) {\n        if (str.peekByte() === -1) {\n          this.eof = true;\n        }\n      } else {\n        for (var n = bufferLength; n < end; ++n) {\n          if ((b = str.getByte()) === -1) {\n            this.eof = true;\n            break;\n          }\n          buffer[n] = b;\n        }\n      }\n      return;\n    }\n\n    var litCodeTable;\n    var distCodeTable;\n    if (hdr === 1) { // compressed block, fixed codes\n      litCodeTable = fixedLitCodeTab;\n      distCodeTable = fixedDistCodeTab;\n    } else if (hdr === 2) { // compressed block, dynamic codes\n      var numLitCodes = this.getBits(5) + 257;\n      var numDistCodes = this.getBits(5) + 1;\n      var numCodeLenCodes = this.getBits(4) + 4;\n\n      // build the code lengths code table\n      var codeLenCodeLengths = new Uint8Array(codeLenCodeMap.length);\n\n      var i;\n      for (i = 0; i < numCodeLenCodes; ++i) {\n        codeLenCodeLengths[codeLenCodeMap[i]] = this.getBits(3);\n      }\n      var codeLenCodeTab = this.generateHuffmanTable(codeLenCodeLengths);\n\n      // build the literal and distance code tables\n      len = 0;\n      i = 0;\n      var codes = numLitCodes + numDistCodes;\n      var codeLengths = new Uint8Array(codes);\n      var bitsLength, bitsOffset, what;\n      while (i < codes) {\n        var code = this.getCode(codeLenCodeTab);\n        if (code === 16) {\n          bitsLength = 2; bitsOffset = 3; what = len;\n        } else if (code === 17) {\n          bitsLength = 3; bitsOffset = 3; what = (len = 0);\n        } else if (code === 18) {\n          bitsLength = 7; bitsOffset = 11; what = (len = 0);\n        } else {\n          codeLengths[i++] = len = code;\n          continue;\n        }\n\n        var repeatLength = this.getBits(bitsLength) + bitsOffset;\n        while (repeatLength-- > 0) {\n          codeLengths[i++] = what;\n        }\n      }\n\n      litCodeTable =\n        this.generateHuffmanTable(codeLengths.subarray(0, numLitCodes));\n      distCodeTable =\n        this.generateHuffmanTable(codeLengths.subarray(numLitCodes, codes));\n    } else {\n      throw new FormatError('Unknown block type in flate stream');\n    }\n\n    buffer = this.buffer;\n    var limit = buffer ? buffer.length : 0;\n    var pos = this.bufferLength;\n    while (true) {\n      var code1 = this.getCode(litCodeTable);\n      if (code1 < 256) {\n        if (pos + 1 >= limit) {\n          buffer = this.ensureBuffer(pos + 1);\n          limit = buffer.length;\n        }\n        buffer[pos++] = code1;\n        continue;\n      }\n      if (code1 === 256) {\n        this.bufferLength = pos;\n        return;\n      }\n      code1 -= 257;\n      code1 = lengthDecode[code1];\n      var code2 = code1 >> 16;\n      if (code2 > 0) {\n        code2 = this.getBits(code2);\n      }\n      len = (code1 & 0xffff) + code2;\n      code1 = this.getCode(distCodeTable);\n      code1 = distDecode[code1];\n      code2 = code1 >> 16;\n      if (code2 > 0) {\n        code2 = this.getBits(code2);\n      }\n      var dist = (code1 & 0xffff) + code2;\n      if (pos + len >= limit) {\n        buffer = this.ensureBuffer(pos + len);\n        limit = buffer.length;\n      }\n      for (var k = 0; k < len; ++k, ++pos) {\n        buffer[pos] = buffer[pos - dist];\n      }\n    }\n  };\n\n  return FlateStream;\n})();\n\nvar PredictorStream = (function PredictorStreamClosure() {\n  function PredictorStream(str, maybeLength, params) {\n    if (!isDict(params)) {\n      return str; // no prediction\n    }\n    var predictor = this.predictor = params.get('Predictor') || 1;\n\n    if (predictor <= 1) {\n      return str; // no prediction\n    }\n    if (predictor !== 2 && (predictor < 10 || predictor > 15)) {\n      throw new FormatError(`Unsupported predictor: ${predictor}`);\n    }\n\n    if (predictor === 2) {\n      this.readBlock = this.readBlockTiff;\n    } else {\n      this.readBlock = this.readBlockPng;\n    }\n\n    this.str = str;\n    this.dict = str.dict;\n\n    var colors = this.colors = params.get('Colors') || 1;\n    var bits = this.bits = params.get('BitsPerComponent') || 8;\n    var columns = this.columns = params.get('Columns') || 1;\n\n    this.pixBytes = (colors * bits + 7) >> 3;\n    this.rowBytes = (columns * colors * bits + 7) >> 3;\n\n    DecodeStream.call(this, maybeLength);\n    return this;\n  }\n\n  PredictorStream.prototype = Object.create(DecodeStream.prototype);\n\n  PredictorStream.prototype.readBlockTiff =\n      function predictorStreamReadBlockTiff() {\n    var rowBytes = this.rowBytes;\n\n    var bufferLength = this.bufferLength;\n    var buffer = this.ensureBuffer(bufferLength + rowBytes);\n\n    var bits = this.bits;\n    var colors = this.colors;\n\n    var rawBytes = this.str.getBytes(rowBytes);\n    this.eof = !rawBytes.length;\n    if (this.eof) {\n      return;\n    }\n\n    var inbuf = 0, outbuf = 0;\n    var inbits = 0, outbits = 0;\n    var pos = bufferLength;\n    var i;\n\n    if (bits === 1 && colors === 1) {\n      // Optimized version of the loop in the \"else\"-branch\n      // for 1 bit-per-component and 1 color TIFF images.\n      for (i = 0; i < rowBytes; ++i) {\n        var c = rawBytes[i] ^ inbuf;\n        c ^= c >> 1;\n        c ^= c >> 2;\n        c ^= c >> 4;\n        inbuf = (c & 1) << 7;\n        buffer[pos++] = c;\n      }\n    } else if (bits === 8) {\n      for (i = 0; i < colors; ++i) {\n        buffer[pos++] = rawBytes[i];\n      }\n      for (; i < rowBytes; ++i) {\n        buffer[pos] = buffer[pos - colors] + rawBytes[i];\n        pos++;\n      }\n    } else if (bits === 16) {\n      var bytesPerPixel = colors * 2;\n      for (i = 0; i < bytesPerPixel; ++i) {\n        buffer[pos++] = rawBytes[i];\n      }\n      for (; i < rowBytes; i += 2) {\n        var sum = ((rawBytes[i] & 0xFF) << 8) +\n                  (rawBytes[i + 1] & 0xFF) +\n                  ((buffer[pos - bytesPerPixel] & 0xFF) << 8) +\n                  (buffer[pos - bytesPerPixel + 1] & 0xFF);\n        buffer[pos++] = ((sum >> 8) & 0xFF);\n        buffer[pos++] = (sum & 0xFF);\n      }\n    } else {\n      var compArray = new Uint8Array(colors + 1);\n      var bitMask = (1 << bits) - 1;\n      var j = 0, k = bufferLength;\n      var columns = this.columns;\n      for (i = 0; i < columns; ++i) {\n        for (var kk = 0; kk < colors; ++kk) {\n          if (inbits < bits) {\n            inbuf = (inbuf << 8) | (rawBytes[j++] & 0xFF);\n            inbits += 8;\n          }\n          compArray[kk] = (compArray[kk] +\n                           (inbuf >> (inbits - bits))) & bitMask;\n          inbits -= bits;\n          outbuf = (outbuf << bits) | compArray[kk];\n          outbits += bits;\n          if (outbits >= 8) {\n            buffer[k++] = (outbuf >> (outbits - 8)) & 0xFF;\n            outbits -= 8;\n          }\n        }\n      }\n      if (outbits > 0) {\n        buffer[k++] = (outbuf << (8 - outbits)) +\n                      (inbuf & ((1 << (8 - outbits)) - 1));\n      }\n    }\n    this.bufferLength += rowBytes;\n  };\n\n  PredictorStream.prototype.readBlockPng =\n      function predictorStreamReadBlockPng() {\n\n    var rowBytes = this.rowBytes;\n    var pixBytes = this.pixBytes;\n\n    var predictor = this.str.getByte();\n    var rawBytes = this.str.getBytes(rowBytes);\n    this.eof = !rawBytes.length;\n    if (this.eof) {\n      return;\n    }\n\n    var bufferLength = this.bufferLength;\n    var buffer = this.ensureBuffer(bufferLength + rowBytes);\n\n    var prevRow = buffer.subarray(bufferLength - rowBytes, bufferLength);\n    if (prevRow.length === 0) {\n      prevRow = new Uint8Array(rowBytes);\n    }\n\n    var i, j = bufferLength, up, c;\n    switch (predictor) {\n      case 0:\n        for (i = 0; i < rowBytes; ++i) {\n          buffer[j++] = rawBytes[i];\n        }\n        break;\n      case 1:\n        for (i = 0; i < pixBytes; ++i) {\n          buffer[j++] = rawBytes[i];\n        }\n        for (; i < rowBytes; ++i) {\n          buffer[j] = (buffer[j - pixBytes] + rawBytes[i]) & 0xFF;\n          j++;\n        }\n        break;\n      case 2:\n        for (i = 0; i < rowBytes; ++i) {\n          buffer[j++] = (prevRow[i] + rawBytes[i]) & 0xFF;\n        }\n        break;\n      case 3:\n        for (i = 0; i < pixBytes; ++i) {\n          buffer[j++] = (prevRow[i] >> 1) + rawBytes[i];\n        }\n        for (; i < rowBytes; ++i) {\n          buffer[j] = (((prevRow[i] + buffer[j - pixBytes]) >> 1) +\n                           rawBytes[i]) & 0xFF;\n          j++;\n        }\n        break;\n      case 4:\n        // we need to save the up left pixels values. the simplest way\n        // is to create a new buffer\n        for (i = 0; i < pixBytes; ++i) {\n          up = prevRow[i];\n          c = rawBytes[i];\n          buffer[j++] = up + c;\n        }\n        for (; i < rowBytes; ++i) {\n          up = prevRow[i];\n          var upLeft = prevRow[i - pixBytes];\n          var left = buffer[j - pixBytes];\n          var p = left + up - upLeft;\n\n          var pa = p - left;\n          if (pa < 0) {\n            pa = -pa;\n          }\n          var pb = p - up;\n          if (pb < 0) {\n            pb = -pb;\n          }\n          var pc = p - upLeft;\n          if (pc < 0) {\n            pc = -pc;\n          }\n\n          c = rawBytes[i];\n          if (pa <= pb && pa <= pc) {\n            buffer[j++] = left + c;\n          } else if (pb <= pc) {\n            buffer[j++] = up + c;\n          } else {\n            buffer[j++] = upLeft + c;\n          }\n        }\n        break;\n      default:\n        throw new FormatError(`Unsupported predictor: ${predictor}`);\n    }\n    this.bufferLength += rowBytes;\n  };\n\n  return PredictorStream;\n})();\n\nvar DecryptStream = (function DecryptStreamClosure() {\n  function DecryptStream(str, maybeLength, decrypt) {\n    this.str = str;\n    this.dict = str.dict;\n    this.decrypt = decrypt;\n    this.nextChunk = null;\n    this.initialized = false;\n\n    DecodeStream.call(this, maybeLength);\n  }\n\n  var chunkSize = 512;\n\n  DecryptStream.prototype = Object.create(DecodeStream.prototype);\n\n  DecryptStream.prototype.readBlock = function DecryptStream_readBlock() {\n    var chunk;\n    if (this.initialized) {\n      chunk = this.nextChunk;\n    } else {\n      chunk = this.str.getBytes(chunkSize);\n      this.initialized = true;\n    }\n    if (!chunk || chunk.length === 0) {\n      this.eof = true;\n      return;\n    }\n    this.nextChunk = this.str.getBytes(chunkSize);\n    var hasMoreData = this.nextChunk && this.nextChunk.length > 0;\n\n    var decrypt = this.decrypt;\n    chunk = decrypt(chunk, !hasMoreData);\n\n    var bufferLength = this.bufferLength;\n    var i, n = chunk.length;\n    var buffer = this.ensureBuffer(bufferLength + n);\n    for (i = 0; i < n; i++) {\n      buffer[bufferLength++] = chunk[i];\n    }\n    this.bufferLength = bufferLength;\n  };\n\n  return DecryptStream;\n})();\n\nvar Ascii85Stream = (function Ascii85StreamClosure() {\n  function Ascii85Stream(str, maybeLength) {\n    this.str = str;\n    this.dict = str.dict;\n    this.input = new Uint8Array(5);\n\n    // Most streams increase in size when decoded, but Ascii85 streams\n    // typically shrink by ~20%.\n    if (maybeLength) {\n      maybeLength = 0.8 * maybeLength;\n    }\n    DecodeStream.call(this, maybeLength);\n  }\n\n  Ascii85Stream.prototype = Object.create(DecodeStream.prototype);\n\n  Ascii85Stream.prototype.readBlock = function Ascii85Stream_readBlock() {\n    var TILDA_CHAR = 0x7E; // '~'\n    var Z_LOWER_CHAR = 0x7A; // 'z'\n    var EOF = -1;\n\n    var str = this.str;\n\n    var c = str.getByte();\n    while (isSpace(c)) {\n      c = str.getByte();\n    }\n\n    if (c === EOF || c === TILDA_CHAR) {\n      this.eof = true;\n      return;\n    }\n\n    var bufferLength = this.bufferLength, buffer;\n    var i;\n\n    // special code for z\n    if (c === Z_LOWER_CHAR) {\n      buffer = this.ensureBuffer(bufferLength + 4);\n      for (i = 0; i < 4; ++i) {\n        buffer[bufferLength + i] = 0;\n      }\n      this.bufferLength += 4;\n    } else {\n      var input = this.input;\n      input[0] = c;\n      for (i = 1; i < 5; ++i) {\n        c = str.getByte();\n        while (isSpace(c)) {\n          c = str.getByte();\n        }\n\n        input[i] = c;\n\n        if (c === EOF || c === TILDA_CHAR) {\n          break;\n        }\n      }\n      buffer = this.ensureBuffer(bufferLength + i - 1);\n      this.bufferLength += i - 1;\n\n      // partial ending;\n      if (i < 5) {\n        for (; i < 5; ++i) {\n          input[i] = 0x21 + 84;\n        }\n        this.eof = true;\n      }\n      var t = 0;\n      for (i = 0; i < 5; ++i) {\n        t = t * 85 + (input[i] - 0x21);\n      }\n\n      for (i = 3; i >= 0; --i) {\n        buffer[bufferLength + i] = t & 0xFF;\n        t >>= 8;\n      }\n    }\n  };\n\n  return Ascii85Stream;\n})();\n\nvar AsciiHexStream = (function AsciiHexStreamClosure() {\n  function AsciiHexStream(str, maybeLength) {\n    this.str = str;\n    this.dict = str.dict;\n\n    this.firstDigit = -1;\n\n    // Most streams increase in size when decoded, but AsciiHex streams shrink\n    // by 50%.\n    if (maybeLength) {\n      maybeLength = 0.5 * maybeLength;\n    }\n    DecodeStream.call(this, maybeLength);\n  }\n\n  AsciiHexStream.prototype = Object.create(DecodeStream.prototype);\n\n  AsciiHexStream.prototype.readBlock = function AsciiHexStream_readBlock() {\n    var UPSTREAM_BLOCK_SIZE = 8000;\n    var bytes = this.str.getBytes(UPSTREAM_BLOCK_SIZE);\n    if (!bytes.length) {\n      this.eof = true;\n      return;\n    }\n\n    var maxDecodeLength = (bytes.length + 1) >> 1;\n    var buffer = this.ensureBuffer(this.bufferLength + maxDecodeLength);\n    var bufferLength = this.bufferLength;\n\n    var firstDigit = this.firstDigit;\n    for (var i = 0, ii = bytes.length; i < ii; i++) {\n      var ch = bytes[i], digit;\n      if (ch >= 0x30 && ch <= 0x39) { // '0'-'9'\n        digit = ch & 0x0F;\n      } else if ((ch >= 0x41 && ch <= 0x46) || (ch >= 0x61 && ch <= 0x66)) {\n        // 'A'-'Z', 'a'-'z'\n        digit = (ch & 0x0F) + 9;\n      } else if (ch === 0x3E) { // '>'\n        this.eof = true;\n        break;\n      } else { // probably whitespace\n        continue; // ignoring\n      }\n      if (firstDigit < 0) {\n        firstDigit = digit;\n      } else {\n        buffer[bufferLength++] = (firstDigit << 4) | digit;\n        firstDigit = -1;\n      }\n    }\n    if (firstDigit >= 0 && this.eof) {\n      // incomplete byte\n      buffer[bufferLength++] = (firstDigit << 4);\n      firstDigit = -1;\n    }\n    this.firstDigit = firstDigit;\n    this.bufferLength = bufferLength;\n  };\n\n  return AsciiHexStream;\n})();\n\nvar RunLengthStream = (function RunLengthStreamClosure() {\n  function RunLengthStream(str, maybeLength) {\n    this.str = str;\n    this.dict = str.dict;\n\n    DecodeStream.call(this, maybeLength);\n  }\n\n  RunLengthStream.prototype = Object.create(DecodeStream.prototype);\n\n  RunLengthStream.prototype.readBlock = function RunLengthStream_readBlock() {\n    // The repeatHeader has following format. The first byte defines type of run\n    // and amount of bytes to repeat/copy: n = 0 through 127 - copy next n bytes\n    // (in addition to the second byte from the header), n = 129 through 255 -\n    // duplicate the second byte from the header (257 - n) times, n = 128 - end.\n    var repeatHeader = this.str.getBytes(2);\n    if (!repeatHeader || repeatHeader.length < 2 || repeatHeader[0] === 128) {\n      this.eof = true;\n      return;\n    }\n\n    var buffer;\n    var bufferLength = this.bufferLength;\n    var n = repeatHeader[0];\n    if (n < 128) {\n      // copy n bytes\n      buffer = this.ensureBuffer(bufferLength + n + 1);\n      buffer[bufferLength++] = repeatHeader[1];\n      if (n > 0) {\n        var source = this.str.getBytes(n);\n        buffer.set(source, bufferLength);\n        bufferLength += n;\n      }\n    } else {\n      n = 257 - n;\n      var b = repeatHeader[1];\n      buffer = this.ensureBuffer(bufferLength + n + 1);\n      for (var i = 0; i < n; i++) {\n        buffer[bufferLength++] = b;\n      }\n    }\n    this.bufferLength = bufferLength;\n  };\n\n  return RunLengthStream;\n})();\n\nvar LZWStream = (function LZWStreamClosure() {\n  function LZWStream(str, maybeLength, earlyChange) {\n    this.str = str;\n    this.dict = str.dict;\n    this.cachedData = 0;\n    this.bitsCached = 0;\n\n    var maxLzwDictionarySize = 4096;\n    var lzwState = {\n      earlyChange,\n      codeLength: 9,\n      nextCode: 258,\n      dictionaryValues: new Uint8Array(maxLzwDictionarySize),\n      dictionaryLengths: new Uint16Array(maxLzwDictionarySize),\n      dictionaryPrevCodes: new Uint16Array(maxLzwDictionarySize),\n      currentSequence: new Uint8Array(maxLzwDictionarySize),\n      currentSequenceLength: 0,\n    };\n    for (var i = 0; i < 256; ++i) {\n      lzwState.dictionaryValues[i] = i;\n      lzwState.dictionaryLengths[i] = 1;\n    }\n    this.lzwState = lzwState;\n\n    DecodeStream.call(this, maybeLength);\n  }\n\n  LZWStream.prototype = Object.create(DecodeStream.prototype);\n\n  LZWStream.prototype.readBits = function LZWStream_readBits(n) {\n    var bitsCached = this.bitsCached;\n    var cachedData = this.cachedData;\n    while (bitsCached < n) {\n      var c = this.str.getByte();\n      if (c === -1) {\n        this.eof = true;\n        return null;\n      }\n      cachedData = (cachedData << 8) | c;\n      bitsCached += 8;\n    }\n    this.bitsCached = (bitsCached -= n);\n    this.cachedData = cachedData;\n    this.lastCode = null;\n    return (cachedData >>> bitsCached) & ((1 << n) - 1);\n  };\n\n  LZWStream.prototype.readBlock = function LZWStream_readBlock() {\n    var blockSize = 512;\n    var estimatedDecodedSize = blockSize * 2, decodedSizeDelta = blockSize;\n    var i, j, q;\n\n    var lzwState = this.lzwState;\n    if (!lzwState) {\n      return; // eof was found\n    }\n\n    var earlyChange = lzwState.earlyChange;\n    var nextCode = lzwState.nextCode;\n    var dictionaryValues = lzwState.dictionaryValues;\n    var dictionaryLengths = lzwState.dictionaryLengths;\n    var dictionaryPrevCodes = lzwState.dictionaryPrevCodes;\n    var codeLength = lzwState.codeLength;\n    var prevCode = lzwState.prevCode;\n    var currentSequence = lzwState.currentSequence;\n    var currentSequenceLength = lzwState.currentSequenceLength;\n\n    var decodedLength = 0;\n    var currentBufferLength = this.bufferLength;\n    var buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize);\n\n    for (i = 0; i < blockSize; i++) {\n      var code = this.readBits(codeLength);\n      var hasPrev = currentSequenceLength > 0;\n      if (code < 256) {\n        currentSequence[0] = code;\n        currentSequenceLength = 1;\n      } else if (code >= 258) {\n        if (code < nextCode) {\n          currentSequenceLength = dictionaryLengths[code];\n          for (j = currentSequenceLength - 1, q = code; j >= 0; j--) {\n            currentSequence[j] = dictionaryValues[q];\n            q = dictionaryPrevCodes[q];\n          }\n        } else {\n          currentSequence[currentSequenceLength++] = currentSequence[0];\n        }\n      } else if (code === 256) {\n        codeLength = 9;\n        nextCode = 258;\n        currentSequenceLength = 0;\n        continue;\n      } else {\n        this.eof = true;\n        delete this.lzwState;\n        break;\n      }\n\n      if (hasPrev) {\n        dictionaryPrevCodes[nextCode] = prevCode;\n        dictionaryLengths[nextCode] = dictionaryLengths[prevCode] + 1;\n        dictionaryValues[nextCode] = currentSequence[0];\n        nextCode++;\n        codeLength = (nextCode + earlyChange) & (nextCode + earlyChange - 1) ?\n          codeLength : Math.min(Math.log(nextCode + earlyChange) /\n          0.6931471805599453 + 1, 12) | 0;\n      }\n      prevCode = code;\n\n      decodedLength += currentSequenceLength;\n      if (estimatedDecodedSize < decodedLength) {\n        do {\n          estimatedDecodedSize += decodedSizeDelta;\n        } while (estimatedDecodedSize < decodedLength);\n        buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize);\n      }\n      for (j = 0; j < currentSequenceLength; j++) {\n        buffer[currentBufferLength++] = currentSequence[j];\n      }\n    }\n    lzwState.nextCode = nextCode;\n    lzwState.codeLength = codeLength;\n    lzwState.prevCode = prevCode;\n    lzwState.currentSequenceLength = currentSequenceLength;\n\n    this.bufferLength = currentBufferLength;\n  };\n\n  return LZWStream;\n})();\n\nvar NullStream = (function NullStreamClosure() {\n  function NullStream() {\n    Stream.call(this, new Uint8Array(0));\n  }\n\n  NullStream.prototype = Stream.prototype;\n\n  return NullStream;\n})();\n\nexport {\n  Ascii85Stream,\n  AsciiHexStream,\n  DecryptStream,\n  DecodeStream,\n  FlateStream,\n  NullStream,\n  PredictorStream,\n  RunLengthStream,\n  Stream,\n  StreamsSequenceStream,\n  StringStream,\n  LZWStream,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Dict, isDict } from './primitives';\nimport { CCITTFaxDecoder } from './ccitt';\nimport { DecodeStream } from './stream';\n\nvar CCITTFaxStream = (function CCITTFaxStreamClosure() {\n  function CCITTFaxStream(str, maybeLength, params) {\n    this.str = str;\n    this.dict = str.dict;\n\n    if (!isDict(params)) {\n      params = Dict.empty;\n    }\n\n    const source = {\n      next() {\n        return str.getByte();\n      },\n    };\n    this.ccittFaxDecoder = new CCITTFaxDecoder(source, {\n      K: params.get('K'),\n      EndOfLine: params.get('EndOfLine'),\n      EncodedByteAlign: params.get('EncodedByteAlign'),\n      Columns: params.get('Columns'),\n      Rows: params.get('Rows'),\n      EndOfBlock: params.get('EndOfBlock'),\n      BlackIs1: params.get('BlackIs1'),\n    });\n\n    DecodeStream.call(this, maybeLength);\n  }\n\n  CCITTFaxStream.prototype = Object.create(DecodeStream.prototype);\n\n  CCITTFaxStream.prototype.readBlock = function() {\n    while (!this.eof) {\n      let c = this.ccittFaxDecoder.readNextChar();\n      if (c === -1) {\n        this.eof = true;\n        return;\n      }\n      this.ensureBuffer(this.bufferLength + 1);\n      this.buffer[this.bufferLength++] = c;\n    }\n  };\n\n  return CCITTFaxStream;\n})();\n\nexport {\n  CCITTFaxStream,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* Copyright 1996-2003 Glyph & Cog, LLC\n *\n * The CCITT stream implementation contained in this file is a JavaScript port\n * of XPDF's implementation, made available under the Apache 2.0 open source\n * license.\n */\n\n/**\n * @typedef {Object} CCITTFaxDecoderSource\n * @property {function} next - Method that return one byte of data for decoding,\n *   or -1 when EOF is reached.\n */\n\nimport { info } from '../shared/util';\n\nlet CCITTFaxDecoder = (function CCITTFaxDecoder() {\n\n  const ccittEOL = -2;\n  const ccittEOF = -1;\n  const twoDimPass = 0;\n  const twoDimHoriz = 1;\n  const twoDimVert0 = 2;\n  const twoDimVertR1 = 3;\n  const twoDimVertL1 = 4;\n  const twoDimVertR2 = 5;\n  const twoDimVertL2 = 6;\n  const twoDimVertR3 = 7;\n  const twoDimVertL3 = 8;\n\n  const twoDimTable = [\n    [-1, -1], [-1, -1],                   // 000000x\n    [7, twoDimVertL3],                    // 0000010\n    [7, twoDimVertR3],                    // 0000011\n    [6, twoDimVertL2], [6, twoDimVertL2], // 000010x\n    [6, twoDimVertR2], [6, twoDimVertR2], // 000011x\n    [4, twoDimPass], [4, twoDimPass],     // 0001xxx\n    [4, twoDimPass], [4, twoDimPass],\n    [4, twoDimPass], [4, twoDimPass],\n    [4, twoDimPass], [4, twoDimPass],\n    [3, twoDimHoriz], [3, twoDimHoriz],   // 001xxxx\n    [3, twoDimHoriz], [3, twoDimHoriz],\n    [3, twoDimHoriz], [3, twoDimHoriz],\n    [3, twoDimHoriz], [3, twoDimHoriz],\n    [3, twoDimHoriz], [3, twoDimHoriz],\n    [3, twoDimHoriz], [3, twoDimHoriz],\n    [3, twoDimHoriz], [3, twoDimHoriz],\n    [3, twoDimHoriz], [3, twoDimHoriz],\n    [3, twoDimVertL1], [3, twoDimVertL1], // 010xxxx\n    [3, twoDimVertL1], [3, twoDimVertL1],\n    [3, twoDimVertL1], [3, twoDimVertL1],\n    [3, twoDimVertL1], [3, twoDimVertL1],\n    [3, twoDimVertL1], [3, twoDimVertL1],\n    [3, twoDimVertL1], [3, twoDimVertL1],\n    [3, twoDimVertL1], [3, twoDimVertL1],\n    [3, twoDimVertL1], [3, twoDimVertL1],\n    [3, twoDimVertR1], [3, twoDimVertR1], // 011xxxx\n    [3, twoDimVertR1], [3, twoDimVertR1],\n    [3, twoDimVertR1], [3, twoDimVertR1],\n    [3, twoDimVertR1], [3, twoDimVertR1],\n    [3, twoDimVertR1], [3, twoDimVertR1],\n    [3, twoDimVertR1], [3, twoDimVertR1],\n    [3, twoDimVertR1], [3, twoDimVertR1],\n    [3, twoDimVertR1], [3, twoDimVertR1],\n    [1, twoDimVert0], [1, twoDimVert0],   // 1xxxxxx\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0],\n    [1, twoDimVert0], [1, twoDimVert0]\n  ];\n\n  const whiteTable1 = [\n    [-1, -1],                               // 00000\n    [12, ccittEOL],                         // 00001\n    [-1, -1], [-1, -1],                     // 0001x\n    [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 001xx\n    [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 010xx\n    [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 011xx\n    [11, 1792], [11, 1792],                 // 1000x\n    [12, 1984],                             // 10010\n    [12, 2048],                             // 10011\n    [12, 2112],                             // 10100\n    [12, 2176],                             // 10101\n    [12, 2240],                             // 10110\n    [12, 2304],                             // 10111\n    [11, 1856], [11, 1856],                 // 1100x\n    [11, 1920], [11, 1920],                 // 1101x\n    [12, 2368],                             // 11100\n    [12, 2432],                             // 11101\n    [12, 2496],                             // 11110\n    [12, 2560]                              // 11111\n  ];\n\n  const whiteTable2 = [\n    [-1, -1], [-1, -1], [-1, -1], [-1, -1],     // 0000000xx\n    [8, 29], [8, 29],                           // 00000010x\n    [8, 30], [8, 30],                           // 00000011x\n    [8, 45], [8, 45],                           // 00000100x\n    [8, 46], [8, 46],                           // 00000101x\n    [7, 22], [7, 22], [7, 22], [7, 22],         // 0000011xx\n    [7, 23], [7, 23], [7, 23], [7, 23],         // 0000100xx\n    [8, 47], [8, 47],                           // 00001010x\n    [8, 48], [8, 48],                           // 00001011x\n    [6, 13], [6, 13], [6, 13], [6, 13],         // 000011xxx\n    [6, 13], [6, 13], [6, 13], [6, 13],\n    [7, 20], [7, 20], [7, 20], [7, 20],         // 0001000xx\n    [8, 33], [8, 33],                           // 00010010x\n    [8, 34], [8, 34],                           // 00010011x\n    [8, 35], [8, 35],                           // 00010100x\n    [8, 36], [8, 36],                           // 00010101x\n    [8, 37], [8, 37],                           // 00010110x\n    [8, 38], [8, 38],                           // 00010111x\n    [7, 19], [7, 19], [7, 19], [7, 19],         // 0001100xx\n    [8, 31], [8, 31],                           // 00011010x\n    [8, 32], [8, 32],                           // 00011011x\n    [6, 1], [6, 1], [6, 1], [6, 1],             // 000111xxx\n    [6, 1], [6, 1], [6, 1], [6, 1],\n    [6, 12], [6, 12], [6, 12], [6, 12],         // 001000xxx\n    [6, 12], [6, 12], [6, 12], [6, 12],\n    [8, 53], [8, 53],                           // 00100100x\n    [8, 54], [8, 54],                           // 00100101x\n    [7, 26], [7, 26], [7, 26], [7, 26],         // 0010011xx\n    [8, 39], [8, 39],                           // 00101000x\n    [8, 40], [8, 40],                           // 00101001x\n    [8, 41], [8, 41],                           // 00101010x\n    [8, 42], [8, 42],                           // 00101011x\n    [8, 43], [8, 43],                           // 00101100x\n    [8, 44], [8, 44],                           // 00101101x\n    [7, 21], [7, 21], [7, 21], [7, 21],         // 0010111xx\n    [7, 28], [7, 28], [7, 28], [7, 28],         // 0011000xx\n    [8, 61], [8, 61],                           // 00110010x\n    [8, 62], [8, 62],                           // 00110011x\n    [8, 63], [8, 63],                           // 00110100x\n    [8, 0], [8, 0],                             // 00110101x\n    [8, 320], [8, 320],                         // 00110110x\n    [8, 384], [8, 384],                         // 00110111x\n    [5, 10], [5, 10], [5, 10], [5, 10],         // 00111xxxx\n    [5, 10], [5, 10], [5, 10], [5, 10],\n    [5, 10], [5, 10], [5, 10], [5, 10],\n    [5, 10], [5, 10], [5, 10], [5, 10],\n    [5, 11], [5, 11], [5, 11], [5, 11],         // 01000xxxx\n    [5, 11], [5, 11], [5, 11], [5, 11],\n    [5, 11], [5, 11], [5, 11], [5, 11],\n    [5, 11], [5, 11], [5, 11], [5, 11],\n    [7, 27], [7, 27], [7, 27], [7, 27],         // 0100100xx\n    [8, 59], [8, 59],                           // 01001010x\n    [8, 60], [8, 60],                           // 01001011x\n    [9, 1472],                                  // 010011000\n    [9, 1536],                                  // 010011001\n    [9, 1600],                                  // 010011010\n    [9, 1728],                                  // 010011011\n    [7, 18], [7, 18], [7, 18], [7, 18],         // 0100111xx\n    [7, 24], [7, 24], [7, 24], [7, 24],         // 0101000xx\n    [8, 49], [8, 49],                           // 01010010x\n    [8, 50], [8, 50],                           // 01010011x\n    [8, 51], [8, 51],                           // 01010100x\n    [8, 52], [8, 52],                           // 01010101x\n    [7, 25], [7, 25], [7, 25], [7, 25],         // 0101011xx\n    [8, 55], [8, 55],                           // 01011000x\n    [8, 56], [8, 56],                           // 01011001x\n    [8, 57], [8, 57],                           // 01011010x\n    [8, 58], [8, 58],                           // 01011011x\n    [6, 192], [6, 192], [6, 192], [6, 192],     // 010111xxx\n    [6, 192], [6, 192], [6, 192], [6, 192],\n    [6, 1664], [6, 1664], [6, 1664], [6, 1664], // 011000xxx\n    [6, 1664], [6, 1664], [6, 1664], [6, 1664],\n    [8, 448], [8, 448],                         // 01100100x\n    [8, 512], [8, 512],                         // 01100101x\n    [9, 704],                                   // 011001100\n    [9, 768],                                   // 011001101\n    [8, 640], [8, 640],                         // 01100111x\n    [8, 576], [8, 576],                         // 01101000x\n    [9, 832],                                   // 011010010\n    [9, 896],                                   // 011010011\n    [9, 960],                                   // 011010100\n    [9, 1024],                                  // 011010101\n    [9, 1088],                                  // 011010110\n    [9, 1152],                                  // 011010111\n    [9, 1216],                                  // 011011000\n    [9, 1280],                                  // 011011001\n    [9, 1344],                                  // 011011010\n    [9, 1408],                                  // 011011011\n    [7, 256], [7, 256], [7, 256], [7, 256],     // 0110111xx\n    [4, 2], [4, 2], [4, 2], [4, 2],             // 0111xxxxx\n    [4, 2], [4, 2], [4, 2], [4, 2],\n    [4, 2], [4, 2], [4, 2], [4, 2],\n    [4, 2], [4, 2], [4, 2], [4, 2],\n    [4, 2], [4, 2], [4, 2], [4, 2],\n    [4, 2], [4, 2], [4, 2], [4, 2],\n    [4, 2], [4, 2], [4, 2], [4, 2],\n    [4, 2], [4, 2], [4, 2], [4, 2],\n    [4, 3], [4, 3], [4, 3], [4, 3],             // 1000xxxxx\n    [4, 3], [4, 3], [4, 3], [4, 3],\n    [4, 3], [4, 3], [4, 3], [4, 3],\n    [4, 3], [4, 3], [4, 3], [4, 3],\n    [4, 3], [4, 3], [4, 3], [4, 3],\n    [4, 3], [4, 3], [4, 3], [4, 3],\n    [4, 3], [4, 3], [4, 3], [4, 3],\n    [4, 3], [4, 3], [4, 3], [4, 3],\n    [5, 128], [5, 128], [5, 128], [5, 128],     // 10010xxxx\n    [5, 128], [5, 128], [5, 128], [5, 128],\n    [5, 128], [5, 128], [5, 128], [5, 128],\n    [5, 128], [5, 128], [5, 128], [5, 128],\n    [5, 8], [5, 8], [5, 8], [5, 8],             // 10011xxxx\n    [5, 8], [5, 8], [5, 8], [5, 8],\n    [5, 8], [5, 8], [5, 8], [5, 8],\n    [5, 8], [5, 8], [5, 8], [5, 8],\n    [5, 9], [5, 9], [5, 9], [5, 9],             // 10100xxxx\n    [5, 9], [5, 9], [5, 9], [5, 9],\n    [5, 9], [5, 9], [5, 9], [5, 9],\n    [5, 9], [5, 9], [5, 9], [5, 9],\n    [6, 16], [6, 16], [6, 16], [6, 16],         // 101010xxx\n    [6, 16], [6, 16], [6, 16], [6, 16],\n    [6, 17], [6, 17], [6, 17], [6, 17],         // 101011xxx\n    [6, 17], [6, 17], [6, 17], [6, 17],\n    [4, 4], [4, 4], [4, 4], [4, 4],             // 1011xxxxx\n    [4, 4], [4, 4], [4, 4], [4, 4],\n    [4, 4], [4, 4], [4, 4], [4, 4],\n    [4, 4], [4, 4], [4, 4], [4, 4],\n    [4, 4], [4, 4], [4, 4], [4, 4],\n    [4, 4], [4, 4], [4, 4], [4, 4],\n    [4, 4], [4, 4], [4, 4], [4, 4],\n    [4, 4], [4, 4], [4, 4], [4, 4],\n    [4, 5], [4, 5], [4, 5], [4, 5],             // 1100xxxxx\n    [4, 5], [4, 5], [4, 5], [4, 5],\n    [4, 5], [4, 5], [4, 5], [4, 5],\n    [4, 5], [4, 5], [4, 5], [4, 5],\n    [4, 5], [4, 5], [4, 5], [4, 5],\n    [4, 5], [4, 5], [4, 5], [4, 5],\n    [4, 5], [4, 5], [4, 5], [4, 5],\n    [4, 5], [4, 5], [4, 5], [4, 5],\n    [6, 14], [6, 14], [6, 14], [6, 14],         // 110100xxx\n    [6, 14], [6, 14], [6, 14], [6, 14],\n    [6, 15], [6, 15], [6, 15], [6, 15],         // 110101xxx\n    [6, 15], [6, 15], [6, 15], [6, 15],\n    [5, 64], [5, 64], [5, 64], [5, 64],         // 11011xxxx\n    [5, 64], [5, 64], [5, 64], [5, 64],\n    [5, 64], [5, 64], [5, 64], [5, 64],\n    [5, 64], [5, 64], [5, 64], [5, 64],\n    [4, 6], [4, 6], [4, 6], [4, 6],             // 1110xxxxx\n    [4, 6], [4, 6], [4, 6], [4, 6],\n    [4, 6], [4, 6], [4, 6], [4, 6],\n    [4, 6], [4, 6], [4, 6], [4, 6],\n    [4, 6], [4, 6], [4, 6], [4, 6],\n    [4, 6], [4, 6], [4, 6], [4, 6],\n    [4, 6], [4, 6], [4, 6], [4, 6],\n    [4, 6], [4, 6], [4, 6], [4, 6],\n    [4, 7], [4, 7], [4, 7], [4, 7],             // 1111xxxxx\n    [4, 7], [4, 7], [4, 7], [4, 7],\n    [4, 7], [4, 7], [4, 7], [4, 7],\n    [4, 7], [4, 7], [4, 7], [4, 7],\n    [4, 7], [4, 7], [4, 7], [4, 7],\n    [4, 7], [4, 7], [4, 7], [4, 7],\n    [4, 7], [4, 7], [4, 7], [4, 7],\n    [4, 7], [4, 7], [4, 7], [4, 7]\n  ];\n\n  const blackTable1 = [\n    [-1, -1], [-1, -1],                             // 000000000000x\n    [12, ccittEOL], [12, ccittEOL],                 // 000000000001x\n    [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000001xx\n    [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000010xx\n    [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000011xx\n    [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000100xx\n    [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000101xx\n    [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000110xx\n    [-1, -1], [-1, -1], [-1, -1], [-1, -1],         // 00000000111xx\n    [11, 1792], [11, 1792], [11, 1792], [11, 1792], // 00000001000xx\n    [12, 1984], [12, 1984],                         // 000000010010x\n    [12, 2048], [12, 2048],                         // 000000010011x\n    [12, 2112], [12, 2112],                         // 000000010100x\n    [12, 2176], [12, 2176],                         // 000000010101x\n    [12, 2240], [12, 2240],                         // 000000010110x\n    [12, 2304], [12, 2304],                         // 000000010111x\n    [11, 1856], [11, 1856], [11, 1856], [11, 1856], // 00000001100xx\n    [11, 1920], [11, 1920], [11, 1920], [11, 1920], // 00000001101xx\n    [12, 2368], [12, 2368],                         // 000000011100x\n    [12, 2432], [12, 2432],                         // 000000011101x\n    [12, 2496], [12, 2496],                         // 000000011110x\n    [12, 2560], [12, 2560],                         // 000000011111x\n    [10, 18], [10, 18], [10, 18], [10, 18],         // 0000001000xxx\n    [10, 18], [10, 18], [10, 18], [10, 18],\n    [12, 52], [12, 52],                             // 000000100100x\n    [13, 640],                                      // 0000001001010\n    [13, 704],                                      // 0000001001011\n    [13, 768],                                      // 0000001001100\n    [13, 832],                                      // 0000001001101\n    [12, 55], [12, 55],                             // 000000100111x\n    [12, 56], [12, 56],                             // 000000101000x\n    [13, 1280],                                     // 0000001010010\n    [13, 1344],                                     // 0000001010011\n    [13, 1408],                                     // 0000001010100\n    [13, 1472],                                     // 0000001010101\n    [12, 59], [12, 59],                             // 000000101011x\n    [12, 60], [12, 60],                             // 000000101100x\n    [13, 1536],                                     // 0000001011010\n    [13, 1600],                                     // 0000001011011\n    [11, 24], [11, 24], [11, 24], [11, 24],         // 00000010111xx\n    [11, 25], [11, 25], [11, 25], [11, 25],         // 00000011000xx\n    [13, 1664],                                     // 0000001100100\n    [13, 1728],                                     // 0000001100101\n    [12, 320], [12, 320],                           // 000000110011x\n    [12, 384], [12, 384],                           // 000000110100x\n    [12, 448], [12, 448],                           // 000000110101x\n    [13, 512],                                      // 0000001101100\n    [13, 576],                                      // 0000001101101\n    [12, 53], [12, 53],                             // 000000110111x\n    [12, 54], [12, 54],                             // 000000111000x\n    [13, 896],                                      // 0000001110010\n    [13, 960],                                      // 0000001110011\n    [13, 1024],                                     // 0000001110100\n    [13, 1088],                                     // 0000001110101\n    [13, 1152],                                     // 0000001110110\n    [13, 1216],                                     // 0000001110111\n    [10, 64], [10, 64], [10, 64], [10, 64],         // 0000001111xxx\n    [10, 64], [10, 64], [10, 64], [10, 64]\n  ];\n\n  const blackTable2 = [\n    [8, 13], [8, 13], [8, 13], [8, 13],     // 00000100xxxx\n    [8, 13], [8, 13], [8, 13], [8, 13],\n    [8, 13], [8, 13], [8, 13], [8, 13],\n    [8, 13], [8, 13], [8, 13], [8, 13],\n    [11, 23], [11, 23],                     // 00000101000x\n    [12, 50],                               // 000001010010\n    [12, 51],                               // 000001010011\n    [12, 44],                               // 000001010100\n    [12, 45],                               // 000001010101\n    [12, 46],                               // 000001010110\n    [12, 47],                               // 000001010111\n    [12, 57],                               // 000001011000\n    [12, 58],                               // 000001011001\n    [12, 61],                               // 000001011010\n    [12, 256],                              // 000001011011\n    [10, 16], [10, 16], [10, 16], [10, 16], // 0000010111xx\n    [10, 17], [10, 17], [10, 17], [10, 17], // 0000011000xx\n    [12, 48],                               // 000001100100\n    [12, 49],                               // 000001100101\n    [12, 62],                               // 000001100110\n    [12, 63],                               // 000001100111\n    [12, 30],                               // 000001101000\n    [12, 31],                               // 000001101001\n    [12, 32],                               // 000001101010\n    [12, 33],                               // 000001101011\n    [12, 40],                               // 000001101100\n    [12, 41],                               // 000001101101\n    [11, 22], [11, 22],                     // 00000110111x\n    [8, 14], [8, 14], [8, 14], [8, 14],     // 00000111xxxx\n    [8, 14], [8, 14], [8, 14], [8, 14],\n    [8, 14], [8, 14], [8, 14], [8, 14],\n    [8, 14], [8, 14], [8, 14], [8, 14],\n    [7, 10], [7, 10], [7, 10], [7, 10],     // 0000100xxxxx\n    [7, 10], [7, 10], [7, 10], [7, 10],\n    [7, 10], [7, 10], [7, 10], [7, 10],\n    [7, 10], [7, 10], [7, 10], [7, 10],\n    [7, 10], [7, 10], [7, 10], [7, 10],\n    [7, 10], [7, 10], [7, 10], [7, 10],\n    [7, 10], [7, 10], [7, 10], [7, 10],\n    [7, 10], [7, 10], [7, 10], [7, 10],\n    [7, 11], [7, 11], [7, 11], [7, 11],     // 0000101xxxxx\n    [7, 11], [7, 11], [7, 11], [7, 11],\n    [7, 11], [7, 11], [7, 11], [7, 11],\n    [7, 11], [7, 11], [7, 11], [7, 11],\n    [7, 11], [7, 11], [7, 11], [7, 11],\n    [7, 11], [7, 11], [7, 11], [7, 11],\n    [7, 11], [7, 11], [7, 11], [7, 11],\n    [7, 11], [7, 11], [7, 11], [7, 11],\n    [9, 15], [9, 15], [9, 15], [9, 15],     // 000011000xxx\n    [9, 15], [9, 15], [9, 15], [9, 15],\n    [12, 128],                              // 000011001000\n    [12, 192],                              // 000011001001\n    [12, 26],                               // 000011001010\n    [12, 27],                               // 000011001011\n    [12, 28],                               // 000011001100\n    [12, 29],                               // 000011001101\n    [11, 19], [11, 19],                     // 00001100111x\n    [11, 20], [11, 20],                     // 00001101000x\n    [12, 34],                               // 000011010010\n    [12, 35],                               // 000011010011\n    [12, 36],                               // 000011010100\n    [12, 37],                               // 000011010101\n    [12, 38],                               // 000011010110\n    [12, 39],                               // 000011010111\n    [11, 21], [11, 21],                     // 00001101100x\n    [12, 42],                               // 000011011010\n    [12, 43],                               // 000011011011\n    [10, 0], [10, 0], [10, 0], [10, 0],     // 0000110111xx\n    [7, 12], [7, 12], [7, 12], [7, 12],     // 0000111xxxxx\n    [7, 12], [7, 12], [7, 12], [7, 12],\n    [7, 12], [7, 12], [7, 12], [7, 12],\n    [7, 12], [7, 12], [7, 12], [7, 12],\n    [7, 12], [7, 12], [7, 12], [7, 12],\n    [7, 12], [7, 12], [7, 12], [7, 12],\n    [7, 12], [7, 12], [7, 12], [7, 12],\n    [7, 12], [7, 12], [7, 12], [7, 12]\n  ];\n\n  const blackTable3 = [\n    [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 0000xx\n    [6, 9],                                 // 000100\n    [6, 8],                                 // 000101\n    [5, 7], [5, 7],                         // 00011x\n    [4, 6], [4, 6], [4, 6], [4, 6],         // 0010xx\n    [4, 5], [4, 5], [4, 5], [4, 5],         // 0011xx\n    [3, 1], [3, 1], [3, 1], [3, 1],         // 010xxx\n    [3, 1], [3, 1], [3, 1], [3, 1],\n    [3, 4], [3, 4], [3, 4], [3, 4],         // 011xxx\n    [3, 4], [3, 4], [3, 4], [3, 4],\n    [2, 3], [2, 3], [2, 3], [2, 3],         // 10xxxx\n    [2, 3], [2, 3], [2, 3], [2, 3],\n    [2, 3], [2, 3], [2, 3], [2, 3],\n    [2, 3], [2, 3], [2, 3], [2, 3],\n    [2, 2], [2, 2], [2, 2], [2, 2],         // 11xxxx\n    [2, 2], [2, 2], [2, 2], [2, 2],\n    [2, 2], [2, 2], [2, 2], [2, 2],\n    [2, 2], [2, 2], [2, 2], [2, 2]\n  ];\n\n  /**\n   * @param {CCITTFaxDecoderSource} source - The data which should be decoded.\n   * @param {Object} options - (optional) Decoding options.\n   */\n  function CCITTFaxDecoder(source, options = {}) {\n    if (!source || typeof source.next !== 'function') {\n      throw new Error('CCITTFaxDecoder - invalid \"source\" parameter.');\n    }\n    this.source = source;\n    this.eof = false;\n\n    this.encoding = options['K'] || 0;\n    this.eoline = options['EndOfLine'] || false;\n    this.byteAlign = options['EncodedByteAlign'] || false;\n    this.columns = options['Columns'] || 1728;\n    this.rows = options['Rows'] || 0;\n    let eoblock = options['EndOfBlock'];\n    if (eoblock === null || eoblock === undefined) {\n      eoblock = true;\n    }\n    this.eoblock = eoblock;\n    this.black = options['BlackIs1'] || false;\n\n    this.codingLine = new Uint32Array(this.columns + 1);\n    this.refLine = new Uint32Array(this.columns + 2);\n\n    this.codingLine[0] = this.columns;\n    this.codingPos = 0;\n\n    this.row = 0;\n    this.nextLine2D = this.encoding < 0;\n    this.inputBits = 0;\n    this.inputBuf = 0;\n    this.outputBits = 0;\n    this.rowsDone = false;\n\n    let code1;\n    while ((code1 = this._lookBits(12)) === 0) {\n      this._eatBits(1);\n    }\n    if (code1 === 1) {\n      this._eatBits(12);\n    }\n    if (this.encoding > 0) {\n      this.nextLine2D = !this._lookBits(1);\n      this._eatBits(1);\n    }\n  }\n\n  CCITTFaxDecoder.prototype = {\n    readNextChar() {\n      if (this.eof) {\n        return -1;\n      }\n      let refLine = this.refLine;\n      let codingLine = this.codingLine;\n      let columns = this.columns;\n\n      let refPos, blackPixels, bits, i;\n\n      if (this.outputBits === 0) {\n        if (this.rowsDone) {\n          this.eof = true;\n        }\n        if (this.eof) {\n          return -1;\n        }\n        this.err = false;\n\n        let code1, code2, code3;\n        if (this.nextLine2D) {\n          for (i = 0; codingLine[i] < columns; ++i) {\n            refLine[i] = codingLine[i];\n          }\n          refLine[i++] = columns;\n          refLine[i] = columns;\n          codingLine[0] = 0;\n          this.codingPos = 0;\n          refPos = 0;\n          blackPixels = 0;\n\n          while (codingLine[this.codingPos] < columns) {\n            code1 = this._getTwoDimCode();\n            switch (code1) {\n              case twoDimPass:\n                this._addPixels(refLine[refPos + 1], blackPixels);\n                if (refLine[refPos + 1] < columns) {\n                  refPos += 2;\n                }\n                break;\n              case twoDimHoriz:\n                code1 = code2 = 0;\n                if (blackPixels) {\n                  do {\n                    code1 += (code3 = this._getBlackCode());\n                  } while (code3 >= 64);\n                  do {\n                    code2 += (code3 = this._getWhiteCode());\n                  } while (code3 >= 64);\n                } else {\n                  do {\n                    code1 += (code3 = this._getWhiteCode());\n                  } while (code3 >= 64);\n                  do {\n                    code2 += (code3 = this._getBlackCode());\n                  } while (code3 >= 64);\n                }\n                this._addPixels(codingLine[this.codingPos] +\n                               code1, blackPixels);\n                if (codingLine[this.codingPos] < columns) {\n                  this._addPixels(codingLine[this.codingPos] + code2,\n                                 blackPixels ^ 1);\n                }\n                while (refLine[refPos] <= codingLine[this.codingPos] &&\n                       refLine[refPos] < columns) {\n                  refPos += 2;\n                }\n                break;\n              case twoDimVertR3:\n                this._addPixels(refLine[refPos] + 3, blackPixels);\n                blackPixels ^= 1;\n                if (codingLine[this.codingPos] < columns) {\n                  ++refPos;\n                  while (refLine[refPos] <= codingLine[this.codingPos] &&\n                         refLine[refPos] < columns) {\n                    refPos += 2;\n                  }\n                }\n                break;\n              case twoDimVertR2:\n                this._addPixels(refLine[refPos] + 2, blackPixels);\n                blackPixels ^= 1;\n                if (codingLine[this.codingPos] < columns) {\n                  ++refPos;\n                  while (refLine[refPos] <= codingLine[this.codingPos] &&\n                         refLine[refPos] < columns) {\n                    refPos += 2;\n                  }\n                }\n                break;\n              case twoDimVertR1:\n                this._addPixels(refLine[refPos] + 1, blackPixels);\n                blackPixels ^= 1;\n                if (codingLine[this.codingPos] < columns) {\n                  ++refPos;\n                  while (refLine[refPos] <= codingLine[this.codingPos] &&\n                         refLine[refPos] < columns) {\n                    refPos += 2;\n                  }\n                }\n                break;\n              case twoDimVert0:\n                this._addPixels(refLine[refPos], blackPixels);\n                blackPixels ^= 1;\n                if (codingLine[this.codingPos] < columns) {\n                  ++refPos;\n                  while (refLine[refPos] <= codingLine[this.codingPos] &&\n                         refLine[refPos] < columns) {\n                    refPos += 2;\n                  }\n                }\n                break;\n              case twoDimVertL3:\n                this._addPixelsNeg(refLine[refPos] - 3, blackPixels);\n                blackPixels ^= 1;\n                if (codingLine[this.codingPos] < columns) {\n                  if (refPos > 0) {\n                    --refPos;\n                  } else {\n                    ++refPos;\n                  }\n                  while (refLine[refPos] <= codingLine[this.codingPos] &&\n                         refLine[refPos] < columns) {\n                    refPos += 2;\n                  }\n                }\n                break;\n              case twoDimVertL2:\n                this._addPixelsNeg(refLine[refPos] - 2, blackPixels);\n                blackPixels ^= 1;\n                if (codingLine[this.codingPos] < columns) {\n                  if (refPos > 0) {\n                    --refPos;\n                  } else {\n                    ++refPos;\n                  }\n                  while (refLine[refPos] <= codingLine[this.codingPos] &&\n                         refLine[refPos] < columns) {\n                    refPos += 2;\n                  }\n                }\n                break;\n              case twoDimVertL1:\n                this._addPixelsNeg(refLine[refPos] - 1, blackPixels);\n                blackPixels ^= 1;\n                if (codingLine[this.codingPos] < columns) {\n                  if (refPos > 0) {\n                    --refPos;\n                  } else {\n                    ++refPos;\n                  }\n                  while (refLine[refPos] <= codingLine[this.codingPos] &&\n                         refLine[refPos] < columns) {\n                    refPos += 2;\n                  }\n                }\n                break;\n              case ccittEOF:\n                this._addPixels(columns, 0);\n                this.eof = true;\n                break;\n              default:\n                info('bad 2d code');\n                this._addPixels(columns, 0);\n                this.err = true;\n            }\n          }\n        } else {\n          codingLine[0] = 0;\n          this.codingPos = 0;\n          blackPixels = 0;\n          while (codingLine[this.codingPos] < columns) {\n            code1 = 0;\n            if (blackPixels) {\n              do {\n                code1 += (code3 = this._getBlackCode());\n              } while (code3 >= 64);\n            } else {\n              do {\n                code1 += (code3 = this._getWhiteCode());\n              } while (code3 >= 64);\n            }\n            this._addPixels(codingLine[this.codingPos] + code1, blackPixels);\n            blackPixels ^= 1;\n          }\n        }\n\n        let gotEOL = false;\n\n        if (this.byteAlign) {\n          this.inputBits &= ~7;\n        }\n\n        if (!this.eoblock && this.row === this.rows - 1) {\n          this.rowsDone = true;\n        } else {\n          code1 = this._lookBits(12);\n          if (this.eoline) {\n            while (code1 !== ccittEOF && code1 !== 1) {\n              this._eatBits(1);\n              code1 = this._lookBits(12);\n            }\n          } else {\n            while (code1 === 0) {\n              this._eatBits(1);\n              code1 = this._lookBits(12);\n            }\n          }\n          if (code1 === 1) {\n            this._eatBits(12);\n            gotEOL = true;\n          } else if (code1 === ccittEOF) {\n            this.eof = true;\n          }\n        }\n\n        if (!this.eof && this.encoding > 0 && !this.rowsDone) {\n          this.nextLine2D = !this._lookBits(1);\n          this._eatBits(1);\n        }\n\n        if (this.eoblock && gotEOL && this.byteAlign) {\n          code1 = this._lookBits(12);\n          if (code1 === 1) {\n            this._eatBits(12);\n            if (this.encoding > 0) {\n              this._lookBits(1);\n              this._eatBits(1);\n            }\n            if (this.encoding >= 0) {\n              for (i = 0; i < 4; ++i) {\n                code1 = this._lookBits(12);\n                if (code1 !== 1) {\n                  info('bad rtc code: ' + code1);\n                }\n                this._eatBits(12);\n                if (this.encoding > 0) {\n                  this._lookBits(1);\n                  this._eatBits(1);\n                }\n              }\n            }\n            this.eof = true;\n          }\n        } else if (this.err && this.eoline) {\n          while (true) {\n            code1 = this._lookBits(13);\n            if (code1 === ccittEOF) {\n              this.eof = true;\n              return -1;\n            }\n            if ((code1 >> 1) === 1) {\n              break;\n            }\n            this._eatBits(1);\n          }\n          this._eatBits(12);\n          if (this.encoding > 0) {\n            this._eatBits(1);\n            this.nextLine2D = !(code1 & 1);\n          }\n        }\n\n        if (codingLine[0] > 0) {\n          this.outputBits = codingLine[this.codingPos = 0];\n        } else {\n          this.outputBits = codingLine[this.codingPos = 1];\n        }\n        this.row++;\n      }\n\n      let c;\n      if (this.outputBits >= 8) {\n        c = (this.codingPos & 1) ? 0 : 0xFF;\n        this.outputBits -= 8;\n        if (this.outputBits === 0 && codingLine[this.codingPos] < columns) {\n          this.codingPos++;\n          this.outputBits = (codingLine[this.codingPos] -\n                             codingLine[this.codingPos - 1]);\n        }\n      } else {\n        bits = 8;\n        c = 0;\n        do {\n          if (this.outputBits > bits) {\n            c <<= bits;\n            if (!(this.codingPos & 1)) {\n              c |= 0xFF >> (8 - bits);\n            }\n            this.outputBits -= bits;\n            bits = 0;\n          } else {\n            c <<= this.outputBits;\n            if (!(this.codingPos & 1)) {\n              c |= 0xFF >> (8 - this.outputBits);\n            }\n            bits -= this.outputBits;\n            this.outputBits = 0;\n            if (codingLine[this.codingPos] < columns) {\n              this.codingPos++;\n              this.outputBits = (codingLine[this.codingPos] -\n                                 codingLine[this.codingPos - 1]);\n            } else if (bits > 0) {\n              c <<= bits;\n              bits = 0;\n            }\n          }\n        } while (bits);\n      }\n      if (this.black) {\n        c ^= 0xFF;\n      }\n      return c;\n    },\n\n    /**\n     * @private\n     */\n    _addPixels(a1, blackPixels) {\n      let codingLine = this.codingLine;\n      let codingPos = this.codingPos;\n\n      if (a1 > codingLine[codingPos]) {\n        if (a1 > this.columns) {\n          info('row is wrong length');\n          this.err = true;\n          a1 = this.columns;\n        }\n        if ((codingPos & 1) ^ blackPixels) {\n          ++codingPos;\n        }\n\n        codingLine[codingPos] = a1;\n      }\n      this.codingPos = codingPos;\n    },\n\n    /**\n     * @private\n     */\n    _addPixelsNeg(a1, blackPixels) {\n      let codingLine = this.codingLine;\n      let codingPos = this.codingPos;\n\n      if (a1 > codingLine[codingPos]) {\n        if (a1 > this.columns) {\n          info('row is wrong length');\n          this.err = true;\n          a1 = this.columns;\n        }\n        if ((codingPos & 1) ^ blackPixels) {\n          ++codingPos;\n        }\n\n        codingLine[codingPos] = a1;\n      } else if (a1 < codingLine[codingPos]) {\n        if (a1 < 0) {\n          info('invalid code');\n          this.err = true;\n          a1 = 0;\n        }\n        while (codingPos > 0 && a1 < codingLine[codingPos - 1]) {\n          --codingPos;\n        }\n        codingLine[codingPos] = a1;\n      }\n\n      this.codingPos = codingPos;\n    },\n\n    /**\n     * This function returns the code found from the table.\n     * The start and end parameters set the boundaries for searching the table.\n     * The limit parameter is optional. Function returns an array with three\n     * values. The first array element indicates whether a valid code is being\n     * returned. The second array element is the actual code. The third array\n     * element indicates whether EOF was reached.\n     * @private\n     */\n    _findTableCode(start, end, table, limit) {\n      let limitValue = limit || 0;\n      for (let i = start; i <= end; ++i) {\n        let code = this._lookBits(i);\n        if (code === ccittEOF) {\n          return [true, 1, false];\n        }\n        if (i < end) {\n          code <<= end - i;\n        }\n        if (!limitValue || code >= limitValue) {\n          let p = table[code - limitValue];\n          if (p[0] === i) {\n            this._eatBits(i);\n            return [true, p[1], true];\n          }\n        }\n      }\n      return [false, 0, false];\n    },\n\n    /**\n     * @private\n     */\n    _getTwoDimCode() {\n      let code = 0;\n      let p;\n      if (this.eoblock) {\n        code = this._lookBits(7);\n        p = twoDimTable[code];\n        if (p && p[0] > 0) {\n          this._eatBits(p[0]);\n          return p[1];\n        }\n      } else {\n        let result = this._findTableCode(1, 7, twoDimTable);\n        if (result[0] && result[2]) {\n          return result[1];\n        }\n      }\n      info('Bad two dim code');\n      return ccittEOF;\n    },\n\n    /**\n     * @private\n     */\n    _getWhiteCode() {\n      let code = 0;\n      let p;\n      if (this.eoblock) {\n        code = this._lookBits(12);\n        if (code === ccittEOF) {\n          return 1;\n        }\n\n        if ((code >> 5) === 0) {\n          p = whiteTable1[code];\n        } else {\n          p = whiteTable2[code >> 3];\n        }\n\n        if (p[0] > 0) {\n          this._eatBits(p[0]);\n          return p[1];\n        }\n      } else {\n        let result = this._findTableCode(1, 9, whiteTable2);\n        if (result[0]) {\n          return result[1];\n        }\n\n        result = this._findTableCode(11, 12, whiteTable1);\n        if (result[0]) {\n          return result[1];\n        }\n      }\n      info('bad white code');\n      this._eatBits(1);\n      return 1;\n    },\n\n    /**\n     * @private\n     */\n    _getBlackCode() {\n      let code, p;\n      if (this.eoblock) {\n        code = this._lookBits(13);\n        if (code === ccittEOF) {\n          return 1;\n        }\n        if ((code >> 7) === 0) {\n          p = blackTable1[code];\n        } else if ((code >> 9) === 0 && (code >> 7) !== 0) {\n          p = blackTable2[(code >> 1) - 64];\n        } else {\n          p = blackTable3[code >> 7];\n        }\n\n        if (p[0] > 0) {\n          this._eatBits(p[0]);\n          return p[1];\n        }\n      } else {\n        let result = this._findTableCode(2, 6, blackTable3);\n        if (result[0]) {\n          return result[1];\n        }\n\n        result = this._findTableCode(7, 12, blackTable2, 64);\n        if (result[0]) {\n          return result[1];\n        }\n\n        result = this._findTableCode(10, 13, blackTable1);\n        if (result[0]) {\n          return result[1];\n        }\n      }\n      info('bad black code');\n      this._eatBits(1);\n      return 1;\n    },\n\n    /**\n     * @private\n     */\n    _lookBits(n) {\n      let c;\n      while (this.inputBits < n) {\n        if ((c = this.source.next()) === -1) {\n          if (this.inputBits === 0) {\n            return ccittEOF;\n          }\n          return ((this.inputBuf << (n - this.inputBits)) &\n                  (0xFFFF >> (16 - n)));\n        }\n        this.inputBuf = (this.inputBuf << 8) | c;\n        this.inputBits += 8;\n      }\n      return (this.inputBuf >> (this.inputBits - n)) & (0xFFFF >> (16 - n));\n    },\n\n    /**\n     * @private\n     */\n    _eatBits(n) {\n      if ((this.inputBits -= n) < 0) {\n        this.inputBits = 0;\n      }\n    },\n  };\n\n  return CCITTFaxDecoder;\n})();\n\nexport {\n  CCITTFaxDecoder,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { isDict, isStream } from './primitives';\nimport { DecodeStream } from './stream';\nimport { Jbig2Image } from './jbig2';\nimport { shadow } from '../shared/util';\n\n/**\n * For JBIG2's we use a library to decode these images and\n * the stream behaves like all the other DecodeStreams.\n */\nlet Jbig2Stream = (function Jbig2StreamClosure() {\n  function Jbig2Stream(stream, maybeLength, dict, params) {\n    this.stream = stream;\n    this.maybeLength = maybeLength;\n    this.dict = dict;\n    this.params = params;\n\n    DecodeStream.call(this, maybeLength);\n  }\n\n  Jbig2Stream.prototype = Object.create(DecodeStream.prototype);\n\n  Object.defineProperty(Jbig2Stream.prototype, 'bytes', {\n    get() {\n      // If `this.maybeLength` is null, we'll get the entire stream.\n      return shadow(this, 'bytes', this.stream.getBytes(this.maybeLength));\n    },\n    configurable: true,\n  });\n\n  Jbig2Stream.prototype.ensureBuffer = function(requested) {\n    // No-op, since `this.readBlock` will always parse the entire image and\n    // directly insert all of its data into `this.buffer`.\n  };\n\n  Jbig2Stream.prototype.readBlock = function() {\n    if (this.eof) {\n      return;\n    }\n    let jbig2Image = new Jbig2Image();\n\n    let chunks = [];\n    if (isDict(this.params)) {\n      let globalsStream = this.params.get('JBIG2Globals');\n      if (isStream(globalsStream)) {\n        let globals = globalsStream.getBytes();\n        chunks.push({ data: globals, start: 0, end: globals.length, });\n      }\n    }\n    chunks.push({ data: this.bytes, start: 0, end: this.bytes.length, });\n    let data = jbig2Image.parseChunks(chunks);\n    let dataLength = data.length;\n\n    // JBIG2 had black as 1 and white as 0, inverting the colors\n    for (let i = 0; i < dataLength; i++) {\n      data[i] ^= 0xFF;\n    }\n    this.buffer = data;\n    this.bufferLength = dataLength;\n    this.eof = true;\n  };\n\n  return Jbig2Stream;\n})();\n\nexport {\n  Jbig2Stream,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { log2, readInt8, readUint16, readUint32, shadow } from '../shared/util';\nimport { ArithmeticDecoder } from './arithmetic_decoder';\nimport { CCITTFaxDecoder } from './ccitt';\n\nlet Jbig2Error = (function Jbig2ErrorClosure() {\n  function Jbig2Error(msg) {\n    this.message = 'JBIG2 error: ' + msg;\n  }\n\n  Jbig2Error.prototype = new Error();\n  Jbig2Error.prototype.name = 'Jbig2Error';\n  Jbig2Error.constructor = Jbig2Error;\n\n  return Jbig2Error;\n})();\n\nvar Jbig2Image = (function Jbig2ImageClosure() {\n  // Utility data structures\n  function ContextCache() {}\n\n  ContextCache.prototype = {\n    getContexts(id) {\n      if (id in this) {\n        return this[id];\n      }\n      return (this[id] = new Int8Array(1 << 16));\n    },\n  };\n\n  function DecodingContext(data, start, end) {\n    this.data = data;\n    this.start = start;\n    this.end = end;\n  }\n\n  DecodingContext.prototype = {\n    get decoder() {\n      var decoder = new ArithmeticDecoder(this.data, this.start, this.end);\n      return shadow(this, 'decoder', decoder);\n    },\n    get contextCache() {\n      var cache = new ContextCache();\n      return shadow(this, 'contextCache', cache);\n    },\n  };\n\n  // Annex A. Arithmetic Integer Decoding Procedure\n  // A.2 Procedure for decoding values\n  function decodeInteger(contextCache, procedure, decoder) {\n    var contexts = contextCache.getContexts(procedure);\n    var prev = 1;\n\n    function readBits(length) {\n      var v = 0;\n      for (var i = 0; i < length; i++) {\n        var bit = decoder.readBit(contexts, prev);\n        prev = (prev < 256 ? (prev << 1) | bit :\n                (((prev << 1) | bit) & 511) | 256);\n        v = (v << 1) | bit;\n      }\n      return v >>> 0;\n    }\n\n    var sign = readBits(1);\n    var value = readBits(1) ?\n                  (readBits(1) ?\n                    (readBits(1) ?\n                      (readBits(1) ?\n                        (readBits(1) ?\n                          (readBits(32) + 4436) :\n                        readBits(12) + 340) :\n                      readBits(8) + 84) :\n                    readBits(6) + 20) :\n                  readBits(4) + 4) :\n                readBits(2);\n    return (sign === 0 ? value : (value > 0 ? -value : null));\n  }\n\n  // A.3 The IAID decoding procedure\n  function decodeIAID(contextCache, decoder, codeLength) {\n    var contexts = contextCache.getContexts('IAID');\n\n    var prev = 1;\n    for (var i = 0; i < codeLength; i++) {\n      var bit = decoder.readBit(contexts, prev);\n      prev = (prev << 1) | bit;\n    }\n    if (codeLength < 31) {\n      return prev & ((1 << codeLength) - 1);\n    }\n    return prev & 0x7FFFFFFF;\n  }\n\n  // 7.3 Segment types\n  var SegmentTypes = [\n    'SymbolDictionary', null, null, null, 'IntermediateTextRegion', null,\n    'ImmediateTextRegion', 'ImmediateLosslessTextRegion', null, null, null,\n    null, null, null, null, null, 'PatternDictionary', null, null, null,\n    'IntermediateHalftoneRegion', null, 'ImmediateHalftoneRegion',\n    'ImmediateLosslessHalftoneRegion', null, null, null, null, null, null, null,\n    null, null, null, null, null, 'IntermediateGenericRegion', null,\n    'ImmediateGenericRegion', 'ImmediateLosslessGenericRegion',\n    'IntermediateGenericRefinementRegion', null,\n    'ImmediateGenericRefinementRegion',\n    'ImmediateLosslessGenericRefinementRegion', null, null, null, null,\n    'PageInformation', 'EndOfPage', 'EndOfStripe', 'EndOfFile', 'Profiles',\n    'Tables', null, null, null, null, null, null, null, null,\n    'Extension'\n  ];\n\n  var CodingTemplates = [\n    [{ x: -1, y: -2, }, { x: 0, y: -2, }, { x: 1, y: -2, }, { x: -2, y: -1, },\n     { x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: 2, y: -1, },\n     { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, }, { x: -1, y: 0, }],\n    [{ x: -1, y: -2, }, { x: 0, y: -2, }, { x: 1, y: -2, }, { x: 2, y: -2, },\n     { x: -2, y: -1, }, { x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, },\n     { x: 2, y: -1, }, { x: -3, y: 0, }, { x: -2, y: 0, }, { x: -1, y: 0, }],\n    [{ x: -1, y: -2, }, { x: 0, y: -2, }, { x: 1, y: -2, }, { x: -2, y: -1, },\n     { x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, }, { x: -2, y: 0, },\n     { x: -1, y: 0, }],\n    [{ x: -3, y: -1, }, { x: -2, y: -1, }, { x: -1, y: -1, }, { x: 0, y: -1, },\n     { x: 1, y: -1, }, { x: -4, y: 0, }, { x: -3, y: 0, }, { x: -2, y: 0, },\n     { x: -1, y: 0, }]\n  ];\n\n  var RefinementTemplates = [\n    {\n      coding: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, }],\n      reference: [{ x: 0, y: -1, }, { x: 1, y: -1, }, { x: -1, y: 0, },\n                  { x: 0, y: 0, }, { x: 1, y: 0, }, { x: -1, y: 1, },\n                  { x: 0, y: 1, }, { x: 1, y: 1, }],\n    },\n    {\n      coding: [{ x: -1, y: -1, }, { x: 0, y: -1, }, { x: 1, y: -1, },\n               { x: -1, y: 0, }],\n      reference: [{ x: 0, y: -1, }, { x: -1, y: 0, }, { x: 0, y: 0, },\n                  { x: 1, y: 0, }, { x: 0, y: 1, }, { x: 1, y: 1, }],\n    }\n  ];\n\n  // See 6.2.5.7 Decoding the bitmap.\n  var ReusedContexts = [\n    0x9B25, // 10011 0110010 0101\n    0x0795, // 0011 110010 101\n    0x00E5, // 001 11001 01\n    0x0195  // 011001 0101\n  ];\n\n  var RefinementReusedContexts = [\n    0x0020, // '000' + '0' (coding) + '00010000' + '0' (reference)\n    0x0008  // '0000' + '001000'\n  ];\n\n  function decodeBitmapTemplate0(width, height, decodingContext) {\n    var decoder = decodingContext.decoder;\n    var contexts = decodingContext.contextCache.getContexts('GB');\n    var contextLabel, i, j, pixel, row, row1, row2, bitmap = [];\n\n    // ...ooooo....\n    // ..ooooooo... Context template for current pixel (X)\n    // .ooooX...... (concatenate values of 'o'-pixels to get contextLabel)\n    var OLD_PIXEL_MASK = 0x7BF7; // 01111 0111111 0111\n\n    for (i = 0; i < height; i++) {\n      row = bitmap[i] = new Uint8Array(width);\n      row1 = (i < 1) ? row : bitmap[i - 1];\n      row2 = (i < 2) ? row : bitmap[i - 2];\n\n      // At the beginning of each row:\n      // Fill contextLabel with pixels that are above/right of (X)\n      contextLabel = (row2[0] << 13) | (row2[1] << 12) | (row2[2] << 11) |\n                     (row1[0] << 7) | (row1[1] << 6) | (row1[2] << 5) |\n                     (row1[3] << 4);\n\n      for (j = 0; j < width; j++) {\n        row[j] = pixel = decoder.readBit(contexts, contextLabel);\n\n        // At each pixel: Clear contextLabel pixels that are shifted\n        // out of the context, then add new ones.\n        contextLabel = ((contextLabel & OLD_PIXEL_MASK) << 1) |\n                       (j + 3 < width ? row2[j + 3] << 11 : 0) |\n                       (j + 4 < width ? row1[j + 4] << 4 : 0) | pixel;\n      }\n    }\n\n    return bitmap;\n  }\n\n  // 6.2 Generic Region Decoding Procedure\n  function decodeBitmap(mmr, width, height, templateIndex, prediction, skip, at,\n                        decodingContext) {\n    if (mmr) {\n      let input = new Reader(decodingContext.data, decodingContext.start,\n        decodingContext.end);\n      return decodeMMRBitmap(input, width, height, false);\n    }\n\n    // Use optimized version for the most common case\n    if (templateIndex === 0 && !skip && !prediction && at.length === 4 &&\n        at[0].x === 3 && at[0].y === -1 && at[1].x === -3 && at[1].y === -1 &&\n        at[2].x === 2 && at[2].y === -2 && at[3].x === -2 && at[3].y === -2) {\n      return decodeBitmapTemplate0(width, height, decodingContext);\n    }\n\n    var useskip = !!skip;\n    var template = CodingTemplates[templateIndex].concat(at);\n\n    // Sorting is non-standard, and it is not required. But sorting increases\n    // the number of template bits that can be reused from the previous\n    // contextLabel in the main loop.\n    template.sort(function (a, b) {\n      return (a.y - b.y) || (a.x - b.x);\n    });\n\n    var templateLength = template.length;\n    var templateX = new Int8Array(templateLength);\n    var templateY = new Int8Array(templateLength);\n    var changingTemplateEntries = [];\n    var reuseMask = 0, minX = 0, maxX = 0, minY = 0;\n    var c, k;\n\n    for (k = 0; k < templateLength; k++) {\n      templateX[k] = template[k].x;\n      templateY[k] = template[k].y;\n      minX = Math.min(minX, template[k].x);\n      maxX = Math.max(maxX, template[k].x);\n      minY = Math.min(minY, template[k].y);\n      // Check if the template pixel appears in two consecutive context labels,\n      // so it can be reused. Otherwise, we add it to the list of changing\n      // template entries.\n      if (k < templateLength - 1 &&\n          template[k].y === template[k + 1].y &&\n          template[k].x === template[k + 1].x - 1) {\n        reuseMask |= 1 << (templateLength - 1 - k);\n      } else {\n        changingTemplateEntries.push(k);\n      }\n    }\n    var changingEntriesLength = changingTemplateEntries.length;\n\n    var changingTemplateX = new Int8Array(changingEntriesLength);\n    var changingTemplateY = new Int8Array(changingEntriesLength);\n    var changingTemplateBit = new Uint16Array(changingEntriesLength);\n    for (c = 0; c < changingEntriesLength; c++) {\n      k = changingTemplateEntries[c];\n      changingTemplateX[c] = template[k].x;\n      changingTemplateY[c] = template[k].y;\n      changingTemplateBit[c] = 1 << (templateLength - 1 - k);\n    }\n\n    // Get the safe bounding box edges from the width, height, minX, maxX, minY\n    var sbb_left = -minX;\n    var sbb_top = -minY;\n    var sbb_right = width - maxX;\n\n    var pseudoPixelContext = ReusedContexts[templateIndex];\n    var row = new Uint8Array(width);\n    var bitmap = [];\n\n    var decoder = decodingContext.decoder;\n    var contexts = decodingContext.contextCache.getContexts('GB');\n\n    var ltp = 0, j, i0, j0, contextLabel = 0, bit, shift;\n    for (var i = 0; i < height; i++) {\n      if (prediction) {\n        var sltp = decoder.readBit(contexts, pseudoPixelContext);\n        ltp ^= sltp;\n        if (ltp) {\n          bitmap.push(row); // duplicate previous row\n          continue;\n        }\n      }\n      row = new Uint8Array(row);\n      bitmap.push(row);\n      for (j = 0; j < width; j++) {\n        if (useskip && skip[i][j]) {\n          row[j] = 0;\n          continue;\n        }\n        // Are we in the middle of a scanline, so we can reuse contextLabel\n        // bits?\n        if (j >= sbb_left && j < sbb_right && i >= sbb_top) {\n          // If yes, we can just shift the bits that are reusable and only\n          // fetch the remaining ones.\n          contextLabel = (contextLabel << 1) & reuseMask;\n          for (k = 0; k < changingEntriesLength; k++) {\n            i0 = i + changingTemplateY[k];\n            j0 = j + changingTemplateX[k];\n            bit = bitmap[i0][j0];\n            if (bit) {\n              bit = changingTemplateBit[k];\n              contextLabel |= bit;\n            }\n          }\n        } else {\n          // compute the contextLabel from scratch\n          contextLabel = 0;\n          shift = templateLength - 1;\n          for (k = 0; k < templateLength; k++, shift--) {\n            j0 = j + templateX[k];\n            if (j0 >= 0 && j0 < width) {\n              i0 = i + templateY[k];\n              if (i0 >= 0) {\n                bit = bitmap[i0][j0];\n                if (bit) {\n                  contextLabel |= bit << shift;\n                }\n              }\n            }\n          }\n        }\n        var pixel = decoder.readBit(contexts, contextLabel);\n        row[j] = pixel;\n      }\n    }\n    return bitmap;\n  }\n\n  // 6.3.2 Generic Refinement Region Decoding Procedure\n  function decodeRefinement(width, height, templateIndex, referenceBitmap,\n                            offsetX, offsetY, prediction, at,\n                            decodingContext) {\n    var codingTemplate = RefinementTemplates[templateIndex].coding;\n    if (templateIndex === 0) {\n      codingTemplate = codingTemplate.concat([at[0]]);\n    }\n    var codingTemplateLength = codingTemplate.length;\n    var codingTemplateX = new Int32Array(codingTemplateLength);\n    var codingTemplateY = new Int32Array(codingTemplateLength);\n    var k;\n    for (k = 0; k < codingTemplateLength; k++) {\n      codingTemplateX[k] = codingTemplate[k].x;\n      codingTemplateY[k] = codingTemplate[k].y;\n    }\n\n    var referenceTemplate = RefinementTemplates[templateIndex].reference;\n    if (templateIndex === 0) {\n      referenceTemplate = referenceTemplate.concat([at[1]]);\n    }\n    var referenceTemplateLength = referenceTemplate.length;\n    var referenceTemplateX = new Int32Array(referenceTemplateLength);\n    var referenceTemplateY = new Int32Array(referenceTemplateLength);\n    for (k = 0; k < referenceTemplateLength; k++) {\n      referenceTemplateX[k] = referenceTemplate[k].x;\n      referenceTemplateY[k] = referenceTemplate[k].y;\n    }\n    var referenceWidth = referenceBitmap[0].length;\n    var referenceHeight = referenceBitmap.length;\n\n    var pseudoPixelContext = RefinementReusedContexts[templateIndex];\n    var bitmap = [];\n\n    var decoder = decodingContext.decoder;\n    var contexts = decodingContext.contextCache.getContexts('GR');\n\n    var ltp = 0;\n    for (var i = 0; i < height; i++) {\n      if (prediction) {\n        var sltp = decoder.readBit(contexts, pseudoPixelContext);\n        ltp ^= sltp;\n        if (ltp) {\n          throw new Jbig2Error('prediction is not supported');\n        }\n      }\n      var row = new Uint8Array(width);\n      bitmap.push(row);\n      for (var j = 0; j < width; j++) {\n        var i0, j0;\n        var contextLabel = 0;\n        for (k = 0; k < codingTemplateLength; k++) {\n          i0 = i + codingTemplateY[k];\n          j0 = j + codingTemplateX[k];\n          if (i0 < 0 || j0 < 0 || j0 >= width) {\n            contextLabel <<= 1; // out of bound pixel\n          } else {\n            contextLabel = (contextLabel << 1) | bitmap[i0][j0];\n          }\n        }\n        for (k = 0; k < referenceTemplateLength; k++) {\n          i0 = i + referenceTemplateY[k] - offsetY;\n          j0 = j + referenceTemplateX[k] - offsetX;\n          if (i0 < 0 || i0 >= referenceHeight || j0 < 0 ||\n              j0 >= referenceWidth) {\n            contextLabel <<= 1; // out of bound pixel\n          } else {\n            contextLabel = (contextLabel << 1) | referenceBitmap[i0][j0];\n          }\n        }\n        var pixel = decoder.readBit(contexts, contextLabel);\n        row[j] = pixel;\n      }\n    }\n\n    return bitmap;\n  }\n\n  // 6.5.5 Decoding the symbol dictionary\n  function decodeSymbolDictionary(huffman, refinement, symbols,\n                                  numberOfNewSymbols, numberOfExportedSymbols,\n                                  huffmanTables, templateIndex, at,\n                                  refinementTemplateIndex, refinementAt,\n                                  decodingContext, huffmanInput) {\n    if (huffman && refinement) {\n      throw new Jbig2Error('symbol refinement with Huffman is not supported');\n    }\n\n    var newSymbols = [];\n    var currentHeight = 0;\n    var symbolCodeLength = log2(symbols.length + numberOfNewSymbols);\n\n    var decoder = decodingContext.decoder;\n    var contextCache = decodingContext.contextCache;\n    let tableB1, symbolWidths;\n    if (huffman) {\n      tableB1 = getStandardTable(1); // standard table B.1\n      symbolWidths = [];\n      symbolCodeLength = Math.max(symbolCodeLength, 1); // 6.5.8.2.3\n    }\n\n    while (newSymbols.length < numberOfNewSymbols) {\n      var deltaHeight = huffman ?\n        huffmanTables.tableDeltaHeight.decode(huffmanInput) :\n        decodeInteger(contextCache, 'IADH', decoder); // 6.5.6\n      currentHeight += deltaHeight;\n      let currentWidth = 0, totalWidth = 0;\n      let firstSymbol = huffman ? symbolWidths.length : 0;\n      while (true) {\n        var deltaWidth = huffman ?\n          huffmanTables.tableDeltaWidth.decode(huffmanInput) :\n          decodeInteger(contextCache, 'IADW', decoder); // 6.5.7\n        if (deltaWidth === null) {\n          break; // OOB\n        }\n        currentWidth += deltaWidth;\n        totalWidth += currentWidth;\n        var bitmap;\n        if (refinement) {\n          // 6.5.8.2 Refinement/aggregate-coded symbol bitmap\n          var numberOfInstances = decodeInteger(contextCache, 'IAAI', decoder);\n          if (numberOfInstances > 1) {\n            bitmap = decodeTextRegion(huffman, refinement,\n                                      currentWidth, currentHeight, 0,\n                                      numberOfInstances, 1, // strip size\n                                      symbols.concat(newSymbols),\n                                      symbolCodeLength,\n                                      0, // transposed\n                                      0, // ds offset\n                                      1, // top left 7.4.3.1.1\n                                      0, // OR operator\n                                      huffmanTables,\n                                      refinementTemplateIndex, refinementAt,\n                                      decodingContext, 0, huffmanInput);\n          } else {\n            var symbolId = decodeIAID(contextCache, decoder, symbolCodeLength);\n            var rdx = decodeInteger(contextCache, 'IARDX', decoder); // 6.4.11.3\n            var rdy = decodeInteger(contextCache, 'IARDY', decoder); // 6.4.11.4\n            var symbol = (symbolId < symbols.length ? symbols[symbolId] :\n                          newSymbols[symbolId - symbols.length]);\n            bitmap = decodeRefinement(currentWidth, currentHeight,\n            refinementTemplateIndex, symbol, rdx, rdy, false, refinementAt,\n            decodingContext);\n          }\n          newSymbols.push(bitmap);\n        } else if (huffman) {\n          // Store only symbol width and decode a collective bitmap when the\n          // height class is done.\n          symbolWidths.push(currentWidth);\n        } else {\n          // 6.5.8.1 Direct-coded symbol bitmap\n          bitmap = decodeBitmap(false, currentWidth, currentHeight,\n            templateIndex, false, null, at, decodingContext);\n          newSymbols.push(bitmap);\n        }\n      }\n      if (huffman && !refinement) {\n        // 6.5.9 Height class collective bitmap\n        let bitmapSize = huffmanTables.tableBitmapSize.decode(huffmanInput);\n        huffmanInput.byteAlign();\n        let collectiveBitmap;\n        if (bitmapSize === 0) {\n          // Uncompressed collective bitmap\n          collectiveBitmap = readUncompressedBitmap(huffmanInput, totalWidth,\n            currentHeight);\n        } else {\n          // MMR collective bitmap\n          let originalEnd = huffmanInput.end;\n          let bitmapEnd = huffmanInput.position + bitmapSize;\n          huffmanInput.end = bitmapEnd;\n          collectiveBitmap = decodeMMRBitmap(huffmanInput, totalWidth,\n            currentHeight, false);\n          huffmanInput.end = originalEnd;\n          huffmanInput.position = bitmapEnd;\n        }\n        let numberOfSymbolsDecoded = symbolWidths.length;\n        if (firstSymbol === numberOfSymbolsDecoded - 1) {\n          // collectiveBitmap is a single symbol.\n          newSymbols.push(collectiveBitmap);\n        } else {\n          // Divide collectiveBitmap into symbols.\n          let i, y, xMin = 0, xMax, bitmapWidth, symbolBitmap;\n          for (i = firstSymbol; i < numberOfSymbolsDecoded; i++) {\n            bitmapWidth = symbolWidths[i];\n            xMax = xMin + bitmapWidth;\n            symbolBitmap = [];\n            for (y = 0; y < currentHeight; y++) {\n              symbolBitmap.push(collectiveBitmap[y].subarray(xMin, xMax));\n            }\n            newSymbols.push(symbolBitmap);\n            xMin = xMax;\n          }\n        }\n      }\n    }\n\n    // 6.5.10 Exported symbols\n    var exportedSymbols = [];\n    var flags = [], currentFlag = false;\n    var totalSymbolsLength = symbols.length + numberOfNewSymbols;\n    while (flags.length < totalSymbolsLength) {\n      var runLength = huffman ? tableB1.decode(huffmanInput) :\n        decodeInteger(contextCache, 'IAEX', decoder);\n      while (runLength--) {\n        flags.push(currentFlag);\n      }\n      currentFlag = !currentFlag;\n    }\n    for (var i = 0, ii = symbols.length; i < ii; i++) {\n      if (flags[i]) {\n        exportedSymbols.push(symbols[i]);\n      }\n    }\n    for (var j = 0; j < numberOfNewSymbols; i++, j++) {\n      if (flags[i]) {\n        exportedSymbols.push(newSymbols[j]);\n      }\n    }\n    return exportedSymbols;\n  }\n\n  function decodeTextRegion(huffman, refinement, width, height,\n                            defaultPixelValue, numberOfSymbolInstances,\n                            stripSize, inputSymbols, symbolCodeLength,\n                            transposed, dsOffset, referenceCorner,\n                            combinationOperator, huffmanTables,\n                            refinementTemplateIndex, refinementAt,\n                            decodingContext, logStripSize, huffmanInput) {\n    if (huffman && refinement) {\n      throw new Jbig2Error('refinement with Huffman is not supported');\n    }\n\n    // Prepare bitmap\n    var bitmap = [];\n    var i, row;\n    for (i = 0; i < height; i++) {\n      row = new Uint8Array(width);\n      if (defaultPixelValue) {\n        for (var j = 0; j < width; j++) {\n          row[j] = defaultPixelValue;\n        }\n      }\n      bitmap.push(row);\n    }\n\n    var decoder = decodingContext.decoder;\n    var contextCache = decodingContext.contextCache;\n\n    var stripT = huffman ? -huffmanTables.tableDeltaT.decode(huffmanInput) :\n      -decodeInteger(contextCache, 'IADT', decoder); // 6.4.6\n    var firstS = 0;\n    i = 0;\n    while (i < numberOfSymbolInstances) {\n      var deltaT = huffman ? huffmanTables.tableDeltaT.decode(huffmanInput) :\n        decodeInteger(contextCache, 'IADT', decoder); // 6.4.6\n      stripT += deltaT;\n\n      var deltaFirstS = huffman ?\n        huffmanTables.tableFirstS.decode(huffmanInput) :\n        decodeInteger(contextCache, 'IAFS', decoder); // 6.4.7\n      firstS += deltaFirstS;\n      var currentS = firstS;\n      do {\n        let currentT = 0; // 6.4.9\n        if (stripSize > 1) {\n          currentT = huffman ? huffmanInput.readBits(logStripSize) :\n            decodeInteger(contextCache, 'IAIT', decoder);\n        }\n        var t = stripSize * stripT + currentT;\n        var symbolId = huffman ?\n          huffmanTables.symbolIDTable.decode(huffmanInput) :\n          decodeIAID(contextCache, decoder, symbolCodeLength);\n        var applyRefinement = (refinement && (huffman ? huffmanInput.readBit() :\n          decodeInteger(contextCache, 'IARI', decoder)));\n        var symbolBitmap = inputSymbols[symbolId];\n        var symbolWidth = symbolBitmap[0].length;\n        var symbolHeight = symbolBitmap.length;\n        if (applyRefinement) {\n          var rdw = decodeInteger(contextCache, 'IARDW', decoder); // 6.4.11.1\n          var rdh = decodeInteger(contextCache, 'IARDH', decoder); // 6.4.11.2\n          var rdx = decodeInteger(contextCache, 'IARDX', decoder); // 6.4.11.3\n          var rdy = decodeInteger(contextCache, 'IARDY', decoder); // 6.4.11.4\n          symbolWidth += rdw;\n          symbolHeight += rdh;\n          symbolBitmap = decodeRefinement(symbolWidth, symbolHeight,\n            refinementTemplateIndex, symbolBitmap, (rdw >> 1) + rdx,\n            (rdh >> 1) + rdy, false, refinementAt,\n            decodingContext);\n        }\n        var offsetT = t - ((referenceCorner & 1) ? 0 : (symbolHeight - 1));\n        var offsetS = currentS -\n          ((referenceCorner & 2) ? (symbolWidth - 1) : 0);\n        var s2, t2, symbolRow;\n        if (transposed) {\n          // Place Symbol Bitmap from T1,S1\n          for (s2 = 0; s2 < symbolHeight; s2++) {\n            row = bitmap[offsetS + s2];\n            if (!row) {\n              continue;\n            }\n            symbolRow = symbolBitmap[s2];\n            // To ignore Parts of Symbol bitmap which goes\n            // outside bitmap region\n            var maxWidth = Math.min(width - offsetT, symbolWidth);\n            switch (combinationOperator) {\n              case 0: // OR\n                for (t2 = 0; t2 < maxWidth; t2++) {\n                  row[offsetT + t2] |= symbolRow[t2];\n                }\n                break;\n              case 2: // XOR\n                for (t2 = 0; t2 < maxWidth; t2++) {\n                  row[offsetT + t2] ^= symbolRow[t2];\n                }\n                break;\n              default:\n                throw new Jbig2Error(\n                  `operator ${combinationOperator} is not supported`);\n            }\n          }\n          currentS += symbolHeight - 1;\n        } else {\n          for (t2 = 0; t2 < symbolHeight; t2++) {\n            row = bitmap[offsetT + t2];\n            if (!row) {\n              continue;\n            }\n            symbolRow = symbolBitmap[t2];\n            switch (combinationOperator) {\n              case 0: // OR\n                for (s2 = 0; s2 < symbolWidth; s2++) {\n                  row[offsetS + s2] |= symbolRow[s2];\n                }\n                break;\n              case 2: // XOR\n                for (s2 = 0; s2 < symbolWidth; s2++) {\n                  row[offsetS + s2] ^= symbolRow[s2];\n                }\n                break;\n              default:\n                throw new Jbig2Error(\n                  `operator ${combinationOperator} is not supported`);\n            }\n          }\n          currentS += symbolWidth - 1;\n        }\n        i++;\n        var deltaS = huffman ? huffmanTables.tableDeltaS.decode(huffmanInput) :\n          decodeInteger(contextCache, 'IADS', decoder); // 6.4.8\n        if (deltaS === null) {\n          break; // OOB\n        }\n        currentS += deltaS + dsOffset;\n      } while (true);\n    }\n    return bitmap;\n  }\n\n  function decodePatternDictionary(mmr, patternWidth, patternHeight,\n                                   maxPatternIndex, template, decodingContext) {\n    let at = [];\n    if (!mmr) {\n      at.push({\n        x: -patternWidth,\n        y: 0,\n      });\n      if (template === 0) {\n        at.push({\n          x: -3,\n          y: -1,\n        });\n        at.push({\n          x: 2,\n          y: -2,\n        });\n        at.push({\n          x: -2,\n          y: -2,\n        });\n      }\n    }\n    let collectiveWidth = (maxPatternIndex + 1) * patternWidth;\n    let collectiveBitmap = decodeBitmap(mmr, collectiveWidth, patternHeight,\n                                        template, false, null, at,\n                                        decodingContext);\n    // Divide collective bitmap into patterns.\n    let patterns = [], i = 0, patternBitmap, xMin, xMax, y;\n    while (i <= maxPatternIndex) {\n      patternBitmap = [];\n      xMin = patternWidth * i;\n      xMax = xMin + patternWidth;\n      for (y = 0; y < patternHeight; y++) {\n        patternBitmap.push(collectiveBitmap[y].subarray(xMin, xMax));\n      }\n      patterns.push(patternBitmap);\n      i++;\n    }\n    return patterns;\n  }\n\n  function decodeHalftoneRegion(mmr, patterns, template, regionWidth,\n                                regionHeight, defaultPixelValue, enableSkip,\n                                combinationOperator, gridWidth, gridHeight,\n                                gridOffsetX, gridOffsetY, gridVectorX,\n                                gridVectorY, decodingContext) {\n    let skip = null;\n    if (enableSkip) {\n      throw new Jbig2Error('skip is not supported');\n    }\n    if (combinationOperator !== 0) {\n      throw new Jbig2Error('operator ' + combinationOperator +\n        ' is not supported in halftone region');\n    }\n\n    // Prepare bitmap.\n    let regionBitmap = [];\n    let i, j, row;\n    for (i = 0; i < regionHeight; i++) {\n      row = new Uint8Array(regionWidth);\n      if (defaultPixelValue) {\n        for (j = 0; j < regionWidth; j++) {\n          row[j] = defaultPixelValue;\n        }\n      }\n      regionBitmap.push(row);\n    }\n\n    let numberOfPatterns = patterns.length;\n    let pattern0 = patterns[0];\n    let patternWidth = pattern0[0].length, patternHeight = pattern0.length;\n    let bitsPerValue = log2(numberOfPatterns);\n    let at = [];\n    if (!mmr) {\n      at.push({\n        x: (template <= 1) ? 3 : 2,\n        y: -1,\n      });\n      if (template === 0) {\n        at.push({\n          x: -3,\n          y: -1,\n        });\n        at.push({\n          x: 2,\n          y: -2,\n        });\n        at.push({\n          x: -2,\n          y: -2,\n        });\n      }\n    }\n    // Annex C. Gray-scale Image Decoding Procedure.\n    let grayScaleBitPlanes = [], mmrInput, bitmap;\n    if (mmr) {\n      // MMR bit planes are in one continuous stream. Only EOFB codes indicate\n      // the end of each bitmap, so EOFBs must be decoded.\n      mmrInput = new Reader(decodingContext.data, decodingContext.start,\n        decodingContext.end);\n    }\n    for (i = bitsPerValue - 1; i >= 0; i--) {\n      if (mmr) {\n        bitmap = decodeMMRBitmap(mmrInput, gridWidth, gridHeight, true);\n      } else {\n        bitmap = decodeBitmap(false, gridWidth, gridHeight, template, false,\n          skip, at, decodingContext);\n      }\n      grayScaleBitPlanes[i] = bitmap;\n    }\n    // 6.6.5.2 Rendering the patterns.\n    let mg, ng, bit, patternIndex, patternBitmap, x, y, patternRow, regionRow;\n    for (mg = 0; mg < gridHeight; mg++) {\n      for (ng = 0; ng < gridWidth; ng++) {\n        bit = 0;\n        patternIndex = 0;\n        for (j = bitsPerValue - 1; j >= 0; j--) {\n          bit = grayScaleBitPlanes[j][mg][ng] ^ bit; // Gray decoding\n          patternIndex |= bit << j;\n        }\n        patternBitmap = patterns[patternIndex];\n        x = (gridOffsetX + mg * gridVectorY + ng * gridVectorX) >> 8;\n        y = (gridOffsetY + mg * gridVectorX - ng * gridVectorY) >> 8;\n        // Draw patternBitmap at (x, y).\n        if (x >= 0 && x + patternWidth <= regionWidth && y >= 0 &&\n            y + patternHeight <= regionHeight) {\n          for (i = 0; i < patternHeight; i++) {\n            regionRow = regionBitmap[y + i];\n            patternRow = patternBitmap[i];\n            for (j = 0; j < patternWidth; j++) {\n              regionRow[x + j] |= patternRow[j];\n            }\n          }\n        } else {\n          let regionX, regionY;\n          for (i = 0; i < patternHeight; i++) {\n            regionY = y + i;\n            if (regionY < 0 || regionY >= regionHeight) {\n              continue;\n            }\n            regionRow = regionBitmap[regionY];\n            patternRow = patternBitmap[i];\n            for (j = 0; j < patternWidth; j++) {\n              regionX = x + j;\n              if (regionX >= 0 && regionX < regionWidth) {\n                regionRow[regionX] |= patternRow[j];\n              }\n            }\n          }\n        }\n      }\n    }\n    return regionBitmap;\n  }\n\n  function readSegmentHeader(data, start) {\n    var segmentHeader = {};\n    segmentHeader.number = readUint32(data, start);\n    var flags = data[start + 4];\n    var segmentType = flags & 0x3F;\n    if (!SegmentTypes[segmentType]) {\n      throw new Jbig2Error('invalid segment type: ' + segmentType);\n    }\n    segmentHeader.type = segmentType;\n    segmentHeader.typeName = SegmentTypes[segmentType];\n    segmentHeader.deferredNonRetain = !!(flags & 0x80);\n\n    var pageAssociationFieldSize = !!(flags & 0x40);\n    var referredFlags = data[start + 5];\n    var referredToCount = (referredFlags >> 5) & 7;\n    var retainBits = [referredFlags & 31];\n    var position = start + 6;\n    if (referredFlags === 7) {\n      referredToCount = readUint32(data, position - 1) & 0x1FFFFFFF;\n      position += 3;\n      var bytes = (referredToCount + 7) >> 3;\n      retainBits[0] = data[position++];\n      while (--bytes > 0) {\n        retainBits.push(data[position++]);\n      }\n    } else if (referredFlags === 5 || referredFlags === 6) {\n      throw new Jbig2Error('invalid referred-to flags');\n    }\n\n    segmentHeader.retainBits = retainBits;\n    var referredToSegmentNumberSize = (segmentHeader.number <= 256 ? 1 :\n      (segmentHeader.number <= 65536 ? 2 : 4));\n    var referredTo = [];\n    var i, ii;\n    for (i = 0; i < referredToCount; i++) {\n      var number = (referredToSegmentNumberSize === 1 ? data[position] :\n        (referredToSegmentNumberSize === 2 ? readUint16(data, position) :\n        readUint32(data, position)));\n      referredTo.push(number);\n      position += referredToSegmentNumberSize;\n    }\n    segmentHeader.referredTo = referredTo;\n    if (!pageAssociationFieldSize) {\n      segmentHeader.pageAssociation = data[position++];\n    } else {\n      segmentHeader.pageAssociation = readUint32(data, position);\n      position += 4;\n    }\n    segmentHeader.length = readUint32(data, position);\n    position += 4;\n\n    if (segmentHeader.length === 0xFFFFFFFF) {\n      // 7.2.7 Segment data length, unknown segment length\n      if (segmentType === 38) { // ImmediateGenericRegion\n        var genericRegionInfo = readRegionSegmentInformation(data, position);\n        var genericRegionSegmentFlags = data[position +\n          RegionSegmentInformationFieldLength];\n        var genericRegionMmr = !!(genericRegionSegmentFlags & 1);\n        // searching for the segment end\n        var searchPatternLength = 6;\n        var searchPattern = new Uint8Array(searchPatternLength);\n        if (!genericRegionMmr) {\n          searchPattern[0] = 0xFF;\n          searchPattern[1] = 0xAC;\n        }\n        searchPattern[2] = (genericRegionInfo.height >>> 24) & 0xFF;\n        searchPattern[3] = (genericRegionInfo.height >> 16) & 0xFF;\n        searchPattern[4] = (genericRegionInfo.height >> 8) & 0xFF;\n        searchPattern[5] = genericRegionInfo.height & 0xFF;\n        for (i = position, ii = data.length; i < ii; i++) {\n          var j = 0;\n          while (j < searchPatternLength && searchPattern[j] === data[i + j]) {\n            j++;\n          }\n          if (j === searchPatternLength) {\n            segmentHeader.length = i + searchPatternLength;\n            break;\n          }\n        }\n        if (segmentHeader.length === 0xFFFFFFFF) {\n          throw new Jbig2Error('segment end was not found');\n        }\n      } else {\n        throw new Jbig2Error('invalid unknown segment length');\n      }\n    }\n    segmentHeader.headerEnd = position;\n    return segmentHeader;\n  }\n\n  function readSegments(header, data, start, end) {\n    var segments = [];\n    var position = start;\n    while (position < end) {\n      var segmentHeader = readSegmentHeader(data, position);\n      position = segmentHeader.headerEnd;\n      var segment = {\n        header: segmentHeader,\n        data,\n      };\n      if (!header.randomAccess) {\n        segment.start = position;\n        position += segmentHeader.length;\n        segment.end = position;\n      }\n      segments.push(segment);\n      if (segmentHeader.type === 51) {\n        break; // end of file is found\n      }\n    }\n    if (header.randomAccess) {\n      for (var i = 0, ii = segments.length; i < ii; i++) {\n        segments[i].start = position;\n        position += segments[i].header.length;\n        segments[i].end = position;\n      }\n    }\n    return segments;\n  }\n\n  // 7.4.1 Region segment information field\n  function readRegionSegmentInformation(data, start) {\n    return {\n      width: readUint32(data, start),\n      height: readUint32(data, start + 4),\n      x: readUint32(data, start + 8),\n      y: readUint32(data, start + 12),\n      combinationOperator: data[start + 16] & 7,\n    };\n  }\n  var RegionSegmentInformationFieldLength = 17;\n\n  function processSegment(segment, visitor) {\n    var header = segment.header;\n\n    var data = segment.data, position = segment.start, end = segment.end;\n    var args, at, i, atLength;\n    switch (header.type) {\n      case 0: // SymbolDictionary\n        // 7.4.2 Symbol dictionary segment syntax\n        var dictionary = {};\n        var dictionaryFlags = readUint16(data, position); // 7.4.2.1.1\n        dictionary.huffman = !!(dictionaryFlags & 1);\n        dictionary.refinement = !!(dictionaryFlags & 2);\n        dictionary.huffmanDHSelector = (dictionaryFlags >> 2) & 3;\n        dictionary.huffmanDWSelector = (dictionaryFlags >> 4) & 3;\n        dictionary.bitmapSizeSelector = (dictionaryFlags >> 6) & 1;\n        dictionary.aggregationInstancesSelector = (dictionaryFlags >> 7) & 1;\n        dictionary.bitmapCodingContextUsed = !!(dictionaryFlags & 256);\n        dictionary.bitmapCodingContextRetained = !!(dictionaryFlags & 512);\n        dictionary.template = (dictionaryFlags >> 10) & 3;\n        dictionary.refinementTemplate = (dictionaryFlags >> 12) & 1;\n        position += 2;\n        if (!dictionary.huffman) {\n          atLength = dictionary.template === 0 ? 4 : 1;\n          at = [];\n          for (i = 0; i < atLength; i++) {\n            at.push({\n              x: readInt8(data, position),\n              y: readInt8(data, position + 1),\n            });\n            position += 2;\n          }\n          dictionary.at = at;\n        }\n        if (dictionary.refinement && !dictionary.refinementTemplate) {\n          at = [];\n          for (i = 0; i < 2; i++) {\n            at.push({\n              x: readInt8(data, position),\n              y: readInt8(data, position + 1),\n            });\n            position += 2;\n          }\n          dictionary.refinementAt = at;\n        }\n        dictionary.numberOfExportedSymbols = readUint32(data, position);\n        position += 4;\n        dictionary.numberOfNewSymbols = readUint32(data, position);\n        position += 4;\n        args = [dictionary, header.number, header.referredTo,\n                data, position, end];\n        break;\n      case 6: // ImmediateTextRegion\n      case 7: // ImmediateLosslessTextRegion\n        var textRegion = {};\n        textRegion.info = readRegionSegmentInformation(data, position);\n        position += RegionSegmentInformationFieldLength;\n        var textRegionSegmentFlags = readUint16(data, position);\n        position += 2;\n        textRegion.huffman = !!(textRegionSegmentFlags & 1);\n        textRegion.refinement = !!(textRegionSegmentFlags & 2);\n        textRegion.logStripSize = (textRegionSegmentFlags >> 2) & 3;\n        textRegion.stripSize = 1 << textRegion.logStripSize;\n        textRegion.referenceCorner = (textRegionSegmentFlags >> 4) & 3;\n        textRegion.transposed = !!(textRegionSegmentFlags & 64);\n        textRegion.combinationOperator = (textRegionSegmentFlags >> 7) & 3;\n        textRegion.defaultPixelValue = (textRegionSegmentFlags >> 9) & 1;\n        textRegion.dsOffset = (textRegionSegmentFlags << 17) >> 27;\n        textRegion.refinementTemplate = (textRegionSegmentFlags >> 15) & 1;\n        if (textRegion.huffman) {\n          var textRegionHuffmanFlags = readUint16(data, position);\n          position += 2;\n          textRegion.huffmanFS = (textRegionHuffmanFlags) & 3;\n          textRegion.huffmanDS = (textRegionHuffmanFlags >> 2) & 3;\n          textRegion.huffmanDT = (textRegionHuffmanFlags >> 4) & 3;\n          textRegion.huffmanRefinementDW = (textRegionHuffmanFlags >> 6) & 3;\n          textRegion.huffmanRefinementDH = (textRegionHuffmanFlags >> 8) & 3;\n          textRegion.huffmanRefinementDX = (textRegionHuffmanFlags >> 10) & 3;\n          textRegion.huffmanRefinementDY = (textRegionHuffmanFlags >> 12) & 3;\n          textRegion.huffmanRefinementSizeSelector =\n            !!(textRegionHuffmanFlags & 0x4000);\n        }\n        if (textRegion.refinement && !textRegion.refinementTemplate) {\n          at = [];\n          for (i = 0; i < 2; i++) {\n            at.push({\n              x: readInt8(data, position),\n              y: readInt8(data, position + 1),\n            });\n            position += 2;\n          }\n          textRegion.refinementAt = at;\n        }\n        textRegion.numberOfSymbolInstances = readUint32(data, position);\n        position += 4;\n        args = [textRegion, header.referredTo, data, position, end];\n        break;\n      case 16: // PatternDictionary\n        // 7.4.4. Pattern dictionary segment syntax\n        let patternDictionary = {};\n        let patternDictionaryFlags = data[position++];\n        patternDictionary.mmr = !!(patternDictionaryFlags & 1);\n        patternDictionary.template = (patternDictionaryFlags >> 1) & 3;\n        patternDictionary.patternWidth = data[position++];\n        patternDictionary.patternHeight = data[position++];\n        patternDictionary.maxPatternIndex = readUint32(data, position);\n        position += 4;\n        args = [patternDictionary, header.number, data, position, end];\n        break;\n      case 22: // ImmediateHalftoneRegion\n      case 23: // ImmediateLosslessHalftoneRegion\n        // 7.4.5 Halftone region segment syntax\n        let halftoneRegion = {};\n        halftoneRegion.info = readRegionSegmentInformation(data, position);\n        position += RegionSegmentInformationFieldLength;\n        let halftoneRegionFlags = data[position++];\n        halftoneRegion.mmr = !!(halftoneRegionFlags & 1);\n        halftoneRegion.template = (halftoneRegionFlags >> 1) & 3;\n        halftoneRegion.enableSkip = !!(halftoneRegionFlags & 8);\n        halftoneRegion.combinationOperator = (halftoneRegionFlags >> 4) & 7;\n        halftoneRegion.defaultPixelValue = (halftoneRegionFlags >> 7) & 1;\n        halftoneRegion.gridWidth = readUint32(data, position);\n        position += 4;\n        halftoneRegion.gridHeight = readUint32(data, position);\n        position += 4;\n        halftoneRegion.gridOffsetX = readUint32(data, position) & 0xFFFFFFFF;\n        position += 4;\n        halftoneRegion.gridOffsetY = readUint32(data, position) & 0xFFFFFFFF;\n        position += 4;\n        halftoneRegion.gridVectorX = readUint16(data, position);\n        position += 2;\n        halftoneRegion.gridVectorY = readUint16(data, position);\n        position += 2;\n        args = [halftoneRegion, header.referredTo, data, position, end];\n        break;\n      case 38: // ImmediateGenericRegion\n      case 39: // ImmediateLosslessGenericRegion\n        var genericRegion = {};\n        genericRegion.info = readRegionSegmentInformation(data, position);\n        position += RegionSegmentInformationFieldLength;\n        var genericRegionSegmentFlags = data[position++];\n        genericRegion.mmr = !!(genericRegionSegmentFlags & 1);\n        genericRegion.template = (genericRegionSegmentFlags >> 1) & 3;\n        genericRegion.prediction = !!(genericRegionSegmentFlags & 8);\n        if (!genericRegion.mmr) {\n          atLength = genericRegion.template === 0 ? 4 : 1;\n          at = [];\n          for (i = 0; i < atLength; i++) {\n            at.push({\n              x: readInt8(data, position),\n              y: readInt8(data, position + 1),\n            });\n            position += 2;\n          }\n          genericRegion.at = at;\n        }\n        args = [genericRegion, data, position, end];\n        break;\n      case 48: // PageInformation\n        var pageInfo = {\n          width: readUint32(data, position),\n          height: readUint32(data, position + 4),\n          resolutionX: readUint32(data, position + 8),\n          resolutionY: readUint32(data, position + 12),\n        };\n        if (pageInfo.height === 0xFFFFFFFF) {\n          delete pageInfo.height;\n        }\n        var pageSegmentFlags = data[position + 16];\n        readUint16(data, position + 17); // pageStripingInformation\n        pageInfo.lossless = !!(pageSegmentFlags & 1);\n        pageInfo.refinement = !!(pageSegmentFlags & 2);\n        pageInfo.defaultPixelValue = (pageSegmentFlags >> 2) & 1;\n        pageInfo.combinationOperator = (pageSegmentFlags >> 3) & 3;\n        pageInfo.requiresBuffer = !!(pageSegmentFlags & 32);\n        pageInfo.combinationOperatorOverride = !!(pageSegmentFlags & 64);\n        args = [pageInfo];\n        break;\n      case 49: // EndOfPage\n        break;\n      case 50: // EndOfStripe\n        break;\n      case 51: // EndOfFile\n        break;\n      case 53: // Tables\n        args = [header.number, data, position, end];\n        break;\n      case 62: // 7.4.15 defines 2 extension types which\n               // are comments and can be ignored.\n        break;\n      default:\n        throw new Jbig2Error(`segment type ${header.typeName}(${header.type})` +\n                             ' is not implemented');\n    }\n    var callbackName = 'on' + header.typeName;\n    if (callbackName in visitor) {\n      visitor[callbackName].apply(visitor, args);\n    }\n  }\n\n  function processSegments(segments, visitor) {\n    for (var i = 0, ii = segments.length; i < ii; i++) {\n      processSegment(segments[i], visitor);\n    }\n  }\n\n  function parseJbig2Chunks(chunks) {\n    var visitor = new SimpleSegmentVisitor();\n    for (var i = 0, ii = chunks.length; i < ii; i++) {\n      var chunk = chunks[i];\n      var segments = readSegments({}, chunk.data, chunk.start, chunk.end);\n      processSegments(segments, visitor);\n    }\n    return visitor.buffer;\n  }\n\n  function parseJbig2(data) {\n    let position = 0, end = data.length;\n\n    if (data[position] !== 0x97 || data[position + 1] !== 0x4A ||\n        data[position + 2] !== 0x42 || data[position + 3] !== 0x32 ||\n        data[position + 4] !== 0x0D || data[position + 5] !== 0x0A ||\n        data[position + 6] !== 0x1A || data[position + 7] !== 0x0A) {\n      throw new Jbig2Error('parseJbig2 - invalid header.');\n    }\n\n    let header = Object.create(null);\n    position += 8;\n    const flags = data[position++];\n    header.randomAccess = !(flags & 1);\n    if (!(flags & 2)) {\n      header.numberOfPages = readUint32(data, position);\n      position += 4;\n    }\n\n    let segments = readSegments(header, data, position, end);\n    let visitor = new SimpleSegmentVisitor();\n    processSegments(segments, visitor);\n\n    const { width, height, } = visitor.currentPageInfo;\n    const bitPacked = visitor.buffer;\n    let imgData = new Uint8ClampedArray(width * height);\n    let q = 0, k = 0;\n    for (let i = 0; i < height; i++) {\n      let mask = 0, buffer;\n      for (let j = 0; j < width; j++) {\n        if (!mask) {\n          mask = 128; buffer = bitPacked[k++];\n        }\n        imgData[q++] = (buffer & mask) ? 0 : 255;\n        mask >>= 1;\n      }\n    }\n\n    return { imgData, width, height, };\n  }\n\n  function SimpleSegmentVisitor() {}\n\n  SimpleSegmentVisitor.prototype = {\n    onPageInformation: function SimpleSegmentVisitor_onPageInformation(info) {\n      this.currentPageInfo = info;\n      var rowSize = (info.width + 7) >> 3;\n      var buffer = new Uint8ClampedArray(rowSize * info.height);\n      // The contents of ArrayBuffers are initialized to 0.\n      // Fill the buffer with 0xFF only if info.defaultPixelValue is set\n      if (info.defaultPixelValue) {\n        for (var i = 0, ii = buffer.length; i < ii; i++) {\n          buffer[i] = 0xFF;\n        }\n      }\n      this.buffer = buffer;\n    },\n    drawBitmap: function SimpleSegmentVisitor_drawBitmap(regionInfo, bitmap) {\n      var pageInfo = this.currentPageInfo;\n      var width = regionInfo.width, height = regionInfo.height;\n      var rowSize = (pageInfo.width + 7) >> 3;\n      var combinationOperator = pageInfo.combinationOperatorOverride ?\n        regionInfo.combinationOperator : pageInfo.combinationOperator;\n      var buffer = this.buffer;\n      var mask0 = 128 >> (regionInfo.x & 7);\n      var offset0 = regionInfo.y * rowSize + (regionInfo.x >> 3);\n      var i, j, mask, offset;\n      switch (combinationOperator) {\n        case 0: // OR\n          for (i = 0; i < height; i++) {\n            mask = mask0;\n            offset = offset0;\n            for (j = 0; j < width; j++) {\n              if (bitmap[i][j]) {\n                buffer[offset] |= mask;\n              }\n              mask >>= 1;\n              if (!mask) {\n                mask = 128;\n                offset++;\n              }\n            }\n            offset0 += rowSize;\n          }\n        break;\n        case 2: // XOR\n          for (i = 0; i < height; i++) {\n            mask = mask0;\n            offset = offset0;\n            for (j = 0; j < width; j++) {\n              if (bitmap[i][j]) {\n                buffer[offset] ^= mask;\n              }\n              mask >>= 1;\n              if (!mask) {\n                mask = 128;\n                offset++;\n              }\n            }\n            offset0 += rowSize;\n          }\n          break;\n        default:\n          throw new Jbig2Error(\n            `operator ${combinationOperator} is not supported`);\n      }\n    },\n    onImmediateGenericRegion:\n      function SimpleSegmentVisitor_onImmediateGenericRegion(region, data,\n                                                             start, end) {\n      var regionInfo = region.info;\n      var decodingContext = new DecodingContext(data, start, end);\n      var bitmap = decodeBitmap(region.mmr, regionInfo.width, regionInfo.height,\n                                region.template, region.prediction, null,\n                                region.at, decodingContext);\n      this.drawBitmap(regionInfo, bitmap);\n    },\n    onImmediateLosslessGenericRegion:\n      function SimpleSegmentVisitor_onImmediateLosslessGenericRegion() {\n      this.onImmediateGenericRegion.apply(this, arguments);\n    },\n    onSymbolDictionary:\n      function SimpleSegmentVisitor_onSymbolDictionary(dictionary,\n                                                       currentSegment,\n                                                       referredSegments,\n                                                       data, start, end) {\n      let huffmanTables, huffmanInput;\n      if (dictionary.huffman) {\n        huffmanTables = getSymbolDictionaryHuffmanTables(dictionary,\n          referredSegments, this.customTables);\n        huffmanInput = new Reader(data, start, end);\n      }\n\n      // Combines exported symbols from all referred segments\n      var symbols = this.symbols;\n      if (!symbols) {\n        this.symbols = symbols = {};\n      }\n\n      var inputSymbols = [];\n      for (var i = 0, ii = referredSegments.length; i < ii; i++) {\n        let referredSymbols = symbols[referredSegments[i]];\n        // referredSymbols is undefined when we have a reference to a Tables\n        // segment instead of a SymbolDictionary.\n        if (referredSymbols) {\n          inputSymbols = inputSymbols.concat(referredSymbols);\n        }\n      }\n\n      var decodingContext = new DecodingContext(data, start, end);\n      symbols[currentSegment] = decodeSymbolDictionary(dictionary.huffman,\n        dictionary.refinement, inputSymbols, dictionary.numberOfNewSymbols,\n        dictionary.numberOfExportedSymbols, huffmanTables,\n        dictionary.template, dictionary.at,\n        dictionary.refinementTemplate, dictionary.refinementAt,\n        decodingContext, huffmanInput);\n    },\n    onImmediateTextRegion:\n      function SimpleSegmentVisitor_onImmediateTextRegion(region,\n                                                          referredSegments,\n                                                          data, start, end) {\n      var regionInfo = region.info;\n      let huffmanTables, huffmanInput;\n\n      // Combines exported symbols from all referred segments\n      var symbols = this.symbols;\n      var inputSymbols = [];\n      for (var i = 0, ii = referredSegments.length; i < ii; i++) {\n        let referredSymbols = symbols[referredSegments[i]];\n        // referredSymbols is undefined when we have a reference to a Tables\n        // segment instead of a SymbolDictionary.\n        if (referredSymbols) {\n          inputSymbols = inputSymbols.concat(referredSymbols);\n        }\n      }\n      var symbolCodeLength = log2(inputSymbols.length);\n      if (region.huffman) {\n        huffmanInput = new Reader(data, start, end);\n        huffmanTables = getTextRegionHuffmanTables(region, referredSegments,\n          this.customTables, inputSymbols.length, huffmanInput);\n      }\n\n      var decodingContext = new DecodingContext(data, start, end);\n      var bitmap = decodeTextRegion(region.huffman, region.refinement,\n        regionInfo.width, regionInfo.height, region.defaultPixelValue,\n        region.numberOfSymbolInstances, region.stripSize, inputSymbols,\n        symbolCodeLength, region.transposed, region.dsOffset,\n        region.referenceCorner, region.combinationOperator, huffmanTables,\n        region.refinementTemplate, region.refinementAt, decodingContext,\n        region.logStripSize, huffmanInput);\n      this.drawBitmap(regionInfo, bitmap);\n    },\n    onImmediateLosslessTextRegion:\n      function SimpleSegmentVisitor_onImmediateLosslessTextRegion() {\n      this.onImmediateTextRegion.apply(this, arguments);\n    },\n    onPatternDictionary(dictionary, currentSegment, data, start, end) {\n      let patterns = this.patterns;\n      if (!patterns) {\n        this.patterns = patterns = {};\n      }\n      let decodingContext = new DecodingContext(data, start, end);\n      patterns[currentSegment] = decodePatternDictionary(dictionary.mmr,\n        dictionary.patternWidth, dictionary.patternHeight,\n        dictionary.maxPatternIndex, dictionary.template, decodingContext);\n    },\n    onImmediateHalftoneRegion(region, referredSegments, data, start, end) {\n      // HalftoneRegion refers to exactly one PatternDictionary.\n      let patterns = this.patterns[referredSegments[0]];\n      let regionInfo = region.info;\n      let decodingContext = new DecodingContext(data, start, end);\n      let bitmap = decodeHalftoneRegion(region.mmr, patterns,\n        region.template, regionInfo.width, regionInfo.height,\n        region.defaultPixelValue, region.enableSkip, region.combinationOperator,\n        region.gridWidth, region.gridHeight, region.gridOffsetX,\n        region.gridOffsetY, region.gridVectorX, region.gridVectorY,\n        decodingContext);\n      this.drawBitmap(regionInfo, bitmap);\n    },\n    onImmediateLosslessHalftoneRegion() {\n      this.onImmediateHalftoneRegion.apply(this, arguments);\n    },\n    onTables(currentSegment, data, start, end) {\n      let customTables = this.customTables;\n      if (!customTables) {\n        this.customTables = customTables = {};\n      }\n      customTables[currentSegment] = decodeTablesSegment(data, start, end);\n    },\n  };\n\n  function HuffmanLine(lineData) {\n    if (lineData.length === 2) {\n      // OOB line.\n      this.isOOB = true;\n      this.rangeLow = 0;\n      this.prefixLength = lineData[0];\n      this.rangeLength = 0;\n      this.prefixCode = lineData[1];\n      this.isLowerRange = false;\n    } else {\n      // Normal, upper range or lower range line.\n      // Upper range lines are processed like normal lines.\n      this.isOOB = false;\n      this.rangeLow = lineData[0];\n      this.prefixLength = lineData[1];\n      this.rangeLength = lineData[2];\n      this.prefixCode = lineData[3];\n      this.isLowerRange = (lineData[4] === 'lower');\n    }\n  }\n\n  function HuffmanTreeNode(line) {\n    this.children = [];\n    if (line) {\n      // Leaf node\n      this.isLeaf = true;\n      this.rangeLength = line.rangeLength;\n      this.rangeLow = line.rangeLow;\n      this.isLowerRange = line.isLowerRange;\n      this.isOOB = line.isOOB;\n    } else {\n      // Intermediate or root node\n      this.isLeaf = false;\n    }\n  }\n\n  HuffmanTreeNode.prototype = {\n    buildTree(line, shift) {\n      let bit = (line.prefixCode >> shift) & 1;\n      if (shift <= 0) {\n        // Create a leaf node.\n        this.children[bit] = new HuffmanTreeNode(line);\n      } else {\n        // Create an intermediate node and continue recursively.\n        let node = this.children[bit];\n        if (!node) {\n          this.children[bit] = node = new HuffmanTreeNode(null);\n        }\n        node.buildTree(line, shift - 1);\n      }\n    },\n    decodeNode(reader) {\n      if (this.isLeaf) {\n        if (this.isOOB) {\n          return null;\n        }\n        let htOffset = reader.readBits(this.rangeLength);\n        return this.rangeLow + (this.isLowerRange ? -htOffset : htOffset);\n      }\n      let node = this.children[reader.readBit()];\n      if (!node) {\n        throw new Jbig2Error('invalid Huffman data');\n      }\n      return node.decodeNode(reader);\n    },\n  };\n\n  function HuffmanTable(lines, prefixCodesDone) {\n    if (!prefixCodesDone) {\n      this.assignPrefixCodes(lines);\n    }\n    // Create Huffman tree.\n    this.rootNode = new HuffmanTreeNode(null);\n    let i, ii = lines.length, line;\n    for (i = 0; i < ii; i++) {\n      line = lines[i];\n      if (line.prefixLength > 0) {\n        this.rootNode.buildTree(line, line.prefixLength - 1);\n      }\n    }\n  }\n\n  HuffmanTable.prototype = {\n    decode(reader) {\n      return this.rootNode.decodeNode(reader);\n    },\n    assignPrefixCodes(lines) {\n      // Annex B.3 Assigning the prefix codes.\n      let linesLength = lines.length, prefixLengthMax = 0, i;\n      for (i = 0; i < linesLength; i++) {\n        prefixLengthMax = Math.max(prefixLengthMax, lines[i].prefixLength);\n      }\n\n      let histogram = new Uint32Array(prefixLengthMax + 1);\n      for (i = 0; i < linesLength; i++) {\n        histogram[lines[i].prefixLength]++;\n      }\n      let currentLength = 1, firstCode = 0, currentCode, currentTemp, line;\n      histogram[0] = 0;\n\n      while (currentLength <= prefixLengthMax) {\n        firstCode = (firstCode + histogram[currentLength - 1]) << 1;\n        currentCode = firstCode;\n        currentTemp = 0;\n        while (currentTemp < linesLength) {\n          line = lines[currentTemp];\n          if (line.prefixLength === currentLength) {\n            line.prefixCode = currentCode;\n            currentCode++;\n          }\n          currentTemp++;\n        }\n        currentLength++;\n      }\n    },\n  };\n\n  function decodeTablesSegment(data, start, end) {\n    // Decodes a Tables segment, i.e., a custom Huffman table.\n    // Annex B.2 Code table structure.\n    let flags = data[start];\n    let lowestValue = readUint32(data, start + 1) & 0xFFFFFFFF;\n    let highestValue = readUint32(data, start + 5) & 0xFFFFFFFF;\n    let reader = new Reader(data, start + 9, end);\n\n    let prefixSizeBits = ((flags >> 1) & 7) + 1;\n    let rangeSizeBits = ((flags >> 4) & 7) + 1;\n    let lines = [];\n    let prefixLength, rangeLength, currentRangeLow = lowestValue;\n\n    // Normal table lines\n    do {\n      prefixLength = reader.readBits(prefixSizeBits);\n      rangeLength = reader.readBits(rangeSizeBits);\n      lines.push(new HuffmanLine(\n        [currentRangeLow, prefixLength, rangeLength, 0]));\n      currentRangeLow += 1 << rangeLength;\n    } while (currentRangeLow < highestValue);\n\n    // Lower range table line\n    prefixLength = reader.readBits(prefixSizeBits);\n    lines.push(\n      new HuffmanLine([lowestValue - 1, prefixLength, 32, 0, 'lower']));\n\n    // Upper range table line\n    prefixLength = reader.readBits(prefixSizeBits);\n    lines.push(new HuffmanLine([highestValue, prefixLength, 32, 0]));\n\n    if (flags & 1) {\n      // Out-of-band table line\n      prefixLength = reader.readBits(prefixSizeBits);\n      lines.push(new HuffmanLine([prefixLength, 0]));\n    }\n\n    return new HuffmanTable(lines, false);\n  }\n\n  let standardTablesCache = {};\n\n  function getStandardTable(number) {\n    // Annex B.5 Standard Huffman tables.\n    let table = standardTablesCache[number];\n    if (table) {\n      return table;\n    }\n    let lines;\n    switch (number) {\n      case 1:\n        lines = [\n          [0, 1, 4, 0x0],\n          [16, 2, 8, 0x2],\n          [272, 3, 16, 0x6],\n          [65808, 3, 32, 0x7] // upper\n        ];\n        break;\n      case 2:\n        lines = [\n          [0, 1, 0, 0x0],\n          [1, 2, 0, 0x2],\n          [2, 3, 0, 0x6],\n          [3, 4, 3, 0xE],\n          [11, 5, 6, 0x1E],\n          [75, 6, 32, 0x3E], // upper\n          [6, 0x3F] // OOB\n        ];\n        break;\n      case 3:\n        lines = [\n          [-256, 8, 8, 0xFE],\n          [0, 1, 0, 0x0],\n          [1, 2, 0, 0x2],\n          [2, 3, 0, 0x6],\n          [3, 4, 3, 0xE],\n          [11, 5, 6, 0x1E],\n          [-257, 8, 32, 0xFF, 'lower'],\n          [75, 7, 32, 0x7E], // upper\n          [6, 0x3E] // OOB\n        ];\n        break;\n      case 4:\n        lines = [\n          [1, 1, 0, 0x0],\n          [2, 2, 0, 0x2],\n          [3, 3, 0, 0x6],\n          [4, 4, 3, 0xE],\n          [12, 5, 6, 0x1E],\n          [76, 5, 32, 0x1F] // upper\n        ];\n        break;\n      case 5:\n        lines = [\n          [-255, 7, 8, 0x7E],\n          [1, 1, 0, 0x0],\n          [2, 2, 0, 0x2],\n          [3, 3, 0, 0x6],\n          [4, 4, 3, 0xE],\n          [12, 5, 6, 0x1E],\n          [-256, 7, 32, 0x7F, 'lower'],\n          [76, 6, 32, 0x3E] // upper\n        ];\n        break;\n      case 6:\n        lines = [\n          [-2048, 5, 10, 0x1C],\n          [-1024, 4, 9, 0x8],\n          [-512, 4, 8, 0x9],\n          [-256, 4, 7, 0xA],\n          [-128, 5, 6, 0x1D],\n          [-64, 5, 5, 0x1E],\n          [-32, 4, 5, 0xB],\n          [0, 2, 7, 0x0],\n          [128, 3, 7, 0x2],\n          [256, 3, 8, 0x3],\n          [512, 4, 9, 0xC],\n          [1024, 4, 10, 0xD],\n          [-2049, 6, 32, 0x3E, 'lower'],\n          [2048, 6, 32, 0x3F] // upper\n        ];\n        break;\n      case 7:\n        lines = [\n          [-1024, 4, 9, 0x8],\n          [-512, 3, 8, 0x0],\n          [-256, 4, 7, 0x9],\n          [-128, 5, 6, 0x1A],\n          [-64, 5, 5, 0x1B],\n          [-32, 4, 5, 0xA],\n          [0, 4, 5, 0xB],\n          [32, 5, 5, 0x1C],\n          [64, 5, 6, 0x1D],\n          [128, 4, 7, 0xC],\n          [256, 3, 8, 0x1],\n          [512, 3, 9, 0x2],\n          [1024, 3, 10, 0x3],\n          [-1025, 5, 32, 0x1E, 'lower'],\n          [2048, 5, 32, 0x1F] // upper\n        ];\n        break;\n      case 8:\n        lines = [\n          [-15, 8, 3, 0xFC],\n          [-7, 9, 1, 0x1FC],\n          [-5, 8, 1, 0xFD],\n          [-3, 9, 0, 0x1FD],\n          [-2, 7, 0, 0x7C],\n          [-1, 4, 0, 0xA],\n          [0, 2, 1, 0x0],\n          [2, 5, 0, 0x1A],\n          [3, 6, 0, 0x3A],\n          [4, 3, 4, 0x4],\n          [20, 6, 1, 0x3B],\n          [22, 4, 4, 0xB],\n          [38, 4, 5, 0xC],\n          [70, 5, 6, 0x1B],\n          [134, 5, 7, 0x1C],\n          [262, 6, 7, 0x3C],\n          [390, 7, 8, 0x7D],\n          [646, 6, 10, 0x3D],\n          [-16, 9, 32, 0x1FE, 'lower'],\n          [1670, 9, 32, 0x1FF], // upper\n          [2, 0x1] // OOB\n        ];\n        break;\n      case 9:\n        lines = [\n          [-31, 8, 4, 0xFC],\n          [-15, 9, 2, 0x1FC],\n          [-11, 8, 2, 0xFD],\n          [-7, 9, 1, 0x1FD],\n          [-5, 7, 1, 0x7C],\n          [-3, 4, 1, 0xA],\n          [-1, 3, 1, 0x2],\n          [1, 3, 1, 0x3],\n          [3, 5, 1, 0x1A],\n          [5, 6, 1, 0x3A],\n          [7, 3, 5, 0x4],\n          [39, 6, 2, 0x3B],\n          [43, 4, 5, 0xB],\n          [75, 4, 6, 0xC],\n          [139, 5, 7, 0x1B],\n          [267, 5, 8, 0x1C],\n          [523, 6, 8, 0x3C],\n          [779, 7, 9, 0x7D],\n          [1291, 6, 11, 0x3D],\n          [-32, 9, 32, 0x1FE, 'lower'],\n          [3339, 9, 32, 0x1FF], // upper\n          [2, 0x0] // OOB\n        ];\n        break;\n      case 10:\n        lines = [\n          [-21, 7, 4, 0x7A],\n          [-5, 8, 0, 0xFC],\n          [-4, 7, 0, 0x7B],\n          [-3, 5, 0, 0x18],\n          [-2, 2, 2, 0x0],\n          [2, 5, 0, 0x19],\n          [3, 6, 0, 0x36],\n          [4, 7, 0, 0x7C],\n          [5, 8, 0, 0xFD],\n          [6, 2, 6, 0x1],\n          [70, 5, 5, 0x1A],\n          [102, 6, 5, 0x37],\n          [134, 6, 6, 0x38],\n          [198, 6, 7, 0x39],\n          [326, 6, 8, 0x3A],\n          [582, 6, 9, 0x3B],\n          [1094, 6, 10, 0x3C],\n          [2118, 7, 11, 0x7D],\n          [-22, 8, 32, 0xFE, 'lower'],\n          [4166, 8, 32, 0xFF], // upper\n          [2, 0x2] // OOB\n        ];\n        break;\n      case 11:\n        lines = [\n          [1, 1, 0, 0x0],\n          [2, 2, 1, 0x2],\n          [4, 4, 0, 0xC],\n          [5, 4, 1, 0xD],\n          [7, 5, 1, 0x1C],\n          [9, 5, 2, 0x1D],\n          [13, 6, 2, 0x3C],\n          [17, 7, 2, 0x7A],\n          [21, 7, 3, 0x7B],\n          [29, 7, 4, 0x7C],\n          [45, 7, 5, 0x7D],\n          [77, 7, 6, 0x7E],\n          [141, 7, 32, 0x7F] // upper\n        ];\n        break;\n      case 12:\n        lines = [\n          [1, 1, 0, 0x0],\n          [2, 2, 0, 0x2],\n          [3, 3, 1, 0x6],\n          [5, 5, 0, 0x1C],\n          [6, 5, 1, 0x1D],\n          [8, 6, 1, 0x3C],\n          [10, 7, 0, 0x7A],\n          [11, 7, 1, 0x7B],\n          [13, 7, 2, 0x7C],\n          [17, 7, 3, 0x7D],\n          [25, 7, 4, 0x7E],\n          [41, 8, 5, 0xFE],\n          [73, 8, 32, 0xFF] // upper\n        ];\n        break;\n      case 13:\n        lines = [\n          [1, 1, 0, 0x0],\n          [2, 3, 0, 0x4],\n          [3, 4, 0, 0xC],\n          [4, 5, 0, 0x1C],\n          [5, 4, 1, 0xD],\n          [7, 3, 3, 0x5],\n          [15, 6, 1, 0x3A],\n          [17, 6, 2, 0x3B],\n          [21, 6, 3, 0x3C],\n          [29, 6, 4, 0x3D],\n          [45, 6, 5, 0x3E],\n          [77, 7, 6, 0x7E],\n          [141, 7, 32, 0x7F] // upper\n        ];\n        break;\n      case 14:\n        lines = [\n          [-2, 3, 0, 0x4],\n          [-1, 3, 0, 0x5],\n          [0, 1, 0, 0x0],\n          [1, 3, 0, 0x6],\n          [2, 3, 0, 0x7]\n        ];\n        break;\n      case 15:\n        lines = [\n          [-24, 7, 4, 0x7C],\n          [-8, 6, 2, 0x3C],\n          [-4, 5, 1, 0x1C],\n          [-2, 4, 0, 0xC],\n          [-1, 3, 0, 0x4],\n          [0, 1, 0, 0x0],\n          [1, 3, 0, 0x5],\n          [2, 4, 0, 0xD],\n          [3, 5, 1, 0x1D],\n          [5, 6, 2, 0x3D],\n          [9, 7, 4, 0x7D],\n          [-25, 7, 32, 0x7E, 'lower'],\n          [25, 7, 32, 0x7F] // upper\n        ];\n        break;\n      default:\n        throw new Jbig2Error(`standard table B.${number} does not exist`);\n    }\n\n    let length = lines.length, i;\n    for (i = 0; i < length; i++) {\n      lines[i] = new HuffmanLine(lines[i]);\n    }\n    table = new HuffmanTable(lines, true);\n    standardTablesCache[number] = table;\n    return table;\n  }\n\n  function Reader(data, start, end) {\n    this.data = data;\n    this.start = start;\n    this.end = end;\n    this.position = start;\n    this.shift = -1;\n    this.currentByte = 0;\n  }\n\n  Reader.prototype = {\n    readBit() {\n      if (this.shift < 0) {\n        if (this.position >= this.end) {\n          throw new Jbig2Error('end of data while reading bit');\n        }\n        this.currentByte = this.data[this.position++];\n        this.shift = 7;\n      }\n      let bit = (this.currentByte >> this.shift) & 1;\n      this.shift--;\n      return bit;\n    },\n\n    readBits(numBits) {\n      let result = 0, i;\n      for (i = numBits - 1; i >= 0; i--) {\n        result |= this.readBit() << i;\n      }\n      return result;\n    },\n\n    byteAlign() {\n      this.shift = -1;\n    },\n\n    next() {\n      if (this.position >= this.end) {\n        return -1;\n      }\n      return this.data[this.position++];\n    },\n  };\n\n  function getCustomHuffmanTable(index, referredTo, customTables) {\n    // Returns a Tables segment that has been earlier decoded.\n    // See 7.4.2.1.6 (symbol dictionary) or 7.4.3.1.6 (text region).\n    let currentIndex = 0, i, ii = referredTo.length, table;\n    for (i = 0; i < ii; i++) {\n      table = customTables[referredTo[i]];\n      if (table) {\n        if (index === currentIndex) {\n          return table;\n        }\n        currentIndex++;\n      }\n    }\n    throw new Jbig2Error('can\\'t find custom Huffman table');\n  }\n\n  function getTextRegionHuffmanTables(textRegion, referredTo, customTables,\n                                      numberOfSymbols, reader) {\n    // 7.4.3.1.7 Symbol ID Huffman table decoding\n\n    // Read code lengths for RUNCODEs 0...34.\n    let codes = [], i, codeLength;\n    for (i = 0; i <= 34; i++) {\n      codeLength = reader.readBits(4);\n      codes.push(new HuffmanLine([i, codeLength, 0, 0]));\n    }\n    // Assign Huffman codes for RUNCODEs.\n    let runCodesTable = new HuffmanTable(codes, false);\n\n    // Read a Huffman code using the assignment above.\n    // Interpret the RUNCODE codes and the additional bits (if any).\n    codes.length = 0;\n    for (i = 0; i < numberOfSymbols;) {\n      codeLength = runCodesTable.decode(reader);\n      if (codeLength >= 32) {\n        let repeatedLength, numberOfRepeats, j;\n        switch (codeLength) {\n          case 32:\n            if (i === 0) {\n              throw new Jbig2Error('no previous value in symbol ID table');\n            }\n            numberOfRepeats = reader.readBits(2) + 3;\n            repeatedLength = codes[i - 1].prefixLength;\n            break;\n          case 33:\n            numberOfRepeats = reader.readBits(3) + 3;\n            repeatedLength = 0;\n            break;\n          case 34:\n            numberOfRepeats = reader.readBits(7) + 11;\n            repeatedLength = 0;\n            break;\n          default:\n            throw new Jbig2Error('invalid code length in symbol ID table');\n        }\n        for (j = 0; j < numberOfRepeats; j++) {\n          codes.push(new HuffmanLine([i, repeatedLength, 0, 0]));\n          i++;\n        }\n      } else {\n        codes.push(new HuffmanLine([i, codeLength, 0, 0]));\n        i++;\n      }\n    }\n    reader.byteAlign();\n    let symbolIDTable = new HuffmanTable(codes, false);\n\n    // 7.4.3.1.6 Text region segment Huffman table selection\n\n    let customIndex = 0, tableFirstS, tableDeltaS, tableDeltaT;\n\n    switch (textRegion.huffmanFS) {\n      case 0:\n      case 1:\n        tableFirstS = getStandardTable(textRegion.huffmanFS + 6);\n        break;\n      case 3:\n        tableFirstS = getCustomHuffmanTable(customIndex, referredTo,\n          customTables);\n        customIndex++;\n        break;\n      default:\n        throw new Jbig2Error('invalid Huffman FS selector');\n    }\n\n    switch (textRegion.huffmanDS) {\n      case 0:\n      case 1:\n      case 2:\n        tableDeltaS = getStandardTable(textRegion.huffmanDS + 8);\n        break;\n      case 3:\n        tableDeltaS = getCustomHuffmanTable(customIndex, referredTo,\n          customTables);\n        customIndex++;\n        break;\n      default:\n        throw new Jbig2Error('invalid Huffman DS selector');\n    }\n\n    switch (textRegion.huffmanDT) {\n      case 0:\n      case 1:\n      case 2:\n        tableDeltaT = getStandardTable(textRegion.huffmanDT + 11);\n        break;\n      case 3:\n        tableDeltaT = getCustomHuffmanTable(customIndex, referredTo,\n          customTables);\n        customIndex++;\n        break;\n      default:\n        throw new Jbig2Error('invalid Huffman DT selector');\n    }\n\n    if (textRegion.refinement) {\n      // Load tables RDW, RDH, RDX and RDY.\n      throw new Jbig2Error('refinement with Huffman is not supported');\n    }\n\n    return {\n      symbolIDTable,\n      tableFirstS,\n      tableDeltaS,\n      tableDeltaT,\n    };\n  }\n\n  function getSymbolDictionaryHuffmanTables(dictionary, referredTo,\n                                            customTables) {\n    // 7.4.2.1.6 Symbol dictionary segment Huffman table selection\n\n    let customIndex = 0, tableDeltaHeight, tableDeltaWidth;\n    switch (dictionary.huffmanDHSelector) {\n      case 0:\n      case 1:\n        tableDeltaHeight = getStandardTable(dictionary.huffmanDHSelector + 4);\n        break;\n      case 3:\n        tableDeltaHeight = getCustomHuffmanTable(customIndex, referredTo,\n          customTables);\n        customIndex++;\n        break;\n      default:\n        throw new Jbig2Error('invalid Huffman DH selector');\n    }\n\n    switch (dictionary.huffmanDWSelector) {\n      case 0:\n      case 1:\n        tableDeltaWidth = getStandardTable(dictionary.huffmanDWSelector + 2);\n        break;\n      case 3:\n        tableDeltaWidth = getCustomHuffmanTable(customIndex, referredTo,\n          customTables);\n        customIndex++;\n        break;\n      default:\n        throw new Jbig2Error('invalid Huffman DW selector');\n    }\n\n    let tableBitmapSize, tableAggregateInstances;\n    if (dictionary.bitmapSizeSelector) {\n      tableBitmapSize = getCustomHuffmanTable(customIndex, referredTo,\n        customTables);\n      customIndex++;\n    } else {\n      tableBitmapSize = getStandardTable(1);\n    }\n\n    if (dictionary.aggregationInstancesSelector) {\n      tableAggregateInstances = getCustomHuffmanTable(customIndex, referredTo,\n        customTables);\n    } else {\n      tableAggregateInstances = getStandardTable(1);\n    }\n\n    return {\n      tableDeltaHeight,\n      tableDeltaWidth,\n      tableBitmapSize,\n      tableAggregateInstances,\n    };\n  }\n\n  function readUncompressedBitmap(reader, width, height) {\n    let bitmap = [], x, y, row;\n    for (y = 0; y < height; y++) {\n      row = new Uint8Array(width);\n      bitmap.push(row);\n      for (x = 0; x < width; x++) {\n        row[x] = reader.readBit();\n      }\n      reader.byteAlign();\n    }\n    return bitmap;\n  }\n\n  function decodeMMRBitmap(input, width, height, endOfBlock) {\n    // MMR is the same compression algorithm as the PDF filter\n    // CCITTFaxDecode with /K -1.\n    let params = {\n      K: -1,\n      Columns: width,\n      Rows: height,\n      BlackIs1: true,\n      EndOfBlock: endOfBlock,\n    };\n    let decoder = new CCITTFaxDecoder(input, params);\n    let bitmap = [], x, y, row, currentByte, shift, eof = false;\n\n    for (y = 0; y < height; y++) {\n      row = new Uint8Array(width);\n      bitmap.push(row);\n      shift = -1;\n      for (x = 0; x < width; x++) {\n        if (shift < 0) {\n          currentByte = decoder.readNextChar();\n          if (currentByte === -1) {\n            // Set the rest of the bits to zero.\n            currentByte = 0;\n            eof = true;\n          }\n          shift = 7;\n        }\n        row[x] = (currentByte >> shift) & 1;\n        shift--;\n      }\n    }\n\n    if (endOfBlock && !eof) {\n      // Read until EOFB has been consumed.\n      const lookForEOFLimit = 5;\n      for (let i = 0; i < lookForEOFLimit; i++) {\n        if (decoder.readNextChar() === -1) {\n          break;\n        }\n      }\n    }\n\n    return bitmap;\n  }\n\n  function Jbig2Image() {}\n\n  Jbig2Image.prototype = {\n    parseChunks(chunks) {\n      return parseJbig2Chunks(chunks);\n    },\n\n    parse(data) {\n      const { imgData, width, height, } = parseJbig2(data);\n      this.width = width;\n      this.height = height;\n      return imgData;\n    },\n  };\n\n  return Jbig2Image;\n})();\n\nexport {\n  Jbig2Image,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/* This class implements the QM Coder decoding as defined in\n *   JPEG 2000 Part I Final Committee Draft Version 1.0\n *   Annex C.3 Arithmetic decoding procedure\n * available at http://www.jpeg.org/public/fcd15444-1.pdf\n *\n * The arithmetic decoder is used in conjunction with context models to decode\n * JPEG2000 and JBIG2 streams.\n */\nvar ArithmeticDecoder = (function ArithmeticDecoderClosure() {\n  // Table C-2\n  var QeTable = [\n    { qe: 0x5601, nmps: 1, nlps: 1, switchFlag: 1, },\n    { qe: 0x3401, nmps: 2, nlps: 6, switchFlag: 0, },\n    { qe: 0x1801, nmps: 3, nlps: 9, switchFlag: 0, },\n    { qe: 0x0AC1, nmps: 4, nlps: 12, switchFlag: 0, },\n    { qe: 0x0521, nmps: 5, nlps: 29, switchFlag: 0, },\n    { qe: 0x0221, nmps: 38, nlps: 33, switchFlag: 0, },\n    { qe: 0x5601, nmps: 7, nlps: 6, switchFlag: 1, },\n    { qe: 0x5401, nmps: 8, nlps: 14, switchFlag: 0, },\n    { qe: 0x4801, nmps: 9, nlps: 14, switchFlag: 0, },\n    { qe: 0x3801, nmps: 10, nlps: 14, switchFlag: 0, },\n    { qe: 0x3001, nmps: 11, nlps: 17, switchFlag: 0, },\n    { qe: 0x2401, nmps: 12, nlps: 18, switchFlag: 0, },\n    { qe: 0x1C01, nmps: 13, nlps: 20, switchFlag: 0, },\n    { qe: 0x1601, nmps: 29, nlps: 21, switchFlag: 0, },\n    { qe: 0x5601, nmps: 15, nlps: 14, switchFlag: 1, },\n    { qe: 0x5401, nmps: 16, nlps: 14, switchFlag: 0, },\n    { qe: 0x5101, nmps: 17, nlps: 15, switchFlag: 0, },\n    { qe: 0x4801, nmps: 18, nlps: 16, switchFlag: 0, },\n    { qe: 0x3801, nmps: 19, nlps: 17, switchFlag: 0, },\n    { qe: 0x3401, nmps: 20, nlps: 18, switchFlag: 0, },\n    { qe: 0x3001, nmps: 21, nlps: 19, switchFlag: 0, },\n    { qe: 0x2801, nmps: 22, nlps: 19, switchFlag: 0, },\n    { qe: 0x2401, nmps: 23, nlps: 20, switchFlag: 0, },\n    { qe: 0x2201, nmps: 24, nlps: 21, switchFlag: 0, },\n    { qe: 0x1C01, nmps: 25, nlps: 22, switchFlag: 0, },\n    { qe: 0x1801, nmps: 26, nlps: 23, switchFlag: 0, },\n    { qe: 0x1601, nmps: 27, nlps: 24, switchFlag: 0, },\n    { qe: 0x1401, nmps: 28, nlps: 25, switchFlag: 0, },\n    { qe: 0x1201, nmps: 29, nlps: 26, switchFlag: 0, },\n    { qe: 0x1101, nmps: 30, nlps: 27, switchFlag: 0, },\n    { qe: 0x0AC1, nmps: 31, nlps: 28, switchFlag: 0, },\n    { qe: 0x09C1, nmps: 32, nlps: 29, switchFlag: 0, },\n    { qe: 0x08A1, nmps: 33, nlps: 30, switchFlag: 0, },\n    { qe: 0x0521, nmps: 34, nlps: 31, switchFlag: 0, },\n    { qe: 0x0441, nmps: 35, nlps: 32, switchFlag: 0, },\n    { qe: 0x02A1, nmps: 36, nlps: 33, switchFlag: 0, },\n    { qe: 0x0221, nmps: 37, nlps: 34, switchFlag: 0, },\n    { qe: 0x0141, nmps: 38, nlps: 35, switchFlag: 0, },\n    { qe: 0x0111, nmps: 39, nlps: 36, switchFlag: 0, },\n    { qe: 0x0085, nmps: 40, nlps: 37, switchFlag: 0, },\n    { qe: 0x0049, nmps: 41, nlps: 38, switchFlag: 0, },\n    { qe: 0x0025, nmps: 42, nlps: 39, switchFlag: 0, },\n    { qe: 0x0015, nmps: 43, nlps: 40, switchFlag: 0, },\n    { qe: 0x0009, nmps: 44, nlps: 41, switchFlag: 0, },\n    { qe: 0x0005, nmps: 45, nlps: 42, switchFlag: 0, },\n    { qe: 0x0001, nmps: 45, nlps: 43, switchFlag: 0, },\n    { qe: 0x5601, nmps: 46, nlps: 46, switchFlag: 0, }\n  ];\n\n  // C.3.5 Initialisation of the decoder (INITDEC)\n  function ArithmeticDecoder(data, start, end) {\n    this.data = data;\n    this.bp = start;\n    this.dataEnd = end;\n\n    this.chigh = data[start];\n    this.clow = 0;\n\n    this.byteIn();\n\n    this.chigh = ((this.chigh << 7) & 0xFFFF) | ((this.clow >> 9) & 0x7F);\n    this.clow = (this.clow << 7) & 0xFFFF;\n    this.ct -= 7;\n    this.a = 0x8000;\n  }\n\n  ArithmeticDecoder.prototype = {\n    // C.3.4 Compressed data input (BYTEIN)\n    byteIn: function ArithmeticDecoder_byteIn() {\n      var data = this.data;\n      var bp = this.bp;\n      if (data[bp] === 0xFF) {\n        var b1 = data[bp + 1];\n        if (b1 > 0x8F) {\n          this.clow += 0xFF00;\n          this.ct = 8;\n        } else {\n          bp++;\n          this.clow += (data[bp] << 9);\n          this.ct = 7;\n          this.bp = bp;\n        }\n      } else {\n        bp++;\n        this.clow += bp < this.dataEnd ? (data[bp] << 8) : 0xFF00;\n        this.ct = 8;\n        this.bp = bp;\n      }\n      if (this.clow > 0xFFFF) {\n        this.chigh += (this.clow >> 16);\n        this.clow &= 0xFFFF;\n      }\n    },\n    // C.3.2 Decoding a decision (DECODE)\n    readBit: function ArithmeticDecoder_readBit(contexts, pos) {\n      // contexts are packed into 1 byte:\n      // highest 7 bits carry cx.index, lowest bit carries cx.mps\n      var cx_index = contexts[pos] >> 1, cx_mps = contexts[pos] & 1;\n      var qeTableIcx = QeTable[cx_index];\n      var qeIcx = qeTableIcx.qe;\n      var d;\n      var a = this.a - qeIcx;\n\n      if (this.chigh < qeIcx) {\n        // exchangeLps\n        if (a < qeIcx) {\n          a = qeIcx;\n          d = cx_mps;\n          cx_index = qeTableIcx.nmps;\n        } else {\n          a = qeIcx;\n          d = 1 ^ cx_mps;\n          if (qeTableIcx.switchFlag === 1) {\n            cx_mps = d;\n          }\n          cx_index = qeTableIcx.nlps;\n        }\n      } else {\n        this.chigh -= qeIcx;\n        if ((a & 0x8000) !== 0) {\n          this.a = a;\n          return cx_mps;\n        }\n        // exchangeMps\n        if (a < qeIcx) {\n          d = 1 ^ cx_mps;\n          if (qeTableIcx.switchFlag === 1) {\n            cx_mps = d;\n          }\n          cx_index = qeTableIcx.nlps;\n        } else {\n          d = cx_mps;\n          cx_index = qeTableIcx.nmps;\n        }\n      }\n      // C.3.3 renormD;\n      do {\n        if (this.ct === 0) {\n          this.byteIn();\n        }\n\n        a <<= 1;\n        this.chigh = ((this.chigh << 1) & 0xFFFF) | ((this.clow >> 15) & 1);\n        this.clow = (this.clow << 1) & 0xFFFF;\n        this.ct--;\n      } while ((a & 0x8000) === 0);\n      this.a = a;\n\n      contexts[pos] = cx_index << 1 | cx_mps;\n      return d;\n    },\n  };\n\n  return ArithmeticDecoder;\n})();\n\nexport {\n  ArithmeticDecoder,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { createObjectURL, shadow } from '../shared/util';\nimport { DecodeStream } from './stream';\nimport { isDict } from './primitives';\nimport { JpegImage } from './jpg';\n\n/**\n * Depending on the type of JPEG a JpegStream is handled in different ways. For\n * JPEG's that are supported natively such as DeviceGray and DeviceRGB the image\n * data is stored and then loaded by the browser. For unsupported JPEG's we use\n * a library to decode these images and the stream behaves like all the other\n * DecodeStreams.\n */\nlet JpegStream = (function JpegStreamClosure() {\n  function JpegStream(stream, maybeLength, dict, params) {\n    // Some images may contain 'junk' before the SOI (start-of-image) marker.\n    // Note: this seems to mainly affect inline images.\n    let ch;\n    while ((ch = stream.getByte()) !== -1) {\n      if (ch === 0xFF) { // Find the first byte of the SOI marker (0xFFD8).\n        stream.skip(-1); // Reset the stream position to the SOI.\n        break;\n      }\n    }\n    this.stream = stream;\n    this.maybeLength = maybeLength;\n    this.dict = dict;\n    this.params = params;\n\n    DecodeStream.call(this, maybeLength);\n  }\n\n  JpegStream.prototype = Object.create(DecodeStream.prototype);\n\n  Object.defineProperty(JpegStream.prototype, 'bytes', {\n    get: function JpegStream_bytes() {\n      // If `this.maybeLength` is null, we'll get the entire stream.\n      return shadow(this, 'bytes', this.stream.getBytes(this.maybeLength));\n    },\n    configurable: true,\n  });\n\n  JpegStream.prototype.ensureBuffer = function(requested) {\n    // No-op, since `this.readBlock` will always parse the entire image and\n    // directly insert all of its data into `this.buffer`.\n  };\n\n  JpegStream.prototype.readBlock = function() {\n    if (this.eof) {\n      return;\n    }\n    let jpegOptions = {\n      decodeTransform: undefined,\n      colorTransform: undefined,\n    };\n\n    // Checking if values need to be transformed before conversion.\n    let decodeArr = this.dict.getArray('Decode', 'D');\n    if (this.forceRGB && Array.isArray(decodeArr)) {\n      let bitsPerComponent = this.dict.get('BitsPerComponent') || 8;\n      let decodeArrLength = decodeArr.length;\n      let transform = new Int32Array(decodeArrLength);\n      let transformNeeded = false;\n      let maxValue = (1 << bitsPerComponent) - 1;\n      for (let i = 0; i < decodeArrLength; i += 2) {\n        transform[i] = ((decodeArr[i + 1] - decodeArr[i]) * 256) | 0;\n        transform[i + 1] = (decodeArr[i] * maxValue) | 0;\n        if (transform[i] !== 256 || transform[i + 1] !== 0) {\n          transformNeeded = true;\n        }\n      }\n      if (transformNeeded) {\n        jpegOptions.decodeTransform = transform;\n      }\n    }\n    // Fetching the 'ColorTransform' entry, if it exists.\n    if (isDict(this.params)) {\n      let colorTransform = this.params.get('ColorTransform');\n      if (Number.isInteger(colorTransform)) {\n        jpegOptions.colorTransform = colorTransform;\n      }\n    }\n    const jpegImage = new JpegImage(jpegOptions);\n\n    jpegImage.parse(this.bytes);\n    let data = jpegImage.getData({\n      width: this.drawWidth,\n      height: this.drawHeight,\n      forceRGB: this.forceRGB,\n      isSourcePDF: true,\n    });\n    this.buffer = data;\n    this.bufferLength = data.length;\n    this.eof = true;\n  };\n\n  JpegStream.prototype.getIR = function(forceDataSchema = false) {\n    return createObjectURL(this.bytes, 'image/jpeg', forceDataSchema);\n  };\n\n  return JpegStream;\n})();\n\nexport {\n  JpegStream,\n};\n","/* Copyright 2014 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* eslint-disable no-multi-spaces */\n\nimport { assert, warn } from '../shared/util';\n\nlet JpegError = (function JpegErrorClosure() {\n  function JpegError(msg) {\n    this.message = 'JPEG error: ' + msg;\n  }\n\n  JpegError.prototype = new Error();\n  JpegError.prototype.name = 'JpegError';\n  JpegError.constructor = JpegError;\n\n  return JpegError;\n})();\n\nlet DNLMarkerError = (function DNLMarkerErrorClosure() {\n  function DNLMarkerError(message, scanLines) {\n    this.message = message;\n    this.scanLines = scanLines;\n  }\n\n  DNLMarkerError.prototype = new Error();\n  DNLMarkerError.prototype.name = 'DNLMarkerError';\n  DNLMarkerError.constructor = DNLMarkerError;\n\n  return DNLMarkerError;\n})();\n\nlet EOIMarkerError = (function EOIMarkerErrorClosure() {\n  function EOIMarkerError(message) {\n    this.message = message;\n  }\n\n  EOIMarkerError.prototype = new Error();\n  EOIMarkerError.prototype.name = 'EOIMarkerError';\n  EOIMarkerError.constructor = EOIMarkerError;\n\n  return EOIMarkerError;\n})();\n\n/**\n * This code was forked from https://github.com/notmasteryet/jpgjs.\n * The original version was created by GitHub user notmasteryet.\n *\n * - The JPEG specification can be found in the ITU CCITT Recommendation T.81\n *   (www.w3.org/Graphics/JPEG/itu-t81.pdf)\n * - The JFIF specification can be found in the JPEG File Interchange Format\n *   (www.w3.org/Graphics/JPEG/jfif3.pdf)\n * - The Adobe Application-Specific JPEG markers in the\n *   Supporting the DCT Filters in PostScript Level 2, Technical Note #5116\n *   (partners.adobe.com/public/developer/en/ps/sdk/5116.DCT_Filter.pdf)\n */\n\nvar JpegImage = (function JpegImageClosure() {\n  var dctZigZag = new Uint8Array([\n     0,\n     1,  8,\n    16,  9,  2,\n     3, 10, 17, 24,\n    32, 25, 18, 11, 4,\n     5, 12, 19, 26, 33, 40,\n    48, 41, 34, 27, 20, 13,  6,\n     7, 14, 21, 28, 35, 42, 49, 56,\n    57, 50, 43, 36, 29, 22, 15,\n    23, 30, 37, 44, 51, 58,\n    59, 52, 45, 38, 31,\n    39, 46, 53, 60,\n    61, 54, 47,\n    55, 62,\n    63\n  ]);\n\n  var dctCos1  =  4017;   // cos(pi/16)\n  var dctSin1  =   799;   // sin(pi/16)\n  var dctCos3  =  3406;   // cos(3*pi/16)\n  var dctSin3  =  2276;   // sin(3*pi/16)\n  var dctCos6  =  1567;   // cos(6*pi/16)\n  var dctSin6  =  3784;   // sin(6*pi/16)\n  var dctSqrt2 =  5793;   // sqrt(2)\n  var dctSqrt1d2 = 2896;  // sqrt(2) / 2\n\n  function JpegImage({ decodeTransform = null, colorTransform = -1, } = {}) {\n    this._decodeTransform = decodeTransform;\n    this._colorTransform = colorTransform;\n  }\n\n  function buildHuffmanTable(codeLengths, values) {\n    var k = 0, code = [], i, j, length = 16;\n    while (length > 0 && !codeLengths[length - 1]) {\n      length--;\n    }\n    code.push({ children: [], index: 0, });\n    var p = code[0], q;\n    for (i = 0; i < length; i++) {\n      for (j = 0; j < codeLengths[i]; j++) {\n        p = code.pop();\n        p.children[p.index] = values[k];\n        while (p.index > 0) {\n          p = code.pop();\n        }\n        p.index++;\n        code.push(p);\n        while (code.length <= i) {\n          code.push(q = { children: [], index: 0, });\n          p.children[p.index] = q.children;\n          p = q;\n        }\n        k++;\n      }\n      if (i + 1 < length) {\n        // p here points to last code\n        code.push(q = { children: [], index: 0, });\n        p.children[p.index] = q.children;\n        p = q;\n      }\n    }\n    return code[0].children;\n  }\n\n  function getBlockBufferOffset(component, row, col) {\n    return 64 * ((component.blocksPerLine + 1) * row + col);\n  }\n\n  function decodeScan(data, offset, frame, components, resetInterval,\n                      spectralStart, spectralEnd, successivePrev, successive,\n                      parseDNLMarker = false) {\n    var mcusPerLine = frame.mcusPerLine;\n    var progressive = frame.progressive;\n\n    var startOffset = offset, bitsData = 0, bitsCount = 0;\n\n    function readBit() {\n      if (bitsCount > 0) {\n        bitsCount--;\n        return (bitsData >> bitsCount) & 1;\n      }\n      bitsData = data[offset++];\n      if (bitsData === 0xFF) {\n        var nextByte = data[offset++];\n        if (nextByte) {\n          if (nextByte === 0xDC && parseDNLMarker) { // DNL == 0xFFDC\n            offset += 2; // Skip data length.\n            const scanLines = (data[offset++] << 8) | data[offset++];\n            if (scanLines > 0 && scanLines !== frame.scanLines) {\n              throw new DNLMarkerError(\n                'Found DNL marker (0xFFDC) while parsing scan data', scanLines);\n            }\n          } else if (nextByte === 0xD9) { // EOI == 0xFFD9\n            throw new EOIMarkerError(\n              'Found EOI marker (0xFFD9) while parsing scan data');\n          }\n          throw new JpegError(\n            `unexpected marker ${((bitsData << 8) | nextByte).toString(16)}`);\n        }\n        // unstuff 0\n      }\n      bitsCount = 7;\n      return bitsData >>> 7;\n    }\n\n    function decodeHuffman(tree) {\n      var node = tree;\n      while (true) {\n        node = node[readBit()];\n        if (typeof node === 'number') {\n          return node;\n        }\n        if (typeof node !== 'object') {\n          throw new JpegError('invalid huffman sequence');\n        }\n      }\n    }\n\n    function receive(length) {\n      var n = 0;\n      while (length > 0) {\n        n = (n << 1) | readBit();\n        length--;\n      }\n      return n;\n    }\n\n    function receiveAndExtend(length) {\n      if (length === 1) {\n        return readBit() === 1 ? 1 : -1;\n      }\n      var n = receive(length);\n      if (n >= 1 << (length - 1)) {\n        return n;\n      }\n      return n + (-1 << length) + 1;\n    }\n\n    function decodeBaseline(component, offset) {\n      var t = decodeHuffman(component.huffmanTableDC);\n      var diff = t === 0 ? 0 : receiveAndExtend(t);\n      component.blockData[offset] = (component.pred += diff);\n      var k = 1;\n      while (k < 64) {\n        var rs = decodeHuffman(component.huffmanTableAC);\n        var s = rs & 15, r = rs >> 4;\n        if (s === 0) {\n          if (r < 15) {\n            break;\n          }\n          k += 16;\n          continue;\n        }\n        k += r;\n        var z = dctZigZag[k];\n        component.blockData[offset + z] = receiveAndExtend(s);\n        k++;\n      }\n    }\n\n    function decodeDCFirst(component, offset) {\n      var t = decodeHuffman(component.huffmanTableDC);\n      var diff = t === 0 ? 0 : (receiveAndExtend(t) << successive);\n      component.blockData[offset] = (component.pred += diff);\n    }\n\n    function decodeDCSuccessive(component, offset) {\n      component.blockData[offset] |= readBit() << successive;\n    }\n\n    var eobrun = 0;\n    function decodeACFirst(component, offset) {\n      if (eobrun > 0) {\n        eobrun--;\n        return;\n      }\n      var k = spectralStart, e = spectralEnd;\n      while (k <= e) {\n        var rs = decodeHuffman(component.huffmanTableAC);\n        var s = rs & 15, r = rs >> 4;\n        if (s === 0) {\n          if (r < 15) {\n            eobrun = receive(r) + (1 << r) - 1;\n            break;\n          }\n          k += 16;\n          continue;\n        }\n        k += r;\n        var z = dctZigZag[k];\n        component.blockData[offset + z] =\n          receiveAndExtend(s) * (1 << successive);\n        k++;\n      }\n    }\n\n    var successiveACState = 0, successiveACNextValue;\n    function decodeACSuccessive(component, offset) {\n      var k = spectralStart;\n      var e = spectralEnd;\n      var r = 0;\n      var s;\n      var rs;\n      while (k <= e) {\n        let offsetZ = offset + dctZigZag[k];\n        let sign = component.blockData[offsetZ] < 0 ? -1 : 1;\n        switch (successiveACState) {\n          case 0: // initial state\n            rs = decodeHuffman(component.huffmanTableAC);\n            s = rs & 15;\n            r = rs >> 4;\n            if (s === 0) {\n              if (r < 15) {\n                eobrun = receive(r) + (1 << r);\n                successiveACState = 4;\n              } else {\n                r = 16;\n                successiveACState = 1;\n              }\n            } else {\n              if (s !== 1) {\n                throw new JpegError('invalid ACn encoding');\n              }\n              successiveACNextValue = receiveAndExtend(s);\n              successiveACState = r ? 2 : 3;\n            }\n            continue;\n          case 1: // skipping r zero items\n          case 2:\n            if (component.blockData[offsetZ]) {\n              component.blockData[offsetZ] += sign * (readBit() << successive);\n            } else {\n              r--;\n              if (r === 0) {\n                successiveACState = successiveACState === 2 ? 3 : 0;\n              }\n            }\n            break;\n          case 3: // set value for a zero item\n            if (component.blockData[offsetZ]) {\n              component.blockData[offsetZ] += sign * (readBit() << successive);\n            } else {\n              component.blockData[offsetZ] =\n                successiveACNextValue << successive;\n              successiveACState = 0;\n            }\n            break;\n          case 4: // eob\n            if (component.blockData[offsetZ]) {\n              component.blockData[offsetZ] += sign * (readBit() << successive);\n            }\n            break;\n        }\n        k++;\n      }\n      if (successiveACState === 4) {\n        eobrun--;\n        if (eobrun === 0) {\n          successiveACState = 0;\n        }\n      }\n    }\n\n    function decodeMcu(component, decode, mcu, row, col) {\n      var mcuRow = (mcu / mcusPerLine) | 0;\n      var mcuCol = mcu % mcusPerLine;\n      var blockRow = mcuRow * component.v + row;\n      var blockCol = mcuCol * component.h + col;\n      var offset = getBlockBufferOffset(component, blockRow, blockCol);\n      decode(component, offset);\n    }\n\n    function decodeBlock(component, decode, mcu) {\n      var blockRow = (mcu / component.blocksPerLine) | 0;\n      var blockCol = mcu % component.blocksPerLine;\n      var offset = getBlockBufferOffset(component, blockRow, blockCol);\n      decode(component, offset);\n    }\n\n    var componentsLength = components.length;\n    var component, i, j, k, n;\n    var decodeFn;\n    if (progressive) {\n      if (spectralStart === 0) {\n        decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive;\n      } else {\n        decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive;\n      }\n    } else {\n      decodeFn = decodeBaseline;\n    }\n\n    var mcu = 0, fileMarker;\n    var mcuExpected;\n    if (componentsLength === 1) {\n      mcuExpected = components[0].blocksPerLine * components[0].blocksPerColumn;\n    } else {\n      mcuExpected = mcusPerLine * frame.mcusPerColumn;\n    }\n\n    var h, v;\n    while (mcu < mcuExpected) {\n      // reset interval stuff\n      var mcuToRead = resetInterval ?\n        Math.min(mcuExpected - mcu, resetInterval) : mcuExpected;\n      for (i = 0; i < componentsLength; i++) {\n        components[i].pred = 0;\n      }\n      eobrun = 0;\n\n      if (componentsLength === 1) {\n        component = components[0];\n        for (n = 0; n < mcuToRead; n++) {\n          decodeBlock(component, decodeFn, mcu);\n          mcu++;\n        }\n      } else {\n        for (n = 0; n < mcuToRead; n++) {\n          for (i = 0; i < componentsLength; i++) {\n            component = components[i];\n            h = component.h;\n            v = component.v;\n            for (j = 0; j < v; j++) {\n              for (k = 0; k < h; k++) {\n                decodeMcu(component, decodeFn, mcu, j, k);\n              }\n            }\n          }\n          mcu++;\n        }\n      }\n\n      // find marker\n      bitsCount = 0;\n      fileMarker = findNextFileMarker(data, offset);\n      // Some bad images seem to pad Scan blocks with e.g. zero bytes, skip past\n      // those to attempt to find a valid marker (fixes issue4090.pdf).\n      if (fileMarker && fileMarker.invalid) {\n        warn('decodeScan - unexpected MCU data, current marker is: ' +\n             fileMarker.invalid);\n        offset = fileMarker.offset;\n      }\n      var marker = fileMarker && fileMarker.marker;\n      if (!marker || marker <= 0xFF00) {\n        throw new JpegError('marker was not found');\n      }\n\n      if (marker >= 0xFFD0 && marker <= 0xFFD7) { // RSTx\n        offset += 2;\n      } else {\n        break;\n      }\n    }\n\n    fileMarker = findNextFileMarker(data, offset);\n    // Some images include more Scan blocks than expected, skip past those and\n    // attempt to find the next valid marker (fixes issue8182.pdf).\n    if (fileMarker && fileMarker.invalid) {\n      warn('decodeScan - unexpected Scan data, current marker is: ' +\n           fileMarker.invalid);\n      offset = fileMarker.offset;\n    }\n\n    return offset - startOffset;\n  }\n\n  // A port of poppler's IDCT method which in turn is taken from:\n  //   Christoph Loeffler, Adriaan Ligtenberg, George S. Moschytz,\n  //   'Practical Fast 1-D DCT Algorithms with 11 Multiplications',\n  //   IEEE Intl. Conf. on Acoustics, Speech & Signal Processing, 1989,\n  //   988-991.\n  function quantizeAndInverse(component, blockBufferOffset, p) {\n    var qt = component.quantizationTable, blockData = component.blockData;\n    var v0, v1, v2, v3, v4, v5, v6, v7;\n    var p0, p1, p2, p3, p4, p5, p6, p7;\n    var t;\n\n    if (!qt) {\n      throw new JpegError('missing required Quantization Table.');\n    }\n\n    // inverse DCT on rows\n    for (var row = 0; row < 64; row += 8) {\n      // gather block data\n      p0 = blockData[blockBufferOffset + row];\n      p1 = blockData[blockBufferOffset + row + 1];\n      p2 = blockData[blockBufferOffset + row + 2];\n      p3 = blockData[blockBufferOffset + row + 3];\n      p4 = blockData[blockBufferOffset + row + 4];\n      p5 = blockData[blockBufferOffset + row + 5];\n      p6 = blockData[blockBufferOffset + row + 6];\n      p7 = blockData[blockBufferOffset + row + 7];\n\n      // dequant p0\n      p0 *= qt[row];\n\n      // check for all-zero AC coefficients\n      if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) {\n        t = (dctSqrt2 * p0 + 512) >> 10;\n        p[row] = t;\n        p[row + 1] = t;\n        p[row + 2] = t;\n        p[row + 3] = t;\n        p[row + 4] = t;\n        p[row + 5] = t;\n        p[row + 6] = t;\n        p[row + 7] = t;\n        continue;\n      }\n      // dequant p1 ... p7\n      p1 *= qt[row + 1];\n      p2 *= qt[row + 2];\n      p3 *= qt[row + 3];\n      p4 *= qt[row + 4];\n      p5 *= qt[row + 5];\n      p6 *= qt[row + 6];\n      p7 *= qt[row + 7];\n\n      // stage 4\n      v0 = (dctSqrt2 * p0 + 128) >> 8;\n      v1 = (dctSqrt2 * p4 + 128) >> 8;\n      v2 = p2;\n      v3 = p6;\n      v4 = (dctSqrt1d2 * (p1 - p7) + 128) >> 8;\n      v7 = (dctSqrt1d2 * (p1 + p7) + 128) >> 8;\n      v5 = p3 << 4;\n      v6 = p5 << 4;\n\n      // stage 3\n      v0 = (v0 + v1 + 1) >> 1;\n      v1 = v0 - v1;\n      t  = (v2 * dctSin6 + v3 * dctCos6 + 128) >> 8;\n      v2 = (v2 * dctCos6 - v3 * dctSin6 + 128) >> 8;\n      v3 = t;\n      v4 = (v4 + v6 + 1) >> 1;\n      v6 = v4 - v6;\n      v7 = (v7 + v5 + 1) >> 1;\n      v5 = v7 - v5;\n\n      // stage 2\n      v0 = (v0 + v3 + 1) >> 1;\n      v3 = v0 - v3;\n      v1 = (v1 + v2 + 1) >> 1;\n      v2 = v1 - v2;\n      t  = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12;\n      v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12;\n      v7 = t;\n      t  = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12;\n      v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12;\n      v6 = t;\n\n      // stage 1\n      p[row] = v0 + v7;\n      p[row + 7] = v0 - v7;\n      p[row + 1] = v1 + v6;\n      p[row + 6] = v1 - v6;\n      p[row + 2] = v2 + v5;\n      p[row + 5] = v2 - v5;\n      p[row + 3] = v3 + v4;\n      p[row + 4] = v3 - v4;\n    }\n\n    // inverse DCT on columns\n    for (var col = 0; col < 8; ++col) {\n      p0 = p[col];\n      p1 = p[col +  8];\n      p2 = p[col + 16];\n      p3 = p[col + 24];\n      p4 = p[col + 32];\n      p5 = p[col + 40];\n      p6 = p[col + 48];\n      p7 = p[col + 56];\n\n      // check for all-zero AC coefficients\n      if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) {\n        t = (dctSqrt2 * p0 + 8192) >> 14;\n        // convert to 8 bit\n        t = (t < -2040) ? 0 : (t >= 2024) ? 255 : (t + 2056) >> 4;\n        blockData[blockBufferOffset + col] = t;\n        blockData[blockBufferOffset + col +  8] = t;\n        blockData[blockBufferOffset + col + 16] = t;\n        blockData[blockBufferOffset + col + 24] = t;\n        blockData[blockBufferOffset + col + 32] = t;\n        blockData[blockBufferOffset + col + 40] = t;\n        blockData[blockBufferOffset + col + 48] = t;\n        blockData[blockBufferOffset + col + 56] = t;\n        continue;\n      }\n\n      // stage 4\n      v0 = (dctSqrt2 * p0 + 2048) >> 12;\n      v1 = (dctSqrt2 * p4 + 2048) >> 12;\n      v2 = p2;\n      v3 = p6;\n      v4 = (dctSqrt1d2 * (p1 - p7) + 2048) >> 12;\n      v7 = (dctSqrt1d2 * (p1 + p7) + 2048) >> 12;\n      v5 = p3;\n      v6 = p5;\n\n      // stage 3\n      // Shift v0 by 128.5 << 5 here, so we don't need to shift p0...p7 when\n      // converting to UInt8 range later.\n      v0 = ((v0 + v1 + 1) >> 1) + 4112;\n      v1 = v0 - v1;\n      t  = (v2 * dctSin6 + v3 * dctCos6 + 2048) >> 12;\n      v2 = (v2 * dctCos6 - v3 * dctSin6 + 2048) >> 12;\n      v3 = t;\n      v4 = (v4 + v6 + 1) >> 1;\n      v6 = v4 - v6;\n      v7 = (v7 + v5 + 1) >> 1;\n      v5 = v7 - v5;\n\n      // stage 2\n      v0 = (v0 + v3 + 1) >> 1;\n      v3 = v0 - v3;\n      v1 = (v1 + v2 + 1) >> 1;\n      v2 = v1 - v2;\n      t  = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12;\n      v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12;\n      v7 = t;\n      t  = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12;\n      v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12;\n      v6 = t;\n\n      // stage 1\n      p0 = v0 + v7;\n      p7 = v0 - v7;\n      p1 = v1 + v6;\n      p6 = v1 - v6;\n      p2 = v2 + v5;\n      p5 = v2 - v5;\n      p3 = v3 + v4;\n      p4 = v3 - v4;\n\n      // convert to 8-bit integers\n      p0 = (p0 < 16) ? 0 : (p0 >= 4080) ? 255 : p0 >> 4;\n      p1 = (p1 < 16) ? 0 : (p1 >= 4080) ? 255 : p1 >> 4;\n      p2 = (p2 < 16) ? 0 : (p2 >= 4080) ? 255 : p2 >> 4;\n      p3 = (p3 < 16) ? 0 : (p3 >= 4080) ? 255 : p3 >> 4;\n      p4 = (p4 < 16) ? 0 : (p4 >= 4080) ? 255 : p4 >> 4;\n      p5 = (p5 < 16) ? 0 : (p5 >= 4080) ? 255 : p5 >> 4;\n      p6 = (p6 < 16) ? 0 : (p6 >= 4080) ? 255 : p6 >> 4;\n      p7 = (p7 < 16) ? 0 : (p7 >= 4080) ? 255 : p7 >> 4;\n\n      // store block data\n      blockData[blockBufferOffset + col] = p0;\n      blockData[blockBufferOffset + col +  8] = p1;\n      blockData[blockBufferOffset + col + 16] = p2;\n      blockData[blockBufferOffset + col + 24] = p3;\n      blockData[blockBufferOffset + col + 32] = p4;\n      blockData[blockBufferOffset + col + 40] = p5;\n      blockData[blockBufferOffset + col + 48] = p6;\n      blockData[blockBufferOffset + col + 56] = p7;\n    }\n  }\n\n  function buildComponentData(frame, component) {\n    var blocksPerLine = component.blocksPerLine;\n    var blocksPerColumn = component.blocksPerColumn;\n    var computationBuffer = new Int16Array(64);\n\n    for (var blockRow = 0; blockRow < blocksPerColumn; blockRow++) {\n      for (var blockCol = 0; blockCol < blocksPerLine; blockCol++) {\n        var offset = getBlockBufferOffset(component, blockRow, blockCol);\n        quantizeAndInverse(component, offset, computationBuffer);\n      }\n    }\n    return component.blockData;\n  }\n\n  function findNextFileMarker(data, currentPos, startPos = currentPos) {\n    function peekUint16(pos) {\n      return (data[pos] << 8) | data[pos + 1];\n    }\n\n    const maxPos = data.length - 1;\n    var newPos = startPos < currentPos ? startPos : currentPos;\n\n    if (currentPos >= maxPos) {\n      return null; // Don't attempt to read non-existent data and just return.\n    }\n    var currentMarker = peekUint16(currentPos);\n    if (currentMarker >= 0xFFC0 && currentMarker <= 0xFFFE) {\n      return {\n        invalid: null,\n        marker: currentMarker,\n        offset: currentPos,\n      };\n    }\n    var newMarker = peekUint16(newPos);\n    while (!(newMarker >= 0xFFC0 && newMarker <= 0xFFFE)) {\n      if (++newPos >= maxPos) {\n        return null; // Don't attempt to read non-existent data and just return.\n      }\n      newMarker = peekUint16(newPos);\n    }\n    return {\n      invalid: currentMarker.toString(16),\n      marker: newMarker,\n      offset: newPos,\n    };\n  }\n\n  JpegImage.prototype = {\n    parse(data, { dnlScanLines = null, } = {}) {\n\n      function readUint16() {\n        var value = (data[offset] << 8) | data[offset + 1];\n        offset += 2;\n        return value;\n      }\n\n      function readDataBlock() {\n        var length = readUint16();\n        var endOffset = offset + length - 2;\n\n        var fileMarker = findNextFileMarker(data, endOffset, offset);\n        if (fileMarker && fileMarker.invalid) {\n          warn('readDataBlock - incorrect length, current marker is: ' +\n               fileMarker.invalid);\n          endOffset = fileMarker.offset;\n        }\n\n        var array = data.subarray(offset, endOffset);\n        offset += array.length;\n        return array;\n      }\n\n      function prepareComponents(frame) {\n        var mcusPerLine = Math.ceil(frame.samplesPerLine / 8 / frame.maxH);\n        var mcusPerColumn = Math.ceil(frame.scanLines / 8 / frame.maxV);\n        for (var i = 0; i < frame.components.length; i++) {\n          component = frame.components[i];\n          var blocksPerLine = Math.ceil(Math.ceil(frame.samplesPerLine / 8) *\n                                        component.h / frame.maxH);\n          var blocksPerColumn = Math.ceil(Math.ceil(frame.scanLines / 8) *\n                                          component.v / frame.maxV);\n          var blocksPerLineForMcu = mcusPerLine * component.h;\n          var blocksPerColumnForMcu = mcusPerColumn * component.v;\n\n          var blocksBufferSize = 64 * blocksPerColumnForMcu *\n                                      (blocksPerLineForMcu + 1);\n          component.blockData = new Int16Array(blocksBufferSize);\n          component.blocksPerLine = blocksPerLine;\n          component.blocksPerColumn = blocksPerColumn;\n        }\n        frame.mcusPerLine = mcusPerLine;\n        frame.mcusPerColumn = mcusPerColumn;\n      }\n\n      var offset = 0;\n      var jfif = null;\n      var adobe = null;\n      var frame, resetInterval;\n      let numSOSMarkers = 0;\n      var quantizationTables = [];\n      var huffmanTablesAC = [], huffmanTablesDC = [];\n      var fileMarker = readUint16();\n      if (fileMarker !== 0xFFD8) { // SOI (Start of Image)\n        throw new JpegError('SOI not found');\n      }\n\n      fileMarker = readUint16();\n      markerLoop: while (fileMarker !== 0xFFD9) { // EOI (End of image)\n        var i, j, l;\n        switch (fileMarker) {\n          case 0xFFE0: // APP0 (Application Specific)\n          case 0xFFE1: // APP1\n          case 0xFFE2: // APP2\n          case 0xFFE3: // APP3\n          case 0xFFE4: // APP4\n          case 0xFFE5: // APP5\n          case 0xFFE6: // APP6\n          case 0xFFE7: // APP7\n          case 0xFFE8: // APP8\n          case 0xFFE9: // APP9\n          case 0xFFEA: // APP10\n          case 0xFFEB: // APP11\n          case 0xFFEC: // APP12\n          case 0xFFED: // APP13\n          case 0xFFEE: // APP14\n          case 0xFFEF: // APP15\n          case 0xFFFE: // COM (Comment)\n            var appData = readDataBlock();\n\n            if (fileMarker === 0xFFE0) {\n              if (appData[0] === 0x4A && appData[1] === 0x46 &&\n                  appData[2] === 0x49 && appData[3] === 0x46 &&\n                  appData[4] === 0) { // 'JFIF\\x00'\n                jfif = {\n                  version: { major: appData[5], minor: appData[6], },\n                  densityUnits: appData[7],\n                  xDensity: (appData[8] << 8) | appData[9],\n                  yDensity: (appData[10] << 8) | appData[11],\n                  thumbWidth: appData[12],\n                  thumbHeight: appData[13],\n                  thumbData: appData.subarray(14, 14 +\n                                              3 * appData[12] * appData[13]),\n                };\n              }\n            }\n            // TODO APP1 - Exif\n            if (fileMarker === 0xFFEE) {\n              if (appData[0] === 0x41 && appData[1] === 0x64 &&\n                  appData[2] === 0x6F && appData[3] === 0x62 &&\n                  appData[4] === 0x65) { // 'Adobe'\n                adobe = {\n                  version: (appData[5] << 8) | appData[6],\n                  flags0: (appData[7] << 8) | appData[8],\n                  flags1: (appData[9] << 8) | appData[10],\n                  transformCode: appData[11],\n                };\n              }\n            }\n            break;\n\n          case 0xFFDB: // DQT (Define Quantization Tables)\n            var quantizationTablesLength = readUint16();\n            var quantizationTablesEnd = quantizationTablesLength + offset - 2;\n            var z;\n            while (offset < quantizationTablesEnd) {\n              var quantizationTableSpec = data[offset++];\n              var tableData = new Uint16Array(64);\n              if ((quantizationTableSpec >> 4) === 0) { // 8 bit values\n                for (j = 0; j < 64; j++) {\n                  z = dctZigZag[j];\n                  tableData[z] = data[offset++];\n                }\n              } else if ((quantizationTableSpec >> 4) === 1) { // 16 bit values\n                for (j = 0; j < 64; j++) {\n                  z = dctZigZag[j];\n                  tableData[z] = readUint16();\n                }\n              } else {\n                throw new JpegError('DQT - invalid table spec');\n              }\n              quantizationTables[quantizationTableSpec & 15] = tableData;\n            }\n            break;\n\n          case 0xFFC0: // SOF0 (Start of Frame, Baseline DCT)\n          case 0xFFC1: // SOF1 (Start of Frame, Extended DCT)\n          case 0xFFC2: // SOF2 (Start of Frame, Progressive DCT)\n            if (frame) {\n              throw new JpegError('Only single frame JPEGs supported');\n            }\n            readUint16(); // skip data length\n            frame = {};\n            frame.extended = (fileMarker === 0xFFC1);\n            frame.progressive = (fileMarker === 0xFFC2);\n            frame.precision = data[offset++];\n            const sofScanLines = readUint16();\n            frame.scanLines = dnlScanLines || sofScanLines;\n            frame.samplesPerLine = readUint16();\n            frame.components = [];\n            frame.componentIds = {};\n            var componentsCount = data[offset++], componentId;\n            var maxH = 0, maxV = 0;\n            for (i = 0; i < componentsCount; i++) {\n              componentId = data[offset];\n              var h = data[offset + 1] >> 4;\n              var v = data[offset + 1] & 15;\n              if (maxH < h) {\n                maxH = h;\n              }\n              if (maxV < v) {\n                maxV = v;\n              }\n              var qId = data[offset + 2];\n              l = frame.components.push({\n                h,\n                v,\n                quantizationId: qId,\n                quantizationTable: null, // See comment below.\n              });\n              frame.componentIds[componentId] = l - 1;\n              offset += 3;\n            }\n            frame.maxH = maxH;\n            frame.maxV = maxV;\n            prepareComponents(frame);\n            break;\n\n          case 0xFFC4: // DHT (Define Huffman Tables)\n            var huffmanLength = readUint16();\n            for (i = 2; i < huffmanLength;) {\n              var huffmanTableSpec = data[offset++];\n              var codeLengths = new Uint8Array(16);\n              var codeLengthSum = 0;\n              for (j = 0; j < 16; j++, offset++) {\n                codeLengthSum += (codeLengths[j] = data[offset]);\n              }\n              var huffmanValues = new Uint8Array(codeLengthSum);\n              for (j = 0; j < codeLengthSum; j++, offset++) {\n                huffmanValues[j] = data[offset];\n              }\n              i += 17 + codeLengthSum;\n\n              ((huffmanTableSpec >> 4) === 0 ?\n                huffmanTablesDC : huffmanTablesAC)[huffmanTableSpec & 15] =\n                buildHuffmanTable(codeLengths, huffmanValues);\n            }\n            break;\n\n          case 0xFFDD: // DRI (Define Restart Interval)\n            readUint16(); // skip data length\n            resetInterval = readUint16();\n            break;\n\n          case 0xFFDA: // SOS (Start of Scan)\n            // A DNL marker (0xFFDC), if it exists, is only allowed at the end\n            // of the first scan segment and may only occur once in an image.\n            // Furthermore, to prevent an infinite loop, do *not* attempt to\n            // parse DNL markers during re-parsing of the JPEG scan data.\n            const parseDNLMarker = (++numSOSMarkers) === 1 && !dnlScanLines;\n\n            readUint16(); // scanLength\n            var selectorsCount = data[offset++];\n            var components = [], component;\n            for (i = 0; i < selectorsCount; i++) {\n              var componentIndex = frame.componentIds[data[offset++]];\n              component = frame.components[componentIndex];\n              var tableSpec = data[offset++];\n              component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4];\n              component.huffmanTableAC = huffmanTablesAC[tableSpec & 15];\n              components.push(component);\n            }\n            var spectralStart = data[offset++];\n            var spectralEnd = data[offset++];\n            var successiveApproximation = data[offset++];\n            try {\n              var processed = decodeScan(data, offset,\n                frame, components, resetInterval,\n                spectralStart, spectralEnd,\n                successiveApproximation >> 4, successiveApproximation & 15,\n                parseDNLMarker);\n              offset += processed;\n            } catch (ex) {\n              if (ex instanceof DNLMarkerError) {\n                warn(`${ex.message} -- attempting to re-parse the JPEG image.`);\n                return this.parse(data, { dnlScanLines: ex.scanLines, });\n              } else if (ex instanceof EOIMarkerError) {\n                warn(`${ex.message} -- ignoring the rest of the image data.`);\n                break markerLoop;\n              }\n              throw ex;\n            }\n            break;\n\n          case 0xFFDC: // DNL (Define Number of Lines)\n            // Ignore the marker, since it's being handled in `decodeScan`.\n            offset += 4;\n            break;\n\n          case 0xFFFF: // Fill bytes\n            if (data[offset] !== 0xFF) { // Avoid skipping a valid marker.\n              offset--;\n            }\n            break;\n\n          default:\n            if (data[offset - 3] === 0xFF &&\n                data[offset - 2] >= 0xC0 && data[offset - 2] <= 0xFE) {\n              // could be incorrect encoding -- last 0xFF byte of the previous\n              // block was eaten by the encoder\n              offset -= 3;\n              break;\n            }\n            let nextFileMarker = findNextFileMarker(data, offset - 2);\n            if (nextFileMarker && nextFileMarker.invalid) {\n              warn('JpegImage.parse - unexpected data, current marker is: ' +\n                   nextFileMarker.invalid);\n              offset = nextFileMarker.offset;\n              break;\n            }\n            throw new JpegError('unknown marker ' + fileMarker.toString(16));\n        }\n        fileMarker = readUint16();\n      }\n\n      this.width = frame.samplesPerLine;\n      this.height = frame.scanLines;\n      this.jfif = jfif;\n      this.adobe = adobe;\n      this.components = [];\n      for (i = 0; i < frame.components.length; i++) {\n        component = frame.components[i];\n\n        // Prevent errors when DQT markers are placed after SOF{n} markers,\n        // by assigning the `quantizationTable` entry after the entire image\n        // has been parsed (fixes issue7406.pdf).\n        var quantizationTable = quantizationTables[component.quantizationId];\n        if (quantizationTable) {\n          component.quantizationTable = quantizationTable;\n        }\n\n        this.components.push({\n          output: buildComponentData(frame, component),\n          scaleX: component.h / frame.maxH,\n          scaleY: component.v / frame.maxV,\n          blocksPerLine: component.blocksPerLine,\n          blocksPerColumn: component.blocksPerColumn,\n        });\n      }\n      this.numComponents = this.components.length;\n    },\n\n    _getLinearizedBlockData(width, height, isSourcePDF = false) {\n      var scaleX = this.width / width, scaleY = this.height / height;\n\n      var component, componentScaleX, componentScaleY, blocksPerScanline;\n      var x, y, i, j, k;\n      var index;\n      var offset = 0;\n      var output;\n      var numComponents = this.components.length;\n      var dataLength = width * height * numComponents;\n      var data = new Uint8ClampedArray(dataLength);\n      var xScaleBlockOffset = new Uint32Array(width);\n      var mask3LSB = 0xfffffff8; // used to clear the 3 LSBs\n\n      for (i = 0; i < numComponents; i++) {\n        component = this.components[i];\n        componentScaleX = component.scaleX * scaleX;\n        componentScaleY = component.scaleY * scaleY;\n        offset = i;\n        output = component.output;\n        blocksPerScanline = (component.blocksPerLine + 1) << 3;\n        // precalculate the xScaleBlockOffset\n        for (x = 0; x < width; x++) {\n          j = 0 | (x * componentScaleX);\n          xScaleBlockOffset[x] = ((j & mask3LSB) << 3) | (j & 7);\n        }\n        // linearize the blocks of the component\n        for (y = 0; y < height; y++) {\n          j = 0 | (y * componentScaleY);\n          index = blocksPerScanline * (j & mask3LSB) | ((j & 7) << 3);\n          for (x = 0; x < width; x++) {\n            data[offset] = output[index + xScaleBlockOffset[x]];\n            offset += numComponents;\n          }\n        }\n      }\n\n      // decodeTransform contains pairs of multiplier (-256..256) and additive\n      let transform = this._decodeTransform;\n\n      // In PDF files, JPEG images with CMYK colour spaces are usually inverted\n      // (this can be observed by extracting the raw image data).\n      // Since the conversion algorithms (see below) were written primarily for\n      // the PDF use-cases, attempting to use `JpegImage` to parse standalone\n      // JPEG (CMYK) images may thus result in inverted images (see issue 9513).\n      //\n      // Unfortunately it's not (always) possible to tell, from the image data\n      // alone, if it needs to be inverted. Thus in an attempt to provide better\n      // out-of-box behaviour when `JpegImage` is used standalone, default to\n      // inverting JPEG (CMYK) images if and only if the image data does *not*\n      // come from a PDF file and no `decodeTransform` was passed by the user.\n      if (!isSourcePDF && numComponents === 4 && !transform) {\n        transform = new Int32Array([\n          -256, 255, -256, 255, -256, 255, -256, 255]);\n      }\n\n      if (transform) {\n        for (i = 0; i < dataLength;) {\n          for (j = 0, k = 0; j < numComponents; j++, i++, k += 2) {\n            data[i] = ((data[i] * transform[k]) >> 8) + transform[k + 1];\n          }\n        }\n      }\n      return data;\n    },\n\n    get _isColorConversionNeeded() {\n      if (this.adobe) {\n        // The adobe transform marker overrides any previous setting.\n        return !!this.adobe.transformCode;\n      }\n      if (this.numComponents === 3) {\n        if (this._colorTransform === 0) {\n          // If the Adobe transform marker is not present and the image\n          // dictionary has a 'ColorTransform' entry, explicitly set to `0`,\n          // then the colours should *not* be transformed.\n          return false;\n        }\n        return true;\n      }\n      // `this.numComponents !== 3`\n      if (this._colorTransform === 1) {\n        // If the Adobe transform marker is not present and the image\n        // dictionary has a 'ColorTransform' entry, explicitly set to `1`,\n        // then the colours should be transformed.\n        return true;\n      }\n      return false;\n    },\n\n    _convertYccToRgb: function convertYccToRgb(data) {\n      var Y, Cb, Cr;\n      for (var i = 0, length = data.length; i < length; i += 3) {\n        Y = data[i];\n        Cb = data[i + 1];\n        Cr = data[i + 2];\n        data[i] = Y - 179.456 + 1.402 * Cr;\n        data[i + 1] = Y + 135.459 - 0.344 * Cb - 0.714 * Cr;\n        data[i + 2] = Y - 226.816 + 1.772 * Cb;\n      }\n      return data;\n    },\n\n    _convertYcckToRgb: function convertYcckToRgb(data) {\n      var Y, Cb, Cr, k;\n      var offset = 0;\n      for (var i = 0, length = data.length; i < length; i += 4) {\n        Y = data[i];\n        Cb = data[i + 1];\n        Cr = data[i + 2];\n        k = data[i + 3];\n\n        data[offset++] = -122.67195406894 +\n          Cb * (-6.60635669420364e-5 * Cb + 0.000437130475926232 * Cr -\n                5.4080610064599e-5 * Y + 0.00048449797120281 * k -\n                0.154362151871126) +\n          Cr * (-0.000957964378445773 * Cr + 0.000817076911346625 * Y -\n                0.00477271405408747 * k + 1.53380253221734) +\n          Y * (0.000961250184130688 * Y - 0.00266257332283933 * k +\n               0.48357088451265) +\n          k * (-0.000336197177618394 * k + 0.484791561490776);\n\n        data[offset++] = 107.268039397724 +\n          Cb * (2.19927104525741e-5 * Cb - 0.000640992018297945 * Cr +\n                0.000659397001245577 * Y + 0.000426105652938837 * k -\n                0.176491792462875) +\n          Cr * (-0.000778269941513683 * Cr + 0.00130872261408275 * Y +\n                0.000770482631801132 * k - 0.151051492775562) +\n          Y * (0.00126935368114843 * Y - 0.00265090189010898 * k +\n               0.25802910206845) +\n          k * (-0.000318913117588328 * k - 0.213742400323665);\n\n        data[offset++] = -20.810012546947 +\n          Cb * (-0.000570115196973677 * Cb - 2.63409051004589e-5 * Cr +\n                0.0020741088115012 * Y - 0.00288260236853442 * k +\n                0.814272968359295) +\n          Cr * (-1.53496057440975e-5 * Cr - 0.000132689043961446 * Y +\n                0.000560833691242812 * k - 0.195152027534049) +\n          Y * (0.00174418132927582 * Y - 0.00255243321439347 * k +\n               0.116935020465145) +\n          k * (-0.000343531996510555 * k + 0.24165260232407);\n      }\n      // Ensure that only the converted RGB data is returned.\n      return data.subarray(0, offset);\n    },\n\n    _convertYcckToCmyk: function convertYcckToCmyk(data) {\n      var Y, Cb, Cr;\n      for (var i = 0, length = data.length; i < length; i += 4) {\n        Y = data[i];\n        Cb = data[i + 1];\n        Cr = data[i + 2];\n        data[i] = 434.456 - Y - 1.402 * Cr;\n        data[i + 1] = 119.541 - Y + 0.344 * Cb + 0.714 * Cr;\n        data[i + 2] = 481.816 - Y - 1.772 * Cb;\n        // K in data[i + 3] is unchanged\n      }\n      return data;\n    },\n\n    _convertCmykToRgb: function convertCmykToRgb(data) {\n      var c, m, y, k;\n      var offset = 0;\n      var scale = 1 / 255;\n      for (var i = 0, length = data.length; i < length; i += 4) {\n        c = data[i] * scale;\n        m = data[i + 1] * scale;\n        y = data[i + 2] * scale;\n        k = data[i + 3] * scale;\n\n        data[offset++] = 255 +\n          c * (-4.387332384609988 * c + 54.48615194189176 * m +\n               18.82290502165302 * y + 212.25662451639585 * k -\n               285.2331026137004) +\n          m * (1.7149763477362134 * m - 5.6096736904047315 * y -\n               17.873870861415444 * k - 5.497006427196366) +\n          y * (-2.5217340131683033 * y - 21.248923337353073 * k +\n               17.5119270841813) -\n          k * (21.86122147463605 * k + 189.48180835922747);\n\n        data[offset++] = 255 +\n          c * (8.841041422036149 * c + 60.118027045597366 * m +\n               6.871425592049007 * y + 31.159100130055922 * k -\n               79.2970844816548) +\n          m * (-15.310361306967817 * m + 17.575251261109482 * y +\n               131.35250912493976 * k - 190.9453302588951) +\n          y * (4.444339102852739 * y + 9.8632861493405 * k -\n               24.86741582555878) -\n          k * (20.737325471181034 * k + 187.80453709719578);\n\n        data[offset++] = 255 +\n          c * (0.8842522430003296 * c + 8.078677503112928 * m +\n               30.89978309703729 * y - 0.23883238689178934 * k -\n               14.183576799673286) +\n          m * (10.49593273432072 * m + 63.02378494754052 * y +\n               50.606957656360734 * k - 112.23884253719248) +\n          y * (0.03296041114873217 * y + 115.60384449646641 * k -\n               193.58209356861505) -\n          k * (22.33816807309886 * k + 180.12613974708367);\n      }\n      // Ensure that only the converted RGB data is returned.\n      return data.subarray(0, offset);\n    },\n\n    getData({ width, height, forceRGB = false, isSourcePDF = false, }) {\n      if (typeof PDFJSDev !== 'undefined' && PDFJSDev.test('TESTING && !LIB')) {\n        assert(isSourcePDF === true,\n          'JpegImage.getData: Unexpected \"isSourcePDF\" value for PDF files.');\n      }\n      if (this.numComponents > 4) {\n        throw new JpegError('Unsupported color mode');\n      }\n      // Type of data: Uint8ClampedArray(width * height * numComponents)\n      var data = this._getLinearizedBlockData(width, height, isSourcePDF);\n\n      if (this.numComponents === 1 && forceRGB) {\n        var dataLength = data.length;\n        var rgbData = new Uint8ClampedArray(dataLength * 3);\n        var offset = 0;\n        for (var i = 0; i < dataLength; i++) {\n          var grayColor = data[i];\n          rgbData[offset++] = grayColor;\n          rgbData[offset++] = grayColor;\n          rgbData[offset++] = grayColor;\n        }\n        return rgbData;\n      } else if (this.numComponents === 3 && this._isColorConversionNeeded) {\n        return this._convertYccToRgb(data);\n      } else if (this.numComponents === 4) {\n        if (this._isColorConversionNeeded) {\n          if (forceRGB) {\n            return this._convertYcckToRgb(data);\n          }\n          return this._convertYcckToCmyk(data);\n        } else if (forceRGB) {\n          return this._convertCmykToRgb(data);\n        }\n      }\n      return data;\n    },\n  };\n\n  return JpegImage;\n})();\n\nexport {\n  JpegImage,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DecodeStream } from './stream';\nimport { JpxImage } from './jpx';\nimport { shadow } from '../shared/util';\n\n/**\n * For JPEG 2000's we use a library to decode these images and\n * the stream behaves like all the other DecodeStreams.\n */\nlet JpxStream = (function JpxStreamClosure() {\n  function JpxStream(stream, maybeLength, dict, params) {\n    this.stream = stream;\n    this.maybeLength = maybeLength;\n    this.dict = dict;\n    this.params = params;\n\n    DecodeStream.call(this, maybeLength);\n  }\n\n  JpxStream.prototype = Object.create(DecodeStream.prototype);\n\n  Object.defineProperty(JpxStream.prototype, 'bytes', {\n    get: function JpxStream_bytes() {\n      // If `this.maybeLength` is null, we'll get the entire stream.\n      return shadow(this, 'bytes', this.stream.getBytes(this.maybeLength));\n    },\n    configurable: true,\n  });\n\n  JpxStream.prototype.ensureBuffer = function(requested) {\n    // No-op, since `this.readBlock` will always parse the entire image and\n    // directly insert all of its data into `this.buffer`.\n  };\n\n  JpxStream.prototype.readBlock = function() {\n    if (this.eof) {\n      return;\n    }\n    let jpxImage = new JpxImage();\n    jpxImage.parse(this.bytes);\n\n    let width = jpxImage.width;\n    let height = jpxImage.height;\n    let componentsCount = jpxImage.componentsCount;\n    let tileCount = jpxImage.tiles.length;\n    if (tileCount === 1) {\n      this.buffer = jpxImage.tiles[0].items;\n    } else {\n      let data = new Uint8ClampedArray(width * height * componentsCount);\n\n      for (let k = 0; k < tileCount; k++) {\n        let tileComponents = jpxImage.tiles[k];\n        let tileWidth = tileComponents.width;\n        let tileHeight = tileComponents.height;\n        let tileLeft = tileComponents.left;\n        let tileTop = tileComponents.top;\n\n        let src = tileComponents.items;\n        let srcPosition = 0;\n        let dataPosition = (width * tileTop + tileLeft) * componentsCount;\n        let imgRowSize = width * componentsCount;\n        let tileRowSize = tileWidth * componentsCount;\n\n        for (let j = 0; j < tileHeight; j++) {\n          let rowBytes = src.subarray(srcPosition, srcPosition + tileRowSize);\n          data.set(rowBytes, dataPosition);\n          srcPosition += tileRowSize;\n          dataPosition += imgRowSize;\n        }\n      }\n      this.buffer = data;\n    }\n    this.bufferLength = this.buffer.length;\n    this.eof = true;\n  };\n\n  return JpxStream;\n})();\n\nexport {\n  JpxStream,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  info, log2, readUint16, readUint32, warn\n} from '../shared/util';\nimport { ArithmeticDecoder } from './arithmetic_decoder';\n\nlet JpxError = (function JpxErrorClosure() {\n  function JpxError(msg) {\n    this.message = 'JPX error: ' + msg;\n  }\n\n  JpxError.prototype = new Error();\n  JpxError.prototype.name = 'JpxError';\n  JpxError.constructor = JpxError;\n\n  return JpxError;\n})();\n\nvar JpxImage = (function JpxImageClosure() {\n  // Table E.1\n  var SubbandsGainLog2 = {\n    'LL': 0,\n    'LH': 1,\n    'HL': 1,\n    'HH': 2,\n  };\n  function JpxImage() {\n    this.failOnCorruptedImage = false;\n  }\n  JpxImage.prototype = {\n    parse: function JpxImage_parse(data) {\n\n      var head = readUint16(data, 0);\n      // No box header, immediate start of codestream (SOC)\n      if (head === 0xFF4F) {\n        this.parseCodestream(data, 0, data.length);\n        return;\n      }\n\n      var position = 0, length = data.length;\n      while (position < length) {\n        var headerSize = 8;\n        var lbox = readUint32(data, position);\n        var tbox = readUint32(data, position + 4);\n        position += headerSize;\n        if (lbox === 1) {\n          // XLBox: read UInt64 according to spec.\n          // JavaScript's int precision of 53 bit should be sufficient here.\n          lbox = readUint32(data, position) * 4294967296 +\n                 readUint32(data, position + 4);\n          position += 8;\n          headerSize += 8;\n        }\n        if (lbox === 0) {\n          lbox = length - position + headerSize;\n        }\n        if (lbox < headerSize) {\n          throw new JpxError('Invalid box field size');\n        }\n        var dataLength = lbox - headerSize;\n        var jumpDataLength = true;\n        switch (tbox) {\n          case 0x6A703268: // 'jp2h'\n            jumpDataLength = false; // parsing child boxes\n            break;\n          case 0x636F6C72: // 'colr'\n            // Colorspaces are not used, the CS from the PDF is used.\n            var method = data[position];\n            if (method === 1) {\n              // enumerated colorspace\n              var colorspace = readUint32(data, position + 3);\n              switch (colorspace) {\n                case 16: // this indicates a sRGB colorspace\n                case 17: // this indicates a grayscale colorspace\n                case 18: // this indicates a YUV colorspace\n                  break;\n                default:\n                  warn('Unknown colorspace ' + colorspace);\n                  break;\n              }\n            } else if (method === 2) {\n              info('ICC profile not supported');\n            }\n            break;\n          case 0x6A703263: // 'jp2c'\n            this.parseCodestream(data, position, position + dataLength);\n            break;\n          case 0x6A502020: // 'jP\\024\\024'\n            if (readUint32(data, position) !== 0x0d0a870a) {\n              warn('Invalid JP2 signature');\n            }\n            break;\n          // The following header types are valid but currently not used:\n          case 0x6A501A1A: // 'jP\\032\\032'\n          case 0x66747970: // 'ftyp'\n          case 0x72726571: // 'rreq'\n          case 0x72657320: // 'res '\n          case 0x69686472: // 'ihdr'\n            break;\n          default:\n            var headerType = String.fromCharCode((tbox >> 24) & 0xFF,\n                                                 (tbox >> 16) & 0xFF,\n                                                 (tbox >> 8) & 0xFF,\n                                                 tbox & 0xFF);\n            warn('Unsupported header type ' + tbox + ' (' + headerType + ')');\n            break;\n        }\n        if (jumpDataLength) {\n          position += dataLength;\n        }\n      }\n    },\n    parseImageProperties: function JpxImage_parseImageProperties(stream) {\n      var newByte = stream.getByte();\n      while (newByte >= 0) {\n        var oldByte = newByte;\n        newByte = stream.getByte();\n        var code = (oldByte << 8) | newByte;\n        // Image and tile size (SIZ)\n        if (code === 0xFF51) {\n          stream.skip(4);\n          var Xsiz = stream.getInt32() >>> 0; // Byte 4\n          var Ysiz = stream.getInt32() >>> 0; // Byte 8\n          var XOsiz = stream.getInt32() >>> 0; // Byte 12\n          var YOsiz = stream.getInt32() >>> 0; // Byte 16\n          stream.skip(16);\n          var Csiz = stream.getUint16(); // Byte 36\n          this.width = Xsiz - XOsiz;\n          this.height = Ysiz - YOsiz;\n          this.componentsCount = Csiz;\n          // Results are always returned as `Uint8ClampedArray`s.\n          this.bitsPerComponent = 8;\n          return;\n        }\n      }\n      throw new JpxError('No size marker found in JPX stream');\n    },\n    parseCodestream: function JpxImage_parseCodestream(data, start, end) {\n      var context = {};\n      var doNotRecover = false;\n      try {\n        var position = start;\n        while (position + 1 < end) {\n          var code = readUint16(data, position);\n          position += 2;\n\n          var length = 0, j, sqcd, spqcds, spqcdSize, scalarExpounded, tile;\n          switch (code) {\n            case 0xFF4F: // Start of codestream (SOC)\n              context.mainHeader = true;\n              break;\n            case 0xFFD9: // End of codestream (EOC)\n              break;\n            case 0xFF51: // Image and tile size (SIZ)\n              length = readUint16(data, position);\n              var siz = {};\n              siz.Xsiz = readUint32(data, position + 4);\n              siz.Ysiz = readUint32(data, position + 8);\n              siz.XOsiz = readUint32(data, position + 12);\n              siz.YOsiz = readUint32(data, position + 16);\n              siz.XTsiz = readUint32(data, position + 20);\n              siz.YTsiz = readUint32(data, position + 24);\n              siz.XTOsiz = readUint32(data, position + 28);\n              siz.YTOsiz = readUint32(data, position + 32);\n              var componentsCount = readUint16(data, position + 36);\n              siz.Csiz = componentsCount;\n              var components = [];\n              j = position + 38;\n              for (var i = 0; i < componentsCount; i++) {\n                var component = {\n                  precision: (data[j] & 0x7F) + 1,\n                  isSigned: !!(data[j] & 0x80),\n                  XRsiz: data[j + 1],\n                  YRsiz: data[j + 2],\n                };\n                j += 3;\n                calculateComponentDimensions(component, siz);\n                components.push(component);\n              }\n              context.SIZ = siz;\n              context.components = components;\n              calculateTileGrids(context, components);\n              context.QCC = [];\n              context.COC = [];\n              break;\n            case 0xFF5C: // Quantization default (QCD)\n              length = readUint16(data, position);\n              var qcd = {};\n              j = position + 2;\n              sqcd = data[j++];\n              switch (sqcd & 0x1F) {\n                case 0:\n                  spqcdSize = 8;\n                  scalarExpounded = true;\n                  break;\n                case 1:\n                  spqcdSize = 16;\n                  scalarExpounded = false;\n                  break;\n                case 2:\n                  spqcdSize = 16;\n                  scalarExpounded = true;\n                  break;\n                default:\n                  throw new Error('Invalid SQcd value ' + sqcd);\n              }\n              qcd.noQuantization = (spqcdSize === 8);\n              qcd.scalarExpounded = scalarExpounded;\n              qcd.guardBits = sqcd >> 5;\n              spqcds = [];\n              while (j < length + position) {\n                var spqcd = {};\n                if (spqcdSize === 8) {\n                  spqcd.epsilon = data[j++] >> 3;\n                  spqcd.mu = 0;\n                } else {\n                  spqcd.epsilon = data[j] >> 3;\n                  spqcd.mu = ((data[j] & 0x7) << 8) | data[j + 1];\n                  j += 2;\n                }\n                spqcds.push(spqcd);\n              }\n              qcd.SPqcds = spqcds;\n              if (context.mainHeader) {\n                context.QCD = qcd;\n              } else {\n                context.currentTile.QCD = qcd;\n                context.currentTile.QCC = [];\n              }\n              break;\n            case 0xFF5D: // Quantization component (QCC)\n              length = readUint16(data, position);\n              var qcc = {};\n              j = position + 2;\n              var cqcc;\n              if (context.SIZ.Csiz < 257) {\n                cqcc = data[j++];\n              } else {\n                cqcc = readUint16(data, j);\n                j += 2;\n              }\n              sqcd = data[j++];\n              switch (sqcd & 0x1F) {\n                case 0:\n                  spqcdSize = 8;\n                  scalarExpounded = true;\n                  break;\n                case 1:\n                  spqcdSize = 16;\n                  scalarExpounded = false;\n                  break;\n                case 2:\n                  spqcdSize = 16;\n                  scalarExpounded = true;\n                  break;\n                default:\n                  throw new Error('Invalid SQcd value ' + sqcd);\n              }\n              qcc.noQuantization = (spqcdSize === 8);\n              qcc.scalarExpounded = scalarExpounded;\n              qcc.guardBits = sqcd >> 5;\n              spqcds = [];\n              while (j < (length + position)) {\n                spqcd = {};\n                if (spqcdSize === 8) {\n                  spqcd.epsilon = data[j++] >> 3;\n                  spqcd.mu = 0;\n                } else {\n                  spqcd.epsilon = data[j] >> 3;\n                  spqcd.mu = ((data[j] & 0x7) << 8) | data[j + 1];\n                  j += 2;\n                }\n                spqcds.push(spqcd);\n              }\n              qcc.SPqcds = spqcds;\n              if (context.mainHeader) {\n                context.QCC[cqcc] = qcc;\n              } else {\n                context.currentTile.QCC[cqcc] = qcc;\n              }\n              break;\n            case 0xFF52: // Coding style default (COD)\n              length = readUint16(data, position);\n              var cod = {};\n              j = position + 2;\n              var scod = data[j++];\n              cod.entropyCoderWithCustomPrecincts = !!(scod & 1);\n              cod.sopMarkerUsed = !!(scod & 2);\n              cod.ephMarkerUsed = !!(scod & 4);\n              cod.progressionOrder = data[j++];\n              cod.layersCount = readUint16(data, j);\n              j += 2;\n              cod.multipleComponentTransform = data[j++];\n\n              cod.decompositionLevelsCount = data[j++];\n              cod.xcb = (data[j++] & 0xF) + 2;\n              cod.ycb = (data[j++] & 0xF) + 2;\n              var blockStyle = data[j++];\n              cod.selectiveArithmeticCodingBypass = !!(blockStyle & 1);\n              cod.resetContextProbabilities = !!(blockStyle & 2);\n              cod.terminationOnEachCodingPass = !!(blockStyle & 4);\n              cod.verticallyStripe = !!(blockStyle & 8);\n              cod.predictableTermination = !!(blockStyle & 16);\n              cod.segmentationSymbolUsed = !!(blockStyle & 32);\n              cod.reversibleTransformation = data[j++];\n              if (cod.entropyCoderWithCustomPrecincts) {\n                var precinctsSizes = [];\n                while (j < length + position) {\n                  var precinctsSize = data[j++];\n                  precinctsSizes.push({\n                    PPx: precinctsSize & 0xF,\n                    PPy: precinctsSize >> 4,\n                  });\n                }\n                cod.precinctsSizes = precinctsSizes;\n              }\n              var unsupported = [];\n              if (cod.selectiveArithmeticCodingBypass) {\n                unsupported.push('selectiveArithmeticCodingBypass');\n              }\n              if (cod.resetContextProbabilities) {\n                unsupported.push('resetContextProbabilities');\n              }\n              if (cod.terminationOnEachCodingPass) {\n                unsupported.push('terminationOnEachCodingPass');\n              }\n              if (cod.verticallyStripe) {\n                unsupported.push('verticallyStripe');\n              }\n              if (cod.predictableTermination) {\n                unsupported.push('predictableTermination');\n              }\n              if (unsupported.length > 0) {\n                doNotRecover = true;\n                throw new Error('Unsupported COD options (' +\n                                unsupported.join(', ') + ')');\n              }\n              if (context.mainHeader) {\n                context.COD = cod;\n              } else {\n                context.currentTile.COD = cod;\n                context.currentTile.COC = [];\n              }\n              break;\n            case 0xFF90: // Start of tile-part (SOT)\n              length = readUint16(data, position);\n              tile = {};\n              tile.index = readUint16(data, position + 2);\n              tile.length = readUint32(data, position + 4);\n              tile.dataEnd = tile.length + position - 2;\n              tile.partIndex = data[position + 8];\n              tile.partsCount = data[position + 9];\n\n              context.mainHeader = false;\n              if (tile.partIndex === 0) {\n                // reset component specific settings\n                tile.COD = context.COD;\n                tile.COC = context.COC.slice(0); // clone of the global COC\n                tile.QCD = context.QCD;\n                tile.QCC = context.QCC.slice(0); // clone of the global COC\n              }\n              context.currentTile = tile;\n              break;\n            case 0xFF93: // Start of data (SOD)\n              tile = context.currentTile;\n              if (tile.partIndex === 0) {\n                initializeTile(context, tile.index);\n                buildPackets(context);\n              }\n\n              // moving to the end of the data\n              length = tile.dataEnd - position;\n              parseTilePackets(context, data, position, length);\n              break;\n            case 0xFF55: // Tile-part lengths, main header (TLM)\n            case 0xFF57: // Packet length, main header (PLM)\n            case 0xFF58: // Packet length, tile-part header (PLT)\n            case 0xFF64: // Comment (COM)\n              length = readUint16(data, position);\n              // skipping content\n              break;\n            case 0xFF53: // Coding style component (COC)\n              throw new Error('Codestream code 0xFF53 (COC) is ' +\n                              'not implemented');\n            default:\n              throw new Error('Unknown codestream code: ' + code.toString(16));\n          }\n          position += length;\n        }\n      } catch (e) {\n        if (doNotRecover || this.failOnCorruptedImage) {\n          throw new JpxError(e.message);\n        } else {\n          warn('JPX: Trying to recover from: ' + e.message);\n        }\n      }\n      this.tiles = transformComponents(context);\n      this.width = context.SIZ.Xsiz - context.SIZ.XOsiz;\n      this.height = context.SIZ.Ysiz - context.SIZ.YOsiz;\n      this.componentsCount = context.SIZ.Csiz;\n    },\n  };\n  function calculateComponentDimensions(component, siz) {\n    // Section B.2 Component mapping\n    component.x0 = Math.ceil(siz.XOsiz / component.XRsiz);\n    component.x1 = Math.ceil(siz.Xsiz / component.XRsiz);\n    component.y0 = Math.ceil(siz.YOsiz / component.YRsiz);\n    component.y1 = Math.ceil(siz.Ysiz / component.YRsiz);\n    component.width = component.x1 - component.x0;\n    component.height = component.y1 - component.y0;\n  }\n  function calculateTileGrids(context, components) {\n    var siz = context.SIZ;\n    // Section B.3 Division into tile and tile-components\n    var tile, tiles = [];\n    var numXtiles = Math.ceil((siz.Xsiz - siz.XTOsiz) / siz.XTsiz);\n    var numYtiles = Math.ceil((siz.Ysiz - siz.YTOsiz) / siz.YTsiz);\n    for (var q = 0; q < numYtiles; q++) {\n      for (var p = 0; p < numXtiles; p++) {\n        tile = {};\n        tile.tx0 = Math.max(siz.XTOsiz + p * siz.XTsiz, siz.XOsiz);\n        tile.ty0 = Math.max(siz.YTOsiz + q * siz.YTsiz, siz.YOsiz);\n        tile.tx1 = Math.min(siz.XTOsiz + (p + 1) * siz.XTsiz, siz.Xsiz);\n        tile.ty1 = Math.min(siz.YTOsiz + (q + 1) * siz.YTsiz, siz.Ysiz);\n        tile.width = tile.tx1 - tile.tx0;\n        tile.height = tile.ty1 - tile.ty0;\n        tile.components = [];\n        tiles.push(tile);\n      }\n    }\n    context.tiles = tiles;\n\n    var componentsCount = siz.Csiz;\n    for (var i = 0, ii = componentsCount; i < ii; i++) {\n      var component = components[i];\n      for (var j = 0, jj = tiles.length; j < jj; j++) {\n        var tileComponent = {};\n        tile = tiles[j];\n        tileComponent.tcx0 = Math.ceil(tile.tx0 / component.XRsiz);\n        tileComponent.tcy0 = Math.ceil(tile.ty0 / component.YRsiz);\n        tileComponent.tcx1 = Math.ceil(tile.tx1 / component.XRsiz);\n        tileComponent.tcy1 = Math.ceil(tile.ty1 / component.YRsiz);\n        tileComponent.width = tileComponent.tcx1 - tileComponent.tcx0;\n        tileComponent.height = tileComponent.tcy1 - tileComponent.tcy0;\n        tile.components[i] = tileComponent;\n      }\n    }\n  }\n  function getBlocksDimensions(context, component, r) {\n    var codOrCoc = component.codingStyleParameters;\n    var result = {};\n    if (!codOrCoc.entropyCoderWithCustomPrecincts) {\n      result.PPx = 15;\n      result.PPy = 15;\n    } else {\n      result.PPx = codOrCoc.precinctsSizes[r].PPx;\n      result.PPy = codOrCoc.precinctsSizes[r].PPy;\n    }\n    // calculate codeblock size as described in section B.7\n    result.xcb_ = (r > 0 ? Math.min(codOrCoc.xcb, result.PPx - 1) :\n                   Math.min(codOrCoc.xcb, result.PPx));\n    result.ycb_ = (r > 0 ? Math.min(codOrCoc.ycb, result.PPy - 1) :\n                   Math.min(codOrCoc.ycb, result.PPy));\n    return result;\n  }\n  function buildPrecincts(context, resolution, dimensions) {\n    // Section B.6 Division resolution to precincts\n    var precinctWidth = 1 << dimensions.PPx;\n    var precinctHeight = 1 << dimensions.PPy;\n    // Jasper introduces codeblock groups for mapping each subband codeblocks\n    // to precincts. Precinct partition divides a resolution according to width\n    // and height parameters. The subband that belongs to the resolution level\n    // has a different size than the level, unless it is the zero resolution.\n\n    // From Jasper documentation: jpeg2000.pdf, section K: Tier-2 coding:\n    // The precinct partitioning for a particular subband is derived from a\n    // partitioning of its parent LL band (i.e., the LL band at the next higher\n    // resolution level)... The LL band associated with each resolution level is\n    // divided into precincts... Each of the resulting precinct regions is then\n    // mapped into its child subbands (if any) at the next lower resolution\n    // level. This is accomplished by using the coordinate transformation\n    // (u, v) = (ceil(x/2), ceil(y/2)) where (x, y) and (u, v) are the\n    // coordinates of a point in the LL band and child subband, respectively.\n    var isZeroRes = resolution.resLevel === 0;\n    var precinctWidthInSubband = 1 << (dimensions.PPx + (isZeroRes ? 0 : -1));\n    var precinctHeightInSubband = 1 << (dimensions.PPy + (isZeroRes ? 0 : -1));\n    var numprecinctswide = (resolution.trx1 > resolution.trx0 ?\n      Math.ceil(resolution.trx1 / precinctWidth) -\n      Math.floor(resolution.trx0 / precinctWidth) : 0);\n    var numprecinctshigh = (resolution.try1 > resolution.try0 ?\n      Math.ceil(resolution.try1 / precinctHeight) -\n      Math.floor(resolution.try0 / precinctHeight) : 0);\n    var numprecincts = numprecinctswide * numprecinctshigh;\n\n    resolution.precinctParameters = {\n      precinctWidth,\n      precinctHeight,\n      numprecinctswide,\n      numprecinctshigh,\n      numprecincts,\n      precinctWidthInSubband,\n      precinctHeightInSubband,\n    };\n  }\n  function buildCodeblocks(context, subband, dimensions) {\n    // Section B.7 Division sub-band into code-blocks\n    var xcb_ = dimensions.xcb_;\n    var ycb_ = dimensions.ycb_;\n    var codeblockWidth = 1 << xcb_;\n    var codeblockHeight = 1 << ycb_;\n    var cbx0 = subband.tbx0 >> xcb_;\n    var cby0 = subband.tby0 >> ycb_;\n    var cbx1 = (subband.tbx1 + codeblockWidth - 1) >> xcb_;\n    var cby1 = (subband.tby1 + codeblockHeight - 1) >> ycb_;\n    var precinctParameters = subband.resolution.precinctParameters;\n    var codeblocks = [];\n    var precincts = [];\n    var i, j, codeblock, precinctNumber;\n    for (j = cby0; j < cby1; j++) {\n      for (i = cbx0; i < cbx1; i++) {\n        codeblock = {\n          cbx: i,\n          cby: j,\n          tbx0: codeblockWidth * i,\n          tby0: codeblockHeight * j,\n          tbx1: codeblockWidth * (i + 1),\n          tby1: codeblockHeight * (j + 1),\n        };\n\n        codeblock.tbx0_ = Math.max(subband.tbx0, codeblock.tbx0);\n        codeblock.tby0_ = Math.max(subband.tby0, codeblock.tby0);\n        codeblock.tbx1_ = Math.min(subband.tbx1, codeblock.tbx1);\n        codeblock.tby1_ = Math.min(subband.tby1, codeblock.tby1);\n\n        // Calculate precinct number for this codeblock, codeblock position\n        // should be relative to its subband, use actual dimension and position\n        // See comment about codeblock group width and height\n        var pi = Math.floor((codeblock.tbx0_ - subband.tbx0) /\n          precinctParameters.precinctWidthInSubband);\n        var pj = Math.floor((codeblock.tby0_ - subband.tby0) /\n          precinctParameters.precinctHeightInSubband);\n        precinctNumber = pi + (pj * precinctParameters.numprecinctswide);\n\n        codeblock.precinctNumber = precinctNumber;\n        codeblock.subbandType = subband.type;\n        codeblock.Lblock = 3;\n\n        if (codeblock.tbx1_ <= codeblock.tbx0_ ||\n            codeblock.tby1_ <= codeblock.tby0_) {\n          continue;\n        }\n        codeblocks.push(codeblock);\n        // building precinct for the sub-band\n        var precinct = precincts[precinctNumber];\n        if (precinct !== undefined) {\n          if (i < precinct.cbxMin) {\n            precinct.cbxMin = i;\n          } else if (i > precinct.cbxMax) {\n            precinct.cbxMax = i;\n          }\n          if (j < precinct.cbyMin) {\n            precinct.cbxMin = j;\n          } else if (j > precinct.cbyMax) {\n            precinct.cbyMax = j;\n          }\n        } else {\n          precincts[precinctNumber] = precinct = {\n            cbxMin: i,\n            cbyMin: j,\n            cbxMax: i,\n            cbyMax: j,\n          };\n        }\n        codeblock.precinct = precinct;\n      }\n    }\n    subband.codeblockParameters = {\n      codeblockWidth: xcb_,\n      codeblockHeight: ycb_,\n      numcodeblockwide: cbx1 - cbx0 + 1,\n      numcodeblockhigh: cby1 - cby0 + 1,\n    };\n    subband.codeblocks = codeblocks;\n    subband.precincts = precincts;\n  }\n  function createPacket(resolution, precinctNumber, layerNumber) {\n    var precinctCodeblocks = [];\n    // Section B.10.8 Order of info in packet\n    var subbands = resolution.subbands;\n    // sub-bands already ordered in 'LL', 'HL', 'LH', and 'HH' sequence\n    for (var i = 0, ii = subbands.length; i < ii; i++) {\n      var subband = subbands[i];\n      var codeblocks = subband.codeblocks;\n      for (var j = 0, jj = codeblocks.length; j < jj; j++) {\n        var codeblock = codeblocks[j];\n        if (codeblock.precinctNumber !== precinctNumber) {\n          continue;\n        }\n        precinctCodeblocks.push(codeblock);\n      }\n    }\n    return {\n      layerNumber,\n      codeblocks: precinctCodeblocks,\n    };\n  }\n  function LayerResolutionComponentPositionIterator(context) {\n    var siz = context.SIZ;\n    var tileIndex = context.currentTile.index;\n    var tile = context.tiles[tileIndex];\n    var layersCount = tile.codingStyleDefaultParameters.layersCount;\n    var componentsCount = siz.Csiz;\n    var maxDecompositionLevelsCount = 0;\n    for (var q = 0; q < componentsCount; q++) {\n      maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount,\n        tile.components[q].codingStyleParameters.decompositionLevelsCount);\n    }\n\n    var l = 0, r = 0, i = 0, k = 0;\n\n    this.nextPacket = function JpxImage_nextPacket() {\n      // Section B.12.1.1 Layer-resolution-component-position\n      for (; l < layersCount; l++) {\n        for (; r <= maxDecompositionLevelsCount; r++) {\n          for (; i < componentsCount; i++) {\n            var component = tile.components[i];\n            if (r > component.codingStyleParameters.decompositionLevelsCount) {\n              continue;\n            }\n\n            var resolution = component.resolutions[r];\n            var numprecincts = resolution.precinctParameters.numprecincts;\n            for (; k < numprecincts;) {\n              var packet = createPacket(resolution, k, l);\n              k++;\n              return packet;\n            }\n            k = 0;\n          }\n          i = 0;\n        }\n        r = 0;\n      }\n      throw new JpxError('Out of packets');\n    };\n  }\n  function ResolutionLayerComponentPositionIterator(context) {\n    var siz = context.SIZ;\n    var tileIndex = context.currentTile.index;\n    var tile = context.tiles[tileIndex];\n    var layersCount = tile.codingStyleDefaultParameters.layersCount;\n    var componentsCount = siz.Csiz;\n    var maxDecompositionLevelsCount = 0;\n    for (var q = 0; q < componentsCount; q++) {\n      maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount,\n        tile.components[q].codingStyleParameters.decompositionLevelsCount);\n    }\n\n    var r = 0, l = 0, i = 0, k = 0;\n\n    this.nextPacket = function JpxImage_nextPacket() {\n      // Section B.12.1.2 Resolution-layer-component-position\n      for (; r <= maxDecompositionLevelsCount; r++) {\n        for (; l < layersCount; l++) {\n          for (; i < componentsCount; i++) {\n            var component = tile.components[i];\n            if (r > component.codingStyleParameters.decompositionLevelsCount) {\n              continue;\n            }\n\n            var resolution = component.resolutions[r];\n            var numprecincts = resolution.precinctParameters.numprecincts;\n            for (; k < numprecincts;) {\n              var packet = createPacket(resolution, k, l);\n              k++;\n              return packet;\n            }\n            k = 0;\n          }\n          i = 0;\n        }\n        l = 0;\n      }\n      throw new JpxError('Out of packets');\n    };\n  }\n  function ResolutionPositionComponentLayerIterator(context) {\n    var siz = context.SIZ;\n    var tileIndex = context.currentTile.index;\n    var tile = context.tiles[tileIndex];\n    var layersCount = tile.codingStyleDefaultParameters.layersCount;\n    var componentsCount = siz.Csiz;\n    var l, r, c, p;\n    var maxDecompositionLevelsCount = 0;\n    for (c = 0; c < componentsCount; c++) {\n      var component = tile.components[c];\n      maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount,\n        component.codingStyleParameters.decompositionLevelsCount);\n    }\n    var maxNumPrecinctsInLevel = new Int32Array(\n      maxDecompositionLevelsCount + 1);\n    for (r = 0; r <= maxDecompositionLevelsCount; ++r) {\n      var maxNumPrecincts = 0;\n      for (c = 0; c < componentsCount; ++c) {\n        var resolutions = tile.components[c].resolutions;\n        if (r < resolutions.length) {\n          maxNumPrecincts = Math.max(maxNumPrecincts,\n            resolutions[r].precinctParameters.numprecincts);\n        }\n      }\n      maxNumPrecinctsInLevel[r] = maxNumPrecincts;\n    }\n    l = 0;\n    r = 0;\n    c = 0;\n    p = 0;\n\n    this.nextPacket = function JpxImage_nextPacket() {\n      // Section B.12.1.3 Resolution-position-component-layer\n      for (; r <= maxDecompositionLevelsCount; r++) {\n        for (; p < maxNumPrecinctsInLevel[r]; p++) {\n          for (; c < componentsCount; c++) {\n            var component = tile.components[c];\n            if (r > component.codingStyleParameters.decompositionLevelsCount) {\n              continue;\n            }\n            var resolution = component.resolutions[r];\n            var numprecincts = resolution.precinctParameters.numprecincts;\n            if (p >= numprecincts) {\n              continue;\n            }\n            for (; l < layersCount;) {\n              var packet = createPacket(resolution, p, l);\n              l++;\n              return packet;\n            }\n            l = 0;\n          }\n          c = 0;\n        }\n        p = 0;\n      }\n      throw new JpxError('Out of packets');\n    };\n  }\n  function PositionComponentResolutionLayerIterator(context) {\n    var siz = context.SIZ;\n    var tileIndex = context.currentTile.index;\n    var tile = context.tiles[tileIndex];\n    var layersCount = tile.codingStyleDefaultParameters.layersCount;\n    var componentsCount = siz.Csiz;\n    var precinctsSizes = getPrecinctSizesInImageScale(tile);\n    var precinctsIterationSizes = precinctsSizes;\n    var l = 0, r = 0, c = 0, px = 0, py = 0;\n\n    this.nextPacket = function JpxImage_nextPacket() {\n      // Section B.12.1.4 Position-component-resolution-layer\n      for (; py < precinctsIterationSizes.maxNumHigh; py++) {\n        for (; px < precinctsIterationSizes.maxNumWide; px++) {\n          for (; c < componentsCount; c++) {\n            var component = tile.components[c];\n            var decompositionLevelsCount =\n              component.codingStyleParameters.decompositionLevelsCount;\n            for (; r <= decompositionLevelsCount; r++) {\n              var resolution = component.resolutions[r];\n              var sizeInImageScale =\n                precinctsSizes.components[c].resolutions[r];\n              var k = getPrecinctIndexIfExist(\n                px,\n                py,\n                sizeInImageScale,\n                precinctsIterationSizes,\n                resolution);\n              if (k === null) {\n                continue;\n              }\n              for (; l < layersCount;) {\n                var packet = createPacket(resolution, k, l);\n                l++;\n                return packet;\n              }\n              l = 0;\n            }\n            r = 0;\n          }\n          c = 0;\n        }\n        px = 0;\n      }\n      throw new JpxError('Out of packets');\n    };\n  }\n  function ComponentPositionResolutionLayerIterator(context) {\n    var siz = context.SIZ;\n    var tileIndex = context.currentTile.index;\n    var tile = context.tiles[tileIndex];\n    var layersCount = tile.codingStyleDefaultParameters.layersCount;\n    var componentsCount = siz.Csiz;\n    var precinctsSizes = getPrecinctSizesInImageScale(tile);\n    var l = 0, r = 0, c = 0, px = 0, py = 0;\n\n    this.nextPacket = function JpxImage_nextPacket() {\n      // Section B.12.1.5 Component-position-resolution-layer\n      for (; c < componentsCount; ++c) {\n        var component = tile.components[c];\n        var precinctsIterationSizes = precinctsSizes.components[c];\n        var decompositionLevelsCount =\n          component.codingStyleParameters.decompositionLevelsCount;\n        for (; py < precinctsIterationSizes.maxNumHigh; py++) {\n          for (; px < precinctsIterationSizes.maxNumWide; px++) {\n            for (; r <= decompositionLevelsCount; r++) {\n              var resolution = component.resolutions[r];\n              var sizeInImageScale = precinctsIterationSizes.resolutions[r];\n              var k = getPrecinctIndexIfExist(\n                px,\n                py,\n                sizeInImageScale,\n                precinctsIterationSizes,\n                resolution);\n              if (k === null) {\n                continue;\n              }\n              for (; l < layersCount;) {\n                var packet = createPacket(resolution, k, l);\n                l++;\n                return packet;\n              }\n              l = 0;\n            }\n            r = 0;\n          }\n          px = 0;\n        }\n        py = 0;\n      }\n      throw new JpxError('Out of packets');\n    };\n  }\n  function getPrecinctIndexIfExist(\n    pxIndex, pyIndex, sizeInImageScale, precinctIterationSizes, resolution) {\n    var posX = pxIndex * precinctIterationSizes.minWidth;\n    var posY = pyIndex * precinctIterationSizes.minHeight;\n    if (posX % sizeInImageScale.width !== 0 ||\n        posY % sizeInImageScale.height !== 0) {\n      return null;\n    }\n    var startPrecinctRowIndex =\n      (posY / sizeInImageScale.width) *\n      resolution.precinctParameters.numprecinctswide;\n    return (posX / sizeInImageScale.height) + startPrecinctRowIndex;\n  }\n  function getPrecinctSizesInImageScale(tile) {\n    var componentsCount = tile.components.length;\n    var minWidth = Number.MAX_VALUE;\n    var minHeight = Number.MAX_VALUE;\n    var maxNumWide = 0;\n    var maxNumHigh = 0;\n    var sizePerComponent = new Array(componentsCount);\n    for (var c = 0; c < componentsCount; c++) {\n      var component = tile.components[c];\n      var decompositionLevelsCount =\n        component.codingStyleParameters.decompositionLevelsCount;\n      var sizePerResolution = new Array(decompositionLevelsCount + 1);\n      var minWidthCurrentComponent = Number.MAX_VALUE;\n      var minHeightCurrentComponent = Number.MAX_VALUE;\n      var maxNumWideCurrentComponent = 0;\n      var maxNumHighCurrentComponent = 0;\n      var scale = 1;\n      for (var r = decompositionLevelsCount; r >= 0; --r) {\n        var resolution = component.resolutions[r];\n        var widthCurrentResolution =\n          scale * resolution.precinctParameters.precinctWidth;\n        var heightCurrentResolution =\n          scale * resolution.precinctParameters.precinctHeight;\n        minWidthCurrentComponent = Math.min(\n          minWidthCurrentComponent,\n          widthCurrentResolution);\n        minHeightCurrentComponent = Math.min(\n          minHeightCurrentComponent,\n          heightCurrentResolution);\n        maxNumWideCurrentComponent = Math.max(maxNumWideCurrentComponent,\n          resolution.precinctParameters.numprecinctswide);\n        maxNumHighCurrentComponent = Math.max(maxNumHighCurrentComponent,\n          resolution.precinctParameters.numprecinctshigh);\n        sizePerResolution[r] = {\n          width: widthCurrentResolution,\n          height: heightCurrentResolution,\n        };\n        scale <<= 1;\n      }\n      minWidth = Math.min(minWidth, minWidthCurrentComponent);\n      minHeight = Math.min(minHeight, minHeightCurrentComponent);\n      maxNumWide = Math.max(maxNumWide, maxNumWideCurrentComponent);\n      maxNumHigh = Math.max(maxNumHigh, maxNumHighCurrentComponent);\n      sizePerComponent[c] = {\n        resolutions: sizePerResolution,\n        minWidth: minWidthCurrentComponent,\n        minHeight: minHeightCurrentComponent,\n        maxNumWide: maxNumWideCurrentComponent,\n        maxNumHigh: maxNumHighCurrentComponent,\n      };\n    }\n    return {\n      components: sizePerComponent,\n      minWidth,\n      minHeight,\n      maxNumWide,\n      maxNumHigh,\n    };\n  }\n  function buildPackets(context) {\n    var siz = context.SIZ;\n    var tileIndex = context.currentTile.index;\n    var tile = context.tiles[tileIndex];\n    var componentsCount = siz.Csiz;\n    // Creating resolutions and sub-bands for each component\n    for (var c = 0; c < componentsCount; c++) {\n      var component = tile.components[c];\n      var decompositionLevelsCount =\n        component.codingStyleParameters.decompositionLevelsCount;\n      // Section B.5 Resolution levels and sub-bands\n      var resolutions = [];\n      var subbands = [];\n      for (var r = 0; r <= decompositionLevelsCount; r++) {\n        var blocksDimensions = getBlocksDimensions(context, component, r);\n        var resolution = {};\n        var scale = 1 << (decompositionLevelsCount - r);\n        resolution.trx0 = Math.ceil(component.tcx0 / scale);\n        resolution.try0 = Math.ceil(component.tcy0 / scale);\n        resolution.trx1 = Math.ceil(component.tcx1 / scale);\n        resolution.try1 = Math.ceil(component.tcy1 / scale);\n        resolution.resLevel = r;\n        buildPrecincts(context, resolution, blocksDimensions);\n        resolutions.push(resolution);\n\n        var subband;\n        if (r === 0) {\n          // one sub-band (LL) with last decomposition\n          subband = {};\n          subband.type = 'LL';\n          subband.tbx0 = Math.ceil(component.tcx0 / scale);\n          subband.tby0 = Math.ceil(component.tcy0 / scale);\n          subband.tbx1 = Math.ceil(component.tcx1 / scale);\n          subband.tby1 = Math.ceil(component.tcy1 / scale);\n          subband.resolution = resolution;\n          buildCodeblocks(context, subband, blocksDimensions);\n          subbands.push(subband);\n          resolution.subbands = [subband];\n        } else {\n          var bscale = 1 << (decompositionLevelsCount - r + 1);\n          var resolutionSubbands = [];\n          // three sub-bands (HL, LH and HH) with rest of decompositions\n          subband = {};\n          subband.type = 'HL';\n          subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5);\n          subband.tby0 = Math.ceil(component.tcy0 / bscale);\n          subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5);\n          subband.tby1 = Math.ceil(component.tcy1 / bscale);\n          subband.resolution = resolution;\n          buildCodeblocks(context, subband, blocksDimensions);\n          subbands.push(subband);\n          resolutionSubbands.push(subband);\n\n          subband = {};\n          subband.type = 'LH';\n          subband.tbx0 = Math.ceil(component.tcx0 / bscale);\n          subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5);\n          subband.tbx1 = Math.ceil(component.tcx1 / bscale);\n          subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5);\n          subband.resolution = resolution;\n          buildCodeblocks(context, subband, blocksDimensions);\n          subbands.push(subband);\n          resolutionSubbands.push(subband);\n\n          subband = {};\n          subband.type = 'HH';\n          subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5);\n          subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5);\n          subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5);\n          subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5);\n          subband.resolution = resolution;\n          buildCodeblocks(context, subband, blocksDimensions);\n          subbands.push(subband);\n          resolutionSubbands.push(subband);\n\n          resolution.subbands = resolutionSubbands;\n        }\n      }\n      component.resolutions = resolutions;\n      component.subbands = subbands;\n    }\n    // Generate the packets sequence\n    var progressionOrder = tile.codingStyleDefaultParameters.progressionOrder;\n    switch (progressionOrder) {\n      case 0:\n        tile.packetsIterator =\n          new LayerResolutionComponentPositionIterator(context);\n        break;\n      case 1:\n        tile.packetsIterator =\n          new ResolutionLayerComponentPositionIterator(context);\n        break;\n      case 2:\n        tile.packetsIterator =\n          new ResolutionPositionComponentLayerIterator(context);\n        break;\n      case 3:\n        tile.packetsIterator =\n          new PositionComponentResolutionLayerIterator(context);\n        break;\n      case 4:\n        tile.packetsIterator =\n          new ComponentPositionResolutionLayerIterator(context);\n        break;\n      default:\n        throw new JpxError(`Unsupported progression order ${progressionOrder}`);\n    }\n  }\n  function parseTilePackets(context, data, offset, dataLength) {\n    var position = 0;\n    var buffer, bufferSize = 0, skipNextBit = false;\n    function readBits(count) {\n      while (bufferSize < count) {\n        var b = data[offset + position];\n        position++;\n        if (skipNextBit) {\n          buffer = (buffer << 7) | b;\n          bufferSize += 7;\n          skipNextBit = false;\n        } else {\n          buffer = (buffer << 8) | b;\n          bufferSize += 8;\n        }\n        if (b === 0xFF) {\n          skipNextBit = true;\n        }\n      }\n      bufferSize -= count;\n      return (buffer >>> bufferSize) & ((1 << count) - 1);\n    }\n    function skipMarkerIfEqual(value) {\n      if (data[offset + position - 1] === 0xFF &&\n          data[offset + position] === value) {\n        skipBytes(1);\n        return true;\n      } else if (data[offset + position] === 0xFF &&\n                 data[offset + position + 1] === value) {\n        skipBytes(2);\n        return true;\n      }\n      return false;\n    }\n    function skipBytes(count) {\n      position += count;\n    }\n    function alignToByte() {\n      bufferSize = 0;\n      if (skipNextBit) {\n        position++;\n        skipNextBit = false;\n      }\n    }\n    function readCodingpasses() {\n      if (readBits(1) === 0) {\n        return 1;\n      }\n      if (readBits(1) === 0) {\n        return 2;\n      }\n      var value = readBits(2);\n      if (value < 3) {\n        return value + 3;\n      }\n      value = readBits(5);\n      if (value < 31) {\n        return value + 6;\n      }\n      value = readBits(7);\n      return value + 37;\n    }\n    var tileIndex = context.currentTile.index;\n    var tile = context.tiles[tileIndex];\n    var sopMarkerUsed = context.COD.sopMarkerUsed;\n    var ephMarkerUsed = context.COD.ephMarkerUsed;\n    var packetsIterator = tile.packetsIterator;\n    while (position < dataLength) {\n      alignToByte();\n      if (sopMarkerUsed && skipMarkerIfEqual(0x91)) {\n        // Skip also marker segment length and packet sequence ID\n        skipBytes(4);\n      }\n      var packet = packetsIterator.nextPacket();\n      if (!readBits(1)) {\n        continue;\n      }\n      var layerNumber = packet.layerNumber;\n      var queue = [], codeblock;\n      for (var i = 0, ii = packet.codeblocks.length; i < ii; i++) {\n        codeblock = packet.codeblocks[i];\n        var precinct = codeblock.precinct;\n        var codeblockColumn = codeblock.cbx - precinct.cbxMin;\n        var codeblockRow = codeblock.cby - precinct.cbyMin;\n        var codeblockIncluded = false;\n        var firstTimeInclusion = false;\n        var valueReady;\n        if (codeblock['included'] !== undefined) {\n          codeblockIncluded = !!readBits(1);\n        } else {\n          // reading inclusion tree\n          precinct = codeblock.precinct;\n          var inclusionTree, zeroBitPlanesTree;\n          if (precinct['inclusionTree'] !== undefined) {\n            inclusionTree = precinct.inclusionTree;\n          } else {\n            // building inclusion and zero bit-planes trees\n            var width = precinct.cbxMax - precinct.cbxMin + 1;\n            var height = precinct.cbyMax - precinct.cbyMin + 1;\n            inclusionTree = new InclusionTree(width, height, layerNumber);\n            zeroBitPlanesTree = new TagTree(width, height);\n            precinct.inclusionTree = inclusionTree;\n            precinct.zeroBitPlanesTree = zeroBitPlanesTree;\n          }\n\n          if (inclusionTree.reset(codeblockColumn, codeblockRow, layerNumber)) {\n            while (true) {\n              if (readBits(1)) {\n                valueReady = !inclusionTree.nextLevel();\n                if (valueReady) {\n                  codeblock.included = true;\n                  codeblockIncluded = firstTimeInclusion = true;\n                  break;\n                }\n              } else {\n                inclusionTree.incrementValue(layerNumber);\n                break;\n              }\n            }\n          }\n        }\n        if (!codeblockIncluded) {\n          continue;\n        }\n        if (firstTimeInclusion) {\n          zeroBitPlanesTree = precinct.zeroBitPlanesTree;\n          zeroBitPlanesTree.reset(codeblockColumn, codeblockRow);\n          while (true) {\n            if (readBits(1)) {\n              valueReady = !zeroBitPlanesTree.nextLevel();\n              if (valueReady) {\n                break;\n              }\n            } else {\n              zeroBitPlanesTree.incrementValue();\n            }\n          }\n          codeblock.zeroBitPlanes = zeroBitPlanesTree.value;\n        }\n        var codingpasses = readCodingpasses();\n        while (readBits(1)) {\n          codeblock.Lblock++;\n        }\n        var codingpassesLog2 = log2(codingpasses);\n        // rounding down log2\n        var bits = ((codingpasses < (1 << codingpassesLog2)) ?\n          codingpassesLog2 - 1 : codingpassesLog2) + codeblock.Lblock;\n        var codedDataLength = readBits(bits);\n        queue.push({\n          codeblock,\n          codingpasses,\n          dataLength: codedDataLength,\n        });\n      }\n      alignToByte();\n      if (ephMarkerUsed) {\n        skipMarkerIfEqual(0x92);\n      }\n      while (queue.length > 0) {\n        var packetItem = queue.shift();\n        codeblock = packetItem.codeblock;\n        if (codeblock['data'] === undefined) {\n          codeblock.data = [];\n        }\n        codeblock.data.push({\n          data,\n          start: offset + position,\n          end: offset + position + packetItem.dataLength,\n          codingpasses: packetItem.codingpasses,\n        });\n        position += packetItem.dataLength;\n      }\n    }\n    return position;\n  }\n  function copyCoefficients(coefficients, levelWidth, levelHeight, subband,\n                            delta, mb, reversible, segmentationSymbolUsed) {\n    var x0 = subband.tbx0;\n    var y0 = subband.tby0;\n    var width = subband.tbx1 - subband.tbx0;\n    var codeblocks = subband.codeblocks;\n    var right = subband.type.charAt(0) === 'H' ? 1 : 0;\n    var bottom = subband.type.charAt(1) === 'H' ? levelWidth : 0;\n\n    for (var i = 0, ii = codeblocks.length; i < ii; ++i) {\n      var codeblock = codeblocks[i];\n      var blockWidth = codeblock.tbx1_ - codeblock.tbx0_;\n      var blockHeight = codeblock.tby1_ - codeblock.tby0_;\n      if (blockWidth === 0 || blockHeight === 0) {\n        continue;\n      }\n      if (codeblock['data'] === undefined) {\n        continue;\n      }\n\n      var bitModel, currentCodingpassType;\n      bitModel = new BitModel(blockWidth, blockHeight, codeblock.subbandType,\n                              codeblock.zeroBitPlanes, mb);\n      currentCodingpassType = 2; // first bit plane starts from cleanup\n\n      // collect data\n      var data = codeblock.data, totalLength = 0, codingpasses = 0;\n      var j, jj, dataItem;\n      for (j = 0, jj = data.length; j < jj; j++) {\n        dataItem = data[j];\n        totalLength += dataItem.end - dataItem.start;\n        codingpasses += dataItem.codingpasses;\n      }\n      var encodedData = new Uint8Array(totalLength);\n      var position = 0;\n      for (j = 0, jj = data.length; j < jj; j++) {\n        dataItem = data[j];\n        var chunk = dataItem.data.subarray(dataItem.start, dataItem.end);\n        encodedData.set(chunk, position);\n        position += chunk.length;\n      }\n      // decoding the item\n      var decoder = new ArithmeticDecoder(encodedData, 0, totalLength);\n      bitModel.setDecoder(decoder);\n\n      for (j = 0; j < codingpasses; j++) {\n        switch (currentCodingpassType) {\n          case 0:\n            bitModel.runSignificancePropagationPass();\n            break;\n          case 1:\n            bitModel.runMagnitudeRefinementPass();\n            break;\n          case 2:\n            bitModel.runCleanupPass();\n            if (segmentationSymbolUsed) {\n              bitModel.checkSegmentationSymbol();\n            }\n            break;\n        }\n        currentCodingpassType = (currentCodingpassType + 1) % 3;\n      }\n\n      var offset = (codeblock.tbx0_ - x0) + (codeblock.tby0_ - y0) * width;\n      var sign = bitModel.coefficentsSign;\n      var magnitude = bitModel.coefficentsMagnitude;\n      var bitsDecoded = bitModel.bitsDecoded;\n      var magnitudeCorrection = reversible ? 0 : 0.5;\n      var k, n, nb;\n      position = 0;\n      // Do the interleaving of Section F.3.3 here, so we do not need\n      // to copy later. LL level is not interleaved, just copied.\n      var interleave = (subband.type !== 'LL');\n      for (j = 0; j < blockHeight; j++) {\n        var row = (offset / width) | 0; // row in the non-interleaved subband\n        var levelOffset = 2 * row * (levelWidth - width) + right + bottom;\n        for (k = 0; k < blockWidth; k++) {\n          n = magnitude[position];\n          if (n !== 0) {\n            n = (n + magnitudeCorrection) * delta;\n            if (sign[position] !== 0) {\n              n = -n;\n            }\n            nb = bitsDecoded[position];\n            var pos = interleave ? (levelOffset + (offset << 1)) : offset;\n            if (reversible && (nb >= mb)) {\n              coefficients[pos] = n;\n            } else {\n              coefficients[pos] = n * (1 << (mb - nb));\n            }\n          }\n          offset++;\n          position++;\n        }\n        offset += width - blockWidth;\n      }\n    }\n  }\n  function transformTile(context, tile, c) {\n    var component = tile.components[c];\n    var codingStyleParameters = component.codingStyleParameters;\n    var quantizationParameters = component.quantizationParameters;\n    var decompositionLevelsCount =\n      codingStyleParameters.decompositionLevelsCount;\n    var spqcds = quantizationParameters.SPqcds;\n    var scalarExpounded = quantizationParameters.scalarExpounded;\n    var guardBits = quantizationParameters.guardBits;\n    var segmentationSymbolUsed = codingStyleParameters.segmentationSymbolUsed;\n    var precision = context.components[c].precision;\n\n    var reversible = codingStyleParameters.reversibleTransformation;\n    var transform = (reversible ? new ReversibleTransform() :\n                                  new IrreversibleTransform());\n\n    var subbandCoefficients = [];\n    var b = 0;\n    for (var i = 0; i <= decompositionLevelsCount; i++) {\n      var resolution = component.resolutions[i];\n\n      var width = resolution.trx1 - resolution.trx0;\n      var height = resolution.try1 - resolution.try0;\n      // Allocate space for the whole sublevel.\n      var coefficients = new Float32Array(width * height);\n\n      for (var j = 0, jj = resolution.subbands.length; j < jj; j++) {\n        var mu, epsilon;\n        if (!scalarExpounded) {\n          // formula E-5\n          mu = spqcds[0].mu;\n          epsilon = spqcds[0].epsilon + (i > 0 ? 1 - i : 0);\n        } else {\n          mu = spqcds[b].mu;\n          epsilon = spqcds[b].epsilon;\n          b++;\n        }\n\n        var subband = resolution.subbands[j];\n        var gainLog2 = SubbandsGainLog2[subband.type];\n\n        // calculate quantization coefficient (Section E.1.1.1)\n        var delta = (reversible ? 1 :\n          Math.pow(2, precision + gainLog2 - epsilon) * (1 + mu / 2048));\n        var mb = (guardBits + epsilon - 1);\n\n        // In the first resolution level, copyCoefficients will fill the\n        // whole array with coefficients. In the succeeding passes,\n        // copyCoefficients will consecutively fill in the values that belong\n        // to the interleaved positions of the HL, LH, and HH coefficients.\n        // The LL coefficients will then be interleaved in Transform.iterate().\n        copyCoefficients(coefficients, width, height, subband, delta, mb,\n                         reversible, segmentationSymbolUsed);\n      }\n      subbandCoefficients.push({\n        width,\n        height,\n        items: coefficients,\n      });\n    }\n\n    var result = transform.calculate(subbandCoefficients,\n                                     component.tcx0, component.tcy0);\n    return {\n      left: component.tcx0,\n      top: component.tcy0,\n      width: result.width,\n      height: result.height,\n      items: result.items,\n    };\n  }\n  function transformComponents(context) {\n    var siz = context.SIZ;\n    var components = context.components;\n    var componentsCount = siz.Csiz;\n    var resultImages = [];\n    for (var i = 0, ii = context.tiles.length; i < ii; i++) {\n      var tile = context.tiles[i];\n      var transformedTiles = [];\n      var c;\n      for (c = 0; c < componentsCount; c++) {\n        transformedTiles[c] = transformTile(context, tile, c);\n      }\n      var tile0 = transformedTiles[0];\n      var out = new Uint8ClampedArray(tile0.items.length * componentsCount);\n      var result = {\n        left: tile0.left,\n        top: tile0.top,\n        width: tile0.width,\n        height: tile0.height,\n        items: out,\n      };\n\n      // Section G.2.2 Inverse multi component transform\n      var shift, offset;\n      var pos = 0, j, jj, y0, y1, y2;\n      if (tile.codingStyleDefaultParameters.multipleComponentTransform) {\n        var fourComponents = componentsCount === 4;\n        var y0items = transformedTiles[0].items;\n        var y1items = transformedTiles[1].items;\n        var y2items = transformedTiles[2].items;\n        var y3items = fourComponents ? transformedTiles[3].items : null;\n\n        // HACK: The multiple component transform formulas below assume that\n        // all components have the same precision. With this in mind, we\n        // compute shift and offset only once.\n        shift = components[0].precision - 8;\n        offset = (128 << shift) + 0.5;\n\n        var component0 = tile.components[0];\n        var alpha01 = componentsCount - 3;\n        jj = y0items.length;\n        if (!component0.codingStyleParameters.reversibleTransformation) {\n          // inverse irreversible multiple component transform\n          for (j = 0; j < jj; j++, pos += alpha01) {\n            y0 = y0items[j] + offset;\n            y1 = y1items[j];\n            y2 = y2items[j];\n            out[pos++] = (y0 + 1.402 * y2) >> shift;\n            out[pos++] = (y0 - 0.34413 * y1 - 0.71414 * y2) >> shift;\n            out[pos++] = (y0 + 1.772 * y1) >> shift;\n          }\n        } else {\n          // inverse reversible multiple component transform\n          for (j = 0; j < jj; j++, pos += alpha01) {\n            y0 = y0items[j] + offset;\n            y1 = y1items[j];\n            y2 = y2items[j];\n            let g = y0 - ((y2 + y1) >> 2);\n\n            out[pos++] = (g + y2) >> shift;\n            out[pos++] = g >> shift;\n            out[pos++] = (g + y1) >> shift;\n          }\n        }\n        if (fourComponents) {\n          for (j = 0, pos = 3; j < jj; j++, pos += 4) {\n            out[pos] = (y3items[j] + offset) >> shift;\n          }\n        }\n      } else { // no multi-component transform\n        for (c = 0; c < componentsCount; c++) {\n          var items = transformedTiles[c].items;\n          shift = components[c].precision - 8;\n          offset = (128 << shift) + 0.5;\n          for (pos = c, j = 0, jj = items.length; j < jj; j++) {\n            out[pos] = (items[j] + offset) >> shift;\n            pos += componentsCount;\n          }\n        }\n      }\n      resultImages.push(result);\n    }\n    return resultImages;\n  }\n  function initializeTile(context, tileIndex) {\n    var siz = context.SIZ;\n    var componentsCount = siz.Csiz;\n    var tile = context.tiles[tileIndex];\n    for (var c = 0; c < componentsCount; c++) {\n      var component = tile.components[c];\n      var qcdOrQcc = (context.currentTile.QCC[c] !== undefined ?\n        context.currentTile.QCC[c] : context.currentTile.QCD);\n      component.quantizationParameters = qcdOrQcc;\n      var codOrCoc = (context.currentTile.COC[c] !== undefined ?\n        context.currentTile.COC[c] : context.currentTile.COD);\n      component.codingStyleParameters = codOrCoc;\n    }\n    tile.codingStyleDefaultParameters = context.currentTile.COD;\n  }\n\n  // Section B.10.2 Tag trees\n  var TagTree = (function TagTreeClosure() {\n    function TagTree(width, height) {\n      var levelsLength = log2(Math.max(width, height)) + 1;\n      this.levels = [];\n      for (var i = 0; i < levelsLength; i++) {\n        var level = {\n          width,\n          height,\n          items: [],\n        };\n        this.levels.push(level);\n        width = Math.ceil(width / 2);\n        height = Math.ceil(height / 2);\n      }\n    }\n    TagTree.prototype = {\n      reset: function TagTree_reset(i, j) {\n        var currentLevel = 0, value = 0, level;\n        while (currentLevel < this.levels.length) {\n          level = this.levels[currentLevel];\n          var index = i + j * level.width;\n          if (level.items[index] !== undefined) {\n            value = level.items[index];\n            break;\n          }\n          level.index = index;\n          i >>= 1;\n          j >>= 1;\n          currentLevel++;\n        }\n        currentLevel--;\n        level = this.levels[currentLevel];\n        level.items[level.index] = value;\n        this.currentLevel = currentLevel;\n        delete this.value;\n      },\n      incrementValue: function TagTree_incrementValue() {\n        var level = this.levels[this.currentLevel];\n        level.items[level.index]++;\n      },\n      nextLevel: function TagTree_nextLevel() {\n        var currentLevel = this.currentLevel;\n        var level = this.levels[currentLevel];\n        var value = level.items[level.index];\n        currentLevel--;\n        if (currentLevel < 0) {\n          this.value = value;\n          return false;\n        }\n\n        this.currentLevel = currentLevel;\n        level = this.levels[currentLevel];\n        level.items[level.index] = value;\n        return true;\n      },\n    };\n    return TagTree;\n  })();\n\n  var InclusionTree = (function InclusionTreeClosure() {\n    function InclusionTree(width, height, defaultValue) {\n      var levelsLength = log2(Math.max(width, height)) + 1;\n      this.levels = [];\n      for (var i = 0; i < levelsLength; i++) {\n        var items = new Uint8Array(width * height);\n        for (var j = 0, jj = items.length; j < jj; j++) {\n          items[j] = defaultValue;\n        }\n\n        var level = {\n          width,\n          height,\n          items,\n        };\n        this.levels.push(level);\n\n        width = Math.ceil(width / 2);\n        height = Math.ceil(height / 2);\n      }\n    }\n    InclusionTree.prototype = {\n      reset: function InclusionTree_reset(i, j, stopValue) {\n        var currentLevel = 0;\n        while (currentLevel < this.levels.length) {\n          var level = this.levels[currentLevel];\n          var index = i + j * level.width;\n          level.index = index;\n          var value = level.items[index];\n\n          if (value === 0xFF) {\n            break;\n          }\n\n          if (value > stopValue) {\n            this.currentLevel = currentLevel;\n            // already know about this one, propagating the value to top levels\n            this.propagateValues();\n            return false;\n          }\n\n          i >>= 1;\n          j >>= 1;\n          currentLevel++;\n        }\n        this.currentLevel = currentLevel - 1;\n        return true;\n      },\n      incrementValue: function InclusionTree_incrementValue(stopValue) {\n        var level = this.levels[this.currentLevel];\n        level.items[level.index] = stopValue + 1;\n        this.propagateValues();\n      },\n      propagateValues: function InclusionTree_propagateValues() {\n        var levelIndex = this.currentLevel;\n        var level = this.levels[levelIndex];\n        var currentValue = level.items[level.index];\n        while (--levelIndex >= 0) {\n          level = this.levels[levelIndex];\n          level.items[level.index] = currentValue;\n        }\n      },\n      nextLevel: function InclusionTree_nextLevel() {\n        var currentLevel = this.currentLevel;\n        var level = this.levels[currentLevel];\n        var value = level.items[level.index];\n        level.items[level.index] = 0xFF;\n        currentLevel--;\n        if (currentLevel < 0) {\n          return false;\n        }\n\n        this.currentLevel = currentLevel;\n        level = this.levels[currentLevel];\n        level.items[level.index] = value;\n        return true;\n      },\n    };\n    return InclusionTree;\n  })();\n\n  // Section D. Coefficient bit modeling\n  var BitModel = (function BitModelClosure() {\n    var UNIFORM_CONTEXT = 17;\n    var RUNLENGTH_CONTEXT = 18;\n    // Table D-1\n    // The index is binary presentation: 0dddvvhh, ddd - sum of Di (0..4),\n    // vv - sum of Vi (0..2), and hh - sum of Hi (0..2)\n    var LLAndLHContextsLabel = new Uint8Array([\n      0, 5, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 1, 6, 8, 0, 3, 7, 8, 0, 4,\n      7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6,\n      8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8\n    ]);\n    var HLContextLabel = new Uint8Array([\n      0, 3, 4, 0, 5, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 1, 3, 4, 0, 6, 7, 7, 0, 8,\n      8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3,\n      4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8\n    ]);\n    var HHContextLabel = new Uint8Array([\n      0, 1, 2, 0, 1, 2, 2, 0, 2, 2, 2, 0, 0, 0, 0, 0, 3, 4, 5, 0, 4, 5, 5, 0, 5,\n      5, 5, 0, 0, 0, 0, 0, 6, 7, 7, 0, 7, 7, 7, 0, 7, 7, 7, 0, 0, 0, 0, 0, 8, 8,\n      8, 0, 8, 8, 8, 0, 8, 8, 8, 0, 0, 0, 0, 0, 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8\n    ]);\n\n    function BitModel(width, height, subband, zeroBitPlanes, mb) {\n      this.width = width;\n      this.height = height;\n\n      this.contextLabelTable = (subband === 'HH' ? HHContextLabel :\n        (subband === 'HL' ? HLContextLabel : LLAndLHContextsLabel));\n\n      var coefficientCount = width * height;\n\n      // coefficients outside the encoding region treated as insignificant\n      // add border state cells for significanceState\n      this.neighborsSignificance = new Uint8Array(coefficientCount);\n      this.coefficentsSign = new Uint8Array(coefficientCount);\n      this.coefficentsMagnitude = mb > 14 ? new Uint32Array(coefficientCount) :\n                                  mb > 6 ? new Uint16Array(coefficientCount) :\n                                  new Uint8Array(coefficientCount);\n      this.processingFlags = new Uint8Array(coefficientCount);\n\n      var bitsDecoded = new Uint8Array(coefficientCount);\n      if (zeroBitPlanes !== 0) {\n        for (var i = 0; i < coefficientCount; i++) {\n          bitsDecoded[i] = zeroBitPlanes;\n        }\n      }\n      this.bitsDecoded = bitsDecoded;\n\n      this.reset();\n    }\n\n    BitModel.prototype = {\n      setDecoder: function BitModel_setDecoder(decoder) {\n        this.decoder = decoder;\n      },\n      reset: function BitModel_reset() {\n        // We have 17 contexts that are accessed via context labels,\n        // plus the uniform and runlength context.\n        this.contexts = new Int8Array(19);\n\n        // Contexts are packed into 1 byte:\n        // highest 7 bits carry the index, lowest bit carries mps\n        this.contexts[0] = (4 << 1) | 0;\n        this.contexts[UNIFORM_CONTEXT] = (46 << 1) | 0;\n        this.contexts[RUNLENGTH_CONTEXT] = (3 << 1) | 0;\n      },\n      setNeighborsSignificance:\n        function BitModel_setNeighborsSignificance(row, column, index) {\n        var neighborsSignificance = this.neighborsSignificance;\n        var width = this.width, height = this.height;\n        var left = (column > 0);\n        var right = (column + 1 < width);\n        var i;\n\n        if (row > 0) {\n          i = index - width;\n          if (left) {\n            neighborsSignificance[i - 1] += 0x10;\n          }\n          if (right) {\n            neighborsSignificance[i + 1] += 0x10;\n          }\n          neighborsSignificance[i] += 0x04;\n        }\n\n        if (row + 1 < height) {\n          i = index + width;\n          if (left) {\n            neighborsSignificance[i - 1] += 0x10;\n          }\n          if (right) {\n            neighborsSignificance[i + 1] += 0x10;\n          }\n          neighborsSignificance[i] += 0x04;\n        }\n\n        if (left) {\n          neighborsSignificance[index - 1] += 0x01;\n        }\n        if (right) {\n          neighborsSignificance[index + 1] += 0x01;\n        }\n        neighborsSignificance[index] |= 0x80;\n      },\n      runSignificancePropagationPass:\n        function BitModel_runSignificancePropagationPass() {\n        var decoder = this.decoder;\n        var width = this.width, height = this.height;\n        var coefficentsMagnitude = this.coefficentsMagnitude;\n        var coefficentsSign = this.coefficentsSign;\n        var neighborsSignificance = this.neighborsSignificance;\n        var processingFlags = this.processingFlags;\n        var contexts = this.contexts;\n        var labels = this.contextLabelTable;\n        var bitsDecoded = this.bitsDecoded;\n        var processedInverseMask = ~1;\n        var processedMask = 1;\n        var firstMagnitudeBitMask = 2;\n\n        for (var i0 = 0; i0 < height; i0 += 4) {\n          for (var j = 0; j < width; j++) {\n            var index = i0 * width + j;\n            for (var i1 = 0; i1 < 4; i1++, index += width) {\n              var i = i0 + i1;\n              if (i >= height) {\n                break;\n              }\n              // clear processed flag first\n              processingFlags[index] &= processedInverseMask;\n\n              if (coefficentsMagnitude[index] ||\n                  !neighborsSignificance[index]) {\n                continue;\n              }\n\n              var contextLabel = labels[neighborsSignificance[index]];\n              var decision = decoder.readBit(contexts, contextLabel);\n              if (decision) {\n                var sign = this.decodeSignBit(i, j, index);\n                coefficentsSign[index] = sign;\n                coefficentsMagnitude[index] = 1;\n                this.setNeighborsSignificance(i, j, index);\n                processingFlags[index] |= firstMagnitudeBitMask;\n              }\n              bitsDecoded[index]++;\n              processingFlags[index] |= processedMask;\n            }\n          }\n        }\n      },\n      decodeSignBit: function BitModel_decodeSignBit(row, column, index) {\n        var width = this.width, height = this.height;\n        var coefficentsMagnitude = this.coefficentsMagnitude;\n        var coefficentsSign = this.coefficentsSign;\n        var contribution, sign0, sign1, significance1;\n        var contextLabel, decoded;\n\n        // calculate horizontal contribution\n        significance1 = (column > 0 && coefficentsMagnitude[index - 1] !== 0);\n        if (column + 1 < width && coefficentsMagnitude[index + 1] !== 0) {\n          sign1 = coefficentsSign[index + 1];\n          if (significance1) {\n            sign0 = coefficentsSign[index - 1];\n            contribution = 1 - sign1 - sign0;\n          } else {\n            contribution = 1 - sign1 - sign1;\n          }\n        } else if (significance1) {\n          sign0 = coefficentsSign[index - 1];\n          contribution = 1 - sign0 - sign0;\n        } else {\n          contribution = 0;\n        }\n        var horizontalContribution = 3 * contribution;\n\n        // calculate vertical contribution and combine with the horizontal\n        significance1 = (row > 0 && coefficentsMagnitude[index - width] !== 0);\n        if (row + 1 < height && coefficentsMagnitude[index + width] !== 0) {\n          sign1 = coefficentsSign[index + width];\n          if (significance1) {\n            sign0 = coefficentsSign[index - width];\n            contribution = 1 - sign1 - sign0 + horizontalContribution;\n          } else {\n            contribution = 1 - sign1 - sign1 + horizontalContribution;\n          }\n        } else if (significance1) {\n          sign0 = coefficentsSign[index - width];\n          contribution = 1 - sign0 - sign0 + horizontalContribution;\n        } else {\n          contribution = horizontalContribution;\n        }\n\n        if (contribution >= 0) {\n          contextLabel = 9 + contribution;\n          decoded = this.decoder.readBit(this.contexts, contextLabel);\n        } else {\n          contextLabel = 9 - contribution;\n          decoded = this.decoder.readBit(this.contexts, contextLabel) ^ 1;\n        }\n        return decoded;\n      },\n      runMagnitudeRefinementPass:\n        function BitModel_runMagnitudeRefinementPass() {\n        var decoder = this.decoder;\n        var width = this.width, height = this.height;\n        var coefficentsMagnitude = this.coefficentsMagnitude;\n        var neighborsSignificance = this.neighborsSignificance;\n        var contexts = this.contexts;\n        var bitsDecoded = this.bitsDecoded;\n        var processingFlags = this.processingFlags;\n        var processedMask = 1;\n        var firstMagnitudeBitMask = 2;\n        var length = width * height;\n        var width4 = width * 4;\n\n        for (var index0 = 0, indexNext; index0 < length; index0 = indexNext) {\n          indexNext = Math.min(length, index0 + width4);\n          for (var j = 0; j < width; j++) {\n            for (var index = index0 + j; index < indexNext; index += width) {\n\n              // significant but not those that have just become\n              if (!coefficentsMagnitude[index] ||\n                (processingFlags[index] & processedMask) !== 0) {\n                continue;\n              }\n\n              var contextLabel = 16;\n              if ((processingFlags[index] & firstMagnitudeBitMask) !== 0) {\n                processingFlags[index] ^= firstMagnitudeBitMask;\n                // first refinement\n               var significance = neighborsSignificance[index] & 127;\n               contextLabel = significance === 0 ? 15 : 14;\n              }\n\n              var bit = decoder.readBit(contexts, contextLabel);\n              coefficentsMagnitude[index] =\n                (coefficentsMagnitude[index] << 1) | bit;\n              bitsDecoded[index]++;\n              processingFlags[index] |= processedMask;\n            }\n          }\n        }\n      },\n      runCleanupPass: function BitModel_runCleanupPass() {\n        var decoder = this.decoder;\n        var width = this.width, height = this.height;\n        var neighborsSignificance = this.neighborsSignificance;\n        var coefficentsMagnitude = this.coefficentsMagnitude;\n        var coefficentsSign = this.coefficentsSign;\n        var contexts = this.contexts;\n        var labels = this.contextLabelTable;\n        var bitsDecoded = this.bitsDecoded;\n        var processingFlags = this.processingFlags;\n        var processedMask = 1;\n        var firstMagnitudeBitMask = 2;\n        var oneRowDown = width;\n        var twoRowsDown = width * 2;\n        var threeRowsDown = width * 3;\n        var iNext;\n        for (var i0 = 0; i0 < height; i0 = iNext) {\n          iNext = Math.min(i0 + 4, height);\n          var indexBase = i0 * width;\n          var checkAllEmpty = i0 + 3 < height;\n          for (var j = 0; j < width; j++) {\n            var index0 = indexBase + j;\n            // using the property: labels[neighborsSignificance[index]] === 0\n            // when neighborsSignificance[index] === 0\n            var allEmpty = (checkAllEmpty &&\n              processingFlags[index0] === 0 &&\n              processingFlags[index0 + oneRowDown] === 0 &&\n              processingFlags[index0 + twoRowsDown] === 0 &&\n              processingFlags[index0 + threeRowsDown] === 0 &&\n              neighborsSignificance[index0] === 0 &&\n              neighborsSignificance[index0 + oneRowDown] === 0 &&\n              neighborsSignificance[index0 + twoRowsDown] === 0 &&\n              neighborsSignificance[index0 + threeRowsDown] === 0);\n            var i1 = 0, index = index0;\n            var i = i0, sign;\n            if (allEmpty) {\n              var hasSignificantCoefficent =\n                decoder.readBit(contexts, RUNLENGTH_CONTEXT);\n              if (!hasSignificantCoefficent) {\n                bitsDecoded[index0]++;\n                bitsDecoded[index0 + oneRowDown]++;\n                bitsDecoded[index0 + twoRowsDown]++;\n                bitsDecoded[index0 + threeRowsDown]++;\n                continue; // next column\n              }\n              i1 = (decoder.readBit(contexts, UNIFORM_CONTEXT) << 1) |\n                    decoder.readBit(contexts, UNIFORM_CONTEXT);\n              if (i1 !== 0) {\n                i = i0 + i1;\n                index += i1 * width;\n              }\n\n              sign = this.decodeSignBit(i, j, index);\n              coefficentsSign[index] = sign;\n              coefficentsMagnitude[index] = 1;\n              this.setNeighborsSignificance(i, j, index);\n              processingFlags[index] |= firstMagnitudeBitMask;\n\n              index = index0;\n              for (var i2 = i0; i2 <= i; i2++, index += width) {\n                bitsDecoded[index]++;\n              }\n\n              i1++;\n            }\n            for (i = i0 + i1; i < iNext; i++, index += width) {\n              if (coefficentsMagnitude[index] ||\n                (processingFlags[index] & processedMask) !== 0) {\n                continue;\n              }\n\n              var contextLabel = labels[neighborsSignificance[index]];\n              var decision = decoder.readBit(contexts, contextLabel);\n              if (decision === 1) {\n                sign = this.decodeSignBit(i, j, index);\n                coefficentsSign[index] = sign;\n                coefficentsMagnitude[index] = 1;\n                this.setNeighborsSignificance(i, j, index);\n                processingFlags[index] |= firstMagnitudeBitMask;\n              }\n              bitsDecoded[index]++;\n            }\n          }\n        }\n      },\n      checkSegmentationSymbol: function BitModel_checkSegmentationSymbol() {\n        var decoder = this.decoder;\n        var contexts = this.contexts;\n        var symbol = (decoder.readBit(contexts, UNIFORM_CONTEXT) << 3) |\n                     (decoder.readBit(contexts, UNIFORM_CONTEXT) << 2) |\n                     (decoder.readBit(contexts, UNIFORM_CONTEXT) << 1) |\n                      decoder.readBit(contexts, UNIFORM_CONTEXT);\n        if (symbol !== 0xA) {\n          throw new JpxError('Invalid segmentation symbol');\n        }\n      },\n    };\n\n    return BitModel;\n  })();\n\n  // Section F, Discrete wavelet transformation\n  var Transform = (function TransformClosure() {\n    function Transform() {}\n\n    Transform.prototype.calculate =\n      function transformCalculate(subbands, u0, v0) {\n      var ll = subbands[0];\n      for (var i = 1, ii = subbands.length; i < ii; i++) {\n        ll = this.iterate(ll, subbands[i], u0, v0);\n      }\n      return ll;\n    };\n    Transform.prototype.extend = function extend(buffer, offset, size) {\n      // Section F.3.7 extending... using max extension of 4\n      var i1 = offset - 1, j1 = offset + 1;\n      var i2 = offset + size - 2, j2 = offset + size;\n      buffer[i1--] = buffer[j1++];\n      buffer[j2++] = buffer[i2--];\n      buffer[i1--] = buffer[j1++];\n      buffer[j2++] = buffer[i2--];\n      buffer[i1--] = buffer[j1++];\n      buffer[j2++] = buffer[i2--];\n      buffer[i1] = buffer[j1];\n      buffer[j2] = buffer[i2];\n    };\n    Transform.prototype.iterate = function Transform_iterate(ll, hl_lh_hh,\n                                                             u0, v0) {\n      var llWidth = ll.width, llHeight = ll.height, llItems = ll.items;\n      var width = hl_lh_hh.width;\n      var height = hl_lh_hh.height;\n      var items = hl_lh_hh.items;\n      var i, j, k, l, u, v;\n\n      // Interleave LL according to Section F.3.3\n      for (k = 0, i = 0; i < llHeight; i++) {\n        l = i * 2 * width;\n        for (j = 0; j < llWidth; j++, k++, l += 2) {\n          items[l] = llItems[k];\n        }\n      }\n      // The LL band is not needed anymore.\n      llItems = ll.items = null;\n\n      var bufferPadding = 4;\n      var rowBuffer = new Float32Array(width + 2 * bufferPadding);\n\n      // Section F.3.4 HOR_SR\n      if (width === 1) {\n        // if width = 1, when u0 even keep items as is, when odd divide by 2\n        if ((u0 & 1) !== 0) {\n          for (v = 0, k = 0; v < height; v++, k += width) {\n            items[k] *= 0.5;\n          }\n        }\n      } else {\n        for (v = 0, k = 0; v < height; v++, k += width) {\n          rowBuffer.set(items.subarray(k, k + width), bufferPadding);\n\n          this.extend(rowBuffer, bufferPadding, width);\n          this.filter(rowBuffer, bufferPadding, width);\n\n          items.set(\n            rowBuffer.subarray(bufferPadding, bufferPadding + width),\n            k);\n        }\n      }\n\n      // Accesses to the items array can take long, because it may not fit into\n      // CPU cache and has to be fetched from main memory. Since subsequent\n      // accesses to the items array are not local when reading columns, we\n      // have a cache miss every time. To reduce cache misses, get up to\n      // 'numBuffers' items at a time and store them into the individual\n      // buffers. The colBuffers should be small enough to fit into CPU cache.\n      var numBuffers = 16;\n      var colBuffers = [];\n      for (i = 0; i < numBuffers; i++) {\n        colBuffers.push(new Float32Array(height + 2 * bufferPadding));\n      }\n      var b, currentBuffer = 0;\n      ll = bufferPadding + height;\n\n      // Section F.3.5 VER_SR\n      if (height === 1) {\n          // if height = 1, when v0 even keep items as is, when odd divide by 2\n        if ((v0 & 1) !== 0) {\n          for (u = 0; u < width; u++) {\n            items[u] *= 0.5;\n          }\n        }\n      } else {\n        for (u = 0; u < width; u++) {\n          // if we ran out of buffers, copy several image columns at once\n          if (currentBuffer === 0) {\n            numBuffers = Math.min(width - u, numBuffers);\n            for (k = u, l = bufferPadding; l < ll; k += width, l++) {\n              for (b = 0; b < numBuffers; b++) {\n                colBuffers[b][l] = items[k + b];\n              }\n            }\n            currentBuffer = numBuffers;\n          }\n\n          currentBuffer--;\n          var buffer = colBuffers[currentBuffer];\n          this.extend(buffer, bufferPadding, height);\n          this.filter(buffer, bufferPadding, height);\n\n          // If this is last buffer in this group of buffers, flush all buffers.\n          if (currentBuffer === 0) {\n            k = u - numBuffers + 1;\n            for (l = bufferPadding; l < ll; k += width, l++) {\n              for (b = 0; b < numBuffers; b++) {\n                items[k + b] = colBuffers[b][l];\n              }\n            }\n          }\n        }\n      }\n\n      return {\n        width,\n        height,\n        items,\n      };\n    };\n    return Transform;\n  })();\n\n  // Section 3.8.2 Irreversible 9-7 filter\n  var IrreversibleTransform = (function IrreversibleTransformClosure() {\n    function IrreversibleTransform() {\n      Transform.call(this);\n    }\n\n    IrreversibleTransform.prototype = Object.create(Transform.prototype);\n    IrreversibleTransform.prototype.filter =\n      function irreversibleTransformFilter(x, offset, length) {\n      var len = length >> 1;\n      offset = offset | 0;\n      var j, n, current, next;\n\n      var alpha = -1.586134342059924;\n      var beta = -0.052980118572961;\n      var gamma = 0.882911075530934;\n      var delta = 0.443506852043971;\n      var K = 1.230174104914001;\n      var K_ = 1 / K;\n\n      // step 1 is combined with step 3\n\n      // step 2\n      j = offset - 3;\n      for (n = len + 4; n--; j += 2) {\n        x[j] *= K_;\n      }\n\n      // step 1 & 3\n      j = offset - 2;\n      current = delta * x[j - 1];\n      for (n = len + 3; n--; j += 2) {\n        next = delta * x[j + 1];\n        x[j] = K * x[j] - current - next;\n        if (n--) {\n          j += 2;\n          current = delta * x[j + 1];\n          x[j] = K * x[j] - current - next;\n        } else {\n          break;\n        }\n      }\n\n      // step 4\n      j = offset - 1;\n      current = gamma * x[j - 1];\n      for (n = len + 2; n--; j += 2) {\n        next = gamma * x[j + 1];\n        x[j] -= current + next;\n        if (n--) {\n          j += 2;\n          current = gamma * x[j + 1];\n          x[j] -= current + next;\n        } else {\n          break;\n        }\n      }\n\n      // step 5\n      j = offset;\n      current = beta * x[j - 1];\n      for (n = len + 1; n--; j += 2) {\n        next = beta * x[j + 1];\n        x[j] -= current + next;\n        if (n--) {\n          j += 2;\n          current = beta * x[j + 1];\n          x[j] -= current + next;\n        } else {\n          break;\n        }\n      }\n\n      // step 6\n      if (len !== 0) {\n        j = offset + 1;\n        current = alpha * x[j - 1];\n        for (n = len; n--; j += 2) {\n          next = alpha * x[j + 1];\n          x[j] -= current + next;\n          if (n--) {\n            j += 2;\n            current = alpha * x[j + 1];\n            x[j] -= current + next;\n          } else {\n            break;\n          }\n        }\n      }\n    };\n\n    return IrreversibleTransform;\n  })();\n\n  // Section 3.8.1 Reversible 5-3 filter\n  var ReversibleTransform = (function ReversibleTransformClosure() {\n    function ReversibleTransform() {\n      Transform.call(this);\n    }\n\n    ReversibleTransform.prototype = Object.create(Transform.prototype);\n    ReversibleTransform.prototype.filter =\n      function reversibleTransformFilter(x, offset, length) {\n      var len = length >> 1;\n      offset = offset | 0;\n      var j, n;\n\n      for (j = offset, n = len + 1; n--; j += 2) {\n        x[j] -= (x[j - 1] + x[j + 1] + 2) >> 2;\n      }\n\n      for (j = offset + 1, n = len; n--; j += 2) {\n        x[j] += (x[j - 1] + x[j + 1]) >> 1;\n      }\n    };\n\n    return ReversibleTransform;\n  })();\n\n  return JpxImage;\n})();\n\nexport {\n  JpxImage,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  bytesToString, FormatError, PasswordException, PasswordResponses,\n  stringToBytes, unreachable, utf8StringToString, warn\n} from '../shared/util';\nimport { isDict, isName, Name } from './primitives';\nimport { DecryptStream } from './stream';\n\nvar ARCFourCipher = (function ARCFourCipherClosure() {\n  function ARCFourCipher(key) {\n    this.a = 0;\n    this.b = 0;\n    var s = new Uint8Array(256);\n    var i, j = 0, tmp, keyLength = key.length;\n    for (i = 0; i < 256; ++i) {\n      s[i] = i;\n    }\n    for (i = 0; i < 256; ++i) {\n      tmp = s[i];\n      j = (j + tmp + key[i % keyLength]) & 0xFF;\n      s[i] = s[j];\n      s[j] = tmp;\n    }\n    this.s = s;\n  }\n\n  ARCFourCipher.prototype = {\n    encryptBlock: function ARCFourCipher_encryptBlock(data) {\n      var i, n = data.length, tmp, tmp2;\n      var a = this.a, b = this.b, s = this.s;\n      var output = new Uint8Array(n);\n      for (i = 0; i < n; ++i) {\n        a = (a + 1) & 0xFF;\n        tmp = s[a];\n        b = (b + tmp) & 0xFF;\n        tmp2 = s[b];\n        s[a] = tmp2;\n        s[b] = tmp;\n        output[i] = data[i] ^ s[(tmp + tmp2) & 0xFF];\n      }\n      this.a = a;\n      this.b = b;\n      return output;\n    },\n  };\n  ARCFourCipher.prototype.decryptBlock = ARCFourCipher.prototype.encryptBlock;\n\n  return ARCFourCipher;\n})();\n\nvar calculateMD5 = (function calculateMD5Closure() {\n  var r = new Uint8Array([\n    7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22,\n    5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20,\n    4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23,\n    6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21]);\n\n  var k = new Int32Array([\n    -680876936, -389564586, 606105819, -1044525330, -176418897, 1200080426,\n    -1473231341, -45705983, 1770035416, -1958414417, -42063, -1990404162,\n    1804603682, -40341101, -1502002290, 1236535329, -165796510, -1069501632,\n    643717713, -373897302, -701558691, 38016083, -660478335, -405537848,\n    568446438, -1019803690, -187363961, 1163531501, -1444681467, -51403784,\n    1735328473, -1926607734, -378558, -2022574463, 1839030562, -35309556,\n    -1530992060, 1272893353, -155497632, -1094730640, 681279174, -358537222,\n    -722521979, 76029189, -640364487, -421815835, 530742520, -995338651,\n    -198630844, 1126891415, -1416354905, -57434055, 1700485571, -1894986606,\n    -1051523, -2054922799, 1873313359, -30611744, -1560198380, 1309151649,\n    -145523070, -1120210379, 718787259, -343485551]);\n\n  function hash(data, offset, length) {\n    var h0 = 1732584193, h1 = -271733879, h2 = -1732584194, h3 = 271733878;\n    // pre-processing\n    var paddedLength = (length + 72) & ~63; // data + 9 extra bytes\n    var padded = new Uint8Array(paddedLength);\n    var i, j, n;\n    for (i = 0; i < length; ++i) {\n      padded[i] = data[offset++];\n    }\n    padded[i++] = 0x80;\n    n = paddedLength - 8;\n    while (i < n) {\n      padded[i++] = 0;\n    }\n    padded[i++] = (length << 3) & 0xFF;\n    padded[i++] = (length >> 5) & 0xFF;\n    padded[i++] = (length >> 13) & 0xFF;\n    padded[i++] = (length >> 21) & 0xFF;\n    padded[i++] = (length >>> 29) & 0xFF;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    var w = new Int32Array(16);\n    for (i = 0; i < paddedLength;) {\n      for (j = 0; j < 16; ++j, i += 4) {\n        w[j] = (padded[i] | (padded[i + 1] << 8) |\n               (padded[i + 2] << 16) | (padded[i + 3] << 24));\n      }\n      var a = h0, b = h1, c = h2, d = h3, f, g;\n      for (j = 0; j < 64; ++j) {\n        if (j < 16) {\n          f = (b & c) | ((~b) & d);\n          g = j;\n        } else if (j < 32) {\n          f = (d & b) | ((~d) & c);\n          g = (5 * j + 1) & 15;\n        } else if (j < 48) {\n          f = b ^ c ^ d;\n          g = (3 * j + 5) & 15;\n        } else {\n          f = c ^ (b | (~d));\n          g = (7 * j) & 15;\n        }\n        var tmp = d, rotateArg = (a + f + k[j] + w[g]) | 0, rotate = r[j];\n        d = c;\n        c = b;\n        b = (b + ((rotateArg << rotate) | (rotateArg >>> (32 - rotate)))) | 0;\n        a = tmp;\n      }\n      h0 = (h0 + a) | 0;\n      h1 = (h1 + b) | 0;\n      h2 = (h2 + c) | 0;\n      h3 = (h3 + d) | 0;\n    }\n    return new Uint8Array([\n      h0 & 0xFF, (h0 >> 8) & 0xFF, (h0 >> 16) & 0xFF, (h0 >>> 24) & 0xFF,\n      h1 & 0xFF, (h1 >> 8) & 0xFF, (h1 >> 16) & 0xFF, (h1 >>> 24) & 0xFF,\n      h2 & 0xFF, (h2 >> 8) & 0xFF, (h2 >> 16) & 0xFF, (h2 >>> 24) & 0xFF,\n      h3 & 0xFF, (h3 >> 8) & 0xFF, (h3 >> 16) & 0xFF, (h3 >>> 24) & 0xFF\n    ]);\n  }\n\n  return hash;\n})();\nvar Word64 = (function Word64Closure() {\n  function Word64(highInteger, lowInteger) {\n    this.high = highInteger | 0;\n    this.low = lowInteger | 0;\n  }\n  Word64.prototype = {\n    and: function Word64_and(word) {\n      this.high &= word.high;\n      this.low &= word.low;\n    },\n    xor: function Word64_xor(word) {\n     this.high ^= word.high;\n     this.low ^= word.low;\n    },\n\n    or: function Word64_or(word) {\n      this.high |= word.high;\n      this.low |= word.low;\n    },\n\n    shiftRight: function Word64_shiftRight(places) {\n      if (places >= 32) {\n        this.low = (this.high >>> (places - 32)) | 0;\n        this.high = 0;\n      } else {\n        this.low = (this.low >>> places) | (this.high << (32 - places));\n        this.high = (this.high >>> places) | 0;\n      }\n    },\n\n    shiftLeft: function Word64_shiftLeft(places) {\n      if (places >= 32) {\n        this.high = this.low << (places - 32);\n        this.low = 0;\n      } else {\n        this.high = (this.high << places) | (this.low >>> (32 - places));\n        this.low = this.low << places;\n      }\n    },\n\n    rotateRight: function Word64_rotateRight(places) {\n      var low, high;\n      if (places & 32) {\n        high = this.low;\n        low = this.high;\n      } else {\n        low = this.low;\n        high = this.high;\n      }\n      places &= 31;\n      this.low = (low >>> places) | (high << (32 - places));\n      this.high = (high >>> places) | (low << (32 - places));\n    },\n\n    not: function Word64_not() {\n      this.high = ~this.high;\n      this.low = ~this.low;\n    },\n\n    add: function Word64_add(word) {\n      var lowAdd = (this.low >>> 0) + (word.low >>> 0);\n      var highAdd = (this.high >>> 0) + (word.high >>> 0);\n      if (lowAdd > 0xFFFFFFFF) {\n        highAdd += 1;\n      }\n      this.low = lowAdd | 0;\n      this.high = highAdd | 0;\n    },\n\n    copyTo: function Word64_copyTo(bytes, offset) {\n      bytes[offset] = (this.high >>> 24) & 0xFF;\n      bytes[offset + 1] = (this.high >> 16) & 0xFF;\n      bytes[offset + 2] = (this.high >> 8) & 0xFF;\n      bytes[offset + 3] = this.high & 0xFF;\n      bytes[offset + 4] = (this.low >>> 24) & 0xFF;\n      bytes[offset + 5] = (this.low >> 16) & 0xFF;\n      bytes[offset + 6] = (this.low >> 8) & 0xFF;\n      bytes[offset + 7] = this.low & 0xFF;\n    },\n\n    assign: function Word64_assign(word) {\n      this.high = word.high;\n      this.low = word.low;\n    },\n  };\n  return Word64;\n})();\n\nvar calculateSHA256 = (function calculateSHA256Closure() {\n  function rotr(x, n) {\n    return (x >>> n) | (x << 32 - n);\n  }\n\n  function ch(x, y, z) {\n    return (x & y) ^ (~x & z);\n  }\n\n  function maj(x, y, z) {\n    return (x & y) ^ (x & z) ^ (y & z);\n  }\n\n  function sigma(x) {\n    return rotr(x, 2) ^ rotr(x, 13) ^ rotr(x, 22);\n  }\n\n  function sigmaPrime(x) {\n    return rotr(x, 6) ^ rotr(x, 11) ^ rotr(x, 25);\n  }\n\n  function littleSigma(x) {\n    return rotr(x, 7) ^ rotr(x, 18) ^ x >>> 3;\n  }\n\n  function littleSigmaPrime(x) {\n    return rotr(x, 17) ^ rotr(x, 19) ^ x >>> 10;\n  }\n\n  var k = [0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,\n           0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n           0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,\n           0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n           0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,\n           0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n           0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,\n           0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n           0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,\n           0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n           0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,\n           0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n           0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,\n           0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n           0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,\n           0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2];\n\n  function hash(data, offset, length) {\n    // initial hash values\n    var h0 = 0x6a09e667, h1 = 0xbb67ae85, h2 = 0x3c6ef372,\n        h3 = 0xa54ff53a, h4 = 0x510e527f, h5 = 0x9b05688c,\n        h6 = 0x1f83d9ab, h7 = 0x5be0cd19;\n    // pre-processing\n    var paddedLength = Math.ceil((length + 9) / 64) * 64;\n    var padded = new Uint8Array(paddedLength);\n    var i, j, n;\n    for (i = 0; i < length; ++i) {\n      padded[i] = data[offset++];\n    }\n    padded[i++] = 0x80;\n    n = paddedLength - 8;\n    while (i < n) {\n      padded[i++] = 0;\n    }\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = (length >>> 29) & 0xFF;\n    padded[i++] = (length >> 21) & 0xFF;\n    padded[i++] = (length >> 13) & 0xFF;\n    padded[i++] = (length >> 5) & 0xFF;\n    padded[i++] = (length << 3) & 0xFF;\n    var w = new Uint32Array(64);\n    // for each 512 bit block\n    for (i = 0; i < paddedLength;) {\n      for (j = 0; j < 16; ++j) {\n        w[j] = (padded[i] << 24 | (padded[i + 1] << 16) |\n               (padded[i + 2] << 8) | (padded[i + 3]));\n        i += 4;\n      }\n\n      for (j = 16; j < 64; ++j) {\n        w[j] = littleSigmaPrime(w[j - 2]) + w[j - 7] +\n               littleSigma(w[j - 15]) + w[j - 16] | 0;\n      }\n      var a = h0, b = h1, c = h2, d = h3, e = h4,\n          f = h5, g = h6, h = h7, t1, t2;\n      for (j = 0; j < 64; ++j) {\n        t1 = h + sigmaPrime(e) + ch(e, f, g) + k[j] + w[j];\n        t2 = sigma(a) + maj(a, b, c);\n        h = g;\n        g = f;\n        f = e;\n        e = (d + t1) | 0;\n        d = c;\n        c = b;\n        b = a;\n        a = (t1 + t2) | 0;\n      }\n      h0 = (h0 + a) | 0;\n      h1 = (h1 + b) | 0;\n      h2 = (h2 + c) | 0;\n      h3 = (h3 + d) | 0;\n      h4 = (h4 + e) | 0;\n      h5 = (h5 + f) | 0;\n      h6 = (h6 + g) | 0;\n      h7 = (h7 + h) | 0;\n    }\n    return new Uint8Array([\n      (h0 >> 24) & 0xFF, (h0 >> 16) & 0xFF, (h0 >> 8) & 0xFF, (h0) & 0xFF,\n      (h1 >> 24) & 0xFF, (h1 >> 16) & 0xFF, (h1 >> 8) & 0xFF, (h1) & 0xFF,\n      (h2 >> 24) & 0xFF, (h2 >> 16) & 0xFF, (h2 >> 8) & 0xFF, (h2) & 0xFF,\n      (h3 >> 24) & 0xFF, (h3 >> 16) & 0xFF, (h3 >> 8) & 0xFF, (h3) & 0xFF,\n      (h4 >> 24) & 0xFF, (h4 >> 16) & 0xFF, (h4 >> 8) & 0xFF, (h4) & 0xFF,\n      (h5 >> 24) & 0xFF, (h5 >> 16) & 0xFF, (h5 >> 8) & 0xFF, (h5) & 0xFF,\n      (h6 >> 24) & 0xFF, (h6 >> 16) & 0xFF, (h6 >> 8) & 0xFF, (h6) & 0xFF,\n      (h7 >> 24) & 0xFF, (h7 >> 16) & 0xFF, (h7 >> 8) & 0xFF, (h7) & 0xFF\n    ]);\n  }\n\n  return hash;\n})();\n\nvar calculateSHA512 = (function calculateSHA512Closure() {\n  function ch(result, x, y, z, tmp) {\n    result.assign(x);\n    result.and(y);\n    tmp.assign(x);\n    tmp.not();\n    tmp.and(z);\n    result.xor(tmp);\n  }\n\n  function maj(result, x, y, z, tmp) {\n    result.assign(x);\n    result.and(y);\n    tmp.assign(x);\n    tmp.and(z);\n    result.xor(tmp);\n    tmp.assign(y);\n    tmp.and(z);\n    result.xor(tmp);\n  }\n\n  function sigma(result, x, tmp) {\n    result.assign(x);\n    result.rotateRight(28);\n    tmp.assign(x);\n    tmp.rotateRight(34);\n    result.xor(tmp);\n    tmp.assign(x);\n    tmp.rotateRight(39);\n    result.xor(tmp);\n  }\n\n  function sigmaPrime(result, x, tmp) {\n    result.assign(x);\n    result.rotateRight(14);\n    tmp.assign(x);\n    tmp.rotateRight(18);\n    result.xor(tmp);\n    tmp.assign(x);\n    tmp.rotateRight(41);\n    result.xor(tmp);\n  }\n\n  function littleSigma(result, x, tmp) {\n    result.assign(x);\n    result.rotateRight(1);\n    tmp.assign(x);\n    tmp.rotateRight(8);\n    result.xor(tmp);\n    tmp.assign(x);\n    tmp.shiftRight(7);\n    result.xor(tmp);\n  }\n\n  function littleSigmaPrime(result, x, tmp) {\n    result.assign(x);\n    result.rotateRight(19);\n    tmp.assign(x);\n    tmp.rotateRight(61);\n    result.xor(tmp);\n    tmp.assign(x);\n    tmp.shiftRight(6);\n    result.xor(tmp);\n  }\n\n  var k = [\n    new Word64(0x428a2f98, 0xd728ae22), new Word64(0x71374491, 0x23ef65cd),\n    new Word64(0xb5c0fbcf, 0xec4d3b2f), new Word64(0xe9b5dba5, 0x8189dbbc),\n    new Word64(0x3956c25b, 0xf348b538), new Word64(0x59f111f1, 0xb605d019),\n    new Word64(0x923f82a4, 0xaf194f9b), new Word64(0xab1c5ed5, 0xda6d8118),\n    new Word64(0xd807aa98, 0xa3030242), new Word64(0x12835b01, 0x45706fbe),\n    new Word64(0x243185be, 0x4ee4b28c), new Word64(0x550c7dc3, 0xd5ffb4e2),\n    new Word64(0x72be5d74, 0xf27b896f), new Word64(0x80deb1fe, 0x3b1696b1),\n    new Word64(0x9bdc06a7, 0x25c71235), new Word64(0xc19bf174, 0xcf692694),\n    new Word64(0xe49b69c1, 0x9ef14ad2), new Word64(0xefbe4786, 0x384f25e3),\n    new Word64(0x0fc19dc6, 0x8b8cd5b5), new Word64(0x240ca1cc, 0x77ac9c65),\n    new Word64(0x2de92c6f, 0x592b0275), new Word64(0x4a7484aa, 0x6ea6e483),\n    new Word64(0x5cb0a9dc, 0xbd41fbd4), new Word64(0x76f988da, 0x831153b5),\n    new Word64(0x983e5152, 0xee66dfab), new Word64(0xa831c66d, 0x2db43210),\n    new Word64(0xb00327c8, 0x98fb213f), new Word64(0xbf597fc7, 0xbeef0ee4),\n    new Word64(0xc6e00bf3, 0x3da88fc2), new Word64(0xd5a79147, 0x930aa725),\n    new Word64(0x06ca6351, 0xe003826f), new Word64(0x14292967, 0x0a0e6e70),\n    new Word64(0x27b70a85, 0x46d22ffc), new Word64(0x2e1b2138, 0x5c26c926),\n    new Word64(0x4d2c6dfc, 0x5ac42aed), new Word64(0x53380d13, 0x9d95b3df),\n    new Word64(0x650a7354, 0x8baf63de), new Word64(0x766a0abb, 0x3c77b2a8),\n    new Word64(0x81c2c92e, 0x47edaee6), new Word64(0x92722c85, 0x1482353b),\n    new Word64(0xa2bfe8a1, 0x4cf10364), new Word64(0xa81a664b, 0xbc423001),\n    new Word64(0xc24b8b70, 0xd0f89791), new Word64(0xc76c51a3, 0x0654be30),\n    new Word64(0xd192e819, 0xd6ef5218), new Word64(0xd6990624, 0x5565a910),\n    new Word64(0xf40e3585, 0x5771202a), new Word64(0x106aa070, 0x32bbd1b8),\n    new Word64(0x19a4c116, 0xb8d2d0c8), new Word64(0x1e376c08, 0x5141ab53),\n    new Word64(0x2748774c, 0xdf8eeb99), new Word64(0x34b0bcb5, 0xe19b48a8),\n    new Word64(0x391c0cb3, 0xc5c95a63), new Word64(0x4ed8aa4a, 0xe3418acb),\n    new Word64(0x5b9cca4f, 0x7763e373), new Word64(0x682e6ff3, 0xd6b2b8a3),\n    new Word64(0x748f82ee, 0x5defb2fc), new Word64(0x78a5636f, 0x43172f60),\n    new Word64(0x84c87814, 0xa1f0ab72), new Word64(0x8cc70208, 0x1a6439ec),\n    new Word64(0x90befffa, 0x23631e28), new Word64(0xa4506ceb, 0xde82bde9),\n    new Word64(0xbef9a3f7, 0xb2c67915), new Word64(0xc67178f2, 0xe372532b),\n    new Word64(0xca273ece, 0xea26619c), new Word64(0xd186b8c7, 0x21c0c207),\n    new Word64(0xeada7dd6, 0xcde0eb1e), new Word64(0xf57d4f7f, 0xee6ed178),\n    new Word64(0x06f067aa, 0x72176fba), new Word64(0x0a637dc5, 0xa2c898a6),\n    new Word64(0x113f9804, 0xbef90dae), new Word64(0x1b710b35, 0x131c471b),\n    new Word64(0x28db77f5, 0x23047d84), new Word64(0x32caab7b, 0x40c72493),\n    new Word64(0x3c9ebe0a, 0x15c9bebc), new Word64(0x431d67c4, 0x9c100d4c),\n    new Word64(0x4cc5d4be, 0xcb3e42b6), new Word64(0x597f299c, 0xfc657e2a),\n    new Word64(0x5fcb6fab, 0x3ad6faec), new Word64(0x6c44198c, 0x4a475817)];\n\n  function hash(data, offset, length, mode384) {\n    mode384 = !!mode384;\n    // initial hash values\n    var h0, h1, h2, h3, h4, h5, h6, h7;\n    if (!mode384) {\n      h0 = new Word64(0x6a09e667, 0xf3bcc908);\n      h1 = new Word64(0xbb67ae85, 0x84caa73b);\n      h2 = new Word64(0x3c6ef372, 0xfe94f82b);\n      h3 = new Word64(0xa54ff53a, 0x5f1d36f1);\n      h4 = new Word64(0x510e527f, 0xade682d1);\n      h5 = new Word64(0x9b05688c, 0x2b3e6c1f);\n      h6 = new Word64(0x1f83d9ab, 0xfb41bd6b);\n      h7 = new Word64(0x5be0cd19, 0x137e2179);\n    } else {\n      // SHA384 is exactly the same\n      // except with different starting values and a trimmed result\n      h0 = new Word64(0xcbbb9d5d, 0xc1059ed8);\n      h1 = new Word64(0x629a292a, 0x367cd507);\n      h2 = new Word64(0x9159015a, 0x3070dd17);\n      h3 = new Word64(0x152fecd8, 0xf70e5939);\n      h4 = new Word64(0x67332667, 0xffc00b31);\n      h5 = new Word64(0x8eb44a87, 0x68581511);\n      h6 = new Word64(0xdb0c2e0d, 0x64f98fa7);\n      h7 = new Word64(0x47b5481d, 0xbefa4fa4);\n    }\n\n    // pre-processing\n    var paddedLength = Math.ceil((length + 17) / 128) * 128;\n    var padded = new Uint8Array(paddedLength);\n    var i, j, n;\n    for (i = 0; i < length; ++i) {\n      padded[i] = data[offset++];\n    }\n    padded[i++] = 0x80;\n    n = paddedLength - 16;\n    while (i < n) {\n      padded[i++] = 0;\n    }\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = 0;\n    padded[i++] = (length >>> 29) & 0xFF;\n    padded[i++] = (length >> 21) & 0xFF;\n    padded[i++] = (length >> 13) & 0xFF;\n    padded[i++] = (length >> 5) & 0xFF;\n    padded[i++] = (length << 3) & 0xFF;\n\n    var w = new Array(80);\n    for (i = 0; i < 80; i++) {\n      w[i] = new Word64(0, 0);\n    }\n    var a = new Word64(0, 0), b = new Word64(0, 0), c = new Word64(0, 0);\n    var d = new Word64(0, 0), e = new Word64(0, 0), f = new Word64(0, 0);\n    var g = new Word64(0, 0), h = new Word64(0, 0);\n    var t1 = new Word64(0, 0), t2 = new Word64(0, 0);\n    var tmp1 = new Word64(0, 0), tmp2 = new Word64(0, 0), tmp3;\n\n    // for each 1024 bit block\n    for (i = 0; i < paddedLength;) {\n      for (j = 0; j < 16; ++j) {\n        w[j].high = (padded[i] << 24) | (padded[i + 1] << 16) |\n                    (padded[i + 2] << 8) | (padded[i + 3]);\n        w[j].low = (padded[i + 4]) << 24 | (padded[i + 5]) << 16 |\n                   (padded[i + 6]) << 8 | (padded[i + 7]);\n        i += 8;\n      }\n      for (j = 16; j < 80; ++j) {\n        tmp3 = w[j];\n        littleSigmaPrime(tmp3, w[j - 2], tmp2);\n        tmp3.add(w[j - 7]);\n        littleSigma(tmp1, w[j - 15], tmp2);\n        tmp3.add(tmp1);\n        tmp3.add(w[j - 16]);\n      }\n\n      a.assign(h0); b.assign(h1); c.assign(h2); d.assign(h3);\n      e.assign(h4); f.assign(h5); g.assign(h6); h.assign(h7);\n      for (j = 0; j < 80; ++j) {\n        t1.assign(h);\n        sigmaPrime(tmp1, e, tmp2);\n        t1.add(tmp1);\n        ch(tmp1, e, f, g, tmp2);\n        t1.add(tmp1);\n        t1.add(k[j]);\n        t1.add(w[j]);\n\n        sigma(t2, a, tmp2);\n        maj(tmp1, a, b, c, tmp2);\n        t2.add(tmp1);\n\n        tmp3 = h;\n        h = g;\n        g = f;\n        f = e;\n        d.add(t1);\n        e = d;\n        d = c;\n        c = b;\n        b = a;\n        tmp3.assign(t1);\n        tmp3.add(t2);\n        a = tmp3;\n      }\n      h0.add(a);\n      h1.add(b);\n      h2.add(c);\n      h3.add(d);\n      h4.add(e);\n      h5.add(f);\n      h6.add(g);\n      h7.add(h);\n    }\n\n    var result;\n    if (!mode384) {\n      result = new Uint8Array(64);\n      h0.copyTo(result, 0);\n      h1.copyTo(result, 8);\n      h2.copyTo(result, 16);\n      h3.copyTo(result, 24);\n      h4.copyTo(result, 32);\n      h5.copyTo(result, 40);\n      h6.copyTo(result, 48);\n      h7.copyTo(result, 56);\n    } else {\n      result = new Uint8Array(48);\n      h0.copyTo(result, 0);\n      h1.copyTo(result, 8);\n      h2.copyTo(result, 16);\n      h3.copyTo(result, 24);\n      h4.copyTo(result, 32);\n      h5.copyTo(result, 40);\n    }\n    return result;\n  }\n\n  return hash;\n})();\nvar calculateSHA384 = (function calculateSHA384Closure() {\n  function hash(data, offset, length) {\n    return calculateSHA512(data, offset, length, true);\n  }\n\n  return hash;\n})();\nvar NullCipher = (function NullCipherClosure() {\n  function NullCipher() {\n  }\n\n  NullCipher.prototype = {\n    decryptBlock: function NullCipher_decryptBlock(data) {\n      return data;\n    },\n  };\n\n  return NullCipher;\n})();\n\nclass AESBaseCipher {\n  constructor() {\n    if (this.constructor === AESBaseCipher) {\n      unreachable('Cannot initialize AESBaseCipher.');\n    }\n\n    this._s = new Uint8Array([\n      0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b,\n      0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,\n      0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26,\n      0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,\n      0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2,\n      0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,\n      0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed,\n      0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,\n      0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f,\n      0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,\n      0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec,\n      0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,\n      0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14,\n      0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,\n      0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d,\n      0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,\n      0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f,\n      0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,\n      0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11,\n      0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,\n      0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f,\n      0xb0, 0x54, 0xbb, 0x16,\n    ]);\n\n    this._inv_s = new Uint8Array([\n      0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e,\n      0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87,\n      0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32,\n      0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,\n      0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49,\n      0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16,\n      0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50,\n      0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,\n      0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05,\n      0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02,\n      0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41,\n      0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,\n      0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8,\n      0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89,\n      0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b,\n      0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,\n      0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59,\n      0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d,\n      0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d,\n      0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,\n      0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63,\n      0x55, 0x21, 0x0c, 0x7d,\n    ]);\n\n    this._mix = new Uint32Array([\n      0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927,\n      0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45,\n      0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb,\n      0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381,\n      0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf,\n      0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66,\n      0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28,\n      0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012,\n      0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec,\n      0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e,\n      0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd,\n      0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7,\n      0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89,\n      0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b,\n      0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815,\n      0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f,\n      0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa,\n      0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8,\n      0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36,\n      0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c,\n      0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742,\n      0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea,\n      0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4,\n      0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e,\n      0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360,\n      0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502,\n      0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87,\n      0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd,\n      0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3,\n      0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621,\n      0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f,\n      0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55,\n      0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26,\n      0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844,\n      0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba,\n      0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480,\n      0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce,\n      0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67,\n      0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929,\n      0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713,\n      0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed,\n      0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f,\n      0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3,\n    ]);\n\n    this._mixCol = new Uint8Array(256);\n    for (let i = 0; i < 256; i++) {\n      if (i < 128) {\n        this._mixCol[i] = i << 1;\n      } else {\n        this._mixCol[i] = (i << 1) ^ 0x1b;\n      }\n    }\n\n    this.buffer = new Uint8Array(16);\n    this.bufferPosition = 0;\n  }\n\n  _expandKey(cipherKey) {\n    unreachable('Cannot call `_expandKey` on the base class');\n  }\n\n  _decrypt(input, key) {\n    let t, u, v;\n    let state = new Uint8Array(16);\n    state.set(input);\n\n    // AddRoundKey\n    for (let j = 0, k = this._keySize; j < 16; ++j, ++k) {\n      state[j] ^= key[k];\n    }\n    for (let i = this._cyclesOfRepetition - 1; i >= 1; --i) {\n      // InvShiftRows\n      t = state[13];\n      state[13] = state[9];\n      state[9] = state[5];\n      state[5] = state[1];\n      state[1] = t;\n      t = state[14];\n      u = state[10];\n      state[14] = state[6];\n      state[10] = state[2];\n      state[6] = t;\n      state[2] = u;\n      t = state[15];\n      u = state[11];\n      v = state[7];\n      state[15] = state[3];\n      state[11] = t;\n      state[7] = u;\n      state[3] = v;\n      // InvSubBytes\n      for (let j = 0; j < 16; ++j) {\n        state[j] = this._inv_s[state[j]];\n      }\n      // AddRoundKey\n      for (let j = 0, k = i * 16; j < 16; ++j, ++k) {\n        state[j] ^= key[k];\n      }\n      // InvMixColumns\n      for (let j = 0; j < 16; j += 4) {\n        let s0 = this._mix[state[j]];\n        let s1 = this._mix[state[j + 1]];\n        let s2 = this._mix[state[j + 2]];\n        let s3 = this._mix[state[j + 3]];\n        t = (s0 ^ (s1 >>> 8) ^ (s1 << 24) ^ (s2 >>> 16) ^ (s2 << 16) ^\n            (s3 >>> 24) ^ (s3 << 8));\n        state[j] = (t >>> 24) & 0xFF;\n        state[j + 1] = (t >> 16) & 0xFF;\n        state[j + 2] = (t >> 8) & 0xFF;\n        state[j + 3] = t & 0xFF;\n      }\n    }\n    // InvShiftRows\n    t = state[13];\n    state[13] = state[9];\n    state[9] = state[5];\n    state[5] = state[1];\n    state[1] = t;\n    t = state[14];\n    u = state[10];\n    state[14] = state[6];\n    state[10] = state[2];\n    state[6] = t;\n    state[2] = u;\n    t = state[15];\n    u = state[11];\n    v = state[7];\n    state[15] = state[3];\n    state[11] = t;\n    state[7] = u;\n    state[3] = v;\n    for (let j = 0; j < 16; ++j) {\n      // InvSubBytes\n      state[j] = this._inv_s[state[j]];\n      // AddRoundKey\n      state[j] ^= key[j];\n    }\n    return state;\n  }\n\n  _encrypt(input, key) {\n    const s = this._s;\n\n    let t, u, v;\n    let state = new Uint8Array(16);\n    state.set(input);\n\n    for (let j = 0; j < 16; ++j) {\n      // AddRoundKey\n      state[j] ^= key[j];\n    }\n\n    for (let i = 1; i < this._cyclesOfRepetition; i++) {\n      // SubBytes\n      for (let j = 0; j < 16; ++j) {\n        state[j] = s[state[j]];\n      }\n      // ShiftRows\n      v = state[1];\n      state[1] = state[5];\n      state[5] = state[9];\n      state[9] = state[13];\n      state[13] = v;\n      v = state[2];\n      u = state[6];\n      state[2] = state[10];\n      state[6] = state[14];\n      state[10] = v;\n      state[14] = u;\n      v = state[3];\n      u = state[7];\n      t = state[11];\n      state[3] = state[15];\n      state[7] = v;\n      state[11] = u;\n      state[15] = t;\n      // MixColumns\n      for (let j = 0; j < 16; j += 4) {\n        let s0 = state[j + 0];\n        let s1 = state[j + 1];\n        let s2 = state[j + 2];\n        let s3 = state[j + 3];\n        t = s0 ^ s1 ^ s2 ^ s3;\n        state[j + 0] ^= t ^ this._mixCol[s0 ^ s1];\n        state[j + 1] ^= t ^ this._mixCol[s1 ^ s2];\n        state[j + 2] ^= t ^ this._mixCol[s2 ^ s3];\n        state[j + 3] ^= t ^ this._mixCol[s3 ^ s0];\n      }\n      // AddRoundKey\n      for (let j = 0, k = i * 16; j < 16; ++j, ++k) {\n        state[j] ^= key[k];\n      }\n    }\n\n    // SubBytes\n    for (let j = 0; j < 16; ++j) {\n      state[j] = s[state[j]];\n    }\n    // ShiftRows\n    v = state[1];\n    state[1] = state[5];\n    state[5] = state[9];\n    state[9] = state[13];\n    state[13] = v;\n    v = state[2];\n    u = state[6];\n    state[2] = state[10];\n    state[6] = state[14];\n    state[10] = v;\n    state[14] = u;\n    v = state[3];\n    u = state[7];\n    t = state[11];\n    state[3] = state[15];\n    state[7] = v;\n    state[11] = u;\n    state[15] = t;\n    // AddRoundKey\n    for (let j = 0, k = this._keySize; j < 16; ++j, ++k) {\n      state[j] ^= key[k];\n    }\n    return state;\n  }\n\n  _decryptBlock2(data, finalize) {\n    let sourceLength = data.length;\n    let buffer = this.buffer, bufferLength = this.bufferPosition;\n    let result = [], iv = this.iv;\n\n    for (let i = 0; i < sourceLength; ++i) {\n      buffer[bufferLength] = data[i];\n      ++bufferLength;\n      if (bufferLength < 16) {\n        continue;\n      }\n      // buffer is full, decrypting\n      let plain = this._decrypt(buffer, this._key);\n      // xor-ing the IV vector to get plain text\n      for (let j = 0; j < 16; ++j) {\n        plain[j] ^= iv[j];\n      }\n      iv = buffer;\n      result.push(plain);\n      buffer = new Uint8Array(16);\n      bufferLength = 0;\n    }\n    // saving incomplete buffer\n    this.buffer = buffer;\n    this.bufferLength = bufferLength;\n    this.iv = iv;\n    if (result.length === 0) {\n      return new Uint8Array(0);\n    }\n    // combining plain text blocks into one\n    let outputLength = 16 * result.length;\n    if (finalize) {\n      // undo a padding that is described in RFC 2898\n      let lastBlock = result[result.length - 1];\n      let psLen = lastBlock[15];\n      if (psLen <= 16) {\n        for (let i = 15, ii = 16 - psLen; i >= ii; --i) {\n          if (lastBlock[i] !== psLen) {\n            // Invalid padding, assume that the block has no padding.\n            psLen = 0;\n            break;\n          }\n        }\n        outputLength -= psLen;\n        result[result.length - 1] = lastBlock.subarray(0, 16 - psLen);\n      }\n    }\n    let output = new Uint8Array(outputLength);\n    for (let i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) {\n      output.set(result[i], j);\n    }\n    return output;\n  }\n\n  decryptBlock(data, finalize, iv = null) {\n    let sourceLength = data.length;\n    let buffer = this.buffer, bufferLength = this.bufferPosition;\n    // If an IV is not supplied, wait for IV values. They are at the start\n    // of the stream.\n    if (iv) {\n      this.iv = iv;\n    } else {\n      for (let i = 0; bufferLength < 16 && i < sourceLength;\n           ++i, ++bufferLength) {\n        buffer[bufferLength] = data[i];\n      }\n      if (bufferLength < 16) { // Need more data.\n        this.bufferLength = bufferLength;\n        return new Uint8Array(0);\n      }\n      this.iv = buffer;\n      data = data.subarray(16);\n    }\n    this.buffer = new Uint8Array(16);\n    this.bufferLength = 0;\n    // starting decryption\n    this.decryptBlock = this._decryptBlock2;\n    return this.decryptBlock(data, finalize);\n  }\n\n  encrypt(data, iv) {\n    let sourceLength = data.length;\n    let buffer = this.buffer, bufferLength = this.bufferPosition;\n    let result = [];\n\n    if (!iv) {\n      iv = new Uint8Array(16);\n    }\n    for (let i = 0; i < sourceLength; ++i) {\n      buffer[bufferLength] = data[i];\n      ++bufferLength;\n      if (bufferLength < 16) {\n        continue;\n      }\n      for (let j = 0; j < 16; ++j) {\n        buffer[j] ^= iv[j];\n      }\n\n      // buffer is full, encrypting\n      let cipher = this._encrypt(buffer, this._key);\n      iv = cipher;\n      result.push(cipher);\n      buffer = new Uint8Array(16);\n      bufferLength = 0;\n    }\n    // saving incomplete buffer\n    this.buffer = buffer;\n    this.bufferLength = bufferLength;\n    this.iv = iv;\n    if (result.length === 0) {\n      return new Uint8Array(0);\n    }\n    // combining plain text blocks into one\n    let outputLength = 16 * result.length;\n    let output = new Uint8Array(outputLength);\n    for (let i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) {\n      output.set(result[i], j);\n    }\n    return output;\n  }\n}\n\nclass AES128Cipher extends AESBaseCipher {\n  constructor(key) {\n    super();\n\n    this._cyclesOfRepetition = 10;\n    this._keySize = 160; // bits\n\n    this._rcon = new Uint8Array([\n      0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c,\n      0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a,\n      0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd,\n      0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a,\n      0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,\n      0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6,\n      0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72,\n      0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc,\n      0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10,\n      0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e,\n      0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5,\n      0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94,\n      0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02,\n      0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d,\n      0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d,\n      0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f,\n      0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb,\n      0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c,\n      0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a,\n      0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd,\n      0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a,\n      0x74, 0xe8, 0xcb, 0x8d,\n    ]);\n\n    this._key = this._expandKey(key);\n  }\n\n  _expandKey(cipherKey) {\n    const b = 176;\n    const s = this._s;\n    const rcon = this._rcon;\n\n    let result = new Uint8Array(b);\n    result.set(cipherKey);\n\n    for (let j = 16, i = 1; j < b; ++i) {\n      // RotWord\n      let t1 = result[j - 3];\n      let t2 = result[j - 2];\n      let t3 = result[j - 1];\n      let t4 = result[j - 4];\n      // SubWord\n      t1 = s[t1];\n      t2 = s[t2];\n      t3 = s[t3];\n      t4 = s[t4];\n      // Rcon\n      t1 = t1 ^ rcon[i];\n      for (let n = 0; n < 4; ++n) {\n        result[j] = (t1 ^= result[j - 16]);\n        j++;\n        result[j] = (t2 ^= result[j - 16]);\n        j++;\n        result[j] = (t3 ^= result[j - 16]);\n        j++;\n        result[j] = (t4 ^= result[j - 16]);\n        j++;\n      }\n    }\n    return result;\n  }\n}\n\nclass AES256Cipher extends AESBaseCipher {\n  constructor(key) {\n    super();\n\n    this._cyclesOfRepetition = 14;\n    this._keySize = 224; // bits\n\n    this._key = this._expandKey(key);\n  }\n\n  _expandKey(cipherKey) {\n    const b = 240;\n    const s = this._s;\n\n    let result = new Uint8Array(b);\n    result.set(cipherKey);\n\n    let r = 1;\n    let t1, t2, t3, t4;\n    for (let j = 32, i = 1; j < b; ++i) {\n      if (j % 32 === 16) {\n        t1 = s[t1];\n        t2 = s[t2];\n        t3 = s[t3];\n        t4 = s[t4];\n      } else if (j % 32 === 0) {\n        // RotWord\n        t1 = result[j - 3];\n        t2 = result[j - 2];\n        t3 = result[j - 1];\n        t4 = result[j - 4];\n        // SubWord\n        t1 = s[t1];\n        t2 = s[t2];\n        t3 = s[t3];\n        t4 = s[t4];\n        // Rcon\n        t1 = t1 ^ r;\n        if ((r <<= 1) >= 256) {\n          r = (r ^ 0x1b) & 0xFF;\n        }\n      }\n\n      for (let n = 0; n < 4; ++n) {\n        result[j] = (t1 ^= result[j - 32]);\n        j++;\n        result[j] = (t2 ^= result[j - 32]);\n        j++;\n        result[j] = (t3 ^= result[j - 32]);\n        j++;\n        result[j] = (t4 ^= result[j - 32]);\n        j++;\n      }\n    }\n    return result;\n  }\n}\n\nvar PDF17 = (function PDF17Closure() {\n\n  function compareByteArrays(array1, array2) {\n    if (array1.length !== array2.length) {\n      return false;\n    }\n    for (var i = 0; i < array1.length; i++) {\n      if (array1[i] !== array2[i]) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  function PDF17() {\n  }\n\n  PDF17.prototype = {\n    checkOwnerPassword: function PDF17_checkOwnerPassword(password,\n                                                          ownerValidationSalt,\n                                                          userBytes,\n                                                          ownerPassword) {\n      var hashData = new Uint8Array(password.length + 56);\n      hashData.set(password, 0);\n      hashData.set(ownerValidationSalt, password.length);\n      hashData.set(userBytes, password.length + ownerValidationSalt.length);\n      var result = calculateSHA256(hashData, 0, hashData.length);\n      return compareByteArrays(result, ownerPassword);\n    },\n    checkUserPassword: function PDF17_checkUserPassword(password,\n                                                        userValidationSalt,\n                                                        userPassword) {\n      var hashData = new Uint8Array(password.length + 8);\n      hashData.set(password, 0);\n      hashData.set(userValidationSalt, password.length);\n      var result = calculateSHA256(hashData, 0, hashData.length);\n      return compareByteArrays(result, userPassword);\n    },\n    getOwnerKey: function PDF17_getOwnerKey(password, ownerKeySalt, userBytes,\n                                            ownerEncryption) {\n      var hashData = new Uint8Array(password.length + 56);\n      hashData.set(password, 0);\n      hashData.set(ownerKeySalt, password.length);\n      hashData.set(userBytes, password.length + ownerKeySalt.length);\n      var key = calculateSHA256(hashData, 0, hashData.length);\n      var cipher = new AES256Cipher(key);\n      return cipher.decryptBlock(ownerEncryption,\n                                 false,\n                                 new Uint8Array(16));\n\n    },\n    getUserKey: function PDF17_getUserKey(password, userKeySalt,\n                                          userEncryption) {\n      var hashData = new Uint8Array(password.length + 8);\n      hashData.set(password, 0);\n      hashData.set(userKeySalt, password.length);\n      // `key` is the decryption key for the UE string.\n      var key = calculateSHA256(hashData, 0, hashData.length);\n      var cipher = new AES256Cipher(key);\n      return cipher.decryptBlock(userEncryption,\n                                 false,\n                                 new Uint8Array(16));\n    },\n  };\n  return PDF17;\n})();\n\nvar PDF20 = (function PDF20Closure() {\n\n  function concatArrays(array1, array2) {\n    var t = new Uint8Array(array1.length + array2.length);\n    t.set(array1, 0);\n    t.set(array2, array1.length);\n    return t;\n  }\n\n  function calculatePDF20Hash(password, input, userBytes) {\n    // This refers to Algorithm 2.B as defined in ISO 32000-2.\n    var k = calculateSHA256(input, 0, input.length).subarray(0, 32);\n    var e = [0];\n    var i = 0;\n    while (i < 64 || e[e.length - 1] > i - 32) {\n      var arrayLength = password.length + k.length + userBytes.length;\n\n      var k1 = new Uint8Array(arrayLength * 64);\n      var array = concatArrays(password, k);\n      array = concatArrays(array, userBytes);\n      for (var j = 0, pos = 0; j < 64; j++, pos += arrayLength) {\n        k1.set(array, pos);\n      }\n      // AES128 CBC NO PADDING with first 16 bytes of k as the key\n      // and the second 16 as the iv.\n      var cipher = new AES128Cipher(k.subarray(0, 16));\n      e = cipher.encrypt(k1, k.subarray(16, 32));\n      // Now we have to take the first 16 bytes of an unsigned big endian\n      // integer and compute the remainder modulo 3. That is a fairly large\n      // number and JavaScript isn't going to handle that well, so we're using\n      // a trick that allows us to perform modulo math byte by byte.\n      var remainder = 0;\n      for (var z = 0; z < 16; z++) {\n        remainder *= (256 % 3);\n        remainder %= 3;\n        remainder += ((e[z] >>> 0) % 3);\n        remainder %= 3;\n      }\n      if (remainder === 0) {\n        k = calculateSHA256(e, 0, e.length);\n      } else if (remainder === 1) {\n        k = calculateSHA384(e, 0, e.length);\n      } else if (remainder === 2) {\n        k = calculateSHA512(e, 0, e.length);\n      }\n      i++;\n    }\n    return k.subarray(0, 32);\n  }\n\n  function PDF20() {\n  }\n\n  function compareByteArrays(array1, array2) {\n    if (array1.length !== array2.length) {\n      return false;\n    }\n    for (var i = 0; i < array1.length; i++) {\n      if (array1[i] !== array2[i]) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  PDF20.prototype = {\n    hash: function PDF20_hash(password, concatBytes, userBytes) {\n      return calculatePDF20Hash(password, concatBytes, userBytes);\n    },\n    checkOwnerPassword: function PDF20_checkOwnerPassword(password,\n                                                          ownerValidationSalt,\n                                                          userBytes,\n                                                          ownerPassword) {\n      var hashData = new Uint8Array(password.length + 56);\n      hashData.set(password, 0);\n      hashData.set(ownerValidationSalt, password.length);\n      hashData.set(userBytes, password.length + ownerValidationSalt.length);\n      var result = calculatePDF20Hash(password, hashData, userBytes);\n      return compareByteArrays(result, ownerPassword);\n    },\n    checkUserPassword: function PDF20_checkUserPassword(password,\n                                                        userValidationSalt,\n                                                        userPassword) {\n      var hashData = new Uint8Array(password.length + 8);\n      hashData.set(password, 0);\n      hashData.set(userValidationSalt, password.length);\n      var result = calculatePDF20Hash(password, hashData, []);\n      return compareByteArrays(result, userPassword);\n    },\n    getOwnerKey: function PDF20_getOwnerKey(password, ownerKeySalt, userBytes,\n                                            ownerEncryption) {\n      var hashData = new Uint8Array(password.length + 56);\n      hashData.set(password, 0);\n      hashData.set(ownerKeySalt, password.length);\n      hashData.set(userBytes, password.length + ownerKeySalt.length);\n      var key = calculatePDF20Hash(password, hashData, userBytes);\n      var cipher = new AES256Cipher(key);\n      return cipher.decryptBlock(ownerEncryption,\n                                 false,\n                                 new Uint8Array(16));\n\n    },\n    getUserKey: function PDF20_getUserKey(password, userKeySalt,\n                                          userEncryption) {\n      var hashData = new Uint8Array(password.length + 8);\n      hashData.set(password, 0);\n      hashData.set(userKeySalt, password.length);\n      // `key` is the decryption key for the UE string.\n      var key = calculatePDF20Hash(password, hashData, []);\n      var cipher = new AES256Cipher(key);\n      return cipher.decryptBlock(userEncryption,\n                                 false,\n                                 new Uint8Array(16));\n    },\n  };\n  return PDF20;\n})();\n\nvar CipherTransform = (function CipherTransformClosure() {\n  function CipherTransform(stringCipherConstructor, streamCipherConstructor) {\n    this.StringCipherConstructor = stringCipherConstructor;\n    this.StreamCipherConstructor = streamCipherConstructor;\n  }\n\n  CipherTransform.prototype = {\n    createStream: function CipherTransform_createStream(stream, length) {\n      var cipher = new this.StreamCipherConstructor();\n      return new DecryptStream(stream, length,\n        function cipherTransformDecryptStream(data, finalize) {\n          return cipher.decryptBlock(data, finalize);\n        }\n      );\n    },\n    decryptString: function CipherTransform_decryptString(s) {\n      var cipher = new this.StringCipherConstructor();\n      var data = stringToBytes(s);\n      data = cipher.decryptBlock(data, true);\n      return bytesToString(data);\n    },\n  };\n  return CipherTransform;\n})();\n\nvar CipherTransformFactory = (function CipherTransformFactoryClosure() {\n  var defaultPasswordBytes = new Uint8Array([\n    0x28, 0xBF, 0x4E, 0x5E, 0x4E, 0x75, 0x8A, 0x41,\n    0x64, 0x00, 0x4E, 0x56, 0xFF, 0xFA, 0x01, 0x08,\n    0x2E, 0x2E, 0x00, 0xB6, 0xD0, 0x68, 0x3E, 0x80,\n    0x2F, 0x0C, 0xA9, 0xFE, 0x64, 0x53, 0x69, 0x7A]);\n\n  function createEncryptionKey20(revision, password, ownerPassword,\n                                 ownerValidationSalt, ownerKeySalt, uBytes,\n                                 userPassword, userValidationSalt, userKeySalt,\n                                 ownerEncryption, userEncryption, perms) {\n    if (password) {\n      var passwordLength = Math.min(127, password.length);\n      password = password.subarray(0, passwordLength);\n    } else {\n      password = [];\n    }\n    var pdfAlgorithm;\n    if (revision === 6) {\n      pdfAlgorithm = new PDF20();\n    } else {\n      pdfAlgorithm = new PDF17();\n    }\n\n    if (pdfAlgorithm.checkUserPassword(password, userValidationSalt,\n                                        userPassword)) {\n      return pdfAlgorithm.getUserKey(password, userKeySalt, userEncryption);\n    } else if (password.length && pdfAlgorithm.checkOwnerPassword(password,\n                                                  ownerValidationSalt,\n                                                  uBytes,\n                                                  ownerPassword)) {\n      return pdfAlgorithm.getOwnerKey(password, ownerKeySalt, uBytes,\n                                      ownerEncryption);\n    }\n\n    return null;\n  }\n\n  function prepareKeyData(fileId, password, ownerPassword, userPassword,\n                          flags, revision, keyLength, encryptMetadata) {\n    var hashDataSize = 40 + ownerPassword.length + fileId.length;\n    var hashData = new Uint8Array(hashDataSize), i = 0, j, n;\n    if (password) {\n      n = Math.min(32, password.length);\n      for (; i < n; ++i) {\n        hashData[i] = password[i];\n      }\n    }\n    j = 0;\n    while (i < 32) {\n      hashData[i++] = defaultPasswordBytes[j++];\n    }\n    // as now the padded password in the hashData[0..i]\n    for (j = 0, n = ownerPassword.length; j < n; ++j) {\n      hashData[i++] = ownerPassword[j];\n    }\n    hashData[i++] = flags & 0xFF;\n    hashData[i++] = (flags >> 8) & 0xFF;\n    hashData[i++] = (flags >> 16) & 0xFF;\n    hashData[i++] = (flags >>> 24) & 0xFF;\n    for (j = 0, n = fileId.length; j < n; ++j) {\n      hashData[i++] = fileId[j];\n    }\n    if (revision >= 4 && !encryptMetadata) {\n      hashData[i++] = 0xFF;\n      hashData[i++] = 0xFF;\n      hashData[i++] = 0xFF;\n      hashData[i++] = 0xFF;\n    }\n    var hash = calculateMD5(hashData, 0, i);\n    var keyLengthInBytes = keyLength >> 3;\n    if (revision >= 3) {\n      for (j = 0; j < 50; ++j) {\n        hash = calculateMD5(hash, 0, keyLengthInBytes);\n      }\n    }\n    var encryptionKey = hash.subarray(0, keyLengthInBytes);\n    var cipher, checkData;\n\n    if (revision >= 3) {\n      for (i = 0; i < 32; ++i) {\n        hashData[i] = defaultPasswordBytes[i];\n      }\n      for (j = 0, n = fileId.length; j < n; ++j) {\n        hashData[i++] = fileId[j];\n      }\n      cipher = new ARCFourCipher(encryptionKey);\n      checkData = cipher.encryptBlock(calculateMD5(hashData, 0, i));\n      n = encryptionKey.length;\n      var derivedKey = new Uint8Array(n), k;\n      for (j = 1; j <= 19; ++j) {\n        for (k = 0; k < n; ++k) {\n          derivedKey[k] = encryptionKey[k] ^ j;\n        }\n        cipher = new ARCFourCipher(derivedKey);\n        checkData = cipher.encryptBlock(checkData);\n      }\n      for (j = 0, n = checkData.length; j < n; ++j) {\n        if (userPassword[j] !== checkData[j]) {\n          return null;\n        }\n      }\n    } else {\n      cipher = new ARCFourCipher(encryptionKey);\n      checkData = cipher.encryptBlock(defaultPasswordBytes);\n      for (j = 0, n = checkData.length; j < n; ++j) {\n        if (userPassword[j] !== checkData[j]) {\n          return null;\n        }\n      }\n    }\n    return encryptionKey;\n  }\n\n  function decodeUserPassword(password, ownerPassword, revision, keyLength) {\n    var hashData = new Uint8Array(32), i = 0, j, n;\n    n = Math.min(32, password.length);\n    for (; i < n; ++i) {\n      hashData[i] = password[i];\n    }\n    j = 0;\n    while (i < 32) {\n      hashData[i++] = defaultPasswordBytes[j++];\n    }\n    var hash = calculateMD5(hashData, 0, i);\n    var keyLengthInBytes = keyLength >> 3;\n    if (revision >= 3) {\n      for (j = 0; j < 50; ++j) {\n        hash = calculateMD5(hash, 0, hash.length);\n      }\n    }\n\n    var cipher, userPassword;\n    if (revision >= 3) {\n      userPassword = ownerPassword;\n      var derivedKey = new Uint8Array(keyLengthInBytes), k;\n      for (j = 19; j >= 0; j--) {\n        for (k = 0; k < keyLengthInBytes; ++k) {\n          derivedKey[k] = hash[k] ^ j;\n        }\n        cipher = new ARCFourCipher(derivedKey);\n        userPassword = cipher.encryptBlock(userPassword);\n      }\n    } else {\n      cipher = new ARCFourCipher(hash.subarray(0, keyLengthInBytes));\n      userPassword = cipher.encryptBlock(ownerPassword);\n    }\n    return userPassword;\n  }\n\n  var identityName = Name.get('Identity');\n\n  function CipherTransformFactory(dict, fileId, password) {\n    var filter = dict.get('Filter');\n    if (!isName(filter, 'Standard')) {\n      throw new FormatError('unknown encryption method');\n    }\n    this.dict = dict;\n    var algorithm = dict.get('V');\n    if (!Number.isInteger(algorithm) ||\n        (algorithm !== 1 && algorithm !== 2 && algorithm !== 4 &&\n         algorithm !== 5)) {\n      throw new FormatError('unsupported encryption algorithm');\n    }\n    this.algorithm = algorithm;\n    var keyLength = dict.get('Length');\n    if (!keyLength) {\n      // Spec asks to rely on encryption dictionary's Length entry, however\n      // some PDFs don't have it. Trying to recover.\n      if (algorithm <= 3) {\n        // For 1 and 2 it's fixed to 40-bit, for 3 40-bit is a minimal value.\n        keyLength = 40;\n      } else {\n        // Trying to find default handler -- it usually has Length.\n        var cfDict = dict.get('CF');\n        var streamCryptoName = dict.get('StmF');\n        if (isDict(cfDict) && isName(streamCryptoName)) {\n          cfDict.suppressEncryption = true; // See comment below.\n          var handlerDict = cfDict.get(streamCryptoName.name);\n          keyLength = (handlerDict && handlerDict.get('Length')) || 128;\n          if (keyLength < 40) {\n            // Sometimes it's incorrect value of bits, generators specify bytes.\n            keyLength <<= 3;\n          }\n        }\n      }\n    }\n    if (!Number.isInteger(keyLength) ||\n        keyLength < 40 || (keyLength % 8) !== 0) {\n      throw new FormatError('invalid key length');\n    }\n\n    // prepare keys\n    var ownerPassword = stringToBytes(dict.get('O')).subarray(0, 32);\n    var userPassword = stringToBytes(dict.get('U')).subarray(0, 32);\n    var flags = dict.get('P');\n    var revision = dict.get('R');\n    // meaningful when V is 4 or 5\n    var encryptMetadata = ((algorithm === 4 || algorithm === 5) &&\n                           dict.get('EncryptMetadata') !== false);\n    this.encryptMetadata = encryptMetadata;\n\n    var fileIdBytes = stringToBytes(fileId);\n    var passwordBytes;\n    if (password) {\n      if (revision === 6) {\n        try {\n          password = utf8StringToString(password);\n        } catch (ex) {\n          warn('CipherTransformFactory: ' +\n               'Unable to convert UTF8 encoded password.');\n        }\n      }\n      passwordBytes = stringToBytes(password);\n    }\n\n    var encryptionKey;\n    if (algorithm !== 5) {\n      encryptionKey = prepareKeyData(fileIdBytes, passwordBytes,\n                                     ownerPassword, userPassword, flags,\n                                     revision, keyLength, encryptMetadata);\n    } else {\n      var ownerValidationSalt = stringToBytes(dict.get('O')).subarray(32, 40);\n      var ownerKeySalt = stringToBytes(dict.get('O')).subarray(40, 48);\n      var uBytes = stringToBytes(dict.get('U')).subarray(0, 48);\n      var userValidationSalt = stringToBytes(dict.get('U')).subarray(32, 40);\n      var userKeySalt = stringToBytes(dict.get('U')).subarray(40, 48);\n      var ownerEncryption = stringToBytes(dict.get('OE'));\n      var userEncryption = stringToBytes(dict.get('UE'));\n      var perms = stringToBytes(dict.get('Perms'));\n      encryptionKey =\n        createEncryptionKey20(revision, passwordBytes,\n          ownerPassword, ownerValidationSalt,\n          ownerKeySalt, uBytes,\n          userPassword, userValidationSalt,\n          userKeySalt, ownerEncryption,\n          userEncryption, perms);\n    }\n    if (!encryptionKey && !password) {\n      throw new PasswordException('No password given',\n                                  PasswordResponses.NEED_PASSWORD);\n    } else if (!encryptionKey && password) {\n      // Attempting use the password as an owner password\n      var decodedPassword = decodeUserPassword(passwordBytes, ownerPassword,\n                                               revision, keyLength);\n      encryptionKey = prepareKeyData(fileIdBytes, decodedPassword,\n                                     ownerPassword, userPassword, flags,\n                                     revision, keyLength, encryptMetadata);\n    }\n\n    if (!encryptionKey) {\n      throw new PasswordException('Incorrect Password',\n                                  PasswordResponses.INCORRECT_PASSWORD);\n    }\n\n    this.encryptionKey = encryptionKey;\n\n    if (algorithm >= 4) {\n      var cf = dict.get('CF');\n      if (isDict(cf)) {\n        // The 'CF' dictionary itself should not be encrypted, and by setting\n        // `suppressEncryption` we can prevent an infinite loop inside of\n        // `XRef_fetchUncompressed` if the dictionary contains indirect objects\n        // (fixes issue7665.pdf).\n        cf.suppressEncryption = true;\n      }\n      this.cf = cf;\n      this.stmf = dict.get('StmF') || identityName;\n      this.strf = dict.get('StrF') || identityName;\n      this.eff = dict.get('EFF') || this.stmf;\n    }\n  }\n\n  function buildObjectKey(num, gen, encryptionKey, isAes) {\n    var key = new Uint8Array(encryptionKey.length + 9), i, n;\n    for (i = 0, n = encryptionKey.length; i < n; ++i) {\n      key[i] = encryptionKey[i];\n    }\n    key[i++] = num & 0xFF;\n    key[i++] = (num >> 8) & 0xFF;\n    key[i++] = (num >> 16) & 0xFF;\n    key[i++] = gen & 0xFF;\n    key[i++] = (gen >> 8) & 0xFF;\n    if (isAes) {\n      key[i++] = 0x73;\n      key[i++] = 0x41;\n      key[i++] = 0x6C;\n      key[i++] = 0x54;\n    }\n    var hash = calculateMD5(key, 0, i);\n    return hash.subarray(0, Math.min(encryptionKey.length + 5, 16));\n  }\n\n  function buildCipherConstructor(cf, name, num, gen, key) {\n    if (!isName(name)) {\n      throw new FormatError('Invalid crypt filter name.');\n    }\n    var cryptFilter = cf.get(name.name);\n    var cfm;\n    if (cryptFilter !== null && cryptFilter !== undefined) {\n      cfm = cryptFilter.get('CFM');\n    }\n    if (!cfm || cfm.name === 'None') {\n      return function cipherTransformFactoryBuildCipherConstructorNone() {\n        return new NullCipher();\n      };\n    }\n    if (cfm.name === 'V2') {\n      return function cipherTransformFactoryBuildCipherConstructorV2() {\n        return new ARCFourCipher(buildObjectKey(num, gen, key, false));\n      };\n    }\n    if (cfm.name === 'AESV2') {\n      return function cipherTransformFactoryBuildCipherConstructorAESV2() {\n        return new AES128Cipher(buildObjectKey(num, gen, key, true));\n      };\n    }\n    if (cfm.name === 'AESV3') {\n      return function cipherTransformFactoryBuildCipherConstructorAESV3() {\n        return new AES256Cipher(key);\n      };\n    }\n    throw new FormatError('Unknown crypto method');\n  }\n\n  CipherTransformFactory.prototype = {\n    createCipherTransform:\n        function CipherTransformFactory_createCipherTransform(num, gen) {\n      if (this.algorithm === 4 || this.algorithm === 5) {\n        return new CipherTransform(\n          buildCipherConstructor(this.cf, this.stmf,\n                                 num, gen, this.encryptionKey),\n          buildCipherConstructor(this.cf, this.strf,\n                                 num, gen, this.encryptionKey));\n      }\n      // algorithms 1 and 2\n      var key = buildObjectKey(num, gen, this.encryptionKey, false);\n      var cipherConstructor = function buildCipherCipherConstructor() {\n        return new ARCFourCipher(key);\n      };\n      return new CipherTransform(cipherConstructor, cipherConstructor);\n    },\n  };\n\n  return CipherTransformFactory;\n})();\n\nexport {\n  AES128Cipher,\n  AES256Cipher,\n  ARCFourCipher,\n  CipherTransformFactory,\n  PDF17,\n  PDF20,\n  calculateMD5,\n  calculateSHA256,\n  calculateSHA384,\n  calculateSHA512,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  assert, FormatError, info, isString, shadow, unreachable, warn\n} from '../shared/util';\nimport { isDict, isName, isStream } from './primitives';\n\n/**\n * Resizes an RGB image with 3 components.\n * @param {TypedArray} src - The source buffer.\n * @param {TypedArray} dest - The destination buffer.\n * @param {Number} w1 - Original width.\n * @param {Number} h1 - Original height.\n * @param {Number} w2 - New width.\n * @param {Number} h2 - New height.\n * @param {Number} alpha01 - Size reserved for the alpha channel.\n */\nfunction resizeRgbImage(src, dest, w1, h1, w2, h2, alpha01) {\n  const COMPONENTS = 3;\n  alpha01 = alpha01 !== 1 ? 0 : alpha01;\n  let xRatio = w1 / w2;\n  let yRatio = h1 / h2;\n  let newIndex = 0, oldIndex;\n  let xScaled = new Uint16Array(w2);\n  let w1Scanline = w1 * COMPONENTS;\n\n  for (let i = 0; i < w2; i++) {\n    xScaled[i] = Math.floor(i * xRatio) * COMPONENTS;\n  }\n  for (let i = 0; i < h2; i++) {\n    const py = Math.floor(i * yRatio) * w1Scanline;\n    for (let j = 0; j < w2; j++) {\n      oldIndex = py + xScaled[j];\n      dest[newIndex++] = src[oldIndex++];\n      dest[newIndex++] = src[oldIndex++];\n      dest[newIndex++] = src[oldIndex++];\n      newIndex += alpha01;\n    }\n  }\n}\n\nclass ColorSpace {\n  constructor(name, numComps) {\n    if (this.constructor === ColorSpace) {\n      unreachable('Cannot initialize ColorSpace.');\n    }\n    this.name = name;\n    this.numComps = numComps;\n  }\n\n  /**\n   * Converts the color value to the RGB color. The color components are\n   * located in the src array starting from the srcOffset. Returns the array\n   * of the rgb components, each value ranging from [0,255].\n   */\n  getRgb(src, srcOffset) {\n    let rgb = new Uint8ClampedArray(3);\n    this.getRgbItem(src, srcOffset, rgb, 0);\n    return rgb;\n  }\n\n  /**\n   * Converts the color value to the RGB color, similar to the getRgb method.\n   * The result placed into the dest array starting from the destOffset.\n   */\n  getRgbItem(src, srcOffset, dest, destOffset) {\n    unreachable('Should not call ColorSpace.getRgbItem');\n  }\n\n  /**\n   * Converts the specified number of the color values to the RGB colors.\n   * The colors are located in the src array starting from the srcOffset.\n   * The result is placed into the dest array starting from the destOffset.\n   * The src array items shall be in [0,2^bits) range, the dest array items\n   * will be in [0,255] range. alpha01 indicates how many alpha components\n   * there are in the dest array; it will be either 0 (RGB array) or 1 (RGBA\n   * array).\n   */\n  getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {\n    unreachable('Should not call ColorSpace.getRgbBuffer');\n  }\n\n  /**\n   * Determines the number of bytes required to store the result of the\n   * conversion done by the getRgbBuffer method. As in getRgbBuffer,\n   * |alpha01| is either 0 (RGB output) or 1 (RGBA output).\n   */\n  getOutputLength(inputLength, alpha01) {\n    unreachable('Should not call ColorSpace.getOutputLength');\n  }\n\n  /**\n   * Returns true if source data will be equal the result/output data.\n   */\n  isPassthrough(bits) {\n    return false;\n  }\n\n  /**\n   * Fills in the RGB colors in the destination buffer.  alpha01 indicates\n   * how many alpha components there are in the dest array; it will be either\n   * 0 (RGB array) or 1 (RGBA array).\n   */\n  fillRgb(dest, originalWidth, originalHeight, width, height, actualHeight,\n          bpc, comps, alpha01) {\n    if (typeof PDFJSDev === 'undefined' ||\n        PDFJSDev.test('!PRODUCTION || TESTING')) {\n      assert(dest instanceof Uint8ClampedArray,\n             'ColorSpace.fillRgb: Unsupported \"dest\" type.');\n    }\n    let count = originalWidth * originalHeight;\n    let rgbBuf = null;\n    let numComponentColors = 1 << bpc;\n    let needsResizing = originalHeight !== height || originalWidth !== width;\n\n    if (this.isPassthrough(bpc)) {\n      rgbBuf = comps;\n    } else if (this.numComps === 1 && count > numComponentColors &&\n               this.name !== 'DeviceGray' && this.name !== 'DeviceRGB') {\n      // Optimization: create a color map when there is just one component and\n      // we are converting more colors than the size of the color map. We\n      // don't build the map if the colorspace is gray or rgb since those\n      // methods are faster than building a map. This mainly offers big speed\n      // ups for indexed and alternate colorspaces.\n      //\n      // TODO it may be worth while to cache the color map. While running\n      // testing I never hit a cache so I will leave that out for now (perhaps\n      // we are reparsing colorspaces too much?).\n      let allColors = bpc <= 8 ? new Uint8Array(numComponentColors) :\n                                 new Uint16Array(numComponentColors);\n      for (let i = 0; i < numComponentColors; i++) {\n        allColors[i] = i;\n      }\n      let colorMap = new Uint8ClampedArray(numComponentColors * 3);\n      this.getRgbBuffer(allColors, 0, numComponentColors, colorMap, 0, bpc,\n                        /* alpha01 = */ 0);\n\n      if (!needsResizing) {\n        // Fill in the RGB values directly into |dest|.\n        let destPos = 0;\n        for (let i = 0; i < count; ++i) {\n          const key = comps[i] * 3;\n          dest[destPos++] = colorMap[key];\n          dest[destPos++] = colorMap[key + 1];\n          dest[destPos++] = colorMap[key + 2];\n          destPos += alpha01;\n        }\n      } else {\n        rgbBuf = new Uint8Array(count * 3);\n        let rgbPos = 0;\n        for (let i = 0; i < count; ++i) {\n          const key = comps[i] * 3;\n          rgbBuf[rgbPos++] = colorMap[key];\n          rgbBuf[rgbPos++] = colorMap[key + 1];\n          rgbBuf[rgbPos++] = colorMap[key + 2];\n        }\n      }\n    } else {\n      if (!needsResizing) {\n        // Fill in the RGB values directly into |dest|.\n        this.getRgbBuffer(comps, 0, width * actualHeight, dest, 0, bpc,\n                          alpha01);\n      } else {\n        rgbBuf = new Uint8ClampedArray(count * 3);\n        this.getRgbBuffer(comps, 0, count, rgbBuf, 0, bpc, /* alpha01 = */ 0);\n      }\n    }\n\n    if (rgbBuf) {\n      if (needsResizing) {\n        resizeRgbImage(rgbBuf, dest, originalWidth, originalHeight,\n                       width, height, alpha01);\n      } else {\n        let destPos = 0, rgbPos = 0;\n        for (let i = 0, ii = width * actualHeight; i < ii; i++) {\n          dest[destPos++] = rgbBuf[rgbPos++];\n          dest[destPos++] = rgbBuf[rgbPos++];\n          dest[destPos++] = rgbBuf[rgbPos++];\n          destPos += alpha01;\n        }\n      }\n    }\n  }\n\n  /**\n   * True if the colorspace has components in the default range of [0, 1].\n   * This should be true for all colorspaces except for lab color spaces\n   * which are [0,100], [-128, 127], [-128, 127].\n   */\n  get usesZeroToOneRange() {\n    return shadow(this, 'usesZeroToOneRange', true);\n  }\n\n  static parse(cs, xref, res, pdfFunctionFactory) {\n    let IR = this.parseToIR(cs, xref, res, pdfFunctionFactory);\n    return this.fromIR(IR);\n  }\n\n  static fromIR(IR) {\n    let name = Array.isArray(IR) ? IR[0] : IR;\n    let whitePoint, blackPoint, gamma;\n\n    switch (name) {\n      case 'DeviceGrayCS':\n        return this.singletons.gray;\n      case 'DeviceRgbCS':\n        return this.singletons.rgb;\n      case 'DeviceCmykCS':\n        return this.singletons.cmyk;\n      case 'CalGrayCS':\n        whitePoint = IR[1];\n        blackPoint = IR[2];\n        gamma = IR[3];\n        return new CalGrayCS(whitePoint, blackPoint, gamma);\n      case 'CalRGBCS':\n        whitePoint = IR[1];\n        blackPoint = IR[2];\n        gamma = IR[3];\n        let matrix = IR[4];\n        return new CalRGBCS(whitePoint, blackPoint, gamma, matrix);\n      case 'PatternCS':\n        let basePatternCS = IR[1];\n        if (basePatternCS) {\n          basePatternCS = this.fromIR(basePatternCS);\n        }\n        return new PatternCS(basePatternCS);\n      case 'IndexedCS':\n        let baseIndexedCS = IR[1];\n        let hiVal = IR[2];\n        let lookup = IR[3];\n        return new IndexedCS(this.fromIR(baseIndexedCS), hiVal, lookup);\n      case 'AlternateCS':\n        let numComps = IR[1];\n        let alt = IR[2];\n        let tintFn = IR[3];\n        return new AlternateCS(numComps, this.fromIR(alt), tintFn);\n      case 'LabCS':\n        whitePoint = IR[1];\n        blackPoint = IR[2];\n        let range = IR[3];\n        return new LabCS(whitePoint, blackPoint, range);\n      default:\n        throw new FormatError(`Unknown colorspace name: ${name}`);\n    }\n  }\n\n  static parseToIR(cs, xref, res = null, pdfFunctionFactory) {\n    cs = xref.fetchIfRef(cs);\n    if (isName(cs)) {\n      switch (cs.name) {\n        case 'DeviceGray':\n        case 'G':\n          return 'DeviceGrayCS';\n        case 'DeviceRGB':\n        case 'RGB':\n          return 'DeviceRgbCS';\n        case 'DeviceCMYK':\n        case 'CMYK':\n          return 'DeviceCmykCS';\n        case 'Pattern':\n          return ['PatternCS', null];\n        default:\n          if (isDict(res)) {\n            let colorSpaces = res.get('ColorSpace');\n            if (isDict(colorSpaces)) {\n              let resCS = colorSpaces.get(cs.name);\n              if (resCS) {\n                if (isName(resCS)) {\n                  return this.parseToIR(resCS, xref, res, pdfFunctionFactory);\n                }\n                cs = resCS;\n                break;\n              }\n            }\n          }\n          throw new FormatError(`unrecognized colorspace ${cs.name}`);\n      }\n    }\n    if (Array.isArray(cs)) {\n      let mode = xref.fetchIfRef(cs[0]).name;\n      let numComps, params, alt, whitePoint, blackPoint, gamma;\n\n      switch (mode) {\n        case 'DeviceGray':\n        case 'G':\n          return 'DeviceGrayCS';\n        case 'DeviceRGB':\n        case 'RGB':\n          return 'DeviceRgbCS';\n        case 'DeviceCMYK':\n        case 'CMYK':\n          return 'DeviceCmykCS';\n        case 'CalGray':\n          params = xref.fetchIfRef(cs[1]);\n          whitePoint = params.getArray('WhitePoint');\n          blackPoint = params.getArray('BlackPoint');\n          gamma = params.get('Gamma');\n          return ['CalGrayCS', whitePoint, blackPoint, gamma];\n        case 'CalRGB':\n          params = xref.fetchIfRef(cs[1]);\n          whitePoint = params.getArray('WhitePoint');\n          blackPoint = params.getArray('BlackPoint');\n          gamma = params.getArray('Gamma');\n          let matrix = params.getArray('Matrix');\n          return ['CalRGBCS', whitePoint, blackPoint, gamma, matrix];\n        case 'ICCBased':\n          let stream = xref.fetchIfRef(cs[1]);\n          let dict = stream.dict;\n          numComps = dict.get('N');\n          alt = dict.get('Alternate');\n          if (alt) {\n            let altIR = this.parseToIR(alt, xref, res, pdfFunctionFactory);\n            // Parse the /Alternate CS to ensure that the number of components\n            // are correct, and also (indirectly) that it is not a PatternCS.\n            let altCS = this.fromIR(altIR, pdfFunctionFactory);\n            if (altCS.numComps === numComps) {\n              return altIR;\n            }\n            warn('ICCBased color space: Ignoring incorrect /Alternate entry.');\n          }\n          if (numComps === 1) {\n            return 'DeviceGrayCS';\n          } else if (numComps === 3) {\n            return 'DeviceRgbCS';\n          } else if (numComps === 4) {\n            return 'DeviceCmykCS';\n          }\n          break;\n        case 'Pattern':\n          let basePatternCS = cs[1] || null;\n          if (basePatternCS) {\n            basePatternCS = this.parseToIR(basePatternCS, xref, res,\n                                           pdfFunctionFactory);\n          }\n          return ['PatternCS', basePatternCS];\n        case 'Indexed':\n        case 'I':\n          let baseIndexedCS = this.parseToIR(cs[1], xref, res,\n                                             pdfFunctionFactory);\n          let hiVal = xref.fetchIfRef(cs[2]) + 1;\n          let lookup = xref.fetchIfRef(cs[3]);\n          if (isStream(lookup)) {\n            lookup = lookup.getBytes();\n          }\n          return ['IndexedCS', baseIndexedCS, hiVal, lookup];\n        case 'Separation':\n        case 'DeviceN':\n          let name = xref.fetchIfRef(cs[1]);\n          numComps = Array.isArray(name) ? name.length : 1;\n          alt = this.parseToIR(cs[2], xref, res, pdfFunctionFactory);\n          let tintFn = pdfFunctionFactory.create(xref.fetchIfRef(cs[3]));\n          return ['AlternateCS', numComps, alt, tintFn];\n        case 'Lab':\n          params = xref.fetchIfRef(cs[1]);\n          whitePoint = params.getArray('WhitePoint');\n          blackPoint = params.getArray('BlackPoint');\n          let range = params.getArray('Range');\n          return ['LabCS', whitePoint, blackPoint, range];\n        default:\n          throw new FormatError(`unimplemented color space object \"${mode}\"`);\n      }\n    }\n    throw new FormatError(`unrecognized color space object: \"${cs}\"`);\n  }\n\n  /**\n   * Checks if a decode map matches the default decode map for a color space.\n   * This handles the general decode maps where there are two values per\n   * component. e.g. [0, 1, 0, 1, 0, 1] for a RGB color.\n   * This does not handle Lab, Indexed, or Pattern decode maps since they are\n   * slightly different.\n   * @param {Array} decode Decode map (usually from an image).\n   * @param {Number} n Number of components the color space has.\n   */\n  static isDefaultDecode(decode, n) {\n    if (!Array.isArray(decode)) {\n      return true;\n    }\n\n    if (n * 2 !== decode.length) {\n      warn('The decode map is not the correct length');\n      return true;\n    }\n    for (let i = 0, ii = decode.length; i < ii; i += 2) {\n      if (decode[i] !== 0 || decode[i + 1] !== 1) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  static get singletons() {\n    return shadow(this, 'singletons', {\n      get gray() {\n        return shadow(this, 'gray', new DeviceGrayCS());\n      },\n      get rgb() {\n        return shadow(this, 'rgb', new DeviceRgbCS());\n      },\n      get cmyk() {\n        return shadow(this, 'cmyk', new DeviceCmykCS());\n      },\n    });\n  }\n}\n\n/**\n * Alternate color space handles both Separation and DeviceN color spaces.  A\n * Separation color space is actually just a DeviceN with one color component.\n * Both color spaces use a tinting function to convert colors to a base color\n * space.\n *\n * The default color is `new Float32Array(new Array(numComps).fill(1))`.\n */\nclass AlternateCS extends ColorSpace {\n  constructor(numComps, base, tintFn) {\n    super('Alternate', numComps);\n    this.base = base;\n    this.tintFn = tintFn;\n    this.tmpBuf = new Float32Array(base.numComps);\n  }\n\n  getRgbItem(src, srcOffset, dest, destOffset) {\n    if (typeof PDFJSDev === 'undefined' ||\n        PDFJSDev.test('!PRODUCTION || TESTING')) {\n      assert(dest instanceof Uint8ClampedArray,\n             'AlternateCS.getRgbItem: Unsupported \"dest\" type.');\n    }\n    let tmpBuf = this.tmpBuf;\n    this.tintFn(src, srcOffset, tmpBuf, 0);\n    this.base.getRgbItem(tmpBuf, 0, dest, destOffset);\n  }\n\n  getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {\n    if (typeof PDFJSDev === 'undefined' ||\n        PDFJSDev.test('!PRODUCTION || TESTING')) {\n      assert(dest instanceof Uint8ClampedArray,\n             'AlternateCS.getRgbBuffer: Unsupported \"dest\" type.');\n    }\n    let tintFn = this.tintFn;\n    let base = this.base;\n    let scale = 1 / ((1 << bits) - 1);\n    let baseNumComps = base.numComps;\n    let usesZeroToOneRange = base.usesZeroToOneRange;\n    let isPassthrough = (base.isPassthrough(8) || !usesZeroToOneRange) &&\n                        alpha01 === 0;\n    let pos = isPassthrough ? destOffset : 0;\n    let baseBuf = isPassthrough ?\n                  dest : new Uint8ClampedArray(baseNumComps * count);\n    let numComps = this.numComps;\n\n    let scaled = new Float32Array(numComps);\n    let tinted = new Float32Array(baseNumComps);\n    let i, j;\n\n    for (i = 0; i < count; i++) {\n      for (j = 0; j < numComps; j++) {\n        scaled[j] = src[srcOffset++] * scale;\n      }\n      tintFn(scaled, 0, tinted, 0);\n      if (usesZeroToOneRange) {\n        for (j = 0; j < baseNumComps; j++) {\n          baseBuf[pos++] = tinted[j] * 255;\n        }\n      } else {\n        base.getRgbItem(tinted, 0, baseBuf, pos);\n        pos += baseNumComps;\n      }\n    }\n\n    if (!isPassthrough) {\n      base.getRgbBuffer(baseBuf, 0, count, dest, destOffset, 8, alpha01);\n    }\n  }\n\n  getOutputLength(inputLength, alpha01) {\n    return this.base.getOutputLength(inputLength *\n                                     this.base.numComps / this.numComps,\n                                     alpha01);\n  }\n\n  isDefaultDecode(decodeMap) {\n    return ColorSpace.isDefaultDecode(decodeMap, this.numComps);\n  }\n}\n\nclass PatternCS extends ColorSpace {\n  constructor(baseCS) {\n    super('Pattern', null);\n    this.base = baseCS;\n  }\n}\n\n/**\n * The default color is `new Uint8Array([0])`.\n */\nclass IndexedCS extends ColorSpace {\n  constructor(base, highVal, lookup) {\n    super('Indexed', 1);\n    this.base = base;\n    this.highVal = highVal;\n\n    let baseNumComps = base.numComps;\n    let length = baseNumComps * highVal;\n\n    if (isStream(lookup)) {\n      this.lookup = new Uint8Array(length);\n      let bytes = lookup.getBytes(length);\n      this.lookup.set(bytes);\n    } else if (isString(lookup)) {\n      this.lookup = new Uint8Array(length);\n      for (let i = 0; i < length; ++i) {\n        this.lookup[i] = lookup.charCodeAt(i);\n      }\n    } else if (lookup instanceof Uint8Array) {\n      this.lookup = lookup;\n    } else {\n      throw new FormatError(`Unrecognized lookup table: ${lookup}`);\n    }\n  }\n\n  getRgbItem(src, srcOffset, dest, destOffset) {\n    if (typeof PDFJSDev === 'undefined' ||\n        PDFJSDev.test('!PRODUCTION || TESTING')) {\n      assert(dest instanceof Uint8ClampedArray,\n             'IndexedCS.getRgbItem: Unsupported \"dest\" type.');\n    }\n    let numComps = this.base.numComps;\n    let start = src[srcOffset] * numComps;\n    this.base.getRgbBuffer(this.lookup, start, 1, dest, destOffset, 8, 0);\n  }\n\n  getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {\n    if (typeof PDFJSDev === 'undefined' ||\n        PDFJSDev.test('!PRODUCTION || TESTING')) {\n      assert(dest instanceof Uint8ClampedArray,\n             'IndexedCS.getRgbBuffer: Unsupported \"dest\" type.');\n    }\n    let base = this.base;\n    let numComps = base.numComps;\n    let outputDelta = base.getOutputLength(numComps, alpha01);\n    let lookup = this.lookup;\n\n    for (let i = 0; i < count; ++i) {\n      let lookupPos = src[srcOffset++] * numComps;\n      base.getRgbBuffer(lookup, lookupPos, 1, dest, destOffset, 8, alpha01);\n      destOffset += outputDelta;\n    }\n  }\n\n  getOutputLength(inputLength, alpha01) {\n    return this.base.getOutputLength(inputLength * this.base.numComps, alpha01);\n  }\n\n  isDefaultDecode(decodeMap) {\n    return true; // Indexed color maps shouldn't be changed.\n  }\n}\n\n/**\n * The default color is `new Float32Array([0])`.\n */\nclass DeviceGrayCS extends ColorSpace {\n  constructor() {\n    super('DeviceGray', 1);\n  }\n\n  getRgbItem(src, srcOffset, dest, destOffset) {\n    if (typeof PDFJSDev === 'undefined' ||\n        PDFJSDev.test('!PRODUCTION || TESTING')) {\n      assert(dest instanceof Uint8ClampedArray,\n             'DeviceGrayCS.getRgbItem: Unsupported \"dest\" type.');\n    }\n    let c = src[srcOffset] * 255;\n    dest[destOffset] = dest[destOffset + 1] = dest[destOffset + 2] = c;\n  }\n\n  getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {\n    if (typeof PDFJSDev === 'undefined' ||\n        PDFJSDev.test('!PRODUCTION || TESTING')) {\n      assert(dest instanceof Uint8ClampedArray,\n             'DeviceGrayCS.getRgbBuffer: Unsupported \"dest\" type.');\n    }\n    let scale = 255 / ((1 << bits) - 1);\n    let j = srcOffset, q = destOffset;\n    for (let i = 0; i < count; ++i) {\n      let c = scale * src[j++];\n      dest[q++] = c;\n      dest[q++] = c;\n      dest[q++] = c;\n      q += alpha01;\n    }\n  }\n\n  getOutputLength(inputLength, alpha01) {\n    return inputLength * (3 + alpha01);\n  }\n\n  isDefaultDecode(decodeMap) {\n    return ColorSpace.isDefaultDecode(decodeMap, this.numComps);\n  }\n}\n\n/**\n * The default color is `new Float32Array([0, 0, 0])`.\n */\nclass DeviceRgbCS extends ColorSpace {\n  constructor() {\n    super('DeviceRGB', 3);\n  }\n\n  getRgbItem(src, srcOffset, dest, destOffset) {\n    if (typeof PDFJSDev === 'undefined' ||\n        PDFJSDev.test('!PRODUCTION || TESTING')) {\n      assert(dest instanceof Uint8ClampedArray,\n             'DeviceRgbCS.getRgbItem: Unsupported \"dest\" type.');\n    }\n    dest[destOffset] = src[srcOffset] * 255;\n    dest[destOffset + 1] = src[srcOffset + 1] * 255;\n    dest[destOffset + 2] = src[srcOffset + 2] * 255;\n  }\n\n  getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {\n    if (typeof PDFJSDev === 'undefined' ||\n        PDFJSDev.test('!PRODUCTION || TESTING')) {\n      assert(dest instanceof Uint8ClampedArray,\n             'DeviceRgbCS.getRgbBuffer: Unsupported \"dest\" type.');\n    }\n    if (bits === 8 && alpha01 === 0) {\n      dest.set(src.subarray(srcOffset, srcOffset + count * 3), destOffset);\n      return;\n    }\n    let scale = 255 / ((1 << bits) - 1);\n    let j = srcOffset, q = destOffset;\n    for (let i = 0; i < count; ++i) {\n      dest[q++] = scale * src[j++];\n      dest[q++] = scale * src[j++];\n      dest[q++] = scale * src[j++];\n      q += alpha01;\n    }\n  }\n\n  getOutputLength(inputLength, alpha01) {\n    return (inputLength * (3 + alpha01) / 3) | 0;\n  }\n\n  isPassthrough(bits) {\n    return bits === 8;\n  }\n\n  isDefaultDecode(decodeMap) {\n    return ColorSpace.isDefaultDecode(decodeMap, this.numComps);\n  }\n}\n\n/**\n * The default color is `new Float32Array([0, 0, 0, 1])`.\n */\nconst DeviceCmykCS = (function DeviceCmykCSClosure() {\n  // The coefficients below was found using numerical analysis: the method of\n  // steepest descent for the sum((f_i - color_value_i)^2) for r/g/b colors,\n  // where color_value is the tabular value from the table of sampled RGB colors\n  // from CMYK US Web Coated (SWOP) colorspace, and f_i is the corresponding\n  // CMYK color conversion using the estimation below:\n  //   f(A, B,.. N) = Acc+Bcm+Ccy+Dck+c+Fmm+Gmy+Hmk+Im+Jyy+Kyk+Ly+Mkk+Nk+255\n  function convertToRgb(src, srcOffset, srcScale, dest, destOffset) {\n    let c = src[srcOffset] * srcScale;\n    let m = src[srcOffset + 1] * srcScale;\n    let y = src[srcOffset + 2] * srcScale;\n    let k = src[srcOffset + 3] * srcScale;\n\n    dest[destOffset] = 255 +\n      c * (-4.387332384609988 * c + 54.48615194189176 * m +\n           18.82290502165302 * y + 212.25662451639585 * k +\n           -285.2331026137004) +\n      m * (1.7149763477362134 * m - 5.6096736904047315 * y +\n           -17.873870861415444 * k - 5.497006427196366) +\n      y * (-2.5217340131683033 * y - 21.248923337353073 * k +\n           17.5119270841813) +\n      k * (-21.86122147463605 * k - 189.48180835922747);\n\n    dest[destOffset + 1] = 255 +\n      c * (8.841041422036149 * c + 60.118027045597366 * m +\n           6.871425592049007 * y + 31.159100130055922 * k +\n           -79.2970844816548) +\n      m * (-15.310361306967817 * m + 17.575251261109482 * y +\n           131.35250912493976 * k - 190.9453302588951) +\n      y * (4.444339102852739 * y + 9.8632861493405 * k - 24.86741582555878) +\n      k * (-20.737325471181034 * k - 187.80453709719578);\n\n    dest[destOffset + 2] = 255 +\n      c * (0.8842522430003296 * c + 8.078677503112928 * m +\n           30.89978309703729 * y - 0.23883238689178934 * k +\n           -14.183576799673286) +\n      m * (10.49593273432072 * m + 63.02378494754052 * y +\n           50.606957656360734 * k - 112.23884253719248) +\n      y * (0.03296041114873217 * y + 115.60384449646641 * k +\n           -193.58209356861505) +\n      k * (-22.33816807309886 * k - 180.12613974708367);\n  }\n\n  class DeviceCmykCS extends ColorSpace {\n    constructor() {\n      super('DeviceCMYK', 4);\n    }\n\n    getRgbItem(src, srcOffset, dest, destOffset) {\n      if (typeof PDFJSDev === 'undefined' ||\n          PDFJSDev.test('!PRODUCTION || TESTING')) {\n        assert(dest instanceof Uint8ClampedArray,\n               'DeviceCmykCS.getRgbItem: Unsupported \"dest\" type.');\n      }\n      convertToRgb(src, srcOffset, 1, dest, destOffset);\n    }\n\n    getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {\n      if (typeof PDFJSDev === 'undefined' ||\n          PDFJSDev.test('!PRODUCTION || TESTING')) {\n        assert(dest instanceof Uint8ClampedArray,\n               'DeviceCmykCS.getRgbBuffer: Unsupported \"dest\" type.');\n      }\n      let scale = 1 / ((1 << bits) - 1);\n      for (let i = 0; i < count; i++) {\n        convertToRgb(src, srcOffset, scale, dest, destOffset);\n        srcOffset += 4;\n        destOffset += 3 + alpha01;\n      }\n    }\n\n    getOutputLength(inputLength, alpha01) {\n      return (inputLength / 4 * (3 + alpha01)) | 0;\n    }\n\n    isDefaultDecode(decodeMap) {\n      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);\n    }\n  }\n  return DeviceCmykCS;\n})();\n\n/**\n * CalGrayCS: Based on \"PDF Reference, Sixth Ed\", p.245\n *\n * The default color is `new Float32Array([0])`.\n */\nconst CalGrayCS = (function CalGrayCSClosure() {\n  function convertToRgb(cs, src, srcOffset, dest, destOffset, scale) {\n    // A represents a gray component of a calibrated gray space.\n    // A <---> AG in the spec\n    let A = src[srcOffset] * scale;\n    let AG = Math.pow(A, cs.G);\n\n    // Computes L as per spec. ( = cs.YW * AG )\n    // Except if other than default BlackPoint values are used.\n    let L = cs.YW * AG;\n    // http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html, Ch 4.\n    // Convert values to rgb range [0, 255].\n    let val = Math.max(295.8 * Math.pow(L, 0.333333333333333333) - 40.8, 0);\n    dest[destOffset] = val;\n    dest[destOffset + 1] = val;\n    dest[destOffset + 2] = val;\n  }\n\n  class CalGrayCS extends ColorSpace {\n    constructor(whitePoint, blackPoint, gamma) {\n      super('CalGray', 1);\n\n      if (!whitePoint) {\n        throw new FormatError(\n          'WhitePoint missing - required for color space CalGray');\n      }\n      blackPoint = blackPoint || [0, 0, 0];\n      gamma = gamma || 1;\n\n      // Translate arguments to spec variables.\n      this.XW = whitePoint[0];\n      this.YW = whitePoint[1];\n      this.ZW = whitePoint[2];\n\n      this.XB = blackPoint[0];\n      this.YB = blackPoint[1];\n      this.ZB = blackPoint[2];\n\n      this.G = gamma;\n\n      // Validate variables as per spec.\n      if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) {\n        throw new FormatError(`Invalid WhitePoint components for ${this.name}` +\n                              ', no fallback available');\n      }\n\n      if (this.XB < 0 || this.YB < 0 || this.ZB < 0) {\n        info(`Invalid BlackPoint for ${this.name}, falling back to default.`);\n        this.XB = this.YB = this.ZB = 0;\n      }\n\n      if (this.XB !== 0 || this.YB !== 0 || this.ZB !== 0) {\n        warn(`${this.name}, BlackPoint: XB: ${this.XB}, YB: ${this.YB}, ` +\n             `ZB: ${this.ZB}, only default values are supported.`);\n      }\n\n      if (this.G < 1) {\n        info(`Invalid Gamma: ${this.G} for ${this.name}, ` +\n             'falling back to default.');\n        this.G = 1;\n      }\n    }\n\n    getRgbItem(src, srcOffset, dest, destOffset) {\n      if (typeof PDFJSDev === 'undefined' ||\n          PDFJSDev.test('!PRODUCTION || TESTING')) {\n        assert(dest instanceof Uint8ClampedArray,\n               'CalGrayCS.getRgbItem: Unsupported \"dest\" type.');\n      }\n      convertToRgb(this, src, srcOffset, dest, destOffset, 1);\n    }\n\n    getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {\n      if (typeof PDFJSDev === 'undefined' ||\n          PDFJSDev.test('!PRODUCTION || TESTING')) {\n        assert(dest instanceof Uint8ClampedArray,\n               'CalGrayCS.getRgbBuffer: Unsupported \"dest\" type.');\n      }\n      let scale = 1 / ((1 << bits) - 1);\n\n      for (let i = 0; i < count; ++i) {\n        convertToRgb(this, src, srcOffset, dest, destOffset, scale);\n        srcOffset += 1;\n        destOffset += 3 + alpha01;\n      }\n    }\n\n    getOutputLength(inputLength, alpha01) {\n      return inputLength * (3 + alpha01);\n    }\n\n    isDefaultDecode(decodeMap) {\n      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);\n    }\n  }\n  return CalGrayCS;\n})();\n\n/**\n * CalRGBCS: Based on \"PDF Reference, Sixth Ed\", p.247\n *\n * The default color is `new Float32Array([0, 0, 0])`.\n */\nconst CalRGBCS = (function CalRGBCSClosure() {\n  // See http://www.brucelindbloom.com/index.html?Eqn_ChromAdapt.html for these\n  // matrices.\n  const BRADFORD_SCALE_MATRIX = new Float32Array([\n    0.8951, 0.2664, -0.1614,\n    -0.7502, 1.7135, 0.0367,\n    0.0389, -0.0685, 1.0296]);\n\n  const BRADFORD_SCALE_INVERSE_MATRIX = new Float32Array([\n    0.9869929, -0.1470543, 0.1599627,\n    0.4323053, 0.5183603, 0.0492912,\n    -0.0085287, 0.0400428, 0.9684867]);\n\n  // See http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html.\n  const SRGB_D65_XYZ_TO_RGB_MATRIX = new Float32Array([\n    3.2404542, -1.5371385, -0.4985314,\n    -0.9692660, 1.8760108, 0.0415560,\n    0.0556434, -0.2040259, 1.0572252]);\n\n  const FLAT_WHITEPOINT_MATRIX = new Float32Array([1, 1, 1]);\n\n  let tempNormalizeMatrix = new Float32Array(3);\n  let tempConvertMatrix1 = new Float32Array(3);\n  let tempConvertMatrix2 = new Float32Array(3);\n\n  const DECODE_L_CONSTANT = Math.pow(((8 + 16) / 116), 3) / 8.0;\n\n  function matrixProduct(a, b, result) {\n    result[0] = a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n    result[1] = a[3] * b[0] + a[4] * b[1] + a[5] * b[2];\n    result[2] = a[6] * b[0] + a[7] * b[1] + a[8] * b[2];\n  }\n\n  function convertToFlat(sourceWhitePoint, LMS, result) {\n    result[0] = LMS[0] * 1 / sourceWhitePoint[0];\n    result[1] = LMS[1] * 1 / sourceWhitePoint[1];\n    result[2] = LMS[2] * 1 / sourceWhitePoint[2];\n  }\n\n  function convertToD65(sourceWhitePoint, LMS, result) {\n    const D65X = 0.95047;\n    const D65Y = 1;\n    const D65Z = 1.08883;\n\n    result[0] = LMS[0] * D65X / sourceWhitePoint[0];\n    result[1] = LMS[1] * D65Y / sourceWhitePoint[1];\n    result[2] = LMS[2] * D65Z / sourceWhitePoint[2];\n  }\n\n  function sRGBTransferFunction(color) {\n    // See http://en.wikipedia.org/wiki/SRGB.\n    if (color <= 0.0031308) {\n      return adjustToRange(0, 1, 12.92 * color);\n    }\n    return adjustToRange(0, 1, (1 + 0.055) * Math.pow(color, 1 / 2.4) - 0.055);\n  }\n\n  function adjustToRange(min, max, value) {\n    return Math.max(min, Math.min(max, value));\n  }\n\n  function decodeL(L) {\n    if (L < 0) {\n      return -decodeL(-L);\n    }\n    if (L > 8.0) {\n      return Math.pow(((L + 16) / 116), 3);\n    }\n    return L * DECODE_L_CONSTANT;\n  }\n\n  function compensateBlackPoint(sourceBlackPoint, XYZ_Flat, result) {\n    // In case the blackPoint is already the default blackPoint then there is\n    // no need to do compensation.\n    if (sourceBlackPoint[0] === 0 && sourceBlackPoint[1] === 0 &&\n        sourceBlackPoint[2] === 0) {\n      result[0] = XYZ_Flat[0];\n      result[1] = XYZ_Flat[1];\n      result[2] = XYZ_Flat[2];\n      return;\n    }\n\n    // For the blackPoint calculation details, please see\n    // http://www.adobe.com/content/dam/Adobe/en/devnet/photoshop/sdk/\n    // AdobeBPC.pdf.\n    // The destination blackPoint is the default blackPoint [0, 0, 0].\n    let zeroDecodeL = decodeL(0);\n\n    let X_DST = zeroDecodeL;\n    let X_SRC = decodeL(sourceBlackPoint[0]);\n\n    let Y_DST = zeroDecodeL;\n    let Y_SRC = decodeL(sourceBlackPoint[1]);\n\n    let Z_DST = zeroDecodeL;\n    let Z_SRC = decodeL(sourceBlackPoint[2]);\n\n    let X_Scale = (1 - X_DST) / (1 - X_SRC);\n    let X_Offset = 1 - X_Scale;\n\n    let Y_Scale = (1 - Y_DST) / (1 - Y_SRC);\n    let Y_Offset = 1 - Y_Scale;\n\n    let Z_Scale = (1 - Z_DST) / (1 - Z_SRC);\n    let Z_Offset = 1 - Z_Scale;\n\n    result[0] = XYZ_Flat[0] * X_Scale + X_Offset;\n    result[1] = XYZ_Flat[1] * Y_Scale + Y_Offset;\n    result[2] = XYZ_Flat[2] * Z_Scale + Z_Offset;\n  }\n\n  function normalizeWhitePointToFlat(sourceWhitePoint, XYZ_In, result) {\n    // In case the whitePoint is already flat then there is no need to do\n    // normalization.\n    if (sourceWhitePoint[0] === 1 && sourceWhitePoint[2] === 1) {\n      result[0] = XYZ_In[0];\n      result[1] = XYZ_In[1];\n      result[2] = XYZ_In[2];\n      return;\n    }\n\n    let LMS = result;\n    matrixProduct(BRADFORD_SCALE_MATRIX, XYZ_In, LMS);\n\n    let LMS_Flat = tempNormalizeMatrix;\n    convertToFlat(sourceWhitePoint, LMS, LMS_Flat);\n\n    matrixProduct(BRADFORD_SCALE_INVERSE_MATRIX, LMS_Flat, result);\n  }\n\n  function normalizeWhitePointToD65(sourceWhitePoint, XYZ_In, result) {\n    let LMS = result;\n    matrixProduct(BRADFORD_SCALE_MATRIX, XYZ_In, LMS);\n\n    let LMS_D65 = tempNormalizeMatrix;\n    convertToD65(sourceWhitePoint, LMS, LMS_D65);\n\n    matrixProduct(BRADFORD_SCALE_INVERSE_MATRIX, LMS_D65, result);\n  }\n\n  function convertToRgb(cs, src, srcOffset, dest, destOffset, scale) {\n    // A, B and C represent a red, green and blue components of a calibrated\n    // rgb space.\n    let A = adjustToRange(0, 1, src[srcOffset] * scale);\n    let B = adjustToRange(0, 1, src[srcOffset + 1] * scale);\n    let C = adjustToRange(0, 1, src[srcOffset + 2] * scale);\n\n    // A <---> AGR in the spec\n    // B <---> BGG in the spec\n    // C <---> CGB in the spec\n    let AGR = Math.pow(A, cs.GR);\n    let BGG = Math.pow(B, cs.GG);\n    let CGB = Math.pow(C, cs.GB);\n\n    // Computes intermediate variables L, M, N as per spec.\n    // To decode X, Y, Z values map L, M, N directly to them.\n    let X = cs.MXA * AGR + cs.MXB * BGG + cs.MXC * CGB;\n    let Y = cs.MYA * AGR + cs.MYB * BGG + cs.MYC * CGB;\n    let Z = cs.MZA * AGR + cs.MZB * BGG + cs.MZC * CGB;\n\n    // The following calculations are based on this document:\n    // http://www.adobe.com/content/dam/Adobe/en/devnet/photoshop/sdk/\n    // AdobeBPC.pdf.\n    let XYZ = tempConvertMatrix1;\n    XYZ[0] = X;\n    XYZ[1] = Y;\n    XYZ[2] = Z;\n    let XYZ_Flat = tempConvertMatrix2;\n\n    normalizeWhitePointToFlat(cs.whitePoint, XYZ, XYZ_Flat);\n\n    let XYZ_Black = tempConvertMatrix1;\n    compensateBlackPoint(cs.blackPoint, XYZ_Flat, XYZ_Black);\n\n    let XYZ_D65 = tempConvertMatrix2;\n    normalizeWhitePointToD65(FLAT_WHITEPOINT_MATRIX, XYZ_Black, XYZ_D65);\n\n    let SRGB = tempConvertMatrix1;\n    matrixProduct(SRGB_D65_XYZ_TO_RGB_MATRIX, XYZ_D65, SRGB);\n\n    // Convert the values to rgb range [0, 255].\n    dest[destOffset] = sRGBTransferFunction(SRGB[0]) * 255;\n    dest[destOffset + 1] = sRGBTransferFunction(SRGB[1]) * 255;\n    dest[destOffset + 2] = sRGBTransferFunction(SRGB[2]) * 255;\n  }\n\n  class CalRGBCS extends ColorSpace {\n    constructor(whitePoint, blackPoint, gamma, matrix) {\n      super('CalRGB', 3);\n\n      if (!whitePoint) {\n        throw new FormatError(\n          'WhitePoint missing - required for color space CalRGB');\n      }\n      blackPoint = blackPoint || new Float32Array(3);\n      gamma = gamma || new Float32Array([1, 1, 1]);\n      matrix = matrix || new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]);\n\n      // Translate arguments to spec variables.\n      let XW = whitePoint[0];\n      let YW = whitePoint[1];\n      let ZW = whitePoint[2];\n      this.whitePoint = whitePoint;\n\n      let XB = blackPoint[0];\n      let YB = blackPoint[1];\n      let ZB = blackPoint[2];\n      this.blackPoint = blackPoint;\n\n      this.GR = gamma[0];\n      this.GG = gamma[1];\n      this.GB = gamma[2];\n\n      this.MXA = matrix[0];\n      this.MYA = matrix[1];\n      this.MZA = matrix[2];\n      this.MXB = matrix[3];\n      this.MYB = matrix[4];\n      this.MZB = matrix[5];\n      this.MXC = matrix[6];\n      this.MYC = matrix[7];\n      this.MZC = matrix[8];\n\n      // Validate variables as per spec.\n      if (XW < 0 || ZW < 0 || YW !== 1) {\n        throw new FormatError(`Invalid WhitePoint components for ${this.name}` +\n                              ', no fallback available');\n      }\n\n      if (XB < 0 || YB < 0 || ZB < 0) {\n        info(`Invalid BlackPoint for ${this.name} [${XB}, ${YB}, ${ZB}], ` +\n             'falling back to default.');\n        this.blackPoint = new Float32Array(3);\n      }\n\n      if (this.GR < 0 || this.GG < 0 || this.GB < 0) {\n        info(`Invalid Gamma [${this.GR}, ${this.GG}, ${this.GB}] for ` +\n             `${this.name}, falling back to default.`);\n        this.GR = this.GG = this.GB = 1;\n      }\n    }\n\n    getRgbItem(src, srcOffset, dest, destOffset) {\n      if (typeof PDFJSDev === 'undefined' ||\n          PDFJSDev.test('!PRODUCTION || TESTING')) {\n        assert(dest instanceof Uint8ClampedArray,\n               'CalRGBCS.getRgbItem: Unsupported \"dest\" type.');\n      }\n      convertToRgb(this, src, srcOffset, dest, destOffset, 1);\n    }\n\n    getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {\n      if (typeof PDFJSDev === 'undefined' ||\n          PDFJSDev.test('!PRODUCTION || TESTING')) {\n        assert(dest instanceof Uint8ClampedArray,\n              'CalRGBCS.getRgbBuffer: Unsupported \"dest\" type.');\n      }\n      let scale = 1 / ((1 << bits) - 1);\n\n      for (let i = 0; i < count; ++i) {\n        convertToRgb(this, src, srcOffset, dest, destOffset, scale);\n        srcOffset += 3;\n        destOffset += 3 + alpha01;\n      }\n    }\n\n    getOutputLength(inputLength, alpha01) {\n      return (inputLength * (3 + alpha01) / 3) | 0;\n    }\n\n    isDefaultDecode(decodeMap) {\n      return ColorSpace.isDefaultDecode(decodeMap, this.numComps);\n    }\n  }\n  return CalRGBCS;\n})();\n\n/**\n * LabCS: Based on \"PDF Reference, Sixth Ed\", p.250\n *\n * The default color is `new Float32Array([0, 0, 0])`.\n */\nconst LabCS = (function LabCSClosure() {\n  // Function g(x) from spec\n  function fn_g(x) {\n    let result;\n    if (x >= 6 / 29) {\n      result = x * x * x;\n    } else {\n      result = (108 / 841) * (x - 4 / 29);\n    }\n    return result;\n  }\n\n  function decode(value, high1, low2, high2) {\n    return low2 + (value) * (high2 - low2) / (high1);\n  }\n\n  // If decoding is needed maxVal should be 2^bits per component - 1.\n  function convertToRgb(cs, src, srcOffset, maxVal, dest, destOffset) {\n    // XXX: Lab input is in the range of [0, 100], [amin, amax], [bmin, bmax]\n    // not the usual [0, 1]. If a command like setFillColor is used the src\n    // values will already be within the correct range. However, if we are\n    // converting an image we have to map the values to the correct range given\n    // above.\n    // Ls,as,bs <---> L*,a*,b* in the spec\n    let Ls = src[srcOffset];\n    let as = src[srcOffset + 1];\n    let bs = src[srcOffset + 2];\n    if (maxVal !== false) {\n      Ls = decode(Ls, maxVal, 0, 100);\n      as = decode(as, maxVal, cs.amin, cs.amax);\n      bs = decode(bs, maxVal, cs.bmin, cs.bmax);\n    }\n\n    // Adjust limits of 'as' and 'bs'\n    as = as > cs.amax ? cs.amax : as < cs.amin ? cs.amin : as;\n    bs = bs > cs.bmax ? cs.bmax : bs < cs.bmin ? cs.bmin : bs;\n\n    // Computes intermediate variables X,Y,Z as per spec\n    let M = (Ls + 16) / 116;\n    let L = M + (as / 500);\n    let N = M - (bs / 200);\n\n    let X = cs.XW * fn_g(L);\n    let Y = cs.YW * fn_g(M);\n    let Z = cs.ZW * fn_g(N);\n\n    let r, g, b;\n    // Using different conversions for D50 and D65 white points,\n    // per http://www.color.org/srgb.pdf\n    if (cs.ZW < 1) {\n      // Assuming D50 (X=0.9642, Y=1.00, Z=0.8249)\n      r = X * 3.1339 + Y * -1.6170 + Z * -0.4906;\n      g = X * -0.9785 + Y * 1.9160 + Z * 0.0333;\n      b = X * 0.0720 + Y * -0.2290 + Z * 1.4057;\n    } else {\n      // Assuming D65 (X=0.9505, Y=1.00, Z=1.0888)\n      r = X * 3.2406 + Y * -1.5372 + Z * -0.4986;\n      g = X * -0.9689 + Y * 1.8758 + Z * 0.0415;\n      b = X * 0.0557 + Y * -0.2040 + Z * 1.0570;\n    }\n    // Convert the color values to the [0,255] range (clamping is automatic).\n    dest[destOffset] = Math.sqrt(r) * 255;\n    dest[destOffset + 1] = Math.sqrt(g) * 255;\n    dest[destOffset + 2] = Math.sqrt(b) * 255;\n  }\n\n  class LabCS extends ColorSpace {\n    constructor(whitePoint, blackPoint, range) {\n      super('Lab', 3);\n\n      if (!whitePoint) {\n        throw new FormatError(\n          'WhitePoint missing - required for color space Lab');\n      }\n      blackPoint = blackPoint || [0, 0, 0];\n      range = range || [-100, 100, -100, 100];\n\n      // Translate args to spec variables\n      this.XW = whitePoint[0];\n      this.YW = whitePoint[1];\n      this.ZW = whitePoint[2];\n      this.amin = range[0];\n      this.amax = range[1];\n      this.bmin = range[2];\n      this.bmax = range[3];\n\n      // These are here just for completeness - the spec doesn't offer any\n      // formulas that use BlackPoint in Lab\n      this.XB = blackPoint[0];\n      this.YB = blackPoint[1];\n      this.ZB = blackPoint[2];\n\n      // Validate vars as per spec\n      if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) {\n        throw new FormatError(\n          'Invalid WhitePoint components, no fallback available');\n      }\n\n      if (this.XB < 0 || this.YB < 0 || this.ZB < 0) {\n        info('Invalid BlackPoint, falling back to default');\n        this.XB = this.YB = this.ZB = 0;\n      }\n\n      if (this.amin > this.amax || this.bmin > this.bmax) {\n        info('Invalid Range, falling back to defaults');\n        this.amin = -100;\n        this.amax = 100;\n        this.bmin = -100;\n        this.bmax = 100;\n      }\n    }\n\n    getRgbItem(src, srcOffset, dest, destOffset) {\n      if (typeof PDFJSDev === 'undefined' ||\n          PDFJSDev.test('!PRODUCTION || TESTING')) {\n        assert(dest instanceof Uint8ClampedArray,\n               'LabCS.getRgbItem: Unsupported \"dest\" type.');\n      }\n      convertToRgb(this, src, srcOffset, false, dest, destOffset);\n    }\n\n    getRgbBuffer(src, srcOffset, count, dest, destOffset, bits, alpha01) {\n      if (typeof PDFJSDev === 'undefined' ||\n          PDFJSDev.test('!PRODUCTION || TESTING')) {\n        assert(dest instanceof Uint8ClampedArray,\n               'LabCS.getRgbBuffer: Unsupported \"dest\" type.');\n      }\n      let maxVal = (1 << bits) - 1;\n      for (let i = 0; i < count; i++) {\n        convertToRgb(this, src, srcOffset, maxVal, dest, destOffset);\n        srcOffset += 3;\n        destOffset += 3 + alpha01;\n      }\n    }\n\n    getOutputLength(inputLength, alpha01) {\n      return (inputLength * (3 + alpha01) / 3) | 0;\n    }\n\n    isDefaultDecode(decodeMap) {\n      // XXX: Decoding is handled with the lab conversion because of the strange\n      // ranges that are used.\n      return true;\n    }\n\n    get usesZeroToOneRange() {\n      return shadow(this, 'usesZeroToOneRange', false);\n    }\n  }\n  return LabCS;\n})();\n\nexport {\n  ColorSpace,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  AnnotationBorderStyleType, AnnotationFieldFlag, AnnotationFlag,\n  AnnotationType, getInheritableProperty, OPS, stringToBytes, stringToPDFString,\n  Util, warn\n} from '../shared/util';\nimport { Catalog, FileSpec, ObjectLoader } from './obj';\nimport { Dict, isDict, isName, isRef, isStream } from './primitives';\nimport { ColorSpace } from './colorspace';\nimport { OperatorList } from './operator_list';\nimport { Stream } from './stream';\n\nclass AnnotationFactory {\n  /**\n   * Create an `Annotation` object of the correct type for the given reference\n   * to an annotation dictionary. This yields a promise that is resolved when\n   * the `Annotation` object is constructed.\n   *\n   * @param {XRef} xref\n   * @param {Object} ref\n   * @param {PDFManager} pdfManager\n   * @param {Object} idFactory\n   * @return {Promise} A promise that is resolved with an {Annotation} instance.\n   */\n  static create(xref, ref, pdfManager, idFactory) {\n    return pdfManager.ensure(this, '_create',\n                             [xref, ref, pdfManager, idFactory]);\n  }\n\n  /**\n   * @private\n   */\n  static _create(xref, ref, pdfManager, idFactory) {\n    let dict = xref.fetchIfRef(ref);\n    if (!isDict(dict)) {\n      return;\n    }\n    let id = isRef(ref) ? ref.toString() : 'annot_' + idFactory.createObjId();\n\n    // Determine the annotation's subtype.\n    let subtype = dict.get('Subtype');\n    subtype = isName(subtype) ? subtype.name : null;\n\n    // Return the right annotation object based on the subtype and field type.\n    let parameters = {\n      xref,\n      dict,\n      ref: isRef(ref) ? ref : null,\n      subtype,\n      id,\n      pdfManager,\n    };\n\n    switch (subtype) {\n      case 'Link':\n        return new LinkAnnotation(parameters);\n\n      case 'Text':\n        return new TextAnnotation(parameters);\n\n      case 'Widget':\n        let fieldType = getInheritableProperty({ dict, key: 'FT', });\n        fieldType = isName(fieldType) ? fieldType.name : null;\n\n        switch (fieldType) {\n          case 'Tx':\n            return new TextWidgetAnnotation(parameters);\n          case 'Btn':\n            return new ButtonWidgetAnnotation(parameters);\n          case 'Ch':\n            return new ChoiceWidgetAnnotation(parameters);\n        }\n        warn('Unimplemented widget field type \"' + fieldType + '\", ' +\n             'falling back to base field type.');\n        return new WidgetAnnotation(parameters);\n\n      case 'Popup':\n        return new PopupAnnotation(parameters);\n\n      case 'Line':\n        return new LineAnnotation(parameters);\n\n      case 'Square':\n        return new SquareAnnotation(parameters);\n\n      case 'Circle':\n        return new CircleAnnotation(parameters);\n\n      case 'PolyLine':\n        return new PolylineAnnotation(parameters);\n\n      case 'Polygon':\n        return new PolygonAnnotation(parameters);\n\n      case 'Ink':\n        return new InkAnnotation(parameters);\n\n      case 'Highlight':\n        return new HighlightAnnotation(parameters);\n\n      case 'Underline':\n        return new UnderlineAnnotation(parameters);\n\n      case 'Squiggly':\n        return new SquigglyAnnotation(parameters);\n\n      case 'StrikeOut':\n        return new StrikeOutAnnotation(parameters);\n\n      case 'Stamp':\n        return new StampAnnotation(parameters);\n\n      case 'FileAttachment':\n        return new FileAttachmentAnnotation(parameters);\n\n      default:\n        if (!subtype) {\n          warn('Annotation is missing the required /Subtype.');\n        } else {\n          warn('Unimplemented annotation type \"' + subtype + '\", ' +\n               'falling back to base annotation.');\n        }\n        return new Annotation(parameters);\n    }\n  }\n}\n\nfunction getTransformMatrix(rect, bbox, matrix) {\n  // 12.5.5: Algorithm: Appearance streams\n  let bounds = Util.getAxialAlignedBoundingBox(bbox, matrix);\n  let minX = bounds[0];\n  let minY = bounds[1];\n  let maxX = bounds[2];\n  let maxY = bounds[3];\n\n  if (minX === maxX || minY === maxY) {\n    // From real-life file, bbox was [0, 0, 0, 0]. In this case,\n    // just apply the transform for rect\n    return [1, 0, 0, 1, rect[0], rect[1]];\n  }\n\n  let xRatio = (rect[2] - rect[0]) / (maxX - minX);\n  let yRatio = (rect[3] - rect[1]) / (maxY - minY);\n  return [\n    xRatio,\n    0,\n    0,\n    yRatio,\n    rect[0] - minX * xRatio,\n    rect[1] - minY * yRatio\n  ];\n}\n\nclass Annotation {\n  constructor(params) {\n    let dict = params.dict;\n\n    this.setFlags(dict.get('F'));\n    this.setRectangle(dict.getArray('Rect'));\n    this.setColor(dict.getArray('C'));\n    this.setBorderStyle(dict);\n    this.setAppearance(dict);\n\n    // Expose public properties using a data object.\n    this.data = {\n      annotationFlags: this.flags,\n      borderStyle: this.borderStyle,\n      color: this.color,\n      hasAppearance: !!this.appearance,\n      id: params.id,\n      rect: this.rectangle,\n      subtype: params.subtype,\n    };\n  }\n\n  /**\n   * @private\n   */\n  _hasFlag(flags, flag) {\n    return !!(flags & flag);\n  }\n\n  /**\n   * @private\n   */\n  _isViewable(flags) {\n    return !this._hasFlag(flags, AnnotationFlag.INVISIBLE) &&\n           !this._hasFlag(flags, AnnotationFlag.HIDDEN) &&\n           !this._hasFlag(flags, AnnotationFlag.NOVIEW);\n  }\n\n  /**\n   * @private\n   */\n  _isPrintable(flags) {\n    return this._hasFlag(flags, AnnotationFlag.PRINT) &&\n           !this._hasFlag(flags, AnnotationFlag.INVISIBLE) &&\n           !this._hasFlag(flags, AnnotationFlag.HIDDEN);\n  }\n\n  /**\n   * @return {boolean}\n   */\n  get viewable() {\n    if (this.flags === 0) {\n      return true;\n    }\n    return this._isViewable(this.flags);\n  }\n\n  /**\n   * @return {boolean}\n   */\n  get printable() {\n    if (this.flags === 0) {\n      return false;\n    }\n    return this._isPrintable(this.flags);\n  }\n\n  /**\n   * Set the flags.\n   *\n   * @public\n   * @memberof Annotation\n   * @param {number} flags - Unsigned 32-bit integer specifying annotation\n   *                         characteristics\n   * @see {@link shared/util.js}\n   */\n  setFlags(flags) {\n    this.flags = (Number.isInteger(flags) && flags > 0) ? flags : 0;\n  }\n\n  /**\n   * Check if a provided flag is set.\n   *\n   * @public\n   * @memberof Annotation\n   * @param {number} flag - Hexadecimal representation for an annotation\n   *                        characteristic\n   * @return {boolean}\n   * @see {@link shared/util.js}\n   */\n  hasFlag(flag) {\n    return this._hasFlag(this.flags, flag);\n  }\n\n  /**\n   * Set the rectangle.\n   *\n   * @public\n   * @memberof Annotation\n   * @param {Array} rectangle - The rectangle array with exactly four entries\n   */\n  setRectangle(rectangle) {\n    if (Array.isArray(rectangle) && rectangle.length === 4) {\n      this.rectangle = Util.normalizeRect(rectangle);\n    } else {\n      this.rectangle = [0, 0, 0, 0];\n    }\n  }\n\n  /**\n   * Set the color and take care of color space conversion.\n   * The default value is black, in RGB color space.\n   *\n   * @public\n   * @memberof Annotation\n   * @param {Array} color - The color array containing either 0\n   *                        (transparent), 1 (grayscale), 3 (RGB) or\n   *                        4 (CMYK) elements\n   */\n  setColor(color) {\n    let rgbColor = new Uint8ClampedArray(3);\n    if (!Array.isArray(color)) {\n      this.color = rgbColor;\n      return;\n    }\n\n    switch (color.length) {\n      case 0: // Transparent, which we indicate with a null value\n        this.color = null;\n        break;\n\n      case 1: // Convert grayscale to RGB\n        ColorSpace.singletons.gray.getRgbItem(color, 0, rgbColor, 0);\n        this.color = rgbColor;\n        break;\n\n      case 3: // Convert RGB percentages to RGB\n        ColorSpace.singletons.rgb.getRgbItem(color, 0, rgbColor, 0);\n        this.color = rgbColor;\n        break;\n\n      case 4: // Convert CMYK to RGB\n        ColorSpace.singletons.cmyk.getRgbItem(color, 0, rgbColor, 0);\n        this.color = rgbColor;\n        break;\n\n      default:\n        this.color = rgbColor;\n        break;\n    }\n  }\n\n  /**\n   * Set the border style (as AnnotationBorderStyle object).\n   *\n   * @public\n   * @memberof Annotation\n   * @param {Dict} borderStyle - The border style dictionary\n   */\n  setBorderStyle(borderStyle) {\n    this.borderStyle = new AnnotationBorderStyle();\n    if (!isDict(borderStyle)) {\n      return;\n    }\n    if (borderStyle.has('BS')) {\n      let dict = borderStyle.get('BS');\n      let dictType = dict.get('Type');\n\n      if (!dictType || isName(dictType, 'Border')) {\n        this.borderStyle.setWidth(dict.get('W'));\n        this.borderStyle.setStyle(dict.get('S'));\n        this.borderStyle.setDashArray(dict.getArray('D'));\n      }\n    } else if (borderStyle.has('Border')) {\n      let array = borderStyle.getArray('Border');\n      if (Array.isArray(array) && array.length >= 3) {\n        this.borderStyle.setHorizontalCornerRadius(array[0]);\n        this.borderStyle.setVerticalCornerRadius(array[1]);\n        this.borderStyle.setWidth(array[2]);\n\n        if (array.length === 4) { // Dash array available\n          this.borderStyle.setDashArray(array[3]);\n        }\n      }\n    } else {\n      // There are no border entries in the dictionary. According to the\n      // specification, we should draw a solid border of width 1 in that\n      // case, but Adobe Reader did not implement that part of the\n      // specification and instead draws no border at all, so we do the same.\n      // See also https://github.com/mozilla/pdf.js/issues/6179.\n      this.borderStyle.setWidth(0);\n    }\n  }\n\n  /**\n   * Set the (normal) appearance.\n   *\n   * @public\n   * @memberof Annotation\n   * @param {Dict} dict - The annotation's data dictionary\n   */\n  setAppearance(dict) {\n    this.appearance = null;\n\n    let appearanceStates = dict.get('AP');\n    if (!isDict(appearanceStates)) {\n      return;\n    }\n\n    // In case the normal appearance is a stream, then it is used directly.\n    let normalAppearanceState = appearanceStates.get('N');\n    if (isStream(normalAppearanceState)) {\n      this.appearance = normalAppearanceState;\n      return;\n    }\n    if (!isDict(normalAppearanceState)) {\n      return;\n    }\n\n    // In case the normal appearance is a dictionary, the `AS` entry provides\n    // the key of the stream in this dictionary.\n    let as = dict.get('AS');\n    if (!isName(as) || !normalAppearanceState.has(as.name)) {\n      return;\n    }\n    this.appearance = normalAppearanceState.get(as.name);\n  }\n\n  /**\n   * Prepare the annotation for working with a popup in the display layer.\n   *\n   * @private\n   * @memberof Annotation\n   * @param {Dict} dict - The annotation's data dictionary\n   */\n  _preparePopup(dict) {\n    if (!dict.has('C')) {\n      // Fall back to the default background color.\n      this.data.color = null;\n    }\n\n    this.data.hasPopup = dict.has('Popup');\n    this.data.title = stringToPDFString(dict.get('T') || '');\n    this.data.contents = stringToPDFString(dict.get('Contents') || '');\n  }\n\n  loadResources(keys) {\n    return this.appearance.dict.getAsync('Resources').then((resources) => {\n      if (!resources) {\n        return;\n      }\n      let objectLoader = new ObjectLoader(resources, keys, resources.xref);\n\n      return objectLoader.load().then(function() {\n        return resources;\n      });\n    });\n  }\n\n  getOperatorList(evaluator, task, renderForms) {\n    if (!this.appearance) {\n      return Promise.resolve(new OperatorList());\n    }\n\n    let data = this.data;\n    let appearanceDict = this.appearance.dict;\n    let resourcesPromise = this.loadResources([\n      'ExtGState',\n      'ColorSpace',\n      'Pattern',\n      'Shading',\n      'XObject',\n      'Font',\n      // ProcSet\n      // Properties\n    ]);\n    let bbox = appearanceDict.getArray('BBox') || [0, 0, 1, 1];\n    let matrix = appearanceDict.getArray('Matrix') || [1, 0, 0, 1, 0, 0];\n    let transform = getTransformMatrix(data.rect, bbox, matrix);\n\n    return resourcesPromise.then((resources) => {\n      let opList = new OperatorList();\n      opList.addOp(OPS.beginAnnotation, [data.rect, transform, matrix]);\n      return evaluator.getOperatorList({\n        stream: this.appearance,\n        task,\n        resources,\n        operatorList: opList,\n      }).then(() => {\n        opList.addOp(OPS.endAnnotation, []);\n        this.appearance.reset();\n        return opList;\n      });\n    });\n  }\n}\n\n/**\n * Contains all data regarding an annotation's border style.\n */\nclass AnnotationBorderStyle {\n  constructor() {\n    this.width = 1;\n    this.style = AnnotationBorderStyleType.SOLID;\n    this.dashArray = [3];\n    this.horizontalCornerRadius = 0;\n    this.verticalCornerRadius = 0;\n  }\n\n  /**\n   * Set the width.\n   *\n   * @public\n   * @memberof AnnotationBorderStyle\n   * @param {integer} width - The width\n   */\n  setWidth(width) {\n    if (Number.isInteger(width)) {\n      this.width = width;\n    }\n  }\n\n  /**\n   * Set the style.\n   *\n   * @public\n   * @memberof AnnotationBorderStyle\n   * @param {Object} style - The style object\n   * @see {@link shared/util.js}\n   */\n  setStyle(style) {\n    if (!style) {\n      return;\n    }\n    switch (style.name) {\n      case 'S':\n        this.style = AnnotationBorderStyleType.SOLID;\n        break;\n\n      case 'D':\n        this.style = AnnotationBorderStyleType.DASHED;\n        break;\n\n      case 'B':\n        this.style = AnnotationBorderStyleType.BEVELED;\n        break;\n\n      case 'I':\n        this.style = AnnotationBorderStyleType.INSET;\n        break;\n\n      case 'U':\n        this.style = AnnotationBorderStyleType.UNDERLINE;\n        break;\n\n      default:\n        break;\n    }\n  }\n\n  /**\n   * Set the dash array.\n   *\n   * @public\n   * @memberof AnnotationBorderStyle\n   * @param {Array} dashArray - The dash array with at least one element\n   */\n  setDashArray(dashArray) {\n    // We validate the dash array, but we do not use it because CSS does not\n    // allow us to change spacing of dashes. For more information, visit\n    // http://www.w3.org/TR/css3-background/#the-border-style.\n    if (Array.isArray(dashArray) && dashArray.length > 0) {\n      // According to the PDF specification: the elements in `dashArray`\n      // shall be numbers that are nonnegative and not all equal to zero.\n      let isValid = true;\n      let allZeros = true;\n      for (let i = 0, len = dashArray.length; i < len; i++) {\n        let element = dashArray[i];\n        let validNumber = (+element >= 0);\n        if (!validNumber) {\n          isValid = false;\n          break;\n        } else if (element > 0) {\n          allZeros = false;\n        }\n      }\n      if (isValid && !allZeros) {\n        this.dashArray = dashArray;\n      } else {\n        this.width = 0; // Adobe behavior when the array is invalid.\n      }\n    } else if (dashArray) {\n      this.width = 0; // Adobe behavior when the array is invalid.\n    }\n  }\n\n  /**\n   * Set the horizontal corner radius (from a Border dictionary).\n   *\n   * @public\n   * @memberof AnnotationBorderStyle\n   * @param {integer} radius - The horizontal corner radius\n   */\n  setHorizontalCornerRadius(radius) {\n    if (Number.isInteger(radius)) {\n      this.horizontalCornerRadius = radius;\n    }\n  }\n\n  /**\n   * Set the vertical corner radius (from a Border dictionary).\n   *\n   * @public\n   * @memberof AnnotationBorderStyle\n   * @param {integer} radius - The vertical corner radius\n   */\n  setVerticalCornerRadius(radius) {\n    if (Number.isInteger(radius)) {\n      this.verticalCornerRadius = radius;\n    }\n  }\n}\n\nclass WidgetAnnotation extends Annotation {\n  constructor(params) {\n    super(params);\n\n    let dict = params.dict;\n    let data = this.data;\n\n    data.annotationType = AnnotationType.WIDGET;\n    data.fieldName = this._constructFieldName(dict);\n    data.fieldValue = getInheritableProperty({ dict, key: 'V',\n                                               getArray: true, });\n    data.alternativeText = stringToPDFString(dict.get('TU') || '');\n    data.defaultAppearance = getInheritableProperty({ dict, key: 'DA', }) || '';\n    let fieldType = getInheritableProperty({ dict, key: 'FT', });\n    data.fieldType = isName(fieldType) ? fieldType.name : null;\n    this.fieldResources = getInheritableProperty({ dict, key: 'DR', }) ||\n                          Dict.empty;\n\n    data.fieldFlags = getInheritableProperty({ dict, key: 'Ff', });\n    if (!Number.isInteger(data.fieldFlags) || data.fieldFlags < 0) {\n      data.fieldFlags = 0;\n    }\n\n    data.readOnly = this.hasFieldFlag(AnnotationFieldFlag.READONLY);\n\n    // Hide signatures because we cannot validate them.\n    if (data.fieldType === 'Sig') {\n      this.setFlags(AnnotationFlag.HIDDEN);\n    }\n  }\n\n  /**\n   * Construct the (fully qualified) field name from the (partial) field\n   * names of the field and its ancestors.\n   *\n   * @private\n   * @memberof WidgetAnnotation\n   * @param {Dict} dict - Complete widget annotation dictionary\n   * @return {string}\n   */\n  _constructFieldName(dict) {\n    // Both the `Parent` and `T` fields are optional. While at least one of\n    // them should be provided, bad PDF generators may fail to do so.\n    if (!dict.has('T') && !dict.has('Parent')) {\n      warn('Unknown field name, falling back to empty field name.');\n      return '';\n    }\n\n    // If no parent exists, the partial and fully qualified names are equal.\n    if (!dict.has('Parent')) {\n      return stringToPDFString(dict.get('T'));\n    }\n\n    // Form the fully qualified field name by appending the partial name to\n    // the parent's fully qualified name, separated by a period.\n    let fieldName = [];\n    if (dict.has('T')) {\n      fieldName.unshift(stringToPDFString(dict.get('T')));\n    }\n\n    let loopDict = dict;\n    while (loopDict.has('Parent')) {\n      loopDict = loopDict.get('Parent');\n      if (!isDict(loopDict)) {\n        // Even though it is not allowed according to the PDF specification,\n        // bad PDF generators may provide a `Parent` entry that is not a\n        // dictionary, but `null` for example (issue 8143).\n        break;\n      }\n\n      if (loopDict.has('T')) {\n        fieldName.unshift(stringToPDFString(loopDict.get('T')));\n      }\n    }\n    return fieldName.join('.');\n  }\n\n  /**\n   * Check if a provided field flag is set.\n   *\n   * @public\n   * @memberof WidgetAnnotation\n   * @param {number} flag - Hexadecimal representation for an annotation\n   *                        field characteristic\n   * @return {boolean}\n   * @see {@link shared/util.js}\n   */\n  hasFieldFlag(flag) {\n    return !!(this.data.fieldFlags & flag);\n  }\n\n  getOperatorList(evaluator, task, renderForms) {\n    // Do not render form elements on the canvas when interactive forms are\n    // enabled. The display layer is responsible for rendering them instead.\n    if (renderForms) {\n      return Promise.resolve(new OperatorList());\n    }\n    return super.getOperatorList(evaluator, task, renderForms);\n  }\n}\n\nclass TextWidgetAnnotation extends WidgetAnnotation {\n  constructor(params) {\n    super(params);\n\n    const dict = params.dict;\n\n    // The field value is always a string.\n    this.data.fieldValue = stringToPDFString(this.data.fieldValue || '');\n\n    // Determine the alignment of text in the field.\n    let alignment = getInheritableProperty({ dict, key: 'Q', });\n    if (!Number.isInteger(alignment) || alignment < 0 || alignment > 2) {\n      alignment = null;\n    }\n    this.data.textAlignment = alignment;\n\n    // Determine the maximum length of text in the field.\n    let maximumLength = getInheritableProperty({ dict, key: 'MaxLen', });\n    if (!Number.isInteger(maximumLength) || maximumLength < 0) {\n      maximumLength = null;\n    }\n    this.data.maxLen = maximumLength;\n\n    // Process field flags for the display layer.\n    this.data.multiLine = this.hasFieldFlag(AnnotationFieldFlag.MULTILINE);\n    this.data.comb = this.hasFieldFlag(AnnotationFieldFlag.COMB) &&\n                     !this.hasFieldFlag(AnnotationFieldFlag.MULTILINE) &&\n                     !this.hasFieldFlag(AnnotationFieldFlag.PASSWORD) &&\n                     !this.hasFieldFlag(AnnotationFieldFlag.FILESELECT) &&\n                     this.data.maxLen !== null;\n  }\n\n  getOperatorList(evaluator, task, renderForms) {\n    if (renderForms || this.appearance) {\n      return super.getOperatorList(evaluator, task, renderForms);\n    }\n\n    let operatorList = new OperatorList();\n\n    // Even if there is an appearance stream, ignore it. This is the\n    // behaviour used by Adobe Reader.\n    if (!this.data.defaultAppearance) {\n      return Promise.resolve(operatorList);\n    }\n\n    let stream = new Stream(stringToBytes(this.data.defaultAppearance));\n    return evaluator.getOperatorList({\n      stream,\n      task,\n      resources: this.fieldResources,\n      operatorList,\n    }).then(function () {\n      return operatorList;\n    });\n  }\n}\n\nclass ButtonWidgetAnnotation extends WidgetAnnotation {\n  constructor(params) {\n    super(params);\n\n    this.data.checkBox = !this.hasFieldFlag(AnnotationFieldFlag.RADIO) &&\n                         !this.hasFieldFlag(AnnotationFieldFlag.PUSHBUTTON);\n    this.data.radioButton = this.hasFieldFlag(AnnotationFieldFlag.RADIO) &&\n                            !this.hasFieldFlag(AnnotationFieldFlag.PUSHBUTTON);\n    this.data.pushButton = this.hasFieldFlag(AnnotationFieldFlag.PUSHBUTTON);\n\n    if (this.data.checkBox) {\n      this._processCheckBox(params);\n    } else if (this.data.radioButton) {\n      this._processRadioButton(params);\n    } else if (this.data.pushButton) {\n      this._processPushButton(params);\n    } else {\n      warn('Invalid field flags for button widget annotation');\n    }\n  }\n\n  _processCheckBox(params) {\n    if (isName(this.data.fieldValue)) {\n      this.data.fieldValue = this.data.fieldValue.name;\n    }\n\n    const customAppearance = params.dict.get('AP');\n    if (!isDict(customAppearance)) {\n      return;\n    }\n\n    const exportValueOptionsDict = customAppearance.get('D');\n    if (!isDict(exportValueOptionsDict)) {\n      return;\n    }\n\n    const exportValues = exportValueOptionsDict.getKeys();\n    const hasCorrectOptionCount = exportValues.length === 2;\n    if (!hasCorrectOptionCount) {\n      return;\n    }\n\n    this.data.exportValue = exportValues[0] === 'Off' ?\n      exportValues[1] : exportValues[0];\n  }\n\n  _processRadioButton(params) {\n    this.data.fieldValue = this.data.buttonValue = null;\n\n    // The parent field's `V` entry holds a `Name` object with the appearance\n    // state of whichever child field is currently in the \"on\" state.\n    let fieldParent = params.dict.get('Parent');\n    if (isDict(fieldParent) && fieldParent.has('V')) {\n      let fieldParentValue = fieldParent.get('V');\n      if (isName(fieldParentValue)) {\n        this.data.fieldValue = fieldParentValue.name;\n      }\n    }\n\n    // The button's value corresponds to its appearance state.\n    let appearanceStates = params.dict.get('AP');\n    if (!isDict(appearanceStates)) {\n      return;\n    }\n    let normalAppearanceState = appearanceStates.get('N');\n    if (!isDict(normalAppearanceState)) {\n      return;\n    }\n    let keys = normalAppearanceState.getKeys();\n    for (let i = 0, ii = keys.length; i < ii; i++) {\n      if (keys[i] !== 'Off') {\n        this.data.buttonValue = keys[i];\n        break;\n      }\n    }\n  }\n\n  _processPushButton(params) {\n    if (!params.dict.has('A')) {\n      warn('Push buttons without action dictionaries are not supported');\n      return;\n    }\n\n    Catalog.parseDestDictionary({\n      destDict: params.dict,\n      resultObj: this.data,\n      docBaseUrl: params.pdfManager.docBaseUrl,\n    });\n  }\n}\n\nclass ChoiceWidgetAnnotation extends WidgetAnnotation {\n  constructor(params) {\n    super(params);\n\n    // Determine the options. The options array may consist of strings or\n    // arrays. If the array consists of arrays, then the first element of\n    // each array is the export value and the second element of each array is\n    // the display value. If the array consists of strings, then these\n    // represent both the export and display value. In this case, we convert\n    // it to an array of arrays as well for convenience in the display layer.\n    // Note that the specification does not state that the `Opt` field is\n    // inheritable, but in practice PDF generators do make annotations\n    // inherit the options from a parent annotation (issue 8094).\n    this.data.options = [];\n\n    let options = getInheritableProperty({ dict: params.dict, key: 'Opt', });\n    if (Array.isArray(options)) {\n      let xref = params.xref;\n      for (let i = 0, ii = options.length; i < ii; i++) {\n        let option = xref.fetchIfRef(options[i]);\n        let isOptionArray = Array.isArray(option);\n\n        this.data.options[i] = {\n          exportValue: isOptionArray ? xref.fetchIfRef(option[0]) : option,\n          displayValue: stringToPDFString(isOptionArray ?\n                                          xref.fetchIfRef(option[1]) : option),\n        };\n      }\n    }\n\n    // Determine the field value. In this case, it may be a string or an\n    // array of strings. For convenience in the display layer, convert the\n    // string to an array of one string as well.\n    if (!Array.isArray(this.data.fieldValue)) {\n      this.data.fieldValue = [this.data.fieldValue];\n    }\n\n    // Process field flags for the display layer.\n    this.data.combo = this.hasFieldFlag(AnnotationFieldFlag.COMBO);\n    this.data.multiSelect = this.hasFieldFlag(AnnotationFieldFlag.MULTISELECT);\n  }\n}\n\nclass TextAnnotation extends Annotation {\n  constructor(parameters) {\n    const DEFAULT_ICON_SIZE = 22; // px\n\n    super(parameters);\n\n    this.data.annotationType = AnnotationType.TEXT;\n\n    if (this.data.hasAppearance) {\n      this.data.name = 'NoIcon';\n    } else {\n      this.data.rect[1] = this.data.rect[3] - DEFAULT_ICON_SIZE;\n      this.data.rect[2] = this.data.rect[0] + DEFAULT_ICON_SIZE;\n      this.data.name = parameters.dict.has('Name') ?\n                       parameters.dict.get('Name').name : 'Note';\n    }\n    this._preparePopup(parameters.dict);\n  }\n}\n\nclass LinkAnnotation extends Annotation {\n  constructor(params) {\n    super(params);\n\n    this.data.annotationType = AnnotationType.LINK;\n\n    Catalog.parseDestDictionary({\n      destDict: params.dict,\n      resultObj: this.data,\n      docBaseUrl: params.pdfManager.docBaseUrl,\n    });\n  }\n}\n\nclass PopupAnnotation extends Annotation {\n  constructor(parameters) {\n    super(parameters);\n\n    this.data.annotationType = AnnotationType.POPUP;\n\n    let dict = parameters.dict;\n    let parentItem = dict.get('Parent');\n    if (!parentItem) {\n      warn('Popup annotation has a missing or invalid parent annotation.');\n      return;\n    }\n\n    let parentSubtype = parentItem.get('Subtype');\n    this.data.parentType = isName(parentSubtype) ? parentSubtype.name : null;\n    this.data.parentId = dict.getRaw('Parent').toString();\n    this.data.title = stringToPDFString(parentItem.get('T') || '');\n    this.data.contents = stringToPDFString(parentItem.get('Contents') || '');\n\n    if (!parentItem.has('C')) {\n      // Fall back to the default background color.\n      this.data.color = null;\n    } else {\n      this.setColor(parentItem.getArray('C'));\n      this.data.color = this.color;\n    }\n\n    // If the Popup annotation is not viewable, but the parent annotation is,\n    // that is most likely a bug. Fallback to inherit the flags from the parent\n    // annotation (this is consistent with the behaviour in Adobe Reader).\n    if (!this.viewable) {\n      let parentFlags = parentItem.get('F');\n      if (this._isViewable(parentFlags)) {\n        this.setFlags(parentFlags);\n      }\n    }\n  }\n}\n\nclass LineAnnotation extends Annotation {\n  constructor(parameters) {\n    super(parameters);\n\n    this.data.annotationType = AnnotationType.LINE;\n\n    let dict = parameters.dict;\n    this.data.lineCoordinates = Util.normalizeRect(dict.getArray('L'));\n    this._preparePopup(dict);\n  }\n}\n\nclass SquareAnnotation extends Annotation {\n  constructor(parameters) {\n    super(parameters);\n\n    this.data.annotationType = AnnotationType.SQUARE;\n    this._preparePopup(parameters.dict);\n  }\n}\n\nclass CircleAnnotation extends Annotation {\n  constructor(parameters) {\n    super(parameters);\n\n    this.data.annotationType = AnnotationType.CIRCLE;\n    this._preparePopup(parameters.dict);\n  }\n}\n\nclass PolylineAnnotation extends Annotation {\n  constructor(parameters) {\n    super(parameters);\n\n    this.data.annotationType = AnnotationType.POLYLINE;\n\n    // The vertices array is an array of numbers representing the alternating\n    // horizontal and vertical coordinates, respectively, of each vertex.\n    // Convert this to an array of objects with x and y coordinates.\n    let dict = parameters.dict;\n    let rawVertices = dict.getArray('Vertices');\n\n    this.data.vertices = [];\n    for (let i = 0, ii = rawVertices.length; i < ii; i += 2) {\n      this.data.vertices.push({\n        x: rawVertices[i],\n        y: rawVertices[i + 1],\n      });\n    }\n\n    this._preparePopup(dict);\n  }\n}\n\nclass PolygonAnnotation extends PolylineAnnotation {\n  constructor(parameters) {\n    // Polygons are specific forms of polylines, so reuse their logic.\n    super(parameters);\n\n    this.data.annotationType = AnnotationType.POLYGON;\n  }\n}\n\nclass InkAnnotation extends Annotation {\n  constructor(parameters) {\n    super(parameters);\n\n    this.data.annotationType = AnnotationType.INK;\n\n    let dict = parameters.dict;\n    const xref = parameters.xref;\n\n    let originalInkLists = dict.getArray('InkList');\n    this.data.inkLists = [];\n    for (let i = 0, ii = originalInkLists.length; i < ii; ++i) {\n      // The raw ink lists array contains arrays of numbers representing\n      // the alternating horizontal and vertical coordinates, respectively,\n      // of each vertex. Convert this to an array of objects with x and y\n      // coordinates.\n      this.data.inkLists.push([]);\n      for (let j = 0, jj = originalInkLists[i].length; j < jj; j += 2) {\n        this.data.inkLists[i].push({\n          x: xref.fetchIfRef(originalInkLists[i][j]),\n          y: xref.fetchIfRef(originalInkLists[i][j + 1]),\n        });\n      }\n    }\n    this._preparePopup(dict);\n  }\n}\n\nclass HighlightAnnotation extends Annotation {\n  constructor(parameters) {\n    super(parameters);\n\n    this.data.annotationType = AnnotationType.HIGHLIGHT;\n    this._preparePopup(parameters.dict);\n  }\n}\n\nclass UnderlineAnnotation extends Annotation {\n  constructor(parameters) {\n    super(parameters);\n\n    this.data.annotationType = AnnotationType.UNDERLINE;\n    this._preparePopup(parameters.dict);\n  }\n}\n\nclass SquigglyAnnotation extends Annotation {\n  constructor(parameters) {\n    super(parameters);\n\n    this.data.annotationType = AnnotationType.SQUIGGLY;\n    this._preparePopup(parameters.dict);\n  }\n}\n\nclass StrikeOutAnnotation extends Annotation {\n  constructor(parameters) {\n    super(parameters);\n\n    this.data.annotationType = AnnotationType.STRIKEOUT;\n    this._preparePopup(parameters.dict);\n  }\n}\n\nclass StampAnnotation extends Annotation {\n  constructor(parameters) {\n    super(parameters);\n\n    this.data.annotationType = AnnotationType.STAMP;\n    this._preparePopup(parameters.dict);\n  }\n}\n\nclass FileAttachmentAnnotation extends Annotation {\n  constructor(parameters) {\n    super(parameters);\n\n    let file = new FileSpec(parameters.dict.get('FS'), parameters.xref);\n\n    this.data.annotationType = AnnotationType.FILEATTACHMENT;\n    this.data.file = file.serializable;\n    this._preparePopup(parameters.dict);\n  }\n}\n\nexport {\n  Annotation,\n  AnnotationBorderStyle,\n  AnnotationFactory,\n};\n","/* Copyright 2017 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert, ImageKind, OPS } from '../shared/util';\n\nvar QueueOptimizer = (function QueueOptimizerClosure() {\n  function addState(parentState, pattern, checkFn, iterateFn, processFn) {\n    var state = parentState;\n    for (var i = 0, ii = pattern.length - 1; i < ii; i++) {\n      var item = pattern[i];\n      state = (state[item] || (state[item] = []));\n    }\n    state[pattern[pattern.length - 1]] = {\n      checkFn,\n      iterateFn,\n      processFn,\n    };\n  }\n\n  function handlePaintSolidColorImageMask(iFirstSave, count, fnArray,\n                                          argsArray) {\n    // Handles special case of mainly LaTeX documents which use image masks to\n    // draw lines with the current fill style.\n    // 'count' groups of (save, transform, paintImageMaskXObject, restore)+\n    // have been found at iFirstSave.\n    var iFirstPIMXO = iFirstSave + 2;\n    for (var i = 0; i < count; i++) {\n      var arg = argsArray[iFirstPIMXO + 4 * i];\n      var imageMask = arg.length === 1 && arg[0];\n      if (imageMask && imageMask.width === 1 && imageMask.height === 1 &&\n          (!imageMask.data.length ||\n           (imageMask.data.length === 1 && imageMask.data[0] === 0))) {\n        fnArray[iFirstPIMXO + 4 * i] = OPS.paintSolidColorImageMask;\n        continue;\n      }\n      break;\n    }\n    return count - i;\n  }\n\n  var InitialState = [];\n\n  // This replaces (save, transform, paintInlineImageXObject, restore)+\n  // sequences with one |paintInlineImageXObjectGroup| operation.\n  addState(InitialState,\n    [OPS.save, OPS.transform, OPS.paintInlineImageXObject, OPS.restore],\n    null,\n    function iterateInlineImageGroup(context, i) {\n      var fnArray = context.fnArray;\n      var iFirstSave = context.iCurr - 3;\n      var pos = (i - iFirstSave) % 4;\n      switch (pos) {\n        case 0:\n          return fnArray[i] === OPS.save;\n        case 1:\n          return fnArray[i] === OPS.transform;\n        case 2:\n          return fnArray[i] === OPS.paintInlineImageXObject;\n        case 3:\n          return fnArray[i] === OPS.restore;\n      }\n    },\n    function foundInlineImageGroup(context, i) {\n      var MIN_IMAGES_IN_INLINE_IMAGES_BLOCK = 10;\n      var MAX_IMAGES_IN_INLINE_IMAGES_BLOCK = 200;\n      var MAX_WIDTH = 1000;\n      var IMAGE_PADDING = 1;\n\n      var fnArray = context.fnArray, argsArray = context.argsArray;\n      var curr = context.iCurr;\n      var iFirstSave = curr - 3;\n      var iFirstTransform = curr - 2;\n      var iFirstPIIXO = curr - 1;\n\n      var count = Math.min(Math.floor((i - iFirstSave) / 4),\n                           MAX_IMAGES_IN_INLINE_IMAGES_BLOCK);\n      if (count < MIN_IMAGES_IN_INLINE_IMAGES_BLOCK) {\n        return i - (i - iFirstSave) % 4;\n      }\n\n      // assuming that heights of those image is too small (~1 pixel)\n      // packing as much as possible by lines\n      var maxX = 0;\n      var map = [], maxLineHeight = 0;\n      var currentX = IMAGE_PADDING, currentY = IMAGE_PADDING;\n      var q;\n      for (q = 0; q < count; q++) {\n        var transform = argsArray[iFirstTransform + (q << 2)];\n        var img = argsArray[iFirstPIIXO + (q << 2)][0];\n        if (currentX + img.width > MAX_WIDTH) {\n          // starting new line\n          maxX = Math.max(maxX, currentX);\n          currentY += maxLineHeight + 2 * IMAGE_PADDING;\n          currentX = 0;\n          maxLineHeight = 0;\n        }\n        map.push({\n          transform,\n          x: currentX, y: currentY,\n          w: img.width, h: img.height,\n        });\n        currentX += img.width + 2 * IMAGE_PADDING;\n        maxLineHeight = Math.max(maxLineHeight, img.height);\n      }\n      var imgWidth = Math.max(maxX, currentX) + IMAGE_PADDING;\n      var imgHeight = currentY + maxLineHeight + IMAGE_PADDING;\n      var imgData = new Uint8ClampedArray(imgWidth * imgHeight * 4);\n      var imgRowSize = imgWidth << 2;\n      for (q = 0; q < count; q++) {\n        var data = argsArray[iFirstPIIXO + (q << 2)][0].data;\n        // Copy image by lines and extends pixels into padding.\n        var rowSize = map[q].w << 2;\n        var dataOffset = 0;\n        var offset = (map[q].x + map[q].y * imgWidth) << 2;\n        imgData.set(data.subarray(0, rowSize), offset - imgRowSize);\n        for (var k = 0, kk = map[q].h; k < kk; k++) {\n          imgData.set(data.subarray(dataOffset, dataOffset + rowSize), offset);\n          dataOffset += rowSize;\n          offset += imgRowSize;\n        }\n        imgData.set(data.subarray(dataOffset - rowSize, dataOffset), offset);\n        while (offset >= 0) {\n          data[offset - 4] = data[offset];\n          data[offset - 3] = data[offset + 1];\n          data[offset - 2] = data[offset + 2];\n          data[offset - 1] = data[offset + 3];\n          data[offset + rowSize] = data[offset + rowSize - 4];\n          data[offset + rowSize + 1] = data[offset + rowSize - 3];\n          data[offset + rowSize + 2] = data[offset + rowSize - 2];\n          data[offset + rowSize + 3] = data[offset + rowSize - 1];\n          offset -= imgRowSize;\n        }\n      }\n\n      // Replace queue items.\n      fnArray.splice(iFirstSave, count * 4, OPS.paintInlineImageXObjectGroup);\n      argsArray.splice(iFirstSave, count * 4,\n        [{ width: imgWidth, height: imgHeight, kind: ImageKind.RGBA_32BPP,\n           data: imgData, }, map]);\n\n      return iFirstSave + 1;\n    });\n\n  // This replaces (save, transform, paintImageMaskXObject, restore)+\n  // sequences with one |paintImageMaskXObjectGroup| or one\n  // |paintImageMaskXObjectRepeat| operation.\n  addState(InitialState,\n    [OPS.save, OPS.transform, OPS.paintImageMaskXObject, OPS.restore],\n    null,\n    function iterateImageMaskGroup(context, i) {\n      var fnArray = context.fnArray;\n      var iFirstSave = context.iCurr - 3;\n      var pos = (i - iFirstSave) % 4;\n      switch (pos) {\n        case 0:\n          return fnArray[i] === OPS.save;\n        case 1:\n          return fnArray[i] === OPS.transform;\n        case 2:\n          return fnArray[i] === OPS.paintImageMaskXObject;\n        case 3:\n          return fnArray[i] === OPS.restore;\n      }\n    },\n    function foundImageMaskGroup(context, i) {\n      var MIN_IMAGES_IN_MASKS_BLOCK = 10;\n      var MAX_IMAGES_IN_MASKS_BLOCK = 100;\n      var MAX_SAME_IMAGES_IN_MASKS_BLOCK = 1000;\n\n      var fnArray = context.fnArray, argsArray = context.argsArray;\n      var curr = context.iCurr;\n      var iFirstSave = curr - 3;\n      var iFirstTransform = curr - 2;\n      var iFirstPIMXO = curr - 1;\n\n      // At this point, i is the index of the first op past the last valid\n      // quartet.\n      var count = Math.floor((i - iFirstSave) / 4);\n      count = handlePaintSolidColorImageMask(iFirstSave, count, fnArray,\n                                             argsArray);\n      if (count < MIN_IMAGES_IN_MASKS_BLOCK) {\n        return i - (i - iFirstSave) % 4;\n      }\n\n      var q;\n      var isSameImage = false;\n      var iTransform, transformArgs;\n      var firstPIMXOArg0 = argsArray[iFirstPIMXO][0];\n      if (argsArray[iFirstTransform][1] === 0 &&\n          argsArray[iFirstTransform][2] === 0) {\n        isSameImage = true;\n        var firstTransformArg0 = argsArray[iFirstTransform][0];\n        var firstTransformArg3 = argsArray[iFirstTransform][3];\n        iTransform = iFirstTransform + 4;\n        var iPIMXO = iFirstPIMXO + 4;\n        for (q = 1; q < count; q++, iTransform += 4, iPIMXO += 4) {\n          transformArgs = argsArray[iTransform];\n          if (argsArray[iPIMXO][0] !== firstPIMXOArg0 ||\n              transformArgs[0] !== firstTransformArg0 ||\n              transformArgs[1] !== 0 ||\n              transformArgs[2] !== 0 ||\n              transformArgs[3] !== firstTransformArg3) {\n            if (q < MIN_IMAGES_IN_MASKS_BLOCK) {\n              isSameImage = false;\n            } else {\n              count = q;\n            }\n            break; // different image or transform\n          }\n        }\n      }\n\n      if (isSameImage) {\n        count = Math.min(count, MAX_SAME_IMAGES_IN_MASKS_BLOCK);\n        var positions = new Float32Array(count * 2);\n        iTransform = iFirstTransform;\n        for (q = 0; q < count; q++, iTransform += 4) {\n          transformArgs = argsArray[iTransform];\n          positions[(q << 1)] = transformArgs[4];\n          positions[(q << 1) + 1] = transformArgs[5];\n        }\n\n        // Replace queue items.\n        fnArray.splice(iFirstSave, count * 4, OPS.paintImageMaskXObjectRepeat);\n        argsArray.splice(iFirstSave, count * 4,\n          [firstPIMXOArg0, firstTransformArg0, firstTransformArg3, positions]);\n      } else {\n        count = Math.min(count, MAX_IMAGES_IN_MASKS_BLOCK);\n        var images = [];\n        for (q = 0; q < count; q++) {\n          transformArgs = argsArray[iFirstTransform + (q << 2)];\n          var maskParams = argsArray[iFirstPIMXO + (q << 2)][0];\n          images.push({ data: maskParams.data, width: maskParams.width,\n                        height: maskParams.height,\n                        transform: transformArgs, });\n        }\n\n        // Replace queue items.\n        fnArray.splice(iFirstSave, count * 4, OPS.paintImageMaskXObjectGroup);\n        argsArray.splice(iFirstSave, count * 4, [images]);\n      }\n\n      return iFirstSave + 1;\n    });\n\n  // This replaces (save, transform, paintImageXObject, restore)+ sequences\n  // with one paintImageXObjectRepeat operation, if the |transform| and\n  // |paintImageXObjectRepeat| ops are appropriate.\n  addState(InitialState,\n    [OPS.save, OPS.transform, OPS.paintImageXObject, OPS.restore],\n    function (context) {\n      var argsArray = context.argsArray;\n      var iFirstTransform = context.iCurr - 2;\n      return argsArray[iFirstTransform][1] === 0 &&\n             argsArray[iFirstTransform][2] === 0;\n    },\n    function (context, i) {\n      var fnArray = context.fnArray, argsArray = context.argsArray;\n      var iFirstSave = context.iCurr - 3;\n      var pos = (i - iFirstSave) % 4;\n      switch (pos) {\n        case 0:\n          return fnArray[i] === OPS.save;\n        case 1:\n          if (fnArray[i] !== OPS.transform) {\n            return false;\n          }\n          var iFirstTransform = context.iCurr - 2;\n          var firstTransformArg0 = argsArray[iFirstTransform][0];\n          var firstTransformArg3 = argsArray[iFirstTransform][3];\n          if (argsArray[i][0] !== firstTransformArg0 ||\n              argsArray[i][1] !== 0 ||\n              argsArray[i][2] !== 0 ||\n              argsArray[i][3] !== firstTransformArg3) {\n            return false; // transforms don't match\n          }\n          return true;\n        case 2:\n          if (fnArray[i] !== OPS.paintImageXObject) {\n            return false;\n          }\n          var iFirstPIXO = context.iCurr - 1;\n          var firstPIXOArg0 = argsArray[iFirstPIXO][0];\n          if (argsArray[i][0] !== firstPIXOArg0) {\n            return false; // images don't match\n          }\n          return true;\n        case 3:\n          return fnArray[i] === OPS.restore;\n      }\n    },\n    function (context, i) {\n      var MIN_IMAGES_IN_BLOCK = 3;\n      var MAX_IMAGES_IN_BLOCK = 1000;\n\n      var fnArray = context.fnArray, argsArray = context.argsArray;\n      var curr = context.iCurr;\n      var iFirstSave = curr - 3;\n      var iFirstTransform = curr - 2;\n      var iFirstPIXO = curr - 1;\n      var firstPIXOArg0 = argsArray[iFirstPIXO][0];\n      var firstTransformArg0 = argsArray[iFirstTransform][0];\n      var firstTransformArg3 = argsArray[iFirstTransform][3];\n\n      // At this point, i is the index of the first op past the last valid\n      // quartet.\n      var count = Math.min(Math.floor((i - iFirstSave) / 4),\n                           MAX_IMAGES_IN_BLOCK);\n      if (count < MIN_IMAGES_IN_BLOCK) {\n        return i - (i - iFirstSave) % 4;\n      }\n\n      // Extract the (x,y) positions from all of the matching transforms.\n      var positions = new Float32Array(count * 2);\n      var iTransform = iFirstTransform;\n      for (var q = 0; q < count; q++, iTransform += 4) {\n        var transformArgs = argsArray[iTransform];\n        positions[(q << 1)] = transformArgs[4];\n        positions[(q << 1) + 1] = transformArgs[5];\n      }\n\n      // Replace queue items.\n      var args = [firstPIXOArg0, firstTransformArg0, firstTransformArg3,\n                  positions];\n      fnArray.splice(iFirstSave, count * 4, OPS.paintImageXObjectRepeat);\n      argsArray.splice(iFirstSave, count * 4, args);\n\n      return iFirstSave + 1;\n    });\n\n  // This replaces (beginText, setFont, setTextMatrix, showText, endText)+\n  // sequences with (beginText, setFont, (setTextMatrix, showText)+, endText)+\n  // sequences, if the font for each one is the same.\n  addState(InitialState,\n    [OPS.beginText, OPS.setFont, OPS.setTextMatrix, OPS.showText, OPS.endText],\n    null,\n    function (context, i) {\n      var fnArray = context.fnArray, argsArray = context.argsArray;\n      var iFirstSave = context.iCurr - 4;\n      var pos = (i - iFirstSave) % 5;\n      switch (pos) {\n        case 0:\n          return fnArray[i] === OPS.beginText;\n        case 1:\n          return fnArray[i] === OPS.setFont;\n        case 2:\n          return fnArray[i] === OPS.setTextMatrix;\n        case 3:\n          if (fnArray[i] !== OPS.showText) {\n            return false;\n          }\n          var iFirstSetFont = context.iCurr - 3;\n          var firstSetFontArg0 = argsArray[iFirstSetFont][0];\n          var firstSetFontArg1 = argsArray[iFirstSetFont][1];\n          if (argsArray[i][0] !== firstSetFontArg0 ||\n              argsArray[i][1] !== firstSetFontArg1) {\n            return false; // fonts don't match\n          }\n          return true;\n        case 4:\n          return fnArray[i] === OPS.endText;\n      }\n    },\n    function (context, i) {\n      var MIN_CHARS_IN_BLOCK = 3;\n      var MAX_CHARS_IN_BLOCK = 1000;\n\n      var fnArray = context.fnArray, argsArray = context.argsArray;\n      var curr = context.iCurr;\n      var iFirstBeginText = curr - 4;\n      var iFirstSetFont = curr - 3;\n      var iFirstSetTextMatrix = curr - 2;\n      var iFirstShowText = curr - 1;\n      var iFirstEndText = curr;\n      var firstSetFontArg0 = argsArray[iFirstSetFont][0];\n      var firstSetFontArg1 = argsArray[iFirstSetFont][1];\n\n      // At this point, i is the index of the first op past the last valid\n      // quintet.\n      var count = Math.min(Math.floor((i - iFirstBeginText) / 5),\n                           MAX_CHARS_IN_BLOCK);\n      if (count < MIN_CHARS_IN_BLOCK) {\n        return i - (i - iFirstBeginText) % 5;\n      }\n\n      // If the preceding quintet is (<something>, setFont, setTextMatrix,\n      // showText, endText), include that as well. (E.g. <something> might be\n      // |dependency|.)\n      var iFirst = iFirstBeginText;\n      if (iFirstBeginText >= 4 &&\n          fnArray[iFirstBeginText - 4] === fnArray[iFirstSetFont] &&\n          fnArray[iFirstBeginText - 3] === fnArray[iFirstSetTextMatrix] &&\n          fnArray[iFirstBeginText - 2] === fnArray[iFirstShowText] &&\n          fnArray[iFirstBeginText - 1] === fnArray[iFirstEndText] &&\n          argsArray[iFirstBeginText - 4][0] === firstSetFontArg0 &&\n          argsArray[iFirstBeginText - 4][1] === firstSetFontArg1) {\n        count++;\n        iFirst -= 5;\n      }\n\n      // Remove (endText, beginText, setFont) trios.\n      var iEndText = iFirst + 4;\n      for (var q = 1; q < count; q++) {\n        fnArray.splice(iEndText, 3);\n        argsArray.splice(iEndText, 3);\n        iEndText += 2;\n      }\n\n      return iEndText + 1;\n    });\n\n  function QueueOptimizer(queue) {\n    this.queue = queue;\n    this.state = null;\n    this.context = {\n      iCurr: 0,\n      fnArray: queue.fnArray,\n      argsArray: queue.argsArray,\n    };\n    this.match = null;\n    this.lastProcessed = 0;\n  }\n\n  QueueOptimizer.prototype = {\n    _optimize() {\n      // Process new fnArray item(s) chunk.\n      const fnArray = this.queue.fnArray;\n      let i = this.lastProcessed, ii = fnArray.length;\n      let state = this.state;\n      let match = this.match;\n      if (!state && !match && (i + 1 === ii) && !InitialState[fnArray[i]]) {\n        // Micro-optimization for the common case: last item is not\n        // optimizable, just skipping it.\n        this.lastProcessed = ii;\n        return;\n      }\n\n      const context = this.context;\n      while (i < ii) {\n        if (match) {\n          // Already find a block of potentially optimizable items, iterating...\n          const iterate = (0, match.iterateFn)(context, i);\n          if (iterate) {\n            i++;\n            continue;\n          }\n          // Found last items for the block, processing...\n          i = (0, match.processFn)(context, i + 1);\n          ii = fnArray.length;\n          match = null;\n          state = null;\n          if (i >= ii) {\n            break;\n          }\n        }\n        // Find the potentially optimizable items.\n        state = (state || InitialState)[fnArray[i]];\n        if (!state || Array.isArray(state)) {\n          i++;\n          continue;\n        }\n        // Found a start of the block based on addState rules.\n        context.iCurr = i;\n        i++;\n        if (state.checkFn && !(0, state.checkFn)(context)) {\n          // Check failed, continue search...\n          state = null;\n          continue;\n        }\n        match = state;\n        state = null;\n      }\n      this.state = state;\n      this.match = match;\n      this.lastProcessed = i;\n    },\n\n    push(fn, args) {\n      this.queue.fnArray.push(fn);\n      this.queue.argsArray.push(args);\n      this._optimize();\n    },\n\n    flush() {\n      while (this.match) {\n        const length = this.queue.fnArray.length;\n        this.lastProcessed = (0, this.match.processFn)(this.context, length);\n        this.match = null;\n        this.state = null;\n        // Repeat optimization until all chunks are exhausted.\n        this._optimize();\n      }\n    },\n\n    reset() {\n      this.state = null;\n      this.match = null;\n      this.lastProcessed = 0;\n    },\n  };\n  return QueueOptimizer;\n})();\n\nvar NullOptimizer = (function NullOptimizerClosure() {\n  function NullOptimizer(queue) {\n    this.queue = queue;\n  }\n\n  NullOptimizer.prototype = {\n    push(fn, args) {\n      this.queue.fnArray.push(fn);\n      this.queue.argsArray.push(args);\n    },\n\n    flush() { },\n  };\n\n  return NullOptimizer;\n})();\n\nvar OperatorList = (function OperatorListClosure() {\n  var CHUNK_SIZE = 1000;\n  var CHUNK_SIZE_ABOUT = CHUNK_SIZE - 5; // close to chunk size\n\n  function getTransfers(queue) {\n    var transfers = [];\n    var fnArray = queue.fnArray, argsArray = queue.argsArray;\n    for (var i = 0, ii = queue.length; i < ii; i++) {\n      switch (fnArray[i]) {\n        case OPS.paintInlineImageXObject:\n        case OPS.paintInlineImageXObjectGroup:\n        case OPS.paintImageMaskXObject:\n          var arg = argsArray[i][0]; // first param in imgData\n\n          if (typeof PDFJSDev === 'undefined' ||\n              PDFJSDev.test('!PRODUCTION || TESTING')) {\n            assert(arg.data instanceof Uint8ClampedArray,\n                   'OperatorList - getTransfers: Unsupported \"arg.data\" type.');\n          }\n          if (!arg.cached) {\n            transfers.push(arg.data.buffer);\n          }\n          break;\n      }\n    }\n    return transfers;\n  }\n\n  function OperatorList(intent, messageHandler, pageIndex) {\n    this.messageHandler = messageHandler;\n    this.fnArray = [];\n    this.argsArray = [];\n    if (messageHandler && this.intent !== 'oplist') {\n      this.optimizer = new QueueOptimizer(this);\n    } else {\n      this.optimizer = new NullOptimizer(this);\n    }\n    this.dependencies = Object.create(null);\n    this._totalLength = 0;\n    this.pageIndex = pageIndex;\n    this.intent = intent;\n    this.weight = 0;\n  }\n\n  OperatorList.prototype = {\n    get length() {\n      return this.argsArray.length;\n    },\n\n    /**\n     * @returns {number} The total length of the entire operator list,\n     *                   since `this.length === 0` after flushing.\n     */\n    get totalLength() {\n      return (this._totalLength + this.length);\n    },\n\n    addOp(fn, args) {\n      this.optimizer.push(fn, args);\n      this.weight++;\n      if (this.messageHandler) {\n        if (this.weight >= CHUNK_SIZE) {\n          this.flush();\n        } else if (this.weight >= CHUNK_SIZE_ABOUT &&\n                   (fn === OPS.restore || fn === OPS.endText)) {\n          // heuristic to flush on boundary of restore or endText\n          this.flush();\n        }\n      }\n    },\n\n    addDependency(dependency) {\n      if (dependency in this.dependencies) {\n        return;\n      }\n      this.dependencies[dependency] = true;\n      this.addOp(OPS.dependency, [dependency]);\n    },\n\n    addDependencies(dependencies) {\n      for (var key in dependencies) {\n        this.addDependency(key);\n      }\n    },\n\n    addOpList(opList) {\n      Object.assign(this.dependencies, opList.dependencies);\n      for (var i = 0, ii = opList.length; i < ii; i++) {\n        this.addOp(opList.fnArray[i], opList.argsArray[i]);\n      }\n    },\n\n    getIR() {\n      return {\n        fnArray: this.fnArray,\n        argsArray: this.argsArray,\n        length: this.length,\n      };\n    },\n\n    flush(lastChunk) {\n      this.optimizer.flush();\n      var transfers = getTransfers(this);\n      var length = this.length;\n      this._totalLength += length;\n\n      this.messageHandler.send('RenderPageChunk', {\n        operatorList: {\n          fnArray: this.fnArray,\n          argsArray: this.argsArray,\n          lastChunk,\n          length,\n        },\n        pageIndex: this.pageIndex,\n        intent: this.intent,\n      }, transfers);\n      this.dependencies = Object.create(null);\n      this.fnArray.length = 0;\n      this.argsArray.length = 0;\n      this.weight = 0;\n      this.optimizer.reset();\n    },\n  };\n\n  return OperatorList;\n})();\n\nexport {\n  OperatorList,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  AbortException, assert, CMapCompressionType, createPromiseCapability,\n  FONT_IDENTITY_MATRIX, FormatError, getLookupTableFactory, IDENTITY_MATRIX,\n  info, isNum, isString, NativeImageDecoding, OPS, stringToPDFString,\n  TextRenderingMode, UNSUPPORTED_FEATURES, Util, warn\n} from '../shared/util';\nimport { CMapFactory, IdentityCMap } from './cmap';\nimport { DecodeStream, Stream } from './stream';\nimport {\n  Dict, isCmd, isDict, isEOF, isName, isRef, isStream, Name\n} from './primitives';\nimport {\n  ErrorFont, Font, FontFlags, getFontType, IdentityToUnicodeMap, ToUnicodeMap\n} from './fonts';\nimport {\n  getEncoding, MacRomanEncoding, StandardEncoding, SymbolSetEncoding,\n  WinAnsiEncoding, ZapfDingbatsEncoding\n} from './encodings';\nimport {\n  getNormalizedUnicodes, getUnicodeForGlyph, reverseIfRtl\n} from './unicode';\nimport {\n  getSerifFonts, getStdFontMap, getSymbolsFonts\n} from './standard_fonts';\nimport { getTilingPatternIR, Pattern } from './pattern';\nimport { Lexer, Parser } from './parser';\nimport { bidi } from './bidi';\nimport { ColorSpace } from './colorspace';\nimport { getGlyphsUnicode } from './glyphlist';\nimport { getMetrics } from './metrics';\nimport { isPDFFunction } from './function';\nimport { JpegStream } from './jpeg_stream';\nimport { MurmurHash3_64 } from './murmurhash3';\nimport { OperatorList } from './operator_list';\nimport { PDFImage } from './image';\n\nvar PartialEvaluator = (function PartialEvaluatorClosure() {\n  const DefaultPartialEvaluatorOptions = {\n    forceDataSchema: false,\n    maxImageSize: -1,\n    disableFontFace: false,\n    nativeImageDecoderSupport: NativeImageDecoding.DECODE,\n    ignoreErrors: false,\n    isEvalSupported: true,\n  };\n\n  function NativeImageDecoder({ xref, resources, handler,\n                                forceDataSchema = false,\n                                pdfFunctionFactory, }) {\n    this.xref = xref;\n    this.resources = resources;\n    this.handler = handler;\n    this.forceDataSchema = forceDataSchema;\n    this.pdfFunctionFactory = pdfFunctionFactory;\n  }\n  NativeImageDecoder.prototype = {\n    canDecode(image) {\n      return image instanceof JpegStream &&\n             NativeImageDecoder.isDecodable(image, this.xref, this.resources,\n                                            this.pdfFunctionFactory);\n    },\n    decode(image) {\n      // For natively supported JPEGs send them to the main thread for decoding.\n      var dict = image.dict;\n      var colorSpace = dict.get('ColorSpace', 'CS');\n      colorSpace = ColorSpace.parse(colorSpace, this.xref, this.resources,\n                                    this.pdfFunctionFactory);\n\n      return this.handler.sendWithPromise('JpegDecode', [\n        image.getIR(this.forceDataSchema), colorSpace.numComps\n      ]).then(function({ data, width, height, }) {\n        return new Stream(data, 0, data.length, image.dict);\n      });\n    },\n  };\n  /**\n   * Checks if the image can be decoded and displayed by the browser without any\n   * further processing such as color space conversions.\n   */\n  NativeImageDecoder.isSupported = function(image, xref, res,\n                                            pdfFunctionFactory) {\n    var dict = image.dict;\n    if (dict.has('DecodeParms') || dict.has('DP')) {\n      return false;\n    }\n    var cs = ColorSpace.parse(dict.get('ColorSpace', 'CS'), xref, res,\n                              pdfFunctionFactory);\n    return (cs.name === 'DeviceGray' || cs.name === 'DeviceRGB') &&\n           cs.isDefaultDecode(dict.getArray('Decode', 'D'));\n  };\n  /**\n   * Checks if the image can be decoded by the browser.\n   */\n  NativeImageDecoder.isDecodable = function(image, xref, res,\n                                            pdfFunctionFactory) {\n    var dict = image.dict;\n    if (dict.has('DecodeParms') || dict.has('DP')) {\n      return false;\n    }\n    var cs = ColorSpace.parse(dict.get('ColorSpace', 'CS'), xref, res,\n                              pdfFunctionFactory);\n    return (cs.numComps === 1 || cs.numComps === 3) &&\n           cs.isDefaultDecode(dict.getArray('Decode', 'D'));\n  };\n\n  function PartialEvaluator({ pdfManager, xref, handler, pageIndex, idFactory,\n                              fontCache, builtInCMapCache, options = null,\n                              pdfFunctionFactory, }) {\n    this.pdfManager = pdfManager;\n    this.xref = xref;\n    this.handler = handler;\n    this.pageIndex = pageIndex;\n    this.idFactory = idFactory;\n    this.fontCache = fontCache;\n    this.builtInCMapCache = builtInCMapCache;\n    this.options = options || DefaultPartialEvaluatorOptions;\n    this.pdfFunctionFactory = pdfFunctionFactory;\n\n    this.fetchBuiltInCMap = async (name) => {\n      if (this.builtInCMapCache.has(name)) {\n        return this.builtInCMapCache.get(name);\n      }\n      const data = await this.handler.sendWithPromise('FetchBuiltInCMap',\n                                                      { name, });\n      if (data.compressionType !== CMapCompressionType.NONE) {\n        // Given the size of uncompressed CMaps, only cache compressed ones.\n        this.builtInCMapCache.set(name, data);\n      }\n      return data;\n    };\n  }\n\n  // Trying to minimize Date.now() usage and check every 100 time\n  var TIME_SLOT_DURATION_MS = 20;\n  var CHECK_TIME_EVERY = 100;\n  function TimeSlotManager() {\n    this.reset();\n  }\n  TimeSlotManager.prototype = {\n    check: function TimeSlotManager_check() {\n      if (++this.checked < CHECK_TIME_EVERY) {\n        return false;\n      }\n      this.checked = 0;\n      return this.endTime <= Date.now();\n    },\n    reset: function TimeSlotManager_reset() {\n      this.endTime = Date.now() + TIME_SLOT_DURATION_MS;\n      this.checked = 0;\n    },\n  };\n\n  // Convert PDF blend mode names to HTML5 blend mode names.\n  function normalizeBlendMode(value) {\n    if (!isName(value)) {\n      return 'source-over';\n    }\n    switch (value.name) {\n      case 'Normal':\n      case 'Compatible':\n        return 'source-over';\n      case 'Multiply':\n        return 'multiply';\n      case 'Screen':\n        return 'screen';\n      case 'Overlay':\n        return 'overlay';\n      case 'Darken':\n        return 'darken';\n      case 'Lighten':\n        return 'lighten';\n      case 'ColorDodge':\n        return 'color-dodge';\n      case 'ColorBurn':\n        return 'color-burn';\n      case 'HardLight':\n        return 'hard-light';\n      case 'SoftLight':\n        return 'soft-light';\n      case 'Difference':\n        return 'difference';\n      case 'Exclusion':\n        return 'exclusion';\n      case 'Hue':\n        return 'hue';\n      case 'Saturation':\n        return 'saturation';\n      case 'Color':\n        return 'color';\n      case 'Luminosity':\n        return 'luminosity';\n    }\n    warn('Unsupported blend mode: ' + value.name);\n    return 'source-over';\n  }\n\n  var deferred = Promise.resolve();\n\n  var TILING_PATTERN = 1, SHADING_PATTERN = 2;\n\n  PartialEvaluator.prototype = {\n    clone(newOptions = DefaultPartialEvaluatorOptions) {\n      var newEvaluator = Object.create(this);\n      newEvaluator.options = newOptions;\n      return newEvaluator;\n    },\n\n    hasBlendModes: function PartialEvaluator_hasBlendModes(resources) {\n      if (!isDict(resources)) {\n        return false;\n      }\n\n      var processed = Object.create(null);\n      if (resources.objId) {\n        processed[resources.objId] = true;\n      }\n\n      var nodes = [resources], xref = this.xref;\n      while (nodes.length) {\n        var key, i, ii;\n        var node = nodes.shift();\n        // First check the current resources for blend modes.\n        var graphicStates = node.get('ExtGState');\n        if (isDict(graphicStates)) {\n          var graphicStatesKeys = graphicStates.getKeys();\n          for (i = 0, ii = graphicStatesKeys.length; i < ii; i++) {\n            key = graphicStatesKeys[i];\n\n            var graphicState = graphicStates.get(key);\n            var bm = graphicState.get('BM');\n            if (isName(bm) && bm.name !== 'Normal') {\n              return true;\n            }\n          }\n        }\n        // Descend into the XObjects to look for more resources and blend modes.\n        var xObjects = node.get('XObject');\n        if (!isDict(xObjects)) {\n          continue;\n        }\n        var xObjectsKeys = xObjects.getKeys();\n        for (i = 0, ii = xObjectsKeys.length; i < ii; i++) {\n          key = xObjectsKeys[i];\n\n          var xObject = xObjects.getRaw(key);\n          if (isRef(xObject)) {\n            if (processed[xObject.toString()]) {\n              // The XObject has already been processed, and by avoiding a\n              // redundant `xref.fetch` we can *significantly* reduce the load\n              // time for badly generated PDF files (fixes issue6961.pdf).\n              continue;\n            }\n            xObject = xref.fetch(xObject);\n          }\n          if (!isStream(xObject)) {\n            continue;\n          }\n          if (xObject.dict.objId) {\n            if (processed[xObject.dict.objId]) {\n              // stream has objId and is processed already\n              continue;\n            }\n            processed[xObject.dict.objId] = true;\n          }\n          var xResources = xObject.dict.get('Resources');\n          // Checking objId to detect an infinite loop.\n          if (isDict(xResources) &&\n              (!xResources.objId || !processed[xResources.objId])) {\n            nodes.push(xResources);\n            if (xResources.objId) {\n              processed[xResources.objId] = true;\n            }\n          }\n        }\n      }\n      return false;\n    },\n\n    buildFormXObject: function PartialEvaluator_buildFormXObject(resources,\n                                                                 xobj, smask,\n                                                                 operatorList,\n                                                                 task,\n                                                                 initialState) {\n      var dict = xobj.dict;\n      var matrix = dict.getArray('Matrix');\n      var bbox = dict.getArray('BBox');\n      var group = dict.get('Group');\n      if (group) {\n        var groupOptions = {\n          matrix,\n          bbox,\n          smask,\n          isolated: false,\n          knockout: false,\n        };\n\n        var groupSubtype = group.get('S');\n        var colorSpace = null;\n        if (isName(groupSubtype, 'Transparency')) {\n          groupOptions.isolated = (group.get('I') || false);\n          groupOptions.knockout = (group.get('K') || false);\n          if (group.has('CS')) {\n            colorSpace = ColorSpace.parse(group.get('CS'), this.xref, resources,\n                                          this.pdfFunctionFactory);\n          }\n        }\n\n        if (smask && smask.backdrop) {\n          colorSpace = colorSpace || ColorSpace.singletons.rgb;\n          smask.backdrop = colorSpace.getRgb(smask.backdrop, 0);\n        }\n\n        operatorList.addOp(OPS.beginGroup, [groupOptions]);\n      }\n\n      operatorList.addOp(OPS.paintFormXObjectBegin, [matrix, bbox]);\n\n      return this.getOperatorList({\n        stream: xobj,\n        task,\n        resources: dict.get('Resources') || resources,\n        operatorList,\n        initialState,\n      }).then(function () {\n        operatorList.addOp(OPS.paintFormXObjectEnd, []);\n\n        if (group) {\n          operatorList.addOp(OPS.endGroup, [groupOptions]);\n        }\n      });\n    },\n\n    buildPaintImageXObject({ resources, image, isInline = false, operatorList,\n                             cacheKey, imageCache,\n                             forceDisableNativeImageDecoder = false, }) {\n      var dict = image.dict;\n      var w = dict.get('Width', 'W');\n      var h = dict.get('Height', 'H');\n\n      if (!(w && isNum(w)) || !(h && isNum(h))) {\n        warn('Image dimensions are missing, or not numbers.');\n        return Promise.resolve();\n      }\n      var maxImageSize = this.options.maxImageSize;\n      if (maxImageSize !== -1 && w * h > maxImageSize) {\n        warn('Image exceeded maximum allowed size and was removed.');\n        return Promise.resolve();\n      }\n\n      var imageMask = (dict.get('ImageMask', 'IM') || false);\n      var imgData, args;\n      if (imageMask) {\n        // This depends on a tmpCanvas being filled with the\n        // current fillStyle, such that processing the pixel\n        // data can't be done here. Instead of creating a\n        // complete PDFImage, only read the information needed\n        // for later.\n\n        var width = dict.get('Width', 'W');\n        var height = dict.get('Height', 'H');\n        var bitStrideLength = (width + 7) >> 3;\n        var imgArray = image.getBytes(bitStrideLength * height,\n                                      /* forceClamped = */ true);\n        var decode = dict.getArray('Decode', 'D');\n\n        imgData = PDFImage.createMask({\n          imgArray,\n          width,\n          height,\n          imageIsFromDecodeStream: image instanceof DecodeStream,\n          inverseDecode: (!!decode && decode[0] > 0),\n        });\n        imgData.cached = true;\n        args = [imgData];\n        operatorList.addOp(OPS.paintImageMaskXObject, args);\n        if (cacheKey) {\n          imageCache[cacheKey] = {\n            fn: OPS.paintImageMaskXObject,\n            args,\n          };\n        }\n        return Promise.resolve();\n      }\n\n      var softMask = (dict.get('SMask', 'SM') || false);\n      var mask = (dict.get('Mask') || false);\n\n      var SMALL_IMAGE_DIMENSIONS = 200;\n      // Inlining small images into the queue as RGB data\n      if (isInline && !softMask && !mask && !(image instanceof JpegStream) &&\n          (w + h) < SMALL_IMAGE_DIMENSIONS) {\n        let imageObj = new PDFImage({\n          xref: this.xref,\n          res: resources,\n          image,\n          isInline,\n          pdfFunctionFactory: this.pdfFunctionFactory,\n        });\n        // We force the use of RGBA_32BPP images here, because we can't handle\n        // any other kind.\n        imgData = imageObj.createImageData(/* forceRGBA = */ true);\n        operatorList.addOp(OPS.paintInlineImageXObject, [imgData]);\n        return Promise.resolve();\n      }\n\n      const nativeImageDecoderSupport = forceDisableNativeImageDecoder ?\n        NativeImageDecoding.NONE : this.options.nativeImageDecoderSupport;\n      // If there is no imageMask, create the PDFImage and a lot\n      // of image processing can be done here.\n      var objId = 'img_' + this.idFactory.createObjId();\n\n      if (nativeImageDecoderSupport !== NativeImageDecoding.NONE &&\n          !softMask && !mask && image instanceof JpegStream &&\n          NativeImageDecoder.isSupported(image, this.xref, resources,\n                                         this.pdfFunctionFactory)) {\n        // These JPEGs don't need any more processing so we can just send it.\n        return this.handler.sendWithPromise('obj', [\n          objId, this.pageIndex, 'JpegStream',\n          image.getIR(this.options.forceDataSchema)\n        ]).then(function() {\n          // Only add the dependency once we know that the native JPEG decoding\n          // succeeded, to ensure that rendering will always complete.\n          operatorList.addDependency(objId);\n          args = [objId, w, h];\n\n          operatorList.addOp(OPS.paintJpegXObject, args);\n          if (cacheKey) {\n            imageCache[cacheKey] = {\n              fn: OPS.paintJpegXObject,\n              args,\n            };\n          }\n        }, (reason) => {\n          warn('Native JPEG decoding failed -- trying to recover: ' +\n               (reason && reason.message));\n          // Try to decode the JPEG image with the built-in decoder instead.\n          return this.buildPaintImageXObject({\n            resources,\n            image,\n            isInline,\n            operatorList,\n            cacheKey,\n            imageCache,\n            forceDisableNativeImageDecoder: true,\n          });\n        });\n      }\n\n      // Creates native image decoder only if a JPEG image or mask is present.\n      var nativeImageDecoder = null;\n      if (nativeImageDecoderSupport === NativeImageDecoding.DECODE &&\n          (image instanceof JpegStream || mask instanceof JpegStream ||\n           softMask instanceof JpegStream)) {\n        nativeImageDecoder = new NativeImageDecoder({\n          xref: this.xref,\n          resources,\n          handler: this.handler,\n          forceDataSchema: this.options.forceDataSchema,\n          pdfFunctionFactory: this.pdfFunctionFactory,\n        });\n      }\n\n      // Ensure that the dependency is added before the image is decoded.\n      operatorList.addDependency(objId);\n      args = [objId, w, h];\n\n      PDFImage.buildImage({\n        handler: this.handler,\n        xref: this.xref,\n        res: resources,\n        image,\n        isInline,\n        nativeDecoder: nativeImageDecoder,\n        pdfFunctionFactory: this.pdfFunctionFactory,\n      }).then((imageObj) => {\n        var imgData = imageObj.createImageData(/* forceRGBA = */ false);\n        this.handler.send('obj', [objId, this.pageIndex, 'Image', imgData],\n          [imgData.data.buffer]);\n      }).catch((reason) => {\n        warn('Unable to decode image: ' + reason);\n        this.handler.send('obj', [objId, this.pageIndex, 'Image', null]);\n      });\n\n      operatorList.addOp(OPS.paintImageXObject, args);\n      if (cacheKey) {\n        imageCache[cacheKey] = {\n          fn: OPS.paintImageXObject,\n          args,\n        };\n      }\n      return Promise.resolve();\n    },\n\n    handleSMask: function PartialEvaluator_handleSmask(smask, resources,\n                                                       operatorList, task,\n                                                       stateManager) {\n      var smaskContent = smask.get('G');\n      var smaskOptions = {\n        subtype: smask.get('S').name,\n        backdrop: smask.get('BC'),\n      };\n\n      // The SMask might have a alpha/luminosity value transfer function --\n      // we will build a map of integer values in range 0..255 to be fast.\n      var transferObj = smask.get('TR');\n      if (isPDFFunction(transferObj)) {\n        let transferFn = this.pdfFunctionFactory.create(transferObj);\n        var transferMap = new Uint8Array(256);\n        var tmp = new Float32Array(1);\n        for (var i = 0; i < 256; i++) {\n          tmp[0] = i / 255;\n          transferFn(tmp, 0, tmp, 0);\n          transferMap[i] = (tmp[0] * 255) | 0;\n        }\n        smaskOptions.transferMap = transferMap;\n      }\n\n      return this.buildFormXObject(resources, smaskContent, smaskOptions,\n                                   operatorList, task,\n                                   stateManager.state.clone());\n    },\n\n    handleTilingType(fn, args, resources, pattern, patternDict, operatorList,\n                     task) {\n      // Create an IR of the pattern code.\n      let tilingOpList = new OperatorList();\n      // Merge the available resources, to prevent issues when the patternDict\n      // is missing some /Resources entries (fixes issue6541.pdf).\n      let resourcesArray = [patternDict.get('Resources'), resources];\n      let patternResources = Dict.merge(this.xref, resourcesArray);\n\n      return this.getOperatorList({\n        stream: pattern,\n        task,\n        resources: patternResources,\n        operatorList: tilingOpList,\n      }).then(function() {\n        return getTilingPatternIR({\n          fnArray: tilingOpList.fnArray,\n          argsArray: tilingOpList.argsArray,\n        }, patternDict, args);\n      }).then(function(tilingPatternIR) {\n        // Add the dependencies to the parent operator list so they are\n        // resolved before the sub operator list is executed synchronously.\n        operatorList.addDependencies(tilingOpList.dependencies);\n        operatorList.addOp(fn, tilingPatternIR);\n      }, (reason) => {\n        if (this.options.ignoreErrors) {\n          // Error(s) in the TilingPattern -- sending unsupported feature\n          // notification and allow rendering to continue.\n          this.handler.send('UnsupportedFeature',\n                            { featureId: UNSUPPORTED_FEATURES.unknown, });\n          warn(`handleTilingType - ignoring pattern: \"${reason}\".`);\n          return;\n        }\n        throw reason;\n      });\n    },\n\n    handleSetFont:\n        function PartialEvaluator_handleSetFont(resources, fontArgs, fontRef,\n                                                operatorList, task, state) {\n      // TODO(mack): Not needed?\n      var fontName;\n      if (fontArgs) {\n        fontArgs = fontArgs.slice();\n        fontName = fontArgs[0].name;\n      }\n\n      return this.loadFont(fontName, fontRef, resources).then((translated) => {\n        if (!translated.font.isType3Font) {\n          return translated;\n        }\n        return translated.loadType3Data(this, resources, operatorList, task).\n          then(function () {\n          return translated;\n        }).catch((reason) => {\n          // Error in the font data -- sending unsupported feature notification.\n          this.handler.send('UnsupportedFeature',\n                            { featureId: UNSUPPORTED_FEATURES.font, });\n          return new TranslatedFont('g_font_error',\n            new ErrorFont('Type3 font load error: ' + reason), translated.font);\n        });\n      }).then((translated) => {\n        state.font = translated.font;\n        translated.send(this.handler);\n        return translated.loadedName;\n      });\n    },\n\n    handleText: function PartialEvaluator_handleText(chars, state) {\n      var font = state.font;\n      var glyphs = font.charsToGlyphs(chars);\n      var isAddToPathSet = !!(state.textRenderingMode &\n                              TextRenderingMode.ADD_TO_PATH_FLAG);\n      if (font.data && (isAddToPathSet || this.options.disableFontFace ||\n                        state.fillColorSpace.name === 'Pattern')) {\n        var buildPath = (fontChar) => {\n          if (!font.renderer.hasBuiltPath(fontChar)) {\n            var path = font.renderer.getPathJs(fontChar);\n            this.handler.send('commonobj', [\n              font.loadedName + '_path_' + fontChar,\n              'FontPath',\n              path\n            ]);\n          }\n        };\n\n        for (var i = 0, ii = glyphs.length; i < ii; i++) {\n          var glyph = glyphs[i];\n          buildPath(glyph.fontChar);\n\n          // If the glyph has an accent we need to build a path for its\n          // fontChar too, otherwise CanvasGraphics_paintChar will fail.\n          var accent = glyph.accent;\n          if (accent && accent.fontChar) {\n            buildPath(accent.fontChar);\n          }\n        }\n      }\n\n      return glyphs;\n    },\n\n    setGState: function PartialEvaluator_setGState(resources, gState,\n                                                   operatorList, task,\n                                                   stateManager) {\n      // This array holds the converted/processed state data.\n      var gStateObj = [];\n      var gStateKeys = gState.getKeys();\n      var promise = Promise.resolve();\n      for (var i = 0, ii = gStateKeys.length; i < ii; i++) {\n        let key = gStateKeys[i];\n        let value = gState.get(key);\n        switch (key) {\n          case 'Type':\n            break;\n          case 'LW':\n          case 'LC':\n          case 'LJ':\n          case 'ML':\n          case 'D':\n          case 'RI':\n          case 'FL':\n          case 'CA':\n          case 'ca':\n            gStateObj.push([key, value]);\n            break;\n          case 'Font':\n            promise = promise.then(() => {\n              return this.handleSetFont(resources, null, value[0], operatorList,\n                                        task, stateManager.state).\n                then(function (loadedName) {\n                  operatorList.addDependency(loadedName);\n                  gStateObj.push([key, [loadedName, value[1]]]);\n                });\n            });\n            break;\n          case 'BM':\n            gStateObj.push([key, normalizeBlendMode(value)]);\n            break;\n          case 'SMask':\n            if (isName(value, 'None')) {\n              gStateObj.push([key, false]);\n              break;\n            }\n            if (isDict(value)) {\n              promise = promise.then(() => {\n                return this.handleSMask(value, resources, operatorList,\n                                        task, stateManager);\n              });\n              gStateObj.push([key, true]);\n            } else {\n              warn('Unsupported SMask type');\n            }\n\n            break;\n          // Only generate info log messages for the following since\n          // they are unlikely to have a big impact on the rendering.\n          case 'OP':\n          case 'op':\n          case 'OPM':\n          case 'BG':\n          case 'BG2':\n          case 'UCR':\n          case 'UCR2':\n          case 'TR':\n          case 'TR2':\n          case 'HT':\n          case 'SM':\n          case 'SA':\n          case 'AIS':\n          case 'TK':\n            // TODO implement these operators.\n            info('graphic state operator ' + key);\n            break;\n          default:\n            info('Unknown graphic state operator ' + key);\n            break;\n        }\n      }\n      return promise.then(function () {\n        if (gStateObj.length > 0) {\n          operatorList.addOp(OPS.setGState, [gStateObj]);\n        }\n      });\n    },\n\n    loadFont: function PartialEvaluator_loadFont(fontName, font, resources) {\n      function errorFont() {\n        return Promise.resolve(new TranslatedFont('g_font_error',\n          new ErrorFont('Font ' + fontName + ' is not available'), font));\n      }\n\n      var fontRef, xref = this.xref;\n      if (font) { // Loading by ref.\n        if (!isRef(font)) {\n          throw new Error('The \"font\" object should be a reference.');\n        }\n        fontRef = font;\n      } else { // Loading by name.\n        var fontRes = resources.get('Font');\n        if (fontRes) {\n          fontRef = fontRes.getRaw(fontName);\n        } else {\n          warn('fontRes not available');\n          return errorFont();\n        }\n      }\n      if (!fontRef) {\n        warn('fontRef not available');\n        return errorFont();\n      }\n\n      if (this.fontCache.has(fontRef)) {\n        return this.fontCache.get(fontRef);\n      }\n\n      font = xref.fetchIfRef(fontRef);\n      if (!isDict(font)) {\n        return errorFont();\n      }\n\n      // We are holding `font.translated` references just for `fontRef`s that\n      // are not actually `Ref`s, but rather `Dict`s. See explanation below.\n      if (font.translated) {\n        return font.translated;\n      }\n\n      var fontCapability = createPromiseCapability();\n\n      var preEvaluatedFont = this.preEvaluateFont(font);\n      var descriptor = preEvaluatedFont.descriptor;\n\n      var fontRefIsRef = isRef(fontRef), fontID;\n      if (fontRefIsRef) {\n        fontID = fontRef.toString();\n      }\n\n      if (isDict(descriptor)) {\n        if (!descriptor.fontAliases) {\n          descriptor.fontAliases = Object.create(null);\n        }\n\n        var fontAliases = descriptor.fontAliases;\n        var hash = preEvaluatedFont.hash;\n        if (fontAliases[hash]) {\n          var aliasFontRef = fontAliases[hash].aliasRef;\n          if (fontRefIsRef && aliasFontRef &&\n              this.fontCache.has(aliasFontRef)) {\n            this.fontCache.putAlias(fontRef, aliasFontRef);\n            return this.fontCache.get(fontRef);\n          }\n        } else {\n          fontAliases[hash] = {\n            fontID: Font.getFontID(),\n          };\n        }\n\n        if (fontRefIsRef) {\n          fontAliases[hash].aliasRef = fontRef;\n        }\n        fontID = fontAliases[hash].fontID;\n      }\n\n      // Workaround for bad PDF generators that reference fonts incorrectly,\n      // where `fontRef` is a `Dict` rather than a `Ref` (fixes bug946506.pdf).\n      // In this case we should not put the font into `this.fontCache` (which is\n      // a `RefSetCache`), since it's not meaningful to use a `Dict` as a key.\n      //\n      // However, if we don't cache the font it's not possible to remove it\n      // when `cleanup` is triggered from the API, which causes issues on\n      // subsequent rendering operations (see issue7403.pdf).\n      // A simple workaround would be to just not hold `font.translated`\n      // references in this case, but this would force us to unnecessarily load\n      // the same fonts over and over.\n      //\n      // Instead, we cheat a bit by attempting to use a modified `fontID` as a\n      // key in `this.fontCache`, to allow the font to be cached.\n      // NOTE: This works because `RefSetCache` calls `toString()` on provided\n      //       keys. Also, since `fontRef` is used when getting cached fonts,\n      //       we'll not accidentally match fonts cached with the `fontID`.\n      if (fontRefIsRef) {\n        this.fontCache.put(fontRef, fontCapability.promise);\n      } else {\n        if (!fontID) {\n          fontID = this.idFactory.createObjId();\n        }\n        this.fontCache.put('id_' + fontID, fontCapability.promise);\n      }\n      assert(fontID, 'The \"fontID\" must be defined.');\n\n      // Keep track of each font we translated so the caller can\n      // load them asynchronously before calling display on a page.\n      font.loadedName = 'g_' + this.pdfManager.docId + '_f' + fontID;\n\n      font.translated = fontCapability.promise;\n\n      // TODO move promises into translate font\n      var translatedPromise;\n      try {\n        translatedPromise = this.translateFont(preEvaluatedFont);\n      } catch (e) {\n        translatedPromise = Promise.reject(e);\n      }\n\n      translatedPromise.then(function (translatedFont) {\n        if (translatedFont.fontType !== undefined) {\n          var xrefFontStats = xref.stats.fontTypes;\n          xrefFontStats[translatedFont.fontType] = true;\n        }\n\n        fontCapability.resolve(new TranslatedFont(font.loadedName,\n          translatedFont, font));\n      }).catch((reason) => {\n        // TODO fontCapability.reject?\n        // Error in the font data -- sending unsupported feature notification.\n        this.handler.send('UnsupportedFeature',\n                          { featureId: UNSUPPORTED_FEATURES.font, });\n\n        try {\n          // error, but it's still nice to have font type reported\n          var descriptor = preEvaluatedFont.descriptor;\n          var fontFile3 = descriptor && descriptor.get('FontFile3');\n          var subtype = fontFile3 && fontFile3.get('Subtype');\n          var fontType = getFontType(preEvaluatedFont.type,\n                                     subtype && subtype.name);\n          var xrefFontStats = xref.stats.fontTypes;\n          xrefFontStats[fontType] = true;\n        } catch (ex) { }\n\n        fontCapability.resolve(new TranslatedFont(font.loadedName,\n          new ErrorFont(reason instanceof Error ? reason.message : reason),\n          font));\n      });\n      return fontCapability.promise;\n    },\n\n    buildPath: function PartialEvaluator_buildPath(operatorList, fn, args) {\n      var lastIndex = operatorList.length - 1;\n      if (!args) {\n        args = [];\n      }\n      if (lastIndex < 0 ||\n          operatorList.fnArray[lastIndex] !== OPS.constructPath) {\n        operatorList.addOp(OPS.constructPath, [[fn], args]);\n      } else {\n        var opArgs = operatorList.argsArray[lastIndex];\n        opArgs[0].push(fn);\n        Array.prototype.push.apply(opArgs[1], args);\n      }\n    },\n\n    handleColorN: function PartialEvaluator_handleColorN(operatorList, fn, args,\n                                                         cs, patterns,\n                                                         resources, task) {\n      // compile tiling patterns\n      var patternName = args[args.length - 1];\n      // SCN/scn applies patterns along with normal colors\n      var pattern;\n      if (isName(patternName) &&\n          (pattern = patterns.get(patternName.name))) {\n        var dict = (isStream(pattern) ? pattern.dict : pattern);\n        var typeNum = dict.get('PatternType');\n\n        if (typeNum === TILING_PATTERN) {\n          var color = cs.base ? cs.base.getRgb(args, 0) : null;\n          return this.handleTilingType(fn, color, resources, pattern,\n                                       dict, operatorList, task);\n        } else if (typeNum === SHADING_PATTERN) {\n          var shading = dict.get('Shading');\n          var matrix = dict.getArray('Matrix');\n          pattern = Pattern.parseShading(shading, matrix, this.xref, resources,\n                                         this.handler, this.pdfFunctionFactory);\n          operatorList.addOp(fn, pattern.getIR());\n          return Promise.resolve();\n        }\n        return Promise.reject(new Error('Unknown PatternType: ' + typeNum));\n      }\n      // TODO shall we fail here?\n      operatorList.addOp(fn, args);\n      return Promise.resolve();\n    },\n\n    getOperatorList({ stream, task, resources, operatorList,\n                      initialState = null, }) {\n      // Ensure that `resources`/`initialState` is correctly initialized,\n      // even if the provided parameter is e.g. `null`.\n      resources = resources || Dict.empty;\n      initialState = initialState || new EvalState();\n\n      if (!operatorList) {\n        throw new Error('getOperatorList: missing \"operatorList\" parameter');\n      }\n\n      var self = this;\n      var xref = this.xref;\n      var imageCache = Object.create(null);\n\n      var xobjs = (resources.get('XObject') || Dict.empty);\n      var patterns = (resources.get('Pattern') || Dict.empty);\n      var stateManager = new StateManager(initialState);\n      var preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager);\n      var timeSlotManager = new TimeSlotManager();\n\n      function closePendingRestoreOPS(argument) {\n        for (var i = 0, ii = preprocessor.savedStatesDepth; i < ii; i++) {\n          operatorList.addOp(OPS.restore, []);\n        }\n      }\n\n      return new Promise(function promiseBody(resolve, reject) {\n        var next = function (promise) {\n          promise.then(function () {\n            try {\n              promiseBody(resolve, reject);\n            } catch (ex) {\n              reject(ex);\n            }\n          }, reject);\n        };\n        task.ensureNotTerminated();\n        timeSlotManager.reset();\n        var stop, operation = {}, i, ii, cs;\n        while (!(stop = timeSlotManager.check())) {\n          // The arguments parsed by read() are used beyond this loop, so we\n          // cannot reuse the same array on each iteration. Therefore we pass\n          // in |null| as the initial value (see the comment on\n          // EvaluatorPreprocessor_read() for why).\n          operation.args = null;\n          if (!(preprocessor.read(operation))) {\n            break;\n          }\n          var args = operation.args;\n          var fn = operation.fn;\n\n          switch (fn | 0) {\n            case OPS.paintXObject:\n              // eagerly compile XForm objects\n              var name = args[0].name;\n              if (name && imageCache[name] !== undefined) {\n                operatorList.addOp(imageCache[name].fn, imageCache[name].args);\n                args = null;\n                continue;\n              }\n\n              next(new Promise(function(resolveXObject, rejectXObject) {\n                if (!name) {\n                  throw new FormatError('XObject must be referred to by name.');\n                }\n\n                let xobj = xobjs.get(name);\n                if (!xobj) {\n                  operatorList.addOp(fn, args);\n                  resolveXObject();\n                  return;\n                }\n                if (!isStream(xobj)) {\n                  throw new FormatError('XObject should be a stream');\n                }\n\n                let type = xobj.dict.get('Subtype');\n                if (!isName(type)) {\n                  throw new FormatError('XObject should have a Name subtype');\n                }\n\n                if (type.name === 'Form') {\n                  stateManager.save();\n                  self.buildFormXObject(resources, xobj, null, operatorList,\n                                        task, stateManager.state.clone()).\n                    then(function() {\n                      stateManager.restore();\n                      resolveXObject();\n                    }, rejectXObject);\n                  return;\n                } else if (type.name === 'Image') {\n                  self.buildPaintImageXObject({\n                    resources,\n                    image: xobj,\n                    operatorList,\n                    cacheKey: name,\n                    imageCache,\n                  }).then(resolveXObject, rejectXObject);\n                  return;\n                } else if (type.name === 'PS') {\n                  // PostScript XObjects are unused when viewing documents.\n                  // See section 4.7.1 of Adobe's PDF reference.\n                  info('Ignored XObject subtype PS');\n                } else {\n                  throw new FormatError(\n                    `Unhandled XObject subtype ${type.name}`);\n                }\n                resolveXObject();\n              }).catch(function(reason) {\n                if (self.options.ignoreErrors) {\n                  // Error(s) in the XObject -- sending unsupported feature\n                  // notification and allow rendering to continue.\n                  self.handler.send('UnsupportedFeature',\n                    { featureId: UNSUPPORTED_FEATURES.unknown, });\n                  warn(`getOperatorList - ignoring XObject: \"${reason}\".`);\n                  return;\n                }\n                throw reason;\n              }));\n              return;\n            case OPS.setFont:\n              var fontSize = args[1];\n              // eagerly collect all fonts\n              next(self.handleSetFont(resources, args, null, operatorList,\n                                      task, stateManager.state).\n                then(function (loadedName) {\n                  operatorList.addDependency(loadedName);\n                  operatorList.addOp(OPS.setFont, [loadedName, fontSize]);\n                }));\n              return;\n            case OPS.endInlineImage:\n              var cacheKey = args[0].cacheKey;\n              if (cacheKey) {\n                var cacheEntry = imageCache[cacheKey];\n                if (cacheEntry !== undefined) {\n                  operatorList.addOp(cacheEntry.fn, cacheEntry.args);\n                  args = null;\n                  continue;\n                }\n              }\n              next(self.buildPaintImageXObject({\n                resources,\n                image: args[0],\n                isInline: true,\n                operatorList,\n                cacheKey,\n                imageCache,\n              }));\n              return;\n            case OPS.showText:\n              args[0] = self.handleText(args[0], stateManager.state);\n              break;\n            case OPS.showSpacedText:\n              var arr = args[0];\n              var combinedGlyphs = [];\n              var arrLength = arr.length;\n              var state = stateManager.state;\n              for (i = 0; i < arrLength; ++i) {\n                var arrItem = arr[i];\n                if (isString(arrItem)) {\n                  Array.prototype.push.apply(combinedGlyphs,\n                    self.handleText(arrItem, state));\n                } else if (isNum(arrItem)) {\n                  combinedGlyphs.push(arrItem);\n                }\n              }\n              args[0] = combinedGlyphs;\n              fn = OPS.showText;\n              break;\n            case OPS.nextLineShowText:\n              operatorList.addOp(OPS.nextLine);\n              args[0] = self.handleText(args[0], stateManager.state);\n              fn = OPS.showText;\n              break;\n            case OPS.nextLineSetSpacingShowText:\n              operatorList.addOp(OPS.nextLine);\n              operatorList.addOp(OPS.setWordSpacing, [args.shift()]);\n              operatorList.addOp(OPS.setCharSpacing, [args.shift()]);\n              args[0] = self.handleText(args[0], stateManager.state);\n              fn = OPS.showText;\n              break;\n            case OPS.setTextRenderingMode:\n              stateManager.state.textRenderingMode = args[0];\n              break;\n\n            case OPS.setFillColorSpace:\n              stateManager.state.fillColorSpace =\n                ColorSpace.parse(args[0], xref, resources,\n                                 self.pdfFunctionFactory);\n              continue;\n            case OPS.setStrokeColorSpace:\n              stateManager.state.strokeColorSpace =\n                ColorSpace.parse(args[0], xref, resources,\n                                 self.pdfFunctionFactory);\n              continue;\n            case OPS.setFillColor:\n              cs = stateManager.state.fillColorSpace;\n              args = cs.getRgb(args, 0);\n              fn = OPS.setFillRGBColor;\n              break;\n            case OPS.setStrokeColor:\n              cs = stateManager.state.strokeColorSpace;\n              args = cs.getRgb(args, 0);\n              fn = OPS.setStrokeRGBColor;\n              break;\n            case OPS.setFillGray:\n              stateManager.state.fillColorSpace = ColorSpace.singletons.gray;\n              args = ColorSpace.singletons.gray.getRgb(args, 0);\n              fn = OPS.setFillRGBColor;\n              break;\n            case OPS.setStrokeGray:\n              stateManager.state.strokeColorSpace = ColorSpace.singletons.gray;\n              args = ColorSpace.singletons.gray.getRgb(args, 0);\n              fn = OPS.setStrokeRGBColor;\n              break;\n            case OPS.setFillCMYKColor:\n              stateManager.state.fillColorSpace = ColorSpace.singletons.cmyk;\n              args = ColorSpace.singletons.cmyk.getRgb(args, 0);\n              fn = OPS.setFillRGBColor;\n              break;\n            case OPS.setStrokeCMYKColor:\n              stateManager.state.strokeColorSpace = ColorSpace.singletons.cmyk;\n              args = ColorSpace.singletons.cmyk.getRgb(args, 0);\n              fn = OPS.setStrokeRGBColor;\n              break;\n            case OPS.setFillRGBColor:\n              stateManager.state.fillColorSpace = ColorSpace.singletons.rgb;\n              args = ColorSpace.singletons.rgb.getRgb(args, 0);\n              break;\n            case OPS.setStrokeRGBColor:\n              stateManager.state.strokeColorSpace = ColorSpace.singletons.rgb;\n              args = ColorSpace.singletons.rgb.getRgb(args, 0);\n              break;\n            case OPS.setFillColorN:\n              cs = stateManager.state.fillColorSpace;\n              if (cs.name === 'Pattern') {\n                next(self.handleColorN(operatorList, OPS.setFillColorN, args,\n                                       cs, patterns, resources, task));\n                return;\n              }\n              args = cs.getRgb(args, 0);\n              fn = OPS.setFillRGBColor;\n              break;\n            case OPS.setStrokeColorN:\n              cs = stateManager.state.strokeColorSpace;\n              if (cs.name === 'Pattern') {\n                next(self.handleColorN(operatorList, OPS.setStrokeColorN, args,\n                                       cs, patterns, resources, task));\n                return;\n              }\n              args = cs.getRgb(args, 0);\n              fn = OPS.setStrokeRGBColor;\n              break;\n\n            case OPS.shadingFill:\n              var shadingRes = resources.get('Shading');\n              if (!shadingRes) {\n                throw new FormatError('No shading resource found');\n              }\n\n              var shading = shadingRes.get(args[0].name);\n              if (!shading) {\n                throw new FormatError('No shading object found');\n              }\n\n              var shadingFill = Pattern.parseShading(shading, null, xref,\n                resources, self.handler, self.pdfFunctionFactory);\n              var patternIR = shadingFill.getIR();\n              args = [patternIR];\n              fn = OPS.shadingFill;\n              break;\n            case OPS.setGState:\n              var dictName = args[0];\n              var extGState = resources.get('ExtGState');\n\n              if (!isDict(extGState) || !extGState.has(dictName.name)) {\n                break;\n              }\n\n              var gState = extGState.get(dictName.name);\n              next(self.setGState(resources, gState, operatorList, task,\n                                  stateManager));\n              return;\n            case OPS.moveTo:\n            case OPS.lineTo:\n            case OPS.curveTo:\n            case OPS.curveTo2:\n            case OPS.curveTo3:\n            case OPS.closePath:\n              self.buildPath(operatorList, fn, args);\n              continue;\n            case OPS.rectangle:\n              self.buildPath(operatorList, fn, args);\n              continue;\n            case OPS.markPoint:\n            case OPS.markPointProps:\n            case OPS.beginMarkedContent:\n            case OPS.beginMarkedContentProps:\n            case OPS.endMarkedContent:\n            case OPS.beginCompat:\n            case OPS.endCompat:\n              // Ignore operators where the corresponding handlers are known to\n              // be no-op in CanvasGraphics (display/canvas.js). This prevents\n              // serialization errors and is also a bit more efficient.\n              // We could also try to serialize all objects in a general way,\n              // e.g. as done in https://github.com/mozilla/pdf.js/pull/6266,\n              // but doing so is meaningless without knowing the semantics.\n              continue;\n            default:\n              // Note: Ignore the operator if it has `Dict` arguments, since\n              // those are non-serializable, otherwise postMessage will throw\n              // \"An object could not be cloned.\".\n              if (args !== null) {\n                for (i = 0, ii = args.length; i < ii; i++) {\n                  if (args[i] instanceof Dict) {\n                    break;\n                  }\n                }\n                if (i < ii) {\n                  warn('getOperatorList - ignoring operator: ' + fn);\n                  continue;\n                }\n              }\n          }\n          operatorList.addOp(fn, args);\n        }\n        if (stop) {\n          next(deferred);\n          return;\n        }\n        // Some PDFs don't close all restores inside object/form.\n        // Closing those for them.\n        closePendingRestoreOPS();\n        resolve();\n      }).catch((reason) => {\n        if (this.options.ignoreErrors) {\n          // Error(s) in the OperatorList -- sending unsupported feature\n          // notification and allow rendering to continue.\n          this.handler.send('UnsupportedFeature',\n                            { featureId: UNSUPPORTED_FEATURES.unknown, });\n          warn(`getOperatorList - ignoring errors during \"${task.name}\" ` +\n               `task: \"${reason}\".`);\n\n          closePendingRestoreOPS();\n          return;\n        }\n        throw reason;\n      });\n    },\n\n    getTextContent({ stream, task, resources, stateManager = null,\n                     normalizeWhitespace = false, combineTextItems = false,\n                     sink, seenStyles = Object.create(null), }) {\n      // Ensure that `resources`/`stateManager` is correctly initialized,\n      // even if the provided parameter is e.g. `null`.\n      resources = resources || Dict.empty;\n      stateManager = stateManager || new StateManager(new TextState());\n\n      var WhitespaceRegexp = /\\s/g;\n\n      var textContent = {\n        items: [],\n        styles: Object.create(null),\n      };\n      var textContentItem = {\n        initialized: false,\n        str: [],\n        width: 0,\n        height: 0,\n        vertical: false,\n        lastAdvanceWidth: 0,\n        lastAdvanceHeight: 0,\n        textAdvanceScale: 0,\n        spaceWidth: 0,\n        fakeSpaceMin: Infinity,\n        fakeMultiSpaceMin: Infinity,\n        fakeMultiSpaceMax: -0,\n        textRunBreakAllowed: false,\n        transform: null,\n        fontName: null,\n      };\n      var SPACE_FACTOR = 0.3;\n      var MULTI_SPACE_FACTOR = 1.5;\n      var MULTI_SPACE_FACTOR_MAX = 4;\n\n      var self = this;\n      var xref = this.xref;\n\n      // The xobj is parsed iff it's needed, e.g. if there is a `DO` cmd.\n      var xobjs = null;\n      var skipEmptyXObjs = Object.create(null);\n\n      var preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager);\n\n      var textState;\n\n      function ensureTextContentItem() {\n        if (textContentItem.initialized) {\n          return textContentItem;\n        }\n        var font = textState.font;\n        if (!(font.loadedName in seenStyles)) {\n          seenStyles[font.loadedName] = true;\n          textContent.styles[font.loadedName] = {\n            fontFamily: font.fallbackName,\n            ascent: font.ascent,\n            descent: font.descent,\n            vertical: font.vertical,\n          };\n        }\n        textContentItem.fontName = font.loadedName;\n\n        // 9.4.4 Text Space Details\n        var tsm = [textState.fontSize * textState.textHScale, 0,\n                   0, textState.fontSize,\n                   0, textState.textRise];\n\n        if (font.isType3Font &&\n            textState.fontMatrix !== FONT_IDENTITY_MATRIX &&\n            textState.fontSize === 1) {\n          var glyphHeight = font.bbox[3] - font.bbox[1];\n          if (glyphHeight > 0) {\n            glyphHeight = glyphHeight * textState.fontMatrix[3];\n            tsm[3] *= glyphHeight;\n          }\n        }\n\n        var trm = Util.transform(textState.ctm,\n                                 Util.transform(textState.textMatrix, tsm));\n        textContentItem.transform = trm;\n        if (!font.vertical) {\n          textContentItem.width = 0;\n          textContentItem.height = Math.sqrt(trm[2] * trm[2] + trm[3] * trm[3]);\n          textContentItem.vertical = false;\n        } else {\n          textContentItem.width = Math.sqrt(trm[0] * trm[0] + trm[1] * trm[1]);\n          textContentItem.height = 0;\n          textContentItem.vertical = true;\n        }\n\n        var a = textState.textLineMatrix[0];\n        var b = textState.textLineMatrix[1];\n        var scaleLineX = Math.sqrt(a * a + b * b);\n        a = textState.ctm[0];\n        b = textState.ctm[1];\n        var scaleCtmX = Math.sqrt(a * a + b * b);\n        textContentItem.textAdvanceScale = scaleCtmX * scaleLineX;\n        textContentItem.lastAdvanceWidth = 0;\n        textContentItem.lastAdvanceHeight = 0;\n\n        var spaceWidth = font.spaceWidth / 1000 * textState.fontSize;\n        if (spaceWidth) {\n          textContentItem.spaceWidth = spaceWidth;\n          textContentItem.fakeSpaceMin = spaceWidth * SPACE_FACTOR;\n          textContentItem.fakeMultiSpaceMin = spaceWidth * MULTI_SPACE_FACTOR;\n          textContentItem.fakeMultiSpaceMax =\n            spaceWidth * MULTI_SPACE_FACTOR_MAX;\n          // It's okay for monospace fonts to fake as much space as needed.\n          textContentItem.textRunBreakAllowed = !font.isMonospace;\n        } else {\n          textContentItem.spaceWidth = 0;\n          textContentItem.fakeSpaceMin = Infinity;\n          textContentItem.fakeMultiSpaceMin = Infinity;\n          textContentItem.fakeMultiSpaceMax = 0;\n          textContentItem.textRunBreakAllowed = false;\n        }\n\n        textContentItem.initialized = true;\n        return textContentItem;\n      }\n\n      function replaceWhitespace(str) {\n        // Replaces all whitespaces with standard spaces (0x20), to avoid\n        // alignment issues between the textLayer and the canvas if the text\n        // contains e.g. tabs (fixes issue6612.pdf).\n        var i = 0, ii = str.length, code;\n        while (i < ii && (code = str.charCodeAt(i)) >= 0x20 && code <= 0x7F) {\n          i++;\n        }\n        return (i < ii ? str.replace(WhitespaceRegexp, ' ') : str);\n      }\n\n      function runBidiTransform(textChunk) {\n        var str = textChunk.str.join('');\n        var bidiResult = bidi(str, -1, textChunk.vertical);\n        return {\n          str: (normalizeWhitespace ? replaceWhitespace(bidiResult.str) :\n                                      bidiResult.str),\n          dir: bidiResult.dir,\n          width: textChunk.width,\n          height: textChunk.height,\n          transform: textChunk.transform,\n          fontName: textChunk.fontName,\n        };\n      }\n\n      function handleSetFont(fontName, fontRef) {\n        return self.loadFont(fontName, fontRef, resources).\n          then(function (translated) {\n            textState.font = translated.font;\n            textState.fontMatrix = translated.font.fontMatrix ||\n              FONT_IDENTITY_MATRIX;\n          });\n      }\n\n      function buildTextContentItem(chars) {\n        var font = textState.font;\n        var textChunk = ensureTextContentItem();\n        var width = 0;\n        var height = 0;\n        var glyphs = font.charsToGlyphs(chars);\n        for (var i = 0; i < glyphs.length; i++) {\n          var glyph = glyphs[i];\n          var glyphWidth = null;\n          if (font.vertical && glyph.vmetric) {\n            glyphWidth = glyph.vmetric[0];\n          } else {\n            glyphWidth = glyph.width;\n          }\n\n          var glyphUnicode = glyph.unicode;\n          var NormalizedUnicodes = getNormalizedUnicodes();\n          if (NormalizedUnicodes[glyphUnicode] !== undefined) {\n            glyphUnicode = NormalizedUnicodes[glyphUnicode];\n          }\n          glyphUnicode = reverseIfRtl(glyphUnicode);\n\n          var charSpacing = textState.charSpacing;\n          if (glyph.isSpace) {\n            var wordSpacing = textState.wordSpacing;\n            charSpacing += wordSpacing;\n            if (wordSpacing > 0) {\n              addFakeSpaces(wordSpacing, textChunk.str);\n            }\n          }\n\n          var tx = 0;\n          var ty = 0;\n          if (!font.vertical) {\n            var w0 = glyphWidth * textState.fontMatrix[0];\n            tx = (w0 * textState.fontSize + charSpacing) *\n                 textState.textHScale;\n            width += tx;\n          } else {\n            var w1 = glyphWidth * textState.fontMatrix[0];\n            ty = w1 * textState.fontSize + charSpacing;\n            height += ty;\n          }\n          textState.translateTextMatrix(tx, ty);\n\n          textChunk.str.push(glyphUnicode);\n        }\n\n        if (!font.vertical) {\n          textChunk.lastAdvanceWidth = width;\n          textChunk.width += width;\n        } else {\n          textChunk.lastAdvanceHeight = height;\n          textChunk.height += Math.abs(height);\n        }\n\n        return textChunk;\n      }\n\n      function addFakeSpaces(width, strBuf) {\n        if (width < textContentItem.fakeSpaceMin) {\n          return;\n        }\n        if (width < textContentItem.fakeMultiSpaceMin) {\n          strBuf.push(' ');\n          return;\n        }\n        var fakeSpaces = Math.round(width / textContentItem.spaceWidth);\n        while (fakeSpaces-- > 0) {\n          strBuf.push(' ');\n        }\n      }\n\n      function flushTextContentItem() {\n        if (!textContentItem.initialized) {\n          return;\n        }\n\n        // Do final text scaling\n        textContentItem.width *= textContentItem.textAdvanceScale;\n        textContentItem.height *= textContentItem.textAdvanceScale;\n        textContent.items.push(runBidiTransform(textContentItem));\n\n        textContentItem.initialized = false;\n        textContentItem.str.length = 0;\n      }\n\n      function enqueueChunk() {\n        let length = textContent.items.length;\n        if (length > 0) {\n          sink.enqueue(textContent, length);\n          textContent.items = [];\n          textContent.styles = Object.create(null);\n        }\n      }\n\n      var timeSlotManager = new TimeSlotManager();\n\n      return new Promise(function promiseBody(resolve, reject) {\n        let next = function (promise) {\n          enqueueChunk();\n          Promise.all([promise, sink.ready]).then(function () {\n            try {\n              promiseBody(resolve, reject);\n            } catch (ex) {\n              reject(ex);\n            }\n          }, reject);\n        };\n        task.ensureNotTerminated();\n        timeSlotManager.reset();\n        var stop, operation = {}, args = [];\n        while (!(stop = timeSlotManager.check())) {\n          // The arguments parsed by read() are not used beyond this loop, so\n          // we can reuse the same array on every iteration, thus avoiding\n          // unnecessary allocations.\n          args.length = 0;\n          operation.args = args;\n          if (!(preprocessor.read(operation))) {\n            break;\n          }\n          textState = stateManager.state;\n          var fn = operation.fn;\n          args = operation.args;\n          var advance, diff;\n\n          switch (fn | 0) {\n            case OPS.setFont:\n              // Optimization to ignore multiple identical Tf commands.\n              var fontNameArg = args[0].name, fontSizeArg = args[1];\n              if (textState.font && fontNameArg === textState.fontName &&\n                  fontSizeArg === textState.fontSize) {\n                break;\n              }\n\n              flushTextContentItem();\n              textState.fontName = fontNameArg;\n              textState.fontSize = fontSizeArg;\n              next(handleSetFont(fontNameArg, null));\n              return;\n            case OPS.setTextRise:\n              flushTextContentItem();\n              textState.textRise = args[0];\n              break;\n            case OPS.setHScale:\n              flushTextContentItem();\n              textState.textHScale = args[0] / 100;\n              break;\n            case OPS.setLeading:\n              flushTextContentItem();\n              textState.leading = args[0];\n              break;\n            case OPS.moveText:\n              // Optimization to treat same line movement as advance\n              var isSameTextLine = !textState.font ? false :\n                ((textState.font.vertical ? args[0] : args[1]) === 0);\n              advance = args[0] - args[1];\n              if (combineTextItems &&\n                  isSameTextLine && textContentItem.initialized &&\n                  advance > 0 &&\n                  advance <= textContentItem.fakeMultiSpaceMax) {\n                textState.translateTextLineMatrix(args[0], args[1]);\n                textContentItem.width +=\n                  (args[0] - textContentItem.lastAdvanceWidth);\n                textContentItem.height +=\n                  (args[1] - textContentItem.lastAdvanceHeight);\n                diff = (args[0] - textContentItem.lastAdvanceWidth) -\n                       (args[1] - textContentItem.lastAdvanceHeight);\n                addFakeSpaces(diff, textContentItem.str);\n                break;\n              }\n\n              flushTextContentItem();\n              textState.translateTextLineMatrix(args[0], args[1]);\n              textState.textMatrix = textState.textLineMatrix.slice();\n              break;\n            case OPS.setLeadingMoveText:\n              flushTextContentItem();\n              textState.leading = -args[1];\n              textState.translateTextLineMatrix(args[0], args[1]);\n              textState.textMatrix = textState.textLineMatrix.slice();\n              break;\n            case OPS.nextLine:\n              flushTextContentItem();\n              textState.carriageReturn();\n              break;\n            case OPS.setTextMatrix:\n              // Optimization to treat same line movement as advance.\n              advance = textState.calcTextLineMatrixAdvance(\n                args[0], args[1], args[2], args[3], args[4], args[5]);\n              if (combineTextItems &&\n                  advance !== null && textContentItem.initialized &&\n                  advance.value > 0 &&\n                  advance.value <= textContentItem.fakeMultiSpaceMax) {\n                textState.translateTextLineMatrix(advance.width,\n                                                  advance.height);\n                textContentItem.width +=\n                  (advance.width - textContentItem.lastAdvanceWidth);\n                textContentItem.height +=\n                  (advance.height - textContentItem.lastAdvanceHeight);\n                diff = (advance.width - textContentItem.lastAdvanceWidth) -\n                       (advance.height - textContentItem.lastAdvanceHeight);\n                addFakeSpaces(diff, textContentItem.str);\n                break;\n              }\n\n              flushTextContentItem();\n              textState.setTextMatrix(args[0], args[1], args[2], args[3],\n                args[4], args[5]);\n              textState.setTextLineMatrix(args[0], args[1], args[2], args[3],\n                args[4], args[5]);\n              break;\n            case OPS.setCharSpacing:\n              textState.charSpacing = args[0];\n              break;\n            case OPS.setWordSpacing:\n              textState.wordSpacing = args[0];\n              break;\n            case OPS.beginText:\n              flushTextContentItem();\n              textState.textMatrix = IDENTITY_MATRIX.slice();\n              textState.textLineMatrix = IDENTITY_MATRIX.slice();\n              break;\n            case OPS.showSpacedText:\n              var items = args[0];\n              var offset;\n              for (var j = 0, jj = items.length; j < jj; j++) {\n                if (typeof items[j] === 'string') {\n                  buildTextContentItem(items[j]);\n                } else if (isNum(items[j])) {\n                  ensureTextContentItem();\n\n                  // PDF Specification 5.3.2 states:\n                  // The number is expressed in thousandths of a unit of text\n                  // space.\n                  // This amount is subtracted from the current horizontal or\n                  // vertical coordinate, depending on the writing mode.\n                  // In the default coordinate system, a positive adjustment\n                  // has the effect of moving the next glyph painted either to\n                  // the left or down by the given amount.\n                  advance = items[j] * textState.fontSize / 1000;\n                  var breakTextRun = false;\n                  if (textState.font.vertical) {\n                    offset = advance;\n                    textState.translateTextMatrix(0, offset);\n                    breakTextRun = textContentItem.textRunBreakAllowed &&\n                                   advance > textContentItem.fakeMultiSpaceMax;\n                    if (!breakTextRun) {\n                      // Value needs to be added to height to paint down.\n                      textContentItem.height += offset;\n                    }\n                  } else {\n                    advance = -advance;\n                    offset = advance * textState.textHScale;\n                    textState.translateTextMatrix(offset, 0);\n                    breakTextRun = textContentItem.textRunBreakAllowed &&\n                                   advance > textContentItem.fakeMultiSpaceMax;\n                    if (!breakTextRun) {\n                      // Value needs to be subtracted from width to paint left.\n                      textContentItem.width += offset;\n                    }\n                  }\n                  if (breakTextRun) {\n                    flushTextContentItem();\n                  } else if (advance > 0) {\n                    addFakeSpaces(advance, textContentItem.str);\n                  }\n                }\n              }\n              break;\n            case OPS.showText:\n              buildTextContentItem(args[0]);\n              break;\n            case OPS.nextLineShowText:\n              flushTextContentItem();\n              textState.carriageReturn();\n              buildTextContentItem(args[0]);\n              break;\n            case OPS.nextLineSetSpacingShowText:\n              flushTextContentItem();\n              textState.wordSpacing = args[0];\n              textState.charSpacing = args[1];\n              textState.carriageReturn();\n              buildTextContentItem(args[2]);\n              break;\n            case OPS.paintXObject:\n              flushTextContentItem();\n              if (!xobjs) {\n                xobjs = (resources.get('XObject') || Dict.empty);\n              }\n\n              var name = args[0].name;\n              if (name && skipEmptyXObjs[name] !== undefined) {\n                break;\n              }\n\n              next(new Promise(function(resolveXObject, rejectXObject) {\n                if (!name) {\n                  throw new FormatError('XObject must be referred to by name.');\n                }\n\n                let xobj = xobjs.get(name);\n                if (!xobj) {\n                  resolveXObject();\n                  return;\n                }\n                if (!isStream(xobj)) {\n                  throw new FormatError('XObject should be a stream');\n                }\n\n                let type = xobj.dict.get('Subtype');\n                if (!isName(type)) {\n                  throw new FormatError('XObject should have a Name subtype');\n                }\n\n                if (type.name !== 'Form') {\n                  skipEmptyXObjs[name] = true;\n                  resolveXObject();\n                  return;\n                }\n\n                // Use a new `StateManager` to prevent incorrect positioning of\n                // textItems *after* the Form XObject, since errors in the data\n                // can otherwise prevent `restore` operators from executing.\n                // NOTE: Only an issue when `options.ignoreErrors === true`.\n                let currentState = stateManager.state.clone();\n                let xObjStateManager = new StateManager(currentState);\n\n                let matrix = xobj.dict.getArray('Matrix');\n                if (Array.isArray(matrix) && matrix.length === 6) {\n                  xObjStateManager.transform(matrix);\n                }\n\n                // Enqueue the `textContent` chunk before parsing the /Form\n                // XObject.\n                enqueueChunk();\n                let sinkWrapper = {\n                  enqueueInvoked: false,\n\n                  enqueue(chunk, size) {\n                    this.enqueueInvoked = true;\n                    sink.enqueue(chunk, size);\n                  },\n\n                  get desiredSize() {\n                    return sink.desiredSize;\n                  },\n\n                  get ready() {\n                    return sink.ready;\n                  },\n                };\n\n                self.getTextContent({\n                  stream: xobj,\n                  task,\n                  resources: xobj.dict.get('Resources') || resources,\n                  stateManager: xObjStateManager,\n                  normalizeWhitespace,\n                  combineTextItems,\n                  sink: sinkWrapper,\n                  seenStyles,\n                }).then(function() {\n                  if (!sinkWrapper.enqueueInvoked) {\n                    skipEmptyXObjs[name] = true;\n                  }\n                  resolveXObject();\n                }, rejectXObject);\n              }).catch(function(reason) {\n                if (reason instanceof AbortException) {\n                  return;\n                }\n                if (self.options.ignoreErrors) {\n                  // Error(s) in the XObject -- allow text-extraction to\n                  // continue.\n                  warn(`getTextContent - ignoring XObject: \"${reason}\".`);\n                  return;\n                }\n                throw reason;\n              }));\n              return;\n            case OPS.setGState:\n              flushTextContentItem();\n              var dictName = args[0];\n              var extGState = resources.get('ExtGState');\n\n              if (!isDict(extGState) || !isName(dictName)) {\n                break;\n              }\n              var gState = extGState.get(dictName.name);\n              if (!isDict(gState)) {\n                break;\n              }\n              var gStateFont = gState.get('Font');\n              if (gStateFont) {\n                textState.fontName = null;\n                textState.fontSize = gStateFont[1];\n                next(handleSetFont(null, gStateFont[0]));\n                return;\n              }\n              break;\n          } // switch\n          if (textContent.items.length >= sink.desiredSize) {\n            // Wait for ready, if we reach highWaterMark.\n            stop = true;\n            break;\n          }\n        } // while\n        if (stop) {\n          next(deferred);\n          return;\n        }\n        flushTextContentItem();\n        enqueueChunk();\n        resolve();\n      }).catch((reason) => {\n        if (reason instanceof AbortException) {\n          return;\n        }\n        if (this.options.ignoreErrors) {\n          // Error(s) in the TextContent -- allow text-extraction to continue.\n          warn(`getTextContent - ignoring errors during \"${task.name}\" ` +\n               `task: \"${reason}\".`);\n\n          flushTextContentItem();\n          enqueueChunk();\n          return;\n        }\n        throw reason;\n      });\n    },\n\n    extractDataStructures:\n        function PartialEvaluator_extractDataStructures(dict, baseDict,\n                                                        properties) {\n      var xref = this.xref;\n      // 9.10.2\n      var toUnicode = (dict.get('ToUnicode') || baseDict.get('ToUnicode'));\n      var toUnicodePromise = toUnicode ?\n        this.readToUnicode(toUnicode) : Promise.resolve(undefined);\n\n      if (properties.composite) {\n        // CIDSystemInfo helps to match CID to glyphs\n        var cidSystemInfo = dict.get('CIDSystemInfo');\n        if (isDict(cidSystemInfo)) {\n          properties.cidSystemInfo = {\n            registry: stringToPDFString(cidSystemInfo.get('Registry')),\n            ordering: stringToPDFString(cidSystemInfo.get('Ordering')),\n            supplement: cidSystemInfo.get('Supplement'),\n          };\n        }\n\n        var cidToGidMap = dict.get('CIDToGIDMap');\n        if (isStream(cidToGidMap)) {\n          properties.cidToGidMap = this.readCidToGidMap(cidToGidMap);\n        }\n      }\n\n      // Based on 9.6.6 of the spec the encoding can come from multiple places\n      // and depends on the font type. The base encoding and differences are\n      // read here, but the encoding that is actually used is chosen during\n      // glyph mapping in the font.\n      // TODO: Loading the built in encoding in the font would allow the\n      // differences to be merged in here not require us to hold on to it.\n      var differences = [];\n      var baseEncodingName = null;\n      var encoding;\n      if (dict.has('Encoding')) {\n        encoding = dict.get('Encoding');\n        if (isDict(encoding)) {\n          baseEncodingName = encoding.get('BaseEncoding');\n          baseEncodingName = (isName(baseEncodingName) ?\n                              baseEncodingName.name : null);\n          // Load the differences between the base and original\n          if (encoding.has('Differences')) {\n            var diffEncoding = encoding.get('Differences');\n            var index = 0;\n            for (var j = 0, jj = diffEncoding.length; j < jj; j++) {\n              var data = xref.fetchIfRef(diffEncoding[j]);\n              if (isNum(data)) {\n                index = data;\n              } else if (isName(data)) {\n                differences[index++] = data.name;\n              } else {\n                throw new FormatError(\n                  `Invalid entry in 'Differences' array: ${data}`);\n              }\n            }\n          }\n        } else if (isName(encoding)) {\n          baseEncodingName = encoding.name;\n        } else {\n          throw new FormatError('Encoding is not a Name nor a Dict');\n        }\n        // According to table 114 if the encoding is a named encoding it must be\n        // one of these predefined encodings.\n        if ((baseEncodingName !== 'MacRomanEncoding' &&\n             baseEncodingName !== 'MacExpertEncoding' &&\n             baseEncodingName !== 'WinAnsiEncoding')) {\n          baseEncodingName = null;\n        }\n      }\n\n      if (baseEncodingName) {\n        properties.defaultEncoding = getEncoding(baseEncodingName).slice();\n      } else {\n        var isSymbolicFont = !!(properties.flags & FontFlags.Symbolic);\n        var isNonsymbolicFont = !!(properties.flags & FontFlags.Nonsymbolic);\n        // According to \"Table 114\" in section \"9.6.6.1 General\" (under\n        // \"9.6.6 Character Encoding\") of the PDF specification, a Nonsymbolic\n        // font should use the `StandardEncoding` if no encoding is specified.\n        encoding = StandardEncoding;\n        if (properties.type === 'TrueType' && !isNonsymbolicFont) {\n          encoding = WinAnsiEncoding;\n        }\n        // The Symbolic attribute can be misused for regular fonts\n        // Heuristic: we have to check if the font is a standard one also\n        if (isSymbolicFont) {\n          encoding = MacRomanEncoding;\n          if (!properties.file) {\n            if (/Symbol/i.test(properties.name)) {\n              encoding = SymbolSetEncoding;\n            } else if (/Dingbats/i.test(properties.name)) {\n              encoding = ZapfDingbatsEncoding;\n            }\n          }\n        }\n        properties.defaultEncoding = encoding;\n      }\n\n      properties.differences = differences;\n      properties.baseEncodingName = baseEncodingName;\n      properties.hasEncoding = !!baseEncodingName || differences.length > 0;\n      properties.dict = dict;\n      return toUnicodePromise.then((toUnicode) => {\n        properties.toUnicode = toUnicode;\n        return this.buildToUnicode(properties);\n      }).then(function (toUnicode) {\n        properties.toUnicode = toUnicode;\n        return properties;\n      });\n    },\n\n    /**\n     * @returns {ToUnicodeMap}\n     * @private\n     */\n    _buildSimpleFontToUnicode(properties) {\n      assert(!properties.composite, 'Must be a simple font.');\n\n      let toUnicode = [], charcode, glyphName;\n      let encoding = properties.defaultEncoding.slice();\n      let baseEncodingName = properties.baseEncodingName;\n      // Merge in the differences array.\n      let differences = properties.differences;\n      for (charcode in differences) {\n        glyphName = differences[charcode];\n        if (glyphName === '.notdef') {\n          // Skip .notdef to prevent rendering errors, e.g. boxes appearing\n          // where there should be spaces (fixes issue5256.pdf).\n          continue;\n        }\n        encoding[charcode] = glyphName;\n      }\n      let glyphsUnicodeMap = getGlyphsUnicode();\n      for (charcode in encoding) {\n        // a) Map the character code to a character name.\n        glyphName = encoding[charcode];\n        // b) Look up the character name in the Adobe Glyph List (see the\n        //    Bibliography) to obtain the corresponding Unicode value.\n        if (glyphName === '') {\n          continue;\n        } else if (glyphsUnicodeMap[glyphName] === undefined) {\n          // (undocumented) c) Few heuristics to recognize unknown glyphs\n          // NOTE: Adobe Reader does not do this step, but OSX Preview does\n          let code = 0;\n          switch (glyphName[0]) {\n            case 'G': // Gxx glyph\n              if (glyphName.length === 3) {\n                code = parseInt(glyphName.substring(1), 16);\n              }\n              break;\n            case 'g': // g00xx glyph\n              if (glyphName.length === 5) {\n                code = parseInt(glyphName.substring(1), 16);\n              }\n              break;\n            case 'C': // Cddd glyph\n            case 'c': // cddd glyph\n              if (glyphName.length >= 3) {\n                code = +glyphName.substring(1);\n              }\n              break;\n            default:\n              // 'uniXXXX'/'uXXXX{XX}' glyphs\n              let unicode = getUnicodeForGlyph(glyphName, glyphsUnicodeMap);\n              if (unicode !== -1) {\n                code = unicode;\n              }\n          }\n          if (code) {\n            // If `baseEncodingName` is one the predefined encodings, and `code`\n            // equals `charcode`, using the glyph defined in the baseEncoding\n            // seems to yield a better `toUnicode` mapping (fixes issue 5070).\n            if (baseEncodingName && code === +charcode) {\n              let baseEncoding = getEncoding(baseEncodingName);\n              if (baseEncoding && (glyphName = baseEncoding[charcode])) {\n                toUnicode[charcode] =\n                  String.fromCharCode(glyphsUnicodeMap[glyphName]);\n                continue;\n              }\n            }\n            toUnicode[charcode] = String.fromCharCode(code);\n          }\n          continue;\n        }\n        toUnicode[charcode] = String.fromCharCode(glyphsUnicodeMap[glyphName]);\n      }\n      return new ToUnicodeMap(toUnicode);\n    },\n\n    /**\n     * Builds a char code to unicode map based on section 9.10 of the spec.\n     * @param {Object} properties Font properties object.\n     * @return {Promise} A Promise that is resolved with a\n     *   {ToUnicodeMap|IdentityToUnicodeMap} object.\n     */\n    buildToUnicode(properties) {\n      properties.hasIncludedToUnicodeMap =\n        !!properties.toUnicode && properties.toUnicode.length > 0;\n\n      // Section 9.10.2 Mapping Character Codes to Unicode Values\n      if (properties.hasIncludedToUnicodeMap) {\n        // Some fonts contain incomplete ToUnicode data, causing issues with\n        // text-extraction. For simple fonts, containing encoding information,\n        // use a fallback ToUnicode map to improve this (fixes issue8229.pdf).\n        if (!properties.composite && properties.hasEncoding) {\n          properties.fallbackToUnicode =\n            this._buildSimpleFontToUnicode(properties);\n        }\n\n        return Promise.resolve(properties.toUnicode);\n      }\n\n      // According to the spec if the font is a simple font we should only map\n      // to unicode if the base encoding is MacRoman, MacExpert, or WinAnsi or\n      // the differences array only contains adobe standard or symbol set names,\n      // in pratice it seems better to always try to create a toUnicode map\n      // based of the default encoding.\n      if (!properties.composite /* is simple font */) {\n        return Promise.resolve(this._buildSimpleFontToUnicode(properties));\n      }\n\n      // If the font is a composite font that uses one of the predefined CMaps\n      // listed in Table 118 (except Identity鈥揌 and Identity鈥揤) or whose\n      // descendant CIDFont uses the Adobe-GB1, Adobe-CNS1, Adobe-Japan1, or\n      // Adobe-Korea1 character collection:\n      if (properties.composite && (\n           (properties.cMap.builtInCMap &&\n            !(properties.cMap instanceof IdentityCMap)) ||\n           (properties.cidSystemInfo.registry === 'Adobe' &&\n             (properties.cidSystemInfo.ordering === 'GB1' ||\n              properties.cidSystemInfo.ordering === 'CNS1' ||\n              properties.cidSystemInfo.ordering === 'Japan1' ||\n              properties.cidSystemInfo.ordering === 'Korea1')))) {\n        // Then:\n        // a) Map the character code to a character identifier (CID) according\n        // to the font鈥檚 CMap.\n        // b) Obtain the registry and ordering of the character collection used\n        // by the font鈥檚 CMap (for example, Adobe and Japan1) from its\n        // CIDSystemInfo dictionary.\n        let registry = properties.cidSystemInfo.registry;\n        let ordering = properties.cidSystemInfo.ordering;\n        // c) Construct a second CMap name by concatenating the registry and\n        // ordering obtained in step (b) in the format registry鈥搊rdering鈥揢CS2\n        // (for example, Adobe鈥揓apan1鈥揢CS2).\n        let ucs2CMapName = Name.get(registry + '-' + ordering + '-UCS2');\n        // d) Obtain the CMap with the name constructed in step (c) (available\n        // from the ASN Web site; see the Bibliography).\n        return CMapFactory.create({\n          encoding: ucs2CMapName,\n          fetchBuiltInCMap: this.fetchBuiltInCMap,\n          useCMap: null,\n        }).then(function (ucs2CMap) {\n          let cMap = properties.cMap;\n          let toUnicode = [];\n          cMap.forEach(function(charcode, cid) {\n            if (cid > 0xffff) {\n              throw new FormatError('Max size of CID is 65,535');\n            }\n            // e) Map the CID obtained in step (a) according to the CMap\n            // obtained in step (d), producing a Unicode value.\n            let ucs2 = ucs2CMap.lookup(cid);\n            if (ucs2) {\n              toUnicode[charcode] =\n                String.fromCharCode((ucs2.charCodeAt(0) << 8) +\n                                    ucs2.charCodeAt(1));\n            }\n          });\n          return new ToUnicodeMap(toUnicode);\n        });\n      }\n\n      // The viewer's choice, just use an identity map.\n      return Promise.resolve(new IdentityToUnicodeMap(properties.firstChar,\n                                                      properties.lastChar));\n    },\n\n    readToUnicode: function PartialEvaluator_readToUnicode(toUnicode) {\n      var cmapObj = toUnicode;\n      if (isName(cmapObj)) {\n        return CMapFactory.create({\n          encoding: cmapObj,\n          fetchBuiltInCMap: this.fetchBuiltInCMap,\n          useCMap: null,\n        }).then(function (cmap) {\n          if (cmap instanceof IdentityCMap) {\n            return new IdentityToUnicodeMap(0, 0xFFFF);\n          }\n          return new ToUnicodeMap(cmap.getMap());\n        });\n      } else if (isStream(cmapObj)) {\n        return CMapFactory.create({\n          encoding: cmapObj,\n          fetchBuiltInCMap: this.fetchBuiltInCMap,\n          useCMap: null,\n        }).then(function (cmap) {\n          if (cmap instanceof IdentityCMap) {\n            return new IdentityToUnicodeMap(0, 0xFFFF);\n          }\n          var map = new Array(cmap.length);\n          // Convert UTF-16BE\n          // NOTE: cmap can be a sparse array, so use forEach instead of for(;;)\n          // to iterate over all keys.\n          cmap.forEach(function(charCode, token) {\n            var str = [];\n            for (var k = 0; k < token.length; k += 2) {\n              var w1 = (token.charCodeAt(k) << 8) | token.charCodeAt(k + 1);\n              if ((w1 & 0xF800) !== 0xD800) { // w1 < 0xD800 || w1 > 0xDFFF\n                str.push(w1);\n                continue;\n              }\n              k += 2;\n              var w2 = (token.charCodeAt(k) << 8) | token.charCodeAt(k + 1);\n              str.push(((w1 & 0x3ff) << 10) + (w2 & 0x3ff) + 0x10000);\n            }\n            map[charCode] = String.fromCharCode.apply(String, str);\n          });\n          return new ToUnicodeMap(map);\n        });\n      }\n      return Promise.resolve(null);\n    },\n\n    readCidToGidMap: function PartialEvaluator_readCidToGidMap(cidToGidStream) {\n      // Extract the encoding from the CIDToGIDMap\n      var glyphsData = cidToGidStream.getBytes();\n\n      // Set encoding 0 to later verify the font has an encoding\n      var result = [];\n      for (var j = 0, jj = glyphsData.length; j < jj; j++) {\n        var glyphID = (glyphsData[j++] << 8) | glyphsData[j];\n        if (glyphID === 0) {\n          continue;\n        }\n        var code = j >> 1;\n        result[code] = glyphID;\n      }\n      return result;\n    },\n\n    extractWidths: function PartialEvaluator_extractWidths(dict, descriptor,\n                                                           properties) {\n      var xref = this.xref;\n      var glyphsWidths = [];\n      var defaultWidth = 0;\n      var glyphsVMetrics = [];\n      var defaultVMetrics;\n      var i, ii, j, jj, start, code, widths;\n      if (properties.composite) {\n        defaultWidth = dict.has('DW') ? dict.get('DW') : 1000;\n\n        widths = dict.get('W');\n        if (widths) {\n          for (i = 0, ii = widths.length; i < ii; i++) {\n            start = xref.fetchIfRef(widths[i++]);\n            code = xref.fetchIfRef(widths[i]);\n            if (Array.isArray(code)) {\n              for (j = 0, jj = code.length; j < jj; j++) {\n                glyphsWidths[start++] = xref.fetchIfRef(code[j]);\n              }\n            } else {\n              var width = xref.fetchIfRef(widths[++i]);\n              for (j = start; j <= code; j++) {\n                glyphsWidths[j] = width;\n              }\n            }\n          }\n        }\n\n        if (properties.vertical) {\n          var vmetrics = dict.getArray('DW2') || [880, -1000];\n          defaultVMetrics = [vmetrics[1], defaultWidth * 0.5, vmetrics[0]];\n          vmetrics = dict.get('W2');\n          if (vmetrics) {\n            for (i = 0, ii = vmetrics.length; i < ii; i++) {\n              start = xref.fetchIfRef(vmetrics[i++]);\n              code = xref.fetchIfRef(vmetrics[i]);\n              if (Array.isArray(code)) {\n                for (j = 0, jj = code.length; j < jj; j++) {\n                  glyphsVMetrics[start++] = [\n                    xref.fetchIfRef(code[j++]),\n                    xref.fetchIfRef(code[j++]),\n                    xref.fetchIfRef(code[j])\n                  ];\n                }\n              } else {\n                var vmetric = [\n                  xref.fetchIfRef(vmetrics[++i]),\n                  xref.fetchIfRef(vmetrics[++i]),\n                  xref.fetchIfRef(vmetrics[++i])\n                ];\n                for (j = start; j <= code; j++) {\n                  glyphsVMetrics[j] = vmetric;\n                }\n              }\n            }\n          }\n        }\n      } else {\n        var firstChar = properties.firstChar;\n        widths = dict.get('Widths');\n        if (widths) {\n          j = firstChar;\n          for (i = 0, ii = widths.length; i < ii; i++) {\n            glyphsWidths[j++] = xref.fetchIfRef(widths[i]);\n          }\n          defaultWidth = (parseFloat(descriptor.get('MissingWidth')) || 0);\n        } else {\n          // Trying get the BaseFont metrics (see comment above).\n          var baseFontName = dict.get('BaseFont');\n          if (isName(baseFontName)) {\n            var metrics = this.getBaseFontMetrics(baseFontName.name);\n\n            glyphsWidths = this.buildCharCodeToWidth(metrics.widths,\n                                                     properties);\n            defaultWidth = metrics.defaultWidth;\n          }\n        }\n      }\n\n      // Heuristic: detection of monospace font by checking all non-zero widths\n      var isMonospace = true;\n      var firstWidth = defaultWidth;\n      for (var glyph in glyphsWidths) {\n        var glyphWidth = glyphsWidths[glyph];\n        if (!glyphWidth) {\n          continue;\n        }\n        if (!firstWidth) {\n          firstWidth = glyphWidth;\n          continue;\n        }\n        if (firstWidth !== glyphWidth) {\n          isMonospace = false;\n          break;\n        }\n      }\n      if (isMonospace) {\n        properties.flags |= FontFlags.FixedPitch;\n      }\n\n      properties.defaultWidth = defaultWidth;\n      properties.widths = glyphsWidths;\n      properties.defaultVMetrics = defaultVMetrics;\n      properties.vmetrics = glyphsVMetrics;\n    },\n\n    isSerifFont: function PartialEvaluator_isSerifFont(baseFontName) {\n      // Simulating descriptor flags attribute\n      var fontNameWoStyle = baseFontName.split('-')[0];\n      return (fontNameWoStyle in getSerifFonts()) ||\n              (fontNameWoStyle.search(/serif/gi) !== -1);\n    },\n\n    getBaseFontMetrics: function PartialEvaluator_getBaseFontMetrics(name) {\n      var defaultWidth = 0;\n      var widths = [];\n      var monospace = false;\n      var stdFontMap = getStdFontMap();\n      var lookupName = (stdFontMap[name] || name);\n      var Metrics = getMetrics();\n\n      if (!(lookupName in Metrics)) {\n        // Use default fonts for looking up font metrics if the passed\n        // font is not a base font\n        if (this.isSerifFont(name)) {\n          lookupName = 'Times-Roman';\n        } else {\n          lookupName = 'Helvetica';\n        }\n      }\n      var glyphWidths = Metrics[lookupName];\n\n      if (isNum(glyphWidths)) {\n        defaultWidth = glyphWidths;\n        monospace = true;\n      } else {\n        widths = glyphWidths(); // expand lazy widths array\n      }\n\n      return {\n        defaultWidth,\n        monospace,\n        widths,\n      };\n    },\n\n    buildCharCodeToWidth:\n        function PartialEvaluator_bulildCharCodeToWidth(widthsByGlyphName,\n                                                        properties) {\n      var widths = Object.create(null);\n      var differences = properties.differences;\n      var encoding = properties.defaultEncoding;\n      for (var charCode = 0; charCode < 256; charCode++) {\n        if (charCode in differences &&\n            widthsByGlyphName[differences[charCode]]) {\n          widths[charCode] = widthsByGlyphName[differences[charCode]];\n          continue;\n        }\n        if (charCode in encoding && widthsByGlyphName[encoding[charCode]]) {\n          widths[charCode] = widthsByGlyphName[encoding[charCode]];\n          continue;\n        }\n      }\n      return widths;\n    },\n\n    preEvaluateFont: function PartialEvaluator_preEvaluateFont(dict) {\n      var baseDict = dict;\n      var type = dict.get('Subtype');\n      if (!isName(type)) {\n        throw new FormatError('invalid font Subtype');\n      }\n\n      var composite = false;\n      var uint8array;\n      if (type.name === 'Type0') {\n        // If font is a composite\n        //  - get the descendant font\n        //  - set the type according to the descendant font\n        //  - get the FontDescriptor from the descendant font\n        var df = dict.get('DescendantFonts');\n        if (!df) {\n          throw new FormatError('Descendant fonts are not specified');\n        }\n        dict = (Array.isArray(df) ? this.xref.fetchIfRef(df[0]) : df);\n\n        type = dict.get('Subtype');\n        if (!isName(type)) {\n          throw new FormatError('invalid font Subtype');\n        }\n        composite = true;\n      }\n\n      var descriptor = dict.get('FontDescriptor');\n      if (descriptor) {\n        var hash = new MurmurHash3_64();\n        var encoding = baseDict.getRaw('Encoding');\n        if (isName(encoding)) {\n          hash.update(encoding.name);\n        } else if (isRef(encoding)) {\n          hash.update(encoding.toString());\n        } else if (isDict(encoding)) {\n          var keys = encoding.getKeys();\n          for (var i = 0, ii = keys.length; i < ii; i++) {\n            var entry = encoding.getRaw(keys[i]);\n            if (isName(entry)) {\n              hash.update(entry.name);\n            } else if (isRef(entry)) {\n              hash.update(entry.toString());\n            } else if (Array.isArray(entry)) {\n              // 'Differences' array (fixes bug1157493.pdf).\n              var diffLength = entry.length, diffBuf = new Array(diffLength);\n\n              for (var j = 0; j < diffLength; j++) {\n                var diffEntry = entry[j];\n                if (isName(diffEntry)) {\n                  diffBuf[j] = diffEntry.name;\n                } else if (isNum(diffEntry) || isRef(diffEntry)) {\n                  diffBuf[j] = diffEntry.toString();\n                }\n              }\n              hash.update(diffBuf.join());\n            }\n          }\n        }\n\n        var toUnicode = dict.get('ToUnicode') || baseDict.get('ToUnicode');\n        if (isStream(toUnicode)) {\n          var stream = toUnicode.str || toUnicode;\n          uint8array = stream.buffer ?\n            new Uint8Array(stream.buffer.buffer, 0, stream.bufferLength) :\n            new Uint8Array(stream.bytes.buffer,\n                           stream.start, stream.end - stream.start);\n          hash.update(uint8array);\n\n        } else if (isName(toUnicode)) {\n          hash.update(toUnicode.name);\n        }\n\n        var widths = dict.get('Widths') || baseDict.get('Widths');\n        if (widths) {\n          uint8array = new Uint8Array(new Uint32Array(widths).buffer);\n          hash.update(uint8array);\n        }\n      }\n\n      return {\n        descriptor,\n        dict,\n        baseDict,\n        composite,\n        type: type.name,\n        hash: hash ? hash.hexdigest() : '',\n      };\n    },\n\n    translateFont: function PartialEvaluator_translateFont(preEvaluatedFont) {\n      var baseDict = preEvaluatedFont.baseDict;\n      var dict = preEvaluatedFont.dict;\n      var composite = preEvaluatedFont.composite;\n      var descriptor = preEvaluatedFont.descriptor;\n      var type = preEvaluatedFont.type;\n      var maxCharIndex = (composite ? 0xFFFF : 0xFF);\n      var properties;\n\n      if (!descriptor) {\n        if (type === 'Type3') {\n          // FontDescriptor is only required for Type3 fonts when the document\n          // is a tagged pdf. Create a barbebones one to get by.\n          descriptor = new Dict(null);\n          descriptor.set('FontName', Name.get(type));\n          descriptor.set('FontBBox', dict.getArray('FontBBox'));\n        } else {\n          // Before PDF 1.5 if the font was one of the base 14 fonts, having a\n          // FontDescriptor was not required.\n          // This case is here for compatibility.\n          var baseFontName = dict.get('BaseFont');\n          if (!isName(baseFontName)) {\n            throw new FormatError('Base font is not specified');\n          }\n\n          // Using base font name as a font name.\n          baseFontName = baseFontName.name.replace(/[,_]/g, '-');\n          var metrics = this.getBaseFontMetrics(baseFontName);\n\n          // Simulating descriptor flags attribute\n          var fontNameWoStyle = baseFontName.split('-')[0];\n          var flags =\n            (this.isSerifFont(fontNameWoStyle) ? FontFlags.Serif : 0) |\n            (metrics.monospace ? FontFlags.FixedPitch : 0) |\n            (getSymbolsFonts()[fontNameWoStyle] ? FontFlags.Symbolic :\n                                                  FontFlags.Nonsymbolic);\n\n          properties = {\n            type,\n            name: baseFontName,\n            widths: metrics.widths,\n            defaultWidth: metrics.defaultWidth,\n            flags,\n            firstChar: 0,\n            lastChar: maxCharIndex,\n          };\n          return this.extractDataStructures(dict, dict, properties).\n            then((properties) => {\n              properties.widths = this.buildCharCodeToWidth(metrics.widths,\n                                                            properties);\n              return new Font(baseFontName, null, properties);\n            });\n        }\n      }\n\n      // According to the spec if 'FontDescriptor' is declared, 'FirstChar',\n      // 'LastChar' and 'Widths' should exist too, but some PDF encoders seem\n      // to ignore this rule when a variant of a standard font is used.\n      // TODO Fill the width array depending on which of the base font this is\n      // a variant.\n      var firstChar = (dict.get('FirstChar') || 0);\n      var lastChar = (dict.get('LastChar') || maxCharIndex);\n\n      var fontName = descriptor.get('FontName');\n      var baseFont = dict.get('BaseFont');\n      // Some bad PDFs have a string as the font name.\n      if (isString(fontName)) {\n        fontName = Name.get(fontName);\n      }\n      if (isString(baseFont)) {\n        baseFont = Name.get(baseFont);\n      }\n\n      if (type !== 'Type3') {\n        var fontNameStr = fontName && fontName.name;\n        var baseFontStr = baseFont && baseFont.name;\n        if (fontNameStr !== baseFontStr) {\n          info('The FontDescriptor\\'s FontName is \"' + fontNameStr +\n               '\" but should be the same as the Font\\'s BaseFont \"' +\n               baseFontStr + '\"');\n          // Workaround for cases where e.g. fontNameStr = 'Arial' and\n          // baseFontStr = 'Arial,Bold' (needed when no font file is embedded).\n          if (fontNameStr && baseFontStr &&\n              baseFontStr.indexOf(fontNameStr) === 0) {\n            fontName = baseFont;\n          }\n        }\n      }\n      fontName = (fontName || baseFont);\n\n      if (!isName(fontName)) {\n        throw new FormatError('invalid font name');\n      }\n\n      var fontFile = descriptor.get('FontFile', 'FontFile2', 'FontFile3');\n      if (fontFile) {\n        if (fontFile.dict) {\n          var subtype = fontFile.dict.get('Subtype');\n          if (subtype) {\n            subtype = subtype.name;\n          }\n          var length1 = fontFile.dict.get('Length1');\n          var length2 = fontFile.dict.get('Length2');\n          var length3 = fontFile.dict.get('Length3');\n        }\n      }\n\n      properties = {\n        type,\n        name: fontName.name,\n        subtype,\n        file: fontFile,\n        length1,\n        length2,\n        length3,\n        loadedName: baseDict.loadedName,\n        composite,\n        wideChars: composite,\n        fixedPitch: false,\n        fontMatrix: (dict.getArray('FontMatrix') || FONT_IDENTITY_MATRIX),\n        firstChar: firstChar || 0,\n        lastChar: (lastChar || maxCharIndex),\n        bbox: descriptor.getArray('FontBBox'),\n        ascent: descriptor.get('Ascent'),\n        descent: descriptor.get('Descent'),\n        xHeight: descriptor.get('XHeight'),\n        capHeight: descriptor.get('CapHeight'),\n        flags: descriptor.get('Flags'),\n        italicAngle: descriptor.get('ItalicAngle'),\n        isType3Font: false,\n      };\n\n      var cMapPromise;\n      if (composite) {\n        var cidEncoding = baseDict.get('Encoding');\n        if (isName(cidEncoding)) {\n          properties.cidEncoding = cidEncoding.name;\n        }\n        cMapPromise = CMapFactory.create({\n          encoding: cidEncoding,\n          fetchBuiltInCMap: this.fetchBuiltInCMap,\n          useCMap: null,\n        }).then(function (cMap) {\n          properties.cMap = cMap;\n          properties.vertical = properties.cMap.vertical;\n        });\n      } else {\n        cMapPromise = Promise.resolve(undefined);\n      }\n\n      return cMapPromise.then(() => {\n        return this.extractDataStructures(dict, baseDict, properties);\n      }).then((properties) => {\n        this.extractWidths(dict, descriptor, properties);\n\n        if (type === 'Type3') {\n          properties.isType3Font = true;\n        }\n        return new Font(fontName.name, fontFile, properties);\n      });\n    },\n  };\n\n  return PartialEvaluator;\n})();\n\nvar TranslatedFont = (function TranslatedFontClosure() {\n  function TranslatedFont(loadedName, font, dict) {\n    this.loadedName = loadedName;\n    this.font = font;\n    this.dict = dict;\n    this.type3Loaded = null;\n    this.sent = false;\n  }\n  TranslatedFont.prototype = {\n    send(handler) {\n      if (this.sent) {\n        return;\n      }\n      var fontData = this.font.exportData();\n      handler.send('commonobj', [\n        this.loadedName,\n        'Font',\n        fontData\n      ]);\n      this.sent = true;\n    },\n    loadType3Data(evaluator, resources, parentOperatorList, task) {\n      if (!this.font.isType3Font) {\n        throw new Error('Must be a Type3 font.');\n      }\n\n      if (this.type3Loaded) {\n        return this.type3Loaded;\n      }\n      // When parsing Type3 glyphs, always ignore them if there are errors.\n      // Compared to the parsing of e.g. an entire page, it doesn't really\n      // make sense to only be able to render a Type3 glyph partially.\n      var type3Options = Object.create(evaluator.options);\n      type3Options.ignoreErrors = false;\n      var type3Evaluator = evaluator.clone(type3Options);\n\n      var translatedFont = this.font;\n      var loadCharProcsPromise = Promise.resolve();\n      var charProcs = this.dict.get('CharProcs');\n      var fontResources = this.dict.get('Resources') || resources;\n      var charProcKeys = charProcs.getKeys();\n      var charProcOperatorList = Object.create(null);\n\n      for (var i = 0, n = charProcKeys.length; i < n; ++i) {\n        let key = charProcKeys[i];\n        loadCharProcsPromise = loadCharProcsPromise.then(function () {\n          var glyphStream = charProcs.get(key);\n          var operatorList = new OperatorList();\n          return type3Evaluator.getOperatorList({\n            stream: glyphStream,\n            task,\n            resources: fontResources,\n            operatorList,\n          }).then(function () {\n            charProcOperatorList[key] = operatorList.getIR();\n\n            // Add the dependencies to the parent operator list so they are\n            // resolved before sub operator list is executed synchronously.\n            parentOperatorList.addDependencies(operatorList.dependencies);\n          }).catch(function(reason) {\n            warn(`Type3 font resource \"${key}\" is not available.`);\n            var operatorList = new OperatorList();\n            charProcOperatorList[key] = operatorList.getIR();\n          });\n        });\n      }\n      this.type3Loaded = loadCharProcsPromise.then(function () {\n        translatedFont.charProcOperatorList = charProcOperatorList;\n      });\n      return this.type3Loaded;\n    },\n  };\n  return TranslatedFont;\n})();\n\nvar StateManager = (function StateManagerClosure() {\n  function StateManager(initialState) {\n    this.state = initialState;\n    this.stateStack = [];\n  }\n  StateManager.prototype = {\n    save() {\n      var old = this.state;\n      this.stateStack.push(this.state);\n      this.state = old.clone();\n    },\n    restore() {\n      var prev = this.stateStack.pop();\n      if (prev) {\n        this.state = prev;\n      }\n    },\n    transform(args) {\n      this.state.ctm = Util.transform(this.state.ctm, args);\n    },\n  };\n  return StateManager;\n})();\n\nvar TextState = (function TextStateClosure() {\n  function TextState() {\n    this.ctm = new Float32Array(IDENTITY_MATRIX);\n    this.fontName = null;\n    this.fontSize = 0;\n    this.font = null;\n    this.fontMatrix = FONT_IDENTITY_MATRIX;\n    this.textMatrix = IDENTITY_MATRIX.slice();\n    this.textLineMatrix = IDENTITY_MATRIX.slice();\n    this.charSpacing = 0;\n    this.wordSpacing = 0;\n    this.leading = 0;\n    this.textHScale = 1;\n    this.textRise = 0;\n  }\n\n  TextState.prototype = {\n    setTextMatrix: function TextState_setTextMatrix(a, b, c, d, e, f) {\n      var m = this.textMatrix;\n      m[0] = a; m[1] = b; m[2] = c; m[3] = d; m[4] = e; m[5] = f;\n    },\n    setTextLineMatrix: function TextState_setTextMatrix(a, b, c, d, e, f) {\n      var m = this.textLineMatrix;\n      m[0] = a; m[1] = b; m[2] = c; m[3] = d; m[4] = e; m[5] = f;\n    },\n    translateTextMatrix: function TextState_translateTextMatrix(x, y) {\n      var m = this.textMatrix;\n      m[4] = m[0] * x + m[2] * y + m[4];\n      m[5] = m[1] * x + m[3] * y + m[5];\n    },\n    translateTextLineMatrix: function TextState_translateTextMatrix(x, y) {\n      var m = this.textLineMatrix;\n      m[4] = m[0] * x + m[2] * y + m[4];\n      m[5] = m[1] * x + m[3] * y + m[5];\n    },\n    calcTextLineMatrixAdvance:\n        function TextState_calcTextLineMatrixAdvance(a, b, c, d, e, f) {\n      var font = this.font;\n      if (!font) {\n        return null;\n      }\n      var m = this.textLineMatrix;\n      if (!(a === m[0] && b === m[1] && c === m[2] && d === m[3])) {\n        return null;\n      }\n      var txDiff = e - m[4], tyDiff = f - m[5];\n      if ((font.vertical && txDiff !== 0) || (!font.vertical && tyDiff !== 0)) {\n        return null;\n      }\n      var tx, ty, denominator = a * d - b * c;\n      if (font.vertical) {\n        tx = -tyDiff * c / denominator;\n        ty = tyDiff * a / denominator;\n      } else {\n        tx = txDiff * d / denominator;\n        ty = -txDiff * b / denominator;\n      }\n      return { width: tx, height: ty, value: (font.vertical ? ty : tx), };\n    },\n    calcRenderMatrix: function TextState_calcRendeMatrix(ctm) {\n      // 9.4.4 Text Space Details\n      var tsm = [this.fontSize * this.textHScale, 0,\n                0, this.fontSize,\n                0, this.textRise];\n      return Util.transform(ctm, Util.transform(this.textMatrix, tsm));\n    },\n    carriageReturn: function TextState_carriageReturn() {\n      this.translateTextLineMatrix(0, -this.leading);\n      this.textMatrix = this.textLineMatrix.slice();\n    },\n    clone: function TextState_clone() {\n      var clone = Object.create(this);\n      clone.textMatrix = this.textMatrix.slice();\n      clone.textLineMatrix = this.textLineMatrix.slice();\n      clone.fontMatrix = this.fontMatrix.slice();\n      return clone;\n    },\n  };\n  return TextState;\n})();\n\nvar EvalState = (function EvalStateClosure() {\n  function EvalState() {\n    this.ctm = new Float32Array(IDENTITY_MATRIX);\n    this.font = null;\n    this.textRenderingMode = TextRenderingMode.FILL;\n    this.fillColorSpace = ColorSpace.singletons.gray;\n    this.strokeColorSpace = ColorSpace.singletons.gray;\n  }\n  EvalState.prototype = {\n    clone: function CanvasExtraState_clone() {\n      return Object.create(this);\n    },\n  };\n  return EvalState;\n})();\n\nvar EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() {\n  // Specifies properties for each command\n  //\n  // If variableArgs === true: [0, `numArgs`] expected\n  // If variableArgs === false: exactly `numArgs` expected\n  var getOPMap = getLookupTableFactory(function (t) {\n    // Graphic state\n    t['w'] = { id: OPS.setLineWidth, numArgs: 1, variableArgs: false, };\n    t['J'] = { id: OPS.setLineCap, numArgs: 1, variableArgs: false, };\n    t['j'] = { id: OPS.setLineJoin, numArgs: 1, variableArgs: false, };\n    t['M'] = { id: OPS.setMiterLimit, numArgs: 1, variableArgs: false, };\n    t['d'] = { id: OPS.setDash, numArgs: 2, variableArgs: false, };\n    t['ri'] = { id: OPS.setRenderingIntent, numArgs: 1, variableArgs: false, };\n    t['i'] = { id: OPS.setFlatness, numArgs: 1, variableArgs: false, };\n    t['gs'] = { id: OPS.setGState, numArgs: 1, variableArgs: false, };\n    t['q'] = { id: OPS.save, numArgs: 0, variableArgs: false, };\n    t['Q'] = { id: OPS.restore, numArgs: 0, variableArgs: false, };\n    t['cm'] = { id: OPS.transform, numArgs: 6, variableArgs: false, };\n\n    // Path\n    t['m'] = { id: OPS.moveTo, numArgs: 2, variableArgs: false, };\n    t['l'] = { id: OPS.lineTo, numArgs: 2, variableArgs: false, };\n    t['c'] = { id: OPS.curveTo, numArgs: 6, variableArgs: false, };\n    t['v'] = { id: OPS.curveTo2, numArgs: 4, variableArgs: false, };\n    t['y'] = { id: OPS.curveTo3, numArgs: 4, variableArgs: false, };\n    t['h'] = { id: OPS.closePath, numArgs: 0, variableArgs: false, };\n    t['re'] = { id: OPS.rectangle, numArgs: 4, variableArgs: false, };\n    t['S'] = { id: OPS.stroke, numArgs: 0, variableArgs: false, };\n    t['s'] = { id: OPS.closeStroke, numArgs: 0, variableArgs: false, };\n    t['f'] = { id: OPS.fill, numArgs: 0, variableArgs: false, };\n    t['F'] = { id: OPS.fill, numArgs: 0, variableArgs: false, };\n    t['f*'] = { id: OPS.eoFill, numArgs: 0, variableArgs: false, };\n    t['B'] = { id: OPS.fillStroke, numArgs: 0, variableArgs: false, };\n    t['B*'] = { id: OPS.eoFillStroke, numArgs: 0, variableArgs: false, };\n    t['b'] = { id: OPS.closeFillStroke, numArgs: 0, variableArgs: false, };\n    t['b*'] = { id: OPS.closeEOFillStroke, numArgs: 0, variableArgs: false, };\n    t['n'] = { id: OPS.endPath, numArgs: 0, variableArgs: false, };\n\n    // Clipping\n    t['W'] = { id: OPS.clip, numArgs: 0, variableArgs: false, };\n    t['W*'] = { id: OPS.eoClip, numArgs: 0, variableArgs: false, };\n\n    // Text\n    t['BT'] = { id: OPS.beginText, numArgs: 0, variableArgs: false, };\n    t['ET'] = { id: OPS.endText, numArgs: 0, variableArgs: false, };\n    t['Tc'] = { id: OPS.setCharSpacing, numArgs: 1, variableArgs: false, };\n    t['Tw'] = { id: OPS.setWordSpacing, numArgs: 1, variableArgs: false, };\n    t['Tz'] = { id: OPS.setHScale, numArgs: 1, variableArgs: false, };\n    t['TL'] = { id: OPS.setLeading, numArgs: 1, variableArgs: false, };\n    t['Tf'] = { id: OPS.setFont, numArgs: 2, variableArgs: false, };\n    t['Tr'] = { id: OPS.setTextRenderingMode, numArgs: 1,\n                variableArgs: false, };\n    t['Ts'] = { id: OPS.setTextRise, numArgs: 1, variableArgs: false, };\n    t['Td'] = { id: OPS.moveText, numArgs: 2, variableArgs: false, };\n    t['TD'] = { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false, };\n    t['Tm'] = { id: OPS.setTextMatrix, numArgs: 6, variableArgs: false, };\n    t['T*'] = { id: OPS.nextLine, numArgs: 0, variableArgs: false, };\n    t['Tj'] = { id: OPS.showText, numArgs: 1, variableArgs: false, };\n    t['TJ'] = { id: OPS.showSpacedText, numArgs: 1, variableArgs: false, };\n    t['\\''] = { id: OPS.nextLineShowText, numArgs: 1, variableArgs: false, };\n    t['\"'] = { id: OPS.nextLineSetSpacingShowText, numArgs: 3,\n               variableArgs: false, };\n\n    // Type3 fonts\n    t['d0'] = { id: OPS.setCharWidth, numArgs: 2, variableArgs: false, };\n    t['d1'] = { id: OPS.setCharWidthAndBounds, numArgs: 6,\n                variableArgs: false, };\n\n    // Color\n    t['CS'] = { id: OPS.setStrokeColorSpace, numArgs: 1, variableArgs: false, };\n    t['cs'] = { id: OPS.setFillColorSpace, numArgs: 1, variableArgs: false, };\n    t['SC'] = { id: OPS.setStrokeColor, numArgs: 4, variableArgs: true, };\n    t['SCN'] = { id: OPS.setStrokeColorN, numArgs: 33, variableArgs: true, };\n    t['sc'] = { id: OPS.setFillColor, numArgs: 4, variableArgs: true, };\n    t['scn'] = { id: OPS.setFillColorN, numArgs: 33, variableArgs: true, };\n    t['G'] = { id: OPS.setStrokeGray, numArgs: 1, variableArgs: false, };\n    t['g'] = { id: OPS.setFillGray, numArgs: 1, variableArgs: false, };\n    t['RG'] = { id: OPS.setStrokeRGBColor, numArgs: 3, variableArgs: false, };\n    t['rg'] = { id: OPS.setFillRGBColor, numArgs: 3, variableArgs: false, };\n    t['K'] = { id: OPS.setStrokeCMYKColor, numArgs: 4, variableArgs: false, };\n    t['k'] = { id: OPS.setFillCMYKColor, numArgs: 4, variableArgs: false, };\n\n    // Shading\n    t['sh'] = { id: OPS.shadingFill, numArgs: 1, variableArgs: false, };\n\n    // Images\n    t['BI'] = { id: OPS.beginInlineImage, numArgs: 0, variableArgs: false, };\n    t['ID'] = { id: OPS.beginImageData, numArgs: 0, variableArgs: false, };\n    t['EI'] = { id: OPS.endInlineImage, numArgs: 1, variableArgs: false, };\n\n    // XObjects\n    t['Do'] = { id: OPS.paintXObject, numArgs: 1, variableArgs: false, };\n    t['MP'] = { id: OPS.markPoint, numArgs: 1, variableArgs: false, };\n    t['DP'] = { id: OPS.markPointProps, numArgs: 2, variableArgs: false, };\n    t['BMC'] = { id: OPS.beginMarkedContent, numArgs: 1, variableArgs: false, };\n    t['BDC'] = { id: OPS.beginMarkedContentProps, numArgs: 2,\n                 variableArgs: false, };\n    t['EMC'] = { id: OPS.endMarkedContent, numArgs: 0, variableArgs: false, };\n\n    // Compatibility\n    t['BX'] = { id: OPS.beginCompat, numArgs: 0, variableArgs: false, };\n    t['EX'] = { id: OPS.endCompat, numArgs: 0, variableArgs: false, };\n\n    // (reserved partial commands for the lexer)\n    t['BM'] = null;\n    t['BD'] = null;\n    t['true'] = null;\n    t['fa'] = null;\n    t['fal'] = null;\n    t['fals'] = null;\n    t['false'] = null;\n    t['nu'] = null;\n    t['nul'] = null;\n    t['null'] = null;\n  });\n\n  const MAX_INVALID_PATH_OPS = 20;\n\n  function EvaluatorPreprocessor(stream, xref, stateManager) {\n    this.opMap = getOPMap();\n    // TODO(mduan): pass array of knownCommands rather than this.opMap\n    // dictionary\n    this.parser = new Parser(new Lexer(stream, this.opMap), false, xref);\n    this.stateManager = stateManager;\n    this.nonProcessedArgs = [];\n    this._numInvalidPathOPS = 0;\n  }\n\n  EvaluatorPreprocessor.prototype = {\n    get savedStatesDepth() {\n      return this.stateManager.stateStack.length;\n    },\n\n    // |operation| is an object with two fields:\n    //\n    // - |fn| is an out param.\n    //\n    // - |args| is an inout param. On entry, it should have one of two values.\n    //\n    //   - An empty array. This indicates that the caller is providing the\n    //     array in which the args will be stored in. The caller should use\n    //     this value if it can reuse a single array for each call to read().\n    //\n    //   - |null|. This indicates that the caller needs this function to create\n    //     the array in which any args are stored in. If there are zero args,\n    //     this function will leave |operation.args| as |null| (thus avoiding\n    //     allocations that would occur if we used an empty array to represent\n    //     zero arguments). Otherwise, it will replace |null| with a new array\n    //     containing the arguments. The caller should use this value if it\n    //     cannot reuse an array for each call to read().\n    //\n    // These two modes are present because this function is very hot and so\n    // avoiding allocations where possible is worthwhile.\n    //\n    read: function EvaluatorPreprocessor_read(operation) {\n      var args = operation.args;\n      while (true) {\n        var obj = this.parser.getObj();\n        if (isCmd(obj)) {\n          var cmd = obj.cmd;\n          // Check that the command is valid\n          var opSpec = this.opMap[cmd];\n          if (!opSpec) {\n            warn(`Unknown command \"${cmd}\".`);\n            continue;\n          }\n\n          var fn = opSpec.id;\n          var numArgs = opSpec.numArgs;\n          var argsLength = args !== null ? args.length : 0;\n\n          if (!opSpec.variableArgs) {\n            // Postscript commands can be nested, e.g. /F2 /GS2 gs 5.711 Tf\n            if (argsLength !== numArgs) {\n              var nonProcessedArgs = this.nonProcessedArgs;\n              while (argsLength > numArgs) {\n                nonProcessedArgs.push(args.shift());\n                argsLength--;\n              }\n              while (argsLength < numArgs && nonProcessedArgs.length !== 0) {\n                if (args === null) {\n                  args = [];\n                }\n                args.unshift(nonProcessedArgs.pop());\n                argsLength++;\n              }\n            }\n\n            if (argsLength < numArgs) {\n              const partialMsg = `command ${cmd}: expected ${numArgs} args, ` +\n                                 `but received ${argsLength} args.`;\n\n              // Incomplete path operators, in particular, can result in fairly\n              // chaotic rendering artifacts. Hence the following heuristics is\n              // used to error, rather than just warn, once a number of invalid\n              // path operators have been encountered (fixes bug1443140.pdf).\n              if ((fn >= OPS.moveTo && fn <= OPS.endPath) && // Path operator\n                  ++this._numInvalidPathOPS > MAX_INVALID_PATH_OPS) {\n                throw new FormatError(`Invalid ${partialMsg}`);\n              }\n              // If we receive too few arguments, it's not possible to execute\n              // the command, hence we skip the command.\n              warn(`Skipping ${partialMsg}`);\n              if (args !== null) {\n                args.length = 0;\n              }\n              continue;\n            }\n          } else if (argsLength > numArgs) {\n            info(`Command ${cmd}: expected [0, ${numArgs}] args, ` +\n                 `but received ${argsLength} args.`);\n          }\n\n          // TODO figure out how to type-check vararg functions\n          this.preprocessCommand(fn, args);\n\n          operation.fn = fn;\n          operation.args = args;\n          return true;\n        }\n        if (isEOF(obj)) {\n          return false; // no more commands\n        }\n        // argument\n        if (obj !== null) {\n          if (args === null) {\n            args = [];\n          }\n          args.push(obj);\n          if (args.length > 33) {\n            throw new FormatError('Too many arguments');\n          }\n        }\n      }\n    },\n\n    preprocessCommand:\n        function EvaluatorPreprocessor_preprocessCommand(fn, args) {\n      switch (fn | 0) {\n        case OPS.save:\n          this.stateManager.save();\n          break;\n        case OPS.restore:\n          this.stateManager.restore();\n          break;\n        case OPS.transform:\n          this.stateManager.transform(args);\n          break;\n      }\n    },\n  };\n  return EvaluatorPreprocessor;\n})();\n\nexport {\n  PartialEvaluator,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  CMapCompressionType, FormatError, isString, MissingDataException, unreachable,\n  warn\n} from '../shared/util';\nimport { isCmd, isEOF, isName, isStream } from './primitives';\nimport { Lexer } from './parser';\nimport { Stream } from './stream';\n\nvar BUILT_IN_CMAPS = [\n// << Start unicode maps.\n'Adobe-GB1-UCS2',\n'Adobe-CNS1-UCS2',\n'Adobe-Japan1-UCS2',\n'Adobe-Korea1-UCS2',\n// >> End unicode maps.\n'78-EUC-H',\n'78-EUC-V',\n'78-H',\n'78-RKSJ-H',\n'78-RKSJ-V',\n'78-V',\n'78ms-RKSJ-H',\n'78ms-RKSJ-V',\n'83pv-RKSJ-H',\n'90ms-RKSJ-H',\n'90ms-RKSJ-V',\n'90msp-RKSJ-H',\n'90msp-RKSJ-V',\n'90pv-RKSJ-H',\n'90pv-RKSJ-V',\n'Add-H',\n'Add-RKSJ-H',\n'Add-RKSJ-V',\n'Add-V',\n'Adobe-CNS1-0',\n'Adobe-CNS1-1',\n'Adobe-CNS1-2',\n'Adobe-CNS1-3',\n'Adobe-CNS1-4',\n'Adobe-CNS1-5',\n'Adobe-CNS1-6',\n'Adobe-GB1-0',\n'Adobe-GB1-1',\n'Adobe-GB1-2',\n'Adobe-GB1-3',\n'Adobe-GB1-4',\n'Adobe-GB1-5',\n'Adobe-Japan1-0',\n'Adobe-Japan1-1',\n'Adobe-Japan1-2',\n'Adobe-Japan1-3',\n'Adobe-Japan1-4',\n'Adobe-Japan1-5',\n'Adobe-Japan1-6',\n'Adobe-Korea1-0',\n'Adobe-Korea1-1',\n'Adobe-Korea1-2',\n'B5-H',\n'B5-V',\n'B5pc-H',\n'B5pc-V',\n'CNS-EUC-H',\n'CNS-EUC-V',\n'CNS1-H',\n'CNS1-V',\n'CNS2-H',\n'CNS2-V',\n'ETHK-B5-H',\n'ETHK-B5-V',\n'ETen-B5-H',\n'ETen-B5-V',\n'ETenms-B5-H',\n'ETenms-B5-V',\n'EUC-H',\n'EUC-V',\n'Ext-H',\n'Ext-RKSJ-H',\n'Ext-RKSJ-V',\n'Ext-V',\n'GB-EUC-H',\n'GB-EUC-V',\n'GB-H',\n'GB-V',\n'GBK-EUC-H',\n'GBK-EUC-V',\n'GBK2K-H',\n'GBK2K-V',\n'GBKp-EUC-H',\n'GBKp-EUC-V',\n'GBT-EUC-H',\n'GBT-EUC-V',\n'GBT-H',\n'GBT-V',\n'GBTpc-EUC-H',\n'GBTpc-EUC-V',\n'GBpc-EUC-H',\n'GBpc-EUC-V',\n'H',\n'HKdla-B5-H',\n'HKdla-B5-V',\n'HKdlb-B5-H',\n'HKdlb-B5-V',\n'HKgccs-B5-H',\n'HKgccs-B5-V',\n'HKm314-B5-H',\n'HKm314-B5-V',\n'HKm471-B5-H',\n'HKm471-B5-V',\n'HKscs-B5-H',\n'HKscs-B5-V',\n'Hankaku',\n'Hiragana',\n'KSC-EUC-H',\n'KSC-EUC-V',\n'KSC-H',\n'KSC-Johab-H',\n'KSC-Johab-V',\n'KSC-V',\n'KSCms-UHC-H',\n'KSCms-UHC-HW-H',\n'KSCms-UHC-HW-V',\n'KSCms-UHC-V',\n'KSCpc-EUC-H',\n'KSCpc-EUC-V',\n'Katakana',\n'NWP-H',\n'NWP-V',\n'RKSJ-H',\n'RKSJ-V',\n'Roman',\n'UniCNS-UCS2-H',\n'UniCNS-UCS2-V',\n'UniCNS-UTF16-H',\n'UniCNS-UTF16-V',\n'UniCNS-UTF32-H',\n'UniCNS-UTF32-V',\n'UniCNS-UTF8-H',\n'UniCNS-UTF8-V',\n'UniGB-UCS2-H',\n'UniGB-UCS2-V',\n'UniGB-UTF16-H',\n'UniGB-UTF16-V',\n'UniGB-UTF32-H',\n'UniGB-UTF32-V',\n'UniGB-UTF8-H',\n'UniGB-UTF8-V',\n'UniJIS-UCS2-H',\n'UniJIS-UCS2-HW-H',\n'UniJIS-UCS2-HW-V',\n'UniJIS-UCS2-V',\n'UniJIS-UTF16-H',\n'UniJIS-UTF16-V',\n'UniJIS-UTF32-H',\n'UniJIS-UTF32-V',\n'UniJIS-UTF8-H',\n'UniJIS-UTF8-V',\n'UniJIS2004-UTF16-H',\n'UniJIS2004-UTF16-V',\n'UniJIS2004-UTF32-H',\n'UniJIS2004-UTF32-V',\n'UniJIS2004-UTF8-H',\n'UniJIS2004-UTF8-V',\n'UniJISPro-UCS2-HW-V',\n'UniJISPro-UCS2-V',\n'UniJISPro-UTF8-V',\n'UniJISX0213-UTF32-H',\n'UniJISX0213-UTF32-V',\n'UniJISX02132004-UTF32-H',\n'UniJISX02132004-UTF32-V',\n'UniKS-UCS2-H',\n'UniKS-UCS2-V',\n'UniKS-UTF16-H',\n'UniKS-UTF16-V',\n'UniKS-UTF32-H',\n'UniKS-UTF32-V',\n'UniKS-UTF8-H',\n'UniKS-UTF8-V',\n'V',\n'WP-Symbol'];\n\n// CMap, not to be confused with TrueType's cmap.\nclass CMap {\n  constructor(builtInCMap = false) {\n    // Codespace ranges are stored as follows:\n    // [[1BytePairs], [2BytePairs], [3BytePairs], [4BytePairs]]\n    // where nBytePairs are ranges e.g. [low1, high1, low2, high2, ...]\n    this.codespaceRanges = [[], [], [], []];\n    this.numCodespaceRanges = 0;\n    // Map entries have one of two forms.\n    // - cid chars are 16-bit unsigned integers, stored as integers.\n    // - bf chars are variable-length byte sequences, stored as strings, with\n    //   one byte per character.\n    this._map = [];\n    this.name = '';\n    this.vertical = false;\n    this.useCMap = null;\n    this.builtInCMap = builtInCMap;\n  }\n\n  addCodespaceRange(n, low, high) {\n    this.codespaceRanges[n - 1].push(low, high);\n    this.numCodespaceRanges++;\n  }\n\n  mapCidRange(low, high, dstLow) {\n    while (low <= high) {\n      this._map[low++] = dstLow++;\n    }\n  }\n\n  mapBfRange(low, high, dstLow) {\n    var lastByte = dstLow.length - 1;\n    while (low <= high) {\n      this._map[low++] = dstLow;\n      // Only the last byte has to be incremented.\n      dstLow = dstLow.substring(0, lastByte) +\n               String.fromCharCode(dstLow.charCodeAt(lastByte) + 1);\n    }\n  }\n\n  mapBfRangeToArray(low, high, array) {\n    let i = 0, ii = array.length;\n    while (low <= high && i < ii) {\n      this._map[low] = array[i++];\n      ++low;\n    }\n  }\n\n  // This is used for both bf and cid chars.\n  mapOne(src, dst) {\n    this._map[src] = dst;\n  }\n\n  lookup(code) {\n    return this._map[code];\n  }\n\n  contains(code) {\n    return this._map[code] !== undefined;\n  }\n\n  forEach(callback) {\n    // Most maps have fewer than 65536 entries, and for those we use normal\n    // array iteration. But really sparse tables are possible -- e.g. with\n    // indices in the *billions*. For such tables we use for..in, which isn't\n    // ideal because it stringifies the indices for all present elements, but\n    // it does avoid iterating over every undefined entry.\n    let map = this._map;\n    let length = map.length;\n    if (length <= 0x10000) {\n      for (let i = 0; i < length; i++) {\n        if (map[i] !== undefined) {\n          callback(i, map[i]);\n        }\n      }\n    } else {\n      for (let i in map) {\n        callback(i, map[i]);\n      }\n    }\n  }\n\n  charCodeOf(value) {\n    // `Array.prototype.indexOf` is *extremely* inefficient for arrays which\n    // are both very sparse and very large (see issue8372.pdf).\n    const map = this._map;\n    if (map.length <= 0x10000) {\n      return map.indexOf(value);\n    }\n    for (let charCode in map) {\n      if (map[charCode] === value) {\n        return (charCode | 0);\n      }\n    }\n    return -1;\n  }\n\n  getMap() {\n    return this._map;\n  }\n\n  readCharCode(str, offset, out) {\n    let c = 0;\n    const codespaceRanges = this.codespaceRanges;\n    // 9.7.6.2 CMap Mapping\n    // The code length is at most 4.\n    for (let n = 0, nn = codespaceRanges.length; n < nn; n++) {\n      c = ((c << 8) | str.charCodeAt(offset + n)) >>> 0;\n      // Check each codespace range to see if it falls within.\n      const codespaceRange = codespaceRanges[n];\n      for (let k = 0, kk = codespaceRange.length; k < kk;) {\n        const low = codespaceRange[k++];\n        const high = codespaceRange[k++];\n        if (c >= low && c <= high) {\n          out.charcode = c;\n          out.length = n + 1;\n          return;\n        }\n      }\n    }\n    out.charcode = 0;\n    out.length = 1;\n  }\n\n  get length() {\n    return this._map.length;\n  }\n\n  get isIdentityCMap() {\n    if (!(this.name === 'Identity-H' || this.name === 'Identity-V')) {\n      return false;\n    }\n    if (this._map.length !== 0x10000) {\n      return false;\n    }\n    for (let i = 0; i < 0x10000; i++) {\n      if (this._map[i] !== i) {\n        return false;\n      }\n    }\n    return true;\n  }\n}\n\n// A special case of CMap, where the _map array implicitly has a length of\n// 65536 and each element is equal to its index.\nclass IdentityCMap extends CMap {\n  constructor(vertical, n) {\n    super();\n\n    this.vertical = vertical;\n    this.addCodespaceRange(n, 0, 0xffff);\n  }\n\n  mapCidRange(low, high, dstLow) {\n    unreachable('should not call mapCidRange');\n  }\n\n  mapBfRange(low, high, dstLow) {\n    unreachable('should not call mapBfRange');\n  }\n\n  mapBfRangeToArray(low, high, array) {\n    unreachable('should not call mapBfRangeToArray');\n  }\n\n  mapOne(src, dst) {\n    unreachable('should not call mapCidOne');\n  }\n\n  lookup(code) {\n    return (Number.isInteger(code) && code <= 0xffff) ? code : undefined;\n  }\n\n  contains(code) {\n    return Number.isInteger(code) && code <= 0xffff;\n  }\n\n  forEach(callback) {\n    for (let i = 0; i <= 0xffff; i++) {\n      callback(i, i);\n    }\n  }\n\n  charCodeOf(value) {\n    return (Number.isInteger(value) && value <= 0xffff) ? value : -1;\n  }\n\n  getMap() {\n    // Sometimes identity maps must be instantiated, but it's rare.\n    const map = new Array(0x10000);\n    for (let i = 0; i <= 0xffff; i++) {\n      map[i] = i;\n    }\n    return map;\n  }\n\n  get length() {\n    return 0x10000;\n  }\n\n  get isIdentityCMap() {\n    unreachable('should not access .isIdentityCMap');\n  }\n}\n\nvar BinaryCMapReader = (function BinaryCMapReaderClosure() {\n  function hexToInt(a, size) {\n    var n = 0;\n    for (var i = 0; i <= size; i++) {\n      n = (n << 8) | a[i];\n    }\n    return n >>> 0;\n  }\n\n  function hexToStr(a, size) {\n    // This code is hot. Special-case some common values to avoid creating an\n    // object with subarray().\n    if (size === 1) {\n      return String.fromCharCode(a[0], a[1]);\n    }\n    if (size === 3) {\n      return String.fromCharCode(a[0], a[1], a[2], a[3]);\n    }\n    return String.fromCharCode.apply(null, a.subarray(0, size + 1));\n  }\n\n  function addHex(a, b, size) {\n    var c = 0;\n    for (var i = size; i >= 0; i--) {\n      c += a[i] + b[i];\n      a[i] = c & 255;\n      c >>= 8;\n    }\n  }\n\n  function incHex(a, size) {\n    var c = 1;\n    for (var i = size; i >= 0 && c > 0; i--) {\n      c += a[i];\n      a[i] = c & 255;\n      c >>= 8;\n    }\n  }\n\n  var MAX_NUM_SIZE = 16;\n  var MAX_ENCODED_NUM_SIZE = 19; // ceil(MAX_NUM_SIZE * 7 / 8)\n\n  function BinaryCMapStream(data) {\n    this.buffer = data;\n    this.pos = 0;\n    this.end = data.length;\n    this.tmpBuf = new Uint8Array(MAX_ENCODED_NUM_SIZE);\n  }\n\n  BinaryCMapStream.prototype = {\n    readByte() {\n      if (this.pos >= this.end) {\n        return -1;\n      }\n      return this.buffer[this.pos++];\n    },\n    readNumber() {\n      var n = 0;\n      var last;\n      do {\n        var b = this.readByte();\n        if (b < 0) {\n          throw new FormatError('unexpected EOF in bcmap');\n        }\n        last = !(b & 0x80);\n        n = (n << 7) | (b & 0x7F);\n      } while (!last);\n      return n;\n    },\n    readSigned() {\n      var n = this.readNumber();\n      return (n & 1) ? ~(n >>> 1) : n >>> 1;\n    },\n    readHex(num, size) {\n      num.set(this.buffer.subarray(this.pos,\n        this.pos + size + 1));\n      this.pos += size + 1;\n    },\n    readHexNumber(num, size) {\n      var last;\n      var stack = this.tmpBuf, sp = 0;\n      do {\n        var b = this.readByte();\n        if (b < 0) {\n          throw new FormatError('unexpected EOF in bcmap');\n        }\n        last = !(b & 0x80);\n        stack[sp++] = b & 0x7F;\n      } while (!last);\n      var i = size, buffer = 0, bufferSize = 0;\n      while (i >= 0) {\n        while (bufferSize < 8 && stack.length > 0) {\n          buffer = (stack[--sp] << bufferSize) | buffer;\n          bufferSize += 7;\n        }\n        num[i] = buffer & 255;\n        i--;\n        buffer >>= 8;\n        bufferSize -= 8;\n      }\n    },\n    readHexSigned(num, size) {\n      this.readHexNumber(num, size);\n      var sign = num[size] & 1 ? 255 : 0;\n      var c = 0;\n      for (var i = 0; i <= size; i++) {\n        c = ((c & 1) << 8) | num[i];\n        num[i] = (c >> 1) ^ sign;\n      }\n    },\n    readString() {\n      var len = this.readNumber();\n      var s = '';\n      for (var i = 0; i < len; i++) {\n        s += String.fromCharCode(this.readNumber());\n      }\n      return s;\n    },\n  };\n\n  function processBinaryCMap(data, cMap, extend) {\n    return new Promise(function (resolve, reject) {\n      var stream = new BinaryCMapStream(data);\n      var header = stream.readByte();\n      cMap.vertical = !!(header & 1);\n\n      var useCMap = null;\n      var start = new Uint8Array(MAX_NUM_SIZE);\n      var end = new Uint8Array(MAX_NUM_SIZE);\n      var char = new Uint8Array(MAX_NUM_SIZE);\n      var charCode = new Uint8Array(MAX_NUM_SIZE);\n      var tmp = new Uint8Array(MAX_NUM_SIZE);\n      var code;\n\n      var b;\n      while ((b = stream.readByte()) >= 0) {\n        var type = b >> 5;\n        if (type === 7) { // metadata, e.g. comment or usecmap\n          switch (b & 0x1F) {\n            case 0:\n              stream.readString(); // skipping comment\n              break;\n            case 1:\n              useCMap = stream.readString();\n              break;\n          }\n          continue;\n        }\n        var sequence = !!(b & 0x10);\n        var dataSize = b & 15;\n\n        if (dataSize + 1 > MAX_NUM_SIZE) {\n          throw new Error('processBinaryCMap: Invalid dataSize.');\n        }\n\n        var ucs2DataSize = 1;\n        var subitemsCount = stream.readNumber();\n        var i;\n        switch (type) {\n          case 0: // codespacerange\n            stream.readHex(start, dataSize);\n            stream.readHexNumber(end, dataSize);\n            addHex(end, start, dataSize);\n            cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize),\n                                   hexToInt(end, dataSize));\n            for (i = 1; i < subitemsCount; i++) {\n              incHex(end, dataSize);\n              stream.readHexNumber(start, dataSize);\n              addHex(start, end, dataSize);\n              stream.readHexNumber(end, dataSize);\n              addHex(end, start, dataSize);\n              cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize),\n                                     hexToInt(end, dataSize));\n            }\n            break;\n          case 1: // notdefrange\n            stream.readHex(start, dataSize);\n            stream.readHexNumber(end, dataSize);\n            addHex(end, start, dataSize);\n            stream.readNumber(); // code\n            // undefined range, skipping\n            for (i = 1; i < subitemsCount; i++) {\n              incHex(end, dataSize);\n              stream.readHexNumber(start, dataSize);\n              addHex(start, end, dataSize);\n              stream.readHexNumber(end, dataSize);\n              addHex(end, start, dataSize);\n              stream.readNumber(); // code\n              // nop\n            }\n            break;\n          case 2: // cidchar\n            stream.readHex(char, dataSize);\n            code = stream.readNumber();\n            cMap.mapOne(hexToInt(char, dataSize), code);\n            for (i = 1; i < subitemsCount; i++) {\n              incHex(char, dataSize);\n              if (!sequence) {\n                stream.readHexNumber(tmp, dataSize);\n                addHex(char, tmp, dataSize);\n              }\n              code = stream.readSigned() + (code + 1);\n              cMap.mapOne(hexToInt(char, dataSize), code);\n            }\n            break;\n          case 3: // cidrange\n            stream.readHex(start, dataSize);\n            stream.readHexNumber(end, dataSize);\n            addHex(end, start, dataSize);\n            code = stream.readNumber();\n            cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize),\n                             code);\n            for (i = 1; i < subitemsCount; i++) {\n              incHex(end, dataSize);\n              if (!sequence) {\n                stream.readHexNumber(start, dataSize);\n                addHex(start, end, dataSize);\n              } else {\n                start.set(end);\n              }\n              stream.readHexNumber(end, dataSize);\n              addHex(end, start, dataSize);\n              code = stream.readNumber();\n              cMap.mapCidRange(hexToInt(start, dataSize),\n                               hexToInt(end, dataSize), code);\n            }\n            break;\n          case 4: // bfchar\n            stream.readHex(char, ucs2DataSize);\n            stream.readHex(charCode, dataSize);\n            cMap.mapOne(hexToInt(char, ucs2DataSize),\n                        hexToStr(charCode, dataSize));\n            for (i = 1; i < subitemsCount; i++) {\n              incHex(char, ucs2DataSize);\n              if (!sequence) {\n                stream.readHexNumber(tmp, ucs2DataSize);\n                addHex(char, tmp, ucs2DataSize);\n              }\n              incHex(charCode, dataSize);\n              stream.readHexSigned(tmp, dataSize);\n              addHex(charCode, tmp, dataSize);\n              cMap.mapOne(hexToInt(char, ucs2DataSize),\n                          hexToStr(charCode, dataSize));\n            }\n            break;\n          case 5: // bfrange\n            stream.readHex(start, ucs2DataSize);\n            stream.readHexNumber(end, ucs2DataSize);\n            addHex(end, start, ucs2DataSize);\n            stream.readHex(charCode, dataSize);\n            cMap.mapBfRange(hexToInt(start, ucs2DataSize),\n                            hexToInt(end, ucs2DataSize),\n                            hexToStr(charCode, dataSize));\n            for (i = 1; i < subitemsCount; i++) {\n              incHex(end, ucs2DataSize);\n              if (!sequence) {\n                stream.readHexNumber(start, ucs2DataSize);\n                addHex(start, end, ucs2DataSize);\n              } else {\n                start.set(end);\n              }\n              stream.readHexNumber(end, ucs2DataSize);\n              addHex(end, start, ucs2DataSize);\n              stream.readHex(charCode, dataSize);\n              cMap.mapBfRange(hexToInt(start, ucs2DataSize),\n                              hexToInt(end, ucs2DataSize),\n                              hexToStr(charCode, dataSize));\n            }\n            break;\n          default:\n            reject(new Error('processBinaryCMap: Unknown type: ' + type));\n            return;\n        }\n      }\n\n      if (useCMap) {\n        resolve(extend(useCMap));\n        return;\n      }\n      resolve(cMap);\n    });\n  }\n\n  function BinaryCMapReader() {}\n\n  BinaryCMapReader.prototype = {\n    process: processBinaryCMap,\n  };\n\n  return BinaryCMapReader;\n})();\n\nvar CMapFactory = (function CMapFactoryClosure() {\n  function strToInt(str) {\n    var a = 0;\n    for (var i = 0; i < str.length; i++) {\n      a = (a << 8) | str.charCodeAt(i);\n    }\n    return a >>> 0;\n  }\n\n  function expectString(obj) {\n    if (!isString(obj)) {\n      throw new FormatError('Malformed CMap: expected string.');\n    }\n  }\n\n  function expectInt(obj) {\n    if (!Number.isInteger(obj)) {\n      throw new FormatError('Malformed CMap: expected int.');\n    }\n  }\n\n  function parseBfChar(cMap, lexer) {\n    while (true) {\n      var obj = lexer.getObj();\n      if (isEOF(obj)) {\n        break;\n      }\n      if (isCmd(obj, 'endbfchar')) {\n        return;\n      }\n      expectString(obj);\n      var src = strToInt(obj);\n      obj = lexer.getObj();\n      // TODO are /dstName used?\n      expectString(obj);\n      var dst = obj;\n      cMap.mapOne(src, dst);\n    }\n  }\n\n  function parseBfRange(cMap, lexer) {\n    while (true) {\n      var obj = lexer.getObj();\n      if (isEOF(obj)) {\n        break;\n      }\n      if (isCmd(obj, 'endbfrange')) {\n        return;\n      }\n      expectString(obj);\n      var low = strToInt(obj);\n      obj = lexer.getObj();\n      expectString(obj);\n      var high = strToInt(obj);\n      obj = lexer.getObj();\n      if (Number.isInteger(obj) || isString(obj)) {\n        var dstLow = Number.isInteger(obj) ? String.fromCharCode(obj) : obj;\n        cMap.mapBfRange(low, high, dstLow);\n      } else if (isCmd(obj, '[')) {\n        obj = lexer.getObj();\n        var array = [];\n        while (!isCmd(obj, ']') && !isEOF(obj)) {\n          array.push(obj);\n          obj = lexer.getObj();\n        }\n        cMap.mapBfRangeToArray(low, high, array);\n      } else {\n        break;\n      }\n    }\n    throw new FormatError('Invalid bf range.');\n  }\n\n  function parseCidChar(cMap, lexer) {\n    while (true) {\n      var obj = lexer.getObj();\n      if (isEOF(obj)) {\n        break;\n      }\n      if (isCmd(obj, 'endcidchar')) {\n        return;\n      }\n      expectString(obj);\n      var src = strToInt(obj);\n      obj = lexer.getObj();\n      expectInt(obj);\n      var dst = obj;\n      cMap.mapOne(src, dst);\n    }\n  }\n\n  function parseCidRange(cMap, lexer) {\n    while (true) {\n      var obj = lexer.getObj();\n      if (isEOF(obj)) {\n        break;\n      }\n      if (isCmd(obj, 'endcidrange')) {\n        return;\n      }\n      expectString(obj);\n      var low = strToInt(obj);\n      obj = lexer.getObj();\n      expectString(obj);\n      var high = strToInt(obj);\n      obj = lexer.getObj();\n      expectInt(obj);\n      var dstLow = obj;\n      cMap.mapCidRange(low, high, dstLow);\n    }\n  }\n\n  function parseCodespaceRange(cMap, lexer) {\n    while (true) {\n      var obj = lexer.getObj();\n      if (isEOF(obj)) {\n        break;\n      }\n      if (isCmd(obj, 'endcodespacerange')) {\n        return;\n      }\n      if (!isString(obj)) {\n        break;\n      }\n      var low = strToInt(obj);\n      obj = lexer.getObj();\n      if (!isString(obj)) {\n        break;\n      }\n      var high = strToInt(obj);\n      cMap.addCodespaceRange(obj.length, low, high);\n    }\n    throw new FormatError('Invalid codespace range.');\n  }\n\n  function parseWMode(cMap, lexer) {\n    var obj = lexer.getObj();\n    if (Number.isInteger(obj)) {\n      cMap.vertical = !!obj;\n    }\n  }\n\n  function parseCMapName(cMap, lexer) {\n    var obj = lexer.getObj();\n    if (isName(obj) && isString(obj.name)) {\n      cMap.name = obj.name;\n    }\n  }\n\n  function parseCMap(cMap, lexer, fetchBuiltInCMap, useCMap) {\n    var previous;\n    var embeddedUseCMap;\n    objLoop: while (true) {\n      try {\n        var obj = lexer.getObj();\n        if (isEOF(obj)) {\n          break;\n        } else if (isName(obj)) {\n          if (obj.name === 'WMode') {\n            parseWMode(cMap, lexer);\n          } else if (obj.name === 'CMapName') {\n            parseCMapName(cMap, lexer);\n          }\n          previous = obj;\n        } else if (isCmd(obj)) {\n          switch (obj.cmd) {\n            case 'endcmap':\n              break objLoop;\n            case 'usecmap':\n              if (isName(previous)) {\n                embeddedUseCMap = previous.name;\n              }\n              break;\n            case 'begincodespacerange':\n              parseCodespaceRange(cMap, lexer);\n              break;\n            case 'beginbfchar':\n              parseBfChar(cMap, lexer);\n              break;\n            case 'begincidchar':\n              parseCidChar(cMap, lexer);\n              break;\n            case 'beginbfrange':\n              parseBfRange(cMap, lexer);\n              break;\n            case 'begincidrange':\n              parseCidRange(cMap, lexer);\n              break;\n          }\n        }\n      } catch (ex) {\n        if (ex instanceof MissingDataException) {\n          throw ex;\n        }\n        warn('Invalid cMap data: ' + ex);\n        continue;\n      }\n    }\n\n    if (!useCMap && embeddedUseCMap) {\n      // Load the useCMap definition from the file only if there wasn't one\n      // specified.\n      useCMap = embeddedUseCMap;\n    }\n    if (useCMap) {\n      return extendCMap(cMap, fetchBuiltInCMap, useCMap);\n    }\n    return Promise.resolve(cMap);\n  }\n\n  function extendCMap(cMap, fetchBuiltInCMap, useCMap) {\n    return createBuiltInCMap(useCMap, fetchBuiltInCMap).then(function(newCMap) {\n      cMap.useCMap = newCMap;\n      // If there aren't any code space ranges defined clone all the parent ones\n      // into this cMap.\n      if (cMap.numCodespaceRanges === 0) {\n        var useCodespaceRanges = cMap.useCMap.codespaceRanges;\n        for (var i = 0; i < useCodespaceRanges.length; i++) {\n          cMap.codespaceRanges[i] = useCodespaceRanges[i].slice();\n        }\n        cMap.numCodespaceRanges = cMap.useCMap.numCodespaceRanges;\n      }\n      // Merge the map into the current one, making sure not to override\n      // any previously defined entries.\n      cMap.useCMap.forEach(function(key, value) {\n        if (!cMap.contains(key)) {\n          cMap.mapOne(key, cMap.useCMap.lookup(key));\n        }\n      });\n\n      return cMap;\n    });\n  }\n\n  function createBuiltInCMap(name, fetchBuiltInCMap) {\n    if (name === 'Identity-H') {\n      return Promise.resolve(new IdentityCMap(false, 2));\n    } else if (name === 'Identity-V') {\n      return Promise.resolve(new IdentityCMap(true, 2));\n    }\n    if (!BUILT_IN_CMAPS.includes(name)) {\n      return Promise.reject(new Error('Unknown CMap name: ' + name));\n    }\n    if (!fetchBuiltInCMap) {\n      return Promise.reject(new Error(\n        'Built-in CMap parameters are not provided.'));\n    }\n\n    return fetchBuiltInCMap(name).then(function (data) {\n      var cMapData = data.cMapData, compressionType = data.compressionType;\n      var cMap = new CMap(true);\n\n      if (compressionType === CMapCompressionType.BINARY) {\n        return new BinaryCMapReader().process(cMapData, cMap,\n            function (useCMap) {\n          return extendCMap(cMap, fetchBuiltInCMap, useCMap);\n        });\n      }\n      if (compressionType === CMapCompressionType.NONE) {\n        var lexer = new Lexer(new Stream(cMapData));\n        return parseCMap(cMap, lexer, fetchBuiltInCMap, null);\n      }\n      return Promise.reject(new Error(\n        'TODO: Only BINARY/NONE CMap compression is currently supported.'));\n    });\n  }\n\n  return {\n    create(params) {\n      var encoding = params.encoding;\n      var fetchBuiltInCMap = params.fetchBuiltInCMap;\n      var useCMap = params.useCMap;\n\n      if (isName(encoding)) {\n        return createBuiltInCMap(encoding.name, fetchBuiltInCMap);\n      } else if (isStream(encoding)) {\n        var cMap = new CMap();\n        var lexer = new Lexer(encoding);\n        return parseCMap(cMap, lexer, fetchBuiltInCMap, useCMap).then(\n            function (parsedCMap) {\n          if (parsedCMap.isIdentityCMap) {\n            return createBuiltInCMap(parsedCMap.name, fetchBuiltInCMap);\n          }\n          return parsedCMap;\n        });\n      }\n      return Promise.reject(new Error('Encoding required.'));\n    },\n  };\n})();\n\nexport {\n  CMap,\n  IdentityCMap,\n  CMapFactory,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  assert, bytesToString, FONT_IDENTITY_MATRIX, FontType, FormatError, info,\n  isNum, isSpace, MissingDataException, readUint32, shadow, string32,\n  unreachable, warn\n} from '../shared/util';\nimport {\n  CFF, CFFCharset, CFFCompiler, CFFHeader, CFFIndex, CFFParser, CFFPrivateDict,\n  CFFStandardStrings, CFFStrings, CFFTopDict\n} from './cff_parser';\nimport { getDingbatsGlyphsUnicode, getGlyphsUnicode } from './glyphlist';\nimport {\n  getEncoding, MacRomanEncoding, StandardEncoding, SymbolSetEncoding,\n  ZapfDingbatsEncoding\n} from './encodings';\nimport {\n  getGlyphMapForStandardFonts, getNonStdFontMap, getStdFontMap,\n  getSupplementalGlyphMapForArialBlack, getSupplementalGlyphMapForCalibri\n} from './standard_fonts';\nimport {\n  getUnicodeForGlyph, getUnicodeRangeFor, mapSpecialUnicodeValues\n} from './unicode';\nimport { FontRendererFactory } from './font_renderer';\nimport { IdentityCMap } from './cmap';\nimport { Stream } from './stream';\nimport { Type1Parser } from './type1_parser';\n\n // Unicode Private Use Areas:\nconst PRIVATE_USE_AREAS = [\n  [0xE000, 0xF8FF],     // BMP (0)\n  [0x100000, 0x10FFFD], // PUP (16)\n];\n\n// PDF Glyph Space Units are one Thousandth of a TextSpace Unit\n// except for Type 3 fonts\nvar PDF_GLYPH_SPACE_UNITS = 1000;\n\n// Accented characters have issues on Windows and Linux. When this flag is\n// enabled glyphs that use seac and seac style endchar operators are truncated\n// and we instead just store the glyph id's of the base glyph and its accent to\n// be drawn individually.\n// Linux (freetype) requires that when a seac style endchar is used\n// that the charset must be a predefined one, however we build a\n// custom one. Windows just refuses to draw glyphs with seac operators.\nvar SEAC_ANALYSIS_ENABLED = true;\n\nvar FontFlags = {\n  FixedPitch: 1,\n  Serif: 2,\n  Symbolic: 4,\n  Script: 8,\n  Nonsymbolic: 32,\n  Italic: 64,\n  AllCap: 65536,\n  SmallCap: 131072,\n  ForceBold: 262144,\n};\n\nvar MacStandardGlyphOrdering = [\n  '.notdef', '.null', 'nonmarkingreturn', 'space', 'exclam', 'quotedbl',\n  'numbersign', 'dollar', 'percent', 'ampersand', 'quotesingle', 'parenleft',\n  'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash',\n  'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight',\n  'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at',\n  'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',\n  'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft',\n  'backslash', 'bracketright', 'asciicircum', 'underscore', 'grave', 'a', 'b',\n  'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q',\n  'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright',\n  'asciitilde', 'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde',\n  'Odieresis', 'Udieresis', 'aacute', 'agrave', 'acircumflex', 'adieresis',\n  'atilde', 'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis',\n  'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute', 'ograve',\n  'ocircumflex', 'odieresis', 'otilde', 'uacute', 'ugrave', 'ucircumflex',\n  'udieresis', 'dagger', 'degree', 'cent', 'sterling', 'section', 'bullet',\n  'paragraph', 'germandbls', 'registered', 'copyright', 'trademark', 'acute',\n  'dieresis', 'notequal', 'AE', 'Oslash', 'infinity', 'plusminus', 'lessequal',\n  'greaterequal', 'yen', 'mu', 'partialdiff', 'summation', 'product', 'pi',\n  'integral', 'ordfeminine', 'ordmasculine', 'Omega', 'ae', 'oslash',\n  'questiondown', 'exclamdown', 'logicalnot', 'radical', 'florin',\n  'approxequal', 'Delta', 'guillemotleft', 'guillemotright', 'ellipsis',\n  'nonbreakingspace', 'Agrave', 'Atilde', 'Otilde', 'OE', 'oe', 'endash',\n  'emdash', 'quotedblleft', 'quotedblright', 'quoteleft', 'quoteright',\n  'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction', 'currency',\n  'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl', 'periodcentered',\n  'quotesinglbase', 'quotedblbase', 'perthousand', 'Acircumflex',\n  'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex',\n  'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple', 'Ograve', 'Uacute',\n  'Ucircumflex', 'Ugrave', 'dotlessi', 'circumflex', 'tilde', 'macron',\n  'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron',\n  'Lslash', 'lslash', 'Scaron', 'scaron', 'Zcaron', 'zcaron', 'brokenbar',\n  'Eth', 'eth', 'Yacute', 'yacute', 'Thorn', 'thorn', 'minus', 'multiply',\n  'onesuperior', 'twosuperior', 'threesuperior', 'onehalf', 'onequarter',\n  'threequarters', 'franc', 'Gbreve', 'gbreve', 'Idotaccent', 'Scedilla',\n  'scedilla', 'Cacute', 'cacute', 'Ccaron', 'ccaron', 'dcroat'];\n\nfunction adjustWidths(properties) {\n  if (!properties.fontMatrix) {\n    return;\n  }\n  if (properties.fontMatrix[0] === FONT_IDENTITY_MATRIX[0]) {\n    return;\n  }\n  // adjusting width to fontMatrix scale\n  var scale = 0.001 / properties.fontMatrix[0];\n  var glyphsWidths = properties.widths;\n  for (var glyph in glyphsWidths) {\n    glyphsWidths[glyph] *= scale;\n  }\n  properties.defaultWidth *= scale;\n}\n\nfunction adjustToUnicode(properties, builtInEncoding) {\n  if (properties.hasIncludedToUnicodeMap) {\n    return; // The font dictionary has a `ToUnicode` entry.\n  }\n  if (properties.hasEncoding) {\n    return; // The font dictionary has an `Encoding` entry.\n  }\n  if (builtInEncoding === properties.defaultEncoding) {\n    return; // No point in trying to adjust `toUnicode` if the encodings match.\n  }\n  if (properties.toUnicode instanceof IdentityToUnicodeMap) {\n    return;\n  }\n  var toUnicode = [], glyphsUnicodeMap = getGlyphsUnicode();\n  for (var charCode in builtInEncoding) {\n    var glyphName = builtInEncoding[charCode];\n    var unicode = getUnicodeForGlyph(glyphName, glyphsUnicodeMap);\n    if (unicode !== -1) {\n      toUnicode[charCode] = String.fromCharCode(unicode);\n    }\n  }\n  properties.toUnicode.amend(toUnicode);\n}\n\nfunction getFontType(type, subtype) {\n  switch (type) {\n    case 'Type1':\n      return subtype === 'Type1C' ? FontType.TYPE1C : FontType.TYPE1;\n    case 'CIDFontType0':\n      return subtype === 'CIDFontType0C' ? FontType.CIDFONTTYPE0C :\n        FontType.CIDFONTTYPE0;\n    case 'OpenType':\n      return FontType.OPENTYPE;\n    case 'TrueType':\n      return FontType.TRUETYPE;\n    case 'CIDFontType2':\n      return FontType.CIDFONTTYPE2;\n    case 'MMType1':\n      return FontType.MMTYPE1;\n    case 'Type0':\n      return FontType.TYPE0;\n    default:\n      return FontType.UNKNOWN;\n  }\n}\n\n// Some bad PDF generators, e.g. Scribus PDF, include glyph names\n// in a 'uniXXXX' format -- attempting to recover proper ones.\nfunction recoverGlyphName(name, glyphsUnicodeMap) {\n  if (glyphsUnicodeMap[name] !== undefined) {\n    return name;\n  }\n  // The glyph name is non-standard, trying to recover.\n  var unicode = getUnicodeForGlyph(name, glyphsUnicodeMap);\n  if (unicode !== -1) {\n    for (var key in glyphsUnicodeMap) {\n      if (glyphsUnicodeMap[key] === unicode) {\n        return key;\n      }\n    }\n  }\n  info('Unable to recover a standard glyph name for: ' + name);\n  return name;\n}\n\nvar Glyph = (function GlyphClosure() {\n  function Glyph(fontChar, unicode, accent, width, vmetric, operatorListId,\n                 isSpace, isInFont) {\n    this.fontChar = fontChar;\n    this.unicode = unicode;\n    this.accent = accent;\n    this.width = width;\n    this.vmetric = vmetric;\n    this.operatorListId = operatorListId;\n    this.isSpace = isSpace;\n    this.isInFont = isInFont;\n  }\n\n  Glyph.prototype.matchesForCache = function(fontChar, unicode, accent, width,\n                                             vmetric, operatorListId, isSpace,\n                                             isInFont) {\n    return this.fontChar === fontChar &&\n           this.unicode === unicode &&\n           this.accent === accent &&\n           this.width === width &&\n           this.vmetric === vmetric &&\n           this.operatorListId === operatorListId &&\n           this.isSpace === isSpace &&\n           this.isInFont === isInFont;\n  };\n\n  return Glyph;\n})();\n\nvar ToUnicodeMap = (function ToUnicodeMapClosure() {\n  function ToUnicodeMap(cmap = []) {\n    // The elements of this._map can be integers or strings, depending on how\n    // `cmap` was created.\n    this._map = cmap;\n  }\n\n  ToUnicodeMap.prototype = {\n    get length() {\n      return this._map.length;\n    },\n\n    forEach(callback) {\n      for (var charCode in this._map) {\n        callback(charCode, this._map[charCode].charCodeAt(0));\n      }\n    },\n\n    has(i) {\n      return this._map[i] !== undefined;\n    },\n\n    get(i) {\n      return this._map[i];\n    },\n\n    charCodeOf(value) {\n      // `Array.prototype.indexOf` is *extremely* inefficient for arrays which\n      // are both very sparse and very large (see issue8372.pdf).\n      let map = this._map;\n      if (map.length <= 0x10000) {\n        return map.indexOf(value);\n      }\n      for (let charCode in map) {\n        if (map[charCode] === value) {\n          return (charCode | 0);\n        }\n      }\n      return -1;\n    },\n\n    amend(map) {\n      for (var charCode in map) {\n        this._map[charCode] = map[charCode];\n      }\n    },\n  };\n\n  return ToUnicodeMap;\n})();\n\nvar IdentityToUnicodeMap = (function IdentityToUnicodeMapClosure() {\n  function IdentityToUnicodeMap(firstChar, lastChar) {\n    this.firstChar = firstChar;\n    this.lastChar = lastChar;\n  }\n\n  IdentityToUnicodeMap.prototype = {\n    get length() {\n      return (this.lastChar + 1) - this.firstChar;\n    },\n\n    forEach(callback) {\n      for (var i = this.firstChar, ii = this.lastChar; i <= ii; i++) {\n        callback(i, i);\n      }\n    },\n\n    has(i) {\n      return this.firstChar <= i && i <= this.lastChar;\n    },\n\n    get(i) {\n      if (this.firstChar <= i && i <= this.lastChar) {\n        return String.fromCharCode(i);\n      }\n      return undefined;\n    },\n\n    charCodeOf(v) {\n      return (Number.isInteger(v) &&\n              v >= this.firstChar && v <= this.lastChar) ? v : -1;\n    },\n\n    amend(map) {\n      unreachable('Should not call amend()');\n    },\n  };\n\n  return IdentityToUnicodeMap;\n})();\n\nvar OpenTypeFileBuilder = (function OpenTypeFileBuilderClosure() {\n  function writeInt16(dest, offset, num) {\n    dest[offset] = (num >> 8) & 0xFF;\n    dest[offset + 1] = num & 0xFF;\n  }\n\n  function writeInt32(dest, offset, num) {\n    dest[offset] = (num >> 24) & 0xFF;\n    dest[offset + 1] = (num >> 16) & 0xFF;\n    dest[offset + 2] = (num >> 8) & 0xFF;\n    dest[offset + 3] = num & 0xFF;\n  }\n\n  function writeData(dest, offset, data) {\n    var i, ii;\n    if (data instanceof Uint8Array) {\n      dest.set(data, offset);\n    } else if (typeof data === 'string') {\n      for (i = 0, ii = data.length; i < ii; i++) {\n        dest[offset++] = data.charCodeAt(i) & 0xFF;\n      }\n    } else {\n      // treating everything else as array\n      for (i = 0, ii = data.length; i < ii; i++) {\n        dest[offset++] = data[i] & 0xFF;\n      }\n    }\n  }\n\n  function OpenTypeFileBuilder(sfnt) {\n    this.sfnt = sfnt;\n    this.tables = Object.create(null);\n  }\n\n  OpenTypeFileBuilder.getSearchParams =\n      function OpenTypeFileBuilder_getSearchParams(entriesCount, entrySize) {\n    var maxPower2 = 1, log2 = 0;\n    while ((maxPower2 ^ entriesCount) > maxPower2) {\n      maxPower2 <<= 1;\n      log2++;\n    }\n    var searchRange = maxPower2 * entrySize;\n    return {\n      range: searchRange,\n      entry: log2,\n      rangeShift: entrySize * entriesCount - searchRange,\n    };\n  };\n\n  var OTF_HEADER_SIZE = 12;\n  var OTF_TABLE_ENTRY_SIZE = 16;\n\n  OpenTypeFileBuilder.prototype = {\n    toArray: function OpenTypeFileBuilder_toArray() {\n      var sfnt = this.sfnt;\n\n      // Tables needs to be written by ascendant alphabetic order\n      var tables = this.tables;\n      var tablesNames = Object.keys(tables);\n      tablesNames.sort();\n      var numTables = tablesNames.length;\n\n      var i, j, jj, table, tableName;\n      // layout the tables data\n      var offset = OTF_HEADER_SIZE + numTables * OTF_TABLE_ENTRY_SIZE;\n      var tableOffsets = [offset];\n      for (i = 0; i < numTables; i++) {\n        table = tables[tablesNames[i]];\n        var paddedLength = ((table.length + 3) & ~3) >>> 0;\n        offset += paddedLength;\n        tableOffsets.push(offset);\n      }\n\n      var file = new Uint8Array(offset);\n      // write the table data first (mostly for checksum)\n      for (i = 0; i < numTables; i++) {\n        table = tables[tablesNames[i]];\n        writeData(file, tableOffsets[i], table);\n      }\n\n      // sfnt version (4 bytes)\n      if (sfnt === 'true') {\n        // Windows hates the Mac TrueType sfnt version number\n        sfnt = string32(0x00010000);\n      }\n      file[0] = sfnt.charCodeAt(0) & 0xFF;\n      file[1] = sfnt.charCodeAt(1) & 0xFF;\n      file[2] = sfnt.charCodeAt(2) & 0xFF;\n      file[3] = sfnt.charCodeAt(3) & 0xFF;\n\n      // numTables (2 bytes)\n      writeInt16(file, 4, numTables);\n\n      var searchParams = OpenTypeFileBuilder.getSearchParams(numTables, 16);\n\n      // searchRange (2 bytes)\n      writeInt16(file, 6, searchParams.range);\n      // entrySelector (2 bytes)\n      writeInt16(file, 8, searchParams.entry);\n      // rangeShift (2 bytes)\n      writeInt16(file, 10, searchParams.rangeShift);\n\n      offset = OTF_HEADER_SIZE;\n      // writing table entries\n      for (i = 0; i < numTables; i++) {\n        tableName = tablesNames[i];\n        file[offset] = tableName.charCodeAt(0) & 0xFF;\n        file[offset + 1] = tableName.charCodeAt(1) & 0xFF;\n        file[offset + 2] = tableName.charCodeAt(2) & 0xFF;\n        file[offset + 3] = tableName.charCodeAt(3) & 0xFF;\n\n        // checksum\n        var checksum = 0;\n        for (j = tableOffsets[i], jj = tableOffsets[i + 1]; j < jj; j += 4) {\n          var quad = readUint32(file, j);\n          checksum = (checksum + quad) >>> 0;\n        }\n        writeInt32(file, offset + 4, checksum);\n\n        // offset\n        writeInt32(file, offset + 8, tableOffsets[i]);\n        // length\n        writeInt32(file, offset + 12, tables[tableName].length);\n\n        offset += OTF_TABLE_ENTRY_SIZE;\n      }\n      return file;\n    },\n\n    addTable: function OpenTypeFileBuilder_addTable(tag, data) {\n      if (tag in this.tables) {\n        throw new Error('Table ' + tag + ' already exists');\n      }\n      this.tables[tag] = data;\n    },\n  };\n\n  return OpenTypeFileBuilder;\n})();\n\n/**\n * 'Font' is the class the outside world should use, it encapsulate all the font\n * decoding logics whatever type it is (assuming the font type is supported).\n *\n * For example to read a Type1 font and to attach it to the document:\n *   var type1Font = new Font(\"MyFontName\", binaryFile, propertiesObject);\n *   type1Font.bind();\n */\nvar Font = (function FontClosure() {\n  function Font(name, file, properties) {\n    var charCode;\n\n    this.name = name;\n    this.loadedName = properties.loadedName;\n    this.isType3Font = properties.isType3Font;\n    this.sizes = [];\n    this.missingFile = false;\n\n    this.glyphCache = Object.create(null);\n\n    this.isSerifFont = !!(properties.flags & FontFlags.Serif);\n    this.isSymbolicFont = !!(properties.flags & FontFlags.Symbolic);\n    this.isMonospace = !!(properties.flags & FontFlags.FixedPitch);\n\n    var type = properties.type;\n    var subtype = properties.subtype;\n    this.type = type;\n    this.subtype = subtype;\n\n    this.fallbackName = (this.isMonospace ? 'monospace' :\n                         (this.isSerifFont ? 'serif' : 'sans-serif'));\n\n    this.differences = properties.differences;\n    this.widths = properties.widths;\n    this.defaultWidth = properties.defaultWidth;\n    this.composite = properties.composite;\n    this.wideChars = properties.wideChars;\n    this.cMap = properties.cMap;\n    this.ascent = properties.ascent / PDF_GLYPH_SPACE_UNITS;\n    this.descent = properties.descent / PDF_GLYPH_SPACE_UNITS;\n    this.fontMatrix = properties.fontMatrix;\n    this.bbox = properties.bbox;\n    this.defaultEncoding = properties.defaultEncoding;\n\n    this.toUnicode = properties.toUnicode;\n    this.fallbackToUnicode = properties.fallbackToUnicode || new ToUnicodeMap();\n\n    this.toFontChar = [];\n\n    if (properties.type === 'Type3') {\n      for (charCode = 0; charCode < 256; charCode++) {\n        this.toFontChar[charCode] = (this.differences[charCode] ||\n                                     properties.defaultEncoding[charCode]);\n      }\n      this.fontType = FontType.TYPE3;\n      return;\n    }\n\n    this.cidEncoding = properties.cidEncoding;\n    this.vertical = properties.vertical;\n    if (this.vertical) {\n      this.vmetrics = properties.vmetrics;\n      this.defaultVMetrics = properties.defaultVMetrics;\n    }\n\n    if (!file || file.isEmpty) {\n      if (file) {\n        // Some bad PDF generators will include empty font files,\n        // attempting to recover by assuming that no file exists.\n        warn('Font file is empty in \"' + name + '\" (' + this.loadedName + ')');\n      }\n      this.fallbackToSystemFont();\n      return;\n    }\n\n    // Parse the font file to determine the correct type/subtype, rather than\n    // relying on the (often incorrect) data in the font dictionary; (see e.g.\n    //  issue6782.pdf, issue7598.pdf, and issue9949.pdf).\n    [type, subtype] = getFontFileType(file, properties);\n\n    if (type !== this.type || subtype !== this.subtype) {\n      info('Inconsistent font file Type/SubType, expected: ' +\n           `${this.type}/${this.subtype} but found: ${type}/${subtype}.`);\n    }\n\n    try {\n      var data;\n      switch (type) {\n        case 'MMType1':\n          info('MMType1 font (' + name + '), falling back to Type1.');\n          /* falls through */\n        case 'Type1':\n        case 'CIDFontType0':\n          this.mimetype = 'font/opentype';\n\n          var cff = (subtype === 'Type1C' || subtype === 'CIDFontType0C') ?\n            new CFFFont(file, properties) :\n            new Type1Font(name, file, properties);\n\n          adjustWidths(properties);\n\n          // Wrap the CFF data inside an OTF font file\n          data = this.convert(name, cff, properties);\n          break;\n\n        case 'OpenType':\n        case 'TrueType':\n        case 'CIDFontType2':\n          this.mimetype = 'font/opentype';\n\n          // Repair the TrueType file. It is can be damaged in the point of\n          // view of the sanitizer\n          data = this.checkAndRepair(name, file, properties);\n          if (this.isOpenType) {\n            adjustWidths(properties);\n\n            type = 'OpenType';\n          }\n          break;\n\n        default:\n          throw new FormatError(`Font ${type} is not supported`);\n      }\n    } catch (e) {\n      warn(e);\n      this.fallbackToSystemFont();\n      return;\n    }\n\n    this.data = data;\n    this.fontType = getFontType(type, subtype);\n\n    // Transfer some properties again that could change during font conversion\n    this.fontMatrix = properties.fontMatrix;\n    this.widths = properties.widths;\n    this.defaultWidth = properties.defaultWidth;\n    this.toUnicode = properties.toUnicode;\n    this.encoding = properties.baseEncoding;\n    this.seacMap = properties.seacMap;\n  }\n\n  Font.getFontID = (function () {\n    var ID = 1;\n    return function Font_getFontID() {\n      return String(ID++);\n    };\n  })();\n\n  function int16(b0, b1) {\n    return (b0 << 8) + b1;\n  }\n\n  function writeSignedInt16(bytes, index, value) {\n    bytes[index + 1] = value;\n    bytes[index] = value >>> 8;\n  }\n\n  function signedInt16(b0, b1) {\n    var value = (b0 << 8) + b1;\n    return value & (1 << 15) ? value - 0x10000 : value;\n  }\n\n  function int32(b0, b1, b2, b3) {\n    return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;\n  }\n\n  function string16(value) {\n    return String.fromCharCode((value >> 8) & 0xff, value & 0xff);\n  }\n\n  function safeString16(value) {\n    // clamp value to the 16-bit int range\n    value = (value > 0x7FFF ? 0x7FFF : (value < -0x8000 ? -0x8000 : value));\n    return String.fromCharCode((value >> 8) & 0xff, value & 0xff);\n  }\n\n  function isTrueTypeFile(file) {\n    var header = file.peekBytes(4);\n    return (readUint32(header, 0) === 0x00010000 ||\n            bytesToString(header) === 'true');\n  }\n\n  function isTrueTypeCollectionFile(file) {\n    let header = file.peekBytes(4);\n    return bytesToString(header) === 'ttcf';\n  }\n\n  function isOpenTypeFile(file) {\n    var header = file.peekBytes(4);\n    return bytesToString(header) === 'OTTO';\n  }\n\n  function isType1File(file) {\n    var header = file.peekBytes(2);\n    // All Type1 font programs must begin with the comment '%!' (0x25 + 0x21).\n    if (header[0] === 0x25 && header[1] === 0x21) {\n      return true;\n    }\n    // ... obviously some fonts violate that part of the specification,\n    // please refer to the comment in |Type1Font| below.\n    if (header[0] === 0x80 && header[1] === 0x01) { // pfb file header.\n      return true;\n    }\n    return false;\n  }\n\n  /**\n   * Compared to other font formats, the header in CFF files is not constant\n   * but contains version numbers. To reduce the possibility of misclassifying\n   * font files as CFF, it's recommended to check for other font formats first.\n   */\n  function isCFFFile(file) {\n    const header = file.peekBytes(4);\n    if (/* major version, [1, 255] */ header[0] >= 1 &&\n        /* minor version, [0, 255]; header[1] */\n        /* header size, [0, 255]; header[2] */\n        /* offset(0) size, [1, 4] */ (header[3] >= 1 && header[3] <= 4)) {\n      return true;\n    }\n    return false;\n  }\n\n  function getFontFileType(file, { type, subtype, composite, }) {\n    let fileType, fileSubtype;\n\n    if (isTrueTypeFile(file) || isTrueTypeCollectionFile(file)) {\n      if (composite) {\n        fileType = 'CIDFontType2';\n      } else {\n        fileType = 'TrueType';\n      }\n    } else if (isOpenTypeFile(file)) {\n      if (composite) {\n        fileType = 'CIDFontType2';\n      } else {\n        fileType = 'OpenType';\n      }\n    } else if (isType1File(file)) {\n      if (composite) {\n        fileType = 'CIDFontType0';\n      } else {\n        fileType = (type === 'MMType1' ? 'MMType1' : 'Type1');\n      }\n    } else if (isCFFFile(file)) {\n      if (composite) {\n        fileType = 'CIDFontType0';\n        fileSubtype = 'CIDFontType0C';\n      } else {\n        fileType = (type === 'MMType1' ? 'MMType1' : 'Type1');\n        fileSubtype = 'Type1C';\n      }\n    } else {\n      warn('getFontFileType: Unable to detect correct font file Type/Subtype.');\n      fileType = type;\n      fileSubtype = subtype;\n    }\n\n    return [fileType, fileSubtype];\n  }\n\n  function buildToFontChar(encoding, glyphsUnicodeMap, differences) {\n    var toFontChar = [], unicode;\n    for (var i = 0, ii = encoding.length; i < ii; i++) {\n      unicode = getUnicodeForGlyph(encoding[i], glyphsUnicodeMap);\n      if (unicode !== -1) {\n        toFontChar[i] = unicode;\n      }\n    }\n    for (var charCode in differences) {\n      unicode = getUnicodeForGlyph(differences[charCode], glyphsUnicodeMap);\n      if (unicode !== -1) {\n        toFontChar[+charCode] = unicode;\n      }\n    }\n    return toFontChar;\n  }\n\n  /**\n   * Rebuilds the char code to glyph ID map by moving all char codes to the\n   * private use area. This is done to avoid issues with various problematic\n   * unicode areas where either a glyph won't be drawn or is deformed by a\n   * shaper.\n   * @return {Object} Two properties:\n   * 'toFontChar' - maps original char codes(the value that will be read\n   * from commands such as show text) to the char codes that will be used in the\n   * font that we build\n   * 'charCodeToGlyphId' - maps the new font char codes to glyph ids\n   */\n  function adjustMapping(charCodeToGlyphId, hasGlyph, newGlyphZeroId) {\n    var newMap = Object.create(null);\n    var toFontChar = [];\n    var privateUseAreaIndex = 0;\n    var nextAvailableFontCharCode = PRIVATE_USE_AREAS[privateUseAreaIndex][0];\n    var privateUseOffetEnd = PRIVATE_USE_AREAS[privateUseAreaIndex][1];\n    for (var originalCharCode in charCodeToGlyphId) {\n      originalCharCode |= 0;\n      var glyphId = charCodeToGlyphId[originalCharCode];\n      // For missing glyphs don't create the mappings so the glyph isn't\n      // drawn.\n      if (!hasGlyph(glyphId)) {\n        continue;\n      }\n      if (nextAvailableFontCharCode > privateUseOffetEnd) {\n        privateUseAreaIndex++;\n        if (privateUseAreaIndex >= PRIVATE_USE_AREAS.length) {\n          warn('Ran out of space in font private use area.');\n          break;\n        }\n        nextAvailableFontCharCode = PRIVATE_USE_AREAS[privateUseAreaIndex][0];\n        privateUseOffetEnd = PRIVATE_USE_AREAS[privateUseAreaIndex][1];\n      }\n      var fontCharCode = nextAvailableFontCharCode++;\n      if (glyphId === 0) {\n        glyphId = newGlyphZeroId;\n      }\n\n      newMap[fontCharCode] = glyphId;\n      toFontChar[originalCharCode] = fontCharCode;\n    }\n    return {\n      toFontChar,\n      charCodeToGlyphId: newMap,\n      nextAvailableFontCharCode,\n    };\n  }\n\n  function getRanges(glyphs, numGlyphs) {\n    // Array.sort() sorts by characters, not numerically, so convert to an\n    // array of characters.\n    var codes = [];\n    for (var charCode in glyphs) {\n      // Remove an invalid glyph ID mappings to make OTS happy.\n      if (glyphs[charCode] >= numGlyphs) {\n        continue;\n      }\n      codes.push({ fontCharCode: charCode | 0, glyphId: glyphs[charCode], });\n    }\n    // Some fonts have zero glyphs and are used only for text selection, but\n    // there needs to be at least one to build a valid cmap table.\n    if (codes.length === 0) {\n      codes.push({ fontCharCode: 0, glyphId: 0, });\n    }\n    codes.sort(function fontGetRangesSort(a, b) {\n      return a.fontCharCode - b.fontCharCode;\n    });\n\n    // Split the sorted codes into ranges.\n    var ranges = [];\n    var length = codes.length;\n    for (var n = 0; n < length; ) { // eslint-disable-line space-in-parens\n      var start = codes[n].fontCharCode;\n      var codeIndices = [codes[n].glyphId];\n      ++n;\n      var end = start;\n      while (n < length && end + 1 === codes[n].fontCharCode) {\n        codeIndices.push(codes[n].glyphId);\n        ++end;\n        ++n;\n        if (end === 0xFFFF) {\n          break;\n        }\n      }\n      ranges.push([start, end, codeIndices]);\n    }\n\n    return ranges;\n  }\n\n  function createCmapTable(glyphs, numGlyphs) {\n    var ranges = getRanges(glyphs, numGlyphs);\n    var numTables = ranges[ranges.length - 1][1] > 0xFFFF ? 2 : 1;\n    var cmap = '\\x00\\x00' + // version\n               string16(numTables) +  // numTables\n               '\\x00\\x03' + // platformID\n               '\\x00\\x01' + // encodingID\n               string32(4 + numTables * 8); // start of the table record\n\n    var i, ii, j, jj;\n    for (i = ranges.length - 1; i >= 0; --i) {\n      if (ranges[i][0] <= 0xFFFF) {\n        break;\n      }\n    }\n    var bmpLength = i + 1;\n\n    if (ranges[i][0] < 0xFFFF && ranges[i][1] === 0xFFFF) {\n      ranges[i][1] = 0xFFFE;\n    }\n    var trailingRangesCount = ranges[i][1] < 0xFFFF ? 1 : 0;\n    var segCount = bmpLength + trailingRangesCount;\n    var searchParams = OpenTypeFileBuilder.getSearchParams(segCount, 2);\n\n    // Fill up the 4 parallel arrays describing the segments.\n    var startCount = '';\n    var endCount = '';\n    var idDeltas = '';\n    var idRangeOffsets = '';\n    var glyphsIds = '';\n    var bias = 0;\n\n    var range, start, end, codes;\n    for (i = 0, ii = bmpLength; i < ii; i++) {\n      range = ranges[i];\n      start = range[0];\n      end = range[1];\n      startCount += string16(start);\n      endCount += string16(end);\n      codes = range[2];\n      var contiguous = true;\n      for (j = 1, jj = codes.length; j < jj; ++j) {\n        if (codes[j] !== codes[j - 1] + 1) {\n          contiguous = false;\n          break;\n        }\n      }\n      if (!contiguous) {\n        var offset = (segCount - i) * 2 + bias * 2;\n        bias += (end - start + 1);\n\n        idDeltas += string16(0);\n        idRangeOffsets += string16(offset);\n\n        for (j = 0, jj = codes.length; j < jj; ++j) {\n          glyphsIds += string16(codes[j]);\n        }\n      } else {\n        var startCode = codes[0];\n\n        idDeltas += string16((startCode - start) & 0xFFFF);\n        idRangeOffsets += string16(0);\n      }\n    }\n\n    if (trailingRangesCount > 0) {\n      endCount += '\\xFF\\xFF';\n      startCount += '\\xFF\\xFF';\n      idDeltas += '\\x00\\x01';\n      idRangeOffsets += '\\x00\\x00';\n    }\n\n    var format314 = '\\x00\\x00' + // language\n                    string16(2 * segCount) +\n                    string16(searchParams.range) +\n                    string16(searchParams.entry) +\n                    string16(searchParams.rangeShift) +\n                    endCount + '\\x00\\x00' + startCount +\n                    idDeltas + idRangeOffsets + glyphsIds;\n\n    var format31012 = '';\n    var header31012 = '';\n    if (numTables > 1) {\n      cmap += '\\x00\\x03' + // platformID\n              '\\x00\\x0A' + // encodingID\n              string32(4 + numTables * 8 +\n                       4 + format314.length); // start of the table record\n      format31012 = '';\n      for (i = 0, ii = ranges.length; i < ii; i++) {\n        range = ranges[i];\n        start = range[0];\n        codes = range[2];\n        var code = codes[0];\n        for (j = 1, jj = codes.length; j < jj; ++j) {\n          if (codes[j] !== codes[j - 1] + 1) {\n            end = range[0] + j - 1;\n            format31012 += string32(start) + // startCharCode\n                           string32(end) + // endCharCode\n                           string32(code); // startGlyphID\n            start = end + 1;\n            code = codes[j];\n          }\n        }\n        format31012 += string32(start) + // startCharCode\n                       string32(range[1]) + // endCharCode\n                       string32(code); // startGlyphID\n      }\n      header31012 = '\\x00\\x0C' + // format\n                    '\\x00\\x00' + // reserved\n                    string32(format31012.length + 16) + // length\n                    '\\x00\\x00\\x00\\x00' + // language\n                    string32(format31012.length / 12); // nGroups\n    }\n\n    return cmap + '\\x00\\x04' + // format\n                  string16(format314.length + 4) + // length\n                  format314 + header31012 + format31012;\n  }\n\n  function validateOS2Table(os2) {\n    var stream = new Stream(os2.data);\n    var version = stream.getUint16();\n    // TODO verify all OS/2 tables fields, but currently we validate only those\n    // that give us issues\n    stream.getBytes(60); // skipping type, misc sizes, panose, unicode ranges\n    var selection = stream.getUint16();\n    if (version < 4 && (selection & 0x0300)) {\n      return false;\n    }\n    var firstChar = stream.getUint16();\n    var lastChar = stream.getUint16();\n    if (firstChar > lastChar) {\n      return false;\n    }\n    stream.getBytes(6); // skipping sTypoAscender/Descender/LineGap\n    var usWinAscent = stream.getUint16();\n    if (usWinAscent === 0) { // makes font unreadable by windows\n      return false;\n    }\n\n    // OS/2 appears to be valid, resetting some fields\n    os2.data[8] = os2.data[9] = 0; // IE rejects fonts if fsType != 0\n    return true;\n  }\n\n  function createOS2Table(properties, charstrings, override) {\n    override = override || {\n      unitsPerEm: 0,\n      yMax: 0,\n      yMin: 0,\n      ascent: 0,\n      descent: 0,\n    };\n\n    var ulUnicodeRange1 = 0;\n    var ulUnicodeRange2 = 0;\n    var ulUnicodeRange3 = 0;\n    var ulUnicodeRange4 = 0;\n\n    var firstCharIndex = null;\n    var lastCharIndex = 0;\n\n    if (charstrings) {\n      for (var code in charstrings) {\n        code |= 0;\n        if (firstCharIndex > code || !firstCharIndex) {\n          firstCharIndex = code;\n        }\n        if (lastCharIndex < code) {\n          lastCharIndex = code;\n        }\n\n        var position = getUnicodeRangeFor(code);\n        if (position < 32) {\n          ulUnicodeRange1 |= 1 << position;\n        } else if (position < 64) {\n          ulUnicodeRange2 |= 1 << position - 32;\n        } else if (position < 96) {\n          ulUnicodeRange3 |= 1 << position - 64;\n        } else if (position < 123) {\n          ulUnicodeRange4 |= 1 << position - 96;\n        } else {\n          throw new FormatError(\n            'Unicode ranges Bits > 123 are reserved for internal usage');\n        }\n      }\n      if (lastCharIndex > 0xFFFF) {\n        // OS2 only supports a 16 bit int. The spec says if supplementary\n        // characters are used the field should just be set to 0xFFFF.\n        lastCharIndex = 0xFFFF;\n      }\n    } else {\n      // TODO\n      firstCharIndex = 0;\n      lastCharIndex = 255;\n    }\n\n    var bbox = properties.bbox || [0, 0, 0, 0];\n    var unitsPerEm = (override.unitsPerEm ||\n                      1 / (properties.fontMatrix || FONT_IDENTITY_MATRIX)[0]);\n\n    // if the font units differ to the PDF glyph space units\n    // then scale up the values\n    var scale = (properties.ascentScaled ? 1.0 :\n                 unitsPerEm / PDF_GLYPH_SPACE_UNITS);\n\n    var typoAscent = (override.ascent ||\n                      Math.round(scale * (properties.ascent || bbox[3])));\n    var typoDescent = (override.descent ||\n                       Math.round(scale * (properties.descent || bbox[1])));\n    if (typoDescent > 0 && properties.descent > 0 && bbox[1] < 0) {\n      typoDescent = -typoDescent; // fixing incorrect descent\n    }\n    var winAscent = override.yMax || typoAscent;\n    var winDescent = -override.yMin || -typoDescent;\n\n    return '\\x00\\x03' + // version\n           '\\x02\\x24' + // xAvgCharWidth\n           '\\x01\\xF4' + // usWeightClass\n           '\\x00\\x05' + // usWidthClass\n           '\\x00\\x00' + // fstype (0 to let the font loads via font-face on IE)\n           '\\x02\\x8A' + // ySubscriptXSize\n           '\\x02\\xBB' + // ySubscriptYSize\n           '\\x00\\x00' + // ySubscriptXOffset\n           '\\x00\\x8C' + // ySubscriptYOffset\n           '\\x02\\x8A' + // ySuperScriptXSize\n           '\\x02\\xBB' + // ySuperScriptYSize\n           '\\x00\\x00' + // ySuperScriptXOffset\n           '\\x01\\xDF' + // ySuperScriptYOffset\n           '\\x00\\x31' + // yStrikeOutSize\n           '\\x01\\x02' + // yStrikeOutPosition\n           '\\x00\\x00' + // sFamilyClass\n           '\\x00\\x00\\x06' +\n           String.fromCharCode(properties.fixedPitch ? 0x09 : 0x00) +\n           '\\x00\\x00\\x00\\x00\\x00\\x00' + // Panose\n           string32(ulUnicodeRange1) + // ulUnicodeRange1 (Bits 0-31)\n           string32(ulUnicodeRange2) + // ulUnicodeRange2 (Bits 32-63)\n           string32(ulUnicodeRange3) + // ulUnicodeRange3 (Bits 64-95)\n           string32(ulUnicodeRange4) + // ulUnicodeRange4 (Bits 96-127)\n           '\\x2A\\x32\\x31\\x2A' + // achVendID\n           string16(properties.italicAngle ? 1 : 0) + // fsSelection\n           string16(firstCharIndex ||\n                    properties.firstChar) + // usFirstCharIndex\n           string16(lastCharIndex || properties.lastChar) +  // usLastCharIndex\n           string16(typoAscent) + // sTypoAscender\n           string16(typoDescent) + // sTypoDescender\n           '\\x00\\x64' + // sTypoLineGap (7%-10% of the unitsPerEM value)\n           string16(winAscent) + // usWinAscent\n           string16(winDescent) + // usWinDescent\n           '\\x00\\x00\\x00\\x00' + // ulCodePageRange1 (Bits 0-31)\n           '\\x00\\x00\\x00\\x00' + // ulCodePageRange2 (Bits 32-63)\n           string16(properties.xHeight) + // sxHeight\n           string16(properties.capHeight) + // sCapHeight\n           string16(0) + // usDefaultChar\n           string16(firstCharIndex || properties.firstChar) + // usBreakChar\n           '\\x00\\x03';  // usMaxContext\n  }\n\n  function createPostTable(properties) {\n    var angle = Math.floor(properties.italicAngle * (Math.pow(2, 16)));\n    return ('\\x00\\x03\\x00\\x00' + // Version number\n            string32(angle) + // italicAngle\n            '\\x00\\x00' + // underlinePosition\n            '\\x00\\x00' + // underlineThickness\n            string32(properties.fixedPitch) + // isFixedPitch\n            '\\x00\\x00\\x00\\x00' + // minMemType42\n            '\\x00\\x00\\x00\\x00' + // maxMemType42\n            '\\x00\\x00\\x00\\x00' + // minMemType1\n            '\\x00\\x00\\x00\\x00');  // maxMemType1\n  }\n\n  function createNameTable(name, proto) {\n    if (!proto) {\n      proto = [[], []]; // no strings and unicode strings\n    }\n\n    var strings = [\n      proto[0][0] || 'Original licence',  // 0.Copyright\n      proto[0][1] || name,                // 1.Font family\n      proto[0][2] || 'Unknown',           // 2.Font subfamily (font weight)\n      proto[0][3] || 'uniqueID',          // 3.Unique ID\n      proto[0][4] || name,                // 4.Full font name\n      proto[0][5] || 'Version 0.11',      // 5.Version\n      proto[0][6] || '',                  // 6.Postscript name\n      proto[0][7] || 'Unknown',           // 7.Trademark\n      proto[0][8] || 'Unknown',           // 8.Manufacturer\n      proto[0][9] || 'Unknown'            // 9.Designer\n    ];\n\n    // Mac want 1-byte per character strings while Windows want\n    // 2-bytes per character, so duplicate the names table\n    var stringsUnicode = [];\n    var i, ii, j, jj, str;\n    for (i = 0, ii = strings.length; i < ii; i++) {\n      str = proto[1][i] || strings[i];\n\n      var strBufUnicode = [];\n      for (j = 0, jj = str.length; j < jj; j++) {\n        strBufUnicode.push(string16(str.charCodeAt(j)));\n      }\n      stringsUnicode.push(strBufUnicode.join(''));\n    }\n\n    var names = [strings, stringsUnicode];\n    var platforms = ['\\x00\\x01', '\\x00\\x03'];\n    var encodings = ['\\x00\\x00', '\\x00\\x01'];\n    var languages = ['\\x00\\x00', '\\x04\\x09'];\n\n    var namesRecordCount = strings.length * platforms.length;\n    var nameTable =\n      '\\x00\\x00' +                           // format\n      string16(namesRecordCount) +           // Number of names Record\n      string16(namesRecordCount * 12 + 6);   // Storage\n\n    // Build the name records field\n    var strOffset = 0;\n    for (i = 0, ii = platforms.length; i < ii; i++) {\n      var strs = names[i];\n      for (j = 0, jj = strs.length; j < jj; j++) {\n        str = strs[j];\n        var nameRecord =\n          platforms[i] + // platform ID\n          encodings[i] + // encoding ID\n          languages[i] + // language ID\n          string16(j) + // name ID\n          string16(str.length) +\n          string16(strOffset);\n        nameTable += nameRecord;\n        strOffset += str.length;\n      }\n    }\n\n    nameTable += strings.join('') + stringsUnicode.join('');\n    return nameTable;\n  }\n\n  Font.prototype = {\n    name: null,\n    font: null,\n    mimetype: null,\n    encoding: null,\n    get renderer() {\n      var renderer = FontRendererFactory.create(this, SEAC_ANALYSIS_ENABLED);\n      return shadow(this, 'renderer', renderer);\n    },\n\n    exportData: function Font_exportData() {\n      // TODO remove enumerating of the properties, e.g. hardcode exact names.\n      var data = {};\n      for (var i in this) {\n        if (this.hasOwnProperty(i)) {\n          data[i] = this[i];\n        }\n      }\n      return data;\n    },\n\n    fallbackToSystemFont: function Font_fallbackToSystemFont() {\n      this.missingFile = true;\n      var charCode, unicode;\n      // The file data is not specified. Trying to fix the font name\n      // to be used with the canvas.font.\n      var name = this.name;\n      var type = this.type;\n      var subtype = this.subtype;\n      var fontName = name.replace(/[,_]/g, '-');\n      var stdFontMap = getStdFontMap(), nonStdFontMap = getNonStdFontMap();\n      var isStandardFont = !!stdFontMap[fontName] ||\n        !!(nonStdFontMap[fontName] && stdFontMap[nonStdFontMap[fontName]]);\n      fontName = stdFontMap[fontName] || nonStdFontMap[fontName] || fontName;\n\n      this.bold = (fontName.search(/bold/gi) !== -1);\n      this.italic = ((fontName.search(/oblique/gi) !== -1) ||\n                     (fontName.search(/italic/gi) !== -1));\n\n      // Use 'name' instead of 'fontName' here because the original\n      // name ArialBlack for example will be replaced by Helvetica.\n      this.black = (name.search(/Black/g) !== -1);\n\n      // if at least one width is present, remeasure all chars when exists\n      this.remeasure = Object.keys(this.widths).length > 0;\n      if (isStandardFont && type === 'CIDFontType2' &&\n          this.cidEncoding.indexOf('Identity-') === 0) {\n        var GlyphMapForStandardFonts = getGlyphMapForStandardFonts();\n        // Standard fonts might be embedded as CID font without glyph mapping.\n        // Building one based on GlyphMapForStandardFonts.\n        var map = [];\n        for (charCode in GlyphMapForStandardFonts) {\n          map[+charCode] = GlyphMapForStandardFonts[charCode];\n        }\n        if (/Arial-?Black/i.test(name)) {\n          var SupplementalGlyphMapForArialBlack =\n            getSupplementalGlyphMapForArialBlack();\n          for (charCode in SupplementalGlyphMapForArialBlack) {\n            map[+charCode] = SupplementalGlyphMapForArialBlack[charCode];\n          }\n        } else if (/Calibri/i.test(name)) {\n          let SupplementalGlyphMapForCalibri =\n            getSupplementalGlyphMapForCalibri();\n          for (charCode in SupplementalGlyphMapForCalibri) {\n            map[+charCode] = SupplementalGlyphMapForCalibri[charCode];\n          }\n        }\n\n        var isIdentityUnicode = this.toUnicode instanceof IdentityToUnicodeMap;\n        if (!isIdentityUnicode) {\n          this.toUnicode.forEach(function(charCode, unicodeCharCode) {\n            map[+charCode] = unicodeCharCode;\n          });\n        }\n        this.toFontChar = map;\n        this.toUnicode = new ToUnicodeMap(map);\n      } else if (/Symbol/i.test(fontName)) {\n        this.toFontChar = buildToFontChar(SymbolSetEncoding, getGlyphsUnicode(),\n                                          this.differences);\n      } else if (/Dingbats/i.test(fontName)) {\n        if (/Wingdings/i.test(name)) {\n          warn('Non-embedded Wingdings font, falling back to ZapfDingbats.');\n        }\n        this.toFontChar = buildToFontChar(ZapfDingbatsEncoding,\n                                          getDingbatsGlyphsUnicode(),\n                                          this.differences);\n      } else if (isStandardFont) {\n        this.toFontChar = buildToFontChar(this.defaultEncoding,\n                                          getGlyphsUnicode(),\n                                          this.differences);\n      } else {\n        var glyphsUnicodeMap = getGlyphsUnicode();\n        this.toUnicode.forEach((charCode, unicodeCharCode) => {\n          if (!this.composite) {\n            var glyphName = (this.differences[charCode] ||\n                             this.defaultEncoding[charCode]);\n            unicode = getUnicodeForGlyph(glyphName, glyphsUnicodeMap);\n            if (unicode !== -1) {\n              unicodeCharCode = unicode;\n            }\n          }\n          this.toFontChar[charCode] = unicodeCharCode;\n        });\n      }\n      this.loadedName = fontName.split('-')[0];\n      this.fontType = getFontType(type, subtype);\n    },\n\n    checkAndRepair: function Font_checkAndRepair(name, font, properties) {\n      const VALID_TABLES = ['OS/2', 'cmap', 'head', 'hhea', 'hmtx', 'maxp',\n        'name', 'post', 'loca', 'glyf', 'fpgm', 'prep', 'cvt ', 'CFF '];\n\n      function readTables(file, numTables) {\n        let tables = Object.create(null);\n        tables['OS/2'] = null;\n        tables['cmap'] = null;\n        tables['head'] = null;\n        tables['hhea'] = null;\n        tables['hmtx'] = null;\n        tables['maxp'] = null;\n        tables['name'] = null;\n        tables['post'] = null;\n\n        for (let i = 0; i < numTables; i++) {\n          let table = readTableEntry(font);\n          if (!VALID_TABLES.includes(table.tag)) {\n            continue; // skipping table if it's not a required or optional table\n          }\n          if (table.length === 0) {\n            continue; // skipping empty tables\n          }\n          tables[table.tag] = table;\n        }\n        return tables;\n      }\n\n      function readTableEntry(file) {\n        var tag = bytesToString(file.getBytes(4));\n\n        var checksum = file.getInt32() >>> 0;\n        var offset = file.getInt32() >>> 0;\n        var length = file.getInt32() >>> 0;\n\n        // Read the table associated data\n        var previousPosition = file.pos;\n        file.pos = file.start ? file.start : 0;\n        file.skip(offset);\n        var data = file.getBytes(length);\n        file.pos = previousPosition;\n\n        if (tag === 'head') {\n          // clearing checksum adjustment\n          data[8] = data[9] = data[10] = data[11] = 0;\n          data[17] |= 0x20; // Set font optimized for cleartype flag.\n        }\n\n        return {\n          tag,\n          checksum,\n          length,\n          offset,\n          data,\n        };\n      }\n\n      function readOpenTypeHeader(ttf) {\n        return {\n          version: bytesToString(ttf.getBytes(4)),\n          numTables: ttf.getUint16(),\n          searchRange: ttf.getUint16(),\n          entrySelector: ttf.getUint16(),\n          rangeShift: ttf.getUint16(),\n        };\n      }\n\n      function readTrueTypeCollectionHeader(ttc) {\n        let ttcTag = bytesToString(ttc.getBytes(4));\n        assert(ttcTag === 'ttcf', 'Must be a TrueType Collection font.');\n\n        let majorVersion = ttc.getUint16();\n        let minorVersion = ttc.getUint16();\n        let numFonts = ttc.getInt32() >>> 0;\n        let offsetTable = [];\n        for (let i = 0; i < numFonts; i++) {\n          offsetTable.push(ttc.getInt32() >>> 0);\n        }\n\n        let header = {\n          ttcTag,\n          majorVersion,\n          minorVersion,\n          numFonts,\n          offsetTable,\n        };\n        switch (majorVersion) {\n          case 1:\n            return header;\n          case 2:\n            header.dsigTag = ttc.getInt32() >>> 0;\n            header.dsigLength = ttc.getInt32() >>> 0;\n            header.dsigOffset = ttc.getInt32() >>> 0;\n            return header;\n        }\n        throw new FormatError(\n          `Invalid TrueType Collection majorVersion: ${majorVersion}.`);\n      }\n\n      function readTrueTypeCollectionData(ttc, fontName) {\n        let { numFonts, offsetTable, } = readTrueTypeCollectionHeader(ttc);\n\n        for (let i = 0; i < numFonts; i++) {\n          ttc.pos = (ttc.start || 0) + offsetTable[i];\n          let potentialHeader = readOpenTypeHeader(ttc);\n          let potentialTables = readTables(ttc, potentialHeader.numTables);\n\n          if (!potentialTables['name']) {\n            throw new FormatError(\n              'TrueType Collection font must contain a \"name\" table.');\n          }\n          let nameTable = readNameTable(potentialTables['name']);\n\n          for (let j = 0, jj = nameTable.length; j < jj; j++) {\n            for (let k = 0, kk = nameTable[j].length; k < kk; k++) {\n              let nameEntry = nameTable[j][k];\n              if (nameEntry && nameEntry.replace(/\\s/g, '') === fontName) {\n                return {\n                  header: potentialHeader,\n                  tables: potentialTables,\n                };\n              }\n            }\n          }\n        }\n        throw new FormatError(\n          `TrueType Collection does not contain \"${fontName}\" font.`);\n      }\n\n      /**\n       * Read the appropriate subtable from the cmap according to 9.6.6.4 from\n       * PDF spec\n       */\n      function readCmapTable(cmap, font, isSymbolicFont, hasEncoding) {\n        if (!cmap) {\n          warn('No cmap table available.');\n          return {\n            platformId: -1,\n            encodingId: -1,\n            mappings: [],\n            hasShortCmap: false,\n          };\n        }\n        var segment;\n        var start = (font.start ? font.start : 0) + cmap.offset;\n        font.pos = start;\n\n        font.getUint16(); // version\n        var numTables = font.getUint16();\n\n        var potentialTable;\n        var canBreak = false;\n        // There's an order of preference in terms of which cmap subtable to\n        // use:\n        // - non-symbolic fonts the preference is a 3,1 table then a 1,0 table\n        // - symbolic fonts the preference is a 3,0 table then a 1,0 table\n        // The following takes advantage of the fact that the tables are sorted\n        // to work.\n        for (var i = 0; i < numTables; i++) {\n          var platformId = font.getUint16();\n          var encodingId = font.getUint16();\n          var offset = font.getInt32() >>> 0;\n          var useTable = false;\n\n          // Sometimes there are multiple of the same type of table. Default\n          // to choosing the first table and skip the rest.\n          if (potentialTable && potentialTable.platformId === platformId &&\n              potentialTable.encodingId === encodingId) {\n            continue;\n          }\n\n          if (platformId === 0 && encodingId === 0) {\n            useTable = true;\n            // Continue the loop since there still may be a higher priority\n            // table.\n          } else if (platformId === 1 && encodingId === 0) {\n            useTable = true;\n            // Continue the loop since there still may be a higher priority\n            // table.\n          } else if (platformId === 3 && encodingId === 1 &&\n                     (hasEncoding || !potentialTable)) {\n            useTable = true;\n            if (!isSymbolicFont) {\n              canBreak = true;\n            }\n          } else if (isSymbolicFont && platformId === 3 && encodingId === 0) {\n            useTable = true;\n            canBreak = true;\n          }\n\n          if (useTable) {\n            potentialTable = {\n              platformId,\n              encodingId,\n              offset,\n            };\n          }\n          if (canBreak) {\n            break;\n          }\n        }\n\n        if (potentialTable) {\n          font.pos = start + potentialTable.offset;\n        }\n        if (!potentialTable || font.peekByte() === -1) {\n          warn('Could not find a preferred cmap table.');\n          return {\n            platformId: -1,\n            encodingId: -1,\n            mappings: [],\n            hasShortCmap: false,\n          };\n        }\n\n        var format = font.getUint16();\n        font.getUint16(); // length\n        font.getUint16(); // language\n\n        var hasShortCmap = false;\n        var mappings = [];\n        var j, glyphId;\n\n        // TODO(mack): refactor this cmap subtable reading logic out\n        if (format === 0) {\n          for (j = 0; j < 256; j++) {\n            var index = font.getByte();\n            if (!index) {\n              continue;\n            }\n            mappings.push({\n              charCode: j,\n              glyphId: index,\n            });\n          }\n          hasShortCmap = true;\n        } else if (format === 4) {\n          // re-creating the table in format 4 since the encoding\n          // might be changed\n          var segCount = (font.getUint16() >> 1);\n          font.getBytes(6); // skipping range fields\n          var segIndex, segments = [];\n          for (segIndex = 0; segIndex < segCount; segIndex++) {\n            segments.push({ end: font.getUint16(), });\n          }\n          font.getUint16();\n          for (segIndex = 0; segIndex < segCount; segIndex++) {\n            segments[segIndex].start = font.getUint16();\n          }\n\n          for (segIndex = 0; segIndex < segCount; segIndex++) {\n            segments[segIndex].delta = font.getUint16();\n          }\n\n          var offsetsCount = 0;\n          for (segIndex = 0; segIndex < segCount; segIndex++) {\n            segment = segments[segIndex];\n            var rangeOffset = font.getUint16();\n            if (!rangeOffset) {\n              segment.offsetIndex = -1;\n              continue;\n            }\n\n            var offsetIndex = (rangeOffset >> 1) - (segCount - segIndex);\n            segment.offsetIndex = offsetIndex;\n            offsetsCount = Math.max(offsetsCount, offsetIndex +\n                                    segment.end - segment.start + 1);\n          }\n\n          var offsets = [];\n          for (j = 0; j < offsetsCount; j++) {\n            offsets.push(font.getUint16());\n          }\n\n          for (segIndex = 0; segIndex < segCount; segIndex++) {\n            segment = segments[segIndex];\n            start = segment.start;\n            var end = segment.end;\n            var delta = segment.delta;\n            offsetIndex = segment.offsetIndex;\n\n            for (j = start; j <= end; j++) {\n              if (j === 0xFFFF) {\n                continue;\n              }\n\n              glyphId = (offsetIndex < 0 ?\n                         j : offsets[offsetIndex + j - start]);\n              glyphId = (glyphId + delta) & 0xFFFF;\n              mappings.push({\n                charCode: j,\n                glyphId,\n              });\n            }\n          }\n        } else if (format === 6) {\n          // Format 6 is a 2-bytes dense mapping, which means the font data\n          // lives glue together even if they are pretty far in the unicode\n          // table. (This looks weird, so I can have missed something), this\n          // works on Linux but seems to fails on Mac so let's rewrite the\n          // cmap table to a 3-1-4 style\n          var firstCode = font.getUint16();\n          var entryCount = font.getUint16();\n\n          for (j = 0; j < entryCount; j++) {\n            glyphId = font.getUint16();\n            var charCode = firstCode + j;\n\n            mappings.push({\n              charCode,\n              glyphId,\n            });\n          }\n        } else {\n          warn('cmap table has unsupported format: ' + format);\n          return {\n            platformId: -1,\n            encodingId: -1,\n            mappings: [],\n            hasShortCmap: false,\n          };\n        }\n\n        // removing duplicate entries\n        mappings.sort(function (a, b) {\n          return a.charCode - b.charCode;\n        });\n        for (i = 1; i < mappings.length; i++) {\n          if (mappings[i - 1].charCode === mappings[i].charCode) {\n            mappings.splice(i, 1);\n            i--;\n          }\n        }\n\n        return {\n          platformId: potentialTable.platformId,\n          encodingId: potentialTable.encodingId,\n          mappings,\n          hasShortCmap,\n        };\n      }\n\n      function sanitizeMetrics(font, header, metrics, numGlyphs) {\n        if (!header) {\n          if (metrics) {\n            metrics.data = null;\n          }\n          return;\n        }\n\n        font.pos = (font.start ? font.start : 0) + header.offset;\n        font.pos += header.length - 2;\n        var numOfMetrics = font.getUint16();\n\n        if (numOfMetrics > numGlyphs) {\n          info('The numOfMetrics (' + numOfMetrics + ') should not be ' +\n               'greater than the numGlyphs (' + numGlyphs + ')');\n          // Reduce numOfMetrics if it is greater than numGlyphs\n          numOfMetrics = numGlyphs;\n          header.data[34] = (numOfMetrics & 0xff00) >> 8;\n          header.data[35] = numOfMetrics & 0x00ff;\n        }\n\n        var numOfSidebearings = numGlyphs - numOfMetrics;\n        var numMissing = numOfSidebearings -\n          ((metrics.length - numOfMetrics * 4) >> 1);\n\n        if (numMissing > 0) {\n          // For each missing glyph, we set both the width and lsb to 0 (zero).\n          // Since we need to add two properties for each glyph, this explains\n          // the use of |numMissing * 2| when initializing the typed array.\n          var entries = new Uint8Array(metrics.length + numMissing * 2);\n          entries.set(metrics.data);\n          metrics.data = entries;\n        }\n      }\n\n      function sanitizeGlyph(source, sourceStart, sourceEnd, dest, destStart,\n                             hintsValid) {\n        var glyphProfile = {\n          length: 0,\n          sizeOfInstructions: 0,\n        };\n        if (sourceEnd - sourceStart <= 12) {\n          // glyph with data less than 12 is invalid one\n          return glyphProfile;\n        }\n        var glyf = source.subarray(sourceStart, sourceEnd);\n        var contoursCount = signedInt16(glyf[0], glyf[1]);\n        if (contoursCount < 0) {\n          // OTS doesn't like contour count to be less than -1.\n          contoursCount = -1;\n          writeSignedInt16(glyf, 0, contoursCount);\n          // complex glyph, writing as is\n          dest.set(glyf, destStart);\n          glyphProfile.length = glyf.length;\n          return glyphProfile;\n        }\n\n        var i, j = 10, flagsCount = 0;\n        for (i = 0; i < contoursCount; i++) {\n          var endPoint = (glyf[j] << 8) | glyf[j + 1];\n          flagsCount = endPoint + 1;\n          j += 2;\n        }\n        // skipping instructions\n        var instructionsStart = j;\n        var instructionsLength = (glyf[j] << 8) | glyf[j + 1];\n        glyphProfile.sizeOfInstructions = instructionsLength;\n        j += 2 + instructionsLength;\n        var instructionsEnd = j;\n        // validating flags\n        var coordinatesLength = 0;\n        for (i = 0; i < flagsCount; i++) {\n          var flag = glyf[j++];\n          if (flag & 0xC0) {\n            // reserved flags must be zero, cleaning up\n            glyf[j - 1] = flag & 0x3F;\n          }\n          var xyLength = ((flag & 2) ? 1 : (flag & 16) ? 0 : 2) +\n                         ((flag & 4) ? 1 : (flag & 32) ? 0 : 2);\n          coordinatesLength += xyLength;\n          if (flag & 8) {\n            var repeat = glyf[j++];\n            i += repeat;\n            coordinatesLength += repeat * xyLength;\n          }\n        }\n        // glyph without coordinates will be rejected\n        if (coordinatesLength === 0) {\n          return glyphProfile;\n        }\n        var glyphDataLength = j + coordinatesLength;\n        if (glyphDataLength > glyf.length) {\n          // not enough data for coordinates\n          return glyphProfile;\n        }\n        if (!hintsValid && instructionsLength > 0) {\n          dest.set(glyf.subarray(0, instructionsStart), destStart);\n          dest.set([0, 0], destStart + instructionsStart);\n          dest.set(glyf.subarray(instructionsEnd, glyphDataLength),\n                   destStart + instructionsStart + 2);\n          glyphDataLength -= instructionsLength;\n          if (glyf.length - glyphDataLength > 3) {\n            glyphDataLength = (glyphDataLength + 3) & ~3;\n          }\n          glyphProfile.length = glyphDataLength;\n          return glyphProfile;\n        }\n        if (glyf.length - glyphDataLength > 3) {\n          // truncating and aligning to 4 bytes the long glyph data\n          glyphDataLength = (glyphDataLength + 3) & ~3;\n          dest.set(glyf.subarray(0, glyphDataLength), destStart);\n          glyphProfile.length = glyphDataLength;\n          return glyphProfile;\n        }\n        // glyph data is fine\n        dest.set(glyf, destStart);\n        glyphProfile.length = glyf.length;\n        return glyphProfile;\n      }\n\n      function sanitizeHead(head, numGlyphs, locaLength) {\n        var data = head.data;\n\n        // Validate version:\n        // Should always be 0x00010000\n        var version = int32(data[0], data[1], data[2], data[3]);\n        if (version >> 16 !== 1) {\n          info('Attempting to fix invalid version in head table: ' + version);\n          data[0] = 0;\n          data[1] = 1;\n          data[2] = 0;\n          data[3] = 0;\n        }\n\n        var indexToLocFormat = int16(data[50], data[51]);\n        if (indexToLocFormat < 0 || indexToLocFormat > 1) {\n          info('Attempting to fix invalid indexToLocFormat in head table: ' +\n               indexToLocFormat);\n\n          // The value of indexToLocFormat should be 0 if the loca table\n          // consists of short offsets, and should be 1 if the loca table\n          // consists of long offsets.\n          //\n          // The number of entries in the loca table should be numGlyphs + 1.\n          //\n          // Using this information, we can work backwards to deduce if the\n          // size of each offset in the loca table, and thus figure out the\n          // appropriate value for indexToLocFormat.\n\n          var numGlyphsPlusOne = numGlyphs + 1;\n          if (locaLength === numGlyphsPlusOne << 1) {\n            // 0x0000 indicates the loca table consists of short offsets\n            data[50] = 0;\n            data[51] = 0;\n          } else if (locaLength === numGlyphsPlusOne << 2) {\n            // 0x0001 indicates the loca table consists of long offsets\n            data[50] = 0;\n            data[51] = 1;\n          } else {\n            throw new FormatError('Could not fix indexToLocFormat: ' +\n                                  indexToLocFormat);\n          }\n        }\n      }\n\n      function sanitizeGlyphLocations(loca, glyf, numGlyphs,\n                                      isGlyphLocationsLong, hintsValid,\n                                      dupFirstEntry, maxSizeOfInstructions) {\n        var itemSize, itemDecode, itemEncode;\n        if (isGlyphLocationsLong) {\n          itemSize = 4;\n          itemDecode = function fontItemDecodeLong(data, offset) {\n            return (data[offset] << 24) | (data[offset + 1] << 16) |\n                   (data[offset + 2] << 8) | data[offset + 3];\n          };\n          itemEncode = function fontItemEncodeLong(data, offset, value) {\n            data[offset] = (value >>> 24) & 0xFF;\n            data[offset + 1] = (value >> 16) & 0xFF;\n            data[offset + 2] = (value >> 8) & 0xFF;\n            data[offset + 3] = value & 0xFF;\n          };\n        } else {\n          itemSize = 2;\n          itemDecode = function fontItemDecode(data, offset) {\n            return (data[offset] << 9) | (data[offset + 1] << 1);\n          };\n          itemEncode = function fontItemEncode(data, offset, value) {\n            data[offset] = (value >> 9) & 0xFF;\n            data[offset + 1] = (value >> 1) & 0xFF;\n          };\n        }\n        // The first glyph is duplicated.\n        var numGlyphsOut = dupFirstEntry ? numGlyphs + 1 : numGlyphs;\n        var locaData = loca.data;\n        var locaDataSize = itemSize * (1 + numGlyphsOut);\n        // Resize loca table to account for duplicated glyph.\n        locaData = new Uint8Array(locaDataSize);\n        locaData.set(loca.data.subarray(0, locaDataSize));\n        loca.data = locaData;\n        // removing the invalid glyphs\n        var oldGlyfData = glyf.data;\n        var oldGlyfDataLength = oldGlyfData.length;\n        var newGlyfData = new Uint8Array(oldGlyfDataLength);\n        var startOffset = itemDecode(locaData, 0);\n        var writeOffset = 0;\n        var missingGlyphs = Object.create(null);\n        itemEncode(locaData, 0, writeOffset);\n        var i, j;\n        for (i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize) {\n          var endOffset = itemDecode(locaData, j);\n          // The spec says the offsets should be in ascending order, however\n          // some fonts use the offset of 0 to mark a glyph as missing.\n          if (endOffset === 0) {\n            endOffset = startOffset;\n          }\n          if (endOffset > oldGlyfDataLength &&\n              ((oldGlyfDataLength + 3) & ~3) === endOffset) {\n            // Aspose breaks fonts by aligning the glyphs to the qword, but not\n            // the glyf table size, which makes last glyph out of range.\n            endOffset = oldGlyfDataLength;\n          }\n          if (endOffset > oldGlyfDataLength) {\n            // glyph end offset points outside glyf data, rejecting the glyph\n            startOffset = endOffset;\n          }\n\n          var glyphProfile = sanitizeGlyph(oldGlyfData, startOffset, endOffset,\n                                           newGlyfData, writeOffset,\n                                           hintsValid);\n          var newLength = glyphProfile.length;\n          if (newLength === 0) {\n            missingGlyphs[i] = true;\n          }\n          if (glyphProfile.sizeOfInstructions > maxSizeOfInstructions) {\n            maxSizeOfInstructions = glyphProfile.sizeOfInstructions;\n          }\n          writeOffset += newLength;\n          itemEncode(locaData, j, writeOffset);\n          startOffset = endOffset;\n        }\n\n        if (writeOffset === 0) {\n          // glyf table cannot be empty -- redoing the glyf and loca tables\n          // to have single glyph with one point\n          var simpleGlyph = new Uint8Array(\n            [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0]);\n          for (i = 0, j = itemSize; i < numGlyphsOut; i++, j += itemSize) {\n            itemEncode(locaData, j, simpleGlyph.length);\n          }\n          glyf.data = simpleGlyph;\n        } else if (dupFirstEntry) {\n          // Browsers will not display a glyph at position 0. Typically glyph 0\n          // is notdef, but a number of fonts put a valid glyph there so it must\n          // be duplicated and appended.\n          var firstEntryLength = itemDecode(locaData, itemSize);\n          if (newGlyfData.length > firstEntryLength + writeOffset) {\n            glyf.data = newGlyfData.subarray(0, firstEntryLength + writeOffset);\n          } else {\n            glyf.data = new Uint8Array(firstEntryLength + writeOffset);\n            glyf.data.set(newGlyfData.subarray(0, writeOffset));\n          }\n          glyf.data.set(newGlyfData.subarray(0, firstEntryLength), writeOffset);\n          itemEncode(loca.data, locaData.length - itemSize,\n                     writeOffset + firstEntryLength);\n        } else {\n          glyf.data = newGlyfData.subarray(0, writeOffset);\n        }\n        return {\n          missingGlyphs,\n          maxSizeOfInstructions,\n        };\n      }\n\n      function readPostScriptTable(post, properties, maxpNumGlyphs) {\n        var start = (font.start ? font.start : 0) + post.offset;\n        font.pos = start;\n\n        var length = post.length, end = start + length;\n        var version = font.getInt32();\n        // skip rest to the tables\n        font.getBytes(28);\n\n        var glyphNames;\n        var valid = true;\n        var i;\n\n        switch (version) {\n          case 0x00010000:\n            glyphNames = MacStandardGlyphOrdering;\n            break;\n          case 0x00020000:\n            var numGlyphs = font.getUint16();\n            if (numGlyphs !== maxpNumGlyphs) {\n              valid = false;\n              break;\n            }\n            var glyphNameIndexes = [];\n            for (i = 0; i < numGlyphs; ++i) {\n              var index = font.getUint16();\n              if (index >= 32768) {\n                valid = false;\n                break;\n              }\n              glyphNameIndexes.push(index);\n            }\n            if (!valid) {\n              break;\n            }\n            var customNames = [];\n            var strBuf = [];\n            while (font.pos < end) {\n              var stringLength = font.getByte();\n              strBuf.length = stringLength;\n              for (i = 0; i < stringLength; ++i) {\n                strBuf[i] = String.fromCharCode(font.getByte());\n              }\n              customNames.push(strBuf.join(''));\n            }\n            glyphNames = [];\n            for (i = 0; i < numGlyphs; ++i) {\n              var j = glyphNameIndexes[i];\n              if (j < 258) {\n                glyphNames.push(MacStandardGlyphOrdering[j]);\n                continue;\n              }\n              glyphNames.push(customNames[j - 258]);\n            }\n            break;\n          case 0x00030000:\n            break;\n          default:\n            warn('Unknown/unsupported post table version ' + version);\n            valid = false;\n            if (properties.defaultEncoding) {\n              glyphNames = properties.defaultEncoding;\n            }\n            break;\n        }\n        properties.glyphNames = glyphNames;\n        return valid;\n      }\n\n      function readNameTable(nameTable) {\n        var start = (font.start ? font.start : 0) + nameTable.offset;\n        font.pos = start;\n\n        var names = [[], []];\n        var length = nameTable.length, end = start + length;\n        var format = font.getUint16();\n        var FORMAT_0_HEADER_LENGTH = 6;\n        if (format !== 0 || length < FORMAT_0_HEADER_LENGTH) {\n          // unsupported name table format or table \"too\" small\n          return names;\n        }\n        var numRecords = font.getUint16();\n        var stringsStart = font.getUint16();\n        var records = [];\n        var NAME_RECORD_LENGTH = 12;\n        var i, ii;\n\n        for (i = 0; i < numRecords &&\n                        font.pos + NAME_RECORD_LENGTH <= end; i++) {\n          var r = {\n            platform: font.getUint16(),\n            encoding: font.getUint16(),\n            language: font.getUint16(),\n            name: font.getUint16(),\n            length: font.getUint16(),\n            offset: font.getUint16(),\n          };\n          // using only Macintosh and Windows platform/encoding names\n          if ((r.platform === 1 && r.encoding === 0 && r.language === 0) ||\n              (r.platform === 3 && r.encoding === 1 && r.language === 0x409)) {\n            records.push(r);\n          }\n        }\n        for (i = 0, ii = records.length; i < ii; i++) {\n          var record = records[i];\n          if (record.length <= 0) {\n            continue; // Nothing to process, ignoring.\n          }\n          var pos = start + stringsStart + record.offset;\n          if (pos + record.length > end) {\n            continue; // outside of name table, ignoring\n          }\n          font.pos = pos;\n          var nameIndex = record.name;\n          if (record.encoding) {\n            // unicode\n            var str = '';\n            for (var j = 0, jj = record.length; j < jj; j += 2) {\n              str += String.fromCharCode(font.getUint16());\n            }\n            names[1][nameIndex] = str;\n          } else {\n            names[0][nameIndex] = bytesToString(font.getBytes(record.length));\n          }\n        }\n        return names;\n      }\n\n      var TTOpsStackDeltas = [\n        0, 0, 0, 0, 0, 0, 0, 0, -2, -2, -2, -2, 0, 0, -2, -5,\n        -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, -1, -1,\n        1, -1, -999, 0, 1, 0, -1, -2, 0, -1, -2, -1, -1, 0, -1, -1,\n        0, 0, -999, -999, -1, -1, -1, -1, -2, -999, -2, -2, -999, 0, -2, -2,\n        0, 0, -2, 0, -2, 0, 0, 0, -2, -1, -1, 1, 1, 0, 0, -1,\n        -1, -1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, 0, -999, -1, -1,\n        -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n        -2, -999, -999, -999, -999, -999, -1, -1, -2, -2, 0, 0, 0, 0, -1, -1,\n        -999, -2, -2, 0, 0, -1, -2, -2, 0, 0, 0, -1, -1, -1, -2];\n        // 0xC0-DF == -1 and 0xE0-FF == -2\n\n      function sanitizeTTProgram(table, ttContext) {\n        var data = table.data;\n        var i = 0, j, n, b, funcId, pc, lastEndf = 0, lastDeff = 0;\n        var stack = [];\n        var callstack = [];\n        var functionsCalled = [];\n        var tooComplexToFollowFunctions =\n          ttContext.tooComplexToFollowFunctions;\n        var inFDEF = false, ifLevel = 0, inELSE = 0;\n        for (var ii = data.length; i < ii;) {\n          var op = data[i++];\n          // The TrueType instruction set docs can be found at\n          // https://developer.apple.com/fonts/TTRefMan/RM05/Chap5.html\n          if (op === 0x40) { // NPUSHB - pushes n bytes\n            n = data[i++];\n            if (inFDEF || inELSE) {\n              i += n;\n            } else {\n              for (j = 0; j < n; j++) {\n                stack.push(data[i++]);\n              }\n            }\n          } else if (op === 0x41) { // NPUSHW - pushes n words\n            n = data[i++];\n            if (inFDEF || inELSE) {\n              i += n * 2;\n            } else {\n              for (j = 0; j < n; j++) {\n                b = data[i++];\n                stack.push((b << 8) | data[i++]);\n              }\n            }\n          } else if ((op & 0xF8) === 0xB0) { // PUSHB - pushes bytes\n            n = op - 0xB0 + 1;\n            if (inFDEF || inELSE) {\n              i += n;\n            } else {\n              for (j = 0; j < n; j++) {\n                stack.push(data[i++]);\n              }\n            }\n          } else if ((op & 0xF8) === 0xB8) { // PUSHW - pushes words\n            n = op - 0xB8 + 1;\n            if (inFDEF || inELSE) {\n              i += n * 2;\n            } else {\n              for (j = 0; j < n; j++) {\n                b = data[i++];\n                stack.push((b << 8) | data[i++]);\n              }\n            }\n          } else if (op === 0x2B && !tooComplexToFollowFunctions) { // CALL\n            if (!inFDEF && !inELSE) {\n              // collecting information about which functions are used\n              funcId = stack[stack.length - 1];\n              if (isNaN(funcId)) {\n                info('TT: CALL empty stack (or invalid entry).');\n              } else {\n                ttContext.functionsUsed[funcId] = true;\n                if (funcId in ttContext.functionsStackDeltas) {\n                  let newStackLength = stack.length +\n                                       ttContext.functionsStackDeltas[funcId];\n                  if (newStackLength < 0) {\n                    warn('TT: CALL invalid functions stack delta.');\n                    ttContext.hintsValid = false;\n                    return;\n                  }\n                  stack.length = newStackLength;\n                } else if (funcId in ttContext.functionsDefined &&\n                           !functionsCalled.includes(funcId)) {\n                  callstack.push({ data, i, stackTop: stack.length - 1, });\n                  functionsCalled.push(funcId);\n                  pc = ttContext.functionsDefined[funcId];\n                  if (!pc) {\n                    warn('TT: CALL non-existent function');\n                    ttContext.hintsValid = false;\n                    return;\n                  }\n                  data = pc.data;\n                  i = pc.i;\n                }\n              }\n            }\n          } else if (op === 0x2C && !tooComplexToFollowFunctions) { // FDEF\n            if (inFDEF || inELSE) {\n              warn('TT: nested FDEFs not allowed');\n              tooComplexToFollowFunctions = true;\n            }\n            inFDEF = true;\n            // collecting information about which functions are defined\n            lastDeff = i;\n            funcId = stack.pop();\n            ttContext.functionsDefined[funcId] = { data, i, };\n          } else if (op === 0x2D) { // ENDF - end of function\n            if (inFDEF) {\n              inFDEF = false;\n              lastEndf = i;\n            } else {\n              pc = callstack.pop();\n              if (!pc) {\n                warn('TT: ENDF bad stack');\n                ttContext.hintsValid = false;\n                return;\n              }\n              funcId = functionsCalled.pop();\n              data = pc.data;\n              i = pc.i;\n              ttContext.functionsStackDeltas[funcId] =\n                stack.length - pc.stackTop;\n            }\n          } else if (op === 0x89) { // IDEF - instruction definition\n            if (inFDEF || inELSE) {\n              warn('TT: nested IDEFs not allowed');\n              tooComplexToFollowFunctions = true;\n            }\n            inFDEF = true;\n            // recording it as a function to track ENDF\n            lastDeff = i;\n          } else if (op === 0x58) { // IF\n            ++ifLevel;\n          } else if (op === 0x1B) { // ELSE\n            inELSE = ifLevel;\n          } else if (op === 0x59) { // EIF\n            if (inELSE === ifLevel) {\n              inELSE = 0;\n            }\n            --ifLevel;\n          } else if (op === 0x1C) { // JMPR\n            if (!inFDEF && !inELSE) {\n              var offset = stack[stack.length - 1];\n              // only jumping forward to prevent infinite loop\n              if (offset > 0) {\n                i += offset - 1;\n              }\n            }\n          }\n          // Adjusting stack not extactly, but just enough to get function id\n          if (!inFDEF && !inELSE) {\n            var stackDelta = op <= 0x8E ? TTOpsStackDeltas[op] :\n              op >= 0xC0 && op <= 0xDF ? -1 : op >= 0xE0 ? -2 : 0;\n            if (op >= 0x71 && op <= 0x75) {\n              n = stack.pop();\n              if (!isNaN(n)) {\n                stackDelta = -n * 2;\n              }\n            }\n            while (stackDelta < 0 && stack.length > 0) {\n              stack.pop();\n              stackDelta++;\n            }\n            while (stackDelta > 0) {\n              stack.push(NaN); // pushing any number into stack\n              stackDelta--;\n            }\n          }\n        }\n        ttContext.tooComplexToFollowFunctions = tooComplexToFollowFunctions;\n        var content = [data];\n        if (i > data.length) {\n          content.push(new Uint8Array(i - data.length));\n        }\n        if (lastDeff > lastEndf) {\n          warn('TT: complementing a missing function tail');\n          // new function definition started, but not finished\n          // complete function by [CLEAR, ENDF]\n          content.push(new Uint8Array([0x22, 0x2D]));\n        }\n        foldTTTable(table, content);\n      }\n\n      function checkInvalidFunctions(ttContext, maxFunctionDefs) {\n        if (ttContext.tooComplexToFollowFunctions) {\n          return;\n        }\n        if (ttContext.functionsDefined.length > maxFunctionDefs) {\n          warn('TT: more functions defined than expected');\n          ttContext.hintsValid = false;\n          return;\n        }\n        for (var j = 0, jj = ttContext.functionsUsed.length; j < jj; j++) {\n          if (j > maxFunctionDefs) {\n            warn('TT: invalid function id: ' + j);\n            ttContext.hintsValid = false;\n            return;\n          }\n          if (ttContext.functionsUsed[j] && !ttContext.functionsDefined[j]) {\n            warn('TT: undefined function: ' + j);\n            ttContext.hintsValid = false;\n            return;\n          }\n        }\n      }\n\n      function foldTTTable(table, content) {\n        if (content.length > 1) {\n          // concatenating the content items\n          var newLength = 0;\n          var j, jj;\n          for (j = 0, jj = content.length; j < jj; j++) {\n            newLength += content[j].length;\n          }\n          newLength = (newLength + 3) & ~3;\n          var result = new Uint8Array(newLength);\n          var pos = 0;\n          for (j = 0, jj = content.length; j < jj; j++) {\n            result.set(content[j], pos);\n            pos += content[j].length;\n          }\n          table.data = result;\n          table.length = newLength;\n        }\n      }\n\n      function sanitizeTTPrograms(fpgm, prep, cvt, maxFunctionDefs) {\n        var ttContext = {\n          functionsDefined: [],\n          functionsUsed: [],\n          functionsStackDeltas: [],\n          tooComplexToFollowFunctions: false,\n          hintsValid: true,\n        };\n        if (fpgm) {\n          sanitizeTTProgram(fpgm, ttContext);\n        }\n        if (prep) {\n          sanitizeTTProgram(prep, ttContext);\n        }\n        if (fpgm) {\n          checkInvalidFunctions(ttContext, maxFunctionDefs);\n        }\n        if (cvt && (cvt.length & 1)) {\n          var cvtData = new Uint8Array(cvt.length + 1);\n          cvtData.set(cvt.data);\n          cvt.data = cvtData;\n        }\n        return ttContext.hintsValid;\n      }\n\n      // The following steps modify the original font data, making copy\n      font = new Stream(new Uint8Array(font.getBytes()));\n\n      let header, tables;\n      if (isTrueTypeCollectionFile(font)) {\n        let ttcData = readTrueTypeCollectionData(font, this.name);\n        header = ttcData.header;\n        tables = ttcData.tables;\n      } else {\n        header = readOpenTypeHeader(font);\n        tables = readTables(font, header.numTables);\n      }\n      let cff, cffFile;\n\n      var isTrueType = !tables['CFF '];\n      if (!isTrueType) {\n        const isComposite = properties.composite &&\n                            ((properties.cidToGidMap || []).length > 0 ||\n                             !(properties.cMap instanceof IdentityCMap));\n        // OpenType font (skip composite fonts with non-default glyph mapping).\n        if ((header.version === 'OTTO' && !isComposite) ||\n            !tables['head'] || !tables['hhea'] || !tables['maxp'] ||\n            !tables['post']) {\n          // No major tables: throwing everything at `CFFFont`.\n          cffFile = new Stream(tables['CFF '].data);\n          cff = new CFFFont(cffFile, properties);\n\n          adjustWidths(properties);\n\n          return this.convert(name, cff, properties);\n        }\n\n        delete tables['glyf'];\n        delete tables['loca'];\n        delete tables['fpgm'];\n        delete tables['prep'];\n        delete tables['cvt '];\n        this.isOpenType = true;\n      } else {\n        if (!tables['loca']) {\n          throw new FormatError('Required \"loca\" table is not found');\n        }\n        if (!tables['glyf']) {\n          warn('Required \"glyf\" table is not found -- trying to recover.');\n          // Note: We use `sanitizeGlyphLocations` to add dummy glyf data below.\n          tables['glyf'] = {\n            tag: 'glyf',\n            data: new Uint8Array(0),\n          };\n        }\n        this.isOpenType = false;\n      }\n\n      if (!tables['maxp']) {\n        throw new FormatError('Required \"maxp\" table is not found');\n      }\n\n      font.pos = (font.start || 0) + tables['maxp'].offset;\n      var version = font.getInt32();\n      const numGlyphs = font.getUint16();\n      // Glyph 0 is duplicated and appended.\n      let numGlyphsOut = numGlyphs + 1;\n      let dupFirstEntry = true;\n      if (numGlyphsOut > 0xFFFF) {\n        dupFirstEntry = false;\n        numGlyphsOut = numGlyphs;\n        warn('Not enough space in glyfs to duplicate first glyph.');\n      }\n      var maxFunctionDefs = 0;\n      var maxSizeOfInstructions = 0;\n      if (version >= 0x00010000 && tables['maxp'].length >= 22) {\n        // maxZones can be invalid\n        font.pos += 8;\n        var maxZones = font.getUint16();\n        if (maxZones > 2) { // reset to 2 if font has invalid maxZones\n          tables['maxp'].data[14] = 0;\n          tables['maxp'].data[15] = 2;\n        }\n        font.pos += 4;\n        maxFunctionDefs = font.getUint16();\n        font.pos += 4;\n        maxSizeOfInstructions = font.getUint16();\n      }\n\n      tables['maxp'].data[4] = numGlyphsOut >> 8;\n      tables['maxp'].data[5] = numGlyphsOut & 255;\n\n      var hintsValid = sanitizeTTPrograms(tables['fpgm'], tables['prep'],\n                                          tables['cvt '], maxFunctionDefs);\n      if (!hintsValid) {\n        delete tables['fpgm'];\n        delete tables['prep'];\n        delete tables['cvt '];\n      }\n\n      // Ensure the hmtx table contains the advance width and\n      // sidebearings information for numGlyphs in the maxp table\n      sanitizeMetrics(font, tables['hhea'], tables['hmtx'], numGlyphsOut);\n\n      if (!tables['head']) {\n        throw new FormatError('Required \"head\" table is not found');\n      }\n\n      sanitizeHead(tables['head'], numGlyphs,\n                   isTrueType ? tables['loca'].length : 0);\n\n      var missingGlyphs = Object.create(null);\n      if (isTrueType) {\n        var isGlyphLocationsLong = int16(tables['head'].data[50],\n                                         tables['head'].data[51]);\n        var glyphsInfo = sanitizeGlyphLocations(tables['loca'], tables['glyf'],\n                                                numGlyphs, isGlyphLocationsLong,\n                                                hintsValid, dupFirstEntry,\n                                                maxSizeOfInstructions);\n        missingGlyphs = glyphsInfo.missingGlyphs;\n\n        // Some fonts have incorrect maxSizeOfInstructions values, so we use\n        // the computed value instead.\n        if (version >= 0x00010000 && tables['maxp'].length >= 22) {\n          tables['maxp'].data[26] = glyphsInfo.maxSizeOfInstructions >> 8;\n          tables['maxp'].data[27] = glyphsInfo.maxSizeOfInstructions & 255;\n        }\n      }\n      if (!tables['hhea']) {\n        throw new FormatError('Required \"hhea\" table is not found');\n      }\n\n      // Sanitizer reduces the glyph advanceWidth to the maxAdvanceWidth\n      // Sometimes it's 0. That needs to be fixed\n      if (tables['hhea'].data[10] === 0 && tables['hhea'].data[11] === 0) {\n        tables['hhea'].data[10] = 0xFF;\n        tables['hhea'].data[11] = 0xFF;\n      }\n\n      // Extract some more font properties from the OpenType head and\n      // hhea tables; yMin and descent value are always negative.\n      var metricsOverride = {\n        unitsPerEm: int16(tables['head'].data[18], tables['head'].data[19]),\n        yMax: int16(tables['head'].data[42], tables['head'].data[43]),\n        yMin: signedInt16(tables['head'].data[38], tables['head'].data[39]),\n        ascent: int16(tables['hhea'].data[4], tables['hhea'].data[5]),\n        descent: signedInt16(tables['hhea'].data[6], tables['hhea'].data[7]),\n      };\n\n      // PDF FontDescriptor metrics lie -- using data from actual font.\n      this.ascent = metricsOverride.ascent / metricsOverride.unitsPerEm;\n      this.descent = metricsOverride.descent / metricsOverride.unitsPerEm;\n\n      // The 'post' table has glyphs names.\n      if (tables['post']) {\n        readPostScriptTable(tables['post'], properties, numGlyphs);\n      }\n\n      // The original 'post' table is not needed, replace it.\n      tables['post'] = {\n        tag: 'post',\n        data: createPostTable(properties),\n      };\n\n      var charCodeToGlyphId = [], charCode;\n\n      // Helper function to try to skip mapping of empty glyphs.\n      function hasGlyph(glyphId) {\n        return !missingGlyphs[glyphId];\n      }\n\n      if (properties.composite) {\n        var cidToGidMap = properties.cidToGidMap || [];\n        var isCidToGidMapEmpty = cidToGidMap.length === 0;\n\n        properties.cMap.forEach(function(charCode, cid) {\n          if (cid > 0xffff) {\n            throw new FormatError('Max size of CID is 65,535');\n          }\n          var glyphId = -1;\n          if (isCidToGidMapEmpty) {\n            glyphId = cid;\n          } else if (cidToGidMap[cid] !== undefined) {\n            glyphId = cidToGidMap[cid];\n          }\n\n          if (glyphId >= 0 && glyphId < numGlyphs && hasGlyph(glyphId)) {\n            charCodeToGlyphId[charCode] = glyphId;\n          }\n        });\n      } else {\n        // Most of the following logic in this code branch is based on the\n        // 9.6.6.4 of the PDF spec.\n        var cmapTable = readCmapTable(tables['cmap'], font, this.isSymbolicFont,\n                                      properties.hasEncoding);\n        var cmapPlatformId = cmapTable.platformId;\n        var cmapEncodingId = cmapTable.encodingId;\n        var cmapMappings = cmapTable.mappings;\n        var cmapMappingsLength = cmapMappings.length;\n\n        // The spec seems to imply that if the font is symbolic the encoding\n        // should be ignored, this doesn't appear to work for 'preistabelle.pdf'\n        // where the the font is symbolic and it has an encoding.\n        if (properties.hasEncoding &&\n            (cmapPlatformId === 3 && cmapEncodingId === 1 ||\n             cmapPlatformId === 1 && cmapEncodingId === 0) ||\n            (cmapPlatformId === -1 && cmapEncodingId === -1 && // Temporary hack\n             !!getEncoding(properties.baseEncodingName))) {    // Temporary hack\n          // When no preferred cmap table was found and |baseEncodingName| is\n          // one of the predefined encodings, we seem to obtain a better\n          // |charCodeToGlyphId| map from the code below (fixes bug 1057544).\n          // TODO: Note that this is a hack which should be removed as soon as\n          //       we have proper support for more exotic cmap tables.\n\n          var baseEncoding = [];\n          if (properties.baseEncodingName === 'MacRomanEncoding' ||\n              properties.baseEncodingName === 'WinAnsiEncoding') {\n            baseEncoding = getEncoding(properties.baseEncodingName);\n          }\n          var glyphsUnicodeMap = getGlyphsUnicode();\n          for (charCode = 0; charCode < 256; charCode++) {\n            var glyphName, standardGlyphName;\n            if (this.differences && charCode in this.differences) {\n              glyphName = this.differences[charCode];\n            } else if (charCode in baseEncoding &&\n                       baseEncoding[charCode] !== '') {\n              glyphName = baseEncoding[charCode];\n            } else {\n              glyphName = StandardEncoding[charCode];\n            }\n            if (!glyphName) {\n              continue;\n            }\n            // Ensure that non-standard glyph names are resolved to valid ones.\n            standardGlyphName = recoverGlyphName(glyphName, glyphsUnicodeMap);\n\n            var unicodeOrCharCode;\n            if (cmapPlatformId === 3 && cmapEncodingId === 1) {\n              unicodeOrCharCode = glyphsUnicodeMap[standardGlyphName];\n            } else if (cmapPlatformId === 1 && cmapEncodingId === 0) {\n              // TODO: the encoding needs to be updated with mac os table.\n              unicodeOrCharCode = MacRomanEncoding.indexOf(standardGlyphName);\n            }\n\n            var found = false;\n            for (let i = 0; i < cmapMappingsLength; ++i) {\n              if (cmapMappings[i].charCode !== unicodeOrCharCode) {\n                continue;\n              }\n              charCodeToGlyphId[charCode] = cmapMappings[i].glyphId;\n              found = true;\n              break;\n            }\n            if (!found && properties.glyphNames) {\n              // Try to map using the post table.\n              var glyphId = properties.glyphNames.indexOf(glyphName);\n              // The post table ought to use the same kind of glyph names as the\n              // `differences` array, but check the standard ones as a fallback.\n              if (glyphId === -1 && standardGlyphName !== glyphName) {\n                glyphId = properties.glyphNames.indexOf(standardGlyphName);\n              }\n              if (glyphId > 0 && hasGlyph(glyphId)) {\n                charCodeToGlyphId[charCode] = glyphId;\n              }\n            }\n          }\n        } else if (cmapPlatformId === 0 && cmapEncodingId === 0) {\n          // Default Unicode semantics, use the charcodes as is.\n          for (let i = 0; i < cmapMappingsLength; ++i) {\n            charCodeToGlyphId[cmapMappings[i].charCode] =\n              cmapMappings[i].glyphId;\n          }\n        } else {\n          // When there is only a (1, 0) cmap table, the char code is a single\n          // byte and it is used directly as the char code.\n\n          // When a (3, 0) cmap table is present, it is used instead but the\n          // spec has special rules for char codes in the range of 0xF000 to\n          // 0xF0FF and it says the (3, 0) table should map the values from\n          // the (1, 0) table by prepending 0xF0 to the char codes. To reverse\n          // this, the upper bits of the char code are cleared, but only for the\n          // special range since some PDFs have char codes outside of this range\n          // (e.g. 0x2013) which when masked would overwrite other values in the\n          // cmap.\n          for (let i = 0; i < cmapMappingsLength; ++i) {\n            charCode = cmapMappings[i].charCode;\n            if (cmapPlatformId === 3 &&\n                charCode >= 0xF000 && charCode <= 0xF0FF) {\n              charCode &= 0xFF;\n            }\n            charCodeToGlyphId[charCode] = cmapMappings[i].glyphId;\n          }\n        }\n      }\n\n      if (charCodeToGlyphId.length === 0) {\n        // defines at least one glyph\n        charCodeToGlyphId[0] = 0;\n      }\n\n      // Typically glyph 0 is duplicated and the mapping must be updated, but if\n      // there isn't enough room to duplicate, the glyph id is left the same. In\n      // this case, glyph 0 may not work correctly, but that is better than\n      // having the whole font fail.\n      let glyphZeroId = numGlyphsOut - 1;\n      if (!dupFirstEntry) {\n        glyphZeroId = 0;\n      }\n\n      // Converting glyphs and ids into font's cmap table\n      var newMapping = adjustMapping(charCodeToGlyphId, hasGlyph, glyphZeroId);\n      this.toFontChar = newMapping.toFontChar;\n      tables['cmap'] = {\n        tag: 'cmap',\n        data: createCmapTable(newMapping.charCodeToGlyphId, numGlyphsOut),\n      };\n\n      if (!tables['OS/2'] || !validateOS2Table(tables['OS/2'])) {\n        tables['OS/2'] = {\n          tag: 'OS/2',\n          data: createOS2Table(properties, newMapping.charCodeToGlyphId,\n                               metricsOverride),\n        };\n      }\n\n      if (!isTrueType) {\n        try {\n          // Trying to repair CFF file\n          cffFile = new Stream(tables['CFF '].data);\n          var parser = new CFFParser(cffFile, properties,\n                                     SEAC_ANALYSIS_ENABLED);\n          cff = parser.parse();\n          cff.duplicateFirstGlyph();\n          var compiler = new CFFCompiler(cff);\n          tables['CFF '].data = compiler.compile();\n        } catch (e) {\n          warn('Failed to compile font ' + properties.loadedName);\n        }\n      }\n\n      // Re-creating 'name' table\n      if (!tables['name']) {\n        tables['name'] = {\n          tag: 'name',\n          data: createNameTable(this.name),\n        };\n      } else {\n        // ... using existing 'name' table as prototype\n        var namePrototype = readNameTable(tables['name']);\n        tables['name'].data = createNameTable(name, namePrototype);\n      }\n\n      var builder = new OpenTypeFileBuilder(header.version);\n      for (var tableTag in tables) {\n        builder.addTable(tableTag, tables[tableTag].data);\n      }\n      return builder.toArray();\n    },\n\n    convert: function Font_convert(fontName, font, properties) {\n      // TODO: Check the charstring widths to determine this.\n      properties.fixedPitch = false;\n\n      if (properties.builtInEncoding) {\n        // For Type1 fonts that do not include either `ToUnicode` or `Encoding`\n        // data, attempt to use the `builtInEncoding` to improve text selection.\n        adjustToUnicode(properties, properties.builtInEncoding);\n      }\n\n      // Type 1 fonts have a notdef inserted at the beginning, so glyph 0\n      // becomes glyph 1. In a CFF font glyph 0 is appended to the end of the\n      // char strings.\n      let glyphZeroId = 1;\n      if (font instanceof CFFFont) {\n        glyphZeroId = font.numGlyphs - 1;\n      }\n      var mapping = font.getGlyphMapping(properties);\n      var newMapping = adjustMapping(mapping, font.hasGlyphId.bind(font),\n                                     glyphZeroId);\n      this.toFontChar = newMapping.toFontChar;\n      var numGlyphs = font.numGlyphs;\n\n      function getCharCodes(charCodeToGlyphId, glyphId) {\n        var charCodes = null;\n        for (var charCode in charCodeToGlyphId) {\n          if (glyphId === charCodeToGlyphId[charCode]) {\n            if (!charCodes) {\n              charCodes = [];\n            }\n            charCodes.push(charCode | 0);\n          }\n        }\n        return charCodes;\n      }\n\n      function createCharCode(charCodeToGlyphId, glyphId) {\n        for (var charCode in charCodeToGlyphId) {\n          if (glyphId === charCodeToGlyphId[charCode]) {\n            return charCode | 0;\n          }\n        }\n        newMapping.charCodeToGlyphId[newMapping.nextAvailableFontCharCode] =\n            glyphId;\n        return newMapping.nextAvailableFontCharCode++;\n      }\n\n      var seacs = font.seacs;\n      if (SEAC_ANALYSIS_ENABLED && seacs && seacs.length) {\n        var matrix = properties.fontMatrix || FONT_IDENTITY_MATRIX;\n        var charset = font.getCharset();\n        var seacMap = Object.create(null);\n        for (var glyphId in seacs) {\n          glyphId |= 0;\n          var seac = seacs[glyphId];\n          var baseGlyphName = StandardEncoding[seac[2]];\n          var accentGlyphName = StandardEncoding[seac[3]];\n          var baseGlyphId = charset.indexOf(baseGlyphName);\n          var accentGlyphId = charset.indexOf(accentGlyphName);\n          if (baseGlyphId < 0 || accentGlyphId < 0) {\n            continue;\n          }\n          var accentOffset = {\n            x: seac[0] * matrix[0] + seac[1] * matrix[2] + matrix[4],\n            y: seac[0] * matrix[1] + seac[1] * matrix[3] + matrix[5],\n          };\n\n          var charCodes = getCharCodes(mapping, glyphId);\n          if (!charCodes) {\n            // There's no point in mapping it if the char code was never mapped\n            // to begin with.\n            continue;\n          }\n          for (var i = 0, ii = charCodes.length; i < ii; i++) {\n            var charCode = charCodes[i];\n            // Find a fontCharCode that maps to the base and accent glyphs.\n            // If one doesn't exists, create it.\n            var charCodeToGlyphId = newMapping.charCodeToGlyphId;\n            var baseFontCharCode = createCharCode(charCodeToGlyphId,\n                                                  baseGlyphId);\n            var accentFontCharCode = createCharCode(charCodeToGlyphId,\n                                                    accentGlyphId);\n            seacMap[charCode] = {\n              baseFontCharCode,\n              accentFontCharCode,\n              accentOffset,\n            };\n          }\n        }\n        properties.seacMap = seacMap;\n      }\n\n      var unitsPerEm = 1 / (properties.fontMatrix || FONT_IDENTITY_MATRIX)[0];\n\n      var builder = new OpenTypeFileBuilder('\\x4F\\x54\\x54\\x4F');\n      // PostScript Font Program\n      builder.addTable('CFF ', font.data);\n      // OS/2 and Windows Specific metrics\n      builder.addTable('OS/2', createOS2Table(properties,\n                                              newMapping.charCodeToGlyphId));\n      // Character to glyphs mapping\n      builder.addTable('cmap', createCmapTable(newMapping.charCodeToGlyphId,\n                       numGlyphs));\n      // Font header\n      builder.addTable('head',\n            '\\x00\\x01\\x00\\x00' + // Version number\n            '\\x00\\x00\\x10\\x00' + // fontRevision\n            '\\x00\\x00\\x00\\x00' + // checksumAdjustement\n            '\\x5F\\x0F\\x3C\\xF5' + // magicNumber\n            '\\x00\\x00' + // Flags\n            safeString16(unitsPerEm) + // unitsPerEM\n            '\\x00\\x00\\x00\\x00\\x9e\\x0b\\x7e\\x27' + // creation date\n            '\\x00\\x00\\x00\\x00\\x9e\\x0b\\x7e\\x27' + // modifification date\n            '\\x00\\x00' + // xMin\n            safeString16(properties.descent) + // yMin\n            '\\x0F\\xFF' + // xMax\n            safeString16(properties.ascent) + // yMax\n            string16(properties.italicAngle ? 2 : 0) + // macStyle\n            '\\x00\\x11' + // lowestRecPPEM\n            '\\x00\\x00' + // fontDirectionHint\n            '\\x00\\x00' + // indexToLocFormat\n            '\\x00\\x00');  // glyphDataFormat\n\n      // Horizontal header\n      builder.addTable('hhea',\n            '\\x00\\x01\\x00\\x00' + // Version number\n            safeString16(properties.ascent) + // Typographic Ascent\n            safeString16(properties.descent) + // Typographic Descent\n            '\\x00\\x00' + // Line Gap\n            '\\xFF\\xFF' + // advanceWidthMax\n            '\\x00\\x00' + // minLeftSidebearing\n            '\\x00\\x00' + // minRightSidebearing\n            '\\x00\\x00' + // xMaxExtent\n            safeString16(properties.capHeight) + // caretSlopeRise\n            safeString16(Math.tan(properties.italicAngle) *\n                         properties.xHeight) + // caretSlopeRun\n            '\\x00\\x00' + // caretOffset\n            '\\x00\\x00' + // -reserved-\n            '\\x00\\x00' + // -reserved-\n            '\\x00\\x00' + // -reserved-\n            '\\x00\\x00' + // -reserved-\n            '\\x00\\x00' + // metricDataFormat\n            string16(numGlyphs)); // Number of HMetrics\n\n      // Horizontal metrics\n      builder.addTable('hmtx', (function fontFieldsHmtx() {\n          var charstrings = font.charstrings;\n          var cffWidths = font.cff ? font.cff.widths : null;\n          var hmtx = '\\x00\\x00\\x00\\x00'; // Fake .notdef\n          for (var i = 1, ii = numGlyphs; i < ii; i++) {\n            var width = 0;\n            if (charstrings) {\n              var charstring = charstrings[i - 1];\n              width = 'width' in charstring ? charstring.width : 0;\n            } else if (cffWidths) {\n              width = Math.ceil(cffWidths[i] || 0);\n            }\n            hmtx += string16(width) + string16(0);\n          }\n          return hmtx;\n        })());\n\n      // Maximum profile\n      builder.addTable('maxp',\n            '\\x00\\x00\\x50\\x00' + // Version number\n            string16(numGlyphs)); // Num of glyphs\n\n      // Naming tables\n      builder.addTable('name', createNameTable(fontName));\n\n      // PostScript information\n      builder.addTable('post', createPostTable(properties));\n\n      return builder.toArray();\n    },\n\n    get spaceWidth() {\n      if ('_shadowWidth' in this) {\n        return this._shadowWidth;\n      }\n\n      // trying to estimate space character width\n      var possibleSpaceReplacements = ['space', 'minus', 'one', 'i', 'I'];\n      var width;\n      for (var i = 0, ii = possibleSpaceReplacements.length; i < ii; i++) {\n        var glyphName = possibleSpaceReplacements[i];\n        // if possible, getting width by glyph name\n        if (glyphName in this.widths) {\n          width = this.widths[glyphName];\n          break;\n        }\n        var glyphsUnicodeMap = getGlyphsUnicode();\n        var glyphUnicode = glyphsUnicodeMap[glyphName];\n        // finding the charcode via unicodeToCID map\n        var charcode = 0;\n        if (this.composite) {\n          if (this.cMap.contains(glyphUnicode)) {\n            charcode = this.cMap.lookup(glyphUnicode);\n          }\n        }\n        // ... via toUnicode map\n        if (!charcode && this.toUnicode) {\n          charcode = this.toUnicode.charCodeOf(glyphUnicode);\n        }\n        // setting it to unicode if negative or undefined\n        if (charcode <= 0) {\n          charcode = glyphUnicode;\n        }\n        // trying to get width via charcode\n        width = this.widths[charcode];\n        if (width) {\n          break; // the non-zero width found\n        }\n      }\n      width = width || this.defaultWidth;\n      // Do not shadow the property here. See discussion:\n      // https://github.com/mozilla/pdf.js/pull/2127#discussion_r1662280\n      this._shadowWidth = width;\n      return width;\n    },\n\n    charToGlyph: function Font_charToGlyph(charcode, isSpace) {\n      var fontCharCode, width, operatorListId;\n\n      var widthCode = charcode;\n      if (this.cMap && this.cMap.contains(charcode)) {\n        widthCode = this.cMap.lookup(charcode);\n      }\n      width = this.widths[widthCode];\n      width = isNum(width) ? width : this.defaultWidth;\n      var vmetric = this.vmetrics && this.vmetrics[widthCode];\n\n      let unicode = this.toUnicode.get(charcode) ||\n        this.fallbackToUnicode.get(charcode) || charcode;\n      if (typeof unicode === 'number') {\n        unicode = String.fromCharCode(unicode);\n      }\n\n      var isInFont = charcode in this.toFontChar;\n      // First try the toFontChar map, if it's not there then try falling\n      // back to the char code.\n      fontCharCode = this.toFontChar[charcode] || charcode;\n      if (this.missingFile) {\n        fontCharCode = mapSpecialUnicodeValues(fontCharCode);\n      }\n\n      if (this.isType3Font) {\n        // Font char code in this case is actually a glyph name.\n        operatorListId = fontCharCode;\n      }\n\n      var accent = null;\n      if (this.seacMap && this.seacMap[charcode]) {\n        isInFont = true;\n        var seac = this.seacMap[charcode];\n        fontCharCode = seac.baseFontCharCode;\n        accent = {\n          fontChar: String.fromCodePoint(seac.accentFontCharCode),\n          offset: seac.accentOffset,\n        };\n      }\n\n      var fontChar = typeof fontCharCode === 'number' ?\n                      String.fromCodePoint(fontCharCode) :\n                      '';\n\n      var glyph = this.glyphCache[charcode];\n      if (!glyph ||\n          !glyph.matchesForCache(fontChar, unicode, accent, width, vmetric,\n                                 operatorListId, isSpace, isInFont)) {\n        glyph = new Glyph(fontChar, unicode, accent, width, vmetric,\n                          operatorListId, isSpace, isInFont);\n        this.glyphCache[charcode] = glyph;\n      }\n      return glyph;\n    },\n\n    charsToGlyphs: function Font_charsToGlyphs(chars) {\n      var charsCache = this.charsCache;\n      var glyphs, glyph, charcode;\n\n      // if we translated this string before, just grab it from the cache\n      if (charsCache) {\n        glyphs = charsCache[chars];\n        if (glyphs) {\n          return glyphs;\n        }\n      }\n\n      // lazily create the translation cache\n      if (!charsCache) {\n        charsCache = this.charsCache = Object.create(null);\n      }\n\n      glyphs = [];\n      var charsCacheKey = chars;\n      var i = 0, ii;\n\n      if (this.cMap) {\n        // composite fonts have multi-byte strings convert the string from\n        // single-byte to multi-byte\n        var c = Object.create(null);\n        while (i < chars.length) {\n          this.cMap.readCharCode(chars, i, c);\n          charcode = c.charcode;\n          var length = c.length;\n          i += length;\n          // Space is char with code 0x20 and length 1 in multiple-byte codes.\n          var isSpace = length === 1 && chars.charCodeAt(i - 1) === 0x20;\n          glyph = this.charToGlyph(charcode, isSpace);\n          glyphs.push(glyph);\n        }\n      } else {\n        for (i = 0, ii = chars.length; i < ii; ++i) {\n          charcode = chars.charCodeAt(i);\n          glyph = this.charToGlyph(charcode, charcode === 0x20);\n          glyphs.push(glyph);\n        }\n      }\n\n      // Enter the translated string into the cache\n      return (charsCache[charsCacheKey] = glyphs);\n    },\n  };\n\n  return Font;\n})();\n\nvar ErrorFont = (function ErrorFontClosure() {\n  function ErrorFont(error) {\n    this.error = error;\n    this.loadedName = 'g_font_error';\n    this.missingFile = true;\n  }\n\n  ErrorFont.prototype = {\n    charsToGlyphs: function ErrorFont_charsToGlyphs() {\n      return [];\n    },\n    exportData: function ErrorFont_exportData() {\n      return { error: this.error, };\n    },\n  };\n\n  return ErrorFont;\n})();\n\n/**\n * Shared logic for building a char code to glyph id mapping for Type1 and\n * simple CFF fonts. See section 9.6.6.2 of the spec.\n * @param {Object} properties Font properties object.\n * @param {Object} builtInEncoding The encoding contained within the actual font\n * data.\n * @param {Array} glyphNames Array of glyph names where the index is the\n * glyph ID.\n * @returns {Object} A char code to glyph ID map.\n */\nfunction type1FontGlyphMapping(properties, builtInEncoding, glyphNames) {\n  var charCodeToGlyphId = Object.create(null);\n  var glyphId, charCode, baseEncoding;\n  var isSymbolicFont = !!(properties.flags & FontFlags.Symbolic);\n\n  if (properties.baseEncodingName) {\n    // If a valid base encoding name was used, the mapping is initialized with\n    // that.\n    baseEncoding = getEncoding(properties.baseEncodingName);\n    for (charCode = 0; charCode < baseEncoding.length; charCode++) {\n      glyphId = glyphNames.indexOf(baseEncoding[charCode]);\n      if (glyphId >= 0) {\n        charCodeToGlyphId[charCode] = glyphId;\n      } else {\n        charCodeToGlyphId[charCode] = 0; // notdef\n      }\n    }\n  } else if (isSymbolicFont) {\n    // For a symbolic font the encoding should be the fonts built-in encoding.\n    for (charCode in builtInEncoding) {\n      charCodeToGlyphId[charCode] = builtInEncoding[charCode];\n    }\n  } else {\n    // For non-symbolic fonts that don't have a base encoding the standard\n    // encoding should be used.\n    baseEncoding = StandardEncoding;\n    for (charCode = 0; charCode < baseEncoding.length; charCode++) {\n      glyphId = glyphNames.indexOf(baseEncoding[charCode]);\n      if (glyphId >= 0) {\n        charCodeToGlyphId[charCode] = glyphId;\n      } else {\n        charCodeToGlyphId[charCode] = 0; // notdef\n      }\n    }\n  }\n\n  // Lastly, merge in the differences.\n  var differences = properties.differences, glyphsUnicodeMap;\n  if (differences) {\n    for (charCode in differences) {\n      var glyphName = differences[charCode];\n      glyphId = glyphNames.indexOf(glyphName);\n\n      if (glyphId === -1) {\n        if (!glyphsUnicodeMap) {\n          glyphsUnicodeMap = getGlyphsUnicode();\n        }\n        var standardGlyphName = recoverGlyphName(glyphName, glyphsUnicodeMap);\n        if (standardGlyphName !== glyphName) {\n          glyphId = glyphNames.indexOf(standardGlyphName);\n        }\n      }\n      if (glyphId >= 0) {\n        charCodeToGlyphId[charCode] = glyphId;\n      } else {\n        charCodeToGlyphId[charCode] = 0; // notdef\n      }\n    }\n  }\n  return charCodeToGlyphId;\n}\n\n// Type1Font is also a CIDFontType0.\nvar Type1Font = (function Type1FontClosure() {\n  function findBlock(streamBytes, signature, startIndex) {\n    var streamBytesLength = streamBytes.length;\n    var signatureLength = signature.length;\n    var scanLength = streamBytesLength - signatureLength;\n\n    var i = startIndex, j, found = false;\n    while (i < scanLength) {\n      j = 0;\n      while (j < signatureLength && streamBytes[i + j] === signature[j]) {\n        j++;\n      }\n      if (j >= signatureLength) { // `signature` found, skip over whitespace.\n        i += j;\n        while (i < streamBytesLength && isSpace(streamBytes[i])) {\n          i++;\n        }\n        found = true;\n        break;\n      }\n      i++;\n    }\n    return {\n      found,\n      length: i,\n    };\n  }\n\n  function getHeaderBlock(stream, suggestedLength) {\n    var EEXEC_SIGNATURE = [0x65, 0x65, 0x78, 0x65, 0x63];\n\n    var streamStartPos = stream.pos; // Save the initial stream position.\n    var headerBytes, headerBytesLength, block;\n    try {\n      headerBytes = stream.getBytes(suggestedLength);\n      headerBytesLength = headerBytes.length;\n    } catch (ex) {\n      if (ex instanceof MissingDataException) {\n        throw ex;\n      }\n      // Ignore errors if the `suggestedLength` is huge enough that a Uint8Array\n      // cannot hold the result of `getBytes`, and fallback to simply checking\n      // the entire stream (fixes issue3928.pdf).\n    }\n\n    if (headerBytesLength === suggestedLength) {\n      // Most of the time `suggestedLength` is correct, so to speed things up we\n      // initially only check the last few bytes to see if the header was found.\n      // Otherwise we (potentially) check the entire stream to prevent errors in\n      // `Type1Parser` (fixes issue5686.pdf).\n      block = findBlock(headerBytes, EEXEC_SIGNATURE,\n                        suggestedLength - 2 * EEXEC_SIGNATURE.length);\n\n      if (block.found && block.length === suggestedLength) {\n        return {\n          stream: new Stream(headerBytes),\n          length: suggestedLength,\n        };\n      }\n    }\n    warn('Invalid \"Length1\" property in Type1 font -- trying to recover.');\n    stream.pos = streamStartPos; // Reset the stream position.\n\n    var SCAN_BLOCK_LENGTH = 2048;\n    var actualLength;\n    while (true) {\n      var scanBytes = stream.peekBytes(SCAN_BLOCK_LENGTH);\n      block = findBlock(scanBytes, EEXEC_SIGNATURE, 0);\n\n      if (block.length === 0) {\n        break;\n      }\n      stream.pos += block.length; // Update the stream position.\n\n      if (block.found) {\n        actualLength = stream.pos - streamStartPos;\n        break;\n      }\n    }\n    stream.pos = streamStartPos; // Reset the stream position.\n\n    if (actualLength) {\n      return {\n        stream: new Stream(stream.getBytes(actualLength)),\n        length: actualLength,\n      };\n    }\n    warn('Unable to recover \"Length1\" property in Type1 font -- using as is.');\n    return {\n      stream: new Stream(stream.getBytes(suggestedLength)),\n      length: suggestedLength,\n    };\n  }\n\n  function getEexecBlock(stream, suggestedLength) {\n    // We should ideally parse the eexec block to ensure that `suggestedLength`\n    // is correct, so we don't truncate the block data if it's too small.\n    // However, this would also require checking if the fixed-content portion\n    // exists (using the 'Length3' property), and ensuring that it's valid.\n    //\n    // Given that `suggestedLength` almost always is correct, all the validation\n    // would require a great deal of unnecessary parsing for most fonts.\n    // To save time, we always fetch the entire stream instead, which also avoid\n    // issues if `suggestedLength` is huge (see comment in `getHeaderBlock`).\n    //\n    // NOTE: This means that the function can include the fixed-content portion\n    // in the returned eexec block. In practice this does *not* seem to matter,\n    // since `Type1Parser_extractFontProgram` will skip over any non-commands.\n    var eexecBytes = stream.getBytes();\n    return {\n      stream: new Stream(eexecBytes),\n      length: eexecBytes.length,\n    };\n  }\n\n  function Type1Font(name, file, properties) {\n    // Some bad generators embed pfb file as is, we have to strip 6-byte header.\n    // Also, length1 and length2 might be off by 6 bytes as well.\n    // http://www.math.ubc.ca/~cass/piscript/type1.pdf\n    var PFB_HEADER_SIZE = 6;\n    var headerBlockLength = properties.length1;\n    var eexecBlockLength = properties.length2;\n    var pfbHeader = file.peekBytes(PFB_HEADER_SIZE);\n    var pfbHeaderPresent = pfbHeader[0] === 0x80 && pfbHeader[1] === 0x01;\n    if (pfbHeaderPresent) {\n      file.skip(PFB_HEADER_SIZE);\n      headerBlockLength = (pfbHeader[5] << 24) | (pfbHeader[4] << 16) |\n                          (pfbHeader[3] << 8) | pfbHeader[2];\n    }\n\n    // Get the data block containing glyphs and subrs information\n    var headerBlock = getHeaderBlock(file, headerBlockLength);\n    var headerBlockParser = new Type1Parser(headerBlock.stream, false,\n                                            SEAC_ANALYSIS_ENABLED);\n    headerBlockParser.extractFontHeader(properties);\n\n    if (pfbHeaderPresent) {\n      pfbHeader = file.getBytes(PFB_HEADER_SIZE);\n      eexecBlockLength = (pfbHeader[5] << 24) | (pfbHeader[4] << 16) |\n                         (pfbHeader[3] << 8) | pfbHeader[2];\n    }\n\n    // Decrypt the data blocks and retrieve it's content\n    var eexecBlock = getEexecBlock(file, eexecBlockLength);\n    var eexecBlockParser = new Type1Parser(eexecBlock.stream, true,\n                                           SEAC_ANALYSIS_ENABLED);\n    var data = eexecBlockParser.extractFontProgram();\n    for (var info in data.properties) {\n      properties[info] = data.properties[info];\n    }\n\n    var charstrings = data.charstrings;\n    var type2Charstrings = this.getType2Charstrings(charstrings);\n    var subrs = this.getType2Subrs(data.subrs);\n\n    this.charstrings = charstrings;\n    this.data = this.wrap(name, type2Charstrings, this.charstrings,\n                          subrs, properties);\n    this.seacs = this.getSeacs(data.charstrings);\n  }\n\n  Type1Font.prototype = {\n    get numGlyphs() {\n      return this.charstrings.length + 1;\n    },\n\n    getCharset: function Type1Font_getCharset() {\n      var charset = ['.notdef'];\n      var charstrings = this.charstrings;\n      for (var glyphId = 0; glyphId < charstrings.length; glyphId++) {\n        charset.push(charstrings[glyphId].glyphName);\n      }\n      return charset;\n    },\n\n    getGlyphMapping: function Type1Font_getGlyphMapping(properties) {\n      var charstrings = this.charstrings;\n      var glyphNames = ['.notdef'], glyphId;\n      for (glyphId = 0; glyphId < charstrings.length; glyphId++) {\n        glyphNames.push(charstrings[glyphId].glyphName);\n      }\n      var encoding = properties.builtInEncoding;\n      if (encoding) {\n        var builtInEncoding = Object.create(null);\n        for (var charCode in encoding) {\n          glyphId = glyphNames.indexOf(encoding[charCode]);\n          if (glyphId >= 0) {\n            builtInEncoding[charCode] = glyphId;\n          }\n        }\n      }\n\n      return type1FontGlyphMapping(properties, builtInEncoding, glyphNames);\n    },\n\n    hasGlyphId: function Type1Font_hasGlyphID(id) {\n      if (id < 0 || id >= this.numGlyphs) {\n        return false;\n      }\n      if (id === 0) {\n        // notdef is always defined.\n        return true;\n      }\n      var glyph = this.charstrings[id - 1];\n      return glyph.charstring.length > 0;\n    },\n\n    getSeacs: function Type1Font_getSeacs(charstrings) {\n      var i, ii;\n      var seacMap = [];\n      for (i = 0, ii = charstrings.length; i < ii; i++) {\n        var charstring = charstrings[i];\n        if (charstring.seac) {\n          // Offset by 1 for .notdef\n          seacMap[i + 1] = charstring.seac;\n        }\n      }\n      return seacMap;\n    },\n\n    getType2Charstrings: function Type1Font_getType2Charstrings(\n                                    type1Charstrings) {\n      var type2Charstrings = [];\n      for (var i = 0, ii = type1Charstrings.length; i < ii; i++) {\n        type2Charstrings.push(type1Charstrings[i].charstring);\n      }\n      return type2Charstrings;\n    },\n\n    getType2Subrs: function Type1Font_getType2Subrs(type1Subrs) {\n      var bias = 0;\n      var count = type1Subrs.length;\n      if (count < 1133) {\n        bias = 107;\n      } else if (count < 33769) {\n        bias = 1131;\n      } else {\n        bias = 32768;\n      }\n\n      // Add a bunch of empty subrs to deal with the Type2 bias\n      var type2Subrs = [];\n      var i;\n      for (i = 0; i < bias; i++) {\n        type2Subrs.push([0x0B]);\n      }\n\n      for (i = 0; i < count; i++) {\n        type2Subrs.push(type1Subrs[i]);\n      }\n\n      return type2Subrs;\n    },\n\n    wrap: function Type1Font_wrap(name, glyphs, charstrings, subrs,\n                                  properties) {\n      var cff = new CFF();\n      cff.header = new CFFHeader(1, 0, 4, 4);\n\n      cff.names = [name];\n\n      var topDict = new CFFTopDict();\n      // CFF strings IDs 0...390 are predefined names, so refering\n      // to entries in our own String INDEX starts at SID 391.\n      topDict.setByName('version', 391);\n      topDict.setByName('Notice', 392);\n      topDict.setByName('FullName', 393);\n      topDict.setByName('FamilyName', 394);\n      topDict.setByName('Weight', 395);\n      topDict.setByName('Encoding', null); // placeholder\n      topDict.setByName('FontMatrix', properties.fontMatrix);\n      topDict.setByName('FontBBox', properties.bbox);\n      topDict.setByName('charset', null); // placeholder\n      topDict.setByName('CharStrings', null); // placeholder\n      topDict.setByName('Private', null); // placeholder\n      cff.topDict = topDict;\n\n      var strings = new CFFStrings();\n      strings.add('Version 0.11'); // Version\n      strings.add('See original notice'); // Notice\n      strings.add(name); // FullName\n      strings.add(name); // FamilyName\n      strings.add('Medium'); // Weight\n      cff.strings = strings;\n\n      cff.globalSubrIndex = new CFFIndex();\n\n      var count = glyphs.length;\n      var charsetArray = [0];\n      var i, ii;\n      for (i = 0; i < count; i++) {\n        var index = CFFStandardStrings.indexOf(charstrings[i].glyphName);\n        // TODO: Insert the string and correctly map it.  Previously it was\n        // thought mapping names that aren't in the standard strings to .notdef\n        // was fine, however in issue818 when mapping them all to .notdef the\n        // adieresis glyph no longer worked.\n        if (index === -1) {\n          index = 0;\n        }\n        charsetArray.push((index >> 8) & 0xff, index & 0xff);\n      }\n      cff.charset = new CFFCharset(false, 0, [], charsetArray);\n\n      var charStringsIndex = new CFFIndex();\n      charStringsIndex.add([0x8B, 0x0E]); // .notdef\n      for (i = 0; i < count; i++) {\n        charStringsIndex.add(glyphs[i]);\n      }\n      cff.charStrings = charStringsIndex;\n\n      var privateDict = new CFFPrivateDict();\n      privateDict.setByName('Subrs', null); // placeholder\n      var fields = [\n        'BlueValues',\n        'OtherBlues',\n        'FamilyBlues',\n        'FamilyOtherBlues',\n        'StemSnapH',\n        'StemSnapV',\n        'BlueShift',\n        'BlueFuzz',\n        'BlueScale',\n        'LanguageGroup',\n        'ExpansionFactor',\n        'ForceBold',\n        'StdHW',\n        'StdVW'\n      ];\n      for (i = 0, ii = fields.length; i < ii; i++) {\n        var field = fields[i];\n        if (!(field in properties.privateData)) {\n          continue;\n        }\n        var value = properties.privateData[field];\n        if (Array.isArray(value)) {\n          // All of the private dictionary array data in CFF must be stored as\n          // \"delta-encoded\" numbers.\n          for (var j = value.length - 1; j > 0; j--) {\n            value[j] -= value[j - 1]; // ... difference from previous value\n          }\n        }\n        privateDict.setByName(field, value);\n      }\n      cff.topDict.privateDict = privateDict;\n\n      var subrIndex = new CFFIndex();\n      for (i = 0, ii = subrs.length; i < ii; i++) {\n        subrIndex.add(subrs[i]);\n      }\n      privateDict.subrsIndex = subrIndex;\n\n      var compiler = new CFFCompiler(cff);\n      return compiler.compile();\n    },\n  };\n\n  return Type1Font;\n})();\n\nvar CFFFont = (function CFFFontClosure() {\n  function CFFFont(file, properties) {\n    this.properties = properties;\n\n    var parser = new CFFParser(file, properties, SEAC_ANALYSIS_ENABLED);\n    this.cff = parser.parse();\n    this.cff.duplicateFirstGlyph();\n    var compiler = new CFFCompiler(this.cff);\n    this.seacs = this.cff.seacs;\n    try {\n      this.data = compiler.compile();\n    } catch (e) {\n      warn('Failed to compile font ' + properties.loadedName);\n      // There may have just been an issue with the compiler, set the data\n      // anyway and hope the font loaded.\n      this.data = file;\n    }\n  }\n\n  CFFFont.prototype = {\n    get numGlyphs() {\n      return this.cff.charStrings.count;\n    },\n    getCharset: function CFFFont_getCharset() {\n      return this.cff.charset.charset;\n    },\n    getGlyphMapping: function CFFFont_getGlyphMapping() {\n      var cff = this.cff;\n      var properties = this.properties;\n      var charsets = cff.charset.charset;\n      var charCodeToGlyphId;\n      var glyphId;\n\n      if (properties.composite) {\n        charCodeToGlyphId = Object.create(null);\n        if (cff.isCIDFont) {\n          // If the font is actually a CID font then we should use the charset\n          // to map CIDs to GIDs.\n          for (glyphId = 0; glyphId < charsets.length; glyphId++) {\n            var cid = charsets[glyphId];\n            var charCode = properties.cMap.charCodeOf(cid);\n            charCodeToGlyphId[charCode] = glyphId;\n          }\n        } else {\n          // If it is NOT actually a CID font then CIDs should be mapped\n          // directly to GIDs.\n          for (glyphId = 0; glyphId < cff.charStrings.count; glyphId++) {\n            charCodeToGlyphId[glyphId] = glyphId;\n          }\n        }\n        return charCodeToGlyphId;\n      }\n\n      var encoding = cff.encoding ? cff.encoding.encoding : null;\n      charCodeToGlyphId = type1FontGlyphMapping(properties, encoding, charsets);\n      return charCodeToGlyphId;\n    },\n    hasGlyphId: function CFFFont_hasGlyphID(id) {\n      return this.cff.hasGlyphId(id);\n    },\n  };\n\n  return CFFFont;\n})();\n\nexport {\n  SEAC_ANALYSIS_ENABLED,\n  ErrorFont,\n  Font,\n  FontFlags,\n  ToUnicodeMap,\n  IdentityToUnicodeMap,\n  getFontType,\n};\n","/* Copyright 2016 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  bytesToString, FormatError, info, stringToBytes, Util, warn\n} from '../shared/util';\nimport {\n  ExpertCharset, ExpertSubsetCharset, ISOAdobeCharset\n} from './charsets';\nimport { ExpertEncoding, StandardEncoding } from './encodings';\n\n// Maximum subroutine call depth of type 2 chartrings. Matches OTS.\nvar MAX_SUBR_NESTING = 10;\n\n/**\n * The CFF class takes a Type1 file and wrap it into a\n * 'Compact Font Format' which itself embed Type2 charstrings.\n */\nvar CFFStandardStrings = [\n  '.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',\n  'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus',\n  'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four',\n  'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less',\n  'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',\n  'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',\n  'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum',\n  'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',\n  'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y',\n  'z', 'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent',\n  'sterling', 'fraction', 'yen', 'florin', 'section', 'currency',\n  'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft',\n  'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl',\n  'periodcentered', 'paragraph', 'bullet', 'quotesinglbase', 'quotedblbase',\n  'quotedblright', 'guillemotright', 'ellipsis', 'perthousand', 'questiondown',\n  'grave', 'acute', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent',\n  'dieresis', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron', 'emdash',\n  'AE', 'ordfeminine', 'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae',\n  'dotlessi', 'lslash', 'oslash', 'oe', 'germandbls', 'onesuperior',\n  'logicalnot', 'mu', 'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn',\n  'onequarter', 'divide', 'brokenbar', 'degree', 'thorn', 'threequarters',\n  'twosuperior', 'registered', 'minus', 'eth', 'multiply', 'threesuperior',\n  'copyright', 'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring',\n  'Atilde', 'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave',\n  'Iacute', 'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute',\n  'Ocircumflex', 'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute',\n  'Ucircumflex', 'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron',\n  'aacute', 'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde',\n  'ccedilla', 'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute',\n  'icircumflex', 'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex',\n  'odieresis', 'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex',\n  'udieresis', 'ugrave', 'yacute', 'ydieresis', 'zcaron', 'exclamsmall',\n  'Hungarumlautsmall', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall',\n  'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader',\n  'onedotenleader', 'zerooldstyle', 'oneoldstyle', 'twooldstyle',\n  'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle',\n  'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'commasuperior',\n  'threequartersemdash', 'periodsuperior', 'questionsmall', 'asuperior',\n  'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', 'isuperior',\n  'lsuperior', 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior',\n  'tsuperior', 'ff', 'ffi', 'ffl', 'parenleftinferior', 'parenrightinferior',\n  'Circumflexsmall', 'hyphensuperior', 'Gravesmall', 'Asmall', 'Bsmall',\n  'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall',\n  'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall',\n  'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall',\n  'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah',\n  'Tildesmall', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall',\n  'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall', 'Caronsmall',\n  'Dotaccentsmall', 'Macronsmall', 'figuredash', 'hypheninferior',\n  'Ogoneksmall', 'Ringsmall', 'Cedillasmall', 'questiondownsmall', 'oneeighth',\n  'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds',\n  'zerosuperior', 'foursuperior', 'fivesuperior', 'sixsuperior',\n  'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior',\n  'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior',\n  'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior',\n  'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior',\n  'commainferior', 'Agravesmall', 'Aacutesmall', 'Acircumflexsmall',\n  'Atildesmall', 'Adieresissmall', 'Aringsmall', 'AEsmall', 'Ccedillasmall',\n  'Egravesmall', 'Eacutesmall', 'Ecircumflexsmall', 'Edieresissmall',\n  'Igravesmall', 'Iacutesmall', 'Icircumflexsmall', 'Idieresissmall',\n  'Ethsmall', 'Ntildesmall', 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall',\n  'Otildesmall', 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall',\n  'Uacutesmall', 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall',\n  'Thornsmall', 'Ydieresissmall', '001.000', '001.001', '001.002', '001.003',\n  'Black', 'Bold', 'Book', 'Light', 'Medium', 'Regular', 'Roman', 'Semibold'\n];\n\nvar CFFParser = (function CFFParserClosure() {\n  var CharstringValidationData = [\n    null,\n    { id: 'hstem', min: 2, stackClearing: true, stem: true, },\n    null,\n    { id: 'vstem', min: 2, stackClearing: true, stem: true, },\n    { id: 'vmoveto', min: 1, stackClearing: true, },\n    { id: 'rlineto', min: 2, resetStack: true, },\n    { id: 'hlineto', min: 1, resetStack: true, },\n    { id: 'vlineto', min: 1, resetStack: true, },\n    { id: 'rrcurveto', min: 6, resetStack: true, },\n    null,\n    { id: 'callsubr', min: 1, undefStack: true, },\n    { id: 'return', min: 0, undefStack: true, },\n    null, // 12\n    null,\n    { id: 'endchar', min: 0, stackClearing: true, },\n    null,\n    null,\n    null,\n    { id: 'hstemhm', min: 2, stackClearing: true, stem: true, },\n    { id: 'hintmask', min: 0, stackClearing: true, },\n    { id: 'cntrmask', min: 0, stackClearing: true, },\n    { id: 'rmoveto', min: 2, stackClearing: true, },\n    { id: 'hmoveto', min: 1, stackClearing: true, },\n    { id: 'vstemhm', min: 2, stackClearing: true, stem: true, },\n    { id: 'rcurveline', min: 8, resetStack: true, },\n    { id: 'rlinecurve', min: 8, resetStack: true, },\n    { id: 'vvcurveto', min: 4, resetStack: true, },\n    { id: 'hhcurveto', min: 4, resetStack: true, },\n    null, // shortint\n    { id: 'callgsubr', min: 1, undefStack: true, },\n    { id: 'vhcurveto', min: 4, resetStack: true, },\n    { id: 'hvcurveto', min: 4, resetStack: true, }\n  ];\n  var CharstringValidationData12 = [\n    null,\n    null,\n    null,\n    { id: 'and', min: 2, stackDelta: -1, },\n    { id: 'or', min: 2, stackDelta: -1, },\n    { id: 'not', min: 1, stackDelta: 0, },\n    null,\n    null,\n    null,\n    { id: 'abs', min: 1, stackDelta: 0, },\n    { id: 'add', min: 2, stackDelta: -1,\n      stackFn: function stack_div(stack, index) {\n        stack[index - 2] = stack[index - 2] + stack[index - 1];\n      },\n    },\n    { id: 'sub', min: 2, stackDelta: -1,\n      stackFn: function stack_div(stack, index) {\n        stack[index - 2] = stack[index - 2] - stack[index - 1];\n      },\n    },\n    { id: 'div', min: 2, stackDelta: -1,\n      stackFn: function stack_div(stack, index) {\n        stack[index - 2] = stack[index - 2] / stack[index - 1];\n      },\n    },\n    null,\n    { id: 'neg', min: 1, stackDelta: 0,\n      stackFn: function stack_div(stack, index) {\n        stack[index - 1] = -stack[index - 1];\n      },\n    },\n    { id: 'eq', min: 2, stackDelta: -1, },\n    null,\n    null,\n    { id: 'drop', min: 1, stackDelta: -1, },\n    null,\n    { id: 'put', min: 2, stackDelta: -2, },\n    { id: 'get', min: 1, stackDelta: 0, },\n    { id: 'ifelse', min: 4, stackDelta: -3, },\n    { id: 'random', min: 0, stackDelta: 1, },\n    { id: 'mul', min: 2, stackDelta: -1,\n      stackFn: function stack_div(stack, index) {\n        stack[index - 2] = stack[index - 2] * stack[index - 1];\n      },\n    },\n    null,\n    { id: 'sqrt', min: 1, stackDelta: 0, },\n    { id: 'dup', min: 1, stackDelta: 1, },\n    { id: 'exch', min: 2, stackDelta: 0, },\n    { id: 'index', min: 2, stackDelta: 0, },\n    { id: 'roll', min: 3, stackDelta: -2, },\n    null,\n    null,\n    null,\n    { id: 'hflex', min: 7, resetStack: true, },\n    { id: 'flex', min: 13, resetStack: true, },\n    { id: 'hflex1', min: 9, resetStack: true, },\n    { id: 'flex1', min: 11, resetStack: true, }\n  ];\n\n  function CFFParser(file, properties, seacAnalysisEnabled) {\n    this.bytes = file.getBytes();\n    this.properties = properties;\n    this.seacAnalysisEnabled = !!seacAnalysisEnabled;\n  }\n  CFFParser.prototype = {\n    parse: function CFFParser_parse() {\n      var properties = this.properties;\n      var cff = new CFF();\n      this.cff = cff;\n\n      // The first five sections must be in order, all the others are reached\n      // via offsets contained in one of the below.\n      var header = this.parseHeader();\n      var nameIndex = this.parseIndex(header.endPos);\n      var topDictIndex = this.parseIndex(nameIndex.endPos);\n      var stringIndex = this.parseIndex(topDictIndex.endPos);\n      var globalSubrIndex = this.parseIndex(stringIndex.endPos);\n\n      var topDictParsed = this.parseDict(topDictIndex.obj.get(0));\n      var topDict = this.createDict(CFFTopDict, topDictParsed, cff.strings);\n\n      cff.header = header.obj;\n      cff.names = this.parseNameIndex(nameIndex.obj);\n      cff.strings = this.parseStringIndex(stringIndex.obj);\n      cff.topDict = topDict;\n      cff.globalSubrIndex = globalSubrIndex.obj;\n\n      this.parsePrivateDict(cff.topDict);\n\n      cff.isCIDFont = topDict.hasName('ROS');\n\n      var charStringOffset = topDict.getByName('CharStrings');\n      var charStringIndex = this.parseIndex(charStringOffset).obj;\n\n      var fontMatrix = topDict.getByName('FontMatrix');\n      if (fontMatrix) {\n        properties.fontMatrix = fontMatrix;\n      }\n\n      var fontBBox = topDict.getByName('FontBBox');\n      if (fontBBox) {\n        // adjusting ascent/descent\n        properties.ascent = Math.max(fontBBox[3], fontBBox[1]);\n        properties.descent = Math.min(fontBBox[1], fontBBox[3]);\n        properties.ascentScaled = true;\n      }\n\n      var charset, encoding;\n      if (cff.isCIDFont) {\n        var fdArrayIndex = this.parseIndex(topDict.getByName('FDArray')).obj;\n        for (var i = 0, ii = fdArrayIndex.count; i < ii; ++i) {\n          var dictRaw = fdArrayIndex.get(i);\n          var fontDict = this.createDict(CFFTopDict, this.parseDict(dictRaw),\n                                         cff.strings);\n          this.parsePrivateDict(fontDict);\n          cff.fdArray.push(fontDict);\n        }\n        // cid fonts don't have an encoding\n        encoding = null;\n        charset = this.parseCharsets(topDict.getByName('charset'),\n                                     charStringIndex.count, cff.strings, true);\n        cff.fdSelect = this.parseFDSelect(topDict.getByName('FDSelect'),\n                                          charStringIndex.count);\n      } else {\n        charset = this.parseCharsets(topDict.getByName('charset'),\n                                     charStringIndex.count, cff.strings, false);\n        encoding = this.parseEncoding(topDict.getByName('Encoding'),\n                                      properties,\n                                      cff.strings, charset.charset);\n      }\n\n      cff.charset = charset;\n      cff.encoding = encoding;\n\n      var charStringsAndSeacs = this.parseCharStrings({\n        charStrings: charStringIndex,\n        localSubrIndex: topDict.privateDict.subrsIndex,\n        globalSubrIndex: globalSubrIndex.obj,\n        fdSelect: cff.fdSelect,\n        fdArray: cff.fdArray,\n        privateDict: topDict.privateDict,\n      });\n      cff.charStrings = charStringsAndSeacs.charStrings;\n      cff.seacs = charStringsAndSeacs.seacs;\n      cff.widths = charStringsAndSeacs.widths;\n\n      return cff;\n    },\n    parseHeader: function CFFParser_parseHeader() {\n      var bytes = this.bytes;\n      var bytesLength = bytes.length;\n      var offset = 0;\n\n      // Prevent an infinite loop, by checking that the offset is within the\n      // bounds of the bytes array. Necessary in empty, or invalid, font files.\n      while (offset < bytesLength && bytes[offset] !== 1) {\n        ++offset;\n      }\n      if (offset >= bytesLength) {\n        throw new FormatError('Invalid CFF header');\n      }\n      if (offset !== 0) {\n        info('cff data is shifted');\n        bytes = bytes.subarray(offset);\n        this.bytes = bytes;\n      }\n      var major = bytes[0];\n      var minor = bytes[1];\n      var hdrSize = bytes[2];\n      var offSize = bytes[3];\n      var header = new CFFHeader(major, minor, hdrSize, offSize);\n      return { obj: header, endPos: hdrSize, };\n    },\n    parseDict: function CFFParser_parseDict(dict) {\n      var pos = 0;\n\n      function parseOperand() {\n        var value = dict[pos++];\n        if (value === 30) {\n          return parseFloatOperand();\n        } else if (value === 28) {\n          value = dict[pos++];\n          value = ((value << 24) | (dict[pos++] << 16)) >> 16;\n          return value;\n        } else if (value === 29) {\n          value = dict[pos++];\n          value = (value << 8) | dict[pos++];\n          value = (value << 8) | dict[pos++];\n          value = (value << 8) | dict[pos++];\n          return value;\n        } else if (value >= 32 && value <= 246) {\n          return value - 139;\n        } else if (value >= 247 && value <= 250) {\n          return ((value - 247) * 256) + dict[pos++] + 108;\n        } else if (value >= 251 && value <= 254) {\n          return -((value - 251) * 256) - dict[pos++] - 108;\n        }\n        warn('CFFParser_parseDict: \"' + value + '\" is a reserved command.');\n        return NaN;\n      }\n\n      function parseFloatOperand() {\n        var str = '';\n        var eof = 15;\n        var lookup = ['0', '1', '2', '3', '4', '5', '6', '7', '8',\n            '9', '.', 'E', 'E-', null, '-'];\n        var length = dict.length;\n        while (pos < length) {\n          var b = dict[pos++];\n          var b1 = b >> 4;\n          var b2 = b & 15;\n\n          if (b1 === eof) {\n            break;\n          }\n          str += lookup[b1];\n\n          if (b2 === eof) {\n            break;\n          }\n          str += lookup[b2];\n        }\n        return parseFloat(str);\n      }\n\n      var operands = [];\n      var entries = [];\n\n      pos = 0;\n      var end = dict.length;\n      while (pos < end) {\n        var b = dict[pos];\n        if (b <= 21) {\n          if (b === 12) {\n            b = (b << 8) | dict[++pos];\n          }\n          entries.push([b, operands]);\n          operands = [];\n          ++pos;\n        } else {\n          operands.push(parseOperand());\n        }\n      }\n      return entries;\n    },\n    parseIndex: function CFFParser_parseIndex(pos) {\n      var cffIndex = new CFFIndex();\n      var bytes = this.bytes;\n      var count = (bytes[pos++] << 8) | bytes[pos++];\n      var offsets = [];\n      var end = pos;\n      var i, ii;\n\n      if (count !== 0) {\n        var offsetSize = bytes[pos++];\n        // add 1 for offset to determine size of last object\n        var startPos = pos + ((count + 1) * offsetSize) - 1;\n\n        for (i = 0, ii = count + 1; i < ii; ++i) {\n          var offset = 0;\n          for (var j = 0; j < offsetSize; ++j) {\n            offset <<= 8;\n            offset += bytes[pos++];\n          }\n          offsets.push(startPos + offset);\n        }\n        end = offsets[count];\n      }\n      for (i = 0, ii = offsets.length - 1; i < ii; ++i) {\n        var offsetStart = offsets[i];\n        var offsetEnd = offsets[i + 1];\n        cffIndex.add(bytes.subarray(offsetStart, offsetEnd));\n      }\n      return { obj: cffIndex, endPos: end, };\n    },\n    parseNameIndex: function CFFParser_parseNameIndex(index) {\n      var names = [];\n      for (var i = 0, ii = index.count; i < ii; ++i) {\n        var name = index.get(i);\n        names.push(bytesToString(name));\n      }\n      return names;\n    },\n    parseStringIndex: function CFFParser_parseStringIndex(index) {\n      var strings = new CFFStrings();\n      for (var i = 0, ii = index.count; i < ii; ++i) {\n        var data = index.get(i);\n        strings.add(bytesToString(data));\n      }\n      return strings;\n    },\n    createDict: function CFFParser_createDict(Type, dict, strings) {\n      var cffDict = new Type(strings);\n      for (var i = 0, ii = dict.length; i < ii; ++i) {\n        var pair = dict[i];\n        var key = pair[0];\n        var value = pair[1];\n        cffDict.setByKey(key, value);\n      }\n      return cffDict;\n    },\n    parseCharString: function CFFParser_parseCharString(state, data,\n                                                        localSubrIndex,\n                                                        globalSubrIndex) {\n      if (!data || state.callDepth > MAX_SUBR_NESTING) {\n        return false;\n      }\n      var stackSize = state.stackSize;\n      var stack = state.stack;\n\n      var length = data.length;\n\n      for (var j = 0; j < length;) {\n        var value = data[j++];\n        var validationCommand = null;\n        if (value === 12) {\n          var q = data[j++];\n          if (q === 0) {\n            // The CFF specification state that the 'dotsection' command\n            // (12, 0) is deprecated and treated as a no-op, but all Type2\n            // charstrings processors should support them. Unfortunately\n            // the font sanitizer don't. As a workaround the sequence (12, 0)\n            // is replaced by a useless (0, hmoveto).\n            data[j - 2] = 139;\n            data[j - 1] = 22;\n            stackSize = 0;\n          } else {\n            validationCommand = CharstringValidationData12[q];\n          }\n        } else if (value === 28) { // number (16 bit)\n          stack[stackSize] = ((data[j] << 24) | (data[j + 1] << 16)) >> 16;\n          j += 2;\n          stackSize++;\n        } else if (value === 14) {\n          if (stackSize >= 4) {\n            stackSize -= 4;\n            if (this.seacAnalysisEnabled) {\n              state.seac = stack.slice(stackSize, stackSize + 4);\n              return false;\n            }\n          }\n          validationCommand = CharstringValidationData[value];\n        } else if (value >= 32 && value <= 246) {  // number\n          stack[stackSize] = value - 139;\n          stackSize++;\n        } else if (value >= 247 && value <= 254) {  // number (+1 bytes)\n          stack[stackSize] = (value < 251 ?\n                              ((value - 247) << 8) + data[j] + 108 :\n                              -((value - 251) << 8) - data[j] - 108);\n          j++;\n          stackSize++;\n        } else if (value === 255) {  // number (32 bit)\n          stack[stackSize] = ((data[j] << 24) | (data[j + 1] << 16) |\n                              (data[j + 2] << 8) | data[j + 3]) / 65536;\n          j += 4;\n          stackSize++;\n        } else if (value === 19 || value === 20) {\n          state.hints += stackSize >> 1;\n          // skipping right amount of hints flag data\n          j += (state.hints + 7) >> 3;\n          stackSize %= 2;\n          validationCommand = CharstringValidationData[value];\n        } else if (value === 10 || value === 29) {\n          var subrsIndex;\n          if (value === 10) {\n            subrsIndex = localSubrIndex;\n          } else {\n            subrsIndex = globalSubrIndex;\n          }\n          if (!subrsIndex) {\n            validationCommand = CharstringValidationData[value];\n            warn('Missing subrsIndex for ' + validationCommand.id);\n            return false;\n          }\n          var bias = 32768;\n          if (subrsIndex.count < 1240) {\n            bias = 107;\n          } else if (subrsIndex.count < 33900) {\n            bias = 1131;\n          }\n          var subrNumber = stack[--stackSize] + bias;\n          if (subrNumber < 0 || subrNumber >= subrsIndex.count ||\n              isNaN(subrNumber)) {\n            validationCommand = CharstringValidationData[value];\n            warn('Out of bounds subrIndex for ' + validationCommand.id);\n            return false;\n          }\n          state.stackSize = stackSize;\n          state.callDepth++;\n          var valid = this.parseCharString(state, subrsIndex.get(subrNumber),\n                                           localSubrIndex, globalSubrIndex);\n          if (!valid) {\n            return false;\n          }\n          state.callDepth--;\n          stackSize = state.stackSize;\n          continue;\n        } else if (value === 11) {\n          state.stackSize = stackSize;\n          return true;\n        } else {\n          validationCommand = CharstringValidationData[value];\n        }\n        if (validationCommand) {\n          if (validationCommand.stem) {\n            state.hints += stackSize >> 1;\n          }\n          if ('min' in validationCommand) {\n            if (!state.undefStack && stackSize < validationCommand.min) {\n              warn('Not enough parameters for ' + validationCommand.id +\n                   '; actual: ' + stackSize +\n                   ', expected: ' + validationCommand.min);\n              return false;\n            }\n          }\n          if (state.firstStackClearing && validationCommand.stackClearing) {\n            state.firstStackClearing = false;\n            // the optional character width can be found before the first\n            // stack-clearing command arguments\n            stackSize -= validationCommand.min;\n            if (stackSize >= 2 && validationCommand.stem) {\n              // there are even amount of arguments for stem commands\n              stackSize %= 2;\n            } else if (stackSize > 1) {\n              warn('Found too many parameters for stack-clearing command');\n            }\n            if (stackSize > 0 && stack[stackSize - 1] >= 0) {\n              state.width = stack[stackSize - 1];\n            }\n          }\n          if ('stackDelta' in validationCommand) {\n            if ('stackFn' in validationCommand) {\n              validationCommand.stackFn(stack, stackSize);\n            }\n            stackSize += validationCommand.stackDelta;\n          } else if (validationCommand.stackClearing) {\n            stackSize = 0;\n          } else if (validationCommand.resetStack) {\n            stackSize = 0;\n            state.undefStack = false;\n          } else if (validationCommand.undefStack) {\n            stackSize = 0;\n            state.undefStack = true;\n            state.firstStackClearing = false;\n          }\n        }\n      }\n      state.stackSize = stackSize;\n      return true;\n    },\n    parseCharStrings({ charStrings, localSubrIndex, globalSubrIndex, fdSelect,\n                       fdArray, privateDict, }) {\n      var seacs = [];\n      var widths = [];\n      var count = charStrings.count;\n      for (var i = 0; i < count; i++) {\n        var charstring = charStrings.get(i);\n        var state = {\n          callDepth: 0,\n          stackSize: 0,\n          stack: [],\n          undefStack: true,\n          hints: 0,\n          firstStackClearing: true,\n          seac: null,\n          width: null,\n        };\n        var valid = true;\n        var localSubrToUse = null;\n        var privateDictToUse = privateDict;\n        if (fdSelect && fdArray.length) {\n          var fdIndex = fdSelect.getFDIndex(i);\n          if (fdIndex === -1) {\n            warn('Glyph index is not in fd select.');\n            valid = false;\n          }\n          if (fdIndex >= fdArray.length) {\n            warn('Invalid fd index for glyph index.');\n            valid = false;\n          }\n          if (valid) {\n            privateDictToUse = fdArray[fdIndex].privateDict;\n            localSubrToUse = privateDictToUse.subrsIndex;\n          }\n        } else if (localSubrIndex) {\n          localSubrToUse = localSubrIndex;\n        }\n        if (valid) {\n          valid = this.parseCharString(state, charstring, localSubrToUse,\n                                       globalSubrIndex);\n        }\n        if (state.width !== null) {\n          const nominalWidth = privateDictToUse.getByName('nominalWidthX');\n          widths[i] = nominalWidth + state.width;\n        } else {\n          const defaultWidth = privateDictToUse.getByName('defaultWidthX');\n          widths[i] = defaultWidth;\n        }\n        if (state.seac !== null) {\n          seacs[i] = state.seac;\n        }\n        if (!valid) {\n          // resetting invalid charstring to single 'endchar'\n          charStrings.set(i, new Uint8Array([14]));\n        }\n      }\n      return { charStrings, seacs, widths, };\n    },\n    emptyPrivateDictionary:\n      function CFFParser_emptyPrivateDictionary(parentDict) {\n      var privateDict = this.createDict(CFFPrivateDict, [],\n                                        parentDict.strings);\n      parentDict.setByKey(18, [0, 0]);\n      parentDict.privateDict = privateDict;\n    },\n    parsePrivateDict: function CFFParser_parsePrivateDict(parentDict) {\n      // no private dict, do nothing\n      if (!parentDict.hasName('Private')) {\n        this.emptyPrivateDictionary(parentDict);\n        return;\n      }\n      var privateOffset = parentDict.getByName('Private');\n      // make sure the params are formatted correctly\n      if (!Array.isArray(privateOffset) || privateOffset.length !== 2) {\n        parentDict.removeByName('Private');\n        return;\n      }\n      var size = privateOffset[0];\n      var offset = privateOffset[1];\n      // remove empty dicts or ones that refer to invalid location\n      if (size === 0 || offset >= this.bytes.length) {\n        this.emptyPrivateDictionary(parentDict);\n        return;\n      }\n\n      var privateDictEnd = offset + size;\n      var dictData = this.bytes.subarray(offset, privateDictEnd);\n      var dict = this.parseDict(dictData);\n      var privateDict = this.createDict(CFFPrivateDict, dict,\n                                        parentDict.strings);\n      parentDict.privateDict = privateDict;\n\n      // Parse the Subrs index also since it's relative to the private dict.\n      if (!privateDict.getByName('Subrs')) {\n        return;\n      }\n      var subrsOffset = privateDict.getByName('Subrs');\n      var relativeOffset = offset + subrsOffset;\n      // Validate the offset.\n      if (subrsOffset === 0 || relativeOffset >= this.bytes.length) {\n        this.emptyPrivateDictionary(parentDict);\n        return;\n      }\n      var subrsIndex = this.parseIndex(relativeOffset);\n      privateDict.subrsIndex = subrsIndex.obj;\n    },\n    parseCharsets: function CFFParser_parseCharsets(pos, length, strings, cid) {\n      if (pos === 0) {\n        return new CFFCharset(true, CFFCharsetPredefinedTypes.ISO_ADOBE,\n                              ISOAdobeCharset);\n      } else if (pos === 1) {\n        return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT,\n                              ExpertCharset);\n      } else if (pos === 2) {\n        return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT_SUBSET,\n                              ExpertSubsetCharset);\n      }\n\n      var bytes = this.bytes;\n      var start = pos;\n      var format = bytes[pos++];\n      var charset = ['.notdef'];\n      var id, count, i;\n\n      // subtract 1 for the .notdef glyph\n      length -= 1;\n\n      switch (format) {\n        case 0:\n          for (i = 0; i < length; i++) {\n            id = (bytes[pos++] << 8) | bytes[pos++];\n            charset.push(cid ? id : strings.get(id));\n          }\n          break;\n        case 1:\n          while (charset.length <= length) {\n            id = (bytes[pos++] << 8) | bytes[pos++];\n            count = bytes[pos++];\n            for (i = 0; i <= count; i++) {\n              charset.push(cid ? id++ : strings.get(id++));\n            }\n          }\n          break;\n        case 2:\n          while (charset.length <= length) {\n            id = (bytes[pos++] << 8) | bytes[pos++];\n            count = (bytes[pos++] << 8) | bytes[pos++];\n            for (i = 0; i <= count; i++) {\n              charset.push(cid ? id++ : strings.get(id++));\n            }\n          }\n          break;\n        default:\n          throw new FormatError('Unknown charset format');\n      }\n      // Raw won't be needed if we actually compile the charset.\n      var end = pos;\n      var raw = bytes.subarray(start, end);\n\n      return new CFFCharset(false, format, charset, raw);\n    },\n    parseEncoding: function CFFParser_parseEncoding(pos,\n                                                    properties,\n                                                    strings,\n                                                    charset) {\n      var encoding = Object.create(null);\n      var bytes = this.bytes;\n      var predefined = false;\n      var format, i, ii;\n      var raw = null;\n\n      function readSupplement() {\n        var supplementsCount = bytes[pos++];\n        for (i = 0; i < supplementsCount; i++) {\n          var code = bytes[pos++];\n          var sid = (bytes[pos++] << 8) + (bytes[pos++] & 0xff);\n          encoding[code] = charset.indexOf(strings.get(sid));\n        }\n      }\n\n      if (pos === 0 || pos === 1) {\n        predefined = true;\n        format = pos;\n        var baseEncoding = pos ? ExpertEncoding : StandardEncoding;\n        for (i = 0, ii = charset.length; i < ii; i++) {\n          var index = baseEncoding.indexOf(charset[i]);\n          if (index !== -1) {\n            encoding[index] = i;\n          }\n        }\n      } else {\n        var dataStart = pos;\n        format = bytes[pos++];\n        switch (format & 0x7f) {\n          case 0:\n            var glyphsCount = bytes[pos++];\n            for (i = 1; i <= glyphsCount; i++) {\n              encoding[bytes[pos++]] = i;\n            }\n            break;\n\n          case 1:\n            var rangesCount = bytes[pos++];\n            var gid = 1;\n            for (i = 0; i < rangesCount; i++) {\n              var start = bytes[pos++];\n              var left = bytes[pos++];\n              for (var j = start; j <= start + left; j++) {\n                encoding[j] = gid++;\n              }\n            }\n            break;\n\n          default:\n            throw new FormatError(`Unknown encoding format: ${format} in CFF`);\n        }\n        var dataEnd = pos;\n        if (format & 0x80) { // hasSupplement\n          // The font sanitizer does not support CFF encoding with a\n          // supplement, since the encoding is not really used to map\n          // between gid to glyph, let's overwrite what is declared in\n          // the top dictionary to let the sanitizer think the font use\n          // StandardEncoding, that's a lie but that's ok.\n          bytes[dataStart] &= 0x7f;\n          readSupplement();\n        }\n        raw = bytes.subarray(dataStart, dataEnd);\n      }\n      format = format & 0x7f;\n      return new CFFEncoding(predefined, format, encoding, raw);\n    },\n    parseFDSelect: function CFFParser_parseFDSelect(pos, length) {\n      var bytes = this.bytes;\n      var format = bytes[pos++];\n      var fdSelect = [];\n      var i;\n\n      switch (format) {\n        case 0:\n          for (i = 0; i < length; ++i) {\n            var id = bytes[pos++];\n            fdSelect.push(id);\n          }\n          break;\n        case 3:\n          var rangesCount = (bytes[pos++] << 8) | bytes[pos++];\n          for (i = 0; i < rangesCount; ++i) {\n            var first = (bytes[pos++] << 8) | bytes[pos++];\n            if (i === 0 && first !== 0) {\n              warn('parseFDSelect: The first range must have a first GID of 0' +\n                   ' -- trying to recover.');\n              first = 0;\n            }\n            var fdIndex = bytes[pos++];\n            var next = (bytes[pos] << 8) | bytes[pos + 1];\n            for (var j = first; j < next; ++j) {\n              fdSelect.push(fdIndex);\n            }\n          }\n          // Advance past the sentinel(next).\n          pos += 2;\n          break;\n        default:\n          throw new FormatError(`parseFDSelect: Unknown format \"${format}\".`);\n      }\n      if (fdSelect.length !== length) {\n        throw new FormatError('parseFDSelect: Invalid font data.');\n      }\n\n      return new CFFFDSelect(format, fdSelect);\n    },\n  };\n  return CFFParser;\n})();\n\n// Compact Font Format\nvar CFF = (function CFFClosure() {\n  function CFF() {\n    this.header = null;\n    this.names = [];\n    this.topDict = null;\n    this.strings = new CFFStrings();\n    this.globalSubrIndex = null;\n\n    // The following could really be per font, but since we only have one font\n    // store them here.\n    this.encoding = null;\n    this.charset = null;\n    this.charStrings = null;\n    this.fdArray = [];\n    this.fdSelect = null;\n\n    this.isCIDFont = false;\n  }\n  CFF.prototype = {\n    duplicateFirstGlyph: function CFF_duplicateFirstGlyph() {\n      // Browsers will not display a glyph at position 0. Typically glyph 0 is\n      // notdef, but a number of fonts put a valid glyph there so it must be\n      // duplicated and appended.\n      if (this.charStrings.count >= 65535) {\n        warn('Not enough space in charstrings to duplicate first glyph.');\n        return;\n      }\n      var glyphZero = this.charStrings.get(0);\n      this.charStrings.add(glyphZero);\n      if (this.isCIDFont) {\n        this.fdSelect.fdSelect.push(this.fdSelect.fdSelect[0]);\n      }\n    },\n    hasGlyphId: function CFF_hasGlyphID(id) {\n      if (id < 0 || id >= this.charStrings.count) {\n        return false;\n      }\n      var glyph = this.charStrings.get(id);\n      return glyph.length > 0;\n    },\n  };\n\n  return CFF;\n})();\n\nvar CFFHeader = (function CFFHeaderClosure() {\n  function CFFHeader(major, minor, hdrSize, offSize) {\n    this.major = major;\n    this.minor = minor;\n    this.hdrSize = hdrSize;\n    this.offSize = offSize;\n  }\n  return CFFHeader;\n})();\n\nvar CFFStrings = (function CFFStringsClosure() {\n  function CFFStrings() {\n    this.strings = [];\n  }\n  CFFStrings.prototype = {\n    get: function CFFStrings_get(index) {\n      if (index >= 0 && index <= 390) {\n        return CFFStandardStrings[index];\n      }\n      if (index - 391 <= this.strings.length) {\n        return this.strings[index - 391];\n      }\n      return CFFStandardStrings[0];\n    },\n    add: function CFFStrings_add(value) {\n      this.strings.push(value);\n    },\n    get count() {\n      return this.strings.length;\n    },\n  };\n  return CFFStrings;\n})();\n\nvar CFFIndex = (function CFFIndexClosure() {\n  function CFFIndex() {\n    this.objects = [];\n    this.length = 0;\n  }\n  CFFIndex.prototype = {\n    add: function CFFIndex_add(data) {\n      this.length += data.length;\n      this.objects.push(data);\n    },\n    set: function CFFIndex_set(index, data) {\n      this.length += data.length - this.objects[index].length;\n      this.objects[index] = data;\n    },\n    get: function CFFIndex_get(index) {\n      return this.objects[index];\n    },\n    get count() {\n      return this.objects.length;\n    },\n  };\n  return CFFIndex;\n})();\n\nvar CFFDict = (function CFFDictClosure() {\n  function CFFDict(tables, strings) {\n    this.keyToNameMap = tables.keyToNameMap;\n    this.nameToKeyMap = tables.nameToKeyMap;\n    this.defaults = tables.defaults;\n    this.types = tables.types;\n    this.opcodes = tables.opcodes;\n    this.order = tables.order;\n    this.strings = strings;\n    this.values = Object.create(null);\n  }\n  CFFDict.prototype = {\n    // value should always be an array\n    setByKey: function CFFDict_setByKey(key, value) {\n      if (!(key in this.keyToNameMap)) {\n        return false;\n      }\n      var valueLength = value.length;\n      // ignore empty values\n      if (valueLength === 0) {\n        return true;\n      }\n      // Ignore invalid values (fixes bug1068432.pdf and bug1308536.pdf).\n      for (var i = 0; i < valueLength; i++) {\n        if (isNaN(value[i])) {\n          warn('Invalid CFFDict value: \"' + value + '\" for key \"' + key + '\".');\n          return true;\n        }\n      }\n      var type = this.types[key];\n      // remove the array wrapping these types of values\n      if (type === 'num' || type === 'sid' || type === 'offset') {\n        value = value[0];\n      }\n      this.values[key] = value;\n      return true;\n    },\n    setByName: function CFFDict_setByName(name, value) {\n      if (!(name in this.nameToKeyMap)) {\n        throw new FormatError(`Invalid dictionary name \"${name}\"`);\n      }\n      this.values[this.nameToKeyMap[name]] = value;\n    },\n    hasName: function CFFDict_hasName(name) {\n      return this.nameToKeyMap[name] in this.values;\n    },\n    getByName: function CFFDict_getByName(name) {\n      if (!(name in this.nameToKeyMap)) {\n        throw new FormatError(`Invalid dictionary name ${name}\"`);\n      }\n      var key = this.nameToKeyMap[name];\n      if (!(key in this.values)) {\n        return this.defaults[key];\n      }\n      return this.values[key];\n    },\n    removeByName: function CFFDict_removeByName(name) {\n      delete this.values[this.nameToKeyMap[name]];\n    },\n  };\n  CFFDict.createTables = function CFFDict_createTables(layout) {\n    var tables = {\n      keyToNameMap: {},\n      nameToKeyMap: {},\n      defaults: {},\n      types: {},\n      opcodes: {},\n      order: [],\n    };\n    for (var i = 0, ii = layout.length; i < ii; ++i) {\n      var entry = layout[i];\n      var key = Array.isArray(entry[0]) ?\n                (entry[0][0] << 8) + entry[0][1] : entry[0];\n      tables.keyToNameMap[key] = entry[1];\n      tables.nameToKeyMap[entry[1]] = key;\n      tables.types[key] = entry[2];\n      tables.defaults[key] = entry[3];\n      tables.opcodes[key] = Array.isArray(entry[0]) ? entry[0] : [entry[0]];\n      tables.order.push(key);\n    }\n    return tables;\n  };\n  return CFFDict;\n})();\n\nvar CFFTopDict = (function CFFTopDictClosure() {\n  var layout = [\n    [[12, 30], 'ROS', ['sid', 'sid', 'num'], null],\n    [[12, 20], 'SyntheticBase', 'num', null],\n    [0, 'version', 'sid', null],\n    [1, 'Notice', 'sid', null],\n    [[12, 0], 'Copyright', 'sid', null],\n    [2, 'FullName', 'sid', null],\n    [3, 'FamilyName', 'sid', null],\n    [4, 'Weight', 'sid', null],\n    [[12, 1], 'isFixedPitch', 'num', 0],\n    [[12, 2], 'ItalicAngle', 'num', 0],\n    [[12, 3], 'UnderlinePosition', 'num', -100],\n    [[12, 4], 'UnderlineThickness', 'num', 50],\n    [[12, 5], 'PaintType', 'num', 0],\n    [[12, 6], 'CharstringType', 'num', 2],\n    [[12, 7], 'FontMatrix', ['num', 'num', 'num', 'num', 'num', 'num'],\n                            [0.001, 0, 0, 0.001, 0, 0]],\n    [13, 'UniqueID', 'num', null],\n    [5, 'FontBBox', ['num', 'num', 'num', 'num'], [0, 0, 0, 0]],\n    [[12, 8], 'StrokeWidth', 'num', 0],\n    [14, 'XUID', 'array', null],\n    [15, 'charset', 'offset', 0],\n    [16, 'Encoding', 'offset', 0],\n    [17, 'CharStrings', 'offset', 0],\n    [18, 'Private', ['offset', 'offset'], null],\n    [[12, 21], 'PostScript', 'sid', null],\n    [[12, 22], 'BaseFontName', 'sid', null],\n    [[12, 23], 'BaseFontBlend', 'delta', null],\n    [[12, 31], 'CIDFontVersion', 'num', 0],\n    [[12, 32], 'CIDFontRevision', 'num', 0],\n    [[12, 33], 'CIDFontType', 'num', 0],\n    [[12, 34], 'CIDCount', 'num', 8720],\n    [[12, 35], 'UIDBase', 'num', null],\n    // XXX: CID Fonts on DirectWrite 6.1 only seem to work if FDSelect comes\n    // before FDArray.\n    [[12, 37], 'FDSelect', 'offset', null],\n    [[12, 36], 'FDArray', 'offset', null],\n    [[12, 38], 'FontName', 'sid', null]\n  ];\n  var tables = null;\n  function CFFTopDict(strings) {\n    if (tables === null) {\n      tables = CFFDict.createTables(layout);\n    }\n    CFFDict.call(this, tables, strings);\n    this.privateDict = null;\n  }\n  CFFTopDict.prototype = Object.create(CFFDict.prototype);\n  return CFFTopDict;\n})();\n\nvar CFFPrivateDict = (function CFFPrivateDictClosure() {\n  var layout = [\n    [6, 'BlueValues', 'delta', null],\n    [7, 'OtherBlues', 'delta', null],\n    [8, 'FamilyBlues', 'delta', null],\n    [9, 'FamilyOtherBlues', 'delta', null],\n    [[12, 9], 'BlueScale', 'num', 0.039625],\n    [[12, 10], 'BlueShift', 'num', 7],\n    [[12, 11], 'BlueFuzz', 'num', 1],\n    [10, 'StdHW', 'num', null],\n    [11, 'StdVW', 'num', null],\n    [[12, 12], 'StemSnapH', 'delta', null],\n    [[12, 13], 'StemSnapV', 'delta', null],\n    [[12, 14], 'ForceBold', 'num', 0],\n    [[12, 17], 'LanguageGroup', 'num', 0],\n    [[12, 18], 'ExpansionFactor', 'num', 0.06],\n    [[12, 19], 'initialRandomSeed', 'num', 0],\n    [20, 'defaultWidthX', 'num', 0],\n    [21, 'nominalWidthX', 'num', 0],\n    [19, 'Subrs', 'offset', null]\n  ];\n  var tables = null;\n  function CFFPrivateDict(strings) {\n    if (tables === null) {\n      tables = CFFDict.createTables(layout);\n    }\n    CFFDict.call(this, tables, strings);\n    this.subrsIndex = null;\n  }\n  CFFPrivateDict.prototype = Object.create(CFFDict.prototype);\n  return CFFPrivateDict;\n})();\n\nvar CFFCharsetPredefinedTypes = {\n  ISO_ADOBE: 0,\n  EXPERT: 1,\n  EXPERT_SUBSET: 2,\n};\nvar CFFCharset = (function CFFCharsetClosure() {\n  function CFFCharset(predefined, format, charset, raw) {\n    this.predefined = predefined;\n    this.format = format;\n    this.charset = charset;\n    this.raw = raw;\n  }\n  return CFFCharset;\n})();\n\nvar CFFEncoding = (function CFFEncodingClosure() {\n  function CFFEncoding(predefined, format, encoding, raw) {\n    this.predefined = predefined;\n    this.format = format;\n    this.encoding = encoding;\n    this.raw = raw;\n  }\n  return CFFEncoding;\n})();\n\nvar CFFFDSelect = (function CFFFDSelectClosure() {\n  function CFFFDSelect(format, fdSelect) {\n    this.format = format;\n    this.fdSelect = fdSelect;\n  }\n  CFFFDSelect.prototype = {\n    getFDIndex: function CFFFDSelect_get(glyphIndex) {\n      if (glyphIndex < 0 || glyphIndex >= this.fdSelect.length) {\n        return -1;\n      }\n      return this.fdSelect[glyphIndex];\n    },\n  };\n  return CFFFDSelect;\n})();\n\n// Helper class to keep track of where an offset is within the data and helps\n// filling in that offset once it's known.\nvar CFFOffsetTracker = (function CFFOffsetTrackerClosure() {\n  function CFFOffsetTracker() {\n    this.offsets = Object.create(null);\n  }\n  CFFOffsetTracker.prototype = {\n    isTracking: function CFFOffsetTracker_isTracking(key) {\n      return key in this.offsets;\n    },\n    track: function CFFOffsetTracker_track(key, location) {\n      if (key in this.offsets) {\n        throw new FormatError(`Already tracking location of ${key}`);\n      }\n      this.offsets[key] = location;\n    },\n    offset: function CFFOffsetTracker_offset(value) {\n      for (var key in this.offsets) {\n        this.offsets[key] += value;\n      }\n    },\n    setEntryLocation: function CFFOffsetTracker_setEntryLocation(key,\n                                                                 values,\n                                                                 output) {\n      if (!(key in this.offsets)) {\n        throw new FormatError(`Not tracking location of ${key}`);\n      }\n      var data = output.data;\n      var dataOffset = this.offsets[key];\n      var size = 5;\n      for (var i = 0, ii = values.length; i < ii; ++i) {\n        var offset0 = i * size + dataOffset;\n        var offset1 = offset0 + 1;\n        var offset2 = offset0 + 2;\n        var offset3 = offset0 + 3;\n        var offset4 = offset0 + 4;\n        // It's easy to screw up offsets so perform this sanity check.\n        if (data[offset0] !== 0x1d || data[offset1] !== 0 ||\n            data[offset2] !== 0 || data[offset3] !== 0 || data[offset4] !== 0) {\n          throw new FormatError('writing to an offset that is not empty');\n        }\n        var value = values[i];\n        data[offset0] = 0x1d;\n        data[offset1] = (value >> 24) & 0xFF;\n        data[offset2] = (value >> 16) & 0xFF;\n        data[offset3] = (value >> 8) & 0xFF;\n        data[offset4] = value & 0xFF;\n      }\n    },\n  };\n  return CFFOffsetTracker;\n})();\n\n// Takes a CFF and converts it to the binary representation.\nvar CFFCompiler = (function CFFCompilerClosure() {\n  function CFFCompiler(cff) {\n    this.cff = cff;\n  }\n  CFFCompiler.prototype = {\n    compile: function CFFCompiler_compile() {\n      var cff = this.cff;\n      var output = {\n        data: [],\n        length: 0,\n        add: function CFFCompiler_add(data) {\n          this.data = this.data.concat(data);\n          this.length = this.data.length;\n        },\n      };\n\n      // Compile the five entries that must be in order.\n      var header = this.compileHeader(cff.header);\n      output.add(header);\n\n      var nameIndex = this.compileNameIndex(cff.names);\n      output.add(nameIndex);\n\n      if (cff.isCIDFont) {\n        // The spec is unclear on how font matrices should relate to each other\n        // when there is one in the main top dict and the sub top dicts.\n        // Windows handles this differently than linux and osx so we have to\n        // normalize to work on all.\n        // Rules based off of some mailing list discussions:\n        // - If main font has a matrix and subfont doesn't, use the main matrix.\n        // - If no main font matrix and there is a subfont matrix, use the\n        //   subfont matrix.\n        // - If both have matrices, concat together.\n        // - If neither have matrices, use default.\n        // To make this work on all platforms we move the top matrix into each\n        // sub top dict and concat if necessary.\n        if (cff.topDict.hasName('FontMatrix')) {\n          var base = cff.topDict.getByName('FontMatrix');\n          cff.topDict.removeByName('FontMatrix');\n          for (var i = 0, ii = cff.fdArray.length; i < ii; i++) {\n            var subDict = cff.fdArray[i];\n            var matrix = base.slice(0);\n            if (subDict.hasName('FontMatrix')) {\n              matrix = Util.transform(matrix, subDict.getByName('FontMatrix'));\n            }\n            subDict.setByName('FontMatrix', matrix);\n          }\n        }\n      }\n\n      cff.topDict.setByName('charset', 0);\n      var compiled = this.compileTopDicts([cff.topDict],\n                                          output.length,\n                                          cff.isCIDFont);\n      output.add(compiled.output);\n      var topDictTracker = compiled.trackers[0];\n\n      var stringIndex = this.compileStringIndex(cff.strings.strings);\n      output.add(stringIndex);\n\n      var globalSubrIndex = this.compileIndex(cff.globalSubrIndex);\n      output.add(globalSubrIndex);\n\n      // Now start on the other entries that have no specific order.\n      if (cff.encoding && cff.topDict.hasName('Encoding')) {\n        if (cff.encoding.predefined) {\n          topDictTracker.setEntryLocation('Encoding', [cff.encoding.format],\n                                          output);\n        } else {\n          var encoding = this.compileEncoding(cff.encoding);\n          topDictTracker.setEntryLocation('Encoding', [output.length], output);\n          output.add(encoding);\n        }\n      }\n      var charset = this.compileCharset(cff.charset);\n      topDictTracker.setEntryLocation('charset', [output.length], output);\n      output.add(charset);\n\n      var charStrings = this.compileCharStrings(cff.charStrings);\n      topDictTracker.setEntryLocation('CharStrings', [output.length], output);\n      output.add(charStrings);\n\n      if (cff.isCIDFont) {\n        // For some reason FDSelect must be in front of FDArray on windows. OSX\n        // and linux don't seem to care.\n        topDictTracker.setEntryLocation('FDSelect', [output.length], output);\n        var fdSelect = this.compileFDSelect(cff.fdSelect);\n        output.add(fdSelect);\n        // It is unclear if the sub font dictionary can have CID related\n        // dictionary keys, but the sanitizer doesn't like them so remove them.\n        compiled = this.compileTopDicts(cff.fdArray, output.length, true);\n        topDictTracker.setEntryLocation('FDArray', [output.length], output);\n        output.add(compiled.output);\n        var fontDictTrackers = compiled.trackers;\n\n        this.compilePrivateDicts(cff.fdArray, fontDictTrackers, output);\n      }\n\n      this.compilePrivateDicts([cff.topDict], [topDictTracker], output);\n\n      // If the font data ends with INDEX whose object data is zero-length,\n      // the sanitizer will bail out. Add a dummy byte to avoid that.\n      output.add([0]);\n\n      return output.data;\n    },\n    encodeNumber: function CFFCompiler_encodeNumber(value) {\n      if (parseFloat(value) === parseInt(value, 10) && !isNaN(value)) { // isInt\n        return this.encodeInteger(value);\n      }\n      return this.encodeFloat(value);\n    },\n    encodeFloat: function CFFCompiler_encodeFloat(num) {\n      var value = num.toString();\n\n      // rounding inaccurate doubles\n      var m = /\\.(\\d*?)(?:9{5,20}|0{5,20})\\d{0,2}(?:e(.+)|$)/.exec(value);\n      if (m) {\n        var epsilon = parseFloat('1e' + ((m[2] ? +m[2] : 0) + m[1].length));\n        value = (Math.round(num * epsilon) / epsilon).toString();\n      }\n\n      var nibbles = '';\n      var i, ii;\n      for (i = 0, ii = value.length; i < ii; ++i) {\n        var a = value[i];\n        if (a === 'e') {\n          nibbles += value[++i] === '-' ? 'c' : 'b';\n        } else if (a === '.') {\n          nibbles += 'a';\n        } else if (a === '-') {\n          nibbles += 'e';\n        } else {\n          nibbles += a;\n        }\n      }\n      nibbles += (nibbles.length & 1) ? 'f' : 'ff';\n      var out = [30];\n      for (i = 0, ii = nibbles.length; i < ii; i += 2) {\n        out.push(parseInt(nibbles.substring(i, i + 2), 16));\n      }\n      return out;\n    },\n    encodeInteger: function CFFCompiler_encodeInteger(value) {\n      var code;\n      if (value >= -107 && value <= 107) {\n        code = [value + 139];\n      } else if (value >= 108 && value <= 1131) {\n        value = value - 108;\n        code = [(value >> 8) + 247, value & 0xFF];\n      } else if (value >= -1131 && value <= -108) {\n        value = -value - 108;\n        code = [(value >> 8) + 251, value & 0xFF];\n      } else if (value >= -32768 && value <= 32767) {\n        code = [0x1c, (value >> 8) & 0xFF, value & 0xFF];\n      } else {\n        code = [0x1d,\n                (value >> 24) & 0xFF,\n                (value >> 16) & 0xFF,\n                (value >> 8) & 0xFF,\n                 value & 0xFF];\n      }\n      return code;\n    },\n    compileHeader: function CFFCompiler_compileHeader(header) {\n      return [\n        header.major,\n        header.minor,\n        header.hdrSize,\n        header.offSize\n      ];\n    },\n    compileNameIndex: function CFFCompiler_compileNameIndex(names) {\n      var nameIndex = new CFFIndex();\n      for (var i = 0, ii = names.length; i < ii; ++i) {\n        var name = names[i];\n        // OTS doesn't allow names to be over 127 characters.\n        var length = Math.min(name.length, 127);\n        var sanitizedName = new Array(length);\n        for (var j = 0; j < length; j++) {\n          // OTS requires chars to be between a range and not certain other\n          // chars.\n          var char = name[j];\n          if (char < '!' || char > '~' || char === '[' || char === ']' ||\n              char === '(' || char === ')' || char === '{' || char === '}' ||\n              char === '<' || char === '>' || char === '/' || char === '%') {\n            char = '_';\n          }\n          sanitizedName[j] = char;\n        }\n        sanitizedName = sanitizedName.join('');\n\n        if (sanitizedName === '') {\n          sanitizedName = 'Bad_Font_Name';\n        }\n        nameIndex.add(stringToBytes(sanitizedName));\n      }\n      return this.compileIndex(nameIndex);\n    },\n    compileTopDicts: function CFFCompiler_compileTopDicts(dicts,\n                                                          length,\n                                                          removeCidKeys) {\n      var fontDictTrackers = [];\n      var fdArrayIndex = new CFFIndex();\n      for (var i = 0, ii = dicts.length; i < ii; ++i) {\n        var fontDict = dicts[i];\n        if (removeCidKeys) {\n          fontDict.removeByName('CIDFontVersion');\n          fontDict.removeByName('CIDFontRevision');\n          fontDict.removeByName('CIDFontType');\n          fontDict.removeByName('CIDCount');\n          fontDict.removeByName('UIDBase');\n        }\n        var fontDictTracker = new CFFOffsetTracker();\n        var fontDictData = this.compileDict(fontDict, fontDictTracker);\n        fontDictTrackers.push(fontDictTracker);\n        fdArrayIndex.add(fontDictData);\n        fontDictTracker.offset(length);\n      }\n      fdArrayIndex = this.compileIndex(fdArrayIndex, fontDictTrackers);\n      return {\n        trackers: fontDictTrackers,\n        output: fdArrayIndex,\n      };\n    },\n    compilePrivateDicts: function CFFCompiler_compilePrivateDicts(dicts,\n                                                                  trackers,\n                                                                  output) {\n      for (var i = 0, ii = dicts.length; i < ii; ++i) {\n        var fontDict = dicts[i];\n        var privateDict = fontDict.privateDict;\n        if (!privateDict || !fontDict.hasName('Private')) {\n          throw new FormatError('There must be a private dictionary.');\n        }\n        var privateDictTracker = new CFFOffsetTracker();\n        var privateDictData = this.compileDict(privateDict, privateDictTracker);\n\n        var outputLength = output.length;\n        privateDictTracker.offset(outputLength);\n        if (!privateDictData.length) {\n          // The private dictionary was empty, set the output length to zero to\n          // ensure the offset length isn't out of bounds in the eyes of the\n          // sanitizer.\n          outputLength = 0;\n        }\n\n        trackers[i].setEntryLocation('Private',\n                                     [privateDictData.length, outputLength],\n                                     output);\n        output.add(privateDictData);\n\n        if (privateDict.subrsIndex && privateDict.hasName('Subrs')) {\n          var subrs = this.compileIndex(privateDict.subrsIndex);\n          privateDictTracker.setEntryLocation('Subrs', [privateDictData.length],\n                                              output);\n          output.add(subrs);\n        }\n      }\n    },\n    compileDict: function CFFCompiler_compileDict(dict, offsetTracker) {\n      var out = [];\n      // The dictionary keys must be in a certain order.\n      var order = dict.order;\n      for (var i = 0; i < order.length; ++i) {\n        var key = order[i];\n        if (!(key in dict.values)) {\n          continue;\n        }\n        var values = dict.values[key];\n        var types = dict.types[key];\n        if (!Array.isArray(types)) {\n          types = [types];\n        }\n        if (!Array.isArray(values)) {\n          values = [values];\n        }\n\n        // Remove any empty dict values.\n        if (values.length === 0) {\n          continue;\n        }\n\n        for (var j = 0, jj = types.length; j < jj; ++j) {\n          var type = types[j];\n          var value = values[j];\n          switch (type) {\n            case 'num':\n            case 'sid':\n              out = out.concat(this.encodeNumber(value));\n              break;\n            case 'offset':\n              // For offsets we just insert a 32bit integer so we don't have to\n              // deal with figuring out the length of the offset when it gets\n              // replaced later on by the compiler.\n              var name = dict.keyToNameMap[key];\n              // Some offsets have the offset and the length, so just record the\n              // position of the first one.\n              if (!offsetTracker.isTracking(name)) {\n                offsetTracker.track(name, out.length);\n              }\n              out = out.concat([0x1d, 0, 0, 0, 0]);\n              break;\n            case 'array':\n            case 'delta':\n              out = out.concat(this.encodeNumber(value));\n              for (var k = 1, kk = values.length; k < kk; ++k) {\n                out = out.concat(this.encodeNumber(values[k]));\n              }\n              break;\n            default:\n              throw new FormatError(`Unknown data type of ${type}`);\n          }\n        }\n        out = out.concat(dict.opcodes[key]);\n      }\n      return out;\n    },\n    compileStringIndex: function CFFCompiler_compileStringIndex(strings) {\n      var stringIndex = new CFFIndex();\n      for (var i = 0, ii = strings.length; i < ii; ++i) {\n        stringIndex.add(stringToBytes(strings[i]));\n      }\n      return this.compileIndex(stringIndex);\n    },\n    compileGlobalSubrIndex: function CFFCompiler_compileGlobalSubrIndex() {\n      var globalSubrIndex = this.cff.globalSubrIndex;\n      this.out.writeByteArray(this.compileIndex(globalSubrIndex));\n    },\n    compileCharStrings: function CFFCompiler_compileCharStrings(charStrings) {\n      var charStringsIndex = new CFFIndex();\n      for (var i = 0; i < charStrings.count; i++) {\n        var glyph = charStrings.get(i);\n        // If the CharString outline is empty, replace it with .notdef to\n        // prevent OTS from rejecting the font (fixes bug1252420.pdf).\n        if (glyph.length === 0) {\n          charStringsIndex.add(new Uint8Array([0x8B, 0x0E]));\n          continue;\n        }\n        charStringsIndex.add(glyph);\n      }\n      return this.compileIndex(charStringsIndex);\n    },\n    compileCharset: function CFFCompiler_compileCharset(charset) {\n      let length = 1 + (this.cff.charStrings.count - 1) * 2;\n      // The contents of the charset doesn't matter, it's just there to make\n      // freetype happy.\n      let out = new Uint8Array(length);\n      return this.compileTypedArray(out);\n    },\n    compileEncoding: function CFFCompiler_compileEncoding(encoding) {\n      return this.compileTypedArray(encoding.raw);\n    },\n    compileFDSelect: function CFFCompiler_compileFDSelect(fdSelect) {\n      let format = fdSelect.format;\n      let out, i;\n      switch (format) {\n        case 0:\n          out = new Uint8Array(1 + fdSelect.fdSelect.length);\n          out[0] = format;\n          for (i = 0; i < fdSelect.fdSelect.length; i++) {\n            out[i + 1] = fdSelect.fdSelect[i];\n          }\n          break;\n        case 3:\n          let start = 0;\n          let lastFD = fdSelect.fdSelect[0];\n          let ranges = [\n            format,\n            0, // nRanges place holder\n            0, // nRanges place holder\n            (start >> 8) & 0xFF,\n            start & 0xFF,\n            lastFD\n          ];\n          for (i = 1; i < fdSelect.fdSelect.length; i++) {\n            let currentFD = fdSelect.fdSelect[i];\n            if (currentFD !== lastFD) {\n              ranges.push((i >> 8) & 0xFF, i & 0xFF, currentFD);\n              lastFD = currentFD;\n            }\n          }\n          // 3 bytes are pushed for every range and there are 3 header bytes.\n          let numRanges = (ranges.length - 3) / 3;\n          ranges[1] = (numRanges >> 8) & 0xFF;\n          ranges[2] = numRanges & 0xFF;\n          // sentinel\n          ranges.push((i >> 8) & 0xFF, i & 0xFF);\n          out = new Uint8Array(ranges);\n          break;\n      }\n      return this.compileTypedArray(out);\n    },\n    compileTypedArray: function CFFCompiler_compileTypedArray(data) {\n      var out = [];\n      for (var i = 0, ii = data.length; i < ii; ++i) {\n        out[i] = data[i];\n      }\n      return out;\n    },\n    compileIndex: function CFFCompiler_compileIndex(index, trackers) {\n      trackers = trackers || [];\n      var objects = index.objects;\n      // First 2 bytes contains the number of objects contained into this index\n      var count = objects.length;\n\n      // If there is no object, just create an index. This technically\n      // should just be [0, 0] but OTS has an issue with that.\n      if (count === 0) {\n        return [0, 0, 0];\n      }\n\n      var data = [(count >> 8) & 0xFF, count & 0xff];\n\n      var lastOffset = 1, i;\n      for (i = 0; i < count; ++i) {\n        lastOffset += objects[i].length;\n      }\n\n      var offsetSize;\n      if (lastOffset < 0x100) {\n        offsetSize = 1;\n      } else if (lastOffset < 0x10000) {\n        offsetSize = 2;\n      } else if (lastOffset < 0x1000000) {\n        offsetSize = 3;\n      } else {\n        offsetSize = 4;\n      }\n\n      // Next byte contains the offset size use to reference object in the file\n      data.push(offsetSize);\n\n      // Add another offset after this one because we need a new offset\n      var relativeOffset = 1;\n      for (i = 0; i < count + 1; i++) {\n        if (offsetSize === 1) {\n          data.push(relativeOffset & 0xFF);\n        } else if (offsetSize === 2) {\n          data.push((relativeOffset >> 8) & 0xFF,\n                     relativeOffset & 0xFF);\n        } else if (offsetSize === 3) {\n          data.push((relativeOffset >> 16) & 0xFF,\n                    (relativeOffset >> 8) & 0xFF,\n                     relativeOffset & 0xFF);\n        } else {\n          data.push((relativeOffset >>> 24) & 0xFF,\n                    (relativeOffset >> 16) & 0xFF,\n                    (relativeOffset >> 8) & 0xFF,\n                     relativeOffset & 0xFF);\n        }\n\n        if (objects[i]) {\n          relativeOffset += objects[i].length;\n        }\n      }\n\n      for (i = 0; i < count; i++) {\n        // Notify the tracker where the object will be offset in the data.\n        if (trackers[i]) {\n          trackers[i].offset(data.length);\n        }\n        for (var j = 0, jj = objects[i].length; j < jj; j++) {\n          data.push(objects[i][j]);\n        }\n      }\n      return data;\n    },\n  };\n  return CFFCompiler;\n})();\n\nexport {\n  CFFStandardStrings,\n  CFFParser,\n  CFF,\n  CFFHeader,\n  CFFStrings,\n  CFFIndex,\n  CFFCharset,\n  CFFTopDict,\n  CFFPrivateDict,\n  CFFCompiler,\n  CFFFDSelect,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nvar ISOAdobeCharset = [\n  '.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar',\n  'percent', 'ampersand', 'quoteright', 'parenleft', 'parenright',\n  'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero',\n  'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight',\n  'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question',\n  'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',\n  'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',\n  'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore',\n  'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',\n  'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',\n  'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent',\n  'sterling', 'fraction', 'yen', 'florin', 'section', 'currency',\n  'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft',\n  'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl',\n  'periodcentered', 'paragraph', 'bullet', 'quotesinglbase',\n  'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis',\n  'perthousand', 'questiondown', 'grave', 'acute', 'circumflex', 'tilde',\n  'macron', 'breve', 'dotaccent', 'dieresis', 'ring', 'cedilla',\n  'hungarumlaut', 'ogonek', 'caron', 'emdash', 'AE', 'ordfeminine',\n  'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae', 'dotlessi', 'lslash',\n  'oslash', 'oe', 'germandbls', 'onesuperior', 'logicalnot', 'mu',\n  'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn', 'onequarter',\n  'divide', 'brokenbar', 'degree', 'thorn', 'threequarters', 'twosuperior',\n  'registered', 'minus', 'eth', 'multiply', 'threesuperior', 'copyright',\n  'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring', 'Atilde',\n  'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave', 'Iacute',\n  'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute', 'Ocircumflex',\n  'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute', 'Ucircumflex',\n  'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron', 'aacute',\n  'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde', 'ccedilla',\n  'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute', 'icircumflex',\n  'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex', 'odieresis',\n  'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex', 'udieresis',\n  'ugrave', 'yacute', 'ydieresis', 'zcaron'\n];\n\nvar ExpertCharset = [\n  '.notdef', 'space', 'exclamsmall', 'Hungarumlautsmall', 'dollaroldstyle',\n  'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior',\n  'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma',\n  'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle',\n  'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle',\n  'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle',\n  'colon', 'semicolon', 'commasuperior', 'threequartersemdash',\n  'periodsuperior', 'questionsmall', 'asuperior', 'bsuperior',\n  'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior',\n  'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior',\n  'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior',\n  'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall',\n  'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall',\n  'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall',\n  'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall',\n  'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary',\n  'onefitted', 'rupiah', 'Tildesmall', 'exclamdownsmall', 'centoldstyle',\n  'Lslashsmall', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall',\n  'Brevesmall', 'Caronsmall', 'Dotaccentsmall', 'Macronsmall',\n  'figuredash', 'hypheninferior', 'Ogoneksmall', 'Ringsmall',\n  'Cedillasmall', 'onequarter', 'onehalf', 'threequarters',\n  'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths',\n  'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior',\n  'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior',\n  'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior',\n  'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior',\n  'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior',\n  'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior',\n  'periodinferior', 'commainferior', 'Agravesmall', 'Aacutesmall',\n  'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', 'Aringsmall',\n  'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall',\n  'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall',\n  'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall',\n  'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall',\n  'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall',\n  'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall',\n  'Ydieresissmall'\n];\n\nvar ExpertSubsetCharset = [\n  '.notdef', 'space', 'dollaroldstyle', 'dollarsuperior',\n  'parenleftsuperior', 'parenrightsuperior', 'twodotenleader',\n  'onedotenleader', 'comma', 'hyphen', 'period', 'fraction',\n  'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle',\n  'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle',\n  'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', 'commasuperior',\n  'threequartersemdash', 'periodsuperior', 'asuperior', 'bsuperior',\n  'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior',\n  'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior',\n  'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior',\n  'parenrightinferior', 'hyphensuperior', 'colonmonetary', 'onefitted',\n  'rupiah', 'centoldstyle', 'figuredash', 'hypheninferior', 'onequarter',\n  'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths',\n  'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior',\n  'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior',\n  'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior',\n  'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior',\n  'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior',\n  'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior',\n  'periodinferior', 'commainferior'\n];\n\nexport {\n  ISOAdobeCharset,\n  ExpertCharset,\n  ExpertSubsetCharset,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst ExpertEncoding = [\n  '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',\n  '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',\n  'space', 'exclamsmall', 'Hungarumlautsmall', '', 'dollaroldstyle',\n  'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior',\n  'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma',\n  'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle',\n  'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle',\n  'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon',\n  'semicolon', 'commasuperior', 'threequartersemdash', 'periodsuperior',\n  'questionsmall', '', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior',\n  'esuperior', '', '', '', 'isuperior', '', '', 'lsuperior', 'msuperior',\n  'nsuperior', 'osuperior', '', '', 'rsuperior', 'ssuperior', 'tsuperior',\n  '', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', '',\n  'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall',\n  'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall',\n  'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall',\n  'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall',\n  'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary',\n  'onefitted', 'rupiah', 'Tildesmall', '', '', '', '', '', '', '', '', '',\n  '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',\n  '', '', '', '', '', '', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall',\n  '', '', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall',\n  'Caronsmall', '', 'Dotaccentsmall', '', '', 'Macronsmall', '', '',\n  'figuredash', 'hypheninferior', '', '', 'Ogoneksmall', 'Ringsmall',\n  'Cedillasmall', '', '', '', 'onequarter', 'onehalf', 'threequarters',\n  'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths',\n  'seveneighths', 'onethird', 'twothirds', '', '', 'zerosuperior',\n  'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior',\n  'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior',\n  'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior',\n  'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior',\n  'seveninferior', 'eightinferior', 'nineinferior', 'centinferior',\n  'dollarinferior', 'periodinferior', 'commainferior', 'Agravesmall',\n  'Aacutesmall', 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall',\n  'Aringsmall', 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall',\n  'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall',\n  'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall',\n  'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall',\n  'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall',\n  'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall',\n  'Ydieresissmall'];\n\nconst MacExpertEncoding = [\n  '', '', '', '', '', '', '', '', '', '', '', '', '', '',\n  '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',\n  'space', 'exclamsmall', 'Hungarumlautsmall', 'centoldstyle',\n  'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 'Acutesmall',\n  'parenleftsuperior', 'parenrightsuperior', 'twodotenleader',\n  'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle',\n  'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle',\n  'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle',\n  'nineoldstyle', 'colon', 'semicolon', '', 'threequartersemdash', '',\n  'questionsmall', '', '', '', '', 'Ethsmall', '', '', 'onequarter',\n  'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths',\n  'seveneighths', 'onethird', 'twothirds', '', '', '', '', '', '', 'ff',\n  'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', '', 'parenrightinferior',\n  'Circumflexsmall', 'hypheninferior', 'Gravesmall', 'Asmall', 'Bsmall',\n  'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall',\n  'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall',\n  'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall',\n  'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah',\n  'Tildesmall', '', '', 'asuperior', 'centsuperior', '', '', '', '',\n  'Aacutesmall', 'Agravesmall', 'Acircumflexsmall', 'Adieresissmall',\n  'Atildesmall', 'Aringsmall', 'Ccedillasmall', 'Eacutesmall', 'Egravesmall',\n  'Ecircumflexsmall', 'Edieresissmall', 'Iacutesmall', 'Igravesmall',\n  'Icircumflexsmall', 'Idieresissmall', 'Ntildesmall', 'Oacutesmall',\n  'Ogravesmall', 'Ocircumflexsmall', 'Odieresissmall', 'Otildesmall',\n  'Uacutesmall', 'Ugravesmall', 'Ucircumflexsmall', 'Udieresissmall', '',\n  'eightsuperior', 'fourinferior', 'threeinferior', 'sixinferior',\n  'eightinferior', 'seveninferior', 'Scaronsmall', '', 'centinferior',\n  'twoinferior', '', 'Dieresissmall', '', 'Caronsmall', 'osuperior',\n  'fiveinferior', '', 'commainferior', 'periodinferior', 'Yacutesmall', '',\n  'dollarinferior', '', '', 'Thornsmall', '', 'nineinferior', 'zeroinferior',\n  'Zcaronsmall', 'AEsmall', 'Oslashsmall', 'questiondownsmall',\n  'oneinferior', 'Lslashsmall', '', '', '', '', '', '', 'Cedillasmall', '',\n  '', '', '', '', 'OEsmall', 'figuredash', 'hyphensuperior', '', '', '', '',\n  'exclamdownsmall', '', 'Ydieresissmall', '', 'onesuperior', 'twosuperior',\n  'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior',\n  'sevensuperior', 'ninesuperior', 'zerosuperior', '', 'esuperior',\n  'rsuperior', 'tsuperior', '', '', 'isuperior', 'ssuperior', 'dsuperior',\n  '', '', '', '', '', 'lsuperior', 'Ogoneksmall', 'Brevesmall',\n  'Macronsmall', 'bsuperior', 'nsuperior', 'msuperior', 'commasuperior',\n  'periodsuperior', 'Dotaccentsmall', 'Ringsmall', '', '', '', ''];\n\nconst MacRomanEncoding = [\n  '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',\n  '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',\n  'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',\n  'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus',\n  'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three',\n  'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon',\n  'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F',\n  'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',\n  'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright',\n  'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g',\n  'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',\n  'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', '',\n  'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde', 'Odieresis',\n  'Udieresis', 'aacute', 'agrave', 'acircumflex', 'adieresis', 'atilde',\n  'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis',\n  'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute',\n  'ograve', 'ocircumflex', 'odieresis', 'otilde', 'uacute', 'ugrave',\n  'ucircumflex', 'udieresis', 'dagger', 'degree', 'cent', 'sterling',\n  'section', 'bullet', 'paragraph', 'germandbls', 'registered', 'copyright',\n  'trademark', 'acute', 'dieresis', 'notequal', 'AE', 'Oslash', 'infinity',\n  'plusminus', 'lessequal', 'greaterequal', 'yen', 'mu', 'partialdiff',\n  'summation', 'product', 'pi', 'integral', 'ordfeminine', 'ordmasculine',\n  'Omega', 'ae', 'oslash', 'questiondown', 'exclamdown', 'logicalnot',\n  'radical', 'florin', 'approxequal', 'Delta', 'guillemotleft',\n  'guillemotright', 'ellipsis', 'space', 'Agrave', 'Atilde', 'Otilde', 'OE',\n  'oe', 'endash', 'emdash', 'quotedblleft', 'quotedblright', 'quoteleft',\n  'quoteright', 'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction',\n  'currency', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl',\n  'periodcentered', 'quotesinglbase', 'quotedblbase', 'perthousand',\n  'Acircumflex', 'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute',\n  'Icircumflex', 'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple',\n  'Ograve', 'Uacute', 'Ucircumflex', 'Ugrave', 'dotlessi', 'circumflex',\n  'tilde', 'macron', 'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut',\n  'ogonek', 'caron'];\n\nconst StandardEncoding = [\n  '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',\n  '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',\n  'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',\n  'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus',\n  'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three',\n  'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon',\n  'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F',\n  'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',\n  'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright',\n  'asciicircum', 'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f',\n  'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u',\n  'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde',\n  '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',\n  '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'exclamdown',\n  'cent', 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency',\n  'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft',\n  'guilsinglright', 'fi', 'fl', '', 'endash', 'dagger', 'daggerdbl',\n  'periodcentered', '', 'paragraph', 'bullet', 'quotesinglbase',\n  'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis',\n  'perthousand', '', 'questiondown', '', 'grave', 'acute', 'circumflex',\n  'tilde', 'macron', 'breve', 'dotaccent', 'dieresis', '', 'ring', 'cedilla',\n  '', 'hungarumlaut', 'ogonek', 'caron', 'emdash', '', '', '', '', '', '',\n  '', '', '', '', '', '', '', '', '', '', 'AE', '', 'ordfeminine', '', '',\n  '', '', 'Lslash', 'Oslash', 'OE', 'ordmasculine', '', '', '', '', '', 'ae',\n  '', '', '', 'dotlessi', '', '', 'lslash', 'oslash', 'oe', 'germandbls', '',\n  '', '', ''];\n\nconst WinAnsiEncoding = [\n  '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',\n  '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',\n  'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',\n  'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus',\n  'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three',\n  'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon',\n  'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F',\n  'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',\n  'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright',\n  'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g',\n  'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',\n  'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde',\n  'bullet', 'Euro', 'bullet', 'quotesinglbase', 'florin', 'quotedblbase',\n  'ellipsis', 'dagger', 'daggerdbl', 'circumflex', 'perthousand', 'Scaron',\n  'guilsinglleft', 'OE', 'bullet', 'Zcaron', 'bullet', 'bullet', 'quoteleft',\n  'quoteright', 'quotedblleft', 'quotedblright', 'bullet', 'endash',\n  'emdash', 'tilde', 'trademark', 'scaron', 'guilsinglright', 'oe', 'bullet',\n  'zcaron', 'Ydieresis', 'space', 'exclamdown', 'cent', 'sterling',\n  'currency', 'yen', 'brokenbar', 'section', 'dieresis', 'copyright',\n  'ordfeminine', 'guillemotleft', 'logicalnot', 'hyphen', 'registered',\n  'macron', 'degree', 'plusminus', 'twosuperior', 'threesuperior', 'acute',\n  'mu', 'paragraph', 'periodcentered', 'cedilla', 'onesuperior',\n  'ordmasculine', 'guillemotright', 'onequarter', 'onehalf', 'threequarters',\n  'questiondown', 'Agrave', 'Aacute', 'Acircumflex', 'Atilde', 'Adieresis',\n  'Aring', 'AE', 'Ccedilla', 'Egrave', 'Eacute', 'Ecircumflex', 'Edieresis',\n  'Igrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Eth', 'Ntilde', 'Ograve',\n  'Oacute', 'Ocircumflex', 'Otilde', 'Odieresis', 'multiply', 'Oslash',\n  'Ugrave', 'Uacute', 'Ucircumflex', 'Udieresis', 'Yacute', 'Thorn',\n  'germandbls', 'agrave', 'aacute', 'acircumflex', 'atilde', 'adieresis',\n  'aring', 'ae', 'ccedilla', 'egrave', 'eacute', 'ecircumflex', 'edieresis',\n  'igrave', 'iacute', 'icircumflex', 'idieresis', 'eth', 'ntilde', 'ograve',\n  'oacute', 'ocircumflex', 'otilde', 'odieresis', 'divide', 'oslash',\n  'ugrave', 'uacute', 'ucircumflex', 'udieresis', 'yacute', 'thorn',\n  'ydieresis'];\n\nconst SymbolSetEncoding = [\n  '', '', '', '', '', '', '', '', '', '', '', '', '', '',\n  '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',\n  'space', 'exclam', 'universal', 'numbersign', 'existential', 'percent',\n  'ampersand', 'suchthat', 'parenleft', 'parenright', 'asteriskmath', 'plus',\n  'comma', 'minus', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four',\n  'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less',\n  'equal', 'greater', 'question', 'congruent', 'Alpha', 'Beta', 'Chi',\n  'Delta', 'Epsilon', 'Phi', 'Gamma', 'Eta', 'Iota', 'theta1', 'Kappa',\n  'Lambda', 'Mu', 'Nu', 'Omicron', 'Pi', 'Theta', 'Rho', 'Sigma', 'Tau',\n  'Upsilon', 'sigma1', 'Omega', 'Xi', 'Psi', 'Zeta', 'bracketleft',\n  'therefore', 'bracketright', 'perpendicular', 'underscore', 'radicalex',\n  'alpha', 'beta', 'chi', 'delta', 'epsilon', 'phi', 'gamma', 'eta', 'iota',\n  'phi1', 'kappa', 'lambda', 'mu', 'nu', 'omicron', 'pi', 'theta', 'rho',\n  'sigma', 'tau', 'upsilon', 'omega1', 'omega', 'xi', 'psi', 'zeta',\n  'braceleft', 'bar', 'braceright', 'similar', '', '', '', '', '', '', '',\n  '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',\n  '', '', '', '', '', '', '', 'Euro', 'Upsilon1', 'minute', 'lessequal',\n  'fraction', 'infinity', 'florin', 'club', 'diamond', 'heart', 'spade',\n  'arrowboth', 'arrowleft', 'arrowup', 'arrowright', 'arrowdown', 'degree',\n  'plusminus', 'second', 'greaterequal', 'multiply', 'proportional',\n  'partialdiff', 'bullet', 'divide', 'notequal', 'equivalence',\n  'approxequal', 'ellipsis', 'arrowvertex', 'arrowhorizex', 'carriagereturn',\n  'aleph', 'Ifraktur', 'Rfraktur', 'weierstrass', 'circlemultiply',\n  'circleplus', 'emptyset', 'intersection', 'union', 'propersuperset',\n  'reflexsuperset', 'notsubset', 'propersubset', 'reflexsubset', 'element',\n  'notelement', 'angle', 'gradient', 'registerserif', 'copyrightserif',\n  'trademarkserif', 'product', 'radical', 'dotmath', 'logicalnot',\n  'logicaland', 'logicalor', 'arrowdblboth', 'arrowdblleft', 'arrowdblup',\n  'arrowdblright', 'arrowdbldown', 'lozenge', 'angleleft', 'registersans',\n  'copyrightsans', 'trademarksans', 'summation', 'parenlefttp',\n  'parenleftex', 'parenleftbt', 'bracketlefttp', 'bracketleftex',\n  'bracketleftbt', 'bracelefttp', 'braceleftmid', 'braceleftbt', 'braceex',\n  '', 'angleright', 'integral', 'integraltp', 'integralex', 'integralbt',\n  'parenrighttp', 'parenrightex', 'parenrightbt', 'bracketrighttp',\n  'bracketrightex', 'bracketrightbt', 'bracerighttp', 'bracerightmid',\n  'bracerightbt', ''];\n\nconst ZapfDingbatsEncoding = [\n  '', '', '', '', '', '', '', '', '', '', '', '', '', '',\n  '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',\n  'space', 'a1', 'a2', 'a202', 'a3', 'a4', 'a5', 'a119', 'a118', 'a117',\n  'a11', 'a12', 'a13', 'a14', 'a15', 'a16', 'a105', 'a17', 'a18', 'a19',\n  'a20', 'a21', 'a22', 'a23', 'a24', 'a25', 'a26', 'a27', 'a28', 'a6', 'a7',\n  'a8', 'a9', 'a10', 'a29', 'a30', 'a31', 'a32', 'a33', 'a34', 'a35', 'a36',\n  'a37', 'a38', 'a39', 'a40', 'a41', 'a42', 'a43', 'a44', 'a45', 'a46',\n  'a47', 'a48', 'a49', 'a50', 'a51', 'a52', 'a53', 'a54', 'a55', 'a56',\n  'a57', 'a58', 'a59', 'a60', 'a61', 'a62', 'a63', 'a64', 'a65', 'a66',\n  'a67', 'a68', 'a69', 'a70', 'a71', 'a72', 'a73', 'a74', 'a203', 'a75',\n  'a204', 'a76', 'a77', 'a78', 'a79', 'a81', 'a82', 'a83', 'a84', 'a97',\n  'a98', 'a99', 'a100', '', 'a89', 'a90', 'a93', 'a94', 'a91', 'a92', 'a205',\n  'a85', 'a206', 'a86', 'a87', 'a88', 'a95', 'a96', '', '', '', '', '', '',\n  '', '', '', '', '', '', '', '', '', '', '', '', '', 'a101', 'a102', 'a103',\n  'a104', 'a106', 'a107', 'a108', 'a112', 'a111', 'a110', 'a109', 'a120',\n  'a121', 'a122', 'a123', 'a124', 'a125', 'a126', 'a127', 'a128', 'a129',\n  'a130', 'a131', 'a132', 'a133', 'a134', 'a135', 'a136', 'a137', 'a138',\n  'a139', 'a140', 'a141', 'a142', 'a143', 'a144', 'a145', 'a146', 'a147',\n  'a148', 'a149', 'a150', 'a151', 'a152', 'a153', 'a154', 'a155', 'a156',\n  'a157', 'a158', 'a159', 'a160', 'a161', 'a163', 'a164', 'a196', 'a165',\n  'a192', 'a166', 'a167', 'a168', 'a169', 'a170', 'a171', 'a172', 'a173',\n  'a162', 'a174', 'a175', 'a176', 'a177', 'a178', 'a179', 'a193', 'a180',\n  'a199', 'a181', 'a200', 'a182', '', 'a201', 'a183', 'a184', 'a197', 'a185',\n  'a194', 'a198', 'a186', 'a195', 'a187', 'a188', 'a189', 'a190', 'a191', ''];\n\nfunction getEncoding(encodingName) {\n  switch (encodingName) {\n    case 'WinAnsiEncoding':\n      return WinAnsiEncoding;\n    case 'StandardEncoding':\n      return StandardEncoding;\n    case 'MacRomanEncoding':\n      return MacRomanEncoding;\n    case 'SymbolSetEncoding':\n      return SymbolSetEncoding;\n    case 'ZapfDingbatsEncoding':\n      return ZapfDingbatsEncoding;\n    case 'ExpertEncoding':\n      return ExpertEncoding;\n    case 'MacExpertEncoding':\n      return MacExpertEncoding;\n    default:\n      return null;\n  }\n}\n\nexport {\n  WinAnsiEncoding,\n  StandardEncoding,\n  MacRomanEncoding,\n  SymbolSetEncoding,\n  ZapfDingbatsEncoding,\n  ExpertEncoding,\n  getEncoding,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* no-babel-preset */\n\nvar getLookupTableFactory = require('../shared/util').getLookupTableFactory;\n\nvar getGlyphsUnicode = getLookupTableFactory(function (t) {\n  t['A'] = 0x0041;\n  t['AE'] = 0x00C6;\n  t['AEacute'] = 0x01FC;\n  t['AEmacron'] = 0x01E2;\n  t['AEsmall'] = 0xF7E6;\n  t['Aacute'] = 0x00C1;\n  t['Aacutesmall'] = 0xF7E1;\n  t['Abreve'] = 0x0102;\n  t['Abreveacute'] = 0x1EAE;\n  t['Abrevecyrillic'] = 0x04D0;\n  t['Abrevedotbelow'] = 0x1EB6;\n  t['Abrevegrave'] = 0x1EB0;\n  t['Abrevehookabove'] = 0x1EB2;\n  t['Abrevetilde'] = 0x1EB4;\n  t['Acaron'] = 0x01CD;\n  t['Acircle'] = 0x24B6;\n  t['Acircumflex'] = 0x00C2;\n  t['Acircumflexacute'] = 0x1EA4;\n  t['Acircumflexdotbelow'] = 0x1EAC;\n  t['Acircumflexgrave'] = 0x1EA6;\n  t['Acircumflexhookabove'] = 0x1EA8;\n  t['Acircumflexsmall'] = 0xF7E2;\n  t['Acircumflextilde'] = 0x1EAA;\n  t['Acute'] = 0xF6C9;\n  t['Acutesmall'] = 0xF7B4;\n  t['Acyrillic'] = 0x0410;\n  t['Adblgrave'] = 0x0200;\n  t['Adieresis'] = 0x00C4;\n  t['Adieresiscyrillic'] = 0x04D2;\n  t['Adieresismacron'] = 0x01DE;\n  t['Adieresissmall'] = 0xF7E4;\n  t['Adotbelow'] = 0x1EA0;\n  t['Adotmacron'] = 0x01E0;\n  t['Agrave'] = 0x00C0;\n  t['Agravesmall'] = 0xF7E0;\n  t['Ahookabove'] = 0x1EA2;\n  t['Aiecyrillic'] = 0x04D4;\n  t['Ainvertedbreve'] = 0x0202;\n  t['Alpha'] = 0x0391;\n  t['Alphatonos'] = 0x0386;\n  t['Amacron'] = 0x0100;\n  t['Amonospace'] = 0xFF21;\n  t['Aogonek'] = 0x0104;\n  t['Aring'] = 0x00C5;\n  t['Aringacute'] = 0x01FA;\n  t['Aringbelow'] = 0x1E00;\n  t['Aringsmall'] = 0xF7E5;\n  t['Asmall'] = 0xF761;\n  t['Atilde'] = 0x00C3;\n  t['Atildesmall'] = 0xF7E3;\n  t['Aybarmenian'] = 0x0531;\n  t['B'] = 0x0042;\n  t['Bcircle'] = 0x24B7;\n  t['Bdotaccent'] = 0x1E02;\n  t['Bdotbelow'] = 0x1E04;\n  t['Becyrillic'] = 0x0411;\n  t['Benarmenian'] = 0x0532;\n  t['Beta'] = 0x0392;\n  t['Bhook'] = 0x0181;\n  t['Blinebelow'] = 0x1E06;\n  t['Bmonospace'] = 0xFF22;\n  t['Brevesmall'] = 0xF6F4;\n  t['Bsmall'] = 0xF762;\n  t['Btopbar'] = 0x0182;\n  t['C'] = 0x0043;\n  t['Caarmenian'] = 0x053E;\n  t['Cacute'] = 0x0106;\n  t['Caron'] = 0xF6CA;\n  t['Caronsmall'] = 0xF6F5;\n  t['Ccaron'] = 0x010C;\n  t['Ccedilla'] = 0x00C7;\n  t['Ccedillaacute'] = 0x1E08;\n  t['Ccedillasmall'] = 0xF7E7;\n  t['Ccircle'] = 0x24B8;\n  t['Ccircumflex'] = 0x0108;\n  t['Cdot'] = 0x010A;\n  t['Cdotaccent'] = 0x010A;\n  t['Cedillasmall'] = 0xF7B8;\n  t['Chaarmenian'] = 0x0549;\n  t['Cheabkhasiancyrillic'] = 0x04BC;\n  t['Checyrillic'] = 0x0427;\n  t['Chedescenderabkhasiancyrillic'] = 0x04BE;\n  t['Chedescendercyrillic'] = 0x04B6;\n  t['Chedieresiscyrillic'] = 0x04F4;\n  t['Cheharmenian'] = 0x0543;\n  t['Chekhakassiancyrillic'] = 0x04CB;\n  t['Cheverticalstrokecyrillic'] = 0x04B8;\n  t['Chi'] = 0x03A7;\n  t['Chook'] = 0x0187;\n  t['Circumflexsmall'] = 0xF6F6;\n  t['Cmonospace'] = 0xFF23;\n  t['Coarmenian'] = 0x0551;\n  t['Csmall'] = 0xF763;\n  t['D'] = 0x0044;\n  t['DZ'] = 0x01F1;\n  t['DZcaron'] = 0x01C4;\n  t['Daarmenian'] = 0x0534;\n  t['Dafrican'] = 0x0189;\n  t['Dcaron'] = 0x010E;\n  t['Dcedilla'] = 0x1E10;\n  t['Dcircle'] = 0x24B9;\n  t['Dcircumflexbelow'] = 0x1E12;\n  t['Dcroat'] = 0x0110;\n  t['Ddotaccent'] = 0x1E0A;\n  t['Ddotbelow'] = 0x1E0C;\n  t['Decyrillic'] = 0x0414;\n  t['Deicoptic'] = 0x03EE;\n  t['Delta'] = 0x2206;\n  t['Deltagreek'] = 0x0394;\n  t['Dhook'] = 0x018A;\n  t['Dieresis'] = 0xF6CB;\n  t['DieresisAcute'] = 0xF6CC;\n  t['DieresisGrave'] = 0xF6CD;\n  t['Dieresissmall'] = 0xF7A8;\n  t['Digammagreek'] = 0x03DC;\n  t['Djecyrillic'] = 0x0402;\n  t['Dlinebelow'] = 0x1E0E;\n  t['Dmonospace'] = 0xFF24;\n  t['Dotaccentsmall'] = 0xF6F7;\n  t['Dslash'] = 0x0110;\n  t['Dsmall'] = 0xF764;\n  t['Dtopbar'] = 0x018B;\n  t['Dz'] = 0x01F2;\n  t['Dzcaron'] = 0x01C5;\n  t['Dzeabkhasiancyrillic'] = 0x04E0;\n  t['Dzecyrillic'] = 0x0405;\n  t['Dzhecyrillic'] = 0x040F;\n  t['E'] = 0x0045;\n  t['Eacute'] = 0x00C9;\n  t['Eacutesmall'] = 0xF7E9;\n  t['Ebreve'] = 0x0114;\n  t['Ecaron'] = 0x011A;\n  t['Ecedillabreve'] = 0x1E1C;\n  t['Echarmenian'] = 0x0535;\n  t['Ecircle'] = 0x24BA;\n  t['Ecircumflex'] = 0x00CA;\n  t['Ecircumflexacute'] = 0x1EBE;\n  t['Ecircumflexbelow'] = 0x1E18;\n  t['Ecircumflexdotbelow'] = 0x1EC6;\n  t['Ecircumflexgrave'] = 0x1EC0;\n  t['Ecircumflexhookabove'] = 0x1EC2;\n  t['Ecircumflexsmall'] = 0xF7EA;\n  t['Ecircumflextilde'] = 0x1EC4;\n  t['Ecyrillic'] = 0x0404;\n  t['Edblgrave'] = 0x0204;\n  t['Edieresis'] = 0x00CB;\n  t['Edieresissmall'] = 0xF7EB;\n  t['Edot'] = 0x0116;\n  t['Edotaccent'] = 0x0116;\n  t['Edotbelow'] = 0x1EB8;\n  t['Efcyrillic'] = 0x0424;\n  t['Egrave'] = 0x00C8;\n  t['Egravesmall'] = 0xF7E8;\n  t['Eharmenian'] = 0x0537;\n  t['Ehookabove'] = 0x1EBA;\n  t['Eightroman'] = 0x2167;\n  t['Einvertedbreve'] = 0x0206;\n  t['Eiotifiedcyrillic'] = 0x0464;\n  t['Elcyrillic'] = 0x041B;\n  t['Elevenroman'] = 0x216A;\n  t['Emacron'] = 0x0112;\n  t['Emacronacute'] = 0x1E16;\n  t['Emacrongrave'] = 0x1E14;\n  t['Emcyrillic'] = 0x041C;\n  t['Emonospace'] = 0xFF25;\n  t['Encyrillic'] = 0x041D;\n  t['Endescendercyrillic'] = 0x04A2;\n  t['Eng'] = 0x014A;\n  t['Enghecyrillic'] = 0x04A4;\n  t['Enhookcyrillic'] = 0x04C7;\n  t['Eogonek'] = 0x0118;\n  t['Eopen'] = 0x0190;\n  t['Epsilon'] = 0x0395;\n  t['Epsilontonos'] = 0x0388;\n  t['Ercyrillic'] = 0x0420;\n  t['Ereversed'] = 0x018E;\n  t['Ereversedcyrillic'] = 0x042D;\n  t['Escyrillic'] = 0x0421;\n  t['Esdescendercyrillic'] = 0x04AA;\n  t['Esh'] = 0x01A9;\n  t['Esmall'] = 0xF765;\n  t['Eta'] = 0x0397;\n  t['Etarmenian'] = 0x0538;\n  t['Etatonos'] = 0x0389;\n  t['Eth'] = 0x00D0;\n  t['Ethsmall'] = 0xF7F0;\n  t['Etilde'] = 0x1EBC;\n  t['Etildebelow'] = 0x1E1A;\n  t['Euro'] = 0x20AC;\n  t['Ezh'] = 0x01B7;\n  t['Ezhcaron'] = 0x01EE;\n  t['Ezhreversed'] = 0x01B8;\n  t['F'] = 0x0046;\n  t['Fcircle'] = 0x24BB;\n  t['Fdotaccent'] = 0x1E1E;\n  t['Feharmenian'] = 0x0556;\n  t['Feicoptic'] = 0x03E4;\n  t['Fhook'] = 0x0191;\n  t['Fitacyrillic'] = 0x0472;\n  t['Fiveroman'] = 0x2164;\n  t['Fmonospace'] = 0xFF26;\n  t['Fourroman'] = 0x2163;\n  t['Fsmall'] = 0xF766;\n  t['G'] = 0x0047;\n  t['GBsquare'] = 0x3387;\n  t['Gacute'] = 0x01F4;\n  t['Gamma'] = 0x0393;\n  t['Gammaafrican'] = 0x0194;\n  t['Gangiacoptic'] = 0x03EA;\n  t['Gbreve'] = 0x011E;\n  t['Gcaron'] = 0x01E6;\n  t['Gcedilla'] = 0x0122;\n  t['Gcircle'] = 0x24BC;\n  t['Gcircumflex'] = 0x011C;\n  t['Gcommaaccent'] = 0x0122;\n  t['Gdot'] = 0x0120;\n  t['Gdotaccent'] = 0x0120;\n  t['Gecyrillic'] = 0x0413;\n  t['Ghadarmenian'] = 0x0542;\n  t['Ghemiddlehookcyrillic'] = 0x0494;\n  t['Ghestrokecyrillic'] = 0x0492;\n  t['Gheupturncyrillic'] = 0x0490;\n  t['Ghook'] = 0x0193;\n  t['Gimarmenian'] = 0x0533;\n  t['Gjecyrillic'] = 0x0403;\n  t['Gmacron'] = 0x1E20;\n  t['Gmonospace'] = 0xFF27;\n  t['Grave'] = 0xF6CE;\n  t['Gravesmall'] = 0xF760;\n  t['Gsmall'] = 0xF767;\n  t['Gsmallhook'] = 0x029B;\n  t['Gstroke'] = 0x01E4;\n  t['H'] = 0x0048;\n  t['H18533'] = 0x25CF;\n  t['H18543'] = 0x25AA;\n  t['H18551'] = 0x25AB;\n  t['H22073'] = 0x25A1;\n  t['HPsquare'] = 0x33CB;\n  t['Haabkhasiancyrillic'] = 0x04A8;\n  t['Hadescendercyrillic'] = 0x04B2;\n  t['Hardsigncyrillic'] = 0x042A;\n  t['Hbar'] = 0x0126;\n  t['Hbrevebelow'] = 0x1E2A;\n  t['Hcedilla'] = 0x1E28;\n  t['Hcircle'] = 0x24BD;\n  t['Hcircumflex'] = 0x0124;\n  t['Hdieresis'] = 0x1E26;\n  t['Hdotaccent'] = 0x1E22;\n  t['Hdotbelow'] = 0x1E24;\n  t['Hmonospace'] = 0xFF28;\n  t['Hoarmenian'] = 0x0540;\n  t['Horicoptic'] = 0x03E8;\n  t['Hsmall'] = 0xF768;\n  t['Hungarumlaut'] = 0xF6CF;\n  t['Hungarumlautsmall'] = 0xF6F8;\n  t['Hzsquare'] = 0x3390;\n  t['I'] = 0x0049;\n  t['IAcyrillic'] = 0x042F;\n  t['IJ'] = 0x0132;\n  t['IUcyrillic'] = 0x042E;\n  t['Iacute'] = 0x00CD;\n  t['Iacutesmall'] = 0xF7ED;\n  t['Ibreve'] = 0x012C;\n  t['Icaron'] = 0x01CF;\n  t['Icircle'] = 0x24BE;\n  t['Icircumflex'] = 0x00CE;\n  t['Icircumflexsmall'] = 0xF7EE;\n  t['Icyrillic'] = 0x0406;\n  t['Idblgrave'] = 0x0208;\n  t['Idieresis'] = 0x00CF;\n  t['Idieresisacute'] = 0x1E2E;\n  t['Idieresiscyrillic'] = 0x04E4;\n  t['Idieresissmall'] = 0xF7EF;\n  t['Idot'] = 0x0130;\n  t['Idotaccent'] = 0x0130;\n  t['Idotbelow'] = 0x1ECA;\n  t['Iebrevecyrillic'] = 0x04D6;\n  t['Iecyrillic'] = 0x0415;\n  t['Ifraktur'] = 0x2111;\n  t['Igrave'] = 0x00CC;\n  t['Igravesmall'] = 0xF7EC;\n  t['Ihookabove'] = 0x1EC8;\n  t['Iicyrillic'] = 0x0418;\n  t['Iinvertedbreve'] = 0x020A;\n  t['Iishortcyrillic'] = 0x0419;\n  t['Imacron'] = 0x012A;\n  t['Imacroncyrillic'] = 0x04E2;\n  t['Imonospace'] = 0xFF29;\n  t['Iniarmenian'] = 0x053B;\n  t['Iocyrillic'] = 0x0401;\n  t['Iogonek'] = 0x012E;\n  t['Iota'] = 0x0399;\n  t['Iotaafrican'] = 0x0196;\n  t['Iotadieresis'] = 0x03AA;\n  t['Iotatonos'] = 0x038A;\n  t['Ismall'] = 0xF769;\n  t['Istroke'] = 0x0197;\n  t['Itilde'] = 0x0128;\n  t['Itildebelow'] = 0x1E2C;\n  t['Izhitsacyrillic'] = 0x0474;\n  t['Izhitsadblgravecyrillic'] = 0x0476;\n  t['J'] = 0x004A;\n  t['Jaarmenian'] = 0x0541;\n  t['Jcircle'] = 0x24BF;\n  t['Jcircumflex'] = 0x0134;\n  t['Jecyrillic'] = 0x0408;\n  t['Jheharmenian'] = 0x054B;\n  t['Jmonospace'] = 0xFF2A;\n  t['Jsmall'] = 0xF76A;\n  t['K'] = 0x004B;\n  t['KBsquare'] = 0x3385;\n  t['KKsquare'] = 0x33CD;\n  t['Kabashkircyrillic'] = 0x04A0;\n  t['Kacute'] = 0x1E30;\n  t['Kacyrillic'] = 0x041A;\n  t['Kadescendercyrillic'] = 0x049A;\n  t['Kahookcyrillic'] = 0x04C3;\n  t['Kappa'] = 0x039A;\n  t['Kastrokecyrillic'] = 0x049E;\n  t['Kaverticalstrokecyrillic'] = 0x049C;\n  t['Kcaron'] = 0x01E8;\n  t['Kcedilla'] = 0x0136;\n  t['Kcircle'] = 0x24C0;\n  t['Kcommaaccent'] = 0x0136;\n  t['Kdotbelow'] = 0x1E32;\n  t['Keharmenian'] = 0x0554;\n  t['Kenarmenian'] = 0x053F;\n  t['Khacyrillic'] = 0x0425;\n  t['Kheicoptic'] = 0x03E6;\n  t['Khook'] = 0x0198;\n  t['Kjecyrillic'] = 0x040C;\n  t['Klinebelow'] = 0x1E34;\n  t['Kmonospace'] = 0xFF2B;\n  t['Koppacyrillic'] = 0x0480;\n  t['Koppagreek'] = 0x03DE;\n  t['Ksicyrillic'] = 0x046E;\n  t['Ksmall'] = 0xF76B;\n  t['L'] = 0x004C;\n  t['LJ'] = 0x01C7;\n  t['LL'] = 0xF6BF;\n  t['Lacute'] = 0x0139;\n  t['Lambda'] = 0x039B;\n  t['Lcaron'] = 0x013D;\n  t['Lcedilla'] = 0x013B;\n  t['Lcircle'] = 0x24C1;\n  t['Lcircumflexbelow'] = 0x1E3C;\n  t['Lcommaaccent'] = 0x013B;\n  t['Ldot'] = 0x013F;\n  t['Ldotaccent'] = 0x013F;\n  t['Ldotbelow'] = 0x1E36;\n  t['Ldotbelowmacron'] = 0x1E38;\n  t['Liwnarmenian'] = 0x053C;\n  t['Lj'] = 0x01C8;\n  t['Ljecyrillic'] = 0x0409;\n  t['Llinebelow'] = 0x1E3A;\n  t['Lmonospace'] = 0xFF2C;\n  t['Lslash'] = 0x0141;\n  t['Lslashsmall'] = 0xF6F9;\n  t['Lsmall'] = 0xF76C;\n  t['M'] = 0x004D;\n  t['MBsquare'] = 0x3386;\n  t['Macron'] = 0xF6D0;\n  t['Macronsmall'] = 0xF7AF;\n  t['Macute'] = 0x1E3E;\n  t['Mcircle'] = 0x24C2;\n  t['Mdotaccent'] = 0x1E40;\n  t['Mdotbelow'] = 0x1E42;\n  t['Menarmenian'] = 0x0544;\n  t['Mmonospace'] = 0xFF2D;\n  t['Msmall'] = 0xF76D;\n  t['Mturned'] = 0x019C;\n  t['Mu'] = 0x039C;\n  t['N'] = 0x004E;\n  t['NJ'] = 0x01CA;\n  t['Nacute'] = 0x0143;\n  t['Ncaron'] = 0x0147;\n  t['Ncedilla'] = 0x0145;\n  t['Ncircle'] = 0x24C3;\n  t['Ncircumflexbelow'] = 0x1E4A;\n  t['Ncommaaccent'] = 0x0145;\n  t['Ndotaccent'] = 0x1E44;\n  t['Ndotbelow'] = 0x1E46;\n  t['Nhookleft'] = 0x019D;\n  t['Nineroman'] = 0x2168;\n  t['Nj'] = 0x01CB;\n  t['Njecyrillic'] = 0x040A;\n  t['Nlinebelow'] = 0x1E48;\n  t['Nmonospace'] = 0xFF2E;\n  t['Nowarmenian'] = 0x0546;\n  t['Nsmall'] = 0xF76E;\n  t['Ntilde'] = 0x00D1;\n  t['Ntildesmall'] = 0xF7F1;\n  t['Nu'] = 0x039D;\n  t['O'] = 0x004F;\n  t['OE'] = 0x0152;\n  t['OEsmall'] = 0xF6FA;\n  t['Oacute'] = 0x00D3;\n  t['Oacutesmall'] = 0xF7F3;\n  t['Obarredcyrillic'] = 0x04E8;\n  t['Obarreddieresiscyrillic'] = 0x04EA;\n  t['Obreve'] = 0x014E;\n  t['Ocaron'] = 0x01D1;\n  t['Ocenteredtilde'] = 0x019F;\n  t['Ocircle'] = 0x24C4;\n  t['Ocircumflex'] = 0x00D4;\n  t['Ocircumflexacute'] = 0x1ED0;\n  t['Ocircumflexdotbelow'] = 0x1ED8;\n  t['Ocircumflexgrave'] = 0x1ED2;\n  t['Ocircumflexhookabove'] = 0x1ED4;\n  t['Ocircumflexsmall'] = 0xF7F4;\n  t['Ocircumflextilde'] = 0x1ED6;\n  t['Ocyrillic'] = 0x041E;\n  t['Odblacute'] = 0x0150;\n  t['Odblgrave'] = 0x020C;\n  t['Odieresis'] = 0x00D6;\n  t['Odieresiscyrillic'] = 0x04E6;\n  t['Odieresissmall'] = 0xF7F6;\n  t['Odotbelow'] = 0x1ECC;\n  t['Ogoneksmall'] = 0xF6FB;\n  t['Ograve'] = 0x00D2;\n  t['Ogravesmall'] = 0xF7F2;\n  t['Oharmenian'] = 0x0555;\n  t['Ohm'] = 0x2126;\n  t['Ohookabove'] = 0x1ECE;\n  t['Ohorn'] = 0x01A0;\n  t['Ohornacute'] = 0x1EDA;\n  t['Ohorndotbelow'] = 0x1EE2;\n  t['Ohorngrave'] = 0x1EDC;\n  t['Ohornhookabove'] = 0x1EDE;\n  t['Ohorntilde'] = 0x1EE0;\n  t['Ohungarumlaut'] = 0x0150;\n  t['Oi'] = 0x01A2;\n  t['Oinvertedbreve'] = 0x020E;\n  t['Omacron'] = 0x014C;\n  t['Omacronacute'] = 0x1E52;\n  t['Omacrongrave'] = 0x1E50;\n  t['Omega'] = 0x2126;\n  t['Omegacyrillic'] = 0x0460;\n  t['Omegagreek'] = 0x03A9;\n  t['Omegaroundcyrillic'] = 0x047A;\n  t['Omegatitlocyrillic'] = 0x047C;\n  t['Omegatonos'] = 0x038F;\n  t['Omicron'] = 0x039F;\n  t['Omicrontonos'] = 0x038C;\n  t['Omonospace'] = 0xFF2F;\n  t['Oneroman'] = 0x2160;\n  t['Oogonek'] = 0x01EA;\n  t['Oogonekmacron'] = 0x01EC;\n  t['Oopen'] = 0x0186;\n  t['Oslash'] = 0x00D8;\n  t['Oslashacute'] = 0x01FE;\n  t['Oslashsmall'] = 0xF7F8;\n  t['Osmall'] = 0xF76F;\n  t['Ostrokeacute'] = 0x01FE;\n  t['Otcyrillic'] = 0x047E;\n  t['Otilde'] = 0x00D5;\n  t['Otildeacute'] = 0x1E4C;\n  t['Otildedieresis'] = 0x1E4E;\n  t['Otildesmall'] = 0xF7F5;\n  t['P'] = 0x0050;\n  t['Pacute'] = 0x1E54;\n  t['Pcircle'] = 0x24C5;\n  t['Pdotaccent'] = 0x1E56;\n  t['Pecyrillic'] = 0x041F;\n  t['Peharmenian'] = 0x054A;\n  t['Pemiddlehookcyrillic'] = 0x04A6;\n  t['Phi'] = 0x03A6;\n  t['Phook'] = 0x01A4;\n  t['Pi'] = 0x03A0;\n  t['Piwrarmenian'] = 0x0553;\n  t['Pmonospace'] = 0xFF30;\n  t['Psi'] = 0x03A8;\n  t['Psicyrillic'] = 0x0470;\n  t['Psmall'] = 0xF770;\n  t['Q'] = 0x0051;\n  t['Qcircle'] = 0x24C6;\n  t['Qmonospace'] = 0xFF31;\n  t['Qsmall'] = 0xF771;\n  t['R'] = 0x0052;\n  t['Raarmenian'] = 0x054C;\n  t['Racute'] = 0x0154;\n  t['Rcaron'] = 0x0158;\n  t['Rcedilla'] = 0x0156;\n  t['Rcircle'] = 0x24C7;\n  t['Rcommaaccent'] = 0x0156;\n  t['Rdblgrave'] = 0x0210;\n  t['Rdotaccent'] = 0x1E58;\n  t['Rdotbelow'] = 0x1E5A;\n  t['Rdotbelowmacron'] = 0x1E5C;\n  t['Reharmenian'] = 0x0550;\n  t['Rfraktur'] = 0x211C;\n  t['Rho'] = 0x03A1;\n  t['Ringsmall'] = 0xF6FC;\n  t['Rinvertedbreve'] = 0x0212;\n  t['Rlinebelow'] = 0x1E5E;\n  t['Rmonospace'] = 0xFF32;\n  t['Rsmall'] = 0xF772;\n  t['Rsmallinverted'] = 0x0281;\n  t['Rsmallinvertedsuperior'] = 0x02B6;\n  t['S'] = 0x0053;\n  t['SF010000'] = 0x250C;\n  t['SF020000'] = 0x2514;\n  t['SF030000'] = 0x2510;\n  t['SF040000'] = 0x2518;\n  t['SF050000'] = 0x253C;\n  t['SF060000'] = 0x252C;\n  t['SF070000'] = 0x2534;\n  t['SF080000'] = 0x251C;\n  t['SF090000'] = 0x2524;\n  t['SF100000'] = 0x2500;\n  t['SF110000'] = 0x2502;\n  t['SF190000'] = 0x2561;\n  t['SF200000'] = 0x2562;\n  t['SF210000'] = 0x2556;\n  t['SF220000'] = 0x2555;\n  t['SF230000'] = 0x2563;\n  t['SF240000'] = 0x2551;\n  t['SF250000'] = 0x2557;\n  t['SF260000'] = 0x255D;\n  t['SF270000'] = 0x255C;\n  t['SF280000'] = 0x255B;\n  t['SF360000'] = 0x255E;\n  t['SF370000'] = 0x255F;\n  t['SF380000'] = 0x255A;\n  t['SF390000'] = 0x2554;\n  t['SF400000'] = 0x2569;\n  t['SF410000'] = 0x2566;\n  t['SF420000'] = 0x2560;\n  t['SF430000'] = 0x2550;\n  t['SF440000'] = 0x256C;\n  t['SF450000'] = 0x2567;\n  t['SF460000'] = 0x2568;\n  t['SF470000'] = 0x2564;\n  t['SF480000'] = 0x2565;\n  t['SF490000'] = 0x2559;\n  t['SF500000'] = 0x2558;\n  t['SF510000'] = 0x2552;\n  t['SF520000'] = 0x2553;\n  t['SF530000'] = 0x256B;\n  t['SF540000'] = 0x256A;\n  t['Sacute'] = 0x015A;\n  t['Sacutedotaccent'] = 0x1E64;\n  t['Sampigreek'] = 0x03E0;\n  t['Scaron'] = 0x0160;\n  t['Scarondotaccent'] = 0x1E66;\n  t['Scaronsmall'] = 0xF6FD;\n  t['Scedilla'] = 0x015E;\n  t['Schwa'] = 0x018F;\n  t['Schwacyrillic'] = 0x04D8;\n  t['Schwadieresiscyrillic'] = 0x04DA;\n  t['Scircle'] = 0x24C8;\n  t['Scircumflex'] = 0x015C;\n  t['Scommaaccent'] = 0x0218;\n  t['Sdotaccent'] = 0x1E60;\n  t['Sdotbelow'] = 0x1E62;\n  t['Sdotbelowdotaccent'] = 0x1E68;\n  t['Seharmenian'] = 0x054D;\n  t['Sevenroman'] = 0x2166;\n  t['Shaarmenian'] = 0x0547;\n  t['Shacyrillic'] = 0x0428;\n  t['Shchacyrillic'] = 0x0429;\n  t['Sheicoptic'] = 0x03E2;\n  t['Shhacyrillic'] = 0x04BA;\n  t['Shimacoptic'] = 0x03EC;\n  t['Sigma'] = 0x03A3;\n  t['Sixroman'] = 0x2165;\n  t['Smonospace'] = 0xFF33;\n  t['Softsigncyrillic'] = 0x042C;\n  t['Ssmall'] = 0xF773;\n  t['Stigmagreek'] = 0x03DA;\n  t['T'] = 0x0054;\n  t['Tau'] = 0x03A4;\n  t['Tbar'] = 0x0166;\n  t['Tcaron'] = 0x0164;\n  t['Tcedilla'] = 0x0162;\n  t['Tcircle'] = 0x24C9;\n  t['Tcircumflexbelow'] = 0x1E70;\n  t['Tcommaaccent'] = 0x0162;\n  t['Tdotaccent'] = 0x1E6A;\n  t['Tdotbelow'] = 0x1E6C;\n  t['Tecyrillic'] = 0x0422;\n  t['Tedescendercyrillic'] = 0x04AC;\n  t['Tenroman'] = 0x2169;\n  t['Tetsecyrillic'] = 0x04B4;\n  t['Theta'] = 0x0398;\n  t['Thook'] = 0x01AC;\n  t['Thorn'] = 0x00DE;\n  t['Thornsmall'] = 0xF7FE;\n  t['Threeroman'] = 0x2162;\n  t['Tildesmall'] = 0xF6FE;\n  t['Tiwnarmenian'] = 0x054F;\n  t['Tlinebelow'] = 0x1E6E;\n  t['Tmonospace'] = 0xFF34;\n  t['Toarmenian'] = 0x0539;\n  t['Tonefive'] = 0x01BC;\n  t['Tonesix'] = 0x0184;\n  t['Tonetwo'] = 0x01A7;\n  t['Tretroflexhook'] = 0x01AE;\n  t['Tsecyrillic'] = 0x0426;\n  t['Tshecyrillic'] = 0x040B;\n  t['Tsmall'] = 0xF774;\n  t['Twelveroman'] = 0x216B;\n  t['Tworoman'] = 0x2161;\n  t['U'] = 0x0055;\n  t['Uacute'] = 0x00DA;\n  t['Uacutesmall'] = 0xF7FA;\n  t['Ubreve'] = 0x016C;\n  t['Ucaron'] = 0x01D3;\n  t['Ucircle'] = 0x24CA;\n  t['Ucircumflex'] = 0x00DB;\n  t['Ucircumflexbelow'] = 0x1E76;\n  t['Ucircumflexsmall'] = 0xF7FB;\n  t['Ucyrillic'] = 0x0423;\n  t['Udblacute'] = 0x0170;\n  t['Udblgrave'] = 0x0214;\n  t['Udieresis'] = 0x00DC;\n  t['Udieresisacute'] = 0x01D7;\n  t['Udieresisbelow'] = 0x1E72;\n  t['Udieresiscaron'] = 0x01D9;\n  t['Udieresiscyrillic'] = 0x04F0;\n  t['Udieresisgrave'] = 0x01DB;\n  t['Udieresismacron'] = 0x01D5;\n  t['Udieresissmall'] = 0xF7FC;\n  t['Udotbelow'] = 0x1EE4;\n  t['Ugrave'] = 0x00D9;\n  t['Ugravesmall'] = 0xF7F9;\n  t['Uhookabove'] = 0x1EE6;\n  t['Uhorn'] = 0x01AF;\n  t['Uhornacute'] = 0x1EE8;\n  t['Uhorndotbelow'] = 0x1EF0;\n  t['Uhorngrave'] = 0x1EEA;\n  t['Uhornhookabove'] = 0x1EEC;\n  t['Uhorntilde'] = 0x1EEE;\n  t['Uhungarumlaut'] = 0x0170;\n  t['Uhungarumlautcyrillic'] = 0x04F2;\n  t['Uinvertedbreve'] = 0x0216;\n  t['Ukcyrillic'] = 0x0478;\n  t['Umacron'] = 0x016A;\n  t['Umacroncyrillic'] = 0x04EE;\n  t['Umacrondieresis'] = 0x1E7A;\n  t['Umonospace'] = 0xFF35;\n  t['Uogonek'] = 0x0172;\n  t['Upsilon'] = 0x03A5;\n  t['Upsilon1'] = 0x03D2;\n  t['Upsilonacutehooksymbolgreek'] = 0x03D3;\n  t['Upsilonafrican'] = 0x01B1;\n  t['Upsilondieresis'] = 0x03AB;\n  t['Upsilondieresishooksymbolgreek'] = 0x03D4;\n  t['Upsilonhooksymbol'] = 0x03D2;\n  t['Upsilontonos'] = 0x038E;\n  t['Uring'] = 0x016E;\n  t['Ushortcyrillic'] = 0x040E;\n  t['Usmall'] = 0xF775;\n  t['Ustraightcyrillic'] = 0x04AE;\n  t['Ustraightstrokecyrillic'] = 0x04B0;\n  t['Utilde'] = 0x0168;\n  t['Utildeacute'] = 0x1E78;\n  t['Utildebelow'] = 0x1E74;\n  t['V'] = 0x0056;\n  t['Vcircle'] = 0x24CB;\n  t['Vdotbelow'] = 0x1E7E;\n  t['Vecyrillic'] = 0x0412;\n  t['Vewarmenian'] = 0x054E;\n  t['Vhook'] = 0x01B2;\n  t['Vmonospace'] = 0xFF36;\n  t['Voarmenian'] = 0x0548;\n  t['Vsmall'] = 0xF776;\n  t['Vtilde'] = 0x1E7C;\n  t['W'] = 0x0057;\n  t['Wacute'] = 0x1E82;\n  t['Wcircle'] = 0x24CC;\n  t['Wcircumflex'] = 0x0174;\n  t['Wdieresis'] = 0x1E84;\n  t['Wdotaccent'] = 0x1E86;\n  t['Wdotbelow'] = 0x1E88;\n  t['Wgrave'] = 0x1E80;\n  t['Wmonospace'] = 0xFF37;\n  t['Wsmall'] = 0xF777;\n  t['X'] = 0x0058;\n  t['Xcircle'] = 0x24CD;\n  t['Xdieresis'] = 0x1E8C;\n  t['Xdotaccent'] = 0x1E8A;\n  t['Xeharmenian'] = 0x053D;\n  t['Xi'] = 0x039E;\n  t['Xmonospace'] = 0xFF38;\n  t['Xsmall'] = 0xF778;\n  t['Y'] = 0x0059;\n  t['Yacute'] = 0x00DD;\n  t['Yacutesmall'] = 0xF7FD;\n  t['Yatcyrillic'] = 0x0462;\n  t['Ycircle'] = 0x24CE;\n  t['Ycircumflex'] = 0x0176;\n  t['Ydieresis'] = 0x0178;\n  t['Ydieresissmall'] = 0xF7FF;\n  t['Ydotaccent'] = 0x1E8E;\n  t['Ydotbelow'] = 0x1EF4;\n  t['Yericyrillic'] = 0x042B;\n  t['Yerudieresiscyrillic'] = 0x04F8;\n  t['Ygrave'] = 0x1EF2;\n  t['Yhook'] = 0x01B3;\n  t['Yhookabove'] = 0x1EF6;\n  t['Yiarmenian'] = 0x0545;\n  t['Yicyrillic'] = 0x0407;\n  t['Yiwnarmenian'] = 0x0552;\n  t['Ymonospace'] = 0xFF39;\n  t['Ysmall'] = 0xF779;\n  t['Ytilde'] = 0x1EF8;\n  t['Yusbigcyrillic'] = 0x046A;\n  t['Yusbigiotifiedcyrillic'] = 0x046C;\n  t['Yuslittlecyrillic'] = 0x0466;\n  t['Yuslittleiotifiedcyrillic'] = 0x0468;\n  t['Z'] = 0x005A;\n  t['Zaarmenian'] = 0x0536;\n  t['Zacute'] = 0x0179;\n  t['Zcaron'] = 0x017D;\n  t['Zcaronsmall'] = 0xF6FF;\n  t['Zcircle'] = 0x24CF;\n  t['Zcircumflex'] = 0x1E90;\n  t['Zdot'] = 0x017B;\n  t['Zdotaccent'] = 0x017B;\n  t['Zdotbelow'] = 0x1E92;\n  t['Zecyrillic'] = 0x0417;\n  t['Zedescendercyrillic'] = 0x0498;\n  t['Zedieresiscyrillic'] = 0x04DE;\n  t['Zeta'] = 0x0396;\n  t['Zhearmenian'] = 0x053A;\n  t['Zhebrevecyrillic'] = 0x04C1;\n  t['Zhecyrillic'] = 0x0416;\n  t['Zhedescendercyrillic'] = 0x0496;\n  t['Zhedieresiscyrillic'] = 0x04DC;\n  t['Zlinebelow'] = 0x1E94;\n  t['Zmonospace'] = 0xFF3A;\n  t['Zsmall'] = 0xF77A;\n  t['Zstroke'] = 0x01B5;\n  t['a'] = 0x0061;\n  t['aabengali'] = 0x0986;\n  t['aacute'] = 0x00E1;\n  t['aadeva'] = 0x0906;\n  t['aagujarati'] = 0x0A86;\n  t['aagurmukhi'] = 0x0A06;\n  t['aamatragurmukhi'] = 0x0A3E;\n  t['aarusquare'] = 0x3303;\n  t['aavowelsignbengali'] = 0x09BE;\n  t['aavowelsigndeva'] = 0x093E;\n  t['aavowelsigngujarati'] = 0x0ABE;\n  t['abbreviationmarkarmenian'] = 0x055F;\n  t['abbreviationsigndeva'] = 0x0970;\n  t['abengali'] = 0x0985;\n  t['abopomofo'] = 0x311A;\n  t['abreve'] = 0x0103;\n  t['abreveacute'] = 0x1EAF;\n  t['abrevecyrillic'] = 0x04D1;\n  t['abrevedotbelow'] = 0x1EB7;\n  t['abrevegrave'] = 0x1EB1;\n  t['abrevehookabove'] = 0x1EB3;\n  t['abrevetilde'] = 0x1EB5;\n  t['acaron'] = 0x01CE;\n  t['acircle'] = 0x24D0;\n  t['acircumflex'] = 0x00E2;\n  t['acircumflexacute'] = 0x1EA5;\n  t['acircumflexdotbelow'] = 0x1EAD;\n  t['acircumflexgrave'] = 0x1EA7;\n  t['acircumflexhookabove'] = 0x1EA9;\n  t['acircumflextilde'] = 0x1EAB;\n  t['acute'] = 0x00B4;\n  t['acutebelowcmb'] = 0x0317;\n  t['acutecmb'] = 0x0301;\n  t['acutecomb'] = 0x0301;\n  t['acutedeva'] = 0x0954;\n  t['acutelowmod'] = 0x02CF;\n  t['acutetonecmb'] = 0x0341;\n  t['acyrillic'] = 0x0430;\n  t['adblgrave'] = 0x0201;\n  t['addakgurmukhi'] = 0x0A71;\n  t['adeva'] = 0x0905;\n  t['adieresis'] = 0x00E4;\n  t['adieresiscyrillic'] = 0x04D3;\n  t['adieresismacron'] = 0x01DF;\n  t['adotbelow'] = 0x1EA1;\n  t['adotmacron'] = 0x01E1;\n  t['ae'] = 0x00E6;\n  t['aeacute'] = 0x01FD;\n  t['aekorean'] = 0x3150;\n  t['aemacron'] = 0x01E3;\n  t['afii00208'] = 0x2015;\n  t['afii08941'] = 0x20A4;\n  t['afii10017'] = 0x0410;\n  t['afii10018'] = 0x0411;\n  t['afii10019'] = 0x0412;\n  t['afii10020'] = 0x0413;\n  t['afii10021'] = 0x0414;\n  t['afii10022'] = 0x0415;\n  t['afii10023'] = 0x0401;\n  t['afii10024'] = 0x0416;\n  t['afii10025'] = 0x0417;\n  t['afii10026'] = 0x0418;\n  t['afii10027'] = 0x0419;\n  t['afii10028'] = 0x041A;\n  t['afii10029'] = 0x041B;\n  t['afii10030'] = 0x041C;\n  t['afii10031'] = 0x041D;\n  t['afii10032'] = 0x041E;\n  t['afii10033'] = 0x041F;\n  t['afii10034'] = 0x0420;\n  t['afii10035'] = 0x0421;\n  t['afii10036'] = 0x0422;\n  t['afii10037'] = 0x0423;\n  t['afii10038'] = 0x0424;\n  t['afii10039'] = 0x0425;\n  t['afii10040'] = 0x0426;\n  t['afii10041'] = 0x0427;\n  t['afii10042'] = 0x0428;\n  t['afii10043'] = 0x0429;\n  t['afii10044'] = 0x042A;\n  t['afii10045'] = 0x042B;\n  t['afii10046'] = 0x042C;\n  t['afii10047'] = 0x042D;\n  t['afii10048'] = 0x042E;\n  t['afii10049'] = 0x042F;\n  t['afii10050'] = 0x0490;\n  t['afii10051'] = 0x0402;\n  t['afii10052'] = 0x0403;\n  t['afii10053'] = 0x0404;\n  t['afii10054'] = 0x0405;\n  t['afii10055'] = 0x0406;\n  t['afii10056'] = 0x0407;\n  t['afii10057'] = 0x0408;\n  t['afii10058'] = 0x0409;\n  t['afii10059'] = 0x040A;\n  t['afii10060'] = 0x040B;\n  t['afii10061'] = 0x040C;\n  t['afii10062'] = 0x040E;\n  t['afii10063'] = 0xF6C4;\n  t['afii10064'] = 0xF6C5;\n  t['afii10065'] = 0x0430;\n  t['afii10066'] = 0x0431;\n  t['afii10067'] = 0x0432;\n  t['afii10068'] = 0x0433;\n  t['afii10069'] = 0x0434;\n  t['afii10070'] = 0x0435;\n  t['afii10071'] = 0x0451;\n  t['afii10072'] = 0x0436;\n  t['afii10073'] = 0x0437;\n  t['afii10074'] = 0x0438;\n  t['afii10075'] = 0x0439;\n  t['afii10076'] = 0x043A;\n  t['afii10077'] = 0x043B;\n  t['afii10078'] = 0x043C;\n  t['afii10079'] = 0x043D;\n  t['afii10080'] = 0x043E;\n  t['afii10081'] = 0x043F;\n  t['afii10082'] = 0x0440;\n  t['afii10083'] = 0x0441;\n  t['afii10084'] = 0x0442;\n  t['afii10085'] = 0x0443;\n  t['afii10086'] = 0x0444;\n  t['afii10087'] = 0x0445;\n  t['afii10088'] = 0x0446;\n  t['afii10089'] = 0x0447;\n  t['afii10090'] = 0x0448;\n  t['afii10091'] = 0x0449;\n  t['afii10092'] = 0x044A;\n  t['afii10093'] = 0x044B;\n  t['afii10094'] = 0x044C;\n  t['afii10095'] = 0x044D;\n  t['afii10096'] = 0x044E;\n  t['afii10097'] = 0x044F;\n  t['afii10098'] = 0x0491;\n  t['afii10099'] = 0x0452;\n  t['afii10100'] = 0x0453;\n  t['afii10101'] = 0x0454;\n  t['afii10102'] = 0x0455;\n  t['afii10103'] = 0x0456;\n  t['afii10104'] = 0x0457;\n  t['afii10105'] = 0x0458;\n  t['afii10106'] = 0x0459;\n  t['afii10107'] = 0x045A;\n  t['afii10108'] = 0x045B;\n  t['afii10109'] = 0x045C;\n  t['afii10110'] = 0x045E;\n  t['afii10145'] = 0x040F;\n  t['afii10146'] = 0x0462;\n  t['afii10147'] = 0x0472;\n  t['afii10148'] = 0x0474;\n  t['afii10192'] = 0xF6C6;\n  t['afii10193'] = 0x045F;\n  t['afii10194'] = 0x0463;\n  t['afii10195'] = 0x0473;\n  t['afii10196'] = 0x0475;\n  t['afii10831'] = 0xF6C7;\n  t['afii10832'] = 0xF6C8;\n  t['afii10846'] = 0x04D9;\n  t['afii299'] = 0x200E;\n  t['afii300'] = 0x200F;\n  t['afii301'] = 0x200D;\n  t['afii57381'] = 0x066A;\n  t['afii57388'] = 0x060C;\n  t['afii57392'] = 0x0660;\n  t['afii57393'] = 0x0661;\n  t['afii57394'] = 0x0662;\n  t['afii57395'] = 0x0663;\n  t['afii57396'] = 0x0664;\n  t['afii57397'] = 0x0665;\n  t['afii57398'] = 0x0666;\n  t['afii57399'] = 0x0667;\n  t['afii57400'] = 0x0668;\n  t['afii57401'] = 0x0669;\n  t['afii57403'] = 0x061B;\n  t['afii57407'] = 0x061F;\n  t['afii57409'] = 0x0621;\n  t['afii57410'] = 0x0622;\n  t['afii57411'] = 0x0623;\n  t['afii57412'] = 0x0624;\n  t['afii57413'] = 0x0625;\n  t['afii57414'] = 0x0626;\n  t['afii57415'] = 0x0627;\n  t['afii57416'] = 0x0628;\n  t['afii57417'] = 0x0629;\n  t['afii57418'] = 0x062A;\n  t['afii57419'] = 0x062B;\n  t['afii57420'] = 0x062C;\n  t['afii57421'] = 0x062D;\n  t['afii57422'] = 0x062E;\n  t['afii57423'] = 0x062F;\n  t['afii57424'] = 0x0630;\n  t['afii57425'] = 0x0631;\n  t['afii57426'] = 0x0632;\n  t['afii57427'] = 0x0633;\n  t['afii57428'] = 0x0634;\n  t['afii57429'] = 0x0635;\n  t['afii57430'] = 0x0636;\n  t['afii57431'] = 0x0637;\n  t['afii57432'] = 0x0638;\n  t['afii57433'] = 0x0639;\n  t['afii57434'] = 0x063A;\n  t['afii57440'] = 0x0640;\n  t['afii57441'] = 0x0641;\n  t['afii57442'] = 0x0642;\n  t['afii57443'] = 0x0643;\n  t['afii57444'] = 0x0644;\n  t['afii57445'] = 0x0645;\n  t['afii57446'] = 0x0646;\n  t['afii57448'] = 0x0648;\n  t['afii57449'] = 0x0649;\n  t['afii57450'] = 0x064A;\n  t['afii57451'] = 0x064B;\n  t['afii57452'] = 0x064C;\n  t['afii57453'] = 0x064D;\n  t['afii57454'] = 0x064E;\n  t['afii57455'] = 0x064F;\n  t['afii57456'] = 0x0650;\n  t['afii57457'] = 0x0651;\n  t['afii57458'] = 0x0652;\n  t['afii57470'] = 0x0647;\n  t['afii57505'] = 0x06A4;\n  t['afii57506'] = 0x067E;\n  t['afii57507'] = 0x0686;\n  t['afii57508'] = 0x0698;\n  t['afii57509'] = 0x06AF;\n  t['afii57511'] = 0x0679;\n  t['afii57512'] = 0x0688;\n  t['afii57513'] = 0x0691;\n  t['afii57514'] = 0x06BA;\n  t['afii57519'] = 0x06D2;\n  t['afii57534'] = 0x06D5;\n  t['afii57636'] = 0x20AA;\n  t['afii57645'] = 0x05BE;\n  t['afii57658'] = 0x05C3;\n  t['afii57664'] = 0x05D0;\n  t['afii57665'] = 0x05D1;\n  t['afii57666'] = 0x05D2;\n  t['afii57667'] = 0x05D3;\n  t['afii57668'] = 0x05D4;\n  t['afii57669'] = 0x05D5;\n  t['afii57670'] = 0x05D6;\n  t['afii57671'] = 0x05D7;\n  t['afii57672'] = 0x05D8;\n  t['afii57673'] = 0x05D9;\n  t['afii57674'] = 0x05DA;\n  t['afii57675'] = 0x05DB;\n  t['afii57676'] = 0x05DC;\n  t['afii57677'] = 0x05DD;\n  t['afii57678'] = 0x05DE;\n  t['afii57679'] = 0x05DF;\n  t['afii57680'] = 0x05E0;\n  t['afii57681'] = 0x05E1;\n  t['afii57682'] = 0x05E2;\n  t['afii57683'] = 0x05E3;\n  t['afii57684'] = 0x05E4;\n  t['afii57685'] = 0x05E5;\n  t['afii57686'] = 0x05E6;\n  t['afii57687'] = 0x05E7;\n  t['afii57688'] = 0x05E8;\n  t['afii57689'] = 0x05E9;\n  t['afii57690'] = 0x05EA;\n  t['afii57694'] = 0xFB2A;\n  t['afii57695'] = 0xFB2B;\n  t['afii57700'] = 0xFB4B;\n  t['afii57705'] = 0xFB1F;\n  t['afii57716'] = 0x05F0;\n  t['afii57717'] = 0x05F1;\n  t['afii57718'] = 0x05F2;\n  t['afii57723'] = 0xFB35;\n  t['afii57793'] = 0x05B4;\n  t['afii57794'] = 0x05B5;\n  t['afii57795'] = 0x05B6;\n  t['afii57796'] = 0x05BB;\n  t['afii57797'] = 0x05B8;\n  t['afii57798'] = 0x05B7;\n  t['afii57799'] = 0x05B0;\n  t['afii57800'] = 0x05B2;\n  t['afii57801'] = 0x05B1;\n  t['afii57802'] = 0x05B3;\n  t['afii57803'] = 0x05C2;\n  t['afii57804'] = 0x05C1;\n  t['afii57806'] = 0x05B9;\n  t['afii57807'] = 0x05BC;\n  t['afii57839'] = 0x05BD;\n  t['afii57841'] = 0x05BF;\n  t['afii57842'] = 0x05C0;\n  t['afii57929'] = 0x02BC;\n  t['afii61248'] = 0x2105;\n  t['afii61289'] = 0x2113;\n  t['afii61352'] = 0x2116;\n  t['afii61573'] = 0x202C;\n  t['afii61574'] = 0x202D;\n  t['afii61575'] = 0x202E;\n  t['afii61664'] = 0x200C;\n  t['afii63167'] = 0x066D;\n  t['afii64937'] = 0x02BD;\n  t['agrave'] = 0x00E0;\n  t['agujarati'] = 0x0A85;\n  t['agurmukhi'] = 0x0A05;\n  t['ahiragana'] = 0x3042;\n  t['ahookabove'] = 0x1EA3;\n  t['aibengali'] = 0x0990;\n  t['aibopomofo'] = 0x311E;\n  t['aideva'] = 0x0910;\n  t['aiecyrillic'] = 0x04D5;\n  t['aigujarati'] = 0x0A90;\n  t['aigurmukhi'] = 0x0A10;\n  t['aimatragurmukhi'] = 0x0A48;\n  t['ainarabic'] = 0x0639;\n  t['ainfinalarabic'] = 0xFECA;\n  t['aininitialarabic'] = 0xFECB;\n  t['ainmedialarabic'] = 0xFECC;\n  t['ainvertedbreve'] = 0x0203;\n  t['aivowelsignbengali'] = 0x09C8;\n  t['aivowelsigndeva'] = 0x0948;\n  t['aivowelsigngujarati'] = 0x0AC8;\n  t['akatakana'] = 0x30A2;\n  t['akatakanahalfwidth'] = 0xFF71;\n  t['akorean'] = 0x314F;\n  t['alef'] = 0x05D0;\n  t['alefarabic'] = 0x0627;\n  t['alefdageshhebrew'] = 0xFB30;\n  t['aleffinalarabic'] = 0xFE8E;\n  t['alefhamzaabovearabic'] = 0x0623;\n  t['alefhamzaabovefinalarabic'] = 0xFE84;\n  t['alefhamzabelowarabic'] = 0x0625;\n  t['alefhamzabelowfinalarabic'] = 0xFE88;\n  t['alefhebrew'] = 0x05D0;\n  t['aleflamedhebrew'] = 0xFB4F;\n  t['alefmaddaabovearabic'] = 0x0622;\n  t['alefmaddaabovefinalarabic'] = 0xFE82;\n  t['alefmaksuraarabic'] = 0x0649;\n  t['alefmaksurafinalarabic'] = 0xFEF0;\n  t['alefmaksurainitialarabic'] = 0xFEF3;\n  t['alefmaksuramedialarabic'] = 0xFEF4;\n  t['alefpatahhebrew'] = 0xFB2E;\n  t['alefqamatshebrew'] = 0xFB2F;\n  t['aleph'] = 0x2135;\n  t['allequal'] = 0x224C;\n  t['alpha'] = 0x03B1;\n  t['alphatonos'] = 0x03AC;\n  t['amacron'] = 0x0101;\n  t['amonospace'] = 0xFF41;\n  t['ampersand'] = 0x0026;\n  t['ampersandmonospace'] = 0xFF06;\n  t['ampersandsmall'] = 0xF726;\n  t['amsquare'] = 0x33C2;\n  t['anbopomofo'] = 0x3122;\n  t['angbopomofo'] = 0x3124;\n  t['angbracketleft'] = 0x3008; // Glyph is missing from Adobe's original list.\n  t['angbracketright'] = 0x3009; // Glyph is missing from Adobe's original list.\n  t['angkhankhuthai'] = 0x0E5A;\n  t['angle'] = 0x2220;\n  t['anglebracketleft'] = 0x3008;\n  t['anglebracketleftvertical'] = 0xFE3F;\n  t['anglebracketright'] = 0x3009;\n  t['anglebracketrightvertical'] = 0xFE40;\n  t['angleleft'] = 0x2329;\n  t['angleright'] = 0x232A;\n  t['angstrom'] = 0x212B;\n  t['anoteleia'] = 0x0387;\n  t['anudattadeva'] = 0x0952;\n  t['anusvarabengali'] = 0x0982;\n  t['anusvaradeva'] = 0x0902;\n  t['anusvaragujarati'] = 0x0A82;\n  t['aogonek'] = 0x0105;\n  t['apaatosquare'] = 0x3300;\n  t['aparen'] = 0x249C;\n  t['apostrophearmenian'] = 0x055A;\n  t['apostrophemod'] = 0x02BC;\n  t['apple'] = 0xF8FF;\n  t['approaches'] = 0x2250;\n  t['approxequal'] = 0x2248;\n  t['approxequalorimage'] = 0x2252;\n  t['approximatelyequal'] = 0x2245;\n  t['araeaekorean'] = 0x318E;\n  t['araeakorean'] = 0x318D;\n  t['arc'] = 0x2312;\n  t['arighthalfring'] = 0x1E9A;\n  t['aring'] = 0x00E5;\n  t['aringacute'] = 0x01FB;\n  t['aringbelow'] = 0x1E01;\n  t['arrowboth'] = 0x2194;\n  t['arrowdashdown'] = 0x21E3;\n  t['arrowdashleft'] = 0x21E0;\n  t['arrowdashright'] = 0x21E2;\n  t['arrowdashup'] = 0x21E1;\n  t['arrowdblboth'] = 0x21D4;\n  t['arrowdbldown'] = 0x21D3;\n  t['arrowdblleft'] = 0x21D0;\n  t['arrowdblright'] = 0x21D2;\n  t['arrowdblup'] = 0x21D1;\n  t['arrowdown'] = 0x2193;\n  t['arrowdownleft'] = 0x2199;\n  t['arrowdownright'] = 0x2198;\n  t['arrowdownwhite'] = 0x21E9;\n  t['arrowheaddownmod'] = 0x02C5;\n  t['arrowheadleftmod'] = 0x02C2;\n  t['arrowheadrightmod'] = 0x02C3;\n  t['arrowheadupmod'] = 0x02C4;\n  t['arrowhorizex'] = 0xF8E7;\n  t['arrowleft'] = 0x2190;\n  t['arrowleftdbl'] = 0x21D0;\n  t['arrowleftdblstroke'] = 0x21CD;\n  t['arrowleftoverright'] = 0x21C6;\n  t['arrowleftwhite'] = 0x21E6;\n  t['arrowright'] = 0x2192;\n  t['arrowrightdblstroke'] = 0x21CF;\n  t['arrowrightheavy'] = 0x279E;\n  t['arrowrightoverleft'] = 0x21C4;\n  t['arrowrightwhite'] = 0x21E8;\n  t['arrowtableft'] = 0x21E4;\n  t['arrowtabright'] = 0x21E5;\n  t['arrowup'] = 0x2191;\n  t['arrowupdn'] = 0x2195;\n  t['arrowupdnbse'] = 0x21A8;\n  t['arrowupdownbase'] = 0x21A8;\n  t['arrowupleft'] = 0x2196;\n  t['arrowupleftofdown'] = 0x21C5;\n  t['arrowupright'] = 0x2197;\n  t['arrowupwhite'] = 0x21E7;\n  t['arrowvertex'] = 0xF8E6;\n  t['asciicircum'] = 0x005E;\n  t['asciicircummonospace'] = 0xFF3E;\n  t['asciitilde'] = 0x007E;\n  t['asciitildemonospace'] = 0xFF5E;\n  t['ascript'] = 0x0251;\n  t['ascriptturned'] = 0x0252;\n  t['asmallhiragana'] = 0x3041;\n  t['asmallkatakana'] = 0x30A1;\n  t['asmallkatakanahalfwidth'] = 0xFF67;\n  t['asterisk'] = 0x002A;\n  t['asteriskaltonearabic'] = 0x066D;\n  t['asteriskarabic'] = 0x066D;\n  t['asteriskmath'] = 0x2217;\n  t['asteriskmonospace'] = 0xFF0A;\n  t['asterisksmall'] = 0xFE61;\n  t['asterism'] = 0x2042;\n  t['asuperior'] = 0xF6E9;\n  t['asymptoticallyequal'] = 0x2243;\n  t['at'] = 0x0040;\n  t['atilde'] = 0x00E3;\n  t['atmonospace'] = 0xFF20;\n  t['atsmall'] = 0xFE6B;\n  t['aturned'] = 0x0250;\n  t['aubengali'] = 0x0994;\n  t['aubopomofo'] = 0x3120;\n  t['audeva'] = 0x0914;\n  t['augujarati'] = 0x0A94;\n  t['augurmukhi'] = 0x0A14;\n  t['aulengthmarkbengali'] = 0x09D7;\n  t['aumatragurmukhi'] = 0x0A4C;\n  t['auvowelsignbengali'] = 0x09CC;\n  t['auvowelsigndeva'] = 0x094C;\n  t['auvowelsigngujarati'] = 0x0ACC;\n  t['avagrahadeva'] = 0x093D;\n  t['aybarmenian'] = 0x0561;\n  t['ayin'] = 0x05E2;\n  t['ayinaltonehebrew'] = 0xFB20;\n  t['ayinhebrew'] = 0x05E2;\n  t['b'] = 0x0062;\n  t['babengali'] = 0x09AC;\n  t['backslash'] = 0x005C;\n  t['backslashmonospace'] = 0xFF3C;\n  t['badeva'] = 0x092C;\n  t['bagujarati'] = 0x0AAC;\n  t['bagurmukhi'] = 0x0A2C;\n  t['bahiragana'] = 0x3070;\n  t['bahtthai'] = 0x0E3F;\n  t['bakatakana'] = 0x30D0;\n  t['bar'] = 0x007C;\n  t['barmonospace'] = 0xFF5C;\n  t['bbopomofo'] = 0x3105;\n  t['bcircle'] = 0x24D1;\n  t['bdotaccent'] = 0x1E03;\n  t['bdotbelow'] = 0x1E05;\n  t['beamedsixteenthnotes'] = 0x266C;\n  t['because'] = 0x2235;\n  t['becyrillic'] = 0x0431;\n  t['beharabic'] = 0x0628;\n  t['behfinalarabic'] = 0xFE90;\n  t['behinitialarabic'] = 0xFE91;\n  t['behiragana'] = 0x3079;\n  t['behmedialarabic'] = 0xFE92;\n  t['behmeeminitialarabic'] = 0xFC9F;\n  t['behmeemisolatedarabic'] = 0xFC08;\n  t['behnoonfinalarabic'] = 0xFC6D;\n  t['bekatakana'] = 0x30D9;\n  t['benarmenian'] = 0x0562;\n  t['bet'] = 0x05D1;\n  t['beta'] = 0x03B2;\n  t['betasymbolgreek'] = 0x03D0;\n  t['betdagesh'] = 0xFB31;\n  t['betdageshhebrew'] = 0xFB31;\n  t['bethebrew'] = 0x05D1;\n  t['betrafehebrew'] = 0xFB4C;\n  t['bhabengali'] = 0x09AD;\n  t['bhadeva'] = 0x092D;\n  t['bhagujarati'] = 0x0AAD;\n  t['bhagurmukhi'] = 0x0A2D;\n  t['bhook'] = 0x0253;\n  t['bihiragana'] = 0x3073;\n  t['bikatakana'] = 0x30D3;\n  t['bilabialclick'] = 0x0298;\n  t['bindigurmukhi'] = 0x0A02;\n  t['birusquare'] = 0x3331;\n  t['blackcircle'] = 0x25CF;\n  t['blackdiamond'] = 0x25C6;\n  t['blackdownpointingtriangle'] = 0x25BC;\n  t['blackleftpointingpointer'] = 0x25C4;\n  t['blackleftpointingtriangle'] = 0x25C0;\n  t['blacklenticularbracketleft'] = 0x3010;\n  t['blacklenticularbracketleftvertical'] = 0xFE3B;\n  t['blacklenticularbracketright'] = 0x3011;\n  t['blacklenticularbracketrightvertical'] = 0xFE3C;\n  t['blacklowerlefttriangle'] = 0x25E3;\n  t['blacklowerrighttriangle'] = 0x25E2;\n  t['blackrectangle'] = 0x25AC;\n  t['blackrightpointingpointer'] = 0x25BA;\n  t['blackrightpointingtriangle'] = 0x25B6;\n  t['blacksmallsquare'] = 0x25AA;\n  t['blacksmilingface'] = 0x263B;\n  t['blacksquare'] = 0x25A0;\n  t['blackstar'] = 0x2605;\n  t['blackupperlefttriangle'] = 0x25E4;\n  t['blackupperrighttriangle'] = 0x25E5;\n  t['blackuppointingsmalltriangle'] = 0x25B4;\n  t['blackuppointingtriangle'] = 0x25B2;\n  t['blank'] = 0x2423;\n  t['blinebelow'] = 0x1E07;\n  t['block'] = 0x2588;\n  t['bmonospace'] = 0xFF42;\n  t['bobaimaithai'] = 0x0E1A;\n  t['bohiragana'] = 0x307C;\n  t['bokatakana'] = 0x30DC;\n  t['bparen'] = 0x249D;\n  t['bqsquare'] = 0x33C3;\n  t['braceex'] = 0xF8F4;\n  t['braceleft'] = 0x007B;\n  t['braceleftbt'] = 0xF8F3;\n  t['braceleftmid'] = 0xF8F2;\n  t['braceleftmonospace'] = 0xFF5B;\n  t['braceleftsmall'] = 0xFE5B;\n  t['bracelefttp'] = 0xF8F1;\n  t['braceleftvertical'] = 0xFE37;\n  t['braceright'] = 0x007D;\n  t['bracerightbt'] = 0xF8FE;\n  t['bracerightmid'] = 0xF8FD;\n  t['bracerightmonospace'] = 0xFF5D;\n  t['bracerightsmall'] = 0xFE5C;\n  t['bracerighttp'] = 0xF8FC;\n  t['bracerightvertical'] = 0xFE38;\n  t['bracketleft'] = 0x005B;\n  t['bracketleftbt'] = 0xF8F0;\n  t['bracketleftex'] = 0xF8EF;\n  t['bracketleftmonospace'] = 0xFF3B;\n  t['bracketlefttp'] = 0xF8EE;\n  t['bracketright'] = 0x005D;\n  t['bracketrightbt'] = 0xF8FB;\n  t['bracketrightex'] = 0xF8FA;\n  t['bracketrightmonospace'] = 0xFF3D;\n  t['bracketrighttp'] = 0xF8F9;\n  t['breve'] = 0x02D8;\n  t['brevebelowcmb'] = 0x032E;\n  t['brevecmb'] = 0x0306;\n  t['breveinvertedbelowcmb'] = 0x032F;\n  t['breveinvertedcmb'] = 0x0311;\n  t['breveinverteddoublecmb'] = 0x0361;\n  t['bridgebelowcmb'] = 0x032A;\n  t['bridgeinvertedbelowcmb'] = 0x033A;\n  t['brokenbar'] = 0x00A6;\n  t['bstroke'] = 0x0180;\n  t['bsuperior'] = 0xF6EA;\n  t['btopbar'] = 0x0183;\n  t['buhiragana'] = 0x3076;\n  t['bukatakana'] = 0x30D6;\n  t['bullet'] = 0x2022;\n  t['bulletinverse'] = 0x25D8;\n  t['bulletoperator'] = 0x2219;\n  t['bullseye'] = 0x25CE;\n  t['c'] = 0x0063;\n  t['caarmenian'] = 0x056E;\n  t['cabengali'] = 0x099A;\n  t['cacute'] = 0x0107;\n  t['cadeva'] = 0x091A;\n  t['cagujarati'] = 0x0A9A;\n  t['cagurmukhi'] = 0x0A1A;\n  t['calsquare'] = 0x3388;\n  t['candrabindubengali'] = 0x0981;\n  t['candrabinducmb'] = 0x0310;\n  t['candrabindudeva'] = 0x0901;\n  t['candrabindugujarati'] = 0x0A81;\n  t['capslock'] = 0x21EA;\n  t['careof'] = 0x2105;\n  t['caron'] = 0x02C7;\n  t['caronbelowcmb'] = 0x032C;\n  t['caroncmb'] = 0x030C;\n  t['carriagereturn'] = 0x21B5;\n  t['cbopomofo'] = 0x3118;\n  t['ccaron'] = 0x010D;\n  t['ccedilla'] = 0x00E7;\n  t['ccedillaacute'] = 0x1E09;\n  t['ccircle'] = 0x24D2;\n  t['ccircumflex'] = 0x0109;\n  t['ccurl'] = 0x0255;\n  t['cdot'] = 0x010B;\n  t['cdotaccent'] = 0x010B;\n  t['cdsquare'] = 0x33C5;\n  t['cedilla'] = 0x00B8;\n  t['cedillacmb'] = 0x0327;\n  t['cent'] = 0x00A2;\n  t['centigrade'] = 0x2103;\n  t['centinferior'] = 0xF6DF;\n  t['centmonospace'] = 0xFFE0;\n  t['centoldstyle'] = 0xF7A2;\n  t['centsuperior'] = 0xF6E0;\n  t['chaarmenian'] = 0x0579;\n  t['chabengali'] = 0x099B;\n  t['chadeva'] = 0x091B;\n  t['chagujarati'] = 0x0A9B;\n  t['chagurmukhi'] = 0x0A1B;\n  t['chbopomofo'] = 0x3114;\n  t['cheabkhasiancyrillic'] = 0x04BD;\n  t['checkmark'] = 0x2713;\n  t['checyrillic'] = 0x0447;\n  t['chedescenderabkhasiancyrillic'] = 0x04BF;\n  t['chedescendercyrillic'] = 0x04B7;\n  t['chedieresiscyrillic'] = 0x04F5;\n  t['cheharmenian'] = 0x0573;\n  t['chekhakassiancyrillic'] = 0x04CC;\n  t['cheverticalstrokecyrillic'] = 0x04B9;\n  t['chi'] = 0x03C7;\n  t['chieuchacirclekorean'] = 0x3277;\n  t['chieuchaparenkorean'] = 0x3217;\n  t['chieuchcirclekorean'] = 0x3269;\n  t['chieuchkorean'] = 0x314A;\n  t['chieuchparenkorean'] = 0x3209;\n  t['chochangthai'] = 0x0E0A;\n  t['chochanthai'] = 0x0E08;\n  t['chochingthai'] = 0x0E09;\n  t['chochoethai'] = 0x0E0C;\n  t['chook'] = 0x0188;\n  t['cieucacirclekorean'] = 0x3276;\n  t['cieucaparenkorean'] = 0x3216;\n  t['cieuccirclekorean'] = 0x3268;\n  t['cieuckorean'] = 0x3148;\n  t['cieucparenkorean'] = 0x3208;\n  t['cieucuparenkorean'] = 0x321C;\n  t['circle'] = 0x25CB;\n  t['circlecopyrt'] = 0x00A9; // Glyph is missing from Adobe's original list.\n  t['circlemultiply'] = 0x2297;\n  t['circleot'] = 0x2299;\n  t['circleplus'] = 0x2295;\n  t['circlepostalmark'] = 0x3036;\n  t['circlewithlefthalfblack'] = 0x25D0;\n  t['circlewithrighthalfblack'] = 0x25D1;\n  t['circumflex'] = 0x02C6;\n  t['circumflexbelowcmb'] = 0x032D;\n  t['circumflexcmb'] = 0x0302;\n  t['clear'] = 0x2327;\n  t['clickalveolar'] = 0x01C2;\n  t['clickdental'] = 0x01C0;\n  t['clicklateral'] = 0x01C1;\n  t['clickretroflex'] = 0x01C3;\n  t['club'] = 0x2663;\n  t['clubsuitblack'] = 0x2663;\n  t['clubsuitwhite'] = 0x2667;\n  t['cmcubedsquare'] = 0x33A4;\n  t['cmonospace'] = 0xFF43;\n  t['cmsquaredsquare'] = 0x33A0;\n  t['coarmenian'] = 0x0581;\n  t['colon'] = 0x003A;\n  t['colonmonetary'] = 0x20A1;\n  t['colonmonospace'] = 0xFF1A;\n  t['colonsign'] = 0x20A1;\n  t['colonsmall'] = 0xFE55;\n  t['colontriangularhalfmod'] = 0x02D1;\n  t['colontriangularmod'] = 0x02D0;\n  t['comma'] = 0x002C;\n  t['commaabovecmb'] = 0x0313;\n  t['commaaboverightcmb'] = 0x0315;\n  t['commaaccent'] = 0xF6C3;\n  t['commaarabic'] = 0x060C;\n  t['commaarmenian'] = 0x055D;\n  t['commainferior'] = 0xF6E1;\n  t['commamonospace'] = 0xFF0C;\n  t['commareversedabovecmb'] = 0x0314;\n  t['commareversedmod'] = 0x02BD;\n  t['commasmall'] = 0xFE50;\n  t['commasuperior'] = 0xF6E2;\n  t['commaturnedabovecmb'] = 0x0312;\n  t['commaturnedmod'] = 0x02BB;\n  t['compass'] = 0x263C;\n  t['congruent'] = 0x2245;\n  t['contourintegral'] = 0x222E;\n  t['control'] = 0x2303;\n  t['controlACK'] = 0x0006;\n  t['controlBEL'] = 0x0007;\n  t['controlBS'] = 0x0008;\n  t['controlCAN'] = 0x0018;\n  t['controlCR'] = 0x000D;\n  t['controlDC1'] = 0x0011;\n  t['controlDC2'] = 0x0012;\n  t['controlDC3'] = 0x0013;\n  t['controlDC4'] = 0x0014;\n  t['controlDEL'] = 0x007F;\n  t['controlDLE'] = 0x0010;\n  t['controlEM'] = 0x0019;\n  t['controlENQ'] = 0x0005;\n  t['controlEOT'] = 0x0004;\n  t['controlESC'] = 0x001B;\n  t['controlETB'] = 0x0017;\n  t['controlETX'] = 0x0003;\n  t['controlFF'] = 0x000C;\n  t['controlFS'] = 0x001C;\n  t['controlGS'] = 0x001D;\n  t['controlHT'] = 0x0009;\n  t['controlLF'] = 0x000A;\n  t['controlNAK'] = 0x0015;\n  t['controlNULL'] = 0x0000; // Glyph is missing from Adobe's original list.\n  t['controlRS'] = 0x001E;\n  t['controlSI'] = 0x000F;\n  t['controlSO'] = 0x000E;\n  t['controlSOT'] = 0x0002;\n  t['controlSTX'] = 0x0001;\n  t['controlSUB'] = 0x001A;\n  t['controlSYN'] = 0x0016;\n  t['controlUS'] = 0x001F;\n  t['controlVT'] = 0x000B;\n  t['copyright'] = 0x00A9;\n  t['copyrightsans'] = 0xF8E9;\n  t['copyrightserif'] = 0xF6D9;\n  t['cornerbracketleft'] = 0x300C;\n  t['cornerbracketlefthalfwidth'] = 0xFF62;\n  t['cornerbracketleftvertical'] = 0xFE41;\n  t['cornerbracketright'] = 0x300D;\n  t['cornerbracketrighthalfwidth'] = 0xFF63;\n  t['cornerbracketrightvertical'] = 0xFE42;\n  t['corporationsquare'] = 0x337F;\n  t['cosquare'] = 0x33C7;\n  t['coverkgsquare'] = 0x33C6;\n  t['cparen'] = 0x249E;\n  t['cruzeiro'] = 0x20A2;\n  t['cstretched'] = 0x0297;\n  t['curlyand'] = 0x22CF;\n  t['curlyor'] = 0x22CE;\n  t['currency'] = 0x00A4;\n  t['cyrBreve'] = 0xF6D1;\n  t['cyrFlex'] = 0xF6D2;\n  t['cyrbreve'] = 0xF6D4;\n  t['cyrflex'] = 0xF6D5;\n  t['d'] = 0x0064;\n  t['daarmenian'] = 0x0564;\n  t['dabengali'] = 0x09A6;\n  t['dadarabic'] = 0x0636;\n  t['dadeva'] = 0x0926;\n  t['dadfinalarabic'] = 0xFEBE;\n  t['dadinitialarabic'] = 0xFEBF;\n  t['dadmedialarabic'] = 0xFEC0;\n  t['dagesh'] = 0x05BC;\n  t['dageshhebrew'] = 0x05BC;\n  t['dagger'] = 0x2020;\n  t['daggerdbl'] = 0x2021;\n  t['dagujarati'] = 0x0AA6;\n  t['dagurmukhi'] = 0x0A26;\n  t['dahiragana'] = 0x3060;\n  t['dakatakana'] = 0x30C0;\n  t['dalarabic'] = 0x062F;\n  t['dalet'] = 0x05D3;\n  t['daletdagesh'] = 0xFB33;\n  t['daletdageshhebrew'] = 0xFB33;\n  t['dalethebrew'] = 0x05D3;\n  t['dalfinalarabic'] = 0xFEAA;\n  t['dammaarabic'] = 0x064F;\n  t['dammalowarabic'] = 0x064F;\n  t['dammatanaltonearabic'] = 0x064C;\n  t['dammatanarabic'] = 0x064C;\n  t['danda'] = 0x0964;\n  t['dargahebrew'] = 0x05A7;\n  t['dargalefthebrew'] = 0x05A7;\n  t['dasiapneumatacyrilliccmb'] = 0x0485;\n  t['dblGrave'] = 0xF6D3;\n  t['dblanglebracketleft'] = 0x300A;\n  t['dblanglebracketleftvertical'] = 0xFE3D;\n  t['dblanglebracketright'] = 0x300B;\n  t['dblanglebracketrightvertical'] = 0xFE3E;\n  t['dblarchinvertedbelowcmb'] = 0x032B;\n  t['dblarrowleft'] = 0x21D4;\n  t['dblarrowright'] = 0x21D2;\n  t['dbldanda'] = 0x0965;\n  t['dblgrave'] = 0xF6D6;\n  t['dblgravecmb'] = 0x030F;\n  t['dblintegral'] = 0x222C;\n  t['dbllowline'] = 0x2017;\n  t['dbllowlinecmb'] = 0x0333;\n  t['dbloverlinecmb'] = 0x033F;\n  t['dblprimemod'] = 0x02BA;\n  t['dblverticalbar'] = 0x2016;\n  t['dblverticallineabovecmb'] = 0x030E;\n  t['dbopomofo'] = 0x3109;\n  t['dbsquare'] = 0x33C8;\n  t['dcaron'] = 0x010F;\n  t['dcedilla'] = 0x1E11;\n  t['dcircle'] = 0x24D3;\n  t['dcircumflexbelow'] = 0x1E13;\n  t['dcroat'] = 0x0111;\n  t['ddabengali'] = 0x09A1;\n  t['ddadeva'] = 0x0921;\n  t['ddagujarati'] = 0x0AA1;\n  t['ddagurmukhi'] = 0x0A21;\n  t['ddalarabic'] = 0x0688;\n  t['ddalfinalarabic'] = 0xFB89;\n  t['dddhadeva'] = 0x095C;\n  t['ddhabengali'] = 0x09A2;\n  t['ddhadeva'] = 0x0922;\n  t['ddhagujarati'] = 0x0AA2;\n  t['ddhagurmukhi'] = 0x0A22;\n  t['ddotaccent'] = 0x1E0B;\n  t['ddotbelow'] = 0x1E0D;\n  t['decimalseparatorarabic'] = 0x066B;\n  t['decimalseparatorpersian'] = 0x066B;\n  t['decyrillic'] = 0x0434;\n  t['degree'] = 0x00B0;\n  t['dehihebrew'] = 0x05AD;\n  t['dehiragana'] = 0x3067;\n  t['deicoptic'] = 0x03EF;\n  t['dekatakana'] = 0x30C7;\n  t['deleteleft'] = 0x232B;\n  t['deleteright'] = 0x2326;\n  t['delta'] = 0x03B4;\n  t['deltaturned'] = 0x018D;\n  t['denominatorminusonenumeratorbengali'] = 0x09F8;\n  t['dezh'] = 0x02A4;\n  t['dhabengali'] = 0x09A7;\n  t['dhadeva'] = 0x0927;\n  t['dhagujarati'] = 0x0AA7;\n  t['dhagurmukhi'] = 0x0A27;\n  t['dhook'] = 0x0257;\n  t['dialytikatonos'] = 0x0385;\n  t['dialytikatonoscmb'] = 0x0344;\n  t['diamond'] = 0x2666;\n  t['diamondsuitwhite'] = 0x2662;\n  t['dieresis'] = 0x00A8;\n  t['dieresisacute'] = 0xF6D7;\n  t['dieresisbelowcmb'] = 0x0324;\n  t['dieresiscmb'] = 0x0308;\n  t['dieresisgrave'] = 0xF6D8;\n  t['dieresistonos'] = 0x0385;\n  t['dihiragana'] = 0x3062;\n  t['dikatakana'] = 0x30C2;\n  t['dittomark'] = 0x3003;\n  t['divide'] = 0x00F7;\n  t['divides'] = 0x2223;\n  t['divisionslash'] = 0x2215;\n  t['djecyrillic'] = 0x0452;\n  t['dkshade'] = 0x2593;\n  t['dlinebelow'] = 0x1E0F;\n  t['dlsquare'] = 0x3397;\n  t['dmacron'] = 0x0111;\n  t['dmonospace'] = 0xFF44;\n  t['dnblock'] = 0x2584;\n  t['dochadathai'] = 0x0E0E;\n  t['dodekthai'] = 0x0E14;\n  t['dohiragana'] = 0x3069;\n  t['dokatakana'] = 0x30C9;\n  t['dollar'] = 0x0024;\n  t['dollarinferior'] = 0xF6E3;\n  t['dollarmonospace'] = 0xFF04;\n  t['dollaroldstyle'] = 0xF724;\n  t['dollarsmall'] = 0xFE69;\n  t['dollarsuperior'] = 0xF6E4;\n  t['dong'] = 0x20AB;\n  t['dorusquare'] = 0x3326;\n  t['dotaccent'] = 0x02D9;\n  t['dotaccentcmb'] = 0x0307;\n  t['dotbelowcmb'] = 0x0323;\n  t['dotbelowcomb'] = 0x0323;\n  t['dotkatakana'] = 0x30FB;\n  t['dotlessi'] = 0x0131;\n  t['dotlessj'] = 0xF6BE;\n  t['dotlessjstrokehook'] = 0x0284;\n  t['dotmath'] = 0x22C5;\n  t['dottedcircle'] = 0x25CC;\n  t['doubleyodpatah'] = 0xFB1F;\n  t['doubleyodpatahhebrew'] = 0xFB1F;\n  t['downtackbelowcmb'] = 0x031E;\n  t['downtackmod'] = 0x02D5;\n  t['dparen'] = 0x249F;\n  t['dsuperior'] = 0xF6EB;\n  t['dtail'] = 0x0256;\n  t['dtopbar'] = 0x018C;\n  t['duhiragana'] = 0x3065;\n  t['dukatakana'] = 0x30C5;\n  t['dz'] = 0x01F3;\n  t['dzaltone'] = 0x02A3;\n  t['dzcaron'] = 0x01C6;\n  t['dzcurl'] = 0x02A5;\n  t['dzeabkhasiancyrillic'] = 0x04E1;\n  t['dzecyrillic'] = 0x0455;\n  t['dzhecyrillic'] = 0x045F;\n  t['e'] = 0x0065;\n  t['eacute'] = 0x00E9;\n  t['earth'] = 0x2641;\n  t['ebengali'] = 0x098F;\n  t['ebopomofo'] = 0x311C;\n  t['ebreve'] = 0x0115;\n  t['ecandradeva'] = 0x090D;\n  t['ecandragujarati'] = 0x0A8D;\n  t['ecandravowelsigndeva'] = 0x0945;\n  t['ecandravowelsigngujarati'] = 0x0AC5;\n  t['ecaron'] = 0x011B;\n  t['ecedillabreve'] = 0x1E1D;\n  t['echarmenian'] = 0x0565;\n  t['echyiwnarmenian'] = 0x0587;\n  t['ecircle'] = 0x24D4;\n  t['ecircumflex'] = 0x00EA;\n  t['ecircumflexacute'] = 0x1EBF;\n  t['ecircumflexbelow'] = 0x1E19;\n  t['ecircumflexdotbelow'] = 0x1EC7;\n  t['ecircumflexgrave'] = 0x1EC1;\n  t['ecircumflexhookabove'] = 0x1EC3;\n  t['ecircumflextilde'] = 0x1EC5;\n  t['ecyrillic'] = 0x0454;\n  t['edblgrave'] = 0x0205;\n  t['edeva'] = 0x090F;\n  t['edieresis'] = 0x00EB;\n  t['edot'] = 0x0117;\n  t['edotaccent'] = 0x0117;\n  t['edotbelow'] = 0x1EB9;\n  t['eegurmukhi'] = 0x0A0F;\n  t['eematragurmukhi'] = 0x0A47;\n  t['efcyrillic'] = 0x0444;\n  t['egrave'] = 0x00E8;\n  t['egujarati'] = 0x0A8F;\n  t['eharmenian'] = 0x0567;\n  t['ehbopomofo'] = 0x311D;\n  t['ehiragana'] = 0x3048;\n  t['ehookabove'] = 0x1EBB;\n  t['eibopomofo'] = 0x311F;\n  t['eight'] = 0x0038;\n  t['eightarabic'] = 0x0668;\n  t['eightbengali'] = 0x09EE;\n  t['eightcircle'] = 0x2467;\n  t['eightcircleinversesansserif'] = 0x2791;\n  t['eightdeva'] = 0x096E;\n  t['eighteencircle'] = 0x2471;\n  t['eighteenparen'] = 0x2485;\n  t['eighteenperiod'] = 0x2499;\n  t['eightgujarati'] = 0x0AEE;\n  t['eightgurmukhi'] = 0x0A6E;\n  t['eighthackarabic'] = 0x0668;\n  t['eighthangzhou'] = 0x3028;\n  t['eighthnotebeamed'] = 0x266B;\n  t['eightideographicparen'] = 0x3227;\n  t['eightinferior'] = 0x2088;\n  t['eightmonospace'] = 0xFF18;\n  t['eightoldstyle'] = 0xF738;\n  t['eightparen'] = 0x247B;\n  t['eightperiod'] = 0x248F;\n  t['eightpersian'] = 0x06F8;\n  t['eightroman'] = 0x2177;\n  t['eightsuperior'] = 0x2078;\n  t['eightthai'] = 0x0E58;\n  t['einvertedbreve'] = 0x0207;\n  t['eiotifiedcyrillic'] = 0x0465;\n  t['ekatakana'] = 0x30A8;\n  t['ekatakanahalfwidth'] = 0xFF74;\n  t['ekonkargurmukhi'] = 0x0A74;\n  t['ekorean'] = 0x3154;\n  t['elcyrillic'] = 0x043B;\n  t['element'] = 0x2208;\n  t['elevencircle'] = 0x246A;\n  t['elevenparen'] = 0x247E;\n  t['elevenperiod'] = 0x2492;\n  t['elevenroman'] = 0x217A;\n  t['ellipsis'] = 0x2026;\n  t['ellipsisvertical'] = 0x22EE;\n  t['emacron'] = 0x0113;\n  t['emacronacute'] = 0x1E17;\n  t['emacrongrave'] = 0x1E15;\n  t['emcyrillic'] = 0x043C;\n  t['emdash'] = 0x2014;\n  t['emdashvertical'] = 0xFE31;\n  t['emonospace'] = 0xFF45;\n  t['emphasismarkarmenian'] = 0x055B;\n  t['emptyset'] = 0x2205;\n  t['enbopomofo'] = 0x3123;\n  t['encyrillic'] = 0x043D;\n  t['endash'] = 0x2013;\n  t['endashvertical'] = 0xFE32;\n  t['endescendercyrillic'] = 0x04A3;\n  t['eng'] = 0x014B;\n  t['engbopomofo'] = 0x3125;\n  t['enghecyrillic'] = 0x04A5;\n  t['enhookcyrillic'] = 0x04C8;\n  t['enspace'] = 0x2002;\n  t['eogonek'] = 0x0119;\n  t['eokorean'] = 0x3153;\n  t['eopen'] = 0x025B;\n  t['eopenclosed'] = 0x029A;\n  t['eopenreversed'] = 0x025C;\n  t['eopenreversedclosed'] = 0x025E;\n  t['eopenreversedhook'] = 0x025D;\n  t['eparen'] = 0x24A0;\n  t['epsilon'] = 0x03B5;\n  t['epsilontonos'] = 0x03AD;\n  t['equal'] = 0x003D;\n  t['equalmonospace'] = 0xFF1D;\n  t['equalsmall'] = 0xFE66;\n  t['equalsuperior'] = 0x207C;\n  t['equivalence'] = 0x2261;\n  t['erbopomofo'] = 0x3126;\n  t['ercyrillic'] = 0x0440;\n  t['ereversed'] = 0x0258;\n  t['ereversedcyrillic'] = 0x044D;\n  t['escyrillic'] = 0x0441;\n  t['esdescendercyrillic'] = 0x04AB;\n  t['esh'] = 0x0283;\n  t['eshcurl'] = 0x0286;\n  t['eshortdeva'] = 0x090E;\n  t['eshortvowelsigndeva'] = 0x0946;\n  t['eshreversedloop'] = 0x01AA;\n  t['eshsquatreversed'] = 0x0285;\n  t['esmallhiragana'] = 0x3047;\n  t['esmallkatakana'] = 0x30A7;\n  t['esmallkatakanahalfwidth'] = 0xFF6A;\n  t['estimated'] = 0x212E;\n  t['esuperior'] = 0xF6EC;\n  t['eta'] = 0x03B7;\n  t['etarmenian'] = 0x0568;\n  t['etatonos'] = 0x03AE;\n  t['eth'] = 0x00F0;\n  t['etilde'] = 0x1EBD;\n  t['etildebelow'] = 0x1E1B;\n  t['etnahtafoukhhebrew'] = 0x0591;\n  t['etnahtafoukhlefthebrew'] = 0x0591;\n  t['etnahtahebrew'] = 0x0591;\n  t['etnahtalefthebrew'] = 0x0591;\n  t['eturned'] = 0x01DD;\n  t['eukorean'] = 0x3161;\n  t['euro'] = 0x20AC;\n  t['evowelsignbengali'] = 0x09C7;\n  t['evowelsigndeva'] = 0x0947;\n  t['evowelsigngujarati'] = 0x0AC7;\n  t['exclam'] = 0x0021;\n  t['exclamarmenian'] = 0x055C;\n  t['exclamdbl'] = 0x203C;\n  t['exclamdown'] = 0x00A1;\n  t['exclamdownsmall'] = 0xF7A1;\n  t['exclammonospace'] = 0xFF01;\n  t['exclamsmall'] = 0xF721;\n  t['existential'] = 0x2203;\n  t['ezh'] = 0x0292;\n  t['ezhcaron'] = 0x01EF;\n  t['ezhcurl'] = 0x0293;\n  t['ezhreversed'] = 0x01B9;\n  t['ezhtail'] = 0x01BA;\n  t['f'] = 0x0066;\n  t['fadeva'] = 0x095E;\n  t['fagurmukhi'] = 0x0A5E;\n  t['fahrenheit'] = 0x2109;\n  t['fathaarabic'] = 0x064E;\n  t['fathalowarabic'] = 0x064E;\n  t['fathatanarabic'] = 0x064B;\n  t['fbopomofo'] = 0x3108;\n  t['fcircle'] = 0x24D5;\n  t['fdotaccent'] = 0x1E1F;\n  t['feharabic'] = 0x0641;\n  t['feharmenian'] = 0x0586;\n  t['fehfinalarabic'] = 0xFED2;\n  t['fehinitialarabic'] = 0xFED3;\n  t['fehmedialarabic'] = 0xFED4;\n  t['feicoptic'] = 0x03E5;\n  t['female'] = 0x2640;\n  t['ff'] = 0xFB00;\n  t['ffi'] = 0xFB03;\n  t['ffl'] = 0xFB04;\n  t['fi'] = 0xFB01;\n  t['fifteencircle'] = 0x246E;\n  t['fifteenparen'] = 0x2482;\n  t['fifteenperiod'] = 0x2496;\n  t['figuredash'] = 0x2012;\n  t['filledbox'] = 0x25A0;\n  t['filledrect'] = 0x25AC;\n  t['finalkaf'] = 0x05DA;\n  t['finalkafdagesh'] = 0xFB3A;\n  t['finalkafdageshhebrew'] = 0xFB3A;\n  t['finalkafhebrew'] = 0x05DA;\n  t['finalmem'] = 0x05DD;\n  t['finalmemhebrew'] = 0x05DD;\n  t['finalnun'] = 0x05DF;\n  t['finalnunhebrew'] = 0x05DF;\n  t['finalpe'] = 0x05E3;\n  t['finalpehebrew'] = 0x05E3;\n  t['finaltsadi'] = 0x05E5;\n  t['finaltsadihebrew'] = 0x05E5;\n  t['firsttonechinese'] = 0x02C9;\n  t['fisheye'] = 0x25C9;\n  t['fitacyrillic'] = 0x0473;\n  t['five'] = 0x0035;\n  t['fivearabic'] = 0x0665;\n  t['fivebengali'] = 0x09EB;\n  t['fivecircle'] = 0x2464;\n  t['fivecircleinversesansserif'] = 0x278E;\n  t['fivedeva'] = 0x096B;\n  t['fiveeighths'] = 0x215D;\n  t['fivegujarati'] = 0x0AEB;\n  t['fivegurmukhi'] = 0x0A6B;\n  t['fivehackarabic'] = 0x0665;\n  t['fivehangzhou'] = 0x3025;\n  t['fiveideographicparen'] = 0x3224;\n  t['fiveinferior'] = 0x2085;\n  t['fivemonospace'] = 0xFF15;\n  t['fiveoldstyle'] = 0xF735;\n  t['fiveparen'] = 0x2478;\n  t['fiveperiod'] = 0x248C;\n  t['fivepersian'] = 0x06F5;\n  t['fiveroman'] = 0x2174;\n  t['fivesuperior'] = 0x2075;\n  t['fivethai'] = 0x0E55;\n  t['fl'] = 0xFB02;\n  t['florin'] = 0x0192;\n  t['fmonospace'] = 0xFF46;\n  t['fmsquare'] = 0x3399;\n  t['fofanthai'] = 0x0E1F;\n  t['fofathai'] = 0x0E1D;\n  t['fongmanthai'] = 0x0E4F;\n  t['forall'] = 0x2200;\n  t['four'] = 0x0034;\n  t['fourarabic'] = 0x0664;\n  t['fourbengali'] = 0x09EA;\n  t['fourcircle'] = 0x2463;\n  t['fourcircleinversesansserif'] = 0x278D;\n  t['fourdeva'] = 0x096A;\n  t['fourgujarati'] = 0x0AEA;\n  t['fourgurmukhi'] = 0x0A6A;\n  t['fourhackarabic'] = 0x0664;\n  t['fourhangzhou'] = 0x3024;\n  t['fourideographicparen'] = 0x3223;\n  t['fourinferior'] = 0x2084;\n  t['fourmonospace'] = 0xFF14;\n  t['fournumeratorbengali'] = 0x09F7;\n  t['fouroldstyle'] = 0xF734;\n  t['fourparen'] = 0x2477;\n  t['fourperiod'] = 0x248B;\n  t['fourpersian'] = 0x06F4;\n  t['fourroman'] = 0x2173;\n  t['foursuperior'] = 0x2074;\n  t['fourteencircle'] = 0x246D;\n  t['fourteenparen'] = 0x2481;\n  t['fourteenperiod'] = 0x2495;\n  t['fourthai'] = 0x0E54;\n  t['fourthtonechinese'] = 0x02CB;\n  t['fparen'] = 0x24A1;\n  t['fraction'] = 0x2044;\n  t['franc'] = 0x20A3;\n  t['g'] = 0x0067;\n  t['gabengali'] = 0x0997;\n  t['gacute'] = 0x01F5;\n  t['gadeva'] = 0x0917;\n  t['gafarabic'] = 0x06AF;\n  t['gaffinalarabic'] = 0xFB93;\n  t['gafinitialarabic'] = 0xFB94;\n  t['gafmedialarabic'] = 0xFB95;\n  t['gagujarati'] = 0x0A97;\n  t['gagurmukhi'] = 0x0A17;\n  t['gahiragana'] = 0x304C;\n  t['gakatakana'] = 0x30AC;\n  t['gamma'] = 0x03B3;\n  t['gammalatinsmall'] = 0x0263;\n  t['gammasuperior'] = 0x02E0;\n  t['gangiacoptic'] = 0x03EB;\n  t['gbopomofo'] = 0x310D;\n  t['gbreve'] = 0x011F;\n  t['gcaron'] = 0x01E7;\n  t['gcedilla'] = 0x0123;\n  t['gcircle'] = 0x24D6;\n  t['gcircumflex'] = 0x011D;\n  t['gcommaaccent'] = 0x0123;\n  t['gdot'] = 0x0121;\n  t['gdotaccent'] = 0x0121;\n  t['gecyrillic'] = 0x0433;\n  t['gehiragana'] = 0x3052;\n  t['gekatakana'] = 0x30B2;\n  t['geometricallyequal'] = 0x2251;\n  t['gereshaccenthebrew'] = 0x059C;\n  t['gereshhebrew'] = 0x05F3;\n  t['gereshmuqdamhebrew'] = 0x059D;\n  t['germandbls'] = 0x00DF;\n  t['gershayimaccenthebrew'] = 0x059E;\n  t['gershayimhebrew'] = 0x05F4;\n  t['getamark'] = 0x3013;\n  t['ghabengali'] = 0x0998;\n  t['ghadarmenian'] = 0x0572;\n  t['ghadeva'] = 0x0918;\n  t['ghagujarati'] = 0x0A98;\n  t['ghagurmukhi'] = 0x0A18;\n  t['ghainarabic'] = 0x063A;\n  t['ghainfinalarabic'] = 0xFECE;\n  t['ghaininitialarabic'] = 0xFECF;\n  t['ghainmedialarabic'] = 0xFED0;\n  t['ghemiddlehookcyrillic'] = 0x0495;\n  t['ghestrokecyrillic'] = 0x0493;\n  t['gheupturncyrillic'] = 0x0491;\n  t['ghhadeva'] = 0x095A;\n  t['ghhagurmukhi'] = 0x0A5A;\n  t['ghook'] = 0x0260;\n  t['ghzsquare'] = 0x3393;\n  t['gihiragana'] = 0x304E;\n  t['gikatakana'] = 0x30AE;\n  t['gimarmenian'] = 0x0563;\n  t['gimel'] = 0x05D2;\n  t['gimeldagesh'] = 0xFB32;\n  t['gimeldageshhebrew'] = 0xFB32;\n  t['gimelhebrew'] = 0x05D2;\n  t['gjecyrillic'] = 0x0453;\n  t['glottalinvertedstroke'] = 0x01BE;\n  t['glottalstop'] = 0x0294;\n  t['glottalstopinverted'] = 0x0296;\n  t['glottalstopmod'] = 0x02C0;\n  t['glottalstopreversed'] = 0x0295;\n  t['glottalstopreversedmod'] = 0x02C1;\n  t['glottalstopreversedsuperior'] = 0x02E4;\n  t['glottalstopstroke'] = 0x02A1;\n  t['glottalstopstrokereversed'] = 0x02A2;\n  t['gmacron'] = 0x1E21;\n  t['gmonospace'] = 0xFF47;\n  t['gohiragana'] = 0x3054;\n  t['gokatakana'] = 0x30B4;\n  t['gparen'] = 0x24A2;\n  t['gpasquare'] = 0x33AC;\n  t['gradient'] = 0x2207;\n  t['grave'] = 0x0060;\n  t['gravebelowcmb'] = 0x0316;\n  t['gravecmb'] = 0x0300;\n  t['gravecomb'] = 0x0300;\n  t['gravedeva'] = 0x0953;\n  t['gravelowmod'] = 0x02CE;\n  t['gravemonospace'] = 0xFF40;\n  t['gravetonecmb'] = 0x0340;\n  t['greater'] = 0x003E;\n  t['greaterequal'] = 0x2265;\n  t['greaterequalorless'] = 0x22DB;\n  t['greatermonospace'] = 0xFF1E;\n  t['greaterorequivalent'] = 0x2273;\n  t['greaterorless'] = 0x2277;\n  t['greateroverequal'] = 0x2267;\n  t['greatersmall'] = 0xFE65;\n  t['gscript'] = 0x0261;\n  t['gstroke'] = 0x01E5;\n  t['guhiragana'] = 0x3050;\n  t['guillemotleft'] = 0x00AB;\n  t['guillemotright'] = 0x00BB;\n  t['guilsinglleft'] = 0x2039;\n  t['guilsinglright'] = 0x203A;\n  t['gukatakana'] = 0x30B0;\n  t['guramusquare'] = 0x3318;\n  t['gysquare'] = 0x33C9;\n  t['h'] = 0x0068;\n  t['haabkhasiancyrillic'] = 0x04A9;\n  t['haaltonearabic'] = 0x06C1;\n  t['habengali'] = 0x09B9;\n  t['hadescendercyrillic'] = 0x04B3;\n  t['hadeva'] = 0x0939;\n  t['hagujarati'] = 0x0AB9;\n  t['hagurmukhi'] = 0x0A39;\n  t['haharabic'] = 0x062D;\n  t['hahfinalarabic'] = 0xFEA2;\n  t['hahinitialarabic'] = 0xFEA3;\n  t['hahiragana'] = 0x306F;\n  t['hahmedialarabic'] = 0xFEA4;\n  t['haitusquare'] = 0x332A;\n  t['hakatakana'] = 0x30CF;\n  t['hakatakanahalfwidth'] = 0xFF8A;\n  t['halantgurmukhi'] = 0x0A4D;\n  t['hamzaarabic'] = 0x0621;\n  t['hamzalowarabic'] = 0x0621;\n  t['hangulfiller'] = 0x3164;\n  t['hardsigncyrillic'] = 0x044A;\n  t['harpoonleftbarbup'] = 0x21BC;\n  t['harpoonrightbarbup'] = 0x21C0;\n  t['hasquare'] = 0x33CA;\n  t['hatafpatah'] = 0x05B2;\n  t['hatafpatah16'] = 0x05B2;\n  t['hatafpatah23'] = 0x05B2;\n  t['hatafpatah2f'] = 0x05B2;\n  t['hatafpatahhebrew'] = 0x05B2;\n  t['hatafpatahnarrowhebrew'] = 0x05B2;\n  t['hatafpatahquarterhebrew'] = 0x05B2;\n  t['hatafpatahwidehebrew'] = 0x05B2;\n  t['hatafqamats'] = 0x05B3;\n  t['hatafqamats1b'] = 0x05B3;\n  t['hatafqamats28'] = 0x05B3;\n  t['hatafqamats34'] = 0x05B3;\n  t['hatafqamatshebrew'] = 0x05B3;\n  t['hatafqamatsnarrowhebrew'] = 0x05B3;\n  t['hatafqamatsquarterhebrew'] = 0x05B3;\n  t['hatafqamatswidehebrew'] = 0x05B3;\n  t['hatafsegol'] = 0x05B1;\n  t['hatafsegol17'] = 0x05B1;\n  t['hatafsegol24'] = 0x05B1;\n  t['hatafsegol30'] = 0x05B1;\n  t['hatafsegolhebrew'] = 0x05B1;\n  t['hatafsegolnarrowhebrew'] = 0x05B1;\n  t['hatafsegolquarterhebrew'] = 0x05B1;\n  t['hatafsegolwidehebrew'] = 0x05B1;\n  t['hbar'] = 0x0127;\n  t['hbopomofo'] = 0x310F;\n  t['hbrevebelow'] = 0x1E2B;\n  t['hcedilla'] = 0x1E29;\n  t['hcircle'] = 0x24D7;\n  t['hcircumflex'] = 0x0125;\n  t['hdieresis'] = 0x1E27;\n  t['hdotaccent'] = 0x1E23;\n  t['hdotbelow'] = 0x1E25;\n  t['he'] = 0x05D4;\n  t['heart'] = 0x2665;\n  t['heartsuitblack'] = 0x2665;\n  t['heartsuitwhite'] = 0x2661;\n  t['hedagesh'] = 0xFB34;\n  t['hedageshhebrew'] = 0xFB34;\n  t['hehaltonearabic'] = 0x06C1;\n  t['heharabic'] = 0x0647;\n  t['hehebrew'] = 0x05D4;\n  t['hehfinalaltonearabic'] = 0xFBA7;\n  t['hehfinalalttwoarabic'] = 0xFEEA;\n  t['hehfinalarabic'] = 0xFEEA;\n  t['hehhamzaabovefinalarabic'] = 0xFBA5;\n  t['hehhamzaaboveisolatedarabic'] = 0xFBA4;\n  t['hehinitialaltonearabic'] = 0xFBA8;\n  t['hehinitialarabic'] = 0xFEEB;\n  t['hehiragana'] = 0x3078;\n  t['hehmedialaltonearabic'] = 0xFBA9;\n  t['hehmedialarabic'] = 0xFEEC;\n  t['heiseierasquare'] = 0x337B;\n  t['hekatakana'] = 0x30D8;\n  t['hekatakanahalfwidth'] = 0xFF8D;\n  t['hekutaarusquare'] = 0x3336;\n  t['henghook'] = 0x0267;\n  t['herutusquare'] = 0x3339;\n  t['het'] = 0x05D7;\n  t['hethebrew'] = 0x05D7;\n  t['hhook'] = 0x0266;\n  t['hhooksuperior'] = 0x02B1;\n  t['hieuhacirclekorean'] = 0x327B;\n  t['hieuhaparenkorean'] = 0x321B;\n  t['hieuhcirclekorean'] = 0x326D;\n  t['hieuhkorean'] = 0x314E;\n  t['hieuhparenkorean'] = 0x320D;\n  t['hihiragana'] = 0x3072;\n  t['hikatakana'] = 0x30D2;\n  t['hikatakanahalfwidth'] = 0xFF8B;\n  t['hiriq'] = 0x05B4;\n  t['hiriq14'] = 0x05B4;\n  t['hiriq21'] = 0x05B4;\n  t['hiriq2d'] = 0x05B4;\n  t['hiriqhebrew'] = 0x05B4;\n  t['hiriqnarrowhebrew'] = 0x05B4;\n  t['hiriqquarterhebrew'] = 0x05B4;\n  t['hiriqwidehebrew'] = 0x05B4;\n  t['hlinebelow'] = 0x1E96;\n  t['hmonospace'] = 0xFF48;\n  t['hoarmenian'] = 0x0570;\n  t['hohipthai'] = 0x0E2B;\n  t['hohiragana'] = 0x307B;\n  t['hokatakana'] = 0x30DB;\n  t['hokatakanahalfwidth'] = 0xFF8E;\n  t['holam'] = 0x05B9;\n  t['holam19'] = 0x05B9;\n  t['holam26'] = 0x05B9;\n  t['holam32'] = 0x05B9;\n  t['holamhebrew'] = 0x05B9;\n  t['holamnarrowhebrew'] = 0x05B9;\n  t['holamquarterhebrew'] = 0x05B9;\n  t['holamwidehebrew'] = 0x05B9;\n  t['honokhukthai'] = 0x0E2E;\n  t['hookabovecomb'] = 0x0309;\n  t['hookcmb'] = 0x0309;\n  t['hookpalatalizedbelowcmb'] = 0x0321;\n  t['hookretroflexbelowcmb'] = 0x0322;\n  t['hoonsquare'] = 0x3342;\n  t['horicoptic'] = 0x03E9;\n  t['horizontalbar'] = 0x2015;\n  t['horncmb'] = 0x031B;\n  t['hotsprings'] = 0x2668;\n  t['house'] = 0x2302;\n  t['hparen'] = 0x24A3;\n  t['hsuperior'] = 0x02B0;\n  t['hturned'] = 0x0265;\n  t['huhiragana'] = 0x3075;\n  t['huiitosquare'] = 0x3333;\n  t['hukatakana'] = 0x30D5;\n  t['hukatakanahalfwidth'] = 0xFF8C;\n  t['hungarumlaut'] = 0x02DD;\n  t['hungarumlautcmb'] = 0x030B;\n  t['hv'] = 0x0195;\n  t['hyphen'] = 0x002D;\n  t['hypheninferior'] = 0xF6E5;\n  t['hyphenmonospace'] = 0xFF0D;\n  t['hyphensmall'] = 0xFE63;\n  t['hyphensuperior'] = 0xF6E6;\n  t['hyphentwo'] = 0x2010;\n  t['i'] = 0x0069;\n  t['iacute'] = 0x00ED;\n  t['iacyrillic'] = 0x044F;\n  t['ibengali'] = 0x0987;\n  t['ibopomofo'] = 0x3127;\n  t['ibreve'] = 0x012D;\n  t['icaron'] = 0x01D0;\n  t['icircle'] = 0x24D8;\n  t['icircumflex'] = 0x00EE;\n  t['icyrillic'] = 0x0456;\n  t['idblgrave'] = 0x0209;\n  t['ideographearthcircle'] = 0x328F;\n  t['ideographfirecircle'] = 0x328B;\n  t['ideographicallianceparen'] = 0x323F;\n  t['ideographiccallparen'] = 0x323A;\n  t['ideographiccentrecircle'] = 0x32A5;\n  t['ideographicclose'] = 0x3006;\n  t['ideographiccomma'] = 0x3001;\n  t['ideographiccommaleft'] = 0xFF64;\n  t['ideographiccongratulationparen'] = 0x3237;\n  t['ideographiccorrectcircle'] = 0x32A3;\n  t['ideographicearthparen'] = 0x322F;\n  t['ideographicenterpriseparen'] = 0x323D;\n  t['ideographicexcellentcircle'] = 0x329D;\n  t['ideographicfestivalparen'] = 0x3240;\n  t['ideographicfinancialcircle'] = 0x3296;\n  t['ideographicfinancialparen'] = 0x3236;\n  t['ideographicfireparen'] = 0x322B;\n  t['ideographichaveparen'] = 0x3232;\n  t['ideographichighcircle'] = 0x32A4;\n  t['ideographiciterationmark'] = 0x3005;\n  t['ideographiclaborcircle'] = 0x3298;\n  t['ideographiclaborparen'] = 0x3238;\n  t['ideographicleftcircle'] = 0x32A7;\n  t['ideographiclowcircle'] = 0x32A6;\n  t['ideographicmedicinecircle'] = 0x32A9;\n  t['ideographicmetalparen'] = 0x322E;\n  t['ideographicmoonparen'] = 0x322A;\n  t['ideographicnameparen'] = 0x3234;\n  t['ideographicperiod'] = 0x3002;\n  t['ideographicprintcircle'] = 0x329E;\n  t['ideographicreachparen'] = 0x3243;\n  t['ideographicrepresentparen'] = 0x3239;\n  t['ideographicresourceparen'] = 0x323E;\n  t['ideographicrightcircle'] = 0x32A8;\n  t['ideographicsecretcircle'] = 0x3299;\n  t['ideographicselfparen'] = 0x3242;\n  t['ideographicsocietyparen'] = 0x3233;\n  t['ideographicspace'] = 0x3000;\n  t['ideographicspecialparen'] = 0x3235;\n  t['ideographicstockparen'] = 0x3231;\n  t['ideographicstudyparen'] = 0x323B;\n  t['ideographicsunparen'] = 0x3230;\n  t['ideographicsuperviseparen'] = 0x323C;\n  t['ideographicwaterparen'] = 0x322C;\n  t['ideographicwoodparen'] = 0x322D;\n  t['ideographiczero'] = 0x3007;\n  t['ideographmetalcircle'] = 0x328E;\n  t['ideographmooncircle'] = 0x328A;\n  t['ideographnamecircle'] = 0x3294;\n  t['ideographsuncircle'] = 0x3290;\n  t['ideographwatercircle'] = 0x328C;\n  t['ideographwoodcircle'] = 0x328D;\n  t['ideva'] = 0x0907;\n  t['idieresis'] = 0x00EF;\n  t['idieresisacute'] = 0x1E2F;\n  t['idieresiscyrillic'] = 0x04E5;\n  t['idotbelow'] = 0x1ECB;\n  t['iebrevecyrillic'] = 0x04D7;\n  t['iecyrillic'] = 0x0435;\n  t['ieungacirclekorean'] = 0x3275;\n  t['ieungaparenkorean'] = 0x3215;\n  t['ieungcirclekorean'] = 0x3267;\n  t['ieungkorean'] = 0x3147;\n  t['ieungparenkorean'] = 0x3207;\n  t['igrave'] = 0x00EC;\n  t['igujarati'] = 0x0A87;\n  t['igurmukhi'] = 0x0A07;\n  t['ihiragana'] = 0x3044;\n  t['ihookabove'] = 0x1EC9;\n  t['iibengali'] = 0x0988;\n  t['iicyrillic'] = 0x0438;\n  t['iideva'] = 0x0908;\n  t['iigujarati'] = 0x0A88;\n  t['iigurmukhi'] = 0x0A08;\n  t['iimatragurmukhi'] = 0x0A40;\n  t['iinvertedbreve'] = 0x020B;\n  t['iishortcyrillic'] = 0x0439;\n  t['iivowelsignbengali'] = 0x09C0;\n  t['iivowelsigndeva'] = 0x0940;\n  t['iivowelsigngujarati'] = 0x0AC0;\n  t['ij'] = 0x0133;\n  t['ikatakana'] = 0x30A4;\n  t['ikatakanahalfwidth'] = 0xFF72;\n  t['ikorean'] = 0x3163;\n  t['ilde'] = 0x02DC;\n  t['iluyhebrew'] = 0x05AC;\n  t['imacron'] = 0x012B;\n  t['imacroncyrillic'] = 0x04E3;\n  t['imageorapproximatelyequal'] = 0x2253;\n  t['imatragurmukhi'] = 0x0A3F;\n  t['imonospace'] = 0xFF49;\n  t['increment'] = 0x2206;\n  t['infinity'] = 0x221E;\n  t['iniarmenian'] = 0x056B;\n  t['integral'] = 0x222B;\n  t['integralbottom'] = 0x2321;\n  t['integralbt'] = 0x2321;\n  t['integralex'] = 0xF8F5;\n  t['integraltop'] = 0x2320;\n  t['integraltp'] = 0x2320;\n  t['intersection'] = 0x2229;\n  t['intisquare'] = 0x3305;\n  t['invbullet'] = 0x25D8;\n  t['invcircle'] = 0x25D9;\n  t['invsmileface'] = 0x263B;\n  t['iocyrillic'] = 0x0451;\n  t['iogonek'] = 0x012F;\n  t['iota'] = 0x03B9;\n  t['iotadieresis'] = 0x03CA;\n  t['iotadieresistonos'] = 0x0390;\n  t['iotalatin'] = 0x0269;\n  t['iotatonos'] = 0x03AF;\n  t['iparen'] = 0x24A4;\n  t['irigurmukhi'] = 0x0A72;\n  t['ismallhiragana'] = 0x3043;\n  t['ismallkatakana'] = 0x30A3;\n  t['ismallkatakanahalfwidth'] = 0xFF68;\n  t['issharbengali'] = 0x09FA;\n  t['istroke'] = 0x0268;\n  t['isuperior'] = 0xF6ED;\n  t['iterationhiragana'] = 0x309D;\n  t['iterationkatakana'] = 0x30FD;\n  t['itilde'] = 0x0129;\n  t['itildebelow'] = 0x1E2D;\n  t['iubopomofo'] = 0x3129;\n  t['iucyrillic'] = 0x044E;\n  t['ivowelsignbengali'] = 0x09BF;\n  t['ivowelsigndeva'] = 0x093F;\n  t['ivowelsigngujarati'] = 0x0ABF;\n  t['izhitsacyrillic'] = 0x0475;\n  t['izhitsadblgravecyrillic'] = 0x0477;\n  t['j'] = 0x006A;\n  t['jaarmenian'] = 0x0571;\n  t['jabengali'] = 0x099C;\n  t['jadeva'] = 0x091C;\n  t['jagujarati'] = 0x0A9C;\n  t['jagurmukhi'] = 0x0A1C;\n  t['jbopomofo'] = 0x3110;\n  t['jcaron'] = 0x01F0;\n  t['jcircle'] = 0x24D9;\n  t['jcircumflex'] = 0x0135;\n  t['jcrossedtail'] = 0x029D;\n  t['jdotlessstroke'] = 0x025F;\n  t['jecyrillic'] = 0x0458;\n  t['jeemarabic'] = 0x062C;\n  t['jeemfinalarabic'] = 0xFE9E;\n  t['jeeminitialarabic'] = 0xFE9F;\n  t['jeemmedialarabic'] = 0xFEA0;\n  t['jeharabic'] = 0x0698;\n  t['jehfinalarabic'] = 0xFB8B;\n  t['jhabengali'] = 0x099D;\n  t['jhadeva'] = 0x091D;\n  t['jhagujarati'] = 0x0A9D;\n  t['jhagurmukhi'] = 0x0A1D;\n  t['jheharmenian'] = 0x057B;\n  t['jis'] = 0x3004;\n  t['jmonospace'] = 0xFF4A;\n  t['jparen'] = 0x24A5;\n  t['jsuperior'] = 0x02B2;\n  t['k'] = 0x006B;\n  t['kabashkircyrillic'] = 0x04A1;\n  t['kabengali'] = 0x0995;\n  t['kacute'] = 0x1E31;\n  t['kacyrillic'] = 0x043A;\n  t['kadescendercyrillic'] = 0x049B;\n  t['kadeva'] = 0x0915;\n  t['kaf'] = 0x05DB;\n  t['kafarabic'] = 0x0643;\n  t['kafdagesh'] = 0xFB3B;\n  t['kafdageshhebrew'] = 0xFB3B;\n  t['kaffinalarabic'] = 0xFEDA;\n  t['kafhebrew'] = 0x05DB;\n  t['kafinitialarabic'] = 0xFEDB;\n  t['kafmedialarabic'] = 0xFEDC;\n  t['kafrafehebrew'] = 0xFB4D;\n  t['kagujarati'] = 0x0A95;\n  t['kagurmukhi'] = 0x0A15;\n  t['kahiragana'] = 0x304B;\n  t['kahookcyrillic'] = 0x04C4;\n  t['kakatakana'] = 0x30AB;\n  t['kakatakanahalfwidth'] = 0xFF76;\n  t['kappa'] = 0x03BA;\n  t['kappasymbolgreek'] = 0x03F0;\n  t['kapyeounmieumkorean'] = 0x3171;\n  t['kapyeounphieuphkorean'] = 0x3184;\n  t['kapyeounpieupkorean'] = 0x3178;\n  t['kapyeounssangpieupkorean'] = 0x3179;\n  t['karoriisquare'] = 0x330D;\n  t['kashidaautoarabic'] = 0x0640;\n  t['kashidaautonosidebearingarabic'] = 0x0640;\n  t['kasmallkatakana'] = 0x30F5;\n  t['kasquare'] = 0x3384;\n  t['kasraarabic'] = 0x0650;\n  t['kasratanarabic'] = 0x064D;\n  t['kastrokecyrillic'] = 0x049F;\n  t['katahiraprolongmarkhalfwidth'] = 0xFF70;\n  t['kaverticalstrokecyrillic'] = 0x049D;\n  t['kbopomofo'] = 0x310E;\n  t['kcalsquare'] = 0x3389;\n  t['kcaron'] = 0x01E9;\n  t['kcedilla'] = 0x0137;\n  t['kcircle'] = 0x24DA;\n  t['kcommaaccent'] = 0x0137;\n  t['kdotbelow'] = 0x1E33;\n  t['keharmenian'] = 0x0584;\n  t['kehiragana'] = 0x3051;\n  t['kekatakana'] = 0x30B1;\n  t['kekatakanahalfwidth'] = 0xFF79;\n  t['kenarmenian'] = 0x056F;\n  t['kesmallkatakana'] = 0x30F6;\n  t['kgreenlandic'] = 0x0138;\n  t['khabengali'] = 0x0996;\n  t['khacyrillic'] = 0x0445;\n  t['khadeva'] = 0x0916;\n  t['khagujarati'] = 0x0A96;\n  t['khagurmukhi'] = 0x0A16;\n  t['khaharabic'] = 0x062E;\n  t['khahfinalarabic'] = 0xFEA6;\n  t['khahinitialarabic'] = 0xFEA7;\n  t['khahmedialarabic'] = 0xFEA8;\n  t['kheicoptic'] = 0x03E7;\n  t['khhadeva'] = 0x0959;\n  t['khhagurmukhi'] = 0x0A59;\n  t['khieukhacirclekorean'] = 0x3278;\n  t['khieukhaparenkorean'] = 0x3218;\n  t['khieukhcirclekorean'] = 0x326A;\n  t['khieukhkorean'] = 0x314B;\n  t['khieukhparenkorean'] = 0x320A;\n  t['khokhaithai'] = 0x0E02;\n  t['khokhonthai'] = 0x0E05;\n  t['khokhuatthai'] = 0x0E03;\n  t['khokhwaithai'] = 0x0E04;\n  t['khomutthai'] = 0x0E5B;\n  t['khook'] = 0x0199;\n  t['khorakhangthai'] = 0x0E06;\n  t['khzsquare'] = 0x3391;\n  t['kihiragana'] = 0x304D;\n  t['kikatakana'] = 0x30AD;\n  t['kikatakanahalfwidth'] = 0xFF77;\n  t['kiroguramusquare'] = 0x3315;\n  t['kiromeetorusquare'] = 0x3316;\n  t['kirosquare'] = 0x3314;\n  t['kiyeokacirclekorean'] = 0x326E;\n  t['kiyeokaparenkorean'] = 0x320E;\n  t['kiyeokcirclekorean'] = 0x3260;\n  t['kiyeokkorean'] = 0x3131;\n  t['kiyeokparenkorean'] = 0x3200;\n  t['kiyeoksioskorean'] = 0x3133;\n  t['kjecyrillic'] = 0x045C;\n  t['klinebelow'] = 0x1E35;\n  t['klsquare'] = 0x3398;\n  t['kmcubedsquare'] = 0x33A6;\n  t['kmonospace'] = 0xFF4B;\n  t['kmsquaredsquare'] = 0x33A2;\n  t['kohiragana'] = 0x3053;\n  t['kohmsquare'] = 0x33C0;\n  t['kokaithai'] = 0x0E01;\n  t['kokatakana'] = 0x30B3;\n  t['kokatakanahalfwidth'] = 0xFF7A;\n  t['kooposquare'] = 0x331E;\n  t['koppacyrillic'] = 0x0481;\n  t['koreanstandardsymbol'] = 0x327F;\n  t['koroniscmb'] = 0x0343;\n  t['kparen'] = 0x24A6;\n  t['kpasquare'] = 0x33AA;\n  t['ksicyrillic'] = 0x046F;\n  t['ktsquare'] = 0x33CF;\n  t['kturned'] = 0x029E;\n  t['kuhiragana'] = 0x304F;\n  t['kukatakana'] = 0x30AF;\n  t['kukatakanahalfwidth'] = 0xFF78;\n  t['kvsquare'] = 0x33B8;\n  t['kwsquare'] = 0x33BE;\n  t['l'] = 0x006C;\n  t['labengali'] = 0x09B2;\n  t['lacute'] = 0x013A;\n  t['ladeva'] = 0x0932;\n  t['lagujarati'] = 0x0AB2;\n  t['lagurmukhi'] = 0x0A32;\n  t['lakkhangyaothai'] = 0x0E45;\n  t['lamaleffinalarabic'] = 0xFEFC;\n  t['lamalefhamzaabovefinalarabic'] = 0xFEF8;\n  t['lamalefhamzaaboveisolatedarabic'] = 0xFEF7;\n  t['lamalefhamzabelowfinalarabic'] = 0xFEFA;\n  t['lamalefhamzabelowisolatedarabic'] = 0xFEF9;\n  t['lamalefisolatedarabic'] = 0xFEFB;\n  t['lamalefmaddaabovefinalarabic'] = 0xFEF6;\n  t['lamalefmaddaaboveisolatedarabic'] = 0xFEF5;\n  t['lamarabic'] = 0x0644;\n  t['lambda'] = 0x03BB;\n  t['lambdastroke'] = 0x019B;\n  t['lamed'] = 0x05DC;\n  t['lameddagesh'] = 0xFB3C;\n  t['lameddageshhebrew'] = 0xFB3C;\n  t['lamedhebrew'] = 0x05DC;\n  t['lamfinalarabic'] = 0xFEDE;\n  t['lamhahinitialarabic'] = 0xFCCA;\n  t['laminitialarabic'] = 0xFEDF;\n  t['lamjeeminitialarabic'] = 0xFCC9;\n  t['lamkhahinitialarabic'] = 0xFCCB;\n  t['lamlamhehisolatedarabic'] = 0xFDF2;\n  t['lammedialarabic'] = 0xFEE0;\n  t['lammeemhahinitialarabic'] = 0xFD88;\n  t['lammeeminitialarabic'] = 0xFCCC;\n  t['largecircle'] = 0x25EF;\n  t['lbar'] = 0x019A;\n  t['lbelt'] = 0x026C;\n  t['lbopomofo'] = 0x310C;\n  t['lcaron'] = 0x013E;\n  t['lcedilla'] = 0x013C;\n  t['lcircle'] = 0x24DB;\n  t['lcircumflexbelow'] = 0x1E3D;\n  t['lcommaaccent'] = 0x013C;\n  t['ldot'] = 0x0140;\n  t['ldotaccent'] = 0x0140;\n  t['ldotbelow'] = 0x1E37;\n  t['ldotbelowmacron'] = 0x1E39;\n  t['leftangleabovecmb'] = 0x031A;\n  t['lefttackbelowcmb'] = 0x0318;\n  t['less'] = 0x003C;\n  t['lessequal'] = 0x2264;\n  t['lessequalorgreater'] = 0x22DA;\n  t['lessmonospace'] = 0xFF1C;\n  t['lessorequivalent'] = 0x2272;\n  t['lessorgreater'] = 0x2276;\n  t['lessoverequal'] = 0x2266;\n  t['lesssmall'] = 0xFE64;\n  t['lezh'] = 0x026E;\n  t['lfblock'] = 0x258C;\n  t['lhookretroflex'] = 0x026D;\n  t['lira'] = 0x20A4;\n  t['liwnarmenian'] = 0x056C;\n  t['lj'] = 0x01C9;\n  t['ljecyrillic'] = 0x0459;\n  t['ll'] = 0xF6C0;\n  t['lladeva'] = 0x0933;\n  t['llagujarati'] = 0x0AB3;\n  t['llinebelow'] = 0x1E3B;\n  t['llladeva'] = 0x0934;\n  t['llvocalicbengali'] = 0x09E1;\n  t['llvocalicdeva'] = 0x0961;\n  t['llvocalicvowelsignbengali'] = 0x09E3;\n  t['llvocalicvowelsigndeva'] = 0x0963;\n  t['lmiddletilde'] = 0x026B;\n  t['lmonospace'] = 0xFF4C;\n  t['lmsquare'] = 0x33D0;\n  t['lochulathai'] = 0x0E2C;\n  t['logicaland'] = 0x2227;\n  t['logicalnot'] = 0x00AC;\n  t['logicalnotreversed'] = 0x2310;\n  t['logicalor'] = 0x2228;\n  t['lolingthai'] = 0x0E25;\n  t['longs'] = 0x017F;\n  t['lowlinecenterline'] = 0xFE4E;\n  t['lowlinecmb'] = 0x0332;\n  t['lowlinedashed'] = 0xFE4D;\n  t['lozenge'] = 0x25CA;\n  t['lparen'] = 0x24A7;\n  t['lslash'] = 0x0142;\n  t['lsquare'] = 0x2113;\n  t['lsuperior'] = 0xF6EE;\n  t['ltshade'] = 0x2591;\n  t['luthai'] = 0x0E26;\n  t['lvocalicbengali'] = 0x098C;\n  t['lvocalicdeva'] = 0x090C;\n  t['lvocalicvowelsignbengali'] = 0x09E2;\n  t['lvocalicvowelsigndeva'] = 0x0962;\n  t['lxsquare'] = 0x33D3;\n  t['m'] = 0x006D;\n  t['mabengali'] = 0x09AE;\n  t['macron'] = 0x00AF;\n  t['macronbelowcmb'] = 0x0331;\n  t['macroncmb'] = 0x0304;\n  t['macronlowmod'] = 0x02CD;\n  t['macronmonospace'] = 0xFFE3;\n  t['macute'] = 0x1E3F;\n  t['madeva'] = 0x092E;\n  t['magujarati'] = 0x0AAE;\n  t['magurmukhi'] = 0x0A2E;\n  t['mahapakhhebrew'] = 0x05A4;\n  t['mahapakhlefthebrew'] = 0x05A4;\n  t['mahiragana'] = 0x307E;\n  t['maichattawalowleftthai'] = 0xF895;\n  t['maichattawalowrightthai'] = 0xF894;\n  t['maichattawathai'] = 0x0E4B;\n  t['maichattawaupperleftthai'] = 0xF893;\n  t['maieklowleftthai'] = 0xF88C;\n  t['maieklowrightthai'] = 0xF88B;\n  t['maiekthai'] = 0x0E48;\n  t['maiekupperleftthai'] = 0xF88A;\n  t['maihanakatleftthai'] = 0xF884;\n  t['maihanakatthai'] = 0x0E31;\n  t['maitaikhuleftthai'] = 0xF889;\n  t['maitaikhuthai'] = 0x0E47;\n  t['maitholowleftthai'] = 0xF88F;\n  t['maitholowrightthai'] = 0xF88E;\n  t['maithothai'] = 0x0E49;\n  t['maithoupperleftthai'] = 0xF88D;\n  t['maitrilowleftthai'] = 0xF892;\n  t['maitrilowrightthai'] = 0xF891;\n  t['maitrithai'] = 0x0E4A;\n  t['maitriupperleftthai'] = 0xF890;\n  t['maiyamokthai'] = 0x0E46;\n  t['makatakana'] = 0x30DE;\n  t['makatakanahalfwidth'] = 0xFF8F;\n  t['male'] = 0x2642;\n  t['mansyonsquare'] = 0x3347;\n  t['maqafhebrew'] = 0x05BE;\n  t['mars'] = 0x2642;\n  t['masoracirclehebrew'] = 0x05AF;\n  t['masquare'] = 0x3383;\n  t['mbopomofo'] = 0x3107;\n  t['mbsquare'] = 0x33D4;\n  t['mcircle'] = 0x24DC;\n  t['mcubedsquare'] = 0x33A5;\n  t['mdotaccent'] = 0x1E41;\n  t['mdotbelow'] = 0x1E43;\n  t['meemarabic'] = 0x0645;\n  t['meemfinalarabic'] = 0xFEE2;\n  t['meeminitialarabic'] = 0xFEE3;\n  t['meemmedialarabic'] = 0xFEE4;\n  t['meemmeeminitialarabic'] = 0xFCD1;\n  t['meemmeemisolatedarabic'] = 0xFC48;\n  t['meetorusquare'] = 0x334D;\n  t['mehiragana'] = 0x3081;\n  t['meizierasquare'] = 0x337E;\n  t['mekatakana'] = 0x30E1;\n  t['mekatakanahalfwidth'] = 0xFF92;\n  t['mem'] = 0x05DE;\n  t['memdagesh'] = 0xFB3E;\n  t['memdageshhebrew'] = 0xFB3E;\n  t['memhebrew'] = 0x05DE;\n  t['menarmenian'] = 0x0574;\n  t['merkhahebrew'] = 0x05A5;\n  t['merkhakefulahebrew'] = 0x05A6;\n  t['merkhakefulalefthebrew'] = 0x05A6;\n  t['merkhalefthebrew'] = 0x05A5;\n  t['mhook'] = 0x0271;\n  t['mhzsquare'] = 0x3392;\n  t['middledotkatakanahalfwidth'] = 0xFF65;\n  t['middot'] = 0x00B7;\n  t['mieumacirclekorean'] = 0x3272;\n  t['mieumaparenkorean'] = 0x3212;\n  t['mieumcirclekorean'] = 0x3264;\n  t['mieumkorean'] = 0x3141;\n  t['mieumpansioskorean'] = 0x3170;\n  t['mieumparenkorean'] = 0x3204;\n  t['mieumpieupkorean'] = 0x316E;\n  t['mieumsioskorean'] = 0x316F;\n  t['mihiragana'] = 0x307F;\n  t['mikatakana'] = 0x30DF;\n  t['mikatakanahalfwidth'] = 0xFF90;\n  t['minus'] = 0x2212;\n  t['minusbelowcmb'] = 0x0320;\n  t['minuscircle'] = 0x2296;\n  t['minusmod'] = 0x02D7;\n  t['minusplus'] = 0x2213;\n  t['minute'] = 0x2032;\n  t['miribaarusquare'] = 0x334A;\n  t['mirisquare'] = 0x3349;\n  t['mlonglegturned'] = 0x0270;\n  t['mlsquare'] = 0x3396;\n  t['mmcubedsquare'] = 0x33A3;\n  t['mmonospace'] = 0xFF4D;\n  t['mmsquaredsquare'] = 0x339F;\n  t['mohiragana'] = 0x3082;\n  t['mohmsquare'] = 0x33C1;\n  t['mokatakana'] = 0x30E2;\n  t['mokatakanahalfwidth'] = 0xFF93;\n  t['molsquare'] = 0x33D6;\n  t['momathai'] = 0x0E21;\n  t['moverssquare'] = 0x33A7;\n  t['moverssquaredsquare'] = 0x33A8;\n  t['mparen'] = 0x24A8;\n  t['mpasquare'] = 0x33AB;\n  t['mssquare'] = 0x33B3;\n  t['msuperior'] = 0xF6EF;\n  t['mturned'] = 0x026F;\n  t['mu'] = 0x00B5;\n  t['mu1'] = 0x00B5;\n  t['muasquare'] = 0x3382;\n  t['muchgreater'] = 0x226B;\n  t['muchless'] = 0x226A;\n  t['mufsquare'] = 0x338C;\n  t['mugreek'] = 0x03BC;\n  t['mugsquare'] = 0x338D;\n  t['muhiragana'] = 0x3080;\n  t['mukatakana'] = 0x30E0;\n  t['mukatakanahalfwidth'] = 0xFF91;\n  t['mulsquare'] = 0x3395;\n  t['multiply'] = 0x00D7;\n  t['mumsquare'] = 0x339B;\n  t['munahhebrew'] = 0x05A3;\n  t['munahlefthebrew'] = 0x05A3;\n  t['musicalnote'] = 0x266A;\n  t['musicalnotedbl'] = 0x266B;\n  t['musicflatsign'] = 0x266D;\n  t['musicsharpsign'] = 0x266F;\n  t['mussquare'] = 0x33B2;\n  t['muvsquare'] = 0x33B6;\n  t['muwsquare'] = 0x33BC;\n  t['mvmegasquare'] = 0x33B9;\n  t['mvsquare'] = 0x33B7;\n  t['mwmegasquare'] = 0x33BF;\n  t['mwsquare'] = 0x33BD;\n  t['n'] = 0x006E;\n  t['nabengali'] = 0x09A8;\n  t['nabla'] = 0x2207;\n  t['nacute'] = 0x0144;\n  t['nadeva'] = 0x0928;\n  t['nagujarati'] = 0x0AA8;\n  t['nagurmukhi'] = 0x0A28;\n  t['nahiragana'] = 0x306A;\n  t['nakatakana'] = 0x30CA;\n  t['nakatakanahalfwidth'] = 0xFF85;\n  t['napostrophe'] = 0x0149;\n  t['nasquare'] = 0x3381;\n  t['nbopomofo'] = 0x310B;\n  t['nbspace'] = 0x00A0;\n  t['ncaron'] = 0x0148;\n  t['ncedilla'] = 0x0146;\n  t['ncircle'] = 0x24DD;\n  t['ncircumflexbelow'] = 0x1E4B;\n  t['ncommaaccent'] = 0x0146;\n  t['ndotaccent'] = 0x1E45;\n  t['ndotbelow'] = 0x1E47;\n  t['nehiragana'] = 0x306D;\n  t['nekatakana'] = 0x30CD;\n  t['nekatakanahalfwidth'] = 0xFF88;\n  t['newsheqelsign'] = 0x20AA;\n  t['nfsquare'] = 0x338B;\n  t['ngabengali'] = 0x0999;\n  t['ngadeva'] = 0x0919;\n  t['ngagujarati'] = 0x0A99;\n  t['ngagurmukhi'] = 0x0A19;\n  t['ngonguthai'] = 0x0E07;\n  t['nhiragana'] = 0x3093;\n  t['nhookleft'] = 0x0272;\n  t['nhookretroflex'] = 0x0273;\n  t['nieunacirclekorean'] = 0x326F;\n  t['nieunaparenkorean'] = 0x320F;\n  t['nieuncieuckorean'] = 0x3135;\n  t['nieuncirclekorean'] = 0x3261;\n  t['nieunhieuhkorean'] = 0x3136;\n  t['nieunkorean'] = 0x3134;\n  t['nieunpansioskorean'] = 0x3168;\n  t['nieunparenkorean'] = 0x3201;\n  t['nieunsioskorean'] = 0x3167;\n  t['nieuntikeutkorean'] = 0x3166;\n  t['nihiragana'] = 0x306B;\n  t['nikatakana'] = 0x30CB;\n  t['nikatakanahalfwidth'] = 0xFF86;\n  t['nikhahitleftthai'] = 0xF899;\n  t['nikhahitthai'] = 0x0E4D;\n  t['nine'] = 0x0039;\n  t['ninearabic'] = 0x0669;\n  t['ninebengali'] = 0x09EF;\n  t['ninecircle'] = 0x2468;\n  t['ninecircleinversesansserif'] = 0x2792;\n  t['ninedeva'] = 0x096F;\n  t['ninegujarati'] = 0x0AEF;\n  t['ninegurmukhi'] = 0x0A6F;\n  t['ninehackarabic'] = 0x0669;\n  t['ninehangzhou'] = 0x3029;\n  t['nineideographicparen'] = 0x3228;\n  t['nineinferior'] = 0x2089;\n  t['ninemonospace'] = 0xFF19;\n  t['nineoldstyle'] = 0xF739;\n  t['nineparen'] = 0x247C;\n  t['nineperiod'] = 0x2490;\n  t['ninepersian'] = 0x06F9;\n  t['nineroman'] = 0x2178;\n  t['ninesuperior'] = 0x2079;\n  t['nineteencircle'] = 0x2472;\n  t['nineteenparen'] = 0x2486;\n  t['nineteenperiod'] = 0x249A;\n  t['ninethai'] = 0x0E59;\n  t['nj'] = 0x01CC;\n  t['njecyrillic'] = 0x045A;\n  t['nkatakana'] = 0x30F3;\n  t['nkatakanahalfwidth'] = 0xFF9D;\n  t['nlegrightlong'] = 0x019E;\n  t['nlinebelow'] = 0x1E49;\n  t['nmonospace'] = 0xFF4E;\n  t['nmsquare'] = 0x339A;\n  t['nnabengali'] = 0x09A3;\n  t['nnadeva'] = 0x0923;\n  t['nnagujarati'] = 0x0AA3;\n  t['nnagurmukhi'] = 0x0A23;\n  t['nnnadeva'] = 0x0929;\n  t['nohiragana'] = 0x306E;\n  t['nokatakana'] = 0x30CE;\n  t['nokatakanahalfwidth'] = 0xFF89;\n  t['nonbreakingspace'] = 0x00A0;\n  t['nonenthai'] = 0x0E13;\n  t['nonuthai'] = 0x0E19;\n  t['noonarabic'] = 0x0646;\n  t['noonfinalarabic'] = 0xFEE6;\n  t['noonghunnaarabic'] = 0x06BA;\n  t['noonghunnafinalarabic'] = 0xFB9F;\n  t['nooninitialarabic'] = 0xFEE7;\n  t['noonjeeminitialarabic'] = 0xFCD2;\n  t['noonjeemisolatedarabic'] = 0xFC4B;\n  t['noonmedialarabic'] = 0xFEE8;\n  t['noonmeeminitialarabic'] = 0xFCD5;\n  t['noonmeemisolatedarabic'] = 0xFC4E;\n  t['noonnoonfinalarabic'] = 0xFC8D;\n  t['notcontains'] = 0x220C;\n  t['notelement'] = 0x2209;\n  t['notelementof'] = 0x2209;\n  t['notequal'] = 0x2260;\n  t['notgreater'] = 0x226F;\n  t['notgreaternorequal'] = 0x2271;\n  t['notgreaternorless'] = 0x2279;\n  t['notidentical'] = 0x2262;\n  t['notless'] = 0x226E;\n  t['notlessnorequal'] = 0x2270;\n  t['notparallel'] = 0x2226;\n  t['notprecedes'] = 0x2280;\n  t['notsubset'] = 0x2284;\n  t['notsucceeds'] = 0x2281;\n  t['notsuperset'] = 0x2285;\n  t['nowarmenian'] = 0x0576;\n  t['nparen'] = 0x24A9;\n  t['nssquare'] = 0x33B1;\n  t['nsuperior'] = 0x207F;\n  t['ntilde'] = 0x00F1;\n  t['nu'] = 0x03BD;\n  t['nuhiragana'] = 0x306C;\n  t['nukatakana'] = 0x30CC;\n  t['nukatakanahalfwidth'] = 0xFF87;\n  t['nuktabengali'] = 0x09BC;\n  t['nuktadeva'] = 0x093C;\n  t['nuktagujarati'] = 0x0ABC;\n  t['nuktagurmukhi'] = 0x0A3C;\n  t['numbersign'] = 0x0023;\n  t['numbersignmonospace'] = 0xFF03;\n  t['numbersignsmall'] = 0xFE5F;\n  t['numeralsigngreek'] = 0x0374;\n  t['numeralsignlowergreek'] = 0x0375;\n  t['numero'] = 0x2116;\n  t['nun'] = 0x05E0;\n  t['nundagesh'] = 0xFB40;\n  t['nundageshhebrew'] = 0xFB40;\n  t['nunhebrew'] = 0x05E0;\n  t['nvsquare'] = 0x33B5;\n  t['nwsquare'] = 0x33BB;\n  t['nyabengali'] = 0x099E;\n  t['nyadeva'] = 0x091E;\n  t['nyagujarati'] = 0x0A9E;\n  t['nyagurmukhi'] = 0x0A1E;\n  t['o'] = 0x006F;\n  t['oacute'] = 0x00F3;\n  t['oangthai'] = 0x0E2D;\n  t['obarred'] = 0x0275;\n  t['obarredcyrillic'] = 0x04E9;\n  t['obarreddieresiscyrillic'] = 0x04EB;\n  t['obengali'] = 0x0993;\n  t['obopomofo'] = 0x311B;\n  t['obreve'] = 0x014F;\n  t['ocandradeva'] = 0x0911;\n  t['ocandragujarati'] = 0x0A91;\n  t['ocandravowelsigndeva'] = 0x0949;\n  t['ocandravowelsigngujarati'] = 0x0AC9;\n  t['ocaron'] = 0x01D2;\n  t['ocircle'] = 0x24DE;\n  t['ocircumflex'] = 0x00F4;\n  t['ocircumflexacute'] = 0x1ED1;\n  t['ocircumflexdotbelow'] = 0x1ED9;\n  t['ocircumflexgrave'] = 0x1ED3;\n  t['ocircumflexhookabove'] = 0x1ED5;\n  t['ocircumflextilde'] = 0x1ED7;\n  t['ocyrillic'] = 0x043E;\n  t['odblacute'] = 0x0151;\n  t['odblgrave'] = 0x020D;\n  t['odeva'] = 0x0913;\n  t['odieresis'] = 0x00F6;\n  t['odieresiscyrillic'] = 0x04E7;\n  t['odotbelow'] = 0x1ECD;\n  t['oe'] = 0x0153;\n  t['oekorean'] = 0x315A;\n  t['ogonek'] = 0x02DB;\n  t['ogonekcmb'] = 0x0328;\n  t['ograve'] = 0x00F2;\n  t['ogujarati'] = 0x0A93;\n  t['oharmenian'] = 0x0585;\n  t['ohiragana'] = 0x304A;\n  t['ohookabove'] = 0x1ECF;\n  t['ohorn'] = 0x01A1;\n  t['ohornacute'] = 0x1EDB;\n  t['ohorndotbelow'] = 0x1EE3;\n  t['ohorngrave'] = 0x1EDD;\n  t['ohornhookabove'] = 0x1EDF;\n  t['ohorntilde'] = 0x1EE1;\n  t['ohungarumlaut'] = 0x0151;\n  t['oi'] = 0x01A3;\n  t['oinvertedbreve'] = 0x020F;\n  t['okatakana'] = 0x30AA;\n  t['okatakanahalfwidth'] = 0xFF75;\n  t['okorean'] = 0x3157;\n  t['olehebrew'] = 0x05AB;\n  t['omacron'] = 0x014D;\n  t['omacronacute'] = 0x1E53;\n  t['omacrongrave'] = 0x1E51;\n  t['omdeva'] = 0x0950;\n  t['omega'] = 0x03C9;\n  t['omega1'] = 0x03D6;\n  t['omegacyrillic'] = 0x0461;\n  t['omegalatinclosed'] = 0x0277;\n  t['omegaroundcyrillic'] = 0x047B;\n  t['omegatitlocyrillic'] = 0x047D;\n  t['omegatonos'] = 0x03CE;\n  t['omgujarati'] = 0x0AD0;\n  t['omicron'] = 0x03BF;\n  t['omicrontonos'] = 0x03CC;\n  t['omonospace'] = 0xFF4F;\n  t['one'] = 0x0031;\n  t['onearabic'] = 0x0661;\n  t['onebengali'] = 0x09E7;\n  t['onecircle'] = 0x2460;\n  t['onecircleinversesansserif'] = 0x278A;\n  t['onedeva'] = 0x0967;\n  t['onedotenleader'] = 0x2024;\n  t['oneeighth'] = 0x215B;\n  t['onefitted'] = 0xF6DC;\n  t['onegujarati'] = 0x0AE7;\n  t['onegurmukhi'] = 0x0A67;\n  t['onehackarabic'] = 0x0661;\n  t['onehalf'] = 0x00BD;\n  t['onehangzhou'] = 0x3021;\n  t['oneideographicparen'] = 0x3220;\n  t['oneinferior'] = 0x2081;\n  t['onemonospace'] = 0xFF11;\n  t['onenumeratorbengali'] = 0x09F4;\n  t['oneoldstyle'] = 0xF731;\n  t['oneparen'] = 0x2474;\n  t['oneperiod'] = 0x2488;\n  t['onepersian'] = 0x06F1;\n  t['onequarter'] = 0x00BC;\n  t['oneroman'] = 0x2170;\n  t['onesuperior'] = 0x00B9;\n  t['onethai'] = 0x0E51;\n  t['onethird'] = 0x2153;\n  t['oogonek'] = 0x01EB;\n  t['oogonekmacron'] = 0x01ED;\n  t['oogurmukhi'] = 0x0A13;\n  t['oomatragurmukhi'] = 0x0A4B;\n  t['oopen'] = 0x0254;\n  t['oparen'] = 0x24AA;\n  t['openbullet'] = 0x25E6;\n  t['option'] = 0x2325;\n  t['ordfeminine'] = 0x00AA;\n  t['ordmasculine'] = 0x00BA;\n  t['orthogonal'] = 0x221F;\n  t['oshortdeva'] = 0x0912;\n  t['oshortvowelsigndeva'] = 0x094A;\n  t['oslash'] = 0x00F8;\n  t['oslashacute'] = 0x01FF;\n  t['osmallhiragana'] = 0x3049;\n  t['osmallkatakana'] = 0x30A9;\n  t['osmallkatakanahalfwidth'] = 0xFF6B;\n  t['ostrokeacute'] = 0x01FF;\n  t['osuperior'] = 0xF6F0;\n  t['otcyrillic'] = 0x047F;\n  t['otilde'] = 0x00F5;\n  t['otildeacute'] = 0x1E4D;\n  t['otildedieresis'] = 0x1E4F;\n  t['oubopomofo'] = 0x3121;\n  t['overline'] = 0x203E;\n  t['overlinecenterline'] = 0xFE4A;\n  t['overlinecmb'] = 0x0305;\n  t['overlinedashed'] = 0xFE49;\n  t['overlinedblwavy'] = 0xFE4C;\n  t['overlinewavy'] = 0xFE4B;\n  t['overscore'] = 0x00AF;\n  t['ovowelsignbengali'] = 0x09CB;\n  t['ovowelsigndeva'] = 0x094B;\n  t['ovowelsigngujarati'] = 0x0ACB;\n  t['p'] = 0x0070;\n  t['paampssquare'] = 0x3380;\n  t['paasentosquare'] = 0x332B;\n  t['pabengali'] = 0x09AA;\n  t['pacute'] = 0x1E55;\n  t['padeva'] = 0x092A;\n  t['pagedown'] = 0x21DF;\n  t['pageup'] = 0x21DE;\n  t['pagujarati'] = 0x0AAA;\n  t['pagurmukhi'] = 0x0A2A;\n  t['pahiragana'] = 0x3071;\n  t['paiyannoithai'] = 0x0E2F;\n  t['pakatakana'] = 0x30D1;\n  t['palatalizationcyrilliccmb'] = 0x0484;\n  t['palochkacyrillic'] = 0x04C0;\n  t['pansioskorean'] = 0x317F;\n  t['paragraph'] = 0x00B6;\n  t['parallel'] = 0x2225;\n  t['parenleft'] = 0x0028;\n  t['parenleftaltonearabic'] = 0xFD3E;\n  t['parenleftbt'] = 0xF8ED;\n  t['parenleftex'] = 0xF8EC;\n  t['parenleftinferior'] = 0x208D;\n  t['parenleftmonospace'] = 0xFF08;\n  t['parenleftsmall'] = 0xFE59;\n  t['parenleftsuperior'] = 0x207D;\n  t['parenlefttp'] = 0xF8EB;\n  t['parenleftvertical'] = 0xFE35;\n  t['parenright'] = 0x0029;\n  t['parenrightaltonearabic'] = 0xFD3F;\n  t['parenrightbt'] = 0xF8F8;\n  t['parenrightex'] = 0xF8F7;\n  t['parenrightinferior'] = 0x208E;\n  t['parenrightmonospace'] = 0xFF09;\n  t['parenrightsmall'] = 0xFE5A;\n  t['parenrightsuperior'] = 0x207E;\n  t['parenrighttp'] = 0xF8F6;\n  t['parenrightvertical'] = 0xFE36;\n  t['partialdiff'] = 0x2202;\n  t['paseqhebrew'] = 0x05C0;\n  t['pashtahebrew'] = 0x0599;\n  t['pasquare'] = 0x33A9;\n  t['patah'] = 0x05B7;\n  t['patah11'] = 0x05B7;\n  t['patah1d'] = 0x05B7;\n  t['patah2a'] = 0x05B7;\n  t['patahhebrew'] = 0x05B7;\n  t['patahnarrowhebrew'] = 0x05B7;\n  t['patahquarterhebrew'] = 0x05B7;\n  t['patahwidehebrew'] = 0x05B7;\n  t['pazerhebrew'] = 0x05A1;\n  t['pbopomofo'] = 0x3106;\n  t['pcircle'] = 0x24DF;\n  t['pdotaccent'] = 0x1E57;\n  t['pe'] = 0x05E4;\n  t['pecyrillic'] = 0x043F;\n  t['pedagesh'] = 0xFB44;\n  t['pedageshhebrew'] = 0xFB44;\n  t['peezisquare'] = 0x333B;\n  t['pefinaldageshhebrew'] = 0xFB43;\n  t['peharabic'] = 0x067E;\n  t['peharmenian'] = 0x057A;\n  t['pehebrew'] = 0x05E4;\n  t['pehfinalarabic'] = 0xFB57;\n  t['pehinitialarabic'] = 0xFB58;\n  t['pehiragana'] = 0x307A;\n  t['pehmedialarabic'] = 0xFB59;\n  t['pekatakana'] = 0x30DA;\n  t['pemiddlehookcyrillic'] = 0x04A7;\n  t['perafehebrew'] = 0xFB4E;\n  t['percent'] = 0x0025;\n  t['percentarabic'] = 0x066A;\n  t['percentmonospace'] = 0xFF05;\n  t['percentsmall'] = 0xFE6A;\n  t['period'] = 0x002E;\n  t['periodarmenian'] = 0x0589;\n  t['periodcentered'] = 0x00B7;\n  t['periodhalfwidth'] = 0xFF61;\n  t['periodinferior'] = 0xF6E7;\n  t['periodmonospace'] = 0xFF0E;\n  t['periodsmall'] = 0xFE52;\n  t['periodsuperior'] = 0xF6E8;\n  t['perispomenigreekcmb'] = 0x0342;\n  t['perpendicular'] = 0x22A5;\n  t['perthousand'] = 0x2030;\n  t['peseta'] = 0x20A7;\n  t['pfsquare'] = 0x338A;\n  t['phabengali'] = 0x09AB;\n  t['phadeva'] = 0x092B;\n  t['phagujarati'] = 0x0AAB;\n  t['phagurmukhi'] = 0x0A2B;\n  t['phi'] = 0x03C6;\n  t['phi1'] = 0x03D5;\n  t['phieuphacirclekorean'] = 0x327A;\n  t['phieuphaparenkorean'] = 0x321A;\n  t['phieuphcirclekorean'] = 0x326C;\n  t['phieuphkorean'] = 0x314D;\n  t['phieuphparenkorean'] = 0x320C;\n  t['philatin'] = 0x0278;\n  t['phinthuthai'] = 0x0E3A;\n  t['phisymbolgreek'] = 0x03D5;\n  t['phook'] = 0x01A5;\n  t['phophanthai'] = 0x0E1E;\n  t['phophungthai'] = 0x0E1C;\n  t['phosamphaothai'] = 0x0E20;\n  t['pi'] = 0x03C0;\n  t['pieupacirclekorean'] = 0x3273;\n  t['pieupaparenkorean'] = 0x3213;\n  t['pieupcieuckorean'] = 0x3176;\n  t['pieupcirclekorean'] = 0x3265;\n  t['pieupkiyeokkorean'] = 0x3172;\n  t['pieupkorean'] = 0x3142;\n  t['pieupparenkorean'] = 0x3205;\n  t['pieupsioskiyeokkorean'] = 0x3174;\n  t['pieupsioskorean'] = 0x3144;\n  t['pieupsiostikeutkorean'] = 0x3175;\n  t['pieupthieuthkorean'] = 0x3177;\n  t['pieuptikeutkorean'] = 0x3173;\n  t['pihiragana'] = 0x3074;\n  t['pikatakana'] = 0x30D4;\n  t['pisymbolgreek'] = 0x03D6;\n  t['piwrarmenian'] = 0x0583;\n  t['plus'] = 0x002B;\n  t['plusbelowcmb'] = 0x031F;\n  t['pluscircle'] = 0x2295;\n  t['plusminus'] = 0x00B1;\n  t['plusmod'] = 0x02D6;\n  t['plusmonospace'] = 0xFF0B;\n  t['plussmall'] = 0xFE62;\n  t['plussuperior'] = 0x207A;\n  t['pmonospace'] = 0xFF50;\n  t['pmsquare'] = 0x33D8;\n  t['pohiragana'] = 0x307D;\n  t['pointingindexdownwhite'] = 0x261F;\n  t['pointingindexleftwhite'] = 0x261C;\n  t['pointingindexrightwhite'] = 0x261E;\n  t['pointingindexupwhite'] = 0x261D;\n  t['pokatakana'] = 0x30DD;\n  t['poplathai'] = 0x0E1B;\n  t['postalmark'] = 0x3012;\n  t['postalmarkface'] = 0x3020;\n  t['pparen'] = 0x24AB;\n  t['precedes'] = 0x227A;\n  t['prescription'] = 0x211E;\n  t['primemod'] = 0x02B9;\n  t['primereversed'] = 0x2035;\n  t['product'] = 0x220F;\n  t['projective'] = 0x2305;\n  t['prolongedkana'] = 0x30FC;\n  t['propellor'] = 0x2318;\n  t['propersubset'] = 0x2282;\n  t['propersuperset'] = 0x2283;\n  t['proportion'] = 0x2237;\n  t['proportional'] = 0x221D;\n  t['psi'] = 0x03C8;\n  t['psicyrillic'] = 0x0471;\n  t['psilipneumatacyrilliccmb'] = 0x0486;\n  t['pssquare'] = 0x33B0;\n  t['puhiragana'] = 0x3077;\n  t['pukatakana'] = 0x30D7;\n  t['pvsquare'] = 0x33B4;\n  t['pwsquare'] = 0x33BA;\n  t['q'] = 0x0071;\n  t['qadeva'] = 0x0958;\n  t['qadmahebrew'] = 0x05A8;\n  t['qafarabic'] = 0x0642;\n  t['qaffinalarabic'] = 0xFED6;\n  t['qafinitialarabic'] = 0xFED7;\n  t['qafmedialarabic'] = 0xFED8;\n  t['qamats'] = 0x05B8;\n  t['qamats10'] = 0x05B8;\n  t['qamats1a'] = 0x05B8;\n  t['qamats1c'] = 0x05B8;\n  t['qamats27'] = 0x05B8;\n  t['qamats29'] = 0x05B8;\n  t['qamats33'] = 0x05B8;\n  t['qamatsde'] = 0x05B8;\n  t['qamatshebrew'] = 0x05B8;\n  t['qamatsnarrowhebrew'] = 0x05B8;\n  t['qamatsqatanhebrew'] = 0x05B8;\n  t['qamatsqatannarrowhebrew'] = 0x05B8;\n  t['qamatsqatanquarterhebrew'] = 0x05B8;\n  t['qamatsqatanwidehebrew'] = 0x05B8;\n  t['qamatsquarterhebrew'] = 0x05B8;\n  t['qamatswidehebrew'] = 0x05B8;\n  t['qarneyparahebrew'] = 0x059F;\n  t['qbopomofo'] = 0x3111;\n  t['qcircle'] = 0x24E0;\n  t['qhook'] = 0x02A0;\n  t['qmonospace'] = 0xFF51;\n  t['qof'] = 0x05E7;\n  t['qofdagesh'] = 0xFB47;\n  t['qofdageshhebrew'] = 0xFB47;\n  t['qofhebrew'] = 0x05E7;\n  t['qparen'] = 0x24AC;\n  t['quarternote'] = 0x2669;\n  t['qubuts'] = 0x05BB;\n  t['qubuts18'] = 0x05BB;\n  t['qubuts25'] = 0x05BB;\n  t['qubuts31'] = 0x05BB;\n  t['qubutshebrew'] = 0x05BB;\n  t['qubutsnarrowhebrew'] = 0x05BB;\n  t['qubutsquarterhebrew'] = 0x05BB;\n  t['qubutswidehebrew'] = 0x05BB;\n  t['question'] = 0x003F;\n  t['questionarabic'] = 0x061F;\n  t['questionarmenian'] = 0x055E;\n  t['questiondown'] = 0x00BF;\n  t['questiondownsmall'] = 0xF7BF;\n  t['questiongreek'] = 0x037E;\n  t['questionmonospace'] = 0xFF1F;\n  t['questionsmall'] = 0xF73F;\n  t['quotedbl'] = 0x0022;\n  t['quotedblbase'] = 0x201E;\n  t['quotedblleft'] = 0x201C;\n  t['quotedblmonospace'] = 0xFF02;\n  t['quotedblprime'] = 0x301E;\n  t['quotedblprimereversed'] = 0x301D;\n  t['quotedblright'] = 0x201D;\n  t['quoteleft'] = 0x2018;\n  t['quoteleftreversed'] = 0x201B;\n  t['quotereversed'] = 0x201B;\n  t['quoteright'] = 0x2019;\n  t['quoterightn'] = 0x0149;\n  t['quotesinglbase'] = 0x201A;\n  t['quotesingle'] = 0x0027;\n  t['quotesinglemonospace'] = 0xFF07;\n  t['r'] = 0x0072;\n  t['raarmenian'] = 0x057C;\n  t['rabengali'] = 0x09B0;\n  t['racute'] = 0x0155;\n  t['radeva'] = 0x0930;\n  t['radical'] = 0x221A;\n  t['radicalex'] = 0xF8E5;\n  t['radoverssquare'] = 0x33AE;\n  t['radoverssquaredsquare'] = 0x33AF;\n  t['radsquare'] = 0x33AD;\n  t['rafe'] = 0x05BF;\n  t['rafehebrew'] = 0x05BF;\n  t['ragujarati'] = 0x0AB0;\n  t['ragurmukhi'] = 0x0A30;\n  t['rahiragana'] = 0x3089;\n  t['rakatakana'] = 0x30E9;\n  t['rakatakanahalfwidth'] = 0xFF97;\n  t['ralowerdiagonalbengali'] = 0x09F1;\n  t['ramiddlediagonalbengali'] = 0x09F0;\n  t['ramshorn'] = 0x0264;\n  t['ratio'] = 0x2236;\n  t['rbopomofo'] = 0x3116;\n  t['rcaron'] = 0x0159;\n  t['rcedilla'] = 0x0157;\n  t['rcircle'] = 0x24E1;\n  t['rcommaaccent'] = 0x0157;\n  t['rdblgrave'] = 0x0211;\n  t['rdotaccent'] = 0x1E59;\n  t['rdotbelow'] = 0x1E5B;\n  t['rdotbelowmacron'] = 0x1E5D;\n  t['referencemark'] = 0x203B;\n  t['reflexsubset'] = 0x2286;\n  t['reflexsuperset'] = 0x2287;\n  t['registered'] = 0x00AE;\n  t['registersans'] = 0xF8E8;\n  t['registerserif'] = 0xF6DA;\n  t['reharabic'] = 0x0631;\n  t['reharmenian'] = 0x0580;\n  t['rehfinalarabic'] = 0xFEAE;\n  t['rehiragana'] = 0x308C;\n  t['rekatakana'] = 0x30EC;\n  t['rekatakanahalfwidth'] = 0xFF9A;\n  t['resh'] = 0x05E8;\n  t['reshdageshhebrew'] = 0xFB48;\n  t['reshhebrew'] = 0x05E8;\n  t['reversedtilde'] = 0x223D;\n  t['reviahebrew'] = 0x0597;\n  t['reviamugrashhebrew'] = 0x0597;\n  t['revlogicalnot'] = 0x2310;\n  t['rfishhook'] = 0x027E;\n  t['rfishhookreversed'] = 0x027F;\n  t['rhabengali'] = 0x09DD;\n  t['rhadeva'] = 0x095D;\n  t['rho'] = 0x03C1;\n  t['rhook'] = 0x027D;\n  t['rhookturned'] = 0x027B;\n  t['rhookturnedsuperior'] = 0x02B5;\n  t['rhosymbolgreek'] = 0x03F1;\n  t['rhotichookmod'] = 0x02DE;\n  t['rieulacirclekorean'] = 0x3271;\n  t['rieulaparenkorean'] = 0x3211;\n  t['rieulcirclekorean'] = 0x3263;\n  t['rieulhieuhkorean'] = 0x3140;\n  t['rieulkiyeokkorean'] = 0x313A;\n  t['rieulkiyeoksioskorean'] = 0x3169;\n  t['rieulkorean'] = 0x3139;\n  t['rieulmieumkorean'] = 0x313B;\n  t['rieulpansioskorean'] = 0x316C;\n  t['rieulparenkorean'] = 0x3203;\n  t['rieulphieuphkorean'] = 0x313F;\n  t['rieulpieupkorean'] = 0x313C;\n  t['rieulpieupsioskorean'] = 0x316B;\n  t['rieulsioskorean'] = 0x313D;\n  t['rieulthieuthkorean'] = 0x313E;\n  t['rieultikeutkorean'] = 0x316A;\n  t['rieulyeorinhieuhkorean'] = 0x316D;\n  t['rightangle'] = 0x221F;\n  t['righttackbelowcmb'] = 0x0319;\n  t['righttriangle'] = 0x22BF;\n  t['rihiragana'] = 0x308A;\n  t['rikatakana'] = 0x30EA;\n  t['rikatakanahalfwidth'] = 0xFF98;\n  t['ring'] = 0x02DA;\n  t['ringbelowcmb'] = 0x0325;\n  t['ringcmb'] = 0x030A;\n  t['ringhalfleft'] = 0x02BF;\n  t['ringhalfleftarmenian'] = 0x0559;\n  t['ringhalfleftbelowcmb'] = 0x031C;\n  t['ringhalfleftcentered'] = 0x02D3;\n  t['ringhalfright'] = 0x02BE;\n  t['ringhalfrightbelowcmb'] = 0x0339;\n  t['ringhalfrightcentered'] = 0x02D2;\n  t['rinvertedbreve'] = 0x0213;\n  t['rittorusquare'] = 0x3351;\n  t['rlinebelow'] = 0x1E5F;\n  t['rlongleg'] = 0x027C;\n  t['rlonglegturned'] = 0x027A;\n  t['rmonospace'] = 0xFF52;\n  t['rohiragana'] = 0x308D;\n  t['rokatakana'] = 0x30ED;\n  t['rokatakanahalfwidth'] = 0xFF9B;\n  t['roruathai'] = 0x0E23;\n  t['rparen'] = 0x24AD;\n  t['rrabengali'] = 0x09DC;\n  t['rradeva'] = 0x0931;\n  t['rragurmukhi'] = 0x0A5C;\n  t['rreharabic'] = 0x0691;\n  t['rrehfinalarabic'] = 0xFB8D;\n  t['rrvocalicbengali'] = 0x09E0;\n  t['rrvocalicdeva'] = 0x0960;\n  t['rrvocalicgujarati'] = 0x0AE0;\n  t['rrvocalicvowelsignbengali'] = 0x09C4;\n  t['rrvocalicvowelsigndeva'] = 0x0944;\n  t['rrvocalicvowelsigngujarati'] = 0x0AC4;\n  t['rsuperior'] = 0xF6F1;\n  t['rtblock'] = 0x2590;\n  t['rturned'] = 0x0279;\n  t['rturnedsuperior'] = 0x02B4;\n  t['ruhiragana'] = 0x308B;\n  t['rukatakana'] = 0x30EB;\n  t['rukatakanahalfwidth'] = 0xFF99;\n  t['rupeemarkbengali'] = 0x09F2;\n  t['rupeesignbengali'] = 0x09F3;\n  t['rupiah'] = 0xF6DD;\n  t['ruthai'] = 0x0E24;\n  t['rvocalicbengali'] = 0x098B;\n  t['rvocalicdeva'] = 0x090B;\n  t['rvocalicgujarati'] = 0x0A8B;\n  t['rvocalicvowelsignbengali'] = 0x09C3;\n  t['rvocalicvowelsigndeva'] = 0x0943;\n  t['rvocalicvowelsigngujarati'] = 0x0AC3;\n  t['s'] = 0x0073;\n  t['sabengali'] = 0x09B8;\n  t['sacute'] = 0x015B;\n  t['sacutedotaccent'] = 0x1E65;\n  t['sadarabic'] = 0x0635;\n  t['sadeva'] = 0x0938;\n  t['sadfinalarabic'] = 0xFEBA;\n  t['sadinitialarabic'] = 0xFEBB;\n  t['sadmedialarabic'] = 0xFEBC;\n  t['sagujarati'] = 0x0AB8;\n  t['sagurmukhi'] = 0x0A38;\n  t['sahiragana'] = 0x3055;\n  t['sakatakana'] = 0x30B5;\n  t['sakatakanahalfwidth'] = 0xFF7B;\n  t['sallallahoualayhewasallamarabic'] = 0xFDFA;\n  t['samekh'] = 0x05E1;\n  t['samekhdagesh'] = 0xFB41;\n  t['samekhdageshhebrew'] = 0xFB41;\n  t['samekhhebrew'] = 0x05E1;\n  t['saraaathai'] = 0x0E32;\n  t['saraaethai'] = 0x0E41;\n  t['saraaimaimalaithai'] = 0x0E44;\n  t['saraaimaimuanthai'] = 0x0E43;\n  t['saraamthai'] = 0x0E33;\n  t['saraathai'] = 0x0E30;\n  t['saraethai'] = 0x0E40;\n  t['saraiileftthai'] = 0xF886;\n  t['saraiithai'] = 0x0E35;\n  t['saraileftthai'] = 0xF885;\n  t['saraithai'] = 0x0E34;\n  t['saraothai'] = 0x0E42;\n  t['saraueeleftthai'] = 0xF888;\n  t['saraueethai'] = 0x0E37;\n  t['saraueleftthai'] = 0xF887;\n  t['sarauethai'] = 0x0E36;\n  t['sarauthai'] = 0x0E38;\n  t['sarauuthai'] = 0x0E39;\n  t['sbopomofo'] = 0x3119;\n  t['scaron'] = 0x0161;\n  t['scarondotaccent'] = 0x1E67;\n  t['scedilla'] = 0x015F;\n  t['schwa'] = 0x0259;\n  t['schwacyrillic'] = 0x04D9;\n  t['schwadieresiscyrillic'] = 0x04DB;\n  t['schwahook'] = 0x025A;\n  t['scircle'] = 0x24E2;\n  t['scircumflex'] = 0x015D;\n  t['scommaaccent'] = 0x0219;\n  t['sdotaccent'] = 0x1E61;\n  t['sdotbelow'] = 0x1E63;\n  t['sdotbelowdotaccent'] = 0x1E69;\n  t['seagullbelowcmb'] = 0x033C;\n  t['second'] = 0x2033;\n  t['secondtonechinese'] = 0x02CA;\n  t['section'] = 0x00A7;\n  t['seenarabic'] = 0x0633;\n  t['seenfinalarabic'] = 0xFEB2;\n  t['seeninitialarabic'] = 0xFEB3;\n  t['seenmedialarabic'] = 0xFEB4;\n  t['segol'] = 0x05B6;\n  t['segol13'] = 0x05B6;\n  t['segol1f'] = 0x05B6;\n  t['segol2c'] = 0x05B6;\n  t['segolhebrew'] = 0x05B6;\n  t['segolnarrowhebrew'] = 0x05B6;\n  t['segolquarterhebrew'] = 0x05B6;\n  t['segoltahebrew'] = 0x0592;\n  t['segolwidehebrew'] = 0x05B6;\n  t['seharmenian'] = 0x057D;\n  t['sehiragana'] = 0x305B;\n  t['sekatakana'] = 0x30BB;\n  t['sekatakanahalfwidth'] = 0xFF7E;\n  t['semicolon'] = 0x003B;\n  t['semicolonarabic'] = 0x061B;\n  t['semicolonmonospace'] = 0xFF1B;\n  t['semicolonsmall'] = 0xFE54;\n  t['semivoicedmarkkana'] = 0x309C;\n  t['semivoicedmarkkanahalfwidth'] = 0xFF9F;\n  t['sentisquare'] = 0x3322;\n  t['sentosquare'] = 0x3323;\n  t['seven'] = 0x0037;\n  t['sevenarabic'] = 0x0667;\n  t['sevenbengali'] = 0x09ED;\n  t['sevencircle'] = 0x2466;\n  t['sevencircleinversesansserif'] = 0x2790;\n  t['sevendeva'] = 0x096D;\n  t['seveneighths'] = 0x215E;\n  t['sevengujarati'] = 0x0AED;\n  t['sevengurmukhi'] = 0x0A6D;\n  t['sevenhackarabic'] = 0x0667;\n  t['sevenhangzhou'] = 0x3027;\n  t['sevenideographicparen'] = 0x3226;\n  t['seveninferior'] = 0x2087;\n  t['sevenmonospace'] = 0xFF17;\n  t['sevenoldstyle'] = 0xF737;\n  t['sevenparen'] = 0x247A;\n  t['sevenperiod'] = 0x248E;\n  t['sevenpersian'] = 0x06F7;\n  t['sevenroman'] = 0x2176;\n  t['sevensuperior'] = 0x2077;\n  t['seventeencircle'] = 0x2470;\n  t['seventeenparen'] = 0x2484;\n  t['seventeenperiod'] = 0x2498;\n  t['seventhai'] = 0x0E57;\n  t['sfthyphen'] = 0x00AD;\n  t['shaarmenian'] = 0x0577;\n  t['shabengali'] = 0x09B6;\n  t['shacyrillic'] = 0x0448;\n  t['shaddaarabic'] = 0x0651;\n  t['shaddadammaarabic'] = 0xFC61;\n  t['shaddadammatanarabic'] = 0xFC5E;\n  t['shaddafathaarabic'] = 0xFC60;\n  t['shaddakasraarabic'] = 0xFC62;\n  t['shaddakasratanarabic'] = 0xFC5F;\n  t['shade'] = 0x2592;\n  t['shadedark'] = 0x2593;\n  t['shadelight'] = 0x2591;\n  t['shademedium'] = 0x2592;\n  t['shadeva'] = 0x0936;\n  t['shagujarati'] = 0x0AB6;\n  t['shagurmukhi'] = 0x0A36;\n  t['shalshelethebrew'] = 0x0593;\n  t['shbopomofo'] = 0x3115;\n  t['shchacyrillic'] = 0x0449;\n  t['sheenarabic'] = 0x0634;\n  t['sheenfinalarabic'] = 0xFEB6;\n  t['sheeninitialarabic'] = 0xFEB7;\n  t['sheenmedialarabic'] = 0xFEB8;\n  t['sheicoptic'] = 0x03E3;\n  t['sheqel'] = 0x20AA;\n  t['sheqelhebrew'] = 0x20AA;\n  t['sheva'] = 0x05B0;\n  t['sheva115'] = 0x05B0;\n  t['sheva15'] = 0x05B0;\n  t['sheva22'] = 0x05B0;\n  t['sheva2e'] = 0x05B0;\n  t['shevahebrew'] = 0x05B0;\n  t['shevanarrowhebrew'] = 0x05B0;\n  t['shevaquarterhebrew'] = 0x05B0;\n  t['shevawidehebrew'] = 0x05B0;\n  t['shhacyrillic'] = 0x04BB;\n  t['shimacoptic'] = 0x03ED;\n  t['shin'] = 0x05E9;\n  t['shindagesh'] = 0xFB49;\n  t['shindageshhebrew'] = 0xFB49;\n  t['shindageshshindot'] = 0xFB2C;\n  t['shindageshshindothebrew'] = 0xFB2C;\n  t['shindageshsindot'] = 0xFB2D;\n  t['shindageshsindothebrew'] = 0xFB2D;\n  t['shindothebrew'] = 0x05C1;\n  t['shinhebrew'] = 0x05E9;\n  t['shinshindot'] = 0xFB2A;\n  t['shinshindothebrew'] = 0xFB2A;\n  t['shinsindot'] = 0xFB2B;\n  t['shinsindothebrew'] = 0xFB2B;\n  t['shook'] = 0x0282;\n  t['sigma'] = 0x03C3;\n  t['sigma1'] = 0x03C2;\n  t['sigmafinal'] = 0x03C2;\n  t['sigmalunatesymbolgreek'] = 0x03F2;\n  t['sihiragana'] = 0x3057;\n  t['sikatakana'] = 0x30B7;\n  t['sikatakanahalfwidth'] = 0xFF7C;\n  t['siluqhebrew'] = 0x05BD;\n  t['siluqlefthebrew'] = 0x05BD;\n  t['similar'] = 0x223C;\n  t['sindothebrew'] = 0x05C2;\n  t['siosacirclekorean'] = 0x3274;\n  t['siosaparenkorean'] = 0x3214;\n  t['sioscieuckorean'] = 0x317E;\n  t['sioscirclekorean'] = 0x3266;\n  t['sioskiyeokkorean'] = 0x317A;\n  t['sioskorean'] = 0x3145;\n  t['siosnieunkorean'] = 0x317B;\n  t['siosparenkorean'] = 0x3206;\n  t['siospieupkorean'] = 0x317D;\n  t['siostikeutkorean'] = 0x317C;\n  t['six'] = 0x0036;\n  t['sixarabic'] = 0x0666;\n  t['sixbengali'] = 0x09EC;\n  t['sixcircle'] = 0x2465;\n  t['sixcircleinversesansserif'] = 0x278F;\n  t['sixdeva'] = 0x096C;\n  t['sixgujarati'] = 0x0AEC;\n  t['sixgurmukhi'] = 0x0A6C;\n  t['sixhackarabic'] = 0x0666;\n  t['sixhangzhou'] = 0x3026;\n  t['sixideographicparen'] = 0x3225;\n  t['sixinferior'] = 0x2086;\n  t['sixmonospace'] = 0xFF16;\n  t['sixoldstyle'] = 0xF736;\n  t['sixparen'] = 0x2479;\n  t['sixperiod'] = 0x248D;\n  t['sixpersian'] = 0x06F6;\n  t['sixroman'] = 0x2175;\n  t['sixsuperior'] = 0x2076;\n  t['sixteencircle'] = 0x246F;\n  t['sixteencurrencydenominatorbengali'] = 0x09F9;\n  t['sixteenparen'] = 0x2483;\n  t['sixteenperiod'] = 0x2497;\n  t['sixthai'] = 0x0E56;\n  t['slash'] = 0x002F;\n  t['slashmonospace'] = 0xFF0F;\n  t['slong'] = 0x017F;\n  t['slongdotaccent'] = 0x1E9B;\n  t['smileface'] = 0x263A;\n  t['smonospace'] = 0xFF53;\n  t['sofpasuqhebrew'] = 0x05C3;\n  t['softhyphen'] = 0x00AD;\n  t['softsigncyrillic'] = 0x044C;\n  t['sohiragana'] = 0x305D;\n  t['sokatakana'] = 0x30BD;\n  t['sokatakanahalfwidth'] = 0xFF7F;\n  t['soliduslongoverlaycmb'] = 0x0338;\n  t['solidusshortoverlaycmb'] = 0x0337;\n  t['sorusithai'] = 0x0E29;\n  t['sosalathai'] = 0x0E28;\n  t['sosothai'] = 0x0E0B;\n  t['sosuathai'] = 0x0E2A;\n  t['space'] = 0x0020;\n  t['spacehackarabic'] = 0x0020;\n  t['spade'] = 0x2660;\n  t['spadesuitblack'] = 0x2660;\n  t['spadesuitwhite'] = 0x2664;\n  t['sparen'] = 0x24AE;\n  t['squarebelowcmb'] = 0x033B;\n  t['squarecc'] = 0x33C4;\n  t['squarecm'] = 0x339D;\n  t['squarediagonalcrosshatchfill'] = 0x25A9;\n  t['squarehorizontalfill'] = 0x25A4;\n  t['squarekg'] = 0x338F;\n  t['squarekm'] = 0x339E;\n  t['squarekmcapital'] = 0x33CE;\n  t['squareln'] = 0x33D1;\n  t['squarelog'] = 0x33D2;\n  t['squaremg'] = 0x338E;\n  t['squaremil'] = 0x33D5;\n  t['squaremm'] = 0x339C;\n  t['squaremsquared'] = 0x33A1;\n  t['squareorthogonalcrosshatchfill'] = 0x25A6;\n  t['squareupperlefttolowerrightfill'] = 0x25A7;\n  t['squareupperrighttolowerleftfill'] = 0x25A8;\n  t['squareverticalfill'] = 0x25A5;\n  t['squarewhitewithsmallblack'] = 0x25A3;\n  t['srsquare'] = 0x33DB;\n  t['ssabengali'] = 0x09B7;\n  t['ssadeva'] = 0x0937;\n  t['ssagujarati'] = 0x0AB7;\n  t['ssangcieuckorean'] = 0x3149;\n  t['ssanghieuhkorean'] = 0x3185;\n  t['ssangieungkorean'] = 0x3180;\n  t['ssangkiyeokkorean'] = 0x3132;\n  t['ssangnieunkorean'] = 0x3165;\n  t['ssangpieupkorean'] = 0x3143;\n  t['ssangsioskorean'] = 0x3146;\n  t['ssangtikeutkorean'] = 0x3138;\n  t['ssuperior'] = 0xF6F2;\n  t['sterling'] = 0x00A3;\n  t['sterlingmonospace'] = 0xFFE1;\n  t['strokelongoverlaycmb'] = 0x0336;\n  t['strokeshortoverlaycmb'] = 0x0335;\n  t['subset'] = 0x2282;\n  t['subsetnotequal'] = 0x228A;\n  t['subsetorequal'] = 0x2286;\n  t['succeeds'] = 0x227B;\n  t['suchthat'] = 0x220B;\n  t['suhiragana'] = 0x3059;\n  t['sukatakana'] = 0x30B9;\n  t['sukatakanahalfwidth'] = 0xFF7D;\n  t['sukunarabic'] = 0x0652;\n  t['summation'] = 0x2211;\n  t['sun'] = 0x263C;\n  t['superset'] = 0x2283;\n  t['supersetnotequal'] = 0x228B;\n  t['supersetorequal'] = 0x2287;\n  t['svsquare'] = 0x33DC;\n  t['syouwaerasquare'] = 0x337C;\n  t['t'] = 0x0074;\n  t['tabengali'] = 0x09A4;\n  t['tackdown'] = 0x22A4;\n  t['tackleft'] = 0x22A3;\n  t['tadeva'] = 0x0924;\n  t['tagujarati'] = 0x0AA4;\n  t['tagurmukhi'] = 0x0A24;\n  t['taharabic'] = 0x0637;\n  t['tahfinalarabic'] = 0xFEC2;\n  t['tahinitialarabic'] = 0xFEC3;\n  t['tahiragana'] = 0x305F;\n  t['tahmedialarabic'] = 0xFEC4;\n  t['taisyouerasquare'] = 0x337D;\n  t['takatakana'] = 0x30BF;\n  t['takatakanahalfwidth'] = 0xFF80;\n  t['tatweelarabic'] = 0x0640;\n  t['tau'] = 0x03C4;\n  t['tav'] = 0x05EA;\n  t['tavdages'] = 0xFB4A;\n  t['tavdagesh'] = 0xFB4A;\n  t['tavdageshhebrew'] = 0xFB4A;\n  t['tavhebrew'] = 0x05EA;\n  t['tbar'] = 0x0167;\n  t['tbopomofo'] = 0x310A;\n  t['tcaron'] = 0x0165;\n  t['tccurl'] = 0x02A8;\n  t['tcedilla'] = 0x0163;\n  t['tcheharabic'] = 0x0686;\n  t['tchehfinalarabic'] = 0xFB7B;\n  t['tchehinitialarabic'] = 0xFB7C;\n  t['tchehmedialarabic'] = 0xFB7D;\n  t['tcircle'] = 0x24E3;\n  t['tcircumflexbelow'] = 0x1E71;\n  t['tcommaaccent'] = 0x0163;\n  t['tdieresis'] = 0x1E97;\n  t['tdotaccent'] = 0x1E6B;\n  t['tdotbelow'] = 0x1E6D;\n  t['tecyrillic'] = 0x0442;\n  t['tedescendercyrillic'] = 0x04AD;\n  t['teharabic'] = 0x062A;\n  t['tehfinalarabic'] = 0xFE96;\n  t['tehhahinitialarabic'] = 0xFCA2;\n  t['tehhahisolatedarabic'] = 0xFC0C;\n  t['tehinitialarabic'] = 0xFE97;\n  t['tehiragana'] = 0x3066;\n  t['tehjeeminitialarabic'] = 0xFCA1;\n  t['tehjeemisolatedarabic'] = 0xFC0B;\n  t['tehmarbutaarabic'] = 0x0629;\n  t['tehmarbutafinalarabic'] = 0xFE94;\n  t['tehmedialarabic'] = 0xFE98;\n  t['tehmeeminitialarabic'] = 0xFCA4;\n  t['tehmeemisolatedarabic'] = 0xFC0E;\n  t['tehnoonfinalarabic'] = 0xFC73;\n  t['tekatakana'] = 0x30C6;\n  t['tekatakanahalfwidth'] = 0xFF83;\n  t['telephone'] = 0x2121;\n  t['telephoneblack'] = 0x260E;\n  t['telishagedolahebrew'] = 0x05A0;\n  t['telishaqetanahebrew'] = 0x05A9;\n  t['tencircle'] = 0x2469;\n  t['tenideographicparen'] = 0x3229;\n  t['tenparen'] = 0x247D;\n  t['tenperiod'] = 0x2491;\n  t['tenroman'] = 0x2179;\n  t['tesh'] = 0x02A7;\n  t['tet'] = 0x05D8;\n  t['tetdagesh'] = 0xFB38;\n  t['tetdageshhebrew'] = 0xFB38;\n  t['tethebrew'] = 0x05D8;\n  t['tetsecyrillic'] = 0x04B5;\n  t['tevirhebrew'] = 0x059B;\n  t['tevirlefthebrew'] = 0x059B;\n  t['thabengali'] = 0x09A5;\n  t['thadeva'] = 0x0925;\n  t['thagujarati'] = 0x0AA5;\n  t['thagurmukhi'] = 0x0A25;\n  t['thalarabic'] = 0x0630;\n  t['thalfinalarabic'] = 0xFEAC;\n  t['thanthakhatlowleftthai'] = 0xF898;\n  t['thanthakhatlowrightthai'] = 0xF897;\n  t['thanthakhatthai'] = 0x0E4C;\n  t['thanthakhatupperleftthai'] = 0xF896;\n  t['theharabic'] = 0x062B;\n  t['thehfinalarabic'] = 0xFE9A;\n  t['thehinitialarabic'] = 0xFE9B;\n  t['thehmedialarabic'] = 0xFE9C;\n  t['thereexists'] = 0x2203;\n  t['therefore'] = 0x2234;\n  t['theta'] = 0x03B8;\n  t['theta1'] = 0x03D1;\n  t['thetasymbolgreek'] = 0x03D1;\n  t['thieuthacirclekorean'] = 0x3279;\n  t['thieuthaparenkorean'] = 0x3219;\n  t['thieuthcirclekorean'] = 0x326B;\n  t['thieuthkorean'] = 0x314C;\n  t['thieuthparenkorean'] = 0x320B;\n  t['thirteencircle'] = 0x246C;\n  t['thirteenparen'] = 0x2480;\n  t['thirteenperiod'] = 0x2494;\n  t['thonangmonthothai'] = 0x0E11;\n  t['thook'] = 0x01AD;\n  t['thophuthaothai'] = 0x0E12;\n  t['thorn'] = 0x00FE;\n  t['thothahanthai'] = 0x0E17;\n  t['thothanthai'] = 0x0E10;\n  t['thothongthai'] = 0x0E18;\n  t['thothungthai'] = 0x0E16;\n  t['thousandcyrillic'] = 0x0482;\n  t['thousandsseparatorarabic'] = 0x066C;\n  t['thousandsseparatorpersian'] = 0x066C;\n  t['three'] = 0x0033;\n  t['threearabic'] = 0x0663;\n  t['threebengali'] = 0x09E9;\n  t['threecircle'] = 0x2462;\n  t['threecircleinversesansserif'] = 0x278C;\n  t['threedeva'] = 0x0969;\n  t['threeeighths'] = 0x215C;\n  t['threegujarati'] = 0x0AE9;\n  t['threegurmukhi'] = 0x0A69;\n  t['threehackarabic'] = 0x0663;\n  t['threehangzhou'] = 0x3023;\n  t['threeideographicparen'] = 0x3222;\n  t['threeinferior'] = 0x2083;\n  t['threemonospace'] = 0xFF13;\n  t['threenumeratorbengali'] = 0x09F6;\n  t['threeoldstyle'] = 0xF733;\n  t['threeparen'] = 0x2476;\n  t['threeperiod'] = 0x248A;\n  t['threepersian'] = 0x06F3;\n  t['threequarters'] = 0x00BE;\n  t['threequartersemdash'] = 0xF6DE;\n  t['threeroman'] = 0x2172;\n  t['threesuperior'] = 0x00B3;\n  t['threethai'] = 0x0E53;\n  t['thzsquare'] = 0x3394;\n  t['tihiragana'] = 0x3061;\n  t['tikatakana'] = 0x30C1;\n  t['tikatakanahalfwidth'] = 0xFF81;\n  t['tikeutacirclekorean'] = 0x3270;\n  t['tikeutaparenkorean'] = 0x3210;\n  t['tikeutcirclekorean'] = 0x3262;\n  t['tikeutkorean'] = 0x3137;\n  t['tikeutparenkorean'] = 0x3202;\n  t['tilde'] = 0x02DC;\n  t['tildebelowcmb'] = 0x0330;\n  t['tildecmb'] = 0x0303;\n  t['tildecomb'] = 0x0303;\n  t['tildedoublecmb'] = 0x0360;\n  t['tildeoperator'] = 0x223C;\n  t['tildeoverlaycmb'] = 0x0334;\n  t['tildeverticalcmb'] = 0x033E;\n  t['timescircle'] = 0x2297;\n  t['tipehahebrew'] = 0x0596;\n  t['tipehalefthebrew'] = 0x0596;\n  t['tippigurmukhi'] = 0x0A70;\n  t['titlocyrilliccmb'] = 0x0483;\n  t['tiwnarmenian'] = 0x057F;\n  t['tlinebelow'] = 0x1E6F;\n  t['tmonospace'] = 0xFF54;\n  t['toarmenian'] = 0x0569;\n  t['tohiragana'] = 0x3068;\n  t['tokatakana'] = 0x30C8;\n  t['tokatakanahalfwidth'] = 0xFF84;\n  t['tonebarextrahighmod'] = 0x02E5;\n  t['tonebarextralowmod'] = 0x02E9;\n  t['tonebarhighmod'] = 0x02E6;\n  t['tonebarlowmod'] = 0x02E8;\n  t['tonebarmidmod'] = 0x02E7;\n  t['tonefive'] = 0x01BD;\n  t['tonesix'] = 0x0185;\n  t['tonetwo'] = 0x01A8;\n  t['tonos'] = 0x0384;\n  t['tonsquare'] = 0x3327;\n  t['topatakthai'] = 0x0E0F;\n  t['tortoiseshellbracketleft'] = 0x3014;\n  t['tortoiseshellbracketleftsmall'] = 0xFE5D;\n  t['tortoiseshellbracketleftvertical'] = 0xFE39;\n  t['tortoiseshellbracketright'] = 0x3015;\n  t['tortoiseshellbracketrightsmall'] = 0xFE5E;\n  t['tortoiseshellbracketrightvertical'] = 0xFE3A;\n  t['totaothai'] = 0x0E15;\n  t['tpalatalhook'] = 0x01AB;\n  t['tparen'] = 0x24AF;\n  t['trademark'] = 0x2122;\n  t['trademarksans'] = 0xF8EA;\n  t['trademarkserif'] = 0xF6DB;\n  t['tretroflexhook'] = 0x0288;\n  t['triagdn'] = 0x25BC;\n  t['triaglf'] = 0x25C4;\n  t['triagrt'] = 0x25BA;\n  t['triagup'] = 0x25B2;\n  t['ts'] = 0x02A6;\n  t['tsadi'] = 0x05E6;\n  t['tsadidagesh'] = 0xFB46;\n  t['tsadidageshhebrew'] = 0xFB46;\n  t['tsadihebrew'] = 0x05E6;\n  t['tsecyrillic'] = 0x0446;\n  t['tsere'] = 0x05B5;\n  t['tsere12'] = 0x05B5;\n  t['tsere1e'] = 0x05B5;\n  t['tsere2b'] = 0x05B5;\n  t['tserehebrew'] = 0x05B5;\n  t['tserenarrowhebrew'] = 0x05B5;\n  t['tserequarterhebrew'] = 0x05B5;\n  t['tserewidehebrew'] = 0x05B5;\n  t['tshecyrillic'] = 0x045B;\n  t['tsuperior'] = 0xF6F3;\n  t['ttabengali'] = 0x099F;\n  t['ttadeva'] = 0x091F;\n  t['ttagujarati'] = 0x0A9F;\n  t['ttagurmukhi'] = 0x0A1F;\n  t['tteharabic'] = 0x0679;\n  t['ttehfinalarabic'] = 0xFB67;\n  t['ttehinitialarabic'] = 0xFB68;\n  t['ttehmedialarabic'] = 0xFB69;\n  t['tthabengali'] = 0x09A0;\n  t['tthadeva'] = 0x0920;\n  t['tthagujarati'] = 0x0AA0;\n  t['tthagurmukhi'] = 0x0A20;\n  t['tturned'] = 0x0287;\n  t['tuhiragana'] = 0x3064;\n  t['tukatakana'] = 0x30C4;\n  t['tukatakanahalfwidth'] = 0xFF82;\n  t['tusmallhiragana'] = 0x3063;\n  t['tusmallkatakana'] = 0x30C3;\n  t['tusmallkatakanahalfwidth'] = 0xFF6F;\n  t['twelvecircle'] = 0x246B;\n  t['twelveparen'] = 0x247F;\n  t['twelveperiod'] = 0x2493;\n  t['twelveroman'] = 0x217B;\n  t['twentycircle'] = 0x2473;\n  t['twentyhangzhou'] = 0x5344;\n  t['twentyparen'] = 0x2487;\n  t['twentyperiod'] = 0x249B;\n  t['two'] = 0x0032;\n  t['twoarabic'] = 0x0662;\n  t['twobengali'] = 0x09E8;\n  t['twocircle'] = 0x2461;\n  t['twocircleinversesansserif'] = 0x278B;\n  t['twodeva'] = 0x0968;\n  t['twodotenleader'] = 0x2025;\n  t['twodotleader'] = 0x2025;\n  t['twodotleadervertical'] = 0xFE30;\n  t['twogujarati'] = 0x0AE8;\n  t['twogurmukhi'] = 0x0A68;\n  t['twohackarabic'] = 0x0662;\n  t['twohangzhou'] = 0x3022;\n  t['twoideographicparen'] = 0x3221;\n  t['twoinferior'] = 0x2082;\n  t['twomonospace'] = 0xFF12;\n  t['twonumeratorbengali'] = 0x09F5;\n  t['twooldstyle'] = 0xF732;\n  t['twoparen'] = 0x2475;\n  t['twoperiod'] = 0x2489;\n  t['twopersian'] = 0x06F2;\n  t['tworoman'] = 0x2171;\n  t['twostroke'] = 0x01BB;\n  t['twosuperior'] = 0x00B2;\n  t['twothai'] = 0x0E52;\n  t['twothirds'] = 0x2154;\n  t['u'] = 0x0075;\n  t['uacute'] = 0x00FA;\n  t['ubar'] = 0x0289;\n  t['ubengali'] = 0x0989;\n  t['ubopomofo'] = 0x3128;\n  t['ubreve'] = 0x016D;\n  t['ucaron'] = 0x01D4;\n  t['ucircle'] = 0x24E4;\n  t['ucircumflex'] = 0x00FB;\n  t['ucircumflexbelow'] = 0x1E77;\n  t['ucyrillic'] = 0x0443;\n  t['udattadeva'] = 0x0951;\n  t['udblacute'] = 0x0171;\n  t['udblgrave'] = 0x0215;\n  t['udeva'] = 0x0909;\n  t['udieresis'] = 0x00FC;\n  t['udieresisacute'] = 0x01D8;\n  t['udieresisbelow'] = 0x1E73;\n  t['udieresiscaron'] = 0x01DA;\n  t['udieresiscyrillic'] = 0x04F1;\n  t['udieresisgrave'] = 0x01DC;\n  t['udieresismacron'] = 0x01D6;\n  t['udotbelow'] = 0x1EE5;\n  t['ugrave'] = 0x00F9;\n  t['ugujarati'] = 0x0A89;\n  t['ugurmukhi'] = 0x0A09;\n  t['uhiragana'] = 0x3046;\n  t['uhookabove'] = 0x1EE7;\n  t['uhorn'] = 0x01B0;\n  t['uhornacute'] = 0x1EE9;\n  t['uhorndotbelow'] = 0x1EF1;\n  t['uhorngrave'] = 0x1EEB;\n  t['uhornhookabove'] = 0x1EED;\n  t['uhorntilde'] = 0x1EEF;\n  t['uhungarumlaut'] = 0x0171;\n  t['uhungarumlautcyrillic'] = 0x04F3;\n  t['uinvertedbreve'] = 0x0217;\n  t['ukatakana'] = 0x30A6;\n  t['ukatakanahalfwidth'] = 0xFF73;\n  t['ukcyrillic'] = 0x0479;\n  t['ukorean'] = 0x315C;\n  t['umacron'] = 0x016B;\n  t['umacroncyrillic'] = 0x04EF;\n  t['umacrondieresis'] = 0x1E7B;\n  t['umatragurmukhi'] = 0x0A41;\n  t['umonospace'] = 0xFF55;\n  t['underscore'] = 0x005F;\n  t['underscoredbl'] = 0x2017;\n  t['underscoremonospace'] = 0xFF3F;\n  t['underscorevertical'] = 0xFE33;\n  t['underscorewavy'] = 0xFE4F;\n  t['union'] = 0x222A;\n  t['universal'] = 0x2200;\n  t['uogonek'] = 0x0173;\n  t['uparen'] = 0x24B0;\n  t['upblock'] = 0x2580;\n  t['upperdothebrew'] = 0x05C4;\n  t['upsilon'] = 0x03C5;\n  t['upsilondieresis'] = 0x03CB;\n  t['upsilondieresistonos'] = 0x03B0;\n  t['upsilonlatin'] = 0x028A;\n  t['upsilontonos'] = 0x03CD;\n  t['uptackbelowcmb'] = 0x031D;\n  t['uptackmod'] = 0x02D4;\n  t['uragurmukhi'] = 0x0A73;\n  t['uring'] = 0x016F;\n  t['ushortcyrillic'] = 0x045E;\n  t['usmallhiragana'] = 0x3045;\n  t['usmallkatakana'] = 0x30A5;\n  t['usmallkatakanahalfwidth'] = 0xFF69;\n  t['ustraightcyrillic'] = 0x04AF;\n  t['ustraightstrokecyrillic'] = 0x04B1;\n  t['utilde'] = 0x0169;\n  t['utildeacute'] = 0x1E79;\n  t['utildebelow'] = 0x1E75;\n  t['uubengali'] = 0x098A;\n  t['uudeva'] = 0x090A;\n  t['uugujarati'] = 0x0A8A;\n  t['uugurmukhi'] = 0x0A0A;\n  t['uumatragurmukhi'] = 0x0A42;\n  t['uuvowelsignbengali'] = 0x09C2;\n  t['uuvowelsigndeva'] = 0x0942;\n  t['uuvowelsigngujarati'] = 0x0AC2;\n  t['uvowelsignbengali'] = 0x09C1;\n  t['uvowelsigndeva'] = 0x0941;\n  t['uvowelsigngujarati'] = 0x0AC1;\n  t['v'] = 0x0076;\n  t['vadeva'] = 0x0935;\n  t['vagujarati'] = 0x0AB5;\n  t['vagurmukhi'] = 0x0A35;\n  t['vakatakana'] = 0x30F7;\n  t['vav'] = 0x05D5;\n  t['vavdagesh'] = 0xFB35;\n  t['vavdagesh65'] = 0xFB35;\n  t['vavdageshhebrew'] = 0xFB35;\n  t['vavhebrew'] = 0x05D5;\n  t['vavholam'] = 0xFB4B;\n  t['vavholamhebrew'] = 0xFB4B;\n  t['vavvavhebrew'] = 0x05F0;\n  t['vavyodhebrew'] = 0x05F1;\n  t['vcircle'] = 0x24E5;\n  t['vdotbelow'] = 0x1E7F;\n  t['vecyrillic'] = 0x0432;\n  t['veharabic'] = 0x06A4;\n  t['vehfinalarabic'] = 0xFB6B;\n  t['vehinitialarabic'] = 0xFB6C;\n  t['vehmedialarabic'] = 0xFB6D;\n  t['vekatakana'] = 0x30F9;\n  t['venus'] = 0x2640;\n  t['verticalbar'] = 0x007C;\n  t['verticallineabovecmb'] = 0x030D;\n  t['verticallinebelowcmb'] = 0x0329;\n  t['verticallinelowmod'] = 0x02CC;\n  t['verticallinemod'] = 0x02C8;\n  t['vewarmenian'] = 0x057E;\n  t['vhook'] = 0x028B;\n  t['vikatakana'] = 0x30F8;\n  t['viramabengali'] = 0x09CD;\n  t['viramadeva'] = 0x094D;\n  t['viramagujarati'] = 0x0ACD;\n  t['visargabengali'] = 0x0983;\n  t['visargadeva'] = 0x0903;\n  t['visargagujarati'] = 0x0A83;\n  t['vmonospace'] = 0xFF56;\n  t['voarmenian'] = 0x0578;\n  t['voicediterationhiragana'] = 0x309E;\n  t['voicediterationkatakana'] = 0x30FE;\n  t['voicedmarkkana'] = 0x309B;\n  t['voicedmarkkanahalfwidth'] = 0xFF9E;\n  t['vokatakana'] = 0x30FA;\n  t['vparen'] = 0x24B1;\n  t['vtilde'] = 0x1E7D;\n  t['vturned'] = 0x028C;\n  t['vuhiragana'] = 0x3094;\n  t['vukatakana'] = 0x30F4;\n  t['w'] = 0x0077;\n  t['wacute'] = 0x1E83;\n  t['waekorean'] = 0x3159;\n  t['wahiragana'] = 0x308F;\n  t['wakatakana'] = 0x30EF;\n  t['wakatakanahalfwidth'] = 0xFF9C;\n  t['wakorean'] = 0x3158;\n  t['wasmallhiragana'] = 0x308E;\n  t['wasmallkatakana'] = 0x30EE;\n  t['wattosquare'] = 0x3357;\n  t['wavedash'] = 0x301C;\n  t['wavyunderscorevertical'] = 0xFE34;\n  t['wawarabic'] = 0x0648;\n  t['wawfinalarabic'] = 0xFEEE;\n  t['wawhamzaabovearabic'] = 0x0624;\n  t['wawhamzaabovefinalarabic'] = 0xFE86;\n  t['wbsquare'] = 0x33DD;\n  t['wcircle'] = 0x24E6;\n  t['wcircumflex'] = 0x0175;\n  t['wdieresis'] = 0x1E85;\n  t['wdotaccent'] = 0x1E87;\n  t['wdotbelow'] = 0x1E89;\n  t['wehiragana'] = 0x3091;\n  t['weierstrass'] = 0x2118;\n  t['wekatakana'] = 0x30F1;\n  t['wekorean'] = 0x315E;\n  t['weokorean'] = 0x315D;\n  t['wgrave'] = 0x1E81;\n  t['whitebullet'] = 0x25E6;\n  t['whitecircle'] = 0x25CB;\n  t['whitecircleinverse'] = 0x25D9;\n  t['whitecornerbracketleft'] = 0x300E;\n  t['whitecornerbracketleftvertical'] = 0xFE43;\n  t['whitecornerbracketright'] = 0x300F;\n  t['whitecornerbracketrightvertical'] = 0xFE44;\n  t['whitediamond'] = 0x25C7;\n  t['whitediamondcontainingblacksmalldiamond'] = 0x25C8;\n  t['whitedownpointingsmalltriangle'] = 0x25BF;\n  t['whitedownpointingtriangle'] = 0x25BD;\n  t['whiteleftpointingsmalltriangle'] = 0x25C3;\n  t['whiteleftpointingtriangle'] = 0x25C1;\n  t['whitelenticularbracketleft'] = 0x3016;\n  t['whitelenticularbracketright'] = 0x3017;\n  t['whiterightpointingsmalltriangle'] = 0x25B9;\n  t['whiterightpointingtriangle'] = 0x25B7;\n  t['whitesmallsquare'] = 0x25AB;\n  t['whitesmilingface'] = 0x263A;\n  t['whitesquare'] = 0x25A1;\n  t['whitestar'] = 0x2606;\n  t['whitetelephone'] = 0x260F;\n  t['whitetortoiseshellbracketleft'] = 0x3018;\n  t['whitetortoiseshellbracketright'] = 0x3019;\n  t['whiteuppointingsmalltriangle'] = 0x25B5;\n  t['whiteuppointingtriangle'] = 0x25B3;\n  t['wihiragana'] = 0x3090;\n  t['wikatakana'] = 0x30F0;\n  t['wikorean'] = 0x315F;\n  t['wmonospace'] = 0xFF57;\n  t['wohiragana'] = 0x3092;\n  t['wokatakana'] = 0x30F2;\n  t['wokatakanahalfwidth'] = 0xFF66;\n  t['won'] = 0x20A9;\n  t['wonmonospace'] = 0xFFE6;\n  t['wowaenthai'] = 0x0E27;\n  t['wparen'] = 0x24B2;\n  t['wring'] = 0x1E98;\n  t['wsuperior'] = 0x02B7;\n  t['wturned'] = 0x028D;\n  t['wynn'] = 0x01BF;\n  t['x'] = 0x0078;\n  t['xabovecmb'] = 0x033D;\n  t['xbopomofo'] = 0x3112;\n  t['xcircle'] = 0x24E7;\n  t['xdieresis'] = 0x1E8D;\n  t['xdotaccent'] = 0x1E8B;\n  t['xeharmenian'] = 0x056D;\n  t['xi'] = 0x03BE;\n  t['xmonospace'] = 0xFF58;\n  t['xparen'] = 0x24B3;\n  t['xsuperior'] = 0x02E3;\n  t['y'] = 0x0079;\n  t['yaadosquare'] = 0x334E;\n  t['yabengali'] = 0x09AF;\n  t['yacute'] = 0x00FD;\n  t['yadeva'] = 0x092F;\n  t['yaekorean'] = 0x3152;\n  t['yagujarati'] = 0x0AAF;\n  t['yagurmukhi'] = 0x0A2F;\n  t['yahiragana'] = 0x3084;\n  t['yakatakana'] = 0x30E4;\n  t['yakatakanahalfwidth'] = 0xFF94;\n  t['yakorean'] = 0x3151;\n  t['yamakkanthai'] = 0x0E4E;\n  t['yasmallhiragana'] = 0x3083;\n  t['yasmallkatakana'] = 0x30E3;\n  t['yasmallkatakanahalfwidth'] = 0xFF6C;\n  t['yatcyrillic'] = 0x0463;\n  t['ycircle'] = 0x24E8;\n  t['ycircumflex'] = 0x0177;\n  t['ydieresis'] = 0x00FF;\n  t['ydotaccent'] = 0x1E8F;\n  t['ydotbelow'] = 0x1EF5;\n  t['yeharabic'] = 0x064A;\n  t['yehbarreearabic'] = 0x06D2;\n  t['yehbarreefinalarabic'] = 0xFBAF;\n  t['yehfinalarabic'] = 0xFEF2;\n  t['yehhamzaabovearabic'] = 0x0626;\n  t['yehhamzaabovefinalarabic'] = 0xFE8A;\n  t['yehhamzaaboveinitialarabic'] = 0xFE8B;\n  t['yehhamzaabovemedialarabic'] = 0xFE8C;\n  t['yehinitialarabic'] = 0xFEF3;\n  t['yehmedialarabic'] = 0xFEF4;\n  t['yehmeeminitialarabic'] = 0xFCDD;\n  t['yehmeemisolatedarabic'] = 0xFC58;\n  t['yehnoonfinalarabic'] = 0xFC94;\n  t['yehthreedotsbelowarabic'] = 0x06D1;\n  t['yekorean'] = 0x3156;\n  t['yen'] = 0x00A5;\n  t['yenmonospace'] = 0xFFE5;\n  t['yeokorean'] = 0x3155;\n  t['yeorinhieuhkorean'] = 0x3186;\n  t['yerahbenyomohebrew'] = 0x05AA;\n  t['yerahbenyomolefthebrew'] = 0x05AA;\n  t['yericyrillic'] = 0x044B;\n  t['yerudieresiscyrillic'] = 0x04F9;\n  t['yesieungkorean'] = 0x3181;\n  t['yesieungpansioskorean'] = 0x3183;\n  t['yesieungsioskorean'] = 0x3182;\n  t['yetivhebrew'] = 0x059A;\n  t['ygrave'] = 0x1EF3;\n  t['yhook'] = 0x01B4;\n  t['yhookabove'] = 0x1EF7;\n  t['yiarmenian'] = 0x0575;\n  t['yicyrillic'] = 0x0457;\n  t['yikorean'] = 0x3162;\n  t['yinyang'] = 0x262F;\n  t['yiwnarmenian'] = 0x0582;\n  t['ymonospace'] = 0xFF59;\n  t['yod'] = 0x05D9;\n  t['yoddagesh'] = 0xFB39;\n  t['yoddageshhebrew'] = 0xFB39;\n  t['yodhebrew'] = 0x05D9;\n  t['yodyodhebrew'] = 0x05F2;\n  t['yodyodpatahhebrew'] = 0xFB1F;\n  t['yohiragana'] = 0x3088;\n  t['yoikorean'] = 0x3189;\n  t['yokatakana'] = 0x30E8;\n  t['yokatakanahalfwidth'] = 0xFF96;\n  t['yokorean'] = 0x315B;\n  t['yosmallhiragana'] = 0x3087;\n  t['yosmallkatakana'] = 0x30E7;\n  t['yosmallkatakanahalfwidth'] = 0xFF6E;\n  t['yotgreek'] = 0x03F3;\n  t['yoyaekorean'] = 0x3188;\n  t['yoyakorean'] = 0x3187;\n  t['yoyakthai'] = 0x0E22;\n  t['yoyingthai'] = 0x0E0D;\n  t['yparen'] = 0x24B4;\n  t['ypogegrammeni'] = 0x037A;\n  t['ypogegrammenigreekcmb'] = 0x0345;\n  t['yr'] = 0x01A6;\n  t['yring'] = 0x1E99;\n  t['ysuperior'] = 0x02B8;\n  t['ytilde'] = 0x1EF9;\n  t['yturned'] = 0x028E;\n  t['yuhiragana'] = 0x3086;\n  t['yuikorean'] = 0x318C;\n  t['yukatakana'] = 0x30E6;\n  t['yukatakanahalfwidth'] = 0xFF95;\n  t['yukorean'] = 0x3160;\n  t['yusbigcyrillic'] = 0x046B;\n  t['yusbigiotifiedcyrillic'] = 0x046D;\n  t['yuslittlecyrillic'] = 0x0467;\n  t['yuslittleiotifiedcyrillic'] = 0x0469;\n  t['yusmallhiragana'] = 0x3085;\n  t['yusmallkatakana'] = 0x30E5;\n  t['yusmallkatakanahalfwidth'] = 0xFF6D;\n  t['yuyekorean'] = 0x318B;\n  t['yuyeokorean'] = 0x318A;\n  t['yyabengali'] = 0x09DF;\n  t['yyadeva'] = 0x095F;\n  t['z'] = 0x007A;\n  t['zaarmenian'] = 0x0566;\n  t['zacute'] = 0x017A;\n  t['zadeva'] = 0x095B;\n  t['zagurmukhi'] = 0x0A5B;\n  t['zaharabic'] = 0x0638;\n  t['zahfinalarabic'] = 0xFEC6;\n  t['zahinitialarabic'] = 0xFEC7;\n  t['zahiragana'] = 0x3056;\n  t['zahmedialarabic'] = 0xFEC8;\n  t['zainarabic'] = 0x0632;\n  t['zainfinalarabic'] = 0xFEB0;\n  t['zakatakana'] = 0x30B6;\n  t['zaqefgadolhebrew'] = 0x0595;\n  t['zaqefqatanhebrew'] = 0x0594;\n  t['zarqahebrew'] = 0x0598;\n  t['zayin'] = 0x05D6;\n  t['zayindagesh'] = 0xFB36;\n  t['zayindageshhebrew'] = 0xFB36;\n  t['zayinhebrew'] = 0x05D6;\n  t['zbopomofo'] = 0x3117;\n  t['zcaron'] = 0x017E;\n  t['zcircle'] = 0x24E9;\n  t['zcircumflex'] = 0x1E91;\n  t['zcurl'] = 0x0291;\n  t['zdot'] = 0x017C;\n  t['zdotaccent'] = 0x017C;\n  t['zdotbelow'] = 0x1E93;\n  t['zecyrillic'] = 0x0437;\n  t['zedescendercyrillic'] = 0x0499;\n  t['zedieresiscyrillic'] = 0x04DF;\n  t['zehiragana'] = 0x305C;\n  t['zekatakana'] = 0x30BC;\n  t['zero'] = 0x0030;\n  t['zeroarabic'] = 0x0660;\n  t['zerobengali'] = 0x09E6;\n  t['zerodeva'] = 0x0966;\n  t['zerogujarati'] = 0x0AE6;\n  t['zerogurmukhi'] = 0x0A66;\n  t['zerohackarabic'] = 0x0660;\n  t['zeroinferior'] = 0x2080;\n  t['zeromonospace'] = 0xFF10;\n  t['zerooldstyle'] = 0xF730;\n  t['zeropersian'] = 0x06F0;\n  t['zerosuperior'] = 0x2070;\n  t['zerothai'] = 0x0E50;\n  t['zerowidthjoiner'] = 0xFEFF;\n  t['zerowidthnonjoiner'] = 0x200C;\n  t['zerowidthspace'] = 0x200B;\n  t['zeta'] = 0x03B6;\n  t['zhbopomofo'] = 0x3113;\n  t['zhearmenian'] = 0x056A;\n  t['zhebrevecyrillic'] = 0x04C2;\n  t['zhecyrillic'] = 0x0436;\n  t['zhedescendercyrillic'] = 0x0497;\n  t['zhedieresiscyrillic'] = 0x04DD;\n  t['zihiragana'] = 0x3058;\n  t['zikatakana'] = 0x30B8;\n  t['zinorhebrew'] = 0x05AE;\n  t['zlinebelow'] = 0x1E95;\n  t['zmonospace'] = 0xFF5A;\n  t['zohiragana'] = 0x305E;\n  t['zokatakana'] = 0x30BE;\n  t['zparen'] = 0x24B5;\n  t['zretroflexhook'] = 0x0290;\n  t['zstroke'] = 0x01B6;\n  t['zuhiragana'] = 0x305A;\n  t['zukatakana'] = 0x30BA;\n  t['.notdef'] = 0x0000;\n\n  // TeX-specific glyph names.\n  t['angbracketleftbig'] = 0x2329;\n  t['angbracketleftBig'] = 0x2329;\n  t['angbracketleftbigg'] = 0x2329;\n  t['angbracketleftBigg'] = 0x2329;\n  t['angbracketrightBig'] = 0x232A;\n  t['angbracketrightbig'] = 0x232A;\n  t['angbracketrightBigg'] = 0x232A;\n  t['angbracketrightbigg'] = 0x232A;\n  t['arrowhookleft'] = 0x21AA;\n  t['arrowhookright'] = 0x21A9;\n  t['arrowlefttophalf'] = 0x21BC;\n  t['arrowleftbothalf'] = 0x21BD;\n  t['arrownortheast'] = 0x2197;\n  t['arrownorthwest'] = 0x2196;\n  t['arrowrighttophalf'] = 0x21C0;\n  t['arrowrightbothalf'] = 0x21C1;\n  t['arrowsoutheast'] = 0x2198;\n  t['arrowsouthwest'] = 0x2199;\n  t['backslashbig'] = 0x2216;\n  t['backslashBig'] = 0x2216;\n  t['backslashBigg'] = 0x2216;\n  t['backslashbigg'] = 0x2216;\n  t['bardbl'] = 0x2016;\n  t['bracehtipdownleft'] = 0xFE37;\n  t['bracehtipdownright'] = 0xFE37;\n  t['bracehtipupleft'] = 0xFE38;\n  t['bracehtipupright'] = 0xFE38;\n  t['braceleftBig'] = 0x007B;\n  t['braceleftbig'] = 0x007B;\n  t['braceleftbigg'] = 0x007B;\n  t['braceleftBigg'] = 0x007B;\n  t['bracerightBig'] = 0x007D;\n  t['bracerightbig'] = 0x007D;\n  t['bracerightbigg'] = 0x007D;\n  t['bracerightBigg'] = 0x007D;\n  t['bracketleftbig'] = 0x005B;\n  t['bracketleftBig'] = 0x005B;\n  t['bracketleftbigg'] = 0x005B;\n  t['bracketleftBigg'] = 0x005B;\n  t['bracketrightBig'] = 0x005D;\n  t['bracketrightbig'] = 0x005D;\n  t['bracketrightbigg'] = 0x005D;\n  t['bracketrightBigg'] = 0x005D;\n  t['ceilingleftbig'] = 0x2308;\n  t['ceilingleftBig'] = 0x2308;\n  t['ceilingleftBigg'] = 0x2308;\n  t['ceilingleftbigg'] = 0x2308;\n  t['ceilingrightbig'] = 0x2309;\n  t['ceilingrightBig'] = 0x2309;\n  t['ceilingrightbigg'] = 0x2309;\n  t['ceilingrightBigg'] = 0x2309;\n  t['circledotdisplay'] = 0x2299;\n  t['circledottext'] = 0x2299;\n  t['circlemultiplydisplay'] = 0x2297;\n  t['circlemultiplytext'] = 0x2297;\n  t['circleplusdisplay'] = 0x2295;\n  t['circleplustext'] = 0x2295;\n  t['contintegraldisplay'] = 0x222E;\n  t['contintegraltext'] = 0x222E;\n  t['coproductdisplay'] = 0x2210;\n  t['coproducttext'] = 0x2210;\n  t['floorleftBig'] = 0x230A;\n  t['floorleftbig'] = 0x230A;\n  t['floorleftbigg'] = 0x230A;\n  t['floorleftBigg'] = 0x230A;\n  t['floorrightbig'] = 0x230B;\n  t['floorrightBig'] = 0x230B;\n  t['floorrightBigg'] = 0x230B;\n  t['floorrightbigg'] = 0x230B;\n  t['hatwide'] = 0x0302;\n  t['hatwider'] = 0x0302;\n  t['hatwidest'] = 0x0302;\n  t['intercal'] = 0x1D40;\n  t['integraldisplay'] = 0x222B;\n  t['integraltext'] = 0x222B;\n  t['intersectiondisplay'] = 0x22C2;\n  t['intersectiontext'] = 0x22C2;\n  t['logicalanddisplay'] = 0x2227;\n  t['logicalandtext'] = 0x2227;\n  t['logicalordisplay'] = 0x2228;\n  t['logicalortext'] = 0x2228;\n  t['parenleftBig'] = 0x0028;\n  t['parenleftbig'] = 0x0028;\n  t['parenleftBigg'] = 0x0028;\n  t['parenleftbigg'] = 0x0028;\n  t['parenrightBig'] = 0x0029;\n  t['parenrightbig'] = 0x0029;\n  t['parenrightBigg'] = 0x0029;\n  t['parenrightbigg'] = 0x0029;\n  t['prime'] = 0x2032;\n  t['productdisplay'] = 0x220F;\n  t['producttext'] = 0x220F;\n  t['radicalbig'] = 0x221A;\n  t['radicalBig'] = 0x221A;\n  t['radicalBigg'] = 0x221A;\n  t['radicalbigg'] = 0x221A;\n  t['radicalbt'] = 0x221A;\n  t['radicaltp'] = 0x221A;\n  t['radicalvertex'] = 0x221A;\n  t['slashbig'] = 0x002F;\n  t['slashBig'] = 0x002F;\n  t['slashBigg'] = 0x002F;\n  t['slashbigg'] = 0x002F;\n  t['summationdisplay'] = 0x2211;\n  t['summationtext'] = 0x2211;\n  t['tildewide'] = 0x02DC;\n  t['tildewider'] = 0x02DC;\n  t['tildewidest'] = 0x02DC;\n  t['uniondisplay'] = 0x22C3;\n  t['unionmultidisplay'] = 0x228E;\n  t['unionmultitext'] = 0x228E;\n  t['unionsqdisplay'] = 0x2294;\n  t['unionsqtext'] = 0x2294;\n  t['uniontext'] = 0x22C3;\n  t['vextenddouble'] = 0x2225;\n  t['vextendsingle'] = 0x2223;\n});\n\nvar getDingbatsGlyphsUnicode = getLookupTableFactory(function (t) {\n  t['space'] = 0x0020;\n  t['a1'] = 0x2701;\n  t['a2'] = 0x2702;\n  t['a202'] = 0x2703;\n  t['a3'] = 0x2704;\n  t['a4'] = 0x260E;\n  t['a5'] = 0x2706;\n  t['a119'] = 0x2707;\n  t['a118'] = 0x2708;\n  t['a117'] = 0x2709;\n  t['a11'] = 0x261B;\n  t['a12'] = 0x261E;\n  t['a13'] = 0x270C;\n  t['a14'] = 0x270D;\n  t['a15'] = 0x270E;\n  t['a16'] = 0x270F;\n  t['a105'] = 0x2710;\n  t['a17'] = 0x2711;\n  t['a18'] = 0x2712;\n  t['a19'] = 0x2713;\n  t['a20'] = 0x2714;\n  t['a21'] = 0x2715;\n  t['a22'] = 0x2716;\n  t['a23'] = 0x2717;\n  t['a24'] = 0x2718;\n  t['a25'] = 0x2719;\n  t['a26'] = 0x271A;\n  t['a27'] = 0x271B;\n  t['a28'] = 0x271C;\n  t['a6'] = 0x271D;\n  t['a7'] = 0x271E;\n  t['a8'] = 0x271F;\n  t['a9'] = 0x2720;\n  t['a10'] = 0x2721;\n  t['a29'] = 0x2722;\n  t['a30'] = 0x2723;\n  t['a31'] = 0x2724;\n  t['a32'] = 0x2725;\n  t['a33'] = 0x2726;\n  t['a34'] = 0x2727;\n  t['a35'] = 0x2605;\n  t['a36'] = 0x2729;\n  t['a37'] = 0x272A;\n  t['a38'] = 0x272B;\n  t['a39'] = 0x272C;\n  t['a40'] = 0x272D;\n  t['a41'] = 0x272E;\n  t['a42'] = 0x272F;\n  t['a43'] = 0x2730;\n  t['a44'] = 0x2731;\n  t['a45'] = 0x2732;\n  t['a46'] = 0x2733;\n  t['a47'] = 0x2734;\n  t['a48'] = 0x2735;\n  t['a49'] = 0x2736;\n  t['a50'] = 0x2737;\n  t['a51'] = 0x2738;\n  t['a52'] = 0x2739;\n  t['a53'] = 0x273A;\n  t['a54'] = 0x273B;\n  t['a55'] = 0x273C;\n  t['a56'] = 0x273D;\n  t['a57'] = 0x273E;\n  t['a58'] = 0x273F;\n  t['a59'] = 0x2740;\n  t['a60'] = 0x2741;\n  t['a61'] = 0x2742;\n  t['a62'] = 0x2743;\n  t['a63'] = 0x2744;\n  t['a64'] = 0x2745;\n  t['a65'] = 0x2746;\n  t['a66'] = 0x2747;\n  t['a67'] = 0x2748;\n  t['a68'] = 0x2749;\n  t['a69'] = 0x274A;\n  t['a70'] = 0x274B;\n  t['a71'] = 0x25CF;\n  t['a72'] = 0x274D;\n  t['a73'] = 0x25A0;\n  t['a74'] = 0x274F;\n  t['a203'] = 0x2750;\n  t['a75'] = 0x2751;\n  t['a204'] = 0x2752;\n  t['a76'] = 0x25B2;\n  t['a77'] = 0x25BC;\n  t['a78'] = 0x25C6;\n  t['a79'] = 0x2756;\n  t['a81'] = 0x25D7;\n  t['a82'] = 0x2758;\n  t['a83'] = 0x2759;\n  t['a84'] = 0x275A;\n  t['a97'] = 0x275B;\n  t['a98'] = 0x275C;\n  t['a99'] = 0x275D;\n  t['a100'] = 0x275E;\n  t['a101'] = 0x2761;\n  t['a102'] = 0x2762;\n  t['a103'] = 0x2763;\n  t['a104'] = 0x2764;\n  t['a106'] = 0x2765;\n  t['a107'] = 0x2766;\n  t['a108'] = 0x2767;\n  t['a112'] = 0x2663;\n  t['a111'] = 0x2666;\n  t['a110'] = 0x2665;\n  t['a109'] = 0x2660;\n  t['a120'] = 0x2460;\n  t['a121'] = 0x2461;\n  t['a122'] = 0x2462;\n  t['a123'] = 0x2463;\n  t['a124'] = 0x2464;\n  t['a125'] = 0x2465;\n  t['a126'] = 0x2466;\n  t['a127'] = 0x2467;\n  t['a128'] = 0x2468;\n  t['a129'] = 0x2469;\n  t['a130'] = 0x2776;\n  t['a131'] = 0x2777;\n  t['a132'] = 0x2778;\n  t['a133'] = 0x2779;\n  t['a134'] = 0x277A;\n  t['a135'] = 0x277B;\n  t['a136'] = 0x277C;\n  t['a137'] = 0x277D;\n  t['a138'] = 0x277E;\n  t['a139'] = 0x277F;\n  t['a140'] = 0x2780;\n  t['a141'] = 0x2781;\n  t['a142'] = 0x2782;\n  t['a143'] = 0x2783;\n  t['a144'] = 0x2784;\n  t['a145'] = 0x2785;\n  t['a146'] = 0x2786;\n  t['a147'] = 0x2787;\n  t['a148'] = 0x2788;\n  t['a149'] = 0x2789;\n  t['a150'] = 0x278A;\n  t['a151'] = 0x278B;\n  t['a152'] = 0x278C;\n  t['a153'] = 0x278D;\n  t['a154'] = 0x278E;\n  t['a155'] = 0x278F;\n  t['a156'] = 0x2790;\n  t['a157'] = 0x2791;\n  t['a158'] = 0x2792;\n  t['a159'] = 0x2793;\n  t['a160'] = 0x2794;\n  t['a161'] = 0x2192;\n  t['a163'] = 0x2194;\n  t['a164'] = 0x2195;\n  t['a196'] = 0x2798;\n  t['a165'] = 0x2799;\n  t['a192'] = 0x279A;\n  t['a166'] = 0x279B;\n  t['a167'] = 0x279C;\n  t['a168'] = 0x279D;\n  t['a169'] = 0x279E;\n  t['a170'] = 0x279F;\n  t['a171'] = 0x27A0;\n  t['a172'] = 0x27A1;\n  t['a173'] = 0x27A2;\n  t['a162'] = 0x27A3;\n  t['a174'] = 0x27A4;\n  t['a175'] = 0x27A5;\n  t['a176'] = 0x27A6;\n  t['a177'] = 0x27A7;\n  t['a178'] = 0x27A8;\n  t['a179'] = 0x27A9;\n  t['a193'] = 0x27AA;\n  t['a180'] = 0x27AB;\n  t['a199'] = 0x27AC;\n  t['a181'] = 0x27AD;\n  t['a200'] = 0x27AE;\n  t['a182'] = 0x27AF;\n  t['a201'] = 0x27B1;\n  t['a183'] = 0x27B2;\n  t['a184'] = 0x27B3;\n  t['a197'] = 0x27B4;\n  t['a185'] = 0x27B5;\n  t['a194'] = 0x27B6;\n  t['a198'] = 0x27B7;\n  t['a186'] = 0x27B8;\n  t['a195'] = 0x27B9;\n  t['a187'] = 0x27BA;\n  t['a188'] = 0x27BB;\n  t['a189'] = 0x27BC;\n  t['a190'] = 0x27BD;\n  t['a191'] = 0x27BE;\n  t['a89'] = 0x2768; // 0xF8D7\n  t['a90'] = 0x2769; // 0xF8D8\n  t['a93'] = 0x276A; // 0xF8D9\n  t['a94'] = 0x276B; // 0xF8DA\n  t['a91'] = 0x276C; // 0xF8DB\n  t['a92'] = 0x276D; // 0xF8DC\n  t['a205'] = 0x276E; // 0xF8DD\n  t['a85'] = 0x276F; // 0xF8DE\n  t['a206'] = 0x2770; // 0xF8DF\n  t['a86'] = 0x2771; // 0xF8E0\n  t['a87'] = 0x2772; // 0xF8E1\n  t['a88'] = 0x2773; // 0xF8E2\n  t['a95'] = 0x2774; // 0xF8E3\n  t['a96'] = 0x2775; // 0xF8E4\n  t['.notdef'] = 0x0000;\n});\n\nexports.getGlyphsUnicode = getGlyphsUnicode;\nexports.getDingbatsGlyphsUnicode = getDingbatsGlyphsUnicode;\n","/* Copyright 2015 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getLookupTableFactory } from '../shared/util';\n\n/**\n * Hold a map of decoded fonts and of the standard fourteen Type1\n * fonts and their acronyms.\n */\nvar getStdFontMap = getLookupTableFactory(function (t) {\n  t['ArialNarrow'] = 'Helvetica';\n  t['ArialNarrow-Bold'] = 'Helvetica-Bold';\n  t['ArialNarrow-BoldItalic'] = 'Helvetica-BoldOblique';\n  t['ArialNarrow-Italic'] = 'Helvetica-Oblique';\n  t['ArialBlack'] = 'Helvetica';\n  t['ArialBlack-Bold'] = 'Helvetica-Bold';\n  t['ArialBlack-BoldItalic'] = 'Helvetica-BoldOblique';\n  t['ArialBlack-Italic'] = 'Helvetica-Oblique';\n  t['Arial-Black'] = 'Helvetica';\n  t['Arial-Black-Bold'] = 'Helvetica-Bold';\n  t['Arial-Black-BoldItalic'] = 'Helvetica-BoldOblique';\n  t['Arial-Black-Italic'] = 'Helvetica-Oblique';\n  t['Arial'] = 'Helvetica';\n  t['Arial-Bold'] = 'Helvetica-Bold';\n  t['Arial-BoldItalic'] = 'Helvetica-BoldOblique';\n  t['Arial-Italic'] = 'Helvetica-Oblique';\n  t['Arial-BoldItalicMT'] = 'Helvetica-BoldOblique';\n  t['Arial-BoldMT'] = 'Helvetica-Bold';\n  t['Arial-ItalicMT'] = 'Helvetica-Oblique';\n  t['ArialMT'] = 'Helvetica';\n  t['Courier-Bold'] = 'Courier-Bold';\n  t['Courier-BoldItalic'] = 'Courier-BoldOblique';\n  t['Courier-Italic'] = 'Courier-Oblique';\n  t['CourierNew'] = 'Courier';\n  t['CourierNew-Bold'] = 'Courier-Bold';\n  t['CourierNew-BoldItalic'] = 'Courier-BoldOblique';\n  t['CourierNew-Italic'] = 'Courier-Oblique';\n  t['CourierNewPS-BoldItalicMT'] = 'Courier-BoldOblique';\n  t['CourierNewPS-BoldMT'] = 'Courier-Bold';\n  t['CourierNewPS-ItalicMT'] = 'Courier-Oblique';\n  t['CourierNewPSMT'] = 'Courier';\n  t['Helvetica'] = 'Helvetica';\n  t['Helvetica-Bold'] = 'Helvetica-Bold';\n  t['Helvetica-BoldItalic'] = 'Helvetica-BoldOblique';\n  t['Helvetica-BoldOblique'] = 'Helvetica-BoldOblique';\n  t['Helvetica-Italic'] = 'Helvetica-Oblique';\n  t['Helvetica-Oblique'] = 'Helvetica-Oblique';\n  t['SegoeUISymbol'] = 'Helvetica';\n  t['Symbol-Bold'] = 'Symbol';\n  t['Symbol-BoldItalic'] = 'Symbol';\n  t['Symbol-Italic'] = 'Symbol';\n  t['TimesNewRoman'] = 'Times-Roman';\n  t['TimesNewRoman-Bold'] = 'Times-Bold';\n  t['TimesNewRoman-BoldItalic'] = 'Times-BoldItalic';\n  t['TimesNewRoman-Italic'] = 'Times-Italic';\n  t['TimesNewRomanPS'] = 'Times-Roman';\n  t['TimesNewRomanPS-Bold'] = 'Times-Bold';\n  t['TimesNewRomanPS-BoldItalic'] = 'Times-BoldItalic';\n  t['TimesNewRomanPS-BoldItalicMT'] = 'Times-BoldItalic';\n  t['TimesNewRomanPS-BoldMT'] = 'Times-Bold';\n  t['TimesNewRomanPS-Italic'] = 'Times-Italic';\n  t['TimesNewRomanPS-ItalicMT'] = 'Times-Italic';\n  t['TimesNewRomanPSMT'] = 'Times-Roman';\n  t['TimesNewRomanPSMT-Bold'] = 'Times-Bold';\n  t['TimesNewRomanPSMT-BoldItalic'] = 'Times-BoldItalic';\n  t['TimesNewRomanPSMT-Italic'] = 'Times-Italic';\n});\n\n/**\n * Holds the map of the non-standard fonts that might be included as\n * a standard fonts without glyph data.\n */\nvar getNonStdFontMap = getLookupTableFactory(function (t) {\n  t['Calibri'] = 'Helvetica';\n  t['Calibri-Bold'] = 'Helvetica-Bold';\n  t['Calibri-BoldItalic'] = 'Helvetica-BoldOblique';\n  t['Calibri-Italic'] = 'Helvetica-Oblique';\n  t['CenturyGothic'] = 'Helvetica';\n  t['CenturyGothic-Bold'] = 'Helvetica-Bold';\n  t['CenturyGothic-BoldItalic'] = 'Helvetica-BoldOblique';\n  t['CenturyGothic-Italic'] = 'Helvetica-Oblique';\n  t['ComicSansMS'] = 'Comic Sans MS';\n  t['ComicSansMS-Bold'] = 'Comic Sans MS-Bold';\n  t['ComicSansMS-BoldItalic'] = 'Comic Sans MS-BoldItalic';\n  t['ComicSansMS-Italic'] = 'Comic Sans MS-Italic';\n  t['LucidaConsole'] = 'Courier';\n  t['LucidaConsole-Bold'] = 'Courier-Bold';\n  t['LucidaConsole-BoldItalic'] = 'Courier-BoldOblique';\n  t['LucidaConsole-Italic'] = 'Courier-Oblique';\n  t['LucidaSans-Demi'] = 'Helvetica-Bold';\n  t['MS-Gothic'] = 'MS Gothic';\n  t['MS-Gothic-Bold'] = 'MS Gothic-Bold';\n  t['MS-Gothic-BoldItalic'] = 'MS Gothic-BoldItalic';\n  t['MS-Gothic-Italic'] = 'MS Gothic-Italic';\n  t['MS-Mincho'] = 'MS Mincho';\n  t['MS-Mincho-Bold'] = 'MS Mincho-Bold';\n  t['MS-Mincho-BoldItalic'] = 'MS Mincho-BoldItalic';\n  t['MS-Mincho-Italic'] = 'MS Mincho-Italic';\n  t['MS-PGothic'] = 'MS PGothic';\n  t['MS-PGothic-Bold'] = 'MS PGothic-Bold';\n  t['MS-PGothic-BoldItalic'] = 'MS PGothic-BoldItalic';\n  t['MS-PGothic-Italic'] = 'MS PGothic-Italic';\n  t['MS-PMincho'] = 'MS PMincho';\n  t['MS-PMincho-Bold'] = 'MS PMincho-Bold';\n  t['MS-PMincho-BoldItalic'] = 'MS PMincho-BoldItalic';\n  t['MS-PMincho-Italic'] = 'MS PMincho-Italic';\n  t['NuptialScript'] = 'Times-Italic';\n  t['Wingdings'] = 'ZapfDingbats';\n});\n\nvar getSerifFonts = getLookupTableFactory(function (t) {\n  t['Adobe Jenson'] = true;\n  t['Adobe Text'] = true;\n  t['Albertus'] = true;\n  t['Aldus'] = true;\n  t['Alexandria'] = true;\n  t['Algerian'] = true;\n  t['American Typewriter'] = true;\n  t['Antiqua'] = true;\n  t['Apex'] = true;\n  t['Arno'] = true;\n  t['Aster'] = true;\n  t['Aurora'] = true;\n  t['Baskerville'] = true;\n  t['Bell'] = true;\n  t['Bembo'] = true;\n  t['Bembo Schoolbook'] = true;\n  t['Benguiat'] = true;\n  t['Berkeley Old Style'] = true;\n  t['Bernhard Modern'] = true;\n  t['Berthold City'] = true;\n  t['Bodoni'] = true;\n  t['Bauer Bodoni'] = true;\n  t['Book Antiqua'] = true;\n  t['Bookman'] = true;\n  t['Bordeaux Roman'] = true;\n  t['Californian FB'] = true;\n  t['Calisto'] = true;\n  t['Calvert'] = true;\n  t['Capitals'] = true;\n  t['Cambria'] = true;\n  t['Cartier'] = true;\n  t['Caslon'] = true;\n  t['Catull'] = true;\n  t['Centaur'] = true;\n  t['Century Old Style'] = true;\n  t['Century Schoolbook'] = true;\n  t['Chaparral'] = true;\n  t['Charis SIL'] = true;\n  t['Cheltenham'] = true;\n  t['Cholla Slab'] = true;\n  t['Clarendon'] = true;\n  t['Clearface'] = true;\n  t['Cochin'] = true;\n  t['Colonna'] = true;\n  t['Computer Modern'] = true;\n  t['Concrete Roman'] = true;\n  t['Constantia'] = true;\n  t['Cooper Black'] = true;\n  t['Corona'] = true;\n  t['Ecotype'] = true;\n  t['Egyptienne'] = true;\n  t['Elephant'] = true;\n  t['Excelsior'] = true;\n  t['Fairfield'] = true;\n  t['FF Scala'] = true;\n  t['Folkard'] = true;\n  t['Footlight'] = true;\n  t['FreeSerif'] = true;\n  t['Friz Quadrata'] = true;\n  t['Garamond'] = true;\n  t['Gentium'] = true;\n  t['Georgia'] = true;\n  t['Gloucester'] = true;\n  t['Goudy Old Style'] = true;\n  t['Goudy Schoolbook'] = true;\n  t['Goudy Pro Font'] = true;\n  t['Granjon'] = true;\n  t['Guardian Egyptian'] = true;\n  t['Heather'] = true;\n  t['Hercules'] = true;\n  t['High Tower Text'] = true;\n  t['Hiroshige'] = true;\n  t['Hoefler Text'] = true;\n  t['Humana Serif'] = true;\n  t['Imprint'] = true;\n  t['Ionic No. 5'] = true;\n  t['Janson'] = true;\n  t['Joanna'] = true;\n  t['Korinna'] = true;\n  t['Lexicon'] = true;\n  t['Liberation Serif'] = true;\n  t['Linux Libertine'] = true;\n  t['Literaturnaya'] = true;\n  t['Lucida'] = true;\n  t['Lucida Bright'] = true;\n  t['Melior'] = true;\n  t['Memphis'] = true;\n  t['Miller'] = true;\n  t['Minion'] = true;\n  t['Modern'] = true;\n  t['Mona Lisa'] = true;\n  t['Mrs Eaves'] = true;\n  t['MS Serif'] = true;\n  t['Museo Slab'] = true;\n  t['New York'] = true;\n  t['Nimbus Roman'] = true;\n  t['NPS Rawlinson Roadway'] = true;\n  t['NuptialScript'] = true;\n  t['Palatino'] = true;\n  t['Perpetua'] = true;\n  t['Plantin'] = true;\n  t['Plantin Schoolbook'] = true;\n  t['Playbill'] = true;\n  t['Poor Richard'] = true;\n  t['Rawlinson Roadway'] = true;\n  t['Renault'] = true;\n  t['Requiem'] = true;\n  t['Rockwell'] = true;\n  t['Roman'] = true;\n  t['Rotis Serif'] = true;\n  t['Sabon'] = true;\n  t['Scala'] = true;\n  t['Seagull'] = true;\n  t['Sistina'] = true;\n  t['Souvenir'] = true;\n  t['STIX'] = true;\n  t['Stone Informal'] = true;\n  t['Stone Serif'] = true;\n  t['Sylfaen'] = true;\n  t['Times'] = true;\n  t['Trajan'] = true;\n  t['Trinit茅'] = true;\n  t['Trump Mediaeval'] = true;\n  t['Utopia'] = true;\n  t['Vale Type'] = true;\n  t['Bitstream Vera'] = true;\n  t['Vera Serif'] = true;\n  t['Versailles'] = true;\n  t['Wanted'] = true;\n  t['Weiss'] = true;\n  t['Wide Latin'] = true;\n  t['Windsor'] = true;\n  t['XITS'] = true;\n});\n\nvar getSymbolsFonts = getLookupTableFactory(function (t) {\n  t['Dingbats'] = true;\n  t['Symbol'] = true;\n  t['ZapfDingbats'] = true;\n});\n\n// Glyph map for well-known standard fonts. Sometimes Ghostscript uses CID\n// fonts, but does not embed the CID to GID mapping. The mapping is incomplete\n// for all glyphs, but common for some set of the standard fonts.\nvar getGlyphMapForStandardFonts = getLookupTableFactory(function (t) {\n  t[2] = 10; t[3] = 32; t[4] = 33; t[5] = 34; t[6] = 35; t[7] = 36; t[8] = 37;\n  t[9] = 38; t[10] = 39; t[11] = 40; t[12] = 41; t[13] = 42; t[14] = 43;\n  t[15] = 44; t[16] = 45; t[17] = 46; t[18] = 47; t[19] = 48; t[20] = 49;\n  t[21] = 50; t[22] = 51; t[23] = 52; t[24] = 53; t[25] = 54; t[26] = 55;\n  t[27] = 56; t[28] = 57; t[29] = 58; t[30] = 894; t[31] = 60; t[32] = 61;\n  t[33] = 62; t[34] = 63; t[35] = 64; t[36] = 65; t[37] = 66; t[38] = 67;\n  t[39] = 68; t[40] = 69; t[41] = 70; t[42] = 71; t[43] = 72; t[44] = 73;\n  t[45] = 74; t[46] = 75; t[47] = 76; t[48] = 77; t[49] = 78; t[50] = 79;\n  t[51] = 80; t[52] = 81; t[53] = 82; t[54] = 83; t[55] = 84; t[56] = 85;\n  t[57] = 86; t[58] = 87; t[59] = 88; t[60] = 89; t[61] = 90; t[62] = 91;\n  t[63] = 92; t[64] = 93; t[65] = 94; t[66] = 95; t[67] = 96; t[68] = 97;\n  t[69] = 98; t[70] = 99; t[71] = 100; t[72] = 101; t[73] = 102; t[74] = 103;\n  t[75] = 104; t[76] = 105; t[77] = 106; t[78] = 107; t[79] = 108;\n  t[80] = 109; t[81] = 110; t[82] = 111; t[83] = 112; t[84] = 113;\n  t[85] = 114; t[86] = 115; t[87] = 116; t[88] = 117; t[89] = 118;\n  t[90] = 119; t[91] = 120; t[92] = 121; t[93] = 122; t[94] = 123;\n  t[95] = 124; t[96] = 125; t[97] = 126; t[98] = 196; t[99] = 197;\n  t[100] = 199; t[101] = 201; t[102] = 209; t[103] = 214; t[104] = 220;\n  t[105] = 225; t[106] = 224; t[107] = 226; t[108] = 228; t[109] = 227;\n  t[110] = 229; t[111] = 231; t[112] = 233; t[113] = 232; t[114] = 234;\n  t[115] = 235; t[116] = 237; t[117] = 236; t[118] = 238; t[119] = 239;\n  t[120] = 241; t[121] = 243; t[122] = 242; t[123] = 244; t[124] = 246;\n  t[125] = 245; t[126] = 250; t[127] = 249; t[128] = 251; t[129] = 252;\n  t[130] = 8224; t[131] = 176; t[132] = 162; t[133] = 163; t[134] = 167;\n  t[135] = 8226; t[136] = 182; t[137] = 223; t[138] = 174; t[139] = 169;\n  t[140] = 8482; t[141] = 180; t[142] = 168; t[143] = 8800; t[144] = 198;\n  t[145] = 216; t[146] = 8734; t[147] = 177; t[148] = 8804; t[149] = 8805;\n  t[150] = 165; t[151] = 181; t[152] = 8706; t[153] = 8721; t[154] = 8719;\n  t[156] = 8747; t[157] = 170; t[158] = 186; t[159] = 8486; t[160] = 230;\n  t[161] = 248; t[162] = 191; t[163] = 161; t[164] = 172; t[165] = 8730;\n  t[166] = 402; t[167] = 8776; t[168] = 8710; t[169] = 171; t[170] = 187;\n  t[171] = 8230; t[210] = 218; t[223] = 711; t[224] = 321; t[225] = 322;\n  t[227] = 353; t[229] = 382; t[234] = 253; t[252] = 263; t[253] = 268;\n  t[254] = 269; t[258] = 258; t[260] = 260; t[261] = 261; t[265] = 280;\n  t[266] = 281; t[268] = 283; t[269] = 313; t[275] = 323; t[276] = 324;\n  t[278] = 328; t[284] = 345; t[285] = 346; t[286] = 347; t[292] = 367;\n  t[295] = 377; t[296] = 378; t[298] = 380; t[305] = 963; t[306] = 964;\n  t[307] = 966; t[308] = 8215; t[309] = 8252; t[310] = 8319; t[311] = 8359;\n  t[312] = 8592; t[313] = 8593; t[337] = 9552; t[493] = 1039;\n  t[494] = 1040; t[705] = 1524; t[706] = 8362; t[710] = 64288; t[711] = 64298;\n  t[759] = 1617; t[761] = 1776; t[763] = 1778; t[775] = 1652; t[777] = 1764;\n  t[778] = 1780; t[779] = 1781; t[780] = 1782; t[782] = 771; t[783] = 64726;\n  t[786] = 8363; t[788] = 8532; t[790] = 768; t[791] = 769; t[792] = 768;\n  t[795] = 803; t[797] = 64336; t[798] = 64337; t[799] = 64342;\n  t[800] = 64343; t[801] = 64344; t[802] = 64345; t[803] = 64362;\n  t[804] = 64363; t[805] = 64364; t[2424] = 7821; t[2425] = 7822;\n  t[2426] = 7823; t[2427] = 7824; t[2428] = 7825; t[2429] = 7826;\n  t[2430] = 7827; t[2433] = 7682; t[2678] = 8045; t[2679] = 8046;\n  t[2830] = 1552; t[2838] = 686; t[2840] = 751; t[2842] = 753; t[2843] = 754;\n  t[2844] = 755; t[2846] = 757; t[2856] = 767; t[2857] = 848; t[2858] = 849;\n  t[2862] = 853; t[2863] = 854; t[2864] = 855; t[2865] = 861; t[2866] = 862;\n  t[2906] = 7460; t[2908] = 7462; t[2909] = 7463; t[2910] = 7464;\n  t[2912] = 7466; t[2913] = 7467; t[2914] = 7468; t[2916] = 7470;\n  t[2917] = 7471; t[2918] = 7472; t[2920] = 7474; t[2921] = 7475;\n  t[2922] = 7476; t[2924] = 7478; t[2925] = 7479; t[2926] = 7480;\n  t[2928] = 7482; t[2929] = 7483; t[2930] = 7484; t[2932] = 7486;\n  t[2933] = 7487; t[2934] = 7488; t[2936] = 7490; t[2937] = 7491;\n  t[2938] = 7492; t[2940] = 7494; t[2941] = 7495; t[2942] = 7496;\n  t[2944] = 7498; t[2946] = 7500; t[2948] = 7502; t[2950] = 7504;\n  t[2951] = 7505; t[2952] = 7506; t[2954] = 7508; t[2955] = 7509;\n  t[2956] = 7510; t[2958] = 7512; t[2959] = 7513; t[2960] = 7514;\n  t[2962] = 7516; t[2963] = 7517; t[2964] = 7518; t[2966] = 7520;\n  t[2967] = 7521; t[2968] = 7522; t[2970] = 7524; t[2971] = 7525;\n  t[2972] = 7526; t[2974] = 7528; t[2975] = 7529; t[2976] = 7530;\n  t[2978] = 1537; t[2979] = 1538; t[2980] = 1539; t[2982] = 1549;\n  t[2983] = 1551; t[2984] = 1552; t[2986] = 1554; t[2987] = 1555;\n  t[2988] = 1556; t[2990] = 1623; t[2991] = 1624; t[2995] = 1775;\n  t[2999] = 1791; t[3002] = 64290; t[3003] = 64291; t[3004] = 64292;\n  t[3006] = 64294; t[3007] = 64295; t[3008] = 64296; t[3011] = 1900;\n  t[3014] = 8223; t[3015] = 8244; t[3017] = 7532; t[3018] = 7533;\n  t[3019] = 7534; t[3075] = 7590; t[3076] = 7591; t[3079] = 7594;\n  t[3080] = 7595; t[3083] = 7598; t[3084] = 7599; t[3087] = 7602;\n  t[3088] = 7603; t[3091] = 7606; t[3092] = 7607; t[3095] = 7610;\n  t[3096] = 7611; t[3099] = 7614; t[3100] = 7615; t[3103] = 7618;\n  t[3104] = 7619; t[3107] = 8337; t[3108] = 8338; t[3116] = 1884;\n  t[3119] = 1885; t[3120] = 1885; t[3123] = 1886; t[3124] = 1886;\n  t[3127] = 1887; t[3128] = 1887; t[3131] = 1888; t[3132] = 1888;\n  t[3135] = 1889; t[3136] = 1889; t[3139] = 1890; t[3140] = 1890;\n  t[3143] = 1891; t[3144] = 1891; t[3147] = 1892; t[3148] = 1892;\n  t[3153] = 580; t[3154] = 581; t[3157] = 584; t[3158] = 585; t[3161] = 588;\n  t[3162] = 589; t[3165] = 891; t[3166] = 892; t[3169] = 1274; t[3170] = 1275;\n  t[3173] = 1278; t[3174] = 1279; t[3181] = 7622; t[3182] = 7623;\n  t[3282] = 11799; t[3316] = 578; t[3379] = 42785; t[3393] = 1159;\n  t[3416] = 8377;\n});\n\n// The glyph map for ArialBlack differs slightly from the glyph map used for\n// other well-known standard fonts. Hence we use this (incomplete) CID to GID\n// mapping to adjust the glyph map for non-embedded ArialBlack fonts.\nvar getSupplementalGlyphMapForArialBlack =\n    getLookupTableFactory(function (t) {\n  t[227] = 322; t[264] = 261; t[291] = 346;\n});\n\n// The glyph map for Calibri (a Windows font) differs from the glyph map used\n// in the standard fonts. Hence we use this (incomplete) CID to GID mapping to\n// adjust the glyph map for non-embedded Calibri fonts.\nlet getSupplementalGlyphMapForCalibri = getLookupTableFactory(function(t) {\n  t[1] = 32; t[4] = 65; t[17] = 66; t[18] = 67; t[24] = 68; t[28] = 69;\n  t[38] = 70; t[39] = 71; t[44] = 72; t[47] = 73; t[58] = 74; t[60] = 75;\n  t[62] = 76; t[68] = 77; t[69] = 78; t[75] = 79; t[87] = 80; t[89] = 81;\n  t[90] = 82; t[94] = 83; t[100] = 84; t[104] = 85; t[115] = 86; t[116] = 87;\n  t[121] = 88; t[122] = 89; t[127] = 90; t[258] = 97; t[268] = 261; t[271] = 98;\n  t[272] = 99; t[273] = 263; t[282] = 100; t[286] = 101; t[295] = 281;\n  t[296] = 102; t[336] = 103; t[346] = 104; t[349] = 105; t[361] = 106;\n  t[364] = 107; t[367] = 108; t[371] = 322; t[373] = 109; t[374] = 110;\n  t[381] = 111; t[383] = 243; t[393] = 112; t[395] = 113; t[396] = 114;\n  t[400] = 115; t[401] = 347; t[410] = 116; t[437] = 117; t[448] = 118;\n  t[449] = 119; t[454] = 120; t[455] = 121; t[460] = 122; t[463] = 380;\n  t[853] = 44; t[855] = 58; t[856] = 46; t[876] = 47; t[878] = 45; t[882] = 45;\n  t[894] = 40; t[895] = 41; t[896] = 91; t[897] = 93; t[923] = 64; t[1004] = 48;\n  t[1005] = 49; t[1006] = 50; t[1007] = 51; t[1008] = 52; t[1009] = 53;\n  t[1010] = 54; t[1011] = 55; t[1012] = 56; t[1013] = 57; t[1081] = 37;\n  t[1085] = 43; t[1086] = 45;\n});\n\nexport {\n  getStdFontMap,\n  getNonStdFontMap,\n  getSerifFonts,\n  getSymbolsFonts,\n  getGlyphMapForStandardFonts,\n  getSupplementalGlyphMapForArialBlack,\n  getSupplementalGlyphMapForCalibri,\n};\n","/* Copyright 2016 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* no-babel-preset */\n\nvar getLookupTableFactory = require('../shared/util').getLookupTableFactory;\n\n// Some characters, e.g. copyrightserif, are mapped to the private use area\n// and might not be displayed using standard fonts. Mapping/hacking well-known\n// chars to the similar equivalents in the normal characters range.\nvar getSpecialPUASymbols = getLookupTableFactory(function (t) {\n  t[63721] = 0x00A9; // copyrightsans (0xF8E9) => copyright\n  t[63193] = 0x00A9; // copyrightserif (0xF6D9) => copyright\n  t[63720] = 0x00AE; // registersans (0xF8E8) => registered\n  t[63194] = 0x00AE; // registerserif (0xF6DA) => registered\n  t[63722] = 0x2122; // trademarksans (0xF8EA) => trademark\n  t[63195] = 0x2122; // trademarkserif (0xF6DB) => trademark\n  t[63729] = 0x23A7; // bracelefttp (0xF8F1)\n  t[63730] = 0x23A8; // braceleftmid (0xF8F2)\n  t[63731] = 0x23A9; // braceleftbt (0xF8F3)\n  t[63740] = 0x23AB; // bracerighttp (0xF8FC)\n  t[63741] = 0x23AC; // bracerightmid (0xF8FD)\n  t[63742] = 0x23AD; // bracerightbt (0xF8FE)\n  t[63726] = 0x23A1; // bracketlefttp (0xF8EE)\n  t[63727] = 0x23A2; // bracketleftex (0xF8EF)\n  t[63728] = 0x23A3; // bracketleftbt (0xF8F0)\n  t[63737] = 0x23A4; // bracketrighttp (0xF8F9)\n  t[63738] = 0x23A5; // bracketrightex (0xF8FA)\n  t[63739] = 0x23A6; // bracketrightbt (0xF8FB)\n  t[63723] = 0x239B; // parenlefttp (0xF8EB)\n  t[63724] = 0x239C; // parenleftex (0xF8EC)\n  t[63725] = 0x239D; // parenleftbt (0xF8ED)\n  t[63734] = 0x239E; // parenrighttp (0xF8F6)\n  t[63735] = 0x239F; // parenrightex (0xF8F7)\n  t[63736] = 0x23A0; // parenrightbt (0xF8F8)\n});\n\nfunction mapSpecialUnicodeValues(code) {\n  if (code >= 0xFFF0 && code <= 0xFFFF) { // Specials unicode block.\n    return 0;\n  } else if (code >= 0xF600 && code <= 0xF8FF) {\n    return (getSpecialPUASymbols()[code] || code);\n  } else if (code === 0x00AD) { // softhyphen\n    return 0x002D; // hyphen\n  }\n  return code;\n}\n\nfunction getUnicodeForGlyph(name, glyphsUnicodeMap) {\n  var unicode = glyphsUnicodeMap[name];\n  if (unicode !== undefined) {\n    return unicode;\n  }\n  if (!name) {\n    return -1;\n  }\n  // Try to recover valid Unicode values from 'uniXXXX'/'uXXXX{XX}' glyphs.\n  if (name[0] === 'u') {\n    var nameLen = name.length, hexStr;\n\n    if (nameLen === 7 && name[1] === 'n' && name[2] === 'i') { // 'uniXXXX'\n      hexStr = name.substring(3);\n    } else if (nameLen >= 5 && nameLen <= 7) { // 'uXXXX{XX}'\n      hexStr = name.substring(1);\n    } else {\n      return -1;\n    }\n    // Check for upper-case hexadecimal characters, to avoid false positives.\n    if (hexStr === hexStr.toUpperCase()) {\n      unicode = parseInt(hexStr, 16);\n      if (unicode >= 0) {\n        return unicode;\n      }\n    }\n  }\n  return -1;\n}\n\nvar UnicodeRanges = [\n  { 'begin': 0x0000, 'end': 0x007F, }, // Basic Latin\n  { 'begin': 0x0080, 'end': 0x00FF, }, // Latin-1 Supplement\n  { 'begin': 0x0100, 'end': 0x017F, }, // Latin Extended-A\n  { 'begin': 0x0180, 'end': 0x024F, }, // Latin Extended-B\n  { 'begin': 0x0250, 'end': 0x02AF, }, // IPA Extensions\n  { 'begin': 0x02B0, 'end': 0x02FF, }, // Spacing Modifier Letters\n  { 'begin': 0x0300, 'end': 0x036F, }, // Combining Diacritical Marks\n  { 'begin': 0x0370, 'end': 0x03FF, }, // Greek and Coptic\n  { 'begin': 0x2C80, 'end': 0x2CFF, }, // Coptic\n  { 'begin': 0x0400, 'end': 0x04FF, }, // Cyrillic\n  { 'begin': 0x0530, 'end': 0x058F, }, // Armenian\n  { 'begin': 0x0590, 'end': 0x05FF, }, // Hebrew\n  { 'begin': 0xA500, 'end': 0xA63F, }, // Vai\n  { 'begin': 0x0600, 'end': 0x06FF, }, // Arabic\n  { 'begin': 0x07C0, 'end': 0x07FF, }, // NKo\n  { 'begin': 0x0900, 'end': 0x097F, }, // Devanagari\n  { 'begin': 0x0980, 'end': 0x09FF, }, // Bengali\n  { 'begin': 0x0A00, 'end': 0x0A7F, }, // Gurmukhi\n  { 'begin': 0x0A80, 'end': 0x0AFF, }, // Gujarati\n  { 'begin': 0x0B00, 'end': 0x0B7F, }, // Oriya\n  { 'begin': 0x0B80, 'end': 0x0BFF, }, // Tamil\n  { 'begin': 0x0C00, 'end': 0x0C7F, }, // Telugu\n  { 'begin': 0x0C80, 'end': 0x0CFF, }, // Kannada\n  { 'begin': 0x0D00, 'end': 0x0D7F, }, // Malayalam\n  { 'begin': 0x0E00, 'end': 0x0E7F, }, // Thai\n  { 'begin': 0x0E80, 'end': 0x0EFF, }, // Lao\n  { 'begin': 0x10A0, 'end': 0x10FF, }, // Georgian\n  { 'begin': 0x1B00, 'end': 0x1B7F, }, // Balinese\n  { 'begin': 0x1100, 'end': 0x11FF, }, // Hangul Jamo\n  { 'begin': 0x1E00, 'end': 0x1EFF, }, // Latin Extended Additional\n  { 'begin': 0x1F00, 'end': 0x1FFF, }, // Greek Extended\n  { 'begin': 0x2000, 'end': 0x206F, }, // General Punctuation\n  { 'begin': 0x2070, 'end': 0x209F, }, // Superscripts And Subscripts\n  { 'begin': 0x20A0, 'end': 0x20CF, }, // Currency Symbol\n  { 'begin': 0x20D0, 'end': 0x20FF, }, // Combining Diacritical Marks\n  { 'begin': 0x2100, 'end': 0x214F, }, // Letterlike Symbols\n  { 'begin': 0x2150, 'end': 0x218F, }, // Number Forms\n  { 'begin': 0x2190, 'end': 0x21FF, }, // Arrows\n  { 'begin': 0x2200, 'end': 0x22FF, }, // Mathematical Operators\n  { 'begin': 0x2300, 'end': 0x23FF, }, // Miscellaneous Technical\n  { 'begin': 0x2400, 'end': 0x243F, }, // Control Pictures\n  { 'begin': 0x2440, 'end': 0x245F, }, // Optical Character Recognition\n  { 'begin': 0x2460, 'end': 0x24FF, }, // Enclosed Alphanumerics\n  { 'begin': 0x2500, 'end': 0x257F, }, // Box Drawing\n  { 'begin': 0x2580, 'end': 0x259F, }, // Block Elements\n  { 'begin': 0x25A0, 'end': 0x25FF, }, // Geometric Shapes\n  { 'begin': 0x2600, 'end': 0x26FF, }, // Miscellaneous Symbols\n  { 'begin': 0x2700, 'end': 0x27BF, }, // Dingbats\n  { 'begin': 0x3000, 'end': 0x303F, }, // CJK Symbols And Punctuation\n  { 'begin': 0x3040, 'end': 0x309F, }, // Hiragana\n  { 'begin': 0x30A0, 'end': 0x30FF, }, // Katakana\n  { 'begin': 0x3100, 'end': 0x312F, }, // Bopomofo\n  { 'begin': 0x3130, 'end': 0x318F, }, // Hangul Compatibility Jamo\n  { 'begin': 0xA840, 'end': 0xA87F, }, // Phags-pa\n  { 'begin': 0x3200, 'end': 0x32FF, }, // Enclosed CJK Letters And Months\n  { 'begin': 0x3300, 'end': 0x33FF, }, // CJK Compatibility\n  { 'begin': 0xAC00, 'end': 0xD7AF, }, // Hangul Syllables\n  { 'begin': 0xD800, 'end': 0xDFFF, }, // Non-Plane 0 *\n  { 'begin': 0x10900, 'end': 0x1091F, }, // Phoenicia\n  { 'begin': 0x4E00, 'end': 0x9FFF, }, // CJK Unified Ideographs\n  { 'begin': 0xE000, 'end': 0xF8FF, }, // Private Use Area (plane 0)\n  { 'begin': 0x31C0, 'end': 0x31EF, }, // CJK Strokes\n  { 'begin': 0xFB00, 'end': 0xFB4F, }, // Alphabetic Presentation Forms\n  { 'begin': 0xFB50, 'end': 0xFDFF, }, // Arabic Presentation Forms-A\n  { 'begin': 0xFE20, 'end': 0xFE2F, }, // Combining Half Marks\n  { 'begin': 0xFE10, 'end': 0xFE1F, }, // Vertical Forms\n  { 'begin': 0xFE50, 'end': 0xFE6F, }, // Small Form Variants\n  { 'begin': 0xFE70, 'end': 0xFEFF, }, // Arabic Presentation Forms-B\n  { 'begin': 0xFF00, 'end': 0xFFEF, }, // Halfwidth And Fullwidth Forms\n  { 'begin': 0xFFF0, 'end': 0xFFFF, }, // Specials\n  { 'begin': 0x0F00, 'end': 0x0FFF, }, // Tibetan\n  { 'begin': 0x0700, 'end': 0x074F, }, // Syriac\n  { 'begin': 0x0780, 'end': 0x07BF, }, // Thaana\n  { 'begin': 0x0D80, 'end': 0x0DFF, }, // Sinhala\n  { 'begin': 0x1000, 'end': 0x109F, }, // Myanmar\n  { 'begin': 0x1200, 'end': 0x137F, }, // Ethiopic\n  { 'begin': 0x13A0, 'end': 0x13FF, }, // Cherokee\n  { 'begin': 0x1400, 'end': 0x167F, }, // Unified Canadian Aboriginal Syllabics\n  { 'begin': 0x1680, 'end': 0x169F, }, // Ogham\n  { 'begin': 0x16A0, 'end': 0x16FF, }, // Runic\n  { 'begin': 0x1780, 'end': 0x17FF, }, // Khmer\n  { 'begin': 0x1800, 'end': 0x18AF, }, // Mongolian\n  { 'begin': 0x2800, 'end': 0x28FF, }, // Braille Patterns\n  { 'begin': 0xA000, 'end': 0xA48F, }, // Yi Syllables\n  { 'begin': 0x1700, 'end': 0x171F, }, // Tagalog\n  { 'begin': 0x10300, 'end': 0x1032F, }, // Old Italic\n  { 'begin': 0x10330, 'end': 0x1034F, }, // Gothic\n  { 'begin': 0x10400, 'end': 0x1044F, }, // Deseret\n  { 'begin': 0x1D000, 'end': 0x1D0FF, }, // Byzantine Musical Symbols\n  { 'begin': 0x1D400, 'end': 0x1D7FF, }, // Mathematical Alphanumeric Symbols\n  { 'begin': 0xFF000, 'end': 0xFFFFD, }, // Private Use (plane 15)\n  { 'begin': 0xFE00, 'end': 0xFE0F, }, // Variation Selectors\n  { 'begin': 0xE0000, 'end': 0xE007F, }, // Tags\n  { 'begin': 0x1900, 'end': 0x194F, }, // Limbu\n  { 'begin': 0x1950, 'end': 0x197F, }, // Tai Le\n  { 'begin': 0x1980, 'end': 0x19DF, }, // New Tai Lue\n  { 'begin': 0x1A00, 'end': 0x1A1F, }, // Buginese\n  { 'begin': 0x2C00, 'end': 0x2C5F, }, // Glagolitic\n  { 'begin': 0x2D30, 'end': 0x2D7F, }, // Tifinagh\n  { 'begin': 0x4DC0, 'end': 0x4DFF, }, // Yijing Hexagram Symbols\n  { 'begin': 0xA800, 'end': 0xA82F, }, // Syloti Nagri\n  { 'begin': 0x10000, 'end': 0x1007F, }, // Linear B Syllabary\n  { 'begin': 0x10140, 'end': 0x1018F, }, // Ancient Greek Numbers\n  { 'begin': 0x10380, 'end': 0x1039F, }, // Ugaritic\n  { 'begin': 0x103A0, 'end': 0x103DF, }, // Old Persian\n  { 'begin': 0x10450, 'end': 0x1047F, }, // Shavian\n  { 'begin': 0x10480, 'end': 0x104AF, }, // Osmanya\n  { 'begin': 0x10800, 'end': 0x1083F, }, // Cypriot Syllabary\n  { 'begin': 0x10A00, 'end': 0x10A5F, }, // Kharoshthi\n  { 'begin': 0x1D300, 'end': 0x1D35F, }, // Tai Xuan Jing Symbols\n  { 'begin': 0x12000, 'end': 0x123FF, }, // Cuneiform\n  { 'begin': 0x1D360, 'end': 0x1D37F, }, // Counting Rod Numerals\n  { 'begin': 0x1B80, 'end': 0x1BBF, }, // Sundanese\n  { 'begin': 0x1C00, 'end': 0x1C4F, }, // Lepcha\n  { 'begin': 0x1C50, 'end': 0x1C7F, }, // Ol Chiki\n  { 'begin': 0xA880, 'end': 0xA8DF, }, // Saurashtra\n  { 'begin': 0xA900, 'end': 0xA92F, }, // Kayah Li\n  { 'begin': 0xA930, 'end': 0xA95F, }, // Rejang\n  { 'begin': 0xAA00, 'end': 0xAA5F, }, // Cham\n  { 'begin': 0x10190, 'end': 0x101CF, }, // Ancient Symbols\n  { 'begin': 0x101D0, 'end': 0x101FF, }, // Phaistos Disc\n  { 'begin': 0x102A0, 'end': 0x102DF, }, // Carian\n  { 'begin': 0x1F030, 'end': 0x1F09F, }  // Domino Tiles\n];\n\nfunction getUnicodeRangeFor(value) {\n  for (var i = 0, ii = UnicodeRanges.length; i < ii; i++) {\n    var range = UnicodeRanges[i];\n    if (value >= range.begin && value < range.end) {\n      return i;\n    }\n  }\n  return -1;\n}\n\nfunction isRTLRangeFor(value) {\n  var range = UnicodeRanges[13];\n  if (value >= range.begin && value < range.end) {\n    return true;\n  }\n  range = UnicodeRanges[11];\n  if (value >= range.begin && value < range.end) {\n    return true;\n  }\n  return false;\n}\n\n// The normalization table is obtained by filtering the Unicode characters\n// database with <compat> entries.\nvar getNormalizedUnicodes = getLookupTableFactory(function (t) {\n  t['\\u00A8'] = '\\u0020\\u0308';\n  t['\\u00AF'] = '\\u0020\\u0304';\n  t['\\u00B4'] = '\\u0020\\u0301';\n  t['\\u00B5'] = '\\u03BC';\n  t['\\u00B8'] = '\\u0020\\u0327';\n  t['\\u0132'] = '\\u0049\\u004A';\n  t['\\u0133'] = '\\u0069\\u006A';\n  t['\\u013F'] = '\\u004C\\u00B7';\n  t['\\u0140'] = '\\u006C\\u00B7';\n  t['\\u0149'] = '\\u02BC\\u006E';\n  t['\\u017F'] = '\\u0073';\n  t['\\u01C4'] = '\\u0044\\u017D';\n  t['\\u01C5'] = '\\u0044\\u017E';\n  t['\\u01C6'] = '\\u0064\\u017E';\n  t['\\u01C7'] = '\\u004C\\u004A';\n  t['\\u01C8'] = '\\u004C\\u006A';\n  t['\\u01C9'] = '\\u006C\\u006A';\n  t['\\u01CA'] = '\\u004E\\u004A';\n  t['\\u01CB'] = '\\u004E\\u006A';\n  t['\\u01CC'] = '\\u006E\\u006A';\n  t['\\u01F1'] = '\\u0044\\u005A';\n  t['\\u01F2'] = '\\u0044\\u007A';\n  t['\\u01F3'] = '\\u0064\\u007A';\n  t['\\u02D8'] = '\\u0020\\u0306';\n  t['\\u02D9'] = '\\u0020\\u0307';\n  t['\\u02DA'] = '\\u0020\\u030A';\n  t['\\u02DB'] = '\\u0020\\u0328';\n  t['\\u02DC'] = '\\u0020\\u0303';\n  t['\\u02DD'] = '\\u0020\\u030B';\n  t['\\u037A'] = '\\u0020\\u0345';\n  t['\\u0384'] = '\\u0020\\u0301';\n  t['\\u03D0'] = '\\u03B2';\n  t['\\u03D1'] = '\\u03B8';\n  t['\\u03D2'] = '\\u03A5';\n  t['\\u03D5'] = '\\u03C6';\n  t['\\u03D6'] = '\\u03C0';\n  t['\\u03F0'] = '\\u03BA';\n  t['\\u03F1'] = '\\u03C1';\n  t['\\u03F2'] = '\\u03C2';\n  t['\\u03F4'] = '\\u0398';\n  t['\\u03F5'] = '\\u03B5';\n  t['\\u03F9'] = '\\u03A3';\n  t['\\u0587'] = '\\u0565\\u0582';\n  t['\\u0675'] = '\\u0627\\u0674';\n  t['\\u0676'] = '\\u0648\\u0674';\n  t['\\u0677'] = '\\u06C7\\u0674';\n  t['\\u0678'] = '\\u064A\\u0674';\n  t['\\u0E33'] = '\\u0E4D\\u0E32';\n  t['\\u0EB3'] = '\\u0ECD\\u0EB2';\n  t['\\u0EDC'] = '\\u0EAB\\u0E99';\n  t['\\u0EDD'] = '\\u0EAB\\u0EA1';\n  t['\\u0F77'] = '\\u0FB2\\u0F81';\n  t['\\u0F79'] = '\\u0FB3\\u0F81';\n  t['\\u1E9A'] = '\\u0061\\u02BE';\n  t['\\u1FBD'] = '\\u0020\\u0313';\n  t['\\u1FBF'] = '\\u0020\\u0313';\n  t['\\u1FC0'] = '\\u0020\\u0342';\n  t['\\u1FFE'] = '\\u0020\\u0314';\n  t['\\u2002'] = '\\u0020';\n  t['\\u2003'] = '\\u0020';\n  t['\\u2004'] = '\\u0020';\n  t['\\u2005'] = '\\u0020';\n  t['\\u2006'] = '\\u0020';\n  t['\\u2008'] = '\\u0020';\n  t['\\u2009'] = '\\u0020';\n  t['\\u200A'] = '\\u0020';\n  t['\\u2017'] = '\\u0020\\u0333';\n  t['\\u2024'] = '\\u002E';\n  t['\\u2025'] = '\\u002E\\u002E';\n  t['\\u2026'] = '\\u002E\\u002E\\u002E';\n  t['\\u2033'] = '\\u2032\\u2032';\n  t['\\u2034'] = '\\u2032\\u2032\\u2032';\n  t['\\u2036'] = '\\u2035\\u2035';\n  t['\\u2037'] = '\\u2035\\u2035\\u2035';\n  t['\\u203C'] = '\\u0021\\u0021';\n  t['\\u203E'] = '\\u0020\\u0305';\n  t['\\u2047'] = '\\u003F\\u003F';\n  t['\\u2048'] = '\\u003F\\u0021';\n  t['\\u2049'] = '\\u0021\\u003F';\n  t['\\u2057'] = '\\u2032\\u2032\\u2032\\u2032';\n  t['\\u205F'] = '\\u0020';\n  t['\\u20A8'] = '\\u0052\\u0073';\n  t['\\u2100'] = '\\u0061\\u002F\\u0063';\n  t['\\u2101'] = '\\u0061\\u002F\\u0073';\n  t['\\u2103'] = '\\u00B0\\u0043';\n  t['\\u2105'] = '\\u0063\\u002F\\u006F';\n  t['\\u2106'] = '\\u0063\\u002F\\u0075';\n  t['\\u2107'] = '\\u0190';\n  t['\\u2109'] = '\\u00B0\\u0046';\n  t['\\u2116'] = '\\u004E\\u006F';\n  t['\\u2121'] = '\\u0054\\u0045\\u004C';\n  t['\\u2135'] = '\\u05D0';\n  t['\\u2136'] = '\\u05D1';\n  t['\\u2137'] = '\\u05D2';\n  t['\\u2138'] = '\\u05D3';\n  t['\\u213B'] = '\\u0046\\u0041\\u0058';\n  t['\\u2160'] = '\\u0049';\n  t['\\u2161'] = '\\u0049\\u0049';\n  t['\\u2162'] = '\\u0049\\u0049\\u0049';\n  t['\\u2163'] = '\\u0049\\u0056';\n  t['\\u2164'] = '\\u0056';\n  t['\\u2165'] = '\\u0056\\u0049';\n  t['\\u2166'] = '\\u0056\\u0049\\u0049';\n  t['\\u2167'] = '\\u0056\\u0049\\u0049\\u0049';\n  t['\\u2168'] = '\\u0049\\u0058';\n  t['\\u2169'] = '\\u0058';\n  t['\\u216A'] = '\\u0058\\u0049';\n  t['\\u216B'] = '\\u0058\\u0049\\u0049';\n  t['\\u216C'] = '\\u004C';\n  t['\\u216D'] = '\\u0043';\n  t['\\u216E'] = '\\u0044';\n  t['\\u216F'] = '\\u004D';\n  t['\\u2170'] = '\\u0069';\n  t['\\u2171'] = '\\u0069\\u0069';\n  t['\\u2172'] = '\\u0069\\u0069\\u0069';\n  t['\\u2173'] = '\\u0069\\u0076';\n  t['\\u2174'] = '\\u0076';\n  t['\\u2175'] = '\\u0076\\u0069';\n  t['\\u2176'] = '\\u0076\\u0069\\u0069';\n  t['\\u2177'] = '\\u0076\\u0069\\u0069\\u0069';\n  t['\\u2178'] = '\\u0069\\u0078';\n  t['\\u2179'] = '\\u0078';\n  t['\\u217A'] = '\\u0078\\u0069';\n  t['\\u217B'] = '\\u0078\\u0069\\u0069';\n  t['\\u217C'] = '\\u006C';\n  t['\\u217D'] = '\\u0063';\n  t['\\u217E'] = '\\u0064';\n  t['\\u217F'] = '\\u006D';\n  t['\\u222C'] = '\\u222B\\u222B';\n  t['\\u222D'] = '\\u222B\\u222B\\u222B';\n  t['\\u222F'] = '\\u222E\\u222E';\n  t['\\u2230'] = '\\u222E\\u222E\\u222E';\n  t['\\u2474'] = '\\u0028\\u0031\\u0029';\n  t['\\u2475'] = '\\u0028\\u0032\\u0029';\n  t['\\u2476'] = '\\u0028\\u0033\\u0029';\n  t['\\u2477'] = '\\u0028\\u0034\\u0029';\n  t['\\u2478'] = '\\u0028\\u0035\\u0029';\n  t['\\u2479'] = '\\u0028\\u0036\\u0029';\n  t['\\u247A'] = '\\u0028\\u0037\\u0029';\n  t['\\u247B'] = '\\u0028\\u0038\\u0029';\n  t['\\u247C'] = '\\u0028\\u0039\\u0029';\n  t['\\u247D'] = '\\u0028\\u0031\\u0030\\u0029';\n  t['\\u247E'] = '\\u0028\\u0031\\u0031\\u0029';\n  t['\\u247F'] = '\\u0028\\u0031\\u0032\\u0029';\n  t['\\u2480'] = '\\u0028\\u0031\\u0033\\u0029';\n  t['\\u2481'] = '\\u0028\\u0031\\u0034\\u0029';\n  t['\\u2482'] = '\\u0028\\u0031\\u0035\\u0029';\n  t['\\u2483'] = '\\u0028\\u0031\\u0036\\u0029';\n  t['\\u2484'] = '\\u0028\\u0031\\u0037\\u0029';\n  t['\\u2485'] = '\\u0028\\u0031\\u0038\\u0029';\n  t['\\u2486'] = '\\u0028\\u0031\\u0039\\u0029';\n  t['\\u2487'] = '\\u0028\\u0032\\u0030\\u0029';\n  t['\\u2488'] = '\\u0031\\u002E';\n  t['\\u2489'] = '\\u0032\\u002E';\n  t['\\u248A'] = '\\u0033\\u002E';\n  t['\\u248B'] = '\\u0034\\u002E';\n  t['\\u248C'] = '\\u0035\\u002E';\n  t['\\u248D'] = '\\u0036\\u002E';\n  t['\\u248E'] = '\\u0037\\u002E';\n  t['\\u248F'] = '\\u0038\\u002E';\n  t['\\u2490'] = '\\u0039\\u002E';\n  t['\\u2491'] = '\\u0031\\u0030\\u002E';\n  t['\\u2492'] = '\\u0031\\u0031\\u002E';\n  t['\\u2493'] = '\\u0031\\u0032\\u002E';\n  t['\\u2494'] = '\\u0031\\u0033\\u002E';\n  t['\\u2495'] = '\\u0031\\u0034\\u002E';\n  t['\\u2496'] = '\\u0031\\u0035\\u002E';\n  t['\\u2497'] = '\\u0031\\u0036\\u002E';\n  t['\\u2498'] = '\\u0031\\u0037\\u002E';\n  t['\\u2499'] = '\\u0031\\u0038\\u002E';\n  t['\\u249A'] = '\\u0031\\u0039\\u002E';\n  t['\\u249B'] = '\\u0032\\u0030\\u002E';\n  t['\\u249C'] = '\\u0028\\u0061\\u0029';\n  t['\\u249D'] = '\\u0028\\u0062\\u0029';\n  t['\\u249E'] = '\\u0028\\u0063\\u0029';\n  t['\\u249F'] = '\\u0028\\u0064\\u0029';\n  t['\\u24A0'] = '\\u0028\\u0065\\u0029';\n  t['\\u24A1'] = '\\u0028\\u0066\\u0029';\n  t['\\u24A2'] = '\\u0028\\u0067\\u0029';\n  t['\\u24A3'] = '\\u0028\\u0068\\u0029';\n  t['\\u24A4'] = '\\u0028\\u0069\\u0029';\n  t['\\u24A5'] = '\\u0028\\u006A\\u0029';\n  t['\\u24A6'] = '\\u0028\\u006B\\u0029';\n  t['\\u24A7'] = '\\u0028\\u006C\\u0029';\n  t['\\u24A8'] = '\\u0028\\u006D\\u0029';\n  t['\\u24A9'] = '\\u0028\\u006E\\u0029';\n  t['\\u24AA'] = '\\u0028\\u006F\\u0029';\n  t['\\u24AB'] = '\\u0028\\u0070\\u0029';\n  t['\\u24AC'] = '\\u0028\\u0071\\u0029';\n  t['\\u24AD'] = '\\u0028\\u0072\\u0029';\n  t['\\u24AE'] = '\\u0028\\u0073\\u0029';\n  t['\\u24AF'] = '\\u0028\\u0074\\u0029';\n  t['\\u24B0'] = '\\u0028\\u0075\\u0029';\n  t['\\u24B1'] = '\\u0028\\u0076\\u0029';\n  t['\\u24B2'] = '\\u0028\\u0077\\u0029';\n  t['\\u24B3'] = '\\u0028\\u0078\\u0029';\n  t['\\u24B4'] = '\\u0028\\u0079\\u0029';\n  t['\\u24B5'] = '\\u0028\\u007A\\u0029';\n  t['\\u2A0C'] = '\\u222B\\u222B\\u222B\\u222B';\n  t['\\u2A74'] = '\\u003A\\u003A\\u003D';\n  t['\\u2A75'] = '\\u003D\\u003D';\n  t['\\u2A76'] = '\\u003D\\u003D\\u003D';\n  t['\\u2E9F'] = '\\u6BCD';\n  t['\\u2EF3'] = '\\u9F9F';\n  t['\\u2F00'] = '\\u4E00';\n  t['\\u2F01'] = '\\u4E28';\n  t['\\u2F02'] = '\\u4E36';\n  t['\\u2F03'] = '\\u4E3F';\n  t['\\u2F04'] = '\\u4E59';\n  t['\\u2F05'] = '\\u4E85';\n  t['\\u2F06'] = '\\u4E8C';\n  t['\\u2F07'] = '\\u4EA0';\n  t['\\u2F08'] = '\\u4EBA';\n  t['\\u2F09'] = '\\u513F';\n  t['\\u2F0A'] = '\\u5165';\n  t['\\u2F0B'] = '\\u516B';\n  t['\\u2F0C'] = '\\u5182';\n  t['\\u2F0D'] = '\\u5196';\n  t['\\u2F0E'] = '\\u51AB';\n  t['\\u2F0F'] = '\\u51E0';\n  t['\\u2F10'] = '\\u51F5';\n  t['\\u2F11'] = '\\u5200';\n  t['\\u2F12'] = '\\u529B';\n  t['\\u2F13'] = '\\u52F9';\n  t['\\u2F14'] = '\\u5315';\n  t['\\u2F15'] = '\\u531A';\n  t['\\u2F16'] = '\\u5338';\n  t['\\u2F17'] = '\\u5341';\n  t['\\u2F18'] = '\\u535C';\n  t['\\u2F19'] = '\\u5369';\n  t['\\u2F1A'] = '\\u5382';\n  t['\\u2F1B'] = '\\u53B6';\n  t['\\u2F1C'] = '\\u53C8';\n  t['\\u2F1D'] = '\\u53E3';\n  t['\\u2F1E'] = '\\u56D7';\n  t['\\u2F1F'] = '\\u571F';\n  t['\\u2F20'] = '\\u58EB';\n  t['\\u2F21'] = '\\u5902';\n  t['\\u2F22'] = '\\u590A';\n  t['\\u2F23'] = '\\u5915';\n  t['\\u2F24'] = '\\u5927';\n  t['\\u2F25'] = '\\u5973';\n  t['\\u2F26'] = '\\u5B50';\n  t['\\u2F27'] = '\\u5B80';\n  t['\\u2F28'] = '\\u5BF8';\n  t['\\u2F29'] = '\\u5C0F';\n  t['\\u2F2A'] = '\\u5C22';\n  t['\\u2F2B'] = '\\u5C38';\n  t['\\u2F2C'] = '\\u5C6E';\n  t['\\u2F2D'] = '\\u5C71';\n  t['\\u2F2E'] = '\\u5DDB';\n  t['\\u2F2F'] = '\\u5DE5';\n  t['\\u2F30'] = '\\u5DF1';\n  t['\\u2F31'] = '\\u5DFE';\n  t['\\u2F32'] = '\\u5E72';\n  t['\\u2F33'] = '\\u5E7A';\n  t['\\u2F34'] = '\\u5E7F';\n  t['\\u2F35'] = '\\u5EF4';\n  t['\\u2F36'] = '\\u5EFE';\n  t['\\u2F37'] = '\\u5F0B';\n  t['\\u2F38'] = '\\u5F13';\n  t['\\u2F39'] = '\\u5F50';\n  t['\\u2F3A'] = '\\u5F61';\n  t['\\u2F3B'] = '\\u5F73';\n  t['\\u2F3C'] = '\\u5FC3';\n  t['\\u2F3D'] = '\\u6208';\n  t['\\u2F3E'] = '\\u6236';\n  t['\\u2F3F'] = '\\u624B';\n  t['\\u2F40'] = '\\u652F';\n  t['\\u2F41'] = '\\u6534';\n  t['\\u2F42'] = '\\u6587';\n  t['\\u2F43'] = '\\u6597';\n  t['\\u2F44'] = '\\u65A4';\n  t['\\u2F45'] = '\\u65B9';\n  t['\\u2F46'] = '\\u65E0';\n  t['\\u2F47'] = '\\u65E5';\n  t['\\u2F48'] = '\\u66F0';\n  t['\\u2F49'] = '\\u6708';\n  t['\\u2F4A'] = '\\u6728';\n  t['\\u2F4B'] = '\\u6B20';\n  t['\\u2F4C'] = '\\u6B62';\n  t['\\u2F4D'] = '\\u6B79';\n  t['\\u2F4E'] = '\\u6BB3';\n  t['\\u2F4F'] = '\\u6BCB';\n  t['\\u2F50'] = '\\u6BD4';\n  t['\\u2F51'] = '\\u6BDB';\n  t['\\u2F52'] = '\\u6C0F';\n  t['\\u2F53'] = '\\u6C14';\n  t['\\u2F54'] = '\\u6C34';\n  t['\\u2F55'] = '\\u706B';\n  t['\\u2F56'] = '\\u722A';\n  t['\\u2F57'] = '\\u7236';\n  t['\\u2F58'] = '\\u723B';\n  t['\\u2F59'] = '\\u723F';\n  t['\\u2F5A'] = '\\u7247';\n  t['\\u2F5B'] = '\\u7259';\n  t['\\u2F5C'] = '\\u725B';\n  t['\\u2F5D'] = '\\u72AC';\n  t['\\u2F5E'] = '\\u7384';\n  t['\\u2F5F'] = '\\u7389';\n  t['\\u2F60'] = '\\u74DC';\n  t['\\u2F61'] = '\\u74E6';\n  t['\\u2F62'] = '\\u7518';\n  t['\\u2F63'] = '\\u751F';\n  t['\\u2F64'] = '\\u7528';\n  t['\\u2F65'] = '\\u7530';\n  t['\\u2F66'] = '\\u758B';\n  t['\\u2F67'] = '\\u7592';\n  t['\\u2F68'] = '\\u7676';\n  t['\\u2F69'] = '\\u767D';\n  t['\\u2F6A'] = '\\u76AE';\n  t['\\u2F6B'] = '\\u76BF';\n  t['\\u2F6C'] = '\\u76EE';\n  t['\\u2F6D'] = '\\u77DB';\n  t['\\u2F6E'] = '\\u77E2';\n  t['\\u2F6F'] = '\\u77F3';\n  t['\\u2F70'] = '\\u793A';\n  t['\\u2F71'] = '\\u79B8';\n  t['\\u2F72'] = '\\u79BE';\n  t['\\u2F73'] = '\\u7A74';\n  t['\\u2F74'] = '\\u7ACB';\n  t['\\u2F75'] = '\\u7AF9';\n  t['\\u2F76'] = '\\u7C73';\n  t['\\u2F77'] = '\\u7CF8';\n  t['\\u2F78'] = '\\u7F36';\n  t['\\u2F79'] = '\\u7F51';\n  t['\\u2F7A'] = '\\u7F8A';\n  t['\\u2F7B'] = '\\u7FBD';\n  t['\\u2F7C'] = '\\u8001';\n  t['\\u2F7D'] = '\\u800C';\n  t['\\u2F7E'] = '\\u8012';\n  t['\\u2F7F'] = '\\u8033';\n  t['\\u2F80'] = '\\u807F';\n  t['\\u2F81'] = '\\u8089';\n  t['\\u2F82'] = '\\u81E3';\n  t['\\u2F83'] = '\\u81EA';\n  t['\\u2F84'] = '\\u81F3';\n  t['\\u2F85'] = '\\u81FC';\n  t['\\u2F86'] = '\\u820C';\n  t['\\u2F87'] = '\\u821B';\n  t['\\u2F88'] = '\\u821F';\n  t['\\u2F89'] = '\\u826E';\n  t['\\u2F8A'] = '\\u8272';\n  t['\\u2F8B'] = '\\u8278';\n  t['\\u2F8C'] = '\\u864D';\n  t['\\u2F8D'] = '\\u866B';\n  t['\\u2F8E'] = '\\u8840';\n  t['\\u2F8F'] = '\\u884C';\n  t['\\u2F90'] = '\\u8863';\n  t['\\u2F91'] = '\\u897E';\n  t['\\u2F92'] = '\\u898B';\n  t['\\u2F93'] = '\\u89D2';\n  t['\\u2F94'] = '\\u8A00';\n  t['\\u2F95'] = '\\u8C37';\n  t['\\u2F96'] = '\\u8C46';\n  t['\\u2F97'] = '\\u8C55';\n  t['\\u2F98'] = '\\u8C78';\n  t['\\u2F99'] = '\\u8C9D';\n  t['\\u2F9A'] = '\\u8D64';\n  t['\\u2F9B'] = '\\u8D70';\n  t['\\u2F9C'] = '\\u8DB3';\n  t['\\u2F9D'] = '\\u8EAB';\n  t['\\u2F9E'] = '\\u8ECA';\n  t['\\u2F9F'] = '\\u8F9B';\n  t['\\u2FA0'] = '\\u8FB0';\n  t['\\u2FA1'] = '\\u8FB5';\n  t['\\u2FA2'] = '\\u9091';\n  t['\\u2FA3'] = '\\u9149';\n  t['\\u2FA4'] = '\\u91C6';\n  t['\\u2FA5'] = '\\u91CC';\n  t['\\u2FA6'] = '\\u91D1';\n  t['\\u2FA7'] = '\\u9577';\n  t['\\u2FA8'] = '\\u9580';\n  t['\\u2FA9'] = '\\u961C';\n  t['\\u2FAA'] = '\\u96B6';\n  t['\\u2FAB'] = '\\u96B9';\n  t['\\u2FAC'] = '\\u96E8';\n  t['\\u2FAD'] = '\\u9751';\n  t['\\u2FAE'] = '\\u975E';\n  t['\\u2FAF'] = '\\u9762';\n  t['\\u2FB0'] = '\\u9769';\n  t['\\u2FB1'] = '\\u97CB';\n  t['\\u2FB2'] = '\\u97ED';\n  t['\\u2FB3'] = '\\u97F3';\n  t['\\u2FB4'] = '\\u9801';\n  t['\\u2FB5'] = '\\u98A8';\n  t['\\u2FB6'] = '\\u98DB';\n  t['\\u2FB7'] = '\\u98DF';\n  t['\\u2FB8'] = '\\u9996';\n  t['\\u2FB9'] = '\\u9999';\n  t['\\u2FBA'] = '\\u99AC';\n  t['\\u2FBB'] = '\\u9AA8';\n  t['\\u2FBC'] = '\\u9AD8';\n  t['\\u2FBD'] = '\\u9ADF';\n  t['\\u2FBE'] = '\\u9B25';\n  t['\\u2FBF'] = '\\u9B2F';\n  t['\\u2FC0'] = '\\u9B32';\n  t['\\u2FC1'] = '\\u9B3C';\n  t['\\u2FC2'] = '\\u9B5A';\n  t['\\u2FC3'] = '\\u9CE5';\n  t['\\u2FC4'] = '\\u9E75';\n  t['\\u2FC5'] = '\\u9E7F';\n  t['\\u2FC6'] = '\\u9EA5';\n  t['\\u2FC7'] = '\\u9EBB';\n  t['\\u2FC8'] = '\\u9EC3';\n  t['\\u2FC9'] = '\\u9ECD';\n  t['\\u2FCA'] = '\\u9ED1';\n  t['\\u2FCB'] = '\\u9EF9';\n  t['\\u2FCC'] = '\\u9EFD';\n  t['\\u2FCD'] = '\\u9F0E';\n  t['\\u2FCE'] = '\\u9F13';\n  t['\\u2FCF'] = '\\u9F20';\n  t['\\u2FD0'] = '\\u9F3B';\n  t['\\u2FD1'] = '\\u9F4A';\n  t['\\u2FD2'] = '\\u9F52';\n  t['\\u2FD3'] = '\\u9F8D';\n  t['\\u2FD4'] = '\\u9F9C';\n  t['\\u2FD5'] = '\\u9FA0';\n  t['\\u3036'] = '\\u3012';\n  t['\\u3038'] = '\\u5341';\n  t['\\u3039'] = '\\u5344';\n  t['\\u303A'] = '\\u5345';\n  t['\\u309B'] = '\\u0020\\u3099';\n  t['\\u309C'] = '\\u0020\\u309A';\n  t['\\u3131'] = '\\u1100';\n  t['\\u3132'] = '\\u1101';\n  t['\\u3133'] = '\\u11AA';\n  t['\\u3134'] = '\\u1102';\n  t['\\u3135'] = '\\u11AC';\n  t['\\u3136'] = '\\u11AD';\n  t['\\u3137'] = '\\u1103';\n  t['\\u3138'] = '\\u1104';\n  t['\\u3139'] = '\\u1105';\n  t['\\u313A'] = '\\u11B0';\n  t['\\u313B'] = '\\u11B1';\n  t['\\u313C'] = '\\u11B2';\n  t['\\u313D'] = '\\u11B3';\n  t['\\u313E'] = '\\u11B4';\n  t['\\u313F'] = '\\u11B5';\n  t['\\u3140'] = '\\u111A';\n  t['\\u3141'] = '\\u1106';\n  t['\\u3142'] = '\\u1107';\n  t['\\u3143'] = '\\u1108';\n  t['\\u3144'] = '\\u1121';\n  t['\\u3145'] = '\\u1109';\n  t['\\u3146'] = '\\u110A';\n  t['\\u3147'] = '\\u110B';\n  t['\\u3148'] = '\\u110C';\n  t['\\u3149'] = '\\u110D';\n  t['\\u314A'] = '\\u110E';\n  t['\\u314B'] = '\\u110F';\n  t['\\u314C'] = '\\u1110';\n  t['\\u314D'] = '\\u1111';\n  t['\\u314E'] = '\\u1112';\n  t['\\u314F'] = '\\u1161';\n  t['\\u3150'] = '\\u1162';\n  t['\\u3151'] = '\\u1163';\n  t['\\u3152'] = '\\u1164';\n  t['\\u3153'] = '\\u1165';\n  t['\\u3154'] = '\\u1166';\n  t['\\u3155'] = '\\u1167';\n  t['\\u3156'] = '\\u1168';\n  t['\\u3157'] = '\\u1169';\n  t['\\u3158'] = '\\u116A';\n  t['\\u3159'] = '\\u116B';\n  t['\\u315A'] = '\\u116C';\n  t['\\u315B'] = '\\u116D';\n  t['\\u315C'] = '\\u116E';\n  t['\\u315D'] = '\\u116F';\n  t['\\u315E'] = '\\u1170';\n  t['\\u315F'] = '\\u1171';\n  t['\\u3160'] = '\\u1172';\n  t['\\u3161'] = '\\u1173';\n  t['\\u3162'] = '\\u1174';\n  t['\\u3163'] = '\\u1175';\n  t['\\u3164'] = '\\u1160';\n  t['\\u3165'] = '\\u1114';\n  t['\\u3166'] = '\\u1115';\n  t['\\u3167'] = '\\u11C7';\n  t['\\u3168'] = '\\u11C8';\n  t['\\u3169'] = '\\u11CC';\n  t['\\u316A'] = '\\u11CE';\n  t['\\u316B'] = '\\u11D3';\n  t['\\u316C'] = '\\u11D7';\n  t['\\u316D'] = '\\u11D9';\n  t['\\u316E'] = '\\u111C';\n  t['\\u316F'] = '\\u11DD';\n  t['\\u3170'] = '\\u11DF';\n  t['\\u3171'] = '\\u111D';\n  t['\\u3172'] = '\\u111E';\n  t['\\u3173'] = '\\u1120';\n  t['\\u3174'] = '\\u1122';\n  t['\\u3175'] = '\\u1123';\n  t['\\u3176'] = '\\u1127';\n  t['\\u3177'] = '\\u1129';\n  t['\\u3178'] = '\\u112B';\n  t['\\u3179'] = '\\u112C';\n  t['\\u317A'] = '\\u112D';\n  t['\\u317B'] = '\\u112E';\n  t['\\u317C'] = '\\u112F';\n  t['\\u317D'] = '\\u1132';\n  t['\\u317E'] = '\\u1136';\n  t['\\u317F'] = '\\u1140';\n  t['\\u3180'] = '\\u1147';\n  t['\\u3181'] = '\\u114C';\n  t['\\u3182'] = '\\u11F1';\n  t['\\u3183'] = '\\u11F2';\n  t['\\u3184'] = '\\u1157';\n  t['\\u3185'] = '\\u1158';\n  t['\\u3186'] = '\\u1159';\n  t['\\u3187'] = '\\u1184';\n  t['\\u3188'] = '\\u1185';\n  t['\\u3189'] = '\\u1188';\n  t['\\u318A'] = '\\u1191';\n  t['\\u318B'] = '\\u1192';\n  t['\\u318C'] = '\\u1194';\n  t['\\u318D'] = '\\u119E';\n  t['\\u318E'] = '\\u11A1';\n  t['\\u3200'] = '\\u0028\\u1100\\u0029';\n  t['\\u3201'] = '\\u0028\\u1102\\u0029';\n  t['\\u3202'] = '\\u0028\\u1103\\u0029';\n  t['\\u3203'] = '\\u0028\\u1105\\u0029';\n  t['\\u3204'] = '\\u0028\\u1106\\u0029';\n  t['\\u3205'] = '\\u0028\\u1107\\u0029';\n  t['\\u3206'] = '\\u0028\\u1109\\u0029';\n  t['\\u3207'] = '\\u0028\\u110B\\u0029';\n  t['\\u3208'] = '\\u0028\\u110C\\u0029';\n  t['\\u3209'] = '\\u0028\\u110E\\u0029';\n  t['\\u320A'] = '\\u0028\\u110F\\u0029';\n  t['\\u320B'] = '\\u0028\\u1110\\u0029';\n  t['\\u320C'] = '\\u0028\\u1111\\u0029';\n  t['\\u320D'] = '\\u0028\\u1112\\u0029';\n  t['\\u320E'] = '\\u0028\\u1100\\u1161\\u0029';\n  t['\\u320F'] = '\\u0028\\u1102\\u1161\\u0029';\n  t['\\u3210'] = '\\u0028\\u1103\\u1161\\u0029';\n  t['\\u3211'] = '\\u0028\\u1105\\u1161\\u0029';\n  t['\\u3212'] = '\\u0028\\u1106\\u1161\\u0029';\n  t['\\u3213'] = '\\u0028\\u1107\\u1161\\u0029';\n  t['\\u3214'] = '\\u0028\\u1109\\u1161\\u0029';\n  t['\\u3215'] = '\\u0028\\u110B\\u1161\\u0029';\n  t['\\u3216'] = '\\u0028\\u110C\\u1161\\u0029';\n  t['\\u3217'] = '\\u0028\\u110E\\u1161\\u0029';\n  t['\\u3218'] = '\\u0028\\u110F\\u1161\\u0029';\n  t['\\u3219'] = '\\u0028\\u1110\\u1161\\u0029';\n  t['\\u321A'] = '\\u0028\\u1111\\u1161\\u0029';\n  t['\\u321B'] = '\\u0028\\u1112\\u1161\\u0029';\n  t['\\u321C'] = '\\u0028\\u110C\\u116E\\u0029';\n  t['\\u321D'] = '\\u0028\\u110B\\u1169\\u110C\\u1165\\u11AB\\u0029';\n  t['\\u321E'] = '\\u0028\\u110B\\u1169\\u1112\\u116E\\u0029';\n  t['\\u3220'] = '\\u0028\\u4E00\\u0029';\n  t['\\u3221'] = '\\u0028\\u4E8C\\u0029';\n  t['\\u3222'] = '\\u0028\\u4E09\\u0029';\n  t['\\u3223'] = '\\u0028\\u56DB\\u0029';\n  t['\\u3224'] = '\\u0028\\u4E94\\u0029';\n  t['\\u3225'] = '\\u0028\\u516D\\u0029';\n  t['\\u3226'] = '\\u0028\\u4E03\\u0029';\n  t['\\u3227'] = '\\u0028\\u516B\\u0029';\n  t['\\u3228'] = '\\u0028\\u4E5D\\u0029';\n  t['\\u3229'] = '\\u0028\\u5341\\u0029';\n  t['\\u322A'] = '\\u0028\\u6708\\u0029';\n  t['\\u322B'] = '\\u0028\\u706B\\u0029';\n  t['\\u322C'] = '\\u0028\\u6C34\\u0029';\n  t['\\u322D'] = '\\u0028\\u6728\\u0029';\n  t['\\u322E'] = '\\u0028\\u91D1\\u0029';\n  t['\\u322F'] = '\\u0028\\u571F\\u0029';\n  t['\\u3230'] = '\\u0028\\u65E5\\u0029';\n  t['\\u3231'] = '\\u0028\\u682A\\u0029';\n  t['\\u3232'] = '\\u0028\\u6709\\u0029';\n  t['\\u3233'] = '\\u0028\\u793E\\u0029';\n  t['\\u3234'] = '\\u0028\\u540D\\u0029';\n  t['\\u3235'] = '\\u0028\\u7279\\u0029';\n  t['\\u3236'] = '\\u0028\\u8CA1\\u0029';\n  t['\\u3237'] = '\\u0028\\u795D\\u0029';\n  t['\\u3238'] = '\\u0028\\u52B4\\u0029';\n  t['\\u3239'] = '\\u0028\\u4EE3\\u0029';\n  t['\\u323A'] = '\\u0028\\u547C\\u0029';\n  t['\\u323B'] = '\\u0028\\u5B66\\u0029';\n  t['\\u323C'] = '\\u0028\\u76E3\\u0029';\n  t['\\u323D'] = '\\u0028\\u4F01\\u0029';\n  t['\\u323E'] = '\\u0028\\u8CC7\\u0029';\n  t['\\u323F'] = '\\u0028\\u5354\\u0029';\n  t['\\u3240'] = '\\u0028\\u796D\\u0029';\n  t['\\u3241'] = '\\u0028\\u4F11\\u0029';\n  t['\\u3242'] = '\\u0028\\u81EA\\u0029';\n  t['\\u3243'] = '\\u0028\\u81F3\\u0029';\n  t['\\u32C0'] = '\\u0031\\u6708';\n  t['\\u32C1'] = '\\u0032\\u6708';\n  t['\\u32C2'] = '\\u0033\\u6708';\n  t['\\u32C3'] = '\\u0034\\u6708';\n  t['\\u32C4'] = '\\u0035\\u6708';\n  t['\\u32C5'] = '\\u0036\\u6708';\n  t['\\u32C6'] = '\\u0037\\u6708';\n  t['\\u32C7'] = '\\u0038\\u6708';\n  t['\\u32C8'] = '\\u0039\\u6708';\n  t['\\u32C9'] = '\\u0031\\u0030\\u6708';\n  t['\\u32CA'] = '\\u0031\\u0031\\u6708';\n  t['\\u32CB'] = '\\u0031\\u0032\\u6708';\n  t['\\u3358'] = '\\u0030\\u70B9';\n  t['\\u3359'] = '\\u0031\\u70B9';\n  t['\\u335A'] = '\\u0032\\u70B9';\n  t['\\u335B'] = '\\u0033\\u70B9';\n  t['\\u335C'] = '\\u0034\\u70B9';\n  t['\\u335D'] = '\\u0035\\u70B9';\n  t['\\u335E'] = '\\u0036\\u70B9';\n  t['\\u335F'] = '\\u0037\\u70B9';\n  t['\\u3360'] = '\\u0038\\u70B9';\n  t['\\u3361'] = '\\u0039\\u70B9';\n  t['\\u3362'] = '\\u0031\\u0030\\u70B9';\n  t['\\u3363'] = '\\u0031\\u0031\\u70B9';\n  t['\\u3364'] = '\\u0031\\u0032\\u70B9';\n  t['\\u3365'] = '\\u0031\\u0033\\u70B9';\n  t['\\u3366'] = '\\u0031\\u0034\\u70B9';\n  t['\\u3367'] = '\\u0031\\u0035\\u70B9';\n  t['\\u3368'] = '\\u0031\\u0036\\u70B9';\n  t['\\u3369'] = '\\u0031\\u0037\\u70B9';\n  t['\\u336A'] = '\\u0031\\u0038\\u70B9';\n  t['\\u336B'] = '\\u0031\\u0039\\u70B9';\n  t['\\u336C'] = '\\u0032\\u0030\\u70B9';\n  t['\\u336D'] = '\\u0032\\u0031\\u70B9';\n  t['\\u336E'] = '\\u0032\\u0032\\u70B9';\n  t['\\u336F'] = '\\u0032\\u0033\\u70B9';\n  t['\\u3370'] = '\\u0032\\u0034\\u70B9';\n  t['\\u33E0'] = '\\u0031\\u65E5';\n  t['\\u33E1'] = '\\u0032\\u65E5';\n  t['\\u33E2'] = '\\u0033\\u65E5';\n  t['\\u33E3'] = '\\u0034\\u65E5';\n  t['\\u33E4'] = '\\u0035\\u65E5';\n  t['\\u33E5'] = '\\u0036\\u65E5';\n  t['\\u33E6'] = '\\u0037\\u65E5';\n  t['\\u33E7'] = '\\u0038\\u65E5';\n  t['\\u33E8'] = '\\u0039\\u65E5';\n  t['\\u33E9'] = '\\u0031\\u0030\\u65E5';\n  t['\\u33EA'] = '\\u0031\\u0031\\u65E5';\n  t['\\u33EB'] = '\\u0031\\u0032\\u65E5';\n  t['\\u33EC'] = '\\u0031\\u0033\\u65E5';\n  t['\\u33ED'] = '\\u0031\\u0034\\u65E5';\n  t['\\u33EE'] = '\\u0031\\u0035\\u65E5';\n  t['\\u33EF'] = '\\u0031\\u0036\\u65E5';\n  t['\\u33F0'] = '\\u0031\\u0037\\u65E5';\n  t['\\u33F1'] = '\\u0031\\u0038\\u65E5';\n  t['\\u33F2'] = '\\u0031\\u0039\\u65E5';\n  t['\\u33F3'] = '\\u0032\\u0030\\u65E5';\n  t['\\u33F4'] = '\\u0032\\u0031\\u65E5';\n  t['\\u33F5'] = '\\u0032\\u0032\\u65E5';\n  t['\\u33F6'] = '\\u0032\\u0033\\u65E5';\n  t['\\u33F7'] = '\\u0032\\u0034\\u65E5';\n  t['\\u33F8'] = '\\u0032\\u0035\\u65E5';\n  t['\\u33F9'] = '\\u0032\\u0036\\u65E5';\n  t['\\u33FA'] = '\\u0032\\u0037\\u65E5';\n  t['\\u33FB'] = '\\u0032\\u0038\\u65E5';\n  t['\\u33FC'] = '\\u0032\\u0039\\u65E5';\n  t['\\u33FD'] = '\\u0033\\u0030\\u65E5';\n  t['\\u33FE'] = '\\u0033\\u0031\\u65E5';\n  t['\\uFB00'] = '\\u0066\\u0066';\n  t['\\uFB01'] = '\\u0066\\u0069';\n  t['\\uFB02'] = '\\u0066\\u006C';\n  t['\\uFB03'] = '\\u0066\\u0066\\u0069';\n  t['\\uFB04'] = '\\u0066\\u0066\\u006C';\n  t['\\uFB05'] = '\\u017F\\u0074';\n  t['\\uFB06'] = '\\u0073\\u0074';\n  t['\\uFB13'] = '\\u0574\\u0576';\n  t['\\uFB14'] = '\\u0574\\u0565';\n  t['\\uFB15'] = '\\u0574\\u056B';\n  t['\\uFB16'] = '\\u057E\\u0576';\n  t['\\uFB17'] = '\\u0574\\u056D';\n  t['\\uFB4F'] = '\\u05D0\\u05DC';\n  t['\\uFB50'] = '\\u0671';\n  t['\\uFB51'] = '\\u0671';\n  t['\\uFB52'] = '\\u067B';\n  t['\\uFB53'] = '\\u067B';\n  t['\\uFB54'] = '\\u067B';\n  t['\\uFB55'] = '\\u067B';\n  t['\\uFB56'] = '\\u067E';\n  t['\\uFB57'] = '\\u067E';\n  t['\\uFB58'] = '\\u067E';\n  t['\\uFB59'] = '\\u067E';\n  t['\\uFB5A'] = '\\u0680';\n  t['\\uFB5B'] = '\\u0680';\n  t['\\uFB5C'] = '\\u0680';\n  t['\\uFB5D'] = '\\u0680';\n  t['\\uFB5E'] = '\\u067A';\n  t['\\uFB5F'] = '\\u067A';\n  t['\\uFB60'] = '\\u067A';\n  t['\\uFB61'] = '\\u067A';\n  t['\\uFB62'] = '\\u067F';\n  t['\\uFB63'] = '\\u067F';\n  t['\\uFB64'] = '\\u067F';\n  t['\\uFB65'] = '\\u067F';\n  t['\\uFB66'] = '\\u0679';\n  t['\\uFB67'] = '\\u0679';\n  t['\\uFB68'] = '\\u0679';\n  t['\\uFB69'] = '\\u0679';\n  t['\\uFB6A'] = '\\u06A4';\n  t['\\uFB6B'] = '\\u06A4';\n  t['\\uFB6C'] = '\\u06A4';\n  t['\\uFB6D'] = '\\u06A4';\n  t['\\uFB6E'] = '\\u06A6';\n  t['\\uFB6F'] = '\\u06A6';\n  t['\\uFB70'] = '\\u06A6';\n  t['\\uFB71'] = '\\u06A6';\n  t['\\uFB72'] = '\\u0684';\n  t['\\uFB73'] = '\\u0684';\n  t['\\uFB74'] = '\\u0684';\n  t['\\uFB75'] = '\\u0684';\n  t['\\uFB76'] = '\\u0683';\n  t['\\uFB77'] = '\\u0683';\n  t['\\uFB78'] = '\\u0683';\n  t['\\uFB79'] = '\\u0683';\n  t['\\uFB7A'] = '\\u0686';\n  t['\\uFB7B'] = '\\u0686';\n  t['\\uFB7C'] = '\\u0686';\n  t['\\uFB7D'] = '\\u0686';\n  t['\\uFB7E'] = '\\u0687';\n  t['\\uFB7F'] = '\\u0687';\n  t['\\uFB80'] = '\\u0687';\n  t['\\uFB81'] = '\\u0687';\n  t['\\uFB82'] = '\\u068D';\n  t['\\uFB83'] = '\\u068D';\n  t['\\uFB84'] = '\\u068C';\n  t['\\uFB85'] = '\\u068C';\n  t['\\uFB86'] = '\\u068E';\n  t['\\uFB87'] = '\\u068E';\n  t['\\uFB88'] = '\\u0688';\n  t['\\uFB89'] = '\\u0688';\n  t['\\uFB8A'] = '\\u0698';\n  t['\\uFB8B'] = '\\u0698';\n  t['\\uFB8C'] = '\\u0691';\n  t['\\uFB8D'] = '\\u0691';\n  t['\\uFB8E'] = '\\u06A9';\n  t['\\uFB8F'] = '\\u06A9';\n  t['\\uFB90'] = '\\u06A9';\n  t['\\uFB91'] = '\\u06A9';\n  t['\\uFB92'] = '\\u06AF';\n  t['\\uFB93'] = '\\u06AF';\n  t['\\uFB94'] = '\\u06AF';\n  t['\\uFB95'] = '\\u06AF';\n  t['\\uFB96'] = '\\u06B3';\n  t['\\uFB97'] = '\\u06B3';\n  t['\\uFB98'] = '\\u06B3';\n  t['\\uFB99'] = '\\u06B3';\n  t['\\uFB9A'] = '\\u06B1';\n  t['\\uFB9B'] = '\\u06B1';\n  t['\\uFB9C'] = '\\u06B1';\n  t['\\uFB9D'] = '\\u06B1';\n  t['\\uFB9E'] = '\\u06BA';\n  t['\\uFB9F'] = '\\u06BA';\n  t['\\uFBA0'] = '\\u06BB';\n  t['\\uFBA1'] = '\\u06BB';\n  t['\\uFBA2'] = '\\u06BB';\n  t['\\uFBA3'] = '\\u06BB';\n  t['\\uFBA4'] = '\\u06C0';\n  t['\\uFBA5'] = '\\u06C0';\n  t['\\uFBA6'] = '\\u06C1';\n  t['\\uFBA7'] = '\\u06C1';\n  t['\\uFBA8'] = '\\u06C1';\n  t['\\uFBA9'] = '\\u06C1';\n  t['\\uFBAA'] = '\\u06BE';\n  t['\\uFBAB'] = '\\u06BE';\n  t['\\uFBAC'] = '\\u06BE';\n  t['\\uFBAD'] = '\\u06BE';\n  t['\\uFBAE'] = '\\u06D2';\n  t['\\uFBAF'] = '\\u06D2';\n  t['\\uFBB0'] = '\\u06D3';\n  t['\\uFBB1'] = '\\u06D3';\n  t['\\uFBD3'] = '\\u06AD';\n  t['\\uFBD4'] = '\\u06AD';\n  t['\\uFBD5'] = '\\u06AD';\n  t['\\uFBD6'] = '\\u06AD';\n  t['\\uFBD7'] = '\\u06C7';\n  t['\\uFBD8'] = '\\u06C7';\n  t['\\uFBD9'] = '\\u06C6';\n  t['\\uFBDA'] = '\\u06C6';\n  t['\\uFBDB'] = '\\u06C8';\n  t['\\uFBDC'] = '\\u06C8';\n  t['\\uFBDD'] = '\\u0677';\n  t['\\uFBDE'] = '\\u06CB';\n  t['\\uFBDF'] = '\\u06CB';\n  t['\\uFBE0'] = '\\u06C5';\n  t['\\uFBE1'] = '\\u06C5';\n  t['\\uFBE2'] = '\\u06C9';\n  t['\\uFBE3'] = '\\u06C9';\n  t['\\uFBE4'] = '\\u06D0';\n  t['\\uFBE5'] = '\\u06D0';\n  t['\\uFBE6'] = '\\u06D0';\n  t['\\uFBE7'] = '\\u06D0';\n  t['\\uFBE8'] = '\\u0649';\n  t['\\uFBE9'] = '\\u0649';\n  t['\\uFBEA'] = '\\u0626\\u0627';\n  t['\\uFBEB'] = '\\u0626\\u0627';\n  t['\\uFBEC'] = '\\u0626\\u06D5';\n  t['\\uFBED'] = '\\u0626\\u06D5';\n  t['\\uFBEE'] = '\\u0626\\u0648';\n  t['\\uFBEF'] = '\\u0626\\u0648';\n  t['\\uFBF0'] = '\\u0626\\u06C7';\n  t['\\uFBF1'] = '\\u0626\\u06C7';\n  t['\\uFBF2'] = '\\u0626\\u06C6';\n  t['\\uFBF3'] = '\\u0626\\u06C6';\n  t['\\uFBF4'] = '\\u0626\\u06C8';\n  t['\\uFBF5'] = '\\u0626\\u06C8';\n  t['\\uFBF6'] = '\\u0626\\u06D0';\n  t['\\uFBF7'] = '\\u0626\\u06D0';\n  t['\\uFBF8'] = '\\u0626\\u06D0';\n  t['\\uFBF9'] = '\\u0626\\u0649';\n  t['\\uFBFA'] = '\\u0626\\u0649';\n  t['\\uFBFB'] = '\\u0626\\u0649';\n  t['\\uFBFC'] = '\\u06CC';\n  t['\\uFBFD'] = '\\u06CC';\n  t['\\uFBFE'] = '\\u06CC';\n  t['\\uFBFF'] = '\\u06CC';\n  t['\\uFC00'] = '\\u0626\\u062C';\n  t['\\uFC01'] = '\\u0626\\u062D';\n  t['\\uFC02'] = '\\u0626\\u0645';\n  t['\\uFC03'] = '\\u0626\\u0649';\n  t['\\uFC04'] = '\\u0626\\u064A';\n  t['\\uFC05'] = '\\u0628\\u062C';\n  t['\\uFC06'] = '\\u0628\\u062D';\n  t['\\uFC07'] = '\\u0628\\u062E';\n  t['\\uFC08'] = '\\u0628\\u0645';\n  t['\\uFC09'] = '\\u0628\\u0649';\n  t['\\uFC0A'] = '\\u0628\\u064A';\n  t['\\uFC0B'] = '\\u062A\\u062C';\n  t['\\uFC0C'] = '\\u062A\\u062D';\n  t['\\uFC0D'] = '\\u062A\\u062E';\n  t['\\uFC0E'] = '\\u062A\\u0645';\n  t['\\uFC0F'] = '\\u062A\\u0649';\n  t['\\uFC10'] = '\\u062A\\u064A';\n  t['\\uFC11'] = '\\u062B\\u062C';\n  t['\\uFC12'] = '\\u062B\\u0645';\n  t['\\uFC13'] = '\\u062B\\u0649';\n  t['\\uFC14'] = '\\u062B\\u064A';\n  t['\\uFC15'] = '\\u062C\\u062D';\n  t['\\uFC16'] = '\\u062C\\u0645';\n  t['\\uFC17'] = '\\u062D\\u062C';\n  t['\\uFC18'] = '\\u062D\\u0645';\n  t['\\uFC19'] = '\\u062E\\u062C';\n  t['\\uFC1A'] = '\\u062E\\u062D';\n  t['\\uFC1B'] = '\\u062E\\u0645';\n  t['\\uFC1C'] = '\\u0633\\u062C';\n  t['\\uFC1D'] = '\\u0633\\u062D';\n  t['\\uFC1E'] = '\\u0633\\u062E';\n  t['\\uFC1F'] = '\\u0633\\u0645';\n  t['\\uFC20'] = '\\u0635\\u062D';\n  t['\\uFC21'] = '\\u0635\\u0645';\n  t['\\uFC22'] = '\\u0636\\u062C';\n  t['\\uFC23'] = '\\u0636\\u062D';\n  t['\\uFC24'] = '\\u0636\\u062E';\n  t['\\uFC25'] = '\\u0636\\u0645';\n  t['\\uFC26'] = '\\u0637\\u062D';\n  t['\\uFC27'] = '\\u0637\\u0645';\n  t['\\uFC28'] = '\\u0638\\u0645';\n  t['\\uFC29'] = '\\u0639\\u062C';\n  t['\\uFC2A'] = '\\u0639\\u0645';\n  t['\\uFC2B'] = '\\u063A\\u062C';\n  t['\\uFC2C'] = '\\u063A\\u0645';\n  t['\\uFC2D'] = '\\u0641\\u062C';\n  t['\\uFC2E'] = '\\u0641\\u062D';\n  t['\\uFC2F'] = '\\u0641\\u062E';\n  t['\\uFC30'] = '\\u0641\\u0645';\n  t['\\uFC31'] = '\\u0641\\u0649';\n  t['\\uFC32'] = '\\u0641\\u064A';\n  t['\\uFC33'] = '\\u0642\\u062D';\n  t['\\uFC34'] = '\\u0642\\u0645';\n  t['\\uFC35'] = '\\u0642\\u0649';\n  t['\\uFC36'] = '\\u0642\\u064A';\n  t['\\uFC37'] = '\\u0643\\u0627';\n  t['\\uFC38'] = '\\u0643\\u062C';\n  t['\\uFC39'] = '\\u0643\\u062D';\n  t['\\uFC3A'] = '\\u0643\\u062E';\n  t['\\uFC3B'] = '\\u0643\\u0644';\n  t['\\uFC3C'] = '\\u0643\\u0645';\n  t['\\uFC3D'] = '\\u0643\\u0649';\n  t['\\uFC3E'] = '\\u0643\\u064A';\n  t['\\uFC3F'] = '\\u0644\\u062C';\n  t['\\uFC40'] = '\\u0644\\u062D';\n  t['\\uFC41'] = '\\u0644\\u062E';\n  t['\\uFC42'] = '\\u0644\\u0645';\n  t['\\uFC43'] = '\\u0644\\u0649';\n  t['\\uFC44'] = '\\u0644\\u064A';\n  t['\\uFC45'] = '\\u0645\\u062C';\n  t['\\uFC46'] = '\\u0645\\u062D';\n  t['\\uFC47'] = '\\u0645\\u062E';\n  t['\\uFC48'] = '\\u0645\\u0645';\n  t['\\uFC49'] = '\\u0645\\u0649';\n  t['\\uFC4A'] = '\\u0645\\u064A';\n  t['\\uFC4B'] = '\\u0646\\u062C';\n  t['\\uFC4C'] = '\\u0646\\u062D';\n  t['\\uFC4D'] = '\\u0646\\u062E';\n  t['\\uFC4E'] = '\\u0646\\u0645';\n  t['\\uFC4F'] = '\\u0646\\u0649';\n  t['\\uFC50'] = '\\u0646\\u064A';\n  t['\\uFC51'] = '\\u0647\\u062C';\n  t['\\uFC52'] = '\\u0647\\u0645';\n  t['\\uFC53'] = '\\u0647\\u0649';\n  t['\\uFC54'] = '\\u0647\\u064A';\n  t['\\uFC55'] = '\\u064A\\u062C';\n  t['\\uFC56'] = '\\u064A\\u062D';\n  t['\\uFC57'] = '\\u064A\\u062E';\n  t['\\uFC58'] = '\\u064A\\u0645';\n  t['\\uFC59'] = '\\u064A\\u0649';\n  t['\\uFC5A'] = '\\u064A\\u064A';\n  t['\\uFC5B'] = '\\u0630\\u0670';\n  t['\\uFC5C'] = '\\u0631\\u0670';\n  t['\\uFC5D'] = '\\u0649\\u0670';\n  t['\\uFC5E'] = '\\u0020\\u064C\\u0651';\n  t['\\uFC5F'] = '\\u0020\\u064D\\u0651';\n  t['\\uFC60'] = '\\u0020\\u064E\\u0651';\n  t['\\uFC61'] = '\\u0020\\u064F\\u0651';\n  t['\\uFC62'] = '\\u0020\\u0650\\u0651';\n  t['\\uFC63'] = '\\u0020\\u0651\\u0670';\n  t['\\uFC64'] = '\\u0626\\u0631';\n  t['\\uFC65'] = '\\u0626\\u0632';\n  t['\\uFC66'] = '\\u0626\\u0645';\n  t['\\uFC67'] = '\\u0626\\u0646';\n  t['\\uFC68'] = '\\u0626\\u0649';\n  t['\\uFC69'] = '\\u0626\\u064A';\n  t['\\uFC6A'] = '\\u0628\\u0631';\n  t['\\uFC6B'] = '\\u0628\\u0632';\n  t['\\uFC6C'] = '\\u0628\\u0645';\n  t['\\uFC6D'] = '\\u0628\\u0646';\n  t['\\uFC6E'] = '\\u0628\\u0649';\n  t['\\uFC6F'] = '\\u0628\\u064A';\n  t['\\uFC70'] = '\\u062A\\u0631';\n  t['\\uFC71'] = '\\u062A\\u0632';\n  t['\\uFC72'] = '\\u062A\\u0645';\n  t['\\uFC73'] = '\\u062A\\u0646';\n  t['\\uFC74'] = '\\u062A\\u0649';\n  t['\\uFC75'] = '\\u062A\\u064A';\n  t['\\uFC76'] = '\\u062B\\u0631';\n  t['\\uFC77'] = '\\u062B\\u0632';\n  t['\\uFC78'] = '\\u062B\\u0645';\n  t['\\uFC79'] = '\\u062B\\u0646';\n  t['\\uFC7A'] = '\\u062B\\u0649';\n  t['\\uFC7B'] = '\\u062B\\u064A';\n  t['\\uFC7C'] = '\\u0641\\u0649';\n  t['\\uFC7D'] = '\\u0641\\u064A';\n  t['\\uFC7E'] = '\\u0642\\u0649';\n  t['\\uFC7F'] = '\\u0642\\u064A';\n  t['\\uFC80'] = '\\u0643\\u0627';\n  t['\\uFC81'] = '\\u0643\\u0644';\n  t['\\uFC82'] = '\\u0643\\u0645';\n  t['\\uFC83'] = '\\u0643\\u0649';\n  t['\\uFC84'] = '\\u0643\\u064A';\n  t['\\uFC85'] = '\\u0644\\u0645';\n  t['\\uFC86'] = '\\u0644\\u0649';\n  t['\\uFC87'] = '\\u0644\\u064A';\n  t['\\uFC88'] = '\\u0645\\u0627';\n  t['\\uFC89'] = '\\u0645\\u0645';\n  t['\\uFC8A'] = '\\u0646\\u0631';\n  t['\\uFC8B'] = '\\u0646\\u0632';\n  t['\\uFC8C'] = '\\u0646\\u0645';\n  t['\\uFC8D'] = '\\u0646\\u0646';\n  t['\\uFC8E'] = '\\u0646\\u0649';\n  t['\\uFC8F'] = '\\u0646\\u064A';\n  t['\\uFC90'] = '\\u0649\\u0670';\n  t['\\uFC91'] = '\\u064A\\u0631';\n  t['\\uFC92'] = '\\u064A\\u0632';\n  t['\\uFC93'] = '\\u064A\\u0645';\n  t['\\uFC94'] = '\\u064A\\u0646';\n  t['\\uFC95'] = '\\u064A\\u0649';\n  t['\\uFC96'] = '\\u064A\\u064A';\n  t['\\uFC97'] = '\\u0626\\u062C';\n  t['\\uFC98'] = '\\u0626\\u062D';\n  t['\\uFC99'] = '\\u0626\\u062E';\n  t['\\uFC9A'] = '\\u0626\\u0645';\n  t['\\uFC9B'] = '\\u0626\\u0647';\n  t['\\uFC9C'] = '\\u0628\\u062C';\n  t['\\uFC9D'] = '\\u0628\\u062D';\n  t['\\uFC9E'] = '\\u0628\\u062E';\n  t['\\uFC9F'] = '\\u0628\\u0645';\n  t['\\uFCA0'] = '\\u0628\\u0647';\n  t['\\uFCA1'] = '\\u062A\\u062C';\n  t['\\uFCA2'] = '\\u062A\\u062D';\n  t['\\uFCA3'] = '\\u062A\\u062E';\n  t['\\uFCA4'] = '\\u062A\\u0645';\n  t['\\uFCA5'] = '\\u062A\\u0647';\n  t['\\uFCA6'] = '\\u062B\\u0645';\n  t['\\uFCA7'] = '\\u062C\\u062D';\n  t['\\uFCA8'] = '\\u062C\\u0645';\n  t['\\uFCA9'] = '\\u062D\\u062C';\n  t['\\uFCAA'] = '\\u062D\\u0645';\n  t['\\uFCAB'] = '\\u062E\\u062C';\n  t['\\uFCAC'] = '\\u062E\\u0645';\n  t['\\uFCAD'] = '\\u0633\\u062C';\n  t['\\uFCAE'] = '\\u0633\\u062D';\n  t['\\uFCAF'] = '\\u0633\\u062E';\n  t['\\uFCB0'] = '\\u0633\\u0645';\n  t['\\uFCB1'] = '\\u0635\\u062D';\n  t['\\uFCB2'] = '\\u0635\\u062E';\n  t['\\uFCB3'] = '\\u0635\\u0645';\n  t['\\uFCB4'] = '\\u0636\\u062C';\n  t['\\uFCB5'] = '\\u0636\\u062D';\n  t['\\uFCB6'] = '\\u0636\\u062E';\n  t['\\uFCB7'] = '\\u0636\\u0645';\n  t['\\uFCB8'] = '\\u0637\\u062D';\n  t['\\uFCB9'] = '\\u0638\\u0645';\n  t['\\uFCBA'] = '\\u0639\\u062C';\n  t['\\uFCBB'] = '\\u0639\\u0645';\n  t['\\uFCBC'] = '\\u063A\\u062C';\n  t['\\uFCBD'] = '\\u063A\\u0645';\n  t['\\uFCBE'] = '\\u0641\\u062C';\n  t['\\uFCBF'] = '\\u0641\\u062D';\n  t['\\uFCC0'] = '\\u0641\\u062E';\n  t['\\uFCC1'] = '\\u0641\\u0645';\n  t['\\uFCC2'] = '\\u0642\\u062D';\n  t['\\uFCC3'] = '\\u0642\\u0645';\n  t['\\uFCC4'] = '\\u0643\\u062C';\n  t['\\uFCC5'] = '\\u0643\\u062D';\n  t['\\uFCC6'] = '\\u0643\\u062E';\n  t['\\uFCC7'] = '\\u0643\\u0644';\n  t['\\uFCC8'] = '\\u0643\\u0645';\n  t['\\uFCC9'] = '\\u0644\\u062C';\n  t['\\uFCCA'] = '\\u0644\\u062D';\n  t['\\uFCCB'] = '\\u0644\\u062E';\n  t['\\uFCCC'] = '\\u0644\\u0645';\n  t['\\uFCCD'] = '\\u0644\\u0647';\n  t['\\uFCCE'] = '\\u0645\\u062C';\n  t['\\uFCCF'] = '\\u0645\\u062D';\n  t['\\uFCD0'] = '\\u0645\\u062E';\n  t['\\uFCD1'] = '\\u0645\\u0645';\n  t['\\uFCD2'] = '\\u0646\\u062C';\n  t['\\uFCD3'] = '\\u0646\\u062D';\n  t['\\uFCD4'] = '\\u0646\\u062E';\n  t['\\uFCD5'] = '\\u0646\\u0645';\n  t['\\uFCD6'] = '\\u0646\\u0647';\n  t['\\uFCD7'] = '\\u0647\\u062C';\n  t['\\uFCD8'] = '\\u0647\\u0645';\n  t['\\uFCD9'] = '\\u0647\\u0670';\n  t['\\uFCDA'] = '\\u064A\\u062C';\n  t['\\uFCDB'] = '\\u064A\\u062D';\n  t['\\uFCDC'] = '\\u064A\\u062E';\n  t['\\uFCDD'] = '\\u064A\\u0645';\n  t['\\uFCDE'] = '\\u064A\\u0647';\n  t['\\uFCDF'] = '\\u0626\\u0645';\n  t['\\uFCE0'] = '\\u0626\\u0647';\n  t['\\uFCE1'] = '\\u0628\\u0645';\n  t['\\uFCE2'] = '\\u0628\\u0647';\n  t['\\uFCE3'] = '\\u062A\\u0645';\n  t['\\uFCE4'] = '\\u062A\\u0647';\n  t['\\uFCE5'] = '\\u062B\\u0645';\n  t['\\uFCE6'] = '\\u062B\\u0647';\n  t['\\uFCE7'] = '\\u0633\\u0645';\n  t['\\uFCE8'] = '\\u0633\\u0647';\n  t['\\uFCE9'] = '\\u0634\\u0645';\n  t['\\uFCEA'] = '\\u0634\\u0647';\n  t['\\uFCEB'] = '\\u0643\\u0644';\n  t['\\uFCEC'] = '\\u0643\\u0645';\n  t['\\uFCED'] = '\\u0644\\u0645';\n  t['\\uFCEE'] = '\\u0646\\u0645';\n  t['\\uFCEF'] = '\\u0646\\u0647';\n  t['\\uFCF0'] = '\\u064A\\u0645';\n  t['\\uFCF1'] = '\\u064A\\u0647';\n  t['\\uFCF2'] = '\\u0640\\u064E\\u0651';\n  t['\\uFCF3'] = '\\u0640\\u064F\\u0651';\n  t['\\uFCF4'] = '\\u0640\\u0650\\u0651';\n  t['\\uFCF5'] = '\\u0637\\u0649';\n  t['\\uFCF6'] = '\\u0637\\u064A';\n  t['\\uFCF7'] = '\\u0639\\u0649';\n  t['\\uFCF8'] = '\\u0639\\u064A';\n  t['\\uFCF9'] = '\\u063A\\u0649';\n  t['\\uFCFA'] = '\\u063A\\u064A';\n  t['\\uFCFB'] = '\\u0633\\u0649';\n  t['\\uFCFC'] = '\\u0633\\u064A';\n  t['\\uFCFD'] = '\\u0634\\u0649';\n  t['\\uFCFE'] = '\\u0634\\u064A';\n  t['\\uFCFF'] = '\\u062D\\u0649';\n  t['\\uFD00'] = '\\u062D\\u064A';\n  t['\\uFD01'] = '\\u062C\\u0649';\n  t['\\uFD02'] = '\\u062C\\u064A';\n  t['\\uFD03'] = '\\u062E\\u0649';\n  t['\\uFD04'] = '\\u062E\\u064A';\n  t['\\uFD05'] = '\\u0635\\u0649';\n  t['\\uFD06'] = '\\u0635\\u064A';\n  t['\\uFD07'] = '\\u0636\\u0649';\n  t['\\uFD08'] = '\\u0636\\u064A';\n  t['\\uFD09'] = '\\u0634\\u062C';\n  t['\\uFD0A'] = '\\u0634\\u062D';\n  t['\\uFD0B'] = '\\u0634\\u062E';\n  t['\\uFD0C'] = '\\u0634\\u0645';\n  t['\\uFD0D'] = '\\u0634\\u0631';\n  t['\\uFD0E'] = '\\u0633\\u0631';\n  t['\\uFD0F'] = '\\u0635\\u0631';\n  t['\\uFD10'] = '\\u0636\\u0631';\n  t['\\uFD11'] = '\\u0637\\u0649';\n  t['\\uFD12'] = '\\u0637\\u064A';\n  t['\\uFD13'] = '\\u0639\\u0649';\n  t['\\uFD14'] = '\\u0639\\u064A';\n  t['\\uFD15'] = '\\u063A\\u0649';\n  t['\\uFD16'] = '\\u063A\\u064A';\n  t['\\uFD17'] = '\\u0633\\u0649';\n  t['\\uFD18'] = '\\u0633\\u064A';\n  t['\\uFD19'] = '\\u0634\\u0649';\n  t['\\uFD1A'] = '\\u0634\\u064A';\n  t['\\uFD1B'] = '\\u062D\\u0649';\n  t['\\uFD1C'] = '\\u062D\\u064A';\n  t['\\uFD1D'] = '\\u062C\\u0649';\n  t['\\uFD1E'] = '\\u062C\\u064A';\n  t['\\uFD1F'] = '\\u062E\\u0649';\n  t['\\uFD20'] = '\\u062E\\u064A';\n  t['\\uFD21'] = '\\u0635\\u0649';\n  t['\\uFD22'] = '\\u0635\\u064A';\n  t['\\uFD23'] = '\\u0636\\u0649';\n  t['\\uFD24'] = '\\u0636\\u064A';\n  t['\\uFD25'] = '\\u0634\\u062C';\n  t['\\uFD26'] = '\\u0634\\u062D';\n  t['\\uFD27'] = '\\u0634\\u062E';\n  t['\\uFD28'] = '\\u0634\\u0645';\n  t['\\uFD29'] = '\\u0634\\u0631';\n  t['\\uFD2A'] = '\\u0633\\u0631';\n  t['\\uFD2B'] = '\\u0635\\u0631';\n  t['\\uFD2C'] = '\\u0636\\u0631';\n  t['\\uFD2D'] = '\\u0634\\u062C';\n  t['\\uFD2E'] = '\\u0634\\u062D';\n  t['\\uFD2F'] = '\\u0634\\u062E';\n  t['\\uFD30'] = '\\u0634\\u0645';\n  t['\\uFD31'] = '\\u0633\\u0647';\n  t['\\uFD32'] = '\\u0634\\u0647';\n  t['\\uFD33'] = '\\u0637\\u0645';\n  t['\\uFD34'] = '\\u0633\\u062C';\n  t['\\uFD35'] = '\\u0633\\u062D';\n  t['\\uFD36'] = '\\u0633\\u062E';\n  t['\\uFD37'] = '\\u0634\\u062C';\n  t['\\uFD38'] = '\\u0634\\u062D';\n  t['\\uFD39'] = '\\u0634\\u062E';\n  t['\\uFD3A'] = '\\u0637\\u0645';\n  t['\\uFD3B'] = '\\u0638\\u0645';\n  t['\\uFD3C'] = '\\u0627\\u064B';\n  t['\\uFD3D'] = '\\u0627\\u064B';\n  t['\\uFD50'] = '\\u062A\\u062C\\u0645';\n  t['\\uFD51'] = '\\u062A\\u062D\\u062C';\n  t['\\uFD52'] = '\\u062A\\u062D\\u062C';\n  t['\\uFD53'] = '\\u062A\\u062D\\u0645';\n  t['\\uFD54'] = '\\u062A\\u062E\\u0645';\n  t['\\uFD55'] = '\\u062A\\u0645\\u062C';\n  t['\\uFD56'] = '\\u062A\\u0645\\u062D';\n  t['\\uFD57'] = '\\u062A\\u0645\\u062E';\n  t['\\uFD58'] = '\\u062C\\u0645\\u062D';\n  t['\\uFD59'] = '\\u062C\\u0645\\u062D';\n  t['\\uFD5A'] = '\\u062D\\u0645\\u064A';\n  t['\\uFD5B'] = '\\u062D\\u0645\\u0649';\n  t['\\uFD5C'] = '\\u0633\\u062D\\u062C';\n  t['\\uFD5D'] = '\\u0633\\u062C\\u062D';\n  t['\\uFD5E'] = '\\u0633\\u062C\\u0649';\n  t['\\uFD5F'] = '\\u0633\\u0645\\u062D';\n  t['\\uFD60'] = '\\u0633\\u0645\\u062D';\n  t['\\uFD61'] = '\\u0633\\u0645\\u062C';\n  t['\\uFD62'] = '\\u0633\\u0645\\u0645';\n  t['\\uFD63'] = '\\u0633\\u0645\\u0645';\n  t['\\uFD64'] = '\\u0635\\u062D\\u062D';\n  t['\\uFD65'] = '\\u0635\\u062D\\u062D';\n  t['\\uFD66'] = '\\u0635\\u0645\\u0645';\n  t['\\uFD67'] = '\\u0634\\u062D\\u0645';\n  t['\\uFD68'] = '\\u0634\\u062D\\u0645';\n  t['\\uFD69'] = '\\u0634\\u062C\\u064A';\n  t['\\uFD6A'] = '\\u0634\\u0645\\u062E';\n  t['\\uFD6B'] = '\\u0634\\u0645\\u062E';\n  t['\\uFD6C'] = '\\u0634\\u0645\\u0645';\n  t['\\uFD6D'] = '\\u0634\\u0645\\u0645';\n  t['\\uFD6E'] = '\\u0636\\u062D\\u0649';\n  t['\\uFD6F'] = '\\u0636\\u062E\\u0645';\n  t['\\uFD70'] = '\\u0636\\u062E\\u0645';\n  t['\\uFD71'] = '\\u0637\\u0645\\u062D';\n  t['\\uFD72'] = '\\u0637\\u0645\\u062D';\n  t['\\uFD73'] = '\\u0637\\u0645\\u0645';\n  t['\\uFD74'] = '\\u0637\\u0645\\u064A';\n  t['\\uFD75'] = '\\u0639\\u062C\\u0645';\n  t['\\uFD76'] = '\\u0639\\u0645\\u0645';\n  t['\\uFD77'] = '\\u0639\\u0645\\u0645';\n  t['\\uFD78'] = '\\u0639\\u0645\\u0649';\n  t['\\uFD79'] = '\\u063A\\u0645\\u0645';\n  t['\\uFD7A'] = '\\u063A\\u0645\\u064A';\n  t['\\uFD7B'] = '\\u063A\\u0645\\u0649';\n  t['\\uFD7C'] = '\\u0641\\u062E\\u0645';\n  t['\\uFD7D'] = '\\u0641\\u062E\\u0645';\n  t['\\uFD7E'] = '\\u0642\\u0645\\u062D';\n  t['\\uFD7F'] = '\\u0642\\u0645\\u0645';\n  t['\\uFD80'] = '\\u0644\\u062D\\u0645';\n  t['\\uFD81'] = '\\u0644\\u062D\\u064A';\n  t['\\uFD82'] = '\\u0644\\u062D\\u0649';\n  t['\\uFD83'] = '\\u0644\\u062C\\u062C';\n  t['\\uFD84'] = '\\u0644\\u062C\\u062C';\n  t['\\uFD85'] = '\\u0644\\u062E\\u0645';\n  t['\\uFD86'] = '\\u0644\\u062E\\u0645';\n  t['\\uFD87'] = '\\u0644\\u0645\\u062D';\n  t['\\uFD88'] = '\\u0644\\u0645\\u062D';\n  t['\\uFD89'] = '\\u0645\\u062D\\u062C';\n  t['\\uFD8A'] = '\\u0645\\u062D\\u0645';\n  t['\\uFD8B'] = '\\u0645\\u062D\\u064A';\n  t['\\uFD8C'] = '\\u0645\\u062C\\u062D';\n  t['\\uFD8D'] = '\\u0645\\u062C\\u0645';\n  t['\\uFD8E'] = '\\u0645\\u062E\\u062C';\n  t['\\uFD8F'] = '\\u0645\\u062E\\u0645';\n  t['\\uFD92'] = '\\u0645\\u062C\\u062E';\n  t['\\uFD93'] = '\\u0647\\u0645\\u062C';\n  t['\\uFD94'] = '\\u0647\\u0645\\u0645';\n  t['\\uFD95'] = '\\u0646\\u062D\\u0645';\n  t['\\uFD96'] = '\\u0646\\u062D\\u0649';\n  t['\\uFD97'] = '\\u0646\\u062C\\u0645';\n  t['\\uFD98'] = '\\u0646\\u062C\\u0645';\n  t['\\uFD99'] = '\\u0646\\u062C\\u0649';\n  t['\\uFD9A'] = '\\u0646\\u0645\\u064A';\n  t['\\uFD9B'] = '\\u0646\\u0645\\u0649';\n  t['\\uFD9C'] = '\\u064A\\u0645\\u0645';\n  t['\\uFD9D'] = '\\u064A\\u0645\\u0645';\n  t['\\uFD9E'] = '\\u0628\\u062E\\u064A';\n  t['\\uFD9F'] = '\\u062A\\u062C\\u064A';\n  t['\\uFDA0'] = '\\u062A\\u062C\\u0649';\n  t['\\uFDA1'] = '\\u062A\\u062E\\u064A';\n  t['\\uFDA2'] = '\\u062A\\u062E\\u0649';\n  t['\\uFDA3'] = '\\u062A\\u0645\\u064A';\n  t['\\uFDA4'] = '\\u062A\\u0645\\u0649';\n  t['\\uFDA5'] = '\\u062C\\u0645\\u064A';\n  t['\\uFDA6'] = '\\u062C\\u062D\\u0649';\n  t['\\uFDA7'] = '\\u062C\\u0645\\u0649';\n  t['\\uFDA8'] = '\\u0633\\u062E\\u0649';\n  t['\\uFDA9'] = '\\u0635\\u062D\\u064A';\n  t['\\uFDAA'] = '\\u0634\\u062D\\u064A';\n  t['\\uFDAB'] = '\\u0636\\u062D\\u064A';\n  t['\\uFDAC'] = '\\u0644\\u062C\\u064A';\n  t['\\uFDAD'] = '\\u0644\\u0645\\u064A';\n  t['\\uFDAE'] = '\\u064A\\u062D\\u064A';\n  t['\\uFDAF'] = '\\u064A\\u062C\\u064A';\n  t['\\uFDB0'] = '\\u064A\\u0645\\u064A';\n  t['\\uFDB1'] = '\\u0645\\u0645\\u064A';\n  t['\\uFDB2'] = '\\u0642\\u0645\\u064A';\n  t['\\uFDB3'] = '\\u0646\\u062D\\u064A';\n  t['\\uFDB4'] = '\\u0642\\u0645\\u062D';\n  t['\\uFDB5'] = '\\u0644\\u062D\\u0645';\n  t['\\uFDB6'] = '\\u0639\\u0645\\u064A';\n  t['\\uFDB7'] = '\\u0643\\u0645\\u064A';\n  t['\\uFDB8'] = '\\u0646\\u062C\\u062D';\n  t['\\uFDB9'] = '\\u0645\\u062E\\u064A';\n  t['\\uFDBA'] = '\\u0644\\u062C\\u0645';\n  t['\\uFDBB'] = '\\u0643\\u0645\\u0645';\n  t['\\uFDBC'] = '\\u0644\\u062C\\u0645';\n  t['\\uFDBD'] = '\\u0646\\u062C\\u062D';\n  t['\\uFDBE'] = '\\u062C\\u062D\\u064A';\n  t['\\uFDBF'] = '\\u062D\\u062C\\u064A';\n  t['\\uFDC0'] = '\\u0645\\u062C\\u064A';\n  t['\\uFDC1'] = '\\u0641\\u0645\\u064A';\n  t['\\uFDC2'] = '\\u0628\\u062D\\u064A';\n  t['\\uFDC3'] = '\\u0643\\u0645\\u0645';\n  t['\\uFDC4'] = '\\u0639\\u062C\\u0645';\n  t['\\uFDC5'] = '\\u0635\\u0645\\u0645';\n  t['\\uFDC6'] = '\\u0633\\u062E\\u064A';\n  t['\\uFDC7'] = '\\u0646\\u062C\\u064A';\n  t['\\uFE49'] = '\\u203E';\n  t['\\uFE4A'] = '\\u203E';\n  t['\\uFE4B'] = '\\u203E';\n  t['\\uFE4C'] = '\\u203E';\n  t['\\uFE4D'] = '\\u005F';\n  t['\\uFE4E'] = '\\u005F';\n  t['\\uFE4F'] = '\\u005F';\n  t['\\uFE80'] = '\\u0621';\n  t['\\uFE81'] = '\\u0622';\n  t['\\uFE82'] = '\\u0622';\n  t['\\uFE83'] = '\\u0623';\n  t['\\uFE84'] = '\\u0623';\n  t['\\uFE85'] = '\\u0624';\n  t['\\uFE86'] = '\\u0624';\n  t['\\uFE87'] = '\\u0625';\n  t['\\uFE88'] = '\\u0625';\n  t['\\uFE89'] = '\\u0626';\n  t['\\uFE8A'] = '\\u0626';\n  t['\\uFE8B'] = '\\u0626';\n  t['\\uFE8C'] = '\\u0626';\n  t['\\uFE8D'] = '\\u0627';\n  t['\\uFE8E'] = '\\u0627';\n  t['\\uFE8F'] = '\\u0628';\n  t['\\uFE90'] = '\\u0628';\n  t['\\uFE91'] = '\\u0628';\n  t['\\uFE92'] = '\\u0628';\n  t['\\uFE93'] = '\\u0629';\n  t['\\uFE94'] = '\\u0629';\n  t['\\uFE95'] = '\\u062A';\n  t['\\uFE96'] = '\\u062A';\n  t['\\uFE97'] = '\\u062A';\n  t['\\uFE98'] = '\\u062A';\n  t['\\uFE99'] = '\\u062B';\n  t['\\uFE9A'] = '\\u062B';\n  t['\\uFE9B'] = '\\u062B';\n  t['\\uFE9C'] = '\\u062B';\n  t['\\uFE9D'] = '\\u062C';\n  t['\\uFE9E'] = '\\u062C';\n  t['\\uFE9F'] = '\\u062C';\n  t['\\uFEA0'] = '\\u062C';\n  t['\\uFEA1'] = '\\u062D';\n  t['\\uFEA2'] = '\\u062D';\n  t['\\uFEA3'] = '\\u062D';\n  t['\\uFEA4'] = '\\u062D';\n  t['\\uFEA5'] = '\\u062E';\n  t['\\uFEA6'] = '\\u062E';\n  t['\\uFEA7'] = '\\u062E';\n  t['\\uFEA8'] = '\\u062E';\n  t['\\uFEA9'] = '\\u062F';\n  t['\\uFEAA'] = '\\u062F';\n  t['\\uFEAB'] = '\\u0630';\n  t['\\uFEAC'] = '\\u0630';\n  t['\\uFEAD'] = '\\u0631';\n  t['\\uFEAE'] = '\\u0631';\n  t['\\uFEAF'] = '\\u0632';\n  t['\\uFEB0'] = '\\u0632';\n  t['\\uFEB1'] = '\\u0633';\n  t['\\uFEB2'] = '\\u0633';\n  t['\\uFEB3'] = '\\u0633';\n  t['\\uFEB4'] = '\\u0633';\n  t['\\uFEB5'] = '\\u0634';\n  t['\\uFEB6'] = '\\u0634';\n  t['\\uFEB7'] = '\\u0634';\n  t['\\uFEB8'] = '\\u0634';\n  t['\\uFEB9'] = '\\u0635';\n  t['\\uFEBA'] = '\\u0635';\n  t['\\uFEBB'] = '\\u0635';\n  t['\\uFEBC'] = '\\u0635';\n  t['\\uFEBD'] = '\\u0636';\n  t['\\uFEBE'] = '\\u0636';\n  t['\\uFEBF'] = '\\u0636';\n  t['\\uFEC0'] = '\\u0636';\n  t['\\uFEC1'] = '\\u0637';\n  t['\\uFEC2'] = '\\u0637';\n  t['\\uFEC3'] = '\\u0637';\n  t['\\uFEC4'] = '\\u0637';\n  t['\\uFEC5'] = '\\u0638';\n  t['\\uFEC6'] = '\\u0638';\n  t['\\uFEC7'] = '\\u0638';\n  t['\\uFEC8'] = '\\u0638';\n  t['\\uFEC9'] = '\\u0639';\n  t['\\uFECA'] = '\\u0639';\n  t['\\uFECB'] = '\\u0639';\n  t['\\uFECC'] = '\\u0639';\n  t['\\uFECD'] = '\\u063A';\n  t['\\uFECE'] = '\\u063A';\n  t['\\uFECF'] = '\\u063A';\n  t['\\uFED0'] = '\\u063A';\n  t['\\uFED1'] = '\\u0641';\n  t['\\uFED2'] = '\\u0641';\n  t['\\uFED3'] = '\\u0641';\n  t['\\uFED4'] = '\\u0641';\n  t['\\uFED5'] = '\\u0642';\n  t['\\uFED6'] = '\\u0642';\n  t['\\uFED7'] = '\\u0642';\n  t['\\uFED8'] = '\\u0642';\n  t['\\uFED9'] = '\\u0643';\n  t['\\uFEDA'] = '\\u0643';\n  t['\\uFEDB'] = '\\u0643';\n  t['\\uFEDC'] = '\\u0643';\n  t['\\uFEDD'] = '\\u0644';\n  t['\\uFEDE'] = '\\u0644';\n  t['\\uFEDF'] = '\\u0644';\n  t['\\uFEE0'] = '\\u0644';\n  t['\\uFEE1'] = '\\u0645';\n  t['\\uFEE2'] = '\\u0645';\n  t['\\uFEE3'] = '\\u0645';\n  t['\\uFEE4'] = '\\u0645';\n  t['\\uFEE5'] = '\\u0646';\n  t['\\uFEE6'] = '\\u0646';\n  t['\\uFEE7'] = '\\u0646';\n  t['\\uFEE8'] = '\\u0646';\n  t['\\uFEE9'] = '\\u0647';\n  t['\\uFEEA'] = '\\u0647';\n  t['\\uFEEB'] = '\\u0647';\n  t['\\uFEEC'] = '\\u0647';\n  t['\\uFEED'] = '\\u0648';\n  t['\\uFEEE'] = '\\u0648';\n  t['\\uFEEF'] = '\\u0649';\n  t['\\uFEF0'] = '\\u0649';\n  t['\\uFEF1'] = '\\u064A';\n  t['\\uFEF2'] = '\\u064A';\n  t['\\uFEF3'] = '\\u064A';\n  t['\\uFEF4'] = '\\u064A';\n  t['\\uFEF5'] = '\\u0644\\u0622';\n  t['\\uFEF6'] = '\\u0644\\u0622';\n  t['\\uFEF7'] = '\\u0644\\u0623';\n  t['\\uFEF8'] = '\\u0644\\u0623';\n  t['\\uFEF9'] = '\\u0644\\u0625';\n  t['\\uFEFA'] = '\\u0644\\u0625';\n  t['\\uFEFB'] = '\\u0644\\u0627';\n  t['\\uFEFC'] = '\\u0644\\u0627';\n});\n\nfunction reverseIfRtl(chars) {\n  var charsLength = chars.length;\n  // Reverse an arabic ligature.\n  if (charsLength <= 1 || !isRTLRangeFor(chars.charCodeAt(0))) {\n    return chars;\n  }\n  var s = '';\n  for (var ii = charsLength - 1; ii >= 0; ii--) {\n    s += chars[ii];\n  }\n  return s;\n}\n\nexports.mapSpecialUnicodeValues = mapSpecialUnicodeValues;\nexports.reverseIfRtl = reverseIfRtl;\nexports.getUnicodeRangeFor = getUnicodeRangeFor;\nexports.getNormalizedUnicodes = getNormalizedUnicodes;\nexports.getUnicodeForGlyph = getUnicodeForGlyph;\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  bytesToString, FONT_IDENTITY_MATRIX, FormatError, unreachable, warn\n} from '../shared/util';\nimport { CFFParser } from './cff_parser';\nimport { getGlyphsUnicode } from './glyphlist';\nimport { StandardEncoding } from './encodings';\nimport { Stream } from './stream';\n\nvar FontRendererFactory = (function FontRendererFactoryClosure() {\n  function getLong(data, offset) {\n    return (data[offset] << 24) | (data[offset + 1] << 16) |\n           (data[offset + 2] << 8) | data[offset + 3];\n  }\n\n  function getUshort(data, offset) {\n    return (data[offset] << 8) | data[offset + 1];\n  }\n\n  function parseCmap(data, start, end) {\n    var offset = (getUshort(data, start + 2) === 1 ?\n                  getLong(data, start + 8) : getLong(data, start + 16));\n    var format = getUshort(data, start + offset);\n    var ranges, p, i;\n    if (format === 4) {\n      getUshort(data, start + offset + 2); // length\n      var segCount = getUshort(data, start + offset + 6) >> 1;\n      p = start + offset + 14;\n      ranges = [];\n      for (i = 0; i < segCount; i++, p += 2) {\n        ranges[i] = { end: getUshort(data, p), };\n      }\n      p += 2;\n      for (i = 0; i < segCount; i++, p += 2) {\n        ranges[i].start = getUshort(data, p);\n      }\n      for (i = 0; i < segCount; i++, p += 2) {\n        ranges[i].idDelta = getUshort(data, p);\n      }\n      for (i = 0; i < segCount; i++, p += 2) {\n        var idOffset = getUshort(data, p);\n        if (idOffset === 0) {\n          continue;\n        }\n        ranges[i].ids = [];\n        for (var j = 0, jj = ranges[i].end - ranges[i].start + 1; j < jj; j++) {\n          ranges[i].ids[j] = getUshort(data, p + idOffset);\n          idOffset += 2;\n        }\n      }\n      return ranges;\n    } else if (format === 12) {\n      getLong(data, start + offset + 4); // length\n      var groups = getLong(data, start + offset + 12);\n      p = start + offset + 16;\n      ranges = [];\n      for (i = 0; i < groups; i++) {\n        ranges.push({\n          start: getLong(data, p),\n          end: getLong(data, p + 4),\n          idDelta: getLong(data, p + 8) - getLong(data, p),\n        });\n        p += 12;\n      }\n      return ranges;\n    }\n    throw new FormatError(`unsupported cmap: ${format}`);\n  }\n\n  function parseCff(data, start, end, seacAnalysisEnabled) {\n    var properties = {};\n    var parser = new CFFParser(new Stream(data, start, end - start),\n                               properties, seacAnalysisEnabled);\n    var cff = parser.parse();\n    return {\n      glyphs: cff.charStrings.objects,\n      subrs: (cff.topDict.privateDict && cff.topDict.privateDict.subrsIndex &&\n              cff.topDict.privateDict.subrsIndex.objects),\n      gsubrs: cff.globalSubrIndex && cff.globalSubrIndex.objects,\n      isCFFCIDFont: cff.isCIDFont,\n      fdSelect: cff.fdSelect,\n      fdArray: cff.fdArray,\n    };\n  }\n\n  function parseGlyfTable(glyf, loca, isGlyphLocationsLong) {\n    var itemSize, itemDecode;\n    if (isGlyphLocationsLong) {\n      itemSize = 4;\n      itemDecode = function fontItemDecodeLong(data, offset) {\n        return (data[offset] << 24) | (data[offset + 1] << 16) |\n               (data[offset + 2] << 8) | data[offset + 3];\n      };\n    } else {\n      itemSize = 2;\n      itemDecode = function fontItemDecode(data, offset) {\n        return (data[offset] << 9) | (data[offset + 1] << 1);\n      };\n    }\n    var glyphs = [];\n    var startOffset = itemDecode(loca, 0);\n    for (var j = itemSize; j < loca.length; j += itemSize) {\n      var endOffset = itemDecode(loca, j);\n      glyphs.push(glyf.subarray(startOffset, endOffset));\n      startOffset = endOffset;\n    }\n    return glyphs;\n  }\n\n  function lookupCmap(ranges, unicode) {\n    var code = unicode.codePointAt(0), gid = 0;\n    var l = 0, r = ranges.length - 1;\n    while (l < r) {\n      var c = (l + r + 1) >> 1;\n      if (code < ranges[c].start) {\n        r = c - 1;\n      } else {\n        l = c;\n      }\n    }\n    if (ranges[l].start <= code && code <= ranges[l].end) {\n      gid = (ranges[l].idDelta + (ranges[l].ids ?\n             ranges[l].ids[code - ranges[l].start] : code)) & 0xFFFF;\n    }\n    return {\n      charCode: code,\n      glyphId: gid,\n    };\n  }\n\n  function compileGlyf(code, cmds, font) {\n    function moveTo(x, y) {\n      cmds.push({ cmd: 'moveTo', args: [x, y], });\n    }\n    function lineTo(x, y) {\n      cmds.push({ cmd: 'lineTo', args: [x, y], });\n    }\n    function quadraticCurveTo(xa, ya, x, y) {\n      cmds.push({ cmd: 'quadraticCurveTo', args: [xa, ya, x, y], });\n    }\n\n    var i = 0;\n    var numberOfContours = ((code[i] << 24) | (code[i + 1] << 16)) >> 16;\n    var flags;\n    var x = 0, y = 0;\n    i += 10;\n    if (numberOfContours < 0) {\n      // composite glyph\n      do {\n        flags = (code[i] << 8) | code[i + 1];\n        var glyphIndex = (code[i + 2] << 8) | code[i + 3];\n        i += 4;\n        var arg1, arg2;\n        if ((flags & 0x01)) {\n          arg1 = ((code[i] << 24) | (code[i + 1] << 16)) >> 16;\n          arg2 = ((code[i + 2] << 24) | (code[i + 3] << 16)) >> 16;\n          i += 4;\n        } else {\n          arg1 = code[i++]; arg2 = code[i++];\n        }\n        if ((flags & 0x02)) {\n           x = arg1;\n           y = arg2;\n        } else {\n           x = 0; y = 0; // TODO \"they are points\" ?\n        }\n        var scaleX = 1, scaleY = 1, scale01 = 0, scale10 = 0;\n        if ((flags & 0x08)) {\n          scaleX =\n          scaleY = ((code[i] << 24) | (code[i + 1] << 16)) / 1073741824;\n          i += 2;\n        } else if ((flags & 0x40)) {\n          scaleX = ((code[i] << 24) | (code[i + 1] << 16)) / 1073741824;\n          scaleY = ((code[i + 2] << 24) | (code[i + 3] << 16)) / 1073741824;\n          i += 4;\n        } else if ((flags & 0x80)) {\n          scaleX = ((code[i] << 24) | (code[i + 1] << 16)) / 1073741824;\n          scale01 = ((code[i + 2] << 24) | (code[i + 3] << 16)) / 1073741824;\n          scale10 = ((code[i + 4] << 24) | (code[i + 5] << 16)) / 1073741824;\n          scaleY = ((code[i + 6] << 24) | (code[i + 7] << 16)) / 1073741824;\n          i += 8;\n        }\n        var subglyph = font.glyphs[glyphIndex];\n        if (subglyph) {\n          cmds.push({ cmd: 'save', });\n          cmds.push({ cmd: 'transform',\n                     args: [scaleX, scale01, scale10, scaleY, x, y], });\n          compileGlyf(subglyph, cmds, font);\n          cmds.push({ cmd: 'restore', });\n        }\n      } while ((flags & 0x20));\n    } else {\n      // simple glyph\n      var endPtsOfContours = [];\n      var j, jj;\n      for (j = 0; j < numberOfContours; j++) {\n        endPtsOfContours.push((code[i] << 8) | code[i + 1]);\n        i += 2;\n      }\n      var instructionLength = (code[i] << 8) | code[i + 1];\n      i += 2 + instructionLength; // skipping the instructions\n      var numberOfPoints = endPtsOfContours[endPtsOfContours.length - 1] + 1;\n      var points = [];\n      while (points.length < numberOfPoints) {\n        flags = code[i++];\n        var repeat = 1;\n        if ((flags & 0x08)) {\n          repeat += code[i++];\n        }\n        while (repeat-- > 0) {\n          points.push({ flags, });\n        }\n      }\n      for (j = 0; j < numberOfPoints; j++) {\n        switch (points[j].flags & 0x12) {\n          case 0x00:\n            x += ((code[i] << 24) | (code[i + 1] << 16)) >> 16;\n            i += 2;\n            break;\n          case 0x02:\n            x -= code[i++];\n            break;\n          case 0x12:\n            x += code[i++];\n            break;\n        }\n        points[j].x = x;\n      }\n      for (j = 0; j < numberOfPoints; j++) {\n        switch (points[j].flags & 0x24) {\n          case 0x00:\n            y += ((code[i] << 24) | (code[i + 1] << 16)) >> 16;\n            i += 2;\n            break;\n          case 0x04:\n            y -= code[i++];\n            break;\n          case 0x24:\n            y += code[i++];\n            break;\n        }\n        points[j].y = y;\n      }\n\n      var startPoint = 0;\n      for (i = 0; i < numberOfContours; i++) {\n        var endPoint = endPtsOfContours[i];\n        // contours might have implicit points, which is located in the middle\n        // between two neighboring off-curve points\n        var contour = points.slice(startPoint, endPoint + 1);\n        if ((contour[0].flags & 1)) {\n          contour.push(contour[0]); // using start point at the contour end\n        } else if ((contour[contour.length - 1].flags & 1)) {\n          // first is off-curve point, trying to use one from the end\n          contour.unshift(contour[contour.length - 1]);\n        } else {\n          // start and end are off-curve points, creating implicit one\n          var p = {\n            flags: 1,\n            x: (contour[0].x + contour[contour.length - 1].x) / 2,\n            y: (contour[0].y + contour[contour.length - 1].y) / 2,\n          };\n          contour.unshift(p);\n          contour.push(p);\n        }\n        moveTo(contour[0].x, contour[0].y);\n        for (j = 1, jj = contour.length; j < jj; j++) {\n          if ((contour[j].flags & 1)) {\n            lineTo(contour[j].x, contour[j].y);\n          } else if ((contour[j + 1].flags & 1)) {\n            quadraticCurveTo(contour[j].x, contour[j].y,\n                             contour[j + 1].x, contour[j + 1].y);\n            j++;\n          } else {\n            quadraticCurveTo(contour[j].x, contour[j].y,\n              (contour[j].x + contour[j + 1].x) / 2,\n              (contour[j].y + contour[j + 1].y) / 2);\n          }\n        }\n        startPoint = endPoint + 1;\n      }\n    }\n  }\n\n  function compileCharString(code, cmds, font, glyphId) {\n    var stack = [];\n    var x = 0, y = 0;\n    var stems = 0;\n\n    function moveTo(x, y) {\n      cmds.push({ cmd: 'moveTo', args: [x, y], });\n    }\n    function lineTo(x, y) {\n      cmds.push({ cmd: 'lineTo', args: [x, y], });\n    }\n    function bezierCurveTo(x1, y1, x2, y2, x, y) {\n      cmds.push({ cmd: 'bezierCurveTo', args: [x1, y1, x2, y2, x, y], });\n    }\n\n    function parse(code) {\n      var i = 0;\n      while (i < code.length) {\n        var stackClean = false;\n        var v = code[i++];\n        var xa, xb, ya, yb, y1, y2, y3, n, subrCode;\n        switch (v) {\n          case 1: // hstem\n            stems += stack.length >> 1;\n            stackClean = true;\n            break;\n          case 3: // vstem\n            stems += stack.length >> 1;\n            stackClean = true;\n            break;\n          case 4: // vmoveto\n            y += stack.pop();\n            moveTo(x, y);\n            stackClean = true;\n            break;\n          case 5: // rlineto\n            while (stack.length > 0) {\n              x += stack.shift();\n              y += stack.shift();\n              lineTo(x, y);\n            }\n            break;\n          case 6: // hlineto\n            while (stack.length > 0) {\n              x += stack.shift();\n              lineTo(x, y);\n              if (stack.length === 0) {\n                break;\n              }\n              y += stack.shift();\n              lineTo(x, y);\n            }\n            break;\n          case 7: // vlineto\n            while (stack.length > 0) {\n              y += stack.shift();\n              lineTo(x, y);\n              if (stack.length === 0) {\n                break;\n              }\n              x += stack.shift();\n              lineTo(x, y);\n            }\n            break;\n          case 8: // rrcurveto\n            while (stack.length > 0) {\n              xa = x + stack.shift(); ya = y + stack.shift();\n              xb = xa + stack.shift(); yb = ya + stack.shift();\n              x = xb + stack.shift(); y = yb + stack.shift();\n              bezierCurveTo(xa, ya, xb, yb, x, y);\n            }\n            break;\n          case 10: // callsubr\n            n = stack.pop();\n            subrCode = null;\n            if (font.isCFFCIDFont) {\n              let fdIndex = font.fdSelect.getFDIndex(glyphId);\n              if (fdIndex >= 0 && fdIndex < font.fdArray.length) {\n                let fontDict = font.fdArray[fdIndex], subrs;\n                if (fontDict.privateDict && fontDict.privateDict.subrsIndex) {\n                  subrs = fontDict.privateDict.subrsIndex.objects;\n                }\n                if (subrs) {\n                  let numSubrs = subrs.length;\n                  // Add subroutine bias.\n                  n += numSubrs < 1240 ? 107 :\n                       (numSubrs < 33900 ? 1131 : 32768);\n                  subrCode = subrs[n];\n                }\n              } else {\n                warn('Invalid fd index for glyph index.');\n              }\n            } else {\n              subrCode = font.subrs[n + font.subrsBias];\n            }\n            if (subrCode) {\n              parse(subrCode);\n            }\n            break;\n          case 11: // return\n            return;\n          case 12:\n            v = code[i++];\n            switch (v) {\n              case 34: // flex\n                xa = x + stack.shift();\n                xb = xa + stack.shift(); y1 = y + stack.shift();\n                x = xb + stack.shift();\n                bezierCurveTo(xa, y, xb, y1, x, y1);\n                xa = x + stack.shift();\n                xb = xa + stack.shift();\n                x = xb + stack.shift();\n                bezierCurveTo(xa, y1, xb, y, x, y);\n                break;\n              case 35: // flex\n                xa = x + stack.shift(); ya = y + stack.shift();\n                xb = xa + stack.shift(); yb = ya + stack.shift();\n                x = xb + stack.shift(); y = yb + stack.shift();\n                bezierCurveTo(xa, ya, xb, yb, x, y);\n                xa = x + stack.shift(); ya = y + stack.shift();\n                xb = xa + stack.shift(); yb = ya + stack.shift();\n                x = xb + stack.shift(); y = yb + stack.shift();\n                bezierCurveTo(xa, ya, xb, yb, x, y);\n                stack.pop(); // fd\n                break;\n              case 36: // hflex1\n                xa = x + stack.shift(); y1 = y + stack.shift();\n                xb = xa + stack.shift(); y2 = y1 + stack.shift();\n                x = xb + stack.shift();\n                bezierCurveTo(xa, y1, xb, y2, x, y2);\n                xa = x + stack.shift();\n                xb = xa + stack.shift(); y3 = y2 + stack.shift();\n                x = xb + stack.shift();\n                bezierCurveTo(xa, y2, xb, y3, x, y);\n                break;\n              case 37: // flex1\n                var x0 = x, y0 = y;\n                xa = x + stack.shift(); ya = y + stack.shift();\n                xb = xa + stack.shift(); yb = ya + stack.shift();\n                x = xb + stack.shift(); y = yb + stack.shift();\n                bezierCurveTo(xa, ya, xb, yb, x, y);\n                xa = x + stack.shift(); ya = y + stack.shift();\n                xb = xa + stack.shift(); yb = ya + stack.shift();\n                x = xb; y = yb;\n                if (Math.abs(x - x0) > Math.abs(y - y0)) {\n                  x += stack.shift();\n                } else {\n                  y += stack.shift();\n                }\n                bezierCurveTo(xa, ya, xb, yb, x, y);\n                break;\n              default:\n                throw new FormatError(`unknown operator: 12 ${v}`);\n            }\n            break;\n          case 14: // endchar\n            if (stack.length >= 4) {\n              var achar = stack.pop();\n              var bchar = stack.pop();\n              y = stack.pop();\n              x = stack.pop();\n              cmds.push({ cmd: 'save', });\n              cmds.push({ cmd: 'translate', args: [x, y], });\n              var cmap = lookupCmap(font.cmap, String.fromCharCode(\n                font.glyphNameMap[StandardEncoding[achar]]));\n              compileCharString(font.glyphs[cmap.glyphId], cmds, font,\n                                cmap.glyphId);\n              cmds.push({ cmd: 'restore', });\n\n              cmap = lookupCmap(font.cmap, String.fromCharCode(\n                font.glyphNameMap[StandardEncoding[bchar]]));\n              compileCharString(font.glyphs[cmap.glyphId], cmds, font,\n                                cmap.glyphId);\n            }\n            return;\n          case 18: // hstemhm\n            stems += stack.length >> 1;\n            stackClean = true;\n            break;\n          case 19: // hintmask\n            stems += stack.length >> 1;\n            i += (stems + 7) >> 3;\n            stackClean = true;\n            break;\n          case 20: // cntrmask\n            stems += stack.length >> 1;\n            i += (stems + 7) >> 3;\n            stackClean = true;\n            break;\n          case 21: // rmoveto\n            y += stack.pop();\n            x += stack.pop();\n            moveTo(x, y);\n            stackClean = true;\n            break;\n          case 22: // hmoveto\n            x += stack.pop();\n            moveTo(x, y);\n            stackClean = true;\n            break;\n          case 23: // vstemhm\n            stems += stack.length >> 1;\n            stackClean = true;\n            break;\n          case 24: // rcurveline\n            while (stack.length > 2) {\n              xa = x + stack.shift(); ya = y + stack.shift();\n              xb = xa + stack.shift(); yb = ya + stack.shift();\n              x = xb + stack.shift(); y = yb + stack.shift();\n              bezierCurveTo(xa, ya, xb, yb, x, y);\n            }\n            x += stack.shift();\n            y += stack.shift();\n            lineTo(x, y);\n            break;\n          case 25: // rlinecurve\n            while (stack.length > 6) {\n              x += stack.shift();\n              y += stack.shift();\n              lineTo(x, y);\n            }\n            xa = x + stack.shift(); ya = y + stack.shift();\n            xb = xa + stack.shift(); yb = ya + stack.shift();\n            x = xb + stack.shift(); y = yb + stack.shift();\n            bezierCurveTo(xa, ya, xb, yb, x, y);\n            break;\n          case 26: // vvcurveto\n            if (stack.length % 2) {\n              x += stack.shift();\n            }\n            while (stack.length > 0) {\n              xa = x; ya = y + stack.shift();\n              xb = xa + stack.shift(); yb = ya + stack.shift();\n              x = xb; y = yb + stack.shift();\n              bezierCurveTo(xa, ya, xb, yb, x, y);\n            }\n            break;\n          case 27: // hhcurveto\n            if (stack.length % 2) {\n              y += stack.shift();\n            }\n            while (stack.length > 0) {\n              xa = x + stack.shift(); ya = y;\n              xb = xa + stack.shift(); yb = ya + stack.shift();\n              x = xb + stack.shift(); y = yb;\n              bezierCurveTo(xa, ya, xb, yb, x, y);\n            }\n            break;\n          case 28:\n            stack.push(((code[i] << 24) | (code[i + 1] << 16)) >> 16);\n            i += 2;\n            break;\n          case 29: // callgsubr\n            n = stack.pop() + font.gsubrsBias;\n            subrCode = font.gsubrs[n];\n            if (subrCode) {\n              parse(subrCode);\n            }\n            break;\n          case 30: // vhcurveto\n            while (stack.length > 0) {\n              xa = x; ya = y + stack.shift();\n              xb = xa + stack.shift(); yb = ya + stack.shift();\n              x = xb + stack.shift();\n              y = yb + (stack.length === 1 ? stack.shift() : 0);\n              bezierCurveTo(xa, ya, xb, yb, x, y);\n              if (stack.length === 0) {\n                break;\n              }\n\n              xa = x + stack.shift(); ya = y;\n              xb = xa + stack.shift(); yb = ya + stack.shift();\n              y = yb + stack.shift();\n              x = xb + (stack.length === 1 ? stack.shift() : 0);\n              bezierCurveTo(xa, ya, xb, yb, x, y);\n            }\n            break;\n          case 31: // hvcurveto\n            while (stack.length > 0) {\n              xa = x + stack.shift(); ya = y;\n              xb = xa + stack.shift(); yb = ya + stack.shift();\n              y = yb + stack.shift();\n              x = xb + (stack.length === 1 ? stack.shift() : 0);\n              bezierCurveTo(xa, ya, xb, yb, x, y);\n              if (stack.length === 0) {\n                break;\n              }\n\n              xa = x; ya = y + stack.shift();\n              xb = xa + stack.shift(); yb = ya + stack.shift();\n              x = xb + stack.shift();\n              y = yb + (stack.length === 1 ? stack.shift() : 0);\n              bezierCurveTo(xa, ya, xb, yb, x, y);\n            }\n            break;\n          default:\n            if (v < 32) {\n              throw new FormatError(`unknown operator: ${v}`);\n            }\n            if (v < 247) {\n              stack.push(v - 139);\n            } else if (v < 251) {\n              stack.push((v - 247) * 256 + code[i++] + 108);\n            } else if (v < 255) {\n              stack.push(-(v - 251) * 256 - code[i++] - 108);\n            } else {\n              stack.push(((code[i] << 24) | (code[i + 1] << 16) |\n                         (code[i + 2] << 8) | code[i + 3]) / 65536);\n              i += 4;\n            }\n            break;\n        }\n        if (stackClean) {\n          stack.length = 0;\n        }\n      }\n    }\n    parse(code);\n  }\n\n  const NOOP = [];\n\n  class CompiledFont {\n    constructor(fontMatrix) {\n      if (this.constructor === CompiledFont) {\n        unreachable('Cannot initialize CompiledFont.');\n      }\n      this.fontMatrix = fontMatrix;\n\n      this.compiledGlyphs = Object.create(null);\n      this.compiledCharCodeToGlyphId = Object.create(null);\n    }\n\n    getPathJs(unicode) {\n      const cmap = lookupCmap(this.cmap, unicode);\n      let fn = this.compiledGlyphs[cmap.glyphId];\n      if (!fn) {\n        fn = this.compileGlyph(this.glyphs[cmap.glyphId], cmap.glyphId);\n        this.compiledGlyphs[cmap.glyphId] = fn;\n      }\n      if (this.compiledCharCodeToGlyphId[cmap.charCode] === undefined) {\n        this.compiledCharCodeToGlyphId[cmap.charCode] = cmap.glyphId;\n      }\n      return fn;\n    }\n\n    compileGlyph(code, glyphId) {\n      if (!code || code.length === 0 || code[0] === 14) {\n        return NOOP;\n      }\n\n      let fontMatrix = this.fontMatrix;\n      if (this.isCFFCIDFont) {\n        // Top DICT's FontMatrix can be ignored because CFFCompiler always\n        // removes it and copies to FDArray DICTs.\n        let fdIndex = this.fdSelect.getFDIndex(glyphId);\n        if (fdIndex >= 0 && fdIndex < this.fdArray.length) {\n          let fontDict = this.fdArray[fdIndex];\n          fontMatrix = fontDict.getByName('FontMatrix') || FONT_IDENTITY_MATRIX;\n        } else {\n          warn('Invalid fd index for glyph index.');\n        }\n      }\n\n      const cmds = [];\n      cmds.push({ cmd: 'save', });\n      cmds.push({ cmd: 'transform', args: fontMatrix.slice(), });\n      cmds.push({ cmd: 'scale', args: ['size', '-size'], });\n\n      this.compileGlyphImpl(code, cmds, glyphId);\n\n      cmds.push({ cmd: 'restore', });\n\n      return cmds;\n    }\n\n    compileGlyphImpl() {\n      unreachable('Children classes should implement this.');\n    }\n\n    hasBuiltPath(unicode) {\n      const cmap = lookupCmap(this.cmap, unicode);\n      return (this.compiledGlyphs[cmap.glyphId] !== undefined &&\n              this.compiledCharCodeToGlyphId[cmap.charCode] !== undefined);\n    }\n  }\n\n  class TrueTypeCompiled extends CompiledFont {\n    constructor(glyphs, cmap, fontMatrix) {\n      super(fontMatrix || [0.000488, 0, 0, 0.000488, 0, 0]);\n\n      this.glyphs = glyphs;\n      this.cmap = cmap;\n    }\n\n    compileGlyphImpl(code, cmds) {\n      compileGlyf(code, cmds, this);\n    }\n  }\n\n  class Type2Compiled extends CompiledFont {\n    constructor(cffInfo, cmap, fontMatrix, glyphNameMap) {\n      super(fontMatrix || [0.001, 0, 0, 0.001, 0, 0]);\n\n      this.glyphs = cffInfo.glyphs;\n      this.gsubrs = cffInfo.gsubrs || [];\n      this.subrs = cffInfo.subrs || [];\n      this.cmap = cmap;\n      this.glyphNameMap = glyphNameMap || getGlyphsUnicode();\n\n      this.gsubrsBias = (this.gsubrs.length < 1240 ?\n                         107 : (this.gsubrs.length < 33900 ? 1131 : 32768));\n      this.subrsBias = (this.subrs.length < 1240 ?\n                        107 : (this.subrs.length < 33900 ? 1131 : 32768));\n\n      this.isCFFCIDFont = cffInfo.isCFFCIDFont;\n      this.fdSelect = cffInfo.fdSelect;\n      this.fdArray = cffInfo.fdArray;\n    }\n\n    compileGlyphImpl(code, cmds, glyphId) {\n      compileCharString(code, cmds, this, glyphId);\n    }\n  }\n\n  return {\n    create: function FontRendererFactory_create(font, seacAnalysisEnabled) {\n      var data = new Uint8Array(font.data);\n      var cmap, glyf, loca, cff, indexToLocFormat, unitsPerEm;\n      var numTables = getUshort(data, 4);\n      for (var i = 0, p = 12; i < numTables; i++, p += 16) {\n        var tag = bytesToString(data.subarray(p, p + 4));\n        var offset = getLong(data, p + 8);\n        var length = getLong(data, p + 12);\n        switch (tag) {\n          case 'cmap':\n            cmap = parseCmap(data, offset, offset + length);\n            break;\n          case 'glyf':\n            glyf = data.subarray(offset, offset + length);\n            break;\n          case 'loca':\n            loca = data.subarray(offset, offset + length);\n            break;\n          case 'head':\n            unitsPerEm = getUshort(data, offset + 18);\n            indexToLocFormat = getUshort(data, offset + 50);\n            break;\n          case 'CFF ':\n            cff = parseCff(data, offset, offset + length, seacAnalysisEnabled);\n            break;\n        }\n      }\n\n      if (glyf) {\n        var fontMatrix = (!unitsPerEm ? font.fontMatrix :\n                          [1 / unitsPerEm, 0, 0, 1 / unitsPerEm, 0, 0]);\n        return new TrueTypeCompiled(\n          parseGlyfTable(glyf, loca, indexToLocFormat), cmap, fontMatrix);\n      }\n      return new Type2Compiled(cff, cmap, font.fontMatrix, font.glyphNameMap);\n    },\n  };\n})();\n\nexport {\n  FontRendererFactory,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { isSpace, warn } from '../shared/util';\nimport { getEncoding } from './encodings';\nimport { Stream } from './stream';\n\n// Hinting is currently disabled due to unknown problems on windows\n// in tracemonkey and various other pdfs with type1 fonts.\nvar HINTING_ENABLED = false;\n\n/*\n * CharStrings are encoded following the the CharString Encoding sequence\n * describe in Chapter 6 of the \"Adobe Type1 Font Format\" specification.\n * The value in a byte indicates a command, a number, or subsequent bytes\n * that are to be interpreted in a special way.\n *\n * CharString Number Encoding:\n *  A CharString byte containing the values from 32 through 255 inclusive\n *  indicate an integer. These values are decoded in four ranges.\n *\n * 1. A CharString byte containing a value, v, between 32 and 246 inclusive,\n * indicate the integer v - 139. Thus, the integer values from -107 through\n * 107 inclusive may be encoded in single byte.\n *\n * 2. A CharString byte containing a value, v, between 247 and 250 inclusive,\n * indicates an integer involving the next byte, w, according to the formula:\n * [(v - 247) x 256] + w + 108\n *\n * 3. A CharString byte containing a value, v, between 251 and 254 inclusive,\n * indicates an integer involving the next byte, w, according to the formula:\n * -[(v - 251) * 256] - w - 108\n *\n * 4. A CharString containing the value 255 indicates that the next 4 bytes\n * are a two complement signed integer. The first of these bytes contains the\n * highest order bits, the second byte contains the next higher order bits\n * and the fourth byte contain the lowest order bits.\n *\n *\n * CharString Command Encoding:\n *  CharStrings commands are encoded in 1 or 2 bytes.\n *\n *  Single byte commands are encoded in 1 byte that contains a value between\n *  0 and 31 inclusive.\n *  If a command byte contains the value 12, then the value in the next byte\n *  indicates a command. This \"escape\" mechanism allows many extra commands\n * to be encoded and this encoding technique helps to minimize the length of\n * the charStrings.\n */\nvar Type1CharString = (function Type1CharStringClosure() {\n  var COMMAND_MAP = {\n    'hstem': [1],\n    'vstem': [3],\n    'vmoveto': [4],\n    'rlineto': [5],\n    'hlineto': [6],\n    'vlineto': [7],\n    'rrcurveto': [8],\n    'callsubr': [10],\n    'flex': [12, 35],\n    'drop': [12, 18],\n    'endchar': [14],\n    'rmoveto': [21],\n    'hmoveto': [22],\n    'vhcurveto': [30],\n    'hvcurveto': [31],\n  };\n\n  function Type1CharString() {\n    this.width = 0;\n    this.lsb = 0;\n    this.flexing = false;\n    this.output = [];\n    this.stack = [];\n  }\n\n  Type1CharString.prototype = {\n    convert: function Type1CharString_convert(encoded, subrs,\n                                              seacAnalysisEnabled) {\n      var count = encoded.length;\n      var error = false;\n      var wx, sbx, subrNumber;\n      for (var i = 0; i < count; i++) {\n        var value = encoded[i];\n        if (value < 32) {\n          if (value === 12) {\n            value = (value << 8) + encoded[++i];\n          }\n          switch (value) {\n            case 1: // hstem\n              if (!HINTING_ENABLED) {\n                this.stack = [];\n                break;\n              }\n              error = this.executeCommand(2, COMMAND_MAP.hstem);\n              break;\n            case 3: // vstem\n              if (!HINTING_ENABLED) {\n                this.stack = [];\n                break;\n              }\n              error = this.executeCommand(2, COMMAND_MAP.vstem);\n              break;\n            case 4: // vmoveto\n              if (this.flexing) {\n                if (this.stack.length < 1) {\n                  error = true;\n                  break;\n                }\n                // Add the dx for flex and but also swap the values so they are\n                // the right order.\n                var dy = this.stack.pop();\n                this.stack.push(0, dy);\n                break;\n              }\n              error = this.executeCommand(1, COMMAND_MAP.vmoveto);\n              break;\n            case 5: // rlineto\n              error = this.executeCommand(2, COMMAND_MAP.rlineto);\n              break;\n            case 6: // hlineto\n              error = this.executeCommand(1, COMMAND_MAP.hlineto);\n              break;\n            case 7: // vlineto\n              error = this.executeCommand(1, COMMAND_MAP.vlineto);\n              break;\n            case 8: // rrcurveto\n              error = this.executeCommand(6, COMMAND_MAP.rrcurveto);\n              break;\n            case 9: // closepath\n              // closepath is a Type1 command that does not take argument and is\n              // useless in Type2 and it can simply be ignored.\n              this.stack = [];\n              break;\n            case 10: // callsubr\n              if (this.stack.length < 1) {\n                error = true;\n                break;\n              }\n              subrNumber = this.stack.pop();\n              if (!subrs[subrNumber]) {\n                error = true;\n                break;\n              }\n              error = this.convert(subrs[subrNumber], subrs,\n                                   seacAnalysisEnabled);\n              break;\n            case 11: // return\n              return error;\n            case 13: // hsbw\n              if (this.stack.length < 2) {\n                error = true;\n                break;\n              }\n              // To convert to type2 we have to move the width value to the\n              // first part of the charstring and then use hmoveto with lsb.\n              wx = this.stack.pop();\n              sbx = this.stack.pop();\n              this.lsb = sbx;\n              this.width = wx;\n              this.stack.push(wx, sbx);\n              error = this.executeCommand(2, COMMAND_MAP.hmoveto);\n              break;\n            case 14: // endchar\n              this.output.push(COMMAND_MAP.endchar[0]);\n              break;\n            case 21: // rmoveto\n              if (this.flexing) {\n                break;\n              }\n              error = this.executeCommand(2, COMMAND_MAP.rmoveto);\n              break;\n            case 22: // hmoveto\n              if (this.flexing) {\n                // Add the dy for flex.\n                this.stack.push(0);\n                break;\n              }\n              error = this.executeCommand(1, COMMAND_MAP.hmoveto);\n              break;\n            case 30: // vhcurveto\n              error = this.executeCommand(4, COMMAND_MAP.vhcurveto);\n              break;\n            case 31: // hvcurveto\n              error = this.executeCommand(4, COMMAND_MAP.hvcurveto);\n              break;\n            case (12 << 8) + 0: // dotsection\n              // dotsection is a Type1 command to specify some hinting feature\n              // for dots that do not take a parameter and it can safely be\n              // ignored for Type2.\n              this.stack = [];\n              break;\n            case (12 << 8) + 1: // vstem3\n              if (!HINTING_ENABLED) {\n                this.stack = [];\n                break;\n              }\n              // [vh]stem3 are Type1 only and Type2 supports [vh]stem with\n              // multiple parameters, so instead of returning [vh]stem3 take a\n              // shortcut and return [vhstem] instead.\n              error = this.executeCommand(2, COMMAND_MAP.vstem);\n              break;\n            case (12 << 8) + 2: // hstem3\n              if (!HINTING_ENABLED) {\n                 this.stack = [];\n                break;\n              }\n              // See vstem3.\n              error = this.executeCommand(2, COMMAND_MAP.hstem);\n              break;\n            case (12 << 8) + 6: // seac\n              // seac is like type 2's special endchar but it doesn't use the\n              // first argument asb, so remove it.\n              if (seacAnalysisEnabled) {\n                this.seac = this.stack.splice(-4, 4);\n                error = this.executeCommand(0, COMMAND_MAP.endchar);\n              } else {\n                error = this.executeCommand(4, COMMAND_MAP.endchar);\n              }\n              break;\n            case (12 << 8) + 7: // sbw\n              if (this.stack.length < 4) {\n                error = true;\n                break;\n              }\n              // To convert to type2 we have to move the width value to the\n              // first part of the charstring and then use rmoveto with\n              // (dx, dy). The height argument will not be used for vmtx and\n              // vhea tables reconstruction -- ignoring it.\n              this.stack.pop(); // wy\n              wx = this.stack.pop();\n              var sby = this.stack.pop();\n              sbx = this.stack.pop();\n              this.lsb = sbx;\n              this.width = wx;\n              this.stack.push(wx, sbx, sby);\n              error = this.executeCommand(3, COMMAND_MAP.rmoveto);\n              break;\n            case (12 << 8) + 12: // div\n              if (this.stack.length < 2) {\n                error = true;\n                break;\n              }\n              var num2 = this.stack.pop();\n              var num1 = this.stack.pop();\n              this.stack.push(num1 / num2);\n              break;\n            case (12 << 8) + 16: // callothersubr\n              if (this.stack.length < 2) {\n                error = true;\n                break;\n              }\n              subrNumber = this.stack.pop();\n              var numArgs = this.stack.pop();\n              if (subrNumber === 0 && numArgs === 3) {\n                var flexArgs = this.stack.splice(this.stack.length - 17, 17);\n                this.stack.push(\n                  flexArgs[2] + flexArgs[0], // bcp1x + rpx\n                  flexArgs[3] + flexArgs[1], // bcp1y + rpy\n                  flexArgs[4], // bcp2x\n                  flexArgs[5], // bcp2y\n                  flexArgs[6], // p2x\n                  flexArgs[7], // p2y\n                  flexArgs[8], // bcp3x\n                  flexArgs[9], // bcp3y\n                  flexArgs[10], // bcp4x\n                  flexArgs[11], // bcp4y\n                  flexArgs[12], // p3x\n                  flexArgs[13], // p3y\n                  flexArgs[14] // flexDepth\n                  // 15 = finalx unused by flex\n                  // 16 = finaly unused by flex\n                );\n                error = this.executeCommand(13, COMMAND_MAP.flex, true);\n                this.flexing = false;\n                this.stack.push(flexArgs[15], flexArgs[16]);\n              } else if (subrNumber === 1 && numArgs === 0) {\n                this.flexing = true;\n              }\n              break;\n            case (12 << 8) + 17: // pop\n              // Ignore this since it is only used with othersubr.\n              break;\n            case (12 << 8) + 33: // setcurrentpoint\n              // Ignore for now.\n              this.stack = [];\n              break;\n            default:\n              warn('Unknown type 1 charstring command of \"' + value + '\"');\n              break;\n          }\n          if (error) {\n            break;\n          }\n          continue;\n        } else if (value <= 246) {\n          value = value - 139;\n        } else if (value <= 250) {\n          value = ((value - 247) * 256) + encoded[++i] + 108;\n        } else if (value <= 254) {\n          value = -((value - 251) * 256) - encoded[++i] - 108;\n        } else {\n          value = (encoded[++i] & 0xff) << 24 | (encoded[++i] & 0xff) << 16 |\n                  (encoded[++i] & 0xff) << 8 | (encoded[++i] & 0xff) << 0;\n        }\n        this.stack.push(value);\n      }\n      return error;\n    },\n\n    executeCommand(howManyArgs, command, keepStack) {\n      var stackLength = this.stack.length;\n      if (howManyArgs > stackLength) {\n        return true;\n      }\n      var start = stackLength - howManyArgs;\n      for (var i = start; i < stackLength; i++) {\n        var value = this.stack[i];\n        if (Number.isInteger(value)) {\n          this.output.push(28, (value >> 8) & 0xff, value & 0xff);\n        } else { // fixed point\n          value = (65536 * value) | 0;\n          this.output.push(255,\n                           (value >> 24) & 0xFF,\n                           (value >> 16) & 0xFF,\n                           (value >> 8) & 0xFF,\n                           value & 0xFF);\n        }\n      }\n      this.output.push.apply(this.output, command);\n      if (keepStack) {\n        this.stack.splice(start, howManyArgs);\n      } else {\n        this.stack.length = 0;\n      }\n      return false;\n    },\n  };\n\n  return Type1CharString;\n})();\n\n/*\n * Type1Parser encapsulate the needed code for parsing a Type1 font\n * program. Some of its logic depends on the Type2 charstrings\n * structure.\n * Note: this doesn't really parse the font since that would require evaluation\n * of PostScript, but it is possible in most cases to extract what we need\n * without a full parse.\n */\nvar Type1Parser = (function Type1ParserClosure() {\n  /*\n   * Decrypt a Sequence of Ciphertext Bytes to Produce the Original Sequence\n   * of Plaintext Bytes. The function took a key as a parameter which can be\n   * for decrypting the eexec block of for decoding charStrings.\n   */\n  var EEXEC_ENCRYPT_KEY = 55665;\n  var CHAR_STRS_ENCRYPT_KEY = 4330;\n\n  function isHexDigit(code) {\n    return code >= 48 && code <= 57 || // '0'-'9'\n           code >= 65 && code <= 70 || // 'A'-'F'\n           code >= 97 && code <= 102;  // 'a'-'f'\n  }\n\n  function decrypt(data, key, discardNumber) {\n    if (discardNumber >= data.length) {\n      return new Uint8Array(0);\n    }\n    var r = key | 0, c1 = 52845, c2 = 22719, i, j;\n    for (i = 0; i < discardNumber; i++) {\n      r = ((data[i] + r) * c1 + c2) & ((1 << 16) - 1);\n    }\n    var count = data.length - discardNumber;\n    var decrypted = new Uint8Array(count);\n    for (i = discardNumber, j = 0; j < count; i++, j++) {\n      var value = data[i];\n      decrypted[j] = value ^ (r >> 8);\n      r = ((value + r) * c1 + c2) & ((1 << 16) - 1);\n    }\n    return decrypted;\n  }\n\n  function decryptAscii(data, key, discardNumber) {\n    var r = key | 0, c1 = 52845, c2 = 22719;\n    var count = data.length, maybeLength = count >>> 1;\n    var decrypted = new Uint8Array(maybeLength);\n    var i, j;\n    for (i = 0, j = 0; i < count; i++) {\n      var digit1 = data[i];\n      if (!isHexDigit(digit1)) {\n        continue;\n      }\n      i++;\n      var digit2;\n      while (i < count && !isHexDigit(digit2 = data[i])) {\n        i++;\n      }\n      if (i < count) {\n        var value = parseInt(String.fromCharCode(digit1, digit2), 16);\n        decrypted[j++] = value ^ (r >> 8);\n        r = ((value + r) * c1 + c2) & ((1 << 16) - 1);\n      }\n    }\n    return Array.prototype.slice.call(decrypted, discardNumber, j);\n  }\n\n  function isSpecial(c) {\n    return c === 0x2F || // '/'\n           c === 0x5B || c === 0x5D || // '[', ']'\n           c === 0x7B || c === 0x7D || // '{', '}'\n           c === 0x28 || c === 0x29; // '(', ')'\n  }\n\n  function Type1Parser(stream, encrypted, seacAnalysisEnabled) {\n    if (encrypted) {\n      var data = stream.getBytes();\n      var isBinary = !(isHexDigit(data[0]) && isHexDigit(data[1]) &&\n                       isHexDigit(data[2]) && isHexDigit(data[3]));\n      stream = new Stream(isBinary ? decrypt(data, EEXEC_ENCRYPT_KEY, 4) :\n                          decryptAscii(data, EEXEC_ENCRYPT_KEY, 4));\n    }\n    this.seacAnalysisEnabled = !!seacAnalysisEnabled;\n\n    this.stream = stream;\n    this.nextChar();\n  }\n\n  Type1Parser.prototype = {\n    readNumberArray: function Type1Parser_readNumberArray() {\n      this.getToken(); // read '[' or '{' (arrays can start with either)\n      var array = [];\n      while (true) {\n        var token = this.getToken();\n        if (token === null || token === ']' || token === '}') {\n          break;\n        }\n        array.push(parseFloat(token || 0));\n      }\n      return array;\n    },\n\n    readNumber: function Type1Parser_readNumber() {\n      var token = this.getToken();\n      return parseFloat(token || 0);\n    },\n\n    readInt: function Type1Parser_readInt() {\n      // Use '| 0' to prevent setting a double into length such as the double\n      // does not flow into the loop variable.\n      var token = this.getToken();\n      return parseInt(token || 0, 10) | 0;\n    },\n\n    readBoolean: function Type1Parser_readBoolean() {\n      var token = this.getToken();\n\n      // Use 1 and 0 since that's what type2 charstrings use.\n      return token === 'true' ? 1 : 0;\n    },\n\n    nextChar: function Type1_nextChar() {\n      return (this.currentChar = this.stream.getByte());\n    },\n\n    getToken: function Type1Parser_getToken() {\n      // Eat whitespace and comments.\n      var comment = false;\n      var ch = this.currentChar;\n      while (true) {\n        if (ch === -1) {\n          return null;\n        }\n\n        if (comment) {\n          if (ch === 0x0A || ch === 0x0D) {\n            comment = false;\n          }\n        } else if (ch === 0x25) { // '%'\n          comment = true;\n        } else if (!isSpace(ch)) {\n          break;\n        }\n        ch = this.nextChar();\n      }\n      if (isSpecial(ch)) {\n        this.nextChar();\n        return String.fromCharCode(ch);\n      }\n      var token = '';\n      do {\n        token += String.fromCharCode(ch);\n        ch = this.nextChar();\n      } while (ch >= 0 && !isSpace(ch) && !isSpecial(ch));\n      return token;\n    },\n\n    readCharStrings: function Type1Parser_readCharStrings(bytes, lenIV) {\n      if (lenIV === -1) {\n        // This isn't in the spec, but Adobe's tx program handles -1\n        // as plain text.\n        return bytes;\n      }\n      return decrypt(bytes, CHAR_STRS_ENCRYPT_KEY, lenIV);\n    },\n\n    /*\n     * Returns an object containing a Subrs array and a CharStrings\n     * array extracted from and eexec encrypted block of data\n     */\n    extractFontProgram: function Type1Parser_extractFontProgram() {\n      var stream = this.stream;\n\n      var subrs = [], charstrings = [];\n      var privateData = Object.create(null);\n      privateData['lenIV'] = 4;\n      var program = {\n        subrs: [],\n        charstrings: [],\n        properties: {\n          'privateData': privateData,\n        },\n      };\n      var token, length, data, lenIV, encoded;\n      while ((token = this.getToken()) !== null) {\n        if (token !== '/') {\n          continue;\n        }\n        token = this.getToken();\n        switch (token) {\n          case 'CharStrings':\n            // The number immediately following CharStrings must be greater or\n            // equal to the number of CharStrings.\n            this.getToken();\n            this.getToken(); // read in 'dict'\n            this.getToken(); // read in 'dup'\n            this.getToken(); // read in 'begin'\n            while (true) {\n              token = this.getToken();\n              if (token === null || token === 'end') {\n                break;\n              }\n\n              if (token !== '/') {\n                continue;\n              }\n              var glyph = this.getToken();\n              length = this.readInt();\n              this.getToken(); // read in 'RD' or '-|'\n              data = (length > 0 ? stream.getBytes(length) : new Uint8Array(0));\n              lenIV = program.properties.privateData['lenIV'];\n              encoded = this.readCharStrings(data, lenIV);\n              this.nextChar();\n              token = this.getToken(); // read in 'ND' or '|-'\n              if (token === 'noaccess') {\n                this.getToken(); // read in 'def'\n              }\n              charstrings.push({\n                glyph,\n                encoded,\n              });\n            }\n            break;\n          case 'Subrs':\n            this.readInt(); // num\n            this.getToken(); // read in 'array'\n            while (this.getToken() === 'dup') {\n              var index = this.readInt();\n              length = this.readInt();\n              this.getToken(); // read in 'RD' or '-|'\n              data = (length > 0 ? stream.getBytes(length) : new Uint8Array(0));\n              lenIV = program.properties.privateData['lenIV'];\n              encoded = this.readCharStrings(data, lenIV);\n              this.nextChar();\n              token = this.getToken(); // read in 'NP' or '|'\n              if (token === 'noaccess') {\n                this.getToken(); // read in 'put'\n              }\n              subrs[index] = encoded;\n            }\n            break;\n          case 'BlueValues':\n          case 'OtherBlues':\n          case 'FamilyBlues':\n          case 'FamilyOtherBlues':\n            var blueArray = this.readNumberArray();\n            // *Blue* values may contain invalid data: disables reading of\n            // those values when hinting is disabled.\n            if (blueArray.length > 0 && (blueArray.length % 2) === 0 &&\n                HINTING_ENABLED) {\n              program.properties.privateData[token] = blueArray;\n            }\n            break;\n          case 'StemSnapH':\n          case 'StemSnapV':\n            program.properties.privateData[token] = this.readNumberArray();\n            break;\n          case 'StdHW':\n          case 'StdVW':\n            program.properties.privateData[token] =\n              this.readNumberArray()[0];\n            break;\n          case 'BlueShift':\n          case 'lenIV':\n          case 'BlueFuzz':\n          case 'BlueScale':\n          case 'LanguageGroup':\n          case 'ExpansionFactor':\n            program.properties.privateData[token] = this.readNumber();\n            break;\n          case 'ForceBold':\n            program.properties.privateData[token] = this.readBoolean();\n            break;\n        }\n      }\n\n      for (var i = 0; i < charstrings.length; i++) {\n        glyph = charstrings[i].glyph;\n        encoded = charstrings[i].encoded;\n        var charString = new Type1CharString();\n        var error = charString.convert(encoded, subrs,\n                                       this.seacAnalysisEnabled);\n        var output = charString.output;\n        if (error) {\n          // It seems when FreeType encounters an error while evaluating a glyph\n          // that it completely ignores the glyph so we'll mimic that behaviour\n          // here and put an endchar to make the validator happy.\n          output = [14];\n        }\n        program.charstrings.push({\n          glyphName: glyph,\n          charstring: output,\n          width: charString.width,\n          lsb: charString.lsb,\n          seac: charString.seac,\n        });\n      }\n\n      return program;\n    },\n\n    extractFontHeader: function Type1Parser_extractFontHeader(properties) {\n      var token;\n      while ((token = this.getToken()) !== null) {\n        if (token !== '/') {\n          continue;\n        }\n        token = this.getToken();\n        switch (token) {\n          case 'FontMatrix':\n            var matrix = this.readNumberArray();\n            properties.fontMatrix = matrix;\n            break;\n          case 'Encoding':\n            var encodingArg = this.getToken();\n            var encoding;\n            if (!/^\\d+$/.test(encodingArg)) {\n              // encoding name is specified\n              encoding = getEncoding(encodingArg);\n            } else {\n              encoding = [];\n              var size = parseInt(encodingArg, 10) | 0;\n              this.getToken(); // read in 'array'\n\n              for (var j = 0; j < size; j++) {\n                token = this.getToken();\n                // skipping till first dup or def (e.g. ignoring for statement)\n                while (token !== 'dup' && token !== 'def') {\n                  token = this.getToken();\n                  if (token === null) {\n                    return; // invalid header\n                  }\n                }\n                if (token === 'def') {\n                  break; // read all array data\n                }\n                var index = this.readInt();\n                this.getToken(); // read in '/'\n                var glyph = this.getToken();\n                encoding[index] = glyph;\n                this.getToken(); // read the in 'put'\n              }\n            }\n            properties.builtInEncoding = encoding;\n            break;\n          case 'FontBBox':\n            var fontBBox = this.readNumberArray();\n            // adjusting ascent/descent\n            properties.ascent = Math.max(fontBBox[3], fontBBox[1]);\n            properties.descent = Math.min(fontBBox[1], fontBBox[3]);\n            properties.ascentScaled = true;\n            break;\n        }\n      }\n    },\n  };\n\n  return Type1Parser;\n})();\n\nexport {\n  Type1Parser,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* eslint-disable no-multi-spaces */\n\nimport {\n  assert, FormatError, info, MissingDataException, unreachable,\n  UNSUPPORTED_FEATURES, Util, warn\n} from '../shared/util';\nimport { ColorSpace } from './colorspace';\nimport { isStream } from './primitives';\n\nvar ShadingType = {\n  FUNCTION_BASED: 1,\n  AXIAL: 2,\n  RADIAL: 3,\n  FREE_FORM_MESH: 4,\n  LATTICE_FORM_MESH: 5,\n  COONS_PATCH_MESH: 6,\n  TENSOR_PATCH_MESH: 7,\n};\n\nvar Pattern = (function PatternClosure() {\n  // Constructor should define this.getPattern\n  function Pattern() {\n    unreachable('should not call Pattern constructor');\n  }\n\n  Pattern.prototype = {\n    // Input: current Canvas context\n    // Output: the appropriate fillStyle or strokeStyle\n    getPattern: function Pattern_getPattern(ctx) {\n      unreachable(`Should not call Pattern.getStyle: ${ctx}`);\n    },\n  };\n\n  Pattern.parseShading = function(shading, matrix, xref, res, handler,\n                                  pdfFunctionFactory) {\n    var dict = isStream(shading) ? shading.dict : shading;\n    var type = dict.get('ShadingType');\n\n    try {\n      switch (type) {\n        case ShadingType.AXIAL:\n        case ShadingType.RADIAL:\n          // Both radial and axial shadings are handled by RadialAxial shading.\n          return new Shadings.RadialAxial(dict, matrix, xref, res,\n                                          pdfFunctionFactory);\n        case ShadingType.FREE_FORM_MESH:\n        case ShadingType.LATTICE_FORM_MESH:\n        case ShadingType.COONS_PATCH_MESH:\n        case ShadingType.TENSOR_PATCH_MESH:\n          return new Shadings.Mesh(shading, matrix, xref, res,\n                                   pdfFunctionFactory);\n        default:\n          throw new FormatError('Unsupported ShadingType: ' + type);\n      }\n    } catch (ex) {\n      if (ex instanceof MissingDataException) {\n        throw ex;\n      }\n      handler.send('UnsupportedFeature',\n                   { featureId: UNSUPPORTED_FEATURES.shadingPattern, });\n      warn(ex);\n      return new Shadings.Dummy();\n    }\n  };\n  return Pattern;\n})();\n\nvar Shadings = {};\n\n// A small number to offset the first/last color stops so we can insert ones to\n// support extend. Number.MIN_VALUE is too small and breaks the extend.\nShadings.SMALL_NUMBER = 1e-6;\n\n// Radial and axial shading have very similar implementations\n// If needed, the implementations can be broken into two classes\nShadings.RadialAxial = (function RadialAxialClosure() {\n  function RadialAxial(dict, matrix, xref, res, pdfFunctionFactory) {\n    this.matrix = matrix;\n    this.coordsArr = dict.getArray('Coords');\n    this.shadingType = dict.get('ShadingType');\n    this.type = 'Pattern';\n    var cs = dict.get('ColorSpace', 'CS');\n    cs = ColorSpace.parse(cs, xref, res, pdfFunctionFactory);\n    this.cs = cs;\n\n    var t0 = 0.0, t1 = 1.0;\n    if (dict.has('Domain')) {\n      var domainArr = dict.getArray('Domain');\n      t0 = domainArr[0];\n      t1 = domainArr[1];\n    }\n\n    var extendStart = false, extendEnd = false;\n    if (dict.has('Extend')) {\n      var extendArr = dict.getArray('Extend');\n      extendStart = extendArr[0];\n      extendEnd = extendArr[1];\n    }\n\n    if (this.shadingType === ShadingType.RADIAL &&\n       (!extendStart || !extendEnd)) {\n      // Radial gradient only currently works if either circle is fully within\n      // the other circle.\n      var x1 = this.coordsArr[0];\n      var y1 = this.coordsArr[1];\n      var r1 = this.coordsArr[2];\n      var x2 = this.coordsArr[3];\n      var y2 = this.coordsArr[4];\n      var r2 = this.coordsArr[5];\n      var distance = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));\n      if (r1 <= r2 + distance &&\n          r2 <= r1 + distance) {\n        warn('Unsupported radial gradient.');\n      }\n    }\n\n    this.extendStart = extendStart;\n    this.extendEnd = extendEnd;\n\n    var fnObj = dict.get('Function');\n    var fn = pdfFunctionFactory.createFromArray(fnObj);\n\n    // 10 samples seems good enough for now, but probably won't work\n    // if there are sharp color changes. Ideally, we would implement\n    // the spec faithfully and add lossless optimizations.\n    var diff = t1 - t0;\n    var step = diff / 10;\n\n    var colorStops = this.colorStops = [];\n\n    // Protect against bad domains so we don't end up in an infinite loop below.\n    if (t0 >= t1 || step <= 0) {\n      // Acrobat doesn't seem to handle these cases so we'll ignore for\n      // now.\n      info('Bad shading domain.');\n      return;\n    }\n\n    var color = new Float32Array(cs.numComps), ratio = new Float32Array(1);\n    var rgbColor;\n    for (var i = t0; i <= t1; i += step) {\n      ratio[0] = i;\n      fn(ratio, 0, color, 0);\n      rgbColor = cs.getRgb(color, 0);\n      var cssColor = Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]);\n      colorStops.push([(i - t0) / diff, cssColor]);\n    }\n\n    var background = 'transparent';\n    if (dict.has('Background')) {\n      rgbColor = cs.getRgb(dict.get('Background'), 0);\n      background = Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]);\n    }\n\n    if (!extendStart) {\n      // Insert a color stop at the front and offset the first real color stop\n      // so it doesn't conflict with the one we insert.\n      colorStops.unshift([0, background]);\n      colorStops[1][0] += Shadings.SMALL_NUMBER;\n    }\n    if (!extendEnd) {\n      // Same idea as above in extendStart but for the end.\n      colorStops[colorStops.length - 1][0] -= Shadings.SMALL_NUMBER;\n      colorStops.push([1, background]);\n    }\n\n    this.colorStops = colorStops;\n  }\n\n  RadialAxial.prototype = {\n    getIR: function RadialAxial_getIR() {\n      var coordsArr = this.coordsArr;\n      var shadingType = this.shadingType;\n      var type, p0, p1, r0, r1;\n      if (shadingType === ShadingType.AXIAL) {\n        p0 = [coordsArr[0], coordsArr[1]];\n        p1 = [coordsArr[2], coordsArr[3]];\n        r0 = null;\n        r1 = null;\n        type = 'axial';\n      } else if (shadingType === ShadingType.RADIAL) {\n        p0 = [coordsArr[0], coordsArr[1]];\n        p1 = [coordsArr[3], coordsArr[4]];\n        r0 = coordsArr[2];\n        r1 = coordsArr[5];\n        type = 'radial';\n      } else {\n        unreachable(`getPattern type unknown: ${shadingType}`);\n      }\n\n      var matrix = this.matrix;\n      if (matrix) {\n        p0 = Util.applyTransform(p0, matrix);\n        p1 = Util.applyTransform(p1, matrix);\n        if (shadingType === ShadingType.RADIAL) {\n          var scale = Util.singularValueDecompose2dScale(matrix);\n          r0 *= scale[0];\n          r1 *= scale[1];\n        }\n      }\n\n      return ['RadialAxial', type, this.colorStops, p0, p1, r0, r1];\n    },\n  };\n\n  return RadialAxial;\n})();\n\n// All mesh shading. For now, they will be presented as set of the triangles\n// to be drawn on the canvas and rgb color for each vertex.\nShadings.Mesh = (function MeshClosure() {\n  function MeshStreamReader(stream, context) {\n    this.stream = stream;\n    this.context = context;\n    this.buffer = 0;\n    this.bufferLength = 0;\n\n    var numComps = context.numComps;\n    this.tmpCompsBuf = new Float32Array(numComps);\n    var csNumComps = context.colorSpace.numComps;\n    this.tmpCsCompsBuf = context.colorFn ? new Float32Array(csNumComps) :\n                                           this.tmpCompsBuf;\n  }\n  MeshStreamReader.prototype = {\n    get hasData() {\n      if (this.stream.end) {\n        return this.stream.pos < this.stream.end;\n      }\n      if (this.bufferLength > 0) {\n        return true;\n      }\n      var nextByte = this.stream.getByte();\n      if (nextByte < 0) {\n        return false;\n      }\n      this.buffer = nextByte;\n      this.bufferLength = 8;\n      return true;\n    },\n    readBits: function MeshStreamReader_readBits(n) {\n      var buffer = this.buffer;\n      var bufferLength = this.bufferLength;\n      if (n === 32) {\n        if (bufferLength === 0) {\n          return ((this.stream.getByte() << 24) |\n            (this.stream.getByte() << 16) | (this.stream.getByte() << 8) |\n            this.stream.getByte()) >>> 0;\n        }\n        buffer = (buffer << 24) | (this.stream.getByte() << 16) |\n          (this.stream.getByte() << 8) | this.stream.getByte();\n        var nextByte = this.stream.getByte();\n        this.buffer = nextByte & ((1 << bufferLength) - 1);\n        return ((buffer << (8 - bufferLength)) |\n          ((nextByte & 0xFF) >> bufferLength)) >>> 0;\n      }\n      if (n === 8 && bufferLength === 0) {\n        return this.stream.getByte();\n      }\n      while (bufferLength < n) {\n        buffer = (buffer << 8) | this.stream.getByte();\n        bufferLength += 8;\n      }\n      bufferLength -= n;\n      this.bufferLength = bufferLength;\n      this.buffer = buffer & ((1 << bufferLength) - 1);\n      return buffer >> bufferLength;\n    },\n    align: function MeshStreamReader_align() {\n      this.buffer = 0;\n      this.bufferLength = 0;\n    },\n    readFlag: function MeshStreamReader_readFlag() {\n      return this.readBits(this.context.bitsPerFlag);\n    },\n    readCoordinate: function MeshStreamReader_readCoordinate() {\n      var bitsPerCoordinate = this.context.bitsPerCoordinate;\n      var xi = this.readBits(bitsPerCoordinate);\n      var yi = this.readBits(bitsPerCoordinate);\n      var decode = this.context.decode;\n      var scale = bitsPerCoordinate < 32 ? 1 / ((1 << bitsPerCoordinate) - 1) :\n        2.3283064365386963e-10; // 2 ^ -32\n      return [\n        xi * scale * (decode[1] - decode[0]) + decode[0],\n        yi * scale * (decode[3] - decode[2]) + decode[2]\n      ];\n    },\n    readComponents: function MeshStreamReader_readComponents() {\n      var numComps = this.context.numComps;\n      var bitsPerComponent = this.context.bitsPerComponent;\n      var scale = bitsPerComponent < 32 ? 1 / ((1 << bitsPerComponent) - 1) :\n        2.3283064365386963e-10; // 2 ^ -32\n      var decode = this.context.decode;\n      var components = this.tmpCompsBuf;\n      for (var i = 0, j = 4; i < numComps; i++, j += 2) {\n        var ci = this.readBits(bitsPerComponent);\n        components[i] = ci * scale * (decode[j + 1] - decode[j]) + decode[j];\n      }\n      var color = this.tmpCsCompsBuf;\n      if (this.context.colorFn) {\n        this.context.colorFn(components, 0, color, 0);\n      }\n      return this.context.colorSpace.getRgb(color, 0);\n    },\n  };\n\n  function decodeType4Shading(mesh, reader) {\n    var coords = mesh.coords;\n    var colors = mesh.colors;\n    var operators = [];\n    var ps = []; // not maintaining cs since that will match ps\n    var verticesLeft = 0; // assuming we have all data to start a new triangle\n    while (reader.hasData) {\n      var f = reader.readFlag();\n      var coord = reader.readCoordinate();\n      var color = reader.readComponents();\n      if (verticesLeft === 0) { // ignoring flags if we started a triangle\n        if (!(0 <= f && f <= 2)) {\n          throw new FormatError('Unknown type4 flag');\n        }\n        switch (f) {\n          case 0:\n            verticesLeft = 3;\n            break;\n          case 1:\n            ps.push(ps[ps.length - 2], ps[ps.length - 1]);\n            verticesLeft = 1;\n            break;\n          case 2:\n            ps.push(ps[ps.length - 3], ps[ps.length - 1]);\n            verticesLeft = 1;\n            break;\n        }\n        operators.push(f);\n      }\n      ps.push(coords.length);\n      coords.push(coord);\n      colors.push(color);\n      verticesLeft--;\n\n      reader.align();\n    }\n    mesh.figures.push({\n      type: 'triangles',\n      coords: new Int32Array(ps),\n      colors: new Int32Array(ps),\n    });\n  }\n\n  function decodeType5Shading(mesh, reader, verticesPerRow) {\n    var coords = mesh.coords;\n    var colors = mesh.colors;\n    var ps = []; // not maintaining cs since that will match ps\n    while (reader.hasData) {\n      var coord = reader.readCoordinate();\n      var color = reader.readComponents();\n      ps.push(coords.length);\n      coords.push(coord);\n      colors.push(color);\n    }\n    mesh.figures.push({\n      type: 'lattice',\n      coords: new Int32Array(ps),\n      colors: new Int32Array(ps),\n      verticesPerRow,\n    });\n  }\n\n  var MIN_SPLIT_PATCH_CHUNKS_AMOUNT = 3;\n  var MAX_SPLIT_PATCH_CHUNKS_AMOUNT = 20;\n\n  var TRIANGLE_DENSITY = 20; // count of triangles per entire mesh bounds\n\n  var getB = (function getBClosure() {\n    function buildB(count) {\n      var lut = [];\n      for (var i = 0; i <= count; i++) {\n        var t = i / count, t_ = 1 - t;\n        lut.push(new Float32Array([t_ * t_ * t_, 3 * t * t_ * t_,\n          3 * t * t * t_, t * t * t]));\n      }\n      return lut;\n    }\n    var cache = [];\n    return function getB(count) {\n      if (!cache[count]) {\n        cache[count] = buildB(count);\n      }\n      return cache[count];\n    };\n  })();\n\n  function buildFigureFromPatch(mesh, index) {\n    var figure = mesh.figures[index];\n    assert(figure.type === 'patch', 'Unexpected patch mesh figure');\n\n    var coords = mesh.coords, colors = mesh.colors;\n    var pi = figure.coords;\n    var ci = figure.colors;\n\n    var figureMinX = Math.min(coords[pi[0]][0], coords[pi[3]][0],\n                              coords[pi[12]][0], coords[pi[15]][0]);\n    var figureMinY = Math.min(coords[pi[0]][1], coords[pi[3]][1],\n                              coords[pi[12]][1], coords[pi[15]][1]);\n    var figureMaxX = Math.max(coords[pi[0]][0], coords[pi[3]][0],\n                              coords[pi[12]][0], coords[pi[15]][0]);\n    var figureMaxY = Math.max(coords[pi[0]][1], coords[pi[3]][1],\n                              coords[pi[12]][1], coords[pi[15]][1]);\n    var splitXBy = Math.ceil((figureMaxX - figureMinX) * TRIANGLE_DENSITY /\n                             (mesh.bounds[2] - mesh.bounds[0]));\n    splitXBy = Math.max(MIN_SPLIT_PATCH_CHUNKS_AMOUNT,\n               Math.min(MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitXBy));\n    var splitYBy = Math.ceil((figureMaxY - figureMinY) * TRIANGLE_DENSITY /\n                             (mesh.bounds[3] - mesh.bounds[1]));\n    splitYBy = Math.max(MIN_SPLIT_PATCH_CHUNKS_AMOUNT,\n               Math.min(MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitYBy));\n\n    var verticesPerRow = splitXBy + 1;\n    var figureCoords = new Int32Array((splitYBy + 1) * verticesPerRow);\n    var figureColors = new Int32Array((splitYBy + 1) * verticesPerRow);\n    var k = 0;\n    var cl = new Uint8Array(3), cr = new Uint8Array(3);\n    var c0 = colors[ci[0]], c1 = colors[ci[1]],\n      c2 = colors[ci[2]], c3 = colors[ci[3]];\n    var bRow = getB(splitYBy), bCol = getB(splitXBy);\n    for (var row = 0; row <= splitYBy; row++) {\n      cl[0] = ((c0[0] * (splitYBy - row) + c2[0] * row) / splitYBy) | 0;\n      cl[1] = ((c0[1] * (splitYBy - row) + c2[1] * row) / splitYBy) | 0;\n      cl[2] = ((c0[2] * (splitYBy - row) + c2[2] * row) / splitYBy) | 0;\n\n      cr[0] = ((c1[0] * (splitYBy - row) + c3[0] * row) / splitYBy) | 0;\n      cr[1] = ((c1[1] * (splitYBy - row) + c3[1] * row) / splitYBy) | 0;\n      cr[2] = ((c1[2] * (splitYBy - row) + c3[2] * row) / splitYBy) | 0;\n\n      for (var col = 0; col <= splitXBy; col++, k++) {\n        if ((row === 0 || row === splitYBy) &&\n            (col === 0 || col === splitXBy)) {\n          continue;\n        }\n        var x = 0, y = 0;\n        var q = 0;\n        for (var i = 0; i <= 3; i++) {\n          for (var j = 0; j <= 3; j++, q++) {\n            var m = bRow[row][i] * bCol[col][j];\n            x += coords[pi[q]][0] * m;\n            y += coords[pi[q]][1] * m;\n          }\n        }\n        figureCoords[k] = coords.length;\n        coords.push([x, y]);\n        figureColors[k] = colors.length;\n        var newColor = new Uint8Array(3);\n        newColor[0] = ((cl[0] * (splitXBy - col) + cr[0] * col) / splitXBy) | 0;\n        newColor[1] = ((cl[1] * (splitXBy - col) + cr[1] * col) / splitXBy) | 0;\n        newColor[2] = ((cl[2] * (splitXBy - col) + cr[2] * col) / splitXBy) | 0;\n        colors.push(newColor);\n      }\n    }\n    figureCoords[0] = pi[0];\n    figureColors[0] = ci[0];\n    figureCoords[splitXBy] = pi[3];\n    figureColors[splitXBy] = ci[1];\n    figureCoords[verticesPerRow * splitYBy] = pi[12];\n    figureColors[verticesPerRow * splitYBy] = ci[2];\n    figureCoords[verticesPerRow * splitYBy + splitXBy] = pi[15];\n    figureColors[verticesPerRow * splitYBy + splitXBy] = ci[3];\n\n    mesh.figures[index] = {\n      type: 'lattice',\n      coords: figureCoords,\n      colors: figureColors,\n      verticesPerRow,\n    };\n  }\n\n  function decodeType6Shading(mesh, reader) {\n    // A special case of Type 7. The p11, p12, p21, p22 automatically filled\n    var coords = mesh.coords;\n    var colors = mesh.colors;\n    var ps = new Int32Array(16); // p00, p10, ..., p30, p01, ..., p33\n    var cs = new Int32Array(4); // c00, c30, c03, c33\n    while (reader.hasData) {\n      var f = reader.readFlag();\n      if (!(0 <= f && f <= 3)) {\n        throw new FormatError('Unknown type6 flag');\n      }\n      var i, ii;\n      var pi = coords.length;\n      for (i = 0, ii = (f !== 0 ? 8 : 12); i < ii; i++) {\n        coords.push(reader.readCoordinate());\n      }\n      var ci = colors.length;\n      for (i = 0, ii = (f !== 0 ? 2 : 4); i < ii; i++) {\n        colors.push(reader.readComponents());\n      }\n      var tmp1, tmp2, tmp3, tmp4;\n      switch (f) {\n        case 0:\n          ps[12] = pi + 3; ps[13] = pi + 4;  ps[14] = pi + 5;  ps[15] = pi + 6;\n          ps[ 8] = pi + 2; /* values for 5, 6, 9, 10 are    */ ps[11] = pi + 7;\n          ps[ 4] = pi + 1; /* calculated below              */ ps[ 7] = pi + 8;\n          ps[ 0] = pi;     ps[ 1] = pi + 11; ps[ 2] = pi + 10; ps[ 3] = pi + 9;\n          cs[2] = ci + 1; cs[3] = ci + 2;\n          cs[0] = ci;     cs[1] = ci + 3;\n          break;\n        case 1:\n          tmp1 = ps[12]; tmp2 = ps[13]; tmp3 = ps[14]; tmp4 = ps[15];\n          ps[12] = tmp4; ps[13] = pi + 0;  ps[14] = pi + 1;  ps[15] = pi + 2;\n          ps[ 8] = tmp3; /* values for 5, 6, 9, 10 are    */ ps[11] = pi + 3;\n          ps[ 4] = tmp2; /* calculated below              */ ps[ 7] = pi + 4;\n          ps[ 0] = tmp1; ps[ 1] = pi + 7;   ps[ 2] = pi + 6; ps[ 3] = pi + 5;\n          tmp1 = cs[2]; tmp2 = cs[3];\n          cs[2] = tmp2;   cs[3] = ci;\n          cs[0] = tmp1;   cs[1] = ci + 1;\n          break;\n        case 2:\n          tmp1 = ps[15];\n          tmp2 = ps[11];\n          ps[12] = ps[3];  ps[13] = pi + 0; ps[14] = pi + 1;   ps[15] = pi + 2;\n          ps[ 8] = ps[7];  /* values for 5, 6, 9, 10 are    */ ps[11] = pi + 3;\n          ps[ 4] = tmp2;   /* calculated below              */ ps[ 7] = pi + 4;\n          ps[ 0] = tmp1;  ps[ 1] = pi + 7;   ps[ 2] = pi + 6;  ps[ 3] = pi + 5;\n          tmp1 = cs[3];\n          cs[2] = cs[1]; cs[3] = ci;\n          cs[0] = tmp1;  cs[1] = ci + 1;\n          break;\n        case 3:\n          ps[12] = ps[0];  ps[13] = pi + 0;   ps[14] = pi + 1; ps[15] = pi + 2;\n          ps[ 8] = ps[1];  /* values for 5, 6, 9, 10 are    */ ps[11] = pi + 3;\n          ps[ 4] = ps[2];  /* calculated below              */ ps[ 7] = pi + 4;\n          ps[ 0] = ps[3];  ps[ 1] = pi + 7;   ps[ 2] = pi + 6; ps[ 3] = pi + 5;\n          cs[2] = cs[0]; cs[3] = ci;\n          cs[0] = cs[1]; cs[1] = ci + 1;\n          break;\n      }\n      // set p11, p12, p21, p22\n      ps[5] = coords.length;\n      coords.push([\n        (-4 * coords[ps[0]][0] - coords[ps[15]][0] +\n          6 * (coords[ps[4]][0] + coords[ps[1]][0]) -\n          2 * (coords[ps[12]][0] + coords[ps[3]][0]) +\n          3 * (coords[ps[13]][0] + coords[ps[7]][0])) / 9,\n        (-4 * coords[ps[0]][1] - coords[ps[15]][1] +\n          6 * (coords[ps[4]][1] + coords[ps[1]][1]) -\n          2 * (coords[ps[12]][1] + coords[ps[3]][1]) +\n          3 * (coords[ps[13]][1] + coords[ps[7]][1])) / 9\n      ]);\n      ps[6] = coords.length;\n      coords.push([\n        (-4 * coords[ps[3]][0] - coords[ps[12]][0] +\n          6 * (coords[ps[2]][0] + coords[ps[7]][0]) -\n          2 * (coords[ps[0]][0] + coords[ps[15]][0]) +\n          3 * (coords[ps[4]][0] + coords[ps[14]][0])) / 9,\n        (-4 * coords[ps[3]][1] - coords[ps[12]][1] +\n          6 * (coords[ps[2]][1] + coords[ps[7]][1]) -\n          2 * (coords[ps[0]][1] + coords[ps[15]][1]) +\n          3 * (coords[ps[4]][1] + coords[ps[14]][1])) / 9\n      ]);\n      ps[9] = coords.length;\n      coords.push([\n        (-4 * coords[ps[12]][0] - coords[ps[3]][0] +\n          6 * (coords[ps[8]][0] + coords[ps[13]][0]) -\n          2 * (coords[ps[0]][0] + coords[ps[15]][0]) +\n          3 * (coords[ps[11]][0] + coords[ps[1]][0])) / 9,\n        (-4 * coords[ps[12]][1] - coords[ps[3]][1] +\n          6 * (coords[ps[8]][1] + coords[ps[13]][1]) -\n          2 * (coords[ps[0]][1] + coords[ps[15]][1]) +\n          3 * (coords[ps[11]][1] + coords[ps[1]][1])) / 9\n      ]);\n      ps[10] = coords.length;\n      coords.push([\n        (-4 * coords[ps[15]][0] - coords[ps[0]][0] +\n          6 * (coords[ps[11]][0] + coords[ps[14]][0]) -\n          2 * (coords[ps[12]][0] + coords[ps[3]][0]) +\n          3 * (coords[ps[2]][0] + coords[ps[8]][0])) / 9,\n        (-4 * coords[ps[15]][1] - coords[ps[0]][1] +\n          6 * (coords[ps[11]][1] + coords[ps[14]][1]) -\n          2 * (coords[ps[12]][1] + coords[ps[3]][1]) +\n          3 * (coords[ps[2]][1] + coords[ps[8]][1])) / 9\n      ]);\n      mesh.figures.push({\n        type: 'patch',\n        coords: new Int32Array(ps), // making copies of ps and cs\n        colors: new Int32Array(cs),\n      });\n    }\n  }\n\n  function decodeType7Shading(mesh, reader) {\n    var coords = mesh.coords;\n    var colors = mesh.colors;\n    var ps = new Int32Array(16); // p00, p10, ..., p30, p01, ..., p33\n    var cs = new Int32Array(4); // c00, c30, c03, c33\n    while (reader.hasData) {\n      var f = reader.readFlag();\n      if (!(0 <= f && f <= 3)) {\n        throw new FormatError('Unknown type7 flag');\n      }\n      var i, ii;\n      var pi = coords.length;\n      for (i = 0, ii = (f !== 0 ? 12 : 16); i < ii; i++) {\n        coords.push(reader.readCoordinate());\n      }\n      var ci = colors.length;\n      for (i = 0, ii = (f !== 0 ? 2 : 4); i < ii; i++) {\n        colors.push(reader.readComponents());\n      }\n      var tmp1, tmp2, tmp3, tmp4;\n      switch (f) {\n        case 0:\n          ps[12] = pi + 3; ps[13] = pi + 4;  ps[14] = pi + 5;  ps[15] = pi + 6;\n          ps[ 8] = pi + 2; ps[ 9] = pi + 13; ps[10] = pi + 14; ps[11] = pi + 7;\n          ps[ 4] = pi + 1; ps[ 5] = pi + 12; ps[ 6] = pi + 15; ps[ 7] = pi + 8;\n          ps[ 0] = pi;     ps[ 1] = pi + 11; ps[ 2] = pi + 10; ps[ 3] = pi + 9;\n          cs[2] = ci + 1; cs[3] = ci + 2;\n          cs[0] = ci;     cs[1] = ci + 3;\n          break;\n        case 1:\n          tmp1 = ps[12]; tmp2 = ps[13]; tmp3 = ps[14]; tmp4 = ps[15];\n          ps[12] = tmp4;   ps[13] = pi + 0;  ps[14] = pi + 1;  ps[15] = pi + 2;\n          ps[ 8] = tmp3;   ps[ 9] = pi + 9;  ps[10] = pi + 10; ps[11] = pi + 3;\n          ps[ 4] = tmp2;   ps[ 5] = pi + 8;  ps[ 6] = pi + 11; ps[ 7] = pi + 4;\n          ps[ 0] = tmp1;   ps[ 1] = pi + 7;  ps[ 2] = pi + 6;  ps[ 3] = pi + 5;\n          tmp1 = cs[2]; tmp2 = cs[3];\n          cs[2] = tmp2;   cs[3] = ci;\n          cs[0] = tmp1;   cs[1] = ci + 1;\n          break;\n        case 2:\n          tmp1 = ps[15];\n          tmp2 = ps[11];\n          ps[12] = ps[3]; ps[13] = pi + 0; ps[14] = pi + 1;  ps[15] = pi + 2;\n          ps[ 8] = ps[7]; ps[ 9] = pi + 9; ps[10] = pi + 10; ps[11] = pi + 3;\n          ps[ 4] = tmp2;  ps[ 5] = pi + 8; ps[ 6] = pi + 11; ps[ 7] = pi + 4;\n          ps[ 0] = tmp1;  ps[ 1] = pi + 7; ps[ 2] = pi + 6;  ps[ 3] = pi + 5;\n          tmp1 = cs[3];\n          cs[2] = cs[1]; cs[3] = ci;\n          cs[0] = tmp1;  cs[1] = ci + 1;\n          break;\n        case 3:\n          ps[12] = ps[0];  ps[13] = pi + 0;  ps[14] = pi + 1;  ps[15] = pi + 2;\n          ps[ 8] = ps[1];  ps[ 9] = pi + 9;  ps[10] = pi + 10; ps[11] = pi + 3;\n          ps[ 4] = ps[2];  ps[ 5] = pi + 8;  ps[ 6] = pi + 11; ps[ 7] = pi + 4;\n          ps[ 0] = ps[3];  ps[ 1] = pi + 7;  ps[ 2] = pi + 6;  ps[ 3] = pi + 5;\n          cs[2] = cs[0]; cs[3] = ci;\n          cs[0] = cs[1]; cs[1] = ci + 1;\n          break;\n      }\n      mesh.figures.push({\n        type: 'patch',\n        coords: new Int32Array(ps), // making copies of ps and cs\n        colors: new Int32Array(cs),\n      });\n    }\n  }\n\n  function updateBounds(mesh) {\n    var minX = mesh.coords[0][0], minY = mesh.coords[0][1],\n      maxX = minX, maxY = minY;\n    for (var i = 1, ii = mesh.coords.length; i < ii; i++) {\n      var x = mesh.coords[i][0], y = mesh.coords[i][1];\n      minX = minX > x ? x : minX;\n      minY = minY > y ? y : minY;\n      maxX = maxX < x ? x : maxX;\n      maxY = maxY < y ? y : maxY;\n    }\n    mesh.bounds = [minX, minY, maxX, maxY];\n  }\n\n  function packData(mesh) {\n    var i, ii, j, jj;\n\n    var coords = mesh.coords;\n    var coordsPacked = new Float32Array(coords.length * 2);\n    for (i = 0, j = 0, ii = coords.length; i < ii; i++) {\n      var xy = coords[i];\n      coordsPacked[j++] = xy[0];\n      coordsPacked[j++] = xy[1];\n    }\n    mesh.coords = coordsPacked;\n\n    var colors = mesh.colors;\n    var colorsPacked = new Uint8Array(colors.length * 3);\n    for (i = 0, j = 0, ii = colors.length; i < ii; i++) {\n      var c = colors[i];\n      colorsPacked[j++] = c[0];\n      colorsPacked[j++] = c[1];\n      colorsPacked[j++] = c[2];\n    }\n    mesh.colors = colorsPacked;\n\n    var figures = mesh.figures;\n    for (i = 0, ii = figures.length; i < ii; i++) {\n      var figure = figures[i], ps = figure.coords, cs = figure.colors;\n      for (j = 0, jj = ps.length; j < jj; j++) {\n        ps[j] *= 2;\n        cs[j] *= 3;\n      }\n    }\n  }\n\n  function Mesh(stream, matrix, xref, res, pdfFunctionFactory) {\n    if (!isStream(stream)) {\n      throw new FormatError('Mesh data is not a stream');\n    }\n    var dict = stream.dict;\n    this.matrix = matrix;\n    this.shadingType = dict.get('ShadingType');\n    this.type = 'Pattern';\n    this.bbox = dict.getArray('BBox');\n    var cs = dict.get('ColorSpace', 'CS');\n    cs = ColorSpace.parse(cs, xref, res, pdfFunctionFactory);\n    this.cs = cs;\n    this.background = dict.has('Background') ?\n      cs.getRgb(dict.get('Background'), 0) : null;\n\n    var fnObj = dict.get('Function');\n    var fn = fnObj ? pdfFunctionFactory.createFromArray(fnObj) : null;\n\n    this.coords = [];\n    this.colors = [];\n    this.figures = [];\n\n    var decodeContext = {\n      bitsPerCoordinate: dict.get('BitsPerCoordinate'),\n      bitsPerComponent: dict.get('BitsPerComponent'),\n      bitsPerFlag: dict.get('BitsPerFlag'),\n      decode: dict.getArray('Decode'),\n      colorFn: fn,\n      colorSpace: cs,\n      numComps: fn ? 1 : cs.numComps,\n    };\n    var reader = new MeshStreamReader(stream, decodeContext);\n\n    var patchMesh = false;\n    switch (this.shadingType) {\n      case ShadingType.FREE_FORM_MESH:\n        decodeType4Shading(this, reader);\n        break;\n      case ShadingType.LATTICE_FORM_MESH:\n        var verticesPerRow = dict.get('VerticesPerRow') | 0;\n        if (verticesPerRow < 2) {\n          throw new FormatError('Invalid VerticesPerRow');\n        }\n        decodeType5Shading(this, reader, verticesPerRow);\n        break;\n      case ShadingType.COONS_PATCH_MESH:\n        decodeType6Shading(this, reader);\n        patchMesh = true;\n        break;\n      case ShadingType.TENSOR_PATCH_MESH:\n        decodeType7Shading(this, reader);\n        patchMesh = true;\n        break;\n      default:\n        unreachable('Unsupported mesh type.');\n        break;\n    }\n\n    if (patchMesh) {\n      // dirty bounds calculation for determining, how dense shall be triangles\n      updateBounds(this);\n      for (var i = 0, ii = this.figures.length; i < ii; i++) {\n        buildFigureFromPatch(this, i);\n      }\n    }\n    // calculate bounds\n    updateBounds(this);\n\n    packData(this);\n  }\n\n  Mesh.prototype = {\n    getIR: function Mesh_getIR() {\n      return ['Mesh', this.shadingType, this.coords, this.colors, this.figures,\n        this.bounds, this.matrix, this.bbox, this.background];\n    },\n  };\n\n  return Mesh;\n})();\n\nShadings.Dummy = (function DummyClosure() {\n  function Dummy() {\n    this.type = 'Pattern';\n  }\n\n  Dummy.prototype = {\n    getIR: function Dummy_getIR() {\n      return ['Dummy'];\n    },\n  };\n  return Dummy;\n})();\n\nfunction getTilingPatternIR(operatorList, dict, args) {\n  let matrix = dict.getArray('Matrix');\n  let bbox = Util.normalizeRect(dict.getArray('BBox'));\n  let xstep = dict.get('XStep');\n  let ystep = dict.get('YStep');\n  let paintType = dict.get('PaintType');\n  let tilingType = dict.get('TilingType');\n\n  // Ensure that the pattern has a non-zero width and height, to prevent errors\n  // in `pattern_helper.js` (fixes issue8330.pdf).\n  if ((bbox[2] - bbox[0]) === 0 || (bbox[3] - bbox[1]) === 0) {\n    throw new FormatError(`Invalid getTilingPatternIR /BBox array: [${bbox}].`);\n  }\n\n  return [\n    'TilingPattern', args, operatorList, matrix, bbox, xstep, ystep,\n    paintType, tilingType\n  ];\n}\n\nexport {\n  Pattern,\n  getTilingPatternIR,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { warn } from '../shared/util';\n\n// Character types for symbols from 0000 to 00FF.\n// Source: ftp://ftp.unicode.org/Public/UNIDATA/UnicodeData.txt\nvar baseTypes = [\n  'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'S', 'B', 'S',\n  'WS', 'B', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN',\n  'BN', 'BN', 'BN', 'BN', 'B', 'B', 'B', 'S', 'WS', 'ON', 'ON', 'ET',\n  'ET', 'ET', 'ON', 'ON', 'ON', 'ON', 'ON', 'ES', 'CS', 'ES', 'CS', 'CS',\n  'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'CS', 'ON',\n  'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',\n  'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',\n  'L', 'L', 'L', 'L', 'ON', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L',\n  'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',\n  'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'ON', 'ON', 'ON', 'ON',\n  'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'B', 'BN', 'BN', 'BN', 'BN', 'BN',\n  'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN',\n  'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'CS', 'ON', 'ET',\n  'ET', 'ET', 'ET', 'ON', 'ON', 'ON', 'ON', 'L', 'ON', 'ON', 'BN', 'ON',\n  'ON', 'ET', 'ET', 'EN', 'EN', 'ON', 'L', 'ON', 'ON', 'ON', 'EN', 'L',\n  'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',\n  'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',\n  'L', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',\n  'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',\n  'L', 'L', 'L', 'L', 'L', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L'\n];\n\n// Character types for symbols from 0600 to 06FF.\n// Source: ftp://ftp.unicode.org/Public/UNIDATA/UnicodeData.txt\n// Note that 061D does not exist in the Unicode standard (see\n// http://unicode.org/charts/PDF/U0600.pdf), so we replace it with an\n// empty string and issue a warning if we encounter this character. The\n// empty string is required to properly index the items after it.\nvar arabicTypes = [\n  'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'ON', 'ON', 'AL', 'ET', 'ET', 'AL',\n  'CS', 'AL', 'ON', 'ON', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM',\n  'NSM', 'NSM', 'NSM', 'NSM', 'AL', 'AL', '', 'AL', 'AL', 'AL', 'AL', 'AL',\n  'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',\n  'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',\n  'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',\n  'AL', 'AL', 'AL', 'AL', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM',\n  'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM',\n  'NSM', 'NSM', 'NSM', 'NSM', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN',\n  'AN', 'AN', 'AN', 'ET', 'AN', 'AN', 'AL', 'AL', 'AL', 'NSM', 'AL', 'AL',\n  'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',\n  'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',\n  'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',\n  'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',\n  'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',\n  'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',\n  'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',\n  'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',\n  'AL', 'AL', 'AL', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AN',\n  'ON', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AL', 'AL', 'NSM', 'NSM',\n  'ON', 'NSM', 'NSM', 'NSM', 'NSM', 'AL', 'AL', 'EN', 'EN', 'EN', 'EN',\n  'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL'\n];\n\nfunction isOdd(i) {\n  return (i & 1) !== 0;\n}\n\nfunction isEven(i) {\n  return (i & 1) === 0;\n}\n\nfunction findUnequal(arr, start, value) {\n  for (var j = start, jj = arr.length; j < jj; ++j) {\n    if (arr[j] !== value) {\n      return j;\n    }\n  }\n  return j;\n}\n\nfunction setValues(arr, start, end, value) {\n  for (var j = start; j < end; ++j) {\n    arr[j] = value;\n  }\n}\n\nfunction reverseValues(arr, start, end) {\n  for (var i = start, j = end - 1; i < j; ++i, --j) {\n    var temp = arr[i];\n    arr[i] = arr[j];\n    arr[j] = temp;\n  }\n}\n\nfunction createBidiText(str, isLTR, vertical) {\n  return {\n    str,\n    dir: (vertical ? 'ttb' : (isLTR ? 'ltr' : 'rtl')),\n  };\n}\n\n// These are used in bidi(), which is called frequently. We re-use them on\n// each call to avoid unnecessary allocations.\nvar chars = [];\nvar types = [];\n\nfunction bidi(str, startLevel, vertical) {\n  var isLTR = true;\n  var strLength = str.length;\n  if (strLength === 0 || vertical) {\n    return createBidiText(str, isLTR, vertical);\n  }\n\n  // Get types and fill arrays\n  chars.length = strLength;\n  types.length = strLength;\n  var numBidi = 0;\n\n  var i, ii;\n  for (i = 0; i < strLength; ++i) {\n    chars[i] = str.charAt(i);\n\n    var charCode = str.charCodeAt(i);\n    var charType = 'L';\n    if (charCode <= 0x00ff) {\n      charType = baseTypes[charCode];\n    } else if (0x0590 <= charCode && charCode <= 0x05f4) {\n      charType = 'R';\n    } else if (0x0600 <= charCode && charCode <= 0x06ff) {\n      charType = arabicTypes[charCode & 0xff];\n      if (!charType) {\n        warn('Bidi: invalid Unicode character ' + charCode.toString(16));\n      }\n    } else if (0x0700 <= charCode && charCode <= 0x08AC) {\n      charType = 'AL';\n    }\n    if (charType === 'R' || charType === 'AL' || charType === 'AN') {\n      numBidi++;\n    }\n    types[i] = charType;\n  }\n\n  // Detect the bidi method\n  // - If there are no rtl characters then no bidi needed\n  // - If less than 30% chars are rtl then string is primarily ltr\n  // - If more than 30% chars are rtl then string is primarily rtl\n  if (numBidi === 0) {\n    isLTR = true;\n    return createBidiText(str, isLTR);\n  }\n\n  if (startLevel === -1) {\n    if ((numBidi / strLength) < 0.3) {\n      isLTR = true;\n      startLevel = 0;\n    } else {\n      isLTR = false;\n      startLevel = 1;\n    }\n  }\n\n  var levels = [];\n  for (i = 0; i < strLength; ++i) {\n    levels[i] = startLevel;\n  }\n\n  /*\n   X1-X10: skip most of this, since we are NOT doing the embeddings.\n   */\n  var e = (isOdd(startLevel) ? 'R' : 'L');\n  var sor = e;\n  var eor = sor;\n\n  /*\n   W1. Examine each non-spacing mark (NSM) in the level run, and change the\n   type of the NSM to the type of the previous character. If the NSM is at the\n   start of the level run, it will get the type of sor.\n   */\n  var lastType = sor;\n  for (i = 0; i < strLength; ++i) {\n    if (types[i] === 'NSM') {\n      types[i] = lastType;\n    } else {\n      lastType = types[i];\n    }\n  }\n\n  /*\n   W2. Search backwards from each instance of a European number until the\n   first strong type (R, L, AL, or sor) is found.  If an AL is found, change\n   the type of the European number to Arabic number.\n   */\n  lastType = sor;\n  var t;\n  for (i = 0; i < strLength; ++i) {\n    t = types[i];\n    if (t === 'EN') {\n      types[i] = (lastType === 'AL') ? 'AN' : 'EN';\n    } else if (t === 'R' || t === 'L' || t === 'AL') {\n      lastType = t;\n    }\n  }\n\n  /*\n   W3. Change all ALs to R.\n   */\n  for (i = 0; i < strLength; ++i) {\n    t = types[i];\n    if (t === 'AL') {\n      types[i] = 'R';\n    }\n  }\n\n  /*\n   W4. A single European separator between two European numbers changes to a\n   European number. A single common separator between two numbers of the same\n   type changes to that type:\n   */\n  for (i = 1; i < strLength - 1; ++i) {\n    if (types[i] === 'ES' && types[i - 1] === 'EN' && types[i + 1] === 'EN') {\n      types[i] = 'EN';\n    }\n    if (types[i] === 'CS' &&\n        (types[i - 1] === 'EN' || types[i - 1] === 'AN') &&\n        types[i + 1] === types[i - 1]) {\n      types[i] = types[i - 1];\n    }\n  }\n\n  /*\n   W5. A sequence of European terminators adjacent to European numbers changes\n   to all European numbers:\n   */\n  for (i = 0; i < strLength; ++i) {\n    if (types[i] === 'EN') {\n      // do before\n      var j;\n      for (j = i - 1; j >= 0; --j) {\n        if (types[j] !== 'ET') {\n          break;\n        }\n        types[j] = 'EN';\n      }\n      // do after\n      for (j = i + 1; j < strLength; ++j) {\n        if (types[j] !== 'ET') {\n          break;\n        }\n        types[j] = 'EN';\n      }\n    }\n  }\n\n  /*\n   W6. Otherwise, separators and terminators change to Other Neutral:\n   */\n  for (i = 0; i < strLength; ++i) {\n    t = types[i];\n    if (t === 'WS' || t === 'ES' || t === 'ET' || t === 'CS') {\n      types[i] = 'ON';\n    }\n  }\n\n  /*\n   W7. Search backwards from each instance of a European number until the\n   first strong type (R, L, or sor) is found. If an L is found,  then change\n   the type of the European number to L.\n   */\n  lastType = sor;\n  for (i = 0; i < strLength; ++i) {\n    t = types[i];\n    if (t === 'EN') {\n      types[i] = ((lastType === 'L') ? 'L' : 'EN');\n    } else if (t === 'R' || t === 'L') {\n      lastType = t;\n    }\n  }\n\n  /*\n   N1. A sequence of neutrals takes the direction of the surrounding strong\n   text if the text on both sides has the same direction. European and Arabic\n   numbers are treated as though they were R. Start-of-level-run (sor) and\n   end-of-level-run (eor) are used at level run boundaries.\n   */\n  for (i = 0; i < strLength; ++i) {\n    if (types[i] === 'ON') {\n      var end = findUnequal(types, i + 1, 'ON');\n      var before = sor;\n      if (i > 0) {\n        before = types[i - 1];\n      }\n\n      var after = eor;\n      if (end + 1 < strLength) {\n        after = types[end + 1];\n      }\n      if (before !== 'L') {\n        before = 'R';\n      }\n      if (after !== 'L') {\n        after = 'R';\n      }\n      if (before === after) {\n        setValues(types, i, end, before);\n      }\n      i = end - 1; // reset to end (-1 so next iteration is ok)\n    }\n  }\n\n  /*\n   N2. Any remaining neutrals take the embedding direction.\n   */\n  for (i = 0; i < strLength; ++i) {\n    if (types[i] === 'ON') {\n      types[i] = e;\n    }\n  }\n\n  /*\n   I1. For all characters with an even (left-to-right) embedding direction,\n   those of type R go up one level and those of type AN or EN go up two\n   levels.\n   I2. For all characters with an odd (right-to-left) embedding direction,\n   those of type L, EN or AN go up one level.\n   */\n  for (i = 0; i < strLength; ++i) {\n    t = types[i];\n    if (isEven(levels[i])) {\n      if (t === 'R') {\n        levels[i] += 1;\n      } else if (t === 'AN' || t === 'EN') {\n        levels[i] += 2;\n      }\n    } else { // isOdd\n      if (t === 'L' || t === 'AN' || t === 'EN') {\n        levels[i] += 1;\n      }\n    }\n  }\n\n  /*\n   L1. On each line, reset the embedding level of the following characters to\n   the paragraph embedding level:\n\n   segment separators,\n   paragraph separators,\n   any sequence of whitespace characters preceding a segment separator or\n   paragraph separator, and any sequence of white space characters at the end\n   of the line.\n   */\n\n  // don't bother as text is only single line\n\n  /*\n   L2. From the highest level found in the text to the lowest odd level on\n   each line, reverse any contiguous sequence of characters that are at that\n   level or higher.\n   */\n\n  // find highest level & lowest odd level\n  var highestLevel = -1;\n  var lowestOddLevel = 99;\n  var level;\n  for (i = 0, ii = levels.length; i < ii; ++i) {\n    level = levels[i];\n    if (highestLevel < level) {\n      highestLevel = level;\n    }\n    if (lowestOddLevel > level && isOdd(level)) {\n      lowestOddLevel = level;\n    }\n  }\n\n  // now reverse between those limits\n  for (level = highestLevel; level >= lowestOddLevel; --level) {\n    // find segments to reverse\n    var start = -1;\n    for (i = 0, ii = levels.length; i < ii; ++i) {\n      if (levels[i] < level) {\n        if (start >= 0) {\n          reverseValues(chars, start, i);\n          start = -1;\n        }\n      } else if (start < 0) {\n        start = i;\n      }\n    }\n    if (start >= 0) {\n      reverseValues(chars, start, levels.length);\n    }\n  }\n\n  /*\n   L3. Combining marks applied to a right-to-left base character will at this\n   point precede their base character. If the rendering engine expects them to\n   follow the base characters in the final display process, then the ordering\n   of the marks and the base character must be reversed.\n   */\n\n  // don't bother for now\n\n  /*\n   L4. A character that possesses the mirrored property as specified by\n   Section 4.7, Mirrored, must be depicted by a mirrored glyph if the resolved\n   directionality of that character is R.\n   */\n\n  // don't mirror as characters are already mirrored in the pdf\n\n  // Finally, return string\n  for (i = 0, ii = chars.length; i < ii; ++i) {\n    var ch = chars[i];\n    if (ch === '<' || ch === '>') {\n      chars[i] = '';\n    }\n  }\n  return createBidiText(chars.join(''), isLTR);\n}\n\nexport {\n  bidi,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getLookupTableFactory } from '../shared/util';\n\n// The Metrics object contains glyph widths (in glyph space units).\n// As per PDF spec, for most fonts (Type 3 being an exception) a glyph\n// space unit corresponds to 1/1000th of text space unit.\nvar getMetrics = getLookupTableFactory(function (t) {\n  t['Courier'] = 600;\n  t['Courier-Bold'] = 600;\n  t['Courier-BoldOblique'] = 600;\n  t['Courier-Oblique'] = 600;\n  t['Helvetica'] = getLookupTableFactory(function (t) {\n    t['space'] = 278;\n    t['exclam'] = 278;\n    t['quotedbl'] = 355;\n    t['numbersign'] = 556;\n    t['dollar'] = 556;\n    t['percent'] = 889;\n    t['ampersand'] = 667;\n    t['quoteright'] = 222;\n    t['parenleft'] = 333;\n    t['parenright'] = 333;\n    t['asterisk'] = 389;\n    t['plus'] = 584;\n    t['comma'] = 278;\n    t['hyphen'] = 333;\n    t['period'] = 278;\n    t['slash'] = 278;\n    t['zero'] = 556;\n    t['one'] = 556;\n    t['two'] = 556;\n    t['three'] = 556;\n    t['four'] = 556;\n    t['five'] = 556;\n    t['six'] = 556;\n    t['seven'] = 556;\n    t['eight'] = 556;\n    t['nine'] = 556;\n    t['colon'] = 278;\n    t['semicolon'] = 278;\n    t['less'] = 584;\n    t['equal'] = 584;\n    t['greater'] = 584;\n    t['question'] = 556;\n    t['at'] = 1015;\n    t['A'] = 667;\n    t['B'] = 667;\n    t['C'] = 722;\n    t['D'] = 722;\n    t['E'] = 667;\n    t['F'] = 611;\n    t['G'] = 778;\n    t['H'] = 722;\n    t['I'] = 278;\n    t['J'] = 500;\n    t['K'] = 667;\n    t['L'] = 556;\n    t['M'] = 833;\n    t['N'] = 722;\n    t['O'] = 778;\n    t['P'] = 667;\n    t['Q'] = 778;\n    t['R'] = 722;\n    t['S'] = 667;\n    t['T'] = 611;\n    t['U'] = 722;\n    t['V'] = 667;\n    t['W'] = 944;\n    t['X'] = 667;\n    t['Y'] = 667;\n    t['Z'] = 611;\n    t['bracketleft'] = 278;\n    t['backslash'] = 278;\n    t['bracketright'] = 278;\n    t['asciicircum'] = 469;\n    t['underscore'] = 556;\n    t['quoteleft'] = 222;\n    t['a'] = 556;\n    t['b'] = 556;\n    t['c'] = 500;\n    t['d'] = 556;\n    t['e'] = 556;\n    t['f'] = 278;\n    t['g'] = 556;\n    t['h'] = 556;\n    t['i'] = 222;\n    t['j'] = 222;\n    t['k'] = 500;\n    t['l'] = 222;\n    t['m'] = 833;\n    t['n'] = 556;\n    t['o'] = 556;\n    t['p'] = 556;\n    t['q'] = 556;\n    t['r'] = 333;\n    t['s'] = 500;\n    t['t'] = 278;\n    t['u'] = 556;\n    t['v'] = 500;\n    t['w'] = 722;\n    t['x'] = 500;\n    t['y'] = 500;\n    t['z'] = 500;\n    t['braceleft'] = 334;\n    t['bar'] = 260;\n    t['braceright'] = 334;\n    t['asciitilde'] = 584;\n    t['exclamdown'] = 333;\n    t['cent'] = 556;\n    t['sterling'] = 556;\n    t['fraction'] = 167;\n    t['yen'] = 556;\n    t['florin'] = 556;\n    t['section'] = 556;\n    t['currency'] = 556;\n    t['quotesingle'] = 191;\n    t['quotedblleft'] = 333;\n    t['guillemotleft'] = 556;\n    t['guilsinglleft'] = 333;\n    t['guilsinglright'] = 333;\n    t['fi'] = 500;\n    t['fl'] = 500;\n    t['endash'] = 556;\n    t['dagger'] = 556;\n    t['daggerdbl'] = 556;\n    t['periodcentered'] = 278;\n    t['paragraph'] = 537;\n    t['bullet'] = 350;\n    t['quotesinglbase'] = 222;\n    t['quotedblbase'] = 333;\n    t['quotedblright'] = 333;\n    t['guillemotright'] = 556;\n    t['ellipsis'] = 1000;\n    t['perthousand'] = 1000;\n    t['questiondown'] = 611;\n    t['grave'] = 333;\n    t['acute'] = 333;\n    t['circumflex'] = 333;\n    t['tilde'] = 333;\n    t['macron'] = 333;\n    t['breve'] = 333;\n    t['dotaccent'] = 333;\n    t['dieresis'] = 333;\n    t['ring'] = 333;\n    t['cedilla'] = 333;\n    t['hungarumlaut'] = 333;\n    t['ogonek'] = 333;\n    t['caron'] = 333;\n    t['emdash'] = 1000;\n    t['AE'] = 1000;\n    t['ordfeminine'] = 370;\n    t['Lslash'] = 556;\n    t['Oslash'] = 778;\n    t['OE'] = 1000;\n    t['ordmasculine'] = 365;\n    t['ae'] = 889;\n    t['dotlessi'] = 278;\n    t['lslash'] = 222;\n    t['oslash'] = 611;\n    t['oe'] = 944;\n    t['germandbls'] = 611;\n    t['Idieresis'] = 278;\n    t['eacute'] = 556;\n    t['abreve'] = 556;\n    t['uhungarumlaut'] = 556;\n    t['ecaron'] = 556;\n    t['Ydieresis'] = 667;\n    t['divide'] = 584;\n    t['Yacute'] = 667;\n    t['Acircumflex'] = 667;\n    t['aacute'] = 556;\n    t['Ucircumflex'] = 722;\n    t['yacute'] = 500;\n    t['scommaaccent'] = 500;\n    t['ecircumflex'] = 556;\n    t['Uring'] = 722;\n    t['Udieresis'] = 722;\n    t['aogonek'] = 556;\n    t['Uacute'] = 722;\n    t['uogonek'] = 556;\n    t['Edieresis'] = 667;\n    t['Dcroat'] = 722;\n    t['commaaccent'] = 250;\n    t['copyright'] = 737;\n    t['Emacron'] = 667;\n    t['ccaron'] = 500;\n    t['aring'] = 556;\n    t['Ncommaaccent'] = 722;\n    t['lacute'] = 222;\n    t['agrave'] = 556;\n    t['Tcommaaccent'] = 611;\n    t['Cacute'] = 722;\n    t['atilde'] = 556;\n    t['Edotaccent'] = 667;\n    t['scaron'] = 500;\n    t['scedilla'] = 500;\n    t['iacute'] = 278;\n    t['lozenge'] = 471;\n    t['Rcaron'] = 722;\n    t['Gcommaaccent'] = 778;\n    t['ucircumflex'] = 556;\n    t['acircumflex'] = 556;\n    t['Amacron'] = 667;\n    t['rcaron'] = 333;\n    t['ccedilla'] = 500;\n    t['Zdotaccent'] = 611;\n    t['Thorn'] = 667;\n    t['Omacron'] = 778;\n    t['Racute'] = 722;\n    t['Sacute'] = 667;\n    t['dcaron'] = 643;\n    t['Umacron'] = 722;\n    t['uring'] = 556;\n    t['threesuperior'] = 333;\n    t['Ograve'] = 778;\n    t['Agrave'] = 667;\n    t['Abreve'] = 667;\n    t['multiply'] = 584;\n    t['uacute'] = 556;\n    t['Tcaron'] = 611;\n    t['partialdiff'] = 476;\n    t['ydieresis'] = 500;\n    t['Nacute'] = 722;\n    t['icircumflex'] = 278;\n    t['Ecircumflex'] = 667;\n    t['adieresis'] = 556;\n    t['edieresis'] = 556;\n    t['cacute'] = 500;\n    t['nacute'] = 556;\n    t['umacron'] = 556;\n    t['Ncaron'] = 722;\n    t['Iacute'] = 278;\n    t['plusminus'] = 584;\n    t['brokenbar'] = 260;\n    t['registered'] = 737;\n    t['Gbreve'] = 778;\n    t['Idotaccent'] = 278;\n    t['summation'] = 600;\n    t['Egrave'] = 667;\n    t['racute'] = 333;\n    t['omacron'] = 556;\n    t['Zacute'] = 611;\n    t['Zcaron'] = 611;\n    t['greaterequal'] = 549;\n    t['Eth'] = 722;\n    t['Ccedilla'] = 722;\n    t['lcommaaccent'] = 222;\n    t['tcaron'] = 317;\n    t['eogonek'] = 556;\n    t['Uogonek'] = 722;\n    t['Aacute'] = 667;\n    t['Adieresis'] = 667;\n    t['egrave'] = 556;\n    t['zacute'] = 500;\n    t['iogonek'] = 222;\n    t['Oacute'] = 778;\n    t['oacute'] = 556;\n    t['amacron'] = 556;\n    t['sacute'] = 500;\n    t['idieresis'] = 278;\n    t['Ocircumflex'] = 778;\n    t['Ugrave'] = 722;\n    t['Delta'] = 612;\n    t['thorn'] = 556;\n    t['twosuperior'] = 333;\n    t['Odieresis'] = 778;\n    t['mu'] = 556;\n    t['igrave'] = 278;\n    t['ohungarumlaut'] = 556;\n    t['Eogonek'] = 667;\n    t['dcroat'] = 556;\n    t['threequarters'] = 834;\n    t['Scedilla'] = 667;\n    t['lcaron'] = 299;\n    t['Kcommaaccent'] = 667;\n    t['Lacute'] = 556;\n    t['trademark'] = 1000;\n    t['edotaccent'] = 556;\n    t['Igrave'] = 278;\n    t['Imacron'] = 278;\n    t['Lcaron'] = 556;\n    t['onehalf'] = 834;\n    t['lessequal'] = 549;\n    t['ocircumflex'] = 556;\n    t['ntilde'] = 556;\n    t['Uhungarumlaut'] = 722;\n    t['Eacute'] = 667;\n    t['emacron'] = 556;\n    t['gbreve'] = 556;\n    t['onequarter'] = 834;\n    t['Scaron'] = 667;\n    t['Scommaaccent'] = 667;\n    t['Ohungarumlaut'] = 778;\n    t['degree'] = 400;\n    t['ograve'] = 556;\n    t['Ccaron'] = 722;\n    t['ugrave'] = 556;\n    t['radical'] = 453;\n    t['Dcaron'] = 722;\n    t['rcommaaccent'] = 333;\n    t['Ntilde'] = 722;\n    t['otilde'] = 556;\n    t['Rcommaaccent'] = 722;\n    t['Lcommaaccent'] = 556;\n    t['Atilde'] = 667;\n    t['Aogonek'] = 667;\n    t['Aring'] = 667;\n    t['Otilde'] = 778;\n    t['zdotaccent'] = 500;\n    t['Ecaron'] = 667;\n    t['Iogonek'] = 278;\n    t['kcommaaccent'] = 500;\n    t['minus'] = 584;\n    t['Icircumflex'] = 278;\n    t['ncaron'] = 556;\n    t['tcommaaccent'] = 278;\n    t['logicalnot'] = 584;\n    t['odieresis'] = 556;\n    t['udieresis'] = 556;\n    t['notequal'] = 549;\n    t['gcommaaccent'] = 556;\n    t['eth'] = 556;\n    t['zcaron'] = 500;\n    t['ncommaaccent'] = 556;\n    t['onesuperior'] = 333;\n    t['imacron'] = 278;\n    t['Euro'] = 556;\n  });\n  t['Helvetica-Bold'] = getLookupTableFactory(function (t) {\n    t['space'] = 278;\n    t['exclam'] = 333;\n    t['quotedbl'] = 474;\n    t['numbersign'] = 556;\n    t['dollar'] = 556;\n    t['percent'] = 889;\n    t['ampersand'] = 722;\n    t['quoteright'] = 278;\n    t['parenleft'] = 333;\n    t['parenright'] = 333;\n    t['asterisk'] = 389;\n    t['plus'] = 584;\n    t['comma'] = 278;\n    t['hyphen'] = 333;\n    t['period'] = 278;\n    t['slash'] = 278;\n    t['zero'] = 556;\n    t['one'] = 556;\n    t['two'] = 556;\n    t['three'] = 556;\n    t['four'] = 556;\n    t['five'] = 556;\n    t['six'] = 556;\n    t['seven'] = 556;\n    t['eight'] = 556;\n    t['nine'] = 556;\n    t['colon'] = 333;\n    t['semicolon'] = 333;\n    t['less'] = 584;\n    t['equal'] = 584;\n    t['greater'] = 584;\n    t['question'] = 611;\n    t['at'] = 975;\n    t['A'] = 722;\n    t['B'] = 722;\n    t['C'] = 722;\n    t['D'] = 722;\n    t['E'] = 667;\n    t['F'] = 611;\n    t['G'] = 778;\n    t['H'] = 722;\n    t['I'] = 278;\n    t['J'] = 556;\n    t['K'] = 722;\n    t['L'] = 611;\n    t['M'] = 833;\n    t['N'] = 722;\n    t['O'] = 778;\n    t['P'] = 667;\n    t['Q'] = 778;\n    t['R'] = 722;\n    t['S'] = 667;\n    t['T'] = 611;\n    t['U'] = 722;\n    t['V'] = 667;\n    t['W'] = 944;\n    t['X'] = 667;\n    t['Y'] = 667;\n    t['Z'] = 611;\n    t['bracketleft'] = 333;\n    t['backslash'] = 278;\n    t['bracketright'] = 333;\n    t['asciicircum'] = 584;\n    t['underscore'] = 556;\n    t['quoteleft'] = 278;\n    t['a'] = 556;\n    t['b'] = 611;\n    t['c'] = 556;\n    t['d'] = 611;\n    t['e'] = 556;\n    t['f'] = 333;\n    t['g'] = 611;\n    t['h'] = 611;\n    t['i'] = 278;\n    t['j'] = 278;\n    t['k'] = 556;\n    t['l'] = 278;\n    t['m'] = 889;\n    t['n'] = 611;\n    t['o'] = 611;\n    t['p'] = 611;\n    t['q'] = 611;\n    t['r'] = 389;\n    t['s'] = 556;\n    t['t'] = 333;\n    t['u'] = 611;\n    t['v'] = 556;\n    t['w'] = 778;\n    t['x'] = 556;\n    t['y'] = 556;\n    t['z'] = 500;\n    t['braceleft'] = 389;\n    t['bar'] = 280;\n    t['braceright'] = 389;\n    t['asciitilde'] = 584;\n    t['exclamdown'] = 333;\n    t['cent'] = 556;\n    t['sterling'] = 556;\n    t['fraction'] = 167;\n    t['yen'] = 556;\n    t['florin'] = 556;\n    t['section'] = 556;\n    t['currency'] = 556;\n    t['quotesingle'] = 238;\n    t['quotedblleft'] = 500;\n    t['guillemotleft'] = 556;\n    t['guilsinglleft'] = 333;\n    t['guilsinglright'] = 333;\n    t['fi'] = 611;\n    t['fl'] = 611;\n    t['endash'] = 556;\n    t['dagger'] = 556;\n    t['daggerdbl'] = 556;\n    t['periodcentered'] = 278;\n    t['paragraph'] = 556;\n    t['bullet'] = 350;\n    t['quotesinglbase'] = 278;\n    t['quotedblbase'] = 500;\n    t['quotedblright'] = 500;\n    t['guillemotright'] = 556;\n    t['ellipsis'] = 1000;\n    t['perthousand'] = 1000;\n    t['questiondown'] = 611;\n    t['grave'] = 333;\n    t['acute'] = 333;\n    t['circumflex'] = 333;\n    t['tilde'] = 333;\n    t['macron'] = 333;\n    t['breve'] = 333;\n    t['dotaccent'] = 333;\n    t['dieresis'] = 333;\n    t['ring'] = 333;\n    t['cedilla'] = 333;\n    t['hungarumlaut'] = 333;\n    t['ogonek'] = 333;\n    t['caron'] = 333;\n    t['emdash'] = 1000;\n    t['AE'] = 1000;\n    t['ordfeminine'] = 370;\n    t['Lslash'] = 611;\n    t['Oslash'] = 778;\n    t['OE'] = 1000;\n    t['ordmasculine'] = 365;\n    t['ae'] = 889;\n    t['dotlessi'] = 278;\n    t['lslash'] = 278;\n    t['oslash'] = 611;\n    t['oe'] = 944;\n    t['germandbls'] = 611;\n    t['Idieresis'] = 278;\n    t['eacute'] = 556;\n    t['abreve'] = 556;\n    t['uhungarumlaut'] = 611;\n    t['ecaron'] = 556;\n    t['Ydieresis'] = 667;\n    t['divide'] = 584;\n    t['Yacute'] = 667;\n    t['Acircumflex'] = 722;\n    t['aacute'] = 556;\n    t['Ucircumflex'] = 722;\n    t['yacute'] = 556;\n    t['scommaaccent'] = 556;\n    t['ecircumflex'] = 556;\n    t['Uring'] = 722;\n    t['Udieresis'] = 722;\n    t['aogonek'] = 556;\n    t['Uacute'] = 722;\n    t['uogonek'] = 611;\n    t['Edieresis'] = 667;\n    t['Dcroat'] = 722;\n    t['commaaccent'] = 250;\n    t['copyright'] = 737;\n    t['Emacron'] = 667;\n    t['ccaron'] = 556;\n    t['aring'] = 556;\n    t['Ncommaaccent'] = 722;\n    t['lacute'] = 278;\n    t['agrave'] = 556;\n    t['Tcommaaccent'] = 611;\n    t['Cacute'] = 722;\n    t['atilde'] = 556;\n    t['Edotaccent'] = 667;\n    t['scaron'] = 556;\n    t['scedilla'] = 556;\n    t['iacute'] = 278;\n    t['lozenge'] = 494;\n    t['Rcaron'] = 722;\n    t['Gcommaaccent'] = 778;\n    t['ucircumflex'] = 611;\n    t['acircumflex'] = 556;\n    t['Amacron'] = 722;\n    t['rcaron'] = 389;\n    t['ccedilla'] = 556;\n    t['Zdotaccent'] = 611;\n    t['Thorn'] = 667;\n    t['Omacron'] = 778;\n    t['Racute'] = 722;\n    t['Sacute'] = 667;\n    t['dcaron'] = 743;\n    t['Umacron'] = 722;\n    t['uring'] = 611;\n    t['threesuperior'] = 333;\n    t['Ograve'] = 778;\n    t['Agrave'] = 722;\n    t['Abreve'] = 722;\n    t['multiply'] = 584;\n    t['uacute'] = 611;\n    t['Tcaron'] = 611;\n    t['partialdiff'] = 494;\n    t['ydieresis'] = 556;\n    t['Nacute'] = 722;\n    t['icircumflex'] = 278;\n    t['Ecircumflex'] = 667;\n    t['adieresis'] = 556;\n    t['edieresis'] = 556;\n    t['cacute'] = 556;\n    t['nacute'] = 611;\n    t['umacron'] = 611;\n    t['Ncaron'] = 722;\n    t['Iacute'] = 278;\n    t['plusminus'] = 584;\n    t['brokenbar'] = 280;\n    t['registered'] = 737;\n    t['Gbreve'] = 778;\n    t['Idotaccent'] = 278;\n    t['summation'] = 600;\n    t['Egrave'] = 667;\n    t['racute'] = 389;\n    t['omacron'] = 611;\n    t['Zacute'] = 611;\n    t['Zcaron'] = 611;\n    t['greaterequal'] = 549;\n    t['Eth'] = 722;\n    t['Ccedilla'] = 722;\n    t['lcommaaccent'] = 278;\n    t['tcaron'] = 389;\n    t['eogonek'] = 556;\n    t['Uogonek'] = 722;\n    t['Aacute'] = 722;\n    t['Adieresis'] = 722;\n    t['egrave'] = 556;\n    t['zacute'] = 500;\n    t['iogonek'] = 278;\n    t['Oacute'] = 778;\n    t['oacute'] = 611;\n    t['amacron'] = 556;\n    t['sacute'] = 556;\n    t['idieresis'] = 278;\n    t['Ocircumflex'] = 778;\n    t['Ugrave'] = 722;\n    t['Delta'] = 612;\n    t['thorn'] = 611;\n    t['twosuperior'] = 333;\n    t['Odieresis'] = 778;\n    t['mu'] = 611;\n    t['igrave'] = 278;\n    t['ohungarumlaut'] = 611;\n    t['Eogonek'] = 667;\n    t['dcroat'] = 611;\n    t['threequarters'] = 834;\n    t['Scedilla'] = 667;\n    t['lcaron'] = 400;\n    t['Kcommaaccent'] = 722;\n    t['Lacute'] = 611;\n    t['trademark'] = 1000;\n    t['edotaccent'] = 556;\n    t['Igrave'] = 278;\n    t['Imacron'] = 278;\n    t['Lcaron'] = 611;\n    t['onehalf'] = 834;\n    t['lessequal'] = 549;\n    t['ocircumflex'] = 611;\n    t['ntilde'] = 611;\n    t['Uhungarumlaut'] = 722;\n    t['Eacute'] = 667;\n    t['emacron'] = 556;\n    t['gbreve'] = 611;\n    t['onequarter'] = 834;\n    t['Scaron'] = 667;\n    t['Scommaaccent'] = 667;\n    t['Ohungarumlaut'] = 778;\n    t['degree'] = 400;\n    t['ograve'] = 611;\n    t['Ccaron'] = 722;\n    t['ugrave'] = 611;\n    t['radical'] = 549;\n    t['Dcaron'] = 722;\n    t['rcommaaccent'] = 389;\n    t['Ntilde'] = 722;\n    t['otilde'] = 611;\n    t['Rcommaaccent'] = 722;\n    t['Lcommaaccent'] = 611;\n    t['Atilde'] = 722;\n    t['Aogonek'] = 722;\n    t['Aring'] = 722;\n    t['Otilde'] = 778;\n    t['zdotaccent'] = 500;\n    t['Ecaron'] = 667;\n    t['Iogonek'] = 278;\n    t['kcommaaccent'] = 556;\n    t['minus'] = 584;\n    t['Icircumflex'] = 278;\n    t['ncaron'] = 611;\n    t['tcommaaccent'] = 333;\n    t['logicalnot'] = 584;\n    t['odieresis'] = 611;\n    t['udieresis'] = 611;\n    t['notequal'] = 549;\n    t['gcommaaccent'] = 611;\n    t['eth'] = 611;\n    t['zcaron'] = 500;\n    t['ncommaaccent'] = 611;\n    t['onesuperior'] = 333;\n    t['imacron'] = 278;\n    t['Euro'] = 556;\n  });\n  t['Helvetica-BoldOblique'] = getLookupTableFactory(function (t) {\n    t['space'] = 278;\n    t['exclam'] = 333;\n    t['quotedbl'] = 474;\n    t['numbersign'] = 556;\n    t['dollar'] = 556;\n    t['percent'] = 889;\n    t['ampersand'] = 722;\n    t['quoteright'] = 278;\n    t['parenleft'] = 333;\n    t['parenright'] = 333;\n    t['asterisk'] = 389;\n    t['plus'] = 584;\n    t['comma'] = 278;\n    t['hyphen'] = 333;\n    t['period'] = 278;\n    t['slash'] = 278;\n    t['zero'] = 556;\n    t['one'] = 556;\n    t['two'] = 556;\n    t['three'] = 556;\n    t['four'] = 556;\n    t['five'] = 556;\n    t['six'] = 556;\n    t['seven'] = 556;\n    t['eight'] = 556;\n    t['nine'] = 556;\n    t['colon'] = 333;\n    t['semicolon'] = 333;\n    t['less'] = 584;\n    t['equal'] = 584;\n    t['greater'] = 584;\n    t['question'] = 611;\n    t['at'] = 975;\n    t['A'] = 722;\n    t['B'] = 722;\n    t['C'] = 722;\n    t['D'] = 722;\n    t['E'] = 667;\n    t['F'] = 611;\n    t['G'] = 778;\n    t['H'] = 722;\n    t['I'] = 278;\n    t['J'] = 556;\n    t['K'] = 722;\n    t['L'] = 611;\n    t['M'] = 833;\n    t['N'] = 722;\n    t['O'] = 778;\n    t['P'] = 667;\n    t['Q'] = 778;\n    t['R'] = 722;\n    t['S'] = 667;\n    t['T'] = 611;\n    t['U'] = 722;\n    t['V'] = 667;\n    t['W'] = 944;\n    t['X'] = 667;\n    t['Y'] = 667;\n    t['Z'] = 611;\n    t['bracketleft'] = 333;\n    t['backslash'] = 278;\n    t['bracketright'] = 333;\n    t['asciicircum'] = 584;\n    t['underscore'] = 556;\n    t['quoteleft'] = 278;\n    t['a'] = 556;\n    t['b'] = 611;\n    t['c'] = 556;\n    t['d'] = 611;\n    t['e'] = 556;\n    t['f'] = 333;\n    t['g'] = 611;\n    t['h'] = 611;\n    t['i'] = 278;\n    t['j'] = 278;\n    t['k'] = 556;\n    t['l'] = 278;\n    t['m'] = 889;\n    t['n'] = 611;\n    t['o'] = 611;\n    t['p'] = 611;\n    t['q'] = 611;\n    t['r'] = 389;\n    t['s'] = 556;\n    t['t'] = 333;\n    t['u'] = 611;\n    t['v'] = 556;\n    t['w'] = 778;\n    t['x'] = 556;\n    t['y'] = 556;\n    t['z'] = 500;\n    t['braceleft'] = 389;\n    t['bar'] = 280;\n    t['braceright'] = 389;\n    t['asciitilde'] = 584;\n    t['exclamdown'] = 333;\n    t['cent'] = 556;\n    t['sterling'] = 556;\n    t['fraction'] = 167;\n    t['yen'] = 556;\n    t['florin'] = 556;\n    t['section'] = 556;\n    t['currency'] = 556;\n    t['quotesingle'] = 238;\n    t['quotedblleft'] = 500;\n    t['guillemotleft'] = 556;\n    t['guilsinglleft'] = 333;\n    t['guilsinglright'] = 333;\n    t['fi'] = 611;\n    t['fl'] = 611;\n    t['endash'] = 556;\n    t['dagger'] = 556;\n    t['daggerdbl'] = 556;\n    t['periodcentered'] = 278;\n    t['paragraph'] = 556;\n    t['bullet'] = 350;\n    t['quotesinglbase'] = 278;\n    t['quotedblbase'] = 500;\n    t['quotedblright'] = 500;\n    t['guillemotright'] = 556;\n    t['ellipsis'] = 1000;\n    t['perthousand'] = 1000;\n    t['questiondown'] = 611;\n    t['grave'] = 333;\n    t['acute'] = 333;\n    t['circumflex'] = 333;\n    t['tilde'] = 333;\n    t['macron'] = 333;\n    t['breve'] = 333;\n    t['dotaccent'] = 333;\n    t['dieresis'] = 333;\n    t['ring'] = 333;\n    t['cedilla'] = 333;\n    t['hungarumlaut'] = 333;\n    t['ogonek'] = 333;\n    t['caron'] = 333;\n    t['emdash'] = 1000;\n    t['AE'] = 1000;\n    t['ordfeminine'] = 370;\n    t['Lslash'] = 611;\n    t['Oslash'] = 778;\n    t['OE'] = 1000;\n    t['ordmasculine'] = 365;\n    t['ae'] = 889;\n    t['dotlessi'] = 278;\n    t['lslash'] = 278;\n    t['oslash'] = 611;\n    t['oe'] = 944;\n    t['germandbls'] = 611;\n    t['Idieresis'] = 278;\n    t['eacute'] = 556;\n    t['abreve'] = 556;\n    t['uhungarumlaut'] = 611;\n    t['ecaron'] = 556;\n    t['Ydieresis'] = 667;\n    t['divide'] = 584;\n    t['Yacute'] = 667;\n    t['Acircumflex'] = 722;\n    t['aacute'] = 556;\n    t['Ucircumflex'] = 722;\n    t['yacute'] = 556;\n    t['scommaaccent'] = 556;\n    t['ecircumflex'] = 556;\n    t['Uring'] = 722;\n    t['Udieresis'] = 722;\n    t['aogonek'] = 556;\n    t['Uacute'] = 722;\n    t['uogonek'] = 611;\n    t['Edieresis'] = 667;\n    t['Dcroat'] = 722;\n    t['commaaccent'] = 250;\n    t['copyright'] = 737;\n    t['Emacron'] = 667;\n    t['ccaron'] = 556;\n    t['aring'] = 556;\n    t['Ncommaaccent'] = 722;\n    t['lacute'] = 278;\n    t['agrave'] = 556;\n    t['Tcommaaccent'] = 611;\n    t['Cacute'] = 722;\n    t['atilde'] = 556;\n    t['Edotaccent'] = 667;\n    t['scaron'] = 556;\n    t['scedilla'] = 556;\n    t['iacute'] = 278;\n    t['lozenge'] = 494;\n    t['Rcaron'] = 722;\n    t['Gcommaaccent'] = 778;\n    t['ucircumflex'] = 611;\n    t['acircumflex'] = 556;\n    t['Amacron'] = 722;\n    t['rcaron'] = 389;\n    t['ccedilla'] = 556;\n    t['Zdotaccent'] = 611;\n    t['Thorn'] = 667;\n    t['Omacron'] = 778;\n    t['Racute'] = 722;\n    t['Sacute'] = 667;\n    t['dcaron'] = 743;\n    t['Umacron'] = 722;\n    t['uring'] = 611;\n    t['threesuperior'] = 333;\n    t['Ograve'] = 778;\n    t['Agrave'] = 722;\n    t['Abreve'] = 722;\n    t['multiply'] = 584;\n    t['uacute'] = 611;\n    t['Tcaron'] = 611;\n    t['partialdiff'] = 494;\n    t['ydieresis'] = 556;\n    t['Nacute'] = 722;\n    t['icircumflex'] = 278;\n    t['Ecircumflex'] = 667;\n    t['adieresis'] = 556;\n    t['edieresis'] = 556;\n    t['cacute'] = 556;\n    t['nacute'] = 611;\n    t['umacron'] = 611;\n    t['Ncaron'] = 722;\n    t['Iacute'] = 278;\n    t['plusminus'] = 584;\n    t['brokenbar'] = 280;\n    t['registered'] = 737;\n    t['Gbreve'] = 778;\n    t['Idotaccent'] = 278;\n    t['summation'] = 600;\n    t['Egrave'] = 667;\n    t['racute'] = 389;\n    t['omacron'] = 611;\n    t['Zacute'] = 611;\n    t['Zcaron'] = 611;\n    t['greaterequal'] = 549;\n    t['Eth'] = 722;\n    t['Ccedilla'] = 722;\n    t['lcommaaccent'] = 278;\n    t['tcaron'] = 389;\n    t['eogonek'] = 556;\n    t['Uogonek'] = 722;\n    t['Aacute'] = 722;\n    t['Adieresis'] = 722;\n    t['egrave'] = 556;\n    t['zacute'] = 500;\n    t['iogonek'] = 278;\n    t['Oacute'] = 778;\n    t['oacute'] = 611;\n    t['amacron'] = 556;\n    t['sacute'] = 556;\n    t['idieresis'] = 278;\n    t['Ocircumflex'] = 778;\n    t['Ugrave'] = 722;\n    t['Delta'] = 612;\n    t['thorn'] = 611;\n    t['twosuperior'] = 333;\n    t['Odieresis'] = 778;\n    t['mu'] = 611;\n    t['igrave'] = 278;\n    t['ohungarumlaut'] = 611;\n    t['Eogonek'] = 667;\n    t['dcroat'] = 611;\n    t['threequarters'] = 834;\n    t['Scedilla'] = 667;\n    t['lcaron'] = 400;\n    t['Kcommaaccent'] = 722;\n    t['Lacute'] = 611;\n    t['trademark'] = 1000;\n    t['edotaccent'] = 556;\n    t['Igrave'] = 278;\n    t['Imacron'] = 278;\n    t['Lcaron'] = 611;\n    t['onehalf'] = 834;\n    t['lessequal'] = 549;\n    t['ocircumflex'] = 611;\n    t['ntilde'] = 611;\n    t['Uhungarumlaut'] = 722;\n    t['Eacute'] = 667;\n    t['emacron'] = 556;\n    t['gbreve'] = 611;\n    t['onequarter'] = 834;\n    t['Scaron'] = 667;\n    t['Scommaaccent'] = 667;\n    t['Ohungarumlaut'] = 778;\n    t['degree'] = 400;\n    t['ograve'] = 611;\n    t['Ccaron'] = 722;\n    t['ugrave'] = 611;\n    t['radical'] = 549;\n    t['Dcaron'] = 722;\n    t['rcommaaccent'] = 389;\n    t['Ntilde'] = 722;\n    t['otilde'] = 611;\n    t['Rcommaaccent'] = 722;\n    t['Lcommaaccent'] = 611;\n    t['Atilde'] = 722;\n    t['Aogonek'] = 722;\n    t['Aring'] = 722;\n    t['Otilde'] = 778;\n    t['zdotaccent'] = 500;\n    t['Ecaron'] = 667;\n    t['Iogonek'] = 278;\n    t['kcommaaccent'] = 556;\n    t['minus'] = 584;\n    t['Icircumflex'] = 278;\n    t['ncaron'] = 611;\n    t['tcommaaccent'] = 333;\n    t['logicalnot'] = 584;\n    t['odieresis'] = 611;\n    t['udieresis'] = 611;\n    t['notequal'] = 549;\n    t['gcommaaccent'] = 611;\n    t['eth'] = 611;\n    t['zcaron'] = 500;\n    t['ncommaaccent'] = 611;\n    t['onesuperior'] = 333;\n    t['imacron'] = 278;\n    t['Euro'] = 556;\n  });\n  t['Helvetica-Oblique'] = getLookupTableFactory(function (t) {\n    t['space'] = 278;\n    t['exclam'] = 278;\n    t['quotedbl'] = 355;\n    t['numbersign'] = 556;\n    t['dollar'] = 556;\n    t['percent'] = 889;\n    t['ampersand'] = 667;\n    t['quoteright'] = 222;\n    t['parenleft'] = 333;\n    t['parenright'] = 333;\n    t['asterisk'] = 389;\n    t['plus'] = 584;\n    t['comma'] = 278;\n    t['hyphen'] = 333;\n    t['period'] = 278;\n    t['slash'] = 278;\n    t['zero'] = 556;\n    t['one'] = 556;\n    t['two'] = 556;\n    t['three'] = 556;\n    t['four'] = 556;\n    t['five'] = 556;\n    t['six'] = 556;\n    t['seven'] = 556;\n    t['eight'] = 556;\n    t['nine'] = 556;\n    t['colon'] = 278;\n    t['semicolon'] = 278;\n    t['less'] = 584;\n    t['equal'] = 584;\n    t['greater'] = 584;\n    t['question'] = 556;\n    t['at'] = 1015;\n    t['A'] = 667;\n    t['B'] = 667;\n    t['C'] = 722;\n    t['D'] = 722;\n    t['E'] = 667;\n    t['F'] = 611;\n    t['G'] = 778;\n    t['H'] = 722;\n    t['I'] = 278;\n    t['J'] = 500;\n    t['K'] = 667;\n    t['L'] = 556;\n    t['M'] = 833;\n    t['N'] = 722;\n    t['O'] = 778;\n    t['P'] = 667;\n    t['Q'] = 778;\n    t['R'] = 722;\n    t['S'] = 667;\n    t['T'] = 611;\n    t['U'] = 722;\n    t['V'] = 667;\n    t['W'] = 944;\n    t['X'] = 667;\n    t['Y'] = 667;\n    t['Z'] = 611;\n    t['bracketleft'] = 278;\n    t['backslash'] = 278;\n    t['bracketright'] = 278;\n    t['asciicircum'] = 469;\n    t['underscore'] = 556;\n    t['quoteleft'] = 222;\n    t['a'] = 556;\n    t['b'] = 556;\n    t['c'] = 500;\n    t['d'] = 556;\n    t['e'] = 556;\n    t['f'] = 278;\n    t['g'] = 556;\n    t['h'] = 556;\n    t['i'] = 222;\n    t['j'] = 222;\n    t['k'] = 500;\n    t['l'] = 222;\n    t['m'] = 833;\n    t['n'] = 556;\n    t['o'] = 556;\n    t['p'] = 556;\n    t['q'] = 556;\n    t['r'] = 333;\n    t['s'] = 500;\n    t['t'] = 278;\n    t['u'] = 556;\n    t['v'] = 500;\n    t['w'] = 722;\n    t['x'] = 500;\n    t['y'] = 500;\n    t['z'] = 500;\n    t['braceleft'] = 334;\n    t['bar'] = 260;\n    t['braceright'] = 334;\n    t['asciitilde'] = 584;\n    t['exclamdown'] = 333;\n    t['cent'] = 556;\n    t['sterling'] = 556;\n    t['fraction'] = 167;\n    t['yen'] = 556;\n    t['florin'] = 556;\n    t['section'] = 556;\n    t['currency'] = 556;\n    t['quotesingle'] = 191;\n    t['quotedblleft'] = 333;\n    t['guillemotleft'] = 556;\n    t['guilsinglleft'] = 333;\n    t['guilsinglright'] = 333;\n    t['fi'] = 500;\n    t['fl'] = 500;\n    t['endash'] = 556;\n    t['dagger'] = 556;\n    t['daggerdbl'] = 556;\n    t['periodcentered'] = 278;\n    t['paragraph'] = 537;\n    t['bullet'] = 350;\n    t['quotesinglbase'] = 222;\n    t['quotedblbase'] = 333;\n    t['quotedblright'] = 333;\n    t['guillemotright'] = 556;\n    t['ellipsis'] = 1000;\n    t['perthousand'] = 1000;\n    t['questiondown'] = 611;\n    t['grave'] = 333;\n    t['acute'] = 333;\n    t['circumflex'] = 333;\n    t['tilde'] = 333;\n    t['macron'] = 333;\n    t['breve'] = 333;\n    t['dotaccent'] = 333;\n    t['dieresis'] = 333;\n    t['ring'] = 333;\n    t['cedilla'] = 333;\n    t['hungarumlaut'] = 333;\n    t['ogonek'] = 333;\n    t['caron'] = 333;\n    t['emdash'] = 1000;\n    t['AE'] = 1000;\n    t['ordfeminine'] = 370;\n    t['Lslash'] = 556;\n    t['Oslash'] = 778;\n    t['OE'] = 1000;\n    t['ordmasculine'] = 365;\n    t['ae'] = 889;\n    t['dotlessi'] = 278;\n    t['lslash'] = 222;\n    t['oslash'] = 611;\n    t['oe'] = 944;\n    t['germandbls'] = 611;\n    t['Idieresis'] = 278;\n    t['eacute'] = 556;\n    t['abreve'] = 556;\n    t['uhungarumlaut'] = 556;\n    t['ecaron'] = 556;\n    t['Ydieresis'] = 667;\n    t['divide'] = 584;\n    t['Yacute'] = 667;\n    t['Acircumflex'] = 667;\n    t['aacute'] = 556;\n    t['Ucircumflex'] = 722;\n    t['yacute'] = 500;\n    t['scommaaccent'] = 500;\n    t['ecircumflex'] = 556;\n    t['Uring'] = 722;\n    t['Udieresis'] = 722;\n    t['aogonek'] = 556;\n    t['Uacute'] = 722;\n    t['uogonek'] = 556;\n    t['Edieresis'] = 667;\n    t['Dcroat'] = 722;\n    t['commaaccent'] = 250;\n    t['copyright'] = 737;\n    t['Emacron'] = 667;\n    t['ccaron'] = 500;\n    t['aring'] = 556;\n    t['Ncommaaccent'] = 722;\n    t['lacute'] = 222;\n    t['agrave'] = 556;\n    t['Tcommaaccent'] = 611;\n    t['Cacute'] = 722;\n    t['atilde'] = 556;\n    t['Edotaccent'] = 667;\n    t['scaron'] = 500;\n    t['scedilla'] = 500;\n    t['iacute'] = 278;\n    t['lozenge'] = 471;\n    t['Rcaron'] = 722;\n    t['Gcommaaccent'] = 778;\n    t['ucircumflex'] = 556;\n    t['acircumflex'] = 556;\n    t['Amacron'] = 667;\n    t['rcaron'] = 333;\n    t['ccedilla'] = 500;\n    t['Zdotaccent'] = 611;\n    t['Thorn'] = 667;\n    t['Omacron'] = 778;\n    t['Racute'] = 722;\n    t['Sacute'] = 667;\n    t['dcaron'] = 643;\n    t['Umacron'] = 722;\n    t['uring'] = 556;\n    t['threesuperior'] = 333;\n    t['Ograve'] = 778;\n    t['Agrave'] = 667;\n    t['Abreve'] = 667;\n    t['multiply'] = 584;\n    t['uacute'] = 556;\n    t['Tcaron'] = 611;\n    t['partialdiff'] = 476;\n    t['ydieresis'] = 500;\n    t['Nacute'] = 722;\n    t['icircumflex'] = 278;\n    t['Ecircumflex'] = 667;\n    t['adieresis'] = 556;\n    t['edieresis'] = 556;\n    t['cacute'] = 500;\n    t['nacute'] = 556;\n    t['umacron'] = 556;\n    t['Ncaron'] = 722;\n    t['Iacute'] = 278;\n    t['plusminus'] = 584;\n    t['brokenbar'] = 260;\n    t['registered'] = 737;\n    t['Gbreve'] = 778;\n    t['Idotaccent'] = 278;\n    t['summation'] = 600;\n    t['Egrave'] = 667;\n    t['racute'] = 333;\n    t['omacron'] = 556;\n    t['Zacute'] = 611;\n    t['Zcaron'] = 611;\n    t['greaterequal'] = 549;\n    t['Eth'] = 722;\n    t['Ccedilla'] = 722;\n    t['lcommaaccent'] = 222;\n    t['tcaron'] = 317;\n    t['eogonek'] = 556;\n    t['Uogonek'] = 722;\n    t['Aacute'] = 667;\n    t['Adieresis'] = 667;\n    t['egrave'] = 556;\n    t['zacute'] = 500;\n    t['iogonek'] = 222;\n    t['Oacute'] = 778;\n    t['oacute'] = 556;\n    t['amacron'] = 556;\n    t['sacute'] = 500;\n    t['idieresis'] = 278;\n    t['Ocircumflex'] = 778;\n    t['Ugrave'] = 722;\n    t['Delta'] = 612;\n    t['thorn'] = 556;\n    t['twosuperior'] = 333;\n    t['Odieresis'] = 778;\n    t['mu'] = 556;\n    t['igrave'] = 278;\n    t['ohungarumlaut'] = 556;\n    t['Eogonek'] = 667;\n    t['dcroat'] = 556;\n    t['threequarters'] = 834;\n    t['Scedilla'] = 667;\n    t['lcaron'] = 299;\n    t['Kcommaaccent'] = 667;\n    t['Lacute'] = 556;\n    t['trademark'] = 1000;\n    t['edotaccent'] = 556;\n    t['Igrave'] = 278;\n    t['Imacron'] = 278;\n    t['Lcaron'] = 556;\n    t['onehalf'] = 834;\n    t['lessequal'] = 549;\n    t['ocircumflex'] = 556;\n    t['ntilde'] = 556;\n    t['Uhungarumlaut'] = 722;\n    t['Eacute'] = 667;\n    t['emacron'] = 556;\n    t['gbreve'] = 556;\n    t['onequarter'] = 834;\n    t['Scaron'] = 667;\n    t['Scommaaccent'] = 667;\n    t['Ohungarumlaut'] = 778;\n    t['degree'] = 400;\n    t['ograve'] = 556;\n    t['Ccaron'] = 722;\n    t['ugrave'] = 556;\n    t['radical'] = 453;\n    t['Dcaron'] = 722;\n    t['rcommaaccent'] = 333;\n    t['Ntilde'] = 722;\n    t['otilde'] = 556;\n    t['Rcommaaccent'] = 722;\n    t['Lcommaaccent'] = 556;\n    t['Atilde'] = 667;\n    t['Aogonek'] = 667;\n    t['Aring'] = 667;\n    t['Otilde'] = 778;\n    t['zdotaccent'] = 500;\n    t['Ecaron'] = 667;\n    t['Iogonek'] = 278;\n    t['kcommaaccent'] = 500;\n    t['minus'] = 584;\n    t['Icircumflex'] = 278;\n    t['ncaron'] = 556;\n    t['tcommaaccent'] = 278;\n    t['logicalnot'] = 584;\n    t['odieresis'] = 556;\n    t['udieresis'] = 556;\n    t['notequal'] = 549;\n    t['gcommaaccent'] = 556;\n    t['eth'] = 556;\n    t['zcaron'] = 500;\n    t['ncommaaccent'] = 556;\n    t['onesuperior'] = 333;\n    t['imacron'] = 278;\n    t['Euro'] = 556;\n  });\n  t['Symbol'] = getLookupTableFactory(function (t) {\n    t['space'] = 250;\n    t['exclam'] = 333;\n    t['universal'] = 713;\n    t['numbersign'] = 500;\n    t['existential'] = 549;\n    t['percent'] = 833;\n    t['ampersand'] = 778;\n    t['suchthat'] = 439;\n    t['parenleft'] = 333;\n    t['parenright'] = 333;\n    t['asteriskmath'] = 500;\n    t['plus'] = 549;\n    t['comma'] = 250;\n    t['minus'] = 549;\n    t['period'] = 250;\n    t['slash'] = 278;\n    t['zero'] = 500;\n    t['one'] = 500;\n    t['two'] = 500;\n    t['three'] = 500;\n    t['four'] = 500;\n    t['five'] = 500;\n    t['six'] = 500;\n    t['seven'] = 500;\n    t['eight'] = 500;\n    t['nine'] = 500;\n    t['colon'] = 278;\n    t['semicolon'] = 278;\n    t['less'] = 549;\n    t['equal'] = 549;\n    t['greater'] = 549;\n    t['question'] = 444;\n    t['congruent'] = 549;\n    t['Alpha'] = 722;\n    t['Beta'] = 667;\n    t['Chi'] = 722;\n    t['Delta'] = 612;\n    t['Epsilon'] = 611;\n    t['Phi'] = 763;\n    t['Gamma'] = 603;\n    t['Eta'] = 722;\n    t['Iota'] = 333;\n    t['theta1'] = 631;\n    t['Kappa'] = 722;\n    t['Lambda'] = 686;\n    t['Mu'] = 889;\n    t['Nu'] = 722;\n    t['Omicron'] = 722;\n    t['Pi'] = 768;\n    t['Theta'] = 741;\n    t['Rho'] = 556;\n    t['Sigma'] = 592;\n    t['Tau'] = 611;\n    t['Upsilon'] = 690;\n    t['sigma1'] = 439;\n    t['Omega'] = 768;\n    t['Xi'] = 645;\n    t['Psi'] = 795;\n    t['Zeta'] = 611;\n    t['bracketleft'] = 333;\n    t['therefore'] = 863;\n    t['bracketright'] = 333;\n    t['perpendicular'] = 658;\n    t['underscore'] = 500;\n    t['radicalex'] = 500;\n    t['alpha'] = 631;\n    t['beta'] = 549;\n    t['chi'] = 549;\n    t['delta'] = 494;\n    t['epsilon'] = 439;\n    t['phi'] = 521;\n    t['gamma'] = 411;\n    t['eta'] = 603;\n    t['iota'] = 329;\n    t['phi1'] = 603;\n    t['kappa'] = 549;\n    t['lambda'] = 549;\n    t['mu'] = 576;\n    t['nu'] = 521;\n    t['omicron'] = 549;\n    t['pi'] = 549;\n    t['theta'] = 521;\n    t['rho'] = 549;\n    t['sigma'] = 603;\n    t['tau'] = 439;\n    t['upsilon'] = 576;\n    t['omega1'] = 713;\n    t['omega'] = 686;\n    t['xi'] = 493;\n    t['psi'] = 686;\n    t['zeta'] = 494;\n    t['braceleft'] = 480;\n    t['bar'] = 200;\n    t['braceright'] = 480;\n    t['similar'] = 549;\n    t['Euro'] = 750;\n    t['Upsilon1'] = 620;\n    t['minute'] = 247;\n    t['lessequal'] = 549;\n    t['fraction'] = 167;\n    t['infinity'] = 713;\n    t['florin'] = 500;\n    t['club'] = 753;\n    t['diamond'] = 753;\n    t['heart'] = 753;\n    t['spade'] = 753;\n    t['arrowboth'] = 1042;\n    t['arrowleft'] = 987;\n    t['arrowup'] = 603;\n    t['arrowright'] = 987;\n    t['arrowdown'] = 603;\n    t['degree'] = 400;\n    t['plusminus'] = 549;\n    t['second'] = 411;\n    t['greaterequal'] = 549;\n    t['multiply'] = 549;\n    t['proportional'] = 713;\n    t['partialdiff'] = 494;\n    t['bullet'] = 460;\n    t['divide'] = 549;\n    t['notequal'] = 549;\n    t['equivalence'] = 549;\n    t['approxequal'] = 549;\n    t['ellipsis'] = 1000;\n    t['arrowvertex'] = 603;\n    t['arrowhorizex'] = 1000;\n    t['carriagereturn'] = 658;\n    t['aleph'] = 823;\n    t['Ifraktur'] = 686;\n    t['Rfraktur'] = 795;\n    t['weierstrass'] = 987;\n    t['circlemultiply'] = 768;\n    t['circleplus'] = 768;\n    t['emptyset'] = 823;\n    t['intersection'] = 768;\n    t['union'] = 768;\n    t['propersuperset'] = 713;\n    t['reflexsuperset'] = 713;\n    t['notsubset'] = 713;\n    t['propersubset'] = 713;\n    t['reflexsubset'] = 713;\n    t['element'] = 713;\n    t['notelement'] = 713;\n    t['angle'] = 768;\n    t['gradient'] = 713;\n    t['registerserif'] = 790;\n    t['copyrightserif'] = 790;\n    t['trademarkserif'] = 890;\n    t['product'] = 823;\n    t['radical'] = 549;\n    t['dotmath'] = 250;\n    t['logicalnot'] = 713;\n    t['logicaland'] = 603;\n    t['logicalor'] = 603;\n    t['arrowdblboth'] = 1042;\n    t['arrowdblleft'] = 987;\n    t['arrowdblup'] = 603;\n    t['arrowdblright'] = 987;\n    t['arrowdbldown'] = 603;\n    t['lozenge'] = 494;\n    t['angleleft'] = 329;\n    t['registersans'] = 790;\n    t['copyrightsans'] = 790;\n    t['trademarksans'] = 786;\n    t['summation'] = 713;\n    t['parenlefttp'] = 384;\n    t['parenleftex'] = 384;\n    t['parenleftbt'] = 384;\n    t['bracketlefttp'] = 384;\n    t['bracketleftex'] = 384;\n    t['bracketleftbt'] = 384;\n    t['bracelefttp'] = 494;\n    t['braceleftmid'] = 494;\n    t['braceleftbt'] = 494;\n    t['braceex'] = 494;\n    t['angleright'] = 329;\n    t['integral'] = 274;\n    t['integraltp'] = 686;\n    t['integralex'] = 686;\n    t['integralbt'] = 686;\n    t['parenrighttp'] = 384;\n    t['parenrightex'] = 384;\n    t['parenrightbt'] = 384;\n    t['bracketrighttp'] = 384;\n    t['bracketrightex'] = 384;\n    t['bracketrightbt'] = 384;\n    t['bracerighttp'] = 494;\n    t['bracerightmid'] = 494;\n    t['bracerightbt'] = 494;\n    t['apple'] = 790;\n  });\n  t['Times-Roman'] = getLookupTableFactory(function (t) {\n    t['space'] = 250;\n    t['exclam'] = 333;\n    t['quotedbl'] = 408;\n    t['numbersign'] = 500;\n    t['dollar'] = 500;\n    t['percent'] = 833;\n    t['ampersand'] = 778;\n    t['quoteright'] = 333;\n    t['parenleft'] = 333;\n    t['parenright'] = 333;\n    t['asterisk'] = 500;\n    t['plus'] = 564;\n    t['comma'] = 250;\n    t['hyphen'] = 333;\n    t['period'] = 250;\n    t['slash'] = 278;\n    t['zero'] = 500;\n    t['one'] = 500;\n    t['two'] = 500;\n    t['three'] = 500;\n    t['four'] = 500;\n    t['five'] = 500;\n    t['six'] = 500;\n    t['seven'] = 500;\n    t['eight'] = 500;\n    t['nine'] = 500;\n    t['colon'] = 278;\n    t['semicolon'] = 278;\n    t['less'] = 564;\n    t['equal'] = 564;\n    t['greater'] = 564;\n    t['question'] = 444;\n    t['at'] = 921;\n    t['A'] = 722;\n    t['B'] = 667;\n    t['C'] = 667;\n    t['D'] = 722;\n    t['E'] = 611;\n    t['F'] = 556;\n    t['G'] = 722;\n    t['H'] = 722;\n    t['I'] = 333;\n    t['J'] = 389;\n    t['K'] = 722;\n    t['L'] = 611;\n    t['M'] = 889;\n    t['N'] = 722;\n    t['O'] = 722;\n    t['P'] = 556;\n    t['Q'] = 722;\n    t['R'] = 667;\n    t['S'] = 556;\n    t['T'] = 611;\n    t['U'] = 722;\n    t['V'] = 722;\n    t['W'] = 944;\n    t['X'] = 722;\n    t['Y'] = 722;\n    t['Z'] = 611;\n    t['bracketleft'] = 333;\n    t['backslash'] = 278;\n    t['bracketright'] = 333;\n    t['asciicircum'] = 469;\n    t['underscore'] = 500;\n    t['quoteleft'] = 333;\n    t['a'] = 444;\n    t['b'] = 500;\n    t['c'] = 444;\n    t['d'] = 500;\n    t['e'] = 444;\n    t['f'] = 333;\n    t['g'] = 500;\n    t['h'] = 500;\n    t['i'] = 278;\n    t['j'] = 278;\n    t['k'] = 500;\n    t['l'] = 278;\n    t['m'] = 778;\n    t['n'] = 500;\n    t['o'] = 500;\n    t['p'] = 500;\n    t['q'] = 500;\n    t['r'] = 333;\n    t['s'] = 389;\n    t['t'] = 278;\n    t['u'] = 500;\n    t['v'] = 500;\n    t['w'] = 722;\n    t['x'] = 500;\n    t['y'] = 500;\n    t['z'] = 444;\n    t['braceleft'] = 480;\n    t['bar'] = 200;\n    t['braceright'] = 480;\n    t['asciitilde'] = 541;\n    t['exclamdown'] = 333;\n    t['cent'] = 500;\n    t['sterling'] = 500;\n    t['fraction'] = 167;\n    t['yen'] = 500;\n    t['florin'] = 500;\n    t['section'] = 500;\n    t['currency'] = 500;\n    t['quotesingle'] = 180;\n    t['quotedblleft'] = 444;\n    t['guillemotleft'] = 500;\n    t['guilsinglleft'] = 333;\n    t['guilsinglright'] = 333;\n    t['fi'] = 556;\n    t['fl'] = 556;\n    t['endash'] = 500;\n    t['dagger'] = 500;\n    t['daggerdbl'] = 500;\n    t['periodcentered'] = 250;\n    t['paragraph'] = 453;\n    t['bullet'] = 350;\n    t['quotesinglbase'] = 333;\n    t['quotedblbase'] = 444;\n    t['quotedblright'] = 444;\n    t['guillemotright'] = 500;\n    t['ellipsis'] = 1000;\n    t['perthousand'] = 1000;\n    t['questiondown'] = 444;\n    t['grave'] = 333;\n    t['acute'] = 333;\n    t['circumflex'] = 333;\n    t['tilde'] = 333;\n    t['macron'] = 333;\n    t['breve'] = 333;\n    t['dotaccent'] = 333;\n    t['dieresis'] = 333;\n    t['ring'] = 333;\n    t['cedilla'] = 333;\n    t['hungarumlaut'] = 333;\n    t['ogonek'] = 333;\n    t['caron'] = 333;\n    t['emdash'] = 1000;\n    t['AE'] = 889;\n    t['ordfeminine'] = 276;\n    t['Lslash'] = 611;\n    t['Oslash'] = 722;\n    t['OE'] = 889;\n    t['ordmasculine'] = 310;\n    t['ae'] = 667;\n    t['dotlessi'] = 278;\n    t['lslash'] = 278;\n    t['oslash'] = 500;\n    t['oe'] = 722;\n    t['germandbls'] = 500;\n    t['Idieresis'] = 333;\n    t['eacute'] = 444;\n    t['abreve'] = 444;\n    t['uhungarumlaut'] = 500;\n    t['ecaron'] = 444;\n    t['Ydieresis'] = 722;\n    t['divide'] = 564;\n    t['Yacute'] = 722;\n    t['Acircumflex'] = 722;\n    t['aacute'] = 444;\n    t['Ucircumflex'] = 722;\n    t['yacute'] = 500;\n    t['scommaaccent'] = 389;\n    t['ecircumflex'] = 444;\n    t['Uring'] = 722;\n    t['Udieresis'] = 722;\n    t['aogonek'] = 444;\n    t['Uacute'] = 722;\n    t['uogonek'] = 500;\n    t['Edieresis'] = 611;\n    t['Dcroat'] = 722;\n    t['commaaccent'] = 250;\n    t['copyright'] = 760;\n    t['Emacron'] = 611;\n    t['ccaron'] = 444;\n    t['aring'] = 444;\n    t['Ncommaaccent'] = 722;\n    t['lacute'] = 278;\n    t['agrave'] = 444;\n    t['Tcommaaccent'] = 611;\n    t['Cacute'] = 667;\n    t['atilde'] = 444;\n    t['Edotaccent'] = 611;\n    t['scaron'] = 389;\n    t['scedilla'] = 389;\n    t['iacute'] = 278;\n    t['lozenge'] = 471;\n    t['Rcaron'] = 667;\n    t['Gcommaaccent'] = 722;\n    t['ucircumflex'] = 500;\n    t['acircumflex'] = 444;\n    t['Amacron'] = 722;\n    t['rcaron'] = 333;\n    t['ccedilla'] = 444;\n    t['Zdotaccent'] = 611;\n    t['Thorn'] = 556;\n    t['Omacron'] = 722;\n    t['Racute'] = 667;\n    t['Sacute'] = 556;\n    t['dcaron'] = 588;\n    t['Umacron'] = 722;\n    t['uring'] = 500;\n    t['threesuperior'] = 300;\n    t['Ograve'] = 722;\n    t['Agrave'] = 722;\n    t['Abreve'] = 722;\n    t['multiply'] = 564;\n    t['uacute'] = 500;\n    t['Tcaron'] = 611;\n    t['partialdiff'] = 476;\n    t['ydieresis'] = 500;\n    t['Nacute'] = 722;\n    t['icircumflex'] = 278;\n    t['Ecircumflex'] = 611;\n    t['adieresis'] = 444;\n    t['edieresis'] = 444;\n    t['cacute'] = 444;\n    t['nacute'] = 500;\n    t['umacron'] = 500;\n    t['Ncaron'] = 722;\n    t['Iacute'] = 333;\n    t['plusminus'] = 564;\n    t['brokenbar'] = 200;\n    t['registered'] = 760;\n    t['Gbreve'] = 722;\n    t['Idotaccent'] = 333;\n    t['summation'] = 600;\n    t['Egrave'] = 611;\n    t['racute'] = 333;\n    t['omacron'] = 500;\n    t['Zacute'] = 611;\n    t['Zcaron'] = 611;\n    t['greaterequal'] = 549;\n    t['Eth'] = 722;\n    t['Ccedilla'] = 667;\n    t['lcommaaccent'] = 278;\n    t['tcaron'] = 326;\n    t['eogonek'] = 444;\n    t['Uogonek'] = 722;\n    t['Aacute'] = 722;\n    t['Adieresis'] = 722;\n    t['egrave'] = 444;\n    t['zacute'] = 444;\n    t['iogonek'] = 278;\n    t['Oacute'] = 722;\n    t['oacute'] = 500;\n    t['amacron'] = 444;\n    t['sacute'] = 389;\n    t['idieresis'] = 278;\n    t['Ocircumflex'] = 722;\n    t['Ugrave'] = 722;\n    t['Delta'] = 612;\n    t['thorn'] = 500;\n    t['twosuperior'] = 300;\n    t['Odieresis'] = 722;\n    t['mu'] = 500;\n    t['igrave'] = 278;\n    t['ohungarumlaut'] = 500;\n    t['Eogonek'] = 611;\n    t['dcroat'] = 500;\n    t['threequarters'] = 750;\n    t['Scedilla'] = 556;\n    t['lcaron'] = 344;\n    t['Kcommaaccent'] = 722;\n    t['Lacute'] = 611;\n    t['trademark'] = 980;\n    t['edotaccent'] = 444;\n    t['Igrave'] = 333;\n    t['Imacron'] = 333;\n    t['Lcaron'] = 611;\n    t['onehalf'] = 750;\n    t['lessequal'] = 549;\n    t['ocircumflex'] = 500;\n    t['ntilde'] = 500;\n    t['Uhungarumlaut'] = 722;\n    t['Eacute'] = 611;\n    t['emacron'] = 444;\n    t['gbreve'] = 500;\n    t['onequarter'] = 750;\n    t['Scaron'] = 556;\n    t['Scommaaccent'] = 556;\n    t['Ohungarumlaut'] = 722;\n    t['degree'] = 400;\n    t['ograve'] = 500;\n    t['Ccaron'] = 667;\n    t['ugrave'] = 500;\n    t['radical'] = 453;\n    t['Dcaron'] = 722;\n    t['rcommaaccent'] = 333;\n    t['Ntilde'] = 722;\n    t['otilde'] = 500;\n    t['Rcommaaccent'] = 667;\n    t['Lcommaaccent'] = 611;\n    t['Atilde'] = 722;\n    t['Aogonek'] = 722;\n    t['Aring'] = 722;\n    t['Otilde'] = 722;\n    t['zdotaccent'] = 444;\n    t['Ecaron'] = 611;\n    t['Iogonek'] = 333;\n    t['kcommaaccent'] = 500;\n    t['minus'] = 564;\n    t['Icircumflex'] = 333;\n    t['ncaron'] = 500;\n    t['tcommaaccent'] = 278;\n    t['logicalnot'] = 564;\n    t['odieresis'] = 500;\n    t['udieresis'] = 500;\n    t['notequal'] = 549;\n    t['gcommaaccent'] = 500;\n    t['eth'] = 500;\n    t['zcaron'] = 444;\n    t['ncommaaccent'] = 500;\n    t['onesuperior'] = 300;\n    t['imacron'] = 278;\n    t['Euro'] = 500;\n  });\n  t['Times-Bold'] = getLookupTableFactory(function (t) {\n    t['space'] = 250;\n    t['exclam'] = 333;\n    t['quotedbl'] = 555;\n    t['numbersign'] = 500;\n    t['dollar'] = 500;\n    t['percent'] = 1000;\n    t['ampersand'] = 833;\n    t['quoteright'] = 333;\n    t['parenleft'] = 333;\n    t['parenright'] = 333;\n    t['asterisk'] = 500;\n    t['plus'] = 570;\n    t['comma'] = 250;\n    t['hyphen'] = 333;\n    t['period'] = 250;\n    t['slash'] = 278;\n    t['zero'] = 500;\n    t['one'] = 500;\n    t['two'] = 500;\n    t['three'] = 500;\n    t['four'] = 500;\n    t['five'] = 500;\n    t['six'] = 500;\n    t['seven'] = 500;\n    t['eight'] = 500;\n    t['nine'] = 500;\n    t['colon'] = 333;\n    t['semicolon'] = 333;\n    t['less'] = 570;\n    t['equal'] = 570;\n    t['greater'] = 570;\n    t['question'] = 500;\n    t['at'] = 930;\n    t['A'] = 722;\n    t['B'] = 667;\n    t['C'] = 722;\n    t['D'] = 722;\n    t['E'] = 667;\n    t['F'] = 611;\n    t['G'] = 778;\n    t['H'] = 778;\n    t['I'] = 389;\n    t['J'] = 500;\n    t['K'] = 778;\n    t['L'] = 667;\n    t['M'] = 944;\n    t['N'] = 722;\n    t['O'] = 778;\n    t['P'] = 611;\n    t['Q'] = 778;\n    t['R'] = 722;\n    t['S'] = 556;\n    t['T'] = 667;\n    t['U'] = 722;\n    t['V'] = 722;\n    t['W'] = 1000;\n    t['X'] = 722;\n    t['Y'] = 722;\n    t['Z'] = 667;\n    t['bracketleft'] = 333;\n    t['backslash'] = 278;\n    t['bracketright'] = 333;\n    t['asciicircum'] = 581;\n    t['underscore'] = 500;\n    t['quoteleft'] = 333;\n    t['a'] = 500;\n    t['b'] = 556;\n    t['c'] = 444;\n    t['d'] = 556;\n    t['e'] = 444;\n    t['f'] = 333;\n    t['g'] = 500;\n    t['h'] = 556;\n    t['i'] = 278;\n    t['j'] = 333;\n    t['k'] = 556;\n    t['l'] = 278;\n    t['m'] = 833;\n    t['n'] = 556;\n    t['o'] = 500;\n    t['p'] = 556;\n    t['q'] = 556;\n    t['r'] = 444;\n    t['s'] = 389;\n    t['t'] = 333;\n    t['u'] = 556;\n    t['v'] = 500;\n    t['w'] = 722;\n    t['x'] = 500;\n    t['y'] = 500;\n    t['z'] = 444;\n    t['braceleft'] = 394;\n    t['bar'] = 220;\n    t['braceright'] = 394;\n    t['asciitilde'] = 520;\n    t['exclamdown'] = 333;\n    t['cent'] = 500;\n    t['sterling'] = 500;\n    t['fraction'] = 167;\n    t['yen'] = 500;\n    t['florin'] = 500;\n    t['section'] = 500;\n    t['currency'] = 500;\n    t['quotesingle'] = 278;\n    t['quotedblleft'] = 500;\n    t['guillemotleft'] = 500;\n    t['guilsinglleft'] = 333;\n    t['guilsinglright'] = 333;\n    t['fi'] = 556;\n    t['fl'] = 556;\n    t['endash'] = 500;\n    t['dagger'] = 500;\n    t['daggerdbl'] = 500;\n    t['periodcentered'] = 250;\n    t['paragraph'] = 540;\n    t['bullet'] = 350;\n    t['quotesinglbase'] = 333;\n    t['quotedblbase'] = 500;\n    t['quotedblright'] = 500;\n    t['guillemotright'] = 500;\n    t['ellipsis'] = 1000;\n    t['perthousand'] = 1000;\n    t['questiondown'] = 500;\n    t['grave'] = 333;\n    t['acute'] = 333;\n    t['circumflex'] = 333;\n    t['tilde'] = 333;\n    t['macron'] = 333;\n    t['breve'] = 333;\n    t['dotaccent'] = 333;\n    t['dieresis'] = 333;\n    t['ring'] = 333;\n    t['cedilla'] = 333;\n    t['hungarumlaut'] = 333;\n    t['ogonek'] = 333;\n    t['caron'] = 333;\n    t['emdash'] = 1000;\n    t['AE'] = 1000;\n    t['ordfeminine'] = 300;\n    t['Lslash'] = 667;\n    t['Oslash'] = 778;\n    t['OE'] = 1000;\n    t['ordmasculine'] = 330;\n    t['ae'] = 722;\n    t['dotlessi'] = 278;\n    t['lslash'] = 278;\n    t['oslash'] = 500;\n    t['oe'] = 722;\n    t['germandbls'] = 556;\n    t['Idieresis'] = 389;\n    t['eacute'] = 444;\n    t['abreve'] = 500;\n    t['uhungarumlaut'] = 556;\n    t['ecaron'] = 444;\n    t['Ydieresis'] = 722;\n    t['divide'] = 570;\n    t['Yacute'] = 722;\n    t['Acircumflex'] = 722;\n    t['aacute'] = 500;\n    t['Ucircumflex'] = 722;\n    t['yacute'] = 500;\n    t['scommaaccent'] = 389;\n    t['ecircumflex'] = 444;\n    t['Uring'] = 722;\n    t['Udieresis'] = 722;\n    t['aogonek'] = 500;\n    t['Uacute'] = 722;\n    t['uogonek'] = 556;\n    t['Edieresis'] = 667;\n    t['Dcroat'] = 722;\n    t['commaaccent'] = 250;\n    t['copyright'] = 747;\n    t['Emacron'] = 667;\n    t['ccaron'] = 444;\n    t['aring'] = 500;\n    t['Ncommaaccent'] = 722;\n    t['lacute'] = 278;\n    t['agrave'] = 500;\n    t['Tcommaaccent'] = 667;\n    t['Cacute'] = 722;\n    t['atilde'] = 500;\n    t['Edotaccent'] = 667;\n    t['scaron'] = 389;\n    t['scedilla'] = 389;\n    t['iacute'] = 278;\n    t['lozenge'] = 494;\n    t['Rcaron'] = 722;\n    t['Gcommaaccent'] = 778;\n    t['ucircumflex'] = 556;\n    t['acircumflex'] = 500;\n    t['Amacron'] = 722;\n    t['rcaron'] = 444;\n    t['ccedilla'] = 444;\n    t['Zdotaccent'] = 667;\n    t['Thorn'] = 611;\n    t['Omacron'] = 778;\n    t['Racute'] = 722;\n    t['Sacute'] = 556;\n    t['dcaron'] = 672;\n    t['Umacron'] = 722;\n    t['uring'] = 556;\n    t['threesuperior'] = 300;\n    t['Ograve'] = 778;\n    t['Agrave'] = 722;\n    t['Abreve'] = 722;\n    t['multiply'] = 570;\n    t['uacute'] = 556;\n    t['Tcaron'] = 667;\n    t['partialdiff'] = 494;\n    t['ydieresis'] = 500;\n    t['Nacute'] = 722;\n    t['icircumflex'] = 278;\n    t['Ecircumflex'] = 667;\n    t['adieresis'] = 500;\n    t['edieresis'] = 444;\n    t['cacute'] = 444;\n    t['nacute'] = 556;\n    t['umacron'] = 556;\n    t['Ncaron'] = 722;\n    t['Iacute'] = 389;\n    t['plusminus'] = 570;\n    t['brokenbar'] = 220;\n    t['registered'] = 747;\n    t['Gbreve'] = 778;\n    t['Idotaccent'] = 389;\n    t['summation'] = 600;\n    t['Egrave'] = 667;\n    t['racute'] = 444;\n    t['omacron'] = 500;\n    t['Zacute'] = 667;\n    t['Zcaron'] = 667;\n    t['greaterequal'] = 549;\n    t['Eth'] = 722;\n    t['Ccedilla'] = 722;\n    t['lcommaaccent'] = 278;\n    t['tcaron'] = 416;\n    t['eogonek'] = 444;\n    t['Uogonek'] = 722;\n    t['Aacute'] = 722;\n    t['Adieresis'] = 722;\n    t['egrave'] = 444;\n    t['zacute'] = 444;\n    t['iogonek'] = 278;\n    t['Oacute'] = 778;\n    t['oacute'] = 500;\n    t['amacron'] = 500;\n    t['sacute'] = 389;\n    t['idieresis'] = 278;\n    t['Ocircumflex'] = 778;\n    t['Ugrave'] = 722;\n    t['Delta'] = 612;\n    t['thorn'] = 556;\n    t['twosuperior'] = 300;\n    t['Odieresis'] = 778;\n    t['mu'] = 556;\n    t['igrave'] = 278;\n    t['ohungarumlaut'] = 500;\n    t['Eogonek'] = 667;\n    t['dcroat'] = 556;\n    t['threequarters'] = 750;\n    t['Scedilla'] = 556;\n    t['lcaron'] = 394;\n    t['Kcommaaccent'] = 778;\n    t['Lacute'] = 667;\n    t['trademark'] = 1000;\n    t['edotaccent'] = 444;\n    t['Igrave'] = 389;\n    t['Imacron'] = 389;\n    t['Lcaron'] = 667;\n    t['onehalf'] = 750;\n    t['lessequal'] = 549;\n    t['ocircumflex'] = 500;\n    t['ntilde'] = 556;\n    t['Uhungarumlaut'] = 722;\n    t['Eacute'] = 667;\n    t['emacron'] = 444;\n    t['gbreve'] = 500;\n    t['onequarter'] = 750;\n    t['Scaron'] = 556;\n    t['Scommaaccent'] = 556;\n    t['Ohungarumlaut'] = 778;\n    t['degree'] = 400;\n    t['ograve'] = 500;\n    t['Ccaron'] = 722;\n    t['ugrave'] = 556;\n    t['radical'] = 549;\n    t['Dcaron'] = 722;\n    t['rcommaaccent'] = 444;\n    t['Ntilde'] = 722;\n    t['otilde'] = 500;\n    t['Rcommaaccent'] = 722;\n    t['Lcommaaccent'] = 667;\n    t['Atilde'] = 722;\n    t['Aogonek'] = 722;\n    t['Aring'] = 722;\n    t['Otilde'] = 778;\n    t['zdotaccent'] = 444;\n    t['Ecaron'] = 667;\n    t['Iogonek'] = 389;\n    t['kcommaaccent'] = 556;\n    t['minus'] = 570;\n    t['Icircumflex'] = 389;\n    t['ncaron'] = 556;\n    t['tcommaaccent'] = 333;\n    t['logicalnot'] = 570;\n    t['odieresis'] = 500;\n    t['udieresis'] = 556;\n    t['notequal'] = 549;\n    t['gcommaaccent'] = 500;\n    t['eth'] = 500;\n    t['zcaron'] = 444;\n    t['ncommaaccent'] = 556;\n    t['onesuperior'] = 300;\n    t['imacron'] = 278;\n    t['Euro'] = 500;\n  });\n  t['Times-BoldItalic'] = getLookupTableFactory(function (t) {\n    t['space'] = 250;\n    t['exclam'] = 389;\n    t['quotedbl'] = 555;\n    t['numbersign'] = 500;\n    t['dollar'] = 500;\n    t['percent'] = 833;\n    t['ampersand'] = 778;\n    t['quoteright'] = 333;\n    t['parenleft'] = 333;\n    t['parenright'] = 333;\n    t['asterisk'] = 500;\n    t['plus'] = 570;\n    t['comma'] = 250;\n    t['hyphen'] = 333;\n    t['period'] = 250;\n    t['slash'] = 278;\n    t['zero'] = 500;\n    t['one'] = 500;\n    t['two'] = 500;\n    t['three'] = 500;\n    t['four'] = 500;\n    t['five'] = 500;\n    t['six'] = 500;\n    t['seven'] = 500;\n    t['eight'] = 500;\n    t['nine'] = 500;\n    t['colon'] = 333;\n    t['semicolon'] = 333;\n    t['less'] = 570;\n    t['equal'] = 570;\n    t['greater'] = 570;\n    t['question'] = 500;\n    t['at'] = 832;\n    t['A'] = 667;\n    t['B'] = 667;\n    t['C'] = 667;\n    t['D'] = 722;\n    t['E'] = 667;\n    t['F'] = 667;\n    t['G'] = 722;\n    t['H'] = 778;\n    t['I'] = 389;\n    t['J'] = 500;\n    t['K'] = 667;\n    t['L'] = 611;\n    t['M'] = 889;\n    t['N'] = 722;\n    t['O'] = 722;\n    t['P'] = 611;\n    t['Q'] = 722;\n    t['R'] = 667;\n    t['S'] = 556;\n    t['T'] = 611;\n    t['U'] = 722;\n    t['V'] = 667;\n    t['W'] = 889;\n    t['X'] = 667;\n    t['Y'] = 611;\n    t['Z'] = 611;\n    t['bracketleft'] = 333;\n    t['backslash'] = 278;\n    t['bracketright'] = 333;\n    t['asciicircum'] = 570;\n    t['underscore'] = 500;\n    t['quoteleft'] = 333;\n    t['a'] = 500;\n    t['b'] = 500;\n    t['c'] = 444;\n    t['d'] = 500;\n    t['e'] = 444;\n    t['f'] = 333;\n    t['g'] = 500;\n    t['h'] = 556;\n    t['i'] = 278;\n    t['j'] = 278;\n    t['k'] = 500;\n    t['l'] = 278;\n    t['m'] = 778;\n    t['n'] = 556;\n    t['o'] = 500;\n    t['p'] = 500;\n    t['q'] = 500;\n    t['r'] = 389;\n    t['s'] = 389;\n    t['t'] = 278;\n    t['u'] = 556;\n    t['v'] = 444;\n    t['w'] = 667;\n    t['x'] = 500;\n    t['y'] = 444;\n    t['z'] = 389;\n    t['braceleft'] = 348;\n    t['bar'] = 220;\n    t['braceright'] = 348;\n    t['asciitilde'] = 570;\n    t['exclamdown'] = 389;\n    t['cent'] = 500;\n    t['sterling'] = 500;\n    t['fraction'] = 167;\n    t['yen'] = 500;\n    t['florin'] = 500;\n    t['section'] = 500;\n    t['currency'] = 500;\n    t['quotesingle'] = 278;\n    t['quotedblleft'] = 500;\n    t['guillemotleft'] = 500;\n    t['guilsinglleft'] = 333;\n    t['guilsinglright'] = 333;\n    t['fi'] = 556;\n    t['fl'] = 556;\n    t['endash'] = 500;\n    t['dagger'] = 500;\n    t['daggerdbl'] = 500;\n    t['periodcentered'] = 250;\n    t['paragraph'] = 500;\n    t['bullet'] = 350;\n    t['quotesinglbase'] = 333;\n    t['quotedblbase'] = 500;\n    t['quotedblright'] = 500;\n    t['guillemotright'] = 500;\n    t['ellipsis'] = 1000;\n    t['perthousand'] = 1000;\n    t['questiondown'] = 500;\n    t['grave'] = 333;\n    t['acute'] = 333;\n    t['circumflex'] = 333;\n    t['tilde'] = 333;\n    t['macron'] = 333;\n    t['breve'] = 333;\n    t['dotaccent'] = 333;\n    t['dieresis'] = 333;\n    t['ring'] = 333;\n    t['cedilla'] = 333;\n    t['hungarumlaut'] = 333;\n    t['ogonek'] = 333;\n    t['caron'] = 333;\n    t['emdash'] = 1000;\n    t['AE'] = 944;\n    t['ordfeminine'] = 266;\n    t['Lslash'] = 611;\n    t['Oslash'] = 722;\n    t['OE'] = 944;\n    t['ordmasculine'] = 300;\n    t['ae'] = 722;\n    t['dotlessi'] = 278;\n    t['lslash'] = 278;\n    t['oslash'] = 500;\n    t['oe'] = 722;\n    t['germandbls'] = 500;\n    t['Idieresis'] = 389;\n    t['eacute'] = 444;\n    t['abreve'] = 500;\n    t['uhungarumlaut'] = 556;\n    t['ecaron'] = 444;\n    t['Ydieresis'] = 611;\n    t['divide'] = 570;\n    t['Yacute'] = 611;\n    t['Acircumflex'] = 667;\n    t['aacute'] = 500;\n    t['Ucircumflex'] = 722;\n    t['yacute'] = 444;\n    t['scommaaccent'] = 389;\n    t['ecircumflex'] = 444;\n    t['Uring'] = 722;\n    t['Udieresis'] = 722;\n    t['aogonek'] = 500;\n    t['Uacute'] = 722;\n    t['uogonek'] = 556;\n    t['Edieresis'] = 667;\n    t['Dcroat'] = 722;\n    t['commaaccent'] = 250;\n    t['copyright'] = 747;\n    t['Emacron'] = 667;\n    t['ccaron'] = 444;\n    t['aring'] = 500;\n    t['Ncommaaccent'] = 722;\n    t['lacute'] = 278;\n    t['agrave'] = 500;\n    t['Tcommaaccent'] = 611;\n    t['Cacute'] = 667;\n    t['atilde'] = 500;\n    t['Edotaccent'] = 667;\n    t['scaron'] = 389;\n    t['scedilla'] = 389;\n    t['iacute'] = 278;\n    t['lozenge'] = 494;\n    t['Rcaron'] = 667;\n    t['Gcommaaccent'] = 722;\n    t['ucircumflex'] = 556;\n    t['acircumflex'] = 500;\n    t['Amacron'] = 667;\n    t['rcaron'] = 389;\n    t['ccedilla'] = 444;\n    t['Zdotaccent'] = 611;\n    t['Thorn'] = 611;\n    t['Omacron'] = 722;\n    t['Racute'] = 667;\n    t['Sacute'] = 556;\n    t['dcaron'] = 608;\n    t['Umacron'] = 722;\n    t['uring'] = 556;\n    t['threesuperior'] = 300;\n    t['Ograve'] = 722;\n    t['Agrave'] = 667;\n    t['Abreve'] = 667;\n    t['multiply'] = 570;\n    t['uacute'] = 556;\n    t['Tcaron'] = 611;\n    t['partialdiff'] = 494;\n    t['ydieresis'] = 444;\n    t['Nacute'] = 722;\n    t['icircumflex'] = 278;\n    t['Ecircumflex'] = 667;\n    t['adieresis'] = 500;\n    t['edieresis'] = 444;\n    t['cacute'] = 444;\n    t['nacute'] = 556;\n    t['umacron'] = 556;\n    t['Ncaron'] = 722;\n    t['Iacute'] = 389;\n    t['plusminus'] = 570;\n    t['brokenbar'] = 220;\n    t['registered'] = 747;\n    t['Gbreve'] = 722;\n    t['Idotaccent'] = 389;\n    t['summation'] = 600;\n    t['Egrave'] = 667;\n    t['racute'] = 389;\n    t['omacron'] = 500;\n    t['Zacute'] = 611;\n    t['Zcaron'] = 611;\n    t['greaterequal'] = 549;\n    t['Eth'] = 722;\n    t['Ccedilla'] = 667;\n    t['lcommaaccent'] = 278;\n    t['tcaron'] = 366;\n    t['eogonek'] = 444;\n    t['Uogonek'] = 722;\n    t['Aacute'] = 667;\n    t['Adieresis'] = 667;\n    t['egrave'] = 444;\n    t['zacute'] = 389;\n    t['iogonek'] = 278;\n    t['Oacute'] = 722;\n    t['oacute'] = 500;\n    t['amacron'] = 500;\n    t['sacute'] = 389;\n    t['idieresis'] = 278;\n    t['Ocircumflex'] = 722;\n    t['Ugrave'] = 722;\n    t['Delta'] = 612;\n    t['thorn'] = 500;\n    t['twosuperior'] = 300;\n    t['Odieresis'] = 722;\n    t['mu'] = 576;\n    t['igrave'] = 278;\n    t['ohungarumlaut'] = 500;\n    t['Eogonek'] = 667;\n    t['dcroat'] = 500;\n    t['threequarters'] = 750;\n    t['Scedilla'] = 556;\n    t['lcaron'] = 382;\n    t['Kcommaaccent'] = 667;\n    t['Lacute'] = 611;\n    t['trademark'] = 1000;\n    t['edotaccent'] = 444;\n    t['Igrave'] = 389;\n    t['Imacron'] = 389;\n    t['Lcaron'] = 611;\n    t['onehalf'] = 750;\n    t['lessequal'] = 549;\n    t['ocircumflex'] = 500;\n    t['ntilde'] = 556;\n    t['Uhungarumlaut'] = 722;\n    t['Eacute'] = 667;\n    t['emacron'] = 444;\n    t['gbreve'] = 500;\n    t['onequarter'] = 750;\n    t['Scaron'] = 556;\n    t['Scommaaccent'] = 556;\n    t['Ohungarumlaut'] = 722;\n    t['degree'] = 400;\n    t['ograve'] = 500;\n    t['Ccaron'] = 667;\n    t['ugrave'] = 556;\n    t['radical'] = 549;\n    t['Dcaron'] = 722;\n    t['rcommaaccent'] = 389;\n    t['Ntilde'] = 722;\n    t['otilde'] = 500;\n    t['Rcommaaccent'] = 667;\n    t['Lcommaaccent'] = 611;\n    t['Atilde'] = 667;\n    t['Aogonek'] = 667;\n    t['Aring'] = 667;\n    t['Otilde'] = 722;\n    t['zdotaccent'] = 389;\n    t['Ecaron'] = 667;\n    t['Iogonek'] = 389;\n    t['kcommaaccent'] = 500;\n    t['minus'] = 606;\n    t['Icircumflex'] = 389;\n    t['ncaron'] = 556;\n    t['tcommaaccent'] = 278;\n    t['logicalnot'] = 606;\n    t['odieresis'] = 500;\n    t['udieresis'] = 556;\n    t['notequal'] = 549;\n    t['gcommaaccent'] = 500;\n    t['eth'] = 500;\n    t['zcaron'] = 389;\n    t['ncommaaccent'] = 556;\n    t['onesuperior'] = 300;\n    t['imacron'] = 278;\n    t['Euro'] = 500;\n  });\n  t['Times-Italic'] = getLookupTableFactory(function (t) {\n    t['space'] = 250;\n    t['exclam'] = 333;\n    t['quotedbl'] = 420;\n    t['numbersign'] = 500;\n    t['dollar'] = 500;\n    t['percent'] = 833;\n    t['ampersand'] = 778;\n    t['quoteright'] = 333;\n    t['parenleft'] = 333;\n    t['parenright'] = 333;\n    t['asterisk'] = 500;\n    t['plus'] = 675;\n    t['comma'] = 250;\n    t['hyphen'] = 333;\n    t['period'] = 250;\n    t['slash'] = 278;\n    t['zero'] = 500;\n    t['one'] = 500;\n    t['two'] = 500;\n    t['three'] = 500;\n    t['four'] = 500;\n    t['five'] = 500;\n    t['six'] = 500;\n    t['seven'] = 500;\n    t['eight'] = 500;\n    t['nine'] = 500;\n    t['colon'] = 333;\n    t['semicolon'] = 333;\n    t['less'] = 675;\n    t['equal'] = 675;\n    t['greater'] = 675;\n    t['question'] = 500;\n    t['at'] = 920;\n    t['A'] = 611;\n    t['B'] = 611;\n    t['C'] = 667;\n    t['D'] = 722;\n    t['E'] = 611;\n    t['F'] = 611;\n    t['G'] = 722;\n    t['H'] = 722;\n    t['I'] = 333;\n    t['J'] = 444;\n    t['K'] = 667;\n    t['L'] = 556;\n    t['M'] = 833;\n    t['N'] = 667;\n    t['O'] = 722;\n    t['P'] = 611;\n    t['Q'] = 722;\n    t['R'] = 611;\n    t['S'] = 500;\n    t['T'] = 556;\n    t['U'] = 722;\n    t['V'] = 611;\n    t['W'] = 833;\n    t['X'] = 611;\n    t['Y'] = 556;\n    t['Z'] = 556;\n    t['bracketleft'] = 389;\n    t['backslash'] = 278;\n    t['bracketright'] = 389;\n    t['asciicircum'] = 422;\n    t['underscore'] = 500;\n    t['quoteleft'] = 333;\n    t['a'] = 500;\n    t['b'] = 500;\n    t['c'] = 444;\n    t['d'] = 500;\n    t['e'] = 444;\n    t['f'] = 278;\n    t['g'] = 500;\n    t['h'] = 500;\n    t['i'] = 278;\n    t['j'] = 278;\n    t['k'] = 444;\n    t['l'] = 278;\n    t['m'] = 722;\n    t['n'] = 500;\n    t['o'] = 500;\n    t['p'] = 500;\n    t['q'] = 500;\n    t['r'] = 389;\n    t['s'] = 389;\n    t['t'] = 278;\n    t['u'] = 500;\n    t['v'] = 444;\n    t['w'] = 667;\n    t['x'] = 444;\n    t['y'] = 444;\n    t['z'] = 389;\n    t['braceleft'] = 400;\n    t['bar'] = 275;\n    t['braceright'] = 400;\n    t['asciitilde'] = 541;\n    t['exclamdown'] = 389;\n    t['cent'] = 500;\n    t['sterling'] = 500;\n    t['fraction'] = 167;\n    t['yen'] = 500;\n    t['florin'] = 500;\n    t['section'] = 500;\n    t['currency'] = 500;\n    t['quotesingle'] = 214;\n    t['quotedblleft'] = 556;\n    t['guillemotleft'] = 500;\n    t['guilsinglleft'] = 333;\n    t['guilsinglright'] = 333;\n    t['fi'] = 500;\n    t['fl'] = 500;\n    t['endash'] = 500;\n    t['dagger'] = 500;\n    t['daggerdbl'] = 500;\n    t['periodcentered'] = 250;\n    t['paragraph'] = 523;\n    t['bullet'] = 350;\n    t['quotesinglbase'] = 333;\n    t['quotedblbase'] = 556;\n    t['quotedblright'] = 556;\n    t['guillemotright'] = 500;\n    t['ellipsis'] = 889;\n    t['perthousand'] = 1000;\n    t['questiondown'] = 500;\n    t['grave'] = 333;\n    t['acute'] = 333;\n    t['circumflex'] = 333;\n    t['tilde'] = 333;\n    t['macron'] = 333;\n    t['breve'] = 333;\n    t['dotaccent'] = 333;\n    t['dieresis'] = 333;\n    t['ring'] = 333;\n    t['cedilla'] = 333;\n    t['hungarumlaut'] = 333;\n    t['ogonek'] = 333;\n    t['caron'] = 333;\n    t['emdash'] = 889;\n    t['AE'] = 889;\n    t['ordfeminine'] = 276;\n    t['Lslash'] = 556;\n    t['Oslash'] = 722;\n    t['OE'] = 944;\n    t['ordmasculine'] = 310;\n    t['ae'] = 667;\n    t['dotlessi'] = 278;\n    t['lslash'] = 278;\n    t['oslash'] = 500;\n    t['oe'] = 667;\n    t['germandbls'] = 500;\n    t['Idieresis'] = 333;\n    t['eacute'] = 444;\n    t['abreve'] = 500;\n    t['uhungarumlaut'] = 500;\n    t['ecaron'] = 444;\n    t['Ydieresis'] = 556;\n    t['divide'] = 675;\n    t['Yacute'] = 556;\n    t['Acircumflex'] = 611;\n    t['aacute'] = 500;\n    t['Ucircumflex'] = 722;\n    t['yacute'] = 444;\n    t['scommaaccent'] = 389;\n    t['ecircumflex'] = 444;\n    t['Uring'] = 722;\n    t['Udieresis'] = 722;\n    t['aogonek'] = 500;\n    t['Uacute'] = 722;\n    t['uogonek'] = 500;\n    t['Edieresis'] = 611;\n    t['Dcroat'] = 722;\n    t['commaaccent'] = 250;\n    t['copyright'] = 760;\n    t['Emacron'] = 611;\n    t['ccaron'] = 444;\n    t['aring'] = 500;\n    t['Ncommaaccent'] = 667;\n    t['lacute'] = 278;\n    t['agrave'] = 500;\n    t['Tcommaaccent'] = 556;\n    t['Cacute'] = 667;\n    t['atilde'] = 500;\n    t['Edotaccent'] = 611;\n    t['scaron'] = 389;\n    t['scedilla'] = 389;\n    t['iacute'] = 278;\n    t['lozenge'] = 471;\n    t['Rcaron'] = 611;\n    t['Gcommaaccent'] = 722;\n    t['ucircumflex'] = 500;\n    t['acircumflex'] = 500;\n    t['Amacron'] = 611;\n    t['rcaron'] = 389;\n    t['ccedilla'] = 444;\n    t['Zdotaccent'] = 556;\n    t['Thorn'] = 611;\n    t['Omacron'] = 722;\n    t['Racute'] = 611;\n    t['Sacute'] = 500;\n    t['dcaron'] = 544;\n    t['Umacron'] = 722;\n    t['uring'] = 500;\n    t['threesuperior'] = 300;\n    t['Ograve'] = 722;\n    t['Agrave'] = 611;\n    t['Abreve'] = 611;\n    t['multiply'] = 675;\n    t['uacute'] = 500;\n    t['Tcaron'] = 556;\n    t['partialdiff'] = 476;\n    t['ydieresis'] = 444;\n    t['Nacute'] = 667;\n    t['icircumflex'] = 278;\n    t['Ecircumflex'] = 611;\n    t['adieresis'] = 500;\n    t['edieresis'] = 444;\n    t['cacute'] = 444;\n    t['nacute'] = 500;\n    t['umacron'] = 500;\n    t['Ncaron'] = 667;\n    t['Iacute'] = 333;\n    t['plusminus'] = 675;\n    t['brokenbar'] = 275;\n    t['registered'] = 760;\n    t['Gbreve'] = 722;\n    t['Idotaccent'] = 333;\n    t['summation'] = 600;\n    t['Egrave'] = 611;\n    t['racute'] = 389;\n    t['omacron'] = 500;\n    t['Zacute'] = 556;\n    t['Zcaron'] = 556;\n    t['greaterequal'] = 549;\n    t['Eth'] = 722;\n    t['Ccedilla'] = 667;\n    t['lcommaaccent'] = 278;\n    t['tcaron'] = 300;\n    t['eogonek'] = 444;\n    t['Uogonek'] = 722;\n    t['Aacute'] = 611;\n    t['Adieresis'] = 611;\n    t['egrave'] = 444;\n    t['zacute'] = 389;\n    t['iogonek'] = 278;\n    t['Oacute'] = 722;\n    t['oacute'] = 500;\n    t['amacron'] = 500;\n    t['sacute'] = 389;\n    t['idieresis'] = 278;\n    t['Ocircumflex'] = 722;\n    t['Ugrave'] = 722;\n    t['Delta'] = 612;\n    t['thorn'] = 500;\n    t['twosuperior'] = 300;\n    t['Odieresis'] = 722;\n    t['mu'] = 500;\n    t['igrave'] = 278;\n    t['ohungarumlaut'] = 500;\n    t['Eogonek'] = 611;\n    t['dcroat'] = 500;\n    t['threequarters'] = 750;\n    t['Scedilla'] = 500;\n    t['lcaron'] = 300;\n    t['Kcommaaccent'] = 667;\n    t['Lacute'] = 556;\n    t['trademark'] = 980;\n    t['edotaccent'] = 444;\n    t['Igrave'] = 333;\n    t['Imacron'] = 333;\n    t['Lcaron'] = 611;\n    t['onehalf'] = 750;\n    t['lessequal'] = 549;\n    t['ocircumflex'] = 500;\n    t['ntilde'] = 500;\n    t['Uhungarumlaut'] = 722;\n    t['Eacute'] = 611;\n    t['emacron'] = 444;\n    t['gbreve'] = 500;\n    t['onequarter'] = 750;\n    t['Scaron'] = 500;\n    t['Scommaaccent'] = 500;\n    t['Ohungarumlaut'] = 722;\n    t['degree'] = 400;\n    t['ograve'] = 500;\n    t['Ccaron'] = 667;\n    t['ugrave'] = 500;\n    t['radical'] = 453;\n    t['Dcaron'] = 722;\n    t['rcommaaccent'] = 389;\n    t['Ntilde'] = 667;\n    t['otilde'] = 500;\n    t['Rcommaaccent'] = 611;\n    t['Lcommaaccent'] = 556;\n    t['Atilde'] = 611;\n    t['Aogonek'] = 611;\n    t['Aring'] = 611;\n    t['Otilde'] = 722;\n    t['zdotaccent'] = 389;\n    t['Ecaron'] = 611;\n    t['Iogonek'] = 333;\n    t['kcommaaccent'] = 444;\n    t['minus'] = 675;\n    t['Icircumflex'] = 333;\n    t['ncaron'] = 500;\n    t['tcommaaccent'] = 278;\n    t['logicalnot'] = 675;\n    t['odieresis'] = 500;\n    t['udieresis'] = 500;\n    t['notequal'] = 549;\n    t['gcommaaccent'] = 500;\n    t['eth'] = 500;\n    t['zcaron'] = 389;\n    t['ncommaaccent'] = 500;\n    t['onesuperior'] = 300;\n    t['imacron'] = 278;\n    t['Euro'] = 500;\n  });\n  t['ZapfDingbats'] = getLookupTableFactory(function (t) {\n    t['space'] = 278;\n    t['a1'] = 974;\n    t['a2'] = 961;\n    t['a202'] = 974;\n    t['a3'] = 980;\n    t['a4'] = 719;\n    t['a5'] = 789;\n    t['a119'] = 790;\n    t['a118'] = 791;\n    t['a117'] = 690;\n    t['a11'] = 960;\n    t['a12'] = 939;\n    t['a13'] = 549;\n    t['a14'] = 855;\n    t['a15'] = 911;\n    t['a16'] = 933;\n    t['a105'] = 911;\n    t['a17'] = 945;\n    t['a18'] = 974;\n    t['a19'] = 755;\n    t['a20'] = 846;\n    t['a21'] = 762;\n    t['a22'] = 761;\n    t['a23'] = 571;\n    t['a24'] = 677;\n    t['a25'] = 763;\n    t['a26'] = 760;\n    t['a27'] = 759;\n    t['a28'] = 754;\n    t['a6'] = 494;\n    t['a7'] = 552;\n    t['a8'] = 537;\n    t['a9'] = 577;\n    t['a10'] = 692;\n    t['a29'] = 786;\n    t['a30'] = 788;\n    t['a31'] = 788;\n    t['a32'] = 790;\n    t['a33'] = 793;\n    t['a34'] = 794;\n    t['a35'] = 816;\n    t['a36'] = 823;\n    t['a37'] = 789;\n    t['a38'] = 841;\n    t['a39'] = 823;\n    t['a40'] = 833;\n    t['a41'] = 816;\n    t['a42'] = 831;\n    t['a43'] = 923;\n    t['a44'] = 744;\n    t['a45'] = 723;\n    t['a46'] = 749;\n    t['a47'] = 790;\n    t['a48'] = 792;\n    t['a49'] = 695;\n    t['a50'] = 776;\n    t['a51'] = 768;\n    t['a52'] = 792;\n    t['a53'] = 759;\n    t['a54'] = 707;\n    t['a55'] = 708;\n    t['a56'] = 682;\n    t['a57'] = 701;\n    t['a58'] = 826;\n    t['a59'] = 815;\n    t['a60'] = 789;\n    t['a61'] = 789;\n    t['a62'] = 707;\n    t['a63'] = 687;\n    t['a64'] = 696;\n    t['a65'] = 689;\n    t['a66'] = 786;\n    t['a67'] = 787;\n    t['a68'] = 713;\n    t['a69'] = 791;\n    t['a70'] = 785;\n    t['a71'] = 791;\n    t['a72'] = 873;\n    t['a73'] = 761;\n    t['a74'] = 762;\n    t['a203'] = 762;\n    t['a75'] = 759;\n    t['a204'] = 759;\n    t['a76'] = 892;\n    t['a77'] = 892;\n    t['a78'] = 788;\n    t['a79'] = 784;\n    t['a81'] = 438;\n    t['a82'] = 138;\n    t['a83'] = 277;\n    t['a84'] = 415;\n    t['a97'] = 392;\n    t['a98'] = 392;\n    t['a99'] = 668;\n    t['a100'] = 668;\n    t['a89'] = 390;\n    t['a90'] = 390;\n    t['a93'] = 317;\n    t['a94'] = 317;\n    t['a91'] = 276;\n    t['a92'] = 276;\n    t['a205'] = 509;\n    t['a85'] = 509;\n    t['a206'] = 410;\n    t['a86'] = 410;\n    t['a87'] = 234;\n    t['a88'] = 234;\n    t['a95'] = 334;\n    t['a96'] = 334;\n    t['a101'] = 732;\n    t['a102'] = 544;\n    t['a103'] = 544;\n    t['a104'] = 910;\n    t['a106'] = 667;\n    t['a107'] = 760;\n    t['a108'] = 760;\n    t['a112'] = 776;\n    t['a111'] = 595;\n    t['a110'] = 694;\n    t['a109'] = 626;\n    t['a120'] = 788;\n    t['a121'] = 788;\n    t['a122'] = 788;\n    t['a123'] = 788;\n    t['a124'] = 788;\n    t['a125'] = 788;\n    t['a126'] = 788;\n    t['a127'] = 788;\n    t['a128'] = 788;\n    t['a129'] = 788;\n    t['a130'] = 788;\n    t['a131'] = 788;\n    t['a132'] = 788;\n    t['a133'] = 788;\n    t['a134'] = 788;\n    t['a135'] = 788;\n    t['a136'] = 788;\n    t['a137'] = 788;\n    t['a138'] = 788;\n    t['a139'] = 788;\n    t['a140'] = 788;\n    t['a141'] = 788;\n    t['a142'] = 788;\n    t['a143'] = 788;\n    t['a144'] = 788;\n    t['a145'] = 788;\n    t['a146'] = 788;\n    t['a147'] = 788;\n    t['a148'] = 788;\n    t['a149'] = 788;\n    t['a150'] = 788;\n    t['a151'] = 788;\n    t['a152'] = 788;\n    t['a153'] = 788;\n    t['a154'] = 788;\n    t['a155'] = 788;\n    t['a156'] = 788;\n    t['a157'] = 788;\n    t['a158'] = 788;\n    t['a159'] = 788;\n    t['a160'] = 894;\n    t['a161'] = 838;\n    t['a163'] = 1016;\n    t['a164'] = 458;\n    t['a196'] = 748;\n    t['a165'] = 924;\n    t['a192'] = 748;\n    t['a166'] = 918;\n    t['a167'] = 927;\n    t['a168'] = 928;\n    t['a169'] = 928;\n    t['a170'] = 834;\n    t['a171'] = 873;\n    t['a172'] = 828;\n    t['a173'] = 924;\n    t['a162'] = 924;\n    t['a174'] = 917;\n    t['a175'] = 930;\n    t['a176'] = 931;\n    t['a177'] = 463;\n    t['a178'] = 883;\n    t['a179'] = 836;\n    t['a193'] = 836;\n    t['a180'] = 867;\n    t['a199'] = 867;\n    t['a181'] = 696;\n    t['a200'] = 696;\n    t['a182'] = 874;\n    t['a201'] = 874;\n    t['a183'] = 760;\n    t['a184'] = 946;\n    t['a197'] = 771;\n    t['a185'] = 865;\n    t['a194'] = 771;\n    t['a198'] = 888;\n    t['a186'] = 967;\n    t['a195'] = 888;\n    t['a187'] = 831;\n    t['a188'] = 873;\n    t['a189'] = 927;\n    t['a190'] = 970;\n    t['a191'] = 918;\n  });\n});\n\nexport {\n  getMetrics,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  FormatError, info, isBool, isEvalSupported, shadow, unreachable\n} from '../shared/util';\nimport { isDict, isStream } from './primitives';\nimport { PostScriptLexer, PostScriptParser } from './ps_parser';\n\nlet IsEvalSupportedCached = {\n  get value() {\n    return shadow(this, 'value', isEvalSupported());\n  },\n};\n\nclass PDFFunctionFactory {\n  constructor({ xref, isEvalSupported = true, }) {\n    this.xref = xref;\n    this.isEvalSupported = isEvalSupported !== false;\n  }\n\n  create(fn) {\n    return PDFFunction.parse({\n      xref: this.xref,\n      isEvalSupported: this.isEvalSupported,\n      fn,\n    });\n  }\n\n  createFromArray(fnObj) {\n    return PDFFunction.parseArray({\n      xref: this.xref,\n      isEvalSupported: this.isEvalSupported,\n      fnObj,\n    });\n  }\n}\n\nfunction toNumberArray(arr) {\n  if (!Array.isArray(arr)) {\n    return null;\n  }\n  const length = arr.length;\n  for (let i = 0; i < length; i++) {\n    if (typeof arr[i] !== 'number') {\n      // Non-number is found -- convert all items to numbers.\n      const result = new Array(length);\n      for (let i = 0; i < length; i++) {\n        result[i] = +arr[i];\n      }\n      return result;\n    }\n  }\n  return arr;\n}\n\nvar PDFFunction = (function PDFFunctionClosure() {\n  const CONSTRUCT_SAMPLED = 0;\n  const CONSTRUCT_INTERPOLATED = 2;\n  const CONSTRUCT_STICHED = 3;\n  const CONSTRUCT_POSTSCRIPT = 4;\n\n  return {\n    getSampleArray(size, outputSize, bps, stream) {\n      var i, ii;\n      var length = 1;\n      for (i = 0, ii = size.length; i < ii; i++) {\n        length *= size[i];\n      }\n      length *= outputSize;\n\n      var array = new Array(length);\n      var codeSize = 0;\n      var codeBuf = 0;\n      // 32 is a valid bps so shifting won't work\n      var sampleMul = 1.0 / (Math.pow(2.0, bps) - 1);\n\n      var strBytes = stream.getBytes((length * bps + 7) / 8);\n      var strIdx = 0;\n      for (i = 0; i < length; i++) {\n        while (codeSize < bps) {\n          codeBuf <<= 8;\n          codeBuf |= strBytes[strIdx++];\n          codeSize += 8;\n        }\n        codeSize -= bps;\n        array[i] = (codeBuf >> codeSize) * sampleMul;\n        codeBuf &= (1 << codeSize) - 1;\n      }\n      return array;\n    },\n\n    getIR({ xref, isEvalSupported, fn, }) {\n      var dict = fn.dict;\n      if (!dict) {\n        dict = fn;\n      }\n\n      var types = [this.constructSampled,\n                   null,\n                   this.constructInterpolated,\n                   this.constructStiched,\n                   this.constructPostScript];\n\n      var typeNum = dict.get('FunctionType');\n      var typeFn = types[typeNum];\n      if (!typeFn) {\n        throw new FormatError('Unknown type of function');\n      }\n\n      return typeFn.call(this, { xref, isEvalSupported, fn, dict, });\n    },\n\n    fromIR({ xref, isEvalSupported, IR, }) {\n      var type = IR[0];\n      switch (type) {\n        case CONSTRUCT_SAMPLED:\n          return this.constructSampledFromIR({ xref, isEvalSupported, IR, });\n        case CONSTRUCT_INTERPOLATED:\n          return this.constructInterpolatedFromIR({ xref, isEvalSupported,\n                                                    IR, });\n        case CONSTRUCT_STICHED:\n          return this.constructStichedFromIR({ xref, isEvalSupported, IR, });\n        // case CONSTRUCT_POSTSCRIPT:\n        default:\n          return this.constructPostScriptFromIR({ xref, isEvalSupported, IR, });\n      }\n    },\n\n    parse({ xref, isEvalSupported, fn, }) {\n      let IR = this.getIR({ xref, isEvalSupported, fn, });\n      return this.fromIR({ xref, isEvalSupported, IR, });\n    },\n\n    parseArray({ xref, isEvalSupported, fnObj, }) {\n      if (!Array.isArray(fnObj)) {\n        // not an array -- parsing as regular function\n        return this.parse({ xref, isEvalSupported, fn: fnObj, });\n      }\n\n      var fnArray = [];\n      for (var j = 0, jj = fnObj.length; j < jj; j++) {\n        fnArray.push(this.parse({ xref, isEvalSupported,\n                                  fn: xref.fetchIfRef(fnObj[j]), }));\n      }\n      return function(src, srcOffset, dest, destOffset) {\n        for (var i = 0, ii = fnArray.length; i < ii; i++) {\n          fnArray[i](src, srcOffset, dest, destOffset + i);\n        }\n      };\n    },\n\n    constructSampled({ xref, isEvalSupported, fn, dict, }) {\n      function toMultiArray(arr) {\n        var inputLength = arr.length;\n        var out = [];\n        var index = 0;\n        for (var i = 0; i < inputLength; i += 2) {\n          out[index] = [arr[i], arr[i + 1]];\n          ++index;\n        }\n        return out;\n      }\n      var domain = toNumberArray(dict.getArray('Domain'));\n      var range = toNumberArray(dict.getArray('Range'));\n\n      if (!domain || !range) {\n        throw new FormatError('No domain or range');\n      }\n\n      var inputSize = domain.length / 2;\n      var outputSize = range.length / 2;\n\n      domain = toMultiArray(domain);\n      range = toMultiArray(range);\n\n      var size = toNumberArray(dict.getArray('Size'));\n      var bps = dict.get('BitsPerSample');\n      var order = dict.get('Order') || 1;\n      if (order !== 1) {\n        // No description how cubic spline interpolation works in PDF32000:2008\n        // As in poppler, ignoring order, linear interpolation may work as good\n        info('No support for cubic spline interpolation: ' + order);\n      }\n\n      var encode = toNumberArray(dict.getArray('Encode'));\n      if (!encode) {\n        encode = [];\n        for (var i = 0; i < inputSize; ++i) {\n          encode.push([0, size[i] - 1]);\n        }\n      } else {\n        encode = toMultiArray(encode);\n      }\n\n      var decode = toNumberArray(dict.getArray('Decode'));\n      if (!decode) {\n        decode = range;\n      } else {\n        decode = toMultiArray(decode);\n      }\n\n      var samples = this.getSampleArray(size, outputSize, bps, fn);\n\n      return [\n        CONSTRUCT_SAMPLED, inputSize, domain, encode, decode, samples, size,\n        outputSize, Math.pow(2, bps) - 1, range\n      ];\n    },\n\n    constructSampledFromIR({ xref, isEvalSupported, IR, }) {\n      // See chapter 3, page 109 of the PDF reference\n      function interpolate(x, xmin, xmax, ymin, ymax) {\n        return ymin + ((x - xmin) * ((ymax - ymin) / (xmax - xmin)));\n      }\n\n      return function constructSampledFromIRResult(src, srcOffset,\n                                                   dest, destOffset) {\n        // See chapter 3, page 110 of the PDF reference.\n        var m = IR[1];\n        var domain = IR[2];\n        var encode = IR[3];\n        var decode = IR[4];\n        var samples = IR[5];\n        var size = IR[6];\n        var n = IR[7];\n        // var mask = IR[8];\n        var range = IR[9];\n\n        // Building the cube vertices: its part and sample index\n        // http://rjwagner49.com/Mathematics/Interpolation.pdf\n        var cubeVertices = 1 << m;\n        var cubeN = new Float64Array(cubeVertices);\n        var cubeVertex = new Uint32Array(cubeVertices);\n        var i, j;\n        for (j = 0; j < cubeVertices; j++) {\n          cubeN[j] = 1;\n        }\n\n        var k = n, pos = 1;\n        // Map x_i to y_j for 0 <= i < m using the sampled function.\n        for (i = 0; i < m; ++i) {\n          // x_i' = min(max(x_i, Domain_2i), Domain_2i+1)\n          var domain_2i = domain[i][0];\n          var domain_2i_1 = domain[i][1];\n          var xi = Math.min(Math.max(src[srcOffset + i], domain_2i),\n                            domain_2i_1);\n\n          // e_i = Interpolate(x_i', Domain_2i, Domain_2i+1,\n          //                   Encode_2i, Encode_2i+1)\n          var e = interpolate(xi, domain_2i, domain_2i_1,\n                              encode[i][0], encode[i][1]);\n\n          // e_i' = min(max(e_i, 0), Size_i - 1)\n          var size_i = size[i];\n          e = Math.min(Math.max(e, 0), size_i - 1);\n\n          // Adjusting the cube: N and vertex sample index\n          var e0 = e < size_i - 1 ? Math.floor(e) : e - 1; // e1 = e0 + 1;\n          var n0 = e0 + 1 - e; // (e1 - e) / (e1 - e0);\n          var n1 = e - e0; // (e - e0) / (e1 - e0);\n          var offset0 = e0 * k;\n          var offset1 = offset0 + k; // e1 * k\n          for (j = 0; j < cubeVertices; j++) {\n            if (j & pos) {\n              cubeN[j] *= n1;\n              cubeVertex[j] += offset1;\n            } else {\n              cubeN[j] *= n0;\n              cubeVertex[j] += offset0;\n            }\n          }\n\n          k *= size_i;\n          pos <<= 1;\n        }\n\n        for (j = 0; j < n; ++j) {\n          // Sum all cube vertices' samples portions\n          var rj = 0;\n          for (i = 0; i < cubeVertices; i++) {\n            rj += samples[cubeVertex[i] + j] * cubeN[i];\n          }\n\n          // r_j' = Interpolate(r_j, 0, 2^BitsPerSample - 1,\n          //                    Decode_2j, Decode_2j+1)\n          rj = interpolate(rj, 0, 1, decode[j][0], decode[j][1]);\n\n          // y_j = min(max(r_j, range_2j), range_2j+1)\n          dest[destOffset + j] = Math.min(Math.max(rj, range[j][0]),\n                                          range[j][1]);\n        }\n      };\n    },\n\n    constructInterpolated({ xref, isEvalSupported, fn, dict, }) {\n      var c0 = toNumberArray(dict.getArray('C0')) || [0];\n      var c1 = toNumberArray(dict.getArray('C1')) || [1];\n      var n = dict.get('N');\n\n      var length = c0.length;\n      var diff = [];\n      for (var i = 0; i < length; ++i) {\n        diff.push(c1[i] - c0[i]);\n      }\n\n      return [CONSTRUCT_INTERPOLATED, c0, diff, n];\n    },\n\n    constructInterpolatedFromIR({ xref, isEvalSupported, IR, }) {\n      var c0 = IR[1];\n      var diff = IR[2];\n      var n = IR[3];\n\n      var length = diff.length;\n\n      return function constructInterpolatedFromIRResult(src, srcOffset,\n                                                        dest, destOffset) {\n        var x = n === 1 ? src[srcOffset] : Math.pow(src[srcOffset], n);\n\n        for (var j = 0; j < length; ++j) {\n          dest[destOffset + j] = c0[j] + (x * diff[j]);\n        }\n      };\n    },\n\n    constructStiched({ xref, isEvalSupported, fn, dict, }) {\n      var domain = toNumberArray(dict.getArray('Domain'));\n\n      if (!domain) {\n        throw new FormatError('No domain');\n      }\n\n      var inputSize = domain.length / 2;\n      if (inputSize !== 1) {\n        throw new FormatError('Bad domain for stiched function');\n      }\n\n      var fnRefs = dict.get('Functions');\n      var fns = [];\n      for (var i = 0, ii = fnRefs.length; i < ii; ++i) {\n        fns.push(this.parse({ xref, isEvalSupported,\n                              fn: xref.fetchIfRef(fnRefs[i]), }));\n      }\n\n      var bounds = toNumberArray(dict.getArray('Bounds'));\n      var encode = toNumberArray(dict.getArray('Encode'));\n\n      return [CONSTRUCT_STICHED, domain, bounds, encode, fns];\n    },\n\n    constructStichedFromIR({ xref, isEvalSupported, IR, }) {\n      var domain = IR[1];\n      var bounds = IR[2];\n      var encode = IR[3];\n      var fns = IR[4];\n      var tmpBuf = new Float32Array(1);\n\n      return function constructStichedFromIRResult(src, srcOffset,\n                                                   dest, destOffset) {\n        var clip = function constructStichedFromIRClip(v, min, max) {\n          if (v > max) {\n            v = max;\n          } else if (v < min) {\n            v = min;\n          }\n          return v;\n        };\n\n        // clip to domain\n        var v = clip(src[srcOffset], domain[0], domain[1]);\n        // calculate which bound the value is in\n        for (var i = 0, ii = bounds.length; i < ii; ++i) {\n          if (v < bounds[i]) {\n            break;\n          }\n        }\n\n        // encode value into domain of function\n        var dmin = domain[0];\n        if (i > 0) {\n          dmin = bounds[i - 1];\n        }\n        var dmax = domain[1];\n        if (i < bounds.length) {\n          dmax = bounds[i];\n        }\n\n        var rmin = encode[2 * i];\n        var rmax = encode[2 * i + 1];\n\n        // Prevent the value from becoming NaN as a result\n        // of division by zero (fixes issue6113.pdf).\n        tmpBuf[0] = dmin === dmax ? rmin :\n                    rmin + (v - dmin) * (rmax - rmin) / (dmax - dmin);\n\n        // call the appropriate function\n        fns[i](tmpBuf, 0, dest, destOffset);\n      };\n    },\n\n    constructPostScript({ xref, isEvalSupported, fn, dict, }) {\n      var domain = toNumberArray(dict.getArray('Domain'));\n      var range = toNumberArray(dict.getArray('Range'));\n\n      if (!domain) {\n        throw new FormatError('No domain.');\n      }\n\n      if (!range) {\n        throw new FormatError('No range.');\n      }\n\n      var lexer = new PostScriptLexer(fn);\n      var parser = new PostScriptParser(lexer);\n      var code = parser.parse();\n\n      return [CONSTRUCT_POSTSCRIPT, domain, range, code];\n    },\n\n    constructPostScriptFromIR({ xref, isEvalSupported, IR, }) {\n      var domain = IR[1];\n      var range = IR[2];\n      var code = IR[3];\n\n      if (isEvalSupported && IsEvalSupportedCached.value) {\n        let compiled = (new PostScriptCompiler()).compile(code, domain, range);\n        if (compiled) {\n          // Compiled function consists of simple expressions such as addition,\n          // subtraction, Math.max, and also contains 'var' and 'return'\n          // statements. See the generation in the PostScriptCompiler below.\n          // eslint-disable-next-line no-new-func\n          return new Function('src', 'srcOffset', 'dest', 'destOffset',\n                              compiled);\n        }\n      }\n      info('Unable to compile PS function');\n\n      var numOutputs = range.length >> 1;\n      var numInputs = domain.length >> 1;\n      var evaluator = new PostScriptEvaluator(code);\n      // Cache the values for a big speed up, the cache size is limited though\n      // since the number of possible values can be huge from a PS function.\n      var cache = Object.create(null);\n      // The MAX_CACHE_SIZE is set to ~4x the maximum number of distinct values\n      // seen in our tests.\n      var MAX_CACHE_SIZE = 2048 * 4;\n      var cache_available = MAX_CACHE_SIZE;\n      var tmpBuf = new Float32Array(numInputs);\n\n      return function constructPostScriptFromIRResult(src, srcOffset,\n                                                      dest, destOffset) {\n        var i, value;\n        var key = '';\n        var input = tmpBuf;\n        for (i = 0; i < numInputs; i++) {\n          value = src[srcOffset + i];\n          input[i] = value;\n          key += value + '_';\n        }\n\n        var cachedValue = cache[key];\n        if (cachedValue !== undefined) {\n          dest.set(cachedValue, destOffset);\n          return;\n        }\n\n        var output = new Float32Array(numOutputs);\n        var stack = evaluator.execute(input);\n        var stackIndex = stack.length - numOutputs;\n        for (i = 0; i < numOutputs; i++) {\n          value = stack[stackIndex + i];\n          var bound = range[i * 2];\n          if (value < bound) {\n            value = bound;\n          } else {\n            bound = range[i * 2 + 1];\n            if (value > bound) {\n              value = bound;\n            }\n          }\n          output[i] = value;\n        }\n        if (cache_available > 0) {\n          cache_available--;\n          cache[key] = output;\n        }\n        dest.set(output, destOffset);\n      };\n    },\n  };\n})();\n\nfunction isPDFFunction(v) {\n  var fnDict;\n  if (typeof v !== 'object') {\n    return false;\n  } else if (isDict(v)) {\n    fnDict = v;\n  } else if (isStream(v)) {\n    fnDict = v.dict;\n  } else {\n    return false;\n  }\n  return fnDict.has('FunctionType');\n}\n\nvar PostScriptStack = (function PostScriptStackClosure() {\n  var MAX_STACK_SIZE = 100;\n  function PostScriptStack(initialStack) {\n    this.stack = !initialStack ? [] :\n                 Array.prototype.slice.call(initialStack, 0);\n  }\n\n  PostScriptStack.prototype = {\n    push: function PostScriptStack_push(value) {\n      if (this.stack.length >= MAX_STACK_SIZE) {\n        throw new Error('PostScript function stack overflow.');\n      }\n      this.stack.push(value);\n    },\n    pop: function PostScriptStack_pop() {\n      if (this.stack.length <= 0) {\n        throw new Error('PostScript function stack underflow.');\n      }\n      return this.stack.pop();\n    },\n    copy: function PostScriptStack_copy(n) {\n      if (this.stack.length + n >= MAX_STACK_SIZE) {\n        throw new Error('PostScript function stack overflow.');\n      }\n      var stack = this.stack;\n      for (var i = stack.length - n, j = n - 1; j >= 0; j--, i++) {\n        stack.push(stack[i]);\n      }\n    },\n    index: function PostScriptStack_index(n) {\n      this.push(this.stack[this.stack.length - n - 1]);\n    },\n    // rotate the last n stack elements p times\n    roll: function PostScriptStack_roll(n, p) {\n      var stack = this.stack;\n      var l = stack.length - n;\n      var r = stack.length - 1, c = l + (p - Math.floor(p / n) * n), i, j, t;\n      for (i = l, j = r; i < j; i++, j--) {\n        t = stack[i]; stack[i] = stack[j]; stack[j] = t;\n      }\n      for (i = l, j = c - 1; i < j; i++, j--) {\n        t = stack[i]; stack[i] = stack[j]; stack[j] = t;\n      }\n      for (i = c, j = r; i < j; i++, j--) {\n        t = stack[i]; stack[i] = stack[j]; stack[j] = t;\n      }\n    },\n  };\n  return PostScriptStack;\n})();\nvar PostScriptEvaluator = (function PostScriptEvaluatorClosure() {\n  function PostScriptEvaluator(operators) {\n    this.operators = operators;\n  }\n  PostScriptEvaluator.prototype = {\n    execute: function PostScriptEvaluator_execute(initialStack) {\n      var stack = new PostScriptStack(initialStack);\n      var counter = 0;\n      var operators = this.operators;\n      var length = operators.length;\n      var operator, a, b;\n      while (counter < length) {\n        operator = operators[counter++];\n        if (typeof operator === 'number') {\n          // Operator is really an operand and should be pushed to the stack.\n          stack.push(operator);\n          continue;\n        }\n        switch (operator) {\n          // non standard ps operators\n          case 'jz': // jump if false\n            b = stack.pop();\n            a = stack.pop();\n            if (!a) {\n              counter = b;\n            }\n            break;\n          case 'j': // jump\n            a = stack.pop();\n            counter = a;\n            break;\n\n          // all ps operators in alphabetical order (excluding if/ifelse)\n          case 'abs':\n            a = stack.pop();\n            stack.push(Math.abs(a));\n            break;\n          case 'add':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push(a + b);\n            break;\n          case 'and':\n            b = stack.pop();\n            a = stack.pop();\n            if (isBool(a) && isBool(b)) {\n              stack.push(a && b);\n            } else {\n              stack.push(a & b);\n            }\n            break;\n          case 'atan':\n            a = stack.pop();\n            stack.push(Math.atan(a));\n            break;\n          case 'bitshift':\n            b = stack.pop();\n            a = stack.pop();\n            if (a > 0) {\n              stack.push(a << b);\n            } else {\n              stack.push(a >> b);\n            }\n            break;\n          case 'ceiling':\n            a = stack.pop();\n            stack.push(Math.ceil(a));\n            break;\n          case 'copy':\n            a = stack.pop();\n            stack.copy(a);\n            break;\n          case 'cos':\n            a = stack.pop();\n            stack.push(Math.cos(a));\n            break;\n          case 'cvi':\n            a = stack.pop() | 0;\n            stack.push(a);\n            break;\n          case 'cvr':\n            // noop\n            break;\n          case 'div':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push(a / b);\n            break;\n          case 'dup':\n            stack.copy(1);\n            break;\n          case 'eq':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push(a === b);\n            break;\n          case 'exch':\n            stack.roll(2, 1);\n            break;\n          case 'exp':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push(Math.pow(a, b));\n            break;\n          case 'false':\n            stack.push(false);\n            break;\n          case 'floor':\n            a = stack.pop();\n            stack.push(Math.floor(a));\n            break;\n          case 'ge':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push(a >= b);\n            break;\n          case 'gt':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push(a > b);\n            break;\n          case 'idiv':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push((a / b) | 0);\n            break;\n          case 'index':\n            a = stack.pop();\n            stack.index(a);\n            break;\n          case 'le':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push(a <= b);\n            break;\n          case 'ln':\n            a = stack.pop();\n            stack.push(Math.log(a));\n            break;\n          case 'log':\n            a = stack.pop();\n            stack.push(Math.log(a) / Math.LN10);\n            break;\n          case 'lt':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push(a < b);\n            break;\n          case 'mod':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push(a % b);\n            break;\n          case 'mul':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push(a * b);\n            break;\n          case 'ne':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push(a !== b);\n            break;\n          case 'neg':\n            a = stack.pop();\n            stack.push(-a);\n            break;\n          case 'not':\n            a = stack.pop();\n            if (isBool(a)) {\n              stack.push(!a);\n            } else {\n              stack.push(~a);\n            }\n            break;\n          case 'or':\n            b = stack.pop();\n            a = stack.pop();\n            if (isBool(a) && isBool(b)) {\n              stack.push(a || b);\n            } else {\n              stack.push(a | b);\n            }\n            break;\n          case 'pop':\n            stack.pop();\n            break;\n          case 'roll':\n            b = stack.pop();\n            a = stack.pop();\n            stack.roll(a, b);\n            break;\n          case 'round':\n            a = stack.pop();\n            stack.push(Math.round(a));\n            break;\n          case 'sin':\n            a = stack.pop();\n            stack.push(Math.sin(a));\n            break;\n          case 'sqrt':\n            a = stack.pop();\n            stack.push(Math.sqrt(a));\n            break;\n          case 'sub':\n            b = stack.pop();\n            a = stack.pop();\n            stack.push(a - b);\n            break;\n          case 'true':\n            stack.push(true);\n            break;\n          case 'truncate':\n            a = stack.pop();\n            a = a < 0 ? Math.ceil(a) : Math.floor(a);\n            stack.push(a);\n            break;\n          case 'xor':\n            b = stack.pop();\n            a = stack.pop();\n            if (isBool(a) && isBool(b)) {\n              stack.push(a !== b);\n            } else {\n              stack.push(a ^ b);\n            }\n            break;\n          default:\n            throw new FormatError(`Unknown operator ${operator}`);\n        }\n      }\n      return stack.stack;\n    },\n  };\n  return PostScriptEvaluator;\n})();\n\n// Most of the PDFs functions consist of simple operations such as:\n//   roll, exch, sub, cvr, pop, index, dup, mul, if, gt, add.\n//\n// We can compile most of such programs, and at the same moment, we can\n// optimize some expressions using basic math properties. Keeping track of\n// min/max values will allow us to avoid extra Math.min/Math.max calls.\nvar PostScriptCompiler = (function PostScriptCompilerClosure() {\n  function AstNode(type) {\n    this.type = type;\n  }\n  AstNode.prototype.visit = function (visitor) {\n    unreachable('abstract method');\n  };\n\n  function AstArgument(index, min, max) {\n    AstNode.call(this, 'args');\n    this.index = index;\n    this.min = min;\n    this.max = max;\n  }\n  AstArgument.prototype = Object.create(AstNode.prototype);\n  AstArgument.prototype.visit = function (visitor) {\n    visitor.visitArgument(this);\n  };\n\n  function AstLiteral(number) {\n    AstNode.call(this, 'literal');\n    this.number = number;\n    this.min = number;\n    this.max = number;\n  }\n  AstLiteral.prototype = Object.create(AstNode.prototype);\n  AstLiteral.prototype.visit = function (visitor) {\n    visitor.visitLiteral(this);\n  };\n\n  function AstBinaryOperation(op, arg1, arg2, min, max) {\n    AstNode.call(this, 'binary');\n    this.op = op;\n    this.arg1 = arg1;\n    this.arg2 = arg2;\n    this.min = min;\n    this.max = max;\n  }\n  AstBinaryOperation.prototype = Object.create(AstNode.prototype);\n  AstBinaryOperation.prototype.visit = function (visitor) {\n    visitor.visitBinaryOperation(this);\n  };\n\n  function AstMin(arg, max) {\n    AstNode.call(this, 'max');\n    this.arg = arg;\n    this.min = arg.min;\n    this.max = max;\n  }\n  AstMin.prototype = Object.create(AstNode.prototype);\n  AstMin.prototype.visit = function (visitor) {\n    visitor.visitMin(this);\n  };\n\n  function AstVariable(index, min, max) {\n    AstNode.call(this, 'var');\n    this.index = index;\n    this.min = min;\n    this.max = max;\n  }\n  AstVariable.prototype = Object.create(AstNode.prototype);\n  AstVariable.prototype.visit = function (visitor) {\n    visitor.visitVariable(this);\n  };\n\n  function AstVariableDefinition(variable, arg) {\n    AstNode.call(this, 'definition');\n    this.variable = variable;\n    this.arg = arg;\n  }\n  AstVariableDefinition.prototype = Object.create(AstNode.prototype);\n  AstVariableDefinition.prototype.visit = function (visitor) {\n    visitor.visitVariableDefinition(this);\n  };\n\n  function ExpressionBuilderVisitor() {\n    this.parts = [];\n  }\n  ExpressionBuilderVisitor.prototype = {\n    visitArgument(arg) {\n      this.parts.push('Math.max(', arg.min, ', Math.min(',\n                      arg.max, ', src[srcOffset + ', arg.index, ']))');\n    },\n    visitVariable(variable) {\n      this.parts.push('v', variable.index);\n    },\n    visitLiteral(literal) {\n      this.parts.push(literal.number);\n    },\n    visitBinaryOperation(operation) {\n      this.parts.push('(');\n      operation.arg1.visit(this);\n      this.parts.push(' ', operation.op, ' ');\n      operation.arg2.visit(this);\n      this.parts.push(')');\n    },\n    visitVariableDefinition(definition) {\n      this.parts.push('var ');\n      definition.variable.visit(this);\n      this.parts.push(' = ');\n      definition.arg.visit(this);\n      this.parts.push(';');\n    },\n    visitMin(max) {\n      this.parts.push('Math.min(');\n      max.arg.visit(this);\n      this.parts.push(', ', max.max, ')');\n    },\n    toString() {\n      return this.parts.join('');\n    },\n  };\n\n  function buildAddOperation(num1, num2) {\n    if (num2.type === 'literal' && num2.number === 0) {\n      // optimization: second operand is 0\n      return num1;\n    }\n    if (num1.type === 'literal' && num1.number === 0) {\n      // optimization: first operand is 0\n      return num2;\n    }\n    if (num2.type === 'literal' && num1.type === 'literal') {\n      // optimization: operands operand are literals\n      return new AstLiteral(num1.number + num2.number);\n    }\n    return new AstBinaryOperation('+', num1, num2,\n                                  num1.min + num2.min, num1.max + num2.max);\n  }\n\n  function buildMulOperation(num1, num2) {\n    if (num2.type === 'literal') {\n      // optimization: second operands is a literal...\n      if (num2.number === 0) {\n        return new AstLiteral(0); // and it's 0\n      } else if (num2.number === 1) {\n        return num1; // and it's 1\n      } else if (num1.type === 'literal') {\n        // ... and first operands is a literal too\n        return new AstLiteral(num1.number * num2.number);\n      }\n    }\n    if (num1.type === 'literal') {\n      // optimization: first operands is a literal...\n      if (num1.number === 0) {\n        return new AstLiteral(0); // and it's 0\n      } else if (num1.number === 1) {\n        return num2; // and it's 1\n      }\n    }\n    var min = Math.min(num1.min * num2.min, num1.min * num2.max,\n                       num1.max * num2.min, num1.max * num2.max);\n    var max = Math.max(num1.min * num2.min, num1.min * num2.max,\n                       num1.max * num2.min, num1.max * num2.max);\n    return new AstBinaryOperation('*', num1, num2, min, max);\n  }\n\n  function buildSubOperation(num1, num2) {\n    if (num2.type === 'literal') {\n      // optimization: second operands is a literal...\n      if (num2.number === 0) {\n        return num1; // ... and it's 0\n      } else if (num1.type === 'literal') {\n        // ... and first operands is a literal too\n        return new AstLiteral(num1.number - num2.number);\n      }\n    }\n    if (num2.type === 'binary' && num2.op === '-' &&\n      num1.type === 'literal' && num1.number === 1 &&\n      num2.arg1.type === 'literal' && num2.arg1.number === 1) {\n      // optimization for case: 1 - (1 - x)\n      return num2.arg2;\n    }\n    return new AstBinaryOperation('-', num1, num2,\n                                  num1.min - num2.max, num1.max - num2.min);\n  }\n\n  function buildMinOperation(num1, max) {\n    if (num1.min >= max) {\n      // optimization: num1 min value is not less than required max\n      return new AstLiteral(max); // just returning max\n    } else if (num1.max <= max) {\n      // optimization: num1 max value is not greater than required max\n      return num1; // just returning an argument\n    }\n    return new AstMin(num1, max);\n  }\n\n  function PostScriptCompiler() {}\n  PostScriptCompiler.prototype = {\n    compile: function PostScriptCompiler_compile(code, domain, range) {\n      var stack = [];\n      var i, ii;\n      var instructions = [];\n      var inputSize = domain.length >> 1, outputSize = range.length >> 1;\n      var lastRegister = 0;\n      var n, j;\n      var num1, num2, ast1, ast2, tmpVar, item;\n      for (i = 0; i < inputSize; i++) {\n        stack.push(new AstArgument(i, domain[i * 2], domain[i * 2 + 1]));\n      }\n\n      for (i = 0, ii = code.length; i < ii; i++) {\n        item = code[i];\n        if (typeof item === 'number') {\n          stack.push(new AstLiteral(item));\n          continue;\n        }\n\n        switch (item) {\n          case 'add':\n            if (stack.length < 2) {\n              return null;\n            }\n            num2 = stack.pop();\n            num1 = stack.pop();\n            stack.push(buildAddOperation(num1, num2));\n            break;\n          case 'cvr':\n            if (stack.length < 1) {\n              return null;\n            }\n            break;\n          case 'mul':\n            if (stack.length < 2) {\n              return null;\n            }\n            num2 = stack.pop();\n            num1 = stack.pop();\n            stack.push(buildMulOperation(num1, num2));\n            break;\n          case 'sub':\n            if (stack.length < 2) {\n              return null;\n            }\n            num2 = stack.pop();\n            num1 = stack.pop();\n            stack.push(buildSubOperation(num1, num2));\n            break;\n          case 'exch':\n            if (stack.length < 2) {\n              return null;\n            }\n            ast1 = stack.pop(); ast2 = stack.pop();\n            stack.push(ast1, ast2);\n            break;\n          case 'pop':\n            if (stack.length < 1) {\n              return null;\n            }\n            stack.pop();\n            break;\n          case 'index':\n            if (stack.length < 1) {\n              return null;\n            }\n            num1 = stack.pop();\n            if (num1.type !== 'literal') {\n              return null;\n            }\n            n = num1.number;\n            if (n < 0 || !Number.isInteger(n) || stack.length < n) {\n              return null;\n            }\n            ast1 = stack[stack.length - n - 1];\n            if (ast1.type === 'literal' || ast1.type === 'var') {\n              stack.push(ast1);\n              break;\n            }\n            tmpVar = new AstVariable(lastRegister++, ast1.min, ast1.max);\n            stack[stack.length - n - 1] = tmpVar;\n            stack.push(tmpVar);\n            instructions.push(new AstVariableDefinition(tmpVar, ast1));\n            break;\n          case 'dup':\n            if (stack.length < 1) {\n              return null;\n            }\n            if (typeof code[i + 1] === 'number' && code[i + 2] === 'gt' &&\n                code[i + 3] === i + 7 && code[i + 4] === 'jz' &&\n                code[i + 5] === 'pop' && code[i + 6] === code[i + 1]) {\n              // special case of the commands sequence for the min operation\n              num1 = stack.pop();\n              stack.push(buildMinOperation(num1, code[i + 1]));\n              i += 6;\n              break;\n            }\n            ast1 = stack[stack.length - 1];\n            if (ast1.type === 'literal' || ast1.type === 'var') {\n              // we don't have to save into intermediate variable a literal or\n              // variable.\n              stack.push(ast1);\n              break;\n            }\n            tmpVar = new AstVariable(lastRegister++, ast1.min, ast1.max);\n            stack[stack.length - 1] = tmpVar;\n            stack.push(tmpVar);\n            instructions.push(new AstVariableDefinition(tmpVar, ast1));\n            break;\n          case 'roll':\n            if (stack.length < 2) {\n              return null;\n            }\n            num2 = stack.pop();\n            num1 = stack.pop();\n            if (num2.type !== 'literal' || num1.type !== 'literal') {\n              // both roll operands must be numbers\n              return null;\n            }\n            j = num2.number;\n            n = num1.number;\n            if (n <= 0 || !Number.isInteger(n) || !Number.isInteger(j) ||\n                stack.length < n) {\n              // ... and integers\n              return null;\n            }\n            j = ((j % n) + n) % n;\n            if (j === 0) {\n              break; // just skipping -- there are nothing to rotate\n            }\n            Array.prototype.push.apply(stack,\n                                       stack.splice(stack.length - n, n - j));\n            break;\n          default:\n            return null; // unsupported operator\n        }\n      }\n\n      if (stack.length !== outputSize) {\n        return null;\n      }\n\n      var result = [];\n      instructions.forEach(function (instruction) {\n        var statementBuilder = new ExpressionBuilderVisitor();\n        instruction.visit(statementBuilder);\n        result.push(statementBuilder.toString());\n      });\n      stack.forEach(function (expr, i) {\n        var statementBuilder = new ExpressionBuilderVisitor();\n        expr.visit(statementBuilder);\n        var min = range[i * 2], max = range[i * 2 + 1];\n        var out = [statementBuilder.toString()];\n        if (min > expr.min) {\n          out.unshift('Math.max(', min, ', ');\n          out.push(')');\n        }\n        if (max < expr.max) {\n          out.unshift('Math.min(', max, ', ');\n          out.push(')');\n        }\n        out.unshift('dest[destOffset + ', i, '] = ');\n        out.push(';');\n        result.push(out.join(''));\n      });\n      return result.join('\\n');\n    },\n  };\n\n  return PostScriptCompiler;\n})();\n\nexport {\n  isPDFFunction,\n  PDFFunctionFactory,\n  PostScriptEvaluator,\n  PostScriptCompiler,\n};\n","/* Copyright 2014 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FormatError, isSpace } from '../shared/util';\nimport { EOF } from './primitives';\n\nvar PostScriptParser = (function PostScriptParserClosure() {\n  function PostScriptParser(lexer) {\n    this.lexer = lexer;\n    this.operators = [];\n    this.token = null;\n    this.prev = null;\n  }\n  PostScriptParser.prototype = {\n    nextToken: function PostScriptParser_nextToken() {\n      this.prev = this.token;\n      this.token = this.lexer.getToken();\n    },\n    accept: function PostScriptParser_accept(type) {\n      if (this.token.type === type) {\n        this.nextToken();\n        return true;\n      }\n      return false;\n    },\n    expect: function PostScriptParser_expect(type) {\n      if (this.accept(type)) {\n        return true;\n      }\n      throw new FormatError(\n        `Unexpected symbol: found ${this.token.type} expected ${type}.`);\n    },\n    parse: function PostScriptParser_parse() {\n      this.nextToken();\n      this.expect(PostScriptTokenTypes.LBRACE);\n      this.parseBlock();\n      this.expect(PostScriptTokenTypes.RBRACE);\n      return this.operators;\n    },\n    parseBlock: function PostScriptParser_parseBlock() {\n      while (true) {\n        if (this.accept(PostScriptTokenTypes.NUMBER)) {\n          this.operators.push(this.prev.value);\n        } else if (this.accept(PostScriptTokenTypes.OPERATOR)) {\n          this.operators.push(this.prev.value);\n        } else if (this.accept(PostScriptTokenTypes.LBRACE)) {\n          this.parseCondition();\n        } else {\n          return;\n        }\n      }\n    },\n    parseCondition: function PostScriptParser_parseCondition() {\n      // Add two place holders that will be updated later\n      var conditionLocation = this.operators.length;\n      this.operators.push(null, null);\n\n      this.parseBlock();\n      this.expect(PostScriptTokenTypes.RBRACE);\n      if (this.accept(PostScriptTokenTypes.IF)) {\n        // The true block is right after the 'if' so it just falls through on\n        // true else it jumps and skips the true block.\n        this.operators[conditionLocation] = this.operators.length;\n        this.operators[conditionLocation + 1] = 'jz';\n      } else if (this.accept(PostScriptTokenTypes.LBRACE)) {\n        var jumpLocation = this.operators.length;\n        this.operators.push(null, null);\n        var endOfTrue = this.operators.length;\n        this.parseBlock();\n        this.expect(PostScriptTokenTypes.RBRACE);\n        this.expect(PostScriptTokenTypes.IFELSE);\n        // The jump is added at the end of the true block to skip the false\n        // block.\n        this.operators[jumpLocation] = this.operators.length;\n        this.operators[jumpLocation + 1] = 'j';\n\n        this.operators[conditionLocation] = endOfTrue;\n        this.operators[conditionLocation + 1] = 'jz';\n      } else {\n        throw new FormatError('PS Function: error parsing conditional.');\n      }\n    },\n  };\n  return PostScriptParser;\n})();\n\nvar PostScriptTokenTypes = {\n  LBRACE: 0,\n  RBRACE: 1,\n  NUMBER: 2,\n  OPERATOR: 3,\n  IF: 4,\n  IFELSE: 5,\n};\n\nvar PostScriptToken = (function PostScriptTokenClosure() {\n  function PostScriptToken(type, value) {\n    this.type = type;\n    this.value = value;\n  }\n\n  var opCache = Object.create(null);\n\n  PostScriptToken.getOperator = function PostScriptToken_getOperator(op) {\n    var opValue = opCache[op];\n    if (opValue) {\n      return opValue;\n    }\n    return opCache[op] = new PostScriptToken(PostScriptTokenTypes.OPERATOR, op);\n  };\n\n  PostScriptToken.LBRACE = new PostScriptToken(PostScriptTokenTypes.LBRACE,\n    '{');\n  PostScriptToken.RBRACE = new PostScriptToken(PostScriptTokenTypes.RBRACE,\n    '}');\n  PostScriptToken.IF = new PostScriptToken(PostScriptTokenTypes.IF, 'IF');\n  PostScriptToken.IFELSE = new PostScriptToken(PostScriptTokenTypes.IFELSE,\n    'IFELSE');\n  return PostScriptToken;\n})();\n\nvar PostScriptLexer = (function PostScriptLexerClosure() {\n  function PostScriptLexer(stream) {\n    this.stream = stream;\n    this.nextChar();\n\n    this.strBuf = [];\n  }\n  PostScriptLexer.prototype = {\n    nextChar: function PostScriptLexer_nextChar() {\n      return (this.currentChar = this.stream.getByte());\n    },\n    getToken: function PostScriptLexer_getToken() {\n      var comment = false;\n      var ch = this.currentChar;\n\n      // skip comments\n      while (true) {\n        if (ch < 0) {\n          return EOF;\n        }\n\n        if (comment) {\n          if (ch === 0x0A || ch === 0x0D) {\n            comment = false;\n          }\n        } else if (ch === 0x25) { // '%'\n          comment = true;\n        } else if (!isSpace(ch)) {\n          break;\n        }\n        ch = this.nextChar();\n      }\n      switch (ch | 0) {\n        case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: // '0'-'4'\n        case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: // '5'-'9'\n        case 0x2B: case 0x2D: case 0x2E: // '+', '-', '.'\n          return new PostScriptToken(PostScriptTokenTypes.NUMBER,\n                                     this.getNumber());\n        case 0x7B: // '{'\n          this.nextChar();\n          return PostScriptToken.LBRACE;\n        case 0x7D: // '}'\n          this.nextChar();\n          return PostScriptToken.RBRACE;\n      }\n      // operator\n      var strBuf = this.strBuf;\n      strBuf.length = 0;\n      strBuf[0] = String.fromCharCode(ch);\n\n      while ((ch = this.nextChar()) >= 0 && // and 'A'-'Z', 'a'-'z'\n             ((ch >= 0x41 && ch <= 0x5A) || (ch >= 0x61 && ch <= 0x7A))) {\n        strBuf.push(String.fromCharCode(ch));\n      }\n      var str = strBuf.join('');\n      switch (str.toLowerCase()) {\n        case 'if':\n          return PostScriptToken.IF;\n        case 'ifelse':\n          return PostScriptToken.IFELSE;\n        default:\n          return PostScriptToken.getOperator(str);\n      }\n    },\n    getNumber: function PostScriptLexer_getNumber() {\n      var ch = this.currentChar;\n      var strBuf = this.strBuf;\n      strBuf.length = 0;\n      strBuf[0] = String.fromCharCode(ch);\n\n      while ((ch = this.nextChar()) >= 0) {\n        if ((ch >= 0x30 && ch <= 0x39) || // '0'-'9'\n            ch === 0x2D || ch === 0x2E) { // '-', '.'\n          strBuf.push(String.fromCharCode(ch));\n        } else {\n          break;\n        }\n      }\n      var value = parseFloat(strBuf.join(''));\n      if (isNaN(value)) {\n        throw new FormatError(`Invalid floating point number: ${value}`);\n      }\n      return value;\n    },\n  };\n  return PostScriptLexer;\n})();\n\nexport {\n  PostScriptLexer,\n  PostScriptParser,\n};\n","/* Copyright 2014 Opera Software ASA\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n *\n * Based on https://code.google.com/p/smhasher/wiki/MurmurHash3.\n * Hashes roughly 100 KB per millisecond on i7 3.4 GHz.\n */\n\nimport { isArrayBuffer, isString } from '../shared/util';\n\nvar MurmurHash3_64 = (function MurmurHash3_64Closure(seed) {\n  // Workaround for missing math precision in JS.\n  var MASK_HIGH = 0xffff0000;\n  var MASK_LOW = 0xffff;\n\n  function MurmurHash3_64(seed) {\n    var SEED = 0xc3d2e1f0;\n    this.h1 = seed ? seed & 0xffffffff : SEED;\n    this.h2 = seed ? seed & 0xffffffff : SEED;\n  }\n\n  MurmurHash3_64.prototype = {\n    update: function MurmurHash3_64_update(input) {\n      let data, length;\n      if (isString(input)) {\n        data = new Uint8Array(input.length * 2);\n        length = 0;\n        for (let i = 0, ii = input.length; i < ii; i++) {\n          var code = input.charCodeAt(i);\n          if (code <= 0xff) {\n            data[length++] = code;\n          } else {\n            data[length++] = code >>> 8;\n            data[length++] = code & 0xff;\n          }\n        }\n      } else if (isArrayBuffer(input)) {\n        data = input;\n        length = data.byteLength;\n      } else {\n        throw new Error('Wrong data format in MurmurHash3_64_update. ' +\n                        'Input must be a string or array.');\n      }\n\n      var blockCounts = length >> 2;\n      var tailLength = length - blockCounts * 4;\n      // we don't care about endianness here\n      var dataUint32 = new Uint32Array(data.buffer, 0, blockCounts);\n      var k1 = 0;\n      var k2 = 0;\n      var h1 = this.h1;\n      var h2 = this.h2;\n      var C1 = 0xcc9e2d51;\n      var C2 = 0x1b873593;\n      var C1_LOW = C1 & MASK_LOW;\n      var C2_LOW = C2 & MASK_LOW;\n\n      for (let i = 0; i < blockCounts; i++) {\n        if (i & 1) {\n          k1 = dataUint32[i];\n          k1 = (k1 * C1 & MASK_HIGH) | (k1 * C1_LOW & MASK_LOW);\n          k1 = k1 << 15 | k1 >>> 17;\n          k1 = (k1 * C2 & MASK_HIGH) | (k1 * C2_LOW & MASK_LOW);\n          h1 ^= k1;\n          h1 = h1 << 13 | h1 >>> 19;\n          h1 = h1 * 5 + 0xe6546b64;\n        } else {\n          k2 = dataUint32[i];\n          k2 = (k2 * C1 & MASK_HIGH) | (k2 * C1_LOW & MASK_LOW);\n          k2 = k2 << 15 | k2 >>> 17;\n          k2 = (k2 * C2 & MASK_HIGH) | (k2 * C2_LOW & MASK_LOW);\n          h2 ^= k2;\n          h2 = h2 << 13 | h2 >>> 19;\n          h2 = h2 * 5 + 0xe6546b64;\n        }\n      }\n\n      k1 = 0;\n\n      switch (tailLength) {\n        case 3:\n          k1 ^= data[blockCounts * 4 + 2] << 16;\n          /* falls through */\n        case 2:\n          k1 ^= data[blockCounts * 4 + 1] << 8;\n          /* falls through */\n        case 1:\n          k1 ^= data[blockCounts * 4];\n          /* falls through */\n        k1 = (k1 * C1 & MASK_HIGH) | (k1 * C1_LOW & MASK_LOW);\n        k1 = k1 << 15 | k1 >>> 17;\n        k1 = (k1 * C2 & MASK_HIGH) | (k1 * C2_LOW & MASK_LOW);\n        if (blockCounts & 1) {\n          h1 ^= k1;\n        } else {\n          h2 ^= k1;\n        }\n      }\n\n      this.h1 = h1;\n      this.h2 = h2;\n      return this;\n    },\n\n    hexdigest: function MurmurHash3_64_hexdigest() {\n      var h1 = this.h1;\n      var h2 = this.h2;\n\n      h1 ^= h2 >>> 1;\n      h1 = (h1 * 0xed558ccd & MASK_HIGH) | (h1 * 0x8ccd & MASK_LOW);\n      h2 = (h2 * 0xff51afd7 & MASK_HIGH) |\n           (((h2 << 16 | h1 >>> 16) * 0xafd7ed55 & MASK_HIGH) >>> 16);\n      h1 ^= h2 >>> 1;\n      h1 = (h1 * 0x1a85ec53 & MASK_HIGH) | (h1 * 0xec53 & MASK_LOW);\n      h2 = (h2 * 0xc4ceb9fe & MASK_HIGH) |\n           (((h2 << 16 | h1 >>> 16) * 0xb9fe1a85 & MASK_HIGH) >>> 16);\n      h1 ^= h2 >>> 1;\n\n      for (var i = 0, arr = [h1, h2], str = ''; i < arr.length; i++) {\n        var hex = (arr[i] >>> 0).toString(16);\n        while (hex.length < 8) {\n          hex = '0' + hex;\n        }\n        str += hex;\n      }\n\n      return str;\n    },\n  };\n\n  return MurmurHash3_64;\n})();\n\nexport {\n  MurmurHash3_64,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert, FormatError, ImageKind, info, warn } from '../shared/util';\nimport { isName, isStream, Name } from './primitives';\nimport { ColorSpace } from './colorspace';\nimport { DecodeStream } from './stream';\nimport { JpegStream } from './jpeg_stream';\nimport { JpxImage } from './jpx';\n\nvar PDFImage = (function PDFImageClosure() {\n  /**\n   * Decodes the image using native decoder if possible. Resolves the promise\n   * when the image data is ready.\n   */\n  function handleImageData(image, nativeDecoder) {\n    if (nativeDecoder && nativeDecoder.canDecode(image)) {\n      return nativeDecoder.decode(image).catch((reason) => {\n        warn('Native image decoding failed -- trying to recover: ' +\n             (reason && reason.message));\n        return image;\n      });\n    }\n    return Promise.resolve(image);\n  }\n\n  /**\n   * Decode and clamp a value. The formula is different from the spec because we\n   * don't decode to float range [0,1], we decode it in the [0,max] range.\n   */\n  function decodeAndClamp(value, addend, coefficient, max) {\n    value = addend + value * coefficient;\n    // Clamp the value to the range\n    return (value < 0 ? 0 : (value > max ? max : value));\n  }\n\n  /**\n   * Resizes an image mask with 1 component.\n   * @param {TypedArray} src - The source buffer.\n   * @param {Number} bpc - Number of bits per component.\n   * @param {Number} w1 - Original width.\n   * @param {Number} h1 - Original height.\n   * @param {Number} w2 - New width.\n   * @param {Number} h2 - New height.\n   * @returns {TypedArray} The resized image mask buffer.\n   */\n  function resizeImageMask(src, bpc, w1, h1, w2, h2) {\n    var length = w2 * h2;\n    var dest = (bpc <= 8 ? new Uint8Array(length) :\n      (bpc <= 16 ? new Uint16Array(length) : new Uint32Array(length)));\n    var xRatio = w1 / w2;\n    var yRatio = h1 / h2;\n    var i, j, py, newIndex = 0, oldIndex;\n    var xScaled = new Uint16Array(w2);\n    var w1Scanline = w1;\n\n    for (i = 0; i < w2; i++) {\n      xScaled[i] = Math.floor(i * xRatio);\n    }\n    for (i = 0; i < h2; i++) {\n      py = Math.floor(i * yRatio) * w1Scanline;\n      for (j = 0; j < w2; j++) {\n        oldIndex = py + xScaled[j];\n        dest[newIndex++] = src[oldIndex];\n      }\n    }\n    return dest;\n  }\n\n  function PDFImage({ xref, res, image, isInline = false, smask = null,\n                      mask = null, isMask = false, pdfFunctionFactory, }) {\n    this.image = image;\n    var dict = image.dict;\n\n    const filter = dict.get('Filter');\n    if (isName(filter)) {\n      switch (filter.name) {\n        case 'JPXDecode':\n          var jpxImage = new JpxImage();\n          jpxImage.parseImageProperties(image.stream);\n          image.stream.reset();\n\n          image.width = jpxImage.width;\n          image.height = jpxImage.height;\n          image.bitsPerComponent = jpxImage.bitsPerComponent;\n          image.numComps = jpxImage.componentsCount;\n          break;\n        case 'JBIG2Decode':\n          image.bitsPerComponent = 1;\n          image.numComps = 1;\n          break;\n      }\n    }\n    // TODO cache rendered images?\n\n    let width = dict.get('Width', 'W');\n    let height = dict.get('Height', 'H');\n\n    if ((Number.isInteger(image.width) && image.width > 0) &&\n        (Number.isInteger(image.height) && image.height > 0) &&\n        (image.width !== width || image.height !== height)) {\n      warn('PDFImage - using the Width/Height of the image data, ' +\n           'rather than the image dictionary.');\n      width = image.width;\n      height = image.height;\n    }\n    if (width < 1 || height < 1) {\n      throw new FormatError(`Invalid image width: ${width} or ` +\n                            `height: ${height}`);\n    }\n    this.width = width;\n    this.height = height;\n\n    this.interpolate = dict.get('Interpolate', 'I') || false;\n    this.imageMask = dict.get('ImageMask', 'IM') || false;\n    this.matte = dict.get('Matte') || false;\n\n    var bitsPerComponent = image.bitsPerComponent;\n    if (!bitsPerComponent) {\n      bitsPerComponent = dict.get('BitsPerComponent', 'BPC');\n      if (!bitsPerComponent) {\n        if (this.imageMask) {\n          bitsPerComponent = 1;\n        } else {\n          throw new FormatError(\n            `Bits per component missing in image: ${this.imageMask}`);\n        }\n      }\n    }\n    this.bpc = bitsPerComponent;\n\n    if (!this.imageMask) {\n      var colorSpace = dict.get('ColorSpace', 'CS');\n      if (!colorSpace) {\n        info('JPX images (which do not require color spaces)');\n        switch (image.numComps) {\n          case 1:\n            colorSpace = Name.get('DeviceGray');\n            break;\n          case 3:\n            colorSpace = Name.get('DeviceRGB');\n            break;\n          case 4:\n            colorSpace = Name.get('DeviceCMYK');\n            break;\n          default:\n            throw new Error(`JPX images with ${image.numComps} ` +\n                            'color components not supported.');\n        }\n      }\n      let resources = isInline ? res : null;\n      this.colorSpace = ColorSpace.parse(colorSpace, xref, resources,\n                                         pdfFunctionFactory);\n      this.numComps = this.colorSpace.numComps;\n    }\n\n    this.decode = dict.getArray('Decode', 'D');\n    this.needsDecode = false;\n    if (this.decode &&\n        ((this.colorSpace && !this.colorSpace.isDefaultDecode(this.decode)) ||\n         (isMask && !ColorSpace.isDefaultDecode(this.decode, 1)))) {\n      this.needsDecode = true;\n      // Do some preprocessing to avoid more math.\n      var max = (1 << bitsPerComponent) - 1;\n      this.decodeCoefficients = [];\n      this.decodeAddends = [];\n      for (var i = 0, j = 0; i < this.decode.length; i += 2, ++j) {\n        var dmin = this.decode[i];\n        var dmax = this.decode[i + 1];\n        this.decodeCoefficients[j] = dmax - dmin;\n        this.decodeAddends[j] = max * dmin;\n      }\n    }\n\n    if (smask) {\n      this.smask = new PDFImage({\n        xref,\n        res,\n        image: smask,\n        isInline,\n        pdfFunctionFactory,\n      });\n    } else if (mask) {\n      if (isStream(mask)) {\n        var maskDict = mask.dict, imageMask = maskDict.get('ImageMask', 'IM');\n        if (!imageMask) {\n          warn('Ignoring /Mask in image without /ImageMask.');\n        } else {\n          this.mask = new PDFImage({\n            xref,\n            res,\n            image: mask,\n            isInline,\n            isMask: true,\n            pdfFunctionFactory,\n          });\n        }\n      } else {\n        // Color key mask (just an array).\n        this.mask = mask;\n      }\n    }\n  }\n  /**\n   * Handles processing of image data and returns the Promise that is resolved\n   * with a PDFImage when the image is ready to be used.\n   */\n  PDFImage.buildImage = function({ handler, xref, res, image, isInline = false,\n                                   nativeDecoder = null,\n                                   pdfFunctionFactory, }) {\n    var imagePromise = handleImageData(image, nativeDecoder);\n    var smaskPromise;\n    var maskPromise;\n\n    var smask = image.dict.get('SMask');\n    var mask = image.dict.get('Mask');\n\n    if (smask) {\n      smaskPromise = handleImageData(smask, nativeDecoder);\n      maskPromise = Promise.resolve(null);\n    } else {\n      smaskPromise = Promise.resolve(null);\n      if (mask) {\n        if (isStream(mask)) {\n          maskPromise = handleImageData(mask, nativeDecoder);\n        } else if (Array.isArray(mask)) {\n          maskPromise = Promise.resolve(mask);\n        } else {\n          warn('Unsupported mask format.');\n          maskPromise = Promise.resolve(null);\n        }\n      } else {\n        maskPromise = Promise.resolve(null);\n      }\n    }\n    return Promise.all([imagePromise, smaskPromise, maskPromise]).then(\n      function([imageData, smaskData, maskData]) {\n        return new PDFImage({\n          xref,\n          res,\n          image: imageData,\n          isInline,\n          smask: smaskData,\n          mask: maskData,\n          pdfFunctionFactory,\n        });\n      });\n  };\n\n  PDFImage.createMask = function({ imgArray, width, height,\n                                   imageIsFromDecodeStream, inverseDecode, }) {\n    if (typeof PDFJSDev === 'undefined' ||\n        PDFJSDev.test('!PRODUCTION || TESTING')) {\n      assert(imgArray instanceof Uint8ClampedArray,\n             'PDFImage.createMask: Unsupported \"imgArray\" type.');\n    }\n    // |imgArray| might not contain full data for every pixel of the mask, so\n    // we need to distinguish between |computedLength| and |actualLength|.\n    // In particular, if inverseDecode is true, then the array we return must\n    // have a length of |computedLength|.\n\n    var computedLength = ((width + 7) >> 3) * height;\n    var actualLength = imgArray.byteLength;\n    var haveFullData = computedLength === actualLength;\n    var data, i;\n\n    if (imageIsFromDecodeStream && (!inverseDecode || haveFullData)) {\n      // imgArray came from a DecodeStream and its data is in an appropriate\n      // form, so we can just transfer it.\n      data = imgArray;\n    } else if (!inverseDecode) {\n      data = new Uint8ClampedArray(actualLength);\n      data.set(imgArray);\n    } else {\n      data = new Uint8ClampedArray(computedLength);\n      data.set(imgArray);\n      for (i = actualLength; i < computedLength; i++) {\n        data[i] = 0xff;\n      }\n    }\n\n    // If necessary, invert the original mask data (but not any extra we might\n    // have added above). It's safe to modify the array -- whether it's the\n    // original or a copy, we're about to transfer it anyway, so nothing else\n    // in this thread can be relying on its contents.\n    if (inverseDecode) {\n      for (i = 0; i < actualLength; i++) {\n        data[i] ^= 0xFF;\n      }\n    }\n\n    return { data, width, height, };\n  };\n\n  PDFImage.prototype = {\n    get drawWidth() {\n      return Math.max(this.width,\n                      this.smask && this.smask.width || 0,\n                      this.mask && this.mask.width || 0);\n    },\n\n    get drawHeight() {\n      return Math.max(this.height,\n                      this.smask && this.smask.height || 0,\n                      this.mask && this.mask.height || 0);\n    },\n\n    decodeBuffer(buffer) {\n      var bpc = this.bpc;\n      var numComps = this.numComps;\n\n      var decodeAddends = this.decodeAddends;\n      var decodeCoefficients = this.decodeCoefficients;\n      var max = (1 << bpc) - 1;\n      var i, ii;\n\n      if (bpc === 1) {\n        // If the buffer needed decode that means it just needs to be inverted.\n        for (i = 0, ii = buffer.length; i < ii; i++) {\n          buffer[i] = +!(buffer[i]);\n        }\n        return;\n      }\n      var index = 0;\n      for (i = 0, ii = this.width * this.height; i < ii; i++) {\n        for (var j = 0; j < numComps; j++) {\n          buffer[index] = decodeAndClamp(buffer[index], decodeAddends[j],\n                                         decodeCoefficients[j], max);\n          index++;\n        }\n      }\n    },\n\n    getComponents(buffer) {\n      var bpc = this.bpc;\n\n      // This image doesn't require any extra work.\n      if (bpc === 8) {\n        return buffer;\n      }\n\n      var width = this.width;\n      var height = this.height;\n      var numComps = this.numComps;\n\n      var length = width * height * numComps;\n      var bufferPos = 0;\n      var output = (bpc <= 8 ? new Uint8Array(length) :\n        (bpc <= 16 ? new Uint16Array(length) : new Uint32Array(length)));\n      var rowComps = width * numComps;\n\n      var max = (1 << bpc) - 1;\n      var i = 0, ii, buf;\n\n      if (bpc === 1) {\n        // Optimization for reading 1 bpc images.\n        var mask, loop1End, loop2End;\n        for (var j = 0; j < height; j++) {\n          loop1End = i + (rowComps & ~7);\n          loop2End = i + rowComps;\n\n          // unroll loop for all full bytes\n          while (i < loop1End) {\n            buf = buffer[bufferPos++];\n            output[i] = (buf >> 7) & 1;\n            output[i + 1] = (buf >> 6) & 1;\n            output[i + 2] = (buf >> 5) & 1;\n            output[i + 3] = (buf >> 4) & 1;\n            output[i + 4] = (buf >> 3) & 1;\n            output[i + 5] = (buf >> 2) & 1;\n            output[i + 6] = (buf >> 1) & 1;\n            output[i + 7] = buf & 1;\n            i += 8;\n          }\n\n          // handle remaining bits\n          if (i < loop2End) {\n            buf = buffer[bufferPos++];\n            mask = 128;\n            while (i < loop2End) {\n              output[i++] = +!!(buf & mask);\n              mask >>= 1;\n            }\n          }\n        }\n      } else {\n        // The general case that handles all other bpc values.\n        var bits = 0;\n        buf = 0;\n        for (i = 0, ii = length; i < ii; ++i) {\n          if (i % rowComps === 0) {\n            buf = 0;\n            bits = 0;\n          }\n\n          while (bits < bpc) {\n            buf = (buf << 8) | buffer[bufferPos++];\n            bits += 8;\n          }\n\n          var remainingBits = bits - bpc;\n          var value = buf >> remainingBits;\n          output[i] = (value < 0 ? 0 : (value > max ? max : value));\n          buf = buf & ((1 << remainingBits) - 1);\n          bits = remainingBits;\n        }\n      }\n      return output;\n    },\n\n    fillOpacity(rgbaBuf, width, height, actualHeight, image) {\n      if (typeof PDFJSDev === 'undefined' ||\n          PDFJSDev.test('!PRODUCTION || TESTING')) {\n        assert(rgbaBuf instanceof Uint8ClampedArray,\n               'PDFImage.fillOpacity: Unsupported \"rgbaBuf\" type.');\n      }\n      var smask = this.smask;\n      var mask = this.mask;\n      var alphaBuf, sw, sh, i, ii, j;\n\n      if (smask) {\n        sw = smask.width;\n        sh = smask.height;\n        alphaBuf = new Uint8ClampedArray(sw * sh);\n        smask.fillGrayBuffer(alphaBuf);\n        if (sw !== width || sh !== height) {\n          alphaBuf = resizeImageMask(alphaBuf, smask.bpc, sw, sh,\n                                     width, height);\n        }\n      } else if (mask) {\n        if (mask instanceof PDFImage) {\n          sw = mask.width;\n          sh = mask.height;\n          alphaBuf = new Uint8ClampedArray(sw * sh);\n          mask.numComps = 1;\n          mask.fillGrayBuffer(alphaBuf);\n\n          // Need to invert values in rgbaBuf\n          for (i = 0, ii = sw * sh; i < ii; ++i) {\n            alphaBuf[i] = 255 - alphaBuf[i];\n          }\n\n          if (sw !== width || sh !== height) {\n            alphaBuf = resizeImageMask(alphaBuf, mask.bpc, sw, sh,\n                                       width, height);\n          }\n        } else if (Array.isArray(mask)) {\n          // Color key mask: if any of the components are outside the range\n          // then they should be painted.\n          alphaBuf = new Uint8ClampedArray(width * height);\n          var numComps = this.numComps;\n          for (i = 0, ii = width * height; i < ii; ++i) {\n            var opacity = 0;\n            var imageOffset = i * numComps;\n            for (j = 0; j < numComps; ++j) {\n              var color = image[imageOffset + j];\n              var maskOffset = j * 2;\n              if (color < mask[maskOffset] || color > mask[maskOffset + 1]) {\n                opacity = 255;\n                break;\n              }\n            }\n            alphaBuf[i] = opacity;\n          }\n        } else {\n          throw new FormatError('Unknown mask format.');\n        }\n      }\n\n      if (alphaBuf) {\n        for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) {\n          rgbaBuf[j] = alphaBuf[i];\n        }\n      } else {\n        // No mask.\n        for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) {\n          rgbaBuf[j] = 255;\n        }\n      }\n    },\n\n    undoPreblend(buffer, width, height) {\n      if (typeof PDFJSDev === 'undefined' ||\n          PDFJSDev.test('!PRODUCTION || TESTING')) {\n        assert(buffer instanceof Uint8ClampedArray,\n               'PDFImage.undoPreblend: Unsupported \"buffer\" type.');\n      }\n      var matte = this.smask && this.smask.matte;\n      if (!matte) {\n        return;\n      }\n      var matteRgb = this.colorSpace.getRgb(matte, 0);\n      var matteR = matteRgb[0];\n      var matteG = matteRgb[1];\n      var matteB = matteRgb[2];\n      var length = width * height * 4;\n      for (var i = 0; i < length; i += 4) {\n        var alpha = buffer[i + 3];\n        if (alpha === 0) {\n          // according formula we have to get Infinity in all components\n          // making it white (typical paper color) should be okay\n          buffer[i] = 255;\n          buffer[i + 1] = 255;\n          buffer[i + 2] = 255;\n          continue;\n        }\n        var k = 255 / alpha;\n        buffer[i] = (buffer[i] - matteR) * k + matteR;\n        buffer[i + 1] = (buffer[i + 1] - matteG) * k + matteG;\n        buffer[i + 2] = (buffer[i + 2] - matteB) * k + matteB;\n      }\n    },\n\n    createImageData(forceRGBA = false) {\n      var drawWidth = this.drawWidth;\n      var drawHeight = this.drawHeight;\n      var imgData = { // other fields are filled in below\n        width: drawWidth,\n        height: drawHeight,\n        kind: 0,\n        data: null,\n      };\n\n      var numComps = this.numComps;\n      var originalWidth = this.width;\n      var originalHeight = this.height;\n      var bpc = this.bpc;\n\n      // Rows start at byte boundary.\n      var rowBytes = (originalWidth * numComps * bpc + 7) >> 3;\n      var imgArray;\n\n      if (!forceRGBA) {\n        // If it is a 1-bit-per-pixel grayscale (i.e. black-and-white) image\n        // without any complications, we pass a same-sized copy to the main\n        // thread rather than expanding by 32x to RGBA form. This saves *lots*\n        // of memory for many scanned documents. It's also much faster.\n        //\n        // Similarly, if it is a 24-bit-per pixel RGB image without any\n        // complications, we avoid expanding by 1.333x to RGBA form.\n        var kind;\n        if (this.colorSpace.name === 'DeviceGray' && bpc === 1) {\n          kind = ImageKind.GRAYSCALE_1BPP;\n        } else if (this.colorSpace.name === 'DeviceRGB' && bpc === 8 &&\n                   !this.needsDecode) {\n          kind = ImageKind.RGB_24BPP;\n        }\n        if (kind && !this.smask && !this.mask &&\n            drawWidth === originalWidth && drawHeight === originalHeight) {\n          imgData.kind = kind;\n\n          imgArray = this.getImageBytes(originalHeight * rowBytes);\n          // If imgArray came from a DecodeStream, we're safe to transfer it\n          // (and thus detach its underlying buffer) because it will constitute\n          // the entire DecodeStream's data.  But if it came from a Stream, we\n          // need to copy it because it'll only be a portion of the Stream's\n          // data, and the rest will be read later on.\n          if (this.image instanceof DecodeStream) {\n            imgData.data = imgArray;\n          } else {\n            var newArray = new Uint8ClampedArray(imgArray.length);\n            newArray.set(imgArray);\n            imgData.data = newArray;\n          }\n          if (this.needsDecode) {\n            // Invert the buffer (which must be grayscale if we reached here).\n            assert(kind === ImageKind.GRAYSCALE_1BPP,\n                   'PDFImage.createImageData: The image must be grayscale.');\n            var buffer = imgData.data;\n            for (var i = 0, ii = buffer.length; i < ii; i++) {\n              buffer[i] ^= 0xff;\n            }\n          }\n          return imgData;\n        }\n        if (this.image instanceof JpegStream && !this.smask && !this.mask) {\n          let imageLength = originalHeight * rowBytes;\n          switch (this.colorSpace.name) {\n            case 'DeviceGray':\n              // Avoid truncating the image, since `JpegImage.getData`\n              // will expand the image data when `forceRGB === true`.\n              imageLength *= 3;\n              /* falls through */\n            case 'DeviceRGB':\n            case 'DeviceCMYK':\n              imgData.kind = ImageKind.RGB_24BPP;\n              imgData.data = this.getImageBytes(imageLength,\n                drawWidth, drawHeight, /* forceRGB = */ true);\n              return imgData;\n          }\n        }\n      }\n\n      imgArray = this.getImageBytes(originalHeight * rowBytes);\n      // imgArray can be incomplete (e.g. after CCITT fax encoding).\n      var actualHeight = 0 | (imgArray.length / rowBytes *\n                         drawHeight / originalHeight);\n\n      var comps = this.getComponents(imgArray);\n\n      // If opacity data is present, use RGBA_32BPP form. Otherwise, use the\n      // more compact RGB_24BPP form if allowable.\n      var alpha01, maybeUndoPreblend;\n      if (!forceRGBA && !this.smask && !this.mask) {\n        imgData.kind = ImageKind.RGB_24BPP;\n        imgData.data = new Uint8ClampedArray(drawWidth * drawHeight * 3);\n        alpha01 = 0;\n        maybeUndoPreblend = false;\n      } else {\n        imgData.kind = ImageKind.RGBA_32BPP;\n        imgData.data = new Uint8ClampedArray(drawWidth * drawHeight * 4);\n        alpha01 = 1;\n        maybeUndoPreblend = true;\n\n        // Color key masking (opacity) must be performed before decoding.\n        this.fillOpacity(imgData.data, drawWidth, drawHeight, actualHeight,\n                         comps);\n      }\n\n      if (this.needsDecode) {\n        this.decodeBuffer(comps);\n      }\n      this.colorSpace.fillRgb(imgData.data, originalWidth, originalHeight,\n                              drawWidth, drawHeight, actualHeight, bpc, comps,\n                              alpha01);\n      if (maybeUndoPreblend) {\n        this.undoPreblend(imgData.data, drawWidth, actualHeight);\n      }\n\n      return imgData;\n    },\n\n    fillGrayBuffer(buffer) {\n      if (typeof PDFJSDev === 'undefined' ||\n          PDFJSDev.test('!PRODUCTION || TESTING')) {\n        assert(buffer instanceof Uint8ClampedArray,\n               'PDFImage.fillGrayBuffer: Unsupported \"buffer\" type.');\n      }\n      var numComps = this.numComps;\n      if (numComps !== 1) {\n        throw new FormatError(\n          `Reading gray scale from a color image: ${numComps}`);\n      }\n\n      var width = this.width;\n      var height = this.height;\n      var bpc = this.bpc;\n\n      // rows start at byte boundary\n      var rowBytes = (width * numComps * bpc + 7) >> 3;\n      var imgArray = this.getImageBytes(height * rowBytes);\n\n      var comps = this.getComponents(imgArray);\n      var i, length;\n\n      if (bpc === 1) {\n        // inline decoding (= inversion) for 1 bpc images\n        length = width * height;\n        if (this.needsDecode) {\n          // invert and scale to {0, 255}\n          for (i = 0; i < length; ++i) {\n            buffer[i] = (comps[i] - 1) & 255;\n          }\n        } else {\n          // scale to {0, 255}\n          for (i = 0; i < length; ++i) {\n            buffer[i] = (-comps[i]) & 255;\n          }\n        }\n        return;\n      }\n\n      if (this.needsDecode) {\n        this.decodeBuffer(comps);\n      }\n      length = width * height;\n      // we aren't using a colorspace so we need to scale the value\n      var scale = 255 / ((1 << bpc) - 1);\n      for (i = 0; i < length; ++i) {\n        buffer[i] = scale * comps[i];\n      }\n    },\n\n    getImageBytes(length, drawWidth, drawHeight, forceRGB = false) {\n      this.image.reset();\n      this.image.drawWidth = drawWidth || this.width;\n      this.image.drawHeight = drawHeight || this.height;\n      this.image.forceRGB = !!forceRGB;\n      return this.image.getBytes(length, /* forceClamped = */ true);\n    },\n  };\n  return PDFImage;\n})();\n\nexport {\n  PDFImage,\n};\n","/* Copyright 2018 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  AbortException, assert, createPromiseCapability, MissingPDFException,\n  ReadableStream, UnexpectedResponseException, UnknownErrorException\n} from './util';\n\nasync function resolveCall(fn, args, thisArg = null) {\n  if (!fn) {\n    return;\n  }\n  return fn.apply(thisArg, args);\n}\n\nfunction wrapReason(reason) {\n  if (typeof reason !== 'object') {\n    return reason;\n  }\n  switch (reason.name) {\n    case 'AbortException':\n      return new AbortException(reason.message);\n    case 'MissingPDFException':\n      return new MissingPDFException(reason.message);\n    case 'UnexpectedResponseException':\n      return new UnexpectedResponseException(reason.message, reason.status);\n    default:\n      return new UnknownErrorException(reason.message, reason.details);\n  }\n}\n\nfunction makeReasonSerializable(reason) {\n  if (!(reason instanceof Error) ||\n      reason instanceof AbortException ||\n      reason instanceof MissingPDFException ||\n      reason instanceof UnexpectedResponseException ||\n      reason instanceof UnknownErrorException) {\n    return reason;\n  }\n  return new UnknownErrorException(reason.message, reason.toString());\n}\n\nfunction resolveOrReject(capability, success, reason) {\n  if (success) {\n    capability.resolve();\n  } else {\n    capability.reject(reason);\n  }\n}\n\nfunction finalize(promise) {\n  return Promise.resolve(promise).catch(() => {});\n}\n\nfunction MessageHandler(sourceName, targetName, comObj) {\n  this.sourceName = sourceName;\n  this.targetName = targetName;\n  this.comObj = comObj;\n  this.callbackId = 1;\n  this.streamId = 1;\n  this.postMessageTransfers = true;\n  this.streamSinks = Object.create(null);\n  this.streamControllers = Object.create(null);\n  let callbacksCapabilities = this.callbacksCapabilities = Object.create(null);\n  let ah = this.actionHandler = Object.create(null);\n\n  this._onComObjOnMessage = (event) => {\n    let data = event.data;\n    if (data.targetName !== this.sourceName) {\n      return;\n    }\n    if (data.stream) {\n      this._processStreamMessage(data);\n    } else if (data.isReply) {\n      let callbackId = data.callbackId;\n      if (data.callbackId in callbacksCapabilities) {\n        let callback = callbacksCapabilities[callbackId];\n        delete callbacksCapabilities[callbackId];\n        if ('error' in data) {\n          callback.reject(wrapReason(data.error));\n        } else {\n          callback.resolve(data.data);\n        }\n      } else {\n        throw new Error(`Cannot resolve callback ${callbackId}`);\n      }\n    } else if (data.action in ah) {\n      let action = ah[data.action];\n      if (data.callbackId) {\n        let sourceName = this.sourceName;\n        let targetName = data.sourceName;\n        Promise.resolve().then(function () {\n          return action[0].call(action[1], data.data);\n        }).then((result) => {\n          comObj.postMessage({\n            sourceName,\n            targetName,\n            isReply: true,\n            callbackId: data.callbackId,\n            data: result,\n          });\n        }, (reason) => {\n          comObj.postMessage({\n            sourceName,\n            targetName,\n            isReply: true,\n            callbackId: data.callbackId,\n            error: makeReasonSerializable(reason),\n          });\n        });\n      } else if (data.streamId) {\n        this._createStreamSink(data);\n      } else {\n        action[0].call(action[1], data.data);\n      }\n    } else {\n      throw new Error(`Unknown action from worker: ${data.action}`);\n    }\n  };\n  comObj.addEventListener('message', this._onComObjOnMessage);\n}\n\nMessageHandler.prototype = {\n  on(actionName, handler, scope) {\n    var ah = this.actionHandler;\n    if (ah[actionName]) {\n      throw new Error(`There is already an actionName called \"${actionName}\"`);\n    }\n    ah[actionName] = [handler, scope];\n  },\n  /**\n   * Sends a message to the comObj to invoke the action with the supplied data.\n   * @param {String} actionName - Action to call.\n   * @param {JSON} data - JSON data to send.\n   * @param {Array} [transfers] - Optional list of transfers/ArrayBuffers\n   */\n  send(actionName, data, transfers) {\n    var message = {\n      sourceName: this.sourceName,\n      targetName: this.targetName,\n      action: actionName,\n      data,\n    };\n    this.postMessage(message, transfers);\n  },\n  /**\n   * Sends a message to the comObj to invoke the action with the supplied data.\n   * Expects that the other side will callback with the response.\n   * @param {String} actionName - Action to call.\n   * @param {JSON} data - JSON data to send.\n   * @param {Array} [transfers] - Optional list of transfers/ArrayBuffers.\n   * @returns {Promise} Promise to be resolved with response data.\n   */\n  sendWithPromise(actionName, data, transfers) {\n    var callbackId = this.callbackId++;\n    var message = {\n      sourceName: this.sourceName,\n      targetName: this.targetName,\n      action: actionName,\n      data,\n      callbackId,\n    };\n    var capability = createPromiseCapability();\n    this.callbacksCapabilities[callbackId] = capability;\n    try {\n      this.postMessage(message, transfers);\n    } catch (e) {\n      capability.reject(e);\n    }\n    return capability.promise;\n  },\n  /**\n   * Sends a message to the comObj to invoke the action with the supplied data.\n   * Expect that the other side will callback to signal 'start_complete'.\n   * @param {String} actionName - Action to call.\n   * @param {JSON} data - JSON data to send.\n   * @param {Object} queueingStrategy - strategy to signal backpressure based on\n   *                 internal queue.\n   * @param {Array} [transfers] - Optional list of transfers/ArrayBuffers.\n   * @return {ReadableStream} ReadableStream to read data in chunks.\n   */\n  sendWithStream(actionName, data, queueingStrategy, transfers) {\n    let streamId = this.streamId++;\n    let sourceName = this.sourceName;\n    let targetName = this.targetName;\n\n    return new ReadableStream({\n      start: (controller) => {\n        let startCapability = createPromiseCapability();\n        this.streamControllers[streamId] = {\n          controller,\n          startCall: startCapability,\n          isClosed: false,\n        };\n        this.postMessage({\n          sourceName,\n          targetName,\n          action: actionName,\n          streamId,\n          data,\n          desiredSize: controller.desiredSize,\n        });\n        // Return Promise for Async process, to signal success/failure.\n        return startCapability.promise;\n      },\n\n      pull: (controller) => {\n        let pullCapability = createPromiseCapability();\n        this.streamControllers[streamId].pullCall = pullCapability;\n        this.postMessage({\n          sourceName,\n          targetName,\n          stream: 'pull',\n          streamId,\n          desiredSize: controller.desiredSize,\n        });\n        // Returning Promise will not call \"pull\"\n        // again until current pull is resolved.\n        return pullCapability.promise;\n      },\n\n      cancel: (reason) => {\n        let cancelCapability = createPromiseCapability();\n        this.streamControllers[streamId].cancelCall = cancelCapability;\n        this.streamControllers[streamId].isClosed = true;\n        this.postMessage({\n          sourceName,\n          targetName,\n          stream: 'cancel',\n          reason,\n          streamId,\n        });\n        // Return Promise to signal success or failure.\n        return cancelCapability.promise;\n      },\n    }, queueingStrategy);\n  },\n\n  _createStreamSink(data) {\n    let self = this;\n    let action = this.actionHandler[data.action];\n    let streamId = data.streamId;\n    let desiredSize = data.desiredSize;\n    let sourceName = this.sourceName;\n    let targetName = data.sourceName;\n    let capability = createPromiseCapability();\n\n    let sendStreamRequest = ({ stream, chunk, transfers,\n                               success, reason, }) => {\n      this.postMessage({ sourceName, targetName, stream, streamId,\n                         chunk, success, reason, }, transfers);\n    };\n\n    let streamSink = {\n      enqueue(chunk, size = 1, transfers) {\n        if (this.isCancelled) {\n          return;\n        }\n        let lastDesiredSize = this.desiredSize;\n        this.desiredSize -= size;\n        // Enqueue decreases the desiredSize property of sink,\n        // so when it changes from positive to negative,\n        // set ready as unresolved promise.\n        if (lastDesiredSize > 0 && this.desiredSize <= 0) {\n          this.sinkCapability = createPromiseCapability();\n          this.ready = this.sinkCapability.promise;\n        }\n        sendStreamRequest({ stream: 'enqueue', chunk, transfers, });\n      },\n\n      close() {\n        if (this.isCancelled) {\n          return;\n        }\n        this.isCancelled = true;\n        sendStreamRequest({ stream: 'close', });\n        delete self.streamSinks[streamId];\n      },\n\n      error(reason) {\n        if (this.isCancelled) {\n          return;\n        }\n        this.isCancelled = true;\n        sendStreamRequest({ stream: 'error', reason, });\n      },\n\n      sinkCapability: capability,\n      onPull: null,\n      onCancel: null,\n      isCancelled: false,\n      desiredSize,\n      ready: null,\n    };\n\n    streamSink.sinkCapability.resolve();\n    streamSink.ready = streamSink.sinkCapability.promise;\n    this.streamSinks[streamId] = streamSink;\n    resolveCall(action[0], [data.data, streamSink], action[1]).then(() => {\n      sendStreamRequest({ stream: 'start_complete', success: true, });\n    }, (reason) => {\n      sendStreamRequest({ stream: 'start_complete', success: false, reason, });\n    });\n  },\n\n  _processStreamMessage(data) {\n    let sourceName = this.sourceName;\n    let targetName = data.sourceName;\n    let streamId = data.streamId;\n\n    let sendStreamResponse = ({ stream, success, reason, }) => {\n      this.comObj.postMessage({ sourceName, targetName, stream,\n                                success, streamId, reason, });\n    };\n\n    let deleteStreamController = () => {\n      // Delete streamController only when start, pull and\n      // cancel callbacks are resolved, to avoid \"TypeError\".\n      Promise.all([\n        this.streamControllers[data.streamId].startCall,\n        this.streamControllers[data.streamId].pullCall,\n        this.streamControllers[data.streamId].cancelCall\n      ].map(function(capability) {\n        return capability && finalize(capability.promise);\n      })).then(() => {\n        delete this.streamControllers[data.streamId];\n      });\n    };\n\n    switch (data.stream) {\n      case 'start_complete':\n        resolveOrReject(this.streamControllers[data.streamId].startCall,\n                        data.success, wrapReason(data.reason));\n        break;\n      case 'pull_complete':\n        resolveOrReject(this.streamControllers[data.streamId].pullCall,\n                        data.success, wrapReason(data.reason));\n        break;\n      case 'pull':\n        // Ignore any pull after close is called.\n        if (!this.streamSinks[data.streamId]) {\n          sendStreamResponse({ stream: 'pull_complete', success: true, });\n          break;\n        }\n        // Pull increases the desiredSize property of sink,\n        // so when it changes from negative to positive,\n        // set ready property as resolved promise.\n        if (this.streamSinks[data.streamId].desiredSize <= 0 &&\n            data.desiredSize > 0) {\n          this.streamSinks[data.streamId].sinkCapability.resolve();\n        }\n        // Reset desiredSize property of sink on every pull.\n        this.streamSinks[data.streamId].desiredSize = data.desiredSize;\n        resolveCall(this.streamSinks[data.streamId].onPull).then(() => {\n          sendStreamResponse({ stream: 'pull_complete', success: true, });\n        }, (reason) => {\n          sendStreamResponse({ stream: 'pull_complete',\n                               success: false, reason, });\n        });\n        break;\n      case 'enqueue':\n        assert(this.streamControllers[data.streamId],\n               'enqueue should have stream controller');\n        if (!this.streamControllers[data.streamId].isClosed) {\n          this.streamControllers[data.streamId].controller.enqueue(data.chunk);\n        }\n        break;\n      case 'close':\n        assert(this.streamControllers[data.streamId],\n               'close should have stream controller');\n        if (this.streamControllers[data.streamId].isClosed) {\n          break;\n        }\n        this.streamControllers[data.streamId].isClosed = true;\n        this.streamControllers[data.streamId].controller.close();\n        deleteStreamController();\n        break;\n      case 'error':\n        assert(this.streamControllers[data.streamId],\n               'error should have stream controller');\n        this.streamControllers[data.streamId].controller.\n          error(wrapReason(data.reason));\n        deleteStreamController();\n        break;\n      case 'cancel_complete':\n        resolveOrReject(this.streamControllers[data.streamId].cancelCall,\n                        data.success, wrapReason(data.reason));\n        deleteStreamController();\n        break;\n      case 'cancel':\n        if (!this.streamSinks[data.streamId]) {\n          break;\n        }\n        resolveCall(this.streamSinks[data.streamId].onCancel,\n                    [wrapReason(data.reason)]).then(() => {\n          sendStreamResponse({ stream: 'cancel_complete', success: true, });\n        }, (reason) => {\n          sendStreamResponse({ stream: 'cancel_complete',\n                               success: false, reason, });\n        });\n        this.streamSinks[data.streamId].sinkCapability.\n          reject(wrapReason(data.reason));\n        this.streamSinks[data.streamId].isCancelled = true;\n        delete this.streamSinks[data.streamId];\n        break;\n      default:\n        throw new Error('Unexpected stream case');\n    }\n  },\n\n  /**\n   * Sends raw message to the comObj.\n   * @private\n   * @param {Object} message - Raw message.\n   * @param transfers List of transfers/ArrayBuffers, or undefined.\n   */\n  postMessage(message, transfers) {\n    if (transfers && this.postMessageTransfers) {\n      this.comObj.postMessage(message, transfers);\n    } else {\n      this.comObj.postMessage(message);\n    }\n  },\n\n  destroy() {\n    this.comObj.removeEventListener('message', this._onComObjOnMessage);\n  },\n};\n\nexport {\n  MessageHandler,\n};\n"],"sourceRoot":""}
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/pdfobject.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/pdfobject.js
new file mode 100644
index 0000000..100e362
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/pdfobject.js
@@ -0,0 +1,178 @@
+锘�/*    
+PDFObject v1.2.20111123    
+https://github.com/pipwerks/PDFObject    
+Copyright (c) Philip Hutchison    
+MIT-style license: http://pipwerks.mit-license.org/*/
+/*jslint browser: true, sloppy: true, white: true, plusplus: true */
+/*global ActiveXObject, window */
+var PDFObject = function(obj) {
+	if (!obj || !obj.url) {
+		return false;
+	}
+	var pdfobjectversion = "1.2",
+	//Set reasonable defaults        
+	id = obj.id || "vcipdfview", width = obj.width || "100%", height = obj.height
+			|| "100%", pdfOpenParams = obj.pdfOpenParams, url, pluginTypeFound,
+	//declare functions        
+	createAXO, hasReaderActiveX, hasReader, hasGeneric, pluginFound, setCssForFullWindowPdf, buildQueryString, get, embed;
+	/* ----------------------------------------------------       Supporting functions       ---------------------------------------------------- */
+	createAXO = function(type) {
+		var ax;
+		try {
+			ax = new ActiveXObject(type);
+		} catch (e) {
+			//ensure ax remains null            
+			ax = null;
+		}
+		return ax;
+	};
+	//Tests specifically for Adobe Reader (aka Acrobat) in Internet Explorer    
+	hasReaderActiveX = function() {
+		var axObj = null;
+		if (window.ActiveXObject) {
+
+			axObj = createAXO("AcroPDF.PDF");
+			//If "AcroPDF.PDF" didn't work, try "PDF.PdfCtrl"            
+			if (!axObj) {
+				axObj = createAXO("PDF.PdfCtrl");
+			}
+			//If either "AcroPDF.PDF" or "PDF.PdfCtrl" are found, return true            
+			if (axObj !== null) {
+				return true;
+			}
+		}
+		//If you got to this point, there's no ActiveXObject for PDFs        
+		return false;
+	};
+	//Tests specifically for Adobe Reader (aka Adobe Acrobat) in non-IE browsers    
+	hasReader = function() {
+		var i, n = navigator.plugins, count = n.length, regx = /Adobe Reader|Adobe PDF|Acrobat/gi;
+		for (i = 0; i < count; i++) {
+			if (regx.test(n[i].name)) {
+				return true;
+			}
+		}
+		return false;
+	};
+	//Detects unbranded PDF support    
+	hasGeneric = function() {
+		var plugin = navigator.mimeTypes["application/pdf"];
+		return (plugin && plugin.enabledPlugin);
+	};
+	//Determines what kind of PDF support is available: Adobe or generic    
+	pluginFound = function() {
+		var type = null;
+		if (hasReader() || hasReaderActiveX()) {
+			type = "Adobe";
+		} else if (hasGeneric()) {
+			type = "generic";
+		}
+		return type;
+	};
+	//If setting PDF to fill page, need to handle some CSS first    
+	setCssForFullWindowPdf = function() {
+		var html = document.getElementsByTagName("html"), html_style, body_style;
+		if (!html) {
+			return false;
+		}
+		html_style = html[0].style;
+		body_style = document.body.style;
+		html_style.height = "100%";
+		html_style.overflow = "hidden";
+		body_style.margin = "0";
+		body_style.padding = "0";
+		body_style.height = "100%";
+		body_style.overflow = "hidden";
+	};
+	//Creating a querystring for using PDF Open parameters when embedding PDF    
+	buildQueryString = function(pdfParams) {
+		var string = "", prop;
+		if (!pdfParams) {
+			return string;
+		}
+		for (prop in pdfParams) {
+			if (pdfParams.hasOwnProperty(prop)) {
+				string += prop + "=";
+				if (prop === "search") {
+					string += encodeURI(pdfParams[prop]);
+				} else {
+					string += pdfParams[prop];
+				}
+				string += "&";
+			}
+		}
+		//Remove last ampersand        
+		return string.slice(0, string.length - 1);
+	};
+	//Simple function for returning values from PDFObject    
+	get = function(prop) {
+		var value = null;
+		switch (prop) {
+		case "url":
+			value = url;
+			break;
+		case "id":
+			value = id;
+			break;
+		case "width":
+			value = width;
+			break;
+		case "height":
+			value = height;
+			break;
+		case "pdfOpenParams":
+			value = pdfOpenParams;
+			break;
+		case "pluginTypeFound":
+			value = pluginTypeFound;
+			break;
+		case "pdfobjectversion":
+			value = pdfobjectversion;
+			break;
+		}
+		return value;
+	};
+	/* ----------------------------------------------------       PDF Embedding functions       ---------------------------------------------------- */
+	embed = function(targetID) {
+		if (!pluginTypeFound) {
+			return false;
+		}
+		var targetNode = null;
+		if (targetID) {
+			//Allow users to pass an element OR an element's ID            
+			targetNode = (targetID.nodeType && targetID.nodeType === 1) ? targetID
+					: document.getElementById(targetID);
+			//Ensure target element is found in document before continuing            
+			if (!targetNode) {
+				return false;
+			}
+		} else {
+			targetNode = document.body;
+			setCssForFullWindowPdf();
+			width = "100%";
+			height = "100%";
+		}
+		targetNode.innerHTML = '<object data="' + url
+				+ '" type="application/pdf" width="' + width + '" height="'
+				+ height + '" id="' + id + '">';
+		//targetNode.innerHTML +='<param name="_version" value="327680">';
+		//targetNode.innerHTML +='<param name="_Extentx" value="2646">';
+		//targetNode.innerHTML +='<param name="_Extenty" value="1323">'; 
+		// targetNode.innerHTML +='<param name="_StockProps" value="0">';
+		targetNode.innerHTML += '</object>';
+		//style="margin-top:-70px;"
+		return targetNode.getElementsByTagName("object")[0];
+	};
+	//The hash (#) prevents odd behavior in Windows
+	//Append optional Adobe params for opening document
+	url = encodeURI(obj.url) + "#" + buildQueryString(pdfOpenParams);
+	pluginTypeFound = pluginFound();
+	this.get = function(prop) {
+		return get(prop);
+	};
+	this.embed = function(id) {
+		return embed(id);
+	};
+	this.pdfobjectversion = pdfobjectversion;
+	return this;
+};
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/78-EUC-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/78-EUC-H.bcmap
new file mode 100644
index 0000000..2655fc7
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/78-EUC-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/78-EUC-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/78-EUC-V.bcmap
new file mode 100644
index 0000000..f1ed853
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/78-EUC-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/78-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/78-H.bcmap
new file mode 100644
index 0000000..39e89d3
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/78-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/78-RKSJ-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/78-RKSJ-H.bcmap
new file mode 100644
index 0000000..e4167cb
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/78-RKSJ-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/78-RKSJ-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/78-RKSJ-V.bcmap
new file mode 100644
index 0000000..50b1646
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/78-RKSJ-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/78-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/78-V.bcmap
new file mode 100644
index 0000000..d7af99b
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/78-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/78ms-RKSJ-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/78ms-RKSJ-H.bcmap
new file mode 100644
index 0000000..37077d0
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/78ms-RKSJ-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/78ms-RKSJ-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/78ms-RKSJ-V.bcmap
new file mode 100644
index 0000000..acf2323
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/78ms-RKSJ-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/83pv-RKSJ-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/83pv-RKSJ-H.bcmap
new file mode 100644
index 0000000..2359bc5
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/83pv-RKSJ-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/90ms-RKSJ-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/90ms-RKSJ-H.bcmap
new file mode 100644
index 0000000..af82938
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/90ms-RKSJ-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/90ms-RKSJ-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/90ms-RKSJ-V.bcmap
new file mode 100644
index 0000000..780549d
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/90ms-RKSJ-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/90msp-RKSJ-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/90msp-RKSJ-H.bcmap
new file mode 100644
index 0000000..bfd3119
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/90msp-RKSJ-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/90msp-RKSJ-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/90msp-RKSJ-V.bcmap
new file mode 100644
index 0000000..25ef14a
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/90msp-RKSJ-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/90pv-RKSJ-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/90pv-RKSJ-H.bcmap
new file mode 100644
index 0000000..02f713b
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/90pv-RKSJ-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/90pv-RKSJ-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/90pv-RKSJ-V.bcmap
new file mode 100644
index 0000000..d08e0cc
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/90pv-RKSJ-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Add-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Add-H.bcmap
new file mode 100644
index 0000000..59442ac
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Add-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Add-RKSJ-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Add-RKSJ-H.bcmap
new file mode 100644
index 0000000..a3065e4
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Add-RKSJ-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Add-RKSJ-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Add-RKSJ-V.bcmap
new file mode 100644
index 0000000..040014c
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Add-RKSJ-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Add-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Add-V.bcmap
new file mode 100644
index 0000000..2f816d3
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Add-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-CNS1-0.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-CNS1-0.bcmap
new file mode 100644
index 0000000..88ec04a
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-CNS1-0.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-CNS1-1.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-CNS1-1.bcmap
new file mode 100644
index 0000000..03a5014
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-CNS1-1.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-CNS1-2.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-CNS1-2.bcmap
new file mode 100644
index 0000000..2aa9514
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-CNS1-2.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-CNS1-3.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-CNS1-3.bcmap
new file mode 100644
index 0000000..86d8b8c
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-CNS1-3.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-CNS1-4.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-CNS1-4.bcmap
new file mode 100644
index 0000000..f50fc6c
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-CNS1-4.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-CNS1-5.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-CNS1-5.bcmap
new file mode 100644
index 0000000..6caf4a8
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-CNS1-5.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-CNS1-6.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-CNS1-6.bcmap
new file mode 100644
index 0000000..b77fb07
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-CNS1-6.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-CNS1-UCS2.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-CNS1-UCS2.bcmap
new file mode 100644
index 0000000..69d79a2
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-CNS1-UCS2.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-GB1-0.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-GB1-0.bcmap
new file mode 100644
index 0000000..3610108
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-GB1-0.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-GB1-1.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-GB1-1.bcmap
new file mode 100644
index 0000000..707bb10
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-GB1-1.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-GB1-2.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-GB1-2.bcmap
new file mode 100644
index 0000000..f7648cc
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-GB1-2.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-GB1-3.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-GB1-3.bcmap
new file mode 100644
index 0000000..8521458
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-GB1-3.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-GB1-4.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-GB1-4.bcmap
new file mode 100644
index 0000000..e40c63a
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-GB1-4.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-GB1-5.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-GB1-5.bcmap
new file mode 100644
index 0000000..d7623b5
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-GB1-5.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-GB1-UCS2.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-GB1-UCS2.bcmap
new file mode 100644
index 0000000..7586525
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-GB1-UCS2.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-Japan1-0.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-Japan1-0.bcmap
new file mode 100644
index 0000000..f0e94ec
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-Japan1-0.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-Japan1-1.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-Japan1-1.bcmap
new file mode 100644
index 0000000..dad42c5
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-Japan1-1.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-Japan1-2.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-Japan1-2.bcmap
new file mode 100644
index 0000000..090819a
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-Japan1-2.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-Japan1-3.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-Japan1-3.bcmap
new file mode 100644
index 0000000..087dfc1
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-Japan1-3.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-Japan1-4.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-Japan1-4.bcmap
new file mode 100644
index 0000000..46aa9bf
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-Japan1-4.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-Japan1-5.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-Japan1-5.bcmap
new file mode 100644
index 0000000..5b4b65c
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-Japan1-5.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-Japan1-6.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-Japan1-6.bcmap
new file mode 100644
index 0000000..e77d699
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-Japan1-6.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-Japan1-UCS2.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-Japan1-UCS2.bcmap
new file mode 100644
index 0000000..128a141
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-Japan1-UCS2.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-Korea1-0.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-Korea1-0.bcmap
new file mode 100644
index 0000000..cef1a99
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-Korea1-0.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-Korea1-1.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-Korea1-1.bcmap
new file mode 100644
index 0000000..11ffa36
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-Korea1-1.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-Korea1-2.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-Korea1-2.bcmap
new file mode 100644
index 0000000..3172308
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-Korea1-2.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-Korea1-UCS2.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-Korea1-UCS2.bcmap
new file mode 100644
index 0000000..f3371c0
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Adobe-Korea1-UCS2.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/B5-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/B5-H.bcmap
new file mode 100644
index 0000000..beb4d22
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/B5-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/B5-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/B5-V.bcmap
new file mode 100644
index 0000000..2d4f87d
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/B5-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/B5pc-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/B5pc-H.bcmap
new file mode 100644
index 0000000..ce00131
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/B5pc-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/B5pc-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/B5pc-V.bcmap
new file mode 100644
index 0000000..73b99ff
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/B5pc-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/CNS-EUC-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/CNS-EUC-H.bcmap
new file mode 100644
index 0000000..61d1d0c
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/CNS-EUC-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/CNS-EUC-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/CNS-EUC-V.bcmap
new file mode 100644
index 0000000..1a393a5
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/CNS-EUC-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/CNS1-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/CNS1-H.bcmap
new file mode 100644
index 0000000..f738e21
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/CNS1-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/CNS1-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/CNS1-V.bcmap
new file mode 100644
index 0000000..9c3169f
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/CNS1-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/CNS2-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/CNS2-H.bcmap
new file mode 100644
index 0000000..c89b352
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/CNS2-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/CNS2-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/CNS2-V.bcmap
new file mode 100644
index 0000000..7588cec
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/CNS2-V.bcmap
@@ -0,0 +1,3 @@
+郣Copyright 1990-2009 Adobe Systems Incorporated.
+All rights reserved.
+See ./LICENSE�CNS2-H
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/ETHK-B5-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/ETHK-B5-H.bcmap
new file mode 100644
index 0000000..cb29415
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/ETHK-B5-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/ETHK-B5-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/ETHK-B5-V.bcmap
new file mode 100644
index 0000000..f09aec6
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/ETHK-B5-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/ETen-B5-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/ETen-B5-H.bcmap
new file mode 100644
index 0000000..c2d7746
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/ETen-B5-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/ETen-B5-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/ETen-B5-V.bcmap
new file mode 100644
index 0000000..89bff15
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/ETen-B5-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/ETenms-B5-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/ETenms-B5-H.bcmap
new file mode 100644
index 0000000..a7d69db
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/ETenms-B5-H.bcmap
@@ -0,0 +1,3 @@
+郣Copyright 1990-2009 Adobe Systems Incorporated.
+All rights reserved.
+See ./LICENSE�	ETen-B5-H` ^
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/ETenms-B5-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/ETenms-B5-V.bcmap
new file mode 100644
index 0000000..adc5d61
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/ETenms-B5-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/EUC-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/EUC-H.bcmap
new file mode 100644
index 0000000..e92ea5b
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/EUC-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/EUC-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/EUC-V.bcmap
new file mode 100644
index 0000000..7a7c183
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/EUC-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Ext-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Ext-H.bcmap
new file mode 100644
index 0000000..3b5cde4
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Ext-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Ext-RKSJ-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Ext-RKSJ-H.bcmap
new file mode 100644
index 0000000..ea4d2d9
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Ext-RKSJ-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Ext-RKSJ-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Ext-RKSJ-V.bcmap
new file mode 100644
index 0000000..3457c27
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Ext-RKSJ-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Ext-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Ext-V.bcmap
new file mode 100644
index 0000000..4999ca4
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Ext-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GB-EUC-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GB-EUC-H.bcmap
new file mode 100644
index 0000000..e39908b
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GB-EUC-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GB-EUC-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GB-EUC-V.bcmap
new file mode 100644
index 0000000..d5be544
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GB-EUC-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GB-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GB-H.bcmap
new file mode 100644
index 0000000..39189c5
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GB-H.bcmap
@@ -0,0 +1,4 @@
+郣Copyright 1990-2009 Adobe Systems Incorporated.
+All rights reserved.
+See ./LICENSE!!伜]aX!!]`�21�>	乸亃�$]��"R俤�-U�7�*�
4�%�+ 刏 剓�/�%�<�9K卋�1]�.�"�塦]�,�"]�
+�"]坔�"]塅�"]�$�"]��"]媊�"]�>�"]��"]峼�"]嶺�"]�6�"]��"]恟�"]慞�"]�.�"]��"]搄�"]擧�"]�&�"]��"]朾�"]桜�"]��"]榺�"]橺�"]�8�"]��"]泃�"]淩�"]�0�"]��"]瀕�"]烰�"]�(�"]��"]�"]�"]� �"X�']�"]�5�"]��"]�"]�"]�-�"]��"]﹊�"]狦�"]�%�"]��"]琣�"]�?�"]��"]畕�"]痀�"]�7�"]��"]眘�"]睶�"]�/�"]�
�"]磌�"]礗�"]�'�"]��"]穋�"]窤�"]��"]箎�"]篬�"]�9
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GB-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GB-V.bcmap
new file mode 100644
index 0000000..3108345
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GB-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBK-EUC-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBK-EUC-H.bcmap
new file mode 100644
index 0000000..05fff7e
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBK-EUC-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBK-EUC-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBK-EUC-V.bcmap
new file mode 100644
index 0000000..0cdf6be
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBK-EUC-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBK2K-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBK2K-H.bcmap
new file mode 100644
index 0000000..46f6ba5
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBK2K-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBK2K-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBK2K-V.bcmap
new file mode 100644
index 0000000..d9a9479
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBK2K-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBKp-EUC-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBKp-EUC-H.bcmap
new file mode 100644
index 0000000..5cb0af6
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBKp-EUC-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBKp-EUC-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBKp-EUC-V.bcmap
new file mode 100644
index 0000000..bca93b8
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBKp-EUC-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBT-EUC-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBT-EUC-H.bcmap
new file mode 100644
index 0000000..4b4e2d3
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBT-EUC-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBT-EUC-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBT-EUC-V.bcmap
new file mode 100644
index 0000000..38f7066
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBT-EUC-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBT-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBT-H.bcmap
new file mode 100644
index 0000000..8437ac3
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBT-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBT-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBT-V.bcmap
new file mode 100644
index 0000000..697ab4a
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBT-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBTpc-EUC-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBTpc-EUC-H.bcmap
new file mode 100644
index 0000000..f6e50e8
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBTpc-EUC-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBTpc-EUC-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBTpc-EUC-V.bcmap
new file mode 100644
index 0000000..6c0d71a
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBTpc-EUC-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBpc-EUC-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBpc-EUC-H.bcmap
new file mode 100644
index 0000000..c9edf67
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBpc-EUC-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBpc-EUC-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBpc-EUC-V.bcmap
new file mode 100644
index 0000000..31450c9
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/GBpc-EUC-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/H.bcmap
new file mode 100644
index 0000000..7b24ea4
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/HKdla-B5-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/HKdla-B5-H.bcmap
new file mode 100644
index 0000000..7d30c05
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/HKdla-B5-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/HKdla-B5-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/HKdla-B5-V.bcmap
new file mode 100644
index 0000000..7894694
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/HKdla-B5-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/HKdlb-B5-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/HKdlb-B5-H.bcmap
new file mode 100644
index 0000000..d829a23
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/HKdlb-B5-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/HKdlb-B5-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/HKdlb-B5-V.bcmap
new file mode 100644
index 0000000..2b572b5
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/HKdlb-B5-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/HKgccs-B5-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/HKgccs-B5-H.bcmap
new file mode 100644
index 0000000..971a4f2
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/HKgccs-B5-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/HKgccs-B5-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/HKgccs-B5-V.bcmap
new file mode 100644
index 0000000..d353ca2
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/HKgccs-B5-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/HKm314-B5-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/HKm314-B5-H.bcmap
new file mode 100644
index 0000000..576dc01
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/HKm314-B5-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/HKm314-B5-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/HKm314-B5-V.bcmap
new file mode 100644
index 0000000..0e96d0e
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/HKm314-B5-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/HKm471-B5-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/HKm471-B5-H.bcmap
new file mode 100644
index 0000000..11d170c
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/HKm471-B5-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/HKm471-B5-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/HKm471-B5-V.bcmap
new file mode 100644
index 0000000..54959bf
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/HKm471-B5-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/HKscs-B5-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/HKscs-B5-H.bcmap
new file mode 100644
index 0000000..6ef7857
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/HKscs-B5-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/HKscs-B5-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/HKscs-B5-V.bcmap
new file mode 100644
index 0000000..1fb2fa2
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/HKscs-B5-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Hankaku.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Hankaku.bcmap
new file mode 100644
index 0000000..4b8ec7f
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Hankaku.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Hiragana.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Hiragana.bcmap
new file mode 100644
index 0000000..17e983e
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Hiragana.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/KSC-EUC-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/KSC-EUC-H.bcmap
new file mode 100644
index 0000000..a45c65f
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/KSC-EUC-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/KSC-EUC-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/KSC-EUC-V.bcmap
new file mode 100644
index 0000000..0e7b21f
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/KSC-EUC-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/KSC-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/KSC-H.bcmap
new file mode 100644
index 0000000..b9b22b6
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/KSC-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/KSC-Johab-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/KSC-Johab-H.bcmap
new file mode 100644
index 0000000..2531ffc
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/KSC-Johab-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/KSC-Johab-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/KSC-Johab-V.bcmap
new file mode 100644
index 0000000..367ceb2
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/KSC-Johab-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/KSC-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/KSC-V.bcmap
new file mode 100644
index 0000000..6ae2f0b
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/KSC-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/KSCms-UHC-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/KSCms-UHC-H.bcmap
new file mode 100644
index 0000000..a8d4240
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/KSCms-UHC-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/KSCms-UHC-HW-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/KSCms-UHC-HW-H.bcmap
new file mode 100644
index 0000000..8b4ae18
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/KSCms-UHC-HW-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/KSCms-UHC-HW-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/KSCms-UHC-HW-V.bcmap
new file mode 100644
index 0000000..b655dbc
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/KSCms-UHC-HW-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/KSCms-UHC-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/KSCms-UHC-V.bcmap
new file mode 100644
index 0000000..21f97f6
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/KSCms-UHC-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/KSCpc-EUC-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/KSCpc-EUC-H.bcmap
new file mode 100644
index 0000000..e06f361
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/KSCpc-EUC-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/KSCpc-EUC-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/KSCpc-EUC-V.bcmap
new file mode 100644
index 0000000..f3c9113
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/KSCpc-EUC-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Katakana.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Katakana.bcmap
new file mode 100644
index 0000000..524303c
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Katakana.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/LICENSE b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/LICENSE
new file mode 100644
index 0000000..b1ad168
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/LICENSE
@@ -0,0 +1,36 @@
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-2009 Adobe Systems Incorporated.
+%%Copyright: All rights reserved.
+%%Copyright:
+%%Copyright: Redistribution and use in source and binary forms, with or
+%%Copyright: without modification, are permitted provided that the
+%%Copyright: following conditions are met:
+%%Copyright:
+%%Copyright: Redistributions of source code must retain the above
+%%Copyright: copyright notice, this list of conditions and the following
+%%Copyright: disclaimer.
+%%Copyright:
+%%Copyright: Redistributions in binary form must reproduce the above
+%%Copyright: copyright notice, this list of conditions and the following
+%%Copyright: disclaimer in the documentation and/or other materials
+%%Copyright: provided with the distribution. 
+%%Copyright:
+%%Copyright: Neither the name of Adobe Systems Incorporated nor the names
+%%Copyright: of its contributors may be used to endorse or promote
+%%Copyright: products derived from this software without specific prior
+%%Copyright: written permission. 
+%%Copyright:
+%%Copyright: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+%%Copyright: CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+%%Copyright: INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+%%Copyright: MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+%%Copyright: DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+%%Copyright: CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+%%Copyright: SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+%%Copyright: NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+%%Copyright: LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+%%Copyright: HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+%%Copyright: CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+%%Copyright: OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+%%Copyright: SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+%%Copyright: -----------------------------------------------------------
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/NWP-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/NWP-H.bcmap
new file mode 100644
index 0000000..afc5e4b
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/NWP-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/NWP-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/NWP-V.bcmap
new file mode 100644
index 0000000..bb5785e
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/NWP-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/RKSJ-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/RKSJ-H.bcmap
new file mode 100644
index 0000000..fb8d298
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/RKSJ-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/RKSJ-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/RKSJ-V.bcmap
new file mode 100644
index 0000000..a2555a6
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/RKSJ-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Roman.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Roman.bcmap
new file mode 100644
index 0000000..f896dcf
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/Roman.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniCNS-UCS2-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniCNS-UCS2-H.bcmap
new file mode 100644
index 0000000..d5db27c
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniCNS-UCS2-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniCNS-UCS2-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniCNS-UCS2-V.bcmap
new file mode 100644
index 0000000..1dc9b7a
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniCNS-UCS2-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniCNS-UTF16-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniCNS-UTF16-H.bcmap
new file mode 100644
index 0000000..961afef
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniCNS-UTF16-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniCNS-UTF16-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniCNS-UTF16-V.bcmap
new file mode 100644
index 0000000..df0cffe
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniCNS-UTF16-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniCNS-UTF32-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniCNS-UTF32-H.bcmap
new file mode 100644
index 0000000..1ab18a1
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniCNS-UTF32-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniCNS-UTF32-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniCNS-UTF32-V.bcmap
new file mode 100644
index 0000000..ad14662
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniCNS-UTF32-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniCNS-UTF8-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniCNS-UTF8-H.bcmap
new file mode 100644
index 0000000..83c6bd7
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniCNS-UTF8-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniCNS-UTF8-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniCNS-UTF8-V.bcmap
new file mode 100644
index 0000000..22a27e4
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniCNS-UTF8-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniGB-UCS2-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniGB-UCS2-H.bcmap
new file mode 100644
index 0000000..5bd6228
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniGB-UCS2-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniGB-UCS2-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniGB-UCS2-V.bcmap
new file mode 100644
index 0000000..53c534b
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniGB-UCS2-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniGB-UTF16-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniGB-UTF16-H.bcmap
new file mode 100644
index 0000000..b95045b
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniGB-UTF16-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniGB-UTF16-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniGB-UTF16-V.bcmap
new file mode 100644
index 0000000..51f023e
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniGB-UTF16-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniGB-UTF32-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniGB-UTF32-H.bcmap
new file mode 100644
index 0000000..f0dbd14
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniGB-UTF32-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniGB-UTF32-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniGB-UTF32-V.bcmap
new file mode 100644
index 0000000..ce9c30a
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniGB-UTF32-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniGB-UTF8-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniGB-UTF8-H.bcmap
new file mode 100644
index 0000000..982ca46
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniGB-UTF8-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniGB-UTF8-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniGB-UTF8-V.bcmap
new file mode 100644
index 0000000..f78020d
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniGB-UTF8-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS-UCS2-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS-UCS2-H.bcmap
new file mode 100644
index 0000000..7daf56a
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS-UCS2-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS-UCS2-HW-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS-UCS2-HW-H.bcmap
new file mode 100644
index 0000000..ac9975c
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS-UCS2-HW-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS-UCS2-HW-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS-UCS2-HW-V.bcmap
new file mode 100644
index 0000000..3da0a1c
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS-UCS2-HW-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS-UCS2-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS-UCS2-V.bcmap
new file mode 100644
index 0000000..c50b9dd
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS-UCS2-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS-UTF16-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS-UTF16-H.bcmap
new file mode 100644
index 0000000..6761344
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS-UTF16-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS-UTF16-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS-UTF16-V.bcmap
new file mode 100644
index 0000000..70bf90c
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS-UTF16-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS-UTF32-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS-UTF32-H.bcmap
new file mode 100644
index 0000000..7a83d53
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS-UTF32-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS-UTF32-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS-UTF32-V.bcmap
new file mode 100644
index 0000000..7a87135
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS-UTF32-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS-UTF8-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS-UTF8-H.bcmap
new file mode 100644
index 0000000..9f0334c
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS-UTF8-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS-UTF8-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS-UTF8-V.bcmap
new file mode 100644
index 0000000..808a94f
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS-UTF8-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS2004-UTF16-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS2004-UTF16-H.bcmap
new file mode 100644
index 0000000..d768bf8
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS2004-UTF16-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS2004-UTF16-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS2004-UTF16-V.bcmap
new file mode 100644
index 0000000..3d5bf6f
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS2004-UTF16-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS2004-UTF32-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS2004-UTF32-H.bcmap
new file mode 100644
index 0000000..09eee10
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS2004-UTF32-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS2004-UTF32-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS2004-UTF32-V.bcmap
new file mode 100644
index 0000000..6c54600
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS2004-UTF32-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS2004-UTF8-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS2004-UTF8-H.bcmap
new file mode 100644
index 0000000..1b1a64f
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS2004-UTF8-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS2004-UTF8-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS2004-UTF8-V.bcmap
new file mode 100644
index 0000000..994aa9e
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJIS2004-UTF8-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJISPro-UCS2-HW-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJISPro-UCS2-HW-V.bcmap
new file mode 100644
index 0000000..643f921
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJISPro-UCS2-HW-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJISPro-UCS2-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJISPro-UCS2-V.bcmap
new file mode 100644
index 0000000..c148f67
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJISPro-UCS2-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJISPro-UTF8-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJISPro-UTF8-V.bcmap
new file mode 100644
index 0000000..1849d80
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJISPro-UTF8-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJISX0213-UTF32-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJISX0213-UTF32-H.bcmap
new file mode 100644
index 0000000..a83a677
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJISX0213-UTF32-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJISX0213-UTF32-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJISX0213-UTF32-V.bcmap
new file mode 100644
index 0000000..f527248
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJISX0213-UTF32-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJISX02132004-UTF32-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJISX02132004-UTF32-H.bcmap
new file mode 100644
index 0000000..e1a988d
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJISX02132004-UTF32-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJISX02132004-UTF32-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJISX02132004-UTF32-V.bcmap
new file mode 100644
index 0000000..47e054a
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniJISX02132004-UTF32-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniKS-UCS2-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniKS-UCS2-H.bcmap
new file mode 100644
index 0000000..b5b9485
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniKS-UCS2-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniKS-UCS2-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniKS-UCS2-V.bcmap
new file mode 100644
index 0000000..026adca
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniKS-UCS2-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniKS-UTF16-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniKS-UTF16-H.bcmap
new file mode 100644
index 0000000..fd4e66e
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniKS-UTF16-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniKS-UTF16-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniKS-UTF16-V.bcmap
new file mode 100644
index 0000000..075efb7
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniKS-UTF16-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniKS-UTF32-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniKS-UTF32-H.bcmap
new file mode 100644
index 0000000..769d214
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniKS-UTF32-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniKS-UTF32-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniKS-UTF32-V.bcmap
new file mode 100644
index 0000000..bdab208
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniKS-UTF32-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniKS-UTF8-H.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniKS-UTF8-H.bcmap
new file mode 100644
index 0000000..6ff8674
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniKS-UTF8-H.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniKS-UTF8-V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniKS-UTF8-V.bcmap
new file mode 100644
index 0000000..8dfa76a
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/UniKS-UTF8-V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/V.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/V.bcmap
new file mode 100644
index 0000000..fdec990
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/V.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/WP-Symbol.bcmap b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/WP-Symbol.bcmap
new file mode 100644
index 0000000..46729bb
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/cmaps/WP-Symbol.bcmap
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/compressed.tracemonkey-pldi-09.pdf b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/compressed.tracemonkey-pldi-09.pdf
new file mode 100644
index 0000000..6557018
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/compressed.tracemonkey-pldi-09.pdf
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/debugger.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/debugger.js
new file mode 100644
index 0000000..4cbee4a
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/debugger.js
@@ -0,0 +1,619 @@
+/* Copyright 2012 Mozilla Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/* eslint-disable no-var */
+
+'use strict';
+
+var FontInspector = (function FontInspectorClosure() {
+  var fonts, createObjectURL;
+  var active = false;
+  var fontAttribute = 'data-font-name';
+  function removeSelection() {
+    var divs = document.querySelectorAll('div[' + fontAttribute + ']');
+    for (var i = 0, ii = divs.length; i < ii; ++i) {
+      var div = divs[i];
+      div.className = '';
+    }
+  }
+  function resetSelection() {
+    var divs = document.querySelectorAll('div[' + fontAttribute + ']');
+    for (var i = 0, ii = divs.length; i < ii; ++i) {
+      var div = divs[i];
+      div.className = 'debuggerHideText';
+    }
+  }
+  function selectFont(fontName, show) {
+    var divs = document.querySelectorAll('div[' + fontAttribute + '=' +
+                                         fontName + ']');
+    for (var i = 0, ii = divs.length; i < ii; ++i) {
+      var div = divs[i];
+      div.className = show ? 'debuggerShowText' : 'debuggerHideText';
+    }
+  }
+  function textLayerClick(e) {
+    if (!e.target.dataset.fontName ||
+        e.target.tagName.toUpperCase() !== 'DIV') {
+      return;
+    }
+    var fontName = e.target.dataset.fontName;
+    var selects = document.getElementsByTagName('input');
+    for (var i = 0; i < selects.length; ++i) {
+      var select = selects[i];
+      if (select.dataset.fontName !== fontName) {
+        continue;
+      }
+      select.checked = !select.checked;
+      selectFont(fontName, select.checked);
+      select.scrollIntoView();
+    }
+  }
+  return {
+    // Properties/functions needed by PDFBug.
+    id: 'FontInspector',
+    name: 'Font Inspector',
+    panel: null,
+    manager: null,
+    init: function init(pdfjsLib) {
+      var panel = this.panel;
+      panel.setAttribute('style', 'padding: 5px;');
+      var tmp = document.createElement('button');
+      tmp.addEventListener('click', resetSelection);
+      tmp.textContent = 'Refresh';
+      panel.appendChild(tmp);
+
+      fonts = document.createElement('div');
+      panel.appendChild(fonts);
+
+      createObjectURL = pdfjsLib.createObjectURL;
+    },
+    cleanup: function cleanup() {
+      fonts.textContent = '';
+    },
+    enabled: false,
+    get active() {
+      return active;
+    },
+    set active(value) {
+      active = value;
+      if (active) {
+        document.body.addEventListener('click', textLayerClick, true);
+        resetSelection();
+      } else {
+        document.body.removeEventListener('click', textLayerClick, true);
+        removeSelection();
+      }
+    },
+    // FontInspector specific functions.
+    fontAdded: function fontAdded(fontObj, url) {
+      function properties(obj, list) {
+        var moreInfo = document.createElement('table');
+        for (var i = 0; i < list.length; i++) {
+          var tr = document.createElement('tr');
+          var td1 = document.createElement('td');
+          td1.textContent = list[i];
+          tr.appendChild(td1);
+          var td2 = document.createElement('td');
+          td2.textContent = obj[list[i]].toString();
+          tr.appendChild(td2);
+          moreInfo.appendChild(tr);
+        }
+        return moreInfo;
+      }
+      var moreInfo = properties(fontObj, ['name', 'type']);
+      var fontName = fontObj.loadedName;
+      var font = document.createElement('div');
+      var name = document.createElement('span');
+      name.textContent = fontName;
+      var download = document.createElement('a');
+      if (url) {
+        url = /url\(['"]?([^\)"']+)/.exec(url);
+        download.href = url[1];
+      } else if (fontObj.data) {
+        download.href = createObjectURL(fontObj.data, fontObj.mimeType);
+      }
+      download.textContent = 'Download';
+      var logIt = document.createElement('a');
+      logIt.href = '';
+      logIt.textContent = 'Log';
+      logIt.addEventListener('click', function(event) {
+        event.preventDefault();
+        console.log(fontObj);
+      });
+      var select = document.createElement('input');
+      select.setAttribute('type', 'checkbox');
+      select.dataset.fontName = fontName;
+      select.addEventListener('click', (function(select, fontName) {
+        return (function() {
+           selectFont(fontName, select.checked);
+        });
+      })(select, fontName));
+      font.appendChild(select);
+      font.appendChild(name);
+      font.appendChild(document.createTextNode(' '));
+      font.appendChild(download);
+      font.appendChild(document.createTextNode(' '));
+      font.appendChild(logIt);
+      font.appendChild(moreInfo);
+      fonts.appendChild(font);
+      // Somewhat of a hack, should probably add a hook for when the text layer
+      // is done rendering.
+      setTimeout(() => {
+        if (this.active) {
+          resetSelection();
+        }
+      }, 2000);
+    },
+  };
+})();
+
+var opMap;
+
+// Manages all the page steppers.
+var StepperManager = (function StepperManagerClosure() {
+  var steppers = [];
+  var stepperDiv = null;
+  var stepperControls = null;
+  var stepperChooser = null;
+  var breakPoints = Object.create(null);
+  return {
+    // Properties/functions needed by PDFBug.
+    id: 'Stepper',
+    name: 'Stepper',
+    panel: null,
+    manager: null,
+    init: function init(pdfjsLib) {
+      var self = this;
+      this.panel.setAttribute('style', 'padding: 5px;');
+      stepperControls = document.createElement('div');
+      stepperChooser = document.createElement('select');
+      stepperChooser.addEventListener('change', function(event) {
+        self.selectStepper(this.value);
+      });
+      stepperControls.appendChild(stepperChooser);
+      stepperDiv = document.createElement('div');
+      this.panel.appendChild(stepperControls);
+      this.panel.appendChild(stepperDiv);
+      if (sessionStorage.getItem('pdfjsBreakPoints')) {
+        breakPoints = JSON.parse(sessionStorage.getItem('pdfjsBreakPoints'));
+      }
+
+      opMap = Object.create(null);
+      for (var key in pdfjsLib.OPS) {
+        opMap[pdfjsLib.OPS[key]] = key;
+      }
+    },
+    cleanup: function cleanup() {
+      stepperChooser.textContent = '';
+      stepperDiv.textContent = '';
+      steppers = [];
+    },
+    enabled: false,
+    active: false,
+    // Stepper specific functions.
+    create: function create(pageIndex) {
+      var debug = document.createElement('div');
+      debug.id = 'stepper' + pageIndex;
+      debug.setAttribute('hidden', true);
+      debug.className = 'stepper';
+      stepperDiv.appendChild(debug);
+      var b = document.createElement('option');
+      b.textContent = 'Page ' + (pageIndex + 1);
+      b.value = pageIndex;
+      stepperChooser.appendChild(b);
+      var initBreakPoints = breakPoints[pageIndex] || [];
+      var stepper = new Stepper(debug, pageIndex, initBreakPoints);
+      steppers.push(stepper);
+      if (steppers.length === 1) {
+        this.selectStepper(pageIndex, false);
+      }
+      return stepper;
+    },
+    selectStepper: function selectStepper(pageIndex, selectPanel) {
+      var i;
+      pageIndex = pageIndex | 0;
+      if (selectPanel) {
+        this.manager.selectPanel(this);
+      }
+      for (i = 0; i < steppers.length; ++i) {
+        var stepper = steppers[i];
+        if (stepper.pageIndex === pageIndex) {
+          stepper.panel.removeAttribute('hidden');
+        } else {
+          stepper.panel.setAttribute('hidden', true);
+        }
+      }
+      var options = stepperChooser.options;
+      for (i = 0; i < options.length; ++i) {
+        var option = options[i];
+        option.selected = (option.value | 0) === pageIndex;
+      }
+    },
+    saveBreakPoints: function saveBreakPoints(pageIndex, bps) {
+      breakPoints[pageIndex] = bps;
+      sessionStorage.setItem('pdfjsBreakPoints', JSON.stringify(breakPoints));
+    },
+  };
+})();
+
+// The stepper for each page's IRQueue.
+var Stepper = (function StepperClosure() {
+  // Shorter way to create element and optionally set textContent.
+  function c(tag, textContent) {
+    var d = document.createElement(tag);
+    if (textContent) {
+      d.textContent = textContent;
+    }
+    return d;
+  }
+
+  function simplifyArgs(args) {
+    if (typeof args === 'string') {
+      var MAX_STRING_LENGTH = 75;
+      return args.length <= MAX_STRING_LENGTH ? args :
+        args.substring(0, MAX_STRING_LENGTH) + '...';
+    }
+    if (typeof args !== 'object' || args === null) {
+      return args;
+    }
+    if ('length' in args) { // array
+      var simpleArgs = [], i, ii;
+      var MAX_ITEMS = 10;
+      for (i = 0, ii = Math.min(MAX_ITEMS, args.length); i < ii; i++) {
+        simpleArgs.push(simplifyArgs(args[i]));
+      }
+      if (i < args.length) {
+        simpleArgs.push('...');
+      }
+      return simpleArgs;
+    }
+    var simpleObj = {};
+    for (var key in args) {
+      simpleObj[key] = simplifyArgs(args[key]);
+    }
+    return simpleObj;
+  }
+
+  function Stepper(panel, pageIndex, initialBreakPoints) {
+    this.panel = panel;
+    this.breakPoint = 0;
+    this.nextBreakPoint = null;
+    this.pageIndex = pageIndex;
+    this.breakPoints = initialBreakPoints;
+    this.currentIdx = -1;
+    this.operatorListIdx = 0;
+  }
+  Stepper.prototype = {
+    init: function init(operatorList) {
+      var panel = this.panel;
+      var content = c('div', 'c=continue, s=step');
+      var table = c('table');
+      content.appendChild(table);
+      table.cellSpacing = 0;
+      var headerRow = c('tr');
+      table.appendChild(headerRow);
+      headerRow.appendChild(c('th', 'Break'));
+      headerRow.appendChild(c('th', 'Idx'));
+      headerRow.appendChild(c('th', 'fn'));
+      headerRow.appendChild(c('th', 'args'));
+      panel.appendChild(content);
+      this.table = table;
+      this.updateOperatorList(operatorList);
+    },
+    updateOperatorList: function updateOperatorList(operatorList) {
+      var self = this;
+
+      function cboxOnClick() {
+        var x = +this.dataset.idx;
+        if (this.checked) {
+          self.breakPoints.push(x);
+        } else {
+          self.breakPoints.splice(self.breakPoints.indexOf(x), 1);
+        }
+        StepperManager.saveBreakPoints(self.pageIndex, self.breakPoints);
+      }
+
+      var MAX_OPERATORS_COUNT = 15000;
+      if (this.operatorListIdx > MAX_OPERATORS_COUNT) {
+        return;
+      }
+
+      var chunk = document.createDocumentFragment();
+      var operatorsToDisplay = Math.min(MAX_OPERATORS_COUNT,
+                                        operatorList.fnArray.length);
+      for (var i = this.operatorListIdx; i < operatorsToDisplay; i++) {
+        var line = c('tr');
+        line.className = 'line';
+        line.dataset.idx = i;
+        chunk.appendChild(line);
+        var checked = this.breakPoints.includes(i);
+        var args = operatorList.argsArray[i] || [];
+
+        var breakCell = c('td');
+        var cbox = c('input');
+        cbox.type = 'checkbox';
+        cbox.className = 'points';
+        cbox.checked = checked;
+        cbox.dataset.idx = i;
+        cbox.onclick = cboxOnClick;
+
+        breakCell.appendChild(cbox);
+        line.appendChild(breakCell);
+        line.appendChild(c('td', i.toString()));
+        var fn = opMap[operatorList.fnArray[i]];
+        var decArgs = args;
+        if (fn === 'showText') {
+          var glyphs = args[0];
+          var newArgs = [];
+          var str = [];
+          for (var j = 0; j < glyphs.length; j++) {
+            var glyph = glyphs[j];
+            if (typeof glyph === 'object' && glyph !== null) {
+              str.push(glyph.fontChar);
+            } else {
+              if (str.length > 0) {
+                newArgs.push(str.join(''));
+                str = [];
+              }
+              newArgs.push(glyph); // null or number
+            }
+          }
+          if (str.length > 0) {
+            newArgs.push(str.join(''));
+          }
+          decArgs = [newArgs];
+        }
+        line.appendChild(c('td', fn));
+        line.appendChild(c('td', JSON.stringify(simplifyArgs(decArgs))));
+      }
+      if (operatorsToDisplay < operatorList.fnArray.length) {
+        line = c('tr');
+        var lastCell = c('td', '...');
+        lastCell.colspan = 4;
+        chunk.appendChild(lastCell);
+      }
+      this.operatorListIdx = operatorList.fnArray.length;
+      this.table.appendChild(chunk);
+    },
+    getNextBreakPoint: function getNextBreakPoint() {
+      this.breakPoints.sort(function(a, b) {
+        return a - b;
+      });
+      for (var i = 0; i < this.breakPoints.length; i++) {
+        if (this.breakPoints[i] > this.currentIdx) {
+          return this.breakPoints[i];
+        }
+      }
+      return null;
+    },
+    breakIt: function breakIt(idx, callback) {
+      StepperManager.selectStepper(this.pageIndex, true);
+      var self = this;
+      var dom = document;
+      self.currentIdx = idx;
+      var listener = function(e) {
+        switch (e.keyCode) {
+          case 83: // step
+            dom.removeEventListener('keydown', listener);
+            self.nextBreakPoint = self.currentIdx + 1;
+            self.goTo(-1);
+            callback();
+            break;
+          case 67: // continue
+            dom.removeEventListener('keydown', listener);
+            var breakPoint = self.getNextBreakPoint();
+            self.nextBreakPoint = breakPoint;
+            self.goTo(-1);
+            callback();
+            break;
+        }
+      };
+      dom.addEventListener('keydown', listener);
+      self.goTo(idx);
+    },
+    goTo: function goTo(idx) {
+      var allRows = this.panel.getElementsByClassName('line');
+      for (var x = 0, xx = allRows.length; x < xx; ++x) {
+        var row = allRows[x];
+        if ((row.dataset.idx | 0) === idx) {
+          row.style.backgroundColor = 'rgb(251,250,207)';
+          row.scrollIntoView();
+        } else {
+          row.style.backgroundColor = null;
+        }
+      }
+    },
+  };
+  return Stepper;
+})();
+
+var Stats = (function Stats() {
+  var stats = [];
+  function clear(node) {
+    while (node.hasChildNodes()) {
+      node.removeChild(node.lastChild);
+    }
+  }
+  function getStatIndex(pageNumber) {
+    for (var i = 0, ii = stats.length; i < ii; ++i) {
+      if (stats[i].pageNumber === pageNumber) {
+        return i;
+      }
+    }
+    return false;
+  }
+  return {
+    // Properties/functions needed by PDFBug.
+    id: 'Stats',
+    name: 'Stats',
+    panel: null,
+    manager: null,
+    init(pdfjsLib) {
+      this.panel.setAttribute('style', 'padding: 5px;');
+    },
+    enabled: false,
+    active: false,
+    // Stats specific functions.
+    add(pageNumber, stat) {
+      if (!stat) {
+        return;
+      }
+      var statsIndex = getStatIndex(pageNumber);
+      if (statsIndex !== false) {
+        var b = stats[statsIndex];
+        this.panel.removeChild(b.div);
+        stats.splice(statsIndex, 1);
+      }
+      var wrapper = document.createElement('div');
+      wrapper.className = 'stats';
+      var title = document.createElement('div');
+      title.className = 'title';
+      title.textContent = 'Page: ' + pageNumber;
+      var statsDiv = document.createElement('div');
+      statsDiv.textContent = stat.toString();
+      wrapper.appendChild(title);
+      wrapper.appendChild(statsDiv);
+      stats.push({ pageNumber, div: wrapper, });
+      stats.sort(function(a, b) {
+        return a.pageNumber - b.pageNumber;
+      });
+      clear(this.panel);
+      for (var i = 0, ii = stats.length; i < ii; ++i) {
+        this.panel.appendChild(stats[i].div);
+      }
+    },
+    cleanup() {
+      stats = [];
+      clear(this.panel);
+    },
+  };
+})();
+
+// Manages all the debugging tools.
+window.PDFBug = (function PDFBugClosure() {
+  var panelWidth = 300;
+  var buttons = [];
+  var activePanel = null;
+
+  return {
+    tools: [
+      FontInspector,
+      StepperManager,
+      Stats
+    ],
+    enable(ids) {
+      var all = false, tools = this.tools;
+      if (ids.length === 1 && ids[0] === 'all') {
+        all = true;
+      }
+      for (var i = 0; i < tools.length; ++i) {
+        var tool = tools[i];
+        if (all || ids.includes(tool.id)) {
+          tool.enabled = true;
+        }
+      }
+      if (!all) {
+        // Sort the tools by the order they are enabled.
+        tools.sort(function(a, b) {
+          var indexA = ids.indexOf(a.id);
+          indexA = indexA < 0 ? tools.length : indexA;
+          var indexB = ids.indexOf(b.id);
+          indexB = indexB < 0 ? tools.length : indexB;
+          return indexA - indexB;
+        });
+      }
+    },
+    init(pdfjsLib, container) {
+      /*
+       * Basic Layout:
+       * PDFBug
+       *  Controls
+       *  Panels
+       *    Panel
+       *    Panel
+       *    ...
+       */
+      var ui = document.createElement('div');
+      ui.id = 'PDFBug';
+
+      var controls = document.createElement('div');
+      controls.setAttribute('class', 'controls');
+      ui.appendChild(controls);
+
+      var panels = document.createElement('div');
+      panels.setAttribute('class', 'panels');
+      ui.appendChild(panels);
+
+      container.appendChild(ui);
+      container.style.right = panelWidth + 'px';
+
+      // Initialize all the debugging tools.
+      var tools = this.tools;
+      var self = this;
+      for (var i = 0; i < tools.length; ++i) {
+        var tool = tools[i];
+        var panel = document.createElement('div');
+        var panelButton = document.createElement('button');
+        panelButton.textContent = tool.name;
+        panelButton.addEventListener('click', (function(selected) {
+          return function(event) {
+            event.preventDefault();
+            self.selectPanel(selected);
+          };
+        })(i));
+        controls.appendChild(panelButton);
+        panels.appendChild(panel);
+        tool.panel = panel;
+        tool.manager = this;
+        if (tool.enabled) {
+          tool.init(pdfjsLib);
+        } else {
+          panel.textContent = tool.name + ' is disabled. To enable add ' +
+                              ' "' + tool.id + '" to the pdfBug parameter ' +
+                              'and refresh (separate multiple by commas).';
+        }
+        buttons.push(panelButton);
+      }
+      this.selectPanel(0);
+    },
+    cleanup() {
+      for (var i = 0, ii = this.tools.length; i < ii; i++) {
+        if (this.tools[i].enabled) {
+          this.tools[i].cleanup();
+        }
+      }
+    },
+    selectPanel(index) {
+      if (typeof index !== 'number') {
+        index = this.tools.indexOf(index);
+      }
+      if (index === activePanel) {
+        return;
+      }
+      activePanel = index;
+      var tools = this.tools;
+      for (var j = 0; j < tools.length; ++j) {
+        if (j === index) {
+          buttons[j].setAttribute('class', 'active');
+          tools[j].active = true;
+          tools[j].panel.removeAttribute('hidden');
+        } else {
+          buttons[j].setAttribute('class', '');
+          tools[j].active = false;
+          tools[j].panel.setAttribute('hidden', 'true');
+        }
+      }
+    },
+  };
+})();
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/annotation-check.svg b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/annotation-check.svg
new file mode 100644
index 0000000..71cd16d
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/annotation-check.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns="http://www.w3.org/2000/svg"
+   width="40"
+   height="40"
+   viewBox="0 0 40 40">
+  <path
+     d="M 1.5006714,23.536225 6.8925879,18.994244 14.585721,26.037937 34.019683,4.5410479 38.499329,9.2235032 14.585721,35.458952 z"
+     id="path4"
+     style="fill:#ffff00;fill-opacity:1;stroke:#000000;stroke-width:1.25402856;stroke-opacity:1" />
+</svg>
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/annotation-comment.svg b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/annotation-comment.svg
new file mode 100644
index 0000000..86f1f17
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/annotation-comment.svg
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns="http://www.w3.org/2000/svg"
+   height="40"
+   width="40"
+   viewBox="0 0 40 40">
+  <rect
+     style="fill:#ffff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+     width="33.76017"
+     height="33.76017"
+     x="3.119915"
+     y="3.119915" />
+  <path
+     d="m 20.677967,8.54499 c -7.342801,0 -13.295293,4.954293 -13.295293,11.065751 0,2.088793 0.3647173,3.484376 1.575539,5.150563 L 6.0267418,31.45501 13.560595,29.011117 c 2.221262,1.387962 4.125932,1.665377 7.117372,1.665377 7.3428,0 13.295291,-4.954295 13.295291,-11.065753 0,-6.111458 -5.952491,-11.065751 -13.295291,-11.065751 z"
+     style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.93031836;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"/>
+</svg>
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/annotation-help.svg b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/annotation-help.svg
new file mode 100644
index 0000000..00938fe
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/annotation-help.svg
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns="http://www.w3.org/2000/svg"
+   width="40"
+   height="40"
+   viewBox="0 0 40 40">
+  <g
+     transform="translate(0,-60)"
+     id="layer1">
+    <rect
+       width="36.460953"
+       height="34.805603"
+       x="1.7695236"
+       y="62.597198"
+       style="fill:#ffff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.30826771;stroke-opacity:1" />
+    <g
+       transform="matrix(0.88763677,0,0,0.88763677,2.2472646,8.9890584)">
+      <path
+         d="M 20,64.526342 C 11.454135,64.526342 4.5263421,71.454135 4.5263421,80 4.5263421,88.545865 11.454135,95.473658 20,95.473658 28.545865,95.473658 35.473658,88.545865 35.473658,80 35.473658,71.454135 28.545865,64.526342 20,64.526342 z m -0.408738,9.488564 c 3.527079,0 6.393832,2.84061 6.393832,6.335441 0,3.494831 -2.866753,6.335441 -6.393832,6.335441 -3.527079,0 -6.393832,-2.84061 -6.393832,-6.335441 0,-3.494831 2.866753,-6.335441 6.393832,-6.335441 z"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.02768445;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <path
+         d="m 7.2335209,71.819938 4.9702591,4.161823 c -1.679956,2.581606 -1.443939,6.069592 0.159325,8.677725 l -5.1263071,3.424463 c 0.67516,1.231452 3.0166401,3.547686 4.2331971,4.194757 l 3.907728,-4.567277 c 2.541952,1.45975 5.730694,1.392161 8.438683,-0.12614 l 3.469517,6.108336 c 1.129779,-0.44367 4.742234,-3.449633 5.416358,-5.003859 l -5.46204,-4.415541 c 1.44319,-2.424098 1.651175,-5.267515 0.557303,-7.748623 l 5.903195,-3.833951 C 33.14257,71.704996 30.616217,69.018606 29.02952,67.99296 l -4.118813,4.981678 C 22.411934,71.205099 18.900853,70.937534 16.041319,72.32916 l -3.595408,-5.322091 c -1.345962,0.579488 -4.1293881,2.921233 -5.2123901,4.812869 z m 8.1010311,3.426672 c 2.75284,-2.446266 6.769149,-2.144694 9.048998,0.420874 2.279848,2.56557 2.113919,6.596919 -0.638924,9.043185 -2.752841,2.446267 -6.775754,2.13726 -9.055604,-0.428308 -2.279851,-2.565568 -2.107313,-6.589485 0.64553,-9.035751 z"
+         style="fill:#000000;fill-opacity:1;stroke:none" />
+    </g>
+  </g>
+</svg>
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/annotation-insert.svg b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/annotation-insert.svg
new file mode 100644
index 0000000..519ef68
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/annotation-insert.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns="http://www.w3.org/2000/svg"
+   width="64"
+   height="64"
+   viewBox="0 0 64 64">
+  <path
+     d="M 32.003143,1.4044602 57.432701,62.632577 6.5672991,62.627924 z"
+     style="fill:#ffff00;fill-opacity:0.94117647;fill-rule:nonzero;stroke:#000000;stroke-width:1.00493038;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+</svg>
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/annotation-key.svg b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/annotation-key.svg
new file mode 100644
index 0000000..8d09d53
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/annotation-key.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns="http://www.w3.org/2000/svg"
+   width="64"
+   height="64"
+   viewBox="0 0 64 64">
+  <path
+     d="M 25.470843,9.4933766 C 25.30219,12.141818 30.139101,14.445969 34.704831,13.529144 40.62635,12.541995 41.398833,7.3856498 35.97505,5.777863 31.400921,4.1549155 25.157674,6.5445892 25.470843,9.4933766 z M 4.5246282,17.652051 C 4.068249,11.832873 9.2742983,5.9270407 18.437379,3.0977088 29.751911,-0.87185184 45.495663,1.4008022 53.603953,7.1104009 c 9.275765,6.1889221 7.158128,16.2079421 -3.171076,21.5939521 -1.784316,1.635815 -6.380222,1.21421 -7.068351,3.186186 -1.04003,0.972427 -1.288046,2.050158 -1.232864,3.168203 1.015111,2.000108 -3.831548,1.633216 -3.270553,3.759574 0.589477,5.264544 -0.179276,10.53738 -0.362842,15.806257 -0.492006,2.184998 1.163456,4.574232 -0.734888,6.610642 -2.482919,2.325184 -7.30604,2.189143 -9.193497,-0.274767 -2.733688,-1.740626 -8.254447,-3.615254 -6.104247,-6.339626 3.468112,-1.708686 -2.116197,-3.449897 0.431242,-5.080274 5.058402,-1.39256 -2.393215,-2.304318 -0.146889,-4.334645 3.069198,-0.977415 2.056986,-2.518352 -0.219121,-3.540397 1.876567,-1.807151 1.484149,-4.868919 -2.565455,-5.942205 0.150866,-1.805474 2.905737,-4.136876 -1.679967,-5.20493 C 10.260902,27.882167 4.6872697,22.95045 4.5245945,17.652051 z"
+     id="path604"
+     style="fill:#ffff00;fill-opacity:1;stroke:#000000;stroke-width:1.72665179;stroke-opacity:1" />
+</svg>
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/annotation-newparagraph.svg b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/annotation-newparagraph.svg
new file mode 100644
index 0000000..38d2497
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/annotation-newparagraph.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns="http://www.w3.org/2000/svg"
+   width="64"
+   height="64"
+   viewBox="0 0 64 64">
+  <path
+     d="M 32.003143,10.913072 57.432701,53.086929 6.567299,53.083723 z"
+     id="path2985"
+     style="fill:#ffff00;fill-opacity:0.94117647;fill-rule:nonzero;stroke:#000000;stroke-width:0.83403099;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+</svg>
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/annotation-noicon.svg b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/annotation-noicon.svg
new file mode 100644
index 0000000..c07d108
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/annotation-noicon.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns="http://www.w3.org/2000/svg"
+   width="40"
+   height="40"
+   viewBox="0 0 40 40">
+</svg>
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/annotation-note.svg b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/annotation-note.svg
new file mode 100644
index 0000000..7017365
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/annotation-note.svg
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns="http://www.w3.org/2000/svg"
+   width="40"
+   height="40"
+   viewBox="0 0 40 40">
+  <rect
+     width="36.075428"
+     height="31.096582"
+     x="1.962286"
+     y="4.4517088"
+     id="rect4"
+     style="fill:#ffff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.23004246;stroke-opacity:1" />
+  <rect
+     width="27.96859"
+     height="1.5012145"
+     x="6.0157046"
+     y="10.285"
+     id="rect6"
+     style="fill:#000000;fill-opacity:1;stroke:none" />
+  <rect
+     width="27.96859"
+     height="0.85783684"
+     x="6.0157056"
+     y="23.21689"
+     id="rect8"
+     style="fill:#000000;fill-opacity:1;stroke:none" />
+  <rect
+     width="27.96859"
+     height="0.85783684"
+     x="5.8130345"
+     y="28.964394"
+     id="rect10"
+     style="fill:#000000;fill-opacity:1;stroke:none" />
+  <rect
+     width="27.96859"
+     height="0.85783684"
+     x="6.0157046"
+     y="17.426493"
+     id="rect12"
+     style="fill:#000000;fill-opacity:1;stroke:none" />
+</svg>
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/annotation-paragraph.svg b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/annotation-paragraph.svg
new file mode 100644
index 0000000..6ae5212
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/annotation-paragraph.svg
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns="http://www.w3.org/2000/svg"
+   width="40"
+   height="40"
+   viewBox="0 0 40 40">
+  <rect
+     width="33.76017"
+     height="33.76017"
+     x="3.119915"
+     y="3.119915"
+     style="fill:#ffff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+  <path
+     d="m 17.692678,34.50206 0,-16.182224 c -1.930515,-0.103225 -3.455824,-0.730383 -4.57593,-1.881473 -1.12011,-1.151067 -1.680164,-2.619596 -1.680164,-4.405591 0,-1.992435 0.621995,-3.5796849 1.865988,-4.7617553 1.243989,-1.1820288 3.06352,-1.7730536 5.458598,-1.7730764 l 9.802246,0 0,2.6789711 -2.229895,0 0,26.3251486 -2.632515,0 0,-26.3251486 -3.45324,0 0,26.3251486 z"
+     style="font-size:29.42051125px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.07795751;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial" />
+</svg>
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/findbarButton-next-rtl.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/findbarButton-next-rtl.png
new file mode 100644
index 0000000..bef0274
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/findbarButton-next-rtl.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/findbarButton-next-rtl@2x.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/findbarButton-next-rtl@2x.png
new file mode 100644
index 0000000..1da6dc9
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/findbarButton-next-rtl@2x.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/findbarButton-next.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/findbarButton-next.png
new file mode 100644
index 0000000..de1d0fc
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/findbarButton-next.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/findbarButton-next@2x.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/findbarButton-next@2x.png
new file mode 100644
index 0000000..0250307
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/findbarButton-next@2x.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/findbarButton-previous-rtl.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/findbarButton-previous-rtl.png
new file mode 100644
index 0000000..de1d0fc
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/findbarButton-previous-rtl.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/findbarButton-previous-rtl@2x.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/findbarButton-previous-rtl@2x.png
new file mode 100644
index 0000000..0250307
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/findbarButton-previous-rtl@2x.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/findbarButton-previous.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/findbarButton-previous.png
new file mode 100644
index 0000000..bef0274
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/findbarButton-previous.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/findbarButton-previous@2x.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/findbarButton-previous@2x.png
new file mode 100644
index 0000000..1da6dc9
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/findbarButton-previous@2x.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/grab.cur b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/grab.cur
new file mode 100644
index 0000000..db7ad5a
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/grab.cur
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/grabbing.cur b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/grabbing.cur
new file mode 100644
index 0000000..e0dfd04
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/grabbing.cur
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/loading-icon.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/loading-icon.gif
new file mode 100644
index 0000000..1c72ebb
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/loading-icon.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/loading-small.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/loading-small.png
new file mode 100644
index 0000000..8831a80
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/loading-small.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/loading-small@2x.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/loading-small@2x.png
new file mode 100644
index 0000000..b25b445
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/loading-small@2x.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-documentProperties.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-documentProperties.png
new file mode 100644
index 0000000..40925e2
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-documentProperties.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-documentProperties@2x.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-documentProperties@2x.png
new file mode 100644
index 0000000..adb240e
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-documentProperties@2x.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-firstPage.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-firstPage.png
new file mode 100644
index 0000000..e68846a
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-firstPage.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-firstPage@2x.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-firstPage@2x.png
new file mode 100644
index 0000000..3ad8af5
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-firstPage@2x.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-handTool.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-handTool.png
new file mode 100644
index 0000000..cb85a84
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-handTool.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-handTool@2x.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-handTool@2x.png
new file mode 100644
index 0000000..5c13f77
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-handTool@2x.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-lastPage.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-lastPage.png
new file mode 100644
index 0000000..be763e0
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-lastPage.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-lastPage@2x.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-lastPage@2x.png
new file mode 100644
index 0000000..8570984
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-lastPage@2x.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-rotateCcw.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-rotateCcw.png
new file mode 100644
index 0000000..675d6da
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-rotateCcw.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-rotateCcw@2x.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-rotateCcw@2x.png
new file mode 100644
index 0000000..b9e7431
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-rotateCcw@2x.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-rotateCw.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-rotateCw.png
new file mode 100644
index 0000000..e1c7598
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-rotateCw.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-rotateCw@2x.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-rotateCw@2x.png
new file mode 100644
index 0000000..cb257b4
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-rotateCw@2x.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-scrollHorizontal.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-scrollHorizontal.png
new file mode 100644
index 0000000..cb702fc
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-scrollHorizontal.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-scrollHorizontal@2x.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-scrollHorizontal@2x.png
new file mode 100644
index 0000000..7f05289
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-scrollHorizontal@2x.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-scrollVertical.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-scrollVertical.png
new file mode 100644
index 0000000..0b8427a
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-scrollVertical.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-scrollVertical@2x.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-scrollVertical@2x.png
new file mode 100644
index 0000000..72ab55e
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-scrollVertical@2x.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-scrollWrapped.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-scrollWrapped.png
new file mode 100644
index 0000000..165fc8b
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-scrollWrapped.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-scrollWrapped@2x.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-scrollWrapped@2x.png
new file mode 100644
index 0000000..4246141
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-scrollWrapped@2x.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-selectTool.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-selectTool.png
new file mode 100644
index 0000000..25520a6
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-selectTool.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-selectTool@2x.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-selectTool@2x.png
new file mode 100644
index 0000000..a58aaef
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-selectTool@2x.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-spreadEven.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-spreadEven.png
new file mode 100644
index 0000000..3fa07e7
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-spreadEven.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-spreadEven@2x.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-spreadEven@2x.png
new file mode 100644
index 0000000..32e5033
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-spreadEven@2x.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-spreadNone.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-spreadNone.png
new file mode 100644
index 0000000..1611473
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-spreadNone.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-spreadNone@2x.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-spreadNone@2x.png
new file mode 100644
index 0000000..8e51cf3
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-spreadNone@2x.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-spreadOdd.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-spreadOdd.png
new file mode 100644
index 0000000..5126313
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-spreadOdd.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-spreadOdd@2x.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-spreadOdd@2x.png
new file mode 100644
index 0000000..5996b74
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/secondaryToolbarButton-spreadOdd@2x.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/shadow.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/shadow.png
new file mode 100644
index 0000000..31d3bdb
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/shadow.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/texture.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/texture.png
new file mode 100644
index 0000000..12bae83
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/texture.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-bookmark.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-bookmark.png
new file mode 100644
index 0000000..a187be6
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-bookmark.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-bookmark@2x.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-bookmark@2x.png
new file mode 100644
index 0000000..4efbaa6
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-bookmark@2x.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-download.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-download.png
new file mode 100644
index 0000000..eaab35f
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-download.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-download@2x.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-download@2x.png
new file mode 100644
index 0000000..896face
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-download@2x.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-menuArrows.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-menuArrows.png
new file mode 100644
index 0000000..e50ca4e
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-menuArrows.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-menuArrows@2x.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-menuArrows@2x.png
new file mode 100644
index 0000000..f7570bc
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-menuArrows@2x.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-openFile.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-openFile.png
new file mode 100644
index 0000000..b5cf1bd
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-openFile.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-openFile@2x.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-openFile@2x.png
new file mode 100644
index 0000000..91ab765
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-openFile@2x.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-pageDown-rtl.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-pageDown-rtl.png
new file mode 100644
index 0000000..1957f79
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-pageDown-rtl.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-pageDown-rtl@2x.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-pageDown-rtl@2x.png
new file mode 100644
index 0000000..16ebcb8
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-pageDown-rtl@2x.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-pageDown.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-pageDown.png
new file mode 100644
index 0000000..8219ecf
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-pageDown.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-pageDown@2x.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-pageDown@2x.png
new file mode 100644
index 0000000..758c01d
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-pageDown@2x.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-pageUp-rtl.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-pageUp-rtl.png
new file mode 100644
index 0000000..98e7ce4
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-pageUp-rtl.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-pageUp-rtl@2x.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-pageUp-rtl@2x.png
new file mode 100644
index 0000000..a01b023
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-pageUp-rtl@2x.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-pageUp.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-pageUp.png
new file mode 100644
index 0000000..fb9daa3
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-pageUp.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-pageUp@2x.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-pageUp@2x.png
new file mode 100644
index 0000000..a5cfd75
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-pageUp@2x.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-presentationMode.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-presentationMode.png
new file mode 100644
index 0000000..3ac2124
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-presentationMode.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-presentationMode@2x.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-presentationMode@2x.png
new file mode 100644
index 0000000..cada9e7
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-presentationMode@2x.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-print.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-print.png
new file mode 100644
index 0000000..51275e5
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-print.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-print@2x.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-print@2x.png
new file mode 100644
index 0000000..53d18da
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-print@2x.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-search.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-search.png
new file mode 100644
index 0000000..f9b7557
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-search.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-search@2x.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-search@2x.png
new file mode 100644
index 0000000..456b133
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-search@2x.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-secondaryToolbarToggle-rtl.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-secondaryToolbarToggle-rtl.png
new file mode 100644
index 0000000..8437095
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-secondaryToolbarToggle-rtl.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-secondaryToolbarToggle-rtl@2x.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-secondaryToolbarToggle-rtl@2x.png
new file mode 100644
index 0000000..9d9bfa4
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-secondaryToolbarToggle-rtl@2x.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-secondaryToolbarToggle.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-secondaryToolbarToggle.png
new file mode 100644
index 0000000..1f90f83
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-secondaryToolbarToggle.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-secondaryToolbarToggle@2x.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-secondaryToolbarToggle@2x.png
new file mode 100644
index 0000000..b066fe5
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-secondaryToolbarToggle@2x.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-sidebarToggle-rtl.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-sidebarToggle-rtl.png
new file mode 100644
index 0000000..6f85ec0
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-sidebarToggle-rtl.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-sidebarToggle-rtl@2x.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-sidebarToggle-rtl@2x.png
new file mode 100644
index 0000000..291e006
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-sidebarToggle-rtl@2x.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-sidebarToggle.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-sidebarToggle.png
new file mode 100644
index 0000000..025dc90
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-sidebarToggle.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-sidebarToggle@2x.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-sidebarToggle@2x.png
new file mode 100644
index 0000000..7f834df
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-sidebarToggle@2x.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-viewAttachments.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-viewAttachments.png
new file mode 100644
index 0000000..fcd0b26
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-viewAttachments.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-viewAttachments@2x.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-viewAttachments@2x.png
new file mode 100644
index 0000000..4a5e2b8
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-viewAttachments@2x.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-viewOutline-rtl.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-viewOutline-rtl.png
new file mode 100644
index 0000000..aaa9430
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-viewOutline-rtl.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-viewOutline-rtl@2x.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-viewOutline-rtl@2x.png
new file mode 100644
index 0000000..3410f70
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-viewOutline-rtl@2x.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-viewOutline.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-viewOutline.png
new file mode 100644
index 0000000..976365a
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-viewOutline.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-viewOutline@2x.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-viewOutline@2x.png
new file mode 100644
index 0000000..b6a197f
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-viewOutline@2x.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-viewThumbnail.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-viewThumbnail.png
new file mode 100644
index 0000000..584ba55
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-viewThumbnail.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-viewThumbnail@2x.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-viewThumbnail@2x.png
new file mode 100644
index 0000000..a0208b4
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-viewThumbnail@2x.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-zoomIn.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-zoomIn.png
new file mode 100644
index 0000000..513d081
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-zoomIn.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-zoomIn@2x.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-zoomIn@2x.png
new file mode 100644
index 0000000..d5d49d5
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-zoomIn@2x.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-zoomOut.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-zoomOut.png
new file mode 100644
index 0000000..156c26b
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-zoomOut.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-zoomOut@2x.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-zoomOut@2x.png
new file mode 100644
index 0000000..959e191
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/toolbarButton-zoomOut@2x.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/treeitem-collapsed-rtl.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/treeitem-collapsed-rtl.png
new file mode 100644
index 0000000..0496b35
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/treeitem-collapsed-rtl.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/treeitem-collapsed-rtl@2x.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/treeitem-collapsed-rtl@2x.png
new file mode 100644
index 0000000..6ad9ebc
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/treeitem-collapsed-rtl@2x.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/treeitem-collapsed.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/treeitem-collapsed.png
new file mode 100644
index 0000000..06d4d37
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/treeitem-collapsed.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/treeitem-collapsed@2x.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/treeitem-collapsed@2x.png
new file mode 100644
index 0000000..eec1e58
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/treeitem-collapsed@2x.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/treeitem-expanded.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/treeitem-expanded.png
new file mode 100644
index 0000000..c8d5573
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/treeitem-expanded.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/treeitem-expanded@2x.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/treeitem-expanded@2x.png
new file mode 100644
index 0000000..3b3b610
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/images/treeitem-expanded@2x.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ach/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ach/viewer.properties
new file mode 100644
index 0000000..57c6a91
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ach/viewer.properties
@@ -0,0 +1,207 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Pot buk mukato
+previous_label=Mukato
+next.title=Pot buk malubo
+next_label=Malubo
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=Pot buk
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=pi {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} me {{pagesCount}})
+
+zoom_out.title=Jwik Matidi
+zoom_out_label=Jwik Matidi
+zoom_in.title=Kwot Madit
+zoom_in_label=Kwot Madit
+zoom.title=Kwoti
+presentation_mode.title=Lokke i kit me tyer
+presentation_mode_label=Kit me tyer
+open_file.title=Yab Pwail
+open_file_label=Yab
+print.title=Go
+print_label=Go
+download.title=Gam
+download_label=Gam
+bookmark.title=Neno ma kombedi (lok onyo yab i dirica manyen)
+bookmark_label=Neno ma kombedi
+
+# Secondary toolbar and context menu
+tools.title=Gintic
+tools_label=Gintic
+first_page.title=Cit i pot buk mukwongo
+first_page.label=Cit i pot buk mukwongo
+first_page_label=Cit i pot buk mukwongo
+last_page.title=Cit i pot buk magiko
+last_page.label=Cit i pot buk magiko
+last_page_label=Cit i pot buk magiko
+page_rotate_cw.title=Wire i tung lacuc
+page_rotate_cw.label=Wire i tung lacuc
+page_rotate_cw_label=Wire i tung lacuc
+page_rotate_ccw.title=Wire i tung lacam
+page_rotate_ccw.label=Wire i tung lacam
+page_rotate_ccw_label=Wire i tung lacam
+
+cursor_text_select_tool.title=Cak gitic me yero coc
+cursor_text_select_tool_label=Gitic me yero coc
+cursor_hand_tool.title=Cak gitic me cing
+cursor_hand_tool_label=Gitic cing
+
+
+
+# Document properties dialog box
+document_properties.title=Jami me gin acoya鈥�
+document_properties_label=Jami me gin acoya鈥�
+document_properties_file_name=Nying pwail:
+document_properties_file_size=Dit pa pwail:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=Wiye:
+document_properties_author=Ngat mucoyo:
+document_properties_subject=Subjek:
+document_properties_keywords=Lok mapire tek:
+document_properties_creation_date=Nino dwe me cwec:
+document_properties_modification_date=Nino dwe me yub:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Lacwec:
+document_properties_producer=Layub PDF:
+document_properties_version=Kit PDF:
+document_properties_page_count=Kwan me pot buk:
+document_properties_page_size=Dit pa potbuk:
+document_properties_page_size_unit_inches=i
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=atir
+document_properties_page_size_orientation_landscape=arii
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Waraga
+document_properties_page_size_name_legal=Cik
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized_yes=Eyo
+document_properties_linearized_no=Pe
+document_properties_close=Lor
+
+print_progress_message=Yubo coc me agoya鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=Juki
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Lok gintic ma inget
+toggle_sidebar_notification.title=Lok lanyut me nget (wiyewiye tye i gin acoya/attachments)
+toggle_sidebar_label=Lok gintic ma inget
+document_outline.title=Nyut Wiyewiye me Gin acoya (dii-kiryo me yaro/kano jami weng)
+document_outline_label=Pek pa gin acoya
+attachments.title=Nyut twec
+attachments_label=Twec
+thumbs.title=Nyut cal
+thumbs_label=Cal
+findbar.title=Nong iye gin acoya
+findbar_label=Nong
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Pot buk {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Cal me pot buk {{page}}
+
+# Find panel button title and messages
+find_input.title=Nong
+find_input.placeholder=Nong i dokumen鈥�
+find_previous.title=Nong timme pa lok mukato
+find_previous_label=Mukato
+find_next.title=Nong timme pa lok malubo
+find_next_label=Malubo
+find_highlight=Wer weng
+find_match_case_label=Lok marwate
+find_reached_top=Oo iwi gin acoya, omede ki i tere
+find_reached_bottom=Oo i agiki me gin acoya, omede ki iwiye
+find_not_found=Lok pe ononge
+
+# Error panel labels
+error_more_info=Ngec Mukene
+error_less_info=Ngec Manok
+error_close=Lor
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Kwena: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Can kikore {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Pwail: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Rek: {{line}}
+rendering_error=Bal otime i kare me nyuto pot buk.
+
+# Predefined zoom values
+page_scale_width=Lac me iye pot buk
+page_scale_fit=Porre me pot buk
+page_scale_auto=Kwot pire kene
+page_scale_actual=Dite kikome
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Bal
+loading_error=Bal otime kun cano PDF.
+invalid_file_error=Pwail me PDF ma pe atir onyo obale woko.
+missing_file_error=Pwail me PDF tye ka rem.
+unexpected_response_error=Lagam mape kigeno pa lapok tic.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Lok angea manok]
+password_label=Ket mung me donyo me yabo pwail me PDF man.
+password_invalid=Mung me donyo pe atir. Tim ber i tem doki.
+password_ok=OK
+password_cancel=Juki
+
+printing_not_supported=Ciko: Layeny ma pe teno goyo liweng.
+printing_not_ready=Ciko: PDF pe ocane weng me agoya.
+web_fonts_disabled=Kijuko dit pa coc me kakube woko: pe romo tic ki dit pa coc me PDF ma kiketo i kine.
+document_colors_not_allowed=Pe ki yee ki gin acoya me PDF me tic ki rangi gi kengi: Kijuko woko 鈥淵ee pot buk me yero rangi mamegi kengi鈥� ki i layeny.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/af/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/af/viewer.properties
new file mode 100644
index 0000000..8cf0880
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/af/viewer.properties
@@ -0,0 +1,184 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Vorige bladsy
+previous_label=Vorige
+next.title=Volgende bladsy
+next_label=Volgende
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=Bladsy
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=van {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} van {{pagesCount}})
+
+zoom_out.title=Zoem uit
+zoom_out_label=Zoem uit
+zoom_in.title=Zoem in
+zoom_in_label=Zoem in
+zoom.title=Zoem
+presentation_mode.title=Wissel na voorleggingsmodus
+presentation_mode_label=Voorleggingsmodus
+open_file.title=Open l锚er
+open_file_label=Open
+print.title=Druk
+print_label=Druk
+download.title=Laai af
+download_label=Laai af
+bookmark.title=Huidige aansig (kopieer of open in nuwe venster)
+bookmark_label=Huidige aansig
+
+# Secondary toolbar and context menu
+tools.title=Nutsgoed
+tools_label=Nutsgoed
+first_page.title=Gaan na eerste bladsy
+first_page.label=Gaan na eerste bladsy
+first_page_label=Gaan na eerste bladsy
+last_page.title=Gaan na laaste bladsy
+last_page.label=Gaan na laaste bladsy
+last_page_label=Gaan na laaste bladsy
+page_rotate_cw.title=Roteer kloksgewys
+page_rotate_cw.label=Roteer kloksgewys
+page_rotate_cw_label=Roteer kloksgewys
+page_rotate_ccw.title=Roteer anti-kloksgewys
+page_rotate_ccw.label=Roteer anti-kloksgewys
+page_rotate_ccw_label=Roteer anti-kloksgewys
+
+cursor_text_select_tool.title=Aktiveer gereedskap om teks te merk
+cursor_text_select_tool_label=Teksmerkgereedskap
+cursor_hand_tool.title=Aktiveer handjie
+cursor_hand_tool_label=Handjie
+
+# Document properties dialog box
+document_properties.title=Dokumenteienskappe鈥�
+document_properties_label=Dokumenteienskappe鈥�
+document_properties_file_name=L锚ernaam:
+document_properties_file_size=L锚ergrootte:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} kG ({{size_b}} grepe)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MG ({{size_b}} grepe)
+document_properties_title=Titel:
+document_properties_author=Outeur:
+document_properties_subject=Onderwerp:
+document_properties_keywords=Sleutelwoorde:
+document_properties_creation_date=Skeppingsdatum:
+document_properties_modification_date=Wysigingsdatum:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Skepper:
+document_properties_producer=PDF-vervaardiger:
+document_properties_version=PDF-weergawe:
+document_properties_page_count=Aantal bladsye:
+document_properties_close=Sluit
+
+print_progress_message=Berei tans dokument voor om te druk鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=Kanselleer
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Sypaneel aan/af
+toggle_sidebar_notification.title=Sypaneel aan/af (dokument bevat skema/aanhegsels)
+toggle_sidebar_label=Sypaneel aan/af
+document_outline.title=Wys dokumentskema (dubbelklik om alle items oop/toe te vou)
+document_outline_label=Dokumentoorsig
+attachments.title=Wys aanhegsels
+attachments_label=Aanhegsels
+thumbs.title=Wys duimnaels
+thumbs_label=Duimnaels
+findbar.title=Soek in dokument
+findbar_label=Vind
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Bladsy {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Duimnael van bladsy {{page}}
+
+# Find panel button title and messages
+find_input.title=Vind
+find_input.placeholder=Soek in dokument鈥�
+find_previous.title=Vind die vorige voorkoms van die frase
+find_previous_label=Vorige
+find_next.title=Vind die volgende voorkoms van die frase
+find_next_label=Volgende
+find_highlight=Verlig almal
+find_match_case_label=Kassensitief
+find_reached_top=Bokant van dokument is bereik; gaan voort van onder af
+find_reached_bottom=Einde van dokument is bereik; gaan voort van bo af
+find_not_found=Frase nie gevind nie
+
+# Error panel labels
+error_more_info=Meer inligting
+error_less_info=Minder inligting
+error_close=Sluit
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (ID: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Boodskap: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stapel: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=L锚er: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Lyn: {{line}}
+rendering_error='n Fout het voorgekom toe die bladsy weergegee is.
+
+# Predefined zoom values
+page_scale_width=Bladsywydte
+page_scale_fit=Pas bladsy
+page_scale_auto=Outomatiese zoem
+page_scale_actual=Werklike grootte
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Fout
+loading_error='n Fout het voorgekom met die laai van die PDF.
+invalid_file_error=Ongeldige of korrupte PDF-l锚er.
+missing_file_error=PDF-l锚er is weg.
+unexpected_response_error=Onverwagse antwoord van bediener.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}}-annotasie]
+password_label=Gee die wagwoord om di茅 PDF-l锚er mee te open.
+password_invalid=Ongeldige wagwoord. Probeer gerus weer.
+password_ok=OK
+password_cancel=Kanselleer
+
+printing_not_supported=Waarskuwing: Di茅 blaaier ondersteun nie drukwerk ten volle nie.
+printing_not_ready=Waarskuwing: Die PDF is nog nie volledig gelaai vir drukwerk nie.
+web_fonts_disabled=Webfonte is gedeaktiveer: kan nie PDF-fonte wat ingebed is, gebruik nie.
+document_colors_not_allowed=PDF-dokumente word nie toegelaat om hul eie kleure te gebruik nie: 鈥淟aat bladsye toe om hul eie kleure te kies鈥� is gedeaktiveer in die blaaier.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ak/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ak/viewer.properties
new file mode 100644
index 0000000..25dc62e
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ak/viewer.properties
@@ -0,0 +1,130 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Krataafa baako a etwa mu
+previous_label=Ekyiri-baako
+next.title=Krataafa a edi so baako
+next_label=Dea-蓻-di-so-baako
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+
+zoom_out.title=Zuum pue
+zoom_out_label=Zuum ba ab蓴nten
+zoom_in.title=Zuum k蓴 mu
+zoom_in_label=Zuum k蓴 mu
+zoom.title=Zuum
+presentation_mode.title=Sesa k蓴 Y蓻kyer蓻 Tebea mu
+presentation_mode_label=Y蓻kyer蓻 Tebea
+open_file.title=Bue Fael
+open_file_label=Bue
+print.title=Prente
+print_label=Prente
+download.title=Twe
+download_label=Twe
+bookmark.title=Seisei nhw蓻 (fa anaaso bue w蓴 tokuro foforo mu)
+bookmark_label=Seisei nhw蓻
+
+# Secondary toolbar and context menu
+
+
+# Document properties dialog box
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_title=Ti as蓻m:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=S蓴 anaaso dum saedbaa
+toggle_sidebar_label=S蓴 anaaso dum saedbaa
+document_outline_label=D蓴kom蓻nt b蓴bea
+thumbs.title=Kyer蓻 mfoniwaa
+thumbs_label=Mfoniwaa
+findbar.title=Hu w蓴 d蓴kom蓻nt no mu
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Krataafa {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Krataafa ne mfoniwaa {{page}}
+
+# Find panel button title and messages
+find_previous.title=San hu fres w蓴 ekyiri baako
+find_previous_label=Ekyiri baako
+find_next.title=San hu fres no w蓴 enim baako
+find_next_label=Ndiso
+find_highlight=Hy蓻 bibiara nso
+find_match_case_label=Fa susu kaase
+find_reached_top=Edu krataafa ne soro, atoa so efiri ase
+find_reached_bottom=Edu krataafa n'ewiei, atoa so efiri soro
+find_not_found=Ennhu fres
+
+# Error panel labels
+error_more_info=Inf蓴mehy蓻n bio a w蓴ka ho
+error_less_info=Te inf蓴mehy蓻n bio a w蓴ka ho so
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{v蓻蓻hyen}} (nsi: {{si}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Nkrato: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Staake: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Fael: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Laen: {{line}}
+rendering_error=Mfomso bae w蓴 bere a w蓴 rekyer蓻 krataafa no.
+
+# Predefined zoom values
+page_scale_width=Krataafa t蓻tr蓻t蓻
+page_scale_fit=Krataafa ehimtwa
+page_scale_auto=Zuum otomatik
+page_scale_actual=K蓻sey蓻 ankasa
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+
+# Loading indicator messages
+loading_error_indicator=Mfomso
+loading_error=Mfomso bae w蓴 bere a w蓴reloode PDF no.
+invalid_file_error=PDF fael no nndi mu anaaso ho at蓴 kyima.
+missing_file_error=PDF fael no ayera.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} T蓻kst-nyiano]
+password_ok=OK
+
+printing_not_supported=K蓴k蓴b蓴: Brawsa yi nnhy蓻 daa mma prent ho kwan.
+printing_not_ready=K蓴k蓴b蓴: W蓴nntwee PDF fael no nyinara mmbaee ama wo 蓻 tumi aprente.
+web_fonts_disabled=茊edum w蓻b-mf蓴nt: nntumi mmfa PDF mf蓴nt a w蓴hy蓻 mu nndi dwuma.
+document_colors_not_allowed=W蓴mma ho kwan s蓻 PDF ad蓴kom蓻nt de w蓴n ara w蓴n ahosu b蓻di dwuma: w蓴 adum 'Ma ho kwan ma nkrataafa mpaw w蓴n ara w蓴n ahosu' w蓴 brawsa yi mu.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/an/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/an/viewer.properties
new file mode 100644
index 0000000..3576134
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/an/viewer.properties
@@ -0,0 +1,184 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Pachina anterior
+previous_label=Anterior
+next.title=Pachina siguient
+next_label=Siguient
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=Pachina
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=de {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} de {{pagesCount}})
+
+zoom_out.title=Achiquir
+zoom_out_label=Achiquir
+zoom_in.title=Agrandir
+zoom_in_label=Agrandir
+zoom.title=Grandaria
+presentation_mode.title=Cambear t'o modo de presentaci贸n
+presentation_mode_label=Modo de presentaci贸n
+open_file.title=Ubrir o fichero
+open_file_label=Ubrir
+print.title=Imprentar
+print_label=Imprentar
+download.title=Descargar
+download_label=Descargar
+bookmark.title=Vista actual (copiar u ubrir en una nueva finestra)
+bookmark_label=Anvista actual
+
+# Secondary toolbar and context menu
+tools.title=Ferramientas
+tools_label=Ferramientas
+first_page.title=Ir ta la primer pachina
+first_page.label=Ir ta la primer pachina
+first_page_label=Ir ta la primer pachina
+last_page.title=Ir ta la zaguer pachina
+last_page.label=Ir ta la zaguera pachina
+last_page_label=Ir ta la zaguer pachina
+page_rotate_cw.title=Chirar enta la dreita
+page_rotate_cw.label=Chirar enta la dreita
+page_rotate_cw_label=Chira enta la dreita
+page_rotate_ccw.title=Chirar enta la zurda
+page_rotate_ccw.label=Chirar en sentiu antihorario
+page_rotate_ccw_label=Chirar enta la zurda
+
+cursor_text_select_tool.title=Activar la ferramienta de selecci贸n de texto
+cursor_text_select_tool_label=Ferramienta de selecci贸n de texto
+cursor_hand_tool.title=Activar la ferramienta man
+cursor_hand_tool_label=Ferramienta man
+
+# Document properties dialog box
+document_properties.title=Propiedatz d'o documento...
+document_properties_label=Propiedatz d'o documento...
+document_properties_file_name=Nombre de fichero:
+document_properties_file_size=Grandaria d'o fichero:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=Titol:
+document_properties_author=Autor:
+document_properties_subject=Afer:
+document_properties_keywords=Parolas clau:
+document_properties_creation_date=Calendata de creyaci贸n:
+document_properties_modification_date=Calendata de modificaci贸n:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Creyador:
+document_properties_producer=Creyador de PDF:
+document_properties_version=Versi贸n de PDF:
+document_properties_page_count=Numero de pachinas:
+document_properties_close=Zarrar
+
+print_progress_message=Se ye preparando la documentaci贸n pa imprentar鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=Cancelar
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Amostrar u amagar a barra lateral
+toggle_sidebar_notification.title=Cambiar barra lateral (lo documento contiene esquema/adchuntos)
+toggle_sidebar_label=Amostrar a barra lateral
+document_outline.title=Amostrar esquema d'o documento (fer doble clic pa expandir/compactar totz los items)
+document_outline_label=Esquema d'o documento
+attachments.title=Amostrar os adchuntos
+attachments_label=Adchuntos
+thumbs.title=Amostrar as miniaturas
+thumbs_label=Miniaturas
+findbar.title=Trobar en o documento
+findbar_label=Trobar
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Pachina {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Miniatura d'a pachina {{page}}
+
+# Find panel button title and messages
+find_input.title=Trobar
+find_input.placeholder=Trobar en o documento鈥�
+find_previous.title=Trobar l'anterior coincidencia d'a frase
+find_previous_label=Anterior
+find_next.title=Trobar a siguient coincidencia d'a frase
+find_next_label=Siguient
+find_highlight=Resaltar-lo tot
+find_match_case_label=Coincidencia de mayusclas/minusclas
+find_reached_top=S'ha plegau a l'inicio d'o documento, se contina dende baixo
+find_reached_bottom=S'ha plegau a la fin d'o documento, se contina dende alto
+find_not_found=No s'ha trobau a frase
+
+# Error panel labels
+error_more_info=Mas informaci贸n
+error_less_info=Menos informaci贸n
+error_close=Zarrar
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Mensache: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Pila: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Fichero: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Linia: {{line}}
+rendering_error=Ha ocurriu una error en renderizar a pachina.
+
+# Predefined zoom values
+page_scale_width=Amplaria d'a pachina
+page_scale_fit=Achuste d'a pachina
+page_scale_auto=Grandaria automatica
+page_scale_actual=Grandaria actual
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Error
+loading_error=S'ha produciu una error en cargar o PDF.
+invalid_file_error=O PDF no ye valido u ye estorbau.
+missing_file_error=No i ha fichero PDF.
+unexpected_response_error=Respuesta a lo servicio inasperada.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[Anotaci贸n {{type}}]
+password_label=Introduzca a clau ta ubrir iste fichero PDF.
+password_invalid=Clau invalida. Torna a intentar-lo.
+password_ok=Acceptar
+password_cancel=Cancelar
+
+printing_not_supported=Pare cuenta: Iste navegador no maneya totalment as impresions.
+printing_not_ready=Aviso: Encara no se ha cargau completament o PDF ta imprentar-lo.
+web_fonts_disabled=As fuents web son desactivadas: no se puet incrustar fichers PDF.
+document_colors_not_allowed=Los documentos PDF no pueden fer servir las suyas propias colors: 'Permitir que as pachinas triguen as suyas propias colors' ye desactivau en o navegador.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ar/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ar/viewer.properties
new file mode 100644
index 0000000..f4b53ed
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ar/viewer.properties
@@ -0,0 +1,242 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=丕賱氐賮丨丞 丕賱爻丕亘賯丞
+previous_label=丕賱爻丕亘賯丞
+next.title=丕賱氐賮丨丞 丕賱鬲丕賱賷丞
+next_label=丕賱鬲丕賱賷丞
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=氐賮丨丞
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=賲賳 {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} 賲賳 {{pagesCount}})
+
+zoom_out.title=亘毓賾丿
+zoom_out_label=亘毓賾丿
+zoom_in.title=賯乇賾亘
+zoom_in_label=賯乇賾亘
+zoom.title=丕賱鬲賯乇賷亘
+presentation_mode.title=丕賳鬲賯賱 賱賵囟毓 丕賱毓乇囟 丕賱鬲賯丿賷賲賷
+presentation_mode_label=賵囟毓 丕賱毓乇囟 丕賱鬲賯丿賷賲賷
+open_file.title=丕賮鬲丨 賲賱賮賸丕
+open_file_label=丕賮鬲丨
+print.title=丕胤亘毓
+print_label=丕胤亘毓
+download.title=賳夭賾賱
+download_label=賳夭賾賱
+bookmark.title=丕賱賲賳馗賵乇 丕賱丨丕賱賷 (丕賳爻禺 兀賵 丕賮鬲丨 賮賷 賳丕賮匕丞 噩丿賷丿丞)
+bookmark_label=丕賱賲賳馗賵乇 丕賱丨丕賱賷
+
+# Secondary toolbar and context menu
+tools.title=丕賱兀丿賵丕鬲
+tools_label=丕賱兀丿賵丕鬲
+first_page.title=丕匕賴亘 廿賱賶 丕賱氐賮丨丞 丕賱兀賵賱賶
+first_page.label=丕匕賴亘 廿賱賶 丕賱氐賮丨丞 丕賱兀賵賱賶
+first_page_label=丕匕賴亘 廿賱賶 丕賱氐賮丨丞 丕賱兀賵賱賶
+last_page.title=丕匕賴亘 廿賱賶 丕賱氐賮丨丞 丕賱兀禺賷乇丞
+last_page.label=丕匕賴亘 廿賱賶 丕賱氐賮丨丞 丕賱兀禺賷乇丞
+last_page_label=丕匕賴亘 廿賱賶 丕賱氐賮丨丞 丕賱兀禺賷乇丞
+page_rotate_cw.title=兀丿乇 亘丕鬲噩丕賴 毓賯丕乇亘 丕賱爻丕毓丞
+page_rotate_cw.label=兀丿乇 亘丕鬲噩丕賴 毓賯丕乇亘 丕賱爻丕毓丞
+page_rotate_cw_label=兀丿乇 亘丕鬲噩丕賴 毓賯丕乇亘 丕賱爻丕毓丞
+page_rotate_ccw.title=兀丿乇 亘毓賰爻 丕鬲噩丕賴 毓賯丕乇亘 丕賱爻丕毓丞
+page_rotate_ccw.label=兀丿乇 亘毓賰爻 丕鬲噩丕賴 毓賯丕乇亘 丕賱爻丕毓丞
+page_rotate_ccw_label=兀丿乇 亘毓賰爻 丕鬲噩丕賴 毓賯丕乇亘 丕賱爻丕毓丞
+
+cursor_text_select_tool.title=賮毓賾賱 兀丿丕丞 丕禺鬲賷丕乇 丕賱賳氐
+cursor_text_select_tool_label=兀丿丕丞 丕禺鬲賷丕乇 丕賱賳氐
+cursor_hand_tool.title=賮毓賾賱 兀丿丕丞 丕賱賷丿
+cursor_hand_tool_label=兀丿丕丞 丕賱賷丿
+
+scroll_vertical.title=丕爻鬲禺丿賲 丕賱鬲賲乇賷乇 丕賱乇兀爻賷
+scroll_vertical_label=丕賱鬲賲乇賷乇 丕賱乇兀爻賷
+scroll_horizontal.title=丕爻鬲禺丿賲 丕賱鬲賲乇賷乇 丕賱兀賮賯賷
+scroll_horizontal_label=丕賱鬲賲乇賷乇 丕賱兀賮賯賷
+scroll_wrapped.title=丕爻鬲禺丿賲 丕賱鬲賲乇賷乇 丕賱賲賱鬲賮
+scroll_wrapped_label=丕賱鬲賲乇賷乇 丕賱賲賱鬲賮
+
+spread_none.title=賱丕 鬲丿賲噩 賴賵丕賲卮 丕賱氐賮丨丕鬲 賲毓 亘毓囟賴丕 丕賱亘毓囟
+spread_none_label=亘賱丕 賴賵丕賲卮
+spread_odd.title=丕丿賲噩 賴賵丕賲卮 丕賱氐賮丨丕鬲 丕賱賮乇丿賷丞
+spread_odd_label=賴賵丕賲卮 丕賱氐賮丨丕鬲 丕賱賮乇丿賷丞
+spread_even.title=丕丿賲噩 賴賵丕賲卮 丕賱氐賮丨丕鬲 丕賱夭賵噩賷丞
+spread_even_label=賴賵丕賲卮 丕賱氐賮丨丕鬲 丕賱夭賵噩賷丞
+
+# Document properties dialog box
+document_properties.title=禺氐丕卅氐 丕賱賲爻鬲賳丿鈥�
+document_properties_label=禺氐丕卅氐 丕賱賲爻鬲賳丿鈥�
+document_properties_file_name=丕爻賲 丕賱賲賱賮:
+document_properties_file_size=丨噩賲 丕賱賲賱賮:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} 賰.亘丕賷鬲 ({{size_b}} 亘丕賷鬲)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} 賲.亘丕賷鬲 ({{size_b}} 亘丕賷鬲)
+document_properties_title=丕賱毓賳賵丕賳:
+document_properties_author=丕賱賲丐賱賮:
+document_properties_subject=丕賱賲賵囟賵毓:
+document_properties_keywords=丕賱賰賱賲丕鬲 丕賱兀爻丕爻賷丞:
+document_properties_creation_date=鬲丕乇賷禺 丕賱廿賳卮丕亍:
+document_properties_modification_date=鬲丕乇賷禺 丕賱鬲毓丿賷賱:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}貙 {{time}}
+document_properties_creator=丕賱賲賳卮卅:
+document_properties_producer=賲賳鬲噩 PDF:
+document_properties_version=廿氐丿丕乇丞 PDF:
+document_properties_page_count=毓丿丿 丕賱氐賮丨丕鬲:
+document_properties_page_size=賲賯丕爻 丕賱賵乇賯丞:
+document_properties_page_size_unit_inches=亘賵氐丞
+document_properties_page_size_unit_millimeters=賲賱賲
+document_properties_page_size_orientation_portrait=胤賵賱賷賾
+document_properties_page_size_orientation_landscape=毓乇囟賷賾
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=禺胤丕亘
+document_properties_page_size_name_legal=賯丕賳賵賳賷賾
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string=鈥弡{width}} 脳 鈥弡{height}} 鈥弡{unit}} (鈥弡{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string=鈥弡{width}} 脳 鈥弡{height}} 鈥弡{unit}} (鈥弡{name}}貙 {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=丕賱毓乇囟 丕賱爻乇賷毓 毓亘乇 丕賱賵賽亘:
+document_properties_linearized_yes=賳毓賲
+document_properties_linearized_no=賱丕
+document_properties_close=兀睾賱賯
+
+print_progress_message=賷購丨囟賾乇 丕賱賲爻鬲賳丿 賱賱胤亘丕毓丞鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}侏
+print_progress_close=兀賱睾賽
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=亘丿賾賱 馗賴賵乇 丕賱卮乇賷胤 丕賱噩丕賳亘賷
+toggle_sidebar_notification.title=亘丿賾賱 馗賴賵乇 丕賱卮乇賷胤 丕賱噩丕賳亘賷 (賷丨鬲賵賷 丕賱賲爻鬲賳丿 毓賱賶 賲禺胤胤 兀賵 賲乇賮賯丕鬲)
+toggle_sidebar_label=亘丿賾賱 馗賴賵乇 丕賱卮乇賷胤 丕賱噩丕賳亘賷
+document_outline.title=丕毓乇囟 賮賴乇爻 丕賱賲爻鬲賳丿 (賳賯乇 賲夭丿賵噩 賱鬲賲丿賷丿 兀賵 鬲賯賱賷氐 賰賱 丕賱毓賳丕氐乇)
+document_outline_label=賲禺胤胤 丕賱賲爻鬲賳丿
+attachments.title=丕毓乇囟 丕賱賲乇賮賯丕鬲
+attachments_label=丕賱賲購乇賮賯丕鬲
+thumbs.title=丕毓乇囟 賲購氐睾乇丕鬲
+thumbs_label=賲購氐睾賾乇丕鬲
+findbar.title=丕亘丨孬 賮賷 丕賱賲爻鬲賳丿
+findbar_label=丕亘丨孬
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=氐賮丨丞 {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=賲氐睾賾乇丞 氐賮丨丞 {{page}}
+
+# Find panel button title and messages
+find_input.title=丕亘丨孬
+find_input.placeholder=丕亘丨孬 賮賷 丕賱賲爻鬲賳丿鈥�
+find_previous.title=丕亘丨孬 毓賳 丕賱鬲賾賵丕噩丿 丕賱爻賾丕亘賯 賱賱毓亘丕乇丞
+find_previous_label=丕賱爻丕亘賯
+find_next.title=丕亘丨孬 毓賳 丕賱鬲賾賵丕噩丿 丕賱鬲賾丕賱賷 賱賱毓亘丕乇丞
+find_next_label=丕賱鬲丕賱賷
+find_highlight=兀亘乇賽夭 丕賱賰賱
+find_match_case_label=胤丕亘賯 丨丕賱丞 丕賱兀丨乇賮
+find_entire_word_label=賰賱賲丕鬲 賰丕賲賱丞
+find_reached_top=鬲丕亘毓鬲 賲賳 丕賱兀爻賮賱 亘毓丿賲丕 賵氐賱鬲 廿賱賶 亘丿丕賷丞 丕賱賲爻鬲賳丿
+find_reached_bottom=鬲丕亘毓鬲 賲賳 丕賱兀毓賱賶 亘毓丿賲丕 賵氐賱鬲 廿賱賶 賳賴丕賷丞 丕賱賲爻鬲賳丿
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]={{current}} 賲賳 兀氐賱 賲胤丕亘賯丞 賵丕丨丿丞
+find_match_count[two]={{current}} 賲賳 兀氐賱 賲胤丕亘賯鬲賷賳
+find_match_count[few]={{current}} 賲賳 兀氐賱 {{total}} 賲胤丕亘賯丕鬲
+find_match_count[many]={{current}} 賲賳 兀氐賱 {{total}} 賲胤丕亘賯丞
+find_match_count[other]={{current}} 賲賳 兀氐賱 {{total}} 賲胤丕亘賯丞
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]=賮賯胤
+find_match_count_limit[one]=兀賰孬乇 賲賳 賲胤丕亘賯丞 賵丕丨丿丞
+find_match_count_limit[two]=兀賰孬乇 賲賳 賲胤丕亘賯鬲賷賳
+find_match_count_limit[few]=兀賰孬乇 賲賳 {{limit}} 賲胤丕亘賯丕鬲
+find_match_count_limit[many]=兀賰孬乇 賲賳 {{limit}} 賲胤丕亘賯丞
+find_match_count_limit[other]=兀賰孬乇 賲賳 {{limit}} 賲胤丕亘賯丞
+find_not_found=賱丕 賵噩賵丿 賱賱毓亘丕乇丞
+
+# Error panel labels
+error_more_info=賲毓賱賵賲丕鬲 兀賰孬乇
+error_less_info=賲毓賱賵賲丕鬲 兀賯賱
+error_close=兀睾賱賯
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=鈥廝DF.js 賳{{version}} 鈥�(亘賳丕亍: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=丕賱乇爻丕賱丞: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=丕賱乇氐賾丞: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=丕賱賲賱賮: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=丕賱爻胤乇: {{line}}
+rendering_error=丨丿孬 禺胤兀 兀孬賳丕亍 毓乇囟 丕賱氐賮丨丞.
+
+# Predefined zoom values
+page_scale_width=毓乇囟 丕賱氐賮丨丞
+page_scale_fit=賲賱丕卅賲丞 丕賱氐賮丨丞
+page_scale_auto=鬲賯乇賷亘 鬲賱賯丕卅賷
+page_scale_actual=丕賱丨噩賲 丕賱賮毓賱賷
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}侏
+
+# Loading indicator messages
+loading_error_indicator=毓胤賱
+loading_error=丨丿孬 毓胤賱 兀孬賳丕亍 鬲丨賲賷賱 賲賱賮 PDF.
+invalid_file_error=賲賱賮 PDF 鬲丕賱賮 兀賵 睾賷乇 氐丨賷丨.
+missing_file_error=賲賱賮 PDF 睾賷乇 賲賵噩賵丿.
+unexpected_response_error=丕爻鬲噩丕亘丞 禺丕丿賵賲 睾賷乇 賲鬲賵賯毓丞.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[鬲毓賱賷賯 {{type}}]
+password_label=兀丿禺賱 賱賰賱賲丞 丕賱爻乇 賱賮鬲丨 賴匕丕 丕賱賲賱賮.
+password_invalid=賰賱賲丞 爻乇 禺胤兀. 賲賳 賮囟賱賰 兀毓丿 丕賱賲丨丕賵賱丞.
+password_ok=丨爻賳丕
+password_cancel=兀賱睾賽
+
+printing_not_supported=鬲丨匕賷乇: 賱丕 賷丿毓賲 賴匕丕 丕賱賲鬲氐賮丨 丕賱胤亘丕毓丞 亘卮賰賱 賰丕賲賱.
+printing_not_ready=鬲丨匕賷乇: 賲賱賮 PDF 賱賲 賷購丨賲賾賱 賰丕賲賱賸丕 賱賱胤亘丕毓丞.
+web_fonts_disabled=禺胤賵胤 丕賱賵亘 賲購毓胤賾賱丞: 鬲毓匕賾乇 丕爻鬲禺丿丕賲 禺胤賵胤 PDF 丕賱賲購囟賲賾賳丞.
+document_colors_not_allowed=賱賷爻 賲爻賲賵丨賸丕 賱賲賱賮丕鬲 PDF 亘丕爻鬲禺丿丕賲 兀賱賵丕賳賴丕 丕賱禺丕氐丞: 禺賷丕乇 鈥澵ж迟呚� 賱賱氐賮丨丕鬲 亘丕禺鬲賷丕乇 兀賱賵丕賳賴丕 丕賱禺丕氐丞鈥� 賱賷爻 賲購賮毓賾賱賸丕 賮賷 丕賱賲鬲氐賮丨.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/as/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/as/viewer.properties
new file mode 100644
index 0000000..ea3ecc7
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/as/viewer.properties
@@ -0,0 +1,167 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=唳唰班唳П唰班唳む 唳唳粪唳犩
+previous_label=唳唰班唳П唰班唳む
+next.title=唳О唰编О唰嵿Δ唰� 唳唳粪唳犩
+next_label=唳О唰编О唰嵿Δ唰�
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+
+zoom_out.title=唳溹唳� 唳嗋唳�
+zoom_out_label=唳溹唳� 唳嗋唳�
+zoom_in.title=唳溹唳� 唳囙Θ
+zoom_in_label=唳溹唳� 唳囙Θ
+zoom.title=唳溹唳� 唳曕О唳�
+presentation_mode.title=唳夃Κ唳膏唳ム唳Θ 唳呧П唳膏唳ム唳侧 唳唳撪
+presentation_mode_label=唳夃Κ唳膏唳ム唳Θ 唳呧П唳膏唳ム
+open_file.title=唳唳囙Σ 唳栢唳侧
+open_file_label=唳栢唳侧
+print.title=唳唰班唳ㄠ唳� 唳曕О唳�
+print_label=唳唰班唳ㄠ唳� 唳曕О唳�
+download.title=唳∴唳夃Θ唳�'唳� 唳曕О唳�
+download_label=唳∴唳夃Θ唳�'唳� 唳曕О唳�
+bookmark.title=唳О唰嵿Δ唳唳� 唳︵唳多唳� (唳曕Κ唳� 唳曕О唳� 唳呧Ε唳 唳ㄠΔ唰佮Θ 唳夃唳ㄠ唳∴唳� 唳栢唳侧)
+bookmark_label=唳О唰嵿Δ唳唳� 唳︵唳多唳�
+
+# Secondary toolbar and context menu
+tools.title=唳膏唳溹唳侧唳膏Ξ唰傕
+tools_label=唳膏唳溹唳侧唳膏Ξ唰傕
+first_page.title=唳唰班Ε唳� 唳唳粪唳犩唳� 唳唳撪
+first_page.label=唳唰班Ε唳� 唳唳粪唳犩唳� 唳唳撪
+first_page_label=唳唰班Ε唳� 唳唳粪唳犩唳� 唳唳撪
+last_page.title=唳膏О唰嵿Μ唳多唳� 唳唳粪唳犩唳� 唳唳撪
+last_page.label=唳膏О唰嵿Μ唳多唳� 唳唳粪唳犩唳� 唳唳撪
+last_page_label=唳膏О唰嵿Μ唳多唳� 唳唳粪唳犩唳� 唳唳撪
+page_rotate_cw.title=唳樴唰�唰� 唳︵唳多Δ 唳樴唰班唳撪
+page_rotate_cw.label=唳樴唰�唰� 唳︵唳多Δ 唳樴唰班唳撪
+page_rotate_cw_label=唳樴唰�唰� 唳︵唳多Δ 唳樴唰班唳撪
+page_rotate_ccw.title=唳樴唰�唰� 唳撪Σ唰嬥唳� 唳︵唳多Δ 唳樴唰班唳撪
+page_rotate_ccw.label=唳樴唰�唰� 唳撪Σ唰嬥唳� 唳︵唳多Δ 唳樴唰班唳撪
+page_rotate_ccw_label=唳樴唰�唰� 唳撪Σ唰嬥唳� 唳︵唳多Δ 唳樴唰班唳撪
+
+
+# Document properties dialog box
+document_properties.title=唳︵Ω唰嵿Δ唳距Μ唰囙唰� 唳唳多唳粪唳熰唳Ω唳唳光��
+document_properties_label=唳︵Ω唰嵿Δ唳距Μ唰囙唰� 唳唳多唳粪唳熰唳Ω唳唳光��
+document_properties_file_name=唳唳囙Σ 唳ㄠ唳�:
+document_properties_file_size=唳唳囙Σ唰� 唳嗋唳距О:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=唳多唰班唳粪:
+document_properties_author=唳侧唳栢:
+document_properties_subject=唳唳粪:
+document_properties_keywords=唳曕唰编唰班唳∴Ω唳唳�:
+document_properties_creation_date=唳膏唳粪唳熰唰� 唳む唰班唳�:
+document_properties_modification_date=唳О唳苦Μ唰班唳むΘ唰� 唳む唰班唳�:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=唳膏唳粪唳熰唳曕О唰嵿Δ唳�:
+document_properties_producer=PDF 唳夃唳唳︵:
+document_properties_version=PDF 唳膏唳膏唳曕О唳�:
+document_properties_page_count=唳唳粪唳犩唰� 唳椸Γ唳ㄠ:
+document_properties_close=唳Θ唰嵿Η 唳曕О唳�
+
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=唳曕唳粪Μ唳距О 唳熰唳� 唳曕О唳�
+toggle_sidebar_label=唳曕唳粪Μ唳距О 唳熰唳� 唳曕О唳�
+document_outline_label=唳︵Ω唰嵿Δ唳距Μ唰囙 唳嗋唳熰Σ唳距唳�
+attachments.title=唳忇唳距唳唳ㄠ唳熰Ω唳唳� 唳︵唳栢唰编唳撪
+attachments_label=唳忇唳距唳唳ㄠ唳熰Ω唳唳�
+thumbs.title=唳ム唳唳Θ唰囙唳侧Ω唳唳� 唳︵唳栢唰编唳撪
+thumbs_label=唳ム唳唳Θ唰囙唳侧Ω唳唳�
+findbar.title=唳︵Ω唰嵿Δ唳距Μ唰囙唳� 唳膏Θ唰嵿Η唳距Θ 唳曕О唳�
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=唳唳粪唳犩 {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=唳唳粪唳犩唰� 唳ム唳唳Θ唰囙唳� {{page}}
+
+# Find panel button title and messages
+find_previous.title=唳唳曕唳唳傕Χ唰� 唳唰班唳П唰班唳む 唳夃Κ唳膏唳ム唳む 唳膏Θ唰嵿Η唳距Θ 唳曕О唳�
+find_previous_label=唳唰班唳П唰班唳む
+find_next.title=唳唳曕唳唳傕Χ唰� 唳О唰编О唰嵿Δ唰� 唳夃Κ唳膏唳ム唳む 唳膏Θ唰嵿Η唳距Θ 唳曕О唳�
+find_next_label=唳О唰编О唰嵿Δ唰�
+find_highlight=唳膏唳侧 唳夃唰嵿唰嵿Μ唳� 唳曕О唳�
+find_match_case_label=唳Σ唳� 唳唳侧唳撪
+find_reached_top=唳むΣ唰� 唳О唳� 唳嗋О唳唳� 唳曕О唳�, 唳︵Ω唰嵿Δ唳距Μ唰囙唰� 唳撪Κ唰班Σ唰� 唳呧唳� 唳灌唳涏
+find_reached_bottom=唳撪Κ唰班О 唳О唳� 唳嗋О唳唳� 唳曕О唳�, 唳︵Ω唰嵿Δ唳距Μ唰囙唰� 唳むΣ唳侧 唳呧唳� 唳灌唳涏
+find_not_found=唳唳曕唳唳傕Χ 唳唰编 唳ㄠ唳�
+
+# Error panel labels
+error_more_info=唳呧Η唳苦 唳むΕ唰嵿Ο
+error_less_info=唳曕Ξ 唳むΕ唰嵿Ο
+error_close=唳Θ唰嵿Η 唳曕О唳�
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=唳唰班唳む: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=唳膏唳熰唳�: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=唳唳囙Σ: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=唳多唰班: {{line}}
+rendering_error=唳忇 唳唳粪唳犩 唰班唳`唳∴唰� 唳曕О唰嬥Δ唰� 唳忇唳� 唳む唰班唳熰 唳︵唳栢 唳︵唳侧啷�
+
+# Predefined zoom values
+page_scale_width=唳唳粪唳犩唰� 唳唰班Ω唰嵿Ε
+page_scale_fit=唳唳粪唳犩 唳栢唳�
+page_scale_auto=唳膏唳唳距Σ唳苦Δ 唳溹唳�
+page_scale_actual=唳唰班唰冟Δ 唳嗋唳距О
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+
+# Loading indicator messages
+loading_error_indicator=唳む唰班唳熰
+loading_error=PDF 唳�'唳� 唳曕О唰嬥Δ唰� 唳忇唳� 唳む唰班唳熰 唳︵唳栢 唳︵唳侧啷�
+invalid_file_error=唳呧Μ唰堗Η 唳呧Ε唳 唳曕唳粪Δ唳苦唰嵿О唳膏唳� PDF file啷�
+missing_file_error=唳膏Θ唰嵿Η唳距Θ唳灌唳� PDF 唳唳囙Σ啷�
+unexpected_response_error=唳呧Κ唰嵿О唳む唳唳多唳� 唳氞唰班唳唰� 唳唰班Δ唳苦唰嵿О唳苦唳距イ
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} 唳熰唳曕]
+password_label=唳忇 PDF 唳唳囙Σ 唳栢唳侧唳Σ唰� 唳唳涏П唰班唳� 唳膏唳唰编唳撪啷�
+password_invalid=唳呧Μ唰堗Η 唳唳涏П唰班唳∴イ 唳呧Θ唰佮唰嵿О唳� 唳曕О唳� 唳唳ㄠО 唳氞唳粪唳熰 唳曕О唳曕イ
+password_ok=唳犩唳� 唳嗋唰�
+
+printing_not_supported=唳膏Δ唰班唳曕Μ唳距О唰嵿Δ唳�: 唳唰班唳ㄠ唳熰唳� 唳忇 唳唰班唳夃唳距О 唳︵唳唰班 唳膏Ξ唰嵿Κ唰傕О唰嵿Γ唳唰编 唳膏Ξ唰班唳ム唳� 唳ㄠ唰熰イ
+printing_not_ready=唳膏Δ唰班唳曕Μ唳距О唰嵿Δ唳�: PDF 唳唰班唳ㄠ唳熰唳傕О 唳唳 唳膏Ξ唰嵿Κ唰傕О唰嵿Γ唳唰编 唳�'唳∴唳� 唳ㄠ唰熰イ
+web_fonts_disabled=唰编唳� 唳Θ唰嵿唳膏Ξ唰傕 唳呧Ω唳距Ξ唰班唳ムΜ唳距Θ 唳曕О唳� 唳嗋唰�: 唳呧Θ唰嵿Δ唰班唳唳曕唳� PDF 唳Θ唰嵿唳膏Ξ唰傕 唳唳П唳灌唰� 唳曕О唳苦Μ唳侧 唳呧唰嵿Ψ唳イ
+document_colors_not_allowed=PDF 唳︵Ω唰嵿Δ唳距Μ唰囙唳膏Ξ唰傕唰� 唳膏唳灌Δ唰� 唳ㄠ唳溹Ω唰嵿Μ 唰班 唳唳П唳灌唰� 唳曕О唳距О 唳呧Θ唰佮Ξ唳む 唳ㄠ唳�: 唳唰班唳夃唳距О唳� '唳唳粪唳犩唳膏Ξ唰傕唳� 唳膏唳灌Δ唰� 唳ㄠ唳溹Ω唰嵿Μ 唰班 唳ㄠ唰班唳唳氞Θ 唳曕О唳距О 唳呧Θ唰佮Ξ唳む 唳︵唰熰' 唳呧Ω唳距Ξ唰班唳ムΜ唳距Θ 唳曕О唳� 唳嗋唰囙イ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ast/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ast/viewer.properties
new file mode 100644
index 0000000..fdfd6da
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ast/viewer.properties
@@ -0,0 +1,197 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=P谩xina anterior
+previous_label=Anterior
+next.title=P谩xina siguiente
+next_label=Siguiente
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=P谩xina
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=de {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} de {{pagesCount}})
+
+zoom_out.title=Reducir
+zoom_out_label=Reducir
+zoom_in.title=Aumentar
+zoom_in_label=Aumentar
+zoom.title=Tama帽u
+presentation_mode.title=
+presentation_mode_label=
+open_file.title=Abrir ficheru
+open_file_label=Abrir
+print.title=Imprentar
+print_label=Imprentar
+download.title=Descargar
+download_label=Descargar
+bookmark.title=Vista actual (copiar o abrir nuna nueva ventana)
+bookmark_label=Vista actual
+
+# Secondary toolbar and context menu
+tools.title=Ferramientes
+tools_label=Ferramientes
+first_page.title=Dir a la primer p谩xina
+first_page.label=Dir a la primer p谩xina
+first_page_label=Dir a la primer p谩xina
+last_page.title=Dir a la postrer p谩xina
+last_page.label=Dir a la cabera p谩xina
+last_page_label=Dir a la postrer p谩xina
+page_rotate_cw.title=Xirar en sen horariu
+page_rotate_cw.label=
+page_rotate_cw_label=Xirar en sen horariu
+page_rotate_ccw.title=Xirar en sen antihorariu
+page_rotate_ccw.label=
+page_rotate_ccw_label=Xirar en sen antihorariu
+
+
+
+
+# Document properties dialog box
+document_properties.title=Propiedaes del documentu鈥�
+document_properties_label=Propiedaes del documentu鈥�
+document_properties_file_name=Nome de ficheru:
+document_properties_file_size=Tama帽u de ficheru:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=T铆tulu:
+document_properties_author=Autor:
+document_properties_subject=Asuntu:
+document_properties_keywords=Pallabres clave:
+document_properties_creation_date=Data de creaci贸n:
+document_properties_modification_date=Data de modificaci贸n:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Creador:
+document_properties_producer=Productor PDF:
+document_properties_version=Versi贸n PDF:
+document_properties_page_count=N煤mberu de p谩xines:
+document_properties_page_size_unit_inches=in
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized_yes=S铆
+document_properties_linearized_no=Non
+document_properties_close=Zarrar
+
+print_progress_message=Tresnando documentu pa imprentar鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=Encaboxar
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Camudar barra llateral
+toggle_sidebar_label=Camudar barra llateral
+document_outline.title=Amosar esquema del documentu (duble clic pa espander/contrayer tolos elementos)
+document_outline_label=Esquema del documentu
+attachments.title=Amosar axuntos
+attachments_label=Axuntos
+thumbs.title=Amosar miniatures
+thumbs_label=Miniatures
+findbar.title=Guetar nel documentu
+findbar_label=Guetar
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=P谩xina {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Miniatura de la p谩xina {{page}}
+
+# Find panel button title and messages
+find_input.title=Guetar
+find_input.placeholder=Guetar nel documentu鈥�
+find_previous.title=Alcontrar l'anterior apaici贸n de la fras
+find_previous_label=Anterior
+find_next.title=Alcontrar la siguiente apaici贸n d'esta fras
+find_next_label=Siguiente
+find_highlight=Remarcar toos
+find_match_case_label=Coincidencia de may煤s./min煤s.
+find_reached_top=Algam贸se'l principiu del documentu, siguir dende'l final
+find_reached_bottom=Algam贸se'l final del documentu, siguir dende'l principiu
+find_not_found=Frase non atopada
+
+# Error panel labels
+error_more_info=M谩s informaci贸n
+error_less_info=Menos informaci贸n
+error_close=Zarrar
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Mensaxe: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Pila: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Ficheru: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Llinia: {{line}}
+rendering_error=Hebo un fallu al renderizar la p谩xina.
+
+# Predefined zoom values
+page_scale_width=Anchor de la p谩xina
+page_scale_fit=Axuste de la p谩xina
+page_scale_auto=Tama帽u autom谩ticu
+page_scale_actual=Tama帽u actual
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Fallu
+loading_error=Hebo un fallu al cargar el PDF.
+invalid_file_error=Ficheru PDF inv谩lidu o corruptu.
+missing_file_error=Nun hai ficheru PDF.
+unexpected_response_error=Rempuesta inesperada del sirvidor.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[Anotaci贸n {{type}}]
+password_label=Introduz la contrase帽a p'abrir esti ficheru PDF
+password_invalid=Contrase帽a non v谩lida. Vuelvi a intentalo.
+password_ok=Aceutar
+password_cancel=Encaboxar
+
+printing_not_supported=Alvertencia: La imprentaci贸n ent谩 nun ta sofitada dafechu nesti restolador.
+printing_not_ready=Avisu: Esti PDF nun se carg贸 completamente pa poder imprentase.
+web_fonts_disabled=Les fontes web t谩n desactivaes: ye imposible usar les fontes PDF embeb铆es.
+document_colors_not_allowed=Los documentos PDF nun tienen permisu pa usar les sos colores: 芦Permitir que les p谩xines escueyan les sos colores禄 ta desactivao nel restolador.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/az/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/az/viewer.properties
new file mode 100644
index 0000000..46fb51c
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/az/viewer.properties
@@ -0,0 +1,242 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=茝vv蓹lki s蓹hif蓹
+previous_label=茝vv蓹lkini tap
+next.title=N枚vb蓹ti s蓹hif蓹
+next_label=陌r蓹li
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=S蓹hif蓹
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=/ {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} / {{pagesCount}})
+
+zoom_out.title=Uzaqla艧
+zoom_out_label=Uzaqla艧
+zoom_in.title=Yax谋nla艧
+zoom_in_label=Yax谋nla艧
+zoom.title=Yax谋nla艧d谋rma
+presentation_mode.title=T蓹qdimat Rejimin蓹 Ke莽
+presentation_mode_label=T蓹qdimat Rejimi
+open_file.title=Fayl A莽
+open_file_label=A莽
+print.title=Yazd谋r
+print_label=Yazd谋r
+download.title=Y眉kl蓹
+download_label=Y眉kl蓹
+bookmark.title=Haz谋rk谋 g枚r眉n眉艧 (k枚莽眉r v蓹 ya yeni p蓹nc蓹r蓹d蓹 a莽)
+bookmark_label=Haz谋rk谋 g枚r眉n眉艧
+
+# Secondary toolbar and context menu
+tools.title=Al蓹tl蓹r
+tools_label=Al蓹tl蓹r
+first_page.title=陌lk S蓹hif蓹y蓹 get
+first_page.label=陌lk S蓹hif蓹y蓹 get
+first_page_label=陌lk S蓹hif蓹y蓹 get
+last_page.title=Son S蓹hif蓹y蓹 get
+last_page.label=Son S蓹hif蓹y蓹 get
+last_page_label=Son S蓹hif蓹y蓹 get
+page_rotate_cw.title=Saat 陌stiqam蓹tind蓹 F谋rlat
+page_rotate_cw.label=Saat 陌stiqam蓹tind蓹 F谋rlat
+page_rotate_cw_label=Saat 陌stiqam蓹tind蓹 F谋rlat
+page_rotate_ccw.title=Saat 陌stiqam蓹tinin 茝ksin蓹 F谋rlat
+page_rotate_ccw.label=Saat 陌stiqam蓹tinin 茝ksin蓹 F谋rlat
+page_rotate_ccw_label=Saat 陌stiqam蓹tinin 茝ksin蓹 F谋rlat
+
+cursor_text_select_tool.title=Yaz谋 se莽m蓹 al蓹tini aktivl蓹艧dir
+cursor_text_select_tool_label=Yaz谋 se莽m蓹 al蓹ti
+cursor_hand_tool.title=茝l al蓹tini aktivl蓹艧dir
+cursor_hand_tool_label=茝l al蓹ti
+
+scroll_vertical.title=艦aquli s眉r眉艧d眉rm蓹 i艧l蓹t
+scroll_vertical_label=艦aquli s眉r眉艧d眉rm蓹
+scroll_horizontal.title=脺f眉qi s眉r眉艧d眉rm蓹 i艧l蓹t
+scroll_horizontal_label=脺f眉qi s眉r眉艧d眉rm蓹
+scroll_wrapped.title=B眉k眉l眉 s眉r眉艧d眉rm蓹 i艧l蓹t
+scroll_wrapped_label=B眉k眉l眉 s眉r眉艧d眉rm蓹
+
+spread_none.title=Yan-yana birl蓹艧dirilmi艧 s蓹hif蓹l蓹ri i艧l蓹tm蓹
+spread_none_label=Birl蓹艧dirm蓹
+spread_odd.title=Yan-yana birl蓹艧dirilmi艧 s蓹hif蓹l蓹ri t蓹k n枚mr蓹li s蓹hif蓹l蓹rd蓹n ba艧lat
+spread_odd_label=T蓹k n枚mr蓹li
+spread_even.title=Yan-yana birl蓹艧dirilmi艧 s蓹hif蓹l蓹ri c眉t n枚mr蓹li s蓹hif蓹l蓹rd蓹n ba艧lat
+spread_even_label=C眉t n枚mr蓹li
+
+# Document properties dialog box
+document_properties.title=S蓹n蓹d x眉susiyy蓹tl蓹ri鈥�
+document_properties_label=S蓹n蓹d x眉susiyy蓹tl蓹ri鈥�
+document_properties_file_name=Fayl ad谋:
+document_properties_file_size=Fayl 枚l莽眉s眉:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} bayt)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} bayt)
+document_properties_title=Ba艧l谋k:
+document_properties_author=M眉蓹llif:
+document_properties_subject=M枚vzu:
+document_properties_keywords=A莽ar s枚zl蓹r:
+document_properties_creation_date=Yarad谋l谋艧 Tarixi :
+document_properties_modification_date=D蓹yi艧dirilm蓹 Tarixi :
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Yaradan:
+document_properties_producer=PDF yarad谋c谋s谋:
+document_properties_version=PDF versiyas谋:
+document_properties_page_count=S蓹hif蓹 say谋:
+document_properties_page_size=S蓹hif蓹 脰l莽眉s眉:
+document_properties_page_size_unit_inches=in莽
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=portret
+document_properties_page_size_orientation_landscape=albom
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=M蓹ktub
+document_properties_page_size_name_legal=H眉quqi
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=Fast Web View:
+document_properties_linearized_yes=B蓹li
+document_properties_linearized_no=Xeyr
+document_properties_close=Qapat
+
+print_progress_message=S蓹n蓹d 莽ap 眉莽眉n haz谋rlan谋r鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=L蓹臒v et
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Yan Paneli A莽/Ba臒la
+toggle_sidebar_notification.title=Yan paneli 莽evir (s蓹n蓹dd蓹 icmal/ba臒lama var)
+toggle_sidebar_label=Yan Paneli A莽/Ba臒la
+document_outline.title=S蓹n蓹din eskizini g枚st蓹r (b眉t眉n b蓹ndl蓹ri a莽maq/y谋臒maq 眉莽眉n iki d蓹f蓹 klikl蓹yin)
+document_outline_label=S蓹n蓹d strukturu
+attachments.title=Ba臒lamalar谋 g枚st蓹r
+attachments_label=Ba臒lamalar
+thumbs.title=Ki莽ik 艧蓹kill蓹ri g枚st蓹r
+thumbs_label=Ki莽ik 艧蓹kill蓹r
+findbar.title=S蓹n蓹dd蓹 Tap
+findbar_label=Tap
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=S蓹hif蓹{{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas={{page}} s蓹hif蓹sinin ki莽ik v蓹ziyy蓹ti
+
+# Find panel button title and messages
+find_input.title=Tap
+find_input.placeholder=S蓹n蓹dd蓹 tap鈥�
+find_previous.title=Bir 枚nc蓹ki uy臒un g蓹l蓹n s枚z眉 tap谋r
+find_previous_label=Geri
+find_next.title=Bir sonrak谋 uy臒un g蓹l蓹n s枚z眉 tap谋r
+find_next_label=陌r蓹li
+find_highlight=陌艧ar蓹l蓹
+find_match_case_label=B枚y眉k/ki莽ik h蓹rf蓹 h蓹ssasl谋q
+find_entire_word_label=Tam s枚zl蓹r
+find_reached_top=S蓹n蓹din yuxar谋s谋na 莽atd谋, a艧a臒谋dan davam edir
+find_reached_bottom=S蓹n蓹din sonuna 莽atd谋, yuxar谋dan davam edir
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]={{current}} / {{total}} uy臒unluq
+find_match_count[two]={{current}} / {{total}} uy臒unluq
+find_match_count[few]={{current}} / {{total}} uy臒unluq
+find_match_count[many]={{current}} / {{total}} uy臒unluq
+find_match_count[other]={{current}} / {{total}} uy臒unluq
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]={{limit}}-dan 莽ox uy臒unluq
+find_match_count_limit[one]={{limit}}-d蓹n 莽ox uy臒unluq
+find_match_count_limit[two]={{limit}}-d蓹n 莽ox uy臒unluq
+find_match_count_limit[few]={{limit}} uy臒unluqdan daha 莽ox
+find_match_count_limit[many]={{limit}} uy臒unluqdan daha 莽ox
+find_match_count_limit[other]={{limit}} uy臒unluqdan daha 莽ox
+find_not_found=Uy臒unla艧ma tap谋lmad谋
+
+# Error panel labels
+error_more_info=Daha 莽ox m蓹lumati
+error_less_info=Daha az m蓹lumat
+error_close=Qapat
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (y谋臒ma: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=陌smar谋c: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stek: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Fayl: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=S蓹tir: {{line}}
+rendering_error=S蓹hif蓹 g枚st蓹ril蓹rk蓹n s蓹hv yarand谋.
+
+# Predefined zoom values
+page_scale_width=S蓹hif蓹 geni艧liyi
+page_scale_fit=S蓹hif蓹ni s谋臒d谋r
+page_scale_auto=Avtomatik yax谋nla艧d谋r
+page_scale_actual=Haz谋rk谋 H蓹cm
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=S蓹hv
+loading_error=PDF y眉klen蓹rk蓹n bir s蓹hv yarand谋.
+invalid_file_error=S蓹hv v蓹 ya z蓹d蓹l蓹nmi艧 olmu艧 PDF fayl.
+missing_file_error=PDF fayl yoxdur.
+unexpected_response_error=G枚zl蓹nilm蓹z server cavab谋.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Annotasiyas谋]
+password_label=Bu PDF fayl谋 a莽maq 眉莽眉n parolu daxil edin.
+password_invalid=Parol s蓹hvdir. Bir daha yoxlay谋n.
+password_ok=Tamam
+password_cancel=L蓹臒v et
+
+printing_not_supported=X蓹b蓹rdarl谋q: 脟ap bu s蓹yyah t蓹r蓹find蓹n tam olaraq d蓹st蓹kl蓹nmir.
+printing_not_ready=X蓹b蓹rdarl谋q: PDF 莽ap 眉莽眉n tam y眉kl蓹nm蓹yib.
+web_fonts_disabled=Web 艦riftl蓹r s枚nd眉r眉l眉b: yerl蓹艧dirilmi艧 PDF 艧riftl蓹rini istifad蓹 etm蓹k m眉mk眉n deyil.
+document_colors_not_allowed=PDF s蓹n蓹dl蓹r蓹 枚z r蓹ngl蓹rini i艧l蓹tm蓹y蓹 icaz蓹 verilmir: 鈥淪蓹hif蓹l蓹r蓹 枚z r蓹ngl蓹rini istifad蓹 etm蓹y蓹 icaz蓹 ver鈥漨蓹 s蓹yyahda s枚nd眉r眉l眉b.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/be/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/be/viewer.properties
new file mode 100644
index 0000000..f606dc3
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/be/viewer.properties
@@ -0,0 +1,242 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=袩邪锌褟褉褝写薪褟褟 褋褌邪褉芯薪泻邪
+previous_label=袩邪锌褟褉褝写薪褟褟
+next.title=袧邪褋褌褍锌薪邪褟 褋褌邪褉芯薪泻邪
+next_label=袧邪褋褌褍锌薪邪褟
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=小褌邪褉芯薪泻邪
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=蟹 {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} 蟹 {{pagesCount}})
+
+zoom_out.title=袩邪屑械薪褕褘褑褜
+zoom_out_label=袩邪屑械薪褕褘褑褜
+zoom_in.title=袩邪胁褟谢褨褔褘褑褜
+zoom_in_label=袩邪胁褟谢褨褔褘褑褜
+zoom.title=袩邪胁褟谢褨褔褝薪薪械 褌褝泻褋褌褍
+presentation_mode.title=袩械褉邪泻谢褞褔褘褑褑邪 褳 褉褝卸褘屑 锌邪泻邪蟹褍
+presentation_mode_label=袪褝卸褘屑 锌邪泻邪蟹褍
+open_file.title=袗写泻褉褘褑褜 褎邪泄谢
+open_file_label=袗写泻褉褘褑褜
+print.title=袛褉褍泻邪胁邪褑褜
+print_label=袛褉褍泻邪胁邪褑褜
+download.title=小褑褟谐薪褍褑褜
+download_label=小褑褟谐薪褍褑褜
+bookmark.title=笑褟锌械褉邪褕薪褟褟 锌褉邪褟胁邪 (褋泻邪锌褨褟胁邪褑褜 邪斜芯 邪写褔褘薪褨褑褜 褍 薪芯胁褘屑 邪泻薪械)
+bookmark_label=笑褟锌械褉邪褕薪褟褟 锌褉邪褟胁邪
+
+# Secondary toolbar and context menu
+tools.title=袩褉褘谢邪写褘
+tools_label=袩褉褘谢邪写褘
+first_page.title=袩械褉邪泄褋褑褨 薪邪 锌械褉褕褍褞 褋褌邪褉芯薪泻褍
+first_page.label=袩械褉邪泄褋褑褨 薪邪 锌械褉褕褍褞 褋褌邪褉芯薪泻褍
+first_page_label=袩械褉邪泄褋褑褨 薪邪 锌械褉褕褍褞 褋褌邪褉芯薪泻褍
+last_page.title=袩械褉邪泄褋褑褨 薪邪 邪锌芯褕薪褞褞 褋褌邪褉芯薪泻褍
+last_page.label=袩械褉邪泄褋褑褨 薪邪 邪锌芯褕薪褞褞 褋褌邪褉芯薪泻褍
+last_page_label=袩械褉邪泄褋褑褨 薪邪 邪锌芯褕薪褞褞 褋褌邪褉芯薪泻褍
+page_rotate_cw.title=袩邪胁褟褉薪褍褑褜 锌邪 褋芯薪褑褍
+page_rotate_cw.label=袩邪胁褟褉薪褍褑褜 锌邪 褋芯薪褑褍
+page_rotate_cw_label=袩邪胁褟褉薪褍褑褜 锌邪 褋芯薪褑褍
+page_rotate_ccw.title=袩邪胁褟褉薪褍褑褜 褋褍锌褉邪褑褜 褋芯薪褑邪
+page_rotate_ccw.label=袩邪胁褟褉薪褍褑褜 褋褍锌褉邪褑褜 褋芯薪褑邪
+page_rotate_ccw_label=袩邪胁褟褉薪褍褑褜 褋褍锌褉邪褑褜 褋芯薪褑邪
+
+cursor_text_select_tool.title=校泻谢褞褔褘褑褜 锌褉褘谢邪写褍 胁褘斜邪褉褍 褌褝泻褋褌褍
+cursor_text_select_tool_label=袩褉褘谢邪写邪 胁褘斜邪褉褍 褌褝泻褋褌褍
+cursor_hand_tool.title=校泻谢褞褔褘褑褜 褉褍褔薪褍褞 锌褉褘谢邪写褍
+cursor_hand_tool_label=袪褍褔薪邪褟 锌褉褘谢邪写邪
+
+scroll_vertical.title=校卸褘胁邪褑褜 胁械褉褌褘泻邪谢褜薪褍褞 锌褉邪泻褉褍褌泻褍
+scroll_vertical_label=袙械褉褌褘泻邪谢褜薪邪褟 锌褉邪泻褉褍褌泻邪
+scroll_horizontal.title=校卸褘胁邪褑褜 谐邪褉褘蟹邪薪褌邪谢褜薪褍褞 锌褉邪泻褉褍褌泻褍
+scroll_horizontal_label=袚邪褉褘蟹邪薪褌邪谢褜薪邪褟 锌褉邪泻褉褍褌泻邪
+scroll_wrapped.title=校卸褘胁邪褑褜 屑邪褕褌邪斜邪胁邪谢褜薪褍褞 锌褉邪泻褉褍褌泻褍
+scroll_wrapped_label=袦邪褕褌邪斜邪胁邪谢褜薪邪褟 锌褉邪泻褉褍褌泻邪
+
+spread_none.title=袧械 胁褘泻邪褉褘褋褌芯褳胁邪褑褜 褉邪蟹谐芯褉薪褍褌褘褟 褋褌邪褉芯薪泻褨
+spread_none_label=袘械蟹 褉邪蟹谐芯褉薪褍褌褘褏 褋褌邪褉芯薪邪泻
+spread_odd.title=袪邪蟹谐芯褉薪褍褌褘褟 褋褌邪褉芯薪泻褨 锌邪褔褘薪邪褞褔褘 蟹 薪褟褑芯褌薪褘褏 薪褍屑邪褉芯褳
+spread_odd_label=袧褟褑芯褌薪褘褟 褋褌邪褉芯薪泻褨 蟹谢械胁邪
+spread_even.title=袪邪蟹谐芯褉薪褍褌褘褟 褋褌邪褉芯薪泻褨 锌邪褔褘薪邪褞褔褘 蟹 褑芯褌薪褘褏 薪褍屑邪褉芯褳
+spread_even_label=笑芯褌薪褘褟 褋褌邪褉芯薪泻褨 蟹谢械胁邪
+
+# Document properties dialog box
+document_properties.title=校谢邪褋褑褨胁邪褋褑褨 写邪泻褍屑械薪褌邪鈥�
+document_properties_label=校谢邪褋褑褨胁邪褋褑褨 写邪泻褍屑械薪褌邪鈥�
+document_properties_file_name=袧邪蟹胁邪 褎邪泄谢邪:
+document_properties_file_size=袩邪屑械褉 褎邪泄谢邪:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} 袣袘 ({{size_b}} 斜邪泄褌)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} 袦袘 ({{size_b}} 斜邪泄褌)
+document_properties_title=袟邪谐邪谢芯胁邪泻:
+document_properties_author=袗褳褌邪褉:
+document_properties_subject=孝褝屑邪:
+document_properties_keywords=袣谢褞褔邪胁褘褟 褋谢芯胁褘:
+document_properties_creation_date=袛邪褌邪 褋褌胁邪褉褝薪薪褟:
+document_properties_modification_date=袛邪褌邪 蟹屑褟薪械薪薪褟:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=小褌胁邪褉邪谢褜薪褨泻:
+document_properties_producer=袙褘褉邪斜薪褨泻 PDF:
+document_properties_version=袙械褉褋褨褟 PDF:
+document_properties_page_count=袣芯谢褜泻邪褋褑褜 褋褌邪褉芯薪邪泻:
+document_properties_page_size=袩邪屑械褉 褋褌邪褉芯薪泻褨:
+document_properties_page_size_unit_inches=褑邪谢褟褳
+document_properties_page_size_unit_millimeters=屑屑
+document_properties_page_size_orientation_portrait=泻薪褨卸薪邪褟
+document_properties_page_size_orientation_landscape=邪谢褜斜芯屑薪邪褟
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Letter
+document_properties_page_size_name_legal=Legal
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=啸褍褌泻褨 锌褉邪谐谢褟写 褍 袉薪褌褝褉薪褝褑械:
+document_properties_linearized_yes=孝邪泻
+document_properties_linearized_no=袧械
+document_properties_close=袟邪泻褉褘褑褜
+
+print_progress_message=袩邪写褉褘褏褌芯褳泻邪 写邪泻褍屑械薪褌邪 写邪 写褉褍泻褍鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=小泻邪褋邪胁邪褑褜
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=袩邪泻邪蟹邪褑褜/褋褏邪胁邪褑褜 斜邪泻邪胁褍褞 锌邪薪褝谢褜
+toggle_sidebar_notification.title=袩邪泻邪蟹邪褑褜/褋褏邪胁邪褑褜 斜邪泻邪胁褍褞 锌邪薪褝谢褜 (写邪泻褍屑械薪褌 屑邪械 蟹屑械褋褌/褍泻谢邪写邪薪薪褨)
+toggle_sidebar_label=袩邪泻邪蟹邪褑褜/褋褏邪胁邪褑褜 斜邪泻邪胁褍褞 锌邪薪褝谢褜
+document_outline.title=袩邪泻邪蟹邪褑褜 褋褌褉褍泻褌褍褉褍 写邪泻褍屑械薪褌邪 (写胁邪泄薪邪褟 锌褋褌褉褘褔泻邪, 泻邪斜 褉邪蟹谐邪褉薪褍褑褜 /蟹谐邪褉薪褍褑褜 褍褋械 褝谢械屑械薪褌褘)
+document_outline_label=小褌褉褍泻褌褍褉邪 写邪泻褍屑械薪褌邪
+attachments.title=袩邪泻邪蟹邪褑褜 写邪谢褍褔褝薪薪褨
+attachments_label=袛邪谢褍褔褝薪薪褨
+thumbs.title=袩邪泻邪蟹 屑褨薪褨褟褑褞褉
+thumbs_label=袦褨薪褨褟褑褞褉褘
+findbar.title=袩芯褕褍泻 褍 写邪泻褍屑械薪褑械
+findbar_label=袟薪邪泄褋褑褨
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=小褌邪褉芯薪泻邪 {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=袦褨薪褨褟褑褞褉邪 褋褌邪褉芯薪泻褨 {{page}}
+
+# Find panel button title and messages
+find_input.title=楔褍泻邪褑褜
+find_input.placeholder=楔褍泻邪褑褜 褍 写邪泻褍屑械薪褑械鈥�
+find_previous.title=袟薪邪泄褋褑褨 锌邪锌褟褉褝写薪褨 胁褘锌邪写邪泻 胁褘褉邪蟹褍
+find_previous_label=袩邪锌褟褉褝写薪褨
+find_next.title=袟薪邪泄褋褑褨 薪邪褋褌褍锌薪褘 胁褘锌邪写邪泻 胁褘褉邪蟹褍
+find_next_label=袧邪褋褌褍锌薪褘
+find_highlight=袩邪写褎邪褉斜邪胁邪褑褜 褍褋械
+find_match_case_label=袗写褉芯蟹薪褨胁邪褑褜 胁褟谢褨泻褨褟/屑邪谢褘褟 谢褨褌邪褉褘
+find_entire_word_label=小谢芯胁褘 褑邪谢泻邪屑
+find_reached_top=袛邪褋褟谐薪褍褌褘 锌邪褔邪褌邪泻 写邪泻褍屑械薪褌邪, 锌褉邪褑褟谐 蟹 泻邪薪褑邪
+find_reached_bottom=袛邪褋褟谐薪褍褌褘 泻邪薪械褑 写邪泻褍屑械薪褌邪, 锌褉邪褑褟谐 蟹 锌邪褔邪褌泻褍
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]={{current}} 蟹 {{total}} 褋褍锌邪写蟹械薪薪褟
+find_match_count[two]={{current}} 蟹 {{total}} 褋褍锌邪写蟹械薪薪褟褳
+find_match_count[few]={{current}} 蟹 {{total}} 褋褍锌邪写蟹械薪薪褟褳
+find_match_count[many]={{current}} 蟹 {{total}} 褋褍锌邪写蟹械薪薪褟褳
+find_match_count[other]={{current}} 蟹 {{total}} 褋褍锌邪写蟹械薪薪褟褳
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]=袘芯谢褜褕 蟹邪 {{limit}} 褋褍锌邪写蟹械薪薪褟褳
+find_match_count_limit[one]=袘芯谢褜褕 蟹邪 {{limit}} 褋褍锌邪写蟹械薪薪械
+find_match_count_limit[two]=袘芯谢褜褕 蟹邪 {{limit}} 褋褍锌邪写蟹械薪薪褟褳
+find_match_count_limit[few]=袘芯谢褜褕 蟹邪 {{limit}} 褋褍锌邪写蟹械薪薪褟褳
+find_match_count_limit[many]=袘芯谢褜褕 蟹邪 {{limit}} 褋褍锌邪写蟹械薪薪褟褳
+find_match_count_limit[other]=袘芯谢褜褕 蟹邪 {{limit}} 褋褍锌邪写蟹械薪薪褟褳
+find_not_found=袙褘褉邪蟹 薪械 蟹薪芯泄写蟹械薪褘
+
+# Error panel labels
+error_more_info=袩邪写褉邪斜褟蟹薪械泄
+error_less_info=小褑褨褋谢邪
+error_close=袟邪泻褉褘褑褜
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js 胁{{version}} (蟹斜芯褉泻邪: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=袩邪胁械写邪屑谢械薪薪械: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=小褌芯褋: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=肖邪泄谢: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=袪邪写芯泻: {{line}}
+rendering_error=袟写邪褉褘谢邪褋褟 锌邪屑褘谢泻邪 锌邪写褔邪褋 邪写谢褞褋褌褉邪胁邪薪薪褟 褋褌邪褉芯薪泻褨.
+
+# Predefined zoom values
+page_scale_width=楔褘褉褘薪褟 褋褌邪褉芯薪泻褨
+page_scale_fit=校褑褨褋薪械薪薪械 褋褌邪褉芯薪泻褨
+page_scale_auto=袗褳褌邪屑邪褌褘褔薪邪械 锌邪胁械谢褨褔褝薪薪械
+page_scale_actual=小邪锌褉邪褳写薪褘 锌邪屑械褉
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=袩邪屑褘谢泻邪
+loading_error=袟写邪褉褘谢邪褋褟 锌邪屑褘谢泻邪 锌邪写褔邪褋 蟹邪谐褉褍蟹泻褨 PDF.
+invalid_file_error=袧褟褋锌褉邪褳薪褘 邪斜芯 锌邪褕泻芯写卸邪薪褘 褎邪泄谢 PDF.
+missing_file_error=袗写褋褍褌薪褘 褎邪泄谢 PDF.
+unexpected_response_error=袧械褔邪泻邪薪褘 邪写泻邪蟹 褋械褉胁械褉邪.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Annotation]
+password_label=校胁褟写蟹褨褑械 锌邪褉芯谢褜, 泻邪斜 邪写泻褉褘褑褜 谐褝褌褘 褎邪泄谢 PDF.
+password_invalid=袧褟写蟹械泄褋薪褘 锌邪褉芯谢褜. 袩邪褋锌褉邪斜褍泄褑械 蟹薪芯褳.
+password_ok=袛芯斜褉邪
+password_cancel=小泻邪褋邪胁邪褑褜
+
+printing_not_supported=袩邪锌褟褉褝写卸邪薪薪械: 写褉褍泻 薪械 锌邪写褌褉褘屑谢褨胁邪械褑褑邪 褑邪谢泻邪屑 谐褝褌褘屑 斜褉邪褳蟹械褉邪屑.
+printing_not_ready=校胁邪谐邪: PDF 薪械 褋褑褟谐薪褍褌褘 褑邪谢泻邪屑 写谢褟 写褉褍泻邪胁邪薪薪褟.
+web_fonts_disabled=楔褉褘褎褌褘 小械褑褨胁邪 蟹邪斜邪褉芯薪械薪褘: 薪械屑邪谐褔褘屑邪 褳卸褘胁邪褑褜 褍泻谢邪写蟹械薪褘褟 褕褉褘褎褌褘 PDF.
+document_colors_not_allowed=PDF-写邪泻褍屑械薪褌邪屑 薪械 写邪蟹胁芯谢械薪邪 胁褘泻邪褉褘褋褌芯褳胁邪褑褜 褋胁邪械 泻芯谢械褉褘: 褍 斜褉邪褳蟹械褉褘 邪写泻谢褞褔邪薪褘 锌邪褉邪屑械褌褉 "袛邪蟹胁芯谢褨褑褜 胁褝斜-褋邪泄褌邪屑 胁褘泻邪褉褘褋褌芯褳胁邪褑褜 褋胁邪械 泻芯谢械褉褘".
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/bg/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/bg/viewer.properties
new file mode 100644
index 0000000..713b113
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/bg/viewer.properties
@@ -0,0 +1,242 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=袩褉械写懈褕薪邪 褋褌褉邪薪懈褑邪
+previous_label=袩褉械写懈褕薪邪
+next.title=小谢械写胁邪褖邪 褋褌褉邪薪懈褑邪
+next_label=小谢械写胁邪褖邪
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=小褌褉邪薪懈褑邪
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=芯褌 {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} 芯褌 {{pagesCount}})
+
+zoom_out.title=袧邪屑邪谢褟胁邪薪械
+zoom_out_label=袧邪屑邪谢褟胁邪薪械
+zoom_in.title=校胁械谢懈褔邪胁邪薪械
+zoom_in_label=校胁械谢懈褔邪胁邪薪械
+zoom.title=袦邪褖邪斜懈褉邪薪械
+presentation_mode.title=袩褉械胁泻谢褞褔胁邪薪械 泻褗屑 褉械卸懈屑 薪邪 锌褉械写褋褌邪胁褟薪械
+presentation_mode_label=袪械卸懈屑 薪邪 锌褉械写褋褌邪胁褟薪械
+open_file.title=袨褌胁邪褉褟薪械 薪邪 褎邪泄谢
+open_file_label=袨褌胁邪褉褟薪械
+print.title=袨褌锌械褔邪褌胁邪薪械
+print_label=袨褌锌械褔邪褌胁邪薪械
+download.title=袠蟹褌械谐谢褟薪械
+download_label=袠蟹褌械谐谢褟薪械
+bookmark.title=孝械泻褍褖 懈蟹谐谢械写 (泻芯锌懈褉邪薪械 懈谢懈 芯褌胁邪褉褟薪械 胁 薪芯胁 锌褉芯蟹芯褉械褑)
+bookmark_label=孝械泻褍褖 懈蟹谐谢械写
+
+# Secondary toolbar and context menu
+tools.title=袠薪褋褌褉褍屑械薪褌懈
+tools_label=袠薪褋褌褉褍屑械薪褌懈
+first_page.title=袣褗屑 锌褗褉胁邪褌邪 褋褌褉邪薪懈褑邪
+first_page.label=袣褗屑 锌褗褉胁邪褌邪 褋褌褉邪薪懈褑邪
+first_page_label=袣褗屑 锌褗褉胁邪褌邪 褋褌褉邪薪懈褑邪
+last_page.title=袣褗屑 锌芯褋谢械写薪邪褌邪 褋褌褉邪薪懈褑邪
+last_page.label=袣褗屑 锌芯褋谢械写薪邪褌邪 褋褌褉邪薪懈褑邪
+last_page_label=袣褗屑 锌芯褋谢械写薪邪褌邪 褋褌褉邪薪懈褑邪
+page_rotate_cw.title=袟邪胁褗褉褌邪薪械 锌芯 褔邪褋. 褋褌褉械谢泻邪
+page_rotate_cw.label=袟邪胁褗褉褌邪薪械 锌芯 褔邪褋芯胁薪懈泻芯胁邪褌邪 褋褌褉械谢泻邪
+page_rotate_cw_label=袟邪胁褗褉褌邪薪械 锌芯 褔邪褋芯胁薪懈泻芯胁邪褌邪 褋褌褉械谢泻邪
+page_rotate_ccw.title=袟邪胁褗褉褌邪薪械 芯斜褉邪褌薪芯 薪邪 褔邪褋. 褋褌褉械谢泻邪
+page_rotate_ccw.label=袟邪胁褗褉褌邪薪械 芯斜褉邪褌薪芯 薪邪 褔邪褋芯胁薪懈泻芯胁邪褌邪 褋褌褉械谢泻邪
+page_rotate_ccw_label=袟邪胁褗褉褌邪薪械 芯斜褉邪褌薪芯 薪邪 褔邪褋芯胁薪懈泻芯胁邪褌邪 褋褌褉械谢泻邪
+
+cursor_text_select_tool.title=袙泻谢褞褔胁邪薪械 薪邪 懈薪褋褌褉褍屑械薪褌邪 蟹邪 懈蟹斜芯褉 薪邪 褌械泻褋褌
+cursor_text_select_tool_label=袠薪褋褌褉褍屑械薪褌 蟹邪 懈蟹斜芯褉 薪邪 褌械泻褋褌
+cursor_hand_tool.title=袙泻谢褞褔胁邪薪械 薪邪 懈薪褋褌褉褍屑械薪褌邪 褉褗泻邪
+cursor_hand_tool_label=袠薪褋褌褉褍屑械薪褌 褉褗泻邪
+
+scroll_vertical.title=袠蟹锌芯谢蟹胁邪薪械 薪邪 胁械褉褌懈泻邪谢薪芯 锌谢褗蟹谐邪薪械
+scroll_vertical_label=袙械褉褌懈泻邪谢薪芯 锌谢褗蟹谐邪薪械
+scroll_horizontal.title=袠蟹锌芯谢蟹胁邪薪械 薪邪 褏芯褉懈蟹芯薪褌邪谢薪芯
+scroll_horizontal_label=啸芯褉懈蟹芯薪褌邪谢薪芯 锌谢褗蟹谐邪薪械
+scroll_wrapped.title=袠蟹锌芯谢蟹胁邪薪械 薪邪 屑邪褖邪斜懈褉褍械屑芯 锌谢褗蟹谐邪薪械
+scroll_wrapped_label=袦邪褖邪斜懈褉褍械屑芯 锌谢褗蟹谐邪薪械
+
+spread_none.title=袪械卸懈屑褗褌 薪邪 褋写胁芯褟胁邪薪械 械 懈蟹泻谢褞褔械薪
+spread_none_label=袘械蟹 褋写胁芯褟胁邪薪械
+spread_odd.title=小写胁芯褟胁邪薪械, 蟹邪锌芯褔胁邪泄泻懈 芯褌 薪械褔械褌薪懈褌械 褋褌褉邪薪懈褑懈
+spread_odd_label=袧械褔械褌薪懈褌械 芯褌谢褟胁芯
+spread_even.title=小写胁芯褟胁邪薪械, 蟹邪锌芯褔胁邪泄泻懈 芯褌 褔械褌薪懈褌械 褋褌褉邪薪懈褑懈
+spread_even_label=效械褌薪懈褌械 芯褌谢褟胁芯
+
+# Document properties dialog box
+document_properties.title=小胁芯泄褋褌胁邪 薪邪 写芯泻褍屑械薪褌邪鈥�
+document_properties_label=小胁芯泄褋褌胁邪 薪邪 写芯泻褍屑械薪褌邪鈥�
+document_properties_file_name=袠屑械 薪邪 褎邪泄谢:
+document_properties_file_size=袚芯谢械屑懈薪邪 薪邪 褎邪泄谢:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} 袣袘 ({{size_b}} 斜邪泄褌邪)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} 袦袘 ({{size_b}} 斜邪泄褌邪)
+document_properties_title=袟邪谐谢邪胁懈械:
+document_properties_author=袗胁褌芯褉:
+document_properties_subject=孝械屑邪:
+document_properties_keywords=袣谢褞褔芯胁懈 写褍屑懈:
+document_properties_creation_date=袛邪褌邪 薪邪 褋褗蟹写邪胁邪薪械:
+document_properties_modification_date=袛邪褌邪 薪邪 锌褉芯屑褟薪邪:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=小褗蟹写邪褌械谢:
+document_properties_producer=PDF 锌褉芯懈蟹胁械写械薪 芯褌:
+document_properties_version=袠蟹写邪薪懈械 薪邪 PDF:
+document_properties_page_count=袘褉芯泄 褋褌褉邪薪懈褑懈:
+document_properties_page_size=袪邪蟹屑械褉 薪邪 褋褌褉邪薪懈褑邪褌邪:
+document_properties_page_size_unit_inches=懈薪褔
+document_properties_page_size_unit_millimeters=屑屑
+document_properties_page_size_orientation_portrait=锌芯褉褌褉械褌
+document_properties_page_size_orientation_landscape=锌械泄蟹邪卸
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Letter
+document_properties_page_size_name_legal=袩褉邪胁薪懈 胁褗锌褉芯褋懈
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=袘褗褉蟹 锌褉械谐谢械写:
+document_properties_linearized_yes=袛邪
+document_properties_linearized_no=袧械
+document_properties_close=袟邪褌胁邪褉褟薪械
+
+print_progress_message=袩芯写谐芯褌胁褟薪械 薪邪 写芯泻褍屑械薪褌邪 蟹邪 芯褌锌械褔邪褌胁邪薪械鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=袨褌泻邪蟹
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=袩褉械胁泻谢褞褔胁邪薪械 薪邪 褋褌褉邪薪懈褔薪邪褌邪 谢械薪褌邪
+toggle_sidebar_notification.title=袩褉械胁泻谢褞褔胁邪薪械 薪邪 褋褌褉邪薪懈褔薪邪褌邪 谢械薪褌邪 (写芯泻褍屑械薪褌懈 褋褗褋 褋褌褉褍泻褌褍褉邪/锌褉懈泻邪褔械薪懈 褎邪泄谢芯胁械)
+toggle_sidebar_label=袩褉械胁泻谢褞褔胁邪薪械 薪邪 褋褌褉邪薪懈褔薪邪褌邪 谢械薪褌邪
+document_outline.title=袩芯泻邪蟹胁邪薪械 薪邪 褋褌褉褍泻褌褍褉邪褌邪 薪邪 写芯泻褍屑械薪褌邪 (写胁褍泻褉邪褌薪芯 褖褉邪泻胁邪薪械 蟹邪 褋胁懈胁邪薪械/褉邪蟹谐褗胁邪薪械 薪邪 胁褋懈褔泻芯)
+document_outline_label=小褌褉褍泻褌褍褉邪 薪邪 写芯泻褍屑械薪褌邪
+attachments.title=袩芯泻邪蟹胁邪薪械 薪邪 锌褉懈褌褍褉泻懈褌械
+attachments_label=袩褉懈褌褍褉泻懈
+thumbs.title=袩芯泻邪蟹胁邪薪械 薪邪 屑懈薪懈邪褌褞褉懈褌械
+thumbs_label=袦懈薪懈邪褌褞褉懈
+findbar.title=袧邪屑懈褉邪薪械 胁 写芯泻褍屑械薪褌邪
+findbar_label=孝褗褉褋械薪械
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=小褌褉邪薪懈褑邪 {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=袦懈薪懈邪褌褞褉邪 薪邪 褋褌褉邪薪懈褑邪 {{page}}
+
+# Find panel button title and messages
+find_input.title=孝褗褉褋械薪械
+find_input.placeholder=孝褗褉褋械薪械 胁 写芯泻褍屑械薪褌邪鈥�
+find_previous.title=袧邪屑懈褉邪薪械 薪邪 锌褉械写懈褕薪芯 褋褗胁锌邪写械薪懈械 薪邪 褎褉邪蟹邪褌邪
+find_previous_label=袩褉械写懈褕薪邪
+find_next.title=袧邪屑懈褉邪薪械 薪邪 褋谢械写胁邪褖芯 褋褗胁锌邪写械薪懈械 薪邪 褎褉邪蟹邪褌邪
+find_next_label=小谢械写胁邪褖邪
+find_highlight=袨褌泻褉芯褟胁邪薪械 薪邪 胁褋懈褔泻懈
+find_match_case_label=小褗胁锌邪写械薪懈械 薪邪 褉械谐懈褋褌褗褉邪
+find_entire_word_label=笑械谢懈 写褍屑懈
+find_reached_top=袛芯褋褌懈谐薪邪褌芯 械 薪邪褔邪谢芯褌芯 薪邪 写芯泻褍屑械薪褌邪, 锌褉芯写褗谢卸邪胁邪薪械 芯褌 泻褉邪褟
+find_reached_bottom=袛芯褋褌懈谐薪邪褌 械 泻褉邪褟褌 薪邪 写芯泻褍屑械薪褌邪, 锌褉芯写褗谢卸邪胁邪薪械 芯褌 薪邪褔邪谢芯褌芯
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]={{current}} 芯褌 {{total}} 褋褗胁锌邪写械薪懈械
+find_match_count[two]={{current}} 芯褌 {{total}} 褋褗胁锌邪写械薪懈褟
+find_match_count[few]={{current}} 芯褌 {{total}} 褋褗胁锌邪写械薪懈褟
+find_match_count[many]={{current}} 芯褌 {{total}} 褋褗胁锌邪写械薪懈褟
+find_match_count[other]={{current}} 芯褌 {{total}} 褋褗胁锌邪写械薪懈褟
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]=袩芯胁械褔械 芯褌 {{limit}} 褋褗胁锌邪写械薪懈褟
+find_match_count_limit[one]=袩芯胁械褔械 芯褌 {{limit}} 褋褗胁锌邪写械薪懈械
+find_match_count_limit[two]=袩芯胁械褔械 芯褌 {{limit}} 褋褗胁锌邪写械薪懈褟
+find_match_count_limit[few]=袩芯胁械褔械 芯褌 {{limit}} 褋褗胁锌邪写械薪懈褟
+find_match_count_limit[many]=袩芯胁械褔械 芯褌 {{limit}} 褋褗胁锌邪写械薪懈褟
+find_match_count_limit[other]=袩芯胁械褔械 芯褌 {{limit}} 褋褗胁锌邪写械薪懈褟
+find_not_found=肖褉邪蟹邪褌邪 薪械 械 薪邪屑械褉械薪邪
+
+# Error panel labels
+error_more_info=袩芯胁械褔械 懈薪褎芯褉屑邪褑懈褟
+error_less_info=袩芯-屑邪谢泻芯 懈薪褎芯褉屑邪褑懈褟
+error_close=袟邪褌胁邪褉褟薪械
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=袠蟹写邪薪懈械 薪邪 PDF.js {{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=小褗芯斜褖械薪懈械: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=小褌械泻: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=肖邪泄谢: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=袪械写: {{line}}
+rendering_error=袚褉械褕泻邪 锌褉懈 懈蟹褔械褉褌邪胁邪薪械 薪邪 褋褌褉邪薪懈褑邪褌邪.
+
+# Predefined zoom values
+page_scale_width=楔懈褉懈薪邪 薪邪 褋褌褉邪薪懈褑邪褌邪
+page_scale_fit=袙屑械褋褌胁邪薪械 胁 褋褌褉邪薪懈褑邪褌邪
+page_scale_auto=袗胁褌芯屑邪褌懈褔薪芯 屑邪褖邪斜懈褉邪薪械
+page_scale_actual=袛械泄褋褌胁懈褌械谢械薪 褉邪蟹屑械褉
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=袚褉械褕泻邪
+loading_error=袩芯谢褍褔懈 褋械 谐褉械褕泻邪 锌褉懈 蟹邪褉械卸写邪薪械 薪邪 PDF-邪.
+invalid_file_error=袧械胁邪谢懈写械薪 懈谢懈 锌芯胁褉械写械薪 PDF 褎邪泄谢.
+missing_file_error=袥懈锌褋胁邪褖 PDF 褎邪泄谢.
+unexpected_response_error=袧械芯褔邪泻胁邪薪 芯褌谐芯胁芯褉 芯褌 褋褗褉胁褗褉邪.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[袗薪芯褌邪褑懈褟 {{type}}]
+password_label=袙褗胁械写械褌械 锌邪褉芯谢邪 蟹邪 芯褌胁邪褉褟薪械 薪邪 褌芯蟹懈 PDF 褎邪泄谢.
+password_invalid=袧械胁邪谢懈写薪邪 锌邪褉芯谢邪. 袦芯谢褟, 芯锌懈褌邪泄褌械 芯褌薪芯胁芯.
+password_ok=袛芯斜褉械
+password_cancel=袨褌泻邪蟹
+
+printing_not_supported=袙薪懈屑邪薪懈械: 孝芯蟹懈 褔械褌械褑 薪褟屑邪 锌褗谢薪邪 锌芯写写褉褗卸泻邪 薪邪 芯褌锌械褔邪褌胁邪薪械.
+printing_not_ready=袙薪懈屑邪薪懈械: 孝芯蟹懈 PDF 褎邪泄谢 薪械 械 薪邪锌褗谢薪芯 蟹邪褉械写械薪 蟹邪 锌械褔邪褌.
+web_fonts_disabled=校械斜-褕褉懈褎褌芯胁械褌械 褋邪 蟹邪斜褉邪薪械薪懈: 褉邪蟹褉械褕邪胁邪薪械 薪邪 懈蟹锌芯谢蟹胁邪薪械褌芯 薪邪 胁谐褉邪写械薪懈褌械 PDF 褕褉懈褎褌芯胁械.
+document_colors_not_allowed=袧邪 写芯泻褍屑械薪褌懈褌械 芯褌 胁懈写 PDF 薪械 械 褉邪蟹褉械褕械薪芯 写邪 懈蟹锌芯谢蟹胁邪褌 褋芯斜褋褌胁械薪懈 褑胁械褌芯胁械: 鈥炐犘靶费�械褕邪胁邪薪械 薪邪 褋褌褉邪薪懈褑懈褌械 写邪 懈蟹斜懈褉邪褌 褋芯斜褋褌胁械薪懈 褑胁械褌芯胁械鈥� 械 懈蟹泻谢褞褔械薪芯 胁 褔械褌械褑邪.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/bn-BD/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/bn-BD/viewer.properties
new file mode 100644
index 0000000..0e2f8fc
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/bn-BD/viewer.properties
@@ -0,0 +1,215 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=唳唳班唳Μ唳班唳む 唳唳む
+previous_label=唳唳班唳Μ唳班唳む
+next.title=唳Π唳Π唰嵿Δ唰� 唳唳む
+next_label=唳Π唳Π唰嵿Δ唰�
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=唳唳む
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages={{pagesCount}} 唳忇Π
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pagesCount}} 唳忇Π {{pageNumber}})
+
+zoom_out.title=唳涏唳� 唳嗋唳距Π唰� 唳唳班Ζ唳班唳多Θ
+zoom_out_label=唳涏唳� 唳嗋唳距Π唰� 唳唳班Ζ唳班唳多Θ
+zoom_in.title=唳 唳嗋唳距Π唰� 唳唳班Ζ唳班唳多Θ
+zoom_in_label=唳 唳嗋唳距Π唰� 唳唳班Ζ唳班唳多Θ
+zoom.title=唳 唳嗋唳距Π唰� 唳唳班Ζ唳班唳多Θ
+presentation_mode.title=唳夃Κ唳膏唳ム唳Θ唳� 唳唳∴ 唳膏唳唳囙 唳曕Π唰佮Θ
+presentation_mode_label=唳夃Κ唳膏唳ム唳Θ唳� 唳唳�
+open_file.title=唳唳囙Σ 唳栢唳侧唳�
+open_file_label=唳栢唳侧唳�
+print.title=唳唳︵唳班Γ
+print_label=唳唳︵唳班Γ
+download.title=唳∴唳夃Θ唳侧唳�
+download_label=唳∴唳夃Θ唳侧唳�
+bookmark.title=唳Π唰嵿Δ唳唳� 唳呧Μ唳膏唳ム (唳呧Θ唰佮Σ唳苦Κ唳� 唳呧Ε唳 唳ㄠΔ唰佮Θ 唳夃唳ㄠ唳∴ 唳む 唳栢唳侧唳�)
+bookmark_label=唳Π唰嵿Δ唳唳� 唳呧Μ唳膏唳ム
+
+# Secondary toolbar and context menu
+tools.title=唳熰唳�
+tools_label=唳熰唳�
+first_page.title=唳唳班Ε唳� 唳唳む唰� 唳唳�
+first_page.label=唳唳班Ε唳� 唳唳む唰� 唳唳�
+first_page_label=唳唳班Ε唳� 唳唳む唰� 唳唳�
+last_page.title=唳多唳� 唳唳む唰� 唳唳�
+last_page.label=唳多唳� 唳唳む唰� 唳唳�
+last_page_label=唳多唳� 唳唳む唰� 唳唳�
+page_rotate_cw.title=唳樴唳苦Π 唳曕唳佮唳距Π 唳︵唳曕 唳樴唳班唳�
+page_rotate_cw.label=唳樴唳苦Π 唳曕唳佮唳距Π 唳︵唳曕 唳樴唳班唳�
+page_rotate_cw_label=唳樴唳苦Π 唳曕唳佮唳距Π 唳︵唳曕 唳樴唳班唳�
+page_rotate_ccw.title=唳樴Α唳监唳� 唳曕唳佮唳距Π 唳唳Π唰�唳む 唳樴唳班唳�
+page_rotate_ccw.label=唳樴Α唳监唳� 唳曕唳佮唳距Π 唳唳Π唰�唳む 唳樴唳班唳�
+page_rotate_ccw_label=唳樴Α唳监唳� 唳曕唳佮唳距Π 唳唳Π唰�唳む 唳樴唳班唳�
+
+cursor_text_select_tool.title=唳侧唳栢 唳ㄠ唳班唳唳氞 唳熰唳� 唳膏唰嵿Π唳苦 唳曕Π唰佮Θ
+cursor_text_select_tool_label=唳侧唳栢 唳ㄠ唳班唳唳氞 唳熰唳�
+cursor_hand_tool.title=唳灌唳唳ㄠ唳� 唳熰唳� 唳膏唰嵿Π唳苦Ο唳� 唳曕Π唰佮Θ
+cursor_hand_tool_label=唳灌唳唳ㄠ唳� 唳熰唳�
+
+
+
+# Document properties dialog box
+document_properties.title=唳ㄠΕ唳� 唳唳多唳粪唳熰唳��
+document_properties_label=唳ㄠΕ唳� 唳唳多唳粪唳熰唳��
+document_properties_file_name=唳唳囙Σ唰囙Π 唳ㄠ唳�:
+document_properties_file_size=唳唳囙Σ唰囙Π 唳嗋唳距Π:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} 唳曕唳 ({{size_b}} 唳唳囙)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} 唳忇Ξ唳 ({{size_b}} 唳唳囙)
+document_properties_title=唳多唳班唳ㄠ唳�:
+document_properties_author=唳侧唳栢:
+document_properties_subject=唳唳粪:
+document_properties_keywords=唳曕唳撪唳距Π唰嵿Α:
+document_properties_creation_date=唳む唳班唳� 唳む唳班唳�:
+document_properties_modification_date=唳Π唳苦Μ唳班唳むΘ唰囙Π 唳む唳班唳�:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=唳唳班Ω唰嵿Δ唰佮Δ唳曕唳班:
+document_properties_producer=唳唳∴唳忇Λ 唳唳班Ω唰嵿Δ唰佮Δ唳曕唳班:
+document_properties_version=唳唳∴唳忇Λ 唳膏唳粪唳曕Π唳�:
+document_properties_page_count=唳唳� 唳唳む:
+document_properties_page_size=唳唳む唳� 唳膏唳囙:
+document_properties_page_size_unit_inches=唳忇Π 唳Η唰嵿Ο唰�
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=唳夃Σ唳唳�
+document_properties_page_size_orientation_landscape=唳呧Θ唰佮Ν唰傕Ξ唳苦
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=唳侧唳熰唳�
+document_properties_page_size_name_legal=唳侧唳椸唳�
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized_yes=唳灌唳唳�
+document_properties_linearized_no=唳ㄠ
+document_properties_close=唳Θ唰嵿Η
+
+print_progress_message=唳唳︵唳班Γ唰囙Π 唳溹Θ唰嵿Ο 唳ㄠΕ唳� 唳唳班Ω唰嵿Δ唰佮Δ 唳曕Π唳� 唳灌唰嵿唰団��
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=唳唳む唳�
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=唳膏唳囙Α唳唳� 唳熰唳� 唳曕Π唰佮Θ
+toggle_sidebar_notification.title=唳膏唳囙Α唳唳� 唳熰唳� (唳ㄠΕ唳苦Δ唰� 唳嗋唳熰Σ唳距唳�/唳忇唳距唳唳ㄠ唳� 唳班Ο唳监唳涏)
+toggle_sidebar_label=唳膏唳囙Α唳唳� 唳熰唳� 唳曕Π唰佮Θ
+document_outline.title=唳ㄠΕ唳苦Π 唳嗋唳熰Σ唳距唳� 唳︵唳栢唳� (唳膏Μ 唳嗋唳熰唳� 唳唳班Ω唳距Π唳苦Δ/唳膏唰嵿唰佮唳苦Δ 唳曕Π唳む 唳∴Μ唳� 唳曕唳侧唳� 唳曕Π唰佮Θ)
+document_outline_label=唳ㄠΕ唳苦Π 唳班唳Π唰囙唳�
+attachments.title=唳膏唳唳曕唳む 唳︵唳栢唳�
+attachments_label=唳膏唳唳曕唳む
+thumbs.title=唳ム唳唳Θ唰囙唳� 唳膏Ξ唰傕 唳唳班Ζ唳班唳多Θ 唳曕Π唰佮Θ
+thumbs_label=唳ム唳唳Θ唰囙唳� 唳膏Ξ唰傕
+findbar.title=唳ㄠΕ唳苦Π 唳Η唰嵿Ο唰� 唳栢唳佮唰佮Θ
+findbar_label=唳栢唳佮唰佮Θ
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=唳唳む {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas={{page}} 唳唳む唳� 唳ム唳唳Θ唰囙唳�
+
+# Find panel button title and messages
+find_input.title=唳栢唳佮唰佮Θ
+find_input.placeholder=唳ㄠΕ唳苦Π 唳Η唰嵿Ο唰� 唳栢唳佮唰佮Θ鈥�
+find_previous.title=唳唳曕唳唳傕Χ唰囙Π 唳唳班唳Μ唳班唳む 唳夃Κ唳膏唳ム唳む 唳呧Θ唰佮Ω唳ㄠ唳о唳�
+find_previous_label=唳唳班唳Μ唳班唳む
+find_next.title=唳唳曕唳唳傕Χ唰囙Π 唳Π唳Π唰嵿Δ唰� 唳夃Κ唳膏唳ム唳む 唳呧Θ唰佮Ω唳ㄠ唳о唳�
+find_next_label=唳Π唳Π唰嵿Δ唰�
+find_highlight=唳膏Μ 唳灌唳囙Σ唳距唳� 唳曕Π唳� 唳灌Μ唰�
+find_match_case_label=唳呧唰嵿Ψ唳班唳� 唳涏唳佮Ζ 唳唳侧唳ㄠ
+find_reached_top=唳唳む唳� 唳多唳班唳む 唳唳涏 唳椸唳涏, 唳ㄠ唳� 唳ム唳曕 唳嗋Π唳唳� 唳曕Π唳� 唳灌唰囙唰�
+find_reached_bottom=唳唳む唳� 唳多唳粪 唳唳涏 唳椸唳涏, 唳夃Κ唳� 唳ム唳曕 唳嗋Π唳唳� 唳曕Π唳� 唳灌唰囙唰�
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_not_found=唳唳曕唳唳傕Χ 唳唳撪唳� 唳唰熰Θ唳�
+
+# Error panel labels
+error_more_info=唳嗋Π唳� 唳むΕ唰嵿Ο
+error_less_info=唳曕Ξ 唳むΕ唰嵿Ο
+error_close=唳Θ唰嵿Η
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=唳唳班唳む: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stack: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=唳ㄠΕ唳�: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=唳侧唳囙Θ: {{line}}
+rendering_error=唳唳む 唳夃Κ唳膏唳ム唳Θ唳距Π 唳膏Ξ唰� 唳む唳班唳熰 唳︵唳栢 唳︵唰熰唳涏啷�
+
+# Predefined zoom values
+page_scale_width=唳唳む唳� 唳唳班Ω唰嵿Ε
+page_scale_fit=唳唳む 唳唳� 唳曕Π唰佮Θ
+page_scale_auto=唳膏唳唳傕唰嵿Π唳苦 唳溹唳�
+page_scale_actual=唳唳班唰冟Δ 唳嗋唳距Π
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=唳む唳班唳熰
+loading_error=唳唳∴唳忇Λ 唳侧唳� 唳曕Π唳距Π 唳膏Ξ唰� 唳む唳班唳熰 唳︵唳栢 唳︵唰熰唳涏啷�
+invalid_file_error=唳呧唳距Π唰嵿Ο唳曕Π 唳呧Ε唳 唳曕唳粪Δ唳苦唰嵿Π唳膏唳� 唳唳∴唳忇Λ 唳唳囙Σ啷�
+missing_file_error=唳ㄠ唳栢唳佮 PDF 唳唳囙Σ啷�
+unexpected_response_error=唳呧Κ唰嵿Π唳む唳唳多唳� 唳膏唳班唳唳� 唳唳班Δ唳苦唰嵿Π唳苦唳距イ
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} 唳熰唳曕]
+password_label=唳唳∴唳忇Λ 唳唳囙Σ唳熰 唳撪Κ唰囙Θ 唳曕Π唳む 唳唳膏唰熰唳班唳� 唳︵唳ㄠイ
+password_invalid=唳唳� 唳唳膏唰熰唳班唳∴イ 唳呧Θ唰佮唰嵿Π唳� 唳曕Π唰� 唳嗋Μ唳距Π 唳氞唳粪唳熰 唳曕Π唰佮Θ啷�
+password_ok=唳犩唳� 唳嗋唰�
+password_cancel=唳唳む唳�
+
+printing_not_supported=唳膏Δ唳班唳曕Δ唳�: 唳忇 唳唳班唳夃唳距Π唰� 唳唳︵唳班Γ 唳膏Ξ唰嵿Κ唰傕Π唰嵿Γ唳唳 唳膏Ξ唳班唳ム唳� 唳ㄠ啷�
+printing_not_ready=唳膏Δ唳班唳曕唳曕Π唳�: 唳唳∴唳忇Λ唳熰 唳唳︵唳班Γ唰囙Π 唳溹Θ唰嵿Ο 唳膏Ξ唰嵿Κ唰傕Π唰嵿Γ 唳侧唳� 唳灌唳ㄠ啷�
+web_fonts_disabled=唳撪唰囙Μ 唳Θ唰嵿 唳ㄠ唳粪唳曕唳班唰�: 唳膏唳唳曕唳� 唳唳∴唳忇Λ 唳Θ唰嵿 唳唳Μ唳灌唳� 唳曕Π唳� 唳唳氞唳涏 唳ㄠ啷�
+document_colors_not_allowed=唳唳∴唳忇Λ 唳∴唰佮Ξ唰囙Θ唰嵿唳曕 唳む唳︵唳� 唳ㄠ唳溹Ω唰嵿Μ 唳班 唳唳Μ唳灌唳班 唳呧Θ唰佮Ξ唳む 唳ㄠ唳�: '唳唳む 唳む唳︵唳� 唳ㄠ唳溹唳膏唳� 唳班 唳ㄠ唳班唳唳氞Θ 唳曕Π唳む 唳呧Θ唰佮Ξ唳む 唳︵唳�' 唳忇 唳唳班唳夃唳距Π唰� 唳ㄠ唳粪唳曕唳班唰� 唳班唰囙唰囙イ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/bn-IN/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/bn-IN/viewer.properties
new file mode 100644
index 0000000..4e22923
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/bn-IN/viewer.properties
@@ -0,0 +1,177 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=唳唳班唳Μ唳班唳む 唳唳粪唳犩
+previous_label=唳唳班唳Μ唳班唳む
+next.title=唳Π唳Π唰嵿Δ唰� 唳唳粪唳犩
+next_label=唳Π唳Π唰嵿Δ唰�
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=唳唳�
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages={{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pagesCount}} 唳忇Π {{pageNumber}})
+
+zoom_out.title=唳涏唳� 唳唳 唳唳班Ζ唳班唳多Θ
+zoom_out_label=唳涏唳� 唳唳 唳唳班Ζ唳班唳多Θ
+zoom_in.title=唳 唳唳 唳唳班Ζ唳班唳多Θ
+zoom_in_label=唳 唳唳 唳唳班Ζ唳班唳多Θ
+zoom.title=唳唳班Ζ唳班唳多Θ唰囙Π 唳唳�
+presentation_mode.title=唳夃Κ唳膏唳ム唳Θ唳� 唳唳� 唳膏唳唳囙 唳曕Π唰佮Θ
+presentation_mode_label=唳夃Κ唳膏唳ム唳Θ唳� 唳唳�
+open_file.title=唳唳囙Σ 唳栢唳侧唳�
+open_file_label=唳栢唳侧唳�
+print.title=唳唳班唳ㄠ唳� 唳曕Π唰佮Θ
+print_label=唳唳班唳ㄠ唳� 唳曕Π唰佮Θ
+download.title=唳∴唳夃Θ唳侧唳� 唳曕Π唰佮Θ
+download_label=唳∴唳夃Θ唳侧唳� 唳曕Π唰佮Θ
+bookmark.title=唳Π唰嵿Δ唳唳� 唳唳班Ζ唳班唳多Θ (唳曕Κ唳� 唳曕Π唰佮Θ 唳呧Ε唳 唳ㄠΔ唰佮Θ 唳夃唳ㄠ唳∴唳む 唳栢唳侧唳�)
+bookmark_label=唳Π唰嵿Δ唳唳� 唳唳班Ζ唳班唳多Θ
+
+# Secondary toolbar and context menu
+tools.title=唳膏Π唳炧唳溹唳�
+tools_label=唳膏Π唳炧唳溹唳�
+first_page.title=唳唳班Ε唳� 唳唳粪唳犩唰� 唳氞Σ唰佮Θ
+first_page.label=唳唳班Ε唳� 唳唳粪唳犩唰� 唳氞Σ唰佮Θ
+first_page_label=唳唳班Ε唳� 唳唳粪唳犩唰� 唳氞Σ唰佮Θ
+last_page.title=唳膏Π唰嵿Μ唳多唳� 唳唳粪唳犩唰� 唳氞Σ唰佮Θ
+last_page.label=唳膏Π唰嵿Μ唳多唳� 唳唳粪唳犩唰� 唳氞Σ唰佮Θ
+last_page_label=唳膏Π唰嵿Μ唳多唳� 唳唳粪唳犩唰� 唳氞Σ唰佮Θ
+page_rotate_cw.title=唳∴唳ㄠΖ唳苦唰� 唳樴唳班唳ㄠ 唳灌Μ唰�
+page_rotate_cw.label=唳∴唳ㄠΖ唳苦唰� 唳樴唳班唳ㄠ 唳灌Μ唰�
+page_rotate_cw_label=唳∴唳ㄠΖ唳苦唰� 唳樴唳班唳ㄠ 唳灌Μ唰�
+page_rotate_ccw.title=唳唳佮Ζ唳苦唰� 唳樴唳班唳ㄠ 唳灌Μ唰�
+page_rotate_ccw.label=唳唳佮Ζ唳苦唰� 唳樴唳班唳ㄠ 唳灌Μ唰�
+page_rotate_ccw_label=唳唳佮Ζ唳苦唰� 唳樴唳班唳ㄠ 唳灌Μ唰�
+
+
+# Document properties dialog box
+document_properties.title=唳ㄠΕ唳苦Π 唳唳多唳粪唳熰唳��
+document_properties_label=唳ㄠΕ唳苦Π 唳唳多唳粪唳熰唳��
+document_properties_file_name=唳唳囙Σ唰囙Π 唳ㄠ唳�:
+document_properties_file_size=唳唳囙Σ唰囙Π 唳唳�:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} 唳唳椸唳唳囙 ({{size_b}} bytes)
+document_properties_title=唳多唳班唳ㄠ唳�:
+document_properties_author=唳侧唳栢:
+document_properties_subject=唳唳粪:
+document_properties_keywords=唳ㄠ唳班唳︵唳多 唳多Μ唰嵿Ζ:
+document_properties_creation_date=唳ㄠ唳班唳唳`唳� 唳む唳班唳�:
+document_properties_modification_date=唳Π唳苦Μ唳班唳むΘ唰囙Π 唳む唳班唳�:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=唳ㄠ唳班唳唳む:
+document_properties_producer=PDF 唳ㄠ唳班唳唳む:
+document_properties_version=PDF 唳膏唳膏唳曕Π唳�:
+document_properties_page_count=唳唳� 唳唳粪唳犩:
+document_properties_close=唳Θ唰嵿Η 唳曕Π唰佮Θ
+
+print_progress_message=唳∴唰佮Ξ唰囙Θ唰嵿 唳唳班唳ㄠ唳熰唳�-唳� 唳溹Θ唰嵿Ο 唳む唳班 唳曕Π唳� 唳灌唰嵿唰�...
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=唳唳む唳�
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=唳膏唳囙Α唳唳� 唳熰唳� 唳曕Π唰佮Θ
+toggle_sidebar_label=唳膏唳囙Α唳唳� 唳熰唳� 唳曕Π唰佮Θ
+document_outline.title=唳∴唰佮Ξ唰囙Θ唰嵿 唳嗋唳熰Σ唳距唳� 唳︵唳栢唳� (唳︵唳唳� 唳曕唳侧唳� 唳曕Π唰佮Θ 唳唰溹唳む//collapse 唳膏Ξ唳膏唳� 唳嗋唳熰唳�)
+document_outline_label=唳∴唰佮Ξ唰囙Θ唰嵿 唳嗋唳熰Σ唳距唳�
+attachments.title=唳膏唳唳曕唳む唳膏Ξ唰傕 唳︵唳栢唳�
+attachments_label=唳膏唳唳曕唳� 唳Ω唰嵿Δ唰�
+thumbs.title=唳ム唳唳�-唳ㄠ唳囙Σ 唳唳班Ζ唳班唳多Θ
+thumbs_label=唳ム唳唳�-唳ㄠ唳囙Σ 唳唳班Ζ唳班唳多Θ
+findbar.title=唳ㄠΕ唳苦Δ唰� 唳栢唳佮唰佮Θ
+findbar_label=唳呧Θ唰佮Ω唳ㄠ唳о唳� 唳曕Π唰佮Θ
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=唳唳粪唳犩 {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=唳唳粪唳犩 {{page}}-唳� 唳ム唳唳�-唳ㄠ唳囙Σ
+
+# Find panel button title and messages
+find_previous.title=唳氞唳灌唳ㄠ唳� 唳唳曕唳む唳� 唳唳班唳Μ唳班唳む 唳夃Κ唳膏唳ム唳む 唳呧Θ唰佮Ω唳ㄠ唳о唳� 唳曕Π唰佮Θ
+find_previous_label=唳唳班唳Μ唳班唳む
+find_next.title=唳氞唳灌唳ㄠ唳� 唳唳曕唳む唳� 唳Π唳Π唰嵿Δ唰� 唳夃Κ唳膏唳ム唳む 唳呧Θ唰佮Ω唳ㄠ唳о唳� 唳曕Π唰佮Θ
+find_next_label=唳Π唳Π唰嵿Δ唰�
+find_highlight=唳膏Ξ唳椸唳� 唳夃唰嵿唰嵿Μ唳� 唳曕Π唰佮Θ
+find_match_case_label=唳灌Π唳唳� 唳涏唳佮Ζ 唳唳侧唳ㄠ 唳灌Μ唰�
+find_reached_top=唳唳粪唳犩唳� 唳唳班唳班Ξ唰嵿Ν唰� 唳唳涏 唳椸唳涏, 唳ㄠ唳氞唳� 唳呧唳� 唳ム唳曕 唳嗋Π唳唳� 唳曕Π唳� 唳灌Μ唰�
+find_reached_bottom=唳唳粪唳犩唳� 唳呧Θ唰嵿Δ唳苦Ξ 唳唳班唳ㄠ唳む 唳唳涏 唳椸唳涏, 唳唳班Ε唳� 唳呧唳� 唳ム唳曕 唳嗋Π唳唳� 唳曕Π唳� 唳灌Μ唰�
+find_not_found=唳唳曕唳む 唳唳撪唳� 唳唰熰Θ唳�
+
+# Error panel labels
+error_more_info=唳呧Δ唳苦Π唳苦唰嵿Δ 唳むΕ唰嵿Ο
+error_less_info=唳曕Ξ 唳むΕ唰嵿Ο
+error_close=唳Θ唰嵿Η 唳曕Π唰佮Θ
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Message: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stack: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=File: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Line: {{line}}
+rendering_error=唳唳粪唳犩 唳唳班Ζ唳班唳多Θ唳曕唳侧 唳忇唳熰 唳膏Ξ唳膏唳 唳︵唳栢 唳︵唰熰唳涏啷�
+
+# Predefined zoom values
+page_scale_width=唳唳粪唳犩唳� 唳唳班Ω唰嵿Ε 唳呧Θ唰佮Ο唳距唰�
+page_scale_fit=唳唳粪唳犩唳� 唳唳� 唳呧Θ唰佮Ο唳距唰�
+page_scale_auto=唳膏唳唳傕唰嵿Π唳苦 唳唳� 唳ㄠ唳班唳о唳班Γ
+page_scale_actual=唳唳班唰冟Δ 唳唳�
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=唳む唳班唳熰
+loading_error=PDF 唳侧唳� 唳曕Π唳距Π 唳膏Ξ唰� 唳膏Ξ唳膏唳 唳︵唳栢 唳︵唰熰唳涏啷�
+invalid_file_error=唳呧Μ唰堗Η 唳 唳曕唳粪Δ唳苦唰嵿Π唳膏唳� 唳唳∴唳忇Λ 唳唳囙Σ啷�
+missing_file_error=唳呧Θ唰佮Κ唳膏唳ム唳� PDF 唳唳囙Σ
+unexpected_response_error=唳膏唳班唳唳� 唳ム唳曕 唳呧Κ唰嵿Π唳む唳唳多唳� 唳膏唰溹 唳唳撪唳� 唳椸唳涏啷�
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Annotation]
+password_label=唳忇 PDF 唳唳囙Σ 唳栢唳侧唳� 唳溹Θ唰嵿Ο 唳唳膏唳唳距Π唰嵿Α 唳︵唳ㄠイ
+password_invalid=唳唳膏唰熰唳班唳� 唳膏唳苦 唳ㄠ啷� 唳呧Θ唰佮唰嵿Π唳� 唳曕Π唰� 唳唳ㄠΠ唳距 唳唳班唰囙Ψ唰嵿唳� 唳曕Π唰佮Θ啷�
+password_ok=OK
+password_cancel=唳唳む唳� 唳曕Π唰佮Θ
+
+printing_not_supported=唳膏Δ唳班唳曕Μ唳距Π唰嵿Δ唳�: 唳忇 唳唳班唳夃唳距Π 唳︵唳唳班 唳唳班唳ㄠ唳� 唳唳Μ唳膏唳ム 唳膏Ξ唰嵿Κ唰傕Π唰嵿Γ唳班唳 唳膏Ξ唳班唳ム唳� 唳ㄠ啷�
+printing_not_ready=唳膏Δ唳班唳曕Μ唳距Γ唰�: 唳唳∴唳忇Λ 唳膏Ξ唰嵿Κ唰傕Π唰嵿Γ唳班唳 唳唳︵唳班Γ唰囙Π 唳溹Θ唰嵿Ο 唳侧唳� 唳曕Π唳� 唳灌Ο唳� 唳ㄠ.
+web_fonts_disabled=唳撪Ο唳监唳� 唳Θ唰嵿 唳ㄠ唳粪唳曕唳班唳 唳曕Π唳� 唳灌Ο唳监唳涏: 唳忇Ξ唳唳∴唳� 唳唳∴唳忇Λ 唳Θ唰嵿 唳唳Μ唳灌唳� 唳曕Π唳む 唳呧唰嵿Ψ唳�.
+document_colors_not_allowed=唳唳∴唳忇Λ 唳ㄠΕ唳� 唳む唳︵唳� 唳ㄠ唳溹Ω唰嵿Μ 唳班 唳唳Μ唳灌唳� 唳曕Π唳距Π 唳溹Θ唰嵿Ο 唳呧Θ唰佮Ξ唳む唳唳班唳唳� 唳ㄠΟ唳�: 唳唳班唳夃唳距Π唰� 唳ㄠ唳粪唳曕唳班唳 唳曕Π唳� 唳灌Ο唳监唳涏 唰熰唳�  '唳唳� 唳む唳︵唳� 唳ㄠ唳溹Ω唰嵿Μ 唳班 唳ㄠ唳班唳唳氞Θ 唳曕Π唳距Π 唳呧Θ唰佮Ξ唳む 唳唳班Ζ唳距Θ 唳曕Π唳� 唰熰唰熰イ'
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/br/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/br/viewer.properties
new file mode 100644
index 0000000..ae721dd
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/br/viewer.properties
@@ -0,0 +1,242 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Pajenn a-raok
+previous_label=A-raok
+next.title=Pajenn war-lerc'h
+next_label=War-lerc'h
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=Pajenn
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=eus {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} war {{pagesCount}})
+
+zoom_out.title=Zoum bihanaat
+zoom_out_label=Zoum bihanaat
+zoom_in.title=Zoum brasaat
+zoom_in_label=Zoum brasaat
+zoom.title=Zoum
+presentation_mode.title=Trec'haoli帽 etrezek ar mod kinnigadenn
+presentation_mode_label=Mod kinnigadenn
+open_file.title=Digeri帽 ur restr
+open_file_label=Digeri帽 ur restr
+print.title=Moulla帽
+print_label=Moulla帽
+download.title=Pellgarga帽
+download_label=Pellgarga帽
+bookmark.title=Gwel bremanel (eila帽 pe zigeri帽 e-barzh ur prenestr nevez)
+bookmark_label=Gwel bremanel
+
+# Secondary toolbar and context menu
+tools.title=Ostilho霉
+tools_label=Ostilho霉
+first_page.title=Mont d'ar bajenn genta帽
+first_page.label=Mont d'ar bajenn genta帽
+first_page_label=Mont d'ar bajenn genta帽
+last_page.title=Mont d'ar bajenn diwezha帽
+last_page.label=Mont d'ar bajenn diwezha帽
+last_page_label=Mont d'ar bajenn diwezha帽
+page_rotate_cw.title=C'hwela帽 gant roud ar bizied
+page_rotate_cw.label=C'hwela帽 gant roud ar bizied
+page_rotate_cw_label=C'hwela帽 gant roud ar bizied
+page_rotate_ccw.title=C'hwela帽 gant roud gin ar bizied
+page_rotate_ccw.label=C'hwela帽 gant roud gin ar bizied
+page_rotate_ccw_label=C'hwela帽 gant roud gin ar bizied
+
+cursor_text_select_tool.title=Gweredekaat an ostilh diuza帽 testenn
+cursor_text_select_tool_label=Ostilh diuza帽 testenn
+cursor_hand_tool.title=Gweredekaat an ostilh dorn
+cursor_hand_tool_label=Ostilh dorn
+
+scroll_vertical.title=Arvera帽 an dibuna帽 a-blom
+scroll_vertical_label=Dibuna帽 a-serzh
+scroll_horizontal.title=Arvera帽 an dibuna帽 a-blaen
+scroll_horizontal_label=Dibuna帽 a-blaen
+scroll_wrapped.title=Arvera帽 an dibuna帽 paket
+scroll_wrapped_label=Dibuna帽 paket
+
+spread_none.title=Chom hep staga帽 ar skignadurio霉
+spread_none_label=Skignadenn ebet
+spread_odd.title=Lakaat ar pajennado霉 en ur gregi帽 gant ar pajenno霉 ampar
+spread_odd_label=Pajenno霉 ampar
+spread_even.title=Lakaat ar pajennado霉 en ur gregi帽 gant ar pajenno霉 par
+spread_even_label=Pajenno霉 par
+
+# Document properties dialog box
+document_properties.title=Perzhio霉 an teul鈥�
+document_properties_label=Perzhio霉 an teul鈥�
+document_properties_file_name=Anv restr :
+document_properties_file_size=Ment ar restr :
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} Ke ({{size_b}} eizhbit)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} Me ({{size_b}} eizhbit)
+document_properties_title=Titl :
+document_properties_author=Aozer :
+document_properties_subject=Danvez :
+document_properties_keywords=Gerio霉-alc'hwez :
+document_properties_creation_date=Deiziad kroui帽 :
+document_properties_modification_date=Deiziad kemma帽 :
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Krouer :
+document_properties_producer=Kenderc'her PDF :
+document_properties_version=Handelv PDF :
+document_properties_page_count=Niver a bajenno霉 :
+document_properties_page_size=Ment ar bajenn:
+document_properties_page_size_unit_inches=in
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=poltred
+document_properties_page_size_orientation_landscape=gweledva
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Lizher
+document_properties_page_size_name_legal=Lezennel
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=Gwel Web Herrek:
+document_properties_linearized_yes=Ya
+document_properties_linearized_no=Ket
+document_properties_close=Serri帽
+
+print_progress_message=O prienti帽 an teul evit moulla帽...
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=Nulla帽
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Diskouez/kuzhat ar varrenn gostez
+toggle_sidebar_notification.title=Trec'haoli帽 ar verrenn-gostez (ur steu帽v pe stagadenno霉 a zo en teul)
+toggle_sidebar_label=Diskouez/kuzhat ar varrenn gostez
+document_outline.title=Diskouez steu帽v an teul (daouglikit evit brasaat/bihanaat an holl elfenno霉)
+document_outline_label=Sinedo霉 an teuliad
+attachments.title=Diskouez ar c'henstagadurio霉
+attachments_label=Kenstagadurio霉
+thumbs.title=Diskouez ar melvenno霉
+thumbs_label=Melvenno霉
+findbar.title=Klask e-barzh an teuliad
+findbar_label=Klask
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Pajenn {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Melvenn ar bajenn {{page}}
+
+# Find panel button title and messages
+find_input.title=Klask
+find_input.placeholder=Klask e-barzh an teuliad
+find_previous.title=Kavout an tamm frazenn kent o klota帽 ganti
+find_previous_label=Kent
+find_next.title=Kavout an tamm frazenn war-lerc'h o klota帽 ganti
+find_next_label=War-lerc'h
+find_highlight=Usskedi帽 pep tra
+find_match_case_label=Teurel evezh ouzh ar pennlizherenno霉
+find_entire_word_label=Gerio霉 a-bezh
+find_reached_top=Tizhet eo bet derou ar bajenn, kenderc'hel diouzh an diaz
+find_reached_bottom=Tizhet eo bet dibenn ar bajenn, kenderc'hel diouzh ar c'hrec'h
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]=Klotadenn {{current}} war {{total}}
+find_match_count[two]=Klotadenn {{current}} war {{total}}
+find_match_count[few]=Klotadenn {{current}} war {{total}}
+find_match_count[many]=Klotadenn {{current}} war {{total}}
+find_match_count[other]=Klotadenn {{current}} war {{total}}
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]=Muioc'h eget {{limit}} a glotadenno霉
+find_match_count_limit[one]=Muioc'h eget {{limit}} a glotadenno霉
+find_match_count_limit[two]=Muioc'h eget {{limit}} a glotadenno霉
+find_match_count_limit[few]=Muioc'h eget {{limit}} a glotadenno霉
+find_match_count_limit[many]=Muioc'h eget {{limit}} a glotadenno霉
+find_match_count_limit[other]=Muioc'h eget {{limit}} a glotadenno霉
+find_not_found=N'haller ket kavout ar frazenn
+
+# Error panel labels
+error_more_info=Muioc'h a ditouro霉
+error_less_info=Nebeutoc'h a ditouro霉
+error_close=Serri帽
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js handelv {{version}} (kempunadur : {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Kemennadenn : {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Torn : {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Restr : {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Linenn : {{line}}
+rendering_error=Degouezhet ez eus bet ur fazi e-pad skramma帽 ar bajennad.
+
+# Predefined zoom values
+page_scale_width=Led ar bajenn
+page_scale_fit=Pajenn a-bezh
+page_scale_auto=Zoum emgefreek
+page_scale_actual=Ment wir
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Fazi
+loading_error=Degouezhet ez eus bet ur fazi e-pad karga帽 ar PDF.
+invalid_file_error=Restr PDF didalvoudek pe kontronet.
+missing_file_error=Restr PDF o vankout.
+unexpected_response_error=Respont dic'hortoz a-berzh an dafariad
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Notenna帽]
+password_label=Enankit ar ger-tremen evit digeri帽 ar restr PDF-ma帽.
+password_invalid=Ger-tremen didalvoudek. Klaskit en-dro mar plij.
+password_ok=Mat eo
+password_cancel=Nulla帽
+
+printing_not_supported=Kemenn : N'eo ket skoret penn-da-benn ar moulla帽 gant ar merdeer-ma帽.
+printing_not_ready=Kemenn : N'hall ket beza帽 moullet ar restr PDF rak n'eo ket karget penn-da-benn.
+web_fonts_disabled=Diweredekaet eo an nodrezho霉 web : n'haller ket arvera帽 an nodrezho霉 PDF enframmet.
+document_colors_not_allowed=N'eo ket aotreet an teuliado霉 PDF da arvera帽 o livio霉 dezho : diweredekaet eo 鈥淎otren ar pajenno霉 da zibab o livio霉 dezho鈥� e-barzh ar merdeer.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/brx/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/brx/viewer.properties
new file mode 100644
index 0000000..2ddc52c
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/brx/viewer.properties
@@ -0,0 +1,167 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=啶嗋啷嬥げ啶ㄠた 啶た啶侧ぞ啶�
+previous_label=啶嗋啷嬥げ啶ㄠた
+next.title=啶夃え啶ㄠた 啶た啶侧ぞ啶�
+next_label=啶夃え啶ㄠた
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+
+zoom_out.title=啶た啶膏ぞ啶 啶溹啶� 啶栢ぞ啶侧ぞ啶�
+zoom_out_label=啶た啶膏ぞ啶 啶溹啶� 啶栢ぞ啶侧ぞ啶�
+zoom_in.title=啶椸啶︵啶班 啶溹啶� 啶栢ぞ啶侧ぞ啶�
+zoom_in_label=啶椸啶︵啶班 啶溹啶� 啶栢ぞ啶侧ぞ啶�
+zoom.title=啶溹啶� 啶栢ぞ啶侧ぞ啶�
+presentation_mode.title=啶︵た啶ㄠ啶ムた啶啶傕え啶距く 啶�'啶∴啶� 啶ムぞ啶�
+presentation_mode_label=啶︵た啶ㄠ啶ムた啶啶傕え啶距く 啶�'啶�
+open_file.title=啶ぞ啶囙げ啶栢 啶栢啶�
+open_file_label=啶栢啶�
+print.title=啶膏ぞ啶ぞ啶�
+print_label=啶膏ぞ啶ぞ啶�
+download.title=啶∴ぞ啶夃え啶�'啶� 啶栢ぞ啶侧ぞ啶�
+download_label=啶∴ぞ啶夃え啶�'啶� 啶栢ぞ啶侧ぞ啶�
+bookmark.title=啶︵ぞ啶ㄠた 啶ㄠ啶ムぞ啶� (啶椸啶︵ぞ啶� 啶夃啶ㄠ啶�'啶嗋さ 啶曕お啶� 啶栢ぞ啶侧ぞ啶� 啶忇が啶� 啶栢啶�)
+bookmark_label=啶︵ぞ啶ㄠた 啶ㄠ啶ムぞ啶�
+
+# Secondary toolbar and context menu
+tools.title=啶熰啶�
+tools_label=啶熰啶�
+first_page.title=啶椸た啶た 啶た啶侧ぞ啶囙啶� 啶ムぞ啶�
+first_page.label=啶椸た啶た 啶た啶侧ぞ啶囙啶� 啶ムぞ啶�
+first_page_label=啶椸た啶た 啶た啶侧ぞ啶囙啶� 啶ムぞ啶�
+last_page.title=啶溹啶ぅ啶� 啶た啶侧ぞ啶囙啶� 啶ムぞ啶�
+last_page.label=啶溹啶ぅ啶� 啶た啶侧ぞ啶囙啶� 啶ムぞ啶�
+last_page_label=啶溹啶ぅ啶� 啶た啶侧ぞ啶囙啶� 啶ムぞ啶�
+page_rotate_cw.title=啶樴ぐ啶� 啶椸た啶︵た啶傕え啶距く 啶ぞ啶班啶膏 啶た啶︵た啶�
+page_rotate_cw.label=啶樴ぐ啶� 啶椸た啶︵た啶傕え啶距く 啶ぞ啶班啶膏 啶た啶︵た啶�
+page_rotate_cw_label=啶樴ぐ啶� 啶椸た啶︵た啶傕え啶距く 啶ぞ啶班啶膏 啶た啶︵た啶�
+page_rotate_ccw.title=啶樴ぐ啶� 啶椸た啶︵た啶傕え啶距く 啶夃げ啷嵿ぅ啶� 啶ぞ啶班啶膏 啶た啶︵た啶�
+page_rotate_ccw.label=啶樴ぐ啶� 啶椸た啶︵た啶傕え啶距く 啶夃げ啷嵿ぅ啶� 啶ぞ啶班啶膏 啶た啶︵た啶�
+page_rotate_ccw_label=啶樴ぐ啶� 啶椸た啶︵た啶傕え啶距く 啶夃げ啷嵿ぅ啶� 啶ぞ啶班啶膏 啶た啶︵た啶�
+
+
+# Document properties dialog box
+document_properties.title=啶啶班ぎ啶距え 啶た啶侧ぞ啶囙え啶� 啶嗋啷佮ぅ啶距く...
+document_properties_label=啶啶班ぎ啶距え 啶た啶侧ぞ啶囙え啶� 啶嗋啷佮ぅ啶距く...
+document_properties_file_name=啶ぞ啶囙げ啶ㄠた 啶啶�:
+document_properties_file_size=啶ぞ啶囙げ啶ㄠた 啶す啶�:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} 啶ぞ啶囙)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} 啶ぞ啶囙)
+document_properties_title=啶た啶啶�:
+document_properties_author=啶侧た啶班啶苦ぐ啶�:
+document_properties_subject=啶嗋く啶︵ぞ:
+document_properties_keywords=啶椸ぞ啶灌ぞ啶� 啶膏啶︵啶�:
+document_properties_creation_date=啶膏啶班啶苦え啶距く 啶呧啷嵿':
+document_properties_modification_date=啶膏啶︵啶班ぞ啶え啶距く 啶呧啷嵿':
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=啶膏啶班啶苦啷嵿ぐ啶�:
+document_properties_producer=PDF 啶︵た啶灌啶ㄠ啷嵿ぐ啶�:
+document_properties_version=PDF 啶た啶膏ぞ啶�:
+document_properties_page_count=啶た啶侧ぞ啶囙え啶� 啶灌た啶膏ぞ啶�:
+document_properties_close=啶え啷嵿う 啶栢ぞ啶侧ぞ啶�
+
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=啶熰啷嵿啶� 啶膏ぞ啶囙ぁ啶ぞ啶�
+toggle_sidebar_label=啶熰啷嵿啶� 啶膏ぞ啶囙ぁ啶ぞ啶�
+document_outline_label=啶啶班ぎ啶距え 啶た啶侧ぞ啶� 啶膏た啶ぞ 啶灌ぞ啶傕啷�
+attachments.title=啶ㄠぞ啶傕啶距が 啶灌啶ㄠぞ啶啷� 啶︵た啶ㄠ啶ムた
+attachments_label=啶ㄠぞ啶傕啶距が 啶灌啶ㄠぞ啶�
+thumbs.title=啶ムぞ啶え啷囙啶侧啷� 啶︵た啶ㄠ啶ムた
+thumbs_label=啶ムぞ啶え啷囙啶�
+findbar.title=啶啶班ぎ啶距え 啶た啶侧ぞ啶囙啶� 啶ㄠぞ啶椸た啶班え啶� 啶︵た啶灌啶�
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=啶た啶侧ぞ啶� {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=啶た啶侧ぞ啶� {{page}} 啶ㄠた 啶ムぞ啶え啷囙啶�
+
+# Find panel button title and messages
+find_previous.title=啶ぞ啶ム啶班ぞ 啶栢啶ㄠ啶︵啶え啶� 啶膏た啶椸ぞ啶傕え啶� 啶ㄠ啶溹ぞ啶ムた啶ㄠぞ啶啷� 啶ㄠぞ啶椸た啶�
+find_previous_label=啶嗋啷嬥げ啶ㄠた
+find_next.title=啶ぞ啶ム啶班ぞ 啶栢啶ㄠ啶︵啶え啶� 啶夃え啶ㄠた 啶ㄠ啶溹ぞ啶ムた啶ㄠぞ啶啷� 啶ㄠぞ啶椸た啶�
+find_next_label=啶夃え啶ㄠた
+find_highlight=啶椸ぞ啶膏啶栢啶 啶灌ぞ啶囙げ啶距啶� 啶栢ぞ啶侧ぞ啶�
+find_match_case_label=啶椸啶班啶え啶距く 啶曕啶�
+find_reached_top=啶ムぞ啶侧 啶ㄠた啶啶班ぞ啶� 啶溹ぞ啶椸ぞ啶え啶距え啷� 啶啶班ぎ啶距え 啶た啶侧ぞ啶囙え啶� 啶た啶溹啶嗋さ 啶膏啶灌啶ぞ啶�
+find_reached_bottom=啶た啶溹 啶ㄠた啶啶班ぞ啶� 啶溹ぞ啶椸ぞ啶え啶距え啷� 啶啶班ぎ啶距え 啶た啶侧ぞ啶囙え啶� 啶た啶溹啶嗋さ 啶膏啶灌啶ぞ啶�
+find_not_found=啶ぞ啶ム啶班ぞ 啶栢啶ㄠ啶︵啶� 啶啶ㄠぞ啶栢
+
+# Error panel labels
+error_more_info=啶椸啶ぞ啶� 啶啶班ぎ啶距く啶ムた啶灌啶椸啶班ぞ
+error_less_info=啶栢ぎ 啶啶班ぎ啶距く啶ムた啶灌啶椸啶班ぞ
+error_close=啶え啷嵿う 啶栢ぞ啶侧ぞ啶�
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=啶栢啶班ぞ啶�: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=啶膏啶熰啶�: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=啶ぞ啶囙げ: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=啶膏ぞ啶班た: {{line}}
+rendering_error=啶た啶侧ぞ啶囙啷� 啶班ぞ啶� 啶膏啶侧ぞ啶え啶距く 啶膏ぎ啶距さ 啶啶ㄠじ啷� 啶椸啶班啶ㄠ啶ムた 啶溹ぞ啶︵啶傕イ
+
+# Predefined zoom values
+page_scale_width=啶た啶侧ぞ啶囙え啶� 啶椸啶掂ぞ啶�
+page_scale_fit=啶た啶侧ぞ啶� 啶椸啶班啶え啶距く
+page_scale_auto=啶椸ぞ啶掂え啷嬥啶距さ 啶溹啶�
+page_scale_actual=啶ムぞ啶� 啶す啶�
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+
+# Loading indicator messages
+loading_error_indicator=啶椸啶班啶ㄠ啶ムた
+loading_error=PDF 啶�'啶� 啶栢ぞ啶侧ぞ啶え啶距く 啶膏ぎ啶距さ 啶啶ㄠじ啷� 啶椸啶班啶ㄠ啶ムた 啶溹ぞ啶ぞ啶イ
+invalid_file_error=啶ぞ啶灌ぞ啶啶距く啷� 啶忇が啶� 啶椸ぞ啶溹啶班た 啶溹ぞ啶ㄠぞ啶� PDF 啶ぞ啶囙げ
+missing_file_error=啶椸啶ぞ啶ㄠぞ啶� PDF 啶ぞ啶囙げ
+unexpected_response_error=啶た啶溹た啶傕ぅ啶苦く啷� 啶膏ぞ啶班啶ぞ啶� 啶た啶ㄠえ啶距く啷�
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} 啶膏啶︵啶� 啶啶栢啶掂え啶距く]
+password_label=啶 PDF 啶ぞ啶囙げ啶栢 啶栢啶掂え啷� 啶ぞ啶膏さ啶距ぐ啷嵿ぁ 啶灌ぞ啶す啷嬥イ
+password_invalid=啶ぞ啶灌ぞ啶啶距く啷� 啶ぞ啶膏さ啶距ぐ啷嵿ぁ啷� 啶呧え啶ㄠぞ啶ㄠ 啶た啶� 啶ㄠぞ啶溹ぞ啷�
+password_ok=OK
+
+printing_not_supported=啶膏ぞ啶傕啷嵿ぐ啶距啶ムた: 啶膏ぞ啶ぞ啶え啶距く啶� 啶 啶啶班ぞ啶夃啶距ぐ啶溹啶� 啶嗋が啷佮啷� 啶灌啶ぞ啶溹ぞ啶� 啶灌啶溹ぞ啶ぞ啷�
+printing_not_ready=啶膏ぞ啶傕啷嵿ぐ啶距啶ムた: PDF 啶栢 啶膏ぞ啶ぞ啶え啶距く啶ㄠた 啶ムぞ啶栢ぞ啶� 啶啶班ぞ啶 啶�'啶� 啶栢ぞ啶侧ぞ啶ぞ啶栢啷�
+web_fonts_disabled=啶掂啶� 啶え啷嵿啶栢 啶侧啶班が啶距 啶栢ぞ啶侧ぞ啶が啶距く: 啶呧ぐ啶溹ぞ啶す啷嬥え啶距く PDF 啶え啷嵿啶栢 啶ぞ啶灌ぞ啶え啷� 啶灌ぞ啶ぞ啶栢啷�
+document_colors_not_allowed=PDF 啶啶班ぎ啶距え 啶た啶侧ぞ啶囙啷� 啶た啶膏啶班え啶� 啶ㄠた啶溹た 啶椸ぞ啶� 啶ぞ啶灌ぞ啶え啷� 啶椸え啶距く啶ムた 啶灌啶ㄠぞ啶� 啶溹ぞ啶ぞ: '啶た啶膏啶班え啶� 啶ㄠた啶溹た 啶椸ぞ啶� 啶ぞ啶膏た啶栢え啷� 啶た啶侧ぞ啶囙啷� 啶椸え啶距く啶ムた 啶灌'-啶栢 啶啶班ぞ啶夃啶距ぐ啶嗋さ 啶侧啶班が啶距 啶栢ぞ啶侧ぞ啶え啶距く 啶溹ぞ啶啷�
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/bs/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/bs/viewer.properties
new file mode 100644
index 0000000..6c2122b
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/bs/viewer.properties
@@ -0,0 +1,201 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Prethodna strana
+previous_label=Prethodna
+next.title=Sljede膰a strna
+next_label=Sljede膰a
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=Strana
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=od {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} od {{pagesCount}})
+
+zoom_out.title=Umanji
+zoom_out_label=Umanji
+zoom_in.title=Uve膰aj
+zoom_in_label=Uve膰aj
+zoom.title=Uve膰anje
+presentation_mode.title=Prebaci se u prezentacijski re啪im
+presentation_mode_label=Prezentacijski re啪im
+open_file.title=Otvori fajl
+open_file_label=Otvori
+print.title=艩tampaj
+print_label=艩tampaj
+download.title=Preuzmi
+download_label=Preuzmi
+bookmark.title=Trenutni prikaz (kopiraj ili otvori u novom prozoru)
+bookmark_label=Trenutni prikaz
+
+# Secondary toolbar and context menu
+tools.title=Alati
+tools_label=Alati
+first_page.title=Idi na prvu stranu
+first_page.label=Idi na prvu stranu
+first_page_label=Idi na prvu stranu
+last_page.title=Idi na zadnju stranu
+last_page.label=Idi na zadnju stranu
+last_page_label=Idi na zadnju stranu
+page_rotate_cw.title=Rotiraj u smjeru kazaljke na satu
+page_rotate_cw.label=Rotiraj u smjeru kazaljke na satu
+page_rotate_cw_label=Rotiraj u smjeru kazaljke na satu
+page_rotate_ccw.title=Rotiraj suprotno smjeru kazaljke na satu
+page_rotate_ccw.label=Rotiraj suprotno smjeru kazaljke na satu
+page_rotate_ccw_label=Rotiraj suprotno smjeru kazaljke na satu
+
+cursor_text_select_tool.title=Omogu膰i alat za ozna膷avanje teksta
+cursor_text_select_tool_label=Alat za ozna膷avanje teksta
+cursor_hand_tool.title=Omogu膰i ru膷ni alat
+cursor_hand_tool_label=Ru膷ni alat
+
+# Document properties dialog box
+document_properties.title=Svojstva dokumenta...
+document_properties_label=Svojstva dokumenta...
+document_properties_file_name=Naziv fajla:
+document_properties_file_size=Veli膷ina fajla:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} bajta)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} bajta)
+document_properties_title=Naslov:
+document_properties_author=Autor:
+document_properties_subject=Predmet:
+document_properties_keywords=Klju膷ne rije膷i:
+document_properties_creation_date=Datum kreiranja:
+document_properties_modification_date=Datum promjene:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Kreator:
+document_properties_producer=PDF stvaratelj:
+document_properties_version=PDF verzija:
+document_properties_page_count=Broj stranica:
+document_properties_page_size=Veli膷ina stranice:
+document_properties_page_size_unit_inches=u
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=uspravno
+document_properties_page_size_orientation_landscape=vodoravno
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Pismo
+document_properties_page_size_name_legal=Pravni
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+document_properties_close=Zatvori
+
+print_progress_message=Pripremam dokument za 拧tampu鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=Otka啪i
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Uklju膷i/isklju膷i bo膷nu traku
+toggle_sidebar_notification.title=Uklju膷i/isklju膷i sidebar (dokument sadr啪i outline/priloge)
+toggle_sidebar_label=Uklju膷i/isklju膷i bo膷nu traku
+document_outline.title=Prika啪i outline dokumenta (dvoklik za skupljanje/拧irenje svih stavki)
+document_outline_label=Konture dokumenta
+attachments.title=Prika啪i priloge
+attachments_label=Prilozi
+thumbs.title=Prika啪i thumbnailove
+thumbs_label=Thumbnailovi
+findbar.title=Prona膽i u dokumentu
+findbar_label=Prona膽i
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Strana {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Thumbnail strane {{page}}
+
+# Find panel button title and messages
+find_input.title=Prona膽i
+find_input.placeholder=Prona膽i u dokumentu鈥�
+find_previous.title=Prona膽i prethodno pojavljivanje fraze
+find_previous_label=Prethodno
+find_next.title=Prona膽i sljede膰e pojavljivanje fraze
+find_next_label=Sljede膰e
+find_highlight=Ozna膷i sve
+find_match_case_label=Osjetljivost na karaktere
+find_reached_top=Dostigao sam vrh dokumenta, nastavljam sa dna
+find_reached_bottom=Dostigao sam kraj dokumenta, nastavljam sa vrha
+find_not_found=Fraza nije prona膽ena
+
+# Error panel labels
+error_more_info=Vi拧e informacija
+error_less_info=Manje informacija
+error_close=Zatvori
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Poruka: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stack: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Fajl: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Linija: {{line}}
+rendering_error=Do拧lo je do gre拧ke prilikom renderiranja strane.
+
+# Predefined zoom values
+page_scale_width=艩irina strane
+page_scale_fit=Uklopi stranu
+page_scale_auto=Automatsko uve膰anje
+page_scale_actual=Stvarna veli膷ina
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Gre拧ka
+loading_error=Do拧lo je do gre拧ke prilikom u膷itavanja PDF-a.
+invalid_file_error=Neispravan ili o拧te膰en PDF fajl.
+missing_file_error=Nedostaje PDF fajl.
+unexpected_response_error=Neo膷ekivani odgovor servera.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} pribilje拧ka]
+password_label=Upi拧ite lozinku da biste otvorili ovaj PDF fajl.
+password_invalid=Pogre拧na lozinka. Poku拧ajte ponovo.
+password_ok=OK
+password_cancel=Otka啪i
+
+printing_not_supported=Upozorenje: 艩tampanje nije u potpunosti podr啪ano u ovom browseru.
+printing_not_ready=Upozorenje: PDF nije u potpunosti u膷itan za 拧tampanje.
+web_fonts_disabled=Web fontovi su onemogu膰eni: nemogu膰e koristiti uba膷ene PDF fontove.
+document_colors_not_allowed=PDF dokumentima nije dozvoljeno da koriste vlastite boje: 'Dozvoli stranicama da izaberu vlastite boje' je deaktivirano u browseru.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ca/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ca/viewer.properties
new file mode 100644
index 0000000..5823256
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ca/viewer.properties
@@ -0,0 +1,207 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=P脿gina anterior
+previous_label=Anterior
+next.title=P脿gina seg眉ent
+next_label=Seg眉ent
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=P脿gina
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=de {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} de {{pagesCount}})
+
+zoom_out.title=Allunya
+zoom_out_label=Allunya
+zoom_in.title=Apropa
+zoom_in_label=Apropa
+zoom.title=Escala
+presentation_mode.title=Canvia al mode de presentaci贸
+presentation_mode_label=Mode de presentaci贸
+open_file.title=Obre el fitxer
+open_file_label=Obre
+print.title=Imprimeix
+print_label=Imprimeix
+download.title=Baixa
+download_label=Baixa
+bookmark.title=Vista actual (copia o obre en una finestra nova)
+bookmark_label=Vista actual
+
+# Secondary toolbar and context menu
+tools.title=Eines
+tools_label=Eines
+first_page.title=V茅s a la primera p脿gina
+first_page.label=V茅s a la primera p脿gina
+first_page_label=V茅s a la primera p脿gina
+last_page.title=V茅s a l'煤ltima p脿gina
+last_page.label=V茅s a l'煤ltima p脿gina
+last_page_label=V茅s a l'煤ltima p脿gina
+page_rotate_cw.title=Gira cap a la dreta
+page_rotate_cw.label=Gira cap a la dreta
+page_rotate_cw_label=Gira cap a la dreta
+page_rotate_ccw.title=Gira cap a l'esquerra
+page_rotate_ccw.label=Gira cap a l'esquerra
+page_rotate_ccw_label=Gira cap a l'esquerra
+
+cursor_text_select_tool.title=Habilita l'eina de selecci贸 de text
+cursor_text_select_tool_label=Eina de selecci贸 de text
+cursor_hand_tool.title=Habilita l'eina de m脿
+cursor_hand_tool_label=Eina de m脿
+
+scroll_vertical.title=Utilitza el despla莽ament vertical
+scroll_vertical_label=Despla莽ament vertical
+scroll_horizontal.title=Utilitza el despla莽ament horitzontal
+scroll_horizontal_label=Despla莽ament horitzontal
+
+
+# Document properties dialog box
+document_properties.title=Propietats del document鈥�
+document_properties_label=Propietats del document鈥�
+document_properties_file_name=Nom del fitxer:
+document_properties_file_size=Mida del fitxer:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=T铆tol:
+document_properties_author=Autor:
+document_properties_subject=Assumpte:
+document_properties_keywords=Paraules clau:
+document_properties_creation_date=Data de creaci贸:
+document_properties_modification_date=Data de modificaci贸:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Creador:
+document_properties_producer=Generador de PDF:
+document_properties_version=Versi贸 de PDF:
+document_properties_page_count=Nombre de p脿gines:
+document_properties_page_size=Mida de la p脿gina:
+document_properties_page_size_unit_inches=polzades
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=vertical
+document_properties_page_size_orientation_landscape=apa茂sat
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Carta
+document_properties_page_size_name_legal=Legal
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+document_properties_close=Tanca
+
+print_progress_message=S'est脿 preparant la impressi贸 del document鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=Cancel路la
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Mostra/amaga la barra lateral
+toggle_sidebar_notification.title=Mostra/amaga la barra lateral (el document cont茅 un esquema o adjuncions)
+toggle_sidebar_label=Mostra/amaga la barra lateral
+document_outline.title=Mostra l'esquema del document (doble clic per ampliar/reduir tots els elements)
+document_outline_label=Contorn del document
+attachments.title=Mostra les adjuncions
+attachments_label=Adjuncions
+thumbs.title=Mostra les miniatures
+thumbs_label=Miniatures
+findbar.title=Cerca al document
+findbar_label=Cerca
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=P脿gina {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Miniatura de la p脿gina {{page}}
+
+# Find panel button title and messages
+find_input.title=Cerca
+find_input.placeholder=Cerca al document鈥�
+find_previous.title=Cerca l'anterior coincid猫ncia de l'expressi贸
+find_previous_label=Anterior
+find_next.title=Cerca la seg眉ent coincid猫ncia de l'expressi贸
+find_next_label=Seg眉ent
+find_highlight=Ressalta-ho tot
+find_match_case_label=Distingeix entre maj煤scules i min煤scules
+find_reached_top=S'ha arribat al principi del document, es continua pel final
+find_reached_bottom=S'ha arribat al final del document, es continua pel principi
+find_not_found=No s'ha trobat l'expressi贸
+
+# Error panel labels
+error_more_info=M茅s informaci贸
+error_less_info=Menys informaci贸
+error_close=Tanca
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (muntatge: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Missatge: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Pila: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Fitxer: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=L铆nia: {{line}}
+rendering_error=S'ha produ茂t un error mentre es renderitzava la p脿gina.
+
+# Predefined zoom values
+page_scale_width=Ampl脿ria de la p脿gina
+page_scale_fit=Ajusta la p脿gina
+page_scale_auto=Zoom autom脿tic
+page_scale_actual=Mida real
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Error
+loading_error=S'ha produ茂t un error en carregar el PDF.
+invalid_file_error=El fitxer PDF no 茅s v脿lid o est脿 malm猫s.
+missing_file_error=Falta el fitxer PDF.
+unexpected_response_error=Resposta inesperada del servidor.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[Anotaci贸 {{type}}]
+password_label=Introdu茂u la contrasenya per obrir aquest fitxer PDF.
+password_invalid=La contrasenya no 茅s v脿lida. Torneu-ho a provar.
+password_ok=D'acord
+password_cancel=Cancel路la
+
+printing_not_supported=Av铆s: la impressi贸 no 茅s plenament funcional en aquest navegador.
+printing_not_ready=Atenci贸: el PDF no s'ha acabat de carregar per imprimir-lo.
+web_fonts_disabled=Els tipus de lletra web estan desactivats: no es poden utilitzar els tipus de lletra incrustats al PDF.
+document_colors_not_allowed=Els documents PDF no poden usar els seus colors propis: 芦Permet a les p脿gines triar els colors propis禄 es troba desactivat al navegador.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/cak/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/cak/viewer.properties
new file mode 100644
index 0000000..780ccf5
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/cak/viewer.properties
@@ -0,0 +1,242 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Jun kan ruxaq
+previous_label=Chuw盲ch
+next.title=Jun chik ruxaq
+next_label=Jun chik
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=Ruxaq
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=richin {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} richin {{pagesCount}})
+
+zoom_out.title=Tich'utiniris盲x
+zoom_out_label=Tich'utiniris盲x
+zoom_in.title=Tinimiris盲x
+zoom_in_label=Tinimiris盲x
+zoom.title=Sum
+presentation_mode.title=Tijal ri rub'anikil niwachin
+presentation_mode_label=Pa rub'eyal niwachin
+open_file.title=Tijaq yakb'盲l
+open_file_label=Tijaq
+print.title=Titz'ajb'盲x
+print_label=Titz'ajb'盲x
+download.title=Tiqas盲x
+download_label=Tiqas盲x
+bookmark.title=Rutz'etik wakami (tiwachib'毛x o tijaq pa jun k'ak'a' tzuw盲ch)
+bookmark_label=Rutzub'al wakami
+
+# Secondary toolbar and context menu
+tools.title=Samajib'盲l
+tools_label=Samajib'盲l
+first_page.title=Tib'e pa nab'ey ruxaq
+first_page.label=Tib'e pa nab'ey ruxaq
+first_page_label=Tib'e pa nab'ey ruxaq
+last_page.title=Tib'e pa ruk'isib'盲l ruxaq
+last_page.label=Tib'e pa ruk'isib'盲l ruxaq
+last_page_label=Tib'e pa ruk'isib'盲l ruxaq
+page_rotate_cw.title=Tisut茂x pan ajkiq'a'
+page_rotate_cw.label=Tisut茂x pan ajkiq'a'
+page_rotate_cw_label=Tisut茂x pan ajkiq'a'
+page_rotate_ccw.title=Tisut茂x pan ajxokon
+page_rotate_ccw.label=Tisut茂x pan ajxokon
+page_rotate_ccw_label=Tisut茂x pan ajxokon
+
+cursor_text_select_tool.title=Titzij ri rusamajib'al Rucha'ik Rucholajem Tzij
+cursor_text_select_tool_label=Rusamajib'al Rucha'ik Rucholajem Tzij
+cursor_hand_tool.title=Titzij ri q'ab'aj samajib'盲l
+cursor_hand_tool_label=Q'ab'aj Samajib'盲l
+
+scroll_vertical.title=Tokis盲x Pa'盲l Q'axanem
+scroll_vertical_label=Pa'盲l Q'axanem
+scroll_horizontal.title=Tokis盲x Kotz'枚l Q'axanem
+scroll_horizontal_label=Kotz'枚l Q'axanem
+scroll_wrapped.title=Tokis盲x Tzub'aj Q'axanem
+scroll_wrapped_label=Tzub'aj Q'axanem
+
+spread_none.title=Man ketun taq ruxaq pa rub'eyal wuj
+spread_none_label=Majun Rub'eyal
+spread_odd.title=Ke'atunu' ri taq ruxaq rik'in natikirisaj rik'in jun man k'ulaj ta rajilab'al
+spread_odd_label=Man K'ulaj Ta Rub'eyal
+spread_even.title=Ke'atunu' ri taq ruxaq rik'in natikirisaj rik'in jun k'ulaj rajilab'al
+spread_even_label=K'ulaj Rub'eyal
+
+# Document properties dialog box
+document_properties.title=Taq richinil wuj鈥�
+document_properties_label=Taq richinil wuj鈥�
+document_properties_file_name=Rub'i' yakb'盲l:
+document_properties_file_size=Runimilem yakb'盲l:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=B'i'aj:
+document_properties_author=B'anel:
+document_properties_subject=Taqikil:
+document_properties_keywords=Kixe'el taq tzij:
+document_properties_creation_date=Ruq'ijul xtz'uk:
+document_properties_modification_date=Ruq'ijul xjalwach茂x:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Q'inonel:
+document_properties_producer=PDF b'an枚y:
+document_properties_version=PDF ruw盲ch:
+document_properties_page_count=Jarupe' ruxaq:
+document_properties_page_size=Runimilem ri Ruxaq:
+document_properties_page_size_unit_inches=pa
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=rupalem
+document_properties_page_size_orientation_landscape=rukotz'olem
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Loman wuj
+document_properties_page_size_name_legal=N茂m wuj
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=Anin Rutz'etik Ajk'amaya'l:
+document_properties_linearized_yes=Ja'
+document_properties_linearized_no=Mani
+document_properties_close=Titz'ap茂x
+
+print_progress_message=Ruchojmirisaxik wuj richin nitz'ajb'盲x鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=Tiq'at
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Tijal ri ajxikin kajtz'ik
+toggle_sidebar_notification.title=Tik'ex ri ajxikin yuqkajtz'ik (ri wuj eruk'wan taq ruchi'/taqoj taq yakb'盲l)
+toggle_sidebar_label=Tijal ri ajxikin kajtz'ik
+document_outline.title=Tik'ut pe ruch'akulal wuj (kamul-pitz'oj richin nirik'/nich'utiniris盲x ronojel ruch'akulal)
+document_outline_label=Ruch'akulal wuj
+attachments.title=Kek'ut pe taq taqoj
+attachments_label=Taq taqoj
+thumbs.title=Kek'ut pe taq ch'utiq
+thumbs_label=Kok枚j
+findbar.title=Tikan枚x chupam ri wuj
+findbar_label=Tikan枚x
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Ruxaq {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Ruch'utinirisaxik ruxaq {{page}}
+
+# Find panel button title and messages
+find_input.title=Tikan枚x
+find_input.placeholder=Tikan枚x pa wuj鈥�
+find_previous.title=Tib'an b'enam pa ri jun kan q'aptzij xilit盲j
+find_previous_label=Jun kan
+find_next.title=Tib'e pa ri jun chik pajtzij xilit盲j
+find_next_label=Jun chik
+find_highlight=Tiya' retal ronojel
+find_match_case_label=Tuk'盲m ri' kik'in taq nimatz'ib' chuqa' taq ch'utitz'ib'
+find_entire_word_label=Tz'aq盲t taq tzij
+find_reached_top=Xb'eq'i' ri rutikirib'al wuj, xtikan枚x k'a pa ruk'isib'盲l
+find_reached_bottom=Xb'eq'i' ri ruk'isib'盲l wuj, xtikan枚x pa rutikirib'al
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]={{current}} richin {{total}} nuk'盲m ri'
+find_match_count[two]={{current}} richin {{total}} nikik'盲m ki'
+find_match_count[few]={{current}} richin {{total}} nikik'盲m ki'
+find_match_count[many]={{current}} richin {{total}} nikik'盲m ki'
+find_match_count[other]={{current}} richin {{total}} nikik'盲m ki'
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]=K'茂y chi re {{limit}} nikik'盲m ki'
+find_match_count_limit[one]=K'茂y chi re {{limit}} nuk'盲m ri'
+find_match_count_limit[two]=K'茂y chi re {{limit}} nikik'盲m ki'
+find_match_count_limit[few]=K'茂y chi re {{limit}} nikik'盲m ki'
+find_match_count_limit[many]=K'茂y chi re {{limit}} nikik'盲m ki'
+find_match_count_limit[other]=K'茂y chi re {{limit}} nikik'盲m ki'
+find_not_found=Man xilit盲j ta ri pajtzij
+
+# Error panel labels
+error_more_info=Ch'aqa' chik rutzijol
+error_less_info=Jub'a' ok rutzijol
+error_close=Titz'ap茂x
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Uqxa'n: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Tzub'aj: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Yakb'盲l: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=B'ey: {{line}}
+rendering_error=Xk'ulwachit盲j jun sachoj toq ninuk'wachij ri ruxaq.
+
+# Predefined zoom values
+page_scale_width=Ruwa ruxaq
+page_scale_fit=Tinuk' ruxaq
+page_scale_auto=Yonil chi nimilem
+page_scale_actual=Runimilem
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Sachoj
+loading_error=\u0020Xk'ulwachit盲j jun sach'oj toq xnuk'ux ri PDF .
+invalid_file_error=Man oke ta o yujtajin盲q ri PDF yakb'盲l.
+missing_file_error=Man xilit盲j ta ri PDF yakb'盲l.
+unexpected_response_error=Man oyob'en ta tz'olin rutzij ruk'u'x samaj.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Tz'ib'an茂k]
+password_label=Tatz'ib'aj ri ewan tzij richin naj盲q re yakb'盲l re' pa PDF.
+password_invalid=Man okel ta ri ewan tzij: Tatojtob'ej chik.
+password_ok=脺tz
+password_cancel=Tiq'at
+
+printing_not_supported=Rutzijol k'ayewal: Ri rutz'ajb'axik man koch'el ta ronojel pa re okik'amaya'l re'.
+printing_not_ready=Rutzijol k'ayewal: Ri PDF man xusamajij ta ronojel richin nitz'ajb'盲x.
+web_fonts_disabled=E chup眉l ri taq ajk'amaya'l tz'ib': man tikirel ta nokis盲x ri taq tz'ib' PDF pa ch'iken茂k
+document_colors_not_allowed=Ri taq wuj pa PDF man ya'on ta q'ij chi ke richin nikokisaj ri taq kib'onil: 鈥淭iya' q'ij chi ke ri taq ruxaq chi kekicha' ri taq kib'onil鈥� chupun pa ri awokik'amaya'l.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/crh/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/crh/viewer.properties
new file mode 100644
index 0000000..dcdaafe
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/crh/viewer.properties
@@ -0,0 +1,217 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Evvelki Saife
+previous_label=Evvelki
+next.title=So帽raki Saife
+next_label=So帽raki
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=Saife
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=/ {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} / {{pagesCount}})
+
+zoom_out.title=Uzaqla葯t谋r
+zoom_out_label=Uzaqla葯t谋r
+zoom_in.title=Yaq谋nla艧t谋r
+zoom_in_label=Yaq谋nla艧t谋r
+zoom.title=Miqyasla
+presentation_mode.title=Taqdim Tarz谋na Alma艧
+presentation_mode_label=Taqdim Tarz谋
+open_file.title=Dosye A莽
+open_file_label=A莽
+print.title=Bast谋r
+print_label=Bast谋r
+download.title=Endir
+download_label=Endir
+bookmark.title=Cari k枚r眉nim (kopiyala yaki ya帽谋 pencerede a莽)
+bookmark_label=Cari k枚r眉nim
+
+# Secondary toolbar and context menu
+tools.title=Aletler
+tools_label=Aletler
+first_page.title=陌lk Saifege Bar
+first_page.label=陌lk Saifege Bar
+first_page_label=陌lk Saifege Bar
+last_page.title=So帽 Saifege Bar
+last_page.label=So帽 Saifege Bar
+last_page_label=So帽 Saifege Bar
+page_rotate_cw.title=Saat Y枚n眉nde Devrettir
+page_rotate_cw.label=Saat Y枚n眉nde Ayland谋r
+page_rotate_cw_label=Saat Y枚n眉nde Ayland谋r
+page_rotate_ccw.title=Saat Y枚n眉ni帽 Tersine Devrettir
+page_rotate_ccw.label=Saat Y枚n眉ni帽 Tersine Ayland谋r
+page_rotate_ccw_label=Saat Y枚n眉ni帽 Tersine Ayland谋r
+
+cursor_text_select_tool.title=Metin Saylam谋 Aletini Qabille艧tir
+cursor_text_select_tool_label=Metin Saylam谋 Aleti
+cursor_hand_tool.title=El Aletini Qabille艧tir
+cursor_hand_tool_label=El Aleti
+
+scroll_vertical.title=艦aquliy Tayd谋rman谋 Qullan
+scroll_vertical_label=艦aquliy Tayd谋rma
+scroll_horizontal.title=Ufqiy Tayd谋rman谋 Qullan
+scroll_horizontal_label=Ufqiy Tayd谋rma
+scroll_wrapped.title=T眉r眉lgen Tayd谋rman谋 Qullan
+scroll_wrapped_label=T眉r眉lgen Tayd谋rma
+
+spread_none.title=Saife yaymalar谋n谋 qo艧ma
+spread_none_label=Yaymas谋z
+spread_odd.title=Saife yaymalar谋n谋 tek-say谋l谋 saifeler ile ba艧layaraq qo艧
+spread_odd_label=Tek Yaymalar
+spread_even.title=Saife yaymalar谋n谋 莽ift-say谋l谋 saifeler ile ba艧layaraq qo艧
+spread_even_label=脟ift Yaymalar
+
+# Document properties dialog box
+document_properties.title=Vesiqa Hasiyetleri鈥�
+document_properties_label=Vesiqa Hasiyetleri鈥�
+document_properties_file_name=Dosye ad谋:
+document_properties_file_size=Dosye 枚l莽眉si:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} bayt)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} bayt)
+document_properties_title=Serleva:
+document_properties_author=M眉ellif:
+document_properties_subject=Mevzu:
+document_properties_keywords=Anahtar-s枚zler:
+document_properties_creation_date=陌cat Tarih谋:
+document_properties_modification_date=Ba艧qala艧t谋rma Tarihi:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=M眉cit:
+document_properties_producer=PDF 陌stisalc谋s谋:
+document_properties_version=PDF S眉r眉mi:
+document_properties_page_count=Saife Adedi:
+document_properties_page_size=Saife 脰l莽眉si:
+document_properties_page_size_unit_inches=d眉ym
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=portret
+document_properties_page_size_orientation_landscape=manzara
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Mekt眉p
+document_properties_page_size_name_legal=Uquqiy
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_close=Qapat
+
+print_progress_message=Vesiqa bast谋r谋lma臒a az谋rlan谋la鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent=%{{progress}}
+print_progress_close=Vazge莽
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Yan-莽ubuqn谋 T枚nter
+toggle_sidebar_notification.title=Yan莽ubuqn谋 T枚nter (vesiqa t谋艧-hizan谋/ili艧iklerni ihtiva ete)
+toggle_sidebar_label=Yan-莽ubuqn谋 T枚nter
+document_outline.title=Vesiqa T谋艧-hizas谋n谋 K枚ster (unsurlarn谋帽 episini cay谋ld谋rmaq/e艧tirmek i莽眉n 莽ifte-莽erti帽iz)
+document_outline_label=Vesiqa T谋艧-hizas谋
+attachments.title=陌li艧iklerni K枚ster
+attachments_label=陌li艧ikler
+thumbs.title=T谋rnaq-Resimlerni K枚ster
+thumbs_label=T谋rnaq-Resimler
+findbar.title=Vesiqada Tap
+findbar_label=Tap
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Saife {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas={{page}}. Saifeni帽 T谋rnaq-Resmi
+
+# Find panel button title and messages
+find_input.title=Tap
+find_input.placeholder=Vesiqada tap鈥�
+find_previous.title=陌bareni帽 evvelki rastkeli艧ini tap
+find_previous_label=Evvelki
+find_next.title=陌bareni帽 so帽raki rastkeli艧ini tap
+find_next_label=So帽raki
+find_highlight=Episini 谋艧谋qland谋r
+find_match_case_label=B眉y眉k-ufaq hassasiyeti
+find_reached_top=Saifeni帽 t枚pesi iri艧ildi, t眉pten devam etildi
+find_reached_bottom=Saifeni帽 so帽u iri艧ildi, t枚peden devam etildi
+find_not_found=陌bare tap谋lmad谋
+
+# Error panel labels
+error_more_info=Daa 脟oq Mal眉mat
+error_less_info=Daa Az Mal眉mat
+error_close=Qapat
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js s{{version}} (in艧a: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Mesaj: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=脟eren: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Dosye: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Sat谋r: {{line}}
+rendering_error=Saife q谋l谋n臒anda bir hata orta臒a 莽谋qt谋.
+
+# Predefined zoom values
+page_scale_width=Saife Keni艧ligi
+page_scale_fit=Saifeni S谋臒d谋r
+page_scale_auto=脰z-枚z眉nden Miqyasla
+page_scale_actual=Fiiliy 脰l莽眉
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent=%{{scale}}
+
+# Loading indicator messages
+loading_error_indicator=Hata
+loading_error=PDF y眉klengende bir hata orta臒a 莽谋qt谋.
+invalid_file_error=Ke莽ersiz yaki ifsat etilgen PDF dosyesi.
+missing_file_error=Eksik PDF dosyesi.
+unexpected_response_error=Beklenmegen sunuc谋 cevab谋.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Notland谋rmas谋]
+password_label=Bu PDF dosyesini a莽maq i莽眉n s谋r-s枚zni kirseti帽iz.
+password_invalid=Ke莽ersiz s谋r-s枚z. L眉tfen ya帽谋dan de帽e帽iz.
+password_ok=Tamam
+password_cancel=Vazge莽
+
+printing_not_supported=Tenbi: Bast谋ruv bu kezici taraf谋ndan tam olaraq desteklenmey.
+printing_not_ready=Tenbi: PDF bast谋ruv i莽眉n b眉t眉nley y眉klengen degildir.
+web_fonts_disabled=A臒 urufatlar谋 naqabildir: i莽eri-yatq谋z谋l臒an PDF urufatlar谋 qullan谋lalmay.
+document_colors_not_allowed=PDF vesiqalar谋n谋帽 枚z t眉slerini qullanmas谋 caiz degildir: 鈥淪aifelerge 枚z t眉slerini se莽mege izin ber鈥� kezicide 臒ayr谋faalle艧tirilgendir.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/cs/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/cs/viewer.properties
new file mode 100644
index 0000000..267054e
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/cs/viewer.properties
@@ -0,0 +1,242 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=P艡ejde na p艡edchoz铆 str谩nku
+previous_label=P艡edchoz铆
+next.title=P艡ejde na n谩sleduj铆c铆 str谩nku
+next_label=Dal拧铆
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=Str谩nka
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=z {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} z {{pagesCount}})
+
+zoom_out.title=Zmen拧铆 velikost
+zoom_out_label=Zmen拧it
+zoom_in.title=Zv臎t拧铆 velikost
+zoom_in_label=Zv臎t拧it
+zoom.title=Nastav铆 velikost
+presentation_mode.title=P艡epne do re啪imu prezentace
+presentation_mode_label=Re啪im prezentace
+open_file.title=Otev艡e soubor
+open_file_label=Otev艡铆t
+print.title=Vytiskne dokument
+print_label=Tisk
+download.title=St谩hne dokument
+download_label=St谩hnout
+bookmark.title=Sou膷asn媒 pohled (kop铆rovat nebo otev艡铆t v nov茅m okn臎)
+bookmark_label=Sou膷asn媒 pohled
+
+# Secondary toolbar and context menu
+tools.title=N谩stroje
+tools_label=N谩stroje
+first_page.title=P艡ejde na prvn铆 str谩nku
+first_page.label=P艡ej铆t na prvn铆 str谩nku
+first_page_label=P艡ej铆t na prvn铆 str谩nku
+last_page.title=P艡ejde na posledn铆 str谩nku
+last_page.label=P艡ej铆t na posledn铆 str谩nku
+last_page_label=P艡ej铆t na posledn铆 str谩nku
+page_rotate_cw.title=Oto膷铆 po sm臎ru hodin
+page_rotate_cw.label=Oto膷it po sm臎ru hodin
+page_rotate_cw_label=Oto膷it po sm臎ru hodin
+page_rotate_ccw.title=Oto膷铆 proti sm臎ru hodin
+page_rotate_ccw.label=Oto膷it proti sm臎ru hodin
+page_rotate_ccw_label=Oto膷it proti sm臎ru hodin
+
+cursor_text_select_tool.title=Povol铆 v媒b臎r textu
+cursor_text_select_tool_label=V媒b臎r textu
+cursor_hand_tool.title=Povol铆 n谩stroj ru膷i膷ka
+cursor_hand_tool_label=N谩stroj ru膷i膷ka
+
+scroll_vertical.title=Pou啪铆t svisl茅 posouv谩n铆
+scroll_vertical_label=Svisl茅 posouv谩n铆
+scroll_horizontal.title=Pou啪铆t vodorovn茅 posouv谩n铆
+scroll_horizontal_label=Vodorovn茅 posouv谩n铆
+scroll_wrapped.title=Pou啪铆t postupn茅 posouv谩n铆
+scroll_wrapped_label=Postupn茅 posouv谩n铆
+
+spread_none.title=Nesdru啪ovat str谩nky
+spread_none_label=沤谩dn茅 sdru啪en铆
+spread_odd.title=Sdru啪铆 str谩nky s um铆st臎n铆m lich媒ch vlevo
+spread_odd_label=Sdru啪en铆 str谩nek (lich茅 vlevo)
+spread_even.title=Sdru啪铆 str谩nky s um铆st臎n铆m sud媒ch vlevo
+spread_even_label=Sdru啪en铆 str谩nek (sud茅 vlevo)
+
+# Document properties dialog box
+document_properties.title=Vlastnosti dokumentu鈥�
+document_properties_label=Vlastnosti dokumentu鈥�
+document_properties_file_name=N谩zev souboru:
+document_properties_file_size=Velikost souboru:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} bajt暖)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} bajt暖)
+document_properties_title=N谩zev str谩nky:
+document_properties_author=Autor:
+document_properties_subject=P艡edm臎t:
+document_properties_keywords=Kl铆膷ov谩 slova:
+document_properties_creation_date=Datum vytvo艡en铆:
+document_properties_modification_date=Datum 煤pravy:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Vytvo艡il:
+document_properties_producer=Tv暖rce PDF:
+document_properties_version=Verze PDF:
+document_properties_page_count=Po膷et str谩nek:
+document_properties_page_size=Velikost str谩nky:
+document_properties_page_size_unit_inches=in
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=na v媒拧ku
+document_properties_page_size_orientation_landscape=na 拧铆艡ku
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Dopis
+document_properties_page_size_name_legal=Pr谩vn铆 dokument
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=Rychl茅 zobrazov谩n铆 z webu:
+document_properties_linearized_yes=Ano
+document_properties_linearized_no=Ne
+document_properties_close=Zav艡铆t
+
+print_progress_message=P艡铆prava dokumentu pro tisk鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}} %
+print_progress_close=Zru拧it
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Postrann铆 li拧ta
+toggle_sidebar_notification.title=P艡epne postrann铆 li拧tu (dokument obsahuje osnovu/p艡铆lohy)
+toggle_sidebar_label=Postrann铆 li拧ta
+document_outline.title=Zobraz铆 osnovu dokumentu (dvojit茅 klepnut铆 rozbal铆/sbal铆 v拧echny polo啪ky)
+document_outline_label=Osnova dokumentu
+attachments.title=Zobraz铆 p艡铆lohy
+attachments_label=P艡铆lohy
+thumbs.title=Zobraz铆 n谩hledy
+thumbs_label=N谩hledy
+findbar.title=Najde v dokumentu
+findbar_label=Naj铆t
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Strana {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=N谩hled strany {{page}}
+
+# Find panel button title and messages
+find_input.title=Naj铆t
+find_input.placeholder=Naj铆t v dokumentu鈥�
+find_previous.title=Najde p艡edchoz铆 v媒skyt hledan茅ho textu
+find_previous_label=P艡edchoz铆
+find_next.title=Najde dal拧铆 v媒skyt hledan茅ho textu
+find_next_label=Dal拧铆
+find_highlight=Zv媒raznit
+find_match_case_label=Rozli拧ovat velikost
+find_entire_word_label=Cel谩 slova
+find_reached_top=Dosa啪en za膷谩tek dokumentu, pokra膷uje se od konce
+find_reached_bottom=Dosa啪en konec dokumentu, pokra膷uje se od za膷谩tku
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]={{current}}. z {{total}} v媒skytu
+find_match_count[two]={{current}}. z {{total}} v媒skyt暖
+find_match_count[few]={{current}}. z {{total}} v媒skyt暖
+find_match_count[many]={{current}}. z {{total}} v媒skyt暖
+find_match_count[other]={{current}}. z {{total}} v媒skyt暖
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]=V铆ce ne啪 {{limit}} v媒skyt暖
+find_match_count_limit[one]=V铆ce ne啪 {{limit}} v媒skyt
+find_match_count_limit[two]=V铆ce ne啪 {{limit}} v媒skyty
+find_match_count_limit[few]=V铆ce ne啪 {{limit}} v媒skyty
+find_match_count_limit[many]=V铆ce ne啪 {{limit}} v媒skyt暖
+find_match_count_limit[other]=V铆ce ne啪 {{limit}} v媒skyt暖
+find_not_found=Hledan媒 text nenalezen
+
+# Error panel labels
+error_more_info=V铆ce informac铆
+error_less_info=M茅n臎 informac铆
+error_close=Zav艡铆t
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (sestaven铆: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Zpr谩va: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Z谩sobn铆k: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Soubor: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=艠谩dek: {{line}}
+rendering_error=P艡i vykreslov谩n铆 str谩nky nastala chyba.
+
+# Predefined zoom values
+page_scale_width=Podle 拧铆艡ky
+page_scale_fit=Podle v媒拧ky
+page_scale_auto=Automatick谩 velikost
+page_scale_actual=Skute膷n谩 velikost
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Chyba
+loading_error=P艡i nahr谩v谩n铆 PDF nastala chyba.
+invalid_file_error=Neplatn媒 nebo chybn媒 soubor PDF.
+missing_file_error=Chyb铆 soubor PDF.
+unexpected_response_error=Neo膷ek谩van谩 odpov臎膹 serveru.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[Anotace typu {{type}}]
+password_label=Pro otev艡en铆 PDF souboru vlo啪te heslo.
+password_invalid=Neplatn茅 heslo. Zkuste to znovu.
+password_ok=OK
+password_cancel=Zru拧it
+
+printing_not_supported=Upozorn臎n铆: Tisk nen铆 v tomto prohl铆啪e膷i pln臎 podporov谩n.
+printing_not_ready=Upozorn臎n铆: Dokument PDF nen铆 kompletn臎 na膷ten.
+web_fonts_disabled=Webov谩 p铆sma jsou zak谩z谩na, proto nen铆 mo啪n茅 pou啪铆t vlo啪en谩 p铆sma PDF.
+document_colors_not_allowed=PDF dokumenty nemaj铆 povoleno pou啪铆vat vlastn铆 barvy: volba 'Povolit str谩nk谩m pou啪铆vat vlastn铆 barvy' je v prohl铆啪e膷i deaktivov谩na.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/csb/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/csb/viewer.properties
new file mode 100644
index 0000000..293a353
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/csb/viewer.properties
@@ -0,0 +1,134 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=P貌prz茅dn么 strona
+previous_label=P貌prz茅dn么
+next.title=N么sl茅dn么 strona
+next_label=N么sl茅dn么
+
+# LOCALIZATION NOTE (page_label, page_of):
+# These strings are concatenated to form the "Page: X of Y" string.
+# Do not translate "{{pageCount}}", it will be substituted with a number
+# representing the total number of pages.
+page_label=Strona:
+page_of=z {{pageCount}}
+
+zoom_out.title=Zmni茅sz毛
+zoom_out_label=Zmni茅sz毛
+zoom_in.title=Zwiksz毛
+zoom_in_label=Wi么lg貌sc
+zoom.title=Wi么lg貌sc
+print.title=Dr毛k霉j毛
+print_label=Dr毛k霉j毛
+presentation_mode.title=Prz茅艅dz毛 w trib prezentacje 
+presentation_mode_label=Trib prezentacje 
+open_file.title=脪temkni lopk
+open_file_label=脪temkni
+download.title=Zlad毛nk
+download_label=Zlad毛nk
+bookmark.title=Spami茫t么j w毛zdrzatk (k貌p茅r毛je, ab貌 貌temkni w nowim 貌knnie)
+bookmark_label=Aktualny w毛zdrzatk
+
+find_label=Sz毛k么j:
+find_previous.title=Bi茅j do p貌prz茅dn茅g貌 w毛nik霉 sz毛kb毛
+find_previous_label=P貌prz茅dny
+find_next.title=Bi茅j do n么sl茅dn茅g貌 w毛nik霉 sz毛kb毛
+find_next_label=N么sl茅dny
+find_highlight=P貌dszkrz毛ni wsz毛tcz茅
+find_match_case_label=Rozezn么w么j miar茫 l毛ter贸w
+find_not_found=Nie nal么z艂 tekstu
+find_reached_bottom=Doszed艂 do k霉艅ca dok霉mentu, zaczinaj膮c毛 貌d g贸r毛
+find_reached_top=Doszed艂 do p貌cz膮tk霉 dok霉mentu, zaczinaj膮c毛 貌d do艂霉
+
+toggle_sidebar.title=P貌suwk w毛bi茅rk霉
+toggle_sidebar_label=P貌suwk w毛bi茅rk霉
+
+outline.title=W毛skrz毛ni 貌bc茅ch dok霉mentu
+outline_label=脪bc茅ch dok霉mentu
+thumbs.title=W毛skrz毛ni miniatur毛
+thumbs_label=Miniatur毛
+findbar.title=Przesz毛k么j dok霉ment
+findbar_label=Nalez毛
+tools_label=N么rz茫d艂a
+first_page.title=Bi茅j do pierszi stron毛
+first_page.label=Bi茅j do pierszi stron毛
+last_page.label=Bi茅j do 貌statny stron毛
+invalid_file_error=L毛chi 么rt, ab貌 p貌ps毛ti lopk PDF.
+
+
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Strona {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Miniatura stron毛 {{page}}
+
+# Error panel labels
+error_more_info=Wicy inf貌rmacje
+error_less_info=Mni inf貌rmacje
+error_close=Close
+error_version_info=PDF.js v{{version}} (build: {{build}})
+
+
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Message: {{wiad艂o}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stack: {{st贸g}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=File: {{lopk}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Line: {{line}}
+rendering_error=P貌k么za s茫 fela prz毛 renderowanim stron毛.
+
+# Predefined zoom values
+page_scale_width=Sz茅rzawa stron毛
+page_scale_fit=Dopas毛je stron茫
+page_scale_auto=A霉tomatn么 wi么lg貌sc
+page_scale_actual=Naturaln么 wi么lg貌sc
+
+# Loading indicator messages
+# LOCALIZATION NOTE (error_line): "{{[percent}}" will be replaced with a percentage
+loading_error_indicator=Fela
+loading_error=P貌k么za s茫 fela prz毛 wcz毛tiwanim PDF霉.
+
+# LOCALIZATION NOTE (text_annotation_type): This is used as a tooltip.
+# "{{[type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+
+request_password=PDF je zabezpieczony parol膮:
+printing_not_supported = 脪strz茅ga: przez茅rnik nie je do k霉艅ca wspier贸ny przez dr毛k么rze 
+
+# Context menu
+page_rotate_cw.label=脪bkr茫c毛 w praw貌
+page_rotate_ccw.label=脪bkr茫c毛 w lew貌
+
+
+last_page.title=Bi茅j do p貌prz茅dny stron毛
+last_page_label=Bi茅j do p貌prz茅dny stron毛
+page_rotate_cw.title=脪bkr茫c毛 w praw貌
+page_rotate_cw_label=脪bkr茫c毛 w praw貌
+page_rotate_ccw.title=脪bkr茫c毛 w lew貌
+page_rotate_ccw_label=脪bkr茫c毛 w lew貌
+
+
+web_fonts_disabled=S茅cow茅 czconczi s膮 w毛艂膮czon茅: w艂膮cz毛 je, b毛 m贸c 霉偶iwac 貌sadzon毛ch czconk贸w w lopkach PDF.
+
+
+missing_file_error=Fel毛je lopka PDF.
+printing_not_ready = 脪strz茅ga: lopk m霉szi s茫 do k霉艅ca wcz毛tac zanim g貌 m貌偶e dr毛k貌wac
+
+document_colors_disabled=Dok霉ment毛 PDF nie m貌g膮 霉 sw貌jich farw贸w: \'P貌zw貌l毛 stron贸m w毛bierac sw貌je farw毛\' je w毛艂膮czon茅 w przez茅rnik霉.
+invalid_password=L毛ch么 parola.
+text_annotation_type.alt=[Adnotacj么 {{type}}]
+
+tools.title=Tools
+first_page_label=Go to First Page
+
+
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/cy/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/cy/viewer.properties
new file mode 100644
index 0000000..44a3fee
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/cy/viewer.properties
@@ -0,0 +1,242 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Tudalen Flaenorol
+previous_label=Blaenorol
+next.title=Tudalen Nesaf
+next_label=Nesaf
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=Tudalen
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=o {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} o {{pagesCount}})
+
+zoom_out.title=Chwyddo Allan
+zoom_out_label=Chwyddo Allan
+zoom_in.title=Chwyddo Mewn
+zoom_in_label=Chwyddo Mewn
+zoom.title=Chwyddo
+presentation_mode.title=Newid i'r Modd Cyflwyno
+presentation_mode_label=Modd Cyflwyno
+open_file.title=Agor Ffeil
+open_file_label=Agor
+print.title=Argraffu
+print_label=Argraffu
+download.title=Llwyth
+download_label=Llwytho i Lawr
+bookmark.title=Golwg cyfredol (cop茂o neu agor ffenestr newydd)
+bookmark_label=Golwg Gyfredol
+
+# Secondary toolbar and context menu
+tools.title=Offer
+tools_label=Offer
+first_page.title=Mynd i'r Dudalen Gyntaf
+first_page.label=Mynd i'r Dudalen Gyntaf
+first_page_label=Mynd i'r Dudalen Gyntaf
+last_page.title=Mynd i'r Dudalen Olaf
+last_page.label=Mynd i'r Dudalen Olaf
+last_page_label=Mynd i'r Dudalen Olaf
+page_rotate_cw.title=Cylchdroi Clocwedd
+page_rotate_cw.label=Cylchdroi Clocwedd
+page_rotate_cw_label=Cylchdroi Clocwedd
+page_rotate_ccw.title=Cylchdroi Gwrthglocwedd
+page_rotate_ccw.label=Cylchdroi Gwrthglocwedd
+page_rotate_ccw_label=Cylchdroi Gwrthglocwedd
+
+cursor_text_select_tool.title=Galluogi Dewis Offeryn Testun
+cursor_text_select_tool_label=Offeryn Dewis Testun
+cursor_hand_tool.title=Galluogi Offeryn Llaw
+cursor_hand_tool_label=Offeryn Llaw
+
+scroll_vertical.title=Defnyddio Sgrolio Fertigol
+scroll_vertical_label=Sgrolio Fertigol
+scroll_horizontal.title=Defnyddio Sgrolio Fertigol
+scroll_horizontal_label=Sgrolio Fertigol
+scroll_wrapped.title=Defnyddio Sgrolio Amlapio
+scroll_wrapped_label=Sgrolio Amlapio
+
+spread_none.title=Peidio uno taeniadau canol
+spread_none_label=Dim Taeniadau
+spread_odd.title=Uno taeniadau tudalen yn cychwyn gyda thudalennau odrif
+spread_odd_label=Taeniadau Odrifau
+spread_even.title=Uno taeniadau tudalen yn cychwyn gyda thudalennau eilrif
+spread_even_label=Taeniadau Eilrif
+
+# Document properties dialog box
+document_properties.title=Priodweddau Dogfen鈥�
+document_properties_label=Priodweddau Dogfen鈥�
+document_properties_file_name=Enw ffeil:
+document_properties_file_size=Maint ffeil:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} beit)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} beit)
+document_properties_title=Teitl:
+document_properties_author=Awdur:
+document_properties_subject=Pwnc:
+document_properties_keywords=Allweddair:
+document_properties_creation_date=Dyddiad Creu:
+document_properties_modification_date=Dyddiad Addasu:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Crewr:
+document_properties_producer=Cynhyrchydd PDF:
+document_properties_version=Fersiwn PDF:
+document_properties_page_count=Cyfrif Tudalen:
+document_properties_page_size=Maint Tudalen:
+document_properties_page_size_unit_inches=o fewn
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=portread
+document_properties_page_size_orientation_landscape=tirlun
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Llythyr
+document_properties_page_size_name_legal=Cyfreithiol
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=Golwg Gwe Cyflym:
+document_properties_linearized_yes=Iawn
+document_properties_linearized_no=Na
+document_properties_close=Cau
+
+print_progress_message=Paratoi dogfen ar gyfer ei hargraffu鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=Diddymu
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Toglo'r Bar Ochr
+toggle_sidebar_notification.title=Toglo'r Bar Ochr (mae'r ddogfen yn cynnwys outline/attachments)
+toggle_sidebar_label=Toglo'r Bar Ochr
+document_outline.title=Dangos Amlinell Dogfen (clic dwbl i ymestyn/cau pob eitem)
+document_outline_label=Amlinelliad Dogfen
+attachments.title=Dangos Atodiadau
+attachments_label=Atodiadau
+thumbs.title=Dangos Lluniau Bach
+thumbs_label=Lluniau Bach
+findbar.title=Canfod yn y Ddogfen
+findbar_label=Canfod
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Tudalen {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Llun Bach Tudalen {{page}}
+
+# Find panel button title and messages
+find_input.title=Canfod
+find_input.placeholder=Canfod yn y ddogfen鈥�
+find_previous.title=Canfod enghraifft flaenorol o'r ymadrodd
+find_previous_label=Blaenorol
+find_next.title=Canfod enghraifft nesaf yr ymadrodd
+find_next_label=Nesaf
+find_highlight=Amlygu popeth
+find_match_case_label=Cydweddu maint
+find_entire_word_label=Geiriau cyfan
+find_reached_top=Wedi cyrraedd brig y dudalen, parhau o'r gwaelod
+find_reached_bottom=Wedi cyrraedd diwedd y dudalen, parhau o'r brig
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]={{current}} o {{total}} cydweddiad
+find_match_count[two]={{current}} o {{total}} cydweddiad
+find_match_count[few]={{current}} o {{total}} cydweddiad
+find_match_count[many]={{current}} o {{total}} cydweddiad
+find_match_count[other]={{current}} o {{total}} cydweddiad
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]=Mwy na {{limit}} cydweddiad
+find_match_count_limit[one]=Mwy na {{limit}} cydweddiad
+find_match_count_limit[two]=Mwy na {{limit}} cydweddiad
+find_match_count_limit[few]=Mwy na {{limit}} cydweddiad
+find_match_count_limit[many]=Mwy na {{limit}} cydweddiad
+find_match_count_limit[other]=Mwy na {{limit}} cydweddiad
+find_not_found=Heb ganfod ymadrodd
+
+# Error panel labels
+error_more_info=Rhagor o Wybodaeth
+error_less_info=Llai o wybodaeth
+error_close=Cau
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Neges: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stac: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Ffeil: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Llinell: {{line}}
+rendering_error=Digwyddodd gwall wrth adeiladu'r dudalen.
+
+# Predefined zoom values
+page_scale_width=Lled Tudalen
+page_scale_fit=Ffit Tudalen
+page_scale_auto=Chwyddo Awtomatig
+page_scale_actual=Maint Gwirioneddol
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Gwall
+loading_error=Digwyddodd gwall wrth lwytho'r PDF.
+invalid_file_error=Ffeil PDF annilys neu llwgr.
+missing_file_error=Ffeil PDF coll.
+unexpected_response_error=Ymateb annisgwyl gan y gweinydd.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[Anodiad {{type}} ]
+password_label=Rhowch gyfrinair i agor y PDF.
+password_invalid=Cyfrinair annilys. Ceisiwch eto.
+password_ok=Iawn
+password_cancel=Diddymu
+
+printing_not_supported=Rhybudd: Nid yw argraffu yn cael ei gynnal yn llawn gan y porwr.
+printing_not_ready=Rhybudd: Nid yw'r PDF wedi ei lwytho'n llawn ar gyfer argraffu.
+web_fonts_disabled=Ffontiau gwe wedi eu hanalluogi: methu defnyddio ffontiau PDF mewnblanedig.
+document_colors_not_allowed=Nid oes caniat芒d i ddogfennau PDF i ddefnyddio eu lliwiau eu hunain: Mae 鈥淐aniat谩u i dudalennau ddefnyddio eu lliwiau eu hunain鈥� wedi ei atal yn y porwr.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/da/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/da/viewer.properties
new file mode 100644
index 0000000..62db093
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/da/viewer.properties
@@ -0,0 +1,242 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Forrige side
+previous_label=Forrige
+next.title=N忙ste side
+next_label=N忙ste
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=Side
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=af {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} af {{pagesCount}})
+
+zoom_out.title=Zoom ud
+zoom_out_label=Zoom ud
+zoom_in.title=Zoom ind
+zoom_in_label=Zoom ind
+zoom.title=Zoom
+print.title=Udskriv
+print_label=Udskriv
+presentation_mode.title=Skift til fuldsk忙rmsvisning
+presentation_mode_label=Fuldsk忙rmsvisning
+open_file.title=脜bn fil
+open_file_label=脜bn
+download.title=Hent
+download_label=Hent
+bookmark.title=Aktuel visning (kopier eller 氓bn i et nyt vindue)
+bookmark_label=Aktuel visning
+
+# Secondary toolbar and context menu
+tools.title=Funktioner
+tools_label=Funktioner
+first_page.title=G氓 til f酶rste side
+first_page.label=G氓 til f酶rste side
+first_page_label=G氓 til f酶rste side
+last_page.title=G氓 til sidste side
+last_page.label=G氓 til sidste side
+last_page_label=G氓 til sidste side
+page_rotate_cw.title=Roter med uret
+page_rotate_cw.label=Roter med uret
+page_rotate_cw_label=Roter med uret
+page_rotate_ccw.title=Roter mod uret
+page_rotate_ccw.label=Roter mod uret
+page_rotate_ccw_label=Roter mod uret
+
+cursor_text_select_tool.title=Aktiver markeringsv忙rkt酶j
+cursor_text_select_tool_label=Markeringsv忙rkt酶j
+cursor_hand_tool.title=Aktiver h氓ndv忙rkt酶j
+cursor_hand_tool_label=H氓ndv忙rkt酶j
+
+scroll_vertical.title=Brug vertikal scrolling
+scroll_vertical_label=Vertikal scrolling
+scroll_horizontal.title=Brug horisontal scrolling
+scroll_horizontal_label=Horisontal scrolling
+scroll_wrapped.title=Brug ombrudt scrolling
+scroll_wrapped_label=Ombrudt scrolling
+
+spread_none.title=Vis enkeltsider
+spread_none_label=Enkeltsider
+spread_odd.title=Vis opslag med ulige sidenumre til venstre
+spread_odd_label=Opslag med forside
+spread_even.title=Vis opslag med lige sidenumre til venstre
+spread_even_label=Opslag uden forside
+
+# Document properties dialog box
+document_properties.title=Dokumentegenskaber鈥�
+document_properties_label=Dokumentegenskaber鈥�
+document_properties_file_name=Filnavn:
+document_properties_file_size=Filst酶rrelse:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=Titel:
+document_properties_author=Forfatter:
+document_properties_subject=Emne:
+document_properties_keywords=N酶gleord:
+document_properties_creation_date=Oprettet:
+document_properties_modification_date=Redigeret:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Program:
+document_properties_producer=PDF-producent:
+document_properties_version=PDF-version:
+document_properties_page_count=Antal sider:
+document_properties_page_size=Sidest酶rrelse:
+document_properties_page_size_unit_inches=in
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=st氓ende
+document_properties_page_size_orientation_landscape=liggende
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Letter
+document_properties_page_size_name_legal=Legal
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=Hurtig web-visning:
+document_properties_linearized_yes=Ja
+document_properties_linearized_no=Nej
+document_properties_close=Luk
+
+print_progress_message=Forbereder dokument til udskrivning鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=Annuller
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Sl氓 sidepanel til eller fra
+toggle_sidebar_notification.title=Sl氓 sidepanel til eller fra (dokumentet indeholder disposition/vedh忙ftede filer)
+toggle_sidebar_label=Sl氓 sidepanel til eller fra
+document_outline.title=Vis dokumentets disposition (dobbeltklik for at vise/skjule alle elementer)
+document_outline_label=Dokument-disposition
+attachments.title=Vis vedh忙ftede filer
+attachments_label=Vedh忙ftede filer
+thumbs.title=Vis miniaturer
+thumbs_label=Miniaturer
+findbar.title=Find i dokument
+findbar_label=Find
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Side {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Miniature af side {{page}}
+
+# Find panel button title and messages
+find_input.title=Find
+find_input.placeholder=Find i dokument鈥�
+find_previous.title=Find den forrige forekomst
+find_previous_label=Forrige
+find_next.title=Find den n忙ste forekomst
+find_next_label=N忙ste
+find_highlight=Fremh忙v alle
+find_match_case_label=Forskel p氓 store og sm氓 bogstaver
+find_entire_word_label=Hele ord
+find_reached_top=Toppen af siden blev n氓et, fortsatte fra bunden
+find_reached_bottom=Bunden af siden blev n氓et, fortsatte fra toppen
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]={{current}} af {{total}} forekomst
+find_match_count[two]={{current}} af {{total}} forekomster
+find_match_count[few]={{current}} af {{total}} forekomster
+find_match_count[many]={{current}} af {{total}} forekomster
+find_match_count[other]={{current}} af {{total}} forekomster
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]=Mere end {{limit}} forekomster
+find_match_count_limit[one]=Mere end {{limit}} forekomst
+find_match_count_limit[two]=Mere end {{limit}} forekomster
+find_match_count_limit[few]=Mere end {{limit}} forekomster
+find_match_count_limit[many]=Mere end {{limit}} forekomster
+find_match_count_limit[other]=Mere end {{limit}} forekomster
+find_not_found=Der blev ikke fundet noget
+
+# Error panel labels
+error_more_info=Mere information
+error_less_info=Mindre information
+error_close=Luk
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Fejlmeddelelse: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stack: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Fil: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Linje: {{line}}
+rendering_error=Der opstod en fejl ved generering af siden.
+
+# Predefined zoom values
+page_scale_width=Sidebredde
+page_scale_fit=Tilpas til side
+page_scale_auto=Automatisk zoom
+page_scale_actual=Faktisk st酶rrelse
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Fejl
+loading_error=Der opstod en fejl ved indl忙sning af PDF-filen.
+invalid_file_error=PDF-filen er ugyldig eller 酶delagt.
+missing_file_error=Manglende PDF-fil.
+unexpected_response_error=Uventet svar fra serveren.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}}kommentar]
+password_label=Angiv adgangskode til at 氓bne denne PDF-fil.
+password_invalid=Ugyldig adgangskode. Pr酶v igen.
+password_ok=OK
+password_cancel=Fortryd
+
+printing_not_supported=Advarsel: Udskrivning er ikke fuldt underst酶ttet af browseren.
+printing_not_ready=Advarsel: PDF-filen er ikke fuldt indl忙st til udskrivning.
+web_fonts_disabled=Webskrifttyper er deaktiverede. De indlejrede skrifttyper i PDF-filen kan ikke anvendes.
+document_colors_not_allowed=PDF-dokumenter m氓 ikke bruge deres egne farver: 'Tillad sider at v忙lge deres egne farver' er deaktiveret i browseren.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/de/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/de/viewer.properties
new file mode 100644
index 0000000..da4c809
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/de/viewer.properties
@@ -0,0 +1,229 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Eine Seite zur眉ck
+previous_label=Zur眉ck
+next.title=Eine Seite vor
+next_label=Vor
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=Seite
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=von {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} von {{pagesCount}})
+
+zoom_out.title=Verkleinern
+zoom_out_label=Verkleinern
+zoom_in.title=Vergr枚脽ern
+zoom_in_label=Vergr枚脽ern
+zoom.title=Zoom
+presentation_mode.title=In Pr盲sentationsmodus wechseln
+presentation_mode_label=Pr盲sentationsmodus
+open_file.title=Datei 枚ffnen
+open_file_label=脰ffnen
+print.title=Drucken
+print_label=Drucken
+download.title=Dokument speichern
+download_label=Speichern
+bookmark.title=Aktuelle Ansicht (zum Kopieren oder 脰ffnen in einem neuen Fenster)
+bookmark_label=Aktuelle Ansicht
+
+# Secondary toolbar and context menu
+tools.title=Werkzeuge
+tools_label=Werkzeuge
+first_page.title=Erste Seite anzeigen
+first_page.label=Erste Seite anzeigen
+first_page_label=Erste Seite anzeigen
+last_page.title=Letzte Seite anzeigen
+last_page.label=Letzte Seite anzeigen
+last_page_label=Letzte Seite anzeigen
+page_rotate_cw.title=Im Uhrzeigersinn drehen
+page_rotate_cw.label=Im Uhrzeigersinn drehen
+page_rotate_cw_label=Im Uhrzeigersinn drehen
+page_rotate_ccw.title=Gegen Uhrzeigersinn drehen
+page_rotate_ccw.label=Gegen Uhrzeigersinn drehen
+page_rotate_ccw_label=Gegen Uhrzeigersinn drehen
+
+cursor_text_select_tool.title=Textauswahl-Werkzeug aktivieren
+cursor_text_select_tool_label=Textauswahl-Werkzeug
+cursor_hand_tool.title=Hand-Werkzeug aktivieren
+cursor_hand_tool_label=Hand-Werkzeug
+
+scroll_vertical.title=Seiten 眉bereinander anordnen
+scroll_vertical_label=Vertikale Seitenanordnung
+scroll_horizontal.title=Seiten nebeneinander anordnen
+scroll_horizontal_label=Horizontale Seitenanordnung
+scroll_wrapped.title=Seiten neben- und 眉bereinander anordnen, anh盲ngig vom Platz
+scroll_wrapped_label=Kombinierte Seitenanordnung
+
+spread_none.title=Seiten nicht nebeneinander anzeigen
+spread_none_label=Einzelne Seiten
+spread_odd.title=Jeweils eine ungerade und eine gerade Seite nebeneinander anzeigen
+spread_odd_label=Ungerade + gerade Seite
+spread_even.title=Jeweils eine gerade und eine ungerade Seite nebeneinander anzeigen
+spread_even_label=Gerade + ungerade Seite
+
+# Document properties dialog box
+document_properties.title=Dokumenteigenschaften
+document_properties_label=Dokumenteigenschaften鈥�
+document_properties_file_name=Dateiname:
+document_properties_file_size=Dateigr枚脽e:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} Bytes)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} Bytes)
+document_properties_title=Titel:
+document_properties_author=Autor:
+document_properties_subject=Thema:
+document_properties_keywords=Stichw枚rter:
+document_properties_creation_date=Erstelldatum:
+document_properties_modification_date=Bearbeitungsdatum:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}} {{time}}
+document_properties_creator=Anwendung:
+document_properties_producer=PDF erstellt mit:
+document_properties_version=PDF-Version:
+document_properties_page_count=Seitenzahl:
+document_properties_page_size=Seitengr枚脽e:
+document_properties_page_size_unit_inches=Zoll
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=Hochformat
+document_properties_page_size_orientation_landscape=Querformat
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Letter
+document_properties_page_size_name_legal=Legal
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=Schnelle Webanzeige:
+document_properties_linearized_yes=Ja
+document_properties_linearized_no=Nein
+document_properties_close=Schlie脽en
+
+print_progress_message=Dokument wird f眉r Drucken vorbereitet鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=Abbrechen
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Sidebar umschalten
+toggle_sidebar_notification.title=Sidebar umschalten (Dokument enth盲lt Dokumentstruktur/Anh盲nge)
+toggle_sidebar_label=Sidebar umschalten
+document_outline.title=Dokumentstruktur anzeigen (Doppelklicken, um alle Eintr盲ge aus- bzw. einzuklappen)
+document_outline_label=Dokumentstruktur
+attachments.title=Anh盲nge anzeigen
+attachments_label=Anh盲nge
+thumbs.title=Miniaturansichten anzeigen
+thumbs_label=Miniaturansichten
+findbar.title=Dokument durchsuchen
+findbar_label=Suchen
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Seite {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Miniaturansicht von Seite {{page}}
+
+# Find panel button title and messages
+find_input.title=Suchen
+find_input.placeholder=Im Dokument suchen鈥�
+find_previous.title=Vorheriges Vorkommen des Suchbegriffs finden
+find_previous_label=Zur眉ck
+find_next.title=N盲chstes Vorkommen des Suchbegriffs finden
+find_next_label=Weiter
+find_highlight=Alle hervorheben
+find_match_case_label=Gro脽-/Kleinschreibung beachten
+find_entire_word_label=Ganze W枚rter
+find_reached_top=Anfang des Dokuments erreicht, fahre am Ende fort
+find_reached_bottom=Ende des Dokuments erreicht, fahre am Anfang fort
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_not_found=Suchbegriff nicht gefunden
+
+# Error panel labels
+error_more_info=Mehr Informationen
+error_less_info=Weniger Informationen
+error_close=Schlie脽en
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js Version {{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Nachricht: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Aufrufliste: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Datei: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Zeile: {{line}}
+rendering_error=Beim Darstellen der Seite trat ein Fehler auf.
+
+# Predefined zoom values
+page_scale_width=Seitenbreite
+page_scale_fit=Seitengr枚脽e
+page_scale_auto=Automatischer Zoom
+page_scale_actual=Originalgr枚脽e
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Fehler
+loading_error=Beim Laden der PDF-Datei trat ein Fehler auf.
+invalid_file_error=Ung眉ltige oder besch盲digte PDF-Datei
+missing_file_error=Fehlende PDF-Datei
+unexpected_response_error=Unerwartete Antwort des Servers
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[Anlage: {{type}}]
+password_label=Geben Sie zum 脰ffnen der PDF-Datei deren Passwort ein.
+password_invalid=Falsches Passwort. Bitte versuchen Sie es erneut.
+password_ok=OK
+password_cancel=Abbrechen
+
+printing_not_supported=Warnung: Die Drucken-Funktion wird durch diesen Browser nicht vollst盲ndig unterst眉tzt.
+printing_not_ready=Warnung: Die PDF-Datei ist nicht vollst盲ndig geladen, dies ist f眉r das Drucken aber empfohlen.
+web_fonts_disabled=Web-Schriftarten sind deaktiviert: Eingebettete PDF-Schriftarten konnten nicht geladen werden.
+document_colors_not_allowed=PDF-Dokumenten ist es nicht erlaubt, ihre eigenen Farben zu verwenden: 'Seiten das Verwenden von eigenen Farben erlauben' ist im Browser deaktiviert.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/el/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/el/viewer.properties
new file mode 100644
index 0000000..725c547
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/el/viewer.properties
@@ -0,0 +1,242 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=螤蟻慰畏纬慰蠉渭蔚谓畏 蟽蔚位委未伪
+previous_label=螤蟻慰畏纬慰蠉渭蔚谓畏
+next.title=螘蟺蠈渭蔚谓畏 蟽蔚位委未伪
+next_label=螘蟺蠈渭蔚谓畏
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=危蔚位委未伪
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=伪蟺蠈 {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} 伪蟺蠈 {{pagesCount}})
+
+zoom_out.title=危渭委魏蟻蠀谓蟽畏
+zoom_out_label=危渭委魏蟻蠀谓蟽畏
+zoom_in.title=螠蔚纬苇胃蠀谓蟽畏
+zoom_in_label=螠蔚纬苇胃蠀谓蟽畏
+zoom.title=螙慰蠀渭
+presentation_mode.title=螘谓伪位位伪纬萎 蟽蔚 位蔚喂蟿慰蠀蟻纬委伪 蟺伪蟻慰蠀蟽委伪蟽畏蟼
+presentation_mode_label=螞蔚喂蟿慰蠀蟻纬委伪 蟺伪蟻慰蠀蟽委伪蟽畏蟼
+open_file.title=螁谓慰喂纬渭伪 伪蟻蠂蔚委慰蠀
+open_file_label=螁谓慰喂纬渭伪
+print.title=螘魏蟿蠉蟺蠅蟽畏
+print_label=螘魏蟿蠉蟺蠅蟽畏
+download.title=螞萎蠄畏
+download_label=螞萎蠄畏
+bookmark.title=韦蟻苇蠂慰蠀蟽伪 蟺蟻慰尾慰位萎 (伪谓蟿喂纬蟻伪蠁萎 萎 维谓慰喂纬渭伪 蟽蔚 谓苇慰 蟺伪蟻维胃蠀蟻慰)
+bookmark_label=韦蟻苇蠂慰蠀蟽伪 蟺蟻慰尾慰位萎
+
+# Secondary toolbar and context menu
+tools.title=螘蟻纬伪位蔚委伪
+tools_label=螘蟻纬伪位蔚委伪
+first_page.title=螠蔚蟿维尾伪蟽畏 蟽蟿畏谓 蟺蟻蠋蟿畏 蟽蔚位委未伪
+first_page.label=螠蔚蟿维尾伪蟽畏 蟽蟿畏谓 蟺蟻蠋蟿畏 蟽蔚位委未伪
+first_page_label=螠蔚蟿维尾伪蟽畏 蟽蟿畏谓 蟺蟻蠋蟿畏 蟽蔚位委未伪
+last_page.title=螠蔚蟿维尾伪蟽畏 蟽蟿畏谓 蟿蔚位蔚蠀蟿伪委伪 蟽蔚位委未伪
+last_page.label=螠蔚蟿维尾伪蟽畏 蟽蟿畏谓 蟿蔚位蔚蠀蟿伪委伪 蟽蔚位委未伪
+last_page_label=螠蔚蟿维尾伪蟽畏 蟽蟿畏谓 蟿蔚位蔚蠀蟿伪委伪 蟽蔚位委未伪
+page_rotate_cw.title=螖蔚尉喂蠈蟽蟿蟻慰蠁畏 蟺蔚蟻喂蟽蟿蟻慰蠁萎
+page_rotate_cw.label=螖蔚尉喂蠈蟽蟿蟻慰蠁畏 蟺蔚蟻喂蟽蟿蟻慰蠁萎
+page_rotate_cw_label=螖蔚尉喂蠈蟽蟿蟻慰蠁畏 蟺蔚蟻喂蟽蟿蟻慰蠁萎
+page_rotate_ccw.title=螒蟻喂蟽蟿蔚蟻蠈蟽蟿蟻慰蠁畏 蟺蔚蟻喂蟽蟿蟻慰蠁萎
+page_rotate_ccw.label=螒蟻喂蟽蟿蔚蟻蠈蟽蟿蟻慰蠁畏 蟺蔚蟻喂蟽蟿蟻慰蠁萎
+page_rotate_ccw_label=螒蟻喂蟽蟿蔚蟻蠈蟽蟿蟻慰蠁畏 蟺蔚蟻喂蟽蟿蟻慰蠁萎
+
+cursor_text_select_tool.title=螘谓蔚蟻纬慰蟺慰委畏蟽畏 蔚蟻纬伪位蔚委慰蠀 蔚蟺喂位慰纬萎蟼 魏蔚喂渭苇谓慰蠀
+cursor_text_select_tool_label=螘蟻纬伪位蔚委慰 蔚蟺喂位慰纬萎蟼 魏蔚喂渭苇谓慰蠀
+cursor_hand_tool.title=螘谓蔚蟻纬慰蟺慰委畏蟽畏 蔚蟻纬伪位蔚委慰蠀 蠂蔚蟻喂慰蠉
+cursor_hand_tool_label=螘蟻纬伪位蔚委慰 蠂蔚蟻喂慰蠉
+
+scroll_vertical.title=围蟻萎蟽畏 魏维胃蔚蟿畏蟼 魏蠉位喂蟽畏蟼
+scroll_vertical_label=螝维胃蔚蟿畏 魏蠉位喂蟽畏
+scroll_horizontal.title=围蟻萎蟽畏 慰蟻喂味蠈谓蟿喂伪蟼 魏蠉位喂蟽畏蟼
+scroll_horizontal_label=螣蟻喂味蠈谓蟿喂伪 魏蠉位喂蟽畏
+scroll_wrapped.title=围蟻萎蟽畏 魏蠀魏位喂魏萎蟼 魏蠉位喂蟽畏蟼
+scroll_wrapped_label=螝蠀魏位喂魏萎 魏蠉位喂蟽畏
+
+spread_none.title=螡伪 渭畏谓 纬委谓蔚喂 蟽蠉谓未蔚蟽畏 蔚蟺蔚魏蟿维蟽蔚蠅谓 蟽蔚位委未蠅谓
+spread_none_label=围蠅蟻委蟼 蔚蟺蔚魏蟿维蟽蔚喂蟼
+spread_odd.title=危蠉谓未蔚蟽畏 蔚蟺蔚魏蟿维蟽蔚蠅谓 蟽蔚位委未蠅谓 尉蔚魏喂谓蠋谓蟿伪蟼 伪蟺蠈 蟿喂蟼 渭慰谓苇蟼 蟽蔚位委未蔚蟼
+spread_odd_label=螠慰谓苇蟼 蔚蟺蔚魏蟿维蟽蔚喂蟼
+spread_even.title=危蠉谓未蔚蟽畏 蔚蟺蔚魏蟿维蟽蔚蠅谓 蟽蔚位委未蠅谓 尉蔚魏喂谓蠋谓蟿伪蟼 伪蟺蠈 蟿喂蟼 味蠀纬苇蟼 蟽蔚位委未蔚蟼
+spread_even_label=螙蠀纬苇蟼 蔚蟺蔚魏蟿维蟽蔚喂蟼
+
+# Document properties dialog box
+document_properties.title=螜未喂蠈蟿畏蟿蔚蟼 蔚纬纬蟻维蠁慰蠀鈥�
+document_properties_label=螜未喂蠈蟿畏蟿蔚蟼 蔚纬纬蟻维蠁慰蠀鈥�
+document_properties_file_name=螌谓慰渭伪 伪蟻蠂蔚委慰蠀:
+document_properties_file_size=螠苇纬蔚胃慰蟼 伪蟻蠂蔚委慰蠀:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=韦委蟿位慰蟼:
+document_properties_author=危蠀纬纬蟻伪蠁苇伪蟼:
+document_properties_subject=螛苇渭伪:
+document_properties_keywords=螞苇尉蔚喂蟼 魏位蔚喂未喂维:
+document_properties_creation_date=螚渭蔚蟻慰渭畏谓委伪 未畏渭喂慰蠀蟻纬委伪蟼:
+document_properties_modification_date=螚渭蔚蟻慰渭畏谓委伪 蟿蟻慰蟺慰蟺慰委畏蟽畏蟼:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=螖畏渭喂慰蠀蟻纬蠈蟼:
+document_properties_producer=螤伪蟻伪纬蠅纬蠈蟼 PDF:
+document_properties_version=螆魏未慰蟽畏 PDF:
+document_properties_page_count=螒蟻喂胃渭蠈蟼 蟽蔚位委未蠅谓:
+document_properties_page_size=螠苇纬蔚胃慰蟼 蟽蔚位委未伪蟼:
+document_properties_page_size_unit_inches=委谓蟿蟽蔚蟼
+document_properties_page_size_unit_millimeters=蠂喂位喂慰蟽蟿维
+document_properties_page_size_orientation_portrait=魏伪蟿伪魏蠈蟻蠀蠁伪
+document_properties_page_size_orientation_landscape=慰蟻喂味蠈谓蟿喂伪
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=螘蟺喂蟽蟿慰位萎
+document_properties_page_size_name_legal=韦蠉蟺慰蠀 Legal
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=韦伪蠂蔚委伪 蟺蟻慰尾慰位萎 喂蟽蟿慰蠉:
+document_properties_linearized_yes=螡伪喂
+document_properties_linearized_no=螌蠂喂
+document_properties_close=螝位蔚委蟽喂渭慰
+
+print_progress_message=螤蟻慰蔚蟿慰喂渭伪蟽委伪 蟿慰蠀 蔚纬纬蟻维蠁慰蠀 纬喂伪 蔚魏蟿蠉蟺蠅蟽畏鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=螁魏蠀蟻慰
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=(螒蟺)蔚谓蔚蟻纬慰蟺慰委畏蟽畏 蟺位蔚蠀蟻喂魏萎蟼 蟽蟿萎位畏蟼
+toggle_sidebar_notification.title=(螒蟺)蔚谓蔚蟻纬慰蟺慰委畏蟽畏 蟺位蔚蠀蟻喂魏萎蟼 蟽蟿萎位畏蟼 (蟿慰 苇纬纬蟻伪蠁慰 蟺蔚蟻喂苇蠂蔚喂 蟺蔚蟻委纬蟻伪渭渭伪/蟽蠀谓畏渭渭苇谓伪)
+toggle_sidebar_label=(螒蟺)蔚谓蔚蟻纬慰蟺慰委畏蟽畏 蟺位蔚蠀蟻喂魏萎蟼 蟽蟿萎位畏蟼
+document_outline.title=螘渭蠁维谓喂蟽畏 未喂维蟻胃蟻蠅蟽畏蟼 蔚纬纬蟻维蠁慰蠀 (未喂蟺位蠈 魏位喂魏 纬喂伪 伪谓维蟺蟿蠀尉畏/蟽蠉渭蟺蟿蠀尉畏 蠈位蠅谓 蟿蠅谓 蟽蟿慰喂蠂蔚委蠅谓)
+document_outline_label=螖喂维蟻胃蟻蠅蟽畏 蔚纬纬蟻维蠁慰蠀
+attachments.title=螤蟻慰尾慰位萎 蟽蠀谓畏渭渭苇谓蠅谓
+attachments_label=危蠀谓畏渭渭苇谓伪
+thumbs.title=螤蟻慰尾慰位萎 渭喂魏蟻慰纬蟻伪蠁喂蠋谓
+thumbs_label=螠喂魏蟻慰纬蟻伪蠁委蔚蟼
+findbar.title=螘蠉蟻蔚蟽畏 蟽蟿慰 苇纬纬蟻伪蠁慰
+findbar_label=螘蠉蟻蔚蟽畏
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=危蔚位委未伪 {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=螠喂魏蟻慰纬蟻伪蠁委伪 蟿畏蟼 蟽蔚位委未伪蟼 {{page}}
+
+# Find panel button title and messages
+find_input.title=螘蠉蟻蔚蟽畏
+find_input.placeholder=螘蠉蟻蔚蟽畏 蟽蟿慰 苇纬纬蟻伪蠁慰鈥�
+find_previous.title=螘蠉蟻蔚蟽畏 蟿畏蟼 蟺蟻慰畏纬慰蠉渭蔚谓畏蟼 蔚渭蠁维谓喂蟽畏蟼 蟿畏蟼 蠁蟻维蟽畏蟼
+find_previous_label=螤蟻慰畏纬慰蠉渭蔚谓慰
+find_next.title=螘蠉蟻蔚蟽畏 蟿畏蟼 蔚蟺蠈渭蔚谓畏蟼 蔚渭蠁维谓喂蟽畏蟼 蟿畏蟼 蠁蟻维蟽畏蟼
+find_next_label=螘蟺蠈渭蔚谓慰
+find_highlight=螘蟺喂蟽萎渭伪谓蟽畏 蠈位蠅谓
+find_match_case_label=韦伪委蟻喂伪蟽渭伪 蠂伪蟻伪魏蟿萎蟻伪
+find_entire_word_label=螣位蠈魏位畏蟻蔚蟼 位苇尉蔚喂蟼
+find_reached_top=螆位蔚蠀蟽畏 蟽蟿畏谓 伪蟻蠂萎 蟿慰蠀 蔚纬纬蟻维蠁慰蠀, 蟽蠀谓苇蠂蔚喂伪 伪蟺蠈 蟿慰 蟿苇位慰蟼
+find_reached_bottom=螆位蔚蠀蟽畏 蟽蟿慰 蟿苇位慰蟼 蟿慰蠀 蔚纬纬蟻维蠁慰蠀, 蟽蠀谓苇蠂蔚喂伪 伪蟺蠈 蟿畏谓 伪蟻蠂萎
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]={{current}} 伪蟺蠈 {{total}} 伪谓蟿喂蟽蟿慰喂蠂委伪
+find_match_count[two]={{current}} 伪蟺蠈 {{total}} 伪谓蟿喂蟽蟿慰喂蠂委蔚蟼
+find_match_count[few]={{current}} 伪蟺蠈 {{total}} 伪谓蟿喂蟽蟿慰喂蠂委蔚蟼
+find_match_count[many]={{current}} 伪蟺蠈 {{total}} 伪谓蟿喂蟽蟿慰喂蠂委蔚蟼
+find_match_count[other]={{current}} 伪蟺蠈 {{total}} 伪谓蟿喂蟽蟿慰喂蠂委蔚蟼
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]=螤蔚蟻喂蟽蟽蠈蟿蔚蟻蔚蟼 伪蟺蠈 {{limit}} 伪谓蟿喂蟽蟿慰喂蠂委蔚蟼
+find_match_count_limit[one]=螤蔚蟻喂蟽蟽蠈蟿蔚蟻蔚蟼 伪蟺蠈 {{limit}} 伪谓蟿喂蟽蟿慰喂蠂委伪
+find_match_count_limit[two]=螤蔚蟻喂蟽蟽蠈蟿蔚蟻蔚蟼 伪蟺蠈 {{limit}} 伪谓蟿喂蟽蟿慰喂蠂委蔚蟼
+find_match_count_limit[few]=螤蔚蟻喂蟽蟽蠈蟿蔚蟻蔚蟼 伪蟺蠈 {{limit}} 伪谓蟿喂蟽蟿慰喂蠂委蔚蟼
+find_match_count_limit[many]=螤蔚蟻喂蟽蟽蠈蟿蔚蟻蔚蟼 伪蟺蠈 {{limit}} 伪谓蟿喂蟽蟿慰喂蠂委蔚蟼
+find_match_count_limit[other]=螤蔚蟻喂蟽蟽蠈蟿蔚蟻蔚蟼 伪蟺蠈 {{limit}} 伪谓蟿喂蟽蟿慰喂蠂委蔚蟼
+find_not_found=螚 蠁蟻维蟽畏 未蔚谓 尾蟻苇胃畏魏蔚
+
+# Error panel labels
+error_more_info=螤蔚蟻喂蟽蟽蠈蟿蔚蟻蔚蟼 蟺位畏蟻慰蠁慰蟻委蔚蟼
+error_less_info=螞喂纬蠈蟿蔚蟻蔚蟼 蟺位畏蟻慰蠁慰蟻委蔚蟼
+error_close=螝位蔚委蟽喂渭慰
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=螠萎谓蠀渭伪: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=危蟿慰委尾伪: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=螒蟻蠂蔚委慰: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=螕蟻伪渭渭萎: {{line}}
+rendering_error=螤蟻慰苇魏蠀蠄蔚 蟽蠁维位渭伪 魏伪蟿维 蟿畏谓 伪谓维位蠀蟽畏 蟿畏蟼 蟽蔚位委未伪蟼.
+
+# Predefined zoom values
+page_scale_width=螤位维蟿慰蟼 蟽蔚位委未伪蟼
+page_scale_fit=螠苇纬蔚胃慰蟼 蟽蔚位委未伪蟼
+page_scale_auto=螒蠀蟿蠈渭伪蟿慰 味慰蠀渭
+page_scale_actual=螤蟻伪纬渭伪蟿喂魏蠈 渭苇纬蔚胃慰蟼
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=危蠁维位渭伪
+loading_error=螤蟻慰苇魏蠀蠄蔚 苇谓伪 蟽蠁维位渭伪 魏伪蟿维 蟿畏 蠁蠈蟻蟿蠅蟽畏 蟿慰蠀 PDF.
+invalid_file_error=螠畏 苇纬魏蠀蟻慰 萎 魏伪蟿蔚蟽蟿蟻伪渭渭苇谓慰 伪蟻蠂蔚委慰 PDF.
+missing_file_error=螞蔚委蟺蔚喂 伪蟻蠂蔚委慰 PDF.
+unexpected_response_error=螠畏 伪谓伪渭蔚谓蠈渭蔚谓畏 伪蟺蠈魏蟻喂蟽畏 伪蟺蠈 蟿慰 未喂伪魏慰渭喂蟽蟿萎.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} 危蠂蠈位喂慰]
+password_label=螘喂蟽伪纬蠅纬萎 魏蠅未喂魏慰蠉 纬喂伪 蟿慰 维谓慰喂纬渭伪 蟿慰蠀 PDF 伪蟻蠂蔚委慰蠀.
+password_invalid=螠畏 苇纬魏蠀蟻慰蟼 魏蠅未喂魏蠈蟼. 螤蟻慰蟽蟺伪胃蔚委蟽蟿蔚 尉伪谓维.
+password_ok=螣螝
+password_cancel=螒魏蠉蟻蠅蟽畏
+
+printing_not_supported=螤蟻慰蔚喂未慰蟺慰委畏蟽畏: 螚 蔚魏蟿蠉蟺蠅蟽畏 未蔚谓 蠀蟺慰蟽蟿畏蟻委味蔚蟿伪喂 蟺位萎蟻蠅蟼 伪蟺蠈 伪蠀蟿蠈谓 蟿慰谓 蟺蔚蟻喂畏纬畏蟿萎.
+printing_not_ready=螤蟻慰蔚喂未慰蟺慰委畏蟽畏: 韦慰 PDF 未蔚谓 蠁慰蟻蟿蠋胃畏魏蔚 蟺位萎蟻蠅蟼 纬喂伪 蔚魏蟿蠉蟺蠅蟽畏.
+web_fonts_disabled=螣喂 纬蟻伪渭渭伪蟿慰蟽蔚喂蟻苇蟼 Web 伪蟺蔚谓蔚蟻纬慰蟺慰喂畏渭苇谓蔚蟼: 伪未蠀谓伪渭委伪 蠂蟻萎蟽畏蟼 蟿蠅谓 蔚谓蟽蠅渭伪蟿蠅渭苇谓蠅谓 纬蟻伪渭渭伪蟿慰蟽蔚喂蟻蠋谓 PDF.
+document_colors_not_allowed=危蟿伪 PDF 苇纬纬蟻伪蠁伪 未蔚谓 蔚蟺喂蟿蟻苇蟺蔚蟿伪喂 谓伪 蠂蟻畏蟽喂渭慰蟺慰喂慰蠉谓 蟿伪 未喂魏维 蟿慰蠀蟼 蠂蟻蠋渭伪蟿伪: 韦慰 鈥溛澪� 蔚蟺喂蟿蟻苇蟺蔚蟿伪喂 蟽蟿喂蟼 蟽蔚位委未蔚蟼 谓伪 蔚蟺喂位苇纬慰蠀谓 蟿伪 未喂魏维 蟿慰蠀蟼 蠂蟻蠋渭伪蟿伪鈥� 蔚委谓伪喂 伪蟺蔚谓蔚蟻纬慰蟺慰喂畏渭苇谓慰 蟽蟿慰谓 蟺蔚蟻喂畏纬畏蟿萎.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/en-CA/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/en-CA/viewer.properties
new file mode 100644
index 0000000..ddc4213
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/en-CA/viewer.properties
@@ -0,0 +1,242 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Previous Page
+previous_label=Previous
+next.title=Next Page
+next_label=Next
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=Page
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=of {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} of {{pagesCount}})
+
+zoom_out.title=Zoom Out
+zoom_out_label=Zoom Out
+zoom_in.title=Zoom In
+zoom_in_label=Zoom In
+zoom.title=Zoom
+presentation_mode.title=Switch to Presentation Mode
+presentation_mode_label=Presentation Mode
+open_file.title=Open File
+open_file_label=Open
+print.title=Print
+print_label=Print
+download.title=Download
+download_label=Download
+bookmark.title=Current view (copy or open in new window)
+bookmark_label=Current View
+
+# Secondary toolbar and context menu
+tools.title=Tools
+tools_label=Tools
+first_page.title=Go to First Page
+first_page.label=Go to First Page
+first_page_label=Go to First Page
+last_page.title=Go to Last Page
+last_page.label=Go to Last Page
+last_page_label=Go to Last Page
+page_rotate_cw.title=Rotate Clockwise
+page_rotate_cw.label=Rotate Clockwise
+page_rotate_cw_label=Rotate Clockwise
+page_rotate_ccw.title=Rotate Anti-Clockwise
+page_rotate_ccw.label=Rotate Anti-Clockwise
+page_rotate_ccw_label=Rotate Anti-Clockwise
+
+cursor_text_select_tool.title=Enable Text Selection Tool
+cursor_text_select_tool_label=Text Selection Tool
+cursor_hand_tool.title=Enable Hand Tool
+cursor_hand_tool_label=Hand Tool
+
+scroll_vertical.title=Use Vertical Scrolling
+scroll_vertical_label=Vertical Scrolling
+scroll_horizontal.title=Use Horizontal Scrolling
+scroll_horizontal_label=Horizontal Scrolling
+scroll_wrapped.title=Use Wrapped Scrolling
+scroll_wrapped_label=Wrapped Scrolling
+
+spread_none.title=Do not join page spreads
+spread_none_label=No Spreads
+spread_odd.title=Join page spreads starting with odd-numbered pages
+spread_odd_label=Odd Spreads
+spread_even.title=Join page spreads starting with even-numbered pages
+spread_even_label=Even Spreads
+
+# Document properties dialog box
+document_properties.title=Document Properties鈥�
+document_properties_label=Document Properties鈥�
+document_properties_file_name=File name:
+document_properties_file_size=File size:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} kB ({{size_b}} bytes)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=Title:
+document_properties_author=Author:
+document_properties_subject=Subject:
+document_properties_keywords=Keywords:
+document_properties_creation_date=Creation Date:
+document_properties_modification_date=Modification Date:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Creator:
+document_properties_producer=PDF Producer:
+document_properties_version=PDF Version:
+document_properties_page_count=Page Count:
+document_properties_page_size=Page Size:
+document_properties_page_size_unit_inches=in
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=portrait
+document_properties_page_size_orientation_landscape=landscape
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Letter
+document_properties_page_size_name_legal=Legal
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=Fast Web View:
+document_properties_linearized_yes=Yes
+document_properties_linearized_no=No
+document_properties_close=Close
+
+print_progress_message=Preparing document for printing鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=Cancel
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Toggle Sidebar
+toggle_sidebar_notification.title=Toggle Sidebar (document contains outline/attachments)
+toggle_sidebar_label=Toggle Sidebar
+document_outline.title=Show Document Outline (double-click to expand/collapse all items)
+document_outline_label=Document Outline
+attachments.title=Show Attachments
+attachments_label=Attachments
+thumbs.title=Show Thumbnails
+thumbs_label=Thumbnails
+findbar.title=Find in Document
+findbar_label=Find
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Page {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Thumbnail of Page {{page}}
+
+# Find panel button title and messages
+find_input.title=Find
+find_input.placeholder=Find in document鈥�
+find_previous.title=Find the previous occurrence of the phrase
+find_previous_label=Previous
+find_next.title=Find the next occurrence of the phrase
+find_next_label=Next
+find_highlight=Highlight all
+find_match_case_label=Match case
+find_entire_word_label=Whole words
+find_reached_top=Reached top of document, continued from bottom
+find_reached_bottom=Reached end of document, continued from top
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]={{current}} of {{total}} match
+find_match_count[two]={{current}} of {{total}} matches
+find_match_count[few]={{current}} of {{total}} matches
+find_match_count[many]={{current}} of {{total}} matches
+find_match_count[other]={{current}} of {{total}} matches
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]=More than {{limit}} matches
+find_match_count_limit[one]=More than {{limit}} match
+find_match_count_limit[two]=More than {{limit}} matches
+find_match_count_limit[few]=More than {{limit}} matches
+find_match_count_limit[many]=More than {{limit}} matches
+find_match_count_limit[other]=More than {{limit}} matches
+find_not_found=Phrase not found
+
+# Error panel labels
+error_more_info=More Information
+error_less_info=Less Information
+error_close=Close
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Message: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stack: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=File: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Line: {{line}}
+rendering_error=An error occurred while rendering the page.
+
+# Predefined zoom values
+page_scale_width=Page Width
+page_scale_fit=Page Fit
+page_scale_auto=Automatic Zoom
+page_scale_actual=Actual Size
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Error
+loading_error=An error occurred while loading the PDF.
+invalid_file_error=Invalid or corrupted PDF file.
+missing_file_error=Missing PDF file.
+unexpected_response_error=Unexpected server response.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Annotation]
+password_label=Enter the password to open this PDF file.
+password_invalid=Invalid password. Please try again.
+password_ok=OK
+password_cancel=Cancel
+
+printing_not_supported=Warning: Printing is not fully supported by this browser.
+printing_not_ready=Warning: The PDF is not fully loaded for printing.
+web_fonts_disabled=Web fonts are disabled: unable to use embedded PDF fonts.
+document_colors_not_allowed=PDF documents are not allowed to use their own colours: 鈥淎llow pages to choose their own colours鈥� is deactivated in the browser.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/en-GB/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/en-GB/viewer.properties
new file mode 100644
index 0000000..a3e0bab
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/en-GB/viewer.properties
@@ -0,0 +1,184 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Previous Page
+previous_label=Previous
+next.title=Next Page
+next_label=Next
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=Page
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=of {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} of {{pagesCount}})
+
+zoom_out.title=Zoom Out
+zoom_out_label=Zoom Out
+zoom_in.title=Zoom In
+zoom_in_label=Zoom In
+zoom.title=Zoom
+presentation_mode.title=Switch to Presentation Mode
+presentation_mode_label=Presentation Mode
+open_file.title=Open File
+open_file_label=Open
+print.title=Print
+print_label=Print
+download.title=Download
+download_label=Download
+bookmark.title=Current view (copy or open in new window)
+bookmark_label=Current View
+
+# Secondary toolbar and context menu
+tools.title=Tools
+tools_label=Tools
+first_page.title=Go to First Page
+first_page.label=Go to First Page
+first_page_label=Go to First Page
+last_page.title=Go to Last Page
+last_page.label=Go to Last Page
+last_page_label=Go to Last Page
+page_rotate_cw.title=Rotate Clockwise
+page_rotate_cw.label=Rotate Clockwise
+page_rotate_cw_label=Rotate Clockwise
+page_rotate_ccw.title=Rotate Anti-Clockwise
+page_rotate_ccw.label=Rotate Anti-Clockwise
+page_rotate_ccw_label=Rotate Anti-Clockwise
+
+cursor_text_select_tool.title=Enable Text Selection Tool
+cursor_text_select_tool_label=Text Selection Tool
+cursor_hand_tool.title=Enable Hand Tool
+cursor_hand_tool_label=Hand Tool
+
+# Document properties dialog box
+document_properties.title=Document Properties鈥�
+document_properties_label=Document Properties鈥�
+document_properties_file_name=File name:
+document_properties_file_size=File size:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} kB ({{size_b}} bytes)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=Title:
+document_properties_author=Author:
+document_properties_subject=Subject:
+document_properties_keywords=Keywords:
+document_properties_creation_date=Creation Date:
+document_properties_modification_date=Modification Date:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Creator:
+document_properties_producer=PDF Producer:
+document_properties_version=PDF Version:
+document_properties_page_count=Page Count:
+document_properties_close=Close
+
+print_progress_message=Preparing document for printing鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=Cancel
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Toggle Sidebar
+toggle_sidebar_notification.title=Toggle Sidebar (document contains outline/attachments)
+toggle_sidebar_label=Toggle Sidebar
+document_outline.title=Show Document Outline (double-click to expand/collapse all items)
+document_outline_label=Document Outline
+attachments.title=Show Attachments
+attachments_label=Attachments
+thumbs.title=Show Thumbnails
+thumbs_label=Thumbnails
+findbar.title=Find in Document
+findbar_label=Find
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Page {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Thumbnail of Page {{page}}
+
+# Find panel button title and messages
+find_input.title=Find
+find_input.placeholder=Find in document鈥�
+find_previous.title=Find the previous occurrence of the phrase
+find_previous_label=Previous
+find_next.title=Find the next occurrence of the phrase
+find_next_label=Next
+find_highlight=Highlight all
+find_match_case_label=Match case
+find_reached_top=Reached top of document, continued from bottom
+find_reached_bottom=Reached end of document, continued from top
+find_not_found=Phrase not found
+
+# Error panel labels
+error_more_info=More Information
+error_less_info=Less Information
+error_close=Close
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Message: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stack: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=File: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Line: {{line}}
+rendering_error=An error occurred while rendering the page.
+
+# Predefined zoom values
+page_scale_width=Page Width
+page_scale_fit=Page Fit
+page_scale_auto=Automatic Zoom
+page_scale_actual=Actual Size
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Error
+loading_error=An error occurred while loading the PDF.
+invalid_file_error=Invalid or corrupted PDF file.
+missing_file_error=Missing PDF file.
+unexpected_response_error=Unexpected server response.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Annotation]
+password_label=Enter the password to open this PDF file.
+password_invalid=Invalid password. Please try again.
+password_ok=OK
+password_cancel=Cancel
+
+printing_not_supported=Warning: Printing is not fully supported by this browser.
+printing_not_ready=Warning: The PDF is not fully loaded for printing.
+web_fonts_disabled=Web fonts are disabled: unable to use embedded PDF fonts.
+document_colors_not_allowed=PDF documents are not allowed to use their own colours: 鈥淎llow pages to choose their own colours鈥� is deactivated in the browser.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/en-US/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/en-US/viewer.properties
new file mode 100644
index 0000000..22045e1
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/en-US/viewer.properties
@@ -0,0 +1,242 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Previous Page
+previous_label=Previous
+next.title=Next Page
+next_label=Next
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=Page
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=of {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} of {{pagesCount}})
+
+zoom_out.title=Zoom Out
+zoom_out_label=Zoom Out
+zoom_in.title=Zoom In
+zoom_in_label=Zoom In
+zoom.title=Zoom
+presentation_mode.title=Switch to Presentation Mode
+presentation_mode_label=Presentation Mode
+open_file.title=Open File
+open_file_label=Open
+print.title=Print
+print_label=Print
+download.title=Download
+download_label=Download
+bookmark.title=Current view (copy or open in new window)
+bookmark_label=Current View
+
+# Secondary toolbar and context menu
+tools.title=Tools
+tools_label=Tools
+first_page.title=Go to First Page
+first_page.label=Go to First Page
+first_page_label=Go to First Page
+last_page.title=Go to Last Page
+last_page.label=Go to Last Page
+last_page_label=Go to Last Page
+page_rotate_cw.title=Rotate Clockwise
+page_rotate_cw.label=Rotate Clockwise
+page_rotate_cw_label=Rotate Clockwise
+page_rotate_ccw.title=Rotate Counterclockwise
+page_rotate_ccw.label=Rotate Counterclockwise
+page_rotate_ccw_label=Rotate Counterclockwise
+
+cursor_text_select_tool.title=Enable Text Selection Tool
+cursor_text_select_tool_label=Text Selection Tool
+cursor_hand_tool.title=Enable Hand Tool
+cursor_hand_tool_label=Hand Tool
+
+scroll_vertical.title=Use Vertical Scrolling
+scroll_vertical_label=Vertical Scrolling
+scroll_horizontal.title=Use Horizontal Scrolling
+scroll_horizontal_label=Horizontal Scrolling
+scroll_wrapped.title=Use Wrapped Scrolling
+scroll_wrapped_label=Wrapped Scrolling
+
+spread_none.title=Do not join page spreads
+spread_none_label=No Spreads
+spread_odd.title=Join page spreads starting with odd-numbered pages
+spread_odd_label=Odd Spreads
+spread_even.title=Join page spreads starting with even-numbered pages
+spread_even_label=Even Spreads
+
+# Document properties dialog box
+document_properties.title=Document Properties鈥�
+document_properties_label=Document Properties鈥�
+document_properties_file_name=File name:
+document_properties_file_size=File size:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=Title:
+document_properties_author=Author:
+document_properties_subject=Subject:
+document_properties_keywords=Keywords:
+document_properties_creation_date=Creation Date:
+document_properties_modification_date=Modification Date:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Creator:
+document_properties_producer=PDF Producer:
+document_properties_version=PDF Version:
+document_properties_page_count=Page Count:
+document_properties_page_size=Page Size:
+document_properties_page_size_unit_inches=in
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=portrait
+document_properties_page_size_orientation_landscape=landscape
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Letter
+document_properties_page_size_name_legal=Legal
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=Fast Web View:
+document_properties_linearized_yes=Yes
+document_properties_linearized_no=No
+document_properties_close=Close
+
+print_progress_message=Preparing document for printing鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=Cancel
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Toggle Sidebar
+toggle_sidebar_notification.title=Toggle Sidebar (document contains outline/attachments)
+toggle_sidebar_label=Toggle Sidebar
+document_outline.title=Show Document Outline (double-click to expand/collapse all items)
+document_outline_label=Document Outline
+attachments.title=Show Attachments
+attachments_label=Attachments
+thumbs.title=Show Thumbnails
+thumbs_label=Thumbnails
+findbar.title=Find in Document
+findbar_label=Find
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Page {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Thumbnail of Page {{page}}
+
+# Find panel button title and messages
+find_input.title=Find
+find_input.placeholder=Find in document鈥�
+find_previous.title=Find the previous occurrence of the phrase
+find_previous_label=Previous
+find_next.title=Find the next occurrence of the phrase
+find_next_label=Next
+find_highlight=Highlight all
+find_match_case_label=Match case
+find_entire_word_label=Whole words
+find_reached_top=Reached top of document, continued from bottom
+find_reached_bottom=Reached end of document, continued from top
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]={{current}} of {{total}} match
+find_match_count[two]={{current}} of {{total}} matches
+find_match_count[few]={{current}} of {{total}} matches
+find_match_count[many]={{current}} of {{total}} matches
+find_match_count[other]={{current}} of {{total}} matches
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]=More than {{limit}} matches
+find_match_count_limit[one]=More than {{limit}} match
+find_match_count_limit[two]=More than {{limit}} matches
+find_match_count_limit[few]=More than {{limit}} matches
+find_match_count_limit[many]=More than {{limit}} matches
+find_match_count_limit[other]=More than {{limit}} matches
+find_not_found=Phrase not found
+
+# Error panel labels
+error_more_info=More Information
+error_less_info=Less Information
+error_close=Close
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Message: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stack: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=File: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Line: {{line}}
+rendering_error=An error occurred while rendering the page.
+
+# Predefined zoom values
+page_scale_width=Page Width
+page_scale_fit=Page Fit
+page_scale_auto=Automatic Zoom
+page_scale_actual=Actual Size
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Error
+loading_error=An error occurred while loading the PDF.
+invalid_file_error=Invalid or corrupted PDF file.
+missing_file_error=Missing PDF file.
+unexpected_response_error=Unexpected server response.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Annotation]
+password_label=Enter the password to open this PDF file.
+password_invalid=Invalid password. Please try again.
+password_ok=OK
+password_cancel=Cancel
+
+printing_not_supported=Warning: Printing is not fully supported by this browser.
+printing_not_ready=Warning: The PDF is not fully loaded for printing.
+web_fonts_disabled=Web fonts are disabled: unable to use embedded PDF fonts.
+document_colors_not_allowed=PDF documents are not allowed to use their own colors: 鈥淎llow pages to choose their own colors鈥� is deactivated in the browser.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/en-ZA/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/en-ZA/viewer.properties
new file mode 100644
index 0000000..832d558
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/en-ZA/viewer.properties
@@ -0,0 +1,170 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Previous Page
+previous_label=Previous
+next.title=Next Page
+next_label=Next
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=of {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+
+zoom_out.title=Zoom Out
+zoom_out_label=Zoom Out
+zoom_in.title=Zoom In
+zoom_in_label=Zoom In
+zoom.title=Zoom
+presentation_mode.title=Switch to Presentation Mode
+presentation_mode_label=Presentation Mode
+open_file.title=Open File
+open_file_label=Open
+print.title=Print
+print_label=Print
+download.title=Download
+download_label=Download
+bookmark.title=Current view (copy or open in new window)
+bookmark_label=Current View
+
+# Secondary toolbar and context menu
+tools.title=Tools
+tools_label=Tools
+first_page.title=Go to First Page
+first_page.label=Go to First Page
+first_page_label=Go to First Page
+last_page.title=Go to Last Page
+last_page.label=Go to Last Page
+last_page_label=Go to Last Page
+page_rotate_cw.title=Rotate Clockwise
+page_rotate_cw.label=Rotate Clockwise
+page_rotate_cw_label=Rotate Clockwise
+page_rotate_ccw.title=Rotate Counterclockwise
+page_rotate_ccw.label=Rotate Counterclockwise
+page_rotate_ccw_label=Rotate Counterclockwise
+
+
+# Document properties dialog box
+document_properties.title=Document Properties鈥�
+document_properties_label=Document Properties鈥�
+document_properties_file_name=File name:
+document_properties_file_size=File size:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=Title:
+document_properties_author=Author:
+document_properties_subject=Subject:
+document_properties_keywords=Keywords:
+document_properties_creation_date=Creation Date:
+document_properties_modification_date=Modification Date:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Creator:
+document_properties_producer=PDF Producer:
+document_properties_version=PDF Version:
+document_properties_page_count=Page Count:
+document_properties_close=Close
+
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Toggle Sidebar
+toggle_sidebar_label=Toggle Sidebar
+document_outline.title=Show Document Outline (double-click to expand/collapse all items)
+document_outline_label=Document Outline
+attachments.title=Show Attachments
+attachments_label=Attachments
+thumbs.title=Show Thumbnails
+thumbs_label=Thumbnails
+findbar.title=Find in Document
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Page {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Thumbnail of Page {{page}}
+
+# Find panel button title and messages
+find_previous.title=Find the previous occurrence of the phrase
+find_previous_label=Previous
+find_next.title=Find the next occurrence of the phrase
+find_next_label=Next
+find_highlight=Highlight all
+find_match_case_label=Match case
+find_reached_top=Reached top of document, continued from bottom
+find_reached_bottom=Reached end of document, continued from top
+find_not_found=Phrase not found
+
+# Error panel labels
+error_more_info=More Information
+error_less_info=Less Information
+error_close=Close
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Message: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stack: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=File: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Line: {{line}}
+rendering_error=An error occurred while rendering the page.
+
+# Predefined zoom values
+page_scale_width=Page Width
+page_scale_fit=Page Fit
+page_scale_auto=Automatic Zoom
+page_scale_actual=Actual Size
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Error
+loading_error=An error occurred while loading the PDF.
+invalid_file_error=Invalid or corrupted PDF file.
+missing_file_error=Missing PDF file.
+unexpected_response_error=Unexpected server response.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Annotation]
+password_label=Enter the password to open this PDF file.
+password_invalid=Invalid password. Please try again.
+password_ok=OK
+
+printing_not_supported=Warning: Printing is not fully supported by this browser.
+printing_not_ready=Warning: The PDF is not fully loaded for printing.
+web_fonts_disabled=Web fonts are disabled: unable to use embedded PDF fonts.
+document_colors_not_allowed=PDF documents are not allowed to use their own colours: 鈥淎llow pages to choose their own colours鈥� is deactivated in the browser.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/eo/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/eo/viewer.properties
new file mode 100644
index 0000000..04272e4
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/eo/viewer.properties
@@ -0,0 +1,242 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Anta怒a pa臐o
+previous_label=Malanta怒en
+next.title=Venonta pa臐o
+next_label=Anta怒en
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=Pa臐o
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=el {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} el {{pagesCount}})
+
+zoom_out.title=Malpligrandigi
+zoom_out_label=Malpligrandigi
+zoom_in.title=Pligrandigi
+zoom_in_label=Pligrandigi
+zoom.title=Pligrandigilo
+presentation_mode.title=Iri al prezenta re臐imo
+presentation_mode_label=Prezenta re臐imo
+open_file.title=Malfermi dosieron
+open_file_label=Malfermi
+print.title=Presi
+print_label=Presi
+download.title=El艥uti
+download_label=El艥uti
+bookmark.title=Nuna vido (kopii a怒 malfermi en nova fenestro)
+bookmark_label=Nuna vido
+
+# Secondary toolbar and context menu
+tools.title=Iloj
+tools_label=Iloj
+first_page.title=Iri al la unua pa臐o
+first_page.label=Iri al la unua pa臐o
+first_page_label=Iri al la unua pa臐o
+last_page.title=Iri al la lasta pa臐o
+last_page.label=Iri al la lasta pa臐o
+last_page_label=Iri al la lasta pa臐o
+page_rotate_cw.title=Rotaciigi dekstrume
+page_rotate_cw.label=Rotaciigi dekstrume
+page_rotate_cw_label=Rotaciigi dekstrume
+page_rotate_ccw.title=Rotaciigi maldekstrume
+page_rotate_ccw.label=Rotaciigi maldekstrume
+page_rotate_ccw_label=Rotaciigi maldekstrume
+
+cursor_text_select_tool.title=Aktivigi tekstan elektilon
+cursor_text_select_tool_label=Teksta elektilo
+cursor_hand_tool.title=Aktivigi ilon de mano
+cursor_hand_tool_label=Ilo de mano
+
+scroll_vertical.title=Uzi vertikalan 艥ovadon
+scroll_vertical_label=Vertikala 艥ovado
+scroll_horizontal.title=Uzi horizontalan 艥ovadon
+scroll_horizontal_label=Horizontala 艥ovado
+scroll_wrapped.title=Uzi amba怒direktan 艥ovadon
+scroll_wrapped_label=Amba怒direkta 艥ovado
+
+spread_none.title=Ne montri pa臐ojn po du
+spread_none_label=Unupa臐a vido
+spread_odd.title=Kunigi pa臐ojn komencante per nepara pa臐o
+spread_odd_label=Po du pa臐oj, neparaj maldekstre
+spread_even.title=Kunigi pa臐ojn komencante per para pa臐o
+spread_even_label=Po du pa臐oj, paraj maldekstre
+
+# Document properties dialog box
+document_properties.title=Atributoj de dokumento鈥�
+document_properties_label=Atributoj de dokumento鈥�
+document_properties_file_name=Nomo de dosiero:
+document_properties_file_size=Grando de dosiero:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KO ({{size_b}} oktetoj)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MO ({{size_b}} oktetoj)
+document_properties_title=Titolo:
+document_properties_author=A怒toro:
+document_properties_subject=Temo:
+document_properties_keywords=艤losilvorto:
+document_properties_creation_date=Dato de kreado:
+document_properties_modification_date=Dato de modifo:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Kreinto:
+document_properties_producer=Produktinto de PDF:
+document_properties_version=Versio de PDF:
+document_properties_page_count=Nombro de pa臐oj:
+document_properties_page_size=Grando de pa臐o:
+document_properties_page_size_unit_inches=in
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=vertikala
+document_properties_page_size_orientation_landscape=horizontala
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Letera
+document_properties_page_size_name_legal=Jura
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=Rapida teksta牡a vido:
+document_properties_linearized_yes=Jes
+document_properties_linearized_no=Ne
+document_properties_close=Fermi
+
+print_progress_message=Preparo de dokumento por presi 臐in 鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=Nuligi
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Montri/ka艥i flankan strion
+toggle_sidebar_notification.title=Montri/ka艥i flankan strion (la dokumento enhavas konturon/aneksa牡ojn)
+toggle_sidebar_label=Montri/ka艥i flankan strion
+document_outline.title=Montri la konturon de dokumento (alklaku duoble por faldi/malfaldi 膲iujn elementojn)
+document_outline_label=Konturo de dokumento
+attachments.title=Montri kunsenda牡ojn
+attachments_label=Kunsenda牡ojn
+thumbs.title=Montri miniaturojn
+thumbs_label=Miniaturoj
+findbar.title=Ser膲i en dokumento
+findbar_label=Ser膲i
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Pa臐o {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Miniaturo de pa臐o {{page}}
+
+# Find panel button title and messages
+find_input.title=Ser膲i
+find_input.placeholder=Ser膲i en dokumento鈥�
+find_previous.title=Ser膲i la anta怒an aperon de la frazo
+find_previous_label=Malanta怒en
+find_next.title=Ser膲i la venontan aperon de la frazo
+find_next_label=Anta怒en
+find_highlight=Elstarigi 膲iujn
+find_match_case_label=Distingi inter majuskloj kaj minuskloj
+find_entire_word_label=Tutaj vortoj
+find_reached_top=Komenco de la dokumento atingita, da怒rigado ekde la fino
+find_reached_bottom=Fino de la dokumento atingita, da怒rigado ekde la komenco
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]={{current}} el {{total}} kongruo
+find_match_count[two]={{current}} el {{total}} kongruoj
+find_match_count[few]={{current}} el {{total}} kongruoj
+find_match_count[many]={{current}} el {{total}} kongruoj
+find_match_count[other]={{current}} el {{total}} kongruoj
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]=Pli ol {{limit}} kongruoj
+find_match_count_limit[one]=Pli ol {{limit}} kongruo
+find_match_count_limit[two]=Pli ol {{limit}} kongruoj
+find_match_count_limit[few]=Pli ol {{limit}} kongruoj
+find_match_count_limit[many]=Pli ol {{limit}} kongruoj
+find_match_count_limit[other]=Pli ol {{limit}} kongruoj
+find_not_found=Frazo ne trovita
+
+# Error panel labels
+error_more_info=Pli da informo
+error_less_info=Malpli da informo
+error_close=Fermi
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Mesa臐o: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stako: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Dosiero: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Linio: {{line}}
+rendering_error=Okazis eraro dum la montro de la pa臐o.
+
+# Predefined zoom values
+page_scale_width=Lar臐o de pa臐o
+page_scale_fit=Adapti pa臐on
+page_scale_auto=A怒tomata skalo
+page_scale_actual=Reala grando
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Eraro
+loading_error=Okazis eraro dum la 艥argado de la PDF dosiero.
+invalid_file_error=Nevalida a怒 difektita PDF dosiero.
+missing_file_error=Mankas dosiero PDF.
+unexpected_response_error=Neatendita respondo de servilo.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[Prinoto: {{type}}]
+password_label=Tajpu pasvorton por malfermi tiun 膲i dosieron PDF.
+password_invalid=Nevalida pasvorto. Bonvolu provi denove.
+password_ok=Akcepti
+password_cancel=Nuligi
+
+printing_not_supported=Averto: tiu 膲i retumilo ne plene subtenas presadon.
+printing_not_ready=Averto: la PDF dosiero ne estas plene 艥argita por presado.
+web_fonts_disabled=Neaktivaj teksa牡aj tiparoj: ne elbas uzi enmetitajn tiparojn de PDF.
+document_colors_not_allowed=PDF dokumentoj ne rajtas uzi siajn proprajn kolorojn: 'Permesi al pa臐oj uzi siajn proprajn kolorojn' ne estas aktiva en la retumilo.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/es-AR/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/es-AR/viewer.properties
new file mode 100644
index 0000000..4ba3ddc
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/es-AR/viewer.properties
@@ -0,0 +1,242 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=P谩gina anterior
+previous_label=Anterior
+next.title=P谩gina siguiente
+next_label=Siguiente
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=P谩gina
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=de {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=( {{pageNumber}} de {{pagesCount}} )
+
+zoom_out.title=Alejar
+zoom_out_label=Alejar
+zoom_in.title=Acercar
+zoom_in_label=Acercar
+zoom.title=Zoom
+presentation_mode.title=Cambiar a modo presentaci贸n
+presentation_mode_label=Modo presentaci贸n
+open_file.title=Abrir archivo
+open_file_label=Abrir
+print.title=Imprimir
+print_label=Imprimir
+download.title=Descargar
+download_label=Descargar
+bookmark.title=Vista actual (copiar o abrir en nueva ventana)
+bookmark_label=Vista actual
+
+# Secondary toolbar and context menu
+tools.title=Herramientas
+tools_label=Herramientas
+first_page.title=Ir a primera p谩gina
+first_page.label=Ir a primera p谩gina
+first_page_label=Ir a primera p谩gina
+last_page.title=Ir a 煤ltima p谩gina
+last_page.label=Ir a 煤ltima p谩gina
+last_page_label=Ir a 煤ltima p谩gina
+page_rotate_cw.title=Rotar horario
+page_rotate_cw.label=Rotar horario
+page_rotate_cw_label=Rotar horario
+page_rotate_ccw.title=Rotar antihorario
+page_rotate_ccw.label=Rotar antihorario
+page_rotate_ccw_label=Rotar antihorario
+
+cursor_text_select_tool.title=Habilitar herramienta de selecci贸n de texto
+cursor_text_select_tool_label=Herramienta de selecci贸n de texto
+cursor_hand_tool.title=Habilitar herramienta mano
+cursor_hand_tool_label=Herramienta mano
+
+scroll_vertical.title=Usar desplazamiento vertical
+scroll_vertical_label=Desplazamiento vertical
+scroll_horizontal.title=Usar desplazamiento vertical
+scroll_horizontal_label=Desplazamiento horizontal
+scroll_wrapped.title=Usar desplazamiento encapsulado
+scroll_wrapped_label=Desplazamiento encapsulado
+
+spread_none.title=No unir p谩ginas dobles
+spread_none_label=Sin dobles
+spread_odd.title=Unir p谩ginas dobles comenzando con las impares
+spread_odd_label=Dobles impares
+spread_even.title=Unir p谩ginas dobles comenzando con las pares
+spread_even_label=Dobles pares
+
+# Document properties dialog box
+document_properties.title=Propiedades del documento鈥�
+document_properties_label=Propiedades del documento鈥�
+document_properties_file_name=Nombre de archivo:
+document_properties_file_size=Tama帽o de archovo:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=T铆tulo:
+document_properties_author=Autor:
+document_properties_subject=Asunto:
+document_properties_keywords=Palabras clave:
+document_properties_creation_date=Fecha de creaci贸n:
+document_properties_modification_date=Fecha de modificaci贸n:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Creador:
+document_properties_producer=PDF Productor:
+document_properties_version=Versi贸n de PDF:
+document_properties_page_count=Cantidad de p谩ginas:
+document_properties_page_size=Tama帽o de p谩gina:
+document_properties_page_size_unit_inches=en
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=normal
+document_properties_page_size_orientation_landscape=apaisado
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Carta
+document_properties_page_size_name_legal=Legal
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=Vista r谩pida de la Web:
+document_properties_linearized_yes=S铆
+document_properties_linearized_no=No
+document_properties_close=Cerrar
+
+print_progress_message=Preparando documento para imprimir鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=Cancelar
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Alternar barra lateral
+toggle_sidebar_notification.title=Intercambiar barra lateral (el documento contiene esquema/adjuntos)
+toggle_sidebar_label=Alternar barra lateral
+document_outline.title=Mostrar esquema del documento (doble clic para expandir/colapsar todos los 铆tems)
+document_outline_label=Esquema del documento
+attachments.title=Mostrar adjuntos
+attachments_label=Adjuntos
+thumbs.title=Mostrar miniaturas
+thumbs_label=Miniaturas
+findbar.title=Buscar en documento
+findbar_label=Buscar
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=P谩gina {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Miniatura de p谩gina {{page}}
+
+# Find panel button title and messages
+find_input.title=Buscar
+find_input.placeholder=Buscar en documento鈥�
+find_previous.title=Buscar la aparici贸n anterior de la frase
+find_previous_label=Anterior
+find_next.title=Buscar la siguiente aparici贸n de la frase
+find_next_label=Siguiente
+find_highlight=Resaltar todo
+find_match_case_label=Coincidir may煤sculas
+find_entire_word_label=Palabras completas
+find_reached_top=Inicio de documento alcanzado, continuando desde abajo
+find_reached_bottom=Fin de documento alcanzando, continuando desde arriba
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]={{current}} de {{total}} coincidencias
+find_match_count[two]={{current}} de {{total}} coincidencias
+find_match_count[few]={{current}} de {{total}} coincidencias
+find_match_count[many]={{current}} de {{total}} coincidencias
+find_match_count[other]={{current}} de {{total}} coincidencias
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]=M谩s de {{limit}} coincidencias
+find_match_count_limit[one]=M谩s de {{limit}} coinciden
+find_match_count_limit[two]=M谩s de {{limit}} coincidencias
+find_match_count_limit[few]=M谩s de {{limit}} coincidencias
+find_match_count_limit[many]=M谩s de {{limit}} coincidencias
+find_match_count_limit[other]=M谩s de {{limit}} coincidencias
+find_not_found=Frase no encontrada
+
+# Error panel labels
+error_more_info=M谩s informaci贸n
+error_less_info=Menos informaci贸n
+error_close=Cerrar
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Mensaje: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Pila: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Archivo: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=L铆nea: {{line}}
+rendering_error=Ocurri贸 un error al dibujar la p谩gina.
+
+# Predefined zoom values
+page_scale_width=Ancho de p谩gina
+page_scale_fit=Ajustar p谩gina
+page_scale_auto=Zoom autom谩tico
+page_scale_actual=Tama帽o real
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Error
+loading_error=Ocurri贸 un error al cargar el PDF.
+invalid_file_error=Archivo PDF no v谩lido o cocrrupto.
+missing_file_error=Archivo PDF faltante.
+unexpected_response_error=Respuesta del servidor inesperada.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Anotaci贸n]
+password_label=Ingrese la contrase帽a para abrir este archivo PDF
+password_invalid=Contrase帽a inv谩lida. Intente nuevamente.
+password_ok=Aceptar
+password_cancel=Cancelar
+
+printing_not_supported=Advertencia: La impresi贸n no est谩 totalmente soportada por este navegador.
+printing_not_ready=Advertencia: El PDF no est谩 completamente cargado para impresi贸n.
+web_fonts_disabled=Tipograf铆a web deshabilitada: no se pueden usar tipos incrustados en PDF.
+document_colors_not_allowed=Los documentos PDF no tienen permitido usar sus propios colores: 'Permitir a las p谩ginas elegir sus propios colores' est谩 desactivado en el navegador.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/es-CL/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/es-CL/viewer.properties
new file mode 100644
index 0000000..b73dab4
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/es-CL/viewer.properties
@@ -0,0 +1,242 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=P谩gina anterior
+previous_label=Anterior
+next.title=P谩gina siguiente
+next_label=Siguiente
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=P谩gina
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=de {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} de {{pagesCount}})
+
+zoom_out.title=Alejar
+zoom_out_label=Alejar
+zoom_in.title=Acercar
+zoom_in_label=Acercar
+zoom.title=Ampliaci贸n
+presentation_mode.title=Cambiar al modo de presentaci贸n
+presentation_mode_label=Modo de presentaci贸n
+open_file.title=Abrir archivo
+open_file_label=Abrir
+print.title=Imprimir
+print_label=Imprimir
+download.title=Descargar
+download_label=Descargar
+bookmark.title=Vista actual (copiar o abrir en nueva ventana)
+bookmark_label=Vista actual
+
+# Secondary toolbar and context menu
+tools.title=Herramientas
+tools_label=Herramientas
+first_page.title=Ir a la primera p谩gina
+first_page.label=Ir a la primera p谩gina
+first_page_label=Ir a la primera p谩gina
+last_page.title=Ir a la 煤ltima p谩gina
+last_page.label=Ir a la 煤ltima p谩gina
+last_page_label=Ir a la 煤ltima p谩gina
+page_rotate_cw.title=Girar a la derecha
+page_rotate_cw.label=Girar a la derecha
+page_rotate_cw_label=Girar a la derecha
+page_rotate_ccw.title=Girar a la izquierda
+page_rotate_ccw.label=Girar a la izquierda
+page_rotate_ccw_label=Girar a la izquierda
+
+cursor_text_select_tool.title=Activar la herramienta de selecci贸n de texto
+cursor_text_select_tool_label=Herramienta de selecci贸n de texto
+cursor_hand_tool.title=Activar la herramienta de mano
+cursor_hand_tool_label=Herramienta de mano
+
+scroll_vertical.title=Usar desplazamiento vertical
+scroll_vertical_label=Desplazamiento vertical
+scroll_horizontal.title=Usar desplazamiento horizontal
+scroll_horizontal_label=Desplazamiento horizontal
+scroll_wrapped.title=Usar desplazamiento en bloque
+scroll_wrapped_label=Desplazamiento en bloque
+
+spread_none.title=No juntar p谩ginas a modo de libro
+spread_none_label=Vista de una p谩gina
+spread_odd.title=Junta las p谩ginas partiendo con una de n煤mero impar
+spread_odd_label=Vista de libro impar
+spread_even.title=Junta las p谩ginas partiendo con una de n煤mero par
+spread_even_label=Vista de libro par
+
+# Document properties dialog box
+document_properties.title=Propiedades del documento鈥�
+document_properties_label=Propiedades del documento鈥�
+document_properties_file_name=Nombre de archivo:
+document_properties_file_size=Tama帽o del archivo:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=T铆tulo:
+document_properties_author=Autor:
+document_properties_subject=Asunto:
+document_properties_keywords=Palabras clave:
+document_properties_creation_date=Fecha de creaci贸n:
+document_properties_modification_date=Fecha de modificaci贸n:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Creador:
+document_properties_producer=Productor del PDF:
+document_properties_version=Versi贸n de PDF:
+document_properties_page_count=Cantidad de p谩ginas:
+document_properties_page_size=Tama帽o de la p谩gina:
+document_properties_page_size_unit_inches=in
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=vertical
+document_properties_page_size_orientation_landscape=horizontal
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Carta
+document_properties_page_size_name_legal=Oficio
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=Vista r谩pida en Web:
+document_properties_linearized_yes=S铆
+document_properties_linearized_no=No
+document_properties_close=Cerrar
+
+print_progress_message=Preparando documento para impresi贸n鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=Cancelar
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Barra lateral
+toggle_sidebar_notification.title=Cambiar barra lateral (铆ndice de contenidos del documento/adjuntos)
+toggle_sidebar_label=Mostrar u ocultar la barra lateral
+document_outline.title=Mostrar esquema del documento (doble clic para expandir/contraer todos los elementos)
+document_outline_label=Esquema del documento
+attachments.title=Mostrar adjuntos
+attachments_label=Adjuntos
+thumbs.title=Mostrar miniaturas
+thumbs_label=Miniaturas
+findbar.title=Buscar en el documento
+findbar_label=Buscar
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=P谩gina {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Miniatura de la p谩gina {{page}}
+
+# Find panel button title and messages
+find_input.title=Encontrar
+find_input.placeholder=Encontrar en el documento鈥�
+find_previous.title=Buscar la aparici贸n anterior de la frase
+find_previous_label=Previo
+find_next.title=Buscar la siguiente aparici贸n de la frase
+find_next_label=Siguiente
+find_highlight=Destacar todos
+find_match_case_label=Coincidir may煤s./min煤s.
+find_entire_word_label=Palabras completas
+find_reached_top=Se alcanz贸 el inicio del documento, continuando desde el final
+find_reached_bottom=Se alcanz贸 el final del documento, continuando desde el inicio
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]={{current}} de {{total}} coincidencia
+find_match_count[two]={{current}} de {{total}} coincidencias
+find_match_count[few]={{current}} de {{total}} coincidencias
+find_match_count[many]={{current}} de {{total}} coincidencias
+find_match_count[other]={{current}} de {{total}} coincidencias
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]=M谩s de {{limit}} coincidencias
+find_match_count_limit[one]=M谩s de {{limit}} coincidencia
+find_match_count_limit[two]=M谩s de {{limit}} coincidencias
+find_match_count_limit[few]=M谩s de {{limit}} coincidencias
+find_match_count_limit[many]=M谩s de {{limit}} coincidencias
+find_match_count_limit[other]=M谩s de {{limit}} coincidencias
+find_not_found=Frase no encontrada
+
+# Error panel labels
+error_more_info=M谩s informaci贸n
+error_less_info=Menos informaci贸n
+error_close=Cerrar
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (compilaci贸n: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Mensaje: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Pila: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Archivo: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=L铆nea: {{line}}
+rendering_error=Ha ocurrido un error al renderizar la p谩gina.
+
+# Predefined zoom values
+page_scale_width=Ancho de p谩gina
+page_scale_fit=Ajuste de p谩gina
+page_scale_auto=Aumento autom谩tico
+page_scale_actual=Tama帽o actual
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Error
+loading_error=Ha ocurrido un error al cargar el PDF.
+invalid_file_error=Archivo PDF inv谩lido o corrupto.
+missing_file_error=Falta el archivo PDF.
+unexpected_response_error=Respuesta del servidor inesperada.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Anotaci贸n]
+password_label=Ingrese la contrase帽a para abrir este archivo PDF.
+password_invalid=Contrase帽a inv谩lida. Por favor, vuelve a intentarlo.
+password_ok=Aceptar
+password_cancel=Cancelar
+
+printing_not_supported=Advertencia: Imprimir no est谩 soportado completamente por este navegador.
+printing_not_ready=Advertencia: El PDF no est谩 completamente cargado para ser impreso.
+web_fonts_disabled=Las tipograf铆as web est谩n desactivadas: imposible usar las fuentes PDF embebidas.
+document_colors_not_allowed=Los documentos PDF no tienen permitido usar sus propios colores: 'Permitir a las p谩ginas elegir sus propios colores' est谩 desactivado en el navegador.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/es-ES/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/es-ES/viewer.properties
new file mode 100644
index 0000000..e1af4d0
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/es-ES/viewer.properties
@@ -0,0 +1,242 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=P谩gina anterior
+previous_label=Anterior
+next.title=P谩gina siguiente
+next_label=Siguiente
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=P谩gina
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=de {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} de {{pagesCount}})
+
+zoom_out.title=Reducir
+zoom_out_label=Reducir
+zoom_in.title=Aumentar
+zoom_in_label=Aumentar
+zoom.title=Tama帽o
+presentation_mode.title=Cambiar al modo presentaci贸n
+presentation_mode_label=Modo presentaci贸n
+open_file.title=Abrir archivo
+open_file_label=Abrir
+print.title=Imprimir
+print_label=Imprimir
+download.title=Descargar
+download_label=Descargar
+bookmark.title=Vista actual (copiar o abrir en una nueva ventana)
+bookmark_label=Vista actual
+
+# Secondary toolbar and context menu
+tools.title=Herramientas
+tools_label=Herramientas
+first_page.title=Ir a la primera p谩gina
+first_page.label=Ir a la primera p谩gina
+first_page_label=Ir a la primera p谩gina
+last_page.title=Ir a la 煤ltima p谩gina
+last_page.label=Ir a la 煤ltima p谩gina
+last_page_label=Ir a la 煤ltima p谩gina
+page_rotate_cw.title=Rotar en sentido horario
+page_rotate_cw.label=Rotar en sentido horario
+page_rotate_cw_label=Rotar en sentido horario
+page_rotate_ccw.title=Rotar en sentido antihorario
+page_rotate_ccw.label=Rotar en sentido antihorario
+page_rotate_ccw_label=Rotar en sentido antihorario
+
+cursor_text_select_tool.title=Activar herramienta de selecci贸n de texto
+cursor_text_select_tool_label=Herramienta de selecci贸n de texto
+cursor_hand_tool.title=Activar herramienta de mano
+cursor_hand_tool_label=Herramienta de mano
+
+scroll_vertical.title=Usar desplazamiento vertical
+scroll_vertical_label=Desplazamiento vertical
+scroll_horizontal.title=Usar desplazamiento horizontal
+scroll_horizontal_label=Desplazamiento horizontal
+scroll_wrapped.title=Usar desplazamiento en bloque
+scroll_wrapped_label=Desplazamiento en bloque
+
+spread_none.title=No juntar p谩ginas en vista de libro
+spread_none_label=Vista de libro
+spread_odd.title=Juntar las p谩ginas partiendo de una con n煤mero impar
+spread_odd_label=Vista de libro impar
+spread_even.title=Juntar las p谩ginas partiendo de una con n煤mero par
+spread_even_label=Vista de libro par
+
+# Document properties dialog box
+document_properties.title=Propiedades del documento鈥�
+document_properties_label=Propiedades del documento鈥�
+document_properties_file_name=Nombre de archivo:
+document_properties_file_size=Tama帽o de archivo:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=T铆tulo:
+document_properties_author=Autor:
+document_properties_subject=Asunto:
+document_properties_keywords=Palabras clave:
+document_properties_creation_date=Fecha de creaci贸n:
+document_properties_modification_date=Fecha de modificaci贸n:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Creador:
+document_properties_producer=Productor PDF:
+document_properties_version=Versi贸n PDF:
+document_properties_page_count=N煤mero de p谩ginas:
+document_properties_page_size=Tama帽o de la p谩gina:
+document_properties_page_size_unit_inches=in
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=vertical
+document_properties_page_size_orientation_landscape=horizontal
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Carta
+document_properties_page_size_name_legal=Legal
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=Vista r谩pida de la web:
+document_properties_linearized_yes=S铆
+document_properties_linearized_no=No
+document_properties_close=Cerrar
+
+print_progress_message=Preparando documento para impresi贸n鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=Cancelar
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Cambiar barra lateral
+toggle_sidebar_notification.title=Alternar panel lateral (el documento contiene un esquema o adjuntos)
+toggle_sidebar_label=Cambiar barra lateral
+document_outline.title=Mostrar resumen del documento (doble clic para expandir/contraer todos los elementos)
+document_outline_label=Resumen de documento
+attachments.title=Mostrar adjuntos
+attachments_label=Adjuntos
+thumbs.title=Mostrar miniaturas
+thumbs_label=Miniaturas
+findbar.title=Buscar en el documento
+findbar_label=Buscar
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=P谩gina {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Miniatura de la p谩gina {{page}}
+
+# Find panel button title and messages
+find_input.title=Buscar
+find_input.placeholder=Buscar en el documento鈥�
+find_previous.title=Encontrar la anterior aparici贸n de la frase
+find_previous_label=Anterior
+find_next.title=Encontrar la siguiente aparici贸n de esta frase
+find_next_label=Siguiente
+find_highlight=Resaltar todos
+find_match_case_label=Coincidencia de may煤s./min煤s.
+find_entire_word_label=Palabras completas
+find_reached_top=Se alcanz贸 el inicio del documento, se contin煤a desde el final
+find_reached_bottom=Se alcanz贸 el final del documento, se contin煤a desde el inicio
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]={{current}} de {{total}} coincidencia
+find_match_count[two]={{current}} de {{total}} coincidencias
+find_match_count[few]={{current}} de {{total}} coincidencias
+find_match_count[many]={{current}} de {{total}} coincidencias
+find_match_count[other]={{current}} de {{total}} coincidencias
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]=M谩s de {{limit}} coincidencias
+find_match_count_limit[one]=M谩s de {{limit}} coincidencia
+find_match_count_limit[two]=M谩s de {{limit}} coincidencias
+find_match_count_limit[few]=M谩s de {{limit}} coincidencias
+find_match_count_limit[many]=M谩s de {{limit}} coincidencias
+find_match_count_limit[other]=M谩s de {{limit}} coincidencias
+find_not_found=Frase no encontrada
+
+# Error panel labels
+error_more_info=M谩s informaci贸n
+error_less_info=Menos informaci贸n
+error_close=Cerrar
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Mensaje: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Pila: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Archivo: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=L铆nea: {{line}}
+rendering_error=Ocurri贸 un error al renderizar la p谩gina.
+
+# Predefined zoom values
+page_scale_width=Anchura de la p谩gina
+page_scale_fit=Ajuste de la p谩gina
+page_scale_auto=Tama帽o autom谩tico
+page_scale_actual=Tama帽o real
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Error
+loading_error=Ocurri贸 un error al cargar el PDF.
+invalid_file_error=Fichero PDF no v谩lido o corrupto.
+missing_file_error=No hay fichero PDF.
+unexpected_response_error=Respuesta inesperada del servidor.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[Anotaci贸n {{type}}]
+password_label=Introduzca la contrase帽a para abrir este archivo PDF.
+password_invalid=Contrase帽a no v谩lida. Vuelva a intentarlo.
+password_ok=Aceptar
+password_cancel=Cancelar
+
+printing_not_supported=Advertencia: Imprimir no est谩 totalmente soportado por este navegador.
+printing_not_ready=Advertencia: Este PDF no se ha cargado completamente para poder imprimirse.
+web_fonts_disabled=Las tipograf铆as web est谩n desactivadas: es imposible usar las tipograf铆as PDF embebidas.
+document_colors_not_allowed=Los documentos PDF no tienen permitido usar sus propios colores: 'Permitir a las p谩ginas elegir sus propios colores' est谩 desactivado en el navegador.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/es-MX/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/es-MX/viewer.properties
new file mode 100644
index 0000000..211b19e
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/es-MX/viewer.properties
@@ -0,0 +1,242 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=P谩gina anterior
+previous_label=Anterior
+next.title=P谩gina siguiente
+next_label=Siguiente
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=P谩gina
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=de {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} de {{pagesCount}})
+
+zoom_out.title=Reducir
+zoom_out_label=Reducir
+zoom_in.title=Aumentar
+zoom_in_label=Aumentar
+zoom.title=Zoom
+presentation_mode.title=Cambiar al modo presentaci贸n
+presentation_mode_label=Modo presentaci贸n
+open_file.title=Abrir archivo
+open_file_label=Abrir
+print.title=Imprimir
+print_label=Imprimir
+download.title=Descargar
+download_label=Descargar
+bookmark.title=Vista actual (copiar o abrir en una nueva ventana)
+bookmark_label=Vista actual
+
+# Secondary toolbar and context menu
+tools.title=Herramientas
+tools_label=Herramientas
+first_page.title=Ir a la primera p谩gina
+first_page.label=Ir a la primera p谩gina
+first_page_label=Ir a la primera p谩gina
+last_page.title=Ir a la 煤ltima p谩gina
+last_page.label=Ir a la 煤ltima p谩gina
+last_page_label=Ir a la 煤ltima p谩gina
+page_rotate_cw.title=Girar a la derecha
+page_rotate_cw.label=Girar a la derecha
+page_rotate_cw_label=Girar a la derecha
+page_rotate_ccw.title=Girar a la izquierda
+page_rotate_ccw.label=Girar a la izquierda
+page_rotate_ccw_label=Girar a la izquierda
+
+cursor_text_select_tool.title=Activar la herramienta de selecci贸n de texto
+cursor_text_select_tool_label=Herramienta de selecci贸n de texto
+cursor_hand_tool.title=Activar la herramienta de mano
+cursor_hand_tool_label=Herramienta de mano
+
+scroll_vertical.title=Usar desplazamiento vertical
+scroll_vertical_label=Desplazamiento vertical
+scroll_horizontal.title=Usar desplazamiento horizontal
+scroll_horizontal_label=Desplazamiento horizontal
+scroll_wrapped.title=Usar desplazamiento encapsulado
+scroll_wrapped_label=Desplazamiento encapsulado
+
+spread_none.title=No unir p谩ginas separadas
+spread_none_label=Vista de una p谩gina
+spread_odd.title=Unir las p谩ginas partiendo con una de n煤mero impar
+spread_odd_label=Vista de libro impar
+spread_even.title=Juntar las p谩ginas partiendo con una de n煤mero par
+spread_even_label=Vista de libro par
+
+# Document properties dialog box
+document_properties.title=Propiedades del documento鈥�
+document_properties_label=Propiedades del documento鈥�
+document_properties_file_name=Nombre del archivo:
+document_properties_file_size=Tama帽o del archivo:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=T铆tulo:
+document_properties_author=Autor:
+document_properties_subject=Asunto:
+document_properties_keywords=Palabras claves:
+document_properties_creation_date=Fecha de creaci贸n:
+document_properties_modification_date=Fecha de modificaci贸n:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Creador:
+document_properties_producer=Productor PDF:
+document_properties_version=Versi贸n PDF:
+document_properties_page_count=N煤mero de p谩ginas:
+document_properties_page_size=Tama帽o de la p谩gina:
+document_properties_page_size_unit_inches=in
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=vertical
+document_properties_page_size_orientation_landscape=horizontal
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Carta
+document_properties_page_size_name_legal=Oficio
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=Vista r谩pida de la web:
+document_properties_linearized_yes=S铆
+document_properties_linearized_no=No
+document_properties_close=Cerrar
+
+print_progress_message=Preparando documento para impresi贸n鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=Cancelar
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Cambiar barra lateral
+toggle_sidebar_notification.title=Cambiar barra lateral (铆ndice de contenidos del documento/adjuntos)
+toggle_sidebar_label=Cambiar barra lateral
+document_outline.title=Mostrar esquema del documento (doble clic para expandir/contraer todos los elementos)
+document_outline_label=Esquema del documento
+attachments.title=Mostrar adjuntos
+attachments_label=Adjuntos
+thumbs.title=Mostrar miniaturas
+thumbs_label=Miniaturas
+findbar.title=Buscar en el documento
+findbar_label=Buscar
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=P谩gina {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Miniatura de la p谩gina {{page}}
+
+# Find panel button title and messages
+find_input.title=Buscar
+find_input.placeholder=Buscar en el documento鈥�
+find_previous.title=Ir a la anterior frase encontrada
+find_previous_label=Anterior
+find_next.title=Ir a la siguiente frase encontrada
+find_next_label=Siguiente
+find_highlight=Resaltar todo
+find_match_case_label=Coincidir con may煤sculas y min煤sculas
+find_entire_word_label=Palabras completas
+find_reached_top=Se alcanz贸 el inicio del documento, se buscar谩 al final
+find_reached_bottom=Se alcanz贸 el final del documento, se buscar谩 al inicio
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]={{current}} de {{total}} coincidencia
+find_match_count[two]={{current}} de {{total}} coincidencias
+find_match_count[few]={{current}} de {{total}} coincidencias
+find_match_count[many]={{current}} de {{total}} coincidencias
+find_match_count[other]={{current}} de {{total}} coincidencias
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]=M谩s de {{limit}} coincidencias
+find_match_count_limit[one]=M谩s de {{limit}} coinciden
+find_match_count_limit[two]=M谩s de {{limit}} coincidencias
+find_match_count_limit[few]=M谩s de {{limit}} coincidencias
+find_match_count_limit[many]=M谩s de {{limit}} coincidencias
+find_match_count_limit[other]=M谩s de {{limit}} coincidencias
+find_not_found=No se encontr贸 la frase
+
+# Error panel labels
+error_more_info=M谩s informaci贸n
+error_less_info=Menos informaci贸n
+error_close=Cerrar
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Mensaje: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Pila: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Archivo: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=L铆nea: {{line}}
+rendering_error=Un error ocurri贸 al renderizar la p谩gina.
+
+# Predefined zoom values
+page_scale_width=Ancho de p谩gina
+page_scale_fit=Ajustar p谩gina
+page_scale_auto=Zoom autom谩tico
+page_scale_actual=Tama帽o real
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Error
+loading_error=Un error ocurri贸 al cargar el PDF.
+invalid_file_error=Archivo PDF invalido o da帽ado.
+missing_file_error=Archivo PDF no encontrado.
+unexpected_response_error=Respuesta inesperada del servidor.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} anotaci贸n]
+password_label=Ingresa la contrase帽a para abrir este archivo PDF.
+password_invalid=Contrase帽a inv谩lida. Por favor intenta de nuevo.
+password_ok=Aceptar
+password_cancel=Cancelar
+
+printing_not_supported=Advertencia: La impresi贸n no esta completamente soportada por este navegador.
+printing_not_ready=Advertencia: El PDF no cargo completamente para impresi贸n.
+web_fonts_disabled=Las fuentes web est谩n desactivadas: es imposible usar las fuentes PDF embebidas.
+document_colors_not_allowed=Los documentos PDF no tienen permiso de usar sus propios colores: 'Permitir que las p谩ginas elijan sus propios colores' esta desactivada en el navegador.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/et/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/et/viewer.properties
new file mode 100644
index 0000000..46dd2da
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/et/viewer.properties
@@ -0,0 +1,242 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Eelmine lehek眉lg
+previous_label=Eelmine
+next.title=J盲rgmine lehek眉lg
+next_label=J盲rgmine
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=Leht
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=/ {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}}/{{pagesCount}})
+
+zoom_out.title=V盲henda
+zoom_out_label=V盲henda
+zoom_in.title=Suurenda
+zoom_in_label=Suurenda
+zoom.title=Suurendamine
+presentation_mode.title=L眉litu esitlusre啪iimi
+presentation_mode_label=Esitlusre啪iim
+open_file.title=Ava fail
+open_file_label=Ava
+print.title=Prindi
+print_label=Prindi
+download.title=Laadi alla
+download_label=Laadi alla
+bookmark.title=Praegune vaade (kopeeri v玫i ava uues aknas)
+bookmark_label=Praegune vaade
+
+# Secondary toolbar and context menu
+tools.title=T枚枚riistad
+tools_label=T枚枚riistad
+first_page.title=Mine esimesele lehek眉ljele
+first_page.label=Mine esimesele lehek眉ljele
+first_page_label=Mine esimesele lehek眉ljele
+last_page.title=Mine viimasele lehek眉ljele
+last_page.label=Mine viimasele lehek眉ljele
+last_page_label=Mine viimasele lehek眉ljele
+page_rotate_cw.title=P枚枚ra p盲rip盲eva
+page_rotate_cw.label=P枚枚ra p盲rip盲eva
+page_rotate_cw_label=P枚枚ra p盲rip盲eva
+page_rotate_ccw.title=P枚枚ra vastup盲eva
+page_rotate_ccw.label=P枚枚ra vastup盲eva
+page_rotate_ccw_label=P枚枚ra vastup盲eva
+
+cursor_text_select_tool.title=Luba teksti valimise t枚枚riist
+cursor_text_select_tool_label=Teksti valimise t枚枚riist
+cursor_hand_tool.title=Luba sirvimist枚枚riist
+cursor_hand_tool_label=Sirvimist枚枚riist
+
+scroll_vertical.title=Kasuta vertikaalset kerimist
+scroll_vertical_label=Vertikaalne kerimine
+scroll_horizontal.title=Kasuta horisontaalset kerimist
+scroll_horizontal_label=Horisontaalne kerimine
+scroll_wrapped.title=Kasuta rohkem mahutavat kerimist
+scroll_wrapped_label=Rohkem mahutav kerimine
+
+spread_none.title=脛ra k玫rvuta lehek眉lgi
+spread_none_label=Lehtede k玫rvutamine puudub
+spread_odd.title=K玫rvuta lehek眉ljed, alustades paaritute numbritega lehek眉lgedega
+spread_odd_label=K玫rvutamine paaritute numbritega alustades
+spread_even.title=K玫rvuta lehek眉ljed, alustades paarisnumbritega lehek眉lgedega
+spread_even_label=K玫rvutamine paarisnumbritega alustades
+
+# Document properties dialog box
+document_properties.title=Dokumendi omadused鈥�
+document_properties_label=Dokumendi omadused鈥�
+document_properties_file_name=Faili nimi:
+document_properties_file_size=Faili suurus:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KiB ({{size_b}} baiti)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MiB ({{size_b}} baiti)
+document_properties_title=Pealkiri:
+document_properties_author=Autor:
+document_properties_subject=Teema:
+document_properties_keywords=M盲rks玫nad:
+document_properties_creation_date=Loodud:
+document_properties_modification_date=Muudetud:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}} {{time}}
+document_properties_creator=Looja:
+document_properties_producer=Generaator:
+document_properties_version=Generaatori versioon:
+document_properties_page_count=Lehek眉lgi:
+document_properties_page_size=Lehe suurus:
+document_properties_page_size_unit_inches=tolli
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=vertikaalpaigutus
+document_properties_page_size_orientation_landscape=r玫htpaigutus
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Letter
+document_properties_page_size_name_legal=Legal
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized="Fast Web View" tugi:
+document_properties_linearized_yes=Jah
+document_properties_linearized_no=Ei
+document_properties_close=Sulge
+
+print_progress_message=Dokumendi ettevalmistamine printimiseks鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=Loobu
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=N盲ita k眉lgriba
+toggle_sidebar_notification.title=N盲ita k眉lgriba (dokument sisaldab sisukorda/manuseid)
+toggle_sidebar_label=N盲ita k眉lgriba
+document_outline.title=N盲ita sisukorda (k玫igi punktide laiendamiseks/ahendamiseks topeltkl玫psa)
+document_outline_label=N盲ita sisukorda
+attachments.title=N盲ita manuseid
+attachments_label=Manused
+thumbs.title=N盲ita pisipilte
+thumbs_label=Pisipildid
+findbar.title=Otsi dokumendist
+findbar_label=Otsi
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title={{page}}. lehek眉lg
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas={{page}}. lehek眉lje pisipilt
+
+# Find panel button title and messages
+find_input.title=Otsi
+find_input.placeholder=Otsi dokumendist鈥�
+find_previous.title=Otsi fraasi eelmine esinemiskoht
+find_previous_label=Eelmine
+find_next.title=Otsi fraasi j盲rgmine esinemiskoht
+find_next_label=J盲rgmine
+find_highlight=Too k玫ik esile
+find_match_case_label=T玫stutundlik
+find_entire_word_label=T盲iss玫nad
+find_reached_top=J玫uti dokumendi algusesse, j盲tkati l玫pust
+find_reached_bottom=J玫uti dokumendi l玫ppu, j盲tkati algusest
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]=vaste {{current}}/{{total}}
+find_match_count[two]=vaste {{current}}/{{total}}
+find_match_count[few]=vaste {{current}}/{{total}}
+find_match_count[many]=vaste {{current}}/{{total}}
+find_match_count[other]=vaste {{current}}/{{total}}
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]=Rohkem kui {{limit}} vastet
+find_match_count_limit[one]=Rohkem kui {{limit}} vaste
+find_match_count_limit[two]=Rohkem kui {{limit}} vastet
+find_match_count_limit[few]=Rohkem kui {{limit}} vastet
+find_match_count_limit[many]=Rohkem kui {{limit}} vastet
+find_match_count_limit[other]=Rohkem kui {{limit}} vastet
+find_not_found=Fraasi ei leitud
+
+# Error panel labels
+error_more_info=Rohkem teavet
+error_less_info=V盲hem teavet
+error_close=Sulge
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Teade: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stack: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Fail: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Rida: {{line}}
+rendering_error=Lehe renderdamisel esines viga.
+
+# Predefined zoom values
+page_scale_width=Mahuta laiusele
+page_scale_fit=Mahuta lehek眉ljele
+page_scale_auto=Automaatne suurendamine
+page_scale_actual=Tegelik suurus
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Viga
+loading_error=PDFi laadimisel esines viga.
+invalid_file_error=Vigane v玫i rikutud PDF-fail.
+missing_file_error=PDF-fail puudub.
+unexpected_response_error=Ootamatu vastus serverilt.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Annotation]
+password_label=PDF-faili avamiseks sisesta parool.
+password_invalid=Vigane parool. Palun proovi uuesti.
+password_ok=Sobib
+password_cancel=Loobu
+
+printing_not_supported=Hoiatus: printimine pole selle brauseri poolt t盲ielikult toetatud.
+printing_not_ready=Hoiatus: PDF pole printimiseks t盲ielikult laaditud.
+web_fonts_disabled=Veebifondid on keelatud: PDFiga kaasatud fonte pole v玫imalik kasutada.
+document_colors_not_allowed=PDF-dokumentidel pole oma v盲rvide kasutamine lubatud: 鈥淰eebilehtedel on lubatud kasutada oma v盲rve鈥� on brauseris deaktiveeritud.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/eu/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/eu/viewer.properties
new file mode 100644
index 0000000..c40b884
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/eu/viewer.properties
@@ -0,0 +1,242 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Aurreko orria
+previous_label=Aurrekoa
+next.title=Hurrengo orria
+next_label=Hurrengoa
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=Orria
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=/ {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages={{pagesCount}}/{{pageNumber}}
+
+zoom_out.title=Urrundu zooma
+zoom_out_label=Urrundu zooma
+zoom_in.title=Gerturatu zooma
+zoom_in_label=Gerturatu zooma
+zoom.title=Zooma
+presentation_mode.title=Aldatu aurkezpen modura
+presentation_mode_label=Arkezpen modua
+open_file.title=Ireki fitxategia
+open_file_label=Ireki
+print.title=Inprimatu
+print_label=Inprimatu
+download.title=Deskargatu
+download_label=Deskargatu
+bookmark.title=Uneko ikuspegia (kopiatu edo ireki leiho berrian)
+bookmark_label=Uneko ikuspegia
+
+# Secondary toolbar and context menu
+tools.title=Tresnak
+tools_label=Tresnak
+first_page.title=Joan lehen orrira
+first_page.label=Joan lehen orrira
+first_page_label=Joan lehen orrira
+last_page.title=Joan azken orrira
+last_page.label=Joan azken orrira
+last_page_label=Joan azken orrira
+page_rotate_cw.title=Biratu erlojuaren norantzan
+page_rotate_cw.label=Biratu erlojuaren norantzan
+page_rotate_cw_label=Biratu erlojuaren norantzan
+page_rotate_ccw.title=Biratu erlojuaren aurkako norantzan
+page_rotate_ccw.label=Biratu erlojuaren aurkako norantzan
+page_rotate_ccw_label=Biratu erlojuaren aurkako norantzan
+
+cursor_text_select_tool.title=Gaitu testuaren hautapen tresna
+cursor_text_select_tool_label=Testuaren hautapen tresna
+cursor_hand_tool.title=Gaitu eskuaren tresna
+cursor_hand_tool_label=Eskuaren tresna
+
+scroll_vertical.title=Erabili korritze bertikala
+scroll_vertical_label=Korritze bertikala
+scroll_horizontal.title=Erabili korritze horizontala
+scroll_horizontal_label=Korritze horizontala
+scroll_wrapped.title=Erabili korritze egokitua
+scroll_wrapped_label=Korritze egokitua
+
+spread_none.title=Ez elkartu barreiatutako orriak
+spread_none_label=Barreiatzerik ez
+spread_odd.title=Elkartu barreiatutako orriak bakoiti zenbakidunekin hasita
+spread_odd_label=Barreiatze bakoitia
+spread_even.title=Elkartu barreiatutako orriak bikoiti zenbakidunekin hasita
+spread_even_label=Barreiatze bikoitia
+
+# Document properties dialog box
+document_properties.title=Dokumentuaren propietateak鈥�
+document_properties_label=Dokumentuaren propietateak鈥�
+document_properties_file_name=Fitxategi-izena:
+document_properties_file_size=Fitxategiaren tamaina:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} byte)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} byte)
+document_properties_title=Izenburua:
+document_properties_author=Egilea:
+document_properties_subject=Gaia:
+document_properties_keywords=Gako-hitzak:
+document_properties_creation_date=Sortze-data:
+document_properties_modification_date=Aldatze-data:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Sortzailea:
+document_properties_producer=PDFaren ekoizlea:
+document_properties_version=PDF bertsioa:
+document_properties_page_count=Orrialde kopurua:
+document_properties_page_size=Orriaren tamaina:
+document_properties_page_size_unit_inches=in
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=bertikala
+document_properties_page_size_orientation_landscape=horizontala
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Gutuna
+document_properties_page_size_name_legal=Legala
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=Webeko ikuspegi bizkorra:
+document_properties_linearized_yes=Bai
+document_properties_linearized_no=Ez
+document_properties_close=Itxi
+
+print_progress_message=Dokumentua inprimatzeko prestatzen鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent=%{{progress}}
+print_progress_close=Utzi
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Txandakatu alboko barra
+toggle_sidebar_notification.title=Txandakatu alboko barra (dokumentuak eskema/eranskinak ditu)
+toggle_sidebar_label=Txandakatu alboko barra
+document_outline.title=Erakutsi dokumentuaren eskema (klik bikoitza elementu guztiak zabaltzeko/tolesteko)
+document_outline_label=Dokumentuaren eskema
+attachments.title=Erakutsi eranskinak
+attachments_label=Eranskinak
+thumbs.title=Erakutsi koadro txikiak
+thumbs_label=Koadro txikiak
+findbar.title=Bilatu dokumentuan
+findbar_label=Bilatu
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title={{page}}. orria
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas={{page}}. orriaren koadro txikia
+
+# Find panel button title and messages
+find_input.title=Bilatu
+find_input.placeholder=Bilatu dokumentuan鈥�
+find_previous.title=Bilatu esaldiaren aurreko parekatzea
+find_previous_label=Aurrekoa
+find_next.title=Bilatu esaldiaren hurrengo parekatzea
+find_next_label=Hurrengoa
+find_highlight=Nabarmendu guztia
+find_match_case_label=Bat etorri maiuskulekin/minuskulekin
+find_entire_word_label=Hitz osoak
+find_reached_top=Dokumentuaren hasierara heldu da, bukaeratik jarraitzen
+find_reached_bottom=Dokumentuaren bukaerara heldu da, hasieratik jarraitzen
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]={{total}}/{{current}}. bat etortzea
+find_match_count[two]={{total}}/{{current}}. bat etortzea
+find_match_count[few]={{total}}/{{current}}. bat etortzea
+find_match_count[many]={{total}}/{{current}}. bat etortzea
+find_match_count[other]={{total}}/{{current}}. bat etortzea
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]={{limit}} bat-etortze baino gehiago
+find_match_count_limit[one]=Bat-etortze {{limit}} baino gehiago
+find_match_count_limit[two]={{limit}} bat-etortze baino gehiago
+find_match_count_limit[few]={{limit}} bat-etortze baino gehiago
+find_match_count_limit[many]={{limit}} bat-etortze baino gehiago
+find_match_count_limit[other]={{limit}} bat-etortze baino gehiago
+find_not_found=Esaldia ez da aurkitu
+
+# Error panel labels
+error_more_info=Informazio gehiago
+error_less_info=Informazio gutxiago
+error_close=Itxi
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (eraikuntza: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Mezua: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Pila: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Fitxategia: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Lerroa: {{line}}
+rendering_error=Errorea gertatu da orria errendatzean.
+
+# Predefined zoom values
+page_scale_width=Orriaren zabalera
+page_scale_fit=Doitu orrira
+page_scale_auto=Zoom automatikoa
+page_scale_actual=Benetako tamaina
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent=%{{scale}}
+
+# Loading indicator messages
+loading_error_indicator=Errorea
+loading_error=Errorea gertatu da PDFa kargatzean.
+invalid_file_error=PDF fitxategi baliogabe edo hondatua.
+missing_file_error=PDF fitxategia falta da.
+unexpected_response_error=Espero gabeko zerbitzariaren erantzuna.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} ohartarazpena]
+password_label=Idatzi PDF fitxategi hau irekitzeko pasahitza.
+password_invalid=Pasahitz baliogabea. Saiatu berriro mesedez.
+password_ok=Ados
+password_cancel=Utzi
+
+printing_not_supported=Abisua: inprimatzeko euskarria ez da erabatekoa nabigatzaile honetan.
+printing_not_ready=Abisua: PDFa ez dago erabat kargatuta inprimatzeko.
+web_fonts_disabled=Webeko letra-tipoak desgaituta daude: ezin dira kapsulatutako PDF letra-tipoak erabili.
+document_colors_not_allowed=PDF dokumentuek ez dute beraien koloreak erabiltzeko baimenik: 'Baimendu orriak beraien letra-tipoak aukeratzea' desaktibatuta dago nabigatzailean.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/fa/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/fa/viewer.properties
new file mode 100644
index 0000000..8d001d4
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/fa/viewer.properties
@@ -0,0 +1,201 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=氐賮丨賴贁 賯亘賱蹖
+previous_label=賯亘賱蹖
+next.title=氐賮丨賴贁 亘毓丿蹖
+next_label=亘毓丿蹖
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=氐賮丨賴
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=丕夭 {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}}丕夭 {{pagesCount}})
+
+zoom_out.title=讴賵趩讴鈥屬嗁呚й屰�
+zoom_out_label=讴賵趩讴鈥屬嗁呚й屰�
+zoom_in.title=亘夭乇诏鈥屬嗁呚й屰�
+zoom_in_label=亘夭乇诏鈥屬嗁呚й屰�
+zoom.title=夭賵賲
+presentation_mode.title=鬲睾蹖蹖乇 亘賴 丨丕賱鬲 丕乇丕卅賴
+presentation_mode_label=丨丕賱鬲 丕乇丕卅賴
+open_file.title=亘丕夭 讴乇丿賳 倬乇賵賳丿賴
+open_file_label=亘丕夭 讴乇丿賳
+print.title=趩丕倬
+print_label=趩丕倬
+download.title=亘丕乇诏蹖乇蹖
+download_label=亘丕乇诏蹖乇蹖
+bookmark.title=賳賲丕蹖 賮毓賱蹖 (乇賵賳賵卮鬲 賵 蹖丕 賳卮丕賳 丿丕丿賳 丿乇 倬賳噩乇賴 噩丿蹖丿)
+bookmark_label=賳賲丕蹖 賮毓賱蹖
+
+# Secondary toolbar and context menu
+tools.title=丕亘夭丕乇賴丕
+tools_label=丕亘夭丕乇賴丕
+first_page.title=亘乇賵 亘賴 丕賵賱蹖賳 氐賮丨賴
+first_page.label=亘乇賵 蹖賴 丕賵賱蹖賳 氐賮丨賴
+first_page_label=亘乇賵 亘賴 丕賵賱蹖賳 氐賮丨賴
+last_page.title=亘乇賵 亘賴 丌禺乇蹖賳 氐賮丨賴
+last_page.label=亘乇賵 亘賴 丌禺乇蹖賳 氐賮丨賴
+last_page_label=亘乇賵 亘賴 丌禺乇蹖賳 氐賮丨賴
+page_rotate_cw.title=趩乇禺卮 爻丕毓鬲诏乇丿
+page_rotate_cw.label=趩乇禺卮 爻丕毓鬲诏乇丿
+page_rotate_cw_label=趩乇禺卮 爻丕毓鬲诏乇丿
+page_rotate_ccw.title=趩乇禺卮 倬丕丿 爻丕毓鬲诏乇丿
+page_rotate_ccw.label=趩乇禺卮 倬丕丿 爻丕毓鬲诏乇丿
+page_rotate_ccw_label=趩乇禺卮 倬丕丿 爻丕毓鬲诏乇丿
+
+cursor_text_select_tool.title=賮毓丕賱 讴乇丿賳 丕亘夭丕乇賽 丕賳鬲禺丕亘賽 賲鬲賳
+cursor_text_select_tool_label=丕亘夭丕乇賽 丕賳鬲禺丕亘賽 賲鬲賳
+cursor_hand_tool.title=賮毓丕賱 讴乇丿賳 丕亘夭丕乇賽 丿爻鬲
+cursor_hand_tool_label=丕亘夭丕乇 丿爻鬲
+
+
+
+# Document properties dialog box
+document_properties.title=禺氐賵氐蹖丕鬲 爻賳丿...
+document_properties_label=禺氐賵氐蹖丕鬲 爻賳丿...
+document_properties_file_name=賳丕賲 賮丕蹖賱:
+document_properties_file_size=丨噩賲 倬乇賵賳丿賴:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} 讴蹖賱賵亘丕蹖鬲 ({{size_b}} 亘丕蹖鬲)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} 賲诏丕亘丕蹖鬲 ({{size_b}} 亘丕蹖鬲)
+document_properties_title=毓賳賵丕賳:
+document_properties_author=賳賵蹖爻賳丿賴:
+document_properties_subject=賲賵囟賵毓:
+document_properties_keywords=讴賱蹖丿賵丕跇賴鈥屬囏�:
+document_properties_creation_date=鬲丕乇蹖禺 丕蹖噩丕丿:
+document_properties_modification_date=鬲丕乇蹖禺 賵蹖乇丕蹖卮:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}貙 {{time}}
+document_properties_creator=丕蹖噩丕丿 讴賳賳丿賴:
+document_properties_producer=丕蹖噩丕丿 讴賳賳丿賴 PDF:
+document_properties_version=賳爻禺賴 PDF:
+document_properties_page_count=鬲毓丿丕丿 氐賮丨丕鬲:
+document_properties_page_size=丕賳丿丕夭賴 氐賮丨賴:
+document_properties_page_size_unit_inches=丕蹖賳趩
+document_properties_page_size_unit_millimeters=賲蹖賱蹖鈥屬呚�
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=賳丕賲賴
+document_properties_page_size_name_legal=丨賯賵賯蹖
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+document_properties_close=亘爻鬲賳
+
+print_progress_message=丌賲丕丿賴 爻丕夭蹖 賲丿丕乇讴 亘乇丕蹖 趩丕倬 讴乇丿賳鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=賱睾賵
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=亘丕夭 賵 亘爻鬲賴 讴乇丿賳 賳賵丕乇 讴賳丕乇蹖
+toggle_sidebar_notification.title=鬲睾蹖蹖乇 賵囟毓蹖鬲 賳賵丕乇 讴賳丕乇蹖 (爻賳丿 丨丕賵蹖 胤乇丨/倬蹖賵爻鬲 丕爻鬲)
+toggle_sidebar_label=鬲睾蹖蹖乇丨丕賱鬲 賳賵丕乇讴賳丕乇蹖
+document_outline.title=賳賲丕蹖卮 乇卅賵爻 賲胤丕賱亘 賲丿丕乇讴(亘乇丕蹖 亘丕夭卮丿賳/噩賲毓 卮丿賳 賴賲賴 賲賵丕乇丿 丿賵亘丕乇 讴賱蹖讴 讴賳蹖丿)
+document_outline_label=胤乇丨 賳賵卮鬲丕乇
+attachments.title=賳賲丕蹖卮 倬蹖賵爻鬲鈥屬囏�
+attachments_label=倬蹖賵爻鬲鈥屬囏�
+thumbs.title=賳賲丕蹖卮 鬲氐丕賵蹖乇 亘賳丿丕賳诏卮鬲蹖
+thumbs_label=鬲氐丕賵蹖乇 亘賳丿丕賳诏卮鬲蹖
+findbar.title=噩爻鬲噩賵 丿乇 爻賳丿
+findbar_label=倬蹖丿丕 讴乇丿賳
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=氐賮丨賴 {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=鬲氐賵蹖乇 亘賳丿鈥� 丕賳诏卮鬲蹖 氐賮丨賴 {{page}}
+
+# Find panel button title and messages
+find_input.title=倬蹖丿丕 讴乇丿賳
+find_input.placeholder=倬蹖丿丕 讴乇丿賳 丿乇 爻賳丿鈥�
+find_previous.title=倬蹖丿丕 讴乇丿賳 乇禺丿丕丿 賯亘賱蹖 毓亘丕乇鬲
+find_previous_label=賯亘賱蹖
+find_next.title=倬蹖丿丕 讴乇丿賳 乇禺丿丕丿 亘毓丿蹖 毓亘丕乇鬲
+find_next_label=亘毓丿蹖
+find_highlight=亘乇噩爻鬲賴 賵 賴丕蹖賱丕蹖鬲 讴乇丿賳 賴賲賴 賲賵丕乇丿
+find_match_case_label=鬲胤亘蹖賯 讴賵趩讴蹖 賵 亘夭乇诏蹖 丨乇賵賮
+find_reached_top=亘賴 亘丕賱丕蹖 氐賮丨賴 乇爻蹖丿蹖賲貙 丕夭 倬丕蹖蹖賳 丕丿丕賲賴 賲蹖鈥屫囒屬�
+find_reached_bottom=亘賴 丌禺乇 氐賮丨賴 乇爻蹖丿蹖賲貙 丕夭 亘丕賱丕 丕丿丕賲賴 賲蹖鈥屫囒屬�
+find_not_found=毓亘丕乇鬲 倬蹖丿丕 賳卮丿
+
+# Error panel labels
+error_more_info=丕胤賱丕毓丕鬲 亘蹖卮鬲乇
+error_less_info=丕胤賱丕毓丕鬲 讴賲鬲乇
+error_close=亘爻鬲賳
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=鈥廝DF.js 賵乇跇賳{{version}} 鈥�(爻丕禺鬲: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=倬蹖丕賲: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=鬲賵丿賴: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=倬乇賵賳丿賴: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=爻胤乇: {{line}}
+rendering_error=賴賳诏丕賲 亘丕乇诏蹖乇蹖 氐賮丨賴 禺胤丕蹖蹖 乇禺 丿丕丿.
+
+# Predefined zoom values
+page_scale_width=毓乇囟 氐賮丨賴
+page_scale_fit=丕賳丿丕夭賴 讴乇丿賳 氐賮丨賴
+page_scale_auto=亘夭乇诏賳賲丕蹖蹖 禺賵丿讴丕乇
+page_scale_actual=丕賳丿丕夭賴 賵丕賯毓蹖鈥�
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=禺胤丕
+loading_error=賴賳诏丕賲 亘丕乇诏蹖乇蹖 倬乇賵賳丿賴 PDF 禺胤丕蹖蹖 乇禺 丿丕丿.
+invalid_file_error=倬乇賵賳丿賴 PDF 賳丕賲毓鬲亘乇 蹖丕賲毓蹖賵亘 賲蹖鈥屫ㄘж簇�.
+missing_file_error=倬乇賵賳丿賴 PDF 蹖丕賮鬲 賳卮丿.
+unexpected_response_error=倬丕爻禺 倬蹖卮 亘蹖賳蹖 賳卮丿賴 爻乇賵乇
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Annotation]
+password_label=噩賴鬲 亘丕夭 讴乇丿賳 倬乇賵賳丿賴 PDF 诏匕乇賵丕跇賴 乇丕 賵丕乇丿 賳賲丕卅蹖丿.
+password_invalid=诏匕乇賵丕跇賴 賳丕賲毓鬲亘乇. 賱胤賮丕 賲噩丿丿丕 鬲賱丕卮 讴賳蹖丿.
+password_ok=鬲兀蹖蹖丿
+password_cancel=賱睾賵
+
+printing_not_supported=賴卮丿丕乇: 賯丕亘賱蹖鬲 趩丕倬 亘賴鈥屫焚堌� 讴丕賲賱 丿乇 丕蹖賳 賲乇賵乇诏乇 倬卮鬲蹖亘丕賳蹖 賳賲蹖鈥屫促堌�.
+printing_not_ready=丕禺胤丕乇: 倬乇賵賳丿賴 PDF 亘胤賵乇 讴丕賲賱 亘丕乇诏蹖乇蹖 賳卮丿賴 賵 丕賲讴丕賳 趩丕倬 賵噩賵丿 賳丿丕乇丿.
+web_fonts_disabled=賮賵賳鬲 賴丕蹖 鬲丨鬲 賵亘 睾蹖乇 賮毓丕賱 卮丿賴 丕賳丿: 丕賲讴丕賳 丕爻鬲賮丕丿賴 丕夭 賳賲丕蹖卮 丿賴賳丿賴 丿丕禺賱蹖 PDF 賵噩賵丿 賳丿丕乇丿.
+document_colors_not_allowed=賮丕蹖賱賴丕蹖 PDF 丕噩丕夭賴 賳丿丕乇賳丿 鬲丕 丕夭 乇賳诏鈥屬囏й� 禺賵丿 丕爻鬲賮丕丿賴 讴賳賳丿: 诏夭蹖賳賴 芦亘賴 氐賮丨丕鬲 丕噩丕夭賴 亘丿賴 鬲丕 丕夭 乇賳诏鈥屬囏й� 禺賵丿 丕爻鬲賮丕丿賴 讴賳賳丿禄 丿乇 賲乇賵乇诏乇 睾蹖乇 賮毓丕賱 丕爻鬲.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ff/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ff/viewer.properties
new file mode 100644
index 0000000..d368529
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ff/viewer.properties
@@ -0,0 +1,201 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Hello 苼ennungo
+previous_label=苼ennu蓷o
+next.title=Hello faango
+next_label=Yeeso
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=Hello
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=e nder {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} of {{pagesCount}})
+
+zoom_out.title=Lonngo Wo蓷蓷a
+zoom_out_label=Lonngo Wo蓷蓷a
+zoom_in.title=Lonngo Ara
+zoom_in_label=Lonngo Ara
+zoom.title=Lonngo
+presentation_mode.title=Faytu to  Presentation Mode
+presentation_mode_label=Presentation Mode
+open_file.title=Uddit Fiilde
+open_file_label=Uddit
+print.title=Winndito
+print_label=Winndito
+download.title=Aawto
+download_label=Aawto
+bookmark.title=Jiytol gonangol (natto walla uddit e henorde)
+bookmark_label=Jiytol Gonangol
+
+# Secondary toolbar and context menu
+tools.title=Kuutor蓷e
+tools_label=Kuutor蓷e
+first_page.title=Yah to hello adanngo
+first_page.label=Yah to hello adanngo
+first_page_label=Yah to hello adanngo
+last_page.title=Yah to hello wattindiingo
+last_page.label=Yah to hello wattindiingo
+last_page_label=Yah to hello wattindiingo
+page_rotate_cw.title=Yiiltu Faya 脩aamo
+page_rotate_cw.label=Yiiltu Faya 脩aamo
+page_rotate_cw_label=Yiiltu Faya 脩aamo
+page_rotate_ccw.title=Yiiltu Faya Nano
+page_rotate_ccw.label=Yiiltu Faya Nano
+page_rotate_ccw_label=Yiiltu Faya Nano
+
+cursor_text_select_tool.title=Gollin ka蓳irgel cu蓳irgel binndi
+cursor_text_select_tool_label=Ka蓳irgel cu蓳irgel binndi
+cursor_hand_tool.title=Hurmin kuutorgal junngo
+cursor_hand_tool_label=Ka蓳irgel junngo
+
+# Document properties dialog box
+document_properties.title=Keeroraa蓷i Winndannde鈥�
+document_properties_label=Keeroraa蓷i Winndannde鈥�
+document_properties_file_name=Innde fiilde:
+document_properties_file_size=苼etol fiilde:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} bite)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} bite)
+document_properties_title=Tiitoonde:
+document_properties_author=Binndu蓷o:
+document_properties_subject=To蓳蓳ere:
+document_properties_keywords=Kelmekele jiytir蓷e:
+document_properties_creation_date=脩alnde Sosaa:
+document_properties_modification_date=脩alnde Waylaa:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Cos蓷o:
+document_properties_producer=Paggii蓷o PDF:
+document_properties_version=Yamre PDF:
+document_properties_page_count=Limoore Kelle:
+document_properties_page_size=苼eto Hello:
+document_properties_page_size_unit_inches=nder
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=dariingo
+document_properties_page_size_orientation_landscape=wertiingo
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=苼ataake
+document_properties_page_size_name_legal=Laawol
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+document_properties_close=Uddu
+
+print_progress_message=Nana heboo winnditaade fiilannde鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=Haaytu
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Toggilo Palal Sawndo
+toggle_sidebar_notification.title=Palal sawndo (dokimaa oo ina wa蓷i taarngo/cinnde)
+toggle_sidebar_label=Toggilo Palal Sawndo
+document_outline.title=Hollu 瞥iyal Fiilannde (dobdobo ngam wertude/taggude teme fof)
+document_outline_label=To蓳蓳e Fiilannde
+attachments.title=Hollu 茒isan蓷e
+attachments_label=茒isan蓷e
+thumbs.title=Hollu Doo蓳e
+thumbs_label=Doo蓳e
+findbar.title=Yiylo e fiilannde
+findbar_label=Yiytu
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Hello {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Doo蓳re Hello {{page}}
+
+# Find panel button title and messages
+find_input.title=Yiytu
+find_input.placeholder=Yiylo nder dokimaa
+find_previous.title=Yiylo cilol 蓳ennugol konngol ngol
+find_previous_label=苼ennu蓷o
+find_next.title=Yiylo cilol garowol konngol ngol
+find_next_label=Yeeso
+find_highlight=Jalbin fof
+find_match_case_label=Jaa蓳nu darnde
+find_reached_top=He蓳ii fu蓷蓷orde fiilannde, jokku faya les
+find_reached_bottom=He蓳ii hoore fiilannde, jokku faya les
+find_not_found=Konngi njiyataa
+
+# Error panel labels
+error_more_info=苼eydu Humpito
+error_less_info=Ustu Humpito
+error_close=Uddu
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=苼atakuure: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stack: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Fiilde: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Gorol: {{line}}
+rendering_error=Juumre wa蓷ii tuma nde yo艐kittoo hello.
+
+# Predefined zoom values
+page_scale_width=Njaajeendi Hello
+page_scale_fit=Ke拼eendi Hello
+page_scale_auto=Loongorde Jaajol
+page_scale_actual=苼etol Jaati
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Juumre
+loading_error=Juumre wa蓷ii tuma nde loowata PDF oo.
+invalid_file_error=Fiilde PDF mo拼拼aani walla jiibii.
+missing_file_error=Fiilde PDF ena 艐akki.
+unexpected_response_error=Jaabtol sarworde tijjinooka.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Siiftannde]
+password_label=Naatu finnde ngam uddite ndee fiilde PDF.
+password_invalid=Finnde mo拼拼aani. Tii蓷no eto kadi.
+password_ok=OK
+password_cancel=Haaytu
+
+printing_not_supported=Reentino: Winnditagol tammbitaaka no feewi e ndee wanngorde.
+printing_not_ready=Reentino: PDF oo loowaaki haa timmi ngam winnditagol.
+web_fonts_disabled=Ponte geese ko daa拼aa蓷e: horiima huutoraade ponte PDF coomtoraa蓷e.
+document_colors_not_allowed=Piilan蓷e PDF njamiraaka yoo kuutoro goobuuji mum'en keerii蓷i: 'Yamir kello yoo kuutoro goobuuki keerii蓷i' koko daa拼aa e wanngorde ndee.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/fi/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/fi/viewer.properties
new file mode 100644
index 0000000..89efd77
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/fi/viewer.properties
@@ -0,0 +1,242 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Edellinen sivu
+previous_label=Edellinen
+next.title=Seuraava sivu
+next_label=Seuraava
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=Sivu
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=/ {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} / {{pagesCount}})
+
+zoom_out.title=Loitonna
+zoom_out_label=Loitonna
+zoom_in.title=L盲henn盲
+zoom_in_label=L盲henn盲
+zoom.title=Suurennus
+presentation_mode.title=Siirry esitystilaan
+presentation_mode_label=Esitystila
+open_file.title=Avaa tiedosto
+open_file_label=Avaa
+print.title=Tulosta
+print_label=Tulosta
+download.title=Lataa
+download_label=Lataa
+bookmark.title=Avoin ikkuna (kopioi tai avaa uuteen ikkunaan)
+bookmark_label=Avoin ikkuna
+
+# Secondary toolbar and context menu
+tools.title=Tools
+tools_label=Tools
+first_page.title=Siirry ensimm盲iselle sivulle
+first_page.label=Siirry ensimm盲iselle sivulle
+first_page_label=Siirry ensimm盲iselle sivulle
+last_page.title=Siirry viimeiselle sivulle
+last_page.label=Siirry viimeiselle sivulle
+last_page_label=Siirry viimeiselle sivulle
+page_rotate_cw.title=Kierr盲 oikealle
+page_rotate_cw.label=Kierr盲 oikealle
+page_rotate_cw_label=Kierr盲 oikealle
+page_rotate_ccw.title=Kierr盲 vasemmalle
+page_rotate_ccw.label=Kierr盲 vasemmalle
+page_rotate_ccw_label=Kierr盲 vasemmalle
+
+cursor_text_select_tool.title=K盲yt盲 tekstinvalintaty枚kalua
+cursor_text_select_tool_label=Tekstinvalintaty枚kalu
+cursor_hand_tool.title=K盲yt盲 k盲sity枚kalua
+cursor_hand_tool_label=K盲sity枚kalu
+
+scroll_vertical.title=K盲yt盲 pystysuuntaista vierityst盲
+scroll_vertical_label=Pystysuuntainen vieritys
+scroll_horizontal.title=K盲yt盲 vaakasuuntaista vierityst盲
+scroll_horizontal_label=Vaakasuuntainen vieritys
+scroll_wrapped.title=K盲yt盲 rivittyv盲盲 vierityst盲
+scroll_wrapped_label=Rivittyv盲 vieritys
+
+spread_none.title=脛l盲 yhdist盲 sivuja aukeamiksi
+spread_none_label=Ei aukeamia
+spread_odd.title=Yhdist盲 sivut aukeamiksi alkaen parittomalta sivulta
+spread_odd_label=Parittomalta alkavat aukeamat
+spread_even.title=Yhdist盲 sivut aukeamiksi alkaen parilliselta sivulta
+spread_even_label=Parilliselta alkavat aukeamat
+
+# Document properties dialog box
+document_properties.title=Dokumentin ominaisuudet鈥�
+document_properties_label=Dokumentin ominaisuudet鈥�
+document_properties_file_name=Tiedostonimi:
+document_properties_file_size=Tiedoston koko:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} kt ({{size_b}} tavua)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} Mt ({{size_b}} tavua)
+document_properties_title=Otsikko:
+document_properties_author=Tekij盲:
+document_properties_subject=Aihe:
+document_properties_keywords=Avainsanat:
+document_properties_creation_date=Luomisp盲iv盲m盲盲r盲:
+document_properties_modification_date=Muokkausp盲iv盲m盲盲r盲:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Luoja:
+document_properties_producer=PDF-tuottaja:
+document_properties_version=PDF-versio:
+document_properties_page_count=Sivujen m盲盲r盲:
+document_properties_page_size=Sivun koko:
+document_properties_page_size_unit_inches=in
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=pysty
+document_properties_page_size_orientation_landscape=vaaka
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Letter
+document_properties_page_size_name_legal=Legal
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=Nopea web-katselu:
+document_properties_linearized_yes=Kyll盲
+document_properties_linearized_no=Ei
+document_properties_close=Sulje
+
+print_progress_message=Valmistellaan dokumenttia tulostamista varten鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}聽%
+print_progress_close=Peruuta
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=N盲yt盲/piilota sivupaneeli
+toggle_sidebar_notification.title=N盲yt盲/piilota sivupaneeli (dokumentissa on sis盲llys tai liitteit盲)
+toggle_sidebar_label=N盲yt盲/piilota sivupaneeli
+document_outline.title=N盲yt盲 dokumentin sis盲llys (laajenna tai kutista kohdat kaksoisnapsauttamalla)
+document_outline_label=Dokumentin sis盲llys
+attachments.title=N盲yt盲 liitteet
+attachments_label=Liitteet
+thumbs.title=N盲yt盲 pienoiskuvat
+thumbs_label=Pienoiskuvat
+findbar.title=Etsi dokumentista
+findbar_label=Etsi
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Sivu {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Pienoiskuva sivusta {{page}}
+
+# Find panel button title and messages
+find_input.title=Etsi
+find_input.placeholder=Etsi dokumentista鈥�
+find_previous.title=Etsi hakusanan edellinen osuma
+find_previous_label=Edellinen
+find_next.title=Etsi hakusanan seuraava osuma
+find_next_label=Seuraava
+find_highlight=Korosta kaikki
+find_match_case_label=Huomioi kirjainkoko
+find_entire_word_label=Kokonaiset sanat
+find_reached_top=P盲盲stiin dokumentin alkuun, jatketaan lopusta
+find_reached_bottom=P盲盲stiin sivun loppuun, jatketaan alusta
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]={{current}} / {{total}} osuma
+find_match_count[two]={{current}} / {{total}} osumaa
+find_match_count[few]={{current}} / {{total}} osumaa
+find_match_count[many]={{current}} / {{total}} osumaa
+find_match_count[other]={{current}} / {{total}} osumaa
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]=Enemm盲n kuin {{limit}} osumaa
+find_match_count_limit[one]=Enemm盲n kuin {{limit}} osuma
+find_match_count_limit[two]=Enemm盲n kuin {{limit}} osumaa
+find_match_count_limit[few]=Enemm盲n kuin {{limit}} osumaa
+find_match_count_limit[many]=Enemm盲n kuin {{limit}} osumaa
+find_match_count_limit[other]=Enemm盲n kuin {{limit}} osumaa
+find_not_found=Hakusanaa ei l枚ytynyt
+
+# Error panel labels
+error_more_info=Lis盲tietoja
+error_less_info=Lis盲tietoja
+error_close=Sulje
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (kooste: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Virheilmoitus: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Pino: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Tiedosto: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Rivi: {{line}}
+rendering_error=Tapahtui virhe piirrett盲ess盲 sivua.
+
+# Predefined zoom values
+page_scale_width=Sivun leveys
+page_scale_fit=Koko sivu
+page_scale_auto=Automaattinen suurennus
+page_scale_actual=Todellinen koko
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}} %
+
+# Loading indicator messages
+loading_error_indicator=Virhe
+loading_error=Tapahtui virhe ladattaessa PDF-tiedostoa.
+invalid_file_error=Virheellinen tai vioittunut PDF-tiedosto.
+missing_file_error=Puuttuva PDF-tiedosto.
+unexpected_response_error=Odottamaton vastaus palvelimelta.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Annotation]
+password_label=Kirjoita PDF-tiedoston salasana.
+password_invalid=Virheellinen salasana. Yrit盲 uudestaan.
+password_ok=OK
+password_cancel=Peruuta
+
+printing_not_supported=Varoitus: Selain ei tue kaikkia tulostustapoja.
+printing_not_ready=Varoitus: PDF-tiedosto ei ole viel盲 latautunut kokonaan, eik盲 sit盲 voi viel盲 tulostaa.
+web_fonts_disabled=Verkkosivujen omat kirjasinlajit on estetty: ei voida k盲ytt盲盲 upotettuja PDF-kirjasinlajeja.
+document_colors_not_allowed=PDF-dokumenttien ei ole sallittua k盲ytt盲盲 omia v盲rej盲盲n: Asetusta 鈥漇ivut saavat k盲ytt盲盲 omia v盲rej盲盲n oletusten sijaan鈥� ei ole valittu selaimen asetuksissa.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/fr/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/fr/viewer.properties
new file mode 100644
index 0000000..7cc00b9
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/fr/viewer.properties
@@ -0,0 +1,242 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Page pr茅c茅dente
+previous_label=Pr茅c茅dent
+next.title=Page suivante
+next_label=Suivant
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=Page
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=sur {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} sur {{pagesCount}})
+
+zoom_out.title=Zoom arri猫re
+zoom_out_label=Zoom arri猫re
+zoom_in.title=Zoom avant
+zoom_in_label=Zoom avant
+zoom.title=Zoom
+presentation_mode.title=Basculer en mode pr茅sentation
+presentation_mode_label=Mode pr茅sentation
+open_file.title=Ouvrir le fichier
+open_file_label=Ouvrir le fichier
+print.title=Imprimer
+print_label=Imprimer
+download.title=T茅l茅charger
+download_label=T茅l茅charger
+bookmark.title=Affichage courant (copier ou ouvrir dans une nouvelle fen锚tre)
+bookmark_label=Affichage actuel
+
+# Secondary toolbar and context menu
+tools.title=Outils
+tools_label=Outils
+first_page.title=Aller 脿 la premi猫re page
+first_page.label=Aller 脿 la premi猫re page
+first_page_label=Aller 脿 la premi猫re page
+last_page.title=Aller 脿 la derni猫re page
+last_page.label=Aller 脿 la derni猫re page
+last_page_label=Aller 脿 la derni猫re page
+page_rotate_cw.title=Rotation horaire
+page_rotate_cw.label=Rotation horaire
+page_rotate_cw_label=Rotation horaire
+page_rotate_ccw.title=Rotation antihoraire
+page_rotate_ccw.label=Rotation antihoraire
+page_rotate_ccw_label=Rotation antihoraire
+
+cursor_text_select_tool.title=Activer l鈥檕util de s茅lection de texte
+cursor_text_select_tool_label=Outil de s茅lection de texte
+cursor_hand_tool.title=Activer l鈥檕util main
+cursor_hand_tool_label=Outil main
+
+scroll_vertical.title=Utiliser le d茅filement vertical
+scroll_vertical_label=D茅filement vertical
+scroll_horizontal.title=Utiliser le d茅filement horizontal
+scroll_horizontal_label=D茅filement horizontal
+scroll_wrapped.title=Utiliser le d茅filement par bloc
+scroll_wrapped_label=D茅filement par bloc
+
+spread_none.title=Ne pas afficher les pages deux 脿 deux
+spread_none_label=Pas de double affichage
+spread_odd.title=Afficher les pages par deux, impaires 脿 gauche
+spread_odd_label=Doubles pages, impaires 脿 gauche
+spread_even.title=Afficher les pages par deux, paires 脿 gauche
+spread_even_label=Doubles pages, paires 脿 gauche
+
+# Document properties dialog box
+document_properties.title=Propri茅t茅s du document鈥�
+document_properties_label=Propri茅t茅s du document鈥�
+document_properties_file_name=Nom du fichier聽:
+document_properties_file_size=Taille du fichier聽:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}}聽Ko ({{size_b}} octets)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}}聽Mo ({{size_b}} octets)
+document_properties_title=Titre聽:
+document_properties_author=Auteur聽:
+document_properties_subject=Sujet聽:
+document_properties_keywords=Mots-cl茅s聽:
+document_properties_creation_date=Date de cr茅ation聽:
+document_properties_modification_date=Modifi茅 le聽:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}} 脿 {{time}}
+document_properties_creator=Cr茅茅 par聽:
+document_properties_producer=Outil de conversion PDF聽:
+document_properties_version=Version PDF聽:
+document_properties_page_count=Nombre de pages聽:
+document_properties_page_size=Taille de la page聽:
+document_properties_page_size_unit_inches=in
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=portrait
+document_properties_page_size_orientation_landscape=paysage
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=lettre
+document_properties_page_size_name_legal=document juridique
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}}聽{{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}}聽{{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=Affichage rapide des pages web聽:
+document_properties_linearized_yes=Oui
+document_properties_linearized_no=Non
+document_properties_close=Fermer
+
+print_progress_message=Pr茅paration du document pour l鈥檌mpression鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}聽%
+print_progress_close=Annuler
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Afficher/Masquer le panneau lat茅ral
+toggle_sidebar_notification.title=Afficher/Masquer le panneau lat茅ral (le document contient des signets/pi猫ces jointes)
+toggle_sidebar_label=Afficher/Masquer le panneau lat茅ral
+document_outline.title=Afficher les signets du document (double-cliquer pour d茅velopper/r茅duire tous les 茅l茅ments)
+document_outline_label=Signets du document
+attachments.title=Afficher les pi猫ces jointes
+attachments_label=Pi猫ces jointes
+thumbs.title=Afficher les vignettes
+thumbs_label=Vignettes
+findbar.title=Rechercher dans le document
+findbar_label=Rechercher
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Page {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Vignette de la page {{page}}
+
+# Find panel button title and messages
+find_input.title=Rechercher
+find_input.placeholder=Rechercher dans le document鈥�
+find_previous.title=Trouver l鈥檕ccurrence pr茅c茅dente de la phrase
+find_previous_label=Pr茅c茅dent
+find_next.title=Trouver la prochaine occurrence de la phrase
+find_next_label=Suivant
+find_highlight=Tout surligner
+find_match_case_label=Respecter la casse
+find_entire_word_label=Mots entiers
+find_reached_top=Haut de la page atteint, poursuite depuis la fin
+find_reached_bottom=Bas de la page atteint, poursuite au d茅but
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]=Occurrence {{current}} sur {{total}}
+find_match_count[two]=Occurrence {{current}} sur {{total}}
+find_match_count[few]=Occurrence {{current}} sur {{total}}
+find_match_count[many]=Occurrence {{current}} sur {{total}}
+find_match_count[other]=Occurrence {{current}} sur {{total}}
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]=Plus de {{limit}} correspondances
+find_match_count_limit[one]=Plus de {{limit}} correspondance
+find_match_count_limit[two]=Plus de {{limit}} correspondances
+find_match_count_limit[few]=Plus de {{limit}} correspondances
+find_match_count_limit[many]=Plus de {{limit}} correspondances
+find_match_count_limit[other]=Plus de {{limit}} correspondances
+find_not_found=Phrase introuvable
+
+# Error panel labels
+error_more_info=Plus d鈥檌nformations
+error_less_info=Moins d鈥檌nformations
+error_close=Fermer
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (identifiant de compilation聽: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Message聽: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Pile聽: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Fichier聽: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Ligne聽: {{line}}
+rendering_error=Une erreur s鈥檈st produite lors de l鈥檃ffichage de la page.
+
+# Predefined zoom values
+page_scale_width=Pleine largeur
+page_scale_fit=Page enti猫re
+page_scale_auto=Zoom automatique
+page_scale_actual=Taille r茅elle
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}聽%
+
+# Loading indicator messages
+loading_error_indicator=Erreur
+loading_error=Une erreur s鈥檈st produite lors du chargement du fichier PDF.
+invalid_file_error=Fichier PDF invalide ou corrompu.
+missing_file_error=Fichier PDF manquant.
+unexpected_response_error=R茅ponse inattendue du serveur.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[Annotation {{type}}]
+password_label=Veuillez saisir le mot de passe pour ouvrir ce fichier PDF.
+password_invalid=Mot de passe incorrect. Veuillez r茅essayer.
+password_ok=OK
+password_cancel=Annuler
+
+printing_not_supported=Attention聽: l鈥檌mpression n鈥檈st pas totalement prise en charge par ce navigateur.
+printing_not_ready=Attention聽: le PDF n鈥檈st pas enti猫rement charg茅 pour pouvoir l鈥檌mprimer.
+web_fonts_disabled=Les polices web sont d茅sactiv茅es聽: impossible d鈥檜tiliser les polices int茅gr茅es au PDF.
+document_colors_not_allowed=Les documents PDF ne peuvent pas utiliser leurs propres couleurs聽: 芦聽Autoriser les pages web 脿 utiliser leurs propres couleurs聽禄 est d茅sactiv茅 dans le navigateur.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/fy-NL/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/fy-NL/viewer.properties
new file mode 100644
index 0000000..0c74953
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/fy-NL/viewer.properties
@@ -0,0 +1,242 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Foarige side
+previous_label=Foarige
+next.title=Folgjende side
+next_label=Folgjende
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=Side
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=fa {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} fan {{pagesCount}})
+
+zoom_out.title=Utzoome
+zoom_out_label=Utzoome
+zoom_in.title=Ynzoome
+zoom_in_label=Ynzoome
+zoom.title=Zoome
+presentation_mode.title=Wikselje nei presintaasjemodus
+presentation_mode_label=Presintaasjemodus
+open_file.title=Best芒n iepenje
+open_file_label=Iepenje
+print.title=Ofdrukke
+print_label=Ofdrukke
+download.title=Downloade
+download_label=Downloade
+bookmark.title=Aktuele finster (kopiearje of iepenje yn nij finster)
+bookmark_label=Aktuele finster
+
+# Secondary toolbar and context menu
+tools.title=Ark
+tools_label=Ark
+first_page.title=Gean nei earste side
+first_page.label=Nei earste side gean
+first_page_label=Gean nei earste side
+last_page.title=Gean nei l锚ste side
+last_page.label=Nei l锚ste side gean
+last_page_label=Gean nei l锚ste side
+page_rotate_cw.title=Rjochtsom draaie
+page_rotate_cw.label=Rjochtsom draaie
+page_rotate_cw_label=Rjochtsom draaie
+page_rotate_ccw.title=Loftsom draaie
+page_rotate_ccw.label=Loftsom draaie
+page_rotate_ccw_label=Loftsom draaie
+
+cursor_text_select_tool.title=Tekstseleksjehelpmiddel ynskeakelje
+cursor_text_select_tool_label=Tekstseleksjehelpmiddel
+cursor_hand_tool.title=H芒nhelpmiddel ynskeakelje
+cursor_hand_tool_label=H芒nhelpmiddel
+
+scroll_vertical.title=Fertikaal skowe br没ke
+scroll_vertical_label=Fertikaal skowe
+scroll_horizontal.title=Horizontaal skowe br没ke
+scroll_horizontal_label=Horizontaal skowe
+scroll_wrapped.title=Skowe mei oersjoch br没ke
+scroll_wrapped_label=Skowe mei oersjoch
+
+spread_none.title=Sidesprieding net gearfetsje
+spread_none_label=Gjin sprieding
+spread_odd.title=Sidesprieding gearfetsje te starten mei 没neven n没mers
+spread_odd_label=Uneven sprieding
+spread_even.title=Sidesprieding gearfetsje te starten mei even n没mers
+spread_even_label=Even sprieding
+
+# Document properties dialog box
+document_properties.title=Dokuminteigenskippen鈥�
+document_properties_label=Dokuminteigenskippen鈥�
+document_properties_file_name=Best芒nsnamme:
+document_properties_file_size=Best芒nsgrutte:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=Titel:
+document_properties_author=Auteur:
+document_properties_subject=Underwerp:
+document_properties_keywords=Kaaiwurden:
+document_properties_creation_date=Oanmaakdatum:
+document_properties_modification_date=Bewurkingsdatum:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Makker:
+document_properties_producer=PDF-makker:
+document_properties_version=PDF-ferzje:
+document_properties_page_count=Siden:
+document_properties_page_size=Sideformaat:
+document_properties_page_size_unit_inches=yn
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=steand
+document_properties_page_size_orientation_landscape=lizzend
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Letter
+document_properties_page_size_name_legal=Juridysk
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=Flugge webwerjefte:
+document_properties_linearized_yes=Ja
+document_properties_linearized_no=Nee
+document_properties_close=Slute
+
+print_progress_message=Dokumint tariede oar 么fdrukken鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=Annulearje
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Sidebalke yn-/煤tskeakelje
+toggle_sidebar_notification.title=Sidebalke yn-/煤tskeakelje (dokumint befettet outline/bylagen)
+toggle_sidebar_label=Sidebalke yn-/煤tskeakelje
+document_outline.title=Dokumintoersjoch toane (d没belklik om alle items 煤t/yn te klappen)
+document_outline_label=Dokumintoersjoch
+attachments.title=Bylagen toane
+attachments_label=Bylagen
+thumbs.title=Foarbylden toane
+thumbs_label=Foarbylden
+findbar.title=Sykje yn dokumint
+findbar_label=Sykje
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Side {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Foarbyld fan side {{page}}
+
+# Find panel button title and messages
+find_input.title=Sykje
+find_input.placeholder=Sykje yn dokumint鈥�
+find_previous.title=It foarige foarkommen fan de tekst sykje
+find_previous_label=Foarige
+find_next.title=It folgjende foarkommen fan de tekst sykje
+find_next_label=Folgjende
+find_highlight=Alles markearje
+find_match_case_label=Haadlettergefoelich
+find_entire_word_label=Hiele wurden
+find_reached_top=Boppekant fan dokumint berikt, trochgien fan 没nder 么f
+find_reached_bottom=Ein fan dokumint berikt, trochgien fan boppe 么f
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]={{current}} fan {{total}} oerienkomst
+find_match_count[two]={{current}} fan {{total}} oerienkomsten
+find_match_count[few]={{current}} fan {{total}} oerienkomsten
+find_match_count[many]={{current}} fan {{total}} oerienkomsten
+find_match_count[other]={{current}} fan {{total}} oerienkomsten
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]=Mear as {{limit}} oerienkomsten
+find_match_count_limit[one]=Mear as {{limit}} oerienkomst
+find_match_count_limit[two]=Mear as {{limit}} oerienkomsten
+find_match_count_limit[few]=Mear as {{limit}} oerienkomsten
+find_match_count_limit[many]=Mear as {{limit}} oerienkomsten
+find_match_count_limit[other]=Mear as {{limit}} oerienkomsten
+find_not_found=Tekst net f没n
+
+# Error panel labels
+error_more_info=Mear ynformaasje
+error_less_info=Minder ynformaasje
+error_close=Slute
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js f{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Berjocht: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stack: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Best芒n: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Rigel: {{line}}
+rendering_error=Der is in flater bard by it renderjen fan de side.
+
+# Predefined zoom values
+page_scale_width=Sidebreedte
+page_scale_fit=Hiele side
+page_scale_auto=Automatysk zoome
+page_scale_actual=Werklike grutte
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Flater
+loading_error=Der is in flater bard by it laden fan de PDF.
+invalid_file_error=Ynfalide of korruptearre PDF-best芒n.
+missing_file_error=PDF-best芒n 没ntbrekt.
+unexpected_response_error=Unferwacht serverantwurd.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}}-annotaasje]
+password_label=Jou it wachtwurd om dit PDF-best芒n te iepenjen.
+password_invalid=Ferkeard wachtwurd. Probearje opnij.
+password_ok=OK
+password_cancel=Annulearje
+
+printing_not_supported=Warning: Printen is net folslein stipe troch dizze browser.
+printing_not_ready=Warning: PDF is net folslein laden om 么f te drukken.
+web_fonts_disabled=Weblettertypen binne 煤tskeakele: gebr没k fan ynsluten PDF-lettertypen is net mooglik.
+document_colors_not_allowed=PDF-dokuminten meie harren eigen kleuren net br没ke: 鈥楽iden tastean om harren eigen kleuren te kiezen鈥� is 煤tskeakele yn de browser.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ga-IE/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ga-IE/viewer.properties
new file mode 100644
index 0000000..62f1a55
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ga-IE/viewer.properties
@@ -0,0 +1,184 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=An Leathanach Roimhe Seo
+previous_label=Roimhe Seo
+next.title=An Ch茅ad Leathanach Eile
+next_label=Ar Aghaidh
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=Leathanach
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=as {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} as {{pagesCount}})
+
+zoom_out.title=S煤m谩il Amach
+zoom_out_label=S煤m谩il Amach
+zoom_in.title=S煤m谩il Isteach
+zoom_in_label=S煤m谩il Isteach
+zoom.title=S煤m谩il
+presentation_mode.title=脷s谩id an M贸d L谩ithreoireachta
+presentation_mode_label=M贸d L谩ithreoireachta
+open_file.title=Oscail Comhad
+open_file_label=Oscail
+print.title=Priont谩il
+print_label=Priont谩il
+download.title=脥osl贸d谩il
+download_label=脥osl贸d谩il
+bookmark.title=An t-amharc reatha (c贸ipe谩il n贸 oscail i bhfuinneog nua)
+bookmark_label=An tAmharc Reatha
+
+# Secondary toolbar and context menu
+tools.title=Uirlis铆
+tools_label=Uirlis铆
+first_page.title=Go dt铆 an ch茅ad leathanach
+first_page.label=Go dt铆 an ch茅ad leathanach
+first_page_label=Go dt铆 an ch茅ad leathanach
+last_page.title=Go dt铆 an leathanach deiridh
+last_page.label=Go dt铆 an leathanach deiridh
+last_page_label=Go dt铆 an leathanach deiridh
+page_rotate_cw.title=Rothlaigh ar deiseal
+page_rotate_cw.label=Rothlaigh ar deiseal
+page_rotate_cw_label=Rothlaigh ar deiseal
+page_rotate_ccw.title=Rothlaigh ar tuathal
+page_rotate_ccw.label=Rothlaigh ar tuathal
+page_rotate_ccw_label=Rothlaigh ar tuathal
+
+cursor_text_select_tool.title=Cumasaigh an Uirlis Roghnaithe T茅acs
+cursor_text_select_tool_label=Uirlis Roghnaithe T茅acs
+cursor_hand_tool.title=Cumasaigh an Uirlis L谩imhe
+cursor_hand_tool_label=Uirlis L谩imhe
+
+# Document properties dialog box
+document_properties.title=Air铆onna na C谩ip茅ise鈥�
+document_properties_label=Air铆onna na C谩ip茅ise鈥�
+document_properties_file_name=Ainm an chomhaid:
+document_properties_file_size=M茅id an chomhaid:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} kB ({{size_b}} beart)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} beart)
+document_properties_title=Teideal:
+document_properties_author=脷dar:
+document_properties_subject=脕bhar:
+document_properties_keywords=Eochairfhocail:
+document_properties_creation_date=D谩ta Cruthaithe:
+document_properties_modification_date=D谩ta Athraithe:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Cruthaitheoir:
+document_properties_producer=Cruthaitheoir an PDF:
+document_properties_version=Leagan PDF:
+document_properties_page_count=L铆on Leathanach:
+document_properties_close=D煤n
+
+print_progress_message=C谩ip茅is 谩 hullmh煤 le priont谩il鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=Cealaigh
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Scor谩naigh an Barra Taoibh
+toggle_sidebar_notification.title=Scor谩naigh an Barra Taoibh (achoimre/iat谩in sa ch谩ip茅is)
+toggle_sidebar_label=Scor谩naigh an Barra Taoibh
+document_outline.title=Taispe谩in Iml铆ne na C谩ip茅ise (d茅chlice谩il chun chuile rud a leathn煤 n贸 a laghd煤)
+document_outline_label=Creatlach na C谩ip茅ise
+attachments.title=Taispe谩in Iat谩in
+attachments_label=Iat谩in
+thumbs.title=Taispe谩in Mionsamhlacha
+thumbs_label=Mionsamhlacha
+findbar.title=Aimsigh sa Ch谩ip茅is
+findbar_label=Aimsigh
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Leathanach {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Mionsamhail Leathanaigh {{page}}
+
+# Find panel button title and messages
+find_input.title=Aimsigh
+find_input.placeholder=Aimsigh sa ch谩ip茅is鈥�
+find_previous.title=Aimsigh an sampla roimhe seo den nath seo
+find_previous_label=Roimhe seo
+find_next.title=Aimsigh an ch茅ad sampla eile den nath sin
+find_next_label=Ar aghaidh
+find_highlight=Aibhsigh uile
+find_match_case_label=C谩s铆ogair
+find_reached_top=Ag barr na c谩ip茅ise, ag lean煤int 贸n mbun
+find_reached_bottom=Ag bun na c谩ip茅ise, ag lean煤int 贸n mbarr
+find_not_found=Fr谩sa gan aimsi煤
+
+# Error panel labels
+error_more_info=Tuilleadh Eolais
+error_less_info=N铆os L煤 Eolais
+error_close=D煤n
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Teachtaireacht: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Cruach: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Comhad: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=L铆ne: {{line}}
+rendering_error=Tharla earr谩id agus an leathanach 谩 leagan amach.
+
+# Predefined zoom values
+page_scale_width=Leithead Leathanaigh
+page_scale_fit=Laghdaigh go dt铆 an Leathanach
+page_scale_auto=S煤m谩il Uathoibr铆och
+page_scale_actual=F铆ormh茅id
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Earr谩id
+loading_error=Tharla earr谩id agus an ch谩ip茅is PDF 谩 l贸d谩il.
+invalid_file_error=Comhad neamhbhail铆 n贸 truaillithe PDF.
+missing_file_error=Comhad PDF ar iarraidh.
+unexpected_response_error=Freagra 贸n bhfreastala铆 nach rabhthas ag s煤il leis.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[An贸t谩il {{type}}]
+password_label=Cuir an focal faire isteach chun an comhad PDF seo a oscailt.
+password_invalid=Focal faire m铆cheart. D茅an iarracht eile.
+password_ok=OK
+password_cancel=Cealaigh
+
+printing_not_supported=Rabhadh: N铆 thaca铆onn an brabhs谩la铆 le priont谩il go hioml谩n.
+printing_not_ready=Rabhadh: N铆 f茅idir an PDF a phriont谩il go dt铆 go mbeidh an ch谩ip茅is ioml谩n l贸d谩ilte.
+web_fonts_disabled=T谩 cl贸fhoirne Gr茅as谩in d铆chumasaithe: n铆 f茅idir cl贸fhoirne leabaithe PDF a 煤s谩id.
+document_colors_not_allowed=N铆l cead ag c谩ip茅is铆 PDF a ndathanna f茅in a roghn煤: t谩 鈥淭abhair cead do leathanaigh a ndathanna f茅in a roghn煤鈥� d铆chumasaithe sa mbrabhs谩la铆.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/gd/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/gd/viewer.properties
new file mode 100644
index 0000000..e5a01c5
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/gd/viewer.properties
@@ -0,0 +1,215 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=An duilleag roimhe
+previous_label=Air ais
+next.title=An ath-dhuilleag
+next_label=Air adhart
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=Duilleag
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=脿 {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} 脿 {{pagesCount}})
+
+zoom_out.title=S霉m a-mach
+zoom_out_label=S霉m a-mach
+zoom_in.title=S霉m a-steach
+zoom_in_label=S霉m a-steach
+zoom.title=S霉m
+presentation_mode.title=Gearr leum dhan mhodh taisbeanaidh
+presentation_mode_label=Am modh taisbeanaidh
+open_file.title=Fosgail faidhle
+open_file_label=Fosgail
+print.title=Cl貌-bhuail
+print_label=Cl貌-bhuail
+download.title=Luchdaich a-nuas
+download_label=Luchdaich a-nuas
+bookmark.title=An sealladh l脿ithreach (d猫an lethbhreac no fosgail e ann an uinneag 霉r)
+bookmark_label=An sealladh l脿ithreach
+
+# Secondary toolbar and context menu
+tools.title=Innealan
+tools_label=Innealan
+first_page.title=Rach gun chiad duilleag
+first_page.label=Rach gun chiad duilleag
+first_page_label=Rach gun chiad duilleag
+last_page.title=Rach gun duilleag mu dheireadh
+last_page.label=Rach gun duilleag mu dheireadh
+last_page_label=Rach gun duilleag mu dheireadh
+page_rotate_cw.title=Cuairtich gu deiseil
+page_rotate_cw.label=Cuairtich gu deiseil
+page_rotate_cw_label=Cuairtich gu deiseil
+page_rotate_ccw.title=Cuairtich gu tuathail
+page_rotate_ccw.label=Cuairtich gu tuathail
+page_rotate_ccw_label=Cuairtich gu tuathail
+
+cursor_text_select_tool.title=Cuir an comas inneal taghadh an teacsa
+cursor_text_select_tool_label=Inneal taghadh an teacsa
+cursor_hand_tool.title=Cuir inneal na l脿imhe an comas
+cursor_hand_tool_label=Inneal na l脿imhe
+
+scroll_vertical.title=Cleachd sgroladh inghearach
+scroll_vertical_label=Sgroladh inghearach
+scroll_horizontal.title=Cleachd sgroladh c貌mhnard
+scroll_horizontal_label=Sgroladh c貌mhnard
+scroll_wrapped.title=Cleachd sgroladh paisgte
+scroll_wrapped_label=Sgroladh paisgte
+
+spread_none.title=Na cuir c貌mhla sgoileadh dhuilleagan
+spread_none_label=Gun sgaoileadh dhuilleagan
+spread_odd.title=Cuir c貌mhla duilleagan sgaoilte a th貌isicheas le duilleagan aig a bheil 脿ireamh chorr
+spread_odd_label=Sgaoileadh dhuilleagan corra
+spread_even.title=Cuir c貌mhla duilleagan sgaoilte a th貌isicheas le duilleagan aig a bheil 脿ireamh chothrom
+spread_even_label=Sgaoileadh dhuilleagan cothrom
+
+# Document properties dialog box
+document_properties.title=Roghainnean na sgr矛obhainne鈥�
+document_properties_label=Roghainnean na sgr矛obhainne鈥�
+document_properties_file_name=Ainm an fhaidhle:
+document_properties_file_size=Meud an fhaidhle:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=Tiotal:
+document_properties_author=脵ghdar:
+document_properties_subject=Cuspair:
+document_properties_keywords=Faclan-luirg:
+document_properties_creation_date=Latha a chruthachaidh:
+document_properties_modification_date=Latha atharrachaidh:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Cruthadair:
+document_properties_producer=Saothraiche a' PDF:
+document_properties_version=Tionndadh a' PDF:
+document_properties_page_count=脌ireamh de dhuilleagan:
+document_properties_page_size=Meud na duilleige:
+document_properties_page_size_unit_inches=ann an
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=portraid
+document_properties_page_size_orientation_landscape=dreach-t矛re
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Litir
+document_properties_page_size_name_legal=Laghail
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+document_properties_close=D霉in
+
+print_progress_message=Ag ullachadh na sgr矛obhainn airson cl貌-bhualadh鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=Sguir dheth
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Toglaich am b脿r-taoibh
+toggle_sidebar_notification.title=Toglaich am b脿r-taoibh (tha oir-loidhne/ceanglachain aig an sgr矛obhainn)
+toggle_sidebar_label=Toglaich am b脿r-taoibh
+document_outline.title=Seall oir-loidhne na sgr矛obhainn (d猫an briogadh d霉bailte airson a h-uile n矛 a leudachadh/a cho-theannadh)
+document_outline_label=Oir-loidhne na sgr矛obhainne
+attachments.title=Seall na ceanglachain
+attachments_label=Ceanglachain
+thumbs.title=Seall na dealbhagan
+thumbs_label=Dealbhagan
+findbar.title=Lorg san sgr矛obhainn
+findbar_label=Lorg
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Duilleag a {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Dealbhag duilleag a {{page}}
+
+# Find panel button title and messages
+find_input.title=Lorg
+find_input.placeholder=Lorg san sgr矛obhainn...
+find_previous.title=Lorg l脿thair roimhe na h-abairt seo
+find_previous_label=Air ais
+find_next.title=Lorg ath-l脿thair na h-abairt seo
+find_next_label=Air adhart
+find_highlight=Soillsich a h-uile
+find_match_case_label=Aire do litrichean m貌ra is beaga
+find_reached_top=R脿inig sinn barr na duilleige, a' leantainn air adhart o bhonn na duilleige
+find_reached_bottom=R脿inig sinn bonn na duilleige, a' leantainn air adhart o bharr na duilleige
+find_not_found=Cha deach an abairt a lorg
+
+# Error panel labels
+error_more_info=Barrachd fiosrachaidh
+error_less_info=Nas lugha de dh'fhiosrachadh
+error_close=D霉in
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Teachdaireachd: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stac: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Faidhle: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Loidhne: {{line}}
+rendering_error=Thachair mearachd r猫 reandaradh na duilleige.
+
+# Predefined zoom values
+page_scale_width=Leud na duilleige
+page_scale_fit=Freagair ri meud na duilleige
+page_scale_auto=S霉m f猫in-obrachail
+page_scale_actual=Am f矛or-mheud
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Mearachd
+loading_error=Thachair mearachd r猫 luchdadh a' PDF.
+invalid_file_error=Faidhle PDF a tha m矛-dhligheach no coirbte.
+missing_file_error=Faidhle PDF a tha a dh矛th.
+unexpected_response_error=Freagairt on fhrithealaiche ris nach robh d霉il.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[N貌tachadh {{type}}]
+password_label=Cuir a-steach am facal-faire gus am faidhle PDF seo fhosgladh.
+password_invalid=Tha am facal-faire cearr. Nach fheuch thu ris a-rithist?
+password_ok=Ceart ma-tha
+password_cancel=Sguir dheth
+
+printing_not_supported=Rabhadh: Chan eil am brabhsair seo a' cur l脿n-taic ri cl貌-bhualadh.
+printing_not_ready=Rabhadh: Cha deach am PDF a luchdadh gu tur airson cl貌-bhualadh.
+web_fonts_disabled=Tha cruthan-cl貌 l矛n 脿 comas: Chan urrainn dhuinn cruthan-cl貌 PDF leabaichte a chleachdadh.
+document_colors_not_allowed=Chan fhaod sgr矛obhainnean PDF na dathan aca fh猫in a chleachdadh: Tha 鈥淟eig le duilleagan na dathan aca fh猫in a chleachdadh鈥� 脿 comas sa bhrabhsair.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/gl/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/gl/viewer.properties
new file mode 100644
index 0000000..f393fca
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/gl/viewer.properties
@@ -0,0 +1,168 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=P谩xina anterior
+previous_label=Anterior
+next.title=Seguinte p谩xina
+next_label=Seguinte
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+
+zoom_out.title=Reducir
+zoom_out_label=Reducir
+zoom_in.title=Ampliar
+zoom_in_label=Ampliar
+zoom.title=Zoom
+presentation_mode.title=Cambiar ao modo presentaci贸n
+presentation_mode_label=Modo presentaci贸n
+open_file.title=Abrir ficheiro
+open_file_label=Abrir
+print.title=Imprimir
+print_label=Imprimir
+download.title=Descargar
+download_label=Descargar
+bookmark.title=Vista actual (copiar ou abrir nunha nova xanela)
+bookmark_label=Vista actual
+
+# Secondary toolbar and context menu
+tools.title=Ferramentas
+tools_label=Ferramentas
+first_page.title=Ir 谩 primeira p谩xina
+first_page.label=Ir 谩 primeira p谩xina
+first_page_label=Ir 谩 primeira p谩xina
+last_page.title=Ir 谩 煤ltima p谩xina
+last_page.label=Ir 谩 煤ltima p谩xina
+last_page_label=Ir 谩 煤ltima p谩xina
+page_rotate_cw.title=Rotar no sentido das agullas do reloxo
+page_rotate_cw.label=Rotar no sentido das agullas do reloxo
+page_rotate_cw_label=Rotar no sentido das agullas do reloxo
+page_rotate_ccw.title=Rotar no sentido contrario 谩s agullas do reloxo
+page_rotate_ccw.label=Rotar no sentido contrario 谩s agullas do reloxo
+page_rotate_ccw_label=Rotar no sentido contrario 谩s agullas do reloxo
+
+
+# Document properties dialog box
+document_properties.title=Propiedades do documento鈥�
+document_properties_label=Propiedades do documento鈥�
+document_properties_file_name=Nome do ficheiro:
+document_properties_file_size=Tama帽o do ficheiro:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=T铆tulo:
+document_properties_author=Autor:
+document_properties_subject=Asunto: 
+document_properties_keywords=Palabras clave:
+document_properties_creation_date=Data de creaci贸n:
+document_properties_modification_date=Data de modificaci贸n:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Creado por:
+document_properties_producer=Xenerador do PDF:
+document_properties_version=Versi贸n de PDF:
+document_properties_page_count=N煤mero de p谩xinas:
+document_properties_close=Pechar
+
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Amosar/agochar a barra lateral
+toggle_sidebar_label=Amosar/agochar a barra lateral
+attachments.title=Amosar anexos
+attachments_label=Anexos
+thumbs.title=Amosar miniaturas
+thumbs_label=Miniaturas
+findbar.title=Atopar no documento
+findbar_label=Atopar
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=P谩xina {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Miniatura da p谩xina {{page}}
+
+# Find panel button title and messages
+find_previous.title=Atopar a anterior aparici贸n da frase
+find_previous_label=Anterior
+find_next.title=Atopar a seguinte aparici贸n da frase
+find_next_label=Seguinte
+find_highlight=Realzar todo
+find_match_case_label=Diferenciar mai煤sculas de min煤sculas
+find_reached_top=Chegouse ao inicio do documento, continuar desde o final
+find_reached_bottom=Chegouse ao final do documento, continuar desde o inicio
+find_not_found=Non se atopou a frase
+
+# Error panel labels
+error_more_info=M谩is informaci贸n
+error_less_info=Menos informaci贸n
+error_close=Pechar
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (Identificador da compilaci贸n: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Mensaxe: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Pila: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Ficheiro: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Li帽a: {{line}}
+rendering_error=Produciuse un erro ao representar a p谩xina.
+
+# Predefined zoom values
+page_scale_width=Largura da p谩xina
+page_scale_fit=Axuste de p谩xina
+page_scale_auto=Zoom autom谩tico
+page_scale_actual=Tama帽o actual
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Erro
+loading_error=Produciuse un erro ao cargar o PDF.
+invalid_file_error=Ficheiro PDF danado ou incorrecto.
+missing_file_error=Falta o ficheiro PDF.
+unexpected_response_error=Resposta inesperada do servidor.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[Anotaci贸n {{type}}]
+password_label=Escriba o contrasinal para abrir este ficheiro PDF.
+password_invalid=Contrasinal incorrecto. Tente de novo.
+password_ok=Aceptar
+password_cancel=Cancelar
+
+printing_not_supported=Aviso: A impresi贸n non 茅 compat铆bel de todo con este navegador.
+printing_not_ready=Aviso: O PDF non se cargou completamente para imprimirse.
+web_fonts_disabled=Desactiv谩ronse as fontes web:  foi impos铆bel usar as fontes incrustadas no PDF.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/gn/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/gn/viewer.properties
new file mode 100644
index 0000000..4137756
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/gn/viewer.properties
@@ -0,0 +1,242 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Kuatiarogue mboyvegua
+previous_label=Mboyvegua
+next.title=Kuatiarogue upeigua
+next_label=Upeigua
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=Kuatiarogue
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages={{pagesCount}} gui
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} of {{pagesCount}})
+
+zoom_out.title=Momich末
+zoom_out_label=Momich末
+zoom_in.title=Mbotuicha
+zoom_in_label=Mbotuicha
+zoom.title=Tuichakue
+presentation_mode.title=Jehechauka reko moambue
+presentation_mode_label=Jehechauka reko
+open_file.title=Marandurend谩pe jeike
+open_file_label=Jeike
+print.title=Monguatia
+print_label=Monguatia
+download.title=Mboguejy
+download_label=Mboguejy
+bookmark.title=Ag虄agua jehecha (mbohasar茫 t茅r茫 eike pete末 ovet茫 pyah煤pe)
+bookmark_label=Ag虄agua jehecha
+
+# Secondary toolbar and context menu
+tools.title=Tembipuru
+tools_label=Tembipuru
+first_page.title=Kuatiarogue 帽epyr农me jeho
+first_page.label=Kuatiarogue 帽epyr农me jeho
+first_page_label=Kuatiarogue 帽epyr农me jeho
+last_page.title=Kuatiarogue pah谩pe jeho
+last_page.label=Kuatiarogue pah谩pe jeho
+last_page_label=Kuatiarogue pah谩pe jeho
+page_rotate_cw.title=Arav贸icha mbojere
+page_rotate_cw.label=Arav贸icha mbojere
+page_rotate_cw_label=Arav贸icha mbojere
+page_rotate_ccw.title=Aravo rapykue gotyo mbojere
+page_rotate_ccw.label=Aravo rapykue gotyo mbojere
+page_rotate_ccw_label=Aravo rapykue gotyo mbojere
+
+cursor_text_select_tool.title=Emyandy mo帽e'岷絩茫 jeporavo rembipuru
+cursor_text_select_tool_label=Mo帽e'岷絩茫 jeporavo rembipuru
+cursor_hand_tool.title=Tembipuru po pegua myandy
+cursor_hand_tool_label=Tembipuru po pegua
+
+scroll_vertical.title=Eipuru jeku鈥檈 ykegu谩va
+scroll_vertical_label=Jeku鈥檈 ykegu谩va
+scroll_horizontal.title=Eipuru jeku鈥檈 yvate gotyo
+scroll_horizontal_label=Jeku鈥檈 yvate gotyo
+scroll_wrapped.title=Eipuru jeku鈥檈 mbohyrupyre
+scroll_wrapped_label=Jeku鈥檈 mbohyrupyre
+
+spread_none.title=Ani ejuaju spreads kuatiarogue ndive
+spread_none_label=Spreads 峄箁e
+spread_odd.title=Embojuaju kuatiarogue jepysokue e帽epyr农vo kuatiarogue impar-vagui
+spread_odd_label=Spreads impar
+spread_even.title=Embojuaju kuatiarogue jepysokue e帽epyr农vo kuatiarogue par-vagui
+spread_even_label=Ipukuve uvei
+
+# Document properties dialog box
+document_properties.title=Kuatia mba'etee鈥�
+document_properties_label=Kuatia mba'etee鈥�
+document_properties_file_name=Marandurenda r茅ra:
+document_properties_file_size=Marandurenda tuichakue:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=Teratee:
+document_properties_author=Apoh谩ra:
+document_properties_subject=Mba'egua:
+document_properties_keywords=Jehero:
+document_properties_creation_date=Te帽oihague arange:
+document_properties_modification_date=I帽ambue hague arange:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Apo'ypyha:
+document_properties_producer=PDF mbosako'iha:
+document_properties_version=PDF mbojuehegua:
+document_properties_page_count=Kuatiarogue papapy:
+document_properties_page_size=Kuatiarogue tuichakue:
+document_properties_page_size_unit_inches=Amo
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=O末h谩icha
+document_properties_page_size_orientation_landscape=apaisado
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Kuatia帽e'岷�
+document_properties_page_size_name_legal=Tee
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=脩anduti jahecha pya鈥檈:
+document_properties_linearized_yes=A帽ete
+document_properties_linearized_no=Ah谩niri
+document_properties_close=Mboty
+
+print_progress_message=Embosako'i kuatia emonguatia hag虄ua鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=Heja
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Tenda yke moambue
+toggle_sidebar_notification.title=Embojopyru tenda ykegua (kuatia oguereko kora/marandurenda moir农ha)
+toggle_sidebar_label=Tenda yke moambue
+document_outline.title=Ehechauka kuatia rape (eikutu mok玫i jey embotuicha/emomich末 hag虄ua opavavete mba'epuru)
+document_outline_label=Kuatia apopyre
+attachments.title=Moir农ha jehechauka
+attachments_label=Moir农ha
+thumbs.title=Mba'emir末 jehechauka
+thumbs_label=Mba'emir末
+findbar.title=Kuati谩pe jeheka
+findbar_label=Juhu
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Kuatiarogue {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Kuatiarogue mba'emir末 {{page}}
+
+# Find panel button title and messages
+find_input.title=Juhu
+find_input.placeholder=Kuati谩pe jejuhu鈥�
+find_previous.title=Ejuhu 帽e'岷絩ys媒i os岷�'ypy hague
+find_previous_label=Mboyvegua
+find_next.title=Eho 帽e'岷� juhupyre upeigu谩vape
+find_next_label=Upeigua
+find_highlight=Embojekuaavepa
+find_match_case_label=Ejesareko taiguasu/taimich末re
+find_entire_word_label=脩e鈥欋航 o末mb谩va 
+find_reached_top=Ojehupyty kuatia 帽epyr农, oku'eje媒ta kuatia paha guive
+find_reached_bottom=Ojehupyty kuatia paha, oku'eje媒ta kuatia 帽epyr农 guive
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]={{current}} {{total}} ojojogu谩va
+find_match_count[two]={{current}} {{total}} ojojogu谩va
+find_match_count[few]={{current}} {{total}} ojojogu谩va
+find_match_count[many]={{current}} {{total}} ojojogu谩va
+find_match_count[other]={{current}} {{total}} ojojogu谩va
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]=Hetave {{limit}} ojojogu谩va
+find_match_count_limit[one]=Hetave {{limit}} ojojogua
+find_match_count_limit[two]=Hetave {{limit}} ojojogu谩va
+find_match_count_limit[few]=Hetave {{limit}} ojojogu谩va
+find_match_count_limit[many]=Hetave {{limit}} ojojogu谩va
+find_match_count_limit[other]=Hetave {{limit}} ojojogu谩va
+find_not_found=脩e'岷絩ys媒i ojejuhu'峄箆a
+
+# Error panel labels
+error_more_info=Maranduve
+error_less_info=Sa'ive marandu
+error_close=Mboty
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=脩e'岷絤ondo: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Mbojo'apy: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Marandurenda: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Tairenda: {{line}}
+rendering_error=Oiko jejavy ehechaukas茅vo kuatiarogue.
+
+# Predefined zoom values
+page_scale_width=Kuatiarogue pekue
+page_scale_fit=Kuatiarogue 帽emo末por茫
+page_scale_auto=Tuichakue ijehegu铆va
+page_scale_actual=Tuichakue ag虄agua
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=O末va铆va
+loading_error=Oiko jejavy PDF o帽emye帽yh岷絥gu茅vo.
+invalid_file_error=PDF marandurenda ndoik贸iva t茅r茫 ivaipyr茅va.
+missing_file_error=Ndaip贸ri PDF marandurenda
+unexpected_response_error=Mohendahavusu mbohov谩i 帽eha'ar玫'峄箆a.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[Jehaipy {{type}}]
+password_label=Emoinge 帽e'岷矫眅mi eipe'a hag虄ua ko marandurenda PDF.
+password_invalid=脩e'岷矫眅mi ndoik贸iva. Eha'茫 jey.
+password_ok=MONE抹
+password_cancel=Heja
+
+printing_not_supported=Kyhyjer茫: 脩embokuatia ndojokupytyp谩i ko kundah谩ra ndive.
+printing_not_ready=Kyhyjer茫: Ko PDF nahenyh岷絤b谩i o帽embokuatia hag虄u谩icha.
+web_fonts_disabled=脩anduti taity o帽emong茅ma: ndaikatumo'茫i eipuru PDF jehai'铆va taity.
+document_colors_not_allowed=Kuatiaku茅ra PDF ndaikat煤i oipuru isa'yku茅ra tee: 鈥淓mone末 kuatiarogu茅pe toiporavo isa'yku茅ra tee鈥� o帽emongeh铆na kundah谩rape.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/gu-IN/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/gu-IN/viewer.properties
new file mode 100644
index 0000000..9a13392
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/gu-IN/viewer.properties
@@ -0,0 +1,242 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=嗒喃囙嗒距喃� 嗒嗒ㄠ珌嗒�
+previous_label=嗒喃囙嗒距喃�
+next.title=嗒嗋獥嗒赤喃� 嗒嗒ㄠ珌嗒�
+next_label=嗒嗋獥嗒赤喃佮獋
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=嗒嗒ㄠ珌嗒�
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=嗒ㄠ珛 {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} 嗒ㄠ珛 {{pagesCount}})
+
+zoom_out.title=嗒珛嗒熰珌 嗒曕喃�
+zoom_out_label=嗒珛嗒熰珌 嗒曕喃�
+zoom_in.title=嗒ㄠ嗒ㄠ珌嗒� 嗒曕喃�
+zoom_in_label=嗒ㄠ嗒ㄠ珌嗒� 嗒曕喃�
+zoom.title=嗒ㄠ嗒ㄠ珌嗒� 嗒珛嗒熰珌 嗒曕喃�
+presentation_mode.title=嗒班獪喃傕獑嗒� 嗒膏珝嗒ム嗒む嗒嗒� 嗒溹嗒�
+presentation_mode_label=嗒班獪喃傕獑嗒� 嗒膏珝嗒ム嗒む
+open_file.title=嗒嗒囙 嗒栢珛嗒侧珛
+open_file_label=嗒栢珛嗒侧珛
+print.title=嗒涏嗒珛
+print_label=嗒涏嗒班珛
+download.title=嗒∴嗒夃嗒侧珛嗒�
+download_label=嗒∴嗒夃嗒侧珛嗒�
+bookmark.title=嗒掂喃嵿嗒嗒� 嗒︵珒嗒多珝嗒� (嗒ㄠ喃� 嗒掂嗒ㄠ珝嗒∴珛嗒嗒� 嗒ㄠ獣嗒� 嗒曕喃� 嗒呧嗒掂 嗒栢珛嗒侧珛)
+bookmark_label=嗒掂喃嵿嗒嗒� 嗒︵珒嗒多珝嗒�
+
+# Secondary toolbar and context menu
+tools.title=嗒膏嗒о喃�
+tools_label=嗒膏嗒о喃�
+first_page.title=嗒喃囙嗒距獋 嗒嗒ㄠ嗒嗒� 嗒溹嗒�
+first_page.label=嗒喃囙嗒距獋 嗒嗒ㄠ嗒嗒� 嗒溹嗒�
+first_page_label=嗒珝嗒班嗒� 嗒嗒ㄠ嗒� 嗒 嗒溹嗒�
+last_page.title=嗒涏珖嗒侧珝嗒侧 嗒嗒ㄠ嗒� 嗒 嗒溹嗒�
+last_page.label=嗒涏珖嗒侧珝嗒侧 嗒嗒ㄠ嗒嗒� 嗒溹嗒�
+last_page_label=嗒涏珖嗒侧珝嗒侧 嗒嗒ㄠ嗒� 嗒 嗒溹嗒�
+page_rotate_cw.title=嗒樴嗒苦嗒距嗒ㄠ嗒� 嗒曕嗒傕獰嗒� 嗒む嗒� 嗒珖嗒班喃�
+page_rotate_cw.label=嗒樴嗒苦嗒距嗒ㄠ嗒� 嗒曕嗒傕獰嗒距喃� 嗒溹珖嗒� 嗒珖嗒班喃�
+page_rotate_cw_label=嗒樴嗒苦嗒距嗒ㄠ嗒� 嗒曕嗒傕獰嗒� 嗒む嗒� 嗒珖嗒班喃�
+page_rotate_ccw.title=嗒樴嗒苦嗒距嗒ㄠ嗒� 嗒曕嗒傕獰嗒距喃� 嗒夃嗒熰珋 嗒︵嗒多嗒嗒� 嗒珖嗒班喃�
+page_rotate_ccw.label=嗒樴嗒苦嗒距嗒ㄠ嗒� 嗒曕嗒傕獰嗒距喃� 嗒夃嗒熰珋 嗒︵嗒多嗒嗒� 嗒珖嗒班喃�
+page_rotate_ccw_label=嗒樴嗒苦嗒距嗒ㄠ嗒� 嗒曕嗒傕獰嗒距喃� 嗒掂嗒班珌嗒︵珝嗒� 嗒珖嗒班喃�
+
+cursor_text_select_tool.title=嗒熰珖嗒曕珝嗒膏珝嗒� 嗒嗒傕嗒椸珋 嗒熰珎嗒� 嗒膏獣喃嵿嗒� 嗒曕喃�
+cursor_text_select_tool_label=嗒熰珖嗒曕珝嗒膏珝嗒� 嗒嗒傕嗒椸珋 嗒熰珎嗒�
+cursor_hand_tool.title=嗒灌嗒ム嗒距獋 嗒膏嗒о嗒ㄠ珖 嗒膏獣喃嵿嗒苦 嗒曕喃�
+cursor_hand_tool_label=嗒灌珖嗒ㄠ珝嗒� 嗒熰珎嗒�
+
+scroll_vertical.title=嗒娻喃� 嗒膏珝嗒曕珝嗒班珛嗒侧嗒傕獥嗒ㄠ珛 嗒夃嗒珛嗒� 嗒曕喃�
+scroll_vertical_label=嗒娻喃� 嗒膏珝嗒曕珝嗒班珛嗒侧嗒傕獥
+scroll_horizontal.title=嗒嗋喃� 嗒膏珝嗒曕珝嗒班珛嗒侧嗒傕獥嗒ㄠ珛 嗒夃嗒珛嗒� 嗒曕喃�
+scroll_horizontal_label=嗒嗋喃� 嗒膏珝嗒曕珝嗒班珛嗒侧嗒傕獥
+scroll_wrapped.title=嗒嗋嗒班嗒� 嗒膏珝嗒曕珝嗒班珛嗒侧嗒傕獥嗒ㄠ珛 嗒夃嗒珛嗒� 嗒曕喃�
+scroll_wrapped_label=嗒嗋嗒班嗒� 嗒膏珝嗒曕珝嗒班珛嗒侧嗒傕獥
+
+spread_none.title=嗒珒嗒粪珝嗒� 嗒膏珝嗒珝嗒班珖嗒∴嗒距獋 嗒溹珛嗒∴嗒掂喃� 嗒ㄠ喃�嗒�
+spread_none_label=嗒曕珛嗒� 嗒膏珝嗒珝嗒班珖嗒� 嗒ㄠ喃�
+spread_odd.title=嗒忇獣喃�-嗒曕珝嗒班嗒距獋嗒曕嗒� 嗒珒嗒粪珝嗒犩珛 嗒膏嗒ム珖 嗒珝嗒班嗒班獋嗒� 嗒ム嗒距獋 嗒珒嗒粪珝嗒� 嗒膏珝嗒珝嗒班珖嗒∴嗒距獋 嗒溹珛嗒∴嗒�
+spread_odd_label=嗒忇獣喃� 嗒膏珝嗒珝嗒班珖嗒∴珝嗒�
+spread_even.title=嗒ㄠ獋嗒-嗒曕珝嗒班嗒距獋嗒曕嗒� 嗒珒嗒粪珝嗒犩珛嗒ム珋 嗒多喃� 嗒ム嗒距獋 嗒珒嗒粪珝嗒� 嗒膏珝嗒珝嗒班珖嗒∴嗒距獋 嗒溹珛嗒∴嗒�
+spread_even_label=嗒膏嗒栢珌嗒� 嗒珖嗒侧嗒掂喃佮獋
+
+# Document properties dialog box
+document_properties.title=嗒︵喃嵿嗒距喃囙獪 嗒椸珌嗒`嗒班珝嗒珛鈥�
+document_properties_label=嗒︵喃嵿嗒距喃囙獪 嗒椸珌嗒`嗒班珝嗒珛鈥�
+document_properties_file_name=嗒嗒囙 嗒ㄠ嗒�:
+document_properties_file_size=嗒嗒囙 嗒嗒�:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} 嗒嗒囙獰)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} 嗒嗒囙獰)
+document_properties_title=嗒多珋嗒班珝嗒粪獣:
+document_properties_author=嗒侧珖嗒栢獣:
+document_properties_subject=嗒掂嗒粪:
+document_properties_keywords=嗒曕嗒掂喃嵿:
+document_properties_creation_date=嗒ㄠ嗒班珝嗒嗒� 嗒む嗒班珋嗒�:
+document_properties_modification_date=嗒珖嗒班嗒距 嗒む嗒班珋嗒�:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=嗒ㄠ嗒班珝嗒嗒む:
+document_properties_producer=PDF 嗒ㄠ嗒班珝嗒嗒む:
+document_properties_version=PDF 嗒嗋喃冟喃嵿嗒�:
+document_properties_page_count=嗒嗒ㄠ嗒� 嗒椸嗒む喃�:
+document_properties_page_size=嗒珒嗒粪珝嗒犩喃佮獋 嗒曕:
+document_properties_page_size_unit_inches=嗒囙獋嗒�
+document_properties_page_size_unit_millimeters=嗒珋嗒珋
+document_properties_page_size_orientation_portrait=嗒夃喃佮獋
+document_properties_page_size_orientation_landscape=嗒嗋喃�
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=嗒喃嵿
+document_properties_page_size_name_legal=嗒曕嗒嗒距獣喃�嗒�
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string=
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=嗒澿嗒珋 嗒掂珔嗒� 嗒︵珒嗒多珝嗒�:
+document_properties_linearized_yes=嗒灌
+document_properties_linearized_no=嗒ㄠ
+document_properties_close=嗒獋嗒� 嗒曕喃�
+
+print_progress_message=嗒涏嗒獣嗒距 嗒嗒熰珖 嗒︵喃嵿嗒距喃囙獪 嗒む珗嗒嗒� 嗒曕喃� 嗒班喃嵿嗒� 嗒涏珖鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=嗒班 嗒曕喃�
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=嗒熰珘嗒椸 嗒嗒溹珌嗒獰喃嵿獰喃�
+toggle_sidebar_notification.title=嗒膏嗒囙嗒嗒班喃� 嗒熰珘嗒椸 嗒曕喃�(嗒︵喃嵿嗒距喃囙獪嗒ㄠ珋 嗒班珎嗒喃囙獤嗒�/嗒溹珛嗒∴嗒`珛 嗒多嗒珖嗒� 嗒涏珖)
+toggle_sidebar_label=嗒熰珘嗒椸 嗒嗒溹珌嗒獰喃嵿獰喃�
+document_outline.title=嗒︵喃嵿嗒距喃囙獪嗒ㄠ珋 嗒班珎嗒喃囙獤嗒� 嗒嗒距喃�(嗒喃� 嗒嗋獓嗒熰喃嵿嗒ㄠ珖 嗒掂嗒膏珝嗒む珒嗒�/嗒膏獋嗒曕珌嗒氞嗒� 嗒曕嗒掂 嗒嗒熰珖 嗒∴嗒�-嗒曕珝嗒侧嗒� 嗒曕喃�)
+document_outline_label=嗒︵喃嵿嗒距喃囙獪 嗒班珎嗒喃囙獤嗒�
+attachments.title=嗒溹珛嗒∴嗒`珛嗒ㄠ珖 嗒嗒距喃�
+attachments_label=嗒溹珛嗒∴嗒`珛
+thumbs.title=嗒ム獋嗒喃囙喃嵿 嗒嗒距喃�
+thumbs_label=嗒ム獋嗒喃囙喃嵿
+findbar.title=嗒︵喃嵿嗒距喃囙獪嗒嗒� 嗒多珛嗒о珛
+findbar_label=嗒多珛嗒о珛
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=嗒嗒ㄠ珌嗒� {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=嗒嗒ㄠ嗒� {{page}} 嗒ㄠ珌嗒� 嗒ム獋嗒喃囙喃嵿
+
+# Find panel button title and messages
+find_input.title=嗒多珛嗒о珛
+find_input.placeholder=嗒︵喃嵿嗒距喃囙獪嗒嗒� 嗒多珛嗒о珛鈥�
+find_previous.title=嗒多喃嵿嗒膏喃傕嗒ㄠ珋 嗒嗒涏喃� 嗒樴獰嗒ㄠ嗒ㄠ珖 嗒多珛嗒о珛
+find_previous_label=嗒喃囙嗒距獋嗒ㄠ珌
+find_next.title=嗒多喃嵿嗒膏喃傕嗒ㄠ珋 嗒嗋獥嗒赤喃� 嗒樴獰嗒ㄠ嗒ㄠ珖 嗒多珛嗒о珛
+find_next_label=嗒嗋獥嗒赤喃佮獋
+find_highlight=嗒喃� 嗒珝嗒班獣嗒距嗒苦 嗒曕喃�
+find_match_case_label=嗒曕珖嗒� 嗒獋嗒о喃囙嗒距喃�
+find_entire_word_label=嗒膏獋嗒珎嗒班珝嗒� 嗒多喃嵿喃�
+find_reached_top=嗒︵喃嵿嗒距喃囙獪嗒ㄠ嗒� 嗒熰珛嗒氞珖 嗒喃嬥獋嗒氞珋 嗒椸嗒�, 嗒む嗒苦喃囙喃� 嗒氞嗒侧珌 嗒曕喃囙 嗒灌喃�
+find_reached_bottom=嗒︵喃嵿嗒距喃囙獪嗒ㄠ嗒� 嗒呧獋嗒む珖 嗒喃嬥獋嗒氞珋 嗒椸嗒�, 嗒夃嗒班喃� 嗒氞嗒侧珌 嗒曕喃囙 嗒灌喃�
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]={{total}} 嗒嗒傕喃� {{current}} 嗒膏嗒栢珌嗒� 嗒喃嵿喃佮獋
+find_match_count[two]={{total}} 嗒嗒傕喃� {{current}} 嗒膏嗒栢 嗒喃嵿嗒距獋
+find_match_count[few]={{total}} 嗒嗒傕喃� {{current}} 嗒膏嗒栢 嗒喃嵿嗒距獋
+find_match_count[many]={{total}} 嗒嗒傕喃� {{current}} 嗒膏嗒栢 嗒喃嵿嗒距獋
+find_match_count[other]={{total}} 嗒嗒傕喃� {{current}} 嗒膏嗒栢 嗒喃嵿嗒距獋
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]={{limit}} 嗒曕嗒む嗒� 嗒掂喃� 嗒膏嗒栢 嗒喃嵿嗒距獋
+find_match_count_limit[one]={{limit}} 嗒曕嗒む嗒� 嗒掂喃� 嗒膏嗒栢珌嗒� 嗒喃嵿喃佮獋
+find_match_count_limit[two]={{limit}} 嗒曕嗒む嗒� 嗒掂喃� 嗒膏嗒栢 嗒喃嵿嗒距獋
+find_match_count_limit[few]={{limit}} 嗒曕嗒む嗒� 嗒掂喃� 嗒膏嗒栢 嗒喃嵿嗒距獋
+find_match_count_limit[many]={{limit}} 嗒曕嗒む嗒� 嗒掂喃� 嗒膏嗒栢 嗒喃嵿嗒距獋
+find_match_count_limit[other]={{limit}} 嗒曕嗒む嗒� 嗒掂喃� 嗒膏嗒栢 嗒喃嵿嗒距獋
+find_not_found=嗒多喃嵿嗒膏喃傕 嗒喃嵿喃� 嗒ㄠ喃�
+
+# Error panel labels
+error_more_info=嗒掂嗒距喃� 嗒溹嗒`獣嗒距喃�
+error_less_info=嗒撪獩喃� 嗒溹嗒`獣嗒距喃�
+error_close=嗒獋嗒� 嗒曕喃�
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=嗒膏獋嗒︵珖嗒多珛: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=嗒膏珝嗒熰珖嗒�: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=嗒嗒囙: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=嗒掂嗒曕珝嗒�: {{line}}
+rendering_error=嗒珎嗒� 嗒夃喃嵿嗒掂珋 嗒溹珝嗒嗒班珖 嗒嗒ㄠ嗒傕喃� 嗒班珖嗒ㄠ珝嗒� 嗒曕喃� 嗒班喃嵿嗒� 嗒灌珛嗒�.
+
+# Predefined zoom values
+page_scale_width=嗒嗒ㄠ嗒ㄠ珋 嗒喃嬥嗒距獓
+page_scale_fit=嗒嗒ㄠ珌嗒� 嗒獋嗒о喃囙嗒む珌
+page_scale_auto=嗒嗋嗒珖嗒赤珖 嗒ㄠ嗒ㄠ珌嗒傕喃嬥獰喃� 嗒曕喃�
+page_scale_actual=嗒氞珛嗒曕珝嗒曕 嗒嗒�
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=嗒珎嗒�
+loading_error=嗒珎嗒� 嗒夃喃嵿嗒掂珋 嗒溹珝嗒嗒班珖 PDF 嗒ㄠ珖 嗒侧嗒掂珋 嗒班喃嵿嗒� 嗒灌珛嗒�.
+invalid_file_error=嗒呧喃嬥獥喃嵿 嗒呧嗒掂 嗒嗒傕獥喃囙 PDF 嗒嗒囙.
+missing_file_error=嗒椸珌嗒� 嗒ム喃囙 PDF 嗒嗒囙.
+unexpected_response_error=嗒呧嗒珖嗒曕珝嗒粪嗒� 嗒膏喃嵿嗒� 嗒珝嗒班嗒苦嗒距.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Annotation]
+password_label=嗒� PDF 嗒嗒囙嗒ㄠ珖 嗒栢珛嗒侧嗒� 嗒嗒膏嗒班珝嗒∴喃� 嗒︵嗒栢 嗒曕喃�.
+password_invalid=嗒呧喃嬥獥喃嵿 嗒嗒膏嗒班珝嗒�. 嗒喃囙嗒嗒ㄠ珋 嗒曕喃�嗒ㄠ珖 嗒喃� 嗒珝嗒班嗒む珝嗒� 嗒曕喃�.
+password_ok=嗒嗒距嗒�
+password_cancel=嗒班 嗒曕喃�
+
+printing_not_supported=嗒氞珖嗒む嗒`珋: 嗒涏嗒嗒距喃佮獋 嗒� 嗒珝嗒班嗒夃獫嗒� 嗒︵珝嗒︵嗒班 嗒膏獋嗒珎嗒班珝嗒`嗒`珖 嗒嗋嗒距嗒珎嗒� 嗒ㄠ喃�.
+printing_not_ready=Warning: PDF 嗒� 嗒涏嗒嗒� 嗒嗒熰珖 嗒膏獋嗒珎嗒班珝嗒`嗒`珖 嗒侧嗒掂珖嗒� 嗒涏珖.
+web_fonts_disabled=嗒掂珖嗒� 嗒珛嗒ㄠ珝嗒� 嗒ㄠ嗒粪珝嗒曕珝嗒班嗒� 嗒ム喃囙 嗒涏珖: 嗒嵿喃嵿喃囙 嗒ム喃囙 PDF 嗒珛嗒ㄠ珝嗒熰喃� 嗒掂嗒嗒掂嗒ㄠ珌嗒� 嗒呧嗒喃嵿.
+document_colors_not_allowed=PDF 嗒︵喃嵿嗒距喃囙獪喃� 嗒む珖嗒ㄠ嗒� 嗒珛嗒む嗒ㄠ 嗒班獋嗒椸珛嗒ㄠ珖 嗒掂嗒嗒掂 嗒嗒掂嗒ㄠ獥喃� 嗒嗋嗒む 嗒ㄠ喃�: '嗒む珖嗒ㄠ嗒� 嗒珛嗒む嗒ㄠ嗒� 嗒班獋嗒椸珛嗒ㄠ珖 嗒嗒傕 嗒曕嗒掂 嗒嗒熰珖 嗒嗒ㄠ嗒傕喃� 嗒嗒掂嗒ㄠ獥喃� 嗒嗋喃�' 嗒珝嗒班嗒夃獫嗒班嗒距獋 嗒ㄠ嗒粪珝嗒曕珝嗒班嗒� 嗒ム喃囙 嗒涏珖.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/he/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/he/viewer.properties
new file mode 100644
index 0000000..55a79cd
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/he/viewer.properties
@@ -0,0 +1,240 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=讚祝 拽讜讚诐
+previous_label=拽讜讚诐
+next.title=讚祝 讛讘讗
+next_label=讛讘讗
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=讚祝
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=诪转讜讱 {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} 诪转讜讱 {{pagesCount}})
+
+zoom_out.title=讛转专讞拽讜转
+zoom_out_label=讛转专讞拽讜转
+zoom_in.title=讛转拽专讘讜转
+zoom_in_label=讛转拽专讘讜转
+zoom.title=诪专讞拽 诪转爪讜讙讛
+presentation_mode.title=诪注讘专 诇诪爪讘 诪爪讙转
+presentation_mode_label=诪爪讘 诪爪讙转
+open_file.title=驻转讬讞转 拽讜讘抓
+open_file_label=驻转讬讞讛
+print.title=讛讚驻住讛
+print_label=讛讚驻住讛
+download.title=讛讜专讚讛
+download_label=讛讜专讚讛
+bookmark.title=转爪讜讙讛 谞讜讻讞讬转 (讛注转拽讛 讗讜 驻转讬讞讛 讘讞诇讜谉 讞讚砖)
+bookmark_label=转爪讜讙讛 谞讜讻讞讬转
+
+# Secondary toolbar and context menu
+tools.title=讻诇讬诐
+tools_label=讻诇讬诐
+first_page.title=诪注讘专 诇注诪讜讚 讛专讗砖讜谉
+first_page.label=诪注讘专 诇注诪讜讚 讛专讗砖讜谉
+first_page_label=诪注讘专 诇注诪讜讚 讛专讗砖讜谉
+last_page.title=诪注讘专 诇注诪讜讚 讛讗讞专讜谉
+last_page.label=诪注讘专 诇注诪讜讚 讛讗讞专讜谉
+last_page_label=诪注讘专 诇注诪讜讚 讛讗讞专讜谉
+page_rotate_cw.title=讛讟讬讛 注诐 讻讬讜讜谉 讛砖注讜谉
+page_rotate_cw.label=讛讟讬讛 注诐 讻讬讜讜谉 讛砖注讜谉
+page_rotate_cw_label=讛讟讬讛 注诐 讻讬讜讜谉 讛砖注讜谉
+page_rotate_ccw.title=讛讟讬讛 讻谞讙讚 讻讬讜讜谉 讛砖注讜谉
+page_rotate_ccw.label=讛讟讬讛 讻谞讙讚 讻讬讜讜谉 讛砖注讜谉
+page_rotate_ccw_label=讛讟讬讛 讻谞讙讚 讻讬讜讜谉 讛砖注讜谉
+
+cursor_text_select_tool.title=讛驻注诇转 讻诇讬 讘讞讬专转 讟拽住讟
+cursor_text_select_tool_label=讻诇讬 讘讞讬专转 讟拽住讟
+cursor_hand_tool.title=讛驻注诇转 讻诇讬 讛讬讚
+cursor_hand_tool_label=讻诇讬 讬讚
+
+scroll_vertical.title=砖讬诪讜砖 讘讙诇讬诇讛 讗谞讻讬转
+scroll_vertical_label=讙诇讬诇讛 讗谞讻讬转
+scroll_horizontal.title=砖讬诪讜砖 讘讙诇讬诇讛 讗讜驻拽讬转
+scroll_horizontal_label=讙诇讬诇讛 讗讜驻拽讬转
+scroll_wrapped.title=砖讬诪讜砖 讘讙诇讬诇讛 专爪讬驻讛
+scroll_wrapped_label=讙诇讬诇讛 专爪讬驻讛
+
+spread_none.title=诇讗 诇爪专祝 诪驻转讞讬 注诪讜讚讬诐
+spread_none_label=诇诇讗 诪驻转讞讬诐
+spread_odd.title=爪讬专讜祝 诪驻转讞讬 注诪讜讚讬诐 砖诪转讞讬诇讬诐 讘讚驻讬诐 注诐 诪住驻专讬诐 讗讬志讝讜讙讬讬诐
+spread_odd_label=诪驻转讞讬诐 讗讬志讝讜讙讬讬诐
+spread_even.title=爪讬专讜祝 诪驻转讞讬 注诪讜讚讬诐 砖诪转讞讬诇讬诐 讘讚驻讬诐 注诐 诪住驻专讬诐 讝讜讙讬讬诐
+spread_even_label=诪驻转讞讬诐 讝讜讙讬讬诐
+
+# Document properties dialog box
+document_properties.title=诪讗驻讬讬谞讬 诪住诪讱鈥�
+document_properties_label=诪讗驻讬讬谞讬 诪住诪讱鈥�
+document_properties_file_name=砖诐 拽讜讘抓:
+document_properties_file_size=讙讜讚诇 讛拽讜讘抓:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} 拽状讘 ({{size_b}} 讘转讬诐)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} 诪状讘 ({{size_b}} 讘转讬诐)
+document_properties_title=讻讜转专转:
+document_properties_author=诪讞讘专:
+document_properties_subject=谞讜砖讗:
+document_properties_keywords=诪讬诇讜转 诪驻转讞:
+document_properties_creation_date=转讗专讬讱 讬爪讬专讛:
+document_properties_modification_date=转讗专讬讱 砖讬谞讜讬:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=讬讜爪专:
+document_properties_producer=讬爪专谉 PDF:
+document_properties_version=讙专住转 PDF:
+document_properties_page_count=诪住驻专 讚驻讬诐:
+document_properties_page_size=讙讜讚诇 讛注诪讜讚:
+document_properties_page_size_unit_inches=讗讬谞壮
+document_properties_page_size_unit_millimeters=诪状诪
+document_properties_page_size_orientation_portrait=诇讗讜专讱
+document_properties_page_size_orientation_landscape=诇专讜讞讘
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=诪讻转讘
+document_properties_page_size_name_legal=讚祝 诪砖驻讟讬
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=转爪讜讙转 讚祝 诪讛讬专讛:
+document_properties_linearized_yes=讻谉
+document_properties_linearized_no=诇讗
+document_properties_close=住讙讬专讛
+
+print_progress_message=诪住诪讱 讘讛讻谞讛 诇讛讚驻住讛鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=讘讬讟讜诇
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=讛爪讙讛/讛住转专讛 砖诇 住专讙诇 讛爪讚
+toggle_sidebar_notification.title=讛讞诇驻转 转爪讜讙转 住专讙诇 爪讚 (诪住诪讱 砖诪讻讬诇 诪转讗专/爪专讜驻讜转)
+toggle_sidebar_label=讛爪讙讛/讛住转专讛 砖诇 住专讙诇 讛爪讚
+document_outline.title=讛爪讙转 诪转讗专 诪住诪讱 (诇讞讬爪讛 讻驻讜诇讛 讻讚讬 诇讛专讞讬讘 讗讜 诇爪诪爪诐 讗转 讻诇 讛驻专讬讟讬诐)
+document_outline_label=诪转讗专 诪住诪讱
+attachments.title=讛爪讙转 爪专讜驻讜转
+attachments_label=爪专讜驻讜转
+thumbs.title=讛爪讙转 转爪讜讙讛 诪拽讚讬诪讛
+thumbs_label=转爪讜讙讛 诪拽讚讬诪讛
+findbar.title=讞讬驻讜砖 讘诪住诪讱
+findbar_label=讞讬驻讜砖
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=注诪讜讚 {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=转爪讜讙讛 诪拽讚讬诪讛 砖诇 注诪讜讚 {{page}}
+
+# Find panel button title and messages
+find_input.title=讞讬驻讜砖
+find_input.placeholder=讞讬驻讜砖 讘诪住诪讱鈥�
+find_previous.title=讞讬驻讜砖 诪讜驻注 拽讜讚诐 砖诇 讛讘讬讟讜讬
+find_previous_label=拽讜讚诐
+find_next.title=讞讬驻讜砖 讛诪讜驻注 讛讘讗 砖诇 讛讘讬讟讜讬
+find_next_label=讛讘讗
+find_highlight=讛讚讙砖转 讛讻讜诇
+find_match_case_label=讛转讗诪转 讗讜转讬讜转
+find_entire_word_label=诪讬诇讬诐 砖诇诪讜转
+find_reached_top=讛讙讬注 诇专讗砖 讛讚祝, 诪诪砖讬讱 诪诇诪讟讛
+find_reached_bottom=讛讙讬注 诇住讜祝 讛讚祝, 诪诪砖讬讱 诪诇诪注诇讛
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count[one]=转讜爪讗讛 {{current}} 诪转讜讱 {{total}}
+find_match_count[two]={{current}} 诪转讜讱 {{total}} 转讜爪讗讜转
+find_match_count[few]={{current}} 诪转讜讱 {{total}} 转讜爪讗讜转
+find_match_count[many]={{current}} 诪转讜讱 {{total}} 转讜爪讗讜转
+find_match_count[other]={{current}} 诪转讜讱 {{total}} 转讜爪讗讜转
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit[zero]=讬讜转专 诪志{{limit}} 转讜爪讗讜转
+find_match_count_limit[one]=讬讜转专 诪转讜爪讗讛 讗讞转
+find_match_count_limit[two]=讬讜转专 诪志{{limit}} 转讜爪讗讜转
+find_match_count_limit[few]=讬讜转专 诪志{{limit}} 转讜爪讗讜转
+find_match_count_limit[many]=讬讜转专 诪志{{limit}} 转讜爪讗讜转
+find_match_count_limit[other]=讬讜转专 诪志{{limit}} 转讜爪讗讜转
+find_not_found=讘讬讟讜讬 诇讗 谞诪爪讗
+
+# Error panel labels
+error_more_info=诪讬讚注 谞讜住祝
+error_less_info=驻讞讜转 诪讬讚注
+error_close=住讙讬专讛
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js 讙专住讛 {{version}} (讘谞讬讬讛: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=讛讜讚注讛: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=转讜讻谉 诪讞住谞讬转: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=拽讜讘抓: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=砖讜专讛: {{line}}
+rendering_error=讗讬专注讛 砖讙讬讗讛 讘注转 注讬讘讜讚 讛讚祝.
+
+# Predefined zoom values
+page_scale_width=专讜讞讘 讛注诪讜讚
+page_scale_fit=讛转讗诪讛 诇注诪讜讚
+page_scale_auto=诪专讞拽 诪转爪讜讙讛 讗讜讟讜诪讟讬
+page_scale_actual=讙讜讚诇 讗诪转讬
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=砖讙讬讗讛
+loading_error=讗讬专注讛 砖讙讬讗讛 讘注转 讟注讬谞转 讛志PDF.
+invalid_file_error=拽讜讘抓 PDF 驻讙讜诐 讗讜 诇讗 转拽讬谉.
+missing_file_error=拽讜讘抓 PDF 讞住专.
+unexpected_response_error=转讙讜讘转 砖专转 诇讗 爪驻讜讬讛.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[讛注专转 {{type}}]
+password_label=谞讗 诇讛讻谞讬住 讗转 讛住住诪讛 诇驻转讬讞转 拽讜讘抓 PDF 讝讛.
+password_invalid=住住诪讛 砖讙讜讬讛. 谞讗 诇谞住讜转 砖谞讬转.
+password_ok=讗讬砖讜专
+password_cancel=讘讬讟讜诇
+
+printing_not_supported=讗讝讛专讛: 讛讚驻住讛 讗讬谞讛 谞转诪讻转 讘诪诇讜讗讛 讘讚驻讚驻谉 讝讛.
+printing_not_ready=讗讝讛专讛: 讛志PDF 诇讗 谞讬转谉 诇讞诇讜讟讬谉 注讚 诪爪讘 砖诪讗驻砖专 讛讚驻住讛.
+web_fonts_disabled=讙讜驻谞讬 专砖转 诪谞讜讟专诇讬诐: 诇讗 谞讬转谉 诇讛砖转诪砖 讘讙讜驻谞讬 PDF 诪讜讟讘注讬诐.
+document_colors_not_allowed=诪住诪讻讬 PDF 讗讬谞诐 诪讜专砖讬诐 诇讛砖转诪砖 讘爪讘注讬诐 诪砖诇讛诐: 讛讗驻砖专讜转 鈥炞愖ぷ┳� 诇注诪讜讚讬诐 诇讘讞讜专 爪讘注讬诐 诪砖诇讛诐鈥� 讗讬谞讛 驻注讬诇讛 讘讚驻讚驻谉.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/hi-IN/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/hi-IN/viewer.properties
new file mode 100644
index 0000000..1685606
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/hi-IN/viewer.properties
@@ -0,0 +1,214 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=啶た啶涏げ啶� 啶啶粪啶�
+previous_label=啶た啶涏げ啶�
+next.title=啶呧啶侧ぞ 啶啶粪啶�
+next_label=啶嗋啷�
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=啶啶粪啶�:
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages={{pagesCount}} 啶曕ぞ
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} of {{pagesCount}})
+
+zoom_out.title=\u0020啶涏啶熰ぞ 啶曕ぐ啷囙
+zoom_out_label=\u0020啶涏啶熰ぞ 啶曕ぐ啷囙
+zoom_in.title=啶ぁ啶监ぞ 啶曕ぐ啷囙
+zoom_in_label=啶ぁ啶监ぞ 啶曕ぐ啷囙
+zoom.title=啶ぁ啶监ぞ-啶涏啶熰ぞ 啶曕ぐ啷囙
+presentation_mode.title=啶啶班じ啷嵿い啷佮い啶� 啶呧さ啶膏啶ムぞ 啶啶� 啶溹ぞ啶忇
+presentation_mode_label=\u0020啶啶班じ啷嵿い啷佮い啶� 啶呧さ啶膏啶ムぞ
+open_file.title=啶ぜ啶距啶� 啶栢啶侧啶�
+open_file_label=\u0020啶栢啶侧啶�
+print.title=啶涏ぞ啶啶�
+print_label=\u0020啶涏ぞ啶啶�
+download.title=啶∴ぞ啶夃え啶侧啶�
+download_label=啶∴ぞ啶夃え啶侧啶�
+bookmark.title=啶啶溹啶︵ぞ 啶︵啶多啶� (啶ㄠ 啶掂た啶傕ぁ啷� 啶啶� 啶ㄠ啶监げ 啶侧啶� 啶ぞ 啶栢啶侧啶�)
+bookmark_label=\u0020啶啶溹啶︵ぞ 啶︵啶多啶�
+
+# Secondary toolbar and context menu
+tools.title=啶斷啶监ぞ啶�
+tools_label=啶斷啶监ぞ啶�
+first_page.title=啶啶班ぅ啶� 啶啶粪啶� 啶ぐ 啶溹ぞ啶忇
+first_page.label=\u0020啶啶班ぅ啶� 啶啶粪啶� 啶ぐ 啶溹ぞ啶忇
+first_page_label=啶啶班ぅ啶� 啶啶粪啶� 啶ぐ 啶溹ぞ啶忇
+last_page.title=啶呧啶むた啶� 啶啶粪啶� 啶ぐ 啶溹ぞ啶忇
+last_page.label=\u0020啶呧啶むた啶� 啶啶粪啶� 啶ぐ 啶溹ぞ啶忇
+last_page_label=\u0020啶呧啶むた啶� 啶啶粪啶� 啶ぐ 啶溹ぞ啶忇
+page_rotate_cw.title=啶樴ぁ啶监 啶曕 啶︵た啶多ぞ 啶啶� 啶樴啶ぞ啶忇
+page_rotate_cw.label=啶樴ぁ啶监 啶曕 啶︵た啶多ぞ 啶啶� 啶樴啶ぞ啶忇
+page_rotate_cw_label=啶樴ぁ啶监 啶曕 啶︵た啶多ぞ 啶啶� 啶樴啶ぞ啶忇
+page_rotate_ccw.title=啶樴ぁ啶监 啶曕 啶︵た啶多ぞ 啶膏 啶夃げ啷嵿啶� 啶樴啶ぞ啶忇
+page_rotate_ccw.label=啶樴ぁ啶监 啶曕 啶︵た啶多ぞ 啶膏 啶夃げ啷嵿啶� 啶樴啶ぞ啶忇
+page_rotate_ccw_label=\u0020啶樴ぁ啶监 啶曕 啶︵た啶多ぞ 啶膏 啶夃げ啷嵿啶� 啶樴啶ぞ啶忇
+
+cursor_text_select_tool.title=啶ぞ啶� 啶氞く啶� 啶夃お啶曕ぐ啶� 啶膏啷嵿し啶� 啶曕ぐ啷囙
+cursor_text_select_tool_label=啶ぞ啶� 啶氞く啶� 啶夃お啶曕ぐ啶�
+cursor_hand_tool.title=啶灌じ啷嵿い 啶夃お啶曕ぐ啶� 啶膏啷嵿し啶� 啶曕ぐ啷囙
+cursor_hand_tool_label=啶灌じ啷嵿い 啶夃お啶曕ぐ啶�
+
+scroll_vertical.title=啶侧啶さ啶� 啶膏啶曕啶班啶侧た啶傕 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啷囙
+scroll_vertical_label=啶侧啶さ啶� 啶膏啶曕啶班啶侧た啶傕
+scroll_horizontal.title=啶曕啶粪た啶むた啶溹た啶� 啶膏啶曕啶班啶侧た啶傕 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啷囙
+scroll_horizontal_label=啶曕啶粪た啶むた啶溹た啶� 啶膏啶曕啶班啶侧た啶傕
+scroll_wrapped.title=啶掂啶班ぞ啶啶啶� 啶膏啶曕啶班啶侧た啶傕 啶曕ぞ 啶夃お啶啶� 啶曕ぐ啷囙
+
+spread_none_label=啶曕啶� 啶膏啶啶班啶� 啶夃お啶侧が啷嵿ぇ 啶ㄠす啷�啶�
+
+# Document properties dialog box
+document_properties.title=啶︵じ啷嵿い啶距さ啷囙啶� 啶掂た啶多啶粪い啶�...
+document_properties_label=啶︵じ啷嵿い啶距さ啷囙啶� 啶掂た啶多啶粪い啶�...
+document_properties_file_name=啶ぜ啶距啶� 啶ㄠぞ啶�:
+document_properties_file_size=啶ぞ啶囙げ 啶嗋啶距ぐ啶�
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=啶多啶班啶粪:
+document_properties_author=啶侧啶栢啶�
+document_properties_subject=啶掂た啶粪く:
+document_properties_keywords=啶曕啶傕啷�-啶多が啷嵿う:
+document_properties_creation_date=啶ㄠた啶班啶ぞ啶� 啶︵た啶ㄠぞ啶傕:
+document_properties_modification_date=啶膏啶多啶оえ 啶︵た啶ㄠぞ啶傕:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=啶ㄠた啶班啶ぞ啶むぞ:
+document_properties_producer=PDF 啶夃い啷嵿お啶距う啶�:
+document_properties_version=PDF 啶膏啶膏啶曕ぐ啶�:
+document_properties_page_count=啶啶粪啶� 啶椸た啶ㄠい啷�:
+document_properties_page_size=啶啶粪啶� 啶嗋啶距ぐ:
+document_properties_page_size_unit_inches=啶囙啶�
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=啶啶班啶熰啶班啶�
+document_properties_page_size_orientation_landscape=啶侧啶傕ぁ啶膏啶曕啶�
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=啶侧啶熰ぐ
+document_properties_page_size_name_legal=啶侧啶椸げ
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=啶む啶掂啶� 啶掂啶� 啶掂啶:
+document_properties_linearized_yes=啶灌ぞ啶�
+document_properties_linearized_no=啶ㄠす啷�啶�
+document_properties_close=啶啶� 啶曕ぐ啷囙
+
+print_progress_message=啶涏お啶距 啶曕 啶侧た啶� 啶︵じ啷嵿い啶距さ啷囙啶� 啶曕 啶む啶ぞ啶� 啶曕た啶ぞ 啶溹ぞ 啶班す啶� 啶灌...
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=啶班う啷嵿う 啶曕ぐ啷囙
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=\u0020啶膏啶侧ぞ啶囙ぁ啶� 啶熰啶椸げ 啶曕ぐ啷囙
+toggle_sidebar_notification.title=啶膏ぞ啶囙ぁ啶ぞ啶� 啶熰啶椸げ 啶曕ぐ啷囙 (啶︵じ啷嵿い啶距さ啷囙啶� 啶啶� 啶班啶ぐ啷囙啶� 啶多ぞ啶た啶� 啶灌/attachments)
+toggle_sidebar_label=啶膏啶侧ぞ啶囙ぁ啶� 啶熰啶椸げ 啶曕ぐ啷囙
+document_outline.title=啶︵じ啷嵿い啶距さ啷囙啶� 啶曕 啶班啶ぐ啷囙啶� 啶︵た啶栢ぞ啶囙 (啶膏ぞ啶班 啶掂じ啷嵿い啷佮啶� 啶曕 啶げ啶ㄠ 啶呧ぅ啶掂ぞ 啶膏ぎ啷囙啶ㄠ 啶曕 啶侧た啶� 啶︵ 啶ぞ啶� 啶曕啶侧た啶� 啶曕ぐ啷囙)
+document_outline_label=啶︵じ啷嵿い啶距さ啷囙啶� 啶嗋啶熰げ啶距啶�
+attachments.title=啶膏啶侧啷嵿え啶� 啶︵た啶栢ぞ啶啶�
+attachments_label=啶膏啶侧啷嵿え啶�
+thumbs.title=啶侧啷佮啶掂た啶ぞ啶� 啶︵た啶栢ぞ啶忇
+thumbs_label=啶侧啷� 啶涏さ啶�
+findbar.title=\u0020啶︵じ啷嵿い啶距さ啷囙啶� 啶啶� 啶⑧啶佮あ啶监啶�
+findbar_label=啶⑧啶佮あ啷囙
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=啶啶粪啶� {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=啶啶粪啶� {{page}} 啶曕 啶侧啷�-啶涏さ啶�
+
+# Find panel button title and messages
+find_input.title=啶⑧啶佮あ啷囙
+find_input.placeholder=啶︵じ啷嵿い啶距さ啷囙啶� 啶啶� 啶栢啶溹啶�...
+find_previous.title=啶掂ぞ啶曕啶ぞ啶傕ざ 啶曕 啶た啶涏げ啷� 啶夃お啶膏啶ムた啶むた 啶⑧啶佮あ啶监啶�
+find_previous_label=啶た啶涏げ啶�
+find_next.title=啶掂ぞ啶曕啶ぞ啶傕ざ 啶曕 啶呧啶侧 啶夃お啶膏啶ムた啶むた 啶⑧啶佮あ啶监啶�
+find_next_label=啶嗋啷�
+find_highlight=\u0020啶膏き啷� 啶嗋げ啷嬥啶苦い 啶曕ぐ啷囙
+find_match_case_label=啶た啶侧ぞ啶� 啶膏啶ムた啶むた
+find_reached_top=啶啶粪啶� 啶曕 啶娻お啶� 啶す啷佮啶� 啶椸く啶�, 啶ㄠ啶氞 啶膏 啶溹ぞ啶班 啶班啷囙
+find_reached_bottom=啶啶粪啶� 啶曕 啶ㄠ啶氞 啶啶� 啶溹ぞ 啶す啷佮啶氞ぞ, 啶娻お啶� 啶膏 啶溹ぞ啶班
+find_not_found=啶掂ぞ啶曕啶ぞ啶傕ざ 啶ㄠす啷�啶� 啶た啶侧ぞ
+
+# Error panel labels
+error_more_info=啶呧ぇ啶苦 啶膏啶氞え啶�
+error_less_info=啶曕ぎ 啶膏啶氞え啶�
+error_close=啶啶� 啶曕ぐ啷囙
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=\u0020啶膏啶︵啶�: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=啶膏啶熰啶�: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=啶ぜ啶距啶�: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=啶啶曕啶むた: {{line}}
+rendering_error=啶啶粪啶� 啶班啶傕ぁ啶班た啶傕 啶曕 啶︵啶班ぞ啶� 啶む啶班啶熰た 啶嗋.
+
+# Predefined zoom values
+page_scale_width=\u0020啶啶粪啶� 啶氞啶∴ぜ啶距
+page_scale_fit=啶啶粪啶� 啶た啶�
+page_scale_auto=啶膏啶掂啶距げ啶苦い 啶溹啶�
+page_scale_actual=啶掂ぞ啶膏啶むさ啶苦 啶嗋啶距ぐ
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=啶む啶班啶熰た
+loading_error=PDF 啶侧啶� 啶曕ぐ啶む 啶膏ぎ啶� 啶忇 啶む啶班啶熰た 啶灌啶�.
+invalid_file_error=啶呧ぎ啶距え啷嵿く 啶ぞ 啶啶班し啷嵿 PDF 啶ぜ啶距啶�.
+missing_file_error=\u0020啶呧え啷佮お啶膏啶ムた啶� PDF 啶ぜ啶距啶�.
+unexpected_response_error=啶呧お啷嵿ぐ啶む啶ぞ啶多た啶� 啶膏ぐ啷嵿さ啶� 啶啶班い啶苦啷嵿ぐ啶苦く啶�.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=\u0020[{{type}} Annotation]
+password_label=啶囙じ PDF 啶ぜ啶距啶� 啶曕 啶栢啶侧え啷� 啶曕 啶侧た啶� 啶曕啶く啶� 啶曕啶熰ざ啶啶� 啶ぐ啷囙.
+password_invalid=啶呧さ啷堗ぇ 啶曕啶熰ざ啶啶�, 啶曕啶く啶� 啶た啶� 啶曕啶多た啶� 啶曕ぐ啷囙.
+password_ok=OK
+password_cancel=啶班う啷嵿う 啶曕ぐ啷囙
+
+printing_not_supported=啶氞啶むぞ啶掂え啷�: 啶囙じ 啶啶班ぞ啶夃啶监ぐ 啶ぐ 啶涏お啶距 啶啶班 啶むぐ啶� 啶膏 啶膏ぎ啶班啶ムた啶� 啶ㄠす啷�啶� 啶灌.
+printing_not_ready=啶氞啶むぞ啶掂え啷�: PDF 啶涏お啶距 啶曕 啶侧た啶� 啶啶班 啶むぐ啶� 啶膏 啶侧啶� 啶ㄠす啷�啶� 啶灌.
+web_fonts_disabled=啶掂啶� 啶啶ㄠ啶熰啶� 啶ㄠた啶粪啶曕啶班た啶� 啶灌啶�: 啶呧啶む啶膏啶ムぞ啶た啶� PDF 啶啶ㄠ啶熰じ 啶曕 啶夃お啶啶� 啶啶� 啶呧じ啶ぐ啷嵿ぅ.
+document_colors_not_allowed=PDF 啶︵じ啷嵿い啶距さ啷囙啶� 啶夃え啶曕 啶呧お啶ㄠ 啶班啶� 啶曕 啶夃お啶啶� 啶曕ぐ啶ㄠ 啶曕 啶侧た啶� 啶呧え啷佮ぎ啶むた 啶啶班ぞ啶啶� 啶ㄠす啷�啶� 啶灌: "啶啶粪啶犩啶� 啶曕 啶夃え啶曕 啶呧お啶ㄠ 啶班啶� 啶曕 啶氞啶ㄠえ啷� 啶曕 啶侧た啶� 啶膏啶掂啶曕啶むた 啶︵啶�" 啶曕た 啶掂す 啶夃じ 啶啶班ぞ啶夃啶监ぐ 啶啶� 啶ㄠた啶粪啶曕啶班た啶� 啶灌.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/hr/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/hr/viewer.properties
new file mode 100644
index 0000000..ca39552
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/hr/viewer.properties
@@ -0,0 +1,184 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Prethodna stranica
+previous_label=Prethodna
+next.title=Sljede膰a stranica
+next_label=Sljede膰a
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=Stranica
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=od {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} od {{pagesCount}})
+
+zoom_out.title=Uve膰aj
+zoom_out_label=Smanji
+zoom_in.title=Uve膰aj
+zoom_in_label=Smanji
+zoom.title=Uve膰anje
+presentation_mode.title=Prebaci u prezentacijski na膷in rada
+presentation_mode_label=Prezentacijski na膷in rada
+open_file.title=Otvori datoteku
+open_file_label=Otvori
+print.title=Ispis
+print_label=Ispis
+download.title=Preuzmi
+download_label=Preuzmi
+bookmark.title=Trenutni prikaz (kopiraj ili otvori u novom prozoru)
+bookmark_label=Trenutni prikaz
+
+# Secondary toolbar and context menu
+tools.title=Alati
+tools_label=Alati
+first_page.title=Idi na prvu stranicu
+first_page.label=Idi na prvu stranicu
+first_page_label=Idi na prvu stranicu
+last_page.title=Idi na posljednju stranicu
+last_page.label=Idi na posljednju stranicu
+last_page_label=Idi na posljednju stranicu
+page_rotate_cw.title=Rotiraj u smjeru kazaljke na satu
+page_rotate_cw.label=Rotiraj u smjeru kazaljke na satu
+page_rotate_cw_label=Rotiraj u smjeru kazaljke na satu
+page_rotate_ccw.title=Rotiraj obrnutno od smjera kazaljke na satu
+page_rotate_ccw.label=Rotiraj obrnutno od smjera kazaljke na satu
+page_rotate_ccw_label=Rotiraj obrnutno od smjera kazaljke na satu
+
+cursor_text_select_tool.title=Omogu膰i alat za ozna膷avanje teksta
+cursor_text_select_tool_label=Alat za ozna膷avanje teksta
+cursor_hand_tool.title=Omogu膰i ru膷ni alat
+cursor_hand_tool_label=Ru膷ni alat
+
+# Document properties dialog box
+document_properties.title=Svojstva dokumenta...
+document_properties_label=Svojstva dokumenta...
+document_properties_file_name=Naziv datoteke:
+document_properties_file_size=Veli膷ina datoteke:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} bajtova)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} bajtova)
+document_properties_title=Naslov:
+document_properties_author=Autor:
+document_properties_subject=Predmet:
+document_properties_keywords=Klju膷ne rije膷i:
+document_properties_creation_date=Datum stvaranja:
+document_properties_modification_date=Datum promjene:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Stvaratelj:
+document_properties_producer=PDF stvaratelj:
+document_properties_version=PDF ina膷ica:
+document_properties_page_count=Broj stranica:
+document_properties_close=Zatvori
+
+print_progress_message=Pripremanje dokumenta za ispis鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=Odustani
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Prika啪i/sakrij bo膷nu traku
+toggle_sidebar_notification.title=Prikazivanje i sklanjanje bo膷ne trake (dokument sadr啪i konturu/privitke)
+toggle_sidebar_label=Prika啪i/sakrij bo膷nu traku
+document_outline.title=Prika啪i obris dokumenta (dvostruki klik za pro拧irivanje/skupljanje svih stavki)
+document_outline_label=Obris dokumenta
+attachments.title=Prika啪i privitke
+attachments_label=Privitci
+thumbs.title=Prika啪i sli膷ice
+thumbs_label=Sli膷ice
+findbar.title=Tra啪i u dokumentu
+findbar_label=Tra啪i
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Stranica {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Sli膷ica stranice {{page}}
+
+# Find panel button title and messages
+find_input.title=Tra啪i
+find_input.placeholder=Tra啪i u dokumentu鈥�
+find_previous.title=Prona膽i prethodno javljanje ovog izraza
+find_previous_label=Prethodno
+find_next.title=Prona膽i idu膰e javljanje ovog izraza
+find_next_label=Sljede膰e
+find_highlight=Istankni sve
+find_match_case_label=Slu膷aj podudaranja
+find_reached_top=Dosegnut vrh dokumenta, nastavak od dna
+find_reached_bottom=Dosegnut vrh dokumenta, nastavak od vrha
+find_not_found=Izraz nije prona膽en
+
+# Error panel labels
+error_more_info=Vi拧e informacija
+error_less_info=Manje informacija
+error_close=Zatvori
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Poruka: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stog: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Datoteka: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Redak: {{line}}
+rendering_error=Do拧lo je do gre拧ke prilikom iscrtavanja stranice.
+
+# Predefined zoom values
+page_scale_width=艩irina stranice
+page_scale_fit=Pristajanje stranici
+page_scale_auto=Automatsko uve膰anje
+page_scale_actual=Prava veli膷ina
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Gre拧ka
+loading_error=Do拧lo je do gre拧ke pri u膷itavanju PDF-a.
+invalid_file_error=Kriva ili o拧te膰ena PDF datoteka.
+missing_file_error=Nedostaje PDF datoteka.
+unexpected_response_error=Neo膷ekivani odgovor poslu啪itelja.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Bilje拧ka]
+password_label=Upi拧ite lozinku da biste otvorili ovu PDF datoteku.
+password_invalid=Neispravna lozinka. Poku拧ajte ponovo.
+password_ok=U redu
+password_cancel=Odustani
+
+printing_not_supported=Upozorenje: Ispisivanje nije potpuno podr啪ano u ovom pregledniku.
+printing_not_ready=Upozorenje: PDF nije u potpunosti u膷itan za ispis.
+web_fonts_disabled=Web fontovi su onemogu膰eni: nije mogu膰e koristiti umetnute PDF fontove.
+document_colors_not_allowed=PDF dokumenti nemaju dopu拧tene koristiti vlastite boje: opcija 'Dopusti stranicama da koriste vlastite boje' je deaktivirana.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/hsb/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/hsb/viewer.properties
new file mode 100644
index 0000000..679ef59
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/hsb/viewer.properties
@@ -0,0 +1,242 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=P艡edchadna strona
+previous_label=Wr贸膰o
+next.title=P艡ichodna strona
+next_label=Dale
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=Strona
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=z {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} z {{pagesCount}})
+
+zoom_out.title=Pomje艅拧i膰
+zoom_out_label=Pomje艅拧i膰
+zoom_in.title=Powjet拧i膰
+zoom_in_label=Powjet拧i膰
+zoom.title=Skalowanje
+presentation_mode.title=Do prezentaciskeho modusa p艡e艅膰
+presentation_mode_label=Prezentaciski modus
+open_file.title=Dataju wo膷ini膰
+open_file_label=Wo膷ini膰
+print.title=膯i拧膰e膰
+print_label=膯i拧膰e膰
+download.title=S膰ahny膰
+download_label=S膰ahny膰
+bookmark.title=Aktualny napohlad (kop臎rowa膰 abo w nowym woknje wo膷ini膰)
+bookmark_label=Aktualny napohlad
+
+# Secondary toolbar and context menu
+tools.title=Nastroje
+tools_label=Nastroje
+first_page.title=K pr臎njej stronje
+first_page.label=K pr臎njej stronje
+first_page_label=K pr臎njej stronje
+last_page.title=K poslednjej stronje
+last_page.label=K poslednjej stronje
+last_page_label=K poslednjej stronje
+page_rotate_cw.title=K sm臎rej 膷asnika wjer膰e膰
+page_rotate_cw.label=K sm臎rej 膷asnika wjer膰e膰
+page_rotate_cw_label=K sm臎rej 膷asnika wjer膰e膰
+page_rotate_ccw.title=P艡e膰iwo sm臎rej 膷asnika wjer膰e膰
+page_rotate_ccw.label=P艡e膰iwo sm臎rej 膷asnika wjer膰e膰
+page_rotate_ccw_label=P艡e膰iwo sm臎rej 膷asnika wjer膰e膰
+
+cursor_text_select_tool.title=Nastroj za wub臎ranje teksta zm贸啪ni膰
+cursor_text_select_tool_label=Nastroj za wub臎ranje teksta
+cursor_hand_tool.title=Ru膷ny nastroj zm贸啪ni膰
+cursor_hand_tool_label=Ru膷ny nastroj
+
+scroll_vertical.title=Wertikalne suwanje wu啪iwa膰
+scroll_vertical_label=Wertikalnje suwanje
+scroll_horizontal.title=Horicontalne suwanje wu啪iwa膰
+scroll_horizontal_label=Horicontalne suwanje
+scroll_wrapped.title=Postupne suwanje wu啪iwa膰
+scroll_wrapped_label=Postupne suwanje
+
+spread_none.title=Strony njezwjaza膰
+spread_none_label=沤ana dw贸jna strona
+spread_odd.title=Strony zapo膷inajo z njerunymi stronami zwjaza膰
+spread_odd_label=Njerune strony
+spread_even.title=Strony zapo膷inajo z runymi stronami zwjaza膰
+spread_even_label=Rune strony
+
+# Document properties dialog box
+document_properties.title=Dokumentowe kajkos膰e鈥�
+document_properties_label=Dokumentowe kajkos膰e鈥�
+document_properties_file_name=Mjeno dataje:
+document_properties_file_size=Wulkos膰 dataje:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} bajtow)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} bajtow)
+document_properties_title=Titul:
+document_properties_author=Awtor:
+document_properties_subject=P艡edmjet:
+document_properties_keywords=Klu膷owe s艂owa:
+document_properties_creation_date=Datum wutworjenja:
+document_properties_modification_date=Datum zm臎ny:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Awtor:
+document_properties_producer=PDF-zhotowjer:
+document_properties_version=PDF-wersija:
+document_properties_page_count=Li膷ba stronow:
+document_properties_page_size=Wulkos膰 strony:
+document_properties_page_size_unit_inches=c贸l
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=wysoki format
+document_properties_page_size_orientation_landscape=pr臎膷ny format
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Letter
+document_properties_page_size_name_legal=Legal
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=Fast Web View:
+document_properties_linearized_yes=Haj
+document_properties_linearized_no=N臎
+document_properties_close=Za膷ini膰
+
+print_progress_message=Dokument so za 膰i拧膰enje p艡ihotuje鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=P艡etorhny膰
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=B贸膷nicu pokaza膰/schowa膰
+toggle_sidebar_notification.title=B贸膷nicu p艡epina膰 (dokument wobsahuje wobrys/p艡iw臎拧ki)
+toggle_sidebar_label=B贸膷nicu pokaza膰/schowa膰
+document_outline.title=Dokumentowy na膰isk pokaza膰 (dw贸jne kliknjenje, zo bychu so w拧臎 zapiski pokazali/schowali)
+document_outline_label=Dokumentowa struktura
+attachments.title=P艡iw臎拧ki pokaza膰
+attachments_label=P艡iw臎拧ki
+thumbs.title=Miniatury pokaza膰
+thumbs_label=Miniatury
+findbar.title=W dokumen膰e pyta膰
+findbar_label=Pyta膰
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Strona {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Miniatura strony {{page}}
+
+# Find panel button title and messages
+find_input.title=Pyta膰
+find_input.placeholder=W dokumen膰e pyta膰鈥�
+find_previous.title=P艡edchadne wustupowanje pytanskeho wuraza pyta膰
+find_previous_label=Wr贸膰o
+find_next.title=P艡ichodne wustupowanje pytanskeho wuraza pyta膰
+find_next_label=Dale
+find_highlight=W拧臎 wuzb臎hny膰
+find_match_case_label=Wulkopisanje wobked藕bowa膰
+find_entire_word_label=Cy艂e s艂owa
+find_reached_top=Spo膷atk dokumenta docp臎ty, pokro膷uje so z k贸ncom
+find_reached_bottom=K贸nc dokument docp臎ty, pokro膷uje so ze spo膷atkom
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]={{current}} z {{total}} wotpow臎dnika
+find_match_count[two]={{current}} z {{total}} wotpow臎dnikow
+find_match_count[few]={{current}} z {{total}} wotpow臎dnikow
+find_match_count[many]={{current}} z {{total}} wotpow臎dnikow
+find_match_count[other]={{current}} z {{total}} wotpow臎dnikow
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]=Wjace ha膷 {{limit}} wotpow臎dnikow
+find_match_count_limit[one]=Wjace ha膷 {{limit}} wotpow臎dnik
+find_match_count_limit[two]=Wjace ha膷 {{limit}} wotpow臎dnikaj
+find_match_count_limit[few]=Wjace ha膷 {{limit}} wotpow臎dniki
+find_match_count_limit[many]=Wjace ha膷 {{limit}} wotpow臎dnikow
+find_match_count_limit[other]=Wjace ha膷 {{limit}} wotpow臎dnikow
+find_not_found=Pytanski wuraz njeje so namaka艂
+
+# Error panel labels
+error_more_info=Wjace informacijow
+error_less_info=Mjenje informacijow
+error_close=Za膷ini膰
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Zd藕臎lenka: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Lis膰ina zawo艂anjow: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Dataja: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Linka: {{line}}
+rendering_error=P艡i zwobraznjenju strony je zmylk wustupi艂.
+
+# Predefined zoom values
+page_scale_width=艩臎rokos膰 strony
+page_scale_fit=Wulkos膰 strony
+page_scale_auto=Awtomatiske skalowanje
+page_scale_actual=Aktualna wulkos膰
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Zmylk
+loading_error=P艡i za膷itowanju PDF je zmylk wustupi艂.
+invalid_file_error=Njep艂a膰iwa abo wob拧kod藕ena PDF-dataja.
+missing_file_error=Falowaca PDF-dataja.
+unexpected_response_error=Njewo膷akowana serwerowa wotmo艂wa.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[Typ p艡ispomnjenki: {{type}}]
+password_label=Zapodaj膰e hes艂o, zo by拧膰e PDF-dataju wo膷ini艂.
+password_invalid=Njep艂a膰iwe hes艂o. Pro拧u spytaj膰e hi拧膰e raz.
+password_ok=W porjadku
+password_cancel=P艡etorhny膰
+
+printing_not_supported=Warnowanje: 膯i拧膰enje so p艡ez tut贸n wobhladowak po艂nje njepodp臎ruje.
+printing_not_ready=Warnowanje: PDF njeje so za 膰i拧膰enje dospo艂nje za膷ita艂.
+web_fonts_disabled=Webpisma su znjem贸啪njene: njeje m贸啪no, zasad藕ene PDF-pisma wu啪iwa膰.
+document_colors_not_allowed=PDF-dokumenty njesm臎d藕a swoje barby wu啪iwa膰: 'Stronam dowoli膰, swoje barby wu啪iwa膰' je we wobhladowaku znjem贸啪njene.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/hto/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/hto/viewer.properties
new file mode 100644
index 0000000..ed984ea
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/hto/viewer.properties
@@ -0,0 +1,127 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+
+open_file_label=Tuide
+print.title=R谩be f扫nora扫ma
+print_label=R谩be f扫nora扫ma
+download.title=Y煤nua
+download_label=Y煤nua
+bookmark.title=B铆rui 茅roika (k贸mue 茅roirafo tu帽o fakayena)
+bookmark_label=B铆rui 茅roika
+
+# Secondary toolbar and context menu
+tools.title=R谩n扫a扫 t谩扫j扫yena
+tools_label=R谩n扫a扫 t谩扫j扫yena
+first_page.title=Nano fue帽e rabemo ja铆ri
+first_page.label=Nano fue帽e rabemo ja铆ri
+first_page_label=Nano fue帽e rabemo ja铆ri
+last_page.title=茥虂k贸扫 fue帽e rabemo ja铆ri
+last_page.label=茥虂k贸扫 fue帽e rabemo ja铆ri
+last_page_label=茥虂k贸扫 fue帽e rabemo ja铆ri
+page_rotate_cw.title=Nabene j扫rekai
+page_rotate_cw.label=Nabene j扫rekai
+page_rotate_cw_label=Nabene j扫rekai
+page_rotate_ccw.title=Jar扫虂fene jireka扫
+page_rotate_ccw.label=Jar扫虂fene jireka扫
+page_rotate_ccw_label=Jar扫虂fene jireka扫
+
+
+# Document properties dialog box
+document_properties_file_name=R谩an扫 mam茅k扫:
+document_properties_file_size=R谩an扫 d扫eze:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=K煤ega m谩mek扫:
+document_properties_author=F扫nokam扫e:
+document_properties_subject=M扫n扫ka:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=F扫nora扫ma:
+document_properties_version=Y贸ga r谩fue PDF:
+document_properties_close=茥虂baide
+
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+attachments.title=D谩jemo j贸nega akatairi
+attachments_label=Dano j贸nega
+thumbs.title=D煤e 铆ya akatairi
+thumbs_label=D煤e 铆ya
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Rabe {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=D煤e 铆ya rabe {{page}}
+
+# Find panel button title and messages
+find_previous_label=J扫谩扫kena\u0020
+find_next_label=B谩扫fene
+find_highlight=Nana r扫g扫no
+find_not_found=Da扫na b谩帽eiga
+
+# Error panel labels
+error_more_info=Jamano r谩fue
+error_less_info=D煤e r谩fue
+error_close=茥虂bai
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=脷aina: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Pila: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=J贸nia r谩a: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Ida: {{line}}
+
+# Predefined zoom values
+page_scale_auto=Zoom dama f扫node
+page_scale_actual=B铆rui d扫eze
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=F扫g貌帽ede
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} ba铆tade]
+password_ok=J扫扫
+
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/hu/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/hu/viewer.properties
new file mode 100644
index 0000000..fbe6531
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/hu/viewer.properties
@@ -0,0 +1,242 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=El艖z艖 oldal
+previous_label=El艖z艖
+next.title=K枚vetkez艖 oldal
+next_label=Tov谩bb
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=Oldal
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=枚sszesen: {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} / {{pagesCount}})
+
+zoom_out.title=Kicsiny铆t茅s
+zoom_out_label=Kicsiny铆t茅s
+zoom_in.title=Nagy铆t谩s
+zoom_in_label=Nagy铆t谩s
+zoom.title=Nagy铆t谩s
+presentation_mode.title=V谩lt谩s bemutat贸 m贸dba
+presentation_mode_label=Bemutat贸 m贸d
+open_file.title=F谩jl megnyit谩sa
+open_file_label=Megnyit谩s
+print.title=Nyomtat谩s
+print_label=Nyomtat谩s
+download.title=Let枚lt茅s
+download_label=Let枚lt茅s
+bookmark.title=Jelenlegi n茅zet (m谩sol谩s vagy megnyit谩s 煤j ablakban)
+bookmark_label=Aktu谩lis n茅zet
+
+# Secondary toolbar and context menu
+tools.title=Eszk枚z枚k
+tools_label=Eszk枚z枚k
+first_page.title=Ugr谩s az els艖 oldalra
+first_page.label=Ugr谩s az els艖 oldalra
+first_page_label=Ugr谩s az els艖 oldalra
+last_page.title=Ugr谩s az utols贸 oldalra
+last_page.label=Ugr谩s az utols贸 oldalra
+last_page_label=Ugr谩s az utols贸 oldalra
+page_rotate_cw.title=Forgat谩s az 贸ramutat贸 j谩r谩s谩val egyez艖en
+page_rotate_cw.label=Forgat谩s az 贸ramutat贸 j谩r谩s谩val egyez艖en
+page_rotate_cw_label=Forgat谩s az 贸ramutat贸 j谩r谩s谩val egyez艖en
+page_rotate_ccw.title=Forgat谩s az 贸ramutat贸 j谩r谩s谩val ellent茅tesen
+page_rotate_ccw.label=Forgat谩s az 贸ramutat贸 j谩r谩s谩val ellent茅tesen
+page_rotate_ccw_label=Forgat谩s az 贸ramutat贸 j谩r谩s谩val ellent茅tesen
+
+cursor_text_select_tool.title=Sz枚vegkijel枚l艖 eszk枚z bekapcsol谩sa
+cursor_text_select_tool_label=Sz枚vegkijel枚l艖 eszk枚z
+cursor_hand_tool.title=K茅z eszk枚z bekapcsol谩sa
+cursor_hand_tool_label=K茅z eszk枚z
+
+scroll_vertical.title=F眉gg艖leges g枚rget茅s haszn谩lata
+scroll_vertical_label=F眉gg艖leges g枚rget茅s
+scroll_horizontal.title=V铆zszintes g枚rget茅s haszn谩lata
+scroll_horizontal_label=V铆zszintes g枚rget茅s
+scroll_wrapped.title=R谩csos elrendez茅s haszn谩lata
+scroll_wrapped_label=R谩csos elrendez茅s
+
+spread_none.title=Ne tapassza 枚ssze az oldalakat
+spread_none_label=Nincs 枚sszetapaszt谩s
+spread_odd.title=Lapok 枚sszetapaszt谩sa, a p谩ratlan sz谩m煤 oldalakkal kezdve
+spread_odd_label=脰sszetapaszt谩s: p谩ratlan
+spread_even.title=Lapok 枚sszetapaszt谩sa, a p谩ros sz谩m煤 oldalakkal kezdve
+spread_even_label=脰sszetapaszt谩s: p谩ros
+
+# Document properties dialog box
+document_properties.title=Dokumentum tulajdons谩gai鈥�
+document_properties_label=Dokumentum tulajdons谩gai鈥�
+document_properties_file_name=F谩jln茅v:
+document_properties_file_size=F谩jlm茅ret:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} b谩jt)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} b谩jt)
+document_properties_title=C铆m:
+document_properties_author=Szerz艖:
+document_properties_subject=T谩rgy:
+document_properties_keywords=Kulcsszavak:
+document_properties_creation_date=L茅trehoz谩s d谩tuma:
+document_properties_modification_date=M贸dos铆t谩s d谩tuma:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=L茅trehozta:
+document_properties_producer=PDF el艖谩ll铆t贸:
+document_properties_version=PDF verzi贸:
+document_properties_page_count=Oldalsz谩m:
+document_properties_page_size=Lapm茅ret:
+document_properties_page_size_unit_inches=in
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=谩ll贸
+document_properties_page_size_orientation_landscape=fekv艖
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Letter
+document_properties_page_size_name_legal=Legal
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=Gyors webes n茅zet:
+document_properties_linearized_yes=Igen
+document_properties_linearized_no=Nem
+document_properties_close=Bez谩r谩s
+
+print_progress_message=Dokumentum el艖k茅sz铆t茅se nyomtat谩shoz鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=M茅gse
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Oldals谩v be/ki
+toggle_sidebar_notification.title=Oldals谩v be/ki (a dokumentum v谩zlatot/mell茅kleteket tartalmaz)
+toggle_sidebar_label=Oldals谩v be/ki
+document_outline.title=Dokumentum megjelen铆t茅se online (dupla kattint谩s minden elem kinyit谩s谩hoz/枚sszecsuk谩s谩hoz)
+document_outline_label=Dokumentumv谩zlat
+attachments.title=Mell茅kletek megjelen铆t茅se
+attachments_label=Van mell茅klet
+thumbs.title=B茅lyegk茅pek megjelen铆t茅se
+thumbs_label=B茅lyegk茅pek
+findbar.title=Keres茅s a dokumentumban
+findbar_label=Keres茅s
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title={{page}}. oldal
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas={{page}}. oldal b茅lyegk茅pe
+
+# Find panel button title and messages
+find_input.title=Keres茅s
+find_input.placeholder=Keres茅s a dokumentumban鈥�
+find_previous.title=A kifejez茅s el艖z艖 el艖fordul谩s谩nak keres茅se
+find_previous_label=El艖z艖
+find_next.title=A kifejez茅s k枚vetkez艖 el艖fordul谩s谩nak keres茅se
+find_next_label=Tov谩bb
+find_highlight=脰sszes kiemel茅se
+find_match_case_label=Kis- 茅s nagybet疟k megk眉l枚nb枚ztet茅se
+find_entire_word_label=Teljes szavak
+find_reached_top=A dokumentum eleje el茅rve, folytat谩s a v茅g茅t艖l
+find_reached_bottom=A dokumentum v茅ge el茅rve, folytat谩s az elej茅t艖l
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]={{current}} / {{total}} tal谩lat
+find_match_count[two]={{current}} / {{total}} tal谩lat
+find_match_count[few]={{current}} / {{total}} tal谩lat
+find_match_count[many]={{current}} / {{total}} tal谩lat
+find_match_count[other]={{current}} / {{total}} tal谩lat
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]=T枚bb mint {{limit}} tal谩lat
+find_match_count_limit[one]=T枚bb mint {{limit}} tal谩lat
+find_match_count_limit[two]=T枚bb mint {{limit}} tal谩lat
+find_match_count_limit[few]=T枚bb mint {{limit}} tal谩lat
+find_match_count_limit[many]=T枚bb mint {{limit}} tal谩lat
+find_match_count_limit[other]=T枚bb mint {{limit}} tal谩lat
+find_not_found=A kifejez茅s nem tal谩lhat贸
+
+# Error panel labels
+error_more_info=Tov谩bbi tudnival贸k
+error_less_info=Kevesebb inform谩ci贸
+error_close=Bez谩r谩s
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=脺zenet: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Verem: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=F谩jl: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Sor: {{line}}
+rendering_error=Hiba t枚rt茅nt az oldal feldolgoz谩sa k枚zben.
+
+# Predefined zoom values
+page_scale_width=Oldalsz茅less茅g
+page_scale_fit=Teljes oldal
+page_scale_auto=Automatikus nagy铆t谩s
+page_scale_actual=Val贸di m茅ret
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Hiba
+loading_error=Hiba t枚rt茅nt a PDF bet枚lt茅sekor.
+invalid_file_error=脡rv茅nytelen vagy s茅r眉lt PDF f谩jl.
+missing_file_error=Hi谩nyz贸 PDF f谩jl.
+unexpected_response_error=V谩ratlan kiszolg谩l贸v谩lasz.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} megjegyz茅s]
+password_label=Adja meg a jelsz贸t a PDF f谩jl megnyit谩s谩hoz.
+password_invalid=Helytelen jelsz贸. Pr贸b谩lja 煤jra.
+password_ok=OK
+password_cancel=M茅gse
+
+printing_not_supported=Figyelmeztet茅s: Ez a b枚ng茅sz艖 nem teljesen t谩mogatja a nyomtat谩st.
+printing_not_ready=Figyelmeztet茅s: A PDF nincs teljesen bet枚ltve a nyomtat谩shoz.
+web_fonts_disabled=Webes bet疟k茅szletek letiltva: nem haszn谩lhat贸k a be谩gyazott PDF bet疟k茅szletek.
+document_colors_not_allowed=A PDF dokumentumok nem haszn谩lhatj谩k saj谩t sz铆neiket: 鈥濧z oldalak a saj谩t maguk 谩ltal kiv谩lasztott sz铆neket haszn谩lhatj谩k鈥� be谩ll铆t谩s ki van kapcsolva a b枚ng茅sz艖ben.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/hy-AM/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/hy-AM/viewer.properties
new file mode 100644
index 0000000..e94633c
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/hy-AM/viewer.properties
@@ -0,0 +1,201 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=諉铡窄崭謤栅 乍栈炸
+previous_label=諉铡窄崭謤栅炸
+next.title=諃铡栈崭謤栅 乍栈炸
+next_label=諃铡栈崭謤栅炸
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=苑栈.
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages={{pagesCount}}-斋謥\u0020
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}}-炸 {{pagesCount}})-斋謥
+
+zoom_out.title=論崭謩謤铡謥斩榨宅
+zoom_out_label=論崭謩謤铡謥斩榨宅
+zoom_in.title=越崭辗崭謤铡謥斩榨宅
+zoom_in_label=越崭辗崭謤铡謥斩榨宅
+zoom.title=談铡战辗湛铡闸炸\u0020
+presentation_mode.title=员斩謥斩榨宅 諉榨謤寨铡盏铡謥沾铡斩 榨詹铡斩铡寨斋斩
+presentation_mode_label=諉榨謤寨铡盏铡謥沾铡斩 榨詹铡斩铡寨
+open_file.title=圆铡謥榨宅 諙铡盏宅
+open_file_label=圆铡謥榨宅
+print.title=諒蘸榨宅
+print_label=諒蘸榨宅
+download.title=圆榨占斩榨宅
+download_label=圆榨占斩榨宅
+bookmark.title=愿斩诈铡謥斋寨 湛榨战謩崭站 (蘸铡湛粘榨斩榨宅 寨铡沾 闸铡謥榨宅 斩崭謤 蘸铡湛崭謧瞻铡斩崭謧沾)
+bookmark_label=愿斩诈铡謥斋寨 湛榨战謩炸
+
+# Secondary toolbar and context menu
+tools.title=猿崭謤债斋謩斩榨謤
+tools_label=猿崭謤债斋謩斩榨謤
+first_page.title=员斩謥斩榨宅 铡占铡栈斋斩 乍栈斋斩
+first_page.label=员斩謥斩榨宅 铡占铡栈斋斩 乍栈斋斩
+first_page_label=员斩謥斩榨宅 铡占铡栈斋斩 乍栈斋斩
+last_page.title=员斩謥斩榨宅 站榨謤栈斋斩 乍栈斋斩
+last_page.label=员斩謥斩榨宅 站榨謤栈斋斩 乍栈斋斩
+last_page_label=员斩謥斩榨宅 站榨謤栈斋斩 乍栈斋斩
+page_rotate_cw.title=諍湛湛榨宅 炸战湛 摘铡沾铡謥崭謧盏謥斋 战宅铡謩斋
+page_rotate_cw.label=諍湛湛榨宅 炸战湛 摘铡沾铡謥崭謧盏謥斋 战宅铡謩斋
+page_rotate_cw_label=諍湛湛榨宅 炸战湛 摘铡沾铡謥崭謧盏謥斋 战宅铡謩斋
+page_rotate_ccw.title=諍湛湛榨宅 瞻铡寨铡占铡寨 摘铡沾铡謥崭謧盏謥斋 战宅铡謩斋
+page_rotate_ccw.label=諍湛湛榨宅 瞻铡寨铡占铡寨 摘铡沾铡謥崭謧盏謥斋 战宅铡謩斋
+page_rotate_ccw_label=諍湛湛榨宅 瞻铡寨铡占铡寨 摘铡沾铡謥崭謧盏謥斋 战宅铡謩斋
+
+cursor_text_select_tool.title=談斋铡謥斩榨宅 諒榨謩战湛炸 炸斩湛謤榨宅崭謧 眨崭謤债斋謩炸
+cursor_text_select_tool_label=諒榨謩战湛炸 炸斩湛謤榨宅崭謧 眨崭謤债斋謩
+cursor_hand_tool.title=談斋铡謥斩榨宅 諄榨占謩斋 眨崭謤债斋謩炸
+cursor_hand_tool_label=諄榨占謩斋 眨崭謤债斋謩
+
+# Document properties dialog box
+document_properties.title=論铡战湛铡诈詹诈斋 瞻铡湛寨崭謧诈盏崭謧斩斩榨謤炸...
+document_properties_label=論铡战湛铡诈詹诈斋 瞻铡湛寨崭謧诈盏崭謧斩斩榨謤炸...
+document_properties_file_name=諙铡盏宅斋 铡斩崭謧斩炸.
+document_properties_file_size=諙铡盏宅斋 展铡謨炸.
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} 钥圆 ({{size_b}} 闸铡盏诈)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} 談圆 ({{size_b}} 闸铡盏诈)
+document_properties_title=諑榨謤斩铡眨斋謤.
+document_properties_author=諃榨詹斋斩铡寨鈥�
+document_properties_subject=諑榨謤斩铡眨斋謤.
+document_properties_keywords=諃斋沾斩铡闸铡占.
+document_properties_creation_date=諐湛榨詹债榨宅崭謧 铡沾战铡诈斋站炸.
+document_properties_modification_date=論崭謨崭窄榨宅崭謧 铡沾战铡诈斋站炸.
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=諐湛榨詹债崭詹.
+document_properties_producer=PDF-斋 瞻榨詹斋斩铡寨炸.
+document_properties_version=PDF-斋 湛铡謤闸榨謤铡寨炸.
+document_properties_page_count=苑栈榨謤斋 謩铡斩铡寨炸.
+document_properties_page_size=苑栈斋 展铡謨炸.
+document_properties_page_size_unit_inches=栅盏.
+document_properties_page_size_unit_millimeters=沾沾
+document_properties_page_size_orientation_portrait=崭謧詹詹铡毡斋眨
+document_properties_page_size_orientation_landscape=瞻崭謤斋咋崭斩铡寨铡斩
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=諉铡沾铡寨
+document_properties_page_size_name_legal=諘謤斋斩铡寨铡斩
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+document_properties_close=論铡寨榨宅
+
+print_progress_message=諉铡窄铡蘸铡湛謤铡战湛崭謧沾 乍 謨铡战湛铡诈崭謧詹诈炸 湛蘸榨宅崭謧斩...
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=諌榨詹铡謤寨榨宅
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=圆铡謥榨宅/論铡寨榨宅 钥崭詹铡盏斋斩 站铡瞻铡斩铡寨炸
+toggle_sidebar_notification.title=論崭窄铡斩栈铡湛榨宅 钥崭詹铡盏斋斩 眨崭湛斋斩 (謨铡战湛铡诈崭謧詹诈炸 蘸铡謤崭謧斩铡寨崭謧沾 乍 崭謧謤站铡眨斋债/寨謥崭謤栅)
+toggle_sidebar_label=圆铡謥榨宅/論铡寨榨宅 钥崭詹铡盏斋斩 站铡瞻铡斩铡寨炸
+document_outline.title=諔崭謧謥铡栅謤榨宅 謨铡战湛铡诈詹诈斋 崭謧謤站铡眨斋债炸 (寨謤寨斩铡寨斋 战榨詹沾榨謩諠 沾斋崭謧盏诈斩榨謤炸 炸斩栅铡謤毡铡寨榨宅崭謧/寨崭债寨榨宅崭謧 瞻铡沾铡謤)
+document_outline_label=論铡战湛铡诈詹诈斋 闸崭站铡斩栅铡寨崭謧诈盏崭謧斩炸
+attachments.title=諔崭謧謥铡栅謤榨宅 寨謥崭謤栅斩榨謤炸
+attachments_label=钥謥崭謤栅斩榨謤
+thumbs.title=諔崭謧謥铡栅謤榨宅 談铡斩謤铡蘸铡湛寨榨謤炸
+thumbs_label=談铡斩謤铡蘸铡湛寨榨謤炸
+findbar.title=猿湛斩榨宅 謨铡战湛铡诈詹诈崭謧沾
+findbar_label=請謤崭斩崭謧沾
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=苑栈炸 {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=苑栈斋 沾铡斩謤铡蘸铡湛寨榨謤炸 {{page}}
+
+# Find panel button title and messages
+find_input.title=請謤崭斩崭謧沾
+find_input.placeholder=猿湛斩榨宅 謨铡战湛铡诈詹诈崭謧沾...
+find_previous.title=猿湛斩榨宅 铡斩謤铡瞻铡盏湛崭謧诈盏铡斩 斩铡窄崭謤栅 瞻铡斩栅斋蘸崭謧沾炸
+find_previous_label=諉铡窄崭謤栅炸
+find_next.title=猿湛斋謤 铡謤湛铡瞻铡盏湛崭謧诈盏铡斩 瞻铡栈崭謤栅 瞻铡斩栅斋蘸崭謧沾炸
+find_next_label=諃铡栈崭謤栅炸
+find_highlight=猿崭謧斩铡斩辗榨宅 闸崭宅崭謤炸
+find_match_case_label=談榨债(謨崭謩謤)铡湛铡占 瞻铡辗站斋 铡占斩榨宅
+find_reached_top=諃铡战榨宅 榨謩 謨铡战湛铡诈詹诈斋 站榨謤謬斋斩, 寨辗铡謤崭謧斩铡寨站斋 斩榨謤謩謬斋謥
+find_reached_bottom=諃铡战榨宅 榨謩 謨铡战湛铡诈詹诈斋 站榨謤栈斋斩, 寨辗铡謤崭謧斩铡寨站斋 站榨謤謬斋謥
+find_not_found=员謤湛铡瞻铡盏湛崭謧诈盏崭謧斩炸 展眨湛斩站榨謥
+
+# Error panel labels
+error_more_info=员站榨宅斋 辗铡湛 湛榨詹榨寨崭謧诈盏崭謧斩
+error_less_info=諗斋展 湛榨詹榨寨崭謧诈盏崭謧斩
+error_close=論铡寨榨宅
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (寨铡占崭謧謥崭謧沾炸. {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=猿謤崭謧诈盏崭謧斩炸. {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=諊榨詹栈. {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=諙铡盏宅. {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=諒崭詹炸. {{line}}
+rendering_error=諐窄铡宅諠 乍栈炸 战湛榨詹债榨宅斋战:
+
+# Predefined zoom values
+page_scale_width=苑栈斋 宅铡盏斩謩炸
+page_scale_fit=諄眨榨宅 乍栈炸
+page_scale_auto=曰斩謩斩铡辗窄铡湛
+page_scale_actual=曰謤铡寨铡斩 展铡謨炸
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=諐窄铡宅
+loading_error=諐窄铡宅諠 PDF 謫铡盏宅炸 闸铡謥榨宅斋战謮
+invalid_file_error=諐窄铡宅 寨铡沾 闸斩铡战站铡债 PDF 謫铡盏宅:
+missing_file_error=PDF 謫铡盏宅炸 闸铡謥铡寨铡盏崭謧沾 乍:
+unexpected_response_error=諐蘸铡战铡謤寨斋展斋 铡斩战蘸铡战榨宅斋 蘸铡湛铡战窄铡斩:
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} 跃铡斩崭诈崭謧诈盏崭謧斩]
+password_label=談崭謧湛謩铡眨謤榨謩 PDF-斋 眨铡詹湛斩铡闸铡占炸:
+password_invalid=猿铡詹湛斩铡闸铡占炸 战窄铡宅 乍: 钥謤寨斋斩 謨崭謤毡榨謩:
+password_ok=约铡站
+password_cancel=諌榨詹铡謤寨榨宅
+
+printing_not_supported=远眨崭謧辗铡謥崭謧沾. 諒蘸榨宅炸 铡沾闸崭詹栈崭謧诈盏铡沾闸 展斋 铡栈铡寨謥站崭謧沾 栅斋湛铡謤寨斋展斋 寨崭詹沾斋謥謮
+printing_not_ready=远眨崭謧辗铡謥崭謧沾. PDF-炸 铡沾闸崭詹栈崭謧诈盏铡沾闸 展斋 闸榨占斩铡站崭謤站榨宅 湛蘸榨宅崭謧 瞻铡沾铡謤:
+web_fonts_disabled=諑榨闸-湛铡占铡湛榨战铡寨斩榨謤炸 铡斩栈铡湛站铡债 榨斩. 瞻斩铡謤铡站崭謤 展乍 謪眨湛铡眨崭謤债榨宅 斩榨謤寨铡占崭謧謥站铡债 PDF 湛铡占铡湛榨战铡寨斩榨謤炸:
+document_colors_not_allowed=PDF 謨铡战湛铡诈詹诈榨謤斋斩 诈崭謧盏宅铡湛謤站铡债 展乍 謪眨湛铡眨崭謤债榨宅 斋謤榨斩謥 战榨謨铡寨铡斩 眨崭謧盏斩榨謤炸: 鈥溤拐钢傉嫡≌恐�榨宅 乍栈榨謤斋斩 炸斩湛謤榨宅 斋謤榨斩謥 战榨謨铡寨铡斩 眨崭謧盏斩榨謤炸鈥� 炸斩湛謤铡斩謩炸 铡斩栈铡湛站铡债 乍 栅斋湛铡謤寨斋展崭謧沾:
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ia/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ia/viewer.properties
new file mode 100644
index 0000000..41d45f1
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ia/viewer.properties
@@ -0,0 +1,242 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Pagina previe
+previous_label=Previe
+next.title=Pagina sequente
+next_label=Sequente
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=Pagina
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=de {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} de {{pagesCount}})
+
+zoom_out.title=Distantiar
+zoom_out_label=Distantiar
+zoom_in.title=Approximar
+zoom_in_label=Approximar
+zoom.title=Zoom
+presentation_mode.title=Excambiar a modo presentation
+presentation_mode_label=Modo presentation
+open_file.title=Aperir file
+open_file_label=Aperir
+print.title=Imprimer
+print_label=Imprimer
+download.title=Discargar
+download_label=Discargar
+bookmark.title=Vista actual (copiar o aperir in un nove fenestra)
+bookmark_label=Vista actual
+
+# Secondary toolbar and context menu
+tools.title=Instrumentos
+tools_label=Intrumentos
+first_page.title=Ir al prime pagina
+first_page.label=Ir al prime pagina
+first_page_label=Ir al prime pagina
+last_page.title=Ir al prime pagina
+last_page.label=Ir al prime pagina
+last_page_label=Ir al prime pagina
+page_rotate_cw.title=Rotar in senso horari
+page_rotate_cw.label=Rotar in senso horari
+page_rotate_cw_label=Rotar in senso horari
+page_rotate_ccw.title=Rotar in senso antihorari
+page_rotate_ccw.label=Rotar in senso antihorari
+page_rotate_ccw_label=Rotar in senso antihorari
+
+cursor_text_select_tool.title=Activar le instrumento de selection de texto
+cursor_text_select_tool_label=Instrumento de selection de texto
+cursor_hand_tool.title=Activar le instrumento mano
+cursor_hand_tool_label=Instrumento mano
+
+scroll_vertical.title=Usar rolamento vertical
+scroll_vertical_label=Rolamento vertical
+scroll_horizontal.title=Usar rolamento horizontal
+scroll_horizontal_label=Rolamento horizontal
+scroll_wrapped.title=Usar rolamento incapsulate
+scroll_wrapped_label=Rolamento incapsulate
+
+spread_none.title=Non junger paginas dual
+spread_none_label=Sin paginas dual
+spread_odd.title=Junger paginas dual a partir de paginas con numeros impar
+spread_odd_label=Paginas dual impar
+spread_even.title=Junger paginas dual a partir de paginas con numeros par
+spread_even_label=Paginas dual par
+
+# Document properties dialog box
+document_properties.title=Proprietates del documento鈥�
+document_properties_label=Proprietates del documento鈥�
+document_properties_file_name=Nomine del file:
+document_properties_file_size=Dimension de file:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=Titulo:
+document_properties_author=Autor:
+document_properties_subject=Subjecto:
+document_properties_keywords=Parolas clave:
+document_properties_creation_date=Data de creation:
+document_properties_modification_date=Data de modification:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Creator:
+document_properties_producer=Productor PDF:
+document_properties_version=Version PDF:
+document_properties_page_count=Numero de paginas:
+document_properties_page_size=Dimension del pagina:
+document_properties_page_size_unit_inches=in
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=vertical
+document_properties_page_size_orientation_landscape=horizontal
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Littera
+document_properties_page_size_name_legal=Legal
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=Vista web rapide:
+document_properties_linearized_yes=Si
+document_properties_linearized_no=No
+document_properties_close=Clauder
+
+print_progress_message=Preparation del documento pro le impression鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=Cancellar
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Monstrar/celar le barra lateral
+toggle_sidebar_notification.title=Monstrar/celar le barra lateral (le documento contine structura/attachamentos)
+toggle_sidebar_label=Monstrar/celar le barra lateral
+document_outline.title=Monstrar le schema del documento (clic duple pro expander/contraher tote le elementos)
+document_outline_label=Schema del documento
+attachments.title=Monstrar le annexos
+attachments_label=Annexos
+thumbs.title=Monstrar le vignettes
+thumbs_label=Vignettes
+findbar.title=Recercar in le documento
+findbar_label=Cercar
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Pagina {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Vignette del pagina {{page}}
+
+# Find panel button title and messages
+find_input.title=Cercar
+find_input.placeholder=Cercar in le documento鈥�
+find_previous.title=Trovar le previe occurrentia del phrase
+find_previous_label=Previe
+find_next.title=Trovar le successive occurrentia del phrase
+find_next_label=Sequente
+find_highlight=Evidentiar toto
+find_match_case_label=Distinger majusculas/minusculas
+find_entire_word_label=Parolas integre
+find_reached_top=Le initio del documento ha essite attingite, on continua ab le fin
+find_reached_bottom=Le fin del documento ha essite attingite, on continua ab le initio
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]={{current}} de {{total}} concordantia
+find_match_count[two]={{current}} de {{total}} concordantias
+find_match_count[few]={{current}} de {{total}} concordantias
+find_match_count[many]={{current}} de {{total}} concordantias
+find_match_count[other]={{current}} de {{total}} concordantias
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]=Plus de {{limit}} concordantias
+find_match_count_limit[one]=Plus de {{limit}} concordantia
+find_match_count_limit[two]=Plus de {{limit}} concordantias
+find_match_count_limit[few]=Plus de {{limit}} concordantias
+find_match_count_limit[many]=
+find_match_count_limit[other]=Plus de {{limit}} concordantias
+find_not_found=Phrase non trovate
+
+# Error panel labels
+error_more_info=Plus de informationes
+error_less_info=Minus de informationes
+error_close=Clauder
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Message: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Pila: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=File: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Linea: {{line}}
+rendering_error=Un error occurreva durante que on processava le pagina.
+
+# Predefined zoom values
+page_scale_width=Largessa pagina plen
+page_scale_fit=Pagina integre
+page_scale_auto=Zoom automatic
+page_scale_actual=Dimension actual
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Error
+loading_error=Un error occurreva durante que on cargava le file PDF.
+invalid_file_error=File PDF corrumpite o non valide.
+missing_file_error=File PDF mancante.
+unexpected_response_error=Responsa del servitor inexpectate.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Annotation]
+password_label=Insere le contrasigno pro aperir iste file PDF.
+password_invalid=Contrasigno invalide. Per favor retenta.
+password_ok=OK
+password_cancel=Cancellar
+
+printing_not_supported=Attention聽: le impression non es totalmente supportate per ce navigator.
+printing_not_ready=Attention: le file PDF non es integremente cargate pro lo poter imprimer.
+web_fonts_disabled=Le typos de character de web es inactive: incapace de usar le typos de character incorporate al PDF.
+document_colors_not_allowed=Le documentos PDF non pote utilisar lor proprie colores: 鈥淎utorisar le paginas web a utilisar lor proprie colores鈥� es disactivate in le navigator.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/id/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/id/viewer.properties
new file mode 100644
index 0000000..b6f7080
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/id/viewer.properties
@@ -0,0 +1,242 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Laman Sebelumnya
+previous_label=Sebelumnya
+next.title=Laman Selanjutnya
+next_label=Selanjutnya
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=Halaman
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=dari {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} dari {{pagesCount}})
+
+zoom_out.title=Perkecil
+zoom_out_label=Perkecil
+zoom_in.title=Perbesar
+zoom_in_label=Perbesar
+zoom.title=Perbesaran
+presentation_mode.title=Ganti ke Mode Presentasi
+presentation_mode_label=Mode Presentasi
+open_file.title=Buka Berkas
+open_file_label=Buka
+print.title=Cetak
+print_label=Cetak
+download.title=Unduh
+download_label=Unduh
+bookmark.title=Tampilan Sekarang (salin atau buka di jendela baru)
+bookmark_label=Tampilan Sekarang
+
+# Secondary toolbar and context menu
+tools.title=Alat
+tools_label=Alat
+first_page.title=Buka Halaman Pertama
+first_page.label=Ke Halaman Pertama
+first_page_label=Buka Halaman Pertama
+last_page.title=Buka Halaman Terakhir
+last_page.label=Ke Halaman Terakhir
+last_page_label=Buka Halaman Terakhir
+page_rotate_cw.title=Putar Searah Jarum Jam
+page_rotate_cw.label=Putar Searah Jarum Jam
+page_rotate_cw_label=Putar Searah Jarum Jam
+page_rotate_ccw.title=Putar Berlawanan Arah Jarum Jam
+page_rotate_ccw.label=Putar Berlawanan Arah Jarum Jam
+page_rotate_ccw_label=Putar Berlawanan Arah Jarum Jam
+
+cursor_text_select_tool.title=Aktifkan Alat Seleksi Teks
+cursor_text_select_tool_label=Alat Seleksi Teks
+cursor_hand_tool.title=Aktifkan Alat Tangan
+cursor_hand_tool_label=Alat Tangan
+
+scroll_vertical.title=Gunakan Penggeseran Vertikal
+scroll_vertical_label=Penggeseran Vertikal
+scroll_horizontal.title=Gunakan Penggeseran Horizontal
+scroll_horizontal_label=Penggeseran Horizontal
+scroll_wrapped.title=Gunakan Penggeseran Terapit
+scroll_wrapped_label=Penggeseran Terapit
+
+spread_none.title=Jangan gabungkan lembar halaman
+spread_none_label=Tidak Ada Lembaran
+spread_odd.title=Gabungkan lembar lamanan mulai dengan halaman ganjil
+spread_odd_label=Lembaran Ganjil
+spread_even.title=Gabungkan lembar halaman dimulai dengan halaman genap
+spread_even_label=Lembaran Genap
+
+# Document properties dialog box
+document_properties.title=Properti Dokumen鈥�
+document_properties_label=Properti Dokumen鈥�
+document_properties_file_name=Nama berkas:
+document_properties_file_size=Ukuran berkas:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} byte)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} byte)
+document_properties_title=Judul:
+document_properties_author=Penyusun:
+document_properties_subject=Subjek:
+document_properties_keywords=Kata Kunci:
+document_properties_creation_date=Tanggal Dibuat:
+document_properties_modification_date=Tanggal Dimodifikasi:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Pembuat:
+document_properties_producer=Pemroduksi PDF:
+document_properties_version=Versi PDF:
+document_properties_page_count=Jumlah Halaman:
+document_properties_page_size=Ukuran Laman:
+document_properties_page_size_unit_inches=inci
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=tegak
+document_properties_page_size_orientation_landscape=mendatar
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Letter
+document_properties_page_size_name_legal=Legal
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=Tampilan Web Kilat:
+document_properties_linearized_yes=Ya
+document_properties_linearized_no=Tidak
+document_properties_close=Tutup
+
+print_progress_message=Menyiapkan dokumen untuk pencetakan鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=Batalkan
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Aktif/Nonaktifkan Bilah Samping
+toggle_sidebar_notification.title=Aktif/Nonaktifkan Bilah Samping (dokumen berisi kerangka/lampiran)
+toggle_sidebar_label=Aktif/Nonaktifkan Bilah Samping
+document_outline.title=Tampilkan Kerangka Dokumen (klik ganda untuk membentangkan/menciutkan semua item)
+document_outline_label=Kerangka Dokumen
+attachments.title=Tampilkan Lampiran
+attachments_label=Lampiran
+thumbs.title=Tampilkan Miniatur
+thumbs_label=Miniatur
+findbar.title=Temukan di Dokumen
+findbar_label=Temukan
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Laman {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Miniatur Laman {{page}}
+
+# Find panel button title and messages
+find_input.title=Temukan
+find_input.placeholder=Temukan di dokumen鈥�
+find_previous.title=Temukan kata sebelumnya
+find_previous_label=Sebelumnya
+find_next.title=Temukan lebih lanjut
+find_next_label=Selanjutnya
+find_highlight=Sorot semuanya
+find_match_case_label=Cocokkan BESAR/kecil
+find_entire_word_label=Seluruh teks
+find_reached_top=Sampai di awal dokumen, dilanjutkan dari bawah
+find_reached_bottom=Sampai di akhir dokumen, dilanjutkan dari atas
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]={{current}} dari {{total}} hasil
+find_match_count[two]={{current}} dari {{total}} hasil
+find_match_count[few]={{current}} dari {{total}} hasil
+find_match_count[many]={{current}} dari {{total}} hasil
+find_match_count[other]={{current}} dari {{total}} hasil
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]=Ditemukan lebih dari {{limit}}
+find_match_count_limit[one]=Ditemukan lebih dari {{limit}}
+find_match_count_limit[two]=Ditemukan lebih dari {{limit}}
+find_match_count_limit[few]=Ditemukan lebih dari {{limit}}
+find_match_count_limit[many]=Ditemukan lebih dari {{limit}}
+find_match_count_limit[other]=Ditemukan lebih dari {{limit}}
+find_not_found=Frasa tidak ditemukan
+
+# Error panel labels
+error_more_info=Lebih Banyak Informasi
+error_less_info=Lebih Sedikit Informasi
+error_close=Tutup
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Pesan: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stack: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Berkas: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Baris: {{line}}
+rendering_error=Galat terjadi saat merender laman.
+
+# Predefined zoom values
+page_scale_width=Lebar Laman
+page_scale_fit=Muat Laman
+page_scale_auto=Perbesaran Otomatis
+page_scale_actual=Ukuran Asli
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Galat
+loading_error=Galat terjadi saat memuat PDF.
+invalid_file_error=Berkas PDF tidak valid atau rusak.
+missing_file_error=Berkas PDF tidak ada.
+unexpected_response_error=Balasan server yang tidak diharapkan.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[Anotasi {{type}}]
+password_label=Masukkan sandi untuk membuka berkas PDF ini.
+password_invalid=Sandi tidak valid. Silakan coba lagi.
+password_ok=Oke
+password_cancel=Batal
+
+printing_not_supported=Peringatan: Pencetakan tidak didukung secara lengkap pada peramban ini.
+printing_not_ready=Peringatan: Berkas PDF masih belum dimuat secara lengkap untuk dapat dicetak.
+web_fonts_disabled=Font web dinonaktifkan: tidak dapat menggunakan font PDF yang tersemat.
+document_colors_not_allowed=Dokumen PDF tidak diizinkan untuk menggunakan warnanya sendiri karena setelan 'Izinkan laman memilih warna sendiri' dinonaktifkan pada pengaturan.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/is/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/is/viewer.properties
new file mode 100644
index 0000000..912cb4c
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/is/viewer.properties
@@ -0,0 +1,214 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Fyrri s铆冒a
+previous_label=Fyrri
+next.title=N忙sta s铆冒a
+next_label=N忙sti
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=S铆冒a
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=af {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} af {{pagesCount}})
+
+zoom_out.title=Minnka
+zoom_out_label=Minnka
+zoom_in.title=St忙kka
+zoom_in_label=St忙kka
+zoom.title=A冒dr谩ttur
+presentation_mode.title=Skipta yfir 谩 kynningarham
+presentation_mode_label=Kynningarhamur
+open_file.title=Opna skr谩
+open_file_label=Opna
+print.title=Prenta
+print_label=Prenta
+download.title=Hala ni冒ur
+download_label=Hala ni冒ur
+bookmark.title=N煤verandi s媒n (afrita冒u e冒a opna冒u 铆 n媒jum glugga)
+bookmark_label=N煤verandi s媒n
+
+# Secondary toolbar and context menu
+tools.title=Verkf忙ri
+tools_label=Verkf忙ri
+first_page.title=Fara 谩 fyrstu s铆冒u
+first_page.label=Fara 谩 fyrstu s铆冒u
+first_page_label=Fara 谩 fyrstu s铆冒u
+last_page.title=Fara 谩 s铆冒ustu s铆冒u
+last_page.label=Fara 谩 s铆冒ustu s铆冒u
+last_page_label=Fara 谩 s铆冒ustu s铆冒u
+page_rotate_cw.title=Sn煤a r茅tts忙lis
+page_rotate_cw.label=Sn煤a r茅tts忙lis
+page_rotate_cw_label=Sn煤a r茅tts忙lis
+page_rotate_ccw.title=Sn煤a rangs忙lis
+page_rotate_ccw.label=Sn煤a rangs忙lis
+page_rotate_ccw_label=Sn煤a rangs忙lis
+
+cursor_text_select_tool.title=Virkja textavals谩hald
+cursor_text_select_tool_label=Textavals谩hald
+cursor_hand_tool.title=Virkja handarverkf忙ri
+cursor_hand_tool_label=Handarverkf忙ri
+
+
+
+# Document properties dialog box
+document_properties.title=Eiginleikar skjals鈥�
+document_properties_label=Eiginleikar skjals鈥�
+document_properties_file_name=Skr谩arnafn:
+document_properties_file_size=Skr谩rst忙r冒:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=Titill:
+document_properties_author=H枚nnu冒ur:
+document_properties_subject=Efni:
+document_properties_keywords=Stikkor冒:
+document_properties_creation_date=B煤i冒 til:
+document_properties_modification_date=Dags breytingar:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=H枚fundur:
+document_properties_producer=PDF framlei冒andi:
+document_properties_version=PDF 煤tg谩fa:
+document_properties_page_count=Bla冒s铆冒ufj枚ldi:
+document_properties_page_size=St忙r冒 s铆冒u:
+document_properties_page_size_unit_inches=in
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=skammsni冒
+document_properties_page_size_orientation_landscape=langsni冒
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Letter
+document_properties_page_size_name_legal=Legal
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_close=Loka
+
+print_progress_message=Undirb媒 skjal fyrir prentun鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=H忙tta vi冒
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=V铆xla hli冒sl谩
+toggle_sidebar_notification.title=V铆xla hli冒arsl谩 (skjal inniheldur yfirlit/vi冒hengi)
+toggle_sidebar_label=V铆xla hli冒sl谩
+document_outline.title=S媒na yfirlit skjals (tv铆smelltu til a冒 opna/loka 枚llum hlutum)
+document_outline_label=Efnisskipan skjals
+attachments.title=S媒na vi冒hengi
+attachments_label=Vi冒hengi
+thumbs.title=S媒na sm谩myndir
+thumbs_label=Sm谩myndir
+findbar.title=Leita 铆 skjali
+findbar_label=Leita
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=S铆冒a {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Sm谩mynd af s铆冒u {{page}}
+
+# Find panel button title and messages
+find_input.title=Leita
+find_input.placeholder=Leita 铆 skjali鈥�
+find_previous.title=Leita a冒 fyrra tilfelli 镁essara or冒a
+find_previous_label=Fyrri
+find_next.title=Leita a冒 n忙sta tilfelli 镁essara or冒a
+find_next_label=N忙sti
+find_highlight=Lita allt
+find_match_case_label=Passa vi冒 stafst枚冒u
+find_reached_top=N谩冒i efst 铆 skjal, held 谩fram ne冒st
+find_reached_bottom=N谩冒i enda skjals, held 谩fram efst
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_not_found=Fann ekki or冒i冒
+
+# Error panel labels
+error_more_info=Meiri uppl媒singar
+error_less_info=Minni uppl媒singar
+error_close=Loka
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Skilabo冒: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stafli: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Skr谩: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=L铆na: {{line}}
+rendering_error=Upp kom villa vi冒 a冒 birta s铆冒una.
+
+# Predefined zoom values
+page_scale_width=S铆冒ubreidd
+page_scale_fit=Passa 谩 s铆冒u
+page_scale_auto=Sj谩lfvirkur a冒dr谩ttur
+page_scale_actual=Raunst忙r冒
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Villa
+loading_error=Villa kom upp vi冒 a冒 hla冒a inn PDF.
+invalid_file_error=脫gild e冒a skemmd PDF skr谩.
+missing_file_error=Vantar PDF skr谩.
+unexpected_response_error=脫v忙nt svar fr谩 net镁j贸ni.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Sk媒ring]
+password_label=Sl谩冒u inn lykilor冒 til a冒 opna 镁essa PDF skr谩.
+password_invalid=脫gilt lykilor冒. Reyndu aftur.
+password_ok=脥 lagi
+password_cancel=H忙tta vi冒
+
+printing_not_supported=A冒v枚run: Prentun er ekki me冒 fyllilegan stu冒ning 谩 镁essum vafra.
+printing_not_ready=A冒v枚run: Ekki er b煤i冒 a冒 hla冒a inn allri PDF skr谩nni fyrir prentun.
+web_fonts_disabled=Vef leturger冒ir eru 贸virkar: get ekki nota冒 innbygg冒ar PDF leturger冒ir.
+document_colors_not_allowed=PDF skj枚l hafa ekki leyfi til a冒 nota s铆na eigin liti: 鈥淟eyfa s铆冒um a冒 velja eigin liti鈥� er 贸virkt 铆 vafranum.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/it/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/it/viewer.properties
new file mode 100644
index 0000000..a44c3fd
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/it/viewer.properties
@@ -0,0 +1,157 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+previous.title = Pagina precedente
+previous_label = Precedente
+next.title = Pagina successiva
+next_label = Successiva
+page.title = Pagina
+of_pages = di {{pagesCount}}
+page_of_pages = ({{pageNumber}} di {{pagesCount}})
+zoom_out.title = Riduci zoom
+zoom_out_label = Riduci zoom
+zoom_in.title = Aumenta zoom
+zoom_in_label = Aumenta zoom
+zoom.title = Zoom
+presentation_mode.title = Passa alla modalit脿 presentazione
+presentation_mode_label = Modalit脿 presentazione
+open_file.title = Apri file
+open_file_label = Apri
+print.title = Stampa
+print_label = Stampa
+download.title = Scarica questo documento
+download_label = Download
+bookmark.title = Visualizzazione corrente (copia o apri in una nuova finestra)
+bookmark_label = Visualizzazione corrente
+tools.title = Strumenti
+tools_label = Strumenti
+first_page.title = Vai alla prima pagina
+first_page.label = Vai alla prima pagina
+first_page_label = Vai alla prima pagina
+last_page.title = Vai all鈥檜ltima pagina
+last_page.label = Vai all鈥檜ltima pagina
+last_page_label = Vai all鈥檜ltima pagina
+page_rotate_cw.title = Ruota in senso orario
+page_rotate_cw.label = Ruota in senso orario
+page_rotate_cw_label = Ruota in senso orario
+page_rotate_ccw.title = Ruota in senso antiorario
+page_rotate_ccw.label = Ruota in senso antiorario
+page_rotate_ccw_label = Ruota in senso antiorario
+cursor_text_select_tool.title = Attiva strumento di selezione testo
+cursor_text_select_tool_label = Strumento di selezione testo
+cursor_hand_tool.title = Attiva strumento mano
+cursor_hand_tool_label = Strumento mano
+scroll_vertical.title = Scorri le pagine in verticale
+scroll_vertical_label = Scorrimento verticale
+scroll_horizontal.title = Scorri le pagine in orizzontale
+scroll_horizontal_label = Scorrimento orizzontale
+scroll_wrapped.title = Scorri le pagine in verticale, disponendole da sinistra a destra e andando a capo automaticamente
+scroll_wrapped_label = Scorrimento con a capo automatico
+spread_none.title = Non raggruppare pagine
+spread_none_label = Nessun raggruppamento
+spread_odd.title = Crea gruppi di pagine che iniziano con numeri di pagina dispari
+spread_odd_label = Raggruppamento dispari
+spread_even.title = Crea gruppi di pagine che iniziano con numeri di pagina pari
+spread_even_label = Raggruppamento pari
+document_properties.title = Propriet脿 del documento鈥�
+document_properties_label = Propriet脿 del documento鈥�
+document_properties_file_name = Nome file:
+document_properties_file_size = Dimensione file:
+document_properties_kb = {{size_kb}} kB ({{size_b}} byte)
+document_properties_mb = {{size_mb}} MB ({{size_b}} byte)
+document_properties_title = Titolo:
+document_properties_author = Autore:
+document_properties_subject = Oggetto:
+document_properties_keywords = Parole chiave:
+document_properties_creation_date = Data creazione:
+document_properties_modification_date = Data modifica:
+document_properties_date_string = {{date}}, {{time}}
+document_properties_creator = Autore originale:
+document_properties_producer = Produttore PDF:
+document_properties_version = Versione PDF:
+document_properties_page_count = Conteggio pagine:
+document_properties_page_size = Dimensioni pagina:
+document_properties_page_size_unit_inches = in
+document_properties_page_size_unit_millimeters = mm
+document_properties_page_size_orientation_portrait = verticale
+document_properties_page_size_orientation_landscape = orizzontale
+document_properties_page_size_name_a3 = A3
+document_properties_page_size_name_a4 = A4
+document_properties_page_size_name_letter = Lettera
+document_properties_page_size_name_legal = Legale
+document_properties_page_size_dimension_string = {{width}} 脳 {{height}} {{unit}} ({{orientation}})
+document_properties_page_size_dimension_name_string = {{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+document_properties_linearized = Visualizzazione web veloce:
+document_properties_linearized_yes = S矛
+document_properties_linearized_no = No
+document_properties_close = Chiudi
+print_progress_message = Preparazione documento per la stampa鈥�
+print_progress_percent = {{progress}}%
+print_progress_close = Annulla
+toggle_sidebar.title = Attiva/disattiva barra laterale
+toggle_sidebar_notification.title = Attiva/disattiva barra laterale (il documento contiene struttura/allegati)
+toggle_sidebar_label = Attiva/disattiva barra laterale
+document_outline.title = Visualizza la struttura del documento (doppio clic per visualizzare/nascondere tutti gli elementi)
+document_outline_label = Struttura documento
+attachments.title = Visualizza allegati
+attachments_label = Allegati
+thumbs.title = Mostra le miniature
+thumbs_label = Miniature
+findbar.title = Trova nel documento
+findbar_label = Trova
+thumb_page_title = Pagina {{page}}
+thumb_page_canvas = Miniatura della pagina {{page}}
+find_input.title = Trova
+find_input.placeholder = Trova nel documento鈥�
+find_previous.title = Trova l鈥檕ccorrenza precedente del testo da cercare
+find_previous_label = Precedente
+find_next.title = Trova l鈥檕ccorrenza successiva del testo da cercare
+find_next_label = Successivo
+find_highlight = Evidenzia
+find_match_case_label = Maiuscole/minuscole
+find_entire_word_label = Parole intere
+find_reached_top = Raggiunto l鈥檌nizio della pagina, continua dalla fine
+find_reached_bottom = Raggiunta la fine della pagina, continua dall鈥檌nizio
+find_match_count = {[ plural(total) ]}
+find_match_count[one] = {{current}} di {{total}} corrispondenza
+find_match_count[two] = {{current}} di {{total}} corrispondenze
+find_match_count[few] = {{current}} di {{total}} corrispondenze
+find_match_count[many] = {{current}} di {{total}} corrispondenze
+find_match_count[other] = {{current}} di {{total}} corrispondenze
+find_match_count_limit = {[ plural(limit) ]}
+find_match_count_limit[zero] = Pi霉 di {{limit}} corrispondenze
+find_match_count_limit[one] = Pi霉 di {{limit}} corrispondenza
+find_match_count_limit[two] = Pi霉 di {{limit}} corrispondenze
+find_match_count_limit[few] = Pi霉 di {{limit}} corrispondenze
+find_match_count_limit[many] = Pi霉 di {{limit}} corrispondenze
+find_match_count_limit[other] = Pi霉 di {{limit}} corrispondenze
+find_not_found = Testo non trovato
+error_more_info = Ulteriori informazioni
+error_less_info = Nascondi dettagli
+error_close = Chiudi
+error_version_info = PDF.js v{{version}} (build: {{build}})
+error_message = Messaggio: {{message}}
+error_stack = Stack: {{stack}}
+error_file = File: {{file}}
+error_line = Riga: {{line}}
+rendering_error = Si 猫 verificato un errore durante il rendering della pagina.
+page_scale_width = Larghezza pagina
+page_scale_fit = Adatta a una pagina
+page_scale_auto = Zoom automatico
+page_scale_actual = Dimensioni effettive
+page_scale_percent = {{scale}}%
+loading_error_indicator = Errore
+loading_error = Si 猫 verificato un errore durante il caricamento del PDF.
+invalid_file_error = File PDF non valido o danneggiato.
+missing_file_error = File PDF non disponibile.
+unexpected_response_error = Risposta imprevista del server
+text_annotation_type.alt = [Annotazione: {{type}}]
+password_label = Inserire la password per aprire questo file PDF.
+password_invalid = Password non corretta. Riprovare.
+password_ok = OK
+password_cancel = Annulla
+printing_not_supported = Attenzione: la stampa non 猫 completamente supportata da questo browser.
+printing_not_ready = Attenzione: il PDF non 猫 ancora stato caricato completamente per la stampa.
+web_fonts_disabled = I web font risultano disattivati: impossibile utilizzare i caratteri inclusi nel PDF.
+document_colors_not_allowed = Non 猫 possibile visualizzare i colori originali definiti nel file PDF: l鈥檕pzione del browser 鈥淐onsenti alle pagine di scegliere i propri colori invece di quelli impostati鈥� 猫 disattivata.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ja/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ja/viewer.properties
new file mode 100644
index 0000000..3ab20ad
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ja/viewer.properties
@@ -0,0 +1,220 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=鍓嶃伄銉氥兗銈搞伕鎴汇倞銇俱仚
+previous_label=鍓嶃伕
+next.title=娆°伄銉氥兗銈搞伕閫层伩銇俱仚
+next_label=娆°伕
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=銉氥兗銈�
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=/ {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} / {{pagesCount}})
+
+zoom_out.title=琛ㄧず銈掔府灏忋仐銇俱仚
+zoom_out_label=绺皬
+zoom_in.title=琛ㄧず銈掓嫛澶с仐銇俱仚
+zoom_in_label=鎷″ぇ
+zoom.title=鎷″ぇ/绺皬
+presentation_mode.title=銉椼儸銈笺兂銉嗐兗銈枫儳銉炽儮銉笺儔銇垏銈婃浛銇堛伨銇�
+presentation_mode_label=銉椼儸銈笺兂銉嗐兗銈枫儳銉炽儮銉笺儔
+open_file.title=銉曘偂銈ゃ儷銈掗枊銇嶃伨銇�
+open_file_label=闁嬨亸
+print.title=鍗板埛銇椼伨銇�
+print_label=鍗板埛
+download.title=銉�銈︺兂銉兗銉夈仐銇俱仚
+download_label=銉�銈︺兂銉兗銉�
+bookmark.title=鐝惧湪銇儞銉ャ兗銇� URL 銇с仚 (銈炽償銉笺伨銇熴伅鏂般仐銇勩偊銈c兂銉夈偊銇枊銇�)
+bookmark_label=鐝惧湪銇儞銉ャ兗
+
+# Secondary toolbar and context menu
+tools.title=銉勩兗銉�
+tools_label=銉勩兗銉�
+first_page.title=鏈�鍒濄伄銉氥兗銈搞伕绉诲嫊銇椼伨銇�
+first_page.label=鏈�鍒濄伄銉氥兗銈搞伕绉诲嫊
+first_page_label=鏈�鍒濄伄銉氥兗銈搞伕绉诲嫊
+last_page.title=鏈�寰屻伄銉氥兗銈搞伕绉诲嫊銇椼伨銇�
+last_page.label=鏈�寰屻伄銉氥兗銈搞伕绉诲嫊
+last_page_label=鏈�寰屻伄銉氥兗銈搞伕绉诲嫊
+page_rotate_cw.title=銉氥兗銈搞倰鍙炽伕鍥炶虎銇椼伨銇�
+page_rotate_cw.label=鍙冲洖杌�
+page_rotate_cw_label=鍙冲洖杌�
+page_rotate_ccw.title=銉氥兗銈搞倰宸︺伕鍥炶虎銇椼伨銇�
+page_rotate_ccw.label=宸﹀洖杌�
+page_rotate_ccw_label=宸﹀洖杌�
+
+cursor_text_select_tool.title=銉嗐偔銈广儓閬告姙銉勩兗銉倰鏈夊姽銇仚銈�
+cursor_text_select_tool_label=銉嗐偔銈广儓閬告姙銉勩兗銉�
+cursor_hand_tool.title=鎵嬨伄銇层倝銉勩兗銉倰鏈夊姽銇仚銈�
+cursor_hand_tool_label=鎵嬨伄銇层倝銉勩兗銉�
+
+scroll_vertical.title=绺︺偣銈儹銉笺儷銇仚銈�
+scroll_vertical_label=绺︺偣銈儹銉笺儷
+scroll_horizontal.title=妯偣銈儹銉笺儷銇仚銈�
+scroll_horizontal_label=妯偣銈儹銉笺儷
+scroll_wrapped.title=鎶樸倞杩斻仐銈广偗銉兗銉伀銇欍倠
+scroll_wrapped_label=鎶樸倞杩斻仐銈广偗銉兗銉�
+
+spread_none.title=瑕嬮枊銇嶃伀銇椼仾銇�
+spread_none_label=瑕嬮枊銇嶃伀銇椼仾銇�
+spread_odd.title=濂囨暟銉氥兗銈搁枊濮嬨仹瑕嬮枊銇嶃伀銇欍倠
+spread_odd_label=濂囨暟銉氥兗銈歌闁嬨亶
+spread_even.title=鍋舵暟銉氥兗銈搁枊濮嬨仹瑕嬮枊銇嶃伀銇欍倠
+spread_even_label=鍋舵暟銉氥兗銈歌闁嬨亶
+
+# Document properties dialog box
+document_properties.title=鏂囨浉銇儣銉儜銉嗐偅...
+document_properties_label=鏂囨浉銇儣銉儜銉嗐偅...
+document_properties_file_name=銉曘偂銈ゃ儷鍚�:
+document_properties_file_size=銉曘偂銈ゃ儷銈点偆銈�:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=銈裤偆銉堛儷:
+document_properties_author=浣滄垚鑰�:
+document_properties_subject=浠跺悕:
+document_properties_keywords=銈兗銉兗銉�:
+document_properties_creation_date=浣滄垚鏃�:
+document_properties_modification_date=鏇存柊鏃�:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=銈€儣銉偙銉笺偡銉с兂:
+document_properties_producer=PDF 浣滄垚:
+document_properties_version=PDF 銇儛銉笺偢銉с兂:
+document_properties_page_count=銉氥兗銈告暟:
+document_properties_page_size=銉氥兗銈搞偟銈ゃ偤:
+document_properties_page_size_unit_inches=in
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=绺�
+document_properties_page_size_orientation_landscape=妯�
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=銉偪銉�
+document_properties_page_size_name_legal=銉兗銈儷
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=銈︺偋銉栬〃绀虹敤銇渶閬╁寲:
+document_properties_linearized_yes=銇亜
+document_properties_linearized_no=銇勩亜銇�
+document_properties_close=闁夈仒銈�
+
+print_progress_message=鏂囨浉銇嵃鍒枫倰婧栧倷銇椼仸銇勩伨銇�...
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=銈儯銉炽偦銉�
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=銈点偆銉夈儛銉艰〃绀恒倰鍒囥倞鏇裤亪銇俱仚
+toggle_sidebar_notification.title=銈点偆銉夈儛銉艰〃绀恒倰鍒囥倞鏇裤亪銇俱仚 (鏂囨浉銇惈銇俱倢銈嬨偄銈︺儓銉┿偆銉� / 娣讳粯)
+toggle_sidebar_label=銈点偆銉夈儛銉笺伄鍒囥倞鏇裤亪
+document_outline.title=鏂囨浉銇洰娆°倰琛ㄧず銇椼伨銇� (銉�銉栥儷銈儶銉冦偗銇ч爡鐩倰闁嬮枆銇椼伨銇�)
+document_outline_label=鏂囨浉銇洰娆�
+attachments.title=娣讳粯銉曘偂銈ゃ儷銈掕〃绀恒仐銇俱仚
+attachments_label=娣讳粯銉曘偂銈ゃ儷
+thumbs.title=绺皬鐗堛倰琛ㄧず銇椼伨銇�
+thumbs_label=绺皬鐗�
+findbar.title=鏂囨浉鍐呫倰妞滅储銇椼伨銇�
+findbar_label=妞滅储
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title={{page}} 銉氥兗銈�
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=銉氥兗銈搞伄绺皬鐗� {{page}}
+
+# Find panel button title and messages
+find_input.title=妞滅储
+find_input.placeholder=鏂囨浉鍐呫倰妞滅储...
+find_previous.title=鐝惧湪銈堛倞鍓嶃伄浣嶇疆銇ф寚瀹氭枃瀛楀垪銇岀従銈屻倠閮ㄥ垎銈掓绱€仐銇俱仚
+find_previous_label=鍓嶃伕
+find_next.title=鐝惧湪銈堛倞寰屻伄浣嶇疆銇ф寚瀹氭枃瀛楀垪銇岀従銈屻倠閮ㄥ垎銈掓绱€仐銇俱仚
+find_next_label=娆°伕
+find_highlight=銇欍伖銇﹀挤瑾胯〃绀�
+find_match_case_label=澶ф枃瀛�/灏忔枃瀛椼倰鍖哄垾
+find_reached_top=鏂囨浉鍏堥牠銇埌閬斻仐銇熴伄銇ф湯灏俱亱銈夌稓銇戙仸妞滅储銇椼伨銇�
+find_reached_bottom=鏂囨浉鏈熬銇埌閬斻仐銇熴伄銇у厛闋亱銈夌稓銇戙仸妞滅储銇椼伨銇�
+find_not_found=瑕嬨仱銇嬨倞銇俱仜銈撱仹銇椼仧
+
+# Error panel labels
+error_more_info=瑭崇窗鎯呭牨
+error_less_info=瑭崇窗鎯呭牨銈掗殸銇�
+error_close=闁夈仒銈�
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (銉撱儷銉�: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=銉°儍銈汇兗銈�: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=銈广偪銉冦偗: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=銉曘偂銈ゃ儷: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=琛�: {{line}}
+rendering_error=銉氥兗銈搞伄銉兂銉�銉兂銈颁腑銇偍銉┿兗銇岀櫤鐢熴仐銇俱仐銇熴��
+
+# Predefined zoom values
+page_scale_width=骞呫伀鍚堛倧銇涖倠
+page_scale_fit=銉氥兗銈搞伄銈点偆銈恒伀鍚堛倧銇涖倠
+page_scale_auto=鑷嫊銈恒兗銉�
+page_scale_actual=瀹熼殯銇偟銈ゃ偤
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=銈ㄣ儵銉�
+loading_error=PDF 銇銇胯炯銇夸腑銇偍銉┿兗銇岀櫤鐢熴仐銇俱仐銇熴��
+invalid_file_error=鐒″姽銇俱仧銇牬鎼嶃仐銇� PDF 銉曘偂銈ゃ儷銆�
+missing_file_error=PDF 銉曘偂銈ゃ儷銇岃銇ゃ亱銈娿伨銇涖倱銆�
+unexpected_response_error=銈点兗銉愩兗銇嬨倝浜堟湡銇涖伂蹇滅瓟銇屻亗銈娿伨銇椼仧銆�
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} 娉ㄩ噲]
+password_label=銇撱伄 PDF 銉曘偂銈ゃ儷銈掗枊銇忋仧銈併伄銉戙偣銉兗銉夈倰鍏ュ姏銇椼仸銇忋仩銇曘亜銆�
+password_invalid=鐒″姽銇儜銈广儻銉笺儔銇с仚銆傘倐銇嗕竴搴︺倓銈婄洿銇椼仸銇忋仩銇曘亜銆�
+password_ok=OK
+password_cancel=銈儯銉炽偦銉�
+
+printing_not_supported=璀﹀憡: 銇撱伄銉栥儵銈︺偠銉笺仹銇嵃鍒枫亴瀹屽叏銇偟銉濄兗銉堛仌銈屻仸銇勩伨銇涖倱銆�
+printing_not_ready=璀﹀憡: PDF 銈掑嵃鍒枫仚銈嬨仧銈併伄瑾伩杈笺伩銇岀祩浜嗐仐銇︺亜銇俱仜銈撱��
+web_fonts_disabled=銈︺偋銉栥儠銈┿兂銉堛亴鐒″姽銇仾銇c仸銇勩伨銇�: 鍩嬨倎杈笺伨銈屻仧 PDF 銇儠銈┿兂銉堛倰浣跨敤銇с亶銇俱仜銈撱��
+document_colors_not_allowed=PDF 鏂囨浉銇�併偊銈с儢銉氥兗銈搞亴鎸囧畾銇椼仧閰嶈壊銈掍娇鐢ㄣ仚銈嬨亾銇ㄣ亴銇с亶銇俱仜銈�: '銈︺偋銉栥儦銉笺偢銇屾寚瀹氥仐銇熼厤鑹�' 銇儢銉┿偊銈躲兗銇х劇鍔广伀銇仯銇︺亜銇俱仚銆�
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ka/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ka/viewer.properties
new file mode 100644
index 0000000..b20609d
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ka/viewer.properties
@@ -0,0 +1,242 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=醿儤醿溼儛 醿掅儠醿斸儬醿撫儤
+previous_label=醿儤醿溼儛
+next.title=醿ㄡ償醿涐儞醿斸儝醿� 醿掅儠醿斸儬醿撫儤
+next_label=醿ㄡ償醿涐儞醿斸儝醿�
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=醿掅儠醿斸儬醿撫儤
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages={{pagesCount}}-醿撫儛醿�
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} {{pagesCount}}-醿撫儛醿�)
+
+zoom_out.title=醿栣儩醿涐儤醿� 醿ㄡ償醿涐儶醿樶儬醿斸儜醿�
+zoom_out_label=醿撫儛醿ㄡ儩醿犪償醿戓儛
+zoom_in.title=醿栣儩醿涐儤醿� 醿掅儛醿栣儬醿撫儛
+zoom_in_label=醿涐儩醿愥儺醿氠儩醿斸儜醿�
+zoom.title=醿栣儩醿涐儛
+presentation_mode.title=醿┽儠醿斸儨醿斸儜醿樶儭 醿犪償醿熱儤醿涐儢醿� 醿掅儛醿撫儛醿犪儣醿曖儛
+presentation_mode_label=醿┽儠醿斸儨醿斸儜醿樶儭 醿犪償醿熱儤醿涐儤
+open_file.title=醿め儛醿樶儦醿樶儭 醿掅儛醿儭醿溼儛
+open_file_label=醿掅儛醿儭醿溼儛
+print.title=醿愥儧醿濁儜醿斸儹醿撫儠醿�
+print_label=醿愥儧醿濁儜醿斸儹醿撫儠醿�
+download.title=醿┽儛醿涐儩醿⑨儠醿樶儬醿椺儠醿�
+download_label=醿┽儛醿涐儩醿⑨儠醿樶儬醿椺儠醿�
+bookmark.title=醿涐儤醿涐儞醿樶儨醿愥儬醿� 醿償醿撫儤 (醿撫儛醿欋儩醿炨儤醿犪償醿戓儛 醿愥儨 醿掅儛醿儭醿溼儛 醿愥儺醿愥儦 醿め儛醿溼儻醿愥儬醿愥儴醿�)
+bookmark_label=醿涐儤醿涐儞醿樶儨醿愥儬醿� 醿償醿撫儤
+
+# Secondary toolbar and context menu
+tools.title=醿償醿氠儭醿愥儸醿п儩醿斸儜醿�
+tools_label=醿償醿氠儭醿愥儸醿п儩醿斸儜醿�
+first_page.title=醿炨儤醿犪儠醿斸儦 醿掅儠醿斸儬醿撫儢醿� 醿掅儛醿撫儛醿♂儠醿氠儛
+first_page.label=醿炨儤醿犪儠醿斸儦 醿掅儠醿斸儬醿撫儢醿� 醿掅儛醿撫儛醿♂儠醿氠儛
+first_page_label=醿炨儤醿犪儠醿斸儦 醿掅儠醿斸儬醿撫儢醿� 醿掅儛醿撫儛醿♂儠醿氠儛
+last_page.title=醿戓儩醿氠儩 醿掅儠醿斸儬醿撫儢醿� 醿掅儛醿撫儛醿♂儠醿氠儛
+last_page.label=醿戓儩醿氠儩 醿掅儠醿斸儬醿撫儢醿� 醿掅儛醿撫儛醿♂儠醿氠儛
+last_page_label=醿戓儩醿氠儩 醿掅儠醿斸儬醿撫儢醿� 醿掅儛醿撫儛醿♂儠醿氠儛
+page_rotate_cw.title=醿♂儛醿愥儣醿樶儭 醿樶儭醿犪儤醿� 醿涐儤醿涐儛醿犪儣醿a儦醿斸儜醿樶儣 醿ㄡ償醿戓儬醿a儨醿斸儜醿�
+page_rotate_cw.label=醿涐儛醿犪儻醿曖儨醿樶儠 醿掅儛醿撫儛醿戓儬醿a儨醿斸儜醿�
+page_rotate_cw_label=醿涐儛醿犪儻醿曖儨醿樶儠 醿掅儛醿撫儛醿戓儬醿a儨醿斸儜醿�
+page_rotate_ccw.title=醿♂儛醿愥儣醿樶儭 醿樶儭醿犪儤醿� 醿♂儛醿炨儤醿犪儤醿♂優醿樶儬醿濁儞 醿ㄡ償醿戓儬醿a儨醿斸儜醿�
+page_rotate_ccw.label=醿涐儛醿犪儶醿儨醿樶儠 醿掅儛醿撫儛醿戓儬醿a儨醿斸儜醿�
+page_rotate_ccw_label=醿涐儛醿犪儶醿儨醿樶儠 醿掅儛醿撫儛醿戓儬醿a儨醿斸儜醿�
+
+cursor_text_select_tool.title=醿涐儩醿♂儛醿溼儤醿ㄡ儨醿� 醿涐儛醿┽儠醿斸儨醿斸儜醿氠儤醿� 醿掅儛醿涐儩醿п償醿溼償醿戓儛
+cursor_text_select_tool_label=醿涐儩醿♂儛醿溼儤醿ㄡ儨醿� 醿涐儛醿┽儠醿斸儨醿斸儜醿斸儦醿�
+cursor_hand_tool.title=醿掅儛醿撫儛醿♂儛醿愥儞醿掅儤醿氠償醿戓償醿氠儤 醿涐儛醿┽儠醿斸儨醿斸儜醿氠儤醿� 醿掅儛醿涐儩醿п償醿溼償醿戓儛
+cursor_hand_tool_label=醿掅儛醿撫儛醿♂儛醿愥儞醿掅儤醿氠償醿戓償醿氠儤
+
+scroll_vertical.title=醿掅儠醿斸儬醿撫償醿戓儤醿� 醿ㄡ儠醿斸儯醿氠儛醿� 醿┽儠醿斸儨醿斸儜醿�
+scroll_vertical_label=醿ㄡ儠醿斸儯醿氠儤 醿掅儛醿撫儛醿愥儞醿掅儤醿氠償醿戓儛
+scroll_horizontal.title=醿掅儠醿斸儬醿撫償醿戓儤醿� 醿椺儛醿犪儛醿栣儯醿氠儛醿� 醿┽儠醿斸儨醿斸儜醿�
+scroll_horizontal_label=醿掅儛醿溼儤醿曖儤 醿掅儛醿撫儛醿愥儞醿掅儤醿氠償醿戓儛
+scroll_wrapped.title=醿掅儠醿斸儬醿撫償醿戓儤醿� 醿儺醿犪儤醿氠儯醿犪儛醿� 醿┽儠醿斸儨醿斸儜醿�
+scroll_wrapped_label=醿儺醿犪儤醿氠儯醿犪儤 醿掅儛醿撫儛醿愥儞醿掅儤醿氠償醿戓儛
+
+spread_none.title=醿濁儬 醿掅儠醿斸儬醿撫儢醿� 醿掅儛醿ㄡ儦醿樶儭 醿掅儛醿犪償醿ㄡ償
+spread_none_label=醿儛醿氠儝醿曖償醿犪儞醿樶儛醿溼儤 醿┽儠醿斸儨醿斸儜醿�
+spread_odd.title=醿濁儬 醿掅儠醿斸儬醿撫儢醿� 醿掅儛醿ㄡ儦醿�, 醿欋償醿溼儮醿� 醿掅儠醿斸儬醿撫儤醿撫儛醿� 醿撫儛醿儳醿斸儜醿a儦醿�
+spread_odd_label=醿濁儬 醿掅儠醿斸儬醿撫儢醿� 醿欋償醿溼儮醿樶儞醿愥儨
+spread_even.title=醿濁儬 醿掅儠醿斸儬醿撫儢醿� 醿掅儛醿ㄡ儦醿�, 醿氠儯醿儤 醿掅儠醿斸儬醿撫儤醿撫儛醿� 醿撫儛醿儳醿斸儜醿a儦醿�
+spread_even_label=醿濁儬 醿掅儠醿斸儬醿撫儢醿� 醿氠儯醿儤醿撫儛醿�
+
+# Document properties dialog box
+document_properties.title=醿撫儩醿欋儯醿涐償醿溼儮醿樶儭 醿ㄡ償醿♂儛醿償醿戔��
+document_properties_label=醿撫儩醿欋儯醿涐償醿溼儮醿樶儭 醿ㄡ償醿♂儛醿償醿戔��
+document_properties_file_name=醿め儛醿樶儦醿樶儭 醿♂儛醿償醿氠儤:
+document_properties_file_size=醿め儛醿樶儦醿樶儭 醿涐儩醿儯醿氠儩醿戓儛:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} 醿欋儜 ({{size_b}} 醿戓儛醿樶儮醿�)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} 醿涐儜 ({{size_b}} 醿戓儛醿樶儮醿�)
+document_properties_title=醿♂儛醿椺儛醿a儬醿�:
+document_properties_author=醿ㄡ償醿涐儱醿涐儨醿斸儦醿�:
+document_properties_subject=醿椺償醿涐儛:
+document_properties_keywords=醿♂儛醿欋儠醿愥儨醿儩 醿♂儤醿⑨儳醿曖償醿戓儤:
+document_properties_creation_date=醿ㄡ償醿メ儧醿溼儤醿� 醿椺儛醿犪儤醿︶儤:
+document_properties_modification_date=醿┽儛醿♂儸醿濁儬醿斸儜醿樶儭 醿椺儛醿犪儤醿︶儤:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=醿掅儛醿涐儩醿涐儴醿曖償醿戓儤:
+document_properties_producer=PDF 醿掅儛醿涐儩醿涐儴醿曖償醿戓儤:
+document_properties_version=PDF 醿曖償醿犪儭醿樶儛:
+document_properties_page_count=醿掅儠醿斸儬醿撫償醿戓儤醿� 醿犪儛醿濁儞醿斸儨醿濁儜醿�:
+document_properties_page_size=醿掅儠醿斸儬醿撫儤醿� 醿栣儩醿涐儛:
+document_properties_page_size_unit_inches=醿撫儯醿樶儧醿�
+document_properties_page_size_unit_millimeters=醿涐儧
+document_properties_page_size_orientation_portrait=醿ㄡ儠醿斸儯醿氠儛醿�
+document_properties_page_size_orientation_landscape=醿椺儛醿犪儛醿栣儯醿氠儛醿�
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Letter
+document_properties_page_size_name_legal=Legal
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=Fast Web View:
+document_properties_linearized_yes=醿撫儤醿愥儺
+document_properties_linearized_no=醿愥儬醿�
+document_properties_close=醿撫儛醿儯醿犪儠醿�
+
+print_progress_message=醿撫儩醿欋儯醿涐償醿溼儮醿� 醿涐儢醿愥儞醿撫償醿戓儛 醿愥儧醿濁儭醿愥儜醿斸儹醿撫儛醿撯��
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=醿掅儛醿a儱醿涐償醿戓儛
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=醿掅儠醿斸儬醿撫儤醿椺儛 醿栣儩醿氠儤醿� 醿掅儛醿涐儩醿┽償醿溼儛/醿撫儛醿涐儛醿氠儠醿�
+toggle_sidebar_notification.title=醿掅儠醿斸儬醿撫儤醿椺儛 醿栣儩醿氠儤醿� 醿┽儛醿犪儣醿曖儛/醿掅儛醿涐儩醿犪儣醿曖儛 (醿撫儩醿欋儯醿涐償醿溼儮醿� 醿ㄡ償醿樶儶醿愥儠醿� 醿♂儛醿犪儵醿斸儠醿�/醿撫儛醿溼儛醿犪儣醿�)
+toggle_sidebar_label=醿掅儠醿斸儬醿撫儤醿椺儛 醿栣儩醿氠儤醿� 醿掅儛醿涐儩醿┽償醿溼儛/醿撫儛醿涐儛醿氠儠醿�
+document_outline.title=醿撫儩醿欋儯醿涐償醿溼儮醿樶儭 醿♂儛醿犪儵醿斸儠醿樶儭 醿┽儠醿斸儨醿斸儜醿� (醿濁儬醿償醿� 醿撫儛醿儥醿愥優醿斸儜醿樶儣 醿п儠醿斸儦醿� 醿斸儦醿斸儧醿斸儨醿⑨儤醿� 醿┽儛醿涐儩醿ㄡ儦醿�/醿愥儥醿斸儶醿曖儛)
+document_outline_label=醿撫儩醿欋儯醿涐償醿溼儮醿樶儭 醿♂儛醿犪儵醿斸儠醿�
+attachments.title=醿撫儛醿溼儛醿犪儣醿斸儜醿樶儭 醿┽儠醿斸儨醿斸儜醿�
+attachments_label=醿撫儛醿溼儛醿犪儣醿斸儜醿�
+thumbs.title=醿ㄡ償醿椺儠醿愥儦醿樶償醿犪償醿戓儛
+thumbs_label=醿斸儭醿欋儤醿栣償醿戓儤
+findbar.title=醿炨儩醿曖儨醿� 醿撫儩醿欋儯醿涐償醿溼儮醿ㄡ儤
+findbar_label=醿儤醿斸儜醿�
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=醿掅儠醿斸儬醿撫儤 {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=醿掅儠醿斸儬醿撫儤醿� 醿斸儭醿欋儤醿栣儤 {{page}}
+
+# Find panel button title and messages
+find_input.title=醿儤醿斸儜醿�
+find_input.placeholder=醿炨儩醿曖儨醿� 醿撫儩醿欋儯醿涐償醿溼儮醿ㄡ儤鈥�
+find_previous.title=醿め儬醿愥儢醿樶儭 醿儤醿溼儛 醿欋儩醿溼儮醿斸儱醿♂儮醿樶儭 醿炨儩醿曖儨醿�
+find_previous_label=醿儤醿溼儛
+find_next.title=醿め儬醿愥儢醿樶儭 醿ㄡ償醿涐儞醿斸儝醿� 醿欋儩醿溼儮醿斸儱醿♂儮醿樶儭 醿炨儩醿曖儨醿�
+find_next_label=醿ㄡ償醿涐儞醿斸儝醿�
+find_highlight=醿п儠醿斸儦醿愥儭 醿涐儩醿溼儤醿ㄡ儠醿溼儛
+find_match_case_label=醿涐儣醿愥儠醿犪儯醿氠儤醿� 醿掅儛醿椺儠醿愥儦醿樶儭醿儤醿溼償醿戓儛
+find_entire_word_label=醿涐儣醿氠儤醿愥儨醿� 醿♂儤醿⑨儳醿曖償醿戓儤
+find_reached_top=醿涐儤醿︶儸醿斸儯醿氠儤醿� 醿撫儩醿欋儯醿涐償醿溼儮醿樶儭 醿撫儛醿♂儛醿儳醿樶儭醿�, 醿掅儬醿償醿氠儞醿斸儜醿� 醿戓儩醿氠儩醿撫儛醿�
+find_reached_bottom=醿涐儤醿︶儸醿斸儯醿氠儤醿� 醿撫儩醿欋儯醿涐償醿溼儮醿樶儭 醿戓儩醿氠儩, 醿掅儬醿償醿氠儞醿斸儜醿� 醿撫儛醿♂儛醿儳醿樶儭醿樶儞醿愥儨
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]={{current}} / {{total}} 醿椺儛醿溼儺醿曖償醿撫儬醿樶儞醿愥儨
+find_match_count[two]={{current}} / {{total}} 醿椺儛醿溼儺醿曖償醿撫儬醿樶儞醿愥儨
+find_match_count[few]={{current}} / {{total}} 醿椺儛醿溼儺醿曖償醿撫儬醿樶儞醿愥儨
+find_match_count[many]={{current}} / {{total}} 醿椺儛醿溼儺醿曖償醿撫儬醿樶儞醿愥儨
+find_match_count[other]={{current}} / {{total}} 醿椺儛醿溼儺醿曖償醿撫儬醿樶儞醿愥儨
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]={{limit}}-醿栣償 醿涐償醿⑨儤 醿椺儛醿溼儺醿曖償醿撫儬醿�
+find_match_count_limit[one]={{limit}}-醿栣償 醿涐償醿⑨儤 醿椺儛醿溼儺醿曖償醿撫儬醿�
+find_match_count_limit[two]={{limit}}-醿栣償 醿涐償醿⑨儤 醿椺儛醿溼儺醿曖償醿撫儬醿�
+find_match_count_limit[few]={{limit}}-醿栣償 醿涐償醿⑨儤 醿椺儛醿溼儺醿曖償醿撫儬醿�
+find_match_count_limit[many]={{limit}}-醿栣償 醿涐償醿⑨儤 醿椺儛醿溼儺醿曖償醿撫儬醿�
+find_match_count_limit[other]={{limit}}-醿栣償 醿涐償醿⑨儤 醿椺儛醿溼儺醿曖償醿撫儬醿�
+find_not_found=醿め儬醿愥儢醿� 醿曖償醿� 醿涐儩醿樶儷醿斸儜醿溼儛
+
+# Error panel labels
+error_more_info=醿曖儬醿儦醿愥儞
+error_less_info=醿ㄡ償醿涐儩醿欋儦醿斸儜醿a儦醿愥儞
+error_close=醿撫儛醿儯醿犪儠醿�
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=醿ㄡ償醿⑨儳醿濁儜醿樶儨醿斸儜醿�: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=醿♂儮醿斸儥醿�: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=醿め儛醿樶儦醿�: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=醿儛醿栣儤: {{line}}
+rendering_error=醿ㄡ償醿儞醿濁儧醿�, 醿掅儠醿斸儬醿撫儤醿� 醿┽儠醿斸儨醿斸儜醿樶儭醿愥儭.
+
+# Predefined zoom values
+page_scale_width=醿掅儠醿斸儬醿撫儤醿� 醿♂儤醿掅儛醿溼償醿栣償
+page_scale_fit=醿涐儣醿氠儤醿愥儨醿� 醿掅儠醿斸儬醿撫儤
+page_scale_auto=醿愥儠醿⑨儩醿涐儛醿⑨儯醿犪儤
+page_scale_actual=醿♂儛醿儳醿樶儭醿� 醿栣儩醿涐儛
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=醿ㄡ償醿儞醿濁儧醿�
+loading_error=醿ㄡ償醿儞醿濁儧醿�, PDF 醿め儛醿樶儦醿樶儭 醿┽儛醿⑨儠醿樶儬醿椺儠醿樶儭醿愥儭.
+invalid_file_error=醿愥儬醿愥儧醿愥儬醿椺償醿戓儯醿氠儤 醿愥儨 醿撫儛醿栣儤醿愥儨醿斸儜醿a儦醿� PDF 醿め儛醿樶儦醿�.
+missing_file_error=醿溼儛醿欋儦醿a儦醿� PDF 醿め儛醿樶儦醿�.
+unexpected_response_error=醿♂償醿犪儠醿斸儬醿樶儭 醿涐儩醿a儦醿濁儞醿溼償醿氠儤 醿炨儛醿♂儯醿儤.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} 醿ㄡ償醿溼儤醿ㄡ儠醿溼儛]
+password_label=醿ㄡ償醿樶儳醿曖儛醿溼償醿� 醿炨儛醿犪儩醿氠儤 PDF 醿め儛醿樶儦醿樶儭 醿掅儛醿♂儛醿儭醿溼償醿氠儛醿�.
+password_invalid=醿愥儬醿愥儭醿儩醿犪儤 醿炨儛醿犪儩醿氠儤. 醿掅儣醿儩醿曖儣, 醿♂儶醿愥儞醿濁儣 醿償醿氠儛醿儦醿�.
+password_ok=醿欋儛醿犪儝醿�
+password_cancel=醿掅儛醿a儱醿涐償醿戓儛
+
+printing_not_supported=醿掅儛醿め儬醿椺儺醿樶儦醿斸儜醿�: 醿愥儧醿濁儜醿斸儹醿撫儠醿� 醿愥儧 醿戓儬醿愥儯醿栣償醿犪儴醿� 醿愥儬醿愥儛 醿♂儬醿a儦醿愥儞 醿涐儺醿愥儬醿撫儛醿償醿犪儤醿氠儤.
+printing_not_ready=醿掅儛醿め儬醿椺儺醿樶儦醿斸儜醿�: PDF 醿♂儬醿a儦醿愥儞 醿┽儛醿⑨儠醿樶儬醿椺儯醿氠儤 醿愥儬醿愥儛, 醿愥儧醿濁儜醿斸儹醿撫儠醿樶儭 醿撫儛醿♂儛醿儳醿斸儜醿愥儞.
+web_fonts_disabled=醿曖償醿戓儴醿犪儤醿め儮醿斸儜醿� 醿掅儛醿涐儩醿犪儣醿a儦醿樶儛: 醿┽儛醿ㄡ償醿溼償醿戓儯醿氠儤 PDF 醿ㄡ儬醿樶儰醿⑨償醿戓儤醿� 醿掅儛醿涐儩醿п償醿溼償醿戓儛 醿曖償醿� 醿償醿犪儺醿撫償醿戓儛.
+document_colors_not_allowed=PDF 醿撫儩醿欋儯醿涐償醿溼儮醿斸儜醿� 醿愥儬 醿愥儱醿曖儭 醿♂儛醿欋儯醿椺儛醿犪儤 醿め償醿犪償醿戓儤醿� 醿掅儛醿涐儩醿п償醿溼償醿戓儤醿� 醿溼償醿戓儛醿犪儣醿曖儛: 醿戓儬醿愥儯醿栣償醿犪儴醿� 醿掅儛醿涐儩醿犪儣醿a儦醿樶儛 鈥溼儝醿曖償醿犪儞醿斸儜醿樶儭醿椺儠醿樶儭 醿♂儛醿欋儯醿椺儛醿犪儤 醿め償醿犪償醿戓儤醿� 醿掅儛醿涐儩醿п償醿溼償醿戓儤醿� 醿a儰醿氠償醿戓儛鈥�.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/kab/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/kab/viewer.properties
new file mode 100644
index 0000000..52ac0a5
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/kab/viewer.properties
@@ -0,0 +1,242 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Asebter azewwar
+previous_label=Azewwar
+next.title=Asebter d-iteddun
+next_label=Ddu 桑er zdat
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=Asebter
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=桑ef {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} n {{pagesCount}})
+
+zoom_out.title=Sem岷搃
+zoom_out_label=Sem岷搃
+zoom_in.title=Sem桑e峁�
+zoom_in_label=Sem桑e峁�
+zoom.title=Sem桑e峁�/Sem岷搃
+presentation_mode.title=U桑al 桑er Uskar Tihawt
+presentation_mode_label=Askar Tihawt
+open_file.title=Ldi Afaylu
+open_file_label=Ldi
+print.title=Siggez
+print_label=Siggez
+download.title=Sider
+download_label=Azdam
+bookmark.title=Time岷搑i tamirant (n桑el ne桑 ldi 桑ef usfaylu amaynut)
+bookmark_label=Askan amiran
+
+# Secondary toolbar and context menu
+tools.title=Ifecka
+tools_label=Ifecka
+first_page.title=Ddu 桑er usebter amezwaru
+first_page.label=Ddu 桑er usebter amezwaru
+first_page_label=Ddu 桑er usebter amezwaru
+last_page.title=Ddu 桑er usebter aneggaru
+last_page.label=Ddu 桑er usebter aneggaru
+last_page_label=Ddu 桑er usebter aneggaru
+page_rotate_cw.title=Tuzzya tusrigt
+page_rotate_cw.label=Tuzzya tusrigt
+page_rotate_cw_label=Tuzzya tusrigt
+page_rotate_ccw.title=Tuzzya amgal-usrig
+page_rotate_ccw.label=Tuzzya amgal-usrig
+page_rotate_ccw_label=Tuzzya amgal-usrig
+
+cursor_text_select_tool.title=Rmed afecku n tefrant n u岣峳is
+cursor_text_select_tool_label=Afecku n tefrant n u岣峳is
+cursor_hand_tool.title=Rmed afecku afus
+cursor_hand_tool_label=Afecku afus
+
+scroll_vertical.title=Seqdec adrurem ubdid
+scroll_vertical_label=Adrurem ubdid
+scroll_horizontal.title=Seqdec adrurem aglawan
+scroll_horizontal_label=Adrurem aglawan
+scroll_wrapped.title=Seqdec adrurem yu岷揺n
+scroll_wrapped_label=Adrurem yu岷揺n
+
+spread_none.title=Ur sedday ara isi桑zaf n usebter
+spread_none_label=Ulac isi桑zaf
+spread_odd.title=Seddu isi桑zaf n usebter ibeddun s yisebtar irayuganen
+spread_odd_label=Isi桑zaf irayuganen
+spread_even.title=Seddu isi桑zaf n usebter ibeddun s yisebtar iyuganen
+spread_even_label=Isi桑zaf iyuganen
+
+# Document properties dialog box
+document_properties.title=Ta桑a峁沘 n isemli鈥�
+document_properties_label=Ta桑a峁沘 n isemli鈥�
+document_properties_file_name=Isem n ufaylu:
+document_properties_file_size=Te桑zi n ufaylu:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KA峁� ({{size_b}} ibiten)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MA峁� ({{size_b}} i峁璦m岣峚nen)
+document_properties_title=Azwel:
+document_properties_author=Ameskar:
+document_properties_subject=Amgay:
+document_properties_keywords=Awalen n tsaru牛
+document_properties_creation_date=Azemz n tmerna:
+document_properties_modification_date=Azemz n usnifel:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Yerna-t:
+document_properties_producer=Afecku n uselket PDF:
+document_properties_version=Lqem PDF:
+document_properties_page_count=Am岣峚n n isebtar:
+document_properties_page_size=Tu纬zi n usebter:
+document_properties_page_size_unit_inches=deg
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=s te桑zi
+document_properties_page_size_orientation_landscape=s tehri
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Asekkil
+document_properties_page_size_name_legal=Us岣峣f
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=Taskant Web taruradt:
+document_properties_linearized_yes=Ih
+document_properties_linearized_no=Ala
+document_properties_close=Mdel
+
+print_progress_message=Aheggi i usiggez n isemli鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=Sefsex
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Sken/Fer agalis adisan
+toggle_sidebar_notification.title=Ffer/Sken agalis adisan (isemli yegber a桑awas/imeddayen)
+toggle_sidebar_label=Sken/Fer agalis adisan
+document_outline.title=Sken isemli (Senned snat tikal i wesem桑er/Afne岷� n iferdisen me峁涐箾a)
+document_outline_label=Is桑alen n isebtar
+attachments.title=Sken ticeqqufin yeddan
+attachments_label=Ticeqqufin yeddan
+thumbs.title=Sken tanfult.
+thumbs_label=Tinfulin
+findbar.title=Nadi deg isemli
+findbar_label=Nadi
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Asebter {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Tanfult n usebter {{page}}
+
+# Find panel button title and messages
+find_input.title=Nadi
+find_input.placeholder=Nadi deg isemli鈥�
+find_previous.title=Aff-d tamse岣峳iwt n twinest n deffir
+find_previous_label=Azewwar
+find_next.title=Aff-d timse岣峳iwt n twinest d-iteddun
+find_next_label=Ddu 桑er zdat
+find_highlight=Err izirig ima峁涐箾a
+find_match_case_label=Qade峁� amasal n isekkilen
+find_entire_word_label=Awalen i膷膷uranen
+find_reached_top=Yabbe岣� s afella n usebter, tu桑alin s wadda
+find_reached_bottom=Teb岣峞岣� s adda n usebter, tu桑alin s afella
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]={{current}} seg {{total}} n tme桑峁泆岣峣n
+find_match_count[two]={{current}} seg {{total}} n tme桑峁泆岣峣n
+find_match_count[few]={{current}} seg {{total}} n tme桑峁泆岣峣n
+find_match_count[many]={{current}} seg {{total}} n tme桑峁泆岣峣n
+find_match_count[other]={{current}} seg {{total}} n tme桑峁泆岣峣n
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]=Ugar n {{limit}} n tme桑峁泆岣峣n
+find_match_count_limit[one]=Ugar n {{limit}} n tme桑峁泆岣峣n
+find_match_count_limit[two]=Ugar n {{limit}} n tme桑峁泆岣峣n
+find_match_count_limit[few]=Ugar n {{limit}} n tme桑峁泆岣峣n
+find_match_count_limit[many]=Ugar n {{limit}} n tme桑峁泆岣峣n
+find_match_count_limit[other]=Ugar n {{limit}} n tme桑峁泆岣峣n
+find_not_found=Ulac tawinest
+
+# Error panel labels
+error_more_info=Ugar n tel桑ut
+error_less_info=Drus n isalen
+error_close=Mdel
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Izen: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Tanebdant: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Afaylu: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Izirig: {{line}}
+rendering_error=Te岣峳a-d tucc岣峚 deg uskan n usebter.
+
+# Predefined zoom values
+page_scale_width=Tehri n usebter
+page_scale_fit=Asebter ima峁涐箾a
+page_scale_auto=Asem桑e峁�/Asem岷搃 awurman
+page_scale_actual=Te桑zi tilawt
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Error
+loading_error=Te岣峳a-d tucc岣峚 deg alluy n PDF:
+invalid_file_error=Afaylu PDF arame桑tu ne桑 yex峁峁�.
+missing_file_error=Ulac afaylu PDF.
+unexpected_response_error=Aqeddac yerra-d yir tiririt ur nettwa峁浨 ara.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[Tabzimt {{type}}]
+password_label=Sekcem awal uffir akken ad ldi岣� afaylu-yagi PDF
+password_invalid=Awal uffir ma膷膷i d ame桑tu, 茞re岣� tikelt-nni岣峞n.
+password_ok=IH
+password_cancel=Sefsex
+
+printing_not_supported=茢u峁�-k: Asiggez ur ittusefrak ara yakan ima峁涐箾a deg iminig-a.
+printing_not_ready=茢u峁�-k: Afaylu PDF ur d-yuli ara ime峁涐箾a akken ad ittusiggez.
+web_fonts_disabled=Tisefsiyin web ttwassensent; D awez桑i useqdec n tsefsiyin yettwarnan 桑er PDF.
+document_colors_not_allowed=Isemliyen PDF ur zmiren ara ad sqedcen initen-nsen: 'Sireg isebtar akken ad fernen initen-nsen' ur yermid ara deg iminig.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/kk/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/kk/viewer.properties
new file mode 100644
index 0000000..3f1e51a
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/kk/viewer.properties
@@ -0,0 +1,242 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=袗谢写褘遥覔褘 锌邪褉邪覜
+previous_label=袗谢写褘遥覔褘褋褘
+next.title=袣械谢械褋褨 锌邪褉邪覜
+next_label=袣械谢械褋褨
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=袩邪褉邪覜
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages={{pagesCount}} 褨褕褨薪械薪
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=(锌邪褉邪覜 {{pageNumber}}, {{pagesCount}} 褨褕褨薪械薪)
+
+zoom_out.title=袣褨褕褨褉械泄褌褍
+zoom_out_label=袣褨褕褨褉械泄褌褍
+zoom_in.title=耶谢泻械泄褌褍
+zoom_in_label=耶谢泻械泄褌褍
+zoom.title=袦邪褋褕褌邪斜
+presentation_mode.title=袩褉械蟹械薪褌邪褑懈褟 褉械卸懈屑褨薪械 邪褍褘褋褍
+presentation_mode_label=袩褉械蟹械薪褌邪褑懈褟 褉械卸懈屑褨
+open_file.title=肖邪泄谢写褘 邪褕褍
+open_file_label=袗褕褍
+print.title=袘邪褋锌邪覔邪 褕褘覔邪褉褍
+print_label=袘邪褋锌邪覔邪 褕褘覔邪褉褍
+download.title=袞爷泻褌械锌 邪谢褍
+download_label=袞爷泻褌械锌 邪谢褍
+bookmark.title=袗覔褘屑写邪覔褘 泻萤褉褨薪褨褋 (泻萤褕褨褉褍 薪械 卸邪遥邪 褌械褉械蟹械写械 邪褕褍)
+bookmark_label=袗覔褘屑写邪覔褘 泻萤褉褨薪褨褋
+
+# Secondary toolbar and context menu
+tools.title=覛冶褉邪谢写邪褉
+tools_label=覛冶褉邪谢写邪褉
+first_page.title=袗谢覔邪褕覜褘 锌邪褉邪覜覜邪 萤褌褍
+first_page.label=袗谢覔邪褕覜褘 锌邪褉邪覜覜邪 萤褌褍
+first_page_label=袗谢覔邪褕覜褘 锌邪褉邪覜覜邪 萤褌褍
+last_page.title=小芯遥覔褘 锌邪褉邪覜覜邪 萤褌褍
+last_page.label=小芯遥覔褘 锌邪褉邪覜覜邪 萤褌褍
+last_page_label=小芯遥覔褘 锌邪褉邪覜覜邪 萤褌褍
+page_rotate_cw.title=小邪覔邪褌 褌褨谢褨 斜邪覔褘褌褘屑械薪 邪泄薪邪谢写褘褉褍
+page_rotate_cw.label=小邪覔邪褌 褌褨谢褨 斜邪覔褘褌褘屑械薪 斜冶褉褍
+page_rotate_cw_label=小邪覔邪褌 褌褨谢褨 斜邪覔褘褌褘屑械薪 斜冶褉褍
+page_rotate_ccw.title=小邪覔邪褌 褌褨谢褨 斜邪覔褘褌褘薪邪 覜邪褉褋褘 斜冶褉褍
+page_rotate_ccw.label=小邪覔邪褌 褌褨谢褨 斜邪覔褘褌褘薪邪 覜邪褉褋褘 斜冶褉褍
+page_rotate_ccw_label=小邪覔邪褌 褌褨谢褨 斜邪覔褘褌褘薪邪 覜邪褉褋褘 斜冶褉褍
+
+cursor_text_select_tool.title=袦訖褌褨薪写褨 褌邪遥写邪褍 覜冶褉邪谢褘薪 褨褋泻械 覜芯褋褍
+cursor_text_select_tool_label=袦訖褌褨薪写褨 褌邪遥写邪褍 覜冶褉邪谢褘
+cursor_hand_tool.title=覛芯谢 覜冶褉邪谢褘薪 褨褋泻械 覜芯褋褍
+cursor_hand_tool_label=覛芯谢 覜冶褉邪谢褘
+
+scroll_vertical.title=袙械褉褌懈泻邪谢写褘 邪泄薪邪谢写褘褉褍写褘 覜芯谢写邪薪褍
+scroll_vertical_label=袙械褉褌懈泻邪谢写褘 邪泄薪邪谢写褘褉褍
+scroll_horizontal.title=袚芯褉懈蟹芯薪褌邪谢写褘 邪泄薪邪谢写褘褉褍写褘 覜芯谢写邪薪褍
+scroll_horizontal_label=袚芯褉懈蟹芯薪褌邪谢写褘 邪泄薪邪谢写褘褉褍
+scroll_wrapped.title=袦邪褋褕褌邪斜褌邪谢邪褌褘薪 邪泄薪邪谢写褘褉褍写褘 覜芯谢写邪薪褍
+scroll_wrapped_label=袦邪褋褕褌邪斜褌邪谢邪褌褘薪 邪泄薪邪谢写褘褉褍
+
+spread_none.title=袞邪蟹褘覜 斜械褌褌械褉 褉械卸懈屑褨薪 覜芯谢写邪薪斜邪褍
+spread_none_label=袞邪蟹褘覜 斜械褌褌械褉 褉械卸懈屑褋褨蟹
+spread_odd.title=袞邪蟹褘覜 斜械褌褌械褉 褌邪覜 薪萤屑褨褉谢褨 斜械褌褌械褉写械薪 斜邪褋褌邪谢邪写褘
+spread_odd_label=孝邪覜 薪萤屑褨褉谢褨 斜械褌褌械褉 褋芯谢 卸邪覜褌邪薪
+spread_even.title=袞邪蟹褘覜 斜械褌褌械褉 卸冶锌 薪萤屑褨褉谢褨 斜械褌褌械褉写械薪 斜邪褋褌邪谢邪写褘
+spread_even_label=袞冶锌 薪萤屑褨褉谢褨 斜械褌褌械褉 褋芯谢 卸邪覜褌邪薪
+
+# Document properties dialog box
+document_properties.title=覛冶卸邪褌 覜邪褋懈械褌褌械褉褨鈥�
+document_properties_label=覛冶卸邪褌 覜邪褋懈械褌褌械褉褨鈥�
+document_properties_file_name=肖邪泄谢 邪褌褘:
+document_properties_file_size=肖邪泄谢 萤谢褕械屑褨:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} 袣袘 ({{size_b}} 斜邪泄褌)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} 袦袘 ({{size_b}} 斜邪泄褌)
+document_properties_title=孝邪覜褘褉褘斜褘:
+document_properties_author=袗胁褌芯褉褘:
+document_properties_subject=孝邪覜褘褉褘斜褘:
+document_properties_keywords=袣褨谢褌 褋萤蟹写械褉:
+document_properties_creation_date=袞邪褋邪谢覔邪薪 泻爷薪褨:
+document_properties_modification_date=孝爷蟹械褌褍 泻爷薪褨:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=袞邪褋邪覔邪薪:
+document_properties_producer=PDF 萤薪写褨褉谐械薪:
+document_properties_version=PDF 薪冶褋覜邪褋褘:
+document_properties_page_count=袘械褌褌械褉 褋邪薪褘:
+document_properties_page_size=袘械褌 萤谢褕械屑褨:
+document_properties_page_size_unit_inches=写褞泄屑
+document_properties_page_size_unit_millimeters=屑屑
+document_properties_page_size_orientation_portrait=褌褨泻
+document_properties_page_size_orientation_landscape=卸邪褌褘覜
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Letter
+document_properties_page_size_name_legal=Legal
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=袞褘谢写邪屑 Web 泻萤褉褨薪褨褋褨:
+document_properties_linearized_yes=袠訖
+document_properties_linearized_no=袞芯覜
+document_properties_close=袞邪斜褍
+
+print_progress_message=覛冶卸邪褌褌褘 斜邪褋锌邪覔邪 褕褘覔邪褉褍 爷褕褨薪 写邪泄褘薪写邪褍鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=袘邪褋 褌邪褉褌褍
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=袘爷泄褨褉 锌邪薪械谢褨薪 泻萤褉褋械褌褍/卸邪褋褘褉褍
+toggle_sidebar_notification.title=袘爷泄褨褉 锌邪薪械谢褨薪 泻萤褉褋械褌褍/卸邪褋褘褉褍 (覜冶卸邪褌褌邪 覜冶褉褘谢褘屑褘/褋邪谢褘薪褘屑写邪褉 斜邪褉)
+toggle_sidebar_label=袘爷泄褨褉 锌邪薪械谢褨薪 泻萤褉褋械褌褍/卸邪褋褘褉褍
+document_outline.title=覛冶卸邪褌 覜冶褉褘谢褘屑褘薪 泻萤褉褋械褌褍 (斜邪褉谢褘覜 薪訖褉褋械谢械褉写褨 卸邪蟹褘覜 覜褘谢褍/卸懈薪邪褍 爷褕褨薪 覜芯褋 褕械褉褌褍 泻械褉械泻)
+document_outline_label=覛冶卸邪褌 覜冶褉邪屑邪褋褘
+attachments.title=小邪谢褘薪褘屑写邪褉写褘 泻萤褉褋械褌褍
+attachments_label=小邪谢褘薪褘屑写邪褉
+thumbs.title=袣褨褕褨 泻萤褉褨薪褨褋褌械褉写褨 泻萤褉褋械褌褍
+thumbs_label=袣褨褕褨 泻萤褉褨薪褨褋褌械褉
+findbar.title=覛冶卸邪褌褌邪薪 褌邪斜褍
+findbar_label=孝邪斜褍
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title={{page}} 锌邪褉邪覔褘
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas={{page}} 锌邪褉邪覔褘 爷褕褨薪 泻褨褕褨 泻萤褉褨薪褨褋褨
+
+# Find panel button title and messages
+find_input.title=孝邪斜褍
+find_input.placeholder=覛冶卸邪褌褌邪薪 褌邪斜褍鈥�
+find_previous.title=袨褋褘 褋萤蟹写械褉写褨遥 屑訖褌褨薪薪械薪 邪谢写褘遥覔褘 泻械蟹写械褋褍褨薪 褌邪斜褍
+find_previous_label=袗谢写褘遥覔褘褋褘
+find_next.title=袨褋褘 褋萤蟹写械褉写褨遥 屑訖褌褨薪薪械薪 泻械谢械褋褨 泻械蟹写械褋褍褨薪 褌邪斜褍
+find_next_label=袣械谢械褋褨
+find_highlight=袘邪褉谢褘覔褘薪 褌爷褋锌械薪 械褉械泻褕械谢械褍
+find_match_case_label=袪械谐懈褋褌褉写褨 械褋泻械褉褍
+find_entire_word_label=小萤蟹写械褉 褌芯谢褘覔褘屑械薪
+find_reached_top=覛冶卸邪褌褌褘遥 斜邪褋褘薪邪 卸械褌褌褨泻, 褋芯遥褘薪邪薪 斜邪褋褌邪锌 卸邪谢覔邪褋褌褘褉邪屑褘蟹
+find_reached_bottom=覛冶卸邪褌褌褘遥 褋芯遥褘薪邪 卸械褌褌褨泻, 斜邪褋褘薪邪薪 斜邪褋褌邪锌 卸邪谢覔邪褋褌褘褉邪屑褘蟹
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]={{current}} / {{total}} 褋訖泄泻械褋褌褨泻
+find_match_count[two]={{current}} / {{total}} 褋訖泄泻械褋褌褨泻
+find_match_count[few]={{current}} / {{total}} 褋訖泄泻械褋褌褨泻
+find_match_count[many]={{current}} / {{total}} 褋訖泄泻械褋褌褨泻
+find_match_count[other]={{current}} / {{total}} 褋訖泄泻械褋褌褨泻
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]={{limit}} 褋訖泄泻械褋褌褨泻褌械薪 泻萤锌
+find_match_count_limit[one]={{limit}} 褋訖泄泻械褋褌褨泻褌械薪 泻萤锌
+find_match_count_limit[two]={{limit}} 褋訖泄泻械褋褌褨泻褌械薪 泻萤锌
+find_match_count_limit[few]={{limit}} 褋訖泄泻械褋褌褨泻褌械薪 泻萤锌
+find_match_count_limit[many]={{limit}} 褋訖泄泻械褋褌褨泻褌械薪 泻萤锌
+find_match_count_limit[other]={{limit}} 褋訖泄泻械褋褌褨泻褌械薪 泻萤锌
+find_not_found=小萤蟹(写械褉) 褌邪斜褘谢屑邪写褘
+
+# Error panel labels
+error_more_info=袣萤斜褨褉械泻 邪覜锌邪褉邪褌
+error_less_info=袗蟹褘褉邪覜 邪覜锌邪褉邪褌
+error_close=袞邪斜褍
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (卸懈薪邪覜: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=啸邪斜邪褉谢邪屑邪: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=小褌械泻: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=肖邪泄谢: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=袞芯谢: {{line}}
+rendering_error=袩邪褉邪覜褌褘 萤遥写械褍 泻械蟹褨薪写械 覜邪褌械 泻械褌褌褨.
+
+# Predefined zoom values
+page_scale_width=袩邪褉邪覜 械薪褨
+page_scale_fit=袩邪褉邪覜褌褘 褋褘泄写褘褉褍
+page_scale_auto=袗胁褌芯屑邪褋褕褌邪斜褌邪褍
+page_scale_actual=袧邪覜褌褘 萤谢褕械屑褨
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=覛邪褌械
+loading_error=PDF 卸爷泻褌械褍 泻械蟹褨薪写械 覜邪褌械 泻械褌褌褨.
+invalid_file_error=袟邪覜褘屑写邪谢覔邪薪 薪械屑械褋械 覜邪褌械 PDF 褎邪泄谢.
+missing_file_error=PDF 褎邪泄谢褘 卸芯覜.
+unexpected_response_error=小械褉胁械褉写褨遥 泻爷褌锌械谐械薪 卸邪褍邪斜褘.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} 邪遥写邪褌锌邪褋褘]
+password_label=袘冶谢 PDF 褎邪泄谢褘薪 邪褕褍 爷褕褨薪 锌邪褉芯谢褜写褨 械薪谐褨蟹褨遥褨蟹.
+password_invalid=袩邪褉芯谢褜 写冶褉褘褋 械屑械褋. 覛邪泄褌邪谢邪锌 泻萤褉褨遥褨蟹.
+password_ok=袨袣
+password_cancel=袘邪褋 褌邪褉褌褍
+
+printing_not_supported=袝褋泻械褉褌褍: 袘邪褋锌邪覔邪 褕褘覔邪褉褍写褘 斜冶谢 斜褉邪褍蟹械褉 褌芯谢褘覔褘屑械薪 覜芯谢写邪屑邪泄写褘.
+printing_not_ready=袝褋泻械褉褌褍: 袘邪褋锌邪覔邪 褕褘覔邪褉褍 爷褕褨薪, 斜冶谢 PDF 褌芯谢褘覔褘屑械薪 卸爷泻褌械谢褨锌 邪谢褘薪斜邪写褘.
+web_fonts_disabled=袙械斜 覜邪褉褨锌褌械褉褨 褋萤薪写褨褉褨谢谐械薪: 覜冶褉邪屑褘薪邪 械薪谐褨蟹褨谢谐械薪 PDF 覜邪褉褨锌褌械褉褨薪 覜芯谢写邪薪褍 屑爷屑泻褨薪 械屑械褋.
+document_colors_not_allowed=PDF 覜冶卸邪褌褌邪褉褘薪邪 萤蟹写褨泻 褌爷褋褌械褉写褨 覜芯谢写邪薪褍 褉冶覜褋邪褌 械褌褨谢屑械谐械薪: 斜冶谢 斜褉邪褍蟹械褉写械 '袙械斜-褋邪泄褌褌邪褉覔邪 萤蟹写械褉褨薪褨遥 褌爷褋褌械褉褨薪 覜芯谢写邪薪褍覔邪 褉冶覜褋邪褌 斜械褉褍' 屑爷屑泻褨薪写褨谐褨 褋萤薪写褨褉褍谢褨 褌冶褉.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/km/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/km/viewer.properties
new file mode 100644
index 0000000..e5403cc
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/km/viewer.properties
@@ -0,0 +1,184 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=釣戓焼釣栣煇釣氣�嬦灅釣会灀
+previous_label=釣樶灮釣�
+next.title=釣戓焼釣栣煇釣氣�嬦灁釣撫煉釣戓灦釣斸煁
+next_label=釣斸灀釤掅瀾釣夺灁釤�
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=釣戓焼釣栣煇釣�
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=釣撫焹 {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} 釣撫焹 {{pagesCount}})
+
+zoom_out.title=鈥嬦灁釣勧煉釣氠灲釣�
+zoom_out_label=鈥嬦灁釣勧煉釣氠灲釣�
+zoom_in.title=鈥嬦灃釣勧煉釣氠灨釣�
+zoom_in_label=鈥嬦灃釣勧煉釣氠灨釣�
+zoom.title=釣栣瀯釤掅灇釣羔瀫
+presentation_mode.title=釣斸煉釣娽灱釣氣�嬦瀾釤呪�嬦灇釣斸焵釣斺�嬦灁釣戔�嬦灁釣勧煉釣犪灦釣�
+presentation_mode_label=釣氠灁釤�釣斺�嬦灁釣戔�嬦灁釣勧煉釣犪灦釣�
+open_file.title=釣斸灳釣�鈥嬦灟釣�釣熱灦釣�
+open_file_label=釣斸灳釣�
+print.title=釣斸焺釤囜灃釣会灅釤掅灃
+print_label=釣斸焺釤囜灃釣会灅釤掅灃
+download.title=釣戓灦釣夆�嬦灆釣�
+download_label=釣戓灦釣夆�嬦灆釣�
+bookmark.title=釣戓灧釣娽煉釣嬦灄釣夺灃鈥嬦灁釣呩煉釣呩灮釣斸煉釣斸灀釤掅灀 (釣呩灅釤掅灈釣� 釣�嬦灁釣踞瀫鈥嬦灀釤呪�嬦瀫釤掅灀釣会瀯鈥嬦灁釣勧煉釣⑨灲釣呪�嬦瀽釤掅灅釣�)
+bookmark_label=釣戓灧釣娽煉釣嬦灄釣夺灃鈥嬦灁釣呩煉釣呩灮釣斸煉釣斸灀釤掅灀
+
+# Secondary toolbar and context menu
+tools.title=釣п灁釣�釣氠瀻釤�
+tools_label=釣п灁釣�釣氠瀻釤�
+first_page.title=釣戓焻釣�釣夺灀釤嬧�嬦瀾釤嗎灃釤愥灇鈥嬦瀶釤嗎灁釣坚瀯鈥�
+first_page.label=釣戓焻釣�釣夺灀釤嬧�嬦瀾釤嗎灃釤愥灇鈥嬦瀶釤嗎灁釣坚瀯鈥�
+first_page_label=釣戓焻釣�釣夺灀釤嬧�嬦瀾釤嗎灃釤愥灇鈥嬦瀶釤嗎灁釣坚瀯鈥�
+last_page.title=釣戓焻釣�釣夺灀釤嬧�嬦瀾釤嗎灃釤愥灇鈥嬦瀰釣会瀯釣�釤掅灇釤勧灆鈥�
+last_page.label=釣戓焻釣�釣夺灀釤嬧�嬦瀾釤嗎灃釤愥灇鈥嬦瀰釣会瀯釣�釤掅灇釤勧灆鈥�
+last_page_label=釣戓焻釣�釣夺灀釤嬧�嬦瀾釤嗎灃釤愥灇鈥嬦瀰釣会瀯釣�釤掅灇釤勧灆
+page_rotate_cw.title=釣斸瀯釤掅灉釣丰灈鈥嬦灍釤掅灇釣斺�嬦瀾釤掅灇釣撫灧釣呪�嬦灀釣夺灐釣丰瀫釣�
+page_rotate_cw.label=釣斸瀯釤掅灉釣丰灈鈥嬦灍釤掅灇釣斺�嬦瀾釤掅灇釣撫灧釣呪�嬦灀釣夺灐釣丰瀫釣�
+page_rotate_cw_label=釣斸瀯釤掅灉釣丰灈鈥嬦灍釤掅灇釣斺�嬦瀾釤掅灇釣撫灧釣呪�嬦灀釣夺灐釣丰瀫釣�
+page_rotate_ccw.title=釣斸瀯釤掅灉釣丰灈鈥嬦瀰釤掅灇釣夺灍鈥嬦瀾釤掅灇釣撫灧釣呪�嬦灀釣夺灐釣丰瀫釣垛�嬧��
+page_rotate_ccw.label=釣斸瀯釤掅灉釣丰灈鈥嬦瀰釤掅灇釣夺灍鈥嬦瀾釤掅灇釣撫灧釣呪�嬦灀釣夺灐釣丰瀫釣垛�嬧��
+page_rotate_ccw_label=釣斸瀯釤掅灉釣丰灈鈥嬦瀰釤掅灇釣夺灍鈥嬦瀾釤掅灇釣撫灧釣呪�嬦灀釣夺灐釣丰瀫釣垛�嬧��
+
+cursor_text_select_tool.title=釣斸灳釣�鈥嬦灖釣斸瀫釣氠瀻釤嶁�嬦瀲釤掅灇釣踞灍鈥嬦灑釣忈煉釣愥灁釣�
+cursor_text_select_tool_label=釣п灁釣�釣氠瀻釤嶁�嬦瀲釤掅灇釣踞灍鈥嬦灑釣忈煉釣愥灁釣�
+cursor_hand_tool.title=釣斸灳釣�鈥嬦灖釣斸瀫釣氠瀻釤嶁�嬦瀶釤�
+cursor_hand_tool_label=釣п灁釣�釣氠瀻釤嶁�嬦瀶釤�
+
+# Document properties dialog box
+document_properties.title=釣涐瀫釤掅瀬釣庘�嬦灍釣樶煉釣斸瀼釤掅瀼釣封�嬦灟釣�釣熱灦釣氣��
+document_properties_label=釣涐瀫釤掅瀬釣庘�嬦灍釣樶煉釣斸瀼釤掅瀼釣封�嬦灟釣�釣熱灦釣氣��
+document_properties_file_name=釣堘煉釣樶焺釤団�嬦灟釣�釣熱灦釣氠煐
+document_properties_file_size=釣戓焼釣犪焼鈥嬦灟釣�釣熱灦釣氠煐
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} 釣斸焹)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} 釣斸焹)
+document_properties_title=釣呩焼釣庒瀯釣囜灳釣勧煐
+document_properties_author=釣⑨煉釣撫瀫鈥嬦灀釣丰灃釣撫煉釣掅煐
+document_properties_subject=釣斸煉釣氠瀿釣夺灀釣斸瀾釤�
+document_properties_keywords=釣栣灦釣�釤掅灆鈥嬦瀭釣撫煉釣涐灩釤囜煐
+document_properties_creation_date=釣�釣夺灈釣斸灇釣丰瀰釤掅瀱釤佱瀾鈥嬦灁釣勧煉釣�釣踞瀼釤�
+document_properties_modification_date=釣�釣夺灈釣斸灇釣丰瀰釤掅瀱釤佱瀾鈥嬦瀫釤傖灁釤掅灇釤傖煐
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=釣⑨煉釣撫瀫鈥嬦灁釣勧煉釣�釣踞瀼釤�
+document_properties_producer=釣�釣樶煉釣樶灉釣丰瀿釣糕�嬦灁釣勧煉釣�釣踞瀼 PDF 釤�
+document_properties_version=釣�釤嗎瀻釤� PDF 釤�
+document_properties_page_count=釣呩焼釣撫灲釣撯�嬦瀾釤嗎灃釤愥灇釤�
+document_properties_close=釣斸灧釣�
+
+print_progress_message=釣�釤嗎灃釣会瀯鈥嬦灇釤�釣斸瀰釤嗏�嬦灟釣�釣熱灦釣氣�嬦灍釣樶煉釣氠灦釣斸煁鈥嬦灁釤勧焽釣栣灮釣樶煉釣栤��
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=釣斸焺釤囜灁釣勧煁
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=釣斸灧釣�/釣斸灳釣�鈥嬦瀭釤掅灇釣夺灁釤嬧�嬦灇釤嗎瀫釣丰灈
+toggle_sidebar_notification.title=釣斸灧釣�/釣斸灳釣�鈥嬦灇釣斸灦釣氣�嬦瀰釤嗎灎釤�釣� (釣瀫釣熱灦釣氣�嬦灅釣夺灀鈥嬦灅釣夺瀼釣丰瀫釣垛�嬦灀釤呪�嬦瀫釤掅灇釤�/attachments)
+toggle_sidebar_label=釣斸灧釣�/釣斸灳釣�鈥嬦瀭釤掅灇釣夺灁釤嬧�嬦灇釤嗎瀫釣丰灈
+document_outline.title=釣斸瀯釤掅灎釣夺瀴鈥嬦瀭釤掅灇釤勧瀯鈥嬦灟釣�釣熱灦釣� (釣呩灮釣呪�嬦瀾釤掅灉釤佲�嬦瀶釣勨�嬦瀶釣踞灅釤掅灁釣糕�嬦灃釣勧煉釣氠灨釣�/釣斸瀯釤掅灇釣结灅鈥嬦瀿釣夺瀼釣烩�嬦瀾釣夺焼釣勧灑釣熱煁)
+document_outline_label=釣傖煉釣氠焺釣勨�嬦灟釣�釣熱灦釣�
+attachments.title=釣斸瀯釤掅灎釣夺瀴鈥嬦灟釣�釣熱灦釣氣�嬦灄釤掅瀲釣夺灁釤�
+attachments_label=釣瀫釣熱灦釣氣�嬦灄釤掅瀲釣夺灁釤�
+thumbs.title=釣斸瀯釤掅灎釣夺瀴鈥嬦灇釣坚灁釣椺灦釣栤�嬦瀼釣坚瀰釤�
+thumbs_label=釣氠灲釣斸灄釣夺灃鈥嬦瀼釣坚瀰釤�
+findbar.title=釣氠瀫鈥嬦灀釤呪�嬦瀫釤掅灀釣会瀯鈥嬦灟釣�釣熱灦釣�
+findbar_label=釣氠瀫
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=釣戓焼釣栣煇釣� {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=釣氠灱釣斸灄釣夺灃鈥嬦瀼釣坚瀰鈥嬦灇釣斸灍釤嬧�嬦瀾釤嗎灃釤愥灇 {{page}}
+
+# Find panel button title and messages
+find_input.title=釣氠瀫
+find_input.placeholder=釣氠瀫鈥嬦灀釤呪�嬦瀫釤掅灀釣会瀯鈥嬦灟釣�釣熱灦釣�...
+find_previous.title=釣氠瀫鈥嬦灃釣夺瀫釤掅灆 釣�嬦瀮釤掅灈釣垛�嬦瀶釤傖灈鈥嬦灁釣夺灀鈥嬦瀲釣结灁鈥嬦灅釣会灀
+find_previous_label=釣樶灮釣�
+find_next.title=釣氠瀫鈥嬦灃釣夺瀫釤掅灆 釣�嬦瀮釤掅灈釣垛�嬦瀶釤傖灈鈥嬦灁釣夺灀鈥嬦瀲釣结灁鈥嬦灁釣撫煉釣戓灦釣斸煁
+find_next_label=釣斸灀釤掅瀾釣夺灁釤�
+find_highlight=釣斸灀釤掅灈釣丰瀰鈥嬦瀾釣夺焼釣勧灑釣熱煁
+find_match_case_label=釣�釣氠瀻釣糕�嬦瀶釤嗎瀻釣坚瀰
+find_reached_top=釣斸灦釣撯�嬦灁釣撫煉釣忊�嬦灃釣糕�嬦瀬釣夺瀯鈥嬦瀫釤掅灇釤勧灅 釣戓焻鈥嬦瀶釣涐煁鈥嬦瀬釣夺瀯鈥嬧�嬦灈釣锯�嬦灀釤冣�嬦灟釣�釣熱灦釣�
+find_reached_bottom=釣斸灦釣撯�嬦灁釣撫煉釣忊�嬦灃釣糕�嬦瀬釣夺瀯釣涐灳 釣戓焻釣娽灈釤嬧�嬦瀰釣会瀯鈥嬧�嬦灀釤冣�嬦灟釣�釣熱灦釣�
+find_not_found=釣氠瀫鈥嬦灅釣丰灀鈥嬦瀮釣踞瀴鈥嬦灃釣夺瀫釤掅灆 釣�嬦瀮釤掅灈釣�
+
+# Error panel labels
+error_more_info=釣栣煇釣忈煂釣樶灦釣撯�嬦灁釣撫煉釣愥焸釣�
+error_less_info=釣栣煇釣忈煂釣樶灦釣撯�嬦瀼釣丰瀰釣忈灲釣�
+error_close=釣斸灧釣�
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=釣熱灦釣毬犪煐 {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=釣囜瀯釤嬄犪煐 {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=釣瀫釣熱灦釣毬犪煐 {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=釣囜灲釣毬犪煐 {{line}}
+rendering_error=釣樶灦釣撯�嬦瀫釤嗎灎釣会灍鈥嬦灁釣夺灀鈥嬦瀫釣踞瀼釣♂灳釣勨�嬦灃釤佱灈鈥嬦灁釣勧煉釣犪灦釣夆�嬦瀾釤嗎灃釤愥灇聽釤�
+
+# Predefined zoom values
+page_scale_width=釣戓瀾釣贯瀯鈥嬦瀾釤嗎灃釤愥灇
+page_scale_fit=釣熱灅鈥嬦瀾釤嗎灃釤愥灇
+page_scale_auto=釣栣瀯釤掅灇釣羔瀫鈥嬦灍釤掅灉釤愥灆釣斸煉釣氠灉釣忈煉釣忈灧
+page_scale_actual=釣戓焼釣犪焼鈥嬦瀲釣夺瀫釤嬦灍釤掅瀶釤傖瀯
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=釣�釤嗎灎釣会灍
+loading_error=釣樶灦釣撯�嬦瀫釤嗎灎釣会灍鈥嬦灁釣夺灀鈥嬦瀫釣踞瀼釣♂灳釣勨�嬦灃釤佱灈鈥嬦瀫釤嗎灃釣会瀯鈥嬦灂釤掅瀾釣会瀫 PDF聽釤�
+invalid_file_error=釣瀫釣熱灦釣� PDF 釣佱灱釣� 釣�嬦灅釣丰灀鈥嬦瀼釤掅灇釣贯灅釣忈煉釣氠灱釣溌犪煍
+missing_file_error=釣斸灦釣忈煁鈥嬦灟釣�釣熱灦釣� PDF
+unexpected_response_error=釣�釣夺灇鈥嬦瀱釤掅灈釣踞灆鈥嬦瀼釣樷�嬦灅釤夅灦釣熱煀釣羔灀鈥嬦灅釤佲�嬦瀶釤傖灈鈥嬦灅釣丰灀鈥嬦灁釣夺灀鈥嬦灇釤嗎灃釣贯瀯釤�
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} 釣呩焼釣庒灦釣氣�嬦灃釣撫煉釣欋灈釤媇
+password_label=釣斸瀴釤掅瀰釣坚灈鈥嬦灃釣夺瀫釤掅灆釣熱灅釤掅瀯釣夺瀼釤嬧�嬦瀶釣踞灅釤掅灁釣糕�嬦灁釣踞瀫鈥嬦灟釣�釣熱灦釣� PDF 釣撫焷釤囜煍
+password_invalid=釣栣灦釣�釤掅灆釣熱灅釤掅瀯釣夺瀼釤嬧�嬦灅釣丰灀鈥嬦瀼釤掅灇釣贯灅釣忈煉釣氠灱釣溼煍 釣熱灱釣樷�嬦灃釤掅灆釣夺灆釣夺灅鈥嬦灅釤掅瀶釣勧瀾釤�釣忈煍
+password_ok=釣欋灈釤嬧�嬦灃釤掅灇釣�
+password_cancel=釣斸焺釤囜灁釣勧煁
+
+printing_not_supported=釣�釣夺灇鈥嬦灃釤掅灇釣樶灦釣撀犪煐 釣�釣垛�嬦灇鈥嬦灁釤勧焽釣栣灮釣樶煉釣栤�嬦灅釣丰灀鈥嬦瀼釤掅灇釣坚灉鈥嬦灁釣夺灀鈥嬦瀭釣夺焼釣戓煉釣氣�嬦灃釤佱瀴釣涐焷釣夆�嬦瀶釤勧灆鈥嬦瀫釣樶煉釣樶灉釣丰瀿釣糕�嬦灇釣会瀫釣氠瀫鈥嬦灀釤佱焽鈥嬦瀾釤伮犪煍
+printing_not_ready=釣栣煉釣氠灅釣夺灀釤� PDF 釣樶灧釣撯�嬦瀼釤掅灇釣坚灉鈥嬦灁釣夺灀鈥嬦灂釤掅瀾釣会瀫鈥嬦瀾釣夺焼釣勧灍釤掅灇釣会瀯鈥嬦瀶釣踞灅釤掅灁釣糕�嬦灁釤勧焽釣栣灮釣樶煉釣栤�嬦瀾釤佱煍
+web_fonts_disabled=釣斸灦釣撯�嬦灁釣丰瀾鈥嬦灃釣会灅釤掅灃釣⑨瀫釤掅灍釣氣�嬦灁釣庒煉釣娽灦釣壜犪煐 釣樶灧釣撯�嬦灑釣夺瀰鈥嬦灁釤掅灇釣锯�嬦灃釣会灅釤掅灃釣⑨瀫釤掅灍釣� PDF 釣娽焸釣涒�嬦灁釣夺灀鈥嬦灁釣勧煉釣�釣斸煁鈥嬦灁釣夺灀鈥嬦瀾釤伮犪煍
+document_colors_not_allowed=釣瀫釣熱灦釣� PDF 釣樶灧釣撯�嬦瀼釤掅灇釣坚灉鈥嬦灁釣夺灀鈥嬦灑釣撫灮釣夅煉釣夅灦釣忊�嬦灢釤掅灆鈥嬦灁釤掅灇釣锯�嬦灃釣庒煂鈥嬦灂釤掅瀾釣夺灈釤嬧�嬦灇釣斸灍釤嬧�嬦灉釣垛�嬦瀾釤佱煐 '釣⑨灀釣会瀴釤掅瀴釣夺瀼鈥嬧�嬦灢釤掅灆鈥嬦瀾釤嗎灃釤愥灇鈥嬦瀲釤掅灇釣踞灍鈥嬦灃釣庒煂鈥嬦灂釤掅瀾釣夺灈釤嬧�嬦瀬釤掅灈釣结灀' 釣忈煉釣氠灱釣溾�嬦灁釣夺灀鈥嬦瀿釤掅灉釣锯�嬦灢釤掅灆鈥嬦灑釣熱瀫釣樶煉釣樷�嬦瀫釤掅灀釣会瀯鈥嬧�嬦瀫釣樶煉釣樶灉釣丰瀿釣糕�嬦灇釣会瀫釣氠瀫釤�
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/kn/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/kn/viewer.properties
new file mode 100644
index 0000000..cf3d004
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/kn/viewer.properties
@@ -0,0 +1,193 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=嗖灌部嗖傕拨嗖苦波 嗖硜嗖�
+previous_label=嗖灌部嗖傕拨嗖苦波
+next.title=嗖硜嗖傕拨嗖苦波 嗖硜嗖�
+next_label=嗖硜嗖傕拨嗖苦波
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=嗖硜嗖�
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages={{pagesCount}} 嗖班膊喑嵿膊嗖�
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pagesCount}} 嗖班膊喑嵿膊嗖� {{pageNumber}})
+
+zoom_out.title=嗖曕部嗖班部嗖︵簿嗖椸部嗖膏硜
+zoom_out_label=嗖曕部嗖班部嗖︵簿嗖椸部嗖膏部
+zoom_in.title=嗖灌部嗖班部嗖︵簿嗖椸部嗖膏硜
+zoom_in_label=嗖灌部嗖班部嗖︵簿嗖椸部嗖膏部
+zoom.title=嗖椸簿嗖む硩嗖班铂嗖︵膊嗖苦哺喑�
+presentation_mode.title=嗖硩嗖班哺喑嵿菠喑佮菠嗖� (嗖硩嗖班哺喑嗋矀嗖熰硣嗖多波喑�) 嗖曕硩嗖班伯嗖曕硩嗖曕硢 嗖拨嗖侧簿嗖部嗖膏硜
+presentation_mode_label=嗖硩嗖班哺喑嵿菠喑佮菠嗖� (嗖硩嗖班哺喑嗋矀嗖熰硣嗖多波喑�) 嗖曕硩嗖班伯
+open_file.title=嗖曕病嗖む驳嗖ㄠ硩嗖ㄠ硜 嗖む硢嗖班硢
+open_file_label=嗖む硢嗖班硢嗖部嗖班部
+print.title=嗖硜嗖︵硩嗖班部嗖膏硜
+print_label=嗖硜嗖︵硩嗖班部嗖膏部
+download.title=嗖囙渤嗖苦哺喑�
+download_label=嗖囙渤嗖苦哺嗖苦矔喑娻渤喑嵿渤嗖�
+bookmark.title=嗖硩嗖班哺嗖曕硩嗖� 嗖ㄠ硧嗖� (嗖硩嗖班菠嗖� 嗖簿嗖∴硜 嗖呧播嗖� 嗖灌硦嗖� 嗖曕部嗖熰矔嗖苦帛嗖侧硩嗖侧部 嗖む硢嗖班硢)
+bookmark_label=嗖硩嗖班哺嗖曕硩嗖� 嗖ㄠ硧嗖�
+
+# Secondary toolbar and context menu
+tools.title=嗖夃勃嗖曕舶嗖`矖嗖赤硜
+tools_label=嗖夃勃嗖曕舶嗖`矖嗖赤硜
+first_page.title=嗖硦嗖︵膊 嗖硜嗖熰矔喑嵿矔喑� 嗖む硢嗖班渤喑�
+first_page.label=嗖硦嗖︵膊 嗖硜嗖熰矔喑嵿矔喑� 嗖む硢嗖班渤喑�
+first_page_label=嗖硦嗖︵膊 嗖硜嗖熰矔喑嵿矔喑� 嗖む硢嗖班渤喑�
+last_page.title=嗖曕硦嗖ㄠ硢嗖� 嗖硜嗖熰矔喑嵿矔喑� 嗖む硢嗖班渤喑�
+last_page.label=嗖曕硦嗖ㄠ硢嗖� 嗖硜嗖熰矔喑嵿矔喑� 嗖む硢嗖班渤喑�
+last_page_label=嗖曕硦嗖ㄠ硢嗖� 嗖硜嗖熰矔喑嵿矔喑� 嗖む硢嗖班渤喑�
+page_rotate_cw.title=嗖硩嗖班拨嗖曕硩嗖粪部嗖`硢嗖膊喑嵿膊嗖� 嗖む部嗖班硜嗖椸部嗖膏硜
+page_rotate_cw.label=嗖硩嗖班拨嗖曕硩嗖粪部嗖`硢嗖膊喑嵿膊嗖� 嗖む部嗖班硜嗖椸部嗖膏硜
+page_rotate_cw_label=嗖硩嗖班拨嗖曕硩嗖粪部嗖`硢嗖膊喑嵿膊嗖� 嗖む部嗖班硜嗖椸部嗖膏硜
+page_rotate_ccw.title=嗖呧勃喑嵿舶嗖︵矔喑嵿卜嗖苦玻喑嗋帛嗖侧硩嗖侧部 嗖む部嗖班硜嗖椸部嗖膏硜
+page_rotate_ccw.label=嗖呧勃喑嵿舶嗖︵矔喑嵿卜嗖苦玻喑嗋帛嗖侧硩嗖侧部 嗖む部嗖班硜嗖椸部嗖膏硜
+page_rotate_ccw_label=嗖呧勃喑嵿舶嗖︵矔喑嵿卜嗖苦玻喑嗋帛嗖侧硩嗖侧部 嗖む部嗖班硜嗖椸部嗖膏硜
+
+cursor_text_select_tool.title=嗖矤喑嵿帛 嗖嗋帛喑嵿矔喑� 嗖夃勃嗖曕舶嗖`驳嗖ㄠ硩嗖ㄠ硜 嗖膏矔喑嵿舶嗖苦帛嗖椸硦嗖赤部嗖膏部
+cursor_text_select_tool_label=嗖矤喑嵿帛 嗖嗋帛喑嵿矔喑嗋帛 嗖夃勃嗖曕舶嗖�
+cursor_hand_tool.title=嗖曕硤 嗖夃勃嗖曕舶嗖`驳嗖ㄠ硩嗖ㄠ硜 嗖膏矔喑嵿舶嗖苦帛嗖椸硦嗖赤部嗖膏部
+cursor_hand_tool_label=嗖曕硤 嗖夃勃嗖曕舶嗖�
+
+
+
+# Document properties dialog box
+document_properties.title=嗖∴簿嗖曕硩嗖硜嗖硢嗖傕矡喑嶁�� 嗖椸硜嗖`矖嗖赤硜...
+document_properties_label=嗖∴簿嗖曕硩嗖硜嗖硢嗖傕矡喑嶁�� 嗖椸硜嗖`矖嗖赤硜...
+document_properties_file_name=嗖曕病嗖む拨 嗖灌硢嗖膏舶喑�:
+document_properties_file_size=嗖曕病嗖む拨 嗖椸簿嗖む硩嗖�:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} 嗖硤嗖熰硩鈥嵿矖嗖赤硜)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} 嗖硤嗖熰硩鈥嵿矖嗖赤硜)
+document_properties_title=嗖多硛嗖班硩嗖粪部嗖曕硢:
+document_properties_author=嗖曕舶喑嵿菠喑�:
+document_properties_subject=嗖掂部嗖粪帛:
+document_properties_keywords=嗖硜嗖栢硩嗖勃嗖︵矖嗖赤硜:
+document_properties_creation_date=嗖班矚嗖苦哺嗖苦拨 嗖︵部嗖ㄠ簿嗖傕矔:
+document_properties_modification_date=嗖簿嗖班硩嗖病嗖苦哺嗖侧簿嗖� 嗖︵部嗖ㄠ簿嗖傕矔:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=嗖班矚嗖苦哺嗖苦拨嗖掂舶喑�:
+document_properties_producer=PDF 嗖夃菠喑嵿勃嗖距拨嗖�:
+document_properties_version=PDF 嗖嗋驳喑冟菠喑嵿菠嗖�:
+document_properties_page_count=嗖硜嗖熰拨 嗖庎玻嗖苦矔喑�:
+document_properties_page_size_unit_inches=嗖囙拨嗖班膊喑嵿膊嗖�
+document_properties_page_size_orientation_portrait=嗖簿嗖掂矚嗖苦菠喑嵿舶
+document_properties_page_size_orientation_landscape=嗖硩嗖班矔喑冟菠嗖� 嗖氞部嗖む硩嗖�
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_close=嗖硜嗖氞硩嗖氞硜
+
+print_progress_message=嗖硜嗖︵硩嗖班部嗖膏硜嗖掂硜嗖︵矔喑嵿矔嗖距矖嗖� 嗖︵哺喑嵿菠嗖距驳喑囙矞嗖ㄠ硩嗖ㄠ硜 嗖膏部嗖︵硩嗖о矖喑娻渤嗖苦哺嗖侧簿嗖椸硜嗖む硩嗖む部嗖︵硢鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=嗖班拨喑嵿拨喑� 嗖簿嗖∴硜
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=嗖拨嗖苦勃嗖熰硩嗖熰部嗖波喑嵿波喑� 嗖灌硦嗖班渤嗖苦哺喑�
+toggle_sidebar_label=嗖拨嗖苦勃嗖熰硩嗖熰部嗖波喑嵿波喑� 嗖灌硦嗖班渤嗖苦哺喑�
+document_outline_label=嗖︵哺喑嵿菠嗖距驳喑囙矞嗖苦波 嗖灌硦嗖班舶喑囙矕喑�
+attachments.title=嗖侧矖嗖む硩嗖む硜嗖椸渤嗖ㄠ硩嗖ㄠ硜 嗖む硧嗖班部嗖膏硜
+attachments_label=嗖侧矖嗖む硩嗖む硜嗖椸渤喑�
+thumbs.title=嗖氞部嗖曕硩嗖曕矚嗖苦菠喑嵿舶嗖︵矀嗖む硢 嗖む硧嗖班部嗖膏硜
+thumbs_label=嗖氞部嗖曕硩嗖曕矚嗖苦菠喑嵿舶嗖椸渤喑�
+findbar.title=嗖︵哺喑嵿菠嗖距驳喑囙矞嗖苦波嗖侧硩嗖侧部 嗖灌硜嗖∴硜嗖曕硜
+findbar_label=嗖灌硜嗖∴硜嗖曕硜
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=嗖硜嗖� {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=嗖硜嗖熰驳嗖ㄠ硩嗖ㄠ硜 嗖氞部嗖曕硩嗖曕矚嗖苦菠喑嵿舶嗖︵矀嗖む硢 嗖む硧嗖班部嗖膏硜 {{page}}
+
+# Find panel button title and messages
+find_input.title=嗖灌硜嗖∴硜嗖曕硜
+find_input.placeholder=嗖︵哺喑嵿菠嗖距驳喑囙矞嗖苦波嗖侧硩嗖侧部 嗖灌硜嗖∴硜嗖曕硜鈥�
+find_previous.title=嗖掂簿嗖曕硩嗖拨 嗖灌部嗖傕拨嗖苦波 嗖囙舶喑佮驳嗖苦矔喑嗋帛嗖ㄠ硩嗖ㄠ硜 嗖灌硜嗖∴硜嗖曕硜
+find_previous_label=嗖灌部嗖傕拨嗖苦波
+find_next.title=嗖掂簿嗖曕硩嗖拨 嗖硜嗖傕拨嗖苦波 嗖囙舶喑佮驳嗖苦矔喑嗋帛嗖ㄠ硩嗖ㄠ硜 嗖灌硜嗖∴硜嗖曕硜
+find_next_label=嗖硜嗖傕拨嗖苦波
+find_highlight=嗖庎膊喑嵿膊嗖掂波喑嵿波喑� 嗖灌硤嗖侧硤嗖熰硩 嗖簿嗖∴硜
+find_match_case_label=嗖曕硣嗖膏波喑嵿波喑� 嗖灌硦嗖傕拨嗖苦哺喑�
+find_reached_top=嗖︵哺喑嵿菠嗖距驳喑囙矞嗖苦波 嗖硣嗖侧硩嗖簿嗖椸驳嗖ㄠ硩嗖ㄠ硜 嗖む膊喑佮勃嗖苦拨喑�, 嗖曕硢嗖赤矖嗖苦波嗖苦矀嗖� 嗖嗋舶嗖傕箔嗖苦哺喑�
+find_reached_bottom=嗖︵哺喑嵿菠嗖距驳喑囙矞嗖苦波 嗖曕硦嗖ㄠ硢嗖波喑嵿波喑� 嗖む膊喑佮勃嗖苦拨喑�, 嗖硣嗖侧部嗖ㄠ部嗖傕拨 嗖嗋舶嗖傕箔嗖苦哺喑�
+find_not_found=嗖掂簿嗖曕硩嗖驳喑� 嗖曕矀嗖∴硜 嗖矀嗖︵部嗖侧硩嗖�
+
+# Error panel labels
+error_more_info=嗖灌硢嗖氞硩嗖氞部嗖� 嗖簿嗖灌部嗖む部
+error_less_info=嗖曕病嗖苦伯喑� 嗖簿嗖灌部嗖む部
+error_close=嗖硜嗖氞硩嗖氞硜
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=嗖膏矀嗖︵硣嗖�: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=嗖班簿嗖多部: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=嗖曕病嗖�: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=嗖膏簿嗖侧硜: {{line}}
+rendering_error=嗖硜嗖熰驳嗖ㄠ硩嗖ㄠ硜 嗖ㄠ部嗖班硞嗖部嗖膏硜嗖掂簿嗖� 嗖掄矀嗖︵硜 嗖︵硧嗖� 嗖庎拨喑佮舶嗖距矖嗖苦拨喑�.
+
+# Predefined zoom values
+page_scale_width=嗖硜嗖熰拨 嗖呧矖嗖�
+page_scale_fit=嗖硜嗖熰拨 嗖膏舶嗖苦补喑娻矀嗖︵部嗖曕硢
+page_scale_auto=嗖膏硩嗖掂帛嗖傕矚嗖距膊嗖苦菠 嗖椸簿嗖む硩嗖班铂嗖︵膊嗖距驳嗖`硢
+page_scale_actual=嗖ㄠ部嗖溹驳嗖距拨 嗖椸簿嗖む硩嗖�
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=嗖︵硧嗖�
+loading_error=PDF 嗖呧波喑嵿波喑� 嗖侧硧嗖∴硩 嗖簿嗖∴硜嗖掂簿嗖� 嗖掄矀嗖︵硜 嗖︵硧嗖� 嗖庎拨喑佮舶嗖距矖嗖苦拨喑�.
+invalid_file_error=嗖呧伯嗖距波喑嵿帛嗖掂簿嗖� 嗖呧播嗖� 嗖灌簿嗖赤簿嗖� PDF 嗖曕病嗖�.
+missing_file_error=PDF 嗖曕病嗖� 嗖囙膊喑嵿膊.
+unexpected_response_error=嗖呧波嗖苦舶喑�嗖曕硩嗖粪部嗖む驳嗖距拨 嗖硞嗖班硤嗖曕硢嗖椸玻嗖曕拨 嗖硩嗖班菠嗖苦矔喑嵿舶嗖苦帛喑�.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} 嗖熰部嗖硩嗖玻嗖縘
+password_label=PDF 嗖呧波喑嵿波喑� 嗖む硢嗖班硢嗖膊喑� 嗖椸硜嗖硩嗖む勃嗖︵驳嗖ㄠ硩嗖ㄠ硜 嗖ㄠ伯喑傕拨嗖苦哺嗖�.
+password_invalid=嗖呧伯嗖距波喑嵿帛嗖掂簿嗖� 嗖椸硜嗖硩嗖む勃嗖�, 嗖︵帛嗖掂部嗖熰硩嗖熰硜 嗖囙波喑嵿波喑娻伯喑嵿伯喑� 嗖硩嗖班帛嗖む硩嗖ㄠ部嗖膏部.
+password_ok=OK
+password_cancel=嗖班拨喑嵿拨喑� 嗖簿嗖∴硜
+
+printing_not_supported=嗖庎矚喑嵿矚嗖班部嗖曕硢: 嗖� 嗖溹簿嗖侧驳喑�嗖曕硩嗖粪矔嗖︵膊喑嵿膊嗖� 嗖硜嗖︵硩嗖班玻嗖曕硩嗖曕硢 嗖膏矀嗖硞嗖班硩嗖� 嗖硢嗖傕铂嗖侧驳嗖苦膊喑嵿膊.
+printing_not_ready=嗖庎矚喑嵿矚嗖班部嗖曕硢: PDF 嗖曕病嗖む驳喑� 嗖硜嗖︵硩嗖班部嗖膏膊喑� 嗖膏矀嗖硞嗖班硩嗖`驳嗖距矖嗖� 嗖侧硧嗖∴硩 嗖嗋矖嗖苦膊喑嵿膊.
+web_fonts_disabled=嗖溹簿嗖� 嗖呧矔喑嵿卜嗖班捕喑堗膊嗖苦帛嗖ㄠ硩嗖ㄠ硜 嗖ㄠ部嗖粪硩嗖曕硩嗖班部嗖矖喑娻渤嗖苦哺嗖侧簿嗖椸部嗖︵硢: 嗖呧病嗖曕矖喑娻渤嗖苦哺嗖苦拨 PDF 嗖呧矔喑嵿卜嗖班捕喑堗膊嗖苦矖嗖赤波喑嵿波喑� 嗖渤嗖膏膊喑� 嗖膏簿嗖о硩嗖驳嗖距矖嗖苦膊喑嵿膊.
+document_colors_not_allowed=PDF 嗖︵哺喑嵿菠嗖距驳喑囙矞喑佮矖嗖赤硜 嗖む伯喑嵿伯嗖︵硢 嗖嗋拨 嗖玻喑嵿玻嗖椸渤嗖ㄠ硩嗖ㄠ硜 嗖渤嗖膏膊喑� 嗖呧波喑佮伯嗖む部 嗖囙舶喑佮驳喑佮拨嗖苦膊喑嵿膊: '嗖硜嗖熰矖嗖赤硜 嗖む伯喑嵿伯嗖︵硢 嗖嗋拨 嗖玻喑嵿玻嗖掂波喑嵿波喑� 嗖嗋帛喑嵿矔喑� 嗖簿嗖∴膊喑� 嗖呧波喑佮伯嗖む部嗖膏硜' 嗖呧波喑嵿波喑� 嗖溹簿嗖侧驳喑�嗖曕硩嗖粪矔嗖︵膊喑嵿膊嗖� 嗖ㄠ部嗖粪硩嗖曕硩嗖班部嗖矖喑娻渤嗖苦哺嗖侧簿嗖椸部嗖班硜嗖む硩嗖む拨喑�.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ko/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ko/viewer.properties
new file mode 100644
index 0000000..db7da19
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ko/viewer.properties
@@ -0,0 +1,242 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=鞚挫爠 韼橃澊歆�
+previous_label=鞚挫爠
+next.title=雼れ潓 韼橃澊歆�
+next_label=雼れ潓
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=韼橃澊歆�
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=鞝勳泊 {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pagesCount}} 欷� {{pageNumber}})
+
+zoom_out.title=於曥唽
+zoom_out_label=於曥唽
+zoom_in.title=頇曤寑
+zoom_in_label=頇曤寑
+zoom.title=韥赴
+presentation_mode.title=氚滍憸 氇摐搿� 鞝勴櫂
+presentation_mode_label=氚滍憸 氇摐
+open_file.title=韺岇澕 鞐搓赴
+open_file_label=鞐搓赴
+print.title=鞚胳噭
+print_label=鞚胳噭
+download.title=雼れ毚搿滊摐
+download_label=雼れ毚搿滊摐
+bookmark.title=歆�旮� 氤挫澊電� 攴鸽寑搿� (氤奠偓頃橁卑雮� 靸� 彀届棎 鞐搓赴)
+bookmark_label=歆�旮� 氤挫澊電� 攴鸽寑搿�
+
+# Secondary toolbar and context menu
+tools.title=霃勱惮
+tools_label=霃勱惮
+first_page.title=觳� 韼橃澊歆�搿� 鞚措彊
+first_page.label=觳� 韼橃澊歆�搿� 鞚措彊
+first_page_label=觳� 韼橃澊歆�搿� 鞚措彊
+last_page.title=毵堨毵� 韼橃澊歆�搿� 鞚措彊
+last_page.label=毵堨毵� 韼橃澊歆�搿� 鞚措彊
+last_page_label=毵堨毵� 韼橃澊歆�搿� 鞚措彊
+page_rotate_cw.title=鞁滉硠氚╉枼鞙茧 須岇爠
+page_rotate_cw.label=鞁滉硠氚╉枼鞙茧 須岇爠
+page_rotate_cw_label=鞁滉硠氚╉枼鞙茧 須岇爠
+page_rotate_ccw.title=鞁滉硠 氚橂寑氚╉枼鞙茧 須岇爠
+page_rotate_ccw.label=鞁滉硠 氚橂寑氚╉枼鞙茧 須岇爠
+page_rotate_ccw_label=鞁滉硠 氚橂寑氚╉枼鞙茧 須岇爠
+
+cursor_text_select_tool.title=韰嶌姢韸� 靹犿儩 霃勱惮 頇滌劚頇�
+cursor_text_select_tool_label=韰嶌姢韸� 靹犿儩 霃勱惮
+cursor_hand_tool.title=靻� 霃勱惮 頇滌劚頇�
+cursor_hand_tool_label=靻� 霃勱惮
+
+scroll_vertical.title=靹鸽 鞀ろ伂搿� 靷毄
+scroll_vertical_label=靹鸽 鞀ろ伂搿�
+scroll_horizontal.title=臧�搿� 鞀ろ伂搿� 靷毄
+scroll_horizontal_label=臧�搿� 鞀ろ伂搿�
+scroll_wrapped.title=臧愳嫾 鞀ろ伂搿� 靷毄
+scroll_wrapped_label=臧愳嫾 鞀ろ伂搿�
+
+spread_none.title=韼检硱歆� 韼橃澊歆�毳� 頃╈箻歆� 鞎婌潓
+spread_none_label=韼检硱歆� 鞐嗢潓
+spread_odd.title=頇�靾� 韼橃澊歆�搿� 鞁滌瀾頃橁矊 韼检硱歆� 韼橃澊歆� 頃╈龚
+spread_odd_label=頇�靾� 韼检硱歆�
+spread_even.title=歆濎垬 韼橃澊歆�搿� 鞁滌瀾頃橁矊 韼检硱歆� 韼橃澊歆� 頃╈龚
+spread_even_label=歆濎垬 韼检硱歆�
+
+# Document properties dialog box
+document_properties.title=氍胳劀 靻嶌劚鈥�
+document_properties_label=氍胳劀 靻嶌劚鈥�
+document_properties_file_name=韺岇澕 鞚措:
+document_properties_file_size=韺岇澕 靷澊歃�:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}}氚旍澊韸�)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}}氚旍澊韸�)
+document_properties_title=鞝滊:
+document_properties_author=鞝�鞛�:
+document_properties_subject=欤检牅:
+document_properties_keywords=韨れ泴霌�:
+document_properties_creation_date=靸濎劚鞚�:
+document_properties_modification_date=靾橃爼鞚�:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=靸濎劚鞛�:
+document_properties_producer=PDF 靸濎劚旮�:
+document_properties_version=PDF 氩勳爠:
+document_properties_page_count=齑� 韼橃澊歆�:
+document_properties_page_size=韼橃澊歆� 韥赴:
+document_properties_page_size_unit_inches=in
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=靹鸽
+document_properties_page_size_orientation_landscape=臧�搿�
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=霠堩劙
+document_properties_page_size_name_legal=毽备
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=牍犽ジ 鞗� 氤搓赴:
+document_properties_linearized_yes=鞓�
+document_properties_linearized_no=鞎勲媹鞓�
+document_properties_close=雼赴
+
+print_progress_message=氍胳劀 於滊牓 欷�牍勳鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=旆唽
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=韮愳儔彀� 鞐搓碃 雼赴
+toggle_sidebar_notification.title=韮愳儔彀� 鞐搓碃 雼赴 (氍胳劀鞐� 鞎勳泝霛检澑鞚措倶 觳秬韺岇澕鞚� 霌れ柎鞛堨潓)
+toggle_sidebar_label=韮愳儔彀� 鞐搓碃 雼赴
+document_outline.title=氍胳劀 鞎勳泝霛检澑 氤搓赴(雿旊笖 韥措Ν頃挫劀 氇摖 頃 鞐搓碃 雼赴)
+document_outline_label=氍胳劀 鞎勳泝霛检澑
+attachments.title=觳秬韺岇澕 氤搓赴
+attachments_label=觳秬韺岇澕
+thumbs.title=氙鸽Μ氤搓赴
+thumbs_label=氙鸽Μ氤搓赴
+findbar.title=瓴�靸�
+findbar_label=瓴�靸�
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title={{page}}飒�
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas={{page}}飒� 氙鸽Μ氤搓赴
+
+# Find panel button title and messages
+find_input.title=彀娟赴
+find_input.placeholder=氍胳劀鞐愳劀 彀娟赴鈥�
+find_previous.title=歆�鞝� 氍胳瀽鞐挫棎 鞚检箻頃橂姅 1臧� 攵�攵勳潉 瓴�靸�
+find_previous_label=鞚挫爠
+find_next.title=歆�鞝� 氍胳瀽鞐挫棎 鞚检箻頃橂姅 雼れ潓 攵�攵勳潉 瓴�靸�
+find_next_label=雼れ潓
+find_highlight=氇憪 臧曥“ 響滌嫓
+find_match_case_label=雽�氍胳瀽/靻岆鞛� 甑硠
+find_entire_word_label=鞝勳泊 雼柎
+find_reached_top=氍胳劀 觳橃潓旯岇 瓴�靸夗晿瓿� 雭濎溂搿� 霃岇晞鞕� 瓴�靸夗枅鞀惦媹雼�.
+find_reached_bottom=氍胳劀 雭濌箤歆� 瓴�靸夗晿瓿� 鞎烄溂搿� 霃岇晞鞕� 瓴�靸夗枅鞀惦媹雼�.
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]={{total}} 欷� {{current}} 鞚检箻
+find_match_count[two]={{total}} 欷� {{current}} 鞚检箻
+find_match_count[few]={{total}} 欷� {{current}} 鞚检箻
+find_match_count[many]={{total}} 欷� {{current}} 鞚检箻
+find_match_count[other]={{total}} 欷� {{current}} 鞚检箻
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]={{limit}} 鞚挫儊 鞚检箻
+find_match_count_limit[one]={{limit}} 鞚挫儊 鞚检箻
+find_match_count_limit[two]={{limit}} 鞚挫儊 鞚检箻
+find_match_count_limit[few]={{limit}} 鞚挫儊 鞚检箻
+find_match_count_limit[many]={{limit}} 鞚挫儊 鞚检箻
+find_match_count_limit[other]={{limit}} 鞚挫儊 鞚检箻
+find_not_found=瓴�靸� 瓴瓣臣 鞐嗢潓
+
+# Error panel labels
+error_more_info=鞝曤炒 雿� 氤搓赴
+error_less_info=鞝曤炒 臧勲嫧頌� 氤搓赴
+error_close=雼赴
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (牍岆摐: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=氅旍嫓歆�: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=鞀ろ儩: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=韺岇澕: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=欷� 氩堩樃: {{line}}
+rendering_error=韼橃澊歆�毳� 霠岆崝毵來晿雼� 鞓る臧� 雮姷雼堧嫟.
+
+# Predefined zoom values
+page_scale_width=韼橃澊歆� 雱堧箘鞐� 毵烄钉
+page_scale_fit=韼橃澊歆�鞐� 毵烄钉
+page_scale_auto=鞎岇晞靹� 毵烄钉
+page_scale_actual=鞁れ牅 韥赴鞐� 毵烄钉
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=鞓る
+loading_error=PDF毳� 鞚诫姅 欷� 鞓る臧� 靸濌布鞀惦媹雼�.
+invalid_file_error=鞙犿毃頃橃 鞎婈卑雮� 韺岇啇霅� PDF 韺岇澕
+missing_file_error=PDF 韺岇澕鞚� 鞐嗢姷雼堧嫟.
+unexpected_response_error=鞎� 靾� 鞐嗠姅 靹滊矂 鞚戨嫷鞛呺媹雼�.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} 欤检劃]
+password_label=鞚� PDF 韺岇澕鞚� 鞐� 靾� 鞛堧姅 鞎旐樃毳� 鞛呺牓頃橃嫮鞁滌槫.
+password_invalid=鞛橂霅� 鞎旐樃鞛呺媹雼�. 雼れ嫓 鞁滊弰頃� 欤检嫮鞁滌槫.
+password_ok=頇曥澑
+password_cancel=旆唽
+
+printing_not_supported=瓴疥碃: 鞚� 敫岆澕鞖办爛電� 鞚胳噭毳� 鞕勳爠頌� 歆�鞗愴晿歆� 鞎婌姷雼堧嫟.
+printing_not_ready=瓴疥碃: 鞚� PDF毳� 鞚胳噭毳� 頃� 靾� 鞛堨潉 鞝曤弰搿� 鞚届柎霌れ澊歆� 氇豁枅鞀惦媹雼�.
+web_fonts_disabled=鞗� 韽绊姼臧� 旰检牳鞛堨潓: 雮挫灔霅� PDF 旮�昙挫潉 鞊� 靾� 鞐嗢姷雼堧嫟.
+document_colors_not_allowed=PDF 氍胳劀鞚� 靸夓儊鞚� 鞊办 氇豁晿瓴� 霅橃柎 鞛堨潓: '鞗� 韼橃澊歆� 鞛愳泊 靸夓儊 靷毄 項堨毄'鞚� 敫岆澕鞖办爛鞐愳劀 旰检牳 鞛堨姷雼堧嫟.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/kok/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/kok/viewer.properties
new file mode 100644
index 0000000..dbdd3df
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/kok/viewer.properties
@@ -0,0 +1,167 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=啶ぞ啶熰げ啷� 啶ぞ啶�
+previous_label=啶ぞ啶熰げ啷�
+next.title=啶啶∴げ啷� 啶ぞ啶�
+next_label=啶啶∴啶�
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+
+zoom_out.title=啶侧啶灌ぞ啶� 啶曕ぐ啶距い
+zoom_out_label=啶侧啶灌ぞ啶� 啶曕ぐ啶距い
+zoom_in.title=啶掂啶灌ぁ 啶曕ぐ啶距い
+zoom_in_label=啶掂啶灌ぁ 啶曕ぐ啶距い
+zoom.title=啶掂啶灌ぁ
+presentation_mode.title=啶膏ぞ啶︵ぐ啷�啶曕ぐ啶� 啶膏啶ムた啶む啶傕い 啶掂啶距い
+presentation_mode_label=啶膏ぞ啶︵ぐ啷�啶曕ぐ啶� 啶膏啶ムた啶む
+open_file.title=啶ぞ啶げ 啶夃啶∴ぞ啶�
+open_file_label=啶夃啶∴ぞ啶�
+print.title=啶涏ぞ啶ぞ啶�
+print_label=啶涏ぞ啶ぞ啶�
+download.title=啶∴ぞ啶掂え啶侧啶�
+download_label=啶∴ぞ啶掂え啶侧啶�
+bookmark.title=啶膏う啷嵿く啶距啷� 啶︵啶多啶� (啶ㄠさ啷嵿く啶� 啶溹え啷囙げ啶距啶� 啶啶班い 啶曕ぐ啶距い 啶掂 啶夃啶∴ぞ啶�)
+bookmark_label=啶膏う啷嵿く啶距啷� 啶︵啶多啶�
+
+# Secondary toolbar and context menu
+tools.title=啶膏ぞ啶оえ啶距
+tools_label=啶膏ぞ啶оえ啶距
+first_page.title=啶く啶侧啶ぞ  啶ぞ啶ㄠぞ啶� 啶掂啶距い
+first_page.label=啶く啶侧啶ぞ  啶ぞ啶ㄠぞ啶� 啶掂啶距い
+first_page_label=啶く啶侧啶ぞ  啶ぞ啶ㄠぞ啶� 啶掂啶距い
+last_page.title=啶ㄠた啶ぃ啷嵿く啶� 啶ぞ啶ㄠぞ啶� 啶掂啶距い
+last_page.label=啶ㄠた啶ぃ啷嵿く啶� 啶ぞ啶ㄠぞ啶� 啶掂啶距い
+last_page_label=啶ㄠた啶ぃ啷嵿く啶� 啶ぞ啶ㄠぞ啶� 啶掂啶距い
+page_rotate_cw.title=啶樴ぁ啷嵿く啶距こ啶距啷嵿く啶� 啶︵た啶曕啶� 啶樴啶傕さ啶∴ぞ啶ぞ啶�
+page_rotate_cw.label=啶樴ぁ啷嵿く啶距こ啶距啷嵿く啶� 啶︵た啶曕啶� 啶樴啶傕さ啶∴ぞ啶ぞ啶�
+page_rotate_cw_label=啶樴ぁ啷嵿く啶距こ啶距啷嵿く啶� 啶︵た啶曕啶� 啶樴啶傕さ啶∴ぞ啶ぞ啶�
+page_rotate_ccw.title=啶樴ぁ啷嵿く啶距こ啶距啷嵿く啶� 啶夃げ啶熰啶ぞ 啶︵た啶曕啶� 啶樴啶傕さ啶∴ぞ啶ぞ啶�
+page_rotate_ccw.label=啶樴ぁ啷嵿く啶距こ啶距啷嵿く啶� 啶夃げ啶熰啶ぞ 啶︵た啶曕啶� 啶樴啶傕さ啶∴ぞ啶ぞ啶�
+page_rotate_ccw_label=啶樴ぁ啷嵿く啶距こ啶距啷嵿く啶� 啶夃げ啶熰啶ぞ 啶︵た啶曕啶� 啶樴啶傕さ啶∴ぞ啶ぞ啶�
+
+
+# Document properties dialog box
+document_properties.title=啶︵じ啷嵿い啶距さ啷囙 啶掂啶多た啶多啶熰啶ぞ啶�...
+document_properties_label=啶︵じ啷嵿い啶距さ啷囙 啶掂啶多た啶多啶熰啶ぞ啶�...
+document_properties_file_name=啶ぞ啶げ啷�啶氞 啶ㄠぞ啶�:
+document_properties_file_size=啶ぞ啶げ啷�啶氞 啶嗋啶距ぐ:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{啶嗋啶距ぐ_kb}} KB ({{啶嗋啶距ぐ_b}} 啶ぞ啶啶膏)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{啶嗋啶距ぐ_mb}} MB ({{啶嗋啶距ぐ_b}} 啶ぞ啶啶膏)
+document_properties_title=啶ぅ啶赤:
+document_properties_author=啶ぐ啷嬥さ啶:
+document_properties_subject=啶掂た啶多く:
+document_properties_keywords=啶曕啶掂ぐ啷嵿ぁ啶膏:
+document_properties_creation_date=啶ㄠた啶班啶ぃ啷� 啶むぞ啶班啶�:
+document_properties_modification_date=啶膏啶︵ぞ啶� 啶むぞ啶班啶�:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{啶むぞ啶班啶晑}, {{啶掂啶硙}
+document_properties_creator=啶ㄠた啶班啶ぞ啶む:
+document_properties_producer=\u0020PDF 啶ㄠた啶班啶ぞ啶む:
+document_properties_version=PDF 啶嗋さ啷冟い啷嵿い啷�:
+document_properties_page_count=啶ぞ啶� 啶椸ぃ啶�:
+document_properties_close=啶啶�
+
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=啶膏ぞ啶ぁ啶ぞ啶� 啶呧う啶侧ぞ啶う啶�
+toggle_sidebar_label=啶膏ぞ啶ぁ啶ぞ啶� 啶呧う啶侧ぞ啶う啶�
+document_outline_label=啶︵じ啷嵿い啶距さ啷囙 啶嗋啶熰げ啶距く啶�
+attachments.title=啶溹啶� 啶︵ぞ啶栢く啶距い
+attachments_label=啶溹啶∴
+thumbs.title=啶ム啶え啷囙げ 啶︵ぞ啶栢く啶距い
+thumbs_label=啶ム啶え啷囙げ
+findbar.title=啶︵じ啷嵿い啶距さ啷囙啶距啶� 啶膏啶︵ぞ啶�
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=啶ぞ啶� {{啶ぞ啶▆}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas={{啶ぞ啶▆} 啶ぞ啶ㄠぞ啶氞 啶ム啶え啷囙げ
+
+# Find panel button title and messages
+find_previous.title=啶掂ぞ啶曕啶ぞ啶氞 啶く啶侧啶氞 啶呧啶� 啶膏啶︵ぞ啶�
+find_previous_label=啶ぞ啶熰げ啷�
+find_next.title=啶掂ぞ啶曕啶ぞ啶氞 啶啶栢ぞ啶掂啶侧 啶呧啶� 啶膏啶︵ぞ啶�
+find_next_label=啶啶∴啶�
+find_highlight=啶膏啶赤 啶犩こ啶� 啶曕ぐ啶距い
+find_match_case_label=啶曕啶� 啶溹啶赤く啶距い
+find_reached_top=啶︵じ啷嵿い啶距さ啷囙啶距啷嵿く啶� 啶掂く啶� 啶ぞ啶掂げ啷�. 啶膏啶げ啷嵿く啶距え 啶膏啶班 啶曕ぐ啶距い
+find_reached_bottom=啶︵じ啷嵿い啶距さ啷囙啶距啷嵿く啶� 啶多啶掂啶距 啶ぞ啶掂げ啷�, 啶掂く啶侧啶ぞ啶� 啶膏啶班 啶曕ぐ啶距い
+find_not_found=啶掂ぞ啶曕啶� 啶啶赤啶傕 啶ㄠぞ
+
+# Error panel labels
+error_more_info=啶呧う啶苦 啶ぞ啶灌た啶む
+error_less_info=啶曕ぎ啷� 啶ぞ啶灌た啶む
+error_close=啶啶�
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{啶嗋さ啷冟い啷嵿い啷�}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=啶膏啶︵啶� : {{啶膏啶︵啶秨}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=啶︵ぞ啶�: {{啶︵ぞ啶硙}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=啶ぞ啶げ: {{啶ぞ啶げ}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=啶撪こ: {{啶撪こ}}
+rendering_error=啶ぞ啶� 啶班啶傕ぁ啶班た啶傕 啶曕ぐ啶むぞ啶膏啶むえ啶� 啶忇ぐ啶� 啶嗋く啶侧
+
+# Predefined zoom values
+page_scale_width=啶ぞ啶ㄠぞ啶氞 啶班啶傕う啶距く
+page_scale_fit=啶ぞ啶ㄠぞ啶� 啶じ啶ぞ啶�
+page_scale_auto=啶嗋お啶多啶� 啶掂啶灌ぁ
+page_scale_actual=啶啶赤啷� 啶嗋啶距ぐ
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+
+# Loading indicator messages
+loading_error_indicator=啶忇ぐ啶�
+loading_error=啶啶∴啶忇か 啶氞ぞ啶侧 啶溹ぞ啶むえ啶� 啶忇ぐ啶� 啶嗋く啶侧
+invalid_file_error=啶呧さ啷堗ぇ 啶掂 啶掂ぞ啶� 啶侧ぞ啶椸た啶侧啶侧 PDF 啶ぞ啶げ
+missing_file_error=啶多啶`た啶侧啶侧 PDF 啶ぞ啶げ.
+unexpected_response_error=啶呧え啶啶曕啶粪た啶� 啶膏ぐ啷嵿さ啷嵿す啶� 啶啶班い啶苦じ啶距う
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{啶啶班啶距ぐ}} 啶熰た啶啶ぃ啷�]
+password_label=啶灌 PDF 啶ぞ啶げ 啶夃啶∴お啶距 啶ぞ啶膏さ啶班啶� 啶︵た啶ぞ啶�
+password_invalid=啶呧さ啷堗ぇ 啶ぞ啶膏さ啶班啶�. 啶ぐ啶む啶� 啶い啷嵿え 啶曕ぐ啶距い.
+password_ok=啶ぐ啷囙 啶嗋じ啶�
+
+printing_not_supported=啶多た啶熰啶距さ啶` :  啶灌 啶啶班ぞ啶掂啶� 啶涏ぞ啶お啶距 啶ぞ啶傕啶こ 啶︵た啶ㄠぞ
+printing_not_ready=啶多た啶熰啶距さ啶`: PDF 啶啶︵啶班ぃ啶距啶距い啷�啶� 啶啶班ぞ啶� 啶侧啶� 啶溹ぞ啶掂え啶�.
+web_fonts_disabled=啶掂啶� 啶呧啷嵿し啶班じ啶傕 啶ㄠた啶多啶曕啶班た啶� 啶曕啶侧啶ぞ啶�: 啶忇ぎ啷嵿が啷囙ぁ啷囙ぁ PDF 啶呧啷嵿し啶班じ啶傕 啶掂ぞ啶ぐ啶ぞ啶� 啶多啶ㄠぞ.
+document_colors_not_allowed=PDF 啶︵じ啷嵿い啶距さ啷囙啶距啶� 啶むぞ啶傕啷� 啶膏啶掂い啶冟啷� 啶班啶� 啶掂ぞ啶ぐ啶ぞ啶� 啶呧え啷佮ぎ啶む 啶ㄠぞ: '啶ぞ啶ㄠぞ啶傕 啶むぞ啶傕啷� 啶膏啶掂い啶冟啷� 啶班啶� 啶ㄠた啶掂ぁ啷佮お啶距 啶︵た啶ぞ啶�' 啶啶班ぞ啶掂啶班ぞ啶� 啶ㄠた啶多啶曕啶班啶� 啶曕啶侧ぞ.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ks/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ks/viewer.properties
new file mode 100644
index 0000000..63a9192
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ks/viewer.properties
@@ -0,0 +1,168 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=倬鬲賽賲 氐賮丨蹠
+previous_label=倬鬲賽賲
+next.title=亘乇賵賳俟诰賽賲 氐賮丨蹠
+next_label=亘乇賵賳俟诰
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+
+zoom_out.title=賳蹠亘乇 賰趫蹖蹠賵
+zoom_out_label=賳蹠亘乇 賰趫蹖蹠賵
+zoom_in.title=丕賳丿乇 跇贀丕賳蹖賵
+zoom_in_label=丕賳丿乇 跇贀丕賳蹖賵
+zoom.title=夭賵賲
+presentation_mode.title=倬乇蹖夭蹖賳俟蹖卮賳 賲賵趫爻 讴購賳 讴賿乇蹖賵 爻賵趩
+presentation_mode_label=倬乇蹖夭蹖賳俟蹖卮賳 賲賵趫
+open_file.title=賮丕蹖賱 賰诰賵賱蹖賵
+open_file_label=賰诰賵賱蹖賵
+print.title=倬乇蹖賳俟
+print_label=倬乇蹖賳俟
+download.title=趫丕賵賳賱賵趫
+download_label=趫丕賵賳賱賵趫
+bookmark.title=丨丕賱購賰 賳馗丕乇亍 (賳賯賱 賰乇蹖賵 賳鬲蹠 賰诰賵賱蹖蹠賵 亘丿賱 賵賽賳趫賵 賲賳夭)
+bookmark_label=丨丕賱購賰 賳馗丕乇亍
+
+# Secondary toolbar and context menu
+tools.title=俟賵賱
+tools_label=俟賵賱
+first_page.title=诏賵趫賳蹖讴賽爻 倬蹖噩爻 讴購賳 诏賿跇诰蹖賵\u0020
+first_page.label=诏賵趫賳蹖讴賽爻 倬蹖噩爻 讴購賳 诏賿跇诰蹖賵\u0020
+first_page_label=诏賵趫賳蹖讴賽爻 倬蹖噩爻 讴購賳 诏賿跇诰蹖賵\u0020
+last_page.title=\u0020倬賿鬲賲賽爻 倬蹖噩爻 讴購賳 诏賿跇诰蹖賵\u0020
+last_page.label=\u0020倬賿鬲賲賽爻 倬蹖噩爻 讴購賳 诏賿跇诰蹖賵\u0020
+last_page_label=\u0020倬賿鬲賲賽爻 倬蹖噩爻 讴購賳 诏賿跇诰蹖賵\u0020
+page_rotate_cw.title=讴購賱丕讴 賵丕蹖賽夭 讴賿乇蹖賵 乇賵俟蹖俟\u0020
+page_rotate_cw.label=讴購賱丕讴 賵丕蹖賽夭 讴賿乇蹖賵 乇賵俟蹖俟\u0020
+page_rotate_cw_label=讴購賱丕讴 賵丕蹖賽夭 讴賿乇蹖賵 乇賵俟蹖俟\u0020
+page_rotate_ccw.title=\u0020讴丕賵賳俟乇 讴購賱丕讴  賵丕蹖賽夭 讴賿乇蹖賵 乇賵俟蹖俟
+page_rotate_ccw.label=\u0020讴丕賵賳俟乇 讴購賱丕讴  賵丕蹖賽夭 讴賿乇蹖賵 乇賵俟蹖俟
+page_rotate_ccw_label=\u0020讴丕賵賳俟乇 讴購賱丕讴  賵丕蹖賽夭 讴賿乇蹖賵 乇賵俟蹖俟
+
+
+# Document properties dialog box
+document_properties.title=丿爻鬲丕賵蹖夭 禺氐賵氐蹖丕鬲 蹟 蹟 蹟
+document_properties_label=丿爻鬲丕賵蹖夭 禺氐賵氐蹖丕鬲 蹟 蹟 蹟
+document_properties_file_name=賮丕蹖賱 賳丕賵:
+document_properties_file_size=賮丕蹖賱 爻丕蹖賽夭:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_kb}} KB ({{size_b}} bytes)
+document_properties_title=毓賳賵丕賳:
+document_properties_author=丕贀鬲诰乇
+document_properties_subject=賲賵囟賵毓:
+document_properties_keywords=賰蹖 賵俨乇趫:
+document_properties_creation_date=亘賳丕賵賳購讴 鬲兀乇蹖禺
+document_properties_modification_date=鬲亘丿蹖賱蹖 蹃購賳丿 趫丕俟丕
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{鬲兀乇蹖禺}}, {{俟丕蹖賲}}
+document_properties_creator=亘賳丕賵賳 賵賵賱:
+document_properties_producer=倬蹖 趫蹖 丕蹖賮 倬乇賵趫賵爻乇:
+document_properties_version=倬蹖 趫蹖 丕蹖賮 賵賿乇噩賳:
+document_properties_page_count=倬蹖噩 讴丕賵購賳俟:
+document_properties_close=亘賳丿
+
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=俟賵诏賱 爻丕蹖賽趫 亘丕乇
+toggle_sidebar_label=俟賵诏賱 爻丕蹖賽趫 亘丕乇
+document_outline_label=丿爻鬲丕蹠蹖夭賳 诰賽賳夭 丕贀賵俟賱丕蹖賳
+attachments.title=丕俟蹖趩賲蹖賳俟 蹃兀蹖賵
+attachments_label=丕俟蹖趩賲蹖賳俟
+thumbs.title=鬲诰賲亘賳蹖賱爻 诰丕贀賵蹖賵
+thumbs_label=鬲诰賲亘賳蹖賱爻\u0020
+findbar.title=丿爻鬲丕賵蹖夭爻 賲賳夭 賵賿趩诰蹖賵
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=氐賮丨蹠 {{氐賮丨蹠 }}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=氐賮丨購賰 鬲诰賲亘賳蹖賱\u0020
+
+# Find panel button title and messages
+find_previous.title=噩賲賱購賰 倬鬲郦蹖賵賲 賵丕賯毓卅 跇卅诰賳趫蹖賵\u0020
+find_previous_label=倬鬲賽賲
+find_next.title=噩賲賱購賰 亘蹖俨賰诰 賵丕賯毓卅 跇卅诰賳趫蹖賵\u0020
+find_next_label=亘乇賵賳俟诰
+find_highlight=鬲賲丕賲 讴賿乇蹖賵 蹃丕蹝 賱丕蹖賽俟
+find_match_case_label=讴蹖爻 讴賿乇蹖賵 賲蹖趩
+find_reached_top=氐賮丨蹃  賰爻 俟丕倬爻  倬蹖俟诰 賵卅鬲貙 亘賵賿賳卅 倬蹖俟诰卅  鬲诰兀蹖賵 噩俨乇蹖
+find_reached_bottom=氐賮丨蹃  賰爻 丌禺乇爻  倬蹖俟诰 賵卅鬲貙  蹃郦蹖乇卅 倬蹖俟诰卅 鬲诰兀賵 噩卅乇蹖
+find_not_found=噩賲賱卅 丌賵 賳卅 丕鬲诰郦蹖
+
+# Error panel labels
+error_more_info=賲夭蹖丿 賲賵賱賵賲丕鬲
+error_less_info=賰賲 賲賵賱蹠賵賲丕鬲
+error_close=亘賳丿
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=卮蹖趩诰: {{卮蹖趩诰}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=爻俟蹖賰: {{爻俟蹖賰}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=賮丕蹖賱: {{file賮丕蹖賱}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=乇賷禺: {{乇蹖禺}}
+rendering_error=氐賮丨卅 賰诰賵賱購賳 賵蹖夭郦蹖 诏卅蹖 睾賱胤蹖
+
+# Predefined zoom values
+page_scale_width=氐賮丨購賰 賰诰賻噩賻乇
+page_scale_fit=氐賮丨卅 亘乇丕亘乇
+page_scale_auto=倬俨賳俨蹖 亘趫俨賵蹖賵
+page_scale_actual=丕氐賱蹖 爻丕蹖夭
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=睾賱胤蹖
+loading_error=倬蹖 趫蹖 丕蹖賮 賰诰賵賱賻賳 賵蹖夭郦蹖 诏卅蹖 睾賱胤蹖
+invalid_file_error=賳丕讴丕乇 蹖丕 禺乇丕亘 诏兀賲賿跇 倬蹖 趫蹖 丕蹖賮 賮丕蹖賱蹟
+missing_file_error=賲蹖爻蹖賳诏 倬蹖 趫蹖 丕蹖賮 賮丕蹖賱蹟
+unexpected_response_error=睾蹖乇 賲鬲賵賯毓 爻賿乇賵乇 噩賵丕亘蹟
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{賯卅爻賲}} 丕蹖賳賵俟蹖卮賳]
+password_label=倬丕爻 賵兀乇趫 讴賿乇蹖賵 丕蹖賳俟乇 蹖蹃 倬蹖 趫蹖 丕蹖賮 賮丕蹖賱 丕賵倬賿賳 讴乇賳賿蹃 亘丕倬鬲蹟
+password_invalid=賳丕讴丕乇 倬丕爻 賵兀乇趫蹟 賲蹃乇亘兀賳蹖 讴賿乇鬲诰 讴賿乇蹖賵 丿賵亘丕乇 讴賵卮卮蹟
+password_ok=\u0020OK
+
+printing_not_supported=丌诏蹃蹖蹟 蹖鬲賻诰 亘乇丕賵蹖夭乇賻爻 趩诰購賳賻 趩诰賻倬丕賵賳卅 禺俨胤乇卅 倬賵乇卅 倬俨俟诰 鬲毓丕賵購賳
+printing_not_ready=丕贀诏兀蹃蹖: 蹖蹃 倬蹖 趫蹖 丕蹖賮 趩購诰 賳賿蹃 倬賵乇賿 倬兀俟诰 賱賵趫 倬乇蹖賳俟蹖賳诏 亘丕倬鬲蹟
+web_fonts_disabled=賵蹖亘 賮丕賳俟 趩诰 趫蹖爻蹖亘賱賿趫: 丕蹖賲亘蹖趫蹖趫 倬蹖 趫蹖 丕蹖賮 賮丕賳俟 丕爻鬲毓賲丕賱 讴乇賳賿蹃 亘丕倬鬲 讴賿乇蹖賵 丕賳蹖亘賿賱蹟
+document_colors_not_allowed=倬蹖 趫蹖 丕蹖賮 丿爻鬲丕賵蹖夭 蹃蹖讴賳 賳賿蹃 倬賳賿賳卅 乇賳诏 丕爻鬲毓賲丕賱 讴賿乇鬲诰: 倬蹖噩賳 丿賽蹖賵 丕噩丕夭鬲 倬賳賿賳卅 乇賳诏 丕爻鬲毓賲丕賱 讴乇賳爻 趩購诰 趫蹖 丕蹖讴俟蹖賵蹖俟 讴乇賳賿蹃 丕贀賲購鬲 亘乇丕賵夭乇爻 賲賳夭蹟
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ku/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ku/viewer.properties
new file mode 100644
index 0000000..c3462f6
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ku/viewer.properties
@@ -0,0 +1,146 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=R没pela ber锚
+previous_label=Pa艧ve
+next.title=R没pela p锚艧
+next_label=P锚艧
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+
+zoom_out.title=D没r bike
+zoom_out_label=D没r bike
+zoom_in.title=N锚z卯k bike
+zoom_in_label=N锚z卯k bike
+zoom.title=N锚z卯k Bike
+presentation_mode.title=Derbas卯 m没da p锚艧k锚艧kariy锚 bibe
+presentation_mode_label=Moda P锚艧k锚艧kariy锚
+open_file.title=Pel卯 veke
+open_file_label=Veke
+print.title=脟ap bike
+print_label=脟ap bike
+download.title=J锚bar bike
+download_label=J锚bar bike
+bookmark.title=Xuyakirina niha (kop卯 yan j卯 di pencereyeke n没 de veke)
+bookmark_label=Xuyakirina niha
+
+# Secondary toolbar and context menu
+tools.title=Am没r
+tools_label=Am没r
+first_page.title=Here r没pela yekem卯n
+first_page.label=Here r没pela yekem卯n
+first_page_label=Here r没pela yekem卯n
+last_page.title=Here r没pela daw卯n
+last_page.label=Here r没pela daw卯n
+last_page_label=Here r没pela daw卯n
+page_rotate_cw.title=Bi aliy锚 saet锚 ve bizivir卯ne
+page_rotate_cw.label=Bi aliy锚 saet锚 ve bizivir卯ne
+page_rotate_cw_label=Bi aliy锚 saet锚 ve bizivir卯ne
+page_rotate_ccw.title=Berevaj卯 aliy锚 saet锚 ve bizivir卯ne
+page_rotate_ccw.label=Berevaj卯 aliy锚 saet锚 ve bizivir卯ne
+page_rotate_ccw_label=Berevaj卯 aliy锚 saet锚 ve bizivir卯ne
+
+
+# Document properties dialog box
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_title=Sernav:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Darik锚 k锚lek锚 veke/bigire
+toggle_sidebar_label=Darik锚 k锚lek锚 veke/bigire
+document_outline_label=艦emaya belgey锚
+thumbs.title=W锚nekokan n卯艧an bide
+thumbs_label=W锚nekok
+findbar.title=Di belgey锚 de bib卯ne
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=R没pel {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=W锚nekoka r没pel锚 {{page}}
+
+# Find panel button title and messages
+find_previous.title=Peyva ber锚 bib卯ne
+find_previous_label=Pa艧ve
+find_next.title=Peyya p锚艧 bib卯ne
+find_next_label=P锚艧ve
+find_highlight=Tev卯 beloq bike
+find_match_case_label=Ji bo t卯p锚n h没rdek-girdek bih卯styar
+find_reached_top=Gih卯艧t ser锚 r没pel锚, ji dawiya r没pel锚 bidom卯ne
+find_reached_bottom=Gih卯艧t dawiya r没pel锚, ji ser锚 r没pel锚 bidom卯ne
+find_not_found=Peyv nehat d卯tin
+
+# Error panel labels
+error_more_info=Z锚detir agah卯
+error_less_info=Z锚detir agah卯
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js versiyon {{version}} (avan卯: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Peyam: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Komik: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Pel: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=R锚zik: {{line}}
+rendering_error=Di veh没randina r没pel锚 de 莽ewt卯 莽锚b没.
+
+# Predefined zoom values
+page_scale_width=Firehiya r没pel锚
+page_scale_fit=Di r没pel锚 de bic卯 bike
+page_scale_auto=Xweber n锚z卯k bike
+page_scale_actual=Mezinahiya rast卯n
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+
+# Loading indicator messages
+loading_error_indicator=Xelet卯
+loading_error=Dema ku PDF dihat barkirin 莽ewtiyek 莽锚b没.
+invalid_file_error=Pel锚 PDF锚 nederbasdar yan j卯 xirabe ye.
+missing_file_error=Pel锚 PDF锚 k锚m e.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[N卯艧aneya {{type}}锚]
+password_label=Ji bo PDF锚 vek卯 艧卯frey锚 biniv卯se.
+password_invalid=艦卯fre 莽ewt e. Tika ye d卯sa bicerib卯ne.
+password_ok=Temam
+
+printing_not_supported=Hi艧yar卯: 脟apkirin ji h锚la v锚 gerok锚 ve bi temam卯 nay锚 destekirin.
+printing_not_ready=Hi艧yar卯: PDF bi temam卯 nehat barkirin 没 ji bo 莽ap锚 ne amade ye.
+web_fonts_disabled=Font锚n Web锚 ne莽alak in: Font锚n PDF锚 y锚n ve艧art卯 nay锚n bikaran卯n.
+document_colors_not_allowed=Dest没r tune ye ku belgey锚n PDF锚 reng锚n xwe bi kar b卯nin: Di gerok锚 de 'dest没r锚 bide r没pelan ku reng锚n xwe bi kar b卯nin' nehatiye 莽alakirin.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/lg/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/lg/viewer.properties
new file mode 100644
index 0000000..5658d54
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/lg/viewer.properties
@@ -0,0 +1,112 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Omuko  Ogubadewo
+next.title=Omuko Oguddako
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=ku {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+
+zoom_out.title=Zimbulukusa
+zoom_out_label=Zimbulukusa
+zoom_in.title=Funza Munda
+zoom_in_label=Funza Munda
+zoom.title=Gezzamu
+open_file.title=Bikula Fayiro
+open_file_label=Ggulawo
+print.title=Fulumya
+print_label=Fulumya
+download.title=Tikula
+download_label=Tikula
+bookmark.title=Endabika eriwo (koppa oba gulawo mu diriisa epya)
+bookmark_label=Endabika Eriwo
+
+# Secondary toolbar and context menu
+
+
+# Document properties dialog box
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+document_outline_label=Ensalo ze Ekiwandiko
+thumbs.title=Laga Ekifanyi Mubufunze
+thumbs_label=Ekifanyi Mubufunze
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Omuko {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Ekifananyi kyo Omuko Mubufunze {{page}}
+
+# Find panel button title and messages
+find_previous.title=Zuula awayise mukweddamu mumiteddera
+find_next.title=Zuula ekidako mukweddamu mumiteddera
+find_highlight=Londa byonna
+find_not_found=Emiteddera tezuuliddwa
+
+# Error panel labels
+error_more_info=Ebisingawo
+error_less_info=Mubumpimpi
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Obubaaka: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Ebipangiddwa: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Fayiro {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Layini: {{line}}
+rendering_error=Wabadewo ensobi muku tekawo omuko.
+
+# Predefined zoom values
+page_scale_width=Obugazi bwo Omuko
+page_scale_fit=Okutuka kwo Omuko
+page_scale_auto=Okwefunza no Kwegeza
+page_scale_actual=Obunene Obutufu
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+
+# Loading indicator messages
+loading_error_indicator=Ensobi
+loading_error=Wabadewo ensobi mukutika PDF.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Enyonyola]
+password_ok=OK
+
+printing_not_supported=Okulaabula: Okulumya empapula tekuwagirwa enonyeso enno.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/lij/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/lij/viewer.properties
new file mode 100644
index 0000000..f0a7771
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/lij/viewer.properties
@@ -0,0 +1,242 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Pagina primma
+previous_label=Precedente
+next.title=Pagina d貌ppo
+next_label=Pr貌scima
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=Pagina
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=de {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} de {{pagesCount}})
+
+zoom_out.title=Diminoisci zoom
+zoom_out_label=Diminoisci zoom
+zoom_in.title=Aomenta zoom
+zoom_in_label=Aomenta zoom
+zoom.title=Zoom
+presentation_mode.title=Vanni into m貌ddo de prezenta莽ion
+presentation_mode_label=M貌ddo de prezenta莽ion
+open_file.title=Arvi file
+open_file_label=Arvi
+print.title=Stanpa
+print_label=Stanpa
+download.title=Descaregamento
+download_label=Descaregamento
+bookmark.title=Vixon corente (c貌pia 貌 arvi inte 'n neuvo barcon)
+bookmark_label=Vixon corente
+
+# Secondary toolbar and context menu
+tools.title=Strumenti
+tools_label=Strumenti
+first_page.title=Vanni a-a primma pagina
+first_page.label=Vanni a-a primma pagina
+first_page_label=Vanni a-a primma pagina
+last_page.title=Vanni a l'urtima pagina
+last_page.label=Vanni a l'urtima pagina
+last_page_label=Vanni a l'urtima pagina
+page_rotate_cw.title=Gia into verso oraio
+page_rotate_cw.label=Gia in senso do releuio
+page_rotate_cw_label=Gia into verso oraio
+page_rotate_ccw.title=Gia into verso antioraio
+page_rotate_ccw.label=Gia in senso do releuio a-a reversa
+page_rotate_ccw_label=Gia into verso antioraio
+
+cursor_text_select_tool.title=Abilita strumento de sele莽ion do testo
+cursor_text_select_tool_label=Strumento de sele莽ion do testo
+cursor_hand_tool.title=Abilita strumento man
+cursor_hand_tool_label=Strumento man
+
+scroll_vertical.title=Deuvia rebelamento verticale
+scroll_vertical_label=Rebelamento verticale
+scroll_horizontal.title=Deuvia rebelamento orizont芒
+scroll_horizontal_label=Rebelamento orizont芒
+scroll_wrapped.title=Deuvia rebelamento incapsolou
+scroll_wrapped_label=Rebelamento incapsolou
+
+spread_none.title=No unite a-a difuxon de pagina
+spread_none_label=No difuxon
+spread_odd.title=Uniscite a-a difuxon de pagina co-o numero d猫spa
+spread_odd_label=Difuxon d猫spa
+spread_even.title=Uniscite a-a difuxon de pagina co-o numero pari
+spread_even_label=Difuxon pari
+
+# Document properties dialog box
+document_properties.title=Propiet忙 do documento鈥�
+document_properties_label=Propiet忙 do documento鈥�
+document_properties_file_name=Nomme file:
+document_properties_file_size=Dimenscion file:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} kB ({{size_b}} byte)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} byte)
+document_properties_title=Titolo:
+document_properties_author=Aoto:
+document_properties_subject=Ogetto:
+document_properties_keywords=Par貌lle ciave:
+document_properties_creation_date=D忙ta crea莽ion:
+document_properties_modification_date=D忙ta cangiamento:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Aot么 originale:
+document_properties_producer=Produt么 PDF:
+document_properties_version=Verscion PDF:
+document_properties_page_count=Contezzo pagine:
+document_properties_page_size=Dimenscion da pagina:
+document_properties_page_size_unit_inches=dii gr貌sci
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=drito
+document_properties_page_size_orientation_landscape=desteizo
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Letia
+document_properties_page_size_name_legal=Lezze
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=Vista veloce do Web:
+document_properties_linearized_yes=Sci
+document_properties_linearized_no=No
+document_properties_close=S忙ra
+
+print_progress_message=Praparo o documento pe-a stanpa鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=Anulla
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Ativa/dizativa bara de scianco
+toggle_sidebar_notification.title=Cangia bara de l枚o (o documento o contegne di aleg忙)
+toggle_sidebar_label=Ativa/dizativa bara de scianco
+document_outline.title=Fanni vedde o contorno do documento (scicca doggio pe espande/ridue tutti i elementi)
+document_outline_label=Contorno do documento
+attachments.title=Fanni vedde aleg忙
+attachments_label=Aleg忙
+thumbs.title=Mostra miniatue
+thumbs_label=Miniatue
+findbar.title=Treuva into documento
+findbar_label=Treuva
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Pagina {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Miniatua da pagina {{page}}
+
+# Find panel button title and messages
+find_input.title=Treuva
+find_input.placeholder=Treuva into documento鈥�
+find_previous.title=Treuva a ripeti莽ion precedente do testo da 莽erc芒
+find_previous_label=Precedente
+find_next.title=Treuva a ripeti莽ion d貌ppo do testo da 莽erc芒
+find_next_label=Segoente
+find_highlight=Eviden莽ia
+find_match_case_label=Maioscole/minoscole
+find_entire_word_label=Poula intrega
+find_reached_top=Razonto a fin da pagina, continoa da l'ini莽io
+find_reached_bottom=Razonto l'ini莽io da pagina, continoa da-a fin
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]={{current}} de {{total}} corispondensa
+find_match_count[two]={{current}} de {{total}} corispondense
+find_match_count[few]={{current}} de {{total}} corispondense
+find_match_count[many]={{current}} de {{total}} corispondense
+find_match_count[other]={{current}} de {{total}} corispondense
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]=Ci霉 de {{limit}} corispondense
+find_match_count_limit[one]=Ci霉 de {{limit}} corispondensa
+find_match_count_limit[two]=Ci霉 de {{limit}} corispondense
+find_match_count_limit[few]=Ci霉 de {{limit}} corispondense
+find_match_count_limit[many]=Ci霉 de {{limit}} corispondense
+find_match_count_limit[other]=Ci霉 de {{limit}} corispondense
+find_not_found=Testo no trovou
+
+# Error panel labels
+error_more_info=Ci霉 informa莽ioin
+error_less_info=Meno informa莽ioin
+error_close=S忙ra
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Mesaggio: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stack: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=File: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Linia: {{line}}
+rendering_error=Gh'茅 st忙to 'n'er么 itno rendering da pagina.
+
+# Predefined zoom values
+page_scale_width=Larghessa pagina
+page_scale_fit=Adatta a una pagina
+page_scale_auto=Zoom aotomatico
+page_scale_actual=Dimenscioin efetive
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Er么
+loading_error=S'茅 verificou 'n'er么 itno caregamento do PDF.
+invalid_file_error=O file PDF o l'茅 no valido 貌 aroinou.
+missing_file_error=O file PDF o no gh'茅.
+unexpected_response_error=Risposta inprevista do-u server
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[Anota莽ion: {{type}}]
+password_label=Dimme a par貌lla segreta pe arv卯 sto file PDF.
+password_invalid=Par貌lla segreta sbalia. Preuva torna.
+password_ok=Va ben
+password_cancel=Anulla
+
+printing_not_supported=Aten莽ion: a stanpa a no l'茅 conpletamente soport芒 da sto navegat么.
+printing_not_ready=Aten莽ion: o PDF o no l'茅 ancon caregou conpletamente pe-a stanpa.
+web_fonts_disabled=I font do web en dizativ忙: inposcibile adeuvi芒 i carateri do PDF.
+document_colors_not_allowed=No l'茅 poscibile adeuvi芒 i pr貌pi co卯 pe-i documenti PDF: l'op莽ion do navegat么  鈥淧ermetti a-e pagine de 莽erne i pr貌pi co卯 in cangio de quelli inpost忙鈥� a l'茅 dizativ芒.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/lo/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/lo/viewer.properties
new file mode 100644
index 0000000..00d3309
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/lo/viewer.properties
@@ -0,0 +1,152 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=嗪簷嗷夃翰嗪佮粓嗪簷嗪簷嗷夃翰
+previous_label=嗪佮粓嗪簷嗪簷嗷夃翰
+next.title=嗪簷嗷夃翰嗪栢罕嗪斷粍嗪�
+next_label=嗪栢罕嗪斷粍嗪�
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=嗪簷嗷夃翰
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=嗪堗翰嗪� {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} 嗪堗翰嗪� {{pagesCount}})
+
+zoom_out.title=嗪傕喊嗪簫嗪侧簫嗪涵嗪�
+zoom_out_label=嗪傕喊嗪簫嗪侧簫嗪涵嗪�
+zoom_in.title=嗪傕喊嗪簫嗪侧簫嗷�嗪傕夯嗷夃翰
+zoom_in_label=嗪傕喊嗪簫嗪侧簫嗷�嗪傕夯嗷夃翰
+zoom.title=嗪傕喊嗪簫嗪侧簫
+presentation_mode.title=嗪罕嗪氞簺嗷堗航嗪權粈嗪涏罕嗪權粋嗪骸嗪斷簛嗪侧簷嗪權撼嗪喊嗷�嗪簷嗪�
+presentation_mode_label=嗷傕韩嗪∴簲嗪佮翰嗪權簷嗪赤邯嗪班粈嗪簷嗪�
+open_file.title=嗷�嗪涏旱嗪斷粍嗪熰亥嗷�
+open_file_label=嗷�嗪涏旱嗪�
+print.title=嗪炧捍嗪�
+print_label=嗪炧捍嗪�
+download.title=嗪斷翰嗪о粋嗪亥嗪�
+download_label=嗪斷翰嗪о粋嗪亥嗪�
+bookmark.title=嗪∴焊嗪∴骸嗪簢嗪涏喊嗪堗焊嗪氞罕嗪� (嗪撼嗷�嗪權夯嗪� 嗪亥嗪� 嗷�嗪涏旱嗪斷粌嗪權骇嗪脆簷嗷傕簲嗷冟韩嗪∴粓)
+bookmark_label=嗪∴焊嗪∴骸嗪簢嗪涏喊嗪堗焊嗪氞罕嗪�
+
+# Secondary toolbar and context menu
+tools.title=嗷�嗪勦悍嗷堗涵嗪囙骸嗪�
+tools_label=嗷�嗪勦悍嗷堗涵嗪囙骸嗪�
+first_page.title=嗷勦簺嗪椸旱嗷堗韩嗪權粔嗪侧簵嗪赤涵嗪脆簲
+first_page.label=嗷勦簺嗪椸旱嗷堗韩嗪權粔嗪侧簵嗪赤涵嗪脆簲
+first_page_label=嗷勦簺嗪椸旱嗷堗韩嗪權粔嗪侧簵嗪赤涵嗪脆簲
+last_page.title=嗷勦簺嗪椸旱嗷堗韩嗪權粔嗪侧邯嗪膏簲嗪椸粔嗪侧簫
+last_page.label=嗷勦簺嗪椸旱嗷堗韩嗪權粔嗪侧邯嗪膏簲嗪椸粔嗪侧簫
+last_page_label=嗷勦簺嗪椸旱嗷堗韩嗪權粔嗪侧邯嗪膏簲嗪椸粔嗪侧簫
+page_rotate_cw.title=嗪骸嗪灌簷嗪曕翰嗪∴粈嗪傕罕嗪∴粋嗪∴簢
+page_rotate_cw.label=嗪骸嗪灌簷嗪曕翰嗪∴粈嗪傕罕嗪∴粋嗪∴簢
+page_rotate_cw_label=嗪骸嗪灌簷嗪曕翰嗪∴粈嗪傕罕嗪∴粋嗪∴簢
+page_rotate_ccw.title=嗪骸嗪灌簷嗪椸骇嗪權粈嗪傕罕嗪∴粋嗪∴簢
+page_rotate_ccw.label=嗪骸嗪灌簷嗪椸骇嗪權粈嗪傕罕嗪∴粋嗪∴簢
+page_rotate_ccw_label=嗪骸嗪灌簷嗪椸骇嗪權粈嗪傕罕嗪∴粋嗪∴簢
+
+
+
+
+# Document properties dialog box
+document_properties_file_name=嗪娻悍嗷堗粍嗪熰亥嗷�:
+document_properties_file_size=嗪傕喊嗪簷嗪侧簲嗷勦簾嗪ム粚:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_page_size_unit_inches=in
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=嗪ム骇嗪囙簳嗪编粔嗪�
+document_properties_page_size_orientation_landscape=嗪ム骇嗪囙簷嗪簷
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=嗪堗夯嗪斷粷嗪侧簫
+document_properties_page_size_name_legal=嗪傕粛嗷夃簛嗪秽簲嗪骸嗪侧簫
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_close=嗪涏捍嗪�
+
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_close=嗪嵿夯嗪佮粈嗪ム旱嗪�
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=嗷�嗪涏旱嗪�/嗪涏捍嗪斷粊嗪栢簹嗪傕粔嗪侧簢
+toggle_sidebar_notification.title=嗷�嗪涏旱嗪�/嗪涏捍嗪斷粊嗪栢簹嗪傕粔嗪侧簢 (嗷�嗪簛嗪班邯嗪侧簷嗪∴旱嗷�嗪勦夯嗷夃翰嗪粓嗪侧簢/嗷勦簾嗪ム粚嗷佮簷嗪�)
+toggle_sidebar_label=嗷�嗪涏旱嗪�/嗪涏捍嗪斷粊嗪栢簹嗪傕粔嗪侧簢
+document_outline_label=嗷�嗪勦夯嗷夃翰嗪粓嗪侧簢嗷�嗪簛嗪班邯嗪侧簷
+findbar_label=嗪勦夯嗷夃簷嗪翰
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+
+# Find panel button title and messages
+find_input.title=嗪勦夯嗷夃簷嗪翰
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+
+# Error panel labels
+error_more_info=嗪傕粛嗷夃骸嗪灌簷嗷�嗪炧旱嗷堗骸嗷�嗪曕旱嗪�
+error_less_info=嗪傕粛嗷夃骸嗪灌簷嗪權粔嗪簫嗪ム夯嗪�
+error_close=嗪涏捍嗪�
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+rendering_error=嗪∴旱嗪傕粛嗷夃簻嗪脆簲嗪炧翰嗪斷粈嗪佮旱嗪斷簜嗪粪粔嗪權簜嗪班簷嗪班簵嗪掂粓嗪佮撼嗪ム罕嗪囙粈嗪`罕嗪權粈嗪斷旱嗪簷嗷夃翰.
+
+# Predefined zoom values
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+
+# Loading indicator messages
+loading_error_indicator=嗪傕粛嗷夃簻嗪脆簲嗪炧翰嗪�
+loading_error=嗪∴旱嗪傕粛嗷夃簻嗪脆簲嗪炧翰嗪斷粈嗪佮旱嗪斷簜嗪粪粔嗪權簜嗪班簷嗪班簵嗪掂粓嗪佮撼嗪ム罕嗪囙粋嗪亥嗪� PDF.
+invalid_file_error=嗷勦簾嗪ム粚 PDF 嗪氞粛嗷堗簴嗪粪簛嗪曕粔嗪簢嗪亥嗪粪粈嗪簫嗪翰嗪�.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+password_ok=嗪曕夯嗪佮亥嗪秽簢
+password_cancel=嗪嵿夯嗪佮粈嗪ム旱嗪�
+
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/locale.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/locale.properties
new file mode 100644
index 0000000..1ae959f
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/locale.properties
@@ -0,0 +1,369 @@
+[ach]
+@import url(ach/viewer.properties)
+
+[af]
+@import url(af/viewer.properties)
+
+[ak]
+@import url(ak/viewer.properties)
+
+[an]
+@import url(an/viewer.properties)
+
+[ar]
+@import url(ar/viewer.properties)
+
+[as]
+@import url(as/viewer.properties)
+
+[ast]
+@import url(ast/viewer.properties)
+
+[az]
+@import url(az/viewer.properties)
+
+[be]
+@import url(be/viewer.properties)
+
+[bg]
+@import url(bg/viewer.properties)
+
+[bn-BD]
+@import url(bn-BD/viewer.properties)
+
+[bn-IN]
+@import url(bn-IN/viewer.properties)
+
+[br]
+@import url(br/viewer.properties)
+
+[brx]
+@import url(brx/viewer.properties)
+
+[bs]
+@import url(bs/viewer.properties)
+
+[ca]
+@import url(ca/viewer.properties)
+
+[cak]
+@import url(cak/viewer.properties)
+
+[crh]
+@import url(crh/viewer.properties)
+
+[cs]
+@import url(cs/viewer.properties)
+
+[csb]
+@import url(csb/viewer.properties)
+
+[cy]
+@import url(cy/viewer.properties)
+
+[da]
+@import url(da/viewer.properties)
+
+[de]
+@import url(de/viewer.properties)
+
+[el]
+@import url(el/viewer.properties)
+
+[en-CA]
+@import url(en-CA/viewer.properties)
+
+[en-GB]
+@import url(en-GB/viewer.properties)
+
+[en-US]
+@import url(en-US/viewer.properties)
+
+[en-ZA]
+@import url(en-ZA/viewer.properties)
+
+[eo]
+@import url(eo/viewer.properties)
+
+[es-AR]
+@import url(es-AR/viewer.properties)
+
+[es-CL]
+@import url(es-CL/viewer.properties)
+
+[es-ES]
+@import url(es-ES/viewer.properties)
+
+[es-MX]
+@import url(es-MX/viewer.properties)
+
+[et]
+@import url(et/viewer.properties)
+
+[eu]
+@import url(eu/viewer.properties)
+
+[fa]
+@import url(fa/viewer.properties)
+
+[ff]
+@import url(ff/viewer.properties)
+
+[fi]
+@import url(fi/viewer.properties)
+
+[fr]
+@import url(fr/viewer.properties)
+
+[fy-NL]
+@import url(fy-NL/viewer.properties)
+
+[ga-IE]
+@import url(ga-IE/viewer.properties)
+
+[gd]
+@import url(gd/viewer.properties)
+
+[gl]
+@import url(gl/viewer.properties)
+
+[gn]
+@import url(gn/viewer.properties)
+
+[gu-IN]
+@import url(gu-IN/viewer.properties)
+
+[he]
+@import url(he/viewer.properties)
+
+[hi-IN]
+@import url(hi-IN/viewer.properties)
+
+[hr]
+@import url(hr/viewer.properties)
+
+[hsb]
+@import url(hsb/viewer.properties)
+
+[hto]
+@import url(hto/viewer.properties)
+
+[hu]
+@import url(hu/viewer.properties)
+
+[hy-AM]
+@import url(hy-AM/viewer.properties)
+
+[ia]
+@import url(ia/viewer.properties)
+
+[id]
+@import url(id/viewer.properties)
+
+[is]
+@import url(is/viewer.properties)
+
+[it]
+@import url(it/viewer.properties)
+
+[ja]
+@import url(ja/viewer.properties)
+
+[ka]
+@import url(ka/viewer.properties)
+
+[kab]
+@import url(kab/viewer.properties)
+
+[kk]
+@import url(kk/viewer.properties)
+
+[km]
+@import url(km/viewer.properties)
+
+[kn]
+@import url(kn/viewer.properties)
+
+[ko]
+@import url(ko/viewer.properties)
+
+[kok]
+@import url(kok/viewer.properties)
+
+[ks]
+@import url(ks/viewer.properties)
+
+[ku]
+@import url(ku/viewer.properties)
+
+[lg]
+@import url(lg/viewer.properties)
+
+[lij]
+@import url(lij/viewer.properties)
+
+[lo]
+@import url(lo/viewer.properties)
+
+[lt]
+@import url(lt/viewer.properties)
+
+[ltg]
+@import url(ltg/viewer.properties)
+
+[lv]
+@import url(lv/viewer.properties)
+
+[mai]
+@import url(mai/viewer.properties)
+
+[meh]
+@import url(meh/viewer.properties)
+
+[mk]
+@import url(mk/viewer.properties)
+
+[ml]
+@import url(ml/viewer.properties)
+
+[mn]
+@import url(mn/viewer.properties)
+
+[mr]
+@import url(mr/viewer.properties)
+
+[ms]
+@import url(ms/viewer.properties)
+
+[my]
+@import url(my/viewer.properties)
+
+[nb-NO]
+@import url(nb-NO/viewer.properties)
+
+[ne-NP]
+@import url(ne-NP/viewer.properties)
+
+[nl]
+@import url(nl/viewer.properties)
+
+[nn-NO]
+@import url(nn-NO/viewer.properties)
+
+[nso]
+@import url(nso/viewer.properties)
+
+[oc]
+@import url(oc/viewer.properties)
+
+[or]
+@import url(or/viewer.properties)
+
+[pa-IN]
+@import url(pa-IN/viewer.properties)
+
+[pl]
+@import url(pl/viewer.properties)
+
+[pt-BR]
+@import url(pt-BR/viewer.properties)
+
+[pt-PT]
+@import url(pt-PT/viewer.properties)
+
+[rm]
+@import url(rm/viewer.properties)
+
+[ro]
+@import url(ro/viewer.properties)
+
+[ru]
+@import url(ru/viewer.properties)
+
+[rw]
+@import url(rw/viewer.properties)
+
+[sah]
+@import url(sah/viewer.properties)
+
+[sat]
+@import url(sat/viewer.properties)
+
+[si]
+@import url(si/viewer.properties)
+
+[sk]
+@import url(sk/viewer.properties)
+
+[sl]
+@import url(sl/viewer.properties)
+
+[son]
+@import url(son/viewer.properties)
+
+[sq]
+@import url(sq/viewer.properties)
+
+[sr]
+@import url(sr/viewer.properties)
+
+[sv-SE]
+@import url(sv-SE/viewer.properties)
+
+[sw]
+@import url(sw/viewer.properties)
+
+[ta]
+@import url(ta/viewer.properties)
+
+[ta-LK]
+@import url(ta-LK/viewer.properties)
+
+[te]
+@import url(te/viewer.properties)
+
+[th]
+@import url(th/viewer.properties)
+
+[tl]
+@import url(tl/viewer.properties)
+
+[tn]
+@import url(tn/viewer.properties)
+
+[tr]
+@import url(tr/viewer.properties)
+
+[tsz]
+@import url(tsz/viewer.properties)
+
+[uk]
+@import url(uk/viewer.properties)
+
+[ur]
+@import url(ur/viewer.properties)
+
+[uz]
+@import url(uz/viewer.properties)
+
+[vi]
+@import url(vi/viewer.properties)
+
+[wo]
+@import url(wo/viewer.properties)
+
+[xh]
+@import url(xh/viewer.properties)
+
+[zam]
+@import url(zam/viewer.properties)
+
+[zh-CN]
+@import url(zh-CN/viewer.properties)
+
+[zh-TW]
+@import url(zh-TW/viewer.properties)
+
+[zu]
+@import url(zu/viewer.properties)
+
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/lt/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/lt/viewer.properties
new file mode 100644
index 0000000..3cb76ed
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/lt/viewer.properties
@@ -0,0 +1,242 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Ankstesnis puslapis
+previous_label=Ankstesnis
+next.title=Kitas puslapis
+next_label=Kitas
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=Puslapis
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=i拧 {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} i拧 {{pagesCount}})
+
+zoom_out.title=Suma啪inti
+zoom_out_label=Suma啪inti
+zoom_in.title=Padidinti
+zoom_in_label=Padidinti
+zoom.title=Mastelis
+presentation_mode.title=Pereiti 寞 pateikties veiksen膮
+presentation_mode_label=Pateikties veiksena
+open_file.title=Atverti fail膮
+open_file_label=Atverti
+print.title=Spausdinti
+print_label=Spausdinti
+download.title=Parsi懦sti
+download_label=Parsi懦sti
+bookmark.title=Esamojo rodinio saitas (kopijavimui ar atv臈rimui kitame lange)
+bookmark_label=Esamasis rodinys
+
+# Secondary toolbar and context menu
+tools.title=Priemon臈s
+tools_label=Priemon臈s
+first_page.title=Eiti 寞 pirm膮 puslap寞
+first_page.label=Eiti 寞 pirm膮 puslap寞
+first_page_label=Eiti 寞 pirm膮 puslap寞
+last_page.title=Eiti 寞 paskutin寞 puslap寞
+last_page.label=Eiti 寞 paskutin寞 puslap寞
+last_page_label=Eiti 寞 paskutin寞 puslap寞
+page_rotate_cw.title=Pasukti pagal laikrod啪io rodykl臋
+page_rotate_cw.label=Pasukti pagal laikrod啪io rodykl臋
+page_rotate_cw_label=Pasukti pagal laikrod啪io rodykl臋
+page_rotate_ccw.title=Pasukti prie拧 laikrod啪io rodykl臋
+page_rotate_ccw.label=Pasukti prie拧 laikrod啪io rodykl臋
+page_rotate_ccw_label=Pasukti prie拧 laikrod啪io rodykl臋
+
+cursor_text_select_tool.title=漠jungti teksto 啪ym臈jimo 寞rank寞
+cursor_text_select_tool_label=Teksto 啪ym臈jimo 寞rankis
+cursor_hand_tool.title=漠jungti vilkimo 寞rank寞
+cursor_hand_tool_label=Vilkimo 寞rankis
+
+scroll_vertical.title=Naudoti vertikal懦 slinkim膮
+scroll_vertical_label=Vertikalus slinkimas
+scroll_horizontal.title=Naudoti horizontal懦 slinkim膮
+scroll_horizontal_label=Horizontalus slinkimas
+scroll_wrapped.title=Naudoti i拧klot膮 slinkim膮
+scroll_wrapped_label=I拧klotas slinkimas
+
+spread_none.title=Nesujungti puslapi懦 sklaid懦
+spread_none_label=Be sklaid懦
+spread_odd.title=Sujungti puslapi懦 sklaidas pradedant nelyginiais puslapiais
+spread_odd_label=Nelygin臈s sklaidos
+spread_even.title=Sujungti puslapi懦 sklaidas pradedant lyginiais puslapiais
+spread_even_label=Lygin臈s sklaidos
+
+# Document properties dialog box
+document_properties.title=Dokumento savyb臈s鈥�
+document_properties_label=Dokumento savyb臈s鈥�
+document_properties_file_name=Failo vardas:
+document_properties_file_size=Failo dydis:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} B)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} B)
+document_properties_title=Antra拧t臈:
+document_properties_author=Autorius:
+document_properties_subject=Tema:
+document_properties_keywords=Reik拧miniai 啪od啪iai:
+document_properties_creation_date=Suk奴rimo data:
+document_properties_modification_date=Modifikavimo data:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=K奴r臈jas:
+document_properties_producer=PDF generatorius:
+document_properties_version=PDF versija:
+document_properties_page_count=Puslapi懦 skai膷ius:
+document_properties_page_size=Puslapio dydis:
+document_properties_page_size_unit_inches=in
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=sta膷ias
+document_properties_page_size_orientation_landscape=guls膷ias
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Lai拧kas
+document_properties_page_size_name_legal=Dokumentas
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=Spartus 啪iniatinklio rodinys:
+document_properties_linearized_yes=Taip
+document_properties_linearized_no=Ne
+document_properties_close=U啪verti
+
+print_progress_message=Dokumentas ruo拧iamas spausdinimui鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=Atsisakyti
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Rodyti / sl臈pti 拧onin寞 polang寞
+toggle_sidebar_notification.title=Parankin臈 (dokumentas turi strukt奴r膮 / pried懦)
+toggle_sidebar_label=艩oninis polangis
+document_outline.title=Rodyti dokumento strukt奴r膮 (spustel臈kite dukart nor臈dami i拧pl臈sti/suskleisti visus elementus)
+document_outline_label=Dokumento strukt奴ra
+attachments.title=Rodyti priedus
+attachments_label=Priedai
+thumbs.title=Rodyti puslapi懦 miniati奴ras
+thumbs_label=Miniati奴ros
+findbar.title=Ie拧koti dokumente
+findbar_label=Rasti
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title={{page}} puslapis
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas={{page}} puslapio miniati奴ra
+
+# Find panel button title and messages
+find_input.title=Rasti
+find_input.placeholder=Rasti dokumente鈥�
+find_previous.title=Ie拧koti ankstesnio fraz臈s egzemplioriaus
+find_previous_label=Ankstesnis
+find_next.title=Ie拧koti tolesnio fraz臈s egzemplioriaus
+find_next_label=Tolesnis
+find_highlight=Visk膮 pary拧kinti
+find_match_case_label=Skirti did啪i膮sias ir ma啪膮sias raides
+find_entire_word_label=I拧tisi 啪od啪iai
+find_reached_top=Pasiekus dokumento prad啪i膮, paie拧ka prat臋sta nuo pabaigos
+find_reached_bottom=Pasiekus dokumento pabaig膮, paie拧ka prat臋sta nuo prad啪ios
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]={{current}} i拧 {{total}} atitikmens
+find_match_count[two]={{current}} i拧 {{total}} atitikmen懦
+find_match_count[few]={{current}} i拧 {{total}} atitikmen懦
+find_match_count[many]={{current}} i拧 {{total}} atitikmen懦
+find_match_count[other]={{current}} i拧 {{total}} atitikmens
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]=Daugiau nei {{limit}} atitikmen懦
+find_match_count_limit[one]=Daugiau nei {{limit}} atitikmuo
+find_match_count_limit[two]=Daugiau nei {{limit}} atitikmenys
+find_match_count_limit[few]=Daugiau nei {{limit}} atitikmenys
+find_match_count_limit[many]=Daugiau nei {{limit}} atitikmen懦
+find_match_count_limit[other]=Daugiau nei {{limit}} atitikmuo
+find_not_found=Ie拧koma fraz臈 nerasta
+
+# Error panel labels
+error_more_info=I拧samiau
+error_less_info=Glaus膷iau
+error_close=U啪verti
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v. {{version}} (darinys: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Prane拧imas: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=D臈klas: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Failas: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Eilut臈: {{line}}
+rendering_error=Atvaizduojant puslap寞 寞vyko klaida.
+
+# Predefined zoom values
+page_scale_width=Priderinti prie lapo plo膷io
+page_scale_fit=Pritaikyti prie lapo dyd啪io
+page_scale_auto=Automatinis mastelis
+page_scale_actual=Tikras dydis
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Klaida
+loading_error=漠keliant PDF fail膮 寞vyko klaida.
+invalid_file_error=Tai n臈ra PDF failas arba jis yra sugadintas.
+missing_file_error=PDF failas nerastas.
+unexpected_response_error=Netik臈tas serverio atsakas.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[鈥瀧{type}}鈥� tipo anotacija]
+password_label=漠veskite slapta啪od寞 拧iam PDF failui atverti.
+password_invalid=Slapta啪odis neteisingas. Bandykite dar kart膮.
+password_ok=Gerai
+password_cancel=Atsisakyti
+
+printing_not_supported=D臈mesio! Spausdinimas 拧ioje nar拧ykl臈je n臈ra pilnai realizuotas.
+printing_not_ready=D臈mesio! PDF failas dar n臈ra pilnai 寞keltas spausdinimui.
+web_fonts_disabled=Saityno 拧riftai i拧jungti 鈥� PDF faile esan膷i懦 拧rift懦 naudoti negalima.
+document_colors_not_allowed=PDF dokumentams neleid啪iama nurodyti savo spalv懦, nes i拧jungta nar拧ykl臈s nuostata 鈥濴eisti tinklalapiams nurodyti spalvas鈥�.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ltg/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ltg/viewer.properties
new file mode 100644
index 0000000..ecdb723
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ltg/viewer.properties
@@ -0,0 +1,220 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=莫pr墨k拧ej膩 lopa
+previous_label=莫pr墨k拧ej膩
+next.title=Nuokomuo lopa
+next_label=Nuokomuo
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=Lopa
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=nu {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} nu {{pagesCount}})
+
+zoom_out.title=Attuolynuot 
+zoom_out_label=Attuolynuot
+zoom_in.title=P墨tuvynuot
+zoom_in_label=P墨tuvynuot
+zoom.title=Palelynuojums
+presentation_mode.title=Puorsl膿gt墨s iz Prezentacejis re啪ymu
+presentation_mode_label=Prezentacejis re啪yms
+open_file.title=Attaiseit failu
+open_file_label=Attaiseit
+print.title=Drukuo拧ona
+print_label=Druk艒t
+download.title=Lejup墨luode
+download_label=Lejup墨luodeit
+bookmark.title=Po拧reizejais skots (kop膿t voi attaiseit jaun膩 l奴g膩)
+bookmark_label=Po拧reizejais skots
+
+# Secondary toolbar and context menu
+tools.title=Reiki
+tools_label=Reiki
+first_page.title=莫t iz pyrm奴 lopu
+first_page.label=莫t iz pyrm奴 lopu
+first_page_label=莫t iz pyrm奴 lopu
+last_page.title=莫t iz piedej奴 lopu
+last_page.label=莫t iz piedej奴 lopu
+last_page_label=莫t iz piedej奴 lopu
+page_rotate_cw.title=Pagr墨zt pa pulksteni
+page_rotate_cw.label=Pagr墨zt pa pulksteni
+page_rotate_cw_label=Pagr墨zt pa pulksteni
+page_rotate_ccw.title=Pagr墨zt pret pulksteni
+page_rotate_ccw.label=Pagr墨zt pret pulksteni
+page_rotate_ccw_label=Pagr墨zt pret pulksteni
+
+cursor_text_select_tool.title=Aktiviz膿t teksta izvieles reiku
+cursor_text_select_tool_label=Teksta izvieles reiks
+cursor_hand_tool.title=Aktiv膿t r奴kys reiku
+cursor_hand_tool_label=R奴kys reiks
+
+scroll_vertical.title=Izmont艒t vertikal奴 ritin艒拧onu
+scroll_vertical_label=Vertikal艒 ritin艒拧ona
+scroll_horizontal.title=Izmont艒t horizontal奴 ritin艒拧onu
+scroll_horizontal_label=Horizontal艒 ritin艒拧ona
+scroll_wrapped.title=Izmont艒t m膩r奴gojam奴 ritin艒拧onu
+scroll_wrapped_label=M膩r奴gojam艒 ritin艒拧ona
+
+spread_none.title=Naizmont艒t lopu atv膩ruma re啪imu
+spread_none_label=Bez atv膩rumim
+spread_odd.title=Izmont艒t lopu atv膩rumus s艒kut nu nap艒ra numeru lopom
+spread_odd_label=Nap艒ra lopys pa kreisi
+spread_even.title=Izmont艒t lopu atv膩rumus s艒kut nu p艒ra numeru lopom
+spread_even_label=P艒ra lopys pa kreisi
+
+# Document properties dialog box
+document_properties.title=Dokumenta 墨statiejumi鈥�
+document_properties_label=Dokumenta 墨statiejumi鈥�
+document_properties_file_name=Faila n奴saukums:
+document_properties_file_size=Faila izm膩rs:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} biti)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} biti)
+document_properties_title=N奴saukums:
+document_properties_author=Autors:
+document_properties_subject=Tema:
+document_properties_keywords=Atsl膩gi vuordi:
+document_properties_creation_date=Izveides datums:
+document_properties_modification_date=lobuo拧onys datums:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Radeituojs:
+document_properties_producer=PDF producents:
+document_properties_version=PDF verseja:
+document_properties_page_count=Lopu skaits:
+document_properties_page_size=Lopas izm膩rs:
+document_properties_page_size_unit_inches=collas
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=portreta orientaceja
+document_properties_page_size_orientation_landscape=ainovys orientaceja
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Letter
+document_properties_page_size_name_legal=Legal
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=Fast Web View:
+document_properties_linearized_yes=J膩
+document_properties_linearized_no=N膩
+document_properties_close=Aiztaiseit
+
+print_progress_message=Preparing document for printing鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=Atce募t
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Puorsl膿gt suonu j奴slu
+toggle_sidebar_notification.title=Toggle Sidebar (document contains outline/attachments)
+toggle_sidebar_label=Puorsl膿gt suonu j奴slu
+document_outline.title=Show Document Outline (double-click to expand/collapse all items)
+document_outline_label=Dokumenta saturs
+attachments.title=Show Attachments
+attachments_label=Attachments
+thumbs.title=Paruodeit seikt膩lus
+thumbs_label=Seikt膩li
+findbar.title=Mekleit dokument膩
+findbar_label=Mekleit
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Lopa {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Lopys {{page}} seikt膩ls
+
+# Find panel button title and messages
+find_input.title=Mekleit
+find_input.placeholder=Mekleit dokument膩鈥�
+find_previous.title=Atrast 墨pr墨k拧ej奴
+find_previous_label=莫pr墨k拧ej膩
+find_next.title=Atrast nuokam奴
+find_next_label=Nuokomuo
+find_highlight=莫kruosuot vysys
+find_match_case_label=Lel奴, moz奴 burtu jiuteigs
+find_reached_top=Sasn墨gts dokumenta suokums, turpynojom nu beigom
+find_reached_bottom=Sasn墨gtys dokumenta beigys, turpynojom nu suokuma
+find_not_found=Fr膩ze nav atrosta
+
+# Error panel labels
+error_more_info=Vairuok informacejis
+error_less_info=mozuok informacejis
+error_close=Close
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Zi艈uojums: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Steks: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=File: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Rynde艈a: {{line}}
+rendering_error=Att膩loj奴t lopu rod膩s klaida
+
+# Predefined zoom values
+page_scale_width=Lopys plotum膩
+page_scale_fit=莫tylpyn奴t lopu
+page_scale_auto=Automatiskais izm膩rs
+page_scale_actual=Pat墨sais izm膩rs
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Klaida
+loading_error=莫luodej奴t PDF n奴tyka klaida.
+invalid_file_error=Nadereigs voi b奴juots PDF fails.
+missing_file_error=PDF fails nav atrosts.
+unexpected_response_error=Unexpected server response.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Annotation]
+password_label=莫vodit paroli, kab attaiseitu PDF failu.
+password_invalid=Napareiza parole, raugit v膿募reiz.
+password_ok=Labi
+password_cancel=Atce募t
+
+printing_not_supported=Uzmaneibu: Drukuo拧ona nu itei puorl奴ka dorboj膩s tikai daleji.
+printing_not_ready=Uzmaneibu: PDF nav pilneib膩 墨luodeits drukuo拧onai.
+web_fonts_disabled=艩姆膩rsteikla fonti nav aktiviz膩ti: Navar 墨gult PDF fontus.
+document_colors_not_allowed=PDF dokumentym nav at募auts izmantuot po拧ym sovys kruosys: 鈥濧t募aut lopom izavieleit po拧om sovys kruosys鈥� ir deaktiveits puorlyuk膩.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/lv/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/lv/viewer.properties
new file mode 100644
index 0000000..18ed55e
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/lv/viewer.properties
@@ -0,0 +1,242 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Iepriek拧膿j膩 lapa
+previous_label=Iepriek拧膿j膩
+next.title=N膩kam膩 lapa
+next_label=N膩kam膩
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=Lapa
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=no {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} no {{pagesCount}})
+
+zoom_out.title=Att膩lin膩t\u0020
+zoom_out_label=Att膩lin膩t
+zoom_in.title=Pietuvin膩t
+zoom_in_label=Pietuvin膩t
+zoom.title=Palielin膩jums
+presentation_mode.title=P膩rsl膿gties uz Prezent膩cijas re啪墨mu
+presentation_mode_label=Prezent膩cijas re啪墨ms
+open_file.title=Atv膿rt failu
+open_file_label=Atv膿rt
+print.title=Druk膩拧ana
+print_label=Druk膩t
+download.title=Lejupiel膩de
+download_label=Lejupiel膩d膿t
+bookmark.title=Pa拧reiz膿jais skats (kop膿t vai atv膿rt jaun膩 log膩)
+bookmark_label=Pa拧reiz膿jais skats
+
+# Secondary toolbar and context menu
+tools.title=R墨ki
+tools_label=R墨ki
+first_page.title=Iet uz pirmo lapu
+first_page.label=Iet uz pirmo lapu
+first_page_label=Iet uz pirmo lapu
+last_page.title=Iet uz p膿d膿jo lapu
+last_page.label=Iet uz p膿d膿jo lapu
+last_page_label=Iet uz p膿d膿jo lapu
+page_rotate_cw.title=Pagriezt pa pulksteni
+page_rotate_cw.label=Pagriezt pa pulksteni
+page_rotate_cw_label=Pagriezt pa pulksteni
+page_rotate_ccw.title=Pagriezt pret pulksteni
+page_rotate_ccw.label=Pagriezt pret pulksteni
+page_rotate_ccw_label=Pagriezt pret pulksteni
+
+cursor_text_select_tool.title=Aktiviz膿t teksta izv膿les r墨ku
+cursor_text_select_tool_label=Teksta izv膿les r墨ks
+cursor_hand_tool.title=Aktiv膿t rokas r墨ku
+cursor_hand_tool_label=Rokas r墨ks
+
+scroll_vertical.title=Izmantot vertik膩lo ritin膩拧anu
+scroll_vertical_label=Vertik膩l膩 ritin膩拧ana
+scroll_horizontal.title=Izmantot horizont膩lo ritin膩拧anu
+scroll_horizontal_label=Horizont膩l膩 ritin膩拧ana
+scroll_wrapped.title=Izmantot apk募auto ritin膩拧anu
+scroll_wrapped_label=Apk募aut膩 ritin膩拧ana
+
+spread_none.title=Nepievienoties lapu izpletumiem
+spread_none_label=Neizmantot izpletumus
+spread_odd.title=Izmantot lapu izpletumus s膩kot ar nep膩ra numuru lap膩m
+spread_odd_label=Nep膩ra izpletumi
+spread_even.title=Izmantot lapu izpletumus s膩kot ar p膩ra numuru lap膩m
+spread_even_label=P膩ra izpletumi
+
+# Document properties dialog box
+document_properties.title=Dokumenta iestat墨jumi鈥�
+document_properties_label=Dokumenta iestat墨jumi鈥�
+document_properties_file_name=Faila nosaukums:
+document_properties_file_size=Faila izm膿rs:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} biti)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} biti)
+document_properties_title=Nosaukums:
+document_properties_author=Autors:
+document_properties_subject=T膿ma:
+document_properties_keywords=Atsl膿gas v膩rdi:
+document_properties_creation_date=Izveides datums:
+document_properties_modification_date=LAbo拧anas datums:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Rad墨t膩js:
+document_properties_producer=PDF producents:
+document_properties_version=PDF versija:
+document_properties_page_count=Lapu skaits:
+document_properties_page_size=Pap墨ra izm膿rs:
+document_properties_page_size_unit_inches=collas
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=portretorient膩cija
+document_properties_page_size_orientation_landscape=ainavorient膩cija
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=V膿stule
+document_properties_page_size_name_legal=Juridiskie teksti
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=膧tr膩 t墨mek募a skats:
+document_properties_linearized_yes=J膩
+document_properties_linearized_no=N膿
+document_properties_close=Aizv膿rt
+
+print_progress_message=Gatavo dokumentu druk膩拧anai...
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=Atcelt
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=P膩rsl膿gt s膩nu joslu
+toggle_sidebar_notification.title=P膩rsl膿gt s膩nu joslu (dokumenta saturu un pielikumus)
+toggle_sidebar_label=P膩rsl膿gt s膩nu joslu
+document_outline.title=R膩d墨t dokumenta strukt奴ru (veiciet dubultklik拧姆i lai izv膿rstu/sak募autu visus vienumus)
+document_outline_label=Dokumenta saturs
+attachments.title=R膩d墨t pielikumus
+attachments_label=Pielikumi
+thumbs.title=Par膩d墨t s墨kt膿lus
+thumbs_label=S墨kt膿li
+findbar.title=Mekl膿t dokument膩
+findbar_label=Mekl膿t
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Lapa {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Lapas {{page}} s墨kt膿ls
+
+# Find panel button title and messages
+find_input.title=Mekl膿t
+find_input.placeholder=Mekl膿t dokument膩鈥�
+find_previous.title=Atrast iepriek拧膿jo
+find_previous_label=Iepriek拧膿j膩
+find_next.title=Atrast n膩kamo
+find_next_label=N膩kam膩
+find_highlight=Iekr膩sot visas
+find_match_case_label=Lielo, mazo burtu jut墨gs
+find_entire_word_label=Veselus v膩rdus
+find_reached_top=Sasniegts dokumenta s膩kums, turpin膩m no beig膩m
+find_reached_bottom=Sasniegtas dokumenta beigas, turpin膩m no s膩kuma
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]={{current}} no {{total}} rezult膩ta
+find_match_count[two]={{current}} no {{total}} rezult膩tiem
+find_match_count[few]={{current}} no {{total}} rezult膩tiem
+find_match_count[many]={{current}} no {{total}} rezult膩tiem
+find_match_count[other]={{current}} no {{total}} rezult膩tiem
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]=Vair膩k nek膩 {{limit}} rezult膩ti
+find_match_count_limit[one]=Vair膩k nek膩 {{limit}} rezult膩ti
+find_match_count_limit[two]=Vair膩k nek膩 {{limit}} rezult膩ti
+find_match_count_limit[few]=Vair膩k nek膩 {{limit}} rezult膩ti
+find_match_count_limit[many]=Vair膩k nek膩 {{limit}} rezult膩ti
+find_match_count_limit[other]=Vair膩k nek膩 {{limit}} rezult膩ti
+find_not_found=Fr膩ze nav atrasta
+
+# Error panel labels
+error_more_info=Vair膩k inform膩cijas
+error_less_info=MAz膩k inform膩cijas
+error_close=Close
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Zi艈ojums: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Steks: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=File: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Rindi艈a: {{line}}
+rendering_error=Att膿lojot lapu rad膩s k募奴da
+
+# Predefined zoom values
+page_scale_width=Lapas platum膩
+page_scale_fit=Ietilpinot lapu
+page_scale_auto=Autom膩tiskais izm膿rs
+page_scale_actual=Patiesais izm膿rs
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=K募奴da
+loading_error=Iel膩d膿jot PDF notika k募奴da.
+invalid_file_error=Neder墨gs vai boj膩ts PDF fails.
+missing_file_error=PDF fails nav atrasts.
+unexpected_response_error=Negaid墨a servera atbilde.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} anot膩cija]
+password_label=Ievadiet paroli, lai atv膿rtu PDF failu.
+password_invalid=Nepareiza parole, m膿模iniet v膿lreiz.
+password_ok=Labi
+password_cancel=Atcelt
+
+printing_not_supported=Uzman墨bu: Druk膩拧ana no 拧墨 p膩rl奴ka darbojas tikai da募膿ji.
+printing_not_ready=Uzman墨bu: PDF nav piln墨b膩 iel膩d膿ts druk膩拧anai.
+web_fonts_disabled=T墨mek募a fonti nav aktiviz膿ti: Nevar iegult PDF fontus.
+document_colors_not_allowed=PDF dokumentiem nav at募auts izmantot pa拧iem savas kr膩sas: 鈥濧t募aut lap膩m izv膿l膿ties pa拧膩m savas kr膩sas鈥� ir deaktiv膿ts p膩rl奴k膩.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/mai/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/mai/viewer.properties
new file mode 100644
index 0000000..356223f
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/mai/viewer.properties
@@ -0,0 +1,168 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=啶啶苦げ啶� 啶啶粪啶�
+previous_label=啶啶苦げ啶�
+next.title=啶呧啶苦げ啶� 啶啶粪啶�
+next_label=啶嗋啶距
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+
+zoom_out.title=啶涏啶� 啶曕ぐ啷�
+zoom_out_label=啶涏啶� 啶曕ぐ啷�
+zoom_in.title=啶啶� 啶曕ぐ啷�
+zoom_in_label=啶溹啶� 啶囙え
+zoom.title=啶涏啶�-啶啶� 啶曕ぐ啷俓u0020
+presentation_mode.title=啶啶班じ啷嵿い啷佮い啶� 啶呧さ啶膏啶ムぞ啶 啶溹ぞ啶�
+presentation_mode_label=啶啶班じ啷嵿い啷佮い啶� 啶呧さ啶膏啶ムぞ
+open_file.title=啶ぞ啶囙げ 啶栢啶侧
+open_file_label=啶栢啶侧
+print.title=啶涏ぞ啶
+print_label=啶涏ぞ啶
+download.title=啶∴ぞ啶夃え啶侧啶�
+download_label=啶∴ぞ啶夃え啶侧啶�
+bookmark.title=啶啶溹啶︵ぞ 啶︵啶多啶� (啶ㄠさ 啶掂た啶傕ぁ啷嬥ぎ啷� 啶ㄠ啶� 啶侧た啶� 啶呧ぅ啶掂ぞ 啶栢啶侧)
+bookmark_label=啶掂ぐ啷嵿い啶ぞ啶� 啶︵啶多啶�
+
+# Secondary toolbar and context menu
+tools.title=啶呧啶溹ぞ啶�
+tools_label=啶呧啶溹ぞ啶�
+first_page.title=啶啶班ぅ啶� 啶啶粪啶� 啶ぐ 啶溹ぞ啶�
+first_page.label=啶啶班ぅ啶� 啶啶粪啶� 啶ぐ 啶溹ぞ啶�
+first_page_label=啶啶班ぅ啶� 啶啶粪啶� 啶ぐ 啶溹ぞ啶�
+last_page.title=啶呧啶むた啶� 啶啶粪啶� 啶ぐ 啶溹ぞ啶�
+last_page.label=啶呧啶むた啶� 啶啶粪啶� 啶ぐ 啶溹ぞ啶�
+last_page_label=啶呧啶むた啶� 啶啶粪啶� 啶ぐ 啶溹ぞ啶�
+page_rotate_cw.title=啶樴ぁ啶监啶� 啶︵た啶多ぞ 啶 啶樴啶ぞ啶�
+page_rotate_cw.label=啶樴ぁ啶监啶� 啶︵た啶多ぞ 啶 啶樴啶ぞ啶�
+page_rotate_cw_label=啶樴ぁ啶监啶� 啶︵た啶多ぞ 啶 啶樴啶ぞ啶�
+page_rotate_ccw.title=啶樴ぁ啶监啶� 啶︵た啶多ぞ 啶膏 啶夃え啶熰ぞ 啶樴啶ぞ啶�
+page_rotate_ccw.label=啶樴ぁ啶监啶� 啶︵た啶多ぞ 啶膏 啶夃え啶熰ぞ 啶樴啶ぞ啶�
+page_rotate_ccw_label=啶樴ぁ啶监啶� 啶︵た啶多ぞ 啶膏 啶夃え啶熰ぞ 啶樴啶ぞ啶�
+
+
+# Document properties dialog box
+document_properties.title=啶︵じ啷嵿い啶距さ啷囙啶� 啶掂た啶多啶粪い啶�...
+document_properties_label=啶︵じ啷嵿い啶距さ啷囙啶� 啶掂た啶多啶粪い啶�...
+document_properties_file_name=啶ぞ啶囙げ 啶ㄠぞ啶�:
+document_properties_file_size=啶ぜ啶距啶� 啶嗋啶距ぐ:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} 啶ぞ啶囙)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} 啶ぞ啶囙)
+document_properties_title=啶多啶班啶粪:
+document_properties_author=啶侧啶栢啶�
+document_properties_subject=啶掂た啶粪く
+document_properties_keywords=啶啶溹ざ啶啶�
+document_properties_creation_date=啶ㄠた啶班啶ぞ啶� 啶むた啶ムた:
+document_properties_modification_date=啶膏啶多啶оえ 啶︵た啶ㄠぞ啶傕:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=啶膏啶溹:
+document_properties_producer=PDF 啶夃い啷嵿お啶距う啶�:
+document_properties_version=PDF 啶膏啶膏啶曕ぐ啶�:
+document_properties_page_count=啶啶粪啶� 啶椸た啶ㄠい啷�:
+document_properties_close=啶え啷嵿え 啶曕ぐ啷�
+
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=啶膏啶侧ぞ啶囙ぁ啶� 啶熰ぞ啶椸げ
+toggle_sidebar_label=啶膏啶侧ぞ啶囙ぁ啶� 啶熰ぞ啶椸げ
+document_outline_label=啶︵じ啷嵿い啶距さ啷囙 啶栢ぞ啶曕ぞ
+attachments.title=啶膏啶侧啷嵿え啶� 啶︵啶栢ぞ啶
+attachments_label=啶膏啶侧啷嵿え啶�
+thumbs.title=啶侧啷�-啶涏さ啶� 啶︵啶栢ぞ啶�
+thumbs_label=啶侧啷� 啶涏さ啶�
+findbar.title=啶︵じ啷嵿い啶距さ啷囙啶 啶⑧啶佮あ啷�
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=啶啶粪啶� {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=啶啶粪啶� {{page}} 啶曕ぞ 啶侧啷�-啶氞た啶む啶�
+
+# Find panel button title and messages
+find_previous.title=啶栢啶溹 啶啶苦げ啶� 啶夃お啶膏啶ムた啶むた 啶むぞ啶曕
+find_previous_label=啶啶苦げ啶�
+find_next.title=啶栢啶溹 啶呧啶苦げ啶� 啶夃お啶膏啶ムた啶むた 啶むぞ啶曕
+find_next_label=啶嗋啶距
+find_highlight=啶膏き啶熰ぞ 啶嗋げ啷嬥啶苦い 啶曕ぐ啷�
+find_match_case_label=啶た啶侧ぞ啶� 啶膏啶ムた啶むた
+find_reached_top=啶啶粪啶犩 啶多啶班啶� 啶溹ぞ啶� 啶す啷佮啶氞げ, 啶むげ 啶膏 啶溹ぞ啶班
+find_reached_bottom=啶啶粪啶犩 啶むげ 啶 啶溹ぞ啶� 啶す啷佮啶氞げ, 啶多啶班啶� 啶膏 啶溹ぞ啶班
+find_not_found=啶掂ぞ啶曕啶傕ざ 啶ㄠす啶� 啶啶熰げ
+
+# Error panel labels
+error_more_info=啶啶膏  啶膏啶氞え啶�
+error_less_info=啶曕ぎ 啶膏啶氞え啶�
+error_close=啶え啷嵿え 啶曕ぐ啷�
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=啶膏啶︵啶�: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=啶膏啶熰啶�: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=啶ぜ啶距啶�: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=啶啶曕啶むた: {{line}}
+rendering_error=啶啶粪啶� 啶班啶傕ぁ啶班た啶傕啶� 啶膏ぎ啶� 啶む啶班啶熰た 啶嗋啶�.
+
+# Predefined zoom values
+page_scale_width=啶啶粪啶� 啶氞啶∴ぜ啶距
+page_scale_fit=啶啶粪啶� 啶た啶�
+page_scale_auto=啶膏啶掂啶距げ啶苦い 啶溹啶�
+page_scale_actual=啶膏す啷� 啶嗋啶距ぐ
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=啶む啶班啶熰た
+loading_error=啶啶∴啶忇か 啶侧啶� 啶曕ぐ啷堗い 啶膏ぎ啶� 啶忇啶熰ぞ 啶む啶班啶熰た 啶啶�.
+invalid_file_error=啶呧ぎ啶距え啷嵿く 啶呧ぅ啶掂ぞ 啶啶班し啷嵿 PDF 啶ぞ啶囙げ.
+missing_file_error=啶呧え啷佮お啶膏啶ムた啶� PDF 啶ぞ啶囙げ.
+unexpected_response_error=啶膏ぐ啷嵿さ啶� 啶膏 啶呧お啷嵿ぐ啶む啶ぞ啶多た啶� 啶啶班い啶苦啷嵿ぐ啶苦く啶�.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Annotation]
+password_label=啶忇す啶� 啶啶∴啶忇か 啶ぜ啶距啶� 啶曕啶� 啶栢啶侧が啶距 啶侧啶� 啶曕啶く啶� 啶曕啶熰ざ啶啶� 啶ぐ啷�.
+password_invalid=啶呧さ啷堗ぇ 啶曕啶熰ざ啶啶�, 啶曕啶く啶� 啶た啶ㄠ 啶曕啶多た啶� 啶曕ぐ啷�.
+password_ok=啶啶�
+
+printing_not_supported=啶氞啶むぞ啶掂え啷�: 啶� 啶啶班ぞ啶夃啶� 啶ぐ 啶涏お啶距 啶啶班啶� 啶むぐ啶� 啶膏 啶膏ぎ啶班啶ムた啶� 啶ㄠす啶� 啶呧啶�.
+printing_not_ready=啶氞啶むぞ啶掂え啷�: 啶啶∴啶忇か 啶涏お啶距啶� 啶侧啶� 啶啶班啶� 啶むぐ啶� 啶膏 啶侧啶� 啶ㄠす啶� 啶呧啶�.
+web_fonts_disabled=啶掂啶� 啶啶ㄠ啶熰啶� 啶ㄠた啶粪啶曕啶班た啶� 啶呧啶�: 啶呧啶む啶膏啶ムぞ啶た啶� PDF 啶ぞ啶ㄠ啶熰じ啶� 啶夃お啶啶椸ぎ啷� 啶呧じ啶ぐ啷嵿ぅ.
+document_colors_not_allowed=PDF 啶︵じ啷嵿い啶距さ啷囙啶� 啶灌啶曕ぐ 啶呧お啶� 啶班啶� 啶曕啶� 啶夃お啶啶� 啶曕ぐ啶ぞ啶� 啶侧啶� 啶呧え啷佮ぎ啶むた 啶啶班ぞ啶啶� 啶ㄠす啶� 啶呧啶�: '啶啶粪啶� 啶曕啶� 啶灌啶曕ぐ 啶呧お啶� 啶班啶� 啶曕啶� 啶氞啶ㄠが啶距 啶侧啶� 啶膏啶掂啶曕啶むた 啶︵た啶� 啶溹 啶� 啶撪す啶� 啶啶班ぞ啶夃啶监ぐ 啶 啶ㄠた啶粪啶曕啶班た啶� 啶呧啶�.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/meh/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/meh/viewer.properties
new file mode 100644
index 0000000..1d06986
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/meh/viewer.properties
@@ -0,0 +1,72 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+
+zoom.title=Nasa麓a ka麓nu/Nasa麓a luli
+
+# Secondary toolbar and context menu
+
+
+# Document properties dialog box
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+
+# Find panel button title and messages
+
+# Error panel labels
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+
+# Predefined zoom values
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+
+# Loading indicator messages
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/mk/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/mk/viewer.properties
new file mode 100644
index 0000000..8535025
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/mk/viewer.properties
@@ -0,0 +1,145 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=袩褉械褌褏芯写薪邪 褋褌褉邪薪懈褑邪
+previous_label=袩褉械褌褏芯写薪邪
+next.title=小谢械写薪邪 褋褌褉邪薪懈褑邪
+next_label=小谢械写薪邪
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+
+zoom_out.title=袧邪屑邪谢褍胁邪褮械
+zoom_out_label=袧邪屑邪谢懈
+zoom_in.title=袟谐芯谢械屑褍胁邪褮械
+zoom_in_label=袟谐芯谢械屑懈
+zoom.title=袩褉芯屑械薪褍胁邪褮械 薪邪 谐芯谢械屑懈薪邪
+presentation_mode.title=袩褉械屑懈薪懈 胁芯 锌褉械蟹械薪褌邪褑懈褋泻懈 褉械卸懈屑
+presentation_mode_label=袩褉械蟹械薪褌邪褑懈褋泻懈 褉械卸懈屑
+open_file.title=袨褌胁芯褉邪褮械 写邪褌芯褌械泻邪
+open_file_label=袨褌胁芯褉懈
+print.title=袩械褔邪褌械褮械
+print_label=袩械褔邪褌懈
+download.title=袩褉械蟹械屑邪褮械
+download_label=袩褉械蟹械屑懈
+bookmark.title=袨胁芯褬 锌褉械谐谢械写 (泻芯锌懈褉邪褬 懈谢懈 芯褌胁芯褉懈 胁芯 薪芯胁 锌褉芯蟹芯褉械褑)
+bookmark_label=袨胁芯褬 锌褉械谐谢械写
+
+# Secondary toolbar and context menu
+tools.title=袗谢邪褌泻懈
+first_page.label=袨写懈 写芯 锌褉胁邪褌邪 褋褌褉邪薪懈褑邪
+last_page.label=袨写懈 写芯 锌芯褋谢械写薪邪褌邪 褋褌褉邪薪懈褑邪
+page_rotate_cw.label=袪芯褌懈褉邪褬 锌芯 褋褌褉械谢泻懈褌械 薪邪 褔邪褋芯胁薪懈泻芯褌
+page_rotate_ccw.label=袪芯褌懈褉邪褬 褋锌褉芯褌懈胁薪芯 芯写 褋褌褉械谢泻懈褌械 薪邪 褔邪褋芯胁薪懈泻芯褌
+
+
+
+
+# Document properties dialog box
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_close=袨褌泻邪卸懈
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=袙泻谢褍褔懈 褋褌褉邪薪懈褔薪邪 谢械薪褌邪
+toggle_sidebar_label=袙泻谢褍褔懈 褋褌褉邪薪懈褔薪邪 谢械薪褌邪
+thumbs.title=袩褉懈泻邪卸褍胁邪褮械 薪邪 懈泻芯薪懈
+thumbs_label=袠泻芯薪懈
+findbar.title=袧邪褬写懈 胁芯 写芯泻褍屑械薪褌芯褌
+findbar_label=袧邪褬写懈
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=小褌褉邪薪懈褑邪 {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=袠泻芯薪邪 芯写 褋褌褉邪薪懈褑邪 {{page}}
+
+# Find panel button title and messages
+find_previous.title=袧邪褬写懈 褬邪 锌褉械写褏芯写薪邪褌邪 锌芯褬邪胁邪 薪邪 褎褉邪蟹邪褌邪
+find_previous_label=袩褉械褌褏芯写薪芯
+find_next.title=袧邪褬写懈 褬邪 褋谢械写薪邪褌邪 锌芯褬邪胁邪 薪邪 褎褉邪蟹邪褌邪
+find_next_label=小谢械写薪芯
+find_highlight=袨蟹薪邪褔懈 褋褠
+find_match_case_label=孝芯泻屑褍 褌邪泻邪
+find_reached_top=袘邪褉邪褮械褌芯 褋褌懈谐薪邪 写芯 锌芯褔械褌芯泻芯褌 薪邪 写芯泻褍屑械薪褌芯褌 懈 锌芯褔薪褍胁邪 芯写 泻褉邪褬芯褌
+find_reached_bottom=袘邪褉邪褮械褌芯 褋褌懈谐薪邪 写芯 泻褉邪褬芯褌 薪邪 写芯泻褍屑械薪褌芯褌 懈 锌芯褔薪褍胁邪 芯写 锌芯褔械褌芯泻
+find_not_found=肖褉邪蟹邪褌邪 薪械 械 锌褉芯薪邪褬写械薪邪
+
+# Error panel labels
+error_more_info=袩芯胁械褱械 懈薪褎芯褉屑邪褑懈懈
+error_less_info=袩芯屑邪谢泻褍 懈薪褎芯褉屑邪褑懈懈
+error_close=袟邪褌胁芯褉懈
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=袩芯褉邪泻邪: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stack: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=袛邪褌芯褌械泻邪: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=袥懈薪懈褬邪: {{line}}
+rendering_error=袧邪褋褌邪薪邪 谐褉械褕泻邪 锌褉懈 锌褉懈泻邪卸褍胁邪褮械褌芯 薪邪 褋褌褉邪薪懈褑邪褌邪.
+
+# Predefined zoom values
+page_scale_width=楔懈褉懈薪邪 薪邪 褋褌褉邪薪懈褑邪
+page_scale_fit=笑械谢邪 褋褌褉邪薪懈褑邪
+page_scale_auto=袗胁褌芯屑邪褌褋泻邪 谐芯谢械屑懈薪邪
+page_scale_actual=袙懈褋褌懈薪褋泻邪 谐芯谢械屑懈薪邪
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+
+# Loading indicator messages
+loading_error_indicator=袚褉械褕泻邪
+loading_error=袧邪褋褌邪薪邪 谐褉械褕泻邪 锌褉懈 胁褔懈褌褍胁邪褮械褌芯 薪邪 PDF-芯褌.
+invalid_file_error=袧械胁邪谢懈写薪邪 懈谢懈 泻芯褉褍屑锌懈褉邪薪邪 PDF 写邪褌芯褌械泻邪.
+missing_file_error=袧械写芯褋褌邪褋褍胁邪 PDF 写芯泻褍屑械薪褌.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+password_cancel=袨褌泻邪卸懈
+
+printing_not_supported=袩褉械写褍锌褉械写褍胁邪褮械: 袩械褔邪褌械褮械褌芯 薪械 械 褑械谢芯褋薪芯 锌芯写写褉卸邪薪芯 胁芯 芯胁芯褬 锌褉械谢懈褋褌褍胁邪褔.
+printing_not_ready=袩褉械写褍锌褉械写褍胁邪褮械: PDF 写芯泻褍屑械薪褌芯褌 薪械 械 褑械谢芯褋薪芯 胁褔懈褌邪薪 蟹邪 锌械褔邪褌械褮械.
+web_fonts_disabled=袠薪褌械褉薪械褌 褎芯薪褌芯胁懈褌械 褋械 芯薪械胁芯蟹屑芯卸械薪懈: 薪械 屑芯卸械 写邪 褋械 泻芯褉懈褋褌邪褌 胁谐褉邪写械薪懈褌械 PDF 褎芯薪褌芯胁懈.
+document_colors_not_allowed=PDF-写芯泻褍屑械薪褌懈褌械 薪械屑邪邪褌 写芯蟹胁芯谢邪 写邪 泻芯褉懈褋褌邪褌 褋芯锌褋褌胁械薪懈 斜芯懈: 袩芯褋褌邪胁泻邪褌邪 鈥炐斝拘沸残拘恍� 褋褌褉邪薪懈褑懈褌械 褋邪屑懈 写邪 谐懈 懈蟹斜懈褉邪邪褌 褋胁芯懈褌械 斜芯懈鈥� 械 写械邪泻褌懈胁懈褉邪薪邪 芯写 锌褉械谢懈褋褌褍胁邪褔芯褌.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ml/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ml/viewer.properties
new file mode 100644
index 0000000..d4a9eb4
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ml/viewer.properties
@@ -0,0 +1,184 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=啻祦啻祶啻祦啻赤祶啻� 啻む淳啻赤祶鈥�
+previous_label=啻祦啻祶啻祦嗟�
+next.title=啻呧礋嗟佮搐嗟嵿搐 啻む淳啻赤祶鈥�
+next_label=啻呧礋嗟佮搐嗟嵿搐啻む祦嗟�
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=啻む淳啻赤祶鈥�
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages={{pagesCount}} 啻侧祮
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pagesCount}} 啻侧祮 {{pageNumber}})
+
+zoom_out.title=啻氞祮啻编祦啻む淳啻曕祶啻曕祦啻�
+zoom_out_label=啻氞祮啻编祦啻む淳啻曕祶啻曕祦啻�
+zoom_in.title=啻掂床嗟佮搐啻距磿嗟嵿磿嗟佮磿
+zoom_in_label=啻掂床嗟佮搐啻距磿嗟嵿磿嗟佮磿
+zoom.title=啻掂祶啻淳啻祶啻む纯 啻淳啻编祶啻编祦啻�
+presentation_mode.title=啻祶啻班锤啻ㄠ祶啻编祰啻粪川嗟嶁�� 啻班祤啻む纯啻纯啻侧祰啻曕祶啻曕祦嗟� 啻淳啻编祶啻编祦啻�
+presentation_mode_label=啻祶啻班锤啻ㄠ祶啻编祰啻粪川嗟嶁�� 啻班祤啻む纯
+open_file.title=啻疮啻侧祶鈥� 啻む祦啻编磿嗟嵿磿嗟佮磿
+open_file_label=啻む祦啻编磿嗟嵿磿嗟佮磿
+print.title=啻祶啻班纯啻ㄠ祶啻编祶 啻氞祮啻祶啻祦啻�
+print_label=啻祶啻班纯啻ㄠ祶啻编祶 啻氞祮啻祶啻祦啻�
+download.title=啻∴祵啻`祶鈥嵿床嗟囙淳啻∴祶 啻氞祮啻祶啻祦啻�
+download_label=啻∴祵啻`祶鈥嵿床嗟囙淳啻∴祶 啻氞祮啻祶啻祦啻�
+bookmark.title=啻ㄠ纯啻侧吹啻苦床嗟佮闯嗟嵿闯 啻曕淳啻脆祶啻� (啻祦啻む纯啻� 啻溹淳啻侧磿啻む祶啻む纯啻侧祶鈥� 啻磿啻班祶鈥嵿搐嗟嵿搐嗟佮磿 啻呧床嗟嵿床嗟嗋礄嗟嵿磿啻苦床嗟嶁�� 啻む祦啻编磿嗟嵿磿嗟佮磿)
+bookmark_label=啻ㄠ纯啻侧吹啻苦床嗟佮闯嗟嵿闯 啻曕淳啻脆祶啻�
+
+# Secondary toolbar and context menu
+tools.title=啻夃椽啻曕窗啻`礄嗟嵿礄啻赤祶鈥�
+tools_label=啻夃椽啻曕窗啻`礄嗟嵿礄啻赤祶鈥�
+first_page.title=啻嗋处嗟嵿疮啻む祶啻む祮 啻む淳啻赤纯啻侧祰啻祶啻曕祶啻曕祦嗟� 啻祴啻曕祦啻�
+first_page.label=啻嗋处嗟嵿疮啻む祶啻む祮 啻む淳啻赤纯啻侧祰啻祶啻曕祶啻曕祦嗟� 啻祴啻曕祦啻�
+first_page_label=啻嗋处嗟嵿疮啻む祶啻む祮 啻む淳啻赤纯啻侧祰啻祶啻曕祶啻曕祦嗟� 啻祴啻曕祦啻�
+last_page.title=啻呧吹啻膏淳啻� 啻む淳啻赤纯啻侧祰啻祶啻曕祶啻曕祦嗟� 啻祴啻曕祦啻�
+last_page.label=啻呧吹啻膏淳啻� 啻む淳啻赤纯啻侧祰啻祶啻曕祶啻曕祦嗟� 啻祴啻曕祦啻�
+last_page_label=啻呧吹啻膏淳啻� 啻む淳啻赤纯啻侧祰啻祶啻曕祶啻曕祦嗟� 啻祴啻曕祦啻�
+page_rotate_cw.title=啻樴礋啻苦磿啻距窗啻︵纯啻多疮啻苦床嗟嶁�� 啻曕幢啻曕祶啻曕祦啻�
+page_rotate_cw.label=啻樴礋啻苦磿啻距窗啻︵纯啻多疮啻苦床嗟嶁�� 啻曕幢啻曕祶啻曕祦啻�
+page_rotate_cw_label=啻樴礋啻苦磿啻距窗啻︵纯啻多疮啻苦床嗟嶁�� 啻曕幢啻曕祶啻曕祦啻�
+page_rotate_ccw.title=啻樴礋啻苦磿啻距窗 啻︵纯啻多疮嗟嵿磿嗟嵿磿嗟佮祶 啻掂纯啻窗嗟�啻む串啻距疮啻� 啻曕幢啻曕祶啻曕祦啻�
+page_rotate_ccw.label=啻樴礋啻苦磿啻距窗 啻︵纯啻多疮嗟嵿磿嗟嵿磿嗟佮祶 啻掂纯啻窗嗟�啻む串啻距疮啻� 啻曕幢啻曕祶啻曕祦啻�
+page_rotate_ccw_label=啻樴礋啻苦磿啻距窗 啻︵纯啻多疮嗟嵿磿嗟嵿磿嗟佮祶 啻掂纯啻窗嗟�啻む串啻距疮啻� 啻曕幢啻曕祶啻曕祦啻�
+
+cursor_text_select_tool.title=啻熰祮啻曕祶啻膏祶啻编祶啻编祶 啻む纯啻班礊嗟嵿礊嗟嗋礋嗟佮磿嗟嵿磿嗟� 啻熰祩啻赤祶鈥� 啻祶啻班淳啻祶啻む串啻距磿嗟嵿磿嗟佮磿
+cursor_text_select_tool_label=啻熰祮啻曕祶啻膏祶啻编祶啻编祶 啻む纯啻班礊嗟嵿礊嗟嗋礋嗟佮磿嗟嵿磿嗟� 啻熰祩啻赤祶鈥�
+cursor_hand_tool.title=啻灌淳啻ㄠ祶啻编祶 啻熰祩啻赤祶鈥� 啻祶啻班淳啻祶啻む串啻距磿嗟嵿磿嗟佮磿
+cursor_hand_tool_label=啻灌淳啻ㄠ祶啻编祶 啻熰祩啻赤祶鈥�
+
+# Document properties dialog box
+document_properties.title=啻班祰啻栢疮嗟佮礋嗟� 啻掂纯啻多祰啻粪搐啻曕闯嗟嶁��...
+document_properties_label=啻班祰啻栢疮嗟佮礋嗟� 啻掂纯啻多祰啻粪搐啻曕闯嗟嶁��...
+document_properties_file_name=啻疮啻侧纯啻ㄠ祶啻编祮 啻祰啻班祶鈥�:
+document_properties_file_size=啻疮啻侧纯啻ㄠ祶啻编祮 啻掂床啻苦椽嗟嵿椽啻�:鈥屸��
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} 啻曕祮啻纯 ({{size_b}} 啻祱啻编祶啻编祦啻曕闯嗟嶁��)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} 啻庎磦啻纯 ({{size_b}} 啻祱啻编祶啻编祦啻曕闯嗟嶁��)
+document_properties_title=啻む床啻曕祶啻曕祮啻熰祶啻熰祶鈥孿u0020
+document_properties_author=啻班礆啻纯啻む淳啻掂祶:
+document_properties_subject=啻掂纯啻粪疮啻�:
+document_properties_keywords=啻曕祤啻掂祰啻班祶鈥嵿础嗟佮磿啻赤祶鈥�:
+document_properties_creation_date=啻祩啻班祶鈥嵿搐嗟嵿搐啻苦疮啻距磿嗟佮川嗟嵿川 啻む祤啻搐啻�:
+document_properties_modification_date=啻淳啻编祶啻编磦 啻掂窗嗟佮搐嗟嵿搐啻苦疮 啻む祤啻搐啻�:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=啻膏祪啻粪祶啻熰纯啻曕窗嗟嶁�嵿搐嗟嵿搐啻距吹嗟�:
+document_properties_producer=啻纯啻∴纯啻庎传嗟� 啻祶啻班祳啻∴祶啻祩啻膏窗嗟嶁��:
+document_properties_version=啻纯啻∴纯啻庎传嗟� 啻搐啻苦椽嗟嵿椽嗟�:
+document_properties_page_count=啻む淳啻赤纯啻ㄠ祶啻编祮 啻庎矗嗟嵿矗啻�:
+document_properties_close=啻呧礋啻祶啻曕祶啻曕祦啻�
+
+print_progress_message=啻祶啻班纯啻ㄠ祶啻编祦啻氞祮啻祶啻祦啻ㄠ祶啻ㄠ搐啻苦川嗟� 啻∴祴啻曕祶啻祦啻祮啻ㄠ祶啻编祶 啻む疮嗟嵿疮啻距幢啻距磿嗟嵿磿嗟佮川嗟嵿川嗟佲��
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=啻编处嗟嵿处啻距磿嗟嵿磿嗟佮磿
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=啻膏祱啻∴祶 啻淳啻编纯啻侧祰啻曕祶啻曕祦嗟� 啻淳啻编祶啻编祦啻�
+toggle_sidebar_notification.title=啻熰祴啻椸纯嗟� 啻膏祱啻∴祶啻淳嗟� (啻∴祴啻曕祶啻祦啻祮啻ㄠ祶啻编纯啻侧祶鈥� 啻斷礋嗟嵿礋嗟嵿床嗟堗祷/啻呧幢嗟嵿幢啻距礆嗟嵿礆嗟佮串嗟嗋川嗟嵿幢嗟佮磿嗟� 啻呧礋啻權祶啻權纯啻纯啻班纯啻曕祶啻曕祦啻ㄠ祶啻ㄠ祦)
+toggle_sidebar_label=啻膏祱啻∴祶 啻淳啻编纯啻侧祰啻曕祶啻曕祦嗟� 啻淳啻编祶啻编祦啻�
+document_outline.title=啻∴祴啻曕祶啻祦啻祮啻ㄠ祶啻编纯啻ㄠ祶啻编祮 啻淳啻灌祶啻窗嗟囙礀 啻曕淳啻`纯啻曕祶啻曕祦啻� (啻庎床嗟嵿床啻� 啻囙川啻權祶啻權闯嗟佮磦 啻掂纯啻祦啻侧祤啻曕窗啻苦磿嗟嵿磿啻距川嗟佮磦 啻氞祦啻班祦啻曕祶啻曕淳啻ㄠ祦啻� 啻囙窗啻熰祶啻� 啻曕祶啻侧纯啻曕祶啻曕祦啻氞祮啻祶啻祦啻�)
+document_outline_label=啻班祰啻栢疮嗟佮礋嗟� 啻斷礋嗟嵿礋嗟嵿床嗟堗川嗟嶁��
+attachments.title=啻呧幢嗟嵿幢啻距礆嗟嵿串嗟嗋川嗟嵿幢嗟佮磿啻赤祶鈥� 啻曕淳啻`纯啻祶啻曕祶啻曕祦啻�
+attachments_label=啻呧幢嗟嵿幢啻距礆嗟嵿串嗟嗋川嗟嵿幢嗟佮磿啻赤祶鈥�
+thumbs.title=啻む磦啻祶啻ㄠ祮啻纯啻侧祦啻曕闯嗟嶁�� 啻曕淳啻`纯啻祶啻曕祶啻曕祦啻�
+thumbs_label=啻む磦啻祶啻ㄠ祮啻纯啻侧祦啻曕闯嗟嶁��
+findbar.title=啻班祰啻栢疮啻苦床嗟嶁�� 啻曕矗嗟嵿礋嗟佮椽啻苦礋啻苦疮嗟嵿磿嗟嵿磿嗟佮磿
+findbar_label=啻曕矗嗟嵿礋嗟嗋搐嗟嵿搐嗟佮磿
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=啻む淳啻赤祶鈥� {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas={{page}} 啻む淳啻赤纯啻ㄠ祦啻赤祶啻� 啻む磦啻祶啻ㄠ祮啻纯啻侧祶鈥�
+
+# Find panel button title and messages
+find_input.title=啻曕矗嗟嵿礋嗟嗋搐嗟嵿搐嗟佮磿
+find_input.placeholder=啻∴祴啻曕祶啻祦啻祮啻ㄠ祶啻编纯啻侧祶鈥� 啻曕矗嗟嵿礋嗟嗋搐嗟嵿搐嗟佮磿鈥�
+find_previous.title=啻掂淳啻氞磿啻� 啻囙搐啻苦川嗟� 啻祦啻ㄠ祶鈥嵿椽嗟嶁�� 啻嗋吹啻班祶鈥嵿搐嗟嵿搐啻苦礆嗟嵿礆啻む祶鈥� 啻曕矗嗟嵿礋嗟嗋搐嗟嵿搐嗟佮磿\u0020
+find_previous_label=啻祦啻祶啻祦嗟�
+find_next.title=啻掂淳啻氞磿啻� 啻掂祤啻`祶啻熰祦啻� 啻嗋吹啻班祶鈥嵿搐嗟嵿搐啻苦磿嗟嵿磿嗟佮川嗟嵿川啻む祶鈥� 啻曕矗嗟嵿礋嗟嗋搐嗟嵿搐嗟佮磿\u0020
+find_next_label=啻呧礋嗟佮搐嗟嵿搐啻む祦嗟�
+find_highlight=啻庎床嗟嵿床啻距磦 啻庎礋嗟佮搐嗟嵿搐嗟佮磿啻距矗啻苦疮嗟嵿磿嗟嵿磿嗟佮磿
+find_match_case_label=啻呧磿嗟嵿捶啻班礄嗟嵿礄啻赤祶鈥� 啻掄搐嗟嵿搐嗟佮川嗟嬥磿嗟嵿磿嗟佮磿
+find_reached_top=啻班祰啻栢疮嗟佮礋嗟� 啻祦啻曕闯啻苦床嗟嶁�� 啻庎搐嗟嵿搐啻苦疮啻苦窗啻苦磿嗟嵿磿嗟佮川嗟嵿川嗟�, 啻む淳啻脆祮 啻ㄠ纯啻ㄠ祶啻ㄠ祦啻� 啻む祦啻熰窗嗟佮川嗟嵿川嗟�
+find_reached_bottom=啻班祰啻栢疮嗟佮礋嗟� 啻呧吹啻膏淳啻ㄠ磦 啻掂窗嗟� 啻庎搐嗟嵿搐啻苦疮啻苦窗啻苦磿嗟嵿磿嗟佮川嗟嵿川嗟�, 啻祦啻曕闯啻苦床嗟嶁�� 啻ㄠ纯啻ㄠ祶啻ㄠ祦啻� 啻む祦啻熰窗嗟佮川嗟嵿川嗟乗u0020
+find_not_found=啻掂淳啻氞磿啻� 啻曕矗嗟嵿礋嗟嗋搐嗟嵿搐啻距川啻距疮啻苦床嗟嵿床\u0020
+
+# Error panel labels
+error_more_info=啻曕祩啻熰祦啻む床嗟嶁�� 啻掂纯啻掂窗啻�
+error_less_info=啻曕祦啻编礆嗟嵿礆嗟� 啻掂纯啻掂窗啻�
+error_close=啻呧礋啻祶啻曕祶啻曕祦啻�
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=啻膏川嗟嵿处嗟囙炊啻�: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=啻膏祶啻编祶啻编淳啻曕祶啻曕祶: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=啻疮啻侧祶鈥�: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=啻掂窗啻�: {{line}}
+rendering_error=啻む淳啻赤祶鈥� 啻编祮啻`祶啻熰窗嗟嶁�� 啻氞祮啻祶啻祦啻祶啻祴啻赤祶鈥嶁�� 啻纯啻多磿嗟佮矗嗟嵿礋啻距疮啻苦窗啻苦疮嗟嵿磿嗟嵿磿嗟佮川嗟嵿川嗟�.
+
+# Predefined zoom values
+page_scale_width=啻む淳啻赤纯啻ㄠ祶啻编祮 啻掂祤啻む纯
+page_scale_fit=啻む淳啻赤祶鈥� 啻淳啻曕搐嗟嵿搐啻苦川啻距磿嗟嵿磿嗟佮磿
+page_scale_auto=啻膏祶啻掂疮啻淳啻纯 啻掂床嗟佮搐啻距磿嗟嵿磿嗟佮磿
+page_scale_actual=啻触啻距窗嗟嶁�嵿搐嗟嵿触 啻掂祶啻淳啻祶啻む纯
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=啻纯啻多磿嗟�
+loading_error=啻纯啻∴纯啻庎传嗟� 啻侧喘嗟嵿疮啻淳啻曕祶啻曕祦啻祶啻祴啻赤祶鈥� 啻纯啻多磿嗟� 啻夃矗嗟嵿礋啻距疮啻苦窗啻苦疮嗟嵿磿嗟嵿磿嗟佮川嗟嵿川嗟�.
+invalid_file_error=啻む祮啻编祶啻编淳啻� 啻呧床嗟嵿床嗟嗋礄嗟嵿磿啻苦床嗟嶁�� 啻む磿啻班淳啻编祦啻赤祶啻� 啻纯啻∴纯啻庎传嗟� 啻疮啻侧祶鈥�.
+missing_file_error=啻纯啻∴纯啻庎传嗟� 啻疮啻侧祶鈥� 啻侧喘嗟嵿疮啻床嗟嵿床.
+unexpected_response_error=啻祶啻班搐嗟�啻曕祶啻粪纯啻曕祶啻曕淳啻む祶啻� 啻膏祮啻班祶鈥嵿吹啻班祶鈥� 啻幢嗟佮椽啻熰纯.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Annotation]
+password_label=啻� 啻纯啻∴纯啻庎传嗟� 啻疮啻侧祶鈥� 啻む祦啻编磿嗟嵿磿嗟佮川嗟嵿川啻む纯啻ㄠ祦嗟� 啻班垂啻膏祶啻吹啻距磿嗟嵿磿嗟� 啻ㄠ床嗟嶁�嵿磿嗟佮磿.
+password_invalid=啻む祮啻编祶啻编淳啻� 啻班垂啻膏祶啻吹啻距磿嗟嵿磿嗟�, 啻︵疮啻掂淳啻纯 啻掂祤啻`祶啻熰祦啻� 啻多祶啻班串啻苦疮嗟嵿磿嗟嵿磿嗟佮磿.
+password_ok=啻多窗啻�
+password_cancel=啻编处嗟嵿处啻距磿嗟嵿磿嗟佮磿
+
+printing_not_supported=啻祦啻ㄠ祶啻ㄠ幢啻苦疮啻苦椽嗟嵿椽嗟佮祶: 啻� 啻祶啻班祵啻膏窗嗟嶁�� 啻祩啻班祶鈥嵿矗嗟嵿矗啻淳啻纯 啻祶啻班纯啻ㄠ祶啻编纯啻權祶 啻纯啻ㄠ祶啻む祦啻`疮嗟嵿磿嗟嵿磿嗟佮川嗟嵿川啻苦床嗟嵿床.
+printing_not_ready=啻祦啻ㄠ祶啻ㄠ幢啻苦疮啻苦椽嗟嵿椽嗟佮祶: 啻祶啻班纯啻ㄠ祶啻编祶 啻氞祮啻祶啻祦啻ㄠ祶啻ㄠ搐啻苦川嗟佮祶 啻纯啻∴纯啻庎传嗟� 啻祩啻班祶鈥嵿矗嗟嵿矗啻淳啻纯 啻侧喘嗟嵿疮啻床嗟嵿床.
+web_fonts_disabled=啻掂祮啻纯啻ㄠ祦啻赤祶啻� 啻呧磿嗟嵿捶啻班锤啻炧祶啻氞疮啻權祶啻權闯嗟嶁�� 啻祶啻班吹啻班祶鈥嵿搐嗟嵿搐啻� 啻班垂啻苦搐啻�: 啻庎磦啻础嗟嵿础嗟� 啻氞祮啻祶啻� 啻纯啻∴纯啻庎传嗟� 啻呧磿嗟嵿捶啻班锤啻炧祶啻氞疮啻權祶啻權闯嗟嶁�� 啻夃椽啻祴啻椸纯啻祶啻曕祶啻曕祦啻掂淳啻ㄠ祶鈥� 啻膏淳啻о祶啻串啻侧祶啻�.
+document_colors_not_allowed=啻膏祶啻掂川嗟嵿搐啻� 啻ㄠ纯啻编礄嗟嵿礄啻赤祶鈥� 啻夃椽啻祴啻椸纯啻祶啻曕祶啻曕祦啻掂淳啻ㄠ祶鈥� 啻纯啻∴纯啻庎传嗟� 啻班祰啻栢磿啻赤祶鈥嵿磿嗟嵿磿嗟佮祶 啻呧川嗟佮吹啻距处啻纯啻侧祶啻�:  '啻膏祶啻掂川嗟嵿搐啻� 啻ㄠ纯啻编礄嗟嵿礄啻赤祶鈥� 啻夃椽啻祴啻椸纯啻祶啻曕祶啻曕祦啻掂淳啻ㄠ祶鈥� 啻む淳啻赤祦啻曕闯嗟� 啻呧川嗟佮吹啻︵纯啻祶啻曕祶啻曕祦啻�' 啻庎川嗟嵿川啻む祦嗟� 啻祶啻班祵啻膏幢啻苦床嗟嶁�� 啻ㄠ纯啻班祶鈥嵿礈嗟�啻掂串啻距矗嗟佮祶.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/mn/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/mn/viewer.properties
new file mode 100644
index 0000000..39edeb2
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/mn/viewer.properties
@@ -0,0 +1,82 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+
+zoom.title=孝褝谢褝谢褌
+open_file.title=肖邪泄谢 薪褝褝
+open_file_label=袧褝褝
+
+# Secondary toolbar and context menu
+
+
+# Document properties dialog box
+document_properties_file_name=肖邪泄谢褘薪 薪褝褉:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_title=袚邪褉褔懈谐:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+
+# Find panel button title and messages
+find_previous.title=啸邪泄谢褌褘薪 萤屑薪萤褏 芯谢写褑褘谐 褏邪褉褍褍谢薪邪
+find_next.title=啸邪泄谢褌褘薪 写邪褉邪邪谐懈泄薪 芯谢写褑褘谐 褏邪褉褍褍谢薪邪
+find_not_found=袨谢写褋芯薪谐爷泄
+
+# Error panel labels
+error_more_info=袧褝屑褝谢褌 屑褝写褝褝谢褝谢
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+
+# Predefined zoom values
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+
+# Loading indicator messages
+loading_error_indicator=袗谢写邪邪
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+password_ok=OK
+
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/mr/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/mr/viewer.properties
new file mode 100644
index 0000000..c806929
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/mr/viewer.properties
@@ -0,0 +1,206 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=啶ぞ啶椸啶� 啶啶粪啶�
+previous_label=啶ぞ啶椸啶�
+next.title=啶啶⑧啶� 啶啶粪啶�
+next_label=啶啶⑧啶�
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=啶啶粪啶�
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages={{pagesCount}}啶啶曕
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pagesCount}} 啶啶曕 {{pageNumber}})
+
+zoom_out.title=啶涏啶熰 啶曕ぐ啶�
+zoom_out_label=啶涏啶熰 啶曕ぐ啶�
+zoom_in.title=啶啶犩 啶曕ぐ啶�
+zoom_in_label=啶啶犩 啶曕ぐ啶�
+zoom.title=啶侧す啶距え 啶曕た啶傕さ啶� 啶啶犩 啶曕ぐ啶�
+presentation_mode.title=啶啶班じ啷嵿い啷佮い啶苦啶班ぃ 啶啶∴啶� 啶掂ぞ啶ぐ 啶曕ぐ啶�
+presentation_mode_label=啶啶班じ啷嵿い啷佮い啶苦啶班ぃ 啶啶�
+open_file.title=啶ぞ啶囙げ 啶夃啶∴ぞ
+open_file_label=啶夃啶∴ぞ
+print.title=啶涏お啶距 啶曕ぐ啶�
+print_label=啶涏お啶距 啶曕ぐ啶�
+download.title=啶∴ぞ啶夃え啶侧啶� 啶曕ぐ啶�
+download_label=啶∴ぞ啶夃え啶侧啶� 啶曕ぐ啶�
+bookmark.title=啶膏ぇ啷嵿く啶距啷� 啶呧さ啶侧啶曕え (啶ㄠさ啷�啶� 啶啶侧ぞ啶� 啶啶班い 啶え啶掂ぞ 啶曕た啶傕さ啶� 啶夃啶∴ぞ)
+bookmark_label=啶膏ぇ啷嵿く啶距啷� 啶呧さ啶侧啶曕え
+
+# Secondary toolbar and context menu
+tools.title=啶膏ぞ啶оえ啷�
+tools_label=啶膏ぞ啶оえ啷�
+first_page.title=啶す啶苦げ啷嵿く啶� 啶啶粪啶犩ぞ啶掂ぐ 啶溹ぞ
+first_page.label=啶す啶苦げ啷嵿く啶� 啶啶粪啶犩ぞ啶掂ぐ 啶溹ぞ
+first_page_label=啶す啶苦げ啷嵿く啶� 啶啶粪啶犩ぞ啶掂ぐ 啶溹ぞ
+last_page.title=啶多啶掂啶氞啶ぞ 啶啶粪啶犩ぞ啶掂ぐ 啶溹ぞ
+last_page.label=啶多啶掂啶氞啶ぞ 啶啶粪啶犩ぞ啶掂ぐ 啶溹ぞ
+last_page_label=啶多啶掂啶氞啶ぞ 啶啶粪啶犩ぞ啶掂ぐ 啶溹ぞ
+page_rotate_cw.title=啶樴ぁ啷嵿く啶距こ啶距啷嵿く啶� 啶曕ぞ啶熰啶ぞ啶氞啶ぞ 啶︵た啶多啶ㄠ 啶た啶班さ啶�
+page_rotate_cw.label=啶樴ぁ啷嵿く啶距こ啶距啷嵿く啶� 啶曕ぞ啶熰啶ぞ啶氞啶ぞ 啶︵た啶多啶ㄠ 啶た啶班さ啶�
+page_rotate_cw_label=啶樴ぁ啷嵿く啶距こ啶距啷嵿く啶� 啶曕ぞ啶熰啶ぞ啶氞啶ぞ 啶︵た啶多啶ㄠ 啶た啶班さ啶�
+page_rotate_ccw.title=啶樴ぁ啷嵿く啶距こ啶距啷嵿く啶� 啶曕ぞ啶熰啶ぞ啶氞啶ぞ 啶夃げ啶� 啶︵た啶多啶ㄠ 啶た啶班さ啶�
+page_rotate_ccw.label=啶樴ぁ啷嵿く啶距こ啶距啷嵿く啶� 啶曕ぞ啶熰啶ぞ啶氞啶ぞ 啶夃げ啶� 啶︵た啶多啶ㄠ 啶た啶班さ啶�
+page_rotate_ccw_label=啶樴ぁ啷嵿く啶距こ啶距啷嵿く啶� 啶曕ぞ啶熰啶ぞ啶氞啶ぞ 啶夃げ啶� 啶︵た啶多啶ㄠ 啶た啶班さ啶�
+
+cursor_text_select_tool.title=啶啶曕啶� 啶ㄠた啶掂ぁ 啶膏ぞ啶оえ 啶曕ぞ啶班啶ぞ啶ㄠ啶掂く啷�啶� 啶曕ぐ啶�
+cursor_text_select_tool_label=啶啶曕啶� 啶ㄠた啶掂ぁ 啶膏ぞ啶оえ
+cursor_hand_tool.title=啶灌ぞ啶� 啶膏ぞ啶оえ 啶曕ぞ啶班啶ぞ啶ㄠ啶掂た啶� 啶曕ぐ啶�
+cursor_hand_tool_label=啶灌じ啷嵿い 啶膏ぞ啶оえ
+
+
+
+# Document properties dialog box
+document_properties.title=啶︵じ啷嵿い啶愢さ啶� 啶椸啶`ぇ啶班啶��
+document_properties_label=啶︵じ啷嵿い啶愢さ啶� 啶椸啶`ぇ啶班啶��
+document_properties_file_name=啶ぞ啶囙げ啶氞 啶ㄠぞ啶�:
+document_properties_file_size=啶ぞ啶囙げ 啶嗋啶距ぐ:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} 啶ぞ啶囙啷嵿じ)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} 啶ぞ啶囙啷嵿じ)
+document_properties_title=啶多た啶班啶粪:
+document_properties_author=啶侧啶栢:
+document_properties_subject=啶掂た啶粪く:
+document_properties_keywords=啶啶栢啶ざ啶啶�:
+document_properties_creation_date=啶ㄠた啶班啶ぞ啶� 啶︵た啶ㄠぞ啶傕:
+document_properties_modification_date=啶︵啶班啶膏啶む 啶︵た啶ㄠぞ啶傕:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=啶ㄠた啶班啶ぞ啶むぞ:
+document_properties_producer=PDF 啶ㄠた啶班啶ぞ啶むぞ:
+document_properties_version=PDF 啶嗋さ啷冟い啷嵿い啷�:
+document_properties_page_count=啶啶粪啶� 啶膏啶栢啶ぞ:
+document_properties_page_size=啶啶粪啶� 啶嗋啶距ぐ:
+document_properties_page_size_unit_inches=啶囙啶�
+document_properties_page_size_unit_millimeters=啶啶
+document_properties_page_size_orientation_portrait=啶夃き啷� 啶ぞ啶傕ぁ啶`
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Letter
+document_properties_page_size_name_legal=Legal
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized_yes=啶灌
+document_properties_linearized_no=啶ㄠぞ啶灌
+document_properties_close=啶啶� 啶曕ぐ啶�
+
+print_progress_message=啶涏お啶距 啶曕ぐ啷�啶むぞ 啶啶粪啶� 啶むく啶距ぐ 啶曕ぐ啷�啶� 啶嗋す啷団��
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=啶班う啷嵿う 啶曕ぐ啶�
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=啶ぞ啶溹啶氞啶啷嵿啷� 啶熰啶椸げ 啶曕ぐ啶�
+toggle_sidebar_notification.title=啶ぞ啶溹啶氞 啶啷嵿啷� 啶熰啶椸げ 啶曕ぐ啶� (啶︵じ啷嵿い啶愢さ啶溹ぞ啶ぇ啷嵿く啷� 啶班啶ぐ啷囙し啶�/啶溹啶∴ぃ啷嵿く啶� 啶嗋す啷囙い)
+toggle_sidebar_label=啶ぞ啶溹啶氞啶啷嵿啷� 啶熰啶椸げ 啶曕ぐ啶�
+document_outline.title=啶︵じ啷嵿い啶愢さ啶� 啶ぞ啶灌啶ぐ啷囙啶� 啶︵ぐ啷嵿ざ啶掂ぞ (啶掂た啶膏啶む啶� 啶曕ぐ啶`啶ぞ啶膏ぞ啶犩 啶︵啶ㄠさ啷囙こ啶� 啶曕啶侧た啶� 啶曕ぐ啶� /啶膏ぐ啷嵿さ 啶樴啶� 啶︵ぞ啶栢さ啶�)
+document_outline_label=啶︵じ啷嵿い啶愢さ啶� 啶班啶ぐ啷囙し啶�
+attachments.title=啶溹啶∴お啶む啶� 啶︵ぞ啶栢さ啶�
+attachments_label=啶溹啶∴お啶む啶�
+thumbs.title=啶ム啶え啷囙げ啷嵿じ啷� 啶︵ぞ啶栢さ啶�
+thumbs_label=啶ム啶え啷囙げ啷嵿じ啷�
+findbar.title=啶︵じ啷嵿い啶愢さ啶溹ぞ啶� 啶多啶оぞ
+findbar_label=啶多啶оぞ
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=啶啶粪啶� {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=啶啶粪啶犩ぞ啶氞 啶ム啶え啷囙げ {{page}}
+
+# Find panel button title and messages
+find_input.title=啶多啶оぞ
+find_input.placeholder=啶︵じ啷嵿い啶愢さ啶溹ぞ啶� 啶多啶оぞ鈥�
+find_previous.title=啶掂ぞ啶曕お啷嵿ぐ啶啶椸啷� 啶ぞ啶椸啶� 啶樴啶ㄠぞ 啶多啶оぞ
+find_previous_label=啶ぞ啶椸啶�
+find_next.title=啶掂ぞ啶曕お啷嵿ぐ啶啶椸啷� 啶啶⑧啶� 啶樴啶ㄠぞ 啶多啶оぞ
+find_next_label=啶啶⑧啶�
+find_highlight=啶膏ぐ啷嵿さ 啶犩こ啶� 啶曕ぐ啶�
+find_match_case_label=啶嗋啶距ぐ 啶溹啶赤さ啶�
+find_reached_top=啶︵じ啷嵿い啶愢さ啶溹ぞ啶氞啶ぞ 啶多啶班啶粪啶距じ 啶啶灌啶侧, 啶むこ啶ぞ啶膏啶� 啶啶⑧
+find_reached_bottom=啶︵じ啷嵿い啶愢さ啶溹ぞ啶氞啶ぞ 啶むこ啶距げ啶� 啶啶灌啶侧, 啶多啶班啶粪啶距お啶距じ啷傕え 啶啶⑧
+find_not_found=啶掂ぞ啶曕お啷嵿ぐ啶啶� 啶嗋あ啶赤げ啷� 啶ㄠぞ啶灌
+
+# Error panel labels
+error_more_info=啶嗋ぃ啶栢 啶ぞ啶灌た啶む
+error_less_info=啶曕ぎ啷� 啶ぞ啶灌た啶む
+error_close=啶啶� 啶曕ぐ啶�
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=啶膏啶︵啶�: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=啶膏啶熰啶�: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=啶ぞ啶囙げ: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=啶班啶�: {{line}}
+rendering_error=啶啶粪啶� 啶︵ぞ啶栢さ啶む啶掂啶赤 啶む啶班啶熰 啶嗋あ啶赤げ啷�.
+
+# Predefined zoom values
+page_scale_width=啶啶粪啶犩ぞ啶氞 啶班啶傕う啷�
+page_scale_fit=啶啶粪啶� 啶じ啶掂ぞ
+page_scale_auto=啶膏啶掂く啶� 啶侧ぞ啶灌え 啶曕た啶傕さ啶� 啶啶犩 啶曕ぐ啶`
+page_scale_actual=啶啶班い啷嵿く啶曕啶� 啶嗋啶距ぐ
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=啶む啶班啶熰
+loading_error=PDF 啶侧啶� 啶曕ぐ啶む啶掂啶赤 啶む啶班啶熰 啶嗋あ啶赤げ啷�.
+invalid_file_error=啶呧さ啷堗ぇ 啶曕た啶傕さ啶� 啶︵啶粪啶� PDF 啶ぞ啶囙げ.
+missing_file_error=啶� 啶嗋あ啶赤ぃ啶距ぐ啷� PDF 啶ぞ啶囙げ.
+unexpected_response_error=啶呧え啶啶曕啶粪た啶� 啶膏ぐ啷嵿さ啷嵿す啶� 啶啶班い啶苦じ啶距う.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} 啶熰た啶ぃ啷嵿ぃ啷�]
+password_label=啶灌 PDF 啶ぞ啶囙げ 啶夃啶∴ぃ啷嵿く啶距啶班た啶むぞ 啶ぞ啶膏さ啶班啶� 啶︵啶ぞ.
+password_invalid=啶呧さ啷堗ぇ 啶ぞ啶膏さ啶班啶�. 啶曕啶く啶� 啶啶ㄠ啶灌ぞ 啶啶班く啶む啶� 啶曕ぐ啶�.
+password_ok=啶犩啶� 啶嗋す啷�
+password_cancel=啶班う啷嵿う 啶曕ぐ啶�
+
+printing_not_supported=啶膏ぞ啶掂ぇ啶距え啶むぞ: 啶ぞ 啶啶班ぞ啶夃啶班い啶班啶 啶涏お啶距 啶啶班啶`お啶` 啶膏ぎ啶班啶ム啶� 啶ㄠぞ啶灌.
+printing_not_ready=啶膏ぞ啶掂ぇ啶距え啶むぞ: 啶涏お啶距啶曕ぐ啶苦い啶� PDF 啶啶班啶`い啶ぞ 啶侧啶� 啶澿ぞ啶侧 啶ㄠぞ啶灌.
+web_fonts_disabled=啶掂啶� 啶熰啶� 啶呧じ啶ぐ啷嵿ぅ啷�啶� 啶嗋す啷囙い: 啶忇ぎ啷嵿が啷囙ぁ啷囙ぁ PDF 啶熰啶� 啶掂ぞ啶ぐ 啶呧ざ啶曕啶�.
+document_colors_not_allowed=PDF 啶︵じ啷嵿い啶愢さ啶溹ぞ啶傕え啶� 啶む啶ぞ啶傕啷� 啶班啶� 啶掂ぞ啶ぐ啶`啶ぞ啶� 啶呧え啷佮ぎ啶む 啶ㄠぞ啶灌: 啶啶班ぞ啶夃啶班ぎ啶о啶 ' 啶啶粪啶犩ぞ啶傕え啶� 啶む啶ぞ啶傕啷� 啶班啶� 啶ㄠた啶掂ぁ啶`啶ぞ啶� 啶呧え啷佮ぎ啶む 啶︵啶ぞ' 啶啶� 啶曕啶侧 啶嗋す啷�.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ms/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ms/viewer.properties
new file mode 100644
index 0000000..3bc7907
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ms/viewer.properties
@@ -0,0 +1,242 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Halaman Dahulu
+previous_label=Dahulu
+next.title=Halaman Berikut
+next_label=Berikut
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=Halaman
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=daripada {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} daripada {{pagesCount}})
+
+zoom_out.title=Zum Keluar
+zoom_out_label=Zum Keluar
+zoom_in.title=Zum Masuk
+zoom_in_label=Zum Masuk
+zoom.title=Zum
+presentation_mode.title=Tukar ke Mod Persembahan
+presentation_mode_label=Mod Persembahan
+open_file.title=Buka Fail
+open_file_label=Buka
+print.title=Cetak
+print_label=Cetak
+download.title=Muat turun
+download_label=Muat turun
+bookmark.title=Paparan semasa (salin atau buka dalam tetingkap baru)
+bookmark_label=Paparan Semasa
+
+# Secondary toolbar and context menu
+tools.title=Alatan
+tools_label=Alatan
+first_page.title=Pergi ke Halaman Pertama
+first_page.label=Pergi ke Halaman Pertama
+first_page_label=Pergi ke Halaman Pertama
+last_page.title=Pergi ke Halaman Terakhir
+last_page.label=Pergi ke Halaman Terakhir
+last_page_label=Pergi ke Halaman Terakhir
+page_rotate_cw.title=Berputar ikut arah Jam
+page_rotate_cw.label=Berputar ikut arah Jam
+page_rotate_cw_label=Berputar ikut arah Jam
+page_rotate_ccw.title=Pusing berlawan arah jam
+page_rotate_ccw.label=Pusing berlawan arah jam
+page_rotate_ccw_label=Pusing berlawan arah jam
+
+cursor_text_select_tool.title=Dayakan Alatan Pilihan Teks
+cursor_text_select_tool_label=Alatan Pilihan Teks
+cursor_hand_tool.title=Dayakan Alatan Tangan
+cursor_hand_tool_label=Alatan Tangan
+
+scroll_vertical.title=Guna Skrol Menegak
+scroll_vertical_label=Skrol Menegak
+scroll_horizontal.title=Guna Skrol Mengufuk
+scroll_horizontal_label=Skrol Mengufuk
+scroll_wrapped.title=Guna Skrol Berbalut
+scroll_wrapped_label=Skrol Berbalut
+
+spread_none.title=Jangan hubungkan hamparan halaman
+spread_none_label=Tanpa Hamparan
+spread_odd.title=Hubungkan hamparan halaman dengan halaman nombor ganjil
+spread_odd_label=Hamparan Ganjil
+spread_even.title=Hubungkan hamparan halaman dengan halaman nombor genap
+spread_even_label=Hamparan Seimbang
+
+# Document properties dialog box
+document_properties.title=Sifat Dokumen鈥�
+document_properties_label=Sifat Dokumen鈥�
+document_properties_file_name=Nama fail:
+document_properties_file_size=Saiz fail:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} bait)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} bait)
+document_properties_title=Tajuk:
+document_properties_author=Pengarang:
+document_properties_subject=Subjek:
+document_properties_keywords=Kata kunci:
+document_properties_creation_date=Masa Dicipta:
+document_properties_modification_date=Tarikh Ubahsuai:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Pencipta:
+document_properties_producer=Pengeluar PDF:
+document_properties_version=Versi PDF:
+document_properties_page_count=Kiraan Laman:
+document_properties_page_size=Saiz Halaman:
+document_properties_page_size_unit_inches=dalam
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=potret
+document_properties_page_size_orientation_landscape=landskap
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Letter
+document_properties_page_size_name_legal=Legal
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=Paparan Web Pantas:
+document_properties_linearized_yes=Ya
+document_properties_linearized_no=Tidak
+document_properties_close=Tutup
+
+print_progress_message=Menyediakan dokumen untuk dicetak鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=Batal
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Togol Bar Sisi
+toggle_sidebar_notification.title=Togol Sidebar (dokumen mengandungi rangka/attachments)
+toggle_sidebar_label=Togol Bar Sisi
+document_outline.title=Papar Rangka Dokumen (klik-dua-kali untuk kembangkan/kolaps semua item)
+document_outline_label=Rangka Dokumen
+attachments.title=Papar Lampiran
+attachments_label=Lampiran
+thumbs.title=Papar Thumbnails
+thumbs_label=Imej kecil
+findbar.title=Cari didalam Dokumen
+findbar_label=Cari
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Halaman {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Halaman Imej kecil {{page}}
+
+# Find panel button title and messages
+find_input.title=Cari
+find_input.placeholder=Cari dalam dokumen鈥�
+find_previous.title=Cari teks frasa berkenaan yang terdahulu
+find_previous_label=Dahulu
+find_next.title=Cari teks frasa berkenaan yang berikut
+find_next_label=Berikut
+find_highlight=Serlahkan semua
+find_match_case_label=Huruf sepadan
+find_entire_word_label=Seluruh perkataan
+find_reached_top=Mencapai teratas daripada dokumen, sambungan daripada bawah
+find_reached_bottom=Mencapai terakhir daripada dokumen, sambungan daripada atas
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]={{current}} daripada {{total}} padanan
+find_match_count[two]={{current}} daripada {{total}} padanan
+find_match_count[few]={{current}} daripada {{total}} padanan
+find_match_count[many]={{current}} daripada {{total}} padanan
+find_match_count[other]={{current}} daripada {{total}} padanan
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]=Lebih daripada {{limit}} padanan
+find_match_count_limit[one]=Lebih daripada {{limit}} padanan
+find_match_count_limit[two]=Lebih daripada {{limit}} padanan
+find_match_count_limit[few]=Lebih daripada {{limit}} padanan
+find_match_count_limit[many]=Lebih daripada {{limit}} padanan
+find_match_count_limit[other]=Lebih daripada {{limit}} padanan
+find_not_found=Frasa tidak ditemui
+
+# Error panel labels
+error_more_info=Maklumat Lanjut
+error_less_info=Kurang Informasi
+error_close=Tutup
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Mesej: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Timbun: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Fail: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Garis: {{line}}
+rendering_error=Ralat berlaku ketika memberikan halaman.
+
+# Predefined zoom values
+page_scale_width=Lebar Halaman
+page_scale_fit=Muat Halaman
+page_scale_auto=Zoom Automatik
+page_scale_actual=Saiz Sebenar
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Ralat
+loading_error=Masalah berlaku semasa menuatkan sebuah PDF.
+invalid_file_error=Tidak sah atau fail PDF rosak.
+missing_file_error=Fail PDF Hilang.
+unexpected_response_error=Respon pelayan yang tidak dijangka.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Anotasi]
+password_label=Masukan kata kunci untuk membuka fail PDF ini.
+password_invalid=Kata laluan salah. Cuba lagi.
+password_ok=OK
+password_cancel=Batal
+
+printing_not_supported=Amaran: Cetakan ini tidak sepenuhnya disokong oleh pelayar ini.
+printing_not_ready=Amaran: PDF tidak sepenuhnya dimuatkan untuk dicetak.
+web_fonts_disabled=Fon web dinyahdayakan: tidak dapat menggunakan fon terbenam PDF.
+document_colors_not_allowed=Dokumen PDF tidak dibenarkan untuk menggunakan warna sendiri: 鈥淚zinkan halaman untuk memilih warna sendiri鈥� telah dinyahaktifkan dalam pelayar.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/my/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/my/viewer.properties
new file mode 100644
index 0000000..991fb17
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/my/viewer.properties
@@ -0,0 +1,180 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=醼♂�涐�勧�� 醼呩��欋�会��醼横�斸�踞��
+previous_label=醼♂�涐�勧�横�斸�贬�涐��
+next.title=醼涐�踞�贬�� 醼呩��欋�会��醼横�斸�踞��
+next_label=醼斸�贬���醼横�愥�佱��
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=醼呩��欋�会��醼横�斸�踞��
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages={{pagesCount}} 醽�
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pagesCount}} 醽� {{pageNumber}})
+
+zoom_out.title=醼佱�会��夺�丰�曖��
+zoom_out_label=醼佱�会��夺�丰�曖��
+zoom_in.title=醼佱�会�册�丰�曖��
+zoom_in_label=醼佱�会�册�丰�曖��
+zoom.title=醼佱�会��夺��/醼佱�会�册�丰�曖��
+presentation_mode.title=醼嗎�结�贬�羔�斸�结�贬�羔�愥�勧�横�曖�坚�呩�斸�呩�横�炨���� 醼�醼搬�羔�曖�坚�贬��勧�横�羔�曖��
+presentation_mode_label=醼嗎�结�贬�羔�斸�结�贬�羔�愥�勧�横�曖�坚�呩�斸�呩��
+open_file.title=醼栣���勧�横�♂��羔�栣�结�勧�丰�横�曖�亱
+open_file_label=醼栣�结�勧�横�丰�曖��
+print.title=醼曖��夺�斸�踞���曖�横�曖��
+print_label=醼曖��夺�斸�踞���曖�横�曖��
+download.title=醼�醼搬�羔�嗎�结��
+download_label=醼�醼搬�羔�嗎�结��
+bookmark.title=醼溼��醼横�涐�踞�� 醼欋�坚�勧�横��醼结�勧�横�� (醼濁�勧�横�羔�掅���羔�♂�炨�呩�横�欋�踞�� 醼�醼搬�羔�曖�� 醼炨���丰�欋�熱��愥�� 醼栣�结�勧�丰�横�曖��)
+bookmark_label=醼溼��醼横�涐�踞�� 醼欋�坚�勧�横��醼结�勧�横��
+
+# Secondary toolbar and context menu
+tools.title=醼�醼�涐��氠��欋�会���
+tools_label=醼�醼�涐��氠��欋�会���
+first_page.title=醼曖�戓�� 醼呩��欋�会��醼横�斸�踞��炨����
+first_page.label=醼曖�戓�� 醼呩��欋�会��醼横�斸�踞��炨����
+first_page_label=醼曖�戓�� 醼呩��欋�会��醼横�斸�踞��炨����
+last_page.title=醼斸�贬���醼横�嗎��夺�� 醼呩��欋�会��醼横�斸�踞��炨����
+last_page.label=醼斸�贬���醼横�嗎��夺�� 醼呩��欋�会��醼横�斸�踞��炨����
+last_page_label=醼斸�贬���醼横�嗎��夺�� 醼呩��欋�会��醼横�斸�踞��炨����
+page_rotate_cw.title=醼斸��涐��溼��醼横�愥�� 醼♂�愥���勧�横��
+page_rotate_cw.label=醼斸��涐��溼��醼横�愥�� 醼♂�愥���勧�横��
+page_rotate_cw_label=醼斸��涐��溼��醼横�愥�� 醼♂�愥���勧�横��
+page_rotate_ccw.title=醼斸��涐��溼��醼横�愥�� 醼曖�坚�贬��勧�横�羔�曖�坚�斸��
+page_rotate_ccw.label=醼斸��涐��溼��醼横�愥�� 醼曖�坚�贬��勧�横�羔�曖�坚�斸��
+page_rotate_ccw_label=醼斸��涐��溼��醼横�愥�� 醼曖�坚�贬��勧�横�羔�曖�坚�斸��
+
+
+# Document properties dialog box
+document_properties.title=醼欋�踞�愥�横�愥�欋�横�羔�欋�踞�愥�横�涐�� 醼傖��忈�横�炨�愥�贯�愥��欋�会���
+document_properties_label=醼欋�踞�愥�横�愥�欋�横�羔�欋�踞�愥�横�涐�� 醼傖��忈�横�炨�愥�贯�愥��欋�会���
+document_properties_file_name=醼栣���勧�� :
+document_properties_file_size=醼栣���勧�横�嗎���掅�� :
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} 醼�醼�溼���樶���愥�� ({{size_b}}醼樶���愥��)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=醼佱�贬��勧�横�羔�呩�夅�衡�� -
+document_properties_author=醼涐�贬�羔�炨��羔�炨��:
+document_properties_subject=醼♂��醼坚�贬��勧�横�羔�♂�涐��:\u0020
+document_properties_keywords=醼炨�贬��丰�佱�会��醼� 醼呩��溼��夺��:
+document_properties_creation_date=醼戓��愥�横�溼��曖�横�涐��醼横�呩�结��:
+document_properties_modification_date=醼曖�坚�勧�横�嗎�勧�横�涐��醼横�呩�结��:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=醼栣�斸�横�愥��羔�炨��:
+document_properties_producer=PDF 醼戓��愥�横�溼��曖�横�炨��:
+document_properties_version=PDF 醼椺��羔�涐�踞�勧�横��:
+document_properties_page_count=醼呩��欋�会��醼横�斸�踞��♂�涐�贬�♂�愥�结��醼�:
+document_properties_close=醼曖��愥��
+
+print_progress_message=Preparing document for printing鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=醼曖�氠�衡�嬦�栣�会��醼横�曖��
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=醼樶�贬�羔�愥�斸�横�羔�栣�结�勧�横�丰�曖��愥��
+toggle_sidebar_notification.title=醼樶�贬�羔�樶��羔�愥�斸�横�羔��醼�� 醼♂�栣�结�勧�丰��/醼♂�曖��愥�� 醼溼��曖�横�涐�斸�� (醼呩��愥�欋�横�羔�愥�结�勧�� outline/attachments 醼曖��濁�勧�横�斸���勧�横�炨�娽��)
+toggle_sidebar_label=醼栣�结�勧�横�丰�曖��愥�� 醼嗎�溼����醼横�掅��
+document_outline.title=醼呩��愥�欋�横�羔�♂��醼会�夅�横�羔�佱�会��曖�横��醼�� 醼曖�坚�曖�� (醼呩��涐�勧�横�羔�♂��羔�溼��夺�羔��醼�� 醼佱�会��夺��/醼佱�会�册�丰�涐�斸�� 醼�醼溼�呩�横�斸�踞�呩�横�佱�会��醼横�斸�踞��曖�横�曖��)
+document_outline_label=醼呩��愥�欋�横�羔�♂��醼会�夅�横�羔�佱�会��曖��
+attachments.title=醼愥�结�册�佱�会��醼横�欋�会��� 醼曖�坚�曖��
+attachments_label=醼愥�结�册�戓��羔�佱�会��醼横�欋�会���
+thumbs.title=醼曖��夺�涐��曖�横�勧�氠�横�欋�会��羔��醼�� 醼曖�坚�曖��
+thumbs_label=醼曖��夺�涐��曖�横�勧�氠�横�欋�会���
+findbar.title=Find in Document
+findbar_label=醼涐�踞��栣�结�贬�曖��
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=醼呩��欋�会��醼横�斸�踞�� {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=醼呩��欋�会��醼横�斸�踞��涐�册�� 醼曖��夺�涐��曖�横�勧�氠�� {{page}}
+
+# Find panel button title and messages
+find_input.title=醼涐�踞��栣�结�贬�曖��
+find_input.placeholder=醼呩��愥�欋�横�羔�戓�册�愥�结�勧�� 醼涐�踞��栣�结�贬�涐�斸�衡��
+find_previous.title=醼呩��醼�羔�呩��涐�册�� 醼♂�涐�勧�� 鈥嬦�栣�坚�呩�横�曖�结��羔�欋�踞���醼�� 醼涐�踞��栣�结�贬�曖��
+find_previous_label=醼斸�贬���醼横�炨����
+find_next.title=醼呩��醼�羔�呩��涐�册�� 醼斸�贬���醼横�戓�曖�� 鈥嬦�栣�坚�呩�横�曖�结��羔�欋�踞���醼�� 醼涐�踞��栣�结�贬�曖��
+find_next_label=醼涐�踞�贬�丰�炨����
+find_highlight=醼♂��羔�溼��夺�羔��醼�� 醼欋�会�夅�横�羔�炨��羔�曖��
+find_match_case_label=醼呩��溼��夺�� 醼愥����醼横�嗎���勧�横�曖��
+find_reached_top=醼呩��欋�会��醼横�斸�踞��戓��曖�� 醼涐�贬���醼横�斸�贬�曖�坚�亰 醼♂�嗎��夺�羔��醼斸�� 醼曖�坚�斸�横�呩�曖��
+find_reached_bottom=醼呩��欋�会��醼横�斸�踞��♂�嗎��夺�� 醼涐�贬���醼横�斸�贬�曖�坚�亰 醼戓��曖�横��醼斸�� 醼曖�坚�斸�横�呩�曖��
+find_not_found=醼呩��醼�羔�呩�� 醼欋�愥�结�贬�丰�涐�樶�搬��
+
+# Error panel labels
+error_more_info=醼斸�贬���醼横�戓�曖�横�♂�佱�会��醼横�♂�溼��醼横�欋�会���
+error_less_info=醼♂�斸�娽�横�羔�勧�氠�横�欋�会�踞�炨�贬�� 醼炨�愥�勧�横�羔�♂�佱�会��醼横�♂�溼��醼�
+error_close=醼曖��愥��
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=醼欋��醼横�嗎�贬�� - {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=醼♂�戓�曖�� - {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=醼栣���勧�� {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=醼溼���勧�横�� - {{line}}
+rendering_error=醼呩��欋�会��醼横�斸�踞���醼�� 醼曖��夺�栣�贬��横�斸�贬�佱�会��斸�横�欋�踞�� 醼♂�欋�踞��羔�愥�呩�横�佱��愥�结�贬�丰�涐�曖��愥�氠�横亱
+
+# Predefined zoom values
+page_scale_width=醼呩��欋�会��醼横�斸�踞�� 醼♂��醼会�氠��
+page_scale_fit=醼呩��欋�会��醼横�斸�踞�� 醼�醼结��醼横�愥��
+page_scale_auto=醼♂�溼���♂�溼�会�贬���醼� 醼佱�会��夺�丰�佱�会�册��
+page_scale_actual=醼♂�欋�踞�斸�横�愥��醼氠�横�涐�踞��愥�册�� 醼♂�涐�结�氠��
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=醼♂�欋�踞���
+loading_error=PDF 醼栣���勧�� 醼�醼��嗎�结�册�愥�勧�横�斸�贬�佱�会��斸�横�欋�踞�� 醼♂�欋�踞��羔�愥�呩�横�佱��愥�结�贬�丰�涐�曖��愥�氠�横亱
+invalid_file_error=醼欋�涐�炨�贬�� 醼炨���� 醼曖�会��醼横�斸�贬�炨�贬�� PDF 醼栣���勧��
+missing_file_error=PDF 醼曖�会�贬���醼横�嗎��夺��
+unexpected_response_error=醼欋�欋�会�踞�贬��横�溼�勧�横�丰�戓��羔�炨�贬�� 醼嗎��椺��欋�� 醼曖�坚�斸�横��醼坚��羔�佱�会��醼�
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} 醼♂�撫��曖�贯�曖��氠�横�栣�结�勧�丰�横�嗎���佱�会��醼篯
+password_label=PDF 醼♂��羔�栣�结�勧�横�丰�涐�斸�� 醼曖�愥�横�呩�横�濁�愥�横�♂��羔�戓�娽�横�丰�曖��
+password_invalid=醼呩��濁�踞��醼� 醼欋�踞��羔�炨�娽�横亱 醼戓�曖�横��醼坚���羔�呩��羔��醼坚�娽�丰�横�曖�亱
+password_ok=OK
+password_cancel=醼曖�氠�衡�嬦�栣�会��醼横�曖��
+
+printing_not_supported=醼炨�愥��曖�贬�羔�佱�会��醼横亰醼曖�涐�勧�丰�横�戓��愥�横�佱�坚�勧�横�羔��醼��め�樶�氠�贬���醼横�嗎��炨�娽�� 醼曖�坚�娽�丰�横�濁�呩�结��戓�贬���醼横�曖�夺�丰�欋�戓��羔�曖�� 醽�
+printing_not_ready=醼炨�愥��曖�贬�羔�佱�会��醼�: 醼氠�佱�� PDF 醼栣���勧�横�炨�娽�� 醼曖��夺�斸�踞��曖�横�涐�斸�� 醼欋�曖�坚�娽�丰�横�呩��夺�曖��
+web_fonts_disabled=Web fonts are disabled: unable to use embedded PDF fonts.
+document_colors_not_allowed=PDF 醼栣���勧�横�♂��� 醽庒�勧�横�羔�� 醼�醼��氠�横�曖���勧�横�♂�涐�贬��勧�横�欋�会��羔��醼�� 醼♂�炨��夺�羔�曖�坚��佱�结�勧�横�丰�欋�曖�贬�羔�戓��羔�曖�� 醽� '醼呩��欋�会��醼横�斸�踞��♂��羔�溼��夺�羔�♂��羔�♂�涐�贬��勧�横�涐�结�贬�羔�佱�会�氠�横�佱�结�勧�横��' 醼♂��� 醼氠�佱�� 醼樶�氠�贬���醼横�嗎��愥�结�勧�� 醼曖��愥�横�戓��羔�佱�坚�勧�横�羔��醼坚�贬��勧�横�丰�栣�坚�呩�� 醼炨�踞��
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/nb-NO/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/nb-NO/viewer.properties
new file mode 100644
index 0000000..fc98982
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/nb-NO/viewer.properties
@@ -0,0 +1,242 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Forrige side
+previous_label=Forrige
+next.title=Neste side
+next_label=Neste
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=Side
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=av {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} av {{pagesCount}})
+
+zoom_out.title=Zoom ut
+zoom_out_label=Zoom ut
+zoom_in.title=Zoom inn
+zoom_in_label=Zoom inn
+zoom.title=Zoom
+presentation_mode.title=Bytt til presentasjonsmodus
+presentation_mode_label=Presentasjonsmodus
+open_file.title=脜pne fil
+open_file_label=脜pne
+print.title=Skriv ut
+print_label=Skriv ut
+download.title=Last ned
+download_label=Last ned
+bookmark.title=N氓v忙rende visning (kopier eller 氓pne i et nytt vindu)
+bookmark_label=N氓v忙rende visning
+
+# Secondary toolbar and context menu
+tools.title=Verkt酶y
+tools_label=Verkt酶y
+first_page.title=G氓 til f酶rste side
+first_page.label=G氓 til f酶rste side
+first_page_label=G氓 til f酶rste side
+last_page.title=G氓 til siste side
+last_page.label=G氓 til siste side
+last_page_label=G氓 til siste side
+page_rotate_cw.title=Roter med klokken
+page_rotate_cw.label=Roter med klokken
+page_rotate_cw_label=Roter med klokken
+page_rotate_ccw.title=Roter mot klokken
+page_rotate_ccw.label=Roter mot klokken
+page_rotate_ccw_label=Roter mot klokken
+
+cursor_text_select_tool.title=Aktiver tekstmarkeringsverkt酶y
+cursor_text_select_tool_label=Tekstmarkeringsverkt酶y
+cursor_hand_tool.title=Aktiver handverkt酶y
+cursor_hand_tool_label=Handverkt酶y
+
+scroll_vertical.title=Bruk vertikal rulling
+scroll_vertical_label=Vertikal rulling
+scroll_horizontal.title=Bruk horisontal rulling
+scroll_horizontal_label=Horisontal rulling
+scroll_wrapped.title=Bruk flersiderulling
+scroll_wrapped_label=Flersiderulling
+
+spread_none.title=Vis enkeltsider
+spread_none_label=Enkeltsider
+spread_odd.title=Vis oppslag med ulike sidenumre til venstre
+spread_odd_label=Oppslag med forside
+spread_even.title=Vis oppslag med like sidenumre til venstre
+spread_even_label=Oppslag uten forside
+
+# Document properties dialog box
+document_properties.title=Dokumentegenskaper 鈥�
+document_properties_label=Dokumentegenskaper 鈥�
+document_properties_file_name=Filnavn:
+document_properties_file_size=Filst酶rrelse:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=Dokumentegenskaper 鈥�
+document_properties_author=Forfatter:
+document_properties_subject=Emne:
+document_properties_keywords=N酶kkelord:
+document_properties_creation_date=Opprettet dato:
+document_properties_modification_date=Endret dato:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Opprettet av:
+document_properties_producer=PDF-verkt酶y:
+document_properties_version=PDF-versjon:
+document_properties_page_count=Sideantall:
+document_properties_page_size=Sidest酶rrelse:
+document_properties_page_size_unit_inches=in
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=st氓ende
+document_properties_page_size_orientation_landscape=liggende
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Letter
+document_properties_page_size_name_legal=Legal
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=Hurtig nettvisning:
+document_properties_linearized_yes=Ja
+document_properties_linearized_no=Nei
+document_properties_close=Lukk
+
+print_progress_message=Forbereder dokument for utskrift 鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=Avbryt
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Sl氓 av/p氓 sidestolpe
+toggle_sidebar_notification.title=Vis/gjem sidestolpe (dokumentet inneholder oversikt/vedlegg)
+toggle_sidebar_label=Sl氓 av/p氓 sidestolpe
+document_outline.title=Vis dokumentdisposisjonen (dobbeltklikk for 氓 utvide/skjule alle elementer)
+document_outline_label=Dokumentdisposisjon
+attachments.title=Vis vedlegg
+attachments_label=Vedlegg
+thumbs.title=Vis miniatyrbilde
+thumbs_label=Miniatyrbilde
+findbar.title=Finn i dokumentet
+findbar_label=Finn
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Side {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Miniatyrbilde av side {{page}}
+
+# Find panel button title and messages
+find_input.title=S酶k
+find_input.placeholder=S酶k i dokument鈥�
+find_previous.title=Finn forrige forekomst av frasen
+find_previous_label=Forrige
+find_next.title=Finn neste forekomst av frasen
+find_next_label=Neste
+find_highlight=Uthev alle
+find_match_case_label=Skill store/sm氓 bokstaver
+find_entire_word_label=Hele ord
+find_reached_top=N氓dde toppen av dokumentet, fortsetter fra bunnen
+find_reached_bottom=N氓dde bunnen av dokumentet, fortsetter fra toppen
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]={{current}} av {{total}} treff
+find_match_count[two]={{current}} av {{total}} treff
+find_match_count[few]={{current}} av {{total}} treff
+find_match_count[many]={{current}} av {{total}} treff
+find_match_count[other]={{current}} av {{total}} treff
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]=Mer enn {{limit}} treff
+find_match_count_limit[one]=Mer enn {{limit}} treff
+find_match_count_limit[two]=Mer enn {{limit}} treff
+find_match_count_limit[few]=Mer enn {{limit}} treff
+find_match_count_limit[many]=Mer enn {{limit}} treff
+find_match_count_limit[other]=Mer enn {{limit}} treff
+find_not_found=Fant ikke teksten
+
+# Error panel labels
+error_more_info=Mer info
+error_less_info=Mindre info
+error_close=Lukk
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (bygg: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Melding: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stakk: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Fil: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Linje: {{line}}
+rendering_error=En feil oppstod ved opptegning av siden.
+
+# Predefined zoom values
+page_scale_width=Sidebredde
+page_scale_fit=Tilpass til siden
+page_scale_auto=Automatisk zoom
+page_scale_actual=Virkelig st酶rrelse
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}} %
+
+# Loading indicator messages
+loading_error_indicator=Feil
+loading_error=En feil oppstod ved lasting av PDF.
+invalid_file_error=Ugyldig eller skadet PDF-fil.
+missing_file_error=Manglende PDF-fil.
+unexpected_response_error=Uventet serverrespons.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} annotasjon]
+password_label=Skriv inn passordet for 氓 氓pne denne PDF-filen.
+password_invalid=Ugyldig passord. Pr酶v igjen.
+password_ok=OK
+password_cancel=Avbryt
+
+printing_not_supported=Advarsel: Utskrift er ikke fullstendig st酶ttet av denne nettleseren.
+printing_not_ready=Advarsel: PDF er ikke fullstendig innlastet for utskrift.
+web_fonts_disabled=Web-fonter er avsl氓tt: Kan ikke bruke innbundne PDF-fonter.
+document_colors_not_allowed=PDF-dokumenter tillates ikke 氓 bruke deres egne farger: "Tillat sider 氓 velge egne farger" er deaktivert i nettleseren.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ne-NP/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ne-NP/viewer.properties
new file mode 100644
index 0000000..13bf69b
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ne-NP/viewer.properties
@@ -0,0 +1,184 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=啶呧啶苦げ啷嵿げ啷� 啶啶粪啶�
+previous_label=啶呧啶苦げ啷嵿げ啷�
+next.title=啶啶苦げ啷嵿げ啷� 啶啶粪啶�
+next_label=啶啶苦げ啷嵿げ啷�
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=啶啶粪啶�
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages={{pagesCount}} 啶ぇ啷嵿く啷�
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pagesCount}} 啶曕 {{pageNumber}})
+
+zoom_out.title=啶溹啶� 啶樴啶距啶ㄠ啶灌啶膏
+zoom_out_label=啶溹啶� 啶樴啶距啶ㄠ啶灌啶膏
+zoom_in.title=啶溹啶� 啶あ啶距啶ㄠ啶灌啶膏
+zoom_in_label=啶溹啶� 啶あ啶距啶ㄠ啶灌啶膏
+zoom.title=啶溹啶� 啶椸ぐ啷嵿え啷佮す啷嬥じ啷�
+presentation_mode.title=啶啶班じ啷嵿い啷佮い啶� 啶啶∴ぎ啶� 啶溹ぞ啶ㄠ啶灌啶膏
+presentation_mode_label=啶啶班じ啷嵿い啷佮い啶� 啶啶�
+open_file.title=啶ぞ啶囙げ 啶栢啶侧啶ㄠ啶灌啶膏
+open_file_label=啶栢啶侧啶ㄠ啶灌啶膏
+print.title=啶啶︵啶班ぃ 啶椸ぐ啷嵿え啷佮す啷嬥じ啷�
+print_label=啶啶︵啶班ぃ 啶椸ぐ啷嵿え啷佮す啷嬥じ啷�
+download.title=啶∴ぞ啶夃え啶侧啶∴す啶班
+download_label=啶∴ぞ啶夃え啶侧啶∴す啶班
+bookmark.title=啶掂ぐ啷嵿い啶ぞ啶� 啶︵啶多啶� (啶啶班い啶苦げ啶苦お啶� 啶椸ぐ啷嵿え啷佮す啷嬥じ啷� 啶掂ぞ 啶ㄠく啶距 啶膏啷嵿啷嵿く啶距げ啶ぞ 啶栢啶侧啶ㄠ啶灌啶膏)
+bookmark_label=啶灌ぞ啶侧啷� 啶︵啶多啶�
+
+# Secondary toolbar and context menu
+tools.title=啶斷啶距ぐ啶灌ぐ啷�
+tools_label=啶斷啶距ぐ啶灌ぐ啷�
+first_page.title=啶す啶苦げ啷� 啶啶粪啶犩ぎ啶� 啶溹ぞ啶ㄠ啶灌啶膏
+first_page.label=啶す啶苦げ啷� 啶啶粪啶犩ぎ啶� 啶溹ぞ啶ㄠ啶灌啶膏
+first_page_label=啶す啶苦げ啷� 啶啶粪啶犩ぎ啶� 啶溹ぞ啶ㄠ啶灌啶膏
+last_page.title=啶啶苦げ啷嵿げ啷� 啶啶粪啶犩ぎ啶� 啶溹ぞ啶ㄠ啶灌啶膏
+last_page.label=啶啶苦げ啷嵿げ啷� 啶啶粪啶犩ぎ啶� 啶溹ぞ啶ㄠ啶灌啶膏
+last_page_label=啶啶苦げ啷嵿げ啷� 啶啶粪啶犩ぎ啶� 啶溹ぞ啶ㄠ啶灌啶膏
+page_rotate_cw.title=啶樴ぁ啷�啶曕 啶︵た啶多ぞ啶ぞ 啶樴啶ぞ啶夃え啷佮す啷嬥じ啷�
+page_rotate_cw.label=啶樴ぁ啷�啶曕 啶︵た啶多ぞ啶ぞ 啶樴啶ぞ啶夃え啷佮す啷嬥じ啷�
+page_rotate_cw_label=啶樴ぁ啷�啶曕 啶︵た啶多ぞ啶ぞ 啶樴啶ぞ啶夃え啷佮す啷嬥じ啷�
+page_rotate_ccw.title=啶樴ぁ啷�啶曕 啶掂た啶ぐ啶苦い 啶︵た啶多ぞ啶ぞ 啶樴啶ぞ啶夃え啷佮す啷嬥じ啷�
+page_rotate_ccw.label=啶樴ぁ啷�啶曕 啶掂た啶ぐ啶苦い 啶︵た啶多ぞ啶ぞ 啶樴啶ぞ啶夃え啷佮す啷嬥じ啷�
+page_rotate_ccw_label=啶樴ぁ啷�啶曕 啶掂た啶ぐ啶苦い 啶︵た啶多ぞ啶ぞ 啶樴啶ぞ啶夃え啷佮す啷嬥じ啷�
+
+cursor_text_select_tool.title=啶ぞ啶� 啶氞く啶� 啶夃お啶曕ぐ啶� 啶膏啷嵿し啶� 啶椸ぐ啷嵿え啷佮す啷嬥じ啷�
+cursor_text_select_tool_label=啶ぞ啶� 啶氞く啶� 啶夃お啶曕ぐ啶�
+cursor_hand_tool.title=啶灌ぞ啶む 啶夃お啶曕ぐ啶� 啶膏啷嵿し啶� 啶椸ぐ啷嵿え啷佮す啷嬥じ啷�
+cursor_hand_tool_label=啶灌ぞ啶む 啶夃お啶曕ぐ啶�
+
+# Document properties dialog box
+document_properties.title=啶曕ぞ啶椸啶距い 啶掂た啶多啶粪い啶距す啶班...
+document_properties_label=啶曕ぞ啶椸啶距い 啶掂た啶多啶粪い啶距す啶班...
+document_properties_file_name=啶ぞ啶囙げ 啶ㄠぞ啶�:
+document_properties_file_size=啶ぞ啶囙げ 啶嗋啶距ぐ:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=啶多啶班啶粪:
+document_properties_author=啶侧啶栢:
+document_properties_subject=啶掂た啶粪く啶�
+document_properties_keywords=啶多が啷嵿う啶曕啶炧啶溹啶�
+document_properties_creation_date=啶膏た啶班啶溹え啶� 啶椸ぐ啶苦啶曕 啶た啶むた:
+document_properties_modification_date=啶ぐ啶苦ぎ啶距ぐ啷嵿啶苦い 啶た啶むた:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=啶膏ぐ啷嵿啶�:
+document_properties_producer=PDF 啶ㄠた啶班啶ぞ啶むぞ:
+document_properties_version=PDF 啶膏啶膏啶曕ぐ啶�
+document_properties_page_count=啶啶粪啶� 啶椸ぃ啶ㄠぞ:
+document_properties_close=啶え啷嵿う 啶椸ぐ啷嵿え啷佮す啷嬥じ啷�
+
+print_progress_message=啶啶︵啶班ぃ啶曕ぞ 啶侧ぞ啶椸た 啶曕ぞ啶椸啶距い 啶むく啶距ぐ啷� 啶椸ぐ啶苦う啷堚��
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=啶班う啷嵿う 啶椸ぐ啷嵿え啷佮す啷嬥じ啷�
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=啶熰啶� 啶膏ぞ啶囙ぁ啶ぞ啶�
+toggle_sidebar_notification.title=啶膏ぞ啶囙ぁ啶ぞ啶� 啶熰啶� 啶椸ぐ啷嵿え啷佮す啷嬥じ啷� (啶曕ぞ啶椸啶距い啶ぞ 啶膏ぎ啶距さ啷囙ざ 啶啶曕 啶曕啶班ぞ啶灌ぐ啷� 啶班啶ぐ啷囙啶�/attachments)
+toggle_sidebar_label=啶熰啶� 啶膏ぞ啶囙ぁ啶ぞ啶�
+document_outline.title=啶曕ぞ啶椸啶距い啶曕 啶班啶ぐ啷囙啶� 啶︵啶栢ぞ啶夃え啷佮す啷嬥じ啷� (啶膏が啷� 啶掂じ啷嵿い啷佮す啶班 啶掂た啶膏啶むぞ啶�/啶い啶� 啶椸ぐ啷嵿え 啶∴が啶�-啶曕啶侧た啶� 啶椸ぐ啷嵿え啷佮す啷嬥じ啷�)
+document_outline_label=啶︵じ啷嵿い啶距さ啷囙啶曕 啶班啶ぐ啷囙啶�
+attachments.title=啶膏啶侧啷嵿え啶灌ぐ啷� 啶︵啶栢ぞ啶夃え啷佮す啷嬥じ啷�
+attachments_label=啶膏啶侧啷嵿え啶曕す啶班
+thumbs.title=啶ムぎ啷嵿が啶ㄠ啶侧す啶班 啶︵啶栢ぞ啶夃え啷佮す啷嬥じ啷�
+thumbs_label=啶ムぎ啷嵿が啶ㄠ啶侧す啶班
+findbar.title=啶曕ぞ啶椸啶距い啶ぞ 啶啶侧ぞ 啶ぞ啶班啶ㄠ啶灌啶膏
+findbar_label=啶啶侧ぞ 啶ぞ啶班啶ㄠ啶灌啶膏
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=啶啶粪啶� {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas={{page}} 啶啶粪啶犩啷� 啶ムぎ啷嵿が啶ㄠ啶�
+
+# Find panel button title and messages
+find_input.title=啶啶侧ぞ 啶ぞ啶班啶ㄠ啶灌啶膏
+find_input.placeholder=啶曕ぞ啶椸啶距い啶ぞ 啶啶侧ぞ 啶ぞ啶班啶ㄠ啶灌啶膏鈥�
+find_previous.title=啶じ 啶掂ぞ啶曕啶ぞ啶傕ざ啶曕 啶呧啶苦げ啷嵿げ啷� 啶樴啶ㄠぞ 啶啶侧ぞ 啶ぞ啶班啶ㄠ啶灌啶膏
+find_previous_label=啶呧啶苦げ啷嵿げ啷�
+find_next.title=啶じ 啶掂ぞ啶曕啶ぞ啶傕ざ啶曕 啶啶苦げ啷嵿げ啷� 啶樴啶ㄠぞ 啶啶侧ぞ 啶ぞ啶班啶ㄠ啶灌啶膏
+find_next_label=啶呧ぐ啷嵿啷�
+find_highlight=啶膏が啷� 啶灌ぞ啶囙げ啶距啶� 啶椸ぐ啷嵿え啷�
+find_match_case_label=啶曕啶� 啶溹啶∴ぞ 啶た啶侧ぞ啶夃え啷佮す啷嬥じ啷�
+find_reached_top=啶啶粪啶犩啷� 啶多た啶班啶粪ぎ啶� 啶啶椸啶, 啶むげ啶ぞ啶� 啶溹ぞ啶班 啶椸ぐ啶苦啶曕 啶ムた啶
+find_reached_bottom=啶啶粪啶犩啷� 啶呧え啷嵿い啷嵿く啶ぞ 啶啶椸啶, 啶多た啶班啶粪が啶距 啶溹ぞ啶班 啶椸ぐ啶苦啶曕 啶ムた啶
+find_not_found=啶掂ぞ啶曕啶ぞ啶傕ざ 啶啶侧ぞ 啶ぐ啷囙え
+
+# Error panel labels
+error_more_info=啶ムお 啶溹ぞ啶ㄠ啶距ぐ啷�
+error_less_info=啶曕ぎ 啶溹ぞ啶ㄠ啶距ぐ啷�
+error_close=啶え啷嵿う 啶椸ぐ啷嵿え啷佮す啷嬥じ啷�
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=啶膏え啷嵿う啷囙ざ: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=啶膏啶熰啶ぞ啶�: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=啶ぞ啶囙げ: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=啶侧ぞ啶囙え: {{line}}
+rendering_error=啶啶粪啶� 啶啶班い啶苦お啶距う啶� 啶椸ぐ啷嵿う啶� 啶忇啶熰ぞ 啶む啶班啶熰た 啶︵啶栢ぞ啶ぐ啷嶁�嵿く啷嬥イ
+
+# Predefined zoom values
+page_scale_width=啶啶粪啶� 啶氞啶∴ぞ啶�
+page_scale_fit=啶啶粪啶� 啶犩た啶曕啶� 啶た啶侧啶ㄠ
+page_scale_auto=啶膏啶掂啶距げ啶苦い 啶溹啶�
+page_scale_actual=啶掂ぞ啶膏啶むさ啶苦 啶嗋啶距ぐ
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=啶む啶班啶熰た
+loading_error=啶 PDF 啶侧啶� 啶椸ぐ啷嵿う啶� 啶忇啶熰ぞ 啶む啶班啶熰た 啶︵啶栢ぞ啶ぐ啷嶁�嵿く啷嬥イ
+invalid_file_error=啶呧さ啷堗ぇ 啶掂ぞ 啶︵啶粪た啶� PDF 啶ぞ啶囙げ啷�
+missing_file_error=啶灌ぐ啶距啶班す啷囙啷� PDF 啶ぞ啶囙げ啷�
+unexpected_response_error=啶呧お啷嵿ぐ啶む啶ぞ啶多た啶� 啶膏ぐ啷嵿き啶� 啶啶班い啶苦啷嵿ぐ啶苦く啶距イ
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Annotation]
+password_label=啶じ PDF 啶ぞ啶囙げ啶侧ぞ啶� 啶栢啶侧啶� 啶椸啶啶ざ啶啶� 啶啶班さ啶苦し啷嵿 啶椸ぐ啷嵿え啷佮す啷嬥じ啷嵿イ
+password_invalid=啶呧さ啷堗ぇ 啶椸啶啶ざ啶啶︵イ 啶啶ㄠ 啶啶班く啶距じ 啶椸ぐ啷嵿え啷佮す啷嬥じ啷嵿イ
+password_ok=啶犩た啶� 啶�
+password_cancel=啶班う啷嵿う 啶椸ぐ啷嵿え啷佮す啷嬥じ啷�
+
+printing_not_supported=啶氞啶むぞ啶掂え啷�: 啶 啶啶班ぞ啶夃啶班ぎ啶� 啶啶︵啶班ぃ 啶啶班啶`い啶ぞ 啶膏ぎ啶班啶ムた啶� 啶涏啶ㄠイ
+printing_not_ready=啶氞啶むぞ啶掂え啷�: PDF 啶啶︵啶班ぃ啶曕ぞ 啶侧ぞ啶椸た 啶啶班啶`い啶ぞ 啶侧啶� 啶啶曕 啶涏啶ㄠイ
+web_fonts_disabled=啶掂啶� 啶え啷嵿 啶呧じ啶曕啶粪ぎ 啶涏え啷�: 啶忇ぎ啷嵿が啷囙ぁ啷囙ぁ PDF 啶え啷嵿 啶啶班く啷嬥 啶椸ぐ啷嵿え 啶呧じ啶ぐ啷嵿ぅ啷�
+document_colors_not_allowed=PDF 啶曕ぞ啶椸啶距い啶灌ぐ啷傕げ啶距 啶嗋か啷嵿え啷� 啶班 啶啶班く啷嬥 啶椸ぐ啷嵿え 啶呧え啷佮ぎ啶むた 啶涏啶�: '啶啶粪啶犩げ啶距 啶嗋か啷嵿え啷� 啶班 啶氞く啶� 啶椸ぐ啷嵿え 啶呧え啷佮ぎ啶むた 啶︵た啶ㄠ' 啶啶班ぞ啶夃啶班ぎ啶� 啶ㄠた啶粪啶曕啶班た啶� 啶椸ぐ啶苦啶曕 啶涏イ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/nl/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/nl/viewer.properties
new file mode 100644
index 0000000..7422f84
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/nl/viewer.properties
@@ -0,0 +1,242 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Vorige pagina
+previous_label=Vorige
+next.title=Volgende pagina
+next_label=Volgende
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=Pagina
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=van {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} van {{pagesCount}})
+
+zoom_out.title=Uitzoomen
+zoom_out_label=Uitzoomen
+zoom_in.title=Inzoomen
+zoom_in_label=Inzoomen
+zoom.title=Zoomen
+presentation_mode.title=Wisselen naar presentatiemodus
+presentation_mode_label=Presentatiemodus
+open_file.title=Bestand openen
+open_file_label=Openen
+print.title=Afdrukken
+print_label=Afdrukken
+download.title=Downloaden
+download_label=Downloaden
+bookmark.title=Huidige weergave (kopi毛ren of openen in nieuw venster)
+bookmark_label=Huidige weergave
+
+# Secondary toolbar and context menu
+tools.title=Hulpmiddelen
+tools_label=Hulpmiddelen
+first_page.title=Naar eerste pagina gaan
+first_page.label=Naar eerste pagina gaan
+first_page_label=Naar eerste pagina gaan
+last_page.title=Naar laatste pagina gaan
+last_page.label=Naar laatste pagina gaan
+last_page_label=Naar laatste pagina gaan
+page_rotate_cw.title=Rechtsom draaien
+page_rotate_cw.label=Rechtsom draaien
+page_rotate_cw_label=Rechtsom draaien
+page_rotate_ccw.title=Linksom draaien
+page_rotate_ccw.label=Linksom draaien
+page_rotate_ccw_label=Linksom draaien
+
+cursor_text_select_tool.title=Tekstselectiehulpmiddel inschakelen
+cursor_text_select_tool_label=Tekstselectiehulpmiddel
+cursor_hand_tool.title=Handhulpmiddel inschakelen
+cursor_hand_tool_label=Handhulpmiddel
+
+scroll_vertical.title=Verticaal scrollen gebruiken
+scroll_vertical_label=Verticaal scrollen
+scroll_horizontal.title=Horizontaal scrollen gebruiken
+scroll_horizontal_label=Horizontaal scrollen
+scroll_wrapped.title=Scrollen met terugloop gebruiken
+scroll_wrapped_label=Scrollen met terugloop
+
+spread_none.title=Dubbele pagina鈥檚 niet samenvoegen
+spread_none_label=Geen dubbele pagina鈥檚
+spread_odd.title=Dubbele pagina鈥檚 samenvoegen vanaf oneven pagina鈥檚
+spread_odd_label=Oneven dubbele pagina鈥檚
+spread_even.title=Dubbele pagina鈥檚 samenvoegen vanaf even pagina鈥檚
+spread_even_label=Even dubbele pagina鈥檚
+
+# Document properties dialog box
+document_properties.title=Documenteigenschappen鈥�
+document_properties_label=Documenteigenschappen鈥�
+document_properties_file_name=Bestandsnaam:
+document_properties_file_size=Bestandsgrootte:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=Titel:
+document_properties_author=Auteur:
+document_properties_subject=Onderwerp:
+document_properties_keywords=Trefwoorden:
+document_properties_creation_date=Aanmaakdatum:
+document_properties_modification_date=Wijzigingsdatum:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Maker:
+document_properties_producer=PDF-producent:
+document_properties_version=PDF-versie:
+document_properties_page_count=Aantal pagina鈥檚:
+document_properties_page_size=Paginagrootte:
+document_properties_page_size_unit_inches=in
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=staand
+document_properties_page_size_orientation_landscape=liggend
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Letter
+document_properties_page_size_name_legal=Legal
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=Snelle webweergave:
+document_properties_linearized_yes=Ja
+document_properties_linearized_no=Nee
+document_properties_close=Sluiten
+
+print_progress_message=Document voorbereiden voor afdrukken鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=Annuleren
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Zijbalk in-/uitschakelen
+toggle_sidebar_notification.title=Zijbalk in-/uitschakelen (document bevat overzicht/bijlagen)
+toggle_sidebar_label=Zijbalk in-/uitschakelen
+document_outline.title=Documentoverzicht tonen (dubbelklik om alle items uit/samen te vouwen)
+document_outline_label=Documentoverzicht
+attachments.title=Bijlagen tonen
+attachments_label=Bijlagen
+thumbs.title=Miniaturen tonen
+thumbs_label=Miniaturen
+findbar.title=Zoeken in document
+findbar_label=Zoeken
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Pagina {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Miniatuur van pagina {{page}}
+
+# Find panel button title and messages
+find_input.title=Zoeken
+find_input.placeholder=Zoeken in document鈥�
+find_previous.title=De vorige overeenkomst van de tekst zoeken
+find_previous_label=Vorige
+find_next.title=De volgende overeenkomst van de tekst zoeken
+find_next_label=Volgende
+find_highlight=Alles markeren
+find_match_case_label=Hoofdlettergevoelig
+find_entire_word_label=Hele woorden
+find_reached_top=Bovenkant van document bereikt, doorgegaan vanaf onderkant
+find_reached_bottom=Onderkant van document bereikt, doorgegaan vanaf bovenkant
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]={{current}} van {{total}} overeenkomst
+find_match_count[two]={{current}} van {{total}} overeenkomsten
+find_match_count[few]={{current}} van {{total}} overeenkomsten
+find_match_count[many]={{current}} van {{total}} overeenkomsten
+find_match_count[other]={{current}} van {{total}} overeenkomsten
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]=Meer dan {{limit}} overeenkomsten
+find_match_count_limit[one]=Meer dan {{limit}} overeenkomst
+find_match_count_limit[two]=Meer dan {{limit}} overeenkomsten
+find_match_count_limit[few]=Meer dan {{limit}} overeenkomsten
+find_match_count_limit[many]=Meer dan {{limit}} overeenkomsten
+find_match_count_limit[other]=Meer dan {{limit}} overeenkomsten
+find_not_found=Tekst niet gevonden
+
+# Error panel labels
+error_more_info=Meer informatie
+error_less_info=Minder informatie
+error_close=Sluiten
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Bericht: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stack: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Bestand: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Regel: {{line}}
+rendering_error=Er is een fout opgetreden bij het weergeven van de pagina.
+
+# Predefined zoom values
+page_scale_width=Paginabreedte
+page_scale_fit=Hele pagina
+page_scale_auto=Automatisch zoomen
+page_scale_actual=Werkelijke grootte
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Fout
+loading_error=Er is een fout opgetreden bij het laden van de PDF.
+invalid_file_error=Ongeldig of beschadigd PDF-bestand.
+missing_file_error=PDF-bestand ontbreekt. 
+unexpected_response_error=Onverwacht serverantwoord.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}}-aantekening]
+password_label=Voer het wachtwoord in om dit PDF-bestand te openen.
+password_invalid=Ongeldig wachtwoord. Probeer het opnieuw.
+password_ok=OK
+password_cancel=Annuleren
+
+printing_not_supported=Waarschuwing: afdrukken wordt niet volledig ondersteund door deze browser.
+printing_not_ready=Waarschuwing: de PDF is niet volledig geladen voor afdrukken.
+web_fonts_disabled=Weblettertypen zijn uitgeschakeld: gebruik van ingebedde PDF-lettertypen is niet mogelijk.
+document_colors_not_allowed=PDF-documenten mogen hun eigen kleuren niet gebruiken: 鈥楶agina鈥檚 toestaan om hun eigen kleuren te kiezen鈥� is uitgeschakeld in de browser.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/nn-NO/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/nn-NO/viewer.properties
new file mode 100644
index 0000000..27b4abb
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/nn-NO/viewer.properties
@@ -0,0 +1,242 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=F酶reg氓ande side
+previous_label=F酶reg氓ande
+next.title=Neste side
+next_label=Neste
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=Side
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=av {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} av {{pagesCount}})
+
+zoom_out.title=Zoom ut
+zoom_out_label=Zoom ut
+zoom_in.title=Zoom inn
+zoom_in_label=Zoom inn
+zoom.title=Zoom
+presentation_mode.title=Byt til presentasjonsmodus
+presentation_mode_label=Presentasjonsmodus
+open_file.title=Opne fil
+open_file_label=Opne
+print.title=Skriv ut
+print_label=Skriv ut
+download.title=Last ned
+download_label=Last ned
+bookmark.title=Gjeldande vising (kopier eller opne i nytt vindauge)
+bookmark_label=Gjeldande vising
+
+# Secondary toolbar and context menu
+tools.title=Verkt酶y
+tools_label=Verkt酶y
+first_page.title=G氓 til f酶rste side
+first_page.label=G氓 til f酶rste side
+first_page_label=G氓 til f酶rste side
+last_page.title=G氓 til siste side
+last_page.label=G氓 til siste side
+last_page_label=G氓 til siste side
+page_rotate_cw.title=Roter med klokka
+page_rotate_cw.label=Roter med klokka
+page_rotate_cw_label=Roter med klokka
+page_rotate_ccw.title=Roter mot klokka
+page_rotate_ccw.label=Roter mot klokka
+page_rotate_ccw_label=Roter mot klokka
+
+cursor_text_select_tool.title=Aktiver tekstmarkeringsverkt酶y
+cursor_text_select_tool_label=Tekstmarkeringsverkt酶y
+cursor_hand_tool.title=Aktiver handverkt酶y
+cursor_hand_tool_label=Handverkt酶y
+
+scroll_vertical.title=Bruk vertikal rulling
+scroll_vertical_label=Vertikal rulling
+scroll_horizontal.title=Bruk horisontal rulling
+scroll_horizontal_label=Horisontal rulling
+scroll_wrapped.title=Bruk fleirsiderulling
+scroll_wrapped_label=Fleirsiderulling
+
+spread_none.title=Vis enkeltsider
+spread_none_label=Enkeltside
+spread_odd.title=Vis oppslag med ulike sidenummer til venstre
+spread_odd_label=Oppslag med framside
+spread_even.title=Vis oppslag med like sidenummmer til venstre
+spread_even_label=Oppslag utan framside
+
+# Document properties dialog box
+document_properties.title=Dokumenteigenskapar鈥�
+document_properties_label=Dokumenteigenskapar鈥�
+document_properties_file_name=Filnamn:
+document_properties_file_size=Filstorleik:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=Tittel:
+document_properties_author=Forfattar:
+document_properties_subject=Emne:
+document_properties_keywords=Stikkord:
+document_properties_creation_date=Dato oppretta:
+document_properties_modification_date=Dato endra:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Oppretta av:
+document_properties_producer=PDF-verkt酶y:
+document_properties_version=PDF-versjon:
+document_properties_page_count=Sidetal:
+document_properties_page_size=Sidest酶rrelse:
+document_properties_page_size_unit_inches=in
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=st氓ande
+document_properties_page_size_orientation_landscape=liggande
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Brev
+document_properties_page_size_name_legal=Legal
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=Rask nettvising:
+document_properties_linearized_yes=Ja
+document_properties_linearized_no=Nei
+document_properties_close=Lat att
+
+print_progress_message=F酶rebur dokumentet for utskrift鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=Avbryt
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Sl氓 av/p氓 sidestolpe
+toggle_sidebar_notification.title=Vis/g酶ym sidestolpen (dokumentet inneheld oversikt/vedlegg)
+toggle_sidebar_label=Sl氓 av/p氓 sidestolpe
+document_outline.title=Vis dokumentdisposisjonen (dobbelklikk for 氓 utvide/g酶yme alle elementa)
+document_outline_label=Dokumentdisposisjon
+attachments.title=Vis vedlegg
+attachments_label=Vedlegg
+thumbs.title=Vis miniatyrbilde
+thumbs_label=Miniatyrbilde
+findbar.title=Finn i dokumentet
+findbar_label=Finn
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Side {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Miniatyrbilde av side {{page}}
+
+# Find panel button title and messages
+find_input.title=S酶k
+find_input.placeholder=S酶k i dokument鈥�
+find_previous.title=Finn f酶rre f酶rekomst av frasen
+find_previous_label=F酶rre
+find_next.title=Finn neste f酶rekomst av frasen
+find_next_label=Neste
+find_highlight=Uthev alle
+find_match_case_label=Skil store/sm氓 bokstavar
+find_entire_word_label=Heile ord
+find_reached_top=N氓dde toppen av dokumentet, fortset fr氓 botnen
+find_reached_bottom=N氓dde botnen av dokumentet, fortset fr氓 toppen
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]={{current}} av {{total}} treff
+find_match_count[two]={{current}} av {{total}} treff
+find_match_count[few]={{current}} av {{total}} treff
+find_match_count[many]={{current}} av {{total}} treff
+find_match_count[other]={{current}} av {{total}} treff
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]=Meir enn {{limit}} treff
+find_match_count_limit[one]=Meir enn {{limit}} treff
+find_match_count_limit[two]=Meir enn {{limit}} treff
+find_match_count_limit[few]=Meir enn {{limit}} treff
+find_match_count_limit[many]=Meir enn {{limit}} treff
+find_match_count_limit[other]=Meir enn {{limit}} treff
+find_not_found=Fann ikkje teksten
+
+# Error panel labels
+error_more_info=Meir info
+error_less_info=Mindre info
+error_close=Lat att
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (bygg: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Melding: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stakk: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Fil: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Linje: {{line}}
+rendering_error=Ein feil oppstod under vising av sida.
+
+# Predefined zoom values
+page_scale_width=Sidebreidde
+page_scale_fit=Tilpass til sida
+page_scale_auto=Automatisk skalering
+page_scale_actual=Verkeleg storleik
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Feil
+loading_error=Ein feil oppstod ved lasting av PDF.
+invalid_file_error=Ugyldig eller korrupt PDF-fil.
+missing_file_error=Manglande PDF-fil.
+unexpected_response_error=Uventa tenarrespons.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} annotasjon]
+password_label=Skriv inn passordet for 氓 opne denne PDF-fila.
+password_invalid=Ugyldig passord. Pr酶v igjen.
+password_ok=OK
+password_cancel=Avbryt
+
+printing_not_supported=脜tvaring: Utskrift er ikkje fullstendig st酶tta av denne nettlesaren.
+printing_not_ready=脜tvaring: PDF ikkje fullstendig innlasta for utskrift.
+web_fonts_disabled=Web-skrifter er sl氓tt av: Kan ikkje bruke innbundne PDF-skrifter.
+document_colors_not_allowed=PDF-dokument kan ikkje bruke eigne fargar: 芦Tillat sider 氓 velje eigne fargar禄 er deaktivert i nettlesaren.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/nso/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/nso/viewer.properties
new file mode 100644
index 0000000..d95406c
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/nso/viewer.properties
@@ -0,0 +1,130 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Letlakala le fetilego
+previous_label=Fetilego
+next.title=Letlakala le latelago
+next_label=Latelago
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+
+zoom_out.title=Bu拧et拧a ka gare
+zoom_out_label=Bu拧et拧a ka gare
+zoom_in.title=Godi拧et拧a ka ntle
+zoom_in_label=Godi拧et拧a ka ntle
+zoom.title=Godi拧a
+presentation_mode.title=Fetogela go mokgwa wa tlhagi拧o
+presentation_mode_label=Mokgwa wa tlhagi拧o
+open_file.title=Bula faele
+open_file_label=Bula
+print.title=Gati拧a
+print_label=Gati拧a
+download.title=Laolla
+download_label=Laolla
+bookmark.title=Pono ya bjale (kopi拧a le go bula lefasetereng le leswa)
+bookmark_label=Tebelelo ya gona bjale
+
+# Secondary toolbar and context menu
+
+
+# Document properties dialog box
+document_properties_file_name=Leina la faele:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_title=Thaetlele:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=艩ielanya para ya ka thoko
+toggle_sidebar_label=艩ielanya para ya ka thoko
+document_outline_label=Kakaret拧o ya tokumente
+thumbs.title=Laet拧a dikhut拧ofat拧o
+thumbs_label=Dikhut拧ofat拧o
+findbar.title=Hwet拧a go tokumente
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Letlakala {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Khut拧ofat拧o ya letlakala {{page}}
+
+# Find panel button title and messages
+find_previous.title=Hwet拧a tiragalo e fetilego ya sekafoko
+find_previous_label=Fetilego
+find_next.title=Hwet拧a tiragalo e latelago ya sekafoko
+find_next_label=Latelago
+find_highlight=Bonagat拧a t拧ohle
+find_match_case_label=Swant拧ha kheisi
+find_reached_top=Fihlile godimo ga tokumente, go t拧wet拧we pele go tloga tlase
+find_reached_bottom=Fihlile mafelelong a tokumente, go t拧wet拧we pele go tloga godimo
+find_not_found=Sekafoko ga sa hwet拧wa
+
+# Error panel labels
+error_more_info=Tshedimo拧o e oket拧egilego
+error_less_info=Tshedimo拧o ya tlasana
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Molaet拧a: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Mokgobo: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Faele: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Mothaladi: {{line}}
+rendering_error=Go diregile pho拧o ge go be go gafelwa letlakala.
+
+# Predefined zoom values
+page_scale_width=Bophara bja letlakala
+page_scale_fit=Go lekana ga letlakala
+page_scale_auto=Kgodi拧o ya maitiri拧o
+page_scale_actual=Bogolo bja kgonthe
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+
+# Loading indicator messages
+loading_error_indicator=Pho拧o
+loading_error=Go diregile pho拧o ge go hlahlelwa PDF.
+invalid_file_error=Faele ye e sa 拧omego goba e senyegilego ya PDF.
+missing_file_error=Faele yeo e sego gona ya PDF.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Tlhaloso]
+password_ok=LOKILE
+
+printing_not_supported=Temo拧o: Go gati拧a ga go thekgwe ke praosara ye ka botlalo.
+printing_not_ready=Temo拧o: PDF ga ya hlahlelwa ka botlalo bakeng sa go gati拧wa.
+web_fonts_disabled=Difonte t拧a wepe di 拧iti拧it拧we: ga e kgone go diri拧a difonte t拧a PDF t拧e khuti拧it拧wego.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/oc/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/oc/viewer.properties
new file mode 100644
index 0000000..2c520c2
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/oc/viewer.properties
@@ -0,0 +1,210 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Pagina precedenta
+previous_label=Precedent
+next.title=Pagina seguenta
+next_label=Seguent
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=Pagina
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=sus {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} sus {{pagesCount}})
+
+zoom_out.title=Zoom arri猫r
+zoom_out_label=Zoom arri猫r
+zoom_in.title=Zoom avant
+zoom_in_label=Zoom avant
+zoom.title=Zoom
+presentation_mode.title=Bascular en m貌de presentacion
+presentation_mode_label=M貌de Presentacion
+open_file.title=Dobrir lo fichi猫r
+open_file_label=Dobrir
+print.title=Imprimir
+print_label=Imprimir
+download.title=Telecargar
+download_label=Telecargar
+bookmark.title=Afichatge corrent (copiar o dobrir dins una fen猫stra nov猫la)
+bookmark_label=Afichatge actual
+
+# Secondary toolbar and context menu
+tools.title=Aisinas
+tools_label=Aisinas
+first_page.title=Anar a la primi猫ra pagina
+first_page.label=Anar a la primi猫ra pagina
+first_page_label=Anar a la primi猫ra pagina
+last_page.title=Anar a la darri猫ra pagina
+last_page.label=Anar a la darri猫ra pagina
+last_page_label=Anar a la darri猫ra pagina
+page_rotate_cw.title=Rotacion or脿ria
+page_rotate_cw.label=Rotacion or脿ria
+page_rotate_cw_label=Rotacion or脿ria
+page_rotate_ccw.title=Rotacion antior脿ria
+page_rotate_ccw.label=Rotacion antior脿ria
+page_rotate_ccw_label=Rotacion antior脿ria
+
+cursor_text_select_tool.title=Activar l'aisina de seleccion de t猫xte
+cursor_text_select_tool_label=Aisina de seleccion de t猫xte
+cursor_hand_tool.title=Activar l鈥檃isina man
+cursor_hand_tool_label=Aisina man
+
+scroll_vertical.title=Utilizar lo desfilament vertical
+scroll_vertical_label=Desfilament vertical
+scroll_horizontal.title=Utilizar lo desfilament orizontal
+scroll_horizontal_label=Desfilament orizontal
+
+
+# Document properties dialog box
+document_properties.title=Proprietats del document鈥�
+document_properties_label=Proprietats del document鈥�
+document_properties_file_name=Nom del fichi猫r聽:
+document_properties_file_size=Talha del fichi猫r聽:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} Ko ({{size_b}} octets)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} Mo ({{size_b}} octets)
+document_properties_title=T铆tol聽:
+document_properties_author=Autor聽:
+document_properties_subject=Subj猫cte聽:
+document_properties_keywords=Mots claus聽:
+document_properties_creation_date=Data de creacion聽:
+document_properties_modification_date=Data de modificacion聽:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Creator聽:
+document_properties_producer=Aisina de conversion PDF聽:
+document_properties_version=Version PDF聽:
+document_properties_page_count=Nombre de paginas聽:
+document_properties_page_size=Talha de la pagina聽:
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=retrait
+document_properties_page_size_orientation_landscape=pa茂satge
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Letra
+document_properties_page_size_name_legal=Document juridic
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}}聽{{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}}聽{{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized_yes=脪c
+document_properties_linearized_no=Non
+document_properties_close=Tampar
+
+print_progress_message=Preparacion del document per l鈥檌mpression鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=Anullar
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Afichar/amagar lo pan猫l lateral
+toggle_sidebar_notification.title=Afichar/amagar lo pan猫l lateral (lo document conten esqu猫mas/p猫莽as juntas)
+toggle_sidebar_label=Afichar/amagar lo pan猫l lateral
+document_outline.title=Mostrar los esqu猫mas del document (dobleclicar per espandre/reduire totes los elements)
+document_outline_label=Marcapaginas del document
+attachments.title=Visualizar las p猫莽as juntas
+attachments_label=P猫莽as juntas
+thumbs.title=Afichar las vinhetas
+thumbs_label=Vinhetas
+findbar.title=Trobar dins lo document
+findbar_label=Recercar
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Pagina {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Vinheta de la pagina {{page}}
+
+# Find panel button title and messages
+find_input.title=Recercar
+find_input.placeholder=Cercar dins lo document鈥�
+find_previous.title=Tr貌ba l'ocurr茅ncia precedenta de la frasa
+find_previous_label=Precedent
+find_next.title=Tr貌ba l'ocurr茅ncia venenta de la frasa
+find_next_label=Seguent
+find_highlight=Suslinhar tot
+find_match_case_label=Respectar la cassa
+find_reached_top=Naut de la pagina atenh, perseguida del bas
+find_reached_bottom=Bas de la pagina atench, perseguida al comen莽ament
+find_not_found=Frasa pas trobada
+
+# Error panel labels
+error_more_info=Mai de detalhs
+error_less_info=Mens d'informacions
+error_close=Tampar
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (identificant de compilacion聽: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Messatge聽: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Pila聽: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Fichi猫r聽: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Linha聽: {{line}}
+rendering_error=Una error s'es produita pendent l'afichatge de la pagina.
+
+# Predefined zoom values
+page_scale_width=Largor plena
+page_scale_fit=Pagina enti猫ra
+page_scale_auto=Zoom automatic
+page_scale_actual=Talha vertadi猫ra
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Error
+loading_error=Una error s'es produita pendent lo cargament del fichi猫r PDF.
+invalid_file_error=Fichi猫r PDF invalid o corromput.
+missing_file_error=Fichi猫r PDF mancant.
+unexpected_response_error=Responsa de servidor imprevista.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[Anotacion {{type}}]
+password_label=Picatz lo senhal per dobrir aqueste fichi猫r PDF.
+password_invalid=Senhal incorr猫cte. Tornatz ensajar.
+password_ok=D'ac貌rdi
+password_cancel=Anullar
+
+printing_not_supported=Atencion鈥�: l'impression es pas completament gerida per aqueste navegador.
+printing_not_ready=Atencion鈥�: lo PDF es pas enti猫rament cargat per lo poder imprimir.
+web_fonts_disabled=Las poli莽as web son desactivadas聽: impossible d'utilizar las poli莽as integradas al PDF.
+document_colors_not_allowed=Los documents PDF p貌don pas utilizar lors pr貌prias colors聽: 芦 Autorizar las paginas web d'utilizar lors pr貌prias colors 禄 es desactivat dins lo navegador.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/or/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/or/viewer.properties
new file mode 100644
index 0000000..831eace
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/or/viewer.properties
@@ -0,0 +1,167 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=喱瓊喱班瓖喱� 喱瓋喱粪瓖喱犩
+previous_label=喱瓊喱班瓖喱�
+next.title=喱 喱瓋喱粪瓖喱犩
+next_label=喱
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+
+zoom_out.title=喱涏瓔喱� 喱曕喱ㄠ瓖喱む瓉
+zoom_out_label=喱涏瓔喱� 喱曕喱ㄠ瓖喱む瓉
+zoom_in.title=喱喱� 喱曕喱ㄠ瓖喱む瓉
+zoom_in_label=喱喱� 喱曕喱ㄠ瓖喱む瓉
+zoom.title=喱涏瓔喱� 喱喱� 喱曕喱ㄠ瓖喱む瓉
+presentation_mode.title=喱夃喱膏瓖喱ム喱 喱о喱班喱曕瓉 喱喱赤喱ㄠ瓖喱む瓉
+presentation_mode_label=喱夃喱膏瓖喱ム喱 喱о喱班
+open_file.title=喱喱囙 喱栢瓔喱侧喹嵿喹�
+open_file_label=喱栢瓔喱侧喹嵿喹�
+print.title=喱瓉喱︵瓖喱班
+print_label=喱瓉喱︵瓖喱班
+download.title=喱嗋喱班
+download_label=喱嗋喱班
+bookmark.title=喱瓖喱班瑲喱赤喱� 喱︵瓋喱多瓖喹� (喱ㄠ瑫喱� 喱曕喱ㄠ瓖喱む瓉 喱曕喱瓖喱 喱忇瑫 喱ㄠ瓊喱む 喹编喱`瓖喱∴瓔喱班瓏 喱栢瓔喱侧喹嵿喹�)
+bookmark_label=喱瓖喱班瑲喱赤喱� 喱︵瓋喱多瓖喹�
+
+# Secondary toolbar and context menu
+tools.title=喱膏喱о喱椸瓉喱∴喱苦瑫
+tools_label=喱膏喱о喱椸瓉喱∴喱苦瑫
+first_page.title=喱瓖喱班喱� 喱瓋喱粪瓖喱犩喱曕瓉 喱喱嗋喹嵿喹�
+first_page.label=喱瓖喱班喱� 喱瓋喱粪瓖喱犩喱曕瓉 喱喱嗋喹嵿喹�
+first_page_label=喱瓖喱班喱� 喱瓋喱粪瓖喱犩喱曕瓉 喱喱嗋喹嵿喹�
+last_page.title=喱多瓏喱� 喱瓋喱粪瓖喱犩喱曕瓉 喱喱嗋喹嵿喹�
+last_page.label=喱多瓏喱� 喱瓋喱粪瓖喱犩喱曕瓉 喱喱嗋喹嵿喹�
+last_page_label=喱多瓏喱� 喱瓋喱粪瓖喱犩喱曕瓉 喱喱嗋喹嵿喹�
+page_rotate_cw.title=喱︵瑫喹嵿喱苦喱距喱班瓖喱む瓖喱む瓈 喱樴瓉喱班喱ㄠ瓖喱む瓉
+page_rotate_cw.label=喱︵瑫喹嵿喱苦喱距喱班瓖喱む瓖喱む瓈 喱樴瓉喱班喱ㄠ瓖喱む瓉
+page_rotate_cw_label=喱︵瑫喹嵿喱苦喱距喱班瓖喱む瓖喱む瓈 喱樴瓉喱班喱ㄠ瓖喱む瓉
+page_rotate_ccw.title=喱喱喱喹嵿喹嵿喹� 喱樴瓉喱班喱ㄠ瓖喱む瓉
+page_rotate_ccw.label=喱喱喱喹嵿喹嵿喹� 喱樴瓉喱班喱ㄠ瓖喱む瓉
+page_rotate_ccw_label=喱喱喱喹嵿喹嵿喹� 喱樴瓉喱班喱ㄠ瓖喱む瓉
+
+
+# Document properties dialog box
+document_properties.title=喱︵喱苦 喱椸瓉喱`喱班瓖喱��
+document_properties_label=喱︵喱苦 喱椸瓉喱`喱班瓖喱��
+document_properties_file_name=喱喱囙 喱ㄠ喱�:
+document_properties_file_size=喱喱囙 喱嗋瑫喱距:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=喱多瓈喱班瓖喱粪瑫:
+document_properties_author=喱侧瓏喱栢瑫:
+document_properties_subject=喱喱粪瓱:
+document_properties_keywords=喱膏瓊喱氞瑫 喱多喹嵿:
+document_properties_creation_date=喱ㄠ喱班瓖喱喱� 喱む喱班喱�:
+document_properties_modification_date=喱喱苦喱班瓖喱む瓖喱む 喱む喱班喱�:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=喱ㄠ喱班瓖喱喱む:
+document_properties_producer=PDF 喱瓖喱班喹嬥瑴喱�:
+document_properties_version=PDF 喱膏瑐喱膏瓖喱曕喱�:
+document_properties_page_count=喱瓋喱粪瓖喱犩 喱椸喱ㄠ:
+document_properties_close=喱喹嵿 喱曕喱ㄠ瓖喱む瓉
+
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=喱喱班瓖喱多瓖喹编喱熰喱曕瓉 喱嗋瑮喱瑳 喱曕喱ㄠ瓖喱む瓉
+toggle_sidebar_label=喱喱班瓖喱多瓖喹编喱熰喱曕瓉 喱嗋瑮喱瑳 喱曕喱ㄠ瓖喱む瓉
+document_outline_label=喱︵喱苦 喱膏喱班喱傕
+attachments.title=喱膏瑐喱侧瑮喹嵿喱曕瑮喹佮喱监喱曕瓉 喱︵喹嵿喱距喹嵿喹�
+attachments_label=喱膏喱椸瓖喱ㄠ瑫喱椸瓉喱∴喱�
+thumbs.title=喱膏瑐喱曕瓖喱粪喱瓖喱� 喱喱喱`瓈 喱︵喹嵿喱距喹嵿喹�
+thumbs_label=喱膏瑐喱曕瓖喱粪喱瓖喱� 喱喱喱`瓈
+findbar.title=喱︵喱苦喱班瓏 喱栢瓔喱溹喹嵿喹�
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=喱瓋喱粪瓖喱犩 {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=喱瓋喱粪瓖喱犩喱� 喱膏瑐喱曕瓖喱粪喱瓖喱� 喱喱喱`瓈 {{page}}
+
+# Find panel button title and messages
+find_previous.title=喱忇喱� 喱喱曕瓖喹熰喱傕喱� 喱瓊喱班瓖喱� 喱夃喱膏瓖喱ム喱む喱曕瓉 喱栢瓔喱溹喹嵿喹�
+find_previous_label=喱瓊喱班瓖喱喱班瓖喱む瓖喱む瓈
+find_next.title=喱忇喱� 喱喱曕瓖喹熰喱傕喱� 喱喱喹嵿喹嵿喹� 喱夃喱膏瓖喱ム喱む喱曕瓉 喱栢瓔喱溹喹嵿喹�
+find_next_label=喱喱喹嵿喹嵿喹�\u0020
+find_highlight=喱膏喱膏瓖喱む瑱喹嵿瑫喹� 喱嗋喹嬥瑫喱苦 喱曕喱ㄠ瓖喱む瓉
+find_match_case_label=喱呧瑫喹嵿喱� 喱瓏喱赤喱ㄠ瓖喱む瓉
+find_reached_top=喱む喹� 喱夃喱班瑫喹� 喱椸喱� 喱曕喱� 喱︵喱苦喱� 喱夃喱� 喱喱椸喹� 喱喱炧瓖喱氞 喱喱囙瑳喱�
+find_reached_bottom=喱夃喱班瓉 喱む喱曕瓉 喱椸喱� 喱曕喱� 喱︵喱苦喱� 喱多瓏喱� 喱喱椸喹� 喱喱炧瓖喱氞 喱喱囙瑳喱�
+find_not_found=喱喱曕瓖喹熰喱傕 喱喱赤喱侧 喱ㄠ喱灌喱�
+
+# Error panel labels
+error_more_info=喱呧喱苦瑫 喱膏瓊喱氞喱�
+error_less_info=喱膏瓖喹编喹嵿 喱膏瓊喱氞喱�
+error_close=喱喹嵿 喱曕喱ㄠ瓖喱む瓉
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=喱膏喹嵿喹囙: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=喱粪瓖喱熰喱�: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=喱喱囙: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=喱о喱∴喱�: {{line}}
+rendering_error=喱瓋喱粪瓖喱犩 喱氞喱む瓖喱班 喱曕喱苦喱� 喱膏喹熰喹� 喱む瓖喱班瓉喱熰 喱樴瑹喱苦喱距イ
+
+# Predefined zoom values
+page_scale_width=喱瓋喱粪瓖喱犩 喱撪喱距
+page_scale_fit=喱瓋喱粪瓖喱犩 喱瓏喱赤
+page_scale_auto=喱膏瓖喹编瓱喱傕瑲喱距喱苦 喱喱喹� 喱涏瓔喱熰喱∴ 喱曕喱苦喱�
+page_scale_actual=喱瓖喱班瑫喹冟 喱嗋瑫喱距
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+
+# Loading indicator messages
+loading_error_indicator=喱む瓖喱班瓉喱熰
+loading_error=PDF 喱о喱班 喱曕喱苦喱� 喱膏喹熰喹� 喱忇瑫 喱む瓖喱班瓉喱熰 喱樴瑹喱苦喱距イ
+invalid_file_error=喱呧喹堗 喱曕喱瓖喱 喱む瓖喱班瓉喱熰喱瓉喱曕瓖喱� PDF 喱喱囙啷�
+missing_file_error=喱灌瑴喱苦喱距瑖喱ム喱 PDF 喱喱囙啷�
+unexpected_response_error=喱呧喹嵿喱む瓖喹熰喱多喱� 喱膏喹嵿喱� 喱夃喹嵿喱班イ
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Annotation]
+password_label=喱忇喱� PDF 喱喱囙喱曕瓉 喱栢瓔喱侧喱 喱喱囙瑏 喱瓖喱班喹囙 喱膏瑐喱曕瓏喱� 喱喱� 喱曕喱ㄠ瓖喱む瓉啷�
+password_invalid=喱瓉喱� 喱瓖喱班喹囙 喱膏瑐喱曕瓏喱むイ 喱︵瓱喱距瑫喱班 喱瓉喱` 喱氞瓏喱粪瓖喱熰 喱曕喱ㄠ瓖喱む瓉啷�
+password_ok=喱犩喱� 喱呧瑳喱�
+
+printing_not_supported=喱氞瓏喱む喱喹�: 喱忇喱� 喱瓖喱班喱夃瑴喱� 喱︵瓖喹编喱班 喱瓉喱︵瓖喱班 喱曕瓖喱班喹熰 喱膏喹嵿喹傕喹嵿喹嵿 喱喱喹� 喱膏喱距瓱喱む 喱瓖喱班喱瓖喱� 喱ㄠ瓉喱灌瑏啷�
+printing_not_ready=喱氞瓏喱む喱喹�: PDF 喱熰 喱瓉喱︵瓖喱班 喱喱囙瑏 喱膏喹嵿喹傕喹嵿喹嵿 喱喱喹� 喱о喱班 喱灌瓔喱� 喱ㄠ喱灌喱佮イ
+web_fonts_disabled=喹编瓏喱� 喱呧瑫喹嵿喱班喹傕喱椸瓉喱∴喱苦瑫喹� 喱ㄠ喱粪瓖喱曕瓖喱班喹� 喱曕喱距喱距瑖喱涏: 喱膏喹嵿喱苦喱苦 PDF 喱呧瑫喹嵿喱班喹傕喱椸瓉喱∴喱苦瑫喹� 喱瓖喹熰喱灌喱� 喱曕喱苦喱距喹� 喱呧喱喹嵿啷�
+document_colors_not_allowed=PDF 喱︵喱苦喱椸瓉喱∴喱苦瑫 喱膏瓏喱喱ㄠ瑱喹嵿瑫喱� 喱ㄠ喱溹 喱班瑱喹嵿瑮 喱瓖喹熰喱灌喱� 喱曕喱苦喱� 喱喱囙瑏 喱呧喹佮喱む 喱瓖喱班喱瓖喱� 喱ㄠ瓉喱灌瑏: '喱膏瓏喱喱ㄠ瑱喹嵿瑫喱� 喱ㄠ喱� 喱班瑱喹嵿瑮 喱喱涏喱 喱喱囙瑏 喱瓋喱粪瓖喱犩喱椸瓉喱∴喱苦瑫喹� 喱呧喹佮喱む 喱︵喱呧喹嵿喹�' 喱曕瓉 喱瓖喱班喱夃瑴喱班喹� 喱ㄠ喱粪瓖喱曕瓖喱班喹� 喱曕喱距喱距瑖喱涏啷�
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/pa-IN/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/pa-IN/viewer.properties
new file mode 100644
index 0000000..ac02b9d
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/pa-IN/viewer.properties
@@ -0,0 +1,209 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=啜啜涏ú啜� 啜膏ǐ啜监ň
+previous_label=啜喋编喋�
+next.title=啜呧啜侧ň 啜膏ǐ啜监ň
+next_label=啜呧┍啜椸﹪
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=啜膏ǐ啜监ň
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages={{pagesCount}} 啜掂喋编喋嬥▊
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages={{pagesCount}}) 啜掂喋编喋嬥▊ ({{pageNumber}}
+
+zoom_out.title=喋涏﹤啜� 啜嗋▔啜�
+zoom_out_label=喋涏﹤啜� 啜嗋▔啜�
+zoom_in.title=喋涏﹤啜� 啜囙è
+zoom_in_label=喋涏﹤啜� 啜囙è
+zoom.title=喋涏﹤啜�
+presentation_mode.title=啜ò啜苦喋堗▊啜熰﹪啜多è 啜啜� 啜掂喋编 啜溹ň啜�
+presentation_mode_label=啜ò啜苦喋堗▊啜熰﹪啜多è 啜啜�
+open_file.title=啜ň啜堗ú 啜ㄠ﹤喋� 啜栢啜侧啜灌
+open_file_label=啜栢啜侧啜灌
+print.title=啜ò啜苦┌啜�
+print_label=啜ò啜苦┌啜�
+download.title=啜∴ň啜娻è啜侧啜�
+download_label=啜∴ň啜娻è啜侧啜�
+bookmark.title=啜啜溹﹤啜︵ň 啜澿ú啜� (啜ㄠǖ喋�啜� 啜掂喋班ā喋� 啜掂喋编 啜曕ň啜﹢ 啜曕ò喋� 啜溹ň啜� 啜栢啜侧啜灌)
+bookmark_label=啜啜溹﹤啜︵ň 啜澿ú啜�
+
+# Secondary toolbar and context menu
+tools.title=啜熰﹤啜�
+tools_label=啜熰﹤啜�
+first_page.title=啜ü啜苦ú喋� 啜膏喋� 啜夃┍啜む﹪ 啜溹ň啜�
+first_page.label=啜ü啜苦ú喋� 啜膏喋� 啜夃┍啜む﹪ 啜溹ň啜�
+first_page_label=啜ü啜苦ú喋� 啜膏喋� 啜夃┍啜む﹪ 啜溹ň啜�
+last_page.title=啜嗋啜班﹢ 啜膏喋� 啜夃┍啜む﹪ 啜溹ň啜�
+last_page.label=啜嗋啜班﹢ 啜膏喋� 啜夃┍啜む﹪ 啜溹ň啜�
+last_page_label=啜嗋啜班﹢ 啜膏喋� 啜夃┍啜む﹪ 啜溹ň啜�
+page_rotate_cw.title=啜膏┍啜溹﹪ 啜︵ň啜� 啜樴﹣喋班ó啜距〒
+page_rotate_cw.label=啜膏┍啜溹﹪ 啜︵ň啜� 啜樴﹣喋班ó啜距▔
+page_rotate_cw_label=啜膏┍啜溹﹪ 啜︵ň啜� 啜樴﹣喋班ó啜距〒
+page_rotate_ccw.title=啜栢┍啜﹪ 啜︵ň啜� 啜樴﹣喋班ó啜距〒
+page_rotate_ccw.label=啜栢┍啜﹪ 啜︵ň啜� 啜樴﹣喋班ó啜距▔
+page_rotate_ccw_label=啜栢┍啜﹪ 啜︵ň啜� 啜樴﹣喋班ó啜距〒
+
+cursor_text_select_tool.title=啜侧啜栢à 啜氞啜� 啜熰﹤啜� 啜膏ó啜班┍啜� 啜曕ò喋�
+cursor_text_select_tool_label=啜侧啜栢à 啜氞啜� 啜熰﹤啜�
+cursor_hand_tool.title=啜灌┍啜� 啜熰﹤啜� 啜膏ó啜班┍啜� 啜曕ò喋�
+cursor_hand_tool_label=啜灌┍啜� 啜熰﹤啜�
+
+scroll_vertical.title=啜栢喋嵿ü啜掂﹪啜� 啜膏〞啜班ň啜夃ǎ 啜ㄠ﹤喋� 啜掂ò啜む啜�
+scroll_vertical_label=啜栢喋嵿ü啜掂ň啜� 啜膏ò啜曕ň啜夃ǎ啜�
+scroll_horizontal.title=啜侧﹪啜熰ǖ喋囙▊ 啜膏ò啜曕ň啜夃ǎ 啜ㄠ﹤喋� 啜掂ò啜む啜�
+scroll_horizontal_label=啜侧﹪啜熰ǖ啜距▊ 啜膏ò啜曕ň啜夃ǎ啜�
+scroll_wrapped.title=啜膏ó喋囙喋� 啜膏ò啜曕ň啜夃ǎ 啜ㄠ﹤喋� 啜掂ò啜む啜�
+scroll_wrapped_label=啜膏ó喋囙啜苦▎ 啜膏ò啜曕ň啜夃ǎ啜�
+
+
+# Document properties dialog box
+document_properties.title=鈥︵é啜膏à啜距ǖ喋囙 啜︵﹢ 啜掂啜多﹪啜多à啜�
+document_properties_label=鈥︵é啜膏à啜距ǖ喋囙 啜︵﹢ 啜掂啜多﹪啜多à啜�
+document_properties_file_name=啜ň啜堗ú 啜︵ň 啜ㄠň啜�:
+document_properties_file_size=啜ň啜堗ú 啜︵ň 啜嗋〞啜距ò:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} 啜ň啜堗)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} 啜ň啜堗)
+document_properties_title=啜熰ň啜堗啜�:
+document_properties_author=啜侧﹪啜栢〞:
+document_properties_subject=啜掂啜多ň:
+document_properties_keywords=啜多ì啜�:
+document_properties_creation_date=啜ǎ啜距▔啜� 啜︵﹢ 啜啜む﹢:
+document_properties_modification_date=啜膏啜� 啜︵﹢ 啜啜む﹢:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=啜ㄠ啜班ó啜距à啜�:
+document_properties_producer=PDF 啜啜班啜∴啜娻ǜ啜�:
+document_properties_version=PDF 啜掂ò啜溹è:
+document_properties_page_count=啜膏ǐ啜监﹪ 啜︵﹢ 啜椸啜`à喋�:
+document_properties_page_size=啜膏啜� 啜嗋〞啜距ò:
+document_properties_page_size_unit_inches=啜囙┌啜�
+document_properties_page_size_unit_millimeters=啜啜﹢
+document_properties_page_size_orientation_portrait=啜啜班啜班﹪啜�
+document_properties_page_size_orientation_landscape=啜侧﹫啜傕ā啜膏〞喋囙í
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=啜侧﹫啜熰ò
+document_properties_page_size_name_legal=啜曕è喋傕┌啜ㄠ﹢
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+document_properties_close=啜┌啜� 啜曕ò喋�
+
+print_progress_message=鈥︵í啜班喋班 啜曕ò啜� 啜侧▓ 啜︵ǜ啜むň啜掂﹪喋� 啜ㄠ﹤喋� 啜む啜嗋ò 啜曕﹢啜むň 啜溹ň 啜班啜灌ň 啜灌﹫
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=啜班┍啜� 啜曕ò喋�
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=啜ň啜灌﹢ 啜é啜侧
+toggle_sidebar_notification.title=啜ň啜灌﹢ 啜ㄠ﹤喋� 啜é啜侧 (啜︵ǜ啜むň啜掂﹪喋� 啜栢ň啜曕ň/啜呧喋堗啜﹫啜傕啜距▊ 啜班┍啜栢é啜� 啜灌﹫)
+toggle_sidebar_label=啜ň啜灌﹢ 啜é啜侧
+document_outline.title=啜︵ǜ啜むň啜掂﹪喋� 啜栢ň啜曕ň 啜︵啜栢ň啜� (啜膏ň啜班﹢啜嗋▊ 啜嗋▓啜熰ó啜距▊ 啜ㄠ﹤喋� 啜﹫啜侧ň啜夃ǎ/啜膏ó喋囙啜� 啜侧▓ 啜︵ 啜掂ň啜� 啜曕ú啜苦┍啜� 啜曕ò喋�)
+document_outline_label=啜︵ǜ啜むň啜掂﹪喋� 啜栢ň啜曕ň
+attachments.title=啜呧喋堗啜﹫啜傕 啜掂﹪啜栢ň啜�
+attachments_label=啜呧喋堗啜﹫啜傕啜距▊
+thumbs.title=啜ム┌啜è喋囙ú 啜ㄠ﹤喋� 啜掂﹪啜栢ň啜�
+thumbs_label=啜ム┌啜è喋囙ú
+findbar.title=啜︵ǜ啜むň啜掂﹪喋� 啜掂喋编 啜侧┍啜
+findbar_label=啜侧┍啜
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=啜膏ǐ啜监ň {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas={{page}} 啜膏ǐ啜监﹪ 啜︵ň 啜ム┌啜è喋囙ú
+
+# Find panel button title and messages
+find_input.title=啜侧┍啜
+find_input.placeholder=鈥︵é啜膏à啜距ǖ喋囙 '啜� 啜侧┍啜
+find_previous.title=啜掂ň啜� 啜︵﹢ 啜啜涏ú喋� 啜啜溹﹤啜︵喋� 啜侧┍啜
+find_previous_label=啜喋编喋�
+find_next.title=啜掂ň啜� 啜︵﹢ 啜呧啜侧﹢ 啜啜溹﹤啜︵喋� 啜侧┍啜
+find_next_label=啜呧┍啜椸﹪
+find_highlight=啜膏ō 啜夃ō啜距ò喋�
+find_match_case_label=啜呧┍啜栢ò 啜嗋〞啜距ò 啜ㄠ﹤喋� 啜啜侧ň啜�
+find_reached_top=啜︵ǜ啜むň啜掂﹪喋� 啜︵﹪ 啜夃┍啜む﹪ 啜� 啜椸◤ 啜灌ň啜�, 啜ム┍啜侧﹪ 啜む啜� 啜溹ň啜班﹢ 啜班┍啜栢啜� 啜灌﹫
+find_reached_bottom=啜︵ǜ啜むň啜掂﹪喋� 啜︵﹪ 啜呧┌啜� 啜夃┍啜む﹪ 啜� 啜椸◤ 啜灌ň啜�, 啜夃┍啜む﹪ 啜む啜� 啜溹ň啜班﹢ 啜班┍啜栢啜� 啜灌﹫
+find_not_found=啜掂ň啜� 啜ㄠü喋�啜� 啜侧┍啜啜�
+
+# Error panel labels
+error_more_info=啜灌啜� 啜溹ň啜`〞啜距ò喋�
+error_less_info=啜樴┍啜� 啜溹ň啜`〞啜距ò喋�
+error_close=啜┌啜� 啜曕ò喋�
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (啜啜侧ā: {{build}}
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=啜膏﹣啜ㄠ﹪啜灌ň: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=啜膏喋堗〞: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=啜ň啜堗ú: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=啜侧ň啜堗è: {{line}}
+rendering_error=啜膏ǐ啜监ň 啜班﹫啜∴ò 啜曕ò啜� 啜︵﹪ 啜︵啜班ň啜� 啜椸ú啜む﹢ 啜嗋▓ 啜灌﹫啷�
+
+# Predefined zoom values
+page_scale_width=啜膏ǐ啜监﹪ 啜︵﹢ 啜氞喋溹ň啜�
+page_scale_fit=啜膏ǐ啜监ň 啜喋编
+page_scale_auto=啜嗋喋嬥ó喋堗啜苦〞 喋涏﹤啜� 啜曕ò喋�
+page_scale_actual=啜嗋喋嬥ó喋堗啜苦〞 啜嗋〞啜距ò
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=啜椸ú啜む﹢
+loading_error=PDF 啜侧啜� 啜曕ò啜� 啜︵﹪ 啜︵啜班ň啜� 啜椸ú啜む﹢ 啜嗋▓ 啜灌﹫啷�
+invalid_file_error=啜椸ú啜� 啜溹ň啜� 啜ㄠ啜曕ň啜班ň PDF 啜ň啜堗ú 啜灌﹫啷�
+missing_file_error=啜ㄠň-啜啜溹﹤啜� PDF 啜ň啜堗ú啷�
+unexpected_response_error=啜呧ǎ啜溹ň啜� 啜膏ò啜掂ò 啜溹ǖ啜距ì啷�
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} 啜掂啜嗋啜苦▎]
+password_label=啜囙ü PDF 啜ň啜堗ú 啜ㄠ﹤喋� 啜栢啜侧啜灌ǎ 啜侧▓ 啜ň啜膏ǖ啜班ā 啜︵啜夃イ
+password_invalid=啜椸ú啜� 啜ň啜膏ǖ啜班ā啷� 啜﹪啜� 啜曕啜多啜� 啜曕ò喋� 啜溹﹢啷�
+password_ok=啜犩﹢啜� 啜灌﹫
+password_cancel=啜班┍啜� 啜曕ò喋�
+
+printing_not_supported=啜膏ň啜掂ě啜距è: 啜囙ü 啜ò啜距▕喋涏ò 啜ò啜苦┌啜� 啜曕ò啜� 啜侧▓ 啜﹤啜班﹢ 啜むò喋嵿ü啜距▊ 啜膏ü啜距▏啜� 啜ㄠü喋�啜� 啜灌﹫啷�
+printing_not_ready=啜膏ň啜掂ě啜距è: PDF 啜ㄠ﹤喋� 啜ò啜苦┌啜� 啜曕ò啜� 啜侧▓ 啜﹤啜班﹢ 啜むò喋嵿ü啜距▊ 啜侧啜� 啜ㄠü喋�啜� 啜灌﹫啷�
+web_fonts_disabled=啜掂﹫啜� 啜啜傕 啜┌啜� 啜灌è: 啜囙┌啜﹫啜� PDF 啜啜傕 啜ㄠ﹤喋� 啜掂ò啜むǎ 啜侧▓ 啜呧ǜ啜ò喋编ē 啜灌﹫啷�
+document_colors_not_allowed=PDF 啜︵ǜ啜むň啜掂﹪喋涏ň啜� 啜ㄠ﹤喋� 啜嗋í啜`﹪ 啜班┌啜� 啜掂ò啜むǎ 啜︵﹢ 啜囙啜距啜� 啜ㄠü喋�啜� 啜灌﹫啷�: 啜ò啜距▕喋涏ò 啜掂喋编 鈥溹ǜ喋炧啜嗋▊ 啜ㄠ﹤喋� 啜嗋í啜`﹪ 啜班┌啜� 啜氞﹣啜`è 啜︵﹢ 啜囙啜距啜� 啜︵啜撯�� 啜ㄠň-啜膏ò啜椸ò啜� 啜灌﹫啷�
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/pl/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/pl/viewer.properties
new file mode 100644
index 0000000..27cda10
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/pl/viewer.properties
@@ -0,0 +1,179 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+previous.title=Poprzednia strona
+previous_label=Poprzednia
+next.title=Nast臋pna strona
+next_label=Nast臋pna
+
+page.title==Strona:
+of_pages=z聽{{pagesCount}}
+page_of_pages=({{pageNumber}}聽z聽{{pagesCount}})
+
+zoom_out.title=Pomniejszenie
+zoom_out_label=Pomniejsz
+zoom_in.title=Powi臋kszenie
+zoom_in_label=Powi臋ksz
+zoom.title=Skala
+presentation_mode.title=Prze艂膮cz na tryb prezentacji
+presentation_mode_label=Tryb prezentacji
+open_file.title=Otwieranie pliku
+open_file_label=Otw贸rz
+print.title=Drukowanie
+print_label=Drukuj
+download.title=Pobieranie
+download_label=Pobierz
+bookmark.title=Bie偶膮ca pozycja (skopiuj lub otw贸rz jako odno艣nik w聽nowym oknie)
+bookmark_label=Bie偶膮ca pozycja
+
+tools.title=Narz臋dzia
+tools_label=Narz臋dzia
+first_page.title=Przechodzenie do pierwszej strony
+first_page.label=Przejd藕 do pierwszej strony
+first_page_label=Przejd藕 do pierwszej strony
+last_page.title=Przechodzenie do ostatniej strony
+last_page.label=Przejd藕 do ostatniej strony
+last_page_label=Przejd藕 do ostatniej strony
+page_rotate_cw.title=Obracanie zgodnie z聽ruchem wskaz贸wek zegara
+page_rotate_cw.label=Obr贸膰 zgodnie z聽ruchem wskaz贸wek zegara
+page_rotate_cw_label=Obr贸膰 zgodnie z聽ruchem wskaz贸wek zegara
+page_rotate_ccw.title=Obracanie przeciwnie do ruchu wskaz贸wek zegara
+page_rotate_ccw.label=Obr贸膰 przeciwnie do ruchu wskaz贸wek zegara
+page_rotate_ccw_label=Obr贸膰 przeciwnie do ruchu wskaz贸wek zegara
+
+cursor_text_select_tool.title=W艂膮cza narz臋dzie zaznaczania tekstu
+cursor_text_select_tool_label=Narz臋dzie zaznaczania tekstu
+cursor_hand_tool.title=W艂膮cza narz臋dzie r膮czka
+cursor_hand_tool_label=Narz臋dzie r膮czka
+
+scroll_wrapped_label=Widok dw贸ch stron
+scroll_wrapped.title=Strony dokumentu wy艣wietlaj i聽przewijaj w聽kolumnach
+
+spread_none_label=Brak kolumn
+spread_none.title=Nie ustawiaj stron obok siebie
+spread_odd_label=Nieparzyste po lewej
+spread_odd.title=Strony nieparzyste ustawiaj na lewo od parzystych
+spread_even_label=Parzyste po lewej
+spread_even.title=Strony parzyste ustawiaj na lewo od nieparzystych
+
+document_properties.title=W艂a艣ciwo艣ci dokumentu鈥�
+document_properties_label=W艂a艣ciwo艣ci dokumentu鈥�
+document_properties_file_name=Nazwa pliku:
+document_properties_file_size=Rozmiar pliku:
+document_properties_kb={{size_kb}} KB ({{size_b}} b)
+document_properties_mb={{size_mb}} MB ({{size_b}} b)
+document_properties_title=Tytu艂:
+document_properties_author=Autor:
+document_properties_subject=Temat:
+document_properties_keywords=S艂owa kluczowe:
+document_properties_creation_date=Data utworzenia:
+document_properties_modification_date=Data modyfikacji:
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Utworzony przez:
+document_properties_producer=PDF wyprodukowany przez:
+document_properties_version=Wersja PDF:
+document_properties_page_count=Liczba stron:
+document_properties_page_size=Wymiary strony:
+document_properties_page_size_unit_inches=in
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=pionowa
+document_properties_page_size_orientation_landscape=pozioma
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=US Letter
+document_properties_page_size_name_legal=US Legal
+document_properties_page_size_dimension_string={{width}}聽脳聽{{height}}聽{{unit}} (orientacja {{orientation}})
+document_properties_page_size_dimension_name_string={{width}}聽脳聽{{height}}聽{{unit}} ({{name}}, orientacja {{orientation}})
+document_properties_linearized=Szybki podgl膮d w聽Internecie:
+document_properties_linearized_yes=tak
+document_properties_linearized_no=nie
+document_properties_close=Zamknij
+
+print_progress_message=Przygotowywanie dokumentu do druku鈥�
+print_progress_percent={{progress}}%
+print_progress_close=Anuluj
+
+toggle_sidebar.title=Prze艂膮czanie panelu bocznego
+toggle_sidebar_notification.title=Prze艂膮czanie panelu bocznego (dokument zawiera konspekt/za艂膮czniki)
+toggle_sidebar_label=Prze艂膮cz panel boczny
+document_outline.title=Wy艣wietlanie zarysu dokumentu (podw贸jne klikni臋cie rozwija lub zwija wszystkie pozycje)
+document_outline_label=Zarys dokumentu
+attachments.title=Wy艣wietlanie za艂膮cznik贸w
+attachments_label=Za艂膮czniki
+thumbs.title=Wy艣wietlanie miniaturek
+thumbs_label=Miniaturki
+findbar.title=Znajd藕 w聽dokumencie
+findbar_label=Znajd藕
+
+thumb_page_title=Strona {{page}}
+thumb_page_canvas=Miniaturka strony {{page}}
+
+find_input.title=Wyszukiwanie
+find_input.placeholder=Szukaj w聽dokumencie鈥�
+find_previous.title=Znajd藕 poprzednie wyst膮pienie tekstu
+find_previous_label=Poprzednie
+find_next.title=Znajd藕 nast臋pne wyst膮pienie tekstu
+find_next_label=Nast臋pne
+find_highlight=Pod艣wietl wszystkie
+find_match_case_label=Rozr贸偶nianie wielko艣ci liter
+find_entire_word_label=Ca艂e s艂owa
+find_reached_top=Pocz膮tek dokumentu. Wyszukiwanie od ko艅ca.
+find_reached_bottom=Koniec dokumentu. Wyszukiwanie od pocz膮tku.
+find_match_count={[ plural(total) ]}
+find_match_count[one]=Pierwsze z聽{{total}} trafie艅
+find_match_count[two]=Drugie z聽{{total}} trafie艅
+find_match_count[few]={{current}}. z聽{{total}} trafie艅
+find_match_count[many]={{current}}. z聽{{total}} trafie艅
+find_match_count[other]={{current}}. z聽{{total}} trafie艅
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]=Brak trafie艅.
+find_match_count_limit[one]=Wi臋cej ni偶 jedno trafienie.
+find_match_count_limit[two]=Wi臋cej ni偶 dwa trafienia.
+find_match_count_limit[few]=Wi臋cej ni偶 {{limit}} trafienia.
+find_match_count_limit[many]=Wi臋cej ni偶 {{limit}} trafie艅.
+find_match_count_limit[other]=Wi臋cej ni偶 {{limit}} trafie艅.
+find_not_found=Nie znaleziono tekstu
+
+error_more_info=Wi臋cej聽informacji
+error_less_info=Mniej聽informacji
+error_close=Zamknij
+error_version_info=PDF.js v{{version}} (kompilacja: {{build}})
+error_message=Wiadomo艣膰: {{message}}
+error_stack=Stos: {{stack}}
+error_file=Plik: {{file}}
+error_line=Wiersz: {{line}}
+rendering_error=Podczas renderowania strony wyst膮pi艂 b艂膮d.
+
+page_scale_width=Szeroko艣膰 strony
+page_scale_fit=Dopasowanie strony
+page_scale_auto=Skala automatyczna
+page_scale_actual=Rozmiar rzeczywisty
+page_scale_percent={{scale}}%
+
+loading_error_indicator=B艂膮d
+loading_error=Podczas wczytywania dokumentu PDF wyst膮pi艂 b艂膮d.
+invalid_file_error=Nieprawid艂owy lub uszkodzony plik PDF.
+missing_file_error=Brak pliku PDF.
+unexpected_response_error=Nieoczekiwana odpowied藕 serwera.
+
+text_annotation_type.alt=[Adnotacja: {{type}}]
+password_label=Wprowad藕 has艂o, aby otworzy膰 ten dokument PDF.
+password_invalid=Nieprawid艂owe has艂o. Prosz臋 spr贸bowa膰 ponownie.
+password_ok=OK
+password_cancel=Anuluj
+
+printing_not_supported=Ostrze偶enie: drukowanie nie jest w聽pe艂ni obs艂ugiwane przez przegl膮dark臋.
+printing_not_ready=Ostrze偶enie: dokument PDF nie jest ca艂kowicie wczytany, wi臋c nie mo偶na go wydrukowa膰.
+web_fonts_disabled=Czcionki sieciowe s膮 wy艂膮czone: nie mo偶na u偶y膰 osadzonych czcionek PDF.
+document_colors_not_allowed=Dokumenty PDF nie mog膮 u偶ywa膰 w艂asnych kolor贸w: opcja 鈥濸ozwalaj stronom stosowa膰 inne kolory鈥� w聽przegl膮darce jest nieaktywna.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/pt-BR/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/pt-BR/viewer.properties
new file mode 100644
index 0000000..638e7d3
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/pt-BR/viewer.properties
@@ -0,0 +1,231 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=P谩gina anterior
+previous_label=Anterior
+next.title=Pr贸xima p谩gina
+next_label=Pr贸xima
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=P谩gina
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=de {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} de {{pagesCount}})
+
+zoom_out.title=Reduzir
+zoom_out_label=Reduzir
+zoom_in.title=Ampliar
+zoom_in_label=Ampliar
+zoom.title=Zoom
+presentation_mode.title=Alternar para o modo de apresenta莽茫o
+presentation_mode_label=Modo de apresenta莽茫o
+open_file.title=Abrir arquivo
+open_file_label=Abrir
+print.title=Imprimir
+print_label=Imprimir
+download.title=Download
+download_label=Download
+bookmark.title=Visualiza莽茫o atual (copiar ou abrir em uma nova janela)
+bookmark_label=Visualiza莽茫o atual
+
+# Secondary toolbar and context menu
+tools.title=Ferramentas
+tools_label=Ferramentas
+first_page.title=Ir para a primeira p谩gina
+first_page.label=Ir para a primeira p谩gina
+first_page_label=Ir para a primeira p谩gina
+last_page.title=Ir para a 煤ltima p谩gina
+last_page.label=Ir para a 煤ltima p谩gina
+last_page_label=Ir para a 煤ltima p谩gina
+page_rotate_cw.title=Girar no sentido hor谩rio
+page_rotate_cw.label=Girar no sentido hor谩rio
+page_rotate_cw_label=Girar no sentido hor谩rio
+page_rotate_ccw.title=Girar no sentido anti-hor谩rio
+page_rotate_ccw.label=Girar no sentido anti-hor谩rio
+page_rotate_ccw_label=Girar no sentido anti-hor谩rio
+
+cursor_text_select_tool.title=Ativar a ferramenta de sele莽茫o de texto
+cursor_text_select_tool_label=Ferramenta de sele莽茫o de texto
+cursor_hand_tool.title=Ativar ferramenta de m茫o
+cursor_hand_tool_label=Ferramenta de m茫o
+
+scroll_vertical.title=Usar rolagem vertical
+scroll_vertical_label=Rolagem vertical
+scroll_horizontal.title=Usar rolagem horizontal
+scroll_horizontal_label=Rolagem horizontal
+scroll_wrapped.title=Usar rolagem contida
+scroll_wrapped_label=Rolagem contida
+
+spread_none.title=N茫o associar 脿 p谩gina estendidas
+spread_none_label=N茫o estender
+spread_odd.title=Associar p谩gina estendida a partir de p谩ginas com n煤meros 铆mpares
+spread_odd_label=Estender 铆mpares
+spread_even.title=Associar p谩gina estendida a partir de p谩ginas com n煤meros pares
+spread_even_label=Estender pares
+
+# Document properties dialog box
+document_properties.title=Propriedades do documento鈥�
+document_properties_label=Propriedades do documento鈥�
+document_properties_file_name=Nome do arquivo:
+document_properties_file_size=Tamanho do arquivo:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}}鈥疜B ({{size_b}} bytes)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}}鈥疢B ({{size_b}} bytes)
+document_properties_title=T铆tulo:
+document_properties_author=Autor:
+document_properties_subject=Assunto:
+document_properties_keywords=Palavras-chave:
+document_properties_creation_date=Data da cria莽茫o:
+document_properties_modification_date=Data da modifica莽茫o:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Cria莽茫o:
+document_properties_producer=Criador do PDF:
+document_properties_version=Vers茫o do PDF:
+document_properties_page_count=N煤mero de p谩ginas:
+document_properties_page_size=Tamanho da p谩gina:
+document_properties_page_size_unit_inches=pol.
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=retrato
+document_properties_page_size_orientation_landscape=paisagem
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Carta
+document_properties_page_size_name_legal=Jur铆dico
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=Visualiza莽茫o r谩pida da Web:
+document_properties_linearized_yes=Sim
+document_properties_linearized_no=N茫o
+document_properties_close=Fechar
+
+print_progress_message=Preparando documento para impress茫o鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}} %
+print_progress_close=Cancelar
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Alternar painel
+toggle_sidebar_notification.title=Alternar o painel (documento cont茅m marcadores e anexos)
+toggle_sidebar_label=Alternar painel
+document_outline.title=Mostrar a estrutura do documento (duplo-clique para expandir/recolher todos os 铆tens)
+document_outline_label=Estrutura do documento
+attachments.title=Mostrar anexos
+attachments_label=Anexos
+thumbs.title=Mostrar miniaturas
+thumbs_label=Miniaturas
+findbar.title=Localizar no documento
+findbar_label=Localizar
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=P谩gina {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Miniatura da p谩gina {{page}}
+
+# Find panel button title and messages
+find_input.title=Localizar
+find_input.placeholder=Localizar no documento鈥�
+find_previous.title=Localizar a ocorr锚ncia anterior da frase
+find_previous_label=Anterior
+find_next.title=Localizar a pr贸xima ocorr锚ncia da frase
+find_next_label=Pr贸xima
+find_highlight=Real莽ar tudo
+find_match_case_label=Diferenciar mai煤sculas/min煤sculas
+find_entire_word_label=Palavras completas
+find_reached_top=In铆cio do documento alcan莽ado, continuando do fim
+find_reached_bottom=Fim do documento alcan莽ado, continuando do in铆cio
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_not_found=Frase n茫o encontrada
+
+# Error panel labels
+error_more_info=Mais informa莽玫es
+error_less_info=Menos informa莽玫es
+error_close=Fechar
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (compila莽茫o: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Mensagem: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Pilha: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Arquivo: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Linha: {{line}}
+rendering_error=Ocorreu um erro ao renderizar a p谩gina.
+
+# Predefined zoom values
+page_scale_width=Largura da p谩gina
+page_scale_fit=Ajustar 脿 janela
+page_scale_auto=Zoom autom谩tico
+page_scale_actual=Tamanho real
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Erro
+loading_error=Ocorreu um erro ao carregar o PDF.
+invalid_file_error=Arquivo PDF corrompido ou inv谩lido.
+missing_file_error=Arquivo PDF ausente.
+unexpected_response_error=Resposta inesperada do servidor.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[Anota莽茫o {{type}}]
+password_label=Forne莽a a senha para abrir este arquivo PDF.
+password_invalid=Senha inv谩lida. Tente novamente.
+password_ok=OK
+password_cancel=Cancelar
+
+printing_not_supported=Aviso: a impress茫o n茫o 茅 totalmente suportada neste navegador.
+printing_not_ready=Aviso: o PDF n茫o est谩 totalmente carregado para impress茫o.
+web_fonts_disabled=As fontes web est茫o desabilitadas: n茫o foi poss铆vel usar fontes incorporadas do PDF.
+document_colors_not_allowed=Os documentos em PDF n茫o est茫o autorizados a usar suas pr贸prias cores: 鈥淧ermitir que as p谩ginas escolham suas pr贸prias cores鈥� est谩 desabilitado no navegador.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/pt-PT/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/pt-PT/viewer.properties
new file mode 100644
index 0000000..591c0ef
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/pt-PT/viewer.properties
@@ -0,0 +1,242 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=P谩gina anterior
+previous_label=Anterior
+next.title=P谩gina seguinte
+next_label=Seguinte
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=P谩gina
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=de {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} de {{pagesCount}})
+
+zoom_out.title=Reduzir
+zoom_out_label=Reduzir
+zoom_in.title=Ampliar
+zoom_in_label=Ampliar
+zoom.title=Zoom
+presentation_mode.title=Trocar para o modo de apresenta莽茫o
+presentation_mode_label=Modo de apresenta莽茫o
+open_file.title=Abrir ficheiro
+open_file_label=Abrir
+print.title=Imprimir
+print_label=Imprimir
+download.title=Transferir
+download_label=Transferir
+bookmark.title=Vista atual (copiar ou abrir numa nova janela)
+bookmark_label=Vis茫o atual
+
+# Secondary toolbar and context menu
+tools.title=Ferramentas
+tools_label=Ferramentas
+first_page.title=Ir para a primeira p谩gina
+first_page.label=Ir para a primeira p谩gina
+first_page_label=Ir para a primeira p谩gina
+last_page.title=Ir para a 煤ltima p谩gina
+last_page.label=Ir para a 煤ltima p谩gina
+last_page_label=Ir para a 煤ltima p谩gina
+page_rotate_cw.title=Rodar 脿 direita
+page_rotate_cw.label=Rodar 脿 direita
+page_rotate_cw_label=Rodar 脿 direita
+page_rotate_ccw.title=Rodar 脿 esquerda
+page_rotate_ccw.label=Rodar 脿 esquerda
+page_rotate_ccw_label=Rodar 脿 esquerda
+
+cursor_text_select_tool.title=Ativar ferramenta de sele莽茫o de texto
+cursor_text_select_tool_label=Ferramenta de sele莽茫o de texto
+cursor_hand_tool.title=Ativar ferramenta de m茫o
+cursor_hand_tool_label=Ferramenta de m茫o
+
+scroll_vertical.title=Utilizar desloca莽茫o vertical
+scroll_vertical_label=Desloca莽茫o vertical
+scroll_horizontal.title=Utilizar desloca莽茫o horizontal
+scroll_horizontal_label=Desloca莽茫o horizontal
+scroll_wrapped.title=Utilizar desloca莽茫o encapsulada
+scroll_wrapped_label=Desloca莽茫o encapsulada
+
+spread_none.title=N茫o juntar spreads de p谩ginas
+spread_none_label=Sem spreads
+spread_odd.title=Juntar spreads de p谩ginas a partir de p谩ginas com n煤meros 铆mpares
+spread_odd_label=Spreads 铆mpares
+spread_even.title=Juntar spreads de p谩ginas a partir de p谩ginas com n煤meros pares
+spread_even_label=Spreads pares
+
+# Document properties dialog box
+document_properties.title=Propriedades do documento鈥�
+document_properties_label=Propriedades do documento鈥�
+document_properties_file_name=Nome do ficheiro:
+document_properties_file_size=Tamanho do ficheiro:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=T铆tulo:
+document_properties_author=Autor:
+document_properties_subject=Assunto:
+document_properties_keywords=Palavras-chave:
+document_properties_creation_date=Data de cria莽茫o:
+document_properties_modification_date=Data de modifica莽茫o:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Criador:
+document_properties_producer=Produtor de PDF:
+document_properties_version=Vers茫o do PDF:
+document_properties_page_count=N.潞 de p谩ginas:
+document_properties_page_size=Tamanho da p谩gina:
+document_properties_page_size_unit_inches=in
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=retrato
+document_properties_page_size_orientation_landscape=paisagem
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Carta
+document_properties_page_size_name_legal=Legal
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=Vista r谩pida web:
+document_properties_linearized_yes=Sim
+document_properties_linearized_no=N茫o
+document_properties_close=Fechar
+
+print_progress_message=A preparar o documento para impress茫o鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=Cancelar
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Alternar barra lateral
+toggle_sidebar_notification.title=Alternar barra lateral (documento cont茅m contorno/anexos)
+toggle_sidebar_label=Alternar barra lateral
+document_outline.title=Mostrar esquema do documento (duplo clique para expandir/colapsar todos os itens)
+document_outline_label=Estrutura do documento
+attachments.title=Mostrar anexos
+attachments_label=Anexos
+thumbs.title=Mostrar miniaturas
+thumbs_label=Miniaturas
+findbar.title=Localizar em documento
+findbar_label=Localizar
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=P谩gina {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Miniatura da p谩gina {{page}}
+
+# Find panel button title and messages
+find_input.title=Localizar
+find_input.placeholder=Localizar em documento鈥�
+find_previous.title=Localizar ocorr锚ncia anterior da frase
+find_previous_label=Anterior
+find_next.title=Localizar ocorr锚ncia seguinte da frase
+find_next_label=Seguinte
+find_highlight=Destacar tudo
+find_match_case_label=Correspond锚ncia
+find_entire_word_label=Palavras completas
+find_reached_top=Topo do documento atingido, a continuar a partir do fundo
+find_reached_bottom=Fim do documento atingido, a continuar a partir do topo
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]={{current}} de {{total}} correspond锚ncia
+find_match_count[two]={{current}} de {{total}} correspond锚ncias
+find_match_count[few]={{current}} de {{total}} correspond锚ncias
+find_match_count[many]={{current}} de {{total}} correspond锚ncias
+find_match_count[other]={{current}} de {{total}} correspond锚ncias
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]=Mais de {{limit}} correspond锚ncias
+find_match_count_limit[one]=Mais de {{limit}} correspond锚ncia
+find_match_count_limit[two]=Mais de {{limit}} correspond锚ncias
+find_match_count_limit[few]=Mais de {{limit}} correspond锚ncias
+find_match_count_limit[many]=Mais de {{limit}} correspond锚ncias
+find_match_count_limit[other]=Mais de {{limit}} correspond锚ncias
+find_not_found=Frase n茫o encontrada
+
+# Error panel labels
+error_more_info=Mais informa莽茫o
+error_less_info=Menos informa莽茫o
+error_close=Fechar
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (compila莽茫o: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Mensagem: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stack: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Ficheiro: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Linha: {{line}}
+rendering_error=Ocorreu um erro ao processar a p谩gina.
+
+# Predefined zoom values
+page_scale_width=Ajustar 脿 largura
+page_scale_fit=Ajustar 脿 p谩gina
+page_scale_auto=Zoom autom谩tico
+page_scale_actual=Tamanho real
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Erro
+loading_error=Ocorreu um erro ao carregar o PDF.
+invalid_file_error=Ficheiro PDF inv谩lido ou danificado.
+missing_file_error=Ficheiro PDF inexistente.
+unexpected_response_error=Resposta inesperada do servidor.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[Anota莽茫o {{type}}]
+password_label=Introduza a palavra-passe para abrir este ficheiro PDF.
+password_invalid=Palavra-passe inv谩lida. Por favor, tente novamente.
+password_ok=OK
+password_cancel=Cancelar
+
+printing_not_supported=Aviso: a impress茫o n茫o 茅 totalmente suportada por este navegador.
+printing_not_ready=Aviso: o PDF ainda n茫o est谩 totalmente carregado.
+web_fonts_disabled=Os tipos de letra web est茫o desativados: n茫o 茅 poss铆vel utilizar os tipos de letra PDF incorporados.
+document_colors_not_allowed=Os documentos PDF n茫o permitem a utiliza莽茫o das suas pr贸prias cores: 鈥淧ermitir 脿s p谩ginas escolher as suas pr贸prias cores鈥� est谩 desativado no navegador.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/rm/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/rm/viewer.properties
new file mode 100644
index 0000000..4ab7b7c
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/rm/viewer.properties
@@ -0,0 +1,242 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Pagina precedenta
+previous_label=Enavos
+next.title=Proxima pagina
+next_label=Enavant
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=Pagina
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=da {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} da {{pagesCount}})
+
+zoom_out.title=Empitschnir
+zoom_out_label=Empitschnir
+zoom_in.title=Engrondir
+zoom_in_label=Engrondir
+zoom.title=Zoom
+presentation_mode.title=Midar en il modus da preschentaziun
+presentation_mode_label=Modus da preschentaziun
+open_file.title=Avrir datoteca
+open_file_label=Avrir
+print.title=Stampar
+print_label=Stampar
+download.title=Telechargiar
+download_label=Telechargiar
+bookmark.title=Vista actuala (copiar u avrir en ina nova fanestra)
+bookmark_label=Vista actuala
+
+# Secondary toolbar and context menu
+tools.title=Utensils
+tools_label=Utensils
+first_page.title=Siglir a l'emprima pagina
+first_page.label=Siglir a l'emprima pagina
+first_page_label=Siglir a l'emprima pagina
+last_page.title=Siglir a la davosa pagina
+last_page.label=Siglir a la davosa pagina
+last_page_label=Siglir a la davosa pagina
+page_rotate_cw.title=Rotar en direcziun da l'ura
+page_rotate_cw.label=Rotar en direcziun da l'ura
+page_rotate_cw_label=Rotar en direcziun da l'ura
+page_rotate_ccw.title=Rotar en direcziun cuntraria a l'ura
+page_rotate_ccw.label=Rotar en direcziun cuntraria a l'ura
+page_rotate_ccw_label=Rotar en direcziun cuntraria a l'ura
+
+cursor_text_select_tool.title=Activar l'utensil per selecziunar text
+cursor_text_select_tool_label=Utensil per selecziunar text
+cursor_hand_tool.title=Activar l'utensil da maun
+cursor_hand_tool_label=Utensil da maun
+
+scroll_vertical.title=Utilisar il defilar vertical
+scroll_vertical_label=Defilar vertical
+scroll_horizontal.title=Utilisar il defilar orizontal
+scroll_horizontal_label=Defilar orizontal
+scroll_wrapped.title=Utilisar il defilar en colonnas
+scroll_wrapped_label=Defilar en colonnas
+
+spread_none.title=Betg parallelisar las paginas
+spread_none_label=Betg parallel
+spread_odd.title=Parallelisar las paginas cun cumenzar cun paginas sp猫ras
+spread_odd_label=Parallel sp猫r
+spread_even.title=Parallelisar las paginas cun cumenzar cun paginas p猫ras
+spread_even_label=Parallel p猫r
+
+# Document properties dialog box
+document_properties.title=Caracteristicas dal document鈥�
+document_properties_label=Caracteristicas dal document鈥�
+document_properties_file_name=Num da la datoteca:
+document_properties_file_size=Grondezza da la datoteca:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=Titel:
+document_properties_author=Autur:
+document_properties_subject=Tema:
+document_properties_keywords=Chavazzins:
+document_properties_creation_date=Data da creaziun:
+document_properties_modification_date=Data da modificaziun:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}} {{time}}
+document_properties_creator=Cre脿 da:
+document_properties_producer=Cre脿 il PDF cun:
+document_properties_version=Versiun da PDF:
+document_properties_page_count=Dumber da paginas:
+document_properties_page_size=Grondezza da la pagina:
+document_properties_page_size_unit_inches=in
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=vertical
+document_properties_page_size_orientation_landscape=orizontal
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Letter
+document_properties_page_size_name_legal=Legal
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=Fast Web View:
+document_properties_linearized_yes=Gea
+document_properties_linearized_no=Na
+document_properties_close=Serrar
+
+print_progress_message=Preparar il document per stampar鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=Interrumper
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Activar/deactivar la trav laterala
+toggle_sidebar_notification.title=Activar/deactivar la trav laterala (structura dal document/agiuntas)
+toggle_sidebar_label=Activar/deactivar la trav laterala
+document_outline.title=Mussar la structura dal document (cliccar duas giadas per extender/cumprimer tut ils elements)
+document_outline_label=Structura dal document
+attachments.title=Mussar agiuntas
+attachments_label=Agiuntas
+thumbs.title=Mussar las miniaturas
+thumbs_label=Miniaturas
+findbar.title=Tschertgar en il document
+findbar_label=Tschertgar
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Pagina {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Miniatura da la pagina {{page}}
+
+# Find panel button title and messages
+find_input.title=Tschertgar
+find_input.placeholder=Tschertgar en il document鈥�
+find_previous.title=Tschertgar la posiziun precedenta da l'expressiun
+find_previous_label=Enavos
+find_next.title=Tschertgar la proxima posiziun da l'expressiun
+find_next_label=Enavant
+find_highlight=Relevar tuts
+find_match_case_label=Resguardar maiusclas/minusclas
+find_entire_word_label=Pleds entirs
+find_reached_top=Il cumenzament dal document 猫 cuntansch矛, la tschertga cuntinuescha a la fin dal document
+find_reached_bottom=La fin dal document 猫 cuntansch矛, la tschertga cuntinuescha al cumenzament dal document
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]={{current}} dad {{total}} correspundenza
+find_match_count[two]={{current}} da {{total}} correspundenzas
+find_match_count[few]={{current}} da {{total}} correspundenzas
+find_match_count[many]={{current}} da {{total}} correspundenzas
+find_match_count[other]={{current}} da {{total}} correspundenzas
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]=Dapli che {{limit}} correspundenzas
+find_match_count_limit[one]=Dapli che {{limit}} correspundenza
+find_match_count_limit[two]=Dapli che {{limit}} correspundenzas
+find_match_count_limit[few]=Dapli che {{limit}} correspundenzas
+find_match_count_limit[many]=Dapli che {{limit}} correspundenzas
+find_match_count_limit[other]=Dapli che {{limit}} correspundenzas
+find_not_found=Impussibel da chattar l'expressiun
+
+# Error panel labels
+error_more_info=Dapli infurmaziuns
+error_less_info=Damain infurmaziuns
+error_close=Serrar
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Messadi: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stack: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Datoteca: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Lingia: {{line}}
+rendering_error=Ina errur 猫 cumparida cun visualisar questa pagina.
+
+# Predefined zoom values
+page_scale_width=Ladezza da la pagina
+page_scale_fit=Entira pagina
+page_scale_auto=Zoom automatic
+page_scale_actual=Grondezza actuala
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Errur
+loading_error=Ina errur 猫 cumparida cun chargiar il PDF.
+invalid_file_error=Datoteca PDF nunvalida u donnegiada.
+missing_file_error=Datoteca PDF manconta.
+unexpected_response_error=Resposta nunspetgada dal server.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[Annotaziun da {{type}}]
+password_label=Endatescha il pled-clav per avrir questa datoteca da PDF.
+password_invalid=Pled-clav nunvalid. Emprova anc ina giada.
+password_ok=OK
+password_cancel=Interrumper
+
+printing_not_supported=Attenziun: Il stampar na funcziunescha anc betg dal tut en quest navigatur.
+printing_not_ready=Attenziun: Il PDF n'猫 betg chargi脿 cumplettamain per stampar.
+web_fonts_disabled=Scrittiras dal web 猫n deactivadas: impussibel dad utilisar las scrittiras integradas en il PDF.
+document_colors_not_allowed=Documents da PDF na dastgan betg duvrar las atgnas colurs: 'Permetter a paginas da tscherner lur atgna colur' 猫 deactiv脿 en il navigatur.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ro/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ro/viewer.properties
new file mode 100644
index 0000000..67a47c4
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ro/viewer.properties
@@ -0,0 +1,242 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Pagina precedent膬
+previous_label=脦napoi
+next.title=Pagina urm膬toare
+next_label=脦nainte
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=Pagina
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=din {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} din {{pagesCount}})
+
+zoom_out.title=Mic葯oreaz膬
+zoom_out_label=Mic葯oreaz膬
+zoom_in.title=M膬re葯te
+zoom_in_label=M膬re葯te
+zoom.title=Zoom
+presentation_mode.title=Comut膬 la modul de prezentare
+presentation_mode_label=Mod de prezentare
+open_file.title=Deschide un fi葯ier
+open_file_label=Deschide
+print.title=Tip膬re葯te
+print_label=Tip膬re葯te
+download.title=Descarc膬
+download_label=Descarc膬
+bookmark.title=Vizualizare actual膬 (copiaz膬 sau deschide 卯ntr-o fereastr膬 nou膬)
+bookmark_label=Vizualizare actual膬
+
+# Secondary toolbar and context menu
+tools.title=Instrumente
+tools_label=Instrumente
+first_page.title=Mergi la prima pagin膬
+first_page.label=Mergi la prima pagin膬
+first_page_label=Mergi la prima pagin膬
+last_page.title=Mergi la ultima pagin膬
+last_page.label=Mergi la ultima pagin膬
+last_page_label=Mergi la ultima pagin膬
+page_rotate_cw.title=Rote葯te 卯n sensul acelor de ceasornic
+page_rotate_cw.label=Rote葯te 卯n sensul acelor de ceasornic
+page_rotate_cw_label=Rote葯te 卯n sensul acelor de ceasornic
+page_rotate_ccw.title=Rote葯te 卯n sens invers al acelor de ceasornic
+page_rotate_ccw.label=Rote葯te 卯n sens invers al acelor de ceasornic
+page_rotate_ccw_label=Rote葯te 卯n sens invers al acelor de ceasornic
+
+cursor_text_select_tool.title=Activeaz膬 instrumentul de selec葲ie a textului
+cursor_text_select_tool_label=Instrumentul de selec葲ie a textului
+cursor_hand_tool.title=Activeaz膬 instrumentul m芒n膬
+cursor_hand_tool_label=Unealta m芒n膬
+
+scroll_vertical.title=Folose葯te derularea vertical膬
+scroll_vertical_label=Derulare vertical膬
+scroll_horizontal.title=Folose葯te derularea orizontal膬
+scroll_horizontal_label=Derulare orizontal膬
+scroll_wrapped.title=Folose葯te derularea 卯ncadrat膬
+scroll_wrapped_label=Derulare 卯ncadrat膬
+
+spread_none.title=Nu uni paginile bro葯ate
+spread_none_label=F膬r膬 pagini bro葯ate
+spread_odd.title=Une葯te paginile bro葯ate 卯ncep芒nd cu cele impare
+spread_odd_label=Bro葯are pagini impare
+spread_even.title=Une葯te paginile bro葯ate 卯ncep芒nd cu cele pare
+spread_even_label=Bro葯are pagini pare
+
+# Document properties dialog box
+document_properties.title=Propriet膬葲ile documentului鈥�
+document_properties_label=Propriet膬葲ile documentului鈥�
+document_properties_file_name=Numele fi葯ierului:
+document_properties_file_size=Dimensiunea fi葯ierului:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} by葲i)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} octe葲i)
+document_properties_title=Titlu:
+document_properties_author=Autor:
+document_properties_subject=Subiect:
+document_properties_keywords=Cuvinte cheie:
+document_properties_creation_date=Data cre膬rii:
+document_properties_modification_date=Data modific膬rii:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Autor:
+document_properties_producer=Produc膬tor PDF:
+document_properties_version=Versiune PDF:
+document_properties_page_count=Num膬r de pagini:
+document_properties_page_size=Dimensiunea paginii:
+document_properties_page_size_unit_inches=in
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=portret
+document_properties_page_size_orientation_landscape=peisaj
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Liter膬
+document_properties_page_size_name_legal=Legal
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=Vizualizare web rapid膬:
+document_properties_linearized_yes=Da
+document_properties_linearized_no=Nu
+document_properties_close=脦nchide
+
+print_progress_message=Se preg膬te葯te documentul pentru tip膬rire鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=Renun葲膬
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Comut膬 bara lateral膬
+toggle_sidebar_notification.title=Comut膬 bara lateral膬 (documentul con葲ine schi葲e/ata葯amente)
+toggle_sidebar_label=Comut膬 bara lateral膬
+document_outline.title=Afi葯eaz膬 schi葲a documentului (dublu-clic pentru a extinde/restr芒nge toate elementele)
+document_outline_label=Schi葲a documentului
+attachments.title=Afi葯eaz膬 ata葯amentele
+attachments_label=Ata葯amente
+thumbs.title=Afi葯eaz膬 miniaturi
+thumbs_label=Miniaturi
+findbar.title=G膬se葯te 卯n document
+findbar_label=Caut膬
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Pagina {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Miniatura paginii {{page}}
+
+# Find panel button title and messages
+find_input.title=Caut膬
+find_input.placeholder=Caut膬 卯n document鈥�
+find_previous.title=G膬se葯te instan葲a anterioar膬 卯n fraz膬
+find_previous_label=Anterior
+find_next.title=G膬se葯te instan葲a urm膬toare 卯n fraz膬
+find_next_label=Urm膬tor
+find_highlight=Eviden葲iaz膬 toate apari葲iile
+find_match_case_label=Potrive葯te literele mari 葯i mici
+find_entire_word_label=Cuvinte 卯ntregi
+find_reached_top=Am ajuns la 卯nceputul documentului, continu膬 de la sf芒r葯it
+find_reached_bottom=Am ajuns la sf芒r葯itul documentului, continu膬 de la 卯nceput
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]={{current}} din {{total}} rezultat
+find_match_count[two]={{current}} din {{total}} rezultate
+find_match_count[few]={{current}} din {{total}} rezultate
+find_match_count[many]={{current}} din {{total}} de rezultate
+find_match_count[other]={{current}} din {{total}} de rezultate
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]=Peste {{limit}} rezultate
+find_match_count_limit[one]=Peste {{limit}} rezultat
+find_match_count_limit[two]=Peste {{limit}} rezultate
+find_match_count_limit[few]=Peste {{limit}} rezultate
+find_match_count_limit[many]=Peste {{limit}} de rezultate
+find_match_count_limit[other]=Peste {{limit}} de rezultate
+find_not_found=Nu s-a g膬sit textul
+
+# Error panel labels
+error_more_info=Mai multe informa葲ii
+error_less_info=Mai pu葲ine informa葲ii
+error_close=脦nchide
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (versiunea compilat膬: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Mesaj: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stiv膬: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Fi葯ier: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=R芒nd: {{line}}
+rendering_error=A intervenit o eroare la randarea paginii.
+
+# Predefined zoom values
+page_scale_width=L膬葲imea paginii
+page_scale_fit=Potrivire la pagin膬
+page_scale_auto=Zoom automat
+page_scale_actual=Dimensiune real膬
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Eroare
+loading_error=A intervenit o eroare la 卯nc膬rcarea PDF-ului.
+invalid_file_error=Fi葯ier PDF nevalid sau corupt.
+missing_file_error=Fi葯ier PDF lips膬.
+unexpected_response_error=R膬spuns nea葯teptat de la server.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[Adnotare {{type}}]
+password_label=Introdu parola pentru a deschide acest fi葯ier PDF.
+password_invalid=Parol膬 nevalid膬. Te rug膬m s膬 卯ncerci din nou.
+password_ok=Ok
+password_cancel=Renun葲膬
+
+printing_not_supported=Avertisment: Tip膬rirea nu este suportat膬 卯n totalitate de acest browser.
+printing_not_ready=Avertisment: PDF-ul nu este 卯nc膬rcat complet pentru tip膬rire.
+web_fonts_disabled=Fonturile web sunt dezactivate: nu se pot folosi fonturile PDF 卯ncorporate.
+document_colors_not_allowed=Documentele PDF nu sunt autorizate s膬 foloseasc膬 propriile culori: 鈥濸ermite paginilor s膬 aleag膬 propriile culori鈥� este dezactivat 卯n browser.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ru/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ru/viewer.properties
new file mode 100644
index 0000000..65eb876
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ru/viewer.properties
@@ -0,0 +1,242 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=袩褉械写褘写褍褖邪褟 褋褌褉邪薪懈褑邪
+previous_label=袩褉械写褘写褍褖邪褟
+next.title=小谢械写褍褞褖邪褟 褋褌褉邪薪懈褑邪
+next_label=小谢械写褍褞褖邪褟
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=小褌褉邪薪懈褑邪
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=懈蟹 {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} 懈蟹 {{pagesCount}})
+
+zoom_out.title=校屑械薪褜褕懈褌褜
+zoom_out_label=校屑械薪褜褕懈褌褜
+zoom_in.title=校胁械谢懈褔懈褌褜
+zoom_in_label=校胁械谢懈褔懈褌褜
+zoom.title=袦邪褋褕褌邪斜
+presentation_mode.title=袩械褉械泄褌懈 胁 褉械卸懈屑 锌褉械蟹械薪褌邪褑懈懈
+presentation_mode_label=袪械卸懈屑 锌褉械蟹械薪褌邪褑懈懈
+open_file.title=袨褌泻褉褘褌褜 褎邪泄谢
+open_file_label=袨褌泻褉褘褌褜
+print.title=袩械褔邪褌褜
+print_label=袩械褔邪褌褜
+download.title=袟邪谐褉褍蟹懈褌褜
+download_label=袟邪谐褉褍蟹懈褌褜
+bookmark.title=小褋褘谢泻邪 薪邪 褌械泻褍褖懈泄 胁懈写 (褋泻芯锌懈褉芯胁邪褌褜 懈谢懈 芯褌泻褉褘褌褜 胁 薪芯胁芯屑 芯泻薪械)
+bookmark_label=孝械泻褍褖懈泄 胁懈写
+
+# Secondary toolbar and context menu
+tools.title=袠薪褋褌褉褍屑械薪褌褘
+tools_label=袠薪褋褌褉褍屑械薪褌褘
+first_page.title=袩械褉械泄褌懈 薪邪 锌械褉胁褍褞 褋褌褉邪薪懈褑褍
+first_page.label=袩械褉械泄褌懈 薪邪 锌械褉胁褍褞 褋褌褉邪薪懈褑褍
+first_page_label=袩械褉械泄褌懈 薪邪 锌械褉胁褍褞 褋褌褉邪薪懈褑褍
+last_page.title=袩械褉械泄褌懈 薪邪 锌芯褋谢械写薪褞褞 褋褌褉邪薪懈褑褍
+last_page.label=袩械褉械泄褌懈 薪邪 锌芯褋谢械写薪褞褞 褋褌褉邪薪懈褑褍
+last_page_label=袩械褉械泄褌懈 薪邪 锌芯褋谢械写薪褞褞 褋褌褉邪薪懈褑褍
+page_rotate_cw.title=袩芯胁械褉薪褍褌褜 锌芯 褔邪褋芯胁芯泄 褋褌褉械谢泻械
+page_rotate_cw.label=袩芯胁械褉薪褍褌褜 锌芯 褔邪褋芯胁芯泄 褋褌褉械谢泻械
+page_rotate_cw_label=袩芯胁械褉薪褍褌褜 锌芯 褔邪褋芯胁芯泄 褋褌褉械谢泻械
+page_rotate_ccw.title=袩芯胁械褉薪褍褌褜 锌褉芯褌懈胁 褔邪褋芯胁芯泄 褋褌褉械谢泻懈
+page_rotate_ccw.label=袩芯胁械褉薪褍褌褜 锌褉芯褌懈胁 褔邪褋芯胁芯泄 褋褌褉械谢泻懈
+page_rotate_ccw_label=袩芯胁械褉薪褍褌褜 锌褉芯褌懈胁 褔邪褋芯胁芯泄 褋褌褉械谢泻懈
+
+cursor_text_select_tool.title=袙泻谢褞褔懈褌褜 袠薪褋褌褉褍屑械薪褌 芦袙褘写械谢械薪懈械 褌械泻褋褌邪禄
+cursor_text_select_tool_label=袠薪褋褌褉褍屑械薪褌 芦袙褘写械谢械薪懈械 褌械泻褋褌邪禄
+cursor_hand_tool.title=袙泻谢褞褔懈褌褜 袠薪褋褌褉褍屑械薪褌 芦袪褍泻邪禄
+cursor_hand_tool_label=袠薪褋褌褉褍屑械薪褌 芦袪褍泻邪禄
+
+scroll_vertical.title=袠褋锌芯谢褜蟹芯胁邪褌褜 胁械褉褌懈泻邪谢褜薪褍褞 锌褉芯泻褉褍褌泻褍
+scroll_vertical_label=袙械褉褌懈泻邪谢褜薪邪褟 锌褉芯泻褉褍褌泻邪
+scroll_horizontal.title=袠褋锌芯谢褜蟹芯胁邪褌褜 谐芯褉懈蟹芯薪褌邪谢褜薪褍褞 锌褉芯泻褉褍褌泻褍
+scroll_horizontal_label=袚芯褉懈蟹芯薪褌邪谢褜薪邪褟 锌褉芯泻褉褍褌泻邪
+scroll_wrapped.title=袠褋锌芯谢褜蟹芯胁邪褌褜 屑邪褋褕褌邪斜懈褉褍械屑褍褞 锌褉芯泻褉褍褌泻褍
+scroll_wrapped_label=袦邪褋褕褌邪斜懈褉褍械屑邪褟 锌褉芯泻褉褍褌泻邪
+
+spread_none.title=袧械 懈褋锌芯谢褜蟹芯胁邪褌褜 褉械卸懈屑 褉邪蟹胁芯褉芯褌芯胁 褋褌褉邪薪懈褑
+spread_none_label=袘械蟹 褉邪蟹胁芯褉芯褌芯胁 褋褌褉邪薪懈褑
+spread_odd.title=袪邪蟹胁芯褉芯褌褘 薪邪褔懈薪邪褞褌褋褟 褋 薪械褔褢褌薪褘褏 薪芯屑械褉芯胁 褋褌褉邪薪懈褑
+spread_odd_label=袧械褔褢褌薪褘械 褋褌褉邪薪懈褑褘 褋谢械胁邪
+spread_even.title=袪邪蟹胁芯褉芯褌褘 薪邪褔懈薪邪褞褌褋褟 褋 褔褢褌薪褘褏 薪芯屑械褉芯胁 褋褌褉邪薪懈褑
+spread_even_label=效褢褌薪褘械 褋褌褉邪薪懈褑褘 褋谢械胁邪
+
+# Document properties dialog box
+document_properties.title=小胁芯泄褋褌胁邪 写芯泻褍屑械薪褌邪鈥�
+document_properties_label=小胁芯泄褋褌胁邪 写芯泻褍屑械薪褌邪鈥�
+document_properties_file_name=袠屑褟 褎邪泄谢邪:
+document_properties_file_size=袪邪蟹屑械褉 褎邪泄谢邪:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} 袣袘 ({{size_b}} 斜邪泄褌)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} 袦袘 ({{size_b}} 斜邪泄褌)
+document_properties_title=袟邪谐芯谢芯胁芯泻:
+document_properties_author=袗胁褌芯褉:
+document_properties_subject=孝械屑邪:
+document_properties_keywords=袣谢褞褔械胁褘械 褋谢芯胁邪:
+document_properties_creation_date=袛邪褌邪 褋芯蟹写邪薪懈褟:
+document_properties_modification_date=袛邪褌邪 懈蟹屑械薪械薪懈褟:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=袩褉懈谢芯卸械薪懈械:
+document_properties_producer=袩褉芯懈蟹胁芯写懈褌械谢褜 PDF:
+document_properties_version=袙械褉褋懈褟 PDF:
+document_properties_page_count=效懈褋谢芯 褋褌褉邪薪懈褑:
+document_properties_page_size=袪邪蟹屑械褉 褋褌褉邪薪懈褑褘:
+document_properties_page_size_unit_inches=写褞泄屑芯胁
+document_properties_page_size_unit_millimeters=屑屑
+document_properties_page_size_orientation_portrait=泻薪懈卸薪邪褟
+document_properties_page_size_orientation_landscape=邪谢褜斜芯屑薪邪褟
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Letter
+document_properties_page_size_name_legal=Legal
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=袘褘褋褌褉褘泄 锌褉芯褋屑芯褌褉 胁 Web:
+document_properties_linearized_yes=袛邪
+document_properties_linearized_no=袧械褌
+document_properties_close=袟邪泻褉褘褌褜
+
+print_progress_message=袩芯写谐芯褌芯胁泻邪 写芯泻褍屑械薪褌邪 泻 锌械褔邪褌懈鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=袨褌屑械薪邪
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=袩芯泻邪蟹邪褌褜/褋泻褉褘褌褜 斜芯泻芯胁褍褞 锌邪薪械谢褜
+toggle_sidebar_notification.title=袩芯泻邪蟹邪褌褜/褋泻褉褘褌褜 斜芯泻芯胁褍褞 锌邪薪械谢褜 (写芯泻褍屑械薪褌 懈屑械械褌 褋芯写械褉卸邪薪懈械/胁谢芯卸械薪懈褟)
+toggle_sidebar_label=袩芯泻邪蟹邪褌褜/褋泻褉褘褌褜 斜芯泻芯胁褍褞 锌邪薪械谢褜
+document_outline.title=袩芯泻邪蟹邪褌褜 褋芯写械褉卸邪薪懈械 写芯泻褍屑械薪褌邪 (写胁芯泄薪芯泄 褖械谢褔芯泻, 褔褌芯斜褘 褉邪蟹胁械褉薪褍褌褜/褋胁械褉薪褍褌褜 胁褋械 褝谢械屑械薪褌褘)
+document_outline_label=小芯写械褉卸邪薪懈械 写芯泻褍屑械薪褌邪
+attachments.title=袩芯泻邪蟹邪褌褜 胁谢芯卸械薪懈褟
+attachments_label=袙谢芯卸械薪懈褟
+thumbs.title=袩芯泻邪蟹邪褌褜 屑懈薪懈邪褌褞褉褘
+thumbs_label=袦懈薪懈邪褌褞褉褘
+findbar.title=袧邪泄褌懈 胁 写芯泻褍屑械薪褌械
+findbar_label=袧邪泄褌懈
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=小褌褉邪薪懈褑邪 {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=袦懈薪懈邪褌褞褉邪 褋褌褉邪薪懈褑褘 {{page}}
+
+# Find panel button title and messages
+find_input.title=袧邪泄褌懈
+find_input.placeholder=袧邪泄褌懈 胁 写芯泻褍屑械薪褌械鈥�
+find_previous.title=袧邪泄褌懈 锌褉械写褘写褍褖械械 胁褏芯卸写械薪懈械 褎褉邪蟹褘 胁 褌械泻褋褌
+find_previous_label=袧邪蟹邪写
+find_next.title=袧邪泄褌懈 褋谢械写褍褞褖械械 胁褏芯卸写械薪懈械 褎褉邪蟹褘 胁 褌械泻褋褌
+find_next_label=袛邪谢械械
+find_highlight=袩芯写褋胁械褌懈褌褜 胁褋械
+find_match_case_label=小 褍褔褢褌芯屑 褉械谐懈褋褌褉邪
+find_entire_word_label=小谢芯胁邪 褑械谢懈泻芯屑
+find_reached_top=袛芯褋褌懈谐薪褍褌 胁械褉褏 写芯泻褍屑械薪褌邪, 锌褉芯写芯谢卸械薪芯 褋薪懈蟹褍
+find_reached_bottom=袛芯褋褌懈谐薪褍褌 泻芯薪械褑 写芯泻褍屑械薪褌邪, 锌褉芯写芯谢卸械薪芯 褋胁械褉褏褍
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]={{current}} 懈蟹 {{total}} 褋芯胁锌邪写械薪懈褟
+find_match_count[two]={{current}} 懈蟹 {{total}} 褋芯胁锌邪写械薪懈泄
+find_match_count[few]={{current}} 懈蟹 {{total}} 褋芯胁锌邪写械薪懈泄
+find_match_count[many]={{current}} 懈蟹 {{total}} 褋芯胁锌邪写械薪懈泄
+find_match_count[other]={{current}} 懈蟹 {{total}} 褋芯胁锌邪写械薪懈泄
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]=袘芯谢械械 {{limit}} 褋芯胁锌邪写械薪懈泄
+find_match_count_limit[one]=袘芯谢械械 {{limit}} 褋芯胁锌邪写械薪懈褟
+find_match_count_limit[two]=袘芯谢械械 {{limit}} 褋芯胁锌邪写械薪懈泄
+find_match_count_limit[few]=袘芯谢械械 {{limit}} 褋芯胁锌邪写械薪懈泄
+find_match_count_limit[many]=袘芯谢械械 {{limit}} 褋芯胁锌邪写械薪懈泄
+find_match_count_limit[other]=袘芯谢械械 {{limit}} 褋芯胁锌邪写械薪懈泄
+find_not_found=肖褉邪蟹邪 薪械 薪邪泄写械薪邪
+
+# Error panel labels
+error_more_info=袛械褌邪谢懈
+error_less_info=小泻褉褘褌褜 写械褌邪谢懈
+error_close=袟邪泻褉褘褌褜
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (褋斜芯褉泻邪: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=小芯芯斜褖械薪懈械: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=小褌e泻: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=肖邪泄谢: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=小褌褉芯泻邪: {{line}}
+rendering_error=袩褉懈 褋芯蟹写邪薪懈懈 褋褌褉邪薪懈褑褘 锌褉芯懈蟹芯褕谢邪 芯褕懈斜泻邪.
+
+# Predefined zoom values
+page_scale_width=袩芯 褕懈褉懈薪械 褋褌褉邪薪懈褑褘
+page_scale_fit=袩芯 褉邪蟹屑械褉褍 褋褌褉邪薪懈褑褘
+page_scale_auto=袗胁褌芯屑邪褌懈褔械褋泻懈
+page_scale_actual=袪械邪谢褜薪褘泄 褉邪蟹屑械褉
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=袨褕懈斜泻邪
+loading_error=袩褉懈 蟹邪谐褉褍蟹泻械 PDF 锌褉芯懈蟹芯褕谢邪 芯褕懈斜泻邪.
+invalid_file_error=袧械泻芯褉褉械泻褌薪褘泄 懈谢懈 锌芯胁褉械卸写褢薪薪褘泄 PDF-褎邪泄谢.
+missing_file_error=PDF-褎邪泄谢 芯褌褋褍褌褋褌胁褍械褌.
+unexpected_response_error=袧械芯卸懈写邪薪薪褘泄 芯褌胁械褌 褋械褉胁械褉邪.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[袗薪薪芯褌邪褑懈褟 {{type}}]
+password_label=袙胁械写懈褌械 锌邪褉芯谢褜, 褔褌芯斜褘 芯褌泻褉褘褌褜 褝褌芯褌 PDF-褎邪泄谢.
+password_invalid=袧械胁械褉薪褘泄 锌邪褉芯谢褜. 袩芯卸邪谢褍泄褋褌邪, 锌芯锌褉芯斜褍泄褌械 褋薪芯胁邪.
+password_ok=OK
+password_cancel=袨褌屑械薪邪
+
+printing_not_supported=袩褉械写褍锌褉械卸写械薪懈械: 袙 褝褌芯屑 斜褉邪褍蟹械褉械 薪械 锌芯谢薪芯褋褌褜褞 锌芯写写械褉卸懈胁邪械褌褋褟 锌械褔邪褌褜.
+printing_not_ready=袩褉械写褍锌褉械卸写械薪懈械: PDF 薪械 锌芯谢薪芯褋褌褜褞 蟹邪谐褉褍卸械薪 写谢褟 锌械褔邪褌懈.
+web_fonts_disabled=袙械斜-褕褉懈褎褌褘 芯褌泻谢褞褔械薪褘: 薪械胁芯蟹屑芯卸薪芯 懈褋锌芯谢褜蟹芯胁邪褌褜 胁褋褌褉芯械薪薪褘械 PDF-褕褉懈褎褌褘.
+document_colors_not_allowed=PDF-写芯泻褍屑械薪褌邪屑 薪械 褉邪蟹褉械褕械薪芯 懈褋锌芯谢褜蟹芯胁邪褌褜 褋胁芯懈 褑胁械褌邪: 胁 斜褉邪褍蟹械褉械 芯褌泻谢褞褔褢薪 锌邪褉邪屑械褌褉 芦袪邪蟹褉械褕懈褌褜 胁械斜-褋邪泄褌邪屑 懈褋锌芯谢褜蟹芯胁邪褌褜 褋胁芯懈 褑胁械褌邪禄.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/rw/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/rw/viewer.properties
new file mode 100644
index 0000000..68a893d
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/rw/viewer.properties
@@ -0,0 +1,81 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+
+zoom.title=Ihindurangano
+open_file.title=Gufungura Dosiye
+open_file_label=Gufungura
+
+# Secondary toolbar and context menu
+
+
+# Document properties dialog box
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_title=Umutwe:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+
+# Find panel button title and messages
+find_previous.title=Gushaka aho uyu murongo ugaruka mbere y'aha
+find_next.title=Gushaka aho uyu murongo wongera kugaruka
+find_not_found=Umurongo ntubonetse
+
+# Error panel labels
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+
+# Predefined zoom values
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+
+# Loading indicator messages
+loading_error_indicator=Ikosa
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+password_invalid=Ijambo ry'ibanga ridahari. Wakongera ukagerageza
+password_ok=YEGO
+
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/sah/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/sah/viewer.properties
new file mode 100644
index 0000000..1786c40
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/sah/viewer.properties
@@ -0,0 +1,166 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=袠薪薪懈泻懈 褋懈褉褝泄
+previous_label=袠薪薪懈薪褝褝視懈
+next.title=袗薪褘谐褘褋泻褘 褋懈褉褝泄
+next_label=袗薪褘谐褘褋泻褘
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+
+zoom_out.title=袣褍褔褔邪褌
+zoom_out_label=袣褍褔褔邪褌
+zoom_in.title=校谢邪邪褌褘薪薪邪褉
+zoom_in_label=校谢邪邪褌褘薪薪邪褉
+zoom.title=校谢邪邪褌褘薪薪邪褉
+presentation_mode.title=袣萤褉写萤褉萤褉 褝褉褝褋懈懈屑谣褝
+presentation_mode_label=袣萤褉写萤褉萤褉 褝褉褝褋懈懈屑
+open_file.title=袘懈谢褝薪懈 邪褉褘泄
+open_file_label=袗褋
+print.title=袘褝褔褝褝褌
+print_label=袘褝褔褝褝褌
+download.title=啸邪褔邪泄写邪邪一褘薪
+download_label=啸邪褔邪泄写邪邪一褘薪
+bookmark.title=袘懈谢懈谣谣懈 泻萤褋褌爷爷褌褝 (褏邪褌褘谢邪邪 褝斜褝褌褝褉 褋邪谣邪 褌爷薪薪爷泻泻褝 邪褉褘泄)
+bookmark_label=袘懈谢懈谣谣懈 泻萤褋褌爷爷褌褝
+
+# Secondary toolbar and context menu
+tools.title=孝褝褉懈谢谢褝褉
+tools_label=孝褝褉懈谢谢褝褉
+first_page.title=袘邪褋褌邪泻褘 褋懈褉褝泄谐褝 泻萤褋
+first_page.label=袘邪褋褌邪泻褘 褋懈褉褝泄谐褝 泻萤褋
+first_page_label=袘邪褋褌邪泻褘 褋懈褉褝泄谐褝 泻萤褋
+last_page.title=孝懈一褝褏 褋懈褉褝泄谐褝 泻萤褋
+last_page.label=孝懈一褝褏 褋懈褉褝泄谐褝 泻萤褋
+last_page_label=孝懈一褝褏 褋懈褉褝泄谐褝 泻萤褋
+page_rotate_cw.title=效邪一褘 褏芯褌褍 褝褉谐懈褌
+page_rotate_cw.label=效邪一褘 褏芯褌褍 褝褉谐懈褌
+page_rotate_cw_label=效邪一褘 褏芯褌褍 褝褉谐懈褌
+page_rotate_ccw.title=效邪一褘 褍褌邪褉褘 褝褉谐懈褌
+page_rotate_ccw.label=效邪一褘 褍褌邪褉褘 褝褉谐懈褌
+page_rotate_ccw_label=效邪一褘 褍褌邪褉褘 褝褉谐懈褌
+
+
+# Document properties dialog box
+document_properties.title=袛芯泻褍屑褍芯薪 褌褍褉褍芯褉褍褍谢邪褉邪...
+document_properties_label=袛芯泻褍屑褍芯薪 褌褍褉褍芯褉褍褍谢邪褉邪...\u0020
+document_properties_file_name=袘懈谢褝 邪邪褌邪:
+document_properties_file_size=袘懈谢褝 泻褝褝屑褝泄褝:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} 袣袘 ({{size_b}} 斜邪邪泄褌)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} 袦袘 ({{size_b}} 斜邪邪泄褌)
+document_properties_title=袘邪一邪:
+document_properties_author=袗邪锌褌邪褉:
+document_properties_subject=孝懈褝屑褝:
+document_properties_keywords=袣爷谢爷爷褋 褌褘谢:
+document_properties_creation_date=袨谣芯一褍谢谢褍斜褍褌 泻褝屑褝:
+document_properties_modification_date=校谢邪褉褘褌褘谢谢褘斜褘褌 泻褝屑褝:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_producer=PDF 芯谣芯褉芯芯褔褔褍:
+document_properties_version=PDF 斜邪褉褘谢邪:
+document_properties_page_count=小懈褉褝泄 邪褏褋邪邪薪邪:
+document_properties_close=小邪锌
+
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=袨泄芯視芯褋 褏邪锌褌邪谢褘 邪褉褘泄/褋邪锌
+toggle_sidebar_label=袨泄芯視芯褋 褏邪锌褌邪谢褘 邪褉褘泄/褋邪锌
+document_outline_label=袛萤泻爷屑爷萤薪 懈一懈薪褝褝視懈褌褝
+attachments.title=袣褘斜褘褌褘泻褌邪褉褘 泻萤褉写萤褉
+attachments_label=袣褘斜褘褌褘泻
+thumbs.title=袨泄褍褍褔邪邪薪薪邪褉褘 泻萤褉写萤褉
+thumbs_label=袨泄褍褍褔邪邪薪薪邪褉
+findbar.title=袛萤泻爷屑爷萤薪褌褝薪 斜褍谢
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=小懈褉褝泄 {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=小懈褉褝泄 芯泄褍褍褔邪邪薪邪 {{page}}
+
+# Find panel button title and messages
+find_previous.title=协褌懈懈 褌懈褝泻懈褋泻褝 斜褍 懈薪薪懈薪褝褝視懈 泻懈懈褉懈懈褌懈薪 斜褍谢
+find_previous_label=袠薪薪懈薪褝褝視懈
+find_next.title=协褌懈懈 褌懈褝泻懈褋泻褝 斜褍 泻褝薪薪懈薪褝褝視懈 泻懈懈褉懈懈褌懈薪 斜褍谢
+find_next_label=袗薪褘谐褘褋泻褘
+find_highlight=袘邪褉褘褌褘薪 褋褘褉写邪褌邪薪 泻萤褉写萤褉
+find_match_case_label=袘褍褍泻褍斜邪 褍谢邪褏邪薪褘薪-泻褘褉邪褌褘薪 邪褉邪邪褉
+find_reached_top=小懈褉褝泄 爷褉写爷谐褝褉 褌懈懈泄写懈谣, 褋邪谢谐褘褘褌邪 邪谢谢邪褉邪
+find_reached_bottom=小懈褉褝泄 斜爷褌褌褝, 爷萤一褝 褋邪谢視邪薪薪邪
+find_not_found=协褌懈懈 泻萤褋褌爷斜褝褌褝
+
+# Error panel labels
+error_more_info=小懈一懈谢懈懈
+error_less_info=小懈一懈谢懈懈褌懈薪 泻懈褋褌褝褝
+error_close=小邪锌
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (褏芯屑褍泄褍褍褌邪: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=协褌懈懈: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=小褌e泻: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=袘懈谢褝: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=校褋褌褍褉褍芯泻邪: {{line}}
+rendering_error=小懈褉褝泄懈 邪泄邪褉谐邪 邪谢視邪褋 褌邪視褘褋褌邪.
+
+# Predefined zoom values
+page_scale_width=小懈褉褝泄 泻褝褌懈褌懈薪褝薪
+page_scale_fit=小懈褉褝泄 泻褝褝屑褝泄懈薪褝薪
+page_scale_auto=袗锌褌邪屑邪邪褌褘薪邪薪
+page_scale_actual=袛褜懈谣薪褝褝褏 泻褝褝屑褝泄褝
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+
+# Loading indicator messages
+loading_error_indicator=袗谢視邪褋
+loading_error=PDF-斜懈谢褝薪懈 褏邪褔邪泄写褘褘褉谐邪 邪谢視邪褋 褌邪視褘褋褌邪.
+invalid_file_error=孝褍芯褏 褝褉褝 邪谢視邪褋褌邪邪褏 褝斜褝褌褝褉 邪谢写褜邪屑屑褘褌 PDF-斜懈谢褝.
+missing_file_error=PDF-斜懈谢褝 褋褍芯褏.
+unexpected_response_error=小懈褝褉斜褝褉 褏芯褉褍泄写邪邪斜邪褌.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} 褌褍一褍薪邪薪]
+password_label=袘褍 PDF-斜懈谢褝薪懈 邪褉褘泄邪褉谐邪 泻萤屑爷褋泻褝谢 褌褘谢褘 泻懈谢谢褝褉懈褝褏褌褝褝褏懈薪.
+password_invalid=袣懈懈褉懈懈 褌褘谢 邪谢視邪褋褌邪邪褏. 袘褍泻邪 写懈褝薪, 褏邪褌褘谢邪邪薪 泻萤褉.
+password_ok=小莹袩
+
+printing_not_supported=小褝褉褝褌懈懈: 袘褍 斜褉邪褍蟹械褉 斜褝褔褝褝褌褌懈懈褉懈 褌芯谢芯褉褍 萤泄萤萤斜萤褌.
+printing_not_ready=小褝褉褝褌懈懈: PDF 斜褝褔褝褝褌褌懈懈褉谐褝 褌芯谢芯褉褍 褏邪褔邪泄写邪薪邪 懈谢懈泻.
+web_fonts_disabled=小懈褌懈屑-斜懈褔懈泻褌褝褉 邪褉邪邪褉褘谢谢褘邪褏褌邪褉邪: PDF 斜懈褔懈泻褌褝褉褝 泻褘邪泄邪薪 泻萤褋褌爷斜褝褌褌褝褉.
+document_colors_not_allowed=PDF-写萤泻爷屑爷萤爷薪薪褝褉谐褝 斜褝泄褝谢褝褉懈薪 萤谣薪萤褉爷薪 褌褍褌褌邪褉 泻萤谣爷谢谢褝屑屑褝褌褝: "小懈褌懈屑-褋懈褉写褝褉 斜褝泄褝谢褝褉懈薪 萤谣薪萤褉爷薪 褌褍褌褌邪谢谢邪褉褘薪 泻萤谣爷谢谢爷爷褉谐褝" 写懈褝薪 斜褉邪褍蟹械褉谐邪 邪褉邪褏褋邪 褋褘谢写褜邪褉 褝斜懈褌.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/sat/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/sat/viewer.properties
new file mode 100644
index 0000000..6734095
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/sat/viewer.properties
@@ -0,0 +1,134 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=啶ぞ啶监す啶苦げ啶距啷� 啶膏ぞ啶灌啶�
+next.title=啶囙え啶距ぜ 啶むぞ啶啶� 啶膏ぞ啶灌啶�
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+
+zoom.title=啶灌啶∴た啶� 啶侧ぞ啶监啷� 啶む啶ぞ啶�
+presentation_mode.title=啶夃う啷佮啷� 啶膏啶︵啶� 啶撪が啷嬥じ啶むぞ 啶班 啶撪い啶距く 啶
+presentation_mode_label=啶夃う啷佮啷� 啶膏啶︵啶� 啶撪が啷嬥じ啶むぞ
+open_file.title=啶班啶む 啶澿た啶� 啶
+open_file_label=啶澿た啶� 啶 啶澿た啶氞
+bookmark.title=啶ㄠた啶む啶椸ぞ啶曕 啶炧啶� (啶ㄠぞ啶掂ぞ 啶掂た啶傕ぁ啷� 啶班 啶ㄠ啶曕啶� 啶嗋ぐ 啶ぞ啶� 啶澿た啶� 啶 )
+bookmark_label=啶ㄠた啶む啶椸ぞ啶曕 啶炧啶傕げ
+
+# Secondary toolbar and context menu
+
+
+# Document properties dialog box
+document_properties_file_name=啶班啶む 啶炧啶む啶�:
+document_properties_file_size=啶班啶む 啶ぞ啶班ぞ啶� 啶む啶む:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{啶ぞ啶班ぞ啶� 啶む啶む_kb}} KB ({{啶ぞ啶班ぞ啶� 啶む啶む_b}} 啶ぞ啶囙啷嵿じ)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{啶ぞ啶班ぞ啶� 啶む啶む_mb}} MB ({{啶ぞ啶班ぞ啶� 啶む啶む_b}} 啶ぞ啶囙啷嵿じ)
+document_properties_title=啶忇ぎ 啶炧啶む啶�:
+document_properties_author=啶撪え啷嬥げ啶苦く啶距ぜ:
+document_properties_subject=啶た啶膏啶�:
+document_properties_keywords=啶曕ぞ啶监啷� 啶啶班啶�:
+document_properties_creation_date=啶む啶ぞ啶� 啶ぞ啶监す啶苦い啷�:
+document_properties_modification_date=啶啶︵啶� 啶灌啶氞 啶ぞ啶监す啶苦い啷�:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{啶ぞ啶监す啶苦い啷峿}, {{啶撪啶む}}
+document_properties_creator=啶啶ㄠぞ啶掂た啶氞:
+document_properties_producer=PDF 啶む啶ぞ啶� 啶撪ぁ啷嬥啶苦啷�:
+document_properties_version=PDF 啶ぞ啶班啶膏ぞ啶�:
+document_properties_page_count=啶膏ぞ啶灌啶� 啶侧啶栢ぞ:
+
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+document_outline_label=啶︵啶侧た啶� 啶む啶ぞ啶� 啶む啶む
+attachments.title=啶侧ぞ啶犩ぞ 啶膏啶侧啶� 啶曕 啶夃う啷佮啷� 啶
+attachments_label=啶侧ぞ啶犩ぞ 啶膏啶侧啶� 啶曕
+thumbs.title=啶氞た啶むぞ啶监ぐ 啶嗋す啶侧ぞ 啶曕 啶夃う啷佮啶� 啶
+thumbs_label=啶氞た啶むぞ啶监ぐ 啶嗋す啶侧ぞ 啶曕
+findbar.title=啶︵啶侧た啶� 啶班 啶炧ぞ啶�
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=啶膏ぞ啶灌啶� {{啶膏ぞ啶灌啶緘}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=啶膏ぞ啶灌啶� 啶班啶ぞ啶曕 啶氞た啶むぞ啶监ぐ 啶嗋す啶侧ぞ {{啶膏ぞ啶灌啶緘}
+
+# Find panel button title and messages
+find_previous.title=啶嗋く啶距い啷� 啶灌た啶傕じ 啶班啶ぞ啶曕 啶ぞ啶监す啶苦げ 啶膏啶︵ぞ啶曕 啶撪ぁ啷嬥啷� 啶炧ぞ啶� 啶
+find_next.title=啶嗋く啶距い啷� 啶灌た啶傕じ 啶班啶ぞ啶曕 啶囙え啶距ぜ 啶むぞ啶啶� 啶撪ぁ啷嬥啷� 啶炧ぞ啶� 啶
+find_highlight=啶溹啶む 啶夃う啷佮啷� 啶班ぞ啶曕ぞ啶�
+find_match_case_label=啶溹啶∴ぜ 啶ぞ啶げ啶�
+find_reached_top=啶︵啶侧た啶� 啶班啶ぞ啶曕 啶氞啶� 啶班 啶膏啶熰啶�, 啶侧ぞ啶むぞ啶� 啶栢啶� 啶侧啶むぞ啶∴ぜ
+find_reached_bottom=啶︵啶侧た啶� 啶班啶ぞ啶曕 啶啶氞ぞ啶监い啷� 啶班 啶膏啶熰啶�, 啶氞啶� 啶栢啶� 啶侧啶むぞ啶∴ぜ
+find_not_found=啶嗋く啶距い啷� 啶灌た啶傕じ 啶ぞ啶� 啶炧ぞ啶� 啶侧啶ㄠぞ
+
+# Error panel labels
+error_more_info=啶ぞ啶∴ぜ啶む 啶侧ぞ啶监く 啶膏啶︵啶班あ啷囙ぐ 啶侧ぞ啶监く 啶膏啶︵啶�
+error_less_info=啶曕啶� 啶侧ぞ啶监く 啶膏啶︵啶�
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{啶ぞ啶班啶膏ぞ啶▆} (啶む啶ぞ啶�: {{啶む啶ぞ啶皚})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=啶栢啶啶�: {{啶栢啶啶皚}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=啶∴ぞ啶傕: {{啶∴ぞ啶傕}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=啶班啶む: {{啶班啶む}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=啶椸ぞ啶�: {{啶椸ぞ啶皚}
+rendering_error=啶膏ぞ啶灌啶� 啶忇ぎ 啶溹啶灌啶� 啶た啶む 啶啶� 啶灌啶� 啶忇え啶� .
+
+# Predefined zoom values
+page_scale_width=啶膏ぞ啶灌啶� 啶撪じ啶距ぐ
+page_scale_fit=啶膏ぞ啶灌啶� 啶栢ぞ啶�
+page_scale_auto=啶嗋啷� 啶嗋啷� 啶む 啶灌啶∴た啶� 啶侧ぞ啶监啷� 啶む啶ぞ啶�
+page_scale_actual=啶犩た啶� 啶ぞ啶班ぞ啶� 啶む啶む
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+
+# Loading indicator messages
+loading_error_indicator=啶啶�
+loading_error=\u0020PDF啶侧ぞ啶︵ 啶溹啶灌啶曕 啶た啶む 啶啶� 啶灌啶� 啶忇え啶�.
+invalid_file_error=啶ぞ啶� 啶ぞ啶むぞ啶� 啶嗋ぐ 啶ぞ啶�  PDF 啶班啶む.
+missing_file_error=啶嗋う啶距啷� PDF 啶班啶む.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{啶侧啶曕ぞ啶▆} 啶啶ぞ啶� 啶忇ぎ]
+password_label=啶ㄠ啶掂ぞ PDF 啶班啶む 啶澿た啶� 啶侧ぞ啶监啶苦い啷� 啶︵ぞ啶ㄠぞ啶� 啶膏ぞ啶ぞ啶� 啶嗋う啷囙ぐ 啶.
+password_invalid=啶ぞ啶� 啶ぞ啶むぞ啶掂ぞ啶曕 啶︵ぞ啶ㄠぞ啶� 啶膏ぞ啶ぞ啶�. 啶︵啶灌ぁ啶监ぞ 啶曕啶班啶啶熰啶� 啶.
+password_ok=OK
+
+printing_not_supported=啶灌啶膏た啶ぞ啶�: 啶涏ぞ啶ぞ 啶ㄠ啶掂ぞ 啶ぞ啶ㄠい啷囙く啶距啷� 啶︵ぞ啶班ぞ啶� 啶む 啶啶班ぞ啶监さ 啶ぞ啶� 啶椸啶∴ぜ啷嬥さ啶距啶距え啶� .
+printing_not_ready=啶灌啶傕じ啶苦く啶距ぜ啶�: 啶涏ぞ啶ぞ 啶侧ぞ啶监啶苦い啷�  PDF 啶啶班ぞ啶� 啶ぞ啶� 啶侧ぞ啶︵ 啶嗋啶距え啶�.
+web_fonts_disabled=啶掂啶� 啶啶ㄠ啶� 啶ぞ啶� 啶灌啶� 啶灌啶氞 啶嗋啶距え啶�: 啶た啶むた啶� 啶ムぞ啶啶� PDF 啶啶ㄠ啶熰啶� 啶啶ぞ啶� 啶ぞ啶� 啶灌啶� 啶曕啶ぞ.
+document_colors_not_allowed=PDF 啶︵啶侧た啶� 啶曕 啶嗋啶距啷� 啶ㄠた啶溹 啶班啶� 啶啶ぞ啶� 啶ぞ啶むぞ啶� 啶ぞ啶� 啶忇ぎ啶距啶距啷� 啶�: '啶嗋啶距啷� 啶ㄠた啶溹 啶班啶� 啶曕 啶ぞ啶涏ぞ啶� 啶侧ぞ啶监啶苦い啷�  啶ぞ啶むぞ啶� 啶忇ぎ 啶膏ぞ啶灌啶� 啶曕啶︵ 啶啶班ぞ啶夃啶距ぐ 啶班 啶ぞ啶� 啶氞啶椸啶∴ぜ 啶灌啶氞啶掂ぞ.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/si/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/si/viewer.properties
new file mode 100644
index 0000000..4137ec1
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/si/viewer.properties
@@ -0,0 +1,171 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=喽膏窊喽� 喽脆窓喽� 喽脆窉喽о窋喾�
+previous_label=喽脆窓喽�
+next.title=喽膏窊喾呧稛 喽脆窉喽о窋喾�
+next_label=喽膏窊喾呧稛
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=喽脆窉喽о窋喾�
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+
+zoom_out.title=喽氞窋喽┼窂 喽氞痘喽编穵喽�
+zoom_out_label=喽氞窋喽┼窂 喽氞痘喽编穵喽�
+zoom_in.title=喾�喾掄穪喾忇督 喽氞痘喽编穵喽�
+zoom_in_label=喾�喾掄穪喾忇督 喽氞痘喽编穵喽�
+zoom.title=喾�喾掄穪喾忇督喽逗
+presentation_mode.title=喽夃动喾掄痘喾掄洞喽穵喽氞窉喽秽窊喽膏穵 喽脆穵鈥嵿痘喽氞窂喽秽逗 喾�喾權董 喽膏窂喽秽窋喾�喽编穵喽�
+presentation_mode_label=喽夃动喾掄痘喾掄洞喽穵喽氞窉喽秽窊喽膏穵 喽脆穵鈥嵿痘喽氞窂喽秽逗
+open_file.title=喽溹窚喽编窋喾� 喾�喾掄穩喾樴董 喽氞痘喽编穵喽�
+open_file_label=喾�喾掄穩喾樴董 喽氞痘喽编穵喽�
+print.title=喽膏窋喽穵鈥嵿痘喽逗
+print_label=喽膏窋喽穵鈥嵿痘喽逗
+download.title=喽多窂喽溹侗喾娻侗
+download_label=喽多窂喽溹侗喾娻侗
+bookmark.title=喽窅喽编锭 喽囙董喾� 喽穬喾斷侗 (喽脆窉喽о洞喽穵 喽氞痘喽编穵喽� 喾勦窛 喽编穩 喽氞穩喾斷穮喾斷穩喽� 喾�喾掄穩喾樴董 喽氞痘喽编穵喽�)
+bookmark_label=喽窅喽编锭 喽囙董喾� 喽穬喾斷侗
+
+# Secondary toolbar and context menu
+tools.title=喽膏窓喾�喽洁陡喾�
+tools_label=喽膏窓喾�喽洁陡喾�
+first_page.title=喽膏窋喽洁穵 喽脆窉喽о窋喾�喽� 喽亨侗喾娻侗
+first_page.label=喽膏窋喽洁穵 喽脆窉喽о窋喾�喽� 喽亨侗喾娻侗
+first_page_label=喽膏窋喽洁穵 喽脆窉喽о窋喾�喽� 喽亨侗喾娻侗
+last_page.title=喽呧穩喾冟侗喾� 喽脆窉喽о窋喾�喽� 喽亨侗喾娻侗
+last_page.label=喽呧穩喾冟侗喾� 喽脆窉喽о窋喾�喽� 喽亨侗喾娻侗
+last_page_label=喽呧穩喾冟侗喾� 喽脆窉喽о窋喾�喽� 喽亨侗喾娻侗
+page_rotate_cw.title=喽稓喾娻穪喾掄东喾忇穩喽秽穵喽穩 喽粪穵鈥嵿痘喽膏东喽�
+page_rotate_cw.label=喽稓喾娻穪喾掄东喾忇穩喽秽穵喽穩 喽粪穵鈥嵿痘喽膏东喽�
+page_rotate_cw_label=喽稓喾娻穪喾掄东喾忇穩喽秽穵喽穩 喽粪穵鈥嵿痘喽膏东喽�
+page_rotate_ccw.title=喾�喾忇陡喾忇穩喽秽穵喽穩 喽粪穵鈥嵿痘喽膏东喽�
+page_rotate_ccw.label=喾�喾忇陡喾忇穩喽秽穵喽穩 喽粪穵鈥嵿痘喽膏东喽�
+page_rotate_ccw_label=喾�喾忇陡喾忇穩喽秽穵喽穩 喽粪穵鈥嵿痘喽膏东喽�
+
+
+# Document properties dialog box
+document_properties.title=喽洁窔喽涏侗 喾�喽穵喽氞陡喾�...
+document_properties_label=喽洁窔喽涏侗 喾�喽穵喽氞陡喾�...
+document_properties_file_name=喽溹窚喽编窋 喽编陡:
+document_properties_file_size=喽溹窚喽编窋 喽脆穵鈥嵿痘喽膏窂喽逗:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} 喽多逗喾掄锭)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} 喽多逗喾掄锭)
+document_properties_title=喾冟窉喽秽穬喾娻董喽洁逗:
+document_properties_author=喽氞董喾�
+document_properties_subject=喽膏窂喽窐喽氞窂喾�:
+document_properties_keywords=喽亨董喾斷痘喾� 喾�喽侗喾�:
+document_properties_creation_date=喽编窉喽秽穵喽膏窉喽� 喽窉喽编逗:
+document_properties_modification_date=喾�喾權侗喾冟穵喽氞督 喽窉喽编逗:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=喽编窉喽秽穵喽膏窂喽脆稓:
+document_properties_producer=PDF 喽编窉喾佮穵喽脆窂喽稓:
+document_properties_version=PDF 喽编窉喽氞窋喽窋喾�:
+document_properties_page_count=喽脆窉喽о窋 喽溹东喽�:
+document_properties_close=喾�喾冟侗喾娻侗
+
+print_progress_message=喽洁窔喽涏侗喽� 喽膏窋喽穵鈥嵿痘喽逗 喾冟冻喾勦窂 喾冟窎喽窂喽编陡喾� 喽氞痘喽膏窉喽编穵鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_close=喽呧穩喽洁秱喽溹窋 喽氞痘喽编穵喽�
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=喽脆窅喽窉 喽窊喽秽窋喾�喽� 喽膏窂喽秽窋喾�喽编穵喽�
+toggle_sidebar_label=喽脆窅喽窉 喽窊喽秽窋喾�喽� 喽膏窂喽秽窋喾�喽编穵喽�
+attachments.title=喽囙陡喾掄东喾斷陡喾� 喽脆窓喽编穵喾�喽编穵喽�
+attachments_label=喽囙陡喾掄东喾斷陡喾�
+thumbs.title=喾冟窉喽熰窉喽窉 喽秽窎 喽脆窓喽编穵喾�喽编穵喽�
+thumbs_label=喾冟窉喽熰窉喽窉 喽秽窎
+findbar.title=喽洁窔喽涏侗喽� 喽窋喾� 喾冟窚喽亨侗喾娻侗
+findbar_label=喾冟窚喽亨侗喾娻侗
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=喽脆窉喽о窋喾� {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=喽脆窉喽о窋喾�喾� 喾冟窉喽熰窉喽� 喽秽窎喾� {{page}}
+
+# Find panel button title and messages
+find_previous.title=喽膏窔 喾�喾忇稓喾娾�嵿逗 喽涏东喾娻订喽� 喽膏窊喽� 喽脆窓喽� 喽亨窓喽窋喽窋 喾冟穵喽窂喽编逗 喾冟窚喽亨侗喾娻侗
+find_previous_label=喽脆窓喽�:
+find_next.title=喽膏窔 喾�喾忇稓喾娾�嵿逗 喽涏东喾娻订喽� 喽膏窊喾呧稛喽� 喽亨窓喽窓喽� 喾冟穵喽窂喽编逗 喾冟窚喽亨侗喾娻侗
+find_next_label=喽膏窊喾呧稛
+find_highlight=喾冟窉喽亨督喾娻督 喽嬥动喾娻动喾撪洞喽编逗
+find_match_case_label=喽呧稓喾斷痘喾� 喽溹穮喽脆侗喾娻侗
+find_reached_top=喽脆窉喽о窋喾�喾� 喽夃穭喾� 喽氞窓喾呧穩喽秽锭 喽洁稖喾忇穩喾掄逗, 喽脆穭喾� 喾冟窉喽� 喽夃动喾掄痘喾掄逗喽� 喽亨陡喾掄侗喾�
+find_reached_bottom=喽脆窉喽о窋喾�喾� 喽脆穭喾� 喽氞窓喾呧穩喽秽锭 喽洁稖喾忇穩喾掄逗, 喽夃穭喾� 喾冟窉喽� 喽夃动喾掄痘喾掄逗喽� 喽亨陡喾掄侗喾�
+find_not_found=喽斷抖 喾冟窓喾�喾� 喾�喽犩侗 喾勦陡喾� 喽编窚喾�喾撪逗
+
+# Error panel labels
+error_more_info=喽多窚喾勦窛 喽窚喽秽董喾斷痘喾�
+error_less_info=喽呧穩喽� 喽窚喽秽董喾斷痘喾�
+error_close=喾�喾冟侗喾娻侗
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (喽编窉喽氞窋喽窋喾�: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=喽脆东喾掄穩喾掄订喽�: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stack: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=喽溹窚喽编窋喾�: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=喽脆窔喾呧窉喽�: {{line}}
+rendering_error=喽脆窉喽о窋喾� 喽秽窓喽编穵喽┼痘喾� 喾�喾掄陡喾氞动喾� 喽溹窅喽о督喾斷穩喽氞穵 喾勦锭 喽溹窅喽编窋喽窉.
+
+# Predefined zoom values
+page_scale_width=喽脆窉喽о窋喾�喾� 喽脆穮喽�
+page_scale_fit=喽脆窉喽о窋喾�喽� 喾冟窋喽窋喾冟窋 喽洁窓喾�
+page_scale_auto=喾冟穵喾�喽亨秱喽氞穵鈥嵿痘喾撪逗 喾�喾掄穪喾忇督喽逗
+page_scale_actual=喽编窉喽亨陡喾掄董 喽脆穵鈥嵿痘喽膏窂喽逗
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=喽窛喾傕逗
+loading_error=PDF 喽脆窎喽秽东喽� 喾�喾掄陡喾氞动喾� 喽窛喾傕逗喽氞穵 喾勦锭 喽溹窅喽编窋喽窉.
+invalid_file_error=喽窎喾佮窉喽� 喾勦窛 喾冟窂喾�喽穵鈥嵿逗 PDF 喽溹窚喽编窋喾�.
+missing_file_error=喽编窅喽窉喾�喾� PDF 喽溹窚喽编窋喾�.
+unexpected_response_error=喽多督喾忇洞喾溹痘喾溹董喾娻董喾� 喽编窚喾�喾� 喾冟窔喾�喾忇动喾忇逗喽� 喽脆穵鈥嵿痘喽窉喽犩窂喽秽逗.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} 喾�喾掄穬喾娻董喽秽逗]
+password_label=喽膏窓喽� PDF 喽溹窚喽编窋喾� 喾�喾掄穩喾樴董 喽氞窉喽秽窊喽膏锭 喽膏窋喽秽洞喽逗 喽囙董喾斷穮喽穵 喽氞痘喽编穵喽�.
+password_invalid=喾�喾愢痘喽窉 喽膏窋喽秽洞喽逗喽氞穵. 喽氞痘喾斷东喾忇稓喽� 喽编窅喾�喽� 喽嬥董喾娻穬喾� 喽氞痘喽编穵喽�.
+password_ok=喾勦痘喾�
+password_cancel=喽戉洞喾�
+
+printing_not_supported=喽呧穩喾�喾忇动喽亨逗喾�: 喽膏窓喽� 喽溹穩喾氞穪喽氞逗 喽膏窋喽穵鈥嵿痘喽逗 喾冟冻喾勦窂 喾冟陡喾娻洞喾栢痘喾娻东喽亨窓喽编穵 喾冟穭喽� 喽编窚喽稓喾娻穩喽亨窉.
+printing_not_ready=喽呧穩喾�喾忇动喽亨逗喾�: 喽膏窋喽穵鈥嵿痘喽逗 喾冟冻喾勦窂 PDF 喾冟陡喾娻洞喾栢痘喾娻东喽亨窓喽编穵 喽脆窎喽秽穵喽逗 喾�喾� 喽编窚喽膏窅喽�.
+web_fonts_disabled=喽⑧窂喽� 喽呧稓喾斷痘喾� 喽呧稓喾娾�嵿痘喾撪逗喽亨窉: 喽窉喾呧窅喽洁窉 PDF 喽呧稓喾斷痘喾� 喽粪窂喾�喾掄董 喽氞穮 喽编窚喾勦窅喽�.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/sk/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/sk/viewer.properties
new file mode 100644
index 0000000..f18c633
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/sk/viewer.properties
@@ -0,0 +1,242 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Predch谩dzaj煤ca strana
+previous_label=Predch谩dzaj煤ca
+next.title=Nasleduj煤ca strana
+next_label=Nasleduj煤ca
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=Strana
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=z {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} z {{pagesCount}})
+
+zoom_out.title=Zmen拧i钮 ve木kos钮
+zoom_out_label=Zmen拧i钮 ve木kos钮
+zoom_in.title=Zv盲膷拧i钮 ve木kos钮
+zoom_in_label=Zv盲膷拧i钮 ve木kos钮
+zoom.title=Nastavenie ve木kosti
+presentation_mode.title=Prepn煤钮 na re啪im prezent谩cie
+presentation_mode_label=Re啪im prezent谩cie
+open_file.title=Otvori钮 s煤bor
+open_file_label=Otvori钮
+print.title=Tla膷i钮
+print_label=Tla膷i钮
+download.title=Prevzia钮
+download_label=Prevzia钮
+bookmark.title=Aktu谩lne zobrazenie (kop铆rova钮 alebo otvori钮 v novom okne)
+bookmark_label=Aktu谩lne zobrazenie
+
+# Secondary toolbar and context menu
+tools.title=N谩stroje
+tools_label=N谩stroje
+first_page.title=Prejs钮 na prv煤 stranu
+first_page.label=Prejs钮 na prv煤 stranu
+first_page_label=Prejs钮 na prv煤 stranu
+last_page.title=Prejs钮 na posledn煤 stranu
+last_page.label=Prejs钮 na posledn煤 stranu
+last_page_label=Prejs钮 na posledn煤 stranu
+page_rotate_cw.title=Oto膷i钮 v smere hodinov媒ch ru膷i膷iek
+page_rotate_cw.label=Oto膷i钮 v smere hodinov媒ch ru膷i膷iek
+page_rotate_cw_label=Oto膷i钮 v smere hodinov媒ch ru膷i膷iek
+page_rotate_ccw.title=Oto膷i钮 proti smeru hodinov媒ch ru膷i膷iek
+page_rotate_ccw.label=Oto膷i钮 proti smeru hodinov媒ch ru膷i膷iek
+page_rotate_ccw_label=Oto膷i钮 proti smeru hodinov媒ch ru膷i膷iek
+
+cursor_text_select_tool.title=Povoli钮 v媒ber textu
+cursor_text_select_tool_label=V媒ber textu
+cursor_hand_tool.title=Povoli钮 n谩stroj ruka
+cursor_hand_tool_label=N谩stroj ruka
+
+scroll_vertical.title=Pou啪铆va钮 zvisl茅 pos煤vanie
+scroll_vertical_label=Zvisl茅 pos煤vanie
+scroll_horizontal.title=Pou啪铆va钮 vodorovn茅 pos煤vanie
+scroll_horizontal_label=Vodorovn茅 pos煤vanie
+scroll_wrapped.title=Pou啪i钮 postupn茅 pos煤vanie
+scroll_wrapped_label=Postupn茅 pos煤vanie
+
+spread_none.title=Nezdru啪ova钮 str谩nky
+spread_none_label=沤iadne zdru啪ovanie
+spread_odd.title=Zdru啪铆 str谩nky a umiestni nep谩rne str谩nky v木avo
+spread_odd_label=Zdru啪i钮 str谩nky (nep谩rne v木avo)
+spread_even.title=Zdru啪铆 str谩nky a umiestni p谩rne str谩nky v木avo
+spread_even_label=Zdru啪i钮 str谩nky (p谩rne v木avo)
+
+# Document properties dialog box
+document_properties.title=Vlastnosti dokumentu鈥�
+document_properties_label=Vlastnosti dokumentu鈥�
+document_properties_file_name=N谩zov s煤boru:
+document_properties_file_size=Ve木kos钮 s煤boru:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} kB ({{size_b}} bajtov)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} bajtov)
+document_properties_title=N谩zov:
+document_properties_author=Autor:
+document_properties_subject=Predmet:
+document_properties_keywords=K木煤膷ov茅 slov谩:
+document_properties_creation_date=D谩tum vytvorenia:
+document_properties_modification_date=D谩tum 煤pravy:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Vytvoril:
+document_properties_producer=Tvorca PDF:
+document_properties_version=Verzia PDF:
+document_properties_page_count=Po膷et str谩n:
+document_properties_page_size=Ve木kos钮 str谩nky:
+document_properties_page_size_unit_inches=in
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=na v媒拧ku
+document_properties_page_size_orientation_landscape=na 拧铆rku
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=List
+document_properties_page_size_name_legal=Legal
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=R媒chle Web View:
+document_properties_linearized_yes=脕no
+document_properties_linearized_no=Nie
+document_properties_close=Zavrie钮
+
+print_progress_message=Pr铆prava dokumentu na tla膷鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=Zru拧i钮
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Prepn煤钮 bo膷n媒 panel
+toggle_sidebar_notification.title=Prepn煤钮 bo膷n媒 panel (dokument obsahuje osnovu/pr铆lohy)
+toggle_sidebar_label=Prepn煤钮 bo膷n媒 panel
+document_outline.title=Zobrazi钮 osnovu dokumentu (dvojit媒m kliknut铆m rozbal铆te/zbal铆te v拧etky polo啪ky)
+document_outline_label=Osnova dokumentu
+attachments.title=Zobrazi钮 pr铆lohy
+attachments_label=Pr铆lohy
+thumbs.title=Zobrazi钮 miniat煤ry
+thumbs_label=Miniat煤ry
+findbar.title=H木ada钮 v dokumente
+findbar_label=H木ada钮
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Strana {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Miniat煤ra strany {{page}}
+
+# Find panel button title and messages
+find_input.title=H木ada钮
+find_input.placeholder=H木ada钮 v dokumente鈥�
+find_previous.title=Vyh木ada钮 predch谩dzaj煤ci v媒skyt re钮azca
+find_previous_label=Predch谩dzaj煤ce
+find_next.title=Vyh木ada钮 膹al拧铆 v媒skyt re钮azca
+find_next_label=膸al拧ie
+find_highlight=Zv媒razni钮 v拧etky
+find_match_case_label=Rozli拧ova钮 ve木kos钮 p铆smen
+find_entire_word_label=Cel茅 slov谩
+find_reached_top=Bol dosiahnut媒 za膷iatok str谩nky, pokra膷uje sa od konca
+find_reached_bottom=Bol dosiahnut媒 koniec str谩nky, pokra膷uje sa od za膷iatku
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]={{current}}. z {{total}} v媒sledku
+find_match_count[two]={{current}}. z {{total}} v媒sledkov
+find_match_count[few]={{current}}. z {{total}} v媒sledkov
+find_match_count[many]={{current}}. z {{total}} v媒sledkov
+find_match_count[other]={{current}}. z {{total}} v媒sledkov
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]=Viac ne啪 {{limit}} v媒sledkov
+find_match_count_limit[one]=Viac ne啪 {{limit}} v媒sledok
+find_match_count_limit[two]=Viac ne啪 {{limit}} v媒sledky
+find_match_count_limit[few]=Viac ne啪 {{limit}} v媒sledky
+find_match_count_limit[many]=Viac ne啪 {{limit}} v媒sledkov
+find_match_count_limit[other]=Viac ne啪 {{limit}} v媒sledkov
+find_not_found=V媒raz nebol n谩jden媒
+
+# Error panel labels
+error_more_info=Viac inform谩ci铆
+error_less_info=Menej inform谩ci铆
+error_close=Zavrie钮
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (zostavenie: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Spr谩va: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Z谩sobn铆k: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=S煤bor: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Riadok: {{line}}
+rendering_error=Pri vykres木ovan铆 str谩nky sa vyskytla chyba.
+
+# Predefined zoom values
+page_scale_width=Na 拧铆rku strany
+page_scale_fit=Na ve木kos钮 strany
+page_scale_auto=Automatick谩 ve木kos钮
+page_scale_actual=Skuto膷n谩 ve木kos钮
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}} %
+
+# Loading indicator messages
+loading_error_indicator=Chyba
+loading_error=Po膷as na膷铆tavania dokumentu PDF sa vyskytla chyba.
+invalid_file_error=Neplatn媒 alebo po拧koden媒 s煤bor PDF.
+missing_file_error=Ch媒baj煤ci s煤bor PDF.
+unexpected_response_error=Neo膷ak谩van谩 odpove膹 zo servera.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[Anot谩cia typu {{type}}]
+password_label=Ak chcete otvori钮 tento s煤bor PDF, zadajte jeho heslo.
+password_invalid=Heslo nie je platn茅. Sk煤ste to znova.
+password_ok=OK
+password_cancel=Zru拧i钮
+
+printing_not_supported=Upozornenie: tla膷 nie je v tomto prehliada膷i plne podporovan谩.
+printing_not_ready=Upozornenie: s煤bor PDF nie je plne na膷铆tan媒 pre tla膷.
+web_fonts_disabled=Webov茅 p铆sma s煤 vypnut茅: nie je mo啪n茅 pou啪i钮 p铆sma vlo啪en茅 do s煤boru PDF.
+document_colors_not_allowed=Dokumenty PDF nemaj煤 povolen茅 pou啪铆va钮 vlastn茅 farby, preto啪e vo木ba "Povoli钮 str谩nkam pou啪铆va钮 vlastn茅 farby" je v nastaveniach prehliada膷a vypnut谩.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/sl/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/sl/viewer.properties
new file mode 100644
index 0000000..073ea3a
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/sl/viewer.properties
@@ -0,0 +1,242 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Prej拧nja stran
+previous_label=Nazaj
+next.title=Naslednja stran
+next_label=Naprej
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=Stran
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=od {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} od {{pagesCount}})
+
+zoom_out.title=Pomanj拧aj
+zoom_out_label=Pomanj拧aj
+zoom_in.title=Pove膷aj
+zoom_in_label=Pove膷aj
+zoom.title=Pove膷ava
+presentation_mode.title=Preklopi v na膷in predstavitve
+presentation_mode_label=Na膷in predstavitve
+open_file.title=Odpri datoteko
+open_file_label=Odpri
+print.title=Natisni
+print_label=Natisni
+download.title=Prenesi
+download_label=Prenesi
+bookmark.title=Trenutni pogled (kopiraj ali odpri v novem oknu)
+bookmark_label=Trenutni pogled
+
+# Secondary toolbar and context menu
+tools.title=Orodja
+tools_label=Orodja
+first_page.title=Pojdi na prvo stran
+first_page.label=Pojdi na prvo stran
+first_page_label=Pojdi na prvo stran
+last_page.title=Pojdi na zadnjo stran
+last_page.label=Pojdi na zadnjo stran
+last_page_label=Pojdi na zadnjo stran
+page_rotate_cw.title=Zavrti v smeri urninega kazalca
+page_rotate_cw.label=Zavrti v smeri urninega kazalca
+page_rotate_cw_label=Zavrti v smeri urninega kazalca
+page_rotate_ccw.title=Zavrti v nasprotni smeri urninega kazalca
+page_rotate_ccw.label=Zavrti v nasprotni smeri urninega kazalca
+page_rotate_ccw_label=Zavrti v nasprotni smeri urninega kazalca
+
+cursor_text_select_tool.title=Omogo膷i orodje za izbor besedila
+cursor_text_select_tool_label=Orodje za izbor besedila
+cursor_hand_tool.title=Omogo膷i roko
+cursor_hand_tool_label=Roka
+
+scroll_vertical.title=Uporabi navpi膷no drsenje
+scroll_vertical_label=Navpi膷no drsenje
+scroll_horizontal.title=Uporabi vodoravno drsenje
+scroll_horizontal_label=Vodoravno drsenje
+scroll_wrapped.title=Uporabi ovito drsenje
+scroll_wrapped_label=Ovito drsenje
+
+spread_none.title=Ne zdru啪uj razponov strani
+spread_none_label=Brez razponov
+spread_odd.title=Zdru啪uj razpone strani z za膷etkom pri lihih straneh
+spread_odd_label=Lihi razponi
+spread_even.title=Zdru啪uj razpone strani z za膷etkom pri sodih straneh
+spread_even_label=Sodi razponi
+
+# Document properties dialog box
+document_properties.title=Lastnosti dokumenta 鈥�
+document_properties_label=Lastnosti dokumenta 鈥�
+document_properties_file_name=Ime datoteke:
+document_properties_file_size=Velikost datoteke:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} bajtov)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} bajtov)
+document_properties_title=Ime:
+document_properties_author=Avtor:
+document_properties_subject=Tema:
+document_properties_keywords=Klju膷ne besede:
+document_properties_creation_date=Datum nastanka:
+document_properties_modification_date=Datum spremembe:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Ustvaril:
+document_properties_producer=Izdelovalec PDF:
+document_properties_version=Razli膷ica PDF:
+document_properties_page_count=艩tevilo strani:
+document_properties_page_size=Velikost strani:
+document_properties_page_size_unit_inches=palcev
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=pokon膷no
+document_properties_page_size_orientation_landscape=le啪e膷e
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Pismo
+document_properties_page_size_name_legal=Pravno
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=Hitri spletni ogled:
+document_properties_linearized_yes=Da
+document_properties_linearized_no=Ne
+document_properties_close=Zapri
+
+print_progress_message=Priprava dokumenta na tiskanje 鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}} %
+print_progress_close=Prekli膷i
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Preklopi stransko vrstico
+toggle_sidebar_notification.title=Preklopi stransko vrstico (dokument vsebuje oris/priponke)
+toggle_sidebar_label=Preklopi stransko vrstico
+document_outline.title=Prika啪i oris dokumenta (dvokliknite za raz拧iritev/strnitev vseh predmetov)
+document_outline_label=Oris dokumenta
+attachments.title=Prika啪i priponke
+attachments_label=Priponke
+thumbs.title=Prika啪i sli膷ice
+thumbs_label=Sli膷ice
+findbar.title=Iskanje po dokumentu
+findbar_label=Najdi
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Stran {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Sli膷ica strani {{page}}
+
+# Find panel button title and messages
+find_input.title=Najdi
+find_input.placeholder=Najdi v dokumentu 鈥�
+find_previous.title=Najdi prej拧njo ponovitev iskanega
+find_previous_label=Najdi nazaj
+find_next.title=Najdi naslednjo ponovitev iskanega
+find_next_label=Najdi naprej
+find_highlight=Ozna膷i vse
+find_match_case_label=Razlikuj velike/male 膷rke
+find_entire_word_label=Cele besede
+find_reached_top=Dose啪en za膷etek dokumenta iz smeri konca
+find_reached_bottom=Dose啪eno konec dokumenta iz smeri za膷etka
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]=Zadetek {{current}} od {{total}}
+find_match_count[two]=Zadetek {{current}} od {{total}}
+find_match_count[few]=Zadetek {{current}} od {{total}}
+find_match_count[many]=Zadetek {{current}} od {{total}}
+find_match_count[other]=Zadetek {{current}} od {{total}}
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]=Ve膷 kot {{limit}} zadetkov
+find_match_count_limit[one]=Ve膷 kot {{limit}} zadetek
+find_match_count_limit[two]=Ve膷 kot {{limit}} zadetka
+find_match_count_limit[few]=Ve膷 kot {{limit}} zadetki
+find_match_count_limit[many]=Ve膷 kot {{limit}} zadetkov
+find_match_count_limit[other]=Ve膷 kot {{limit}} zadetkov
+find_not_found=Iskanega ni mogo膷e najti
+
+# Error panel labels
+error_more_info=Ve膷 informacij
+error_less_info=Manj informacij
+error_close=Zapri
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js r{{version}} (graditev: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Sporo膷ilo: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Sklad: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Datoteka: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Vrstica: {{line}}
+rendering_error=Med pripravljanjem strani je pri拧lo do napake!
+
+# Predefined zoom values
+page_scale_width=艩irina strani
+page_scale_fit=Prilagodi stran
+page_scale_auto=Samodejno
+page_scale_actual=Dejanska velikost
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}} %
+
+# Loading indicator messages
+loading_error_indicator=Napaka
+loading_error=Med nalaganjem datoteke PDF je pri拧lo do napake.
+invalid_file_error=Neveljavna ali pokvarjena datoteka PDF.
+missing_file_error=Ni datoteke PDF.
+unexpected_response_error=Nepri膷akovan odgovor stre啪nika.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[Opomba vrste {{type}}]
+password_label=Vnesite geslo za odpiranje te datoteke PDF.
+password_invalid=Neveljavno geslo. Poskusite znova.
+password_ok=V redu
+password_cancel=Prekli膷i
+
+printing_not_supported=Opozorilo: ta brskalnik ne podpira vseh mo啪nosti tiskanja.
+printing_not_ready=Opozorilo: PDF ni v celoti nalo啪en za tiskanje.
+web_fonts_disabled=Spletne pisave so onemogo膷ene: vgradnih pisav za PDF ni mogo膷e uporabiti.
+document_colors_not_allowed=Dokumenti PDF ne smejo uporabljati svojih lastnih barv: mo啪nost 'Dovoli stranem uporabo lastnih barv' je v brskalniku onemogo膷ena.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/son/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/son/viewer.properties
new file mode 100644
index 0000000..f5c1b46
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/son/viewer.properties
@@ -0,0 +1,180 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Moo bisante
+previous_label=Bisante
+next.title=Jinehere moo
+next_label=Jine
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=Moo
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages={{pagesCount}} ra
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} ka hun {{pagesCount}}) ra
+
+zoom_out.title=Nakasandi
+zoom_out_label=Nakasandi
+zoom_in.title=Bebbeerandi
+zoom_in_label=Bebbeerandi
+zoom.title=Bebbeerandi
+presentation_mode.title=Bere cebeyan alhaali
+presentation_mode_label=Cebeyan alhaali
+open_file.title=Tuku feeri
+open_file_label=Feeri
+print.title=Kar
+print_label=Kar
+download.title=Zumandi
+download_label=Zumandi
+bookmark.title=Soh玫 gunarro (bere wala feeri zanfun taaga ra)
+bookmark_label=Soh玫 gunaroo
+
+# Secondary toolbar and context menu
+tools.title=Goyjinawey
+tools_label=Goyjinawey
+first_page.title=Koy moo jinaa ga
+first_page.label=Koy moo jinaa ga
+first_page_label=Koy moo jinaa ga
+last_page.title=Koy moo koraa ga
+last_page.label=Koy moo koraa ga
+last_page_label=Koy moo koraa ga
+page_rotate_cw.title=Kuubi kanbe guma here
+page_rotate_cw.label=Kuubi kanbe guma here
+page_rotate_cw_label=Kuubi kanbe guma here
+page_rotate_ccw.title=Kuubi kanbe wowa here
+page_rotate_ccw.label=Kuubi kanbe wowa here
+page_rotate_ccw_label=Kuubi kanbe wowa here
+
+
+# Document properties dialog box
+document_properties.title=Takadda mayrawey鈥�
+document_properties_label=Takadda mayrawey鈥�
+document_properties_file_name=Tuku maa:
+document_properties_file_size=Tuku adadu:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb=KB {{size_kb}} (cebsu-ize {{size_b}})
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb=MB {{size_mb}} (cebsu-ize {{size_b}})
+document_properties_title=Tiiramaa:
+document_properties_author=Hantumkaw:
+document_properties_subject=Dalil:
+document_properties_keywords=Kufalkalimawey:
+document_properties_creation_date=Teeyan han:
+document_properties_modification_date=Barmayan han:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Teekaw:
+document_properties_producer=PDF berandikaw:
+document_properties_version=PDF dumi:
+document_properties_page_count=Moo hinna:
+document_properties_close=Daabu
+
+print_progress_message=Goo ma takaddaa soolu k'a kar se鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=Na艐
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Kanjari ceraw zuu
+toggle_sidebar_notification.title=Kanjari ceraw-zuu (takaddaa goo nda filla-bo艐/hangandiya艐)
+toggle_sidebar_label=Kanjari ceraw zuu
+document_outline.title=Takaddaa korfur alhaaloo cebe (naagu cee hinka ka haya-izey kul hayandi/kankamandi)
+document_outline_label=Takadda filla-bo艐
+attachments.title=Hangarey cebe
+attachments_label=Hangarey
+thumbs.title=Kabeboy biyey cebe
+thumbs_label=Kabeboy biyey
+findbar.title=Ceeci takaddaa ra
+findbar_label=Ceeci
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title={{page}} moo
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Kabeboy bii {{page}} moo 拧e
+
+# Find panel button title and messages
+find_input.title=Ceeci
+find_input.placeholder=Ceeci takaddaa ra鈥�
+find_previous.title=Kalima刹a艐oo bangayri bisantaa ceeci
+find_previous_label=Bisante
+find_next.title=Kalima刹a艐oo hiino bangayroo ceeci
+find_next_label=Jine
+find_highlight=Ikul 拧ilbay
+find_match_case_label=Harfu-beeriyan hawgay
+find_reached_top=A too mo艐oo bo艐oo, koy jine ka 拧initin nda cewoo
+find_reached_bottom=A too mo刹oo cewoo, koy jine 拧intioo ga
+find_not_found=Kalima刹aa mana duwandi
+
+# Error panel labels
+error_more_info=Alhabar tontoni
+error_less_info=Alhabar tontoni
+error_close=Daabu
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Alhabar: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Dekeri: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Tuku: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=沤eeri: {{line}}
+rendering_error=Firka bangay ka艐 mo刹oo goo ma willandi.
+
+# Predefined zoom values
+page_scale_width=Mooo hayyan
+page_scale_fit=Moo sawayan
+page_scale_auto=Bo艐拧e azzaati barmayyan
+page_scale_actual=Adadu cimi
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Firka
+loading_error=Firka bangay ka艐 PDF goo ma zumandi.
+invalid_file_error=PDF tuku laala wala laybante.
+missing_file_error=PDF tuku kumante.
+unexpected_response_error=Manti fer拧ikaw tuuruyan maatante.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt={{type}} maasa-caw]
+password_label=艩ennikufal dam ka PDF tukoo woo feeri.
+password_invalid=艩ennikufal laalo. Ceeci koyne taare.
+password_ok=Ayyo
+password_cancel=Na艐
+
+printing_not_supported=Yaamar: Karyan 拧i tee ka timme nda ceecikaa woo.
+printing_not_ready=Yaamar: PDF 拧i zunbu ka timme karyan 拧e.
+web_fonts_disabled=Interneti 拧igirawey kay: 拧i hin ka goy nda PDF 拧igira hurantey.
+document_colors_not_allowed=PDF takaddawey 拧i duu fondo ka ngey bo艐 noonawey zaa: 鈥淣a艐 mo刹ey ma ngey bo艐 noonawey suuba鈥� 拧i dira ceecikaa ga.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/sq/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/sq/viewer.properties
new file mode 100644
index 0000000..55a7ebe
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/sq/viewer.properties
@@ -0,0 +1,233 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Faqja e M毛parshme
+previous_label=E m毛parshmja
+next.title=Faqja Pasuese
+next_label=Pasuesja
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=Faqe
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=nga {{pagesCount}} gjithsej
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} nga {{pagesCount}})
+
+zoom_out.title=Zvog毛lim
+zoom_out_label=Zvog毛lojini
+zoom_in.title=Zmadhim
+zoom_in_label=Zmadhojini
+zoom.title=Zoom
+presentation_mode.title=Kalo te M毛nyra Paraqitje
+presentation_mode_label=M毛nyra Paraqitje
+open_file.title=Hapni Kartel毛
+open_file_label=Hape
+print.title=Shtypje
+print_label=Shtype
+download.title=Shkarkim
+download_label=Shkarkoje
+bookmark.title=Pamja e tanishme (kopjojeni ose hapeni n毛 dritare t毛 re)
+bookmark_label=Pamja e Tanishme
+
+# Secondary toolbar and context menu
+tools.title=Mjete
+tools_label=Mjete
+first_page.title=Kaloni te Faqja e Par毛
+first_page.label=Kaloni te Faqja e Par毛
+first_page_label=Kaloni te Faqja e Par毛
+last_page.title=Kaloni te Faqja e Fundit
+last_page.label=Kaloni te Faqja e Fundit
+last_page_label=Kaloni te Faqja e Fundit
+page_rotate_cw.title=Rrotullojeni N毛 Kahun Orar
+page_rotate_cw.label=Rrotulloje N毛 Kahun Orar
+page_rotate_cw_label=Rrotulloje N毛 Kahun Orar
+page_rotate_ccw.title=Rrotullojeni N毛 Kahun Kund毛rorar
+page_rotate_ccw.label=Rrotulloje N毛 Kahun Kund毛rorar
+page_rotate_ccw_label=Rrotulloje N毛 Kahun Kund毛rorar
+
+cursor_text_select_tool.title=Aktivizo Mjet P毛rzgjedhjeje Teksti
+cursor_text_select_tool_label=Mjet P毛rzgjedhjeje Teksti
+cursor_hand_tool.title=Aktivizo Mjetin Dor毛
+cursor_hand_tool_label=Mjeti Dor毛
+
+scroll_vertical.title=P毛rdor Rr毛shqitje Vertikale
+scroll_vertical_label=Rr毛shqitje Vertikale
+scroll_horizontal.title=P毛rdor Rr毛shqitje Horizontale
+scroll_horizontal_label=Rr毛shqitje Horizontale
+
+
+# Document properties dialog box
+document_properties.title=Veti Dokumenti鈥�
+document_properties_label=Veti Dokumenti鈥�
+document_properties_file_name=Em毛r kartele:
+document_properties_file_size=Madh毛si kartele:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} bajte)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} bajte)
+document_properties_title=Titull:
+document_properties_author=Autor:
+document_properties_subject=Subjekt:
+document_properties_keywords=Fjal毛ky莽e:
+document_properties_creation_date=Dat毛 Krijimi:
+document_properties_modification_date=Dat毛 Ndryshimi:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Krijues:
+document_properties_producer=Prodhues PDF-je:
+document_properties_version=Version PDF-je:
+document_properties_page_count=Num毛r Faqesh:
+document_properties_page_size=Madh毛si Faqeje:
+document_properties_page_size_unit_inches=in
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=portret
+document_properties_page_size_orientation_landscape=s毛 gjeri
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Letter
+document_properties_page_size_name_legal=Legal
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized_yes=Po
+document_properties_linearized_no=Jo
+document_properties_close=Mbylleni
+
+print_progress_message=Po p毛rgatitet dokumenti p毛r shtypje鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=Anuloje
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Shfaqni/Fshihni An毛shtyll毛n
+toggle_sidebar_notification.title=Shfaqni An毛shtyll毛n (dokumenti p毛rmban p毛rvijim/bashk毛ngjitje)
+toggle_sidebar_label=Shfaq/Fshih An毛shtyll毛n
+document_outline.title=Shfaqni P毛rvijim Dokumenti (dyklikoni q毛 t毛 shfaqen/fshihen krejt element毛t)
+document_outline_label=P毛rvijim Dokumenti
+attachments.title=Shfaqni Bashk毛ngjitje
+attachments_label=Bashk毛ngjitje
+thumbs.title=Shfaqni Miniatura
+thumbs_label=Miniatura
+findbar.title=Gjeni n毛 Dokument
+findbar_label=Gjej
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Faqja {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Miniatur毛 e Faqes {{page}}
+
+# Find panel button title and messages
+find_input.title=Gjeje
+find_input.placeholder=Gjeni n毛 dokument鈥�
+find_previous.title=Gjeni hasjen e m毛parshme t毛 togfjal毛shit
+find_previous_label=E m毛parshmja
+find_next.title=Gjeni hasjen pasuese t毛 togfjal毛shit
+find_next_label=Pasuesja
+find_highlight=Theksoji t毛 t毛ra
+find_match_case_label=Si莽 毛sht毛 shkruar
+find_entire_word_label=Krejt fjal毛t
+find_reached_top=U mb毛rrit n毛 krye t毛 dokumentit, vazhduar prej fundit
+find_reached_bottom=U mb毛rrit n毛 fund t毛 dokumentit, vazhduar prej kreut
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]={{current}} nga {{total}} p毛rputhje gjithsej
+find_match_count[two]={{current}} nga {{total}} p毛rputhje gjithsej
+find_match_count[few]={{current}} nga {{total}} p毛rputhje gjithsej
+find_match_count[many]={{current}} nga {{total}} p毛rputhje gjithsej
+find_match_count[other]={{current}} nga {{total}} p毛rputhje gjithsej
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]=M毛 shum毛 se {{limit}} p毛rputhje
+find_match_count_limit[one]=M毛 shum毛 se {{limit}} p毛rputhje
+find_match_count_limit[two]=M毛 shum毛 se {{limit}} p毛rputhje
+find_match_count_limit[few]=M毛 shum毛 se {{limit}} p毛rputhje
+find_match_count_limit[many]=M毛 shum毛 se {{limit}} p毛rputhje
+find_match_count_limit[other]=M毛 shum毛 se {{limit}} p毛rputhje
+find_not_found=Togfjal毛sh q毛 s鈥檊jendet
+
+# Error panel labels
+error_more_info=M毛 Tep毛r t毛 Dh毛na
+error_less_info=M毛 Pak t毛 Dh毛na
+error_close=Mbylleni
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Mesazh: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stack: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Kartel毛: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Rresht: {{line}}
+rendering_error=Ndodhi nj毛 gabim gjat毛 riprodhimit t毛 faqes.
+
+# Predefined zoom values
+page_scale_width=Gjer毛si Faqeje
+page_scale_fit=Sa Nx毛 Faqja
+page_scale_auto=Zoom i Vetvetish毛m
+page_scale_actual=Madh毛sia Faktike
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Gabim
+loading_error=Ndodhi nj毛 gabim gjat毛 ngarkimit t毛 PDF-s毛.
+invalid_file_error=Kartel毛 PDF e pavlefshme ose e d毛mtuar.
+missing_file_error=Kartel毛 PDF q毛 mungon.
+unexpected_response_error=P毛rgjigje sh毛rbyesi e papritur.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[N毛nvizim {{type}}]
+password_label=Jepni fjal毛kalimin q毛 t毛 hapet kjo kartel毛 PDF.
+password_invalid=Fjal毛kalim i pavlefsh毛m. Ju lutemi, riprovoni.
+password_ok=OK
+password_cancel=Anuloje
+
+printing_not_supported=Kujdes: Shtypja s鈥檓bulohet plot毛sisht nga ky shfletues.
+printing_not_ready=Kujdes: PDF-ja s鈥櫭玸ht毛 ngarkuar plot毛sisht q毛 ta shtypni.
+web_fonts_disabled=Shkronjat Web jan毛 t毛 莽aktivizuara: s鈥檃rrihet t毛 p毛rdoren shkronja t毛 trup毛zuara n毛 PDF.
+document_colors_not_allowed=Dokumenteve PDF s鈥檜 lejohet t毛 p毛rdorin ngjyrat e tyre: 'Lejoji faqet t鈥檌 zgjedhin vet毛 ngjyrat' 毛sht毛 e 莽aktivizuar te shfletuesi.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/sr/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/sr/viewer.properties
new file mode 100644
index 0000000..1b43b56
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/sr/viewer.properties
@@ -0,0 +1,220 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=袩褉械褌褏芯写薪邪 褋褌褉邪薪懈褑邪
+previous_label=袩褉械褌褏芯写薪邪
+next.title=小谢械写械褯邪 褋褌褉邪薪懈褑邪
+next_label=小谢械写械褯邪
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=小褌褉邪薪懈褑邪
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=芯写 {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} 芯写 {{pagesCount}})
+
+zoom_out.title=校屑邪褮懈
+zoom_out_label=校屑邪褮懈
+zoom_in.title=校胁械谢懈褔邪褬
+zoom_in_label=校胁械谢懈褔邪褬
+zoom.title=校胁械谢懈褔邪胁邪褮械
+presentation_mode.title=袩褉芯屑械薪懈 薪邪 锌褉懈泻邪蟹 褍 褉械卸懈屑褍 锌褉械蟹械薪褌邪褑懈褬械
+presentation_mode_label=袪械卸懈屑 锌褉械蟹械薪褌邪褑懈褬械
+open_file.title=袨褌胁芯褉懈 写邪褌芯褌械泻褍
+open_file_label=袨褌胁芯褉懈
+print.title=楔褌邪屑锌邪褬
+print_label=楔褌邪屑锌邪褬
+download.title=袩褉械褍蟹屑懈
+download_label=袩褉械褍蟹屑懈
+bookmark.title=孝褉械薪褍褌薪懈 锌褉懈泻邪蟹 (泻芯锌懈褉邪褬 懈谢懈 芯褌胁芯褉懈 薪芯胁懈 锌褉芯蟹芯褉)
+bookmark_label=孝褉械薪褍褌薪懈 锌褉懈泻邪蟹
+
+# Secondary toolbar and context menu
+tools.title=袗谢邪褌泻械
+tools_label=袗谢邪褌泻械
+first_page.title=袠写懈 薪邪 锌褉胁褍 褋褌褉邪薪懈褑褍
+first_page.label=袠写懈 薪邪 锌褉胁褍 褋褌褉邪薪懈褑褍
+first_page_label=袠写懈 薪邪 锌褉胁褍 褋褌褉邪薪懈褑褍
+last_page.title=袠写懈 薪邪 锌芯褋谢械写褮褍 褋褌褉邪薪懈褑褍
+last_page.label=袠写懈 薪邪 锌芯褋谢械写褮褍 褋褌褉邪薪懈褑褍
+last_page_label=袠写懈 薪邪 锌芯褋谢械写褮褍 褋褌褉邪薪懈褑褍
+page_rotate_cw.title=袪芯褌懈褉邪褬 褍 褋屑械褉褍 泻邪蟹邪褭泻械 薪邪 褋邪褌褍
+page_rotate_cw.label=袪芯褌懈褉邪褬 褍 褋屑械褉褍 泻邪蟹邪褭泻械 薪邪 褋邪褌褍
+page_rotate_cw_label=袪芯褌懈褉邪褬 褍 褋屑械褉褍 泻邪蟹邪褭泻械 薪邪 褋邪褌褍
+page_rotate_ccw.title=袪芯褌懈褉邪褬 褍 褋屑械褉褍 褋褍锌褉芯褌薪芯屑 芯写 泻邪蟹邪褭泻械 薪邪 褋邪褌褍
+page_rotate_ccw.label=袪芯褌懈褉邪褬 褍 褋屑械褉褍 褋褍锌褉芯褌薪芯屑 芯写 泻邪蟹邪褭泻械 薪邪 褋邪褌褍
+page_rotate_ccw_label=袪芯褌懈褉邪褬 褍 褋屑械褉褍 褋褍锌褉芯褌薪芯屑 芯写 泻邪蟹邪褭泻械 薪邪 褋邪褌褍
+
+cursor_text_select_tool.title=袨屑芯谐褍褯懈 邪谢邪褌 蟹邪 褋械谢械泻褌芯胁邪褮械 褌械泻褋褌邪
+cursor_text_select_tool_label=袗谢邪褌 蟹邪 褋械谢械泻褌芯胁邪褮械 褌械泻褋褌邪
+cursor_hand_tool.title=袨屑芯谐褍褯懈 邪谢邪褌 蟹邪 锌芯屑械褉邪褮械
+cursor_hand_tool_label=袗谢邪褌 蟹邪 锌芯屑械褉邪褮械
+
+scroll_vertical.title=袣芯褉懈褋褌懈 胁械褉褌懈泻邪谢薪芯 褋泻褉芯谢芯胁邪褮械
+scroll_vertical_label=袙械褉褌懈泻邪谢薪芯 褋泻褉芯谢芯胁邪褮械
+scroll_horizontal.title=袣芯褉懈褋褌懈 褏芯褉懈蟹芯薪褌邪谢薪芯 褋泻褉芯谢芯胁邪褮械
+scroll_horizontal_label=啸芯褉懈蟹芯薪褌邪谢薪芯 褋泻褉芯谢芯胁邪褮械
+scroll_wrapped.title=袣芯褉懈褋褌懈 褋泻褉芯谢芯胁邪褮械 锌芯 芯屑芯褌褍
+scroll_wrapped_label=小泻褉芯谢芯胁邪褮械 锌芯 芯屑芯褌褍
+
+spread_none.title=袧械屑芯褬 褋锌邪褬邪褌懈 褕懈褉械褮邪 褋褌褉邪薪懈褑邪
+spread_none_label=袘械蟹 褉邪褋锌褉芯褋褌懈褉邪褮邪
+spread_odd.title=小锌芯褬懈 褕懈褉械褮邪 褋褌褉邪薪懈褑邪 泻芯褬械 锌芯褔懈褮褍 薪械锌邪褉薪懈屑 斜褉芯褬械屑
+spread_odd_label=袧械锌邪褉薪邪 褉邪褋锌褉芯褋褌懈褉邪褮邪
+spread_even.title=小锌芯褬懈 褕懈褉械褮邪 褋褌褉邪薪懈褑邪 泻芯褬械 锌芯褔懈褮褍 锌邪褉薪懈屑 斜褉芯褬械屑
+spread_even_label=袩邪褉薪邪 褉邪褋锌褉芯褋褌懈褉邪褮邪
+
+# Document properties dialog box
+document_properties.title=袩邪褉邪屑械褌褉懈 写芯泻褍屑械薪褌邪鈥�
+document_properties_label=袩邪褉邪屑械褌褉懈 写芯泻褍屑械薪褌邪鈥�
+document_properties_file_name=袠屑械 写邪褌芯褌械泻械:
+document_properties_file_size=袙械谢懈褔懈薪邪 写邪褌芯褌械泻械:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} B)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} B)
+document_properties_title=袧邪褋谢芯胁:
+document_properties_author=袗褍褌芯褉:
+document_properties_subject=孝械屑邪:
+document_properties_keywords=袣褭褍褔薪械 褉械褔懈:
+document_properties_creation_date=袛邪褌褍屑 泻褉械懈褉邪褮邪:
+document_properties_modification_date=袛邪褌褍屑 屑芯写懈褎懈泻邪褑懈褬械:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=小褌胁邪褉邪谢邪褑:
+document_properties_producer=PDF 锌褉芯懈蟹胁芯褣邪褔:
+document_properties_version=PDF 胁械褉蟹懈褬邪:
+document_properties_page_count=袘褉芯褬 褋褌褉邪薪懈褑邪:
+document_properties_page_size=袙械谢懈褔懈薪邪 褋褌褉邪薪懈褑械:
+document_properties_page_size_unit_inches=懈薪
+document_properties_page_size_unit_millimeters=屑屑
+document_properties_page_size_orientation_portrait=褍褋锌褉邪胁薪芯
+document_properties_page_size_orientation_landscape=胁芯写芯褉邪胁薪芯
+document_properties_page_size_name_a3=袗3
+document_properties_page_size_name_a4=袗4
+document_properties_page_size_name_letter=小谢芯胁芯
+document_properties_page_size_name_legal=袩褉邪胁邪
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=袘褉蟹 胁械斜 锌褉懈泻邪蟹:
+document_properties_linearized_yes=袛邪
+document_properties_linearized_no=袧械
+document_properties_close=袟邪褌胁芯褉懈
+
+print_progress_message=袩褉懈锌褉械屑邪屑 写芯泻褍屑械薪褌 蟹邪 褕褌邪屑锌邪褮械鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=袨褌泻邪卸懈
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=袩褉懈泻邪卸懈 写芯写邪褌薪褍 锌邪谢械褌褍
+toggle_sidebar_notification.title=袩褉懈泻邪卸懈 写芯写邪褌薪褍 褌褉邪泻褍 (写芯泻褍屑械薪邪褌 褋邪写褉卸懈 芯泻胁懈褉械/锌褉懈谢芯谐械)
+toggle_sidebar_label=袩褉懈泻邪卸懈 写芯写邪褌薪褍 锌邪谢械褌褍
+document_outline.title=袩褉懈泻邪卸懈 泻芯薪褌褍褉褍 写芯泻褍屑械薪褌邪 (写褍锌谢懈 泻谢懈泻 蟹邪 锌褉芯褕懈褉械褮械/褋泻褍锌褭邪褮械 械谢械屑械薪邪褌邪)
+document_outline_label=袣芯薪褌褍褉邪 写芯泻褍屑械薪褌邪
+attachments.title=袩褉懈泻邪卸懈 锌褉懈谢芯谐械
+attachments_label=袩褉懈谢芯蟹懈
+thumbs.title=袩褉懈泻邪卸懈 褋谢懈褔懈褑械
+thumbs_label=小谢懈褔懈褑械
+findbar.title=袩褉芯薪邪褣懈 褍 写芯泻褍屑械薪褌褍
+findbar_label=袩褉芯薪邪褣懈
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=小褌褉邪薪懈褑邪 {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=小谢懈褔懈褑邪 芯写 褋褌褉邪薪懈褑械 {{page}}
+
+# Find panel button title and messages
+find_input.title=袩褉芯薪邪褣懈
+find_input.placeholder=袩褉芯薪邪褣懈 褍 写芯泻褍屑械薪褌褍鈥�
+find_previous.title=袩褉芯薪邪褣懈 锌褉械褌褏芯写薪褍 锌芯褬邪胁褍 褎褉邪蟹械
+find_previous_label=袩褉械褌褏芯写薪邪
+find_next.title=袩褉芯薪邪褣懈 褋谢械写械褯褍 锌芯褬邪胁褍 褎褉邪蟹械
+find_next_label=小谢械写械褯邪
+find_highlight=袠褋褌邪泻薪褍褌懈 褋胁械
+find_match_case_label=袩芯写褍写邪褉邪褮邪
+find_reached_top=袛芯褋褌懈谐薪褍褌 胁褉褏 写芯泻褍屑械薪褌邪, 薪邪褋褌邪胁懈芯 褋邪 写薪邪
+find_reached_bottom=袛芯褋褌懈谐薪褍褌芯 写薪芯 写芯泻褍屑械薪褌邪, 薪邪褋褌邪胁懈芯 褋邪 胁褉褏邪
+find_not_found=肖褉邪蟹邪 薪懈褬械 锌褉芯薪邪褣械薪邪
+
+# Error panel labels
+error_more_info=袙懈褕械 懈薪褎芯褉屑邪褑懈褬邪
+error_less_info=袦邪褮械 懈薪褎芯褉屑邪褑懈褬邪
+error_close=袟邪褌胁芯褉懈
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=袩芯褉褍泻邪: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=小褌械泻: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=袛邪褌芯褌械泻邪: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=袥懈薪懈褬邪: {{line}}
+rendering_error=袛芯褕谢芯 褬械 写芯 谐褉械褕泻械 锌褉懈谢懈泻芯屑 褉械薪写械褉芯胁邪褮邪 芯胁械 褋褌褉邪薪懈褑械.
+
+# Predefined zoom values
+page_scale_width=楔懈褉懈薪邪 褋褌褉邪薪懈褑械
+page_scale_fit=袩褉懈谢邪谐芯写懈 褋褌褉邪薪懈褑褍
+page_scale_auto=袗褍褌芯屑邪褌褋泻芯 褍胁械谢懈褔邪胁邪褮械
+page_scale_actual=小褌胁邪褉薪邪 胁械谢懈褔懈薪邪
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=袚褉械褕泻邪
+loading_error=袛芯褕谢芯 褬械 写芯 谐褉械褕泻械 锌褉懈谢懈泻芯屑 褍褔懈褌邪胁邪褮邪 PDF-邪.
+invalid_file_error=PDF 写邪褌芯褌械泻邪 褬械 芯褕褌械褯械薪邪 懈谢懈 褬械 薪械懈褋锌褉邪胁薪邪.
+missing_file_error=PDF 写邪褌芯褌械泻邪 薪懈褬械 锌褉芯薪邪褣械薪邪.
+unexpected_response_error=袧械芯褔械泻懈胁邪薪 芯写谐芯胁芯褉 芯写 褋械褉胁械褉邪.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} 泻芯屑械薪褌邪褉]
+password_label=校薪械褋懈褌械 谢芯蟹懈薪泻褍 写邪 斜懈褋褌械 芯褌胁芯褉懈谢懈 芯胁邪褬 PDF 写芯泻褍屑械薪邪褌.
+password_invalid=袧械懈褋锌褉邪胁薪邪 谢芯蟹懈薪泻邪. 袩芯泻褍褕邪褬褌械 锌芯薪芯胁芯.
+password_ok=校 褉械写褍
+password_cancel=袨褌泻邪卸懈
+
+printing_not_supported=校锌芯蟹芯褉械褮械: 楔褌邪屑锌邪褮械 薪懈褬械 褍 锌芯褌锌褍薪芯褋褌懈 锌芯写褉卸邪薪芯 褍 芯胁芯屑 锌褉械谐谢械写邪褔褍.
+printing_not_ready=校锌芯蟹芯褉械褮械: PDF 薪懈褬械 褍 锌芯褌锌褍薪芯褋褌懈 褍褔懈褌邪薪 蟹邪 褕褌邪屑锌褍.
+web_fonts_disabled=袙械斜 褎芯薪褌芯胁懈 褋褍 芯薪械屑芯谐褍褯械薪懈: 薪械 屑芯谐褍 泻芯褉懈褋褌懈褌懈 褍谐褉邪褣械薪械 PDF 褎芯薪褌芯胁械.
+document_colors_not_allowed=PDF 写芯泻褍屑械薪褌懈 薪械 屑芯谐褍 写邪 泻芯褉懈褋褌械 褋芯锌褋褌胁械薪械 斜芯褬械: 鈥溞斝拘沸残拘恍� 褋褌褉邪薪懈褑邪屑邪 写邪 懈蟹邪斜械褉褍 褋胁芯褬械 斜芯褬械鈥� 褬械 写械邪泻褌懈胁懈褉邪薪芯 褍 锌褉械谐谢械写邪褔褍.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/sv-SE/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/sv-SE/viewer.properties
new file mode 100644
index 0000000..d0da914
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/sv-SE/viewer.properties
@@ -0,0 +1,242 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=F枚reg氓ende sida
+previous_label=F枚reg氓ende
+next.title=N盲sta sida
+next_label=N盲sta
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=Sida
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=av {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} av {{pagesCount}})
+
+zoom_out.title=Zooma ut
+zoom_out_label=Zooma ut
+zoom_in.title=Zooma in
+zoom_in_label=Zooma in
+zoom.title=Zoom
+presentation_mode.title=Byt till presentationsl盲ge
+presentation_mode_label=Presentationsl盲ge
+open_file.title=脰ppna fil
+open_file_label=脰ppna
+print.title=Skriv ut
+print_label=Skriv ut
+download.title=H盲mta
+download_label=H盲mta
+bookmark.title=Aktuell vy (kopiera eller 枚ppna i nytt f枚nster)
+bookmark_label=Aktuell vy
+
+# Secondary toolbar and context menu
+tools.title=Verktyg
+tools_label=Verktyg
+first_page.title=G氓 till f枚rsta sidan
+first_page.label=G氓 till f枚rsta sidan
+first_page_label=G氓 till f枚rsta sidan
+last_page.title=G氓 till sista sidan
+last_page.label=G氓 till sista sidan
+last_page_label=G氓 till sista sidan
+page_rotate_cw.title=Rotera medurs
+page_rotate_cw.label=Rotera medurs
+page_rotate_cw_label=Rotera medurs
+page_rotate_ccw.title=Rotera moturs
+page_rotate_ccw.label=Rotera moturs
+page_rotate_ccw_label=Rotera moturs
+
+cursor_text_select_tool.title=Aktivera textmarkeringsverktyg
+cursor_text_select_tool_label=Textmarkeringsverktyg
+cursor_hand_tool.title=Aktivera handverktyg
+cursor_hand_tool_label=Handverktyg
+
+scroll_vertical.title=Anv盲nd vertikal rullning
+scroll_vertical_label=Vertikal rullning
+scroll_horizontal.title=Anv盲nd horisontell rullning
+scroll_horizontal_label=Horisontell rullning
+scroll_wrapped.title=Anv盲nd 枚verlappande rullning
+scroll_wrapped_label=脰verlappande rullning
+
+spread_none.title=Visa enkelsidor
+spread_none_label=Enkelsidor
+spread_odd.title=Visa uppslag med olika sidnummer till v盲nster
+spread_odd_label=Uppslag med framsida
+spread_even.title=Visa uppslag med lika sidnummer till v盲nster
+spread_even_label=Uppslag utan framsida
+
+# Document properties dialog box
+document_properties.title=Dokumentegenskaper鈥�
+document_properties_label=Dokumentegenskaper鈥�
+document_properties_file_name=Filnamn:
+document_properties_file_size=Filstorlek:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} kB ({{size_b}} byte)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} byte)
+document_properties_title=Titel:
+document_properties_author=F枚rfattare:
+document_properties_subject=脛mne:
+document_properties_keywords=Nyckelord:
+document_properties_creation_date=Skapades:
+document_properties_modification_date=脛ndrades:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Skapare:
+document_properties_producer=PDF-producent:
+document_properties_version=PDF-version:
+document_properties_page_count=Sidantal:
+document_properties_page_size=Pappersstorlek:
+document_properties_page_size_unit_inches=in
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=portr盲tt
+document_properties_page_size_orientation_landscape=landskap
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Letter
+document_properties_page_size_name_legal=Legal
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=Snabb webbvisning:
+document_properties_linearized_yes=Ja
+document_properties_linearized_no=Nej
+document_properties_close=St盲ng
+
+print_progress_message=F枚rbereder sidor f枚r utskrift鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=Avbryt
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Visa/d枚lj sidof盲lt
+toggle_sidebar_notification.title=Visa/d枚lj sidof盲lt (dokument inneh氓ller 枚versikt/bilagor)
+toggle_sidebar_label=Visa/d枚lj sidof盲lt
+document_outline.title=Visa dokumentdisposition (dubbelklicka f枚r att expandera/komprimera alla objekt)
+document_outline_label=Dokument枚versikt
+attachments.title=Visa Bilagor
+attachments_label=Bilagor
+thumbs.title=Visa miniatyrer
+thumbs_label=Miniatyrer
+findbar.title=S枚k i dokument
+findbar_label=S枚k
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Sida {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Miniatyr av sida {{page}}
+
+# Find panel button title and messages
+find_input.title=S枚k
+find_input.placeholder=S枚k i dokument鈥�
+find_previous.title=Hitta f枚reg氓ende f枚rekomst av frasen
+find_previous_label=F枚reg氓ende
+find_next.title=Hitta n盲sta f枚rekomst av frasen
+find_next_label=N盲sta
+find_highlight=Markera alla
+find_match_case_label=Matcha versal/gemen
+find_entire_word_label=Hela ord
+find_reached_top=N氓dde b枚rjan av dokumentet, b枚rjade fr氓n slutet
+find_reached_bottom=N氓dde slutet p氓 dokumentet, b枚rjade fr氓n b枚rjan
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]={{current}} av {{total}} tr盲ff
+find_match_count[two]={{current}} av {{total}} tr盲ffar
+find_match_count[few]={{current}} av {{total}} tr盲ffar
+find_match_count[many]={{current}} av {{total}} tr盲ffar
+find_match_count[other]={{current}} av {{total}} tr盲ffar
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]=Mer 盲n {{limit}} tr盲ffar
+find_match_count_limit[one]=Mer 盲n {{limit}} tr盲ff
+find_match_count_limit[two]=Mer 盲n {{limit}} tr盲ffar
+find_match_count_limit[few]=Mer 盲n {{limit}} tr盲ffar
+find_match_count_limit[many]=Mer 盲n {{limit}} tr盲ffar
+find_match_count_limit[other]=Mer 盲n {{limit}} tr盲ffar
+find_not_found=Frasen hittades inte
+
+# Error panel labels
+error_more_info=Mer information
+error_less_info=Mindre information
+error_close=St盲ng
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Meddelande: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stack: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Fil: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Rad: {{line}}
+rendering_error=Ett fel uppstod vid visning av sidan.
+
+# Predefined zoom values
+page_scale_width=Sidbredd
+page_scale_fit=Anpassa sida
+page_scale_auto=Automatisk zoom
+page_scale_actual=Verklig storlek
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Fel
+loading_error=Ett fel uppstod vid laddning av PDF-filen.
+invalid_file_error=Ogiltig eller korrupt PDF-fil.
+missing_file_error=Saknad PDF-fil.
+unexpected_response_error=Ov盲ntat svar fr氓n servern.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}}-annotering]
+password_label=Skriv in l枚senordet f枚r att 枚ppna PDF-filen.
+password_invalid=Ogiltigt l枚senord. F枚rs枚k igen.
+password_ok=OK
+password_cancel=Avbryt
+
+printing_not_supported=Varning: Utskrifter st枚ds inte helt av den h盲r webbl盲saren.
+printing_not_ready=Varning: PDF:en 盲r inte klar f枚r utskrift.
+web_fonts_disabled=Webbtypsnitt 盲r inaktiverade: kan inte anv盲nda inb盲ddade PDF-typsnitt.
+document_colors_not_allowed=PDF-dokument till氓ts inte anv盲nda egna f盲rger: 鈥淟氓t sidor anv盲nda egna f盲rger鈥� 盲r inaktiverat i webbl盲saren.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/sw/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/sw/viewer.properties
new file mode 100644
index 0000000..9ec4e21
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/sw/viewer.properties
@@ -0,0 +1,128 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Ukurasa Uliotangulia
+previous_label=Iliyotangulia
+next.title=Ukurasa Ufuatao
+next_label=Ifuatayo
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+
+zoom_out.title=Kuza Nje
+zoom_out_label=Kuza Nje
+zoom_in.title=Kuza Ndani
+zoom_in_label=Kuza Ndani
+zoom.title=Kuza
+presentation_mode.title=Badili kwa Hali ya Uwasilishaji
+presentation_mode_label=Hali ya Uwasilishaji
+open_file.title=Fungua Faili
+open_file_label=Fungua
+print.title=Chapisha
+print_label=Chapisha
+download.title=Pakua
+download_label=Pakua
+bookmark.title=Mwonekano wa sasa (nakili au ufungue katika dirisha mpya)
+bookmark_label=Mwonekano wa Sasa
+
+# Secondary toolbar and context menu
+
+
+# Document properties dialog box
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_title=Kichwa:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Kibiano cha Upau wa Kando
+toggle_sidebar_label=Kibiano cha Upau wa Kando
+document_outline_label=Ufupisho wa Waraka
+thumbs.title=Onyesha Kijipicha
+thumbs_label=Vijipicha
+findbar.title=Pata katika Waraka
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Ukurasa {{ukurasa}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Kijipicha cha ukurasa {{ukurasa}}
+
+# Find panel button title and messages
+find_previous.title=Tafuta tukio kabla ya msemo huu
+find_previous_label=Iliyotangulia
+find_next.title=Tafuta tukio linalofuata la msemo
+find_next_label=Ifuatayo
+find_highlight=Angazia yote
+find_match_case_label=Linganisha herufi
+find_reached_top=Imefika juu ya waraka, imeendelea kutoka chini
+find_reached_bottom=Imefika mwisho wa waraka, imeendelea kutoka juu
+find_not_found=Msemo hukupatikana
+
+# Error panel labels
+error_more_info=Maelezo Zaidi
+error_less_info=Maelezo Kidogo
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (jenga: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Ujumbe: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Panganya: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Faili: {{faili}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Laini: {{laini}}
+rendering_error=Hitilafu lilitokea wajati wa kutoa ukurasa
+
+# Predefined zoom values
+page_scale_width=Upana wa Ukurasa
+page_scale_fit=Usawa wa Ukurasa
+page_scale_auto=Ukuzaji wa Kiotomatiki
+page_scale_actual=Ukubwa Halisi
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+
+# Loading indicator messages
+loading_error_indicator=Hitilafu
+loading_error=Hitilafu lilitokea wakati wa kupakia PDF.
+invalid_file_error=Faili ya PDF isiyohalali au potofu.
+missing_file_error=Faili ya PDF isiyopo.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Ufafanuzi]
+password_ok=SAWA
+
+printing_not_supported=Onyo: Uchapishaji hauauniwi kabisa kwa kivinjari hiki.
+web_fonts_disabled=Fonti za tovuti zimelemazwa: haziwezi kutumia fonti za PDF zilizopachikwa.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ta-LK/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ta-LK/viewer.properties
new file mode 100644
index 0000000..f0b1f43
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ta-LK/viewer.properties
@@ -0,0 +1,77 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+
+zoom.title=喈呧喈掂瘉
+open_file.title=喈曕瘚喈瘝喈喈┼瘓喈む瘝 喈む喈编畷喁嵿畷
+open_file_label=喈む喈编畷喁嵿畷
+
+# Secondary toolbar and context menu
+
+
+# Document properties dialog box
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+
+# Find panel button title and messages
+find_previous.title=喈囙喁嵿 喈氞瘖喈编瘝喈编瘖喈熰喈苦喁� 喈瘉喈┼瘝喈┼瘓喈� 喈ㄠ喈曕喁嵿喁� 喈む瘒喈熰瘉
+find_next.title=喈囙喁嵿 喈氞瘖喈编瘝喈编瘖喈熰喈苦喁� 喈呧疅喁佮喁嵿 喈ㄠ喈曕喁嵿喁堗喁� 喈む瘒喈熰瘉
+
+# Error panel labels
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+
+# Predefined zoom values
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+
+# Loading indicator messages
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+password_ok=喈嗋喁�
+
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ta/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ta/viewer.properties
new file mode 100644
index 0000000..19a8de4
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ta/viewer.properties
@@ -0,0 +1,201 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=喈瘉喈ㄠ瘝喈む瘓喈� 喈畷喁嵿畷喈瘝
+previous_label=喈瘉喈ㄠ瘝喈む瘓喈喁�
+next.title=喈呧疅喁佮喁嵿 喈畷喁嵿畷喈瘝
+next_label=喈呧疅喁佮喁嵿喁�
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=喈畷喁嵿畷喈瘝
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages={{pagesCount}} 喈囙喁�
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages={{pagesCount}}) 喈囙喁� ({{pageNumber}}
+
+zoom_out.title=喈氞喈编喈む喈曕瘝喈曕瘉
+zoom_out_label=喈氞喈编喈む喈曕瘝喈曕瘉
+zoom_in.title=喈瘑喈班喈む喈曕瘝喈曕瘉
+zoom_in_label=喈瘑喈班喈む喈曕瘝喈曕瘉
+zoom.title=喈瘑喈班喈む喈曕瘝喈曕瘉
+presentation_mode.title=喈掂喈赤畷喁嵿畷喈曕喈熰瘝喈氞 喈喈┼瘝喈瘉喈编瘓喈曕瘝喈曕瘉 喈喈编瘉
+presentation_mode_label=喈掂喈赤畷喁嵿畷喈曕喈熰瘝喈氞 喈喈┼瘝喈瘉喈编瘓
+open_file.title=喈曕瘚喈瘝喈喈┼瘓 喈む喈�
+open_file_label=喈む喈�
+print.title=喈呧畾喁嵿畾喈苦疅喁�
+print_label=喈呧畾喁嵿畾喈苦疅喁�
+download.title=喈喈苦喈苦喈曕瘝喈曕瘉
+download_label=喈喈苦喈苦喈曕瘝喈曕瘉
+bookmark.title=喈む喁嵿喁嬥喁堗 喈曕喈熰瘝喈氞 (喈瘉喈む喈� 喈氞喈赤喈む瘝喈む喈编瘝喈曕瘉 喈ㄠ畷喈侧瘑喈熰瘉 喈呧喁嵿喈む瘉 喈瘉喈む喈� 喈氞喈赤喈む瘝喈む喈侧瘝 喈む喈�)
+bookmark_label=喈む喁嵿喁嬥喁堗 喈曕喈熰瘝喈氞
+
+# Secondary toolbar and context menu
+tools.title=喈曕喁佮喈苦畷喈赤瘝
+tools_label=喈曕喁佮喈苦畷喈赤瘝
+first_page.title=喈瘉喈む喁� 喈畷喁嵿畷喈む瘝喈む喈编瘝喈曕瘉 喈氞瘑喈侧瘝喈侧喁佮喁�
+first_page.label=喈瘉喈む喁� 喈畷喁嵿畷喈む瘝喈む喈编瘝喈曕瘉 喈氞瘑喈侧瘝喈侧喁佮喁�
+first_page_label=喈瘉喈む喁� 喈畷喁嵿畷喈む瘝喈む喈编瘝喈曕瘉 喈氞瘑喈侧瘝喈侧喁佮喁�
+last_page.title=喈曕疅喁堗畾喈� 喈畷喁嵿畷喈む瘝喈む喈编瘝喈曕瘉 喈氞瘑喈侧瘝喈侧喁佮喁�
+last_page.label=喈曕疅喁堗畾喈� 喈畷喁嵿畷喈む瘝喈む喈编瘝喈曕瘉 喈氞瘑喈侧瘝喈侧喁佮喁�
+last_page_label=喈曕疅喁堗畾喈� 喈畷喁嵿畷喈む瘝喈む喈编瘝喈曕瘉 喈氞瘑喈侧瘝喈侧喁佮喁�
+page_rotate_cw.title=喈掂喈炧瘝喈氞瘉喈脆喈喈� 喈氞瘉喈脆喁嵿喁�
+page_rotate_cw.label=喈掂喈炧瘝喈氞瘉喈脆喈喈� 喈氞瘉喈脆喁嵿喁�
+page_rotate_cw_label=喈掂喈炧瘝喈氞瘉喈脆喈喈� 喈氞瘉喈脆喁嵿喁�
+page_rotate_ccw.title=喈囙疅喈炧瘝喈氞瘉喈脆喈喈� 喈氞瘉喈脆喁嵿喁�
+page_rotate_ccw.label=喈囙疅喈炧瘝喈氞瘉喈脆喈喈� 喈氞瘉喈脆喁嵿喁�
+page_rotate_ccw_label=喈囙疅喈炧瘝喈氞瘉喈脆喈喈� 喈氞瘉喈脆喁嵿喁�
+
+cursor_text_select_tool.title=喈夃喁堗喁� 喈む瘑喈班喈掂瘉 喈曕喁佮喈苦喁堗畾喁� 喈氞瘑喈喁嵿喈熰瘉喈む瘝喈む瘉
+cursor_text_select_tool_label=喈夃喁堗喁� 喈む瘑喈班喈掂瘉 喈曕喁佮喈�
+cursor_hand_tool.title=喈曕瘓喈曕瘝 喈曕喁佮喈苦畷喁嵿畾喁� 喈氞瘑喈喁嵿喈熰瘉喈む瘝喈む瘉
+cursor_hand_tool_label=喈曕瘓喈曕瘝喈曕瘉喈班瘉喈掂
+
+# Document properties dialog box
+document_properties.title=喈嗋喈� 喈喁嵿喁佮畷喈赤瘝...
+document_properties_label=喈嗋喈� 喈喁嵿喁佮畷喈赤瘝...
+document_properties_file_name=喈曕瘚喈瘝喈瘉 喈瘑喈喁�:
+document_properties_file_size=喈曕瘚喈瘝喈喈┼瘝 喈呧喈掂瘉:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} 喈曕喈瘓 ({{size_b}} 喈瘓喈熰瘝喈熰瘉喈曕喁�)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} 喈瘑喈瘓 ({{size_b}} 喈瘓喈熰瘝喈熰瘉喈曕喁�)
+document_properties_title=喈む喁堗喁嵿喁�:
+document_properties_author=喈庎喁佮喈苦喈掂喁�
+document_properties_subject=喈瘖喈班瘉喈赤瘝:
+document_properties_keywords=喈瘉喈曕瘝喈曕喈� 喈掂喈班瘝喈む瘝喈む瘓喈曕喁�:
+document_properties_creation_date=喈疅喁堗喁嵿 喈む瘒喈む :
+document_properties_modification_date=喈む喈班瘉喈む瘝喈む喈� 喈む瘒喈む:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=喈夃喁佮喈距畷喁嵿畷喁佮喈掂喁�:
+document_properties_producer=喈喈熰喈庎畠喈瘝 喈む喈距喈苦喁嵿喈距喈班瘝:
+document_properties_version=PDF 喈喈苦喁嵿喁�:
+document_properties_page_count=喈畷喁嵿畷 喈庎喁嵿喈苦畷喁嵿畷喁�:
+document_properties_page_size=喈畷喁嵿畷 喈呧喈掂瘉:
+document_properties_page_size_unit_inches=喈囙喈苦喁�
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=喈ㄠ喈侧瘓喈喈苦喁嵿喁�
+document_properties_page_size_orientation_landscape=喈ㄠ喈侧瘓喈喈瘝喈瘉
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=喈曕疅喈苦喈瘝
+document_properties_page_size_name_legal=喈氞疅喁嵿疅喈瘋喈班瘝喈�
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+document_properties_close=喈瘋喈熰瘉喈�
+
+print_progress_message=喈呧畾喁嵿畾喈苦疅喁佮喈む喁嵿畷喈距 喈嗋喈`喁� 喈む喈距喈距畷喈苦喈む瘉...
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=喈班喁嵿喁�
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=喈畷喁嵿畷喈瘝 喈疅喁嵿疅喈苦喁� 喈ㄠ喈侧瘓喈喈编瘝喈编瘉
+toggle_sidebar_notification.title=喈畷喁嵿畷喈瘝喈疅喁嵿疅喁堗喁� 喈ㄠ喈侧瘓喈喈编瘝喈编瘉 (喈掂瘑喈赤喈曕瘝喈曕瘚喈熰瘉/喈囙喁堗喁嵿喁佮畷喈赤瘓 喈嗋喈`喁� 喈曕瘖喈`瘝喈熰瘉喈赤瘝喈赤喁�)
+toggle_sidebar_label=喈畷喁嵿畷喈瘝 喈疅喁嵿疅喈苦喁� 喈ㄠ喈侧瘓喈喈编瘝喈编瘉
+document_outline.title=喈嗋喈� 喈呧疅喈曕瘝喈曕喁嵿喁堗畷喁� 喈曕喈熰瘝喈熰瘉 (喈囙喁佮喁佮喁堗畾喁� 喈氞瘖喈熰瘉喈曕瘝喈曕 喈呧喁堗喁嵿喁� 喈夃喁佮喁嵿喈苦疅喈苦畷喈赤瘓喈瘉喈瘝 喈掂喈班/喈氞瘒喈班瘝)
+document_outline_label=喈嗋喈� 喈掂瘑喈赤喈掂喁�
+attachments.title=喈囙喁堗喁嵿喁佮畷喈赤瘓 喈曕喈`瘝喈
+attachments_label=喈囙喁堗喁嵿喁佮畷喈赤瘝
+thumbs.title=喈氞喈编瘉喈疅喈權瘝喈曕喁堗畷喁� 喈曕喈`瘝喈
+thumbs_label=喈氞喈编瘉喈疅喈權瘝喈曕喁�
+findbar.title=喈嗋喈`喁嵿喈苦喁� 喈曕喁嵿疅喈编
+findbar_label=喈む瘒喈熰瘉
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=喈畷喁嵿畷喈瘝 {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=喈畷喁嵿畷喈む瘝喈む喈┼瘝 喈氞喈编瘉喈疅喈瘝 {{page}}
+
+# Find panel button title and messages
+find_input.title=喈曕喁嵿疅喁佮喈苦疅喈�
+find_input.placeholder=喈嗋喈`喁嵿喈苦喁� 喈曕喁嵿疅喈编鈥�
+find_previous.title=喈囙喁嵿 喈氞瘖喈编瘝喈编瘖喈熰喈苦喁� 喈瘉喈ㄠ瘝喈む瘓喈� 喈ㄠ喈曕喁嵿喁� 喈む瘒喈熰瘉
+find_previous_label=喈瘉喈ㄠ瘝喈む瘓喈喁�
+find_next.title=喈囙喁嵿 喈氞瘖喈编瘝喈编瘖喈熰喈苦喁� 喈呧疅喁佮喁嵿 喈ㄠ喈曕喁嵿喁� 喈む瘒喈熰瘉
+find_next_label=喈呧疅喁佮喁嵿喁�
+find_highlight=喈呧喁堗喁嵿喁堗喁佮喁� 喈む喈苦喁嵿喈熰瘉喈む瘝喈む瘉
+find_match_case_label=喈瘒喈班瘑喈脆瘉喈む瘝喈む喈曕瘝喈曕喁嵿喁� 喈夃喈班瘝
+find_reached_top=喈嗋喈`喁嵿喈苦喁� 喈瘒喈侧瘝 喈畷喁佮喈苦喁� 喈呧疅喁堗喁嵿喈む瘉, 喈呧疅喈苦喁嵿喈曕瘝喈曕喁嵿喈苦喈苦喁佮喁嵿喁� 喈む瘖喈熰喁嵿喁嵿喈む瘉
+find_reached_bottom=喈嗋喈`喁嵿喈苦喁� 喈瘉喈熰喈掂瘓 喈呧疅喁堗喁嵿喈む瘉, 喈瘒喈侧喈班瘉喈ㄠ瘝喈む瘉 喈む瘖喈熰喁嵿喁嵿喈む瘉
+find_not_found=喈氞瘖喈编瘝喈编瘖喈熰喁� 喈曕喈`喈苦喁嵿喁�
+
+# Error panel labels
+error_more_info=喈曕瘋喈熰瘉喈む喁� 喈む畷喈掂喁�
+error_less_info=喈曕瘉喈编瘓喈ㄠ瘝喈� 喈む畷喈掂喁�
+error_close=喈瘋喈熰瘉喈�
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=喈氞瘑喈瘝喈む: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=喈膏瘝喈熰瘒喈曕瘝: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=喈曕瘚喈瘝喈瘉: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=喈掂喈�: {{line}}
+rendering_error=喈囙喁嵿喈瘝 喈畷喁嵿畷喈む瘝喈む瘓 喈曕喈熰瘝喈氞喈瘝喈疅喁佮喁嵿喁佮喁� 喈瘚喈む瘉 喈掄喁� 喈喈脆瘓 喈忇喁嵿喈熰瘝喈熰喁�.
+
+# Predefined zoom values
+page_scale_width=喈畷喁嵿畷 喈呧畷喈侧喁�
+page_scale_fit=喈畷喁嵿畷喈瘝 喈瘖喈班瘉喈む瘝喈む喁�
+page_scale_auto=喈む喈┼喈畷喁嵿畷 喈瘑喈班喈む喈曕瘝喈曕喁�
+page_scale_actual=喈夃喁嵿喁堗喈距 喈呧喈掂瘉
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=喈喈脆瘓
+loading_error=PDF 喈� 喈忇喁嵿喁佮喁� 喈瘚喈む瘉 喈掄喁� 喈喈脆瘓 喈忇喁嵿喈熰瘝喈熰喁�.
+invalid_file_error=喈氞瘑喈侧瘝喈侧瘉喈疅喈苦喈距畷喈距 喈呧喁嵿喈む瘉 喈氞喈む瘓喈ㄠ瘝喈� PDF 喈曕瘚喈瘝喈瘉.
+missing_file_error=PDF 喈曕瘚喈瘝喈瘉 喈曕喈`喈苦喁嵿喁�.
+unexpected_response_error=喈氞瘒喈掂畷喈┼瘝 喈喈苦喁� 喈庎喈苦喁嵿喈距喈む喁�.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} 喈掂喈赤畷喁嵿畷喈瘝]
+password_label=喈囙喁嵿 PDF 喈曕瘒喈距喁嵿喁� 喈む喈编畷喁嵿畷 喈曕疅喈掂瘉喈氞瘝喈氞瘑喈距喁嵿喁� 喈夃喁嵿喈苦疅喈掂瘉喈瘝.
+password_invalid=喈氞瘑喈侧瘝喈侧瘉喈疅喈苦喈距畷喈距 喈曕疅喈掂瘉喈氞瘝喈氞瘖喈侧瘝, 喈む喁� 喈氞瘑喈瘝喈む瘉 喈瘈喈`瘝喈熰瘉喈瘝 喈瘉喈喁嵿畾喈� 喈氞瘑喈瘝喈�.
+password_ok=喈氞喈�
+password_cancel=喈班喁嵿喁�
+
+printing_not_supported=喈庎畾喁嵿畾喈班喈曕瘝喈曕瘓: 喈囙喁嵿 喈夃喈距喈� 喈呧畾喁嵿畾喈苦疅喁佮喈侧瘓 喈瘉喈脆瘉喈瘓喈喈� 喈嗋喈班喈曕瘝喈曕喈苦喁嵿喁�.
+printing_not_ready=喈庎畾喁嵿畾喈班喈曕瘝喈曕瘓: PDF 喈呧畾喁嵿畾喈苦疅 喈瘉喈脆瘉喈掂喁佮喈距畷 喈忇喁嵿喈瘝喈疅喈掂喈侧瘝喈侧瘓.
+web_fonts_disabled=喈掂喁� 喈庎喁佮喁嵿喁佮喁佮畷喁嵿畷喈赤瘝 喈瘉喈熰畷喁嵿畷喈瘝喈疅喁嵿疅喁佮喁嵿喈�: 喈夃疅喁嵿喁娻喈苦畷喁嵿畷喈瘝喈疅喁嵿疅 PDF 喈庎喁佮喁嵿喁佮喁佮畷喁嵿畷喈赤瘓喈瘝 喈喈┼瘝喈疅喁佮喁嵿 喈瘉喈熰喈喈苦喁嵿喁�.
+document_colors_not_allowed=PDF 喈嗋喈`畽喁嵿畷喈赤瘉喈曕瘝喈曕瘉喈氞瘝 喈氞瘖喈ㄠ瘝喈� 喈ㄠ喈编畽喁嵿畷喈赤瘓喈瘝 喈喈┼瘝喈疅喁佮喁嵿 喈呧喁佮喈む喈喈侧瘝喈侧瘓: 喈夃喈距喈苦喈苦喁� "喈畷喁嵿畷喈權瘝喈曕喁� 喈む畽喁嵿畷喈赤瘝 喈氞瘖喈ㄠ瘝喈� 喈ㄠ喈编畽喁嵿畷喈赤瘓喈む瘝 喈む瘒喈班瘝喈掂瘉 喈氞瘑喈瘝喈む瘉喈曕瘖喈赤瘝喈� 喈呧喁佮喈む" 喈庎喁嵿喁佮喁� 喈掂喈班瘉喈瘝喈喁� 喈瘉喈熰畷喁嵿畷喈瘝喈疅喁嵿疅喁佮喁嵿喈む瘉.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/te/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/te/viewer.properties
new file mode 100644
index 0000000..7b269a1
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/te/viewer.properties
@@ -0,0 +1,213 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=喟眮喟ㄠ眮喟盁喟� 喟眹喟溹眬
+previous_label=喟曕睄喟班翱喟む皞
+next.title=喟む鞍啾佮暗喟距挨 喟眹喟溹眬
+next_label=喟む鞍啾佮暗喟距挨
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=喟眹喟溹眬
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=喟眾喟む睄喟む皞 {{pagesCount}} 喟侧眿
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=(喟眾喟む睄喟む皞 {{pagesCount}} 喟侧眿 {{pageNumber}}喟掂唉喟�)
+
+zoom_out.title=喟溹眰喟睄 喟む皸啾嵿皸喟苦皞喟氞眮
+zoom_out_label=喟溹眰喟睄 喟む皸啾嵿皸喟苦皞喟氞眮
+zoom_in.title=喟溹眰喟睄 喟氞眹喟翱
+zoom_in_label=喟溹眰喟睄 喟氞眹喟翱
+zoom.title=喟溹眰喟睄
+presentation_mode.title=喟睄喟班唉喟班睄喟多皑喟� 喟班眬喟む翱喟曕翱 喟熬喟班眮
+presentation_mode_label=喟睄喟班唉喟班睄喟多皑喟� 喟班眬喟む翱
+open_file.title=喟眻喟侧睄 喟む眴喟班眮喟掂眮
+open_file_label=喟む眴喟班眮喟掂眮
+print.title=喟眮喟︵睄喟班翱喟傕皻啾�
+print_label=喟眮喟︵睄喟班翱喟傕皻啾�
+download.title=喟︵翱喟傕蔼啾佮皶啾嬥俺啾嵿俺啾�
+download_label=喟︵翱喟傕蔼啾佮皶啾嬥俺啾嵿俺啾�
+bookmark.title=喟睄喟班案啾嵿挨啾佮挨 喟︵鞍啾嵿岸喟ㄠ皞 (喟曕熬喟眬 喟氞眹喟翱 喟侧眹喟︵熬 喟曕眾喟む睄喟� 喟掂翱喟傕啊啾嬥安啾� 喟む眴喟班眮喟掂眮)
+bookmark_label=喟睄喟班案啾嵿挨啾佮挨 喟︵鞍啾嵿岸喟ㄠ皞
+
+# Secondary toolbar and context menu
+tools.title=喟皑喟苦爱啾佮盁啾嵿安啾�
+tools_label=喟皑喟苦爱啾佮盁啾嵿安啾�
+first_page.title=喟眾喟︵盁喟� 喟眹喟溹眬喟曕翱 喟掂眴喟赤睄喟赤眮
+first_page.label=喟眾喟︵盁喟� 喟眹喟溹眬喟曕翱 喟掂眴喟赤睄喟赤眮
+first_page_label=喟眾喟︵盁喟� 喟眹喟溹眬喟曕翱 喟掂眴喟赤睄喟赤眮
+last_page.title=喟氞翱喟掂鞍喟� 喟眹喟溹眬喟曕翱 喟掂眴喟赤睄喟赤眮
+last_page.label=喟氞翱喟掂鞍喟� 喟眹喟溹眬喟曕翱 喟掂眴喟赤睄喟赤眮
+last_page_label=喟氞翱喟掂鞍喟� 喟眹喟溹眬喟曕翱 喟掂眴喟赤睄喟赤眮
+page_rotate_cw.title=喟膏暗啾嵿隘喟︵翱喟多安啾� 喟む翱喟睄喟眮
+page_rotate_cw.label=喟膏暗啾嵿隘喟︵翱喟多安啾� 喟む翱喟睄喟眮
+page_rotate_cw_label=喟膏暗啾嵿隘喟︵翱喟多安啾� 喟む翱喟睄喟眮
+page_rotate_ccw.title=喟呧蔼喟膏暗啾嵿隘喟︵翱喟多安啾� 喟む翱喟睄喟眮
+page_rotate_ccw.label=喟呧蔼喟膏暗啾嵿隘喟︵翱喟多安啾� 喟む翱喟睄喟眮
+page_rotate_ccw_label=喟呧蔼喟膏暗啾嵿隘喟︵翱喟多安啾� 喟む翱喟睄喟眮
+
+cursor_text_select_tool.title=喟熰眴喟曕睄喟膏睄喟熰睄 喟庎皞喟翱喟� 喟膏熬喟о皑喟距皑啾嵿皑喟� 喟睄喟班熬喟班皞喟翱喟傕皻喟傕啊喟�
+cursor_text_select_tool_label=喟熰眴喟曕睄喟膏睄喟熰睄 喟庎皞喟翱喟� 喟膏熬喟о皑喟�
+cursor_hand_tool.title=喟氞眹喟む翱 喟膏熬喟о皑喟� 喟氞眹喟む皑喟苦皞喟氞眮
+cursor_hand_tool_label=喟氞眹喟む翱 喟膏熬喟о皑喟�
+
+scroll_vertical_label=喟ㄠ翱喟侧眮喟掂眮 喟膏睄喟曕睄喟班眿喟侧翱喟傕皸啾�
+
+
+# Document properties dialog box
+document_properties.title=喟挨啾嵿鞍喟眮 喟侧皶啾嵿胺喟`熬喟侧眮...
+document_properties_label=喟挨啾嵿鞍喟眮 喟侧皶啾嵿胺喟`熬喟侧眮...
+document_properties_file_name=喟︵案啾嵿挨啾嵿鞍喟� 喟眹喟班眮:
+document_properties_file_size=喟︵案啾嵿挨啾嵿鞍喟� 喟鞍喟苦爱喟距埃喟�:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=喟多眬喟班睄喟粪翱喟�:
+document_properties_author=喟眰喟侧皶喟班睄喟�:
+document_properties_subject=喟掂翱喟粪隘喟�:
+document_properties_keywords=喟曕眬 喟唉喟距安啾�:
+document_properties_creation_date=喟膏眱喟粪睄喟熰翱喟傕皻喟苦皑 喟む眹喟︵眬:
+document_properties_modification_date=喟膏暗喟班翱喟傕皻喟苦皑 喟む眹喟︵眬:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=喟膏眱喟粪睄喟熰翱喟曕鞍啾嵿挨:
+document_properties_producer=PDF 喟夃挨啾嵿蔼喟距唉喟曕翱:
+document_properties_version=PDF 喟掂鞍啾嵿胺喟ㄠ睄:
+document_properties_page_count=喟眹喟溹眬喟� 喟膏皞喟栢睄喟�:
+document_properties_page_size=喟曕熬喟椸翱喟む皞 喟鞍喟苦爱喟距埃喟�:
+document_properties_page_size_unit_inches=喟侧眿
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=喟ㄠ翱喟侧眮喟掂眮喟氞翱喟む睄喟班皞
+document_properties_page_size_orientation_landscape=喟呧啊啾嵿啊喟氞翱喟む睄喟班皞
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=喟侧眹喟�
+document_properties_page_size_name_legal=喟氞盁啾嵿盁喟鞍喟眴啾栢皑
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized_yes=喟呧暗啾佮皑啾�
+document_properties_linearized_no=喟曕熬喟︵眮
+document_properties_close=喟眰喟膏翱喟掂眹喟翱
+
+print_progress_message=喟眮喟︵睄喟班翱喟傕皻喟∴熬喟ㄠ翱喟曕翱 喟挨啾嵿鞍喟眮 喟膏翱喟︵睄喟о爱喟掂眮喟む眮喟ㄠ睄喟ㄠ唉喟库��
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=喟班唉啾嵿唉啾佮皻啾囙隘喟�
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=喟皶啾嵿皶喟盁啾嵿盁啾� 喟熬喟班睄喟氞眮
+toggle_sidebar_label=喟皶啾嵿皶喟盁啾嵿盁啾� 喟熬喟班睄喟氞眮
+document_outline.title=喟挨啾嵿鞍喟眮 喟班眰喟爱啾� 喟氞眰喟翱喟傕皻啾� (喟∴艾啾佮安啾� 喟曕睄喟侧翱喟曕睄 喟氞眹喟膏翱 喟呧皑啾嵿皑喟� 喟呧皞喟多熬喟侧皑啾� 喟掂翱喟膏睄喟む鞍喟苦皞喟氞眮/喟曕眰喟侧睄喟氞眮)
+document_outline_label=喟挨啾嵿鞍喟眮 喟呧暗啾佮盁啾嶁�屶安啾堗皑啾�
+attachments.title=喟呧皑啾佮艾喟傕哀喟距安啾� 喟氞眰喟眮
+attachments_label=喟呧皑啾佮艾喟傕哀喟距安啾�
+thumbs.title=喟ム皞喟睄鈥屶皑啾堗安啾嵿案啾� 喟氞眰喟眮
+thumbs_label=喟ム皞喟睄鈥屶皑啾堗安啾嵿案啾�
+findbar.title=喟挨啾嵿鞍喟眮喟侧眿 喟曕皑啾佮皸啾娻皑啾佮爱啾�
+findbar_label=喟曕皑啾佮皸啾娻皑啾�
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=喟眹喟溹眬 {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas={{page}} 喟眹喟溹眬 喟ㄠ皷喟氞翱喟む睄喟班皞
+
+# Find panel button title and messages
+find_input.title=喟曕皑啾佮皸啾娻皑啾�
+find_input.placeholder=喟挨啾嵿鞍喟眮喟侧眿 喟曕皑啾佮皸啾娻皑啾佲��
+find_previous.title=喟唉喟� 喟眾喟曕睄喟� 喟眮喟傕唉啾� 喟膏皞喟暗喟距皑啾嵿皑喟� 喟曕皑啾佮皸啾娻皑啾�
+find_previous_label=喟眮喟ㄠ眮喟盁喟�
+find_next.title=喟唉喟� 喟眾喟曕睄喟� 喟む鞍啾嵿暗喟距挨喟� 喟膏皞喟暗喟距皑啾嵿皑喟� 喟曕皑啾佮皸啾娻皑啾�
+find_next_label=喟む鞍啾佮暗喟距挨
+find_highlight=喟呧皑啾嵿皑喟苦盁喟苦皑喟� 喟夃唉啾嵿唉啾�喟皑喟� 喟氞眹喟眮喟眮
+find_match_case_label=喟呧皶啾嵿胺喟班爱啾佮安 喟む眹喟∴熬喟む眿 喟眿喟侧睄喟氞眮
+find_entire_word_label=喟眰喟班睄喟む翱 喟唉喟距安啾�
+find_reached_top=喟眹喟溹眬 喟眻喟曕翱 喟氞眹喟班眮喟曕眮喟ㄠ睄喟ㄠ唉喟�, 喟曕睄喟班翱喟傕唉喟� 喟ㄠ眮喟傕啊喟� 喟曕眾喟ㄠ案喟距皸喟苦皞喟氞皞喟∴翱
+find_reached_bottom=喟眹喟溹眬 喟氞翱喟掂鞍喟曕眮 喟氞眹喟班眮喟曕眮喟ㄠ睄喟ㄠ唉喟�, 喟眻喟ㄠ眮喟傕啊喟� 喟曕眾喟ㄠ案喟距皸喟苦皞喟氞皞喟∴翱
+# LOCALIZATION NOTE (find_matches_count): "{{current}}" and "{{total}}" will be
+# replaced by a number representing the index of the currently active find result,
+# respectively a number representing the total number of matches in the document.
+# LOCALIZATION NOTE (find_matches_count_limit): "{{limit}}" will be replaced by
+# a numerical value.
+find_not_found=喟唉喟皞喟о皞 喟曕皑喟啊喟侧眹喟︵眮
+
+# Error panel labels
+error_more_info=喟鞍喟苦皞喟� 喟膏爱喟距皻喟距鞍喟�
+error_less_info=喟む皶啾嵿皶啾佮暗 喟膏爱喟距皻喟距鞍喟�
+error_close=喟眰喟膏翱喟掂眹喟翱
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=喟膏皞喟︵眹喟多皞: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=喟膏睄喟熰熬喟曕睄: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=喟眻喟侧眮: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=喟掂鞍啾佮案: {{line}}
+rendering_error=喟眹喟溹眬喟ㄠ眮 喟班眴喟傕啊喟班睄 喟氞眹喟眮喟熰安啾� 喟掄皶 喟︵眿喟粪皞 喟庎唉啾佮鞍啾堗皞喟︵翱.
+
+# Predefined zoom values
+page_scale_width=喟眹喟溹眬 喟掂眴喟∴安啾嵿蔼啾�
+page_scale_fit=喟眹喟溹眬 喟呧爱喟班睄喟眮
+page_scale_auto=喟膏睄喟掂隘喟傕皻喟距安喟� 喟溹眰喟睄
+page_scale_actual=喟哎喟距鞍啾嵿哀 喟鞍喟苦爱喟距埃喟�
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=喟︵眿喟粪皞
+loading_error=PDF 喟侧眿喟∴暗啾佮皻啾佮皑啾嵿皑喟睄喟眮喟∴眮 喟掄皶 喟︵眿喟粪皞 喟庎唉啾佮鞍啾堗皞喟︵翱.
+invalid_file_error=喟氞眴喟侧睄喟侧皑喟� 喟侧眹喟︵熬 喟熬喟∴眻喟� PDF 喟眻喟侧眮.
+missing_file_error=喟︵眾喟班皶喟ㄠ翱 PDF 喟眻喟侧眮.
+unexpected_response_error=喟呧皑啾佮皶啾嬥皑喟� 喟膏鞍啾嵿暗喟班睄 喟膏睄喟皞喟︵皑.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} 喟熰眬喟曕熬]
+password_label=喟� PDF 喟眻喟侧睄 喟む眴喟班眮喟氞眮喟熰皶啾� 喟膏皞喟曕眹喟む蔼喟︵皞 喟睄喟班暗啾囙岸喟眴喟熰睄喟熰眮喟眮.
+password_invalid=喟膏皞喟曕眹喟む蔼喟︵皞 喟氞眴喟侧睄喟侧唉啾�. 喟︵隘喟氞眹喟膏翱 喟俺啾嵿俺啾� 喟睄喟班隘喟む睄喟ㄠ翱喟傕皻喟傕啊喟�.
+password_ok=喟膏鞍啾�
+password_cancel=喟班唉啾嵿唉啾佮皻啾囙隘喟�
+
+printing_not_supported=喟灌眴喟氞睄喟氞鞍喟苦皶: 喟� 喟掂翱喟灌熬喟班翱喟`翱 喟氞眹喟� 喟眮喟︵睄喟班埃 喟眰喟班睄喟む翱喟椸熬 喟む眿喟∴睄喟熬喟熰眮 喟侧眹喟︵眮.
+printing_not_ready=喟灌眴喟氞睄喟氞鞍喟苦皶: 喟眮喟︵睄喟班埃 喟曕眾喟班皶啾� 喟� PDF 喟眰喟班睄喟む翱喟椸熬 喟侧眿喟∴暗喟侧眹喟︵眮.
+web_fonts_disabled=喟掂眴喟睄 喟熬喟傕盁啾嵿安啾� 喟呧皻啾囙挨喟ㄠ翱喟傕皻喟啊啾嗋皑啾�: 喟庎皞喟眴喟∴眴喟∴睄 PDF 喟熬喟傕盁啾嵿安啾� 喟夃蔼喟眿喟椸翱喟傕皻喟侧眹喟� 喟眿喟翱喟傕唉喟�.
+document_colors_not_allowed=PDF 喟挨啾嵿鞍喟距安啾� 喟掂熬喟熰翱 喟膏睄喟掂皞喟� 喟班皞喟椸眮喟侧皑啾� 喟夃蔼喟眿喟椸翱喟傕皻啾佮皶啾娻皑啾佮盁喟曕眮 喟呧皑啾佮爱喟む翱喟傕皻喟啊喟掂眮: 喟掂翱喟灌鞍喟`翱 喟ㄠ皞喟︵眮 鈥溹蔼啾囙皽啾�喟侧皑啾� 喟掂熬喟熰翱 喟膏睄喟掂皞喟� 喟班皞喟椸眮喟侧皑啾� 喟庎皞喟氞眮喟曕眾喟ㄠ眮喟熰皶啾� 喟呧皑啾佮爱喟む翱喟傕皻啾佲�� 喟呧皻啾囙挨喟ㄠ皞 喟氞眹喟艾喟∴翱喟掂眮喟傕唉喟�.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/th/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/th/viewer.properties
new file mode 100644
index 0000000..d6e24ae
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/th/viewer.properties
@@ -0,0 +1,228 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=喔笝喙夃覆喔佮箞喔笝喔笝喙夃覆
+previous_label=喔佮箞喔笝喔笝喙夃覆
+next.title=喔笝喙夃覆喔栢副喔斷箘喔�
+next_label=喔栢副喔斷箘喔�
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=喔笝喙夃覆
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=喔堗覆喔� {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} 喔堗覆喔� {{pagesCount}})
+
+zoom_out.title=喔嬥腹喔∴腑喔竵
+zoom_out_label=喔嬥腹喔∴腑喔竵
+zoom_in.title=喔嬥腹喔∴箑喔傕箟喔�
+zoom_in_label=喔嬥腹喔∴箑喔傕箟喔�
+zoom.title=喔嬥腹喔�
+presentation_mode.title=喔弗喔编笟喙�喔涏箛喔權箓喔浮喔斷竵喔侧福喔權赋喙�喔笝喔�
+presentation_mode_label=喙傕斧喔∴笖喔佮覆喔`笝喔赤箑喔笝喔�
+open_file.title=喙�喔涏复喔斷箘喔熰弗喙�
+open_file_label=喙�喔涏复喔�
+print.title=喔炧复喔∴笧喙�
+print_label=喔炧复喔∴笧喙�
+download.title=喔斷覆喔о笝喙屶箓喔弗喔�
+download_label=喔斷覆喔о笝喙屶箓喔弗喔�
+bookmark.title=喔∴父喔∴浮喔竾喔涏副喔堗笀喔膏笟喔编笝 (喔勦副喔斷弗喔竵喔福喔粪腑喙�喔涏复喔斷箖喔權斧喔權箟喔侧笗喙堗覆喔囙箖喔浮喙�)
+bookmark_label=喔∴父喔∴浮喔竾喔涏副喔堗笀喔膏笟喔编笝
+
+# Secondary toolbar and context menu
+tools.title=喙�喔勦福喔粪箞喔竾喔∴阜喔�
+tools_label=喙�喔勦福喔粪箞喔竾喔∴阜喔�
+first_page.title=喙勦笡喔⑧副喔囙斧喔權箟喔侧箒喔`竵
+first_page.label=喙勦笡喔⑧副喔囙斧喔權箟喔侧箒喔`竵
+first_page_label=喙勦笡喔⑧副喔囙斧喔權箟喔侧箒喔`竵
+last_page.title=喙勦笡喔⑧副喔囙斧喔權箟喔侧釜喔膏笖喔椸箟喔侧涪
+last_page.label=喙勦笡喔⑧副喔囙斧喔權箟喔侧釜喔膏笖喔椸箟喔侧涪
+last_page_label=喙勦笡喔⑧副喔囙斧喔權箟喔侧釜喔膏笖喔椸箟喔侧涪
+page_rotate_cw.title=喔浮喔膏笝喔曕覆喔∴箑喔傕箛喔∴笝喔侧脯喔脆竵喔�
+page_rotate_cw.label=喔浮喔膏笝喔曕覆喔∴箑喔傕箛喔∴笝喔侧脯喔脆竵喔�
+page_rotate_cw_label=喔浮喔膏笝喔曕覆喔∴箑喔傕箛喔∴笝喔侧脯喔脆竵喔�
+page_rotate_ccw.title=喔浮喔膏笝喔椸抚喔權箑喔傕箛喔∴笝喔侧脯喔脆竵喔�
+page_rotate_ccw.label=喔浮喔膏笝喔椸抚喔權箑喔傕箛喔∴笝喔侧脯喔脆竵喔�
+page_rotate_ccw_label=喔浮喔膏笝喔椸抚喔權箑喔傕箛喔∴笝喔侧脯喔脆竵喔�
+
+cursor_text_select_tool.title=喙�喔涏复喔斷箖喔娻箟喔囙覆喔權箑喔勦福喔粪箞喔竾喔∴阜喔竵喔侧福喙�喔ム阜喔竵喔傕箟喔竸喔о覆喔�
+cursor_text_select_tool_label=喙�喔勦福喔粪箞喔竾喔∴阜喔竵喔侧福喙�喔ム阜喔竵喔傕箟喔竸喔о覆喔�
+cursor_hand_tool.title=喙�喔涏复喔斷箖喔娻箟喔囙覆喔權箑喔勦福喔粪箞喔竾喔∴阜喔浮喔粪腑
+cursor_hand_tool_label=喙�喔勦福喔粪箞喔竾喔∴阜喔浮喔粪腑
+
+scroll_vertical.title=喙冟笂喙夃竵喔侧福喙�喔ム阜喙堗腑喔權箒喔權抚喔曕副喙夃竾
+scroll_vertical_label=喔佮覆喔`箑喔ム阜喙堗腑喔權箒喔權抚喔曕副喙夃竾
+scroll_horizontal.title=喙冟笂喙夃竵喔侧福喙�喔ム阜喙堗腑喔權箒喔權抚喔權腑喔�
+scroll_horizontal_label=喔佮覆喔`箑喔ム阜喙堗腑喔權箒喔權抚喔權腑喔�
+scroll_wrapped.title=喙冟笂喙夃竵喔侧福喙�喔ム阜喙堗腑喔權箒喔氞笟喔勦弗喔膏浮
+scroll_wrapped_label=喙�喔ム阜喙堗腑喔權箒喔氞笟喔勦弗喔膏浮
+
+spread_none.title=喙勦浮喙堗笗喙夃腑喔囙福喔о浮喔佮覆喔`竵喔`赴喔堗覆喔⑧斧喔權箟喔�
+spread_none_label=喙勦浮喙堗竵喔`赴喔堗覆喔�
+spread_odd.title=喔`抚喔∴竵喔侧福喔佮福喔班笀喔侧涪喔笝喙夃覆喙�喔`复喙堗浮喔堗覆喔佮斧喔權箟喔侧竸喔掂箞
+spread_odd_label=喔佮福喔班笀喔侧涪喔涪喙堗覆喔囙箑喔弗喔粪腑喙�喔ㄠ俯
+spread_even.title=喔`抚喔∴竵喔侧福喔佮福喔班笀喔侧涪喔笝喙夃覆喙�喔`复喙堗浮喔堗覆喔佮斧喔權箟喔侧竸喔灌箞
+spread_even_label=喔佮福喔班笀喔侧涪喔涪喙堗覆喔囙箑喔椸箞喔侧箑喔椸傅喔⑧浮
+
+# Document properties dialog box
+document_properties.title=喔勦父喔撪釜喔∴笟喔编笗喔脆箑喔竵喔覆喔b��
+document_properties_label=喔勦父喔撪釜喔∴笟喔编笗喔脆箑喔竵喔覆喔b��
+document_properties_file_name=喔娻阜喙堗腑喙勦笩喔ム箤:
+document_properties_file_size=喔傕笝喔侧笖喙勦笩喔ム箤:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} 喙勦笟喔曕箤)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} 喙勦笟喔曕箤)
+document_properties_title=喔娻阜喙堗腑:
+document_properties_author=喔溹腹喙夃釜喔`箟喔侧竾:
+document_properties_subject=喔娻阜喙堗腑喙�喔`阜喙堗腑喔�:
+document_properties_keywords=喔勦赋喔赋喔勦副喔�:
+document_properties_creation_date=喔о副喔權笚喔掂箞喔福喙夃覆喔�:
+document_properties_modification_date=喔о副喔權笚喔掂箞喙佮竵喙夃箘喔�:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=喔溹腹喙夃釜喔`箟喔侧竾:
+document_properties_producer=喔溹腹喙夃笢喔ム复喔� PDF:
+document_properties_version=喔`父喙堗笝 PDF:
+document_properties_page_count=喔堗赋喔權抚喔權斧喔權箟喔�:
+document_properties_page_size=喔傕笝喔侧笖喔笝喙夃覆:
+document_properties_page_size_unit_inches=in
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=喙佮笝喔о笗喔编箟喔�
+document_properties_page_size_orientation_landscape=喙佮笝喔о笝喔笝
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=喔堗笖喔浮喔侧涪
+document_properties_page_size_name_legal=喔傕箟喔竵喔庎斧喔∴覆喔�
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized_yes=喙冟笂喙�
+document_properties_linearized_no=喙勦浮喙�
+document_properties_close=喔涏复喔�
+
+print_progress_message=喔佮赋喔ム副喔囙箑喔曕福喔掂涪喔∴箑喔竵喔覆喔`釜喔赤斧喔`副喔氞竵喔侧福喔炧复喔∴笧喙屸��
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=喔⑧竵喙�喔ム复喔�
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=喙�喔涏复喔�/喔涏复喔斷箒喔栢笟喔傕箟喔侧竾
+toggle_sidebar_notification.title=喙�喔涏复喔�/喔涏复喔斷箒喔栢笟喔傕箟喔侧竾 (喙�喔竵喔覆喔`浮喔掂箑喔勦箟喔侧福喙堗覆喔�/喙勦笩喔ム箤喙佮笝喔�)
+toggle_sidebar_label=喙�喔涏复喔�/喔涏复喔斷箒喔栢笟喔傕箟喔侧竾
+document_outline.title=喙佮釜喔斷竾喙�喔勦箟喔侧福喙堗覆喔囙箑喔竵喔覆喔� (喔勦弗喔脆竵喔腑喔囙竸喔`副喙夃竾喙�喔炧阜喙堗腑喔傕涪喔侧涪/喔⑧父喔氞福喔侧涪喔佮覆喔`笚喔编箟喔囙斧喔∴笖)
+document_outline_label=喙�喔勦箟喔侧福喙堗覆喔囙箑喔竵喔覆喔�
+attachments.title=喙佮釜喔斷竾喙勦笩喔ム箤喙佮笝喔�
+attachments_label=喙勦笩喔ム箤喙佮笝喔�
+thumbs.title=喙佮釜喔斷竾喔犩覆喔炧競喔權覆喔斷涪喙堗腑
+thumbs_label=喔犩覆喔炧競喔權覆喔斷涪喙堗腑
+findbar.title=喔勦箟喔權斧喔侧箖喔權箑喔竵喔覆喔�
+findbar_label=喔勦箟喔權斧喔�
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=喔笝喙夃覆 {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=喔犩覆喔炧競喔權覆喔斷涪喙堗腑喔傕腑喔囙斧喔權箟喔� {{page}}
+
+# Find panel button title and messages
+find_input.title=喔勦箟喔權斧喔�
+find_input.placeholder=喔勦箟喔權斧喔侧箖喔權箑喔竵喔覆喔b��
+find_previous.title=喔覆喔曕赋喙佮斧喔權箞喔囙竵喙堗腑喔權斧喔權箟喔侧競喔竾喔о弗喔�
+find_previous_label=喔佮箞喔笝喔笝喙夃覆
+find_next.title=喔覆喔曕赋喙佮斧喔權箞喔囙笘喔编笖喙勦笡喔傕腑喔囙抚喔ム傅
+find_next_label=喔栢副喔斷箘喔�
+find_highlight=喙�喔權箟喔權釜喔掂笚喔编箟喔囙斧喔∴笖
+find_match_case_label=喔曕副喔о笧喔脆浮喔炧箤喙冟斧喔嵿箞喙�喔ム箛喔佮笗喔`竾喔佮副喔�
+find_entire_word_label=喔椸副喙夃竾喔勦赋
+find_reached_top=喔勦箟喔權斧喔侧笘喔多竾喔堗父喔斷箑喔`复喙堗浮喔曕箟喔權競喔竾喔笝喙夃覆 喙�喔`复喙堗浮喔勦箟喔權笗喙堗腑喔堗覆喔佮笖喙夃覆喔權弗喙堗覆喔�
+find_reached_bottom=喔勦箟喔權斧喔侧笘喔多竾喔堗父喔斷釜喔脆箟喔權釜喔膏笖喔笝喙夃覆 喙�喔`复喙堗浮喔勦箟喔權笗喙堗腑喔堗覆喔佮笖喙夃覆喔權笟喔�
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_not_found=喙勦浮喙堗笧喔氞抚喔ム傅
+
+# Error panel labels
+error_more_info=喔傕箟喔浮喔灌弗喙�喔炧复喙堗浮喙�喔曕复喔�
+error_less_info=喔傕箟喔浮喔灌弗喔權箟喔涪喔ム竾
+error_close=喔涏复喔�
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=喔傕箟喔竸喔о覆喔�: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=喔箒喔曕竵: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=喙勦笩喔ム箤: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=喔氞福喔`笚喔编笖: {{line}}
+rendering_error=喙�喔佮复喔斷競喙夃腑喔溹复喔斷笧喔ム覆喔斷競喔撪赴喔佮赋喔ム副喔囙箑喔`笝喙�喔斷腑喔`箤喔笝喙夃覆
+
+# Predefined zoom values
+page_scale_width=喔勦抚喔侧浮喔佮抚喙夃覆喔囙斧喔權箟喔�
+page_scale_fit=喔炧腑喔斷傅喔笝喙夃覆
+page_scale_auto=喔嬥腹喔∴腑喔编笗喙傕笝喔∴副喔曕复
+page_scale_actual=喔傕笝喔侧笖喔堗福喔脆竾
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=喔傕箟喔笢喔脆笖喔炧弗喔侧笖
+loading_error=喙�喔佮复喔斷競喙夃腑喔溹复喔斷笧喔ム覆喔斷競喔撪赴喔佮赋喔ム副喔囙箓喔弗喔� PDF
+invalid_file_error=喙勦笩喔ム箤 PDF 喙勦浮喙堗笘喔灌竵喔曕箟喔竾喔福喔粪腑喙�喔傅喔⑧斧喔侧涪
+missing_file_error=喙勦笩喔ム箤 PDF 喔覆喔⑧箘喔�
+unexpected_response_error=喔佮覆喔`笗喔笟喔笝喔竾喔傕腑喔囙箑喔嬥复喔`箤喔熰箑喔о腑喔`箤喔椸傅喙堗箘喔∴箞喔勦覆喔斷竸喔脆笖
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[喔勦赋喔笜喔脆笟喔侧涪喔涏福喔班竵喔笟 {{type}}]
+password_label=喔涏箟喔笝喔`斧喔编釜喔溹箞喔侧笝喙�喔炧阜喙堗腑喙�喔涏复喔斷箘喔熰弗喙� PDF 喔權傅喙�
+password_invalid=喔`斧喔编釜喔溹箞喔侧笝喙勦浮喙堗笘喔灌竵喔曕箟喔竾 喙傕笡喔`笖喔ム腑喔囙腑喔掂竵喔勦福喔编箟喔�
+password_ok=喔曕竵喔ム竾
+password_cancel=喔⑧竵喙�喔ム复喔�
+
+printing_not_supported=喔勦赋喙�喔曕阜喔笝: 喙�喔氞福喔侧抚喙屶箑喔嬥腑喔`箤喔權傅喙夃箘喔∴箞喙勦笖喙夃釜喔權副喔氞釜喔權父喔權竵喔侧福喔炧复喔∴笧喙屶腑喔⑧箞喔侧竾喙�喔曕箛喔∴笚喔掂箞
+printing_not_ready=喔勦赋喙�喔曕阜喔笝: PDF 喙勦浮喙堗箘喔斷箟喔`副喔氞竵喔侧福喙傕斧喔ム笖喔涪喙堗覆喔囙箑喔曕箛喔∴笚喔掂箞喔赋喔福喔编笟喔佮覆喔`笧喔脆浮喔炧箤
+web_fonts_disabled=喙佮笟喔氞腑喔编竵喔┼福喙�喔о箛喔氞笘喔灌竵喔涏复喔斷箖喔娻箟喔囙覆喔�: 喙勦浮喙堗釜喔侧浮喔侧福喔栢箖喔娻箟喙佮笟喔氞腑喔编竵喔┼福 PDF 喔澿副喔囙笗喔编抚
+document_colors_not_allowed=喙�喔竵喔覆喔� PDF 喙勦浮喙堗箘喔斷箟喔`副喔氞腑喔權父喔嵿覆喔曕箖喔箟喙冟笂喙夃釜喔掂競喔竾喔曕副喔о箑喔竾: "喔笝喔膏笉喔侧笗喙冟斧喙夃斧喔權箟喔侧箑喔竵喔覆喔`釜喔侧浮喔侧福喔栢箑喔ム阜喔竵喔傅喔傕腑喔囙笗喔编抚喙�喔竾" 喔栢腹喔佮笡喔脆笖喙冟笂喙夃竾喔侧笝喙冟笝喙�喔氞福喔侧抚喙屶箑喔嬥腑喔`箤
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/tl/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/tl/viewer.properties
new file mode 100644
index 0000000..b724342
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/tl/viewer.properties
@@ -0,0 +1,177 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Naunang Pahina
+previous_label=Nakaraan
+next.title=Sunod na Pahina
+next_label=Sunod
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=Pahina
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=ng {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} ng {{pagesCount}})
+
+zoom_out.title=Mag-zom Out
+zoom_out_label=Paliitin
+zoom_in.title=Palakihin
+zoom_in_label=Palakihin
+zoom.title=Mag-zoom
+open_file.title=Magbukas ng file
+open_file_label=Buksan
+print.title=i-Print
+print_label=i-Print
+download.title=Download
+download_label=Download
+bookmark.title=Kasalukuyang tingin (kopyahin o buksan sa bagong window)
+bookmark_label=Kasalukuyang tingin
+
+# Secondary toolbar and context menu
+tools.title=Mga Tool
+tools_label=Mga Tool
+first_page.title=Pumunta sa Unang Pahina
+first_page.label=Pumunta sa Unang Pahina
+first_page_label=Pumunta sa Unang Pahina
+last_page.title=Pumunta sa Huling Pahina
+last_page.label=Pumunta sa Huling Pahina
+last_page_label=Pumunta sa Huling Pahina
+page_rotate_cw.title=Paikutin ang Clockwise
+page_rotate_cw.label=Paikutin ang Clockwise
+page_rotate_cw_label=Paikutin ang Clockwise
+page_rotate_ccw.title=Paikutin ang Counterclockwise
+page_rotate_ccw.label=Paikutin ang Counterclockwise
+page_rotate_ccw_label=Paikutin ang Counterclockwise
+
+
+
+
+# Document properties dialog box
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=Pamagat:
+document_properties_keywords=Mga keyword:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_page_size_unit_inches=in
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=portrait
+document_properties_page_size_orientation_landscape=landscape
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Letter
+document_properties_page_size_name_legal=Legal
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized_yes=Oo
+document_properties_linearized_no=Hindi
+document_properties_close=Isara
+
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=Kanselahin
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+thumbs.title=Ipakita ang mga Thumbnails
+findbar_label=Hanapin
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Pahina {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Thumbnail ng Pahina {{page}}
+
+# Find panel button title and messages
+find_input.title=Hanapin
+find_previous.title=Hanapin ang nakaraang pangyayari ng parirala
+find_previous_label=Nakaraang
+find_next.title=Hanapin ang susunod na pangyayari ng parirala
+find_next_label=Susunod
+find_highlight=I-highlight lahat
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_not_found=Hindi nakita ang prasko
+
+# Error panel labels
+error_more_info=Maraming Inpormasyon
+error_less_info=Maikling Inpormasyon
+error_close=Sarado
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Mensahe: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stack: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=File: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Linya: {{line}}
+rendering_error=May naganap na pagkakamali habang pagsasalin sa pahina.
+
+# Predefined zoom values
+page_scale_width=Haba ng Pahina
+page_scale_fit=ang pahina ay angkop
+page_scale_auto=awtomatikong pag-imbulog
+page_scale_actual=Totoong sukat
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Error
+loading_error=May maling nangyari habang kinakarga ang PDF.
+invalid_file_error=Di-wasto o masira ang PDF file.
+missing_file_error=Nawawalang PDF file.
+unexpected_response_error=Hindi inaasahang tugon ng server.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Annotation]
+password_label=Ipasok ang password upang buksan ang PDF file na ito.
+password_ok=OK
+password_cancel=Kanselahin
+
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/tn/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/tn/viewer.properties
new file mode 100644
index 0000000..eda077c
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/tn/viewer.properties
@@ -0,0 +1,83 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+
+zoom.title=Zuma/gogela
+open_file.title=Bula Faele
+open_file_label=Bula
+
+# Secondary toolbar and context menu
+
+
+# Document properties dialog box
+document_properties_file_name=Leina la faele:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_title=Leina:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+
+# Find panel button title and messages
+find_previous.title=Batla tiragalo e e fetileng ya setlhopha sa mafoko
+find_next.title=Batla tiragalo e e latelang ya setlhopha sa mafoko
+find_not_found=Setlhopha sa mafoko ga se a bonwa
+
+# Error panel labels
+error_more_info=Tshedimosetso e Nngwe
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+
+# Predefined zoom values
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+
+# Loading indicator messages
+loading_error_indicator=Phoso
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+password_ok=Siame
+
+web_fonts_disabled=Mefutatlhaka ya Webo ga e dire: ga e kgone go dirisa mofutatlhaka wa PDF o tsentsweng.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/tr/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/tr/viewer.properties
new file mode 100644
index 0000000..c1ed154
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/tr/viewer.properties
@@ -0,0 +1,242 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=脰nceki sayfa
+previous_label=脰nceki
+next.title=Sonraki sayfa
+next_label=Sonraki
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=Sayfa
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=/ {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} / {{pagesCount}})
+
+zoom_out.title=Uzakla艧t谋r
+zoom_out_label=Uzakla艧t谋r
+zoom_in.title=Yakla艧t谋r
+zoom_in_label=Yakla艧t谋r
+zoom.title=Yak谋nla艧t谋rma
+presentation_mode.title=Sunum moduna ge莽
+presentation_mode_label=Sunum Modu
+open_file.title=Dosya a莽
+open_file_label=A莽
+print.title=Yazd谋r
+print_label=Yazd谋r
+download.title=陌ndir
+download_label=陌ndir
+bookmark.title=Ge莽erli g枚r眉n眉m (kopyala veya yeni pencerede a莽)
+bookmark_label=Ge莽erli g枚r眉n眉m
+
+# Secondary toolbar and context menu
+tools.title=Ara莽lar
+tools_label=Ara莽lar
+first_page.title=陌lk sayfaya git
+first_page.label=陌lk sayfaya git
+first_page_label=陌lk sayfaya git
+last_page.title=Son sayfaya git
+last_page.label=Son sayfaya git
+last_page_label=Son sayfaya git
+page_rotate_cw.title=Saat y枚n眉nde d枚nd眉r
+page_rotate_cw.label=Saat y枚n眉nde d枚nd眉r
+page_rotate_cw_label=Saat y枚n眉nde d枚nd眉r
+page_rotate_ccw.title=Saat y枚n眉n眉n tersine d枚nd眉r
+page_rotate_ccw.label=Saat y枚n眉n眉n tersine d枚nd眉r
+page_rotate_ccw_label=Saat y枚n眉n眉n tersine d枚nd眉r
+
+cursor_text_select_tool.title=Metin se莽me arac谋n谋 etkinle艧tir
+cursor_text_select_tool_label=Metin se莽me arac谋
+cursor_hand_tool.title=El arac谋n谋 etkinle艧tir
+cursor_hand_tool_label=El arac谋
+
+scroll_vertical.title=Dikey kayd谋rma kullan
+scroll_vertical_label=Dikey kayd谋rma
+scroll_horizontal.title=Yatay kayd谋rma kullan
+scroll_horizontal_label=Yatay kayd谋rma
+scroll_wrapped.title=Yan yana kayd谋rmay谋 kullan
+scroll_wrapped_label=Yan yana kayd谋rma
+
+spread_none.title=Yan yana sayfalar谋 birle艧tirme
+spread_none_label=Birle艧tirme
+spread_odd.title=Yan yana sayfalar谋 tek numaral谋 sayfalardan ba艧layarak birle艧tir
+spread_odd_label=Tek numaral谋
+spread_even.title=Yan yana sayfalar谋 莽ift numaral谋 sayfalardan ba艧layarak birle艧tir
+spread_even_label=脟ift numaral谋
+
+# Document properties dialog box
+document_properties.title=Belge 枚zellikleri鈥�
+document_properties_label=Belge 枚zellikleri鈥�
+document_properties_file_name=Dosya ad谋:
+document_properties_file_size=Dosya boyutu:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} bayt)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} bayt)
+document_properties_title=Ba艧l谋k:
+document_properties_author=Yazar:
+document_properties_subject=Konu:
+document_properties_keywords=Anahtar kelimeler:
+document_properties_creation_date=Oluturma tarihi:
+document_properties_modification_date=De臒i艧tirme tarihi:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}} {{time}}
+document_properties_creator=Olu艧turan:
+document_properties_producer=PDF 眉reticisi:
+document_properties_version=PDF s眉r眉m眉:
+document_properties_page_count=Sayfa say谋s谋:
+document_properties_page_size=Sayfa boyutu:
+document_properties_page_size_unit_inches=in莽
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=dikey
+document_properties_page_size_orientation_landscape=yatay
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Letter
+document_properties_page_size_name_legal=Legal
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=H谋zl谋 web g枚r眉n眉m眉:
+document_properties_linearized_yes=Evet
+document_properties_linearized_no=Hay谋r
+document_properties_close=Kapat
+
+print_progress_message=Belge yazd谋r谋lmaya haz谋rlan谋yor鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent=%{{progress}}
+print_progress_close=陌ptal
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Kenar 莽ubu臒unu a莽/kapat
+toggle_sidebar_notification.title=Kenar 莽ubu臒unu a莽/kapat (Belge anahat/ekler i莽eriyor)
+toggle_sidebar_label=Kenar 莽ubu臒unu a莽/kapat
+document_outline.title=Belge 艧emas谋n谋 g枚ster (T眉m 枚臒eleri geni艧letmek/daraltmak i莽in 莽ift t谋klay谋n)
+document_outline_label=Belge 艧emas谋
+attachments.title=Ekleri g枚ster
+attachments_label=Ekler
+thumbs.title=K眉莽眉k resimleri g枚ster
+thumbs_label=K眉莽眉k resimler
+findbar.title=Belgede bul
+findbar_label=Bul
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Sayfa {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas={{page}}. sayfan谋n k眉莽眉k h芒li
+
+# Find panel button title and messages
+find_input.title=Bul
+find_input.placeholder=Belgede bul鈥�
+find_previous.title=脰nceki e艧le艧meyi bul
+find_previous_label=脰nceki
+find_next.title=Sonraki e艧le艧meyi bul
+find_next_label=Sonraki
+find_highlight=T眉m眉n眉 vurgula
+find_match_case_label=B眉y眉k-k眉莽眉k harfe duyarl谋
+find_entire_word_label=Tam s枚zc眉kler
+find_reached_top=Belgenin ba艧谋na ula艧谋ld谋, sonundan devam edildi
+find_reached_bottom=Belgenin sonuna ula艧谋ld谋, ba艧谋ndan devam edildi
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]={{total}} e艧le艧meden {{current}}. e艧le艧me
+find_match_count[two]={{total}} e艧le艧meden {{current}}. e艧le艧me
+find_match_count[few]={{total}} e艧le艧meden {{current}}. e艧le艧me
+find_match_count[many]={{total}} e艧le艧meden {{current}}. e艧le艧me
+find_match_count[other]={{total}} e艧le艧meden {{current}}. e艧le艧me
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]={{limit}} e艧le艧meden fazla
+find_match_count_limit[one]={{limit}} e艧le艧meden fazla
+find_match_count_limit[two]={{limit}} e艧le艧meden fazla
+find_match_count_limit[few]={{limit}} e艧le艧meden fazla
+find_match_count_limit[many]={{limit}} e艧le艧meden fazla
+find_match_count_limit[other]={{limit}} e艧le艧meden fazla
+find_not_found=E艧le艧me bulunamad谋
+
+# Error panel labels
+error_more_info=Daha fazla bilgi al
+error_less_info=Daha az bilgi
+error_close=Kapat
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js s眉r眉m {{version}} (yap谋: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=陌leti: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Y谋臒谋n: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Dosya: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Sat谋r: {{line}}
+rendering_error=Sayfa yorumlan谋rken bir hata olu艧tu.
+
+# Predefined zoom values
+page_scale_width=Sayfa geni艧li臒i
+page_scale_fit=Sayfay谋 s谋臒d谋r
+page_scale_auto=Otomatik yak谋nla艧t谋r
+page_scale_actual=Ger莽ek boyut
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent=%{{scale}}
+
+# Loading indicator messages
+loading_error_indicator=Hata
+loading_error=PDF y眉klenirken bir hata olu艧tu.
+invalid_file_error=Ge莽ersiz veya bozulmu艧 PDF dosyas谋.
+missing_file_error=PDF dosyas谋 eksik.
+unexpected_response_error=Beklenmeyen sunucu yan谋t谋.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} i艧areti]
+password_label=Bu PDF dosyas谋n谋 a莽mak i莽in parolas谋n谋 yaz谋n.
+password_invalid=Ge莽ersiz parola. L眉tfen yeniden deneyin.
+password_ok=Tamam
+password_cancel=陌ptal
+
+printing_not_supported=Uyar谋: Yazd谋rma bu taray谋c谋 taraf谋ndan tam olarak desteklenmemektedir.
+printing_not_ready=Uyar谋: PDF tamamen y眉klenmedi ve yazd谋rmaya haz谋r de臒il.
+web_fonts_disabled=Web fontlar谋 devre d谋艧谋: G枚m眉l眉 PDF fontlar谋 kullan谋lam谋yor.
+document_colors_not_allowed=PDF belgelerinin kendi renklerini kullanmas谋 i莽in izin verilmiyor: 鈥淪ayfalara kendi renklerini se莽mesi i莽in izin ver鈥� taray谋c谋da etkinle艧tirilmemi艧.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/tsz/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/tsz/viewer.properties
new file mode 100644
index 0000000..c50a942
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/tsz/viewer.properties
@@ -0,0 +1,75 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+
+zoom.title=jasi
+open_file_label=Mitani
+
+# Secondary toolbar and context menu
+
+
+# Document properties dialog box
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+
+# Find panel button title and messages
+
+# Error panel labels
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+
+# Predefined zoom values
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+
+# Loading indicator messages
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+password_ok=Jo
+
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/uk/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/uk/viewer.properties
new file mode 100644
index 0000000..01d0288
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/uk/viewer.properties
@@ -0,0 +1,242 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=袩芯锌械褉械写薪褟 褋褌芯褉褨薪泻邪
+previous_label=袩芯锌械褉械写薪褟
+next.title=袧邪褋褌褍锌薪邪 褋褌芯褉褨薪泻邪
+next_label=袧邪褋褌褍锌薪邪
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=小褌芯褉褨薪泻邪
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=褨蟹 {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} 褨蟹 {{pagesCount}})
+
+zoom_out.title=袟屑械薪褕懈褌懈
+zoom_out_label=袟屑械薪褕懈褌懈
+zoom_in.title=袟斜褨谢褜褕懈褌懈
+zoom_in_label=袟斜褨谢褜褕懈褌懈
+zoom.title=袦邪褋褕褌邪斜
+presentation_mode.title=袩械褉械泄褌懈 胁 褉械卸懈屑 锌褉械蟹械薪褌邪褑褨褩
+presentation_mode_label=袪械卸懈屑 锌褉械蟹械薪褌邪褑褨褩
+open_file.title=袙褨写泻褉懈褌懈 褎邪泄谢
+open_file_label=袙褨写泻褉懈褌懈
+print.title=袛褉褍泻
+print_label=袛褉褍泻
+download.title=袟邪胁邪薪褌邪卸懈褌懈
+download_label=袟邪胁邪薪褌邪卸懈褌懈
+bookmark.title=袩芯褌芯褔薪懈泄 胁懈谐谢褟写 (泻芯锌褨褞胁邪褌懈 褔懈 胁褨写泻褉懈褌懈 胁 薪芯胁芯屑褍 胁褨泻薪褨)
+bookmark_label=袩芯褌芯褔薪懈泄 胁懈谐谢褟写
+
+# Secondary toolbar and context menu
+tools.title=袉薪褋褌褉褍屑械薪褌懈
+tools_label=袉薪褋褌褉褍屑械薪褌懈
+first_page.title=袧邪 锌械褉褕褍 褋褌芯褉褨薪泻褍
+first_page.label=袧邪 锌械褉褕褍 褋褌芯褉褨薪泻褍
+first_page_label=袧邪 锌械褉褕褍 褋褌芯褉褨薪泻褍
+last_page.title=袧邪 芯褋褌邪薪薪褞 褋褌芯褉褨薪泻褍
+last_page.label=袧邪 芯褋褌邪薪薪褞 褋褌芯褉褨薪泻褍
+last_page_label=袧邪 芯褋褌邪薪薪褞 褋褌芯褉褨薪泻褍
+page_rotate_cw.title=袩芯胁械褉薪褍褌懈 蟹邪 谐芯写懈薪薪懈泻芯胁芯褞 褋褌褉褨谢泻芯褞
+page_rotate_cw.label=袩芯胁械褉薪褍褌懈 蟹邪 谐芯写懈薪薪懈泻芯胁芯褞 褋褌褉褨谢泻芯褞
+page_rotate_cw_label=袩芯胁械褉薪褍褌懈 蟹邪 谐芯写懈薪薪懈泻芯胁芯褞 褋褌褉褨谢泻芯褞
+page_rotate_ccw.title=袩芯胁械褉薪褍褌懈 锌褉芯褌懈 谐芯写懈薪薪懈泻芯胁芯褩 褋褌褉褨谢泻懈
+page_rotate_ccw.label=袩芯胁械褉薪褍褌懈 锌褉芯褌懈 谐芯写懈薪薪懈泻芯胁芯褩 褋褌褉褨谢泻懈
+page_rotate_ccw_label=袩芯胁械褉薪褍褌懈 锌褉芯褌懈 谐芯写懈薪薪懈泻芯胁芯褩 褋褌褉褨谢泻懈
+
+cursor_text_select_tool.title=校胁褨屑泻薪褍褌懈 褨薪褋褌褉褍屑械薪褌 胁懈斜芯褉褍 褌械泻褋褌褍
+cursor_text_select_tool_label=袉薪褋褌褉褍屑械薪褌 胁懈斜芯褉褍 褌械泻褋褌褍
+cursor_hand_tool.title=校胁褨屑泻薪褍褌懈 褨薪褋褌褉褍屑械薪褌 芦袪褍泻邪禄
+cursor_hand_tool_label=袉薪褋褌褉褍屑械薪褌 芦袪褍泻邪禄
+
+scroll_vertical.title=袙懈泻芯褉懈褋褌芯胁褍胁邪褌懈 胁械褉褌懈泻邪谢褜薪械 锌褉芯泻褉褍褔褍胁邪薪薪褟
+scroll_vertical_label=袙械褉褌懈泻邪谢褜薪械 锌褉芯泻褉褍褔褍胁邪薪薪褟
+scroll_horizontal.title=袙懈泻芯褉懈褋褌芯胁褍胁邪褌懈 谐芯褉懈蟹芯薪褌邪谢褜薪械 锌褉芯泻褉褍褔褍胁邪薪薪褟
+scroll_horizontal_label=袚芯褉懈蟹芯薪褌邪谢褜薪械 锌褉芯泻褉褍褔褍胁邪薪薪褟
+scroll_wrapped.title=袙懈泻芯褉懈褋褌芯胁褍胁邪褌懈 屑邪褋褕褌邪斜芯胁邪薪械 锌褉芯泻褉褍褔褍胁邪薪薪褟
+scroll_wrapped_label=袦邪褋褕褌邪斜芯胁邪薪械 锌褉芯泻褉褍褔褍胁邪薪薪褟
+
+spread_none.title=袧械 胁懈泻芯褉懈褋褌芯胁褍胁邪褌懈 褉芯蟹谐芯褉薪褍褌褨 褋褌芯褉褨薪泻懈
+spread_none_label=袘械蟹 褉芯蟹谐芯褉薪褍褌懈褏 褋褌芯褉褨薪芯泻
+spread_odd.title=袪芯蟹谐芯褉薪褍褌褨 褋褌芯褉褨薪泻懈 锌芯褔懈薪邪褞褌褜褋褟 蟹 薪械锌邪褉薪懈褏 薪芯屑械褉褨胁
+spread_odd_label=袧械锌邪褉薪褨 褋褌芯褉褨薪泻懈 蟹谢褨胁邪
+spread_even.title=袪芯蟹谐芯褉薪褍褌褨 褋褌芯褉褨薪泻懈 锌芯褔懈薪邪褞褌褜褋褟 蟹 锌邪褉薪懈褏 薪芯屑械褉褨胁
+spread_even_label=袩邪褉薪褨 褋褌芯褉褨薪泻懈 蟹谢褨胁邪
+
+# Document properties dialog box
+document_properties.title=袙谢邪褋褌懈胁芯褋褌褨 写芯泻褍屑械薪褌邪鈥�
+document_properties_label=袙谢邪褋褌懈胁芯褋褌褨 写芯泻褍屑械薪褌邪鈥�
+document_properties_file_name=袧邪蟹胁邪 褎邪泄谢邪:
+document_properties_file_size=袪芯蟹屑褨褉 褎邪泄谢邪:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} 袣袘 ({{size_b}} bytes)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} 袦袘 ({{size_b}} bytes)
+document_properties_title=袟邪谐芯谢芯胁芯泻:
+document_properties_author=袗胁褌芯褉:
+document_properties_subject=孝械屑邪:
+document_properties_keywords=袣谢褞褔芯胁褨 褋谢芯胁邪:
+document_properties_creation_date=袛邪褌邪 褋褌胁芯褉械薪薪褟:
+document_properties_modification_date=袛邪褌邪 蟹屑褨薪懈:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=小褌胁芯褉械薪芯:
+document_properties_producer=袙懈褉芯斜薪懈泻 PDF:
+document_properties_version=袙械褉褋褨褟 PDF:
+document_properties_page_count=袣褨谢褜泻褨褋褌褜 褋褌芯褉褨薪芯泻:
+document_properties_page_size=袪芯蟹屑褨褉 褋褌芯褉褨薪泻懈:
+document_properties_page_size_unit_inches=写褞泄屑褨胁
+document_properties_page_size_unit_millimeters=屑屑
+document_properties_page_size_orientation_portrait=泻薪懈卸泻芯胁邪
+document_properties_page_size_orientation_landscape=邪谢褜斜芯屑薪邪
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Letter
+document_properties_page_size_name_legal=Legal
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=楔胁懈写泻懈泄 锌械褉械谐谢褟写 胁 袉薪褌械褉薪械褌褨:
+document_properties_linearized_yes=孝邪泻
+document_properties_linearized_no=袧褨
+document_properties_close=袟邪泻褉懈褌懈
+
+print_progress_message=袩褨写谐芯褌芯胁泻邪 写芯泻褍屑械薪褌褍 写芯 写褉褍泻褍鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=小泻邪褋褍胁邪褌懈
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=袘褨褔薪邪 锌邪薪械谢褜
+toggle_sidebar_notification.title=袩械褉械屑泻薪褍褌懈 斜褨褔薪褍 锌邪薪械谢褜 (写芯泻褍屑械薪褌 屑邪褦 胁屑褨褋褌/胁泻谢邪写械薪薪褟)
+toggle_sidebar_label=袩械褉械屑泻薪褍褌懈 斜褨褔薪褍 锌邪薪械谢褜
+document_outline.title=袩芯泻邪蟹邪褌懈 褋褏械屑褍 写芯泻褍屑械薪褌褍 (锌芯写胁褨泄薪懈泄 泻谢褨泻 写谢褟 褉芯蟹谐芯褉褌邪薪薪褟/蟹谐芯褉褌邪薪薪褟 械谢械屑械薪褌褨胁)
+document_outline_label=小褏械屑邪 写芯泻褍屑械薪褌邪
+attachments.title=袩芯泻邪蟹邪褌懈 锌褉懈泻褉褨锌谢械薪薪褟
+attachments_label=袩褉懈泻褉褨锌谢械薪薪褟
+thumbs.title=袩芯泻邪蟹褍胁邪褌懈 械褋泻褨蟹懈
+thumbs_label=袝褋泻褨蟹懈
+findbar.title=袟薪邪泄褌懈 胁 写芯泻褍屑械薪褌褨
+findbar_label=袩芯褕褍泻
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=小褌芯褉褨薪泻邪 {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=袝褋泻褨蟹 褋褌芯褉褨薪泻懈 {{page}}
+
+# Find panel button title and messages
+find_input.title=袟薪邪泄褌懈
+find_input.placeholder=袟薪邪泄褌懈 胁 写芯泻褍屑械薪褌褨鈥�
+find_previous.title=袟薪邪泄褌懈 锌芯锌械褉械写薪褦 胁褏芯写卸械薪薪褟 褎褉邪蟹懈
+find_previous_label=袩芯锌械褉械写薪褦
+find_next.title=袟薪邪泄褌懈 薪邪褋褌褍锌薪械 胁褏芯写卸械薪薪褟 褎褉邪蟹懈
+find_next_label=袧邪褋褌褍锌薪械
+find_highlight=袩褨写褋胁褨褌懈褌懈 胁褋械
+find_match_case_label=袟 褍褉邪褏褍胁邪薪薪褟屑 褉械谐褨褋褌褉褍
+find_entire_word_label=笑褨谢褨 褋谢芯胁邪
+find_reached_top=袛芯褋褟谐薪褍褌芯 锌芯褔邪褌泻褍 写芯泻褍屑械薪褌褍, 锌褉芯写芯胁卸械薪芯 蟹 泻褨薪褑褟
+find_reached_bottom=袛芯褋褟谐薪褍褌芯 泻褨薪褑褟 写芯泻褍屑械薪褌褍, 锌褉芯写芯胁卸械薪芯 蟹 锌芯褔邪褌泻褍
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]={{current}} 蟹斜褨谐 褨蟹 {{total}}
+find_match_count[two]={{current}} 蟹斜褨谐懈 蟹 {{total}}
+find_match_count[few]={{current}} 蟹斜褨谐褨胁 褨蟹 {{total}}
+find_match_count[many]={{current}} 蟹斜褨谐褨胁 褨蟹 {{total}}
+find_match_count[other]={{current}} 蟹斜褨谐褨胁 褨蟹 {{total}}
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]=袩芯薪邪写 {{limit}} 蟹斜褨谐褨胁
+find_match_count_limit[one]=袘褨谢褜褕械, 薪褨卸 {{limit}} 蟹斜褨谐
+find_match_count_limit[two]=袘褨谢褜褕械, 薪褨卸 {{limit}} 蟹斜褨谐懈
+find_match_count_limit[few]=袘褨谢褜褕械, 薪褨卸 {{limit}} 蟹斜褨谐褨胁
+find_match_count_limit[many]=袩芯薪邪写 {{limit}} 蟹斜褨谐褨胁
+find_match_count_limit[other]=袩芯薪邪写 {{limit}} 蟹斜褨谐褨胁
+find_not_found=肖褉邪蟹褍 薪械 蟹薪邪泄写械薪芯
+
+# Error panel labels
+error_more_info=袘褨谢褜褕械 褨薪褎芯褉屑邪褑褨褩
+error_less_info=袦械薪褕械 褨薪褎芯褉屑邪褑褨褩
+error_close=袟邪泻褉懈褌懈
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=袩芯胁褨写芯屑谢械薪薪褟: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=小褌械泻: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=肖邪泄谢: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=袪褟写芯泻: {{line}}
+rendering_error=袩褨写 褔邪褋 胁懈胁械写械薪薪褟 褋褌芯褉褨薪泻懈 褋褌邪谢邪褋褟 锌芯屑懈谢泻邪.
+
+# Predefined zoom values
+page_scale_width=袟邪 褕懈褉懈薪芯褞
+page_scale_fit=校屑褨褋褌懈褌懈
+page_scale_auto=袗胁褌芯-屑邪褋褕褌邪斜
+page_scale_actual=袛褨泄褋薪懈泄 褉芯蟹屑褨褉
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=袩芯屑懈谢泻邪
+loading_error=袩褨写 褔邪褋 蟹邪胁邪薪褌邪卸械薪薪褟 PDF 褋褌邪谢邪褋褟 锌芯屑懈谢泻邪.
+invalid_file_error=袧械写褨泄褋薪懈泄 邪斜芯 锌芯褕泻芯写卸械薪懈泄 PDF-褎邪泄谢.
+missing_file_error=袙褨写褋褍褌薪褨泄 PDF-褎邪泄谢.
+unexpected_response_error=袧械芯褔褨泻褍胁邪薪邪 胁褨写锌芯胁褨写褜 褋械褉胁械褉邪.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}}-邪薪薪芯褌邪褑褨褟]
+password_label=袙胁械写褨褌褜 锌邪褉芯谢褜 写谢褟 胁褨写泻褉懈褌褌褟 褑褜芯谐芯 PDF-褎邪泄谢邪.
+password_invalid=袧械胁褨褉薪懈泄 锌邪褉芯谢褜. 小锌褉芯斜褍泄褌械 褖械.
+password_ok=袚邪褉邪蟹写
+password_cancel=小泻邪褋褍胁邪褌懈
+
+printing_not_supported=袩芯锌械褉械写卸械薪薪褟: 笑械泄 斜褉邪褍蟹械褉 薪械 锌芯胁薪褨褋褌褞 锌褨写褌褉懈屑褍褦 写褉褍泻.
+printing_not_ready=袩芯锌械褉械写卸械薪薪褟: PDF 薪械 锌芯胁薪褨褋褌褞 蟹邪胁邪薪褌邪卸械薪懈泄 写谢褟 写褉褍泻褍.
+web_fonts_disabled=袙械斜-褕褉懈褎褌懈 胁懈屑泻薪械薪芯: 薪械屑芯卸谢懈胁芯 胁懈泻芯褉懈褋褌邪褌懈 胁斜褍写芯胁邪薪褨 褍 PDF 褕褉懈褎褌懈.
+document_colors_not_allowed=PDF-写芯泻褍屑械薪褌邪屑 薪械 写芯蟹胁芯谢械薪芯 胁懈泻芯褉懈褋褌芯胁褍胁邪褌懈 胁谢邪褋薪褨 泻芯谢褜芯褉懈: 胁 斜褉邪褍蟹械褉褨 胁懈屑泻薪械薪芯 锌邪褉邪屑械褌褉 芦袛芯蟹胁芯谢懈褌懈 褋褌芯褉褨薪泻邪屑 胁懈泻芯褉懈褋褌芯胁褍胁邪褌懈 胁谢邪褋薪褨 泻芯谢褜芯褉懈禄.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ur/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ur/viewer.properties
new file mode 100644
index 0000000..ea6ba27
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/ur/viewer.properties
@@ -0,0 +1,207 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=倬趩诰賱丕 氐賮丨蹃
+previous_label=倬趩诰賱丕
+next.title=丕诏賱丕 氐賮丨蹃
+next_label=丌诏蹝
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=氐賮丨蹃
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages={{pagesCount}} 讴丕
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} 讴丕 {{pagesCount}})
+
+zoom_out.title=亘丕蹃乇 夭賵賲 讴乇蹖诤
+zoom_out_label=亘丕蹃乇 夭賵賲 讴乇蹖诤
+zoom_in.title=丕賳丿乇 夭賵賲 讴乇蹖诤
+zoom_in_label=丕賳丿乇 夭賵賲 讴乇蹖诤
+zoom.title=夭賵賲
+presentation_mode.title=倬蹖卮讴卮 賲賵趫 賲蹖诤 趩賱蹝 噩丕卅蹖诤
+presentation_mode_label=倬蹖卮讴卮 賲賵趫
+open_file.title=賲爻賱 讴诰賵賱蹖诤
+open_file_label=讴诰賵賱蹖诤
+print.title=趩诰丕倬蹖诤
+print_label=趩诰丕倬蹖诤
+download.title=趫丕丐賳 賱賵趫
+download_label=趫丕丐賳 賱賵趫
+bookmark.title=丨丕賱蹖蹃 賳馗丕乇蹃 (賳蹞 丿乇蹖趩蹃 賲蹖诤 賳賯賱 讴乇蹖诤 蹖丕 讴诰賵賱蹖诤)
+bookmark_label=丨丕賱蹖蹃 賳馗丕乇蹃
+
+# Secondary toolbar and context menu
+tools.title=丌賱丕鬲
+tools_label=丌賱丕鬲
+first_page.title=倬蹃賱蹝 氐賮丨蹃 倬乇 噩丕卅蹖诤
+first_page.label=倬蹃賱蹝 氐賮丨蹃 倬乇 噩丕卅蹖诤
+first_page_label=倬蹃賱蹝 氐賮丨蹃 倬乇 噩丕卅蹖诤
+last_page.title=丌禺乇蹖 氐賮丨蹃 倬乇 噩丕卅蹖诤
+last_page.label=丌禺乇蹖 氐賮丨蹃 倬乇 噩丕卅蹖诤
+last_page_label=丌禺乇蹖 氐賮丨蹃 倬乇 噩丕卅蹖诤
+page_rotate_cw.title=诏诰趹蹖 賵丕乇 诏诰賲丕卅蹖诤
+page_rotate_cw.label=诏诰趹蹖 賵丕乇 诏诰賲丕卅蹖诤
+page_rotate_cw_label=诏诰趹蹖 賵丕乇 诏诰賲丕卅蹖诤
+page_rotate_ccw.title=囟丿 诏诰趹蹖 賵丕乇 诏诰賲丕卅蹖诤
+page_rotate_ccw.label=囟丿 诏诰趹蹖 賵丕乇 诏诰賲丕卅蹖诤
+page_rotate_ccw_label=囟丿 诏诰趹蹖 賵丕乇 诏诰賲丕卅蹖诤
+
+
+
+
+# Document properties dialog box
+document_properties.title=丿爻鬲丕賵蹖夭 禺賵丕氐鈥�
+document_properties_label=丿爻鬲丕賵蹖夭 禺賵丕氐鈥u0020
+document_properties_file_name=賳丕賲 賲爻賱:
+document_properties_file_size=賲爻賱 爻丕卅夭:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=毓賳賵丕賳:
+document_properties_author=鬲禺賱蹖賯 讴丕乇:
+document_properties_subject=賲賵囟賵毓:
+document_properties_keywords=讴賱蹖丿蹖 丕賱賮丕馗:
+document_properties_creation_date=鬲禺賱蹖賯 讴蹖 鬲丕乇蹖禺:
+document_properties_modification_date=鬲乇賲蹖賲 讴蹖 鬲丕乇蹖禺:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}貙 {{time}}
+document_properties_creator=鬲禺賱蹖賯 讴丕乇:
+document_properties_producer=PDF 倬蹖丿丕 讴丕乇:
+document_properties_version=PDF 賵乇跇賳:
+document_properties_page_count=氐賮丨蹃 卮賲丕乇:
+document_properties_page_size=氐賮蹃 讴蹖 賱賲亘丕卅:
+document_properties_page_size_unit_inches=賲蹖诤
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=毓賲賵丿蹖 丕賳丿丕夭
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_legal=賯丕賳賵賳蹖
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized_yes=蹃丕诤
+document_properties_linearized_no=賳蹃蹖诤
+document_properties_close=亘賳丿 讴乇蹖诤
+
+print_progress_message=趩诰丕倬賳蹝 讴乇賳蹝 讴蹝 賱蹖蹝 丿爻鬲丕賵蹖夭 鬲蹖丕乇 讴蹖蹝 噩丕 乇诰蹝 诰蹖诤
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent=*{{progress}}%*
+print_progress_close=賲賳爻賵禺 讴乇蹖诤
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=爻賱丕卅蹖趫 俟賵诏賱 讴乇蹖诤
+toggle_sidebar_label=爻賱丕卅蹖趫 俟賵诏賱 讴乇蹖诤
+document_outline.title=丿爻鬲丕賵蹖夭 讴蹖 爻乇禺蹖丕诤 丿讴诰丕蹖诤 (鬲賲丕賲 丕卮蹖丕亍 賵爻蹖毓 / 睾丕卅亘 讴乇賳蹝 讴蹝 賱蹖蹝 趫亘賱 讴賱讴 讴乇蹖诤)
+document_outline_label=丿爻鬲丕賵蹖夭 丌丐俟 賱丕卅賳
+attachments.title=賲賳爻賱讴丕鬲 丿讴诰丕卅蹖诤
+attachments_label=賲賳爻賱讴丕鬲
+thumbs.title=鬲诰賲亘賳蹖賱 丿讴诰丕卅蹖诤
+thumbs_label=賲噩賲賱
+findbar.title=丿爻鬲丕賵蹖夭 賲蹖诤 趫诰賵賳趫蹖诤
+findbar_label=趫诰賵賳趫蹖诤
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=氐賮丨蹃 {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=氐賮丨蹝 讴丕 賲噩賲賱 {{page}}
+
+# Find panel button title and messages
+find_input.title=趫诰賵賳趫蹖诤
+find_input.placeholder=丿爻鬲丕賵蹖夭鈥� 賲蹖诤 趫诰賵賳趫蹖诤
+find_previous.title=賮賯乇蹝 讴丕 倬趩诰賱丕 賵賯賵毓 趫诰賵賳趫蹖诤
+find_previous_label=倬趩诰賱丕
+find_next.title=賮賯乇蹝 讴丕 丕诏賱蹃 賵賯賵毓 趫诰賵賳趫蹖诤
+find_next_label=丌诏蹝
+find_highlight=鬲賲丕賲 賳賲丕蹖丕诤 讴乇蹖诤
+find_match_case_label=丨乇賵賮 賲卮丕亘蹃 讴乇蹖诤
+find_reached_top=氐賮丨蹃 讴蹝 卮乇賵毓 倬乇 倬蹃賳趩 诏蹖丕貙 賳蹖趩蹝 爻蹝 噩丕乇蹖 讴蹖丕
+find_reached_bottom=氐賮丨蹃 讴蹝 丕禺鬲鬲丕賲 倬乇 倬蹃賳趩 诏蹖丕貙 丕賵倬乇 爻蹝 噩丕乇蹖 讴蹖丕
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_not_found=賮賯乇丕 賳蹃蹖诤 賲賱丕
+
+# Error panel labels
+error_more_info=賲夭蹖丿 賲毓賱賵賲丕鬲
+error_less_info=讴賲 賲毓賱賵賲丕鬲
+error_close=亘賳丿 讴乇蹖诤
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=倬蹖睾丕賲: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=爻俟蹖讴: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=賲爻賱: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=賱丕卅賳: {{line}}
+rendering_error=氐賮丨蹃 亘賳丕鬲蹝 蹃賵卅蹝 賳賯氐 丌 诏蹖丕蹟
+
+# Predefined zoom values
+page_scale_width=氐賮丨蹃 趩賵趹丕卅蹖
+page_scale_fit=氐賮丨蹃 賮俟賳诏
+page_scale_auto=禺賵丿讴丕乇 夭賵賲
+page_scale_actual=丕氐賱 爻丕卅夭
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=賳賯氐
+loading_error=PDF 賱賵趫 讴乇鬲蹝 賵賯鬲 賳賯氐 丌 诏蹖丕蹟
+invalid_file_error=賳丕噩丕卅夭 蹖丕 禺乇丕亘 PDF 賲爻賱
+missing_file_error=PDF 賲爻賱 睾丕卅亘 蹃蹝蹟
+unexpected_response_error=睾蹖乇賲鬲賵賯毓 倬蹖卮 讴丕乇 噩賵丕亘
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} 賳賵俟]
+password_label=PDF 賲爻賱 讴诰賵賱賳蹝 讴蹝 賱蹖蹝 倬丕爻 賵乇趫 丿丕禺賱 讴乇蹖诤.
+password_invalid=賳丕噩丕卅夭 倬丕爻 賵乇趫. 亘乇丕蹝貞 讴乇賲 丿賵亘丕乇蹃 讴賵卮卮 讴乇蹖诤.
+password_ok=爻蹃蹖
+password_cancel=賲賳爻賵禺 讴乇蹖诤
+
+printing_not_supported=鬲賳亘蹖蹃:趩诰丕倬賳丕 丕爻 亘乇丕丐夭乇 倬乇 倬賵乇蹖 胤乇丨 賲毓丕賵賳鬲 卮丿蹃 賳蹃蹖诤 蹃蹝蹟
+printing_not_ready=鬲賳亘蹖蹃: PDF 趩诰倬丕卅蹖 讴蹝 賱蹖蹝 倬賵乇蹖 胤乇丨 賱賵趫 賳蹃蹖诤 蹃賵卅蹖蹟
+web_fonts_disabled=賵蹖亘 賮丕賳俟 賳丕 丕蹃賱 蹃蹖诤: 卮丕賲賱 PDF 賮丕賳俟 丕爻鬲毓賲丕賱 讴乇賳蹝 賲蹖诤 賳丕讴丕賲蹟
+document_colors_not_allowed=PDF 丿爻鬲丕賵蹖夭丕鬲 讴賵 丕倬賳蹝 乇賳诏 丕爻鬲毓賲丕賱 讴乇賳蹝 讴蹖 丕噩丕夭鬲 賳蹃蹖诤: '氐賮丨丕鬲 讴賵 丕倬賳蹝 乇賳诏 趩賳蹖诤' 讴蹖 丕賽噩丕夭鬲 亘乇丕丐夭乇 賲蹖诤 亘蹝 毓賲賱 蹃蹝蹟
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/uz/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/uz/viewer.properties
new file mode 100644
index 0000000..e451c74
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/uz/viewer.properties
@@ -0,0 +1,169 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Oldingi sahifa
+previous_label=Oldingi
+next.title=Keyingi sahifa
+next_label=Keyingi
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=/{{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+
+zoom_out.title=Kichiklashtirish
+zoom_out_label=Kichiklashtirish
+zoom_in.title=Kattalashtirish
+zoom_in_label=Kattalashtirish
+zoom.title=Masshtab
+presentation_mode.title=Namoyish usuliga o驶tish
+presentation_mode_label=Namoyish usuli
+open_file.title=Faylni ochish
+open_file_label=Ochish
+print.title=Chop qilish
+print_label=Chop qilish
+download.title=Yuklab olish
+download_label=Yuklab olish
+bookmark.title=Joriy ko驶rinish (nusxa oling yoki yangi oynada oching)
+bookmark_label=Joriy ko驶rinish
+
+# Secondary toolbar and context menu
+tools.title=Vositalar
+tools_label=Vositalar
+first_page.title=Birinchi sahifaga o驶tish
+first_page.label=Birinchi sahifaga o驶tish
+first_page_label=Birinchi sahifaga o驶tish
+last_page.title=So驶nggi sahifaga o驶tish
+last_page.label=So驶nggi sahifaga o驶tish
+last_page_label=So驶nggi sahifaga o驶tish
+page_rotate_cw.title=Soat yo驶nalishi bo驶yicha burish
+page_rotate_cw.label=Soat yo驶nalishi bo驶yicha burish
+page_rotate_cw_label=Soat yo驶nalishi bo驶yicha burish
+page_rotate_ccw.title=Soat yo驶nalishiga qarshi burish
+page_rotate_ccw.label=Soat yo驶nalishiga qarshi burish
+page_rotate_ccw_label=Soat yo驶nalishiga qarshi burish
+
+
+# Document properties dialog box
+document_properties.title=Hujjat xossalari
+document_properties_label=Hujjat xossalari
+document_properties_file_name=Fayl nomi:
+document_properties_file_size=Fayl hajmi:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+document_properties_title=Nomi:
+document_properties_author=Muallifi:
+document_properties_subject=Mavzusi:
+document_properties_keywords=Kalit so鈥榸lar
+document_properties_creation_date=Yaratilgan sanasi:
+document_properties_modification_date=O鈥榸gartirilgan sanasi
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Yaratuvchi:
+document_properties_producer=PDF ishlab chiqaruvchi:
+document_properties_version=PDF versiyasi:
+document_properties_page_count=Sahifa soni:
+document_properties_close=Yopish
+
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Yon panelni yoqib/o驶chirib qo驶yish
+toggle_sidebar_label=Yon panelni yoqib/o驶chirib qo驶yish
+document_outline_label=Hujjat tuzilishi
+attachments.title=Ilovalarni ko鈥榬satish
+attachments_label=Ilovalar
+thumbs.title=Nishonchalarni ko驶rsatish
+thumbs_label=Nishoncha
+findbar.title=Hujjat ichidan topish
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title={{page}} sahifa
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas={{page}} sahifa nishonchasi
+
+# Find panel button title and messages
+find_previous.title=So驶zlardagi oldingi hodisani topish
+find_previous_label=Oldingi
+find_next.title=Iboradagi keyingi hodisani topish
+find_next_label=Keyingi
+find_highlight=Barchasini ajratib ko驶rsatish
+find_match_case_label=Katta-kichik harflarni farqlash
+find_reached_top=Hujjatning boshigacha yetib keldik, pastdan davom ettiriladi
+find_reached_bottom=Hujjatning oxiriga yetib kelindi, yuqoridan davom ettirladi
+find_not_found=So驶zlar topilmadi
+
+# Error panel labels
+error_more_info=Ko驶proq ma`lumot
+error_less_info=Kamroq ma`lumot
+error_close=Yopish
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Xabar: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=To驶plam: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Fayl: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Satr: {{line}}
+rendering_error=Sahifa renderlanayotganda xato yuz berdi.
+
+# Predefined zoom values
+page_scale_width=Sahifa eni
+page_scale_fit=Sahifani moslashtirish
+page_scale_auto=Avtomatik masshtab
+page_scale_actual=Haqiqiy hajmi
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Xato
+loading_error=PDF yuklanayotganda xato yuz berdi.
+invalid_file_error=Xato yoki buzuq PDF fayli.
+missing_file_error=PDF fayl kerak.
+unexpected_response_error=Kutilmagan server javobi.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Annotation]
+password_label=PDF faylni ochish uchun parolni kiriting.
+password_invalid=Parol - noto驶g驶ri. Qaytadan urinib ko驶ring.
+password_ok=OK
+
+printing_not_supported=Diqqat: chop qilish bruzer tomonidan to驶liq qo驶llab-quvvatlanmaydi.
+printing_not_ready=Diqqat: PDF fayl chop qilish uchun to驶liq yuklanmadi.
+web_fonts_disabled=Veb shriftlar o驶chirilgan: ichki PDF shriftlardan foydalanib bo驶lmmaydi.
+document_colors_not_allowed=PDF hujjat o驶zining ranglaridan foydalanishga ruxsat bermaydi: 'Sahifalarga o驶zining rangidan foydalanishga ruxsat berish' ushbu brauzerda o驶chirib qo驶yilgan.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/vi/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/vi/viewer.properties
new file mode 100644
index 0000000..598eaa8
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/vi/viewer.properties
@@ -0,0 +1,205 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Trang Tr瓢峄沜
+previous_label=Tr瓢峄沜
+next.title=Trang Sau
+next_label=Ti岷縫
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=Trang
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=tr锚n {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} tr锚n {{pagesCount}})
+
+zoom_out.title=Thu nh峄�
+zoom_out_label=Thu nh峄�
+zoom_in.title=Ph贸ng to
+zoom_in_label=Ph贸ng to
+zoom.title=Ch峄塶h k铆ch th瓢峄沜
+presentation_mode.title=Chuy峄僴 sang ch岷� 膽峄� tr矛nh chi岷縰
+presentation_mode_label=Ch岷� 膽峄� tr矛nh chi岷縰
+open_file.title=M峄� t岷璸 tin
+open_file_label=M峄� t岷璸 tin
+print.title=In
+print_label=In
+download.title=T岷 xu峄憂g
+download_label=T岷 xu峄憂g
+bookmark.title=G贸c nh矛n hi峄噉 t岷 (copy ho岷穋 m峄� trong c峄璦 s峄� m峄沬)
+bookmark_label=Ch岷� 膽峄� xem hi峄噉 t岷
+
+# Secondary toolbar and context menu
+tools.title=C么ng c峄�
+tools_label=C么ng c峄�
+first_page.title=V峄� trang 膽岷
+first_page.label=V峄� trang 膽岷
+first_page_label=V峄� trang 膽岷
+last_page.title=膼岷縩 trang cu峄慽
+last_page.label=膼岷縩 trang cu峄慽
+last_page_label=膼岷縩 trang cu峄慽
+page_rotate_cw.title=Xoay theo chi峄乽 kim 膽峄搉g h峄�
+page_rotate_cw.label=Xoay theo chi峄乽 kim 膽峄搉g h峄�
+page_rotate_cw_label=Xoay theo chi峄乽 kim 膽峄搉g h峄�
+page_rotate_ccw.title=Xoay ng瓢峄 chi峄乽 kim 膽峄搉g h峄�
+page_rotate_ccw.label=Xoay ng瓢峄 chi峄乽 kim 膽峄搉g h峄�
+page_rotate_ccw_label=Xoay ng瓢峄 chi峄乽 kim 膽峄搉g h峄�
+
+cursor_text_select_tool.title=B岷璽 c么ng c峄� ch峄峮 v霉ng v膬n b岷
+cursor_text_select_tool_label=C么ng c峄� ch峄峮 v霉ng v膬n b岷
+cursor_hand_tool.title=B岷璽 c么ng c峄� con tr峄�
+cursor_hand_tool_label=C么ng c峄� con tr峄�
+
+
+
+# Document properties dialog box
+document_properties.title=Thu峄檆 t铆nh c峄 t脿i li峄噓鈥�
+document_properties_label=Thu峄檆 t铆nh c峄 t脿i li峄噓鈥�
+document_properties_file_name=T锚n t岷璸 tin:
+document_properties_file_size=K铆ch th瓢峄沜:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} byte)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} byte)
+document_properties_title=Ti锚u 膽峄�:
+document_properties_author=T谩c gi岷�:
+document_properties_subject=Ch峄� 膽峄�:
+document_properties_keywords=T峄� kh贸a:
+document_properties_creation_date=Ng脿y t岷:
+document_properties_modification_date=Ng脿y s峄璦 膽峄昳:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Ng瓢峄漣 t岷:
+document_properties_producer=Ph岷 m峄乵 t岷 PDF:
+document_properties_version=Phi锚n b岷 PDF:
+document_properties_page_count=T峄昻g s峄� trang:
+document_properties_page_size_unit_inches=in
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=kh峄� d峄峜
+document_properties_page_size_orientation_landscape=kh峄� ngang
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_legal=Ph谩p l媒
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}} ({{orientation}})
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}} ({{name}}, {{orientation}})
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized_yes=C贸
+document_properties_linearized_no=Kh么ng
+document_properties_close=脨贸ng
+
+print_progress_message=Chu岷﹏ b峄� trang 膽峄� in鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=H峄 b峄�
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=B岷璽/T岷痶 thanh l峄�
+toggle_sidebar_notification.title=B岷璽 t岷痶 thanh l峄� (t脿i li峄噓 bao g峄搈 b岷 ph谩c th岷/t岷璸 tin 膽铆nh k猫m)
+toggle_sidebar_label=B岷璽/T岷痶 thanh l峄�
+document_outline.title=Hi峄噉 t脿i li峄噓 ph谩c th岷 (nh岷 膽煤p v脿o 膽峄� m峄� r峄檔g/thu g峄峮 t岷 c岷� c谩c m峄)
+document_outline_label=B岷 ph谩c t脿i li峄噓
+attachments.title=Hi峄噉 n峄檌 dung 膽铆nh k猫m
+attachments_label=N峄檌 dung 膽铆nh k猫m
+thumbs.title=Hi峄僴 th峄� 岷h thu nh峄�
+thumbs_label=岷h thu nh峄�
+findbar.title=T矛m trong t脿i li峄噓
+findbar_label=T矛m
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Trang {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=岷h thu nh峄� c峄 trang {{page}}
+
+# Find panel button title and messages
+find_input.title=T矛m
+find_input.placeholder=T矛m trong t脿i li峄噓鈥�
+find_previous.title=T矛m c峄 t峄� 峄� ph岷 tr瓢峄沜
+find_previous_label=Tr瓢峄沜
+find_next.title=T矛m c峄 t峄� 峄� ph岷 sau
+find_next_label=Ti岷縫
+find_highlight=T么 s谩ng t岷 c岷�
+find_match_case_label=Ph芒n bi峄噒 hoa, th瓢峄漬g
+find_reached_top=膼茫 膽岷縩 ph岷 膽岷 t脿i li峄噓, quay tr峄� l岷 t峄� cu峄慽
+find_reached_bottom=膼茫 膽岷縩 ph岷 cu峄慽 c峄 t脿i li峄噓, quay tr峄� l岷 t峄� 膽岷
+find_not_found=Kh么ng t矛m th岷 c峄 t峄� n脿y
+
+# Error panel labels
+error_more_info=Th么ng tin th锚m
+error_less_info=Hi峄僴 th峄� 铆t th么ng tin h啤n
+error_close=膼贸ng
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Th么ng 膽i峄噋: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Stack: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=T岷璸 tin: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=D貌ng: {{line}}
+rendering_error=L峄梚 khi hi峄僴 th峄� trang.
+
+# Predefined zoom values
+page_scale_width=V峄玜 chi峄乽 r峄檔g
+page_scale_fit=V峄玜 chi峄乽 cao
+page_scale_auto=T峄� 膽峄檔g ch峄峮 k铆ch th瓢峄沜
+page_scale_actual=K铆ch th瓢峄沜 th峄眂
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=L峄梚
+loading_error=L峄梚 khi t岷 t脿i li峄噓 PDF.
+invalid_file_error=T岷璸 tin PDF h峄弉g ho岷穋 kh么ng h峄 l峄�.
+missing_file_error=Thi岷縰 t岷璸 tin PDF.
+unexpected_response_error=M谩y ch峄� c贸 ph岷 h峄搃 l岷�.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Ch煤 th铆ch]
+password_label=Nh岷璸 m岷璽 kh岷﹗ 膽峄� m峄� t岷璸 tin PDF n脿y.
+password_invalid=M岷璽 kh岷﹗ kh么ng 膽煤ng. Vui l貌ng th峄� l岷.
+password_ok=OK
+password_cancel=H峄 b峄�
+
+printing_not_supported=C岷h b谩o: In 岷 kh么ng 膽瓢峄 h峄� tr峄� 膽岷 膽峄� 峄� tr矛nh duy峄噒 n脿y.
+printing_not_ready=C岷h b谩o: PDF ch瓢a 膽瓢峄 t岷 h岷縯 膽峄� in.
+web_fonts_disabled=Ph么ng ch峄� Web b峄� v么 hi峄噓 h贸a: kh么ng th峄� s峄� d峄g c谩c ph么ng ch峄� PDF 膽瓢峄 nh煤ng.
+document_colors_not_allowed=T脿i li峄噓 PDF kh么ng 膽瓢峄 cho ph茅p d霉ng m脿u ri锚ng: 'Cho ph茅p trang ch峄峮 m脿u ri锚ng' 膽茫 b峄� t岷痶 tr锚n tr矛nh duy峄噒.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/wo/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/wo/viewer.properties
new file mode 100644
index 0000000..38c7bc1
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/wo/viewer.properties
@@ -0,0 +1,124 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=X毛t wi jiitu
+previous_label=Bi jiitu
+next.title=X毛t wi ci topp
+next_label=Bi ci topp
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+
+zoom_out.title=W脿帽帽i
+zoom_out_label=W脿帽帽i
+zoom_in.title=Yaatal
+zoom_in_label=Yaatal
+zoom.title=Yambala艐
+presentation_mode.title=Wa帽ar帽il ci anamu wone
+presentation_mode_label=Anamu Wone
+open_file.title=Ubbi benn dencukaay
+open_file_label=Ubbi
+print.title=M贸ol
+print_label=M贸ol
+download.title=Yeb yi
+download_label=Yeb yi
+bookmark.title=Wone bi taxaw (duppi walla ubbi palanteer bu bees)
+bookmark_label=Wone bi fee帽
+
+# Secondary toolbar and context menu
+
+
+# Document properties dialog box
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_title=Bopp:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+thumbs.title=Wone nataal yu ndaw yi
+thumbs_label=Nataal yu ndaw yi
+findbar.title=Gis ci biir jukki bi
+findbar_label=Wut
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=X毛t {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Wi帽et bu x毛t {{page}}
+
+# Find panel button title and messages
+find_previous.title=Seet beneen kaddu bu ni mel te jiitu
+find_previous_label=Bi jiitu
+find_next.title=Seet beneen kaddu bu ni mel
+find_next_label=Bi ci topp
+find_highlight=Melaxal l茅pp
+find_match_case_label=S脿mm j毛mmalin wi
+find_reached_top=Jot na帽u ndorteel x毛t wi, kontine dale ko ci suuf
+find_reached_bottom=Jot na帽u jeexitalu x毛t wi, kontine ci ndorte
+find_not_found=Gisi帽u kaddu gi
+
+# Error panel labels
+error_more_info=Xibaar yu g毛n bari
+error_less_info=Xibaar yu g毛n bari
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Bataaxal: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Juug: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Dencukaay: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=R毛dd聽: {{line}}
+rendering_error=Am njumte bu am bi x毛t bi di wonewu.
+
+# Predefined zoom values
+page_scale_width=Yaatuwaay bu m毛t
+page_scale_fit=X毛t l毛mm
+page_scale_auto=Yambala艐 ci saa si
+page_scale_actual=Dayo bi am
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+
+# Loading indicator messages
+loading_error_indicator=Njumte
+loading_error=Am na njumte ci yebum dencukaay PDF bi.
+invalid_file_error=Dencukaay PDF bi baaxul walla mu sankar.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[Karmat {{type}}]
+password_ok=OK
+password_cancel=Neenal
+
+printing_not_supported=Artu: Joowkat bii nanguwul lool mool.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/xh/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/xh/viewer.properties
new file mode 100644
index 0000000..1fa394b
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/xh/viewer.properties
@@ -0,0 +1,184 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Iphepha langaphambili
+previous_label=Okwangaphambili
+next.title=Iphepha elilandelayo
+next_label=Okulandelayo
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=Iphepha
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=kwali- {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} kwali {{pagesCount}})
+
+zoom_out.title=Bhekelisela Kudana
+zoom_out_label=Bhekelisela Kudana
+zoom_in.title=Sondeza Kufuphi
+zoom_in_label=Sondeza Kufuphi
+zoom.title=Yandisa / Nciphisa
+presentation_mode.title=Tshintshela kwimo yonikezelo
+presentation_mode_label=Imo yonikezelo
+open_file.title=Vula Ifayile
+open_file_label=Vula
+print.title=Printa
+print_label=Printa
+download.title=Khuphela
+download_label=Khuphela
+bookmark.title=Imbonakalo ekhoyo (kopa okanye vula kwifestile entsha)
+bookmark_label=Imbonakalo ekhoyo
+
+# Secondary toolbar and context menu
+tools.title=Izixhobo zemiyalelo
+tools_label=Izixhobo zemiyalelo
+first_page.title=Yiya kwiphepha lokuqala
+first_page.label=Yiya kwiphepha lokuqala
+first_page_label=Yiya kwiphepha lokuqala
+last_page.title=Yiya kwiphepha lokugqibela
+last_page.label=Yiya kwiphepha lokugqibela
+last_page_label=Yiya kwiphepha lokugqibela
+page_rotate_cw.title=Jikelisa ngasekunene
+page_rotate_cw.label=Jikelisa ngasekunene
+page_rotate_cw_label=Jikelisa ngasekunene
+page_rotate_ccw.title=Jikelisa ngasekhohlo
+page_rotate_ccw.label=Jikelisa ngasekhohlo
+page_rotate_ccw_label=Jikelisa ngasekhohlo
+
+cursor_text_select_tool.title=Vumela iSixhobo sokuKhetha iTeksti
+cursor_text_select_tool_label=ISixhobo sokuKhetha iTeksti
+cursor_hand_tool.title=Yenza iSixhobo seSandla siSebenze
+cursor_hand_tool_label=ISixhobo seSandla
+
+# Document properties dialog box
+document_properties.title=Iipropati zoxwebhu鈥�
+document_properties_label=Iipropati zoxwebhu鈥�
+document_properties_file_name=Igama lefayile:
+document_properties_file_size=Isayizi yefayile:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB (iibhayiti{{size_b}})
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB (iibhayithi{{size_b}})
+document_properties_title=Umxholo:
+document_properties_author=Umbhali:
+document_properties_subject=Umbandela:
+document_properties_keywords=Amagama aphambili:
+document_properties_creation_date=Umhla wokwenziwa kwayo:
+document_properties_modification_date=Umhla wokulungiswa kwayo:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=Umntu oyenzileyo:
+document_properties_producer=Umvelisi we-PDF:
+document_properties_version=Uhlelo lwe-PDF:
+document_properties_page_count=Inani lamaphepha:
+document_properties_close=Vala
+
+print_progress_message=Ilungisa uxwebhu ukuze iprinte鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=Rhoxisa
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=Togola ngebha eseCaleni
+toggle_sidebar_notification.title=ISidebar yeQhosha (uxwebhu lunolwandlalo/iziqhotyoshelwa)
+toggle_sidebar_label=Togola ngebha eseCaleni
+document_outline.title=Bonisa uLwandlalo loXwebhu (cofa kabini ukuze wandise/diliza zonke izinto)
+document_outline_label=Isishwankathelo soxwebhu
+attachments.title=Bonisa iziqhotyoshelwa
+attachments_label=Iziqhoboshelo
+thumbs.title=Bonisa ukrobiso kumfanekiso
+thumbs_label=Ukrobiso kumfanekiso
+findbar.title=Fumana kuXwebhu
+findbar_label=Fumana
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Iphepha {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Ukrobiso kumfanekiso wephepha {{page}}
+
+# Find panel button title and messages
+find_input.title=Fumana
+find_input.placeholder=Fumana kuXwebhu鈥�
+find_previous.title=Fumanisa isenzeko sangaphambili sebinzana lamagama
+find_previous_label=Okwangaphambili
+find_next.title=Fumanisa isenzeko esilandelayo sebinzana lamagama
+find_next_label=Okulandelayo
+find_highlight=Qaqambisa konke
+find_match_case_label=Tshatisa ngobukhulu bukanobumba
+find_reached_top=Ufike ngaphezulu ephepheni, kusukwa ngezantsi
+find_reached_bottom=Ufike ekupheleni kwephepha, kusukwa ngaphezulu
+find_not_found=Ibinzana alifunyenwanga
+
+# Error panel labels
+error_more_info=Inkcazelo Engakumbi
+error_less_info=Inkcazelo Encinane
+error_close=Vala
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=I-PDF.js v{{version}} (yakha: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Umyalezo: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Imfumba: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Ifayile: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Umgca: {{line}}
+rendering_error=Imposiso yenzekile xa bekunikezelwa iphepha.
+
+# Predefined zoom values
+page_scale_width=Ububanzi bephepha
+page_scale_fit=Ukulinganiswa kwephepha
+page_scale_auto=Ukwandisa/Ukunciphisa Ngokwayo
+page_scale_actual=Ubungakanani bokwenene
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=Imposiso
+loading_error=Imposiso yenzekile xa kulayishwa i-PDF.
+invalid_file_error=Ifayile ye-PDF engeyiyo okanye eyonakalisiweyo.
+missing_file_error=Ifayile ye-PDF edukileyo.
+unexpected_response_error=Impendulo yeseva engalindelekanga.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} Ubhalo-nqaku]
+password_label=Faka ipasiwedi ukuze uvule le fayile yePDF.
+password_invalid=Ipasiwedi ayisebenzi. Nceda uzame kwakhona.
+password_ok=KULUNGILE
+password_cancel=Rhoxisa
+
+printing_not_supported=Isilumkiso: Ukuprinta akuxhaswa ngokupheleleyo yile bhrawuza.
+printing_not_ready=Isilumkiso: IPDF ayihlohlwanga ngokupheleleyo ukwenzela ukuprinta.
+web_fonts_disabled=Iifonti zewebhu ziqhwalelisiwe: ayikwazi ukusebenzisa iifonti ze-PDF ezincanyathelisiweyo.
+document_colors_not_allowed=Amaxwebhu ePDF akavumelekanga ukuba asebenzise imibala yawo: 'Ukuvumela amaphepha ukuba asebenzise eyawo imibala' kuvaliwe ukuba kungasebenzi kwibhrawuza.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/zam/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/zam/viewer.properties
new file mode 100644
index 0000000..b9a2055
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/zam/viewer.properties
@@ -0,0 +1,90 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+
+zoom_out.title=Lii lut ah
+zoom_out_label=Lii lut ah
+zoom_in.title=Lii mach ah
+zoom_in_label=Lii mach ah
+zoom.title=Xha niey
+open_file.title=Xhal yets ndedizh
+open_file_label=Xhal
+
+# Secondary toolbar and context menu
+tools.title=Koo lii chel
+tools_label=Koo lii chel
+
+
+# Document properties dialog box
+document_properties.title=S谩 n矛e y锚tz...
+document_properties_label=S谩 n矛e y锚tz...
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} bytes)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} bytes)
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_close=T貌蓙w
+
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+attachments.title=Mb-&l貌蓙 y锚tz
+thumbs_label=Thumbnails
+findbar.title=G貌z膬蓙l l猫蓙n y锚tz
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+
+# Find panel button title and messages
+
+# Error panel labels
+error_close=T貌蓙w
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+
+# Predefined zoom values
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+
+# Loading indicator messages
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+password_ok=Bliy
+
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/zh-CN/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/zh-CN/viewer.properties
new file mode 100644
index 0000000..463d9fa
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/zh-CN/viewer.properties
@@ -0,0 +1,242 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=涓婁竴椤�
+previous_label=涓婁竴椤�
+next.title=涓嬩竴椤�
+next_label=涓嬩竴椤�
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=椤甸潰
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=/ {{pagesCount}}
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=({{pageNumber}} / {{pagesCount}})
+
+zoom_out.title=缂╁皬
+zoom_out_label=缂╁皬
+zoom_in.title=鏀惧ぇ
+zoom_in_label=鏀惧ぇ
+zoom.title=缂╂斁
+presentation_mode.title=鍒囨崲鍒版紨绀烘ā寮�
+presentation_mode_label=婕旂ず妯″紡
+open_file.title=鎵撳紑鏂囦欢
+open_file_label=鎵撳紑
+print.title=鎵撳嵃
+print_label=鎵撳嵃
+download.title=涓嬭浇
+download_label=涓嬭浇
+bookmark.title=褰撳墠鍦ㄧ湅鐨勫唴瀹癸紙澶嶅埗鎴栧湪鏂扮獥鍙d腑鎵撳紑锛�
+bookmark_label=褰撳墠鍦ㄧ湅
+
+# Secondary toolbar and context menu
+tools.title=宸ュ叿
+tools_label=宸ュ叿
+first_page.title=杞埌绗竴椤�
+first_page.label=杞埌绗竴椤�
+first_page_label=杞埌绗竴椤�
+last_page.title=杞埌鏈�鍚庝竴椤�
+last_page.label=杞埌鏈�鍚庝竴椤�
+last_page_label=杞埌鏈�鍚庝竴椤�
+page_rotate_cw.title=椤烘椂閽堟棆杞�
+page_rotate_cw.label=椤烘椂閽堟棆杞�
+page_rotate_cw_label=椤烘椂閽堟棆杞�
+page_rotate_ccw.title=閫嗘椂閽堟棆杞�
+page_rotate_ccw.label=閫嗘椂閽堟棆杞�
+page_rotate_ccw_label=閫嗘椂閽堟棆杞�
+
+cursor_text_select_tool.title=鍚敤鏂囨湰閫夋嫨宸ュ叿
+cursor_text_select_tool_label=鏂囨湰閫夋嫨宸ュ叿
+cursor_hand_tool.title=鍚敤鎵嬪舰宸ュ叿
+cursor_hand_tool_label=鎵嬪舰宸ュ叿
+
+scroll_vertical.title=浣跨敤鍨傜洿婊氬姩
+scroll_vertical_label=鍨傜洿婊氬姩
+scroll_horizontal.title=浣跨敤姘村钩婊氬姩
+scroll_horizontal_label=姘村钩婊氬姩
+scroll_wrapped.title=浣跨敤骞抽摵婊氬姩
+scroll_wrapped_label=骞抽摵婊氬姩
+
+spread_none.title=涓嶅姞鍏ヨ鎺ラ〉
+spread_none_label=鍗曢〉瑙嗗浘
+spread_odd.title=鍔犲叆琛旀帴椤典娇濂囨暟椤典綔涓鸿捣濮嬮〉
+spread_odd_label=鍙岄〉瑙嗗浘
+spread_even.title=鍔犲叆琛旀帴椤典娇鍋舵暟椤典綔涓鸿捣濮嬮〉
+spread_even_label=涔︾睄瑙嗗浘
+
+# Document properties dialog box
+document_properties.title=鏂囨。灞炴�р��
+document_properties_label=鏂囨。灞炴�р��
+document_properties_file_name=鏂囦欢鍚�:
+document_properties_file_size=鏂囦欢澶у皬:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB ({{size_b}} 瀛楄妭)
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB ({{size_b}} 瀛楄妭)
+document_properties_title=鏍囬:
+document_properties_author=浣滆��:
+document_properties_subject=涓婚:
+document_properties_keywords=鍏抽敭璇�:
+document_properties_creation_date=鍒涘缓鏃ユ湡:
+document_properties_modification_date=淇敼鏃ユ湡:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=鍒涘缓鑰�:
+document_properties_producer=PDF 鐢熸垚鍣細
+document_properties_version=PDF 鐗堟湰:
+document_properties_page_count=椤垫暟:
+document_properties_page_size=椤甸潰澶у皬锛�
+document_properties_page_size_unit_inches=鑻卞
+document_properties_page_size_unit_millimeters=姣背
+document_properties_page_size_orientation_portrait=绾靛悜
+document_properties_page_size_orientation_landscape=妯悜
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=鏂囨湰
+document_properties_page_size_name_legal=娉曞緥
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}}锛坽{orientation}}锛�
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}}锛坽{name}}锛寋{orientation}}锛�
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=蹇�� Web 瑙嗗浘锛�
+document_properties_linearized_yes=鏄�
+document_properties_linearized_no=鍚�
+document_properties_close=鍏抽棴
+
+print_progress_message=姝e湪鍑嗗鎵撳嵃鏂囨。鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=鍙栨秷
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=鍒囨崲渚ф爮
+toggle_sidebar_notification.title=鍒囨崲渚ф爮锛堟枃妗f墍鍚殑澶х翰/闄勪欢锛�
+toggle_sidebar_label=鍒囨崲渚ф爮
+document_outline.title=鏄剧ず鏂囨。澶х翰锛堝弻鍑诲睍寮�/鎶樺彔鎵�鏈夐」锛�
+document_outline_label=鏂囨。澶х翰
+attachments.title=鏄剧ず闄勪欢
+attachments_label=闄勪欢
+thumbs.title=鏄剧ず缂╃暐鍥�
+thumbs_label=缂╃暐鍥�
+findbar.title=鍦ㄦ枃妗d腑鏌ユ壘
+findbar_label=鏌ユ壘
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=椤电爜 {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=椤甸潰 {{page}} 鐨勭缉鐣ュ浘
+
+# Find panel button title and messages
+find_input.title=鏌ユ壘
+find_input.placeholder=鍦ㄦ枃妗d腑鏌ユ壘鈥�
+find_previous.title=鏌ユ壘璇嶈涓婁竴娆″嚭鐜扮殑浣嶇疆
+find_previous_label=涓婁竴椤�
+find_next.title=鏌ユ壘璇嶈鍚庝竴娆″嚭鐜扮殑浣嶇疆
+find_next_label=涓嬩竴椤�
+find_highlight=鍏ㄩ儴楂樹寒鏄剧ず
+find_match_case_label=鍖哄垎澶у皬鍐�
+find_entire_word_label=瀛楄瘝鍖归厤
+find_reached_top=鍒拌揪鏂囨。寮�澶达紝浠庢湯灏剧户缁�
+find_reached_bottom=鍒拌揪鏂囨。鏈熬锛屼粠寮�澶寸户缁�
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]=绗� {{current}} 椤癸紝鍏卞尮閰� {{total}} 椤�
+find_match_count[two]=绗� {{current}} 椤癸紝鍏卞尮閰� {{total}} 椤�
+find_match_count[few]=绗� {{current}} 椤癸紝鍏卞尮閰� {{total}} 椤�
+find_match_count[many]=绗� {{current}} 椤癸紝鍏卞尮閰� {{total}} 椤�
+find_match_count[other]=绗� {{current}} 椤癸紝鍏卞尮閰� {{total}} 椤�
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]=瓒呰繃 {{limit}} 椤瑰尮閰�
+find_match_count_limit[one]=瓒呰繃 {{limit}} 椤瑰尮閰�
+find_match_count_limit[two]=瓒呰繃 {{limit}} 椤瑰尮閰�
+find_match_count_limit[few]=瓒呰繃 {{limit}} 椤瑰尮閰�
+find_match_count_limit[many]=瓒呰繃 {{limit}} 椤瑰尮閰�
+find_match_count_limit[other]=瓒呰繃 {{limit}} 椤瑰尮閰�
+find_not_found=鎵句笉鍒版寚瀹氳瘝璇�
+
+# Error panel labels
+error_more_info=鏇村淇℃伅
+error_less_info=鏇村皯淇℃伅
+error_close=鍏抽棴
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=淇℃伅锛歿{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=鍫嗘爤锛歿{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=鏂囦欢锛歿{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=琛屽彿锛歿{line}}
+rendering_error=娓叉煋椤甸潰鏃跺彂鐢熼敊璇��
+
+# Predefined zoom values
+page_scale_width=閫傚悎椤靛
+page_scale_fit=閫傚悎椤甸潰
+page_scale_auto=鑷姩缂╂斁
+page_scale_actual=瀹為檯澶у皬
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=閿欒
+loading_error=杞藉叆 PDF 鏃跺彂鐢熼敊璇��
+invalid_file_error=鏃犳晥鎴栨崯鍧忕殑 PDF 鏂囦欢銆�
+missing_file_error=缂哄皯 PDF 鏂囦欢銆�
+unexpected_response_error=鎰忓鐨勬湇鍔″櫒鍝嶅簲銆�
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} 娉ㄩ噴]
+password_label=杈撳叆瀵嗙爜浠ユ墦寮�姝� PDF 鏂囦欢銆�
+password_invalid=瀵嗙爜鏃犳晥銆傝閲嶈瘯銆�
+password_ok=纭畾
+password_cancel=鍙栨秷
+
+printing_not_supported=璀﹀憡锛氭娴忚鍣ㄥ皻鏈畬鏁存敮鎸佹墦鍗板姛鑳姐��
+printing_not_ready=璀﹀憡锛氳 PDF 鏈畬鍏ㄨ浇鍏ヤ互渚涙墦鍗般��
+web_fonts_disabled=Web 瀛椾綋宸茶绂佺敤锛氭棤娉曚娇鐢ㄥ祵鍏ョ殑 PDF 瀛椾綋銆�
+document_colors_not_allowed=PDF 鏂囨。鏃犳硶浣跨敤鑷繁鐨勯鑹诧細娴忚鍣ㄤ腑鈥滃厑璁搁〉闈㈤�夋嫨鑷繁鐨勯鑹测�濈殑閫夐」鏈鍕鹃�夈��
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/zh-TW/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/zh-TW/viewer.properties
new file mode 100644
index 0000000..f03f8db
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/zh-TW/viewer.properties
@@ -0,0 +1,242 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=涓婁竴闋�
+previous_label=涓婁竴闋�
+next.title=涓嬩竴闋�
+next_label=涓嬩竴闋�
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+page.title=绗�
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+of_pages=闋侊紝鍏� {{pagesCount}} 闋�
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+page_of_pages=锛堢 {{pageNumber}} 闋侊紝鍏� {{pagesCount}} 闋侊級
+
+zoom_out.title=绺皬
+zoom_out_label=绺皬
+zoom_in.title=鏀惧ぇ
+zoom_in_label=鏀惧ぇ
+zoom.title=绺斁
+presentation_mode.title=鍒囨彌鑷崇啊鍫辨ā寮�
+presentation_mode_label=绨″牨妯″紡
+open_file.title=闁嬪暉妾旀
+open_file_label=闁嬪暉
+print.title=鍒楀嵃
+print_label=鍒楀嵃
+download.title=涓嬭級
+download_label=涓嬭級
+bookmark.title=鐩墠妾㈣鐨勫収瀹癸紙瑜囪=鎴栭枊鍟熸柤鏂拌绐楋級
+bookmark_label=鐩墠妾㈣
+
+# Secondary toolbar and context menu
+tools.title=宸ュ叿
+tools_label=宸ュ叿
+first_page.title=璺冲埌绗竴闋�
+first_page.label=璺冲埌绗竴闋�
+first_page_label=璺冲埌绗竴闋�
+last_page.title=璺冲埌鏈�寰屼竴闋�
+last_page.label=璺冲埌鏈�寰屼竴闋�
+last_page_label=璺冲埌鏈�寰屼竴闋�
+page_rotate_cw.title=闋嗘檪閲濇棆杞�
+page_rotate_cw.label=闋嗘檪閲濇棆杞�
+page_rotate_cw_label=闋嗘檪閲濇棆杞�
+page_rotate_ccw.title=閫嗘檪閲濇棆杞�
+page_rotate_ccw.label=閫嗘檪閲濇棆杞�
+page_rotate_ccw_label=閫嗘檪閲濇棆杞�
+
+cursor_text_select_tool.title=闁嬪暉鏂囧瓧閬告搰宸ュ叿
+cursor_text_select_tool_label=鏂囧瓧閬告搰宸ュ叿
+cursor_hand_tool.title=闁嬪暉闋侀潰绉诲嫊宸ュ叿
+cursor_hand_tool_label=闋侀潰绉诲嫊宸ュ叿
+
+scroll_vertical.title=浣跨敤鍨傜洿鎹插嫊鐗堥潰
+scroll_vertical_label=鍨傜洿鎹插嫊
+scroll_horizontal.title=浣跨敤姘村钩鎹插嫊鐗堥潰
+scroll_horizontal_label=姘村钩鎹插嫊
+scroll_wrapped.title=浣跨敤澶氶爜鎹插嫊鐗堥潰
+scroll_wrapped_label=澶氶爜鎹插嫊
+
+spread_none.title=涓嶈閫茶璺ㄩ爜椤ず
+spread_none_label=涓嶈法闋�
+spread_odd.title=寰炲鏁搁爜闁嬪璺ㄩ爜
+spread_odd_label=濂囨暩璺ㄩ爜
+spread_even.title=寰炲伓鏁搁爜闁嬪璺ㄩ爜
+spread_even_label=鍋舵暩璺ㄩ爜
+
+# Document properties dialog box
+document_properties.title=鏂囦欢鍏у鈥�
+document_properties_label=鏂囦欢鍏у鈥�
+document_properties_file_name=妾旀鍚嶇ū:
+document_properties_file_size=妾旀澶у皬:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+document_properties_kb={{size_kb}} KB锛坽{size_b}} 浣嶅厓绲勶級
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_mb={{size_mb}} MB锛坽{size_b}} 浣嶅厓绲勶級
+document_properties_title=妯欓:
+document_properties_author=浣滆��:
+document_properties_subject=涓绘棬:
+document_properties_keywords=闂滈嵉瀛�:
+document_properties_creation_date=寤虹珛鏃ユ湡:
+document_properties_modification_date=淇敼鏃ユ湡:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+document_properties_date_string={{date}}, {{time}}
+document_properties_creator=寤虹珛鑰�:
+document_properties_producer=PDF 鐢㈢敓鍣�:
+document_properties_version=PDF 鐗堟湰:
+document_properties_page_count=闋佹暩:
+document_properties_page_size=闋侀潰澶у皬:
+document_properties_page_size_unit_inches=in
+document_properties_page_size_unit_millimeters=mm
+document_properties_page_size_orientation_portrait=鍨傜洿
+document_properties_page_size_orientation_landscape=姘村钩
+document_properties_page_size_name_a3=A3
+document_properties_page_size_name_a4=A4
+document_properties_page_size_name_letter=Letter
+document_properties_page_size_name_legal=Legal
+# LOCALIZATION NOTE (document_properties_page_size_dimension_string):
+# "{{width}}", "{{height}}", {{unit}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement and orientation, of the (current) page.
+document_properties_page_size_dimension_string={{width}} 脳 {{height}} {{unit}}锛坽{orientation}}锛�
+# LOCALIZATION NOTE (document_properties_page_size_dimension_name_string):
+# "{{width}}", "{{height}}", {{unit}}, {{name}}, and {{orientation}} will be replaced by
+# the size, respectively their unit of measurement, name, and orientation, of the (current) page.
+document_properties_page_size_dimension_name_string={{width}} 脳 {{height}} {{unit}}锛坽{name}}锛寋{orientation}}锛�
+# LOCALIZATION NOTE (document_properties_linearized): The linearization status of
+# the document; usually called "Fast Web View" in English locales of Adobe software.
+document_properties_linearized=蹇�� Web 妾㈣:
+document_properties_linearized_yes=鏄�
+document_properties_linearized_no=鍚�
+document_properties_close=闂滈枆
+
+print_progress_message=姝e湪婧栧倷鍒楀嵃鏂囦欢鈥�
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+print_progress_percent={{progress}}%
+print_progress_close=鍙栨秷
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=鍒囨彌鍋撮倞娆�
+toggle_sidebar_notification.title=鍒囨彌鍋撮倞鏀旓紙鏂囦欢鍖呭惈澶х侗鎴栭檮浠讹級
+toggle_sidebar_label=鍒囨彌鍋撮倞娆�
+document_outline.title=椤ず鏂囦欢澶х侗锛堥洐鎿婂睍闁�/鎽虹枈鎵�鏈夐爡鐩級
+document_outline_label=鏂囦欢澶х侗
+attachments.title=椤ず闄勪欢
+attachments_label=闄勪欢
+thumbs.title=椤ず绺湒
+thumbs_label=绺湒
+findbar.title=鍦ㄦ枃浠朵腑灏嬫壘
+findbar_label=灏嬫壘
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=闋� {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=闋� {{page}} 鐨勭府鍦�
+
+# Find panel button title and messages
+find_input.title=鎼滃皨
+find_input.placeholder=鍦ㄦ枃浠朵腑鎼滃皨鈥�
+find_previous.title=灏嬫壘鏂囧瓧鍓嶆鍑虹従鐨勪綅缃�
+find_previous_label=涓婁竴鍊�
+find_next.title=灏嬫壘鏂囧瓧涓嬫鍑虹従鐨勪綅缃�
+find_next_label=涓嬩竴鍊�
+find_highlight=鍏ㄩ儴寮疯妯欑ず
+find_match_case_label=鍗�鍒嗗ぇ灏忓
+find_entire_word_label=绗﹀悎鏁村�嬪瓧
+find_reached_top=宸叉悳灏嬭嚦鏂囦欢闋傜锛岃嚜搴曠绻肩簩鎼滃皨
+find_reached_bottom=宸叉悳灏嬭嚦鏂囦欢搴曠锛岃嚜闋傜绻肩簩鎼滃皨
+# LOCALIZATION NOTE (find_match_count): The supported plural forms are
+# [one|two|few|many|other], with [other] as the default value.
+# "{{current}}" and "{{total}}" will be replaced by a number representing the
+# index of the currently active find result, respectively a number representing
+# the total number of matches in the document.
+find_match_count={[ plural(total) ]}
+find_match_count[one]=绗� {{current}} 绛嗭紝鍏辨壘鍒� {{total}} 绛�
+find_match_count[two]=绗� {{current}} 绛嗭紝鍏辨壘鍒� {{total}} 绛�
+find_match_count[few]=绗� {{current}} 绛嗭紝鍏辨壘鍒� {{total}} 绛�
+find_match_count[many]=绗� {{current}} 绛嗭紝鍏辨壘鍒� {{total}} 绛�
+find_match_count[other]=绗� {{current}} 绛嗭紝鍏辨壘鍒� {{total}} 绛�
+# LOCALIZATION NOTE (find_match_count_limit): The supported plural forms are
+# [zero|one|two|few|many|other], with [other] as the default value.
+# "{{limit}}" will be replaced by a numerical value.
+find_match_count_limit={[ plural(limit) ]}
+find_match_count_limit[zero]=鎵惧埌瓒呴亷 {{limit}} 绛�
+find_match_count_limit[one]=鎵惧埌瓒呴亷 {{limit}} 绛�
+find_match_count_limit[two]=鎵惧埌瓒呴亷 {{limit}} 绛�
+find_match_count_limit[few]=鎵惧埌瓒呴亷 {{limit}} 绛�
+find_match_count_limit[many]=鎵惧埌瓒呴亷 {{limit}} 绛�
+find_match_count_limit[other]=鎵惧埌瓒呴亷 {{limit}} 绛�
+find_not_found=鎵句笉鍒版寚瀹氭枃瀛�
+
+# Error panel labels
+error_more_info=鏇村璩囪▕
+error_less_info=鏇村皯璩囪▕
+error_close=闂滈枆
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=瑷婃伅: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=鍫嗙枈: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=妾旀: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=琛�: {{line}}
+rendering_error=鎻忕躬闋侀潰鏅傜櫦鐢熼尟瑾ゃ��
+
+# Predefined zoom values
+page_scale_width=闋侀潰瀵害
+page_scale_fit=绺斁鑷抽爜闈㈠ぇ灏�
+page_scale_auto=鑷嫊绺斁
+page_scale_actual=瀵﹂殯澶у皬
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+page_scale_percent={{scale}}%
+
+# Loading indicator messages
+loading_error_indicator=閷
+loading_error=杓夊叆 PDF 鏅傜櫦鐢熼尟瑾ゃ��
+invalid_file_error=鐒℃晥鎴栨瘈鎼嶇殑 PDF 妾旀銆�
+missing_file_error=鎵句笉鍒� PDF 妾旀銆�
+unexpected_response_error=浼烘湇鍣ㄥ洖鎳夋湭闋愭湡鐨勫収瀹广��
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[{{type}} 瑷昏В]
+password_label=璜嬭几鍏ョ敤渚嗛枊鍟熸 PDF 妾旀鐨勫瘑纰笺��
+password_invalid=瀵嗙⒓涓嶆纰猴紝璜嬪啀瑭︿竴娆°��
+password_ok=纰哄畾
+password_cancel=鍙栨秷
+
+printing_not_supported=璀﹀憡: 姝ょ�忚鍣ㄦ湭瀹屾暣鏀彺鍒楀嵃鍔熻兘銆�
+printing_not_ready=璀﹀憡: 姝� PDF 鏈畬鎴愪笅杓変互渚涘垪鍗般��
+web_fonts_disabled=宸插仠鐢ㄧ恫璺瓧鍨� (Web fonts): 鐒℃硶浣跨敤 PDF 鍏у祵瀛楀瀷銆�
+document_colors_not_allowed=鐎忚鍣ㄧ殑銆屽劒鍏堜娇鐢ㄧ恫闋佹寚瀹氱殑鑹插僵銆嶆湭琚嬀閬革紝PDF 鏂囦欢鐒℃硶浣跨敤鑷繁鐨勮壊褰┿��
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/zu/viewer.properties b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/zu/viewer.properties
new file mode 100644
index 0000000..8fc77f2
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/locale/zu/viewer.properties
@@ -0,0 +1,131 @@
+# Copyright 2012 Mozilla Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Main toolbar buttons (tooltips and alt text for images)
+previous.title=Ikhasi eledlule
+previous_label=Okudlule
+next.title=Ikhasi elilandelayo
+next_label=Okulandelayo
+
+# LOCALIZATION NOTE (page.title): The tooltip for the pageNumber input.
+# LOCALIZATION NOTE (of_pages): "{{pagesCount}}" will be replaced by a number
+# representing the total number of pages in the document.
+# LOCALIZATION NOTE (page_of_pages): "{{pageNumber}}" and "{{pagesCount}}"
+# will be replaced by a number representing the currently visible page,
+# respectively a number representing the total number of pages in the document.
+
+zoom_out.title=Hlehlisela emuva
+zoom_out_label=Hlehlisela emuva
+zoom_in.title=Sondeza eduze
+zoom_in_label=Sondeza eduze
+zoom.title=Lwiza
+presentation_mode.title=Guqulela kwindlela yesethulo
+presentation_mode_label=Indlelo yesethulo
+open_file.title=Vula ifayela
+open_file_label=Vula
+print.title=Phrinta
+print_label=Phrinta
+download.title=Landa
+download_label=Landa
+bookmark.title=Ukubuka kwamanje (kopisha noma vula kwifasitela elisha)
+bookmark_label=Ukubuka kwamanje
+
+# Secondary toolbar and context menu
+
+
+# Document properties dialog box
+document_properties_file_name=Igama lefayela:
+# LOCALIZATION NOTE (document_properties_kb): "{{size_kb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in kilobytes, respectively in bytes.
+# LOCALIZATION NOTE (document_properties_mb): "{{size_mb}}" and "{{size_b}}"
+# will be replaced by the PDF file size in megabytes, respectively in bytes.
+document_properties_title=Isihloko:
+# LOCALIZATION NOTE (document_properties_date_string): "{{date}}" and "{{time}}"
+# will be replaced by the creation/modification date, and time, of the PDF file.
+
+# LOCALIZATION NOTE (print_progress_percent): "{{progress}}" will be replaced by
+# a numerical per cent value.
+
+# Tooltips and alt text for side panel toolbar buttons
+# (the _label strings are alt text for the buttons, the .title strings are
+# tooltips)
+toggle_sidebar.title=I-toggle yebha yaseceleni
+toggle_sidebar_label=i-toggle yebha yaseceleni
+document_outline_label=Umugqa waseceleni wedokhumenti
+thumbs.title=Bonisa izithombe ezincane
+thumbs_label=Izithonjana
+findbar.title=Thola kwidokhumenti
+
+# Thumbnails panel item (tooltip and alt text for images)
+# LOCALIZATION NOTE (thumb_page_title): "{{page}}" will be replaced by the page
+# number.
+thumb_page_title=Ikhasi {{page}}
+# LOCALIZATION NOTE (thumb_page_canvas): "{{page}}" will be replaced by the page
+# number.
+thumb_page_canvas=Isithonjana sekhasi {{page}}
+
+# Find panel button title and messages
+find_previous.title=Thola indawo eyandulelayo okuvela kuyo lomshwana
+find_previous_label=Okudlulile
+find_next.title=Thola enye indawo okuvela kuyo lomshwana
+find_next_label=Okulandelayo
+find_highlight=Gqamisa konke
+find_match_case_label=Fanisa ikheyisi
+find_reached_top=Finyelele phezulu kwidokhumenti, qhubeka kusukaphansi
+find_reached_bottom=Ifinyelele ekupheleni kwedokhumenti, qhubeka kusukaphezulu
+find_not_found=Umshwana awutholakali
+
+# Error panel labels
+error_more_info=Ukwaziswa Okwengeziwe
+error_less_info=Ukwazi okuncane
+# LOCALIZATION NOTE (error_version_info): "{{version}}" and "{{build}}" will be
+# replaced by the PDF.JS version and build ID.
+error_version_info=PDF.js v{{version}} (build: {{build}})
+# LOCALIZATION NOTE (error_message): "{{message}}" will be replaced by an
+# english string describing the error.
+error_message=Umlayezo: {{message}}
+# LOCALIZATION NOTE (error_stack): "{{stack}}" will be replaced with a stack
+# trace.
+error_stack=Isitaki: {{stack}}
+# LOCALIZATION NOTE (error_file): "{{file}}" will be replaced with a filename
+error_file=Ifayela: {{file}}
+# LOCALIZATION NOTE (error_line): "{{line}}" will be replaced with a line number
+error_line=Umugqa: {{line}}
+rendering_error=Iphutha lenzekile uma kunikwa ikhasi.
+
+# Predefined zoom values
+page_scale_width=Ububanzi bekhasi
+page_scale_fit=Ukulingana kwekhasi
+page_scale_auto=Ukulwiza okuzenzekalelayo
+page_scale_actual=Usayizi Wangempela
+# LOCALIZATION NOTE (page_scale_percent): "{{scale}}" will be replaced by a
+# numerical scale value.
+
+# Loading indicator messages
+loading_error_indicator=Iphutha
+loading_error=Kwenzeke iphutha uma kulayishwa i-PDF.
+invalid_file_error=Ifayela le-PDF elingavumelekile noma elonakele.
+missing_file_error=Ifayela le-PDF elilahlekile.
+
+# LOCALIZATION NOTE (text_annotation_type.alt): This is used as a tooltip.
+# "{{type}}" will be replaced with an annotation type from a list defined in
+# the PDF spec (32000-1:2008 Table 169 鈥� Annotation types).
+# Some common types are e.g.: "Check", "Text", "Comment", "Note"
+text_annotation_type.alt=[Amazwibela e-{{type}}]
+password_ok=Kulungile
+
+printing_not_supported=Isixwayiso: Ukuphrinta akuxhasiwe yilesisiphequluli ngokugcwele.
+printing_not_ready=Isixwayiso: I-PDF ayikalayishwa ngokuphelele yiPhrinta.
+web_fonts_disabled=Amafonti e-webhu akutshaziwe: ayikwazi ukusebenzisa amafonti abekiwe e-PDF.\u0020
+document_colors_not_allowed=Amadokhumenti we-PDF awavumelekile ukusebenzisa imibalo yayo: 'Vumela amakhasi ukukhetha imibala yayo' ayisebenzi kusiphequluli.
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/viewer.css b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/viewer.css
new file mode 100644
index 0000000..347e01f
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/viewer.css
@@ -0,0 +1,2390 @@
+/* Copyright 2014 Mozilla Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+.textLayer {
+  position: absolute;
+  left: 0;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  overflow: hidden;
+  opacity: 0.2;
+  line-height: 1.0;
+}
+
+.textLayer > div {
+  color: transparent;
+  position: absolute;
+  white-space: pre;
+  cursor: text;
+  -webkit-transform-origin: 0% 0%;
+          transform-origin: 0% 0%;
+}
+
+.textLayer .highlight {
+  margin: -1px;
+  padding: 1px;
+
+  background-color: rgb(180, 0, 170);
+  border-radius: 4px;
+}
+
+.textLayer .highlight.begin {
+  border-radius: 4px 0px 0px 4px;
+}
+
+.textLayer .highlight.end {
+  border-radius: 0px 4px 4px 0px;
+}
+
+.textLayer .highlight.middle {
+  border-radius: 0px;
+}
+
+.textLayer .highlight.selected {
+  background-color: rgb(0, 100, 0);
+}
+
+.textLayer ::-moz-selection { background: rgb(0,0,255); }
+
+.textLayer ::selection { background: rgb(0,0,255); }
+
+.textLayer .endOfContent {
+  display: block;
+  position: absolute;
+  left: 0px;
+  top: 100%;
+  right: 0px;
+  bottom: 0px;
+  z-index: -1;
+  cursor: default;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+}
+
+.textLayer .endOfContent.active {
+  top: 0px;
+}
+
+
+.annotationLayer section {
+  position: absolute;
+}
+
+.annotationLayer .linkAnnotation > a,
+.annotationLayer .buttonWidgetAnnotation.pushButton > a {
+  position: absolute;
+  font-size: 1em;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+}
+
+.annotationLayer .linkAnnotation > a:hover,
+.annotationLayer .buttonWidgetAnnotation.pushButton > a:hover {
+  opacity: 0.2;
+  background: #ff0;
+  box-shadow: 0px 2px 10px #ff0;
+}
+
+.annotationLayer .textAnnotation img {
+  position: absolute;
+  cursor: pointer;
+}
+
+.annotationLayer .textWidgetAnnotation input,
+.annotationLayer .textWidgetAnnotation textarea,
+.annotationLayer .choiceWidgetAnnotation select,
+.annotationLayer .buttonWidgetAnnotation.checkBox input,
+.annotationLayer .buttonWidgetAnnotation.radioButton input {
+  background-color: rgba(0, 54, 255, 0.13);
+  border: 1px solid transparent;
+  box-sizing: border-box;
+  font-size: 9px;
+  height: 100%;
+  margin: 0;
+  padding: 0 3px;
+  vertical-align: top;
+  width: 100%;
+}
+
+.annotationLayer .choiceWidgetAnnotation select option {
+  padding: 0;
+}
+
+.annotationLayer .buttonWidgetAnnotation.radioButton input {
+  border-radius: 50%;
+}
+
+.annotationLayer .textWidgetAnnotation textarea {
+  font: message-box;
+  font-size: 9px;
+  resize: none;
+}
+
+.annotationLayer .textWidgetAnnotation input[disabled],
+.annotationLayer .textWidgetAnnotation textarea[disabled],
+.annotationLayer .choiceWidgetAnnotation select[disabled],
+.annotationLayer .buttonWidgetAnnotation.checkBox input[disabled],
+.annotationLayer .buttonWidgetAnnotation.radioButton input[disabled] {
+  background: none;
+  border: 1px solid transparent;
+  cursor: not-allowed;
+}
+
+.annotationLayer .textWidgetAnnotation input:hover,
+.annotationLayer .textWidgetAnnotation textarea:hover,
+.annotationLayer .choiceWidgetAnnotation select:hover,
+.annotationLayer .buttonWidgetAnnotation.checkBox input:hover,
+.annotationLayer .buttonWidgetAnnotation.radioButton input:hover {
+  border: 1px solid #000;
+}
+
+.annotationLayer .textWidgetAnnotation input:focus,
+.annotationLayer .textWidgetAnnotation textarea:focus,
+.annotationLayer .choiceWidgetAnnotation select:focus {
+  background: none;
+  border: 1px solid transparent;
+}
+
+.annotationLayer .buttonWidgetAnnotation.checkBox input:checked:before,
+.annotationLayer .buttonWidgetAnnotation.checkBox input:checked:after,
+.annotationLayer .buttonWidgetAnnotation.radioButton input:checked:before {
+  background-color: #000;
+  content: '';
+  display: block;
+  position: absolute;
+}
+
+.annotationLayer .buttonWidgetAnnotation.checkBox input:checked:before,
+.annotationLayer .buttonWidgetAnnotation.checkBox input:checked:after {
+  height: 80%;
+  left: 45%;
+  width: 1px;
+}
+
+.annotationLayer .buttonWidgetAnnotation.checkBox input:checked:before {
+  -webkit-transform: rotate(45deg);
+          transform: rotate(45deg);
+}
+
+.annotationLayer .buttonWidgetAnnotation.checkBox input:checked:after {
+  -webkit-transform: rotate(-45deg);
+          transform: rotate(-45deg);
+}
+
+.annotationLayer .buttonWidgetAnnotation.radioButton input:checked:before {
+  border-radius: 50%;
+  height: 50%;
+  left: 30%;
+  top: 20%;
+  width: 50%;
+}
+
+.annotationLayer .textWidgetAnnotation input.comb {
+  font-family: monospace;
+  padding-left: 2px;
+  padding-right: 0;
+}
+
+.annotationLayer .textWidgetAnnotation input.comb:focus {
+  /*
+   * Letter spacing is placed on the right side of each character. Hence, the
+   * letter spacing of the last character may be placed outside the visible
+   * area, causing horizontal scrolling. We avoid this by extending the width
+   * when the element has focus and revert this when it loses focus.
+   */
+  width: 115%;
+}
+
+.annotationLayer .buttonWidgetAnnotation.checkBox input,
+.annotationLayer .buttonWidgetAnnotation.radioButton input {
+  -webkit-appearance: none;
+     -moz-appearance: none;
+          appearance: none;
+  padding: 0;
+}
+
+.annotationLayer .popupWrapper {
+  position: absolute;
+  width: 20em;
+}
+
+.annotationLayer .popup {
+  position: absolute;
+  z-index: 200;
+  max-width: 20em;
+  background-color: #FFFF99;
+  box-shadow: 0px 2px 5px #333;
+  border-radius: 2px;
+  padding: 0.6em;
+  margin-left: 5px;
+  cursor: pointer;
+  font: message-box;
+  word-wrap: break-word;
+}
+
+.annotationLayer .popup h1 {
+  font-size: 1em;
+  border-bottom: 1px solid #000000;
+  margin: 0;
+  padding-bottom: 0.2em;
+}
+
+.annotationLayer .popup p {
+  margin: 0;
+  padding-top: 0.2em;
+}
+
+.annotationLayer .highlightAnnotation,
+.annotationLayer .underlineAnnotation,
+.annotationLayer .squigglyAnnotation,
+.annotationLayer .strikeoutAnnotation,
+.annotationLayer .lineAnnotation svg line,
+.annotationLayer .squareAnnotation svg rect,
+.annotationLayer .circleAnnotation svg ellipse,
+.annotationLayer .polylineAnnotation svg polyline,
+.annotationLayer .polygonAnnotation svg polygon,
+.annotationLayer .inkAnnotation svg polyline,
+.annotationLayer .stampAnnotation,
+.annotationLayer .fileAttachmentAnnotation {
+  cursor: pointer;
+}
+
+.pdfViewer .canvasWrapper {
+  overflow: hidden;
+}
+
+.pdfViewer .page {
+  direction: ltr;
+  width: 816px;
+  height: 1056px;
+  margin: 1px auto -8px auto;
+  position: relative;
+  overflow: visible;
+  border: 9px solid transparent;
+  background-clip: content-box;
+  -o-border-image: url(images/shadow.png) 9 9 repeat;
+     border-image: url(images/shadow.png) 9 9 repeat;
+  background-color: white;
+}
+
+.pdfViewer.removePageBorders .page {
+  margin: 0px auto 10px auto;
+  border: none;
+}
+
+.pdfViewer.singlePageView {
+  display: inline-block;
+}
+
+.pdfViewer.singlePageView .page {
+  margin: 0;
+  border: none;
+}
+
+.pdfViewer.scrollHorizontal, .pdfViewer.scrollWrapped, .spread {
+  margin-left: 3.5px;
+  margin-right: 3.5px;
+  text-align: center;
+}
+
+.pdfViewer.scrollHorizontal, .spread {
+  white-space: nowrap;
+}
+
+.pdfViewer.removePageBorders,
+.pdfViewer.scrollHorizontal .spread,
+.pdfViewer.scrollWrapped .spread {
+  margin-left: 0;
+  margin-right: 0;
+}
+
+.spread .page,
+.pdfViewer.scrollHorizontal .page,
+.pdfViewer.scrollWrapped .page,
+.pdfViewer.scrollHorizontal .spread,
+.pdfViewer.scrollWrapped .spread {
+  display: inline-block;
+  vertical-align: middle;
+}
+
+.spread .page,
+.pdfViewer.scrollHorizontal .page,
+.pdfViewer.scrollWrapped .page {
+  margin-left: -3.5px;
+  margin-right: -3.5px;
+}
+
+.pdfViewer.removePageBorders .spread .page,
+.pdfViewer.removePageBorders.scrollHorizontal .page,
+.pdfViewer.removePageBorders.scrollWrapped .page {
+  margin-left: 5px;
+  margin-right: 5px;
+}
+
+.pdfViewer .page canvas {
+  margin: 0;
+  display: block;
+}
+
+.pdfViewer .page canvas[hidden] {
+  display: none;
+}
+
+.pdfViewer .page .loadingIcon {
+  position: absolute;
+  display: block;
+  left: 0;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  background: url('images/loading-icon.gif') center no-repeat;
+}
+
+.pdfPresentationMode .pdfViewer {
+  margin-left: 0;
+  margin-right: 0;
+}
+
+.pdfPresentationMode .pdfViewer .page,
+.pdfPresentationMode .pdfViewer .spread {
+  display: block;
+}
+
+.pdfPresentationMode .pdfViewer .page,
+.pdfPresentationMode .pdfViewer.removePageBorders .page {
+  margin-left: auto;
+  margin-right: auto;
+}
+
+.pdfPresentationMode:-ms-fullscreen .pdfViewer .page {
+  margin-bottom: 100% !important;
+}
+
+.pdfPresentationMode:-webkit-full-screen .pdfViewer .page {
+  margin-bottom: 100%;
+  border: 0;
+}
+
+.pdfPresentationMode:-moz-full-screen .pdfViewer .page {
+  margin-bottom: 100%;
+  border: 0;
+}
+
+.pdfPresentationMode:fullscreen .pdfViewer .page {
+  margin-bottom: 100%;
+  border: 0;
+}
+
+:root {
+  --sidebar-width: 200px;
+}
+
+* {
+  padding: 0;
+  margin: 0;
+}
+
+html {
+  height: 100%;
+  width: 100%;
+  /* Font size is needed to make the activity bar the correct size. */
+  font-size: 10px;
+}
+
+body {
+  height: 100%;
+  width: 100%;
+  background-color: #404040;
+  background-image: url(images/texture.png);
+}
+
+body,
+input,
+button,
+select {
+  font: message-box;
+  outline: none;
+}
+
+.hidden {
+  display: none !important;
+}
+[hidden] {
+  display: none !important;
+}
+
+#viewerContainer.pdfPresentationMode:-ms-fullscreen {
+  top: 0px !important;
+  overflow: hidden !important;
+}
+
+#viewerContainer.pdfPresentationMode:-ms-fullscreen::-ms-backdrop {
+  background-color: #000;
+}
+
+#viewerContainer.pdfPresentationMode:-webkit-full-screen {
+  top: 0px;
+  border-top: 2px solid transparent;
+  background-color: #000;
+  width: 100%;
+  height: 100%;
+  overflow: hidden;
+  cursor: none;
+  -webkit-user-select: none;
+          user-select: none;
+}
+
+#viewerContainer.pdfPresentationMode:-moz-full-screen {
+  top: 0px;
+  border-top: 2px solid transparent;
+  background-color: #000;
+  width: 100%;
+  height: 100%;
+  overflow: hidden;
+  cursor: none;
+  -moz-user-select: none;
+       user-select: none;
+}
+
+#viewerContainer.pdfPresentationMode:-ms-fullscreen {
+  top: 0px;
+  border-top: 2px solid transparent;
+  background-color: #000;
+  width: 100%;
+  height: 100%;
+  overflow: hidden;
+  cursor: none;
+  -ms-user-select: none;
+      user-select: none;
+}
+
+#viewerContainer.pdfPresentationMode:fullscreen {
+  top: 0px;
+  border-top: 2px solid transparent;
+  background-color: #000;
+  width: 100%;
+  height: 100%;
+  overflow: hidden;
+  cursor: none;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+}
+
+.pdfPresentationMode:-webkit-full-screen a:not(.internalLink) {
+  display: none;
+}
+
+.pdfPresentationMode:-moz-full-screen a:not(.internalLink) {
+  display: none;
+}
+
+.pdfPresentationMode:-ms-fullscreen a:not(.internalLink) {
+  display: none;
+}
+
+.pdfPresentationMode:fullscreen a:not(.internalLink) {
+  display: none;
+}
+
+.pdfPresentationMode:-webkit-full-screen .textLayer > div {
+  cursor: none;
+}
+
+.pdfPresentationMode:-moz-full-screen .textLayer > div {
+  cursor: none;
+}
+
+.pdfPresentationMode:-ms-fullscreen .textLayer > div {
+  cursor: none;
+}
+
+.pdfPresentationMode:fullscreen .textLayer > div {
+  cursor: none;
+}
+
+.pdfPresentationMode.pdfPresentationModeControls > *,
+.pdfPresentationMode.pdfPresentationModeControls .textLayer > div {
+  cursor: default;
+}
+
+#outerContainer {
+  width: 100%;
+  height: 100%;
+  position: relative;
+}
+
+#sidebarContainer {
+  position: absolute;
+  top: 32px;
+  bottom: 0;
+  width: 200px; /* Here, and elsewhere below, keep the constant value for compatibility
+                   with older browsers that lack support for CSS variables. */
+  width: var(--sidebar-width);
+  visibility: hidden;
+  z-index: 100;
+  border-top: 1px solid #333;
+
+  transition-duration: 200ms;
+  transition-timing-function: ease;
+}
+html[dir='ltr'] #sidebarContainer {
+  transition-property: left;
+  left: -200px;
+  left: calc(-1 * var(--sidebar-width));
+}
+html[dir='rtl'] #sidebarContainer {
+  transition-property: right;
+  right: -200px;
+  right: calc(-1 * var(--sidebar-width));
+}
+
+.loadingInProgress #sidebarContainer {
+  top: 36px;
+}
+
+#outerContainer.sidebarResizing #sidebarContainer {
+  /* Improve responsiveness and avoid visual glitches when the sidebar is resized. */
+  transition-duration: 0s;
+  /* Prevent e.g. the thumbnails being selected when the sidebar is resized. */
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+}
+
+#outerContainer.sidebarMoving #sidebarContainer,
+#outerContainer.sidebarOpen #sidebarContainer {
+  visibility: visible;
+}
+html[dir='ltr'] #outerContainer.sidebarOpen #sidebarContainer {
+  left: 0px;
+}
+html[dir='rtl'] #outerContainer.sidebarOpen #sidebarContainer {
+  right: 0px;
+}
+
+#mainContainer {
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  min-width: 320px;
+}
+
+#sidebarContent {
+  top: 32px;
+  bottom: 0;
+  overflow: auto;
+  -webkit-overflow-scrolling: touch;
+  position: absolute;
+  width: 100%;
+  background-color: hsla(0,0%,0%,.1);
+}
+html[dir='ltr'] #sidebarContent {
+  left: 0;
+  box-shadow: inset -1px 0 0 hsla(0,0%,0%,.25);
+}
+html[dir='rtl'] #sidebarContent {
+  right: 0;
+  box-shadow: inset 1px 0 0 hsla(0,0%,0%,.25);
+}
+
+#viewerContainer {
+  overflow: auto;
+  -webkit-overflow-scrolling: touch;
+  position: absolute;
+  top: 32px;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  outline: none;
+}
+#viewerContainer:not(.pdfPresentationMode) {
+  transition-duration: 200ms;
+  transition-timing-function: ease;
+}
+html[dir='ltr'] #viewerContainer {
+  box-shadow: inset 1px 0 0 hsla(0,0%,100%,.05);
+}
+html[dir='rtl'] #viewerContainer {
+  box-shadow: inset -1px 0 0 hsla(0,0%,100%,.05);
+}
+
+#outerContainer.sidebarResizing #viewerContainer {
+  /* Improve responsiveness and avoid visual glitches when the sidebar is resized. */
+  transition-duration: 0s;
+}
+
+html[dir='ltr'] #outerContainer.sidebarOpen #viewerContainer:not(.pdfPresentationMode) {
+  transition-property: left;
+  left: 200px;
+  left: var(--sidebar-width);
+}
+html[dir='rtl'] #outerContainer.sidebarOpen #viewerContainer:not(.pdfPresentationMode) {
+  transition-property: right;
+  right: 200px;
+  right: var(--sidebar-width);
+}
+
+.toolbar {
+  position: relative;
+  left: 0;
+  right: 0;
+  z-index: 9999;
+  cursor: default;
+}
+
+#toolbarContainer {
+  width: 100%;
+}
+
+#toolbarSidebar {
+  width: 100%;
+  height: 32px;
+  background-color: #424242; /* fallback */
+  background-image: url(images/texture.png),
+                    linear-gradient(hsla(0,0%,30%,.99), hsla(0,0%,25%,.95));
+}
+html[dir='ltr'] #toolbarSidebar {
+  box-shadow: inset -1px 0 0 rgba(0, 0, 0, 0.25),
+              inset 0 -1px 0 hsla(0,0%,100%,.05),
+              0 1px 0 hsla(0,0%,0%,.15),
+              0 0 1px hsla(0,0%,0%,.1);
+}
+html[dir='rtl'] #toolbarSidebar {
+  box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.25),
+              inset 0 1px 0 hsla(0,0%,100%,.05),
+              0 1px 0 hsla(0,0%,0%,.15),
+              0 0 1px hsla(0,0%,0%,.1);
+}
+
+#sidebarResizer {
+  position: absolute;
+  top: 0;
+  bottom: 0;
+  width: 6px;
+  z-index: 200;
+  cursor: ew-resize;
+}
+html[dir='ltr'] #sidebarResizer {
+  right: -6px;
+}
+html[dir='rtl'] #sidebarResizer {
+  left: -6px;
+}
+
+#toolbarContainer, .findbar, .secondaryToolbar {
+  position: relative;
+  height: 32px;
+  background-color: #474747; /* fallback */
+  background-image: url(images/texture.png),
+                    linear-gradient(hsla(0,0%,32%,.99), hsla(0,0%,27%,.95));
+}
+html[dir='ltr'] #toolbarContainer, .findbar, .secondaryToolbar {
+  box-shadow: inset 0 1px 1px hsla(0,0%,0%,.15),
+              inset 0 -1px 0 hsla(0,0%,100%,.05),
+              0 1px 0 hsla(0,0%,0%,.15),
+              0 1px 1px hsla(0,0%,0%,.1);
+}
+html[dir='rtl'] #toolbarContainer, .findbar, .secondaryToolbar {
+  box-shadow: inset 0 1px 1px hsla(0,0%,0%,.15),
+              inset 0 -1px 0 hsla(0,0%,100%,.05),
+              0 1px 0 hsla(0,0%,0%,.15),
+              0 1px 1px hsla(0,0%,0%,.1);
+}
+
+#toolbarViewer {
+  height: 32px;
+}
+
+#loadingBar {
+  position: relative;
+  width: 100%;
+  height: 4px;
+  background-color: #333;
+  border-bottom: 1px solid #333;
+}
+
+#loadingBar .progress {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 0%;
+  height: 100%;
+  background-color: #ddd;
+  overflow: hidden;
+  transition: width 200ms;
+}
+
+@-webkit-keyframes progressIndeterminate {
+  0% { left: -142px; }
+  100% { left: 0; }
+}
+
+@keyframes progressIndeterminate {
+  0% { left: -142px; }
+  100% { left: 0; }
+}
+
+#loadingBar .progress.indeterminate {
+  background-color: #999;
+  transition: none;
+}
+
+#loadingBar .progress.indeterminate .glimmer {
+  position: absolute;
+  top: 0;
+  left: 0;
+  height: 100%;
+  width: calc(100% + 150px);
+
+  background: repeating-linear-gradient(135deg,
+                                        #bbb 0, #999 5px,
+                                        #999 45px, #ddd 55px,
+                                        #ddd 95px, #bbb 100px);
+
+  -webkit-animation: progressIndeterminate 950ms linear infinite;
+
+          animation: progressIndeterminate 950ms linear infinite;
+}
+
+.findbar, .secondaryToolbar {
+  top: 32px;
+  position: absolute;
+  z-index: 10000;
+  height: auto;
+  min-width: 16px;
+  padding: 0px 6px 0px 6px;
+  margin: 4px 2px 4px 2px;
+  color: hsl(0,0%,85%);
+  font-size: 12px;
+  line-height: 14px;
+  text-align: left;
+  cursor: default;
+}
+
+.findbar {
+  min-width: 300px;
+}
+.findbar > div {
+  height: 32px;
+}
+.findbar.wrapContainers > div {
+  clear: both;
+}
+.findbar.wrapContainers > div#findbarMessageContainer {
+  height: auto;
+}
+html[dir='ltr'] .findbar {
+  left: 68px;
+}
+html[dir='rtl'] .findbar {
+  right: 68px;
+}
+
+.findbar label {
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+}
+
+#findInput {
+  width: 200px;
+}
+#findInput::-webkit-input-placeholder {
+  color: hsl(0, 0%, 75%);
+}
+#findInput:-ms-input-placeholder {
+  font-style: italic;
+}
+#findInput::-ms-input-placeholder {
+  font-style: italic;
+}
+#findInput::placeholder {
+  font-style: italic;
+}
+#findInput[data-status="pending"] {
+  background-image: url(images/loading-small.png);
+  background-repeat: no-repeat;
+  background-position: right;
+}
+html[dir='rtl'] #findInput[data-status="pending"] {
+  background-position: left;
+}
+
+.secondaryToolbar {
+  padding: 6px;
+  height: auto;
+  z-index: 30000;
+}
+html[dir='ltr'] .secondaryToolbar {
+  right: 4px;
+}
+html[dir='rtl'] .secondaryToolbar {
+  left: 4px;
+}
+
+#secondaryToolbarButtonContainer {
+  max-width: 200px;
+  max-height: 400px;
+  overflow-y: auto;
+  -webkit-overflow-scrolling: touch;
+  margin-bottom: -4px;
+}
+
+#secondaryToolbarButtonContainer.hiddenScrollModeButtons > .scrollModeButtons,
+#secondaryToolbarButtonContainer.hiddenSpreadModeButtons > .spreadModeButtons {
+  display: none !important;
+}
+
+.doorHanger,
+.doorHangerRight {
+  border: 1px solid hsla(0,0%,0%,.5);
+  border-radius: 2px;
+  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
+}
+.doorHanger:after, .doorHanger:before,
+.doorHangerRight:after, .doorHangerRight:before {
+  bottom: 100%;
+  border: solid transparent;
+  content: " ";
+  height: 0;
+  width: 0;
+  position: absolute;
+  pointer-events: none;
+}
+.doorHanger:after,
+.doorHangerRight:after {
+  border-bottom-color: hsla(0,0%,32%,.99);
+  border-width: 8px;
+}
+.doorHanger:before,
+.doorHangerRight:before {
+  border-bottom-color: hsla(0,0%,0%,.5);
+  border-width: 9px;
+}
+
+html[dir='ltr'] .doorHanger:after,
+html[dir='rtl'] .doorHangerRight:after {
+  left: 13px;
+  margin-left: -8px;
+}
+
+html[dir='ltr'] .doorHanger:before,
+html[dir='rtl'] .doorHangerRight:before {
+  left: 13px;
+  margin-left: -9px;
+}
+
+html[dir='rtl'] .doorHanger:after,
+html[dir='ltr'] .doorHangerRight:after {
+  right: 13px;
+  margin-right: -8px;
+}
+
+html[dir='rtl'] .doorHanger:before,
+html[dir='ltr'] .doorHangerRight:before {
+  right: 13px;
+  margin-right: -9px;
+}
+
+#findResultsCount {
+  background-color: hsl(0, 0%, 85%);
+  color: hsl(0, 0%, 32%);
+  text-align: center;
+  padding: 3px 4px;
+}
+
+#findMsg {
+  font-style: italic;
+  color: #A6B7D0;
+}
+#findMsg:empty {
+  display: none;
+}
+
+#findInput.notFound {
+  background-color: rgb(255, 102, 102);
+}
+
+#toolbarViewerMiddle {
+  position: absolute;
+  left: 50%;
+  -webkit-transform: translateX(-50%);
+          transform: translateX(-50%);
+}
+
+html[dir='ltr'] #toolbarViewerLeft,
+html[dir='rtl'] #toolbarViewerRight {
+  float: left;
+}
+html[dir='ltr'] #toolbarViewerRight,
+html[dir='rtl'] #toolbarViewerLeft {
+  float: right;
+}
+html[dir='ltr'] #toolbarViewerLeft > *,
+html[dir='ltr'] #toolbarViewerMiddle > *,
+html[dir='ltr'] #toolbarViewerRight > *,
+html[dir='ltr'] .findbar * {
+  position: relative;
+  float: left;
+}
+html[dir='rtl'] #toolbarViewerLeft > *,
+html[dir='rtl'] #toolbarViewerMiddle > *,
+html[dir='rtl'] #toolbarViewerRight > *,
+html[dir='rtl'] .findbar * {
+  position: relative;
+  float: right;
+}
+
+html[dir='ltr'] .splitToolbarButton {
+  margin: 3px 2px 4px 0;
+  display: inline-block;
+}
+html[dir='rtl'] .splitToolbarButton {
+  margin: 3px 0 4px 2px;
+  display: inline-block;
+}
+html[dir='ltr'] .splitToolbarButton > .toolbarButton {
+  border-radius: 0;
+  float: left;
+}
+html[dir='rtl'] .splitToolbarButton > .toolbarButton {
+  border-radius: 0;
+  float: right;
+}
+
+.toolbarButton,
+.secondaryToolbarButton,
+.overlayButton {
+  border: 0 none;
+  background: none;
+  width: 32px;
+  height: 25px;
+}
+
+.toolbarButton > span {
+  display: inline-block;
+  width: 0;
+  height: 0;
+  overflow: hidden;
+}
+
+.toolbarButton[disabled],
+.secondaryToolbarButton[disabled],
+.overlayButton[disabled] {
+  opacity: .5;
+}
+
+.splitToolbarButton.toggled .toolbarButton {
+  margin: 0;
+}
+
+.splitToolbarButton:hover > .toolbarButton,
+.splitToolbarButton:focus > .toolbarButton,
+.splitToolbarButton.toggled > .toolbarButton,
+.toolbarButton.textButton {
+  background-color: hsla(0,0%,0%,.12);
+  background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));
+  background-clip: padding-box;
+  border: 1px solid hsla(0,0%,0%,.35);
+  border-color: hsla(0,0%,0%,.32) hsla(0,0%,0%,.38) hsla(0,0%,0%,.42);
+  box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset,
+              0 0 1px hsla(0,0%,100%,.15) inset,
+              0 1px 0 hsla(0,0%,100%,.05);
+  transition-property: background-color, border-color, box-shadow;
+  transition-duration: 150ms;
+  transition-timing-function: ease;
+
+}
+.splitToolbarButton > .toolbarButton:hover,
+.splitToolbarButton > .toolbarButton:focus,
+.dropdownToolbarButton:hover,
+.overlayButton:hover,
+.overlayButton:focus,
+.toolbarButton.textButton:hover,
+.toolbarButton.textButton:focus {
+  background-color: hsla(0,0%,0%,.2);
+  box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset,
+              0 0 1px hsla(0,0%,100%,.15) inset,
+              0 0 1px hsla(0,0%,0%,.05);
+  z-index: 199;
+}
+.splitToolbarButton > .toolbarButton {
+  position: relative;
+}
+html[dir='ltr'] .splitToolbarButton > .toolbarButton:first-child,
+html[dir='rtl'] .splitToolbarButton > .toolbarButton:last-child {
+  position: relative;
+  margin: 0;
+  margin-right: -1px;
+  border-top-left-radius: 2px;
+  border-bottom-left-radius: 2px;
+  border-right-color: transparent;
+}
+html[dir='ltr'] .splitToolbarButton > .toolbarButton:last-child,
+html[dir='rtl'] .splitToolbarButton > .toolbarButton:first-child {
+  position: relative;
+  margin: 0;
+  margin-left: -1px;
+  border-top-right-radius: 2px;
+  border-bottom-right-radius: 2px;
+  border-left-color: transparent;
+}
+.splitToolbarButtonSeparator {
+  padding: 8px 0;
+  width: 1px;
+  background-color: hsla(0,0%,0%,.5);
+  z-index: 99;
+  box-shadow: 0 0 0 1px hsla(0,0%,100%,.08);
+  display: inline-block;
+  margin: 5px 0;
+}
+html[dir='ltr'] .splitToolbarButtonSeparator {
+  float: left;
+}
+html[dir='rtl'] .splitToolbarButtonSeparator {
+  float: right;
+}
+.splitToolbarButton:hover > .splitToolbarButtonSeparator,
+.splitToolbarButton.toggled > .splitToolbarButtonSeparator {
+  padding: 12px 0;
+  margin: 1px 0;
+  box-shadow: 0 0 0 1px hsla(0,0%,100%,.03);
+  transition-property: padding;
+  transition-duration: 10ms;
+  transition-timing-function: ease;
+}
+
+.toolbarButton,
+.dropdownToolbarButton,
+.secondaryToolbarButton,
+.overlayButton {
+  min-width: 16px;
+  padding: 2px 6px 0;
+  border: 1px solid transparent;
+  border-radius: 2px;
+  color: hsla(0,0%,100%,.8);
+  font-size: 12px;
+  line-height: 14px;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  /* Opera does not support user-select, use <... unselectable="on"> instead */
+  cursor: default;
+  transition-property: background-color, border-color, box-shadow;
+  transition-duration: 150ms;
+  transition-timing-function: ease;
+}
+
+html[dir='ltr'] .toolbarButton,
+html[dir='ltr'] .overlayButton,
+html[dir='ltr'] .dropdownToolbarButton {
+  margin: 3px 2px 4px 0;
+}
+html[dir='rtl'] .toolbarButton,
+html[dir='rtl'] .overlayButton,
+html[dir='rtl'] .dropdownToolbarButton {
+  margin: 3px 0 4px 2px;
+}
+
+.toolbarButton:hover,
+.toolbarButton:focus,
+.dropdownToolbarButton,
+.overlayButton,
+.secondaryToolbarButton:hover,
+.secondaryToolbarButton:focus {
+  background-color: hsla(0,0%,0%,.12);
+  background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));
+  background-clip: padding-box;
+  border: 1px solid hsla(0,0%,0%,.35);
+  border-color: hsla(0,0%,0%,.32) hsla(0,0%,0%,.38) hsla(0,0%,0%,.42);
+  box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset,
+              0 0 1px hsla(0,0%,100%,.15) inset,
+              0 1px 0 hsla(0,0%,100%,.05);
+}
+
+.toolbarButton:hover:active,
+.overlayButton:hover:active,
+.dropdownToolbarButton:hover:active,
+.secondaryToolbarButton:hover:active {
+  background-color: hsla(0,0%,0%,.2);
+  background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));
+  border-color: hsla(0,0%,0%,.35) hsla(0,0%,0%,.4) hsla(0,0%,0%,.45);
+  box-shadow: 0 1px 1px hsla(0,0%,0%,.1) inset,
+              0 0 1px hsla(0,0%,0%,.2) inset,
+              0 1px 0 hsla(0,0%,100%,.05);
+  transition-property: background-color, border-color, box-shadow;
+  transition-duration: 10ms;
+  transition-timing-function: linear;
+}
+
+.toolbarButton.toggled,
+.splitToolbarButton.toggled > .toolbarButton.toggled,
+.secondaryToolbarButton.toggled {
+  background-color: hsla(0,0%,0%,.3);
+  background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));
+  border-color: hsla(0,0%,0%,.4) hsla(0,0%,0%,.45) hsla(0,0%,0%,.5);
+  box-shadow: 0 1px 1px hsla(0,0%,0%,.1) inset,
+              0 0 1px hsla(0,0%,0%,.2) inset,
+              0 1px 0 hsla(0,0%,100%,.05);
+  transition-property: background-color, border-color, box-shadow;
+  transition-duration: 10ms;
+  transition-timing-function: linear;
+}
+
+.toolbarButton.toggled:hover:active,
+.splitToolbarButton.toggled > .toolbarButton.toggled:hover:active,
+.secondaryToolbarButton.toggled:hover:active {
+  background-color: hsla(0,0%,0%,.4);
+  border-color: hsla(0,0%,0%,.4) hsla(0,0%,0%,.5) hsla(0,0%,0%,.55);
+  box-shadow: 0 1px 1px hsla(0,0%,0%,.2) inset,
+              0 0 1px hsla(0,0%,0%,.3) inset,
+              0 1px 0 hsla(0,0%,100%,.05);
+}
+
+.dropdownToolbarButton {
+  width: 120px;
+  max-width: 120px;
+  padding: 0;
+  overflow: hidden;
+  background: url(images/toolbarButton-menuArrows.png) no-repeat;
+}
+html[dir='ltr'] .dropdownToolbarButton {
+  background-position: 95%;
+}
+html[dir='rtl'] .dropdownToolbarButton {
+  background-position: 5%;
+}
+
+.dropdownToolbarButton > select {
+  min-width: 140px;
+  font-size: 12px;
+  color: hsl(0,0%,95%);
+  margin: 0;
+  padding: 3px 2px 2px;
+  border: none;
+  background: rgba(0,0,0,0); /* Opera does not support 'transparent' <select> background */
+}
+
+.dropdownToolbarButton > select > option {
+  background: hsl(0,0%,24%);
+}
+
+#customScaleOption {
+  display: none;
+}
+
+#pageWidthOption {
+  border-bottom: 1px rgba(255, 255, 255, .5) solid;
+}
+
+html[dir='ltr'] .splitToolbarButton:first-child,
+html[dir='ltr'] .toolbarButton:first-child,
+html[dir='rtl'] .splitToolbarButton:last-child,
+html[dir='rtl'] .toolbarButton:last-child {
+  margin-left: 4px;
+}
+html[dir='ltr'] .splitToolbarButton:last-child,
+html[dir='ltr'] .toolbarButton:last-child,
+html[dir='rtl'] .splitToolbarButton:first-child,
+html[dir='rtl'] .toolbarButton:first-child {
+  margin-right: 4px;
+}
+
+.toolbarButtonSpacer {
+  width: 30px;
+  display: inline-block;
+  height: 1px;
+}
+
+html[dir='ltr'] #findPrevious {
+  margin-left: 3px;
+}
+html[dir='ltr'] #findNext {
+  margin-right: 3px;
+}
+
+html[dir='rtl'] #findPrevious {
+  margin-right: 3px;
+}
+html[dir='rtl'] #findNext {
+  margin-left: 3px;
+}
+
+.toolbarButton::before,
+.secondaryToolbarButton::before {
+  /* All matching images have a size of 16x16
+   * All relevant containers have a size of 32x25 */
+  position: absolute;
+  display: inline-block;
+  top: 4px;
+  left: 7px;
+}
+
+html[dir="ltr"] .secondaryToolbarButton::before {
+  left: 4px;
+}
+html[dir="rtl"] .secondaryToolbarButton::before {
+  right: 4px;
+}
+
+html[dir='ltr'] .toolbarButton#sidebarToggle::before {
+  content: url(images/toolbarButton-sidebarToggle.png);
+}
+html[dir='rtl'] .toolbarButton#sidebarToggle::before {
+  content: url(images/toolbarButton-sidebarToggle-rtl.png);
+}
+
+html[dir='ltr'] .toolbarButton#secondaryToolbarToggle::before {
+  content: url(images/toolbarButton-secondaryToolbarToggle.png);
+}
+html[dir='rtl'] .toolbarButton#secondaryToolbarToggle::before {
+  content: url(images/toolbarButton-secondaryToolbarToggle-rtl.png);
+}
+
+html[dir='ltr'] .toolbarButton.findPrevious::before {
+  content: url(images/findbarButton-previous.png);
+}
+html[dir='rtl'] .toolbarButton.findPrevious::before {
+  content: url(images/findbarButton-previous-rtl.png);
+}
+
+html[dir='ltr'] .toolbarButton.findNext::before {
+  content: url(images/findbarButton-next.png);
+}
+html[dir='rtl'] .toolbarButton.findNext::before {
+  content: url(images/findbarButton-next-rtl.png);
+}
+
+html[dir='ltr'] .toolbarButton.pageUp::before {
+  content: url(images/toolbarButton-pageUp.png);
+}
+html[dir='rtl'] .toolbarButton.pageUp::before {
+  content: url(images/toolbarButton-pageUp-rtl.png);
+}
+
+html[dir='ltr'] .toolbarButton.pageDown::before {
+  content: url(images/toolbarButton-pageDown.png);
+}
+html[dir='rtl'] .toolbarButton.pageDown::before {
+  content: url(images/toolbarButton-pageDown-rtl.png);
+}
+
+.toolbarButton.zoomOut::before {
+  content: url(images/toolbarButton-zoomOut.png);
+}
+
+.toolbarButton.zoomIn::before {
+  content: url(images/toolbarButton-zoomIn.png);
+}
+
+.toolbarButton.presentationMode::before,
+.secondaryToolbarButton.presentationMode::before {
+  content: url(images/toolbarButton-presentationMode.png);
+}
+
+.toolbarButton.print::before,
+.secondaryToolbarButton.print::before {
+  content: url(images/toolbarButton-print.png);
+}
+
+.toolbarButton.openFile::before,
+.secondaryToolbarButton.openFile::before {
+  content: url(images/toolbarButton-openFile.png);
+}
+
+.toolbarButton.download::before,
+.secondaryToolbarButton.download::before {
+  content: url(images/toolbarButton-download.png);
+}
+
+.toolbarButton.bookmark,
+.secondaryToolbarButton.bookmark {
+  box-sizing: border-box;
+  outline: none;
+  padding-top: 4px;
+  text-decoration: none;
+}
+.secondaryToolbarButton.bookmark {
+  padding-top: 5px;
+}
+
+.bookmark[href='#'] {
+  opacity: .5;
+  pointer-events: none;
+}
+
+.toolbarButton.bookmark::before,
+.secondaryToolbarButton.bookmark::before {
+  content: url(images/toolbarButton-bookmark.png);
+}
+
+#viewThumbnail.toolbarButton::before {
+  content: url(images/toolbarButton-viewThumbnail.png);
+}
+
+html[dir="ltr"] #viewOutline.toolbarButton::before {
+  content: url(images/toolbarButton-viewOutline.png);
+}
+html[dir="rtl"] #viewOutline.toolbarButton::before {
+  content: url(images/toolbarButton-viewOutline-rtl.png);
+}
+
+#viewAttachments.toolbarButton::before {
+  content: url(images/toolbarButton-viewAttachments.png);
+}
+
+#viewFind.toolbarButton::before {
+  content: url(images/toolbarButton-search.png);
+}
+
+.toolbarButton.pdfSidebarNotification::after {
+  position: absolute;
+  display: inline-block;
+  top: 1px;
+  /* Create a filled circle, with a diameter of 9 pixels, using only CSS: */
+  content: '';
+  background-color: #70DB55;
+  height: 9px;
+  width: 9px;
+  border-radius: 50%;
+}
+html[dir='ltr'] .toolbarButton.pdfSidebarNotification::after {
+  left: 17px;
+}
+html[dir='rtl'] .toolbarButton.pdfSidebarNotification::after {
+  right: 17px;
+}
+
+.secondaryToolbarButton {
+  position: relative;
+  margin: 0 0 4px 0;
+  padding: 3px 0 1px 0;
+  height: auto;
+  min-height: 25px;
+  width: auto;
+  min-width: 100%;
+  white-space: normal;
+}
+html[dir="ltr"] .secondaryToolbarButton {
+  padding-left: 24px;
+  text-align: left;
+}
+html[dir="rtl"] .secondaryToolbarButton {
+  padding-right: 24px;
+  text-align: right;
+}
+html[dir="ltr"] .secondaryToolbarButton.bookmark {
+  padding-left: 27px;
+}
+html[dir="rtl"] .secondaryToolbarButton.bookmark {
+  padding-right: 27px;
+}
+
+html[dir="ltr"] .secondaryToolbarButton > span {
+  padding-right: 4px;
+}
+html[dir="rtl"] .secondaryToolbarButton > span {
+  padding-left: 4px;
+}
+
+.secondaryToolbarButton.firstPage::before {
+  content: url(images/secondaryToolbarButton-firstPage.png);
+}
+
+.secondaryToolbarButton.lastPage::before {
+  content: url(images/secondaryToolbarButton-lastPage.png);
+}
+
+.secondaryToolbarButton.rotateCcw::before {
+  content: url(images/secondaryToolbarButton-rotateCcw.png);
+}
+
+.secondaryToolbarButton.rotateCw::before {
+  content: url(images/secondaryToolbarButton-rotateCw.png);
+}
+
+.secondaryToolbarButton.selectTool::before {
+  content: url(images/secondaryToolbarButton-selectTool.png);
+}
+
+.secondaryToolbarButton.handTool::before {
+  content: url(images/secondaryToolbarButton-handTool.png);
+}
+
+.secondaryToolbarButton.scrollVertical::before {
+  content: url(images/secondaryToolbarButton-scrollVertical.png);
+}
+
+.secondaryToolbarButton.scrollHorizontal::before {
+  content: url(images/secondaryToolbarButton-scrollHorizontal.png);
+}
+
+.secondaryToolbarButton.scrollWrapped::before {
+  content: url(images/secondaryToolbarButton-scrollWrapped.png);
+}
+
+.secondaryToolbarButton.spreadNone::before {
+  content: url(images/secondaryToolbarButton-spreadNone.png);
+}
+
+.secondaryToolbarButton.spreadOdd::before {
+  content: url(images/secondaryToolbarButton-spreadOdd.png);
+}
+
+.secondaryToolbarButton.spreadEven::before {
+  content: url(images/secondaryToolbarButton-spreadEven.png);
+}
+
+.secondaryToolbarButton.documentProperties::before {
+  content: url(images/secondaryToolbarButton-documentProperties.png);
+}
+
+.verticalToolbarSeparator {
+  display: block;
+  padding: 8px 0;
+  margin: 8px 4px;
+  width: 1px;
+  background-color: hsla(0,0%,0%,.5);
+  box-shadow: 0 0 0 1px hsla(0,0%,100%,.08);
+}
+html[dir='ltr'] .verticalToolbarSeparator {
+  margin-left: 2px;
+}
+html[dir='rtl'] .verticalToolbarSeparator {
+  margin-right: 2px;
+}
+
+.horizontalToolbarSeparator {
+  display: block;
+  margin: 0 0 4px 0;
+  height: 1px;
+  width: 100%;
+  background-color: hsla(0,0%,0%,.5);
+  box-shadow: 0 0 0 1px hsla(0,0%,100%,.08);
+}
+
+.toolbarField {
+  padding: 3px 6px;
+  margin: 4px 0 4px 0;
+  border: 1px solid transparent;
+  border-radius: 2px;
+  background-color: hsla(0,0%,100%,.09);
+  background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));
+  background-clip: padding-box;
+  border: 1px solid hsla(0,0%,0%,.35);
+  border-color: hsla(0,0%,0%,.32) hsla(0,0%,0%,.38) hsla(0,0%,0%,.42);
+  box-shadow: 0 1px 0 hsla(0,0%,0%,.05) inset,
+              0 1px 0 hsla(0,0%,100%,.05);
+  color: hsl(0,0%,95%);
+  font-size: 12px;
+  line-height: 14px;
+  outline-style: none;
+  transition-property: background-color, border-color, box-shadow;
+  transition-duration: 150ms;
+  transition-timing-function: ease;
+}
+
+.toolbarField[type=checkbox] {
+  display: inline-block;
+  margin: 8px 0px;
+}
+
+.toolbarField.pageNumber {
+  -moz-appearance: textfield; /* hides the spinner in moz */
+  min-width: 16px;
+  text-align: right;
+  width: 40px;
+}
+
+.toolbarField.pageNumber.visiblePageIsLoading {
+  background-image: url(images/loading-small.png);
+  background-repeat: no-repeat;
+  background-position: 1px;
+}
+
+.toolbarField.pageNumber::-webkit-inner-spin-button,
+.toolbarField.pageNumber::-webkit-outer-spin-button {
+    -webkit-appearance: none;
+    margin: 0;
+}
+
+.toolbarField:hover {
+  background-color: hsla(0,0%,100%,.11);
+  border-color: hsla(0,0%,0%,.4) hsla(0,0%,0%,.43) hsla(0,0%,0%,.45);
+}
+
+.toolbarField:focus {
+  background-color: hsla(0,0%,100%,.15);
+  border-color: hsla(204,100%,65%,.8) hsla(204,100%,65%,.85) hsla(204,100%,65%,.9);
+}
+
+.toolbarLabel {
+  min-width: 16px;
+  padding: 3px 6px 3px 2px;
+  margin: 4px 2px 4px 0;
+  border: 1px solid transparent;
+  border-radius: 2px;
+  color: hsl(0,0%,85%);
+  font-size: 12px;
+  line-height: 14px;
+  text-align: left;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  cursor: default;
+}
+
+#thumbnailView {
+  position: absolute;
+  width: calc(100% - 60px);
+  top: 0;
+  bottom: 0;
+  padding: 10px 30px 0;
+  overflow: auto;
+  -webkit-overflow-scrolling: touch;
+}
+
+.thumbnail {
+  margin: 0 10px 5px 10px;
+}
+html[dir='ltr'] .thumbnail {
+  float: left;
+}
+html[dir='rtl'] .thumbnail {
+  float: right;
+}
+
+#thumbnailView > a:last-of-type > .thumbnail {
+  margin-bottom: 10px;
+}
+
+#thumbnailView > a:last-of-type > .thumbnail:not([data-loaded]) {
+  margin-bottom: 9px;
+}
+
+.thumbnail:not([data-loaded]) {
+  border: 1px dashed rgba(255, 255, 255, 0.5);
+  margin: -1px 9px 4px 9px;
+}
+
+.thumbnailImage {
+  border: 1px solid transparent;
+  box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.5), 0 2px 8px rgba(0, 0, 0, 0.3);
+  opacity: 0.8;
+  z-index: 99;
+  background-color: white;
+  background-clip: content-box;
+}
+
+.thumbnailSelectionRing {
+  border-radius: 2px;
+  padding: 7px;
+}
+
+a:focus > .thumbnail > .thumbnailSelectionRing > .thumbnailImage,
+.thumbnail:hover > .thumbnailSelectionRing > .thumbnailImage {
+  opacity: .9;
+}
+
+a:focus > .thumbnail > .thumbnailSelectionRing,
+.thumbnail:hover > .thumbnailSelectionRing {
+  background-color: hsla(0,0%,100%,.15);
+  background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));
+  background-clip: padding-box;
+  box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset,
+              0 0 1px hsla(0,0%,100%,.2) inset,
+              0 0 1px hsla(0,0%,0%,.2);
+  color: hsla(0,0%,100%,.9);
+}
+
+.thumbnail.selected > .thumbnailSelectionRing > .thumbnailImage {
+  box-shadow: 0 0 0 1px hsla(0,0%,0%,.5);
+  opacity: 1;
+}
+
+.thumbnail.selected > .thumbnailSelectionRing {
+  background-color: hsla(0,0%,100%,.3);
+  background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));
+  background-clip: padding-box;
+  box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset,
+              0 0 1px hsla(0,0%,100%,.1) inset,
+              0 0 1px hsla(0,0%,0%,.2);
+  color: hsla(0,0%,100%,1);
+}
+
+#outlineView,
+#attachmentsView {
+  position: absolute;
+  width: calc(100% - 8px);
+  top: 0;
+  bottom: 0;
+  overflow: auto;
+  -webkit-overflow-scrolling: touch;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+}
+
+#outlineView {
+  padding: 4px 4px 0;
+}
+#attachmentsView {
+  padding: 3px 4px 0;
+}
+
+html[dir='ltr'] .outlineWithDeepNesting > .outlineItem,
+html[dir='ltr'] .outlineItem > .outlineItems {
+  margin-left: 20px;
+}
+
+html[dir='rtl'] .outlineWithDeepNesting > .outlineItem,
+html[dir='rtl'] .outlineItem > .outlineItems {
+  margin-right: 20px;
+}
+
+.outlineItem > a,
+.attachmentsItem > button {
+  text-decoration: none;
+  display: inline-block;
+  min-width: 95%;
+  min-width: calc(100% - 4px); /* Subtract the right padding (left, in RTL mode)
+                                  of the container. */
+  height: auto;
+  margin-bottom: 1px;
+  border-radius: 2px;
+  color: hsla(0,0%,100%,.8);
+  font-size: 13px;
+  line-height: 15px;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  white-space: normal;
+}
+
+.attachmentsItem > button {
+  border: 0 none;
+  background: none;
+  cursor: pointer;
+  width: 100%;
+}
+
+html[dir='ltr'] .outlineItem > a {
+  padding: 2px 0 5px 4px;
+}
+html[dir='ltr'] .attachmentsItem > button {
+  padding: 2px 0 3px 7px;
+  text-align: left;
+}
+
+html[dir='rtl'] .outlineItem > a {
+  padding: 2px 4px 5px 0;
+}
+html[dir='rtl'] .attachmentsItem > button {
+  padding: 2px 7px 3px 0;
+  text-align: right;
+}
+
+.outlineItemToggler {
+  position: relative;
+  height: 0;
+  width: 0;
+  color: hsla(0,0%,100%,.5);
+}
+.outlineItemToggler::before {
+  content: url(images/treeitem-expanded.png);
+  display: inline-block;
+  position: absolute;
+}
+html[dir='ltr'] .outlineItemToggler.outlineItemsHidden::before {
+  content: url(images/treeitem-collapsed.png);
+}
+html[dir='rtl'] .outlineItemToggler.outlineItemsHidden::before {
+  content: url(images/treeitem-collapsed-rtl.png);
+}
+.outlineItemToggler.outlineItemsHidden ~ .outlineItems {
+  display: none;
+}
+html[dir='ltr'] .outlineItemToggler {
+  float: left;
+}
+html[dir='rtl'] .outlineItemToggler {
+  float: right;
+}
+html[dir='ltr'] .outlineItemToggler::before {
+  right: 4px;
+}
+html[dir='rtl'] .outlineItemToggler::before {
+  left: 4px;
+}
+
+.outlineItemToggler:hover,
+.outlineItemToggler:hover + a,
+.outlineItemToggler:hover ~ .outlineItems,
+.outlineItem > a:hover,
+.attachmentsItem > button:hover {
+  background-color: hsla(0,0%,100%,.02);
+  background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));
+  background-clip: padding-box;
+  box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset,
+              0 0 1px hsla(0,0%,100%,.2) inset,
+              0 0 1px hsla(0,0%,0%,.2);
+  border-radius: 2px;
+  color: hsla(0,0%,100%,.9);
+}
+
+.outlineItem.selected {
+  background-color: hsla(0,0%,100%,.08);
+  background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));
+  background-clip: padding-box;
+  box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset,
+              0 0 1px hsla(0,0%,100%,.1) inset,
+              0 0 1px hsla(0,0%,0%,.2);
+  color: hsla(0,0%,100%,1);
+}
+
+.noResults {
+  font-size: 12px;
+  color: hsla(0,0%,100%,.8);
+  font-style: italic;
+  cursor: default;
+}
+
+/* TODO: file FF bug to support ::-moz-selection:window-inactive
+   so we can override the opaque grey background when the window is inactive;
+   see https://bugzilla.mozilla.org/show_bug.cgi?id=706209 */
+::-moz-selection { background: rgba(0,0,255,0.3); }
+::selection { background: rgba(0,0,255,0.3); }
+
+#errorWrapper {
+  background: none repeat scroll 0 0 #FF5555;
+  color: white;
+  left: 0;
+  position: absolute;
+  right: 0;
+  z-index: 1000;
+  padding: 3px;
+  font-size: 0.8em;
+}
+.loadingInProgress #errorWrapper {
+  top: 37px;
+}
+
+#errorMessageLeft {
+  float: left;
+}
+
+#errorMessageRight {
+  float: right;
+}
+
+#errorMoreInfo {
+  background-color: #FFFFFF;
+  color: black;
+  padding: 3px;
+  margin: 3px;
+  width: 98%;
+}
+
+.overlayButton {
+  width: auto;
+  margin: 3px 4px 2px 4px !important;
+  padding: 2px 6px 3px 6px;
+}
+
+#overlayContainer {
+  display: table;
+  position: absolute;
+  width: 100%;
+  height: 100%;
+  background-color: hsla(0,0%,0%,.2);
+  z-index: 40000;
+}
+#overlayContainer > * {
+  overflow: auto;
+  -webkit-overflow-scrolling: touch;
+}
+
+#overlayContainer > .container {
+  display: table-cell;
+  vertical-align: middle;
+  text-align: center;
+}
+
+#overlayContainer > .container > .dialog {
+  display: inline-block;
+  padding: 15px;
+  border-spacing: 4px;
+  color: hsl(0,0%,85%);
+  font-size: 12px;
+  line-height: 14px;
+  background-color: #474747; /* fallback */
+  background-image: url(images/texture.png),
+                    linear-gradient(hsla(0,0%,32%,.99), hsla(0,0%,27%,.95));
+  box-shadow: inset 1px 0 0 hsla(0,0%,100%,.08),
+              inset 0 1px 1px hsla(0,0%,0%,.15),
+              inset 0 -1px 0 hsla(0,0%,100%,.05),
+              0 1px 0 hsla(0,0%,0%,.15),
+              0 1px 1px hsla(0,0%,0%,.1);
+  border: 1px solid hsla(0,0%,0%,.5);
+  border-radius: 4px;
+  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
+}
+
+.dialog > .row {
+  display: table-row;
+}
+
+.dialog > .row > * {
+  display: table-cell;
+}
+
+.dialog .toolbarField {
+  margin: 5px 0;
+}
+
+.dialog .separator {
+  display: block;
+  margin: 4px 0 4px 0;
+  height: 1px;
+  width: 100%;
+  background-color: hsla(0,0%,0%,.5);
+  box-shadow: 0 0 0 1px hsla(0,0%,100%,.08);
+}
+
+.dialog .buttonRow {
+  text-align: center;
+  vertical-align: middle;
+}
+
+.dialog :link {
+  color: white;
+}
+
+#passwordOverlay > .dialog {
+  text-align: center;
+}
+#passwordOverlay .toolbarField {
+  width: 200px;
+}
+
+#documentPropertiesOverlay > .dialog {
+  text-align: left;
+}
+#documentPropertiesOverlay .row > * {
+  min-width: 100px;
+}
+html[dir='ltr'] #documentPropertiesOverlay .row > * {
+  text-align: left;
+}
+html[dir='rtl'] #documentPropertiesOverlay .row > * {
+  text-align: right;
+}
+#documentPropertiesOverlay .row > span {
+  width: 125px;
+  word-wrap: break-word;
+}
+#documentPropertiesOverlay .row > p {
+  max-width: 225px;
+  word-wrap: break-word;
+}
+#documentPropertiesOverlay .buttonRow {
+  margin-top: 10px;
+}
+
+.clearBoth {
+  clear: both;
+}
+
+.fileInput {
+  background: white;
+  color: black;
+  margin-top: 5px;
+  visibility: hidden;
+  position: fixed;
+  right: 0;
+  top: 0;
+}
+
+#PDFBug {
+  background: none repeat scroll 0 0 white;
+  border: 1px solid #666666;
+  position: fixed;
+  top: 32px;
+  right: 0;
+  bottom: 0;
+  font-size: 10px;
+  padding: 0;
+  width: 300px;
+}
+#PDFBug .controls {
+    background:#EEEEEE;
+    border-bottom: 1px solid #666666;
+    padding: 3px;
+}
+#PDFBug .panels {
+  bottom: 0;
+  left: 0;
+  overflow: auto;
+  -webkit-overflow-scrolling: touch;
+  position: absolute;
+  right: 0;
+  top: 27px;
+}
+#PDFBug button.active {
+  font-weight: bold;
+}
+.debuggerShowText {
+  background: none repeat scroll 0 0 yellow;
+  color: blue;
+}
+.debuggerHideText:hover {
+  background: none repeat scroll 0 0 yellow;
+}
+#PDFBug .stats {
+  font-family: courier;
+  font-size: 10px;
+  white-space: pre;
+}
+#PDFBug .stats .title {
+    font-weight: bold;
+}
+#PDFBug table {
+  font-size: 10px;
+}
+
+#viewer.textLayer-visible .textLayer {
+  opacity: 1.0;
+}
+
+#viewer.textLayer-visible .canvasWrapper {
+  background-color: rgb(128,255,128);
+}
+
+#viewer.textLayer-visible .canvasWrapper canvas {
+  mix-blend-mode: screen;
+}
+
+#viewer.textLayer-visible .textLayer > div {
+  background-color: rgba(255, 255, 0, 0.1);
+  color: black;
+  border: solid 1px rgba(255, 0, 0, 0.5);
+  box-sizing: border-box;
+}
+
+#viewer.textLayer-hover .textLayer > div:hover {
+  background-color: white;
+  color: black;
+}
+
+#viewer.textLayer-shadow .textLayer > div {
+  background-color: rgba(255,255,255, .6);
+  color: black;
+}
+
+.grab-to-pan-grab {
+  cursor: url("images/grab.cur"), move !important;
+  cursor: -webkit-grab !important;
+  cursor: grab !important;
+}
+.grab-to-pan-grab *:not(input):not(textarea):not(button):not(select):not(:link) {
+  cursor: inherit !important;
+}
+.grab-to-pan-grab:active,
+.grab-to-pan-grabbing {
+  cursor: url("images/grabbing.cur"), move !important;
+  cursor: -webkit-grabbing !important;
+  cursor: grabbing !important;
+
+  position: fixed;
+  background: transparent;
+  display: block;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  overflow: hidden;
+  z-index: 50000; /* should be higher than anything else in PDF.js! */
+}
+
+@page {
+  margin: 0;
+}
+
+#printContainer {
+  display: none;
+}
+
+@media screen and (-webkit-min-device-pixel-ratio: 2), screen and (min-resolution: 2dppx) {
+  /* Rules for Retina screens */
+  .toolbarButton::before {
+    -webkit-transform: scale(0.5);
+            transform: scale(0.5);
+    top: -5px;
+  }
+
+  .secondaryToolbarButton::before {
+    -webkit-transform: scale(0.5);
+            transform: scale(0.5);
+    top: -4px;
+  }
+
+  html[dir='ltr'] .toolbarButton::before,
+  html[dir='rtl'] .toolbarButton::before {
+    left: -1px;
+  }
+
+  html[dir='ltr'] .secondaryToolbarButton::before {
+    left: -2px;
+  }
+  html[dir='rtl'] .secondaryToolbarButton::before {
+    left: 186px;
+  }
+
+  .toolbarField.pageNumber.visiblePageIsLoading,
+  #findInput[data-status="pending"] {
+    background-image: url(images/loading-small@2x.png);
+    background-size: 16px 17px;
+  }
+
+  .dropdownToolbarButton {
+    background: url(images/toolbarButton-menuArrows@2x.png) no-repeat;
+    background-size: 7px 16px;
+  }
+
+  html[dir='ltr'] .toolbarButton#sidebarToggle::before {
+    content: url(images/toolbarButton-sidebarToggle@2x.png);
+  }
+  html[dir='rtl'] .toolbarButton#sidebarToggle::before {
+    content: url(images/toolbarButton-sidebarToggle-rtl@2x.png);
+  }
+
+  html[dir='ltr'] .toolbarButton#secondaryToolbarToggle::before {
+    content: url(images/toolbarButton-secondaryToolbarToggle@2x.png);
+  }
+  html[dir='rtl'] .toolbarButton#secondaryToolbarToggle::before {
+    content: url(images/toolbarButton-secondaryToolbarToggle-rtl@2x.png);
+  }
+
+  html[dir='ltr'] .toolbarButton.findPrevious::before {
+    content: url(images/findbarButton-previous@2x.png);
+  }
+  html[dir='rtl'] .toolbarButton.findPrevious::before {
+    content: url(images/findbarButton-previous-rtl@2x.png);
+  }
+
+  html[dir='ltr'] .toolbarButton.findNext::before {
+    content: url(images/findbarButton-next@2x.png);
+  }
+  html[dir='rtl'] .toolbarButton.findNext::before {
+    content: url(images/findbarButton-next-rtl@2x.png);
+  }
+
+  html[dir='ltr'] .toolbarButton.pageUp::before {
+    content: url(images/toolbarButton-pageUp@2x.png);
+  }
+  html[dir='rtl'] .toolbarButton.pageUp::before {
+    content: url(images/toolbarButton-pageUp-rtl@2x.png);
+  }
+
+  html[dir='ltr'] .toolbarButton.pageDown::before {
+    content: url(images/toolbarButton-pageDown@2x.png);
+  }
+  html[dir='rtl'] .toolbarButton.pageDown::before {
+    content: url(images/toolbarButton-pageDown-rtl@2x.png);
+  }
+
+  .toolbarButton.zoomIn::before {
+    content: url(images/toolbarButton-zoomIn@2x.png);
+  }
+
+  .toolbarButton.zoomOut::before {
+    content: url(images/toolbarButton-zoomOut@2x.png);
+  }
+
+  .toolbarButton.presentationMode::before,
+  .secondaryToolbarButton.presentationMode::before {
+    content: url(images/toolbarButton-presentationMode@2x.png);
+  }
+
+  .toolbarButton.print::before,
+  .secondaryToolbarButton.print::before {
+    content: url(images/toolbarButton-print@2x.png);
+  }
+
+  .toolbarButton.openFile::before,
+  .secondaryToolbarButton.openFile::before {
+    content: url(images/toolbarButton-openFile@2x.png);
+  }
+
+  .toolbarButton.download::before,
+  .secondaryToolbarButton.download::before {
+    content: url(images/toolbarButton-download@2x.png);
+  }
+
+  .toolbarButton.bookmark::before,
+  .secondaryToolbarButton.bookmark::before {
+    content: url(images/toolbarButton-bookmark@2x.png);
+  }
+
+  #viewThumbnail.toolbarButton::before {
+    content: url(images/toolbarButton-viewThumbnail@2x.png);
+  }
+
+  html[dir="ltr"] #viewOutline.toolbarButton::before {
+    content: url(images/toolbarButton-viewOutline@2x.png);
+  }
+  html[dir="rtl"] #viewOutline.toolbarButton::before {
+    content: url(images/toolbarButton-viewOutline-rtl@2x.png);
+  }
+
+  #viewAttachments.toolbarButton::before {
+    content: url(images/toolbarButton-viewAttachments@2x.png);
+  }
+
+  #viewFind.toolbarButton::before {
+    content: url(images/toolbarButton-search@2x.png);
+  }
+
+  .secondaryToolbarButton.firstPage::before {
+    content: url(images/secondaryToolbarButton-firstPage@2x.png);
+  }
+
+  .secondaryToolbarButton.lastPage::before {
+    content: url(images/secondaryToolbarButton-lastPage@2x.png);
+  }
+
+  .secondaryToolbarButton.rotateCcw::before {
+    content: url(images/secondaryToolbarButton-rotateCcw@2x.png);
+  }
+
+  .secondaryToolbarButton.rotateCw::before {
+    content: url(images/secondaryToolbarButton-rotateCw@2x.png);
+  }
+
+  .secondaryToolbarButton.selectTool::before {
+    content: url(images/secondaryToolbarButton-selectTool@2x.png);
+  }
+
+  .secondaryToolbarButton.handTool::before {
+    content: url(images/secondaryToolbarButton-handTool@2x.png);
+  }
+
+  .secondaryToolbarButton.scrollVertical::before {
+    content: url(images/secondaryToolbarButton-scrollVertical@2x.png);
+  }
+
+  .secondaryToolbarButton.scrollHorizontal::before {
+    content: url(images/secondaryToolbarButton-scrollHorizontal@2x.png);
+  }
+
+  .secondaryToolbarButton.scrollWrapped::before {
+    content: url(images/secondaryToolbarButton-scrollWrapped@2x.png);
+  }
+
+  .secondaryToolbarButton.spreadNone::before {
+    content: url(images/secondaryToolbarButton-spreadNone@2x.png);
+  }
+
+  .secondaryToolbarButton.spreadOdd::before {
+    content: url(images/secondaryToolbarButton-spreadOdd@2x.png);
+  }
+
+  .secondaryToolbarButton.spreadEven::before {
+    content: url(images/secondaryToolbarButton-spreadEven@2x.png);
+  }
+
+  .secondaryToolbarButton.documentProperties::before {
+    content: url(images/secondaryToolbarButton-documentProperties@2x.png);
+  }
+
+  .outlineItemToggler::before {
+    -webkit-transform: scale(0.5);
+            transform: scale(0.5);
+    top: -1px;
+    content: url(images/treeitem-expanded@2x.png);
+  }
+  html[dir='ltr'] .outlineItemToggler.outlineItemsHidden::before {
+    content: url(images/treeitem-collapsed@2x.png);
+  }
+  html[dir='rtl'] .outlineItemToggler.outlineItemsHidden::before {
+    content: url(images/treeitem-collapsed-rtl@2x.png);
+  }
+  html[dir='ltr'] .outlineItemToggler::before {
+    right: 0;
+  }
+  html[dir='rtl'] .outlineItemToggler::before {
+    left: 0;
+  }
+}
+
+@media print {
+  /* General rules for printing. */
+  body {
+    background: transparent none;
+  }
+
+  /* Rules for browsers that don't support mozPrintCallback. */
+  #sidebarContainer, #secondaryToolbar, .toolbar, #loadingBox, #errorWrapper, .textLayer {
+    display: none;
+  }
+  #viewerContainer {
+    overflow: visible;
+  }
+
+  #mainContainer, #viewerContainer, .page, .page canvas {
+    position: static;
+    padding: 0;
+    margin: 0;
+  }
+
+  .page {
+    float: left;
+    display: none;
+    border: none;
+    box-shadow: none;
+    background-clip: content-box;
+    background-color: white;
+  }
+
+  .page[data-loaded] {
+    display: block;
+  }
+
+  .fileInput {
+    display: none;
+  }
+
+  /* Rules for browsers that support PDF.js printing */
+  body[data-pdfjsprinting] #outerContainer {
+    display: none;
+  }
+  body[data-pdfjsprinting] #printContainer {
+    display: block;
+  }
+  #printContainer {
+    height: 100%;
+  }
+  /* wrapper around (scaled) print canvas elements */
+  #printContainer > div {
+    position: relative;
+    top: 0;
+    left: 0;
+    width: 1px;
+    height: 1px;
+    overflow: visible;
+    page-break-after: always;
+    page-break-inside: avoid;
+  }
+  #printContainer canvas,
+  #printContainer img {
+    display: block;
+  }
+}
+
+.visibleLargeView,
+.visibleMediumView,
+.visibleSmallView {
+  display: none;
+}
+
+@media all and (max-width: 900px) {
+  #toolbarViewerMiddle {
+    display: table;
+    margin: auto;
+    left: auto;
+    position: inherit;
+    -webkit-transform: none;
+            transform: none;
+  }
+}
+
+@media all and (max-width: 840px) {
+  #sidebarContent {
+    background-color: hsla(0,0%,0%,.7);
+  }
+
+  html[dir='ltr'] #outerContainer.sidebarOpen #viewerContainer {
+    left: 0px !important;
+  }
+  html[dir='rtl'] #outerContainer.sidebarOpen #viewerContainer {
+    right: 0px !important;
+  }
+
+  #outerContainer .hiddenLargeView,
+  #outerContainer .hiddenMediumView {
+    display: inherit;
+  }
+  #outerContainer .visibleLargeView,
+  #outerContainer .visibleMediumView {
+    display: none;
+  }
+}
+
+@media all and (max-width: 770px) {
+  #outerContainer .hiddenLargeView {
+    display: none;
+  }
+  #outerContainer .visibleLargeView {
+    display: inherit;
+  }
+}
+
+@media all and (max-width: 700px) {
+  #outerContainer .hiddenMediumView {
+    display: none;
+  }
+  #outerContainer .visibleMediumView {
+    display: inherit;
+  }
+}
+
+@media all and (max-width: 640px) {
+  .hiddenSmallView, .hiddenSmallView * {
+    display: none;
+  }
+  .visibleSmallView {
+    display: inherit;
+  }
+  .toolbarButtonSpacer {
+    width: 0;
+  }
+  html[dir='ltr'] .findbar {
+    left: 38px;
+  }
+  html[dir='rtl'] .findbar {
+    right: 38px;
+  }
+}
+
+@media all and (max-width: 535px) {
+  #scaleSelectContainer {
+    display: none;
+  }
+}
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/viewer.html b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/viewer.html
new file mode 100644
index 0000000..ef6dc88
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/viewer.html
@@ -0,0 +1,395 @@
+<!DOCTYPE html>
+<!--
+Copyright 2012 Mozilla Foundation
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+Adobe CMap resources are covered by their own copyright but the same license:
+
+    Copyright 1990-2015 Adobe Systems Incorporated.
+
+See https://github.com/adobe-type-tools/cmap-resources
+-->
+<html dir="ltr" mozdisallowselectionprint>
+  <head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+    <meta name="google" content="notranslate">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <title>PDF.js viewer</title>
+
+
+    <link rel="stylesheet" href="viewer.css">
+
+
+<!-- This snippet is used in production (included from viewer.html) -->
+<link rel="resource" type="application/l10n" href="locale/locale.properties">
+    <!--<script src="../build/pdf.compatibility.js"></script>-->
+<script src="../build/pdf.js"></script>
+
+
+    <script src="viewer.js"></script>
+
+  </head>
+
+  <body tabindex="1" class="loadingInProgress" oncontextmenu="doNothing()">
+    <div id="outerContainer">
+
+      <div id="sidebarContainer">
+        <div id="toolbarSidebar">
+          <div class="splitToolbarButton toggled">
+            <button id="viewThumbnail" class="toolbarButton toggled" title="Show Thumbnails" tabindex="2" data-l10n-id="thumbs">
+               <span data-l10n-id="thumbs_label">Thumbnails</span>
+            </button>
+            <button id="viewOutline" class="toolbarButton" title="Show Document Outline (double-click to expand/collapse all items)" tabindex="3" data-l10n-id="document_outline">
+               <span data-l10n-id="document_outline_label">Document Outline</span>
+            </button>
+            <button id="viewAttachments" class="toolbarButton" title="Show Attachments" tabindex="4" data-l10n-id="attachments">
+               <span data-l10n-id="attachments_label">Attachments</span>
+            </button>
+          </div>
+        </div>
+        <div id="sidebarContent">
+          <div id="thumbnailView">
+          </div>
+          <div id="outlineView" class="hidden">
+          </div>
+          <div id="attachmentsView" class="hidden">
+          </div>
+        </div>
+        <div id="sidebarResizer" class="hidden"></div>
+      </div>  <!-- sidebarContainer -->
+
+      <div id="mainContainer">
+        <div class="findbar hidden doorHanger" id="findbar">
+          <div id="findbarInputContainer">
+            <input id="findInput" class="toolbarField" title="Find" placeholder="Find in document鈥�" tabindex="91" data-l10n-id="find_input">
+            <div class="splitToolbarButton">
+              <button id="findPrevious" class="toolbarButton findPrevious" title="Find the previous occurrence of the phrase" tabindex="92" data-l10n-id="find_previous">
+                <span data-l10n-id="find_previous_label">Previous</span>
+              </button>
+              <div class="splitToolbarButtonSeparator"></div>
+              <button id="findNext" class="toolbarButton findNext" title="Find the next occurrence of the phrase" tabindex="93" data-l10n-id="find_next">
+                <span data-l10n-id="find_next_label">Next</span>
+              </button>
+            </div>
+          </div>
+
+          <div id="findbarOptionsOneContainer">
+            <input type="checkbox" id="findHighlightAll" class="toolbarField" tabindex="94">
+            <label for="findHighlightAll" class="toolbarLabel" data-l10n-id="find_highlight">Highlight all</label>
+            <input type="checkbox" id="findMatchCase" class="toolbarField" tabindex="95">
+            <label for="findMatchCase" class="toolbarLabel" data-l10n-id="find_match_case_label">Match case</label>
+          </div>
+          <div id="findbarOptionsTwoContainer">
+            <input type="checkbox" id="findEntireWord" class="toolbarField" tabindex="96">
+            <label for="findEntireWord" class="toolbarLabel" data-l10n-id="find_entire_word_label">Whole words</label>
+            <span id="findResultsCount" class="toolbarLabel hidden"></span>
+          </div>
+
+          <div id="findbarMessageContainer">
+            <span id="findMsg" class="toolbarLabel"></span>
+          </div>
+        </div>  <!-- findbar -->
+
+        <div id="secondaryToolbar" class="secondaryToolbar hidden doorHangerRight">
+          <div id="secondaryToolbarButtonContainer">
+            <button id="secondaryPresentationMode" class="secondaryToolbarButton presentationMode visibleLargeView" title="Switch to Presentation Mode" tabindex="51" data-l10n-id="presentation_mode">
+              <span data-l10n-id="presentation_mode_label">Presentation Mode</span>
+            </button>
+
+            <button id="secondaryOpenFile" class="secondaryToolbarButton openFile visibleLargeView" title="Open File" tabindex="52" data-l10n-id="open_file">
+              <span data-l10n-id="open_file_label">Open</span>
+            </button>
+
+            <button id="secondaryPrint" class="secondaryToolbarButton print visibleMediumView" title="Print" tabindex="53" data-l10n-id="print">
+              <span data-l10n-id="print_label">Print</span>
+            </button>
+
+            <button id="secondaryDownload" class="secondaryToolbarButton download visibleMediumView" title="Download" tabindex="54" data-l10n-id="download">
+              <span data-l10n-id="download_label">Download</span>
+            </button>
+
+            <a href="#" id="secondaryViewBookmark" class="secondaryToolbarButton bookmark visibleSmallView" title="Current view (copy or open in new window)" tabindex="55" data-l10n-id="bookmark">
+              <span data-l10n-id="bookmark_label">Current View</span>
+            </a>
+
+            <div class="horizontalToolbarSeparator visibleLargeView"></div>
+
+            <button id="firstPage" class="secondaryToolbarButton firstPage" title="Go to First Page" tabindex="56" data-l10n-id="first_page">
+              <span data-l10n-id="first_page_label">Go to First Page</span>
+            </button>
+            <button id="lastPage" class="secondaryToolbarButton lastPage" title="Go to Last Page" tabindex="57" data-l10n-id="last_page">
+              <span data-l10n-id="last_page_label">Go to Last Page</span>
+            </button>
+
+            <div class="horizontalToolbarSeparator"></div>
+
+            <button id="pageRotateCw" class="secondaryToolbarButton rotateCw" title="Rotate Clockwise" tabindex="58" data-l10n-id="page_rotate_cw">
+              <span data-l10n-id="page_rotate_cw_label">Rotate Clockwise</span>
+            </button>
+            <button id="pageRotateCcw" class="secondaryToolbarButton rotateCcw" title="Rotate Counterclockwise" tabindex="59" data-l10n-id="page_rotate_ccw">
+              <span data-l10n-id="page_rotate_ccw_label">Rotate Counterclockwise</span>
+            </button>
+
+            <div class="horizontalToolbarSeparator"></div>
+
+            <button id="cursorSelectTool" class="secondaryToolbarButton selectTool toggled" title="Enable Text Selection Tool" tabindex="60" data-l10n-id="cursor_text_select_tool">
+              <span data-l10n-id="cursor_text_select_tool_label">Text Selection Tool</span>
+            </button>
+            <button id="cursorHandTool" class="secondaryToolbarButton handTool" title="Enable Hand Tool" tabindex="61" data-l10n-id="cursor_hand_tool">
+              <span data-l10n-id="cursor_hand_tool_label">Hand Tool</span>
+            </button>
+
+            <div class="horizontalToolbarSeparator"></div>
+
+            <button id="scrollVertical" class="secondaryToolbarButton scrollModeButtons scrollVertical toggled" title="Use Vertical Scrolling" tabindex="62" data-l10n-id="scroll_vertical">
+              <span data-l10n-id="scroll_vertical_label">Vertical Scrolling</span>
+            </button>
+            <button id="scrollHorizontal" class="secondaryToolbarButton scrollModeButtons scrollHorizontal" title="Use Horizontal Scrolling" tabindex="63" data-l10n-id="scroll_horizontal">
+              <span data-l10n-id="scroll_horizontal_label">Horizontal Scrolling</span>
+            </button>
+            <button id="scrollWrapped" class="secondaryToolbarButton scrollModeButtons scrollWrapped" title="Use Wrapped Scrolling" tabindex="64" data-l10n-id="scroll_wrapped">
+              <span data-l10n-id="scroll_wrapped_label">Wrapped Scrolling</span>
+            </button>
+
+            <div class="horizontalToolbarSeparator scrollModeButtons"></div>
+
+            <button id="spreadNone" class="secondaryToolbarButton spreadModeButtons spreadNone toggled" title="Do not join page spreads" tabindex="65" data-l10n-id="spread_none">
+              <span data-l10n-id="spread_none_label">No Spreads</span>
+            </button>
+            <button id="spreadOdd" class="secondaryToolbarButton spreadModeButtons spreadOdd" title="Join page spreads starting with odd-numbered pages" tabindex="66" data-l10n-id="spread_odd">
+              <span data-l10n-id="spread_odd_label">Odd Spreads</span>
+            </button>
+            <button id="spreadEven" class="secondaryToolbarButton spreadModeButtons spreadEven" title="Join page spreads starting with even-numbered pages" tabindex="67" data-l10n-id="spread_even">
+              <span data-l10n-id="spread_even_label">Even Spreads</span>
+            </button>
+
+            <div class="horizontalToolbarSeparator spreadModeButtons"></div>
+
+            <button id="documentProperties" class="secondaryToolbarButton documentProperties" title="Document Properties鈥�" tabindex="68" data-l10n-id="document_properties">
+              <span data-l10n-id="document_properties_label">Document Properties鈥�</span>
+            </button>
+          </div>
+        </div>  <!-- secondaryToolbar -->
+
+        <div class="toolbar">
+          <div id="toolbarContainer">
+            <div id="toolbarViewer">
+              <div id="toolbarViewerLeft">
+                <button id="sidebarToggle" class="toolbarButton" title="Toggle Sidebar" tabindex="11" data-l10n-id="toggle_sidebar">
+                  <span data-l10n-id="toggle_sidebar_label">Toggle Sidebar</span>
+                </button>
+                <div class="toolbarButtonSpacer"></div>
+                <button id="viewFind" class="toolbarButton" title="Find in Document" tabindex="12" data-l10n-id="findbar">
+                  <span data-l10n-id="findbar_label">Find</span>
+                </button>
+                <div class="splitToolbarButton hiddenSmallView">
+                  <button class="toolbarButton pageUp" title="Previous Page" id="previous" tabindex="13" data-l10n-id="previous">
+                    <span data-l10n-id="previous_label">Previous</span>
+                  </button>
+                  <div class="splitToolbarButtonSeparator"></div>
+                  <button class="toolbarButton pageDown" title="Next Page" id="next" tabindex="14" data-l10n-id="next">
+                    <span data-l10n-id="next_label">Next</span>
+                  </button>
+                </div>
+                <input type="number" id="pageNumber" class="toolbarField pageNumber" title="Page" value="1" size="4" min="1" tabindex="15" data-l10n-id="page">
+                <span id="numPages" class="toolbarLabel"></span>
+              </div>
+              <div id="toolbarViewerRight">
+                <button id="presentationMode" class="toolbarButton presentationMode hiddenLargeView" title="Switch to Presentation Mode" tabindex="31"  data-l10n-id="presentation_mode">
+                  <span data-l10n-id="presentation_mode_label">Presentation Mode</span>
+                </button>
+
+                <button id="openFile" class="toolbarButton openFile hiddenLargeView" title="Open File" tabindex="32" style="display:none" data-l10n-id="open_file">
+                  <span data-l10n-id="open_file_label">Open</span>
+                </button>
+
+                <button id="print" class="toolbarButton print hiddenMediumView" title="Print" tabindex="33" data-l10n-id="print" style="display:none;width:70px;">
+                  <span data-l10n-id="print_label" style="width:35px;height:25px;margin-top:3px;">Print</span>
+                </button>
+
+                <button id="download" class="toolbarButton download hiddenMediumView" title="Download" tabindex="34" data-l10n-id="download" style="display:none;width:70px;">
+                  <span data-l10n-id="download_label" style="width:35px;height:25px;margin-top:3px;">Download</span>
+                </button>
+                <a href="#" id="viewBookmark" class="toolbarButton bookmark hiddenSmallView" title="Current view (copy or open in new window)" tabindex="35" data-l10n-id="bookmark" style="display:none">
+                  <span data-l10n-id="bookmark_label">Current View</span>
+                </a>
+
+                <div class="verticalToolbarSeparator hiddenSmallView"></div>
+
+                <button id="secondaryToolbarToggle" class="toolbarButton" title="Tools" tabindex="36" data-l10n-id="tools">
+                  <span data-l10n-id="tools_label">Tools</span>
+                </button>
+              </div>
+              <div id="toolbarViewerMiddle">
+                <div class="splitToolbarButton">
+                  <button id="zoomOut" class="toolbarButton zoomOut" title="Zoom Out" tabindex="21" data-l10n-id="zoom_out">
+                    <span data-l10n-id="zoom_out_label">Zoom Out</span>
+                  </button>
+                  <div class="splitToolbarButtonSeparator"></div>
+                  <button id="zoomIn" class="toolbarButton zoomIn" title="Zoom In" tabindex="22" data-l10n-id="zoom_in">
+                    <span data-l10n-id="zoom_in_label">Zoom In</span>
+                   </button>
+                </div>
+                <span id="scaleSelectContainer" class="dropdownToolbarButton">
+                  <select id="scaleSelect" title="Zoom" tabindex="23" data-l10n-id="zoom">
+                    <option id="pageAutoOption" title="" value="auto" selected="selected" data-l10n-id="page_scale_auto">Automatic Zoom</option>
+                    <option id="pageActualOption" title="" value="page-actual" data-l10n-id="page_scale_actual">Actual Size</option>
+                    <option id="pageFitOption" title="" value="page-fit" data-l10n-id="page_scale_fit">Page Fit</option>
+                    <option id="pageWidthOption" title="" value="page-width" data-l10n-id="page_scale_width">Page Width</option>
+                    <option id="customScaleOption" title="" value="custom" disabled="disabled" hidden="true"></option>
+                    <option title="" value="0.5" data-l10n-id="page_scale_percent" data-l10n-args='{ "scale": 50 }'>50%</option>
+                    <option title="" value="0.75" data-l10n-id="page_scale_percent" data-l10n-args='{ "scale": 75 }'>75%</option>
+                    <option title="" value="1" data-l10n-id="page_scale_percent" data-l10n-args='{ "scale": 100 }'>100%</option>
+                    <option title="" value="1.25" data-l10n-id="page_scale_percent" data-l10n-args='{ "scale": 125 }'>125%</option>
+                    <option title="" value="1.5" data-l10n-id="page_scale_percent" data-l10n-args='{ "scale": 150 }'>150%</option>
+                    <option title="" value="2" data-l10n-id="page_scale_percent" data-l10n-args='{ "scale": 200 }'>200%</option>
+                    <option title="" value="3" data-l10n-id="page_scale_percent" data-l10n-args='{ "scale": 300 }'>300%</option>
+                    <option title="" value="4" data-l10n-id="page_scale_percent" data-l10n-args='{ "scale": 400 }'>400%</option>
+                  </select>
+                </span>
+              </div>
+            </div>
+            <div id="loadingBar">
+              <div class="progress">
+                <div class="glimmer">
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+
+        <menu type="context" id="viewerContextMenu">
+          <menuitem id="contextFirstPage" label="First Page"
+                    data-l10n-id="first_page"></menuitem>
+          <menuitem id="contextLastPage" label="Last Page"
+                    data-l10n-id="last_page"></menuitem>
+          <menuitem id="contextPageRotateCw" label="Rotate Clockwise"
+                    data-l10n-id="page_rotate_cw"></menuitem>
+          <menuitem id="contextPageRotateCcw" label="Rotate Counter-Clockwise"
+                    data-l10n-id="page_rotate_ccw"></menuitem>
+        </menu>
+
+        <div id="viewerContainer" tabindex="0">
+          <div id="viewer" class="pdfViewer"></div>
+        </div>
+
+        <div id="errorWrapper" hidden='true'>
+          <div id="errorMessageLeft">
+            <span id="errorMessage"></span>
+            <button id="errorShowMore" data-l10n-id="error_more_info">
+              More Information
+            </button>
+            <button id="errorShowLess" data-l10n-id="error_less_info" hidden='true'>
+              Less Information
+            </button>
+          </div>
+          <div id="errorMessageRight">
+            <button id="errorClose" data-l10n-id="error_close">
+              Close
+            </button>
+          </div>
+          <div class="clearBoth"></div>
+          <textarea id="errorMoreInfo" hidden='true' readonly="readonly"></textarea>
+        </div>
+      </div> <!-- mainContainer -->
+
+      <div id="overlayContainer" class="hidden">
+        <div id="passwordOverlay" class="container hidden">
+          <div class="dialog">
+            <div class="row">
+              <p id="passwordText" data-l10n-id="password_label">Enter the password to open this PDF file:</p>
+            </div>
+            <div class="row">
+              <input type="password" id="password" class="toolbarField">
+            </div>
+            <div class="buttonRow">
+              <button id="passwordCancel" class="overlayButton"><span data-l10n-id="password_cancel">Cancel</span></button>
+              <button id="passwordSubmit" class="overlayButton"><span data-l10n-id="password_ok">OK</span></button>
+            </div>
+          </div>
+        </div>
+        <div id="documentPropertiesOverlay" class="container hidden">
+          <div class="dialog">
+            <div class="row">
+              <span data-l10n-id="document_properties_file_name">File name:</span> <p id="fileNameField">-</p>
+            </div>
+            <div class="row">
+              <span data-l10n-id="document_properties_file_size">File size:</span> <p id="fileSizeField">-</p>
+            </div>
+            <div class="separator"></div>
+            <div class="row">
+              <span data-l10n-id="document_properties_title">Title:</span> <p id="titleField">-</p>
+            </div>
+            <div class="row">
+              <span data-l10n-id="document_properties_author">Author:</span> <p id="authorField">-</p>
+            </div>
+            <div class="row">
+              <span data-l10n-id="document_properties_subject">Subject:</span> <p id="subjectField">-</p>
+            </div>
+            <div class="row">
+              <span data-l10n-id="document_properties_keywords">Keywords:</span> <p id="keywordsField">-</p>
+            </div>
+            <div class="row">
+              <span data-l10n-id="document_properties_creation_date">Creation Date:</span> <p id="creationDateField">-</p>
+            </div>
+            <div class="row">
+              <span data-l10n-id="document_properties_modification_date">Modification Date:</span> <p id="modificationDateField">-</p>
+            </div>
+            <div class="row">
+              <span data-l10n-id="document_properties_creator">Creator:</span> <p id="creatorField">-</p>
+            </div>
+            <div class="separator"></div>
+            <div class="row">
+              <span data-l10n-id="document_properties_producer">PDF Producer:</span> <p id="producerField">-</p>
+            </div>
+            <div class="row">
+              <span data-l10n-id="document_properties_version">PDF Version:</span> <p id="versionField">-</p>
+            </div>
+            <div class="row">
+              <span data-l10n-id="document_properties_page_count">Page Count:</span> <p id="pageCountField">-</p>
+            </div>
+            <div class="row">
+              <span data-l10n-id="document_properties_page_size">Page Size:</span> <p id="pageSizeField">-</p>
+            </div>
+            <div class="separator"></div>
+            <div class="row">
+              <span data-l10n-id="document_properties_linearized">Fast Web View:</span> <p id="linearizedField">-</p>
+            </div>
+            <div class="buttonRow">
+              <button id="documentPropertiesClose" class="overlayButton"><span data-l10n-id="document_properties_close">Close</span></button>
+            </div>
+          </div>
+        </div>
+        <div id="printServiceOverlay" class="container hidden">
+          <div class="dialog">
+            <div class="row">
+              <span data-l10n-id="print_progress_message">Preparing document for printing鈥�</span>
+            </div>
+            <div class="row">
+              <progress value="0" max="100"></progress>
+              <span data-l10n-id="print_progress_percent" data-l10n-args='{ "progress": 0 }' class="relative-progress">0%</span>
+            </div>
+            <div class="buttonRow">
+              <button id="printCancel" class="overlayButton"><span data-l10n-id="print_progress_close">Cancel</span></button>
+            </div>
+          </div>
+        </div>
+      </div>  <!-- overlayContainer -->
+
+    </div> <!-- outerContainer -->
+    <div id="printContainer"></div>
+  </body>
+</html>
+
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/viewer.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/viewer.js
new file mode 100644
index 0000000..e57ae78
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/viewer.js
@@ -0,0 +1,13407 @@
+/**
+ * @licstart The following is the entire license notice for the
+ * Javascript code in this page
+ *
+ * Copyright 2018 Mozilla Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * @licend The above is the entire license notice for the
+ * Javascript code in this page
+ */
+
+/******/ (function(modules) { // webpackBootstrap
+/******/ 	// The module cache
+/******/ 	var installedModules = {};
+/******/
+/******/ 	// The require function
+/******/ 	function __webpack_require__(moduleId) {
+/******/
+/******/ 		// Check if module is in cache
+/******/ 		if(installedModules[moduleId]) {
+/******/ 			return installedModules[moduleId].exports;
+/******/ 		}
+/******/ 		// Create a new module (and put it into the cache)
+/******/ 		var module = installedModules[moduleId] = {
+/******/ 			i: moduleId,
+/******/ 			l: false,
+/******/ 			exports: {}
+/******/ 		};
+/******/
+/******/ 		// Execute the module function
+/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ 		// Flag the module as loaded
+/******/ 		module.l = true;
+/******/
+/******/ 		// Return the exports of the module
+/******/ 		return module.exports;
+/******/ 	}
+/******/
+/******/
+/******/ 	// expose the modules object (__webpack_modules__)
+/******/ 	__webpack_require__.m = modules;
+/******/
+/******/ 	// expose the module cache
+/******/ 	__webpack_require__.c = installedModules;
+/******/
+/******/ 	// define getter function for harmony exports
+/******/ 	__webpack_require__.d = function(exports, name, getter) {
+/******/ 		if(!__webpack_require__.o(exports, name)) {
+/******/ 			Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ 		}
+/******/ 	};
+/******/
+/******/ 	// define __esModule on exports
+/******/ 	__webpack_require__.r = function(exports) {
+/******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ 		}
+/******/ 		Object.defineProperty(exports, '__esModule', { value: true });
+/******/ 	};
+/******/
+/******/ 	// create a fake namespace object
+/******/ 	// mode & 1: value is a module id, require it
+/******/ 	// mode & 2: merge all properties of value into the ns
+/******/ 	// mode & 4: return value when already ns object
+/******/ 	// mode & 8|1: behave like require
+/******/ 	__webpack_require__.t = function(value, mode) {
+/******/ 		if(mode & 1) value = __webpack_require__(value);
+/******/ 		if(mode & 8) return value;
+/******/ 		if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ 		var ns = Object.create(null);
+/******/ 		__webpack_require__.r(ns);
+/******/ 		Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ 		if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ 		return ns;
+/******/ 	};
+/******/
+/******/ 	// getDefaultExport function for compatibility with non-harmony modules
+/******/ 	__webpack_require__.n = function(module) {
+/******/ 		var getter = module && module.__esModule ?
+/******/ 			function getDefault() { return module['default']; } :
+/******/ 			function getModuleExports() { return module; };
+/******/ 		__webpack_require__.d(getter, 'a', getter);
+/******/ 		return getter;
+/******/ 	};
+/******/
+/******/ 	// Object.prototype.hasOwnProperty.call
+/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ 	// __webpack_public_path__
+/******/ 	__webpack_require__.p = "";
+/******/
+/******/
+/******/ 	// Load entry module and return exports
+/******/ 	return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+;
+var pdfjsWebApp = void 0,
+    pdfjsWebAppOptions = void 0;
+{
+  pdfjsWebApp = __webpack_require__(1);
+  pdfjsWebAppOptions = __webpack_require__(12);
+}
+;
+{
+  __webpack_require__(38);
+}
+;
+{
+  __webpack_require__(43);
+}
+function getViewerConfiguration() {
+  return {
+    appContainer: document.body,
+    mainContainer: document.getElementById('viewerContainer'),
+    viewerContainer: document.getElementById('viewer'),
+    eventBus: null,
+    toolbar: {
+      container: document.getElementById('toolbarViewer'),
+      numPages: document.getElementById('numPages'),
+      pageNumber: document.getElementById('pageNumber'),
+      scaleSelectContainer: document.getElementById('scaleSelectContainer'),
+      scaleSelect: document.getElementById('scaleSelect'),
+      customScaleOption: document.getElementById('customScaleOption'),
+      previous: document.getElementById('previous'),
+      next: document.getElementById('next'),
+      zoomIn: document.getElementById('zoomIn'),
+      zoomOut: document.getElementById('zoomOut'),
+      viewFind: document.getElementById('viewFind'),
+      openFile: document.getElementById('openFile'),
+      print: document.getElementById('print'),
+      presentationModeButton: document.getElementById('presentationMode'),
+      download: document.getElementById('download'),
+      viewBookmark: document.getElementById('viewBookmark')
+    },
+    secondaryToolbar: {
+      toolbar: document.getElementById('secondaryToolbar'),
+      toggleButton: document.getElementById('secondaryToolbarToggle'),
+      toolbarButtonContainer: document.getElementById('secondaryToolbarButtonContainer'),
+      presentationModeButton: document.getElementById('secondaryPresentationMode'),
+      openFileButton: document.getElementById('secondaryOpenFile'),
+      printButton: document.getElementById('secondaryPrint'),
+      downloadButton: document.getElementById('secondaryDownload'),
+      viewBookmarkButton: document.getElementById('secondaryViewBookmark'),
+      firstPageButton: document.getElementById('firstPage'),
+      lastPageButton: document.getElementById('lastPage'),
+      pageRotateCwButton: document.getElementById('pageRotateCw'),
+      pageRotateCcwButton: document.getElementById('pageRotateCcw'),
+      cursorSelectToolButton: document.getElementById('cursorSelectTool'),
+      cursorHandToolButton: document.getElementById('cursorHandTool'),
+      scrollVerticalButton: document.getElementById('scrollVertical'),
+      scrollHorizontalButton: document.getElementById('scrollHorizontal'),
+      scrollWrappedButton: document.getElementById('scrollWrapped'),
+      spreadNoneButton: document.getElementById('spreadNone'),
+      spreadOddButton: document.getElementById('spreadOdd'),
+      spreadEvenButton: document.getElementById('spreadEven'),
+      documentPropertiesButton: document.getElementById('documentProperties')
+    },
+    fullscreen: {
+      contextFirstPage: document.getElementById('contextFirstPage'),
+      contextLastPage: document.getElementById('contextLastPage'),
+      contextPageRotateCw: document.getElementById('contextPageRotateCw'),
+      contextPageRotateCcw: document.getElementById('contextPageRotateCcw')
+    },
+    sidebar: {
+      outerContainer: document.getElementById('outerContainer'),
+      viewerContainer: document.getElementById('viewerContainer'),
+      toggleButton: document.getElementById('sidebarToggle'),
+      thumbnailButton: document.getElementById('viewThumbnail'),
+      outlineButton: document.getElementById('viewOutline'),
+      attachmentsButton: document.getElementById('viewAttachments'),
+      thumbnailView: document.getElementById('thumbnailView'),
+      outlineView: document.getElementById('outlineView'),
+      attachmentsView: document.getElementById('attachmentsView')
+    },
+    sidebarResizer: {
+      outerContainer: document.getElementById('outerContainer'),
+      resizer: document.getElementById('sidebarResizer')
+    },
+    findBar: {
+      bar: document.getElementById('findbar'),
+      toggleButton: document.getElementById('viewFind'),
+      findField: document.getElementById('findInput'),
+      highlightAllCheckbox: document.getElementById('findHighlightAll'),
+      caseSensitiveCheckbox: document.getElementById('findMatchCase'),
+      entireWordCheckbox: document.getElementById('findEntireWord'),
+      findMsg: document.getElementById('findMsg'),
+      findResultsCount: document.getElementById('findResultsCount'),
+      findPreviousButton: document.getElementById('findPrevious'),
+      findNextButton: document.getElementById('findNext')
+    },
+    passwordOverlay: {
+      overlayName: 'passwordOverlay',
+      container: document.getElementById('passwordOverlay'),
+      label: document.getElementById('passwordText'),
+      input: document.getElementById('password'),
+      submitButton: document.getElementById('passwordSubmit'),
+      cancelButton: document.getElementById('passwordCancel')
+    },
+    documentProperties: {
+      overlayName: 'documentPropertiesOverlay',
+      container: document.getElementById('documentPropertiesOverlay'),
+      closeButton: document.getElementById('documentPropertiesClose'),
+      fields: {
+        'fileName': document.getElementById('fileNameField'),
+        'fileSize': document.getElementById('fileSizeField'),
+        'title': document.getElementById('titleField'),
+        'author': document.getElementById('authorField'),
+        'subject': document.getElementById('subjectField'),
+        'keywords': document.getElementById('keywordsField'),
+        'creationDate': document.getElementById('creationDateField'),
+        'modificationDate': document.getElementById('modificationDateField'),
+        'creator': document.getElementById('creatorField'),
+        'producer': document.getElementById('producerField'),
+        'version': document.getElementById('versionField'),
+        'pageCount': document.getElementById('pageCountField'),
+        'pageSize': document.getElementById('pageSizeField'),
+        'linearized': document.getElementById('linearizedField')
+      }
+    },
+    errorWrapper: {
+      container: document.getElementById('errorWrapper'),
+      errorMessage: document.getElementById('errorMessage'),
+      closeButton: document.getElementById('errorClose'),
+      errorMoreInfo: document.getElementById('errorMoreInfo'),
+      moreInfoButton: document.getElementById('errorShowMore'),
+      lessInfoButton: document.getElementById('errorShowLess')
+    },
+    printContainer: document.getElementById('printContainer'),
+    openFileInputName: 'fileInput',
+    debuggerScriptPath: './debugger.js'
+  };
+}
+function webViewerLoad() {
+  var config = getViewerConfiguration();
+  window.PDFViewerApplication = pdfjsWebApp.PDFViewerApplication;
+  window.PDFViewerApplicationOptions = pdfjsWebAppOptions.AppOptions;
+  pdfjsWebApp.PDFViewerApplication.run(config);
+}
+if (document.readyState === 'interactive' || document.readyState === 'complete') {
+  webViewerLoad();
+} else {
+  document.addEventListener('DOMContentLoaded', webViewerLoad, true);
+}
+
+/***/ }),
+/* 1 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.PDFPrintServiceFactory = exports.DefaultExternalServices = exports.PDFViewerApplication = undefined;
+
+var _regenerator = __webpack_require__(2);
+
+var _regenerator2 = _interopRequireDefault(_regenerator);
+
+var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
+
+var _ui_utils = __webpack_require__(6);
+
+var _pdfjsLib = __webpack_require__(7);
+
+var _pdf_cursor_tools = __webpack_require__(8);
+
+var _pdf_rendering_queue = __webpack_require__(10);
+
+var _pdf_sidebar = __webpack_require__(11);
+
+var _app_options = __webpack_require__(12);
+
+var _dom_events = __webpack_require__(14);
+
+var _overlay_manager = __webpack_require__(15);
+
+var _password_prompt = __webpack_require__(16);
+
+var _pdf_attachment_viewer = __webpack_require__(17);
+
+var _pdf_document_properties = __webpack_require__(18);
+
+var _pdf_find_bar = __webpack_require__(19);
+
+var _pdf_find_controller = __webpack_require__(20);
+
+var _pdf_history = __webpack_require__(22);
+
+var _pdf_link_service = __webpack_require__(23);
+
+var _pdf_outline_viewer = __webpack_require__(24);
+
+var _pdf_presentation_mode = __webpack_require__(25);
+
+var _pdf_sidebar_resizer = __webpack_require__(26);
+
+var _pdf_thumbnail_viewer = __webpack_require__(27);
+
+var _pdf_viewer = __webpack_require__(29);
+
+var _secondary_toolbar = __webpack_require__(34);
+
+var _toolbar = __webpack_require__(36);
+
+var _view_history = __webpack_require__(37);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
+
+var DEFAULT_SCALE_DELTA = 1.1;
+var DISABLE_AUTO_FETCH_LOADING_BAR_TIMEOUT = 5000;
+var FORCE_PAGES_LOADED_TIMEOUT = 10000;
+var DefaultExternalServices = {
+  updateFindControlState: function updateFindControlState(data) {},
+  updateFindMatchesCount: function updateFindMatchesCount(data) {},
+  initPassiveLoading: function initPassiveLoading(callbacks) {},
+  fallback: function fallback(data, callback) {},
+  reportTelemetry: function reportTelemetry(data) {},
+  createDownloadManager: function createDownloadManager(options) {
+    throw new Error('Not implemented: createDownloadManager');
+  },
+  createPreferences: function createPreferences() {
+    throw new Error('Not implemented: createPreferences');
+  },
+  createL10n: function createL10n(options) {
+    throw new Error('Not implemented: createL10n');
+  },
+
+  supportsIntegratedFind: false,
+  supportsDocumentFonts: true,
+  supportsDocumentColors: true,
+  supportedMouseWheelZoomModifierKeys: {
+    ctrlKey: true,
+    metaKey: true
+  }
+};
+var PDFViewerApplication = {
+  initialBookmark: document.location.hash.substring(1),
+  initialized: false,
+  fellback: false,
+  appConfig: null,
+  pdfDocument: null,
+  pdfLoadingTask: null,
+  printService: null,
+  pdfViewer: null,
+  pdfThumbnailViewer: null,
+  pdfRenderingQueue: null,
+  pdfPresentationMode: null,
+  pdfDocumentProperties: null,
+  pdfLinkService: null,
+  pdfHistory: null,
+  pdfSidebar: null,
+  pdfSidebarResizer: null,
+  pdfOutlineViewer: null,
+  pdfAttachmentViewer: null,
+  pdfCursorTools: null,
+  store: null,
+  downloadManager: null,
+  overlayManager: null,
+  preferences: null,
+  toolbar: null,
+  secondaryToolbar: null,
+  eventBus: null,
+  l10n: null,
+  isInitialViewSet: false,
+  downloadComplete: false,
+  isViewerEmbedded: window.parent !== window,
+  url: '',
+  baseUrl: '',
+  externalServices: DefaultExternalServices,
+  _boundEvents: {},
+  contentDispositionFilename: null,
+  initialize: function () {
+    var _ref = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee(appConfig) {
+      var _this = this;
+
+      var appContainer;
+      return _regenerator2.default.wrap(function _callee$(_context) {
+        while (1) {
+          switch (_context.prev = _context.next) {
+            case 0:
+              this.preferences = this.externalServices.createPreferences();
+              this.appConfig = appConfig;
+              _context.next = 4;
+              return this._readPreferences();
+
+            case 4:
+              _context.next = 6;
+              return this._parseHashParameters();
+
+            case 6:
+              _context.next = 8;
+              return this._initializeL10n();
+
+            case 8:
+              if (this.isViewerEmbedded && _app_options.AppOptions.get('externalLinkTarget') === _pdfjsLib.LinkTarget.NONE) {
+                _app_options.AppOptions.set('externalLinkTarget', _pdfjsLib.LinkTarget.TOP);
+              }
+              _context.next = 11;
+              return this._initializeViewerComponents();
+
+            case 11:
+              this.bindEvents();
+              this.bindWindowEvents();
+              appContainer = appConfig.appContainer || document.documentElement;
+
+              this.l10n.translate(appContainer).then(function () {
+                _this.eventBus.dispatch('localized', { source: _this });
+              });
+              this.initialized = true;
+
+            case 16:
+            case 'end':
+              return _context.stop();
+          }
+        }
+      }, _callee, this);
+    }));
+
+    function initialize(_x) {
+      return _ref.apply(this, arguments);
+    }
+
+    return initialize;
+  }(),
+  _readPreferences: function () {
+    var _ref2 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee2() {
+      var OVERRIDES, prefs, name;
+      return _regenerator2.default.wrap(function _callee2$(_context2) {
+        while (1) {
+          switch (_context2.prev = _context2.next) {
+            case 0:
+              OVERRIDES = {
+                disableFontFace: true,
+                disableRange: true,
+                disableStream: true,
+                textLayerMode: _ui_utils.TextLayerMode.DISABLE
+              };
+              _context2.prev = 1;
+              _context2.next = 4;
+              return this.preferences.getAll();
+
+            case 4:
+              prefs = _context2.sent;
+              _context2.t0 = _regenerator2.default.keys(prefs);
+
+            case 6:
+              if ((_context2.t1 = _context2.t0()).done) {
+                _context2.next = 13;
+                break;
+              }
+
+              name = _context2.t1.value;
+
+              if (!(name in OVERRIDES && _app_options.AppOptions.get(name) === OVERRIDES[name])) {
+                _context2.next = 10;
+                break;
+              }
+
+              return _context2.abrupt('continue', 6);
+
+            case 10:
+              _app_options.AppOptions.set(name, prefs[name]);
+              _context2.next = 6;
+              break;
+
+            case 13:
+              _context2.next = 17;
+              break;
+
+            case 15:
+              _context2.prev = 15;
+              _context2.t2 = _context2['catch'](1);
+
+            case 17:
+            case 'end':
+              return _context2.stop();
+          }
+        }
+      }, _callee2, this, [[1, 15]]);
+    }));
+
+    function _readPreferences() {
+      return _ref2.apply(this, arguments);
+    }
+
+    return _readPreferences;
+  }(),
+  _parseHashParameters: function () {
+    var _ref3 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee3() {
+      var waitOn, hash, hashParams, viewer, enabled;
+      return _regenerator2.default.wrap(function _callee3$(_context3) {
+        while (1) {
+          switch (_context3.prev = _context3.next) {
+            case 0:
+              if (_app_options.AppOptions.get('pdfBugEnabled')) {
+                _context3.next = 2;
+                break;
+              }
+
+              return _context3.abrupt('return');
+
+            case 2:
+              waitOn = [];
+              hash = document.location.hash.substring(1);
+              hashParams = (0, _ui_utils.parseQueryString)(hash);
+
+              if ('disableworker' in hashParams && hashParams['disableworker'] === 'true') {
+                waitOn.push(loadFakeWorker());
+              }
+              if ('disablerange' in hashParams) {
+                _app_options.AppOptions.set('disableRange', hashParams['disablerange'] === 'true');
+              }
+              if ('disablestream' in hashParams) {
+                _app_options.AppOptions.set('disableStream', hashParams['disablestream'] === 'true');
+              }
+              if ('disableautofetch' in hashParams) {
+                _app_options.AppOptions.set('disableAutoFetch', hashParams['disableautofetch'] === 'true');
+              }
+              if ('disablefontface' in hashParams) {
+                _app_options.AppOptions.set('disableFontFace', hashParams['disablefontface'] === 'true');
+              }
+              if ('disablehistory' in hashParams) {
+                _app_options.AppOptions.set('disableHistory', hashParams['disablehistory'] === 'true');
+              }
+              if ('webgl' in hashParams) {
+                _app_options.AppOptions.set('enableWebGL', hashParams['webgl'] === 'true');
+              }
+              if ('useonlycsszoom' in hashParams) {
+                _app_options.AppOptions.set('useOnlyCssZoom', hashParams['useonlycsszoom'] === 'true');
+              }
+              if ('verbosity' in hashParams) {
+                _app_options.AppOptions.set('verbosity', hashParams['verbosity'] | 0);
+              }
+
+              if (!('textlayer' in hashParams)) {
+                _context3.next = 23;
+                break;
+              }
+
+              _context3.t0 = hashParams['textlayer'];
+              _context3.next = _context3.t0 === 'off' ? 18 : _context3.t0 === 'visible' ? 20 : _context3.t0 === 'shadow' ? 20 : _context3.t0 === 'hover' ? 20 : 23;
+              break;
+
+            case 18:
+              _app_options.AppOptions.set('textLayerMode', _ui_utils.TextLayerMode.DISABLE);
+              return _context3.abrupt('break', 23);
+
+            case 20:
+              viewer = this.appConfig.viewerContainer;
+
+              viewer.classList.add('textLayer-' + hashParams['textlayer']);
+              return _context3.abrupt('break', 23);
+
+            case 23:
+              if ('pdfbug' in hashParams) {
+                _app_options.AppOptions.set('pdfBug', true);
+                enabled = hashParams['pdfbug'].split(',');
+
+                waitOn.push(loadAndEnablePDFBug(enabled));
+              }
+              if ('locale' in hashParams) {
+                _app_options.AppOptions.set('locale', hashParams['locale']);
+              }
+              return _context3.abrupt('return', Promise.all(waitOn).catch(function (reason) {
+                console.error('_parseHashParameters: "' + reason.message + '".');
+              }));
+
+            case 26:
+            case 'end':
+              return _context3.stop();
+          }
+        }
+      }, _callee3, this);
+    }));
+
+    function _parseHashParameters() {
+      return _ref3.apply(this, arguments);
+    }
+
+    return _parseHashParameters;
+  }(),
+  _initializeL10n: function () {
+    var _ref4 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee4() {
+      var dir;
+      return _regenerator2.default.wrap(function _callee4$(_context4) {
+        while (1) {
+          switch (_context4.prev = _context4.next) {
+            case 0:
+              this.l10n = this.externalServices.createL10n({ locale: _app_options.AppOptions.get('locale') });
+              _context4.next = 3;
+              return this.l10n.getDirection();
+
+            case 3:
+              dir = _context4.sent;
+
+              document.getElementsByTagName('html')[0].dir = dir;
+
+            case 5:
+            case 'end':
+              return _context4.stop();
+          }
+        }
+      }, _callee4, this);
+    }));
+
+    function _initializeL10n() {
+      return _ref4.apply(this, arguments);
+    }
+
+    return _initializeL10n;
+  }(),
+  _initializeViewerComponents: function () {
+    var _ref5 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee5() {
+      var appConfig, dispatchToDOM, eventBus, pdfRenderingQueue, pdfLinkService, downloadManager, findController, container, viewer, thumbnailContainer, sidebarConfig;
+      return _regenerator2.default.wrap(function _callee5$(_context5) {
+        while (1) {
+          switch (_context5.prev = _context5.next) {
+            case 0:
+              appConfig = this.appConfig;
+
+              this.overlayManager = new _overlay_manager.OverlayManager();
+              dispatchToDOM = _app_options.AppOptions.get('eventBusDispatchToDOM');
+              eventBus = appConfig.eventBus || (0, _dom_events.getGlobalEventBus)(dispatchToDOM);
+
+              this.eventBus = eventBus;
+              pdfRenderingQueue = new _pdf_rendering_queue.PDFRenderingQueue();
+
+              pdfRenderingQueue.onIdle = this.cleanup.bind(this);
+              this.pdfRenderingQueue = pdfRenderingQueue;
+              pdfLinkService = new _pdf_link_service.PDFLinkService({
+                eventBus: eventBus,
+                externalLinkTarget: _app_options.AppOptions.get('externalLinkTarget'),
+                externalLinkRel: _app_options.AppOptions.get('externalLinkRel')
+              });
+
+              this.pdfLinkService = pdfLinkService;
+              downloadManager = this.externalServices.createDownloadManager({ disableCreateObjectURL: _app_options.AppOptions.get('disableCreateObjectURL') });
+
+              this.downloadManager = downloadManager;
+              findController = new _pdf_find_controller.PDFFindController({
+                linkService: pdfLinkService,
+                eventBus: eventBus
+              });
+
+              this.findController = findController;
+              container = appConfig.mainContainer;
+              viewer = appConfig.viewerContainer;
+
+              this.pdfViewer = new _pdf_viewer.PDFViewer({
+                container: container,
+                viewer: viewer,
+                eventBus: eventBus,
+                renderingQueue: pdfRenderingQueue,
+                linkService: pdfLinkService,
+                downloadManager: downloadManager,
+                findController: findController,
+                renderer: _app_options.AppOptions.get('renderer'),
+                enableWebGL: _app_options.AppOptions.get('enableWebGL'),
+                l10n: this.l10n,
+                textLayerMode: _app_options.AppOptions.get('textLayerMode'),
+                imageResourcesPath: _app_options.AppOptions.get('imageResourcesPath'),
+                renderInteractiveForms: _app_options.AppOptions.get('renderInteractiveForms'),
+                enablePrintAutoRotate: _app_options.AppOptions.get('enablePrintAutoRotate'),
+                useOnlyCssZoom: _app_options.AppOptions.get('useOnlyCssZoom'),
+                maxCanvasPixels: _app_options.AppOptions.get('maxCanvasPixels')
+              });
+              pdfRenderingQueue.setViewer(this.pdfViewer);
+              pdfLinkService.setViewer(this.pdfViewer);
+              thumbnailContainer = appConfig.sidebar.thumbnailView;
+
+              this.pdfThumbnailViewer = new _pdf_thumbnail_viewer.PDFThumbnailViewer({
+                container: thumbnailContainer,
+                renderingQueue: pdfRenderingQueue,
+                linkService: pdfLinkService,
+                l10n: this.l10n
+              });
+              pdfRenderingQueue.setThumbnailViewer(this.pdfThumbnailViewer);
+              this.pdfHistory = new _pdf_history.PDFHistory({
+                linkService: pdfLinkService,
+                eventBus: eventBus
+              });
+              pdfLinkService.setHistory(this.pdfHistory);
+              this.findBar = new _pdf_find_bar.PDFFindBar(appConfig.findBar, eventBus, this.l10n);
+              this.pdfDocumentProperties = new _pdf_document_properties.PDFDocumentProperties(appConfig.documentProperties, this.overlayManager, eventBus, this.l10n);
+              this.pdfCursorTools = new _pdf_cursor_tools.PDFCursorTools({
+                container: container,
+                eventBus: eventBus,
+                cursorToolOnLoad: _app_options.AppOptions.get('cursorToolOnLoad')
+              });
+              this.toolbar = new _toolbar.Toolbar(appConfig.toolbar, eventBus, this.l10n);
+              this.secondaryToolbar = new _secondary_toolbar.SecondaryToolbar(appConfig.secondaryToolbar, container, eventBus);
+              if (this.supportsFullscreen) {
+                this.pdfPresentationMode = new _pdf_presentation_mode.PDFPresentationMode({
+                  container: container,
+                  viewer: viewer,
+                  pdfViewer: this.pdfViewer,
+                  eventBus: eventBus,
+                  contextMenuItems: appConfig.fullscreen
+                });
+              }
+              this.passwordPrompt = new _password_prompt.PasswordPrompt(appConfig.passwordOverlay, this.overlayManager, this.l10n);
+              this.pdfOutlineViewer = new _pdf_outline_viewer.PDFOutlineViewer({
+                container: appConfig.sidebar.outlineView,
+                eventBus: eventBus,
+                linkService: pdfLinkService
+              });
+              this.pdfAttachmentViewer = new _pdf_attachment_viewer.PDFAttachmentViewer({
+                container: appConfig.sidebar.attachmentsView,
+                eventBus: eventBus,
+                downloadManager: downloadManager
+              });
+              sidebarConfig = Object.create(appConfig.sidebar);
+
+              sidebarConfig.pdfViewer = this.pdfViewer;
+              sidebarConfig.pdfThumbnailViewer = this.pdfThumbnailViewer;
+              this.pdfSidebar = new _pdf_sidebar.PDFSidebar(sidebarConfig, eventBus, this.l10n);
+              this.pdfSidebar.onToggled = this.forceRendering.bind(this);
+              this.pdfSidebarResizer = new _pdf_sidebar_resizer.PDFSidebarResizer(appConfig.sidebarResizer, eventBus, this.l10n);
+
+            case 39:
+            case 'end':
+              return _context5.stop();
+          }
+        }
+      }, _callee5, this);
+    }));
+
+    function _initializeViewerComponents() {
+      return _ref5.apply(this, arguments);
+    }
+
+    return _initializeViewerComponents;
+  }(),
+  run: function run(config) {
+    this.initialize(config).then(webViewerInitialized);
+  },
+  zoomIn: function zoomIn(ticks) {
+    var newScale = this.pdfViewer.currentScale;
+    do {
+      newScale = (newScale * DEFAULT_SCALE_DELTA).toFixed(2);
+      newScale = Math.ceil(newScale * 10) / 10;
+      newScale = Math.min(_ui_utils.MAX_SCALE, newScale);
+    } while (--ticks > 0 && newScale < _ui_utils.MAX_SCALE);
+    this.pdfViewer.currentScaleValue = newScale;
+  },
+  zoomOut: function zoomOut(ticks) {
+    var newScale = this.pdfViewer.currentScale;
+    do {
+      newScale = (newScale / DEFAULT_SCALE_DELTA).toFixed(2);
+      newScale = Math.floor(newScale * 10) / 10;
+      newScale = Math.max(_ui_utils.MIN_SCALE, newScale);
+    } while (--ticks > 0 && newScale > _ui_utils.MIN_SCALE);
+    this.pdfViewer.currentScaleValue = newScale;
+  },
+
+  get pagesCount() {
+    return this.pdfDocument ? this.pdfDocument.numPages : 0;
+  },
+  set page(val) {
+    this.pdfViewer.currentPageNumber = val;
+  },
+  get page() {
+    return this.pdfViewer.currentPageNumber;
+  },
+  get printing() {
+    return !!this.printService;
+  },
+  get supportsPrinting() {
+    return PDFPrintServiceFactory.instance.supportsPrinting;
+  },
+  get supportsFullscreen() {
+    var support = void 0;
+    var doc = document.documentElement;
+    support = !!(doc.requestFullscreen || doc.mozRequestFullScreen || doc.webkitRequestFullScreen || doc.msRequestFullscreen);
+    if (document.fullscreenEnabled === false || document.mozFullScreenEnabled === false || document.webkitFullscreenEnabled === false || document.msFullscreenEnabled === false) {
+      support = false;
+    }
+    return (0, _pdfjsLib.shadow)(this, 'supportsFullscreen', support);
+  },
+  get supportsIntegratedFind() {
+    return this.externalServices.supportsIntegratedFind;
+  },
+  get supportsDocumentFonts() {
+    return this.externalServices.supportsDocumentFonts;
+  },
+  get supportsDocumentColors() {
+    return this.externalServices.supportsDocumentColors;
+  },
+  get loadingBar() {
+    var bar = new _ui_utils.ProgressBar('#loadingBar');
+    return (0, _pdfjsLib.shadow)(this, 'loadingBar', bar);
+  },
+  get supportedMouseWheelZoomModifierKeys() {
+    return this.externalServices.supportedMouseWheelZoomModifierKeys;
+  },
+  initPassiveLoading: function initPassiveLoading() {
+    throw new Error('Not implemented: initPassiveLoading');
+  },
+  setTitleUsingUrl: function setTitleUsingUrl() {
+    var url = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
+
+    this.url = url;
+    this.baseUrl = url.split('#')[0];
+    var title = (0, _ui_utils.getPDFFileNameFromURL)(url, '');
+    if (!title) {
+      try {
+        title = decodeURIComponent((0, _pdfjsLib.getFilenameFromUrl)(url)) || url;
+      } catch (ex) {
+        title = url;
+      }
+    }
+    this.setTitle(title);
+  },
+  setTitle: function setTitle(title) {
+    if (this.isViewerEmbedded) {
+      return;
+    }
+    document.title = title;
+  },
+  close: function () {
+    var _ref6 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee6() {
+      var errorWrapper, promise;
+      return _regenerator2.default.wrap(function _callee6$(_context6) {
+        while (1) {
+          switch (_context6.prev = _context6.next) {
+            case 0:
+              errorWrapper = this.appConfig.errorWrapper.container;
+
+              errorWrapper.setAttribute('hidden', 'true');
+
+              if (this.pdfLoadingTask) {
+                _context6.next = 4;
+                break;
+              }
+
+              return _context6.abrupt('return');
+
+            case 4:
+              promise = this.pdfLoadingTask.destroy();
+
+              this.pdfLoadingTask = null;
+              if (this.pdfDocument) {
+                this.pdfDocument = null;
+                this.pdfThumbnailViewer.setDocument(null);
+                this.pdfViewer.setDocument(null);
+                this.pdfLinkService.setDocument(null);
+                this.pdfDocumentProperties.setDocument(null);
+              }
+              this.store = null;
+              this.isInitialViewSet = false;
+              this.downloadComplete = false;
+              this.url = '';
+              this.baseUrl = '';
+              this.contentDispositionFilename = null;
+              this.pdfSidebar.reset();
+              this.pdfOutlineViewer.reset();
+              this.pdfAttachmentViewer.reset();
+              this.findBar.reset();
+              this.toolbar.reset();
+              this.secondaryToolbar.reset();
+              if (typeof PDFBug !== 'undefined') {
+                PDFBug.cleanup();
+              }
+              return _context6.abrupt('return', promise);
+
+            case 21:
+            case 'end':
+              return _context6.stop();
+          }
+        }
+      }, _callee6, this);
+    }));
+
+    function close() {
+      return _ref6.apply(this, arguments);
+    }
+
+    return close;
+  }(),
+  open: function () {
+    var _ref7 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee7(file, args) {
+      var _this2 = this;
+
+      var workerParameters, key, parameters, apiParameters, _key, prop, loadingTask;
+
+      return _regenerator2.default.wrap(function _callee7$(_context7) {
+        while (1) {
+          switch (_context7.prev = _context7.next) {
+            case 0:
+              if (!this.pdfLoadingTask) {
+                _context7.next = 3;
+                break;
+              }
+
+              _context7.next = 3;
+              return this.close();
+
+            case 3:
+              workerParameters = _app_options.AppOptions.getAll('worker');
+
+              for (key in workerParameters) {
+                _pdfjsLib.GlobalWorkerOptions[key] = workerParameters[key];
+              }
+              parameters = Object.create(null);
+
+              if (typeof file === 'string') {
+                this.setTitleUsingUrl(file);
+                parameters.url = file;
+              } else if (file && 'byteLength' in file) {
+                parameters.data = file;
+              } else if (file.url && file.originalUrl) {
+                this.setTitleUsingUrl(file.originalUrl);
+                parameters.url = file;
+              }
+              apiParameters = _app_options.AppOptions.getAll('api');
+
+              for (_key in apiParameters) {
+                parameters[_key] = apiParameters[_key];
+              }
+              if (args) {
+                for (prop in args) {
+                  if (prop === 'length') {
+                    this.pdfDocumentProperties.setFileSize(args[prop]);
+                  }
+                  parameters[prop] = args[prop];
+                }
+              }
+              loadingTask = (0, _pdfjsLib.getDocument)(parameters);
+
+              this.pdfLoadingTask = loadingTask;
+              loadingTask.onPassword = function (updateCallback, reason) {
+                _this2.passwordPrompt.setUpdateCallback(updateCallback, reason);
+                _this2.passwordPrompt.open();
+              };
+              loadingTask.onProgress = function (_ref8) {
+                var loaded = _ref8.loaded,
+                    total = _ref8.total;
+
+                _this2.progress(loaded / total);
+              };
+              loadingTask.onUnsupportedFeature = this.fallback.bind(this);
+              return _context7.abrupt('return', loadingTask.promise.then(function (pdfDocument) {
+                _this2.load(pdfDocument);
+              }, function (exception) {
+                if (loadingTask !== _this2.pdfLoadingTask) {
+                  return;
+                }
+                var message = exception && exception.message;
+                var loadingErrorMessage = void 0;
+                if (exception instanceof _pdfjsLib.InvalidPDFException) {
+                  loadingErrorMessage = _this2.l10n.get('invalid_file_error', null, 'Invalid or corrupted PDF file.');
+                } else if (exception instanceof _pdfjsLib.MissingPDFException) {
+                  loadingErrorMessage = _this2.l10n.get('missing_file_error', null, 'Missing PDF file.');
+                } else if (exception instanceof _pdfjsLib.UnexpectedResponseException) {
+                  loadingErrorMessage = _this2.l10n.get('unexpected_response_error', null, 'Unexpected server response.');
+                } else {
+                  loadingErrorMessage = _this2.l10n.get('loading_error', null, 'An error occurred while loading the PDF.');
+                }
+                return loadingErrorMessage.then(function (msg) {
+                  _this2.error(msg, { message: message });
+                  throw new Error(msg);
+                });
+              }));
+
+            case 16:
+            case 'end':
+              return _context7.stop();
+          }
+        }
+      }, _callee7, this);
+    }));
+
+    function open(_x3, _x4) {
+      return _ref7.apply(this, arguments);
+    }
+
+    return open;
+  }(),
+  download: function download() {
+    var _this3 = this;
+
+    function downloadByUrl() {
+      downloadManager.downloadUrl(url, filename);
+    }
+    var url = this.baseUrl;
+    var filename = this.contentDispositionFilename || (0, _ui_utils.getPDFFileNameFromURL)(this.url);
+    var downloadManager = this.downloadManager;
+    downloadManager.onerror = function (err) {
+      _this3.error('PDF failed to download: ' + err);
+    };
+    if (!this.pdfDocument || !this.downloadComplete) {
+      downloadByUrl();
+      return;
+    }
+    this.pdfDocument.getData().then(function (data) {
+      var blob = new Blob([data], { type: 'application/pdf' });
+      downloadManager.download(blob, url, filename);
+    }).catch(downloadByUrl);
+  },
+  fallback: function fallback(featureId) {},
+  error: function error(message, moreInfo) {
+    var moreInfoText = [this.l10n.get('error_version_info', {
+      version: _pdfjsLib.version || '?',
+      build: _pdfjsLib.build || '?'
+    }, 'PDF.js v{{version}} (build: {{build}})')];
+    if (moreInfo) {
+      moreInfoText.push(this.l10n.get('error_message', { message: moreInfo.message }, 'Message: {{message}}'));
+      if (moreInfo.stack) {
+        moreInfoText.push(this.l10n.get('error_stack', { stack: moreInfo.stack }, 'Stack: {{stack}}'));
+      } else {
+        if (moreInfo.filename) {
+          moreInfoText.push(this.l10n.get('error_file', { file: moreInfo.filename }, 'File: {{file}}'));
+        }
+        if (moreInfo.lineNumber) {
+          moreInfoText.push(this.l10n.get('error_line', { line: moreInfo.lineNumber }, 'Line: {{line}}'));
+        }
+      }
+    }
+    var errorWrapperConfig = this.appConfig.errorWrapper;
+    var errorWrapper = errorWrapperConfig.container;
+    errorWrapper.removeAttribute('hidden');
+    var errorMessage = errorWrapperConfig.errorMessage;
+    errorMessage.textContent = message;
+    var closeButton = errorWrapperConfig.closeButton;
+    closeButton.onclick = function () {
+      errorWrapper.setAttribute('hidden', 'true');
+    };
+    var errorMoreInfo = errorWrapperConfig.errorMoreInfo;
+    var moreInfoButton = errorWrapperConfig.moreInfoButton;
+    var lessInfoButton = errorWrapperConfig.lessInfoButton;
+    moreInfoButton.onclick = function () {
+      errorMoreInfo.removeAttribute('hidden');
+      moreInfoButton.setAttribute('hidden', 'true');
+      lessInfoButton.removeAttribute('hidden');
+      errorMoreInfo.style.height = errorMoreInfo.scrollHeight + 'px';
+    };
+    lessInfoButton.onclick = function () {
+      errorMoreInfo.setAttribute('hidden', 'true');
+      moreInfoButton.removeAttribute('hidden');
+      lessInfoButton.setAttribute('hidden', 'true');
+    };
+    moreInfoButton.oncontextmenu = _ui_utils.noContextMenuHandler;
+    lessInfoButton.oncontextmenu = _ui_utils.noContextMenuHandler;
+    closeButton.oncontextmenu = _ui_utils.noContextMenuHandler;
+    moreInfoButton.removeAttribute('hidden');
+    lessInfoButton.setAttribute('hidden', 'true');
+    Promise.all(moreInfoText).then(function (parts) {
+      errorMoreInfo.value = parts.join('\n');
+    });
+  },
+  progress: function progress(level) {
+    var _this4 = this;
+
+    if (this.downloadComplete) {
+      return;
+    }
+    var percent = Math.round(level * 100);
+    if (percent > this.loadingBar.percent || isNaN(percent)) {
+      this.loadingBar.percent = percent;
+      var disableAutoFetch = this.pdfDocument ? this.pdfDocument.loadingParams['disableAutoFetch'] : _app_options.AppOptions.get('disableAutoFetch');
+      if (disableAutoFetch && percent) {
+        if (this.disableAutoFetchLoadingBarTimeout) {
+          clearTimeout(this.disableAutoFetchLoadingBarTimeout);
+          this.disableAutoFetchLoadingBarTimeout = null;
+        }
+        this.loadingBar.show();
+        this.disableAutoFetchLoadingBarTimeout = setTimeout(function () {
+          _this4.loadingBar.hide();
+          _this4.disableAutoFetchLoadingBarTimeout = null;
+        }, DISABLE_AUTO_FETCH_LOADING_BAR_TIMEOUT);
+      }
+    }
+  },
+  load: function load(pdfDocument) {
+    var _this5 = this;
+
+    this.pdfDocument = pdfDocument;
+    pdfDocument.getDownloadInfo().then(function () {
+      _this5.downloadComplete = true;
+      _this5.loadingBar.hide();
+      firstPagePromise.then(function () {
+        _this5.eventBus.dispatch('documentloaded', { source: _this5 });
+        _this5.eventBus.dispatch('documentload', { source: _this5 });
+      });
+    });
+    var pageModePromise = pdfDocument.getPageMode().catch(function () {});
+    this.toolbar.setPagesCount(pdfDocument.numPages, false);
+    this.secondaryToolbar.setPagesCount(pdfDocument.numPages);
+    var store = this.store = new _view_history.ViewHistory(pdfDocument.fingerprint);
+    var baseDocumentUrl = void 0;
+    baseDocumentUrl = null;
+    this.pdfLinkService.setDocument(pdfDocument, baseDocumentUrl);
+    this.pdfDocumentProperties.setDocument(pdfDocument, this.url);
+    var pdfViewer = this.pdfViewer;
+    pdfViewer.setDocument(pdfDocument);
+    var firstPagePromise = pdfViewer.firstPagePromise;
+    var pagesPromise = pdfViewer.pagesPromise;
+    var onePageRendered = pdfViewer.onePageRendered;
+    var pdfThumbnailViewer = this.pdfThumbnailViewer;
+    pdfThumbnailViewer.setDocument(pdfDocument);
+    firstPagePromise.then(function (pdfPage) {
+      _this5.loadingBar.setWidth(_this5.appConfig.viewerContainer);
+      if (!_app_options.AppOptions.get('disableHistory') && !_this5.isViewerEmbedded) {
+        var resetHistory = !_app_options.AppOptions.get('showPreviousViewOnLoad');
+        _this5.pdfHistory.initialize(pdfDocument.fingerprint, resetHistory);
+        if (_this5.pdfHistory.initialBookmark) {
+          _this5.initialBookmark = _this5.pdfHistory.initialBookmark;
+          _this5.initialRotation = _this5.pdfHistory.initialRotation;
+        }
+      }
+      var storePromise = store.getMultiple({
+        page: null,
+        zoom: _ui_utils.DEFAULT_SCALE_VALUE,
+        scrollLeft: '0',
+        scrollTop: '0',
+        rotation: null,
+        sidebarView: _pdf_sidebar.SidebarView.NONE,
+        scrollMode: null,
+        spreadMode: null
+      }).catch(function () {});
+      Promise.all([storePromise, pageModePromise]).then(function () {
+        var _ref10 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee8(_ref9) {
+          var _ref11 = _slicedToArray(_ref9, 2),
+              _ref11$ = _ref11[0],
+              values = _ref11$ === undefined ? {} : _ref11$,
+              pageMode = _ref11[1];
+
+          var initialBookmark, zoom, hash, rotation, sidebarView, scrollMode, spreadMode;
+          return _regenerator2.default.wrap(function _callee8$(_context8) {
+            while (1) {
+              switch (_context8.prev = _context8.next) {
+                case 0:
+                  initialBookmark = _this5.initialBookmark;
+                  zoom = _app_options.AppOptions.get('defaultZoomValue');
+                  hash = zoom ? 'zoom=' + zoom : null;
+                  rotation = null;
+                  sidebarView = _app_options.AppOptions.get('sidebarViewOnLoad');
+                  scrollMode = _app_options.AppOptions.get('scrollModeOnLoad');
+                  spreadMode = _app_options.AppOptions.get('spreadModeOnLoad');
+
+                  if (values.page && _app_options.AppOptions.get('showPreviousViewOnLoad')) {
+                    hash = 'page=' + values.page + '&zoom=' + (zoom || values.zoom) + ',' + values.scrollLeft + ',' + values.scrollTop;
+                    rotation = parseInt(values.rotation, 10);
+                    sidebarView = sidebarView || values.sidebarView | 0;
+                    scrollMode = scrollMode || values.scrollMode | 0;
+                    spreadMode = spreadMode || values.spreadMode | 0;
+                  }
+                  if (pageMode && !_app_options.AppOptions.get('disablePageMode')) {
+                    sidebarView = sidebarView || apiPageModeToSidebarView(pageMode);
+                  }
+                  _this5.setInitialView(hash, {
+                    rotation: rotation,
+                    sidebarView: sidebarView,
+                    scrollMode: scrollMode,
+                    spreadMode: spreadMode
+                  });
+                  _this5.eventBus.dispatch('documentinit', { source: _this5 });
+                  if (!_this5.isViewerEmbedded) {
+                    pdfViewer.focus();
+                  }
+                  _context8.next = 14;
+                  return Promise.race([pagesPromise, new Promise(function (resolve) {
+                    setTimeout(resolve, FORCE_PAGES_LOADED_TIMEOUT);
+                  })]);
+
+                case 14:
+                  if (!(!initialBookmark && !hash)) {
+                    _context8.next = 16;
+                    break;
+                  }
+
+                  return _context8.abrupt('return');
+
+                case 16:
+                  if (!pdfViewer.hasEqualPageSizes) {
+                    _context8.next = 18;
+                    break;
+                  }
+
+                  return _context8.abrupt('return');
+
+                case 18:
+                  _this5.initialBookmark = initialBookmark;
+                  pdfViewer.currentScaleValue = pdfViewer.currentScaleValue;
+                  _this5.setInitialView(hash);
+
+                case 21:
+                case 'end':
+                  return _context8.stop();
+              }
+            }
+          }, _callee8, _this5);
+        }));
+
+        return function (_x5) {
+          return _ref10.apply(this, arguments);
+        };
+      }()).then(function () {
+        pdfViewer.update();
+      });
+    });
+    pdfDocument.getPageLabels().then(function (labels) {
+      if (!labels || _app_options.AppOptions.get('disablePageLabels')) {
+        return;
+      }
+      var i = 0,
+          numLabels = labels.length;
+      if (numLabels !== _this5.pagesCount) {
+        console.error('The number of Page Labels does not match ' + 'the number of pages in the document.');
+        return;
+      }
+      while (i < numLabels && labels[i] === (i + 1).toString()) {
+        i++;
+      }
+      if (i === numLabels) {
+        return;
+      }
+      pdfViewer.setPageLabels(labels);
+      pdfThumbnailViewer.setPageLabels(labels);
+      _this5.toolbar.setPagesCount(pdfDocument.numPages, true);
+      _this5.toolbar.setPageNumber(pdfViewer.currentPageNumber, pdfViewer.currentPageLabel);
+    });
+    pagesPromise.then(function () {
+      if (!_this5.supportsPrinting) {
+        return;
+      }
+      pdfDocument.getJavaScript().then(function (javaScript) {
+        if (!javaScript) {
+          return;
+        }
+        javaScript.some(function (js) {
+          if (!js) {
+            return false;
+          }
+          console.warn('Warning: JavaScript is not supported');
+          _this5.fallback(_pdfjsLib.UNSUPPORTED_FEATURES.javaScript);
+          return true;
+        });
+        var regex = /\bprint\s*\(/;
+        for (var i = 0, ii = javaScript.length; i < ii; i++) {
+          var js = javaScript[i];
+          if (js && regex.test(js)) {
+            setTimeout(function () {
+              window.print();
+            });
+            return;
+          }
+        }
+      });
+    });
+    Promise.all([onePageRendered, _ui_utils.animationStarted]).then(function () {
+      pdfDocument.getOutline().then(function (outline) {
+        _this5.pdfOutlineViewer.render({ outline: outline });
+      });
+      pdfDocument.getAttachments().then(function (attachments) {
+        _this5.pdfAttachmentViewer.render({ attachments: attachments });
+      });
+    });
+    pdfDocument.getMetadata().then(function (_ref12) {
+      var info = _ref12.info,
+          metadata = _ref12.metadata,
+          contentDispositionFilename = _ref12.contentDispositionFilename;
+
+      _this5.documentInfo = info;
+      _this5.metadata = metadata;
+      _this5.contentDispositionFilename = contentDispositionFilename;
+      console.log('PDF ' + pdfDocument.fingerprint + ' [' + info.PDFFormatVersion + ' ' + (info.Producer || '-').trim() + ' / ' + (info.Creator || '-').trim() + ']' + ' (PDF.js: ' + (_pdfjsLib.version || '-') + (_app_options.AppOptions.get('enableWebGL') ? ' [WebGL]' : '') + ')');
+      var pdfTitle = void 0;
+      if (metadata && metadata.has('dc:title')) {
+        var title = metadata.get('dc:title');
+        if (title !== 'Untitled') {
+          pdfTitle = title;
+        }
+      }
+      if (!pdfTitle && info && info['Title']) {
+        pdfTitle = info['Title'];
+      }
+      if (pdfTitle) {
+        _this5.setTitle(pdfTitle + ' - ' + (contentDispositionFilename || document.title));
+      } else if (contentDispositionFilename) {
+        _this5.setTitle(contentDispositionFilename);
+      }
+      if (info.IsAcroFormPresent) {
+        console.warn('Warning: AcroForm/XFA is not supported');
+        _this5.fallback(_pdfjsLib.UNSUPPORTED_FEATURES.forms);
+      }
+    });
+  },
+  setInitialView: function setInitialView(storedHash) {
+    var _this6 = this;
+
+    var _ref13 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
+        rotation = _ref13.rotation,
+        sidebarView = _ref13.sidebarView,
+        scrollMode = _ref13.scrollMode,
+        spreadMode = _ref13.spreadMode;
+
+    var setRotation = function setRotation(angle) {
+      if ((0, _ui_utils.isValidRotation)(angle)) {
+        _this6.pdfViewer.pagesRotation = angle;
+      }
+    };
+    var setViewerModes = function setViewerModes(scroll, spread) {
+      if (Number.isInteger(scroll)) {
+        _this6.pdfViewer.scrollMode = scroll;
+      }
+      if (Number.isInteger(spread)) {
+        _this6.pdfViewer.spreadMode = spread;
+      }
+    };
+    setViewerModes(scrollMode, spreadMode);
+    this.isInitialViewSet = true;
+    this.pdfSidebar.setInitialView(sidebarView);
+    if (this.initialBookmark) {
+      setRotation(this.initialRotation);
+      delete this.initialRotation;
+      this.pdfLinkService.setHash(this.initialBookmark);
+      this.initialBookmark = null;
+    } else if (storedHash) {
+      setRotation(rotation);
+      this.pdfLinkService.setHash(storedHash);
+    }
+    this.toolbar.setPageNumber(this.pdfViewer.currentPageNumber, this.pdfViewer.currentPageLabel);
+    this.secondaryToolbar.setPageNumber(this.pdfViewer.currentPageNumber);
+    if (!this.pdfViewer.currentScaleValue) {
+      this.pdfViewer.currentScaleValue = _ui_utils.DEFAULT_SCALE_VALUE;
+    }
+  },
+  cleanup: function cleanup() {
+    if (!this.pdfDocument) {
+      return;
+    }
+    this.pdfViewer.cleanup();
+    this.pdfThumbnailViewer.cleanup();
+    if (this.pdfViewer.renderer !== _ui_utils.RendererType.SVG) {
+      this.pdfDocument.cleanup();
+    }
+  },
+  forceRendering: function forceRendering() {
+    this.pdfRenderingQueue.printing = this.printing;
+    this.pdfRenderingQueue.isThumbnailViewEnabled = this.pdfSidebar.isThumbnailViewVisible;
+    this.pdfRenderingQueue.renderHighestPriority();
+  },
+  beforePrint: function beforePrint() {
+    var _this7 = this;
+
+    if (this.printService) {
+      return;
+    }
+    if (!this.supportsPrinting) {
+      this.l10n.get('printing_not_supported', null, 'Warning: Printing is not fully supported by ' + 'this browser.').then(function (printMessage) {
+        _this7.error(printMessage);
+      });
+      return;
+    }
+    if (!this.pdfViewer.pageViewsReady) {
+      this.l10n.get('printing_not_ready', null, 'Warning: The PDF is not fully loaded for printing.').then(function (notReadyMessage) {
+        window.alert(notReadyMessage);
+      });
+      return;
+    }
+    var pagesOverview = this.pdfViewer.getPagesOverview();
+    var printContainer = this.appConfig.printContainer;
+    var printService = PDFPrintServiceFactory.instance.createPrintService(this.pdfDocument, pagesOverview, printContainer, this.l10n);
+    this.printService = printService;
+    this.forceRendering();
+    printService.layout();
+  },
+
+  afterPrint: function pdfViewSetupAfterPrint() {
+    if (this.printService) {
+      this.printService.destroy();
+      this.printService = null;
+    }
+    this.forceRendering();
+  },
+  rotatePages: function rotatePages(delta) {
+    if (!this.pdfDocument) {
+      return;
+    }
+    var newRotation = (this.pdfViewer.pagesRotation + 360 + delta) % 360;
+    this.pdfViewer.pagesRotation = newRotation;
+  },
+  requestPresentationMode: function requestPresentationMode() {
+    if (!this.pdfPresentationMode) {
+      return;
+    }
+    this.pdfPresentationMode.request();
+  },
+  bindEvents: function bindEvents() {
+    var eventBus = this.eventBus,
+        _boundEvents = this._boundEvents;
+
+    _boundEvents.beforePrint = this.beforePrint.bind(this);
+    _boundEvents.afterPrint = this.afterPrint.bind(this);
+    eventBus.on('resize', webViewerResize);
+    eventBus.on('hashchange', webViewerHashchange);
+    eventBus.on('beforeprint', _boundEvents.beforePrint);
+    eventBus.on('afterprint', _boundEvents.afterPrint);
+    eventBus.on('pagerendered', webViewerPageRendered);
+    eventBus.on('textlayerrendered', webViewerTextLayerRendered);
+    eventBus.on('updateviewarea', webViewerUpdateViewarea);
+    eventBus.on('pagechanging', webViewerPageChanging);
+    eventBus.on('scalechanging', webViewerScaleChanging);
+    eventBus.on('rotationchanging', webViewerRotationChanging);
+    eventBus.on('sidebarviewchanged', webViewerSidebarViewChanged);
+    eventBus.on('pagemode', webViewerPageMode);
+    eventBus.on('namedaction', webViewerNamedAction);
+    eventBus.on('presentationmodechanged', webViewerPresentationModeChanged);
+    eventBus.on('presentationmode', webViewerPresentationMode);
+    eventBus.on('openfile', webViewerOpenFile);
+    eventBus.on('print', webViewerPrint);
+    eventBus.on('download', webViewerDownload);
+    eventBus.on('firstpage', webViewerFirstPage);
+    eventBus.on('lastpage', webViewerLastPage);
+    eventBus.on('nextpage', webViewerNextPage);
+    eventBus.on('previouspage', webViewerPreviousPage);
+    eventBus.on('zoomin', webViewerZoomIn);
+    eventBus.on('zoomout', webViewerZoomOut);
+    eventBus.on('pagenumberchanged', webViewerPageNumberChanged);
+    eventBus.on('scalechanged', webViewerScaleChanged);
+    eventBus.on('rotatecw', webViewerRotateCw);
+    eventBus.on('rotateccw', webViewerRotateCcw);
+    eventBus.on('switchscrollmode', webViewerSwitchScrollMode);
+    eventBus.on('scrollmodechanged', webViewerScrollModeChanged);
+    eventBus.on('switchspreadmode', webViewerSwitchSpreadMode);
+    eventBus.on('spreadmodechanged', webViewerSpreadModeChanged);
+    eventBus.on('documentproperties', webViewerDocumentProperties);
+    eventBus.on('find', webViewerFind);
+    eventBus.on('findfromurlhash', webViewerFindFromUrlHash);
+    eventBus.on('updatefindmatchescount', webViewerUpdateFindMatchesCount);
+    eventBus.on('updatefindcontrolstate', webViewerUpdateFindControlState);
+    eventBus.on('fileinputchange', webViewerFileInputChange);
+  },
+  bindWindowEvents: function bindWindowEvents() {
+    var eventBus = this.eventBus,
+        _boundEvents = this._boundEvents;
+
+    _boundEvents.windowResize = function () {
+      eventBus.dispatch('resize', { source: window });
+    };
+    _boundEvents.windowHashChange = function () {
+      eventBus.dispatch('hashchange', {
+        source: window,
+        hash: document.location.hash.substring(1)
+      });
+    };
+    _boundEvents.windowBeforePrint = function () {
+      eventBus.dispatch('beforeprint', { source: window });
+    };
+    _boundEvents.windowAfterPrint = function () {
+      eventBus.dispatch('afterprint', { source: window });
+    };
+    window.addEventListener('wheel', webViewerWheel);
+    window.addEventListener('click', webViewerClick);
+    window.addEventListener('keydown', webViewerKeyDown);
+    window.addEventListener('resize', _boundEvents.windowResize);
+    window.addEventListener('hashchange', _boundEvents.windowHashChange);
+    window.addEventListener('beforeprint', _boundEvents.windowBeforePrint);
+    window.addEventListener('afterprint', _boundEvents.windowAfterPrint);
+  },
+  unbindEvents: function unbindEvents() {
+    var eventBus = this.eventBus,
+        _boundEvents = this._boundEvents;
+
+    eventBus.off('resize', webViewerResize);
+    eventBus.off('hashchange', webViewerHashchange);
+    eventBus.off('beforeprint', _boundEvents.beforePrint);
+    eventBus.off('afterprint', _boundEvents.afterPrint);
+    eventBus.off('pagerendered', webViewerPageRendered);
+    eventBus.off('textlayerrendered', webViewerTextLayerRendered);
+    eventBus.off('updateviewarea', webViewerUpdateViewarea);
+    eventBus.off('pagechanging', webViewerPageChanging);
+    eventBus.off('scalechanging', webViewerScaleChanging);
+    eventBus.off('rotationchanging', webViewerRotationChanging);
+    eventBus.off('sidebarviewchanged', webViewerSidebarViewChanged);
+    eventBus.off('pagemode', webViewerPageMode);
+    eventBus.off('namedaction', webViewerNamedAction);
+    eventBus.off('presentationmodechanged', webViewerPresentationModeChanged);
+    eventBus.off('presentationmode', webViewerPresentationMode);
+    eventBus.off('openfile', webViewerOpenFile);
+    eventBus.off('print', webViewerPrint);
+    eventBus.off('download', webViewerDownload);
+    eventBus.off('firstpage', webViewerFirstPage);
+    eventBus.off('lastpage', webViewerLastPage);
+    eventBus.off('nextpage', webViewerNextPage);
+    eventBus.off('previouspage', webViewerPreviousPage);
+    eventBus.off('zoomin', webViewerZoomIn);
+    eventBus.off('zoomout', webViewerZoomOut);
+    eventBus.off('pagenumberchanged', webViewerPageNumberChanged);
+    eventBus.off('scalechanged', webViewerScaleChanged);
+    eventBus.off('rotatecw', webViewerRotateCw);
+    eventBus.off('rotateccw', webViewerRotateCcw);
+    eventBus.off('switchscrollmode', webViewerSwitchScrollMode);
+    eventBus.off('scrollmodechanged', webViewerScrollModeChanged);
+    eventBus.off('switchspreadmode', webViewerSwitchSpreadMode);
+    eventBus.off('spreadmodechanged', webViewerSpreadModeChanged);
+    eventBus.off('documentproperties', webViewerDocumentProperties);
+    eventBus.off('find', webViewerFind);
+    eventBus.off('findfromurlhash', webViewerFindFromUrlHash);
+    eventBus.off('updatefindmatchescount', webViewerUpdateFindMatchesCount);
+    eventBus.off('updatefindcontrolstate', webViewerUpdateFindControlState);
+    eventBus.off('fileinputchange', webViewerFileInputChange);
+    _boundEvents.beforePrint = null;
+    _boundEvents.afterPrint = null;
+  },
+  unbindWindowEvents: function unbindWindowEvents() {
+    var _boundEvents = this._boundEvents;
+
+    window.removeEventListener('wheel', webViewerWheel);
+    window.removeEventListener('click', webViewerClick);
+    window.removeEventListener('keydown', webViewerKeyDown);
+    window.removeEventListener('resize', _boundEvents.windowResize);
+    window.removeEventListener('hashchange', _boundEvents.windowHashChange);
+    window.removeEventListener('beforeprint', _boundEvents.windowBeforePrint);
+    window.removeEventListener('afterprint', _boundEvents.windowAfterPrint);
+    _boundEvents.windowResize = null;
+    _boundEvents.windowHashChange = null;
+    _boundEvents.windowBeforePrint = null;
+    _boundEvents.windowAfterPrint = null;
+  }
+};
+var validateFileURL = void 0;
+{
+  var HOSTED_VIEWER_ORIGINS = ['null', 'http://mozilla.github.io', 'https://mozilla.github.io'];
+  validateFileURL = function validateFileURL(file) {
+    if (file === undefined) {
+      return;
+    }
+    try {
+      var viewerOrigin = new _pdfjsLib.URL(window.location.href).origin || 'null';
+      if (HOSTED_VIEWER_ORIGINS.includes(viewerOrigin)) {
+        return;
+      }
+
+      var _ref14 = new _pdfjsLib.URL(file, window.location.href),
+          origin = _ref14.origin,
+          protocol = _ref14.protocol;
+
+      // if (origin !== viewerOrigin && protocol !== 'blob:') {
+      //   throw new Error('file origin does not match viewer\'s');
+      // }
+    } catch (ex) {
+      var message = ex && ex.message;
+      PDFViewerApplication.l10n.get('loading_error', null, 'An error occurred while loading the PDF.').then(function (loadingErrorMessage) {
+        PDFViewerApplication.error(loadingErrorMessage, { message: message });
+      });
+      throw ex;
+    }
+  };
+}
+function loadFakeWorker() {
+  if (!_pdfjsLib.GlobalWorkerOptions.workerSrc) {
+    _pdfjsLib.GlobalWorkerOptions.workerSrc = _app_options.AppOptions.get('workerSrc');
+  }
+  return (0, _pdfjsLib.loadScript)(_pdfjsLib.PDFWorker.getWorkerSrc());
+}
+function loadAndEnablePDFBug(enabledTabs) {
+  var appConfig = PDFViewerApplication.appConfig;
+  return (0, _pdfjsLib.loadScript)(appConfig.debuggerScriptPath).then(function () {
+    PDFBug.enable(enabledTabs);
+    PDFBug.init({
+      OPS: _pdfjsLib.OPS,
+      createObjectURL: _pdfjsLib.createObjectURL
+    }, appConfig.mainContainer);
+  });
+}
+function webViewerInitialized() {
+  var appConfig = PDFViewerApplication.appConfig;
+  var file = void 0;
+  var queryString = document.location.search.substring(1);
+  var token = "";
+  if (queryString.indexOf("?") != -1) {  
+    var str = queryString.substr(1); 
+    token = "="+str.split("=")[2];  
+  } 
+  var params = (0, _ui_utils.parseQueryString)(queryString);
+  file = 'file' in params ? params.file : _app_options.AppOptions.get('defaultUrl');
+  file += token
+  validateFileURL(file);
+  var fileInput = document.createElement('input');
+  fileInput.id = appConfig.openFileInputName;
+  fileInput.className = 'fileInput';
+  fileInput.setAttribute('type', 'file');
+  fileInput.oncontextmenu = _ui_utils.noContextMenuHandler;
+  document.body.appendChild(fileInput);
+  if (!window.File || !window.FileReader || !window.FileList || !window.Blob) {
+    appConfig.toolbar.openFile.setAttribute('hidden', 'true');
+    appConfig.secondaryToolbar.openFileButton.setAttribute('hidden', 'true');
+  } else {
+    fileInput.value = null;
+  }
+  fileInput.addEventListener('change', function (evt) {
+    var files = evt.target.files;
+    if (!files || files.length === 0) {
+      return;
+    }
+    PDFViewerApplication.eventBus.dispatch('fileinputchange', {
+      source: this,
+      fileInput: evt.target
+    });
+  });
+  appConfig.mainContainer.addEventListener('dragover', function (evt) {
+    evt.preventDefault();
+    evt.dataTransfer.dropEffect = 'move';
+  });
+  appConfig.mainContainer.addEventListener('drop', function (evt) {
+    evt.preventDefault();
+    var files = evt.dataTransfer.files;
+    if (!files || files.length === 0) {
+      return;
+    }
+    PDFViewerApplication.eventBus.dispatch('fileinputchange', {
+      source: this,
+      fileInput: evt.dataTransfer
+    });
+  });
+
+  if (!PDFViewerApplication.supportsPrinting && 'true' != params.print) {
+    appConfig.toolbar.print.classList.add('hidden');
+    appConfig.secondaryToolbar.printButton.classList.add('hidden');
+  }
+  if(params.print =='true'){
+
+      document.getElementById("print").style.display="block";
+  }else{
+      document.getElementById("print").style.display="none";
+  }
+  if(params.download == 'true'){
+      document.getElementById("download").style.display="block";
+  }else{
+      document.getElementById("download").style.display="none";
+  }
+  if (!PDFViewerApplication.supportsFullscreen) {
+    appConfig.toolbar.presentationModeButton.classList.add('hidden');
+    appConfig.secondaryToolbar.presentationModeButton.classList.add('hidden');
+  }
+  if (PDFViewerApplication.supportsIntegratedFind) {
+    appConfig.toolbar.viewFind.classList.add('hidden');
+  }
+  appConfig.mainContainer.addEventListener('transitionend', function (evt) {
+    if (evt.target === this) {
+      PDFViewerApplication.eventBus.dispatch('resize', { source: this });
+    }
+  }, true);
+  appConfig.sidebar.toggleButton.addEventListener('click', function () {
+    PDFViewerApplication.pdfSidebar.toggle();
+  });
+  try {
+    webViewerOpenFileViaURL(file);
+  } catch (reason) {
+    PDFViewerApplication.l10n.get('loading_error', null, 'An error occurred while loading the PDF.').then(function (msg) {
+      PDFViewerApplication.error(msg, reason);
+    });
+  }
+}
+var webViewerOpenFileViaURL = void 0;
+{
+  webViewerOpenFileViaURL = function webViewerOpenFileViaURL(file) {
+    if (file && file.lastIndexOf('file:', 0) === 0) {
+      PDFViewerApplication.setTitleUsingUrl(file);
+      var xhr = new XMLHttpRequest();
+      xhr.onload = function () {
+        PDFViewerApplication.open(new Uint8Array(xhr.response));
+      };
+      try {
+        xhr.open('GET', file);
+        xhr.responseType = 'arraybuffer';
+        xhr.send();
+      } catch (ex) {
+        throw ex;
+      }
+      return;
+    }
+    if (file) {
+      PDFViewerApplication.open(file);
+    }
+  };
+}
+function webViewerPageRendered(evt) {
+  var pageNumber = evt.pageNumber;
+  var pageIndex = pageNumber - 1;
+  var pageView = PDFViewerApplication.pdfViewer.getPageView(pageIndex);
+  if (pageNumber === PDFViewerApplication.page) {
+    PDFViewerApplication.toolbar.updateLoadingIndicatorState(false);
+  }
+  if (!pageView) {
+    return;
+  }
+  if (PDFViewerApplication.pdfSidebar.isThumbnailViewVisible) {
+    var thumbnailView = PDFViewerApplication.pdfThumbnailViewer.getThumbnail(pageIndex);
+    thumbnailView.setImage(pageView);
+  }
+  if (typeof Stats !== 'undefined' && Stats.enabled && pageView.stats) {
+    Stats.add(pageNumber, pageView.stats);
+  }
+  if (pageView.error) {
+    PDFViewerApplication.l10n.get('rendering_error', null, 'An error occurred while rendering the page.').then(function (msg) {
+      PDFViewerApplication.error(msg, pageView.error);
+    });
+  }
+}
+function webViewerTextLayerRendered(evt) {}
+function webViewerPageMode(evt) {
+  var mode = evt.mode,
+      view = void 0;
+  switch (mode) {
+    case 'thumbs':
+      view = _pdf_sidebar.SidebarView.THUMBS;
+      break;
+    case 'bookmarks':
+    case 'outline':
+      view = _pdf_sidebar.SidebarView.OUTLINE;
+      break;
+    case 'attachments':
+      view = _pdf_sidebar.SidebarView.ATTACHMENTS;
+      break;
+    case 'none':
+      view = _pdf_sidebar.SidebarView.NONE;
+      break;
+    default:
+      console.error('Invalid "pagemode" hash parameter: ' + mode);
+      return;
+  }
+  PDFViewerApplication.pdfSidebar.switchView(view, true);
+}
+function webViewerNamedAction(evt) {
+  var action = evt.action;
+  switch (action) {
+    case 'GoToPage':
+      PDFViewerApplication.appConfig.toolbar.pageNumber.select();
+      break;
+    case 'Find':
+      if (!PDFViewerApplication.supportsIntegratedFind) {
+        PDFViewerApplication.findBar.toggle();
+      }
+      break;
+  }
+}
+function webViewerPresentationModeChanged(evt) {
+  var active = evt.active,
+      switchInProgress = evt.switchInProgress;
+
+  PDFViewerApplication.pdfViewer.presentationModeState = switchInProgress ? _ui_utils.PresentationModeState.CHANGING : active ? _ui_utils.PresentationModeState.FULLSCREEN : _ui_utils.PresentationModeState.NORMAL;
+}
+function webViewerSidebarViewChanged(evt) {
+  PDFViewerApplication.pdfRenderingQueue.isThumbnailViewEnabled = PDFViewerApplication.pdfSidebar.isThumbnailViewVisible;
+  var store = PDFViewerApplication.store;
+  if (store && PDFViewerApplication.isInitialViewSet) {
+    store.set('sidebarView', evt.view).catch(function () {});
+  }
+}
+function webViewerUpdateViewarea(evt) {
+  var location = evt.location,
+      store = PDFViewerApplication.store;
+  if (store && PDFViewerApplication.isInitialViewSet) {
+    store.setMultiple({
+      'page': location.pageNumber,
+      'zoom': location.scale,
+      'scrollLeft': location.left,
+      'scrollTop': location.top,
+      'rotation': location.rotation
+    }).catch(function () {});
+  }
+  var href = PDFViewerApplication.pdfLinkService.getAnchorUrl(location.pdfOpenParams);
+  PDFViewerApplication.appConfig.toolbar.viewBookmark.href = href;
+  PDFViewerApplication.appConfig.secondaryToolbar.viewBookmarkButton.href = href;
+  var currentPage = PDFViewerApplication.pdfViewer.getPageView(PDFViewerApplication.page - 1);
+  var loading = currentPage.renderingState !== _pdf_rendering_queue.RenderingStates.FINISHED;
+  PDFViewerApplication.toolbar.updateLoadingIndicatorState(loading);
+}
+function webViewerScrollModeChanged(evt) {
+  var store = PDFViewerApplication.store;
+  if (store && PDFViewerApplication.isInitialViewSet) {
+    store.set('scrollMode', evt.mode).catch(function () {});
+  }
+}
+function webViewerSpreadModeChanged(evt) {
+  var store = PDFViewerApplication.store;
+  if (store && PDFViewerApplication.isInitialViewSet) {
+    store.set('spreadMode', evt.mode).catch(function () {});
+  }
+}
+function webViewerResize() {
+  var pdfDocument = PDFViewerApplication.pdfDocument,
+      pdfViewer = PDFViewerApplication.pdfViewer;
+
+  if (!pdfDocument) {
+    return;
+  }
+  var currentScaleValue = pdfViewer.currentScaleValue;
+  if (currentScaleValue === 'auto' || currentScaleValue === 'page-fit' || currentScaleValue === 'page-width') {
+    pdfViewer.currentScaleValue = currentScaleValue;
+  }
+  pdfViewer.update();
+}
+function webViewerHashchange(evt) {
+  var hash = evt.hash;
+  if (!hash) {
+    return;
+  }
+  if (!PDFViewerApplication.isInitialViewSet) {
+    PDFViewerApplication.initialBookmark = hash;
+  } else if (!PDFViewerApplication.pdfHistory.popStateInProgress) {
+    PDFViewerApplication.pdfLinkService.setHash(hash);
+  }
+}
+var webViewerFileInputChange = void 0;
+{
+  webViewerFileInputChange = function webViewerFileInputChange(evt) {
+    if (PDFViewerApplication.pdfViewer && PDFViewerApplication.pdfViewer.isInPresentationMode) {
+      return;
+    }
+    var file = evt.fileInput.files[0];
+    if (_pdfjsLib.URL.createObjectURL && !_app_options.AppOptions.get('disableCreateObjectURL')) {
+      var _url = _pdfjsLib.URL.createObjectURL(file);
+      if (file.name) {
+        _url = {
+          url: _url,
+          originalUrl: file.name
+        };
+      }
+      PDFViewerApplication.open(_url);
+    } else {
+      PDFViewerApplication.setTitleUsingUrl(file.name);
+      var fileReader = new FileReader();
+      fileReader.onload = function webViewerChangeFileReaderOnload(evt) {
+        var buffer = evt.target.result;
+        PDFViewerApplication.open(new Uint8Array(buffer));
+      };
+      fileReader.readAsArrayBuffer(file);
+    }
+    var appConfig = PDFViewerApplication.appConfig;
+    appConfig.toolbar.viewBookmark.setAttribute('hidden', 'true');
+    appConfig.secondaryToolbar.viewBookmarkButton.setAttribute('hidden', 'true');
+    appConfig.toolbar.download.setAttribute('hidden', 'true');
+    appConfig.secondaryToolbar.downloadButton.setAttribute('hidden', 'true');
+  };
+}
+function webViewerPresentationMode() {
+  PDFViewerApplication.requestPresentationMode();
+}
+function webViewerOpenFile() {
+  var openFileInputName = PDFViewerApplication.appConfig.openFileInputName;
+  document.getElementById(openFileInputName).click();
+}
+function webViewerPrint() {
+  window.print();
+}
+function webViewerDownload() {
+  PDFViewerApplication.download();
+}
+function webViewerFirstPage() {
+  if (PDFViewerApplication.pdfDocument) {
+    PDFViewerApplication.page = 1;
+  }
+}
+function webViewerLastPage() {
+  if (PDFViewerApplication.pdfDocument) {
+    PDFViewerApplication.page = PDFViewerApplication.pagesCount;
+  }
+}
+function webViewerNextPage() {
+  PDFViewerApplication.page++;
+}
+function webViewerPreviousPage() {
+  PDFViewerApplication.page--;
+}
+function webViewerZoomIn() {
+  PDFViewerApplication.zoomIn();
+}
+function webViewerZoomOut() {
+  PDFViewerApplication.zoomOut();
+}
+function webViewerPageNumberChanged(evt) {
+  var pdfViewer = PDFViewerApplication.pdfViewer;
+  pdfViewer.currentPageLabel = evt.value;
+  if (evt.value !== pdfViewer.currentPageNumber.toString() && evt.value !== pdfViewer.currentPageLabel) {
+    PDFViewerApplication.toolbar.setPageNumber(pdfViewer.currentPageNumber, pdfViewer.currentPageLabel);
+  }
+}
+function webViewerScaleChanged(evt) {
+  PDFViewerApplication.pdfViewer.currentScaleValue = evt.value;
+}
+function webViewerRotateCw() {
+  PDFViewerApplication.rotatePages(90);
+}
+function webViewerRotateCcw() {
+  PDFViewerApplication.rotatePages(-90);
+}
+function webViewerSwitchScrollMode(evt) {
+  PDFViewerApplication.pdfViewer.scrollMode = evt.mode;
+}
+function webViewerSwitchSpreadMode(evt) {
+  PDFViewerApplication.pdfViewer.spreadMode = evt.mode;
+}
+function webViewerDocumentProperties() {
+  PDFViewerApplication.pdfDocumentProperties.open();
+}
+function webViewerFind(evt) {
+  PDFViewerApplication.findController.executeCommand('find' + evt.type, {
+    query: evt.query,
+    phraseSearch: evt.phraseSearch,
+    caseSensitive: evt.caseSensitive,
+    entireWord: evt.entireWord,
+    highlightAll: evt.highlightAll,
+    findPrevious: evt.findPrevious
+  });
+}
+function webViewerFindFromUrlHash(evt) {
+  PDFViewerApplication.findController.executeCommand('find', {
+    query: evt.query,
+    phraseSearch: evt.phraseSearch,
+    caseSensitive: false,
+    entireWord: false,
+    highlightAll: true,
+    findPrevious: false
+  });
+}
+function webViewerUpdateFindMatchesCount(_ref15) {
+  var matchesCount = _ref15.matchesCount;
+
+  if (PDFViewerApplication.supportsIntegratedFind) {
+    PDFViewerApplication.externalServices.updateFindMatchesCount(matchesCount);
+  } else {
+    PDFViewerApplication.findBar.updateResultsCount(matchesCount);
+  }
+}
+function webViewerUpdateFindControlState(_ref16) {
+  var state = _ref16.state,
+      previous = _ref16.previous,
+      matchesCount = _ref16.matchesCount;
+
+  if (PDFViewerApplication.supportsIntegratedFind) {
+    PDFViewerApplication.externalServices.updateFindControlState({
+      result: state,
+      findPrevious: previous,
+      matchesCount: matchesCount
+    });
+  } else {
+    PDFViewerApplication.findBar.updateUIState(state, previous, matchesCount);
+  }
+}
+function webViewerScaleChanging(evt) {
+  PDFViewerApplication.toolbar.setPageScale(evt.presetValue, evt.scale);
+  PDFViewerApplication.pdfViewer.update();
+}
+function webViewerRotationChanging(evt) {
+  PDFViewerApplication.pdfThumbnailViewer.pagesRotation = evt.pagesRotation;
+  PDFViewerApplication.forceRendering();
+  PDFViewerApplication.pdfViewer.currentPageNumber = evt.pageNumber;
+}
+function webViewerPageChanging(evt) {
+  var page = evt.pageNumber;
+  PDFViewerApplication.toolbar.setPageNumber(page, evt.pageLabel || null);
+  PDFViewerApplication.secondaryToolbar.setPageNumber(page);
+  if (PDFViewerApplication.pdfSidebar.isThumbnailViewVisible) {
+    PDFViewerApplication.pdfThumbnailViewer.scrollThumbnailIntoView(page);
+  }
+  if (typeof Stats !== 'undefined' && Stats.enabled) {
+    var pageView = PDFViewerApplication.pdfViewer.getPageView(page - 1);
+    if (pageView && pageView.stats) {
+      Stats.add(page, pageView.stats);
+    }
+  }
+}
+var zoomDisabled = false,
+    zoomDisabledTimeout = void 0;
+function webViewerWheel(evt) {
+  var pdfViewer = PDFViewerApplication.pdfViewer;
+  if (pdfViewer.isInPresentationMode) {
+    return;
+  }
+  if (evt.ctrlKey || evt.metaKey) {
+    var support = PDFViewerApplication.supportedMouseWheelZoomModifierKeys;
+    if (evt.ctrlKey && !support.ctrlKey || evt.metaKey && !support.metaKey) {
+      return;
+    }
+    evt.preventDefault();
+    if (zoomDisabled) {
+      return;
+    }
+    var previousScale = pdfViewer.currentScale;
+    var delta = (0, _ui_utils.normalizeWheelEventDelta)(evt);
+    var MOUSE_WHEEL_DELTA_PER_PAGE_SCALE = 3.0;
+    var ticks = delta * MOUSE_WHEEL_DELTA_PER_PAGE_SCALE;
+    if (ticks < 0) {
+      PDFViewerApplication.zoomOut(-ticks);
+    } else {
+      PDFViewerApplication.zoomIn(ticks);
+    }
+    var currentScale = pdfViewer.currentScale;
+    if (previousScale !== currentScale) {
+      var scaleCorrectionFactor = currentScale / previousScale - 1;
+      var rect = pdfViewer.container.getBoundingClientRect();
+      var dx = evt.clientX - rect.left;
+      var dy = evt.clientY - rect.top;
+      pdfViewer.container.scrollLeft += dx * scaleCorrectionFactor;
+      pdfViewer.container.scrollTop += dy * scaleCorrectionFactor;
+    }
+  } else {
+    zoomDisabled = true;
+    clearTimeout(zoomDisabledTimeout);
+    zoomDisabledTimeout = setTimeout(function () {
+      zoomDisabled = false;
+    }, 1000);
+  }
+}
+function webViewerClick(evt) {
+  if (!PDFViewerApplication.secondaryToolbar.isOpen) {
+    return;
+  }
+  var appConfig = PDFViewerApplication.appConfig;
+  if (PDFViewerApplication.pdfViewer.containsElement(evt.target) || appConfig.toolbar.container.contains(evt.target) && evt.target !== appConfig.secondaryToolbar.toggleButton) {
+    PDFViewerApplication.secondaryToolbar.close();
+  }
+}
+function webViewerKeyDown(evt) {
+  if (PDFViewerApplication.overlayManager.active) {
+    return;
+  }
+  var handled = false,
+      ensureViewerFocused = false;
+  var cmd = (evt.ctrlKey ? 1 : 0) | (evt.altKey ? 2 : 0) | (evt.shiftKey ? 4 : 0) | (evt.metaKey ? 8 : 0);
+  var pdfViewer = PDFViewerApplication.pdfViewer;
+  var isViewerInPresentationMode = pdfViewer && pdfViewer.isInPresentationMode;
+  if (cmd === 1 || cmd === 8 || cmd === 5 || cmd === 12) {
+    switch (evt.keyCode) {
+      case 70:
+        if (!PDFViewerApplication.supportsIntegratedFind) {
+          PDFViewerApplication.findBar.open();
+          handled = true;
+        }
+        break;
+      case 71:
+        if (!PDFViewerApplication.supportsIntegratedFind) {
+          var findState = PDFViewerApplication.findController.state;
+          if (findState) {
+            PDFViewerApplication.findController.executeCommand('findagain', {
+              query: findState.query,
+              phraseSearch: findState.phraseSearch,
+              caseSensitive: findState.caseSensitive,
+              entireWord: findState.entireWord,
+              highlightAll: findState.highlightAll,
+              findPrevious: cmd === 5 || cmd === 12
+            });
+          }
+          handled = true;
+        }
+        break;
+      case 61:
+      case 107:
+      case 187:
+      case 171:
+        if (!isViewerInPresentationMode) {
+          PDFViewerApplication.zoomIn();
+        }
+        handled = true;
+        break;
+      case 173:
+      case 109:
+      case 189:
+        if (!isViewerInPresentationMode) {
+          PDFViewerApplication.zoomOut();
+        }
+        handled = true;
+        break;
+      case 48:
+      case 96:
+        if (!isViewerInPresentationMode) {
+          setTimeout(function () {
+            pdfViewer.currentScaleValue = _ui_utils.DEFAULT_SCALE_VALUE;
+          });
+          handled = false;
+        }
+        break;
+      case 38:
+        if (isViewerInPresentationMode || PDFViewerApplication.page > 1) {
+          PDFViewerApplication.page = 1;
+          handled = true;
+          ensureViewerFocused = true;
+        }
+        break;
+      case 40:
+        if (isViewerInPresentationMode || PDFViewerApplication.page < PDFViewerApplication.pagesCount) {
+          PDFViewerApplication.page = PDFViewerApplication.pagesCount;
+          handled = true;
+          ensureViewerFocused = true;
+        }
+        break;
+    }
+  }
+  if (cmd === 1 || cmd === 8) {
+    switch (evt.keyCode) {
+      case 83:
+        PDFViewerApplication.download();
+        handled = true;
+        break;
+    }
+  }
+  if (cmd === 3 || cmd === 10) {
+    switch (evt.keyCode) {
+      case 80:
+        PDFViewerApplication.requestPresentationMode();
+        handled = true;
+        break;
+      case 71:
+        PDFViewerApplication.appConfig.toolbar.pageNumber.select();
+        handled = true;
+        break;
+    }
+  }
+  if (handled) {
+    if (ensureViewerFocused && !isViewerInPresentationMode) {
+      pdfViewer.focus();
+    }
+    evt.preventDefault();
+    return;
+  }
+  var curElement = document.activeElement || document.querySelector(':focus');
+  var curElementTagName = curElement && curElement.tagName.toUpperCase();
+  if (curElementTagName === 'INPUT' || curElementTagName === 'TEXTAREA' || curElementTagName === 'SELECT') {
+    if (evt.keyCode !== 27) {
+      return;
+    }
+  }
+  if (cmd === 0) {
+    var turnPage = 0,
+        turnOnlyIfPageFit = false;
+    switch (evt.keyCode) {
+      case 38:
+      case 33:
+        if (pdfViewer.isVerticalScrollbarEnabled) {
+          turnOnlyIfPageFit = true;
+        }
+        turnPage = -1;
+        break;
+      case 8:
+        if (!isViewerInPresentationMode) {
+          turnOnlyIfPageFit = true;
+        }
+        turnPage = -1;
+        break;
+      case 37:
+        if (pdfViewer.isHorizontalScrollbarEnabled) {
+          turnOnlyIfPageFit = true;
+        }
+      case 75:
+      case 80:
+        turnPage = -1;
+        break;
+      case 27:
+        if (PDFViewerApplication.secondaryToolbar.isOpen) {
+          PDFViewerApplication.secondaryToolbar.close();
+          handled = true;
+        }
+        if (!PDFViewerApplication.supportsIntegratedFind && PDFViewerApplication.findBar.opened) {
+          PDFViewerApplication.findBar.close();
+          handled = true;
+        }
+        break;
+      case 40:
+      case 34:
+        if (pdfViewer.isVerticalScrollbarEnabled) {
+          turnOnlyIfPageFit = true;
+        }
+        turnPage = 1;
+        break;
+      case 13:
+      case 32:
+        if (!isViewerInPresentationMode) {
+          turnOnlyIfPageFit = true;
+        }
+        turnPage = 1;
+        break;
+      case 39:
+        if (pdfViewer.isHorizontalScrollbarEnabled) {
+          turnOnlyIfPageFit = true;
+        }
+      case 74:
+      case 78:
+        turnPage = 1;
+        break;
+      case 36:
+        if (isViewerInPresentationMode || PDFViewerApplication.page > 1) {
+          PDFViewerApplication.page = 1;
+          handled = true;
+          ensureViewerFocused = true;
+        }
+        break;
+      case 35:
+        if (isViewerInPresentationMode || PDFViewerApplication.page < PDFViewerApplication.pagesCount) {
+          PDFViewerApplication.page = PDFViewerApplication.pagesCount;
+          handled = true;
+          ensureViewerFocused = true;
+        }
+        break;
+      case 83:
+        PDFViewerApplication.pdfCursorTools.switchTool(_pdf_cursor_tools.CursorTool.SELECT);
+        break;
+      case 72:
+        PDFViewerApplication.pdfCursorTools.switchTool(_pdf_cursor_tools.CursorTool.HAND);
+        break;
+      case 82:
+        PDFViewerApplication.rotatePages(90);
+        break;
+    }
+    if (turnPage !== 0 && (!turnOnlyIfPageFit || pdfViewer.currentScaleValue === 'page-fit')) {
+      if (turnPage > 0) {
+        if (PDFViewerApplication.page < PDFViewerApplication.pagesCount) {
+          PDFViewerApplication.page++;
+        }
+      } else {
+        if (PDFViewerApplication.page > 1) {
+          PDFViewerApplication.page--;
+        }
+      }
+      handled = true;
+    }
+  }
+  if (cmd === 4) {
+    switch (evt.keyCode) {
+      case 13:
+      case 32:
+        if (!isViewerInPresentationMode && pdfViewer.currentScaleValue !== 'page-fit') {
+          break;
+        }
+        if (PDFViewerApplication.page > 1) {
+          PDFViewerApplication.page--;
+        }
+        handled = true;
+        break;
+      case 82:
+        PDFViewerApplication.rotatePages(-90);
+        break;
+    }
+  }
+  if (!handled && !isViewerInPresentationMode) {
+    if (evt.keyCode >= 33 && evt.keyCode <= 40 || evt.keyCode === 32 && curElementTagName !== 'BUTTON') {
+      ensureViewerFocused = true;
+    }
+  }
+  if (ensureViewerFocused && !pdfViewer.containsElement(curElement)) {
+    pdfViewer.focus();
+  }
+  if (handled) {
+    evt.preventDefault();
+  }
+}
+function apiPageModeToSidebarView(mode) {
+  switch (mode) {
+    case 'UseNone':
+      return _pdf_sidebar.SidebarView.NONE;
+    case 'UseThumbs':
+      return _pdf_sidebar.SidebarView.THUMBS;
+    case 'UseOutlines':
+      return _pdf_sidebar.SidebarView.OUTLINE;
+    case 'UseAttachments':
+      return _pdf_sidebar.SidebarView.ATTACHMENTS;
+    case 'UseOC':
+  }
+  return _pdf_sidebar.SidebarView.NONE;
+}
+var PDFPrintServiceFactory = {
+  instance: {
+    supportsPrinting: false,
+    createPrintService: function createPrintService() {
+      throw new Error('Not implemented: createPrintService');
+    }
+  }
+};
+exports.PDFViewerApplication = PDFViewerApplication;
+exports.DefaultExternalServices = DefaultExternalServices;
+exports.PDFPrintServiceFactory = PDFPrintServiceFactory;
+
+/***/ }),
+/* 2 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+module.exports = __webpack_require__(3);
+
+/***/ }),
+/* 3 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var g = function () {
+  return this;
+}() || Function("return this")();
+var hadRuntime = g.regeneratorRuntime && Object.getOwnPropertyNames(g).indexOf("regeneratorRuntime") >= 0;
+var oldRuntime = hadRuntime && g.regeneratorRuntime;
+g.regeneratorRuntime = undefined;
+module.exports = __webpack_require__(4);
+if (hadRuntime) {
+  g.regeneratorRuntime = oldRuntime;
+} else {
+  try {
+    delete g.regeneratorRuntime;
+  } catch (e) {
+    g.regeneratorRuntime = undefined;
+  }
+}
+
+/***/ }),
+/* 4 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+/* WEBPACK VAR INJECTION */(function(module) {
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+!function (global) {
+  "use strict";
+
+  var Op = Object.prototype;
+  var hasOwn = Op.hasOwnProperty;
+  var undefined;
+  var $Symbol = typeof Symbol === "function" ? Symbol : {};
+  var iteratorSymbol = $Symbol.iterator || "@@iterator";
+  var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator";
+  var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";
+  var inModule = ( false ? undefined : _typeof(module)) === "object";
+  var runtime = global.regeneratorRuntime;
+  if (runtime) {
+    if (inModule) {
+      module.exports = runtime;
+    }
+    return;
+  }
+  runtime = global.regeneratorRuntime = inModule ? module.exports : {};
+  function wrap(innerFn, outerFn, self, tryLocsList) {
+    var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;
+    var generator = Object.create(protoGenerator.prototype);
+    var context = new Context(tryLocsList || []);
+    generator._invoke = makeInvokeMethod(innerFn, self, context);
+    return generator;
+  }
+  runtime.wrap = wrap;
+  function tryCatch(fn, obj, arg) {
+    try {
+      return {
+        type: "normal",
+        arg: fn.call(obj, arg)
+      };
+    } catch (err) {
+      return {
+        type: "throw",
+        arg: err
+      };
+    }
+  }
+  var GenStateSuspendedStart = "suspendedStart";
+  var GenStateSuspendedYield = "suspendedYield";
+  var GenStateExecuting = "executing";
+  var GenStateCompleted = "completed";
+  var ContinueSentinel = {};
+  function Generator() {}
+  function GeneratorFunction() {}
+  function GeneratorFunctionPrototype() {}
+  var IteratorPrototype = {};
+  IteratorPrototype[iteratorSymbol] = function () {
+    return this;
+  };
+  var getProto = Object.getPrototypeOf;
+  var NativeIteratorPrototype = getProto && getProto(getProto(values([])));
+  if (NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {
+    IteratorPrototype = NativeIteratorPrototype;
+  }
+  var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype);
+  GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;
+  GeneratorFunctionPrototype.constructor = GeneratorFunction;
+  GeneratorFunctionPrototype[toStringTagSymbol] = GeneratorFunction.displayName = "GeneratorFunction";
+  function defineIteratorMethods(prototype) {
+    ["next", "throw", "return"].forEach(function (method) {
+      prototype[method] = function (arg) {
+        return this._invoke(method, arg);
+      };
+    });
+  }
+  runtime.isGeneratorFunction = function (genFun) {
+    var ctor = typeof genFun === "function" && genFun.constructor;
+    return ctor ? ctor === GeneratorFunction || (ctor.displayName || ctor.name) === "GeneratorFunction" : false;
+  };
+  runtime.mark = function (genFun) {
+    if (Object.setPrototypeOf) {
+      Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);
+    } else {
+      genFun.__proto__ = GeneratorFunctionPrototype;
+      if (!(toStringTagSymbol in genFun)) {
+        genFun[toStringTagSymbol] = "GeneratorFunction";
+      }
+    }
+    genFun.prototype = Object.create(Gp);
+    return genFun;
+  };
+  runtime.awrap = function (arg) {
+    return { __await: arg };
+  };
+  function AsyncIterator(generator) {
+    function invoke(method, arg, resolve, reject) {
+      var record = tryCatch(generator[method], generator, arg);
+      if (record.type === "throw") {
+        reject(record.arg);
+      } else {
+        var result = record.arg;
+        var value = result.value;
+        if (value && (typeof value === "undefined" ? "undefined" : _typeof(value)) === "object" && hasOwn.call(value, "__await")) {
+          return Promise.resolve(value.__await).then(function (value) {
+            invoke("next", value, resolve, reject);
+          }, function (err) {
+            invoke("throw", err, resolve, reject);
+          });
+        }
+        return Promise.resolve(value).then(function (unwrapped) {
+          result.value = unwrapped;
+          resolve(result);
+        }, reject);
+      }
+    }
+    var previousPromise;
+    function enqueue(method, arg) {
+      function callInvokeWithMethodAndArg() {
+        return new Promise(function (resolve, reject) {
+          invoke(method, arg, resolve, reject);
+        });
+      }
+      return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();
+    }
+    this._invoke = enqueue;
+  }
+  defineIteratorMethods(AsyncIterator.prototype);
+  AsyncIterator.prototype[asyncIteratorSymbol] = function () {
+    return this;
+  };
+  runtime.AsyncIterator = AsyncIterator;
+  runtime.async = function (innerFn, outerFn, self, tryLocsList) {
+    var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList));
+    return runtime.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) {
+      return result.done ? result.value : iter.next();
+    });
+  };
+  function makeInvokeMethod(innerFn, self, context) {
+    var state = GenStateSuspendedStart;
+    return function invoke(method, arg) {
+      if (state === GenStateExecuting) {
+        throw new Error("Generator is already running");
+      }
+      if (state === GenStateCompleted) {
+        if (method === "throw") {
+          throw arg;
+        }
+        return doneResult();
+      }
+      context.method = method;
+      context.arg = arg;
+      while (true) {
+        var delegate = context.delegate;
+        if (delegate) {
+          var delegateResult = maybeInvokeDelegate(delegate, context);
+          if (delegateResult) {
+            if (delegateResult === ContinueSentinel) continue;
+            return delegateResult;
+          }
+        }
+        if (context.method === "next") {
+          context.sent = context._sent = context.arg;
+        } else if (context.method === "throw") {
+          if (state === GenStateSuspendedStart) {
+            state = GenStateCompleted;
+            throw context.arg;
+          }
+          context.dispatchException(context.arg);
+        } else if (context.method === "return") {
+          context.abrupt("return", context.arg);
+        }
+        state = GenStateExecuting;
+        var record = tryCatch(innerFn, self, context);
+        if (record.type === "normal") {
+          state = context.done ? GenStateCompleted : GenStateSuspendedYield;
+          if (record.arg === ContinueSentinel) {
+            continue;
+          }
+          return {
+            value: record.arg,
+            done: context.done
+          };
+        } else if (record.type === "throw") {
+          state = GenStateCompleted;
+          context.method = "throw";
+          context.arg = record.arg;
+        }
+      }
+    };
+  }
+  function maybeInvokeDelegate(delegate, context) {
+    var method = delegate.iterator[context.method];
+    if (method === undefined) {
+      context.delegate = null;
+      if (context.method === "throw") {
+        if (delegate.iterator.return) {
+          context.method = "return";
+          context.arg = undefined;
+          maybeInvokeDelegate(delegate, context);
+          if (context.method === "throw") {
+            return ContinueSentinel;
+          }
+        }
+        context.method = "throw";
+        context.arg = new TypeError("The iterator does not provide a 'throw' method");
+      }
+      return ContinueSentinel;
+    }
+    var record = tryCatch(method, delegate.iterator, context.arg);
+    if (record.type === "throw") {
+      context.method = "throw";
+      context.arg = record.arg;
+      context.delegate = null;
+      return ContinueSentinel;
+    }
+    var info = record.arg;
+    if (!info) {
+      context.method = "throw";
+      context.arg = new TypeError("iterator result is not an object");
+      context.delegate = null;
+      return ContinueSentinel;
+    }
+    if (info.done) {
+      context[delegate.resultName] = info.value;
+      context.next = delegate.nextLoc;
+      if (context.method !== "return") {
+        context.method = "next";
+        context.arg = undefined;
+      }
+    } else {
+      return info;
+    }
+    context.delegate = null;
+    return ContinueSentinel;
+  }
+  defineIteratorMethods(Gp);
+  Gp[toStringTagSymbol] = "Generator";
+  Gp[iteratorSymbol] = function () {
+    return this;
+  };
+  Gp.toString = function () {
+    return "[object Generator]";
+  };
+  function pushTryEntry(locs) {
+    var entry = { tryLoc: locs[0] };
+    if (1 in locs) {
+      entry.catchLoc = locs[1];
+    }
+    if (2 in locs) {
+      entry.finallyLoc = locs[2];
+      entry.afterLoc = locs[3];
+    }
+    this.tryEntries.push(entry);
+  }
+  function resetTryEntry(entry) {
+    var record = entry.completion || {};
+    record.type = "normal";
+    delete record.arg;
+    entry.completion = record;
+  }
+  function Context(tryLocsList) {
+    this.tryEntries = [{ tryLoc: "root" }];
+    tryLocsList.forEach(pushTryEntry, this);
+    this.reset(true);
+  }
+  runtime.keys = function (object) {
+    var keys = [];
+    for (var key in object) {
+      keys.push(key);
+    }
+    keys.reverse();
+    return function next() {
+      while (keys.length) {
+        var key = keys.pop();
+        if (key in object) {
+          next.value = key;
+          next.done = false;
+          return next;
+        }
+      }
+      next.done = true;
+      return next;
+    };
+  };
+  function values(iterable) {
+    if (iterable) {
+      var iteratorMethod = iterable[iteratorSymbol];
+      if (iteratorMethod) {
+        return iteratorMethod.call(iterable);
+      }
+      if (typeof iterable.next === "function") {
+        return iterable;
+      }
+      if (!isNaN(iterable.length)) {
+        var i = -1,
+            next = function next() {
+          while (++i < iterable.length) {
+            if (hasOwn.call(iterable, i)) {
+              next.value = iterable[i];
+              next.done = false;
+              return next;
+            }
+          }
+          next.value = undefined;
+          next.done = true;
+          return next;
+        };
+        return next.next = next;
+      }
+    }
+    return { next: doneResult };
+  }
+  runtime.values = values;
+  function doneResult() {
+    return {
+      value: undefined,
+      done: true
+    };
+  }
+  Context.prototype = {
+    constructor: Context,
+    reset: function reset(skipTempReset) {
+      this.prev = 0;
+      this.next = 0;
+      this.sent = this._sent = undefined;
+      this.done = false;
+      this.delegate = null;
+      this.method = "next";
+      this.arg = undefined;
+      this.tryEntries.forEach(resetTryEntry);
+      if (!skipTempReset) {
+        for (var name in this) {
+          if (name.charAt(0) === "t" && hasOwn.call(this, name) && !isNaN(+name.slice(1))) {
+            this[name] = undefined;
+          }
+        }
+      }
+    },
+    stop: function stop() {
+      this.done = true;
+      var rootEntry = this.tryEntries[0];
+      var rootRecord = rootEntry.completion;
+      if (rootRecord.type === "throw") {
+        throw rootRecord.arg;
+      }
+      return this.rval;
+    },
+    dispatchException: function dispatchException(exception) {
+      if (this.done) {
+        throw exception;
+      }
+      var context = this;
+      function handle(loc, caught) {
+        record.type = "throw";
+        record.arg = exception;
+        context.next = loc;
+        if (caught) {
+          context.method = "next";
+          context.arg = undefined;
+        }
+        return !!caught;
+      }
+      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
+        var entry = this.tryEntries[i];
+        var record = entry.completion;
+        if (entry.tryLoc === "root") {
+          return handle("end");
+        }
+        if (entry.tryLoc <= this.prev) {
+          var hasCatch = hasOwn.call(entry, "catchLoc");
+          var hasFinally = hasOwn.call(entry, "finallyLoc");
+          if (hasCatch && hasFinally) {
+            if (this.prev < entry.catchLoc) {
+              return handle(entry.catchLoc, true);
+            } else if (this.prev < entry.finallyLoc) {
+              return handle(entry.finallyLoc);
+            }
+          } else if (hasCatch) {
+            if (this.prev < entry.catchLoc) {
+              return handle(entry.catchLoc, true);
+            }
+          } else if (hasFinally) {
+            if (this.prev < entry.finallyLoc) {
+              return handle(entry.finallyLoc);
+            }
+          } else {
+            throw new Error("try statement without catch or finally");
+          }
+        }
+      }
+    },
+    abrupt: function abrupt(type, arg) {
+      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
+        var entry = this.tryEntries[i];
+        if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) {
+          var finallyEntry = entry;
+          break;
+        }
+      }
+      if (finallyEntry && (type === "break" || type === "continue") && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc) {
+        finallyEntry = null;
+      }
+      var record = finallyEntry ? finallyEntry.completion : {};
+      record.type = type;
+      record.arg = arg;
+      if (finallyEntry) {
+        this.method = "next";
+        this.next = finallyEntry.finallyLoc;
+        return ContinueSentinel;
+      }
+      return this.complete(record);
+    },
+    complete: function complete(record, afterLoc) {
+      if (record.type === "throw") {
+        throw record.arg;
+      }
+      if (record.type === "break" || record.type === "continue") {
+        this.next = record.arg;
+      } else if (record.type === "return") {
+        this.rval = this.arg = record.arg;
+        this.method = "return";
+        this.next = "end";
+      } else if (record.type === "normal" && afterLoc) {
+        this.next = afterLoc;
+      }
+      return ContinueSentinel;
+    },
+    finish: function finish(finallyLoc) {
+      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
+        var entry = this.tryEntries[i];
+        if (entry.finallyLoc === finallyLoc) {
+          this.complete(entry.completion, entry.afterLoc);
+          resetTryEntry(entry);
+          return ContinueSentinel;
+        }
+      }
+    },
+    "catch": function _catch(tryLoc) {
+      for (var i = this.tryEntries.length - 1; i >= 0; --i) {
+        var entry = this.tryEntries[i];
+        if (entry.tryLoc === tryLoc) {
+          var record = entry.completion;
+          if (record.type === "throw") {
+            var thrown = record.arg;
+            resetTryEntry(entry);
+          }
+          return thrown;
+        }
+      }
+      throw new Error("illegal catch attempt");
+    },
+    delegateYield: function delegateYield(iterable, resultName, nextLoc) {
+      this.delegate = {
+        iterator: values(iterable),
+        resultName: resultName,
+        nextLoc: nextLoc
+      };
+      if (this.method === "next") {
+        this.arg = undefined;
+      }
+      return ContinueSentinel;
+    }
+  };
+}(function () {
+  return this;
+}() || Function("return this")());
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(5)(module)))
+
+/***/ }),
+/* 5 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+module.exports = function (module) {
+  if (!module.webpackPolyfill) {
+    module.deprecate = function () {};
+    module.paths = [];
+    if (!module.children) module.children = [];
+    Object.defineProperty(module, "loaded", {
+      enumerable: true,
+      get: function get() {
+        return module.l;
+      }
+    });
+    Object.defineProperty(module, "id", {
+      enumerable: true,
+      get: function get() {
+        return module.i;
+      }
+    });
+    module.webpackPolyfill = 1;
+  }
+  return module;
+};
+
+/***/ }),
+/* 6 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.moveToEndOfArray = exports.waitOnEventOrTimeout = exports.WaitOnType = exports.animationStarted = exports.normalizeWheelEventDelta = exports.binarySearchFirstItem = exports.watchScroll = exports.scrollIntoView = exports.getOutputScale = exports.approximateFraction = exports.getPageSizeInches = exports.roundToDivide = exports.getVisibleElements = exports.backtrackBeforeAllVisibleElements = exports.parseQueryString = exports.noContextMenuHandler = exports.getPDFFileNameFromURL = exports.ProgressBar = exports.EventBus = exports.NullL10n = exports.TextLayerMode = exports.RendererType = exports.PresentationModeState = exports.isPortraitOrientation = exports.isValidRotation = exports.VERTICAL_PADDING = exports.SCROLLBAR_PADDING = exports.MAX_AUTO_SCALE = exports.UNKNOWN_SCALE = exports.MAX_SCALE = exports.MIN_SCALE = exports.DEFAULT_SCALE = exports.DEFAULT_SCALE_VALUE = exports.CSS_UNITS = undefined;
+
+var _regenerator = __webpack_require__(2);
+
+var _regenerator2 = _interopRequireDefault(_regenerator);
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
+
+var CSS_UNITS = 96.0 / 72.0;
+var DEFAULT_SCALE_VALUE = 'auto';
+var DEFAULT_SCALE = 1.0;
+var MIN_SCALE = 0.10;
+var MAX_SCALE = 10.0;
+var UNKNOWN_SCALE = 0;
+var MAX_AUTO_SCALE = 1.25;
+var SCROLLBAR_PADDING = 40;
+var VERTICAL_PADDING = 5;
+var PresentationModeState = {
+  UNKNOWN: 0,
+  NORMAL: 1,
+  CHANGING: 2,
+  FULLSCREEN: 3
+};
+var RendererType = {
+  CANVAS: 'canvas',
+  SVG: 'svg'
+};
+var TextLayerMode = {
+  DISABLE: 0,
+  ENABLE: 1,
+  ENABLE_ENHANCE: 2
+};
+function formatL10nValue(text, args) {
+  if (!args) {
+    return text;
+  }
+  return text.replace(/\{\{\s*(\w+)\s*\}\}/g, function (all, name) {
+    return name in args ? args[name] : '{{' + name + '}}';
+  });
+}
+var NullL10n = {
+  getLanguage: function () {
+    var _ref = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee() {
+      return _regenerator2.default.wrap(function _callee$(_context) {
+        while (1) {
+          switch (_context.prev = _context.next) {
+            case 0:
+              return _context.abrupt('return', 'en-us');
+
+            case 1:
+            case 'end':
+              return _context.stop();
+          }
+        }
+      }, _callee, this);
+    }));
+
+    function getLanguage() {
+      return _ref.apply(this, arguments);
+    }
+
+    return getLanguage;
+  }(),
+  getDirection: function () {
+    var _ref2 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee2() {
+      return _regenerator2.default.wrap(function _callee2$(_context2) {
+        while (1) {
+          switch (_context2.prev = _context2.next) {
+            case 0:
+              return _context2.abrupt('return', 'ltr');
+
+            case 1:
+            case 'end':
+              return _context2.stop();
+          }
+        }
+      }, _callee2, this);
+    }));
+
+    function getDirection() {
+      return _ref2.apply(this, arguments);
+    }
+
+    return getDirection;
+  }(),
+  get: function () {
+    var _ref3 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee3(property, args, fallback) {
+      return _regenerator2.default.wrap(function _callee3$(_context3) {
+        while (1) {
+          switch (_context3.prev = _context3.next) {
+            case 0:
+              return _context3.abrupt('return', formatL10nValue(fallback, args));
+
+            case 1:
+            case 'end':
+              return _context3.stop();
+          }
+        }
+      }, _callee3, this);
+    }));
+
+    function get(_x, _x2, _x3) {
+      return _ref3.apply(this, arguments);
+    }
+
+    return get;
+  }(),
+  translate: function () {
+    var _ref4 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee4(element) {
+      return _regenerator2.default.wrap(function _callee4$(_context4) {
+        while (1) {
+          switch (_context4.prev = _context4.next) {
+            case 0:
+            case 'end':
+              return _context4.stop();
+          }
+        }
+      }, _callee4, this);
+    }));
+
+    function translate(_x4) {
+      return _ref4.apply(this, arguments);
+    }
+
+    return translate;
+  }()
+};
+function getOutputScale(ctx) {
+  var devicePixelRatio = window.devicePixelRatio || 1;
+  var backingStoreRatio = ctx.webkitBackingStorePixelRatio || ctx.mozBackingStorePixelRatio || ctx.msBackingStorePixelRatio || ctx.oBackingStorePixelRatio || ctx.backingStorePixelRatio || 1;
+  var pixelRatio = devicePixelRatio / backingStoreRatio;
+  return {
+    sx: pixelRatio,
+    sy: pixelRatio,
+    scaled: pixelRatio !== 1
+  };
+}
+function scrollIntoView(element, spot) {
+  var skipOverflowHiddenElements = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
+
+  var parent = element.offsetParent;
+  if (!parent) {
+    console.error('offsetParent is not set -- cannot scroll');
+    return;
+  }
+  var offsetY = element.offsetTop + element.clientTop;
+  var offsetX = element.offsetLeft + element.clientLeft;
+  while (parent.clientHeight === parent.scrollHeight && parent.clientWidth === parent.scrollWidth || skipOverflowHiddenElements && getComputedStyle(parent).overflow === 'hidden') {
+    if (parent.dataset._scaleY) {
+      offsetY /= parent.dataset._scaleY;
+      offsetX /= parent.dataset._scaleX;
+    }
+    offsetY += parent.offsetTop;
+    offsetX += parent.offsetLeft;
+    parent = parent.offsetParent;
+    if (!parent) {
+      return;
+    }
+  }
+  if (spot) {
+    if (spot.top !== undefined) {
+      offsetY += spot.top;
+    }
+    if (spot.left !== undefined) {
+      offsetX += spot.left;
+      parent.scrollLeft = offsetX;
+    }
+  }
+  parent.scrollTop = offsetY;
+}
+function watchScroll(viewAreaElement, callback) {
+  var debounceScroll = function debounceScroll(evt) {
+    if (rAF) {
+      return;
+    }
+    rAF = window.requestAnimationFrame(function viewAreaElementScrolled() {
+      rAF = null;
+      var currentX = viewAreaElement.scrollLeft;
+      var lastX = state.lastX;
+      if (currentX !== lastX) {
+        state.right = currentX > lastX;
+      }
+      state.lastX = currentX;
+      var currentY = viewAreaElement.scrollTop;
+      var lastY = state.lastY;
+      if (currentY !== lastY) {
+        state.down = currentY > lastY;
+      }
+      state.lastY = currentY;
+      callback(state);
+    });
+  };
+  var state = {
+    right: true,
+    down: true,
+    lastX: viewAreaElement.scrollLeft,
+    lastY: viewAreaElement.scrollTop,
+    _eventHandler: debounceScroll
+  };
+  var rAF = null;
+  viewAreaElement.addEventListener('scroll', debounceScroll, true);
+  return state;
+}
+function parseQueryString(query) {
+  var parts = query.split('&');
+  var params = Object.create(null);
+  for (var i = 0, ii = parts.length; i < ii; ++i) {
+    var param = parts[i].split('=');
+    var key = param[0].toLowerCase();
+    var value = param.length > 1 ? param[1] : null;
+    params[decodeURIComponent(key)] = decodeURIComponent(value);
+  }
+  return params;
+}
+function binarySearchFirstItem(items, condition) {
+  var minIndex = 0;
+  var maxIndex = items.length - 1;
+  if (items.length === 0 || !condition(items[maxIndex])) {
+    return items.length;
+  }
+  if (condition(items[minIndex])) {
+    return minIndex;
+  }
+  while (minIndex < maxIndex) {
+    var currentIndex = minIndex + maxIndex >> 1;
+    var currentItem = items[currentIndex];
+    if (condition(currentItem)) {
+      maxIndex = currentIndex;
+    } else {
+      minIndex = currentIndex + 1;
+    }
+  }
+  return minIndex;
+}
+function approximateFraction(x) {
+  if (Math.floor(x) === x) {
+    return [x, 1];
+  }
+  var xinv = 1 / x;
+  var limit = 8;
+  if (xinv > limit) {
+    return [1, limit];
+  } else if (Math.floor(xinv) === xinv) {
+    return [1, xinv];
+  }
+  var x_ = x > 1 ? xinv : x;
+  var a = 0,
+      b = 1,
+      c = 1,
+      d = 1;
+  while (true) {
+    var p = a + c,
+        q = b + d;
+    if (q > limit) {
+      break;
+    }
+    if (x_ <= p / q) {
+      c = p;
+      d = q;
+    } else {
+      a = p;
+      b = q;
+    }
+  }
+  var result = void 0;
+  if (x_ - a / b < c / d - x_) {
+    result = x_ === x ? [a, b] : [b, a];
+  } else {
+    result = x_ === x ? [c, d] : [d, c];
+  }
+  return result;
+}
+function roundToDivide(x, div) {
+  var r = x % div;
+  return r === 0 ? x : Math.round(x - r + div);
+}
+function getPageSizeInches(_ref5) {
+  var view = _ref5.view,
+      userUnit = _ref5.userUnit,
+      rotate = _ref5.rotate;
+
+  var _view = _slicedToArray(view, 4),
+      x1 = _view[0],
+      y1 = _view[1],
+      x2 = _view[2],
+      y2 = _view[3];
+
+  var changeOrientation = rotate % 180 !== 0;
+  var width = (x2 - x1) / 72 * userUnit;
+  var height = (y2 - y1) / 72 * userUnit;
+  return {
+    width: changeOrientation ? height : width,
+    height: changeOrientation ? width : height
+  };
+}
+function backtrackBeforeAllVisibleElements(index, views, top) {
+  if (index < 2) {
+    return index;
+  }
+  var elt = views[index].div;
+  var pageTop = elt.offsetTop + elt.clientTop;
+  if (pageTop >= top) {
+    elt = views[index - 1].div;
+    pageTop = elt.offsetTop + elt.clientTop;
+  }
+  for (var i = index - 2; i >= 0; --i) {
+    elt = views[i].div;
+    if (elt.offsetTop + elt.clientTop + elt.clientHeight <= pageTop) {
+      break;
+    }
+    index = i;
+  }
+  return index;
+}
+function getVisibleElements(scrollEl, views) {
+  var sortByVisibility = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
+  var horizontal = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
+
+  var top = scrollEl.scrollTop,
+      bottom = top + scrollEl.clientHeight;
+  var left = scrollEl.scrollLeft,
+      right = left + scrollEl.clientWidth;
+  function isElementBottomAfterViewTop(view) {
+    var element = view.div;
+    var elementBottom = element.offsetTop + element.clientTop + element.clientHeight;
+    return elementBottom > top;
+  }
+  function isElementRightAfterViewLeft(view) {
+    var element = view.div;
+    var elementRight = element.offsetLeft + element.clientLeft + element.clientWidth;
+    return elementRight > left;
+  }
+  var visible = [],
+      view = void 0,
+      element = void 0;
+  var currentHeight = void 0,
+      viewHeight = void 0,
+      viewBottom = void 0,
+      hiddenHeight = void 0;
+  var currentWidth = void 0,
+      viewWidth = void 0,
+      viewRight = void 0,
+      hiddenWidth = void 0;
+  var percentVisible = void 0;
+  var firstVisibleElementInd = views.length === 0 ? 0 : binarySearchFirstItem(views, horizontal ? isElementRightAfterViewLeft : isElementBottomAfterViewTop);
+  if (views.length > 0 && !horizontal) {
+    firstVisibleElementInd = backtrackBeforeAllVisibleElements(firstVisibleElementInd, views, top);
+  }
+  var lastEdge = horizontal ? right : -1;
+  for (var i = firstVisibleElementInd, ii = views.length; i < ii; i++) {
+    view = views[i];
+    element = view.div;
+    currentWidth = element.offsetLeft + element.clientLeft;
+    currentHeight = element.offsetTop + element.clientTop;
+    viewWidth = element.clientWidth;
+    viewHeight = element.clientHeight;
+    viewRight = currentWidth + viewWidth;
+    viewBottom = currentHeight + viewHeight;
+    if (lastEdge === -1) {
+      if (viewBottom >= bottom) {
+        lastEdge = viewBottom;
+      }
+    } else if ((horizontal ? currentWidth : currentHeight) > lastEdge) {
+      break;
+    }
+    if (viewBottom <= top || currentHeight >= bottom || viewRight <= left || currentWidth >= right) {
+      continue;
+    }
+    hiddenHeight = Math.max(0, top - currentHeight) + Math.max(0, viewBottom - bottom);
+    hiddenWidth = Math.max(0, left - currentWidth) + Math.max(0, viewRight - right);
+    percentVisible = (viewHeight - hiddenHeight) * (viewWidth - hiddenWidth) * 100 / viewHeight / viewWidth | 0;
+    visible.push({
+      id: view.id,
+      x: currentWidth,
+      y: currentHeight,
+      view: view,
+      percent: percentVisible
+    });
+  }
+  var first = visible[0];
+  var last = visible[visible.length - 1];
+  if (sortByVisibility) {
+    visible.sort(function (a, b) {
+      var pc = a.percent - b.percent;
+      if (Math.abs(pc) > 0.001) {
+        return -pc;
+      }
+      return a.id - b.id;
+    });
+  }
+  return {
+    first: first,
+    last: last,
+    views: visible
+  };
+}
+function noContextMenuHandler(evt) {
+  evt.preventDefault();
+}
+function isDataSchema(url) {
+  var i = 0,
+      ii = url.length;
+  while (i < ii && url[i].trim() === '') {
+    i++;
+  }
+  return url.substring(i, i + 5).toLowerCase() === 'data:';
+}
+function getPDFFileNameFromURL(url) {
+  var defaultFilename = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'document.pdf';
+
+  if (typeof url !== 'string') {
+    return defaultFilename;
+  }
+  if (isDataSchema(url)) {
+    console.warn('getPDFFileNameFromURL: ' + 'ignoring "data:" URL for performance reasons.');
+    return defaultFilename;
+  }
+  var reURI = /^(?:(?:[^:]+:)?\/\/[^\/]+)?([^?#]*)(\?[^#]*)?(#.*)?$/;
+  var reFilename = /[^\/?#=]+\.pdf\b(?!.*\.pdf\b)/i;
+  var splitURI = reURI.exec(url);
+  var suggestedFilename = reFilename.exec(splitURI[1]) || reFilename.exec(splitURI[2]) || reFilename.exec(splitURI[3]);
+  if (suggestedFilename) {
+    suggestedFilename = suggestedFilename[0];
+    if (suggestedFilename.includes('%')) {
+      try {
+        suggestedFilename = reFilename.exec(decodeURIComponent(suggestedFilename))[0];
+      } catch (ex) {}
+    }
+  }
+  return suggestedFilename || defaultFilename;
+}
+function normalizeWheelEventDelta(evt) {
+  var delta = Math.sqrt(evt.deltaX * evt.deltaX + evt.deltaY * evt.deltaY);
+  var angle = Math.atan2(evt.deltaY, evt.deltaX);
+  if (-0.25 * Math.PI < angle && angle < 0.75 * Math.PI) {
+    delta = -delta;
+  }
+  var MOUSE_DOM_DELTA_PIXEL_MODE = 0;
+  var MOUSE_DOM_DELTA_LINE_MODE = 1;
+  var MOUSE_PIXELS_PER_LINE = 30;
+  var MOUSE_LINES_PER_PAGE = 30;
+  if (evt.deltaMode === MOUSE_DOM_DELTA_PIXEL_MODE) {
+    delta /= MOUSE_PIXELS_PER_LINE * MOUSE_LINES_PER_PAGE;
+  } else if (evt.deltaMode === MOUSE_DOM_DELTA_LINE_MODE) {
+    delta /= MOUSE_LINES_PER_PAGE;
+  }
+  return delta;
+}
+function isValidRotation(angle) {
+  return Number.isInteger(angle) && angle % 90 === 0;
+}
+function isPortraitOrientation(size) {
+  return size.width <= size.height;
+}
+var WaitOnType = {
+  EVENT: 'event',
+  TIMEOUT: 'timeout'
+};
+function waitOnEventOrTimeout(_ref6) {
+  var target = _ref6.target,
+      name = _ref6.name,
+      _ref6$delay = _ref6.delay,
+      delay = _ref6$delay === undefined ? 0 : _ref6$delay;
+
+  return new Promise(function (resolve, reject) {
+    if ((typeof target === 'undefined' ? 'undefined' : _typeof(target)) !== 'object' || !(name && typeof name === 'string') || !(Number.isInteger(delay) && delay >= 0)) {
+      throw new Error('waitOnEventOrTimeout - invalid parameters.');
+    }
+    function handler(type) {
+      if (target instanceof EventBus) {
+        target.off(name, eventHandler);
+      } else {
+        target.removeEventListener(name, eventHandler);
+      }
+      if (timeout) {
+        clearTimeout(timeout);
+      }
+      resolve(type);
+    }
+    var eventHandler = handler.bind(null, WaitOnType.EVENT);
+    if (target instanceof EventBus) {
+      target.on(name, eventHandler);
+    } else {
+      target.addEventListener(name, eventHandler);
+    }
+    var timeoutHandler = handler.bind(null, WaitOnType.TIMEOUT);
+    var timeout = setTimeout(timeoutHandler, delay);
+  });
+}
+var animationStarted = new Promise(function (resolve) {
+  window.requestAnimationFrame(resolve);
+});
+
+var EventBus = function () {
+  function EventBus() {
+    var _ref7 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
+        _ref7$dispatchToDOM = _ref7.dispatchToDOM,
+        dispatchToDOM = _ref7$dispatchToDOM === undefined ? false : _ref7$dispatchToDOM;
+
+    _classCallCheck(this, EventBus);
+
+    this._listeners = Object.create(null);
+    this._dispatchToDOM = dispatchToDOM === true;
+  }
+
+  _createClass(EventBus, [{
+    key: 'on',
+    value: function on(eventName, listener) {
+      var eventListeners = this._listeners[eventName];
+      if (!eventListeners) {
+        eventListeners = [];
+        this._listeners[eventName] = eventListeners;
+      }
+      eventListeners.push(listener);
+    }
+  }, {
+    key: 'off',
+    value: function off(eventName, listener) {
+      var eventListeners = this._listeners[eventName];
+      var i = void 0;
+      if (!eventListeners || (i = eventListeners.indexOf(listener)) < 0) {
+        return;
+      }
+      eventListeners.splice(i, 1);
+    }
+  }, {
+    key: 'dispatch',
+    value: function dispatch(eventName) {
+      var eventListeners = this._listeners[eventName];
+      if (!eventListeners || eventListeners.length === 0) {
+        if (this._dispatchToDOM) {
+          var _args5 = Array.prototype.slice.call(arguments, 1);
+          this._dispatchDOMEvent(eventName, _args5);
+        }
+        return;
+      }
+      var args = Array.prototype.slice.call(arguments, 1);
+      eventListeners.slice(0).forEach(function (listener) {
+        listener.apply(null, args);
+      });
+      if (this._dispatchToDOM) {
+        this._dispatchDOMEvent(eventName, args);
+      }
+    }
+  }, {
+    key: '_dispatchDOMEvent',
+    value: function _dispatchDOMEvent(eventName) {
+      var args = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
+
+      if (!this._dispatchToDOM) {
+        return;
+      }
+      var details = Object.create(null);
+      if (args && args.length > 0) {
+        var obj = args[0];
+        for (var key in obj) {
+          var value = obj[key];
+          if (key === 'source') {
+            if (value === window || value === document) {
+              return;
+            }
+            continue;
+          }
+          details[key] = value;
+        }
+      }
+      var event = document.createEvent('CustomEvent');
+      event.initCustomEvent(eventName, true, true, details);
+      document.dispatchEvent(event);
+    }
+  }]);
+
+  return EventBus;
+}();
+
+function clamp(v, min, max) {
+  return Math.min(Math.max(v, min), max);
+}
+
+var ProgressBar = function () {
+  function ProgressBar(id) {
+    var _ref8 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
+        height = _ref8.height,
+        width = _ref8.width,
+        units = _ref8.units;
+
+    _classCallCheck(this, ProgressBar);
+
+    this.visible = true;
+    this.div = document.querySelector(id + ' .progress');
+    this.bar = this.div.parentNode;
+    this.height = height || 100;
+    this.width = width || 100;
+    this.units = units || '%';
+    this.div.style.height = this.height + this.units;
+    this.percent = 0;
+  }
+
+  _createClass(ProgressBar, [{
+    key: '_updateBar',
+    value: function _updateBar() {
+      if (this._indeterminate) {
+        this.div.classList.add('indeterminate');
+        this.div.style.width = this.width + this.units;
+        return;
+      }
+      this.div.classList.remove('indeterminate');
+      var progressSize = this.width * this._percent / 100;
+      this.div.style.width = progressSize + this.units;
+    }
+  }, {
+    key: 'setWidth',
+    value: function setWidth(viewer) {
+      if (!viewer) {
+        return;
+      }
+      var container = viewer.parentNode;
+      var scrollbarWidth = container.offsetWidth - viewer.offsetWidth;
+      if (scrollbarWidth > 0) {
+        this.bar.setAttribute('style', 'width: calc(100% - ' + scrollbarWidth + 'px);');
+      }
+    }
+  }, {
+    key: 'hide',
+    value: function hide() {
+      if (!this.visible) {
+        return;
+      }
+      this.visible = false;
+      this.bar.classList.add('hidden');
+      document.body.classList.remove('loadingInProgress');
+    }
+  }, {
+    key: 'show',
+    value: function show() {
+      if (this.visible) {
+        return;
+      }
+      this.visible = true;
+      document.body.classList.add('loadingInProgress');
+      this.bar.classList.remove('hidden');
+    }
+  }, {
+    key: 'percent',
+    get: function get() {
+      return this._percent;
+    },
+    set: function set(val) {
+      this._indeterminate = isNaN(val);
+      this._percent = clamp(val, 0, 100);
+      this._updateBar();
+    }
+  }]);
+
+  return ProgressBar;
+}();
+
+function moveToEndOfArray(arr, condition) {
+  var moved = [],
+      len = arr.length;
+  var write = 0;
+  for (var read = 0; read < len; ++read) {
+    if (condition(arr[read])) {
+      moved.push(arr[read]);
+    } else {
+      arr[write] = arr[read];
+      ++write;
+    }
+  }
+  for (var _read = 0; write < len; ++_read, ++write) {
+    arr[write] = moved[_read];
+  }
+}
+exports.CSS_UNITS = CSS_UNITS;
+exports.DEFAULT_SCALE_VALUE = DEFAULT_SCALE_VALUE;
+exports.DEFAULT_SCALE = DEFAULT_SCALE;
+exports.MIN_SCALE = MIN_SCALE;
+exports.MAX_SCALE = MAX_SCALE;
+exports.UNKNOWN_SCALE = UNKNOWN_SCALE;
+exports.MAX_AUTO_SCALE = MAX_AUTO_SCALE;
+exports.SCROLLBAR_PADDING = SCROLLBAR_PADDING;
+exports.VERTICAL_PADDING = VERTICAL_PADDING;
+exports.isValidRotation = isValidRotation;
+exports.isPortraitOrientation = isPortraitOrientation;
+exports.PresentationModeState = PresentationModeState;
+exports.RendererType = RendererType;
+exports.TextLayerMode = TextLayerMode;
+exports.NullL10n = NullL10n;
+exports.EventBus = EventBus;
+exports.ProgressBar = ProgressBar;
+exports.getPDFFileNameFromURL = getPDFFileNameFromURL;
+exports.noContextMenuHandler = noContextMenuHandler;
+exports.parseQueryString = parseQueryString;
+exports.backtrackBeforeAllVisibleElements = backtrackBeforeAllVisibleElements;
+exports.getVisibleElements = getVisibleElements;
+exports.roundToDivide = roundToDivide;
+exports.getPageSizeInches = getPageSizeInches;
+exports.approximateFraction = approximateFraction;
+exports.getOutputScale = getOutputScale;
+exports.scrollIntoView = scrollIntoView;
+exports.watchScroll = watchScroll;
+exports.binarySearchFirstItem = binarySearchFirstItem;
+exports.normalizeWheelEventDelta = normalizeWheelEventDelta;
+exports.animationStarted = animationStarted;
+exports.WaitOnType = WaitOnType;
+exports.waitOnEventOrTimeout = waitOnEventOrTimeout;
+exports.moveToEndOfArray = moveToEndOfArray;
+
+/***/ }),
+/* 7 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var pdfjsLib = void 0;
+if (typeof window !== 'undefined' && window['pdfjs-dist/build/pdf']) {
+  pdfjsLib = window['pdfjs-dist/build/pdf'];
+} else {
+  pdfjsLib = require('../build/pdf.js');
+}
+module.exports = pdfjsLib;
+
+/***/ }),
+/* 8 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.PDFCursorTools = exports.CursorTool = undefined;
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _grab_to_pan = __webpack_require__(9);
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var CursorTool = {
+  SELECT: 0,
+  HAND: 1,
+  ZOOM: 2
+};
+
+var PDFCursorTools = function () {
+  function PDFCursorTools(_ref) {
+    var _this = this;
+
+    var container = _ref.container,
+        eventBus = _ref.eventBus,
+        _ref$cursorToolOnLoad = _ref.cursorToolOnLoad,
+        cursorToolOnLoad = _ref$cursorToolOnLoad === undefined ? CursorTool.SELECT : _ref$cursorToolOnLoad;
+
+    _classCallCheck(this, PDFCursorTools);
+
+    this.container = container;
+    this.eventBus = eventBus;
+    this.active = CursorTool.SELECT;
+    this.activeBeforePresentationMode = null;
+    this.handTool = new _grab_to_pan.GrabToPan({ element: this.container });
+    this._addEventListeners();
+    Promise.resolve().then(function () {
+      _this.switchTool(cursorToolOnLoad);
+    });
+  }
+
+  _createClass(PDFCursorTools, [{
+    key: 'switchTool',
+    value: function switchTool(tool) {
+      var _this2 = this;
+
+      if (this.activeBeforePresentationMode !== null) {
+        return;
+      }
+      if (tool === this.active) {
+        return;
+      }
+      var disableActiveTool = function disableActiveTool() {
+        switch (_this2.active) {
+          case CursorTool.SELECT:
+            break;
+          case CursorTool.HAND:
+            _this2.handTool.deactivate();
+            break;
+          case CursorTool.ZOOM:
+        }
+      };
+      switch (tool) {
+        case CursorTool.SELECT:
+          disableActiveTool();
+          break;
+        case CursorTool.HAND:
+          disableActiveTool();
+          this.handTool.activate();
+          break;
+        case CursorTool.ZOOM:
+        default:
+          console.error('switchTool: "' + tool + '" is an unsupported value.');
+          return;
+      }
+      this.active = tool;
+      this._dispatchEvent();
+    }
+  }, {
+    key: '_dispatchEvent',
+    value: function _dispatchEvent() {
+      this.eventBus.dispatch('cursortoolchanged', {
+        source: this,
+        tool: this.active
+      });
+    }
+  }, {
+    key: '_addEventListeners',
+    value: function _addEventListeners() {
+      var _this3 = this;
+
+      this.eventBus.on('switchcursortool', function (evt) {
+        _this3.switchTool(evt.tool);
+      });
+      this.eventBus.on('presentationmodechanged', function (evt) {
+        if (evt.switchInProgress) {
+          return;
+        }
+        var previouslyActive = void 0;
+        if (evt.active) {
+          previouslyActive = _this3.active;
+          _this3.switchTool(CursorTool.SELECT);
+          _this3.activeBeforePresentationMode = previouslyActive;
+        } else {
+          previouslyActive = _this3.activeBeforePresentationMode;
+          _this3.activeBeforePresentationMode = null;
+          _this3.switchTool(previouslyActive);
+        }
+      });
+    }
+  }, {
+    key: 'activeTool',
+    get: function get() {
+      return this.active;
+    }
+  }]);
+
+  return PDFCursorTools;
+}();
+
+exports.CursorTool = CursorTool;
+exports.PDFCursorTools = PDFCursorTools;
+
+/***/ }),
+/* 9 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+function GrabToPan(options) {
+  this.element = options.element;
+  this.document = options.element.ownerDocument;
+  if (typeof options.ignoreTarget === 'function') {
+    this.ignoreTarget = options.ignoreTarget;
+  }
+  this.onActiveChanged = options.onActiveChanged;
+  this.activate = this.activate.bind(this);
+  this.deactivate = this.deactivate.bind(this);
+  this.toggle = this.toggle.bind(this);
+  this._onmousedown = this._onmousedown.bind(this);
+  this._onmousemove = this._onmousemove.bind(this);
+  this._endPan = this._endPan.bind(this);
+  var overlay = this.overlay = document.createElement('div');
+  overlay.className = 'grab-to-pan-grabbing';
+}
+GrabToPan.prototype = {
+  CSS_CLASS_GRAB: 'grab-to-pan-grab',
+  activate: function GrabToPan_activate() {
+    if (!this.active) {
+      this.active = true;
+      this.element.addEventListener('mousedown', this._onmousedown, true);
+      this.element.classList.add(this.CSS_CLASS_GRAB);
+      if (this.onActiveChanged) {
+        this.onActiveChanged(true);
+      }
+    }
+  },
+  deactivate: function GrabToPan_deactivate() {
+    if (this.active) {
+      this.active = false;
+      this.element.removeEventListener('mousedown', this._onmousedown, true);
+      this._endPan();
+      this.element.classList.remove(this.CSS_CLASS_GRAB);
+      if (this.onActiveChanged) {
+        this.onActiveChanged(false);
+      }
+    }
+  },
+  toggle: function GrabToPan_toggle() {
+    if (this.active) {
+      this.deactivate();
+    } else {
+      this.activate();
+    }
+  },
+  ignoreTarget: function GrabToPan_ignoreTarget(node) {
+    return node[matchesSelector]('a[href], a[href] *, input, textarea, button, button *, select, option');
+  },
+  _onmousedown: function GrabToPan__onmousedown(event) {
+    if (event.button !== 0 || this.ignoreTarget(event.target)) {
+      return;
+    }
+    if (event.originalTarget) {
+      try {
+        event.originalTarget.tagName;
+      } catch (e) {
+        return;
+      }
+    }
+    this.scrollLeftStart = this.element.scrollLeft;
+    this.scrollTopStart = this.element.scrollTop;
+    this.clientXStart = event.clientX;
+    this.clientYStart = event.clientY;
+    this.document.addEventListener('mousemove', this._onmousemove, true);
+    this.document.addEventListener('mouseup', this._endPan, true);
+    this.element.addEventListener('scroll', this._endPan, true);
+    event.preventDefault();
+    event.stopPropagation();
+    var focusedElement = document.activeElement;
+    if (focusedElement && !focusedElement.contains(event.target)) {
+      focusedElement.blur();
+    }
+  },
+  _onmousemove: function GrabToPan__onmousemove(event) {
+    this.element.removeEventListener('scroll', this._endPan, true);
+    if (isLeftMouseReleased(event)) {
+      this._endPan();
+      return;
+    }
+    var xDiff = event.clientX - this.clientXStart;
+    var yDiff = event.clientY - this.clientYStart;
+    var scrollTop = this.scrollTopStart - yDiff;
+    var scrollLeft = this.scrollLeftStart - xDiff;
+    if (this.element.scrollTo) {
+      this.element.scrollTo({
+        top: scrollTop,
+        left: scrollLeft,
+        behavior: 'instant'
+      });
+    } else {
+      this.element.scrollTop = scrollTop;
+      this.element.scrollLeft = scrollLeft;
+    }
+    if (!this.overlay.parentNode) {
+      document.body.appendChild(this.overlay);
+    }
+  },
+  _endPan: function GrabToPan__endPan() {
+    this.element.removeEventListener('scroll', this._endPan, true);
+    this.document.removeEventListener('mousemove', this._onmousemove, true);
+    this.document.removeEventListener('mouseup', this._endPan, true);
+    this.overlay.remove();
+  }
+};
+var matchesSelector;
+['webkitM', 'mozM', 'msM', 'oM', 'm'].some(function (prefix) {
+  var name = prefix + 'atches';
+  if (name in document.documentElement) {
+    matchesSelector = name;
+  }
+  name += 'Selector';
+  if (name in document.documentElement) {
+    matchesSelector = name;
+  }
+  return matchesSelector;
+});
+var isNotIEorIsIE10plus = !document.documentMode || document.documentMode > 9;
+var chrome = window.chrome;
+var isChrome15OrOpera15plus = chrome && (chrome.webstore || chrome.app);
+var isSafari6plus = /Apple/.test(navigator.vendor) && /Version\/([6-9]\d*|[1-5]\d+)/.test(navigator.userAgent);
+function isLeftMouseReleased(event) {
+  if ('buttons' in event && isNotIEorIsIE10plus) {
+    return !(event.buttons & 1);
+  }
+  if (isChrome15OrOpera15plus || isSafari6plus) {
+    return event.which === 0;
+  }
+}
+exports.GrabToPan = GrabToPan;
+
+/***/ }),
+/* 10 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var CLEANUP_TIMEOUT = 30000;
+var RenderingStates = {
+  INITIAL: 0,
+  RUNNING: 1,
+  PAUSED: 2,
+  FINISHED: 3
+};
+
+var PDFRenderingQueue = function () {
+  function PDFRenderingQueue() {
+    _classCallCheck(this, PDFRenderingQueue);
+
+    this.pdfViewer = null;
+    this.pdfThumbnailViewer = null;
+    this.onIdle = null;
+    this.highestPriorityPage = null;
+    this.idleTimeout = null;
+    this.printing = false;
+    this.isThumbnailViewEnabled = false;
+  }
+
+  _createClass(PDFRenderingQueue, [{
+    key: "setViewer",
+    value: function setViewer(pdfViewer) {
+      this.pdfViewer = pdfViewer;
+    }
+  }, {
+    key: "setThumbnailViewer",
+    value: function setThumbnailViewer(pdfThumbnailViewer) {
+      this.pdfThumbnailViewer = pdfThumbnailViewer;
+    }
+  }, {
+    key: "isHighestPriority",
+    value: function isHighestPriority(view) {
+      return this.highestPriorityPage === view.renderingId;
+    }
+  }, {
+    key: "renderHighestPriority",
+    value: function renderHighestPriority(currentlyVisiblePages) {
+      if (this.idleTimeout) {
+        clearTimeout(this.idleTimeout);
+        this.idleTimeout = null;
+      }
+      if (this.pdfViewer.forceRendering(currentlyVisiblePages)) {
+        return;
+      }
+      if (this.pdfThumbnailViewer && this.isThumbnailViewEnabled) {
+        if (this.pdfThumbnailViewer.forceRendering()) {
+          return;
+        }
+      }
+      if (this.printing) {
+        return;
+      }
+      if (this.onIdle) {
+        this.idleTimeout = setTimeout(this.onIdle.bind(this), CLEANUP_TIMEOUT);
+      }
+    }
+  }, {
+    key: "getHighestPriority",
+    value: function getHighestPriority(visible, views, scrolledDown) {
+      var visibleViews = visible.views;
+      var numVisible = visibleViews.length;
+      if (numVisible === 0) {
+        return false;
+      }
+      for (var i = 0; i < numVisible; ++i) {
+        var view = visibleViews[i].view;
+        if (!this.isViewFinished(view)) {
+          return view;
+        }
+      }
+      if (scrolledDown) {
+        var nextPageIndex = visible.last.id;
+        if (views[nextPageIndex] && !this.isViewFinished(views[nextPageIndex])) {
+          return views[nextPageIndex];
+        }
+      } else {
+        var previousPageIndex = visible.first.id - 2;
+        if (views[previousPageIndex] && !this.isViewFinished(views[previousPageIndex])) {
+          return views[previousPageIndex];
+        }
+      }
+      return null;
+    }
+  }, {
+    key: "isViewFinished",
+    value: function isViewFinished(view) {
+      return view.renderingState === RenderingStates.FINISHED;
+    }
+  }, {
+    key: "renderView",
+    value: function renderView(view) {
+      var _this = this;
+
+      switch (view.renderingState) {
+        case RenderingStates.FINISHED:
+          return false;
+        case RenderingStates.PAUSED:
+          this.highestPriorityPage = view.renderingId;
+          view.resume();
+          break;
+        case RenderingStates.RUNNING:
+          this.highestPriorityPage = view.renderingId;
+          break;
+        case RenderingStates.INITIAL:
+          this.highestPriorityPage = view.renderingId;
+          var continueRendering = function continueRendering() {
+            _this.renderHighestPriority();
+          };
+          view.draw().then(continueRendering, continueRendering);
+          break;
+      }
+      return true;
+    }
+  }]);
+
+  return PDFRenderingQueue;
+}();
+
+exports.RenderingStates = RenderingStates;
+exports.PDFRenderingQueue = PDFRenderingQueue;
+
+/***/ }),
+/* 11 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.PDFSidebar = exports.SidebarView = undefined;
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _ui_utils = __webpack_require__(6);
+
+var _pdf_rendering_queue = __webpack_require__(10);
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var UI_NOTIFICATION_CLASS = 'pdfSidebarNotification';
+var SidebarView = {
+  NONE: 0,
+  THUMBS: 1,
+  OUTLINE: 2,
+  ATTACHMENTS: 3
+};
+
+var PDFSidebar = function () {
+  function PDFSidebar(options, eventBus) {
+    var l10n = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _ui_utils.NullL10n;
+
+    _classCallCheck(this, PDFSidebar);
+
+    this.isOpen = false;
+    this.active = SidebarView.THUMBS;
+    this.isInitialViewSet = false;
+    this.onToggled = null;
+    this.pdfViewer = options.pdfViewer;
+    this.pdfThumbnailViewer = options.pdfThumbnailViewer;
+    this.outerContainer = options.outerContainer;
+    this.viewerContainer = options.viewerContainer;
+    this.toggleButton = options.toggleButton;
+    this.thumbnailButton = options.thumbnailButton;
+    this.outlineButton = options.outlineButton;
+    this.attachmentsButton = options.attachmentsButton;
+    this.thumbnailView = options.thumbnailView;
+    this.outlineView = options.outlineView;
+    this.attachmentsView = options.attachmentsView;
+    this.disableNotification = options.disableNotification || false;
+    this.eventBus = eventBus;
+    this.l10n = l10n;
+    this._addEventListeners();
+  }
+
+  _createClass(PDFSidebar, [{
+    key: 'reset',
+    value: function reset() {
+      this.isInitialViewSet = false;
+      this._hideUINotification(null);
+      this.switchView(SidebarView.THUMBS);
+      this.outlineButton.disabled = false;
+      this.attachmentsButton.disabled = false;
+    }
+  }, {
+    key: 'setInitialView',
+    value: function setInitialView() {
+      var view = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : SidebarView.NONE;
+
+      if (this.isInitialViewSet) {
+        return;
+      }
+      this.isInitialViewSet = true;
+      if (this.isOpen && view === SidebarView.NONE) {
+        this._dispatchEvent();
+        return;
+      }
+      var isViewPreserved = view === this.visibleView;
+      this.switchView(view, true);
+      if (isViewPreserved) {
+        this._dispatchEvent();
+      }
+    }
+  }, {
+    key: 'switchView',
+    value: function switchView(view) {
+      var forceOpen = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+
+      if (view === SidebarView.NONE) {
+        this.close();
+        return;
+      }
+      var isViewChanged = view !== this.active;
+      var shouldForceRendering = false;
+      switch (view) {
+        case SidebarView.THUMBS:
+          this.thumbnailButton.classList.add('toggled');
+          this.outlineButton.classList.remove('toggled');
+          this.attachmentsButton.classList.remove('toggled');
+          this.thumbnailView.classList.remove('hidden');
+          this.outlineView.classList.add('hidden');
+          this.attachmentsView.classList.add('hidden');
+          if (this.isOpen && isViewChanged) {
+            this._updateThumbnailViewer();
+            shouldForceRendering = true;
+          }
+          break;
+        case SidebarView.OUTLINE:
+          if (this.outlineButton.disabled) {
+            return;
+          }
+          this.thumbnailButton.classList.remove('toggled');
+          this.outlineButton.classList.add('toggled');
+          this.attachmentsButton.classList.remove('toggled');
+          this.thumbnailView.classList.add('hidden');
+          this.outlineView.classList.remove('hidden');
+          this.attachmentsView.classList.add('hidden');
+          break;
+        case SidebarView.ATTACHMENTS:
+          if (this.attachmentsButton.disabled) {
+            return;
+          }
+          this.thumbnailButton.classList.remove('toggled');
+          this.outlineButton.classList.remove('toggled');
+          this.attachmentsButton.classList.add('toggled');
+          this.thumbnailView.classList.add('hidden');
+          this.outlineView.classList.add('hidden');
+          this.attachmentsView.classList.remove('hidden');
+          break;
+        default:
+          console.error('PDFSidebar_switchView: "' + view + '" is an unsupported value.');
+          return;
+      }
+      this.active = view | 0;
+      if (forceOpen && !this.isOpen) {
+        this.open();
+        return;
+      }
+      if (shouldForceRendering) {
+        this._forceRendering();
+      }
+      if (isViewChanged) {
+        this._dispatchEvent();
+      }
+      this._hideUINotification(this.active);
+    }
+  }, {
+    key: 'open',
+    value: function open() {
+      if (this.isOpen) {
+        return;
+      }
+      this.isOpen = true;
+      this.toggleButton.classList.add('toggled');
+      this.outerContainer.classList.add('sidebarMoving');
+      this.outerContainer.classList.add('sidebarOpen');
+      if (this.active === SidebarView.THUMBS) {
+        this._updateThumbnailViewer();
+      }
+      this._forceRendering();
+      this._dispatchEvent();
+      this._hideUINotification(this.active);
+    }
+  }, {
+    key: 'close',
+    value: function close() {
+      if (!this.isOpen) {
+        return;
+      }
+      this.isOpen = false;
+      this.toggleButton.classList.remove('toggled');
+      this.outerContainer.classList.add('sidebarMoving');
+      this.outerContainer.classList.remove('sidebarOpen');
+      this._forceRendering();
+      this._dispatchEvent();
+    }
+  }, {
+    key: 'toggle',
+    value: function toggle() {
+      if (this.isOpen) {
+        this.close();
+      } else {
+        this.open();
+      }
+    }
+  }, {
+    key: '_dispatchEvent',
+    value: function _dispatchEvent() {
+      this.eventBus.dispatch('sidebarviewchanged', {
+        source: this,
+        view: this.visibleView
+      });
+    }
+  }, {
+    key: '_forceRendering',
+    value: function _forceRendering() {
+      if (this.onToggled) {
+        this.onToggled();
+      } else {
+        this.pdfViewer.forceRendering();
+        this.pdfThumbnailViewer.forceRendering();
+      }
+    }
+  }, {
+    key: '_updateThumbnailViewer',
+    value: function _updateThumbnailViewer() {
+      var pdfViewer = this.pdfViewer,
+          pdfThumbnailViewer = this.pdfThumbnailViewer;
+
+      var pagesCount = pdfViewer.pagesCount;
+      for (var pageIndex = 0; pageIndex < pagesCount; pageIndex++) {
+        var pageView = pdfViewer.getPageView(pageIndex);
+        if (pageView && pageView.renderingState === _pdf_rendering_queue.RenderingStates.FINISHED) {
+          var thumbnailView = pdfThumbnailViewer.getThumbnail(pageIndex);
+          thumbnailView.setImage(pageView);
+        }
+      }
+      pdfThumbnailViewer.scrollThumbnailIntoView(pdfViewer.currentPageNumber);
+    }
+  }, {
+    key: '_showUINotification',
+    value: function _showUINotification(view) {
+      var _this = this;
+
+      if (this.disableNotification) {
+        return;
+      }
+      this.l10n.get('toggle_sidebar_notification.title', null, 'Toggle Sidebar (document contains outline/attachments)').then(function (msg) {
+        _this.toggleButton.title = msg;
+      });
+      if (!this.isOpen) {
+        this.toggleButton.classList.add(UI_NOTIFICATION_CLASS);
+      } else if (view === this.active) {
+        return;
+      }
+      switch (view) {
+        case SidebarView.OUTLINE:
+          this.outlineButton.classList.add(UI_NOTIFICATION_CLASS);
+          break;
+        case SidebarView.ATTACHMENTS:
+          this.attachmentsButton.classList.add(UI_NOTIFICATION_CLASS);
+          break;
+      }
+    }
+  }, {
+    key: '_hideUINotification',
+    value: function _hideUINotification(view) {
+      var _this2 = this;
+
+      if (this.disableNotification) {
+        return;
+      }
+      var removeNotification = function removeNotification(view) {
+        switch (view) {
+          case SidebarView.OUTLINE:
+            _this2.outlineButton.classList.remove(UI_NOTIFICATION_CLASS);
+            break;
+          case SidebarView.ATTACHMENTS:
+            _this2.attachmentsButton.classList.remove(UI_NOTIFICATION_CLASS);
+            break;
+        }
+      };
+      if (!this.isOpen && view !== null) {
+        return;
+      }
+      this.toggleButton.classList.remove(UI_NOTIFICATION_CLASS);
+      if (view !== null) {
+        removeNotification(view);
+        return;
+      }
+      for (view in SidebarView) {
+        removeNotification(SidebarView[view]);
+      }
+      this.l10n.get('toggle_sidebar.title', null, 'Toggle Sidebar').then(function (msg) {
+        _this2.toggleButton.title = msg;
+      });
+    }
+  }, {
+    key: '_addEventListeners',
+    value: function _addEventListeners() {
+      var _this3 = this;
+
+      this.viewerContainer.addEventListener('transitionend', function (evt) {
+        if (evt.target === _this3.viewerContainer) {
+          _this3.outerContainer.classList.remove('sidebarMoving');
+        }
+      });
+      this.thumbnailButton.addEventListener('click', function () {
+        _this3.switchView(SidebarView.THUMBS);
+      });
+      this.outlineButton.addEventListener('click', function () {
+        _this3.switchView(SidebarView.OUTLINE);
+      });
+      this.outlineButton.addEventListener('dblclick', function () {
+        _this3.eventBus.dispatch('toggleoutlinetree', { source: _this3 });
+      });
+      this.attachmentsButton.addEventListener('click', function () {
+        _this3.switchView(SidebarView.ATTACHMENTS);
+      });
+      this.eventBus.on('outlineloaded', function (evt) {
+        var outlineCount = evt.outlineCount;
+        _this3.outlineButton.disabled = !outlineCount;
+        if (outlineCount) {
+          _this3._showUINotification(SidebarView.OUTLINE);
+        } else if (_this3.active === SidebarView.OUTLINE) {
+          _this3.switchView(SidebarView.THUMBS);
+        }
+      });
+      this.eventBus.on('attachmentsloaded', function (evt) {
+        if (evt.attachmentsCount) {
+          _this3.attachmentsButton.disabled = false;
+          _this3._showUINotification(SidebarView.ATTACHMENTS);
+          return;
+        }
+        Promise.resolve().then(function () {
+          if (_this3.attachmentsView.hasChildNodes()) {
+            return;
+          }
+          _this3.attachmentsButton.disabled = true;
+          if (_this3.active === SidebarView.ATTACHMENTS) {
+            _this3.switchView(SidebarView.THUMBS);
+          }
+        });
+      });
+      this.eventBus.on('presentationmodechanged', function (evt) {
+        if (!evt.active && !evt.switchInProgress && _this3.isThumbnailViewVisible) {
+          _this3._updateThumbnailViewer();
+        }
+      });
+    }
+  }, {
+    key: 'visibleView',
+    get: function get() {
+      return this.isOpen ? this.active : SidebarView.NONE;
+    }
+  }, {
+    key: 'isThumbnailViewVisible',
+    get: function get() {
+      return this.isOpen && this.active === SidebarView.THUMBS;
+    }
+  }, {
+    key: 'isOutlineViewVisible',
+    get: function get() {
+      return this.isOpen && this.active === SidebarView.OUTLINE;
+    }
+  }, {
+    key: 'isAttachmentsViewVisible',
+    get: function get() {
+      return this.isOpen && this.active === SidebarView.ATTACHMENTS;
+    }
+  }]);
+
+  return PDFSidebar;
+}();
+
+exports.SidebarView = SidebarView;
+exports.PDFSidebar = PDFSidebar;
+
+/***/ }),
+/* 12 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.OptionKind = exports.AppOptions = undefined;
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _pdfjsLib = __webpack_require__(7);
+
+var _viewer_compatibility = __webpack_require__(13);
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var OptionKind = {
+  VIEWER: 'viewer',
+  API: 'api',
+  WORKER: 'worker'
+};
+var defaultOptions = {
+  cursorToolOnLoad: {
+    value: 0,
+    kind: OptionKind.VIEWER
+  },
+  defaultUrl: {
+    value: 'compressed.tracemonkey-pldi-09.pdf',
+    kind: OptionKind.VIEWER
+  },
+  defaultZoomValue: {
+    value: '',
+    kind: OptionKind.VIEWER
+  },
+  disableHistory: {
+    value: false,
+    kind: OptionKind.VIEWER
+  },
+  disablePageLabels: {
+    value: false,
+    kind: OptionKind.VIEWER
+  },
+  disablePageMode: {
+    value: false,
+    kind: OptionKind.VIEWER
+  },
+  enablePrintAutoRotate: {
+    value: false,
+    kind: OptionKind.VIEWER
+  },
+  enableWebGL: {
+    value: false,
+    kind: OptionKind.VIEWER
+  },
+  eventBusDispatchToDOM: {
+    value: false,
+    kind: OptionKind.VIEWER
+  },
+  externalLinkRel: {
+    value: 'noopener noreferrer nofollow',
+    kind: OptionKind.VIEWER
+  },
+  externalLinkTarget: {
+    value: 0,
+    kind: OptionKind.VIEWER
+  },
+  imageResourcesPath: {
+    value: './images/',
+    kind: OptionKind.VIEWER
+  },
+  maxCanvasPixels: {
+    value: _viewer_compatibility.viewerCompatibilityParams.maxCanvasPixels || 16777216,
+    kind: OptionKind.VIEWER
+  },
+  pdfBugEnabled: {
+    value: false,
+    kind: OptionKind.VIEWER
+  },
+  renderer: {
+    value: 'canvas',
+    kind: OptionKind.VIEWER
+  },
+  renderInteractiveForms: {
+    value: false,
+    kind: OptionKind.VIEWER
+  },
+  showPreviousViewOnLoad: {
+    value: true,
+    kind: OptionKind.VIEWER
+  },
+  sidebarViewOnLoad: {
+    value: 0,
+    kind: OptionKind.VIEWER
+  },
+  scrollModeOnLoad: {
+    value: 0,
+    kind: OptionKind.VIEWER
+  },
+  spreadModeOnLoad: {
+    value: 0,
+    kind: OptionKind.VIEWER
+  },
+  textLayerMode: {
+    value: 1,
+    kind: OptionKind.VIEWER
+  },
+  useOnlyCssZoom: {
+    value: false,
+    kind: OptionKind.VIEWER
+  },
+  cMapPacked: {
+    value: true,
+    kind: OptionKind.API
+  },
+  cMapUrl: {
+    value: '../web/cmaps/',
+    kind: OptionKind.API
+  },
+  disableAutoFetch: {
+    value: false,
+    kind: OptionKind.API
+  },
+  disableCreateObjectURL: {
+    value: _pdfjsLib.apiCompatibilityParams.disableCreateObjectURL || false,
+    kind: OptionKind.API
+  },
+  disableFontFace: {
+    value: false,
+    kind: OptionKind.API
+  },
+  disableRange: {
+    value: false,
+    kind: OptionKind.API
+  },
+  disableStream: {
+    value: false,
+    kind: OptionKind.API
+  },
+  isEvalSupported: {
+    value: true,
+    kind: OptionKind.API
+  },
+  maxImageSize: {
+    value: -1,
+    kind: OptionKind.API
+  },
+  pdfBug: {
+    value: false,
+    kind: OptionKind.API
+  },
+  postMessageTransfers: {
+    value: true,
+    kind: OptionKind.API
+  },
+  verbosity: {
+    value: 1,
+    kind: OptionKind.API
+  },
+  workerPort: {
+    value: null,
+    kind: OptionKind.WORKER
+  },
+  workerSrc: {
+    value: '../build/pdf.worker.js',
+    kind: OptionKind.WORKER
+  }
+};
+{
+  defaultOptions.locale = {
+    value: typeof navigator !== 'undefined' ? navigator.language : 'en-US',
+    kind: OptionKind.VIEWER
+  };
+}
+var userOptions = Object.create(null);
+
+var AppOptions = function () {
+  function AppOptions() {
+    _classCallCheck(this, AppOptions);
+
+    throw new Error('Cannot initialize AppOptions.');
+  }
+
+  _createClass(AppOptions, null, [{
+    key: 'get',
+    value: function get(name) {
+      var defaultOption = defaultOptions[name],
+          userOption = userOptions[name];
+      if (userOption !== undefined) {
+        return userOption;
+      }
+      return defaultOption !== undefined ? defaultOption.value : undefined;
+    }
+  }, {
+    key: 'getAll',
+    value: function getAll() {
+      var kind = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
+
+      var options = Object.create(null);
+      for (var name in defaultOptions) {
+        var defaultOption = defaultOptions[name],
+            userOption = userOptions[name];
+        if (kind && defaultOption.kind !== kind) {
+          continue;
+        }
+        options[name] = userOption !== undefined ? userOption : defaultOption.value;
+      }
+      return options;
+    }
+  }, {
+    key: 'set',
+    value: function set(name, value) {
+      userOptions[name] = value;
+    }
+  }, {
+    key: 'remove',
+    value: function remove(name) {
+      delete userOptions[name];
+    }
+  }]);
+
+  return AppOptions;
+}();
+
+exports.AppOptions = AppOptions;
+exports.OptionKind = OptionKind;
+
+/***/ }),
+/* 13 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var compatibilityParams = Object.create(null);
+{
+  var userAgent = typeof navigator !== 'undefined' && navigator.userAgent || '';
+  var isAndroid = /Android/.test(userAgent);
+  var isIOS = /\b(iPad|iPhone|iPod)(?=;)/.test(userAgent);
+  (function checkCanvasSizeLimitation() {
+    if (isIOS || isAndroid) {
+      compatibilityParams.maxCanvasPixels = 5242880;
+    }
+  })();
+}
+exports.viewerCompatibilityParams = Object.freeze(compatibilityParams);
+
+/***/ }),
+/* 14 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.getGlobalEventBus = exports.attachDOMEventsToEventBus = undefined;
+
+var _ui_utils = __webpack_require__(6);
+
+function attachDOMEventsToEventBus(eventBus) {
+  eventBus.on('documentload', function () {
+    var event = document.createEvent('CustomEvent');
+    event.initCustomEvent('documentload', true, true, {});
+    window.dispatchEvent(event);
+  });
+  eventBus.on('pagerendered', function (evt) {
+    var event = document.createEvent('CustomEvent');
+    event.initCustomEvent('pagerendered', true, true, {
+      pageNumber: evt.pageNumber,
+      cssTransform: evt.cssTransform
+    });
+    evt.source.div.dispatchEvent(event);
+  });
+  eventBus.on('textlayerrendered', function (evt) {
+    var event = document.createEvent('CustomEvent');
+    event.initCustomEvent('textlayerrendered', true, true, { pageNumber: evt.pageNumber });
+    evt.source.textLayerDiv.dispatchEvent(event);
+  });
+  eventBus.on('pagechange', function (evt) {
+    var event = document.createEvent('UIEvents');
+    event.initUIEvent('pagechange', true, true, window, 0);
+    event.pageNumber = evt.pageNumber;
+    evt.source.container.dispatchEvent(event);
+  });
+  eventBus.on('pagesinit', function (evt) {
+    var event = document.createEvent('CustomEvent');
+    event.initCustomEvent('pagesinit', true, true, null);
+    evt.source.container.dispatchEvent(event);
+  });
+  eventBus.on('pagesloaded', function (evt) {
+    var event = document.createEvent('CustomEvent');
+    event.initCustomEvent('pagesloaded', true, true, { pagesCount: evt.pagesCount });
+    evt.source.container.dispatchEvent(event);
+  });
+  eventBus.on('scalechange', function (evt) {
+    var event = document.createEvent('UIEvents');
+    event.initUIEvent('scalechange', true, true, window, 0);
+    event.scale = evt.scale;
+    event.presetValue = evt.presetValue;
+    evt.source.container.dispatchEvent(event);
+  });
+  eventBus.on('updateviewarea', function (evt) {
+    var event = document.createEvent('UIEvents');
+    event.initUIEvent('updateviewarea', true, true, window, 0);
+    event.location = evt.location;
+    evt.source.container.dispatchEvent(event);
+  });
+  eventBus.on('find', function (evt) {
+    if (evt.source === window) {
+      return;
+    }
+    var event = document.createEvent('CustomEvent');
+    event.initCustomEvent('find' + evt.type, true, true, {
+      query: evt.query,
+      phraseSearch: evt.phraseSearch,
+      caseSensitive: evt.caseSensitive,
+      highlightAll: evt.highlightAll,
+      findPrevious: evt.findPrevious
+    });
+    window.dispatchEvent(event);
+  });
+  eventBus.on('attachmentsloaded', function (evt) {
+    var event = document.createEvent('CustomEvent');
+    event.initCustomEvent('attachmentsloaded', true, true, { attachmentsCount: evt.attachmentsCount });
+    evt.source.container.dispatchEvent(event);
+  });
+  eventBus.on('sidebarviewchanged', function (evt) {
+    var event = document.createEvent('CustomEvent');
+    event.initCustomEvent('sidebarviewchanged', true, true, { view: evt.view });
+    evt.source.outerContainer.dispatchEvent(event);
+  });
+  eventBus.on('pagemode', function (evt) {
+    var event = document.createEvent('CustomEvent');
+    event.initCustomEvent('pagemode', true, true, { mode: evt.mode });
+    evt.source.pdfViewer.container.dispatchEvent(event);
+  });
+  eventBus.on('namedaction', function (evt) {
+    var event = document.createEvent('CustomEvent');
+    event.initCustomEvent('namedaction', true, true, { action: evt.action });
+    evt.source.pdfViewer.container.dispatchEvent(event);
+  });
+  eventBus.on('presentationmodechanged', function (evt) {
+    var event = document.createEvent('CustomEvent');
+    event.initCustomEvent('presentationmodechanged', true, true, {
+      active: evt.active,
+      switchInProgress: evt.switchInProgress
+    });
+    window.dispatchEvent(event);
+  });
+  eventBus.on('outlineloaded', function (evt) {
+    var event = document.createEvent('CustomEvent');
+    event.initCustomEvent('outlineloaded', true, true, { outlineCount: evt.outlineCount });
+    evt.source.container.dispatchEvent(event);
+  });
+}
+var globalEventBus = null;
+function getGlobalEventBus() {
+  var dispatchToDOM = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+
+  if (!globalEventBus) {
+    globalEventBus = new _ui_utils.EventBus({ dispatchToDOM: dispatchToDOM });
+    if (!dispatchToDOM) {
+      attachDOMEventsToEventBus(globalEventBus);
+    }
+  }
+  return globalEventBus;
+}
+exports.attachDOMEventsToEventBus = attachDOMEventsToEventBus;
+exports.getGlobalEventBus = getGlobalEventBus;
+
+/***/ }),
+/* 15 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.OverlayManager = undefined;
+
+var _regenerator = __webpack_require__(2);
+
+var _regenerator2 = _interopRequireDefault(_regenerator);
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var OverlayManager = function () {
+  function OverlayManager() {
+    _classCallCheck(this, OverlayManager);
+
+    this._overlays = {};
+    this._active = null;
+    this._keyDownBound = this._keyDown.bind(this);
+  }
+
+  _createClass(OverlayManager, [{
+    key: 'register',
+    value: function () {
+      var _ref = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee(name, element) {
+        var callerCloseMethod = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
+        var canForceClose = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
+        var container;
+        return _regenerator2.default.wrap(function _callee$(_context) {
+          while (1) {
+            switch (_context.prev = _context.next) {
+              case 0:
+                container = void 0;
+
+                if (!(!name || !element || !(container = element.parentNode))) {
+                  _context.next = 5;
+                  break;
+                }
+
+                throw new Error('Not enough parameters.');
+
+              case 5:
+                if (!this._overlays[name]) {
+                  _context.next = 7;
+                  break;
+                }
+
+                throw new Error('The overlay is already registered.');
+
+              case 7:
+                this._overlays[name] = {
+                  element: element,
+                  container: container,
+                  callerCloseMethod: callerCloseMethod,
+                  canForceClose: canForceClose
+                };
+
+              case 8:
+              case 'end':
+                return _context.stop();
+            }
+          }
+        }, _callee, this);
+      }));
+
+      function register(_x3, _x4) {
+        return _ref.apply(this, arguments);
+      }
+
+      return register;
+    }()
+  }, {
+    key: 'unregister',
+    value: function () {
+      var _ref2 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee2(name) {
+        return _regenerator2.default.wrap(function _callee2$(_context2) {
+          while (1) {
+            switch (_context2.prev = _context2.next) {
+              case 0:
+                if (this._overlays[name]) {
+                  _context2.next = 4;
+                  break;
+                }
+
+                throw new Error('The overlay does not exist.');
+
+              case 4:
+                if (!(this._active === name)) {
+                  _context2.next = 6;
+                  break;
+                }
+
+                throw new Error('The overlay cannot be removed while it is active.');
+
+              case 6:
+                delete this._overlays[name];
+
+              case 7:
+              case 'end':
+                return _context2.stop();
+            }
+          }
+        }, _callee2, this);
+      }));
+
+      function unregister(_x5) {
+        return _ref2.apply(this, arguments);
+      }
+
+      return unregister;
+    }()
+  }, {
+    key: 'open',
+    value: function () {
+      var _ref3 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee3(name) {
+        return _regenerator2.default.wrap(function _callee3$(_context3) {
+          while (1) {
+            switch (_context3.prev = _context3.next) {
+              case 0:
+                if (this._overlays[name]) {
+                  _context3.next = 4;
+                  break;
+                }
+
+                throw new Error('The overlay does not exist.');
+
+              case 4:
+                if (!this._active) {
+                  _context3.next = 14;
+                  break;
+                }
+
+                if (!this._overlays[name].canForceClose) {
+                  _context3.next = 9;
+                  break;
+                }
+
+                this._closeThroughCaller();
+                _context3.next = 14;
+                break;
+
+              case 9:
+                if (!(this._active === name)) {
+                  _context3.next = 13;
+                  break;
+                }
+
+                throw new Error('The overlay is already active.');
+
+              case 13:
+                throw new Error('Another overlay is currently active.');
+
+              case 14:
+                this._active = name;
+                this._overlays[this._active].element.classList.remove('hidden');
+                this._overlays[this._active].container.classList.remove('hidden');
+                window.addEventListener('keydown', this._keyDownBound);
+
+              case 18:
+              case 'end':
+                return _context3.stop();
+            }
+          }
+        }, _callee3, this);
+      }));
+
+      function open(_x6) {
+        return _ref3.apply(this, arguments);
+      }
+
+      return open;
+    }()
+  }, {
+    key: 'close',
+    value: function () {
+      var _ref4 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee4(name) {
+        return _regenerator2.default.wrap(function _callee4$(_context4) {
+          while (1) {
+            switch (_context4.prev = _context4.next) {
+              case 0:
+                if (this._overlays[name]) {
+                  _context4.next = 4;
+                  break;
+                }
+
+                throw new Error('The overlay does not exist.');
+
+              case 4:
+                if (this._active) {
+                  _context4.next = 8;
+                  break;
+                }
+
+                throw new Error('The overlay is currently not active.');
+
+              case 8:
+                if (!(this._active !== name)) {
+                  _context4.next = 10;
+                  break;
+                }
+
+                throw new Error('Another overlay is currently active.');
+
+              case 10:
+                this._overlays[this._active].container.classList.add('hidden');
+                this._overlays[this._active].element.classList.add('hidden');
+                this._active = null;
+                window.removeEventListener('keydown', this._keyDownBound);
+
+              case 14:
+              case 'end':
+                return _context4.stop();
+            }
+          }
+        }, _callee4, this);
+      }));
+
+      function close(_x7) {
+        return _ref4.apply(this, arguments);
+      }
+
+      return close;
+    }()
+  }, {
+    key: '_keyDown',
+    value: function _keyDown(evt) {
+      if (this._active && evt.keyCode === 27) {
+        this._closeThroughCaller();
+        evt.preventDefault();
+      }
+    }
+  }, {
+    key: '_closeThroughCaller',
+    value: function _closeThroughCaller() {
+      if (this._overlays[this._active].callerCloseMethod) {
+        this._overlays[this._active].callerCloseMethod();
+      }
+      if (this._active) {
+        this.close(this._active);
+      }
+    }
+  }, {
+    key: 'active',
+    get: function get() {
+      return this._active;
+    }
+  }]);
+
+  return OverlayManager;
+}();
+
+exports.OverlayManager = OverlayManager;
+
+/***/ }),
+/* 16 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.PasswordPrompt = undefined;
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _ui_utils = __webpack_require__(6);
+
+var _pdfjsLib = __webpack_require__(7);
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var PasswordPrompt = function () {
+  function PasswordPrompt(options, overlayManager) {
+    var _this = this;
+
+    var l10n = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _ui_utils.NullL10n;
+
+    _classCallCheck(this, PasswordPrompt);
+
+    this.overlayName = options.overlayName;
+    this.container = options.container;
+    this.label = options.label;
+    this.input = options.input;
+    this.submitButton = options.submitButton;
+    this.cancelButton = options.cancelButton;
+    this.overlayManager = overlayManager;
+    this.l10n = l10n;
+    this.updateCallback = null;
+    this.reason = null;
+    this.submitButton.addEventListener('click', this.verify.bind(this));
+    this.cancelButton.addEventListener('click', this.close.bind(this));
+    this.input.addEventListener('keydown', function (e) {
+      if (e.keyCode === 13) {
+        _this.verify();
+      }
+    });
+    this.overlayManager.register(this.overlayName, this.container, this.close.bind(this), true);
+  }
+
+  _createClass(PasswordPrompt, [{
+    key: 'open',
+    value: function open() {
+      var _this2 = this;
+
+      this.overlayManager.open(this.overlayName).then(function () {
+        _this2.input.focus();
+        var promptString = void 0;
+        if (_this2.reason === _pdfjsLib.PasswordResponses.INCORRECT_PASSWORD) {
+          promptString = _this2.l10n.get('password_invalid', null, 'Invalid password. Please try again.');
+        } else {
+          promptString = _this2.l10n.get('password_label', null, 'Enter the password to open this PDF file.');
+        }
+        promptString.then(function (msg) {
+          _this2.label.textContent = msg;
+        });
+      });
+    }
+  }, {
+    key: 'close',
+    value: function close() {
+      var _this3 = this;
+
+      this.overlayManager.close(this.overlayName).then(function () {
+        _this3.input.value = '';
+      });
+    }
+  }, {
+    key: 'verify',
+    value: function verify() {
+      var password = this.input.value;
+      if (password && password.length > 0) {
+        this.close();
+        return this.updateCallback(password);
+      }
+    }
+  }, {
+    key: 'setUpdateCallback',
+    value: function setUpdateCallback(updateCallback, reason) {
+      this.updateCallback = updateCallback;
+      this.reason = reason;
+    }
+  }]);
+
+  return PasswordPrompt;
+}();
+
+exports.PasswordPrompt = PasswordPrompt;
+
+/***/ }),
+/* 17 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.PDFAttachmentViewer = undefined;
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _pdfjsLib = __webpack_require__(7);
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var PDFAttachmentViewer = function () {
+  function PDFAttachmentViewer(_ref) {
+    var container = _ref.container,
+        eventBus = _ref.eventBus,
+        downloadManager = _ref.downloadManager;
+
+    _classCallCheck(this, PDFAttachmentViewer);
+
+    this.container = container;
+    this.eventBus = eventBus;
+    this.downloadManager = downloadManager;
+    this.reset();
+    this.eventBus.on('fileattachmentannotation', this._appendAttachment.bind(this));
+  }
+
+  _createClass(PDFAttachmentViewer, [{
+    key: 'reset',
+    value: function reset() {
+      var keepRenderedCapability = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+
+      this.attachments = null;
+      this.container.textContent = '';
+      if (!keepRenderedCapability) {
+        this._renderedCapability = (0, _pdfjsLib.createPromiseCapability)();
+      }
+    }
+  }, {
+    key: '_dispatchEvent',
+    value: function _dispatchEvent(attachmentsCount) {
+      this._renderedCapability.resolve();
+      this.eventBus.dispatch('attachmentsloaded', {
+        source: this,
+        attachmentsCount: attachmentsCount
+      });
+    }
+  }, {
+    key: '_bindPdfLink',
+    value: function _bindPdfLink(button, content, filename) {
+      if (this.downloadManager.disableCreateObjectURL) {
+        throw new Error('bindPdfLink: Unsupported "disableCreateObjectURL" value.');
+      }
+      var blobUrl = void 0;
+      button.onclick = function () {
+        if (!blobUrl) {
+          blobUrl = (0, _pdfjsLib.createObjectURL)(content, 'application/pdf');
+        }
+        var viewerUrl = void 0;
+        viewerUrl = '?file=' + encodeURIComponent(blobUrl + '#' + filename);
+        window.open(viewerUrl);
+        return false;
+      };
+    }
+  }, {
+    key: '_bindLink',
+    value: function _bindLink(button, content, filename) {
+      var _this = this;
+
+      button.onclick = function () {
+        _this.downloadManager.downloadData(content, filename, '');
+        return false;
+      };
+    }
+  }, {
+    key: 'render',
+    value: function render(_ref2) {
+      var attachments = _ref2.attachments,
+          _ref2$keepRenderedCap = _ref2.keepRenderedCapability,
+          keepRenderedCapability = _ref2$keepRenderedCap === undefined ? false : _ref2$keepRenderedCap;
+
+      var attachmentsCount = 0;
+      if (this.attachments) {
+        this.reset(keepRenderedCapability === true);
+      }
+      this.attachments = attachments || null;
+      if (!attachments) {
+        this._dispatchEvent(attachmentsCount);
+        return;
+      }
+      var names = Object.keys(attachments).sort(function (a, b) {
+        return a.toLowerCase().localeCompare(b.toLowerCase());
+      });
+      attachmentsCount = names.length;
+      for (var i = 0; i < attachmentsCount; i++) {
+        var item = attachments[names[i]];
+        var filename = (0, _pdfjsLib.removeNullCharacters)((0, _pdfjsLib.getFilenameFromUrl)(item.filename));
+        var div = document.createElement('div');
+        div.className = 'attachmentsItem';
+        var button = document.createElement('button');
+        button.textContent = filename;
+        if (/\.pdf$/i.test(filename) && !this.downloadManager.disableCreateObjectURL) {
+          this._bindPdfLink(button, item.content, filename);
+        } else {
+          this._bindLink(button, item.content, filename);
+        }
+        div.appendChild(button);
+        this.container.appendChild(div);
+      }
+      this._dispatchEvent(attachmentsCount);
+    }
+  }, {
+    key: '_appendAttachment',
+    value: function _appendAttachment(_ref3) {
+      var _this2 = this;
+
+      var id = _ref3.id,
+          filename = _ref3.filename,
+          content = _ref3.content;
+
+      this._renderedCapability.promise.then(function () {
+        var attachments = _this2.attachments;
+        if (!attachments) {
+          attachments = Object.create(null);
+        } else {
+          for (var name in attachments) {
+            if (id === name) {
+              return;
+            }
+          }
+        }
+        attachments[id] = {
+          filename: filename,
+          content: content
+        };
+        _this2.render({
+          attachments: attachments,
+          keepRenderedCapability: true
+        });
+      });
+    }
+  }]);
+
+  return PDFAttachmentViewer;
+}();
+
+exports.PDFAttachmentViewer = PDFAttachmentViewer;
+
+/***/ }),
+/* 18 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.PDFDocumentProperties = undefined;
+
+var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _ui_utils = __webpack_require__(6);
+
+var _pdfjsLib = __webpack_require__(7);
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var DEFAULT_FIELD_CONTENT = '-';
+var NON_METRIC_LOCALES = ['en-us', 'en-lr', 'my'];
+var US_PAGE_NAMES = {
+  '8.5x11': 'Letter',
+  '8.5x14': 'Legal'
+};
+var METRIC_PAGE_NAMES = {
+  '297x420': 'A3',
+  '210x297': 'A4'
+};
+function getPageName(size, isPortrait, pageNames) {
+  var width = isPortrait ? size.width : size.height;
+  var height = isPortrait ? size.height : size.width;
+  return pageNames[width + 'x' + height];
+}
+
+var PDFDocumentProperties = function () {
+  function PDFDocumentProperties(_ref, overlayManager, eventBus) {
+    var overlayName = _ref.overlayName,
+        fields = _ref.fields,
+        container = _ref.container,
+        closeButton = _ref.closeButton;
+
+    var _this = this;
+
+    var l10n = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : _ui_utils.NullL10n;
+
+    _classCallCheck(this, PDFDocumentProperties);
+
+    this.overlayName = overlayName;
+    this.fields = fields;
+    this.container = container;
+    this.overlayManager = overlayManager;
+    this.l10n = l10n;
+    this._reset();
+    if (closeButton) {
+      closeButton.addEventListener('click', this.close.bind(this));
+    }
+    this.overlayManager.register(this.overlayName, this.container, this.close.bind(this));
+    if (eventBus) {
+      eventBus.on('pagechanging', function (evt) {
+        _this._currentPageNumber = evt.pageNumber;
+      });
+      eventBus.on('rotationchanging', function (evt) {
+        _this._pagesRotation = evt.pagesRotation;
+      });
+    }
+    this._isNonMetricLocale = true;
+    l10n.getLanguage().then(function (locale) {
+      _this._isNonMetricLocale = NON_METRIC_LOCALES.includes(locale);
+    });
+  }
+
+  _createClass(PDFDocumentProperties, [{
+    key: 'open',
+    value: function open() {
+      var _this2 = this;
+
+      var freezeFieldData = function freezeFieldData(data) {
+        Object.defineProperty(_this2, 'fieldData', {
+          value: Object.freeze(data),
+          writable: false,
+          enumerable: true,
+          configurable: true
+        });
+      };
+      Promise.all([this.overlayManager.open(this.overlayName), this._dataAvailableCapability.promise]).then(function () {
+        var currentPageNumber = _this2._currentPageNumber;
+        var pagesRotation = _this2._pagesRotation;
+        if (_this2.fieldData && currentPageNumber === _this2.fieldData['_currentPageNumber'] && pagesRotation === _this2.fieldData['_pagesRotation']) {
+          _this2._updateUI();
+          return;
+        }
+        _this2.pdfDocument.getMetadata().then(function (_ref2) {
+          var info = _ref2.info,
+              metadata = _ref2.metadata,
+              contentDispositionFilename = _ref2.contentDispositionFilename;
+
+          return Promise.all([info, metadata, contentDispositionFilename || (0, _ui_utils.getPDFFileNameFromURL)(_this2.url || ''), _this2._parseFileSize(_this2.maybeFileSize), _this2._parseDate(info.CreationDate), _this2._parseDate(info.ModDate), _this2.pdfDocument.getPage(currentPageNumber).then(function (pdfPage) {
+            return _this2._parsePageSize((0, _ui_utils.getPageSizeInches)(pdfPage), pagesRotation);
+          }), _this2._parseLinearization(info.IsLinearized)]);
+        }).then(function (_ref3) {
+          var _ref4 = _slicedToArray(_ref3, 8),
+              info = _ref4[0],
+              metadata = _ref4[1],
+              fileName = _ref4[2],
+              fileSize = _ref4[3],
+              creationDate = _ref4[4],
+              modDate = _ref4[5],
+              pageSize = _ref4[6],
+              isLinearized = _ref4[7];
+
+          freezeFieldData({
+            'fileName': fileName,
+            'fileSize': fileSize,
+            'title': info.Title,
+            'author': info.Author,
+            'subject': info.Subject,
+            'keywords': info.Keywords,
+            'creationDate': creationDate,
+            'modificationDate': modDate,
+            'creator': info.Creator,
+            'producer': info.Producer,
+            'version': info.PDFFormatVersion,
+            'pageCount': _this2.pdfDocument.numPages,
+            'pageSize': pageSize,
+            'linearized': isLinearized,
+            '_currentPageNumber': currentPageNumber,
+            '_pagesRotation': pagesRotation
+          });
+          _this2._updateUI();
+          return _this2.pdfDocument.getDownloadInfo();
+        }).then(function (_ref5) {
+          var length = _ref5.length;
+
+          _this2.maybeFileSize = length;
+          return _this2._parseFileSize(length);
+        }).then(function (fileSize) {
+          if (fileSize === _this2.fieldData['fileSize']) {
+            return;
+          }
+          var data = Object.assign(Object.create(null), _this2.fieldData);
+          data['fileSize'] = fileSize;
+          freezeFieldData(data);
+          _this2._updateUI();
+        });
+      });
+    }
+  }, {
+    key: 'close',
+    value: function close() {
+      this.overlayManager.close(this.overlayName);
+    }
+  }, {
+    key: 'setDocument',
+    value: function setDocument(pdfDocument) {
+      var url = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
+
+      if (this.pdfDocument) {
+        this._reset();
+        this._updateUI(true);
+      }
+      if (!pdfDocument) {
+        return;
+      }
+      this.pdfDocument = pdfDocument;
+      this.url = url;
+      this._dataAvailableCapability.resolve();
+    }
+  }, {
+    key: 'setFileSize',
+    value: function setFileSize(fileSize) {
+      if (Number.isInteger(fileSize) && fileSize > 0) {
+        this.maybeFileSize = fileSize;
+      }
+    }
+  }, {
+    key: '_reset',
+    value: function _reset() {
+      this.pdfDocument = null;
+      this.url = null;
+      this.maybeFileSize = 0;
+      delete this.fieldData;
+      this._dataAvailableCapability = (0, _pdfjsLib.createPromiseCapability)();
+      this._currentPageNumber = 1;
+      this._pagesRotation = 0;
+    }
+  }, {
+    key: '_updateUI',
+    value: function _updateUI() {
+      var reset = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+
+      if (reset || !this.fieldData) {
+        for (var id in this.fields) {
+          this.fields[id].textContent = DEFAULT_FIELD_CONTENT;
+        }
+        return;
+      }
+      if (this.overlayManager.active !== this.overlayName) {
+        return;
+      }
+      for (var _id in this.fields) {
+        var content = this.fieldData[_id];
+        this.fields[_id].textContent = content || content === 0 ? content : DEFAULT_FIELD_CONTENT;
+      }
+    }
+  }, {
+    key: '_parseFileSize',
+    value: function _parseFileSize() {
+      var fileSize = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
+
+      var kb = fileSize / 1024;
+      if (!kb) {
+        return Promise.resolve(undefined);
+      } else if (kb < 1024) {
+        return this.l10n.get('document_properties_kb', {
+          size_kb: (+kb.toPrecision(3)).toLocaleString(),
+          size_b: fileSize.toLocaleString()
+        }, '{{size_kb}} KB ({{size_b}} bytes)');
+      }
+      return this.l10n.get('document_properties_mb', {
+        size_mb: (+(kb / 1024).toPrecision(3)).toLocaleString(),
+        size_b: fileSize.toLocaleString()
+      }, '{{size_mb}} MB ({{size_b}} bytes)');
+    }
+  }, {
+    key: '_parsePageSize',
+    value: function _parsePageSize(pageSizeInches, pagesRotation) {
+      var _this3 = this;
+
+      if (!pageSizeInches) {
+        return Promise.resolve(undefined);
+      }
+      if (pagesRotation % 180 !== 0) {
+        pageSizeInches = {
+          width: pageSizeInches.height,
+          height: pageSizeInches.width
+        };
+      }
+      var isPortrait = (0, _ui_utils.isPortraitOrientation)(pageSizeInches);
+      var sizeInches = {
+        width: Math.round(pageSizeInches.width * 100) / 100,
+        height: Math.round(pageSizeInches.height * 100) / 100
+      };
+      var sizeMillimeters = {
+        width: Math.round(pageSizeInches.width * 25.4 * 10) / 10,
+        height: Math.round(pageSizeInches.height * 25.4 * 10) / 10
+      };
+      var pageName = null;
+      var name = getPageName(sizeInches, isPortrait, US_PAGE_NAMES) || getPageName(sizeMillimeters, isPortrait, METRIC_PAGE_NAMES);
+      if (!name && !(Number.isInteger(sizeMillimeters.width) && Number.isInteger(sizeMillimeters.height))) {
+        var exactMillimeters = {
+          width: pageSizeInches.width * 25.4,
+          height: pageSizeInches.height * 25.4
+        };
+        var intMillimeters = {
+          width: Math.round(sizeMillimeters.width),
+          height: Math.round(sizeMillimeters.height)
+        };
+        if (Math.abs(exactMillimeters.width - intMillimeters.width) < 0.1 && Math.abs(exactMillimeters.height - intMillimeters.height) < 0.1) {
+          name = getPageName(intMillimeters, isPortrait, METRIC_PAGE_NAMES);
+          if (name) {
+            sizeInches = {
+              width: Math.round(intMillimeters.width / 25.4 * 100) / 100,
+              height: Math.round(intMillimeters.height / 25.4 * 100) / 100
+            };
+            sizeMillimeters = intMillimeters;
+          }
+        }
+      }
+      if (name) {
+        pageName = this.l10n.get('document_properties_page_size_name_' + name.toLowerCase(), null, name);
+      }
+      return Promise.all([this._isNonMetricLocale ? sizeInches : sizeMillimeters, this.l10n.get('document_properties_page_size_unit_' + (this._isNonMetricLocale ? 'inches' : 'millimeters'), null, this._isNonMetricLocale ? 'in' : 'mm'), pageName, this.l10n.get('document_properties_page_size_orientation_' + (isPortrait ? 'portrait' : 'landscape'), null, isPortrait ? 'portrait' : 'landscape')]).then(function (_ref6) {
+        var _ref7 = _slicedToArray(_ref6, 4),
+            _ref7$ = _ref7[0],
+            width = _ref7$.width,
+            height = _ref7$.height,
+            unit = _ref7[1],
+            name = _ref7[2],
+            orientation = _ref7[3];
+
+        return _this3.l10n.get('document_properties_page_size_dimension_' + (name ? 'name_' : '') + 'string', {
+          width: width.toLocaleString(),
+          height: height.toLocaleString(),
+          unit: unit,
+          name: name,
+          orientation: orientation
+        }, '{{width}} 脳 {{height}} {{unit}} (' + (name ? '{{name}}, ' : '') + '{{orientation}})');
+      });
+    }
+  }, {
+    key: '_parseDate',
+    value: function _parseDate(inputDate) {
+      if (!inputDate) {
+        return;
+      }
+      var dateToParse = inputDate;
+      if (dateToParse.substring(0, 2) === 'D:') {
+        dateToParse = dateToParse.substring(2);
+      }
+      var year = parseInt(dateToParse.substring(0, 4), 10);
+      var month = parseInt(dateToParse.substring(4, 6), 10) - 1;
+      var day = parseInt(dateToParse.substring(6, 8), 10);
+      var hours = parseInt(dateToParse.substring(8, 10), 10);
+      var minutes = parseInt(dateToParse.substring(10, 12), 10);
+      var seconds = parseInt(dateToParse.substring(12, 14), 10);
+      var utRel = dateToParse.substring(14, 15);
+      var offsetHours = parseInt(dateToParse.substring(15, 17), 10);
+      var offsetMinutes = parseInt(dateToParse.substring(18, 20), 10);
+      if (utRel === '-') {
+        hours += offsetHours;
+        minutes += offsetMinutes;
+      } else if (utRel === '+') {
+        hours -= offsetHours;
+        minutes -= offsetMinutes;
+      }
+      var date = new Date(Date.UTC(year, month, day, hours, minutes, seconds));
+      var dateString = date.toLocaleDateString();
+      var timeString = date.toLocaleTimeString();
+      return this.l10n.get('document_properties_date_string', {
+        date: dateString,
+        time: timeString
+      }, '{{date}}, {{time}}');
+    }
+  }, {
+    key: '_parseLinearization',
+    value: function _parseLinearization(isLinearized) {
+      return this.l10n.get('document_properties_linearized_' + (isLinearized ? 'yes' : 'no'), null, isLinearized ? 'Yes' : 'No');
+    }
+  }]);
+
+  return PDFDocumentProperties;
+}();
+
+exports.PDFDocumentProperties = PDFDocumentProperties;
+
+/***/ }),
+/* 19 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.PDFFindBar = undefined;
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _ui_utils = __webpack_require__(6);
+
+var _pdf_find_controller = __webpack_require__(20);
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var MATCHES_COUNT_LIMIT = 1000;
+
+var PDFFindBar = function () {
+  function PDFFindBar(options) {
+    var _this = this;
+
+    var eventBus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : (0, _ui_utils.getGlobalEventBus)();
+    var l10n = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _ui_utils.NullL10n;
+
+    _classCallCheck(this, PDFFindBar);
+
+    this.opened = false;
+    this.bar = options.bar || null;
+    this.toggleButton = options.toggleButton || null;
+    this.findField = options.findField || null;
+    this.highlightAll = options.highlightAllCheckbox || null;
+    this.caseSensitive = options.caseSensitiveCheckbox || null;
+    this.entireWord = options.entireWordCheckbox || null;
+    this.findMsg = options.findMsg || null;
+    this.findResultsCount = options.findResultsCount || null;
+    this.findPreviousButton = options.findPreviousButton || null;
+    this.findNextButton = options.findNextButton || null;
+    this.eventBus = eventBus;
+    this.l10n = l10n;
+    this.toggleButton.addEventListener('click', function () {
+      _this.toggle();
+    });
+    this.findField.addEventListener('input', function () {
+      _this.dispatchEvent('');
+    });
+    this.bar.addEventListener('keydown', function (e) {
+      switch (e.keyCode) {
+        case 13:
+          if (e.target === _this.findField) {
+            _this.dispatchEvent('again', e.shiftKey);
+          }
+          break;
+        case 27:
+          _this.close();
+          break;
+      }
+    });
+    this.findPreviousButton.addEventListener('click', function () {
+      _this.dispatchEvent('again', true);
+    });
+    this.findNextButton.addEventListener('click', function () {
+      _this.dispatchEvent('again', false);
+    });
+    this.highlightAll.addEventListener('click', function () {
+      _this.dispatchEvent('highlightallchange');
+    });
+    this.caseSensitive.addEventListener('click', function () {
+      _this.dispatchEvent('casesensitivitychange');
+    });
+    this.entireWord.addEventListener('click', function () {
+      _this.dispatchEvent('entirewordchange');
+    });
+    this.eventBus.on('resize', this._adjustWidth.bind(this));
+  }
+
+  _createClass(PDFFindBar, [{
+    key: 'reset',
+    value: function reset() {
+      this.updateUIState();
+    }
+  }, {
+    key: 'dispatchEvent',
+    value: function dispatchEvent(type, findPrev) {
+      this.eventBus.dispatch('find', {
+        source: this,
+        type: type,
+        query: this.findField.value,
+        phraseSearch: true,
+        caseSensitive: this.caseSensitive.checked,
+        entireWord: this.entireWord.checked,
+        highlightAll: this.highlightAll.checked,
+        findPrevious: findPrev
+      });
+    }
+  }, {
+    key: 'updateUIState',
+    value: function updateUIState(state, previous, matchesCount) {
+      var _this2 = this;
+
+      var notFound = false;
+      var findMsg = '';
+      var status = '';
+      switch (state) {
+        case _pdf_find_controller.FindState.FOUND:
+          break;
+        case _pdf_find_controller.FindState.PENDING:
+          status = 'pending';
+          break;
+        case _pdf_find_controller.FindState.NOT_FOUND:
+          findMsg = this.l10n.get('find_not_found', null, 'Phrase not found');
+          notFound = true;
+          break;
+        case _pdf_find_controller.FindState.WRAPPED:
+          if (previous) {
+            findMsg = this.l10n.get('find_reached_top', null, 'Reached top of document, continued from bottom');
+          } else {
+            findMsg = this.l10n.get('find_reached_bottom', null, 'Reached end of document, continued from top');
+          }
+          break;
+      }
+      this.findField.classList.toggle('notFound', notFound);
+      this.findField.setAttribute('data-status', status);
+      Promise.resolve(findMsg).then(function (msg) {
+        _this2.findMsg.textContent = msg;
+        _this2._adjustWidth();
+      });
+      this.updateResultsCount(matchesCount);
+    }
+  }, {
+    key: 'updateResultsCount',
+    value: function updateResultsCount() {
+      var _this3 = this;
+
+      var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
+          _ref$current = _ref.current,
+          current = _ref$current === undefined ? 0 : _ref$current,
+          _ref$total = _ref.total,
+          total = _ref$total === undefined ? 0 : _ref$total;
+
+      if (!this.findResultsCount) {
+        return;
+      }
+      var matchesCountMsg = '',
+          limit = MATCHES_COUNT_LIMIT;
+      if (total > 0) {
+        if (total > limit) {
+          matchesCountMsg = this.l10n.get('find_match_count_limit', { limit: limit }, 'More than {{limit}} match' + (limit !== 1 ? 'es' : ''));
+        } else {
+          matchesCountMsg = this.l10n.get('find_match_count', {
+            current: current,
+            total: total
+          }, '{{current}} of {{total}} match' + (total !== 1 ? 'es' : ''));
+        }
+      }
+      Promise.resolve(matchesCountMsg).then(function (msg) {
+        _this3.findResultsCount.textContent = msg;
+        _this3.findResultsCount.classList[!total ? 'add' : 'remove']('hidden');
+        _this3._adjustWidth();
+      });
+    }
+  }, {
+    key: 'open',
+    value: function open() {
+      if (!this.opened) {
+        this.opened = true;
+        this.toggleButton.classList.add('toggled');
+        this.bar.classList.remove('hidden');
+      }
+      this.findField.select();
+      this.findField.focus();
+      this._adjustWidth();
+    }
+  }, {
+    key: 'close',
+    value: function close() {
+      if (!this.opened) {
+        return;
+      }
+      this.opened = false;
+      this.toggleButton.classList.remove('toggled');
+      this.bar.classList.add('hidden');
+      this.eventBus.dispatch('findbarclose', { source: this });
+    }
+  }, {
+    key: 'toggle',
+    value: function toggle() {
+      if (this.opened) {
+        this.close();
+      } else {
+        this.open();
+      }
+    }
+  }, {
+    key: '_adjustWidth',
+    value: function _adjustWidth() {
+      if (!this.opened) {
+        return;
+      }
+      this.bar.classList.remove('wrapContainers');
+      var findbarHeight = this.bar.clientHeight;
+      var inputContainerHeight = this.bar.firstElementChild.clientHeight;
+      if (findbarHeight > inputContainerHeight) {
+        this.bar.classList.add('wrapContainers');
+      }
+    }
+  }]);
+
+  return PDFFindBar;
+}();
+
+exports.PDFFindBar = PDFFindBar;
+
+/***/ }),
+/* 20 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.PDFFindController = exports.FindState = undefined;
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _pdfjsLib = __webpack_require__(7);
+
+var _pdf_find_utils = __webpack_require__(21);
+
+var _dom_events = __webpack_require__(14);
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var FindState = {
+  FOUND: 0,
+  NOT_FOUND: 1,
+  WRAPPED: 2,
+  PENDING: 3
+};
+var FIND_TIMEOUT = 250;
+var CHARACTERS_TO_NORMALIZE = {
+  '\u2018': '\'',
+  '\u2019': '\'',
+  '\u201A': '\'',
+  '\u201B': '\'',
+  '\u201C': '"',
+  '\u201D': '"',
+  '\u201E': '"',
+  '\u201F': '"',
+  '\xBC': '1/4',
+  '\xBD': '1/2',
+  '\xBE': '3/4'
+};
+
+var PDFFindController = function () {
+  function PDFFindController(_ref) {
+    var linkService = _ref.linkService,
+        _ref$eventBus = _ref.eventBus,
+        eventBus = _ref$eventBus === undefined ? (0, _dom_events.getGlobalEventBus)() : _ref$eventBus;
+
+    _classCallCheck(this, PDFFindController);
+
+    this._linkService = linkService;
+    this._eventBus = eventBus;
+    this._reset();
+    eventBus.on('findbarclose', this._onFindBarClose.bind(this));
+    var replace = Object.keys(CHARACTERS_TO_NORMALIZE).join('');
+    this._normalizationRegex = new RegExp('[' + replace + ']', 'g');
+  }
+
+  _createClass(PDFFindController, [{
+    key: 'setDocument',
+    value: function setDocument(pdfDocument) {
+      if (this._pdfDocument) {
+        this._reset();
+      }
+      if (!pdfDocument) {
+        return;
+      }
+      this._pdfDocument = pdfDocument;
+      this._firstPageCapability.resolve();
+    }
+  }, {
+    key: 'executeCommand',
+    value: function executeCommand(cmd, state) {
+      var _this = this;
+
+      var pdfDocument = this._pdfDocument;
+      if (this._state === null || cmd !== 'findagain') {
+        this._dirtyMatch = true;
+      }
+      this._state = state;
+      this._updateUIState(FindState.PENDING);
+      this._firstPageCapability.promise.then(function () {
+        if (!_this._pdfDocument || pdfDocument && _this._pdfDocument !== pdfDocument) {
+          return;
+        }
+        _this._extractText();
+        if (_this._findTimeout) {
+          clearTimeout(_this._findTimeout);
+          _this._findTimeout = null;
+        }
+        if (cmd === 'find') {
+          _this._findTimeout = setTimeout(function () {
+            _this._nextMatch();
+            _this._findTimeout = null;
+          }, FIND_TIMEOUT);
+        } else {
+          _this._nextMatch();
+        }
+      });
+    }
+  }, {
+    key: '_reset',
+    value: function _reset() {
+      this._highlightMatches = false;
+      this._pdfDocument = null;
+      this._pageMatches = [];
+      this._pageMatchesLength = null;
+      this._state = null;
+      this._selected = {
+        pageIdx: -1,
+        matchIdx: -1
+      };
+      this._offset = {
+        pageIdx: null,
+        matchIdx: null
+      };
+      this._extractTextPromises = [];
+      this._pageContents = [];
+      this._matchesCountTotal = 0;
+      this._pagesToSearch = null;
+      this._pendingFindMatches = Object.create(null);
+      this._resumePageIdx = null;
+      this._dirtyMatch = false;
+      clearTimeout(this._findTimeout);
+      this._findTimeout = null;
+      this._firstPageCapability = (0, _pdfjsLib.createPromiseCapability)();
+    }
+  }, {
+    key: '_normalize',
+    value: function _normalize(text) {
+      return text.replace(this._normalizationRegex, function (ch) {
+        return CHARACTERS_TO_NORMALIZE[ch];
+      });
+    }
+  }, {
+    key: '_prepareMatches',
+    value: function _prepareMatches(matchesWithLength, matches, matchesLength) {
+      function isSubTerm(matchesWithLength, currentIndex) {
+        var currentElem = matchesWithLength[currentIndex];
+        var nextElem = matchesWithLength[currentIndex + 1];
+        if (currentIndex < matchesWithLength.length - 1 && currentElem.match === nextElem.match) {
+          currentElem.skipped = true;
+          return true;
+        }
+        for (var i = currentIndex - 1; i >= 0; i--) {
+          var prevElem = matchesWithLength[i];
+          if (prevElem.skipped) {
+            continue;
+          }
+          if (prevElem.match + prevElem.matchLength < currentElem.match) {
+            break;
+          }
+          if (prevElem.match + prevElem.matchLength >= currentElem.match + currentElem.matchLength) {
+            currentElem.skipped = true;
+            return true;
+          }
+        }
+        return false;
+      }
+      matchesWithLength.sort(function (a, b) {
+        return a.match === b.match ? a.matchLength - b.matchLength : a.match - b.match;
+      });
+      for (var i = 0, len = matchesWithLength.length; i < len; i++) {
+        if (isSubTerm(matchesWithLength, i)) {
+          continue;
+        }
+        matches.push(matchesWithLength[i].match);
+        matchesLength.push(matchesWithLength[i].matchLength);
+      }
+    }
+  }, {
+    key: '_isEntireWord',
+    value: function _isEntireWord(content, startIdx, length) {
+      if (startIdx > 0) {
+        var first = content.charCodeAt(startIdx);
+        var limit = content.charCodeAt(startIdx - 1);
+        if ((0, _pdf_find_utils.getCharacterType)(first) === (0, _pdf_find_utils.getCharacterType)(limit)) {
+          return false;
+        }
+      }
+      var endIdx = startIdx + length - 1;
+      if (endIdx < content.length - 1) {
+        var last = content.charCodeAt(endIdx);
+        var _limit = content.charCodeAt(endIdx + 1);
+        if ((0, _pdf_find_utils.getCharacterType)(last) === (0, _pdf_find_utils.getCharacterType)(_limit)) {
+          return false;
+        }
+      }
+      return true;
+    }
+  }, {
+    key: '_calculatePhraseMatch',
+    value: function _calculatePhraseMatch(query, pageIndex, pageContent, entireWord) {
+      var matches = [];
+      var queryLen = query.length;
+      var matchIdx = -queryLen;
+      while (true) {
+        matchIdx = pageContent.indexOf(query, matchIdx + queryLen);
+        if (matchIdx === -1) {
+          break;
+        }
+        if (entireWord && !this._isEntireWord(pageContent, matchIdx, queryLen)) {
+          continue;
+        }
+        matches.push(matchIdx);
+      }
+      this._pageMatches[pageIndex] = matches;
+    }
+  }, {
+    key: '_calculateWordMatch',
+    value: function _calculateWordMatch(query, pageIndex, pageContent, entireWord) {
+      var matchesWithLength = [];
+      var queryArray = query.match(/\S+/g);
+      for (var i = 0, len = queryArray.length; i < len; i++) {
+        var subquery = queryArray[i];
+        var subqueryLen = subquery.length;
+        var matchIdx = -subqueryLen;
+        while (true) {
+          matchIdx = pageContent.indexOf(subquery, matchIdx + subqueryLen);
+          if (matchIdx === -1) {
+            break;
+          }
+          if (entireWord && !this._isEntireWord(pageContent, matchIdx, subqueryLen)) {
+            continue;
+          }
+          matchesWithLength.push({
+            match: matchIdx,
+            matchLength: subqueryLen,
+            skipped: false
+          });
+        }
+      }
+      if (!this._pageMatchesLength) {
+        this._pageMatchesLength = [];
+      }
+      this._pageMatchesLength[pageIndex] = [];
+      this._pageMatches[pageIndex] = [];
+      this._prepareMatches(matchesWithLength, this._pageMatches[pageIndex], this._pageMatchesLength[pageIndex]);
+    }
+  }, {
+    key: '_calculateMatch',
+    value: function _calculateMatch(pageIndex) {
+      var pageContent = this._normalize(this._pageContents[pageIndex]);
+      var query = this._normalize(this._state.query);
+      var _state = this._state,
+          caseSensitive = _state.caseSensitive,
+          entireWord = _state.entireWord,
+          phraseSearch = _state.phraseSearch;
+
+      if (query.length === 0) {
+        return;
+      }
+      if (!caseSensitive) {
+        pageContent = pageContent.toLowerCase();
+        query = query.toLowerCase();
+      }
+      if (phraseSearch) {
+        this._calculatePhraseMatch(query, pageIndex, pageContent, entireWord);
+      } else {
+        this._calculateWordMatch(query, pageIndex, pageContent, entireWord);
+      }
+      this._updatePage(pageIndex);
+      if (this._resumePageIdx === pageIndex) {
+        this._resumePageIdx = null;
+        this._nextPageMatch();
+      }
+      var pageMatchesCount = this._pageMatches[pageIndex].length;
+      if (pageMatchesCount > 0) {
+        this._matchesCountTotal += pageMatchesCount;
+        this._updateUIResultsCount();
+      }
+    }
+  }, {
+    key: '_extractText',
+    value: function _extractText() {
+      var _this2 = this;
+
+      if (this._extractTextPromises.length > 0) {
+        return;
+      }
+      var promise = Promise.resolve();
+
+      var _loop = function _loop(i, ii) {
+        var extractTextCapability = (0, _pdfjsLib.createPromiseCapability)();
+        _this2._extractTextPromises[i] = extractTextCapability.promise;
+        promise = promise.then(function () {
+          return _this2._pdfDocument.getPage(i + 1).then(function (pdfPage) {
+            return pdfPage.getTextContent({ normalizeWhitespace: true });
+          }).then(function (textContent) {
+            var textItems = textContent.items;
+            var strBuf = [];
+            for (var j = 0, jj = textItems.length; j < jj; j++) {
+              strBuf.push(textItems[j].str);
+            }
+            _this2._pageContents[i] = strBuf.join('');
+            extractTextCapability.resolve(i);
+          }, function (reason) {
+            console.error('Unable to get text content for page ' + (i + 1), reason);
+            _this2._pageContents[i] = '';
+            extractTextCapability.resolve(i);
+          });
+        });
+      };
+
+      for (var i = 0, ii = this._linkService.pagesCount; i < ii; i++) {
+        _loop(i, ii);
+      }
+    }
+  }, {
+    key: '_updatePage',
+    value: function _updatePage(index) {
+      if (this._selected.pageIdx === index) {
+        this._linkService.page = index + 1;
+      }
+      this._eventBus.dispatch('updatetextlayermatches', {
+        source: this,
+        pageIndex: index
+      });
+    }
+  }, {
+    key: '_nextMatch',
+    value: function _nextMatch() {
+      var _this3 = this;
+
+      var previous = this._state.findPrevious;
+      var currentPageIndex = this._linkService.page - 1;
+      var numPages = this._linkService.pagesCount;
+      this._highlightMatches = true;
+      if (this._dirtyMatch) {
+        this._dirtyMatch = false;
+        this._selected.pageIdx = this._selected.matchIdx = -1;
+        this._offset.pageIdx = currentPageIndex;
+        this._offset.matchIdx = null;
+        this._resumePageIdx = null;
+        this._pageMatches.length = 0;
+        this._pageMatchesLength = null;
+        this._matchesCountTotal = 0;
+        for (var i = 0; i < numPages; i++) {
+          this._updatePage(i);
+          if (!(i in this._pendingFindMatches)) {
+            this._pendingFindMatches[i] = true;
+            this._extractTextPromises[i].then(function (pageIdx) {
+              delete _this3._pendingFindMatches[pageIdx];
+              _this3._calculateMatch(pageIdx);
+            });
+          }
+        }
+      }
+      if (this._state.query === '') {
+        this._updateUIState(FindState.FOUND);
+        return;
+      }
+      if (this._resumePageIdx) {
+        return;
+      }
+      var offset = this._offset;
+      this._pagesToSearch = numPages;
+      if (offset.matchIdx !== null) {
+        var numPageMatches = this._pageMatches[offset.pageIdx].length;
+        if (!previous && offset.matchIdx + 1 < numPageMatches || previous && offset.matchIdx > 0) {
+          offset.matchIdx = previous ? offset.matchIdx - 1 : offset.matchIdx + 1;
+          this._updateMatch(true);
+          return;
+        }
+        this._advanceOffsetPage(previous);
+      }
+      this._nextPageMatch();
+    }
+  }, {
+    key: '_matchesReady',
+    value: function _matchesReady(matches) {
+      var offset = this._offset;
+      var numMatches = matches.length;
+      var previous = this._state.findPrevious;
+      if (numMatches) {
+        offset.matchIdx = previous ? numMatches - 1 : 0;
+        this._updateMatch(true);
+        return true;
+      }
+      this._advanceOffsetPage(previous);
+      if (offset.wrapped) {
+        offset.matchIdx = null;
+        if (this._pagesToSearch < 0) {
+          this._updateMatch(false);
+          return true;
+        }
+      }
+      return false;
+    }
+  }, {
+    key: '_nextPageMatch',
+    value: function _nextPageMatch() {
+      if (this._resumePageIdx !== null) {
+        console.error('There can only be one pending page.');
+      }
+      var matches = null;
+      do {
+        var pageIdx = this._offset.pageIdx;
+        matches = this._pageMatches[pageIdx];
+        if (!matches) {
+          this._resumePageIdx = pageIdx;
+          break;
+        }
+      } while (!this._matchesReady(matches));
+    }
+  }, {
+    key: '_advanceOffsetPage',
+    value: function _advanceOffsetPage(previous) {
+      var offset = this._offset;
+      var numPages = this._linkService.pagesCount;
+      offset.pageIdx = previous ? offset.pageIdx - 1 : offset.pageIdx + 1;
+      offset.matchIdx = null;
+      this._pagesToSearch--;
+      if (offset.pageIdx >= numPages || offset.pageIdx < 0) {
+        offset.pageIdx = previous ? numPages - 1 : 0;
+        offset.wrapped = true;
+      }
+    }
+  }, {
+    key: '_updateMatch',
+    value: function _updateMatch() {
+      var found = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+
+      var state = FindState.NOT_FOUND;
+      var wrapped = this._offset.wrapped;
+      this._offset.wrapped = false;
+      if (found) {
+        var previousPage = this._selected.pageIdx;
+        this._selected.pageIdx = this._offset.pageIdx;
+        this._selected.matchIdx = this._offset.matchIdx;
+        state = wrapped ? FindState.WRAPPED : FindState.FOUND;
+        if (previousPage !== -1 && previousPage !== this._selected.pageIdx) {
+          this._updatePage(previousPage);
+        }
+      }
+      this._updateUIState(state, this._state.findPrevious);
+      if (this._selected.pageIdx !== -1) {
+        this._updatePage(this._selected.pageIdx);
+      }
+    }
+  }, {
+    key: '_onFindBarClose',
+    value: function _onFindBarClose(evt) {
+      var _this4 = this;
+
+      var pdfDocument = this._pdfDocument;
+      this._firstPageCapability.promise.then(function () {
+        if (!_this4._pdfDocument || pdfDocument && _this4._pdfDocument !== pdfDocument) {
+          return;
+        }
+        if (_this4._findTimeout) {
+          clearTimeout(_this4._findTimeout);
+          _this4._findTimeout = null;
+          _this4._updateUIState(FindState.FOUND);
+        }
+        _this4._highlightMatches = false;
+        _this4._eventBus.dispatch('updatetextlayermatches', {
+          source: _this4,
+          pageIndex: -1
+        });
+      });
+    }
+  }, {
+    key: '_requestMatchesCount',
+    value: function _requestMatchesCount() {
+      var _selected = this._selected,
+          pageIdx = _selected.pageIdx,
+          matchIdx = _selected.matchIdx;
+
+      var current = 0,
+          total = this._matchesCountTotal;
+      if (matchIdx !== -1) {
+        for (var i = 0; i < pageIdx; i++) {
+          current += this._pageMatches[i] && this._pageMatches[i].length || 0;
+        }
+        current += matchIdx + 1;
+      }
+      if (current < 1 || current > total) {
+        current = total = 0;
+      }
+      return {
+        current: current,
+        total: total
+      };
+    }
+  }, {
+    key: '_updateUIResultsCount',
+    value: function _updateUIResultsCount() {
+      this._eventBus.dispatch('updatefindmatchescount', {
+        source: this,
+        matchesCount: this._requestMatchesCount()
+      });
+    }
+  }, {
+    key: '_updateUIState',
+    value: function _updateUIState(state, previous) {
+      this._eventBus.dispatch('updatefindcontrolstate', {
+        source: this,
+        state: state,
+        previous: previous,
+        matchesCount: this._requestMatchesCount()
+      });
+    }
+  }, {
+    key: 'highlightMatches',
+    get: function get() {
+      return this._highlightMatches;
+    }
+  }, {
+    key: 'pageMatches',
+    get: function get() {
+      return this._pageMatches;
+    }
+  }, {
+    key: 'pageMatchesLength',
+    get: function get() {
+      return this._pageMatchesLength;
+    }
+  }, {
+    key: 'selected',
+    get: function get() {
+      return this._selected;
+    }
+  }, {
+    key: 'state',
+    get: function get() {
+      return this._state;
+    }
+  }]);
+
+  return PDFFindController;
+}();
+
+exports.FindState = FindState;
+exports.PDFFindController = PDFFindController;
+
+/***/ }),
+/* 21 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+var CharacterType = {
+  SPACE: 0,
+  ALPHA_LETTER: 1,
+  PUNCT: 2,
+  HAN_LETTER: 3,
+  KATAKANA_LETTER: 4,
+  HIRAGANA_LETTER: 5,
+  HALFWIDTH_KATAKANA_LETTER: 6,
+  THAI_LETTER: 7
+};
+function isAlphabeticalScript(charCode) {
+  return charCode < 0x2E80;
+}
+function isAscii(charCode) {
+  return (charCode & 0xFF80) === 0;
+}
+function isAsciiAlpha(charCode) {
+  return charCode >= 0x61 && charCode <= 0x7A || charCode >= 0x41 && charCode <= 0x5A;
+}
+function isAsciiDigit(charCode) {
+  return charCode >= 0x30 && charCode <= 0x39;
+}
+function isAsciiSpace(charCode) {
+  return charCode === 0x20 || charCode === 0x09 || charCode === 0x0D || charCode === 0x0A;
+}
+function isHan(charCode) {
+  return charCode >= 0x3400 && charCode <= 0x9FFF || charCode >= 0xF900 && charCode <= 0xFAFF;
+}
+function isKatakana(charCode) {
+  return charCode >= 0x30A0 && charCode <= 0x30FF;
+}
+function isHiragana(charCode) {
+  return charCode >= 0x3040 && charCode <= 0x309F;
+}
+function isHalfwidthKatakana(charCode) {
+  return charCode >= 0xFF60 && charCode <= 0xFF9F;
+}
+function isThai(charCode) {
+  return (charCode & 0xFF80) === 0x0E00;
+}
+function getCharacterType(charCode) {
+  if (isAlphabeticalScript(charCode)) {
+    if (isAscii(charCode)) {
+      if (isAsciiSpace(charCode)) {
+        return CharacterType.SPACE;
+      } else if (isAsciiAlpha(charCode) || isAsciiDigit(charCode) || charCode === 0x5F) {
+        return CharacterType.ALPHA_LETTER;
+      }
+      return CharacterType.PUNCT;
+    } else if (isThai(charCode)) {
+      return CharacterType.THAI_LETTER;
+    } else if (charCode === 0xA0) {
+      return CharacterType.SPACE;
+    }
+    return CharacterType.ALPHA_LETTER;
+  }
+  if (isHan(charCode)) {
+    return CharacterType.HAN_LETTER;
+  } else if (isKatakana(charCode)) {
+    return CharacterType.KATAKANA_LETTER;
+  } else if (isHiragana(charCode)) {
+    return CharacterType.HIRAGANA_LETTER;
+  } else if (isHalfwidthKatakana(charCode)) {
+    return CharacterType.HALFWIDTH_KATAKANA_LETTER;
+  }
+  return CharacterType.ALPHA_LETTER;
+}
+exports.CharacterType = CharacterType;
+exports.getCharacterType = getCharacterType;
+
+/***/ }),
+/* 22 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.isDestArraysEqual = exports.isDestHashesEqual = exports.PDFHistory = undefined;
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _ui_utils = __webpack_require__(6);
+
+var _dom_events = __webpack_require__(14);
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var HASH_CHANGE_TIMEOUT = 1000;
+var POSITION_UPDATED_THRESHOLD = 50;
+var UPDATE_VIEWAREA_TIMEOUT = 1000;
+function getCurrentHash() {
+  return document.location.hash;
+}
+function parseCurrentHash(linkService) {
+  var hash = unescape(getCurrentHash()).substring(1);
+  var params = (0, _ui_utils.parseQueryString)(hash);
+  var page = params.page | 0;
+  if (!(Number.isInteger(page) && page > 0 && page <= linkService.pagesCount)) {
+    page = null;
+  }
+  return {
+    hash: hash,
+    page: page,
+    rotation: linkService.rotation
+  };
+}
+
+var PDFHistory = function () {
+  function PDFHistory(_ref) {
+    var _this = this;
+
+    var linkService = _ref.linkService,
+        eventBus = _ref.eventBus;
+
+    _classCallCheck(this, PDFHistory);
+
+    this.linkService = linkService;
+    this.eventBus = eventBus || (0, _dom_events.getGlobalEventBus)();
+    this.initialized = false;
+    this.initialBookmark = null;
+    this.initialRotation = null;
+    this._boundEvents = Object.create(null);
+    this._isViewerInPresentationMode = false;
+    this._isPagesLoaded = false;
+    this.eventBus.on('presentationmodechanged', function (evt) {
+      _this._isViewerInPresentationMode = evt.active || evt.switchInProgress;
+    });
+    this.eventBus.on('pagesloaded', function (evt) {
+      _this._isPagesLoaded = !!evt.pagesCount;
+    });
+  }
+
+  _createClass(PDFHistory, [{
+    key: 'initialize',
+    value: function initialize(fingerprint) {
+      var resetHistory = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+
+      if (!fingerprint || typeof fingerprint !== 'string') {
+        console.error('PDFHistory.initialize: The "fingerprint" must be a non-empty string.');
+        return;
+      }
+      var reInitialized = this.initialized && this.fingerprint !== fingerprint;
+      this.fingerprint = fingerprint;
+      if (!this.initialized) {
+        this._bindEvents();
+      }
+      var state = window.history.state;
+      this.initialized = true;
+      this.initialBookmark = null;
+      this.initialRotation = null;
+      this._popStateInProgress = false;
+      this._blockHashChange = 0;
+      this._currentHash = getCurrentHash();
+      this._numPositionUpdates = 0;
+      this._uid = this._maxUid = 0;
+      this._destination = null;
+      this._position = null;
+      if (!this._isValidState(state) || resetHistory) {
+        var _parseCurrentHash = parseCurrentHash(this.linkService),
+            hash = _parseCurrentHash.hash,
+            page = _parseCurrentHash.page,
+            rotation = _parseCurrentHash.rotation;
+
+        if (!hash || reInitialized || resetHistory) {
+          this._pushOrReplaceState(null, true);
+          return;
+        }
+        this._pushOrReplaceState({
+          hash: hash,
+          page: page,
+          rotation: rotation
+        }, true);
+        return;
+      }
+      var destination = state.destination;
+      this._updateInternalState(destination, state.uid, true);
+      if (this._uid > this._maxUid) {
+        this._maxUid = this._uid;
+      }
+      if (destination.rotation !== undefined) {
+        this.initialRotation = destination.rotation;
+      }
+      if (destination.dest) {
+        this.initialBookmark = JSON.stringify(destination.dest);
+        this._destination.page = null;
+      } else if (destination.hash) {
+        this.initialBookmark = destination.hash;
+      } else if (destination.page) {
+        this.initialBookmark = 'page=' + destination.page;
+      }
+    }
+  }, {
+    key: 'push',
+    value: function push(_ref2) {
+      var _this2 = this;
+
+      var namedDest = _ref2.namedDest,
+          explicitDest = _ref2.explicitDest,
+          pageNumber = _ref2.pageNumber;
+
+      if (!this.initialized) {
+        return;
+      }
+      if (namedDest && typeof namedDest !== 'string' || !Array.isArray(explicitDest) || !(Number.isInteger(pageNumber) && pageNumber > 0 && pageNumber <= this.linkService.pagesCount)) {
+        console.error('PDFHistory.push: Invalid parameters.');
+        return;
+      }
+      var hash = namedDest || JSON.stringify(explicitDest);
+      if (!hash) {
+        return;
+      }
+      var forceReplace = false;
+      if (this._destination && (isDestHashesEqual(this._destination.hash, hash) || isDestArraysEqual(this._destination.dest, explicitDest))) {
+        if (this._destination.page) {
+          return;
+        }
+        forceReplace = true;
+      }
+      if (this._popStateInProgress && !forceReplace) {
+        return;
+      }
+      this._pushOrReplaceState({
+        dest: explicitDest,
+        hash: hash,
+        page: pageNumber,
+        rotation: this.linkService.rotation
+      }, forceReplace);
+      if (!this._popStateInProgress) {
+        this._popStateInProgress = true;
+        Promise.resolve().then(function () {
+          _this2._popStateInProgress = false;
+        });
+      }
+    }
+  }, {
+    key: 'pushCurrentPosition',
+    value: function pushCurrentPosition() {
+      if (!this.initialized || this._popStateInProgress) {
+        return;
+      }
+      this._tryPushCurrentPosition();
+    }
+  }, {
+    key: 'back',
+    value: function back() {
+      if (!this.initialized || this._popStateInProgress) {
+        return;
+      }
+      var state = window.history.state;
+      if (this._isValidState(state) && state.uid > 0) {
+        window.history.back();
+      }
+    }
+  }, {
+    key: 'forward',
+    value: function forward() {
+      if (!this.initialized || this._popStateInProgress) {
+        return;
+      }
+      var state = window.history.state;
+      if (this._isValidState(state) && state.uid < this._maxUid) {
+        window.history.forward();
+      }
+    }
+  }, {
+    key: '_pushOrReplaceState',
+    value: function _pushOrReplaceState(destination) {
+      var forceReplace = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+
+      var shouldReplace = forceReplace || !this._destination;
+      var newState = {
+        fingerprint: this.fingerprint,
+        uid: shouldReplace ? this._uid : this._uid + 1,
+        destination: destination
+      };
+      this._updateInternalState(destination, newState.uid);
+      if (shouldReplace) {
+        window.history.replaceState(newState, '');
+      } else {
+        this._maxUid = this._uid;
+        window.history.pushState(newState, '');
+      }
+    }
+  }, {
+    key: '_tryPushCurrentPosition',
+    value: function _tryPushCurrentPosition() {
+      var temporary = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+
+      if (!this._position) {
+        return;
+      }
+      var position = this._position;
+      if (temporary) {
+        position = Object.assign(Object.create(null), this._position);
+        position.temporary = true;
+      }
+      if (!this._destination) {
+        this._pushOrReplaceState(position);
+        return;
+      }
+      if (this._destination.temporary) {
+        this._pushOrReplaceState(position, true);
+        return;
+      }
+      if (this._destination.hash === position.hash) {
+        return;
+      }
+      if (!this._destination.page && (POSITION_UPDATED_THRESHOLD <= 0 || this._numPositionUpdates <= POSITION_UPDATED_THRESHOLD)) {
+        return;
+      }
+      var forceReplace = false;
+      if (this._destination.page === position.first || this._destination.page === position.page) {
+        if (this._destination.dest || !this._destination.first) {
+          return;
+        }
+        forceReplace = true;
+      }
+      this._pushOrReplaceState(position, forceReplace);
+    }
+  }, {
+    key: '_isValidState',
+    value: function _isValidState(state) {
+      if (!state) {
+        return false;
+      }
+      if (state.fingerprint !== this.fingerprint) {
+        return false;
+      }
+      if (!Number.isInteger(state.uid) || state.uid < 0) {
+        return false;
+      }
+      if (state.destination === null || _typeof(state.destination) !== 'object') {
+        return false;
+      }
+      return true;
+    }
+  }, {
+    key: '_updateInternalState',
+    value: function _updateInternalState(destination, uid) {
+      var removeTemporary = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
+
+      if (this._updateViewareaTimeout) {
+        clearTimeout(this._updateViewareaTimeout);
+        this._updateViewareaTimeout = null;
+      }
+      if (removeTemporary && destination && destination.temporary) {
+        delete destination.temporary;
+      }
+      this._destination = destination;
+      this._uid = uid;
+      this._numPositionUpdates = 0;
+    }
+  }, {
+    key: '_updateViewarea',
+    value: function _updateViewarea(_ref3) {
+      var _this3 = this;
+
+      var location = _ref3.location;
+
+      if (this._updateViewareaTimeout) {
+        clearTimeout(this._updateViewareaTimeout);
+        this._updateViewareaTimeout = null;
+      }
+      this._position = {
+        hash: this._isViewerInPresentationMode ? 'page=' + location.pageNumber : location.pdfOpenParams.substring(1),
+        page: this.linkService.page,
+        first: location.pageNumber,
+        rotation: location.rotation
+      };
+      if (this._popStateInProgress) {
+        return;
+      }
+      if (POSITION_UPDATED_THRESHOLD > 0 && this._isPagesLoaded && this._destination && !this._destination.page) {
+        this._numPositionUpdates++;
+      }
+      if (UPDATE_VIEWAREA_TIMEOUT > 0) {
+        this._updateViewareaTimeout = setTimeout(function () {
+          if (!_this3._popStateInProgress) {
+            _this3._tryPushCurrentPosition(true);
+          }
+          _this3._updateViewareaTimeout = null;
+        }, UPDATE_VIEWAREA_TIMEOUT);
+      }
+    }
+  }, {
+    key: '_popState',
+    value: function _popState(_ref4) {
+      var _this4 = this;
+
+      var state = _ref4.state;
+
+      var newHash = getCurrentHash(),
+          hashChanged = this._currentHash !== newHash;
+      this._currentHash = newHash;
+      if (!state || false) {
+        this._uid++;
+
+        var _parseCurrentHash2 = parseCurrentHash(this.linkService),
+            hash = _parseCurrentHash2.hash,
+            page = _parseCurrentHash2.page,
+            rotation = _parseCurrentHash2.rotation;
+
+        this._pushOrReplaceState({
+          hash: hash,
+          page: page,
+          rotation: rotation
+        }, true);
+        return;
+      }
+      if (!this._isValidState(state)) {
+        return;
+      }
+      this._popStateInProgress = true;
+      if (hashChanged) {
+        this._blockHashChange++;
+        (0, _ui_utils.waitOnEventOrTimeout)({
+          target: window,
+          name: 'hashchange',
+          delay: HASH_CHANGE_TIMEOUT
+        }).then(function () {
+          _this4._blockHashChange--;
+        });
+      }
+      var destination = state.destination;
+      this._updateInternalState(destination, state.uid, true);
+      if (this._uid > this._maxUid) {
+        this._maxUid = this._uid;
+      }
+      if ((0, _ui_utils.isValidRotation)(destination.rotation)) {
+        this.linkService.rotation = destination.rotation;
+      }
+      if (destination.dest) {
+        this.linkService.navigateTo(destination.dest);
+      } else if (destination.hash) {
+        this.linkService.setHash(destination.hash);
+      } else if (destination.page) {
+        this.linkService.page = destination.page;
+      }
+      Promise.resolve().then(function () {
+        _this4._popStateInProgress = false;
+      });
+    }
+  }, {
+    key: '_bindEvents',
+    value: function _bindEvents() {
+      var _this5 = this;
+
+      var _boundEvents = this._boundEvents,
+          eventBus = this.eventBus;
+
+      _boundEvents.updateViewarea = this._updateViewarea.bind(this);
+      _boundEvents.popState = this._popState.bind(this);
+      _boundEvents.pageHide = function (evt) {
+        if (!_this5._destination || _this5._destination.temporary) {
+          _this5._tryPushCurrentPosition();
+        }
+      };
+      eventBus.on('updateviewarea', _boundEvents.updateViewarea);
+      window.addEventListener('popstate', _boundEvents.popState);
+      window.addEventListener('pagehide', _boundEvents.pageHide);
+    }
+  }, {
+    key: 'popStateInProgress',
+    get: function get() {
+      return this.initialized && (this._popStateInProgress || this._blockHashChange > 0);
+    }
+  }]);
+
+  return PDFHistory;
+}();
+
+function isDestHashesEqual(destHash, pushHash) {
+  if (typeof destHash !== 'string' || typeof pushHash !== 'string') {
+    return false;
+  }
+  if (destHash === pushHash) {
+    return true;
+  }
+
+  var _parseQueryString = (0, _ui_utils.parseQueryString)(destHash),
+      nameddest = _parseQueryString.nameddest;
+
+  if (nameddest === pushHash) {
+    return true;
+  }
+  return false;
+}
+function isDestArraysEqual(firstDest, secondDest) {
+  function isEntryEqual(first, second) {
+    if ((typeof first === 'undefined' ? 'undefined' : _typeof(first)) !== (typeof second === 'undefined' ? 'undefined' : _typeof(second))) {
+      return false;
+    }
+    if (Array.isArray(first) || Array.isArray(second)) {
+      return false;
+    }
+    if (first !== null && (typeof first === 'undefined' ? 'undefined' : _typeof(first)) === 'object' && second !== null) {
+      if (Object.keys(first).length !== Object.keys(second).length) {
+        return false;
+      }
+      for (var key in first) {
+        if (!isEntryEqual(first[key], second[key])) {
+          return false;
+        }
+      }
+      return true;
+    }
+    return first === second || Number.isNaN(first) && Number.isNaN(second);
+  }
+  if (!(Array.isArray(firstDest) && Array.isArray(secondDest))) {
+    return false;
+  }
+  if (firstDest.length !== secondDest.length) {
+    return false;
+  }
+  for (var i = 0, ii = firstDest.length; i < ii; i++) {
+    if (!isEntryEqual(firstDest[i], secondDest[i])) {
+      return false;
+    }
+  }
+  return true;
+}
+exports.PDFHistory = PDFHistory;
+exports.isDestHashesEqual = isDestHashesEqual;
+exports.isDestArraysEqual = isDestArraysEqual;
+
+/***/ }),
+/* 23 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.SimpleLinkService = exports.PDFLinkService = undefined;
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _dom_events = __webpack_require__(14);
+
+var _ui_utils = __webpack_require__(6);
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var PDFLinkService = function () {
+  function PDFLinkService() {
+    var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
+        eventBus = _ref.eventBus,
+        _ref$externalLinkTarg = _ref.externalLinkTarget,
+        externalLinkTarget = _ref$externalLinkTarg === undefined ? null : _ref$externalLinkTarg,
+        _ref$externalLinkRel = _ref.externalLinkRel,
+        externalLinkRel = _ref$externalLinkRel === undefined ? null : _ref$externalLinkRel;
+
+    _classCallCheck(this, PDFLinkService);
+
+    this.eventBus = eventBus || (0, _dom_events.getGlobalEventBus)();
+    this.externalLinkTarget = externalLinkTarget;
+    this.externalLinkRel = externalLinkRel;
+    this.baseUrl = null;
+    this.pdfDocument = null;
+    this.pdfViewer = null;
+    this.pdfHistory = null;
+    this._pagesRefCache = null;
+  }
+
+  _createClass(PDFLinkService, [{
+    key: 'setDocument',
+    value: function setDocument(pdfDocument) {
+      var baseUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
+
+      this.baseUrl = baseUrl;
+      this.pdfDocument = pdfDocument;
+      this._pagesRefCache = Object.create(null);
+    }
+  }, {
+    key: 'setViewer',
+    value: function setViewer(pdfViewer) {
+      this.pdfViewer = pdfViewer;
+    }
+  }, {
+    key: 'setHistory',
+    value: function setHistory(pdfHistory) {
+      this.pdfHistory = pdfHistory;
+    }
+  }, {
+    key: 'navigateTo',
+    value: function navigateTo(dest) {
+      var _this = this;
+
+      var goToDestination = function goToDestination(_ref2) {
+        var namedDest = _ref2.namedDest,
+            explicitDest = _ref2.explicitDest;
+
+        var destRef = explicitDest[0],
+            pageNumber = void 0;
+        if (destRef instanceof Object) {
+          pageNumber = _this._cachedPageNumber(destRef);
+          if (pageNumber === null) {
+            _this.pdfDocument.getPageIndex(destRef).then(function (pageIndex) {
+              _this.cachePageRef(pageIndex + 1, destRef);
+              goToDestination({
+                namedDest: namedDest,
+                explicitDest: explicitDest
+              });
+            }).catch(function () {
+              console.error('PDFLinkService.navigateTo: "' + destRef + '" is not ' + ('a valid page reference, for dest="' + dest + '".'));
+            });
+            return;
+          }
+        } else if (Number.isInteger(destRef)) {
+          pageNumber = destRef + 1;
+        } else {
+          console.error('PDFLinkService.navigateTo: "' + destRef + '" is not ' + ('a valid destination reference, for dest="' + dest + '".'));
+          return;
+        }
+        if (!pageNumber || pageNumber < 1 || pageNumber > _this.pagesCount) {
+          console.error('PDFLinkService.navigateTo: "' + pageNumber + '" is not ' + ('a valid page number, for dest="' + dest + '".'));
+          return;
+        }
+        if (_this.pdfHistory) {
+          _this.pdfHistory.pushCurrentPosition();
+          _this.pdfHistory.push({
+            namedDest: namedDest,
+            explicitDest: explicitDest,
+            pageNumber: pageNumber
+          });
+        }
+        _this.pdfViewer.scrollPageIntoView({
+          pageNumber: pageNumber,
+          destArray: explicitDest
+        });
+      };
+      new Promise(function (resolve, reject) {
+        if (typeof dest === 'string') {
+          _this.pdfDocument.getDestination(dest).then(function (destArray) {
+            resolve({
+              namedDest: dest,
+              explicitDest: destArray
+            });
+          });
+          return;
+        }
+        resolve({
+          namedDest: '',
+          explicitDest: dest
+        });
+      }).then(function (data) {
+        if (!Array.isArray(data.explicitDest)) {
+          console.error('PDFLinkService.navigateTo: "' + data.explicitDest + '" is' + (' not a valid destination array, for dest="' + dest + '".'));
+          return;
+        }
+        goToDestination(data);
+      });
+    }
+  }, {
+    key: 'getDestinationHash',
+    value: function getDestinationHash(dest) {
+      if (typeof dest === 'string') {
+        return this.getAnchorUrl('#' + escape(dest));
+      }
+      if (Array.isArray(dest)) {
+        var str = JSON.stringify(dest);
+        return this.getAnchorUrl('#' + escape(str));
+      }
+      return this.getAnchorUrl('');
+    }
+  }, {
+    key: 'getAnchorUrl',
+    value: function getAnchorUrl(anchor) {
+      return (this.baseUrl || '') + anchor;
+    }
+  }, {
+    key: 'setHash',
+    value: function setHash(hash) {
+      var pageNumber = void 0,
+          dest = void 0;
+      if (hash.includes('=')) {
+        var params = (0, _ui_utils.parseQueryString)(hash);
+        if ('search' in params) {
+          this.eventBus.dispatch('findfromurlhash', {
+            source: this,
+            query: params['search'].replace(/"/g, ''),
+            phraseSearch: params['phrase'] === 'true'
+          });
+        }
+        if ('nameddest' in params) {
+          this.navigateTo(params.nameddest);
+          return;
+        }
+        if ('page' in params) {
+          pageNumber = params.page | 0 || 1;
+        }
+        if ('zoom' in params) {
+          var zoomArgs = params.zoom.split(',');
+          var zoomArg = zoomArgs[0];
+          var zoomArgNumber = parseFloat(zoomArg);
+          if (!zoomArg.includes('Fit')) {
+            dest = [null, { name: 'XYZ' }, zoomArgs.length > 1 ? zoomArgs[1] | 0 : null, zoomArgs.length > 2 ? zoomArgs[2] | 0 : null, zoomArgNumber ? zoomArgNumber / 100 : zoomArg];
+          } else {
+            if (zoomArg === 'Fit' || zoomArg === 'FitB') {
+              dest = [null, { name: zoomArg }];
+            } else if (zoomArg === 'FitH' || zoomArg === 'FitBH' || zoomArg === 'FitV' || zoomArg === 'FitBV') {
+              dest = [null, { name: zoomArg }, zoomArgs.length > 1 ? zoomArgs[1] | 0 : null];
+            } else if (zoomArg === 'FitR') {
+              if (zoomArgs.length !== 5) {
+                console.error('PDFLinkService.setHash: Not enough parameters for "FitR".');
+              } else {
+                dest = [null, { name: zoomArg }, zoomArgs[1] | 0, zoomArgs[2] | 0, zoomArgs[3] | 0, zoomArgs[4] | 0];
+              }
+            } else {
+              console.error('PDFLinkService.setHash: "' + zoomArg + '" is not ' + 'a valid zoom value.');
+            }
+          }
+        }
+        if (dest) {
+          this.pdfViewer.scrollPageIntoView({
+            pageNumber: pageNumber || this.page,
+            destArray: dest,
+            allowNegativeOffset: true
+          });
+        } else if (pageNumber) {
+          this.page = pageNumber;
+        }
+        if ('pagemode' in params) {
+          this.eventBus.dispatch('pagemode', {
+            source: this,
+            mode: params.pagemode
+          });
+        }
+      } else {
+        dest = unescape(hash);
+        try {
+          dest = JSON.parse(dest);
+          if (!Array.isArray(dest)) {
+            dest = dest.toString();
+          }
+        } catch (ex) {}
+        if (typeof dest === 'string' || isValidExplicitDestination(dest)) {
+          this.navigateTo(dest);
+          return;
+        }
+        console.error('PDFLinkService.setHash: "' + unescape(hash) + '" is not ' + 'a valid destination.');
+      }
+    }
+  }, {
+    key: 'executeNamedAction',
+    value: function executeNamedAction(action) {
+      switch (action) {
+        case 'GoBack':
+          if (this.pdfHistory) {
+            this.pdfHistory.back();
+          }
+          break;
+        case 'GoForward':
+          if (this.pdfHistory) {
+            this.pdfHistory.forward();
+          }
+          break;
+        case 'NextPage':
+          if (this.page < this.pagesCount) {
+            this.page++;
+          }
+          break;
+        case 'PrevPage':
+          if (this.page > 1) {
+            this.page--;
+          }
+          break;
+        case 'LastPage':
+          this.page = this.pagesCount;
+          break;
+        case 'FirstPage':
+          this.page = 1;
+          break;
+        default:
+          break;
+      }
+      this.eventBus.dispatch('namedaction', {
+        source: this,
+        action: action
+      });
+    }
+  }, {
+    key: 'cachePageRef',
+    value: function cachePageRef(pageNum, pageRef) {
+      if (!pageRef) {
+        return;
+      }
+      var refStr = pageRef.num + ' ' + pageRef.gen + ' R';
+      this._pagesRefCache[refStr] = pageNum;
+    }
+  }, {
+    key: '_cachedPageNumber',
+    value: function _cachedPageNumber(pageRef) {
+      var refStr = pageRef.num + ' ' + pageRef.gen + ' R';
+      return this._pagesRefCache && this._pagesRefCache[refStr] || null;
+    }
+  }, {
+    key: 'pagesCount',
+    get: function get() {
+      return this.pdfDocument ? this.pdfDocument.numPages : 0;
+    }
+  }, {
+    key: 'page',
+    get: function get() {
+      return this.pdfViewer.currentPageNumber;
+    },
+    set: function set(value) {
+      this.pdfViewer.currentPageNumber = value;
+    }
+  }, {
+    key: 'rotation',
+    get: function get() {
+      return this.pdfViewer.pagesRotation;
+    },
+    set: function set(value) {
+      this.pdfViewer.pagesRotation = value;
+    }
+  }]);
+
+  return PDFLinkService;
+}();
+
+function isValidExplicitDestination(dest) {
+  if (!Array.isArray(dest)) {
+    return false;
+  }
+  var destLength = dest.length,
+      allowNull = true;
+  if (destLength < 2) {
+    return false;
+  }
+  var page = dest[0];
+  if (!((typeof page === 'undefined' ? 'undefined' : _typeof(page)) === 'object' && Number.isInteger(page.num) && Number.isInteger(page.gen)) && !(Number.isInteger(page) && page >= 0)) {
+    return false;
+  }
+  var zoom = dest[1];
+  if (!((typeof zoom === 'undefined' ? 'undefined' : _typeof(zoom)) === 'object' && typeof zoom.name === 'string')) {
+    return false;
+  }
+  switch (zoom.name) {
+    case 'XYZ':
+      if (destLength !== 5) {
+        return false;
+      }
+      break;
+    case 'Fit':
+    case 'FitB':
+      return destLength === 2;
+    case 'FitH':
+    case 'FitBH':
+    case 'FitV':
+    case 'FitBV':
+      if (destLength !== 3) {
+        return false;
+      }
+      break;
+    case 'FitR':
+      if (destLength !== 6) {
+        return false;
+      }
+      allowNull = false;
+      break;
+    default:
+      return false;
+  }
+  for (var i = 2; i < destLength; i++) {
+    var param = dest[i];
+    if (!(typeof param === 'number' || allowNull && param === null)) {
+      return false;
+    }
+  }
+  return true;
+}
+
+var SimpleLinkService = function () {
+  function SimpleLinkService() {
+    _classCallCheck(this, SimpleLinkService);
+
+    this.externalLinkTarget = null;
+    this.externalLinkRel = null;
+  }
+
+  _createClass(SimpleLinkService, [{
+    key: 'navigateTo',
+    value: function navigateTo(dest) {}
+  }, {
+    key: 'getDestinationHash',
+    value: function getDestinationHash(dest) {
+      return '#';
+    }
+  }, {
+    key: 'getAnchorUrl',
+    value: function getAnchorUrl(hash) {
+      return '#';
+    }
+  }, {
+    key: 'setHash',
+    value: function setHash(hash) {}
+  }, {
+    key: 'executeNamedAction',
+    value: function executeNamedAction(action) {}
+  }, {
+    key: 'cachePageRef',
+    value: function cachePageRef(pageNum, pageRef) {}
+  }, {
+    key: 'pagesCount',
+    get: function get() {
+      return 0;
+    }
+  }, {
+    key: 'page',
+    get: function get() {
+      return 0;
+    },
+    set: function set(value) {}
+  }, {
+    key: 'rotation',
+    get: function get() {
+      return 0;
+    },
+    set: function set(value) {}
+  }]);
+
+  return SimpleLinkService;
+}();
+
+exports.PDFLinkService = PDFLinkService;
+exports.SimpleLinkService = SimpleLinkService;
+
+/***/ }),
+/* 24 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.PDFOutlineViewer = undefined;
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _pdfjsLib = __webpack_require__(7);
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var DEFAULT_TITLE = '\u2013';
+
+var PDFOutlineViewer = function () {
+  function PDFOutlineViewer(_ref) {
+    var container = _ref.container,
+        linkService = _ref.linkService,
+        eventBus = _ref.eventBus;
+
+    _classCallCheck(this, PDFOutlineViewer);
+
+    this.container = container;
+    this.linkService = linkService;
+    this.eventBus = eventBus;
+    this.reset();
+    eventBus.on('toggleoutlinetree', this.toggleOutlineTree.bind(this));
+  }
+
+  _createClass(PDFOutlineViewer, [{
+    key: 'reset',
+    value: function reset() {
+      this.outline = null;
+      this.lastToggleIsShow = true;
+      this.container.textContent = '';
+      this.container.classList.remove('outlineWithDeepNesting');
+    }
+  }, {
+    key: '_dispatchEvent',
+    value: function _dispatchEvent(outlineCount) {
+      this.eventBus.dispatch('outlineloaded', {
+        source: this,
+        outlineCount: outlineCount
+      });
+    }
+  }, {
+    key: '_bindLink',
+    value: function _bindLink(element, _ref2) {
+      var url = _ref2.url,
+          newWindow = _ref2.newWindow,
+          dest = _ref2.dest;
+      var linkService = this.linkService;
+
+      if (url) {
+        (0, _pdfjsLib.addLinkAttributes)(element, {
+          url: url,
+          target: newWindow ? _pdfjsLib.LinkTarget.BLANK : linkService.externalLinkTarget,
+          rel: linkService.externalLinkRel
+        });
+        return;
+      }
+      element.href = linkService.getDestinationHash(dest);
+      element.onclick = function () {
+        if (dest) {
+          linkService.navigateTo(dest);
+        }
+        return false;
+      };
+    }
+  }, {
+    key: '_setStyles',
+    value: function _setStyles(element, _ref3) {
+      var bold = _ref3.bold,
+          italic = _ref3.italic;
+
+      var styleStr = '';
+      if (bold) {
+        styleStr += 'font-weight: bold;';
+      }
+      if (italic) {
+        styleStr += 'font-style: italic;';
+      }
+      if (styleStr) {
+        element.setAttribute('style', styleStr);
+      }
+    }
+  }, {
+    key: '_addToggleButton',
+    value: function _addToggleButton(div) {
+      var _this = this;
+
+      var toggler = document.createElement('div');
+      toggler.className = 'outlineItemToggler';
+      toggler.onclick = function (evt) {
+        evt.stopPropagation();
+        toggler.classList.toggle('outlineItemsHidden');
+        if (evt.shiftKey) {
+          var shouldShowAll = !toggler.classList.contains('outlineItemsHidden');
+          _this._toggleOutlineItem(div, shouldShowAll);
+        }
+      };
+      div.insertBefore(toggler, div.firstChild);
+    }
+  }, {
+    key: '_toggleOutlineItem',
+    value: function _toggleOutlineItem(root, show) {
+      this.lastToggleIsShow = show;
+      var togglers = root.querySelectorAll('.outlineItemToggler');
+      for (var i = 0, ii = togglers.length; i < ii; ++i) {
+        togglers[i].classList[show ? 'remove' : 'add']('outlineItemsHidden');
+      }
+    }
+  }, {
+    key: 'toggleOutlineTree',
+    value: function toggleOutlineTree() {
+      if (!this.outline) {
+        return;
+      }
+      this._toggleOutlineItem(this.container, !this.lastToggleIsShow);
+    }
+  }, {
+    key: 'render',
+    value: function render(_ref4) {
+      var outline = _ref4.outline;
+
+      var outlineCount = 0;
+      if (this.outline) {
+        this.reset();
+      }
+      this.outline = outline || null;
+      if (!outline) {
+        this._dispatchEvent(outlineCount);
+        return;
+      }
+      var fragment = document.createDocumentFragment();
+      var queue = [{
+        parent: fragment,
+        items: this.outline
+      }];
+      var hasAnyNesting = false;
+      while (queue.length > 0) {
+        var levelData = queue.shift();
+        for (var i = 0, len = levelData.items.length; i < len; i++) {
+          var item = levelData.items[i];
+          var div = document.createElement('div');
+          div.className = 'outlineItem';
+          var element = document.createElement('a');
+          this._bindLink(element, item);
+          this._setStyles(element, item);
+          element.textContent = (0, _pdfjsLib.removeNullCharacters)(item.title) || DEFAULT_TITLE;
+          div.appendChild(element);
+          if (item.items.length > 0) {
+            hasAnyNesting = true;
+            this._addToggleButton(div);
+            var itemsDiv = document.createElement('div');
+            itemsDiv.className = 'outlineItems';
+            div.appendChild(itemsDiv);
+            queue.push({
+              parent: itemsDiv,
+              items: item.items
+            });
+          }
+          levelData.parent.appendChild(div);
+          outlineCount++;
+        }
+      }
+      if (hasAnyNesting) {
+        this.container.classList.add('outlineWithDeepNesting');
+      }
+      this.container.appendChild(fragment);
+      this._dispatchEvent(outlineCount);
+    }
+  }]);
+
+  return PDFOutlineViewer;
+}();
+
+exports.PDFOutlineViewer = PDFOutlineViewer;
+
+/***/ }),
+/* 25 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.PDFPresentationMode = undefined;
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _ui_utils = __webpack_require__(6);
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var DELAY_BEFORE_RESETTING_SWITCH_IN_PROGRESS = 1500;
+var DELAY_BEFORE_HIDING_CONTROLS = 3000;
+var ACTIVE_SELECTOR = 'pdfPresentationMode';
+var CONTROLS_SELECTOR = 'pdfPresentationModeControls';
+var MOUSE_SCROLL_COOLDOWN_TIME = 50;
+var PAGE_SWITCH_THRESHOLD = 0.1;
+var SWIPE_MIN_DISTANCE_THRESHOLD = 50;
+var SWIPE_ANGLE_THRESHOLD = Math.PI / 6;
+
+var PDFPresentationMode = function () {
+  function PDFPresentationMode(_ref) {
+    var _this = this;
+
+    var container = _ref.container,
+        _ref$viewer = _ref.viewer,
+        viewer = _ref$viewer === undefined ? null : _ref$viewer,
+        pdfViewer = _ref.pdfViewer,
+        eventBus = _ref.eventBus,
+        _ref$contextMenuItems = _ref.contextMenuItems,
+        contextMenuItems = _ref$contextMenuItems === undefined ? null : _ref$contextMenuItems;
+
+    _classCallCheck(this, PDFPresentationMode);
+
+    this.container = container;
+    this.viewer = viewer || container.firstElementChild;
+    this.pdfViewer = pdfViewer;
+    this.eventBus = eventBus;
+    this.active = false;
+    this.args = null;
+    this.contextMenuOpen = false;
+    this.mouseScrollTimeStamp = 0;
+    this.mouseScrollDelta = 0;
+    this.touchSwipeState = null;
+    if (contextMenuItems) {
+      contextMenuItems.contextFirstPage.addEventListener('click', function () {
+        _this.contextMenuOpen = false;
+        _this.eventBus.dispatch('firstpage', { source: _this });
+      });
+      contextMenuItems.contextLastPage.addEventListener('click', function () {
+        _this.contextMenuOpen = false;
+        _this.eventBus.dispatch('lastpage', { source: _this });
+      });
+      contextMenuItems.contextPageRotateCw.addEventListener('click', function () {
+        _this.contextMenuOpen = false;
+        _this.eventBus.dispatch('rotatecw', { source: _this });
+      });
+      contextMenuItems.contextPageRotateCcw.addEventListener('click', function () {
+        _this.contextMenuOpen = false;
+        _this.eventBus.dispatch('rotateccw', { source: _this });
+      });
+    }
+  }
+
+  _createClass(PDFPresentationMode, [{
+    key: 'request',
+    value: function request() {
+      if (this.switchInProgress || this.active || !this.viewer.hasChildNodes()) {
+        return false;
+      }
+      this._addFullscreenChangeListeners();
+      this._setSwitchInProgress();
+      this._notifyStateChange();
+      if (this.container.requestFullscreen) {
+        this.container.requestFullscreen();
+      } else if (this.container.mozRequestFullScreen) {
+        this.container.mozRequestFullScreen();
+      } else if (this.container.webkitRequestFullscreen) {
+        this.container.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT);
+      } else if (this.container.msRequestFullscreen) {
+        this.container.msRequestFullscreen();
+      } else {
+        return false;
+      }
+      this.args = {
+        page: this.pdfViewer.currentPageNumber,
+        previousScale: this.pdfViewer.currentScaleValue
+      };
+      return true;
+    }
+  }, {
+    key: '_mouseWheel',
+    value: function _mouseWheel(evt) {
+      if (!this.active) {
+        return;
+      }
+      evt.preventDefault();
+      var delta = (0, _ui_utils.normalizeWheelEventDelta)(evt);
+      var currentTime = new Date().getTime();
+      var storedTime = this.mouseScrollTimeStamp;
+      if (currentTime > storedTime && currentTime - storedTime < MOUSE_SCROLL_COOLDOWN_TIME) {
+        return;
+      }
+      if (this.mouseScrollDelta > 0 && delta < 0 || this.mouseScrollDelta < 0 && delta > 0) {
+        this._resetMouseScrollState();
+      }
+      this.mouseScrollDelta += delta;
+      if (Math.abs(this.mouseScrollDelta) >= PAGE_SWITCH_THRESHOLD) {
+        var totalDelta = this.mouseScrollDelta;
+        this._resetMouseScrollState();
+        var success = totalDelta > 0 ? this._goToPreviousPage() : this._goToNextPage();
+        if (success) {
+          this.mouseScrollTimeStamp = currentTime;
+        }
+      }
+    }
+  }, {
+    key: '_goToPreviousPage',
+    value: function _goToPreviousPage() {
+      var page = this.pdfViewer.currentPageNumber;
+      if (page <= 1) {
+        return false;
+      }
+      this.pdfViewer.currentPageNumber = page - 1;
+      return true;
+    }
+  }, {
+    key: '_goToNextPage',
+    value: function _goToNextPage() {
+      var page = this.pdfViewer.currentPageNumber;
+      if (page >= this.pdfViewer.pagesCount) {
+        return false;
+      }
+      this.pdfViewer.currentPageNumber = page + 1;
+      return true;
+    }
+  }, {
+    key: '_notifyStateChange',
+    value: function _notifyStateChange() {
+      this.eventBus.dispatch('presentationmodechanged', {
+        source: this,
+        active: this.active,
+        switchInProgress: !!this.switchInProgress
+      });
+    }
+  }, {
+    key: '_setSwitchInProgress',
+    value: function _setSwitchInProgress() {
+      var _this2 = this;
+
+      if (this.switchInProgress) {
+        clearTimeout(this.switchInProgress);
+      }
+      this.switchInProgress = setTimeout(function () {
+        _this2._removeFullscreenChangeListeners();
+        delete _this2.switchInProgress;
+        _this2._notifyStateChange();
+      }, DELAY_BEFORE_RESETTING_SWITCH_IN_PROGRESS);
+    }
+  }, {
+    key: '_resetSwitchInProgress',
+    value: function _resetSwitchInProgress() {
+      if (this.switchInProgress) {
+        clearTimeout(this.switchInProgress);
+        delete this.switchInProgress;
+      }
+    }
+  }, {
+    key: '_enter',
+    value: function _enter() {
+      var _this3 = this;
+
+      this.active = true;
+      this._resetSwitchInProgress();
+      this._notifyStateChange();
+      this.container.classList.add(ACTIVE_SELECTOR);
+      setTimeout(function () {
+        _this3.pdfViewer.currentPageNumber = _this3.args.page;
+        _this3.pdfViewer.currentScaleValue = 'page-fit';
+      }, 0);
+      this._addWindowListeners();
+      this._showControls();
+      this.contextMenuOpen = false;
+      this.container.setAttribute('contextmenu', 'viewerContextMenu');
+      window.getSelection().removeAllRanges();
+    }
+  }, {
+    key: '_exit',
+    value: function _exit() {
+      var _this4 = this;
+
+      var page = this.pdfViewer.currentPageNumber;
+      this.container.classList.remove(ACTIVE_SELECTOR);
+      setTimeout(function () {
+        _this4.active = false;
+        _this4._removeFullscreenChangeListeners();
+        _this4._notifyStateChange();
+        _this4.pdfViewer.currentScaleValue = _this4.args.previousScale;
+        _this4.pdfViewer.currentPageNumber = page;
+        _this4.args = null;
+      }, 0);
+      this._removeWindowListeners();
+      this._hideControls();
+      this._resetMouseScrollState();
+      this.container.removeAttribute('contextmenu');
+      this.contextMenuOpen = false;
+    }
+  }, {
+    key: '_mouseDown',
+    value: function _mouseDown(evt) {
+      if (this.contextMenuOpen) {
+        this.contextMenuOpen = false;
+        evt.preventDefault();
+        return;
+      }
+      if (evt.button === 0) {
+        var isInternalLink = evt.target.href && evt.target.classList.contains('internalLink');
+        if (!isInternalLink) {
+          evt.preventDefault();
+          if (evt.shiftKey) {
+            this._goToPreviousPage();
+          } else {
+            this._goToNextPage();
+          }
+        }
+      }
+    }
+  }, {
+    key: '_contextMenu',
+    value: function _contextMenu() {
+      this.contextMenuOpen = true;
+    }
+  }, {
+    key: '_showControls',
+    value: function _showControls() {
+      var _this5 = this;
+
+      if (this.controlsTimeout) {
+        clearTimeout(this.controlsTimeout);
+      } else {
+        this.container.classList.add(CONTROLS_SELECTOR);
+      }
+      this.controlsTimeout = setTimeout(function () {
+        _this5.container.classList.remove(CONTROLS_SELECTOR);
+        delete _this5.controlsTimeout;
+      }, DELAY_BEFORE_HIDING_CONTROLS);
+    }
+  }, {
+    key: '_hideControls',
+    value: function _hideControls() {
+      if (!this.controlsTimeout) {
+        return;
+      }
+      clearTimeout(this.controlsTimeout);
+      this.container.classList.remove(CONTROLS_SELECTOR);
+      delete this.controlsTimeout;
+    }
+  }, {
+    key: '_resetMouseScrollState',
+    value: function _resetMouseScrollState() {
+      this.mouseScrollTimeStamp = 0;
+      this.mouseScrollDelta = 0;
+    }
+  }, {
+    key: '_touchSwipe',
+    value: function _touchSwipe(evt) {
+      if (!this.active) {
+        return;
+      }
+      if (evt.touches.length > 1) {
+        this.touchSwipeState = null;
+        return;
+      }
+      switch (evt.type) {
+        case 'touchstart':
+          this.touchSwipeState = {
+            startX: evt.touches[0].pageX,
+            startY: evt.touches[0].pageY,
+            endX: evt.touches[0].pageX,
+            endY: evt.touches[0].pageY
+          };
+          break;
+        case 'touchmove':
+          if (this.touchSwipeState === null) {
+            return;
+          }
+          this.touchSwipeState.endX = evt.touches[0].pageX;
+          this.touchSwipeState.endY = evt.touches[0].pageY;
+          evt.preventDefault();
+          break;
+        case 'touchend':
+          if (this.touchSwipeState === null) {
+            return;
+          }
+          var delta = 0;
+          var dx = this.touchSwipeState.endX - this.touchSwipeState.startX;
+          var dy = this.touchSwipeState.endY - this.touchSwipeState.startY;
+          var absAngle = Math.abs(Math.atan2(dy, dx));
+          if (Math.abs(dx) > SWIPE_MIN_DISTANCE_THRESHOLD && (absAngle <= SWIPE_ANGLE_THRESHOLD || absAngle >= Math.PI - SWIPE_ANGLE_THRESHOLD)) {
+            delta = dx;
+          } else if (Math.abs(dy) > SWIPE_MIN_DISTANCE_THRESHOLD && Math.abs(absAngle - Math.PI / 2) <= SWIPE_ANGLE_THRESHOLD) {
+            delta = dy;
+          }
+          if (delta > 0) {
+            this._goToPreviousPage();
+          } else if (delta < 0) {
+            this._goToNextPage();
+          }
+          break;
+      }
+    }
+  }, {
+    key: '_addWindowListeners',
+    value: function _addWindowListeners() {
+      this.showControlsBind = this._showControls.bind(this);
+      this.mouseDownBind = this._mouseDown.bind(this);
+      this.mouseWheelBind = this._mouseWheel.bind(this);
+      this.resetMouseScrollStateBind = this._resetMouseScrollState.bind(this);
+      this.contextMenuBind = this._contextMenu.bind(this);
+      this.touchSwipeBind = this._touchSwipe.bind(this);
+      window.addEventListener('mousemove', this.showControlsBind);
+      window.addEventListener('mousedown', this.mouseDownBind);
+      window.addEventListener('wheel', this.mouseWheelBind);
+      window.addEventListener('keydown', this.resetMouseScrollStateBind);
+      window.addEventListener('contextmenu', this.contextMenuBind);
+      window.addEventListener('touchstart', this.touchSwipeBind);
+      window.addEventListener('touchmove', this.touchSwipeBind);
+      window.addEventListener('touchend', this.touchSwipeBind);
+    }
+  }, {
+    key: '_removeWindowListeners',
+    value: function _removeWindowListeners() {
+      window.removeEventListener('mousemove', this.showControlsBind);
+      window.removeEventListener('mousedown', this.mouseDownBind);
+      window.removeEventListener('wheel', this.mouseWheelBind);
+      window.removeEventListener('keydown', this.resetMouseScrollStateBind);
+      window.removeEventListener('contextmenu', this.contextMenuBind);
+      window.removeEventListener('touchstart', this.touchSwipeBind);
+      window.removeEventListener('touchmove', this.touchSwipeBind);
+      window.removeEventListener('touchend', this.touchSwipeBind);
+      delete this.showControlsBind;
+      delete this.mouseDownBind;
+      delete this.mouseWheelBind;
+      delete this.resetMouseScrollStateBind;
+      delete this.contextMenuBind;
+      delete this.touchSwipeBind;
+    }
+  }, {
+    key: '_fullscreenChange',
+    value: function _fullscreenChange() {
+      if (this.isFullscreen) {
+        this._enter();
+      } else {
+        this._exit();
+      }
+    }
+  }, {
+    key: '_addFullscreenChangeListeners',
+    value: function _addFullscreenChangeListeners() {
+      this.fullscreenChangeBind = this._fullscreenChange.bind(this);
+      window.addEventListener('fullscreenchange', this.fullscreenChangeBind);
+      window.addEventListener('mozfullscreenchange', this.fullscreenChangeBind);
+      window.addEventListener('webkitfullscreenchange', this.fullscreenChangeBind);
+      window.addEventListener('MSFullscreenChange', this.fullscreenChangeBind);
+    }
+  }, {
+    key: '_removeFullscreenChangeListeners',
+    value: function _removeFullscreenChangeListeners() {
+      window.removeEventListener('fullscreenchange', this.fullscreenChangeBind);
+      window.removeEventListener('mozfullscreenchange', this.fullscreenChangeBind);
+      window.removeEventListener('webkitfullscreenchange', this.fullscreenChangeBind);
+      window.removeEventListener('MSFullscreenChange', this.fullscreenChangeBind);
+      delete this.fullscreenChangeBind;
+    }
+  }, {
+    key: 'isFullscreen',
+    get: function get() {
+      return !!(document.fullscreenElement || document.mozFullScreen || document.webkitIsFullScreen || document.msFullscreenElement);
+    }
+  }]);
+
+  return PDFPresentationMode;
+}();
+
+exports.PDFPresentationMode = PDFPresentationMode;
+
+/***/ }),
+/* 26 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.PDFSidebarResizer = undefined;
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _ui_utils = __webpack_require__(6);
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var SIDEBAR_WIDTH_VAR = '--sidebar-width';
+var SIDEBAR_MIN_WIDTH = 200;
+var SIDEBAR_RESIZING_CLASS = 'sidebarResizing';
+
+var PDFSidebarResizer = function () {
+  function PDFSidebarResizer(options, eventBus) {
+    var _this = this;
+
+    var l10n = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _ui_utils.NullL10n;
+
+    _classCallCheck(this, PDFSidebarResizer);
+
+    this.enabled = false;
+    this.isRTL = false;
+    this.sidebarOpen = false;
+    this.doc = document.documentElement;
+    this._width = null;
+    this._outerContainerWidth = null;
+    this._boundEvents = Object.create(null);
+    this.outerContainer = options.outerContainer;
+    this.resizer = options.resizer;
+    this.eventBus = eventBus;
+    this.l10n = l10n;
+    if (typeof CSS === 'undefined' || typeof CSS.supports !== 'function' || !CSS.supports(SIDEBAR_WIDTH_VAR, 'calc(-1 * ' + SIDEBAR_MIN_WIDTH + 'px)')) {
+      console.warn('PDFSidebarResizer: ' + 'The browser does not support resizing of the sidebar.');
+      return;
+    }
+    this.enabled = true;
+    this.resizer.classList.remove('hidden');
+    this.l10n.getDirection().then(function (dir) {
+      _this.isRTL = dir === 'rtl';
+    });
+    this._addEventListeners();
+  }
+
+  _createClass(PDFSidebarResizer, [{
+    key: '_updateWidth',
+    value: function _updateWidth() {
+      var width = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
+
+      if (!this.enabled) {
+        return false;
+      }
+      var maxWidth = Math.floor(this.outerContainerWidth / 2);
+      if (width > maxWidth) {
+        width = maxWidth;
+      }
+      if (width < SIDEBAR_MIN_WIDTH) {
+        width = SIDEBAR_MIN_WIDTH;
+      }
+      if (width === this._width) {
+        return false;
+      }
+      this._width = width;
+      this.doc.style.setProperty(SIDEBAR_WIDTH_VAR, width + 'px');
+      return true;
+    }
+  }, {
+    key: '_mouseMove',
+    value: function _mouseMove(evt) {
+      var width = evt.clientX;
+      if (this.isRTL) {
+        width = this.outerContainerWidth - width;
+      }
+      this._updateWidth(width);
+    }
+  }, {
+    key: '_mouseUp',
+    value: function _mouseUp(evt) {
+      this.outerContainer.classList.remove(SIDEBAR_RESIZING_CLASS);
+      this.eventBus.dispatch('resize', { source: this });
+      var _boundEvents = this._boundEvents;
+      window.removeEventListener('mousemove', _boundEvents.mouseMove);
+      window.removeEventListener('mouseup', _boundEvents.mouseUp);
+    }
+  }, {
+    key: '_addEventListeners',
+    value: function _addEventListeners() {
+      var _this2 = this;
+
+      if (!this.enabled) {
+        return;
+      }
+      var _boundEvents = this._boundEvents;
+      _boundEvents.mouseMove = this._mouseMove.bind(this);
+      _boundEvents.mouseUp = this._mouseUp.bind(this);
+      this.resizer.addEventListener('mousedown', function (evt) {
+        if (evt.button !== 0) {
+          return;
+        }
+        _this2.outerContainer.classList.add(SIDEBAR_RESIZING_CLASS);
+        window.addEventListener('mousemove', _boundEvents.mouseMove);
+        window.addEventListener('mouseup', _boundEvents.mouseUp);
+      });
+      this.eventBus.on('sidebarviewchanged', function (evt) {
+        _this2.sidebarOpen = !!(evt && evt.view);
+      });
+      this.eventBus.on('resize', function (evt) {
+        if (evt && evt.source === window) {
+          _this2._outerContainerWidth = null;
+          if (_this2._width) {
+            if (_this2.sidebarOpen) {
+              _this2.outerContainer.classList.add(SIDEBAR_RESIZING_CLASS);
+              var updated = _this2._updateWidth(_this2._width);
+              Promise.resolve().then(function () {
+                _this2.outerContainer.classList.remove(SIDEBAR_RESIZING_CLASS);
+                if (updated) {
+                  _this2.eventBus.dispatch('resize', { source: _this2 });
+                }
+              });
+            } else {
+              _this2._updateWidth(_this2._width);
+            }
+          }
+        }
+      });
+    }
+  }, {
+    key: 'outerContainerWidth',
+    get: function get() {
+      if (!this._outerContainerWidth) {
+        this._outerContainerWidth = this.outerContainer.clientWidth;
+      }
+      return this._outerContainerWidth;
+    }
+  }]);
+
+  return PDFSidebarResizer;
+}();
+
+exports.PDFSidebarResizer = PDFSidebarResizer;
+
+/***/ }),
+/* 27 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.PDFThumbnailViewer = undefined;
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _ui_utils = __webpack_require__(6);
+
+var _pdf_thumbnail_view = __webpack_require__(28);
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var THUMBNAIL_SCROLL_MARGIN = -19;
+var THUMBNAIL_SELECTED_CLASS = 'selected';
+
+var PDFThumbnailViewer = function () {
+  function PDFThumbnailViewer(_ref) {
+    var container = _ref.container,
+        linkService = _ref.linkService,
+        renderingQueue = _ref.renderingQueue,
+        _ref$l10n = _ref.l10n,
+        l10n = _ref$l10n === undefined ? _ui_utils.NullL10n : _ref$l10n;
+
+    _classCallCheck(this, PDFThumbnailViewer);
+
+    this.container = container;
+    this.linkService = linkService;
+    this.renderingQueue = renderingQueue;
+    this.l10n = l10n;
+    this.scroll = (0, _ui_utils.watchScroll)(this.container, this._scrollUpdated.bind(this));
+    this._resetView();
+  }
+
+  _createClass(PDFThumbnailViewer, [{
+    key: '_scrollUpdated',
+    value: function _scrollUpdated() {
+      this.renderingQueue.renderHighestPriority();
+    }
+  }, {
+    key: 'getThumbnail',
+    value: function getThumbnail(index) {
+      return this._thumbnails[index];
+    }
+  }, {
+    key: '_getVisibleThumbs',
+    value: function _getVisibleThumbs() {
+      return (0, _ui_utils.getVisibleElements)(this.container, this._thumbnails);
+    }
+  }, {
+    key: 'scrollThumbnailIntoView',
+    value: function scrollThumbnailIntoView(pageNumber) {
+      if (!this.pdfDocument) {
+        return;
+      }
+      var thumbnailView = this._thumbnails[pageNumber - 1];
+      if (!thumbnailView) {
+        console.error('scrollThumbnailIntoView: Invalid "pageNumber" parameter.');
+        return;
+      }
+      if (pageNumber !== this._currentPageNumber) {
+        var prevThumbnailView = this._thumbnails[this._currentPageNumber - 1];
+        prevThumbnailView.div.classList.remove(THUMBNAIL_SELECTED_CLASS);
+        thumbnailView.div.classList.add(THUMBNAIL_SELECTED_CLASS);
+      }
+      var visibleThumbs = this._getVisibleThumbs();
+      var numVisibleThumbs = visibleThumbs.views.length;
+      if (numVisibleThumbs > 0) {
+        var first = visibleThumbs.first.id;
+        var last = numVisibleThumbs > 1 ? visibleThumbs.last.id : first;
+        var shouldScroll = false;
+        if (pageNumber <= first || pageNumber >= last) {
+          shouldScroll = true;
+        } else {
+          visibleThumbs.views.some(function (view) {
+            if (view.id !== pageNumber) {
+              return false;
+            }
+            shouldScroll = view.percent < 100;
+            return true;
+          });
+        }
+        if (shouldScroll) {
+          (0, _ui_utils.scrollIntoView)(thumbnailView.div, { top: THUMBNAIL_SCROLL_MARGIN });
+        }
+      }
+      this._currentPageNumber = pageNumber;
+    }
+  }, {
+    key: 'cleanup',
+    value: function cleanup() {
+      _pdf_thumbnail_view.PDFThumbnailView.cleanup();
+    }
+  }, {
+    key: '_resetView',
+    value: function _resetView() {
+      this._thumbnails = [];
+      this._currentPageNumber = 1;
+      this._pageLabels = null;
+      this._pagesRotation = 0;
+      this._pagesRequests = [];
+      this.container.textContent = '';
+    }
+  }, {
+    key: 'setDocument',
+    value: function setDocument(pdfDocument) {
+      var _this = this;
+
+      if (this.pdfDocument) {
+        this._cancelRendering();
+        this._resetView();
+      }
+      this.pdfDocument = pdfDocument;
+      if (!pdfDocument) {
+        return;
+      }
+      pdfDocument.getPage(1).then(function (firstPage) {
+        var pagesCount = pdfDocument.numPages;
+        var viewport = firstPage.getViewport(1.0);
+        for (var pageNum = 1; pageNum <= pagesCount; ++pageNum) {
+          var thumbnail = new _pdf_thumbnail_view.PDFThumbnailView({
+            container: _this.container,
+            id: pageNum,
+            defaultViewport: viewport.clone(),
+            linkService: _this.linkService,
+            renderingQueue: _this.renderingQueue,
+            disableCanvasToImageConversion: false,
+            l10n: _this.l10n
+          });
+          _this._thumbnails.push(thumbnail);
+        }
+        var thumbnailView = _this._thumbnails[_this._currentPageNumber - 1];
+        thumbnailView.div.classList.add(THUMBNAIL_SELECTED_CLASS);
+      }).catch(function (reason) {
+        console.error('Unable to initialize thumbnail viewer', reason);
+      });
+    }
+  }, {
+    key: '_cancelRendering',
+    value: function _cancelRendering() {
+      for (var i = 0, ii = this._thumbnails.length; i < ii; i++) {
+        if (this._thumbnails[i]) {
+          this._thumbnails[i].cancelRendering();
+        }
+      }
+    }
+  }, {
+    key: 'setPageLabels',
+    value: function setPageLabels(labels) {
+      if (!this.pdfDocument) {
+        return;
+      }
+      if (!labels) {
+        this._pageLabels = null;
+      } else if (!(Array.isArray(labels) && this.pdfDocument.numPages === labels.length)) {
+        this._pageLabels = null;
+        console.error('PDFThumbnailViewer_setPageLabels: Invalid page labels.');
+      } else {
+        this._pageLabels = labels;
+      }
+      for (var i = 0, ii = this._thumbnails.length; i < ii; i++) {
+        var label = this._pageLabels && this._pageLabels[i];
+        this._thumbnails[i].setPageLabel(label);
+      }
+    }
+  }, {
+    key: '_ensurePdfPageLoaded',
+    value: function _ensurePdfPageLoaded(thumbView) {
+      var _this2 = this;
+
+      if (thumbView.pdfPage) {
+        return Promise.resolve(thumbView.pdfPage);
+      }
+      var pageNumber = thumbView.id;
+      if (this._pagesRequests[pageNumber]) {
+        return this._pagesRequests[pageNumber];
+      }
+      var promise = this.pdfDocument.getPage(pageNumber).then(function (pdfPage) {
+        thumbView.setPdfPage(pdfPage);
+        _this2._pagesRequests[pageNumber] = null;
+        return pdfPage;
+      }).catch(function (reason) {
+        console.error('Unable to get page for thumb view', reason);
+        _this2._pagesRequests[pageNumber] = null;
+      });
+      this._pagesRequests[pageNumber] = promise;
+      return promise;
+    }
+  }, {
+    key: 'forceRendering',
+    value: function forceRendering() {
+      var _this3 = this;
+
+      var visibleThumbs = this._getVisibleThumbs();
+      var thumbView = this.renderingQueue.getHighestPriority(visibleThumbs, this._thumbnails, this.scroll.down);
+      if (thumbView) {
+        this._ensurePdfPageLoaded(thumbView).then(function () {
+          _this3.renderingQueue.renderView(thumbView);
+        });
+        return true;
+      }
+      return false;
+    }
+  }, {
+    key: 'pagesRotation',
+    get: function get() {
+      return this._pagesRotation;
+    },
+    set: function set(rotation) {
+      if (!(0, _ui_utils.isValidRotation)(rotation)) {
+        throw new Error('Invalid thumbnails rotation angle.');
+      }
+      if (!this.pdfDocument) {
+        return;
+      }
+      if (this._pagesRotation === rotation) {
+        return;
+      }
+      this._pagesRotation = rotation;
+      for (var i = 0, ii = this._thumbnails.length; i < ii; i++) {
+        this._thumbnails[i].update(rotation);
+      }
+    }
+  }]);
+
+  return PDFThumbnailViewer;
+}();
+
+exports.PDFThumbnailViewer = PDFThumbnailViewer;
+
+/***/ }),
+/* 28 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.PDFThumbnailView = undefined;
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _pdfjsLib = __webpack_require__(7);
+
+var _ui_utils = __webpack_require__(6);
+
+var _pdf_rendering_queue = __webpack_require__(10);
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var MAX_NUM_SCALING_STEPS = 3;
+var THUMBNAIL_CANVAS_BORDER_WIDTH = 1;
+var THUMBNAIL_WIDTH = 98;
+var TempImageFactory = function TempImageFactoryClosure() {
+  var tempCanvasCache = null;
+  return {
+    getCanvas: function getCanvas(width, height) {
+      var tempCanvas = tempCanvasCache;
+      if (!tempCanvas) {
+        tempCanvas = document.createElement('canvas');
+        tempCanvasCache = tempCanvas;
+      }
+      tempCanvas.width = width;
+      tempCanvas.height = height;
+      tempCanvas.mozOpaque = true;
+      var ctx = tempCanvas.getContext('2d', { alpha: false });
+      ctx.save();
+      ctx.fillStyle = 'rgb(255, 255, 255)';
+      ctx.fillRect(0, 0, width, height);
+      ctx.restore();
+      return tempCanvas;
+    },
+    destroyCanvas: function destroyCanvas() {
+      var tempCanvas = tempCanvasCache;
+      if (tempCanvas) {
+        tempCanvas.width = 0;
+        tempCanvas.height = 0;
+      }
+      tempCanvasCache = null;
+    }
+  };
+}();
+
+var PDFThumbnailView = function () {
+  function PDFThumbnailView(_ref) {
+    var container = _ref.container,
+        id = _ref.id,
+        defaultViewport = _ref.defaultViewport,
+        linkService = _ref.linkService,
+        renderingQueue = _ref.renderingQueue,
+        _ref$disableCanvasToI = _ref.disableCanvasToImageConversion,
+        disableCanvasToImageConversion = _ref$disableCanvasToI === undefined ? false : _ref$disableCanvasToI,
+        _ref$l10n = _ref.l10n,
+        l10n = _ref$l10n === undefined ? _ui_utils.NullL10n : _ref$l10n;
+
+    _classCallCheck(this, PDFThumbnailView);
+
+    this.id = id;
+    this.renderingId = 'thumbnail' + id;
+    this.pageLabel = null;
+    this.pdfPage = null;
+    this.rotation = 0;
+    this.viewport = defaultViewport;
+    this.pdfPageRotate = defaultViewport.rotation;
+    this.linkService = linkService;
+    this.renderingQueue = renderingQueue;
+    this.renderTask = null;
+    this.renderingState = _pdf_rendering_queue.RenderingStates.INITIAL;
+    this.resume = null;
+    this.disableCanvasToImageConversion = disableCanvasToImageConversion;
+    this.pageWidth = this.viewport.width;
+    this.pageHeight = this.viewport.height;
+    this.pageRatio = this.pageWidth / this.pageHeight;
+    this.canvasWidth = THUMBNAIL_WIDTH;
+    this.canvasHeight = this.canvasWidth / this.pageRatio | 0;
+    this.scale = this.canvasWidth / this.pageWidth;
+    this.l10n = l10n;
+    var anchor = document.createElement('a');
+    anchor.href = linkService.getAnchorUrl('#page=' + id);
+    this.l10n.get('thumb_page_title', { page: id }, 'Page {{page}}').then(function (msg) {
+      anchor.title = msg;
+    });
+    anchor.onclick = function () {
+      linkService.page = id;
+      return false;
+    };
+    this.anchor = anchor;
+    var div = document.createElement('div');
+    div.className = 'thumbnail';
+    div.setAttribute('data-page-number', this.id);
+    this.div = div;
+    var ring = document.createElement('div');
+    ring.className = 'thumbnailSelectionRing';
+    var borderAdjustment = 2 * THUMBNAIL_CANVAS_BORDER_WIDTH;
+    ring.style.width = this.canvasWidth + borderAdjustment + 'px';
+    ring.style.height = this.canvasHeight + borderAdjustment + 'px';
+    this.ring = ring;
+    div.appendChild(ring);
+    anchor.appendChild(div);
+    container.appendChild(anchor);
+  }
+
+  _createClass(PDFThumbnailView, [{
+    key: 'setPdfPage',
+    value: function setPdfPage(pdfPage) {
+      this.pdfPage = pdfPage;
+      this.pdfPageRotate = pdfPage.rotate;
+      var totalRotation = (this.rotation + this.pdfPageRotate) % 360;
+      this.viewport = pdfPage.getViewport(1, totalRotation);
+      this.reset();
+    }
+  }, {
+    key: 'reset',
+    value: function reset() {
+      this.cancelRendering();
+      this.pageWidth = this.viewport.width;
+      this.pageHeight = this.viewport.height;
+      this.pageRatio = this.pageWidth / this.pageHeight;
+      this.canvasHeight = this.canvasWidth / this.pageRatio | 0;
+      this.scale = this.canvasWidth / this.pageWidth;
+      this.div.removeAttribute('data-loaded');
+      var ring = this.ring;
+      var childNodes = ring.childNodes;
+      for (var i = childNodes.length - 1; i >= 0; i--) {
+        ring.removeChild(childNodes[i]);
+      }
+      var borderAdjustment = 2 * THUMBNAIL_CANVAS_BORDER_WIDTH;
+      ring.style.width = this.canvasWidth + borderAdjustment + 'px';
+      ring.style.height = this.canvasHeight + borderAdjustment + 'px';
+      if (this.canvas) {
+        this.canvas.width = 0;
+        this.canvas.height = 0;
+        delete this.canvas;
+      }
+      if (this.image) {
+        this.image.removeAttribute('src');
+        delete this.image;
+      }
+    }
+  }, {
+    key: 'update',
+    value: function update(rotation) {
+      if (typeof rotation !== 'undefined') {
+        this.rotation = rotation;
+      }
+      var totalRotation = (this.rotation + this.pdfPageRotate) % 360;
+      this.viewport = this.viewport.clone({
+        scale: 1,
+        rotation: totalRotation
+      });
+      this.reset();
+    }
+  }, {
+    key: 'cancelRendering',
+    value: function cancelRendering() {
+      if (this.renderTask) {
+        this.renderTask.cancel();
+        this.renderTask = null;
+      }
+      this.renderingState = _pdf_rendering_queue.RenderingStates.INITIAL;
+      this.resume = null;
+    }
+  }, {
+    key: '_getPageDrawContext',
+    value: function _getPageDrawContext() {
+      var noCtxScale = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+
+      var canvas = document.createElement('canvas');
+      this.canvas = canvas;
+      canvas.mozOpaque = true;
+      var ctx = canvas.getContext('2d', { alpha: false });
+      var outputScale = (0, _ui_utils.getOutputScale)(ctx);
+      canvas.width = this.canvasWidth * outputScale.sx | 0;
+      canvas.height = this.canvasHeight * outputScale.sy | 0;
+      canvas.style.width = this.canvasWidth + 'px';
+      canvas.style.height = this.canvasHeight + 'px';
+      if (!noCtxScale && outputScale.scaled) {
+        ctx.scale(outputScale.sx, outputScale.sy);
+      }
+      return ctx;
+    }
+  }, {
+    key: '_convertCanvasToImage',
+    value: function _convertCanvasToImage() {
+      var _this = this;
+
+      if (!this.canvas) {
+        return;
+      }
+      if (this.renderingState !== _pdf_rendering_queue.RenderingStates.FINISHED) {
+        return;
+      }
+      var id = this.renderingId;
+      var className = 'thumbnailImage';
+      if (this.disableCanvasToImageConversion) {
+        this.canvas.id = id;
+        this.canvas.className = className;
+        this.l10n.get('thumb_page_canvas', { page: this.pageId }, 'Thumbnail of Page {{page}}').then(function (msg) {
+          _this.canvas.setAttribute('aria-label', msg);
+        });
+        this.div.setAttribute('data-loaded', true);
+        this.ring.appendChild(this.canvas);
+        return;
+      }
+      var image = document.createElement('img');
+      image.id = id;
+      image.className = className;
+      this.l10n.get('thumb_page_canvas', { page: this.pageId }, 'Thumbnail of Page {{page}}').then(function (msg) {
+        image.setAttribute('aria-label', msg);
+      });
+      image.style.width = this.canvasWidth + 'px';
+      image.style.height = this.canvasHeight + 'px';
+      image.src = this.canvas.toDataURL();
+      this.image = image;
+      this.div.setAttribute('data-loaded', true);
+      this.ring.appendChild(image);
+      this.canvas.width = 0;
+      this.canvas.height = 0;
+      delete this.canvas;
+    }
+  }, {
+    key: 'draw',
+    value: function draw() {
+      var _this2 = this;
+
+      if (this.renderingState !== _pdf_rendering_queue.RenderingStates.INITIAL) {
+        console.error('Must be in new state before drawing');
+        return Promise.resolve(undefined);
+      }
+      this.renderingState = _pdf_rendering_queue.RenderingStates.RUNNING;
+      var renderCapability = (0, _pdfjsLib.createPromiseCapability)();
+      var finishRenderTask = function finishRenderTask(error) {
+        if (renderTask === _this2.renderTask) {
+          _this2.renderTask = null;
+        }
+        if (error instanceof _pdfjsLib.RenderingCancelledException) {
+          renderCapability.resolve(undefined);
+          return;
+        }
+        _this2.renderingState = _pdf_rendering_queue.RenderingStates.FINISHED;
+        _this2._convertCanvasToImage();
+        if (!error) {
+          renderCapability.resolve(undefined);
+        } else {
+          renderCapability.reject(error);
+        }
+      };
+      var ctx = this._getPageDrawContext();
+      var drawViewport = this.viewport.clone({ scale: this.scale });
+      var renderContinueCallback = function renderContinueCallback(cont) {
+        if (!_this2.renderingQueue.isHighestPriority(_this2)) {
+          _this2.renderingState = _pdf_rendering_queue.RenderingStates.PAUSED;
+          _this2.resume = function () {
+            _this2.renderingState = _pdf_rendering_queue.RenderingStates.RUNNING;
+            cont();
+          };
+          return;
+        }
+        cont();
+      };
+      var renderContext = {
+        canvasContext: ctx,
+        viewport: drawViewport
+      };
+      var renderTask = this.renderTask = this.pdfPage.render(renderContext);
+      renderTask.onContinue = renderContinueCallback;
+      renderTask.promise.then(function () {
+        finishRenderTask(null);
+      }, function (error) {
+        finishRenderTask(error);
+      });
+      return renderCapability.promise;
+    }
+  }, {
+    key: 'setImage',
+    value: function setImage(pageView) {
+      if (this.renderingState !== _pdf_rendering_queue.RenderingStates.INITIAL) {
+        return;
+      }
+      var img = pageView.canvas;
+      if (!img) {
+        return;
+      }
+      if (!this.pdfPage) {
+        this.setPdfPage(pageView.pdfPage);
+      }
+      this.renderingState = _pdf_rendering_queue.RenderingStates.FINISHED;
+      var ctx = this._getPageDrawContext(true);
+      var canvas = ctx.canvas;
+      if (img.width <= 2 * canvas.width) {
+        ctx.drawImage(img, 0, 0, img.width, img.height, 0, 0, canvas.width, canvas.height);
+        this._convertCanvasToImage();
+        return;
+      }
+      var reducedWidth = canvas.width << MAX_NUM_SCALING_STEPS;
+      var reducedHeight = canvas.height << MAX_NUM_SCALING_STEPS;
+      var reducedImage = TempImageFactory.getCanvas(reducedWidth, reducedHeight);
+      var reducedImageCtx = reducedImage.getContext('2d');
+      while (reducedWidth > img.width || reducedHeight > img.height) {
+        reducedWidth >>= 1;
+        reducedHeight >>= 1;
+      }
+      reducedImageCtx.drawImage(img, 0, 0, img.width, img.height, 0, 0, reducedWidth, reducedHeight);
+      while (reducedWidth > 2 * canvas.width) {
+        reducedImageCtx.drawImage(reducedImage, 0, 0, reducedWidth, reducedHeight, 0, 0, reducedWidth >> 1, reducedHeight >> 1);
+        reducedWidth >>= 1;
+        reducedHeight >>= 1;
+      }
+      ctx.drawImage(reducedImage, 0, 0, reducedWidth, reducedHeight, 0, 0, canvas.width, canvas.height);
+      this._convertCanvasToImage();
+    }
+  }, {
+    key: 'setPageLabel',
+    value: function setPageLabel(label) {
+      var _this3 = this;
+
+      this.pageLabel = typeof label === 'string' ? label : null;
+      this.l10n.get('thumb_page_title', { page: this.pageId }, 'Page {{page}}').then(function (msg) {
+        _this3.anchor.title = msg;
+      });
+      if (this.renderingState !== _pdf_rendering_queue.RenderingStates.FINISHED) {
+        return;
+      }
+      this.l10n.get('thumb_page_canvas', { page: this.pageId }, 'Thumbnail of Page {{page}}').then(function (ariaLabel) {
+        if (_this3.image) {
+          _this3.image.setAttribute('aria-label', ariaLabel);
+        } else if (_this3.disableCanvasToImageConversion && _this3.canvas) {
+          _this3.canvas.setAttribute('aria-label', ariaLabel);
+        }
+      });
+    }
+  }, {
+    key: 'pageId',
+    get: function get() {
+      return this.pageLabel !== null ? this.pageLabel : this.id;
+    }
+  }], [{
+    key: 'cleanup',
+    value: function cleanup() {
+      TempImageFactory.destroyCanvas();
+    }
+  }]);
+
+  return PDFThumbnailView;
+}();
+
+exports.PDFThumbnailView = PDFThumbnailView;
+
+/***/ }),
+/* 29 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.PDFViewer = undefined;
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _base_viewer = __webpack_require__(30);
+
+var _ui_utils = __webpack_require__(6);
+
+var _pdfjsLib = __webpack_require__(7);
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var PDFViewer = function (_BaseViewer) {
+  _inherits(PDFViewer, _BaseViewer);
+
+  function PDFViewer() {
+    _classCallCheck(this, PDFViewer);
+
+    return _possibleConstructorReturn(this, (PDFViewer.__proto__ || Object.getPrototypeOf(PDFViewer)).apply(this, arguments));
+  }
+
+  _createClass(PDFViewer, [{
+    key: '_scrollIntoView',
+    value: function _scrollIntoView(_ref) {
+      var pageDiv = _ref.pageDiv,
+          _ref$pageSpot = _ref.pageSpot,
+          pageSpot = _ref$pageSpot === undefined ? null : _ref$pageSpot;
+
+      if (!pageSpot && !this.isInPresentationMode) {
+        var left = pageDiv.offsetLeft + pageDiv.clientLeft;
+        var right = left + pageDiv.clientWidth;
+        var _container = this.container,
+            scrollLeft = _container.scrollLeft,
+            clientWidth = _container.clientWidth;
+
+        if (this._scrollMode === _base_viewer.ScrollMode.HORIZONTAL || left < scrollLeft || right > scrollLeft + clientWidth) {
+          pageSpot = {
+            left: 0,
+            top: 0
+          };
+        }
+      }
+      (0, _ui_utils.scrollIntoView)(pageDiv, pageSpot);
+    }
+  }, {
+    key: '_getVisiblePages',
+    value: function _getVisiblePages() {
+      if (!this.isInPresentationMode) {
+        return (0, _ui_utils.getVisibleElements)(this.container, this._pages, true, this._scrollMode === _base_viewer.ScrollMode.HORIZONTAL);
+      }
+      var currentPage = this._pages[this._currentPageNumber - 1];
+      var visible = [{
+        id: currentPage.id,
+        view: currentPage
+      }];
+      return {
+        first: currentPage,
+        last: currentPage,
+        views: visible
+      };
+    }
+  }, {
+    key: 'update',
+    value: function update() {
+      var visible = this._getVisiblePages();
+      var visiblePages = visible.views,
+          numVisiblePages = visiblePages.length;
+      if (numVisiblePages === 0) {
+        return;
+      }
+      this._resizeBuffer(numVisiblePages, visiblePages);
+      this.renderingQueue.renderHighestPriority(visible);
+      var currentId = this._currentPageNumber;
+      var stillFullyVisible = false;
+      for (var i = 0; i < numVisiblePages; ++i) {
+        var page = visiblePages[i];
+        if (page.percent < 100) {
+          break;
+        }
+        if (page.id === currentId) {
+          stillFullyVisible = true;
+          break;
+        }
+      }
+      if (!stillFullyVisible) {
+        currentId = visiblePages[0].id;
+      }
+      if (!this.isInPresentationMode) {
+        this._setCurrentPageNumber(currentId);
+      }
+      this._updateLocation(visible.first);
+      this.eventBus.dispatch('updateviewarea', {
+        source: this,
+        location: this._location
+      });
+    }
+  }, {
+    key: '_setDocumentViewerElement',
+    get: function get() {
+      return (0, _pdfjsLib.shadow)(this, '_setDocumentViewerElement', this.viewer);
+    }
+  }, {
+    key: '_isScrollModeHorizontal',
+    get: function get() {
+      return this.isInPresentationMode ? false : this._scrollMode === _base_viewer.ScrollMode.HORIZONTAL;
+    }
+  }]);
+
+  return PDFViewer;
+}(_base_viewer.BaseViewer);
+
+exports.PDFViewer = PDFViewer;
+
+/***/ }),
+/* 30 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.SpreadMode = exports.ScrollMode = exports.BaseViewer = undefined;
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _ui_utils = __webpack_require__(6);
+
+var _pdf_rendering_queue = __webpack_require__(10);
+
+var _annotation_layer_builder = __webpack_require__(31);
+
+var _pdfjsLib = __webpack_require__(7);
+
+var _dom_events = __webpack_require__(14);
+
+var _pdf_page_view = __webpack_require__(32);
+
+var _pdf_link_service = __webpack_require__(23);
+
+var _text_layer_builder = __webpack_require__(33);
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var DEFAULT_CACHE_SIZE = 10;
+var ScrollMode = {
+  VERTICAL: 0,
+  HORIZONTAL: 1,
+  WRAPPED: 2
+};
+var SpreadMode = {
+  NONE: 0,
+  ODD: 1,
+  EVEN: 2
+};
+function PDFPageViewBuffer(size) {
+  var data = [];
+  this.push = function (view) {
+    var i = data.indexOf(view);
+    if (i >= 0) {
+      data.splice(i, 1);
+    }
+    data.push(view);
+    if (data.length > size) {
+      data.shift().destroy();
+    }
+  };
+  this.resize = function (newSize, pagesToKeep) {
+    size = newSize;
+    if (pagesToKeep) {
+      var pageIdsToKeep = new Set();
+      for (var i = 0, iMax = pagesToKeep.length; i < iMax; ++i) {
+        pageIdsToKeep.add(pagesToKeep[i].id);
+      }
+      (0, _ui_utils.moveToEndOfArray)(data, function (page) {
+        return pageIdsToKeep.has(page.id);
+      });
+    }
+    while (data.length > size) {
+      data.shift().destroy();
+    }
+  };
+}
+function isSameScale(oldScale, newScale) {
+  if (newScale === oldScale) {
+    return true;
+  }
+  if (Math.abs(newScale - oldScale) < 1e-15) {
+    return true;
+  }
+  return false;
+}
+
+var BaseViewer = function () {
+  function BaseViewer(options) {
+    var _this = this;
+
+    _classCallCheck(this, BaseViewer);
+
+    if (this.constructor === BaseViewer) {
+      throw new Error('Cannot initialize BaseViewer.');
+    }
+    this._name = this.constructor.name;
+    this.container = options.container;
+    this.viewer = options.viewer || options.container.firstElementChild;
+    this.eventBus = options.eventBus || (0, _dom_events.getGlobalEventBus)();
+    this.linkService = options.linkService || new _pdf_link_service.SimpleLinkService();
+    this.downloadManager = options.downloadManager || null;
+    this.findController = options.findController || null;
+    this.removePageBorders = options.removePageBorders || false;
+    this.textLayerMode = Number.isInteger(options.textLayerMode) ? options.textLayerMode : _ui_utils.TextLayerMode.ENABLE;
+    this.imageResourcesPath = options.imageResourcesPath || '';
+    this.renderInteractiveForms = options.renderInteractiveForms || false;
+    this.enablePrintAutoRotate = options.enablePrintAutoRotate || false;
+    this.renderer = options.renderer || _ui_utils.RendererType.CANVAS;
+    this.enableWebGL = options.enableWebGL || false;
+    this.useOnlyCssZoom = options.useOnlyCssZoom || false;
+    this.maxCanvasPixels = options.maxCanvasPixels;
+    this.l10n = options.l10n || _ui_utils.NullL10n;
+    this.defaultRenderingQueue = !options.renderingQueue;
+    if (this.defaultRenderingQueue) {
+      this.renderingQueue = new _pdf_rendering_queue.PDFRenderingQueue();
+      this.renderingQueue.setViewer(this);
+    } else {
+      this.renderingQueue = options.renderingQueue;
+    }
+    this.scroll = (0, _ui_utils.watchScroll)(this.container, this._scrollUpdate.bind(this));
+    this.presentationModeState = _ui_utils.PresentationModeState.UNKNOWN;
+    this._resetView();
+    if (this.removePageBorders) {
+      this.viewer.classList.add('removePageBorders');
+    }
+    Promise.resolve().then(function () {
+      _this.eventBus.dispatch('baseviewerinit', { source: _this });
+    });
+  }
+
+  _createClass(BaseViewer, [{
+    key: 'getPageView',
+    value: function getPageView(index) {
+      return this._pages[index];
+    }
+  }, {
+    key: '_setCurrentPageNumber',
+    value: function _setCurrentPageNumber(val) {
+      var resetCurrentPageView = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+
+      if (this._currentPageNumber === val) {
+        if (resetCurrentPageView) {
+          this._resetCurrentPageView();
+        }
+        return;
+      }
+      if (!(0 < val && val <= this.pagesCount)) {
+        console.error(this._name + '._setCurrentPageNumber: "' + val + '" is out of bounds.');
+        return;
+      }
+      var arg = {
+        source: this,
+        pageNumber: val,
+        pageLabel: this._pageLabels && this._pageLabels[val - 1]
+      };
+      this._currentPageNumber = val;
+      this.eventBus.dispatch('pagechanging', arg);
+      this.eventBus.dispatch('pagechange', arg);
+      if (resetCurrentPageView) {
+        this._resetCurrentPageView();
+      }
+    }
+  }, {
+    key: 'setDocument',
+    value: function setDocument(pdfDocument) {
+      var _this2 = this;
+
+      if (this.pdfDocument) {
+        this._cancelRendering();
+        this._resetView();
+        if (this.findController) {
+          this.findController.setDocument(null);
+        }
+      }
+      this.pdfDocument = pdfDocument;
+      if (!pdfDocument) {
+        return;
+      }
+      var pagesCount = pdfDocument.numPages;
+      var pagesCapability = (0, _pdfjsLib.createPromiseCapability)();
+      this.pagesPromise = pagesCapability.promise;
+      pagesCapability.promise.then(function () {
+        _this2._pageViewsReady = true;
+        _this2.eventBus.dispatch('pagesloaded', {
+          source: _this2,
+          pagesCount: pagesCount
+        });
+      });
+      var isOnePageRenderedResolved = false;
+      var onePageRenderedCapability = (0, _pdfjsLib.createPromiseCapability)();
+      this.onePageRendered = onePageRenderedCapability.promise;
+      var bindOnAfterAndBeforeDraw = function bindOnAfterAndBeforeDraw(pageView) {
+        pageView.onBeforeDraw = function () {
+          _this2._buffer.push(pageView);
+        };
+        pageView.onAfterDraw = function () {
+          if (!isOnePageRenderedResolved) {
+            isOnePageRenderedResolved = true;
+            onePageRenderedCapability.resolve();
+          }
+        };
+      };
+      var firstPagePromise = pdfDocument.getPage(1);
+      this.firstPagePromise = firstPagePromise;
+      firstPagePromise.then(function (pdfPage) {
+        var scale = _this2.currentScale;
+        var viewport = pdfPage.getViewport(scale * _ui_utils.CSS_UNITS);
+        for (var pageNum = 1; pageNum <= pagesCount; ++pageNum) {
+          var textLayerFactory = null;
+          if (_this2.textLayerMode !== _ui_utils.TextLayerMode.DISABLE) {
+            textLayerFactory = _this2;
+          }
+          var pageView = new _pdf_page_view.PDFPageView({
+            container: _this2._setDocumentViewerElement,
+            eventBus: _this2.eventBus,
+            id: pageNum,
+            scale: scale,
+            defaultViewport: viewport.clone(),
+            renderingQueue: _this2.renderingQueue,
+            textLayerFactory: textLayerFactory,
+            textLayerMode: _this2.textLayerMode,
+            annotationLayerFactory: _this2,
+            imageResourcesPath: _this2.imageResourcesPath,
+            renderInteractiveForms: _this2.renderInteractiveForms,
+            renderer: _this2.renderer,
+            enableWebGL: _this2.enableWebGL,
+            useOnlyCssZoom: _this2.useOnlyCssZoom,
+            maxCanvasPixels: _this2.maxCanvasPixels,
+            l10n: _this2.l10n
+          });
+          bindOnAfterAndBeforeDraw(pageView);
+          _this2._pages.push(pageView);
+        }
+        if (_this2._spreadMode !== SpreadMode.NONE) {
+          _this2._updateSpreadMode();
+        }
+        onePageRenderedCapability.promise.then(function () {
+          if (pdfDocument.loadingParams['disableAutoFetch']) {
+            pagesCapability.resolve();
+            return;
+          }
+          var getPagesLeft = pagesCount;
+
+          var _loop = function _loop(_pageNum) {
+            pdfDocument.getPage(_pageNum).then(function (pdfPage) {
+              var pageView = _this2._pages[_pageNum - 1];
+              if (!pageView.pdfPage) {
+                pageView.setPdfPage(pdfPage);
+              }
+              _this2.linkService.cachePageRef(_pageNum, pdfPage.ref);
+              if (--getPagesLeft === 0) {
+                pagesCapability.resolve();
+              }
+            }, function (reason) {
+              console.error('Unable to get page ' + _pageNum + ' to initialize viewer', reason);
+              if (--getPagesLeft === 0) {
+                pagesCapability.resolve();
+              }
+            });
+          };
+
+          for (var _pageNum = 1; _pageNum <= pagesCount; ++_pageNum) {
+            _loop(_pageNum);
+          }
+        });
+        _this2.eventBus.dispatch('pagesinit', { source: _this2 });
+        if (_this2.findController) {
+          _this2.findController.setDocument(pdfDocument);
+        }
+        if (_this2.defaultRenderingQueue) {
+          _this2.update();
+        }
+      }).catch(function (reason) {
+        console.error('Unable to initialize viewer', reason);
+      });
+    }
+  }, {
+    key: 'setPageLabels',
+    value: function setPageLabels(labels) {
+      if (!this.pdfDocument) {
+        return;
+      }
+      if (!labels) {
+        this._pageLabels = null;
+      } else if (!(Array.isArray(labels) && this.pdfDocument.numPages === labels.length)) {
+        this._pageLabels = null;
+        console.error(this._name + '.setPageLabels: Invalid page labels.');
+      } else {
+        this._pageLabels = labels;
+      }
+      for (var i = 0, ii = this._pages.length; i < ii; i++) {
+        var pageView = this._pages[i];
+        var label = this._pageLabels && this._pageLabels[i];
+        pageView.setPageLabel(label);
+      }
+    }
+  }, {
+    key: '_resetView',
+    value: function _resetView() {
+      this._pages = [];
+      this._currentPageNumber = 1;
+      this._currentScale = _ui_utils.UNKNOWN_SCALE;
+      this._currentScaleValue = null;
+      this._pageLabels = null;
+      this._buffer = new PDFPageViewBuffer(DEFAULT_CACHE_SIZE);
+      this._location = null;
+      this._pagesRotation = 0;
+      this._pagesRequests = [];
+      this._pageViewsReady = false;
+      this._scrollMode = ScrollMode.VERTICAL;
+      this._spreadMode = SpreadMode.NONE;
+      this.viewer.textContent = '';
+      this._updateScrollMode();
+    }
+  }, {
+    key: '_scrollUpdate',
+    value: function _scrollUpdate() {
+      if (this.pagesCount === 0) {
+        return;
+      }
+      this.update();
+    }
+  }, {
+    key: '_scrollIntoView',
+    value: function _scrollIntoView(_ref) {
+      var pageDiv = _ref.pageDiv,
+          _ref$pageSpot = _ref.pageSpot,
+          pageSpot = _ref$pageSpot === undefined ? null : _ref$pageSpot,
+          _ref$pageNumber = _ref.pageNumber,
+          pageNumber = _ref$pageNumber === undefined ? null : _ref$pageNumber;
+
+      throw new Error('Not implemented: _scrollIntoView');
+    }
+  }, {
+    key: '_setScaleDispatchEvent',
+    value: function _setScaleDispatchEvent(newScale, newValue) {
+      var preset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
+
+      var arg = {
+        source: this,
+        scale: newScale,
+        presetValue: preset ? newValue : undefined
+      };
+      this.eventBus.dispatch('scalechanging', arg);
+      this.eventBus.dispatch('scalechange', arg);
+    }
+  }, {
+    key: '_setScaleUpdatePages',
+    value: function _setScaleUpdatePages(newScale, newValue) {
+      var noScroll = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
+      var preset = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
+
+      this._currentScaleValue = newValue.toString();
+      if (isSameScale(this._currentScale, newScale)) {
+        if (preset) {
+          this._setScaleDispatchEvent(newScale, newValue, true);
+        }
+        return;
+      }
+      for (var i = 0, ii = this._pages.length; i < ii; i++) {
+        this._pages[i].update(newScale);
+      }
+      this._currentScale = newScale;
+      if (!noScroll) {
+        var page = this._currentPageNumber,
+            dest = void 0;
+        if (this._location && !(this.isInPresentationMode || this.isChangingPresentationMode)) {
+          page = this._location.pageNumber;
+          dest = [null, { name: 'XYZ' }, this._location.left, this._location.top, null];
+        }
+        this.scrollPageIntoView({
+          pageNumber: page,
+          destArray: dest,
+          allowNegativeOffset: true
+        });
+      }
+      this._setScaleDispatchEvent(newScale, newValue, preset);
+      if (this.defaultRenderingQueue) {
+        this.update();
+      }
+    }
+  }, {
+    key: '_setScale',
+    value: function _setScale(value) {
+      var noScroll = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+
+      var scale = parseFloat(value);
+      if (scale > 0) {
+        this._setScaleUpdatePages(scale, value, noScroll, false);
+      } else {
+        var currentPage = this._pages[this._currentPageNumber - 1];
+        if (!currentPage) {
+          return;
+        }
+        var noPadding = this.isInPresentationMode || this.removePageBorders;
+        var hPadding = noPadding ? 0 : _ui_utils.SCROLLBAR_PADDING;
+        var vPadding = noPadding ? 0 : _ui_utils.VERTICAL_PADDING;
+        if (!noPadding && this._isScrollModeHorizontal) {
+          var _ref2 = [vPadding, hPadding];
+          hPadding = _ref2[0];
+          vPadding = _ref2[1];
+        }
+        var pageWidthScale = (this.container.clientWidth - hPadding) / currentPage.width * currentPage.scale;
+        var pageHeightScale = (this.container.clientHeight - vPadding) / currentPage.height * currentPage.scale;
+        switch (value) {
+          case 'page-actual':
+            scale = 1;
+            break;
+          case 'page-width':
+            scale = pageWidthScale;
+            break;
+          case 'page-height':
+            scale = pageHeightScale;
+            break;
+          case 'page-fit':
+            scale = Math.min(pageWidthScale, pageHeightScale);
+            break;
+          case 'auto':
+            var horizontalScale = (0, _ui_utils.isPortraitOrientation)(currentPage) ? pageWidthScale : Math.min(pageHeightScale, pageWidthScale);
+            scale = Math.min(_ui_utils.MAX_AUTO_SCALE, horizontalScale);
+            break;
+          default:
+            console.error(this._name + '._setScale: "' + value + '" is an unknown zoom value.');
+            return;
+        }
+        this._setScaleUpdatePages(scale, value, noScroll, true);
+      }
+    }
+  }, {
+    key: '_resetCurrentPageView',
+    value: function _resetCurrentPageView() {
+      if (this.isInPresentationMode) {
+        this._setScale(this._currentScaleValue, true);
+      }
+      var pageView = this._pages[this._currentPageNumber - 1];
+      this._scrollIntoView({ pageDiv: pageView.div });
+    }
+  }, {
+    key: 'scrollPageIntoView',
+    value: function scrollPageIntoView(params) {
+      if (!this.pdfDocument) {
+        return;
+      }
+      var pageNumber = params.pageNumber || 0;
+      var dest = params.destArray || null;
+      var allowNegativeOffset = params.allowNegativeOffset || false;
+      if (this.isInPresentationMode || !dest) {
+        this._setCurrentPageNumber(pageNumber, true);
+        return;
+      }
+      var pageView = this._pages[pageNumber - 1];
+      if (!pageView) {
+        console.error(this._name + '.scrollPageIntoView: Invalid "pageNumber" parameter.');
+        return;
+      }
+      var x = 0,
+          y = 0;
+      var width = 0,
+          height = 0,
+          widthScale = void 0,
+          heightScale = void 0;
+      var changeOrientation = pageView.rotation % 180 === 0 ? false : true;
+      var pageWidth = (changeOrientation ? pageView.height : pageView.width) / pageView.scale / _ui_utils.CSS_UNITS;
+      var pageHeight = (changeOrientation ? pageView.width : pageView.height) / pageView.scale / _ui_utils.CSS_UNITS;
+      var scale = 0;
+      switch (dest[1].name) {
+        case 'XYZ':
+          x = dest[2];
+          y = dest[3];
+          scale = dest[4];
+          x = x !== null ? x : 0;
+          y = y !== null ? y : pageHeight;
+          break;
+        case 'Fit':
+        case 'FitB':
+          scale = 'page-fit';
+          break;
+        case 'FitH':
+        case 'FitBH':
+          y = dest[2];
+          scale = 'page-width';
+          if (y === null && this._location) {
+            x = this._location.left;
+            y = this._location.top;
+          }
+          break;
+        case 'FitV':
+        case 'FitBV':
+          x = dest[2];
+          width = pageWidth;
+          height = pageHeight;
+          scale = 'page-height';
+          break;
+        case 'FitR':
+          x = dest[2];
+          y = dest[3];
+          width = dest[4] - x;
+          height = dest[5] - y;
+          var hPadding = this.removePageBorders ? 0 : _ui_utils.SCROLLBAR_PADDING;
+          var vPadding = this.removePageBorders ? 0 : _ui_utils.VERTICAL_PADDING;
+          widthScale = (this.container.clientWidth - hPadding) / width / _ui_utils.CSS_UNITS;
+          heightScale = (this.container.clientHeight - vPadding) / height / _ui_utils.CSS_UNITS;
+          scale = Math.min(Math.abs(widthScale), Math.abs(heightScale));
+          break;
+        default:
+          console.error(this._name + '.scrollPageIntoView: "' + dest[1].name + '" ' + 'is not a valid destination type.');
+          return;
+      }
+      if (scale && scale !== this._currentScale) {
+        this.currentScaleValue = scale;
+      } else if (this._currentScale === _ui_utils.UNKNOWN_SCALE) {
+        this.currentScaleValue = _ui_utils.DEFAULT_SCALE_VALUE;
+      }
+      if (scale === 'page-fit' && !dest[4]) {
+        this._scrollIntoView({
+          pageDiv: pageView.div,
+          pageNumber: pageNumber
+        });
+        return;
+      }
+      var boundingRect = [pageView.viewport.convertToViewportPoint(x, y), pageView.viewport.convertToViewportPoint(x + width, y + height)];
+      var left = Math.min(boundingRect[0][0], boundingRect[1][0]);
+      var top = Math.min(boundingRect[0][1], boundingRect[1][1]);
+      if (!allowNegativeOffset) {
+        left = Math.max(left, 0);
+        top = Math.max(top, 0);
+      }
+      this._scrollIntoView({
+        pageDiv: pageView.div,
+        pageSpot: {
+          left: left,
+          top: top
+        },
+        pageNumber: pageNumber
+      });
+    }
+  }, {
+    key: '_resizeBuffer',
+    value: function _resizeBuffer(numVisiblePages, visiblePages) {
+      var suggestedCacheSize = Math.max(DEFAULT_CACHE_SIZE, 2 * numVisiblePages + 1);
+      this._buffer.resize(suggestedCacheSize, visiblePages);
+    }
+  }, {
+    key: '_updateLocation',
+    value: function _updateLocation(firstPage) {
+      var currentScale = this._currentScale;
+      var currentScaleValue = this._currentScaleValue;
+      var normalizedScaleValue = parseFloat(currentScaleValue) === currentScale ? Math.round(currentScale * 10000) / 100 : currentScaleValue;
+      var pageNumber = firstPage.id;
+      var pdfOpenParams = '#page=' + pageNumber;
+      pdfOpenParams += '&zoom=' + normalizedScaleValue;
+      var currentPageView = this._pages[pageNumber - 1];
+      var container = this.container;
+      var topLeft = currentPageView.getPagePoint(container.scrollLeft - firstPage.x, container.scrollTop - firstPage.y);
+      var intLeft = Math.round(topLeft[0]);
+      var intTop = Math.round(topLeft[1]);
+      pdfOpenParams += ',' + intLeft + ',' + intTop;
+      this._location = {
+        pageNumber: pageNumber,
+        scale: normalizedScaleValue,
+        top: intTop,
+        left: intLeft,
+        rotation: this._pagesRotation,
+        pdfOpenParams: pdfOpenParams
+      };
+    }
+  }, {
+    key: 'update',
+    value: function update() {
+      throw new Error('Not implemented: update');
+    }
+  }, {
+    key: 'containsElement',
+    value: function containsElement(element) {
+      return this.container.contains(element);
+    }
+  }, {
+    key: 'focus',
+    value: function focus() {
+      this.container.focus();
+    }
+  }, {
+    key: '_getVisiblePages',
+    value: function _getVisiblePages() {
+      throw new Error('Not implemented: _getVisiblePages');
+    }
+  }, {
+    key: 'cleanup',
+    value: function cleanup() {
+      for (var i = 0, ii = this._pages.length; i < ii; i++) {
+        if (this._pages[i] && this._pages[i].renderingState !== _pdf_rendering_queue.RenderingStates.FINISHED) {
+          this._pages[i].reset();
+        }
+      }
+    }
+  }, {
+    key: '_cancelRendering',
+    value: function _cancelRendering() {
+      for (var i = 0, ii = this._pages.length; i < ii; i++) {
+        if (this._pages[i]) {
+          this._pages[i].cancelRendering();
+        }
+      }
+    }
+  }, {
+    key: '_ensurePdfPageLoaded',
+    value: function _ensurePdfPageLoaded(pageView) {
+      var _this3 = this;
+
+      if (pageView.pdfPage) {
+        return Promise.resolve(pageView.pdfPage);
+      }
+      var pageNumber = pageView.id;
+      if (this._pagesRequests[pageNumber]) {
+        return this._pagesRequests[pageNumber];
+      }
+      var promise = this.pdfDocument.getPage(pageNumber).then(function (pdfPage) {
+        if (!pageView.pdfPage) {
+          pageView.setPdfPage(pdfPage);
+        }
+        _this3._pagesRequests[pageNumber] = null;
+        return pdfPage;
+      }).catch(function (reason) {
+        console.error('Unable to get page for page view', reason);
+        _this3._pagesRequests[pageNumber] = null;
+      });
+      this._pagesRequests[pageNumber] = promise;
+      return promise;
+    }
+  }, {
+    key: 'forceRendering',
+    value: function forceRendering(currentlyVisiblePages) {
+      var _this4 = this;
+
+      var visiblePages = currentlyVisiblePages || this._getVisiblePages();
+      var scrollAhead = this._isScrollModeHorizontal ? this.scroll.right : this.scroll.down;
+      var pageView = this.renderingQueue.getHighestPriority(visiblePages, this._pages, scrollAhead);
+      if (pageView) {
+        this._ensurePdfPageLoaded(pageView).then(function () {
+          _this4.renderingQueue.renderView(pageView);
+        });
+        return true;
+      }
+      return false;
+    }
+  }, {
+    key: 'createTextLayerBuilder',
+    value: function createTextLayerBuilder(textLayerDiv, pageIndex, viewport) {
+      var enhanceTextSelection = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
+
+      return new _text_layer_builder.TextLayerBuilder({
+        textLayerDiv: textLayerDiv,
+        eventBus: this.eventBus,
+        pageIndex: pageIndex,
+        viewport: viewport,
+        findController: this.isInPresentationMode ? null : this.findController,
+        enhanceTextSelection: this.isInPresentationMode ? false : enhanceTextSelection
+      });
+    }
+  }, {
+    key: 'createAnnotationLayerBuilder',
+    value: function createAnnotationLayerBuilder(pageDiv, pdfPage) {
+      var imageResourcesPath = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
+      var renderInteractiveForms = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
+      var l10n = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : _ui_utils.NullL10n;
+
+      return new _annotation_layer_builder.AnnotationLayerBuilder({
+        pageDiv: pageDiv,
+        pdfPage: pdfPage,
+        imageResourcesPath: imageResourcesPath,
+        renderInteractiveForms: renderInteractiveForms,
+        linkService: this.linkService,
+        downloadManager: this.downloadManager,
+        l10n: l10n
+      });
+    }
+  }, {
+    key: 'getPagesOverview',
+    value: function getPagesOverview() {
+      var pagesOverview = this._pages.map(function (pageView) {
+        var viewport = pageView.pdfPage.getViewport(1);
+        return {
+          width: viewport.width,
+          height: viewport.height,
+          rotation: viewport.rotation
+        };
+      });
+      if (!this.enablePrintAutoRotate) {
+        return pagesOverview;
+      }
+      var isFirstPagePortrait = (0, _ui_utils.isPortraitOrientation)(pagesOverview[0]);
+      return pagesOverview.map(function (size) {
+        if (isFirstPagePortrait === (0, _ui_utils.isPortraitOrientation)(size)) {
+          return size;
+        }
+        return {
+          width: size.height,
+          height: size.width,
+          rotation: (size.rotation + 90) % 360
+        };
+      });
+    }
+  }, {
+    key: '_updateScrollMode',
+    value: function _updateScrollMode() {
+      var pageNumber = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
+
+      var scrollMode = this._scrollMode,
+          viewer = this.viewer;
+      viewer.classList.toggle('scrollHorizontal', scrollMode === ScrollMode.HORIZONTAL);
+      viewer.classList.toggle('scrollWrapped', scrollMode === ScrollMode.WRAPPED);
+      if (!this.pdfDocument || !pageNumber) {
+        return;
+      }
+      if (this._currentScaleValue && isNaN(this._currentScaleValue)) {
+        this._setScale(this._currentScaleValue, true);
+      }
+      this.scrollPageIntoView({ pageNumber: pageNumber });
+      this.update();
+    }
+  }, {
+    key: '_updateSpreadMode',
+    value: function _updateSpreadMode() {
+      var pageNumber = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
+
+      if (!this.pdfDocument) {
+        return;
+      }
+      var viewer = this.viewer,
+          pages = this._pages;
+      viewer.textContent = '';
+      if (this._spreadMode === SpreadMode.NONE) {
+        for (var i = 0, iMax = pages.length; i < iMax; ++i) {
+          viewer.appendChild(pages[i].div);
+        }
+      } else {
+        var parity = this._spreadMode - 1;
+        var spread = null;
+        for (var _i = 0, _iMax = pages.length; _i < _iMax; ++_i) {
+          if (spread === null) {
+            spread = document.createElement('div');
+            spread.className = 'spread';
+            viewer.appendChild(spread);
+          } else if (_i % 2 === parity) {
+            spread = spread.cloneNode(false);
+            viewer.appendChild(spread);
+          }
+          spread.appendChild(pages[_i].div);
+        }
+      }
+      if (!pageNumber) {
+        return;
+      }
+      this.scrollPageIntoView({ pageNumber: pageNumber });
+      this.update();
+    }
+  }, {
+    key: 'pagesCount',
+    get: function get() {
+      return this._pages.length;
+    }
+  }, {
+    key: 'pageViewsReady',
+    get: function get() {
+      return this._pageViewsReady;
+    }
+  }, {
+    key: 'currentPageNumber',
+    get: function get() {
+      return this._currentPageNumber;
+    },
+    set: function set(val) {
+      if (!Number.isInteger(val)) {
+        throw new Error('Invalid page number.');
+      }
+      if (!this.pdfDocument) {
+        return;
+      }
+      this._setCurrentPageNumber(val, true);
+    }
+  }, {
+    key: 'currentPageLabel',
+    get: function get() {
+      return this._pageLabels && this._pageLabels[this._currentPageNumber - 1];
+    },
+    set: function set(val) {
+      var pageNumber = val | 0;
+      if (this._pageLabels) {
+        var i = this._pageLabels.indexOf(val);
+        if (i >= 0) {
+          pageNumber = i + 1;
+        }
+      }
+      this.currentPageNumber = pageNumber;
+    }
+  }, {
+    key: 'currentScale',
+    get: function get() {
+      return this._currentScale !== _ui_utils.UNKNOWN_SCALE ? this._currentScale : _ui_utils.DEFAULT_SCALE;
+    },
+    set: function set(val) {
+      if (isNaN(val)) {
+        throw new Error('Invalid numeric scale');
+      }
+      if (!this.pdfDocument) {
+        return;
+      }
+      this._setScale(val, false);
+    }
+  }, {
+    key: 'currentScaleValue',
+    get: function get() {
+      return this._currentScaleValue;
+    },
+    set: function set(val) {
+      if (!this.pdfDocument) {
+        return;
+      }
+      this._setScale(val, false);
+    }
+  }, {
+    key: 'pagesRotation',
+    get: function get() {
+      return this._pagesRotation;
+    },
+    set: function set(rotation) {
+      if (!(0, _ui_utils.isValidRotation)(rotation)) {
+        throw new Error('Invalid pages rotation angle.');
+      }
+      if (!this.pdfDocument) {
+        return;
+      }
+      if (this._pagesRotation === rotation) {
+        return;
+      }
+      this._pagesRotation = rotation;
+      var pageNumber = this._currentPageNumber;
+      for (var i = 0, ii = this._pages.length; i < ii; i++) {
+        var pageView = this._pages[i];
+        pageView.update(pageView.scale, rotation);
+      }
+      if (this._currentScaleValue) {
+        this._setScale(this._currentScaleValue, true);
+      }
+      this.eventBus.dispatch('rotationchanging', {
+        source: this,
+        pagesRotation: rotation,
+        pageNumber: pageNumber
+      });
+      if (this.defaultRenderingQueue) {
+        this.update();
+      }
+    }
+  }, {
+    key: '_setDocumentViewerElement',
+    get: function get() {
+      throw new Error('Not implemented: _setDocumentViewerElement');
+    }
+  }, {
+    key: '_isScrollModeHorizontal',
+    get: function get() {
+      throw new Error('Not implemented: _isScrollModeHorizontal');
+    }
+  }, {
+    key: 'isInPresentationMode',
+    get: function get() {
+      return this.presentationModeState === _ui_utils.PresentationModeState.FULLSCREEN;
+    }
+  }, {
+    key: 'isChangingPresentationMode',
+    get: function get() {
+      return this.presentationModeState === _ui_utils.PresentationModeState.CHANGING;
+    }
+  }, {
+    key: 'isHorizontalScrollbarEnabled',
+    get: function get() {
+      return this.isInPresentationMode ? false : this.container.scrollWidth > this.container.clientWidth;
+    }
+  }, {
+    key: 'isVerticalScrollbarEnabled',
+    get: function get() {
+      return this.isInPresentationMode ? false : this.container.scrollHeight > this.container.clientHeight;
+    }
+  }, {
+    key: 'hasEqualPageSizes',
+    get: function get() {
+      var firstPageView = this._pages[0];
+      for (var i = 1, ii = this._pages.length; i < ii; ++i) {
+        var pageView = this._pages[i];
+        if (pageView.width !== firstPageView.width || pageView.height !== firstPageView.height) {
+          return false;
+        }
+      }
+      return true;
+    }
+  }, {
+    key: 'scrollMode',
+    get: function get() {
+      return this._scrollMode;
+    },
+    set: function set(mode) {
+      if (this._scrollMode === mode) {
+        return;
+      }
+      if (!Number.isInteger(mode) || !Object.values(ScrollMode).includes(mode)) {
+        throw new Error('Invalid scroll mode: ' + mode);
+      }
+      this._scrollMode = mode;
+      this.eventBus.dispatch('scrollmodechanged', {
+        source: this,
+        mode: mode
+      });
+      this._updateScrollMode(this._currentPageNumber);
+    }
+  }, {
+    key: 'spreadMode',
+    get: function get() {
+      return this._spreadMode;
+    },
+    set: function set(mode) {
+      if (this._spreadMode === mode) {
+        return;
+      }
+      if (!Number.isInteger(mode) || !Object.values(SpreadMode).includes(mode)) {
+        throw new Error('Invalid spread mode: ' + mode);
+      }
+      this._spreadMode = mode;
+      this.eventBus.dispatch('spreadmodechanged', {
+        source: this,
+        mode: mode
+      });
+      this._updateSpreadMode(this._currentPageNumber);
+    }
+  }]);
+
+  return BaseViewer;
+}();
+
+exports.BaseViewer = BaseViewer;
+exports.ScrollMode = ScrollMode;
+exports.SpreadMode = SpreadMode;
+
+/***/ }),
+/* 31 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.DefaultAnnotationLayerFactory = exports.AnnotationLayerBuilder = undefined;
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _pdfjsLib = __webpack_require__(7);
+
+var _ui_utils = __webpack_require__(6);
+
+var _pdf_link_service = __webpack_require__(23);
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var AnnotationLayerBuilder = function () {
+  function AnnotationLayerBuilder(_ref) {
+    var pageDiv = _ref.pageDiv,
+        pdfPage = _ref.pdfPage,
+        linkService = _ref.linkService,
+        downloadManager = _ref.downloadManager,
+        _ref$imageResourcesPa = _ref.imageResourcesPath,
+        imageResourcesPath = _ref$imageResourcesPa === undefined ? '' : _ref$imageResourcesPa,
+        _ref$renderInteractiv = _ref.renderInteractiveForms,
+        renderInteractiveForms = _ref$renderInteractiv === undefined ? false : _ref$renderInteractiv,
+        _ref$l10n = _ref.l10n,
+        l10n = _ref$l10n === undefined ? _ui_utils.NullL10n : _ref$l10n;
+
+    _classCallCheck(this, AnnotationLayerBuilder);
+
+    this.pageDiv = pageDiv;
+    this.pdfPage = pdfPage;
+    this.linkService = linkService;
+    this.downloadManager = downloadManager;
+    this.imageResourcesPath = imageResourcesPath;
+    this.renderInteractiveForms = renderInteractiveForms;
+    this.l10n = l10n;
+    this.div = null;
+    this._cancelled = false;
+  }
+
+  _createClass(AnnotationLayerBuilder, [{
+    key: 'render',
+    value: function render(viewport) {
+      var _this = this;
+
+      var intent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'display';
+
+      this.pdfPage.getAnnotations({ intent: intent }).then(function (annotations) {
+        if (_this._cancelled) {
+          return;
+        }
+        var parameters = {
+          viewport: viewport.clone({ dontFlip: true }),
+          div: _this.div,
+          annotations: annotations,
+          page: _this.pdfPage,
+          imageResourcesPath: _this.imageResourcesPath,
+          renderInteractiveForms: _this.renderInteractiveForms,
+          linkService: _this.linkService,
+          downloadManager: _this.downloadManager
+        };
+        if (_this.div) {
+          _pdfjsLib.AnnotationLayer.update(parameters);
+        } else {
+          if (annotations.length === 0) {
+            return;
+          }
+          _this.div = document.createElement('div');
+          _this.div.className = 'annotationLayer';
+          _this.pageDiv.appendChild(_this.div);
+          parameters.div = _this.div;
+          _pdfjsLib.AnnotationLayer.render(parameters);
+          _this.l10n.translate(_this.div);
+        }
+      });
+    }
+  }, {
+    key: 'cancel',
+    value: function cancel() {
+      this._cancelled = true;
+    }
+  }, {
+    key: 'hide',
+    value: function hide() {
+      if (!this.div) {
+        return;
+      }
+      this.div.setAttribute('hidden', 'true');
+    }
+  }]);
+
+  return AnnotationLayerBuilder;
+}();
+
+var DefaultAnnotationLayerFactory = function () {
+  function DefaultAnnotationLayerFactory() {
+    _classCallCheck(this, DefaultAnnotationLayerFactory);
+  }
+
+  _createClass(DefaultAnnotationLayerFactory, [{
+    key: 'createAnnotationLayerBuilder',
+    value: function createAnnotationLayerBuilder(pageDiv, pdfPage) {
+      var imageResourcesPath = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
+      var renderInteractiveForms = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
+      var l10n = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : _ui_utils.NullL10n;
+
+      return new AnnotationLayerBuilder({
+        pageDiv: pageDiv,
+        pdfPage: pdfPage,
+        imageResourcesPath: imageResourcesPath,
+        renderInteractiveForms: renderInteractiveForms,
+        linkService: new _pdf_link_service.SimpleLinkService(),
+        l10n: l10n
+      });
+    }
+  }]);
+
+  return DefaultAnnotationLayerFactory;
+}();
+
+exports.AnnotationLayerBuilder = AnnotationLayerBuilder;
+exports.DefaultAnnotationLayerFactory = DefaultAnnotationLayerFactory;
+
+/***/ }),
+/* 32 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.PDFPageView = undefined;
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _ui_utils = __webpack_require__(6);
+
+var _pdfjsLib = __webpack_require__(7);
+
+var _dom_events = __webpack_require__(14);
+
+var _pdf_rendering_queue = __webpack_require__(10);
+
+var _viewer_compatibility = __webpack_require__(13);
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var MAX_CANVAS_PIXELS = _viewer_compatibility.viewerCompatibilityParams.maxCanvasPixels || 16777216;
+
+var PDFPageView = function () {
+  function PDFPageView(options) {
+    _classCallCheck(this, PDFPageView);
+
+    var container = options.container;
+    var defaultViewport = options.defaultViewport;
+    this.id = options.id;
+    this.renderingId = 'page' + this.id;
+    this.pdfPage = null;
+    this.pageLabel = null;
+    this.rotation = 0;
+    this.scale = options.scale || _ui_utils.DEFAULT_SCALE;
+    this.viewport = defaultViewport;
+    this.pdfPageRotate = defaultViewport.rotation;
+    this.hasRestrictedScaling = false;
+    this.textLayerMode = Number.isInteger(options.textLayerMode) ? options.textLayerMode : _ui_utils.TextLayerMode.ENABLE;
+    this.imageResourcesPath = options.imageResourcesPath || '';
+    this.renderInteractiveForms = options.renderInteractiveForms || false;
+    this.useOnlyCssZoom = options.useOnlyCssZoom || false;
+    this.maxCanvasPixels = options.maxCanvasPixels || MAX_CANVAS_PIXELS;
+    this.eventBus = options.eventBus || (0, _dom_events.getGlobalEventBus)();
+    this.renderingQueue = options.renderingQueue;
+    this.textLayerFactory = options.textLayerFactory;
+    this.annotationLayerFactory = options.annotationLayerFactory;
+    this.renderer = options.renderer || _ui_utils.RendererType.CANVAS;
+    this.enableWebGL = options.enableWebGL || false;
+    this.l10n = options.l10n || _ui_utils.NullL10n;
+    this.paintTask = null;
+    this.paintedViewportMap = new WeakMap();
+    this.renderingState = _pdf_rendering_queue.RenderingStates.INITIAL;
+    this.resume = null;
+    this.error = null;
+    this.onBeforeDraw = null;
+    this.onAfterDraw = null;
+    this.annotationLayer = null;
+    this.textLayer = null;
+    this.zoomLayer = null;
+    var div = document.createElement('div');
+    div.className = 'page';
+    div.style.width = Math.floor(this.viewport.width) + 'px';
+    div.style.height = Math.floor(this.viewport.height) + 'px';
+    div.setAttribute('data-page-number', this.id);
+    this.div = div;
+    container.appendChild(div);
+  }
+
+  _createClass(PDFPageView, [{
+    key: 'setPdfPage',
+    value: function setPdfPage(pdfPage) {
+      this.pdfPage = pdfPage;
+      this.pdfPageRotate = pdfPage.rotate;
+      var totalRotation = (this.rotation + this.pdfPageRotate) % 360;
+      this.viewport = pdfPage.getViewport(this.scale * _ui_utils.CSS_UNITS, totalRotation);
+      this.stats = pdfPage.stats;
+      this.reset();
+    }
+  }, {
+    key: 'destroy',
+    value: function destroy() {
+      this.reset();
+      if (this.pdfPage) {
+        this.pdfPage.cleanup();
+      }
+    }
+  }, {
+    key: '_resetZoomLayer',
+    value: function _resetZoomLayer() {
+      var removeFromDOM = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+
+      if (!this.zoomLayer) {
+        return;
+      }
+      var zoomLayerCanvas = this.zoomLayer.firstChild;
+      this.paintedViewportMap.delete(zoomLayerCanvas);
+      zoomLayerCanvas.width = 0;
+      zoomLayerCanvas.height = 0;
+      if (removeFromDOM) {
+        this.zoomLayer.remove();
+      }
+      this.zoomLayer = null;
+    }
+  }, {
+    key: 'reset',
+    value: function reset() {
+      var keepZoomLayer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+      var keepAnnotations = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+
+      this.cancelRendering(keepAnnotations);
+      var div = this.div;
+      div.style.width = Math.floor(this.viewport.width) + 'px';
+      div.style.height = Math.floor(this.viewport.height) + 'px';
+      var childNodes = div.childNodes;
+      var currentZoomLayerNode = keepZoomLayer && this.zoomLayer || null;
+      var currentAnnotationNode = keepAnnotations && this.annotationLayer && this.annotationLayer.div || null;
+      for (var i = childNodes.length - 1; i >= 0; i--) {
+        var node = childNodes[i];
+        if (currentZoomLayerNode === node || currentAnnotationNode === node) {
+          continue;
+        }
+        div.removeChild(node);
+      }
+      div.removeAttribute('data-loaded');
+      if (currentAnnotationNode) {
+        this.annotationLayer.hide();
+      } else if (this.annotationLayer) {
+        this.annotationLayer.cancel();
+        this.annotationLayer = null;
+      }
+      if (!currentZoomLayerNode) {
+        if (this.canvas) {
+          this.paintedViewportMap.delete(this.canvas);
+          this.canvas.width = 0;
+          this.canvas.height = 0;
+          delete this.canvas;
+        }
+        this._resetZoomLayer();
+      }
+      if (this.svg) {
+        this.paintedViewportMap.delete(this.svg);
+        delete this.svg;
+      }
+      this.loadingIconDiv = document.createElement('div');
+      this.loadingIconDiv.className = 'loadingIcon';
+      div.appendChild(this.loadingIconDiv);
+    }
+  }, {
+    key: 'update',
+    value: function update(scale, rotation) {
+      this.scale = scale || this.scale;
+      if (typeof rotation !== 'undefined') {
+        this.rotation = rotation;
+      }
+      var totalRotation = (this.rotation + this.pdfPageRotate) % 360;
+      this.viewport = this.viewport.clone({
+        scale: this.scale * _ui_utils.CSS_UNITS,
+        rotation: totalRotation
+      });
+      if (this.svg) {
+        this.cssTransform(this.svg, true);
+        this.eventBus.dispatch('pagerendered', {
+          source: this,
+          pageNumber: this.id,
+          cssTransform: true
+        });
+        return;
+      }
+      var isScalingRestricted = false;
+      if (this.canvas && this.maxCanvasPixels > 0) {
+        var outputScale = this.outputScale;
+        if ((Math.floor(this.viewport.width) * outputScale.sx | 0) * (Math.floor(this.viewport.height) * outputScale.sy | 0) > this.maxCanvasPixels) {
+          isScalingRestricted = true;
+        }
+      }
+      if (this.canvas) {
+        if (this.useOnlyCssZoom || this.hasRestrictedScaling && isScalingRestricted) {
+          this.cssTransform(this.canvas, true);
+          this.eventBus.dispatch('pagerendered', {
+            source: this,
+            pageNumber: this.id,
+            cssTransform: true
+          });
+          return;
+        }
+        if (!this.zoomLayer && !this.canvas.hasAttribute('hidden')) {
+          this.zoomLayer = this.canvas.parentNode;
+          this.zoomLayer.style.position = 'absolute';
+        }
+      }
+      if (this.zoomLayer) {
+        this.cssTransform(this.zoomLayer.firstChild);
+      }
+      this.reset(true, true);
+    }
+  }, {
+    key: 'cancelRendering',
+    value: function cancelRendering() {
+      var keepAnnotations = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+
+      var renderingState = this.renderingState;
+      if (this.paintTask) {
+        this.paintTask.cancel();
+        this.paintTask = null;
+      }
+      this.renderingState = _pdf_rendering_queue.RenderingStates.INITIAL;
+      this.resume = null;
+      if (this.textLayer) {
+        this.textLayer.cancel();
+        this.textLayer = null;
+      }
+      if (!keepAnnotations && this.annotationLayer) {
+        this.annotationLayer.cancel();
+        this.annotationLayer = null;
+      }
+      if (renderingState !== _pdf_rendering_queue.RenderingStates.INITIAL) {
+        this.eventBus.dispatch('pagecancelled', {
+          source: this,
+          pageNumber: this.id,
+          renderingState: renderingState
+        });
+      }
+    }
+  }, {
+    key: 'cssTransform',
+    value: function cssTransform(target) {
+      var redrawAnnotations = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+
+      var width = this.viewport.width;
+      var height = this.viewport.height;
+      var div = this.div;
+      target.style.width = target.parentNode.style.width = div.style.width = Math.floor(width) + 'px';
+      target.style.height = target.parentNode.style.height = div.style.height = Math.floor(height) + 'px';
+      var relativeRotation = this.viewport.rotation - this.paintedViewportMap.get(target).rotation;
+      var absRotation = Math.abs(relativeRotation);
+      var scaleX = 1,
+          scaleY = 1;
+      if (absRotation === 90 || absRotation === 270) {
+        scaleX = height / width;
+        scaleY = width / height;
+      }
+      var cssTransform = 'rotate(' + relativeRotation + 'deg) ' + 'scale(' + scaleX + ',' + scaleY + ')';
+      target.style.transform = cssTransform;
+      if (this.textLayer) {
+        var textLayerViewport = this.textLayer.viewport;
+        var textRelativeRotation = this.viewport.rotation - textLayerViewport.rotation;
+        var textAbsRotation = Math.abs(textRelativeRotation);
+        var scale = width / textLayerViewport.width;
+        if (textAbsRotation === 90 || textAbsRotation === 270) {
+          scale = width / textLayerViewport.height;
+        }
+        var textLayerDiv = this.textLayer.textLayerDiv;
+        var transX = void 0,
+            transY = void 0;
+        switch (textAbsRotation) {
+          case 0:
+            transX = transY = 0;
+            break;
+          case 90:
+            transX = 0;
+            transY = '-' + textLayerDiv.style.height;
+            break;
+          case 180:
+            transX = '-' + textLayerDiv.style.width;
+            transY = '-' + textLayerDiv.style.height;
+            break;
+          case 270:
+            transX = '-' + textLayerDiv.style.width;
+            transY = 0;
+            break;
+          default:
+            console.error('Bad rotation value.');
+            break;
+        }
+        textLayerDiv.style.transform = 'rotate(' + textAbsRotation + 'deg) ' + 'scale(' + scale + ', ' + scale + ') ' + 'translate(' + transX + ', ' + transY + ')';
+        textLayerDiv.style.transformOrigin = '0% 0%';
+      }
+      if (redrawAnnotations && this.annotationLayer) {
+        this.annotationLayer.render(this.viewport, 'display');
+      }
+    }
+  }, {
+    key: 'getPagePoint',
+    value: function getPagePoint(x, y) {
+      return this.viewport.convertToPdfPoint(x, y);
+    }
+  }, {
+    key: 'draw',
+    value: function draw() {
+      var _this = this;
+
+      if (this.renderingState !== _pdf_rendering_queue.RenderingStates.INITIAL) {
+        console.error('Must be in new state before drawing');
+        this.reset();
+      }
+      if (!this.pdfPage) {
+        this.renderingState = _pdf_rendering_queue.RenderingStates.FINISHED;
+        return Promise.reject(new Error('Page is not loaded'));
+      }
+      this.renderingState = _pdf_rendering_queue.RenderingStates.RUNNING;
+      var pdfPage = this.pdfPage;
+      var div = this.div;
+      var canvasWrapper = document.createElement('div');
+      canvasWrapper.style.width = div.style.width;
+      canvasWrapper.style.height = div.style.height;
+      canvasWrapper.classList.add('canvasWrapper');
+      if (this.annotationLayer && this.annotationLayer.div) {
+        div.insertBefore(canvasWrapper, this.annotationLayer.div);
+      } else {
+        div.appendChild(canvasWrapper);
+      }
+      var textLayer = null;
+      if (this.textLayerMode !== _ui_utils.TextLayerMode.DISABLE && this.textLayerFactory) {
+        var textLayerDiv = document.createElement('div');
+        textLayerDiv.className = 'textLayer';
+        textLayerDiv.style.width = canvasWrapper.style.width;
+        textLayerDiv.style.height = canvasWrapper.style.height;
+        if (this.annotationLayer && this.annotationLayer.div) {
+          div.insertBefore(textLayerDiv, this.annotationLayer.div);
+        } else {
+          div.appendChild(textLayerDiv);
+        }
+        textLayer = this.textLayerFactory.createTextLayerBuilder(textLayerDiv, this.id - 1, this.viewport, this.textLayerMode === _ui_utils.TextLayerMode.ENABLE_ENHANCE);
+      }
+      this.textLayer = textLayer;
+      var renderContinueCallback = null;
+      if (this.renderingQueue) {
+        renderContinueCallback = function renderContinueCallback(cont) {
+          if (!_this.renderingQueue.isHighestPriority(_this)) {
+            _this.renderingState = _pdf_rendering_queue.RenderingStates.PAUSED;
+            _this.resume = function () {
+              _this.renderingState = _pdf_rendering_queue.RenderingStates.RUNNING;
+              cont();
+            };
+            return;
+          }
+          cont();
+        };
+      }
+      var finishPaintTask = function finishPaintTask(error) {
+        if (paintTask === _this.paintTask) {
+          _this.paintTask = null;
+        }
+        if (error instanceof _pdfjsLib.RenderingCancelledException) {
+          _this.error = null;
+          return Promise.resolve(undefined);
+        }
+        _this.renderingState = _pdf_rendering_queue.RenderingStates.FINISHED;
+        if (_this.loadingIconDiv) {
+          div.removeChild(_this.loadingIconDiv);
+          delete _this.loadingIconDiv;
+        }
+        _this._resetZoomLayer(true);
+        _this.error = error;
+        _this.stats = pdfPage.stats;
+        if (_this.onAfterDraw) {
+          _this.onAfterDraw();
+        }
+        _this.eventBus.dispatch('pagerendered', {
+          source: _this,
+          pageNumber: _this.id,
+          cssTransform: false
+        });
+        if (error) {
+          return Promise.reject(error);
+        }
+        return Promise.resolve(undefined);
+      };
+      var paintTask = this.renderer === _ui_utils.RendererType.SVG ? this.paintOnSvg(canvasWrapper) : this.paintOnCanvas(canvasWrapper);
+      paintTask.onRenderContinue = renderContinueCallback;
+      this.paintTask = paintTask;
+      var resultPromise = paintTask.promise.then(function () {
+        return finishPaintTask(null).then(function () {
+          if (textLayer) {
+            var readableStream = pdfPage.streamTextContent({ normalizeWhitespace: true });
+            textLayer.setTextContentStream(readableStream);
+            textLayer.render();
+          }
+        });
+      }, function (reason) {
+        return finishPaintTask(reason);
+      });
+      if (this.annotationLayerFactory) {
+        if (!this.annotationLayer) {
+          this.annotationLayer = this.annotationLayerFactory.createAnnotationLayerBuilder(div, pdfPage, this.imageResourcesPath, this.renderInteractiveForms, this.l10n);
+        }
+        this.annotationLayer.render(this.viewport, 'display');
+      }
+      div.setAttribute('data-loaded', true);
+      if (this.onBeforeDraw) {
+        this.onBeforeDraw();
+      }
+      return resultPromise;
+    }
+  }, {
+    key: 'paintOnCanvas',
+    value: function paintOnCanvas(canvasWrapper) {
+      var renderCapability = (0, _pdfjsLib.createPromiseCapability)();
+      var result = {
+        promise: renderCapability.promise,
+        onRenderContinue: function onRenderContinue(cont) {
+          cont();
+        },
+        cancel: function cancel() {
+          renderTask.cancel();
+        }
+      };
+      var viewport = this.viewport;
+      var canvas = document.createElement('canvas');
+      canvas.id = this.renderingId;
+      canvas.setAttribute('hidden', 'hidden');
+      var isCanvasHidden = true;
+      var showCanvas = function showCanvas() {
+        if (isCanvasHidden) {
+          canvas.removeAttribute('hidden');
+          isCanvasHidden = false;
+        }
+      };
+      canvasWrapper.appendChild(canvas);
+      this.canvas = canvas;
+      canvas.mozOpaque = true;
+      var ctx = canvas.getContext('2d', { alpha: false });
+      var outputScale = (0, _ui_utils.getOutputScale)(ctx);
+      this.outputScale = outputScale;
+      if (this.useOnlyCssZoom) {
+        var actualSizeViewport = viewport.clone({ scale: _ui_utils.CSS_UNITS });
+        outputScale.sx *= actualSizeViewport.width / viewport.width;
+        outputScale.sy *= actualSizeViewport.height / viewport.height;
+        outputScale.scaled = true;
+      }
+      if (this.maxCanvasPixels > 0) {
+        var pixelsInViewport = viewport.width * viewport.height;
+        var maxScale = Math.sqrt(this.maxCanvasPixels / pixelsInViewport);
+        if (outputScale.sx > maxScale || outputScale.sy > maxScale) {
+          outputScale.sx = maxScale;
+          outputScale.sy = maxScale;
+          outputScale.scaled = true;
+          this.hasRestrictedScaling = true;
+        } else {
+          this.hasRestrictedScaling = false;
+        }
+      }
+      var sfx = (0, _ui_utils.approximateFraction)(outputScale.sx);
+      var sfy = (0, _ui_utils.approximateFraction)(outputScale.sy);
+      canvas.width = (0, _ui_utils.roundToDivide)(viewport.width * outputScale.sx, sfx[0]);
+      canvas.height = (0, _ui_utils.roundToDivide)(viewport.height * outputScale.sy, sfy[0]);
+      canvas.style.width = (0, _ui_utils.roundToDivide)(viewport.width, sfx[1]) + 'px';
+      canvas.style.height = (0, _ui_utils.roundToDivide)(viewport.height, sfy[1]) + 'px';
+      this.paintedViewportMap.set(canvas, viewport);
+      var transform = !outputScale.scaled ? null : [outputScale.sx, 0, 0, outputScale.sy, 0, 0];
+      var renderContext = {
+        canvasContext: ctx,
+        transform: transform,
+        viewport: this.viewport,
+        enableWebGL: this.enableWebGL,
+        renderInteractiveForms: this.renderInteractiveForms
+      };
+      var renderTask = this.pdfPage.render(renderContext);
+      renderTask.onContinue = function (cont) {
+        showCanvas();
+        if (result.onRenderContinue) {
+          result.onRenderContinue(cont);
+        } else {
+          cont();
+        }
+      };
+      renderTask.promise.then(function () {
+        showCanvas();
+        renderCapability.resolve(undefined);
+      }, function (error) {
+        showCanvas();
+        renderCapability.reject(error);
+      });
+      return result;
+    }
+  }, {
+    key: 'paintOnSvg',
+    value: function paintOnSvg(wrapper) {
+      var _this2 = this;
+
+      var cancelled = false;
+      var ensureNotCancelled = function ensureNotCancelled() {
+        if (cancelled) {
+          throw new _pdfjsLib.RenderingCancelledException('Rendering cancelled, page ' + _this2.id, 'svg');
+        }
+      };
+      var pdfPage = this.pdfPage;
+      var actualSizeViewport = this.viewport.clone({ scale: _ui_utils.CSS_UNITS });
+      var promise = pdfPage.getOperatorList().then(function (opList) {
+        ensureNotCancelled();
+        var svgGfx = new _pdfjsLib.SVGGraphics(pdfPage.commonObjs, pdfPage.objs);
+        return svgGfx.getSVG(opList, actualSizeViewport).then(function (svg) {
+          ensureNotCancelled();
+          _this2.svg = svg;
+          _this2.paintedViewportMap.set(svg, actualSizeViewport);
+          svg.style.width = wrapper.style.width;
+          svg.style.height = wrapper.style.height;
+          _this2.renderingState = _pdf_rendering_queue.RenderingStates.FINISHED;
+          wrapper.appendChild(svg);
+        });
+      });
+      return {
+        promise: promise,
+        onRenderContinue: function onRenderContinue(cont) {
+          cont();
+        },
+        cancel: function cancel() {
+          cancelled = true;
+        }
+      };
+    }
+  }, {
+    key: 'setPageLabel',
+    value: function setPageLabel(label) {
+      this.pageLabel = typeof label === 'string' ? label : null;
+      if (this.pageLabel !== null) {
+        this.div.setAttribute('data-page-label', this.pageLabel);
+      } else {
+        this.div.removeAttribute('data-page-label');
+      }
+    }
+  }, {
+    key: 'width',
+    get: function get() {
+      return this.viewport.width;
+    }
+  }, {
+    key: 'height',
+    get: function get() {
+      return this.viewport.height;
+    }
+  }]);
+
+  return PDFPageView;
+}();
+
+exports.PDFPageView = PDFPageView;
+
+/***/ }),
+/* 33 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.DefaultTextLayerFactory = exports.TextLayerBuilder = undefined;
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _dom_events = __webpack_require__(14);
+
+var _pdfjsLib = __webpack_require__(7);
+
+var _ui_utils = __webpack_require__(6);
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var EXPAND_DIVS_TIMEOUT = 300;
+var MATCH_SCROLL_OFFSET_TOP = -50;
+var MATCH_SCROLL_OFFSET_LEFT = -400;
+
+var TextLayerBuilder = function () {
+  function TextLayerBuilder(_ref) {
+    var textLayerDiv = _ref.textLayerDiv,
+        eventBus = _ref.eventBus,
+        pageIndex = _ref.pageIndex,
+        viewport = _ref.viewport,
+        _ref$findController = _ref.findController,
+        findController = _ref$findController === undefined ? null : _ref$findController,
+        _ref$enhanceTextSelec = _ref.enhanceTextSelection,
+        enhanceTextSelection = _ref$enhanceTextSelec === undefined ? false : _ref$enhanceTextSelec;
+
+    _classCallCheck(this, TextLayerBuilder);
+
+    this.textLayerDiv = textLayerDiv;
+    this.eventBus = eventBus || (0, _dom_events.getGlobalEventBus)();
+    this.textContent = null;
+    this.textContentItemsStr = [];
+    this.textContentStream = null;
+    this.renderingDone = false;
+    this.pageIdx = pageIndex;
+    this.pageNumber = this.pageIdx + 1;
+    this.matches = [];
+    this.viewport = viewport;
+    this.textDivs = [];
+    this.findController = findController;
+    this.textLayerRenderTask = null;
+    this.enhanceTextSelection = enhanceTextSelection;
+    this._boundEvents = Object.create(null);
+    this._bindEvents();
+    this._bindMouse();
+  }
+
+  _createClass(TextLayerBuilder, [{
+    key: '_finishRendering',
+    value: function _finishRendering() {
+      this.renderingDone = true;
+      if (!this.enhanceTextSelection) {
+        var endOfContent = document.createElement('div');
+        endOfContent.className = 'endOfContent';
+        this.textLayerDiv.appendChild(endOfContent);
+      }
+      this.eventBus.dispatch('textlayerrendered', {
+        source: this,
+        pageNumber: this.pageNumber,
+        numTextDivs: this.textDivs.length
+      });
+    }
+  }, {
+    key: 'render',
+    value: function render() {
+      var _this = this;
+
+      var timeout = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
+
+      if (!(this.textContent || this.textContentStream) || this.renderingDone) {
+        return;
+      }
+      this.cancel();
+      this.textDivs = [];
+      var textLayerFrag = document.createDocumentFragment();
+      this.textLayerRenderTask = (0, _pdfjsLib.renderTextLayer)({
+        textContent: this.textContent,
+        textContentStream: this.textContentStream,
+        container: textLayerFrag,
+        viewport: this.viewport,
+        textDivs: this.textDivs,
+        textContentItemsStr: this.textContentItemsStr,
+        timeout: timeout,
+        enhanceTextSelection: this.enhanceTextSelection
+      });
+      this.textLayerRenderTask.promise.then(function () {
+        _this.textLayerDiv.appendChild(textLayerFrag);
+        _this._finishRendering();
+        _this.updateMatches();
+      }, function (reason) {});
+    }
+  }, {
+    key: 'cancel',
+    value: function cancel() {
+      if (this.textLayerRenderTask) {
+        this.textLayerRenderTask.cancel();
+        this.textLayerRenderTask = null;
+      }
+    }
+  }, {
+    key: 'setTextContentStream',
+    value: function setTextContentStream(readableStream) {
+      this.cancel();
+      this.textContentStream = readableStream;
+    }
+  }, {
+    key: 'setTextContent',
+    value: function setTextContent(textContent) {
+      this.cancel();
+      this.textContent = textContent;
+    }
+  }, {
+    key: 'convertMatches',
+    value: function convertMatches(matches, matchesLength) {
+      var i = 0;
+      var iIndex = 0;
+      var textContentItemsStr = this.textContentItemsStr;
+      var end = textContentItemsStr.length - 1;
+      var queryLen = this.findController === null ? 0 : this.findController.state.query.length;
+      var ret = [];
+      if (!matches) {
+        return ret;
+      }
+      for (var m = 0, len = matches.length; m < len; m++) {
+        var matchIdx = matches[m];
+        while (i !== end && matchIdx >= iIndex + textContentItemsStr[i].length) {
+          iIndex += textContentItemsStr[i].length;
+          i++;
+        }
+        if (i === textContentItemsStr.length) {
+          console.error('Could not find a matching mapping');
+        }
+        var match = {
+          begin: {
+            divIdx: i,
+            offset: matchIdx - iIndex
+          }
+        };
+        if (matchesLength) {
+          matchIdx += matchesLength[m];
+        } else {
+          matchIdx += queryLen;
+        }
+        while (i !== end && matchIdx > iIndex + textContentItemsStr[i].length) {
+          iIndex += textContentItemsStr[i].length;
+          i++;
+        }
+        match.end = {
+          divIdx: i,
+          offset: matchIdx - iIndex
+        };
+        ret.push(match);
+      }
+      return ret;
+    }
+  }, {
+    key: 'renderMatches',
+    value: function renderMatches(matches) {
+      if (matches.length === 0) {
+        return;
+      }
+      var textContentItemsStr = this.textContentItemsStr;
+      var textDivs = this.textDivs;
+      var prevEnd = null;
+      var pageIdx = this.pageIdx;
+      var isSelectedPage = this.findController === null ? false : pageIdx === this.findController.selected.pageIdx;
+      var selectedMatchIdx = this.findController === null ? -1 : this.findController.selected.matchIdx;
+      var highlightAll = this.findController === null ? false : this.findController.state.highlightAll;
+      var infinity = {
+        divIdx: -1,
+        offset: undefined
+      };
+      function beginText(begin, className) {
+        var divIdx = begin.divIdx;
+        textDivs[divIdx].textContent = '';
+        appendTextToDiv(divIdx, 0, begin.offset, className);
+      }
+      function appendTextToDiv(divIdx, fromOffset, toOffset, className) {
+        var div = textDivs[divIdx];
+        var content = textContentItemsStr[divIdx].substring(fromOffset, toOffset);
+        var node = document.createTextNode(content);
+        if (className) {
+          var span = document.createElement('span');
+          span.className = className;
+          span.appendChild(node);
+          div.appendChild(span);
+          return;
+        }
+        div.appendChild(node);
+      }
+      var i0 = selectedMatchIdx,
+          i1 = i0 + 1;
+      if (highlightAll) {
+        i0 = 0;
+        i1 = matches.length;
+      } else if (!isSelectedPage) {
+        return;
+      }
+      for (var i = i0; i < i1; i++) {
+        var match = matches[i];
+        var begin = match.begin;
+        var end = match.end;
+        var isSelected = isSelectedPage && i === selectedMatchIdx;
+        var highlightSuffix = isSelected ? ' selected' : '';
+        if (this.findController) {
+          if (this.findController.selected.matchIdx === i && this.findController.selected.pageIdx === pageIdx) {
+            var spot = {
+              top: MATCH_SCROLL_OFFSET_TOP,
+              left: MATCH_SCROLL_OFFSET_LEFT
+            };
+            (0, _ui_utils.scrollIntoView)(textDivs[begin.divIdx], spot, true);
+          }
+        }
+        if (!prevEnd || begin.divIdx !== prevEnd.divIdx) {
+          if (prevEnd !== null) {
+            appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset);
+          }
+          beginText(begin);
+        } else {
+          appendTextToDiv(prevEnd.divIdx, prevEnd.offset, begin.offset);
+        }
+        if (begin.divIdx === end.divIdx) {
+          appendTextToDiv(begin.divIdx, begin.offset, end.offset, 'highlight' + highlightSuffix);
+        } else {
+          appendTextToDiv(begin.divIdx, begin.offset, infinity.offset, 'highlight begin' + highlightSuffix);
+          for (var n0 = begin.divIdx + 1, n1 = end.divIdx; n0 < n1; n0++) {
+            textDivs[n0].className = 'highlight middle' + highlightSuffix;
+          }
+          beginText(end, 'highlight end' + highlightSuffix);
+        }
+        prevEnd = end;
+      }
+      if (prevEnd) {
+        appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset);
+      }
+    }
+  }, {
+    key: 'updateMatches',
+    value: function updateMatches() {
+      if (!this.renderingDone) {
+        return;
+      }
+      var matches = this.matches;
+      var textDivs = this.textDivs;
+      var textContentItemsStr = this.textContentItemsStr;
+      var clearedUntilDivIdx = -1;
+      for (var i = 0, len = matches.length; i < len; i++) {
+        var match = matches[i];
+        var begin = Math.max(clearedUntilDivIdx, match.begin.divIdx);
+        for (var n = begin, end = match.end.divIdx; n <= end; n++) {
+          var div = textDivs[n];
+          div.textContent = textContentItemsStr[n];
+          div.className = '';
+        }
+        clearedUntilDivIdx = match.end.divIdx + 1;
+      }
+      if (!this.findController || !this.findController.highlightMatches) {
+        return;
+      }
+      var pageMatches = void 0,
+          pageMatchesLength = void 0;
+      if (this.findController !== null) {
+        pageMatches = this.findController.pageMatches[this.pageIdx] || null;
+        pageMatchesLength = this.findController.pageMatchesLength ? this.findController.pageMatchesLength[this.pageIdx] || null : null;
+      }
+      this.matches = this.convertMatches(pageMatches, pageMatchesLength);
+      this.renderMatches(this.matches);
+    }
+  }, {
+    key: '_bindEvents',
+    value: function _bindEvents() {
+      var _this2 = this;
+
+      var eventBus = this.eventBus,
+          _boundEvents = this._boundEvents;
+
+      _boundEvents.pageCancelled = function (evt) {
+        if (evt.pageNumber !== _this2.pageNumber) {
+          return;
+        }
+        if (_this2.textLayerRenderTask) {
+          console.error('TextLayerBuilder._bindEvents: `this.cancel()` should ' + 'have been called when the page was reset, or rendering cancelled.');
+          return;
+        }
+        for (var name in _boundEvents) {
+          eventBus.off(name.toLowerCase(), _boundEvents[name]);
+          delete _boundEvents[name];
+        }
+      };
+      _boundEvents.updateTextLayerMatches = function (evt) {
+        if (evt.pageIndex !== _this2.pageIdx && evt.pageIndex !== -1) {
+          return;
+        }
+        _this2.updateMatches();
+      };
+      eventBus.on('pagecancelled', _boundEvents.pageCancelled);
+      eventBus.on('updatetextlayermatches', _boundEvents.updateTextLayerMatches);
+    }
+  }, {
+    key: '_bindMouse',
+    value: function _bindMouse() {
+      var _this3 = this;
+
+      var div = this.textLayerDiv;
+      var expandDivsTimer = null;
+      div.addEventListener('mousedown', function (evt) {
+        if (_this3.enhanceTextSelection && _this3.textLayerRenderTask) {
+          _this3.textLayerRenderTask.expandTextDivs(true);
+          if (expandDivsTimer) {
+            clearTimeout(expandDivsTimer);
+            expandDivsTimer = null;
+          }
+          return;
+        }
+        var end = div.querySelector('.endOfContent');
+        if (!end) {
+          return;
+        }
+        var adjustTop = evt.target !== div;
+        adjustTop = adjustTop && window.getComputedStyle(end).getPropertyValue('-moz-user-select') !== 'none';
+        if (adjustTop) {
+          var divBounds = div.getBoundingClientRect();
+          var r = Math.max(0, (evt.pageY - divBounds.top) / divBounds.height);
+          end.style.top = (r * 100).toFixed(2) + '%';
+        }
+        end.classList.add('active');
+      });
+      div.addEventListener('mouseup', function () {
+        if (_this3.enhanceTextSelection && _this3.textLayerRenderTask) {
+          expandDivsTimer = setTimeout(function () {
+            if (_this3.textLayerRenderTask) {
+              _this3.textLayerRenderTask.expandTextDivs(false);
+            }
+            expandDivsTimer = null;
+          }, EXPAND_DIVS_TIMEOUT);
+          return;
+        }
+        var end = div.querySelector('.endOfContent');
+        if (!end) {
+          return;
+        }
+        end.style.top = '';
+        end.classList.remove('active');
+      });
+    }
+  }]);
+
+  return TextLayerBuilder;
+}();
+
+var DefaultTextLayerFactory = function () {
+  function DefaultTextLayerFactory() {
+    _classCallCheck(this, DefaultTextLayerFactory);
+  }
+
+  _createClass(DefaultTextLayerFactory, [{
+    key: 'createTextLayerBuilder',
+    value: function createTextLayerBuilder(textLayerDiv, pageIndex, viewport) {
+      var enhanceTextSelection = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
+
+      return new TextLayerBuilder({
+        textLayerDiv: textLayerDiv,
+        pageIndex: pageIndex,
+        viewport: viewport,
+        enhanceTextSelection: enhanceTextSelection
+      });
+    }
+  }]);
+
+  return DefaultTextLayerFactory;
+}();
+
+exports.TextLayerBuilder = TextLayerBuilder;
+exports.DefaultTextLayerFactory = DefaultTextLayerFactory;
+
+/***/ }),
+/* 34 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.SecondaryToolbar = undefined;
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _base_viewer = __webpack_require__(30);
+
+var _pdf_cursor_tools = __webpack_require__(8);
+
+var _pdf_single_page_viewer = __webpack_require__(35);
+
+var _ui_utils = __webpack_require__(6);
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var SecondaryToolbar = function () {
+  function SecondaryToolbar(options, mainContainer, eventBus) {
+    var _this = this;
+
+    _classCallCheck(this, SecondaryToolbar);
+
+    this.toolbar = options.toolbar;
+    this.toggleButton = options.toggleButton;
+    this.toolbarButtonContainer = options.toolbarButtonContainer;
+    this.buttons = [{
+      element: options.presentationModeButton,
+      eventName: 'presentationmode',
+      close: true
+    }, {
+      element: options.openFileButton,
+      eventName: 'openfile',
+      close: true
+    }, {
+      element: options.printButton,
+      eventName: 'print',
+      close: true
+    }, {
+      element: options.downloadButton,
+      eventName: 'download',
+      close: true
+    }, {
+      element: options.viewBookmarkButton,
+      eventName: null,
+      close: true
+    }, {
+      element: options.firstPageButton,
+      eventName: 'firstpage',
+      close: true
+    }, {
+      element: options.lastPageButton,
+      eventName: 'lastpage',
+      close: true
+    }, {
+      element: options.pageRotateCwButton,
+      eventName: 'rotatecw',
+      close: false
+    }, {
+      element: options.pageRotateCcwButton,
+      eventName: 'rotateccw',
+      close: false
+    }, {
+      element: options.cursorSelectToolButton,
+      eventName: 'switchcursortool',
+      eventDetails: { tool: _pdf_cursor_tools.CursorTool.SELECT },
+      close: true
+    }, {
+      element: options.cursorHandToolButton,
+      eventName: 'switchcursortool',
+      eventDetails: { tool: _pdf_cursor_tools.CursorTool.HAND },
+      close: true
+    }, {
+      element: options.scrollVerticalButton,
+      eventName: 'switchscrollmode',
+      eventDetails: { mode: _base_viewer.ScrollMode.VERTICAL },
+      close: true
+    }, {
+      element: options.scrollHorizontalButton,
+      eventName: 'switchscrollmode',
+      eventDetails: { mode: _base_viewer.ScrollMode.HORIZONTAL },
+      close: true
+    }, {
+      element: options.scrollWrappedButton,
+      eventName: 'switchscrollmode',
+      eventDetails: { mode: _base_viewer.ScrollMode.WRAPPED },
+      close: true
+    }, {
+      element: options.spreadNoneButton,
+      eventName: 'switchspreadmode',
+      eventDetails: { mode: _base_viewer.SpreadMode.NONE },
+      close: true
+    }, {
+      element: options.spreadOddButton,
+      eventName: 'switchspreadmode',
+      eventDetails: { mode: _base_viewer.SpreadMode.ODD },
+      close: true
+    }, {
+      element: options.spreadEvenButton,
+      eventName: 'switchspreadmode',
+      eventDetails: { mode: _base_viewer.SpreadMode.EVEN },
+      close: true
+    }, {
+      element: options.documentPropertiesButton,
+      eventName: 'documentproperties',
+      close: true
+    }];
+    this.items = {
+      firstPage: options.firstPageButton,
+      lastPage: options.lastPageButton,
+      pageRotateCw: options.pageRotateCwButton,
+      pageRotateCcw: options.pageRotateCcwButton
+    };
+    this.mainContainer = mainContainer;
+    this.eventBus = eventBus;
+    this.opened = false;
+    this.containerHeight = null;
+    this.previousContainerHeight = null;
+    this.reset();
+    this._bindClickListeners();
+    this._bindCursorToolsListener(options);
+    this._bindScrollModeListener(options);
+    this._bindSpreadModeListener(options);
+    this.eventBus.on('resize', this._setMaxHeight.bind(this));
+    this.eventBus.on('baseviewerinit', function (evt) {
+      if (evt.source instanceof _pdf_single_page_viewer.PDFSinglePageViewer) {
+        _this.toolbarButtonContainer.classList.add('hiddenScrollModeButtons', 'hiddenSpreadModeButtons');
+      } else {
+        _this.toolbarButtonContainer.classList.remove('hiddenScrollModeButtons', 'hiddenSpreadModeButtons');
+      }
+    });
+  }
+
+  _createClass(SecondaryToolbar, [{
+    key: 'setPageNumber',
+    value: function setPageNumber(pageNumber) {
+      this.pageNumber = pageNumber;
+      this._updateUIState();
+    }
+  }, {
+    key: 'setPagesCount',
+    value: function setPagesCount(pagesCount) {
+      this.pagesCount = pagesCount;
+      this._updateUIState();
+    }
+  }, {
+    key: 'reset',
+    value: function reset() {
+      this.pageNumber = 0;
+      this.pagesCount = 0;
+      this._updateUIState();
+      this.eventBus.dispatch('secondarytoolbarreset', { source: this });
+    }
+  }, {
+    key: '_updateUIState',
+    value: function _updateUIState() {
+      this.items.firstPage.disabled = this.pageNumber <= 1;
+      this.items.lastPage.disabled = this.pageNumber >= this.pagesCount;
+      this.items.pageRotateCw.disabled = this.pagesCount === 0;
+      this.items.pageRotateCcw.disabled = this.pagesCount === 0;
+    }
+  }, {
+    key: '_bindClickListeners',
+    value: function _bindClickListeners() {
+      var _this2 = this;
+
+      this.toggleButton.addEventListener('click', this.toggle.bind(this));
+
+      var _loop = function _loop(button) {
+        var _buttons$button = _this2.buttons[button],
+            element = _buttons$button.element,
+            eventName = _buttons$button.eventName,
+            close = _buttons$button.close,
+            eventDetails = _buttons$button.eventDetails;
+
+        element.addEventListener('click', function (evt) {
+          if (eventName !== null) {
+            var details = { source: _this2 };
+            for (var property in eventDetails) {
+              details[property] = eventDetails[property];
+            }
+            _this2.eventBus.dispatch(eventName, details);
+          }
+          if (close) {
+            _this2.close();
+          }
+        });
+      };
+
+      for (var button in this.buttons) {
+        _loop(button);
+      }
+    }
+  }, {
+    key: '_bindCursorToolsListener',
+    value: function _bindCursorToolsListener(buttons) {
+      this.eventBus.on('cursortoolchanged', function (evt) {
+        buttons.cursorSelectToolButton.classList.remove('toggled');
+        buttons.cursorHandToolButton.classList.remove('toggled');
+        switch (evt.tool) {
+          case _pdf_cursor_tools.CursorTool.SELECT:
+            buttons.cursorSelectToolButton.classList.add('toggled');
+            break;
+          case _pdf_cursor_tools.CursorTool.HAND:
+            buttons.cursorHandToolButton.classList.add('toggled');
+            break;
+        }
+      });
+    }
+  }, {
+    key: '_bindScrollModeListener',
+    value: function _bindScrollModeListener(buttons) {
+      var _this3 = this;
+
+      function scrollModeChanged(evt) {
+        buttons.scrollVerticalButton.classList.remove('toggled');
+        buttons.scrollHorizontalButton.classList.remove('toggled');
+        buttons.scrollWrappedButton.classList.remove('toggled');
+        switch (evt.mode) {
+          case _base_viewer.ScrollMode.VERTICAL:
+            buttons.scrollVerticalButton.classList.add('toggled');
+            break;
+          case _base_viewer.ScrollMode.HORIZONTAL:
+            buttons.scrollHorizontalButton.classList.add('toggled');
+            break;
+          case _base_viewer.ScrollMode.WRAPPED:
+            buttons.scrollWrappedButton.classList.add('toggled');
+            break;
+        }
+        var isScrollModeHorizontal = evt.mode === _base_viewer.ScrollMode.HORIZONTAL;
+        buttons.spreadNoneButton.disabled = isScrollModeHorizontal;
+        buttons.spreadOddButton.disabled = isScrollModeHorizontal;
+        buttons.spreadEvenButton.disabled = isScrollModeHorizontal;
+      }
+      this.eventBus.on('scrollmodechanged', scrollModeChanged);
+      this.eventBus.on('secondarytoolbarreset', function (evt) {
+        if (evt.source === _this3) {
+          scrollModeChanged({ mode: _base_viewer.ScrollMode.VERTICAL });
+        }
+      });
+    }
+  }, {
+    key: '_bindSpreadModeListener',
+    value: function _bindSpreadModeListener(buttons) {
+      var _this4 = this;
+
+      function spreadModeChanged(evt) {
+        buttons.spreadNoneButton.classList.remove('toggled');
+        buttons.spreadOddButton.classList.remove('toggled');
+        buttons.spreadEvenButton.classList.remove('toggled');
+        switch (evt.mode) {
+          case _base_viewer.SpreadMode.NONE:
+            buttons.spreadNoneButton.classList.add('toggled');
+            break;
+          case _base_viewer.SpreadMode.ODD:
+            buttons.spreadOddButton.classList.add('toggled');
+            break;
+          case _base_viewer.SpreadMode.EVEN:
+            buttons.spreadEvenButton.classList.add('toggled');
+            break;
+        }
+      }
+      this.eventBus.on('spreadmodechanged', spreadModeChanged);
+      this.eventBus.on('secondarytoolbarreset', function (evt) {
+        if (evt.source === _this4) {
+          spreadModeChanged({ mode: _base_viewer.SpreadMode.NONE });
+        }
+      });
+    }
+  }, {
+    key: 'open',
+    value: function open() {
+      if (this.opened) {
+        return;
+      }
+      this.opened = true;
+      this._setMaxHeight();
+      this.toggleButton.classList.add('toggled');
+      this.toolbar.classList.remove('hidden');
+    }
+  }, {
+    key: 'close',
+    value: function close() {
+      if (!this.opened) {
+        return;
+      }
+      this.opened = false;
+      this.toolbar.classList.add('hidden');
+      this.toggleButton.classList.remove('toggled');
+    }
+  }, {
+    key: 'toggle',
+    value: function toggle() {
+      if (this.opened) {
+        this.close();
+      } else {
+        this.open();
+      }
+    }
+  }, {
+    key: '_setMaxHeight',
+    value: function _setMaxHeight() {
+      if (!this.opened) {
+        return;
+      }
+      this.containerHeight = this.mainContainer.clientHeight;
+      if (this.containerHeight === this.previousContainerHeight) {
+        return;
+      }
+      this.toolbarButtonContainer.setAttribute('style', 'max-height: ' + (this.containerHeight - _ui_utils.SCROLLBAR_PADDING) + 'px;');
+      this.previousContainerHeight = this.containerHeight;
+    }
+  }, {
+    key: 'isOpen',
+    get: function get() {
+      return this.opened;
+    }
+  }]);
+
+  return SecondaryToolbar;
+}();
+
+exports.SecondaryToolbar = SecondaryToolbar;
+
+/***/ }),
+/* 35 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.PDFSinglePageViewer = undefined;
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
+
+var _base_viewer = __webpack_require__(30);
+
+var _ui_utils = __webpack_require__(6);
+
+var _pdfjsLib = __webpack_require__(7);
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var PDFSinglePageViewer = function (_BaseViewer) {
+  _inherits(PDFSinglePageViewer, _BaseViewer);
+
+  function PDFSinglePageViewer(options) {
+    _classCallCheck(this, PDFSinglePageViewer);
+
+    var _this = _possibleConstructorReturn(this, (PDFSinglePageViewer.__proto__ || Object.getPrototypeOf(PDFSinglePageViewer)).call(this, options));
+
+    _this.eventBus.on('pagesinit', function (evt) {
+      _this._ensurePageViewVisible();
+    });
+    return _this;
+  }
+
+  _createClass(PDFSinglePageViewer, [{
+    key: '_resetView',
+    value: function _resetView() {
+      _get(PDFSinglePageViewer.prototype.__proto__ || Object.getPrototypeOf(PDFSinglePageViewer.prototype), '_resetView', this).call(this);
+      this._previousPageNumber = 1;
+      this._shadowViewer = document.createDocumentFragment();
+    }
+  }, {
+    key: '_ensurePageViewVisible',
+    value: function _ensurePageViewVisible() {
+      var pageView = this._pages[this._currentPageNumber - 1];
+      var previousPageView = this._pages[this._previousPageNumber - 1];
+      var viewerNodes = this.viewer.childNodes;
+      switch (viewerNodes.length) {
+        case 0:
+          this.viewer.appendChild(pageView.div);
+          break;
+        case 1:
+          if (viewerNodes[0] !== previousPageView.div) {
+            throw new Error('_ensurePageViewVisible: Unexpected previously visible page.');
+          }
+          if (pageView === previousPageView) {
+            break;
+          }
+          this._shadowViewer.appendChild(previousPageView.div);
+          this.viewer.appendChild(pageView.div);
+          this.container.scrollTop = 0;
+          break;
+        default:
+          throw new Error('_ensurePageViewVisible: Only one page should be visible at a time.');
+      }
+      this._previousPageNumber = this._currentPageNumber;
+    }
+  }, {
+    key: '_scrollUpdate',
+    value: function _scrollUpdate() {
+      if (this._updateScrollDown) {
+        this._updateScrollDown();
+      }
+      _get(PDFSinglePageViewer.prototype.__proto__ || Object.getPrototypeOf(PDFSinglePageViewer.prototype), '_scrollUpdate', this).call(this);
+    }
+  }, {
+    key: '_scrollIntoView',
+    value: function _scrollIntoView(_ref) {
+      var _this2 = this;
+
+      var pageDiv = _ref.pageDiv,
+          _ref$pageSpot = _ref.pageSpot,
+          pageSpot = _ref$pageSpot === undefined ? null : _ref$pageSpot,
+          _ref$pageNumber = _ref.pageNumber,
+          pageNumber = _ref$pageNumber === undefined ? null : _ref$pageNumber;
+
+      if (pageNumber) {
+        this._setCurrentPageNumber(pageNumber);
+      }
+      var scrolledDown = this._currentPageNumber >= this._previousPageNumber;
+      var previousLocation = this._location;
+      this._ensurePageViewVisible();
+      (0, _ui_utils.scrollIntoView)(pageDiv, pageSpot);
+      this._updateScrollDown = function () {
+        _this2.scroll.down = scrolledDown;
+        delete _this2._updateScrollDown;
+      };
+      setTimeout(function () {
+        if (_this2._location === previousLocation) {
+          if (_this2._updateScrollDown) {
+            _this2._updateScrollDown();
+          }
+          _this2.update();
+        }
+      }, 0);
+    }
+  }, {
+    key: '_getVisiblePages',
+    value: function _getVisiblePages() {
+      if (!this.pagesCount) {
+        return { views: [] };
+      }
+      var pageView = this._pages[this._currentPageNumber - 1];
+      var element = pageView.div;
+      var view = {
+        id: pageView.id,
+        x: element.offsetLeft + element.clientLeft,
+        y: element.offsetTop + element.clientTop,
+        view: pageView
+      };
+      return {
+        first: view,
+        last: view,
+        views: [view]
+      };
+    }
+  }, {
+    key: 'update',
+    value: function update() {
+      var visible = this._getVisiblePages();
+      var visiblePages = visible.views,
+          numVisiblePages = visiblePages.length;
+      if (numVisiblePages === 0) {
+        return;
+      }
+      this._resizeBuffer(numVisiblePages);
+      this.renderingQueue.renderHighestPriority(visible);
+      this._updateLocation(visible.first);
+      this.eventBus.dispatch('updateviewarea', {
+        source: this,
+        location: this._location
+      });
+    }
+  }, {
+    key: '_updateScrollMode',
+    value: function _updateScrollMode() {}
+  }, {
+    key: '_updateSpreadMode',
+    value: function _updateSpreadMode() {}
+  }, {
+    key: '_setDocumentViewerElement',
+    get: function get() {
+      return (0, _pdfjsLib.shadow)(this, '_setDocumentViewerElement', this._shadowViewer);
+    }
+  }, {
+    key: '_isScrollModeHorizontal',
+    get: function get() {
+      return (0, _pdfjsLib.shadow)(this, '_isScrollModeHorizontal', false);
+    }
+  }]);
+
+  return PDFSinglePageViewer;
+}(_base_viewer.BaseViewer);
+
+exports.PDFSinglePageViewer = PDFSinglePageViewer;
+
+/***/ }),
+/* 36 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.Toolbar = undefined;
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _ui_utils = __webpack_require__(6);
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var PAGE_NUMBER_LOADING_INDICATOR = 'visiblePageIsLoading';
+var SCALE_SELECT_CONTAINER_PADDING = 8;
+var SCALE_SELECT_PADDING = 22;
+
+var Toolbar = function () {
+  function Toolbar(options, eventBus) {
+    var l10n = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _ui_utils.NullL10n;
+
+    _classCallCheck(this, Toolbar);
+
+    this.toolbar = options.container;
+    this.eventBus = eventBus;
+    this.l10n = l10n;
+    this.items = options;
+    this._wasLocalized = false;
+    this.reset();
+    this._bindListeners();
+  }
+
+  _createClass(Toolbar, [{
+    key: 'setPageNumber',
+    value: function setPageNumber(pageNumber, pageLabel) {
+      this.pageNumber = pageNumber;
+      this.pageLabel = pageLabel;
+      this._updateUIState(false);
+    }
+  }, {
+    key: 'setPagesCount',
+    value: function setPagesCount(pagesCount, hasPageLabels) {
+      this.pagesCount = pagesCount;
+      this.hasPageLabels = hasPageLabels;
+      this._updateUIState(true);
+    }
+  }, {
+    key: 'setPageScale',
+    value: function setPageScale(pageScaleValue, pageScale) {
+      this.pageScaleValue = (pageScaleValue || pageScale).toString();
+      this.pageScale = pageScale;
+      this._updateUIState(false);
+    }
+  }, {
+    key: 'reset',
+    value: function reset() {
+      this.pageNumber = 0;
+      this.pageLabel = null;
+      this.hasPageLabels = false;
+      this.pagesCount = 0;
+      this.pageScaleValue = _ui_utils.DEFAULT_SCALE_VALUE;
+      this.pageScale = _ui_utils.DEFAULT_SCALE;
+      this._updateUIState(true);
+    }
+  }, {
+    key: '_bindListeners',
+    value: function _bindListeners() {
+      var _this = this;
+
+      var eventBus = this.eventBus,
+          items = this.items;
+
+      var self = this;
+      items.previous.addEventListener('click', function () {
+        eventBus.dispatch('previouspage', { source: self });
+      });
+      items.next.addEventListener('click', function () {
+        eventBus.dispatch('nextpage', { source: self });
+      });
+      items.zoomIn.addEventListener('click', function () {
+        eventBus.dispatch('zoomin', { source: self });
+      });
+      items.zoomOut.addEventListener('click', function () {
+        eventBus.dispatch('zoomout', { source: self });
+      });
+      items.pageNumber.addEventListener('click', function () {
+        this.select();
+      });
+      items.pageNumber.addEventListener('change', function () {
+        eventBus.dispatch('pagenumberchanged', {
+          source: self,
+          value: this.value
+        });
+      });
+      items.scaleSelect.addEventListener('change', function () {
+        if (this.value === 'custom') {
+          return;
+        }
+        eventBus.dispatch('scalechanged', {
+          source: self,
+          value: this.value
+        });
+      });
+      items.presentationModeButton.addEventListener('click', function () {
+        eventBus.dispatch('presentationmode', { source: self });
+      });
+      items.openFile.addEventListener('click', function () {
+        eventBus.dispatch('openfile', { source: self });
+      });
+      items.print.addEventListener('click', function () {
+        eventBus.dispatch('print', { source: self });
+      });
+      items.download.addEventListener('click', function () {
+        eventBus.dispatch('download', { source: self });
+      });
+      items.scaleSelect.oncontextmenu = _ui_utils.noContextMenuHandler;
+      eventBus.on('localized', function () {
+        _this._localized();
+      });
+    }
+  }, {
+    key: '_localized',
+    value: function _localized() {
+      this._wasLocalized = true;
+      this._adjustScaleWidth();
+      this._updateUIState(true);
+    }
+  }, {
+    key: '_updateUIState',
+    value: function _updateUIState() {
+      var resetNumPages = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+
+      if (!this._wasLocalized) {
+        return;
+      }
+      var pageNumber = this.pageNumber,
+          pagesCount = this.pagesCount,
+          pageScaleValue = this.pageScaleValue,
+          pageScale = this.pageScale,
+          items = this.items;
+
+      if (resetNumPages) {
+        if (this.hasPageLabels) {
+          items.pageNumber.type = 'text';
+        } else {
+          items.pageNumber.type = 'number';
+          this.l10n.get('of_pages', { pagesCount: pagesCount }, 'of {{pagesCount}}').then(function (msg) {
+            items.numPages.textContent = msg;
+          });
+        }
+        items.pageNumber.max = pagesCount;
+      }
+      if (this.hasPageLabels) {
+        items.pageNumber.value = this.pageLabel;
+        this.l10n.get('page_of_pages', {
+          pageNumber: pageNumber,
+          pagesCount: pagesCount
+        }, '({{pageNumber}} of {{pagesCount}})').then(function (msg) {
+          items.numPages.textContent = msg;
+        });
+      } else {
+        items.pageNumber.value = pageNumber;
+      }
+      items.previous.disabled = pageNumber <= 1;
+      items.next.disabled = pageNumber >= pagesCount;
+      items.zoomOut.disabled = pageScale <= _ui_utils.MIN_SCALE;
+      items.zoomIn.disabled = pageScale >= _ui_utils.MAX_SCALE;
+      var customScale = Math.round(pageScale * 10000) / 100;
+      this.l10n.get('page_scale_percent', { scale: customScale }, '{{scale}}%').then(function (msg) {
+        var options = items.scaleSelect.options;
+        var predefinedValueFound = false;
+        for (var i = 0, ii = options.length; i < ii; i++) {
+          var option = options[i];
+          if (option.value !== pageScaleValue) {
+            option.selected = false;
+            continue;
+          }
+          option.selected = true;
+          predefinedValueFound = true;
+        }
+        if (!predefinedValueFound) {
+          items.customScaleOption.textContent = msg;
+          items.customScaleOption.selected = true;
+        }
+      });
+    }
+  }, {
+    key: 'updateLoadingIndicatorState',
+    value: function updateLoadingIndicatorState() {
+      var loading = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+
+      var pageNumberInput = this.items.pageNumber;
+      pageNumberInput.classList.toggle(PAGE_NUMBER_LOADING_INDICATOR, loading);
+    }
+  }, {
+    key: '_adjustScaleWidth',
+    value: function _adjustScaleWidth() {
+      var container = this.items.scaleSelectContainer;
+      var select = this.items.scaleSelect;
+      _ui_utils.animationStarted.then(function () {
+        if (container.clientWidth === 0) {
+          container.setAttribute('style', 'display: inherit;');
+        }
+        if (container.clientWidth > 0) {
+          select.setAttribute('style', 'min-width: inherit;');
+          var width = select.clientWidth + SCALE_SELECT_CONTAINER_PADDING;
+          select.setAttribute('style', 'min-width: ' + (width + SCALE_SELECT_PADDING) + 'px;');
+          container.setAttribute('style', 'min-width: ' + width + 'px; ' + 'max-width: ' + width + 'px;');
+        }
+      });
+    }
+  }]);
+
+  return Toolbar;
+}();
+
+exports.Toolbar = Toolbar;
+
+/***/ }),
+/* 37 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.ViewHistory = undefined;
+
+var _regenerator = __webpack_require__(2);
+
+var _regenerator2 = _interopRequireDefault(_regenerator);
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var DEFAULT_VIEW_HISTORY_CACHE_SIZE = 20;
+
+var ViewHistory = function () {
+  function ViewHistory(fingerprint) {
+    var _this = this;
+
+    var cacheSize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_VIEW_HISTORY_CACHE_SIZE;
+
+    _classCallCheck(this, ViewHistory);
+
+    this.fingerprint = fingerprint;
+    this.cacheSize = cacheSize;
+    this._initializedPromise = this._readFromStorage().then(function (databaseStr) {
+      var database = JSON.parse(databaseStr || '{}');
+      if (!('files' in database)) {
+        database.files = [];
+      } else {
+        while (database.files.length >= _this.cacheSize) {
+          database.files.shift();
+        }
+      }
+      var index = -1;
+      for (var i = 0, length = database.files.length; i < length; i++) {
+        var branch = database.files[i];
+        if (branch.fingerprint === _this.fingerprint) {
+          index = i;
+          break;
+        }
+      }
+      if (index === -1) {
+        index = database.files.push({ fingerprint: _this.fingerprint }) - 1;
+      }
+      _this.file = database.files[index];
+      _this.database = database;
+    });
+  }
+
+  _createClass(ViewHistory, [{
+    key: '_writeToStorage',
+    value: function () {
+      var _ref = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee() {
+        var databaseStr;
+        return _regenerator2.default.wrap(function _callee$(_context) {
+          while (1) {
+            switch (_context.prev = _context.next) {
+              case 0:
+                databaseStr = JSON.stringify(this.database);
+
+                localStorage.setItem('pdfjs.history', databaseStr);
+
+              case 2:
+              case 'end':
+                return _context.stop();
+            }
+          }
+        }, _callee, this);
+      }));
+
+      function _writeToStorage() {
+        return _ref.apply(this, arguments);
+      }
+
+      return _writeToStorage;
+    }()
+  }, {
+    key: '_readFromStorage',
+    value: function () {
+      var _ref2 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee2() {
+        return _regenerator2.default.wrap(function _callee2$(_context2) {
+          while (1) {
+            switch (_context2.prev = _context2.next) {
+              case 0:
+                return _context2.abrupt('return', localStorage.getItem('pdfjs.history'));
+
+              case 1:
+              case 'end':
+                return _context2.stop();
+            }
+          }
+        }, _callee2, this);
+      }));
+
+      function _readFromStorage() {
+        return _ref2.apply(this, arguments);
+      }
+
+      return _readFromStorage;
+    }()
+  }, {
+    key: 'set',
+    value: function () {
+      var _ref3 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee3(name, val) {
+        return _regenerator2.default.wrap(function _callee3$(_context3) {
+          while (1) {
+            switch (_context3.prev = _context3.next) {
+              case 0:
+                _context3.next = 2;
+                return this._initializedPromise;
+
+              case 2:
+                this.file[name] = val;
+                return _context3.abrupt('return', this._writeToStorage());
+
+              case 4:
+              case 'end':
+                return _context3.stop();
+            }
+          }
+        }, _callee3, this);
+      }));
+
+      function set(_x2, _x3) {
+        return _ref3.apply(this, arguments);
+      }
+
+      return set;
+    }()
+  }, {
+    key: 'setMultiple',
+    value: function () {
+      var _ref4 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee4(properties) {
+        var name;
+        return _regenerator2.default.wrap(function _callee4$(_context4) {
+          while (1) {
+            switch (_context4.prev = _context4.next) {
+              case 0:
+                _context4.next = 2;
+                return this._initializedPromise;
+
+              case 2:
+                for (name in properties) {
+                  this.file[name] = properties[name];
+                }
+                return _context4.abrupt('return', this._writeToStorage());
+
+              case 4:
+              case 'end':
+                return _context4.stop();
+            }
+          }
+        }, _callee4, this);
+      }));
+
+      function setMultiple(_x4) {
+        return _ref4.apply(this, arguments);
+      }
+
+      return setMultiple;
+    }()
+  }, {
+    key: 'get',
+    value: function () {
+      var _ref5 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee5(name, defaultValue) {
+        var val;
+        return _regenerator2.default.wrap(function _callee5$(_context5) {
+          while (1) {
+            switch (_context5.prev = _context5.next) {
+              case 0:
+                _context5.next = 2;
+                return this._initializedPromise;
+
+              case 2:
+                val = this.file[name];
+                return _context5.abrupt('return', val !== undefined ? val : defaultValue);
+
+              case 4:
+              case 'end':
+                return _context5.stop();
+            }
+          }
+        }, _callee5, this);
+      }));
+
+      function get(_x5, _x6) {
+        return _ref5.apply(this, arguments);
+      }
+
+      return get;
+    }()
+  }, {
+    key: 'getMultiple',
+    value: function () {
+      var _ref6 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee6(properties) {
+        var values, name, val;
+        return _regenerator2.default.wrap(function _callee6$(_context6) {
+          while (1) {
+            switch (_context6.prev = _context6.next) {
+              case 0:
+                _context6.next = 2;
+                return this._initializedPromise;
+
+              case 2:
+                values = Object.create(null);
+
+                for (name in properties) {
+                  val = this.file[name];
+
+                  values[name] = val !== undefined ? val : properties[name];
+                }
+                return _context6.abrupt('return', values);
+
+              case 5:
+              case 'end':
+                return _context6.stop();
+            }
+          }
+        }, _callee6, this);
+      }));
+
+      function getMultiple(_x7) {
+        return _ref6.apply(this, arguments);
+      }
+
+      return getMultiple;
+    }()
+  }]);
+
+  return ViewHistory;
+}();
+
+exports.ViewHistory = ViewHistory;
+
+/***/ }),
+/* 38 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.GenericCom = undefined;
+
+var _regenerator = __webpack_require__(2);
+
+var _regenerator2 = _interopRequireDefault(_regenerator);
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _app = __webpack_require__(1);
+
+var _preferences = __webpack_require__(39);
+
+var _download_manager = __webpack_require__(40);
+
+var _genericl10n = __webpack_require__(41);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+;
+var GenericCom = {};
+
+var GenericPreferences = function (_BasePreferences) {
+  _inherits(GenericPreferences, _BasePreferences);
+
+  function GenericPreferences() {
+    _classCallCheck(this, GenericPreferences);
+
+    return _possibleConstructorReturn(this, (GenericPreferences.__proto__ || Object.getPrototypeOf(GenericPreferences)).apply(this, arguments));
+  }
+
+  _createClass(GenericPreferences, [{
+    key: '_writeToStorage',
+    value: function () {
+      var _ref = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee(prefObj) {
+        return _regenerator2.default.wrap(function _callee$(_context) {
+          while (1) {
+            switch (_context.prev = _context.next) {
+              case 0:
+                localStorage.setItem('pdfjs.preferences', JSON.stringify(prefObj));
+
+              case 1:
+              case 'end':
+                return _context.stop();
+            }
+          }
+        }, _callee, this);
+      }));
+
+      function _writeToStorage(_x) {
+        return _ref.apply(this, arguments);
+      }
+
+      return _writeToStorage;
+    }()
+  }, {
+    key: '_readFromStorage',
+    value: function () {
+      var _ref2 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee2(prefObj) {
+        return _regenerator2.default.wrap(function _callee2$(_context2) {
+          while (1) {
+            switch (_context2.prev = _context2.next) {
+              case 0:
+                return _context2.abrupt('return', JSON.parse(localStorage.getItem('pdfjs.preferences')));
+
+              case 1:
+              case 'end':
+                return _context2.stop();
+            }
+          }
+        }, _callee2, this);
+      }));
+
+      function _readFromStorage(_x2) {
+        return _ref2.apply(this, arguments);
+      }
+
+      return _readFromStorage;
+    }()
+  }]);
+
+  return GenericPreferences;
+}(_preferences.BasePreferences);
+
+var GenericExternalServices = Object.create(_app.DefaultExternalServices);
+GenericExternalServices.createDownloadManager = function (options) {
+  return new _download_manager.DownloadManager(options);
+};
+GenericExternalServices.createPreferences = function () {
+  return new GenericPreferences();
+};
+GenericExternalServices.createL10n = function (_ref3) {
+  var _ref3$locale = _ref3.locale,
+      locale = _ref3$locale === undefined ? 'en-US' : _ref3$locale;
+
+  return new _genericl10n.GenericL10n(locale);
+};
+_app.PDFViewerApplication.externalServices = GenericExternalServices;
+exports.GenericCom = GenericCom;
+
+/***/ }),
+/* 39 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.BasePreferences = undefined;
+
+var _regenerator = __webpack_require__(2);
+
+var _regenerator2 = _interopRequireDefault(_regenerator);
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var defaultPreferences = null;
+function getDefaultPreferences() {
+  if (!defaultPreferences) {
+    defaultPreferences = Promise.resolve({
+      "showPreviousViewOnLoad": true,
+      "defaultZoomValue": "",
+      "sidebarViewOnLoad": 0,
+      "cursorToolOnLoad": 0,
+      "enableWebGL": false,
+      "eventBusDispatchToDOM": false,
+      "pdfBugEnabled": false,
+      "disableRange": false,
+      "disableStream": false,
+      "disableAutoFetch": false,
+      "disableFontFace": false,
+      "textLayerMode": 1,
+      "useOnlyCssZoom": false,
+      "externalLinkTarget": 0,
+      "renderer": "canvas",
+      "renderInteractiveForms": false,
+      "enablePrintAutoRotate": false,
+      "disablePageMode": false,
+      "disablePageLabels": false,
+      "scrollModeOnLoad": 0,
+      "spreadModeOnLoad": 0
+    });
+  }
+  return defaultPreferences;
+}
+
+var BasePreferences = function () {
+  function BasePreferences() {
+    var _this = this;
+
+    _classCallCheck(this, BasePreferences);
+
+    if (this.constructor === BasePreferences) {
+      throw new Error('Cannot initialize BasePreferences.');
+    }
+    this.prefs = null;
+    this._initializedPromise = getDefaultPreferences().then(function (defaults) {
+      Object.defineProperty(_this, 'defaults', {
+        value: Object.freeze(defaults),
+        writable: false,
+        enumerable: true,
+        configurable: false
+      });
+      _this.prefs = Object.assign(Object.create(null), defaults);
+      return _this._readFromStorage(defaults);
+    }).then(function (prefs) {
+      if (!prefs) {
+        return;
+      }
+      for (var name in prefs) {
+        var defaultValue = _this.defaults[name],
+            prefValue = prefs[name];
+        if (defaultValue === undefined || (typeof prefValue === "undefined" ? "undefined" : _typeof(prefValue)) !== (typeof defaultValue === "undefined" ? "undefined" : _typeof(defaultValue))) {
+          continue;
+        }
+        _this.prefs[name] = prefValue;
+      }
+    });
+  }
+
+  _createClass(BasePreferences, [{
+    key: "_writeToStorage",
+    value: function () {
+      var _ref = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee(prefObj) {
+        return _regenerator2.default.wrap(function _callee$(_context) {
+          while (1) {
+            switch (_context.prev = _context.next) {
+              case 0:
+                throw new Error('Not implemented: _writeToStorage');
+
+              case 1:
+              case "end":
+                return _context.stop();
+            }
+          }
+        }, _callee, this);
+      }));
+
+      function _writeToStorage(_x) {
+        return _ref.apply(this, arguments);
+      }
+
+      return _writeToStorage;
+    }()
+  }, {
+    key: "_readFromStorage",
+    value: function () {
+      var _ref2 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee2(prefObj) {
+        return _regenerator2.default.wrap(function _callee2$(_context2) {
+          while (1) {
+            switch (_context2.prev = _context2.next) {
+              case 0:
+                throw new Error('Not implemented: _readFromStorage');
+
+              case 1:
+              case "end":
+                return _context2.stop();
+            }
+          }
+        }, _callee2, this);
+      }));
+
+      function _readFromStorage(_x2) {
+        return _ref2.apply(this, arguments);
+      }
+
+      return _readFromStorage;
+    }()
+  }, {
+    key: "reset",
+    value: function () {
+      var _ref3 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee3() {
+        return _regenerator2.default.wrap(function _callee3$(_context3) {
+          while (1) {
+            switch (_context3.prev = _context3.next) {
+              case 0:
+                _context3.next = 2;
+                return this._initializedPromise;
+
+              case 2:
+                this.prefs = Object.assign(Object.create(null), this.defaults);
+                return _context3.abrupt("return", this._writeToStorage(this.defaults));
+
+              case 4:
+              case "end":
+                return _context3.stop();
+            }
+          }
+        }, _callee3, this);
+      }));
+
+      function reset() {
+        return _ref3.apply(this, arguments);
+      }
+
+      return reset;
+    }()
+  }, {
+    key: "set",
+    value: function () {
+      var _ref4 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee4(name, value) {
+        var defaultValue, valueType, defaultType;
+        return _regenerator2.default.wrap(function _callee4$(_context4) {
+          while (1) {
+            switch (_context4.prev = _context4.next) {
+              case 0:
+                _context4.next = 2;
+                return this._initializedPromise;
+
+              case 2:
+                defaultValue = this.defaults[name];
+
+                if (!(defaultValue === undefined)) {
+                  _context4.next = 7;
+                  break;
+                }
+
+                throw new Error("Set preference: \"" + name + "\" is undefined.");
+
+              case 7:
+                if (!(value === undefined)) {
+                  _context4.next = 9;
+                  break;
+                }
+
+                throw new Error('Set preference: no value is specified.');
+
+              case 9:
+                valueType = typeof value === "undefined" ? "undefined" : _typeof(value);
+                defaultType = typeof defaultValue === "undefined" ? "undefined" : _typeof(defaultValue);
+
+                if (!(valueType !== defaultType)) {
+                  _context4.next = 19;
+                  break;
+                }
+
+                if (!(valueType === 'number' && defaultType === 'string')) {
+                  _context4.next = 16;
+                  break;
+                }
+
+                value = value.toString();
+                _context4.next = 17;
+                break;
+
+              case 16:
+                throw new Error("Set preference: \"" + value + "\" is a " + valueType + ", " + ("expected a " + defaultType + "."));
+
+              case 17:
+                _context4.next = 21;
+                break;
+
+              case 19:
+                if (!(valueType === 'number' && !Number.isInteger(value))) {
+                  _context4.next = 21;
+                  break;
+                }
+
+                throw new Error("Set preference: \"" + value + "\" must be an integer.");
+
+              case 21:
+                this.prefs[name] = value;
+                return _context4.abrupt("return", this._writeToStorage(this.prefs));
+
+              case 23:
+              case "end":
+                return _context4.stop();
+            }
+          }
+        }, _callee4, this);
+      }));
+
+      function set(_x3, _x4) {
+        return _ref4.apply(this, arguments);
+      }
+
+      return set;
+    }()
+  }, {
+    key: "get",
+    value: function () {
+      var _ref5 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee5(name) {
+        var defaultValue, prefValue;
+        return _regenerator2.default.wrap(function _callee5$(_context5) {
+          while (1) {
+            switch (_context5.prev = _context5.next) {
+              case 0:
+                _context5.next = 2;
+                return this._initializedPromise;
+
+              case 2:
+                defaultValue = this.defaults[name];
+
+                if (!(defaultValue === undefined)) {
+                  _context5.next = 7;
+                  break;
+                }
+
+                throw new Error("Get preference: \"" + name + "\" is undefined.");
+
+              case 7:
+                prefValue = this.prefs[name];
+
+                if (!(prefValue !== undefined)) {
+                  _context5.next = 10;
+                  break;
+                }
+
+                return _context5.abrupt("return", prefValue);
+
+              case 10:
+                return _context5.abrupt("return", defaultValue);
+
+              case 11:
+              case "end":
+                return _context5.stop();
+            }
+          }
+        }, _callee5, this);
+      }));
+
+      function get(_x5) {
+        return _ref5.apply(this, arguments);
+      }
+
+      return get;
+    }()
+  }, {
+    key: "getAll",
+    value: function () {
+      var _ref6 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee6() {
+        return _regenerator2.default.wrap(function _callee6$(_context6) {
+          while (1) {
+            switch (_context6.prev = _context6.next) {
+              case 0:
+                _context6.next = 2;
+                return this._initializedPromise;
+
+              case 2:
+                return _context6.abrupt("return", Object.assign(Object.create(null), this.defaults, this.prefs));
+
+              case 3:
+              case "end":
+                return _context6.stop();
+            }
+          }
+        }, _callee6, this);
+      }));
+
+      function getAll() {
+        return _ref6.apply(this, arguments);
+      }
+
+      return getAll;
+    }()
+  }]);
+
+  return BasePreferences;
+}();
+
+exports.BasePreferences = BasePreferences;
+
+/***/ }),
+/* 40 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.DownloadManager = undefined;
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _pdfjsLib = __webpack_require__(7);
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+;
+var DISABLE_CREATE_OBJECT_URL = _pdfjsLib.apiCompatibilityParams.disableCreateObjectURL || false;
+function _download(blobUrl, filename) {
+  var a = document.createElement('a');
+  if (!a.click) {
+    throw new Error('DownloadManager: "a.click()" is not supported.');
+  }
+  a.href = blobUrl;
+  a.target = '_parent';
+  if ('download' in a) {
+    a.download = filename;
+  }
+  (document.body || document.documentElement).appendChild(a);
+  a.click();
+  a.remove();
+}
+
+var DownloadManager = function () {
+  function DownloadManager(_ref) {
+    var _ref$disableCreateObj = _ref.disableCreateObjectURL,
+        disableCreateObjectURL = _ref$disableCreateObj === undefined ? DISABLE_CREATE_OBJECT_URL : _ref$disableCreateObj;
+
+    _classCallCheck(this, DownloadManager);
+
+    this.disableCreateObjectURL = disableCreateObjectURL;
+  }
+
+  _createClass(DownloadManager, [{
+    key: 'downloadUrl',
+    value: function downloadUrl(url, filename) {
+      if (!(0, _pdfjsLib.createValidAbsoluteUrl)(url, 'http://example.com')) {
+        return;
+      }
+      _download(url + '#pdfjs.action=download', filename);
+    }
+  }, {
+    key: 'downloadData',
+    value: function downloadData(data, filename, contentType) {
+      if (navigator.msSaveBlob) {
+        return navigator.msSaveBlob(new Blob([data], { type: contentType }), filename);
+      }
+      var blobUrl = (0, _pdfjsLib.createObjectURL)(data, contentType, this.disableCreateObjectURL);
+      _download(blobUrl, filename);
+    }
+  }, {
+    key: 'download',
+    value: function download(blob, url, filename) {
+      if (navigator.msSaveBlob) {
+        if (!navigator.msSaveBlob(blob, filename)) {
+          this.downloadUrl(url, filename);
+        }
+        return;
+      }
+      if (this.disableCreateObjectURL) {
+        this.downloadUrl(url, filename);
+        return;
+      }
+      var blobUrl = _pdfjsLib.URL.createObjectURL(blob);
+      _download(blobUrl, filename);
+    }
+  }]);
+
+  return DownloadManager;
+}();
+
+exports.DownloadManager = DownloadManager;
+
+/***/ }),
+/* 41 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.GenericL10n = undefined;
+
+var _regenerator = __webpack_require__(2);
+
+var _regenerator2 = _interopRequireDefault(_regenerator);
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+__webpack_require__(42);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var webL10n = document.webL10n;
+
+var GenericL10n = function () {
+  function GenericL10n(lang) {
+    _classCallCheck(this, GenericL10n);
+
+    this._lang = lang;
+    this._ready = new Promise(function (resolve, reject) {
+      webL10n.setLanguage(lang, function () {
+        resolve(webL10n);
+      });
+    });
+  }
+
+  _createClass(GenericL10n, [{
+    key: 'getLanguage',
+    value: function () {
+      var _ref = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee() {
+        var l10n;
+        return _regenerator2.default.wrap(function _callee$(_context) {
+          while (1) {
+            switch (_context.prev = _context.next) {
+              case 0:
+                _context.next = 2;
+                return this._ready;
+
+              case 2:
+                l10n = _context.sent;
+                return _context.abrupt('return', l10n.getLanguage());
+
+              case 4:
+              case 'end':
+                return _context.stop();
+            }
+          }
+        }, _callee, this);
+      }));
+
+      function getLanguage() {
+        return _ref.apply(this, arguments);
+      }
+
+      return getLanguage;
+    }()
+  }, {
+    key: 'getDirection',
+    value: function () {
+      var _ref2 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee2() {
+        var l10n;
+        return _regenerator2.default.wrap(function _callee2$(_context2) {
+          while (1) {
+            switch (_context2.prev = _context2.next) {
+              case 0:
+                _context2.next = 2;
+                return this._ready;
+
+              case 2:
+                l10n = _context2.sent;
+                return _context2.abrupt('return', l10n.getDirection());
+
+              case 4:
+              case 'end':
+                return _context2.stop();
+            }
+          }
+        }, _callee2, this);
+      }));
+
+      function getDirection() {
+        return _ref2.apply(this, arguments);
+      }
+
+      return getDirection;
+    }()
+  }, {
+    key: 'get',
+    value: function () {
+      var _ref3 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee3(property, args, fallback) {
+        var l10n;
+        return _regenerator2.default.wrap(function _callee3$(_context3) {
+          while (1) {
+            switch (_context3.prev = _context3.next) {
+              case 0:
+                _context3.next = 2;
+                return this._ready;
+
+              case 2:
+                l10n = _context3.sent;
+                return _context3.abrupt('return', l10n.get(property, args, fallback));
+
+              case 4:
+              case 'end':
+                return _context3.stop();
+            }
+          }
+        }, _callee3, this);
+      }));
+
+      function get(_x, _x2, _x3) {
+        return _ref3.apply(this, arguments);
+      }
+
+      return get;
+    }()
+  }, {
+    key: 'translate',
+    value: function () {
+      var _ref4 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee4(element) {
+        var l10n;
+        return _regenerator2.default.wrap(function _callee4$(_context4) {
+          while (1) {
+            switch (_context4.prev = _context4.next) {
+              case 0:
+                _context4.next = 2;
+                return this._ready;
+
+              case 2:
+                l10n = _context4.sent;
+                return _context4.abrupt('return', l10n.translate(element));
+
+              case 4:
+              case 'end':
+                return _context4.stop();
+            }
+          }
+        }, _callee4, this);
+      }));
+
+      function translate(_x4) {
+        return _ref4.apply(this, arguments);
+      }
+
+      return translate;
+    }()
+  }]);
+
+  return GenericL10n;
+}();
+
+exports.GenericL10n = GenericL10n;
+
+/***/ }),
+/* 42 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+document.webL10n = function (window, document, undefined) {
+  var gL10nData = {};
+  var gTextData = '';
+  var gTextProp = 'textContent';
+  var gLanguage = '';
+  var gMacros = {};
+  var gReadyState = 'loading';
+  var gAsyncResourceLoading = true;
+  function getL10nResourceLinks() {
+    return document.querySelectorAll('link[type="application/l10n"]');
+  }
+  function getL10nDictionary() {
+    var script = document.querySelector('script[type="application/l10n"]');
+    return script ? JSON.parse(script.innerHTML) : null;
+  }
+  function getTranslatableChildren(element) {
+    return element ? element.querySelectorAll('*[data-l10n-id]') : [];
+  }
+  function getL10nAttributes(element) {
+    if (!element) return {};
+    var l10nId = element.getAttribute('data-l10n-id');
+    var l10nArgs = element.getAttribute('data-l10n-args');
+    var args = {};
+    if (l10nArgs) {
+      try {
+        args = JSON.parse(l10nArgs);
+      } catch (e) {
+        console.warn('could not parse arguments for #' + l10nId);
+      }
+    }
+    return {
+      id: l10nId,
+      args: args
+    };
+  }
+  function fireL10nReadyEvent(lang) {
+    var evtObject = document.createEvent('Event');
+    evtObject.initEvent('localized', true, false);
+    evtObject.language = lang;
+    document.dispatchEvent(evtObject);
+  }
+  function xhrLoadText(url, onSuccess, onFailure) {
+    onSuccess = onSuccess || function _onSuccess(data) {};
+    onFailure = onFailure || function _onFailure() {};
+    var xhr = new XMLHttpRequest();
+    xhr.open('GET', url, gAsyncResourceLoading);
+    if (xhr.overrideMimeType) {
+      xhr.overrideMimeType('text/plain; charset=utf-8');
+    }
+    xhr.onreadystatechange = function () {
+      if (xhr.readyState == 4) {
+        if (xhr.status == 200 || xhr.status === 0) {
+          onSuccess(xhr.responseText);
+        } else {
+          onFailure();
+        }
+      }
+    };
+    xhr.onerror = onFailure;
+    xhr.ontimeout = onFailure;
+    try {
+      xhr.send(null);
+    } catch (e) {
+      onFailure();
+    }
+  }
+  function parseResource(href, lang, successCallback, failureCallback) {
+    var baseURL = href.replace(/[^\/]*$/, '') || './';
+    function evalString(text) {
+      if (text.lastIndexOf('\\') < 0) return text;
+      return text.replace(/\\\\/g, '\\').replace(/\\n/g, '\n').replace(/\\r/g, '\r').replace(/\\t/g, '\t').replace(/\\b/g, '\b').replace(/\\f/g, '\f').replace(/\\{/g, '{').replace(/\\}/g, '}').replace(/\\"/g, '"').replace(/\\'/g, "'");
+    }
+    function parseProperties(text, parsedPropertiesCallback) {
+      var dictionary = {};
+      var reBlank = /^\s*|\s*$/;
+      var reComment = /^\s*#|^\s*$/;
+      var reSection = /^\s*\[(.*)\]\s*$/;
+      var reImport = /^\s*@import\s+url\((.*)\)\s*$/i;
+      var reSplit = /^([^=\s]*)\s*=\s*(.+)$/;
+      function parseRawLines(rawText, extendedSyntax, parsedRawLinesCallback) {
+        var entries = rawText.replace(reBlank, '').split(/[\r\n]+/);
+        var currentLang = '*';
+        var genericLang = lang.split('-', 1)[0];
+        var skipLang = false;
+        var match = '';
+        function nextEntry() {
+          while (true) {
+            if (!entries.length) {
+              parsedRawLinesCallback();
+              return;
+            }
+            var line = entries.shift();
+            if (reComment.test(line)) continue;
+            if (extendedSyntax) {
+              match = reSection.exec(line);
+              if (match) {
+                currentLang = match[1].toLowerCase();
+                skipLang = currentLang !== '*' && currentLang !== lang && currentLang !== genericLang;
+                continue;
+              } else if (skipLang) {
+                continue;
+              }
+              match = reImport.exec(line);
+              if (match) {
+                loadImport(baseURL + match[1], nextEntry);
+                return;
+              }
+            }
+            var tmp = line.match(reSplit);
+            if (tmp && tmp.length == 3) {
+              dictionary[tmp[1]] = evalString(tmp[2]);
+            }
+          }
+        }
+        nextEntry();
+      }
+      function loadImport(url, callback) {
+        xhrLoadText(url, function (content) {
+          parseRawLines(content, false, callback);
+        }, function () {
+          console.warn(url + ' not found.');
+          callback();
+        });
+      }
+      parseRawLines(text, true, function () {
+        parsedPropertiesCallback(dictionary);
+      });
+    }
+    xhrLoadText(href, function (response) {
+      gTextData += response;
+      parseProperties(response, function (data) {
+        for (var key in data) {
+          var id,
+              prop,
+              index = key.lastIndexOf('.');
+          if (index > 0) {
+            id = key.substring(0, index);
+            prop = key.substring(index + 1);
+          } else {
+            id = key;
+            prop = gTextProp;
+          }
+          if (!gL10nData[id]) {
+            gL10nData[id] = {};
+          }
+          gL10nData[id][prop] = data[key];
+        }
+        if (successCallback) {
+          successCallback();
+        }
+      });
+    }, failureCallback);
+  }
+  function loadLocale(lang, callback) {
+    if (lang) {
+      lang = lang.toLowerCase();
+    }
+    callback = callback || function _callback() {};
+    clear();
+    gLanguage = lang;
+    var langLinks = getL10nResourceLinks();
+    var langCount = langLinks.length;
+    if (langCount === 0) {
+      var dict = getL10nDictionary();
+      if (dict && dict.locales && dict.default_locale) {
+        console.log('using the embedded JSON directory, early way out');
+        gL10nData = dict.locales[lang];
+        if (!gL10nData) {
+          var defaultLocale = dict.default_locale.toLowerCase();
+          for (var anyCaseLang in dict.locales) {
+            anyCaseLang = anyCaseLang.toLowerCase();
+            if (anyCaseLang === lang) {
+              gL10nData = dict.locales[lang];
+              break;
+            } else if (anyCaseLang === defaultLocale) {
+              gL10nData = dict.locales[defaultLocale];
+            }
+          }
+        }
+        callback();
+      } else {
+        console.log('no resource to load, early way out');
+      }
+      fireL10nReadyEvent(lang);
+      gReadyState = 'complete';
+      return;
+    }
+    var onResourceLoaded = null;
+    var gResourceCount = 0;
+    onResourceLoaded = function onResourceLoaded() {
+      gResourceCount++;
+      if (gResourceCount >= langCount) {
+        callback();
+        fireL10nReadyEvent(lang);
+        gReadyState = 'complete';
+      }
+    };
+    function L10nResourceLink(link) {
+      var href = link.href;
+      this.load = function (lang, callback) {
+        parseResource(href, lang, callback, function () {
+          console.warn(href + ' not found.');
+          console.warn('"' + lang + '" resource not found');
+          gLanguage = '';
+          callback();
+        });
+      };
+    }
+    for (var i = 0; i < langCount; i++) {
+      var resource = new L10nResourceLink(langLinks[i]);
+      resource.load(lang, onResourceLoaded);
+    }
+  }
+  function clear() {
+    gL10nData = {};
+    gTextData = '';
+    gLanguage = '';
+  }
+  function getPluralRules(lang) {
+    var locales2rules = {
+      'af': 3,
+      'ak': 4,
+      'am': 4,
+      'ar': 1,
+      'asa': 3,
+      'az': 0,
+      'be': 11,
+      'bem': 3,
+      'bez': 3,
+      'bg': 3,
+      'bh': 4,
+      'bm': 0,
+      'bn': 3,
+      'bo': 0,
+      'br': 20,
+      'brx': 3,
+      'bs': 11,
+      'ca': 3,
+      'cgg': 3,
+      'chr': 3,
+      'cs': 12,
+      'cy': 17,
+      'da': 3,
+      'de': 3,
+      'dv': 3,
+      'dz': 0,
+      'ee': 3,
+      'el': 3,
+      'en': 3,
+      'eo': 3,
+      'es': 3,
+      'et': 3,
+      'eu': 3,
+      'fa': 0,
+      'ff': 5,
+      'fi': 3,
+      'fil': 4,
+      'fo': 3,
+      'fr': 5,
+      'fur': 3,
+      'fy': 3,
+      'ga': 8,
+      'gd': 24,
+      'gl': 3,
+      'gsw': 3,
+      'gu': 3,
+      'guw': 4,
+      'gv': 23,
+      'ha': 3,
+      'haw': 3,
+      'he': 2,
+      'hi': 4,
+      'hr': 11,
+      'hu': 0,
+      'id': 0,
+      'ig': 0,
+      'ii': 0,
+      'is': 3,
+      'it': 3,
+      'iu': 7,
+      'ja': 0,
+      'jmc': 3,
+      'jv': 0,
+      'ka': 0,
+      'kab': 5,
+      'kaj': 3,
+      'kcg': 3,
+      'kde': 0,
+      'kea': 0,
+      'kk': 3,
+      'kl': 3,
+      'km': 0,
+      'kn': 0,
+      'ko': 0,
+      'ksb': 3,
+      'ksh': 21,
+      'ku': 3,
+      'kw': 7,
+      'lag': 18,
+      'lb': 3,
+      'lg': 3,
+      'ln': 4,
+      'lo': 0,
+      'lt': 10,
+      'lv': 6,
+      'mas': 3,
+      'mg': 4,
+      'mk': 16,
+      'ml': 3,
+      'mn': 3,
+      'mo': 9,
+      'mr': 3,
+      'ms': 0,
+      'mt': 15,
+      'my': 0,
+      'nah': 3,
+      'naq': 7,
+      'nb': 3,
+      'nd': 3,
+      'ne': 3,
+      'nl': 3,
+      'nn': 3,
+      'no': 3,
+      'nr': 3,
+      'nso': 4,
+      'ny': 3,
+      'nyn': 3,
+      'om': 3,
+      'or': 3,
+      'pa': 3,
+      'pap': 3,
+      'pl': 13,
+      'ps': 3,
+      'pt': 3,
+      'rm': 3,
+      'ro': 9,
+      'rof': 3,
+      'ru': 11,
+      'rwk': 3,
+      'sah': 0,
+      'saq': 3,
+      'se': 7,
+      'seh': 3,
+      'ses': 0,
+      'sg': 0,
+      'sh': 11,
+      'shi': 19,
+      'sk': 12,
+      'sl': 14,
+      'sma': 7,
+      'smi': 7,
+      'smj': 7,
+      'smn': 7,
+      'sms': 7,
+      'sn': 3,
+      'so': 3,
+      'sq': 3,
+      'sr': 11,
+      'ss': 3,
+      'ssy': 3,
+      'st': 3,
+      'sv': 3,
+      'sw': 3,
+      'syr': 3,
+      'ta': 3,
+      'te': 3,
+      'teo': 3,
+      'th': 0,
+      'ti': 4,
+      'tig': 3,
+      'tk': 3,
+      'tl': 4,
+      'tn': 3,
+      'to': 0,
+      'tr': 0,
+      'ts': 3,
+      'tzm': 22,
+      'uk': 11,
+      'ur': 3,
+      've': 3,
+      'vi': 0,
+      'vun': 3,
+      'wa': 4,
+      'wae': 3,
+      'wo': 0,
+      'xh': 3,
+      'xog': 3,
+      'yo': 0,
+      'zh': 0,
+      'zu': 3
+    };
+    function isIn(n, list) {
+      return list.indexOf(n) !== -1;
+    }
+    function isBetween(n, start, end) {
+      return start <= n && n <= end;
+    }
+    var pluralRules = {
+      '0': function _(n) {
+        return 'other';
+      },
+      '1': function _(n) {
+        if (isBetween(n % 100, 3, 10)) return 'few';
+        if (n === 0) return 'zero';
+        if (isBetween(n % 100, 11, 99)) return 'many';
+        if (n == 2) return 'two';
+        if (n == 1) return 'one';
+        return 'other';
+      },
+      '2': function _(n) {
+        if (n !== 0 && n % 10 === 0) return 'many';
+        if (n == 2) return 'two';
+        if (n == 1) return 'one';
+        return 'other';
+      },
+      '3': function _(n) {
+        if (n == 1) return 'one';
+        return 'other';
+      },
+      '4': function _(n) {
+        if (isBetween(n, 0, 1)) return 'one';
+        return 'other';
+      },
+      '5': function _(n) {
+        if (isBetween(n, 0, 2) && n != 2) return 'one';
+        return 'other';
+      },
+      '6': function _(n) {
+        if (n === 0) return 'zero';
+        if (n % 10 == 1 && n % 100 != 11) return 'one';
+        return 'other';
+      },
+      '7': function _(n) {
+        if (n == 2) return 'two';
+        if (n == 1) return 'one';
+        return 'other';
+      },
+      '8': function _(n) {
+        if (isBetween(n, 3, 6)) return 'few';
+        if (isBetween(n, 7, 10)) return 'many';
+        if (n == 2) return 'two';
+        if (n == 1) return 'one';
+        return 'other';
+      },
+      '9': function _(n) {
+        if (n === 0 || n != 1 && isBetween(n % 100, 1, 19)) return 'few';
+        if (n == 1) return 'one';
+        return 'other';
+      },
+      '10': function _(n) {
+        if (isBetween(n % 10, 2, 9) && !isBetween(n % 100, 11, 19)) return 'few';
+        if (n % 10 == 1 && !isBetween(n % 100, 11, 19)) return 'one';
+        return 'other';
+      },
+      '11': function _(n) {
+        if (isBetween(n % 10, 2, 4) && !isBetween(n % 100, 12, 14)) return 'few';
+        if (n % 10 === 0 || isBetween(n % 10, 5, 9) || isBetween(n % 100, 11, 14)) return 'many';
+        if (n % 10 == 1 && n % 100 != 11) return 'one';
+        return 'other';
+      },
+      '12': function _(n) {
+        if (isBetween(n, 2, 4)) return 'few';
+        if (n == 1) return 'one';
+        return 'other';
+      },
+      '13': function _(n) {
+        if (isBetween(n % 10, 2, 4) && !isBetween(n % 100, 12, 14)) return 'few';
+        if (n != 1 && isBetween(n % 10, 0, 1) || isBetween(n % 10, 5, 9) || isBetween(n % 100, 12, 14)) return 'many';
+        if (n == 1) return 'one';
+        return 'other';
+      },
+      '14': function _(n) {
+        if (isBetween(n % 100, 3, 4)) return 'few';
+        if (n % 100 == 2) return 'two';
+        if (n % 100 == 1) return 'one';
+        return 'other';
+      },
+      '15': function _(n) {
+        if (n === 0 || isBetween(n % 100, 2, 10)) return 'few';
+        if (isBetween(n % 100, 11, 19)) return 'many';
+        if (n == 1) return 'one';
+        return 'other';
+      },
+      '16': function _(n) {
+        if (n % 10 == 1 && n != 11) return 'one';
+        return 'other';
+      },
+      '17': function _(n) {
+        if (n == 3) return 'few';
+        if (n === 0) return 'zero';
+        if (n == 6) return 'many';
+        if (n == 2) return 'two';
+        if (n == 1) return 'one';
+        return 'other';
+      },
+      '18': function _(n) {
+        if (n === 0) return 'zero';
+        if (isBetween(n, 0, 2) && n !== 0 && n != 2) return 'one';
+        return 'other';
+      },
+      '19': function _(n) {
+        if (isBetween(n, 2, 10)) return 'few';
+        if (isBetween(n, 0, 1)) return 'one';
+        return 'other';
+      },
+      '20': function _(n) {
+        if ((isBetween(n % 10, 3, 4) || n % 10 == 9) && !(isBetween(n % 100, 10, 19) || isBetween(n % 100, 70, 79) || isBetween(n % 100, 90, 99))) return 'few';
+        if (n % 1000000 === 0 && n !== 0) return 'many';
+        if (n % 10 == 2 && !isIn(n % 100, [12, 72, 92])) return 'two';
+        if (n % 10 == 1 && !isIn(n % 100, [11, 71, 91])) return 'one';
+        return 'other';
+      },
+      '21': function _(n) {
+        if (n === 0) return 'zero';
+        if (n == 1) return 'one';
+        return 'other';
+      },
+      '22': function _(n) {
+        if (isBetween(n, 0, 1) || isBetween(n, 11, 99)) return 'one';
+        return 'other';
+      },
+      '23': function _(n) {
+        if (isBetween(n % 10, 1, 2) || n % 20 === 0) return 'one';
+        return 'other';
+      },
+      '24': function _(n) {
+        if (isBetween(n, 3, 10) || isBetween(n, 13, 19)) return 'few';
+        if (isIn(n, [2, 12])) return 'two';
+        if (isIn(n, [1, 11])) return 'one';
+        return 'other';
+      }
+    };
+    var index = locales2rules[lang.replace(/-.*$/, '')];
+    if (!(index in pluralRules)) {
+      console.warn('plural form unknown for [' + lang + ']');
+      return function () {
+        return 'other';
+      };
+    }
+    return pluralRules[index];
+  }
+  gMacros.plural = function (str, param, key, prop) {
+    var n = parseFloat(param);
+    if (isNaN(n)) return str;
+    if (prop != gTextProp) return str;
+    if (!gMacros._pluralRules) {
+      gMacros._pluralRules = getPluralRules(gLanguage);
+    }
+    var index = '[' + gMacros._pluralRules(n) + ']';
+    if (n === 0 && key + '[zero]' in gL10nData) {
+      str = gL10nData[key + '[zero]'][prop];
+    } else if (n == 1 && key + '[one]' in gL10nData) {
+      str = gL10nData[key + '[one]'][prop];
+    } else if (n == 2 && key + '[two]' in gL10nData) {
+      str = gL10nData[key + '[two]'][prop];
+    } else if (key + index in gL10nData) {
+      str = gL10nData[key + index][prop];
+    } else if (key + '[other]' in gL10nData) {
+      str = gL10nData[key + '[other]'][prop];
+    }
+    return str;
+  };
+  function getL10nData(key, args, fallback) {
+    var data = gL10nData[key];
+    if (!data) {
+      console.warn('#' + key + ' is undefined.');
+      if (!fallback) {
+        return null;
+      }
+      data = fallback;
+    }
+    var rv = {};
+    for (var prop in data) {
+      var str = data[prop];
+      str = substIndexes(str, args, key, prop);
+      str = substArguments(str, args, key);
+      rv[prop] = str;
+    }
+    return rv;
+  }
+  function substIndexes(str, args, key, prop) {
+    var reIndex = /\{\[\s*([a-zA-Z]+)\(([a-zA-Z]+)\)\s*\]\}/;
+    var reMatch = reIndex.exec(str);
+    if (!reMatch || !reMatch.length) return str;
+    var macroName = reMatch[1];
+    var paramName = reMatch[2];
+    var param;
+    if (args && paramName in args) {
+      param = args[paramName];
+    } else if (paramName in gL10nData) {
+      param = gL10nData[paramName];
+    }
+    if (macroName in gMacros) {
+      var macro = gMacros[macroName];
+      str = macro(str, param, key, prop);
+    }
+    return str;
+  }
+  function substArguments(str, args, key) {
+    var reArgs = /\{\{\s*(.+?)\s*\}\}/g;
+    return str.replace(reArgs, function (matched_text, arg) {
+      if (args && arg in args) {
+        return args[arg];
+      }
+      if (arg in gL10nData) {
+        return gL10nData[arg];
+      }
+      console.log('argument {{' + arg + '}} for #' + key + ' is undefined.');
+      return matched_text;
+    });
+  }
+  function translateElement(element) {
+    var l10n = getL10nAttributes(element);
+    if (!l10n.id) return;
+    var data = getL10nData(l10n.id, l10n.args);
+    if (!data) {
+      console.warn('#' + l10n.id + ' is undefined.');
+      return;
+    }
+    if (data[gTextProp]) {
+      if (getChildElementCount(element) === 0) {
+        element[gTextProp] = data[gTextProp];
+      } else {
+        var children = element.childNodes;
+        var found = false;
+        for (var i = 0, l = children.length; i < l; i++) {
+          if (children[i].nodeType === 3 && /\S/.test(children[i].nodeValue)) {
+            if (found) {
+              children[i].nodeValue = '';
+            } else {
+              children[i].nodeValue = data[gTextProp];
+              found = true;
+            }
+          }
+        }
+        if (!found) {
+          var textNode = document.createTextNode(data[gTextProp]);
+          element.insertBefore(textNode, element.firstChild);
+        }
+      }
+      delete data[gTextProp];
+    }
+    for (var k in data) {
+      element[k] = data[k];
+    }
+  }
+  function getChildElementCount(element) {
+    if (element.children) {
+      return element.children.length;
+    }
+    if (typeof element.childElementCount !== 'undefined') {
+      return element.childElementCount;
+    }
+    var count = 0;
+    for (var i = 0; i < element.childNodes.length; i++) {
+      count += element.nodeType === 1 ? 1 : 0;
+    }
+    return count;
+  }
+  function translateFragment(element) {
+    element = element || document.documentElement;
+    var children = getTranslatableChildren(element);
+    var elementCount = children.length;
+    for (var i = 0; i < elementCount; i++) {
+      translateElement(children[i]);
+    }
+    translateElement(element);
+  }
+  return {
+    get: function get(key, args, fallbackString) {
+      var index = key.lastIndexOf('.');
+      var prop = gTextProp;
+      if (index > 0) {
+        prop = key.substring(index + 1);
+        key = key.substring(0, index);
+      }
+      var fallback;
+      if (fallbackString) {
+        fallback = {};
+        fallback[prop] = fallbackString;
+      }
+      var data = getL10nData(key, args, fallback);
+      if (data && prop in data) {
+        return data[prop];
+      }
+      return '{{' + key + '}}';
+    },
+    getData: function getData() {
+      return gL10nData;
+    },
+    getText: function getText() {
+      return gTextData;
+    },
+    getLanguage: function getLanguage() {
+      return gLanguage;
+    },
+    setLanguage: function setLanguage(lang, callback) {
+      loadLocale(lang, function () {
+        if (callback) callback();
+      });
+    },
+    getDirection: function getDirection() {
+      var rtlList = ['ar', 'he', 'fa', 'ps', 'ur'];
+      var shortCode = gLanguage.split('-', 1)[0];
+      return rtlList.indexOf(shortCode) >= 0 ? 'rtl' : 'ltr';
+    },
+    translate: translateFragment,
+    getReadyState: function getReadyState() {
+      return gReadyState;
+    },
+    ready: function ready(callback) {
+      if (!callback) {
+        return;
+      } else if (gReadyState == 'complete' || gReadyState == 'interactive') {
+        window.setTimeout(function () {
+          callback();
+        });
+      } else if (document.addEventListener) {
+        document.addEventListener('localized', function once() {
+          document.removeEventListener('localized', once);
+          callback();
+        });
+      }
+    }
+  };
+}(window, document);
+
+/***/ }),
+/* 43 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.PDFPrintService = undefined;
+
+var _ui_utils = __webpack_require__(6);
+
+var _app = __webpack_require__(1);
+
+var _pdfjsLib = __webpack_require__(7);
+
+var activeService = null;
+var overlayManager = null;
+function renderPage(activeServiceOnEntry, pdfDocument, pageNumber, size) {
+  var scratchCanvas = activeService.scratchCanvas;
+  var PRINT_RESOLUTION = 150;
+  var PRINT_UNITS = PRINT_RESOLUTION / 72.0;
+  scratchCanvas.width = Math.floor(size.width * PRINT_UNITS);
+  scratchCanvas.height = Math.floor(size.height * PRINT_UNITS);
+  var width = Math.floor(size.width * _ui_utils.CSS_UNITS) + 'px';
+  var height = Math.floor(size.height * _ui_utils.CSS_UNITS) + 'px';
+  var ctx = scratchCanvas.getContext('2d');
+  ctx.save();
+  ctx.fillStyle = 'rgb(255, 255, 255)';
+  ctx.fillRect(0, 0, scratchCanvas.width, scratchCanvas.height);
+  ctx.restore();
+  return pdfDocument.getPage(pageNumber).then(function (pdfPage) {
+    var renderContext = {
+      canvasContext: ctx,
+      transform: [PRINT_UNITS, 0, 0, PRINT_UNITS, 0, 0],
+      viewport: pdfPage.getViewport(1, size.rotation),
+      intent: 'print'
+    };
+    return pdfPage.render(renderContext).promise;
+  }).then(function () {
+    return {
+      width: width,
+      height: height
+    };
+  });
+}
+function PDFPrintService(pdfDocument, pagesOverview, printContainer, l10n) {
+  this.pdfDocument = pdfDocument;
+  this.pagesOverview = pagesOverview;
+  this.printContainer = printContainer;
+  this.l10n = l10n || _ui_utils.NullL10n;
+  this.disableCreateObjectURL = pdfDocument.loadingParams['disableCreateObjectURL'];
+  this.currentPage = -1;
+  this.scratchCanvas = document.createElement('canvas');
+}
+PDFPrintService.prototype = {
+  layout: function layout() {
+    this.throwIfInactive();
+    var body = document.querySelector('body');
+    body.setAttribute('data-pdfjsprinting', true);
+    var hasEqualPageSizes = this.pagesOverview.every(function (size) {
+      return size.width === this.pagesOverview[0].width && size.height === this.pagesOverview[0].height;
+    }, this);
+    if (!hasEqualPageSizes) {
+      console.warn('Not all pages have the same size. The printed ' + 'result may be incorrect!');
+    }
+    this.pageStyleSheet = document.createElement('style');
+    var pageSize = this.pagesOverview[0];
+    this.pageStyleSheet.textContent = '@supports ((size:A4) and (size:1pt 1pt)) {' + '@page { size: ' + pageSize.width + 'pt ' + pageSize.height + 'pt;}' + '}';
+    body.appendChild(this.pageStyleSheet);
+  },
+  destroy: function destroy() {
+    if (activeService !== this) {
+      return;
+    }
+    this.printContainer.textContent = '';
+    if (this.pageStyleSheet) {
+      this.pageStyleSheet.remove();
+      this.pageStyleSheet = null;
+    }
+    this.scratchCanvas.width = this.scratchCanvas.height = 0;
+    this.scratchCanvas = null;
+    activeService = null;
+    ensureOverlay().then(function () {
+      if (overlayManager.active !== 'printServiceOverlay') {
+        return;
+      }
+      overlayManager.close('printServiceOverlay');
+    });
+  },
+  renderPages: function renderPages() {
+    var _this = this;
+
+    var pageCount = this.pagesOverview.length;
+    var renderNextPage = function renderNextPage(resolve, reject) {
+      _this.throwIfInactive();
+      if (++_this.currentPage >= pageCount) {
+        renderProgress(pageCount, pageCount, _this.l10n);
+        resolve();
+        return;
+      }
+      var index = _this.currentPage;
+      renderProgress(index, pageCount, _this.l10n);
+      renderPage(_this, _this.pdfDocument, index + 1, _this.pagesOverview[index]).then(_this.useRenderedPage.bind(_this)).then(function () {
+        renderNextPage(resolve, reject);
+      }, reject);
+    };
+    return new Promise(renderNextPage);
+  },
+  useRenderedPage: function useRenderedPage(printItem) {
+    this.throwIfInactive();
+    var img = document.createElement('img');
+    img.style.width = printItem.width;
+    img.style.height = printItem.height;
+    var scratchCanvas = this.scratchCanvas;
+    if ('toBlob' in scratchCanvas && !this.disableCreateObjectURL) {
+      scratchCanvas.toBlob(function (blob) {
+        img.src = _pdfjsLib.URL.createObjectURL(blob);
+      });
+    } else {
+      img.src = scratchCanvas.toDataURL();
+    }
+    var wrapper = document.createElement('div');
+    wrapper.appendChild(img);
+    this.printContainer.appendChild(wrapper);
+    return new Promise(function (resolve, reject) {
+      img.onload = resolve;
+      img.onerror = reject;
+    });
+  },
+  performPrint: function performPrint() {
+    var _this2 = this;
+
+    this.throwIfInactive();
+    return new Promise(function (resolve) {
+      setTimeout(function () {
+        if (!_this2.active) {
+          resolve();
+          return;
+        }
+        print.call(window);
+        setTimeout(resolve, 20);
+      }, 0);
+    });
+  },
+
+  get active() {
+    return this === activeService;
+  },
+  throwIfInactive: function throwIfInactive() {
+    if (!this.active) {
+      throw new Error('This print request was cancelled or completed.');
+    }
+  }
+};
+var print = window.print;
+window.print = function print() {
+  if (activeService) {
+    console.warn('Ignored window.print() because of a pending print job.');
+    return;
+  }
+  ensureOverlay().then(function () {
+    if (activeService) {
+      overlayManager.open('printServiceOverlay');
+    }
+  });
+  try {
+    dispatchEvent('beforeprint');
+  } finally {
+    if (!activeService) {
+      console.error('Expected print service to be initialized.');
+      ensureOverlay().then(function () {
+        if (overlayManager.active === 'printServiceOverlay') {
+          overlayManager.close('printServiceOverlay');
+        }
+      });
+      return;
+    }
+    var activeServiceOnEntry = activeService;
+    activeService.renderPages().then(function () {
+      return activeServiceOnEntry.performPrint();
+    }).catch(function () {}).then(function () {
+      if (activeServiceOnEntry.active) {
+        abort();
+      }
+    });
+  }
+};
+function dispatchEvent(eventType) {
+  var event = document.createEvent('CustomEvent');
+  event.initCustomEvent(eventType, false, false, 'custom');
+  window.dispatchEvent(event);
+}
+function abort() {
+  if (activeService) {
+    activeService.destroy();
+    dispatchEvent('afterprint');
+  }
+}
+function renderProgress(index, total, l10n) {
+  var progressContainer = document.getElementById('printServiceOverlay');
+  var progress = Math.round(100 * index / total);
+  var progressBar = progressContainer.querySelector('progress');
+  var progressPerc = progressContainer.querySelector('.relative-progress');
+  progressBar.value = progress;
+  l10n.get('print_progress_percent', { progress: progress }, progress + '%').then(function (msg) {
+    progressPerc.textContent = msg;
+  });
+}
+var hasAttachEvent = !!document.attachEvent;
+window.addEventListener('keydown', function (event) {
+  if (event.keyCode === 80 && (event.ctrlKey || event.metaKey) && !event.altKey && (!event.shiftKey || window.chrome || window.opera)) {
+    window.print();
+    if (hasAttachEvent) {
+      return;
+    }
+    event.preventDefault();
+    if (event.stopImmediatePropagation) {
+      event.stopImmediatePropagation();
+    } else {
+      event.stopPropagation();
+    }
+    return;
+  }
+}, true);
+if (hasAttachEvent) {
+  document.attachEvent('onkeydown', function (event) {
+    event = event || window.event;
+    if (event.keyCode === 80 && event.ctrlKey) {
+      event.keyCode = 0;
+      return false;
+    }
+  });
+}
+if ('onbeforeprint' in window) {
+  var stopPropagationIfNeeded = function stopPropagationIfNeeded(event) {
+    if (event.detail !== 'custom' && event.stopImmediatePropagation) {
+      event.stopImmediatePropagation();
+    }
+  };
+  window.addEventListener('beforeprint', stopPropagationIfNeeded);
+  window.addEventListener('afterprint', stopPropagationIfNeeded);
+}
+var overlayPromise = void 0;
+function ensureOverlay() {
+  if (!overlayPromise) {
+    overlayManager = _app.PDFViewerApplication.overlayManager;
+    if (!overlayManager) {
+      throw new Error('The overlay manager has not yet been initialized.');
+    }
+    overlayPromise = overlayManager.register('printServiceOverlay', document.getElementById('printServiceOverlay'), abort, true);
+    document.getElementById('printCancel').onclick = abort;
+  }
+  return overlayPromise;
+}
+_app.PDFPrintServiceFactory.instance = {
+  supportsPrinting: true,
+  createPrintService: function createPrintService(pdfDocument, pagesOverview, printContainer, l10n) {
+    if (activeService) {
+      throw new Error('The print service is created and active.');
+    }
+    activeService = new PDFPrintService(pdfDocument, pagesOverview, printContainer, l10n);
+    return activeService;
+  }
+};
+exports.PDFPrintService = PDFPrintService;
+
+/***/ })
+/******/ ]);
+///////////# sourceMappingURL=viewer.js.map
+
+function doNothing(){
+    window.event.returnValue =false;
+    return false;
+}
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/viewer.js.map b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/viewer.js.map
new file mode 100644
index 0000000..1a3fd20
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/filepreview/web/viewer.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///web/viewer.js","webpack:///web/app.js","webpack:///node_modules/babel-runtime/regenerator/index.js","webpack:///node_modules/regenerator-runtime/runtime-module.js","webpack:///node_modules/regenerator-runtime/runtime.js","webpack:///node_modules/webpack/buildin/module.js","webpack:///web/ui_utils.js","webpack:///web/pdfjs.js","webpack:///web/pdf_cursor_tools.js","webpack:///web/grab_to_pan.js","webpack:///web/pdf_rendering_queue.js","webpack:///web/pdf_sidebar.js","webpack:///web/app_options.js","webpack:///web/viewer_compatibility.js","webpack:///web/dom_events.js","webpack:///web/overlay_manager.js","webpack:///web/password_prompt.js","webpack:///web/pdf_attachment_viewer.js","webpack:///web/pdf_document_properties.js","webpack:///web/pdf_find_bar.js","webpack:///web/pdf_find_controller.js","webpack:///web/pdf_find_utils.js","webpack:///web/pdf_history.js","webpack:///web/pdf_link_service.js","webpack:///web/pdf_outline_viewer.js","webpack:///web/pdf_presentation_mode.js","webpack:///web/pdf_sidebar_resizer.js","webpack:///web/pdf_thumbnail_viewer.js","webpack:///web/pdf_thumbnail_view.js","webpack:///web/pdf_viewer.js","webpack:///web/base_viewer.js","webpack:///web/annotation_layer_builder.js","webpack:///web/pdf_page_view.js","webpack:///web/text_layer_builder.js","webpack:///web/secondary_toolbar.js","webpack:///web/pdf_single_page_viewer.js","webpack:///web/toolbar.js","webpack:///web/view_history.js","webpack:///web/genericcom.js","webpack:///web/preferences.js","webpack:///web/download_manager.js","webpack:///web/genericl10n.js","webpack:///external/webL10n/l10n.js","webpack:///web/pdf_print_service.js"],"names":["pdfjsWebApp","require","pdfjsWebAppOptions","appContainer","document","mainContainer","viewerContainer","eventBus","toolbar","container","numPages","pageNumber","scaleSelectContainer","scaleSelect","customScaleOption","previous","next","zoomIn","zoomOut","viewFind","openFile","print","presentationModeButton","download","viewBookmark","secondaryToolbar","toggleButton","toolbarButtonContainer","openFileButton","printButton","downloadButton","viewBookmarkButton","firstPageButton","lastPageButton","pageRotateCwButton","pageRotateCcwButton","cursorSelectToolButton","cursorHandToolButton","scrollVerticalButton","scrollHorizontalButton","scrollWrappedButton","spreadNoneButton","spreadOddButton","spreadEvenButton","documentPropertiesButton","fullscreen","contextFirstPage","contextLastPage","contextPageRotateCw","contextPageRotateCcw","sidebar","outerContainer","thumbnailButton","outlineButton","attachmentsButton","thumbnailView","outlineView","attachmentsView","sidebarResizer","resizer","findBar","bar","findField","highlightAllCheckbox","caseSensitiveCheckbox","entireWordCheckbox","findMsg","findResultsCount","findPreviousButton","findNextButton","passwordOverlay","overlayName","label","input","submitButton","cancelButton","documentProperties","closeButton","fields","errorWrapper","errorMessage","errorMoreInfo","moreInfoButton","lessInfoButton","printContainer","openFileInputName","debuggerScriptPath","config","window","DEFAULT_SCALE_DELTA","DISABLE_AUTO_FETCH_LOADING_BAR_TIMEOUT","FORCE_PAGES_LOADED_TIMEOUT","DefaultExternalServices","updateFindControlState","updateFindMatchesCount","initPassiveLoading","fallback","reportTelemetry","createDownloadManager","createPreferences","createL10n","supportsIntegratedFind","supportsDocumentFonts","supportsDocumentColors","supportedMouseWheelZoomModifierKeys","ctrlKey","metaKey","PDFViewerApplication","initialBookmark","initialized","fellback","appConfig","pdfDocument","pdfLoadingTask","printService","pdfViewer","pdfThumbnailViewer","pdfRenderingQueue","pdfPresentationMode","pdfDocumentProperties","pdfLinkService","pdfHistory","pdfSidebar","pdfSidebarResizer","pdfOutlineViewer","pdfAttachmentViewer","pdfCursorTools","store","downloadManager","overlayManager","preferences","l10n","isInitialViewSet","downloadComplete","isViewerEmbedded","url","baseUrl","externalServices","_boundEvents","contentDispositionFilename","AppOptions","LinkTarget","source","OVERRIDES","disableFontFace","disableRange","disableStream","textLayerMode","TextLayerMode","prefs","name","waitOn","hash","hashParams","parseQueryString","viewer","enabled","loadAndEnablePDFBug","console","reason","locale","dir","dispatchToDOM","getGlobalEventBus","externalLinkTarget","externalLinkRel","disableCreateObjectURL","findController","linkService","renderingQueue","renderer","enableWebGL","imageResourcesPath","renderInteractiveForms","enablePrintAutoRotate","useOnlyCssZoom","maxCanvasPixels","thumbnailContainer","cursorToolOnLoad","contextMenuItems","sidebarConfig","Object","run","newScale","Math","PDFPrintServiceFactory","doc","support","shadow","setTitleUsingUrl","title","getPDFFileNameFromURL","decodeURIComponent","getFilenameFromUrl","setTitle","promise","PDFBug","workerParameters","GlobalWorkerOptions","parameters","file","apiParameters","prop","args","loadingTask","getDocument","loaded","message","exception","loadingErrorMessage","filename","blob","type","error","moreInfoText","version","build","moreInfo","stack","line","errorWrapperConfig","Promise","parts","progress","percent","level","isNaN","disableAutoFetch","clearTimeout","load","firstPagePromise","pageModePromise","baseDocumentUrl","pagesPromise","onePageRendered","resetHistory","storePromise","page","zoom","scrollLeft","scrollTop","rotation","sidebarView","SidebarView","scrollMode","spreadMode","values","parseInt","pageMode","apiPageModeToSidebarView","setTimeout","i","numLabels","labels","javaScript","UNSUPPORTED_FEATURES","regex","ii","js","info","metadata","pdfTitle","setInitialView","setRotation","isValidRotation","setViewerModes","Number","cleanup","RendererType","forceRendering","beforePrint","pagesOverview","afterPrint","rotatePages","newRotation","requestPresentationMode","bindEvents","bindWindowEvents","unbindEvents","unbindWindowEvents","HOSTED_VIEWER_ORIGINS","validateFileURL","viewerOrigin","origin","protocol","ex","loadScript","PDFWorker","queryString","params","fileInput","files","evt","webViewerOpenFileViaURL","xhr","pageIndex","pageView","Stats","mode","view","action","switchInProgress","PresentationModeState","active","location","href","currentPage","loading","RenderingStates","currentScaleValue","webViewerFileInputChange","URL","originalUrl","fileReader","buffer","query","phraseSearch","caseSensitive","entireWord","highlightAll","findPrevious","result","zoomDisabled","previousScale","delta","normalizeWheelEventDelta","MOUSE_WHEEL_DELTA_PER_PAGE_SCALE","ticks","currentScale","scaleCorrectionFactor","rect","dx","dy","zoomDisabledTimeout","handled","ensureViewerFocused","cmd","isViewerInPresentationMode","findState","curElement","curElementTagName","turnPage","turnOnlyIfPageFit","CursorTool","instance","supportsPrinting","createPrintService","module","g","Function","hadRuntime","oldRuntime","Op","hasOwn","$Symbol","iteratorSymbol","asyncIteratorSymbol","toStringTagSymbol","inModule","runtime","global","protoGenerator","outerFn","generator","context","tryLocsList","makeInvokeMethod","arg","fn","GenStateSuspendedStart","GenStateSuspendedYield","GenStateExecuting","GenStateCompleted","ContinueSentinel","IteratorPrototype","getProto","NativeIteratorPrototype","Gp","GeneratorFunctionPrototype","Generator","GeneratorFunction","prototype","ctor","genFun","__await","record","tryCatch","reject","value","invoke","resolve","previousPromise","defineIteratorMethods","AsyncIterator","iter","wrap","state","method","delegate","delegateResult","maybeInvokeDelegate","done","entry","tryLoc","locs","keys","key","iteratorMethod","iterable","Context","constructor","reset","stop","rootEntry","rootRecord","dispatchException","handle","hasCatch","hasFinally","abrupt","finallyEntry","complete","finish","resetTryEntry","thrown","delegateYield","iterator","resultName","nextLoc","enumerable","get","CSS_UNITS","DEFAULT_SCALE_VALUE","DEFAULT_SCALE","MIN_SCALE","MAX_SCALE","UNKNOWN_SCALE","MAX_AUTO_SCALE","SCROLLBAR_PADDING","VERTICAL_PADDING","UNKNOWN","NORMAL","CHANGING","FULLSCREEN","CANVAS","SVG","DISABLE","ENABLE","ENABLE_ENHANCE","NullL10n","formatL10nValue","devicePixelRatio","backingStoreRatio","ctx","pixelRatio","sx","sy","scaled","skipOverflowHiddenElements","parent","element","offsetY","offsetX","getComputedStyle","spot","debounceScroll","rAF","currentX","viewAreaElement","lastX","currentY","lastY","callback","right","down","_eventHandler","param","minIndex","maxIndex","items","condition","currentIndex","currentItem","xinv","limit","x_","x","a","b","c","d","p","q","r","changeOrientation","rotate","width","height","index","elt","views","pageTop","sortByVisibility","horizontal","top","scrollEl","bottom","left","elementBottom","elementRight","visible","firstVisibleElementInd","binarySearchFirstItem","backtrackBeforeAllVisibleElements","lastEdge","currentWidth","currentHeight","viewWidth","viewHeight","viewRight","viewBottom","hiddenHeight","hiddenWidth","percentVisible","id","y","first","last","pc","defaultFilename","isDataSchema","reURI","reFilename","splitURI","suggestedFilename","angle","MOUSE_DOM_DELTA_PIXEL_MODE","MOUSE_DOM_DELTA_LINE_MODE","MOUSE_PIXELS_PER_LINE","MOUSE_LINES_PER_PAGE","size","WaitOnType","EVENT","TIMEOUT","delay","target","eventHandler","handler","timeoutHandler","timeout","animationStarted","on","eventListeners","off","dispatch","Array","listener","_dispatchDOMEvent","details","obj","event","units","progressSize","setWidth","scrollbarWidth","clamp","moved","len","arr","write","read","pdfjsLib","__non_webpack_require__","SELECT","HAND","ZOOM","switchTool","tool","disableActiveTool","previouslyActive","options","overlay","GrabToPan","CSS_CLASS_GRAB","activate","deactivate","toggle","ignoreTarget","node","_onmousedown","focusedElement","_onmousemove","isLeftMouseReleased","xDiff","yDiff","behavior","_endPan","prefix","matchesSelector","isNotIEorIsIE10plus","chrome","isChrome15OrOpera15plus","isSafari6plus","navigator","CLEANUP_TIMEOUT","INITIAL","RUNNING","PAUSED","FINISHED","setViewer","setThumbnailViewer","isHighestPriority","renderHighestPriority","getHighestPriority","visibleViews","numVisible","nextPageIndex","previousPageIndex","isViewFinished","renderView","continueRendering","UI_NOTIFICATION_CLASS","NONE","THUMBS","OUTLINE","ATTACHMENTS","isViewPreserved","switchView","forceOpen","isViewChanged","shouldForceRendering","pagesCount","_showUINotification","_hideUINotification","removeNotification","outlineCount","OptionKind","VIEWER","API","WORKER","defaultOptions","kind","defaultUrl","defaultZoomValue","disableHistory","disablePageLabels","disablePageMode","eventBusDispatchToDOM","viewerCompatibilityParams","pdfBugEnabled","showPreviousViewOnLoad","sidebarViewOnLoad","scrollModeOnLoad","spreadModeOnLoad","cMapPacked","cMapUrl","apiCompatibilityParams","isEvalSupported","maxImageSize","pdfBug","postMessageTransfers","verbosity","workerPort","workerSrc","userOptions","defaultOption","userOption","compatibilityParams","userAgent","isAndroid","isIOS","exports","cssTransform","attachmentsCount","globalEventBus","attachDOMEventsToEventBus","callerCloseMethod","canForceClose","_keyDown","e","PasswordResponses","promptString","password","setUpdateCallback","keepRenderedCapability","_dispatchEvent","_bindPdfLink","button","blobUrl","createObjectURL","viewerUrl","encodeURIComponent","_bindLink","render","attachments","names","item","removeNullCharacters","div","_appendAttachment","DEFAULT_FIELD_CONTENT","NON_METRIC_LOCALES","US_PAGE_NAMES","METRIC_PAGE_NAMES","isPortrait","pageNames","freezeFieldData","writable","configurable","currentPageNumber","pagesRotation","getPageSizeInches","fileSize","data","setDocument","setFileSize","_updateUI","content","_parseFileSize","kb","size_kb","size_b","size_mb","_parsePageSize","pageSizeInches","isPortraitOrientation","sizeInches","sizeMillimeters","pageName","getPageName","exactMillimeters","intMillimeters","_parseDate","dateToParse","year","month","day","hours","minutes","seconds","utRel","offsetHours","offsetMinutes","date","Date","dateString","timeString","time","_parseLinearization","isLinearized","MATCHES_COUNT_LIMIT","dispatchEvent","updateUIState","notFound","status","FindState","updateResultsCount","current","total","matchesCountMsg","findbarHeight","inputContainerHeight","FOUND","NOT_FOUND","WRAPPED","PENDING","FIND_TIMEOUT","CHARACTERS_TO_NORMALIZE","replace","executeCommand","pageIdx","matchIdx","_normalize","_prepareMatches","currentElem","matchesWithLength","nextElem","prevElem","isSubTerm","matches","matchesLength","_isEntireWord","startIdx","getCharacterType","endIdx","_calculatePhraseMatch","queryLen","pageContent","_calculateWordMatch","queryArray","subquery","subqueryLen","match","matchLength","skipped","_calculateMatch","pageMatchesCount","extractTextCapability","pdfPage","normalizeWhitespace","textItems","textContent","strBuf","j","jj","_updatePage","currentPageIndex","offset","numPageMatches","_matchesReady","numMatches","_advanceOffsetPage","found","_updateMatch","wrapped","previousPage","_onFindBarClose","matchesCount","_updateUIState","CharacterType","SPACE","ALPHA_LETTER","PUNCT","HAN_LETTER","KATAKANA_LETTER","HIRAGANA_LETTER","HALFWIDTH_KATAKANA_LETTER","THAI_LETTER","charCode","isAlphabeticalScript","isAscii","isAsciiSpace","isAsciiAlpha","isAsciiDigit","isThai","isHan","isKatakana","isHiragana","isHalfwidthKatakana","HASH_CHANGE_TIMEOUT","POSITION_UPDATED_THRESHOLD","UPDATE_VIEWAREA_TIMEOUT","unescape","initialize","reInitialized","parseCurrentHash","destination","JSON","push","namedDest","forceReplace","isDestArraysEqual","dest","_pushOrReplaceState","shouldReplace","newState","fingerprint","uid","temporary","_tryPushCurrentPosition","position","_isValidState","_updateInternalState","removeTemporary","_updateViewarea","_popState","newHash","hashChanged","waitOnEventOrTimeout","destHash","nameddest","second","isEntryEqual","firstDest","secondDest","setHistory","navigateTo","goToDestination","destRef","explicitDest","destArray","getDestinationHash","escape","str","getAnchorUrl","setHash","zoomArgs","zoomArg","zoomArgNumber","parseFloat","allowNegativeOffset","isValidExplicitDestination","executeNamedAction","cachePageRef","refStr","pageRef","_cachedPageNumber","destLength","allowNull","DEFAULT_TITLE","addLinkAttributes","newWindow","rel","_setStyles","styleStr","_addToggleButton","toggler","shouldShowAll","_toggleOutlineItem","togglers","root","show","outline","fragment","queue","hasAnyNesting","levelData","itemsDiv","DELAY_BEFORE_RESETTING_SWITCH_IN_PROGRESS","DELAY_BEFORE_HIDING_CONTROLS","ACTIVE_SELECTOR","CONTROLS_SELECTOR","MOUSE_SCROLL_COOLDOWN_TIME","PAGE_SWITCH_THRESHOLD","SWIPE_MIN_DISTANCE_THRESHOLD","SWIPE_ANGLE_THRESHOLD","Element","_mouseWheel","currentTime","storedTime","totalDelta","success","_mouseDown","isInternalLink","_touchSwipe","startX","startY","endX","endY","absAngle","SIDEBAR_WIDTH_VAR","SIDEBAR_MIN_WIDTH","SIDEBAR_RESIZING_CLASS","CSS","_updateWidth","maxWidth","_mouseMove","_mouseUp","updated","THUMBNAIL_SCROLL_MARGIN","THUMBNAIL_SELECTED_CLASS","watchScroll","getThumbnail","getVisibleElements","scrollThumbnailIntoView","prevThumbnailView","visibleThumbs","numVisibleThumbs","shouldScroll","scrollIntoView","PDFThumbnailView","viewport","firstPage","pageNum","thumbnail","defaultViewport","disableCanvasToImageConversion","setPageLabels","_ensurePdfPageLoaded","thumbView","MAX_NUM_SCALING_STEPS","THUMBNAIL_CANVAS_BORDER_WIDTH","THUMBNAIL_WIDTH","TempImageFactory","tempCanvasCache","getCanvas","tempCanvas","alpha","destroyCanvas","anchor","ring","borderAdjustment","setPdfPage","totalRotation","childNodes","update","scale","noCtxScale","_getPageDrawContext","canvas","outputScale","getOutputScale","className","image","renderCapability","finishRenderTask","renderTask","drawViewport","renderContinueCallback","renderContext","canvasContext","setImage","img","reducedWidth","reducedHeight","reducedImage","reducedImageCtx","setPageLabel","pageSpot","_scrollIntoView","pageDiv","ScrollMode","visiblePages","numVisiblePages","currentId","stillFullyVisible","DEFAULT_CACHE_SIZE","VERTICAL","HORIZONTAL","SpreadMode","ODD","EVEN","pageIdsToKeep","iMax","pagesToKeep","moveToEndOfArray","getPageView","_setCurrentPageNumber","resetCurrentPageView","val","pageLabel","pagesCapability","isOnePageRenderedResolved","onePageRenderedCapability","bindOnAfterAndBeforeDraw","textLayerFactory","annotationLayerFactory","getPagesLeft","_setScaleDispatchEvent","preset","presetValue","_setScaleUpdatePages","noScroll","newValue","isSameScale","_setScale","noPadding","hPadding","vPadding","pageWidthScale","pageHeightScale","horizontalScale","scrollPageIntoView","pageWidth","pageHeight","widthScale","heightScale","boundingRect","_resizeBuffer","suggestedCacheSize","_updateLocation","normalizedScaleValue","pdfOpenParams","currentPageView","topLeft","intLeft","intTop","containsElement","currentlyVisiblePages","scrollAhead","createTextLayerBuilder","enhanceTextSelection","createAnnotationLayerBuilder","isFirstPagePortrait","_updateScrollMode","_updateSpreadMode","pages","parity","spread","firstPageView","intent","dontFlip","AnnotationLayer","annotations","MAX_CANVAS_PIXELS","removeFromDOM","_resetZoomLayer","zoomLayerCanvas","keepZoomLayer","keepAnnotations","currentZoomLayerNode","currentAnnotationNode","isScalingRestricted","cancelRendering","renderingState","redrawAnnotations","relativeRotation","absRotation","scaleX","scaleY","textLayerViewport","textRelativeRotation","textAbsRotation","textLayerDiv","transX","transY","getPagePoint","canvasWrapper","textLayer","finishPaintTask","paintTask","resultPromise","readableStream","paintOnCanvas","onRenderContinue","cancel","isCanvasHidden","showCanvas","actualSizeViewport","pixelsInViewport","maxScale","sfx","approximateFraction","sfy","roundToDivide","transform","paintOnSvg","cancelled","ensureNotCancelled","svgGfx","svg","wrapper","EXPAND_DIVS_TIMEOUT","MATCH_SCROLL_OFFSET_TOP","MATCH_SCROLL_OFFSET_LEFT","endOfContent","numTextDivs","textLayerFrag","textContentStream","textDivs","textContentItemsStr","setTextContentStream","setTextContent","convertMatches","iIndex","end","ret","m","begin","divIdx","renderMatches","prevEnd","isSelectedPage","selectedMatchIdx","infinity","appendTextToDiv","span","i0","i1","isSelected","highlightSuffix","beginText","n0","n1","clearedUntilDivIdx","n","pageMatches","pageMatchesLength","expandDivsTimer","adjustTop","divBounds","eventName","close","eventDetails","lastPage","pageRotateCw","pageRotateCcw","setPageNumber","setPagesCount","_bindCursorToolsListener","buttons","_bindScrollModeListener","isScrollModeHorizontal","scrollModeChanged","_bindSpreadModeListener","spreadModeChanged","previousPageView","viewerNodes","scrolledDown","previousLocation","PAGE_NUMBER_LOADING_INDICATOR","SCALE_SELECT_CONTAINER_PADDING","SCALE_SELECT_PADDING","setPageScale","self","resetNumPages","pageScale","customScale","predefinedValueFound","option","updateLoadingIndicatorState","pageNumberInput","select","DEFAULT_VIEW_HISTORY_CACHE_SIZE","cacheSize","database","databaseStr","length","branch","localStorage","properties","GenericCom","GenericExternalServices","defaultPreferences","defaultValue","prefValue","valueType","defaultType","DISABLE_CREATE_OBJECT_URL","downloadUrl","createValidAbsoluteUrl","downloadData","webL10n","gL10nData","gTextData","gTextProp","gLanguage","gMacros","gReadyState","gAsyncResourceLoading","script","l10nId","l10nArgs","evtObject","onSuccess","onFailure","baseURL","text","dictionary","reBlank","reComment","reSection","reImport","reSplit","entries","rawText","currentLang","genericLang","lang","skipLang","loadImport","tmp","evalString","xhrLoadText","parseRawLines","parsedPropertiesCallback","parseProperties","langLinks","langCount","dict","defaultLocale","anyCaseLang","fireL10nReadyEvent","onResourceLoaded","gResourceCount","link","parseResource","resource","locales2rules","list","start","pluralRules","isBetween","getPluralRules","rv","substIndexes","substArguments","reIndex","reMatch","macroName","paramName","macro","reArgs","getL10nAttributes","getL10nData","getChildElementCount","children","l","textNode","count","getTranslatableChildren","elementCount","translateElement","getData","getText","getLanguage","setLanguage","loadLocale","getDirection","rtlList","shortCode","translate","getReadyState","ready","activeService","scratchCanvas","PRINT_RESOLUTION","PRINT_UNITS","PDFPrintService","layout","body","hasEqualPageSizes","pageSize","destroy","ensureOverlay","renderPages","pageCount","renderNextPage","renderProgress","renderPage","useRenderedPage","printItem","performPrint","throwIfInactive","activeServiceOnEntry","progressContainer","progressBar","progressPerc","hasAttachEvent","stopPropagationIfNeeded","overlayPromise"],"mappings":"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","file":"viewer.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","/* Copyright 2016 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* globals chrome */\n\n'use strict';\n\nif (typeof PDFJSDev !== 'undefined' && PDFJSDev.test('CHROME')) {\n  var defaultUrl; // eslint-disable-line no-var\n\n  (function rewriteUrlClosure() {\n    // Run this code outside DOMContentLoaded to make sure that the URL\n    // is rewritten as soon as possible.\n    let queryString = document.location.search.slice(1);\n    let m = /(^|&)file=([^&]*)/.exec(queryString);\n    defaultUrl = m ? decodeURIComponent(m[2]) : '';\n\n    // Example: chrome-extension://.../http://example.com/file.pdf\n    let humanReadableUrl = '/' + defaultUrl + location.hash;\n    history.replaceState(history.state, '', humanReadableUrl);\n    if (top === window) {\n      chrome.runtime.sendMessage('showPageAction');\n    }\n  })();\n}\n\nlet pdfjsWebApp, pdfjsWebAppOptions;\nif (typeof PDFJSDev !== 'undefined' && PDFJSDev.test('PRODUCTION')) {\n  pdfjsWebApp = require('./app.js');\n  pdfjsWebAppOptions = require('./app_options.js');\n}\n\nif (typeof PDFJSDev !== 'undefined' && PDFJSDev.test('FIREFOX || MOZCENTRAL')) {\n  require('./firefoxcom.js');\n  require('./firefox_print_service.js');\n}\nif (typeof PDFJSDev !== 'undefined' && PDFJSDev.test('GENERIC')) {\n  require('./genericcom.js');\n}\nif (typeof PDFJSDev !== 'undefined' && PDFJSDev.test('CHROME')) {\n  require('./chromecom.js');\n}\nif (typeof PDFJSDev !== 'undefined' && PDFJSDev.test('CHROME || GENERIC')) {\n  require('./pdf_print_service.js');\n}\n\nfunction getViewerConfiguration() {\n  return {\n    appContainer: document.body,\n    mainContainer: document.getElementById('viewerContainer'),\n    viewerContainer: document.getElementById('viewer'),\n    eventBus: null, // using global event bus with DOM events\n    toolbar: {\n      container: document.getElementById('toolbarViewer'),\n      numPages: document.getElementById('numPages'),\n      pageNumber: document.getElementById('pageNumber'),\n      scaleSelectContainer: document.getElementById('scaleSelectContainer'),\n      scaleSelect: document.getElementById('scaleSelect'),\n      customScaleOption: document.getElementById('customScaleOption'),\n      previous: document.getElementById('previous'),\n      next: document.getElementById('next'),\n      zoomIn: document.getElementById('zoomIn'),\n      zoomOut: document.getElementById('zoomOut'),\n      viewFind: document.getElementById('viewFind'),\n      openFile: document.getElementById('openFile'),\n      print: document.getElementById('print'),\n      presentationModeButton: document.getElementById('presentationMode'),\n      download: document.getElementById('download'),\n      viewBookmark: document.getElementById('viewBookmark'),\n    },\n    secondaryToolbar: {\n      toolbar: document.getElementById('secondaryToolbar'),\n      toggleButton: document.getElementById('secondaryToolbarToggle'),\n      toolbarButtonContainer:\n        document.getElementById('secondaryToolbarButtonContainer'),\n      presentationModeButton:\n        document.getElementById('secondaryPresentationMode'),\n      openFileButton: document.getElementById('secondaryOpenFile'),\n      printButton: document.getElementById('secondaryPrint'),\n      downloadButton: document.getElementById('secondaryDownload'),\n      viewBookmarkButton: document.getElementById('secondaryViewBookmark'),\n      firstPageButton: document.getElementById('firstPage'),\n      lastPageButton: document.getElementById('lastPage'),\n      pageRotateCwButton: document.getElementById('pageRotateCw'),\n      pageRotateCcwButton: document.getElementById('pageRotateCcw'),\n      cursorSelectToolButton: document.getElementById('cursorSelectTool'),\n      cursorHandToolButton: document.getElementById('cursorHandTool'),\n      scrollVerticalButton: document.getElementById('scrollVertical'),\n      scrollHorizontalButton: document.getElementById('scrollHorizontal'),\n      scrollWrappedButton: document.getElementById('scrollWrapped'),\n      spreadNoneButton: document.getElementById('spreadNone'),\n      spreadOddButton: document.getElementById('spreadOdd'),\n      spreadEvenButton: document.getElementById('spreadEven'),\n      documentPropertiesButton: document.getElementById('documentProperties'),\n    },\n    fullscreen: {\n      contextFirstPage: document.getElementById('contextFirstPage'),\n      contextLastPage: document.getElementById('contextLastPage'),\n      contextPageRotateCw: document.getElementById('contextPageRotateCw'),\n      contextPageRotateCcw: document.getElementById('contextPageRotateCcw'),\n    },\n    sidebar: {\n      // Divs (and sidebar button)\n      outerContainer: document.getElementById('outerContainer'),\n      viewerContainer: document.getElementById('viewerContainer'),\n      toggleButton: document.getElementById('sidebarToggle'),\n      // Buttons\n      thumbnailButton: document.getElementById('viewThumbnail'),\n      outlineButton: document.getElementById('viewOutline'),\n      attachmentsButton: document.getElementById('viewAttachments'),\n      // Views\n      thumbnailView: document.getElementById('thumbnailView'),\n      outlineView: document.getElementById('outlineView'),\n      attachmentsView: document.getElementById('attachmentsView'),\n    },\n    sidebarResizer: {\n      outerContainer: document.getElementById('outerContainer'),\n      resizer: document.getElementById('sidebarResizer'),\n    },\n    findBar: {\n      bar: document.getElementById('findbar'),\n      toggleButton: document.getElementById('viewFind'),\n      findField: document.getElementById('findInput'),\n      highlightAllCheckbox: document.getElementById('findHighlightAll'),\n      caseSensitiveCheckbox: document.getElementById('findMatchCase'),\n      entireWordCheckbox: document.getElementById('findEntireWord'),\n      findMsg: document.getElementById('findMsg'),\n      findResultsCount: document.getElementById('findResultsCount'),\n      findPreviousButton: document.getElementById('findPrevious'),\n      findNextButton: document.getElementById('findNext'),\n    },\n    passwordOverlay: {\n      overlayName: 'passwordOverlay',\n      container: document.getElementById('passwordOverlay'),\n      label: document.getElementById('passwordText'),\n      input: document.getElementById('password'),\n      submitButton: document.getElementById('passwordSubmit'),\n      cancelButton: document.getElementById('passwordCancel'),\n    },\n    documentProperties: {\n      overlayName: 'documentPropertiesOverlay',\n      container: document.getElementById('documentPropertiesOverlay'),\n      closeButton: document.getElementById('documentPropertiesClose'),\n      fields: {\n        'fileName': document.getElementById('fileNameField'),\n        'fileSize': document.getElementById('fileSizeField'),\n        'title': document.getElementById('titleField'),\n        'author': document.getElementById('authorField'),\n        'subject': document.getElementById('subjectField'),\n        'keywords': document.getElementById('keywordsField'),\n        'creationDate': document.getElementById('creationDateField'),\n        'modificationDate': document.getElementById('modificationDateField'),\n        'creator': document.getElementById('creatorField'),\n        'producer': document.getElementById('producerField'),\n        'version': document.getElementById('versionField'),\n        'pageCount': document.getElementById('pageCountField'),\n        'pageSize': document.getElementById('pageSizeField'),\n        'linearized': document.getElementById('linearizedField'),\n      },\n    },\n    errorWrapper: {\n      container: document.getElementById('errorWrapper'),\n      errorMessage: document.getElementById('errorMessage'),\n      closeButton: document.getElementById('errorClose'),\n      errorMoreInfo: document.getElementById('errorMoreInfo'),\n      moreInfoButton: document.getElementById('errorShowMore'),\n      lessInfoButton: document.getElementById('errorShowLess'),\n    },\n    printContainer: document.getElementById('printContainer'),\n    openFileInputName: 'fileInput',\n    debuggerScriptPath: './debugger.js',\n  };\n}\n\nfunction webViewerLoad() {\n  let config = getViewerConfiguration();\n  if (typeof PDFJSDev === 'undefined' || !PDFJSDev.test('PRODUCTION')) {\n    Promise.all([\n      SystemJS.import('pdfjs-web/app'),\n      SystemJS.import('pdfjs-web/app_options'),\n      SystemJS.import('pdfjs-web/genericcom'),\n      SystemJS.import('pdfjs-web/pdf_print_service'),\n    ]).then(function([app, appOptions, ...otherModules]) {\n      window.PDFViewerApplication = app.PDFViewerApplication;\n      window.PDFViewerApplicationOptions = appOptions.AppOptions;\n      app.PDFViewerApplication.run(config);\n    });\n  } else {\n    if (typeof PDFJSDev !== 'undefined' && PDFJSDev.test('CHROME')) {\n      pdfjsWebAppOptions.AppOptions.set('defaultUrl', defaultUrl);\n    }\n\n    window.PDFViewerApplication = pdfjsWebApp.PDFViewerApplication;\n    window.PDFViewerApplicationOptions = pdfjsWebAppOptions.AppOptions;\n    pdfjsWebApp.PDFViewerApplication.run(config);\n  }\n}\n\nif (document.readyState === 'interactive' ||\n    document.readyState === 'complete') {\n  webViewerLoad();\n} else {\n  document.addEventListener('DOMContentLoaded', webViewerLoad, true);\n}\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* globals PDFBug, Stats */\n\nimport {\n  animationStarted, DEFAULT_SCALE_VALUE, getPDFFileNameFromURL, isValidRotation,\n  MAX_SCALE, MIN_SCALE, noContextMenuHandler, normalizeWheelEventDelta,\n  parseQueryString, PresentationModeState, ProgressBar, RendererType,\n  TextLayerMode\n} from './ui_utils';\nimport {\n  build, createObjectURL, getDocument, getFilenameFromUrl, GlobalWorkerOptions,\n  InvalidPDFException, LinkTarget, loadScript, MissingPDFException, OPS,\n  PDFWorker, shadow, UnexpectedResponseException, UNSUPPORTED_FEATURES, URL,\n  version\n} from 'pdfjs-lib';\nimport { CursorTool, PDFCursorTools } from './pdf_cursor_tools';\nimport { PDFRenderingQueue, RenderingStates } from './pdf_rendering_queue';\nimport { PDFSidebar, SidebarView } from './pdf_sidebar';\nimport { AppOptions } from './app_options';\nimport { getGlobalEventBus } from './dom_events';\nimport { OverlayManager } from './overlay_manager';\nimport { PasswordPrompt } from './password_prompt';\nimport { PDFAttachmentViewer } from './pdf_attachment_viewer';\nimport { PDFDocumentProperties } from './pdf_document_properties';\nimport { PDFFindBar } from './pdf_find_bar';\nimport { PDFFindController } from './pdf_find_controller';\nimport { PDFHistory } from './pdf_history';\nimport { PDFLinkService } from './pdf_link_service';\nimport { PDFOutlineViewer } from './pdf_outline_viewer';\nimport { PDFPresentationMode } from './pdf_presentation_mode';\nimport { PDFSidebarResizer } from './pdf_sidebar_resizer';\nimport { PDFThumbnailViewer } from './pdf_thumbnail_viewer';\nimport { PDFViewer } from './pdf_viewer';\nimport { SecondaryToolbar } from './secondary_toolbar';\nimport { Toolbar } from './toolbar';\nimport { ViewHistory } from './view_history';\n\nconst DEFAULT_SCALE_DELTA = 1.1;\nconst DISABLE_AUTO_FETCH_LOADING_BAR_TIMEOUT = 5000; // ms\nconst FORCE_PAGES_LOADED_TIMEOUT = 10000; // ms\n\nconst DefaultExternalServices = {\n  updateFindControlState(data) {},\n  updateFindMatchesCount(data) {},\n  initPassiveLoading(callbacks) {},\n  fallback(data, callback) {},\n  reportTelemetry(data) {},\n  createDownloadManager(options) {\n    throw new Error('Not implemented: createDownloadManager');\n  },\n  createPreferences() {\n    throw new Error('Not implemented: createPreferences');\n  },\n  createL10n(options) {\n    throw new Error('Not implemented: createL10n');\n  },\n  supportsIntegratedFind: false,\n  supportsDocumentFonts: true,\n  supportsDocumentColors: true,\n  supportedMouseWheelZoomModifierKeys: {\n    ctrlKey: true,\n    metaKey: true,\n  },\n};\n\nlet PDFViewerApplication = {\n  initialBookmark: document.location.hash.substring(1),\n  initialized: false,\n  fellback: false,\n  appConfig: null,\n  pdfDocument: null,\n  pdfLoadingTask: null,\n  printService: null,\n  /** @type {PDFViewer} */\n  pdfViewer: null,\n  /** @type {PDFThumbnailViewer} */\n  pdfThumbnailViewer: null,\n  /** @type {PDFRenderingQueue} */\n  pdfRenderingQueue: null,\n  /** @type {PDFPresentationMode} */\n  pdfPresentationMode: null,\n  /** @type {PDFDocumentProperties} */\n  pdfDocumentProperties: null,\n  /** @type {PDFLinkService} */\n  pdfLinkService: null,\n  /** @type {PDFHistory} */\n  pdfHistory: null,\n  /** @type {PDFSidebar} */\n  pdfSidebar: null,\n  /** @type {PDFSidebarResizer} */\n  pdfSidebarResizer: null,\n  /** @type {PDFOutlineViewer} */\n  pdfOutlineViewer: null,\n  /** @type {PDFAttachmentViewer} */\n  pdfAttachmentViewer: null,\n  /** @type {PDFCursorTools} */\n  pdfCursorTools: null,\n  /** @type {ViewHistory} */\n  store: null,\n  /** @type {DownloadManager} */\n  downloadManager: null,\n  /** @type {OverlayManager} */\n  overlayManager: null,\n  /** @type {Preferences} */\n  preferences: null,\n  /** @type {Toolbar} */\n  toolbar: null,\n  /** @type {SecondaryToolbar} */\n  secondaryToolbar: null,\n  /** @type {EventBus} */\n  eventBus: null,\n  /** @type {IL10n} */\n  l10n: null,\n  isInitialViewSet: false,\n  downloadComplete: false,\n  isViewerEmbedded: (window.parent !== window),\n  url: '',\n  baseUrl: '',\n  externalServices: DefaultExternalServices,\n  _boundEvents: {},\n  contentDispositionFilename: null,\n\n  // Called once when the document is loaded.\n  async initialize(appConfig) {\n    this.preferences = this.externalServices.createPreferences();\n    this.appConfig = appConfig;\n\n    await this._readPreferences();\n    await this._parseHashParameters();\n    await this._initializeL10n();\n\n    if (this.isViewerEmbedded &&\n        AppOptions.get('externalLinkTarget') === LinkTarget.NONE) {\n      // Prevent external links from \"replacing\" the viewer,\n      // when it's embedded in e.g. an <iframe> or an <object>.\n      AppOptions.set('externalLinkTarget', LinkTarget.TOP);\n    }\n    await this._initializeViewerComponents();\n\n    // Bind the various event handlers *after* the viewer has been\n    // initialized, to prevent errors if an event arrives too soon.\n    this.bindEvents();\n    this.bindWindowEvents();\n\n    // We can start UI localization now.\n    let appContainer = appConfig.appContainer || document.documentElement;\n    this.l10n.translate(appContainer).then(() => {\n      // Dispatch the 'localized' event on the `eventBus` once the viewer\n      // has been fully initialized and translated.\n      this.eventBus.dispatch('localized', { source: this, });\n    });\n\n    this.initialized = true;\n  },\n\n  /**\n   * @private\n   */\n  async _readPreferences() {\n    // A subset of the Preferences that `AppOptions`, for compatibility reasons,\n    // is allowed to override if the `AppOptions` values matches the ones below.\n    const OVERRIDES = {\n      disableFontFace: true,\n      disableRange: true,\n      disableStream: true,\n      textLayerMode: TextLayerMode.DISABLE,\n    };\n\n    try {\n      const prefs = await this.preferences.getAll();\n      for (let name in prefs) {\n        if ((name in OVERRIDES) && AppOptions.get(name) === OVERRIDES[name]) {\n          continue;\n        }\n        AppOptions.set(name, prefs[name]);\n      }\n    } catch (reason) { }\n  },\n\n  /**\n   * @private\n   */\n  async _parseHashParameters() {\n    if (typeof PDFJSDev !== 'undefined' && PDFJSDev.test('PRODUCTION') &&\n        !AppOptions.get('pdfBugEnabled')) {\n      return;\n    }\n    const waitOn = [];\n\n    // Special debugging flags in the hash section of the URL.\n    let hash = document.location.hash.substring(1);\n    let hashParams = parseQueryString(hash);\n\n    if ('disableworker' in hashParams &&\n        hashParams['disableworker'] === 'true') {\n      waitOn.push(loadFakeWorker());\n    }\n    if ('disablerange' in hashParams) {\n      AppOptions.set('disableRange', hashParams['disablerange'] === 'true');\n    }\n    if ('disablestream' in hashParams) {\n      AppOptions.set('disableStream', hashParams['disablestream'] === 'true');\n    }\n    if ('disableautofetch' in hashParams) {\n      AppOptions.set('disableAutoFetch',\n                     hashParams['disableautofetch'] === 'true');\n    }\n    if ('disablefontface' in hashParams) {\n      AppOptions.set('disableFontFace',\n                     hashParams['disablefontface'] === 'true');\n    }\n    if ('disablehistory' in hashParams) {\n      AppOptions.set('disableHistory', hashParams['disablehistory'] === 'true');\n    }\n    if ('webgl' in hashParams) {\n      AppOptions.set('enableWebGL', hashParams['webgl'] === 'true');\n    }\n    if ('useonlycsszoom' in hashParams) {\n      AppOptions.set('useOnlyCssZoom', hashParams['useonlycsszoom'] === 'true');\n    }\n    if ('verbosity' in hashParams) {\n      AppOptions.set('verbosity', hashParams['verbosity'] | 0);\n    }\n    if ((typeof PDFJSDev === 'undefined' || !PDFJSDev.test('PRODUCTION')) &&\n        hashParams['disablebcmaps'] === 'true') {\n      AppOptions.set('cMapUrl', '../external/cmaps/');\n      AppOptions.set('cMapPacked', false);\n    }\n    if ('textlayer' in hashParams) {\n      switch (hashParams['textlayer']) {\n        case 'off':\n          AppOptions.set('textLayerMode', TextLayerMode.DISABLE);\n          break;\n        case 'visible':\n        case 'shadow':\n        case 'hover':\n          let viewer = this.appConfig.viewerContainer;\n          viewer.classList.add('textLayer-' + hashParams['textlayer']);\n          break;\n      }\n    }\n    if ('pdfbug' in hashParams) {\n      AppOptions.set('pdfBug', true);\n      let enabled = hashParams['pdfbug'].split(',');\n      waitOn.push(loadAndEnablePDFBug(enabled));\n    }\n    // It is not possible to change locale for the (various) extension builds.\n    if ((typeof PDFJSDev === 'undefined' ||\n         PDFJSDev.test('!PRODUCTION || GENERIC')) && 'locale' in hashParams) {\n      AppOptions.set('locale', hashParams['locale']);\n    }\n\n    return Promise.all(waitOn).catch((reason) => {\n      console.error(`_parseHashParameters: \"${reason.message}\".`);\n    });\n  },\n\n  /**\n   * @private\n   */\n  async _initializeL10n() {\n    this.l10n = this.externalServices.createL10n({\n      locale: AppOptions.get('locale'),\n    });\n    const dir = await this.l10n.getDirection();\n    document.getElementsByTagName('html')[0].dir = dir;\n  },\n\n  /**\n   * @private\n   */\n  async _initializeViewerComponents() {\n    const appConfig = this.appConfig;\n\n    this.overlayManager = new OverlayManager();\n\n    const dispatchToDOM = AppOptions.get('eventBusDispatchToDOM');\n    const eventBus = appConfig.eventBus || getGlobalEventBus(dispatchToDOM);\n    this.eventBus = eventBus;\n\n    let pdfRenderingQueue = new PDFRenderingQueue();\n    pdfRenderingQueue.onIdle = this.cleanup.bind(this);\n    this.pdfRenderingQueue = pdfRenderingQueue;\n\n    let pdfLinkService = new PDFLinkService({\n      eventBus,\n      externalLinkTarget: AppOptions.get('externalLinkTarget'),\n      externalLinkRel: AppOptions.get('externalLinkRel'),\n    });\n    this.pdfLinkService = pdfLinkService;\n\n    let downloadManager = this.externalServices.createDownloadManager({\n      disableCreateObjectURL: AppOptions.get('disableCreateObjectURL'),\n    });\n    this.downloadManager = downloadManager;\n\n    const findController = new PDFFindController({\n      linkService: pdfLinkService,\n      eventBus,\n    });\n    this.findController = findController;\n\n    const container = appConfig.mainContainer;\n    const viewer = appConfig.viewerContainer;\n    this.pdfViewer = new PDFViewer({\n      container,\n      viewer,\n      eventBus,\n      renderingQueue: pdfRenderingQueue,\n      linkService: pdfLinkService,\n      downloadManager,\n      findController,\n      renderer: AppOptions.get('renderer'),\n      enableWebGL: AppOptions.get('enableWebGL'),\n      l10n: this.l10n,\n      textLayerMode: AppOptions.get('textLayerMode'),\n      imageResourcesPath: AppOptions.get('imageResourcesPath'),\n      renderInteractiveForms: AppOptions.get('renderInteractiveForms'),\n      enablePrintAutoRotate: AppOptions.get('enablePrintAutoRotate'),\n      useOnlyCssZoom: AppOptions.get('useOnlyCssZoom'),\n      maxCanvasPixels: AppOptions.get('maxCanvasPixels'),\n    });\n    pdfRenderingQueue.setViewer(this.pdfViewer);\n    pdfLinkService.setViewer(this.pdfViewer);\n\n    let thumbnailContainer = appConfig.sidebar.thumbnailView;\n    this.pdfThumbnailViewer = new PDFThumbnailViewer({\n      container: thumbnailContainer,\n      renderingQueue: pdfRenderingQueue,\n      linkService: pdfLinkService,\n      l10n: this.l10n,\n    });\n    pdfRenderingQueue.setThumbnailViewer(this.pdfThumbnailViewer);\n\n    this.pdfHistory = new PDFHistory({\n      linkService: pdfLinkService,\n      eventBus,\n    });\n    pdfLinkService.setHistory(this.pdfHistory);\n\n    this.findBar = new PDFFindBar(appConfig.findBar, eventBus, this.l10n);\n\n    this.pdfDocumentProperties =\n      new PDFDocumentProperties(appConfig.documentProperties,\n                                this.overlayManager, eventBus, this.l10n);\n\n    this.pdfCursorTools = new PDFCursorTools({\n      container,\n      eventBus,\n      cursorToolOnLoad: AppOptions.get('cursorToolOnLoad'),\n    });\n\n    this.toolbar = new Toolbar(appConfig.toolbar, eventBus, this.l10n);\n\n    this.secondaryToolbar =\n      new SecondaryToolbar(appConfig.secondaryToolbar, container, eventBus);\n\n    if (this.supportsFullscreen) {\n      this.pdfPresentationMode = new PDFPresentationMode({\n        container,\n        viewer,\n        pdfViewer: this.pdfViewer,\n        eventBus,\n        contextMenuItems: appConfig.fullscreen,\n      });\n    }\n\n    this.passwordPrompt = new PasswordPrompt(appConfig.passwordOverlay,\n                                             this.overlayManager, this.l10n);\n\n    this.pdfOutlineViewer = new PDFOutlineViewer({\n      container: appConfig.sidebar.outlineView,\n      eventBus,\n      linkService: pdfLinkService,\n    });\n\n    this.pdfAttachmentViewer = new PDFAttachmentViewer({\n      container: appConfig.sidebar.attachmentsView,\n      eventBus,\n      downloadManager,\n    });\n\n    // TODO: improve `PDFSidebar` constructor parameter passing\n    let sidebarConfig = Object.create(appConfig.sidebar);\n    sidebarConfig.pdfViewer = this.pdfViewer;\n    sidebarConfig.pdfThumbnailViewer = this.pdfThumbnailViewer;\n    this.pdfSidebar = new PDFSidebar(sidebarConfig, eventBus, this.l10n);\n    this.pdfSidebar.onToggled = this.forceRendering.bind(this);\n\n    this.pdfSidebarResizer = new PDFSidebarResizer(appConfig.sidebarResizer,\n                                                   eventBus, this.l10n);\n  },\n\n  run(config) {\n    this.initialize(config).then(webViewerInitialized);\n  },\n\n  zoomIn(ticks) {\n    let newScale = this.pdfViewer.currentScale;\n    do {\n      newScale = (newScale * DEFAULT_SCALE_DELTA).toFixed(2);\n      newScale = Math.ceil(newScale * 10) / 10;\n      newScale = Math.min(MAX_SCALE, newScale);\n    } while (--ticks > 0 && newScale < MAX_SCALE);\n    this.pdfViewer.currentScaleValue = newScale;\n  },\n\n  zoomOut(ticks) {\n    let newScale = this.pdfViewer.currentScale;\n    do {\n      newScale = (newScale / DEFAULT_SCALE_DELTA).toFixed(2);\n      newScale = Math.floor(newScale * 10) / 10;\n      newScale = Math.max(MIN_SCALE, newScale);\n    } while (--ticks > 0 && newScale > MIN_SCALE);\n    this.pdfViewer.currentScaleValue = newScale;\n  },\n\n  get pagesCount() {\n    return this.pdfDocument ? this.pdfDocument.numPages : 0;\n  },\n\n  set page(val) {\n    this.pdfViewer.currentPageNumber = val;\n  },\n\n  get page() {\n    return this.pdfViewer.currentPageNumber;\n  },\n\n  get printing() {\n    return !!this.printService;\n  },\n\n  get supportsPrinting() {\n    return PDFPrintServiceFactory.instance.supportsPrinting;\n  },\n\n  get supportsFullscreen() {\n    let support;\n    if (typeof PDFJSDev !== 'undefined' && PDFJSDev.test('MOZCENTRAL')) {\n      support = document.fullscreenEnabled === true ||\n                document.mozFullScreenEnabled === true;\n    } else {\n      let doc = document.documentElement;\n      support = !!(doc.requestFullscreen || doc.mozRequestFullScreen ||\n                   doc.webkitRequestFullScreen || doc.msRequestFullscreen);\n\n      if (document.fullscreenEnabled === false ||\n          document.mozFullScreenEnabled === false ||\n          document.webkitFullscreenEnabled === false ||\n          document.msFullscreenEnabled === false) {\n        support = false;\n      }\n    }\n    return shadow(this, 'supportsFullscreen', support);\n  },\n\n  get supportsIntegratedFind() {\n    return this.externalServices.supportsIntegratedFind;\n  },\n\n  get supportsDocumentFonts() {\n    return this.externalServices.supportsDocumentFonts;\n  },\n\n  get supportsDocumentColors() {\n    return this.externalServices.supportsDocumentColors;\n  },\n\n  get loadingBar() {\n    let bar = new ProgressBar('#loadingBar');\n    return shadow(this, 'loadingBar', bar);\n  },\n\n  get supportedMouseWheelZoomModifierKeys() {\n    return this.externalServices.supportedMouseWheelZoomModifierKeys;\n  },\n\n  initPassiveLoading() {\n    if (typeof PDFJSDev === 'undefined' ||\n        !PDFJSDev.test('FIREFOX || MOZCENTRAL || CHROME')) {\n      throw new Error('Not implemented: initPassiveLoading');\n    }\n    this.externalServices.initPassiveLoading({\n      onOpenWithTransport(url, length, transport) {\n        PDFViewerApplication.open(url, { range: transport, });\n\n        if (length) {\n          PDFViewerApplication.pdfDocumentProperties.setFileSize(length);\n        }\n      },\n      onOpenWithData(data) {\n        PDFViewerApplication.open(data);\n      },\n      onOpenWithURL(url, length, originalUrl) {\n        let file = url, args = null;\n        if (length !== undefined) {\n          args = { length, };\n        }\n        if (originalUrl !== undefined) {\n          file = { url, originalUrl, };\n        }\n        PDFViewerApplication.open(file, args);\n      },\n      onError(err) {\n        PDFViewerApplication.l10n.get('loading_error', null,\n            'An error occurred while loading the PDF.').then((msg) => {\n          PDFViewerApplication.error(msg, err);\n        });\n      },\n      onProgress(loaded, total) {\n        PDFViewerApplication.progress(loaded / total);\n      },\n    });\n  },\n\n  setTitleUsingUrl(url = '') {\n    this.url = url;\n    this.baseUrl = url.split('#')[0];\n    let title = getPDFFileNameFromURL(url, '');\n    if (!title) {\n      try {\n        title = decodeURIComponent(getFilenameFromUrl(url)) || url;\n      } catch (ex) {\n        // decodeURIComponent may throw URIError,\n        // fall back to using the unprocessed url in that case\n        title = url;\n      }\n    }\n    this.setTitle(title);\n  },\n\n  setTitle(title) {\n    if (this.isViewerEmbedded) {\n      // Embedded PDF viewers should not be changing their parent page's title.\n      return;\n    }\n    document.title = title;\n  },\n\n  /**\n   * Closes opened PDF document.\n   * @returns {Promise} - Returns the promise, which is resolved when all\n   *                      destruction is completed.\n   */\n  async close() {\n    let errorWrapper = this.appConfig.errorWrapper.container;\n    errorWrapper.setAttribute('hidden', 'true');\n\n    if (!this.pdfLoadingTask) {\n      return;\n    }\n\n    let promise = this.pdfLoadingTask.destroy();\n    this.pdfLoadingTask = null;\n\n    if (this.pdfDocument) {\n      this.pdfDocument = null;\n\n      this.pdfThumbnailViewer.setDocument(null);\n      this.pdfViewer.setDocument(null);\n      this.pdfLinkService.setDocument(null);\n      this.pdfDocumentProperties.setDocument(null);\n    }\n    this.store = null;\n    this.isInitialViewSet = false;\n    this.downloadComplete = false;\n    this.url = '';\n    this.baseUrl = '';\n    this.contentDispositionFilename = null;\n\n    this.pdfSidebar.reset();\n    this.pdfOutlineViewer.reset();\n    this.pdfAttachmentViewer.reset();\n\n    this.findBar.reset();\n    this.toolbar.reset();\n    this.secondaryToolbar.reset();\n\n    if (typeof PDFBug !== 'undefined') {\n      PDFBug.cleanup();\n    }\n    return promise;\n  },\n\n  /**\n   * Opens PDF document specified by URL or array with additional arguments.\n   * @param {string|TypedArray|ArrayBuffer} file - PDF location or binary data.\n   * @param {Object} args - (optional) Additional arguments for the getDocument\n   *                        call, e.g. HTTP headers ('httpHeaders') or\n   *                        alternative data transport ('range').\n   * @returns {Promise} - Returns the promise, which is resolved when document\n   *                      is opened.\n   */\n  async open(file, args) {\n    if (this.pdfLoadingTask) {\n      // We need to destroy already opened document.\n      await this.close();\n    }\n    // Set the necessary global worker parameters, using the available options.\n    const workerParameters = AppOptions.getAll('worker');\n    for (let key in workerParameters) {\n      GlobalWorkerOptions[key] = workerParameters[key];\n    }\n\n    let parameters = Object.create(null);\n    if (typeof file === 'string') { // URL\n      this.setTitleUsingUrl(file);\n      parameters.url = file;\n    } else if (file && 'byteLength' in file) { // ArrayBuffer\n      parameters.data = file;\n    } else if (file.url && file.originalUrl) {\n      this.setTitleUsingUrl(file.originalUrl);\n      parameters.url = file.url;\n    }\n    if (typeof PDFJSDev === 'undefined' || !PDFJSDev.test('PRODUCTION')) {\n      parameters.docBaseUrl = document.URL.split('#')[0];\n    } else if (typeof PDFJSDev !== 'undefined' &&\n               PDFJSDev.test('FIREFOX || MOZCENTRAL || CHROME')) {\n      parameters.docBaseUrl = this.baseUrl;\n    }\n    // Set the necessary API parameters, using the available options.\n    const apiParameters = AppOptions.getAll('api');\n    for (let key in apiParameters) {\n      parameters[key] = apiParameters[key];\n    }\n\n    if (args) {\n      for (let prop in args) {\n        if (prop === 'length') {\n          this.pdfDocumentProperties.setFileSize(args[prop]);\n        }\n        parameters[prop] = args[prop];\n      }\n    }\n\n    let loadingTask = getDocument(parameters);\n    this.pdfLoadingTask = loadingTask;\n\n    loadingTask.onPassword = (updateCallback, reason) => {\n      this.passwordPrompt.setUpdateCallback(updateCallback, reason);\n      this.passwordPrompt.open();\n    };\n\n    loadingTask.onProgress = ({ loaded, total, }) => {\n      this.progress(loaded / total);\n    };\n\n    // Listen for unsupported features to trigger the fallback UI.\n    loadingTask.onUnsupportedFeature = this.fallback.bind(this);\n\n    return loadingTask.promise.then((pdfDocument) => {\n      this.load(pdfDocument);\n    }, (exception) => {\n      if (loadingTask !== this.pdfLoadingTask) {\n        return; // Ignore errors for previously opened PDF files.\n      }\n\n      let message = exception && exception.message;\n      let loadingErrorMessage;\n      if (exception instanceof InvalidPDFException) {\n        // change error message also for other builds\n        loadingErrorMessage = this.l10n.get('invalid_file_error', null,\n                                            'Invalid or corrupted PDF file.');\n      } else if (exception instanceof MissingPDFException) {\n        // special message for missing PDF's\n        loadingErrorMessage = this.l10n.get('missing_file_error', null,\n                                            'Missing PDF file.');\n      } else if (exception instanceof UnexpectedResponseException) {\n        loadingErrorMessage = this.l10n.get('unexpected_response_error', null,\n                                            'Unexpected server response.');\n      } else {\n        loadingErrorMessage = this.l10n.get('loading_error', null,\n          'An error occurred while loading the PDF.');\n      }\n\n      return loadingErrorMessage.then((msg) => {\n        this.error(msg, { message, });\n        throw new Error(msg);\n      });\n    });\n  },\n\n  download() {\n    function downloadByUrl() {\n      downloadManager.downloadUrl(url, filename);\n    }\n\n    let url = this.baseUrl;\n    // Use this.url instead of this.baseUrl to perform filename detection based\n    // on the reference fragment as ultimate fallback if needed.\n    let filename = this.contentDispositionFilename ||\n      getPDFFileNameFromURL(this.url);\n    let downloadManager = this.downloadManager;\n    downloadManager.onerror = (err) => {\n      // This error won't really be helpful because it's likely the\n      // fallback won't work either (or is already open).\n      this.error(`PDF failed to download: ${err}`);\n    };\n\n    // When the PDF document isn't ready, or the PDF file is still downloading,\n    // simply download using the URL.\n    if (!this.pdfDocument || !this.downloadComplete) {\n      downloadByUrl();\n      return;\n    }\n\n    this.pdfDocument.getData().then(function(data) {\n      const blob = new Blob([data], { type: 'application/pdf', });\n      downloadManager.download(blob, url, filename);\n    }).catch(downloadByUrl); // Error occurred, try downloading with the URL.\n  },\n\n  fallback(featureId) {\n    if (typeof PDFJSDev !== 'undefined' &&\n        PDFJSDev.test('FIREFOX || MOZCENTRAL')) {\n      // Only trigger the fallback once so we don't spam the user with messages\n      // for one PDF.\n      if (this.fellback) {\n        return;\n      }\n      this.fellback = true;\n      this.externalServices.fallback({\n        featureId,\n        url: this.baseUrl,\n      }, function response(download) {\n        if (!download) {\n          return;\n        }\n        PDFViewerApplication.download();\n      });\n    }\n  },\n\n  /**\n   * Show the error box.\n   * @param {String} message A message that is human readable.\n   * @param {Object} moreInfo (optional) Further information about the error\n   *                            that is more technical.  Should have a 'message'\n   *                            and optionally a 'stack' property.\n   */\n  error(message, moreInfo) {\n    let moreInfoText = [this.l10n.get('error_version_info',\n      { version: version || '?', build: build || '?', },\n      'PDF.js v{{version}} (build: {{build}})')];\n    if (moreInfo) {\n      moreInfoText.push(\n        this.l10n.get('error_message', { message: moreInfo.message, },\n                      'Message: {{message}}'));\n      if (moreInfo.stack) {\n        moreInfoText.push(\n          this.l10n.get('error_stack', { stack: moreInfo.stack, },\n                        'Stack: {{stack}}'));\n      } else {\n        if (moreInfo.filename) {\n          moreInfoText.push(\n            this.l10n.get('error_file', { file: moreInfo.filename, },\n                          'File: {{file}}'));\n        }\n        if (moreInfo.lineNumber) {\n          moreInfoText.push(\n            this.l10n.get('error_line', { line: moreInfo.lineNumber, },\n                          'Line: {{line}}'));\n        }\n      }\n    }\n\n    if (typeof PDFJSDev === 'undefined' ||\n        !PDFJSDev.test('FIREFOX || MOZCENTRAL')) {\n      let errorWrapperConfig = this.appConfig.errorWrapper;\n      let errorWrapper = errorWrapperConfig.container;\n      errorWrapper.removeAttribute('hidden');\n\n      let errorMessage = errorWrapperConfig.errorMessage;\n      errorMessage.textContent = message;\n\n      let closeButton = errorWrapperConfig.closeButton;\n      closeButton.onclick = function() {\n        errorWrapper.setAttribute('hidden', 'true');\n      };\n\n      let errorMoreInfo = errorWrapperConfig.errorMoreInfo;\n      let moreInfoButton = errorWrapperConfig.moreInfoButton;\n      let lessInfoButton = errorWrapperConfig.lessInfoButton;\n      moreInfoButton.onclick = function() {\n        errorMoreInfo.removeAttribute('hidden');\n        moreInfoButton.setAttribute('hidden', 'true');\n        lessInfoButton.removeAttribute('hidden');\n        errorMoreInfo.style.height = errorMoreInfo.scrollHeight + 'px';\n      };\n      lessInfoButton.onclick = function() {\n        errorMoreInfo.setAttribute('hidden', 'true');\n        moreInfoButton.removeAttribute('hidden');\n        lessInfoButton.setAttribute('hidden', 'true');\n      };\n      moreInfoButton.oncontextmenu = noContextMenuHandler;\n      lessInfoButton.oncontextmenu = noContextMenuHandler;\n      closeButton.oncontextmenu = noContextMenuHandler;\n      moreInfoButton.removeAttribute('hidden');\n      lessInfoButton.setAttribute('hidden', 'true');\n      Promise.all(moreInfoText).then((parts) => {\n        errorMoreInfo.value = parts.join('\\n');\n      });\n    } else {\n      Promise.all(moreInfoText).then((parts) => {\n        console.error(message + '\\n' + parts.join('\\n'));\n      });\n      this.fallback();\n    }\n  },\n\n  progress(level) {\n    if (this.downloadComplete) {\n      // Don't accidentally show the loading bar again when the entire file has\n      // already been fetched (only an issue when disableAutoFetch is enabled).\n      return;\n    }\n    let percent = Math.round(level * 100);\n    // When we transition from full request to range requests, it's possible\n    // that we discard some of the loaded data. This can cause the loading\n    // bar to move backwards. So prevent this by only updating the bar if it\n    // increases.\n    if (percent > this.loadingBar.percent || isNaN(percent)) {\n      this.loadingBar.percent = percent;\n\n      // When disableAutoFetch is enabled, it's not uncommon for the entire file\n      // to never be fetched (depends on e.g. the file structure). In this case\n      // the loading bar will not be completely filled, nor will it be hidden.\n      // To prevent displaying a partially filled loading bar permanently, we\n      // hide it when no data has been loaded during a certain amount of time.\n      const disableAutoFetch = this.pdfDocument ?\n        this.pdfDocument.loadingParams['disableAutoFetch'] :\n        AppOptions.get('disableAutoFetch');\n\n      if (disableAutoFetch && percent) {\n        if (this.disableAutoFetchLoadingBarTimeout) {\n          clearTimeout(this.disableAutoFetchLoadingBarTimeout);\n          this.disableAutoFetchLoadingBarTimeout = null;\n        }\n        this.loadingBar.show();\n\n        this.disableAutoFetchLoadingBarTimeout = setTimeout(() => {\n          this.loadingBar.hide();\n          this.disableAutoFetchLoadingBarTimeout = null;\n        }, DISABLE_AUTO_FETCH_LOADING_BAR_TIMEOUT);\n      }\n    }\n  },\n\n  load(pdfDocument) {\n    this.pdfDocument = pdfDocument;\n\n    pdfDocument.getDownloadInfo().then(() => {\n      this.downloadComplete = true;\n      this.loadingBar.hide();\n\n      firstPagePromise.then(() => {\n        this.eventBus.dispatch('documentloaded', { source: this, });\n        // TODO: Remove the following event, i.e. 'documentload',\n        //       once the mozilla-central tests have been updated.\n        this.eventBus.dispatch('documentload', { source: this, });\n      });\n    });\n\n    // Since the `setInitialView` call below depends on this being resolved,\n    // fetch it early to avoid delaying initial rendering of the PDF document.\n    let pageModePromise = pdfDocument.getPageMode().catch(\n      function() { /* Avoid breaking initial rendering; ignoring errors. */ });\n\n    this.toolbar.setPagesCount(pdfDocument.numPages, false);\n    this.secondaryToolbar.setPagesCount(pdfDocument.numPages);\n\n    const store = this.store = new ViewHistory(pdfDocument.fingerprint);\n\n    let baseDocumentUrl;\n    if (typeof PDFJSDev === 'undefined' || PDFJSDev.test('GENERIC')) {\n      baseDocumentUrl = null;\n    } else if (PDFJSDev.test('FIREFOX || MOZCENTRAL')) {\n      baseDocumentUrl = this.baseUrl;\n    } else if (PDFJSDev.test('CHROME')) {\n      baseDocumentUrl = location.href.split('#')[0];\n    }\n    this.pdfLinkService.setDocument(pdfDocument, baseDocumentUrl);\n    this.pdfDocumentProperties.setDocument(pdfDocument, this.url);\n\n    let pdfViewer = this.pdfViewer;\n    pdfViewer.setDocument(pdfDocument);\n    let firstPagePromise = pdfViewer.firstPagePromise;\n    let pagesPromise = pdfViewer.pagesPromise;\n    let onePageRendered = pdfViewer.onePageRendered;\n\n    let pdfThumbnailViewer = this.pdfThumbnailViewer;\n    pdfThumbnailViewer.setDocument(pdfDocument);\n\n    firstPagePromise.then((pdfPage) => {\n      this.loadingBar.setWidth(this.appConfig.viewerContainer);\n\n      if (!AppOptions.get('disableHistory') && !this.isViewerEmbedded) {\n        // The browsing history is only enabled when the viewer is standalone,\n        // i.e. not when it is embedded in a web page.\n        let resetHistory = !AppOptions.get('showPreviousViewOnLoad');\n        this.pdfHistory.initialize(pdfDocument.fingerprint, resetHistory);\n\n        if (this.pdfHistory.initialBookmark) {\n          this.initialBookmark = this.pdfHistory.initialBookmark;\n\n          this.initialRotation = this.pdfHistory.initialRotation;\n        }\n      }\n\n      let storePromise = store.getMultiple({\n        page: null,\n        zoom: DEFAULT_SCALE_VALUE,\n        scrollLeft: '0',\n        scrollTop: '0',\n        rotation: null,\n        sidebarView: SidebarView.NONE,\n        scrollMode: null,\n        spreadMode: null,\n      }).catch(() => { /* Unable to read from storage; ignoring errors. */ });\n\n      Promise.all([\n        storePromise, pageModePromise,\n      ]).then(async ([values = {}, pageMode]) => {\n        const initialBookmark = this.initialBookmark;\n        // Initialize the default values, from user preferences.\n        const zoom = AppOptions.get('defaultZoomValue');\n        let hash = zoom ? `zoom=${zoom}` : null;\n\n        let rotation = null;\n        let sidebarView = AppOptions.get('sidebarViewOnLoad');\n        let scrollMode = AppOptions.get('scrollModeOnLoad');\n        let spreadMode = AppOptions.get('spreadModeOnLoad');\n\n        if (values.page && AppOptions.get('showPreviousViewOnLoad')) {\n          hash = 'page=' + values.page + '&zoom=' + (zoom || values.zoom) +\n            ',' + values.scrollLeft + ',' + values.scrollTop;\n\n          rotation = parseInt(values.rotation, 10);\n          sidebarView = sidebarView || (values.sidebarView | 0);\n          scrollMode = scrollMode || (values.scrollMode | 0);\n          spreadMode = spreadMode || (values.spreadMode | 0);\n        }\n        if (pageMode && !AppOptions.get('disablePageMode')) {\n          // Always let the user preference/history take precedence.\n          sidebarView = sidebarView || apiPageModeToSidebarView(pageMode);\n        }\n\n        this.setInitialView(hash, {\n          rotation, sidebarView, scrollMode, spreadMode,\n        });\n        this.eventBus.dispatch('documentinit', { source: this, });\n        // Make all navigation keys work on document load,\n        // unless the viewer is embedded in a web page.\n        if (!this.isViewerEmbedded) {\n          pdfViewer.focus();\n        }\n\n        // For documents with different page sizes, once all pages are resolved,\n        // ensure that the correct location becomes visible on load.\n        // (To reduce the risk, in very large and/or slow loading documents,\n        //  that the location changes *after* the user has started interacting\n        //  with the viewer, wait for either `pagesPromise` or a timeout.)\n        await Promise.race([\n          pagesPromise,\n          new Promise((resolve) => {\n            setTimeout(resolve, FORCE_PAGES_LOADED_TIMEOUT);\n          }),\n        ]);\n        if (!initialBookmark && !hash) {\n          return;\n        }\n        if (pdfViewer.hasEqualPageSizes) {\n          return;\n        }\n        this.initialBookmark = initialBookmark;\n\n        // eslint-disable-next-line no-self-assign\n        pdfViewer.currentScaleValue = pdfViewer.currentScaleValue;\n        // Re-apply the initial document location.\n        this.setInitialView(hash);\n      }).then(function() {\n        // At this point, rendering of the initial page(s) should always have\n        // started (and may even have completed).\n        // To prevent any future issues, e.g. the document being completely\n        // blank on load, always trigger rendering here.\n        pdfViewer.update();\n      });\n    });\n\n    pdfDocument.getPageLabels().then((labels) => {\n      if (!labels || AppOptions.get('disablePageLabels')) {\n        return;\n      }\n      let i = 0, numLabels = labels.length;\n      if (numLabels !== this.pagesCount) {\n        console.error('The number of Page Labels does not match ' +\n                      'the number of pages in the document.');\n        return;\n      }\n      // Ignore page labels that correspond to standard page numbering.\n      while (i < numLabels && labels[i] === (i + 1).toString()) {\n        i++;\n      }\n      if (i === numLabels) {\n        return;\n      }\n\n      pdfViewer.setPageLabels(labels);\n      pdfThumbnailViewer.setPageLabels(labels);\n\n      // Changing toolbar page display to use labels and we need to set\n      // the label of the current page.\n      this.toolbar.setPagesCount(pdfDocument.numPages, true);\n      this.toolbar.setPageNumber(pdfViewer.currentPageNumber,\n                                 pdfViewer.currentPageLabel);\n    });\n\n    pagesPromise.then(() => {\n      if (!this.supportsPrinting) {\n        return;\n      }\n      pdfDocument.getJavaScript().then((javaScript) => {\n        if (!javaScript) {\n          return;\n        }\n        javaScript.some((js) => {\n          if (!js) { // Don't warn/fallback for empty JavaScript actions.\n            return false;\n          }\n          console.warn('Warning: JavaScript is not supported');\n          this.fallback(UNSUPPORTED_FEATURES.javaScript);\n          return true;\n        });\n\n        // Hack to support auto printing.\n        let regex = /\\bprint\\s*\\(/;\n        for (let i = 0, ii = javaScript.length; i < ii; i++) {\n          let js = javaScript[i];\n          if (js && regex.test(js)) {\n            setTimeout(function() {\n              window.print();\n            });\n            return;\n          }\n        }\n      });\n    });\n\n    Promise.all([onePageRendered, animationStarted]).then(() => {\n      pdfDocument.getOutline().then((outline) => {\n        this.pdfOutlineViewer.render({ outline, });\n      });\n      pdfDocument.getAttachments().then((attachments) => {\n        this.pdfAttachmentViewer.render({ attachments, });\n      });\n    });\n\n    pdfDocument.getMetadata().then(\n        ({ info, metadata, contentDispositionFilename, }) => {\n      this.documentInfo = info;\n      this.metadata = metadata;\n      this.contentDispositionFilename = contentDispositionFilename;\n\n      // Provides some basic debug information\n      console.log('PDF ' + pdfDocument.fingerprint + ' [' +\n                  info.PDFFormatVersion + ' ' + (info.Producer || '-').trim() +\n                  ' / ' + (info.Creator || '-').trim() + ']' +\n                  ' (PDF.js: ' + (version || '-') +\n                  (AppOptions.get('enableWebGL') ? ' [WebGL]' : '') + ')');\n\n      let pdfTitle;\n      if (metadata && metadata.has('dc:title')) {\n        let title = metadata.get('dc:title');\n        // Ghostscript sometimes return 'Untitled', sets the title to 'Untitled'\n        if (title !== 'Untitled') {\n          pdfTitle = title;\n        }\n      }\n\n      if (!pdfTitle && info && info['Title']) {\n        pdfTitle = info['Title'];\n      }\n\n      if (pdfTitle) {\n        this.setTitle(\n          `${pdfTitle} - ${contentDispositionFilename || document.title}`);\n      } else if (contentDispositionFilename) {\n        this.setTitle(contentDispositionFilename);\n      }\n\n      if (info.IsAcroFormPresent) {\n        console.warn('Warning: AcroForm/XFA is not supported');\n        this.fallback(UNSUPPORTED_FEATURES.forms);\n      }\n\n      if (typeof PDFJSDev !== 'undefined' &&\n          PDFJSDev.test('FIREFOX || MOZCENTRAL')) {\n        let versionId = String(info.PDFFormatVersion).slice(-1) | 0;\n        let generatorId = 0;\n        const KNOWN_GENERATORS = [\n          'acrobat distiller', 'acrobat pdfwriter', 'adobe livecycle',\n          'adobe pdf library', 'adobe photoshop', 'ghostscript', 'tcpdf',\n          'cairo', 'dvipdfm', 'dvips', 'pdftex', 'pdfkit', 'itext', 'prince',\n          'quarkxpress', 'mac os x', 'microsoft', 'openoffice', 'oracle',\n          'luradocument', 'pdf-xchange', 'antenna house', 'aspose.cells', 'fpdf'\n        ];\n        if (info.Producer) {\n          KNOWN_GENERATORS.some(function (generator, s, i) {\n            if (!generator.includes(s)) {\n              return false;\n            }\n            generatorId = i + 1;\n            return true;\n          }.bind(null, info.Producer.toLowerCase()));\n        }\n        let formType = !info.IsAcroFormPresent ? null : info.IsXFAPresent ?\n                      'xfa' : 'acroform';\n        this.externalServices.reportTelemetry({\n          type: 'documentInfo',\n          version: versionId,\n          generator: generatorId,\n          formType,\n        });\n      }\n    });\n  },\n\n  setInitialView(storedHash, { rotation, sidebarView,\n                               scrollMode, spreadMode, } = {}) {\n    let setRotation = (angle) => {\n      if (isValidRotation(angle)) {\n        this.pdfViewer.pagesRotation = angle;\n      }\n    };\n    let setViewerModes = (scroll, spread) => {\n      if (Number.isInteger(scroll)) {\n        this.pdfViewer.scrollMode = scroll;\n      }\n      if (Number.isInteger(spread)) {\n        this.pdfViewer.spreadMode = spread;\n      }\n    };\n\n    // Putting these before isInitialViewSet = true prevents these values from\n    // being stored in the document history (and overriding any future changes\n    // made to the corresponding global preferences), just this once.\n    setViewerModes(scrollMode, spreadMode);\n\n    this.isInitialViewSet = true;\n    this.pdfSidebar.setInitialView(sidebarView);\n\n    if (this.initialBookmark) {\n      setRotation(this.initialRotation);\n      delete this.initialRotation;\n\n      this.pdfLinkService.setHash(this.initialBookmark);\n      this.initialBookmark = null;\n    } else if (storedHash) {\n      setRotation(rotation);\n\n      this.pdfLinkService.setHash(storedHash);\n    }\n\n    // Ensure that the correct page number is displayed in the UI,\n    // even if the active page didn't change during document load.\n    this.toolbar.setPageNumber(this.pdfViewer.currentPageNumber,\n                               this.pdfViewer.currentPageLabel);\n    this.secondaryToolbar.setPageNumber(this.pdfViewer.currentPageNumber);\n\n    if (!this.pdfViewer.currentScaleValue) {\n      // Scale was not initialized: invalid bookmark or scale was not specified.\n      // Setting the default one.\n      this.pdfViewer.currentScaleValue = DEFAULT_SCALE_VALUE;\n    }\n  },\n\n  cleanup() {\n    if (!this.pdfDocument) {\n      return; // run cleanup when document is loaded\n    }\n    this.pdfViewer.cleanup();\n    this.pdfThumbnailViewer.cleanup();\n\n    // We don't want to remove fonts used by active page SVGs.\n    if (this.pdfViewer.renderer !== RendererType.SVG) {\n      this.pdfDocument.cleanup();\n    }\n  },\n\n  forceRendering() {\n    this.pdfRenderingQueue.printing = this.printing;\n    this.pdfRenderingQueue.isThumbnailViewEnabled =\n      this.pdfSidebar.isThumbnailViewVisible;\n    this.pdfRenderingQueue.renderHighestPriority();\n  },\n\n  beforePrint() {\n    if (this.printService) {\n      // There is no way to suppress beforePrint/afterPrint events,\n      // but PDFPrintService may generate double events -- this will ignore\n      // the second event that will be coming from native window.print().\n      return;\n    }\n\n    if (!this.supportsPrinting) {\n      this.l10n.get('printing_not_supported', null,\n                    'Warning: Printing is not fully supported by ' +\n                    'this browser.').then((printMessage) => {\n        this.error(printMessage);\n      });\n      return;\n    }\n\n    // The beforePrint is a sync method and we need to know layout before\n    // returning from this method. Ensure that we can get sizes of the pages.\n    if (!this.pdfViewer.pageViewsReady) {\n      this.l10n.get('printing_not_ready', null,\n                    'Warning: The PDF is not fully loaded for printing.').\n          then((notReadyMessage) => {\n        window.alert(notReadyMessage);\n      });\n      return;\n    }\n\n    let pagesOverview = this.pdfViewer.getPagesOverview();\n    let printContainer = this.appConfig.printContainer;\n    let printService = PDFPrintServiceFactory.instance.createPrintService(\n      this.pdfDocument, pagesOverview, printContainer, this.l10n);\n    this.printService = printService;\n    this.forceRendering();\n\n    printService.layout();\n\n    if (typeof PDFJSDev !== 'undefined' &&\n        PDFJSDev.test('FIREFOX || MOZCENTRAL')) {\n      this.externalServices.reportTelemetry({\n        type: 'print',\n      });\n    }\n  },\n\n  afterPrint: function pdfViewSetupAfterPrint() {\n    if (this.printService) {\n      this.printService.destroy();\n      this.printService = null;\n    }\n    this.forceRendering();\n  },\n\n  rotatePages(delta) {\n    if (!this.pdfDocument) {\n      return;\n    }\n    let newRotation = (this.pdfViewer.pagesRotation + 360 + delta) % 360;\n    this.pdfViewer.pagesRotation = newRotation;\n    // Note that the thumbnail viewer is updated, and rendering is triggered,\n    // in the 'rotationchanging' event handler.\n  },\n\n  requestPresentationMode() {\n    if (!this.pdfPresentationMode) {\n      return;\n    }\n    this.pdfPresentationMode.request();\n  },\n\n  bindEvents() {\n    let { eventBus, _boundEvents, } = this;\n\n    _boundEvents.beforePrint = this.beforePrint.bind(this);\n    _boundEvents.afterPrint = this.afterPrint.bind(this);\n\n    eventBus.on('resize', webViewerResize);\n    eventBus.on('hashchange', webViewerHashchange);\n    eventBus.on('beforeprint', _boundEvents.beforePrint);\n    eventBus.on('afterprint', _boundEvents.afterPrint);\n    eventBus.on('pagerendered', webViewerPageRendered);\n    eventBus.on('textlayerrendered', webViewerTextLayerRendered);\n    eventBus.on('updateviewarea', webViewerUpdateViewarea);\n    eventBus.on('pagechanging', webViewerPageChanging);\n    eventBus.on('scalechanging', webViewerScaleChanging);\n    eventBus.on('rotationchanging', webViewerRotationChanging);\n    eventBus.on('sidebarviewchanged', webViewerSidebarViewChanged);\n    eventBus.on('pagemode', webViewerPageMode);\n    eventBus.on('namedaction', webViewerNamedAction);\n    eventBus.on('presentationmodechanged', webViewerPresentationModeChanged);\n    eventBus.on('presentationmode', webViewerPresentationMode);\n    eventBus.on('openfile', webViewerOpenFile);\n    eventBus.on('print', webViewerPrint);\n    eventBus.on('download', webViewerDownload);\n    eventBus.on('firstpage', webViewerFirstPage);\n    eventBus.on('lastpage', webViewerLastPage);\n    eventBus.on('nextpage', webViewerNextPage);\n    eventBus.on('previouspage', webViewerPreviousPage);\n    eventBus.on('zoomin', webViewerZoomIn);\n    eventBus.on('zoomout', webViewerZoomOut);\n    eventBus.on('pagenumberchanged', webViewerPageNumberChanged);\n    eventBus.on('scalechanged', webViewerScaleChanged);\n    eventBus.on('rotatecw', webViewerRotateCw);\n    eventBus.on('rotateccw', webViewerRotateCcw);\n    eventBus.on('switchscrollmode', webViewerSwitchScrollMode);\n    eventBus.on('scrollmodechanged', webViewerScrollModeChanged);\n    eventBus.on('switchspreadmode', webViewerSwitchSpreadMode);\n    eventBus.on('spreadmodechanged', webViewerSpreadModeChanged);\n    eventBus.on('documentproperties', webViewerDocumentProperties);\n    eventBus.on('find', webViewerFind);\n    eventBus.on('findfromurlhash', webViewerFindFromUrlHash);\n    eventBus.on('updatefindmatchescount', webViewerUpdateFindMatchesCount);\n    eventBus.on('updatefindcontrolstate', webViewerUpdateFindControlState);\n    if (typeof PDFJSDev === 'undefined' || PDFJSDev.test('GENERIC')) {\n      eventBus.on('fileinputchange', webViewerFileInputChange);\n    }\n  },\n\n  bindWindowEvents() {\n    let { eventBus, _boundEvents, } = this;\n\n    _boundEvents.windowResize = () => {\n      eventBus.dispatch('resize', { source: window, });\n    };\n    _boundEvents.windowHashChange = () => {\n      eventBus.dispatch('hashchange', {\n        source: window,\n        hash: document.location.hash.substring(1),\n      });\n    };\n    _boundEvents.windowBeforePrint = () => {\n      eventBus.dispatch('beforeprint', { source: window, });\n    };\n    _boundEvents.windowAfterPrint = () => {\n      eventBus.dispatch('afterprint', { source: window, });\n    };\n\n    window.addEventListener('wheel', webViewerWheel);\n    window.addEventListener('click', webViewerClick);\n    window.addEventListener('keydown', webViewerKeyDown);\n    window.addEventListener('resize', _boundEvents.windowResize);\n    window.addEventListener('hashchange', _boundEvents.windowHashChange);\n    window.addEventListener('beforeprint', _boundEvents.windowBeforePrint);\n    window.addEventListener('afterprint', _boundEvents.windowAfterPrint);\n  },\n\n  unbindEvents() {\n    let { eventBus, _boundEvents, } = this;\n\n    eventBus.off('resize', webViewerResize);\n    eventBus.off('hashchange', webViewerHashchange);\n    eventBus.off('beforeprint', _boundEvents.beforePrint);\n    eventBus.off('afterprint', _boundEvents.afterPrint);\n    eventBus.off('pagerendered', webViewerPageRendered);\n    eventBus.off('textlayerrendered', webViewerTextLayerRendered);\n    eventBus.off('updateviewarea', webViewerUpdateViewarea);\n    eventBus.off('pagechanging', webViewerPageChanging);\n    eventBus.off('scalechanging', webViewerScaleChanging);\n    eventBus.off('rotationchanging', webViewerRotationChanging);\n    eventBus.off('sidebarviewchanged', webViewerSidebarViewChanged);\n    eventBus.off('pagemode', webViewerPageMode);\n    eventBus.off('namedaction', webViewerNamedAction);\n    eventBus.off('presentationmodechanged', webViewerPresentationModeChanged);\n    eventBus.off('presentationmode', webViewerPresentationMode);\n    eventBus.off('openfile', webViewerOpenFile);\n    eventBus.off('print', webViewerPrint);\n    eventBus.off('download', webViewerDownload);\n    eventBus.off('firstpage', webViewerFirstPage);\n    eventBus.off('lastpage', webViewerLastPage);\n    eventBus.off('nextpage', webViewerNextPage);\n    eventBus.off('previouspage', webViewerPreviousPage);\n    eventBus.off('zoomin', webViewerZoomIn);\n    eventBus.off('zoomout', webViewerZoomOut);\n    eventBus.off('pagenumberchanged', webViewerPageNumberChanged);\n    eventBus.off('scalechanged', webViewerScaleChanged);\n    eventBus.off('rotatecw', webViewerRotateCw);\n    eventBus.off('rotateccw', webViewerRotateCcw);\n    eventBus.off('switchscrollmode', webViewerSwitchScrollMode);\n    eventBus.off('scrollmodechanged', webViewerScrollModeChanged);\n    eventBus.off('switchspreadmode', webViewerSwitchSpreadMode);\n    eventBus.off('spreadmodechanged', webViewerSpreadModeChanged);\n    eventBus.off('documentproperties', webViewerDocumentProperties);\n    eventBus.off('find', webViewerFind);\n    eventBus.off('findfromurlhash', webViewerFindFromUrlHash);\n    eventBus.off('updatefindmatchescount', webViewerUpdateFindMatchesCount);\n    eventBus.off('updatefindcontrolstate', webViewerUpdateFindControlState);\n    if (typeof PDFJSDev === 'undefined' || PDFJSDev.test('GENERIC')) {\n      eventBus.off('fileinputchange', webViewerFileInputChange);\n    }\n\n    _boundEvents.beforePrint = null;\n    _boundEvents.afterPrint = null;\n  },\n\n  unbindWindowEvents() {\n    let { _boundEvents, } = this;\n\n    window.removeEventListener('wheel', webViewerWheel);\n    window.removeEventListener('click', webViewerClick);\n    window.removeEventListener('keydown', webViewerKeyDown);\n    window.removeEventListener('resize', _boundEvents.windowResize);\n    window.removeEventListener('hashchange', _boundEvents.windowHashChange);\n    window.removeEventListener('beforeprint', _boundEvents.windowBeforePrint);\n    window.removeEventListener('afterprint', _boundEvents.windowAfterPrint);\n\n    _boundEvents.windowResize = null;\n    _boundEvents.windowHashChange = null;\n    _boundEvents.windowBeforePrint = null;\n    _boundEvents.windowAfterPrint = null;\n  },\n};\n\nlet validateFileURL;\nif (typeof PDFJSDev === 'undefined' || PDFJSDev.test('GENERIC')) {\n  const HOSTED_VIEWER_ORIGINS = ['null',\n    'http://mozilla.github.io', 'https://mozilla.github.io'];\n  validateFileURL = function validateFileURL(file) {\n    if (file === undefined) {\n      return;\n    }\n    try {\n      let viewerOrigin = new URL(window.location.href).origin || 'null';\n      if (HOSTED_VIEWER_ORIGINS.includes(viewerOrigin)) {\n        // Hosted or local viewer, allow for any file locations\n        return;\n      }\n      let { origin, protocol, } = new URL(file, window.location.href);\n      // Removing of the following line will not guarantee that the viewer will\n      // start accepting URLs from foreign origin -- CORS headers on the remote\n      // server must be properly configured.\n      // IE10 / IE11 does not include an origin in `blob:`-URLs. So don't block\n      // any blob:-URL. The browser's same-origin policy will block requests to\n      // blob:-URLs from other origins, so this is safe.\n      if (origin !== viewerOrigin && protocol !== 'blob:') {\n        throw new Error('file origin does not match viewer\\'s');\n      }\n    } catch (ex) {\n      let message = ex && ex.message;\n      PDFViewerApplication.l10n.get('loading_error', null,\n          'An error occurred while loading the PDF.').\n          then((loadingErrorMessage) => {\n        PDFViewerApplication.error(loadingErrorMessage, { message, });\n      });\n      throw ex;\n    }\n  };\n}\n\nfunction loadFakeWorker() {\n  if (!GlobalWorkerOptions.workerSrc) {\n    GlobalWorkerOptions.workerSrc = AppOptions.get('workerSrc');\n  }\n  if (typeof PDFJSDev === 'undefined' || !PDFJSDev.test('PRODUCTION')) {\n    return new Promise(function(resolve, reject) {\n      if (typeof SystemJS === 'object') {\n        SystemJS.import('pdfjs/core/worker').then((worker) => {\n          window.pdfjsWorker = worker;\n          resolve();\n        }).catch(reject);\n      } else if (typeof require === 'function') {\n        try {\n          window.pdfjsWorker = require('../src/core/worker.js');\n          resolve();\n        } catch (ex) {\n          reject(ex);\n        }\n      } else {\n        reject(new Error(\n          'SystemJS or CommonJS must be used to load fake worker.'));\n      }\n    });\n  }\n  return loadScript(PDFWorker.getWorkerSrc());\n}\n\nfunction loadAndEnablePDFBug(enabledTabs) {\n  let appConfig = PDFViewerApplication.appConfig;\n  return loadScript(appConfig.debuggerScriptPath).then(function() {\n    PDFBug.enable(enabledTabs);\n    PDFBug.init({\n      OPS,\n      createObjectURL,\n    }, appConfig.mainContainer);\n  });\n}\n\nfunction webViewerInitialized() {\n  let appConfig = PDFViewerApplication.appConfig;\n  let file;\n  if (typeof PDFJSDev === 'undefined' || PDFJSDev.test('GENERIC')) {\n    let queryString = document.location.search.substring(1);\n    let params = parseQueryString(queryString);\n    file = 'file' in params ? params.file : AppOptions.get('defaultUrl');\n    validateFileURL(file);\n  } else if (PDFJSDev.test('FIREFOX || MOZCENTRAL')) {\n    file = window.location.href.split('#')[0];\n  } else if (PDFJSDev.test('CHROME')) {\n    file = AppOptions.get('defaultUrl');\n  }\n\n  if (typeof PDFJSDev === 'undefined' || PDFJSDev.test('GENERIC')) {\n    let fileInput = document.createElement('input');\n    fileInput.id = appConfig.openFileInputName;\n    fileInput.className = 'fileInput';\n    fileInput.setAttribute('type', 'file');\n    fileInput.oncontextmenu = noContextMenuHandler;\n    document.body.appendChild(fileInput);\n\n    if (!window.File || !window.FileReader ||\n        !window.FileList || !window.Blob) {\n      appConfig.toolbar.openFile.setAttribute('hidden', 'true');\n      appConfig.secondaryToolbar.openFileButton.setAttribute('hidden', 'true');\n    } else {\n      fileInput.value = null;\n    }\n\n    fileInput.addEventListener('change', function(evt) {\n      let files = evt.target.files;\n      if (!files || files.length === 0) {\n        return;\n      }\n      PDFViewerApplication.eventBus.dispatch('fileinputchange', {\n        source: this,\n        fileInput: evt.target,\n      });\n    });\n\n    // Enable draging-and-dropping a new PDF file onto the viewerContainer.\n    appConfig.mainContainer.addEventListener('dragover', function(evt) {\n      evt.preventDefault();\n\n      evt.dataTransfer.dropEffect = 'move';\n    });\n    appConfig.mainContainer.addEventListener('drop', function(evt) {\n      evt.preventDefault();\n\n      const files = evt.dataTransfer.files;\n      if (!files || files.length === 0) {\n        return;\n      }\n      PDFViewerApplication.eventBus.dispatch('fileinputchange', {\n        source: this,\n        fileInput: evt.dataTransfer,\n      });\n    });\n  } else {\n    appConfig.toolbar.openFile.setAttribute('hidden', 'true');\n    appConfig.secondaryToolbar.openFileButton.setAttribute('hidden', 'true');\n  }\n\n  if (typeof PDFJSDev !== 'undefined' &&\n      PDFJSDev.test('FIREFOX || MOZCENTRAL') &&\n      !PDFViewerApplication.supportsDocumentFonts) {\n    AppOptions.set('disableFontFace', true);\n    PDFViewerApplication.l10n.get('web_fonts_disabled', null,\n      'Web fonts are disabled: unable to use embedded PDF fonts.').\n        then((msg) => {\n      console.warn(msg);\n    });\n  }\n\n  if (!PDFViewerApplication.supportsPrinting) {\n    appConfig.toolbar.print.classList.add('hidden');\n    appConfig.secondaryToolbar.printButton.classList.add('hidden');\n  }\n\n  if (!PDFViewerApplication.supportsFullscreen) {\n    appConfig.toolbar.presentationModeButton.classList.add('hidden');\n    appConfig.secondaryToolbar.presentationModeButton.classList.add('hidden');\n  }\n\n  if (PDFViewerApplication.supportsIntegratedFind) {\n    appConfig.toolbar.viewFind.classList.add('hidden');\n  }\n\n  appConfig.mainContainer.addEventListener('transitionend', function(evt) {\n    if (evt.target === /* mainContainer */ this) {\n      PDFViewerApplication.eventBus.dispatch('resize', { source: this, });\n    }\n  }, true);\n\n  appConfig.sidebar.toggleButton.addEventListener('click', function() {\n    PDFViewerApplication.pdfSidebar.toggle();\n  });\n\n  try {\n    webViewerOpenFileViaURL(file);\n  } catch (reason) {\n    PDFViewerApplication.l10n.get('loading_error', null,\n        'An error occurred while loading the PDF.').then((msg) => {\n      PDFViewerApplication.error(msg, reason);\n    });\n  }\n}\n\nlet webViewerOpenFileViaURL;\nif (typeof PDFJSDev === 'undefined' || PDFJSDev.test('GENERIC')) {\n  webViewerOpenFileViaURL = function webViewerOpenFileViaURL(file) {\n    if (file && file.lastIndexOf('file:', 0) === 0) {\n      // file:-scheme. Load the contents in the main thread because QtWebKit\n      // cannot load file:-URLs in a Web Worker. file:-URLs are usually loaded\n      // very quickly, so there is no need to set up progress event listeners.\n      PDFViewerApplication.setTitleUsingUrl(file);\n      let xhr = new XMLHttpRequest();\n      xhr.onload = function() {\n        PDFViewerApplication.open(new Uint8Array(xhr.response));\n      };\n      try {\n        xhr.open('GET', file);\n        xhr.responseType = 'arraybuffer';\n        xhr.send();\n      } catch (ex) {\n        throw ex;\n      }\n      return;\n    }\n\n    if (file) {\n      PDFViewerApplication.open(file);\n    }\n  };\n} else if (PDFJSDev.test('FIREFOX || MOZCENTRAL || CHROME')) {\n  webViewerOpenFileViaURL = function webViewerOpenFileViaURL(file) {\n    PDFViewerApplication.setTitleUsingUrl(file);\n    PDFViewerApplication.initPassiveLoading();\n  };\n} else {\n  webViewerOpenFileViaURL = function webViewerOpenFileViaURL(file) {\n    if (file) {\n      throw new Error('Not implemented: webViewerOpenFileViaURL');\n    }\n  };\n}\n\nfunction webViewerPageRendered(evt) {\n  let pageNumber = evt.pageNumber;\n  let pageIndex = pageNumber - 1;\n  let pageView = PDFViewerApplication.pdfViewer.getPageView(pageIndex);\n\n  // If the page is still visible when it has finished rendering,\n  // ensure that the page number input loading indicator is hidden.\n  if (pageNumber === PDFViewerApplication.page) {\n    PDFViewerApplication.toolbar.updateLoadingIndicatorState(false);\n  }\n\n  // Prevent errors in the edge-case where the PDF document is removed *before*\n  // the 'pagerendered' event handler is invoked.\n  if (!pageView) {\n    return;\n  }\n\n  // Use the rendered page to set the corresponding thumbnail image.\n  if (PDFViewerApplication.pdfSidebar.isThumbnailViewVisible) {\n    let thumbnailView = PDFViewerApplication.pdfThumbnailViewer.\n                        getThumbnail(pageIndex);\n    thumbnailView.setImage(pageView);\n  }\n\n  if (typeof Stats !== 'undefined' && Stats.enabled && pageView.stats) {\n    Stats.add(pageNumber, pageView.stats);\n  }\n\n  if (pageView.error) {\n    PDFViewerApplication.l10n.get('rendering_error', null,\n        'An error occurred while rendering the page.').then((msg) => {\n      PDFViewerApplication.error(msg, pageView.error);\n    });\n  }\n\n  if (typeof PDFJSDev !== 'undefined' &&\n      PDFJSDev.test('FIREFOX || MOZCENTRAL')) {\n    PDFViewerApplication.externalServices.reportTelemetry({\n      type: 'pageInfo',\n    });\n    // It is a good time to report stream and font types.\n    PDFViewerApplication.pdfDocument.getStats().then(function (stats) {\n      PDFViewerApplication.externalServices.reportTelemetry({\n        type: 'documentStats',\n        stats,\n      });\n    });\n  }\n}\n\nfunction webViewerTextLayerRendered(evt) {\n  if (typeof PDFJSDev !== 'undefined' &&\n      PDFJSDev.test('FIREFOX || MOZCENTRAL') &&\n      evt.numTextDivs > 0 && !PDFViewerApplication.supportsDocumentColors) {\n    PDFViewerApplication.l10n.get('document_colors_not_allowed', null,\n      'PDF documents are not allowed to use their own colors: ' +\n      '\\'Allow pages to choose their own colors\\' ' +\n      'is deactivated in the browser.').\n        then((msg) => {\n      console.error(msg);\n    });\n    PDFViewerApplication.fallback();\n  }\n}\n\nfunction webViewerPageMode(evt) {\n  // Handle the 'pagemode' hash parameter, see also `PDFLinkService_setHash`.\n  let mode = evt.mode, view;\n  switch (mode) {\n    case 'thumbs':\n      view = SidebarView.THUMBS;\n      break;\n    case 'bookmarks':\n    case 'outline':\n      view = SidebarView.OUTLINE;\n      break;\n    case 'attachments':\n      view = SidebarView.ATTACHMENTS;\n      break;\n    case 'none':\n      view = SidebarView.NONE;\n      break;\n    default:\n      console.error('Invalid \"pagemode\" hash parameter: ' + mode);\n      return;\n  }\n  PDFViewerApplication.pdfSidebar.switchView(view, /* forceOpen = */ true);\n}\n\nfunction webViewerNamedAction(evt) {\n  // Processing couple of named actions that might be useful.\n  // See also PDFLinkService.executeNamedAction\n  let action = evt.action;\n  switch (action) {\n    case 'GoToPage':\n      PDFViewerApplication.appConfig.toolbar.pageNumber.select();\n      break;\n\n    case 'Find':\n      if (!PDFViewerApplication.supportsIntegratedFind) {\n        PDFViewerApplication.findBar.toggle();\n      }\n      break;\n  }\n}\n\nfunction webViewerPresentationModeChanged(evt) {\n  let { active, switchInProgress, } = evt;\n  PDFViewerApplication.pdfViewer.presentationModeState =\n    switchInProgress ? PresentationModeState.CHANGING :\n    active ? PresentationModeState.FULLSCREEN : PresentationModeState.NORMAL;\n}\n\nfunction webViewerSidebarViewChanged(evt) {\n  PDFViewerApplication.pdfRenderingQueue.isThumbnailViewEnabled =\n    PDFViewerApplication.pdfSidebar.isThumbnailViewVisible;\n\n  let store = PDFViewerApplication.store;\n  if (store && PDFViewerApplication.isInitialViewSet) {\n    // Only update the storage when the document has been loaded *and* rendered.\n    store.set('sidebarView', evt.view).catch(function() { });\n  }\n}\n\nfunction webViewerUpdateViewarea(evt) {\n  let location = evt.location, store = PDFViewerApplication.store;\n\n  if (store && PDFViewerApplication.isInitialViewSet) {\n    store.setMultiple({\n      'page': location.pageNumber,\n      'zoom': location.scale,\n      'scrollLeft': location.left,\n      'scrollTop': location.top,\n      'rotation': location.rotation,\n    }).catch(function() { /* unable to write to storage */ });\n  }\n  let href =\n    PDFViewerApplication.pdfLinkService.getAnchorUrl(location.pdfOpenParams);\n  PDFViewerApplication.appConfig.toolbar.viewBookmark.href = href;\n  PDFViewerApplication.appConfig.secondaryToolbar.viewBookmarkButton.href =\n    href;\n\n  // Show/hide the loading indicator in the page number input element.\n  let currentPage =\n    PDFViewerApplication.pdfViewer.getPageView(PDFViewerApplication.page - 1);\n  let loading = currentPage.renderingState !== RenderingStates.FINISHED;\n  PDFViewerApplication.toolbar.updateLoadingIndicatorState(loading);\n}\n\nfunction webViewerScrollModeChanged(evt) {\n  let store = PDFViewerApplication.store;\n  if (store && PDFViewerApplication.isInitialViewSet) {\n    // Only update the storage when the document has been loaded *and* rendered.\n    store.set('scrollMode', evt.mode).catch(function() { });\n  }\n}\n\nfunction webViewerSpreadModeChanged(evt) {\n  let store = PDFViewerApplication.store;\n  if (store && PDFViewerApplication.isInitialViewSet) {\n    // Only update the storage when the document has been loaded *and* rendered.\n    store.set('spreadMode', evt.mode).catch(function() { });\n  }\n}\n\nfunction webViewerResize() {\n  let { pdfDocument, pdfViewer, } = PDFViewerApplication;\n  if (!pdfDocument) {\n    return;\n  }\n  let currentScaleValue = pdfViewer.currentScaleValue;\n  if (currentScaleValue === 'auto' ||\n      currentScaleValue === 'page-fit' ||\n      currentScaleValue === 'page-width') {\n    // Note: the scale is constant for 'page-actual'.\n    pdfViewer.currentScaleValue = currentScaleValue;\n  }\n  pdfViewer.update();\n}\n\nfunction webViewerHashchange(evt) {\n  let hash = evt.hash;\n  if (!hash) {\n    return;\n  }\n  if (!PDFViewerApplication.isInitialViewSet) {\n    PDFViewerApplication.initialBookmark = hash;\n  } else if (!PDFViewerApplication.pdfHistory.popStateInProgress) {\n    PDFViewerApplication.pdfLinkService.setHash(hash);\n  }\n}\n\nlet webViewerFileInputChange;\nif (typeof PDFJSDev === 'undefined' || PDFJSDev.test('GENERIC')) {\n  webViewerFileInputChange = function webViewerFileInputChange(evt) {\n    if (PDFViewerApplication.pdfViewer &&\n        PDFViewerApplication.pdfViewer.isInPresentationMode) {\n      return; // Opening a new PDF file isn't supported in Presentation Mode.\n    }\n    let file = evt.fileInput.files[0];\n\n    if (URL.createObjectURL && !AppOptions.get('disableCreateObjectURL')) {\n      let url = URL.createObjectURL(file);\n      if (file.name) {\n        url = { url, originalUrl: file.name, };\n      }\n      PDFViewerApplication.open(url);\n    } else {\n      PDFViewerApplication.setTitleUsingUrl(file.name);\n      // Read the local file into a Uint8Array.\n      let fileReader = new FileReader();\n      fileReader.onload = function webViewerChangeFileReaderOnload(evt) {\n        let buffer = evt.target.result;\n        PDFViewerApplication.open(new Uint8Array(buffer));\n      };\n      fileReader.readAsArrayBuffer(file);\n    }\n\n    // URL does not reflect proper document location - hiding some icons.\n    let appConfig = PDFViewerApplication.appConfig;\n    appConfig.toolbar.viewBookmark.setAttribute('hidden', 'true');\n    appConfig.secondaryToolbar.viewBookmarkButton.setAttribute('hidden',\n                                                               'true');\n    appConfig.toolbar.download.setAttribute('hidden', 'true');\n    appConfig.secondaryToolbar.downloadButton.setAttribute('hidden', 'true');\n  };\n}\n\nfunction webViewerPresentationMode() {\n  PDFViewerApplication.requestPresentationMode();\n}\nfunction webViewerOpenFile() {\n  if (typeof PDFJSDev === 'undefined' || PDFJSDev.test('GENERIC')) {\n    let openFileInputName = PDFViewerApplication.appConfig.openFileInputName;\n    document.getElementById(openFileInputName).click();\n  }\n}\nfunction webViewerPrint() {\n  window.print();\n}\nfunction webViewerDownload() {\n  PDFViewerApplication.download();\n}\nfunction webViewerFirstPage() {\n  if (PDFViewerApplication.pdfDocument) {\n    PDFViewerApplication.page = 1;\n  }\n}\nfunction webViewerLastPage() {\n  if (PDFViewerApplication.pdfDocument) {\n    PDFViewerApplication.page = PDFViewerApplication.pagesCount;\n  }\n}\nfunction webViewerNextPage() {\n  PDFViewerApplication.page++;\n}\nfunction webViewerPreviousPage() {\n  PDFViewerApplication.page--;\n}\nfunction webViewerZoomIn() {\n  PDFViewerApplication.zoomIn();\n}\nfunction webViewerZoomOut() {\n  PDFViewerApplication.zoomOut();\n}\nfunction webViewerPageNumberChanged(evt) {\n  let pdfViewer = PDFViewerApplication.pdfViewer;\n  pdfViewer.currentPageLabel = evt.value;\n\n  // Ensure that the page number input displays the correct value, even if the\n  // value entered by the user was invalid (e.g. a floating point number).\n  if (evt.value !== pdfViewer.currentPageNumber.toString() &&\n      evt.value !== pdfViewer.currentPageLabel) {\n    PDFViewerApplication.toolbar.setPageNumber(\n      pdfViewer.currentPageNumber, pdfViewer.currentPageLabel);\n  }\n}\nfunction webViewerScaleChanged(evt) {\n  PDFViewerApplication.pdfViewer.currentScaleValue = evt.value;\n}\nfunction webViewerRotateCw() {\n  PDFViewerApplication.rotatePages(90);\n}\nfunction webViewerRotateCcw() {\n  PDFViewerApplication.rotatePages(-90);\n}\nfunction webViewerSwitchScrollMode(evt) {\n  PDFViewerApplication.pdfViewer.scrollMode = evt.mode;\n}\nfunction webViewerSwitchSpreadMode(evt) {\n  PDFViewerApplication.pdfViewer.spreadMode = evt.mode;\n}\nfunction webViewerDocumentProperties() {\n  PDFViewerApplication.pdfDocumentProperties.open();\n}\n\nfunction webViewerFind(evt) {\n  PDFViewerApplication.findController.executeCommand('find' + evt.type, {\n    query: evt.query,\n    phraseSearch: evt.phraseSearch,\n    caseSensitive: evt.caseSensitive,\n    entireWord: evt.entireWord,\n    highlightAll: evt.highlightAll,\n    findPrevious: evt.findPrevious,\n  });\n}\n\nfunction webViewerFindFromUrlHash(evt) {\n  PDFViewerApplication.findController.executeCommand('find', {\n    query: evt.query,\n    phraseSearch: evt.phraseSearch,\n    caseSensitive: false,\n    entireWord: false,\n    highlightAll: true,\n    findPrevious: false,\n  });\n}\n\nfunction webViewerUpdateFindMatchesCount({ matchesCount, }) {\n  if (PDFViewerApplication.supportsIntegratedFind) {\n    PDFViewerApplication.externalServices.updateFindMatchesCount(matchesCount);\n  } else {\n    PDFViewerApplication.findBar.updateResultsCount(matchesCount);\n  }\n}\n\nfunction webViewerUpdateFindControlState({ state, previous, matchesCount, }) {\n  if (PDFViewerApplication.supportsIntegratedFind) {\n    PDFViewerApplication.externalServices.updateFindControlState({\n      result: state,\n      findPrevious: previous,\n      matchesCount,\n    });\n  } else {\n    PDFViewerApplication.findBar.updateUIState(state, previous, matchesCount);\n  }\n}\n\nfunction webViewerScaleChanging(evt) {\n  PDFViewerApplication.toolbar.setPageScale(evt.presetValue, evt.scale);\n\n  PDFViewerApplication.pdfViewer.update();\n}\n\nfunction webViewerRotationChanging(evt) {\n  PDFViewerApplication.pdfThumbnailViewer.pagesRotation = evt.pagesRotation;\n\n  PDFViewerApplication.forceRendering();\n  // Ensure that the active page doesn't change during rotation.\n  PDFViewerApplication.pdfViewer.currentPageNumber = evt.pageNumber;\n}\n\nfunction webViewerPageChanging(evt) {\n  let page = evt.pageNumber;\n\n  PDFViewerApplication.toolbar.setPageNumber(page, evt.pageLabel || null);\n  PDFViewerApplication.secondaryToolbar.setPageNumber(page);\n\n  if (PDFViewerApplication.pdfSidebar.isThumbnailViewVisible) {\n    PDFViewerApplication.pdfThumbnailViewer.scrollThumbnailIntoView(page);\n  }\n\n  // We need to update stats.\n  if (typeof Stats !== 'undefined' && Stats.enabled) {\n    let pageView = PDFViewerApplication.pdfViewer.getPageView(page - 1);\n    if (pageView && pageView.stats) {\n      Stats.add(page, pageView.stats);\n    }\n  }\n}\n\nlet zoomDisabled = false, zoomDisabledTimeout;\nfunction webViewerWheel(evt) {\n  let pdfViewer = PDFViewerApplication.pdfViewer;\n  if (pdfViewer.isInPresentationMode) {\n    return;\n  }\n\n  if (evt.ctrlKey || evt.metaKey) {\n    let support = PDFViewerApplication.supportedMouseWheelZoomModifierKeys;\n    if ((evt.ctrlKey && !support.ctrlKey) ||\n        (evt.metaKey && !support.metaKey)) {\n      return;\n    }\n    // Only zoom the pages, not the entire viewer.\n    evt.preventDefault();\n    // NOTE: this check must be placed *after* preventDefault.\n    if (zoomDisabled) {\n      return;\n    }\n\n    let previousScale = pdfViewer.currentScale;\n\n    let delta = normalizeWheelEventDelta(evt);\n\n    const MOUSE_WHEEL_DELTA_PER_PAGE_SCALE = 3.0;\n    let ticks = delta * MOUSE_WHEEL_DELTA_PER_PAGE_SCALE;\n    if (ticks < 0) {\n      PDFViewerApplication.zoomOut(-ticks);\n    } else {\n      PDFViewerApplication.zoomIn(ticks);\n    }\n\n    let currentScale = pdfViewer.currentScale;\n    if (previousScale !== currentScale) {\n      // After scaling the page via zoomIn/zoomOut, the position of the upper-\n      // left corner is restored. When the mouse wheel is used, the position\n      // under the cursor should be restored instead.\n      let scaleCorrectionFactor = currentScale / previousScale - 1;\n      let rect = pdfViewer.container.getBoundingClientRect();\n      let dx = evt.clientX - rect.left;\n      let dy = evt.clientY - rect.top;\n      pdfViewer.container.scrollLeft += dx * scaleCorrectionFactor;\n      pdfViewer.container.scrollTop += dy * scaleCorrectionFactor;\n    }\n  } else {\n    zoomDisabled = true;\n    clearTimeout(zoomDisabledTimeout);\n    zoomDisabledTimeout = setTimeout(function () {\n      zoomDisabled = false;\n    }, 1000);\n  }\n}\n\nfunction webViewerClick(evt) {\n  if (!PDFViewerApplication.secondaryToolbar.isOpen) {\n    return;\n  }\n  let appConfig = PDFViewerApplication.appConfig;\n  if (PDFViewerApplication.pdfViewer.containsElement(evt.target) ||\n      (appConfig.toolbar.container.contains(evt.target) &&\n       evt.target !== appConfig.secondaryToolbar.toggleButton)) {\n    PDFViewerApplication.secondaryToolbar.close();\n  }\n}\n\nfunction webViewerKeyDown(evt) {\n  if (PDFViewerApplication.overlayManager.active) {\n    return;\n  }\n\n  let handled = false, ensureViewerFocused = false;\n  let cmd = (evt.ctrlKey ? 1 : 0) |\n            (evt.altKey ? 2 : 0) |\n            (evt.shiftKey ? 4 : 0) |\n            (evt.metaKey ? 8 : 0);\n\n  let pdfViewer = PDFViewerApplication.pdfViewer;\n  let isViewerInPresentationMode = pdfViewer && pdfViewer.isInPresentationMode;\n\n  // First, handle the key bindings that are independent whether an input\n  // control is selected or not.\n  if (cmd === 1 || cmd === 8 || cmd === 5 || cmd === 12) {\n    // either CTRL or META key with optional SHIFT.\n    switch (evt.keyCode) {\n      case 70: // f\n        if (!PDFViewerApplication.supportsIntegratedFind) {\n          PDFViewerApplication.findBar.open();\n          handled = true;\n        }\n        break;\n      case 71: // g\n        if (!PDFViewerApplication.supportsIntegratedFind) {\n          let findState = PDFViewerApplication.findController.state;\n          if (findState) {\n            PDFViewerApplication.findController.executeCommand('findagain', {\n              query: findState.query,\n              phraseSearch: findState.phraseSearch,\n              caseSensitive: findState.caseSensitive,\n              entireWord: findState.entireWord,\n              highlightAll: findState.highlightAll,\n              findPrevious: cmd === 5 || cmd === 12,\n            });\n          }\n          handled = true;\n        }\n        break;\n      case 61: // FF/Mac '='\n      case 107: // FF '+' and '='\n      case 187: // Chrome '+'\n      case 171: // FF with German keyboard\n        if (!isViewerInPresentationMode) {\n          PDFViewerApplication.zoomIn();\n        }\n        handled = true;\n        break;\n      case 173: // FF/Mac '-'\n      case 109: // FF '-'\n      case 189: // Chrome '-'\n        if (!isViewerInPresentationMode) {\n          PDFViewerApplication.zoomOut();\n        }\n        handled = true;\n        break;\n      case 48: // '0'\n      case 96: // '0' on Numpad of Swedish keyboard\n        if (!isViewerInPresentationMode) {\n          // keeping it unhandled (to restore page zoom to 100%)\n          setTimeout(function () {\n            // ... and resetting the scale after browser adjusts its scale\n            pdfViewer.currentScaleValue = DEFAULT_SCALE_VALUE;\n          });\n          handled = false;\n        }\n        break;\n\n      case 38: // up arrow\n        if (isViewerInPresentationMode || PDFViewerApplication.page > 1) {\n          PDFViewerApplication.page = 1;\n          handled = true;\n          ensureViewerFocused = true;\n        }\n        break;\n      case 40: // down arrow\n        if (isViewerInPresentationMode ||\n            PDFViewerApplication.page < PDFViewerApplication.pagesCount) {\n          PDFViewerApplication.page = PDFViewerApplication.pagesCount;\n          handled = true;\n          ensureViewerFocused = true;\n        }\n        break;\n    }\n  }\n\n  if (typeof PDFJSDev === 'undefined' ||\n      !PDFJSDev.test('FIREFOX || MOZCENTRAL')) {\n    // CTRL or META without shift\n    if (cmd === 1 || cmd === 8) {\n      switch (evt.keyCode) {\n        case 83: // s\n          PDFViewerApplication.download();\n          handled = true;\n          break;\n      }\n    }\n  }\n\n  // CTRL+ALT or Option+Command\n  if (cmd === 3 || cmd === 10) {\n    switch (evt.keyCode) {\n      case 80: // p\n        PDFViewerApplication.requestPresentationMode();\n        handled = true;\n        break;\n      case 71: // g\n        // focuses input#pageNumber field\n        PDFViewerApplication.appConfig.toolbar.pageNumber.select();\n        handled = true;\n        break;\n    }\n  }\n\n  if (handled) {\n    if (ensureViewerFocused && !isViewerInPresentationMode) {\n      pdfViewer.focus();\n    }\n    evt.preventDefault();\n    return;\n  }\n\n  // Some shortcuts should not get handled if a control/input element\n  // is selected.\n  let curElement = document.activeElement || document.querySelector(':focus');\n  let curElementTagName = curElement && curElement.tagName.toUpperCase();\n  if (curElementTagName === 'INPUT' ||\n      curElementTagName === 'TEXTAREA' ||\n      curElementTagName === 'SELECT') {\n    // Make sure that the secondary toolbar is closed when Escape is pressed.\n    if (evt.keyCode !== 27) { // 'Esc'\n      return;\n    }\n  }\n\n  if (cmd === 0) { // no control key pressed at all.\n    let turnPage = 0, turnOnlyIfPageFit = false;\n    switch (evt.keyCode) {\n      case 38: // up arrow\n      case 33: // pg up\n        // vertical scrolling using arrow/pg keys\n        if (pdfViewer.isVerticalScrollbarEnabled) {\n          turnOnlyIfPageFit = true;\n        }\n        turnPage = -1;\n        break;\n      case 8: // backspace\n        if (!isViewerInPresentationMode) {\n          turnOnlyIfPageFit = true;\n        }\n        turnPage = -1;\n        break;\n      case 37: // left arrow\n        // horizontal scrolling using arrow keys\n        if (pdfViewer.isHorizontalScrollbarEnabled) {\n          turnOnlyIfPageFit = true;\n        }\n        /* falls through */\n      case 75: // 'k'\n      case 80: // 'p'\n        turnPage = -1;\n        break;\n      case 27: // esc key\n        if (PDFViewerApplication.secondaryToolbar.isOpen) {\n          PDFViewerApplication.secondaryToolbar.close();\n          handled = true;\n        }\n        if (!PDFViewerApplication.supportsIntegratedFind &&\n            PDFViewerApplication.findBar.opened) {\n          PDFViewerApplication.findBar.close();\n          handled = true;\n        }\n        break;\n      case 40: // down arrow\n      case 34: // pg down\n        // vertical scrolling using arrow/pg keys\n        if (pdfViewer.isVerticalScrollbarEnabled) {\n          turnOnlyIfPageFit = true;\n        }\n        turnPage = 1;\n        break;\n      case 13: // enter key\n      case 32: // spacebar\n        if (!isViewerInPresentationMode) {\n          turnOnlyIfPageFit = true;\n        }\n        turnPage = 1;\n        break;\n      case 39: // right arrow\n        // horizontal scrolling using arrow keys\n        if (pdfViewer.isHorizontalScrollbarEnabled) {\n          turnOnlyIfPageFit = true;\n        }\n        /* falls through */\n      case 74: // 'j'\n      case 78: // 'n'\n        turnPage = 1;\n        break;\n\n      case 36: // home\n        if (isViewerInPresentationMode || PDFViewerApplication.page > 1) {\n          PDFViewerApplication.page = 1;\n          handled = true;\n          ensureViewerFocused = true;\n        }\n        break;\n      case 35: // end\n        if (isViewerInPresentationMode ||\n            PDFViewerApplication.page < PDFViewerApplication.pagesCount) {\n          PDFViewerApplication.page = PDFViewerApplication.pagesCount;\n          handled = true;\n          ensureViewerFocused = true;\n        }\n        break;\n\n      case 83: // 's'\n        PDFViewerApplication.pdfCursorTools.switchTool(CursorTool.SELECT);\n        break;\n      case 72: // 'h'\n        PDFViewerApplication.pdfCursorTools.switchTool(CursorTool.HAND);\n        break;\n\n      case 82: // 'r'\n        PDFViewerApplication.rotatePages(90);\n        break;\n    }\n\n    if (turnPage !== 0 &&\n        (!turnOnlyIfPageFit || pdfViewer.currentScaleValue === 'page-fit')) {\n      if (turnPage > 0) {\n        if (PDFViewerApplication.page < PDFViewerApplication.pagesCount) {\n          PDFViewerApplication.page++;\n        }\n      } else {\n        if (PDFViewerApplication.page > 1) {\n          PDFViewerApplication.page--;\n        }\n      }\n      handled = true;\n    }\n  }\n\n  if (cmd === 4) { // shift-key\n    switch (evt.keyCode) {\n      case 13: // enter key\n      case 32: // spacebar\n        if (!isViewerInPresentationMode &&\n            pdfViewer.currentScaleValue !== 'page-fit') {\n          break;\n        }\n        if (PDFViewerApplication.page > 1) {\n          PDFViewerApplication.page--;\n        }\n        handled = true;\n        break;\n\n      case 82: // 'r'\n        PDFViewerApplication.rotatePages(-90);\n        break;\n    }\n  }\n\n  if (!handled && !isViewerInPresentationMode) {\n    // 33=Page Up  34=Page Down  35=End    36=Home\n    // 37=Left     38=Up         39=Right  40=Down\n    // 32=Spacebar\n    if ((evt.keyCode >= 33 && evt.keyCode <= 40) ||\n        (evt.keyCode === 32 && curElementTagName !== 'BUTTON')) {\n      ensureViewerFocused = true;\n    }\n  }\n\n  if (ensureViewerFocused && !pdfViewer.containsElement(curElement)) {\n    // The page container is not focused, but a page navigation key has been\n    // pressed. Change the focus to the viewer container to make sure that\n    // navigation by keyboard works as expected.\n    pdfViewer.focus();\n  }\n\n  if (handled) {\n    evt.preventDefault();\n  }\n}\n\n/**\n * Converts API PageMode values to the format used by `PDFSidebar`.\n * NOTE: There's also a \"FullScreen\" parameter which is not possible to support,\n *       since the Fullscreen API used in browsers requires that entering\n *       fullscreen mode only occurs as a result of a user-initiated event.\n * @param {string} mode - The API PageMode value.\n * @returns {number} A value from {SidebarView}.\n */\nfunction apiPageModeToSidebarView(mode) {\n  switch (mode) {\n    case 'UseNone':\n      return SidebarView.NONE;\n    case 'UseThumbs':\n      return SidebarView.THUMBS;\n    case 'UseOutlines':\n      return SidebarView.OUTLINE;\n    case 'UseAttachments':\n      return SidebarView.ATTACHMENTS;\n    case 'UseOC':\n      // Not implemented, since we don't support Optional Content Groups yet.\n  }\n  return SidebarView.NONE; // Default value.\n}\n\n/* Abstract factory for the print service. */\nlet PDFPrintServiceFactory = {\n  instance: {\n    supportsPrinting: false,\n    createPrintService() {\n      throw new Error('Not implemented: createPrintService');\n    },\n  },\n};\n\nexport {\n  PDFViewerApplication,\n  DefaultExternalServices,\n  PDFPrintServiceFactory,\n};\n","module.exports = require(\"regenerator-runtime\");\n","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n// This method of obtaining a reference to the global object needs to be\n// kept identical to the way it is obtained in runtime.js\nvar g = (function() { return this })() || Function(\"return this\")();\n\n// Use `getOwnPropertyNames` because not all browsers support calling\n// `hasOwnProperty` on the global `self` object in a worker. See #183.\nvar hadRuntime = g.regeneratorRuntime &&\n  Object.getOwnPropertyNames(g).indexOf(\"regeneratorRuntime\") >= 0;\n\n// Save the old regeneratorRuntime in case it needs to be restored later.\nvar oldRuntime = hadRuntime && g.regeneratorRuntime;\n\n// Force reevalutation of runtime.js.\ng.regeneratorRuntime = undefined;\n\nmodule.exports = require(\"./runtime\");\n\nif (hadRuntime) {\n  // Restore the original runtime.\n  g.regeneratorRuntime = oldRuntime;\n} else {\n  // Remove the global property added by runtime.js.\n  try {\n    delete g.regeneratorRuntime;\n  } catch(e) {\n    g.regeneratorRuntime = undefined;\n  }\n}\n","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n!(function(global) {\n  \"use strict\";\n\n  var Op = Object.prototype;\n  var hasOwn = Op.hasOwnProperty;\n  var undefined; // More compressible than void 0.\n  var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n  var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n  var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n  var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n  var inModule = typeof module === \"object\";\n  var runtime = global.regeneratorRuntime;\n  if (runtime) {\n    if (inModule) {\n      // If regeneratorRuntime is defined globally and we're in a module,\n      // make the exports object identical to regeneratorRuntime.\n      module.exports = runtime;\n    }\n    // Don't bother evaluating the rest of this file if the runtime was\n    // already defined globally.\n    return;\n  }\n\n  // Define the runtime globally (as expected by generated code) as either\n  // module.exports (if we're in a module) or a new, empty object.\n  runtime = global.regeneratorRuntime = inModule ? module.exports : {};\n\n  function wrap(innerFn, outerFn, self, tryLocsList) {\n    // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n    var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n    var generator = Object.create(protoGenerator.prototype);\n    var context = new Context(tryLocsList || []);\n\n    // The ._invoke method unifies the implementations of the .next,\n    // .throw, and .return methods.\n    generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n    return generator;\n  }\n  runtime.wrap = wrap;\n\n  // Try/catch helper to minimize deoptimizations. Returns a completion\n  // record like context.tryEntries[i].completion. This interface could\n  // have been (and was previously) designed to take a closure to be\n  // invoked without arguments, but in all the cases we care about we\n  // already have an existing method we want to call, so there's no need\n  // to create a new function object. We can even get away with assuming\n  // the method takes exactly one argument, since that happens to be true\n  // in every case, so we don't have to touch the arguments object. The\n  // only additional allocation required is the completion record, which\n  // has a stable shape and so hopefully should be cheap to allocate.\n  function tryCatch(fn, obj, arg) {\n    try {\n      return { type: \"normal\", arg: fn.call(obj, arg) };\n    } catch (err) {\n      return { type: \"throw\", arg: err };\n    }\n  }\n\n  var GenStateSuspendedStart = \"suspendedStart\";\n  var GenStateSuspendedYield = \"suspendedYield\";\n  var GenStateExecuting = \"executing\";\n  var GenStateCompleted = \"completed\";\n\n  // Returning this object from the innerFn has the same effect as\n  // breaking out of the dispatch switch statement.\n  var ContinueSentinel = {};\n\n  // Dummy constructor functions that we use as the .constructor and\n  // .constructor.prototype properties for functions that return Generator\n  // objects. For full spec compliance, you may wish to configure your\n  // minifier not to mangle the names of these two functions.\n  function Generator() {}\n  function GeneratorFunction() {}\n  function GeneratorFunctionPrototype() {}\n\n  // This is a polyfill for %IteratorPrototype% for environments that\n  // don't natively support it.\n  var IteratorPrototype = {};\n  IteratorPrototype[iteratorSymbol] = function () {\n    return this;\n  };\n\n  var getProto = Object.getPrototypeOf;\n  var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n  if (NativeIteratorPrototype &&\n      NativeIteratorPrototype !== Op &&\n      hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n    // This environment has a native %IteratorPrototype%; use it instead\n    // of the polyfill.\n    IteratorPrototype = NativeIteratorPrototype;\n  }\n\n  var Gp = GeneratorFunctionPrototype.prototype =\n    Generator.prototype = Object.create(IteratorPrototype);\n  GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n  GeneratorFunctionPrototype.constructor = GeneratorFunction;\n  GeneratorFunctionPrototype[toStringTagSymbol] =\n    GeneratorFunction.displayName = \"GeneratorFunction\";\n\n  // Helper for defining the .next, .throw, and .return methods of the\n  // Iterator interface in terms of a single ._invoke method.\n  function defineIteratorMethods(prototype) {\n    [\"next\", \"throw\", \"return\"].forEach(function(method) {\n      prototype[method] = function(arg) {\n        return this._invoke(method, arg);\n      };\n    });\n  }\n\n  runtime.isGeneratorFunction = function(genFun) {\n    var ctor = typeof genFun === \"function\" && genFun.constructor;\n    return ctor\n      ? ctor === GeneratorFunction ||\n        // For the native GeneratorFunction constructor, the best we can\n        // do is to check its .name property.\n        (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n      : false;\n  };\n\n  runtime.mark = function(genFun) {\n    if (Object.setPrototypeOf) {\n      Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n    } else {\n      genFun.__proto__ = GeneratorFunctionPrototype;\n      if (!(toStringTagSymbol in genFun)) {\n        genFun[toStringTagSymbol] = \"GeneratorFunction\";\n      }\n    }\n    genFun.prototype = Object.create(Gp);\n    return genFun;\n  };\n\n  // Within the body of any async function, `await x` is transformed to\n  // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n  // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n  // meant to be awaited.\n  runtime.awrap = function(arg) {\n    return { __await: arg };\n  };\n\n  function AsyncIterator(generator) {\n    function invoke(method, arg, resolve, reject) {\n      var record = tryCatch(generator[method], generator, arg);\n      if (record.type === \"throw\") {\n        reject(record.arg);\n      } else {\n        var result = record.arg;\n        var value = result.value;\n        if (value &&\n            typeof value === \"object\" &&\n            hasOwn.call(value, \"__await\")) {\n          return Promise.resolve(value.__await).then(function(value) {\n            invoke(\"next\", value, resolve, reject);\n          }, function(err) {\n            invoke(\"throw\", err, resolve, reject);\n          });\n        }\n\n        return Promise.resolve(value).then(function(unwrapped) {\n          // When a yielded Promise is resolved, its final value becomes\n          // the .value of the Promise<{value,done}> result for the\n          // current iteration. If the Promise is rejected, however, the\n          // result for this iteration will be rejected with the same\n          // reason. Note that rejections of yielded Promises are not\n          // thrown back into the generator function, as is the case\n          // when an awaited Promise is rejected. This difference in\n          // behavior between yield and await is important, because it\n          // allows the consumer to decide what to do with the yielded\n          // rejection (swallow it and continue, manually .throw it back\n          // into the generator, abandon iteration, whatever). With\n          // await, by contrast, there is no opportunity to examine the\n          // rejection reason outside the generator function, so the\n          // only option is to throw it from the await expression, and\n          // let the generator function handle the exception.\n          result.value = unwrapped;\n          resolve(result);\n        }, reject);\n      }\n    }\n\n    var previousPromise;\n\n    function enqueue(method, arg) {\n      function callInvokeWithMethodAndArg() {\n        return new Promise(function(resolve, reject) {\n          invoke(method, arg, resolve, reject);\n        });\n      }\n\n      return previousPromise =\n        // If enqueue has been called before, then we want to wait until\n        // all previous Promises have been resolved before calling invoke,\n        // so that results are always delivered in the correct order. If\n        // enqueue has not been called before, then it is important to\n        // call invoke immediately, without waiting on a callback to fire,\n        // so that the async generator function has the opportunity to do\n        // any necessary setup in a predictable way. This predictability\n        // is why the Promise constructor synchronously invokes its\n        // executor callback, and why async functions synchronously\n        // execute code before the first await. Since we implement simple\n        // async functions in terms of async generators, it is especially\n        // important to get this right, even though it requires care.\n        previousPromise ? previousPromise.then(\n          callInvokeWithMethodAndArg,\n          // Avoid propagating failures to Promises returned by later\n          // invocations of the iterator.\n          callInvokeWithMethodAndArg\n        ) : callInvokeWithMethodAndArg();\n    }\n\n    // Define the unified helper method that is used to implement .next,\n    // .throw, and .return (see defineIteratorMethods).\n    this._invoke = enqueue;\n  }\n\n  defineIteratorMethods(AsyncIterator.prototype);\n  AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n    return this;\n  };\n  runtime.AsyncIterator = AsyncIterator;\n\n  // Note that simple async functions are implemented on top of\n  // AsyncIterator objects; they just return a Promise for the value of\n  // the final result produced by the iterator.\n  runtime.async = function(innerFn, outerFn, self, tryLocsList) {\n    var iter = new AsyncIterator(\n      wrap(innerFn, outerFn, self, tryLocsList)\n    );\n\n    return runtime.isGeneratorFunction(outerFn)\n      ? iter // If outerFn is a generator, return the full iterator.\n      : iter.next().then(function(result) {\n          return result.done ? result.value : iter.next();\n        });\n  };\n\n  function makeInvokeMethod(innerFn, self, context) {\n    var state = GenStateSuspendedStart;\n\n    return function invoke(method, arg) {\n      if (state === GenStateExecuting) {\n        throw new Error(\"Generator is already running\");\n      }\n\n      if (state === GenStateCompleted) {\n        if (method === \"throw\") {\n          throw arg;\n        }\n\n        // Be forgiving, per 25.3.3.3.3 of the spec:\n        // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n        return doneResult();\n      }\n\n      context.method = method;\n      context.arg = arg;\n\n      while (true) {\n        var delegate = context.delegate;\n        if (delegate) {\n          var delegateResult = maybeInvokeDelegate(delegate, context);\n          if (delegateResult) {\n            if (delegateResult === ContinueSentinel) continue;\n            return delegateResult;\n          }\n        }\n\n        if (context.method === \"next\") {\n          // Setting context._sent for legacy support of Babel's\n          // function.sent implementation.\n          context.sent = context._sent = context.arg;\n\n        } else if (context.method === \"throw\") {\n          if (state === GenStateSuspendedStart) {\n            state = GenStateCompleted;\n            throw context.arg;\n          }\n\n          context.dispatchException(context.arg);\n\n        } else if (context.method === \"return\") {\n          context.abrupt(\"return\", context.arg);\n        }\n\n        state = GenStateExecuting;\n\n        var record = tryCatch(innerFn, self, context);\n        if (record.type === \"normal\") {\n          // If an exception is thrown from innerFn, we leave state ===\n          // GenStateExecuting and loop back for another invocation.\n          state = context.done\n            ? GenStateCompleted\n            : GenStateSuspendedYield;\n\n          if (record.arg === ContinueSentinel) {\n            continue;\n          }\n\n          return {\n            value: record.arg,\n            done: context.done\n          };\n\n        } else if (record.type === \"throw\") {\n          state = GenStateCompleted;\n          // Dispatch the exception by looping back around to the\n          // context.dispatchException(context.arg) call above.\n          context.method = \"throw\";\n          context.arg = record.arg;\n        }\n      }\n    };\n  }\n\n  // Call delegate.iterator[context.method](context.arg) and handle the\n  // result, either by returning a { value, done } result from the\n  // delegate iterator, or by modifying context.method and context.arg,\n  // setting context.delegate to null, and returning the ContinueSentinel.\n  function maybeInvokeDelegate(delegate, context) {\n    var method = delegate.iterator[context.method];\n    if (method === undefined) {\n      // A .throw or .return when the delegate iterator has no .throw\n      // method always terminates the yield* loop.\n      context.delegate = null;\n\n      if (context.method === \"throw\") {\n        if (delegate.iterator.return) {\n          // If the delegate iterator has a return method, give it a\n          // chance to clean up.\n          context.method = \"return\";\n          context.arg = undefined;\n          maybeInvokeDelegate(delegate, context);\n\n          if (context.method === \"throw\") {\n            // If maybeInvokeDelegate(context) changed context.method from\n            // \"return\" to \"throw\", let that override the TypeError below.\n            return ContinueSentinel;\n          }\n        }\n\n        context.method = \"throw\";\n        context.arg = new TypeError(\n          \"The iterator does not provide a 'throw' method\");\n      }\n\n      return ContinueSentinel;\n    }\n\n    var record = tryCatch(method, delegate.iterator, context.arg);\n\n    if (record.type === \"throw\") {\n      context.method = \"throw\";\n      context.arg = record.arg;\n      context.delegate = null;\n      return ContinueSentinel;\n    }\n\n    var info = record.arg;\n\n    if (! info) {\n      context.method = \"throw\";\n      context.arg = new TypeError(\"iterator result is not an object\");\n      context.delegate = null;\n      return ContinueSentinel;\n    }\n\n    if (info.done) {\n      // Assign the result of the finished delegate to the temporary\n      // variable specified by delegate.resultName (see delegateYield).\n      context[delegate.resultName] = info.value;\n\n      // Resume execution at the desired location (see delegateYield).\n      context.next = delegate.nextLoc;\n\n      // If context.method was \"throw\" but the delegate handled the\n      // exception, let the outer generator proceed normally. If\n      // context.method was \"next\", forget context.arg since it has been\n      // \"consumed\" by the delegate iterator. If context.method was\n      // \"return\", allow the original .return call to continue in the\n      // outer generator.\n      if (context.method !== \"return\") {\n        context.method = \"next\";\n        context.arg = undefined;\n      }\n\n    } else {\n      // Re-yield the result returned by the delegate method.\n      return info;\n    }\n\n    // The delegate iterator is finished, so forget it and continue with\n    // the outer generator.\n    context.delegate = null;\n    return ContinueSentinel;\n  }\n\n  // Define Generator.prototype.{next,throw,return} in terms of the\n  // unified ._invoke helper method.\n  defineIteratorMethods(Gp);\n\n  Gp[toStringTagSymbol] = \"Generator\";\n\n  // A Generator should always return itself as the iterator object when the\n  // @@iterator function is called on it. Some browsers' implementations of the\n  // iterator prototype chain incorrectly implement this, causing the Generator\n  // object to not be returned from this call. This ensures that doesn't happen.\n  // See https://github.com/facebook/regenerator/issues/274 for more details.\n  Gp[iteratorSymbol] = function() {\n    return this;\n  };\n\n  Gp.toString = function() {\n    return \"[object Generator]\";\n  };\n\n  function pushTryEntry(locs) {\n    var entry = { tryLoc: locs[0] };\n\n    if (1 in locs) {\n      entry.catchLoc = locs[1];\n    }\n\n    if (2 in locs) {\n      entry.finallyLoc = locs[2];\n      entry.afterLoc = locs[3];\n    }\n\n    this.tryEntries.push(entry);\n  }\n\n  function resetTryEntry(entry) {\n    var record = entry.completion || {};\n    record.type = \"normal\";\n    delete record.arg;\n    entry.completion = record;\n  }\n\n  function Context(tryLocsList) {\n    // The root entry object (effectively a try statement without a catch\n    // or a finally block) gives us a place to store values thrown from\n    // locations where there is no enclosing try statement.\n    this.tryEntries = [{ tryLoc: \"root\" }];\n    tryLocsList.forEach(pushTryEntry, this);\n    this.reset(true);\n  }\n\n  runtime.keys = function(object) {\n    var keys = [];\n    for (var key in object) {\n      keys.push(key);\n    }\n    keys.reverse();\n\n    // Rather than returning an object with a next method, we keep\n    // things simple and return the next function itself.\n    return function next() {\n      while (keys.length) {\n        var key = keys.pop();\n        if (key in object) {\n          next.value = key;\n          next.done = false;\n          return next;\n        }\n      }\n\n      // To avoid creating an additional object, we just hang the .value\n      // and .done properties off the next function object itself. This\n      // also ensures that the minifier will not anonymize the function.\n      next.done = true;\n      return next;\n    };\n  };\n\n  function values(iterable) {\n    if (iterable) {\n      var iteratorMethod = iterable[iteratorSymbol];\n      if (iteratorMethod) {\n        return iteratorMethod.call(iterable);\n      }\n\n      if (typeof iterable.next === \"function\") {\n        return iterable;\n      }\n\n      if (!isNaN(iterable.length)) {\n        var i = -1, next = function next() {\n          while (++i < iterable.length) {\n            if (hasOwn.call(iterable, i)) {\n              next.value = iterable[i];\n              next.done = false;\n              return next;\n            }\n          }\n\n          next.value = undefined;\n          next.done = true;\n\n          return next;\n        };\n\n        return next.next = next;\n      }\n    }\n\n    // Return an iterator with no values.\n    return { next: doneResult };\n  }\n  runtime.values = values;\n\n  function doneResult() {\n    return { value: undefined, done: true };\n  }\n\n  Context.prototype = {\n    constructor: Context,\n\n    reset: function(skipTempReset) {\n      this.prev = 0;\n      this.next = 0;\n      // Resetting context._sent for legacy support of Babel's\n      // function.sent implementation.\n      this.sent = this._sent = undefined;\n      this.done = false;\n      this.delegate = null;\n\n      this.method = \"next\";\n      this.arg = undefined;\n\n      this.tryEntries.forEach(resetTryEntry);\n\n      if (!skipTempReset) {\n        for (var name in this) {\n          // Not sure about the optimal order of these conditions:\n          if (name.charAt(0) === \"t\" &&\n              hasOwn.call(this, name) &&\n              !isNaN(+name.slice(1))) {\n            this[name] = undefined;\n          }\n        }\n      }\n    },\n\n    stop: function() {\n      this.done = true;\n\n      var rootEntry = this.tryEntries[0];\n      var rootRecord = rootEntry.completion;\n      if (rootRecord.type === \"throw\") {\n        throw rootRecord.arg;\n      }\n\n      return this.rval;\n    },\n\n    dispatchException: function(exception) {\n      if (this.done) {\n        throw exception;\n      }\n\n      var context = this;\n      function handle(loc, caught) {\n        record.type = \"throw\";\n        record.arg = exception;\n        context.next = loc;\n\n        if (caught) {\n          // If the dispatched exception was caught by a catch block,\n          // then let that catch block handle the exception normally.\n          context.method = \"next\";\n          context.arg = undefined;\n        }\n\n        return !! caught;\n      }\n\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        var record = entry.completion;\n\n        if (entry.tryLoc === \"root\") {\n          // Exception thrown outside of any try block that could handle\n          // it, so set the completion value of the entire function to\n          // throw the exception.\n          return handle(\"end\");\n        }\n\n        if (entry.tryLoc <= this.prev) {\n          var hasCatch = hasOwn.call(entry, \"catchLoc\");\n          var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n          if (hasCatch && hasFinally) {\n            if (this.prev < entry.catchLoc) {\n              return handle(entry.catchLoc, true);\n            } else if (this.prev < entry.finallyLoc) {\n              return handle(entry.finallyLoc);\n            }\n\n          } else if (hasCatch) {\n            if (this.prev < entry.catchLoc) {\n              return handle(entry.catchLoc, true);\n            }\n\n          } else if (hasFinally) {\n            if (this.prev < entry.finallyLoc) {\n              return handle(entry.finallyLoc);\n            }\n\n          } else {\n            throw new Error(\"try statement without catch or finally\");\n          }\n        }\n      }\n    },\n\n    abrupt: function(type, arg) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.tryLoc <= this.prev &&\n            hasOwn.call(entry, \"finallyLoc\") &&\n            this.prev < entry.finallyLoc) {\n          var finallyEntry = entry;\n          break;\n        }\n      }\n\n      if (finallyEntry &&\n          (type === \"break\" ||\n           type === \"continue\") &&\n          finallyEntry.tryLoc <= arg &&\n          arg <= finallyEntry.finallyLoc) {\n        // Ignore the finally entry if control is not jumping to a\n        // location outside the try/catch block.\n        finallyEntry = null;\n      }\n\n      var record = finallyEntry ? finallyEntry.completion : {};\n      record.type = type;\n      record.arg = arg;\n\n      if (finallyEntry) {\n        this.method = \"next\";\n        this.next = finallyEntry.finallyLoc;\n        return ContinueSentinel;\n      }\n\n      return this.complete(record);\n    },\n\n    complete: function(record, afterLoc) {\n      if (record.type === \"throw\") {\n        throw record.arg;\n      }\n\n      if (record.type === \"break\" ||\n          record.type === \"continue\") {\n        this.next = record.arg;\n      } else if (record.type === \"return\") {\n        this.rval = this.arg = record.arg;\n        this.method = \"return\";\n        this.next = \"end\";\n      } else if (record.type === \"normal\" && afterLoc) {\n        this.next = afterLoc;\n      }\n\n      return ContinueSentinel;\n    },\n\n    finish: function(finallyLoc) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.finallyLoc === finallyLoc) {\n          this.complete(entry.completion, entry.afterLoc);\n          resetTryEntry(entry);\n          return ContinueSentinel;\n        }\n      }\n    },\n\n    \"catch\": function(tryLoc) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.tryLoc === tryLoc) {\n          var record = entry.completion;\n          if (record.type === \"throw\") {\n            var thrown = record.arg;\n            resetTryEntry(entry);\n          }\n          return thrown;\n        }\n      }\n\n      // The context.catch method must only be called with a location\n      // argument that corresponds to a known catch block.\n      throw new Error(\"illegal catch attempt\");\n    },\n\n    delegateYield: function(iterable, resultName, nextLoc) {\n      this.delegate = {\n        iterator: values(iterable),\n        resultName: resultName,\n        nextLoc: nextLoc\n      };\n\n      if (this.method === \"next\") {\n        // Deliberately forget the last sent value so that we don't\n        // accidentally pass it on to the delegate.\n        this.arg = undefined;\n      }\n\n      return ContinueSentinel;\n    }\n  };\n})(\n  // In sloppy mode, unbound `this` refers to the global object, fallback to\n  // Function constructor if we're in global strict mode. That is sadly a form\n  // of indirect eval which violates Content Security Policy.\n  (function() { return this })() || Function(\"return this\")()\n);\n","module.exports = function(module) {\r\n\tif (!module.webpackPolyfill) {\r\n\t\tmodule.deprecate = function() {};\r\n\t\tmodule.paths = [];\r\n\t\t// module.parent = undefined by default\r\n\t\tif (!module.children) module.children = [];\r\n\t\tObject.defineProperty(module, \"loaded\", {\r\n\t\t\tenumerable: true,\r\n\t\t\tget: function() {\r\n\t\t\t\treturn module.l;\r\n\t\t\t}\r\n\t\t});\r\n\t\tObject.defineProperty(module, \"id\", {\r\n\t\t\tenumerable: true,\r\n\t\t\tget: function() {\r\n\t\t\t\treturn module.i;\r\n\t\t\t}\r\n\t\t});\r\n\t\tmodule.webpackPolyfill = 1;\r\n\t}\r\n\treturn module;\r\n};\r\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst CSS_UNITS = 96.0 / 72.0;\nconst DEFAULT_SCALE_VALUE = 'auto';\nconst DEFAULT_SCALE = 1.0;\nconst MIN_SCALE = 0.10;\nconst MAX_SCALE = 10.0;\nconst UNKNOWN_SCALE = 0;\nconst MAX_AUTO_SCALE = 1.25;\nconst SCROLLBAR_PADDING = 40;\nconst VERTICAL_PADDING = 5;\n\nconst PresentationModeState = {\n  UNKNOWN: 0,\n  NORMAL: 1,\n  CHANGING: 2,\n  FULLSCREEN: 3,\n};\n\nconst RendererType = {\n  CANVAS: 'canvas',\n  SVG: 'svg',\n};\n\nconst TextLayerMode = {\n  DISABLE: 0,\n  ENABLE: 1,\n  ENABLE_ENHANCE: 2,\n};\n\n// Replaces {{arguments}} with their values.\nfunction formatL10nValue(text, args) {\n  if (!args) {\n    return text;\n  }\n  return text.replace(/\\{\\{\\s*(\\w+)\\s*\\}\\}/g, (all, name) => {\n    return (name in args ? args[name] : '{{' + name + '}}');\n  });\n}\n\n/**\n * No-op implementation of the localization service.\n * @implements {IL10n}\n */\nlet NullL10n = {\n  async getLanguage() {\n    return 'en-us';\n  },\n\n  async getDirection() {\n    return 'ltr';\n  },\n\n  async get(property, args, fallback) {\n    return formatL10nValue(fallback, args);\n  },\n\n  async translate(element) { },\n};\n\n/**\n * Returns scale factor for the canvas. It makes sense for the HiDPI displays.\n * @return {Object} The object with horizontal (sx) and vertical (sy)\n                    scales. The scaled property is set to false if scaling is\n                    not required, true otherwise.\n */\nfunction getOutputScale(ctx) {\n  let devicePixelRatio = window.devicePixelRatio || 1;\n  let backingStoreRatio = ctx.webkitBackingStorePixelRatio ||\n                          ctx.mozBackingStorePixelRatio ||\n                          ctx.msBackingStorePixelRatio ||\n                          ctx.oBackingStorePixelRatio ||\n                          ctx.backingStorePixelRatio || 1;\n  let pixelRatio = devicePixelRatio / backingStoreRatio;\n  return {\n    sx: pixelRatio,\n    sy: pixelRatio,\n    scaled: pixelRatio !== 1,\n  };\n}\n\n/**\n * Scrolls specified element into view of its parent.\n * @param {Object} element - The element to be visible.\n * @param {Object} spot - An object with optional top and left properties,\n *   specifying the offset from the top left edge.\n * @param {boolean} skipOverflowHiddenElements - Ignore elements that have\n *   the CSS rule `overflow: hidden;` set. The default is false.\n */\nfunction scrollIntoView(element, spot, skipOverflowHiddenElements = false) {\n  // Assuming offsetParent is available (it's not available when viewer is in\n  // hidden iframe or object). We have to scroll: if the offsetParent is not set\n  // producing the error. See also animationStarted.\n  let parent = element.offsetParent;\n  if (!parent) {\n    console.error('offsetParent is not set -- cannot scroll');\n    return;\n  }\n  let offsetY = element.offsetTop + element.clientTop;\n  let offsetX = element.offsetLeft + element.clientLeft;\n  while ((parent.clientHeight === parent.scrollHeight &&\n          parent.clientWidth === parent.scrollWidth) ||\n         (skipOverflowHiddenElements &&\n          getComputedStyle(parent).overflow === 'hidden')) {\n    if (parent.dataset._scaleY) {\n      offsetY /= parent.dataset._scaleY;\n      offsetX /= parent.dataset._scaleX;\n    }\n    offsetY += parent.offsetTop;\n    offsetX += parent.offsetLeft;\n    parent = parent.offsetParent;\n    if (!parent) {\n      return; // no need to scroll\n    }\n  }\n  if (spot) {\n    if (spot.top !== undefined) {\n      offsetY += spot.top;\n    }\n    if (spot.left !== undefined) {\n      offsetX += spot.left;\n      parent.scrollLeft = offsetX;\n    }\n  }\n  parent.scrollTop = offsetY;\n}\n\n/**\n * Helper function to start monitoring the scroll event and converting them into\n * PDF.js friendly one: with scroll debounce and scroll direction.\n */\nfunction watchScroll(viewAreaElement, callback) {\n  let debounceScroll = function(evt) {\n    if (rAF) {\n      return;\n    }\n    // schedule an invocation of scroll for next animation frame.\n    rAF = window.requestAnimationFrame(function viewAreaElementScrolled() {\n      rAF = null;\n\n      let currentX = viewAreaElement.scrollLeft;\n      let lastX = state.lastX;\n      if (currentX !== lastX) {\n        state.right = currentX > lastX;\n      }\n      state.lastX = currentX;\n      let currentY = viewAreaElement.scrollTop;\n      let lastY = state.lastY;\n      if (currentY !== lastY) {\n        state.down = currentY > lastY;\n      }\n      state.lastY = currentY;\n      callback(state);\n    });\n  };\n\n  let state = {\n    right: true,\n    down: true,\n    lastX: viewAreaElement.scrollLeft,\n    lastY: viewAreaElement.scrollTop,\n    _eventHandler: debounceScroll,\n  };\n\n  let rAF = null;\n  viewAreaElement.addEventListener('scroll', debounceScroll, true);\n  return state;\n}\n\n/**\n * Helper function to parse query string (e.g. ?param1=value&parm2=...).\n */\nfunction parseQueryString(query) {\n  let parts = query.split('&');\n  let params = Object.create(null);\n  for (let i = 0, ii = parts.length; i < ii; ++i) {\n    let param = parts[i].split('=');\n    let key = param[0].toLowerCase();\n    let value = param.length > 1 ? param[1] : null;\n    params[decodeURIComponent(key)] = decodeURIComponent(value);\n  }\n  return params;\n}\n\n/**\n * Use binary search to find the index of the first item in a given array which\n * passes a given condition. The items are expected to be sorted in the sense\n * that if the condition is true for one item in the array, then it is also true\n * for all following items.\n *\n * @returns {Number} Index of the first array element to pass the test,\n *                   or |items.length| if no such element exists.\n */\nfunction binarySearchFirstItem(items, condition) {\n  let minIndex = 0;\n  let maxIndex = items.length - 1;\n\n  if (items.length === 0 || !condition(items[maxIndex])) {\n    return items.length;\n  }\n  if (condition(items[minIndex])) {\n    return minIndex;\n  }\n\n  while (minIndex < maxIndex) {\n    let currentIndex = (minIndex + maxIndex) >> 1;\n    let currentItem = items[currentIndex];\n    if (condition(currentItem)) {\n      maxIndex = currentIndex;\n    } else {\n      minIndex = currentIndex + 1;\n    }\n  }\n  return minIndex; /* === maxIndex */\n}\n\n/**\n *  Approximates float number as a fraction using Farey sequence (max order\n *  of 8).\n *  @param {number} x - Positive float number.\n *  @returns {Array} Estimated fraction: the first array item is a numerator,\n *                   the second one is a denominator.\n */\nfunction approximateFraction(x) {\n  // Fast paths for int numbers or their inversions.\n  if (Math.floor(x) === x) {\n    return [x, 1];\n  }\n  let xinv = 1 / x;\n  let limit = 8;\n  if (xinv > limit) {\n    return [1, limit];\n  } else if (Math.floor(xinv) === xinv) {\n    return [1, xinv];\n  }\n\n  let x_ = x > 1 ? xinv : x;\n  // a/b and c/d are neighbours in Farey sequence.\n  let a = 0, b = 1, c = 1, d = 1;\n  // Limiting search to order 8.\n  while (true) {\n    // Generating next term in sequence (order of q).\n    let p = a + c, q = b + d;\n    if (q > limit) {\n      break;\n    }\n    if (x_ <= p / q) {\n      c = p; d = q;\n    } else {\n      a = p; b = q;\n    }\n  }\n  let result;\n  // Select closest of the neighbours to x.\n  if (x_ - a / b < c / d - x_) {\n    result = x_ === x ? [a, b] : [b, a];\n  } else {\n    result = x_ === x ? [c, d] : [d, c];\n  }\n  return result;\n}\n\nfunction roundToDivide(x, div) {\n  let r = x % div;\n  return r === 0 ? x : Math.round(x - r + div);\n}\n\n/**\n * Gets the size of the specified page, converted from PDF units to inches.\n * @param {Object} An Object containing the properties: {Array} `view`,\n *   {number} `userUnit`, and {number} `rotate`.\n * @return {Object} An Object containing the properties: {number} `width`\n *   and {number} `height`, given in inches.\n */\nfunction getPageSizeInches({ view, userUnit, rotate, }) {\n  const [x1, y1, x2, y2] = view;\n  // We need to take the page rotation into account as well.\n  const changeOrientation = rotate % 180 !== 0;\n\n  const width = (x2 - x1) / 72 * userUnit;\n  const height = (y2 - y1) / 72 * userUnit;\n\n  return {\n    width: (changeOrientation ? height : width),\n    height: (changeOrientation ? width : height),\n  };\n}\n\n/**\n * Helper function for getVisibleElements.\n *\n * @param {number} index - initial guess at the first visible element\n * @param {Array} views - array of pages, into which `index` is an index\n * @param {number} top - the top of the scroll pane\n * @returns {number} less than or equal to `index` that is definitely at or\n *   before the first visible element in `views`, but not by too much. (Usually,\n *   this will be the first element in the first partially visible row in\n *   `views`, although sometimes it goes back one row further.)\n */\nfunction backtrackBeforeAllVisibleElements(index, views, top) {\n  // binarySearchFirstItem's assumption is that the input is ordered, with only\n  // one index where the conditions flips from false to true: [false ...,\n  // true...]. With vertical scrolling and spreads, it is possible to have\n  // [false ..., true, false, true ...]. With wrapped scrolling we can have a\n  // similar sequence, with many more mixed true and false in the middle.\n  //\n  // So there is no guarantee that the binary search yields the index of the\n  // first visible element. It could have been any of the other visible elements\n  // that were preceded by a hidden element.\n\n  // Of course, if either this element or the previous (hidden) element is also\n  // the first element, there's nothing to worry about.\n  if (index < 2) {\n    return index;\n  }\n\n  // That aside, the possible cases are represented below.\n  //\n  //     ****  = fully hidden\n  //     A*B*  = mix of partially visible and/or hidden pages\n  //     CDEF  = fully visible\n  //\n  // (1) Binary search could have returned A, in which case we can stop.\n  // (2) Binary search could also have returned B, in which case we need to\n  // check the whole row.\n  // (3) Binary search could also have returned C, in which case we need to\n  // check the whole previous row.\n  //\n  // There's one other possibility:\n  //\n  //     ****  = fully hidden\n  //     ABCD  = mix of fully and/or partially visible pages\n  //\n  // (4) Binary search could only have returned A.\n\n  // Initially assume that we need to find the beginning of the current row\n  // (case 1, 2, or 4), which means finding a page that is above the current\n  // page's top. If the found page is partially visible, we're definitely not in\n  // case 3, and this assumption is correct.\n  let elt = views[index].div;\n  let pageTop = elt.offsetTop + elt.clientTop;\n\n  if (pageTop >= top) {\n    // The found page is fully visible, so we're actually either in case 3 or 4,\n    // and unfortunately we can't tell the difference between them without\n    // scanning the entire previous row, so we just conservatively assume that\n    // we do need to backtrack to that row. In both cases, the previous page is\n    // in the previous row, so use its top instead.\n    elt = views[index - 1].div;\n    pageTop = elt.offsetTop + elt.clientTop;\n  }\n\n  // Now we backtrack to the first page that still has its bottom below\n  // `pageTop`, which is the top of a page in the first visible row (unless\n  // we're in case 4, in which case it's the row before that).\n  // `index` is found by binary search, so the page at `index - 1` is\n  // invisible and we can start looking for potentially visible pages from\n  // `index - 2`. (However, if this loop terminates on its first iteration,\n  // which is the case when pages are stacked vertically, `index` should remain\n  // unchanged, so we use a distinct loop variable.)\n  for (let i = index - 2; i >= 0; --i) {\n    elt = views[i].div;\n    if (elt.offsetTop + elt.clientTop + elt.clientHeight <= pageTop) {\n      // We have reached the previous row, so stop now.\n      // This loop is expected to terminate relatively quickly because the\n      // number of pages per row is expected to be small.\n      break;\n    }\n    index = i;\n  }\n  return index;\n}\n\n/**\n * Generic helper to find out what elements are visible within a scroll pane.\n *\n * Well, pretty generic. There are some assumptions placed on the elements\n * referenced by `views`:\n *   - If `horizontal`, no left of any earlier element is to the right of the\n *     left of any later element.\n *   - Otherwise, `views` can be split into contiguous rows where, within a row,\n *     no top of any element is below the bottom of any other element, and\n *     between rows, no bottom of any element in an earlier row is below the\n *     top of any element in a later row.\n *\n * (Here, top, left, etc. all refer to the padding edge of the element in\n * question. For pages, that ends up being equivalent to the bounding box of the\n * rendering canvas. Earlier and later refer to index in `views`, not page\n * layout.)\n *\n * @param scrollEl {HTMLElement} - a container that can possibly scroll\n * @param views {Array} - objects with a `div` property that contains an\n *   HTMLElement, which should all be descendents of `scrollEl` satisfying the\n *   above layout assumptions\n * @param sortByVisibility {boolean} - if true, the returned elements are sorted\n *   in descending order of the percent of their padding box that is visible\n * @param horizontal {boolean} - if true, the elements are assumed to be laid\n *   out horizontally instead of vertically\n * @returns {Object} `{ first, last, views: [{ id, x, y, view, percent }] }`\n */\nfunction getVisibleElements(scrollEl, views, sortByVisibility = false,\n                            horizontal = false) {\n  let top = scrollEl.scrollTop, bottom = top + scrollEl.clientHeight;\n  let left = scrollEl.scrollLeft, right = left + scrollEl.clientWidth;\n\n  // Throughout this \"generic\" function, comments will assume we're working with\n  // PDF document pages, which is the most important and complex case. In this\n  // case, the visible elements we're actually interested is the page canvas,\n  // which is contained in a wrapper which adds no padding/border/margin, which\n  // is itself contained in `view.div` which adds no padding (but does add a\n  // border). So, as specified in this function's doc comment, this function\n  // does all of its work on the padding edge of the provided views, starting at\n  // offsetLeft/Top (which includes margin) and adding clientLeft/Top (which is\n  // the border). Adding clientWidth/Height gets us the bottom-right corner of\n  // the padding edge.\n  function isElementBottomAfterViewTop(view) {\n    let element = view.div;\n    let elementBottom =\n      element.offsetTop + element.clientTop + element.clientHeight;\n    return elementBottom > top;\n  }\n  function isElementRightAfterViewLeft(view) {\n    let element = view.div;\n    let elementRight =\n      element.offsetLeft + element.clientLeft + element.clientWidth;\n    return elementRight > left;\n  }\n\n  let visible = [], view, element;\n  let currentHeight, viewHeight, viewBottom, hiddenHeight;\n  let currentWidth, viewWidth, viewRight, hiddenWidth;\n  let percentVisible;\n  let firstVisibleElementInd = views.length === 0 ? 0 :\n    binarySearchFirstItem(views, horizontal ? isElementRightAfterViewLeft :\n                                              isElementBottomAfterViewTop);\n\n  if (views.length > 0 && !horizontal) {\n    // In wrapped scrolling (or vertical scrolling with spreads), with some page\n    // sizes, isElementBottomAfterViewTop doesn't satisfy the binary search\n    // condition: there can be pages with bottoms above the view top between\n    // pages with bottoms below. This function detects and corrects that error;\n    // see it for more comments.\n    firstVisibleElementInd =\n      backtrackBeforeAllVisibleElements(firstVisibleElementInd, views, top);\n  }\n\n  // lastEdge acts as a cutoff for us to stop looping, because we know all\n  // subsequent pages will be hidden.\n  //\n  // When using wrapped scrolling or vertical scrolling with spreads, we can't\n  // simply stop the first time we reach a page below the bottom of the view;\n  // the tops of subsequent pages on the same row could still be visible. In\n  // horizontal scrolling, we don't have that issue, so we can stop as soon as\n  // we pass `right`, without needing the code below that handles the -1 case.\n  let lastEdge = horizontal ? right : -1;\n\n  for (let i = firstVisibleElementInd, ii = views.length; i < ii; i++) {\n    view = views[i];\n    element = view.div;\n    currentWidth = element.offsetLeft + element.clientLeft;\n    currentHeight = element.offsetTop + element.clientTop;\n    viewWidth = element.clientWidth;\n    viewHeight = element.clientHeight;\n    viewRight = currentWidth + viewWidth;\n    viewBottom = currentHeight + viewHeight;\n\n    if (lastEdge === -1) {\n      // As commented above, this is only needed in non-horizontal cases.\n      // Setting lastEdge to the bottom of the first page that is partially\n      // visible ensures that the next page fully below lastEdge is on the\n      // next row, which has to be fully hidden along with all subsequent rows.\n      if (viewBottom >= bottom) {\n        lastEdge = viewBottom;\n      }\n    } else if ((horizontal ? currentWidth : currentHeight) > lastEdge) {\n      break;\n    }\n\n    if (viewBottom <= top || currentHeight >= bottom ||\n        viewRight <= left || currentWidth >= right) {\n      continue;\n    }\n\n    hiddenHeight = Math.max(0, top - currentHeight) +\n      Math.max(0, viewBottom - bottom);\n    hiddenWidth = Math.max(0, left - currentWidth) +\n      Math.max(0, viewRight - right);\n    percentVisible = ((viewHeight - hiddenHeight) * (viewWidth - hiddenWidth) *\n      100 / viewHeight / viewWidth) | 0;\n\n    visible.push({\n      id: view.id,\n      x: currentWidth,\n      y: currentHeight,\n      view,\n      percent: percentVisible,\n    });\n  }\n\n  let first = visible[0];\n  let last = visible[visible.length - 1];\n\n  if (sortByVisibility) {\n    visible.sort(function(a, b) {\n      let pc = a.percent - b.percent;\n      if (Math.abs(pc) > 0.001) {\n        return -pc;\n      }\n      return a.id - b.id; // ensure stability\n    });\n  }\n  return { first, last, views: visible, };\n}\n\n/**\n * Event handler to suppress context menu.\n */\nfunction noContextMenuHandler(evt) {\n  evt.preventDefault();\n}\n\nfunction isDataSchema(url) {\n  let i = 0, ii = url.length;\n  while (i < ii && url[i].trim() === '') {\n    i++;\n  }\n  return url.substring(i, i + 5).toLowerCase() === 'data:';\n}\n\n/**\n * Returns the filename or guessed filename from the url (see issue 3455).\n * @param {string} url - The original PDF location.\n * @param {string} defaultFilename - The value returned if the filename is\n *   unknown, or the protocol is unsupported.\n * @returns {string} Guessed PDF filename.\n */\nfunction getPDFFileNameFromURL(url, defaultFilename = 'document.pdf') {\n  if (typeof url !== 'string') {\n    return defaultFilename;\n  }\n  if (isDataSchema(url)) {\n    console.warn('getPDFFileNameFromURL: ' +\n                 'ignoring \"data:\" URL for performance reasons.');\n    return defaultFilename;\n  }\n  const reURI = /^(?:(?:[^:]+:)?\\/\\/[^\\/]+)?([^?#]*)(\\?[^#]*)?(#.*)?$/;\n  //            SCHEME        HOST         1.PATH  2.QUERY   3.REF\n  // Pattern to get last matching NAME.pdf\n  const reFilename = /[^\\/?#=]+\\.pdf\\b(?!.*\\.pdf\\b)/i;\n  let splitURI = reURI.exec(url);\n  let suggestedFilename = reFilename.exec(splitURI[1]) ||\n                          reFilename.exec(splitURI[2]) ||\n                          reFilename.exec(splitURI[3]);\n  if (suggestedFilename) {\n    suggestedFilename = suggestedFilename[0];\n    if (suggestedFilename.includes('%')) {\n      // URL-encoded %2Fpath%2Fto%2Ffile.pdf should be file.pdf\n      try {\n        suggestedFilename =\n          reFilename.exec(decodeURIComponent(suggestedFilename))[0];\n      } catch (ex) { // Possible (extremely rare) errors:\n        // URIError \"Malformed URI\", e.g. for \"%AA.pdf\"\n        // TypeError \"null has no properties\", e.g. for \"%2F.pdf\"\n      }\n    }\n  }\n  return suggestedFilename || defaultFilename;\n}\n\nfunction normalizeWheelEventDelta(evt) {\n  let delta = Math.sqrt(evt.deltaX * evt.deltaX + evt.deltaY * evt.deltaY);\n  let angle = Math.atan2(evt.deltaY, evt.deltaX);\n  if (-0.25 * Math.PI < angle && angle < 0.75 * Math.PI) {\n    // All that is left-up oriented has to change the sign.\n    delta = -delta;\n  }\n\n  const MOUSE_DOM_DELTA_PIXEL_MODE = 0;\n  const MOUSE_DOM_DELTA_LINE_MODE = 1;\n  const MOUSE_PIXELS_PER_LINE = 30;\n  const MOUSE_LINES_PER_PAGE = 30;\n\n  // Converts delta to per-page units\n  if (evt.deltaMode === MOUSE_DOM_DELTA_PIXEL_MODE) {\n    delta /= MOUSE_PIXELS_PER_LINE * MOUSE_LINES_PER_PAGE;\n  } else if (evt.deltaMode === MOUSE_DOM_DELTA_LINE_MODE) {\n    delta /= MOUSE_LINES_PER_PAGE;\n  }\n  return delta;\n}\n\nfunction isValidRotation(angle) {\n  return Number.isInteger(angle) && angle % 90 === 0;\n}\n\nfunction isPortraitOrientation(size) {\n  return size.width <= size.height;\n}\n\nconst WaitOnType = {\n  EVENT: 'event',\n  TIMEOUT: 'timeout',\n};\n\n/**\n * @typedef {Object} WaitOnEventOrTimeoutParameters\n * @property {Object} target - The event target, can for example be:\n *   `window`, `document`, a DOM element, or an {EventBus} instance.\n * @property {string} name - The name of the event.\n * @property {number} delay - The delay, in milliseconds, after which the\n *   timeout occurs (if the event wasn't already dispatched).\n */\n\n/**\n * Allows waiting for an event or a timeout, whichever occurs first.\n * Can be used to ensure that an action always occurs, even when an event\n * arrives late or not at all.\n *\n * @param {WaitOnEventOrTimeoutParameters}\n * @returns {Promise} A promise that is resolved with a {WaitOnType} value.\n */\nfunction waitOnEventOrTimeout({ target, name, delay = 0, }) {\n  return new Promise(function(resolve, reject) {\n    if (typeof target !== 'object' || !(name && typeof name === 'string') ||\n        !(Number.isInteger(delay) && delay >= 0)) {\n      throw new Error('waitOnEventOrTimeout - invalid parameters.');\n    }\n\n    function handler(type) {\n      if (target instanceof EventBus) {\n        target.off(name, eventHandler);\n      } else {\n        target.removeEventListener(name, eventHandler);\n      }\n\n      if (timeout) {\n        clearTimeout(timeout);\n      }\n      resolve(type);\n    }\n\n    const eventHandler = handler.bind(null, WaitOnType.EVENT);\n    if (target instanceof EventBus) {\n      target.on(name, eventHandler);\n    } else {\n      target.addEventListener(name, eventHandler);\n    }\n\n    const timeoutHandler = handler.bind(null, WaitOnType.TIMEOUT);\n    let timeout = setTimeout(timeoutHandler, delay);\n  });\n}\n\n/**\n * Promise that is resolved when DOM window becomes visible.\n */\nlet animationStarted = new Promise(function (resolve) {\n  if ((typeof PDFJSDev !== 'undefined' && PDFJSDev.test('LIB')) &&\n      typeof window === 'undefined') {\n    // Prevent \"ReferenceError: window is not defined\" errors when running the\n    // unit-tests in Node.js/Travis.\n    setTimeout(resolve, 20);\n    return;\n  }\n  window.requestAnimationFrame(resolve);\n});\n\n/**\n * Simple event bus for an application. Listeners are attached using the\n * `on` and `off` methods. To raise an event, the `dispatch` method shall be\n * used.\n */\nclass EventBus {\n  constructor({ dispatchToDOM = false, } = {}) {\n    this._listeners = Object.create(null);\n    this._dispatchToDOM = dispatchToDOM === true;\n  }\n\n  on(eventName, listener) {\n    let eventListeners = this._listeners[eventName];\n    if (!eventListeners) {\n      eventListeners = [];\n      this._listeners[eventName] = eventListeners;\n    }\n    eventListeners.push(listener);\n  }\n\n  off(eventName, listener) {\n    let eventListeners = this._listeners[eventName];\n    let i;\n    if (!eventListeners || ((i = eventListeners.indexOf(listener)) < 0)) {\n      return;\n    }\n    eventListeners.splice(i, 1);\n  }\n\n  dispatch(eventName) {\n    let eventListeners = this._listeners[eventName];\n    if (!eventListeners || eventListeners.length === 0) {\n      if (this._dispatchToDOM) {\n        const args = Array.prototype.slice.call(arguments, 1);\n        this._dispatchDOMEvent(eventName, args);\n      }\n      return;\n    }\n    // Passing all arguments after the eventName to the listeners.\n    const args = Array.prototype.slice.call(arguments, 1);\n    // Making copy of the listeners array in case if it will be modified\n    // during dispatch.\n    eventListeners.slice(0).forEach(function (listener) {\n      listener.apply(null, args);\n    });\n    if (this._dispatchToDOM) {\n      this._dispatchDOMEvent(eventName, args);\n    }\n  }\n\n  /**\n   * @private\n   */\n  _dispatchDOMEvent(eventName, args = null) {\n    if (!this._dispatchToDOM) {\n      return;\n    }\n    const details = Object.create(null);\n    if (args && args.length > 0) {\n      const obj = args[0];\n      for (let key in obj) {\n        const value = obj[key];\n        if (key === 'source') {\n          if (value === window || value === document) {\n            return; // No need to re-dispatch (already) global events.\n          }\n          continue; // Ignore the `source` property.\n        }\n        details[key] = value;\n      }\n    }\n    const event = document.createEvent('CustomEvent');\n    event.initCustomEvent(eventName, true, true, details);\n    document.dispatchEvent(event);\n  }\n}\n\nfunction clamp(v, min, max) {\n  return Math.min(Math.max(v, min), max);\n}\n\nclass ProgressBar {\n  constructor(id, { height, width, units, } = {}) {\n    this.visible = true;\n\n    // Fetch the sub-elements for later.\n    this.div = document.querySelector(id + ' .progress');\n    // Get the loading bar element, so it can be resized to fit the viewer.\n    this.bar = this.div.parentNode;\n\n    // Get options, with sensible defaults.\n    this.height = height || 100;\n    this.width = width || 100;\n    this.units = units || '%';\n\n    // Initialize heights.\n    this.div.style.height = this.height + this.units;\n    this.percent = 0;\n  }\n\n  _updateBar() {\n    if (this._indeterminate) {\n      this.div.classList.add('indeterminate');\n      this.div.style.width = this.width + this.units;\n      return;\n    }\n\n    this.div.classList.remove('indeterminate');\n    let progressSize = this.width * this._percent / 100;\n    this.div.style.width = progressSize + this.units;\n  }\n\n  get percent() {\n    return this._percent;\n  }\n\n  set percent(val) {\n    this._indeterminate = isNaN(val);\n    this._percent = clamp(val, 0, 100);\n    this._updateBar();\n  }\n\n  setWidth(viewer) {\n    if (!viewer) {\n      return;\n    }\n    let container = viewer.parentNode;\n    let scrollbarWidth = container.offsetWidth - viewer.offsetWidth;\n    if (scrollbarWidth > 0) {\n      this.bar.setAttribute('style', 'width: calc(100% - ' +\n                                     scrollbarWidth + 'px);');\n    }\n  }\n\n  hide() {\n    if (!this.visible) {\n      return;\n    }\n    this.visible = false;\n    this.bar.classList.add('hidden');\n    document.body.classList.remove('loadingInProgress');\n  }\n\n  show() {\n    if (this.visible) {\n      return;\n    }\n    this.visible = true;\n    document.body.classList.add('loadingInProgress');\n    this.bar.classList.remove('hidden');\n  }\n}\n\n/**\n * Moves all elements of an array that satisfy condition to the end of the\n * array, preserving the order of the rest.\n */\nfunction moveToEndOfArray(arr, condition) {\n  const moved = [], len = arr.length;\n  let write = 0;\n  for (let read = 0; read < len; ++read) {\n    if (condition(arr[read])) {\n      moved.push(arr[read]);\n    } else {\n      arr[write] = arr[read];\n      ++write;\n    }\n  }\n  for (let read = 0; write < len; ++read, ++write) {\n    arr[write] = moved[read];\n  }\n}\n\nexport {\n  CSS_UNITS,\n  DEFAULT_SCALE_VALUE,\n  DEFAULT_SCALE,\n  MIN_SCALE,\n  MAX_SCALE,\n  UNKNOWN_SCALE,\n  MAX_AUTO_SCALE,\n  SCROLLBAR_PADDING,\n  VERTICAL_PADDING,\n  isValidRotation,\n  isPortraitOrientation,\n  PresentationModeState,\n  RendererType,\n  TextLayerMode,\n  NullL10n,\n  EventBus,\n  ProgressBar,\n  getPDFFileNameFromURL,\n  noContextMenuHandler,\n  parseQueryString,\n  backtrackBeforeAllVisibleElements, // only exported for testing\n  getVisibleElements,\n  roundToDivide,\n  getPageSizeInches,\n  approximateFraction,\n  getOutputScale,\n  scrollIntoView,\n  watchScroll,\n  binarySearchFirstItem,\n  normalizeWheelEventDelta,\n  animationStarted,\n  WaitOnType,\n  waitOnEventOrTimeout,\n  moveToEndOfArray,\n};\n","/* Copyright 2016 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* globals module, __non_webpack_require__ */\n\n'use strict';\n\nlet pdfjsLib;\nif (typeof window !== 'undefined' && window['pdfjs-dist/build/pdf']) {\n  pdfjsLib = window['pdfjs-dist/build/pdf'];\n} else {\n  pdfjsLib = __non_webpack_require__('../build/pdf.js');\n}\nmodule.exports = pdfjsLib;\n","/* Copyright 2017 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { GrabToPan } from './grab_to_pan';\n\nconst CursorTool = {\n  SELECT: 0, // The default value.\n  HAND: 1,\n  ZOOM: 2,\n};\n\n/**\n * @typedef {Object} PDFCursorToolsOptions\n * @property {HTMLDivElement} container - The document container.\n * @property {EventBus} eventBus - The application event bus.\n * @property {number} cursorToolOnLoad - (optional) The cursor tool that will be\n *   enabled on load; the constants from {CursorTool} should be used.\n *   The default value is `CursorTool.SELECT`.\n */\n\nclass PDFCursorTools {\n  /**\n   * @param {PDFCursorToolsOptions} options\n   */\n  constructor({ container, eventBus, cursorToolOnLoad = CursorTool.SELECT, }) {\n    this.container = container;\n    this.eventBus = eventBus;\n\n    this.active = CursorTool.SELECT;\n    this.activeBeforePresentationMode = null;\n\n    this.handTool = new GrabToPan({\n      element: this.container,\n    });\n\n    this._addEventListeners();\n\n    // Defer the initial `switchTool` call, to give other viewer components\n    // time to initialize *and* register 'cursortoolchanged' event listeners.\n    Promise.resolve().then(() => {\n      this.switchTool(cursorToolOnLoad);\n    });\n  }\n\n  /**\n   * @returns {number} One of the values in {CursorTool}.\n   */\n  get activeTool() {\n    return this.active;\n  }\n\n  /**\n   * NOTE: This method is ignored while Presentation Mode is active.\n   * @param {number} tool - The cursor mode that should be switched to,\n   *                        must be one of the values in {CursorTool}.\n   */\n  switchTool(tool) {\n    if (this.activeBeforePresentationMode !== null) {\n      return; // Cursor tools cannot be used in Presentation Mode.\n    }\n    if (tool === this.active) {\n      return; // The requested tool is already active.\n    }\n\n    let disableActiveTool = () => {\n      switch (this.active) {\n        case CursorTool.SELECT:\n          break;\n        case CursorTool.HAND:\n          this.handTool.deactivate();\n          break;\n        case CursorTool.ZOOM:\n          /* falls through */\n      }\n    };\n\n    switch (tool) { // Enable the new cursor tool.\n      case CursorTool.SELECT:\n        disableActiveTool();\n        break;\n      case CursorTool.HAND:\n        disableActiveTool();\n        this.handTool.activate();\n        break;\n      case CursorTool.ZOOM:\n        /* falls through */\n      default:\n        console.error(`switchTool: \"${tool}\" is an unsupported value.`);\n        return;\n    }\n    // Update the active tool *after* it has been validated above,\n    // in order to prevent setting it to an invalid state.\n    this.active = tool;\n\n    this._dispatchEvent();\n  }\n\n  /**\n   * @private\n   */\n  _dispatchEvent() {\n    this.eventBus.dispatch('cursortoolchanged', {\n      source: this,\n      tool: this.active,\n    });\n  }\n\n  /**\n   * @private\n   */\n  _addEventListeners() {\n    this.eventBus.on('switchcursortool', (evt) => {\n      this.switchTool(evt.tool);\n    });\n\n    this.eventBus.on('presentationmodechanged', (evt) => {\n      if (evt.switchInProgress) {\n        return;\n      }\n      let previouslyActive;\n\n      if (evt.active) {\n        previouslyActive = this.active;\n\n        this.switchTool(CursorTool.SELECT);\n        this.activeBeforePresentationMode = previouslyActive;\n      } else {\n        previouslyActive = this.activeBeforePresentationMode;\n\n        this.activeBeforePresentationMode = null;\n        this.switchTool(previouslyActive);\n      }\n    });\n  }\n}\n\nexport {\n  CursorTool,\n  PDFCursorTools,\n};\n","/* Copyright 2013 Rob Wu <rob@robwu.nl>\n * https://github.com/Rob--W/grab-to-pan.js\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* eslint-disable no-var */\n\n/**\n * Construct a GrabToPan instance for a given HTML element.\n * @param options.element {Element}\n * @param options.ignoreTarget {function} optional. See `ignoreTarget(node)`\n * @param options.onActiveChanged {function(boolean)} optional. Called\n *  when grab-to-pan is (de)activated. The first argument is a boolean that\n *  shows whether grab-to-pan is activated.\n */\nfunction GrabToPan(options) {\n  this.element = options.element;\n  this.document = options.element.ownerDocument;\n  if (typeof options.ignoreTarget === 'function') {\n    this.ignoreTarget = options.ignoreTarget;\n  }\n  this.onActiveChanged = options.onActiveChanged;\n\n  // Bind the contexts to ensure that `this` always points to\n  // the GrabToPan instance.\n  this.activate = this.activate.bind(this);\n  this.deactivate = this.deactivate.bind(this);\n  this.toggle = this.toggle.bind(this);\n  this._onmousedown = this._onmousedown.bind(this);\n  this._onmousemove = this._onmousemove.bind(this);\n  this._endPan = this._endPan.bind(this);\n\n  // This overlay will be inserted in the document when the mouse moves during\n  // a grab operation, to ensure that the cursor has the desired appearance.\n  var overlay = this.overlay = document.createElement('div');\n  overlay.className = 'grab-to-pan-grabbing';\n}\nGrabToPan.prototype = {\n  /**\n   * Class name of element which can be grabbed\n   */\n  CSS_CLASS_GRAB: 'grab-to-pan-grab',\n\n  /**\n   * Bind a mousedown event to the element to enable grab-detection.\n   */\n  activate: function GrabToPan_activate() {\n    if (!this.active) {\n      this.active = true;\n      this.element.addEventListener('mousedown', this._onmousedown, true);\n      this.element.classList.add(this.CSS_CLASS_GRAB);\n      if (this.onActiveChanged) {\n        this.onActiveChanged(true);\n      }\n    }\n  },\n\n  /**\n   * Removes all events. Any pending pan session is immediately stopped.\n   */\n  deactivate: function GrabToPan_deactivate() {\n    if (this.active) {\n      this.active = false;\n      this.element.removeEventListener('mousedown', this._onmousedown, true);\n      this._endPan();\n      this.element.classList.remove(this.CSS_CLASS_GRAB);\n      if (this.onActiveChanged) {\n        this.onActiveChanged(false);\n      }\n    }\n  },\n\n  toggle: function GrabToPan_toggle() {\n    if (this.active) {\n      this.deactivate();\n    } else {\n      this.activate();\n    }\n  },\n\n  /**\n   * Whether to not pan if the target element is clicked.\n   * Override this method to change the default behaviour.\n   *\n   * @param node {Element} The target of the event\n   * @return {boolean} Whether to not react to the click event.\n   */\n  ignoreTarget: function GrabToPan_ignoreTarget(node) {\n    // Use matchesSelector to check whether the clicked element\n    // is (a child of) an input element / link\n    return node[matchesSelector](\n      'a[href], a[href] *, input, textarea, button, button *, select, option'\n    );\n  },\n\n  /**\n   * @private\n   */\n  _onmousedown: function GrabToPan__onmousedown(event) {\n    if (event.button !== 0 || this.ignoreTarget(event.target)) {\n      return;\n    }\n    if (event.originalTarget) {\n      try {\n        // eslint-disable-next-line no-unused-expressions\n        event.originalTarget.tagName;\n      } catch (e) {\n        // Mozilla-specific: element is a scrollbar (XUL element)\n        return;\n      }\n    }\n\n    this.scrollLeftStart = this.element.scrollLeft;\n    this.scrollTopStart = this.element.scrollTop;\n    this.clientXStart = event.clientX;\n    this.clientYStart = event.clientY;\n    this.document.addEventListener('mousemove', this._onmousemove, true);\n    this.document.addEventListener('mouseup', this._endPan, true);\n    // When a scroll event occurs before a mousemove, assume that the user\n    // dragged a scrollbar (necessary for Opera Presto, Safari and IE)\n    // (not needed for Chrome/Firefox)\n    this.element.addEventListener('scroll', this._endPan, true);\n    event.preventDefault();\n    event.stopPropagation();\n\n    var focusedElement = document.activeElement;\n    if (focusedElement && !focusedElement.contains(event.target)) {\n      focusedElement.blur();\n    }\n  },\n\n  /**\n   * @private\n   */\n  _onmousemove: function GrabToPan__onmousemove(event) {\n    this.element.removeEventListener('scroll', this._endPan, true);\n    if (isLeftMouseReleased(event)) {\n      this._endPan();\n      return;\n    }\n    var xDiff = event.clientX - this.clientXStart;\n    var yDiff = event.clientY - this.clientYStart;\n    var scrollTop = this.scrollTopStart - yDiff;\n    var scrollLeft = this.scrollLeftStart - xDiff;\n    if (this.element.scrollTo) {\n      this.element.scrollTo({\n        top: scrollTop,\n        left: scrollLeft,\n        behavior: 'instant',\n      });\n    } else {\n      this.element.scrollTop = scrollTop;\n      this.element.scrollLeft = scrollLeft;\n    }\n    if (!this.overlay.parentNode) {\n      document.body.appendChild(this.overlay);\n    }\n  },\n\n  /**\n   * @private\n   */\n  _endPan: function GrabToPan__endPan() {\n    this.element.removeEventListener('scroll', this._endPan, true);\n    this.document.removeEventListener('mousemove', this._onmousemove, true);\n    this.document.removeEventListener('mouseup', this._endPan, true);\n    // Note: ChildNode.remove doesn't throw if the parentNode is undefined.\n    this.overlay.remove();\n  },\n};\n\n// Get the correct (vendor-prefixed) name of the matches method.\nvar matchesSelector;\n['webkitM', 'mozM', 'msM', 'oM', 'm'].some(function(prefix) {\n  var name = prefix + 'atches';\n  if (name in document.documentElement) {\n    matchesSelector = name;\n  }\n  name += 'Selector';\n  if (name in document.documentElement) {\n    matchesSelector = name;\n  }\n  return matchesSelector; // If found, then truthy, and [].some() ends.\n});\n\n// Browser sniffing because it's impossible to feature-detect\n// whether event.which for onmousemove is reliable\nvar isNotIEorIsIE10plus = !document.documentMode || document.documentMode > 9;\nvar chrome = window.chrome;\nvar isChrome15OrOpera15plus = chrome && (chrome.webstore || chrome.app);\n//                                       ^ Chrome 15+       ^ Opera 15+\nvar isSafari6plus = /Apple/.test(navigator.vendor) &&\n                    /Version\\/([6-9]\\d*|[1-5]\\d+)/.test(navigator.userAgent);\n\n/**\n * Whether the left mouse is not pressed.\n * @param event {MouseEvent}\n * @return {boolean} True if the left mouse button is not pressed.\n *                   False if unsure or if the left mouse button is pressed.\n */\nfunction isLeftMouseReleased(event) {\n  if ('buttons' in event && isNotIEorIsIE10plus) {\n    // http://www.w3.org/TR/DOM-Level-3-Events/#events-MouseEvent-buttons\n    // Firefox 15+\n    // Internet Explorer 10+\n    return !(event.buttons & 1);\n  }\n  if (isChrome15OrOpera15plus || isSafari6plus) {\n    // Chrome 14+\n    // Opera 15+\n    // Safari 6.0+\n    return event.which === 0;\n  }\n}\n\nexport {\n  GrabToPan,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst CLEANUP_TIMEOUT = 30000;\n\nconst RenderingStates = {\n  INITIAL: 0,\n  RUNNING: 1,\n  PAUSED: 2,\n  FINISHED: 3,\n};\n\n/**\n * Controls rendering of the views for pages and thumbnails.\n */\nclass PDFRenderingQueue {\n  constructor() {\n    this.pdfViewer = null;\n    this.pdfThumbnailViewer = null;\n    this.onIdle = null;\n    this.highestPriorityPage = null;\n    this.idleTimeout = null;\n    this.printing = false;\n    this.isThumbnailViewEnabled = false;\n  }\n\n  /**\n   * @param {PDFViewer} pdfViewer\n   */\n  setViewer(pdfViewer) {\n    this.pdfViewer = pdfViewer;\n  }\n\n  /**\n   * @param {PDFThumbnailViewer} pdfThumbnailViewer\n   */\n  setThumbnailViewer(pdfThumbnailViewer) {\n    this.pdfThumbnailViewer = pdfThumbnailViewer;\n  }\n\n  /**\n   * @param {IRenderableView} view\n   * @returns {boolean}\n   */\n  isHighestPriority(view) {\n    return this.highestPriorityPage === view.renderingId;\n  }\n\n  /**\n   * @param {Object} currentlyVisiblePages\n   */\n  renderHighestPriority(currentlyVisiblePages) {\n    if (this.idleTimeout) {\n      clearTimeout(this.idleTimeout);\n      this.idleTimeout = null;\n    }\n\n    // Pages have a higher priority than thumbnails, so check them first.\n    if (this.pdfViewer.forceRendering(currentlyVisiblePages)) {\n      return;\n    }\n    // No pages needed rendering, so check thumbnails.\n    if (this.pdfThumbnailViewer && this.isThumbnailViewEnabled) {\n      if (this.pdfThumbnailViewer.forceRendering()) {\n        return;\n      }\n    }\n\n    if (this.printing) {\n      // If printing is currently ongoing do not reschedule cleanup.\n      return;\n    }\n\n    if (this.onIdle) {\n      this.idleTimeout = setTimeout(this.onIdle.bind(this), CLEANUP_TIMEOUT);\n    }\n  }\n\n  /**\n   * @param {Object} visible\n   * @param {Array} views\n   * @param {boolean} scrolledDown\n   */\n  getHighestPriority(visible, views, scrolledDown) {\n    /**\n     * The state has changed. Figure out which page has the highest priority to\n     * render next (if any).\n     *\n     * Priority:\n     * 1. visible pages\n     * 2. if last scrolled down, the page after the visible pages, or\n     *    if last scrolled up, the page before the visible pages\n     */\n    let visibleViews = visible.views;\n\n    let numVisible = visibleViews.length;\n    if (numVisible === 0) {\n      return false;\n    }\n    for (let i = 0; i < numVisible; ++i) {\n      let view = visibleViews[i].view;\n      if (!this.isViewFinished(view)) {\n        return view;\n      }\n    }\n\n    // All the visible views have rendered; try to render next/previous pages.\n    if (scrolledDown) {\n      let nextPageIndex = visible.last.id;\n      // IDs start at 1, so no need to add 1.\n      if (views[nextPageIndex] && !this.isViewFinished(views[nextPageIndex])) {\n        return views[nextPageIndex];\n      }\n    } else {\n      let previousPageIndex = visible.first.id - 2;\n      if (views[previousPageIndex] &&\n          !this.isViewFinished(views[previousPageIndex])) {\n        return views[previousPageIndex];\n      }\n    }\n    // Everything that needs to be rendered has been.\n    return null;\n  }\n\n  /**\n   * @param {IRenderableView} view\n   * @returns {boolean}\n   */\n  isViewFinished(view) {\n    return view.renderingState === RenderingStates.FINISHED;\n  }\n\n  /**\n   * Render a page or thumbnail view. This calls the appropriate function\n   * based on the views state. If the view is already rendered it will return\n   * `false`.\n   *\n   * @param {IRenderableView} view\n   */\n  renderView(view) {\n    switch (view.renderingState) {\n      case RenderingStates.FINISHED:\n        return false;\n      case RenderingStates.PAUSED:\n        this.highestPriorityPage = view.renderingId;\n        view.resume();\n        break;\n      case RenderingStates.RUNNING:\n        this.highestPriorityPage = view.renderingId;\n        break;\n      case RenderingStates.INITIAL:\n        this.highestPriorityPage = view.renderingId;\n        let continueRendering = () => {\n          this.renderHighestPriority();\n        };\n        view.draw().then(continueRendering, continueRendering);\n        break;\n    }\n    return true;\n  }\n}\n\nexport {\n  RenderingStates,\n  PDFRenderingQueue,\n};\n","/* Copyright 2016 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { NullL10n } from './ui_utils';\nimport { RenderingStates } from './pdf_rendering_queue';\n\nconst UI_NOTIFICATION_CLASS = 'pdfSidebarNotification';\n\nconst SidebarView = {\n  NONE: 0,\n  THUMBS: 1,\n  OUTLINE: 2,\n  ATTACHMENTS: 3,\n};\n\n/**\n * @typedef {Object} PDFSidebarOptions\n * @property {PDFViewer} pdfViewer - The document viewer.\n * @property {PDFThumbnailViewer} pdfThumbnailViewer - The thumbnail viewer.\n * @property {HTMLDivElement} outerContainer - The outer container\n *   (encasing both the viewer and sidebar elements).\n * @property {HTMLDivElement} viewerContainer - The viewer container\n *   (in which the viewer element is placed).\n * @property {HTMLButtonElement} toggleButton - The button used for\n *   opening/closing the sidebar.\n * @property {HTMLButtonElement} thumbnailButton - The button used to show\n *   the thumbnail view.\n * @property {HTMLButtonElement} outlineButton - The button used to show\n *   the outline view.\n * @property {HTMLButtonElement} attachmentsButton - The button used to show\n *   the attachments view.\n * @property {HTMLDivElement} thumbnailView - The container in which\n *   the thumbnails are placed.\n * @property {HTMLDivElement} outlineView - The container in which\n *   the outline is placed.\n * @property {HTMLDivElement} attachmentsView - The container in which\n *   the attachments are placed.\n * @property {boolean} disableNotification - (optional) Disable the notification\n *   for documents containing outline/attachments. The default value is `false`.\n */\n\nclass PDFSidebar {\n  /**\n   * @param {PDFSidebarOptions} options\n   * @param {EventBus} eventBus - The application event bus.\n   * @param {IL10n} l10n - Localization service.\n   */\n  constructor(options, eventBus, l10n = NullL10n) {\n    this.isOpen = false;\n    this.active = SidebarView.THUMBS;\n    this.isInitialViewSet = false;\n\n    /**\n     * Callback used when the sidebar has been opened/closed, to ensure that\n     * the viewers (PDFViewer/PDFThumbnailViewer) are updated correctly.\n     */\n    this.onToggled = null;\n\n    this.pdfViewer = options.pdfViewer;\n    this.pdfThumbnailViewer = options.pdfThumbnailViewer;\n\n    this.outerContainer = options.outerContainer;\n    this.viewerContainer = options.viewerContainer;\n    this.toggleButton = options.toggleButton;\n\n    this.thumbnailButton = options.thumbnailButton;\n    this.outlineButton = options.outlineButton;\n    this.attachmentsButton = options.attachmentsButton;\n\n    this.thumbnailView = options.thumbnailView;\n    this.outlineView = options.outlineView;\n    this.attachmentsView = options.attachmentsView;\n\n    this.disableNotification = options.disableNotification || false;\n\n    this.eventBus = eventBus;\n    this.l10n = l10n;\n\n    this._addEventListeners();\n  }\n\n  reset() {\n    this.isInitialViewSet = false;\n\n    this._hideUINotification(null);\n    this.switchView(SidebarView.THUMBS);\n\n    this.outlineButton.disabled = false;\n    this.attachmentsButton.disabled = false;\n  }\n\n  /**\n   * @returns {number} One of the values in {SidebarView}.\n   */\n  get visibleView() {\n    return (this.isOpen ? this.active : SidebarView.NONE);\n  }\n\n  get isThumbnailViewVisible() {\n    return (this.isOpen && this.active === SidebarView.THUMBS);\n  }\n\n  get isOutlineViewVisible() {\n    return (this.isOpen && this.active === SidebarView.OUTLINE);\n  }\n\n  get isAttachmentsViewVisible() {\n    return (this.isOpen && this.active === SidebarView.ATTACHMENTS);\n  }\n\n  /**\n   * @param {number} view - The sidebar view that should become visible,\n   *                        must be one of the values in {SidebarView}.\n   */\n  setInitialView(view = SidebarView.NONE) {\n    if (this.isInitialViewSet) {\n      return;\n    }\n    this.isInitialViewSet = true;\n\n    if (this.isOpen && view === SidebarView.NONE) {\n      this._dispatchEvent();\n      // If the user has already manually opened the sidebar,\n      // immediately closing it would be bad UX.\n      return;\n    }\n    let isViewPreserved = (view === this.visibleView);\n    this.switchView(view, /* forceOpen */ true);\n\n    if (isViewPreserved) {\n      // Prevent dispatching two back-to-back `sidebarviewchanged` events,\n      // since `this.switchView` dispatched the event if the view changed.\n      this._dispatchEvent();\n    }\n  }\n\n  /**\n   * @param {number} view - The sidebar view that should be switched to,\n   *                        must be one of the values in {SidebarView}.\n   * @param {boolean} forceOpen - (optional) Ensure that the sidebar is open.\n   *                              The default value is `false`.\n   */\n  switchView(view, forceOpen = false) {\n    if (view === SidebarView.NONE) {\n      this.close();\n      return;\n    }\n    let isViewChanged = (view !== this.active);\n    let shouldForceRendering = false;\n\n    switch (view) {\n      case SidebarView.THUMBS:\n        this.thumbnailButton.classList.add('toggled');\n        this.outlineButton.classList.remove('toggled');\n        this.attachmentsButton.classList.remove('toggled');\n\n        this.thumbnailView.classList.remove('hidden');\n        this.outlineView.classList.add('hidden');\n        this.attachmentsView.classList.add('hidden');\n\n        if (this.isOpen && isViewChanged) {\n          this._updateThumbnailViewer();\n          shouldForceRendering = true;\n        }\n        break;\n      case SidebarView.OUTLINE:\n        if (this.outlineButton.disabled) {\n          return;\n        }\n        this.thumbnailButton.classList.remove('toggled');\n        this.outlineButton.classList.add('toggled');\n        this.attachmentsButton.classList.remove('toggled');\n\n        this.thumbnailView.classList.add('hidden');\n        this.outlineView.classList.remove('hidden');\n        this.attachmentsView.classList.add('hidden');\n        break;\n      case SidebarView.ATTACHMENTS:\n        if (this.attachmentsButton.disabled) {\n          return;\n        }\n        this.thumbnailButton.classList.remove('toggled');\n        this.outlineButton.classList.remove('toggled');\n        this.attachmentsButton.classList.add('toggled');\n\n        this.thumbnailView.classList.add('hidden');\n        this.outlineView.classList.add('hidden');\n        this.attachmentsView.classList.remove('hidden');\n        break;\n      default:\n        console.error('PDFSidebar_switchView: \"' + view +\n                      '\" is an unsupported value.');\n        return;\n    }\n    // Update the active view *after* it has been validated above,\n    // in order to prevent setting it to an invalid state.\n    this.active = view | 0;\n\n    if (forceOpen && !this.isOpen) {\n      this.open();\n      return; // NOTE: Opening will trigger rendering, and dispatch the event.\n    }\n    if (shouldForceRendering) {\n      this._forceRendering();\n    }\n    if (isViewChanged) {\n      this._dispatchEvent();\n    }\n    this._hideUINotification(this.active);\n  }\n\n  open() {\n    if (this.isOpen) {\n      return;\n    }\n    this.isOpen = true;\n    this.toggleButton.classList.add('toggled');\n\n    this.outerContainer.classList.add('sidebarMoving');\n    this.outerContainer.classList.add('sidebarOpen');\n\n    if (this.active === SidebarView.THUMBS) {\n      this._updateThumbnailViewer();\n    }\n    this._forceRendering();\n    this._dispatchEvent();\n\n    this._hideUINotification(this.active);\n  }\n\n  close() {\n    if (!this.isOpen) {\n      return;\n    }\n    this.isOpen = false;\n    this.toggleButton.classList.remove('toggled');\n\n    this.outerContainer.classList.add('sidebarMoving');\n    this.outerContainer.classList.remove('sidebarOpen');\n\n    this._forceRendering();\n    this._dispatchEvent();\n  }\n\n  toggle() {\n    if (this.isOpen) {\n      this.close();\n    } else {\n      this.open();\n    }\n  }\n\n  /**\n   * @private\n   */\n  _dispatchEvent() {\n    this.eventBus.dispatch('sidebarviewchanged', {\n      source: this,\n      view: this.visibleView,\n    });\n  }\n\n  /**\n   * @private\n   */\n  _forceRendering() {\n    if (this.onToggled) {\n      this.onToggled();\n    } else { // Fallback\n      this.pdfViewer.forceRendering();\n      this.pdfThumbnailViewer.forceRendering();\n    }\n  }\n\n  /**\n   * @private\n   */\n  _updateThumbnailViewer() {\n    let { pdfViewer, pdfThumbnailViewer, } = this;\n\n    // Use the rendered pages to set the corresponding thumbnail images.\n    let pagesCount = pdfViewer.pagesCount;\n    for (let pageIndex = 0; pageIndex < pagesCount; pageIndex++) {\n      let pageView = pdfViewer.getPageView(pageIndex);\n      if (pageView && pageView.renderingState === RenderingStates.FINISHED) {\n        let thumbnailView = pdfThumbnailViewer.getThumbnail(pageIndex);\n        thumbnailView.setImage(pageView);\n      }\n    }\n    pdfThumbnailViewer.scrollThumbnailIntoView(pdfViewer.currentPageNumber);\n  }\n\n  /**\n   * @private\n   */\n  _showUINotification(view) {\n    if (this.disableNotification) {\n      return;\n    }\n\n    this.l10n.get('toggle_sidebar_notification.title', null,\n                  'Toggle Sidebar (document contains outline/attachments)').\n        then((msg) => {\n      this.toggleButton.title = msg;\n    });\n\n    if (!this.isOpen) {\n      // Only show the notification on the `toggleButton` if the sidebar is\n      // currently closed, to avoid unnecessarily bothering the user.\n      this.toggleButton.classList.add(UI_NOTIFICATION_CLASS);\n    } else if (view === this.active) {\n      // If the sidebar is currently open *and* the `view` is visible, do not\n      // bother the user with a notification on the corresponding button.\n      return;\n    }\n\n    switch (view) {\n      case SidebarView.OUTLINE:\n        this.outlineButton.classList.add(UI_NOTIFICATION_CLASS);\n        break;\n      case SidebarView.ATTACHMENTS:\n        this.attachmentsButton.classList.add(UI_NOTIFICATION_CLASS);\n        break;\n    }\n  }\n\n  /**\n   * @private\n   */\n  _hideUINotification(view) {\n    if (this.disableNotification) {\n      return;\n    }\n\n    let removeNotification = (view) => {\n      switch (view) {\n        case SidebarView.OUTLINE:\n          this.outlineButton.classList.remove(UI_NOTIFICATION_CLASS);\n          break;\n        case SidebarView.ATTACHMENTS:\n          this.attachmentsButton.classList.remove(UI_NOTIFICATION_CLASS);\n          break;\n      }\n    };\n\n    if (!this.isOpen && view !== null) {\n      // Only hide the notifications when the sidebar is currently open,\n      // or when it is being reset (i.e. `view === null`).\n      return;\n    }\n    this.toggleButton.classList.remove(UI_NOTIFICATION_CLASS);\n\n    if (view !== null) {\n      removeNotification(view);\n      return;\n    }\n    for (view in SidebarView) { // Remove all sidebar notifications on reset.\n      removeNotification(SidebarView[view]);\n    }\n\n    this.l10n.get('toggle_sidebar.title', null, 'Toggle Sidebar').\n        then((msg) => {\n      this.toggleButton.title = msg;\n    });\n  }\n\n  /**\n   * @private\n   */\n  _addEventListeners() {\n    this.viewerContainer.addEventListener('transitionend', (evt) => {\n      if (evt.target === this.viewerContainer) {\n        this.outerContainer.classList.remove('sidebarMoving');\n      }\n    });\n\n    // Buttons for switching views.\n    this.thumbnailButton.addEventListener('click', () => {\n      this.switchView(SidebarView.THUMBS);\n    });\n\n    this.outlineButton.addEventListener('click', () => {\n      this.switchView(SidebarView.OUTLINE);\n    });\n    this.outlineButton.addEventListener('dblclick', () => {\n      this.eventBus.dispatch('toggleoutlinetree', { source: this, });\n    });\n\n    this.attachmentsButton.addEventListener('click', () => {\n      this.switchView(SidebarView.ATTACHMENTS);\n    });\n\n    // Disable/enable views.\n    this.eventBus.on('outlineloaded', (evt) => {\n      let outlineCount = evt.outlineCount;\n\n      this.outlineButton.disabled = !outlineCount;\n\n      if (outlineCount) {\n        this._showUINotification(SidebarView.OUTLINE);\n      } else if (this.active === SidebarView.OUTLINE) {\n        // If the outline view was opened during document load, switch away\n        // from it if it turns out that the document has no outline.\n        this.switchView(SidebarView.THUMBS);\n      }\n    });\n\n    this.eventBus.on('attachmentsloaded', (evt) => {\n      if (evt.attachmentsCount) {\n        this.attachmentsButton.disabled = false;\n\n        this._showUINotification(SidebarView.ATTACHMENTS);\n        return;\n      }\n\n      // Attempt to avoid temporarily disabling, and switching away from, the\n      // attachment view for documents that do not contain proper attachments\n      // but *only* FileAttachment annotations. Hence we defer those operations\n      // slightly to allow time for parsing any FileAttachment annotations that\n      // may be present on the *initially* rendered page of the document.\n      Promise.resolve().then(() => {\n        if (this.attachmentsView.hasChildNodes()) {\n          // FileAttachment annotations were appended to the attachment view.\n          return;\n        }\n        this.attachmentsButton.disabled = true;\n\n        if (this.active === SidebarView.ATTACHMENTS) {\n          // If the attachment view was opened during document load, switch away\n          // from it if it turns out that the document has no attachments.\n          this.switchView(SidebarView.THUMBS);\n        }\n      });\n    });\n\n    // Update the thumbnailViewer, if visible, when exiting presentation mode.\n    this.eventBus.on('presentationmodechanged', (evt) => {\n      if (!evt.active && !evt.switchInProgress && this.isThumbnailViewVisible) {\n        this._updateThumbnailViewer();\n      }\n    });\n  }\n}\n\nexport {\n  SidebarView,\n  PDFSidebar,\n};\n","/* Copyright 2018 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { apiCompatibilityParams } from 'pdfjs-lib';\nimport { viewerCompatibilityParams } from './viewer_compatibility';\n\nconst OptionKind = {\n  VIEWER: 'viewer',\n  API: 'api',\n  WORKER: 'worker',\n};\n\n/**\n * PLEASE NOTE: To avoid introducing unnecessary dependencies, we specify the\n *              values below *explicitly* rather than relying on imported types;\n *              compare with the format of `default_preferences.json`.\n */\nconst defaultOptions = {\n  cursorToolOnLoad: {\n    /** @type {number} */\n    value: 0,\n    kind: OptionKind.VIEWER,\n  },\n  defaultUrl: {\n    /** @type {string} */\n    value: 'compressed.tracemonkey-pldi-09.pdf',\n    kind: OptionKind.VIEWER,\n  },\n  defaultZoomValue: {\n    /** @type {string} */\n    value: '',\n    kind: OptionKind.VIEWER,\n  },\n  disableHistory: {\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.VIEWER,\n  },\n  disablePageLabels: {\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.VIEWER,\n  },\n  disablePageMode: {\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.VIEWER,\n  },\n  enablePrintAutoRotate: {\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.VIEWER,\n  },\n  enableWebGL: {\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.VIEWER,\n  },\n  eventBusDispatchToDOM: {\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.VIEWER,\n  },\n  externalLinkRel: {\n    /** @type {string} */\n    value: 'noopener noreferrer nofollow',\n    kind: OptionKind.VIEWER,\n  },\n  externalLinkTarget: {\n    /** @type {number} */\n    value: 0,\n    kind: OptionKind.VIEWER,\n  },\n  imageResourcesPath: {\n    /** @type {string} */\n    value: './images/',\n    kind: OptionKind.VIEWER,\n  },\n  /**\n   * The `locale` is, conditionally, defined below.\n   */\n  maxCanvasPixels: {\n    /** @type {number} */\n    value: viewerCompatibilityParams.maxCanvasPixels || 16777216,\n    kind: OptionKind.VIEWER,\n  },\n  pdfBugEnabled: {\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.VIEWER,\n  },\n  renderer: {\n    /** @type {string} */\n    value: 'canvas',\n    kind: OptionKind.VIEWER,\n  },\n  renderInteractiveForms: {\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.VIEWER,\n  },\n  showPreviousViewOnLoad: {\n    /** @type {boolean} */\n    value: true,\n    kind: OptionKind.VIEWER,\n  },\n  sidebarViewOnLoad: {\n    /** @type {number} */\n    value: 0,\n    kind: OptionKind.VIEWER,\n  },\n  scrollModeOnLoad: {\n    /** @type {number} */\n    value: 0,\n    kind: OptionKind.VIEWER,\n  },\n  spreadModeOnLoad: {\n    /** @type {number} */\n    value: 0,\n    kind: OptionKind.VIEWER,\n  },\n  textLayerMode: {\n    /** @type {number} */\n    value: 1,\n    kind: OptionKind.VIEWER,\n  },\n  useOnlyCssZoom: {\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.VIEWER,\n  },\n\n  cMapPacked: {\n    /** @type {boolean} */\n    value: true,\n    kind: OptionKind.API,\n  },\n  cMapUrl: {\n    /** @type {string} */\n    value: (typeof PDFJSDev === 'undefined' || !PDFJSDev.test('PRODUCTION') ?\n            '../external/bcmaps/' : '../web/cmaps/'),\n    kind: OptionKind.API,\n  },\n  disableAutoFetch: {\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.API,\n  },\n  disableCreateObjectURL: {\n    /** @type {boolean} */\n    value: apiCompatibilityParams.disableCreateObjectURL || false,\n    kind: OptionKind.API,\n  },\n  disableFontFace: {\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.API,\n  },\n  disableRange: {\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.API,\n  },\n  disableStream: {\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.API,\n  },\n  isEvalSupported: {\n    /** @type {boolean} */\n    value: true,\n    kind: OptionKind.API,\n  },\n  maxImageSize: {\n    /** @type {number} */\n    value: -1,\n    kind: OptionKind.API,\n  },\n  pdfBug: {\n    /** @type {boolean} */\n    value: false,\n    kind: OptionKind.API,\n  },\n  postMessageTransfers: {\n    /** @type {boolean} */\n    value: true,\n    kind: OptionKind.API,\n  },\n  verbosity: {\n    /** @type {number} */\n    value: 1,\n    kind: OptionKind.API,\n  },\n\n  workerPort: {\n    /** @type {Object} */\n    value: null,\n    kind: OptionKind.WORKER,\n  },\n  workerSrc: {\n    /** @type {string} */\n    value: (typeof PDFJSDev === 'undefined' || !PDFJSDev.test('PRODUCTION') ?\n            '../src/worker_loader.js' : '../build/pdf.worker.js'),\n    kind: OptionKind.WORKER,\n  },\n};\nif (typeof PDFJSDev === 'undefined' ||\n    PDFJSDev.test('!PRODUCTION || GENERIC')) {\n  defaultOptions.locale = {\n    /** @type {string} */\n    value: (typeof navigator !== 'undefined' ? navigator.language : 'en-US'),\n    kind: OptionKind.VIEWER,\n  };\n}\n\nconst userOptions = Object.create(null);\n\nclass AppOptions {\n  constructor() {\n    throw new Error('Cannot initialize AppOptions.');\n  }\n\n  static get(name) {\n    let defaultOption = defaultOptions[name], userOption = userOptions[name];\n    if (userOption !== undefined) {\n      return userOption;\n    }\n    return (defaultOption !== undefined ? defaultOption.value : undefined);\n  }\n\n  static getAll(kind = null) {\n    let options = Object.create(null);\n    for (let name in defaultOptions) {\n      let defaultOption = defaultOptions[name], userOption = userOptions[name];\n      if (kind && defaultOption.kind !== kind) {\n        continue;\n      }\n      options[name] = (userOption !== undefined ?\n                       userOption : defaultOption.value);\n    }\n    return options;\n  }\n\n  static set(name, value) {\n    userOptions[name] = value;\n  }\n\n  static remove(name) {\n    delete userOptions[name];\n  }\n}\n\nexport {\n  AppOptions,\n  OptionKind,\n};\n","/* Copyright 2018 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nlet compatibilityParams = Object.create(null);\nif (typeof PDFJSDev === 'undefined' || PDFJSDev.test('GENERIC')) {\n  const userAgent =\n    (typeof navigator !== 'undefined' && navigator.userAgent) || '';\n  const isAndroid = /Android/.test(userAgent);\n  const isIOS = /\\b(iPad|iPhone|iPod)(?=;)/.test(userAgent);\n\n  // Limit canvas size to 5 mega-pixels on mobile.\n  // Support: Android, iOS\n  (function checkCanvasSizeLimitation() {\n    if (isIOS || isAndroid) {\n      compatibilityParams.maxCanvasPixels = 5242880;\n    }\n  })();\n}\n\nexports.viewerCompatibilityParams = Object.freeze(compatibilityParams);\n","/* Copyright 2016 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { EventBus } from './ui_utils';\n\n// Attaching to the application event bus to dispatch events to the DOM for\n// backwards viewer API compatibility.\nfunction attachDOMEventsToEventBus(eventBus) {\n  eventBus.on('documentload', function() {\n    let event = document.createEvent('CustomEvent');\n    event.initCustomEvent('documentload', true, true, {});\n    window.dispatchEvent(event);\n  });\n  eventBus.on('pagerendered', function(evt) {\n    let event = document.createEvent('CustomEvent');\n    event.initCustomEvent('pagerendered', true, true, {\n      pageNumber: evt.pageNumber,\n      cssTransform: evt.cssTransform,\n    });\n    evt.source.div.dispatchEvent(event);\n  });\n  eventBus.on('textlayerrendered', function(evt) {\n    let event = document.createEvent('CustomEvent');\n    event.initCustomEvent('textlayerrendered', true, true, {\n      pageNumber: evt.pageNumber,\n    });\n    evt.source.textLayerDiv.dispatchEvent(event);\n  });\n  eventBus.on('pagechange', function(evt) {\n    let event = document.createEvent('UIEvents');\n    event.initUIEvent('pagechange', true, true, window, 0);\n    event.pageNumber = evt.pageNumber;\n    evt.source.container.dispatchEvent(event);\n  });\n  eventBus.on('pagesinit', function(evt) {\n    let event = document.createEvent('CustomEvent');\n    event.initCustomEvent('pagesinit', true, true, null);\n    evt.source.container.dispatchEvent(event);\n  });\n  eventBus.on('pagesloaded', function(evt) {\n    let event = document.createEvent('CustomEvent');\n    event.initCustomEvent('pagesloaded', true, true, {\n      pagesCount: evt.pagesCount,\n    });\n    evt.source.container.dispatchEvent(event);\n  });\n  eventBus.on('scalechange', function(evt) {\n    let event = document.createEvent('UIEvents');\n    event.initUIEvent('scalechange', true, true, window, 0);\n    event.scale = evt.scale;\n    event.presetValue = evt.presetValue;\n    evt.source.container.dispatchEvent(event);\n  });\n  eventBus.on('updateviewarea', function(evt) {\n    let event = document.createEvent('UIEvents');\n    event.initUIEvent('updateviewarea', true, true, window, 0);\n    event.location = evt.location;\n    evt.source.container.dispatchEvent(event);\n  });\n  eventBus.on('find', function(evt) {\n    if (evt.source === window) {\n      return; // event comes from FirefoxCom, no need to replicate\n    }\n    let event = document.createEvent('CustomEvent');\n    event.initCustomEvent('find' + evt.type, true, true, {\n      query: evt.query,\n      phraseSearch: evt.phraseSearch,\n      caseSensitive: evt.caseSensitive,\n      highlightAll: evt.highlightAll,\n      findPrevious: evt.findPrevious,\n    });\n    window.dispatchEvent(event);\n  });\n  eventBus.on('attachmentsloaded', function(evt) {\n    let event = document.createEvent('CustomEvent');\n    event.initCustomEvent('attachmentsloaded', true, true, {\n      attachmentsCount: evt.attachmentsCount,\n    });\n    evt.source.container.dispatchEvent(event);\n  });\n  eventBus.on('sidebarviewchanged', function(evt) {\n    let event = document.createEvent('CustomEvent');\n    event.initCustomEvent('sidebarviewchanged', true, true, {\n      view: evt.view,\n    });\n    evt.source.outerContainer.dispatchEvent(event);\n  });\n  eventBus.on('pagemode', function(evt) {\n    let event = document.createEvent('CustomEvent');\n    event.initCustomEvent('pagemode', true, true, {\n      mode: evt.mode,\n    });\n    evt.source.pdfViewer.container.dispatchEvent(event);\n  });\n  eventBus.on('namedaction', function(evt) {\n    let event = document.createEvent('CustomEvent');\n    event.initCustomEvent('namedaction', true, true, {\n      action: evt.action,\n    });\n    evt.source.pdfViewer.container.dispatchEvent(event);\n  });\n  eventBus.on('presentationmodechanged', function(evt) {\n    let event = document.createEvent('CustomEvent');\n    event.initCustomEvent('presentationmodechanged', true, true, {\n      active: evt.active,\n      switchInProgress: evt.switchInProgress,\n    });\n    window.dispatchEvent(event);\n  });\n  eventBus.on('outlineloaded', function(evt) {\n    let event = document.createEvent('CustomEvent');\n    event.initCustomEvent('outlineloaded', true, true, {\n      outlineCount: evt.outlineCount,\n    });\n    evt.source.container.dispatchEvent(event);\n  });\n}\n\nlet globalEventBus = null;\nfunction getGlobalEventBus(dispatchToDOM = false) {\n  if (!globalEventBus) {\n    globalEventBus = new EventBus({ dispatchToDOM, });\n    if (!dispatchToDOM) {\n      attachDOMEventsToEventBus(globalEventBus);\n    }\n  }\n  return globalEventBus;\n}\n\nexport {\n  attachDOMEventsToEventBus,\n  getGlobalEventBus,\n};\n","/* Copyright 2014 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nclass OverlayManager {\n  constructor() {\n    this._overlays = {};\n    this._active = null;\n    this._keyDownBound = this._keyDown.bind(this);\n  }\n\n  get active() {\n    return this._active;\n  }\n\n  /**\n   * @param {string} name - The name of the overlay that is registered.\n   * @param {HTMLDivElement} element - The overlay's DOM element.\n   * @param {function} callerCloseMethod - (optional) The method that, if\n   *                   present, calls `OverlayManager.close` from the object\n   *                   registering the overlay. Access to this method is\n   *                   necessary in order to run cleanup code when e.g.\n   *                   the overlay is force closed. The default is `null`.\n   * @param {boolean} canForceClose - (optional) Indicates if opening the\n   *                  overlay closes an active overlay. The default is `false`.\n   * @returns {Promise} A promise that is resolved when the overlay has been\n   *                    registered.\n   */\n  async register(name, element, callerCloseMethod = null,\n                 canForceClose = false) {\n    let container;\n    if (!name || !element || !(container = element.parentNode)) {\n      throw new Error('Not enough parameters.');\n    } else if (this._overlays[name]) {\n      throw new Error('The overlay is already registered.');\n    }\n    this._overlays[name] = {\n      element,\n      container,\n      callerCloseMethod,\n      canForceClose,\n    };\n  }\n\n  /**\n   * @param {string} name - The name of the overlay that is unregistered.\n   * @returns {Promise} A promise that is resolved when the overlay has been\n   *                    unregistered.\n   */\n  async unregister(name) {\n    if (!this._overlays[name]) {\n      throw new Error('The overlay does not exist.');\n    } else if (this._active === name) {\n      throw new Error('The overlay cannot be removed while it is active.');\n    }\n    delete this._overlays[name];\n  }\n\n  /**\n   * @param {string} name - The name of the overlay that should be opened.\n   * @returns {Promise} A promise that is resolved when the overlay has been\n   *                    opened.\n   */\n  async open(name) {\n    if (!this._overlays[name]) {\n      throw new Error('The overlay does not exist.');\n    } else if (this._active) {\n      if (this._overlays[name].canForceClose) {\n        this._closeThroughCaller();\n      } else if (this._active === name) {\n        throw new Error('The overlay is already active.');\n      } else {\n        throw new Error('Another overlay is currently active.');\n      }\n    }\n    this._active = name;\n    this._overlays[this._active].element.classList.remove('hidden');\n    this._overlays[this._active].container.classList.remove('hidden');\n\n    window.addEventListener('keydown', this._keyDownBound);\n  }\n\n  /**\n   * @param {string} name - The name of the overlay that should be closed.\n   * @returns {Promise} A promise that is resolved when the overlay has been\n   *                    closed.\n   */\n  async close(name) {\n    if (!this._overlays[name]) {\n      throw new Error('The overlay does not exist.');\n    } else if (!this._active) {\n      throw new Error('The overlay is currently not active.');\n    } else if (this._active !== name) {\n      throw new Error('Another overlay is currently active.');\n    }\n    this._overlays[this._active].container.classList.add('hidden');\n    this._overlays[this._active].element.classList.add('hidden');\n    this._active = null;\n\n    window.removeEventListener('keydown', this._keyDownBound);\n  }\n\n  /**\n   * @private\n   */\n  _keyDown(evt) {\n    if (this._active && evt.keyCode === 27) { // Esc key.\n      this._closeThroughCaller();\n      evt.preventDefault();\n    }\n  }\n\n  /**\n   * @private\n   */\n  _closeThroughCaller() {\n    if (this._overlays[this._active].callerCloseMethod) {\n      this._overlays[this._active].callerCloseMethod();\n    }\n    if (this._active) {\n      this.close(this._active);\n    }\n  }\n}\n\nexport {\n  OverlayManager,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { NullL10n } from './ui_utils';\nimport { PasswordResponses } from 'pdfjs-lib';\n\n/**\n * @typedef {Object} PasswordPromptOptions\n * @property {string} overlayName - Name of the overlay for the overlay manager.\n * @property {HTMLDivElement} container - Div container for the overlay.\n * @property {HTMLParagraphElement} label - Label containing instructions for\n *                                          entering the password.\n * @property {HTMLInputElement} input - Input field for entering the password.\n * @property {HTMLButtonElement} submitButton - Button for submitting the\n *                                              password.\n * @property {HTMLButtonElement} cancelButton - Button for cancelling password\n *                                              entry.\n */\n\nclass PasswordPrompt {\n  /**\n   * @param {PasswordPromptOptions} options\n   * @param {OverlayManager} overlayManager - Manager for the viewer overlays.\n   * @param {IL10n} l10n - Localization service.\n   */\n  constructor(options, overlayManager, l10n = NullL10n) {\n    this.overlayName = options.overlayName;\n    this.container = options.container;\n    this.label = options.label;\n    this.input = options.input;\n    this.submitButton = options.submitButton;\n    this.cancelButton = options.cancelButton;\n    this.overlayManager = overlayManager;\n    this.l10n = l10n;\n\n    this.updateCallback = null;\n    this.reason = null;\n\n    // Attach the event listeners.\n    this.submitButton.addEventListener('click', this.verify.bind(this));\n    this.cancelButton.addEventListener('click', this.close.bind(this));\n    this.input.addEventListener('keydown', (e) => {\n      if (e.keyCode === 13) { // Enter key\n        this.verify();\n      }\n    });\n\n    this.overlayManager.register(this.overlayName, this.container,\n                                 this.close.bind(this), true);\n  }\n\n  open() {\n    this.overlayManager.open(this.overlayName).then(() => {\n      this.input.focus();\n\n      let promptString;\n      if (this.reason === PasswordResponses.INCORRECT_PASSWORD) {\n        promptString = this.l10n.get('password_invalid', null,\n          'Invalid password. Please try again.');\n      } else {\n        promptString = this.l10n.get('password_label', null,\n          'Enter the password to open this PDF file.');\n      }\n\n      promptString.then((msg) => {\n        this.label.textContent = msg;\n      });\n    });\n  }\n\n  close() {\n    this.overlayManager.close(this.overlayName).then(() => {\n      this.input.value = '';\n    });\n  }\n\n  verify() {\n    let password = this.input.value;\n    if (password && password.length > 0) {\n      this.close();\n      return this.updateCallback(password);\n    }\n  }\n\n  setUpdateCallback(updateCallback, reason) {\n    this.updateCallback = updateCallback;\n    this.reason = reason;\n  }\n}\n\nexport {\n  PasswordPrompt,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  createObjectURL, createPromiseCapability, getFilenameFromUrl,\n  removeNullCharacters\n} from 'pdfjs-lib';\n\n/**\n * @typedef {Object} PDFAttachmentViewerOptions\n * @property {HTMLDivElement} container - The viewer element.\n * @property {EventBus} eventBus - The application event bus.\n * @property {DownloadManager} downloadManager - The download manager.\n */\n\n/**\n * @typedef {Object} PDFAttachmentViewerRenderParameters\n * @property {Object|null} attachments - A lookup table of attachment objects.\n */\n\nclass PDFAttachmentViewer {\n  /**\n   * @param {PDFAttachmentViewerOptions} options\n   */\n  constructor({ container, eventBus, downloadManager, }) {\n    this.container = container;\n    this.eventBus = eventBus;\n    this.downloadManager = downloadManager;\n\n    this.reset();\n\n    this.eventBus.on('fileattachmentannotation',\n      this._appendAttachment.bind(this));\n  }\n\n  reset(keepRenderedCapability = false) {\n    this.attachments = null;\n\n    // Remove the attachments from the DOM.\n    this.container.textContent = '';\n\n    if (!keepRenderedCapability) {\n      // NOTE: The *only* situation in which the `_renderedCapability` should\n      //       not be replaced is when appending file attachment annotations.\n      this._renderedCapability = createPromiseCapability();\n    }\n  }\n\n  /**\n   * @private\n   */\n  _dispatchEvent(attachmentsCount) {\n    this._renderedCapability.resolve();\n\n    this.eventBus.dispatch('attachmentsloaded', {\n      source: this,\n      attachmentsCount,\n    });\n  }\n\n  /**\n   * @private\n   */\n  _bindPdfLink(button, content, filename) {\n    if (this.downloadManager.disableCreateObjectURL) {\n      throw new Error(\n        'bindPdfLink: Unsupported \"disableCreateObjectURL\" value.');\n    }\n    let blobUrl;\n    button.onclick = function() {\n      if (!blobUrl) {\n        blobUrl = createObjectURL(content, 'application/pdf');\n      }\n      let viewerUrl;\n      if (typeof PDFJSDev === 'undefined' || PDFJSDev.test('GENERIC')) {\n        // The current URL is the viewer, let's use it and append the file.\n        viewerUrl = '?file=' + encodeURIComponent(blobUrl + '#' + filename);\n      } else if (PDFJSDev.test('CHROME')) {\n        // In the Chrome extension, the URL is rewritten using the history API\n        // in viewer.js, so an absolute URL must be generated.\n        // eslint-disable-next-line no-undef\n        viewerUrl = chrome.runtime.getURL('/content/web/viewer.html') +\n          '?file=' + encodeURIComponent(blobUrl + '#' + filename);\n      } else if (PDFJSDev.test('FIREFOX || MOZCENTRAL')) {\n        // Let Firefox's content handler catch the URL and display the PDF.\n        viewerUrl = blobUrl + '?' + encodeURIComponent(filename);\n      }\n      window.open(viewerUrl);\n      return false;\n    };\n  }\n\n  /**\n   * @private\n   */\n  _bindLink(button, content, filename) {\n    button.onclick = () => {\n      this.downloadManager.downloadData(content, filename, '');\n      return false;\n    };\n  }\n\n  /**\n   * @param {PDFAttachmentViewerRenderParameters} params\n   */\n  render({ attachments, keepRenderedCapability = false, }) {\n    let attachmentsCount = 0;\n\n    if (this.attachments) {\n      this.reset(keepRenderedCapability === true);\n    }\n    this.attachments = attachments || null;\n\n    if (!attachments) {\n      this._dispatchEvent(attachmentsCount);\n      return;\n    }\n\n    let names = Object.keys(attachments).sort(function(a, b) {\n      return a.toLowerCase().localeCompare(b.toLowerCase());\n    });\n    attachmentsCount = names.length;\n\n    for (let i = 0; i < attachmentsCount; i++) {\n      let item = attachments[names[i]];\n      let filename = removeNullCharacters(getFilenameFromUrl(item.filename));\n\n      let div = document.createElement('div');\n      div.className = 'attachmentsItem';\n      let button = document.createElement('button');\n      button.textContent = filename;\n      if (/\\.pdf$/i.test(filename) &&\n          !this.downloadManager.disableCreateObjectURL) {\n        this._bindPdfLink(button, item.content, filename);\n      } else {\n        this._bindLink(button, item.content, filename);\n      }\n\n      div.appendChild(button);\n      this.container.appendChild(div);\n    }\n\n    this._dispatchEvent(attachmentsCount);\n  }\n\n  /**\n   * Used to append FileAttachment annotations to the sidebar.\n   * @private\n   */\n  _appendAttachment({ id, filename, content, }) {\n    this._renderedCapability.promise.then(() => {\n      let attachments = this.attachments;\n\n      if (!attachments) {\n        attachments = Object.create(null);\n      } else {\n        for (let name in attachments) {\n          if (id === name) {\n            return; // Ignore the new attachment if it already exists.\n          }\n        }\n      }\n      attachments[id] = {\n        filename,\n        content,\n      };\n      this.render({\n        attachments,\n        keepRenderedCapability: true,\n      });\n    });\n  }\n}\n\nexport {\n  PDFAttachmentViewer,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  getPageSizeInches, getPDFFileNameFromURL, isPortraitOrientation, NullL10n\n} from './ui_utils';\nimport { createPromiseCapability } from 'pdfjs-lib';\n\nconst DEFAULT_FIELD_CONTENT = '-';\n\n// See https://en.wikibooks.org/wiki/Lentis/Conversion_to_the_Metric_Standard_in_the_United_States\nconst NON_METRIC_LOCALES = ['en-us', 'en-lr', 'my'];\n\n// Should use the format: `width x height`, in portrait orientation.\n// See https://en.wikipedia.org/wiki/Paper_size\nconst US_PAGE_NAMES = {\n  '8.5x11': 'Letter',\n  '8.5x14': 'Legal',\n};\nconst METRIC_PAGE_NAMES = {\n  '297x420': 'A3',\n  '210x297': 'A4',\n};\n\nfunction getPageName(size, isPortrait, pageNames) {\n  const width = (isPortrait ? size.width : size.height);\n  const height = (isPortrait ? size.height : size.width);\n\n  return pageNames[`${width}x${height}`];\n}\n\n/**\n * @typedef {Object} PDFDocumentPropertiesOptions\n * @property {string} overlayName - Name/identifier for the overlay.\n * @property {Object} fields - Names and elements of the overlay's fields.\n * @property {HTMLDivElement} container - Div container for the overlay.\n * @property {HTMLButtonElement} closeButton - Button for closing the overlay.\n */\n\nclass PDFDocumentProperties {\n  /**\n   * @param {PDFDocumentPropertiesOptions} options\n   * @param {OverlayManager} overlayManager - Manager for the viewer overlays.\n   * @param {EventBus} eventBus - The application event bus.\n   * @param {IL10n} l10n - Localization service.\n   */\n  constructor({ overlayName, fields, container, closeButton, },\n              overlayManager, eventBus, l10n = NullL10n) {\n    this.overlayName = overlayName;\n    this.fields = fields;\n    this.container = container;\n    this.overlayManager = overlayManager;\n    this.l10n = l10n;\n\n    this._reset();\n\n    if (closeButton) { // Bind the event listener for the Close button.\n      closeButton.addEventListener('click', this.close.bind(this));\n    }\n    this.overlayManager.register(this.overlayName, this.container,\n                                 this.close.bind(this));\n\n    if (eventBus) {\n      eventBus.on('pagechanging', (evt) => {\n        this._currentPageNumber = evt.pageNumber;\n      });\n      eventBus.on('rotationchanging', (evt) => {\n        this._pagesRotation = evt.pagesRotation;\n      });\n    }\n\n    this._isNonMetricLocale = true; // The default viewer locale is 'en-us'.\n    l10n.getLanguage().then((locale) => {\n      this._isNonMetricLocale = NON_METRIC_LOCALES.includes(locale);\n    });\n  }\n\n  /**\n   * Open the document properties overlay.\n   */\n  open() {\n    let freezeFieldData = (data) => {\n      Object.defineProperty(this, 'fieldData', {\n        value: Object.freeze(data),\n        writable: false,\n        enumerable: true,\n        configurable: true,\n      });\n    };\n\n    Promise.all([this.overlayManager.open(this.overlayName),\n                 this._dataAvailableCapability.promise]).then(() => {\n      const currentPageNumber = this._currentPageNumber;\n      const pagesRotation = this._pagesRotation;\n\n      // If the document properties were previously fetched (for this PDF file),\n      // just update the dialog immediately to avoid redundant lookups.\n      if (this.fieldData &&\n          currentPageNumber === this.fieldData['_currentPageNumber'] &&\n          pagesRotation === this.fieldData['_pagesRotation']) {\n        this._updateUI();\n        return;\n      }\n\n      // Get the document properties.\n      this.pdfDocument.getMetadata().then(\n          ({ info, metadata, contentDispositionFilename, }) => {\n        return Promise.all([\n          info,\n          metadata,\n          contentDispositionFilename || getPDFFileNameFromURL(this.url || ''),\n          this._parseFileSize(this.maybeFileSize),\n          this._parseDate(info.CreationDate),\n          this._parseDate(info.ModDate),\n          this.pdfDocument.getPage(currentPageNumber).then((pdfPage) => {\n            return this._parsePageSize(getPageSizeInches(pdfPage),\n                                       pagesRotation);\n          }),\n          this._parseLinearization(info.IsLinearized),\n        ]);\n      }).then(([info, metadata, fileName, fileSize, creationDate, modDate,\n                pageSize, isLinearized]) => {\n        freezeFieldData({\n          'fileName': fileName,\n          'fileSize': fileSize,\n          'title': info.Title,\n          'author': info.Author,\n          'subject': info.Subject,\n          'keywords': info.Keywords,\n          'creationDate': creationDate,\n          'modificationDate': modDate,\n          'creator': info.Creator,\n          'producer': info.Producer,\n          'version': info.PDFFormatVersion,\n          'pageCount': this.pdfDocument.numPages,\n          'pageSize': pageSize,\n          'linearized': isLinearized,\n          '_currentPageNumber': currentPageNumber,\n          '_pagesRotation': pagesRotation,\n        });\n        this._updateUI();\n\n        // Get the correct fileSize, since it may not have been set (if\n        // `this.setFileSize` wasn't called) or may be incorrectly set.\n        return this.pdfDocument.getDownloadInfo();\n      }).then(({ length, }) => {\n        this.maybeFileSize = length;\n        return this._parseFileSize(length);\n      }).then((fileSize) => {\n        if (fileSize === this.fieldData['fileSize']) {\n          return; // The fileSize has already been correctly set.\n        }\n        let data = Object.assign(Object.create(null), this.fieldData);\n        data['fileSize'] = fileSize;\n\n        freezeFieldData(data);\n        this._updateUI();\n      });\n    });\n  }\n\n  /**\n   * Close the document properties overlay.\n   */\n  close() {\n    this.overlayManager.close(this.overlayName);\n  }\n\n  /**\n   * Set a reference to the PDF document and the URL in order\n   * to populate the overlay fields with the document properties.\n   * Note that the overlay will contain no information if this method\n   * is not called.\n   *\n   * @param {PDFDocumentProxy} pdfDocument - A reference to the PDF document.\n   * @param {string} url - The URL of the document.\n   */\n  setDocument(pdfDocument, url = null) {\n    if (this.pdfDocument) {\n      this._reset();\n      this._updateUI(true);\n    }\n    if (!pdfDocument) {\n      return;\n    }\n    this.pdfDocument = pdfDocument;\n    this.url = url;\n\n    this._dataAvailableCapability.resolve();\n  }\n\n  /**\n   * Set the file size of the PDF document. This method is used to\n   * update the file size in the document properties overlay once it\n   * is known so we do not have to wait until the entire file is loaded.\n   *\n   * @param {number} fileSize - The file size of the PDF document.\n   */\n  setFileSize(fileSize) {\n    if (Number.isInteger(fileSize) && fileSize > 0) {\n      this.maybeFileSize = fileSize;\n    }\n  }\n\n  /**\n   * @private\n   */\n  _reset() {\n    this.pdfDocument = null;\n    this.url = null;\n\n    this.maybeFileSize = 0;\n    delete this.fieldData;\n    this._dataAvailableCapability = createPromiseCapability();\n    this._currentPageNumber = 1;\n    this._pagesRotation = 0;\n  }\n\n  /**\n   * Always updates all of the dialog fields, to prevent inconsistent UI state.\n   * NOTE: If the contents of a particular field is neither a non-empty string,\n   *       nor a number, it will fall back to `DEFAULT_FIELD_CONTENT`.\n   * @private\n   */\n  _updateUI(reset = false) {\n    if (reset || !this.fieldData) {\n      for (let id in this.fields) {\n        this.fields[id].textContent = DEFAULT_FIELD_CONTENT;\n      }\n      return;\n    }\n    if (this.overlayManager.active !== this.overlayName) {\n      // Don't bother updating the dialog if has already been closed,\n      // since it will be updated the next time `this.open` is called.\n      return;\n    }\n    for (let id in this.fields) {\n      let content = this.fieldData[id];\n      this.fields[id].textContent = (content || content === 0) ?\n                                    content : DEFAULT_FIELD_CONTENT;\n    }\n  }\n\n  /**\n   * @private\n   */\n  _parseFileSize(fileSize = 0) {\n    let kb = fileSize / 1024;\n    if (!kb) {\n      return Promise.resolve(undefined);\n    } else if (kb < 1024) {\n      return this.l10n.get('document_properties_kb', {\n        size_kb: (+kb.toPrecision(3)).toLocaleString(),\n        size_b: fileSize.toLocaleString(),\n      }, '{{size_kb}} KB ({{size_b}} bytes)');\n    }\n    return this.l10n.get('document_properties_mb', {\n      size_mb: (+(kb / 1024).toPrecision(3)).toLocaleString(),\n      size_b: fileSize.toLocaleString(),\n    }, '{{size_mb}} MB ({{size_b}} bytes)');\n  }\n\n  /**\n   * @private\n   */\n  _parsePageSize(pageSizeInches, pagesRotation) {\n    if (!pageSizeInches) {\n      return Promise.resolve(undefined);\n    }\n    // Take the viewer rotation into account as well; compare with Adobe Reader.\n    if (pagesRotation % 180 !== 0) {\n      pageSizeInches = {\n        width: pageSizeInches.height,\n        height: pageSizeInches.width,\n      };\n    }\n    const isPortrait = isPortraitOrientation(pageSizeInches);\n\n    let sizeInches = {\n      width: Math.round(pageSizeInches.width * 100) / 100,\n      height: Math.round(pageSizeInches.height * 100) / 100,\n    };\n    // 1in == 25.4mm; no need to round to 2 decimals for millimeters.\n    let sizeMillimeters = {\n      width: Math.round(pageSizeInches.width * 25.4 * 10) / 10,\n      height: Math.round(pageSizeInches.height * 25.4 * 10) / 10,\n    };\n\n    let pageName = null;\n    let name = getPageName(sizeInches, isPortrait, US_PAGE_NAMES) ||\n               getPageName(sizeMillimeters, isPortrait, METRIC_PAGE_NAMES);\n\n    if (!name && !(Number.isInteger(sizeMillimeters.width) &&\n                   Number.isInteger(sizeMillimeters.height))) {\n      // Attempt to improve the page name detection by falling back to fuzzy\n      // matching of the metric dimensions, to account for e.g. rounding errors\n      // and/or PDF files that define the page sizes in an imprecise manner.\n      const exactMillimeters = {\n        width: pageSizeInches.width * 25.4,\n        height: pageSizeInches.height * 25.4,\n      };\n      const intMillimeters = {\n        width: Math.round(sizeMillimeters.width),\n        height: Math.round(sizeMillimeters.height),\n      };\n\n      // Try to avoid false positives, by only considering \"small\" differences.\n      if (Math.abs(exactMillimeters.width - intMillimeters.width) < 0.1 &&\n          Math.abs(exactMillimeters.height - intMillimeters.height) < 0.1) {\n\n        name = getPageName(intMillimeters, isPortrait, METRIC_PAGE_NAMES);\n        if (name) {\n          // Update *both* sizes, computed above, to ensure that the displayed\n          // dimensions always correspond to the detected page name.\n          sizeInches = {\n            width: Math.round(intMillimeters.width / 25.4 * 100) / 100,\n            height: Math.round(intMillimeters.height / 25.4 * 100) / 100,\n          };\n          sizeMillimeters = intMillimeters;\n        }\n      }\n    }\n    if (name) {\n      pageName = this.l10n.get('document_properties_page_size_name_' +\n                               name.toLowerCase(), null, name);\n    }\n\n    return Promise.all([\n      (this._isNonMetricLocale ? sizeInches : sizeMillimeters),\n      this.l10n.get('document_properties_page_size_unit_' +\n                    (this._isNonMetricLocale ? 'inches' : 'millimeters'), null,\n                    this._isNonMetricLocale ? 'in' : 'mm'),\n      pageName,\n      this.l10n.get('document_properties_page_size_orientation_' +\n                    (isPortrait ? 'portrait' : 'landscape'), null,\n                    isPortrait ? 'portrait' : 'landscape'),\n    ]).then(([{ width, height, }, unit, name, orientation]) => {\n      return this.l10n.get('document_properties_page_size_dimension_' +\n                           (name ? 'name_' : '') + 'string', {\n          width: width.toLocaleString(),\n          height: height.toLocaleString(),\n          unit,\n          name,\n          orientation,\n        }, '{{width}} 脳 {{height}} {{unit}} (' +\n           (name ? '{{name}}, ' : '') + '{{orientation}})');\n    });\n  }\n\n  /**\n   * @private\n   */\n  _parseDate(inputDate) {\n    if (!inputDate) {\n      return;\n    }\n    // This is implemented according to the PDF specification, but note that\n    // Adobe Reader doesn't handle changing the date to universal time\n    // and doesn't use the user's time zone (they're effectively ignoring\n    // the HH' and mm' parts of the date string).\n    let dateToParse = inputDate;\n\n    // Remove the D: prefix if it is available.\n    if (dateToParse.substring(0, 2) === 'D:') {\n      dateToParse = dateToParse.substring(2);\n    }\n\n    // Get all elements from the PDF date string.\n    // JavaScript's `Date` object expects the month to be between\n    // 0 and 11 instead of 1 and 12, so we're correcting for this.\n    let year = parseInt(dateToParse.substring(0, 4), 10);\n    let month = parseInt(dateToParse.substring(4, 6), 10) - 1;\n    let day = parseInt(dateToParse.substring(6, 8), 10);\n    let hours = parseInt(dateToParse.substring(8, 10), 10);\n    let minutes = parseInt(dateToParse.substring(10, 12), 10);\n    let seconds = parseInt(dateToParse.substring(12, 14), 10);\n    let utRel = dateToParse.substring(14, 15);\n    let offsetHours = parseInt(dateToParse.substring(15, 17), 10);\n    let offsetMinutes = parseInt(dateToParse.substring(18, 20), 10);\n\n    // As per spec, utRel = 'Z' means equal to universal time.\n    // The other cases ('-' and '+') have to be handled here.\n    if (utRel === '-') {\n      hours += offsetHours;\n      minutes += offsetMinutes;\n    } else if (utRel === '+') {\n      hours -= offsetHours;\n      minutes -= offsetMinutes;\n    }\n\n    // Return the new date format from the user's locale.\n    let date = new Date(Date.UTC(year, month, day, hours, minutes, seconds));\n    let dateString = date.toLocaleDateString();\n    let timeString = date.toLocaleTimeString();\n    return this.l10n.get('document_properties_date_string',\n                         { date: dateString, time: timeString, },\n                         '{{date}}, {{time}}');\n  }\n\n  /**\n   * @private\n   */\n  _parseLinearization(isLinearized) {\n    return this.l10n.get('document_properties_linearized_' +\n                         (isLinearized ? 'yes' : 'no'), null,\n                         (isLinearized ? 'Yes' : 'No'));\n  }\n}\n\nexport {\n  PDFDocumentProperties,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getGlobalEventBus, NullL10n } from './ui_utils';\nimport { FindState } from './pdf_find_controller';\n\nconst MATCHES_COUNT_LIMIT = 1000;\n\n/**\n * Creates a \"search bar\" given a set of DOM elements that act as controls\n * for searching or for setting search preferences in the UI. This object\n * also sets up the appropriate events for the controls. Actual searching\n * is done by PDFFindController.\n */\nclass PDFFindBar {\n  constructor(options, eventBus = getGlobalEventBus(), l10n = NullL10n) {\n    this.opened = false;\n\n    this.bar = options.bar || null;\n    this.toggleButton = options.toggleButton || null;\n    this.findField = options.findField || null;\n    this.highlightAll = options.highlightAllCheckbox || null;\n    this.caseSensitive = options.caseSensitiveCheckbox || null;\n    this.entireWord = options.entireWordCheckbox || null;\n    this.findMsg = options.findMsg || null;\n    this.findResultsCount = options.findResultsCount || null;\n    this.findPreviousButton = options.findPreviousButton || null;\n    this.findNextButton = options.findNextButton || null;\n    this.eventBus = eventBus;\n    this.l10n = l10n;\n\n    // Add event listeners to the DOM elements.\n    this.toggleButton.addEventListener('click', () => {\n      this.toggle();\n    });\n\n    this.findField.addEventListener('input', () => {\n      this.dispatchEvent('');\n    });\n\n    this.bar.addEventListener('keydown', (e) => {\n      switch (e.keyCode) {\n        case 13: // Enter\n          if (e.target === this.findField) {\n            this.dispatchEvent('again', e.shiftKey);\n          }\n          break;\n        case 27: // Escape\n          this.close();\n          break;\n      }\n    });\n\n    this.findPreviousButton.addEventListener('click', () => {\n      this.dispatchEvent('again', true);\n    });\n\n    this.findNextButton.addEventListener('click', () => {\n      this.dispatchEvent('again', false);\n    });\n\n    this.highlightAll.addEventListener('click', () => {\n      this.dispatchEvent('highlightallchange');\n    });\n\n    this.caseSensitive.addEventListener('click', () => {\n      this.dispatchEvent('casesensitivitychange');\n    });\n\n    this.entireWord.addEventListener('click', () => {\n      this.dispatchEvent('entirewordchange');\n    });\n\n    this.eventBus.on('resize', this._adjustWidth.bind(this));\n  }\n\n  reset() {\n    this.updateUIState();\n  }\n\n  dispatchEvent(type, findPrev) {\n    this.eventBus.dispatch('find', {\n      source: this,\n      type,\n      query: this.findField.value,\n      phraseSearch: true,\n      caseSensitive: this.caseSensitive.checked,\n      entireWord: this.entireWord.checked,\n      highlightAll: this.highlightAll.checked,\n      findPrevious: findPrev,\n    });\n  }\n\n  updateUIState(state, previous, matchesCount) {\n    let notFound = false;\n    let findMsg = '';\n    let status = '';\n\n    switch (state) {\n      case FindState.FOUND:\n        break;\n\n      case FindState.PENDING:\n        status = 'pending';\n        break;\n\n      case FindState.NOT_FOUND:\n        findMsg = this.l10n.get('find_not_found', null, 'Phrase not found');\n        notFound = true;\n        break;\n\n      case FindState.WRAPPED:\n        if (previous) {\n          findMsg = this.l10n.get('find_reached_top', null,\n            'Reached top of document, continued from bottom');\n        } else {\n          findMsg = this.l10n.get('find_reached_bottom', null,\n            'Reached end of document, continued from top');\n        }\n        break;\n    }\n\n    this.findField.classList.toggle('notFound', notFound);\n    this.findField.setAttribute('data-status', status);\n\n    Promise.resolve(findMsg).then((msg) => {\n      this.findMsg.textContent = msg;\n      this._adjustWidth();\n    });\n\n    this.updateResultsCount(matchesCount);\n  }\n\n  updateResultsCount({ current = 0, total = 0, } = {}) {\n    if (!this.findResultsCount) {\n      return; // No UI control is provided.\n    }\n    let matchesCountMsg = '', limit = MATCHES_COUNT_LIMIT;\n\n    if (total > 0) {\n      if (total > limit) {\n        if (typeof PDFJSDev !== 'undefined' && PDFJSDev.test('MOZCENTRAL')) {\n          // TODO: Remove this hard-coded `[other]` form once plural support has\n          // been implemented in the mozilla-central specific `l10n.js` file.\n          matchesCountMsg = this.l10n.get('find_match_count_limit[other]', {\n            limit,\n          }, 'More than {{limit}} matches');\n        } else {\n          matchesCountMsg = this.l10n.get('find_match_count_limit', {\n            limit,\n          }, 'More than {{limit}} match' + (limit !== 1 ? 'es' : ''));\n        }\n      } else {\n        if (typeof PDFJSDev !== 'undefined' && PDFJSDev.test('MOZCENTRAL')) {\n          // TODO: Remove this hard-coded `[other]` form once plural support has\n          // been implemented in the mozilla-central specific `l10n.js` file.\n          matchesCountMsg = this.l10n.get('find_match_count[other]', {\n            current,\n            total,\n          }, '{{current}} of {{total}} matches');\n        } else {\n          matchesCountMsg = this.l10n.get('find_match_count', {\n            current,\n            total,\n          }, '{{current}} of {{total}} match' + (total !== 1 ? 'es' : ''));\n        }\n      }\n    }\n    Promise.resolve(matchesCountMsg).then((msg) => {\n      this.findResultsCount.textContent = msg;\n      this.findResultsCount.classList[!total ? 'add' : 'remove']('hidden');\n      // Since `updateResultsCount` may be called from `PDFFindController`,\n      // ensure that the width of the findbar is always updated correctly.\n      this._adjustWidth();\n    });\n  }\n\n  open() {\n    if (!this.opened) {\n      this.opened = true;\n      this.toggleButton.classList.add('toggled');\n      this.bar.classList.remove('hidden');\n    }\n    this.findField.select();\n    this.findField.focus();\n\n    this._adjustWidth();\n  }\n\n  close() {\n    if (!this.opened) {\n      return;\n    }\n    this.opened = false;\n    this.toggleButton.classList.remove('toggled');\n    this.bar.classList.add('hidden');\n\n    this.eventBus.dispatch('findbarclose', { source: this, });\n  }\n\n  toggle() {\n    if (this.opened) {\n      this.close();\n    } else {\n      this.open();\n    }\n  }\n\n  /**\n   * @private\n   */\n  _adjustWidth() {\n    if (!this.opened) {\n      return;\n    }\n\n    // The find bar has an absolute position and thus the browser extends\n    // its width to the maximum possible width once the find bar does not fit\n    // entirely within the window anymore (and its elements are automatically\n    // wrapped). Here we detect and fix that.\n    this.bar.classList.remove('wrapContainers');\n\n    let findbarHeight = this.bar.clientHeight;\n    let inputContainerHeight = this.bar.firstElementChild.clientHeight;\n\n    if (findbarHeight > inputContainerHeight) {\n      // The findbar is taller than the input container, which means that\n      // the browser wrapped some of the elements. For a consistent look,\n      // wrap all of them to adjust the width of the find bar.\n      this.bar.classList.add('wrapContainers');\n    }\n  }\n}\n\nexport {\n  PDFFindBar,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { createPromiseCapability } from 'pdfjs-lib';\nimport { getCharacterType } from './pdf_find_utils';\nimport { getGlobalEventBus } from './dom_events';\n\nconst FindState = {\n  FOUND: 0,\n  NOT_FOUND: 1,\n  WRAPPED: 2,\n  PENDING: 3,\n};\n\nconst FIND_TIMEOUT = 250; // ms\n\nconst CHARACTERS_TO_NORMALIZE = {\n  '\\u2018': '\\'', // Left single quotation mark\n  '\\u2019': '\\'', // Right single quotation mark\n  '\\u201A': '\\'', // Single low-9 quotation mark\n  '\\u201B': '\\'', // Single high-reversed-9 quotation mark\n  '\\u201C': '\"', // Left double quotation mark\n  '\\u201D': '\"', // Right double quotation mark\n  '\\u201E': '\"', // Double low-9 quotation mark\n  '\\u201F': '\"', // Double high-reversed-9 quotation mark\n  '\\u00BC': '1/4', // Vulgar fraction one quarter\n  '\\u00BD': '1/2', // Vulgar fraction one half\n  '\\u00BE': '3/4', // Vulgar fraction three quarters\n};\n\n/**\n * @typedef {Object} PDFFindControllerOptions\n * @property {IPDFLinkService} linkService - The navigation/linking service.\n * @property {EventBus} eventBus - The application event bus.\n */\n\n/**\n * Provides search functionality to find a given string in a PDF document.\n */\nclass PDFFindController {\n  /**\n   * @param {PDFFindControllerOptions} options\n   */\n  constructor({ linkService, eventBus = getGlobalEventBus(), }) {\n    this._linkService = linkService;\n    this._eventBus = eventBus;\n\n    this._reset();\n    eventBus.on('findbarclose', this._onFindBarClose.bind(this));\n\n    // Compile the regular expression for text normalization once.\n    const replace = Object.keys(CHARACTERS_TO_NORMALIZE).join('');\n    this._normalizationRegex = new RegExp(`[${replace}]`, 'g');\n  }\n\n  get highlightMatches() {\n    return this._highlightMatches;\n  }\n\n  get pageMatches() {\n    return this._pageMatches;\n  }\n\n  get pageMatchesLength() {\n    return this._pageMatchesLength;\n  }\n\n  get selected() {\n    return this._selected;\n  }\n\n  get state() {\n    return this._state;\n  }\n\n  /**\n   * Set a reference to the PDF document in order to search it.\n   * Note that searching is not possible if this method is not called.\n   *\n   * @param {PDFDocumentProxy} pdfDocument - The PDF document to search.\n   */\n  setDocument(pdfDocument) {\n    if (this._pdfDocument) {\n      this._reset();\n    }\n    if (!pdfDocument) {\n      return;\n    }\n    this._pdfDocument = pdfDocument;\n    this._firstPageCapability.resolve();\n  }\n\n  executeCommand(cmd, state) {\n    const pdfDocument = this._pdfDocument;\n\n    if (this._state === null || cmd !== 'findagain') {\n      this._dirtyMatch = true;\n    }\n    this._state = state;\n    this._updateUIState(FindState.PENDING);\n\n    this._firstPageCapability.promise.then(() => {\n      if (!this._pdfDocument ||\n          (pdfDocument && this._pdfDocument !== pdfDocument)) {\n        // If the document was closed before searching began, or if the search\n        // operation was relevant for a previously opened document, do nothing.\n        return;\n      }\n      this._extractText();\n\n      if (this._findTimeout) {\n        clearTimeout(this._findTimeout);\n        this._findTimeout = null;\n      }\n      if (cmd === 'find') {\n        // Trigger the find action with a small delay to avoid starting the\n        // search when the user is still typing (saving resources).\n        this._findTimeout = setTimeout(() => {\n          this._nextMatch();\n          this._findTimeout = null;\n        }, FIND_TIMEOUT);\n      } else {\n        this._nextMatch();\n      }\n    });\n  }\n\n  _reset() {\n    this._highlightMatches = false;\n    this._pdfDocument = null;\n    this._pageMatches = [];\n    this._pageMatchesLength = null;\n    this._state = null;\n    this._selected = { // Currently selected match.\n      pageIdx: -1,\n      matchIdx: -1,\n    };\n    this._offset = { // Where the find algorithm currently is in the document.\n      pageIdx: null,\n      matchIdx: null,\n    };\n    this._extractTextPromises = [];\n    this._pageContents = []; // Stores the text for each page.\n    this._matchesCountTotal = 0;\n    this._pagesToSearch = null;\n    this._pendingFindMatches = Object.create(null);\n    this._resumePageIdx = null;\n    this._dirtyMatch = false;\n    clearTimeout(this._findTimeout);\n    this._findTimeout = null;\n\n    this._firstPageCapability = createPromiseCapability();\n  }\n\n  _normalize(text) {\n    return text.replace(this._normalizationRegex, function(ch) {\n      return CHARACTERS_TO_NORMALIZE[ch];\n    });\n  }\n\n  /**\n   * Helper for multi-term search that fills the `matchesWithLength` array\n   * and handles cases where one search term includes another search term (for\n   * example, \"tamed tame\" or \"this is\"). It looks for intersecting terms in\n   * the `matches` and keeps elements with a longer match length.\n   */\n  _prepareMatches(matchesWithLength, matches, matchesLength) {\n    function isSubTerm(matchesWithLength, currentIndex) {\n      const currentElem = matchesWithLength[currentIndex];\n      const nextElem = matchesWithLength[currentIndex + 1];\n\n      // Check for cases like \"TAMEd TAME\".\n      if (currentIndex < matchesWithLength.length - 1 &&\n          currentElem.match === nextElem.match) {\n        currentElem.skipped = true;\n        return true;\n      }\n\n      // Check for cases like \"thIS IS\".\n      for (let i = currentIndex - 1; i >= 0; i--) {\n        const prevElem = matchesWithLength[i];\n        if (prevElem.skipped) {\n          continue;\n        }\n        if (prevElem.match + prevElem.matchLength < currentElem.match) {\n          break;\n        }\n        if (prevElem.match + prevElem.matchLength >=\n            currentElem.match + currentElem.matchLength) {\n          currentElem.skipped = true;\n          return true;\n        }\n      }\n      return false;\n    }\n\n    // Sort the array of `{ match: <match>, matchLength: <matchLength> }`\n    // objects on increasing index first and on the length otherwise.\n    matchesWithLength.sort(function(a, b) {\n      return a.match === b.match ? a.matchLength - b.matchLength :\n                                   a.match - b.match;\n    });\n    for (let i = 0, len = matchesWithLength.length; i < len; i++) {\n      if (isSubTerm(matchesWithLength, i)) {\n        continue;\n      }\n      matches.push(matchesWithLength[i].match);\n      matchesLength.push(matchesWithLength[i].matchLength);\n    }\n  }\n\n  /**\n   * Determine if the search query constitutes a \"whole word\", by comparing the\n   * first/last character type with the preceding/following character type.\n   */\n  _isEntireWord(content, startIdx, length) {\n    if (startIdx > 0) {\n      const first = content.charCodeAt(startIdx);\n      const limit = content.charCodeAt(startIdx - 1);\n      if (getCharacterType(first) === getCharacterType(limit)) {\n        return false;\n      }\n    }\n    const endIdx = (startIdx + length - 1);\n    if (endIdx < (content.length - 1)) {\n      const last = content.charCodeAt(endIdx);\n      const limit = content.charCodeAt(endIdx + 1);\n      if (getCharacterType(last) === getCharacterType(limit)) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  _calculatePhraseMatch(query, pageIndex, pageContent, entireWord) {\n    const matches = [];\n    const queryLen = query.length;\n\n    let matchIdx = -queryLen;\n    while (true) {\n      matchIdx = pageContent.indexOf(query, matchIdx + queryLen);\n      if (matchIdx === -1) {\n        break;\n      }\n      if (entireWord && !this._isEntireWord(pageContent, matchIdx, queryLen)) {\n        continue;\n      }\n      matches.push(matchIdx);\n    }\n    this._pageMatches[pageIndex] = matches;\n  }\n\n  _calculateWordMatch(query, pageIndex, pageContent, entireWord) {\n    const matchesWithLength = [];\n\n    // Divide the query into pieces and search for text in each piece.\n    const queryArray = query.match(/\\S+/g);\n    for (let i = 0, len = queryArray.length; i < len; i++) {\n      const subquery = queryArray[i];\n      const subqueryLen = subquery.length;\n\n      let matchIdx = -subqueryLen;\n      while (true) {\n        matchIdx = pageContent.indexOf(subquery, matchIdx + subqueryLen);\n        if (matchIdx === -1) {\n          break;\n        }\n        if (entireWord &&\n            !this._isEntireWord(pageContent, matchIdx, subqueryLen)) {\n          continue;\n        }\n        // Other searches do not, so we store the length.\n        matchesWithLength.push({\n          match: matchIdx,\n          matchLength: subqueryLen,\n          skipped: false,\n        });\n      }\n    }\n\n    // Prepare arrays for storing the matches.\n    if (!this._pageMatchesLength) {\n      this._pageMatchesLength = [];\n    }\n    this._pageMatchesLength[pageIndex] = [];\n    this._pageMatches[pageIndex] = [];\n\n    // Sort `matchesWithLength`, remove intersecting terms and put the result\n    // into the two arrays.\n    this._prepareMatches(matchesWithLength, this._pageMatches[pageIndex],\n      this._pageMatchesLength[pageIndex]);\n  }\n\n  _calculateMatch(pageIndex) {\n    let pageContent = this._normalize(this._pageContents[pageIndex]);\n    let query = this._normalize(this._state.query);\n    const { caseSensitive, entireWord, phraseSearch, } = this._state;\n\n    if (query.length === 0) {\n      // Do nothing: the matches should be wiped out already.\n      return;\n    }\n\n    if (!caseSensitive) {\n      pageContent = pageContent.toLowerCase();\n      query = query.toLowerCase();\n    }\n\n    if (phraseSearch) {\n      this._calculatePhraseMatch(query, pageIndex, pageContent, entireWord);\n    } else {\n      this._calculateWordMatch(query, pageIndex, pageContent, entireWord);\n    }\n\n    this._updatePage(pageIndex);\n    if (this._resumePageIdx === pageIndex) {\n      this._resumePageIdx = null;\n      this._nextPageMatch();\n    }\n\n    // Update the match count.\n    const pageMatchesCount = this._pageMatches[pageIndex].length;\n    if (pageMatchesCount > 0) {\n      this._matchesCountTotal += pageMatchesCount;\n      this._updateUIResultsCount();\n    }\n  }\n\n  _extractText() {\n    // Perform text extraction once if this method is called multiple times.\n    if (this._extractTextPromises.length > 0) {\n      return;\n    }\n\n    let promise = Promise.resolve();\n    for (let i = 0, ii = this._linkService.pagesCount; i < ii; i++) {\n      const extractTextCapability = createPromiseCapability();\n      this._extractTextPromises[i] = extractTextCapability.promise;\n\n      promise = promise.then(() => {\n        return this._pdfDocument.getPage(i + 1).then((pdfPage) => {\n          return pdfPage.getTextContent({\n            normalizeWhitespace: true,\n          });\n        }).then((textContent) => {\n          const textItems = textContent.items;\n          const strBuf = [];\n\n          for (let j = 0, jj = textItems.length; j < jj; j++) {\n            strBuf.push(textItems[j].str);\n          }\n\n          // Store the page content (text items) as one string.\n          this._pageContents[i] = strBuf.join('');\n          extractTextCapability.resolve(i);\n        }, (reason) => {\n          console.error(`Unable to get text content for page ${i + 1}`, reason);\n          // Page error -- assuming no text content.\n          this._pageContents[i] = '';\n          extractTextCapability.resolve(i);\n        });\n      });\n    }\n  }\n\n  _updatePage(index) {\n    if (this._selected.pageIdx === index) {\n      // If the page is selected, scroll the page into view, which triggers\n      // rendering the page, which adds the text layer. Once the text layer\n      // is built, it will scroll to the selected match.\n      this._linkService.page = index + 1;\n    }\n\n    this._eventBus.dispatch('updatetextlayermatches', {\n      source: this,\n      pageIndex: index,\n    });\n  }\n\n  _nextMatch() {\n    const previous = this._state.findPrevious;\n    const currentPageIndex = this._linkService.page - 1;\n    const numPages = this._linkService.pagesCount;\n\n    this._highlightMatches = true;\n\n    if (this._dirtyMatch) {\n      // Need to recalculate the matches, reset everything.\n      this._dirtyMatch = false;\n      this._selected.pageIdx = this._selected.matchIdx = -1;\n      this._offset.pageIdx = currentPageIndex;\n      this._offset.matchIdx = null;\n      this._resumePageIdx = null;\n      this._pageMatches.length = 0;\n      this._pageMatchesLength = null;\n      this._matchesCountTotal = 0;\n\n      for (let i = 0; i < numPages; i++) {\n        // Wipe out any previously highlighted matches.\n        this._updatePage(i);\n\n        // Start finding the matches as soon as the text is extracted.\n        if (!(i in this._pendingFindMatches)) {\n          this._pendingFindMatches[i] = true;\n          this._extractTextPromises[i].then((pageIdx) => {\n            delete this._pendingFindMatches[pageIdx];\n            this._calculateMatch(pageIdx);\n          });\n        }\n      }\n    }\n\n    // If there's no query there's no point in searching.\n    if (this._state.query === '') {\n      this._updateUIState(FindState.FOUND);\n      return;\n    }\n\n    // If we're waiting on a page, we return since we can't do anything else.\n    if (this._resumePageIdx) {\n      return;\n    }\n\n    const offset = this._offset;\n    // Keep track of how many pages we should maximally iterate through.\n    this._pagesToSearch = numPages;\n    // If there's already a `matchIdx` that means we are iterating through a\n    // page's matches.\n    if (offset.matchIdx !== null) {\n      const numPageMatches = this._pageMatches[offset.pageIdx].length;\n      if ((!previous && offset.matchIdx + 1 < numPageMatches) ||\n          (previous && offset.matchIdx > 0)) {\n        // The simple case; we just have advance the matchIdx to select\n        // the next match on the page.\n        offset.matchIdx = (previous ? offset.matchIdx - 1 :\n                                      offset.matchIdx + 1);\n        this._updateMatch(/* found = */ true);\n        return;\n      }\n      // We went beyond the current page's matches, so we advance to\n      // the next page.\n      this._advanceOffsetPage(previous);\n    }\n    // Start searching through the page.\n    this._nextPageMatch();\n  }\n\n  _matchesReady(matches) {\n    const offset = this._offset;\n    const numMatches = matches.length;\n    const previous = this._state.findPrevious;\n\n    if (numMatches) {\n      // There were matches for the page, so initialize `matchIdx`.\n      offset.matchIdx = (previous ? numMatches - 1 : 0);\n      this._updateMatch(/* found = */ true);\n      return true;\n    }\n    // No matches, so attempt to search the next page.\n    this._advanceOffsetPage(previous);\n    if (offset.wrapped) {\n      offset.matchIdx = null;\n      if (this._pagesToSearch < 0) {\n        // No point in wrapping again, there were no matches.\n        this._updateMatch(/* found = */ false);\n        // While matches were not found, searching for a page\n        // with matches should nevertheless halt.\n        return true;\n      }\n    }\n    // Matches were not found (and searching is not done).\n    return false;\n  }\n\n  _nextPageMatch() {\n    if (this._resumePageIdx !== null) {\n      console.error('There can only be one pending page.');\n    }\n\n    let matches = null;\n    do {\n      const pageIdx = this._offset.pageIdx;\n      matches = this._pageMatches[pageIdx];\n      if (!matches) {\n        // The matches don't exist yet for processing by `_matchesReady`,\n        // so set a resume point for when they do exist.\n        this._resumePageIdx = pageIdx;\n        break;\n      }\n    } while (!this._matchesReady(matches));\n  }\n\n  _advanceOffsetPage(previous) {\n    const offset = this._offset;\n    const numPages = this._linkService.pagesCount;\n    offset.pageIdx = (previous ? offset.pageIdx - 1 : offset.pageIdx + 1);\n    offset.matchIdx = null;\n\n    this._pagesToSearch--;\n\n    if (offset.pageIdx >= numPages || offset.pageIdx < 0) {\n      offset.pageIdx = (previous ? numPages - 1 : 0);\n      offset.wrapped = true;\n    }\n  }\n\n  _updateMatch(found = false) {\n    let state = FindState.NOT_FOUND;\n    const wrapped = this._offset.wrapped;\n    this._offset.wrapped = false;\n\n    if (found) {\n      const previousPage = this._selected.pageIdx;\n      this._selected.pageIdx = this._offset.pageIdx;\n      this._selected.matchIdx = this._offset.matchIdx;\n      state = (wrapped ? FindState.WRAPPED : FindState.FOUND);\n\n      // Update the currently selected page to wipe out any selected matches.\n      if (previousPage !== -1 && previousPage !== this._selected.pageIdx) {\n        this._updatePage(previousPage);\n      }\n    }\n\n    this._updateUIState(state, this._state.findPrevious);\n    if (this._selected.pageIdx !== -1) {\n      this._updatePage(this._selected.pageIdx);\n    }\n  }\n\n  _onFindBarClose(evt) {\n    const pdfDocument = this._pdfDocument;\n    // Since searching is asynchronous, ensure that the removal of highlighted\n    // matches (from the UI) is async too such that the 'updatetextlayermatches'\n    // events will always be dispatched in the expected order.\n    this._firstPageCapability.promise.then(() => {\n      if (!this._pdfDocument ||\n          (pdfDocument && this._pdfDocument !== pdfDocument)) {\n        // Only update the UI if the document is open, and is the current one.\n        return;\n      }\n      if (this._findTimeout) {\n        clearTimeout(this._findTimeout);\n        this._findTimeout = null;\n        // Avoid the UI being in a pending state if the findbar is re-opened.\n        this._updateUIState(FindState.FOUND);\n      }\n      this._highlightMatches = false;\n\n      this._eventBus.dispatch('updatetextlayermatches', {\n        source: this,\n        pageIndex: -1,\n      });\n    });\n  }\n\n  _requestMatchesCount() {\n    const { pageIdx, matchIdx, } = this._selected;\n    let current = 0, total = this._matchesCountTotal;\n    if (matchIdx !== -1) {\n      for (let i = 0; i < pageIdx; i++) {\n        current += (this._pageMatches[i] && this._pageMatches[i].length) || 0;\n      }\n      current += matchIdx + 1;\n    }\n    // When searching starts, this method may be called before the `pageMatches`\n    // have been counted (in `_calculateMatch`). Ensure that the UI won't show\n    // temporarily broken state when the active find result doesn't make sense.\n    if (current < 1 || current > total) {\n      current = total = 0;\n    }\n    return { current, total, };\n  }\n\n  _updateUIResultsCount() {\n    this._eventBus.dispatch('updatefindmatchescount', {\n      source: this,\n      matchesCount: this._requestMatchesCount(),\n    });\n  }\n\n  _updateUIState(state, previous) {\n    this._eventBus.dispatch('updatefindcontrolstate', {\n      source: this,\n      state,\n      previous,\n      matchesCount: this._requestMatchesCount(),\n    });\n  }\n}\n\nexport {\n  FindState,\n  PDFFindController,\n};\n","/* Copyright 2018 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst CharacterType = {\n  SPACE: 0,\n  ALPHA_LETTER: 1,\n  PUNCT: 2,\n  HAN_LETTER: 3,\n  KATAKANA_LETTER: 4,\n  HIRAGANA_LETTER: 5,\n  HALFWIDTH_KATAKANA_LETTER: 6,\n  THAI_LETTER: 7,\n};\n\nfunction isAlphabeticalScript(charCode) {\n  return charCode < 0x2E80;\n}\n\nfunction isAscii(charCode) {\n  return (charCode & 0xFF80) === 0;\n}\n\nfunction isAsciiAlpha(charCode) {\n  return (charCode >= /* a = */ 0x61 && charCode <= /* z = */ 0x7A) ||\n         (charCode >= /* A = */ 0x41 && charCode <= /* Z = */ 0x5A);\n}\n\nfunction isAsciiDigit(charCode) {\n  return (charCode >= /* 0 = */ 0x30 && charCode <= /* 9 = */ 0x39);\n}\n\nfunction isAsciiSpace(charCode) {\n  return (charCode === /* SPACE = */ 0x20 || charCode === /* TAB = */ 0x09 ||\n          charCode === /* CR = */ 0x0D || charCode === /* LF = */ 0x0A);\n}\n\nfunction isHan(charCode) {\n  return (charCode >= 0x3400 && charCode <= 0x9FFF) ||\n         (charCode >= 0xF900 && charCode <= 0xFAFF);\n}\n\nfunction isKatakana(charCode) {\n  return (charCode >= 0x30A0 && charCode <= 0x30FF);\n}\n\nfunction isHiragana(charCode) {\n  return (charCode >= 0x3040 && charCode <= 0x309F);\n}\n\nfunction isHalfwidthKatakana(charCode) {\n  return (charCode >= 0xFF60 && charCode <= 0xFF9F);\n}\n\nfunction isThai(charCode) {\n  return (charCode & 0xFF80) === 0x0E00;\n}\n\n/**\n * This function is based on the word-break detection implemented in:\n * https://hg.mozilla.org/mozilla-central/file/tip/intl/lwbrk/WordBreaker.cpp\n */\nfunction getCharacterType(charCode) {\n  if (isAlphabeticalScript(charCode)) {\n    if (isAscii(charCode)) {\n      if (isAsciiSpace(charCode)) {\n        return CharacterType.SPACE;\n      } else if (isAsciiAlpha(charCode) || isAsciiDigit(charCode) ||\n                 charCode === /* UNDERSCORE = */ 0x5F) {\n        return CharacterType.ALPHA_LETTER;\n      }\n      return CharacterType.PUNCT;\n    } else if (isThai(charCode)) {\n      return CharacterType.THAI_LETTER;\n    } else if (charCode === /* NBSP = */ 0xA0) {\n      return CharacterType.SPACE;\n    }\n    return CharacterType.ALPHA_LETTER;\n  }\n\n  if (isHan(charCode)) {\n    return CharacterType.HAN_LETTER;\n  } else if (isKatakana(charCode)) {\n    return CharacterType.KATAKANA_LETTER;\n  } else if (isHiragana(charCode)) {\n    return CharacterType.HIRAGANA_LETTER;\n  } else if (isHalfwidthKatakana(charCode)) {\n    return CharacterType.HALFWIDTH_KATAKANA_LETTER;\n  }\n  return CharacterType.ALPHA_LETTER;\n}\n\nexport {\n  CharacterType,\n  getCharacterType,\n};\n","/* Copyright 2017 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  isValidRotation, parseQueryString, waitOnEventOrTimeout\n} from './ui_utils';\nimport { getGlobalEventBus } from './dom_events';\n\n// Heuristic value used when force-resetting `this._blockHashChange`.\nconst HASH_CHANGE_TIMEOUT = 1000; // milliseconds\n// Heuristic value used when adding the current position to the browser history.\nconst POSITION_UPDATED_THRESHOLD = 50;\n// Heuristic value used when adding a temporary position to the browser history.\nconst UPDATE_VIEWAREA_TIMEOUT = 1000; // milliseconds\n\n/**\n * @typedef {Object} PDFHistoryOptions\n * @property {IPDFLinkService} linkService - The navigation/linking service.\n * @property {EventBus} eventBus - The application event bus.\n */\n\n/**\n * @typedef {Object} PushParameters\n * @property {string} namedDest - (optional) The named destination. If absent,\n *   a stringified version of `explicitDest` is used.\n * @property {Array} explicitDest - The explicit destination array.\n * @property {number} pageNumber - The page to which the destination points.\n */\n\nfunction getCurrentHash() {\n  return document.location.hash;\n}\n\nfunction parseCurrentHash(linkService) {\n  let hash = unescape(getCurrentHash()).substring(1);\n  let params = parseQueryString(hash);\n\n  let page = params.page | 0;\n  if (!(Number.isInteger(page) && page > 0 && page <= linkService.pagesCount)) {\n    page = null;\n  }\n  return { hash, page, rotation: linkService.rotation, };\n}\n\nclass PDFHistory {\n  /**\n   * @param {PDFHistoryOptions} options\n   */\n  constructor({ linkService, eventBus, }) {\n    this.linkService = linkService;\n    this.eventBus = eventBus || getGlobalEventBus();\n\n    this.initialized = false;\n    this.initialBookmark = null;\n    this.initialRotation = null;\n\n    this._boundEvents = Object.create(null);\n    this._isViewerInPresentationMode = false;\n    this._isPagesLoaded = false;\n\n    // Ensure that we don't miss either a 'presentationmodechanged' or a\n    // 'pagesloaded' event, by registering the listeners immediately.\n    this.eventBus.on('presentationmodechanged', (evt) => {\n      this._isViewerInPresentationMode = evt.active || evt.switchInProgress;\n    });\n    this.eventBus.on('pagesloaded', (evt) => {\n      this._isPagesLoaded = !!evt.pagesCount;\n    });\n  }\n\n  /**\n   * Initialize the history for the PDF document, using either the current\n   * browser history entry or the document hash, whichever is present.\n   * @param {string} fingerprint - The PDF document's unique fingerprint.\n   * @param {boolean} resetHistory - (optional) Reset the browsing history.\n   */\n  initialize(fingerprint, resetHistory = false) {\n    if (!fingerprint || typeof fingerprint !== 'string') {\n      console.error(\n        'PDFHistory.initialize: The \"fingerprint\" must be a non-empty string.');\n      return;\n    }\n    let reInitialized = this.initialized && this.fingerprint !== fingerprint;\n    this.fingerprint = fingerprint;\n\n    if (!this.initialized) {\n      this._bindEvents();\n    }\n    let state = window.history.state;\n\n    this.initialized = true;\n    this.initialBookmark = null;\n    this.initialRotation = null;\n\n    this._popStateInProgress = false;\n    this._blockHashChange = 0;\n    this._currentHash = getCurrentHash();\n    this._numPositionUpdates = 0;\n\n    this._uid = this._maxUid = 0;\n    this._destination = null;\n    this._position = null;\n\n    if (!this._isValidState(state) || resetHistory) {\n      let { hash, page, rotation, } = parseCurrentHash(this.linkService);\n\n      if (!hash || reInitialized || resetHistory) {\n        // Ensure that the browser history is reset on PDF document load.\n        this._pushOrReplaceState(null, /* forceReplace = */ true);\n        return;\n      }\n      // Ensure that the browser history is initialized correctly when\n      // the document hash is present on PDF document load.\n      this._pushOrReplaceState({ hash, page, rotation, },\n                               /* forceReplace = */ true);\n      return;\n    }\n\n    // The browser history contains a valid entry, ensure that the history is\n    // initialized correctly on PDF document load.\n    let destination = state.destination;\n    this._updateInternalState(destination, state.uid,\n                              /* removeTemporary = */ true);\n    if (this._uid > this._maxUid) {\n      this._maxUid = this._uid;\n    }\n\n    if (destination.rotation !== undefined) {\n      this.initialRotation = destination.rotation;\n    }\n    if (destination.dest) {\n      this.initialBookmark = JSON.stringify(destination.dest);\n\n      // If the history is updated, e.g. through the user changing the hash,\n      // before the initial destination has become visible, then we do *not*\n      // want to potentially add `this._position` to the browser history.\n      this._destination.page = null;\n    } else if (destination.hash) {\n      this.initialBookmark = destination.hash;\n    } else if (destination.page) {\n      // Fallback case; shouldn't be necessary, but better safe than sorry.\n      this.initialBookmark = `page=${destination.page}`;\n    }\n  }\n\n  /**\n   * Push an internal destination to the browser history.\n   * @param {PushParameters}\n   */\n  push({ namedDest, explicitDest, pageNumber, }) {\n    if (!this.initialized) {\n      return;\n    }\n    if ((namedDest && typeof namedDest !== 'string') ||\n        !Array.isArray(explicitDest) ||\n        !(Number.isInteger(pageNumber) &&\n          pageNumber > 0 && pageNumber <= this.linkService.pagesCount)) {\n      console.error('PDFHistory.push: Invalid parameters.');\n      return;\n    }\n\n    let hash = namedDest || JSON.stringify(explicitDest);\n    if (!hash) {\n      // The hash *should* never be undefined, but if that were to occur,\n      // avoid any possible issues by not updating the browser history.\n      return;\n    }\n\n    let forceReplace = false;\n    if (this._destination &&\n        (isDestHashesEqual(this._destination.hash, hash) ||\n         isDestArraysEqual(this._destination.dest, explicitDest))) {\n      // When the new destination is identical to `this._destination`, and\n      // its `page` is undefined, replace the current browser history entry.\n      // NOTE: This can only occur if `this._destination` was set either:\n      //  - through the document hash being specified on load.\n      //  - through the user changing the hash of the document.\n      if (this._destination.page) {\n        return;\n      }\n      forceReplace = true;\n    }\n    if (this._popStateInProgress && !forceReplace) {\n      return;\n    }\n\n    this._pushOrReplaceState({\n      dest: explicitDest,\n      hash,\n      page: pageNumber,\n      rotation: this.linkService.rotation,\n    }, forceReplace);\n\n    if (!this._popStateInProgress) {\n      // Prevent the browser history from updating while the new destination is\n      // being scrolled into view, to avoid potentially inconsistent state.\n      this._popStateInProgress = true;\n      // We defer the resetting of `this._popStateInProgress`, to account for\n      // e.g. zooming occuring when the new destination is being navigated to.\n      Promise.resolve().then(() => {\n        this._popStateInProgress = false;\n      });\n    }\n  }\n\n  /**\n   * Push the current position to the browser history.\n   */\n  pushCurrentPosition() {\n    if (!this.initialized || this._popStateInProgress) {\n      return;\n    }\n    this._tryPushCurrentPosition();\n  }\n\n  /**\n   * Go back one step in the browser history.\n   * NOTE: Avoids navigating away from the document, useful for \"named actions\".\n   */\n  back() {\n    if (!this.initialized || this._popStateInProgress) {\n      return;\n    }\n    let state = window.history.state;\n    if (this._isValidState(state) && state.uid > 0) {\n      window.history.back();\n    }\n  }\n\n  /**\n   * Go forward one step in the browser history.\n   * NOTE: Avoids navigating away from the document, useful for \"named actions\".\n   */\n  forward() {\n    if (!this.initialized || this._popStateInProgress) {\n      return;\n    }\n    let state = window.history.state;\n    if (this._isValidState(state) && state.uid < this._maxUid) {\n      window.history.forward();\n    }\n  }\n\n  /**\n   * @returns {boolean} Indicating if the user is currently moving through the\n   *   browser history, useful e.g. for skipping the next 'hashchange' event.\n   */\n  get popStateInProgress() {\n    return this.initialized &&\n           (this._popStateInProgress || this._blockHashChange > 0);\n  }\n\n  /**\n   * @private\n   */\n  _pushOrReplaceState(destination, forceReplace = false) {\n    let shouldReplace = forceReplace || !this._destination;\n    let newState = {\n      fingerprint: this.fingerprint,\n      uid: shouldReplace ? this._uid : (this._uid + 1),\n      destination,\n    };\n\n    if (typeof PDFJSDev !== 'undefined' && PDFJSDev.test('CHROME') &&\n        window.history.state && window.history.state.chromecomState) {\n      // history.state.chromecomState is managed by chromecom.js.\n      newState.chromecomState = window.history.state.chromecomState;\n    }\n    this._updateInternalState(destination, newState.uid);\n\n    if (shouldReplace) {\n      window.history.replaceState(newState, '');\n    } else {\n      this._maxUid = this._uid;\n      window.history.pushState(newState, '');\n    }\n\n    if (typeof PDFJSDev !== 'undefined' && PDFJSDev.test('CHROME') &&\n        top === window) {\n      // eslint-disable-next-line no-undef\n      chrome.runtime.sendMessage('showPageAction');\n    }\n  }\n\n  /**\n   * @private\n   */\n  _tryPushCurrentPosition(temporary = false) {\n    if (!this._position) {\n      return;\n    }\n    let position = this._position;\n    if (temporary) {\n      position = Object.assign(Object.create(null), this._position);\n      position.temporary = true;\n    }\n\n    if (!this._destination) {\n      this._pushOrReplaceState(position);\n      return;\n    }\n    if (this._destination.temporary) {\n      // Always replace a previous *temporary* position.\n      this._pushOrReplaceState(position, /* forceReplace = */ true);\n      return;\n    }\n    if (this._destination.hash === position.hash) {\n      return; // The current document position has not changed.\n    }\n    if (!this._destination.page &&\n        (POSITION_UPDATED_THRESHOLD <= 0 ||\n         this._numPositionUpdates <= POSITION_UPDATED_THRESHOLD)) {\n      // `this._destination` was set through the user changing the hash of\n      // the document. Do not add `this._position` to the browser history,\n      // to avoid \"flooding\" it with lots of (nearly) identical entries,\n      // since we cannot ensure that the document position has changed.\n      return;\n    }\n\n    let forceReplace = false;\n    if (this._destination.page === position.first ||\n        this._destination.page === position.page) {\n      // When the `page` of `this._destination` is still visible, do not\n      // update the browsing history when `this._destination` either:\n      //  - contains an internal destination, since in this case we\n      //    cannot ensure that the document position has actually changed.\n      //  - was set through the user changing the hash of the document.\n      if (this._destination.dest || !this._destination.first) {\n        return;\n      }\n      // To avoid \"flooding\" the browser history, replace the current entry.\n      forceReplace = true;\n    }\n    this._pushOrReplaceState(position, forceReplace);\n  }\n\n  /**\n   * @private\n   */\n  _isValidState(state) {\n    if (!state) {\n      return false;\n    }\n    if (state.fingerprint !== this.fingerprint) {\n      // This should only occur in viewers with support for opening more than\n      // one PDF document, e.g. the GENERIC viewer.\n      return false;\n    }\n    if (!Number.isInteger(state.uid) || state.uid < 0) {\n      return false;\n    }\n    if (state.destination === null || typeof state.destination !== 'object') {\n      return false;\n    }\n    return true;\n  }\n\n  /**\n   * @private\n   */\n  _updateInternalState(destination, uid, removeTemporary = false) {\n    if (this._updateViewareaTimeout) {\n      // When updating `this._destination`, make sure that we always wait for\n      // the next 'updateviewarea' event before (potentially) attempting to\n      // push the current position to the browser history.\n      clearTimeout(this._updateViewareaTimeout);\n      this._updateViewareaTimeout = null;\n    }\n    if (removeTemporary && destination && destination.temporary) {\n      // When the `destination` comes from the browser history,\n      // we no longer treat it as a *temporary* position.\n      delete destination.temporary;\n    }\n    this._destination = destination;\n    this._uid = uid;\n    // This should always be reset when `this._destination` is updated.\n    this._numPositionUpdates = 0;\n  }\n\n  /**\n   * @private\n   */\n  _updateViewarea({ location, }) {\n    if (this._updateViewareaTimeout) {\n      clearTimeout(this._updateViewareaTimeout);\n      this._updateViewareaTimeout = null;\n    }\n\n    this._position = {\n      hash: this._isViewerInPresentationMode ?\n        `page=${location.pageNumber}` : location.pdfOpenParams.substring(1),\n      page: this.linkService.page,\n      first: location.pageNumber,\n      rotation: location.rotation,\n    };\n\n    if (this._popStateInProgress) {\n      return;\n    }\n\n    if (POSITION_UPDATED_THRESHOLD > 0 && this._isPagesLoaded &&\n        this._destination && !this._destination.page) {\n      // If the current destination was set through the user changing the hash\n      // of the document, we will usually not try to push the current position\n      // to the browser history; see `this._tryPushCurrentPosition()`.\n      //\n      // To prevent `this._tryPushCurrentPosition()` from effectively being\n      // reduced to a no-op in this case, we will assume that the position\n      // *did* in fact change if the 'updateviewarea' event was dispatched\n      // more than `POSITION_UPDATED_THRESHOLD` times.\n      this._numPositionUpdates++;\n    }\n\n    if (UPDATE_VIEWAREA_TIMEOUT > 0) {\n      // When closing the browser, a 'pagehide' event will be dispatched which\n      // *should* allow us to push the current position to the browser history.\n      // In practice, it seems that the event is arriving too late in order for\n      // the session history to be successfully updated.\n      // (For additional details, please refer to the discussion in\n      //  https://bugzilla.mozilla.org/show_bug.cgi?id=1153393.)\n      //\n      // To workaround this we attempt to *temporarily* add the current position\n      // to the browser history only when the viewer is *idle*,\n      // i.e. when scrolling and/or zooming does not occur.\n      //\n      // PLEASE NOTE: It's absolutely imperative that the browser history is\n      // *not* updated too often, since that would render the viewer more or\n      // less unusable. Hence the use of a timeout to delay the update until\n      // the viewer has been idle for `UPDATE_VIEWAREA_TIMEOUT` milliseconds.\n      this._updateViewareaTimeout = setTimeout(() => {\n        if (!this._popStateInProgress) {\n          this._tryPushCurrentPosition(/* temporary = */ true);\n        }\n        this._updateViewareaTimeout = null;\n      }, UPDATE_VIEWAREA_TIMEOUT);\n    }\n  }\n\n  /**\n   * @private\n   */\n  _popState({ state, }) {\n    let newHash = getCurrentHash(), hashChanged = this._currentHash !== newHash;\n    this._currentHash = newHash;\n\n    if (!state ||\n        (typeof PDFJSDev !== 'undefined' && PDFJSDev.test('CHROME') &&\n         state.chromecomState && !this._isValidState(state))) {\n      // This case corresponds to the user changing the hash of the document.\n      this._uid++;\n\n      let { hash, page, rotation, } = parseCurrentHash(this.linkService);\n      this._pushOrReplaceState({ hash, page, rotation, },\n                               /* forceReplace = */ true);\n      return;\n    }\n    if (!this._isValidState(state)) {\n      // This should only occur in viewers with support for opening more than\n      // one PDF document, e.g. the GENERIC viewer.\n      return;\n    }\n\n    // Prevent the browser history from updating until the new destination,\n    // as stored in the browser history, has been scrolled into view.\n    this._popStateInProgress = true;\n\n    if (hashChanged) {\n      // When the hash changed, implying that the 'popstate' event will be\n      // followed by a 'hashchange' event, then we do *not* want to update the\n      // browser history when handling the 'hashchange' event (in web/app.js)\n      // since that would *overwrite* the new destination navigated to below.\n      //\n      // To avoid accidentally disabling all future user-initiated hash changes,\n      // if there's e.g. another 'hashchange' listener that stops the event\n      // propagation, we make sure to always force-reset `this._blockHashChange`\n      // after `HASH_CHANGE_TIMEOUT` milliseconds have passed.\n      this._blockHashChange++;\n      waitOnEventOrTimeout({\n        target: window,\n        name: 'hashchange',\n        delay: HASH_CHANGE_TIMEOUT,\n      }).then(() => {\n        this._blockHashChange--;\n      });\n    }\n\n    // Navigate to the new destination.\n    let destination = state.destination;\n    this._updateInternalState(destination, state.uid,\n                              /* removeTemporary = */ true);\n    if (this._uid > this._maxUid) {\n      this._maxUid = this._uid;\n    }\n\n    if (isValidRotation(destination.rotation)) {\n      this.linkService.rotation = destination.rotation;\n    }\n    if (destination.dest) {\n      this.linkService.navigateTo(destination.dest);\n    } else if (destination.hash) {\n      this.linkService.setHash(destination.hash);\n    } else if (destination.page) {\n      // Fallback case; shouldn't be necessary, but better safe than sorry.\n      this.linkService.page = destination.page;\n    }\n\n    // Since `PDFLinkService.navigateTo` is asynchronous, we thus defer the\n    // resetting of `this._popStateInProgress` slightly.\n    Promise.resolve().then(() => {\n      this._popStateInProgress = false;\n    });\n  }\n\n  /**\n   * @private\n   */\n  _bindEvents() {\n    let { _boundEvents, eventBus, } = this;\n\n    _boundEvents.updateViewarea = this._updateViewarea.bind(this);\n    _boundEvents.popState = this._popState.bind(this);\n    _boundEvents.pageHide = (evt) => {\n      // Attempt to push the `this._position` into the browser history when\n      // navigating away from the document. This is *only* done if the history\n      // is empty/temporary, since otherwise an existing browser history entry\n      // will end up being overwritten (given that new entries cannot be pushed\n      // into the browser history when the 'unload' event has already fired).\n      if (!this._destination || this._destination.temporary) {\n        this._tryPushCurrentPosition();\n      }\n    };\n\n    eventBus.on('updateviewarea', _boundEvents.updateViewarea);\n    window.addEventListener('popstate', _boundEvents.popState);\n    window.addEventListener('pagehide', _boundEvents.pageHide);\n  }\n}\n\nfunction isDestHashesEqual(destHash, pushHash) {\n  if (typeof destHash !== 'string' || typeof pushHash !== 'string') {\n    return false;\n  }\n  if (destHash === pushHash) {\n    return true;\n  }\n  let { nameddest, } = parseQueryString(destHash);\n  if (nameddest === pushHash) {\n    return true;\n  }\n  return false;\n}\n\nfunction isDestArraysEqual(firstDest, secondDest) {\n  function isEntryEqual(first, second) {\n    if (typeof first !== typeof second) {\n      return false;\n    }\n    if (Array.isArray(first) || Array.isArray(second)) {\n      return false;\n    }\n    if (first !== null && typeof first === 'object' && second !== null) {\n      if (Object.keys(first).length !== Object.keys(second).length) {\n        return false;\n      }\n      for (let key in first) {\n        if (!isEntryEqual(first[key], second[key])) {\n          return false;\n        }\n      }\n      return true;\n    }\n    return first === second || (Number.isNaN(first) && Number.isNaN(second));\n  }\n\n  if (!(Array.isArray(firstDest) && Array.isArray(secondDest))) {\n    return false;\n  }\n  if (firstDest.length !== secondDest.length) {\n    return false;\n  }\n  for (let i = 0, ii = firstDest.length; i < ii; i++) {\n    if (!isEntryEqual(firstDest[i], secondDest[i])) {\n      return false;\n    }\n  }\n  return true;\n}\n\nexport {\n  PDFHistory,\n  isDestHashesEqual,\n  isDestArraysEqual,\n};\n","/* Copyright 2015 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getGlobalEventBus } from './dom_events';\nimport { parseQueryString } from './ui_utils';\n\n/**\n * @typedef {Object} PDFLinkServiceOptions\n * @property {EventBus} eventBus - The application event bus.\n * @property {number} externalLinkTarget - (optional) Specifies the `target`\n *   attribute for external links. Must use one of the values from {LinkTarget}.\n *   Defaults to using no target.\n * @property {string} externalLinkRel - (optional) Specifies the `rel` attribute\n *   for external links. Defaults to stripping the referrer.\n */\n\n/**\n * Performs navigation functions inside PDF, such as opening specified page,\n * or destination.\n * @implements {IPDFLinkService}\n */\nclass PDFLinkService {\n  /**\n   * @param {PDFLinkServiceOptions} options\n   */\n  constructor({ eventBus, externalLinkTarget = null,\n                externalLinkRel = null, } = {}) {\n    this.eventBus = eventBus || getGlobalEventBus();\n    this.externalLinkTarget = externalLinkTarget;\n    this.externalLinkRel = externalLinkRel;\n\n    this.baseUrl = null;\n    this.pdfDocument = null;\n    this.pdfViewer = null;\n    this.pdfHistory = null;\n\n    this._pagesRefCache = null;\n  }\n\n  setDocument(pdfDocument, baseUrl = null) {\n    this.baseUrl = baseUrl;\n    this.pdfDocument = pdfDocument;\n    this._pagesRefCache = Object.create(null);\n  }\n\n  setViewer(pdfViewer) {\n    this.pdfViewer = pdfViewer;\n  }\n\n  setHistory(pdfHistory) {\n    this.pdfHistory = pdfHistory;\n  }\n\n  /**\n   * @returns {number}\n   */\n  get pagesCount() {\n    return this.pdfDocument ? this.pdfDocument.numPages : 0;\n  }\n\n  /**\n   * @returns {number}\n   */\n  get page() {\n    return this.pdfViewer.currentPageNumber;\n  }\n\n  /**\n   * @param {number} value\n   */\n  set page(value) {\n    this.pdfViewer.currentPageNumber = value;\n  }\n\n  /**\n   * @returns {number}\n   */\n  get rotation() {\n    return this.pdfViewer.pagesRotation;\n  }\n\n  /**\n   * @param {number} value\n   */\n  set rotation(value) {\n    this.pdfViewer.pagesRotation = value;\n  }\n\n  /**\n   * @param {string|Array} dest - The named, or explicit, PDF destination.\n   */\n  navigateTo(dest) {\n    let goToDestination = ({ namedDest, explicitDest, }) => {\n      // Dest array looks like that: <page-ref> </XYZ|/FitXXX> <args..>\n      let destRef = explicitDest[0], pageNumber;\n\n      if (destRef instanceof Object) {\n        pageNumber = this._cachedPageNumber(destRef);\n\n        if (pageNumber === null) {\n          // Fetch the page reference if it's not yet available. This could\n          // only occur during loading, before all pages have been resolved.\n          this.pdfDocument.getPageIndex(destRef).then((pageIndex) => {\n            this.cachePageRef(pageIndex + 1, destRef);\n            goToDestination({ namedDest, explicitDest, });\n          }).catch(() => {\n            console.error(`PDFLinkService.navigateTo: \"${destRef}\" is not ` +\n                          `a valid page reference, for dest=\"${dest}\".`);\n          });\n          return;\n        }\n      } else if (Number.isInteger(destRef)) {\n        pageNumber = destRef + 1;\n      } else {\n        console.error(`PDFLinkService.navigateTo: \"${destRef}\" is not ` +\n                      `a valid destination reference, for dest=\"${dest}\".`);\n        return;\n      }\n      if (!pageNumber || pageNumber < 1 || pageNumber > this.pagesCount) {\n        console.error(`PDFLinkService.navigateTo: \"${pageNumber}\" is not ` +\n                      `a valid page number, for dest=\"${dest}\".`);\n        return;\n      }\n\n      if (this.pdfHistory) {\n        // Update the browser history before scrolling the new destination into\n        // view, to be able to accurately capture the current document position.\n        this.pdfHistory.pushCurrentPosition();\n        this.pdfHistory.push({ namedDest, explicitDest, pageNumber, });\n      }\n\n      this.pdfViewer.scrollPageIntoView({\n        pageNumber,\n        destArray: explicitDest,\n      });\n    };\n\n    new Promise((resolve, reject) => {\n      if (typeof dest === 'string') {\n        this.pdfDocument.getDestination(dest).then((destArray) => {\n          resolve({\n            namedDest: dest,\n            explicitDest: destArray,\n          });\n        });\n        return;\n      }\n      resolve({\n        namedDest: '',\n        explicitDest: dest,\n      });\n    }).then((data) => {\n      if (!Array.isArray(data.explicitDest)) {\n        console.error(`PDFLinkService.navigateTo: \"${data.explicitDest}\" is` +\n                      ` not a valid destination array, for dest=\"${dest}\".`);\n        return;\n      }\n      goToDestination(data);\n    });\n  }\n\n  /**\n   * @param {string|Array} dest - The PDF destination object.\n   * @returns {string} The hyperlink to the PDF object.\n   */\n  getDestinationHash(dest) {\n    if (typeof dest === 'string') {\n      return this.getAnchorUrl('#' + escape(dest));\n    }\n    if (Array.isArray(dest)) {\n      let str = JSON.stringify(dest);\n      return this.getAnchorUrl('#' + escape(str));\n    }\n    return this.getAnchorUrl('');\n  }\n\n  /**\n   * Prefix the full url on anchor links to make sure that links are resolved\n   * relative to the current URL instead of the one defined in <base href>.\n   * @param {String} anchor The anchor hash, including the #.\n   * @returns {string} The hyperlink to the PDF object.\n   */\n  getAnchorUrl(anchor) {\n    return (this.baseUrl || '') + anchor;\n  }\n\n  /**\n   * @param {string} hash\n   */\n  setHash(hash) {\n    let pageNumber, dest;\n    if (hash.includes('=')) {\n      let params = parseQueryString(hash);\n      if ('search' in params) {\n        this.eventBus.dispatch('findfromurlhash', {\n          source: this,\n          query: params['search'].replace(/\"/g, ''),\n          phraseSearch: (params['phrase'] === 'true'),\n        });\n      }\n      // borrowing syntax from \"Parameters for Opening PDF Files\"\n      if ('nameddest' in params) {\n        this.navigateTo(params.nameddest);\n        return;\n      }\n      if ('page' in params) {\n        pageNumber = (params.page | 0) || 1;\n      }\n      if ('zoom' in params) {\n        // Build the destination array.\n        let zoomArgs = params.zoom.split(','); // scale,left,top\n        let zoomArg = zoomArgs[0];\n        let zoomArgNumber = parseFloat(zoomArg);\n\n        if (!zoomArg.includes('Fit')) {\n          // If the zoomArg is a number, it has to get divided by 100. If it's\n          // a string, it should stay as it is.\n          dest = [null, { name: 'XYZ', },\n                  zoomArgs.length > 1 ? (zoomArgs[1] | 0) : null,\n                  zoomArgs.length > 2 ? (zoomArgs[2] | 0) : null,\n                  (zoomArgNumber ? zoomArgNumber / 100 : zoomArg)];\n        } else {\n          if (zoomArg === 'Fit' || zoomArg === 'FitB') {\n            dest = [null, { name: zoomArg, }];\n          } else if ((zoomArg === 'FitH' || zoomArg === 'FitBH') ||\n                     (zoomArg === 'FitV' || zoomArg === 'FitBV')) {\n            dest = [null, { name: zoomArg, },\n                    zoomArgs.length > 1 ? (zoomArgs[1] | 0) : null];\n          } else if (zoomArg === 'FitR') {\n            if (zoomArgs.length !== 5) {\n              console.error(\n                'PDFLinkService.setHash: Not enough parameters for \"FitR\".');\n            } else {\n              dest = [null, { name: zoomArg, },\n                      (zoomArgs[1] | 0), (zoomArgs[2] | 0),\n                      (zoomArgs[3] | 0), (zoomArgs[4] | 0)];\n            }\n          } else {\n            console.error(`PDFLinkService.setHash: \"${zoomArg}\" is not ` +\n                          'a valid zoom value.');\n          }\n        }\n      }\n      if (dest) {\n        this.pdfViewer.scrollPageIntoView({\n          pageNumber: pageNumber || this.page,\n          destArray: dest,\n          allowNegativeOffset: true,\n        });\n      } else if (pageNumber) {\n        this.page = pageNumber; // simple page\n      }\n      if ('pagemode' in params) {\n        this.eventBus.dispatch('pagemode', {\n          source: this,\n          mode: params.pagemode,\n        });\n      }\n    } else { // Named (or explicit) destination.\n      dest = unescape(hash);\n      try {\n        dest = JSON.parse(dest);\n\n        if (!Array.isArray(dest)) {\n          // Avoid incorrectly rejecting a valid named destination, such as\n          // e.g. \"4.3\" or \"true\", because `JSON.parse` converted its type.\n          dest = dest.toString();\n        }\n      } catch (ex) {}\n\n      if (typeof dest === 'string' || isValidExplicitDestination(dest)) {\n        this.navigateTo(dest);\n        return;\n      }\n      console.error(`PDFLinkService.setHash: \"${unescape(hash)}\" is not ` +\n                    'a valid destination.');\n    }\n  }\n\n  /**\n   * @param {string} action\n   */\n  executeNamedAction(action) {\n    // See PDF reference, table 8.45 - Named action\n    switch (action) {\n      case 'GoBack':\n        if (this.pdfHistory) {\n          this.pdfHistory.back();\n        }\n        break;\n\n      case 'GoForward':\n        if (this.pdfHistory) {\n          this.pdfHistory.forward();\n        }\n        break;\n\n      case 'NextPage':\n        if (this.page < this.pagesCount) {\n          this.page++;\n        }\n        break;\n\n      case 'PrevPage':\n        if (this.page > 1) {\n          this.page--;\n        }\n        break;\n\n      case 'LastPage':\n        this.page = this.pagesCount;\n        break;\n\n      case 'FirstPage':\n        this.page = 1;\n        break;\n\n      default:\n        break; // No action according to spec\n    }\n\n    this.eventBus.dispatch('namedaction', {\n      source: this,\n      action,\n    });\n  }\n\n  /**\n   * @param {number} pageNum - page number.\n   * @param {Object} pageRef - reference to the page.\n   */\n  cachePageRef(pageNum, pageRef) {\n    if (!pageRef) {\n      return;\n    }\n    let refStr = pageRef.num + ' ' + pageRef.gen + ' R';\n    this._pagesRefCache[refStr] = pageNum;\n  }\n\n  _cachedPageNumber(pageRef) {\n    let refStr = pageRef.num + ' ' + pageRef.gen + ' R';\n    return (this._pagesRefCache && this._pagesRefCache[refStr]) || null;\n  }\n}\n\nfunction isValidExplicitDestination(dest) {\n  if (!Array.isArray(dest)) {\n    return false;\n  }\n  let destLength = dest.length, allowNull = true;\n  if (destLength < 2) {\n    return false;\n  }\n  let page = dest[0];\n  if (!(typeof page === 'object' &&\n        Number.isInteger(page.num) && Number.isInteger(page.gen)) &&\n      !(Number.isInteger(page) && page >= 0)) {\n    return false;\n  }\n  let zoom = dest[1];\n  if (!(typeof zoom === 'object' && typeof zoom.name === 'string')) {\n    return false;\n  }\n  switch (zoom.name) {\n    case 'XYZ':\n      if (destLength !== 5) {\n        return false;\n      }\n      break;\n    case 'Fit':\n    case 'FitB':\n      return destLength === 2;\n    case 'FitH':\n    case 'FitBH':\n    case 'FitV':\n    case 'FitBV':\n      if (destLength !== 3) {\n        return false;\n      }\n      break;\n    case 'FitR':\n      if (destLength !== 6) {\n        return false;\n      }\n      allowNull = false;\n      break;\n    default:\n      return false;\n  }\n  for (let i = 2; i < destLength; i++) {\n    let param = dest[i];\n    if (!(typeof param === 'number' || (allowNull && param === null))) {\n      return false;\n    }\n  }\n  return true;\n}\n\n/**\n * @implements {IPDFLinkService}\n */\nclass SimpleLinkService {\n  constructor() {\n    this.externalLinkTarget = null;\n    this.externalLinkRel = null;\n  }\n\n  /**\n   * @returns {number}\n   */\n  get pagesCount() {\n    return 0;\n  }\n\n  /**\n   * @returns {number}\n   */\n  get page() {\n    return 0;\n  }\n\n  /**\n   * @param {number} value\n   */\n  set page(value) {}\n\n  /**\n   * @returns {number}\n   */\n  get rotation() {\n    return 0;\n  }\n\n  /**\n   * @param {number} value\n   */\n  set rotation(value) {}\n\n  /**\n   * @param dest - The PDF destination object.\n   */\n  navigateTo(dest) {}\n\n  /**\n   * @param dest - The PDF destination object.\n   * @returns {string} The hyperlink to the PDF object.\n   */\n  getDestinationHash(dest) {\n    return '#';\n  }\n\n  /**\n   * @param hash - The PDF parameters/hash.\n   * @returns {string} The hyperlink to the PDF object.\n   */\n  getAnchorUrl(hash) {\n    return '#';\n  }\n\n  /**\n   * @param {string} hash\n   */\n  setHash(hash) {}\n\n  /**\n   * @param {string} action\n   */\n  executeNamedAction(action) {}\n\n  /**\n   * @param {number} pageNum - page number.\n   * @param {Object} pageRef - reference to the page.\n   */\n  cachePageRef(pageNum, pageRef) {}\n}\n\nexport {\n  PDFLinkService,\n  SimpleLinkService,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { addLinkAttributes, LinkTarget, removeNullCharacters } from 'pdfjs-lib';\n\nconst DEFAULT_TITLE = '\\u2013';\n\n/**\n * @typedef {Object} PDFOutlineViewerOptions\n * @property {HTMLDivElement} container - The viewer element.\n * @property {IPDFLinkService} linkService - The navigation/linking service.\n * @property {EventBus} eventBus - The application event bus.\n */\n\n/**\n * @typedef {Object} PDFOutlineViewerRenderParameters\n * @property {Array|null} outline - An array of outline objects.\n */\n\nclass PDFOutlineViewer {\n  /**\n   * @param {PDFOutlineViewerOptions} options\n   */\n  constructor({ container, linkService, eventBus, }) {\n    this.container = container;\n    this.linkService = linkService;\n    this.eventBus = eventBus;\n\n    this.reset();\n\n    eventBus.on('toggleoutlinetree', this.toggleOutlineTree.bind(this));\n  }\n\n  reset() {\n    this.outline = null;\n    this.lastToggleIsShow = true;\n\n    // Remove the outline from the DOM.\n    this.container.textContent = '';\n\n    // Ensure that the left (right in RTL locales) margin is always reset,\n    // to prevent incorrect outline alignment if a new document is opened.\n    this.container.classList.remove('outlineWithDeepNesting');\n  }\n\n  /**\n   * @private\n   */\n  _dispatchEvent(outlineCount) {\n    this.eventBus.dispatch('outlineloaded', {\n      source: this,\n      outlineCount,\n    });\n  }\n\n  /**\n   * @private\n   */\n  _bindLink(element, { url, newWindow, dest, }) {\n    let { linkService, } = this;\n\n    if (url) {\n      addLinkAttributes(element, {\n        url,\n        target: (newWindow ? LinkTarget.BLANK : linkService.externalLinkTarget),\n        rel: linkService.externalLinkRel,\n      });\n      return;\n    }\n\n    element.href = linkService.getDestinationHash(dest);\n    element.onclick = () => {\n      if (dest) {\n        linkService.navigateTo(dest);\n      }\n      return false;\n    };\n  }\n\n  /**\n   * @private\n   */\n  _setStyles(element, { bold, italic, }) {\n    let styleStr = '';\n    if (bold) {\n      styleStr += 'font-weight: bold;';\n    }\n    if (italic) {\n      styleStr += 'font-style: italic;';\n    }\n\n    if (styleStr) {\n      element.setAttribute('style', styleStr);\n    }\n  }\n\n  /**\n   * Prepend a button before an outline item which allows the user to toggle\n   * the visibility of all outline items at that level.\n   *\n   * @private\n   */\n  _addToggleButton(div) {\n    let toggler = document.createElement('div');\n    toggler.className = 'outlineItemToggler';\n    toggler.onclick = (evt) => {\n      evt.stopPropagation();\n      toggler.classList.toggle('outlineItemsHidden');\n\n      if (evt.shiftKey) {\n        let shouldShowAll = !toggler.classList.contains('outlineItemsHidden');\n        this._toggleOutlineItem(div, shouldShowAll);\n      }\n    };\n    div.insertBefore(toggler, div.firstChild);\n  }\n\n  /**\n   * Toggle the visibility of the subtree of an outline item.\n   *\n   * @param {Element} root - the root of the outline (sub)tree.\n   * @param {boolean} show - whether to show the outline (sub)tree. If false,\n   *   the outline subtree rooted at |root| will be collapsed.\n   *\n   * @private\n   */\n  _toggleOutlineItem(root, show) {\n    this.lastToggleIsShow = show;\n    let togglers = root.querySelectorAll('.outlineItemToggler');\n    for (let i = 0, ii = togglers.length; i < ii; ++i) {\n      togglers[i].classList[show ? 'remove' : 'add']('outlineItemsHidden');\n    }\n  }\n\n  /**\n   * Collapse or expand all subtrees of the outline.\n   */\n  toggleOutlineTree() {\n    if (!this.outline) {\n      return;\n    }\n    this._toggleOutlineItem(this.container, !this.lastToggleIsShow);\n  }\n\n  /**\n   * @param {PDFOutlineViewerRenderParameters} params\n   */\n  render({ outline, }) {\n    let outlineCount = 0;\n\n    if (this.outline) {\n      this.reset();\n    }\n    this.outline = outline || null;\n\n    if (!outline) {\n      this._dispatchEvent(outlineCount);\n      return;\n    }\n\n    let fragment = document.createDocumentFragment();\n    let queue = [{ parent: fragment, items: this.outline, }];\n    let hasAnyNesting = false;\n    while (queue.length > 0) {\n      let levelData = queue.shift();\n      for (let i = 0, len = levelData.items.length; i < len; i++) {\n        let item = levelData.items[i];\n\n        let div = document.createElement('div');\n        div.className = 'outlineItem';\n\n        let element = document.createElement('a');\n        this._bindLink(element, item);\n        this._setStyles(element, item);\n        element.textContent =\n          removeNullCharacters(item.title) || DEFAULT_TITLE;\n\n        div.appendChild(element);\n\n        if (item.items.length > 0) {\n          hasAnyNesting = true;\n          this._addToggleButton(div);\n\n          let itemsDiv = document.createElement('div');\n          itemsDiv.className = 'outlineItems';\n          div.appendChild(itemsDiv);\n          queue.push({ parent: itemsDiv, items: item.items, });\n        }\n\n        levelData.parent.appendChild(div);\n        outlineCount++;\n      }\n    }\n    if (hasAnyNesting) {\n      this.container.classList.add('outlineWithDeepNesting');\n    }\n\n    this.container.appendChild(fragment);\n\n    this._dispatchEvent(outlineCount);\n  }\n}\n\nexport {\n  PDFOutlineViewer,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { normalizeWheelEventDelta } from './ui_utils';\n\nconst DELAY_BEFORE_RESETTING_SWITCH_IN_PROGRESS = 1500; // in ms\nconst DELAY_BEFORE_HIDING_CONTROLS = 3000; // in ms\nconst ACTIVE_SELECTOR = 'pdfPresentationMode';\nconst CONTROLS_SELECTOR = 'pdfPresentationModeControls';\nconst MOUSE_SCROLL_COOLDOWN_TIME = 50; // in ms\nconst PAGE_SWITCH_THRESHOLD = 0.1;\n\n// Number of CSS pixels for a movement to count as a swipe.\nconst SWIPE_MIN_DISTANCE_THRESHOLD = 50;\n\n// Swipe angle deviation from the x or y axis before it is not\n// considered a swipe in that direction any more.\nconst SWIPE_ANGLE_THRESHOLD = Math.PI / 6;\n\n/**\n * @typedef {Object} PDFPresentationModeOptions\n * @property {HTMLDivElement} container - The container for the viewer element.\n * @property {HTMLDivElement} viewer - (optional) The viewer element.\n * @property {PDFViewer} pdfViewer - The document viewer.\n * @property {EventBus} eventBus - The application event bus.\n * @property {Array} contextMenuItems - (optional) The menu items that are added\n *   to the context menu in Presentation Mode.\n */\n\nclass PDFPresentationMode {\n  /**\n   * @param {PDFPresentationModeOptions} options\n   */\n  constructor({ container, viewer = null, pdfViewer, eventBus,\n                contextMenuItems = null, }) {\n    this.container = container;\n    this.viewer = viewer || container.firstElementChild;\n    this.pdfViewer = pdfViewer;\n    this.eventBus = eventBus;\n\n    this.active = false;\n    this.args = null;\n    this.contextMenuOpen = false;\n    this.mouseScrollTimeStamp = 0;\n    this.mouseScrollDelta = 0;\n    this.touchSwipeState = null;\n\n    if (contextMenuItems) {\n      contextMenuItems.contextFirstPage.addEventListener('click', () => {\n        this.contextMenuOpen = false;\n        this.eventBus.dispatch('firstpage', { source: this, });\n      });\n      contextMenuItems.contextLastPage.addEventListener('click', () => {\n        this.contextMenuOpen = false;\n        this.eventBus.dispatch('lastpage', { source: this, });\n      });\n      contextMenuItems.contextPageRotateCw.addEventListener('click', () => {\n        this.contextMenuOpen = false;\n        this.eventBus.dispatch('rotatecw', { source: this, });\n      });\n      contextMenuItems.contextPageRotateCcw.addEventListener('click', () => {\n        this.contextMenuOpen = false;\n        this.eventBus.dispatch('rotateccw', { source: this, });\n      });\n    }\n  }\n\n  /**\n   * Request the browser to enter fullscreen mode.\n   * @returns {boolean} Indicating if the request was successful.\n   */\n  request() {\n    if (this.switchInProgress || this.active || !this.viewer.hasChildNodes()) {\n      return false;\n    }\n    this._addFullscreenChangeListeners();\n    this._setSwitchInProgress();\n    this._notifyStateChange();\n\n    if (this.container.requestFullscreen) {\n      this.container.requestFullscreen();\n    } else if (this.container.mozRequestFullScreen) {\n      this.container.mozRequestFullScreen();\n    } else if (this.container.webkitRequestFullscreen) {\n      this.container.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT);\n    } else if (this.container.msRequestFullscreen) {\n      this.container.msRequestFullscreen();\n    } else {\n      return false;\n    }\n\n    this.args = {\n      page: this.pdfViewer.currentPageNumber,\n      previousScale: this.pdfViewer.currentScaleValue,\n    };\n\n    return true;\n  }\n\n  /**\n   * @private\n   */\n  _mouseWheel(evt) {\n    if (!this.active) {\n      return;\n    }\n\n    evt.preventDefault();\n\n    let delta = normalizeWheelEventDelta(evt);\n    let currentTime = (new Date()).getTime();\n    let storedTime = this.mouseScrollTimeStamp;\n\n    // If we've already switched page, avoid accidentally switching again.\n    if (currentTime > storedTime &&\n        currentTime - storedTime < MOUSE_SCROLL_COOLDOWN_TIME) {\n      return;\n    }\n    // If the scroll direction changed, reset the accumulated scroll delta.\n    if ((this.mouseScrollDelta > 0 && delta < 0) ||\n        (this.mouseScrollDelta < 0 && delta > 0)) {\n      this._resetMouseScrollState();\n    }\n    this.mouseScrollDelta += delta;\n\n    if (Math.abs(this.mouseScrollDelta) >= PAGE_SWITCH_THRESHOLD) {\n      let totalDelta = this.mouseScrollDelta;\n      this._resetMouseScrollState();\n      let success = totalDelta > 0 ? this._goToPreviousPage()\n                                   : this._goToNextPage();\n      if (success) {\n        this.mouseScrollTimeStamp = currentTime;\n      }\n    }\n  }\n\n  get isFullscreen() {\n    return !!(document.fullscreenElement || document.mozFullScreen ||\n              document.webkitIsFullScreen || document.msFullscreenElement);\n  }\n\n  /**\n   * @private\n   */\n  _goToPreviousPage() {\n    let page = this.pdfViewer.currentPageNumber;\n    // If we're at the first page, we don't need to do anything.\n    if (page <= 1) {\n      return false;\n    }\n    this.pdfViewer.currentPageNumber = (page - 1);\n    return true;\n  }\n\n  /**\n   * @private\n   */\n  _goToNextPage() {\n    let page = this.pdfViewer.currentPageNumber;\n    // If we're at the last page, we don't need to do anything.\n    if (page >= this.pdfViewer.pagesCount) {\n      return false;\n    }\n    this.pdfViewer.currentPageNumber = (page + 1);\n    return true;\n  }\n\n  /**\n   * @private\n   */\n  _notifyStateChange() {\n    this.eventBus.dispatch('presentationmodechanged', {\n      source: this,\n      active: this.active,\n      switchInProgress: !!this.switchInProgress,\n    });\n  }\n\n  /**\n   * Used to initialize a timeout when requesting Presentation Mode,\n   * i.e. when the browser is requested to enter fullscreen mode.\n   * This timeout is used to prevent the current page from being scrolled\n   * partially, or completely, out of view when entering Presentation Mode.\n   * NOTE: This issue seems limited to certain zoom levels (e.g. page-width).\n   *\n   * @private\n   */\n  _setSwitchInProgress() {\n    if (this.switchInProgress) {\n      clearTimeout(this.switchInProgress);\n    }\n    this.switchInProgress = setTimeout(() => {\n      this._removeFullscreenChangeListeners();\n      delete this.switchInProgress;\n      this._notifyStateChange();\n    }, DELAY_BEFORE_RESETTING_SWITCH_IN_PROGRESS);\n  }\n\n  /**\n   * @private\n   */\n  _resetSwitchInProgress() {\n    if (this.switchInProgress) {\n      clearTimeout(this.switchInProgress);\n      delete this.switchInProgress;\n    }\n  }\n\n  /**\n   * @private\n   */\n  _enter() {\n    this.active = true;\n    this._resetSwitchInProgress();\n    this._notifyStateChange();\n    this.container.classList.add(ACTIVE_SELECTOR);\n\n    // Ensure that the correct page is scrolled into view when entering\n    // Presentation Mode, by waiting until fullscreen mode in enabled.\n    setTimeout(() => {\n      this.pdfViewer.currentPageNumber = this.args.page;\n      this.pdfViewer.currentScaleValue = 'page-fit';\n    }, 0);\n\n    this._addWindowListeners();\n    this._showControls();\n    this.contextMenuOpen = false;\n    this.container.setAttribute('contextmenu', 'viewerContextMenu');\n\n    // Text selection is disabled in Presentation Mode, thus it's not possible\n    // for the user to deselect text that is selected (e.g. with \"Select all\")\n    // when entering Presentation Mode, hence we remove any active selection.\n    window.getSelection().removeAllRanges();\n  }\n\n  /**\n   * @private\n   */\n  _exit() {\n    let page = this.pdfViewer.currentPageNumber;\n    this.container.classList.remove(ACTIVE_SELECTOR);\n\n    // Ensure that the correct page is scrolled into view when exiting\n    // Presentation Mode, by waiting until fullscreen mode is disabled.\n    setTimeout(() => {\n      this.active = false;\n      this._removeFullscreenChangeListeners();\n      this._notifyStateChange();\n\n      this.pdfViewer.currentScaleValue = this.args.previousScale;\n      this.pdfViewer.currentPageNumber = page;\n      this.args = null;\n    }, 0);\n\n    this._removeWindowListeners();\n    this._hideControls();\n    this._resetMouseScrollState();\n    this.container.removeAttribute('contextmenu');\n    this.contextMenuOpen = false;\n  }\n\n  /**\n   * @private\n   */\n  _mouseDown(evt) {\n    if (this.contextMenuOpen) {\n      this.contextMenuOpen = false;\n      evt.preventDefault();\n      return;\n    }\n    if (evt.button === 0) {\n      // Enable clicking of links in presentation mode. Note: only links\n      // pointing to destinations in the current PDF document work.\n      let isInternalLink = (evt.target.href &&\n                            evt.target.classList.contains('internalLink'));\n      if (!isInternalLink) {\n        // Unless an internal link was clicked, advance one page.\n        evt.preventDefault();\n\n        if (evt.shiftKey) {\n          this._goToPreviousPage();\n        } else {\n          this._goToNextPage();\n        }\n      }\n    }\n  }\n\n  /**\n   * @private\n   */\n  _contextMenu() {\n    this.contextMenuOpen = true;\n  }\n\n  /**\n   * @private\n   */\n  _showControls() {\n    if (this.controlsTimeout) {\n      clearTimeout(this.controlsTimeout);\n    } else {\n      this.container.classList.add(CONTROLS_SELECTOR);\n    }\n    this.controlsTimeout = setTimeout(() => {\n      this.container.classList.remove(CONTROLS_SELECTOR);\n      delete this.controlsTimeout;\n    }, DELAY_BEFORE_HIDING_CONTROLS);\n  }\n\n  /**\n   * @private\n   */\n  _hideControls() {\n    if (!this.controlsTimeout) {\n      return;\n    }\n    clearTimeout(this.controlsTimeout);\n    this.container.classList.remove(CONTROLS_SELECTOR);\n    delete this.controlsTimeout;\n  }\n\n  /**\n   * Resets the properties used for tracking mouse scrolling events.\n   *\n   * @private\n   */\n  _resetMouseScrollState() {\n    this.mouseScrollTimeStamp = 0;\n    this.mouseScrollDelta = 0;\n  }\n\n  /**\n   * @private\n   */\n  _touchSwipe(evt) {\n    if (!this.active) {\n      return;\n    }\n    if (evt.touches.length > 1) {\n      // Multiple touch points detected; cancel the swipe.\n      this.touchSwipeState = null;\n      return;\n    }\n\n    switch (evt.type) {\n      case 'touchstart':\n        this.touchSwipeState = {\n          startX: evt.touches[0].pageX,\n          startY: evt.touches[0].pageY,\n          endX: evt.touches[0].pageX,\n          endY: evt.touches[0].pageY,\n        };\n        break;\n      case 'touchmove':\n        if (this.touchSwipeState === null) {\n          return;\n        }\n        this.touchSwipeState.endX = evt.touches[0].pageX;\n        this.touchSwipeState.endY = evt.touches[0].pageY;\n        // Avoid the swipe from triggering browser gestures (Chrome in\n        // particular has some sort of swipe gesture in fullscreen mode).\n        evt.preventDefault();\n        break;\n      case 'touchend':\n        if (this.touchSwipeState === null) {\n          return;\n        }\n        let delta = 0;\n        let dx = this.touchSwipeState.endX - this.touchSwipeState.startX;\n        let dy = this.touchSwipeState.endY - this.touchSwipeState.startY;\n        let absAngle = Math.abs(Math.atan2(dy, dx));\n        if (Math.abs(dx) > SWIPE_MIN_DISTANCE_THRESHOLD &&\n            (absAngle <= SWIPE_ANGLE_THRESHOLD ||\n             absAngle >= (Math.PI - SWIPE_ANGLE_THRESHOLD))) {\n          // Horizontal swipe.\n          delta = dx;\n        } else if (Math.abs(dy) > SWIPE_MIN_DISTANCE_THRESHOLD &&\n            Math.abs(absAngle - (Math.PI / 2)) <= SWIPE_ANGLE_THRESHOLD) {\n          // Vertical swipe.\n          delta = dy;\n        }\n        if (delta > 0) {\n          this._goToPreviousPage();\n        } else if (delta < 0) {\n          this._goToNextPage();\n        }\n        break;\n    }\n  }\n\n  /**\n   * @private\n   */\n  _addWindowListeners() {\n    this.showControlsBind = this._showControls.bind(this);\n    this.mouseDownBind = this._mouseDown.bind(this);\n    this.mouseWheelBind = this._mouseWheel.bind(this);\n    this.resetMouseScrollStateBind = this._resetMouseScrollState.bind(this);\n    this.contextMenuBind = this._contextMenu.bind(this);\n    this.touchSwipeBind = this._touchSwipe.bind(this);\n\n    window.addEventListener('mousemove', this.showControlsBind);\n    window.addEventListener('mousedown', this.mouseDownBind);\n    window.addEventListener('wheel', this.mouseWheelBind);\n    window.addEventListener('keydown', this.resetMouseScrollStateBind);\n    window.addEventListener('contextmenu', this.contextMenuBind);\n    window.addEventListener('touchstart', this.touchSwipeBind);\n    window.addEventListener('touchmove', this.touchSwipeBind);\n    window.addEventListener('touchend', this.touchSwipeBind);\n  }\n\n  /**\n   * @private\n   */\n  _removeWindowListeners() {\n    window.removeEventListener('mousemove', this.showControlsBind);\n    window.removeEventListener('mousedown', this.mouseDownBind);\n    window.removeEventListener('wheel', this.mouseWheelBind);\n    window.removeEventListener('keydown', this.resetMouseScrollStateBind);\n    window.removeEventListener('contextmenu', this.contextMenuBind);\n    window.removeEventListener('touchstart', this.touchSwipeBind);\n    window.removeEventListener('touchmove', this.touchSwipeBind);\n    window.removeEventListener('touchend', this.touchSwipeBind);\n\n    delete this.showControlsBind;\n    delete this.mouseDownBind;\n    delete this.mouseWheelBind;\n    delete this.resetMouseScrollStateBind;\n    delete this.contextMenuBind;\n    delete this.touchSwipeBind;\n  }\n\n  /**\n   * @private\n   */\n  _fullscreenChange() {\n    if (this.isFullscreen) {\n      this._enter();\n    } else {\n      this._exit();\n    }\n  }\n\n  /**\n   * @private\n   */\n  _addFullscreenChangeListeners() {\n    this.fullscreenChangeBind = this._fullscreenChange.bind(this);\n\n    window.addEventListener('fullscreenchange', this.fullscreenChangeBind);\n    window.addEventListener('mozfullscreenchange', this.fullscreenChangeBind);\n    if (typeof PDFJSDev === 'undefined' ||\n        !PDFJSDev.test('FIREFOX || MOZCENTRAL')) {\n      window.addEventListener('webkitfullscreenchange',\n                              this.fullscreenChangeBind);\n      window.addEventListener('MSFullscreenChange',\n                              this.fullscreenChangeBind);\n    }\n  }\n\n  /**\n   * @private\n   */\n  _removeFullscreenChangeListeners() {\n    window.removeEventListener('fullscreenchange', this.fullscreenChangeBind);\n    window.removeEventListener('mozfullscreenchange',\n                               this.fullscreenChangeBind);\n    if (typeof PDFJSDev === 'undefined' ||\n        !PDFJSDev.test('FIREFOX || MOZCENTRAL')) {\n      window.removeEventListener('webkitfullscreenchange',\n                                 this.fullscreenChangeBind);\n      window.removeEventListener('MSFullscreenChange',\n                                 this.fullscreenChangeBind);\n    }\n\n    delete this.fullscreenChangeBind;\n  }\n}\n\nexport {\n  PDFPresentationMode,\n};\n","/* Copyright 2017 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { NullL10n } from './ui_utils';\n\nconst SIDEBAR_WIDTH_VAR = '--sidebar-width';\nconst SIDEBAR_MIN_WIDTH = 200; // pixels\nconst SIDEBAR_RESIZING_CLASS = 'sidebarResizing';\n\n/**\n * @typedef {Object} PDFSidebarResizerOptions\n * @property {HTMLDivElement} outerContainer - The outer container\n *   (encasing both the viewer and sidebar elements).\n * @property {HTMLDivElement} resizer - The DOM element that can be dragged in\n *   order to adjust the width of the sidebar.\n */\n\nclass PDFSidebarResizer {\n  /**\n   * @param {PDFSidebarResizerOptions} options\n   * @param {EventBus} eventBus - The application event bus.\n   * @param {IL10n} l10n - Localization service.\n   */\n  constructor(options, eventBus, l10n = NullL10n) {\n    this.enabled = false;\n    this.isRTL = false;\n    this.sidebarOpen = false;\n    this.doc = document.documentElement;\n    this._width = null;\n    this._outerContainerWidth = null;\n    this._boundEvents = Object.create(null);\n\n    this.outerContainer = options.outerContainer;\n    this.resizer = options.resizer;\n    this.eventBus = eventBus;\n    this.l10n = l10n;\n\n    if (typeof CSS === 'undefined' || typeof CSS.supports !== 'function' ||\n        !CSS.supports(SIDEBAR_WIDTH_VAR, `calc(-1 * ${SIDEBAR_MIN_WIDTH}px)`)) {\n      console.warn('PDFSidebarResizer: ' +\n                   'The browser does not support resizing of the sidebar.');\n      return;\n    }\n    this.enabled = true;\n    this.resizer.classList.remove('hidden'); // Show the resizer DOM element.\n\n    this.l10n.getDirection().then((dir) => {\n      this.isRTL = (dir === 'rtl');\n    });\n    this._addEventListeners();\n  }\n\n  /**\n   * returns {number}\n   */\n  get outerContainerWidth() {\n    if (!this._outerContainerWidth) {\n      this._outerContainerWidth = this.outerContainer.clientWidth;\n    }\n    return this._outerContainerWidth;\n  }\n\n  /**\n   * @private\n   * returns {boolean} Indicating if the sidebar width was updated.\n   */\n  _updateWidth(width = 0) {\n    if (!this.enabled) {\n      return false;\n    }\n    // Prevent the sidebar from becoming too narrow, or from occupying more\n    // than half of the available viewer width.\n    const maxWidth = Math.floor(this.outerContainerWidth / 2);\n    if (width > maxWidth) {\n      width = maxWidth;\n    }\n    if (width < SIDEBAR_MIN_WIDTH) {\n      width = SIDEBAR_MIN_WIDTH;\n    }\n    // Only update the UI when the sidebar width did in fact change.\n    if (width === this._width) {\n      return false;\n    }\n    this._width = width;\n    this.doc.style.setProperty(SIDEBAR_WIDTH_VAR, `${width}px`);\n    return true;\n  }\n\n  /**\n   * @private\n   */\n  _mouseMove(evt) {\n    let width = evt.clientX;\n    // For sidebar resizing to work correctly in RTL mode, invert the width.\n    if (this.isRTL) {\n      width = this.outerContainerWidth - width;\n    }\n    this._updateWidth(width);\n  }\n\n  /**\n   * @private\n   */\n  _mouseUp(evt) {\n    // Re-enable the `transition-duration` rules when sidebar resizing ends...\n    this.outerContainer.classList.remove(SIDEBAR_RESIZING_CLASS);\n    // ... and ensure that rendering will always be triggered.\n    this.eventBus.dispatch('resize', { source: this, });\n\n    let _boundEvents = this._boundEvents;\n    window.removeEventListener('mousemove', _boundEvents.mouseMove);\n    window.removeEventListener('mouseup', _boundEvents.mouseUp);\n  }\n\n  /**\n   * @private\n   */\n  _addEventListeners() {\n    if (!this.enabled) {\n      return;\n    }\n    let _boundEvents = this._boundEvents;\n    _boundEvents.mouseMove = this._mouseMove.bind(this);\n    _boundEvents.mouseUp = this._mouseUp.bind(this);\n\n    this.resizer.addEventListener('mousedown', (evt) => {\n      if (evt.button !== 0) {\n        return;\n      }\n      // Disable the `transition-duration` rules when sidebar resizing begins,\n      // in order to improve responsiveness and to avoid visual glitches.\n      this.outerContainer.classList.add(SIDEBAR_RESIZING_CLASS);\n\n      window.addEventListener('mousemove', _boundEvents.mouseMove);\n      window.addEventListener('mouseup', _boundEvents.mouseUp);\n    });\n\n    this.eventBus.on('sidebarviewchanged', (evt) => {\n      this.sidebarOpen = !!(evt && evt.view);\n    });\n\n    this.eventBus.on('resize', (evt) => {\n      // When the *entire* viewer is resized, such that it becomes narrower,\n      // ensure that the sidebar doesn't end up being too wide.\n      if (evt && evt.source === window) {\n        // Always reset the cached width when the viewer is resized.\n        this._outerContainerWidth = null;\n\n        if (this._width) {\n          // NOTE: If the sidebar is closed, we don't need to worry about\n          //       visual glitches nor ensure that rendering is triggered.\n          if (this.sidebarOpen) {\n            this.outerContainer.classList.add(SIDEBAR_RESIZING_CLASS);\n            let updated = this._updateWidth(this._width);\n\n            Promise.resolve().then(() => {\n              this.outerContainer.classList.remove(SIDEBAR_RESIZING_CLASS);\n              // Trigger rendering if the sidebar width changed, to avoid\n              // depending on the order in which 'resize' events are handled.\n              if (updated) {\n                this.eventBus.dispatch('resize', { source: this, });\n              }\n            });\n          } else {\n            this._updateWidth(this._width);\n          }\n        }\n      }\n    });\n  }\n}\n\nexport {\n  PDFSidebarResizer,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  getVisibleElements, isValidRotation, NullL10n, scrollIntoView, watchScroll\n} from './ui_utils';\nimport { PDFThumbnailView } from './pdf_thumbnail_view';\n\nconst THUMBNAIL_SCROLL_MARGIN = -19;\nconst THUMBNAIL_SELECTED_CLASS = 'selected';\n\n/**\n * @typedef {Object} PDFThumbnailViewerOptions\n * @property {HTMLDivElement} container - The container for the thumbnail\n *   elements.\n * @property {IPDFLinkService} linkService - The navigation/linking service.\n * @property {PDFRenderingQueue} renderingQueue - The rendering queue object.\n * @property {IL10n} l10n - Localization service.\n */\n\n/**\n * Viewer control to display thumbnails for pages in a PDF document.\n *\n * @implements {IRenderableView}\n */\nclass PDFThumbnailViewer {\n  /**\n   * @param {PDFThumbnailViewerOptions} options\n   */\n  constructor({ container, linkService, renderingQueue, l10n = NullL10n, }) {\n    this.container = container;\n    this.linkService = linkService;\n    this.renderingQueue = renderingQueue;\n    this.l10n = l10n;\n\n    this.scroll = watchScroll(this.container, this._scrollUpdated.bind(this));\n    this._resetView();\n  }\n\n  /**\n   * @private\n   */\n  _scrollUpdated() {\n    this.renderingQueue.renderHighestPriority();\n  }\n\n  getThumbnail(index) {\n    return this._thumbnails[index];\n  }\n\n  /**\n   * @private\n   */\n  _getVisibleThumbs() {\n    return getVisibleElements(this.container, this._thumbnails);\n  }\n\n  scrollThumbnailIntoView(pageNumber) {\n    if (!this.pdfDocument) {\n      return;\n    }\n    const thumbnailView = this._thumbnails[pageNumber - 1];\n\n    if (!thumbnailView) {\n      console.error('scrollThumbnailIntoView: Invalid \"pageNumber\" parameter.');\n      return;\n    }\n\n    if (pageNumber !== this._currentPageNumber) {\n      const prevThumbnailView = this._thumbnails[this._currentPageNumber - 1];\n      // Remove the highlight from the previous thumbnail...\n      prevThumbnailView.div.classList.remove(THUMBNAIL_SELECTED_CLASS);\n      // ... and add the highlight to the new thumbnail.\n      thumbnailView.div.classList.add(THUMBNAIL_SELECTED_CLASS);\n    }\n    let visibleThumbs = this._getVisibleThumbs();\n    let numVisibleThumbs = visibleThumbs.views.length;\n\n    // If the thumbnail isn't currently visible, scroll it into view.\n    if (numVisibleThumbs > 0) {\n      let first = visibleThumbs.first.id;\n      // Account for only one thumbnail being visible.\n      let last = (numVisibleThumbs > 1 ? visibleThumbs.last.id : first);\n\n      let shouldScroll = false;\n      if (pageNumber <= first || pageNumber >= last) {\n        shouldScroll = true;\n      } else {\n        visibleThumbs.views.some(function(view) {\n          if (view.id !== pageNumber) {\n            return false;\n          }\n          shouldScroll = view.percent < 100;\n          return true;\n        });\n      }\n      if (shouldScroll) {\n        scrollIntoView(thumbnailView.div, { top: THUMBNAIL_SCROLL_MARGIN, });\n      }\n    }\n\n    this._currentPageNumber = pageNumber;\n  }\n\n  get pagesRotation() {\n    return this._pagesRotation;\n  }\n\n  set pagesRotation(rotation) {\n    if (!isValidRotation(rotation)) {\n      throw new Error('Invalid thumbnails rotation angle.');\n    }\n    if (!this.pdfDocument) {\n      return;\n    }\n    if (this._pagesRotation === rotation) {\n      return; // The rotation didn't change.\n    }\n    this._pagesRotation = rotation;\n\n    for (let i = 0, ii = this._thumbnails.length; i < ii; i++) {\n      this._thumbnails[i].update(rotation);\n    }\n  }\n\n  cleanup() {\n    PDFThumbnailView.cleanup();\n  }\n\n  /**\n   * @private\n   */\n  _resetView() {\n    this._thumbnails = [];\n    this._currentPageNumber = 1;\n    this._pageLabels = null;\n    this._pagesRotation = 0;\n    this._pagesRequests = [];\n\n    // Remove the thumbnails from the DOM.\n    this.container.textContent = '';\n  }\n\n  setDocument(pdfDocument) {\n    if (this.pdfDocument) {\n      this._cancelRendering();\n      this._resetView();\n    }\n\n    this.pdfDocument = pdfDocument;\n    if (!pdfDocument) {\n      return;\n    }\n\n    pdfDocument.getPage(1).then((firstPage) => {\n      let pagesCount = pdfDocument.numPages;\n      let viewport = firstPage.getViewport(1.0);\n      for (let pageNum = 1; pageNum <= pagesCount; ++pageNum) {\n        let thumbnail = new PDFThumbnailView({\n          container: this.container,\n          id: pageNum,\n          defaultViewport: viewport.clone(),\n          linkService: this.linkService,\n          renderingQueue: this.renderingQueue,\n          disableCanvasToImageConversion: false,\n          l10n: this.l10n,\n        });\n        this._thumbnails.push(thumbnail);\n      }\n\n      // Ensure that the current thumbnail is always highlighted on load.\n      const thumbnailView = this._thumbnails[this._currentPageNumber - 1];\n      thumbnailView.div.classList.add(THUMBNAIL_SELECTED_CLASS);\n    }).catch((reason) => {\n      console.error('Unable to initialize thumbnail viewer', reason);\n    });\n  }\n\n  /**\n   * @private\n   */\n  _cancelRendering() {\n    for (let i = 0, ii = this._thumbnails.length; i < ii; i++) {\n      if (this._thumbnails[i]) {\n        this._thumbnails[i].cancelRendering();\n      }\n    }\n  }\n\n  /**\n   * @param {Array|null} labels\n   */\n  setPageLabels(labels) {\n    if (!this.pdfDocument) {\n      return;\n    }\n    if (!labels) {\n      this._pageLabels = null;\n    } else if (!(Array.isArray(labels) &&\n                 this.pdfDocument.numPages === labels.length)) {\n      this._pageLabels = null;\n      console.error('PDFThumbnailViewer_setPageLabels: Invalid page labels.');\n    } else {\n      this._pageLabels = labels;\n    }\n    // Update all the `PDFThumbnailView` instances.\n    for (let i = 0, ii = this._thumbnails.length; i < ii; i++) {\n      let label = this._pageLabels && this._pageLabels[i];\n      this._thumbnails[i].setPageLabel(label);\n    }\n  }\n\n  /**\n   * @param {PDFThumbnailView} thumbView\n   * @returns {PDFPage}\n   * @private\n   */\n  _ensurePdfPageLoaded(thumbView) {\n    if (thumbView.pdfPage) {\n      return Promise.resolve(thumbView.pdfPage);\n    }\n    let pageNumber = thumbView.id;\n    if (this._pagesRequests[pageNumber]) {\n      return this._pagesRequests[pageNumber];\n    }\n    let promise = this.pdfDocument.getPage(pageNumber).then((pdfPage) => {\n      thumbView.setPdfPage(pdfPage);\n      this._pagesRequests[pageNumber] = null;\n      return pdfPage;\n    }).catch((reason) => {\n      console.error('Unable to get page for thumb view', reason);\n      // Page error -- there is nothing can be done.\n      this._pagesRequests[pageNumber] = null;\n    });\n    this._pagesRequests[pageNumber] = promise;\n    return promise;\n  }\n\n  forceRendering() {\n    let visibleThumbs = this._getVisibleThumbs();\n    let thumbView = this.renderingQueue.getHighestPriority(visibleThumbs,\n                                                           this._thumbnails,\n                                                           this.scroll.down);\n    if (thumbView) {\n      this._ensurePdfPageLoaded(thumbView).then(() => {\n        this.renderingQueue.renderView(thumbView);\n      });\n      return true;\n    }\n    return false;\n  }\n}\n\nexport {\n  PDFThumbnailViewer,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  createPromiseCapability, RenderingCancelledException\n} from 'pdfjs-lib';\nimport { getOutputScale, NullL10n } from './ui_utils';\nimport { RenderingStates } from './pdf_rendering_queue';\n\nconst MAX_NUM_SCALING_STEPS = 3;\nconst THUMBNAIL_CANVAS_BORDER_WIDTH = 1; // px\nconst THUMBNAIL_WIDTH = 98; // px\n\n/**\n * @typedef {Object} PDFThumbnailViewOptions\n * @property {HTMLDivElement} container - The viewer element.\n * @property {number} id - The thumbnail's unique ID (normally its number).\n * @property {PageViewport} defaultViewport - The page viewport.\n * @property {IPDFLinkService} linkService - The navigation/linking service.\n * @property {PDFRenderingQueue} renderingQueue - The rendering queue object.\n * @property {boolean} disableCanvasToImageConversion - (optional) Don't convert\n *   the canvas thumbnails to images. This prevents `toDataURL` calls,\n *   but increases the overall memory usage. The default value is `false`.\n * @property {IL10n} l10n - Localization service.\n */\n\nconst TempImageFactory = (function TempImageFactoryClosure() {\n  let tempCanvasCache = null;\n\n  return {\n    getCanvas(width, height) {\n      let tempCanvas = tempCanvasCache;\n      if (!tempCanvas) {\n        tempCanvas = document.createElement('canvas');\n        tempCanvasCache = tempCanvas;\n      }\n      tempCanvas.width = width;\n      tempCanvas.height = height;\n\n      // Since this is a temporary canvas, we need to fill it with a white\n      // background ourselves. `_getPageDrawContext` uses CSS rules for this.\n      if (typeof PDFJSDev === 'undefined' ||\n          PDFJSDev.test('MOZCENTRAL || FIREFOX || GENERIC')) {\n        tempCanvas.mozOpaque = true;\n      }\n\n      let ctx = tempCanvas.getContext('2d', { alpha: false, });\n      ctx.save();\n      ctx.fillStyle = 'rgb(255, 255, 255)';\n      ctx.fillRect(0, 0, width, height);\n      ctx.restore();\n      return tempCanvas;\n    },\n\n    destroyCanvas() {\n      let tempCanvas = tempCanvasCache;\n      if (tempCanvas) {\n        // Zeroing the width and height causes Firefox to release graphics\n        // resources immediately, which can greatly reduce memory consumption.\n        tempCanvas.width = 0;\n        tempCanvas.height = 0;\n      }\n      tempCanvasCache = null;\n    },\n  };\n})();\n\n/**\n * @implements {IRenderableView}\n */\nclass PDFThumbnailView {\n  /**\n   * @param {PDFThumbnailViewOptions} options\n   */\n  constructor({ container, id, defaultViewport, linkService, renderingQueue,\n                disableCanvasToImageConversion = false, l10n = NullL10n, }) {\n    this.id = id;\n    this.renderingId = 'thumbnail' + id;\n    this.pageLabel = null;\n\n    this.pdfPage = null;\n    this.rotation = 0;\n    this.viewport = defaultViewport;\n    this.pdfPageRotate = defaultViewport.rotation;\n\n    this.linkService = linkService;\n    this.renderingQueue = renderingQueue;\n\n    this.renderTask = null;\n    this.renderingState = RenderingStates.INITIAL;\n    this.resume = null;\n    this.disableCanvasToImageConversion = disableCanvasToImageConversion;\n\n    this.pageWidth = this.viewport.width;\n    this.pageHeight = this.viewport.height;\n    this.pageRatio = this.pageWidth / this.pageHeight;\n\n    this.canvasWidth = THUMBNAIL_WIDTH;\n    this.canvasHeight = (this.canvasWidth / this.pageRatio) | 0;\n    this.scale = this.canvasWidth / this.pageWidth;\n\n    this.l10n = l10n;\n\n    let anchor = document.createElement('a');\n    anchor.href = linkService.getAnchorUrl('#page=' + id);\n    this.l10n.get('thumb_page_title', { page: id, }, 'Page {{page}}').\n        then((msg) => {\n      anchor.title = msg;\n    });\n    anchor.onclick = function() {\n      linkService.page = id;\n      return false;\n    };\n    this.anchor = anchor;\n\n    let div = document.createElement('div');\n    div.className = 'thumbnail';\n    div.setAttribute('data-page-number', this.id);\n    this.div = div;\n\n    let ring = document.createElement('div');\n    ring.className = 'thumbnailSelectionRing';\n    let borderAdjustment = 2 * THUMBNAIL_CANVAS_BORDER_WIDTH;\n    ring.style.width = this.canvasWidth + borderAdjustment + 'px';\n    ring.style.height = this.canvasHeight + borderAdjustment + 'px';\n    this.ring = ring;\n\n    div.appendChild(ring);\n    anchor.appendChild(div);\n    container.appendChild(anchor);\n  }\n\n  setPdfPage(pdfPage) {\n    this.pdfPage = pdfPage;\n    this.pdfPageRotate = pdfPage.rotate;\n    let totalRotation = (this.rotation + this.pdfPageRotate) % 360;\n    this.viewport = pdfPage.getViewport(1, totalRotation);\n    this.reset();\n  }\n\n  reset() {\n    this.cancelRendering();\n\n    this.pageWidth = this.viewport.width;\n    this.pageHeight = this.viewport.height;\n    this.pageRatio = this.pageWidth / this.pageHeight;\n\n    this.canvasHeight = (this.canvasWidth / this.pageRatio) | 0;\n    this.scale = (this.canvasWidth / this.pageWidth);\n\n    this.div.removeAttribute('data-loaded');\n    let ring = this.ring;\n    let childNodes = ring.childNodes;\n    for (let i = childNodes.length - 1; i >= 0; i--) {\n      ring.removeChild(childNodes[i]);\n    }\n    let borderAdjustment = 2 * THUMBNAIL_CANVAS_BORDER_WIDTH;\n    ring.style.width = this.canvasWidth + borderAdjustment + 'px';\n    ring.style.height = this.canvasHeight + borderAdjustment + 'px';\n\n    if (this.canvas) {\n      // Zeroing the width and height causes Firefox to release graphics\n      // resources immediately, which can greatly reduce memory consumption.\n      this.canvas.width = 0;\n      this.canvas.height = 0;\n      delete this.canvas;\n    }\n    if (this.image) {\n      this.image.removeAttribute('src');\n      delete this.image;\n    }\n  }\n\n  update(rotation) {\n    if (typeof rotation !== 'undefined') {\n      this.rotation = rotation;\n    }\n    let totalRotation = (this.rotation + this.pdfPageRotate) % 360;\n    this.viewport = this.viewport.clone({\n      scale: 1,\n      rotation: totalRotation,\n    });\n    this.reset();\n  }\n\n  cancelRendering() {\n    if (this.renderTask) {\n      this.renderTask.cancel();\n      this.renderTask = null;\n    }\n    this.renderingState = RenderingStates.INITIAL;\n    this.resume = null;\n  }\n\n  /**\n   * @private\n   */\n  _getPageDrawContext(noCtxScale = false) {\n    let canvas = document.createElement('canvas');\n    // Keep the no-thumbnail outline visible, i.e. `data-loaded === false`,\n    // until rendering/image conversion is complete, to avoid display issues.\n    this.canvas = canvas;\n\n    if (typeof PDFJSDev === 'undefined' ||\n        PDFJSDev.test('MOZCENTRAL || FIREFOX || GENERIC')) {\n      canvas.mozOpaque = true;\n    }\n    let ctx = canvas.getContext('2d', { alpha: false, });\n    let outputScale = getOutputScale(ctx);\n\n    canvas.width = (this.canvasWidth * outputScale.sx) | 0;\n    canvas.height = (this.canvasHeight * outputScale.sy) | 0;\n    canvas.style.width = this.canvasWidth + 'px';\n    canvas.style.height = this.canvasHeight + 'px';\n\n    if (!noCtxScale && outputScale.scaled) {\n      ctx.scale(outputScale.sx, outputScale.sy);\n    }\n    return ctx;\n  }\n\n  /**\n   * @private\n   */\n  _convertCanvasToImage() {\n    if (!this.canvas) {\n      return;\n    }\n    if (this.renderingState !== RenderingStates.FINISHED) {\n      return;\n    }\n    let id = this.renderingId;\n    let className = 'thumbnailImage';\n\n    if (this.disableCanvasToImageConversion) {\n      this.canvas.id = id;\n      this.canvas.className = className;\n      this.l10n.get('thumb_page_canvas', { page: this.pageId, },\n                    'Thumbnail of Page {{page}}').then((msg) => {\n        this.canvas.setAttribute('aria-label', msg);\n      });\n\n      this.div.setAttribute('data-loaded', true);\n      this.ring.appendChild(this.canvas);\n      return;\n    }\n    let image = document.createElement('img');\n    image.id = id;\n    image.className = className;\n    this.l10n.get('thumb_page_canvas', { page: this.pageId, },\n      'Thumbnail of Page {{page}}').\n        then((msg) => {\n      image.setAttribute('aria-label', msg);\n    });\n\n    image.style.width = this.canvasWidth + 'px';\n    image.style.height = this.canvasHeight + 'px';\n\n    image.src = this.canvas.toDataURL();\n    this.image = image;\n\n    this.div.setAttribute('data-loaded', true);\n    this.ring.appendChild(image);\n\n    // Zeroing the width and height causes Firefox to release graphics\n    // resources immediately, which can greatly reduce memory consumption.\n    this.canvas.width = 0;\n    this.canvas.height = 0;\n    delete this.canvas;\n  }\n\n  draw() {\n    if (this.renderingState !== RenderingStates.INITIAL) {\n      console.error('Must be in new state before drawing');\n      return Promise.resolve(undefined);\n    }\n    this.renderingState = RenderingStates.RUNNING;\n\n    let renderCapability = createPromiseCapability();\n    let finishRenderTask = (error) => {\n      // The renderTask may have been replaced by a new one, so only remove\n      // the reference to the renderTask if it matches the one that is\n      // triggering this callback.\n      if (renderTask === this.renderTask) {\n        this.renderTask = null;\n      }\n\n      if (error instanceof RenderingCancelledException) {\n        renderCapability.resolve(undefined);\n        return;\n      }\n\n      this.renderingState = RenderingStates.FINISHED;\n      this._convertCanvasToImage();\n\n      if (!error) {\n        renderCapability.resolve(undefined);\n      } else {\n        renderCapability.reject(error);\n      }\n    };\n\n    let ctx = this._getPageDrawContext();\n    let drawViewport = this.viewport.clone({ scale: this.scale, });\n    let renderContinueCallback = (cont) => {\n      if (!this.renderingQueue.isHighestPriority(this)) {\n        this.renderingState = RenderingStates.PAUSED;\n        this.resume = () => {\n          this.renderingState = RenderingStates.RUNNING;\n          cont();\n        };\n        return;\n      }\n      cont();\n    };\n\n    let renderContext = {\n      canvasContext: ctx,\n      viewport: drawViewport,\n    };\n    let renderTask = this.renderTask = this.pdfPage.render(renderContext);\n    renderTask.onContinue = renderContinueCallback;\n\n    renderTask.promise.then(function() {\n      finishRenderTask(null);\n    }, function(error) {\n      finishRenderTask(error);\n    });\n    return renderCapability.promise;\n  }\n\n  setImage(pageView) {\n    if (this.renderingState !== RenderingStates.INITIAL) {\n      return;\n    }\n    let img = pageView.canvas;\n    if (!img) {\n      return;\n    }\n    if (!this.pdfPage) {\n      this.setPdfPage(pageView.pdfPage);\n    }\n\n    this.renderingState = RenderingStates.FINISHED;\n\n    let ctx = this._getPageDrawContext(true);\n    let canvas = ctx.canvas;\n    if (img.width <= 2 * canvas.width) {\n      ctx.drawImage(img, 0, 0, img.width, img.height,\n                    0, 0, canvas.width, canvas.height);\n      this._convertCanvasToImage();\n      return;\n    }\n\n    // drawImage does an awful job of rescaling the image, doing it gradually.\n    let reducedWidth = canvas.width << MAX_NUM_SCALING_STEPS;\n    let reducedHeight = canvas.height << MAX_NUM_SCALING_STEPS;\n    let reducedImage = TempImageFactory.getCanvas(reducedWidth,\n                                                  reducedHeight);\n    let reducedImageCtx = reducedImage.getContext('2d');\n\n    while (reducedWidth > img.width || reducedHeight > img.height) {\n      reducedWidth >>= 1;\n      reducedHeight >>= 1;\n    }\n    reducedImageCtx.drawImage(img, 0, 0, img.width, img.height,\n                              0, 0, reducedWidth, reducedHeight);\n    while (reducedWidth > 2 * canvas.width) {\n      reducedImageCtx.drawImage(reducedImage,\n                                0, 0, reducedWidth, reducedHeight,\n                                0, 0, reducedWidth >> 1, reducedHeight >> 1);\n      reducedWidth >>= 1;\n      reducedHeight >>= 1;\n    }\n    ctx.drawImage(reducedImage, 0, 0, reducedWidth, reducedHeight,\n                  0, 0, canvas.width, canvas.height);\n    this._convertCanvasToImage();\n  }\n\n  get pageId() {\n    return (this.pageLabel !== null ? this.pageLabel : this.id);\n  }\n\n  /**\n   * @param {string|null} label\n   */\n  setPageLabel(label) {\n    this.pageLabel = (typeof label === 'string' ? label : null);\n\n    this.l10n.get('thumb_page_title', { page: this.pageId, },\n                  'Page {{page}}').then((msg) => {\n      this.anchor.title = msg;\n    });\n\n    if (this.renderingState !== RenderingStates.FINISHED) {\n      return;\n    }\n\n    this.l10n.get('thumb_page_canvas', { page: this.pageId, },\n                  'Thumbnail of Page {{page}}').then((ariaLabel) => {\n      if (this.image) {\n        this.image.setAttribute('aria-label', ariaLabel);\n      } else if (this.disableCanvasToImageConversion && this.canvas) {\n        this.canvas.setAttribute('aria-label', ariaLabel);\n      }\n    });\n  }\n\n  static cleanup() {\n    TempImageFactory.destroyCanvas();\n  }\n}\n\nexport {\n  PDFThumbnailView,\n};\n","/* Copyright 2014 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { BaseViewer, ScrollMode } from './base_viewer';\nimport { getVisibleElements, scrollIntoView } from './ui_utils';\nimport { shadow } from 'pdfjs-lib';\n\nclass PDFViewer extends BaseViewer {\n  get _setDocumentViewerElement() {\n    return shadow(this, '_setDocumentViewerElement', this.viewer);\n  }\n\n  _scrollIntoView({ pageDiv, pageSpot = null, }) {\n    if (!pageSpot && !this.isInPresentationMode) {\n      const left = pageDiv.offsetLeft + pageDiv.clientLeft;\n      const right = left + pageDiv.clientWidth;\n      const { scrollLeft, clientWidth, } = this.container;\n      if (this._scrollMode === ScrollMode.HORIZONTAL ||\n          left < scrollLeft || right > scrollLeft + clientWidth) {\n        pageSpot = { left: 0, top: 0, };\n      }\n    }\n    scrollIntoView(pageDiv, pageSpot);\n  }\n\n  _getVisiblePages() {\n    if (!this.isInPresentationMode) {\n      return getVisibleElements(this.container, this._pages, true,\n                                this._scrollMode === ScrollMode.HORIZONTAL);\n    }\n    // The algorithm in getVisibleElements doesn't work in all browsers and\n    // configurations when presentation mode is active.\n    let currentPage = this._pages[this._currentPageNumber - 1];\n    let visible = [{ id: currentPage.id, view: currentPage, }];\n    return { first: currentPage, last: currentPage, views: visible, };\n  }\n\n  update() {\n    let visible = this._getVisiblePages();\n    let visiblePages = visible.views, numVisiblePages = visiblePages.length;\n\n    if (numVisiblePages === 0) {\n      return;\n    }\n    this._resizeBuffer(numVisiblePages, visiblePages);\n\n    this.renderingQueue.renderHighestPriority(visible);\n\n    let currentId = this._currentPageNumber;\n    let stillFullyVisible = false;\n\n    for (let i = 0; i < numVisiblePages; ++i) {\n      let page = visiblePages[i];\n\n      if (page.percent < 100) {\n        break;\n      }\n      if (page.id === currentId) {\n        stillFullyVisible = true;\n        break;\n      }\n    }\n\n    if (!stillFullyVisible) {\n      currentId = visiblePages[0].id;\n    }\n    if (!this.isInPresentationMode) {\n      this._setCurrentPageNumber(currentId);\n    }\n\n    this._updateLocation(visible.first);\n    this.eventBus.dispatch('updateviewarea', {\n      source: this,\n      location: this._location,\n    });\n  }\n\n  get _isScrollModeHorizontal() {\n    // Used to ensure that pre-rendering of the next/previous page works\n    // correctly, since Scroll/Spread modes are ignored in Presentation Mode.\n    return (this.isInPresentationMode ?\n            false : this._scrollMode === ScrollMode.HORIZONTAL);\n  }\n}\n\nexport {\n  PDFViewer,\n};\n","/* Copyright 2014 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  CSS_UNITS, DEFAULT_SCALE, DEFAULT_SCALE_VALUE, isPortraitOrientation,\n  isValidRotation, MAX_AUTO_SCALE, moveToEndOfArray, NullL10n,\n  PresentationModeState, RendererType, SCROLLBAR_PADDING, TextLayerMode,\n  UNKNOWN_SCALE, VERTICAL_PADDING, watchScroll\n} from './ui_utils';\nimport { PDFRenderingQueue, RenderingStates } from './pdf_rendering_queue';\nimport { AnnotationLayerBuilder } from './annotation_layer_builder';\nimport { createPromiseCapability } from 'pdfjs-lib';\nimport { getGlobalEventBus } from './dom_events';\nimport { PDFPageView } from './pdf_page_view';\nimport { SimpleLinkService } from './pdf_link_service';\nimport { TextLayerBuilder } from './text_layer_builder';\n\nconst DEFAULT_CACHE_SIZE = 10;\n\nconst ScrollMode = {\n  VERTICAL: 0, // The default value.\n  HORIZONTAL: 1,\n  WRAPPED: 2,\n};\n\nconst SpreadMode = {\n  NONE: 0, // The default value.\n  ODD: 1,\n  EVEN: 2,\n};\n\n/**\n * @typedef {Object} PDFViewerOptions\n * @property {HTMLDivElement} container - The container for the viewer element.\n * @property {HTMLDivElement} viewer - (optional) The viewer element.\n * @property {EventBus} eventBus - The application event bus.\n * @property {IPDFLinkService} linkService - The navigation/linking service.\n * @property {DownloadManager} downloadManager - (optional) The download\n *   manager component.\n * @property {PDFFindController} findController - (optional) The find\n *   controller component.\n * @property {PDFRenderingQueue} renderingQueue - (optional) The rendering\n *   queue object.\n * @property {boolean} removePageBorders - (optional) Removes the border shadow\n *   around the pages. The default value is `false`.\n * @property {number} textLayerMode - (optional) Controls if the text layer used\n *   for selection and searching is created, and if the improved text selection\n *   behaviour is enabled. The constants from {TextLayerMode} should be used.\n *   The default value is `TextLayerMode.ENABLE`.\n * @property {string} imageResourcesPath - (optional) Path for image resources,\n *   mainly for annotation icons. Include trailing slash.\n * @property {boolean} renderInteractiveForms - (optional) Enables rendering of\n *   interactive form elements. The default is `false`.\n * @property {boolean} enablePrintAutoRotate - (optional) Enables automatic\n *   rotation of pages whose orientation differ from the first page upon\n *   printing. The default is `false`.\n * @property {string} renderer - 'canvas' or 'svg'. The default is 'canvas'.\n * @property {boolean} enableWebGL - (optional) Enables WebGL accelerated\n *   rendering for some operations. The default value is `false`.\n * @property {boolean} useOnlyCssZoom - (optional) Enables CSS only zooming.\n *   The default value is `false`.\n * @property {number} maxCanvasPixels - (optional) The maximum supported canvas\n *   size in total pixels, i.e. width * height. Use -1 for no limit.\n *   The default value is 4096 * 4096 (16 mega-pixels).\n * @property {IL10n} l10n - Localization service.\n */\n\nfunction PDFPageViewBuffer(size) {\n  let data = [];\n  this.push = function(view) {\n    let i = data.indexOf(view);\n    if (i >= 0) {\n      data.splice(i, 1);\n    }\n    data.push(view);\n    if (data.length > size) {\n      data.shift().destroy();\n    }\n  };\n  /**\n   * After calling resize, the size of the buffer will be newSize. The optional\n   * parameter pagesToKeep is, if present, an array of pages to push to the back\n   * of the buffer, delaying their destruction. The size of pagesToKeep has no\n   * impact on the final size of the buffer; if pagesToKeep has length larger\n   * than newSize, some of those pages will be destroyed anyway.\n   */\n  this.resize = function(newSize, pagesToKeep) {\n    size = newSize;\n    if (pagesToKeep) {\n      const pageIdsToKeep = new Set();\n      for (let i = 0, iMax = pagesToKeep.length; i < iMax; ++i) {\n        pageIdsToKeep.add(pagesToKeep[i].id);\n      }\n      moveToEndOfArray(data, function(page) {\n        return pageIdsToKeep.has(page.id);\n      });\n    }\n    while (data.length > size) {\n      data.shift().destroy();\n    }\n  };\n}\n\nfunction isSameScale(oldScale, newScale) {\n  if (newScale === oldScale) {\n    return true;\n  }\n  if (Math.abs(newScale - oldScale) < 1e-15) {\n    // Prevent unnecessary re-rendering of all pages when the scale\n    // changes only because of limited numerical precision.\n    return true;\n  }\n  return false;\n}\n\n/**\n * Simple viewer control to display PDF content/pages.\n * @implements {IRenderableView}\n */\nclass BaseViewer {\n  /**\n   * @param {PDFViewerOptions} options\n   */\n  constructor(options) {\n    if (this.constructor === BaseViewer) {\n      throw new Error('Cannot initialize BaseViewer.');\n    }\n    this._name = this.constructor.name;\n\n    this.container = options.container;\n    this.viewer = options.viewer || options.container.firstElementChild;\n    this.eventBus = options.eventBus || getGlobalEventBus();\n    this.linkService = options.linkService || new SimpleLinkService();\n    this.downloadManager = options.downloadManager || null;\n    this.findController = options.findController || null;\n    this.removePageBorders = options.removePageBorders || false;\n    this.textLayerMode = Number.isInteger(options.textLayerMode) ?\n      options.textLayerMode : TextLayerMode.ENABLE;\n    this.imageResourcesPath = options.imageResourcesPath || '';\n    this.renderInteractiveForms = options.renderInteractiveForms || false;\n    this.enablePrintAutoRotate = options.enablePrintAutoRotate || false;\n    this.renderer = options.renderer || RendererType.CANVAS;\n    this.enableWebGL = options.enableWebGL || false;\n    this.useOnlyCssZoom = options.useOnlyCssZoom || false;\n    this.maxCanvasPixels = options.maxCanvasPixels;\n    this.l10n = options.l10n || NullL10n;\n\n    this.defaultRenderingQueue = !options.renderingQueue;\n    if (this.defaultRenderingQueue) {\n      // Custom rendering queue is not specified, using default one\n      this.renderingQueue = new PDFRenderingQueue();\n      this.renderingQueue.setViewer(this);\n    } else {\n      this.renderingQueue = options.renderingQueue;\n    }\n\n    this.scroll = watchScroll(this.container, this._scrollUpdate.bind(this));\n    this.presentationModeState = PresentationModeState.UNKNOWN;\n    this._resetView();\n\n    if (this.removePageBorders) {\n      this.viewer.classList.add('removePageBorders');\n    }\n    // Defer the dispatching of this event, to give other viewer components\n    // time to initialize *and* register 'baseviewerinit' event listeners.\n    Promise.resolve().then(() => {\n      this.eventBus.dispatch('baseviewerinit', { source: this, });\n    });\n  }\n\n  get pagesCount() {\n    return this._pages.length;\n  }\n\n  getPageView(index) {\n    return this._pages[index];\n  }\n\n  /**\n   * @returns {boolean} true if all {PDFPageView} objects are initialized.\n   */\n  get pageViewsReady() {\n    return this._pageViewsReady;\n  }\n\n  /**\n   * @returns {number}\n   */\n  get currentPageNumber() {\n    return this._currentPageNumber;\n  }\n\n  /**\n   * @param {number} val - The page number.\n   */\n  set currentPageNumber(val) {\n    if (!Number.isInteger(val)) {\n      throw new Error('Invalid page number.');\n    }\n    if (!this.pdfDocument) {\n      return;\n    }\n    // The intent can be to just reset a scroll position and/or scale.\n    this._setCurrentPageNumber(val, /* resetCurrentPageView = */ true);\n  }\n\n  /**\n   * @private\n   */\n  _setCurrentPageNumber(val, resetCurrentPageView = false) {\n    if (this._currentPageNumber === val) {\n      if (resetCurrentPageView) {\n        this._resetCurrentPageView();\n      }\n      return;\n    }\n\n    if (!(0 < val && val <= this.pagesCount)) {\n      console.error(\n        `${this._name}._setCurrentPageNumber: \"${val}\" is out of bounds.`);\n      return;\n    }\n\n    let arg = {\n      source: this,\n      pageNumber: val,\n      pageLabel: this._pageLabels && this._pageLabels[val - 1],\n    };\n    this._currentPageNumber = val;\n    this.eventBus.dispatch('pagechanging', arg);\n    this.eventBus.dispatch('pagechange', arg);\n\n    if (resetCurrentPageView) {\n      this._resetCurrentPageView();\n    }\n  }\n\n  /**\n   * @returns {string|null} Returns the current page label,\n   *                        or `null` if no page labels exist.\n   */\n  get currentPageLabel() {\n    return this._pageLabels && this._pageLabels[this._currentPageNumber - 1];\n  }\n\n  /**\n   * @param {string} val - The page label.\n   */\n  set currentPageLabel(val) {\n    let pageNumber = val | 0; // Fallback page number.\n    if (this._pageLabels) {\n      let i = this._pageLabels.indexOf(val);\n      if (i >= 0) {\n        pageNumber = i + 1;\n      }\n    }\n    this.currentPageNumber = pageNumber;\n  }\n\n  /**\n   * @returns {number}\n   */\n  get currentScale() {\n    return this._currentScale !== UNKNOWN_SCALE ? this._currentScale :\n                                                  DEFAULT_SCALE;\n  }\n\n  /**\n   * @param {number} val - Scale of the pages in percents.\n   */\n  set currentScale(val) {\n    if (isNaN(val)) {\n      throw new Error('Invalid numeric scale');\n    }\n    if (!this.pdfDocument) {\n      return;\n    }\n    this._setScale(val, false);\n  }\n\n  /**\n   * @returns {string}\n   */\n  get currentScaleValue() {\n    return this._currentScaleValue;\n  }\n\n  /**\n   * @param val - The scale of the pages (in percent or predefined value).\n   */\n  set currentScaleValue(val) {\n    if (!this.pdfDocument) {\n      return;\n    }\n    this._setScale(val, false);\n  }\n\n  /**\n   * @returns {number}\n   */\n  get pagesRotation() {\n    return this._pagesRotation;\n  }\n\n  /**\n   * @param {number} rotation - The rotation of the pages (0, 90, 180, 270).\n   */\n  set pagesRotation(rotation) {\n    if (!isValidRotation(rotation)) {\n      throw new Error('Invalid pages rotation angle.');\n    }\n    if (!this.pdfDocument) {\n      return;\n    }\n    if (this._pagesRotation === rotation) {\n      return; // The rotation didn't change.\n    }\n    this._pagesRotation = rotation;\n\n    let pageNumber = this._currentPageNumber;\n\n    for (let i = 0, ii = this._pages.length; i < ii; i++) {\n      let pageView = this._pages[i];\n      pageView.update(pageView.scale, rotation);\n    }\n    // Prevent errors in case the rotation changes *before* the scale has been\n    // set to a non-default value.\n    if (this._currentScaleValue) {\n      this._setScale(this._currentScaleValue, true);\n    }\n\n    this.eventBus.dispatch('rotationchanging', {\n      source: this,\n      pagesRotation: rotation,\n      pageNumber,\n    });\n\n    if (this.defaultRenderingQueue) {\n      this.update();\n    }\n  }\n\n  get _setDocumentViewerElement() {\n    throw new Error('Not implemented: _setDocumentViewerElement');\n  }\n\n  /**\n   * @param pdfDocument {PDFDocument}\n   */\n  setDocument(pdfDocument) {\n    if (this.pdfDocument) {\n      this._cancelRendering();\n      this._resetView();\n\n      if (this.findController) {\n        this.findController.setDocument(null);\n      }\n    }\n\n    this.pdfDocument = pdfDocument;\n    if (!pdfDocument) {\n      return;\n    }\n    let pagesCount = pdfDocument.numPages;\n\n    let pagesCapability = createPromiseCapability();\n    this.pagesPromise = pagesCapability.promise;\n\n    pagesCapability.promise.then(() => {\n      this._pageViewsReady = true;\n      this.eventBus.dispatch('pagesloaded', {\n        source: this,\n        pagesCount,\n      });\n    });\n\n    let isOnePageRenderedResolved = false;\n    let onePageRenderedCapability = createPromiseCapability();\n    this.onePageRendered = onePageRenderedCapability.promise;\n\n    let bindOnAfterAndBeforeDraw = (pageView) => {\n      pageView.onBeforeDraw = () => {\n        // Add the page to the buffer at the start of drawing. That way it can\n        // be evicted from the buffer and destroyed even if we pause its\n        // rendering.\n        this._buffer.push(pageView);\n      };\n      pageView.onAfterDraw = () => {\n        if (!isOnePageRenderedResolved) {\n          isOnePageRenderedResolved = true;\n          onePageRenderedCapability.resolve();\n        }\n      };\n    };\n\n    let firstPagePromise = pdfDocument.getPage(1);\n    this.firstPagePromise = firstPagePromise;\n\n    // Fetch a single page so we can get a viewport that will be the default\n    // viewport for all pages\n    firstPagePromise.then((pdfPage) => {\n      let scale = this.currentScale;\n      let viewport = pdfPage.getViewport(scale * CSS_UNITS);\n      for (let pageNum = 1; pageNum <= pagesCount; ++pageNum) {\n        let textLayerFactory = null;\n        if (this.textLayerMode !== TextLayerMode.DISABLE) {\n          textLayerFactory = this;\n        }\n        let pageView = new PDFPageView({\n          container: this._setDocumentViewerElement,\n          eventBus: this.eventBus,\n          id: pageNum,\n          scale,\n          defaultViewport: viewport.clone(),\n          renderingQueue: this.renderingQueue,\n          textLayerFactory,\n          textLayerMode: this.textLayerMode,\n          annotationLayerFactory: this,\n          imageResourcesPath: this.imageResourcesPath,\n          renderInteractiveForms: this.renderInteractiveForms,\n          renderer: this.renderer,\n          enableWebGL: this.enableWebGL,\n          useOnlyCssZoom: this.useOnlyCssZoom,\n          maxCanvasPixels: this.maxCanvasPixels,\n          l10n: this.l10n,\n        });\n        bindOnAfterAndBeforeDraw(pageView);\n        this._pages.push(pageView);\n      }\n      if (this._spreadMode !== SpreadMode.NONE) {\n        this._updateSpreadMode();\n      }\n\n      // Fetch all the pages since the viewport is needed before printing\n      // starts to create the correct size canvas. Wait until one page is\n      // rendered so we don't tie up too many resources early on.\n      onePageRenderedCapability.promise.then(() => {\n        if (pdfDocument.loadingParams['disableAutoFetch']) {\n          // XXX: Printing is semi-broken with auto fetch disabled.\n          pagesCapability.resolve();\n          return;\n        }\n        let getPagesLeft = pagesCount;\n        for (let pageNum = 1; pageNum <= pagesCount; ++pageNum) {\n          pdfDocument.getPage(pageNum).then((pdfPage) => {\n            let pageView = this._pages[pageNum - 1];\n            if (!pageView.pdfPage) {\n              pageView.setPdfPage(pdfPage);\n            }\n            this.linkService.cachePageRef(pageNum, pdfPage.ref);\n            if (--getPagesLeft === 0) {\n              pagesCapability.resolve();\n            }\n          }, (reason) => {\n            console.error(`Unable to get page ${pageNum} to initialize viewer`,\n                          reason);\n            if (--getPagesLeft === 0) {\n              pagesCapability.resolve();\n            }\n          });\n        }\n      });\n\n      this.eventBus.dispatch('pagesinit', { source: this, });\n\n      if (this.findController) {\n        this.findController.setDocument(pdfDocument); // Enable searching.\n      }\n      if (this.defaultRenderingQueue) {\n        this.update();\n      }\n    }).catch((reason) => {\n      console.error('Unable to initialize viewer', reason);\n    });\n  }\n\n  /**\n   * @param {Array|null} labels\n   */\n  setPageLabels(labels) {\n    if (!this.pdfDocument) {\n      return;\n    }\n    if (!labels) {\n      this._pageLabels = null;\n    } else if (!(Array.isArray(labels) &&\n                 this.pdfDocument.numPages === labels.length)) {\n      this._pageLabels = null;\n      console.error(`${this._name}.setPageLabels: Invalid page labels.`);\n    } else {\n      this._pageLabels = labels;\n    }\n    // Update all the `PDFPageView` instances.\n    for (let i = 0, ii = this._pages.length; i < ii; i++) {\n      let pageView = this._pages[i];\n      let label = this._pageLabels && this._pageLabels[i];\n      pageView.setPageLabel(label);\n    }\n  }\n\n  _resetView() {\n    this._pages = [];\n    this._currentPageNumber = 1;\n    this._currentScale = UNKNOWN_SCALE;\n    this._currentScaleValue = null;\n    this._pageLabels = null;\n    this._buffer = new PDFPageViewBuffer(DEFAULT_CACHE_SIZE);\n    this._location = null;\n    this._pagesRotation = 0;\n    this._pagesRequests = [];\n    this._pageViewsReady = false;\n    this._scrollMode = ScrollMode.VERTICAL;\n    this._spreadMode = SpreadMode.NONE;\n\n    // Remove the pages from the DOM...\n    this.viewer.textContent = '';\n    // ... and reset the Scroll mode CSS class(es) afterwards.\n    this._updateScrollMode();\n  }\n\n  _scrollUpdate() {\n    if (this.pagesCount === 0) {\n      return;\n    }\n    this.update();\n  }\n\n  _scrollIntoView({ pageDiv, pageSpot = null, pageNumber = null, }) {\n    throw new Error('Not implemented: _scrollIntoView');\n  }\n\n  _setScaleDispatchEvent(newScale, newValue, preset = false) {\n    let arg = {\n      source: this,\n      scale: newScale,\n      presetValue: preset ? newValue : undefined,\n    };\n    this.eventBus.dispatch('scalechanging', arg);\n    this.eventBus.dispatch('scalechange', arg);\n  }\n\n  _setScaleUpdatePages(newScale, newValue, noScroll = false, preset = false) {\n    this._currentScaleValue = newValue.toString();\n\n    if (isSameScale(this._currentScale, newScale)) {\n      if (preset) {\n        this._setScaleDispatchEvent(newScale, newValue, true);\n      }\n      return;\n    }\n\n    for (let i = 0, ii = this._pages.length; i < ii; i++) {\n      this._pages[i].update(newScale);\n    }\n    this._currentScale = newScale;\n\n    if (!noScroll) {\n      let page = this._currentPageNumber, dest;\n      if (this._location &&\n          !(this.isInPresentationMode || this.isChangingPresentationMode)) {\n        page = this._location.pageNumber;\n        dest = [null, { name: 'XYZ', }, this._location.left,\n                this._location.top, null];\n      }\n      this.scrollPageIntoView({\n        pageNumber: page,\n        destArray: dest,\n        allowNegativeOffset: true,\n      });\n    }\n\n    this._setScaleDispatchEvent(newScale, newValue, preset);\n\n    if (this.defaultRenderingQueue) {\n      this.update();\n    }\n  }\n\n  _setScale(value, noScroll = false) {\n    let scale = parseFloat(value);\n\n    if (scale > 0) {\n      this._setScaleUpdatePages(scale, value, noScroll, /* preset = */ false);\n    } else {\n      let currentPage = this._pages[this._currentPageNumber - 1];\n      if (!currentPage) {\n        return;\n      }\n      const noPadding = (this.isInPresentationMode || this.removePageBorders);\n      let hPadding = noPadding ? 0 : SCROLLBAR_PADDING;\n      let vPadding = noPadding ? 0 : VERTICAL_PADDING;\n\n      if (!noPadding && this._isScrollModeHorizontal) {\n        [hPadding, vPadding] = [vPadding, hPadding]; // Swap the padding values.\n      }\n      let pageWidthScale = (this.container.clientWidth - hPadding) /\n                           currentPage.width * currentPage.scale;\n      let pageHeightScale = (this.container.clientHeight - vPadding) /\n                            currentPage.height * currentPage.scale;\n      switch (value) {\n        case 'page-actual':\n          scale = 1;\n          break;\n        case 'page-width':\n          scale = pageWidthScale;\n          break;\n        case 'page-height':\n          scale = pageHeightScale;\n          break;\n        case 'page-fit':\n          scale = Math.min(pageWidthScale, pageHeightScale);\n          break;\n        case 'auto':\n          // For pages in landscape mode, fit the page height to the viewer\n          // *unless* the page would thus become too wide to fit horizontally.\n          let horizontalScale = isPortraitOrientation(currentPage) ?\n            pageWidthScale : Math.min(pageHeightScale, pageWidthScale);\n          scale = Math.min(MAX_AUTO_SCALE, horizontalScale);\n          break;\n        default:\n          console.error(\n            `${this._name}._setScale: \"${value}\" is an unknown zoom value.`);\n          return;\n      }\n      this._setScaleUpdatePages(scale, value, noScroll, /* preset = */ true);\n    }\n  }\n\n  /**\n   * Refreshes page view: scrolls to the current page and updates the scale.\n   * @private\n   */\n  _resetCurrentPageView() {\n    if (this.isInPresentationMode) {\n      // Fixes the case when PDF has different page sizes.\n      this._setScale(this._currentScaleValue, true);\n    }\n\n    let pageView = this._pages[this._currentPageNumber - 1];\n    this._scrollIntoView({ pageDiv: pageView.div, });\n  }\n\n  /**\n   * @typedef ScrollPageIntoViewParameters\n   * @property {number} pageNumber - The page number.\n   * @property {Array} destArray - (optional) The original PDF destination\n   *   array, in the format: <page-ref> </XYZ|/FitXXX> <args..>\n   * @property {boolean} allowNegativeOffset - (optional) Allow negative page\n   *   offsets. The default value is `false`.\n   */\n\n  /**\n   * Scrolls page into view.\n   * @param {ScrollPageIntoViewParameters} params\n   */\n  scrollPageIntoView(params) {\n    if (!this.pdfDocument) {\n      return;\n    }\n    let pageNumber = params.pageNumber || 0;\n    let dest = params.destArray || null;\n    let allowNegativeOffset = params.allowNegativeOffset || false;\n\n    if (this.isInPresentationMode || !dest) {\n      this._setCurrentPageNumber(pageNumber, /* resetCurrentPageView = */ true);\n      return;\n    }\n\n    let pageView = this._pages[pageNumber - 1];\n    if (!pageView) {\n      console.error(\n        `${this._name}.scrollPageIntoView: Invalid \"pageNumber\" parameter.`);\n      return;\n    }\n    let x = 0, y = 0;\n    let width = 0, height = 0, widthScale, heightScale;\n    let changeOrientation = (pageView.rotation % 180 === 0 ? false : true);\n    let pageWidth = (changeOrientation ? pageView.height : pageView.width) /\n      pageView.scale / CSS_UNITS;\n    let pageHeight = (changeOrientation ? pageView.width : pageView.height) /\n      pageView.scale / CSS_UNITS;\n    let scale = 0;\n    switch (dest[1].name) {\n      case 'XYZ':\n        x = dest[2];\n        y = dest[3];\n        scale = dest[4];\n        // If x and/or y coordinates are not supplied, default to\n        // _top_ left of the page (not the obvious bottom left,\n        // since aligning the bottom of the intended page with the\n        // top of the window is rarely helpful).\n        x = x !== null ? x : 0;\n        y = y !== null ? y : pageHeight;\n        break;\n      case 'Fit':\n      case 'FitB':\n        scale = 'page-fit';\n        break;\n      case 'FitH':\n      case 'FitBH':\n        y = dest[2];\n        scale = 'page-width';\n        // According to the PDF spec, section 12.3.2.2, a `null` value in the\n        // parameter should maintain the position relative to the new page.\n        if (y === null && this._location) {\n          x = this._location.left;\n          y = this._location.top;\n        }\n        break;\n      case 'FitV':\n      case 'FitBV':\n        x = dest[2];\n        width = pageWidth;\n        height = pageHeight;\n        scale = 'page-height';\n        break;\n      case 'FitR':\n        x = dest[2];\n        y = dest[3];\n        width = dest[4] - x;\n        height = dest[5] - y;\n        let hPadding = this.removePageBorders ? 0 : SCROLLBAR_PADDING;\n        let vPadding = this.removePageBorders ? 0 : VERTICAL_PADDING;\n\n        widthScale = (this.container.clientWidth - hPadding) /\n          width / CSS_UNITS;\n        heightScale = (this.container.clientHeight - vPadding) /\n          height / CSS_UNITS;\n        scale = Math.min(Math.abs(widthScale), Math.abs(heightScale));\n        break;\n      default:\n        console.error(`${this._name}.scrollPageIntoView: \"${dest[1].name}\" ` +\n                      'is not a valid destination type.');\n        return;\n    }\n\n    if (scale && scale !== this._currentScale) {\n      this.currentScaleValue = scale;\n    } else if (this._currentScale === UNKNOWN_SCALE) {\n      this.currentScaleValue = DEFAULT_SCALE_VALUE;\n    }\n\n    if (scale === 'page-fit' && !dest[4]) {\n      this._scrollIntoView({\n        pageDiv: pageView.div,\n        pageNumber,\n      });\n      return;\n    }\n\n    let boundingRect = [\n      pageView.viewport.convertToViewportPoint(x, y),\n      pageView.viewport.convertToViewportPoint(x + width, y + height)\n    ];\n    let left = Math.min(boundingRect[0][0], boundingRect[1][0]);\n    let top = Math.min(boundingRect[0][1], boundingRect[1][1]);\n\n    if (!allowNegativeOffset) {\n      // Some bad PDF generators will create destinations with e.g. top values\n      // that exceeds the page height. Ensure that offsets are not negative,\n      // to prevent a previous page from becoming visible (fixes bug 874482).\n      left = Math.max(left, 0);\n      top = Math.max(top, 0);\n    }\n    this._scrollIntoView({\n      pageDiv: pageView.div,\n      pageSpot: { left, top, },\n      pageNumber,\n    });\n  }\n\n  /**\n   * visiblePages is optional; if present, it should be an array of pages and in\n   * practice its length is going to be numVisiblePages, but this is not\n   * required. The new size of the buffer depends only on numVisiblePages.\n   */\n  _resizeBuffer(numVisiblePages, visiblePages) {\n    let suggestedCacheSize = Math.max(DEFAULT_CACHE_SIZE,\n                                      2 * numVisiblePages + 1);\n    this._buffer.resize(suggestedCacheSize, visiblePages);\n  }\n\n  _updateLocation(firstPage) {\n    let currentScale = this._currentScale;\n    let currentScaleValue = this._currentScaleValue;\n    let normalizedScaleValue =\n      parseFloat(currentScaleValue) === currentScale ?\n      Math.round(currentScale * 10000) / 100 : currentScaleValue;\n\n    let pageNumber = firstPage.id;\n    let pdfOpenParams = '#page=' + pageNumber;\n    pdfOpenParams += '&zoom=' + normalizedScaleValue;\n    let currentPageView = this._pages[pageNumber - 1];\n    let container = this.container;\n    let topLeft = currentPageView.getPagePoint(\n      (container.scrollLeft - firstPage.x),\n      (container.scrollTop - firstPage.y));\n    let intLeft = Math.round(topLeft[0]);\n    let intTop = Math.round(topLeft[1]);\n    pdfOpenParams += ',' + intLeft + ',' + intTop;\n\n    this._location = {\n      pageNumber,\n      scale: normalizedScaleValue,\n      top: intTop,\n      left: intLeft,\n      rotation: this._pagesRotation,\n      pdfOpenParams,\n    };\n  }\n\n  update() {\n    throw new Error('Not implemented: update');\n  }\n\n  containsElement(element) {\n    return this.container.contains(element);\n  }\n\n  focus() {\n    this.container.focus();\n  }\n\n  get _isScrollModeHorizontal() {\n    throw new Error('Not implemented: _isScrollModeHorizontal');\n  }\n\n  get isInPresentationMode() {\n    return this.presentationModeState === PresentationModeState.FULLSCREEN;\n  }\n\n  get isChangingPresentationMode() {\n    return this.presentationModeState === PresentationModeState.CHANGING;\n  }\n\n  get isHorizontalScrollbarEnabled() {\n    return (this.isInPresentationMode ?\n      false : (this.container.scrollWidth > this.container.clientWidth));\n  }\n\n  get isVerticalScrollbarEnabled() {\n    return (this.isInPresentationMode ?\n      false : (this.container.scrollHeight > this.container.clientHeight));\n  }\n\n  _getVisiblePages() {\n    throw new Error('Not implemented: _getVisiblePages');\n  }\n\n  cleanup() {\n    for (let i = 0, ii = this._pages.length; i < ii; i++) {\n      if (this._pages[i] &&\n          this._pages[i].renderingState !== RenderingStates.FINISHED) {\n        this._pages[i].reset();\n      }\n    }\n  }\n\n  /**\n   * @private\n   */\n  _cancelRendering() {\n    for (let i = 0, ii = this._pages.length; i < ii; i++) {\n      if (this._pages[i]) {\n        this._pages[i].cancelRendering();\n      }\n    }\n  }\n\n  /**\n   * @param {PDFPageView} pageView\n   * @returns {Promise} Returns a promise containing a {PDFPageProxy} object.\n   * @private\n   */\n  _ensurePdfPageLoaded(pageView) {\n    if (pageView.pdfPage) {\n      return Promise.resolve(pageView.pdfPage);\n    }\n    let pageNumber = pageView.id;\n    if (this._pagesRequests[pageNumber]) {\n      return this._pagesRequests[pageNumber];\n    }\n    let promise = this.pdfDocument.getPage(pageNumber).then((pdfPage) => {\n      if (!pageView.pdfPage) {\n        pageView.setPdfPage(pdfPage);\n      }\n      this._pagesRequests[pageNumber] = null;\n      return pdfPage;\n    }).catch((reason) => {\n      console.error('Unable to get page for page view', reason);\n      // Page error -- there is nothing can be done.\n      this._pagesRequests[pageNumber] = null;\n    });\n    this._pagesRequests[pageNumber] = promise;\n    return promise;\n  }\n\n  forceRendering(currentlyVisiblePages) {\n    let visiblePages = currentlyVisiblePages || this._getVisiblePages();\n    let scrollAhead = (this._isScrollModeHorizontal ?\n                       this.scroll.right : this.scroll.down);\n    let pageView = this.renderingQueue.getHighestPriority(visiblePages,\n                                                          this._pages,\n                                                          scrollAhead);\n    if (pageView) {\n      this._ensurePdfPageLoaded(pageView).then(() => {\n        this.renderingQueue.renderView(pageView);\n      });\n      return true;\n    }\n    return false;\n  }\n\n  /**\n   * @param {HTMLDivElement} textLayerDiv\n   * @param {number} pageIndex\n   * @param {PageViewport} viewport\n   * @returns {TextLayerBuilder}\n   */\n  createTextLayerBuilder(textLayerDiv, pageIndex, viewport,\n                         enhanceTextSelection = false) {\n    return new TextLayerBuilder({\n      textLayerDiv,\n      eventBus: this.eventBus,\n      pageIndex,\n      viewport,\n      findController: this.isInPresentationMode ? null : this.findController,\n      enhanceTextSelection: this.isInPresentationMode ? false :\n                                                        enhanceTextSelection,\n    });\n  }\n\n  /**\n   * @param {HTMLDivElement} pageDiv\n   * @param {PDFPage} pdfPage\n   * @param {string} imageResourcesPath - (optional) Path for image resources,\n   *   mainly for annotation icons. Include trailing slash.\n   * @param {boolean} renderInteractiveForms\n   * @param {IL10n} l10n\n   * @returns {AnnotationLayerBuilder}\n   */\n  createAnnotationLayerBuilder(pageDiv, pdfPage, imageResourcesPath = '',\n                               renderInteractiveForms = false,\n                               l10n = NullL10n) {\n    return new AnnotationLayerBuilder({\n      pageDiv,\n      pdfPage,\n      imageResourcesPath,\n      renderInteractiveForms,\n      linkService: this.linkService,\n      downloadManager: this.downloadManager,\n      l10n,\n    });\n  }\n\n  /**\n   * @returns {boolean} Whether all pages of the PDF document have identical\n   *                    widths and heights.\n   */\n  get hasEqualPageSizes() {\n    let firstPageView = this._pages[0];\n    for (let i = 1, ii = this._pages.length; i < ii; ++i) {\n      let pageView = this._pages[i];\n      if (pageView.width !== firstPageView.width ||\n          pageView.height !== firstPageView.height) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  /**\n   * Returns sizes of the pages.\n   * @returns {Array} Array of objects with width/height/rotation fields.\n   */\n  getPagesOverview() {\n    let pagesOverview = this._pages.map(function(pageView) {\n      let viewport = pageView.pdfPage.getViewport(1);\n      return {\n        width: viewport.width,\n        height: viewport.height,\n        rotation: viewport.rotation,\n      };\n    });\n    if (!this.enablePrintAutoRotate) {\n      return pagesOverview;\n    }\n    let isFirstPagePortrait = isPortraitOrientation(pagesOverview[0]);\n    return pagesOverview.map(function (size) {\n      if (isFirstPagePortrait === isPortraitOrientation(size)) {\n        return size;\n      }\n      return {\n        width: size.height,\n        height: size.width,\n        rotation: (size.rotation + 90) % 360,\n      };\n    });\n  }\n\n  /**\n   * @return {number} One of the values in {ScrollMode}.\n   */\n  get scrollMode() {\n    return this._scrollMode;\n  }\n\n  /**\n   * @param {number} mode - The direction in which the document pages should be\n   *   laid out within the scrolling container.\n   *   The constants from {ScrollMode} should be used.\n   */\n  set scrollMode(mode) {\n    if (this._scrollMode === mode) {\n      return; // The Scroll mode didn't change.\n    }\n    if (!Number.isInteger(mode) || !Object.values(ScrollMode).includes(mode)) {\n      throw new Error(`Invalid scroll mode: ${mode}`);\n    }\n    this._scrollMode = mode;\n    this.eventBus.dispatch('scrollmodechanged', { source: this, mode, });\n\n    this._updateScrollMode(/* pageNumber = */ this._currentPageNumber);\n  }\n\n  _updateScrollMode(pageNumber = null) {\n    const scrollMode = this._scrollMode, viewer = this.viewer;\n\n    viewer.classList.toggle('scrollHorizontal',\n                            scrollMode === ScrollMode.HORIZONTAL);\n    viewer.classList.toggle('scrollWrapped',\n                            scrollMode === ScrollMode.WRAPPED);\n\n    if (!this.pdfDocument || !pageNumber) {\n      return;\n    }\n    // Non-numeric scale values can be sensitive to the scroll orientation.\n    // Call this before re-scrolling to the current page, to ensure that any\n    // changes in scale don't move the current page.\n    if (this._currentScaleValue && isNaN(this._currentScaleValue)) {\n      this._setScale(this._currentScaleValue, true);\n    }\n    this.scrollPageIntoView({ pageNumber, });\n    this.update();\n  }\n\n  /**\n   * @return {number} One of the values in {SpreadMode}.\n   */\n  get spreadMode() {\n    return this._spreadMode;\n  }\n\n  /**\n   * @param {number} mode - Group the pages in spreads, starting with odd- or\n   *   even-number pages (unless `SpreadMode.NONE` is used).\n   *   The constants from {SpreadMode} should be used.\n   */\n  set spreadMode(mode) {\n    if (this._spreadMode === mode) {\n      return; // The Spread mode didn't change.\n    }\n    if (!Number.isInteger(mode) || !Object.values(SpreadMode).includes(mode)) {\n      throw new Error(`Invalid spread mode: ${mode}`);\n    }\n    this._spreadMode = mode;\n    this.eventBus.dispatch('spreadmodechanged', { source: this, mode, });\n\n    this._updateSpreadMode(/* pageNumber = */ this._currentPageNumber);\n  }\n\n  _updateSpreadMode(pageNumber = null) {\n    if (!this.pdfDocument) {\n      return;\n    }\n    const viewer = this.viewer, pages = this._pages;\n    // Temporarily remove all the pages from the DOM.\n    viewer.textContent = '';\n\n    if (this._spreadMode === SpreadMode.NONE) {\n      for (let i = 0, iMax = pages.length; i < iMax; ++i) {\n        viewer.appendChild(pages[i].div);\n      }\n    } else {\n      const parity = this._spreadMode - 1;\n      let spread = null;\n      for (let i = 0, iMax = pages.length; i < iMax; ++i) {\n        if (spread === null) {\n          spread = document.createElement('div');\n          spread.className = 'spread';\n          viewer.appendChild(spread);\n        } else if (i % 2 === parity) {\n          spread = spread.cloneNode(false);\n          viewer.appendChild(spread);\n        }\n        spread.appendChild(pages[i].div);\n      }\n    }\n\n    if (!pageNumber) {\n      return;\n    }\n    this.scrollPageIntoView({ pageNumber, });\n    this.update();\n  }\n}\n\nexport {\n  BaseViewer,\n  ScrollMode,\n  SpreadMode,\n};\n","/* Copyright 2014 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AnnotationLayer } from 'pdfjs-lib';\nimport { NullL10n } from './ui_utils';\nimport { SimpleLinkService } from './pdf_link_service';\n\n/**\n * @typedef {Object} AnnotationLayerBuilderOptions\n * @property {HTMLDivElement} pageDiv\n * @property {PDFPage} pdfPage\n * @property {string} imageResourcesPath - (optional) Path for image resources,\n *   mainly for annotation icons. Include trailing slash.\n * @property {boolean} renderInteractiveForms\n * @property {IPDFLinkService} linkService\n * @property {DownloadManager} downloadManager\n * @property {IL10n} l10n - Localization service.\n */\n\nclass AnnotationLayerBuilder {\n  /**\n   * @param {AnnotationLayerBuilderOptions} options\n   */\n  constructor({ pageDiv, pdfPage, linkService, downloadManager,\n                imageResourcesPath = '', renderInteractiveForms = false,\n                l10n = NullL10n, }) {\n    this.pageDiv = pageDiv;\n    this.pdfPage = pdfPage;\n    this.linkService = linkService;\n    this.downloadManager = downloadManager;\n    this.imageResourcesPath = imageResourcesPath;\n    this.renderInteractiveForms = renderInteractiveForms;\n    this.l10n = l10n;\n\n    this.div = null;\n    this._cancelled = false;\n  }\n\n  /**\n   * @param {PageViewport} viewport\n   * @param {string} intent (default value is 'display')\n   */\n  render(viewport, intent = 'display') {\n    this.pdfPage.getAnnotations({ intent, }).then((annotations) => {\n      if (this._cancelled) {\n        return;\n      }\n\n      let parameters = {\n        viewport: viewport.clone({ dontFlip: true, }),\n        div: this.div,\n        annotations,\n        page: this.pdfPage,\n        imageResourcesPath: this.imageResourcesPath,\n        renderInteractiveForms: this.renderInteractiveForms,\n        linkService: this.linkService,\n        downloadManager: this.downloadManager,\n      };\n\n      if (this.div) {\n        // If an annotationLayer already exists, refresh its children's\n        // transformation matrices.\n        AnnotationLayer.update(parameters);\n      } else {\n        // Create an annotation layer div and render the annotations\n        // if there is at least one annotation.\n        if (annotations.length === 0) {\n          return;\n        }\n        this.div = document.createElement('div');\n        this.div.className = 'annotationLayer';\n        this.pageDiv.appendChild(this.div);\n        parameters.div = this.div;\n\n        AnnotationLayer.render(parameters);\n        this.l10n.translate(this.div);\n      }\n    });\n  }\n\n  cancel() {\n    this._cancelled = true;\n  }\n\n  hide() {\n    if (!this.div) {\n      return;\n    }\n    this.div.setAttribute('hidden', 'true');\n  }\n}\n\n/**\n * @implements IPDFAnnotationLayerFactory\n */\nclass DefaultAnnotationLayerFactory {\n  /**\n   * @param {HTMLDivElement} pageDiv\n   * @param {PDFPage} pdfPage\n   * @param {string} imageResourcesPath - (optional) Path for image resources,\n   *   mainly for annotation icons. Include trailing slash.\n   * @param {boolean} renderInteractiveForms\n   * @param {IL10n} l10n\n   * @returns {AnnotationLayerBuilder}\n   */\n  createAnnotationLayerBuilder(pageDiv, pdfPage, imageResourcesPath = '',\n                               renderInteractiveForms = false,\n                               l10n = NullL10n) {\n    return new AnnotationLayerBuilder({\n      pageDiv,\n      pdfPage,\n      imageResourcesPath,\n      renderInteractiveForms,\n      linkService: new SimpleLinkService(),\n      l10n,\n    });\n  }\n}\n\nexport {\n  AnnotationLayerBuilder,\n  DefaultAnnotationLayerFactory,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  approximateFraction, CSS_UNITS, DEFAULT_SCALE, getOutputScale, NullL10n,\n  RendererType, roundToDivide, TextLayerMode\n} from './ui_utils';\nimport {\n  createPromiseCapability, RenderingCancelledException, SVGGraphics\n} from 'pdfjs-lib';\nimport { getGlobalEventBus } from './dom_events';\nimport { RenderingStates } from './pdf_rendering_queue';\nimport { viewerCompatibilityParams } from './viewer_compatibility';\n\n/**\n * @typedef {Object} PDFPageViewOptions\n * @property {HTMLDivElement} container - The viewer element.\n * @property {EventBus} eventBus - The application event bus.\n * @property {number} id - The page unique ID (normally its number).\n * @property {number} scale - The page scale display.\n * @property {PageViewport} defaultViewport - The page viewport.\n * @property {PDFRenderingQueue} renderingQueue - The rendering queue object.\n * @property {IPDFTextLayerFactory} textLayerFactory\n * @property {number} textLayerMode - (optional) Controls if the text layer used\n *   for selection and searching is created, and if the improved text selection\n *   behaviour is enabled. The constants from {TextLayerMode} should be used.\n *   The default value is `TextLayerMode.ENABLE`.\n * @property {IPDFAnnotationLayerFactory} annotationLayerFactory\n * @property {string} imageResourcesPath - (optional) Path for image resources,\n *   mainly for annotation icons. Include trailing slash.\n * @property {boolean} renderInteractiveForms - Turns on rendering of\n *   interactive form elements. The default is `false`.\n * @property {string} renderer - 'canvas' or 'svg'. The default is 'canvas'.\n * @property {boolean} enableWebGL - (optional) Enables WebGL accelerated\n *   rendering for some operations. The default value is `false`.\n * @property {boolean} useOnlyCssZoom - (optional) Enables CSS only zooming.\n *   The default value is `false`.\n * @property {number} maxCanvasPixels - (optional) The maximum supported canvas\n *   size in total pixels, i.e. width * height. Use -1 for no limit.\n *   The default value is 4096 * 4096 (16 mega-pixels).\n * @property {IL10n} l10n - Localization service.\n */\n\nconst MAX_CANVAS_PIXELS = viewerCompatibilityParams.maxCanvasPixels || 16777216;\n\n/**\n * @implements {IRenderableView}\n */\nclass PDFPageView {\n  /**\n   * @param {PDFPageViewOptions} options\n   */\n  constructor(options) {\n    let container = options.container;\n    let defaultViewport = options.defaultViewport;\n\n    this.id = options.id;\n    this.renderingId = 'page' + this.id;\n\n    this.pdfPage = null;\n    this.pageLabel = null;\n    this.rotation = 0;\n    this.scale = options.scale || DEFAULT_SCALE;\n    this.viewport = defaultViewport;\n    this.pdfPageRotate = defaultViewport.rotation;\n    this.hasRestrictedScaling = false;\n    this.textLayerMode = Number.isInteger(options.textLayerMode) ?\n      options.textLayerMode : TextLayerMode.ENABLE;\n    this.imageResourcesPath = options.imageResourcesPath || '';\n    this.renderInteractiveForms = options.renderInteractiveForms || false;\n    this.useOnlyCssZoom = options.useOnlyCssZoom || false;\n    this.maxCanvasPixels = options.maxCanvasPixels || MAX_CANVAS_PIXELS;\n\n    this.eventBus = options.eventBus || getGlobalEventBus();\n    this.renderingQueue = options.renderingQueue;\n    this.textLayerFactory = options.textLayerFactory;\n    this.annotationLayerFactory = options.annotationLayerFactory;\n    this.renderer = options.renderer || RendererType.CANVAS;\n    this.enableWebGL = options.enableWebGL || false;\n    this.l10n = options.l10n || NullL10n;\n\n    this.paintTask = null;\n    this.paintedViewportMap = new WeakMap();\n    this.renderingState = RenderingStates.INITIAL;\n    this.resume = null;\n    this.error = null;\n\n    this.onBeforeDraw = null;\n    this.onAfterDraw = null;\n\n    this.annotationLayer = null;\n    this.textLayer = null;\n    this.zoomLayer = null;\n\n    let div = document.createElement('div');\n    div.className = 'page';\n    div.style.width = Math.floor(this.viewport.width) + 'px';\n    div.style.height = Math.floor(this.viewport.height) + 'px';\n    div.setAttribute('data-page-number', this.id);\n    this.div = div;\n\n    container.appendChild(div);\n  }\n\n  setPdfPage(pdfPage) {\n    this.pdfPage = pdfPage;\n    this.pdfPageRotate = pdfPage.rotate;\n\n    let totalRotation = (this.rotation + this.pdfPageRotate) % 360;\n    this.viewport = pdfPage.getViewport(this.scale * CSS_UNITS,\n                                        totalRotation);\n    this.stats = pdfPage.stats;\n    this.reset();\n  }\n\n  destroy() {\n    this.reset();\n    if (this.pdfPage) {\n      this.pdfPage.cleanup();\n    }\n  }\n\n  /**\n   * @private\n   */\n  _resetZoomLayer(removeFromDOM = false) {\n    if (!this.zoomLayer) {\n      return;\n    }\n    let zoomLayerCanvas = this.zoomLayer.firstChild;\n    this.paintedViewportMap.delete(zoomLayerCanvas);\n    // Zeroing the width and height causes Firefox to release graphics\n    // resources immediately, which can greatly reduce memory consumption.\n    zoomLayerCanvas.width = 0;\n    zoomLayerCanvas.height = 0;\n\n    if (removeFromDOM) {\n      // Note: `ChildNode.remove` doesn't throw if the parent node is undefined.\n      this.zoomLayer.remove();\n    }\n    this.zoomLayer = null;\n  }\n\n  reset(keepZoomLayer = false, keepAnnotations = false) {\n    this.cancelRendering(keepAnnotations);\n\n    let div = this.div;\n    div.style.width = Math.floor(this.viewport.width) + 'px';\n    div.style.height = Math.floor(this.viewport.height) + 'px';\n\n    let childNodes = div.childNodes;\n    let currentZoomLayerNode = (keepZoomLayer && this.zoomLayer) || null;\n    let currentAnnotationNode = (keepAnnotations && this.annotationLayer &&\n                                 this.annotationLayer.div) || null;\n    for (let i = childNodes.length - 1; i >= 0; i--) {\n      let node = childNodes[i];\n      if (currentZoomLayerNode === node || currentAnnotationNode === node) {\n        continue;\n      }\n      div.removeChild(node);\n    }\n    div.removeAttribute('data-loaded');\n\n    if (currentAnnotationNode) {\n      // Hide the annotation layer until all elements are resized\n      // so they are not displayed on the already resized page.\n      this.annotationLayer.hide();\n    } else if (this.annotationLayer) {\n      this.annotationLayer.cancel();\n      this.annotationLayer = null;\n    }\n\n    if (!currentZoomLayerNode) {\n      if (this.canvas) {\n        this.paintedViewportMap.delete(this.canvas);\n        // Zeroing the width and height causes Firefox to release graphics\n        // resources immediately, which can greatly reduce memory consumption.\n        this.canvas.width = 0;\n        this.canvas.height = 0;\n        delete this.canvas;\n      }\n      this._resetZoomLayer();\n    }\n    if (this.svg) {\n      this.paintedViewportMap.delete(this.svg);\n      delete this.svg;\n    }\n\n    this.loadingIconDiv = document.createElement('div');\n    this.loadingIconDiv.className = 'loadingIcon';\n    div.appendChild(this.loadingIconDiv);\n  }\n\n  update(scale, rotation) {\n    this.scale = scale || this.scale;\n    if (typeof rotation !== 'undefined') { // The rotation may be zero.\n      this.rotation = rotation;\n    }\n\n    let totalRotation = (this.rotation + this.pdfPageRotate) % 360;\n    this.viewport = this.viewport.clone({\n      scale: this.scale * CSS_UNITS,\n      rotation: totalRotation,\n    });\n\n    if (this.svg) {\n      this.cssTransform(this.svg, true);\n\n      this.eventBus.dispatch('pagerendered', {\n        source: this,\n        pageNumber: this.id,\n        cssTransform: true,\n      });\n      return;\n    }\n\n    let isScalingRestricted = false;\n    if (this.canvas && this.maxCanvasPixels > 0) {\n      let outputScale = this.outputScale;\n      if (((Math.floor(this.viewport.width) * outputScale.sx) | 0) *\n          ((Math.floor(this.viewport.height) * outputScale.sy) | 0) >\n          this.maxCanvasPixels) {\n        isScalingRestricted = true;\n      }\n    }\n\n    if (this.canvas) {\n      if (this.useOnlyCssZoom ||\n          (this.hasRestrictedScaling && isScalingRestricted)) {\n        this.cssTransform(this.canvas, true);\n\n        this.eventBus.dispatch('pagerendered', {\n          source: this,\n          pageNumber: this.id,\n          cssTransform: true,\n        });\n        return;\n      }\n      if (!this.zoomLayer && !this.canvas.hasAttribute('hidden')) {\n        this.zoomLayer = this.canvas.parentNode;\n        this.zoomLayer.style.position = 'absolute';\n      }\n    }\n    if (this.zoomLayer) {\n      this.cssTransform(this.zoomLayer.firstChild);\n    }\n    this.reset(/* keepZoomLayer = */ true, /* keepAnnotations = */ true);\n  }\n\n  cancelRendering(keepAnnotations = false) {\n    const renderingState = this.renderingState;\n\n    if (this.paintTask) {\n      this.paintTask.cancel();\n      this.paintTask = null;\n    }\n    this.renderingState = RenderingStates.INITIAL;\n    this.resume = null;\n\n    if (this.textLayer) {\n      this.textLayer.cancel();\n      this.textLayer = null;\n    }\n    if (!keepAnnotations && this.annotationLayer) {\n      this.annotationLayer.cancel();\n      this.annotationLayer = null;\n    }\n\n    if (renderingState !== RenderingStates.INITIAL) {\n      this.eventBus.dispatch('pagecancelled', {\n        source: this,\n        pageNumber: this.id,\n        renderingState,\n      });\n    }\n  }\n\n  cssTransform(target, redrawAnnotations = false) {\n    // Scale target (canvas or svg), its wrapper and page container.\n    let width = this.viewport.width;\n    let height = this.viewport.height;\n    let div = this.div;\n    target.style.width = target.parentNode.style.width = div.style.width =\n      Math.floor(width) + 'px';\n    target.style.height = target.parentNode.style.height = div.style.height =\n      Math.floor(height) + 'px';\n    // The canvas may have been originally rotated; rotate relative to that.\n    let relativeRotation = this.viewport.rotation -\n                           this.paintedViewportMap.get(target).rotation;\n    let absRotation = Math.abs(relativeRotation);\n    let scaleX = 1, scaleY = 1;\n    if (absRotation === 90 || absRotation === 270) {\n      // Scale x and y because of the rotation.\n      scaleX = height / width;\n      scaleY = width / height;\n    }\n    let cssTransform = 'rotate(' + relativeRotation + 'deg) ' +\n      'scale(' + scaleX + ',' + scaleY + ')';\n    target.style.transform = cssTransform;\n\n    if (this.textLayer) {\n      // Rotating the text layer is more complicated since the divs inside the\n      // the text layer are rotated.\n      // TODO: This could probably be simplified by drawing the text layer in\n      // one orientation and then rotating overall.\n      let textLayerViewport = this.textLayer.viewport;\n      let textRelativeRotation = this.viewport.rotation -\n        textLayerViewport.rotation;\n      let textAbsRotation = Math.abs(textRelativeRotation);\n      let scale = width / textLayerViewport.width;\n      if (textAbsRotation === 90 || textAbsRotation === 270) {\n        scale = width / textLayerViewport.height;\n      }\n      let textLayerDiv = this.textLayer.textLayerDiv;\n      let transX, transY;\n      switch (textAbsRotation) {\n        case 0:\n          transX = transY = 0;\n          break;\n        case 90:\n          transX = 0;\n          transY = '-' + textLayerDiv.style.height;\n          break;\n        case 180:\n          transX = '-' + textLayerDiv.style.width;\n          transY = '-' + textLayerDiv.style.height;\n          break;\n        case 270:\n          transX = '-' + textLayerDiv.style.width;\n          transY = 0;\n          break;\n        default:\n          console.error('Bad rotation value.');\n          break;\n      }\n\n      textLayerDiv.style.transform =\n        'rotate(' + textAbsRotation + 'deg) ' +\n        'scale(' + scale + ', ' + scale + ') ' +\n        'translate(' + transX + ', ' + transY + ')';\n      textLayerDiv.style.transformOrigin = '0% 0%';\n    }\n\n    if (redrawAnnotations && this.annotationLayer) {\n      this.annotationLayer.render(this.viewport, 'display');\n    }\n  }\n\n  get width() {\n    return this.viewport.width;\n  }\n\n  get height() {\n    return this.viewport.height;\n  }\n\n  getPagePoint(x, y) {\n    return this.viewport.convertToPdfPoint(x, y);\n  }\n\n  draw() {\n    if (this.renderingState !== RenderingStates.INITIAL) {\n      console.error('Must be in new state before drawing');\n      this.reset(); // Ensure that we reset all state to prevent issues.\n    }\n\n    if (!this.pdfPage) {\n      this.renderingState = RenderingStates.FINISHED;\n      return Promise.reject(new Error('Page is not loaded'));\n    }\n\n    this.renderingState = RenderingStates.RUNNING;\n\n    let pdfPage = this.pdfPage;\n    let div = this.div;\n    // Wrap the canvas so that if it has a CSS transform for high DPI the\n    // overflow will be hidden in Firefox.\n    let canvasWrapper = document.createElement('div');\n    canvasWrapper.style.width = div.style.width;\n    canvasWrapper.style.height = div.style.height;\n    canvasWrapper.classList.add('canvasWrapper');\n\n    if (this.annotationLayer && this.annotationLayer.div) {\n      // The annotation layer needs to stay on top.\n      div.insertBefore(canvasWrapper, this.annotationLayer.div);\n    } else {\n      div.appendChild(canvasWrapper);\n    }\n\n    let textLayer = null;\n    if (this.textLayerMode !== TextLayerMode.DISABLE && this.textLayerFactory) {\n      let textLayerDiv = document.createElement('div');\n      textLayerDiv.className = 'textLayer';\n      textLayerDiv.style.width = canvasWrapper.style.width;\n      textLayerDiv.style.height = canvasWrapper.style.height;\n      if (this.annotationLayer && this.annotationLayer.div) {\n        // The annotation layer needs to stay on top.\n        div.insertBefore(textLayerDiv, this.annotationLayer.div);\n      } else {\n        div.appendChild(textLayerDiv);\n      }\n\n      textLayer = this.textLayerFactory.\n        createTextLayerBuilder(textLayerDiv, this.id - 1, this.viewport,\n            this.textLayerMode === TextLayerMode.ENABLE_ENHANCE);\n    }\n    this.textLayer = textLayer;\n\n    let renderContinueCallback = null;\n    if (this.renderingQueue) {\n      renderContinueCallback = (cont) => {\n        if (!this.renderingQueue.isHighestPriority(this)) {\n          this.renderingState = RenderingStates.PAUSED;\n          this.resume = () => {\n            this.renderingState = RenderingStates.RUNNING;\n            cont();\n          };\n          return;\n        }\n        cont();\n      };\n    }\n\n    let finishPaintTask = (error) => {\n      // The paintTask may have been replaced by a new one, so only remove\n      // the reference to the paintTask if it matches the one that is\n      // triggering this callback.\n      if (paintTask === this.paintTask) {\n        this.paintTask = null;\n      }\n\n      if (error instanceof RenderingCancelledException) {\n        this.error = null;\n        return Promise.resolve(undefined);\n      }\n\n      this.renderingState = RenderingStates.FINISHED;\n\n      if (this.loadingIconDiv) {\n        div.removeChild(this.loadingIconDiv);\n        delete this.loadingIconDiv;\n      }\n      this._resetZoomLayer(/* removeFromDOM = */ true);\n\n      this.error = error;\n      this.stats = pdfPage.stats;\n      if (this.onAfterDraw) {\n        this.onAfterDraw();\n      }\n      this.eventBus.dispatch('pagerendered', {\n        source: this,\n        pageNumber: this.id,\n        cssTransform: false,\n      });\n\n      if (error) {\n        return Promise.reject(error);\n      }\n      return Promise.resolve(undefined);\n    };\n\n    let paintTask = this.renderer === RendererType.SVG ?\n      this.paintOnSvg(canvasWrapper) :\n      this.paintOnCanvas(canvasWrapper);\n    paintTask.onRenderContinue = renderContinueCallback;\n    this.paintTask = paintTask;\n\n    let resultPromise = paintTask.promise.then(function() {\n      return finishPaintTask(null).then(function () {\n        if (textLayer) {\n          let readableStream = pdfPage.streamTextContent({\n            normalizeWhitespace: true,\n          });\n          textLayer.setTextContentStream(readableStream);\n          textLayer.render();\n        }\n      });\n    }, function(reason) {\n      return finishPaintTask(reason);\n    });\n\n    if (this.annotationLayerFactory) {\n      if (!this.annotationLayer) {\n        this.annotationLayer = this.annotationLayerFactory.\n          createAnnotationLayerBuilder(div, pdfPage, this.imageResourcesPath,\n                                       this.renderInteractiveForms, this.l10n);\n      }\n      this.annotationLayer.render(this.viewport, 'display');\n    }\n    div.setAttribute('data-loaded', true);\n\n    if (this.onBeforeDraw) {\n      this.onBeforeDraw();\n    }\n    return resultPromise;\n  }\n\n  paintOnCanvas(canvasWrapper) {\n    let renderCapability = createPromiseCapability();\n    let result = {\n      promise: renderCapability.promise,\n      onRenderContinue(cont) {\n        cont();\n      },\n      cancel() {\n        renderTask.cancel();\n      },\n    };\n\n    let viewport = this.viewport;\n    let canvas = document.createElement('canvas');\n    canvas.id = this.renderingId;\n\n    // Keep the canvas hidden until the first draw callback, or until drawing\n    // is complete when `!this.renderingQueue`, to prevent black flickering.\n    canvas.setAttribute('hidden', 'hidden');\n    let isCanvasHidden = true;\n    let showCanvas = function () {\n      if (isCanvasHidden) {\n        canvas.removeAttribute('hidden');\n        isCanvasHidden = false;\n      }\n    };\n\n    canvasWrapper.appendChild(canvas);\n    this.canvas = canvas;\n\n    if (typeof PDFJSDev === 'undefined' ||\n        PDFJSDev.test('MOZCENTRAL || FIREFOX || GENERIC')) {\n      canvas.mozOpaque = true;\n    }\n\n    let ctx = canvas.getContext('2d', { alpha: false, });\n    let outputScale = getOutputScale(ctx);\n    this.outputScale = outputScale;\n\n    if (this.useOnlyCssZoom) {\n      let actualSizeViewport = viewport.clone({ scale: CSS_UNITS, });\n      // Use a scale that makes the canvas have the originally intended size\n      // of the page.\n      outputScale.sx *= actualSizeViewport.width / viewport.width;\n      outputScale.sy *= actualSizeViewport.height / viewport.height;\n      outputScale.scaled = true;\n    }\n\n    if (this.maxCanvasPixels > 0) {\n      let pixelsInViewport = viewport.width * viewport.height;\n      let maxScale = Math.sqrt(this.maxCanvasPixels / pixelsInViewport);\n      if (outputScale.sx > maxScale || outputScale.sy > maxScale) {\n        outputScale.sx = maxScale;\n        outputScale.sy = maxScale;\n        outputScale.scaled = true;\n        this.hasRestrictedScaling = true;\n      } else {\n        this.hasRestrictedScaling = false;\n      }\n    }\n\n    let sfx = approximateFraction(outputScale.sx);\n    let sfy = approximateFraction(outputScale.sy);\n    canvas.width = roundToDivide(viewport.width * outputScale.sx, sfx[0]);\n    canvas.height = roundToDivide(viewport.height * outputScale.sy, sfy[0]);\n    canvas.style.width = roundToDivide(viewport.width, sfx[1]) + 'px';\n    canvas.style.height = roundToDivide(viewport.height, sfy[1]) + 'px';\n    // Add the viewport so it's known what it was originally drawn with.\n    this.paintedViewportMap.set(canvas, viewport);\n\n    // Rendering area\n    let transform = !outputScale.scaled ? null :\n      [outputScale.sx, 0, 0, outputScale.sy, 0, 0];\n    let renderContext = {\n      canvasContext: ctx,\n      transform,\n      viewport: this.viewport,\n      enableWebGL: this.enableWebGL,\n      renderInteractiveForms: this.renderInteractiveForms,\n    };\n    let renderTask = this.pdfPage.render(renderContext);\n    renderTask.onContinue = function (cont) {\n      showCanvas();\n      if (result.onRenderContinue) {\n        result.onRenderContinue(cont);\n      } else {\n        cont();\n      }\n    };\n\n    renderTask.promise.then(function() {\n      showCanvas();\n      renderCapability.resolve(undefined);\n    }, function(error) {\n      showCanvas();\n      renderCapability.reject(error);\n    });\n    return result;\n  }\n\n  paintOnSvg(wrapper) {\n    if (typeof PDFJSDev !== 'undefined' &&\n        PDFJSDev.test('FIREFOX || MOZCENTRAL || CHROME')) {\n      // Return a mock object, to prevent errors such as e.g.\n      // \"TypeError: paintTask.promise is undefined\".\n      return {\n        promise: Promise.reject(new Error('SVG rendering is not supported.')),\n        onRenderContinue(cont) { },\n        cancel() { },\n      };\n    }\n\n    let cancelled = false;\n    let ensureNotCancelled = () => {\n      if (cancelled) {\n        throw new RenderingCancelledException(\n          'Rendering cancelled, page ' + this.id, 'svg');\n      }\n    };\n\n    let pdfPage = this.pdfPage;\n    let actualSizeViewport = this.viewport.clone({ scale: CSS_UNITS, });\n    let promise = pdfPage.getOperatorList().then((opList) => {\n      ensureNotCancelled();\n      let svgGfx = new SVGGraphics(pdfPage.commonObjs, pdfPage.objs);\n      return svgGfx.getSVG(opList, actualSizeViewport).then((svg) => {\n        ensureNotCancelled();\n        this.svg = svg;\n        this.paintedViewportMap.set(svg, actualSizeViewport);\n\n        svg.style.width = wrapper.style.width;\n        svg.style.height = wrapper.style.height;\n        this.renderingState = RenderingStates.FINISHED;\n        wrapper.appendChild(svg);\n      });\n    });\n\n    return {\n      promise,\n      onRenderContinue(cont) {\n        cont();\n      },\n      cancel() {\n        cancelled = true;\n      },\n    };\n  }\n\n  /**\n   * @param {string|null} label\n   */\n  setPageLabel(label) {\n    this.pageLabel = (typeof label === 'string' ? label : null);\n\n    if (this.pageLabel !== null) {\n      this.div.setAttribute('data-page-label', this.pageLabel);\n    } else {\n      this.div.removeAttribute('data-page-label');\n    }\n  }\n}\n\nexport {\n  PDFPageView,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getGlobalEventBus } from './dom_events';\nimport { renderTextLayer } from 'pdfjs-lib';\nimport { scrollIntoView } from './ui_utils';\n\nconst EXPAND_DIVS_TIMEOUT = 300; // ms\nconst MATCH_SCROLL_OFFSET_TOP = -50;\nconst MATCH_SCROLL_OFFSET_LEFT = -400;\n\n/**\n * @typedef {Object} TextLayerBuilderOptions\n * @property {HTMLDivElement} textLayerDiv - The text layer container.\n * @property {EventBus} eventBus - The application event bus.\n * @property {number} pageIndex - The page index.\n * @property {PageViewport} viewport - The viewport of the text layer.\n * @property {PDFFindController} findController\n * @property {boolean} enhanceTextSelection - Option to turn on improved\n *   text selection.\n */\n\n/**\n * The text layer builder provides text selection functionality for the PDF.\n * It does this by creating overlay divs over the PDF's text. These divs\n * contain text that matches the PDF text they are overlaying. This object\n * also provides a way to highlight text that is being searched for.\n */\nclass TextLayerBuilder {\n  constructor({ textLayerDiv, eventBus, pageIndex, viewport,\n                findController = null, enhanceTextSelection = false, }) {\n    this.textLayerDiv = textLayerDiv;\n    this.eventBus = eventBus || getGlobalEventBus();\n    this.textContent = null;\n    this.textContentItemsStr = [];\n    this.textContentStream = null;\n    this.renderingDone = false;\n    this.pageIdx = pageIndex;\n    this.pageNumber = this.pageIdx + 1;\n    this.matches = [];\n    this.viewport = viewport;\n    this.textDivs = [];\n    this.findController = findController;\n    this.textLayerRenderTask = null;\n    this.enhanceTextSelection = enhanceTextSelection;\n\n    this._boundEvents = Object.create(null);\n    this._bindEvents();\n\n    this._bindMouse();\n  }\n\n  /**\n   * @private\n   */\n  _finishRendering() {\n    this.renderingDone = true;\n\n    if (!this.enhanceTextSelection) {\n      let endOfContent = document.createElement('div');\n      endOfContent.className = 'endOfContent';\n      this.textLayerDiv.appendChild(endOfContent);\n    }\n\n    this.eventBus.dispatch('textlayerrendered', {\n      source: this,\n      pageNumber: this.pageNumber,\n      numTextDivs: this.textDivs.length,\n    });\n  }\n\n  /**\n   * Renders the text layer.\n   *\n   * @param {number} timeout - (optional) wait for a specified amount of\n   *                           milliseconds before rendering\n   */\n  render(timeout = 0) {\n    if (!(this.textContent || this.textContentStream) || this.renderingDone) {\n      return;\n    }\n    this.cancel();\n\n    this.textDivs = [];\n    let textLayerFrag = document.createDocumentFragment();\n    this.textLayerRenderTask = renderTextLayer({\n      textContent: this.textContent,\n      textContentStream: this.textContentStream,\n      container: textLayerFrag,\n      viewport: this.viewport,\n      textDivs: this.textDivs,\n      textContentItemsStr: this.textContentItemsStr,\n      timeout,\n      enhanceTextSelection: this.enhanceTextSelection,\n    });\n    this.textLayerRenderTask.promise.then(() => {\n      this.textLayerDiv.appendChild(textLayerFrag);\n      this._finishRendering();\n      this.updateMatches();\n    }, function (reason) {\n      // Cancelled or failed to render text layer; skipping errors.\n    });\n  }\n\n  /**\n   * Cancel rendering of the text layer.\n   */\n  cancel() {\n    if (this.textLayerRenderTask) {\n      this.textLayerRenderTask.cancel();\n      this.textLayerRenderTask = null;\n    }\n  }\n\n  setTextContentStream(readableStream) {\n    this.cancel();\n    this.textContentStream = readableStream;\n  }\n\n  setTextContent(textContent) {\n    this.cancel();\n    this.textContent = textContent;\n  }\n\n  convertMatches(matches, matchesLength) {\n    let i = 0;\n    let iIndex = 0;\n    let textContentItemsStr = this.textContentItemsStr;\n    let end = textContentItemsStr.length - 1;\n    let queryLen = (this.findController === null ?\n                    0 : this.findController.state.query.length);\n    let ret = [];\n    if (!matches) {\n      return ret;\n    }\n    for (let m = 0, len = matches.length; m < len; m++) {\n      // Calculate the start position.\n      let matchIdx = matches[m];\n\n      // Loop over the divIdxs.\n      while (i !== end && matchIdx >=\n             (iIndex + textContentItemsStr[i].length)) {\n        iIndex += textContentItemsStr[i].length;\n        i++;\n      }\n\n      if (i === textContentItemsStr.length) {\n        console.error('Could not find a matching mapping');\n      }\n\n      let match = {\n        begin: {\n          divIdx: i,\n          offset: matchIdx - iIndex,\n        },\n      };\n\n      // Calculate the end position.\n      if (matchesLength) { // Multiterm search.\n        matchIdx += matchesLength[m];\n      } else { // Phrase search.\n        matchIdx += queryLen;\n      }\n\n      // Somewhat the same array as above, but use > instead of >= to get\n      // the end position right.\n      while (i !== end && matchIdx >\n             (iIndex + textContentItemsStr[i].length)) {\n        iIndex += textContentItemsStr[i].length;\n        i++;\n      }\n\n      match.end = {\n        divIdx: i,\n        offset: matchIdx - iIndex,\n      };\n      ret.push(match);\n    }\n\n    return ret;\n  }\n\n  renderMatches(matches) {\n    // Early exit if there is nothing to render.\n    if (matches.length === 0) {\n      return;\n    }\n\n    let textContentItemsStr = this.textContentItemsStr;\n    let textDivs = this.textDivs;\n    let prevEnd = null;\n    let pageIdx = this.pageIdx;\n    let isSelectedPage = (this.findController === null ?\n      false : (pageIdx === this.findController.selected.pageIdx));\n    let selectedMatchIdx = (this.findController === null ?\n                            -1 : this.findController.selected.matchIdx);\n    let highlightAll = (this.findController === null ?\n                        false : this.findController.state.highlightAll);\n    let infinity = {\n      divIdx: -1,\n      offset: undefined,\n    };\n\n    function beginText(begin, className) {\n      let divIdx = begin.divIdx;\n      textDivs[divIdx].textContent = '';\n      appendTextToDiv(divIdx, 0, begin.offset, className);\n    }\n\n    function appendTextToDiv(divIdx, fromOffset, toOffset, className) {\n      let div = textDivs[divIdx];\n      let content = textContentItemsStr[divIdx].substring(fromOffset, toOffset);\n      let node = document.createTextNode(content);\n      if (className) {\n        let span = document.createElement('span');\n        span.className = className;\n        span.appendChild(node);\n        div.appendChild(span);\n        return;\n      }\n      div.appendChild(node);\n    }\n\n    let i0 = selectedMatchIdx, i1 = i0 + 1;\n    if (highlightAll) {\n      i0 = 0;\n      i1 = matches.length;\n    } else if (!isSelectedPage) {\n      // Not highlighting all and this isn't the selected page, so do nothing.\n      return;\n    }\n\n    for (let i = i0; i < i1; i++) {\n      let match = matches[i];\n      let begin = match.begin;\n      let end = match.end;\n      let isSelected = (isSelectedPage && i === selectedMatchIdx);\n      let highlightSuffix = (isSelected ? ' selected' : '');\n\n      // Scroll the selected match into view.\n      if (this.findController) {\n        if (this.findController.selected.matchIdx === i &&\n            this.findController.selected.pageIdx === pageIdx) {\n          const spot = {\n            top: MATCH_SCROLL_OFFSET_TOP,\n            left: MATCH_SCROLL_OFFSET_LEFT,\n          };\n          scrollIntoView(textDivs[begin.divIdx], spot,\n                         /* skipOverflowHiddenElements = */ true);\n        }\n      }\n\n      // Match inside new div.\n      if (!prevEnd || begin.divIdx !== prevEnd.divIdx) {\n        // If there was a previous div, then add the text at the end.\n        if (prevEnd !== null) {\n          appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset);\n        }\n        // Clear the divs and set the content until the starting point.\n        beginText(begin);\n      } else {\n        appendTextToDiv(prevEnd.divIdx, prevEnd.offset, begin.offset);\n      }\n\n      if (begin.divIdx === end.divIdx) {\n        appendTextToDiv(begin.divIdx, begin.offset, end.offset,\n                        'highlight' + highlightSuffix);\n      } else {\n        appendTextToDiv(begin.divIdx, begin.offset, infinity.offset,\n                        'highlight begin' + highlightSuffix);\n        for (let n0 = begin.divIdx + 1, n1 = end.divIdx; n0 < n1; n0++) {\n          textDivs[n0].className = 'highlight middle' + highlightSuffix;\n        }\n        beginText(end, 'highlight end' + highlightSuffix);\n      }\n      prevEnd = end;\n    }\n\n    if (prevEnd) {\n      appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset);\n    }\n  }\n\n  updateMatches() {\n    // Only show matches when all rendering is done.\n    if (!this.renderingDone) {\n      return;\n    }\n\n    // Clear all matches.\n    let matches = this.matches;\n    let textDivs = this.textDivs;\n    let textContentItemsStr = this.textContentItemsStr;\n    let clearedUntilDivIdx = -1;\n\n    // Clear all current matches.\n    for (let i = 0, len = matches.length; i < len; i++) {\n      let match = matches[i];\n      let begin = Math.max(clearedUntilDivIdx, match.begin.divIdx);\n      for (let n = begin, end = match.end.divIdx; n <= end; n++) {\n        let div = textDivs[n];\n        div.textContent = textContentItemsStr[n];\n        div.className = '';\n      }\n      clearedUntilDivIdx = match.end.divIdx + 1;\n    }\n\n    if (!this.findController || !this.findController.highlightMatches) {\n      return;\n    }\n\n    // Convert the matches on the page controller into the match format\n    // used for the textLayer.\n    let pageMatches, pageMatchesLength;\n    if (this.findController !== null) {\n      pageMatches = this.findController.pageMatches[this.pageIdx] || null;\n      pageMatchesLength = (this.findController.pageMatchesLength) ?\n        this.findController.pageMatchesLength[this.pageIdx] || null : null;\n    }\n\n    this.matches = this.convertMatches(pageMatches, pageMatchesLength);\n    this.renderMatches(this.matches);\n  }\n\n  /**\n   * @private\n   */\n  _bindEvents() {\n    const { eventBus, _boundEvents, } = this;\n\n    _boundEvents.pageCancelled = (evt) => {\n      if (evt.pageNumber !== this.pageNumber) {\n        return;\n      }\n      if (this.textLayerRenderTask) {\n        console.error('TextLayerBuilder._bindEvents: `this.cancel()` should ' +\n          'have been called when the page was reset, or rendering cancelled.');\n        return;\n      }\n      // Ensure that all event listeners are cleaned up when the page is reset,\n      // since re-rendering will create new `TextLayerBuilder` instances and the\n      // number of (stale) event listeners would otherwise grow without bound.\n      for (const name in _boundEvents) {\n        eventBus.off(name.toLowerCase(), _boundEvents[name]);\n        delete _boundEvents[name];\n      }\n    };\n    _boundEvents.updateTextLayerMatches = (evt) => {\n      if (evt.pageIndex !== this.pageIdx && evt.pageIndex !== -1) {\n        return;\n      }\n      this.updateMatches();\n    };\n\n    eventBus.on('pagecancelled', _boundEvents.pageCancelled);\n    eventBus.on('updatetextlayermatches', _boundEvents.updateTextLayerMatches);\n  }\n\n  /**\n   * Improves text selection by adding an additional div where the mouse was\n   * clicked. This reduces flickering of the content if the mouse is slowly\n   * dragged up or down.\n   *\n   * @private\n   */\n  _bindMouse() {\n    let div = this.textLayerDiv;\n    let expandDivsTimer = null;\n\n    div.addEventListener('mousedown', (evt) => {\n      if (this.enhanceTextSelection && this.textLayerRenderTask) {\n        this.textLayerRenderTask.expandTextDivs(true);\n        if ((typeof PDFJSDev === 'undefined' ||\n             !PDFJSDev.test('FIREFOX || MOZCENTRAL')) &&\n            expandDivsTimer) {\n          clearTimeout(expandDivsTimer);\n          expandDivsTimer = null;\n        }\n        return;\n      }\n\n      let end = div.querySelector('.endOfContent');\n      if (!end) {\n        return;\n      }\n      if (typeof PDFJSDev === 'undefined' ||\n          !PDFJSDev.test('FIREFOX || MOZCENTRAL')) {\n        // On non-Firefox browsers, the selection will feel better if the height\n        // of the `endOfContent` div is adjusted to start at mouse click\n        // location. This avoids flickering when the selection moves up.\n        // However it does not work when selection is started on empty space.\n        let adjustTop = evt.target !== div;\n        if (typeof PDFJSDev === 'undefined' || PDFJSDev.test('GENERIC')) {\n          adjustTop = adjustTop && window.getComputedStyle(end).\n            getPropertyValue('-moz-user-select') !== 'none';\n        }\n        if (adjustTop) {\n          let divBounds = div.getBoundingClientRect();\n          let r = Math.max(0, (evt.pageY - divBounds.top) / divBounds.height);\n          end.style.top = (r * 100).toFixed(2) + '%';\n        }\n      }\n      end.classList.add('active');\n    });\n\n    div.addEventListener('mouseup', () => {\n      if (this.enhanceTextSelection && this.textLayerRenderTask) {\n        if (typeof PDFJSDev === 'undefined' ||\n            !PDFJSDev.test('FIREFOX || MOZCENTRAL')) {\n          expandDivsTimer = setTimeout(() => {\n            if (this.textLayerRenderTask) {\n              this.textLayerRenderTask.expandTextDivs(false);\n            }\n            expandDivsTimer = null;\n          }, EXPAND_DIVS_TIMEOUT);\n        } else {\n          this.textLayerRenderTask.expandTextDivs(false);\n        }\n        return;\n      }\n\n      let end = div.querySelector('.endOfContent');\n      if (!end) {\n        return;\n      }\n      if (typeof PDFJSDev === 'undefined' ||\n          !PDFJSDev.test('FIREFOX || MOZCENTRAL')) {\n        end.style.top = '';\n      }\n      end.classList.remove('active');\n    });\n  }\n}\n\n/**\n * @implements IPDFTextLayerFactory\n */\nclass DefaultTextLayerFactory {\n  /**\n   * @param {HTMLDivElement} textLayerDiv\n   * @param {number} pageIndex\n   * @param {PageViewport} viewport\n   * @param {boolean} enhanceTextSelection\n   * @returns {TextLayerBuilder}\n   */\n  createTextLayerBuilder(textLayerDiv, pageIndex, viewport,\n                         enhanceTextSelection = false) {\n    return new TextLayerBuilder({\n      textLayerDiv,\n      pageIndex,\n      viewport,\n      enhanceTextSelection,\n    });\n  }\n}\n\nexport {\n  TextLayerBuilder,\n  DefaultTextLayerFactory,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ScrollMode, SpreadMode } from './base_viewer';\nimport { CursorTool } from './pdf_cursor_tools';\nimport { PDFSinglePageViewer } from './pdf_single_page_viewer';\nimport { SCROLLBAR_PADDING } from './ui_utils';\n\n/**\n * @typedef {Object} SecondaryToolbarOptions\n * @property {HTMLDivElement} toolbar - Container for the secondary toolbar.\n * @property {HTMLButtonElement} toggleButton - Button to toggle the visibility\n *   of the secondary toolbar.\n * @property {HTMLDivElement} toolbarButtonContainer - Container where all the\n *   toolbar buttons are placed. The maximum height of the toolbar is controlled\n *   dynamically by adjusting the 'max-height' CSS property of this DOM element.\n * @property {HTMLButtonElement} presentationModeButton - Button for entering\n *   presentation mode.\n * @property {HTMLButtonElement} openFileButton - Button to open a file.\n * @property {HTMLButtonElement} printButton - Button to print the document.\n * @property {HTMLButtonElement} downloadButton - Button to download the\n *   document.\n * @property {HTMLLinkElement} viewBookmarkButton - Button to obtain a bookmark\n *   link to the current location in the document.\n * @property {HTMLButtonElement} firstPageButton - Button to go to the first\n *   page in the document.\n * @property {HTMLButtonElement} lastPageButton - Button to go to the last page\n *   in the document.\n * @property {HTMLButtonElement} pageRotateCwButton - Button to rotate the pages\n *   clockwise.\n * @property {HTMLButtonElement} pageRotateCcwButton - Button to rotate the\n *   pages counterclockwise.\n * @property {HTMLButtonElement} cursorSelectToolButton - Button to enable the\n *   select tool.\n * @property {HTMLButtonElement} cursorHandToolButton - Button to enable the\n *   hand tool.\n * @property {HTMLButtonElement} documentPropertiesButton - Button for opening\n *   the document properties dialog.\n */\n\nclass SecondaryToolbar {\n  /**\n   * @param {SecondaryToolbarOptions} options\n   * @param {HTMLDivElement} mainContainer\n   * @param {EventBus} eventBus\n   */\n  constructor(options, mainContainer, eventBus) {\n    this.toolbar = options.toolbar;\n    this.toggleButton = options.toggleButton;\n    this.toolbarButtonContainer = options.toolbarButtonContainer;\n    this.buttons = [\n      { element: options.presentationModeButton, eventName: 'presentationmode',\n        close: true, },\n      { element: options.openFileButton, eventName: 'openfile', close: true, },\n      { element: options.printButton, eventName: 'print', close: true, },\n      { element: options.downloadButton, eventName: 'download', close: true, },\n      { element: options.viewBookmarkButton, eventName: null, close: true, },\n      { element: options.firstPageButton, eventName: 'firstpage',\n        close: true, },\n      { element: options.lastPageButton, eventName: 'lastpage', close: true, },\n      { element: options.pageRotateCwButton, eventName: 'rotatecw',\n        close: false, },\n      { element: options.pageRotateCcwButton, eventName: 'rotateccw',\n        close: false, },\n      { element: options.cursorSelectToolButton, eventName: 'switchcursortool',\n        eventDetails: { tool: CursorTool.SELECT, }, close: true, },\n      { element: options.cursorHandToolButton, eventName: 'switchcursortool',\n        eventDetails: { tool: CursorTool.HAND, }, close: true, },\n      { element: options.scrollVerticalButton, eventName: 'switchscrollmode',\n        eventDetails: { mode: ScrollMode.VERTICAL, }, close: true, },\n      { element: options.scrollHorizontalButton, eventName: 'switchscrollmode',\n        eventDetails: { mode: ScrollMode.HORIZONTAL, }, close: true, },\n      { element: options.scrollWrappedButton, eventName: 'switchscrollmode',\n        eventDetails: { mode: ScrollMode.WRAPPED, }, close: true, },\n      { element: options.spreadNoneButton, eventName: 'switchspreadmode',\n        eventDetails: { mode: SpreadMode.NONE, }, close: true, },\n      { element: options.spreadOddButton, eventName: 'switchspreadmode',\n        eventDetails: { mode: SpreadMode.ODD, }, close: true, },\n      { element: options.spreadEvenButton, eventName: 'switchspreadmode',\n        eventDetails: { mode: SpreadMode.EVEN, }, close: true, },\n      { element: options.documentPropertiesButton,\n        eventName: 'documentproperties', close: true, },\n    ];\n    this.items = {\n      firstPage: options.firstPageButton,\n      lastPage: options.lastPageButton,\n      pageRotateCw: options.pageRotateCwButton,\n      pageRotateCcw: options.pageRotateCcwButton,\n    };\n\n    this.mainContainer = mainContainer;\n    this.eventBus = eventBus;\n\n    this.opened = false;\n    this.containerHeight = null;\n    this.previousContainerHeight = null;\n\n    this.reset();\n\n    // Bind the event listeners for click, cursor tool, and scroll/spread mode\n    // actions.\n    this._bindClickListeners();\n    this._bindCursorToolsListener(options);\n    this._bindScrollModeListener(options);\n    this._bindSpreadModeListener(options);\n\n    // Bind the event listener for adjusting the 'max-height' of the toolbar.\n    this.eventBus.on('resize', this._setMaxHeight.bind(this));\n\n    // Hide the Scroll/Spread mode buttons, when they're not applicable to the\n    // current `BaseViewer` instance (in particular `PDFSinglePageViewer`).\n    this.eventBus.on('baseviewerinit', (evt) => {\n      if (evt.source instanceof PDFSinglePageViewer) {\n        this.toolbarButtonContainer.classList.add('hiddenScrollModeButtons',\n                                                  'hiddenSpreadModeButtons');\n      } else {\n        this.toolbarButtonContainer.classList.remove('hiddenScrollModeButtons',\n                                                     'hiddenSpreadModeButtons');\n      }\n    });\n  }\n\n  /**\n   * @return {boolean}\n   */\n  get isOpen() {\n    return this.opened;\n  }\n\n  setPageNumber(pageNumber) {\n    this.pageNumber = pageNumber;\n    this._updateUIState();\n  }\n\n  setPagesCount(pagesCount) {\n    this.pagesCount = pagesCount;\n    this._updateUIState();\n  }\n\n  reset() {\n    this.pageNumber = 0;\n    this.pagesCount = 0;\n    this._updateUIState();\n\n    // Reset the Scroll/Spread buttons too, since they're document specific.\n    this.eventBus.dispatch('secondarytoolbarreset', { source: this, });\n  }\n\n  _updateUIState() {\n    this.items.firstPage.disabled = (this.pageNumber <= 1);\n    this.items.lastPage.disabled = (this.pageNumber >= this.pagesCount);\n    this.items.pageRotateCw.disabled = this.pagesCount === 0;\n    this.items.pageRotateCcw.disabled = this.pagesCount === 0;\n  }\n\n  _bindClickListeners() {\n    // Button to toggle the visibility of the secondary toolbar.\n    this.toggleButton.addEventListener('click', this.toggle.bind(this));\n\n    // All items within the secondary toolbar.\n    for (let button in this.buttons) {\n      let { element, eventName, close, eventDetails, } = this.buttons[button];\n\n      element.addEventListener('click', (evt) => {\n        if (eventName !== null) {\n          let details = { source: this, };\n          for (let property in eventDetails) {\n            details[property] = eventDetails[property];\n          }\n          this.eventBus.dispatch(eventName, details);\n        }\n        if (close) {\n          this.close();\n        }\n      });\n    }\n  }\n\n  _bindCursorToolsListener(buttons) {\n    this.eventBus.on('cursortoolchanged', function(evt) {\n      buttons.cursorSelectToolButton.classList.remove('toggled');\n      buttons.cursorHandToolButton.classList.remove('toggled');\n\n      switch (evt.tool) {\n        case CursorTool.SELECT:\n          buttons.cursorSelectToolButton.classList.add('toggled');\n          break;\n        case CursorTool.HAND:\n          buttons.cursorHandToolButton.classList.add('toggled');\n          break;\n      }\n    });\n  }\n\n  _bindScrollModeListener(buttons) {\n    function scrollModeChanged(evt) {\n      buttons.scrollVerticalButton.classList.remove('toggled');\n      buttons.scrollHorizontalButton.classList.remove('toggled');\n      buttons.scrollWrappedButton.classList.remove('toggled');\n\n      switch (evt.mode) {\n        case ScrollMode.VERTICAL:\n          buttons.scrollVerticalButton.classList.add('toggled');\n          break;\n        case ScrollMode.HORIZONTAL:\n          buttons.scrollHorizontalButton.classList.add('toggled');\n          break;\n        case ScrollMode.WRAPPED:\n          buttons.scrollWrappedButton.classList.add('toggled');\n          break;\n      }\n\n      // Temporarily *disable* the Spread buttons when horizontal scrolling is\n      // enabled, since the non-default Spread modes doesn't affect the layout.\n      const isScrollModeHorizontal = (evt.mode === ScrollMode.HORIZONTAL);\n      buttons.spreadNoneButton.disabled = isScrollModeHorizontal;\n      buttons.spreadOddButton.disabled = isScrollModeHorizontal;\n      buttons.spreadEvenButton.disabled = isScrollModeHorizontal;\n    }\n    this.eventBus.on('scrollmodechanged', scrollModeChanged);\n\n    this.eventBus.on('secondarytoolbarreset', (evt) => {\n      if (evt.source === this) {\n        scrollModeChanged({ mode: ScrollMode.VERTICAL, });\n      }\n    });\n  }\n\n  _bindSpreadModeListener(buttons) {\n    function spreadModeChanged(evt) {\n      buttons.spreadNoneButton.classList.remove('toggled');\n      buttons.spreadOddButton.classList.remove('toggled');\n      buttons.spreadEvenButton.classList.remove('toggled');\n\n      switch (evt.mode) {\n        case SpreadMode.NONE:\n          buttons.spreadNoneButton.classList.add('toggled');\n          break;\n        case SpreadMode.ODD:\n          buttons.spreadOddButton.classList.add('toggled');\n          break;\n        case SpreadMode.EVEN:\n          buttons.spreadEvenButton.classList.add('toggled');\n          break;\n      }\n    }\n    this.eventBus.on('spreadmodechanged', spreadModeChanged);\n\n    this.eventBus.on('secondarytoolbarreset', (evt) => {\n      if (evt.source === this) {\n        spreadModeChanged({ mode: SpreadMode.NONE, });\n      }\n    });\n  }\n\n  open() {\n    if (this.opened) {\n      return;\n    }\n    this.opened = true;\n    this._setMaxHeight();\n\n    this.toggleButton.classList.add('toggled');\n    this.toolbar.classList.remove('hidden');\n  }\n\n  close() {\n    if (!this.opened) {\n      return;\n    }\n    this.opened = false;\n    this.toolbar.classList.add('hidden');\n    this.toggleButton.classList.remove('toggled');\n  }\n\n  toggle() {\n    if (this.opened) {\n      this.close();\n    } else {\n      this.open();\n    }\n  }\n\n  /**\n   * @private\n   */\n  _setMaxHeight() {\n    if (!this.opened) {\n      return; // Only adjust the 'max-height' if the toolbar is visible.\n    }\n    this.containerHeight = this.mainContainer.clientHeight;\n\n    if (this.containerHeight === this.previousContainerHeight) {\n      return;\n    }\n    this.toolbarButtonContainer.setAttribute('style',\n      'max-height: ' + (this.containerHeight - SCROLLBAR_PADDING) + 'px;');\n\n    this.previousContainerHeight = this.containerHeight;\n  }\n}\n\nexport {\n  SecondaryToolbar,\n};\n","/* Copyright 2017 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { BaseViewer } from './base_viewer';\nimport { scrollIntoView } from './ui_utils';\nimport { shadow } from 'pdfjs-lib';\n\nclass PDFSinglePageViewer extends BaseViewer {\n  constructor(options) {\n    super(options);\n\n    this.eventBus.on('pagesinit', (evt) => {\n      // Since the pages are placed in a `DocumentFragment`, make sure that\n      // the current page becomes visible upon loading of the document.\n      this._ensurePageViewVisible();\n    });\n  }\n\n  get _setDocumentViewerElement() {\n    // Since we only want to display *one* page at a time when using the\n    // `PDFSinglePageViewer`, we cannot append them to the `viewer` DOM element.\n    // Instead, they are placed in a `DocumentFragment`, and only the current\n    // page is displayed in the viewer (refer to `this._ensurePageViewVisible`).\n    return shadow(this, '_setDocumentViewerElement', this._shadowViewer);\n  }\n\n  _resetView() {\n    super._resetView();\n    this._previousPageNumber = 1;\n    this._shadowViewer = document.createDocumentFragment();\n  }\n\n  _ensurePageViewVisible() {\n    let pageView = this._pages[this._currentPageNumber - 1];\n    let previousPageView = this._pages[this._previousPageNumber - 1];\n\n    let viewerNodes = this.viewer.childNodes;\n    switch (viewerNodes.length) {\n      case 0: // Should *only* occur on initial loading.\n        this.viewer.appendChild(pageView.div);\n        break;\n      case 1: // The normal page-switching case.\n        if (viewerNodes[0] !== previousPageView.div) {\n          throw new Error(\n            '_ensurePageViewVisible: Unexpected previously visible page.');\n        }\n        if (pageView === previousPageView) {\n          break; // The correct page is already visible.\n        }\n        // Switch visible pages, and reset the viewerContainer scroll position.\n        this._shadowViewer.appendChild(previousPageView.div);\n        this.viewer.appendChild(pageView.div);\n\n        this.container.scrollTop = 0;\n        break;\n      default:\n        throw new Error(\n          '_ensurePageViewVisible: Only one page should be visible at a time.');\n    }\n    this._previousPageNumber = this._currentPageNumber;\n  }\n\n  _scrollUpdate() {\n    if (this._updateScrollDown) {\n      this._updateScrollDown();\n    }\n    super._scrollUpdate();\n  }\n\n  _scrollIntoView({ pageDiv, pageSpot = null, pageNumber = null, }) {\n    if (pageNumber) { // Ensure that `this._currentPageNumber` is correct.\n      this._setCurrentPageNumber(pageNumber);\n    }\n    let scrolledDown = this._currentPageNumber >= this._previousPageNumber;\n    let previousLocation = this._location;\n    this._ensurePageViewVisible();\n\n    scrollIntoView(pageDiv, pageSpot);\n\n    // Since scrolling is tracked using `requestAnimationFrame`, update the\n    // scroll direction during the next `this._scrollUpdate` invocation.\n    this._updateScrollDown = () => {\n      this.scroll.down = scrolledDown;\n      delete this._updateScrollDown;\n    };\n    // If the scroll position doesn't change as a result of the `scrollIntoView`\n    // call, ensure that rendering always occurs to avoid showing a blank page.\n    setTimeout(() => {\n      if (this._location === previousLocation) {\n        if (this._updateScrollDown) {\n          this._updateScrollDown();\n        }\n        this.update();\n      }\n    }, 0);\n  }\n\n  _getVisiblePages() {\n    if (!this.pagesCount) {\n      return { views: [], };\n    }\n    let pageView = this._pages[this._currentPageNumber - 1];\n    // NOTE: Compute the `x` and `y` properties of the current view,\n    // since `this._updateLocation` depends of them being available.\n    let element = pageView.div;\n\n    let view = {\n      id: pageView.id,\n      x: element.offsetLeft + element.clientLeft,\n      y: element.offsetTop + element.clientTop,\n      view: pageView,\n    };\n    return { first: view, last: view, views: [view], };\n  }\n\n  update() {\n    let visible = this._getVisiblePages();\n    let visiblePages = visible.views, numVisiblePages = visiblePages.length;\n\n    if (numVisiblePages === 0) {\n      return;\n    }\n    this._resizeBuffer(numVisiblePages);\n\n    this.renderingQueue.renderHighestPriority(visible);\n\n    this._updateLocation(visible.first);\n    this.eventBus.dispatch('updateviewarea', {\n      source: this,\n      location: this._location,\n    });\n  }\n\n  get _isScrollModeHorizontal() {\n    // The Scroll/Spread modes are never used in `PDFSinglePageViewer`.\n    return shadow(this, '_isScrollModeHorizontal', false);\n  }\n\n  _updateScrollMode() { }\n\n  _updateSpreadMode() { }\n}\n\nexport {\n  PDFSinglePageViewer,\n};\n","/* Copyright 2016 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  animationStarted, DEFAULT_SCALE, DEFAULT_SCALE_VALUE, MAX_SCALE,\n  MIN_SCALE, noContextMenuHandler, NullL10n\n} from './ui_utils';\n\nconst PAGE_NUMBER_LOADING_INDICATOR = 'visiblePageIsLoading';\nconst SCALE_SELECT_CONTAINER_PADDING = 8;\nconst SCALE_SELECT_PADDING = 22;\n\n/**\n * @typedef {Object} ToolbarOptions\n * @property {HTMLDivElement} container - Container for the secondary toolbar.\n * @property {HTMLSpanElement} numPages - Label that contains number of pages.\n * @property {HTMLInputElement} pageNumber - Control for display and user input\n *   of the current page number.\n * @property {HTMLSpanElement} scaleSelectContainer - Container where scale\n *   controls are placed. The width is adjusted on UI initialization.\n * @property {HTMLSelectElement} scaleSelect - Scale selection control.\n * @property {HTMLOptionElement} customScaleOption - The item used to display\n *   a non-predefined scale.\n * @property {HTMLButtonElement} previous - Button to go to the previous page.\n * @property {HTMLButtonElement} next - Button to go to the next page.\n * @property {HTMLButtonElement} zoomIn - Button to zoom in the pages.\n * @property {HTMLButtonElement} zoomOut - Button to zoom out the pages.\n * @property {HTMLButtonElement} viewFind - Button to open find bar.\n * @property {HTMLButtonElement} openFile - Button to open a new document.\n * @property {HTMLButtonElement} presentationModeButton - Button to switch to\n *   presentation mode.\n * @property {HTMLButtonElement} download - Button to download the document.\n * @property {HTMLAElement} viewBookmark - Element to link current url of\n *   the page view.\n */\n\nclass Toolbar {\n  /**\n   * @param {ToolbarOptions} options\n   * @param {EventBus} eventBus\n   * @param {IL10n} l10n - Localization service.\n   */\n  constructor(options, eventBus, l10n = NullL10n) {\n    this.toolbar = options.container;\n    this.eventBus = eventBus;\n    this.l10n = l10n;\n    this.items = options;\n\n    this._wasLocalized = false;\n    this.reset();\n\n    // Bind the event listeners for click and hand tool actions.\n    this._bindListeners();\n  }\n\n  setPageNumber(pageNumber, pageLabel) {\n    this.pageNumber = pageNumber;\n    this.pageLabel = pageLabel;\n    this._updateUIState(false);\n  }\n\n  setPagesCount(pagesCount, hasPageLabels) {\n    this.pagesCount = pagesCount;\n    this.hasPageLabels = hasPageLabels;\n    this._updateUIState(true);\n  }\n\n  setPageScale(pageScaleValue, pageScale) {\n    this.pageScaleValue = (pageScaleValue || pageScale).toString();\n    this.pageScale = pageScale;\n    this._updateUIState(false);\n  }\n\n  reset() {\n    this.pageNumber = 0;\n    this.pageLabel = null;\n    this.hasPageLabels = false;\n    this.pagesCount = 0;\n    this.pageScaleValue = DEFAULT_SCALE_VALUE;\n    this.pageScale = DEFAULT_SCALE;\n    this._updateUIState(true);\n  }\n\n  _bindListeners() {\n    let { eventBus, items, } = this;\n    let self = this;\n\n    items.previous.addEventListener('click', function() {\n      eventBus.dispatch('previouspage', { source: self, });\n    });\n\n    items.next.addEventListener('click', function() {\n      eventBus.dispatch('nextpage', { source: self, });\n    });\n\n    items.zoomIn.addEventListener('click', function() {\n      eventBus.dispatch('zoomin', { source: self, });\n    });\n\n    items.zoomOut.addEventListener('click', function() {\n      eventBus.dispatch('zoomout', { source: self, });\n    });\n\n    items.pageNumber.addEventListener('click', function() {\n      this.select();\n    });\n\n    items.pageNumber.addEventListener('change', function() {\n      eventBus.dispatch('pagenumberchanged', {\n        source: self,\n        value: this.value,\n      });\n    });\n\n    items.scaleSelect.addEventListener('change', function() {\n      if (this.value === 'custom') {\n        return;\n      }\n      eventBus.dispatch('scalechanged', {\n        source: self,\n        value: this.value,\n      });\n    });\n\n    items.presentationModeButton.addEventListener('click', function() {\n      eventBus.dispatch('presentationmode', { source: self, });\n    });\n\n    items.openFile.addEventListener('click', function() {\n      eventBus.dispatch('openfile', { source: self, });\n    });\n\n    items.print.addEventListener('click', function() {\n      eventBus.dispatch('print', { source: self, });\n    });\n\n    items.download.addEventListener('click', function() {\n      eventBus.dispatch('download', { source: self, });\n    });\n\n    // Suppress context menus for some controls.\n    items.scaleSelect.oncontextmenu = noContextMenuHandler;\n\n    eventBus.on('localized', () => {\n      this._localized();\n    });\n  }\n\n  _localized() {\n    this._wasLocalized = true;\n    this._adjustScaleWidth();\n    this._updateUIState(true);\n  }\n\n  _updateUIState(resetNumPages = false) {\n    if (!this._wasLocalized) {\n      // Don't update the UI state until we localize the toolbar.\n      return;\n    }\n    const { pageNumber, pagesCount, pageScaleValue, pageScale, items, } = this;\n\n    if (resetNumPages) {\n      if (this.hasPageLabels) {\n        items.pageNumber.type = 'text';\n      } else {\n        items.pageNumber.type = 'number';\n        this.l10n.get('of_pages', { pagesCount, }, 'of {{pagesCount}}').\n            then((msg) => {\n          items.numPages.textContent = msg;\n        });\n      }\n      items.pageNumber.max = pagesCount;\n    }\n\n    if (this.hasPageLabels) {\n      items.pageNumber.value = this.pageLabel;\n      this.l10n.get('page_of_pages', { pageNumber, pagesCount, },\n                    '({{pageNumber}} of {{pagesCount}})').then((msg) => {\n        items.numPages.textContent = msg;\n      });\n    } else {\n      items.pageNumber.value = pageNumber;\n    }\n\n    items.previous.disabled = (pageNumber <= 1);\n    items.next.disabled = (pageNumber >= pagesCount);\n\n    items.zoomOut.disabled = (pageScale <= MIN_SCALE);\n    items.zoomIn.disabled = (pageScale >= MAX_SCALE);\n\n    let customScale = Math.round(pageScale * 10000) / 100;\n    this.l10n.get('page_scale_percent', { scale: customScale, },\n                  '{{scale}}%').then((msg) => {\n      let options = items.scaleSelect.options;\n      let predefinedValueFound = false;\n      for (let i = 0, ii = options.length; i < ii; i++) {\n        let option = options[i];\n        if (option.value !== pageScaleValue) {\n          option.selected = false;\n          continue;\n        }\n        option.selected = true;\n        predefinedValueFound = true;\n      }\n      if (!predefinedValueFound) {\n        items.customScaleOption.textContent = msg;\n        items.customScaleOption.selected = true;\n      }\n    });\n  }\n\n  updateLoadingIndicatorState(loading = false) {\n    let pageNumberInput = this.items.pageNumber;\n\n    pageNumberInput.classList.toggle(PAGE_NUMBER_LOADING_INDICATOR, loading);\n  }\n\n  _adjustScaleWidth() {\n    let container = this.items.scaleSelectContainer;\n    let select = this.items.scaleSelect;\n\n    animationStarted.then(function() {\n      // Adjust the width of the zoom box to fit the content.\n      // Note: If the window is narrow enough that the zoom box is not\n      //       visible, we temporarily show it to be able to adjust its width.\n      if (container.clientWidth === 0) {\n        container.setAttribute('style', 'display: inherit;');\n      }\n      if (container.clientWidth > 0) {\n        select.setAttribute('style', 'min-width: inherit;');\n        let width = select.clientWidth + SCALE_SELECT_CONTAINER_PADDING;\n        select.setAttribute('style', 'min-width: ' +\n                                     (width + SCALE_SELECT_PADDING) + 'px;');\n        container.setAttribute('style', 'min-width: ' + width + 'px; ' +\n                                        'max-width: ' + width + 'px;');\n      }\n    });\n  }\n}\n\nexport {\n  Toolbar,\n};\n","/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst DEFAULT_VIEW_HISTORY_CACHE_SIZE = 20;\n\n/**\n * View History - This is a utility for saving various view parameters for\n *                recently opened files.\n *\n * The way that the view parameters are stored depends on how PDF.js is built,\n * for 'gulp <flag>' the following cases exist:\n *  - FIREFOX or MOZCENTRAL - uses sessionStorage.\n *  - GENERIC or CHROME     - uses localStorage, if it is available.\n */\nclass ViewHistory {\n  constructor(fingerprint, cacheSize = DEFAULT_VIEW_HISTORY_CACHE_SIZE) {\n    this.fingerprint = fingerprint;\n    this.cacheSize = cacheSize;\n\n    this._initializedPromise = this._readFromStorage().then((databaseStr) => {\n      let database = JSON.parse(databaseStr || '{}');\n      if (!('files' in database)) {\n        database.files = [];\n      } else {\n        while (database.files.length >= this.cacheSize) {\n          database.files.shift();\n        }\n      }\n      let index = -1;\n      for (let i = 0, length = database.files.length; i < length; i++) {\n        let branch = database.files[i];\n        if (branch.fingerprint === this.fingerprint) {\n          index = i;\n          break;\n        }\n      }\n      if (index === -1) {\n        index = database.files.push({ fingerprint: this.fingerprint, }) - 1;\n      }\n      this.file = database.files[index];\n      this.database = database;\n    });\n  }\n\n  async _writeToStorage() {\n    let databaseStr = JSON.stringify(this.database);\n\n    if (typeof PDFJSDev !== 'undefined' &&\n        PDFJSDev.test('FIREFOX || MOZCENTRAL')) {\n      sessionStorage.setItem('pdfjs.history', databaseStr);\n      return;\n    }\n    localStorage.setItem('pdfjs.history', databaseStr);\n  }\n\n  async _readFromStorage() {\n    if (typeof PDFJSDev !== 'undefined' &&\n        PDFJSDev.test('FIREFOX || MOZCENTRAL')) {\n      return sessionStorage.getItem('pdfjs.history');\n    }\n    return localStorage.getItem('pdfjs.history');\n  }\n\n  async set(name, val) {\n    await this._initializedPromise;\n    this.file[name] = val;\n    return this._writeToStorage();\n  }\n\n  async setMultiple(properties) {\n    await this._initializedPromise;\n    for (let name in properties) {\n      this.file[name] = properties[name];\n    }\n    return this._writeToStorage();\n  }\n\n  async get(name, defaultValue) {\n    await this._initializedPromise;\n    let val = this.file[name];\n    return val !== undefined ? val : defaultValue;\n  }\n\n  async getMultiple(properties) {\n    await this._initializedPromise;\n    let values = Object.create(null);\n\n    for (let name in properties) {\n      let val = this.file[name];\n      values[name] = val !== undefined ? val : properties[name];\n    }\n    return values;\n  }\n}\n\nexport {\n  ViewHistory,\n};\n","/* Copyright 2017 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DefaultExternalServices, PDFViewerApplication } from './app';\nimport { BasePreferences } from './preferences';\nimport { DownloadManager } from './download_manager';\nimport { GenericL10n } from './genericl10n';\n\nif (typeof PDFJSDev !== 'undefined' && !PDFJSDev.test('GENERIC')) {\n  throw new Error('Module \"pdfjs-web/genericcom\" shall not be used outside ' +\n                  'GENERIC build.');\n}\n\nlet GenericCom = {};\n\nclass GenericPreferences extends BasePreferences {\n  async _writeToStorage(prefObj) {\n    localStorage.setItem('pdfjs.preferences', JSON.stringify(prefObj));\n  }\n\n  async _readFromStorage(prefObj) {\n    return JSON.parse(localStorage.getItem('pdfjs.preferences'));\n  }\n}\n\nlet GenericExternalServices = Object.create(DefaultExternalServices);\nGenericExternalServices.createDownloadManager = function(options) {\n  return new DownloadManager(options);\n};\nGenericExternalServices.createPreferences = function() {\n  return new GenericPreferences();\n};\nGenericExternalServices.createL10n = function({ locale = 'en-US', }) {\n  return new GenericL10n(locale);\n};\nPDFViewerApplication.externalServices = GenericExternalServices;\n\nexport {\n  GenericCom,\n};\n","/* Copyright 2013 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nlet defaultPreferences = null;\nfunction getDefaultPreferences() {\n  if (!defaultPreferences) {\n    if (typeof PDFJSDev !== 'undefined' && PDFJSDev.test('PRODUCTION')) {\n      defaultPreferences = Promise.resolve(\n        PDFJSDev.json('$ROOT/web/default_preferences.json'));\n    } else {\n      defaultPreferences = new Promise(function (resolve) {\n        let xhr = new XMLHttpRequest();\n        xhr.open('GET', 'default_preferences.json');\n        xhr.onload = xhr.onerror = function loaded() {\n          try {\n            resolve(JSON.parse(xhr.responseText));\n          } catch (e) {\n            console.error(`Unable to load default preferences: ${e}`);\n            resolve({});\n          }\n        };\n        xhr.send();\n      });\n    }\n  }\n  return defaultPreferences;\n}\n\n/**\n * BasePreferences - Abstract base class for storing persistent settings.\n *   Used for settings that should be applied to all opened documents,\n *   or every time the viewer is loaded.\n */\nclass BasePreferences {\n  constructor() {\n    if (this.constructor === BasePreferences) {\n      throw new Error('Cannot initialize BasePreferences.');\n    }\n    this.prefs = null;\n\n    this._initializedPromise = getDefaultPreferences().then((defaults) => {\n      Object.defineProperty(this, 'defaults', {\n        value: Object.freeze(defaults),\n        writable: false,\n        enumerable: true,\n        configurable: false,\n      });\n\n      this.prefs = Object.assign(Object.create(null), defaults);\n      return this._readFromStorage(defaults);\n    }).then((prefs) => {\n      if (!prefs) {\n        return;\n      }\n      for (let name in prefs) {\n        const defaultValue = this.defaults[name], prefValue = prefs[name];\n        // Ignore preferences not present in, or whose types don't match,\n        // the default values.\n        if (defaultValue === undefined ||\n            typeof prefValue !== typeof defaultValue) {\n          continue;\n        }\n        this.prefs[name] = prefValue;\n      }\n    });\n  }\n\n  /**\n   * Stub function for writing preferences to storage.\n   * @param {Object} prefObj The preferences that should be written to storage.\n   * @return {Promise} A promise that is resolved when the preference values\n   *                   have been written.\n   */\n  async _writeToStorage(prefObj) {\n    throw new Error('Not implemented: _writeToStorage');\n  }\n\n  /**\n   * Stub function for reading preferences from storage.\n   * @param {Object} prefObj The preferences that should be read from storage.\n   * @return {Promise} A promise that is resolved with an {Object} containing\n   *                   the preferences that have been read.\n   */\n  async _readFromStorage(prefObj) {\n    throw new Error('Not implemented: _readFromStorage');\n  }\n\n  /**\n   * Reset the preferences to their default values and update storage.\n   * @return {Promise} A promise that is resolved when the preference values\n   *                   have been reset.\n   */\n  async reset() {\n    await this._initializedPromise;\n    this.prefs = Object.assign(Object.create(null), this.defaults);\n    return this._writeToStorage(this.defaults);\n  }\n\n  /**\n   * Set the value of a preference.\n   * @param {string} name The name of the preference that should be changed.\n   * @param {boolean|number|string} value The new value of the preference.\n   * @return {Promise} A promise that is resolved when the value has been set,\n   *                   provided that the preference exists and the types match.\n   */\n  async set(name, value) {\n    await this._initializedPromise;\n    let defaultValue = this.defaults[name];\n\n    if (defaultValue === undefined) {\n      throw new Error(`Set preference: \"${name}\" is undefined.`);\n    } else if (value === undefined) {\n      throw new Error('Set preference: no value is specified.');\n    }\n    let valueType = typeof value;\n    let defaultType = typeof defaultValue;\n\n    if (valueType !== defaultType) {\n      if (valueType === 'number' && defaultType === 'string') {\n        value = value.toString();\n      } else {\n        throw new Error(`Set preference: \"${value}\" is a ${valueType}, ` +\n                        `expected a ${defaultType}.`);\n      }\n    } else {\n      if (valueType === 'number' && !Number.isInteger(value)) {\n        throw new Error(`Set preference: \"${value}\" must be an integer.`);\n      }\n    }\n    this.prefs[name] = value;\n    return this._writeToStorage(this.prefs);\n  }\n\n  /**\n   * Get the value of a preference.\n   * @param {string} name The name of the preference whose value is requested.\n   * @return {Promise} A promise that is resolved with a {boolean|number|string}\n   *                   containing the value of the preference.\n   */\n  async get(name) {\n    await this._initializedPromise;\n    let defaultValue = this.defaults[name];\n\n    if (defaultValue === undefined) {\n      throw new Error(`Get preference: \"${name}\" is undefined.`);\n    } else {\n      let prefValue = this.prefs[name];\n\n      if (prefValue !== undefined) {\n        return prefValue;\n      }\n    }\n    return defaultValue;\n  }\n\n  /**\n   * Get the values of all preferences.\n   * @return {Promise} A promise that is resolved with an {Object} containing\n   *                   the values of all preferences.\n   */\n  async getAll() {\n    await this._initializedPromise;\n    return Object.assign(Object.create(null), this.defaults, this.prefs);\n  }\n}\n\nexport {\n  BasePreferences,\n};\n","/* Copyright 2013 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  apiCompatibilityParams, createObjectURL, createValidAbsoluteUrl, URL\n} from 'pdfjs-lib';\n\nif (typeof PDFJSDev !== 'undefined' && !PDFJSDev.test('CHROME || GENERIC')) {\n  throw new Error('Module \"pdfjs-web/download_manager\" shall not be used ' +\n                  'outside CHROME and GENERIC builds.');\n}\n\nconst DISABLE_CREATE_OBJECT_URL =\n  apiCompatibilityParams.disableCreateObjectURL || false;\n\nfunction download(blobUrl, filename) {\n  let a = document.createElement('a');\n  if (!a.click) {\n    throw new Error('DownloadManager: \"a.click()\" is not supported.');\n  }\n  a.href = blobUrl;\n  a.target = '_parent';\n  // Use a.download if available. This increases the likelihood that\n  // the file is downloaded instead of opened by another PDF plugin.\n  if ('download' in a) {\n    a.download = filename;\n  }\n  // <a> must be in the document for IE and recent Firefox versions,\n  // otherwise .click() is ignored.\n  (document.body || document.documentElement).appendChild(a);\n  a.click();\n  a.remove();\n}\n\nclass DownloadManager {\n  constructor({ disableCreateObjectURL = DISABLE_CREATE_OBJECT_URL, }) {\n    this.disableCreateObjectURL = disableCreateObjectURL;\n  }\n\n  downloadUrl(url, filename) {\n    if (!createValidAbsoluteUrl(url, 'http://example.com')) {\n      return; // restricted/invalid URL\n    }\n    download(url + '#pdfjs.action=download', filename);\n  }\n\n  downloadData(data, filename, contentType) {\n    if (navigator.msSaveBlob) { // IE10 and above\n      return navigator.msSaveBlob(new Blob([data], { type: contentType, }),\n                                  filename);\n    }\n    let blobUrl = createObjectURL(data, contentType,\n                                  this.disableCreateObjectURL);\n    download(blobUrl, filename);\n  }\n\n  download(blob, url, filename) {\n    if (navigator.msSaveBlob) {\n      // IE10 / IE11\n      if (!navigator.msSaveBlob(blob, filename)) {\n        this.downloadUrl(url, filename);\n      }\n      return;\n    }\n\n    if (this.disableCreateObjectURL) {\n      // URL.createObjectURL is not supported\n      this.downloadUrl(url, filename);\n      return;\n    }\n\n    let blobUrl = URL.createObjectURL(blob);\n    download(blobUrl, filename);\n  }\n}\n\nexport {\n  DownloadManager,\n};\n","/* Copyright 2017 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport '../external/webL10n/l10n';\n\nlet webL10n = document.webL10n;\n\nclass GenericL10n {\n  constructor(lang) {\n    this._lang = lang;\n    this._ready = new Promise((resolve, reject) => {\n      webL10n.setLanguage(lang, () => {\n        resolve(webL10n);\n      });\n    });\n  }\n\n  async getLanguage() {\n    const l10n = await this._ready;\n    return l10n.getLanguage();\n  }\n\n  async getDirection() {\n    const l10n = await this._ready;\n    return l10n.getDirection();\n  }\n\n  async get(property, args, fallback) {\n    const l10n = await this._ready;\n    return l10n.get(property, args, fallback);\n  }\n\n  async translate(element) {\n    const l10n = await this._ready;\n    return l10n.translate(element);\n  }\n}\n\nexport {\n  GenericL10n,\n};\n","/**\n * Copyright (c) 2011-2013 Fabien Cazenave, Mozilla.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n/*\n  Additional modifications for PDF.js project:\n    - Disables language initialization on page loading.\n    - Disables document translation on page loading.\n    - Removes consoleWarn and consoleLog and use console.log/warn directly.\n    - Removes window._ assignment.\n    - Remove compatibility code for OldIE.\n*/\n\n/*jshint browser: true, devel: true, es5: true, globalstrict: true */\n'use strict';\n\ndocument.webL10n = (function(window, document, undefined) {\n  var gL10nData = {};\n  var gTextData = '';\n  var gTextProp = 'textContent';\n  var gLanguage = '';\n  var gMacros = {};\n  var gReadyState = 'loading';\n\n\n  /**\n   * Synchronously loading l10n resources significantly minimizes flickering\n   * from displaying the app with non-localized strings and then updating the\n   * strings. Although this will block all script execution on this page, we\n   * expect that the l10n resources are available locally on flash-storage.\n   *\n   * As synchronous XHR is generally considered as a bad idea, we're still\n   * loading l10n resources asynchronously -- but we keep this in a setting,\n   * just in case... and applications using this library should hide their\n   * content until the `localized' event happens.\n   */\n\n  var gAsyncResourceLoading = true; // read-only\n\n\n  /**\n   * DOM helpers for the so-called \"HTML API\".\n   *\n   * These functions are written for modern browsers. For old versions of IE,\n   * they're overridden in the 'startup' section at the end of this file.\n   */\n\n  function getL10nResourceLinks() {\n    return document.querySelectorAll('link[type=\"application/l10n\"]');\n  }\n\n  function getL10nDictionary() {\n    var script = document.querySelector('script[type=\"application/l10n\"]');\n    // TODO: support multiple and external JSON dictionaries\n    return script ? JSON.parse(script.innerHTML) : null;\n  }\n\n  function getTranslatableChildren(element) {\n    return element ? element.querySelectorAll('*[data-l10n-id]') : [];\n  }\n\n  function getL10nAttributes(element) {\n    if (!element)\n      return {};\n\n    var l10nId = element.getAttribute('data-l10n-id');\n    var l10nArgs = element.getAttribute('data-l10n-args');\n    var args = {};\n    if (l10nArgs) {\n      try {\n        args = JSON.parse(l10nArgs);\n      } catch (e) {\n        console.warn('could not parse arguments for #' + l10nId);\n      }\n    }\n    return { id: l10nId, args: args };\n  }\n\n  function fireL10nReadyEvent(lang) {\n    var evtObject = document.createEvent('Event');\n    evtObject.initEvent('localized', true, false);\n    evtObject.language = lang;\n    document.dispatchEvent(evtObject);\n  }\n\n  function xhrLoadText(url, onSuccess, onFailure) {\n    onSuccess = onSuccess || function _onSuccess(data) {};\n    onFailure = onFailure || function _onFailure() {};\n\n    var xhr = new XMLHttpRequest();\n    xhr.open('GET', url, gAsyncResourceLoading);\n    if (xhr.overrideMimeType) {\n      xhr.overrideMimeType('text/plain; charset=utf-8');\n    }\n    xhr.onreadystatechange = function() {\n      if (xhr.readyState == 4) {\n        if (xhr.status == 200 || xhr.status === 0) {\n          onSuccess(xhr.responseText);\n        } else {\n          onFailure();\n        }\n      }\n    };\n    xhr.onerror = onFailure;\n    xhr.ontimeout = onFailure;\n\n    // in Firefox OS with the app:// protocol, trying to XHR a non-existing\n    // URL will raise an exception here -- hence this ugly try...catch.\n    try {\n      xhr.send(null);\n    } catch (e) {\n      onFailure();\n    }\n  }\n\n\n  /**\n   * l10n resource parser:\n   *  - reads (async XHR) the l10n resource matching `lang';\n   *  - imports linked resources (synchronously) when specified;\n   *  - parses the text data (fills `gL10nData' and `gTextData');\n   *  - triggers success/failure callbacks when done.\n   *\n   * @param {string} href\n   *    URL of the l10n resource to parse.\n   *\n   * @param {string} lang\n   *    locale (language) to parse. Must be a lowercase string.\n   *\n   * @param {Function} successCallback\n   *    triggered when the l10n resource has been successfully parsed.\n   *\n   * @param {Function} failureCallback\n   *    triggered when the an error has occurred.\n   *\n   * @return {void}\n   *    uses the following global variables: gL10nData, gTextData, gTextProp.\n   */\n\n  function parseResource(href, lang, successCallback, failureCallback) {\n    var baseURL = href.replace(/[^\\/]*$/, '') || './';\n\n    // handle escaped characters (backslashes) in a string\n    function evalString(text) {\n      if (text.lastIndexOf('\\\\') < 0)\n        return text;\n      return text.replace(/\\\\\\\\/g, '\\\\')\n                 .replace(/\\\\n/g, '\\n')\n                 .replace(/\\\\r/g, '\\r')\n                 .replace(/\\\\t/g, '\\t')\n                 .replace(/\\\\b/g, '\\b')\n                 .replace(/\\\\f/g, '\\f')\n                 .replace(/\\\\{/g, '{')\n                 .replace(/\\\\}/g, '}')\n                 .replace(/\\\\\"/g, '\"')\n                 .replace(/\\\\'/g, \"'\");\n    }\n\n    // parse *.properties text data into an l10n dictionary\n    // If gAsyncResourceLoading is false, then the callback will be called\n    // synchronously. Otherwise it is called asynchronously.\n    function parseProperties(text, parsedPropertiesCallback) {\n      var dictionary = {};\n\n      // token expressions\n      var reBlank = /^\\s*|\\s*$/;\n      var reComment = /^\\s*#|^\\s*$/;\n      var reSection = /^\\s*\\[(.*)\\]\\s*$/;\n      var reImport = /^\\s*@import\\s+url\\((.*)\\)\\s*$/i;\n      var reSplit = /^([^=\\s]*)\\s*=\\s*(.+)$/; // TODO: escape EOLs with '\\'\n\n      // parse the *.properties file into an associative array\n      function parseRawLines(rawText, extendedSyntax, parsedRawLinesCallback) {\n        var entries = rawText.replace(reBlank, '').split(/[\\r\\n]+/);\n        var currentLang = '*';\n        var genericLang = lang.split('-', 1)[0];\n        var skipLang = false;\n        var match = '';\n\n        function nextEntry() {\n          // Use infinite loop instead of recursion to avoid reaching the\n          // maximum recursion limit for content with many lines.\n          while (true) {\n            if (!entries.length) {\n              parsedRawLinesCallback();\n              return;\n            }\n            var line = entries.shift();\n\n            // comment or blank line?\n            if (reComment.test(line))\n              continue;\n\n            // the extended syntax supports [lang] sections and @import rules\n            if (extendedSyntax) {\n              match = reSection.exec(line);\n              if (match) { // section start?\n                // RFC 4646, section 4.4, \"All comparisons MUST be performed\n                // in a case-insensitive manner.\"\n\n                currentLang = match[1].toLowerCase();\n                skipLang = (currentLang !== '*') &&\n                    (currentLang !== lang) && (currentLang !== genericLang);\n                continue;\n              } else if (skipLang) {\n                continue;\n              }\n              match = reImport.exec(line);\n              if (match) { // @import rule?\n                loadImport(baseURL + match[1], nextEntry);\n                return;\n              }\n            }\n\n            // key-value pair\n            var tmp = line.match(reSplit);\n            if (tmp && tmp.length == 3) {\n              dictionary[tmp[1]] = evalString(tmp[2]);\n            }\n          }\n        }\n        nextEntry();\n      }\n\n      // import another *.properties file\n      function loadImport(url, callback) {\n        xhrLoadText(url, function(content) {\n          parseRawLines(content, false, callback); // don't allow recursive imports\n        }, function () {\n          console.warn(url + ' not found.');\n          callback();\n        });\n      }\n\n      // fill the dictionary\n      parseRawLines(text, true, function() {\n        parsedPropertiesCallback(dictionary);\n      });\n    }\n\n    // load and parse l10n data (warning: global variables are used here)\n    xhrLoadText(href, function(response) {\n      gTextData += response; // mostly for debug\n\n      // parse *.properties text data into an l10n dictionary\n      parseProperties(response, function(data) {\n\n        // find attribute descriptions, if any\n        for (var key in data) {\n          var id, prop, index = key.lastIndexOf('.');\n          if (index > 0) { // an attribute has been specified\n            id = key.substring(0, index);\n            prop = key.substring(index + 1);\n          } else { // no attribute: assuming text content by default\n            id = key;\n            prop = gTextProp;\n          }\n          if (!gL10nData[id]) {\n            gL10nData[id] = {};\n          }\n          gL10nData[id][prop] = data[key];\n        }\n\n        // trigger callback\n        if (successCallback) {\n          successCallback();\n        }\n      });\n    }, failureCallback);\n  }\n\n  // load and parse all resources for the specified locale\n  function loadLocale(lang, callback) {\n    // RFC 4646, section 2.1 states that language tags have to be treated as\n    // case-insensitive. Convert to lowercase for case-insensitive comparisons.\n    if (lang) {\n      lang = lang.toLowerCase();\n    }\n\n    callback = callback || function _callback() {};\n\n    clear();\n    gLanguage = lang;\n\n    // check all <link type=\"application/l10n\" href=\"...\" /> nodes\n    // and load the resource files\n    var langLinks = getL10nResourceLinks();\n    var langCount = langLinks.length;\n    if (langCount === 0) {\n      // we might have a pre-compiled dictionary instead\n      var dict = getL10nDictionary();\n      if (dict && dict.locales && dict.default_locale) {\n        console.log('using the embedded JSON directory, early way out');\n        gL10nData = dict.locales[lang];\n        if (!gL10nData) {\n          var defaultLocale = dict.default_locale.toLowerCase();\n          for (var anyCaseLang in dict.locales) {\n            anyCaseLang = anyCaseLang.toLowerCase();\n            if (anyCaseLang === lang) {\n              gL10nData = dict.locales[lang];\n              break;\n            } else if (anyCaseLang === defaultLocale) {\n              gL10nData = dict.locales[defaultLocale];\n            }\n          }\n        }\n        callback();\n      } else {\n        console.log('no resource to load, early way out');\n      }\n      // early way out\n      fireL10nReadyEvent(lang);\n      gReadyState = 'complete';\n      return;\n    }\n\n    // start the callback when all resources are loaded\n    var onResourceLoaded = null;\n    var gResourceCount = 0;\n    onResourceLoaded = function() {\n      gResourceCount++;\n      if (gResourceCount >= langCount) {\n        callback();\n        fireL10nReadyEvent(lang);\n        gReadyState = 'complete';\n      }\n    };\n\n    // load all resource files\n    function L10nResourceLink(link) {\n      var href = link.href;\n      // Note: If |gAsyncResourceLoading| is false, then the following callbacks\n      // are synchronously called.\n      this.load = function(lang, callback) {\n        parseResource(href, lang, callback, function() {\n          console.warn(href + ' not found.');\n          // lang not found, used default resource instead\n          console.warn('\"' + lang + '\" resource not found');\n          gLanguage = '';\n          // Resource not loaded, but we still need to call the callback.\n          callback();\n        });\n      };\n    }\n\n    for (var i = 0; i < langCount; i++) {\n      var resource = new L10nResourceLink(langLinks[i]);\n      resource.load(lang, onResourceLoaded);\n    }\n  }\n\n  // clear all l10n data\n  function clear() {\n    gL10nData = {};\n    gTextData = '';\n    gLanguage = '';\n    // TODO: clear all non predefined macros.\n    // There's no such macro /yet/ but we're planning to have some...\n  }\n\n\n  /**\n   * Get rules for plural forms (shared with JetPack), see:\n   * http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html\n   * https://github.com/mozilla/addon-sdk/blob/master/python-lib/plural-rules-generator.p\n   *\n   * @param {string} lang\n   *    locale (language) used.\n   *\n   * @return {Function}\n   *    returns a function that gives the plural form name for a given integer:\n   *       var fun = getPluralRules('en');\n   *       fun(1)    -> 'one'\n   *       fun(0)    -> 'other'\n   *       fun(1000) -> 'other'.\n   */\n\n  function getPluralRules(lang) {\n    var locales2rules = {\n      'af': 3,\n      'ak': 4,\n      'am': 4,\n      'ar': 1,\n      'asa': 3,\n      'az': 0,\n      'be': 11,\n      'bem': 3,\n      'bez': 3,\n      'bg': 3,\n      'bh': 4,\n      'bm': 0,\n      'bn': 3,\n      'bo': 0,\n      'br': 20,\n      'brx': 3,\n      'bs': 11,\n      'ca': 3,\n      'cgg': 3,\n      'chr': 3,\n      'cs': 12,\n      'cy': 17,\n      'da': 3,\n      'de': 3,\n      'dv': 3,\n      'dz': 0,\n      'ee': 3,\n      'el': 3,\n      'en': 3,\n      'eo': 3,\n      'es': 3,\n      'et': 3,\n      'eu': 3,\n      'fa': 0,\n      'ff': 5,\n      'fi': 3,\n      'fil': 4,\n      'fo': 3,\n      'fr': 5,\n      'fur': 3,\n      'fy': 3,\n      'ga': 8,\n      'gd': 24,\n      'gl': 3,\n      'gsw': 3,\n      'gu': 3,\n      'guw': 4,\n      'gv': 23,\n      'ha': 3,\n      'haw': 3,\n      'he': 2,\n      'hi': 4,\n      'hr': 11,\n      'hu': 0,\n      'id': 0,\n      'ig': 0,\n      'ii': 0,\n      'is': 3,\n      'it': 3,\n      'iu': 7,\n      'ja': 0,\n      'jmc': 3,\n      'jv': 0,\n      'ka': 0,\n      'kab': 5,\n      'kaj': 3,\n      'kcg': 3,\n      'kde': 0,\n      'kea': 0,\n      'kk': 3,\n      'kl': 3,\n      'km': 0,\n      'kn': 0,\n      'ko': 0,\n      'ksb': 3,\n      'ksh': 21,\n      'ku': 3,\n      'kw': 7,\n      'lag': 18,\n      'lb': 3,\n      'lg': 3,\n      'ln': 4,\n      'lo': 0,\n      'lt': 10,\n      'lv': 6,\n      'mas': 3,\n      'mg': 4,\n      'mk': 16,\n      'ml': 3,\n      'mn': 3,\n      'mo': 9,\n      'mr': 3,\n      'ms': 0,\n      'mt': 15,\n      'my': 0,\n      'nah': 3,\n      'naq': 7,\n      'nb': 3,\n      'nd': 3,\n      'ne': 3,\n      'nl': 3,\n      'nn': 3,\n      'no': 3,\n      'nr': 3,\n      'nso': 4,\n      'ny': 3,\n      'nyn': 3,\n      'om': 3,\n      'or': 3,\n      'pa': 3,\n      'pap': 3,\n      'pl': 13,\n      'ps': 3,\n      'pt': 3,\n      'rm': 3,\n      'ro': 9,\n      'rof': 3,\n      'ru': 11,\n      'rwk': 3,\n      'sah': 0,\n      'saq': 3,\n      'se': 7,\n      'seh': 3,\n      'ses': 0,\n      'sg': 0,\n      'sh': 11,\n      'shi': 19,\n      'sk': 12,\n      'sl': 14,\n      'sma': 7,\n      'smi': 7,\n      'smj': 7,\n      'smn': 7,\n      'sms': 7,\n      'sn': 3,\n      'so': 3,\n      'sq': 3,\n      'sr': 11,\n      'ss': 3,\n      'ssy': 3,\n      'st': 3,\n      'sv': 3,\n      'sw': 3,\n      'syr': 3,\n      'ta': 3,\n      'te': 3,\n      'teo': 3,\n      'th': 0,\n      'ti': 4,\n      'tig': 3,\n      'tk': 3,\n      'tl': 4,\n      'tn': 3,\n      'to': 0,\n      'tr': 0,\n      'ts': 3,\n      'tzm': 22,\n      'uk': 11,\n      'ur': 3,\n      've': 3,\n      'vi': 0,\n      'vun': 3,\n      'wa': 4,\n      'wae': 3,\n      'wo': 0,\n      'xh': 3,\n      'xog': 3,\n      'yo': 0,\n      'zh': 0,\n      'zu': 3\n    };\n\n    // utility functions for plural rules methods\n    function isIn(n, list) {\n      return list.indexOf(n) !== -1;\n    }\n    function isBetween(n, start, end) {\n      return start <= n && n <= end;\n    }\n\n    // list of all plural rules methods:\n    // map an integer to the plural form name to use\n    var pluralRules = {\n      '0': function(n) {\n        return 'other';\n      },\n      '1': function(n) {\n        if ((isBetween((n % 100), 3, 10)))\n          return 'few';\n        if (n === 0)\n          return 'zero';\n        if ((isBetween((n % 100), 11, 99)))\n          return 'many';\n        if (n == 2)\n          return 'two';\n        if (n == 1)\n          return 'one';\n        return 'other';\n      },\n      '2': function(n) {\n        if (n !== 0 && (n % 10) === 0)\n          return 'many';\n        if (n == 2)\n          return 'two';\n        if (n == 1)\n          return 'one';\n        return 'other';\n      },\n      '3': function(n) {\n        if (n == 1)\n          return 'one';\n        return 'other';\n      },\n      '4': function(n) {\n        if ((isBetween(n, 0, 1)))\n          return 'one';\n        return 'other';\n      },\n      '5': function(n) {\n        if ((isBetween(n, 0, 2)) && n != 2)\n          return 'one';\n        return 'other';\n      },\n      '6': function(n) {\n        if (n === 0)\n          return 'zero';\n        if ((n % 10) == 1 && (n % 100) != 11)\n          return 'one';\n        return 'other';\n      },\n      '7': function(n) {\n        if (n == 2)\n          return 'two';\n        if (n == 1)\n          return 'one';\n        return 'other';\n      },\n      '8': function(n) {\n        if ((isBetween(n, 3, 6)))\n          return 'few';\n        if ((isBetween(n, 7, 10)))\n          return 'many';\n        if (n == 2)\n          return 'two';\n        if (n == 1)\n          return 'one';\n        return 'other';\n      },\n      '9': function(n) {\n        if (n === 0 || n != 1 && (isBetween((n % 100), 1, 19)))\n          return 'few';\n        if (n == 1)\n          return 'one';\n        return 'other';\n      },\n      '10': function(n) {\n        if ((isBetween((n % 10), 2, 9)) && !(isBetween((n % 100), 11, 19)))\n          return 'few';\n        if ((n % 10) == 1 && !(isBetween((n % 100), 11, 19)))\n          return 'one';\n        return 'other';\n      },\n      '11': function(n) {\n        if ((isBetween((n % 10), 2, 4)) && !(isBetween((n % 100), 12, 14)))\n          return 'few';\n        if ((n % 10) === 0 ||\n            (isBetween((n % 10), 5, 9)) ||\n            (isBetween((n % 100), 11, 14)))\n          return 'many';\n        if ((n % 10) == 1 && (n % 100) != 11)\n          return 'one';\n        return 'other';\n      },\n      '12': function(n) {\n        if ((isBetween(n, 2, 4)))\n          return 'few';\n        if (n == 1)\n          return 'one';\n        return 'other';\n      },\n      '13': function(n) {\n        if ((isBetween((n % 10), 2, 4)) && !(isBetween((n % 100), 12, 14)))\n          return 'few';\n        if (n != 1 && (isBetween((n % 10), 0, 1)) ||\n            (isBetween((n % 10), 5, 9)) ||\n            (isBetween((n % 100), 12, 14)))\n          return 'many';\n        if (n == 1)\n          return 'one';\n        return 'other';\n      },\n      '14': function(n) {\n        if ((isBetween((n % 100), 3, 4)))\n          return 'few';\n        if ((n % 100) == 2)\n          return 'two';\n        if ((n % 100) == 1)\n          return 'one';\n        return 'other';\n      },\n      '15': function(n) {\n        if (n === 0 || (isBetween((n % 100), 2, 10)))\n          return 'few';\n        if ((isBetween((n % 100), 11, 19)))\n          return 'many';\n        if (n == 1)\n          return 'one';\n        return 'other';\n      },\n      '16': function(n) {\n        if ((n % 10) == 1 && n != 11)\n          return 'one';\n        return 'other';\n      },\n      '17': function(n) {\n        if (n == 3)\n          return 'few';\n        if (n === 0)\n          return 'zero';\n        if (n == 6)\n          return 'many';\n        if (n == 2)\n          return 'two';\n        if (n == 1)\n          return 'one';\n        return 'other';\n      },\n      '18': function(n) {\n        if (n === 0)\n          return 'zero';\n        if ((isBetween(n, 0, 2)) && n !== 0 && n != 2)\n          return 'one';\n        return 'other';\n      },\n      '19': function(n) {\n        if ((isBetween(n, 2, 10)))\n          return 'few';\n        if ((isBetween(n, 0, 1)))\n          return 'one';\n        return 'other';\n      },\n      '20': function(n) {\n        if ((isBetween((n % 10), 3, 4) || ((n % 10) == 9)) && !(\n            isBetween((n % 100), 10, 19) ||\n            isBetween((n % 100), 70, 79) ||\n            isBetween((n % 100), 90, 99)\n            ))\n          return 'few';\n        if ((n % 1000000) === 0 && n !== 0)\n          return 'many';\n        if ((n % 10) == 2 && !isIn((n % 100), [12, 72, 92]))\n          return 'two';\n        if ((n % 10) == 1 && !isIn((n % 100), [11, 71, 91]))\n          return 'one';\n        return 'other';\n      },\n      '21': function(n) {\n        if (n === 0)\n          return 'zero';\n        if (n == 1)\n          return 'one';\n        return 'other';\n      },\n      '22': function(n) {\n        if ((isBetween(n, 0, 1)) || (isBetween(n, 11, 99)))\n          return 'one';\n        return 'other';\n      },\n      '23': function(n) {\n        if ((isBetween((n % 10), 1, 2)) || (n % 20) === 0)\n          return 'one';\n        return 'other';\n      },\n      '24': function(n) {\n        if ((isBetween(n, 3, 10) || isBetween(n, 13, 19)))\n          return 'few';\n        if (isIn(n, [2, 12]))\n          return 'two';\n        if (isIn(n, [1, 11]))\n          return 'one';\n        return 'other';\n      }\n    };\n\n    // return a function that gives the plural form name for a given integer\n    var index = locales2rules[lang.replace(/-.*$/, '')];\n    if (!(index in pluralRules)) {\n      console.warn('plural form unknown for [' + lang + ']');\n      return function() { return 'other'; };\n    }\n    return pluralRules[index];\n  }\n\n  // pre-defined 'plural' macro\n  gMacros.plural = function(str, param, key, prop) {\n    var n = parseFloat(param);\n    if (isNaN(n))\n      return str;\n\n    // TODO: support other properties (l20n still doesn't...)\n    if (prop != gTextProp)\n      return str;\n\n    // initialize _pluralRules\n    if (!gMacros._pluralRules) {\n      gMacros._pluralRules = getPluralRules(gLanguage);\n    }\n    var index = '[' + gMacros._pluralRules(n) + ']';\n\n    // try to find a [zero|one|two] key if it's defined\n    if (n === 0 && (key + '[zero]') in gL10nData) {\n      str = gL10nData[key + '[zero]'][prop];\n    } else if (n == 1 && (key + '[one]') in gL10nData) {\n      str = gL10nData[key + '[one]'][prop];\n    } else if (n == 2 && (key + '[two]') in gL10nData) {\n      str = gL10nData[key + '[two]'][prop];\n    } else if ((key + index) in gL10nData) {\n      str = gL10nData[key + index][prop];\n    } else if ((key + '[other]') in gL10nData) {\n      str = gL10nData[key + '[other]'][prop];\n    }\n\n    return str;\n  };\n\n\n  /**\n   * l10n dictionary functions\n   */\n\n  // fetch an l10n object, warn if not found, apply `args' if possible\n  function getL10nData(key, args, fallback) {\n    var data = gL10nData[key];\n    if (!data) {\n      console.warn('#' + key + ' is undefined.');\n      if (!fallback) {\n        return null;\n      }\n      data = fallback;\n    }\n\n    /** This is where l10n expressions should be processed.\n      * The plan is to support C-style expressions from the l20n project;\n      * until then, only two kinds of simple expressions are supported:\n      *   {[ index ]} and {{ arguments }}.\n      */\n    var rv = {};\n    for (var prop in data) {\n      var str = data[prop];\n      str = substIndexes(str, args, key, prop);\n      str = substArguments(str, args, key);\n      rv[prop] = str;\n    }\n    return rv;\n  }\n\n  // replace {[macros]} with their values\n  function substIndexes(str, args, key, prop) {\n    var reIndex = /\\{\\[\\s*([a-zA-Z]+)\\(([a-zA-Z]+)\\)\\s*\\]\\}/;\n    var reMatch = reIndex.exec(str);\n    if (!reMatch || !reMatch.length)\n      return str;\n\n    // an index/macro has been found\n    // Note: at the moment, only one parameter is supported\n    var macroName = reMatch[1];\n    var paramName = reMatch[2];\n    var param;\n    if (args && paramName in args) {\n      param = args[paramName];\n    } else if (paramName in gL10nData) {\n      param = gL10nData[paramName];\n    }\n\n    // there's no macro parser yet: it has to be defined in gMacros\n    if (macroName in gMacros) {\n      var macro = gMacros[macroName];\n      str = macro(str, param, key, prop);\n    }\n    return str;\n  }\n\n  // replace {{arguments}} with their values\n  function substArguments(str, args, key) {\n    var reArgs = /\\{\\{\\s*(.+?)\\s*\\}\\}/g;\n    return str.replace(reArgs, function(matched_text, arg) {\n      if (args && arg in args) {\n        return args[arg];\n      }\n      if (arg in gL10nData) {\n        return gL10nData[arg];\n      }\n      console.log('argument {{' + arg + '}} for #' + key + ' is undefined.');\n      return matched_text;\n    });\n  }\n\n  // translate an HTML element\n  function translateElement(element) {\n    var l10n = getL10nAttributes(element);\n    if (!l10n.id)\n      return;\n\n    // get the related l10n object\n    var data = getL10nData(l10n.id, l10n.args);\n    if (!data) {\n      console.warn('#' + l10n.id + ' is undefined.');\n      return;\n    }\n\n    // translate element (TODO: security checks?)\n    if (data[gTextProp]) { // XXX\n      if (getChildElementCount(element) === 0) {\n        element[gTextProp] = data[gTextProp];\n      } else {\n        // this element has element children: replace the content of the first\n        // (non-empty) child textNode and clear other child textNodes\n        var children = element.childNodes;\n        var found = false;\n        for (var i = 0, l = children.length; i < l; i++) {\n          if (children[i].nodeType === 3 && /\\S/.test(children[i].nodeValue)) {\n            if (found) {\n              children[i].nodeValue = '';\n            } else {\n              children[i].nodeValue = data[gTextProp];\n              found = true;\n            }\n          }\n        }\n        // if no (non-empty) textNode is found, insert a textNode before the\n        // first element child.\n        if (!found) {\n          var textNode = document.createTextNode(data[gTextProp]);\n          element.insertBefore(textNode, element.firstChild);\n        }\n      }\n      delete data[gTextProp];\n    }\n\n    for (var k in data) {\n      element[k] = data[k];\n    }\n  }\n\n  // webkit browsers don't currently support 'children' on SVG elements...\n  function getChildElementCount(element) {\n    if (element.children) {\n      return element.children.length;\n    }\n    if (typeof element.childElementCount !== 'undefined') {\n      return element.childElementCount;\n    }\n    var count = 0;\n    for (var i = 0; i < element.childNodes.length; i++) {\n      count += element.nodeType === 1 ? 1 : 0;\n    }\n    return count;\n  }\n\n  // translate an HTML subtree\n  function translateFragment(element) {\n    element = element || document.documentElement;\n\n    // check all translatable children (= w/ a `data-l10n-id' attribute)\n    var children = getTranslatableChildren(element);\n    var elementCount = children.length;\n    for (var i = 0; i < elementCount; i++) {\n      translateElement(children[i]);\n    }\n\n    // translate element itself if necessary\n    translateElement(element);\n  }\n\n  return {\n    // get a localized string\n    get: function(key, args, fallbackString) {\n      var index = key.lastIndexOf('.');\n      var prop = gTextProp;\n      if (index > 0) { // An attribute has been specified\n        prop = key.substring(index + 1);\n        key = key.substring(0, index);\n      }\n      var fallback;\n      if (fallbackString) {\n        fallback = {};\n        fallback[prop] = fallbackString;\n      }\n      var data = getL10nData(key, args, fallback);\n      if (data && prop in data) {\n        return data[prop];\n      }\n      return '{{' + key + '}}';\n    },\n\n    // debug\n    getData: function() { return gL10nData; },\n    getText: function() { return gTextData; },\n\n    // get|set the document language\n    getLanguage: function() { return gLanguage; },\n    setLanguage: function(lang, callback) {\n      loadLocale(lang, function() {\n        if (callback)\n          callback();\n      });\n    },\n\n    // get the direction (ltr|rtl) of the current language\n    getDirection: function() {\n      // http://www.w3.org/International/questions/qa-scripts\n      // Arabic, Hebrew, Farsi, Pashto, Urdu\n      var rtlList = ['ar', 'he', 'fa', 'ps', 'ur'];\n      var shortCode = gLanguage.split('-', 1)[0];\n      return (rtlList.indexOf(shortCode) >= 0) ? 'rtl' : 'ltr';\n    },\n\n    // translate an element or document fragment\n    translate: translateFragment,\n\n    // this can be used to prevent race conditions\n    getReadyState: function() { return gReadyState; },\n    ready: function(callback) {\n      if (!callback) {\n        return;\n      } else if (gReadyState == 'complete' || gReadyState == 'interactive') {\n        window.setTimeout(function() {\n          callback();\n        });\n      } else if (document.addEventListener) {\n        document.addEventListener('localized', function once() {\n          document.removeEventListener('localized', once);\n          callback();\n        });\n      }\n    }\n  };\n}) (window, document);\n","/* Copyright 2016 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { CSS_UNITS, NullL10n } from './ui_utils';\nimport { PDFPrintServiceFactory, PDFViewerApplication } from './app';\nimport { URL } from 'pdfjs-lib';\n\nlet activeService = null;\nlet overlayManager = null;\n\n// Renders the page to the canvas of the given print service, and returns\n// the suggested dimensions of the output page.\nfunction renderPage(activeServiceOnEntry, pdfDocument, pageNumber, size) {\n  let scratchCanvas = activeService.scratchCanvas;\n\n  // The size of the canvas in pixels for printing.\n  const PRINT_RESOLUTION = 150;\n  const PRINT_UNITS = PRINT_RESOLUTION / 72.0;\n  scratchCanvas.width = Math.floor(size.width * PRINT_UNITS);\n  scratchCanvas.height = Math.floor(size.height * PRINT_UNITS);\n\n  // The physical size of the img as specified by the PDF document.\n  let width = Math.floor(size.width * CSS_UNITS) + 'px';\n  let height = Math.floor(size.height * CSS_UNITS) + 'px';\n\n  let ctx = scratchCanvas.getContext('2d');\n  ctx.save();\n  ctx.fillStyle = 'rgb(255, 255, 255)';\n  ctx.fillRect(0, 0, scratchCanvas.width, scratchCanvas.height);\n  ctx.restore();\n\n  return pdfDocument.getPage(pageNumber).then(function(pdfPage) {\n    let renderContext = {\n      canvasContext: ctx,\n      transform: [PRINT_UNITS, 0, 0, PRINT_UNITS, 0, 0],\n      viewport: pdfPage.getViewport(1, size.rotation),\n      intent: 'print',\n    };\n    return pdfPage.render(renderContext).promise;\n  }).then(function() {\n    return {\n      width,\n      height,\n    };\n  });\n}\n\nfunction PDFPrintService(pdfDocument, pagesOverview, printContainer, l10n) {\n  this.pdfDocument = pdfDocument;\n  this.pagesOverview = pagesOverview;\n  this.printContainer = printContainer;\n  this.l10n = l10n || NullL10n;\n  this.disableCreateObjectURL =\n    pdfDocument.loadingParams['disableCreateObjectURL'];\n  this.currentPage = -1;\n  // The temporary canvas where renderPage paints one page at a time.\n  this.scratchCanvas = document.createElement('canvas');\n}\n\nPDFPrintService.prototype = {\n  layout() {\n    this.throwIfInactive();\n\n    let body = document.querySelector('body');\n    body.setAttribute('data-pdfjsprinting', true);\n\n    let hasEqualPageSizes = this.pagesOverview.every(function(size) {\n      return size.width === this.pagesOverview[0].width &&\n             size.height === this.pagesOverview[0].height;\n    }, this);\n    if (!hasEqualPageSizes) {\n      console.warn('Not all pages have the same size. The printed ' +\n                   'result may be incorrect!');\n    }\n\n    // Insert a @page + size rule to make sure that the page size is correctly\n    // set. Note that we assume that all pages have the same size, because\n    // variable-size pages are not supported yet (e.g. in Chrome & Firefox).\n    // TODO(robwu): Use named pages when size calculation bugs get resolved\n    // (e.g. https://crbug.com/355116) AND when support for named pages is\n    // added (http://www.w3.org/TR/css3-page/#using-named-pages).\n    // In browsers where @page + size is not supported (such as Firefox,\n    // https://bugzil.la/851441), the next stylesheet will be ignored and the\n    // user has to select the correct paper size in the UI if wanted.\n    this.pageStyleSheet = document.createElement('style');\n    let pageSize = this.pagesOverview[0];\n    this.pageStyleSheet.textContent =\n      // \"size:<width> <height>\" is what we need. But also add \"A4\" because\n      // Firefox incorrectly reports support for the other value.\n      '@supports ((size:A4) and (size:1pt 1pt)) {' +\n      '@page { size: ' + pageSize.width + 'pt ' + pageSize.height + 'pt;}' +\n      '}';\n    body.appendChild(this.pageStyleSheet);\n  },\n\n  destroy() {\n    if (activeService !== this) {\n      // |activeService| cannot be replaced without calling destroy() first,\n      // so if it differs then an external consumer has a stale reference to\n      // us.\n      return;\n    }\n    this.printContainer.textContent = '';\n    if (this.pageStyleSheet) {\n      this.pageStyleSheet.remove();\n      this.pageStyleSheet = null;\n    }\n    this.scratchCanvas.width = this.scratchCanvas.height = 0;\n    this.scratchCanvas = null;\n    activeService = null;\n    ensureOverlay().then(function() {\n      if (overlayManager.active !== 'printServiceOverlay') {\n        return; // overlay was already closed\n      }\n      overlayManager.close('printServiceOverlay');\n    });\n  },\n\n  renderPages() {\n    let pageCount = this.pagesOverview.length;\n    let renderNextPage = (resolve, reject) => {\n      this.throwIfInactive();\n      if (++this.currentPage >= pageCount) {\n        renderProgress(pageCount, pageCount, this.l10n);\n        resolve();\n        return;\n      }\n      let index = this.currentPage;\n      renderProgress(index, pageCount, this.l10n);\n      renderPage(this, this.pdfDocument, index + 1, this.pagesOverview[index])\n        .then(this.useRenderedPage.bind(this))\n        .then(function() {\n          renderNextPage(resolve, reject);\n        }, reject);\n    };\n    return new Promise(renderNextPage);\n  },\n\n  useRenderedPage(printItem) {\n    this.throwIfInactive();\n    let img = document.createElement('img');\n    img.style.width = printItem.width;\n    img.style.height = printItem.height;\n\n    let scratchCanvas = this.scratchCanvas;\n    if (('toBlob' in scratchCanvas) && !this.disableCreateObjectURL) {\n      scratchCanvas.toBlob(function(blob) {\n        img.src = URL.createObjectURL(blob);\n      });\n    } else {\n      img.src = scratchCanvas.toDataURL();\n    }\n\n    let wrapper = document.createElement('div');\n    wrapper.appendChild(img);\n    this.printContainer.appendChild(wrapper);\n\n    return new Promise(function(resolve, reject) {\n      img.onload = resolve;\n      img.onerror = reject;\n    });\n  },\n\n  performPrint() {\n    this.throwIfInactive();\n    return new Promise((resolve) => {\n      // Push window.print in the macrotask queue to avoid being affected by\n      // the deprecation of running print() code in a microtask, see\n      // https://github.com/mozilla/pdf.js/issues/7547.\n      setTimeout(() => {\n        if (!this.active) {\n          resolve();\n          return;\n        }\n        print.call(window);\n        // Delay promise resolution in case print() was not synchronous.\n        setTimeout(resolve, 20);  // Tidy-up.\n      }, 0);\n    });\n  },\n\n  get active() {\n    return this === activeService;\n  },\n\n  throwIfInactive() {\n    if (!this.active) {\n      throw new Error('This print request was cancelled or completed.');\n    }\n  },\n};\n\nlet print = window.print;\nwindow.print = function print() {\n  if (activeService) {\n    console.warn('Ignored window.print() because of a pending print job.');\n    return;\n  }\n  ensureOverlay().then(function() {\n    if (activeService) {\n      overlayManager.open('printServiceOverlay');\n    }\n  });\n\n  try {\n    dispatchEvent('beforeprint');\n  } finally {\n    if (!activeService) {\n      console.error('Expected print service to be initialized.');\n      ensureOverlay().then(function() {\n        if (overlayManager.active === 'printServiceOverlay') {\n          overlayManager.close('printServiceOverlay');\n        }\n      });\n      return; // eslint-disable-line no-unsafe-finally\n    }\n    let activeServiceOnEntry = activeService;\n    activeService.renderPages().then(function() {\n      return activeServiceOnEntry.performPrint();\n    }).catch(function() {\n      // Ignore any error messages.\n    }).then(function() {\n      // aborts acts on the \"active\" print request, so we need to check\n      // whether the print request (activeServiceOnEntry) is still active.\n      // Without the check, an unrelated print request (created after aborting\n      // this print request while the pages were being generated) would be\n      // aborted.\n      if (activeServiceOnEntry.active) {\n        abort();\n      }\n    });\n  }\n};\n\nfunction dispatchEvent(eventType) {\n  let event = document.createEvent('CustomEvent');\n  event.initCustomEvent(eventType, false, false, 'custom');\n  window.dispatchEvent(event);\n}\n\nfunction abort() {\n  if (activeService) {\n    activeService.destroy();\n    dispatchEvent('afterprint');\n  }\n}\n\nfunction renderProgress(index, total, l10n) {\n  let progressContainer = document.getElementById('printServiceOverlay');\n  let progress = Math.round(100 * index / total);\n  let progressBar = progressContainer.querySelector('progress');\n  let progressPerc = progressContainer.querySelector('.relative-progress');\n  progressBar.value = progress;\n  l10n.get('print_progress_percent', { progress, }, progress + '%').\n      then((msg) => {\n    progressPerc.textContent = msg;\n  });\n}\n\nlet hasAttachEvent = !!document.attachEvent;\n\nwindow.addEventListener('keydown', function(event) {\n  // Intercept Cmd/Ctrl + P in all browsers.\n  // Also intercept Cmd/Ctrl + Shift + P in Chrome and Opera\n  if (event.keyCode === /* P= */ 80 && (event.ctrlKey || event.metaKey) &&\n      !event.altKey && (!event.shiftKey || window.chrome || window.opera)) {\n    window.print();\n    if (hasAttachEvent) {\n      // Only attachEvent can cancel Ctrl + P dialog in IE <=10\n      // attachEvent is gone in IE11, so the dialog will re-appear in IE11.\n      return;\n    }\n    event.preventDefault();\n    if (event.stopImmediatePropagation) {\n      event.stopImmediatePropagation();\n    } else {\n      event.stopPropagation();\n    }\n    return;\n  }\n}, true);\nif (hasAttachEvent) {\n  document.attachEvent('onkeydown', function(event) {\n    event = event || window.event;\n    if (event.keyCode === /* P= */ 80 && event.ctrlKey) {\n      event.keyCode = 0;\n      return false;\n    }\n  });\n}\n\nif ('onbeforeprint' in window) {\n  // Do not propagate before/afterprint events when they are not triggered\n  // from within this polyfill. (FF /IE / Chrome 63+).\n  let stopPropagationIfNeeded = function(event) {\n    if (event.detail !== 'custom' && event.stopImmediatePropagation) {\n      event.stopImmediatePropagation();\n    }\n  };\n  window.addEventListener('beforeprint', stopPropagationIfNeeded);\n  window.addEventListener('afterprint', stopPropagationIfNeeded);\n}\n\nlet overlayPromise;\nfunction ensureOverlay() {\n  if (!overlayPromise) {\n    overlayManager = PDFViewerApplication.overlayManager;\n    if (!overlayManager) {\n      throw new Error('The overlay manager has not yet been initialized.');\n    }\n\n    overlayPromise = overlayManager.register('printServiceOverlay',\n      document.getElementById('printServiceOverlay'), abort, true);\n    document.getElementById('printCancel').onclick = abort;\n  }\n  return overlayPromise;\n}\n\nPDFPrintServiceFactory.instance = {\n  supportsPrinting: true,\n\n  createPrintService(pdfDocument, pagesOverview, printContainer, l10n) {\n    if (activeService) {\n      throw new Error('The print service is created and active.');\n    }\n    activeService = new PDFPrintService(pdfDocument, pagesOverview,\n                                        printContainer, l10n);\n    return activeService;\n  },\n};\n\nexport {\n  PDFPrintService,\n};\n"],"sourceRoot":""}
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/dcConfig.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/dcConfig.js
new file mode 100644
index 0000000..43ab620
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/dcConfig.js
@@ -0,0 +1,37 @@
+
+/**
+ @Name锛� dynamicCondition 鐢ㄦ埛閰嶇疆鏂囦欢,淇敼閰嶇疆鍚庢病鐢熸晥锛岃娉ㄦ剰娓呴櫎缂撳瓨
+ @Author锛歺pl
+ @version: 3.0.6 2019-05-23 鏀寔浠巇cConfig涓墿灞曠紪杈戝櫒銆傛柊澧炰笅鎷夋爲缂栬緫鍣╰reeSelect銆�
+ @version: 2019-04-09
+ */
+layui.define(['jquery'], function (exports) {
+    "use strict";
+
+    var MOD_NAME = 'framework/dcConfig',
+        $ = layui.jquery;
+
+    var myConfig  = {
+    		type: 'complex',//鍙栧�硷細'simple'/'complex'榛樿涓哄鏉傛ā寮忋�傚尯鍒�1.鏄剧ず鐣岄潰涓嶄竴鏍凤紝2.鏋勯�犵殑requestData鏍煎紡涓嶄竴鏍枫��
+    		requestDataType: 'array',//鍙栧�硷細'array'/'json'.璇锋眰鍙傛暟绫诲瀷銆傞粯璁rray銆�
+    		instanceName: 'instanceName',//鍒涘缓鐨勫疄渚嬪悕绉般�傞潪蹇呴』銆傞粯璁や负'instanceName'銆傚綋涓�涓〉闈㈠彧鍒涘缓涓�涓疄渚嬫椂锛屽彲浠ヤ笉鐢ㄨ鍙傛暟
+    		displayModel: 'unpopup',//鏄剧ず妯″瀷銆傚彇鍊硷細'popup'/'unpopup'銆� 榛樿"popup"鐐瑰嚮鍚庢彁鍑烘煡璇㈡潯浠惰缃獥鍙c�倁npopup妯″紡鍒欎笉寮瑰嚭绐楀彛锛岀洿鎺ュ湪鐣岄潰涓婅缃潯浠躲��
+    		counts: 3,//榛樿鍒濆鍖栨潯浠舵暟銆�
+    		popupMsgText: "鏌ヨ鏉′欢锛�",//寮圭獥妯″紡涓媘sg榛樿鎻愮ず鏂囨湰銆備箣鍓嶇増鏈粯璁や负鈥滄煡璇㈡潯浠讹細鈥�
+    		popupBtnsWidth: 120,//寮圭獥妯″紡涓嬫寜閽伐鍏烽潰鏉垮搴︺��500px
+    		popupShowQueryBtn: false, //寮圭獥妯″紡涓嬶紝鏄惁鏄剧ず鏌ヨ鎸夐挳銆備箣鍓嶇増鏈粯璁ゆ槸涓嶆樉绀虹殑
+    		unpopupBtnswidth: 180,//闈炲脊绐楁ā寮忎笅鎸夐挳宸ュ叿闈㈡澘瀹藉害銆�500px
+    		unpopupShowAddBtn: false, //闈炲脊绐楁ā寮忎笅锛屾槸鍚︽樉绀烘柊澧炴潯浠舵寜閽�備箣鍓嶇増鏈粯璁ゆ槸涓嶆樉绀虹殑
+    		extendBtns:function(btnDivJq, instance){
+    			//涓嬮潰鍙互娣诲姞鎵╁睍鎸夐挳
+    			if($("#toolbarBts").size()>0){//寮圭獥妯″紡缁熶竴鏀逛负闈炲脊绐楁ā寮�
+    				var toolBtsJq = $("<div><div>");
+    				toolBtsJq.append($("#toolbarBts").html());
+    				var btsJq = toolBtsJq.find(".layui-btn");
+    				btsJq.removeClass("layui-btn-xs");
+    				btnDivJq.append(btsJq.not("a:contains(鏌ヨ)"));
+    			}
+    		}
+    };
+    exports(MOD_NAME, myConfig);
+});
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/dynamicCondition.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/dynamicCondition.js
new file mode 100644
index 0000000..49c8dfc
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/dynamicCondition.js
@@ -0,0 +1,1388 @@
+
+/**
+ @Name锛� dynamicCondition 鍔ㄦ�佹坊鍔犳煡璇㈡潯浠�
+ @Author锛歺pl
+ */
+layui.extend({
+	// dcConfig: 'framework/dcConfig'
+}).define(['jquery','table', 'form','laydate','vciWebComboxStore'], function (exports) {
+	"use strict";
+	//layui.link(layui.cache.index + 'dynamicCondition/dc.css');
+	var MOD_NAME = 'dynamicCondition',
+		$ = layui.jquery,
+		dcConfig = layui.dcConfig || {},
+		laydate = layui.laydate,
+		table = layui.table,
+		form = layui.form;
+	var tempVal = {value:"",text:""};
+
+	//鍒涘缓瀹炰緥
+	var createInstance = function(_config){
+		var instance = {
+			data:[]
+			,config:_config
+			,requestData:{}
+			,originalCondition:[]//鍘熷鏌ヨ鏉′欢 鐢ㄤ簬閲嶇疆
+			,cacheCondition:[] //缂撳瓨鏌ヨ鏉′欢
+			,conditionContainerId:(Math.random()+"").substr(2)//闅忔満鏃ユ湡id
+			,conditionFieldWidth:_config.conditionFieldWidth || 120 //绗竴鍒楅粯璁ゅ搴�
+			,conditionOptionWidth:_config.conditionOptionWidth || 100//绗簩鍒楅粯璁ゅ搴�
+			,conditionValueWidth:_config.conditionValueWidth || 150 //绗笁鍒楅粯璁ゅ搴�
+			,height:380 //寮瑰嚭绐楀彛榛樿楂樺害
+			,width:640 //寮瑰嚭绐楀彛榛樿瀹藉害
+		};
+		if(instance.config.type != "complex"){
+			instance.width = instance.width - instance.conditionOptionWidth;
+		}
+		/**璁剧疆鏄剧ず妯″紡
+		 * displayModel,鍙栧�硷細'popup'/'unpopup'
+		 * */
+		instance.setDisplayModel = function(displayModel){
+			instance.config.displayModel = 'popup' || instance.config.displayModel;
+			if(instance.config.displayModel == "unpopup"){
+				instance.conditionValueWidth = 100;
+				instance.buildConditionHtmlForUnpopup();
+				if(instance.openPageIndex){
+					layer.close(instance.openPageIndex);
+				}
+			}else{
+				instance.conditionValueWidth = 150;
+				instance.buildConditionHtml();
+			}
+		}
+		/**鏍规嵁瀛楁鍚嶇О鑾峰彇瀵瑰簲鐨勯厤缃」*/
+		instance.getObjByField=function(conditionFieldVal){
+			for(var i=0;i<instance.data.length;i++){
+				if(instance.data[i].field == conditionFieldVal){
+					return instance.data[i];
+				}
+			}
+			return null;
+		}
+		/**鏍规嵁瀛楁鍚嶇О鑾峰彇琛宒iv锛岃繑鍥炰竴涓猟om绫诲瀷鐨勬暟缁�*/
+		instance.getRowDivs=function(conditionFieldVal){
+			var rs = [];
+			var allRowDivJqs = $("#" + instance.conditionContainerId).find(".conditionRow");
+			allRowDivJqs.each(function(){
+				var selVal = $(this).find(".conditionField option:selected").val();
+				if(conditionFieldVal == selVal){
+					rs.push($(this)[0]);
+				}
+			})
+			return rs;
+		}
+		/**鏍规嵁瀛楁鍚嶇О鑾峰搴旂殑鍊硷紝濡傛灉璇ュ瓧娈垫潯浠舵湁澶氫釜锛屽垯鍙彇绗竴琛屽搴旂殑鍊笺��*/
+		instance.getVal=function(conditionFieldVal){
+			var rs = instance.getRowDivs(conditionFieldVal);
+			if(rs.length == 0){
+				//娌℃湁瀵瑰簲鐨勭殑鍊�
+				return null;
+			}
+			var rowDiv = rs[0];
+			var eleJq = rowDiv.eleJq;
+			var eleLeftJq = rowDiv.eleLeftJq;
+			var eleRightJq = rowDiv.eleRightJq;
+			if(eleJq){
+				return rowDiv.curEditor.getRequestValue(eleJq);
+			}
+			//鎿嶄綔绗︽槸between鏃惰繑鍥�2涓��
+			else if(eleLeftJq){
+				return {left:rowDiv.curEditor.getRequestValue(eleLeftJq),right:rowDiv.curEditor.getRequestValue(eleRightJq)};
+			}
+			//褰撴搷浣滅鏄痚mpty鏃惰繑鍥瀗ull
+			return null;
+		}
+		/**鏍规嵁瀛楁鍚嶇О鑾峰搴旂殑鍊硷紝濡傛灉璇ュ瓧娈垫潯浠舵湁澶氫釜锛屽垯鍙彇绗竴琛屽搴旂殑鍊笺��*/
+		instance.getValText=function(conditionFieldVal){
+			var rs = instance.getRowDivs(conditionFieldVal);
+			if(rs.length == 0){
+				//娌℃湁瀵瑰簲鐨勭殑鍊�
+				return null;
+			}
+			var rowDiv = rs[0];
+			var eleJq = rowDiv.eleJq;
+			var eleLeftJq = rowDiv.eleLeftJq;
+			var eleRightJq = rowDiv.eleRightJq;
+			if(eleJq){
+				return {value:rowDiv.curEditor.getRequestValue(eleJq), text:rowDiv.curEditor.getRequestText(eleJq)};
+			}
+			//鎿嶄綔绗︽槸between鏃惰繑鍥�2涓��
+			else if(eleLeftJq){
+				return {
+					left:{value:rowDiv.curEditor.getRequestValue(eleLeftJq), text:rowDiv.curEditor.getRequestText(eleLeftJq)}
+					,right:{value:rowDiv.curEditor.getRequestValue(eleRightJq), text:rowDiv.curEditor.getRequestText(eleRightJq)}
+				};
+			}
+			//褰撴搷浣滅鏄痚mpty鏃惰繑鍥瀗ull
+			return null;
+		}
+		/**璁剧疆鍒濆鏉′欢
+		 * conditionArr,渚嬶細
+		 * */
+		instance.setCondition = function(conditionArr){
+			for(var i=0;i<conditionArr.length;i++){
+				//鍒濆璧嬪��
+				var conditionTemp = conditionArr[i];
+				var conditionFieldVal = conditionTemp[0];
+				var item = instance.getObjByField(conditionFieldVal);
+				var conditionValueVal = item["initVal"];
+				var conditionValueLeftVal = item["initLeftVal"];
+				var conditionValueRightVal = item["initRightVal"];
+				conditionTemp[1] = conditionTemp[1] || "like";
+				var conditionOptionVal = conditionTemp[1];
+				if(conditionOptionVal == "between"){
+					conditionTemp[2] = conditionTemp[2] || {value:conditionValueLeftVal};
+					conditionTemp[3] = conditionTemp[3] || {value:conditionValueRightVal};
+				}else{
+					conditionTemp[2] = conditionTemp[2] || {value:conditionValueVal};
+				}
+				if(item.refer != null){
+					conditionTemp[4] = item.refer
+				}else{
+					conditionTemp[4] = false;
+				}
+				if(item.edit){
+					conditionTemp[5] = item.edit
+				}
+				if(item.referfield != null){
+					conditionTemp[6] = item.referfield
+				}else{
+					conditionTemp[6] = '';
+				}
+			}
+			//缂撳瓨鏌ヨ鏉′欢
+			var cacheCondition = parseToCacheCondition(conditionArr, instance.config.type);
+			instance.cacheCondition = cacheCondition;
+			instance.originalCondition = cacheCondition
+			instance.setDisplayModel();
+			instance.lastRequestData = instance.buildRequestData();
+		}
+		/**鏂板鏉′欢*/
+		instance.addRow = function(conditionValueType){
+			var conditionContainerJq = $("#"+instance.conditionContainerId);
+			var conditionRowJq = $('<div class="conditionRow"></div>');
+			if(instance.config.type == "complex"){
+				var width = instance.conditionFieldWidth + instance.conditionOptionWidth + 2 * instance.conditionValueWidth + 20 + 60;
+//				  conditionRowJq.css("width", width);
+			}else{
+				var width = instance.conditionFieldWidth  + 2 * instance.conditionValueWidth + 20 + 60;
+//				  conditionRowJq.css("width", width);
+			}
+			//瀛楁
+			var conditionField=$('<div class="layui-inline conditionField"></div>');
+//			  conditionField.width(instance.conditionFieldWidth);
+			conditionField.append($(instance.conditionFieldHtml));
+			//鎿嶄綔
+			var conditionOption=$('<div class="layui-inline conditionOption"></div>');
+//			  conditionOption.width(instance.conditionOptionWidth);
+			if(conditionValueType == "text"){
+				conditionOption.append($(instance.conditionStringOptionHtml));
+			}else if(conditionValueType == "number"){
+				conditionOption.append($(instance.conditionNumberOptionHtml));
+			}else if(conditionValueType == "date"){
+				conditionOption.append($(instance.conditionDateOptionHtml));
+			}else if(conditionValueType == "refer"){
+				conditionOption.append($(instance.conditionReferOptionHtml))
+			}else{
+				conditionOption.append($(instance.conditionSelectOptionHtml));
+			}
+			//conditionOption.append($(instance.conditionOptionHtml));
+			//鍊�
+			var conditionValue=$('<div class="layui-inline conditionValue"></div>');
+//			  conditionValue.width(instance.conditionValueWidth*2+20);
+			var conditionDel=$('<div class="layui-inline conditionDel"></div>');
+//			  conditionDel.width(30);
+			//鍒犻櫎鎸夐挳
+			var delJq=$('<a href="javascript:void(0);" class="delRowBtn"><i class="layui-icon layui-icon-close"></i></a>');
+			conditionDel.append(delJq);
+			conditionRowJq.append(conditionField);
+			conditionRowJq.append(conditionOption);
+			conditionRowJq.append(conditionValue);
+			conditionRowJq.append(conditionDel);
+			conditionContainerJq.find(".conditionDiv").append(conditionRowJq);
+			//鍒犻櫎浜嬩欢
+			delJq.on("click",function(){
+				conditionRowJq.remove();
+			});
+
+//			  if(instance.config.type == "simple"){
+//				  conditionOption.hide();
+//			  }
+			return conditionRowJq;
+		}
+		/**鏇存柊conditionValue*/
+		instance.updateConditionValue = function(conditionRowJq, conditionObj,callback){
+			var conditionValueJq = conditionRowJq.find(".conditionValue");
+			var conditionFieldVal = conditionRowJq.find("select[name='conditionField']").val();
+			var obj = instance.getObjByField(conditionFieldVal);
+			//娌℃湁瀵瑰簲鐨刼bj锛屽垯涓嶇敤鏇存柊conditionValue
+			if(!obj){
+				return ;
+			}
+			if(!conditionObj){
+				conditionObj = {
+					conditionValueVal:{value:obj["initVal"]},
+					conditionValueLeftVal:{value:obj["initLeftVal"]},
+					conditionValueRightVal:{value:obj["initRightVal"]},
+				}
+			}
+//    		  conditionObj = conditionObj || {conditionValueVal:{},conditionValueLeftVal:{},conditionValueRightVal:{}}
+			if(conditionObj.conditionOptionVal){
+				conditionRowJq.find("select[name='conditionOption']").val(conditionObj.conditionOptionVal);
+			}
+			var conditionOptionVal = conditionRowJq.find("select[name='conditionOption']").val();
+
+
+			//鎸囧畾鎿嶄綔閫夐」
+			if(obj.allowDel === "true"){
+				//鍏佽鍒犻櫎鐨勬潯浠讹紝涓嬫媺瀛楁閫夐」鎺掗櫎鎺変笉鑳藉垹闄ゆ潯浠跺瓧娈点��
+				removeOption(conditionRowJq.find("select[name='conditionField']"), instance.fieldList);
+			}
+			//鎸囧畾鎿嶄綔閫夐」
+			if(obj.ops){
+				removeOption(conditionRowJq.find("select[name='conditionOption']"), obj.ops);
+				//鍒犻櫎鍚庡彲鑳絚onditionOptionVal鍊间細鏀瑰彉銆傛瘮濡傛湰鏉ラ粯璁ゆ槸equal锛岀敱浜庤閫夐」鍒犻櫎浜嗭紝瀵艰嚧榛樿鍊兼槸between浜嗐��
+				conditionOptionVal = conditionRowJq.find("select[name='conditionOption']").val();
+			}
+			//conditionValueJq div涓紦瀛樺搴旂殑edit鍜宑onditionOptionVal锛屼互鍚庝紭鍖栧彧鏈夊綋edit鍜宑onditionOptionVal鏀瑰彉鏃舵墠鑰冭檻鏇存柊conditionValueJq
+			var old_field = conditionValueJq.attr("field");
+			var old_edit = conditionValueJq.attr("edit");
+			var old_conditionOptionVal = conditionValueJq.attr("conditionOptionVal");
+			conditionValueJq.attr("field", obj.field);
+			conditionValueJq.attr("edit", obj.edit);
+			conditionValueJq.attr("conditionOptionVal", conditionOptionVal);
+			var curEditor = dynamicCondition.editor[obj.edit];
+			conditionRowJq[0].curEditor = curEditor;
+			if(conditionOptionVal == "empty"){
+				conditionValueJq.html("");
+				return ;
+			}
+			if(curEditor){
+				if(conditionOptionVal == "between"){
+					var eleLeftJq = '';//$(curEditor.createElement(obj));
+					var eleRightJq = '';//$(curEditor.createElement(obj));
+					curEditor.createElement(obj,function(elem){
+						eleLeftJq = $(elem);
+					})
+					curEditor.createElement(obj,function(elem){
+						eleRightJq = $(elem);
+					})
+					var divLeft = $("<div style='display:inline-block'></div>");
+					var divRight = $("<div style='display:inline-block'></div>");
+
+					divLeft.append(eleLeftJq);
+					divLeft.attr("name","conditionValueLeft");
+					divLeft.width(instance.conditionValueWidth);
+
+					divRight.append(eleRightJq);
+					divRight.attr("name","conditionValueRight");
+					divRight.width(instance.conditionValueWidth);
+					//鏇存柊conditionValueJq
+					conditionValueJq.html("");
+					conditionValueJq.append(divLeft);
+					conditionValueJq.append("<span style='margin:auto 3px;'>鑷�</span>");
+					conditionValueJq.append(divRight);
+					//蹇呴』灏唈q瀵硅薄杞崲涓篸om瀵硅薄鎵嶈兘缁戝畾瀵硅薄灞炴�с��
+					conditionRowJq[0].eleJq = null;
+					conditionRowJq[0].eleLeftJq = eleLeftJq;
+					conditionRowJq[0].eleRightJq = eleRightJq;
+					curEditor.fillElement(eleLeftJq,conditionObj.conditionValueLeftVal);
+					curEditor.fillElement(eleRightJq,conditionObj.conditionValueRightVal);
+					curEditor.render(eleLeftJq,obj);
+					curEditor.render(eleRightJq,obj);
+
+				}else{
+					var eleJq = '';//$(curEditor.createElement(obj));
+					curEditor.createElement(obj,function(elem){
+						//eleJq = $(curEditor.createElement(obj));
+						eleJq = $(elem);
+						var divJq = $("<div></div>");
+						divJq.append(eleJq);
+						divJq.attr("name","conditionValue");
+						conditionValueJq.html("");
+						conditionValueJq.append(divJq);
+//					  divJq.attr("xpl-dc-val",conditionObj.conditionValueVal);
+						//蹇呴』灏唈q瀵硅薄杞崲涓篸om瀵硅薄鎵嶈兘缁戝畾瀵硅薄灞炴�с��
+						conditionRowJq[0].eleJq = eleJq;
+						conditionRowJq[0].eleLeftJq = null;
+						conditionRowJq[0].eleRightJq = null;
+						curEditor.fillElement(eleJq,conditionObj.conditionValueVal);
+						curEditor.render(eleJq,obj);
+					})
+				}
+				return ;
+			}
+		}
+		/**鏍¢獙琛ㄥ崟*/
+		instance.verifyForm = function(){
+			var verifySuccess = true;
+			var conditionContainerJq = $("#" + instance.conditionContainerId);
+			var verify = form.config.verify
+				,DANGER = 'layui-form-danger'
+				,verifyElem = conditionContainerJq.find('*[lay-verify]') //鑾峰彇闇�瑕佹牎楠岀殑鍏冪礌
+
+			//寮�濮嬫牎楠�
+			for(var i=0;i<verifyElem.length;i++){
+				var item = verifyElem[i];
+				var othis = $(item)
+					,vers = othis.attr('lay-verify').split('|')
+					,verType = othis.attr('lay-verType') //鎻愮ず鏂瑰紡
+					,value = othis.val();
+				othis.removeClass(DANGER);
+				var errorText;
+				//鏄惁鍏佽绌哄��
+				var allowBlank = true;
+				layui.each(vers, function(_, thisVer){
+					if(thisVer.indexOf("required") >= 0){
+						//涓嶅厑璁镐负绌哄��
+						allowBlank = false;
+					}
+				})
+				//鍏佽涓虹┖鍊�
+				if(allowBlank){
+					if(value == ""){
+						//鏍¢獙閫氳繃锛屽鏋滆繕鏈夊叾浠栫殑pass锛宯umber绛変篃涓嶇敤鏍¢獙浜嗐��
+						continue;
+					}
+				}
+				//涓嶅厑璁镐负绌哄�硷紝缁х画鏍¢獙
+				for(var j=0;j<vers.length;j++){
+					var isTrue=null //鏄惁鍛戒腑鏍¢獙
+						,thisVer = vers[j]  //鏍¢獙name锛屽锛歳equired锛宲ass 绛�
+						,errorText = '' //閿欒鎻愮ず鏂囨湰
+						,isFn = typeof verify[thisVer] === 'function';
+					//鍖归厤楠岃瘉瑙勫垯
+					if(verify[thisVer]){
+						isTrue = isFn ? errorText = verify[thisVer](value, item) : !verify[thisVer][0].test(value);
+						errorText = errorText || verify[thisVer][1];
+						//isTrue涓簍rue锛屽垯楠岃瘉涓嶉�氳繃
+						if(isTrue){
+							verifySuccess = false;
+							//鎻愮ず
+							layer.tips(errorText, function(){
+								if(typeof othis.attr('lay-ignore') !== 'string'){
+									if(item.tagName.toLowerCase() === 'select' || /^checkbox|radio$/.test(item.type)){
+										return othis.next();
+									}
+								}
+								return othis;
+							}(), {tips: [1, '#FF0000']});
+							othis.addClass(DANGER);
+							return verifySuccess;
+						}
+					}
+				}
+			}
+			return verifySuccess;
+		}
+		/**鏍规嵁鍔ㄦ�佹煡璇㈡潯浠舵瀯閫犵紦瀛樺搴旂殑璇锋眰鏉′欢*/
+		instance.buildCacheCondition = function(){
+			var conditionContainerJq = $("#" + instance.conditionContainerId);
+			var conditionRowJqs = conditionContainerJq.find(".conditionRow");
+			var rowLength = conditionRowJqs.size();
+			//缂撳瓨鏌ヨ鏉′欢
+			var cacheCondition = [];
+			for(var i=0;i<rowLength;i++){
+				var conditionRowJq = conditionRowJqs.eq(i);
+				var valJq = conditionRowJq.find("[name='conditionValue']");
+				var valLeftJq = conditionRowJq.find("[name='conditionValueLeft']");
+				var valRightJq = conditionRowJq.find("[name='conditionValueRight']");
+
+				var conditionObj = {};
+				conditionObj.conditionFieldVal = conditionRowJq.find("select[name='conditionField']").val();
+				conditionObj.conditionOptionVal = conditionRowJq.find("select[name='conditionOption']").val();
+				var item = instance.getObjByField(conditionObj.conditionFieldVal);
+				var curEditor = dynamicCondition.editor[item.edit];
+				if(curEditor){
+					var conditionRowDOM = conditionRowJq[0];
+					var tempjq = conditionRowDOM.eleJq;
+					conditionObj.conditionValueVal = tempjq ? {value:curEditor.getRequestValue(tempjq),text:curEditor.getRequestText(tempjq)} : tempVal;
+					tempjq = conditionRowDOM.eleLeftJq;
+					conditionObj.conditionValueLeftVal = tempjq ? {value:curEditor.getRequestValue(tempjq),text:curEditor.getRequestText(tempjq)} : tempVal;
+					tempjq = conditionRowDOM.eleRightJq;
+					conditionObj.conditionValueRightVal = tempjq ? {value:curEditor.getRequestValue(tempjq),text:curEditor.getRequestText(tempjq)} : tempVal;
+				}
+				if(item.refer != null){
+					conditionObj.conditionRefer = item.refer
+				}else{
+					conditionObj.conditionRefer = false;
+				}
+				if(item.referfield != null){
+					conditionObj.conditionReferField = item.referfield
+				}
+				if(item.referConfig !=null){
+					conditionObj.conditionReferConfig = item.referConfig
+				}
+				conditionObj.conditionValueType = item.edit;
+				cacheCondition.push(conditionObj);
+			}
+			instance.cacheCondition = cacheCondition;
+			return cacheCondition;
+		}
+		/**鏍规嵁鍔ㄦ�佹煡璇㈡潯浠舵瀯閫犲搴旂殑璇锋眰鍙傛暟.*/
+		instance.buildRequestData = function(cacheCondition){
+			var cacheCondition = cacheCondition || instance.cacheCondition;
+			//璁剧疆璇锋眰鍙傛暟
+			instance.requestData = parseToRequest(cacheCondition ,instance.config.type,instance.config.requestDataType);
+			return instance.requestData;
+		}
+		/**鏍规嵁鍔ㄦ�佹煡璇㈡潯浠舵瀯閫犲搴旂殑鏄剧ず鏂囨湰*/
+		instance.buildConditionHtml = function(){
+			var cacheCondition = instance.cacheCondition;
+			var conditionHtml = "";
+			var fieldSelectJq = $(instance.conditionFieldHtml);
+			var optionSelectJq = '';//$(instance.conditionOptionHtml);
+			var blankStr = "&nbsp;&nbsp;";
+			for(var i=0;i<cacheCondition.length;i++){
+				var conditionObj = cacheCondition[i];
+				var fieldText = fieldSelectJq.find("option[value='"+conditionObj.conditionFieldVal+"']").text();
+				var optionType = conditionObj.conditionValueType;
+				if(optionType == 'text'){
+					optionSelectJq = $(instance.conditionStringOptionHtml);
+				}else if(optionType == 'number'){
+					optionSelectJq = $(instance.conditionNumberOptionHtml);
+				}else if(optionType == "date"){
+					optionSelectJq=$(instance.conditionDateOptionHtml);
+				}else if(optionType == 'refer'){
+					optionSelectJq = $(instance.conditionReferOptionHtml)
+				}else{
+					optionSelectJq = $(instance.conditionSelectOptionHtml);
+				}
+				var OptionText = optionSelectJq.find("option[value='"+conditionObj.conditionOptionVal+"']").text();
+				var ValueText = conditionObj.conditionValueVal.text;
+				var ValueLeftText = conditionObj.conditionValueLeftVal.text;
+				var ValueRightText = conditionObj.conditionValueRightVal.text;
+
+				var rsValueText="";
+				if(conditionObj.conditionOptionVal == "between"){
+					rsValueText = ValueLeftText + blankStr+"鑷�"+ blankStr + ValueRightText;
+				}else{
+					rsValueText = ValueText;
+				}
+				rsValueText = rsValueText || "";
+				//绠�鍗曟ā寮�
+				var spanJq = $("<span class='layui-xpl-dc-circle' index="+i+"></span>");
+				if(instance.config.type == "simple"){
+					spanJq.html(fieldText + blankStr + ":" + blankStr + rsValueText);
+					//conditionHtml += fieldText + blankStr + ":" + blankStr + rsValueText;
+				}
+				//澶嶆潅妯″紡
+				else{
+					spanJq.html(fieldText + blankStr + OptionText + blankStr + rsValueText);
+//    				conditionHtml += fieldText + blankStr + OptionText + blankStr + rsValueText;
+				}
+				var iJq = $('<i class="layui-icon layui-icon-close layui-xpl-dc-delete"></i>');
+				var item = instance.getObjByField(conditionObj.conditionFieldVal);
+				iJq.attr("allowDel", item.allowDel);
+				spanJq.append(iJq);
+				conditionHtml += spanJq.prop("outerHTML");
+			}
+			instance.conditionHtml = "<div class='xpl-dc-popup-query-condition-div'style='display:none'>"+instance.config.popupMsgText + conditionHtml +"</div>";
+			if(instance.config.conditionTextId){
+				var msgJq = $(instance.config.conditionTextId);
+				msgJq.html(instance.conditionHtml);
+				msgJq.append($("<div class='xpl-dc-popup-btns'></div>"));
+				var btnsJq = msgJq.find(".xpl-dc-popup-btns");
+				btnsJq.width(instance.config.popupBtnsWidth);
+				var hideFlag = instance.config.popupShowQueryBtn ? "" : " xpl-hide ";
+				btnsJq.append($("<a class='layui-btn xpl-popup-query layui-btn layui-btn-sm" + hideFlag + "'>楂樼骇鏌ヨ</a>"));
+				btnsJq.find(".xpl-popup-query").on("click",function(){
+					instance.open();
+				});
+				if(instance.config.extendBtns){
+					instance.config.extendBtns(btnsJq, instance);
+				}
+				msgJq.append($("<div class='xpl-clear'></div>"));//娓呴櫎娴姩
+				msgJq.find(".xpl-dc-popup-query-condition-div").width(msgJq.width() - btnsJq.width());
+				msgJq.find(".layui-xpl-dc-delete").on("click",function(){
+					instance.deleteIns(this);
+				});
+				msgJq.find(".layui-xpl-dc-delete[allowDel='false']").hide();
+			}
+		};
+		/**閽堝鏃犲脊绐楃殑鏄剧ず妯″紡鏍规嵁鍔ㄦ�佹煡璇㈡潯浠舵瀯閫犲搴旂殑鏄剧ず鐣岄潰*/
+		instance.buildConditionHtmlForUnpopup = function(){
+			if(instance.config.conditionTextId){
+				var msgJq = $(instance.config.conditionTextId);
+				//msgJq.html("");
+				instance.render(msgJq);
+
+				msgJq.append($("<div class='xpl-dc-unpopup-btns'></div>"));
+				var btnDivJq = msgJq.find(".xpl-dc-unpopup-btns");
+				btnDivJq.width(instance.config.unpopupBtnswidth);
+				btnDivJq.append($("<a class='layui-btn xpl-unpopup-query'))>鏌ヨ</a>"));
+				var hideFlag = instance.config.unpopupShowAddBtn ? "" : " xpl-hide ";
+				btnDivJq.append($("<a class='layui-btn xpl-unpopup-add" + hideFlag + "'))>鏂板鏉′欢</a>"));
+				if(instance.config.extendBtns){
+					instance.config.extendBtns(btnDivJq,instance);
+				}
+				msgJq.append($("<div class='xpl-clear'></div>"));
+				btnDivJq.find(".xpl-unpopup-query").on("click",function(){
+					if(instance.verifyForm()){
+						//    				  layer.msg('鏍¢獙閫氳繃');
+						instance.buildCacheCondition();
+						instance.query();
+					}else{
+						//    				  layer.msg('鏍¢獙澶辫触');
+					}
+				});
+				btnDivJq.find(".xpl-unpopup-add").on("click",function(){
+					msgJq.find(".layui-xpl-dc-top-btns .addRowBtn").click();
+				});
+			}
+		};
+		/**鍒犻櫎鏉′欢*/
+		instance.deleteIns = function(ele){
+			var index = $(ele).parent().attr("index");
+			instance.cacheCondition.splice(index, 1);
+			instance.buildConditionHtml();
+			instance.query();
+		};
+		/**鏌ヨ*/
+		instance.query = function(callback){
+//    		instance.buildConditionHtml();
+			instance.buildRequestData();
+			if(instance.buildRequestData() == false){
+				return false
+			}
+			if(callback){
+				callback()
+			}
+			//ajax璇锋眰锛岄噸杞芥暟鎹�
+			if(instance.config.queryCallBack){
+				instance.config.queryCallBack(instance.requestData);
+			}
+			if(instance.config.tableId) {
+				//鏌ョ湅鏄惁鏈夋帓搴�
+				if (instance.config.sortObj) {
+					instance.requestData["sortField"] = sortObj.field; //鎺掑簭瀛楁
+					instance.requestData["sortOrder"] = sortObj.type; //鎺掑簭鏂瑰紡
+				}
+				//鍥犱负layui鐨則able浼氱紦瀛樹笂娆℃煡璇㈠弬鏁帮紝鎵�浠ュ垹闄ょ殑鏉′欢蹇呴』灏嗗師鍊肩疆绌恒�傚鏋滅洿鎺ュ皢鍘熸潯浠跺垹闄わ紝鍒欒姹備細甯︿笂涓婃缂撳瓨鐨勬潯浠躲��
+				var params = {};
+				if (instance.config.type == "simple") {
+					instance.lastRequestData = instance.lastRequestData || {};
+					//鍘熸潯浠剁疆绌�
+					for (var attr in instance.lastRequestData) {
+						instance.lastRequestData[attr] = '';//鍚庡彴鎺ユ敹鍙傛暟鏃讹紝璇峰拷鐣ョ┖瀛楃涓茬殑鏉′欢鍙傛暟銆�
+					}
+					$.extend(params, instance.lastRequestData);
+					$.extend(params, instance.requestData);
+					//缂撳瓨鏈鏌ヨ鏉′欢
+					instance.lastRequestData = params;
+				} else {
+					//澶嶅埗妯″紡璇锋眰鍙傛暟鏄暟缁勬ā寮忥紝閫氳繃鏁扮粍闀垮害鍙互鎺у埗锛屾墍浠ヤ笉鐢ㄨ�冭檻缂搇ayui缂撳瓨闂
+					params = instance.requestData;
+				}
+				var tableConfig = table.getConfig(instance.config.tableId)
+				if (tableConfig.page) {
+					tableConfig.page['curr'] = 1
+				} else {
+					tableConfig.page = {
+						curr: 1 //閲嶆柊鍔犺浇褰撳墠椤�
+					}
+				}
+				tableConfig.queryParams = params ? params : '**';
+				table.setConfig(tableConfig);
+				table.reload(instance.config.tableId);
+			}
+		}
+		/**鎵撳紑绐楀彛锛屽姩鎬佹坊鍔犳煡璇㈡潯浠�*/
+		instance.open = function(){
+			if(instance.config.displayModel == 'unpopup'){
+				//濡傛灉鏄潪寮圭獥妯″紡锛屽垯鐩存帴鏌ヨ锛屼笉寮瑰嚭绐楀彛銆�
+				$("#"+instance.conditionContainerId).find(".xpl-unpopup-query").click();
+				return ;
+			}
+			if($("#"+instance.conditionContainerId).length > 0){
+				//宸茬粡鎵撳紑浜嗭紝涓嶈兘閲嶅鎵撳紑銆�
+				return ;
+			}
+			instance.height = document.documentElement.clientHeight-100
+			//椤甸潰灞�-鑷畾涔�
+			instance.openPageIndex = layer.open({
+				type: 1,
+				id: 'dynamicCondition' + instance.conditionContainerId,//闃叉閲嶅寮瑰嚭
+				offset: '40px',
+				title: "楂樼骇鏌ヨ",
+				//closeBtn: 0,
+				shade: 0, //涓嶆樉绀洪伄缃�
+				area: [instance.width + 'px', instance.height +'px'], //瀹介珮
+				maxmin:true,
+//    		  content: conditionContainerHtml
+				content: "<div id='query"+instance.conditionContainerId+"'></div>"
+			});
+			instance.render($("#query"+instance.conditionContainerId));
+			$("#query"+instance.conditionContainerId).parents('.layui-layer-content').css("overflow-y", "auto")
+		}
+		/**娓叉煋寮瑰嚭鐣岄潰*/
+		instance.render = function(divJq){
+			divJq = divJq || $("#query"+instance.conditionContainerId);
+			var conditionContainerHtml = '<div id="'+instance.conditionContainerId+'" class="conditionContainer" lay-filter="conditionContainer">' +
+					'<div class="layui-xpl-dc-top-btns">' +
+						'<button type="button" href="javascript:void(0);" style="margin-left:10px;" class="layui-btn layui-btn-sm queryBtn" >' +
+							'<i class="layui-icon layui-icon-search" style="font-size: 30px; color: &#xe615;"></i>鏌ヨ' +
+						'</button>' +
+						//'<a href="javascript:void(0);" style="margin-left:10px;" class="layui-btn layui-btn-sm addRowBtn">' +
+							//'<i class="layui-icon layui-icon-add-circle-fine" style="font-size: 30px; color: &#xe608;"></i>澧炲姞鏉′欢' +
+						//'</a>' +
+						'<button type="button" href="javascript:void(0);" style="margin-left:10px;" class="layui-btn layui-btn-sm reversBtn" >' +
+							'<i class="layui-icon layui-icon-refresh" style="font-size: 30px; color: &#xe615;"></i>閲嶇疆' +
+						'</button>' +
+					'</div>' +
+					'<form class="conditionDiv layui-form" lay-filter="conditionDiv'+instance.conditionContainerId+'" onkeydown="if(event.keyCode==13){return false;}">' +
+					'</form>' +
+				'</div>';
+			divJq.append($(conditionContainerHtml));
+			var conditionContainerJq = $("#"+instance.conditionContainerId);
+			//娣诲姞 寮圭獥/闈炲脊绐� 鏍峰紡
+			if(instance.config.displayModel == "unpopup"){
+				conditionContainerJq.addClass("xpl-dc-unpopup");
+			}else{
+				conditionContainerJq.addClass("xpl-dc-popup");
+			}
+			//娣诲姞 澶嶆潅/绠�鍗� 鏍峰紡
+			if(instance.config.type == "complex"){
+				conditionContainerJq.addClass("xpl-dc-complex");
+			}else{
+				conditionContainerJq.addClass("xpl-dc-simple");
+			}
+			var cacheCondition = instance.cacheCondition;
+			for(var i=0;i<cacheCondition.length;i++){
+				var conditionObj = cacheCondition[i];
+				var conditionRowJq = instance.addRow(conditionObj.conditionValueType);
+				conditionRowJq.find("select[name='conditionField']").val(conditionObj.conditionFieldVal);
+				conditionRowJq.find("select[name='conditionOption']").val(conditionObj.conditionOptionVal);
+				instance.updateConditionValue(conditionRowJq, conditionObj);
+
+				var conditionFieldVal = conditionRowJq.find("select[name='conditionField']").val();
+				var item = instance.getObjByField(conditionObj.conditionFieldVal);
+				if(item.allowDel === "false"){
+					//闅愯棌鍒犻櫎鎸夐挳
+					conditionRowJq.find(".delRowBtn").hide();
+					//绉婚櫎鍏朵粬涓嬫媺閫夐」
+//		  			conditionRowJq.find("select[name='conditionField']").attr("disabled","disabled");
+					removeOption(conditionRowJq.find("select[name='conditionField']"),conditionObj.conditionFieldVal);
+				}
+			}
+			instance.afterOpen();
+			conditionContainerJq.css("margin","10px");
+			//鐩戝惉浜嬩欢
+			form.on('select(conditionField)', function(data){
+				if($(data.elem).find("option").length > 1){
+					var conditionRowJq = $(data.elem).parents(".conditionRow");
+					//鏇存柊鎿嶄綔閫夐」
+					var conditionOption= conditionRowJq.find(".conditionOption");
+					if($(this).attr('data-type')=='text'){
+						conditionOption.html(instance.conditionStringOptionHtml)
+					}else if($(this).attr('data-type')=='number'){
+						conditionOption.html(instance.conditionNumberOptionHtml)
+					}else if($(this).attr('data-type')=='date' ){
+						conditionOption.html(instance.conditionDateOptionHtml)
+					}else if($(this).attr('data-type') == 'refer'){
+						conditionOption.html(instance.conditionReferOptionHtml)
+					}else{
+						conditionOption.html(instance.conditionSelectOptionHtml)
+					}
+					//conditionOption.html(instance.conditionOptionHtml);
+					instance.updateConditionValue(conditionRowJq);
+					form.render(null, 'conditionDiv'+instance.conditionContainerId);
+					//$('.conditionField').find('.layui-input').css('border-width','0');
+					//$('.conditionField').find('.layui-edge').hide();
+				}
+			});
+			form.on('select(conditionOption)', function(data){
+				if($(data.elem).find("option").length > 1){
+					var conditionRowJq = $(data.elem).parents(".conditionRow");
+					if($(this).attr('data-type')=='number' || $(this).attr('data-type')=='date'){
+						instance.updateConditionValue(conditionRowJq);
+					}
+					// instance.updateConditionValue(conditionRowJq);
+				}
+			});
+			//鏂板
+			conditionContainerJq.find(".addRowBtn").on("click",function(){
+				var cacheCondition = instance.cacheCondition;
+				var rowJq = instance.addRow(cacheCondition[0].conditionValueType);
+				instance.updateConditionValue(rowJq);
+				form.render(null, 'conditionDiv'+instance.conditionContainerId);
+				//$('.conditionField').find('.layui-input').css('border-width','0');//layui-edge
+				//$('.conditionField').find('.layui-edge').hide();
+			});
+			var verify = form.config.verify
+			//鏌ヨ
+			conditionContainerJq.find(".queryBtn").on("click",function(){
+				if(instance.verifyForm(conditionContainerJq)){
+//    				  layer.msg('鏍¢獙閫氳繃');
+					instance.buildCacheCondition();
+					instance.buildConditionHtml();
+					instance.query(function(){
+						layer.close(instance.openPageIndex);
+						instance.openPageIndex  = null;
+					});
+
+
+				}else{
+//    				  layer.msg('鏍¢獙澶辫触');
+				}
+			});
+			// 閲嶇疆
+			conditionContainerJq.find(".reversBtn").on("click",function(){
+				//modify by weidy@2019-06-16
+				//閲嶇疆鍙妸鍊奸噸鏂拌缃�
+
+				instance.cacheCondition = instance.originalCondition
+				$("#query"+instance.conditionContainerId).html('');
+				instance.render($("#query"+instance.conditionContainerId));
+			});
+			form.render(null, 'conditionDiv'+instance.conditionContainerId);
+			//$('.conditionField').find('.layui-input').css('border-width','0');
+			//$('.conditionField').find('.layui-edge').hide();
+		}
+		/**娓叉煋鍚庢墽琛�*/
+		instance.afterOpen = function(){
+			if(instance.config.afterOpen){
+				instance.config.afterOpen(instance);
+			}
+
+
+		}
+		return instance;
+	}
+	var defaultValueConfig = {
+		type: 'complex',//鍙栧�硷細'simple'/'complex'榛樿涓哄鏉傛ā寮忋�傚尯鍒�1.鏄剧ず鐣岄潰涓嶄竴鏍凤紝2.鏋勯�犵殑requestData鏍煎紡涓嶄竴鏍枫��
+		requestDataType: 'array',//鍙栧�硷細'array'/'json'.璇锋眰鍙傛暟绫诲瀷銆傞粯璁rray銆�
+		instanceName: 'instanceName',//鍒涘缓鐨勫疄渚嬪悕绉般�傞潪蹇呴』銆傞粯璁や负'instanceName'銆傚綋涓�涓〉闈㈠彧鍒涘缓涓�涓疄渚嬫椂锛屽彲浠ヤ笉鐢ㄨ鍙傛暟
+		displayModel: 'unpopup',//鏄剧ず妯″瀷銆傚彇鍊硷細'popup'/'unpopup'銆� 榛樿"popup"鐐瑰嚮鍚庢彁鍑烘煡璇㈡潯浠惰缃獥鍙c�倁npopup妯″紡鍒欎笉寮瑰嚭绐楀彛锛岀洿鎺ュ湪鐣岄潰涓婅缃潯浠躲��
+		counts: 5,//榛樿鍒濆鍖栨潯浠舵暟銆�
+		popupMsgText: "鏌ヨ鏉′欢锛�",//寮圭獥妯″紡涓媘sg榛樿鎻愮ず鏂囨湰銆備箣鍓嶇増鏈粯璁や负鈥滄煡璇㈡潯浠讹細鈥�
+		popupBtnsWidth: 90,//寮圭獥妯″紡涓嬫寜閽伐鍏烽潰鏉垮搴︺��500px
+		popupShowQueryBtn: false, //寮圭獥妯″紡涓嬶紝鏄惁鏄剧ず鏌ヨ鎸夐挳銆備箣鍓嶇増鏈粯璁ゆ槸涓嶆樉绀虹殑
+		unpopupBtnswidth: 180,//闈炲脊绐楁ā寮忎笅鎸夐挳宸ュ叿闈㈡澘瀹藉害銆�500px
+		unpopupShowQueryBtn: false, //闈炲脊绐楁ā寮忎笅锛屾槸鍚︽樉绀烘柊澧炴潯浠舵寜閽�備箣鍓嶇増鏈粯璁ゆ槸涓嶆樉绀虹殑
+		defaultUrl : 'webEnumController/getEnum'
+	};
+	//缁ф壙鐢ㄦ埛鑷畾涔夐厤缃��
+	$.extend( defaultValueConfig, dcConfig);
+	var dynamicCondition = {
+		version:'2.0.6'
+		//缂栬緫鍣細鑷甫3涓粯璁ょ紪杈戝櫒锛氭枃鏈瑃ext锛屼笅鎷夋select锛屾棩鏈焏ate
+		,editor:{}
+		,defaultValue:defaultValueConfig
+		//缂撳瓨鍒涘缓鐨勫疄渚�
+		,cacheInstance:{}
+		//鏍规嵁杈撳叆鏋勯�犺姹傚弬鏁般�傝鎺ュ彛涓昏鏄釜宸ュ叿鍑芥暟锛屼究浜庣洿鎺ラ�氳繃js鐢熸垚璇锋眰鍙傛暟璋冪敤鍚庡彴鎺ュ彛銆�
+		,parseToRequest:function(conditionArr, type, requestDataType){
+			var cacheCondition = parseToCacheCondition(conditionArr, type);
+			var requestMap = parseToRequest(cacheCondition, type, requestDataType);
+			return requestMap;
+		}
+		/***
+		 * 鑾峰彇瀹炰緥
+		 * instanceName:瀹炰緥鍚嶇О銆傞潪蹇呴』銆傞粯璁や负'instanceName'.褰撲竴涓〉闈㈠彧鍒涘缓涓�涓疄渚嬫椂锛屽彲浠ヤ笉鐢ㄨ鍙傛暟
+		 */
+		,getInstance:function(instanceName){
+			instanceName = instanceName || this.defaultValue.instanceName;
+			return this.cacheInstance[instanceName];
+		}
+		/***
+		 * elem/fields/fieldsJsonStr锛氫笁閫変竴.
+		 * tableId/queryCallBack: 浜岄�変竴銆倀ableId瀵瑰簲table.render(config)鐨刢onfig.id鍙傛暟.鑷姩閲嶈浇琛ㄦ牸銆俼ueryCallBack(requestData)鍒欒嚜瀹氫箟鍥炶皟
+		 * type: 鍙栧�硷細'simple'/'complex'.榛樿涓哄鏉傛ā寮忋�傚尯鍒�1.鏄剧ず鐣岄潰涓嶄竴鏍凤紝2.鏋勯�犵殑requestData鏍煎紡涓嶄竴鏍枫��
+		 * requestDataType: 鍙栧�硷細'array'/'json'.璇锋眰鍙傛暟绫诲瀷銆傞粯璁rray銆�
+		 * conditionTextId: 鏄剧ず鏌ヨ鏉′欢鐨勯潰鏉块�夋嫨鍣ㄦ垨DOM銆傞潪蹇呴』銆備緥瀛愶細"#frm"
+		 * sortObj:鎺掑簭銆傞潪蹇呴』銆備緥瀛愶細{field:'name',type:'desc'}
+		 * instanceName: 鍒涘缓鐨勫疄渚嬪悕绉般�傞潪蹇呴』銆傞粯璁や负'instanceName'銆傚綋涓�涓〉闈㈠彧鍒涘缓涓�涓疄渚嬫椂锛屽彲浠ヤ笉鐢ㄨ鍙傛暟
+		 * displayModel: 鏄剧ず妯″瀷銆傚彇鍊硷細'popup'/'unpopup'銆� 榛樿"popup"鐐瑰嚮鍚庢彁鍑烘煡璇㈡潯浠惰缃獥鍙c�倁npopup妯″紡鍒欎笉寮瑰嚭绐楀彛锛岀洿鎺ュ湪鐣岄潰涓婅缃潯浠躲��
+		 */
+		,create:function(config){
+			var _config = {};
+			this.defaultValue.counts=config.fields.length;//鏌ヨ鏉′欢鍏ㄩ儴鍒濆鍖�
+			//鍔犺浇鐢ㄦ埛閰嶇疆, 绯荤粺榛樿鍊紅his.defaultValue 鈥斺�斻�嬬敤鎴峰畾涔夐粯璁ゅ�糳cConfig 鈥斺�斻�嬮〉闈㈠疄渚嬪寲榛樿鍊糲onfig
+			$.extend( _config ,this.defaultValue, config);
+			config = _config;
+			var instance = createInstance(config);
+			//鍒濆鍖杋nstance.data
+			if(config.fields){
+				instance.data = config.fields;
+			}
+			else if(config.fieldsJsonStr){
+				instance.data = $.parseJSON(config.fieldsJsonStr);
+			}
+			else if(config.elem){ //鎸囧畾瀹瑰櫒鐨勯�夋嫨鍣ㄦ垨 DOM锛屾柟娉曟覆鏌撴柟寮忓繀濉�.绀轰緥"#dcDemo"锛屾垨鑰匘OM
+				var liObjs = $(config.elem).find("li");
+				liObjs.each(function(){
+					var item = {};
+					//attrList鏁扮粍涓殑灞炴�э紝閫氳繃this.attributes鑾峰彇鍒板睘鎬у悕绉板彲鑳藉彉灏忓啓銆傛墍浠ラ渶瑕佺壒鍒鐞嗕笅銆�
+					var attrList = ["allowDel"];
+					var attrLowerList = [];
+					for(var i=0;i<attrList.length;i++){
+						attrLowerList.push(attrList[i].toLowerCase());
+					}
+					$.each(this.attributes, function() {
+						// this.attributes is not a plain object, but an array
+						// of attribute nodes, which contain both the name and value
+						if(this.specified) {
+							var idx = attrLowerList.indexOf(this.name.toLowerCase())
+							item[idx == -1 ? this.name : attrList[idx]]= this.value
+						}
+					});
+					instance.data.push(item);
+				})
+			}
+			//璁惧畾榛樿鍊�
+			for(var i = 0;i<instance.data.length;i++){
+				var item = instance.data[i];
+				item.edit = item.edit || item.type || "text";
+				if (item.edit == 'combox') {
+					item.edit = 'select'
+				}
+				if(item.edit=="normal" || item.edit=='true' || item.edit=='false'){
+					item.edit='text';
+				}
+				item.field = item.sortField || item.field;
+				item.allowDel = typeof item.allowDel == "undefined" ? "true" : ""+item.allowDel;
+				item.placeholder = item.placeholder || "";
+				item.dateType = item.dateType || "date";
+			}
+			//瀛楁 涓嬫媺妗唄tml
+			var selectConditionField = $('<select name="conditionField" lay-filter="conditionField"></select>');
+			var items = instance.data;
+			instance.fieldList = "";
+			instance.showItems = [];
+			for(var i=0;i< items.length;i++) {
+				if (items[i].show != "false" && items[i].field != "LAY_CHECKED" && items[i].field != "LAY_TABLE_INDEX") {
+					instance.showItems.push(items[i]);
+					selectConditionField.append("<option value='" + items[i].field + "' data-type='" + items[i].edit + "'>" + items[i].title + "</option>");
+					if (items[i].allowDel != "false") {
+						instance.fieldList += "," + items[i].field;
+					}
+				}
+			}
+			instance.conditionFieldHtml = selectConditionField.prop("outerHTML");
+			//鎿嶄綔 涓嬫媺妗唄tml
+			var selectconditionOption = $('<select name="conditionOption" lay-filter="conditionOption"></select>');
+			selectconditionOption.append("<option value='like'>鍖呭惈</option>");
+			selectconditionOption.append("<option value='equal'>绛変簬</option>");
+
+			selectconditionOption.append("<option value='>'>澶т簬</option>");
+			selectconditionOption.append("<option value='<'>灏忎簬</option>");
+			selectconditionOption.append("<option value='!='>涓嶇瓑浜�</option>");
+			selectconditionOption.append("<option value='>='>澶т簬绛変簬</option>");
+			selectconditionOption.append("<option value='<='>灏忎簬绛変簬</option>");
+			selectconditionOption.append("<option value='between'>鑼冨洿</option>");
+			instance.conditionOptionHtml = selectconditionOption.prop("outerHTML");
+
+			var selectconditionOptionRefer = $('<select name="conditionOption" lay-filter="conditionOption"></select>');
+			selectconditionOptionRefer.append("<option value='equal' >绛変簬</option>");
+			instance.conditionReferOptionHtml = selectconditionOptionRefer.prop("outerHTML");
+
+			var selectconditionOptionString = $('<select name="conditionOption" lay-filter="conditionOption"></select>');
+			selectconditionOptionString.append("<option value='like'>鍖呭惈</option>");
+			selectconditionOptionString.append("<option value='equal' >绛変簬</option>");
+
+			instance.conditionStringOptionHtml = selectconditionOptionString.prop("outerHTML");
+
+			var selectconditionOptionNumber = $('<select name="conditionOption" lay-filter="conditionOption"></select>');
+			selectconditionOptionNumber.append("<option value='equal' data-type='number'>绛変簬</option>");
+			selectconditionOptionNumber.append("<option value='>' data-type='number'>澶т簬</option>");
+			selectconditionOptionNumber.append("<option value='<' data-type='number'>灏忎簬</option>");
+			selectconditionOptionNumber.append("<option value='!=' data-type='number'>涓嶇瓑浜�</option>");
+			selectconditionOptionNumber.append("<option value='>=' data-type='number'>澶т簬绛変簬</option>");
+			selectconditionOptionNumber.append("<option value='<=' data-type='number'>灏忎簬绛変簬</option>");
+			selectconditionOptionNumber.append("<option value='between' data-type='number'>鑼冨洿</option>");
+			instance.conditionNumberOptionHtml = selectconditionOptionNumber.prop("outerHTML");
+
+			var selectconditionOptionDate = $('<select name="conditionOption" lay-filter="conditionOption"></select>');
+			selectconditionOptionDate.append("<option value='equal' data-type='date'>绛変簬</option>");
+			selectconditionOptionDate.append("<option value='>' data-type='date'>澶т簬</option>");
+			selectconditionOptionDate.append("<option value='<' data-type='date'>灏忎簬</option>");
+			selectconditionOptionDate.append("<option value='!=' data-type='date'>涓嶇瓑浜�</option>");
+			selectconditionOptionDate.append("<option value='>=' data-type='date'>澶т簬绛変簬</option>");
+			selectconditionOptionDate.append("<option value='<=' data-type='date'>灏忎簬绛変簬</option>");
+			selectconditionOptionDate.append("<option value='between' data-type='date'>鑼冨洿</option>");
+			instance.conditionDateOptionHtml = selectconditionOptionDate.prop("outerHTML");
+
+			var selectconditionOptionSelect = $('<select name="conditionOption" lay-filter="conditionOption"></select>');
+			selectconditionOptionSelect.append("<option value='equal'>绛変簬</option>");
+			selectconditionOptionSelect.append("<option value='!='>涓嶇瓑浜�</option>");
+			instance.conditionSelectOptionHtml = selectconditionOptionSelect.prop("outerHTML");
+			//缂撳瓨瀹炰緥
+			this.cacheInstance[config.instanceName] = instance;
+			var conditionArr = [];
+			if(config.counts){
+				for(var i=0;i<config.counts && i<instance.showItems.length;i++){
+					var conditionObj = [instance.showItems[i].field];
+					var _item = instance.showItems[i];
+					var ops = _item.ops;
+					if(ops){
+						var idx = ops.indexOf(",");
+						conditionObj.push(idx == -1 ? ops : ops.substring(0,idx));
+					}else{
+						conditionObj.push(null);
+					}
+					conditionArr.push(conditionObj);
+				}
+			}
+			instance.setCondition(conditionArr);
+			return instance;
+		}
+	};
+	var editor = {
+		/***
+		 * 鐢熸垚DOM瀵硅薄ele,jquery灏佽杩斿洖$(ele)
+		 * item: li鏍囩瑙f瀽鐨勫搴攋son瀵硅薄
+		 * return ele,鎴栬��$(ele)
+		 */
+		createElement:function(item){
+			return $("<div></div>");
+		}
+		/***
+		 * 鍒濆鍊煎~鍏匘OM
+		 * ele createElement 鐢熸垚鐨勫璞�
+		 * val 鍊�
+		 */
+		,fillElement:function(ele, val){
+			$(ele).val(val.value);
+			$(ele).attr("oldVal",val.value);
+		}
+		/***
+		 * 鐢ㄤ簬ajax璇锋眰鎻愪氦鐨勫弬鏁板��
+		 */
+		,getRequestValue:function(ele){
+			return $(ele).val();
+		}
+		/***
+		 * 鏌ヨ鏉′欢涓樉绀虹殑鍊�,榛樿涓巊etRequestValue涓�鑷�
+		 */
+		,getRequestText:function(ele){
+			return this.getRequestValue(ele);
+		}
+		/***
+		 * ele鍒涘缓鍚庢覆鏌�
+		 * ele: createElement 鐢熸垚鐨勫璞�
+		 * item: li鏍囩瑙f瀽鐨勫搴攋son瀵硅薄
+		 */
+		,render:function(ele, item){
+		}
+	};
+	/***
+	 * 鍒涘缓涓�涓紪杈戝櫒銆�
+	 * editorName 缂栬緫鍣ㄥ悕绉�
+	 */
+	dynamicCondition.createEditor = function(editorName, defEditor){
+		defEditor = defEditor || {};
+		dynamicCondition.editor[editorName] = {};
+		$.extend( dynamicCondition.editor[editorName] , editor, defEditor);
+		return dynamicCondition.editor[editorName];
+	}
+	//瀹氫箟鏂囨湰缂栬緫鍣�
+	var editorText = dynamicCondition.createEditor("text");
+	$.extend( editorText ,{
+		createElement:function(item,call){
+			var inputJq = $('<input type="text" class="layui-input" placeholder="'+item.placeholder+'" />');
+			if(item.layVerify){
+				inputJq.attr("lay-verify", item.layVerify);
+			}
+			//return inputJq;
+			if(call){
+				call(inputJq)
+			}
+		}
+	});
+	//瀹氫箟refer缂栬緫鍣�   edit="refer"
+	var editorRefer = dynamicCondition.createEditor("refer");
+	$.extend( editorRefer ,{
+		createElement:function(item,call){
+			var optionsHtml ="";
+			var referConfigString = JSON.stringify(item.referConfig,function(key, val) {
+				if (typeof val === 'function') {
+					return val + '';
+				}
+				return val;
+			});
+			if(!item.showField){
+				item.showField=item.field+'Name'
+			}
+			var selectElem = $('<select name = "'+ item.field +'" lay-filter="'+ item.field +'" lay-refer-showfield="'+ item.showField +'" indialog="true" lay-refer=\'' + referConfigString + '\' ></select>');
+			optionsHtml = '<option value=""></option>';
+			selectElem.append(optionsHtml);
+			selectElem = selectElem.prop("outerHTML");
+			var select = $(selectElem);
+			form.referFieldsMap['conditionDiv'+dynamicCondition.getInstance().conditionContainerId + "${refer}" + item.field] = item;
+			if(call){
+				call(select)
+			}
+		}
+	});
+	//瀹氫箟boolean缂栬緫鍣�
+	var editorBoolean = dynamicCondition.createEditor("boolean");
+	$.extend( editorBoolean ,{
+		createElement:function(item,call){
+			var optionsHtml ="";
+			var selectElem = $('<select></select>');
+			optionsHtml = '<option value=""></option>';
+			optionsHtml += '<option value="true">鏄�</option>';
+			optionsHtml += '<option value="false">鍚�</option>';
+			selectElem.append(optionsHtml);
+			selectElem = selectElem.prop("outerHTML");
+			var select = $(selectElem);
+			if(call){
+				call(select)
+			}
+		}
+	});
+	//瀹氫箟鏁板瓧缂栬緫鍣�
+	var editorNumber = dynamicCondition.createEditor("number");
+	$.extend( editorNumber ,{
+		createElement:function(item,call){
+			var inputJq = $('<input type="number" class="layui-input" placeholder="'+item.placeholder+'" />');
+			if(item.layVerify){
+				inputJq.attr("lay-verify", item.layVerify);
+			}
+			//return inputJq;
+			if(call){
+				call(inputJq)
+			}
+		}
+	});
+	//瀹氫箟涓嬫媺妗嗙紪杈戝櫒
+	// var editorSelect = dynamicCondition.createEditor("select");
+	// $.extend( editorSelect ,{
+	// 		createElement:function(item,call){
+	// 		var comboxKey = item.comboxKey;
+	// 		var options = {
+	// 			  callback:function(comboxKey,data){
+	// 				  //缁欎笅鎷夎彍鍗曡缃唴瀹�
+	// 				  var optionsHtml ="";
+	// 				var selectElem = $('<select></select>');
+	// 					  optionsHtml = '<option value=""></option>';
+	//                               var i = 0
+	//                               for(var key in data){
+	//                                   optionsHtml += '<option value="' + key + '">' + data[key] + '</option>';
+	//                                   i++;
+	//                               };
+	// 					  selectElem.append(optionsHtml);
+	// 					  selectElem = selectElem.prop("outerHTML");
+	// 					  var select = $(selectElem);
+	// 					  if(call){
+	// 						  call(select)
+	// 					  }
+	// 					  //return select
+	// 			  }
+	// 		  };
+	// 		  if("data" in item){
+	// 			  options['data'] = item['data'];
+	// 		  }else{
+	// 			  if("url" in item){
+	// 				  options['url'] = item['url'];
+	// 			  }else{
+	// 				  options['url'] = "default";
+	// 			  }
+	// 		  }
+	// 		  if(comboxKey){
+	// 			  var combox = layui.vciWebComboxStore;
+	// 			combox.newCombox(item.comboxKey,options,false);
+	// 		  }
+
+	// 		}
+	//     ,getRequestText:function(ele){
+	// 		return  ele.find("option:selected").text();
+	// 	}
+	// });
+
+	var editorSelect = dynamicCondition.createEditor("select");
+	$.extend( editorSelect ,{
+		createElement:function(item,call) {
+			if ((typeof item.comboxKey) == 'object') {
+				var data = item.comboxKey;
+				var optionsHtml = "";
+				var selectElem = $('<select '+(item.search?' lay-search=""':'')+'></select>');
+				optionsHtml = '<option value=""></option>';
+				if(data.length){
+					for (var i = 0; i < data.length; i++) {
+						optionsHtml += '<option value="' + data[i].key + '">' + data[i].value + '</option>';
+					}
+				}else{
+					for (var i in data){
+						optionsHtml += '<option value="' + i + '">' + data[i] + '</option>';
+					}
+				}
+
+				selectElem.append(optionsHtml);
+				selectElem = selectElem.prop("outerHTML");
+				var select = $(selectElem);
+				if (call) {
+					call(select)
+				}
+			} else {
+				var comboxKey = item.comboxKey;
+				var requestData = {
+					comboxKey: comboxKey,
+					id: comboxKey
+				};
+				$webUtil.synchro(dynamicCondition.defaultValue.defaultUrl, requestData, function (result) {
+					if (result.success) {
+						var optionsHtml = "";
+						var selectElem = $('<select '+(item.search?' lay-search=""':'')+'></select>');
+						optionsHtml = '<option value=""></option>';
+						var i = 0
+						if (result.data && result.data.length > 0) {
+							for (i = 0; i < result.data.length; i++) {
+								optionsHtml += '<option value="' + result.data[i].key + '">' + result.data[i].value + '</option>';
+							}
+						} else {
+							for (var key in result.obj) {
+								if(result.obj[key] && result.obj[key].key){
+									optionsHtml += '<option value="' + result.obj[key].key + '">' + result.obj[key].value + '</option>';
+									i++;
+								}
+							}
+						}
+
+						selectElem.append(optionsHtml);
+						selectElem = selectElem.prop("outerHTML");
+						var select = $(selectElem);
+						if (call) {
+							call(select)
+						}
+					}
+				}, function (x, r) {
+					$webUtil.showErrorMsg("鑾峰彇鏋氫妇鐨勫唴瀹瑰嚭閿欙紝鍙兘鏈嶅姟鍣ㄦ病鏈夊惎鍔�");
+				}, '', false, true);
+			}
+		}
+		,getRequestText:function(ele){
+			return  ele.find("option:selected").text();
+		}
+	});
+
+
+	//瀹氫箟鏃ユ湡缂栬緫鍣�
+	var editorDate = dynamicCondition.createEditor("date");
+	$.extend( editorDate ,{
+		createElement:function(item,call){
+			var dateType = item.dateType || "date";
+			var dateJq = $('<input type="text" class="layui-input" placeholder="'+item.placeholder+'" />');
+			dateJq.attr("date-type",dateType);
+			if(item.layVerify){
+				dateJq.attr("lay-verify",item.layVerify);
+			}
+			laydate.render({
+				elem: dateJq[0]
+				,type: dateType
+			});
+			//return dateJq;
+			if(call){
+				call(dateJq)
+			}
+		}
+	});
+	/***
+	 * selDom涓嬫媺閫夐」鐨勫�间笉鍦╲alList鍒楄〃涓紝鍒欑Щ闄�
+	 */
+	function removeOption(selDom,valList){
+		valList = ","+valList + ",";
+		var opJqs = $(selDom).find("option").each(function() {
+			if(valList.indexOf(","+ $(this).val() + ",") == -1){
+				$(this).remove();
+			}
+		});
+	}
+	/**
+	 * 鏍规嵁浼犲弬鏋勯�燾acheCondition
+	 */
+	function parseToCacheCondition(conditionArr, type){
+		type = type || defaultValueConfig.type;
+		//缂撳瓨鏌ヨ鏉′欢
+		var cacheCondition = [];
+		for(var i=0;i<conditionArr.length;i++){
+			var curCondition = conditionArr[i];
+			var conditionObj = {};
+			conditionObj.conditionFieldVal = curCondition[0];
+			if(!curCondition[1]  || type =="simple"){
+				curCondition[1] = "equal";
+			}
+			conditionObj.conditionOptionVal = curCondition[1];
+
+			curCondition[2] = curCondition[2] || "";
+			curCondition[3] = curCondition[3] || "";
+			curCondition[4] = curCondition[4] || "";
+			curCondition[5] = curCondition[5] || "";
+			curCondition[6] = curCondition[6] || "";
+			curCondition[7] = curCondition[7] || "";
+			conditionObj.conditionValueVal = tempVal
+			conditionObj.conditionValueLeftVal = tempVal
+			conditionObj.conditionValueRightVal = tempVal
+			//濡傛灉绗笁涓弬鏁癱urCondition[2]鏄璞★紝璇存槑鍏跺�兼槸{value:"",text:""}鏍煎紡锛屼笉鏄璞″垯锛岀粺涓�杞崲涓鸿鏍煎紡
+			var valTemp2 = curCondition[2];
+			if(typeof curCondition[2] != "object"){
+				valTemp2 = {value:curCondition[2],text:curCondition[2]};
+			}
+			if(curCondition[1] == "between"){
+				conditionObj.conditionValueLeftVal = valTemp2;
+				if(typeof curCondition[3] == "object"){//between閫夐」鎵嶈�冭檻绗�4涓弬鏁帮紝鍚﹀垯蹇界暐浠�
+					conditionObj.conditionValueRightVal = curCondition[3];
+				}else{
+					conditionObj.conditionValueRightVal = {value:curCondition[3],text:curCondition[3]};
+				}
+			}else{
+				conditionObj.conditionValueVal = valTemp2;
+			}
+			conditionObj.conditionRefer = curCondition[4];
+			conditionObj.conditionValueType = curCondition[5];
+			conditionObj.conditionReferField = curCondition[6];
+			conditionObj.conditionReferConfig = curCondition[6];
+			cacheCondition.push(conditionObj);
+		}
+		return cacheCondition;
+	}
+
+	/***
+	 * 鏍规嵁浼犲弬鏋勯�犲搴旂殑璇锋眰鍙傛暟.
+	 * cacheCondition 鏌ヨ鏉′欢
+	 * type  绠�鍗曟ā寮� simple 鍜屽鏉傛ā寮�, 榛樿
+	 * requestDataType 璇锋眰鏁版嵁鏍煎紡'array'/'json'锛� 榛樿涓篴rray
+	 */
+	function parseToRequest(cacheCondition, type, requestDataType){
+		type = type || defaultValueConfig.type;
+		requestDataType = requestDataType || defaultValueConfig.requestDataType;
+		var requestData = {};
+		var rowLength = cacheCondition.length;
+		var emptyRequestData = {}
+		//绠�鍗曟ā寮�
+		if(type == "simple"){
+			for(var i=0;i<rowLength;i++){
+				var conditionObj = cacheCondition[i];
+				requestData[conditionObj.conditionFieldVal] = conditionObj.conditionValueVal.value;
+			}
+			return requestData;
+		}
+		//澶嶆潅妯″紡
+		if(requestDataType == "json"){//缁撴灉涓簀son瀛楃涓叉ā寮�
+			return {jsonStr: JSON.stringify(cacheCondition)};
+		};
+		//requestData.rowLength = rowLength;
+		for(var i=0;i<rowLength;i++){
+			var conditionObj = cacheCondition[i];
+			var fieldVal = '';
+			if(conditionObj.conditionValueVal.value || conditionObj.conditionValueLeftVal.value){
+				if(requestData['conditionMap["'+conditionObj.conditionFieldVal +'"]'] || requestData['conditionMap["'+conditionObj.conditionFieldVal.substring(0,conditionObj.conditionFieldVal.length-4) +'"]'] ){
+					$webUtil.showErrorMsg('瀛樺湪閲嶅鏌ヨ鏉′欢锛岃浠旂粏鏍稿');
+					return false
+				}
+				//鍙傜収
+				if(conditionObj.conditionRefer){
+					if(conditionObj.conditionReferField != null){
+						fieldVal = conditionObj.conditionReferField
+					}else{
+						if(conditionObj.conditionFieldVal.slice(-4)== 'name'){
+							fieldVal = conditionObj.conditionFieldVal.substring(0,conditionObj.conditionFieldVal.length-4)+((conditionObj.conditionReferConfig)?'':'.name');
+						}
+					}
+				}else{
+					fieldVal = conditionObj.conditionFieldVal
+				}
+				//鏋氫妇
+				if( conditionObj.conditionFieldVal.slice(-4)== 'Text'){
+					fieldVal = conditionObj.conditionFieldVal.substring(0,conditionObj.conditionFieldVal.length-4);
+				}else if(conditionObj.conditionFieldVal.split('_')[1] == 'text'){
+					fieldVal = conditionObj.conditionFieldVal.split('_')[0];
+				}else{
+
+				}
+
+				if(conditionObj.conditionOptionVal == 'like'){
+					requestData['conditionMap["'+fieldVal +'"]'] = "*" + conditionObj.conditionValueVal.value + "*";
+				}else if(conditionObj.conditionOptionVal == 'equal'){
+					var valueVal = conditionObj.conditionValueVal.value
+					if(conditionObj.conditionReferConfig){
+						// var valueVal = '\\IN(';
+						// valueVal+=conditionObj.conditionValueVal.value;
+						// valueVal += ')';
+						;
+						requestData['conditionMap["'+fieldVal +'"]'] =  valueVal;
+					}else{
+						requestData['conditionMap["'+fieldVal +'"]'] =  valueVal;
+					}
+				}else if(conditionObj.conditionOptionVal == 'between'){
+					var leftVal = conditionObj.conditionValueLeftVal.value;
+					var rightVal = conditionObj.conditionValueRightVal.value;
+					if(parseInt(rightVal)<parseInt(leftVal)){
+						$webUtil.showErrorMsg("璇锋牳瀵硅寖鍥�")
+						return false;
+					}
+					if(conditionObj.conditionValueType=='date'){
+						leftVal = conditionObj.conditionValueLeftVal.value+" 00:00:00";
+						rightVal = conditionObj.conditionValueRightVal.value+" 23:59:59";
+					}
+					requestData['conditionMap["'+conditionObj.conditionFieldVal +'_start"]'] =  leftVal;
+					requestData['conditionMap["'+conditionObj.conditionFieldVal +'_end"]'] =  rightVal;
+				}else{
+					if(conditionObj.conditionValueType=='date'){
+						if(conditionObj.conditionOptionVal == '>' || conditionObj.conditionOptionVal == '>='  ){
+							requestData['conditionMap["'+conditionObj.conditionFieldVal +'"]'] = conditionObj.conditionOptionVal+conditionObj.conditionValueVal.value+" 00:00:00";
+						}else if(conditionObj.conditionOptionVal == '<' || conditionObj.conditionOptionVal == '<=' ){
+							requestData['conditionMap["'+conditionObj.conditionFieldVal +'"]'] = conditionObj.conditionOptionVal+conditionObj.conditionValueVal.value+" 23:59:59";
+						}else{
+							requestData['conditionMap["'+conditionObj.conditionFieldVal +'"]'] = conditionObj.conditionOptionVal+conditionObj.conditionValueVal.value
+						}
+						//requestData['conditionMap["'+conditionObj.conditionFieldVal +'"]'] = conditionObj.conditionOptionVal+conditionObj.conditionValueVal.value;
+					}else{
+						if( conditionObj.conditionFieldVal.slice(-4)== 'Text'){
+							fieldVal = conditionObj.conditionFieldVal.substring(0,conditionObj.conditionFieldVal.length-4);
+							requestData['conditionMap["'+fieldVal +'"]'] = conditionObj.conditionOptionVal+ conditionObj.conditionValueVal.value;
+						}else{
+							requestData['conditionMap["'+conditionObj.conditionFieldVal +'"]'] = conditionObj.conditionOptionVal+conditionObj.conditionValueVal.value;
+						}
+
+					}
+				}
+			}else{
+				var emptyFieldVal = '';
+				if(conditionObj.conditionRefer){
+
+					if(conditionObj.conditionReferField != null){
+						emptyFieldVal = conditionObj.conditionReferField
+					}else{
+						if(conditionObj.conditionFieldVal.slice(-4)== 'name'){
+							emptyFieldVal = conditionObj.conditionFieldVal.substring(0,conditionObj.conditionFieldVal.length-4)+((conditionObj.conditionReferConfig)?'':'.name');
+						}
+					}
+					requestData['conditionMap["'+emptyFieldVal +'"]'] = "";
+				}else if( conditionObj.conditionFieldVal.slice(-4)== 'Text'){
+					emptyFieldVal = conditionObj.conditionFieldVal.substring(0,conditionObj.conditionFieldVal.length-4);
+					requestData['conditionMap["'+emptyFieldVal +'"]'] = "";
+				}else if(conditionObj.conditionFieldVal.split('_')[1] == 'text'){
+					emptyFieldVal = conditionObj.conditionFieldVal.split('_')[0];
+					requestData['conditionMap["'+emptyFieldVal +'"]'] = "";
+				}
+				else{
+					requestData['conditionMap["'+conditionObj.conditionFieldVal +'"]'] = "";
+				}
+			}
+
+			if(JSON.stringify(requestData) == "{}"){
+
+
+				//requestData['conditionMap["'+conditionObj.conditionFieldVal +'"]'] = "**"
+			}
+			/* requestData["QueryCondition["+i+"].conditionField"] = conditionObj.conditionFieldVal;
+			requestData["QueryCondition["+i+"].conditionOption"] = conditionObj.conditionOptionVal;
+			requestData["QueryCondition["+i+"].conditionValue"] = conditionObj.conditionValueVal.value;
+			requestData["QueryCondition["+i+"].conditionValueLeft"] = conditionObj.conditionValueLeftVal.value;
+			requestData["QueryCondition["+i+"].conditionValueRight"] = conditionObj.conditionValueRightVal.value; */
+
+		}
+		if(JSON.stringify(requestData) == "{}"){
+			requestData = emptyRequestData
+		}
+		return requestData;
+	}
+	if(dcConfig.extendDC){
+		//鎻掍欢鎵╁睍
+		dcConfig.extendDC(dynamicCondition);
+	}
+
+	exports(MOD_NAME, dynamicCondition);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/formulaEditor.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/formulaEditor.js
new file mode 100644
index 0000000..43191b9
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/formulaEditor.js
@@ -0,0 +1,466 @@
+/**
+ * 鍏紡缂栬緫鍣�
+ * @author wangting
+ * @date 2022-2-15
+ */
+layui.define(['layer','element','form','table','dynamicCondition' ,'tree'],function(exports){
+    var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "formulaEditor";
+        this.moduleKey = "formulaEditor";
+        this.id = "formulaEditor";
+        this.backPath =  configData.compatibility? path:configData.objectServicePath;
+        this.getContent=function(){
+            var that = this;
+            var filter = "compuse_" + that.id;
+            var html=[
+                '<div class="easyui-layout UIContentLayout"  id="easyuiLayout_',filter,'" data-options="fit:true" style="display:block;overflow-y: hidden;">',
+                '<div data-options="region:\'center\',split:true" style="border:0;">',
+                    '<div id="easyuiLayoutCenter_',filter,'" class="easyui-layout" data-options="fit:true">',
+                        '<div data-options="region:\'center\',split:true" title="鍏紡鍐呭" style="padding: 5px;">',
+                            '<div>',
+                                '<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                                '<div layui-filter="toolbar_',filter,'" class="layui-btn-container layui-buttons" style="margin-left:110px">',
+                                    // '<button class="layui-btn layui-btn-sm toolbar_',filter,'_verify">楠岃瘉鍏紡</button>',
+                                    '<button class="layui-btn layui-btn-sm toolbar_',filter,'_chear">娓呯┖鍐呭</button>',
+                                    '<button class="layui-btn layui-btn-sm toolbar_',filter,'_add">&nbsp;纭畾&nbsp;</button>',
+                                '</div>',
+                            '</div>',
+                        '</div>',
+                        '<div data-options="region:\'east\',split:true" title="杩愮畻绗�" style="width:350px;padding: 2px 5px 5px 25px;">',
+                            that.getOperatorHtml(),
+                        '</div>',
+                    '</div>',
+                '</div>',
+                '<div data-options="region:\'south\',split:true" title="鍏紡閫夋嫨" style="height:360px;">',
+                    '<div id="easyuiLayoutSouth_',filter,'" class="easyui-layout" data-options="fit:true">',
+                        '<div data-options="region:\'center\',split:true" style="border-bottom:0;border-left:0;border-top: 0;padding: 5px;">',
+                            '<div style="">',
+                                '<div class="layui-layout-border layui-tab" style="display:block;margin:0px;">',
+                                    '<ul class="layui-tab-title tabTitle" lay-allowClose="false">',
+                                        '<li class="layui-this">甯哥敤</li>',
+                                        '<li>璐㈠姟</li>',
+                                        '<li>鏃ユ湡</li>',
+                                        '<li>鏁板</li>',
+                                        '<li>鍏朵粬</li>',
+                                    '</ul>',
+                                    '<ul class="layui-tab-content tabContent">',
+                                        '<li class="layui-tab-item formula-div layui-show">',
+                                            that.getFormulaFaHtml(),
+                                        '</li>',
+                                        '<li class="layui-tab-item formula-div">',
+                                            that.getFormulaSiHtml(),
+                                        '</li>',
+                                        '<li class="layui-tab-item formula-div">',
+                                            that.getFormulaDateHtml(),
+                                        '</li>',
+                                        '<li class="layui-tab-item formula-div">',
+                                            that.getFormulaMathHtml(),
+                                        '</li>',
+                                        '<li class="layui-tab-item formula-div">',
+                                            that.getFormulaOtherHtml(),
+                                        '</li>',
+                                    '</ul>',
+                                '</div>',
+                            '</div>',
+                        '</div>',
+                        '<div data-options="region:\'east\',split:true" style="width:350px;border-bottom:0;border-right:0;border-top: 0;padding: 5px;">',
+                            '<div style="">',
+                                '<div class="layui-layout-border layui-tab" style="display:block;margin:0px;">',
+                                    '<ul class="layui-tab-title tabTitle" lay-allowClose="false">',
+                                        '<li class="layui-this">鏈満鏅彉閲�</li>',
+                                        '<li>绯荤粺鍙橀噺</li>',
+                                    '</ul>',
+                                    '<ul class="layui-tab-content tabContent">',
+                                        '<li class="layui-tab-item layui-show">',
+                                            that.getThisVarHtml(),
+                                        '</li>',
+                                        '<li class="layui-tab-item formula-div">',
+                                            that.getSysVarHtml(),
+                                        '</li>',
+                                    '</ul>',
+                                '</div>',
+                            '</div>',
+                        '</div>',
+                    '</div>',
+                '</div>',
+                '</div>'
+            ]
+            return html.join('');
+        };
+        this.getOperatorHtml = function(){
+            var that=this;
+            var filter ="compuse_" + that.id;
+            var html=['<div style="">',
+                    '<style type="text/css">',
+                    '.operator_',filter,' .layui-btn{width:60px;}',
+                    '</style>',
+                    '<div layui-filter="operator_',filter,'" class="layui-btn-container layui-buttons operator_',filter,'" style="">',
+                        '<button class="layui-btn layui-btn-sm">7</button>',
+                        '<button class="layui-btn layui-btn-sm">8</button>',
+                        '<button class="layui-btn layui-btn-sm">9</button>',
+                        '<button class="layui-btn layui-btn-sm">/</button><br/>',
+                        '<button class="layui-btn layui-btn-sm">4</button>',
+                        '<button class="layui-btn layui-btn-sm">5</button>',
+                        '<button class="layui-btn layui-btn-sm">6</button>',
+                        '<button class="layui-btn layui-btn-sm">*</button><br/>',
+                        '<button class="layui-btn layui-btn-sm">1</button>',
+                        '<button class="layui-btn layui-btn-sm">2</button>',
+                        '<button class="layui-btn layui-btn-sm">3</button>',
+                        '<button class="layui-btn layui-btn-sm">-</button><br/>',
+                        '<button class="layui-btn layui-btn-sm">0</button>',
+                        '<button class="layui-btn layui-btn-sm">00</button>',
+                        '<button class="layui-btn layui-btn-sm">.</button>',
+                        '<button class="layui-btn layui-btn-sm">+</button><br/>',
+                        '<button class="layui-btn layui-btn-sm">-></button>',
+                        '<button class="layui-btn layui-btn-sm">==</button>',
+                        '<button class="layui-btn layui-btn-sm">(</button>',
+                        '<button class="layui-btn layui-btn-sm">)</button><br/>',
+                        '<button class="layui-btn layui-btn-sm"><</button>',
+                        '<button class="layui-btn layui-btn-sm">></button>',
+                        '<button class="layui-btn layui-btn-sm"><=</button>',
+                        '<button class="layui-btn layui-btn-sm">>=</button>',
+                    '</div>',
+                '</div>']
+            return html.join('')
+        }
+        this.getFormulaMathHtml = function() {
+            var that = this;
+            var filter = "compuse_" + that.id;
+            var html = ['<table lay-filter="formula-table-math">',
+                '   <thead>',
+                '    <tr><th lay-data="{field:\'id\', width:257}">鍏紡</th><th lay-data="{field:\'name\', width:355}">鎻忚堪</th></tr>',
+                '   </thead>',
+                '   <tbody>',
+                '    <tr><td>abs(value)</td><td>姹傚弬鏁皏alue鐨勭粷瀵瑰�硷紝value蹇呴』涓烘暟瀛楁牸寮�</td></tr>',
+                '    <tr><td>acos(value)</td><td>姹傚弬鏁皏alue鐨勫弽浣欏鸡锛寁alue蹇呴』涓烘暟瀛楁牸寮�</td></tr>',
+                '    <tr><td>asin(value)</td><td>姹傚弬鏁皏alue鐨勫弽姝e鸡锛寁alue蹇呴』涓烘暟瀛楁牸寮�</td></tr>',
+                '    <tr><td>atan(value)</td><td>姹傚弬鏁皏alue鐨勫弽姝e垏锛寁alue蹇呴』涓烘暟瀛楁牸寮�</td></tr>',
+                '    <tr><td>cbrt(value)</td><td>姹傚弬鏁皏alue鐨勭珛鏂规牴锛寁alue蹇呴』涓烘暟瀛楁牸寮�</td></tr>',
+                '    <tr><td>ceil(value)</td><td>杩斿洖涓嶅ぇ浜庡弬鏁皏alue鐨勬渶灏忔暣鏁帮紝渚嬪ceil(1.7)灏辩瓑浜�2锛寁alue蹇呴』涓烘暟瀛楁牸寮�</td></tr>',
+                '    <tr><td>cos(value)</td><td>姹傚弬鏁皏alue鐨勪綑寮﹀�硷紝value蹇呴』涓烘暟瀛楁牸寮�</td></tr>',
+                '    <tr><td>cosh(value)</td><td>姹傚弬鏁皏alue鐨勫弻鏇蹭綑寮﹀�硷紝value蹇呴』涓烘暟瀛楁牸寮�</td></tr>',
+                '    <tr><td>exp(n)</td><td>娆ф媺鏁� e 鐨刵娆″箓锛宯蹇呴』涓烘暟瀛楁牸寮�</td></tr>',
+                '    <tr><td>expm1(n)</td><td>娆ф媺鏁� e 鐨刵娆″箓鍑�1锛宯蹇呴』涓烘暟瀛楁牸寮�</td></tr>',
+                '    <tr><td>floor(n)</td><td>杩斿洖涓嶅皬浜庡弬鏁皏alue鐨勬渶澶ф暣鏁帮紝渚嬪floor(1.7)绛変簬1锛宯蹇呴』涓烘暟瀛楁牸寮�</td></tr>',
+                '    <tr><td>log(value)</td><td>鑷劧瀵规暟,value蹇呴』涓烘暟瀛楁牸寮�</td></tr>',
+                '    <tr><td>log10(value)</td><td>璁$畻搴曟暟涓� 10 鐨勫鏁�,value蹇呴』涓烘暟瀛楁牸寮�</td></tr>',
+                '    <tr><td>log1p(value)</td><td>杩斿洖鍙傛暟涓� 1 涔嬪拰鐨勮嚜鐒跺鏁帮紝value蹇呴』涓烘暟瀛楁牸寮�</td></tr>',
+                '    <tr><td>random()</td><td>杩斿洖涓�涓吉闅忔満鏁帮紝璇ュ�煎ぇ浜庣瓑浜� 0.0 涓斿皬浜� 1.0</td></tr>',
+                '    <tr><td>rint(value)</td><td>杩斿洖鍏跺�兼渶鎺ヨ繎鍙傛暟骞朵笖鏄暣鏁扮殑 double 鍊笺�傚鏋滀袱涓暣鏁扮殑 double 鍊奸兘鍚屾牱鎺ヨ繎锛岄偅涔堢粨鏋滃彇鍋舵暟銆傜壒娈婃儏鍐垫槸锛氬鏋滃弬鏁板�兼槸鏁存暟锛岄偅涔堢粨鏋滃氨鏄鍙傛暟銆傚鏋滃弬鏁版槸 NaN 鎴栨棤绌峰ぇ鎴栨闆舵垨璐熼浂锛岄偅涔堢粨鏋滀笌鍙傛暟鐩稿悓</td></tr>',
+                '    <tr><td>round(value)</td><td>鍥涜垗浜斿叆鍙栨暣鏁�</td></tr>',
+                '    <tr><td>signum(value)</td><td>绗﹀彿鍑芥暟锛涘鏋滃弬鏁颁负 0锛屽垯杩斿洖 0锛涘鏋滃弬鏁板ぇ浜� 0锛� 鍒欒繑鍥� 1.0锛涘鏋滃弬鏁板皬浜� 0锛屽垯杩斿洖 -1.0</td></tr>',
+                '    <tr><td>sin(value)</td><td>姹傚弬鏁皏alue鐨勬寮﹀�硷紝value蹇呴』涓烘暟瀛楁牸寮�</td></tr>',
+                '    <tr><td>sinh(value)</td><td>姹傚弬鏁皏alue鐨勫弻鏇叉寮﹀�硷紝value蹇呴』涓烘暟瀛楁牸寮�</td></tr>',
+                '    <tr><td>tan(value)</td><td>姹傚弬鏁皏alue鐨勬鍒囧�硷紝value蹇呴』涓烘暟瀛楁牸寮�</td></tr>',
+                '    <tr><td>tanh(value)</td><td>姹傚弬鏁皏alue鐨勫弻鏇叉鍒囧�硷紝value蹇呴』涓烘暟瀛楁牸寮�</td></tr>',
+                '    <tr><td>max(v1,v2)</td><td>姹備袱涓暟涓殑杈冨ぇ鐨勫�硷紝v1,v2閮藉繀椤讳负鏁板瓧鏍煎紡锛屼緥濡俶ax(3.2,3)灏辩瓑浜�3.2</td></tr>',
+                '    <tr><td>min(v1,v2)</td><td>姹備袱涓暟涓殑杈冨皬鐨勫�硷紝v1,v2閮藉繀椤讳负鏁板瓧鏍煎紡锛屼緥濡俶ax(3.2,3)灏辩瓑浜�3</td></tr>',
+                '    <tr><td>sqrt(value)</td><td>姹傚钩鏂规牴</td></tr>',
+                '   </tbody>',
+                '</table>']
+            return html.join('')
+        }
+        this.getFormulaSiHtml = function() {
+            var that = this;
+            var filter = "compuse_" + that.id;
+            var html = ['<table lay-filter="formula-table-si">',
+                '   <thead>',
+                '    <tr><th lay-data="{field:\'id\', width:257}">鍏紡</th><th lay-data="{field:\'name\', width:355}">鎻忚堪</th></tr>',
+                '   </thead>',
+                '   <tbody>',
+                '    <tr><td>toChinese(value)</td><td>灏嗛樋鎷変集鏁板瓧杞负涓烘眽瀛楀ぇ鍐欐柟寮�</td></tr>',
+                '    <tr><td>getChineseCurrency(value)</td><td>灏嗛樋鎷変集鏁板瓧杞负涓烘眽瀛楅噾棰濆ぇ鍐欐柟寮忥紝涓巘ochiness鐨勫尯鍒槸杩欎釜浼氭樉绀哄厓銆佽銆佸垎</td></tr>',
+                '    <tr><td>setThmark(value)</td><td>涓哄弬鏁皏alue璁剧疆鍗冨垎浣�</td></tr>',
+                '   </tbody>',
+                '</table>']
+            return html.join('')
+        }
+        this.getFormulaDateHtml = function() {
+            var that = this;
+            var filter = "compuse_" + that.id;
+            var html = ['<table lay-filter="formula-table-date">',
+                '   <thead>',
+                '    <tr><th lay-data="{field:\'id\', width:257}">鍏紡</th><th lay-data="{field:\'name\', width:355}">鎻忚堪</th></tr>',
+                '   </thead>',
+                '   <tbody>',
+                '    <tr><td>compareDate(d1,d2)</td><td>瀵规瘮鍙傛暟d1,d2鐨勫ぇ灏忋�俤1,d2涓簓yyy-MM-dd鏍煎紡鐨勬棩鏈熷瓧绗︿覆</td></tr>',
+                '    <tr><td>nowDate()</td><td>鑾峰彇褰撳墠鏃ユ湡</td></tr>',
+                '    <tr><td>chinaDate(d1)</td><td>灏嗘椂闂磋浆鎹负鍐滃巻锛宒1鏄痽yyy-MM-dd鏍煎紡鐨勬棩鏈熷瓧绗︿覆</td></tr>',
+                '    <tr><td>dateAdd(d1,count)</td><td>鍦╠1鐨勫熀纭�涓婃坊鍔燾ount澶�,d1涓簓yyy-MM-dd HH:mm:ss鏍煎紡鐨勬椂闂村瓧绗︿覆</td></tr>',
+                '    <tr><td>dateBalanceYear(sourceDate,targetDate,false)</td><td>璁$畻鐩稿樊鐨勫勾浠斤紝姣斿璁$畻骞撮緞锛宼argetDate涓�""琛ㄧず褰撳墠鏃堕棿锛岀涓変釜鍙傛暟涓簍rue琛ㄧず鏈夊浣欑殑鏈堜唤鎴栬�呭ぉ鏁版椂锛屽氨鍔�1;</td></tr>',
+                '    <tr><td>dateBalanceDay(sourceDate,targetDate)</td><td>璁$畻鐩稿樊鐨勫ぉ鏁帮紝targetDate涓�""琛ㄧず褰撳墠鏃堕棿</td></tr>',
+                '    <tr><td>dateformat(d1,format)</td><td>灏嗗綋鍓嶇殑鏃ユ湡锛堟椂闂达級瀛楃涓茶浆涓烘寚瀹氱殑瀛楃涓诧紝濡傛灉format鐨勫唴瀹规湁绌烘牸锛岃浣跨敤&浠f浛</td></tr>',
+                '    <tr><td>nowDatetime()</td><td>鑾峰彇褰撳墠鏃ユ湡鍜屾椂闂淬�傛牸寮忎负yyyy-MM-dd HH:mm:ss</td></tr>',
+                '    <tr><td>dayOf(d1)</td><td>鑾峰彇鏍煎紡涓簓yyy-MM-dd鐨勬棩鏈熺殑澶╂暟</td></tr>',
+                '    <tr><td>nowMon()</td><td>鑾峰彇褰撳墠鐨勬湀浠斤紝鏍煎紡涓篗M</td></tr>',
+                '    <tr><td>monOf(d1)</td><td>鑾峰彇鏃ユ湡d1鐨勬湀浠芥暟</td></tr>',
+                '    <tr><td>nowTime()</td><td>鑾峰彇褰撳墠鏃堕棿锛屾牸寮忎负HH:mm:ss</td></tr>',
+                '    <tr><td>nowYear()</td><td>鑾峰彇骞翠唤锛屾牸寮忎负yyyy</td></tr>',
+                '    <tr><td>yearOf()</td><td>鑾峰彇鏃堕棿d1鐨勫勾浠�</td></tr>',
+                '   </tbody>',
+                '</table>']
+            return html.join('')
+        }
+        this.getFormulaFaHtml = function() {
+            var that = this;
+            var filter = "compuse_" + that.id;
+            var html = ['<table lay-filter="formula-table-fa">',
+                '   <thead>',
+                '    <tr><th lay-data="{field:\'id\', width:297}">鍏紡</th><th lay-data="{field:\'name\', width:315}">鎻忚堪</th></tr>',
+                '   </thead>',
+                '   <tbody>',
+                '    <tr><td>if(compare,trueResult,falseResult)</td><td>濡傛灉compare鐨勮〃杈惧紡涓簍rue锛屽垯鎵цtrueResult鐨勮〃杈惧紡锛屽惁鍒欐墽琛宖laseResult.渚嬪if(3>2,2*(3+2),3/(2-4)),鍊肩瓑浜�10</td></tr>',
+                '    <tr><td>sum(douber1,douber2)</td><td>涓や釜鏍煎紡涓篸ouber鐨勫弬鏁版眰鍜�</td></tr>',
+                '    <tr><td>sub(douber1,douber2)</td><td>鏍煎紡涓篸ouber鐨勫弬鏁癲ouber1鍑忓幓鏍煎紡涓篸ouber鐨勫弬鏁癲ouber2</td></tr>',
+                '    <tr><td>mul(douber1,douber2)</td><td>涓や釜鏍煎紡涓篸ouber鐨勫弬鏁扮浉涔�</td></tr>',
+                '    <tr><td>div(douber1,douber2)</td><td>鏍煎紡涓篸ouber鐨勫弬鏁癲ouber1闄や互鏍煎紡涓篸ouber鐨勫弬鏁癲ouber2.褰揹ouber2绛変簬0鐨勬椂鍊欙紝杩斿洖0;濡傛灉闄や笉灏界殑鏃跺�欎繚鐣�10浣嶅皬鏁�</td></tr>',
+                '    <tr><td>mod(int,int)</td><td>姹備綑鏁�</td></tr>',
+                '    <tr><td>toInt(string)</td><td>杞崲涓篿nt鏍煎紡</td></tr>',
+                '    <tr><td>doubleRound(string,count)</td><td>澶勭悊douber鐨勫皬鏁颁綅鏁帮紝count琛ㄧず灏忔暟浣嶆暟</td></tr>',
+                '    <tr><td>zeroIfNull(value)</td><td>濡傛灉鍙傛暟鐨勫�间负null鎴栬��"",灏嗚繑鍥�0</td></tr>',
+                '    <tr><td>endsWith(string,str1)</td><td>瀛楃涓瞫tring鏄笉鏄互str1缁撳熬</td></tr>',
+                '    <tr><td>startsWith(string,str1)</td><td>瀛楃涓瞫tring鏄惁浠tr1寮�澶�</td></tr>',
+                '    <tr><td>charAt(string,index)</td><td>鑾峰彇瀛楃涓瞫tring涓index浣嶇疆鐨勫瓧绗︼紝濡傛灉闀垮害灏忎簬index锛屽垯杩斿洖"";</td></tr>',
+                '    <tr><td>equalsIgnoreCase(str1,str2)</td><td>瀛楃涓瞫tr1鍜屽瓧绗︿覆str2鏄惁鐩哥瓑</td></tr>',
+                '    <tr><td>indexOf(str1,str2)</td><td>瀛楃涓瞫tr2鍦ㄥ瓧绗︿覆str1涓娆″嚭鐜扮殑浣嶇疆</td></tr>',
+                '    <tr><td>isEmpty(str1)</td><td>鍙傛暟str1鏄惁涓虹┖锛屽叾涓璶ull杩欎釜瀛楃涓蹭篃琛ㄧず涓虹┖</td></tr>',
+                '    <tr><td>lastIndexOf(str1,str2)</td><td>瀛楃涓瞫tr2鍦ㄥ瓧绗︿覆str1涓渶鍚庡嚭鐜扮殑浣嶇疆</td></tr>',
+                '    <tr><td>leftStr(str1,index)</td><td>鑾峰彇index浣嶇疆宸︿晶鐨勬墍鏈夊瓧绗�</td></tr>',
+                '    <tr><td>rightStr(str1,str2)</td><td>鑾峰彇index浣嶇疆鍙充晶鐨勬墍鏈夊瓧绗�</td></tr>',
+                '    <tr><td>length(str1)</td><td>鍙傛暟str1鐨勯暱搴�</td></tr>',
+                '    <tr><td>mid(str1,start,end)</td><td>鑾峰彇str1鐨勪粠start鍒癳nd鐩存帴鐨勫瓧绗︿覆锛屽嚭鐜板紓甯告椂杩斿洖""</td></tr>',
+                '    <tr><td>tolowercase(str1)</td><td>灏嗗瓧绗︿覆str1杞负灏忓啓</td></tr>',
+                '    <tr><td>touppercase(str1)</td><td>灏嗗瓧绗︿覆str1杞负澶у啓</td></tr>',
+                '    <tr><td>trimzero(str1)</td><td>鍘婚櫎瀛楃涓瞫tr1涓殑0</td></tr>',
+                '    <tr><td>MD5(str1)</td><td>灏嗗瓧绗︿覆杩涜MD5鍔犲瘑</td></tr>',
+                // '    <tr><td>getValueByMethod(serviceName,method,paramJsonString)</td><td>浠庢柟娉曚腑鑾峰彇鍊�</td></tr>',
+                '   </tbody>',
+                '</table>']
+            return html.join('')
+        }
+        this.getFormulaOtherHtml = function() {
+            var that = this;
+            var filter = "compuse_" + that.id;
+            var html = ['<table lay-filter="formula-table-other">',
+                '   <thead>',
+                '    <tr><th lay-data="{field:\'id\', width:395}">鍏紡</th><th lay-data="{field:\'name\', width:235}">鎻忚堪</th></tr>',
+                '   </thead>',
+                '   <tbody>',
+                '    <tr><td>getcolvalue(servername,tablename,fieldname,pkField,pkValue)</td><td>鏌ヨservername涓璽ablename鏁版嵁搴撹〃涓璮ieldname瀛楁鐨勫�硷紝pkfield琛ㄧず涓婚敭鐨勫瓧娈靛悕绉帮紝pkValue琛ㄧず涓婚敭鐨勫�硷紝serverName鐜板湪榛樿涓簂ocalServer</td></tr>',
+                '   </tbody>',
+                '</table>']
+            return html.join('')
+        }
+        this.getSysVarHtml = function() {
+            var that = this;
+            var filter = "compuse_" + that.id;
+            var html = ['<table lay-filter="sysvar-table">',
+                '   <thead>',
+                '    <tr><th lay-data="{field:\'id\', width:170}">鍙橀噺</th><th lay-data="{field:\'name\', width:140}">鎻忚堪</th></tr>',
+                '   </thead>',
+                '   <tbody>',
+                '    <tr><td>#CURRENTUSER.OID#</td><td>褰撳墠鐢ㄦ埛鐨勪富閿�</td></tr>',
+                '    <tr><td>#CURRENTUSER.ID#</td><td>褰撳墠鐢ㄦ埛鐨勮处鎴�</td></tr>',
+                '    <tr><td>#CURRENTTIME#</td><td>褰撳墠鏃堕棿</td></tr>',
+                '    <tr><td>#CURRENTDATE#</td><td>褰撳墠鏃ユ湡</td></tr>',
+                '    <tr><td>#CURRENTDATETIME#</td><td>褰撳墠鏃ユ湡鏃堕棿</td></tr>',
+                '    <tr><td>#CURRENTUSER_NAME#</td><td>褰撳墠鐢ㄦ埛鐨勫鍚�</td></tr>',
+                '    <tr><td>#CURRENTUSER.SECRETGRADE#</td><td>褰撳墠鐢ㄦ埛瀵嗙骇</td></tr>',
+                '    <tr><td>#CURRENTUSER.IPSECRET#</td><td>褰撳墠鐢ㄦ埛鐨処P瀵嗙骇</td></tr>',
+                '    <tr><td>#CURRENTUSER.BUSINESSUNIT#</td><td>褰撳墠鐢ㄦ埛鎵�灞炰笟鍔″崟鍏�</td></tr>',
+                '    <tr><td>#CURRENTUSER.BUSINESSUNITNAME#</td><td>褰撳墠鐢ㄦ埛鎵�灞炰笟鍔″崟鍏冨悕绉�</td></tr>',
+                '    <tr><td>#CURRENTUSER.GROUPOID#</td><td>褰撳墠鐢ㄦ埛鐨勯儴闂ㄤ富閿�</td></tr>',
+                '    <tr><td>#CURRENTUSER.GROUPNAME#</td><td>褰撳墠鐢ㄦ埛鎵�灞為儴闂ㄥ悕绉�</td></tr>',
+                '    <tr><td>#CURRENTUSER.EMAIL#</td><td>褰撳墠鐢ㄦ埛閭欢鍦板潃</td></tr>',
+                '    <tr><td>#CURRENTUSER.ROLENAME#</td><td>褰撳墠鐢ㄦ埛鎵�灞炶鑹插悕绉�</td></tr>',
+                '   </tbody>',
+                '</table>']
+            return html.join('')
+        }
+        this.getThisVarHtml = function() {
+            var that = this;
+            var html = ['<table lay-filter="thisvar-table">',
+                '   <thead>',
+                '    <tr><th lay-data="{field:\'id\', width:170}">鍙橀噺</th><th lay-data="{field:\'name\', width:140}">鎻忚堪</th></tr>',
+                '   </thead>',
+                '   <tbody>',
+                '   </tbody>',
+                '</table>']
+            return html.join('')
+        }
+        this.init=function(){
+        };
+
+        this.showReferDialog=function (options){
+            var that=this;
+            var form = layui.form;
+            var table = layui.table;
+            if(!options){
+                options={}
+            }
+            if(options.id){
+                that.id=options.id
+            }
+            var target = options.target;
+            var filter ="compuse_" + that.id;
+            var compuseIndex =webUtil.dialog({
+                title:'鍏紡缂栬緫妗�',
+                content:that.getContent(),
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero,layerIndex,classP) {
+                    var easyuiLayout = $('#easyuiLayout_' + filter)
+                    easyuiLayout.css({height: 600, width: 1000})
+                    easyuiLayout.parent().parent().css({margin: '5px'})
+                    $('#easyuiLayoutCenter_' + filter).layout()
+                    $('#easyuiLayoutSouth_' + filter).layout()
+                    easyuiLayout.layout();
+                    form.addItems(filter, [{
+                            field: 'formulacontext',
+                            title: '鍏紡鍐呭',
+                            required: true,
+                            type: 'textarea',
+                            textWidth: 500,
+                            textStyle:'height:120px;'
+                        }],
+                        function () {
+                            form.setValues({formulacontext: options.value}, filter)
+                            webUtil.relocationOpen(classP)
+                        }, {}, {labelWidth: 110});
+                    var tableOptions={
+                        limit:-1,
+                        height:255,
+                        done:function(res,cur,total) {
+                            $('.formula-div .layui-table-header').hide();
+                            $('.formula-div .layui-table-body').height(253)
+                        },
+                        rowDBLClick:function (thisTableFilter, record) {
+                            var formulacontext=form.getValues(filter).formulacontext;
+                            formulacontext+=record.id
+                            form.setValues({formulacontext:formulacontext},filter);
+                        }
+                    }
+                    //鏁板鍏紡
+                    table.init('formula-table-math', tableOptions);
+                    //璐㈠姟鍏紡
+                    table.init('formula-table-si', tableOptions);
+                    //鏃ユ湡鍏紡
+                    table.init('formula-table-date', tableOptions);
+                    //甯哥敤鍏紡
+                    table.init('formula-table-fa', tableOptions);
+                    //鍏跺畠鍏紡
+                    table.init('formula-table-other', tableOptions);
+                    //绯荤粺鍙橀噺
+                    table.init('sysvar-table', tableOptions);
+                    //鏈満鏅彉閲�
+                    if(options.currentVars){
+                        //璇存槑浼犻�掍簡
+                        var thisVarOptions=$.extend(tableOptions,{data:options.currentVars})
+                        table.init('thisvar-table', thisVarOptions);
+                    }else if(options.useFormKey && options.textFormKey){
+                        //鑾峰彇浣跨敤鐨勮〃鍗曚笂鐨勫瓧娈�
+                        var id = options.formValues[options.useFormKey];
+                        var text = options.formValues[options.textFormKey];
+                        var data = [{id:"${" + id + "}",name:text}];
+                        var thisVarOptions = $.extend(tableOptions, {data: data})
+                        table.init('thisvar-table', thisVarOptions);
+                    }else if(options.currentVarsUrl){
+                        debugger;
+                        var submitParams = options.currentVarsParams;
+                        if(!submitParams){
+                            submitParams = {};
+                        }
+                        var formKey = "${formValues.";
+                        for(var key in submitParams){
+                            var value = submitParams[key];
+                            try {
+                                if ($webUtil.isNotNull(value) && value.indexOf(formKey) > -1) {
+                                    while (value.indexOf(formKey) > -1) {
+                                        var temp = value.substring(value.lastIndexOf(formKey) + formKey.length, value.indexOf("}"));
+                                        var thisKeyValue = options.formValues[temp];
+                                        if (!thisKeyValue || thisKeyValue == null) {
+                                            thisKeyValue = '';
+                                        }
+                                        value = value.replace(formKey + temp + "}", thisKeyValue);
+                                    }
+                                }
+                            }catch (e){
+
+                            }
+                            submitParams[key] = value;
+                        }
+                        submitParams['page'] = 1;
+                        submitParams['limit'] = -1;
+                        $webUtil.ajax(options.currentVarsMethod||'get', options.currentVarsUrl, submitParams, function (res) {
+                            layui.each(res.data, function (i, item) {
+                                res.data[i].id = '${' + item.id + '}'
+                            })
+                            var thisVarOptions = $.extend(tableOptions, {data: res.data})
+                            table.init('thisvar-table', thisVarOptions);
+                        }, function (e, msg) {
+                        }, that.backPath, true);
+                    }
+
+                    //杩愮畻绗�
+                    $('.operator_'+filter+' .layui-btn').click(function (){
+                        var formulacontext=form.getValues(filter).formulacontext;
+                        formulacontext+=$(this).text()
+                        form.setValues({formulacontext:formulacontext},filter);
+                    })
+
+                    function checkFormula(formulacontext){
+                        if(formulacontext){
+                            return true;
+                        }else {
+                            webUtil.showErrorMsg('楠岃瘉涓嶉�氳繃');
+                            return false;
+                        }
+                        return true;
+                    }
+                    //楠岃瘉鍏紡
+                    $('.toolbar_'+filter+'_verify').click(function (){
+                        var formulacontext=form.getValues(filter).formulacontext;
+                        if(checkFormula(formulacontext)) {
+                            webUtil.showMsg('楠岃瘉閫氳繃')
+                        }
+                    })
+                    //娓呴櫎鍐呭
+                    $('.toolbar_'+filter+'_chear').click(function (){
+                        form.setValues({formulacontext:''},filter);
+                    })
+                    //纭畾
+                    $('.toolbar_'+filter+'_add').click(function (){
+                        var formulacontext=form.getValues(filter).formulacontext;
+                        if(formulacontext=='' || checkFormula(formulacontext)) {
+                            target.setValue(options.filter,options.name,formulacontext,formulacontext,true);
+                            layer.close(compuseIndex)
+                        }
+                    })
+                }
+            });
+        }
+        this.refresh = function (buttonid,ele) {
+        };
+        this.ADVQUERY = function () {
+            var that = this;
+            if(!that.serinorQueryInstance) {
+                var dynamicCondition = layui.dynamicCondition;
+                $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar' + that.id + '" class="layui-inline"></div>');
+                that.checkColumns();
+                that.serinorQueryInstance = dynamicCondition.create({
+                    fields: that.dataFields//鏌ヨ瀛楁
+                    , tableId: "table_" + that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                    , type: "complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                    , queryCallBack: function (requestData) {//鏌ヨ涔嬪悗鐨刢allback
+
+                    }
+                });
+            }
+            that.serinorQueryInstance.open();
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/referConfig.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/referConfig.js
new file mode 100644
index 0000000..9c48c16
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/referConfig.js
@@ -0,0 +1,839 @@
+/**
+ * 鍙傜収鐨勯厤缃�
+ * @author weidy
+ * @date 2022-04-05
+ */
+layui.define(['layer'],function(exports){
+	var ReferConfig = function(){
+		this.backPath = (configData.compatibility?path:configData.objectServicePath);
+		this.url = 'btmTypeController/gridAttributesByBtmId';
+	};
+	/**
+	 * 鏄剧ず鍙傜収绐楀彛鐨勬椂鍊�
+	 * @param referConfig 鍙傜収鐩稿叧鐨勯厤缃�
+	 */
+	ReferConfig.prototype.showReferDialog = function (config){
+		//鍙渶瑕佽缃粯璁ょ殑鍊硷紝璋冪敤VciWebReferGrid鍗冲彲
+		var that = this;
+		//鍏ㄩ儴閮芥槸椤甸潰涓婂鐞�
+		//鍩烘湰淇℃伅锛屽垪鐨勪俊鎭紝鏌ヨ鐨勫瓧娈甸厤缃�
+		//鏌ヨ鏉′欢
+		var filter = config.filter,
+			name = config.name,
+			title = config.title,
+			valueInfo = '',
+			isMuti = config.isMuti,
+			target = config.target,
+			value = config.value,
+			text = config.text;
+		if(filter.indexOf('.')>-1){
+			filter=filter.split('.')[0]+'-'+filter.split('.')[1];
+		}
+		if(name.indexOf('.')>-1){
+			name=name.split('.')[0]+'-'+name.split('.')[1];
+		}
+		var options = config.options;
+		var referFilter = filter+"_" + name;
+		var referIndex = $webUtil.dialog({
+			title:'鍙傜収閰嶇疆',
+			btn:['纭畾', '娓呯┖鍐呭','鍙栨秷'],
+			content:'<form id="form_' + referFilter + '" lay-filter="form_' + referFilter + '" class="layui-form" style="margin:10px 50px 0 0" ></form>' +
+					'<form id="formtype_' + referFilter + '" lay-filter="formtype_' + referFilter + '" class="layui-form" style="margin:0 50px 0 0" ></form>' +
+						'<div layui-filter="column_toolbar_' + referFilter + '" class="layui-table-toolbar "  style="margin: 0 0 8px;display: none">' +
+							'<button class="layui-btn layui-btn-sm" layui-filter="toolbar_' + referFilter + '_ADDATTR" style="float: left"><i class="layui-icon layui-icon-add-1"></i>閫夋嫨灞炴��</button>' +
+							'<div layui-filter="query_toolbar_' + referFilter + '" class="layui-table-toolbar "  style="margin: 5px 0 5px 0;"></div>'+
+						'</div>' +
+						'<div style="margin: 0 5px">' +
+							'<table class="layui-table layui-referGrid" lay-size="sm" lay-even lay-filter="column_' + referFilter + '" id="column_' + referFilter + '" ></table>' +
+						'</div>'+
+						'<div layui-filter="where_toolbar_' + referFilter + '" class="layui-table-toolbar "  style="margin: 0 0 8px">' +
+							'<button class="layui-btn layui-btn-sm" layui-filter="toolbar_' + referFilter + '_ADDWHERE" style="float: left"><i class="layui-icon layui-icon-add-1"></i>娣诲姞鏌ヨ鏉′欢</button>' +
+						'</div>' +
+						'<div style="margin: 0 5px">' +
+							'<table class="layui-table layui-referGrid" lay-size="sm" lay-even lay-filter="where_' + referFilter + '" id="where_' + referFilter + '" ></table>' +
+						'</div>',
+			fullScreen:true,
+			yes:function(index,layero){
+				var selectValue = that.getSelectValue(filter,name,isMuti);
+				if(selectValue){
+					target.setValue(filter,name,selectValue.value,selectValue.rawValue,true,selectValue.allValues);
+					layer.close(referIndex);
+				}
+			},
+			success:function(layero){
+				var defaultValues={};
+				if($webUtil.isNotNull(config.value)){
+					defaultValues=eval("(" + config.value + ")")
+				}else if($webUtil.isNotNull(config.text)){
+					defaultValues=eval("(" + config.text + ")")
+				}else {
+					defaultValues.type='default'
+				}
+				that.initForm(referFilter,config,defaultValues);
+				that.initFormType(referFilter,config,defaultValues);
+				that.initWhereTable(referFilter,config,defaultValues);
+				if(defaultValues.type == 'default' || defaultValues.type == 'grid'){
+					that.initTable(referFilter,config,defaultValues);
+					$("[layui-filter='column_toolbar_" + referFilter + "']").show();
+				}
+				$("[layui-filter='toolbar_" + referFilter + "_ADDATTR']").unbind('click').click(function (){
+					var values = layui.form.getValues('form_'+referFilter);
+					if($webUtil.isNull(values['referType'])){
+						$webUtil.showErrorMsg("璇疯緭鍏ュ弬鐓х殑涓氬姟绫诲瀷");
+						return false;
+					}
+					layui.use('platform/objectService/OsAttributeForBtmRefer',function (){
+						var attrRefer = layui['platform/objectService/OsAttributeForBtmRefer'];
+						attrRefer.showReferDialog({
+							filter:referFilter+"_attr",
+							name:name + "_attr",
+							title:'閫夋嫨鏄剧ず瀛楁',
+							isMuti:true,
+							target: that,
+							options: {
+								where: {
+									btmTypeId: values['referType'],
+									hasDefaultAttr:true
+								}
+							}
+						});
+					});
+				});
+				$("[layui-filter='toolbar_" + referFilter + "_ADDWHERE']").unbind('click').click(function (){
+					var values = layui.form.getValues('form_'+referFilter);
+					if($webUtil.isNull(values['referType'])){
+						$webUtil.showErrorMsg("璇疯緭鍏ュ弬鐓х殑涓氬姟绫诲瀷");
+						return false;
+					}
+					layui.use('platform/objectService/OsAttributeForBtmRefer',function (){
+						var attrRefer = layui['platform/objectService/OsAttributeForBtmRefer'];
+						attrRefer.showReferDialog({
+							filter:referFilter+"_attr",
+							name:name + "_attr",
+							title:'閫夋嫨鏌ヨ鏉′欢',
+							isMuti:true,
+							target: {
+								setValue: function (filter,name,value,rawValue,closeDialog,allValues){
+									var referFilter = filter.substring(0,filter.length-5);
+									var tableData = [];
+									layui.each(allValues,function (_index,_item){
+										var record = {
+											field:_item.id,type:'',typeText:'绛変簬',value:''
+										}
+										tableData.push(record)
+									});
+									layui.table.addData("where_" + referFilter, tableData);
+								}
+							},
+							options: {
+								where: {
+									btmTypeId: values['referType'],
+									hasDefaultAttr:true
+								}
+							}
+						});
+					});
+
+				});
+			},
+			btn2: function (layero) {
+				target.setValue(filter,name,'','',true);
+			},
+			btn3: function (layero) {
+				layer.close(referIndex);
+			}
+		});
+	};
+	ReferConfig.prototype.setValue = function (filter,name,value,rawValue,closeDialog,allValues){
+		//閫夋嫨灞炴�х殑鏃跺�欑殑鍥炶皟
+		var that = this;
+		var referFilter = filter.substring(0,filter.length-5);
+		var tableData = [];
+		layui.each(allValues,function (_index,_item){
+			var record = {
+				field: _item.id,
+				title: _item.name,
+				fieldType: _item.attrDataType,
+				fieldTypeText: {
+					VTBoolean:"甯冨皵鍨�",
+					VTClob: "闀挎枃鏈�",
+					VTDate:"鏃ユ湡",
+					VTDateTime:"鏃ユ湡鏃堕棿",
+					VTTime:"鏃堕棿",
+					VTLong:"闀挎暣鍨�",
+					VTDouble:"閲戦/鍙岀簿搴�",
+					VTInteger:"鏁村舰",
+					VTFilePath:"鏂囦欢",
+					VTString:"瀛楃涓�"
+				}[_item.attrDataType],
+				sort: "false",
+				sortField: _item.id,
+				width: _item.attributeLength
+			}
+			tableData.push(record)
+		});
+		layui.table.addData("column_" + referFilter, tableData);
+	};
+	ReferConfig.prototype.initTable = function (referFilter,config,defaultValues){
+		var that = this;
+		var table = layui.table;
+		var height = ($webUtil.isNotNull(config.options.height) && config.options.height*1>1) ?(config.options.height*1-400): 260 ;
+		if(height<300){
+			height = 260;
+		}
+		if(!defaultValues.tableConfig){
+			defaultValues.tableConfig= {
+				cols: [{
+					field: 'id',
+					title: '缂栧彿',
+					fieldType: 'text',
+					fieldTypeText: '鏂囨湰妗�',
+					sort: "true",
+					sortField: 'id',
+					width: '150',
+					isquery: true,
+				}, {
+					field: 'name',
+					title: '鍚嶇О',
+					fieldType: 'text',
+					fieldTypeText: '鏂囨湰妗�',
+					sort: "true",
+					sortField: 'name',
+					width: '180',
+					isquery: true,
+				}], queryColumns: [{
+					field: 'id',
+					title: '缂栧彿',
+					fieldType: 'text',
+					fieldTypeText: '鏂囨湰妗�',
+					sort: "true",
+					sortField: 'id',
+					width: '150',
+					isquery: true,
+				}, {
+					field: 'name',
+					title: '鍚嶇О',
+					fieldType: 'text',
+					fieldTypeText: '鏂囨湰妗�',
+					sort: "true",
+					sortField: 'name',
+					width: '180',
+					isquery: true,
+				}]
+			}
+		}
+		var options = {
+			elem: '#column_' + referFilter,
+			id: 'column_' + referFilter,
+			data:defaultValues.tableConfig.cols,
+			limit:-1,
+			selectMode: table.selectMode.muti,
+			cols: [[table.getIndexColumn(), {
+				field:'field',
+				title:'鍒楀瓧娈�(*)',
+				width:150,
+				edit:'text'
+			},{
+				field:'title',
+				title:'鍒楀悕(*)',
+				edit:'text',
+				width: 170
+			}, {
+				field: 'fieldTypeText',
+				title: '瀛楁绫诲瀷(*)',
+				edit: 'select',
+				editConfig: {
+					comboxKey: 'fieldTypeForLayui',
+					valueField:'fieldType',
+					comboxConfig: {
+						data: [{key: 'text', value: '鏂囨湰妗�'}, {key: 'combox', value: '涓嬫媺鑿滃崟'}, {key: 'radio',value: '鍗曢��'}, {key: 'swtich', value: '寮�鍏�'}, {key: 'date', value: '鏃堕棿'}, {key: 'textarea', value: '鏂囨湰鍩�'}]
+					}
+				},
+				width: 80
+			},{
+				field:'sort',
+				title:'鍒楄〃鍙帓搴�',
+				width: 70,
+				data: [{key: "true", value: "鏄�"}, {key: "false", value: "鍚�"}],
+				templet: function (d) {
+					return '<input type="checkbox" name="sort" value="'+d.sort+'" lay-skin="switch" lay-text="鏄瘄鍚�" lay-filter="sortflag" '+(d.sort==true||d.sort=='true' ? 'checked' : '') +'>';
+				}
+			},{
+				field:'sortField',
+				title: '鎺掑簭瀛楁',
+				width: 100,
+				edit: 'text'
+			},{
+				field: 'width',
+				title: '瀛楁瀹藉害',
+				width: 70,
+				edit: 'text'
+			},{
+				field: 'fixedText',
+				title: '鍒楀浐瀹氫綅缃�',
+				edit: 'select',
+				editConfig: {
+					comboxKey:'fixedForLayui',
+					valueField:'fixed',
+					comboxConfig: {
+						data: [{key: '', value: '涓嶅浐瀹�'}, {key: 'left', value: '宸﹁竟'}, {key: 'right', value: '鍙宠竟'}]
+					}
+				},
+				width: 90
+			},{
+				field: 'templet',
+				title: 'js鏄剧ず浠g爜',
+				width: 320,
+				edit: 'text'
+			},{
+				field: 'options',
+				title: '鎿嶄綔',
+				width: 180,
+				templet:function (d){
+					if(d.isquery) {
+						return '<a class="layui-btn layui-btn-intable" lay-event="UNUSEQUERY">鍙栨秷蹇�熸煡璇�</a><a class="layui-btn layui-btn-intable" lay-event="REMOVEFIELD">绉婚櫎</a>';
+					}else{
+						return '<a class="layui-btn layui-btn-intable" lay-event="USEQUERY">蹇�熸煡璇�</a><a class="layui-btn layui-btn-intable" lay-event="REMOVEFIELD">绉婚櫎</a>';
+					}
+				}
+			}]],
+			//height: height,
+			remoteSort:false,
+			done: function (res, cur, total) {
+				layui.form.on('switch(sortflag)', function(obj){
+					var tr=$(obj.othis).parents('tr');
+					var data= layui.table.getData('column_' + referFilter)[tr.attr('data-index')]
+					data[this.name]=obj.elem.checked
+					//layui.table.changeRecord(tableId,tr.attr('data-index'),data);
+					$(obj.othis).parents('td').addClass('layui-table-edit_notsubmit')
+				});
+				table.on('tool(column_' + referFilter + ')', function (obj) {
+					var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+					var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+					if (layEvent == 'USEQUERY') {
+						that.USEQUERY(data,referFilter,config);
+						data.isquery=true;
+						layui.table.changeRecord('column_' + referFilter,obj.index,data)
+					}
+					if (layEvent == 'UNUSEQUERY') {
+						that.UNUSEQUERY(data,referFilter,config);
+						data.isquery=false;
+						layui.table.changeRecord('column_' + referFilter,obj.index,data)
+					}
+					if(layEvent == 'REMOVEFIELD'){
+						that.UNUSEQUERY(data,referFilter,config);
+						table.removeData('column_' + referFilter,data[table.config.indexName]);
+					}
+				});
+			}
+		};
+		table.render(options);
+		var toolbatr = $("[layui-filter='query_toolbar_" + referFilter + "']");
+		if(toolbatr){
+			toolbatr.empty();
+			layui.each(defaultValues.tableConfig.queryColumns,function (i,item){
+				toolbatr.append('<span class="layui-badge layui-bg-blue" data-id="' + item.field + '" style="margin-right: 10px">' + item.title + '</span>');
+			})
+		}
+	};
+	ReferConfig.prototype.initWhereTable = function (referFilter,config,defaultValues){
+		var that = this;
+		var table = layui.table;
+		var whereData=[];
+		if(defaultValues.where){
+			layui.each(defaultValues.where,function (i,item){
+				if($webUtil.startWith(item,'>=')){
+					whereData.push({field:i,value:item.replace('>=',''),type:'>=',typeText:'澶т簬绛変簬'})
+				}else if($webUtil.startWith(item,'<=')){
+					whereData.push({field:i,value:item.replace('<=',''),type:'<=',typeText:'灏忎簬绛変簬'})
+				}else if($webUtil.startWith(item,'!=')){
+					whereData.push({field:i,value:item.replace('!=',''),type:'!=',typeText:'涓嶇瓑浜�'})
+				}else if($webUtil.startWith(item,'>')){
+					whereData.push({field:i,value:item.replace('>',''),type:'>',typeText:'澶т簬'})
+				}else if($webUtil.startWith(item,'<')){
+					whereData.push({field:i,value:item.replace('<',''),type:'<',typeText:'灏忎簬'})
+				}else if($webUtil.startWith(item,'*') && $webUtil.endWith(item,'*')){
+					whereData.push({field:i,value:item.replace('*','').replace('*',''),type:'like',typeText:'鍖呭惈'})
+				}else {
+					whereData.push({field:i,value:item,type:'',typeText:'绛変簬'})
+				}
+			})
+		}
+		table.render({
+			elem: '#where_' + referFilter,
+			id: 'where_' + referFilter,
+			data:whereData,
+			limit:-1,
+			selectMode: table.selectMode.muti,
+			cols: [[table.getIndexColumn(), {
+				field:'field',
+				title:'绛涢�夊瓧娈�',
+				width:150,
+				edit:'text'
+			}, {
+				field:'typeText',
+				title: '绛涢�夌被鍨�',
+				width: 100,
+				edit: 'select',
+				editConfig: {
+					comboxKey:'whereTypeForLayui',
+					valueField:'type',
+					comboxConfig: {
+						data: [{key: 'like', value: '鍖呭惈'}, {key: '', value: '绛変簬'}, {key: '>', value: '澶т簬'}, {key: '<', value: '灏忎簬'}, {key: '!=', value: '涓嶇瓑浜�'}, {key: '>=', value: '澶т簬绛変簬'}, {key: '<=', value: '灏忎簬绛変簬'}]
+					}
+				}
+			},{
+				field:'value',
+				title:'绛涢�夊��',
+				edit:'text',
+				width: 170
+			},{
+				field: 'options',
+				title: '鎿嶄綔',
+				width: 80,
+				templet:function (d){
+					return '<a class="layui-btn layui-btn-intable" lay-event="REMOVEFIELD">绉婚櫎</a>';
+				}
+			}]],
+			remoteSort:false,
+			done: function (res, cur, total) {
+				table.on('tool(where_' + referFilter + ')', function (obj) {
+					var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+					var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+					if(layEvent == 'REMOVEFIELD'){
+						table.removeData('where_' + referFilter,data[table.config.indexName]);
+					}
+				});
+			}
+		});
+	};
+	ReferConfig.prototype.USEQUERY = function (data,referFilter,config){
+		var that = this;
+		var toolbatr = $("[layui-filter='query_toolbar_" + referFilter + "']");
+		if(toolbatr){
+			var fieldSpan = toolbatr.find("span[data-id='" + data.field + "']");
+			if(fieldSpan.length==0){
+				toolbatr.append('<span class="layui-badge layui-bg-blue" data-id="' + data.field + '" style="margin-right: 10px">' + data.title + '</span>');
+			}
+		}
+	};
+	ReferConfig.prototype.UNUSEQUERY = function (data,referFilter,config){
+		var that = this;
+		var toolbatr = $("[layui-filter='query_toolbar_" + referFilter + "']");
+		if(toolbatr){
+			var fieldSpan = toolbatr.find("span[data-id='" + data.field + "']");
+			if(fieldSpan.length>0){
+				fieldSpan.remove()
+			}
+		}
+	};
+	/**
+	 * 鍒濆鍖栬〃鍗�
+	 * @param referFilter
+	 * @param config
+	 */
+	ReferConfig.prototype.initForm = function (referFilter,config,defaultValues) {
+		var that = this;
+		var form = layui.form;
+		//鍔ㄦ�佽绠椾釜鏁�
+		var screenWidth = webUtil.getDialogScreenWidth({fullScreen: true});
+		var preWidth = 360;
+
+		//蹇樿form閲岄潰涓哄暐瑕佸噺鍘�1浜嗭紝涓嶆暍鏀�
+		var defaultColumnOneRow = (screenWidth - screenWidth % preWidth) / preWidth;
+
+		var btmId = config.options.btmTypeId;
+		if(config && config.options && config.options.formValues && config.options.useFormKey){
+			btmId = config.options.formValues[config.options.useFormKey];
+			defaultValues.referType=btmId;
+			defaultValues.referTypeName=config.options.formValues[config.options.useFormText];
+			if(webUtil.isNull(defaultValues.referTypeName)){
+				defaultValues.referTypeName=defaultValues.referType;
+			}
+		}
+		form.addItems('form_' + referFilter, that.getFormItems(config,btmId),
+			function () {
+				form.setValues(defaultValues, 'form_' + referFilter);
+				form.on('select(type)', function (data) {
+					form.removeItems("formtype_" + referFilter, [], true)
+					var values=form.getValues('form_' + referFilter);
+					form.addItems("formtype_" + referFilter, that.getFormTypeItems(config, data.value,values.referType), function () {
+						form.setValues(defaultValues, "formtype_" + referFilter);
+					}, {}, {defaultColumnOneRow: defaultColumnOneRow, labelWidth: 160})
+
+					if (data.value == 'grid' || data.value == 'default') {
+						$("[layui-filter='column_toolbar_" + referFilter + "']").show();
+						defaultValues.type = data.value;
+						that.initTable(referFilter, config, defaultValues);
+					} else {
+						$("[layui-filter='column_toolbar_" + referFilter + "']").hide();
+						layui.table.destory('column_' + referFilter);
+					}
+				})
+				form.on('select(form_' + referFilter + ')', function (data) {
+					if (data.name == 'referType') {
+						var values = form.getValues("form_" + referFilter);
+						if (values.type == 'grid' || values.type == 'default' || values.type == 'tree') {
+							form.setValues({sortField:''}, "formtype_" + referFilter);
+							form.changeItems('formtype_' + referFilter, {
+								field: 'sortField',
+								title: '鎺掑簭瀛楁',
+								tooltips: '鏌ヨ鏁版嵁鏃剁殑鎺掑簭瀛楁',
+								showField: 'sortField',
+								type: 'refer',
+								referConfig: {
+									textField: 'id',
+									type: 'platform/objectService/OsAttributeForBtmRefer',
+									isMuti: false,
+									where: {
+										btmTypeId: data.value,
+										hasDefaultAttr: true
+									}
+								}
+							})
+						}
+					}
+				})
+			}, {}, {defaultColumnOneRow: defaultColumnOneRow, labelWidth: 160});
+	};
+
+	ReferConfig.prototype.initFormType = function (referFilter,config,defaultValues){
+		var that = this;
+		var form = layui.form;
+		//鍔ㄦ�佽绠椾釜鏁�
+		var screenWidth = webUtil.getDialogScreenWidth({fullScreen: true});
+		var preWidth = 430;
+
+		//蹇樿form閲岄潰涓哄暐瑕佸噺鍘�1浜嗭紝涓嶆暍鏀�
+		var defaultColumnOneRow = (screenWidth - screenWidth % preWidth) / preWidth  ;
+		form.addItems('formtype_'+referFilter, that.getFormTypeItems(config,defaultValues.type,defaultValues.referType),
+			function () {
+				form.setValues(defaultValues, 'formtype_'+referFilter);
+			}, {}, {defaultColumnOneRow: defaultColumnOneRow, labelWidth: 160});
+	};
+
+	ReferConfig.prototype.getFormItems = function (config,btmId){
+		var that = this;
+		var form = layui.form;
+		return [{
+			field:'line1',
+			type: 'line',
+			text: '鍩烘湰淇℃伅'
+		},{
+			field: 'referType',
+			title: '鍙傜収鐨勪笟鍔$被鍨�',
+			tooltips: '鍙傜収鏁版嵁鏌ヨ鐨勪笟鍔$被鍨�',
+			required: true,
+			defaultValue:btmId,
+			showField:'referTypeName',
+			type:'refer',
+			referConfig:{
+				valueField:'id',
+				type:'platform/objectService/OsBtmTypeRefer'
+			},
+			readOnly: $webUtil.isNotNull(btmId)
+		}, {
+			field: 'textField',
+			title: '鏄剧ず鐨勫睘鎬�',
+			tooltips: '閫夋嫨鏁版嵁鍚庯紝鏄剧ず鍒板瓧娈典笂鐨勪俊鎭墍灞炵殑灞炴�э紝涓�鑸兘鏄痭ame,濡傛灉鏄涓睘鎬т娇鐢ㄩ�楀彿鍒嗗壊锛屽id,name',
+			required: true,
+			defaultValue: 'name'
+		}, {
+			field: 'valueField',
+			title: '瀛樺偍鍊肩殑灞炴��',
+			tooltips: '閫夋嫨鏁版嵁鍚庯紝淇濆瓨鍒版暟鎹簱閲岀殑灞炴�э紝涓�鑸兘鏄痮id鎴栬�卛d锛屽鏋滄槸澶氫釜灞炴�т娇鐢ㄩ�楀彿鍒嗗壊锛屽oid,id',
+			required: true,
+			defaultValue: 'oid'
+		},{
+			field: 'type',
+			title:'鍙傜収绐楀彛绫诲瀷',
+			tooltips:'default:榛樿鐨勫弬鐓х獥鍙f牱寮�; stand:UI涓婁笅鏂囬厤缃殑鏂瑰紡; classify:鍒嗙被+妗f鐨勬樉绀�; 鑷畾涔夌殑鍙傜収鐩存帴鍐檍s鐨勭粍浠惰矾寰勶紱tree:鏍戝舰灞曠ず;grid:鍒楄〃灞曠ず',
+			defaultValue: 'default',
+			type:'combox',
+			editable:true,
+			comboxKey: 'referDialogType',
+			data:[{key:"default",value: "榛樿鏍峰紡"},{key:'stand',value: "骞冲彴閰嶇疆"},{key:"tree",value: "鏍戝舰"},{key:'grid',value: '鍒楄〃'},
+				{key:"refer/OrgDepartmentRefer",value: "閮ㄩ棬鏍�"},{key:"refer/OrgDepartmentGridRefer",value: "閮ㄩ棬鍒楄〃"},{key:"refer/SmUserRefer",value: "鐢ㄦ埛"},
+				{key:"refer/SmUserGridRefer",value: "鐢ㄦ埛鍒楄〃"},{key:"refer/SmRoleRefer",value: "瑙掕壊鍒楄〃"},{key:"refer/OrgDutyRefer",value: "鑱屽姟"}
+				,{key:(configData.compatibility?'':'refer/SmWorkTypeRefer'),value: "宸ョ"},{key:(configData.compatibility?"refer/WfProcessTemplateRefer":''),value: "娴佺▼妯℃澘"}],
+			url:"bdSelectInputController/listByFlag",
+			backPath:that.backPath,
+			extraParams:{
+				namespace:'referDialogType',
+				flag:'referDialogType'
+			},
+			required: true
+		},{
+			field:'url',
+			title:'鑷畾涔夌殑鍚庡彴璺緞',
+			tooltips: '閫氬父涓虹┖锛涘鏋滄槸鍒楄〃锛屽悗鍙板繀椤昏繑鍥濪ataGrid锛屽鏋滄槸鏍戯紝鍚庡彴蹇呴』杩斿洖List<Tree>'
+		},{
+			field: 'backPath',
+			title: '鏈嶅姟鐨勫湴鍧�',
+			tooltips: '閫氬父涓虹┖锛屽湪鏀寔寰湇鍔℃垨鑰呭垎甯冨紡閮ㄧ讲鐨勬椂鍊欐墠閰嶇疆'
+		},{
+			field: 'method',
+			title: '璇锋眰鍚庡彴鐨勫崗璁柟寮�',
+			defaultValue: 'GET',
+			type:'combox',
+			comboxKey: 'httpMethodInRefer',
+			data:[{key:'GET',value: "GET"},{key:'PUT',value: "PUT"},{key:'POST',value: "POST"}],
+			tooltips: 'HTTP鐨勫崗璁柟寮忥紝鏀寔POST,PUT,GET锛屼竴鑸兘鏄疓ET'
+		},{
+			field: 'height',
+			title: '绐楀彛鏄剧ず鐨勯珮搴�',
+			tooltips: '榛樿绌虹潃锛岃缃悗琛ㄧず寮哄埗鏄剧ず杩欐牱鐨勯珮搴�'
+		},{
+			field: 'useFormKey',
+			title: '杩囨护(绾ц仈)灞炴��',
+			tooltips: '鑾峰彇琛ㄥ崟涓婄殑鍏朵粬灞炴�х殑灞炴�х殑鍊兼潵杩囨护,鎴栬�呬娇鐢ㄦ煇涓睘鎬ф潵绾ц仈閫夋嫨'
+		},{
+			field: 'paramForFormKey',
+			title: '杩囨护灞炴�ц姹傚弬鏁�',
+			tooltips: '浣跨敤杩囨护灞炴�ф椂锛屽彂閫佺粰鍚庡彴鐨勮姹傚弬鏁�'
+		}, {
+			field: 'isMuti',
+			title: '鏄惁澶氶��',
+			defaultValue: 'false',
+			type: 'truefalse'
+		},{
+			field: 'mapFields',
+			title: '鏄犲皠鍏朵粬灞炴��',
+			tooltips: '閫夋嫨鏁版嵁鍚庯紝灏嗛�夋嫨鐨勬暟鎹嫹璐濆埌琛ㄥ崟閲岀殑鍏朵粬灞炴�э紝涔﹀啓鏍煎紡涓簕褰撳墠琛ㄥ崟涓婄殑灞炴��:閫夋嫨鏁版嵁閲岀殑灞炴��,xxxxx:yyyy}',
+			useAllWidth:true,
+			inputWidth:760
+		}];
+	};
+	ReferConfig.prototype.getFormTypeItems = function (config,formtype,referType) {
+		var that = this;
+		var items = []
+		var btmId = config.options.btmTypeId;
+		if(config && config.options && config.options.formValues && config.options.useFormKey){
+			btmId = config.options.formValues[config.options.useFormKey];
+		}
+		if(referType){
+			btmId=referType;
+		}
+		if (formtype == 'default') {
+			items = [{
+				field: 'line2',
+				type: 'line',
+				text: '榛樿鍙傜収鐨勯厤缃紙涓嬫柟鍒楄〃)'
+			}, {
+				field: 'limit',
+				title: '姣忛〉鏄剧ず鏉℃暟',
+				tooltips: '鍒嗛〉鏃舵瘡椤垫樉绀虹殑鏁伴噺锛屼笉鍒嗛〉濉�-1',
+				defaultValue: '15'
+			}, {
+				field: 'sortField',
+				title: '鎺掑簭瀛楁',
+				tooltips: '鏌ヨ鏁版嵁鏃剁殑鎺掑簭瀛楁',
+				showField:'sortField',
+				type:'refer',
+				referConfig:{
+					textField:'id',
+					type:'platform/objectService/OsAttributeForBtmRefer',
+					isMuti:false,
+					where: {
+						btmTypeId: btmId,
+						hasDefaultAttr: true
+					}
+				}
+			}, {
+				field: 'sortType',
+				title: '鎺掑簭绫诲瀷',
+				tooltips: '鏌ヨ鏁版嵁鏃剁殑鎺掑簭绫诲瀷',
+				type: 'combox',
+				comboxKey: 'sortType',
+				data: [{key: 'asc', value: '鍗囧簭'}, {key: 'desc', value: '闄嶅簭'}]
+			}]
+		}else if (formtype == 'grid') {
+			items = [{
+				field: 'line2',
+				type: 'line',
+				text: '鍒楄〃鍙傜収鐨勯厤缃紙涓嬫柟鍒楄〃)'
+			}, {
+				field: 'limit',
+				title: '姣忛〉鏄剧ず鏉℃暟',
+				tooltips: '鍒嗛〉鏃舵瘡椤垫樉绀虹殑鏁伴噺锛屼笉鍒嗛〉濉�-1',
+				defaultValue: '15'
+			}, {
+				field: 'sortField',
+				title: '鎺掑簭瀛楁',
+				tooltips: '鏌ヨ鏁版嵁鏃剁殑鎺掑簭瀛楁',
+				showField:'sortField',
+				type:'refer',
+				referConfig:{
+					textField:'id',
+					type:'platform/objectService/OsAttributeForBtmRefer',
+					isMuti:false,
+					where: {
+						btmTypeId: btmId,
+						hasDefaultAttr: true
+					}
+				}
+			}, {
+				field: 'sortType',
+				title: '鎺掑簭绫诲瀷',
+				tooltips: '鏌ヨ鏁版嵁鏃剁殑鎺掑簭绫诲瀷',
+				type: 'combox',
+				comboxKey: 'sortType',
+				data: [{key: 'asc', value: '鍗囧簭'}, {key: 'desc', value: '闄嶅簭'}]
+			}]
+		} else if (formtype == 'tree') {
+			items = [{
+				field: 'line2',
+				type: 'line',
+				text: '鏍戝舰鍙傜収淇℃伅'
+			}, {
+				field: 'parentFieldName',
+				required: true,
+				title: '鏍戝舰鐨勪笂绾у睘鎬�',
+				tooltips: '鏍戝舰灞曠ず鐨勬椂鍊欙紝涓婁笅绾у叧绯绘煡鎵剧殑灞炴�с��'
+			}, {
+				field: 'parentUsedField',
+				title: '涓婄骇灞炴�у�煎搴斿睘鎬�',
+				defaultValue: 'oid',
+				tooltips: '涓婄骇灞炴�у瓨鍌ㄧ殑鍊硷紝鏄笂绾ф暟鎹殑浠�涔堝睘鎬с�備竴鑸兘鏄痮id'
+			}, {
+				field: 'parentValue',
+				title: '鏍硅妭鐐圭殑鍊�',
+				tooltips: '鏍戝舰灞曠ず鐨勬椂鍊欙紝涓婄骇鐨勫��'
+			}, {
+				field: 'loadType',
+				title: '鏍戝姞杞芥柟寮�',
+				defaultValue: 'all',
+				type: 'combox',
+				comboxKey: 'treeLoadType',
+				data: [{key: 'all', value: '鍏ㄩ儴'}, {key: 'node', value: '閫愮骇鍔犺浇'}]
+			}, {
+				field: 'onlyLeaf',
+				title: '鏄惁鍙兘閫夋嫨鍙跺瓙鑺傜偣',
+				tooltips: '鏄痶ree鐨勬柟寮忔椂锛屾槸鍚﹀彧鑳介�夋嫨鍙跺瓙鑺傜偣',
+				defaultValue: 'false',
+				type: 'truefalse'
+			}, {
+				field: 'sortField',
+				title: '鎺掑簭瀛楁',
+				tooltips: '鏌ヨ鏁版嵁鏃剁殑鎺掑簭瀛楁',
+				showField:'sortField',
+				type:'refer',
+				referConfig:{
+					textField:'id',
+					type:'platform/objectService/OsAttributeForBtmRefer',
+					isMuti:true,
+					where: {
+						btmTypeId: btmId,
+						hasDefaultAttr: true
+					}
+				}
+			}, {
+				field: 'sortType',
+				title: '鎺掑簭绫诲瀷',
+				tooltips: '鏌ヨ鏁版嵁鏃剁殑鎺掑簭绫诲瀷',
+				type: 'combox',
+				comboxKey: 'sortType',
+				data: [{key: 'asc', value: '鍗囧簭'}, {key: 'desc', value: '闄嶅簭'}]
+			}]
+		} else if (formtype == 'stand') {
+			items = [{
+				field: 'line2',
+				type: 'line',
+				text: 'stand(骞冲彴閰嶇疆)鍙傜収'
+			}, {
+				field: 'referContent',
+				title: '鍙傜収鐨刄I涓婁笅鏂�',
+				tooltips: '鍙湁鍙傜収绐楀彛绫诲瀷鏄痵tand鏃舵墠蹇呴』璁剧疆锛屼笖鍦╯tand绫诲瀷涓嬫墠鑳界敓鏁�'
+			}, {
+				field: 'displayTable',
+				title: '骞冲彴鐨勮〃鏍肩紪鍙�',
+				tooltips: '涓庡弬鐓х殑UI涓婁笅鏂囦簰鏂ワ紝鍙湁鍙傜収绐楀彛绫诲瀷鏄痵tand鏃舵墠蹇呴』璁剧疆锛屼笖鍦╯tand绫诲瀷涓嬫墠鑳界敓鏁�'
+			}]
+		}
+		return items;
+	};
+
+	ReferConfig.prototype.getSelectValue = function(filter,name,isMuti){
+		var that = this;
+		var form = layui.form;
+		var table = layui.table;
+		var referFilter = filter+"_" + name;
+		if (form.validata('form_'+referFilter) && form.validata('formtype_'+referFilter)) {
+			var values = form.getValues('form_' + referFilter, true);
+			var typevalues = form.getValues('formtype_' + referFilter, true);
+			$.extend(values,typevalues);
+			var tableData = table.getData('column_' + referFilter,true);
+			debugger;
+			var whereData = table.getData('where_' + referFilter,true);
+			var selectValue = {};
+			if(values.type=='grid' || values.type=='default'){
+				var toolbatr = $("[layui-filter='query_toolbar_" + referFilter + "']");
+				var queryColumns=[]
+				if(toolbatr){
+					var fieldSpan = toolbatr.find("span[data-id]");
+					layui.each(fieldSpan,function (i,item){
+						for(var j=0;j<tableData.length;j++){
+							if($(item).attr('data-id')==tableData[j].field){
+								queryColumns.push(tableData[j])
+								return;
+							}
+						}
+					})
+				}
+
+				values.tableConfig = {
+					page: {
+						limit: values.limit,
+						page: 1
+					},
+					cols: tableData,
+					queryColumns: queryColumns
+				}
+			}else{
+				delete values.tableConfig
+			}
+			if(whereData.length>0){
+				values.where={}
+				layui.each(whereData,function (i,item){
+					if(item.field && item.field!=''){
+						if(item.type=='like'){
+							values.where[item.field]="*" +item.value + "*"
+						}else{
+							values.where[item.field]=item.type+item.value
+						}
+					}
+				})
+			}else{
+				delete values.where
+			}
+			if($webUtil.isNotNull(typevalues.sortField)){
+				values.remoteSort=true;
+				var sortType=typevalues.sortType
+				if(typevalues.sortField.indexOf(',')!=-1){
+					sortType=[]
+					layui.each(typevalues.sortField.split(','),function (i,item){
+						sortType.push(typevalues.sortType)
+					})
+					sortType=sortType.join(',')
+				}
+				values.initSort = {
+					field: typevalues.sortField
+					, type: sortType
+				}
+			}else{
+				values.remoteSort=false
+				delete values.initSort
+			}
+
+			selectValue = {
+				value: JSON.stringify(values),
+				rawValue: JSON.stringify(values),
+				allValues: values
+			};
+			//console.log(selectValue)
+			return selectValue;
+		}
+	};
+	var rg = new ReferConfig();
+	exports('referConfig',rg);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciFilePreview.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciFilePreview.js
new file mode 100644
index 0000000..07b6e86
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciFilePreview.js
@@ -0,0 +1,91 @@
+/**
+ * 鏂囦欢棰勮
+ * @author weidy@2020/8/27
+ */
+layui.define(['layer','FilePreviewBase'],function(exports){
+    var Class = function(){
+        this.MODELNAME = "vciFilePreview";
+        this.moduleKey = "vciFilePreview";
+        this.id='vciFilePreview';
+        this.sourceData={};
+        this.columns = [];
+        this.backPath =  configData.compatibility?path:configData.fileServicePath;
+        this.processPath = configData.compatibility?path:configData.processServicePath;
+        this.url={
+            preview:'vciFileQueryController/previewFile',
+            downloadByFileOid:'vciFileDownloadController/downloadByFileOid'
+        };
+        this.showType = {
+            tab:"tab",
+            inner:"inner",
+            dialog:'dialog'
+        };
+        this.doPreview = function(fileoid,fileName,options){
+        	//鎵ц棰勮 
+        	var that = this;
+        	var url = $webUtil.isNull(options.url)?that.url.preview:options.url
+            //鍚庡彴涓昏鏄帶鍒舵潈闄�
+        	$webUtil.post(url,{ownbizOid:options.ownbizOid,ownbizBtm:options.ownbizBtm,fileOid:fileoid},function(result){
+                 if(result.success){
+                     //鐩存帴璋冪敤棰勮鐨勯〉闈�
+                     //寮瑰嚭绐楀彛锛岃繕鏄�夐」鍗℃樉绀�
+                     options.viewType = (options.viewType?options.viewType:"active");
+                     var title = '棰勮銆�' + fileName + "銆�";
+                     if(that.showType.tab == options.showType){
+                        //鍦ㄧ郴缁熶笂鏂版墦寮�閫夐」鍗�
+                         portal.showTabByMenu(options.id + "_preview",{
+                             text:title,
+                             id:options.id + "_preview",
+                             multiCompent:true,       
+                             url:'usejs:FilePreviewBase?fileOids=' + fileoid + "&reswitch=" + (options.reswitch?options.reswitch:"true") + "&viewtype=" + options.viewType + "&hideRightPanel=" + (options.hideRightPanel?options.hideRightPanel:false)
+                         });
+                     }else if(that.showType.inner == options.showType){
+                         //宓屽叆棰勮鐨勭粍浠讹紝闇�瑕佷紶閫掍竴涓厓绱犵殑id
+                         var preview = layui['FilePreviewBase'];
+
+                         $("#" + options.elem).html(preview.getContent(options.id));
+                         $("#" + options.elem+" div").eq(1).hide()
+                         preview.init(options.id,{
+                             id:options.id,
+                             fileOids:fileoid,
+                             reswitch:(options.reswitch?options.reswitch:"true"),
+                             viewtype:options.viewType,
+                             hideRightPanel:(options.hideRightPanel?options.hideRightPanel:false),
+                             showType:that.showType.inner
+                         });
+                     }else {
+                         //榛樿鏄脊鍑虹獥鍙�
+                         $webUtil.dialog({
+                             content:'<div id="' + options.id + '_preview"></div>',
+                             title:title,
+                             fullScreen:true,
+                             success:function(layero){
+                                 var preview = layui['FilePreviewBase'];
+                                 
+                                 $("#" + options.id + "_preview").html(preview.getContent(options.id));
+                                 preview.init(options.id,{
+                                     id:options.id,
+                                     fileOids:fileoid,
+                                     reswitch:(options.reswitch?options.reswitch:"true"),
+                                     viewtype:options.viewType,
+                                     hideRightPanel:(options.hideRightPanel?options.hideRightPanel:false)
+                                 });
+                             }
+                         });
+                     }
+                 }else if(result.code == "notsupportpreview"){
+                     $webUtil.showMsg("鎮ㄩ�夋嫨鐨勬枃浠朵笉鏀寔棰勮锛屽皢涓烘偍璺宠浆鑷充笅杞芥枃浠�",function(){
+                        var iframeId = MD5(fileoid + $webUtil.getSystemVar($webUtil.systemValueKey.userOid));
+                        $webUtil.fileDownload(that.backPath + that.url.downloadByFileOid + "?fileOids=" + fileoid +"&downloadUUID=" + iframeId)
+                     });
+                 }else{
+                     $webUtil.showErrorMsg(result.msg);
+                 }
+             },function(xhr,error){
+                 $webUtil.showErrorMsg("鍦ㄩ獙璇佹槸鍚﹀彲浠ラ瑙堢殑鏃跺�欏嚭鐜颁簡閿欒锛屽彲鑳芥槸鏂囦欢鏈嶅姟娌℃湁鍚姩");
+             },options.inProcess?that.processPath:that.backPath);
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebAdvSearch.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebAdvSearch.js
new file mode 100644
index 0000000..4123651
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebAdvSearch.js
@@ -0,0 +1,959 @@
+/**
+ * Created by dengbk on 2019/6/6.
+ */
+/*
+* 楂樼骇鏌ヨ
+*
+* */
+layui.extend({
+    dcConfig: 'dynamicCondition/dcConfig'
+}).define(['jquery','table', 'form','laydate','dcConfig'], function (exports) {
+    "use strict";
+    layui.link(layui.cache.base + 'dynamicCondition/dc.css');
+    var MOD_NAME = 'dynamicCondition',
+        $ = layui.jquery,
+        dcConfig = layui.dcConfig || {},
+        laydate = layui.laydate,
+        table = layui.table,
+        form = layui.form;
+    var tempVal = {value:"",text:""};
+
+    //鍒涘缓瀹炰緥
+    var createInstance = function(_config){
+        var instance = {
+            data:[]
+            ,config:_config
+            ,requestData:{}
+            ,cacheCondition:[] //缂撳瓨鏌ヨ鏉′欢
+            ,conditionContainerId:(Math.random()+"").substr(2)//闅忔満鏃ユ湡id
+            ,conditionFieldWidth:_config.conditionFieldWidth || 120 //绗竴鍒楅粯璁ゅ搴�
+            ,conditionOptionWidth:_config.conditionOptionWidth || 100//绗簩鍒楅粯璁ゅ搴�
+            ,conditionValueWidth:_config.conditionValueWidth || 150 //绗笁鍒楅粯璁ゅ搴�
+            ,height:380 //寮瑰嚭绐楀彛榛樿楂樺害
+            ,width:610 //寮瑰嚭绐楀彛榛樿瀹藉害
+        };
+        if(instance.config.type != "complex"){
+            instance.width = instance.width - instance.conditionOptionWidth;
+        }
+        /**璁剧疆鏄剧ず妯″紡
+         * displayModel,鍙栧�硷細'popup'/'unpopup'
+         * */
+        instance.setDisplayModel = function(displayModel){
+            instance.config.displayModel = displayModel || instance.config.displayModel;
+            if(instance.config.displayModel == "unpopup"){
+                instance.conditionValueWidth = 100;
+                instance.buildConditionHtmlForUnpopup();
+                if(instance.openPageIndex){
+                    layer.close(instance.openPageIndex);
+                }
+            }else{
+                instance.conditionValueWidth = 150;
+                instance.buildConditionHtml();
+            }
+        }
+        /**鏍规嵁瀛楁鍚嶇О鑾峰彇瀵瑰簲鐨勯厤缃」*/
+        instance.getObjByField=function(conditionFieldVal){
+            for(var i=0;i<instance.data.length;i++){
+                if(instance.data[i].field == conditionFieldVal){
+                    return instance.data[i];
+                }
+            }
+            return null;
+        }
+        /**鏍规嵁瀛楁鍚嶇О鑾峰彇琛宒iv锛岃繑鍥炰竴涓猟om绫诲瀷鐨勬暟缁�*/
+        instance.getRowDivs=function(conditionFieldVal){
+            var rs = [];
+            var allRowDivJqs = $("#" + instance.conditionContainerId).find(".conditionRow");
+            allRowDivJqs.each(function(){
+                var selVal = $(this).find(".conditionField option:selected").val();
+                if(conditionFieldVal == selVal){
+                    rs.push($(this)[0]);
+                }
+            })
+            return rs;
+        }
+        /**鏍规嵁瀛楁鍚嶇О鑾峰搴旂殑鍊硷紝濡傛灉璇ュ瓧娈垫潯浠舵湁澶氫釜锛屽垯鍙彇绗竴琛屽搴旂殑鍊笺��*/
+        instance.getVal=function(conditionFieldVal){
+            var rs = instance.getRowDivs(conditionFieldVal);
+            if(rs.length == 0){
+                //娌℃湁瀵瑰簲鐨勭殑鍊�
+                return null;
+            }
+            var rowDiv = rs[0];
+            var eleJq = rowDiv.eleJq;
+            var eleLeftJq = rowDiv.eleLeftJq;
+            var eleRightJq = rowDiv.eleRightJq;
+            if(eleJq){
+                return rowDiv.curEditor.getRequestValue(eleJq);
+            }
+            //鎿嶄綔绗︽槸between鏃惰繑鍥�2涓��
+            else if(eleLeftJq){
+                return {left:rowDiv.curEditor.getRequestValue(eleLeftJq),right:rowDiv.curEditor.getRequestValue(eleRightJq)};
+            }
+            //褰撴搷浣滅鏄痚mpty鏃惰繑鍥瀗ull
+            return null;
+        }
+        /**鏍规嵁瀛楁鍚嶇О鑾峰搴旂殑鍊硷紝濡傛灉璇ュ瓧娈垫潯浠舵湁澶氫釜锛屽垯鍙彇绗竴琛屽搴旂殑鍊笺��*/
+        instance.getValText=function(conditionFieldVal){
+            var rs = instance.getRowDivs(conditionFieldVal);
+            if(rs.length == 0){
+                //娌℃湁瀵瑰簲鐨勭殑鍊�
+                return null;
+            }
+            var rowDiv = rs[0];
+            var eleJq = rowDiv.eleJq;
+            var eleLeftJq = rowDiv.eleLeftJq;
+            var eleRightJq = rowDiv.eleRightJq;
+            if(eleJq){
+                return {value:rowDiv.curEditor.getRequestValue(eleJq), text:rowDiv.curEditor.getRequestText(eleJq)};
+            }
+            //鎿嶄綔绗︽槸between鏃惰繑鍥�2涓��
+            else if(eleLeftJq){
+                return {
+                    left:{value:rowDiv.curEditor.getRequestValue(eleLeftJq), text:rowDiv.curEditor.getRequestText(eleLeftJq)}
+                    ,right:{value:rowDiv.curEditor.getRequestValue(eleRightJq), text:rowDiv.curEditor.getRequestText(eleRightJq)}
+                };
+            }
+            //褰撴搷浣滅鏄痚mpty鏃惰繑鍥瀗ull
+            return null;
+        }
+        /**璁剧疆鍒濆鏉′欢
+         * conditionArr,渚嬶細
+         * */
+        instance.setCondition = function(conditionArr){
+            for(var i=0;i<conditionArr.length;i++){
+                //鍒濆璧嬪��
+                var conditionTemp = conditionArr[i];
+                var conditionFieldVal = conditionTemp[0];
+                var item = instance.getObjByField(conditionFieldVal);
+                var conditionValueVal = item["initVal"];
+                var conditionValueLeftVal = item["initLeftVal"];
+                var conditionValueRightVal = item["initRightVal"];
+                conditionTemp[1] = conditionTemp[1] || "equal";
+                var conditionOptionVal = conditionTemp[1];
+                if(conditionOptionVal == "between"){
+                    conditionTemp[2] = conditionTemp[2] || {value:conditionValueLeftVal};
+                    conditionTemp[3] = conditionTemp[3] || {value:conditionValueRightVal};
+                }else{
+                    conditionTemp[2] = conditionTemp[2] || {value:conditionValueVal};
+                }
+            }
+            //缂撳瓨鏌ヨ鏉′欢
+            var cacheCondition = parseToCacheCondition(conditionArr, instance.config.type);
+            instance.cacheCondition = cacheCondition;
+            instance.setDisplayModel();
+            instance.lastRequestData = instance.buildRequestData();
+        }
+        /**鏂板鏉′欢*/
+        instance.addRow = function(){
+            var conditionContainerJq = $("#"+instance.conditionContainerId);
+            var conditionRowJq = $('<div class="conditionRow"></div>');
+            if(instance.config.type == "complex"){
+                var width = instance.conditionFieldWidth + instance.conditionOptionWidth + 2 * instance.conditionValueWidth + 20 + 60;
+//				  conditionRowJq.css("width", width);
+            }else{
+                var width = instance.conditionFieldWidth  + 2 * instance.conditionValueWidth + 20 + 60;
+//				  conditionRowJq.css("width", width);
+            }
+            //瀛楁
+            var conditionField=$('<div class="layui-inline conditionField"></div>');
+//			  conditionField.width(instance.conditionFieldWidth);
+            conditionField.append($(instance.conditionFieldHtml));
+            //鎿嶄綔
+            var conditionOption=$('<div class="layui-inline conditionOption"></div>');
+//			  conditionOption.width(instance.conditionOptionWidth);
+            conditionOption.append($(instance.conditionOptionHtml));
+            //鍊�
+            var conditionValue=$('<div class="layui-inline conditionValue"></div>');
+//			  conditionValue.width(instance.conditionValueWidth*2+20);
+            var conditionDel=$('<div class="layui-inline conditionDel"></div>');
+//			  conditionDel.width(30);
+            //鍒犻櫎鎸夐挳
+            var delJq=$('<a href="javascript:void(0);" class="delRowBtn"><i class="layui-icon layui-icon-close"></i></a>');
+            conditionDel.append(delJq);
+            conditionRowJq.append(conditionField);
+            conditionRowJq.append(conditionOption);
+            conditionRowJq.append(conditionValue);
+            conditionRowJq.append(conditionDel);
+            conditionContainerJq.find(".conditionDiv").append(conditionRowJq);
+
+            //鍒犻櫎浜嬩欢
+            delJq.on("click",function(){
+                conditionRowJq.remove();
+            });
+
+//			  if(instance.config.type == "simple"){
+//				  conditionOption.hide();
+//			  }
+            return conditionRowJq;
+        }
+        /**鏇存柊conditionValue*/
+        instance.updateConditionValue = function(conditionRowJq, conditionObj){
+            var conditionValueJq = conditionRowJq.find(".conditionValue");
+            var conditionFieldVal = conditionRowJq.find("select[name='conditionField']").val();
+            var obj = instance.getObjByField(conditionFieldVal);
+            //娌℃湁瀵瑰簲鐨刼bj锛屽垯涓嶇敤鏇存柊conditionValue
+            if(!obj){
+                return ;
+            }
+            if(!conditionObj){
+                conditionObj = {
+                    conditionValueVal:{value:obj["initVal"]},
+                    conditionValueLeftVal:{value:obj["initLeftVal"]},
+                    conditionValueRightVal:{value:obj["initRightVal"]},
+                }
+            }
+//    		  conditionObj = conditionObj || {conditionValueVal:{},conditionValueLeftVal:{},conditionValueRightVal:{}}
+            if(conditionObj.conditionOptionVal){
+                conditionRowJq.find("select[name='conditionOption']").val(conditionObj.conditionOptionVal);
+            }
+            var conditionOptionVal = conditionRowJq.find("select[name='conditionOption']").val();
+
+
+            //鎸囧畾鎿嶄綔閫夐」
+            if(obj.allowDel === "true"){
+                //鍏佽鍒犻櫎鐨勬潯浠讹紝涓嬫媺瀛楁閫夐」鎺掗櫎鎺変笉鑳藉垹闄ゆ潯浠跺瓧娈点��
+                removeOption(conditionRowJq.find("select[name='conditionField']"), instance.fieldList);
+            }
+            //鎸囧畾鎿嶄綔閫夐」
+            if(obj.ops){
+                removeOption(conditionRowJq.find("select[name='conditionOption']"), obj.ops);
+                //鍒犻櫎鍚庡彲鑳絚onditionOptionVal鍊间細鏀瑰彉銆傛瘮濡傛湰鏉ラ粯璁ゆ槸equal锛岀敱浜庤閫夐」鍒犻櫎浜嗭紝瀵艰嚧榛樿鍊兼槸between浜嗐��
+                conditionOptionVal = conditionRowJq.find("select[name='conditionOption']").val();
+            }
+            //conditionValueJq div涓紦瀛樺搴旂殑edit鍜宑onditionOptionVal锛屼互鍚庝紭鍖栧彧鏈夊綋edit鍜宑onditionOptionVal鏀瑰彉鏃舵墠鑰冭檻鏇存柊conditionValueJq
+            var old_field = conditionValueJq.attr("field");
+            var old_edit = conditionValueJq.attr("edit");
+            var old_conditionOptionVal = conditionValueJq.attr("conditionOptionVal");
+            conditionValueJq.attr("field", obj.field);
+            conditionValueJq.attr("edit", obj.edit);
+            conditionValueJq.attr("conditionOptionVal", conditionOptionVal);
+            var curEditor = dynamicCondition.editor[obj.edit];
+            conditionRowJq[0].curEditor = curEditor;
+            if(conditionOptionVal == "empty"){
+                conditionValueJq.html("");
+//				  form.render(null, 'conditionDiv'+instance.conditionContainerId);
+                return ;
+            }
+            if(curEditor){
+                if(conditionOptionVal == "between"){
+                    var eleLeftJq = $(curEditor.createElement(obj));
+                    var eleRightJq = $(curEditor.createElement(obj));
+                    var divLeft = $("<div style='display:inline-block'></div>");
+                    var divRight = $("<div style='display:inline-block'></div>");
+
+                    divLeft.append(eleLeftJq);
+                    divLeft.attr("name","conditionValueLeft");
+                    divLeft.width(instance.conditionValueWidth);
+
+                    divRight.append(eleRightJq);
+                    divRight.attr("name","conditionValueRight");
+                    divRight.width(instance.conditionValueWidth);
+
+                    //鏇存柊conditionValueJq
+                    conditionValueJq.html("");
+                    conditionValueJq.append(divLeft);
+                    conditionValueJq.append("<span style='margin:auto 3px;'>鑷�</span>");
+                    conditionValueJq.append(divRight);
+                    //蹇呴』灏唈q瀵硅薄杞崲涓篸om瀵硅薄鎵嶈兘缁戝畾瀵硅薄灞炴�с��
+                    conditionRowJq[0].eleJq = null;
+                    conditionRowJq[0].eleLeftJq = eleLeftJq;
+                    conditionRowJq[0].eleRightJq = eleRightJq;
+                    curEditor.fillElement(eleLeftJq,conditionObj.conditionValueLeftVal);
+                    curEditor.fillElement(eleRightJq,conditionObj.conditionValueRightVal);
+                    curEditor.render(eleLeftJq,obj);
+                    curEditor.render(eleRightJq,obj);
+                }else{
+                    var eleJq = $(curEditor.createElement(obj));
+                    var divJq = $("<div></div>");
+                    divJq.append(eleJq);
+                    divJq.attr("name","conditionValue");
+                    conditionValueJq.html("");
+                    conditionValueJq.append(divJq);
+//					  divJq.attr("xpl-dc-val",conditionObj.conditionValueVal);
+                    //蹇呴』灏唈q瀵硅薄杞崲涓篸om瀵硅薄鎵嶈兘缁戝畾瀵硅薄灞炴�с��
+                    conditionRowJq[0].eleJq = eleJq;
+                    conditionRowJq[0].eleLeftJq = null;
+                    conditionRowJq[0].eleRightJq = null;
+                    curEditor.fillElement(eleJq,conditionObj.conditionValueVal);
+                    curEditor.render(eleJq,obj);
+                }
+//				  form.render(null, 'conditionDiv'+instance.conditionContainerId);
+                return ;
+            }
+        }
+        /**鏍¢獙琛ㄥ崟*/
+        instance.verifyForm = function(){
+            var verifySuccess = true;
+            var conditionContainerJq = $("#" + instance.conditionContainerId);
+            var verify = form.config.verify
+                ,DANGER = 'layui-form-danger'
+                ,verifyElem = conditionContainerJq.find('*[lay-verify]') //鑾峰彇闇�瑕佹牎楠岀殑鍏冪礌
+
+            //寮�濮嬫牎楠�
+            for(var i=0;i<verifyElem.length;i++){
+                var item = verifyElem[i];
+                var othis = $(item)
+                    ,vers = othis.attr('lay-verify').split('|')
+                    ,verType = othis.attr('lay-verType') //鎻愮ず鏂瑰紡
+                    ,value = othis.val();
+                othis.removeClass(DANGER);
+                var errorText;
+                //鏄惁鍏佽绌哄��
+                var allowBlank = true;
+                layui.each(vers, function(_, thisVer){
+                    if(thisVer.indexOf("required") >= 0){
+                        //涓嶅厑璁镐负绌哄��
+                        allowBlank = false;
+                    }
+                })
+                //鍏佽涓虹┖鍊�
+                if(allowBlank){
+                    if(value == ""){
+                        //鏍¢獙閫氳繃锛屽鏋滆繕鏈夊叾浠栫殑pass锛宯umber绛変篃涓嶇敤鏍¢獙浜嗐��
+                        continue;
+                    }
+                }
+                //涓嶅厑璁镐负绌哄�硷紝缁х画鏍¢獙
+                for(var j=0;j<vers.length;j++){
+                    var isTrue=null //鏄惁鍛戒腑鏍¢獙
+                        ,thisVer = vers[j]  //鏍¢獙name锛屽锛歳equired锛宲ass 绛�
+                        ,errorText = '' //閿欒鎻愮ず鏂囨湰
+                        ,isFn = typeof verify[thisVer] === 'function';
+                    //鍖归厤楠岃瘉瑙勫垯
+                    if(verify[thisVer]){
+                        isTrue = isFn ? errorText = verify[thisVer](value, item) : !verify[thisVer][0].test(value);
+                        errorText = errorText || verify[thisVer][1];
+                        //isTrue涓簍rue锛屽垯楠岃瘉涓嶉�氳繃
+                        if(isTrue){
+                            verifySuccess = false;
+                            //鎻愮ず
+                            layer.tips(errorText, function(){
+                                if(typeof othis.attr('lay-ignore') !== 'string'){
+                                    if(item.tagName.toLowerCase() === 'select' || /^checkbox|radio$/.test(item.type)){
+                                        return othis.next();
+                                    }
+                                }
+                                return othis;
+                            }(), {tips: [1, '#FF0000']});
+                            othis.addClass(DANGER);
+                            return verifySuccess;
+                        }
+                    }
+                }
+            }
+            return verifySuccess;
+        }
+        /**鏍规嵁鍔ㄦ�佹煡璇㈡潯浠舵瀯閫犵紦瀛樺搴旂殑璇锋眰鏉′欢*/
+        instance.buildCacheCondition = function(){
+            var conditionContainerJq = $("#" + instance.conditionContainerId);
+            var conditionRowJqs = conditionContainerJq.find(".conditionRow");
+            var rowLength = conditionRowJqs.size();
+            //缂撳瓨鏌ヨ鏉′欢
+            var cacheCondition = [];
+            for(var i=0;i<rowLength;i++){
+                var conditionRowJq = conditionRowJqs.eq(i);
+                var valJq = conditionRowJq.find("[name='conditionValue']");
+                var valLeftJq = conditionRowJq.find("[name='conditionValueLeft']");
+                var valRightJq = conditionRowJq.find("[name='conditionValueRight']");
+
+                var conditionObj = {};
+                conditionObj.conditionFieldVal = conditionRowJq.find("select[name='conditionField']").val();
+                conditionObj.conditionOptionVal = conditionRowJq.find("select[name='conditionOption']").val();
+                var item = instance.getObjByField(conditionObj.conditionFieldVal);
+                var curEditor = dynamicCondition.editor[item.edit];
+                if(curEditor){
+                    var conditionRowDOM = conditionRowJq[0];
+                    var tempjq = conditionRowDOM.eleJq;
+                    conditionObj.conditionValueVal = tempjq ? {value:curEditor.getRequestValue(tempjq),text:curEditor.getRequestText(tempjq)} : tempVal;
+                    tempjq = conditionRowDOM.eleLeftJq;
+                    conditionObj.conditionValueLeftVal = tempjq ? {value:curEditor.getRequestValue(tempjq),text:curEditor.getRequestText(tempjq)} : tempVal;
+                    tempjq = conditionRowDOM.eleRightJq;
+                    conditionObj.conditionValueRightVal = tempjq ? {value:curEditor.getRequestValue(tempjq),text:curEditor.getRequestText(tempjq)} : tempVal;
+                }
+                cacheCondition.push(conditionObj);
+            }
+            instance.cacheCondition = cacheCondition;
+            return cacheCondition;
+        }
+        /**鏍规嵁鍔ㄦ�佹煡璇㈡潯浠舵瀯閫犲搴旂殑璇锋眰鍙傛暟.*/
+        instance.buildRequestData = function(cacheCondition){
+            var cacheCondition = cacheCondition || instance.cacheCondition;
+            //璁剧疆璇锋眰鍙傛暟
+            instance.requestData = parseToRequest(cacheCondition ,instance.config.type,instance.config.requestDataType);
+            return instance.requestData;
+        }
+        /**鏍规嵁鍔ㄦ�佹煡璇㈡潯浠舵瀯閫犲搴旂殑鏄剧ず鏂囨湰*/
+        instance.buildConditionHtml = function(){
+
+            var cacheCondition = instance.cacheCondition;
+            var conditionHtml = "";
+            var fieldSelectJq = $(instance.conditionFieldHtml);
+            var optionSelectJq = $(instance.conditionOptionHtml);
+            var blankStr = "&nbsp;&nbsp;";
+            for(var i=0;i<cacheCondition.length;i++){
+                var conditionObj = cacheCondition[i];
+                var fieldText = fieldSelectJq.find("option[value='"+conditionObj.conditionFieldVal+"']").text();
+                var OptionText = optionSelectJq.find("option[value='"+conditionObj.conditionOptionVal+"']").text();
+                var ValueText = conditionObj.conditionValueVal.text;
+                var ValueLeftText = conditionObj.conditionValueLeftVal.text;
+                var ValueRightText = conditionObj.conditionValueRightVal.text;
+
+                var rsValueText="";
+                if(conditionObj.conditionOptionVal == "between"){
+                    rsValueText = ValueLeftText + blankStr+"鑷�"+ blankStr + ValueRightText;
+                }else{
+                    rsValueText = ValueText;
+                }
+                rsValueText = rsValueText || "";
+                //绠�鍗曟ā寮�
+                var spanJq = $("<span class='layui-xpl-dc-circle' index="+i+"></span>");
+                if(instance.config.type == "simple"){
+                    spanJq.html(fieldText + blankStr + ":" + blankStr + rsValueText);
+                    //conditionHtml += fieldText + blankStr + ":" + blankStr + rsValueText;
+                }
+                //澶嶆潅妯″紡
+                else{
+                    spanJq.html(fieldText + blankStr + OptionText + blankStr + rsValueText);
+//    				conditionHtml += fieldText + blankStr + OptionText + blankStr + rsValueText;
+                }
+                var iJq = $('<i class="layui-icon layui-icon-close layui-xpl-dc-delete"></i>');
+                var item = instance.getObjByField(conditionObj.conditionFieldVal);
+                iJq.attr("allowDel", item.allowDel);
+                spanJq.append(iJq);
+                conditionHtml += spanJq.prop("outerHTML");
+            }
+            instance.conditionHtml = "<div class='xpl-dc-popup-query-condition-div'>"+instance.config.popupMsgText + conditionHtml +"</div>";
+            if(instance.config.conditionTextId){
+                var msgJq = $(instance.config.conditionTextId);
+                msgJq.html(instance.conditionHtml);
+                msgJq.append($("<div class='xpl-dc-popup-btns'></div>"));
+                var btnsJq = msgJq.find(".xpl-dc-popup-btns");
+                btnsJq.width(instance.config.popupBtnsWidth);
+                var hideFlag = instance.config.popupShowQueryBtn ? "" : " xpl-hide ";
+                btnsJq.append($("<a class='layui-btn xpl-popup-query" + hideFlag + "'))>鏌ヨ</a>"));
+                btnsJq.find(".xpl-popup-query").on("click",function(){
+                    instance.open();
+                })
+                if(instance.config.extendBtns){
+                    instance.config.extendBtns(btnsJq, instance);
+                }
+                msgJq.append($("<div class='xpl-clear'></div>"));//娓呴櫎娴姩
+                msgJq.find(".xpl-dc-popup-query-condition-div").width(msgJq.width() - btnsJq.width());
+                msgJq.find(".layui-xpl-dc-delete").on("click",function(){
+                    instance.delete(this);
+                })
+                msgJq.find(".layui-xpl-dc-delete[allowDel='false']").hide();
+            }
+        }
+        /**閽堝鏃犲脊绐楃殑鏄剧ず妯″紡鏍规嵁鍔ㄦ�佹煡璇㈡潯浠舵瀯閫犲搴旂殑鏄剧ず鐣岄潰*/
+        instance.buildConditionHtmlForUnpopup = function(){
+            if(instance.config.conditionTextId){
+                var msgJq = $(instance.config.conditionTextId);
+                msgJq.html("");
+                instance.render(msgJq);
+
+                msgJq.append($("<div class='xpl-dc-unpopup-btns'></div>"));
+                var btnDivJq = msgJq.find(".xpl-dc-unpopup-btns");
+                btnDivJq.width(instance.config.unpopupBtnswidth);
+                btnDivJq.append($("<a class='layui-btn xpl-unpopup-query'))>鏌ヨ</a>"));
+                var hideFlag = instance.config.unpopupShowAddBtn ? "" : " xpl-hide ";
+                btnDivJq.append($("<a class='layui-btn xpl-unpopup-add" + hideFlag + "'))>鏂板鏉′欢</a>"));
+                if(instance.config.extendBtns){
+                    instance.config.extendBtns(btnDivJq,instance);
+                }
+                msgJq.append($("<div class='xpl-clear'></div>"));
+                btnDivJq.find(".xpl-unpopup-query").on("click",function(){
+                    if(instance.verifyForm()){
+                        //    				  layer.msg('鏍¢獙閫氳繃');
+                        instance.buildCacheCondition();
+                        instance.query();
+                    }else{
+                        //    				  layer.msg('鏍¢獙澶辫触');
+                    }
+                });
+                btnDivJq.find(".xpl-unpopup-add").on("click",function(){
+                    msgJq.find(".layui-xpl-dc-top-btns .addRowBtn").click();
+                });
+            }
+        }
+        /**鍒犻櫎鏉′欢*/
+        instance.delete = function(ele){
+            var index = $(ele).parent().attr("index");
+            instance.cacheCondition.splice(index, 1);
+            instance.buildConditionHtml();
+            instance.query();
+        }
+        /**鏌ヨ*/
+        instance.query = function(){
+//    		instance.buildConditionHtml();
+            instance.buildRequestData();
+            //ajax璇锋眰锛岄噸杞芥暟鎹�
+            if(instance.config.queryCallBack){
+                instance.config.queryCallBack(instance.requestData);
+            }
+            if(instance.config.tableId){
+                //鏌ョ湅鏄惁鏈夋帓搴�
+                if(instance.config.sortObj){
+                    instance.requestData["sortField"] = sortObj.field; //鎺掑簭瀛楁
+                    instance.requestData["sortOrder"] = sortObj.type; //鎺掑簭鏂瑰紡
+                }
+                //鍥犱负layui鐨則able浼氱紦瀛樹笂娆℃煡璇㈠弬鏁帮紝鎵�浠ュ垹闄ょ殑鏉′欢蹇呴』灏嗗師鍊肩疆绌恒�傚鏋滅洿鎺ュ皢鍘熸潯浠跺垹闄わ紝鍒欒姹備細甯︿笂涓婃缂撳瓨鐨勬潯浠躲��
+                var params = {};
+                if(instance.config.type == "simple"){
+                    instance.lastRequestData = instance.lastRequestData || {};
+                    //鍘熸潯浠剁疆绌�
+                    for(var attr in instance.lastRequestData) {
+                        instance.lastRequestData[attr] = '';//鍚庡彴鎺ユ敹鍙傛暟鏃讹紝璇峰拷鐣ョ┖瀛楃涓茬殑鏉′欢鍙傛暟銆�
+                    }
+                    $.extend( params , instance.lastRequestData);
+                    $.extend( params , instance.requestData);
+                    //缂撳瓨鏈鏌ヨ鏉′欢
+                    instance.lastRequestData = params;
+                }else{
+                    //澶嶅埗妯″紡璇锋眰鍙傛暟鏄暟缁勬ā寮忥紝閫氳繃鏁扮粍闀垮害鍙互鎺у埗锛屾墍浠ヤ笉鐢ㄨ�冭檻缂搇ayui缂撳瓨闂
+                    params = instance.requestData;
+                }
+//				  var curPage = $(".layui-laypage-next").attr("data-page") - 1;
+                table.reload(instance.config.tableId, {
+                    page: {
+                        curr: 1 //閲嶆柊鍔犺浇褰撳墠椤�
+                    }
+                    ,where: params
+                });
+            }
+        }
+        /**鎵撳紑绐楀彛锛屽姩鎬佹坊鍔犳煡璇㈡潯浠�*/
+        instance.open = function(){
+            if(instance.config.displayModel == 'unpopup'){
+                //濡傛灉鏄潪寮圭獥妯″紡锛屽垯鐩存帴鏌ヨ锛屼笉寮瑰嚭绐楀彛銆�
+                $("#"+instance.conditionContainerId).find(".xpl-unpopup-query").click();
+                return ;
+            }
+            if($("#"+instance.conditionContainerId).length > 0){
+                //宸茬粡鎵撳紑浜嗭紝涓嶈兘閲嶅鎵撳紑銆�
+                return ;
+            }
+
+            //椤甸潰灞�-鑷畾涔�
+            instance.openPageIndex = layer.open({
+                type: 1,
+                id: 'dynamicCondition' + instance.conditionContainerId,//闃叉閲嶅寮瑰嚭
+                offset: '50px',
+                title: "鏌ヨ鏉′欢",
+                //closeBtn: 0,
+                shade: 0, //涓嶆樉绀洪伄缃�
+                area: [instance.width + 'px', instance.height +'px'], //瀹介珮
+                maxmin:true,
+//    		  content: conditionContainerHtml
+                content: "<div id='query"+instance.conditionContainerId+"'></div>"
+            });
+            instance.render($("#query"+instance.conditionContainerId));
+        }
+        /**娓叉煋寮瑰嚭鐣岄潰*/
+        instance.render = function(divJq){
+            divJq = divJq || $("#query"+instance.conditionContainerId);
+            var conditionContainerHtml = '<div id="'+instance.conditionContainerId+'" class="conditionContainer" lay-filter="conditionContainer"><div class="layui-xpl-dc-top-btns"><a href="javascript:void(0);" style="margin-left:10px;" class="addRowBtn"><i class="layui-icon layui-icon-add-circle-fine" style="font-size: 30px; color: &#xe608;"></i> </a> <a href="javascript:void(0);" style="margin-left:10px;" class="queryBtn" ><i class="layui-icon layui-icon-search" style="font-size: 30px; color: &#xe615;"></i> </a> </div><div class="conditionDiv layui-form" lay-filter="conditionDiv'+instance.conditionContainerId+'"></div></div>';
+            divJq.append($(conditionContainerHtml));
+            var conditionContainerJq = $("#"+instance.conditionContainerId);
+            //娣诲姞 寮圭獥/闈炲脊绐� 鏍峰紡
+            if(instance.config.displayModel == "unpopup"){
+                conditionContainerJq.addClass("xpl-dc-unpopup");
+            }else{
+                conditionContainerJq.addClass("xpl-dc-popup");
+            }
+            //娣诲姞 澶嶆潅/绠�鍗� 鏍峰紡
+            if(instance.config.type == "complex"){
+                conditionContainerJq.addClass("xpl-dc-complex");
+            }else{
+                conditionContainerJq.addClass("xpl-dc-simple");
+            }
+            var cacheCondition = instance.cacheCondition;
+            for(var i=0;i<cacheCondition.length;i++){
+                var conditionObj = cacheCondition[i];
+                var conditionRowJq = instance.addRow();
+                conditionRowJq.find("select[name='conditionField']").val(conditionObj.conditionFieldVal);
+                conditionRowJq.find("select[name='conditionOption']").val(conditionObj.conditionOptionVal);
+                instance.updateConditionValue(conditionRowJq, conditionObj);
+
+                var conditionFieldVal = conditionRowJq.find("select[name='conditionField']").val();
+                var item = instance.getObjByField(conditionObj.conditionFieldVal);
+                if(item.allowDel === "false"){
+                    //闅愯棌鍒犻櫎鎸夐挳
+                    conditionRowJq.find(".delRowBtn").hide();
+                    //绉婚櫎鍏朵粬涓嬫媺閫夐」
+//		  			conditionRowJq.find("select[name='conditionField']").attr("disabled","disabled");
+                    removeOption(conditionRowJq.find("select[name='conditionField']"),conditionObj.conditionFieldVal);
+                }
+            }
+            instance.afterOpen();
+            conditionContainerJq.css("margin","10px");
+            //鐩戝惉浜嬩欢
+            form.on('select(conditionField)', function(data){
+                if($(data.elem).find("option").length > 1){
+                    var conditionRowJq = $(data.elem).parents(".conditionRow");
+                    //鏇存柊鎿嶄綔閫夐」
+                    var conditionOption= conditionRowJq.find(".conditionOption");
+                    conditionOption.html(instance.conditionOptionHtml);
+                    instance.updateConditionValue(conditionRowJq);
+                    form.render(null, 'conditionDiv'+instance.conditionContainerId);
+                }
+            });
+            form.on('select(conditionOption)', function(data){
+                if($(data.elem).find("option").length > 1){
+                    var conditionRowJq = $(data.elem).parents(".conditionRow");
+                    instance.updateConditionValue(conditionRowJq);
+                }
+            });
+            //鏂板
+            conditionContainerJq.find(".addRowBtn").on("click",function(){
+                var rowJq = instance.addRow();
+                instance.updateConditionValue(rowJq);
+                form.render(null, 'conditionDiv'+instance.conditionContainerId);
+            });
+            var verify = form.config.verify
+            //鏌ヨ
+            conditionContainerJq.find(".queryBtn").on("click",function(){
+                if(instance.verifyForm(conditionContainerJq)){
+//    				  layer.msg('鏍¢獙閫氳繃');
+                    instance.buildCacheCondition();
+                    instance.buildConditionHtml();
+                    instance.query();
+                    layer.close(instance.openPageIndex);
+                    instance.openPageIndex  = null;
+                }else{
+//    				  layer.msg('鏍¢獙澶辫触');
+                }
+            });
+            form.render(null, 'conditionDiv'+instance.conditionContainerId);
+
+        }
+        /**娓叉煋鍚庢墽琛�*/
+        instance.afterOpen = function(){
+            if(instance.config.afterOpen){
+                instance.config.afterOpen(instance);
+            }
+        }
+        return instance;
+    }
+    var defaultValueConfig = {
+        type: 'complex',//鍙栧�硷細'simple'/'complex'榛樿涓哄鏉傛ā寮忋�傚尯鍒�1.鏄剧ず鐣岄潰涓嶄竴鏍凤紝2.鏋勯�犵殑requestData鏍煎紡涓嶄竴鏍枫��
+        requestDataType: 'array',//鍙栧�硷細'array'/'json'.璇锋眰鍙傛暟绫诲瀷銆傞粯璁rray銆�
+        instanceName: 'instanceName',//鍒涘缓鐨勫疄渚嬪悕绉般�傞潪蹇呴』銆傞粯璁や负'instanceName'銆傚綋涓�涓〉闈㈠彧鍒涘缓涓�涓疄渚嬫椂锛屽彲浠ヤ笉鐢ㄨ鍙傛暟
+        displayModel: 'unpopup',//鏄剧ず妯″瀷銆傚彇鍊硷細'popup'/'unpopup'銆� 榛樿"popup"鐐瑰嚮鍚庢彁鍑烘煡璇㈡潯浠惰缃獥鍙c�倁npopup妯″紡鍒欎笉寮瑰嚭绐楀彛锛岀洿鎺ュ湪鐣岄潰涓婅缃潯浠躲��
+        counts: 5,//榛樿鍒濆鍖栨潯浠舵暟銆�
+        popupMsgText: "鏌ヨ鏉′欢锛�",//寮圭獥妯″紡涓媘sg榛樿鎻愮ず鏂囨湰銆備箣鍓嶇増鏈粯璁や负鈥滄煡璇㈡潯浠讹細鈥�
+        popupBtnsWidth: 500,//寮圭獥妯″紡涓嬫寜閽伐鍏烽潰鏉垮搴︺��500px
+        popupShowQueryBtn: false, //寮圭獥妯″紡涓嬶紝鏄惁鏄剧ず鏌ヨ鎸夐挳銆備箣鍓嶇増鏈粯璁ゆ槸涓嶆樉绀虹殑
+        unpopupBtnswidth: 180,//闈炲脊绐楁ā寮忎笅鎸夐挳宸ュ叿闈㈡澘瀹藉害銆�500px
+        unpopupShowQueryBtn: false, //闈炲脊绐楁ā寮忎笅锛屾槸鍚︽樉绀烘柊澧炴潯浠舵寜閽�備箣鍓嶇増鏈粯璁ゆ槸涓嶆樉绀虹殑
+    };
+    //缁ф壙鐢ㄦ埛鑷畾涔夐厤缃��
+    $.extend( defaultValueConfig, dcConfig);
+    var dynamicCondition = {
+        version:'2.0.6'
+        //缂栬緫鍣細鑷甫3涓粯璁ょ紪杈戝櫒锛氭枃鏈瑃ext锛屼笅鎷夋select锛屾棩鏈焏ate
+        ,editor:{}
+        ,defaultValue:defaultValueConfig
+        //缂撳瓨鍒涘缓鐨勫疄渚�
+        ,cacheInstance:{}
+        //鏍规嵁杈撳叆鏋勯�犺姹傚弬鏁般�傝鎺ュ彛涓昏鏄釜宸ュ叿鍑芥暟锛屼究浜庣洿鎺ラ�氳繃js鐢熸垚璇锋眰鍙傛暟璋冪敤鍚庡彴鎺ュ彛銆�
+        ,parseToRequest:function(conditionArr, type, requestDataType){
+            var cacheCondition = parseToCacheCondition(conditionArr, type);
+            var requestMap = parseToRequest(cacheCondition, type, requestDataType);
+            return requestMap;
+        }
+        /***
+         * 鑾峰彇瀹炰緥
+         * instanceName:瀹炰緥鍚嶇О銆傞潪蹇呴』銆傞粯璁や负'instanceName'.褰撲竴涓〉闈㈠彧鍒涘缓涓�涓疄渚嬫椂锛屽彲浠ヤ笉鐢ㄨ鍙傛暟
+         */
+        ,getInstance:function(instanceName){
+            instanceName = instanceName || this.defaultValue.instanceName;
+            return this.cacheInstance[instanceName];
+        }
+        /***
+         * elem/fields/fieldsJsonStr锛氫笁閫変竴.
+         * tableId/queryCallBack: 浜岄�変竴銆倀ableId瀵瑰簲table.render(config)鐨刢onfig.id鍙傛暟.鑷姩閲嶈浇琛ㄦ牸銆俼ueryCallBack(requestData)鍒欒嚜瀹氫箟鍥炶皟
+         * type: 鍙栧�硷細'simple'/'complex'.榛樿涓哄鏉傛ā寮忋�傚尯鍒�1.鏄剧ず鐣岄潰涓嶄竴鏍凤紝2.鏋勯�犵殑requestData鏍煎紡涓嶄竴鏍枫��
+         * requestDataType: 鍙栧�硷細'array'/'json'.璇锋眰鍙傛暟绫诲瀷銆傞粯璁rray銆�
+         * conditionTextId: 鏄剧ず鏌ヨ鏉′欢鐨勯潰鏉块�夋嫨鍣ㄦ垨DOM銆傞潪蹇呴』銆備緥瀛愶細"#frm"
+         * sortObj:鎺掑簭銆傞潪蹇呴』銆備緥瀛愶細{field:'name',type:'desc'}
+         * instanceName: 鍒涘缓鐨勫疄渚嬪悕绉般�傞潪蹇呴』銆傞粯璁や负'instanceName'銆傚綋涓�涓〉闈㈠彧鍒涘缓涓�涓疄渚嬫椂锛屽彲浠ヤ笉鐢ㄨ鍙傛暟
+         * displayModel: 鏄剧ず妯″瀷銆傚彇鍊硷細'popup'/'unpopup'銆� 榛樿"popup"鐐瑰嚮鍚庢彁鍑烘煡璇㈡潯浠惰缃獥鍙c�倁npopup妯″紡鍒欎笉寮瑰嚭绐楀彛锛岀洿鎺ュ湪鐣岄潰涓婅缃潯浠躲��
+         */
+        ,create:function(config){
+            var _config = {};
+            //鍔犺浇鐢ㄦ埛閰嶇疆, 绯荤粺榛樿鍊紅his.defaultValue 鈥斺�斻�嬬敤鎴峰畾涔夐粯璁ゅ�糳cConfig 鈥斺�斻�嬮〉闈㈠疄渚嬪寲榛樿鍊糲onfig
+            $.extend( _config ,this.defaultValue, config);
+            config = _config;
+            var instance = createInstance(config);
+            //鍒濆鍖杋nstance.data
+            if(config.fields){
+                instance.data = config.fields;
+            }
+            else if(config.fieldsJsonStr){
+                instance.data = $.parseJSON(config.fieldsJsonStr);
+            }
+            else if(config.elem){ //鎸囧畾瀹瑰櫒鐨勯�夋嫨鍣ㄦ垨 DOM锛屾柟娉曟覆鏌撴柟寮忓繀濉�.绀轰緥"#dcDemo"锛屾垨鑰匘OM
+                var liObjs = $(config.elem).find("li");
+                liObjs.each(function(){
+                    var item = {};
+                    //attrList鏁扮粍涓殑灞炴�э紝閫氳繃this.attributes鑾峰彇鍒板睘鎬у悕绉板彲鑳藉彉灏忓啓銆傛墍浠ラ渶瑕佺壒鍒鐞嗕笅銆�
+                    var attrList = ["allowDel"];
+                    var attrLowerList = [];
+                    for(var i=0;i<attrList.length;i++){
+                        attrLowerList.push(attrList[i].toLowerCase());
+                    }
+                    $.each(this.attributes, function() {
+                        // this.attributes is not a plain object, but an array
+                        // of attribute nodes, which contain both the name and value
+                        if(this.specified) {
+                            var idx = attrLowerList.indexOf(this.name.toLowerCase())
+                            item[idx == -1 ? this.name : attrList[idx]]= this.value
+                        }
+                    });
+                    instance.data.push(item);
+                })
+            }
+            //璁惧畾榛樿鍊�
+            for(var i = 0;i<instance.data.length;i++){
+                var item = instance.data[i];
+                item.edit = item.edit || "text";
+                item.allowDel = typeof item.allowDel == "undefined" ? "true" : ""+item.allowDel;
+                item.placeholder = item.placeholder || "";
+                item.dateType = item.dateType || "date";
+            }
+            //瀛楁 涓嬫媺妗唄tml
+            var selectConditionField = $('<select name="conditionField" lay-filter="conditionField"></select>');
+            var items = instance.data;
+            instance.fieldList = "";
+            instance.showItems = [];
+            for(var i=0;i< items.length;i++){
+                if(items[i].show != "false"){
+                    instance.showItems.push(items[i]);
+                    selectConditionField.append("<option value='"+items[i].field+"'>"+items[i].title+"</option>");
+                    if(items[i].allowDel != "false"){
+                        instance.fieldList += "," + items[i].field;
+                    }
+                }
+            }
+            instance.conditionFieldHtml = selectConditionField.prop("outerHTML");
+            //鎿嶄綔 涓嬫媺妗唄tml
+            var selectconditionOption = $('<select name="conditionOption" lay-filter="conditionOption"></select>');
+            selectconditionOption.append("<option value='equal'>绛変簬</option>");
+            selectconditionOption.append("<option value='like'>鍖呭惈</option>");
+            selectconditionOption.append("<option value='between'>鑼冨洿</option>");
+            selectconditionOption.append("<option value='start'>寮�澶村瓧绗�</option>");
+            selectconditionOption.append("<option value='end'>缁撳熬瀛楃</option>");
+            selectconditionOption.append("<option value='unequal'>涓嶇瓑浜�</option>");
+            selectconditionOption.append("<option value='empty'>涓虹┖</option>");
+            instance.conditionOptionHtml = selectconditionOption.prop("outerHTML");
+            //缂撳瓨瀹炰緥
+            this.cacheInstance[config.instanceName] = instance;
+            var conditionArr = [];
+            if(config.counts){
+                for(var i=0;i<config.counts && i<instance.showItems.length;i++){
+                    var conditionObj = [instance.showItems[i].field];
+                    var _item = instance.showItems[i];
+                    var ops = _item.ops;
+                    if(ops){
+                        var idx = ops.indexOf(",");
+                        conditionObj.push(idx == -1 ? ops : ops.substring(0,idx));
+                    }else{
+                        conditionObj.push(null);
+                    }
+                    conditionArr.push(conditionObj);
+                }
+            }
+            instance.setCondition(conditionArr);
+            return instance;
+        }
+    };
+    var editor = {
+        /***
+         * 鐢熸垚DOM瀵硅薄ele,jquery灏佽杩斿洖$(ele)
+         * item: li鏍囩瑙f瀽鐨勫搴攋son瀵硅薄
+         * return ele,鎴栬��$(ele)
+         */
+        createElement:function(item){
+            return $("<div></div>");
+        }
+        /***
+         * 鍒濆鍊煎~鍏匘OM
+         * ele createElement 鐢熸垚鐨勫璞�
+         * val 鍊�
+         */
+        ,fillElement:function(ele, val){
+            $(ele).val(val.value);
+            $(ele).attr("oldVal",val.value);
+        }
+        /***
+         * 鐢ㄤ簬ajax璇锋眰鎻愪氦鐨勫弬鏁板��
+         */
+        ,getRequestValue:function(ele){
+            return $(ele).val();
+        }
+        /***
+         * 鏌ヨ鏉′欢涓樉绀虹殑鍊�,榛樿涓巊etRequestValue涓�鑷�
+         */
+        ,getRequestText:function(ele){
+            return this.getRequestValue(ele);
+        }
+        /***
+         * ele鍒涘缓鍚庢覆鏌�
+         * ele: createElement 鐢熸垚鐨勫璞�
+         * item: li鏍囩瑙f瀽鐨勫搴攋son瀵硅薄
+         */
+        ,render:function(ele, item){
+        }
+    };
+    /***
+     * 鍒涘缓涓�涓紪杈戝櫒銆�
+     * editorName 缂栬緫鍣ㄥ悕绉�
+     */
+    dynamicCondition.createEditor = function(editorName, defEditor){
+        defEditor = defEditor || {};
+        dynamicCondition.editor[editorName] = {};
+        $.extend( dynamicCondition.editor[editorName] , editor, defEditor);
+        return dynamicCondition.editor[editorName];
+    }
+    //瀹氫箟鏂囨湰缂栬緫鍣�
+    var editorText = dynamicCondition.createEditor("text");
+    $.extend( editorText ,{
+        createElement:function(item){
+            var inputJq = $('<input type="text" class="layui-input" placeholder="'+item.placeholder+'" />');
+            if(item.layVerify){
+                inputJq.attr("lay-verify", item.layVerify);
+            }
+            return inputJq;
+        }
+    });
+
+    //瀹氫箟涓嬫媺妗嗙紪杈戝櫒
+    var editorSelect = dynamicCondition.createEditor("select");
+    $.extend( editorSelect ,{
+        createElement:function(item){
+            var selectHtml;
+            if($(item.templet).is("select")){
+                selectHtml = $(item.templet).prop("outerHTML");
+            }else{
+                selectHtml = $(item.templet).html();
+            }
+            var  selJq = $(selectHtml);
+            selJq.removeAttr("id");
+            return selJq;
+        }
+        ,getRequestText:function(ele){
+            return  ele.find("option:selected").text();
+        }
+    });
+    //瀹氫箟鏃ユ湡缂栬緫鍣�
+    var editorDate = dynamicCondition.createEditor("date");
+    $.extend( editorDate ,{
+        createElement:function(item){
+            var dateType = item.dateType || "date";
+            var dateJq = $('<input type="text" class="layui-input" placeholder="'+item.placeholder+'" />');
+            dateJq.attr("date-type",dateType);
+            if(item.layVerify){
+                dateJq.attr("lay-verify",item.layVerify);
+            }
+            laydate.render({
+                elem: dateJq[0]
+                ,type: dateType
+            });
+            return dateJq;
+        }
+    });
+    /***
+     * selDom涓嬫媺閫夐」鐨勫�间笉鍦╲alList鍒楄〃涓紝鍒欑Щ闄�
+     */
+    function removeOption(selDom,valList){
+        valList = ","+valList + ",";
+        var opJqs = $(selDom).find("option").each(function() {
+            if(valList.indexOf(","+ $(this).val() + ",") == -1){
+                $(this).remove();
+            }
+        });
+    }
+    /**
+     * 鏍规嵁浼犲弬鏋勯�燾acheCondition
+     */
+    function parseToCacheCondition(conditionArr, type){
+        type = type || defaultValueConfig.type;
+        //缂撳瓨鏌ヨ鏉′欢
+        var cacheCondition = [];
+        for(var i=0;i<conditionArr.length;i++){
+            var curCondition = conditionArr[i];
+            var conditionObj = {};
+            conditionObj.conditionFieldVal = curCondition[0];
+            if(!curCondition[1]  || type =="simple"){
+                curCondition[1] = "equal";
+            }
+            conditionObj.conditionOptionVal = curCondition[1];
+
+            curCondition[2] = curCondition[2] || "";
+            curCondition[3] = curCondition[3] || "";
+            conditionObj.conditionValueVal = tempVal
+            conditionObj.conditionValueLeftVal = tempVal
+            conditionObj.conditionValueRightVal = tempVal
+            //濡傛灉绗笁涓弬鏁癱urCondition[2]鏄璞★紝璇存槑鍏跺�兼槸{value:"",text:""}鏍煎紡锛屼笉鏄璞″垯锛岀粺涓�杞崲涓鸿鏍煎紡
+            var valTemp2 = curCondition[2];
+            if(typeof curCondition[2] != "object"){
+                valTemp2 = {value:curCondition[2],text:curCondition[2]};
+            }
+            if(curCondition[1] == "between"){
+                conditionObj.conditionValueLeftVal = valTemp2;
+                if(typeof curCondition[3] == "object"){//between閫夐」鎵嶈�冭檻绗�4涓弬鏁帮紝鍚﹀垯蹇界暐浠�
+                    conditionObj.conditionValueRightVal = curCondition[3];
+                }else{
+                    conditionObj.conditionValueRightVal = {value:curCondition[3],text:curCondition[3]};
+                }
+            }else{
+                conditionObj.conditionValueVal = valTemp2;
+            }
+            cacheCondition.push(conditionObj);
+        }
+        return cacheCondition;
+    }
+
+    /***
+     * 鏍规嵁浼犲弬鏋勯�犲搴旂殑璇锋眰鍙傛暟.
+     * cacheCondition 鏌ヨ鏉′欢
+     * type  绠�鍗曟ā寮� simple 鍜屽鏉傛ā寮�, 榛樿
+     * requestDataType 璇锋眰鏁版嵁鏍煎紡'array'/'json'锛� 榛樿涓篴rray
+     */
+    function parseToRequest(cacheCondition, type, requestDataType){
+        type = type || defaultValueConfig.type;
+        requestDataType = requestDataType || defaultValueConfig.requestDataType;
+        var requestData = {};
+        var rowLength = cacheCondition.length;
+        //绠�鍗曟ā寮�
+        if(type == "simple"){
+            for(var i=0;i<rowLength;i++){
+                var conditionObj = cacheCondition[i];
+                requestData[conditionObj.conditionFieldVal] = conditionObj.conditionValueVal.value;
+            }
+            return requestData;
+        }
+        //澶嶆潅妯″紡
+        if(requestDataType == "json"){//缁撴灉涓簀son瀛楃涓叉ā寮�
+            return {jsonStr: JSON.stringify(cacheCondition)};
+        }
+        requestData.rowLength = rowLength;
+        for(var i=0;i<rowLength;i++){
+            var conditionObj = cacheCondition[i];
+            requestData["QueryCondition["+i+"].conditionField"] = conditionObj.conditionFieldVal;
+            requestData["QueryCondition["+i+"].conditionOption"] = conditionObj.conditionOptionVal;
+            requestData["QueryCondition["+i+"].conditionValue"] = conditionObj.conditionValueVal.value;
+            requestData["QueryCondition["+i+"].conditionValueLeft"] = conditionObj.conditionValueLeftVal.value;
+            requestData["QueryCondition["+i+"].conditionValueRight"] = conditionObj.conditionValueRightVal.value;
+        }
+        return requestData;
+    }
+    if(dcConfig.extendDC){
+        //鎻掍欢鎵╁睍
+        dcConfig.extendDC(dynamicCondition);
+    }
+
+    exports(MOD_NAME, dynamicCondition);
+})
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebCheckSession.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebCheckSession.js
new file mode 100644
index 0000000..4dd24ff
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebCheckSession.js
@@ -0,0 +1,164 @@
+/**
+ * 妫�鏌ュ鎴风浼氳瘽鏄惁瓒呮椂
+ */
+layui.define(['layer','util'],function(exports){
+    var CheckSession = function(){
+        this.moduleKey='vciWebCheckSession';
+        this.basePath=path;
+        this.url={
+            checkSwitch:'/webSessionController/getClientSessionInterval',
+            checkIdleTime:'/webSessionController/checkIdleTime',
+            clearSessionRemind:'/webSessionController/clearSessionRemind',
+            clearFinishDownloadUUID:'/webSessionController/clearFinishDownloadUUID'
+        };
+        this.getContent = function(){
+            return "";
+        };
+        this.init = function(){//鎵ц鎵弿
+            var that = this;
+            $(document).mousemove(function(e){
+                if( !window.clearRemindTime) {
+                    that.clearSessionRemind();
+                }
+            });
+            $(document).keydown(function (e) {
+                if(!window.clearRemindTime){
+                    that.clearSessionRemind();
+                }
+            });
+            $webUtil.copyConfig(that,that.moduleKey);
+           that.initCheckTimeout();
+        };
+        this.initCheckTimeout = function(){
+            var that = this;
+            $webUtil.post(that.url.checkSwitch,{},function(result){
+                if(result.success ){
+                    //璇存槑瑕佹娴�
+                    if(result.obj && result.obj*1>=10) {
+                        window.checkIdleTimeUrl = that.url.checkIdleTime;
+                        if(window.checkIntervalId ){
+                            window.clearInterval( window.checkIntervalId);
+                        }
+                        window.checkIntervalId = window.setInterval(that.checkIdleInterval, result.obj * 1 * 1000);
+                    }
+                }else{
+                    if(result.noLogin){
+                        layui.vciWebCheckSession.showTimeOutMsg(result.msg);
+                    }else{
+                        if($webUtil.isNotNull(result.msg)){
+                            $webUtil.showErrorMsg("璁块棶绯荤粺鍑虹幇浜嗗紓甯革紝鍥犱负锛�" + result.msg + ";鎮ㄥ彲浠ュ埛鏂伴〉闈㈠啀璇�");
+                        }
+                    }
+                }
+            },{},that.basePath,false,true,true);
+        };
+        this.checkIdleInterval = function () {//寮�濮嬫壂鎻�
+            var that = this;
+            window.remindTime = 0;
+            $webUtil.postForCheckId(that.checkIdleTimeUrl,{},function(result){
+                if(!result.success){
+                    //璇存槑宸茬粡鍑洪棶棰樹簡
+                    if(result.noLogin){
+                        //璇存槑宸茬粡鏂紑杩炴帴浜�
+                        layui.vciWebCheckSession.showTimeOutMsg(result.msg);
+                    }else{
+                        $webUtil.showErrorMsg("璁块棶绯荤粺鍑虹幇浜嗗紓甯革紝鍥犱负锛�" + result.msg + ";鎮ㄥ彲浠ュ埛鏂伴〉闈㈠啀璇�");
+                    }
+                }else {
+                    if(result.code =="finishDownloadFile" && $webUtil.isNotNull(result.msg)){
+                        //璇存槑鏈夋枃浠朵笅杞藉畬鎴愪簡
+                        var finishUUIDS = result.msg.split(",");
+                        var removeUUIDs= [];
+                        for(var i = 0 ; i < finishUUIDS.length ;i ++){
+                            var finishUUID = finishUUIDS[i];
+                            if($webUtil.isNotNull(finishUUID) && $("#" +finishUUID )){
+                                $("#" +finishUUID ).remove();
+                                removeUUIDs.push(finishUUID);
+                            }
+                        }
+                        if(removeUUIDs.length>0){
+                            $webUtil.postForCheckId(layui.vciWebCheckSession.url.clearFinishDownloadUUID,{removeUUID:removeUUIDs.join(",")},function(){},function () {
+
+                            },that.basePath);
+                        }
+                    }
+                    if(result.obj*1>0){
+                        window.clearRemindTime = false;
+                        window.clearInterval( window.checkIntervalId);
+                        layui.vciWebCheckSession.showRemindSession(result.obj*1);
+                    }
+                }
+            },function(result){
+
+            },layui.vciWebCheckSession.backPath);
+        };
+        this.showTimeOutMsg = function(msg){//鏄剧ず瓒呮椂
+            window.clearInterval( window.checkIntervalId);
+            if($webUtil.isSso()){
+                $webUtil.showErrorMsg("鎮ㄩ渶瑕侀噸鏂板埌" + $webUtil.getSsoinfo() + "鐧诲綍绯荤粺锛屽洜涓�:" + msg);
+            }else{
+                $webUtil.showConfirmMsg("鎮ㄩ渶瑕侀噸鏂扮櫥褰曠郴缁燂紝鍥犱负锛�" + msg + ";鐐瑰嚮纭畾鍚庡彲浠ヨ緭鍏ュ瘑鐮佺珛鍗抽噸鏂扮櫥褰�",function(){
+                    portal.relogin(function () {
+                        layui.vciWebCheckSession.init();
+                    });
+                },function(){
+                    window.location.href="index.html";
+                });
+            }
+        };
+        this.showRemindSession=function(remindTime){
+            var that = this;
+            var alertHtmlId = $("#clientSessionRemind_tips");
+            if( window.clearRemindTime ){
+                return false;
+            }
+            remindTime = parseInt(remindTime);
+            if(remindTime < 1000){
+                window.clearRemindTime = true;
+                window.clearInterval( window.checkIntervalId);
+                var alertHtmlId = $("#clientSessionRemind_tips");
+                alertHtmlId.hide();
+                that.showTimeOutMsg("浼氳瘽宸茬粡瓒呮椂");
+            }else{
+                var remindTimeStr = "";
+                //閮芥寜鐓у垎閽熻绠�
+                var min = remindTime/60/1000;
+                if(min < 1){
+                    //璇存槑鍙湁绉掍簡
+                    remindTimeStr = parseInt(remindTime/1000) + '绉�';
+                }else{
+                    min =  parseInt(min);
+                    var secend = (remindTime-60*1000*min)/1000;
+                    secend = parseInt(secend);
+                    remindTimeStr = min + "鍒嗛挓" + (secend>0?(secend + "绉�"):"");
+                }
+                alertHtmlId.find("label").html(remindTimeStr);
+                alertHtmlId.show();
+                window.remindTime = remindTime;
+                if( window.clearRemindTime ){
+                    return false;
+                }
+                window.setTimeout(that.showRemindSessionSecend,1000);
+            }
+        };
+        this.showRemindSessionSecend = function(){
+            layui.vciWebCheckSession.showRemindSession(window.remindTime -1000);
+        };
+        this.clearSessionRemind =function(){
+            var that = this;
+            window.clearRemindTime = true;
+            window.clearInterval( window.checkIntervalId);
+            $webUtil.post(that.url.clearSessionRemind,{},function (result) {
+                var alertHtmlId = $("#clientSessionRemind_tips");
+                alertHtmlId.hide();
+                that.init();
+            },function (result) {
+                var alertHtmlId = $("#clientSessionRemind_tips");
+                alertHtmlId.hide();
+                that.init();
+            });
+        };
+    };
+    var checkSession = new CheckSession();
+    exports("vciWebCheckSession",checkSession);
+});
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebComboxStore.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebComboxStore.js
new file mode 100644
index 0000000..3bbc1d4
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebComboxStore.js
@@ -0,0 +1,177 @@
+layui.define(['layer'],function(exports){
+	/**
+	 * 鏋氫妇鐨勭紦瀛樺拰鑷姩鑾峰彇
+	 * weidy@2018-03-06
+	 */
+
+	var Combox = function(){
+		this.comboxStore = {};
+		this.backPath = configData.compatibility?path:configData.objectServicePath;
+		this.defaultUrl = '/webEnumController/getEnum';
+		this.newEnumUrl = 'enumController/getEnum';
+		this.autoDestoryKey = {};
+		this.FORM_DISPLAY_DATA_SECRET = "myDataSecret";
+		//xxx:[{key:'yy',value:'xx'}]
+	};
+	Combox.prototype.init = function(){
+
+	};
+	//娣诲姞鏋氫妇瀵硅薄
+	Combox.prototype.newCombox=function(comboxKey,options,reload){
+		var that = this;
+		if(!(comboxKey in that.comboxStore) || reload){
+			//濡傛灉宸茬粡瀛樺湪鐨勬椂鍊欙紝灏变笉鍐嶆墽琛�
+			if(options&&$webUtil.isNotNull(options.url)){
+				that.loadByUrl(comboxKey,options);
+			}else{
+				if(options.data){
+					that.loadByData(comboxKey,options);
+				}else{
+					if(options.failCallback){
+						options.failCallback(comboxKey,'娌℃湁璁剧疆url鍙傛暟鎴栬�卍ata鍙傛暟');
+					}
+				}
+			}
+			if(options.autoDestory == true && !that.autoDestoryKey[comboxKey]){
+				that.autoDestoryKey[comboxKey] = options;
+			}
+		}else{
+			//璇存槑宸茬粡鏈変簡
+			if(options && options.callback){
+				options.callback(comboxKey,that.getComboxMap(comboxKey));
+			}
+		}
+	};
+	Combox.prototype.loadByUrl = function(comboxKey,options){
+		var that = this;
+		var isCustomUrl = false;
+		if($webUtil.isNull(options.url) || 'default' == options.url){
+			if(configData.compatibility) {
+				options.url = that.defaultUrl;
+			}else{
+				options.url = that.newEnumUrl;
+			}
+		}else{
+			isCustomUrl = true;
+		}
+		var requestData = {
+			comboxKey:comboxKey,
+			id:comboxKey
+		};
+		if(options.extraParams){
+			for(var key in options.extraParams){
+				requestData[key] = options.extraParams[key];
+			}
+		}
+		$webUtil.get(options.url,requestData,function(result){
+			if(result.success){
+				if(result.data && result.obj == null){
+					result.obj = result.data
+				}
+				if(!isCustomUrl) {
+					that.comboxStore[comboxKey] = result.obj;
+				}
+				if(options.callback){
+					var map = {};
+					layui.each(result.obj,function(_index,item){
+						map[item.key] = item.value;
+					});
+					options.callback(comboxKey,map,result.obj);
+				}
+			}else{
+				if(options.failCallback){
+					options.failCallback(comboxKey,result.msg);
+				}
+			}
+		},function(x,r){
+			$webUtil.showErrorMsg("鑾峰彇鏋氫妇鐨勫唴瀹瑰嚭閿欙紝鍙兘鏈嶅姟鍣ㄦ病鏈夊惎鍔�");
+		},(options.backPath?options.backPath:that.backPath),true,false);
+
+	};
+	Combox.prototype.loadByData = function(comboxKey,options){
+		var that = this;
+		that.comboxStore[comboxKey] = options.data;
+		if(options.callback){
+			options.callback(comboxKey,that.getComboxMap(comboxKey),options.data);
+		}
+	};
+	Combox.prototype.reload = function(comboxKey,options){
+		//閲嶆柊鍔犺浇
+		var that = this;
+		if(comboxKey && options && options.data){
+			that.loadByData(comboxKey,options);
+		}else if(comboxKey && options && options.url){
+			that.loadByUrl(comboxKey,options);
+		}
+	};
+	//鑾峰彇鏋氫妇鐨勬槧灏�
+	Combox.prototype.getComboxMap = function(comboxKey){
+		var that = this;
+		if(!comboxKey || $webUtil.isNull(comboxKey)){
+			return {};
+		}
+		if(comboxKey in that.comboxStore){
+			var array = that.comboxStore[comboxKey];
+			var map = {};
+			layui.each(array,function(_index,item){
+				map[item.key] = item.value;
+			});
+			return map;
+		}
+	};
+	//鑾峰彇鏋氫妇鐨則ext
+	Combox.prototype.getComboxText = function(comboxKey,comboxValue){
+		var that = this;
+		var map = that.getComboxMap(comboxKey);
+		if(map && comboxValue in map){
+			return map[comboxValue];
+		}
+		return "";
+	};
+	/**
+	 * 鑾峰彇涓嬫媺鑿滃崟閲岀殑鎵�鏈夊睘鎬э紝鍗宠幏鍙栧姞杞界殑鎵�鏈夊��
+	 * @param comboxKey
+	 * @returns {*}
+     */
+	Combox.prototype.getComboxAttrs = function(comboxKey){
+		var that = this;
+		if(that.comboxStore && that.comboxStore[comboxKey]){
+			return that.comboxStore[comboxKey];
+		}
+		return [];
+	};
+	/**
+	 * 閿�姣侊紝浼氳幏鍙栦箣鍓嶇殑閰嶇疆锛岄厤缃腑璁剧疆浜嗗彲浠ラ攢姣佹椂鎵嶈兘閿�姣�
+	 * @param comboxKey 鏋氫妇椤�
+     */
+	Combox.prototype.destory = function(comboxKey){
+		var that = this;
+		if(that.autoDestoryKey && $webUtil.isNotNull(that.autoDestoryKey[comboxKey])){
+			var options = that.autoDestoryKey[comboxKey];
+			if(options.destoryListeners){
+				options.destoryListeners();
+			}
+			delete that.autoDestoryKey[comboxKey];
+			delete that.comboxStore[comboxKey];
+		}
+	};
+	/**
+	 * 鑾峰彇瀵嗙骇鐨勫瓧娈�
+	 * @param controlSecret 鏄惁鎺у埗瀵嗙骇
+	 * @returns {{field: string, hidden: boolean, comboxKey: string, text: string, type: string, required: *}}
+	 */
+	Combox.prototype.getSecretObject = function (controlSecret,readOnly) {
+		var that = this;
+		return {
+			field:'secretGrade',
+				text:'瀵嗙骇',
+			type:'combox',
+			comboxKey:that.FORM_DISPLAY_DATA_SECRET,
+			readOnly:readOnly,
+			required:controlSecret,
+			hidden:!controlSecret
+		}
+	};
+	var combox = new Combox();
+	exports('vciWebComboxStore',combox);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebDataGrid.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebDataGrid.js
new file mode 100644
index 0000000..0da75b1
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebDataGrid.js
@@ -0,0 +1,212 @@
+layui.define(['layer','table','vciWebComboxStore'],function(exports){
+	/**
+	 * 鏁版嵁琛ㄦ牸--浣跨敤骞冲彴閲岀殑琛ㄥ崟瀹氫箟
+	 * weidy@2018-03-08
+	 */
+	var VciDataGrid = function(){
+			this.table = null;
+            this.tableDefinedUrl='webUIController/getTableDefine';//榛樿鐨勫湴鍧�
+		    this.elemTableMap = {};//table鍏冪礌缁戝畾鐨勮〃鏍间富閿�
+		    this.elemFilterMap = {};//鍏冪礌鍜宖ilter鏄犲皠
+		    this.tableConfigData = {};//浠庡悗鍙拌幏鍙栫殑鐨勮〃鏍奸厤缃唴瀹�
+			this.selectMode = null;
+	};
+	VciDataGrid.prototype.init = function(){
+		var that = this;
+		that.table = layui.table;
+		if(that.selectMode == null){
+			that.selectMode = that.table.selectMode.single;
+		}
+	};
+	VciDataGrid.prototype.showGridByUrl = function(filter){//浠庡悗鍙拌幏鍙栬〃鏍间俊鎭�
+        var that = this;
+		var config = that.getConfig(filter);
+		var tableConfigData;
+		var requestData = {};
+		if(!config.extraParams && config.where){
+			config.extraParams = config.where;
+		}
+		if(config.extraParams){
+			for(var key in config.extraParams){
+				requestData["conditionMap['" + key + "']"] = config.extraParams[key];
+			}
+		}
+		var copyParam = ['btmType','tableCode'];//btmtype锛岃〃鏍兼墍灞炵被鍒�-鍙互鏄笟鍔$被鍨嬶紝涔熷彲浠ラ摼鎺ョ被鍨嬶紝tableCode鏄〃鏍肩殑鑻辨枃鍚嶇О
+		for(var i= 0 ; i < copyParam.length ; i ++){
+			requestData[copyParam[i]] = config[copyParam[i]];
+		}
+		requestData['isMuti'] = $webUtil.getBoolean(config.isMuti);
+		if(config && config.isLoaded && config.tableId == that.elemTableMap[config.elemId]){
+			//璇存槑鍔犺浇杩囷紝鑰屼笖璇ュ唴瀹硅繕鍦ㄥ師澶�
+			that.table.reload(config.tableId,{});
+		}else{
+			if(config.tableId != that.elemTableMap[config.elemId]){
+				that.destroy(that.elemFilterMap[config.elemId]);//濡傛灉杩欎釜鍏冪礌琚叾浠栫殑琛ㄦ牸鍗犵敤锛屽垯灏嗗師琛ㄦ牸鍘绘帀
+			}
+			if($webUtil.isNotNull(config.tableCode) && $webUtil.isNotNull(config.btmType) && that.tableConfigData[config.tableCode + "_" + config.btmType]){
+				//璇存槑杩欎釜閰嶇疆淇℃伅宸茬粡浠庡悗鍙拌幏鍙栬繃
+				//鍙互瀹氫箟琛ㄦ牸浜�
+				var tableConfigData = that.tableConfigData[config.tableCode + "_" + config.btmType] ;
+				tableConfigData['filter'] = filter;
+				tableConfigData['elem'] = config.elemId;
+				tableConfigData['id'] = config.tableId;
+				tableConfigData['url'] = ((config.url.indexOf('http:') == -1)?path +config.url :  config.url);
+				tableConfigData['height'] =  config.height ? config.height : 475;
+				tableConfigData['where'] = requestData;
+				if($webUtil.getBoolean(config.isMuti) && "page" in tableConfigData){
+					delete tableConfigData.page;
+					// tableConfigData['page'] = {
+					// 	limit: -1,
+					// 	page: 1
+					// }
+				}
+				tableConfigData['done'] = function(res,cur,count){
+					if(config.done){
+						config.done(res,cur,count);
+					}
+				};
+                that.table.render(tableConfigData);
+				that.elemTableMap[config.elemId] = config.tableId;
+				that.elemFilterMap[config.elemId] = filter;
+				config.isLoaded = true;
+				that.setConfig(filter,config);
+			}else{
+
+				if($webUtil.isNotNull(config.tableCode) && $webUtil.isNotNull(config.btmType)) {
+					//璇存槑鏄娇鐢ㄥ钩鍙扮殑琛ㄦ牸
+					$webUtil.post($webUtil.isNotNull(config.tableDefinedUrl)?config.tableDefinedUrl:that.tableDefinedUrl, requestData, function (result) {
+						if (result.success) {
+							var queryScheme = result.querySchema;
+							if ($webUtil.isNotNull(queryScheme) && $webUtil.isNull(config.queryScheme)) {
+								config.queryScheme = queryScheme;
+							}
+							requestData['queryScheme'] = config.queryScheme;
+                            requestData['btmType'] = config.btmType;
+							var cols = [];
+							if (result.showIndex) {
+								cols.push({field: 'LAY_TABLE_INDEX', type: 'numbers', title: '搴忓彿'});
+							}
+							if (result.showCheckbox) {
+								cols.push({field: 'LAY_CHECKED', type: 'checkbox'});
+							}
+							var referColumn = "";
+							if (result.columns) {
+								layui.each(result.columns, function (_index, record) {
+									var col = record;
+									if (col.field.indexOf(".") > -1) {
+										referColumn += col.field + ",";
+                                        var tempField = col.field;
+                                        if(tempField.indexOf(".")>-1){
+                                            tempField = tempField.substring(tempField.indexOf(".") + 1);
+                                        }
+										col.field = col.field.replace(".", "_");
+                                        col.templet = function(d){
+                                            return d[tempField];
+                                        }
+									}
+									if ($webUtil.isNotNull(col.enumCode)) {
+										//鏄灇涓剧殑鍐呭
+										var vciWebComboxStore = layui.vciWebComboxStore;
+										vciWebComboxStore.newCombox(col.enumCode, {
+											data: col.enumMap
+										});
+										col.templet = function (d, thisItem) {
+											var vciWebComboxStore = layui.vciWebComboxStore;
+											return vciWebComboxStore.getComboxText(thisItem.enumCode, d[thisItem.field]);
+										};
+									}
+									cols.push(col);
+								});
+							}
+							requestData['referColumn'] = referColumn;
+							var pageObject = false;
+							if (result.limit > 0) {
+								pageObject = {
+									limit: result.limit,
+									page: 1
+								};
+							}
+							//鍙互瀹氫箟琛ㄦ牸浜�
+							 tableConfigData = {
+								filter: filter,
+								elem: config.elemId,
+								id: config.tableId,
+								oid: config.old,//涓婚敭鐨勫瓧娈碉紝榛樿涓簅id
+								url: config.url,
+								page: pageObject,
+								selectMode:that.selectMode,
+								where: requestData,
+								done: function (res, cur, count) {
+									if (config.done) {
+										config.done(res, cur, count);
+									}
+								},
+								cols: [cols]
+							};
+							if(config.height){
+								tableConfigData.height = config.height;
+							}
+                            that.table.render(tableConfigData);
+							that.tableConfigData[config.tableCode + "_" + config.btmType] = tableConfigData;
+							that.elemTableMap[config.elemId] = config.tableId;
+							that.elemFilterMap[config.elemId] = filter;
+							config.isLoaded = true;
+							that.setConfig(filter, config);
+						} else {
+							$webUtil.showErrorMsg(result.msg);
+						}
+					});
+				}
+			}
+		}
+	};
+	VciDataGrid.prototype.setConfig=function(filter,options){
+		var that = this;
+		if(!that.vciGridConfig){
+			that.vciGridConfig = {};
+		}
+		that.vciGridConfig[filter] = options;
+	};
+	VciDataGrid.prototype.getConfig=function(filter){
+		var that = this;
+		if(!that.vciGridConfig){
+			that.vciGridConfig = {};
+		}
+		if((filter) in that.vciGridConfig){
+			return that.vciGridConfig[filter];
+		}
+	};
+
+	VciDataGrid.prototype.doResize = function(filter){
+		
+	};
+
+	VciDataGrid.prototype.destroy = function(filter){
+		//閿�姣�
+		var that = this;
+		var config = that.getConfig(filter);
+		if(!config){
+			return;
+		}
+		if(config && $(config.elemId)){
+			$(config.elemId).remove();
+		}
+		if(!that.vciGridConfig){
+			that.vciGridConfig = {};
+		}
+		if(that.elemFilterMap[config.elemId]){
+			delete that.elemFilterMap[config.elemId];
+		}
+		if(that.elemTableMap[config.elemId]){
+			delete that.elemTableMap[config.elemId];
+		}
+		if(that.tableConfigData[config.tableCode + "_" + config.btmType]){
+			delete that.tableConfigData[config.tableCode + "_" + config.btmType];
+		}
+		if((filter) in that.vciGridConfig){
+			delete that.vciGridConfig[filter];
+		}
+	};
+	var dg = new VciDataGrid();
+	exports('vciWebDataGrid',dg);
+});
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebDataRightCheck.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebDataRightCheck.js
new file mode 100644
index 0000000..545159a
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebDataRightCheck.js
@@ -0,0 +1,164 @@
+/**
+ * 鏍¢獙鏁版嵁鏉冮檺
+ * @author weidy
+ */
+layui.define(['layer','util','table'],function(exports){
+    var DataRightCheck = function(){
+        this.moduleKey='vciWebDataRightCheck';
+        this.basePath=path;
+        this.url={
+            checkSwitch:'/webDataRightController/getDataRightSwitch',
+            checkBoDataRight:'/webDataRightController/checkDataRightForBO',
+            checkLoDataRight:'/webDataRightController/checkDataRightForLO'
+        };
+        this.checkType = {
+            BO:'checkBoDataRight',
+            LO:'checkLoDataRight'
+        };
+        this.checkLOType = {
+            TOBO:'TB' ,
+            FROMBO:'FB',
+            BOTH:'both'
+        };
+        this.getContent = function(){
+            return "";
+        };
+        this.init = function(){
+            var that = this;//鍒濆鍖�
+            $webUtil.copyConfig(that,that.moduleKey);
+        };
+    };
+    /**
+     * 浣跨敤琛ㄦ牸鐨勪富閿潵杩涜鏍¢獙鏁版嵁鏉冮檺
+     * @param sourceData 鏉ユ簮鏁版嵁
+     * @param tableId 琛ㄦ牸涓婚敭
+     * @param methodKey 鎸夐挳鐨勫敮涓�鏍囪瘑
+     * @param  鏍¢獙閫氳繃
+     * @param failCallback 鏍¢獙澶辫触
+     * @param checkLoType 鏍¢獙閾炬帴绫诲瀷鐨勬柟寮忥紝鍙湁鏁版嵁鏄湪閾炬帴绫诲瀷鐨勬椂鍊欑敓鏁堬紝鍙兘鏄疶B,FB,both杩欎笁涓��
+     * @returns {boolean}
+     */
+    DataRightCheck.prototype.checkDataRightForTable = function(sourceData,tableId,methodKey,callback,failCallback,checkLoType){
+        var that = this;
+        var table= layui.table;
+        var selectData = null;
+        if(typeof tableId == 'string'){
+            selectData = table.checkStatus(tableId);
+        }else{
+            selectData = {
+                data:[tableId]
+            };
+        }
+        var functionId = '';
+        if(sourceData == null || !'functionId' in sourceData ){
+            if(failCallback){
+                failCallback("娌℃湁鑾峰彇鑿滃崟缂栧彿");
+            }
+            return false;
+        }
+        functionId = sourceData['functionId'];
+        if(!selectData && selectData.data && selectData.data.length == 0){
+            if(failCallback){
+                failCallback("娌℃湁閫夋嫨鏁版嵁锛屾棤娉曞垽鏂暟鎹潈闄�");
+            }
+            return false;
+        }
+        if($webUtil.isNull(methodKey)){
+            if(failCallback){
+                failCallback("娌℃湁鎸夐挳鐨勬爣璇嗙");
+            }
+            return false;
+        }
+        var dataType =that.checkType.BO;//鐪嬫槸涓氬姟鏁版嵁锛岃繕鏄摼鎺ユ暟鎹�
+        var checkDatas = {};
+        var boDataAttr = ['oid','btmname','nameoid','revisionoid'];
+        var loDataAttr = ['t_oid','t_nameoid','t_revisionoid','t_btwname','f_oid','f_nameoid','f_revisionoid','f_btwname','oid'];
+        for(var i = 0 ; i < selectData.data.length; i ++){
+            var data = selectData.data[i];
+            for( var key in data){
+                data[key.toLowerCase()] = data[key];
+            }
+            if(i == 0) {
+                if (('t_oid' in data && 't_nameoid' in data && 't_revisionoid' in data && 't_btwname' in data)
+                    || ('f_oid' in data && 'f_nameoid' in data && 'f_revisionoid' in data && 'f_btwname' in data)) {
+                    dataType = that.checkType.LO;
+                }
+            }
+            if(dataType == that.checkType.BO){
+                for(var j =0; j < boDataAttr.length;j ++){
+                    var attr = 'sourceData[' + i + '].' + boDataAttr[j];
+                    checkDatas[attr ] = data[boDataAttr[j]];
+                }
+                var attr = 'sourceData[' + i + '].secretgrade';
+                if('secretgrade' in data || 'secretGrade' in data){
+                    //璇存槑鏈夊瘑绾�
+                    checkDatas[attr ] = data['secretgrade']*1 || data['secretGrade']*1 ;
+                }else{
+                    checkDatas[attr ] = -1 ;
+                }
+            }else{
+                for(var j =0; j < loDataAttr.length;j ++){
+                    var attr = 'sourceData[' + i + '].' + loDataAttr[j];
+                    checkDatas[attr ] = data[loDataAttr[j]];
+                }
+                if('f_oid.secretgrade' in data || 'f_oid.secretGrade' in data){
+                    //璇存槑鏈夊瘑绾�
+                    var attr = 'sourceData[' + i + '].fromsecret';
+                    checkDatas[attr ] = data['f_oid.secretgrade']*1 ;
+                }else{
+                    var attr = 'sourceData[' + i + '].fromsecret';
+                    checkDatas[attr ] = -1 ;
+                }
+                if('t_oid.secretgrade' in data || 't_oid.secretGrade' in data){
+                    //璇存槑鏈夊瘑绾�
+                    var attr = 'sourceData[' + i + '].tosecret';
+                    checkDatas[attr ] = data['t_oid.secretgrade']*1 ;
+                }else{
+                    var attr = 'sourceData[' + i + '].tosecret';
+                    checkDatas[attr ] = -1 ;
+                }
+            }
+        }
+        that.checkDataRight(checkDatas,functionId,methodKey,dataType,callback,failCallback,checkLoType);
+    };
+    DataRightCheck.prototype.checkDataRight = function(checkDatas,modelKey,methodKey,dataType,callback,failCallback,checkLoType){
+        var that = this;
+        checkDatas['methodKey'] = modelKey.toLowerCase()  + methodKey.toLowerCase();
+        if(dataType == that.checkType.BO){
+            $webUtil.post(that.url.checkBoDataRight,checkDatas,function(result){
+                if(result.success){
+                    if(callback){
+                        callback();
+                    }
+                }else{
+                    if(failCallback){
+                        failCallback(result.msg);
+                    }
+                }
+            },function(xhr,err){
+                if(failCallback){
+                    failCallback(err);
+                }
+            },that.basePath);
+        }else{
+            checkDatas['checkType'] = checkLoType;
+            $webUtil.post(that.url.checkLoDataRight,checkDatas,function(result){
+                if(result.success){
+                    if(callback){
+                        callback();
+                    }
+                }else{
+                    if(failCallback){
+                        failCallback(result.msg);
+                    }
+                }
+            },function(xhr,err){
+                if(failCallback){
+                    failCallback(err);
+                }
+            },that.basePath);
+        }
+    };
+    var dataRightCheck = new DataRightCheck();
+    exports("vciWebDataRightCheck",dataRightCheck);
+});
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebFileManager.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebFileManager.js
new file mode 100644
index 0000000..a3236ae
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebFileManager.js
@@ -0,0 +1,613 @@
+/**
+ * 闄勪欢绠$悊
+ * 鍖呮嫭锛�
+ *     鏂囦欢鏌ョ湅
+ *     鏂囦欢涓婁紶
+ *     鏂囦欢棰勮
+ *     鏂囦欢鍒嗕韩
+ * weidy閲嶆柊璋冩暣涓�涓�
+ *     鎵�鏈夌殑閰嶇疆椤归渶闇�瑕佸厛浼犲叆涓婚敭锛屾墍鏈夌殑鎿嶄綔閮介渶瑕佸厛浼犲叆涓婚敭
+ *     浠ュ墠鐨勫瓨鍦ㄤ笉鍚岀殑椤甸潰閮戒娇鐢ㄨ繖涓粍浠舵椂锛岄厤缃俊鎭細琚鐩栫殑鎯呭喌
+ */
+layui.define(['layer','util','table','form','upload','code','FilePreviewBase'],function(exports){
+    var fileManager = function(){
+        this.moduleKey='vciWebFileManager';
+        this.backPath = configData.compatibility?path:configData.fileServicePath;
+        this.processPath = configData.compatibility?path:configData.processServicePath;
+        this.url={
+    		process:{//娴佺▼鐩稿叧鐨剈rl
+    			dataGrid:'/webProcessDefineController/dataGridFileInProcess',
+    			previewUrlByFileOid:'/webFileController/previewFile',//鍦ㄦ祦绋嬩腑鐨勫崟涓枃浠剁殑棰勮
+                previewUrlByDataOid:'/webProcessDefineController/getPreviewUrlByDataOid'//鏍规嵁涓氬姟鏁版嵁鏉ヨ幏鍙栨枃浠堕瑙堢殑璺緞
+    		},
+            bus:{//鏅�氫笟鍔$浉鍏崇殑url
+                controller:'vciFileQueryController/',
+    			dataGrid:'gridFiles',
+    			previewUrlByFileOid:'previewFile'//鍦ㄦ祦绋嬩腑鐨勫崟涓枃浠剁殑棰勮
+    		},
+    		downloadByFileOid:'vciFileDownloadController/downloadByFileOid',//涓嬭浇鏂囦欢
+    		reviseByFileOid:'vciFileUploadController/uploadFile'//淇敼鏂囦欢
+        	//杩欎釜缁勪欢鍙兘鎻愪緵鍏叡鐨勮矾寰勶紝鐗规畩涓氬姟鐨勬寜閽渶瑕佽嚜琛屾敞鍐�
+        };
+        this.id="vciWebFileManager";
+        this.sourceData = {};
+        this.columns = [];
+
+        this.config = {};
+        this.defaultConfig = {
+            inProcess:false,//鏄惁鏄祦绋嬩腑鐨勫��
+            showInDialog : false,//鏄剧ず鍒扮獥鍙d腑
+            dataIsProcessInstance : false,//鏄惁涓烘祦绋嬪疄渚�
+            reviseButton : false
+        };
+        this.defaultButtonInfos = [{
+        	uniqueFlag: "DOWNLOADFILE",
+            alias: '涓嬭浇鏂囦欢'
+        },{
+        	uniqueFlag:'PREVIEW',
+            alias:'棰勮'
+        }];
+        this.defaultReviseButtonInfo = {
+    		uniqueFlag: 'revisefile',
+            alias: '淇敼'
+        };
+        this.buttonIconMap = {
+    		DOWNLOADFILE:"layui-icon-download-circle",
+    		PREVIEW:"layui-icon-carousel",
+    		revisefile:"layui-icon-upload"
+        };
+        this.getContent = function(){//涓嶈皟鐢�
+            return "";
+        };
+        this.getButtonHtml = function(id){
+        	//鎸夐挳鐨刪tml
+            var that = this;
+            var options = that.getConfig(id);
+            if(options && $webUtil.isNull(options['toolbarId'])){
+            	that.updateConfig(id,"toolbarId",'#toolbar_' + id);
+				that.updateConfig(id,'destoryToolbar',true);
+            	return '<div id="toolbar_' + id +'" layui-filter="toolbar_' + id + '" class="layui-btn-container"></div>';
+            }else{
+            	return '';
+            }
+        };
+        this.getTableHtml = function(id){
+            var that = this;
+            //琛ㄦ牸鐨刪tml
+            var options = that.getConfig(id);
+            if(options && $webUtil.isNull(options['tableId'])){
+            	that.updateConfig(id,'tableId','#table_' + id);
+            	that.updateConfig(id,'destoryTable',true);
+                return '<table id="table_' +id+ '" lay-filter="' + id +'"></table>';
+            }else{
+            	return '';
+            }
+        };
+        this.init = function(){//涓嶈皟鐢�
+            var that = this;
+            $webUtil.copyConfig(that,that.moduleKey);
+        };
+        this.setConfig = function(id,options){
+        	var that = this;
+        	//璁剧疆閰嶇疆椤癸紝鑷姩缁ф壙榛樿鐨勯厤缃�
+        	var ops = {};
+        	$.extend(ops,that.defaultConfig,options);
+        	/**
+        	 * 閰嶇疆鐩稿叧鐨勫唴瀹�
+        	 *
+        	 */
+        	that.config[id] = ops;
+        };
+        this.updateConfig = function(id,key,value){
+        	//鏇存柊閰嶇疆
+        	var that = this;
+        	var options = that.getConfig(id);
+        	options[key] = value;
+        	that.config[id]=options;
+        };
+        this.getConfig = function(id){
+        	//鑾峰彇閰嶇疆椤�
+        	var that = this;
+        	if(id in that.config){
+        		return that.config[id];
+        	}
+        	return {};
+        };
+        this.destoryFileManage = function(id){
+        	//閿�姣�
+        	var that = this;
+        	var options = that.getConfig(id);
+        	if(options.destoryToolbar){
+        		//鏄繖涓粍浠堕噷鑷繁鍔犵殑
+        		$(options.toolbarId).remove();
+        	}else{
+        		//鍒犻櫎宸茬粡瀛樺湪鐨勬寜閽�
+        		$(options.toolbarId).find('button').remove();
+        		var searchInput = $(options.toolbarId).find('[name="fast_search_select_value"]');
+        		searchInput.prev().remove();
+        		searchInput.remove();
+        	}
+        	if(options.destoryTable){
+        		$(options.tableId).remove();
+        	}else{
+        		//鎶婁互鍓嶇殑琛ㄦ牸绉婚櫎
+        		var tableContent = $(options.tableId).children();
+        		if(tableContent){
+        			tableContent.remove();
+        		}
+        	}
+        	delete that.config[id];
+        };
+        this.render = function(id,options){
+        	var that = this;
+        	if($webUtil.isNull(id)){
+        		$webUtil.showErrorMsg("鏂囦欢绠$悊椤甸潰閿欒锛屽湪璋冪敤render鏂规硶鏃讹紝娌℃湁璁剧疆涓婚敭");
+        		return false;
+        	}
+        	if(id in that.config){
+        		//濡傛灉宸茬粡瀛樺湪鏌愪釜椤甸潰锛屽垯鍏堥攢姣�
+        		that.destoryFileManage(id);
+        	}
+        	that.setConfig(id,options);
+        	options = that.getConfig(id);
+        	//鏈�鍏堝鐞咹tml
+        	that.renderHtml(id,options);
+        	//澶勭悊button
+        	that.renderButton(id,options);
+        	//澶勭悊琛ㄦ牸
+        	that.renderTable(id,options);
+        };
+        this.renderHtml = function(id,options){
+        	//澶勭悊html锛屽鏋滄病鏈変紶閫抙tml鐨刬d瀵硅薄
+        	var that = this;
+        	if($webUtil.isNull(options.elem)){
+        		$webUtil.showErrorMsg("娌℃湁elem灞炴��");
+        		return false;
+        	}
+        	$(options.elem).prepend(that.getButtonHtml(id) + that.getTableHtml(id));
+        };
+        this.renderButton = function(id,options){
+        	//澶勭悊鎸夐挳
+        	var that = this;
+        	var buttonHtml = [];
+        	var buttonIdPrefix = options.buttonIdPrefix;
+        	if(!buttonIdPrefix){
+        		buttonIdPrefix = id;
+        	}
+        	var buttonIconMap = options.buttonIconMap;
+        	if(!buttonIconMap){
+        		buttonIconMap = that.buttonIconMap;
+        	}
+    		//鏄湪娴佺▼涓紝閭e氨瑕佸叏閮ㄦ坊鍔�
+    		var buttonInfoMap = options.buttonInfoMap;
+    		if(!buttonInfoMap && ( options.inProcess || options.buttonSameProcess)){
+    			//娴佺▼鐨勬墠娣诲姞鎸夐挳
+    			buttonInfoMap = $.extend(true, [], that.defaultButtonInfos);
+    			if(options.reviseButton){
+    				buttonInfoMap.push( $.extend(true,{},that.defaultReviseButtonInfo));
+    			}
+    		}
+    		if(!buttonInfoMap){
+    			//杩欎釜鏄鏄庝笉瀛樺湪锛屼粠鍚庡彴鍘昏幏鍙栨寜閽�
+    			var sourceData = $.extend(true,{},options.sourceData);
+    			$webUtil.createButtonHtmlEx(sourceData, buttonIconMap, $(options.toolbarId), buttonIdPrefix, [{uniqueFlag: 'refresh',alias: '鍒锋柊'}], [], function (buttons, hasViewRight, hasQueryRight) {
+                    $webUtil.bindDefultButtonLisenter(that, buttonIdPrefix);
+                    if(hasQueryRight){
+                    	$webUtil.createSearchHtml({
+                            name: '鏂囦欢鍚嶇О'
+                        }, $(options.toolbarId), buttonIdPrefix);
+                    }
+                    $(options.toolbarId).append('<input type="hidden" name="filecomponentid" value="' + id + '"/>');
+                });
+    		}else{
+    			//璇存槑宸茬粡鏈夋寜閽簡
+        		buttonInfoMap.push({
+        			uniqueFlag: 'refresh',
+        			alias: '鍒锋柊'
+        		});//鍒锋柊鏄兘鏈夌殑
+    			if(buttonInfoMap && buttonInfoMap.length > 0){
+        			layui.each(buttonInfoMap,function(_index,_item){
+        				if(_item.uniqueFlag != 'DOWNLOADFILE' || options.inProcess || options.hasDownloadRight ){
+        					//涓嬭浇锛岄渶瑕佽幏鍙栨潈闄�
+        					buttonHtml.push($webUtil.getButtonHtmlFromBtnObject(_item, buttonIdPrefix, buttonIconMap));
+        				}
+        			});
+        		}
+           		$(options.toolbarId).prepend(buttonHtml.join(''));
+           		$(options.toolbarId).append('<input type="hidden" name="filecomponentid" value="' + id + '"/>');
+        		$webUtil.bindDefultButtonLisenter(that,buttonIdPrefix);
+        		$webUtil.createSearchHtml({
+                    name: '鏂囦欢鍚嶇О'
+                }, $(options.toolbarId), id);
+    		}
+        };
+        this.renderTable = function(id,options){
+        	//澶勭悊琛ㄦ牸
+        	var that = this;
+        	var fileTableColumns = options.fileTableColumns;
+        	if(!fileTableColumns){
+        		fileTableColumns = that.getFileTableColumns(id,((options.inProcess || options.hasDownloadRight) == true));
+        	}
+        	if($webUtil.isNull(options.dataOid)){
+        		$webUtil.showErrorMsg("娌℃湁涓氬姟鏁版嵁鐨勪富閿俊鎭�,鍓嶇璋冪敤鏈夐棶棰�");
+        		return false;
+        	}
+        	if(!options.inProcess && $webUtil.isNull(options.dataBtmType)){
+        		$webUtil.showErrorMsg("娌℃湁涓氬姟绫诲瀷鐨勪富閿俊鎭�,鍓嶇璋冪敤鏈夐棶棰�");
+        		return false;
+        	}
+        	var queryMap = {
+                currentButtonKey:'VIEW',
+                ownbizOid:options.ownbizOid,
+                ownbizBtm:options.ownbizBtm
+            };
+            if(options.dataIsProcessInstance){
+            	//鏄祦绋嬪疄渚�
+                queryMap['executionid'] = options.dataOid;
+                queryMap['dataOid'] = "";
+                delete queryMap['dataOid'];
+            }
+            if(options.inProcess){
+            	//鍦ㄦ祦绋嬩腑闇�瑕佺粫杩囨潈闄愶紝浼犺緭涓嬮潰杩欎笁涓弬鏁�
+             	queryMap['viewProcessLinkBusinessDataToken']=options.sourceData['viewProcessLinkBusinessToken'];
+             	queryMap['executionidOnlyNumber']=options.sourceData['executionidNoInProcess'];
+             	queryMap['businessOids']=options.sourceData['businessOidsInProcess'];
+            }
+            if(options.where){
+                $.extend(queryMap,options.where);
+            }
+            var table=layui.table;
+            if(!options.pageObject){
+            	options.pageObject = {
+                    limit:25,
+                    page:1
+                };
+            }
+            if(options.inProcess){
+            	options.pageObject = false;
+            }
+            var url = options.url;
+            if($webUtil.isNull(url)){
+            	url = options.inProcess?that.url.process.dataGrid:(that.url.bus.controller + that.url.bus.dataGrid);
+            }
+            var tableOption = {
+                elem :  options.tableId,
+                url : url,
+                backPath:that.backPath,
+                where : queryMap,
+                selectMode : table.selectMode.muti,
+                id : id,
+                page : options.pageObject,
+                cols : [fileTableColumns],
+                height:(options.tableHeight?options.tableHeight:''),
+                done:function(res,cur,total){
+                    table.on('tool(' + id + ')',function(obj){
+                        var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                        var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                        if(layEvent == 'PREVIEW'){
+                            //that.doPreview(data.oid,id,data.id?data.id:data.name);
+                            //鏂囦欢棰勮
+                            layui.use('BaseFileDownloadAction', function () {
+                                var vciWebFilePreview = layui['BaseFileDownloadAction'];
+                                vciWebFilePreview.PREVIEW(data.oid,{fileOid:data.oid},function (){
+                                    $webUtil.showErrorMsg("鏂囦欢棰勮澶辫触锛岃鑱旂郴绠$悊鍛�")
+                                })
+                            })
+                        }
+                    });
+                }
+            };
+            table.render(tableOption);
+        }
+        this.reloadByWhere = function(id,dataOid,dataBtmType,where){
+        	//鍒╃敤鏁版嵁閲嶆柊鍔犺浇鍒楄〃
+            var that = this;
+            var queryMap = {
+                currentButtonKey:'VIEW'
+            };
+            if(dataOid){
+            	queryMap['dataOid'] = dataOid;
+            }
+            if(dataBtmType){
+            	queryMap['dataBtmType'] = dataBtmType;
+            }
+            var options = that.getConfig(id);
+            if(options.dataIsProcessInstance && dataOid){
+                queryMap['executionid'] = dataOid;
+                queryMap['dataOid'] = "";
+                delete queryMap['dataOid'];
+            }
+            if(where){
+                if(!options.where){
+                	options.where = {};
+                }
+                $.extend(queryMap,options.where,where);
+            }
+            layui.table.reload(id,{
+                where:queryMap,
+                done:function(){
+                	//delete this.where
+                }
+            });
+        };
+        this.getFileTableColumns = function(filecomponseoid,hasDownloadFileRight){
+        	//鑾峰彇鏂囦欢鐨勫垪琛�
+            var that = this;
+            var table = layui.table;
+            return [
+                table.getIndexColumn(),
+                table.getCheckColumn(),
+                {
+                    field:'name',
+                    title:'鏂囦欢鍚嶇О',
+                    width:250,
+                    templet:function(d){
+                        if(hasDownloadFileRight){
+                            //璇存槑鏈変笅杞芥枃浠剁殑鏉冮檺锛岄偅涔堟垜浠氨娣诲姞涓�涓秴閾炬帴
+                            return '<a name="filenamedownloadlink " class="layui-btn layui-btn-intable" lay-event="PREVIEW" fileoid="' + d.oid +'" filecomponseoid="' + filecomponseoid +  '">' + ($webUtil.isNotNull(d.id)?d.id:d.name) + '</a>';
+                        }else{
+                            if($webUtil.isNotNull(d.id)){
+                                return d.id;
+                            }
+                            return d.name;
+                        }
+                    }
+                },{
+                    field:'fileSize',
+                    title:'澶у皬',
+                    width:80,
+                    templet:function(d){
+                        if(!d.fileSize || d.fileSize == null || d.fileSize*1 == 0 || isNaN(d.fileSize*1) ){
+                            return "鏈煡澶у皬";
+                        }else{
+                            //鍘熷澶у皬鏄疊
+                            var filesize = d.fileSize*1;
+                            if(filesize>1024*1024*1024*1024){
+                                return parseInt(filesize/(1024*1024*1024*1024)) + "TB";
+                            }else if(filesize> 1024*1024*1024){
+                                return parseInt(filesize/(1024*1024*1024)) + "GB";
+                            }else if(filesize> 1024*1024){
+                                return parseInt(filesize/(1024*1024)) + "MB";
+                            }else if(filesize> 1024){
+                                return parseInt(filesize/1024) + "KB";
+                            }else {
+                                return filesize + "B";
+                            }
+                        }
+                    }
+                },{
+                    field:'secretGradeText',
+                    title:'瀵嗙骇',
+                    width:60,
+                    hidden:(!configData.controllerSecret)
+                },{
+                    field:'fileDocClassifyName',
+                    title:'鏂囨。绫诲埆',
+                    width:130
+                },{
+                    field:'creator',
+                    title:'涓婁紶浜�/鏃堕棿',
+                    width:210,
+                    templet:function(d){
+                        return d.creator + "(" + $webUtil.formateDateTimeNoSecond(d.createTime) + ")";
+                    }
+                },{
+                    field:'downloadCount',
+                    title:'涓嬭浇鏁伴噺',
+                    hidden: true,
+                    width:90
+                }
+            ];
+        };
+        this.refresh = function(event,thisButtonPoint){
+            var that = this;
+            //鍒锋柊锛岄渶瑕佹壘鍒癷d
+            var	filecomponentid = that.getFileComponentId(thisButtonPoint);
+            that.reloadByWhere(filecomponentid);
+        };
+        this.doPreview = function(fileoid,filecomponentid,fileName){
+        	//鎵ц棰勮
+        	var that = this;
+        	if($webUtil.isNull(fileoid) || $webUtil.isNull(filecomponentid)){
+        		return false;
+        	}
+        	var options = that.getConfig(filecomponentid);
+        	var url = options.previewUrl;
+        	if($webUtil.isNull(url)){
+        		url = that.url.bus.controller + that.url.bus.previewUrlByFileOid;
+        		if(options.inProcess){
+        			url = that.url.process.previewUrlByFileOid;
+        		}
+            }
+            //鍚庡彴涓昏鏄帶鍒舵潈闄�
+        	$webUtil.post(url,{ownbizOid:options.ownbizOid,ownbizBtm:options.ownbizBtm,fileOid:fileoid},function(result){
+                 if(result.success){
+                     //鐩存帴璋冪敤棰勮鐨勯〉闈�
+                     //寮瑰嚭绐楀彛锛岃繕鏄�夐」鍗℃樉绀�
+                     var title = '棰勮銆�' + fileName + "銆�";
+                     if("tab" == options.showType){
+                         portal.showTabByMenu(options.id + "_preview",{
+                             text:title,
+                             id:filecomponentid + "_preview",
+                             multiCompent:true,
+                             url:'usejs:FilePreviewBase?fileOids=' + fileoid + "&reswitch=" + (options.reswitch?options.reswitch:"true") + "&viewtype=" + (options.viewType?options.viewType:"pdf")
+                         });
+                     }else {
+                         //榛樿鏄脊鍑虹獥鍙�
+                         $webUtil.dialog({
+                             content:'<div id="' + filecomponentid + '_preview"></div>',
+                             title:title,
+                             fullScreen:true,
+                             success:function(layero){
+                                 var preview = layui['FilePreviewBase'];
+
+                                 $("#" + filecomponentid + "_preview").html(preview.getContent(filecomponentid));
+                                 preview.init(filecomponentid,{
+                                     id:filecomponentid,
+                                     fileOids:fileoid,
+                                     reswitch:(options.reswitch?options.reswitch:"true"),
+                                     viewtype:(options.viewType?options.viewType:"pdf"),
+                                     showType:'inner',
+                                     height:$webUtil.getDialogScreenHeight({fullScreen: true})-55,
+                                     ownbizOid:options.ownbizOid,
+                                     ownbizBtm:options.ownbizBtm
+                                 })
+                             }
+                         })
+                     }
+                 }else if(result.code == "notsupportpreview"){
+                     $webUtil.showMsg("鎮ㄩ�夋嫨鐨勬枃浠朵笉鏀寔棰勮锛屽皢涓烘偍璺宠浆鑷充笅杞芥枃浠�",function(){
+                         that.downloadFileByOid(fileoid,filecomponentid);
+                     });
+                 }else{
+                     $webUtil.showErrorMsg(result.msg);
+                 }
+             },function(xhr,error){
+                 $webUtil.showErrorMsg("鍦ㄩ獙璇佹槸鍚﹀彲浠ラ瑙堢殑鏃跺�欏嚭鐜颁簡閿欒锛屽彲鑳芥槸鏂囦欢鏈嶅姟娌℃湁鍚姩");
+             },options.inProcess?that.processPath:that.backPath);
+        };
+        this.downloadFileByOid =function(oid,filecomponentid){
+            var that = this;
+            //涓嬭浇鏂囦欢
+            var iframeId = MD5(oid + $webUtil.getSystemVar($webUtil.systemValueKey.userOid));
+            $webUtil.fileDownload(that.backPath + that.url.downloadByFileOid + "?fileOid=" + oid +"&downloadUUID=" + iframeId);
+        };
+        this.getFileComponentId = function(button){
+        	//鏍规嵁鎸夐挳鎵�鍦ㄧ殑浣嶇疆鑾峰彇鏂囦欢缁勪欢鐨処D锛�
+        	 var that = this;
+             var filecomponentid = $(button).parent().find('[name="filecomponentid"]').val();
+             if($webUtil.isNull(filecomponentid)){
+             	$webUtil.showErrorMsg("filecomponentid灞炴�ф病鏈夊�硷紝璇峰墠绔紑鍙戜汉鍛樻鏌�");
+             	return ;
+             }
+             return filecomponentid;
+        };
+        this.PREVIEW = function(event,thisButtonPoint){
+        	//棰勮鎸夐挳
+            var that = this;
+            var filecomponentid = that.getFileComponentId(thisButtonPoint);
+            var fileoid = $webUtil.getOidFromGrid(filecomponentid,true,true);
+            if(!fileoid){
+                return false;
+            }
+            var name = $webUtil.getOidFromGrid(filecomponentid,false,false,'name');
+            that.doPreview(fileoid,filecomponentid,name);
+        };
+        this.DOWNLOADFILE = function(event,thisButtonPoint){
+        	//涓嬭浇鎸夐挳
+            var that = this;
+            var filecomponentid = that.getFileComponentId(thisButtonPoint);
+            var fileoid = $webUtil.getOidFromGrid(filecomponentid,true,true);
+            if(!fileoid){
+                return false;
+            }
+            that.downloadFileByOid(fileoid,filecomponentid);
+        };
+        this.revisefile = function(event,thisButtonPoint){
+        	 var that = this;
+        	 var filecomponentid = that.getFileComponentId(thisButtonPoint);
+             var fileoid = $webUtil.getOidFromGrid(filecomponentid,true,true);
+             if(!fileoid){
+                 return false;
+             }
+             var options = that.getConfig(filecomponentid);
+             var form = layui.form;
+ 			 var filter ='upload_form'+options.id;
+ 			 var uploadIndex = layer.open({
+ 				 type:1,
+ 				 title:'淇敼鏂囦欢',
+ 				 //skin:'layui-layer-lan',
+ 				 content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:55px" enctype="multipart/form-data"></form>',
+ 				 area:['370px','200px'],
+ 			     closeBtn:1,
+ 			     shade:true,
+ 			     shadeClose:true,
+ 			     success:function(layero){
+ 			    	form.addItems(filter,[{
+ 						type:'text',
+ 						name:'oid',
+ 						text:'鏂囦欢涓婚敭',
+ 						hidden:true
+ 					}],function(){
+ 			    		if($("#NCFile_upload_form_file" + filter )){
+                             $("#NCFile_upload_form_file" + filter).remove();
+ 						}
+                        form.setValues({
+                            fileOid:fileoid,
+                            updateFileFlag:true
+ 						},filter);
+ 			    		$("#form_" + filter).append('<button type="button" class="layui-btn" id="button_' + filter + '" style="margin-left:100px"><i class="layui-icon">&#xe67c;</i>閫夋嫨鏂囦欢鍚庤嚜鍔ㄤ笂浼�</button>');
+ 			    		var upload = layui.upload;
+ 				    	//鎵ц瀹炰緥
+ 				        var uploadForm = upload.render({
+ 				    	    elem: '#button_' + filter //缁戝畾鍏冪礌
+ 				    	    ,accept:'file'
+ 							,auto:true
+ 				    	    ,url: that.backPath + that.url.reviseByFileOid//涓婁紶鎺ュ彛
+ 				    	    ,before:function(obj){
+ 				    	    	if(form.validata(filter)){
+ 				    	    		var values = form.getValues(filter);
+ 				    	    		obj.setData(values);
+ 				    	    		$webUtil.showProgress("鏂囦欢涓婁紶涓�︹��");
+ 				    	    		return true;
+ 				    	    	}else{
+ 				    	    		$webUtil.showErrorMsg("璇峰厛杈撳叆鍐呭鍚庡啀閫夋嫨鏂囦欢");
+ 				    	    		return false;
+ 				    	    	}
+ 				    	    }
+ 				    	    ,done: function(result){
+ 				    	    	if(result.success){
+                                    layer.close(uploadIndex);
+ 			    					$webUtil.showMsg("淇敼鏂囦欢鎴愬姛");
+ 			    					$webUtil.closeProgress();
+ 			    					that.reloadByWhere(filecomponentid);
+ 			    				}else{
+ 			    					$webUtil.showErrorMsg(result.msg);
+ 			    					$webUtil.closeProgress();
+ 			    				}
+ 				    	    }
+ 				    	    ,error: function(){
+ 				    	      //璇锋眰寮傚父鍥炶皟
+ 				    	    	$webUtil.showErrorMsg("涓婁紶鏂囦欢鍑虹幇浜嗗紓甯�");
+ 				    	    }
+ 				        });
+ 					},{},{
+ 						defaultColumnOneRow:1
+ 					});
+ 			    }
+ 			});
+        };
+        this.showFileDialog = function (id,options){
+            var that = this;
+            if(!("inProcess" in options)) {
+                options.inProcess = false;
+            }
+            if(options.onUse){
+                if(!options.buttonIconMap){
+                    options.buttonIconMap=[];
+                }
+                options.buttonInfoMap = [{
+                    uniqueFlag: 'DOWNLOADFILE',
+                    alias: '涓嬭浇'
+                },{
+                    uniqueFlag:'PREVIEW',
+                    alias:'棰勮'
+                }];
+                options.hasDownloadRight=true;
+            }
+            that.setConfig(id,options);
+            $webUtil.dialog({
+                title:(options.title?options.title:'鏂囦欢绠$悊'),
+                content:'<div id="referGrid_toolbar_' + id + '" layui-filter="referGrid_toolbar_' + id + '" class="layui-table-toolbar layui-form referGrid_toolbar_'+id+'" style="height:550px;"></div>',
+                area:[(($webUtil.isNotNull(options.width) && options.width*1>1) ?options.width*1 : 950) +'px',
+                    (($webUtil.isNotNull(options.height) && options.height*1>1) ?options.height*1 : 670) + 'px'],
+                success:function(layero){
+                    options.elem ='#referGrid_toolbar_' + id ;
+                    that.render(id,options);
+                }
+            });
+        };
+    };
+    var fm = new fileManager();
+    exports("vciWebFileManager",fm);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebMenu.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebMenu.js
new file mode 100644
index 0000000..1023e3d
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebMenu.js
@@ -0,0 +1,440 @@
+layui.define(['layer'],function(exports){
+	/**
+	 * 棣栭〉鐨勮彍鍗�
+	 * 浠呮敮鎸佷笁绾ц彍鍗曪紝濡傛灉杩樻湁鏇存繁鐨勫眰绾э紝涓嶅缓璁娇鐢紝鍙互淇敼姝ゆ簮鐮�
+	 * 濡傛灉瑕佷娇鐢ㄦ棤闄愮骇鍒殑鑿滃崟锛岃浣跨敤layui鐨�2.2.6浠ヤ笂鐨勭増鏈� @2018-05-03
+	 * @author weidy@2018-2-26
+	 */
+	var menu = {
+		menuStore: null,//甯︾粨鏋勭殑鑿滃崟鏁版嵁
+		menuLeafFullPath: {},//姣忎竴涓彾瀛愯妭鐐圭殑瀹屾暣璺緞
+		allMenuStore: {},//骞抽摵鐨勮彍鍗曟暟鎹�
+		menuFavStore: [],
+		menuUlId: 'portal_menu_tree',//鑿滃崟鏄剧ず鐨勪富閿�
+		favUlId: 'portal_headmenu',
+		moduleKey: 'vciWebMenu',
+		backPath: configData.compatibility ? path : configData.frameworkPath,
+		menuConfig: {//杩欓噷鐨勯厤缃兘鏄粯璁ょ殑锛屽湪浣跨敤鐨勬椂鍊欏彲浠ヨ鐩�
+			menuWidth: '100%',
+			menuHeight: '38px',
+			menuIconType: "iconFont",//鑿滃崟鍥炬爣鐨勮幏鍙栨柟寮忥紝鏀寔iconSrc.iconFont,id鏂瑰紡锛宨conSrc琛ㄧず鍦ㄥ钩鍙颁腑鐨勮彍鍗昫esc閲岄厤缃紝id琛ㄧず浣跨敤鑿滃崟鍞竴缂栧彿
+			defaultMenuIconPath: 'style/images/menuicons',
+			defaultMenuIcon1: 'layui-icon-app',//榛樿鑿滃崟鍥炬爣
+			defaultMenuIcon2: 'layui-icon-set-sm',
+			defaultMenuIcon3: 'layui-icon-list',
+			defaultMenuIcon4: 'layui-icon-cols',
+			menuUrl: "smFunctionController/treeMyMenu",//鑿滃崟鐨勮幏鍙栧湴鍧�
+			favUrl: "favFunctionController/listFavFunction"//鑾峰彇鏀惰棌鐨勫湴鍧�
+		},
+		privateConfig: {//绉佹湁閰嶇疆锛屼笉寤鸿淇敼
+			level1IconWidth: 20,//鍥炬爣澶у皬
+			level2IconWidth: 18,
+			level3IconWidth: 16,
+			level1MarginLeft: 0,//缂╄繘
+			level2MarginLeft: 20,
+			level3MarginLeft: 40,
+			level1Fontsize: 16,//瀛椾綋澶у皬
+			level2Fontsize: 14,
+			level3Fontsize: 12,
+			addFavUrl: "favFunctionController/addFav",
+			removeFavUrl: "favFunctionController/removeFav"
+		},
+		rootMenuId: "modelManagmentNode",
+		menuClickListener: emptyFunction,//鐐瑰嚮鍥炶皟浜嬩欢
+		init: function () {
+			var me = this;
+			$webUtil.copyConfig(me);
+			var windowWidth = $('body').width()
+			/*if (windowWidth > configData.vciWebPortal.mainConfig.pageWidth1440) {
+				me.menuConfig.menuWidth = '200px'
+			} else if (windowWidth > configData.vciWebPortal.mainConfig.pageWidth1280) {
+				me.menuConfig.menuWidth = '180px'
+			} else {
+				me.menuConfig.menuWidth = '150px'
+			}*/
+			var windowHeight = $(document).height()
+			if (windowHeight > configData.vciWebPortal.mainConfig.pageHeight900) {
+				me.menuConfig.menuHeight = '38px'
+			} else if (windowHeight > configData.vciWebPortal.mainConfig.pageHeight720) {
+				me.menuConfig.menuHeight = '32px'
+			} else {
+				me.menuConfig.menuHeight = '28px';
+				me.privateConfig.level1Fontsize = 14;
+				me.privateConfig.level1IconWidth = 16;
+				me.privateConfig.level2IconWidth = 14;
+				me.privateConfig.level3IconWidth = 12
+			}
+			me.getAllMenuInfo(function () {
+				me.showMenuInfo();
+				me.sideHover()
+			});
+		},
+		getAllMenuInfo: function (callback) {//浠庡悗鍙拌幏鍙栬彍鍗曠殑淇℃伅
+			//鑾峰彇鑿滃崟鐨勪俊鎭�
+			var me = this;
+			$webUtil.get(me.menuConfig.menuUrl, {parentOid: ''}, function (result) {
+				if (result.success) {
+					me.menuStore = result.treeData;
+					me.getIcon(me.menuStore)
+					if (callback) {
+						callback();
+					}
+				} else {
+					$webUtil.showAutoMsg(result.msg, 5000);
+				}
+			}, function (xhr, error) {
+
+			}, me.backPath, false, false);
+		},
+		getAllFavMenu: function (callback) {
+			var me = this;
+			$webUtil.get(me.menuConfig.favUrl, {}, function (result) {
+				if (result && result.success) {
+					me.menuFavStore = result.obj;
+					if (callback) {
+						callback();
+					}
+				} else {
+					$webUtil.showAutoMsg(result.msg, 5000);
+				}
+			}, function (xhr, error) {
+
+			}, me.backPath, false);
+		},
+		showMenuInfo: function () {//鏄剧ず鑿滃崟淇℃伅
+			var me = this;
+			if (me.menuStore) {
+				var menuHtml = "";
+				$.each(me.menuStore, function (index) {
+					//绗竴绾�
+					var record = me.menuStore[index];
+					record.id = record.attributes['id'];
+					var isHasChild = false;
+					if (record.children && record.children.length > 0) {
+						isHasChild = true;
+					}
+					var parentPath = ["棣栭〉"];
+					var html = me.getNodeHtml(record, 1, isHasChild, parentPath);
+					me.allMenuStore[record.id] = record;
+					if (isHasChild) {
+						var allChildren = record.children;
+						var secondHtml = "";
+						$.each(allChildren, function (secondIndex) {
+							var secondRecord = allChildren[secondIndex];
+							secondRecord.id = secondRecord.attributes['id'];
+							var isHasThreeLevel = false;
+							if (secondRecord.children && secondRecord.children.length > 0) {
+								isHasThreeLevel = true;
+							}
+							var secondParentPath = ['棣栭〉', record.text];
+							var thisSecondHtml = me.getNodeHtml(secondRecord, 2, isHasThreeLevel, secondParentPath);
+							me.allMenuStore[secondRecord.id] = secondRecord;
+							if (isHasThreeLevel) {
+								var threeChildren = secondRecord.children;
+								var threeHtml = "";
+								var threeParentPath = ['棣栭〉', record.text, secondRecord.text];
+								$.each(threeChildren, function (threeIndex) {
+									var threeRecord = threeChildren[threeIndex];
+									threeRecord.id = threeRecord.attributes['id'];
+									me.allMenuStore[threeRecord.id] = threeRecord;
+									threeHtml += me.getNodeHtml(threeRecord, 3, false, threeParentPath);
+								});
+								thisSecondHtml += threeHtml;
+								thisSecondHtml += '</dl>';
+							}
+							thisSecondHtml += '</dd>';
+							secondHtml += thisSecondHtml;
+						});
+						html += secondHtml;
+						html += '</dl>';
+					}
+					html += '</li>';
+					menuHtml += html;
+				});
+				if ($webUtil.isNull(me.menuUlId)) {
+					me.menuUlId = "portal_menu_tree";
+				}
+				$("#" + me.menuUlId).css({'width': me.menuConfig.menuWidth}).html(menuHtml);
+				$("#" + me.menuUlId).parent().css({'width': me.menuConfig.menuWidth + 20}).parent().css({'width': me.menuConfig.menuWidth})
+				me.buildAllListener();
+				layui.element.render('nav');
+			}
+		},
+		getNodeHtml: function (menuObject, level, isHasChild, parentPath) {//鑾峰彇姣忎竴绾ц彍鍗曠殑html
+			var me = this;
+			var html = "";
+			//澶勭悊鍥炬爣璺緞
+			var iconSrc = me.getIconSrc(menuObject,level);
+			var levelClass = "vciWebMenuLevel" + level;
+			var levelIconWidth = me.privateConfig['level' + level + 'IconWidth'] + 'px';//鍦ㄤ笂鏂归厤缃殑瀹藉害锛屽瓧浣撳ぇ灏忥紝缂╄繘锛屽綋鐒朵篃鍙互鍦╟ss閲岃缃�
+			var levelFontSize = me.privateConfig['level' + level + 'Fontsize'] + 'px';
+			var levelMarginLeft = me.privateConfig['level' + level + 'MarginLeft'] + 'px';
+			var styleCss = 'margin-left:' + levelMarginLeft + ';line-height: ' + me.menuConfig.menuHeight + ';height: ' + me.menuConfig.menuHeight
+			if (level == 2 || level == 3) {
+				html = '<dd class="' + levelClass + '">';
+				if (isHasChild) {
+					//璇存槑鏈変笅绾х殑锛岄偅鏈骇鏄笉鑳界偣鍑荤殑锛屽彧鑳芥槸灞曞紑
+					html += '<a href="javascript:;" style="' + styleCss + '">';
+				} else {
+					//璇存槑杩欎釜鏄彾瀛愯妭鐐逛簡鍝︼紝閭d箞闇�瑕佸仛鐨勬槸鎶婅繖涓彾瀛愮殑鏁翠釜鏍戜繚瀛樿捣鏉�
+					var thisParentPath = [];
+					for (var i = 0; i < parentPath.length; i++) {
+						thisParentPath.push(parentPath[i]);
+					}
+					thisParentPath.push(menuObject.text);
+					me.menuLeafFullPath[menuObject.id] = thisParentPath;
+					html += '<a href="javascript:;" class="vciWebMenuLeaf" data-id="' + menuObject.id + '" style="' + styleCss + '">';
+				}
+				html += me.getIconHtml(iconSrc, levelIconWidth);
+				var url = menuObject.bsUrl;
+				if ($webUtil.isNull(url)) {
+					url = menuObject.url;
+				}
+				if ($webUtil.isNull(url)) {
+					url = menuObject.href;
+				}
+				html += '<span style="font-size:' + levelFontSize + ';margin-left:9px;" backUrl="' + url + '">' + menuObject.text;
+				html += '</span></a>';
+				if (isHasChild) {//璇存槑鏈変笅绾�--绗笁绾т笉鏀寔鍐嶅線涓嬫樉绀轰簡
+					html += '<dl class="layui-nav-child" >';
+				}
+			} else {
+				html = '<li class="layui-nav-item ' + levelClass + '" style="line-height: ' + me.menuConfig.menuHeight + '">';
+				if (isHasChild) {
+					//璇存槑鏈変笅绾х殑锛岄偅鏈骇鏄笉鑳界偣鍑荤殑锛屽彧鑳芥槸灞曞紑
+					html += '<a href="javascript:;" style="' + styleCss + '">';
+				} else {
+					//璇存槑杩欎釜鏄彾瀛愯妭鐐逛簡鍝︼紝閭d箞闇�瑕佸仛鐨勬槸鎶婅繖涓彾瀛愮殑鏁翠釜鏍戜繚瀛樿捣鏉�
+					var thisParentPath = [];
+					for (var i = 0; i < parentPath.length; i++) {
+						thisParentPath.push(parentPath[i]);
+					}
+					thisParentPath.push(menuObject.text);
+					me.menuLeafFullPath[menuObject.id] = thisParentPath
+					html += '<a href="javascript:;" class="vciWebMenuLeaf" data-id="' + menuObject.id + '" style="' + styleCss + '">';
+				}
+				html += me.getIconHtml(iconSrc, levelIconWidth);
+				html += '<span style="font-size:' + levelFontSize + ';margin-left:5px;">' + menuObject.text;
+				html += '</span></a>';
+				if (isHasChild) {//璇存槑鏈変笅绾�
+					html += '<dl class="layui-nav-child" >';
+				}
+			}
+			return html;
+		},
+		getIconHtml: function (iconSrc, levelIconWidth) {
+			var html = "";
+			if (iconSrc.indexOf(".") > -1) {//璇存槑鏄浘鏍�
+				html += '<img src="' + iconSrc + '" style="width:' + levelIconWidth + ';height:' + levelIconWidth + ';">';
+			} else {
+				html += '<i class="layui-icon ' + iconSrc + '" style="font-size: ' + levelIconWidth + '; "></i>';
+			}
+			return html;
+		},
+		getIconSrc: function (menuObject,level) {
+			var me = this;
+			var iconSrc = '';
+			var menuIconType = me.menuConfig.menuIconType;
+			if (menuObject.menuIconType) {
+				menuIconType = menuObject.menuIconType;
+			}
+			if (menuIconType == "iconSrc" && $webUtil.isNotNull(menuObject.iconCls)) {
+				iconSrc = me.menuConfig.defaultMenuIconPath + "/" + menuObject.iconCls;
+			} else if (menuIconType == "id") {
+				iconSrc = me.menuConfig.defaultMenuIconPath + "/" + menuObject.id + ".png";
+			} else if (menuIconType == "iconFont") {
+				iconSrc = menuObject.iconCls;
+				if ($webUtil.isNull(iconSrc)) {
+					iconSrc = me.menuConfig['defaultMenuIcon'+level];
+				}
+			}
+			if ($webUtil.isNull(iconSrc)) {
+				iconSrc = me.menuConfig['defaultMenuIcon'+level];
+			}
+			return iconSrc;
+		},
+		buildAllListener: function () {//璁剧疆浜嬩欢
+			var me = this;
+			$(".layui-nav-item").click(function () {
+				$(this).siblings().removeClass("layui-nav-itemed")
+			});
+			$(".vciWebMenuLevel2").click(function () {
+				$(this).siblings().removeClass("layui-nav-itemed")
+			});
+			$(".vciWebMenuLeaf").click(function () {
+				//璇存槑鏄偣鍑荤殑鑿滃崟浜嗗摝
+				//鍏堟妸鎵�鏈夌殑鍙跺瓙鑺傜偣鐨勯�変腑鐘舵�佸叏閮ㄩ兘鍘婚櫎
+				var id = $(this).attr("data-id");
+				me.currentMenuId = "";
+				if ($webUtil.isNotNull(id) && me.menuClickListener) {
+					me.currentMenuId = id;
+					me.menuClickListener(id, me.getMenuObjectById(id), me.isFav(id));
+				}
+			});
+		},
+		isFav: function (id) {
+			var me = this;
+			var isFav = false;
+			for (var i = 0; i < me.menuFavStore.length; i++) {
+				if (me.menuFavStore[i].id == id) {
+					isFav = true;
+				}
+			}
+			return isFav;
+		},
+		changeFav: function (callback) {
+			var me = this;
+			if ($webUtil.isNull(me.currentMenuId)) {
+				return false;
+			}
+			var isFav = me.isFav(me.currentMenuId);
+			if (!isFav) {
+				me.addFav(me.currentMenuId, function () {
+					me.getAllFavMenu(function () {
+						if (callback) {
+							callback(isFav);
+						}
+					});
+				});
+			} else {
+				me.removeFav(me.currentMenuId, function () {
+					me.getAllFavMenu(function () {
+						if (callback) {
+							callback(isFav);
+						}
+					});
+				});
+			}
+		},
+		addFav: function (id, callback) {
+			var me = this;
+			$webUtil.post(me.privateConfig.addFavUrl, {functionId: id}, function (result) {
+				if (result.success) {
+					if (callback) {
+						callback();
+					}
+				} else {
+					$webUtil.showErrorMsg(result.msg);
+				}
+			}, function (xhr, err) {
+				$webUtil.showErrorMsg("鏀惰棌鍔熻兘鍑洪敊锛屽彲鑳芥槸鏈嶅姟娌℃湁鍚姩");
+			}, me.backPath, false);
+		},
+		removeFav: function (id, callback) {
+			var me = this;
+			$webUtil.post(me.privateConfig.removeFavUrl, {functionId: id}, function (result) {
+				if (result.success) {
+					if (callback) {
+						callback();
+					}
+				} else {
+					$webUtil.showErrorMsg(result.msg);
+				}
+			}, function (xhr, err) {
+				$webUtil.showErrorMsg("鏀惰棌鍔熻兘鍑洪敊锛屽彲鑳芥槸鏈嶅姟娌℃湁鍚姩");
+			}, me.backPath, false);
+			if (callback) {
+				callback();
+			}
+		},
+		getMenuObjectById: function (id) {
+			var me = this;
+			return me.allMenuStore[id];
+		},
+		// 寰幆鑿滃崟鏁版嵁澧炲姞icon
+		getIcon: function (iconData) {
+			var me = this;
+			var front = 'layui-icon-'
+			var icon = ['jihua', 'wj-jh', 'renwuguanli', 'jiankong', 'paigongfenpeishebei', 'fq_jiagong', 'ziyuan145', 'eduguanli', 'tubiao_shengchangongyi', 'zuzhi', 'quanxian', 'jichushuju', 'wenjianguanli', 'manage-process', 'xiaoxizhongxin', 'peizhizhongxin', 'RectangleCopy']
+			$.each(iconData, function (k, v) {
+				me.menuStore[k].iconCls = front + icon[k]
+			})
+		},
+		sideHover: function () {
+			var othis = $(this);
+			var sidebarHover = $("#portal_menu_tree li"); // 渚ц竟鏍廻over
+			var sushover = $(".side-hover .vciWebMenuLevel2"); // 鎮诞hover
+			var sushover2 = $(".side-hover .vciWebMenuLevel3"); // 鎮诞hover2
+			var html = "";
+			var level1 = '';
+			var level2 = '';
+			var level3 = '';
+			var isShow = false;
+			var isShow2 = false;
+			var isShow3 = false;
+			var cleTime = '';
+			sidebarHover.on('mouseenter', function (event) {
+				if (!$("#portal_menu").hasClass("sidebarHover")) {
+					return false
+				}
+				$(".side-hover").css({"top": event.pageY});
+				isShow = true;
+				clearTimeout(level1);
+				html = $(this).children("dl").clone(true);
+				$(".side-hover").html(html[0]);
+				$(".side-hover dl").hide().removeAttr('class');
+				$(".side-hover dl").eq(0).show();
+				$(".side-hover span").show();
+				var chiDom = $(".side-hover .vciWebMenuLevel2").children('dl');
+				chiDom.addClass("leve3");
+				$(".side-hover .layui-nav-more").html(">").removeClass('layui-nav-more');
+			}).on('mouseleave', function () {
+				level1 = setTimeout(function () {
+					isShow = false;
+					if (!isShow) {
+						$(".side-hover dl").hide();
+					}
+				}, 500)
+
+			});
+			sushover.live('mouseenter', '.side-hover', function (event) {
+				isShow = true;
+				isShow2 = true;
+				clearTimeout(level1);
+				clearTimeout(level2);
+				clearTimeout(level3);
+				clearTimeout(cleTime);
+				if ($(this).children().is('dl')) {
+					$(".side-hover dd dl").hide();
+					$(this).children('dl').show();
+				} else {
+					$(".side-hover dd dl").hide();
+				}
+				$(this).addClass('isHover').siblings().removeClass('isHover');
+
+			}).live('mouseleave', '.side-hover', function () {
+				cleTime = setTimeout(function () {
+					isShow = false;
+					isShow2 = false;
+				}, 300);
+				level2 = setTimeout(function () {
+					if (!isShow2) {
+						$(this).children('dl').hide();
+						$(".side-hover dl").hide();
+					}
+				}, 500);
+			});
+			sushover2.live('mouseenter', '.side-hover', function (event) {
+				isShow = true;
+				isShow2 = true;
+				isShow3 = true;
+				clearTimeout(level3);
+				clearTimeout(cleTime);
+				$(this).addClass('isHover').siblings().removeClass('isHover');
+			}).live('mouseleave', '.side-hover', function () {
+				cleTime = setTimeout(function () {
+					isShow = false;
+					isShow2 = false;
+					isShow3 = false;
+				}, 300);
+				level3 = setTimeout(function () {
+					if (!isShow3) {
+						sushover.children('dl').hide();
+						$(".side-hover dl").hide();
+					}
+				}, 500);
+			});
+		}
+	};
+	exports('vciWebMenu',menu);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebOnlineUser.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebOnlineUser.js
new file mode 100644
index 0000000..29d3c9b
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebOnlineUser.js
@@ -0,0 +1,87 @@
+/**
+ * 鍦ㄧ嚎鐢ㄦ埛鍒楄〃
+ * @author weidy@2019-07-19
+ * @constructor
+ */
+layui.define(['layer','table'],function(exports){
+    var Class = function(){
+        this.moduleKey = "vciWebOnlineUser";
+        this.id='vciWebOnlineUser';
+        this.sourceData={};//鏉ユ簮鏁版嵁锛岄渶瑕佽嚦灏戝寘鍚玹ype锛屽鏋滄病鏈夊垯榛樿涓烘壒浜�
+        this.columns = [];
+        this.backPath = path;//榛樿娴佺▼鍜岄」鐩殑璺緞鏄竴鏍风殑
+        this.url={
+            dataGrid:'/webOnlineUserController/dataGrid'//鍒楄〃鏁版嵁鍜屾煡璇�
+        };
+        this.buttonIconMap = {
+            SEARCH:'layui-icon-refresh-2',
+            SENIORSEARCH:'layui-icon-query'
+        };
+        this.getContent=function(){//杩斿洖杩欎釜缁勪欢鐨勫熀纭�html
+            var that = this;
+            var html = "";
+            html = [
+                '<div class="layui-layout-border">',
+                	'<div class="layui-center">',
+						that.getToolbarHtml(),
+                    	'<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',//涓诲垪琛�
+					'</div>',
+				'</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id, '" class="layui-btn-container">',//涓诲垪琛ㄧ殑鎸夐挳
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.init=function(){//鍩虹鐨刪tml琚坊鍔犲悗锛屽啀鎵ц鍒濆鍖�
+            var that = this;
+            $webUtil.copyConfig(that,that.moduleKey);
+            var table = layui.table;
+            that.checkColumns();//涓诲垪琛ㄤ腑鍒椼��
+            table.render({
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                url: that.backPath + that.url.dataGrid,
+                cols: [that.columns]
+            });
+            $('[layui-filter="toolbar_' + that.id + '_refresh"]').unbind("click").click(function(){
+                that.refresh();
+            });
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){//濡傛灉鍏朵粬鍦版柟鎯充娇鐢ㄨ繖涓粍浠剁殑鏃跺�欙紝鍙互鑷畾涔夊垪
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),{
+                    field:'userId',
+                    title:'鐢ㄦ埛鍚�',
+                    width:150
+                },{
+                    field:'userName',
+                    title:'鐢ㄦ埛濮撳悕',
+                    width:150
+                },{
+                    field:'ip',
+                    title:'IP鍦板潃',
+                    width:150
+                },{
+                    field:'lastRequestTime',
+                    title:'鏈�鍚庤姹傛湇鍔℃椂闂�',
+                    width:200
+                }];
+            }
+        };
+		this.refresh = function(){
+			var that = this;
+			layui.table.reload('table_' + that.id,{});
+		};
+    };
+    var cs = new Class();
+    exports('vciWebOnlineUser',cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebPortal.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebPortal.js
new file mode 100644
index 0000000..4b7eff3
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebPortal.js
@@ -0,0 +1,785 @@
+layui.define(['layer','form','element','vciWebMenu','util'],//鏁扮粍閲屾槸闇�瑕佷娇鐢ㄧ殑layui鐨勭粍浠�
+		function(exports){
+	/**
+	 * 涓婚〉锛屽寘鍚寳鍖恒�佽タ鍖恒�佷腑闂村尯鍩熷拰鍗楀尯
+	 * @author weidy@2018-2-26
+	 */
+	var portal = {
+	    sessionInfo:{},
+	    themeName:'default',
+        moduleKey:'vciWebPortal',
+        downloadFileUUID:[],
+	    mainConfig:{
+	    	indexPageModel:"",
+	    	//娉ㄦ剰锛岃繖閲岀殑閰嶇疆浼氳鏇存敼
+	 	    leftMenuWidth:"200px",//宸︿晶鑿滃崟鐨勫搴�
+	 	    leftMenuMinWidth:'50px',//宸︿晶鑿滃崟鐨勬渶灏忓搴�
+	 	    //鍖楀尯鐩稿叧鐨勯厤缃�
+			companyLogo:"",//LOGO鍖哄煙璺緞
+			companyMinLogo:"",//LOGO鍖哄煙鐨勭缉鐣ュ浘
+			//鍔熻兘鍥炬爣
+			menuMinClass:'layui-icon-spread-left',//鑿滃崟鏈�灏忔樉绀�
+			menuClass:'layui-icon-shrink-right',//鑿滃崟姝e父鏄剧ず
+			refreshClass:'layui-icon-refresh',//鍒锋柊鎸夐挳
+			isShowSearch:false,//鏄惁鏄剧ず鍏ㄦ枃妫�绱�
+            isShowTheme:false,//鏄惁鍙互鍒囨崲涓婚
+			searchUrl:'',//鍏ㄦ枃妫�绱㈡墽琛岃矾寰�
+			msgClass:'layui-icon-reply-fill',//娑堟伅涓績鏍峰紡
+			themeClass:'layui-icon-theme',//涓婚鏍峰紡
+			noteClass:'layui-icon-note',//渚跨鏍峰紡
+			favClass:'layui-icon-star-fill',//鏀惰棌
+			unFavClass:'layui-icon-star',//鏈敹钘�
+			fullClass:'layui-icon-screen-full',//鍏ㄥ睆
+			restoreClass:'layui-icon-screen-restore',//鍏ㄥ睆鎭㈠
+            iconFontSize:"16px",//瀛椾綋鍥炬爣鐨勫瓧鍙峰ぇ灏�
+            userCenterSrc:"layui-icon-user",//鐢ㄦ埛澶村儚
+			//鐗堟潈鐨勪俊鎭�
+			isShowVersion:"false",//鏄惁鏄剧ず鐗堟湰淇℃伅
+			versionInfo:''//鐗堟湰淇℃伅
+		},
+		loginUrl:'/webUserController/login',
+		favStore:null,//鏀惰棌鐨勬墍鏈夊姛鑳�
+		portalDiv:null,
+		tabPanelFilter:'vciPortalTab',
+		menuStyle:'normal',//鑿滃崟鏄剧ず鐨勬牱寮弉ormal鍜宮in
+		menuChangeWidthEl:["#portal .layui-side-menu"],//鑿滃崟瀹藉害鍙樻崲鐨勬椂鍊欒澶勭悊瀹藉害鐨勫厓绱�
+		menuChangeLeftEl:[".layui-body"],//鑿滃崟瀹藉害鍙樻崲鐨勬椂鍊欒澶勭悊left鐨勫厓绱�
+	    init:function(){
+	    	//鍦ㄨ繖閲屾墽琛屽垵濮嬮〉闈�
+	    	//1.甯冨眬鏄湪椤甸潰涓婄洿鎺ュ畾涔夊ソ鐨�.浣嗘槸榛樿鏄殣钘忕殑锛屾墍浠ラ渶瑕佸悗闈㈡墽琛屾樉绀�
+	    	var me = this;
+            $webUtil.copyConfig(me,me.moduleKey);
+            var windowWidth=$('body').width()
+            if(windowWidth>configData.vciWebPortal.mainConfig.pageWidth1440){
+				me.mainConfig.leftMenuWidth='200px'
+			}else if(windowWidth>configData.vciWebPortal.mainConfig.pageWidth1280){
+				me.mainConfig.leftMenuWidth='180px'
+			}else {
+				me.mainConfig.leftMenuWidth='150px'
+			}
+	    	me.portalDiv = $("#portal");
+	    	me.portalLogoDiv = $("#portal_logo");
+	    	me.portalToolDiv = $("#portal_toolmenu");
+	    	me.portalPersonDiv = $("#portal_personArea");
+	    	me.portalBody = $("#portal_body");
+	    	me.portalFooter =$("#portal_footer");
+	    	if(!me.mainConfig.iconFontSize){
+	    		me.mainConfig.iconFontSize = '16px';
+			}
+			me.portalBody.css({'left':me.mainConfig.leftMenuWidth})
+	    	//2.璁剧疆logo鍖哄煙
+			var logoInfoHtml = me.createLogoInfoHtml();
+			if(configData.isLogo) {
+				me.portalLogoDiv.html(logoInfoHtml);
+			}else if(configData.titleLogo){
+				me.portalLogoDiv.html('<img src="'+configData.titleLogo+'" alt="'+configData.title+'" height="40">');
+			}else{
+				me.portalLogoDiv.html(configData.title);
+				if(configData.titleFontSize){
+					me.portalLogoDiv.css('font-size',configData.titleFontSize+'px')
+				}
+			}
+	    	var toolHtml = me.createToolHtml();
+	    	me.portalToolDiv.html(toolHtml);
+	    	//3.澶勭悊涓汉涓績
+	    	var personInfoHtml = me.createPersonInfoHtml();
+	    	me.portalPersonDiv.html(personInfoHtml);
+	    	//4.澶勭悊鑿滃崟
+	    	var webMenu = layui.vciWebMenu;
+	    	webMenu.menuUlId = 'portal_menu_tree';
+	    	webMenu.menuClickListener = function(id,menuObject,isFav){
+	    		me.showFavImage(isFav);
+	    		me.showTabByMenu(id,menuObject);
+	    	};
+	    	me.webMenu = webMenu;
+	    	me.webMenu.init();
+	    	//5.澶勭悊鐗堟潈淇℃伅
+	    	if(me.mainConfig.isShowVersion && $webUtil.isNotNull(me.mainConfig.versionInfo)){
+	    		me.portalFooter.html("漏鐗堟潈淇℃伅 - " +me.mainConfig.versionInfo.trim() );
+	    		me.portalFooter.show();
+	    	}else{
+	    		me.portalFooter.remove();
+	    		me.portalBody.css("bottom","0px");
+	    	}
+	    	//6.澶勭悊棣栭〉
+			if(!me.mainConfig || $webUtil.isNull(me.mainConfig.indexPageModel)){
+				if(!me.mainConfig){
+					me.mainConfig = {
+						indexPageModel:"portal/vciDefaultIndex"
+					}
+				}else{
+					me.mainConfig.indexPageModel = "portal/vciDefaultIndex";
+				}
+			}
+			layui.use([me.mainConfig.indexPageModel], function () {
+				var index = layui[me.mainConfig.indexPageModel];
+				$("#vciPortalIndexContent").html(index.getContent());
+				index.init();
+			});
+
+	    	//7.缁戝畾鎵�鏈夌殑浜嬩欢锛屽苟鏄剧ず鍐呭
+	    	me.buildAllListener();
+	    	me.portalDiv.show();
+	    	var element = layui.element;
+	    	element.init();//鍒锋柊鎵�鏈夌殑鍏冪礌
+	    	element.on('tabDelete(' + me.tabPanelFilter + ')',function(data){
+	    		var id = $(this).parent().attr("lay-id");
+	    		if(me.allAddedTab && me.allAddedTab[id] && me.allAddedTab[id].instanceObject){//璋冪敤閿�姣佷簨浠�
+	    			try{
+	    				me.allAddedTab[id].instanceObject.destory();
+	    			}catch(e){
+	    			}
+	    		}
+	    		delete me.allAddedTab[id];
+	    	});
+	    	me.element = element;
+	    	//璁剧疆鍥哄畾鍧�
+            var util = layui.util;
+
+            //鎵ц
+            util.fixbar({
+            });
+
+            // layui.use(['vciWebCheckSession'],function(){
+             //    var vciWebCheckSession = layui.vciWebCheckSession;
+             //    vciWebCheckSession.init();
+			// });
+			/*layui.use(['vciWebReminder'],function(){
+				var vciWebReminder = layui.vciWebReminder;
+				vciWebReminder.init()
+			})*/
+	    },
+	    createLogoInfoHtml:function(){
+	    	//璁剧疆LOGO鍖哄煙
+	    	var me = this;
+	    	var html = '<a href="javascript:;">';
+	    	if($webUtil.isNotNull(me.mainConfig.companyLogo)){
+	    		html+='<img src="' + me.mainConfig.companyLogo + '" class="logoimg" style="width:' + me.mainConfig.leftMenuWidth + 'px;object-fit: cover;"/>';
+	    	}
+	    	return html + "</a>";
+	    },
+        createToolHtml:function(){
+	    	var me = this;
+	    	var lis = [];
+            lis.push('<li class="layui-nav-item"><a href="javascript:;" lay-portal-event="swapMenu" title="鑿滃崟浼哥缉"><i class="layui-icon ' + me.mainConfig.menuClass + '" style="font-size:' + me.mainConfig.iconFontSize + '"></i></a></li>');
+            lis.push('<li class="layui-nav-item"><a href="javascript:;" lay-portal-event="refresh" title="鍒锋柊椤甸潰"><i class="layui-icon ' + me.mainConfig.refreshClass + '" style="font-size:' +  me.mainConfig.iconFontSize  + '"></i></a></li>');
+            if(me.mainConfig.isShowSearch == "true" || me.mainConfig.isShowSearch == true){
+                lis.push('<li class="layui-nav-item"><input type="text" placeholder="鎼滅储...." autocomplete="off" class="layui-input layui-input-search" lay-portal-event="seach" /></li>');
+			}
+			return lis.join('');
+		},
+	    createPersonInfoHtml:function(){
+	    	//鍒涘缓涓汉涓績閮ㄥ垎鐨刪tml浠g爜
+	    	//  澶村儚 浜哄悕
+	    	//  鐐瑰嚮鍚庡嚭鐜拌缃彍鍗�
+	    	var me = this;
+	    	var html = '';
+			//鐪嬫澘
+			if(me.mainConfig.isShowWatch == "true" || me.mainConfig.isShowWatch == true){
+            	html += '<li class="layui-nav-item"><a href="javascript:;" lay-portal-event="portal"><i class="layui-icon layui-icon-chart-screen" style="font-size:' + me.mainConfig.iconFontSize + '"></i>' +
+				'</a></li>';
+			}
+			//娑堟伅涓暟
+			html += '<li class="layui-nav-item"><a href="javascript:;" lay-portal-event="msgcenter"><i class="layui-icon ' + me.mainConfig.msgClass + '" style="font-size:' + me.mainConfig.iconFontSize + '"></i>' +
+					'<span class="layui-badge-dot" id="portal_msgcount_star"></span></a></li>';
+			//鏀惰棌鍥炬爣
+			//html += '<li class="layui-nav-item"><a href="javascript:;" id="portal_fav" lay-portal-event="fav"><i class="layui-icon ' + me.mainConfig.unFavClass + '" style="font-size:' + me.mainConfig.iconFontSize+ '"></i></a></li>';
+			//鍒囨崲涓婚
+			if(me.mainConfig.isShowTheme == "true" || me.mainConfig.isSHowTheme == true){
+                html += '<li class="layui-nav-item">' +
+                    '<a href="javascript:;" lay-portal-event="changeTheme"><i class="layui-icon ' + me.mainConfig.themeClass + '" style="font-size: ' + me.mainConfig.iconFontSize +'"></i></a></li>';
+            }
+            html += '<li class="layui-nav-item"><a href="javascript:;" lay-portal-event="swapScreen"><i class="layui-icon ' + me.mainConfig.fullClass + '" style="font-size:' + me.mainConfig.iconFontSize + '"></i></a></li>';
+			html += '<li class="layui-nav-item">' +
+					'<a href="javascript:;">';
+					if(me.mainConfig.userCenterSrc.indexOf(".")>-1){//澶村儚,璇存槑浣跨敤鐨勫浘鐗�
+						html += '<img src="' + me.mainConfig.userCenterSrc + '" class="layui-nav-img"/>';
+					}else{
+						html += '<i class="layui-icon ' + me.mainConfig.userCenterSrc +'" style="font-size:' + (me.mainConfig.iconFontSize?me.mainConfig.iconFontSize:'16px') + '"></i>';
+					}
+					var showUserName = me.sessionInfo.userName && me.sessionInfo.userName.trim();
+					if(me.sessionInfo.personName && showUserName !=me.sessionInfo.personName.trim()){
+						showUserName += "(" +  me.sessionInfo.personName.trim() + ")"
+					}
+					html += showUserName + '</a>';
+			var onlineUser = "";
+			if($webUtil.getCurrentUserId() == "sysAdmin"){
+				onlineUser =  '<dd><a href="javascript:;" id="portal_onlineUser" lay-portal-event="onlineUser">鍦ㄧ嚎鐢ㄦ埛</a></dd>' ;
+			}
+	    	html += '<dl class="layui-nav-child">' +
+	    	           //'<dd><a href="javascript:;" id="portal_person_info" lay-portal-event="personinfo">鍩烘湰璧勬枡</a></dd>' +
+	    	           //'<dd><a href="javascript:;" id="portal_lockwindow" lay-portal-event="lockWindow">閿佸畾绐楀彛</a></dd>' +
+	    	           '<dd><a href="javascript:;" id="portal_changepwd" lay-portal-event="changepdw">淇敼瀵嗙爜</a></dd>' +
+						onlineUser +
+				       '<dd><a href="javascript:;" id="portal_workflowproxy" lay-portal-event="proProxy">娴佺▼浠g悊</a></dd>' +
+				       '<dd><a href="javascript:;" id="portal_install" lay-portal-event="install">浣跨敤鍜屽畨瑁呭府鍔�</a></dd>' +
+				       '<dd><a href="javascript:;" id="portal_logout" lay-portal-event="logout">閫�鍑�</a></dd>' +
+	    	         '</dl>';
+	    	html += '</li>';
+	        return html;
+	    },
+	    buildAllListener:function(){
+	    	var me = this;
+	    	$("[lay-portal-event]").click(function(){
+	    		var event = $(this).attr("lay-portal-event");
+	    		if(!event){
+	    			event = $(this).parent().attr("lay-portal-event");
+				}
+				if(event && me[event]){
+                    me[event]();
+				}
+			});
+	    },
+        swapScreen:function(){
+	       //鍒囨崲灞忓箷
+		   var me = this;
+		   if(me.fullscreen){
+		   	   //鎭㈠
+               if(typeof window.ActiveXObject != "undefined")  {
+                   //杩欑殑鏂规硶 妯℃嫙f11閿紝浣挎祻瑙堝櫒鍏ㄥ睆
+                   var wscript = new ActiveXObject("WScript.Shell");
+                   if(wscript != null) {
+                       wscript.SendKeys("{F11}");
+                   }
+               }else{
+                   if (document.exitFullscreen) {
+                       document.exitFullscreen();
+                   }
+                   else if (document.mozCancelFullScreen) {
+                       document.mozCancelFullScreen();
+                   }
+                   else if (document.webkitCancelFullScreen) {
+                       document.webkitCancelFullScreen();
+                   }
+                   else if (document.msExitFullscreen) {
+                       document.msExitFullscreen();
+                   }
+                   if(typeof cfs != "undefined" && cfs) {
+                       cfs.call(el);
+                   }
+			   }
+               $("[lay-portal-event='swapScreen'] i").addClass(me.mainConfig.fullClass);
+               $("[lay-portal-event='swapScreen'] i").removeClass(me.mainConfig.restoreClass);
+			   me.fullscreen = false;
+		   }else{
+		   	   //鍏ㄥ睆
+               var el = document.documentElement;
+               var rfs = el.requestFullScreen || el.webkitRequestFullScreen || el.mozRequestFullScreen || el.msRequestFullscreen;
+               if(typeof window.ActiveXObject != "undefined")  {
+                   //杩欑殑鏂规硶 妯℃嫙f11閿紝浣挎祻瑙堝櫒鍏ㄥ睆
+                   var wscript = new ActiveXObject("WScript.Shell");
+                   if(wscript != null) {
+                       wscript.SendKeys("{F11}");
+                   }
+               }else if(typeof rfs != "undefined" && rfs){
+                   rfs.call(el);
+               }
+               $("[lay-portal-event='swapScreen'] i").removeClass(me.mainConfig.fullClass);
+               $("[lay-portal-event='swapScreen'] i").addClass(me.mainConfig.restoreClass);
+               me.fullscreen = true;
+		   }
+		},
+        swapMenu:function(){//鍒囨崲鑿滃崟
+			var me = this;
+			if(me.menuStyle == "normal"){
+				//瑕佹渶灏忓寲
+				me.minMenu();
+			}else{
+                me.maxMenu();
+			}
+		},
+		maxMenu:function(){
+        	var me = this;
+						$("#portal .layui-side-menu span").show();
+						$("#portal_menu").removeClass("sidebarHover");
+						$(".side-hover dl").hide();
+            $(".layui-logo img").attr("src",me.mainConfig.companyLogo);
+            if(me.menuChangeWidthEl){
+            	layui.each(me.menuChangeWidthEl,function(_index,_item){
+            		$(_item).css("width",me.mainConfig.leftMenuWidth);
+				});
+			}
+			if(me.menuChangeLeftEl){
+                layui.each(me.menuChangeLeftEl,function(_index,_item){
+                    $(_item).css("left",me.mainConfig.leftMenuWidth);
+                });
+			}
+            $("[lay-portal-event='swapMenu'] i").addClass(me.mainConfig.menuClass);
+            $("[lay-portal-event='swapMenu'] i").removeClass(me.mainConfig.menuMinClass);
+            me.menuStyle = "normal";
+		},
+		minMenu:function(){
+			var me = this;
+						$("#portal .layui-side-menu span").hide();
+						$("#portal_menu").addClass("sidebarHover");
+						$(".layui-nav-item").siblings().removeClass("layui-nav-itemed")
+            $(".layui-logo img").attr("src",me.mainConfig.companyMinLogo);
+            if(me.menuChangeWidthEl){
+                layui.each(me.menuChangeWidthEl,function(_index,_item){
+                    $(_item).css("width",me.mainConfig.leftMenuMinWidth);
+
+                });
+            }
+            if(me.menuChangeLeftEl){
+                layui.each(me.menuChangeLeftEl,function(_index,_item){
+                    $(_item).css("left",me.mainConfig.leftMenuMinWidth);
+                });
+            }
+            $("[lay-portal-event='swapMenu'] i").removeClass(me.mainConfig.menuClass);
+            $("[lay-portal-event='swapMenu'] i").addClass(me.mainConfig.menuMinClass);
+            me.menuStyle = "min";
+		},
+		fav:function () {
+			var me =this;
+            me.webMenu.changeFav(function(isFav){
+                me.showFavImage(!isFav);
+            });
+        },
+        relogin:function(callback){
+	    	//閲嶆柊鐧诲綍
+            var me =this;
+            $webUtil.copyConfig(me,me.moduleKey);
+            var formHtml = '<form id="form_' + me.id + '_relogin" lay-filter="' + me.id + '_relogin" class="layui-form" ></form>';
+            var form = layui.form;
+            var btn=['鐧诲綍','鍙栨秷'];
+            var height =200;
+            var thisindex = layer.open({
+                type:1,
+                title:'杈撳叆瀵嗙爜閲嶆柊鐧诲綍',
+                btn:btn,
+                skin:'layui-layer-lan',
+                content:formHtml,
+                area:['350px',height+'px'],
+                btnAlign:'r',
+                closeBtn:0,
+                shade:true,
+                resize:false,
+                success:function(layero){
+                    var formItems = [];
+                    formItems.push({
+                        type:'password',
+                        name:'password',
+                        text:'璇疯緭鍏ュ瘑鐮�'
+                    });
+                    form.addItems(me.id+"_relogin",formItems,function(){},me.sourceData,{defaultColumnOneRow:1});
+                    $("#form_" + me.id + "_relogin").keydown(function(e){
+                    	if(e.keyCode == 13){
+                    		$(this).parent().parent().find(".layui-layer-btn0").click();
+						}
+						layui.stope(e);
+					});
+                },
+                yes:function(index,layero){
+                    //鍏堥獙璇�
+                    if(form.validata(me.id + "_relogin")){
+                        var values = form.getValues(me.id + "_relogin");
+                        browserInfo = checkBrowser();
+                        var loginData = {
+                            userid : $webUtil.getCurrentUserId(),
+                            password : values['password'],
+                            isForceLogin : true,
+                            browser:browserInfo.browser,
+                            browserversion:browserInfo.browserversion,
+                            osversion: browserInfo.osversion
+                        };
+                        $webUtil.post(me.loginUrl,loginData,function(result){
+							if(result == undefined || result == null){
+								$webUtil.showErrorMsg("鐧诲綍鍑虹幇浜嗛敊璇�!璇锋煡鐪嬫湇鍔″櫒鏄惁寮�鍚�");
+							}
+							if (result.success){
+								//杩橀渶瑕佸埛鏂拌彍鍗曪紝鍚﹀垯娌℃湁鏉冮檺
+                                me.webMenu.init();
+								$webUtil.showAutoMsg("鐧诲綍鎴愬姛锛岀瓑鍒板乏渚у姛鑳借彍鍗曞埛鏂板畬鎴愬悗鎮ㄥ氨鍙互缁х画浣跨敤鏈郴缁�");
+								layer.close(index);
+								if(callback){
+                                    callback();
+								}
+							}else {
+								$webUtil.showErrorMsg(result.msg);
+							}
+                        });
+                    }
+                },
+                btn2:function(index,layero){
+                    window.location.href=projectName + "index.html";
+                }
+            });
+		},
+        changepdw:function(isMustChange,callback){
+			var me =this;
+            $webUtil.copyConfig(me,me.moduleKey);
+            var formHtml = '<form id="form_' + me.id + '_changepdw" lay-filter="' + me.id + '_changepdw" class="layui-form" ></form>';
+            var form = layui.form;
+            var btn=['淇敼','鍙栨秷'];
+            var height =280;
+            if(isMustChange){
+                height = 320;
+			}
+            var thisindex = layer.open({
+                type:1,
+                title:'淇敼瀵嗙爜',
+                btn:btn,
+                skin:'layui-layer-lan',
+                content:formHtml,
+                area:['350px',height+'px'],
+                btnAlign:'r',
+                closeBtn:0,
+                shade:true,
+                resize:false,
+                success:function(layero){
+                	var formItems = [];
+                	if(isMustChange){
+                        formItems.push({
+                            type:'word',
+                            name:'label',
+                            text:'鎮ㄧ殑瀵嗙爜宸茬粡杩囨湡,璇风珛鍗虫洿鏀瑰瘑鐮�',
+							labelWidth:340,
+                            titleAlign:'center'
+                        });
+					}
+                    formItems.push({
+                        type:'password',
+                        name:'password',
+                        text:'褰撳墠瀵嗙爜',
+                        required:true
+                    });
+                    formItems.push({
+                        type:'password',
+                        name:'password',
+                        text:'鏂板瘑鐮�',
+                        required:true
+                    });
+                    formItems.push({
+                        type:'password',
+                        name:'confirmPassword',
+                        text:'纭瀵嗙爜',
+                        required:true
+                    });
+                    form.addItems(me.id+"_changepdw",formItems,function(){},me.sourceData,{defaultColumnOneRow:1});
+				},
+                yes:function(index,layero){
+                    //鍏堥獙璇�
+                    if(form.validata()){
+						var values = form.getValues(me.id + "_changepdw");
+						values.userOid = $webUtil.getCurrentUserOid();
+                        $webUtil.ajax('post','/userQueryController/changePassword',values,function(result){
+                            if(result.success){
+                            	$webUtil.showMsg("淇敼瀵嗙爜鎴愬姛",function(){
+                                    if(callback){
+                                        callback();
+                                    }
+								});
+								layer.close(thisindex);
+
+                            }else{
+                                $webUtil.showErrorMsg(result.msg);
+                            }
+						},function(xhr,err){
+                            $webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },configData.frameworkPath);
+                    }
+                },
+				btn2:function(index,layero){
+                	if(isMustChange){
+                		$webUtil.showConfirmMsg("鎮ㄧ殑瀵嗙爜宸茬粡杩囨湡锛屼綘蹇呴』淇敼鍚庢墠鑳戒娇鐢ㄦ湰绯荤粺锛屽鏋滃彇娑堝皢浼氳繑鍥炵櫥褰曢〉闈�,鏄惁缁х画?",function (index){
+                			me.logout(true);
+						},function(){
+
+						});
+					}else {
+                        layer.close(index);
+                    }
+				}
+            });
+		},
+		install:function(){
+	    	var me = this;
+	    	$webUtil.dialog({
+				type: 2,
+				fullScreen:true,
+				content:(me.mainConfig.installHtml)?me.mainConfig.installHtml:"install.html",
+				title:'浣跨敤鍜屽畨瑁呰鏄�'
+			});
+		},
+        proProxy:function(){
+	    	//娴佺▼浠g悊
+			var me = this;
+            var menuObject = {
+                id:'workflowProxy',
+                text:'娴佺▼浠g悊璁剧疆',
+                bsUrl:'USEJS://process/vciWebProProxy',
+                notAllowFav:true
+            };
+            me.showTabByMenu("workflowProxy",menuObject);
+		},
+		onlineUser:function(){
+			//鍦ㄧ嚎鐢ㄦ埛鍒楄〃
+			var me = this;
+			var menuObject = {
+				id:'vciWebOnlineUser',
+				text:'鍦ㄧ嚎鐢ㄦ埛鍒楄〃',
+				bsUrl:'USEJS://framework/vciWebOnlineUser',
+				notAllowFav:true
+			};
+			me.showTabByMenu("vciWebOnlineUser",menuObject);
+		},
+	    logout:function(isIgnore){
+        	if(isIgnore){
+                $webUtil.post(configData.logoutUrl,{},function(result){
+                    //鏃犺鎴愬姛涓庡惁閮介渶瑕佽烦杞簡
+					$.removeCookie('AuthorizationToken',{path:"/"});
+                    window.location.href = projectName + "index.html";
+                },function (err,xhr) {
+					$.removeCookie('AuthorizationToken',{path:"/"});
+					window.location.href = projectName + "index.html";
+				});
+			}else {
+                $webUtil.showConfirmMsg('鎮ㄧ‘瀹氳閫�鍑虹郴缁熷悧', function (index) {
+                    $webUtil.post(configData.logoutUrl, {}, function (result) {
+                        //鏃犺鎴愬姛涓庡惁閮介渶瑕佽烦杞簡
+						$.removeCookie('AuthorizationToken',{path:"/"});
+                        window.location.href = projectName + "index.html";
+                    },function (err,xhr) {
+						$.removeCookie('AuthorizationToken',{path:"/"});
+						window.location.href = projectName + "index.html";
+					});
+                });
+            }
+	    },
+	    showFavImage:function(isFav){
+	    	var me = this;
+            if(isFav){
+            	$("#portal_fav i").removeClass(me.mainConfig.unFavClass);
+                $("#portal_fav i").addClass(me.mainConfig.favClass);
+            }else{
+                $("#portal_fav i").removeClass(me.mainConfig.favClass);
+                $("#portal_fav i").addClass(me.mainConfig.unFavClass);
+			}
+	    },
+	    lockWindow:function(){//閿佸畾绐楀彛锛屽繀椤讳娇鐢ㄥ瘑鐮佹墠鑳借В閿�
+	    	var me = this;
+	    	var windowHtml = '<form class="layui-form" lay-filter="vciPortalLockWindow">' +
+	    	                    '<div class="layui-form-item" style="width:350px;margin-top:15px;">' +
+	    	                       '<label class="layui-form-label layui-field-required" style="width:140px;">璇疯緭鍏ュ瘑鐮佹潵瑙i攣:</label>' +
+	    	                       '<div class="layui-input-inline" style="width:170px">' +
+	    	                          '<input type="password" name="password" required lay-verify="required" placeholder="璇疯緭鍏ュ瘑鐮�" autocomplete="off" class="layui-input "/>' +
+	    	                       '</div>' +
+	    	                     '</div>' +
+	    	                  '</form>';
+	    	var thisindex = layer.open({
+	    		type:1,
+	    		title:'閿佸畾绐楀彛',
+	    		btn:['瑙i攣'],
+	    		skin:'layui-layer-lan',
+	    		content:windowHtml,
+	    		area:['350px','200px'],
+	    		btnAlign:'r',
+	    		closeBtn:0,
+	    		shade:true,
+				shadeClose:false,
+	    		resize:false,
+	    		yes:function(index,layero){
+	    			var form = layui.form;
+	    	    	//鍏堥獙璇�
+	    	    	if(form.validata()){
+	    	    		var values = form.getValues('vciPortalLockWindow');
+	    	    		$webUtil.post('/webUserController/checkPassword',values,function(result){
+	    	    			if(result.success){
+	    	    				layer.close(thisindex);
+	    	    			}else{
+	    	    				$webUtil.showErrorMsg(result.msg);
+	    	    			}
+	    	    		});
+	    	    	}
+	    		}
+	    	});
+	    },
+	    showTabByMenu:function(id,menuObject){
+	    	var me = this;
+	    	if(!me.allAddedTab){
+	    		me.allAddedTab = {};
+	    	}
+	    	var isAdded = false;
+	    	for(var key in me.allAddedTab){
+	    		if(key == id){
+	    			isAdded = true;
+	    			break;
+	    		}
+	    	}
+	    	if(!isAdded){
+	    		if(!menuObject){
+	    			menuObject = me.webMenu.getMenuObjectById(id);
+	    		}
+	    		var url = menuObject.bsUrl || menuObject.url || menuObject.href;
+                if($webUtil.isNull(url)) {
+					return ;
+				}
+				var urlUp = url.toUpperCase();
+	    		if($webUtil.startWith(urlUp,"USEJS:")){
+	    			//璇存槑鏄娇鐢╦s缁勪欢
+	    			var trueUrl = url.substring(6);
+	    			if($webUtil.startWith(trueUrl,"//")){
+	    				trueUrl = trueUrl.substring(2);
+					}
+	    			var sourceData = {};
+                    sourceData['functionId'] = id;
+					me.wrapperSourceDataByUrl(trueUrl,sourceData);
+                    if(menuObject && menuObject.initSourceData){
+                        for(var key in menuObject.initSourceData){
+                            sourceData[key] = menuObject.initSourceData[key];
+                        }
+                    }
+                    if(trueUrl.indexOf("?")>-1) {
+						trueUrl = trueUrl.substring(0, trueUrl.indexOf("?"));
+					}
+					trueUrl=trueUrl.replace(/^\/+/,'');
+	    			layui.use([trueUrl],function(){
+						var newTabClass = layui[trueUrl];
+		    			newTabClass.id = id;
+						newTabClass.sourceData = sourceData;
+						if(menuObject.multiCompent){
+							newTabClass.multiCompent = menuObject.multiCompent;
+						}
+		    			me.element.tabAdd(me.tabPanelFilter,{
+		    				title:menuObject.text,
+		    				id:id,
+		    				item:newTabClass
+		    			});
+		    			me.element.tabChange(me.tabPanelFilter,id);
+		    			menuObject.instanceObject = newTabClass;
+		    		});
+	    		}else if( $webUtil.startWith(urlUp,"OPEN:")){
+	    			window.open(url,id,'fullscreen=yes');
+	    			//璇存槑鏄脊鍑虹獥鍙�
+	    		}else if($webUtil.startWith(urlUp,"UI://")
+				|| $webUtil.startWith(url.toUpperCase(),"PLM.UIF.ENGINE.CLIENT.UILAYOUTPANEL?")){
+					//璇存槑鏄疷I涓婁笅鏂囩殑瀹氫箟
+					var type = "";
+					var content = "";
+					var sourceData = {};
+					var trueUrl = "";
+					sourceData['functionId'] = id;
+					sourceData['sourceDataMap']={};
+					if($webUtil.startWith(urlUp,"UI://")){
+						trueUrl = url;
+						//UI://type#content?param=xxx
+						if(trueUrl.indexOf("?") > -1){
+							var temp = trueUrl.substring(3,trueUrl.indexOf("?"));
+							if(temp.indexOf("#") < 0){
+								$webUtil.showErrorMsg("璇疯仈绯荤鐞嗗憳锛岃繖涓彍鍗曠殑鍦板潃鏍煎紡涓嶆纭�傚簲璇ユ槸UI://type#content?param=xxx杩欑褰㈠紡");
+								return;
+							}
+							type = temp.split("#")[0];
+							content = temp.split("#")[1];
+						}else{
+							var temp = trueUrl.substring("UI://".length);
+							if(temp.indexOf("#") < 0){
+								$webUtil.showErrorMsg("璇疯仈绯荤鐞嗗憳锛岃繖涓彍鍗曠殑鍦板潃鏍煎紡涓嶆纭�傚簲璇ユ槸UI://type#content?param=xxx杩欑褰㈠紡");
+								return;
+							}
+							type = temp.split("#")[0];
+							content = temp.split("#")[1];
+						}
+					}else{
+						trueUrl = url;
+						//plm.uif.engine.client.UILayoutPanel?type=batchtask&context=batchtaskManagementExp
+						if(trueUrl.indexOf("?") <0){
+							$webUtil.showErrorMsg("璇疯仈绯荤鐞嗗憳锛岃繖涓彍鍗曠殑鍦板潃鏍煎紡涓嶆纭�傛帹鑽愪娇鐢║I://type#content?param=xxx杩欑褰㈠紡");
+							return;
+						}
+						var temp = trueUrl.split("?")[1];
+						var paramsArray = temp.split("&");
+						for(var i = 0 ; i < paramsArray.length ; i ++){
+							var preParam =paramsArray[i].split("=");
+							if(preParam[0] == 'type'){
+								type = preParam[1];
+							}else	if(preParam[0] == 'context' ){
+								content = preParam[1];
+							}else{
+								sourceData['sourceDataMap'][preParam[0]]=preParam[1]
+							}
+						}
+					}
+					me.wrapperSourceDataByUrl(trueUrl,sourceData.sourceDataMap);
+					if(menuObject && menuObject.initSourceData){
+						for(var key in menuObject.initSourceData){
+							sourceData['sourceDataMap'][key] = menuObject.initSourceData[key];
+						}
+					}
+					sourceData['btmType'] = type;
+					sourceData['content'] = content;
+					layui.use('platform/objectService/VciUIContentViewer',function () {
+						var newTabClass = layui['platform/objectService/VciUIContentViewer'];
+						newTabClass.id = id;
+						newTabClass.multiCompent = true;
+						newTabClass.sourceData = sourceData;
+						me.element.tabAdd(me.tabPanelFilter,{
+							title:menuObject.text,
+							id:id,
+							item:newTabClass
+						});
+						me.element.tabChange(me.tabPanelFilter,id);
+						menuObject.instanceObject = newTabClass;
+					});
+				}else if($webUtil.isNotNull(url) ){
+	    			//閾炬帴缃戦〉
+	    			me.element.tabAdd(me.tabPanelFilter,{
+	    				title:menuObject.text,
+	    				id:id,
+	    				href:url
+	    			});
+	    			me.element.tabChange(me.tabPanelFilter,id);
+	    		}else{
+                    return;
+                }
+	    		me.allAddedTab[id] = menuObject;
+	    	}else{
+	    		me.element.tabChange(me.tabPanelFilter,id);//鑷姩閫夋嫨杩欎釜閫夐」鍗�
+	    	}
+            if(menuObject.notAllowFav == true){
+                me.webMenu.currentMenuId = "";
+            }
+	    },
+		wrapperSourceDataByUrl : function(trueUrl,sourceData){
+			if(trueUrl.indexOf("?") > -1){//璇存槑鏈夊弬鏁�
+				var params = trueUrl.substring(trueUrl.indexOf("?")+1);
+				var paramsArray = params.split("&");
+				for(var i = 0 ; i < paramsArray.length ; i ++){
+					var preParam =paramsArray[i].split("=");
+					sourceData[preParam[0]] = preParam[1];
+				}
+			}
+		},
+        refresh:function(){
+			layui.table.reload('table_vciProcessUndoTask_vciDefaultIndex_protask_1');
+	    	layui.each(this.allAddedTab,function (i,tab){
+				tab.instanceObject.refreshAll()
+			})
+		},
+		msgcenter:function(){
+			$("#portal_msgcount_star").hide();
+			//娑堟伅涓績
+			var me = this;
+			var menuObject = {
+				id:'messageCenter',
+				text:'娑堟伅涓績',
+				bsUrl:'USEJS://messages/vciWebMessage',
+				notAllowFav:true
+			};
+			portal.showTabByMenu("messageCenter",menuObject);
+		},
+        portal:function(){
+	    	var that = this;
+			var portalUrl = "url1";//闈炲伐浜�
+			var rolesname = $webUtil.getRolesName();
+			layui.each(rolesname,function(_index,_item){
+				if(_item == "宸ヤ汉"){
+					portalUrl = "url2"
+				}
+			});
+			window.open("portalUrl");
+		}
+
+	};
+	exports('vciWebPortal',portal);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebPortalDojoUI.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebPortalDojoUI.js
new file mode 100644
index 0000000..3139555
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebPortalDojoUI.js
@@ -0,0 +1,812 @@
+layui.define(['layer','form','element','vciWebMenu','util'],//鏁扮粍閲屾槸闇�瑕佷娇鐢ㄧ殑layui鐨勭粍浠�
+    function(exports){
+        /**
+         * 涓婚〉锛屽寘鍚寳鍖恒�佽タ鍖恒�佷腑闂村尯鍩熷拰鍗楀尯
+         * @author wangting@2022-1-4
+         */
+        var portal = {
+            sessionInfo:{},
+            themeName:'default',
+            moduleKey:'vciWebPortalDojoUI',
+            downloadFileUUID:[],
+            mainConfig:{
+                indexPageModel:"",
+                //娉ㄦ剰锛岃繖閲岀殑閰嶇疆浼氳鏇存敼
+                leftMenuWidth:"220",//宸︿晶鑿滃崟鐨勫搴�
+                leftMenuMinWidth:'40',//宸︿晶鑿滃崟鐨勬渶灏忓搴�
+                //鍖楀尯鐩稿叧鐨勯厤缃�
+                companyLogo:"",//LOGO鍖哄煙璺緞
+                companyMinLogo:"",//LOGO鍖哄煙鐨勭缉鐣ュ浘
+                //鍔熻兘鍥炬爣
+                menuMinClass:'layui-icon-spread-left',//鑿滃崟鏈�灏忔樉绀�
+                menuClass:'layui-icon-shrink-right',//鑿滃崟姝e父鏄剧ず
+                refreshClass:'layui-icon-refresh',//鍒锋柊鎸夐挳
+                isShowSearch:false,//鏄惁鏄剧ず鍏ㄦ枃妫�绱�
+                isShowTheme:false,//鏄惁鍙互鍒囨崲涓婚
+                searchUrl:'',//鍏ㄦ枃妫�绱㈡墽琛岃矾寰�
+                msgClass:'layui-icon-reply-fill',//娑堟伅涓績鏍峰紡
+                themeClass:'layui-icon-theme',//涓婚鏍峰紡
+                noteClass:'layui-icon-note',//渚跨鏍峰紡
+                favClass:'layui-icon-star-fill',//鏀惰棌
+                unFavClass:'layui-icon-star',//鏈敹钘�
+                fullClass:'layui-icon-screen-full',//鍏ㄥ睆
+                restoreClass:'layui-icon-screen-restore',//鍏ㄥ睆鎭㈠
+                iconFontSize:"16px",//瀛椾綋鍥炬爣鐨勫瓧鍙峰ぇ灏�
+                userCenterSrc:"layui-icon-user",//鐢ㄦ埛澶村儚
+                //鐗堟潈鐨勪俊鎭�
+                isShowVersion:"false",//鏄惁鏄剧ず鐗堟湰淇℃伅
+                versionInfo:''//鐗堟湰淇℃伅
+            },
+            loginUrl:'/webUserController/login',
+            favStore:null,//鏀惰棌鐨勬墍鏈夊姛鑳�
+            portalDiv:null,
+            tabPanelFilter:'vciPortalTab',
+            menuStyle:'normal',//鑿滃崟鏄剧ず鐨勬牱寮弉ormal鍜宮in
+            menuChangeWidthEl:["#portal_menu"],//鑿滃崟瀹藉害鍙樻崲鐨勬椂鍊欒澶勭悊瀹藉害鐨勫厓绱�
+            menuChangeLeftEl:["#portal_body"],//鑿滃崟瀹藉害鍙樻崲鐨勬椂鍊欒澶勭悊left鐨勫厓绱�
+            init:function(){
+                //鍦ㄨ繖閲屾墽琛屽垵濮嬮〉闈�
+                //1.甯冨眬鏄湪椤甸潰涓婄洿鎺ュ畾涔夊ソ鐨�.浣嗘槸榛樿鏄殣钘忕殑锛屾墍浠ラ渶瑕佸悗闈㈡墽琛屾樉绀�
+                var me = this;
+                $webUtil.copyConfig(me,me.moduleKey);
+                var windowWidth=$('body').width()
+                if(windowWidth>configData.vciWebPortal.mainConfig.pageWidth1440){
+                    me.mainConfig.leftMenuWidth='220'
+                }else if(windowWidth>configData.vciWebPortal.mainConfig.pageWidth1280){
+                    me.mainConfig.leftMenuWidth='200'
+                }else {
+                    me.mainConfig.leftMenuWidth='180'
+                }
+                me.portalDiv = $("#portal");
+                me.portalLogoDiv = $("#portal_logo");
+                me.portalToolDiv = $("#portal_toolmenu");
+                me.portalPersonDiv = $("#portal_personArea");
+                me.portalBody = $("#portal_body");
+                me.portalFooter =$("#portal_footer");
+                if(!me.mainConfig.iconFontSize){
+                    me.mainConfig.iconFontSize = '16px';
+                }
+                //me.portalBody.css({'left':me.mainConfig.leftMenuWidth})
+                //2.璁剧疆logo鍖哄煙
+                var logoInfoHtml = me.createLogoInfoHtml();
+                if(configData.isLogo) {
+                    me.portalLogoDiv.html(logoInfoHtml);
+                }else if(configData.titleLogo){
+                    me.portalLogoDiv.html('<img src="'+configData.titleLogo+'" alt="'+configData.title+'" height="40">');
+                }else{
+                    me.portalLogoDiv.html(configData.title);
+                    if(configData.titleFontSize){
+                        me.portalLogoDiv.css('font-size',configData.titleFontSize+'px')
+                    }
+                }
+                var toolHtml = me.createToolHtml();
+                me.portalToolDiv.html(toolHtml);
+                //3.澶勭悊涓汉涓績
+                var personInfoHtml = me.createPersonInfoHtml();
+                me.portalPersonDiv.html(personInfoHtml);
+                //4.澶勭悊鑿滃崟
+                var webMenu = layui.vciWebMenu;
+                webMenu.menuUlId = 'portal_menu_tree';
+                webMenu.menuClickListener = function(id,menuObject,isFav){
+                    me.showFavImage(isFav);
+                    me.showTabByMenu(id,menuObject);
+                };
+                me.webMenu = webMenu;
+                me.webMenu.init();
+                //5.澶勭悊鐗堟潈淇℃伅
+                if(me.mainConfig.isShowVersion && $webUtil.isNotNull(me.mainConfig.versionInfo)){
+                    me.portalFooter.html("漏鐗堟潈淇℃伅 - " +me.mainConfig.versionInfo.trim() );
+                    me.portalFooter.show();
+                }else{
+                    me.portalFooter.remove();
+                    me.portalBody.css("bottom","0px");
+                }
+                //6.澶勭悊棣栭〉
+                if(!me.mainConfig || $webUtil.isNull(me.mainConfig.indexPageModel)){
+                    if(!me.mainConfig){
+                        me.mainConfig = {
+                            indexPageModel:"portal/vciDefaultIndex"
+                        }
+                    }else{
+                        me.mainConfig.indexPageModel = "portal/vciDefaultIndex";
+                    }
+                }
+                layui.use([me.mainConfig.indexPageModel], function () {
+                    var index = layui[me.mainConfig.indexPageModel];
+                    $("#vciPortalIndexContent").html(index.getContent());
+                    index.init();
+                });
+
+                //7.缁戝畾鎵�鏈夌殑浜嬩欢锛屽苟鏄剧ず鍐呭
+                me.buildAllListener();
+                me.portalDiv.show();
+                var element = layui.element;
+                element.init();//鍒锋柊鎵�鏈夌殑鍏冪礌
+                element.on('tabDelete(' + me.tabPanelFilter + ')',function(data){
+                    var id = $(this).parent().attr("lay-id");
+                    if(me.allAddedTab && me.allAddedTab[id] && me.allAddedTab[id].instanceObject){//璋冪敤閿�姣佷簨浠�
+                        try{
+                            me.allAddedTab[id].instanceObject.destory();
+                        }catch(e){
+                        }
+                    }
+                    delete me.allAddedTab[id];
+                });
+                me.element = element;
+                //璁剧疆鍥哄畾鍧�
+                var util = layui.util;
+
+                //鎵ц
+                util.fixbar({});
+
+                //easyui甯冨眬
+                $('#mainEasyuiLayout').layout();
+                // layui.use(['vciWebCheckSession'],function(){
+                //    var vciWebCheckSession = layui.vciWebCheckSession;
+                //    vciWebCheckSession.init();
+                // });
+                /*layui.use(['vciWebReminder'],function(){
+                    var vciWebReminder = layui.vciWebReminder;
+                    vciWebReminder.init()
+                })*/
+            },
+            createLogoInfoHtml:function(){
+                //璁剧疆LOGO鍖哄煙
+                var me = this;
+                var html = '<a href="javascript:;">';
+                if($webUtil.isNotNull(me.mainConfig.companyLogo)){
+                    html+='<img src="' + me.mainConfig.companyLogo + '" class="logoimg" style="width:' + me.mainConfig.leftMenuWidth + 'px;object-fit: cover;"/>';
+                }
+                return html + "</a>";
+            },
+            createToolHtml:function(){
+                var me = this;
+                var lis = [];
+                lis.push('<li class="layui-nav-item"><a href="javascript:;" lay-portal-event="swapMenu" title="鑿滃崟浼哥缉"><i class="layui-icon ' + me.mainConfig.menuClass + '" style="font-size:' + me.mainConfig.iconFontSize + '"></i></a></li>');
+                lis.push('<li class="layui-nav-item"><a href="javascript:;" lay-portal-event="refresh" title="鍒锋柊椤甸潰"><i class="layui-icon ' + me.mainConfig.refreshClass + '" style="font-size:' +  me.mainConfig.iconFontSize  + '"></i></a></li>');
+                if(me.mainConfig.isShowSearch == "true" || me.mainConfig.isShowSearch == true){
+                    lis.push('<li class="layui-nav-item"><input type="text" placeholder="鎼滅储...." autocomplete="off" class="layui-input layui-input-search" lay-portal-event="seach" /></li>');
+                }
+                return lis.join('');
+            },
+            createPersonInfoHtml:function(){
+                //鍒涘缓涓汉涓績閮ㄥ垎鐨刪tml浠g爜
+                //  澶村儚 浜哄悕
+                //  鐐瑰嚮鍚庡嚭鐜拌缃彍鍗�
+                var me = this;
+                var html = '';
+                //宸ヨ壓
+                if(me.mainConfig.isShowMpm == 'true' || me.mainConfig.isShowMpm == true){
+                    //html += '<li class="layui-nav-item"><a href="javascript:;" lay-portal-event="mpm"><i class="layui-icon layui-icon-windows" style="font-size:' + me.mainConfig.iconFontSize + '"></i></a></li>';
+                }
+                //鐪嬫澘
+                if(me.mainConfig.isShowWatch == "true" || me.mainConfig.isShowWatch == true){
+                    html += '<li class="layui-nav-item"><a href="javascript:;" lay-portal-event="portal"><i class="layui-icon layui-icon-chart-screen" style="font-size:' + me.mainConfig.iconFontSize + '"></i>' +
+                        '</a></li>';
+                }
+                //娑堟伅涓暟
+                //html += '<li class="layui-nav-item"><a href="javascript:;" lay-portal-event="msgcenter"><i class="layui-icon ' + me.mainConfig.msgClass + '" style="font-size:' + me.mainConfig.iconFontSize + '"></i><span class="layui-badge-dot" id="portal_msgcount_star"></span></a></li>';
+                //鏀惰棌鍥炬爣
+                //html += '<li class="layui-nav-item"><a href="javascript:;" id="portal_fav" lay-portal-event="fav"><i class="layui-icon ' + me.mainConfig.unFavClass + '" style="font-size:' + me.mainConfig.iconFontSize+ '"></i></a></li>';
+                //鍒囨崲涓婚
+                if(me.mainConfig.isShowTheme == "true" || me.mainConfig.isSHowTheme == true){
+                    html += '<li class="layui-nav-item">' +
+                        '<a href="javascript:;" lay-portal-event="changeTheme"><i class="layui-icon ' + me.mainConfig.themeClass + '" style="font-size: ' + me.mainConfig.iconFontSize +'"></i></a></li>';
+                }
+                //html += '<li class="layui-nav-item"><a href="javascript:;" lay-portal-event="swapScreen"><i class="layui-icon ' + me.mainConfig.fullClass + '" style="font-size:' + me.mainConfig.iconFontSize + '"></i></a></li>';
+                html += '<li class="layui-nav-item">' +
+                    '<a href="javascript:;">';
+                if(me.mainConfig.userCenterSrc.indexOf(".")>-1){//澶村儚,璇存槑浣跨敤鐨勫浘鐗�
+                    html += '<img src="' + me.mainConfig.userCenterSrc + '" class="layui-nav-img"/>';
+                }else{
+                    html += '<i class="layui-icon ' + me.mainConfig.userCenterSrc +'" style="font-size:' + (me.mainConfig.iconFontSize?me.mainConfig.iconFontSize:'16px') + '"></i> ';
+                }
+                var showUserName = me.sessionInfo.userName && me.sessionInfo.userName.trim();
+                if(me.sessionInfo.personName && showUserName !=me.sessionInfo.personName.trim()){
+                    showUserName += "(" +  me.sessionInfo.personName.trim() + ")"
+                }
+                html += showUserName + '</a>';
+                var onlineUser = "";
+                if($webUtil.getCurrentUserId() == "sysAdmin"){
+                    onlineUser =  '<dd><a href="javascript:;" id="portal_onlineUser" lay-portal-event="onlineUser">鍦ㄧ嚎鐢ㄦ埛</a></dd>' ;
+                }
+                html += '<dl class="layui-nav-child">' +
+                    //'<dd><a href="javascript:;" id="portal_person_info" lay-portal-event="personinfo">鍩烘湰璧勬枡</a></dd>' +
+                    //'<dd><a href="javascript:;" id="portal_lockwindow" lay-portal-event="lockWindow">閿佸畾绐楀彛</a></dd>' +
+                    '<dd><a href="javascript:;" id="portal_changepwd" lay-portal-event="changepdw">淇敼瀵嗙爜</a></dd>' +
+                    onlineUser +
+                    '<dd><a href="javascript:;" id="portal_workflowproxy" lay-portal-event="proProxy">娴佺▼浠g悊</a></dd>' +
+                    '<dd><a href="javascript:;" id="portal_install" lay-portal-event="install">浣跨敤鍜屽畨瑁呭府鍔�</a></dd>' +
+                    '<dd><a href="javascript:;" id="portal_logout" lay-portal-event="logout">閫�鍑�</a></dd>' +
+                    '</dl>';
+                html += '</li>';
+                return html;
+            },
+            buildAllListener:function(){
+                var me = this;
+                $("[lay-portal-event]").click(function(){
+                    var event = $(this).attr("lay-portal-event");
+                    if(!event){
+                        event = $(this).parent().attr("lay-portal-event");
+                    }
+                    if(event && me[event]){
+                        me[event]();
+                    }
+                });
+            },
+            swapScreen:function(){
+                //鍒囨崲灞忓箷
+                var me = this;
+                if(me.fullscreen){
+                    //鎭㈠
+                    if(typeof window.ActiveXObject != "undefined")  {
+                        //杩欑殑鏂规硶 妯℃嫙f11閿紝浣挎祻瑙堝櫒鍏ㄥ睆
+                        var wscript = new ActiveXObject("WScript.Shell");
+                        if(wscript != null) {
+                            wscript.SendKeys("{F11}");
+                        }
+                    }else{
+                        if (document.exitFullscreen) {
+                            document.exitFullscreen();
+                        }
+                        else if (document.mozCancelFullScreen) {
+                            document.mozCancelFullScreen();
+                        }
+                        else if (document.webkitCancelFullScreen) {
+                            document.webkitCancelFullScreen();
+                        }
+                        else if (document.msExitFullscreen) {
+                            document.msExitFullscreen();
+                        }
+                        if(typeof cfs != "undefined" && cfs) {
+                            cfs.call(el);
+                        }
+                    }
+                    $("[lay-portal-event='swapScreen'] i").addClass(me.mainConfig.fullClass);
+                    $("[lay-portal-event='swapScreen'] i").removeClass(me.mainConfig.restoreClass);
+                    me.fullscreen = false;
+                }else{
+                    //鍏ㄥ睆
+                    var el = document.documentElement;
+                    var rfs = el.requestFullScreen || el.webkitRequestFullScreen || el.mozRequestFullScreen || el.msRequestFullscreen;
+                    if(typeof window.ActiveXObject != "undefined")  {
+                        //杩欑殑鏂规硶 妯℃嫙f11閿紝浣挎祻瑙堝櫒鍏ㄥ睆
+                        var wscript = new ActiveXObject("WScript.Shell");
+                        if(wscript != null) {
+                            wscript.SendKeys("{F11}");
+                        }
+                    }else if(typeof rfs != "undefined" && rfs){
+                        rfs.call(el);
+                    }
+                    $("[lay-portal-event='swapScreen'] i").removeClass(me.mainConfig.fullClass);
+                    $("[lay-portal-event='swapScreen'] i").addClass(me.mainConfig.restoreClass);
+                    me.fullscreen = true;
+                }
+            },
+            swapMenu:function(){//鍒囨崲鑿滃崟
+                var me = this;
+                if(me.menuStyle == "normal"){
+                    //瑕佹渶灏忓寲
+                    me.minMenu();
+                }else{
+                    me.maxMenu();
+                }
+            },
+            maxMenu:function(){
+                var me = this;
+                //$('#mainEasyuiLayout').layout('expand','west');
+                //$("#portal .layui-side-menu span").show();
+                //$("#portal_menu").removeClass("sidebarHover");
+                //$(".side-hover dl").hide();
+                //$(".layui-logo img").attr("src",me.mainConfig.companyLogo);
+                if(me.menuChangeWidthEl){
+                    layui.each(me.menuChangeWidthEl,function(_index,_item){
+                        $(_item).css("width",me.mainConfig.leftMenuWidth-5)
+                        $(_item).parent('.layout-panel-west').css("width",me.mainConfig.leftMenuWidth);
+                    });
+                }
+                if(me.menuChangeLeftEl){
+                    layui.each(me.menuChangeLeftEl,function(_index,_item){
+                        var width=$('body').width()-10-me.mainConfig.leftMenuWidth;
+                        $(_item).css("width",width-5);
+                        $(_item).parent('.layout-panel-center').css({"width":width,'left':me.mainConfig.leftMenuWidth+'px'});
+                    })
+                }
+                $("[lay-portal-event='swapMenu'] i").addClass(me.mainConfig.menuClass);
+                $("[lay-portal-event='swapMenu'] i").removeClass(me.mainConfig.menuMinClass);
+                me.menuStyle = "normal";
+            },
+            minMenu:function(){
+                var me = this;
+                //$('#mainEasyuiLayout').layout('collapse','west');
+                //$("#portal .layui-side-menu span").hide();
+                //$("#portal_menu").addClass("sidebarHover");
+                //$(".layui-nav-item").siblings().removeClass("layui-nav-itemed")
+                //$(".layui-logo img").attr("src",me.mainConfig.companyMinLogo);
+                if(me.menuChangeWidthEl){
+                    layui.each(me.menuChangeWidthEl,function(_index,_item){
+                        $(_item).css("width",me.mainConfig.leftMenuMinWidth-5)
+                        $(_item).parent('.layout-panel-west').css("width",me.mainConfig.leftMenuMinWidth);
+
+                    });
+                }
+                if(me.menuChangeLeftEl){
+                    layui.each(me.menuChangeLeftEl,function(_index,_item){
+                        var width=$('body').width()-10-me.mainConfig.leftMenuMinWidth;
+                        $(_item).css("width",width-5);
+                        $(_item).parent('.layout-panel-center').css({"width":width,'left':me.mainConfig.leftMenuMinWidth+'px'});
+                    });
+                }
+                $("[lay-portal-event='swapMenu'] i").removeClass(me.mainConfig.menuClass);
+                $("[lay-portal-event='swapMenu'] i").addClass(me.mainConfig.menuMinClass);
+                me.menuStyle = "min";
+            },
+            fav:function () {
+                var me =this;
+                me.webMenu.changeFav(function(isFav){
+                    me.showFavImage(!isFav);
+                });
+            },
+            relogin:function(callback){
+                //閲嶆柊鐧诲綍
+                var me =this;
+                $webUtil.copyConfig(me,me.moduleKey);
+                var formHtml = '<form id="form_' + me.id + '_relogin" lay-filter="' + me.id + '_relogin" class="layui-form" ></form>';
+                var form = layui.form;
+                var btn=['鐧诲綍','鍙栨秷'];
+                var height =200;
+                var thisindex = layer.open({
+                    type:1,
+                    title:'杈撳叆瀵嗙爜閲嶆柊鐧诲綍',
+                    btn:btn,
+                    //skin:'layui-layer-lan',
+                    content:formHtml,
+                    area:['350px',height+'px'],
+                    btnAlign:'r',
+                    closeBtn:0,
+                    shade:true,
+                    resize:false,
+                    success:function(layero){
+                        var formItems = [];
+                        formItems.push({
+                            type:'password',
+                            name:'password',
+                            text:'璇疯緭鍏ュ瘑鐮�'
+                        });
+                        form.addItems(me.id+"_relogin",formItems,function(){},me.sourceData,{defaultColumnOneRow:1});
+                        $("#form_" + me.id + "_relogin").keydown(function(e){
+                            if(e.keyCode == 13){
+                                $(this).parent().parent().find(".layui-layer-btn0").click();
+                            }
+                            layui.stope(e);
+                        });
+                    },
+                    yes:function(index,layero){
+                        //鍏堥獙璇�
+                        if(form.validata(me.id + "_relogin")){
+                            var values = form.getValues(me.id + "_relogin");
+                            browserInfo = checkBrowser();
+                            var loginData = {
+                                userid : $webUtil.getCurrentUserId(),
+                                password : values['password'],
+                                isForceLogin : true,
+                                browser:browserInfo.browser,
+                                browserversion:browserInfo.browserversion,
+                                osversion: browserInfo.osversion
+                            };
+                            $webUtil.post(me.loginUrl,loginData,function(result){
+                                if(result == undefined || result == null){
+                                    $webUtil.showErrorMsg("鐧诲綍鍑虹幇浜嗛敊璇�!璇锋煡鐪嬫湇鍔″櫒鏄惁寮�鍚�");
+                                }
+                                if (result.success){
+                                    //杩橀渶瑕佸埛鏂拌彍鍗曪紝鍚﹀垯娌℃湁鏉冮檺
+                                    me.webMenu.init();
+                                    $webUtil.showAutoMsg("鐧诲綍鎴愬姛锛岀瓑鍒板乏渚у姛鑳借彍鍗曞埛鏂板畬鎴愬悗鎮ㄥ氨鍙互缁х画浣跨敤鏈郴缁�");
+                                    layer.close(index);
+                                    if(callback){
+                                        callback();
+                                    }
+                                }else {
+                                    $webUtil.showErrorMsg(result.msg);
+                                }
+                            });
+                        }
+                    },
+                    btn2:function(index,layero){
+                        window.location.href=projectName + "index.html";
+                    }
+                });
+            },
+            changepdw:function(isMustChange,callback){
+                var me =this;
+                $webUtil.copyConfig(me,me.moduleKey);
+                var formHtml = '<form id="form_' + me.id + '_changepdw" lay-filter="' + me.id + '_changepdw" class="layui-form" ></form>';
+                var form = layui.form;
+                var btn=['淇敼','鍙栨秷'];
+                var height =280;
+                if(isMustChange){
+                    height = 320;
+                }
+                var thisindex = layer.open({
+                    type:1,
+                    title:'淇敼瀵嗙爜',
+                    btn:btn,
+                    //skin:'layui-layer-lan',
+                    content:formHtml,
+                    area:['350px',height+'px'],
+                    btnAlign:'r',
+                    closeBtn:0,
+                    shade:true,
+                    resize:false,
+                    success:function(layero){
+                        var formItems = [];
+                        if(isMustChange){
+                            formItems.push({
+                                type:'word',
+                                name:'label',
+                                text:'鎮ㄧ殑瀵嗙爜宸茬粡杩囨湡,璇风珛鍗虫洿鏀瑰瘑鐮�',
+                                labelWidth:340,
+                                titleAlign:'center'
+                            });
+                        }
+                        formItems.push({
+                            type:'password',
+                            name:'password',
+                            text:'褰撳墠瀵嗙爜',
+                            required:true
+                        });
+                        formItems.push({
+                            type:'password',
+                            name:'password',
+                            text:'鏂板瘑鐮�',
+                            required:true
+                        });
+                        formItems.push({
+                            type:'password',
+                            name:'confirmPassword',
+                            text:'纭瀵嗙爜',
+                            required:true
+                        });
+                        form.addItems(me.id+"_changepdw",formItems,function(){},me.sourceData,{defaultColumnOneRow:1});
+                    },
+                    yes:function(index,layero){
+                        //鍏堥獙璇�
+                        if(form.validata()){
+                            var values = form.getValues(me.id + "_changepdw");
+                            values.userOid = $webUtil.getCurrentUserOid();
+                            $webUtil.ajax('post','/userQueryController/changePassword',values,function(result){
+                                if(result.success){
+                                    $webUtil.showMsg("淇敼瀵嗙爜鎴愬姛",function(){
+                                        if(callback){
+                                            callback();
+                                        }
+                                    });
+                                    layer.close(thisindex);
+
+                                }else{
+                                    $webUtil.showErrorMsg(result.msg);
+                                }
+                            },function(xhr,err){
+                                $webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                            },configData.frameworkPath);
+                        }
+                    },
+                    btn2:function(index,layero){
+                        if(isMustChange){
+                            $webUtil.showConfirmMsg("鎮ㄧ殑瀵嗙爜宸茬粡杩囨湡锛屼綘蹇呴』淇敼鍚庢墠鑳戒娇鐢ㄦ湰绯荤粺锛屽鏋滃彇娑堝皢浼氳繑鍥炵櫥褰曢〉闈�,鏄惁缁х画?",function (index){
+                                me.logout(true);
+                            },function(){
+
+                            });
+                        }else {
+                            layer.close(index);
+                        }
+                    }
+                });
+            },
+            install:function(){
+                var me = this;
+                $webUtil.dialog({
+                    type: 2,
+                    fullScreen:true,
+                    content:(me.mainConfig.installHtml)?me.mainConfig.installHtml:"install.html",
+                    title:'浣跨敤鍜屽畨瑁呰鏄�'
+                });
+            },
+            proProxy:function(){
+                //娴佺▼浠g悊
+                var me = this;
+                var menuObject = {
+                    id:'workflowProxy',
+                    text:'娴佺▼浠g悊璁剧疆',
+                    bsUrl:'USEJS://process/vciWebProProxy',
+                    notAllowFav:true
+                };
+                me.showTabByMenu("workflowProxy",menuObject);
+            },
+            onlineUser:function(){
+                //鍦ㄧ嚎鐢ㄦ埛鍒楄〃
+                var me = this;
+                var menuObject = {
+                    id:'vciWebOnlineUser',
+                    text:'鍦ㄧ嚎鐢ㄦ埛鍒楄〃',
+                    bsUrl:'USEJS://framework/vciWebOnlineUser',
+                    notAllowFav:true
+                };
+                me.showTabByMenu("vciWebOnlineUser",menuObject);
+            },
+            logout:function(isIgnore){
+                if(isIgnore){
+                    $webUtil.post(configData.logoutUrl,{},function(result){
+                        //鏃犺鎴愬姛涓庡惁閮介渶瑕佽烦杞簡
+                        $.removeCookie('AuthorizationToken',{path:"/"});
+                        window.location.href = projectName + "index.html";
+                    },function (err,xhr) {
+                        $.removeCookie('AuthorizationToken',{path:"/"});
+                        window.location.href = projectName + "index.html";
+                    });
+                }else {
+                    $webUtil.showConfirmMsg('鎮ㄧ‘瀹氳閫�鍑虹郴缁熷悧', function (index) {
+                        $webUtil.post(configData.logoutUrl, {}, function (result) {
+                            //鏃犺鎴愬姛涓庡惁閮介渶瑕佽烦杞簡
+                            $.removeCookie('AuthorizationToken',{path:"/"});
+                            window.location.href = projectName + "index.html";
+                        },function (err,xhr) {
+                            $.removeCookie('AuthorizationToken',{path:"/"});
+                            window.location.href = projectName + "index.html";
+                        });
+                    });
+                }
+            },
+            showFavImage:function(isFav){
+                var me = this;
+                if(isFav){
+                    $("#portal_fav i").removeClass(me.mainConfig.unFavClass);
+                    $("#portal_fav i").addClass(me.mainConfig.favClass);
+                }else{
+                    $("#portal_fav i").removeClass(me.mainConfig.favClass);
+                    $("#portal_fav i").addClass(me.mainConfig.unFavClass);
+                }
+            },
+            lockWindow:function(){//閿佸畾绐楀彛锛屽繀椤讳娇鐢ㄥ瘑鐮佹墠鑳借В閿�
+                var me = this;
+                var windowHtml = '<form class="layui-form" lay-filter="vciPortalLockWindow">' +
+                    '<div class="layui-form-item" style="width:350px;margin-top:15px;">' +
+                    '<label class="layui-form-label layui-field-required" style="width:140px;">璇疯緭鍏ュ瘑鐮佹潵瑙i攣:</label>' +
+                    '<div class="layui-input-inline" style="width:170px">' +
+                    '<input type="password" name="password" required lay-verify="required" placeholder="璇疯緭鍏ュ瘑鐮�" autocomplete="off" class="layui-input "/>' +
+                    '</div>' +
+                    '</div>' +
+                    '</form>';
+                var thisindex = layer.open({
+                    type:1,
+                    title:'閿佸畾绐楀彛',
+                    btn:['瑙i攣'],
+                    //skin:'layui-layer-lan',
+                    content:windowHtml,
+                    area:['350px','200px'],
+                    btnAlign:'r',
+                    closeBtn:0,
+                    shadeClose:false,
+                    shade:true,
+                    resize:false,
+                    yes:function(index,layero){
+                        var form = layui.form;
+                        //鍏堥獙璇�
+                        if(form.validata()){
+                            var values = form.getValues('vciPortalLockWindow');
+                            $webUtil.post('/webUserController/checkPassword',values,function(result){
+                                if(result.success){
+                                    layer.close(thisindex);
+                                }else{
+                                    $webUtil.showErrorMsg(result.msg);
+                                }
+                            },function(xhr,err){
+                                $webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                            },configData.frameworkPath);
+                        }
+                    }
+                });
+            },
+            showTabByMenu:function(id,menuObject){
+                var me = this;
+                if(!me.allAddedTab){
+                    me.allAddedTab = {};
+                }
+                var isAdded = false;
+                for(var key in me.allAddedTab){
+                    if(key == id){
+                        isAdded = true;
+                        break;
+                    }
+                }
+                if(!isAdded){
+                    if(!menuObject){
+                        menuObject = me.webMenu.getMenuObjectById(id);
+                    }
+                    var url = menuObject.bsUrl || menuObject.url || menuObject.href;
+                    if($webUtil.isNull(url)) {
+                        return ;
+                    }
+                    var urlUp = url.toUpperCase();
+                    if($webUtil.startWith(urlUp,"USEJS:")){
+                        //璇存槑鏄娇鐢╦s缁勪欢
+                        var trueUrl = url.substring(6);
+                        if($webUtil.startWith(trueUrl,"//")){
+                            trueUrl = trueUrl.substring(2);
+                        }
+                        var sourceData = {};
+                        sourceData['functionId'] = id;
+                        me.wrapperSourceDataByUrl(trueUrl,sourceData);
+                        if(menuObject && menuObject.initSourceData){
+                            for(var key in menuObject.initSourceData){
+                                sourceData[key] = menuObject.initSourceData[key];
+                            }
+                        }
+                        if(trueUrl.indexOf("?")>-1) {
+                            trueUrl = trueUrl.substring(0, trueUrl.indexOf("?"));
+                        }
+                        trueUrl=trueUrl.replace(/^\/+/,'');
+                        layui.use([trueUrl],function(){
+                            var newTabClass = layui[trueUrl];
+                            newTabClass.id = id;
+                            newTabClass.sourceData = sourceData;
+                            if(menuObject.multiCompent){
+                                newTabClass.multiCompent = menuObject.multiCompent;
+                            }
+                            me.element.tabAdd(me.tabPanelFilter,{
+                                title:menuObject.text,
+                                id:id,
+                                item:newTabClass
+                            });
+                            me.element.tabChange(me.tabPanelFilter,id);
+                            menuObject.instanceObject = newTabClass;
+                        });
+                    }else if( $webUtil.startWith(urlUp,"OPEN:")){
+                        window.open(url,id,'fullscreen=yes');
+                        //璇存槑鏄脊鍑虹獥鍙�
+                    }else if($webUtil.startWith(urlUp,"UI://")
+                        || $webUtil.startWith(url.toUpperCase(),"PLM.UIF.ENGINE.CLIENT.UILAYOUTPANEL?")){
+                        //璇存槑鏄疷I涓婁笅鏂囩殑瀹氫箟
+                        var type = "";
+                        var content = "";
+                        var sourceData = {};
+                        var trueUrl = "";
+                        sourceData['functionId'] = id;
+                        sourceData['sourceDataMap']={};
+                        if($webUtil.startWith(urlUp,"UI://")){
+                            trueUrl = url;
+                            //UI://type#content?param=xxx
+                            if(trueUrl.indexOf("?") > -1){
+                                var temp = trueUrl.substring(3,trueUrl.indexOf("?"));
+                                if(temp.indexOf("#") < 0){
+                                    $webUtil.showErrorMsg("璇疯仈绯荤鐞嗗憳锛岃繖涓彍鍗曠殑鍦板潃鏍煎紡涓嶆纭�傚簲璇ユ槸UI://type#content?param=xxx杩欑褰㈠紡");
+                                    return;
+                                }
+                                type = temp.split("#")[0];
+                                content = temp.split("#")[1];
+                            }else{
+                                var temp = trueUrl.substring("UI://".length);
+                                if(temp.indexOf("#") < 0){
+                                    $webUtil.showErrorMsg("璇疯仈绯荤鐞嗗憳锛岃繖涓彍鍗曠殑鍦板潃鏍煎紡涓嶆纭�傚簲璇ユ槸UI://type#content?param=xxx杩欑褰㈠紡");
+                                    return;
+                                }
+                                type = temp.split("#")[0];
+                                content = temp.split("#")[1];
+                            }
+                        }else{
+                            trueUrl = url;
+                            //plm.uif.engine.client.UILayoutPanel?type=batchtask&context=batchtaskManagementExp
+                            if(trueUrl.indexOf("?") <0){
+                                $webUtil.showErrorMsg("璇疯仈绯荤鐞嗗憳锛岃繖涓彍鍗曠殑鍦板潃鏍煎紡涓嶆纭�傛帹鑽愪娇鐢║I://type#content?param=xxx杩欑褰㈠紡");
+                                return;
+                            }
+                            var temp = trueUrl.split("?")[1];
+                            var paramsArray = temp.split("&");
+                            for(var i = 0 ; i < paramsArray.length ; i ++){
+                                var preParam =paramsArray[i].split("=");
+                                if(preParam[0] == 'type'){
+                                    type = preParam[1];
+                                }else	if(preParam[0] == 'context' ){
+                                    content = preParam[1];
+                                }else{
+                                    sourceData['sourceDataMap'][preParam[0]]=preParam[1]
+                                }
+                            }
+                        }
+                        me.wrapperSourceDataByUrl(trueUrl,sourceData.sourceDataMap);
+                        if(menuObject && menuObject.initSourceData){
+                            for(var key in menuObject.initSourceData){
+                                sourceData['sourceDataMap'][key] = menuObject.initSourceData[key];
+                            }
+                        }
+                        sourceData['btmType'] = type;
+                        sourceData['content'] = content;
+                        layui.use('platform/objectService/VciUIContentViewer',function () {
+                            var newTabClass = layui['platform/objectService/VciUIContentViewer'];
+                            newTabClass.id = id;
+                            newTabClass.multiCompent = true;
+                            newTabClass.sourceData = sourceData;
+                            me.element.tabAdd(me.tabPanelFilter,{
+                                title:menuObject.text,
+                                id:id,
+                                item:newTabClass
+                            });
+                            me.element.tabChange(me.tabPanelFilter,id);
+                            menuObject.instanceObject = newTabClass;
+                        });
+                    }else if($webUtil.isNotNull(url) ){
+                        //閾炬帴缃戦〉
+                        me.element.tabAdd(me.tabPanelFilter,{
+                            title:menuObject.text,
+                            id:id,
+                            href:url
+                        });
+                        me.element.tabChange(me.tabPanelFilter,id);
+                    }else{
+                        return;
+                    }
+                    me.allAddedTab[id] = menuObject;
+                }else{
+                    me.element.tabChange(me.tabPanelFilter,id);//鑷姩閫夋嫨杩欎釜閫夐」鍗�
+                }
+                if(menuObject.notAllowFav == true){
+                    me.webMenu.currentMenuId = "";
+                }
+            },
+            wrapperSourceDataByUrl : function(trueUrl,sourceData){
+                if(trueUrl.indexOf("?") > -1){//璇存槑鏈夊弬鏁�
+                    var params = trueUrl.substring(trueUrl.indexOf("?")+1);
+                    var paramsArray = params.split("&");
+                    for(var i = 0 ; i < paramsArray.length ; i ++){
+                        var preParam =paramsArray[i].split("=");
+                        sourceData[preParam[0]] = preParam[1];
+                    }
+                }
+            },
+            refresh:function(){
+                layui.table.reload('table_vciProcessUndoTask_vciDefaultIndex_protask_1');
+                layui.each(this.allAddedTab,function (i,tab){
+                    if(tab.instanceObject.refreshAll){
+                        tab.instanceObject.refreshAll()
+                    }else{
+                        try {
+                            tab.instanceObject.refresh()
+                        }catch (e) {
+
+                        }
+                    }
+                })
+            },
+            msgcenter:function(){
+                $("#portal_msgcount_star").hide();
+                //娑堟伅涓績
+                var me = this;
+                var menuObject = {
+                    id:'messageCenter',
+                    text:'娑堟伅涓績',
+                    bsUrl:'USEJS://messages/vciWebMessage',
+                    notAllowFav:true
+                };
+                portal.showTabByMenu("messageCenter",menuObject);
+            },
+            portal:function(){
+                var that = this;
+                var portalUrl = "url1";//闈炲伐浜�
+                var rolesname = $webUtil.getRolesName();
+                layui.each(rolesname,function(_index,_item){
+                    if(_item == "宸ヤ汉"){
+                        portalUrl = "url2"
+                    }
+                });
+                window.open("portalUrl");
+            },
+            mpm:function (){
+                var that = this;
+                var winOpen = window.open("vci-client://do?token=" + $webUtil.getCurrentUserId(),'','location=no,width=1,height=1');
+                setTimeout(function(){winOpen.close();},500);
+            }
+
+        };
+        exports('vciWebPortalDojoUI',portal);
+    });
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebPortalHome.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebPortalHome.js
new file mode 100644
index 0000000..84d0b5b
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebPortalHome.js
@@ -0,0 +1,274 @@
+/**
+ * Created by weidy on 2018/5/3.  涓婚〉锛屼笌vciWebPortal鐨勫尯鍒槸锛宲ortal鏄暣涓灦鏋勶紝杩欎釜鏄叾涓殑涓婚〉
+ */
+layui.define(['layer'],function(exports){
+    /**
+     * 涓庝箣鍓峞asyui鐨刾ortal锛屾垨鑰卐xtjs鐨刾ortal鏈夊尯鍒殑鍦版柟鏄紝杩欎釜涓婚〉閲岀殑鎸備欢涓嶆敮鎸佹嫋鎷�
+     * 瀹炵幇鏂瑰紡涔熺浉鍚岋紝鍏堢‘瀹氭湁澶氬皯鍒楋紝鐒跺悗鏄剧ず姣忓垪涓殑鎸備欢
+     * 涓婚〉閫氬父涓�涓郴缁熷彧鏈変竴涓紝鍥犳杩欓噷涓嶅啀娣诲姞filter鐨勬柟寮�
+     */
+    var Home = function(){
+        this.styleConfig = {
+            filter:'layui-index-home',
+            padding:'5px',//姣忎釜鍏冪礌涔嬮棿鐨勯棿闅�
+            colspace:15//姣忎竴鍒楃殑鍋忕Щ閲�,鏀寔1,3,5,8,10,12,15,18,20,22,28,30;涔熷彲浠ュ湪layui.css閲屽畾涔�
+        };
+        this.config = {
+            requestDataType:'ajax',//璇锋眰鏁版嵁鐨勭被鍨嬶紝鎻愪緵ajax,data涓ょ锛宒ata琛ㄧず鐩存帴璁剧疆鍒�
+            ajaxUrl:'',//寮傛璇锋眰鐨勮矾寰�
+            ajaxWhere:{},//寮傛璇锋眰鐨勯檮鍔犲睘鎬�
+            backDefineColumns:12//鍚庡彴瀹氫箟鐨勫垪鏄寜12浠借繕鏄�10浠界殑锛�10浠芥槸涓轰簡鍏煎浠ュ墠鐨勫钩鍙�
+        };
+        this.backPath = configData.compatibility?path:configData.frameworkPath;
+        this.MOUDLENAME = "vciWebPortalHome";
+        this.data = [];//濡傛灉鏄暟鎹殑鏃跺��
+        this.columns = [];//鏈�缁堣幏鍙栧埌鍒楃殑淇℃伅
+        this.needInitItem = [];
+        this.tabItems = {};
+    };
+    Home.prototype.setConfig = function(config){
+        var that = this;
+        $.extend(that.config,config);
+    };
+    Home.prototype.setData = function(data){
+        var that = this;
+        that.data = data;
+    };
+    Home.prototype.getContent = function(){
+        //鑾峰彇鍒濆鐨刪tml锛岀敤浜庡吋瀹筽ortal涓殑閫夐」鍗℃墦寮�
+        var that = this;
+        return '<div class="layui-index-home layui-fluid" style="padding:' + that.styleConfig.padding +';overflow:hidden;" layui-filter="' + that.styleConfig.filter + '"></div> ';
+    };
+    Home.prototype.init = function(){
+        var that = this;
+        //鍏堝垽鏂槸鍝鏂瑰紡
+        if('ajax' == that.config.requestDataType.toLowerCase()){
+            //寮傛璇锋眰鏂瑰紡
+            //鏈嶅姟绔繀椤昏繑鍥炵殑鏄疛SON瀵硅薄鏍煎紡锛孞SON瀵硅薄鍖呭惈success,msg,obj灞炴��
+            if(layui.util.isNull(that.config.ajaxUrl)){
+                $webUtil.showErrorMsg("ajaxUrl娌℃湁璁剧疆鍊�");
+                return false;
+            }
+            $webUtil.post(that.config.ajaxUrl,that.config.ajaxWhere,function(result){
+                if(result.success){
+                    that.columns =result.obj;
+                    that.showColumns();
+                }else{
+                    $webUtil.showErrorMsg(result.msg);
+                }
+            },function(xhr,error){},that.backPath,false);
+        }else{
+            //鐩存帴璁剧疆鏁版嵁
+            that.columns = that.data;
+            that.showColumns();
+        }
+    };
+    Home.prototype.showColumns = function(){
+        //鏄剧ず鍒�
+        var that = this,root = $('[layui-filter="' +  that.styleConfig.filter + '"]');
+        //鍏堟坊鍔犱竴涓畬鎴愮殑琛�
+        var row = $('<div class="layui-row layui-col-space' + that.styleConfig.colspace + '"></div>');
+        root.html(row);
+        var colHtml = "";
+        layui.each(that.columns,function(_index,record){
+            /***
+             * layui鍘熺敓鏀寔浜嗗皢涓�琛岀殑鍐呭鍒囧垎鎴愪簡12浠斤紝鑰屼笉鏄父瑙勭殑10浠姐�備富瑕佹槸鍏堕�傞厤骞虫澘锛屾墜鏈哄拰妗岄潰
+             * width--瀹藉害锛屾渶澶т负backDefineColumns
+             * 楂樺害鏄嚜鍔ㄧ殑锛屼笉鑳借缃�,鏄湪鍏蜂綋鐨勬寕浠堕噷璁剧疆鐨�
+             * id--鍒楃殑涓婚敭
+             * portlets 閲岄潰鐨勬寕浠�
+             */
+            if(layui.util.isNull(record.id)) {
+                record.id = layui.util.uuid();
+            }
+            if(that.config.backDefineColumns == 10){//濡傛灉鍚庡彴鏄寜10鏉ヨ缃殑锛岄偅寰楄浆鍖栦竴涓�
+                record.width = Math.ceil(record.width*1/10*12);//鍚戜笂杩�1
+            }
+            colHtml += that.getColumnHtml(record);
+        });
+        row.html(colHtml);
+        that.initItems();
+        that.bindListeners();
+        try{
+            if(respond){//IE9涓嬪埛鏂版牸鏍�
+                respond.update();
+            }
+        }catch (e){
+
+        }
+    };
+    Home.prototype.getColumnHtml = function(column){
+        var that = this;
+        var html = "";
+        if(layui.util.isNull(column.id)) {
+            column.id = layui.util.uuid();
+        }
+        if(that.config.backDefineColumns == 10){//濡傛灉鍚庡彴鏄寜10鏉ヨ缃殑锛岄偅寰楄浆鍖栦竴涓�
+            column.width = Math.ceil(column.width*1/10*12);//鍚戜笂杩�1
+        }
+        html += '<div class="layui-col-md' + column.width*1 + '" layui-index-home-data-id="' + column.id + '">';
+        if(column.children && column.children.length>0){
+            //璇存槑杩樺寘鍚簡瀛愬垪鐨�
+            html += '<div class="layui-row layui-col-space' + that.styleConfig.colspace +'">';
+            layui.each(column.children,function(_index,child){
+                if(child.enable) {
+                    html += that.getColumnHtml(child);
+                }
+            });
+            html += '</div>';
+        }else if(column.portlets && column.portlets.length >0){
+            //璇存槑鐩存帴鏄剧ず鎸備欢浜�
+            html += that.getPortletHtml(column.portlets) ;
+        }
+        html += '</div>';
+        return html;
+    };
+    Home.prototype.getPortletHtml = function(portlets){
+        var that = this;
+        /**
+         * 鑾峰彇鎸備欢鐨刪tml
+         * portlet
+         */
+        var html  = "";
+        if(portlets){
+            layui.each(portlets,function(_index,record){
+                /**
+                 * id 姣忎竴涓寕浠剁殑涓婚敭
+                 * title 鎸備欢鐨勫悕绉�
+                 * type 鎸備欢鐨勭被鍨� card,tab
+                 * centerUrl 璺宠浆鍒板姛鑳界殑url
+                 * info 鎻愮ず淇℃伅
+                 * items 鍏蜂綋灞曠ず鐨勫璞�
+                 */
+                if(layui.util.isNull(record.id)) {
+                    record.id = layui.util.uuid();
+                }
+                html += '<div class="layui-card" layui-index-home-data-id="' + record.id + '">';
+                if('tab'!= record.type){
+                    //涓嶆槸閫夐」鍗$殑锛岄兘鏄寜card鏉ユ墽琛�
+                    html += '<div class="layui-card-header">' + record.title ;
+                    if(layui.util.isNotNull(record.centerUrl)){
+                        html +='<i class="layui-icon layui-icon-release layui-vci-portlet-center " lay-center-url="' + record.centerUrl + '" lay-center-id="' + record.id + '" lay-center-title="'+ record.title + '" ></i>';
+                    }
+                    if(layui.util.isNotNull(record.info)){
+                        html += '<i class="layui-icon layui-icon-tips" lay-tips="' + record.info +'" ></i>';
+                    }//鏍囬
+                    html += '</div>';
+
+                    html += '<div class="layui-card-body ' ;//涓讳綋
+                    html += ($webUtil.isNotNull(record.customClass)? record.customClass : '') + ' "';//鑷畾涔夌被
+                    html += ($webUtil.isNotNull(record.customStyle) ? (' style="' + record.customStyle + '" ') : ''); //鑷畾涔夋牱寮�
+                    html += '>';
+                    //杞挱鍜宑ard閮藉彧鏈変竴涓猧tem
+                    if(record.items && record.items.length >0){
+                        /**
+                         * item瀵硅薄
+                         * id 涓婚敭
+                         * title 鍚嶇О锛岀敤浜庡叿浣撶殑鎿嶄綔
+                         * type 绫诲瀷 layui,url,
+                         * url
+                         */
+                        if("url" == record.type){
+                            html += '<iframe src="' + record.item[0].url + '"></iframe>';
+                        }else{
+                            var sourceData = {};
+                            var url = record.items[0].url;
+                            if($webUtil.isNotNull(url)) {
+                                if (url.indexOf("?") > -1) {
+                                    var params = url.substring(url.indexOf("?") + 1);
+                                    url = url.substring(0, url.indexOf("?"));
+                                    var paramsArray = params.split("&");
+                                    for (var i = 0; i < paramsArray.length; i++) {
+                                        var preParam = paramsArray[i].split("=");
+                                        sourceData[preParam[0]] = preParam[1];
+                                    }
+                                }
+                                that.needInitItem.push({parentId: record.id, items: record.items[0]});
+                            }
+                        }
+                    }
+                    html += '</div>';
+                }else{
+                    html += '<div class="layui-tab layui-tab-brief" layui-filter="' + record.id +'"></div>';
+                    that.tabItems[record.id] = record.items;
+                }
+                html += '</div>';
+            });
+        }
+        return html;
+    };
+    Home.prototype.initItems = function(){
+        var that = this;
+        if(that.needInitItem && that.needInitItem.length > 0){
+            layui.each( that.needInitItem,function(_index,record){
+                var sourceData = {};
+                var url = record.items.url;
+                if($webUtil.isNotNull(url)){
+                    if(url.indexOf("?") > -1){
+                        var params = url.substring(url.indexOf("?")+1);
+                        url = url.substring(0,url.indexOf("?"));
+                        var paramsArray = params.split("&");
+                        for(var i = 0 ; i < paramsArray.length ; i ++){
+                            var preParam =paramsArray[i].split("=");
+                            sourceData[preParam[0]] = preParam[1];
+                        }
+                    }
+                    layui.use([url],function(){
+                        var newTabClass = layui[url];
+                        newTabClass.id = record.items.id;
+                        newTabClass.sourceData = sourceData;
+                        $('[layui-index-home-data-id="' + record.parentId + '"] .layui-card-body').append(newTabClass.getContent());
+                        newTabClass.init();
+                    });
+                }
+            });
+        }
+        if(that.tabItems){
+            var element = layui.element;
+            for(var tabId in that.tabItems){
+                var record = that.tabItems[tabId];
+                layui.each(record,function(_itemIndex,_item){
+                    var sourceData = {};
+                    var url =_item.url;
+                    if($webUtil.isNotNull(url)){
+                        if(url.indexOf("?") > -1) {
+                            var params = url.substring(url.indexOf("?") + 1);
+                            url = url.substring(0, url.indexOf("?"));
+                            var paramsArray = params.split("&");
+                            for (var i = 0; i < paramsArray.length; i++) {
+                                var preParam = paramsArray[i].split("=");
+                                sourceData[preParam[0]] = preParam[1];
+                            }
+                        }
+                        layui.use([url],function(){
+                            var newTabClass = layui[url];
+                            newTabClass.id = item.id;
+                            newTabClass.sourceData = sourceData;
+                            element.tabAdd(tabId, {
+                                title:_item.title,
+                                id:_item.id,
+                                item:newTabClass
+                            });
+                        });
+                    }
+                });
+            }
+        }
+    };
+    Home.prototype.bindListeners = function(){
+        var that = this;
+        $(".layui-vci-portlet-center").click(function(){
+            var thisIcon = $(this);
+            var id = thisIcon.attr("lay-center-id");
+            var title = thisIcon.attr("lay-center-title");
+            var url = thisIcon.attr("lay-center-url");
+            portal.showTabByMenu(id,{
+                id:id,
+                text:title,
+                bsUrl:url
+            });
+        });
+    };
+    var home = new Home();
+    exports(home.MOUDLENAME,home);
+});
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebRefer.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebRefer.js
new file mode 100644
index 0000000..efaa76e
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebRefer.js
@@ -0,0 +1,263 @@
+layui.define(['layer','vciWebReferGrid','vciWebReferTree','vciWebReferClassify','vciWebReferStand','vciWebReferDefalut'],function(exports){
+	/**
+	 * 鍙傜収瀛楁
+	 * weidy@2018-03-06
+	 */
+	var Refer = function(){
+		this.defaultConfig = {
+				gridUrl:'webReferController/referDataGrid',//琛ㄦ牸鐨勫弬鐓ц矾寰�
+				treeUrl:'webReferController/referTree',//鏍戝舰鐨勫弬鐓ц〃鏍�
+				valueField:'oid',//鍊肩殑瀛楁
+				textField:'name'//鏄剧ず鐨勫瓧娈�
+		};
+		this.defaultRefer = {
+			/**
+			 * 閮ㄩ棬鏍�
+			*/
+			departmentRefer:'refer/OrgDepartmentRefer',
+			/**
+			 * 閮ㄩ棬鍒楄〃
+			 */
+			departmentGridRefer:'refer/OrgDepartmentGridRefer',
+			/**
+			 * 鐢ㄦ埛,榛樿鏄樉绀哄父鐢紝瑙掕壊锛岄儴闂ㄥ拰鐢ㄦ埛銆傚彲浠ラ厤缃槸鍚︽樉绀哄伐绉嶇瓑閫夐」鍗�
+			 */
+			userRefer:'refer/SmUserRefer',
+			/**
+			 * 浠呬粎鐢ㄦ埛鐨勫垪琛�
+			 */
+			onlyUserRefer:'refer/SmUserGridRefer',
+			/**
+			 * 鐢ㄦ埛绌挎妗嗭紝宸︿晶鏄剧ず閮ㄩ棬鍜岃鑹叉爲锛屽彸渚т负绌挎妗嗭紝绌挎妗嗙殑鍙宠竟閮ㄥ垎榛樿鏄剧ず宸查�夋嫨鐨勭敤鎴�
+			 */
+			//userTransferRefer:'refer/SmUserTransferRefer',
+			/**
+			 * 瑙掕壊鍒楄〃
+			 */
+			roleRefer:'refer/SmRoleRefer',
+			/**
+			 * 鑱屽姟
+			 */
+			dutyRefer:'refer/OrgDutyRefer',
+
+			/**
+			 * 宀椾綅
+			 */
+			jobRefer:(configData.compatibility?'':'refer/OrgJobRefer'),
+
+			/**
+			 * 宸ョ
+			 */
+			workTypeRefer:(configData.compatibility?'':'refer/SmWorkTypeRefer'),
+			/**
+			 * 娴佺▼妯℃澘
+			 */
+			processTempRefer:(configData.compatibility?"refer/WfProcessTemplateRefer":'')
+		};
+		//鍙傜収鐨勭被鍨� stand:UI涓婁笅鏂� ,default:榛樿灞曠ず鎴愭寚瀹氬垪鐨勫垪琛�
+		this.referType = {
+			tree:'tree',
+			grid:'grid',
+			classify:'classify',
+			stand:'stand',
+			'default':'default'
+		}
+	};
+	Refer.prototype.init = function(){
+		
+	};
+	Refer.prototype.initReferRegister = function(referRegisters){
+		//鍒濆鍖栨敞鍐岀殑鍙傛暟瀵硅薄
+		var that = this;
+		that.referRegister = referRegisters;
+		if(that.referRegister){
+			for(var referKey in that.referRegister){
+				layui.use(that.referRegister[referKey]);
+			}
+		}
+		//refer涓嬪紩鐢ㄧ殑灏遍渶瑕佸姞涓�涓�
+		layui.modules['refer/SmUserReferBase'] = 'refer/SmUserReferBase';
+		if(that.defaultRefer){
+			for(var referKey in that.defaultRefer){
+				var modelName = that.defaultRefer[referKey];
+				if(modelName !='') {
+					layui.modules[modelName] = modelName;
+					layui.use(modelName);
+				}
+			}
+		}
+		layui.use('form');
+		layui.use('tree');
+		layui.use('table');
+	};
+	//娣诲姞鍙傜収瀵硅薄
+	Refer.prototype.newRefer=function(filter,name,elem,options){
+		var that = this;
+		if(!that.referFields){
+			that.referFields = {};
+		}
+		that.referFields[filter+"_" +name] = {
+				elem:elem,
+				options:options
+		};
+	};
+	Refer.prototype.getReferConfig = function(filter,name){
+		var that = this;
+		if(that.referFields && (filter+"_" + name) in that.referFields){
+			return that.referFields[filter+"_" + name];
+		}
+		return null;
+	};
+	//鏄剧ず鍙傜収瀵硅薄
+	Refer.prototype.showRefer = function(filter,name,formValues){
+		var that = this;
+		var config = that.getReferConfig(filter,name);
+		if(config == null){//娌℃湁閰嶇疆鐨勬椂鍊�
+			return;
+		}
+		if(config.elem){
+			that.setValue(filter,name,formValues?formValues[name]:config.elem.value,(formValues &&config.options)?formValues[config.options['showField']]:config.elem.text());
+		}
+		if(config.options){
+			var options = config.options;
+            options.formValues = formValues;
+
+			var referConfig = {
+				filter:filter,
+				name:name,
+				target:that,
+				value:config.elem.value,
+				text:config.elem.text()
+			};
+			$.extend(referConfig, options);
+			referConfig.options=options;
+			var title =config.title?config.title:config.elem.parent().prev().text();
+			title = title.replace(":","");
+			if(title){
+				title = $webUtil.isNotNull(options.title)?options.title:('涓恒��' + title + '銆戦�夊彇鍊�');
+			}else{
+				title = $webUtil.isNotNull(options.title)?options.title:('涓恒��' + name + '銆戦�夊彇鍊�');
+			}
+			var isMuti = ("true"==options.isMuti || options.isMuti == true || options.muti == true)? true : false;
+			referConfig.title=title;
+			referConfig.isMuti=isMuti;
+			referConfig.options.isMuti=isMuti;
+
+			if(options.type==that.referType.tree){
+				//鏍戝舰.渚濈劧寮瑰嚭绐楀彛锛岀洿鎺ヤ娇鐢ㄤ笅鎷夌殑鏂瑰紡鏄剧ず锛岃浣跨敤combox
+				var vciReferTree = layui.vciWebReferTree;
+				options.url = $webUtil.getValueFromObj(options,['url','referUrl'],configData.compatibility?"uiDataController/defaultReferTree":that.defaultConfig.treeUrl);
+				if(configData.compatibility && $webUtil.isNull(options.url)){
+					options.url = "uiDataController/defaultReferTree";
+				}
+				vciReferTree.showReferDialog(referConfig);
+			}else if(options.type==that.referType.grid){
+				//琛ㄦ牸绫诲瀷
+				options.url = $webUtil.getValueFromObj(options,['url','referUrl'],configData.compatibility?"uiDataController/defaultReferDataGrid":that.defaultConfig.gridUrl);
+				if(configData.compatibility && $webUtil.isNull(options.url)){
+					options.url = "uiDataController/defaultReferDataGrid";
+				}
+				var vciReferGrid = layui.vciWebReferGrid;
+				vciReferGrid.showReferDialog(referConfig);
+			}else if(options.type==that.referType.classify){
+				//鍒嗙被鐨勯�夋嫨
+				layui.vciWebReferClassify.showReferDialog(referConfig);
+			}else if(options.type==that.referType.stand){
+				//灞曠ずUI涓婁笅鏂�
+				layui.vciWebReferStand.showReferDialog(referConfig);
+			}else if(options.type==that.referType['default']){
+				//灞曠ず鎴愭寚瀹氬垪鐨勫垪琛�
+				layui.vciWebReferDefalut.showReferDialog(referConfig);
+			}else{
+				var hasRegister = false;
+				for(var key in that.referRegister){
+					if(that.referRegister[key] == options.type){
+						var layuiName = options.type;
+						layui[layuiName].showReferDialog(referConfig);
+						hasRegister = true;
+						break;
+					}
+				}
+				if(!hasRegister){
+					layui.use(options.type,function (){
+						layui[options.type].showReferDialog(referConfig);
+					});
+				}
+			}
+		}
+	};
+	//璁剧疆鍙傜収瀵硅薄鐨勫��
+	Refer.prototype.setValue = function(filter,name,value,rawValue,isClose,selectRecords){
+		var that = this;
+		var selectValue = {
+			value:value,
+			rawValue:rawValue,
+			allValues:selectRecords
+		};
+		if(!that.referValues){
+			that.referValues = {};
+		}
+		that.referValues[filter+"_" +name] = {
+				value:value,
+				rawValue:rawValue,
+				allValues:selectRecords
+		};
+		var config = that.getReferConfig(filter,name);
+		//璋冪敤鍊间慨鏀逛簨浠�--鏈璞¢噷鐨勮皟鐢ㄤ簨浠�
+		if(isClose && that.changeListener && that.changeListener[filter+"_" +name]){
+			var s = that.changeListener[filter+"_" +name];
+			s.callback(filter,name,config.options.showField,value,rawValue,selectRecords);
+		}
+	};
+	Refer.prototype.addChangeValueListener = function(filter,name,showFieldName,callback){
+		var that = this;
+		if(!that.changeListener){
+			that.changeListener = {};
+		}
+		that.changeListener[filter+"_" +name] = {
+				filter:filter,
+				name:name,
+				showFieldName:showFieldName,
+				callback:callback
+		};
+	};
+	//娓呴櫎鍙傜収瀵硅薄鐨勫��
+	Refer.prototype.clearValue=function(filter,name){
+		var that = this;
+		if(that.referValues && (filter+"_" +name) in that.referValues){
+			delete that.referValues[filter+"_" +name];
+		}
+	};
+	Refer.prototype.destory = function(filter,name) {
+		var that = this;
+		var referFilter = filter + "_" + name;
+		if (that.referFields && referFilter in that.referFields) {
+			delete that.referFields[referFilter];
+		}
+		if (that.referValues && referFilter in that.referValues) {
+			delete that.referValues[referFilter];
+		}
+		var option = that.getReferConfig(filter, name);
+		if (option && option.type) {
+			if (option.type == that.referType.tree) {
+				var vciReferTree = layui.vciWebReferTree;
+				vciReferTree.destory(filter, name);
+			} else if (option.type == that.referType.grid) {
+				var vciReferGrid = layui.vciWebReferGrid;
+				vciReferGrid.destory(filter, name);
+			} else if (option.type == that.referType.classify) {
+				layui.vciWebReferClassify.destory(filter, name);
+			} else {
+				for (var key in that.referRegister) {
+					if (that.referRegister[key] == options.type) {
+						var layuiName = options.type;
+						layui[layuiName].destory(filter, name);
+						break;
+					}
+				}
+			}
+		}
+	};
+	var refer = new Refer();
+	exports('vciWebRefer',refer);
+});
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebReferClassify.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebReferClassify.js
new file mode 100644
index 0000000..a16040a
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebReferClassify.js
@@ -0,0 +1,323 @@
+/**
+ * 鍒嗙被+妗f鐨勫弬鐓ч〉闈�
+ * @author weidy
+ * @date 2021-1-10
+ */
+layui.define(['layer','element'],function(exports){
+    var Class = function(){
+        this.MODELNAME = "vciWebReferClassify";
+        this.moduleKey = "vciWebReferClassify";
+        this.defaultConfig = {
+            valueField:'oid',//鍊肩殑瀛楁
+            textField:'name'//鏄剧ず鐨勫瓧娈�
+        };
+        this.showReferDialog = function(referConfig){
+            var referFilter = referConfig.filter,
+                name = referConfig.name,
+                title = referConfig.title,
+                valueInfo = ($webUtil.isNotNull(referConfig.text)?("宸茶缃殑鍊间负[" +referConfig.text +"]"):'鏈缃��'),
+                isMuti = referConfig.isMuti,
+                target = referConfig.target,
+                value = referConfig.value,
+                text = referConfig.text;
+            var options = referConfig.options;
+            var me = this;
+            options.gridUrl = $webUtil.getValueFromObj(options,['url','referUrl']);
+            var referIndex = $webUtil.dialog({
+                title:title,
+                btn:['纭畾','鍙栨秷'],
+                content:'<div id="referClassify_' + referFilter + '" layui-filter="referClassify_' + referFilter + '" class="layui-table-toolbar" style="height:545px;"></div>',
+                area:[(($webUtil.isNotNull(options.width) && options.width*1>1) ?options.width*1 : 1050) +'px',
+                    (($webUtil.isNotNull(options.height) && options.height*1>1) ?options.height*1 : 670) + 'px'],
+                btnBefore:valueInfo,
+                resizing:function(layero){
+                    me.doResize(referFilter,name);
+                },
+                yes:function(index,layero){
+                    var selectValue = me.getSelectValue(referFilter,name,isMuti);
+                    if(selectValue){
+                        target.setValue(referFilter,name,selectValue.value,selectValue.rawValue,true,selectValue.allValues);
+                        layer.close(referIndex);
+                    }
+                },
+                success:function(layero){
+                    me.showGrid(referFilter,name,options,value,text);
+                }
+            });
+        };
+        /**
+         * 鐩存帴鏄剧ず閫夋嫨鐨勫璇濇锛岃繖涓粡甯稿湪鐐瑰嚮鎸夐挳鍚庣殑鍔熻兘閲屼娇鐢�
+         * @param options 閰嶇疆鐨勪俊鎭紝鍖呭惈濡備笅灞炴��
+         *    filter 锛屾爣璇�
+         *    name 锛屾爣璇嗗悕绉�
+         *    classifys:[{
+         *         filter:'鍒嗙被鐨勬爣璇�',
+         *        title:'鏍囬',
+         *        url:'鍒嗙被鐨勮矾寰�',
+         *        queryField:'鍒楄〃鏁版嵁涓垎绫荤殑瀛楁',
+         *        classifyValueField:'浠庢爲涓婅幏鍙栫殑灞炴�э紝娉ㄦ剰鏍戠殑鏁版嵁鏄痑ttribute.
+         *        queryByClassifyUrl:'浠庡垎绫讳笂鏌ヨ鐨勫唴瀹�'
+         *        }];
+         *   cols:'鏄剧ず鐨勫垪',
+         *   queryColumns:'鏌ヨ鐨勫垪',
+         *   gridUrl:'鍒楄〃鐨勮矾寰�',
+         *   onlyTable:'鍙樉绀哄垪琛�',
+         *
+         *   setValue:function (filter,name,value,rawValue,isClose,allSelectValues) {}   璁剧疆鍊肩殑鍥炶皟
+         * @returns 绐楀彛鐨勭储寮曞彿
+         */
+        this.viewUserInDialog = function (options) {
+            //鍦ㄥ璇濇涓�夋嫨鐢ㄦ埛
+            var that = this;
+            options = $.extend(that.defaultConfig,options);
+            options.textField = $webUtil.getValueFromObj(options,['textField'],that.defaultConfig.textField);
+            options.valueField = $webUtil.getValueFromObj(options,['valueField'],that.defaultConfig.valueField);
+            options.gridUrl = $webUtil.getValueFromObj(options,['url','referUrl']);
+            var filter = options.filter;
+            var name = options.name;
+            var valueInfo = ($webUtil.isNotNull(options.text)?("宸茶缃殑鍊间负[" +options.text +"]"):'鏈缃��');
+            var referIndex = $webUtil.dialog({
+                title:(options.title?options.title:'璇峰厛閫夋嫨鍒嗙被鍐嶉�夋嫨鏁版嵁'),
+                btn:['纭畾','鍙栨秷'],
+                content:'<div id="referClassify_' + filter + '" layui-filter="referClassify_' + filter + '" class="layui-table-toolbar referClassify_toolbar_'+filter+'" style="height:545px;"></div>',
+                area:[(($webUtil.isNotNull(options.width) && options.width*1>1) ?options.width*1 : 1050) +'px',
+                    (($webUtil.isNotNull(options.height) && options.height*1>1) ?options.height*1 : 670) + 'px'],
+                btnBefore:valueInfo,
+                yes:function(index,layero){
+                    var selectValue = that.getSelectValue(filter,name);
+                    if(selectValue){
+                        options.setValue(filter,name,selectValue.value,selectValue.rawValue,true,selectValue.allValues);
+                        layer.close(referIndex);
+                    }
+                },
+                success:function(layero){
+                    that.showGrid(filter,name,options);
+                }
+            });
+            return referIndex;
+        };
+        this.setConfig=function(filter,name,options){
+            var that = this;
+            if(!that.referConfig){
+                that.referConfig = {};
+            }
+            that.referConfig[filter + "_" + name] = options;
+        };
+        this.getConfig=function(filter,name){
+            var that = this;
+            if(!that.referConfig){
+                that.referConfig = {};
+            }
+            if((filter + "_" + name) in that.referConfig){
+                return that.referConfig[filter + "_" + name];
+            }
+        };
+        this.showGrid =function (filter,name,options) {
+            //鏄剧ず
+            var that = this;
+            that.setConfig(filter,name,options);
+            var contentFilter = filter + "_" + name;
+            var typeHtml=['<div style="width:' + (options.onlyTable?'0':(options.classifyWidth?options.classifyWidth:'350')) +'px;float: left;overflow-y:auto;background-color:#ffffff;display:',options.onlyTable?'none':'block','">',
+                        '<div lay-filter="referTree_' + contentFilter + '" class="layui-tab layui-tab-card" lay-allowClose="false">',
+                            '<ul class="layui-tab-title" lay-allowClose="false">'];
+            var tabHtml = [];
+            var tabContentHtml = [];
+            if(options.classifys) {
+                layui.each(options.classifys, function (_index, _item) {
+                    tabHtml.push('<li ' + ((_index == 0)?' class="layui-this" ':'') + '>' +  _item.title + '</li>');
+                    tabContentHtml.push([
+                        '<div class="layui-tab-item',((_index == 0)?' layui-show':''),'">',
+                        '<ul layui-filter="', _item.filter, '_', contentFilter, '" style="border:1px solid #6886ff;overflow-x:auto"></ul>',
+                        '</div>'].join(''));
+                });
+            }
+            typeHtml.push(tabHtml.join(''));
+            typeHtml.push('</ul>');
+            typeHtml.push('<div class="layui-tab-content">');
+            typeHtml.push(tabContentHtml.join(''));
+            typeHtml.push( '</div>');
+            typeHtml.push(    '</div>');
+            typeHtml.push('</div>');
+            var content= [
+                '<div class="layui-layout-border vciWebReferGridInDojo" style="margin-left:5px;height:100%;overflow-y:hidden;">',
+                    typeHtml.join(''),
+                    '<div class="layui-layout" style="margin-left:',options.onlyTable?'5':(options.classifyWidth?(options.classifyWidth+5):'355'),'px;">',
+                         '<div layui-filter="referClassify_toolbar_',contentFilter, '" class="layui-btn-container">',//涓诲垪琛ㄧ殑鎸夐挳
+                    '</div>',
+                    '<div class="layui-center" style="margin-left: 10px;">',
+                        '<table class="layui-table layui-referGrid" lay-size="sm" lay-even layui-filter="referClassify_' + contentFilter + '" id="referClassify_' + contentFilter + '" ></table>',//涓诲垪琛�
+                    '</div>',
+                '</div>',
+            ];
+            $("#referClassify_"+ filter ).html(content.join(''));
+           // $("#referClassify_"+filter+" .layui-layout-border").css({'height':'96%'});
+            if(options.classifys) {
+                layui.each(options.classifys, function (_index, _item) {
+                    _item.backPath = _item.backPath || options.backPath;
+                    that.showTree(_item ,filter,name);
+                });
+            }
+            var tableId = 'referClassify_' + filter + '_' + name;
+            var table = layui.table;
+            var isMuti = options.isMuti;
+            var requestData = options.where || {};
+            //鍙互瀹氫箟琛ㄦ牸浜�
+            table.render({
+                elem:'#referClassify_' + filter + '_' + name,
+                id:tableId,
+                url:options.gridUrl,
+                page:{
+                    limit: 15,
+                    page: 1
+                },
+                backPath:(options.backPath?options.backPath:that.backPath),
+                height: '475px',
+                where:requestData,
+                method:(options.method || 'get'),
+                selectMode:(isMuti?table.selectMode.muti:table.selectMode.single),
+                cols:[options.cols]
+            });
+            var queryColumns =options.queryColumns;
+            that.showSearchHtml(queryColumns,tableId,filter,name,requestData);
+        };
+        this.showTree = function (classifyItem,filter,name) {
+            var that = this;
+            var tree = layui.tree;
+            var requestData = classifyItem.where || {};
+            var options = that.getConfig(filter,name);
+            var url = classifyItem.url;
+            //鏄剧ずtree
+            var treeOptions = {
+                url:url,
+                extraParams:requestData,
+                treeFilter:filter,
+                treeName:name,
+                showSearch:true,
+                backPath:(classifyItem.backPath || options.backPath ||that.backPath),
+                loadType:tree.loadType.all,
+                click:function(item,elem,treeOptions){
+                    that.treeDoClick(item,elem,treeOptions,classifyItem,filter,name);
+                    return false;
+                }
+            };
+            tree.init(classifyItem.filter + "_" + filter+'_'+name,$('[layui-filter="'+ classifyItem.filter + "_" + filter+'_'+name + '"]'),treeOptions);
+        };
+        this.treeDoClick = function (item,elem,option,classifyItem,filter,name) {
+            var that = this;
+            var tableId = 'referClassify_' + filter + '_' + name;
+            var where = {};
+            var classifyValueField = classifyItem.classifyValueField?classifyItem.classifyValueField:'oid';
+            where[classifyItem.queryField] = item[classifyValueField];
+            var tableUrl = classifyItem.queryByClassifyUrl;
+            layui.table.reload(tableId,{
+                url:tableUrl,
+                backPath:(classifyItem.queryByClassifyBackPth || classifyItem.backPath ),
+                where:where
+            });
+        };
+        this.showSearchHtml = function (queryColumns,tableId,filter,name,requestData) {
+            var that = this;
+            var table = layui.table;
+            var toolbarElem = $('[layui-filter="referClassify_toolbar_' + filter + '_' + name +'"]');
+            if(queryColumns){
+                var toolbarHtml = '<div class="layui-form-item" style="height:24px;display:inline-block"> '
+                    + '<div class="layui-input-inline" style="height:24px;line-height:24px;width:150px"><select name="referGrid_search_'+ filter + '_' + name +'" style="height:24px;width:120px;padding-right:30px;font-size:15px;">';
+                layui.each(queryColumns,function(_index,queryRecord){
+                    toolbarHtml += '<option value="' + queryRecord.field + '" >' + queryRecord.title + '</option>';
+                });
+                toolbarHtml += '</select></div>';
+                toolbarHtml += '<div class="layui-input-inline"><input type="text" style="height:24px;font-size:14px;" name="referGrid_searchvalue_'+ filter + '_' + name +'" placeholder="杈撳叆鍊煎悗鍥炶溅杩涜妯$硦鏌ヨ" class="layui-input" ></div>';
+                toolbarHtml += '<div class="layui-input-inline" ><button class="layui-btn" style="height:24px;line-height:24px" name="referGrid_searchbtn_'+ filter + '_' + name +'" >鏌ヨ</button></div>';
+                toolbarHtml += '</div>';
+                toolbarElem.html(toolbarHtml);
+                layui.form.render('select');
+                $('[name="referGrid_searchvalue_' + filter + "_" + name + '"]').keydown(function (e){
+                    if(e.keyCode == 13){
+                        var searchField = $(this).parent().parent().find('select').val();
+                        var searchValue = $(this).val();
+                        searchValue = "*" + searchValue + "*";
+                        requestData['conditionMap["' + searchField + '"]'] = searchValue;
+                        table.reload(
+                            tableId, {
+                                where: requestData
+                            }
+                        );
+                    }
+                });
+                $('[name="referGrid_searchbtn_'+ filter + '_' + name +'"]').click(function(){
+                    var searchField = $(this).parent().parent().find('select').val();
+                    var searchValue = $(this).parent().parent().find('[name="referGrid_searchvalue_' + filter + '_' + name + '"]').val();
+                    searchValue = "*" + searchValue + "*";
+                    requestData['conditionMap["' + searchField + '"]'] = searchValue;
+                    table.reload(
+                        tableId, {
+                            where: requestData
+                        }
+                    );
+                });
+            }
+        };
+        this.destory = function (filter,name) {
+            //閿�姣�
+            var that = this;
+            if($('#referClassify_' + filter )){
+                $('#referClassify_' + filter ).remove();
+            }
+        };
+        this.getSelectValue = function (filter,name) {
+             var that = this;
+             var table = layui.table;
+             var selectValue = {};
+             var checkStatus = table.checkStatus('referClassify_' + filter + "_" + name);
+             var options = that.getConfig(filter,name);
+             if(checkStatus.data.length>0){
+                 if(!options.isMuti && checkStatus.data.length > 1){
+                     $webUtil.showErrorMsg("鍙兘閫夋嫨涓�鏉℃暟鎹�");
+                     return false;
+                 }
+                 var value = "";
+                 var rawValue = "";
+                 options.valueField = options.valueField?options.valueField:that.defaultConfig.valueField;
+                 options.textField = options.textField?options.textField:that.defaultConfig.textField;
+                 var isMutiValue = (options.valueField.indexOf(",")>-1);
+                 var isMutiRaw = (options.textField.indexOf(",")>-1);
+                 layui.each(checkStatus.data,function(_index,item){
+                     if(isMutiValue){
+                         var valueFieldArray = options.valueField.split(",");
+                         layui.each(valueFieldArray,function(_indexField,_itemField){
+                             value += item[_itemField] + (options.valueSep?options.valueSep:' ');
+                         });
+                         value+= ",";
+                     }else {
+                         value += item[options.valueField] + ",";
+                     }
+                     if(isMutiRaw) {
+                         var rawFieldArray = options.textField.split(",");
+                         layui.each(rawFieldArray,function(_indexField,_itemField){
+                             rawValue += item[_itemField] + (options.textSep?options.textSep:' ');
+                         });
+                         rawValue+= ",";
+                     }else{
+                         rawValue += item[options.textField] + ",";
+                     }
+                 });
+                 if($webUtil.endWith(value,",")){
+                     value = value.substring(0,value.length - 1);
+                 }
+                 if($webUtil.endWith(rawValue,",")){
+                    rawValue = rawValue.substring(0,rawValue.length -1);
+                 }
+                 selectValue = {
+                    value : value,
+                    rawValue : rawValue,
+                    allValues: checkStatus.data
+                 };
+                 return selectValue;
+             }else{
+                 return false;
+             }
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebReferDefalut.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebReferDefalut.js
new file mode 100644
index 0000000..8bbfc94
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebReferDefalut.js
@@ -0,0 +1,299 @@
+layui.define(['layer'],function(exports){
+    /**
+     * 鍙傜収鐨勯粯璁ゅ垪琛ㄦ
+     * wangting@2022-1-21
+     */
+    var ReferGrid = function(){
+        this.defaultConfig = {
+            gridUrl:'/webReferController/referDataGrid',//琛ㄦ牸鐨勫弬鐓ц矾寰�
+            tableDefinedUrl:'/webReferController/getTableDefine',
+            valueField:'oid',//鍊肩殑瀛楁
+            textField:'name'//鏄剧ず鐨勫瓧娈�
+        };
+        this.backPath= configData.compatibility ? path : configData.objectServicePath
+    };
+    ReferGrid.prototype.init = function(){
+
+    };
+    ReferGrid.prototype.showReferDialog = function (referConfig){
+        var filter = referConfig.filter,
+            name = referConfig.name,
+            title = referConfig.title,
+            valueInfo = ($webUtil.isNotNull(referConfig.text)?("宸茶缃殑鍊间负[" +referConfig.text +"]"):'鏈缃��'),
+            isMuti = referConfig.isMuti,
+            target = referConfig.target,
+            value = referConfig.value,
+            text = referConfig.text;
+        if(filter.indexOf('.')>-1){
+            filter=filter.split('.')[0]+'-'+filter.split('.')[1];
+        }
+        if(name.indexOf('.')>-1){
+            name=name.split('.')[0]+'-'+name.split('.')[1];
+        }
+        var options = referConfig.options;
+        var me = this;
+        var referFilter = filter+"_" + name;
+        var referIndex = $webUtil.dialog({
+            title:title,
+            btn:['纭畾','鍙栨秷'],
+            content:'<div layui-filter="referGrid_toolbar_' + referFilter + '" style="margin: 10px 5px 0 5px" ></div><div style="margin: 0 5px"><table class="layui-table layui-referGrid" lay-size="sm" lay-even layui-filter="referGrid_' + referFilter + '" id="referGrid_' + referFilter + '" ></table></div>',
+            area:[(($webUtil.isNotNull(options.width) && options.width*1>1) ?options.width*1 : 720) +'px',
+                (($webUtil.isNotNull(options.height) && options.height*1>1) ?options.height*1 : 625) + 'px'],
+            btnBefore:valueInfo,
+            resizing:function(layero){
+                me.doResize(filter,name);
+            },
+            yes:function(index,layero){
+                var selectValue = me.getSelectValue(filter,name,isMuti);
+                if(selectValue){
+                    target.setValue(filter,name,selectValue.value,selectValue.rawValue,true,selectValue.allValues);
+                    layer.close(referIndex);
+                }
+            },
+            success:function(layero){
+                me.showGrid(filter,name,options,value,text);
+            }
+        });
+    };
+    //鏄剧ず
+    ReferGrid.prototype.showGrid=function(filter,name,options,value,rawValue){
+        var that = this;
+        that.setConfig(filter,name,options);
+
+        if($('#referGrid_' + filter + '_' + name).children().length>0){
+            $('#referGrid_' + filter + '_' + name).show();
+        }else{
+            var tableId = 'referGrid_' + filter + '_' + name;
+            layui.use('table',function(){//鍥犱负table閲屽紩鐢ㄤ簡form ,form閲屽紩鐢ㄤ簡杩欓噷
+                var table = layui.table;
+                var isMuti = $webUtil.getBoolean($webUtil.getValueFromObj(options,['isMuti'],false));
+                var requestData = {};
+                if(options.extraParams ){
+                    for(var key in options.extraParams){
+                        requestData[key] = options.extraParams[key];
+                    }
+                }
+                if(options.useFormKey && options.formValues){
+                    //浣跨敤琛ㄥ崟涓婄殑瀛楁鏉ヨ繃婊�
+                    requestData['conditionMap["' + (options.paramForFormKey?options.paramForFormKey:options.useFormKey)  + '"]'] = options.formValues[options.useFormKey];
+                }
+                if(options.where ){
+                    for(var key in options.where){
+                        requestData['conditionMap["' + key + '"]'] = options.where[key];
+                    }
+                }
+                var copyParam = ['referField','referBo','textField','valueField','displayTable','whereSql','isMuti','queryScheme'];
+                for(var i= 0 ; i < copyParam.length ; i ++){
+                    requestData[copyParam[i]] = options[copyParam[i]];
+                }
+                if(!requestData['referBo']){
+                    requestData['referBo'] = options.referType;
+                }
+                if(options.tableConfig && options.tableConfig.cols && options.tableConfig.cols.length>0){
+                    //璇存槑浼犻�掍簡鐨�
+                    var hasIndex = false;
+                    var hasCheck = false;
+                    layui.each(options.tableConfig.cols,function (_index,_item){
+                        if(_item.field == layui.table.config.indexName){
+                            hasIndex = true;
+                        }
+                        if(_item.field == layui.table.config.checkName){
+                            hasCheck = true;
+                        }
+                    });
+                    if(!hasIndex){
+                        options.tableConfig.cols.unshift(layui.table.getIndexColumn());
+                    }
+                    if(!hasCheck){
+                        options.tableConfig.cols.unshift(layui.table.getCheckColumn());
+                    }
+                }
+                //璇存槑鏄嚜瀹氫箟鐨勮〃鏍�
+                var tableConfig = options.tableConfig||{
+                    page: {
+                        limit: 15,
+                        page: 1
+                    },
+                    cols: [layui.table.getIndexColumn(), layui.table.getCheckColumn(), {
+                        field: 'id',
+                        title: '鑻辨枃鍚嶇О',
+                        sort:true,
+                        width: 150
+                    }, {
+                        field: 'name',
+                        title: '涓枃鍚嶇О',
+                        sort:true,
+                        width: 150
+                    },{
+                        field: 'description',
+                        title: '鎻忚堪',
+                        width: 250
+                    },{
+                        field:'secretGradeText',
+                        title:'瀵嗙骇',
+                        width: 60,
+                        hidden:(!configData.controllerSecret)
+                    }],
+                    queryColumns: [
+                        {
+                            field: 'id',
+                            title: '鑻辨枃鍚嶇О'
+                        }, {
+                            field: 'name',
+                            title: '涓枃鍚嶇О'
+                        }
+                    ]
+                };
+                //鍙互瀹氫箟琛ㄦ牸浜�
+                table.render({
+                    elem:'#referGrid_' + filter + '_' + name,
+                    id:tableId,
+                    backPath: options.backPath?options.backPath:that.backPath,
+                    url:'uiDataController/defaultReferDataGrid',
+                    page:tableConfig.page,
+                    height:options.height?options.height:475,
+                    where:requestData,
+                    method:options.method,
+                    selectMode:isMuti?table.selectMode.muti:table.selectMode.single,
+                    cols:[tableConfig.cols],
+                    initSort:options.initSort,
+                    remoteSort:options.remoteSort
+                });
+                that.showSearchHtml(tableConfig.queryColumns,tableId,filter,name,requestData);
+            });
+        }
+    };
+    ReferGrid.prototype.showSearchHtml =function(queryColumns,tableId,filter,name,requestData){
+        //璁剧疆鏌ヨ鍖哄煙
+        var that = this;
+        var table = layui.table;
+        var toolbarElem = $('[layui-filter="referGrid_toolbar_' + filter + '_' + name +'"]');
+        if(queryColumns){
+            var toolbarHtml = '<div class="layui-form-item" style="height:24px;display:inline-block"> '
+                + '<div class="layui-input-inline" style="height:24px;line-height:24px;width:120px;min-width: 120px"><select name="referGrid_search_'+ filter + '_' + name +'" style="height:24px;width:120px;padding-right: 10px;">';
+            layui.each(queryColumns,function(_index,queryRecord){
+                toolbarHtml += '<option value="' + queryRecord.field + '" >' + queryRecord.title + '</option>';
+            });
+            toolbarHtml += '</select></div>';
+            toolbarHtml += '<div class="layui-input-inline"><input type="text" style="height:24px" name="referGrid_searchvalue_'+ filter + '_' + name +'" placeholder="杈撳叆鍊煎悗杩涜妯$硦鏌ヨ" class="layui-input" ></div>';
+            toolbarHtml += '<div class="layui-input-inline" ><button class="layui-btn" style="height:24px;line-height:24px" name="referGrid_searchbtn_'+ filter + '_' + name +'" >鏌ヨ</button></div>';
+            toolbarHtml += '</div>';
+            toolbarElem.html(toolbarHtml);
+            layui.form.render('select');
+            $('[name="referGrid_searchbtn_'+ filter + '_' + name +'"]').click(function(){
+                var searchField = $(this).parent().parent().find('select').val();
+                var searchValue = $(this).parent().parent().find('[name="referGrid_searchvalue_' + filter + '_' + name + '"]').val();
+                that.queryByCondition(tableId,requestData,searchField,searchValue);
+            });
+            $('[name="referGrid_searchvalue_'+ filter + '_' + name +'"]').keydown(function(e){
+                if(e.keyCode == 13) {
+                    var searchField = $(this).parent().parent().find('select').val();
+                    var searchValue = $(this).val();
+                    that.queryByCondition(tableId, requestData, searchField,searchValue);
+                }
+            });
+            $('[name="referGrid_searchvalue_'+ filter + '_' + name +'"]').focus()
+        }
+    };
+    ReferGrid.prototype.queryByCondition = function(tableId,requestData,searchField,searchValue){
+        if($webUtil.isNotNull(searchValue)){
+            searchValue = "*" + searchValue + "*";
+        }
+        requestData['conditionMap["' + searchField + '"]'] = searchValue;
+        requestData['page']= 1;
+        var table = layui.table;
+        table.reload(
+            tableId, {
+                where: requestData
+            }
+        );
+    }
+    ReferGrid.prototype.setConfig=function(filter,name,options){
+        var that = this;
+        if(!that.referConfig){
+            that.referConfig = {};
+        }
+        that.referConfig[filter + "_" + name] = options;
+    };
+    ReferGrid.prototype.getConfig=function(filter,name){
+        var that = this;
+        if(!that.referConfig){
+            that.referConfig = {};
+        }
+        if((filter + "_" + name) in that.referConfig){
+            return that.referConfig[filter + "_" + name];
+        }
+    };
+    ReferGrid.prototype.getSelectValue = function(filter,name,isMuti){
+        var that = this;
+        var table = layui.table;
+        var config = that.getConfig(filter,name);
+        var selectValue = {};
+        var checkStatus = table.checkStatus('referGrid_' + filter + "_" + name);
+        if(checkStatus.data.length>0){
+            if(!isMuti && checkStatus.data.length>1){
+                $webUtil.showErrorMsg("姣忔鍙兘閫夋嫨涓�鏉℃暟鎹�");
+                return false;
+            }
+            var value = "";
+            var rawValue = "";
+            config.valueField = config.valueField?config.valueField:that.defaultConfig.valueField;
+            config.textField = config.textField?config.textField:that.defaultConfig.textField;
+            var isMutiValue = (config.valueField.indexOf(",")>-1);
+            var isMutiRaw = (config.textField.indexOf(",")>-1);
+            layui.each(checkStatus.data,function(_index,item){
+                if(isMutiValue){
+                    var valueFieldArray = config.valueField.split(",");
+                    layui.each(valueFieldArray,function(_indexField,_itemField){
+                        value += item[_itemField] + (config.valueSep?config.valueSep:' ');
+                    });
+                    value+= ",";
+                }else {
+                    value += item[config.valueField] + ",";
+                }
+                if(isMutiRaw) {
+                    var rawFieldArray = config.textField.split(",");
+                    layui.each(rawFieldArray,function(_indexField,_itemField){
+                        rawValue += item[_itemField] + (config.textSep?config.textSep:' ');
+                    });
+                    rawValue+= ",";
+                }else{
+                    rawValue += item[config.textField] + ",";
+                }
+            });
+            if($webUtil.endWith(value,",")){
+                value = value.substring(0,value.length - 1);
+            }
+            if($webUtil.endWith(rawValue,",")){
+                rawValue = rawValue.substring(0,rawValue.length -1);
+            }
+            selectValue = {
+                value : value,
+                rawValue : rawValue,
+                allValues: checkStatus.data
+            };
+            return selectValue;
+        }else{
+            return false;
+        }
+    };
+    ReferGrid.prototype.doResize = function(filter,name){
+
+    };
+
+    ReferGrid.prototype.destory = function(filter,name){
+        //閿�姣�
+        var that = this;
+        if($('#referGrid_' + filter + '_' + name)){
+            $('#referGrid_' + filter + '_' + name).remove();
+        }
+        if(!that.referConfig){
+            that.referConfig = {};
+        }
+        if((filter + "_" + name) in that.referConfig){
+            delete that.referConfig[filter + "_" + name];
+        }
+    };
+    var rg = new ReferGrid();
+    exports('vciWebReferDefalut',rg);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebReferGrid.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebReferGrid.js
new file mode 100644
index 0000000..7d1f5a9
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebReferGrid.js
@@ -0,0 +1,344 @@
+layui.define(['layer'],function(exports){
+	/**
+	 * 鍙傜収鐨勫垪琛ㄦ
+	 * weidy@2018-03-08
+	 */
+	var ReferGrid = function(){
+		this.defaultConfig = {
+			gridUrl:'/webReferController/referDataGrid',//琛ㄦ牸鐨勫弬鐓ц矾寰�
+			tableDefinedUrl:'/webReferController/getTableDefine',
+			valueField:'oid',//鍊肩殑瀛楁
+			textField:'name'//鏄剧ず鐨勫瓧娈�
+		};
+		this.backPath= configData.compatibility ? path : configData.objectServicePath
+	};
+	ReferGrid.prototype.init = function(){
+
+	};
+	ReferGrid.prototype.showReferDialog = function (referConfig){
+		var filter = referConfig.filter,
+			name = referConfig.name,
+			title = referConfig.title,
+			valueInfo = ($webUtil.isNotNull(referConfig.text)?("宸茶缃殑鍊间负[" +referConfig.text +"]"):'鏈缃��'),
+			isMuti = referConfig.isMuti,
+			target = referConfig.target,
+			value = referConfig.value,
+			text = referConfig.text;
+		if(filter.indexOf('.')>-1){
+			filter=filter.split('.')[0]+'-'+filter.split('.')[1];
+		}
+		if(name.indexOf('.')>-1){
+			name=name.split('.')[0]+'-'+name.split('.')[1];
+		}
+		var options = referConfig.options;
+		var me = this;
+		var referFilter = filter+"_" + name;
+		var referIndex = $webUtil.dialog({
+			title:title,
+			btn:['纭畾','鍙栨秷'],
+			content:'<div layui-filter="referGrid_toolbar_' + referFilter + '" class="layui-table-toolbar "  style="margin: 5px 0 5px 0"></div><div style="margin: 0 5px"><table class="layui-table layui-referGrid" lay-size="sm" lay-even layui-filter="referGrid_' + referFilter + '" id="referGrid_' + referFilter + '" ></table></div>',
+			area:[(($webUtil.isNotNull(options.width) && options.width*1>1) ?options.width*1 : 1000) +'px',
+				(($webUtil.isNotNull(options.height) && options.height*1>1) ?options.height*1 : 625) + 'px'],
+			btnBefore:valueInfo,
+			resizing:function(layero){
+				me.doResize(filter,name);
+			},
+			yes:function(index,layero){
+				var selectValue = me.getSelectValue(filter,name,isMuti);
+				if(selectValue){
+					target.setValue(filter,name,selectValue.value,selectValue.rawValue,true,selectValue.allValues);
+					layer.close(referIndex);
+				}
+			},
+			success:function(layero){
+				me.showGrid(filter,name,options,value,text);
+			}
+		});
+	};
+	//鏄剧ず
+	ReferGrid.prototype.showGrid=function(filter,name,options,value,rawValue){
+		var that = this;
+		that.setConfig(filter,name,options);
+
+		if($('#referGrid_' + filter + '_' + name).children().length>0){
+			$('#referGrid_' + filter + '_' + name).show();
+		}else{
+			var tableId = 'referGrid_' + filter + '_' + name;
+			layui.use('table',function(){//鍥犱负table閲屽紩鐢ㄤ簡form ,form閲屽紩鐢ㄤ簡杩欓噷
+				var table = layui.table;
+				var isMuti = $webUtil.getBoolean($webUtil.getValueFromObj(options,['isMuti'],false));
+				var requestData = {};
+                if(options.extraParams ){
+                    for(var key in options.extraParams){
+                        requestData[key] = options.extraParams[key];
+                    }
+                }
+                if(options.useFormKey && options.formValues){
+                    //浣跨敤琛ㄥ崟涓婄殑瀛楁鏉ヨ繃婊�
+                    requestData['conditionMap["' + (options.paramForFormKey?options.paramForFormKey:options.useFormKey)  + '"]'] = options.formValues[options.useFormKey];
+                }
+                if(options.where ){
+                    for(var key in options.where){
+                        requestData['conditionMap["' + key + '"]'] = options.where[key];
+                    }
+                }
+				var copyParam = ['referBo','textField','valueField','displayTable','whereSql','isMuti','queryScheme'];
+				for(var i= 0 ; i < copyParam.length ; i ++){
+					requestData[copyParam[i]] = options[copyParam[i]];
+				}
+				if(!requestData['referBo']){
+					requestData['referBo'] = options.referType;
+				}
+				if($webUtil.isNotNull(options.displayTable)){
+					//璇存槑鏄娇鐢ㄥ钩鍙扮殑琛ㄦ牸
+					$webUtil.post(that.defaultConfig.tableDefinedUrl,{btmType:(options.referBo||options.referType),code:options.displayTable,isMuti:isMuti},function(result){
+						if(result.success){
+							var queryScheme = result.querySchema;
+							if($webUtil.isNotNull(queryScheme) && $webUtil.isNull(options.queryScheme)){
+								options.queryScheme = queryScheme;
+							}
+							requestData['queryScheme'] = options.queryScheme;
+							var cols = [];
+							if(result.showIndex){
+								cols.push({field:'LAY_TABLE_INDEX',type:'numbers',title:'搴忓彿'});
+							}
+							if(result.showCheckbox){
+								cols.push({field:'LAY_CHECKED',type:'checkbox'});
+							}
+							var referColumn = "";
+							if(result.columns){
+								layui.each(result.columns,function(_index,record){
+									var col = record;
+									if(col.field.indexOf(".")>-1){
+										referColumn += col.field + ",";
+										col.field = col.field.replace(".","_");
+									}
+									if($webUtil.isNotNull(col.enumCode)){
+										//鏄灇涓剧殑鍐呭
+										var vciWebComboxStore = layui.vciWebComboxStore;
+										vciWebComboxStore.newCombox(col.enumCode,{
+											data:col.enumMap
+										});
+										col.templet=function(d,thisItem){
+											var vciWebComboxStore = layui.vciWebComboxStore;
+											return vciWebComboxStore.getComboxText(thisItem.enumCode,d[thisItem.field]);
+										};
+									}
+									cols.push(col);
+								});
+							}
+							requestData['referColumn'] = referColumn;
+							var pageObject = false;
+							if(result.limit>0){
+								pageObject = {
+										limit:result.limit,
+										page:1
+								};
+							}
+							//鍙互瀹氫箟琛ㄦ牸浜�
+							table.render({
+								elem:'#referGrid_' + filter + '_' + name,
+								id:tableId,
+								backPath:options.backPath?options.backPath:that.backPath,
+								url:options.url,
+								page:pageObject,
+								height:options.height?options.height:475,
+								where:requestData,
+								selectMode:isMuti?table.selectMode.muti:table.selectMode.single,
+								cols:[cols],
+								initSort:options.sortKey,
+								remoteSort:options.remoteSort
+							});
+                            that.showSearchHtml(tableConfig.queryColumns,tableId,filter,name,requestData);
+						}else{
+							$webUtil.showErrorMsg(result.msg);
+						}
+					});
+				}else{
+					//璇存槑鏄嚜瀹氫箟鐨勮〃鏍�
+					var tableConfig = options.tableConfig;
+					if(!tableConfig){
+						$webUtil.showErrorMsg("娌℃湁瀹氫箟鍙傜収鐨勮〃鏍奸厤缃�");
+					}
+                    if(!requestData){
+                        requestData = {
+                            currentUserReferModelKey:options.currentUserReferModelKey,
+                            currentUserReferMethodKey:options.currentUserReferMethodKey
+                        };
+                    }else{
+                        requestData['currentUserReferModelKey'] = options.currentUserReferModelKey;
+                        requestData['currentUserReferMethodKey'] = options.currentUserReferMethodKey;
+                    }
+					if(options.tableConfig && options.tableConfig.cols && options.tableConfig.cols.length>0){
+						//璇存槑浼犻�掍簡鐨�
+						var hasIndex = false;
+						var hasCheck = false;
+						layui.each(options.tableConfig.cols,function (_index,_item){
+							if(_item.field == layui.table.config.indexName){
+								hasIndex = true;
+							}
+							if(_item.field == layui.table.config.checkName){
+								hasCheck = true;
+							}
+						});
+						if(!hasIndex){
+							options.tableConfig.cols.unshift(layui.table.getIndexColumn());
+						}
+						if(!hasCheck){
+							options.tableConfig.cols.unshift(layui.table.getCheckColumn());
+						}
+					}
+                    //鍙互瀹氫箟琛ㄦ牸浜�
+                    table.render({
+                        elem:'#referGrid_' + filter + '_' + name,
+						id:tableId,
+						backPath:options.backPath?options.backPath:that.backPath,
+                        url:options.url,
+                        page:tableConfig.page,
+                        height:options.height?options.height:475,
+                        where:requestData,
+						method:options.method,
+                        selectMode:isMuti?table.selectMode.muti:table.selectMode.single,
+                        cols:[tableConfig.cols],
+						initSort:options.initSort,
+						remoteSort:options.remoteSort
+                    });
+					that.showSearchHtml(tableConfig.queryColumns,tableId,filter,name,requestData);
+				}
+			});
+		}
+	};
+    ReferGrid.prototype.showSearchHtml =function(queryColumns,tableId,filter,name,requestData){
+        //璁剧疆鏌ヨ鍖哄煙
+		var that = this;
+		var table = layui.table;
+        var toolbarElem = $('[layui-filter="referGrid_toolbar_' + filter + '_' + name +'"]');
+        if(queryColumns){
+            var toolbarHtml = '<div class="layui-form-item" style="height:24px;float:left;display:inline-block"> '
+                + '<div class="layui-input-inline" style="height:24px;line-height:24px;width:120px;min-width: 120px"><select name="referGrid_search_'+ filter + '_' + name +'" style="height:24px;width:120px;padding-right: 10px;">';
+            layui.each(queryColumns,function(_index,queryRecord){
+                toolbarHtml += '<option value="' + queryRecord.field + '" >' + queryRecord.title + '</option>';
+            });
+            toolbarHtml += '</select></div>';
+            toolbarHtml += '<div class="layui-input-inline"><input type="text" style="height:24px" name="referGrid_searchvalue_'+ filter + '_' + name +'" placeholder="杈撳叆鍊煎悗杩涜妯$硦鏌ヨ" class="layui-input" ></div>';
+            toolbarHtml += '<div class="layui-input-inline" ><button class="layui-btn" style="height:24px;line-height:24px" name="referGrid_searchbtn_'+ filter + '_' + name +'" >鏌ヨ</button></div>';
+            toolbarHtml += '</div>';
+            toolbarElem.html(toolbarHtml);
+            layui.form.render('select');
+			$('[name="referGrid_searchbtn_'+ filter + '_' + name +'"]').click(function(){
+				var searchField = $(this).parent().parent().find('select').val();
+				var searchValue = $(this).parent().parent().find('[name="referGrid_searchvalue_' + filter + '_' + name + '"]').val();
+				that.queryByCondition(tableId,requestData,searchField,searchValue);
+			});
+			$('[name="referGrid_searchvalue_'+ filter + '_' + name +'"]').keydown(function(e){
+				if(e.keyCode == 13) {
+					var searchField = $(this).parent().parent().find('select').val();
+					var searchValue = $(this).val();
+					that.queryByCondition(tableId, requestData, searchField,searchValue);
+				}
+			});
+			$('[name="referGrid_searchvalue_'+ filter + '_' + name +'"]').focus()
+        }
+	};
+	ReferGrid.prototype.queryByCondition = function(tableId,requestData,searchField,searchValue){
+		if($webUtil.isNotNull(searchValue)){
+			searchValue = "*" + searchValue + "*";
+		}
+		requestData['conditionMap["' + searchField + '"]'] = searchValue;
+		requestData['page']= 1;
+		var table = layui.table;
+		table.reload(
+			tableId, {
+				where: requestData
+			}
+		);
+	}
+	ReferGrid.prototype.setConfig=function(filter,name,options){
+		var that = this;
+		if(!that.referConfig){
+			that.referConfig = {};
+		}
+		that.referConfig[filter + "_" + name] = options;
+	};
+	ReferGrid.prototype.getConfig=function(filter,name){
+		var that = this;
+		if(!that.referConfig){
+			that.referConfig = {};
+		}
+		if((filter + "_" + name) in that.referConfig){
+			return that.referConfig[filter + "_" + name];
+		}
+	};
+	ReferGrid.prototype.getSelectValue = function(filter,name,isMuti){
+		var that = this;
+		var table = layui.table;
+		var config = that.getConfig(filter,name);
+		var selectValue = {};
+		var checkStatus = table.checkStatus('referGrid_' + filter + "_" + name);
+		if(checkStatus.data.length>0){
+			if(!isMuti && checkStatus.data.length>1){
+				$webUtil.showErrorMsg("姣忔鍙兘閫夋嫨涓�鏉℃暟鎹�");
+				return false;
+			}
+			var value = "";
+			var rawValue = "";
+			config.valueField = config.valueField?config.valueField:that.defaultConfig.valueField;
+			config.textField = config.textField?config.textField:that.defaultConfig.textField;
+			var isMutiValue = (config.valueField.indexOf(",")>-1);
+			var isMutiRaw = (config.textField.indexOf(",")>-1);
+			layui.each(checkStatus.data,function(_index,item){
+				if(isMutiValue){
+					var valueFieldArray = config.valueField.split(",");
+					layui.each(valueFieldArray,function(_indexField,_itemField){
+						value += item[_itemField] + (config.valueSep?config.valueSep:' ');
+					});
+					value+= ",";
+				}else {
+					value += item[config.valueField] + ",";
+				}
+				if(isMutiRaw) {
+					var rawFieldArray = config.textField.split(",");
+					layui.each(rawFieldArray,function(_indexField,_itemField){
+						rawValue += item[_itemField] + (config.textSep?config.textSep:' ');
+					});
+					rawValue+= ",";
+				}else{
+					rawValue += item[config.textField] + ",";
+				}
+			});
+			if($webUtil.endWith(value,",")){
+				value = value.substring(0,value.length - 1);
+			}
+			if($webUtil.endWith(rawValue,",")){
+				rawValue = rawValue.substring(0,rawValue.length -1);
+			}
+			selectValue = {
+					value : value,
+					rawValue : rawValue,
+					allValues: checkStatus.data
+			};
+			return selectValue;
+		}else{
+			return false;
+		}
+	};
+	ReferGrid.prototype.doResize = function(filter,name){
+
+	};
+
+	ReferGrid.prototype.destory = function(filter,name){
+		//閿�姣�
+		var that = this;
+		if($('#referGrid_' + filter + '_' + name)){
+			$('#referGrid_' + filter + '_' + name).remove();
+		}
+		if(!that.referConfig){
+			that.referConfig = {};
+		}
+		if((filter + "_" + name) in that.referConfig){
+			delete that.referConfig[filter + "_" + name];
+		}
+	};
+	var rg = new ReferGrid();
+	exports('vciWebReferGrid',rg);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebReferStand.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebReferStand.js
new file mode 100644
index 0000000..ed27295
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebReferStand.js
@@ -0,0 +1,188 @@
+layui.define(['layer'],function(exports){
+    /**
+     * stand绫诲瀷鍙傜収
+     * wangting@2021-3-29
+     */
+    var ReferStand = function(){
+        this.defaultConfig = {
+            valueField:'oid',//鍊肩殑瀛楁
+            textField:'name'//鏄剧ず鐨勫瓧娈�
+        };
+    };
+    ReferStand.prototype.init = function(options){
+
+    };
+    ReferStand.prototype.showReferDialog = function (referConfig){
+        var filter = referConfig.filter,
+            name = referConfig.name,
+            title = referConfig.title,
+            valueInfo = ($webUtil.isNotNull(referConfig.text)?("宸茶缃殑鍊间负[" +referConfig.text +"]"):'鏈缃��'),
+            isMuti = referConfig.isMuti,
+            target = referConfig.target,
+            value = referConfig.value,
+            text = referConfig.text;
+        if(filter.indexOf('.')>-1){
+            filter=filter.split('.')[0]+'-'+filter.split('.')[1];
+        }
+        if(name.indexOf('.')>-1){
+            name=name.split('.')[0]+'-'+name.split('.')[1];
+        }
+        var me = this;
+        if(!referConfig.options){
+            referConfig.options={
+                width:1000,
+                height:625
+            }
+        }else{
+            $.extend(referConfig.options, {
+                width:1000,
+                height:625
+            });
+        }
+
+        if(referConfig.options.referContent.indexOf('?')!=-1){
+            var params=referConfig.options.referContent.split('?')[1].split('&');
+            referConfig.options.referContent=referConfig.options.referContent.split('?')[0];
+            for (var pi=0;pi<params.length;pi++){
+                try {
+                    referConfig.options[params.split('=')[0]]=params.split('=')[1]
+                }catch (e) {}
+            }
+        }
+        //灞曠ずUI涓婁笅鏂�
+        layui.use('platform/objectService/VciUIContentViewer', function () {
+            var newUI = layui['platform/objectService/VciUIContentViewer'];
+            newUI.id = name;
+            newUI.sourceData=null;
+            newUI.actionData=null;
+            var content = ['<div id="referStand_', filter, '" lay-filter="referStand_', filter, '" style="margin:15px 20px;" >', newUI.getContent(name), '</div>']
+            var referIndex = layer.open({
+                type: 1,
+                title: title,
+                //skin: 'layui-layer-lan',
+                content: content.join(''),
+                maxWidth: $(window).width() - 100,
+                maxHeight: $(window).height() - 200,
+                shade: true,
+                shadeClose: true,
+                resize: true,
+                btn: ['纭畾', '鍙栨秷'],
+                area:[referConfig.options.width+'px',referConfig.options.height+'px'],
+                btnBefore:valueInfo,
+                closeBtn: 1,
+                resizing: function (layero) {
+                },
+                success: function (layero) {
+                    newUI.init(name, {
+                        btmType: referConfig.options.referType,
+                        content: referConfig.options.referContent
+                    })
+                    me.setConfig(filter,name,referConfig.options);
+                },
+                yes: function (layero) {
+                    var selectData = newUI.config[name].checkedData['westAreas'];
+                    if (newUI.config[name].checkedData['centerAreas'].length > 0) {
+                        selectData = newUI.config[name].checkedData['centerAreas'];
+                    } else if (newUI.config[name].checkedData['southAreas'].length > 0) {
+                        selectData = newUI.config[name].checkedData['southAreas'];
+                    }
+                    if(selectData.length<1){
+                        $webUtil.showErrorMsg("璇烽�夋嫨鏁版嵁");
+                        return false;
+                    }
+                    var selectValue = me.getSelectValue(filter,selectData, isMuti);
+                    if (selectValue) {
+                        target.setValue(filter, name, selectValue.value, selectValue.rawValue, true, selectValue.allValues);
+                        layer.close(referIndex);
+                    }
+                }
+            });
+        });
+    };
+    ReferStand.prototype.setConfig=function(filter,name,options){
+        var that = this;
+        if(!that.referConfig){
+            that.referConfig = {};
+        }
+        that.referConfig[filter] = options;
+    };
+    ReferStand.prototype.getConfig=function(filter){
+        var that = this;
+        if(!that.referConfig){
+            that.referConfig = {};
+        }
+        if(filter in that.referConfig){
+            return that.referConfig[filter];
+        }
+    };
+    ReferStand.prototype.getSelectValue = function(filter,checkStatus,isMuti){
+        var that = this;
+        var config = that.getConfig(filter);
+        var selectValue = {};
+        if(checkStatus.length>0){
+            if(!isMuti && checkStatus.length>1){
+                $webUtil.showErrorMsg("姣忔鍙兘閫夋嫨涓�鏉℃暟鎹�");
+                return false;
+            }
+            var value = "";
+            var rawValue = "";
+            config.valueField = config.valueField?config.valueField:that.defaultConfig.valueField;
+            config.textField = config.textField?config.textField:that.defaultConfig.textField;
+            var isMutiValue = (config.valueField.indexOf(",")>-1);
+            var isMutiRaw = (config.textField.indexOf(",")>-1);
+            layui.each(checkStatus,function(_index,item){
+                if(isMutiValue){
+                    var valueFieldArray = config.valueField.split(",");
+                    layui.each(valueFieldArray,function(_indexField,_itemField){
+                        value += item[_itemField] + (config.valueSep?config.valueSep:' ');
+                    });
+                    value+= ",";
+                }else {
+                    value += item[config.valueField] + ",";
+                }
+                if(isMutiRaw) {
+                    var rawFieldArray = config.textField.split(",");
+                    layui.each(rawFieldArray,function(_indexField,_itemField){
+                        rawValue += item[_itemField] + (config.textSep?config.textSep:' ');
+                    });
+                    rawValue+= ",";
+                }else{
+                    rawValue += item[config.textField] + ",";
+                }
+            });
+            if($webUtil.endWith(value,",")){
+                value = value.substring(0,value.length - 1);
+            }
+            if($webUtil.endWith(rawValue,",")){
+                rawValue = rawValue.substring(0,rawValue.length -1);
+            }
+            selectValue = {
+                value : value,
+                rawValue : rawValue,
+                allValues: checkStatus
+            };
+            return selectValue;
+        }else{
+            return false;
+        }
+    };
+    ReferStand.prototype.doResize = function(filter,name){
+
+    };
+
+    ReferStand.prototype.destory = function(filter,name){
+        //閿�姣�
+        var that = this;
+        if($('#referStand_' + filter )){
+            $('#referStand_' + filter ).remove();
+        }
+        if(!that.referConfig){
+            that.referConfig = {};
+        }
+        if((filter ) in that.referConfig){
+            delete that.referConfig[filter];
+        }
+    };
+    var rg = new ReferStand();
+    exports('vciWebReferStand',rg);
+});
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebReferTree.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebReferTree.js
new file mode 100644
index 0000000..4a0c379
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebReferTree.js
@@ -0,0 +1,283 @@
+layui.define(['layer','tree'],function(exports){
+	/**
+	 * 鍙傜収鏍�
+	 * weidy@2018-03-16
+	 */
+	var ReferTree = function(){
+		this.defaultConfig = {
+				treeUrl:'/webReferController/referTree',//鏍戠殑鍙傜収璺緞
+				valueField:'oid',//鍊肩殑瀛楁
+				textField:'name',//鏄剧ず鐨勫瓧娈�
+			    loadType:'node'
+		}
+	};
+	ReferTree.prototype.init = function(){
+
+	};
+	ReferTree.prototype.showReferDialog = function (referConfig){
+		//鍙傜収鐨勬帴鍙�
+		var filter = referConfig.filter,
+			name = referConfig.name,
+			title = referConfig.title,
+			valueInfo = ($webUtil.isNotNull(referConfig.text)?("宸茶缃殑鍊间负[" +referConfig.text +"]"):'鏈缃��'),
+			isMuti = referConfig.isMuti,
+			target = referConfig.target,
+			value = referConfig.value,
+			text = referConfig.text;
+		var options = referConfig.options;
+		var me = this;
+		var referFilter = filter+"_" + name;
+		var referIndex = $webUtil.dialog({
+			title:title,
+			btn:['纭畾','鍙栨秷'],
+			content:'<div layui-filter="referTree_toolbar_' + referFilter + '" class="layui-tree-toolbar" ></div><ul layui-filter="referTree_' + referFilter + '" id="referTree_' + referFilter + '" style="margin: 5px;"></ul>',
+			area:[(($webUtil.isNotNull(options.width) && options.width*1>1) ?options.width*1 : 500) +'px',
+				(($webUtil.isNotNull(options.height) && options.height*1>1) ?options.height*1 : 625) + 'px'],
+			btnBefore:valueInfo,
+			resizing:function(layero){
+				me.doResize(filter,name);
+			},
+			yes:function(index,layero){
+				//if(isMuti) {
+					var selectValue = me.getSelectValue(filter, name);
+					if(selectValue.allValues.length>500){
+						$webUtil.showErrorMsg("閫夋嫨杩囧锛岄�夋嫨鏁伴噺涓嶈瓒呰繃500");
+						return false;
+					}else if(selectValue.allValues.length==0){
+						$webUtil.showErrorMsg("璇烽�夋嫨鏁版嵁");
+						return false;
+					}
+					if (selectValue) {
+						target.setValue(filter, name, selectValue.value, selectValue.rawValue, true,selectValue.allValues);
+						layer.close(referIndex);
+					}
+				//}else{
+					//layer.close(referIndex);
+				//}
+			},
+			success:function(layero){
+				me.showTree(filter,name,options,value,text,function(thisFilter,thisName,selectValue){
+					target.setValue(thisFilter,thisName,selectValue.value,selectValue.rawValue,true,selectValue.allValues);
+					layer.close(referIndex);
+				});
+			}
+		});
+	};
+	//鏄剧ず
+	ReferTree.prototype.showTree=function(filter,name,options,value,rawValue,clickCallback){
+		var that = this;
+		options.singleClickCallback = clickCallback;
+		that.setConfig(filter,name,options);
+
+		if($('#referTree_' + filter + '_' + name).children().length>0){
+			layui.tree.clearCheckData(filter + '_' + name);
+			$('#referTree_' + filter + '_' + name).show();
+		}else{
+			var tree = layui.tree;
+			//layui.use('tree',function(){
+				var requestData = {};
+				 if(options.extraParams){
+				 	requestData = options.extraParams;
+				 }
+				var url = $webUtil.getValueFromObj(options,'url',that.defaultConfig.treeUrl);
+				var copyParam = ['btmType','lnType','toBtmType','textField','valueField','parentFieldName','parentValue','sort','order','isDirection','whereSql','isMuti','queryScheme','isQueryAllColumn','queryColumn','split','loadType','onlyLeaf','onlyLeafText','parentUsedField'];
+				var allOptions = {};
+				var tempDefaultConfig = {};
+				for(var key in that.defaultConfig){
+					tempDefaultConfig[key] = that.defaultConfig[key];
+				}
+				$.extend(allOptions,tempDefaultConfig,options);
+				for(var i= 0 ; i < copyParam.length ; i ++){
+					if(copyParam[i] == "btmType") {
+						requestData[copyParam[i]] = options['referBo'] || options['referType'];
+					}else if(copyParam[i] in options){
+						requestData[copyParam[i]] = options[copyParam[i]];
+					}
+				}
+				requestData['referBo'] = options['referBo'] || options['referType'];
+				requestData['selectAllLevel'] = (options.loadType == layui.tree.loadType.all?true:false);//true鏃跺悗鍙颁細鎶ラ敊
+				if(requestData.isMuti =="true"){
+					requestData.muti =true;
+				}
+				if(requestData.isQueryAllColumn =="true"){
+					requestData.isQueryAllColumn = true;
+				}
+				if(options.useFormKey && options.formValues){
+					//浣跨敤琛ㄥ崟涓婄殑瀛楁鏉ヨ繃婊�
+					requestData['conditionMap["' + (options.paramForFormKey?options.paramForFormKey:options.useFormKey)  + '"]'] = options.formValues[options.useFormKey];
+				}
+				//鏄剧ずtree
+				var treeOptions = {
+					url:url,
+					//extraParams:requestData,
+					treeFilter:filter,
+					treeName:name,
+					requestType:options.requestType,
+					referSingleSelect:true,
+					showSearch:true,
+					loadType:options.loadType,
+					click:function(item,elem,options){
+						//that.doClick(item,elem,options);
+						//return false;
+					}
+				};
+				if(options.remoteSort) {
+					treeOptions.initSort = options.initSort;
+					treeOptions.remoteSort = options.remoteSort;
+				}
+				$.extend(treeOptions,allOptions);
+				treeOptions.extraParams = requestData;
+				if(options.rootParams){
+					treeOptions.rootParams = options.rootParams;
+				}
+
+				if(options.conditionParams){
+					treeOptions.conditionParams = options.conditionParams;
+				}
+				if(!treeOptions.conditionParams){
+					treeOptions.conditionParams ={};
+				}
+				if(options.where ) {
+					for (var key in options.where) {
+						treeOptions.conditionParams[key] = options.where[key];
+					}
+				}
+				if(options.treeExtandParams){
+					treeOptions.treeExtandParams = options.treeExtandParams;
+				}
+				if(options.data){//濡傛灉鏄浐瀹氭暟鎹殑鎯呭喌涓�
+					delete treeOptions.url;
+					treeOptions['nodes'] = options.data;
+				}
+				if(options.backPath){
+					treeOptions.backPath = options.backPath;
+				}
+				that.setConfig(filter,name,$.extend(tempDefaultConfig,options));
+				tree.init(filter + "_" + name,$('#referTree_' + filter + '_' + name),treeOptions);
+			//});
+		}
+	};
+	ReferTree.prototype.doClick = function(item,elem,options){
+		//澶勭悊鐐瑰嚮浜嬩欢
+		var that = this;
+		var filter = options.treeFilter;
+		var name = options.treeName;
+		var config = that.getConfig(filter,name);
+		var selectRecords = that.switchSelectData([item],config);
+		if(!selectRecords){
+			return false;
+		}
+		if(options.isMuti != "true" && options.isMuti != true){
+			if(options.singleClickCallback){
+				options.singleClickCallback(filter,name,selectRecords) ;
+			}
+		}
+        //鍙傜収鐨勫璞″畾涔夌殑
+        if(selectRecords && options.changeListener){
+            options.changeListener(filter,name,selectRecords.value,selectRecords.rawValue,selectRecords.allValues);
+        }
+		//鑾峰彇鍊�
+         return false;
+	};
+	ReferTree.prototype.setConfig=function(filter,name,options){
+		var that = this;
+		if(!that.referConfig){
+			that.referConfig = {};
+		}
+		that.referConfig[filter + "_" + name] = options;
+	};
+	ReferTree.prototype.getConfig=function(filter,name){
+		var that = this;
+		if(!that.referConfig){
+			that.referConfig = {};
+		}
+		if((filter + "_" + name) in that.referConfig){
+			return that.referConfig[filter + "_" + name];
+		}
+	};
+	ReferTree.prototype.getValueByField =function(item,field){
+		if(field.indexOf("attribute.")>=0){
+			return item.attributes[field.replace("attribute.","")];
+		}else{
+			return item.attributes[field] || item[field];
+		}
+	};
+	ReferTree.prototype.switchSelectData = function(data,config){
+		var that = this;
+		var value = "";
+		var rawValue = "";
+		var checkOnlyLeafPass = true;
+		layui.each(data,function(_index,item){
+			if(config.onlyLeaf && "leaf" in item){
+				if(item['leaf'] == false){
+					$webUtil.showErrorMsg(config.onlyLeafText?config.onlyLeafText:"鍙兘閫夋嫨鍙跺瓙鑺傜偣");
+					checkOnlyLeafPass = false;
+					return true;
+				}
+			}
+			value += that.getValueByField(item,config.valueField?config.valueField:that.defaultConfig.valueField) + ",";
+			var tempRaw = [];
+			if(!config.textField){
+				config.textField = that.defaultConfig.textField;
+			}
+			var textFieldArray = config.textField.split(",");
+			for(var i = 0 ; i < textFieldArray.length ; i ++){//鏄剧ず鐨勫瓧娈靛彲鑳芥湁澶氫釜
+				if($webUtil.isNotNull(textFieldArray[i])){
+					tempRaw.push(that.getValueByField(item,textFieldArray[i]));
+				}
+			}
+			rawValue += tempRaw.join(" ") + ",";
+		});
+		if(!checkOnlyLeafPass){
+			return false;
+		}
+		if($webUtil.endWith(value,",")){
+			value = value.substring(0,value.length - 1);
+		}
+		if($webUtil.endWith(rawValue,",")){
+			rawValue = rawValue.substring(0,rawValue.length -1);
+		}
+		var selectValue = {
+			value : value,
+			rawValue : rawValue,
+			allValues : data
+		};
+
+		return selectValue;
+	};
+	ReferTree.prototype.getSelectValue = function(filter,name){
+		var that = this;
+		var tree = layui.tree;
+		var config = that.getConfig(filter,name);
+		var selectValue = {};
+		var checkData = [tree.getSelectNode(filter +"_" +name )];
+		if(config.isMuti){
+			checkData = tree.getAllCheckData(filter +"_" +name );
+		}
+		if(checkData.length>0){
+			return that.switchSelectData(checkData,config);
+		}else{
+			return {allValues:[]};
+		}
+	};
+	ReferTree.prototype.doResize = function(filter,name){
+
+	};
+
+	ReferTree.prototype.destory = function(filter,name){
+		//閿�姣�
+		var that = this;
+		if($('#ReferTree_' + filter + '_' + name)){
+			$('#ReferTree_' + filter + '_' + name).remove();
+		}
+		if(!that.referConfig){
+			that.referConfig = {};
+		}
+		if((filter + "_" + name) in that.referConfig){
+			delete that.referConfig[filter + "_" + name];
+		}
+		//layui.tree.destory(filter + '_' + name);
+	};
+	var referTree = new ReferTree();
+	exports('vciWebReferTree',referTree);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebReminder.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebReminder.js
new file mode 100644
index 0000000..775252a
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebReminder.js
@@ -0,0 +1,89 @@
+/**
+ * Created by dengbk on 2019/3/27.
+ */
+
+/*
+* 棰勮淇℃伅鎻愮ず
+* */
+
+layui.define(['layer','vciWebSocket','util'],function(exports){
+    var Reminder = function(){
+        this.moduleKey = "vciWebReminder";
+        this.basePath = path;
+        this.url = {
+
+        };
+        this.getContent = function(){
+            return '';
+        };
+        this.init = function(){
+            var that = this;
+            var socket = layui.vciWebSocket;
+            var userOid = $webUtil.getSystemVar($webUtil.systemValueKey.userOid)
+            socket.init({
+                wsUrl:"ws://"+that.url,//鏈嶅姟鍣ㄥ湴鍧�
+                HeartBeat:'xxx',//鍙戦�佺殑蹇冭烦鏁版嵁 闃叉澶辨椿
+                timeout:300000,//鍙戦�佸績璺虫暟鎹殑闂撮殧鏃堕棿
+                onopen:function(){
+                    //鎻℃墜鎴愬姛
+                    //console.log("鏈嶅姟杩炴帴鎴愬姛");
+                    socket.send(userOid);//鍙戦�佹暟鎹�
+                },
+                onmessage:function(data){
+                    //鏀跺埌娑堟伅
+                    that.showWarning(data.msg);
+                    that.showTask(data)
+                }
+            });
+
+            //socket.close();//鏂紑杩炴帴
+        };
+        this.showWarning = function(msg){
+            var that = this;
+            var alertHtmlId = $("#systemReminder_tips");
+            alertHtmlId.find("span").html(msg);
+            alertHtmlId.show();
+            window.setTimeout(function(){
+                alertHtmlId.hide()
+            },10000)
+        };
+        this.showTask = function(data){
+            var that = this;
+            var content =[
+                '<div>'+ data.msg +'</div>'
+            ].join("");
+            var showTask = layer.open({
+                type:1,
+                title:'浠诲姟鎻愮ず',
+                btn:['鏌ョ湅浠诲姟','鍙栨秷'],
+                skin:'layui-layer-lan',
+                content:content,
+                area:['400px','250px'],
+                closeBtn:2,
+                shade:true,
+                shadeClose:true,
+                success:function(layero){
+
+                },
+                yes:function(){
+                    $webUtil.showConfirmMsg("纭鏌ョ湅[" + data.taskName + "]浠诲姟?",function () {
+                        var menuObject = {
+                            id:data.id,
+                            text:data.text,
+                            bsUrl:'USEJS:'+data.url,
+                            notAllowFav:true
+                        };
+                        that.showTabByMenu(data.id,menuObject);
+                    });
+                },
+                btn2:function(){
+                    layer.close(showTask);
+                }
+
+            })
+        }
+
+    };
+    var rm = new Reminder();
+    exports("vciWebReminder",rm);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebSocket.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebSocket.js
new file mode 100644
index 0000000..0c358db
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/framework/vciWebSocket.js
@@ -0,0 +1,82 @@
+/**
+ * Created by dengbk on 2019/3/25.
+ */
+
+
+layui.define(['layer'],function(exports){
+    var vciWebSocket = function(){
+        this.url = {
+            //$webUtil.getCurrentUserId()
+            wsUrl:"ws://172.16.0.54:10000/vciMessageServer/mes208/"+$webUtil.getCurrentUserId()+"/"+$webUtil.getCurrentUserId()+""//websocket鍦板潃
+        };
+        this.websocket_connected_count = 0;
+        this.onclose_connected_count = 0;
+        this.config = {
+            //wsUrl:"ws://localhost:10000/vciMessageServer/mes208/renky/renky",//鏈嶅姟鍣ㄥ湴鍧�
+            onopen:function(){
+                //鎻℃墜鎴愬姛
+            },
+            onmessage:function(data){
+                //鏀跺埌娑堟伅
+            }
+        };
+        this.serverTimeoutObj = "";//蹇冭烦
+        this.linkSocket = "";
+    };
+    vciWebSocket.prototype.init = function(){
+        var that = this;
+        if(typeof(WebSocket) == "undefined") {
+            console.log("鎮ㄧ殑娴忚鍣ㄤ笉鏀寔WebSocket");
+        }else{
+            console.log("鎮ㄧ殑娴忚鍣ㄦ敮鎸乄ebSocket");
+            that.linkSocket = new WebSocket(that.url.wsUrl);
+            that.linkSocket.onopen = function() {
+                console.log("Socket 宸叉墦寮�");
+                that.config.onopen()
+            };
+            //鑾峰緱娑堟伅浜嬩欢
+            that.linkSocket.onmessage = function(msg) {
+                console.log(msg);
+                that.heartCheck()
+                that.config.onmessage(msg)
+            };
+            //鍏抽棴浜嬩欢
+            that.linkSocket.onclose = function(e) {
+                console.log("Socket宸插叧闂�");
+                console.log(e);
+            };
+            //鍙戠敓浜嗛敊璇簨浠�
+            that.linkSocket.onerror = function() {
+                that.websocket_connected_count++;
+                if(that.websocket_connected_count <= 5){
+
+                }
+                console.log("Socket鍙戠敓浜嗛敊璇�");
+            }
+        }
+    };
+    vciWebSocket.prototype.heartCheck = function(){
+        var that = this;
+        that.heartCheckReset();
+        that.heartCheckStart()
+
+    };
+    vciWebSocket.prototype.heartCheckReset = function(){
+        var that = this;
+        clearTimeout(that.serverTimeoutObj);
+    };
+    vciWebSocket.prototype.heartCheckStart = function(){
+        var that = this;
+        this.serverTimeoutObj = setInterval(function(){
+            if(that.linkSocket.readyState == 1){
+                console.log("杩炴帴鐘舵�侊紝鍙戦�佹秷鎭繚鎸佽繛鎺�");
+                that.linkSocket.send("ping");
+               // that.heartCheck()    // 濡傛灉鑾峰彇鍒版秷鎭紝璇存槑杩炴帴鏄甯哥殑锛岄噸缃績璺虫娴�
+            }else{
+                console.log("鏂紑鐘舵�侊紝灏濊瘯閲嶈繛");
+            }
+        }, 60000)
+    };
+    exports('vciWebSocket',new vciWebSocket())
+});
+
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/carousel.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/carousel.js
new file mode 100644
index 0000000..23d0639
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/carousel.js
@@ -0,0 +1,314 @@
+/**
+
+ @Name锛歭ayui.carousel 杞挱妯″潡
+ @Author锛氳搐蹇�
+ @License锛歁IT
+    
+ */
+ 
+layui.define('jquery', function(exports){
+  "use strict";
+  
+  var $ = layui.$
+  ,hint = layui.hint()
+  ,device = layui.device()
+
+  //澶栭儴鎺ュ彛
+  ,carousel = {
+    config: {} //鍏ㄥ眬閰嶇疆椤�
+
+    //璁剧疆鍏ㄥ眬椤�
+    ,set: function(options){
+      var that = this;
+      that.config = $.extend({}, that.config, options);
+      return that;
+    }
+    
+    //浜嬩欢鐩戝惉
+    ,on: function(events, callback){
+      return layui.onevent.call(this, MOD_NAME, events, callback);
+    }
+  }
+  
+  //瀛楃甯搁噺
+  ,MOD_NAME = 'carousel', ELEM = '.layui-carousel', THIS = 'layui-this', SHOW = 'layui-show', HIDE = 'layui-hide', DISABLED = 'layui-disabled'
+  
+  ,ELEM_ITEM = '>*[carousel-item]>*', ELEM_LEFT = 'layui-carousel-left', ELEM_RIGHT = 'layui-carousel-right', ELEM_PREV = 'layui-carousel-prev', ELEM_NEXT = 'layui-carousel-next', ELEM_ARROW = 'layui-carousel-arrow', ELEM_IND = 'layui-carousel-ind'
+  
+  //鏋勯�犲櫒
+  ,Class = function(options){
+    var that = this;
+    that.config = $.extend({}, that.config, carousel.config, options);
+    that.render();
+  };
+  
+  //榛樿閰嶇疆
+  Class.prototype.config = {
+    width: '600px'
+    ,height: '280px'
+    ,full: false //鏄惁鍏ㄥ睆
+    ,arrow: 'hover' //鍒囨崲绠ご榛樿鏄剧ず鐘舵�侊細hover/always/none
+    ,indicator: 'inside' //鎸囩ず鍣ㄤ綅缃細inside/outside/none
+    ,autoplay: true //鏄惁鑷姩鍒囨崲
+    ,interval: 3000 //鑷姩鍒囨崲鐨勬椂闂撮棿闅旓紝涓嶈兘浣庝簬800ms
+    ,anim: '' //鍔ㄧ敾绫诲瀷锛歞efault/updown/fade
+    ,trigger: 'click' //鎸囩ず鍣ㄧ殑瑙﹀彂鏂瑰紡锛歝lick/hover
+    ,index: 0 //鍒濆寮�濮嬬殑绱㈠紩
+  };
+  
+  //杞挱娓叉煋
+  Class.prototype.render = function(){
+    var that = this
+    ,options = that.config;
+
+    options.elem = $(options.elem);
+    if(!options.elem[0]) return;
+    that.elemItem = options.elem.find(ELEM_ITEM);
+    
+    if(options.index < 0) options.index = 0;
+    if(options.index >= that.elemItem.length) options.index = that.elemItem.length - 1;
+    if(options.interval < 800) options.interval = 800;
+
+    //鏄惁鍏ㄥ睆妯″紡
+    if(options.full){
+      options.elem.css({
+        position: 'fixed'
+        ,width: '100%'
+        ,height: '100%'
+        ,zIndex: 9999
+      });
+    } else {
+      options.elem.css({
+        width: options.width
+        ,height: options.height
+      });
+    }
+    
+    options.elem.attr('lay-anim', options.anim);
+    
+    //鍒濆鐒︾偣鐘舵��
+    that.elemItem.eq(options.index).addClass(THIS);
+
+    //鎸囩ず鍣ㄧ瓑鍔ㄤ綔
+    if(that.elemItem.length <= 1) return;
+    that.indicator();
+    that.arrow();
+    that.autoplay();
+    that.events();
+  };
+  
+  //閲嶇疆杞挱
+  Class.prototype.reload = function(options){
+    var that = this;
+    clearInterval(that.timer);
+    that.config = $.extend({}, that.config, options);
+    that.render();
+  };
+  
+  //鑾峰彇涓婁竴涓瓑寰呮潯鐩殑绱㈠紩
+  Class.prototype.prevIndex = function(){
+    var that = this
+    ,options = that.config;
+    
+    var prevIndex = options.index - 1;
+    if(prevIndex < 0){
+      prevIndex = that.elemItem.length - 1;
+    }
+    return prevIndex;
+  };
+  
+  //鑾峰彇涓嬩竴涓瓑寰呮潯鐩殑绱㈠紩
+  Class.prototype.nextIndex = function(){
+    var that = this
+    ,options = that.config;
+    
+    var nextIndex = options.index + 1;
+    if(nextIndex >= that.elemItem.length){
+      nextIndex = 0;
+    }
+    return nextIndex;
+  };
+  
+  //绱㈠紩閫掑
+  Class.prototype.addIndex = function(num){
+    var that = this
+    ,options = that.config;
+    
+    num = num || 1;
+    options.index = options.index + num;
+      
+    //index涓嶈兘瓒呰繃杞挱鎬绘暟閲�
+    if(options.index >= that.elemItem.length){
+      options.index = 0;
+    }
+  };
+  
+  //绱㈠紩閫掑噺
+  Class.prototype.subIndex = function(num){
+    var that = this
+    ,options = that.config;
+    
+    num = num || 1;
+    options.index = options.index - num;
+      
+    //index涓嶈兘瓒呰繃杞挱鎬绘暟閲�
+    if(options.index < 0){
+      options.index = that.elemItem.length - 1;
+    }
+  };
+  
+  //鑷姩杞挱
+  Class.prototype.autoplay = function(){
+    var that = this
+    ,options = that.config;
+    
+    if(!options.autoplay) return;
+    
+    that.timer = setInterval(function(){
+      that.slide();
+    }, options.interval);
+  };
+  
+  //绠ご
+  Class.prototype.arrow = function(){
+    var that = this
+    ,options = that.config;
+    
+    //妯℃澘
+    var tplArrow = $([
+      '<button class="layui-icon '+ ELEM_ARROW +'" lay-type="sub">'+ (options.anim === 'updown' ? '&#xe619;' : '&#xe603;') +'</button>'
+      ,'<button class="layui-icon '+ ELEM_ARROW +'" lay-type="add">'+ (options.anim === 'updown' ? '&#xe61a;' : '&#xe602;') +'</button>'
+    ].join(''));
+    
+    //棰勮鍩虹灞炴��
+    options.elem.attr('lay-arrow', options.arrow);
+    
+    //閬垮厤閲嶅鎻掑叆
+    if(options.elem.find('.'+ELEM_ARROW)[0]){
+      options.elem.find('.'+ELEM_ARROW).remove();
+    };
+    options.elem.append(tplArrow);
+    
+    //浜嬩欢
+    tplArrow.on('click', function(){
+      var othis = $(this)
+      ,type = othis.attr('lay-type')
+      that.slide(type);
+    });
+  };
+  
+  //鎸囩ず鍣�
+  Class.prototype.indicator = function(){
+    var that = this
+    ,options = that.config;
+    
+    //妯℃澘
+    var tplInd = that.elemInd = $(['<div class="'+ ELEM_IND +'"><ul>'
+      ,function(){
+        var li = [];
+        layui.each(that.elemItem, function(index){
+          li.push('<li'+ (options.index === index ? ' class="layui-this"' : '') +'></li>');
+        });
+        return li.join('');
+      }()
+    ,'</ul></div>'].join(''));
+    
+    //棰勮鍩虹灞炴��
+    options.elem.attr('lay-indicator', options.indicator);
+    
+    //閬垮厤閲嶅鎻掑叆
+    if(options.elem.find('.'+ELEM_IND)[0]){
+      options.elem.find('.'+ELEM_IND).remove();
+    };
+    options.elem.append(tplInd);
+    
+    if(options.anim === 'updown'){
+      tplInd.css('margin-top', -(tplInd.height()/2));
+    }
+    
+    //浜嬩欢
+    tplInd.find('li').on(options.trigger === 'hover' ? 'mouseover' : options.trigger, function(){
+      var othis = $(this)
+      ,index = othis.index();
+      if(index > options.index){
+        that.slide('add', index - options.index);
+      } else if(index < options.index){
+        that.slide('sub', options.index - index);
+      }
+    });
+  };
+  
+  //婊戝姩鍒囨崲
+  Class.prototype.slide = function(type, num){
+    var that = this
+    ,elemItem = that.elemItem
+    ,options = that.config
+    ,thisIndex = options.index
+    ,filter = options.elem.attr('lay-filter');
+    
+    if(that.haveSlide) return;
+    
+    //婊戝姩鏂瑰悜
+    if(type === 'sub'){
+      that.subIndex(num);
+      elemItem.eq(options.index).addClass(ELEM_PREV);
+      setTimeout(function(){
+        elemItem.eq(thisIndex).addClass(ELEM_RIGHT);
+        elemItem.eq(options.index).addClass(ELEM_RIGHT);
+      }, 50);
+    } else { //榛樿閫掑婊�
+      that.addIndex(num);
+      elemItem.eq(options.index).addClass(ELEM_NEXT);
+      setTimeout(function(){
+        elemItem.eq(thisIndex).addClass(ELEM_LEFT);
+        elemItem.eq(options.index).addClass(ELEM_LEFT);
+      }, 50);  
+    };
+    
+    //绉婚櫎杩囧害绫�
+    setTimeout(function(){
+      elemItem.removeClass(THIS + ' ' + ELEM_PREV + ' ' + ELEM_NEXT + ' ' + ELEM_LEFT + ' ' + ELEM_RIGHT);
+      elemItem.eq(options.index).addClass(THIS);
+      that.haveSlide = false; //瑙i攣
+    }, 300);
+    
+    //鎸囩ず鍣ㄧ劍鐐�
+    that.elemInd.find('li').eq(options.index).addClass(THIS)
+    .siblings().removeClass(THIS);
+    
+    that.haveSlide = true;
+    
+    layui.event.call(this, MOD_NAME, 'change('+ filter +')', {
+      index: options.index
+      ,prevIndex: thisIndex
+      ,item: elemItem.eq(options.index)
+    });
+  };
+  
+  //浜嬩欢澶勭悊
+  Class.prototype.events = function(){
+    var that = this
+    ,options = that.config;
+    
+    if(options.elem.data('haveEvents')) return;
+    
+    //绉诲叆绉诲嚭瀹瑰櫒
+    options.elem.on('mouseenter', function(){
+      clearInterval(that.timer);
+    }).on('mouseleave', function(){
+      that.autoplay();
+    });
+    
+    options.elem.data('haveEvents', true);
+  };
+  
+  //鏍稿績鍏ュ彛
+  carousel.render = function(options){
+    var inst = new Class(options);
+    return inst;
+  };
+  
+  exports(MOD_NAME, carousel);
+});
+
+ 
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/code.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/code.js
new file mode 100644
index 0000000..e4617f5
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/code.js
@@ -0,0 +1,61 @@
+/**
+
+ @Name锛歭ayui.code 浠g爜淇グ鍣�
+ @Author锛氳搐蹇�
+ @License锛歁IT
+    
+ */
+ 
+layui.define('jquery', function(exports){
+  "use strict";
+  
+  var $ = layui.$;
+  var about = 'http://www.layui.com/doc/modules/code.html'; //鍏充簬淇℃伅
+  
+  exports('code', function(options){
+    var elems = [];
+    options = options || {};
+    options.elem = $(options.elem||'.layui-code');
+    options.about = 'about' in options ? options.about : true;
+    
+    options.elem.each(function(){
+      elems.push(this);
+    });
+    
+    layui.each(elems.reverse(), function(index, item){
+      var othis = $(item), html = othis.html();
+      
+      //杞箟HTML鏍囩
+      if(othis.attr('lay-encode') || options.encode){
+        html = html.replace(/&(?!#?[a-zA-Z0-9]+;)/g, '&amp;')
+        .replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/'/g, '&#39;').replace(/"/g, '&quot;')
+      }
+      
+      othis.html('<ol class="layui-code-ol"><li>' + html.replace(/[\r\t\n]+/g, '</li><li>') + '</li></ol>')
+      
+      if(!othis.find('>.layui-code-h3')[0]){
+        othis.prepend('<h3 class="layui-code-h3">'+ (othis.attr('lay-title')||options.title||'code') + (options.about ? '<a href="'+ about +'" target="_blank">layui.code</a>' : '') + '</h3>');
+      }
+      
+      var ol = othis.find('>.layui-code-ol');
+      othis.addClass('layui-box layui-code-view');
+      
+      //璇嗗埆鐨偆
+      if(othis.attr('lay-skin') || options.skin){
+        othis.addClass('layui-code-' +(othis.attr('lay-skin') || options.skin));
+      }
+      
+      //鎸夎鏁伴�傞厤宸﹁竟璺�
+      if((ol.find('li').length/100|0) > 0){
+        ol.css('margin-left', (ol.find('li').length/100|0) + 'px');
+      }
+      
+      //璁剧疆鏈�澶ч珮搴�
+      if(othis.attr('lay-height') || options.height){
+        ol.css('max-height', othis.attr('lay-height') || options.height);
+      }
+
+    });
+    
+  });
+}).addcss('modules/code.css', 'skincodecss');
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/dltable.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/dltable.js
new file mode 100644
index 0000000..ca75005
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/dltable.js
@@ -0,0 +1,2259 @@
+/**
+ @Name锛歞l table 鎿嶄綔
+ @Author锛歭rd
+ */
+
+layui.define(['laytpl', 'laypage', 'layer', 'form'], function(exports){
+    "use strict";
+    var laytpl = layui.laytpl
+        ,laypage = layui.laypage
+        ,layer = layui.layer
+        ,form = layui.form
+        ,hint = layui.hint()
+        ,device = layui.device()
+
+        //澶栭儴鎺ュ彛
+        ,table = {
+            claObj:{}//鍏ㄩ儴鐨刢lass瀵硅薄map
+            ,obj:{}//棰濆淇濆瓨鐨勬暟鎹�
+            ,config: {//鍏ㄥ眬閰嶇疆椤�
+                checkName: 'LAY_CHECKED' //鏄惁閫変腑鐘舵�佺殑瀛楁鍚�
+                ,indexName: 'LAY_TABLE_INDEX' //涓嬫爣绱㈠紩鍚�
+            }
+            /**
+             * 缂撳瓨鏁版嵁
+             *
+             * 缁撴瀯鍥剧ず
+             * cache{}                  缂撳瓨锛堝璞★級
+             *      key['data']{}       鍏ㄩ儴鏁版嵁缂撳瓨锛堝璞★級
+             *          key[list][]     鍒楄〃鏁版嵁瀵硅薄锛堟暟缁勶級
+             *          key[map]{}      鍒楄〃鏁版嵁Map瀵硅薄锛圡ap锛�
+             *          key[treeList][] 鏍戠姸缁撴瀯鐨勫璞★紙鏁扮粍锛�
+             *      key['cla']{}        鍏ㄩ儴宸插垵濮嬪寲杩囩殑Calss瀵硅薄绫伙紙娉ㄦ剰娓叉煋鏄紓姝ユ墽琛岋級
+             *          key['claIds'][] 鍏ㄩ儴宸茬粡鍚婄敤杩囧垵濮嬪寲鏂规硶鐨勮〃鏍肩被
+             *          key[claObjs]{key[tableId]}  鍏ㄩ儴宸茬粡鍒濆鍖栧ソ鐨刢la瀵硅薄
+             *
+             */
+            ,cache: {
+                tableId: {
+                    data: {
+                        list: []//鍒楄〃鏁版嵁
+                        , map: {}//鍒楄〃鏁版嵁浠dField鎴栧敮涓�鍊间綔涓簁ey鐨凪ap鏁版嵁
+                        , treeList: []//鏍戠姸鏁版嵁
+                    }
+                }
+                , cla: {
+                    claIds: {
+                        tableId: true
+                    }
+                    , claObjs: {
+                        tableId: {}
+                    }
+                }
+                , selectcode: {//鏁版嵁瀛楀吀缂撳瓨
+                    demokey: [
+                        {
+                            key: {value: ''}
+                        }
+                    ]
+                }
+            }
+            ,index: layui.table ? (layui.table.index + 10000) : 0
+            /**
+             * 璁剧疆鍏ㄥ眬椤�
+             * @param options
+             * @return {table}
+             */
+            ,set: function(options){
+                var that = this;
+                that.config = $.extend({}, that.config, options);
+                return that;
+            }
+            /**
+             * 浜嬩欢鐩戝惉
+             * @param events
+             * @param callback
+             * @return {*}
+             */
+            ,on: function(events, callback){
+                return layui.onevent.call(this, MOD_NAME, events, callback);
+            }
+            ,getClass:function (tableId) {
+                return table.cache.cla.claObjs[tableId];
+            }
+            ,pushClass:function (tableId,that) {
+                table.cache.cla.claObjs[tableId]=that;
+            }
+            ,isCalss:function (tableId) {
+                var ids=this.cache.cla.claIds||{};
+                return  ids.hasOwnProperty(tableId)||false;
+            }
+            ,isClassYes:function (tableId) {
+                var ids=this.cache.cla.claIds||{};
+                return ids[tableId]||false;
+            }
+            ,pushClassIds:function (tableId,is) {
+                this.cache.cla.claIds[tableId]=is;
+            }
+            ,setObj:function (tableId,key,o) {
+                if(!this.obj[tableId])this.obj[tableId]={};
+                this.obj[tableId][key]=o;
+            }
+            ,getObj:function (tableId, key) {
+                return this.obj[tableId]?this.obj[tableId][key]:null;
+            }
+            /**
+             * 鑾峰彇鍒楄〃鏁版嵁
+             */
+            ,getDataList:function (tableId) {
+                if(table.cache[tableId]){
+                    return table.cache[tableId].data.list;
+                }
+                return [];
+            }
+            /**
+             * 璁剧疆鍒楄〃鏁版嵁
+             */
+            ,setDataList:function (tableId, list) {
+                if(!table.cache[tableId])table.cache[tableId]={};
+                if(!table.cache[tableId].data)table.cache[tableId].data={};
+                if(!table.cache[tableId].data.list)table.cache[tableId].data.list=[];
+                table.cache[tableId].data.list=list;
+            }
+            /**
+             * 鑾峰彇鍒楄〃鏁版嵁
+             */
+            ,getDataMap:function (tableId) {
+                if(table.cache[tableId]){
+                    return table.cache[tableId].data.map;
+                }
+                return {};
+            }
+            /**
+             * 璁剧疆鍒楄〃鏁版嵁
+             */
+            ,setDataMap:function (tableId, map) {
+                if(!table.cache[tableId])table.cache[tableId]={};
+                if(!table.cache[tableId].data)table.cache[tableId].data={};
+                if(!table.cache[tableId].data.map)table.cache[tableId].data.map={};
+                table.cache[tableId].data.map=map;
+            }
+            /**
+             * 鑾峰彇鏍戠姸鏁版嵁
+             */
+            ,getDataTreeList:function (tableId) {
+                if(table.cache[tableId]){
+                    return table.cache[tableId].data.treeList;
+                }
+                return [];
+            }
+            /**
+             * 璁剧疆鏍戠姸鏁版嵁
+             */
+            ,setDataTreeList:function (tableId, treeList) {
+                if(!table.cache[tableId])table.cache[tableId]={};
+                if(!table.cache[tableId].data)table.cache[tableId].data={};
+                if(!table.cache[tableId].data.treeList)table.cache[tableId].data.treeList={};
+                table.cache[tableId].data.treeList=treeList;
+            }
+            /**
+             * 鍒濆鍖�
+             * @param filter
+             * @param settings
+             * @return {table}
+             */
+            ,init:function (filter, settings) {
+                settings = settings || {};
+                var that = this
+                    ,elemTable = filter ? $('table[lay-filter="'+ filter +'"]') : $(ELEM + '[lay-data]')
+                    ,errorTips = 'Table element property lay-data configuration item has a syntax error: ';
+                //閬嶅巻鏁版嵁琛ㄦ牸
+                elemTable.each(function(){
+                    var othis = $(this), tableData = othis.attr('lay-data');
+                    try{
+                        tableData = new Function('return '+ tableData)();
+                    } catch(e){
+                        hint.error(errorTips + tableData)
+                    }
+                    var cols = [], options = $.extend({
+                        elem: this
+                        ,cols: []
+                        ,data: []
+                        ,skin: othis.attr('lay-skin') //椋庢牸
+                        ,size: othis.attr('lay-size') //灏哄
+                        ,even: typeof othis.attr('lay-even') === 'string' //鍋舵暟琛岃儗鏅�
+                    }, table.config, settings, tableData);
+
+                    filter && othis.hide();
+
+                    //鑾峰彇琛ㄥご鏁版嵁
+                    othis.find('thead>tr').each(function(i){
+                        options.cols[i] = [];
+                        $(this).children().each(function(ii){
+                            var th = $(this), itemData = th.attr('lay-data');
+
+                            try{
+                                itemData = new Function('return '+ itemData)();
+                            } catch(e){
+                                return hint.error(errorTips + itemData)
+                            }
+
+                            var row = $.extend({
+                                title: th.text()
+                                ,colspan: th.attr('colspan') || 0 //鍒楀崟鍏冩牸
+                                ,rowspan: th.attr('rowspan') || 0 //琛屽崟鍏冩牸
+                            }, itemData);
+
+                            if(row.colspan < 2) cols.push(row);
+                            options.cols[i].push(row);
+                        });
+                    });
+
+                    //鑾峰彇琛ㄤ綋鏁版嵁
+                    othis.find('tbody>tr').each(function(i1){
+                        var tr = $(this), row = {};
+                        //濡傛灉瀹氫箟浜嗗瓧娈靛悕
+                        tr.children('td').each(function(i2, item2){
+                            var td = $(this)
+                                ,field = td.data('field');
+                            if(field){
+                                return row[field] = td.html();
+                            }
+                        });
+                        //濡傛灉鏈畾涔夊瓧娈靛悕
+                        layui.each(cols, function(i3, item3){
+                            var td = tr.children('td').eq(i3);
+                            row[item3.field] = td.html();
+                        });
+                        options.data[i1] = row;
+                    });
+                    table.render(options);
+                });
+
+                return that;
+            }
+            /**
+             * 娓叉煋鍏ュ彛鏂规硶锛堟牳蹇冨叆鍙o級
+             */
+            ,render:function (options) {
+                table.pushClassIds(options.id);
+                var inst = new Class(options);
+                return thisTable.call(inst);
+            }
+            /**
+             * 瀵瑰簲鐨勮〃鏍煎姞杞藉畬鎴愬悗鎵ц
+             * @param tableId
+             * @param fn
+             */
+            ,ready:function (tableId,fn) {
+                var is=false;
+                var myDate=new Date();
+                function isReady() {
+                    if(tableId){
+                        var that=table.getClass(tableId);
+                        if(that&&that.hasOwnProperty('layBody')){
+                            fn(that);
+                            is=true;
+                        }else{
+                            var myDate2=new Date();
+                            var i=myDate2.getTime()-myDate.getTime();
+                            if(i<=(1000*10)&&!is){//澶т簬10绉掗��鍑�
+                                setTimeout(isReady,50);
+                            }
+                        }
+                    }
+                }
+                if(tableId&&fn){
+                    setTimeout(isReady,50);
+                }
+            }
+            /**
+             * 鑾峰彇琛ㄦ牸閫変腑璁板綍
+             * @param tableId
+             * @return {{data: Array, isAll: boolean}}
+             */
+            ,checkStatus:function (tableId) {
+                var nums = 0
+                    ,invalidNum = 0
+                    ,arr = []
+                    ,data = table.getDataList(tableId) || [];
+                //璁$畻鍏ㄩ�変釜鏁�
+                layui.each(data, function(i, item){
+                    if(item.constructor === Array){
+                        invalidNum++; //鏃犳晥鏁版嵁锛屾垨宸插垹闄ょ殑
+                        return;
+                    }
+                    if(item[table.config.checkName]){
+                        nums++;
+                        arr.push(table.clearCacheKey(item));
+                    }
+                });
+                return {
+                    data: arr //閫変腑鐨勬暟鎹�
+                    ,isAll: data.length ? (nums === (data.length - invalidNum)) : false //鏄惁鍏ㄩ��
+                };
+            }
+            /**
+             * 璁剧疆琛ㄦ牸澶嶉�夌姸鎬�
+             * @param tableId
+             * @param value     姝ゅ�煎瓨鍦ㄦ椂涓鸿缃搷浣�
+             * @returns {*}
+             */
+            ,setCheckStatus:function(tableId, fildName, ids){
+                var retObj=null;
+                var that=table.getClass(tableId)
+                    ,invalidNum = 0
+                    ,arr = []
+                    ,data = table.getDataList(tableId) || []
+                    ,childs = that.layBody.find('input[name="layTableCheckbox"]')//澶嶉�夋
+                ;
+                if(fildName&&ids){//璁剧疆閫変腑
+                    var idsarr=ids.split(',');
+                    idsarr.forEach(function (o) {
+                        // console.log(o);
+                        var temo=null;
+                        data.forEach(function (e) {
+                            var b1=e[fildName]+"";
+                            var b2=o+"";
+                            if(b1==b2){
+                                temo=e;
+                                return;
+                            };
+                        });
+                        if(temo){
+                            var v=temo[table.config.indexName];
+                            that.layBody.find('input[name="layTableCheckbox"][value="'+v+'"]').prop("checked",true);
+                            that.setCheckData(v, true);
+                        }
+                    });
+                    that.syncCheckAll();
+                    that.renderForm('checkbox');
+                }
+                return retObj;
+            }
+            /**
+             * 琛ㄦ牸鍗曢�夌姸鎬�
+             * @param tableId
+             * @param value     姝ゅ�煎瓨鍦ㄦ椂涓鸿缃搷浣�
+             * @returns {*}
+             */
+            ,radioStatus:function (tableId) {
+                var retObj=null;
+                var nums = 0
+                    ,invalidNum = 0
+                    ,arr = []
+                    ,data = table.getDataList(tableId) || [];
+                var v=$("input[name='"+TABLE_RADIO_ID+tableId+"']:checked").val();
+                v=parseInt(v);
+                data.forEach(function (e) {
+                    if(e[table.config.indexName]==v){
+                        retObj=e;
+                        return;
+                    };
+                });
+                return retObj;
+            }
+            /**
+             * 璁剧疆琛ㄦ牸鍗曢�夌姸鎬�
+             * @param tableId
+             * @param value     姝ゅ�煎瓨鍦ㄦ椂涓鸿缃搷浣�
+             * @returns {*}
+             */
+            ,setRadioStatus:function (tableId,fildName,value) {
+                var retObj=null;
+                var nums = 0
+                    ,invalidNum = 0
+                    ,arr = []
+                    ,data = table.getDataList(tableId) || [];
+
+                if(fildName&&value){//璁剧疆閫変腑
+                    data.forEach(function (e) {
+                        var b1=e[fildName]+"";
+                        var b2=value+"";
+                        if(b1==b2){
+                            retObj=e;
+                            return;
+                        };
+                    });
+
+                    if(retObj){
+                        var v=retObj[table.config.indexName];
+                        $("input:radio[name='"+TABLE_RADIO_ID+tableId+"'][value='"+v+"']").prop("checked",true);
+                        form.render('radio');
+                    }
+                }
+                return retObj;
+            }
+            /**
+             * 娓呴櫎涓存椂Key
+             * @param data
+             * @return {*}
+             */
+            ,clearCacheKey:function (data) {
+                data = $.extend({}, data);
+                delete data[table.config.checkName];
+                delete data[table.config.indexName];
+                return data;
+            }
+            /**
+             * 鍒锋柊鏁版嵁
+             * @param id
+             * @param options
+             * @return {*}
+             */
+            ,query:function (tableId, options) {
+                var that= table.getClass(tableId);
+                that.renderTdCss();
+                that.pullData(that.page, that.loading());
+            }
+            /**
+             * 姝ゆ柟娉曚负鏁翠綋閲嶆柊娓叉煋锛堥噸閲忕骇鍒锋柊鏂规硶锛�
+             * @param id
+             * @param options
+             */
+            ,reload:function (tableId, options) {
+                var config = thisTable.config[tableId];
+                options = options || {};
+                if(!config) return hint.error('The ID option was not found in the table instance');
+                if(options.data && options.data.constructor === Array) delete config.data;
+                return table.render($.extend(true, {}, config, options));
+            }
+            /**
+             * 娣诲姞涓�琛屾垨澶氳鏁版嵁
+             * @param tableId   琛ㄦ牸id
+             * @param index     鍦ㄧ鍑犱釜浣嶇疆鎻掑叆锛堜粠0寮�濮嬶級
+             * @param data      鏁版嵁
+             * @returns {*}
+             */
+            ,addRow:function (tableId, index, data) {
+                var that=table.getClass(tableId)
+                    ,options=that.config
+                    ,invalidNum = 0
+                    ,arr = []
+                    ,list = table.getDataList(tableId) || [];
+                //鎻掑叆鍒扮埗鑺傜偣鍚庨潰
+                list.splice(index,0,data);//鏇存柊缂撳瓨
+                table.restNumbers(list);//閲嶇疆涓嬫爣
+                that.resetData(list);
+                //濡傛灉鏄爲鐘跺垯澶勭悊鏁版嵁
+                if(options.isTree) {
+                    //澶勭悊鐖剁骇
+                    var uo=that.treeFindUpData(data);
+                    if(uo) {
+                        that.treeNodeOpen(uo, true);//灞曞紑鑺傜偣
+                        that.renderTreeConvertShowName(uo);
+                    }
+                }
+                //鐢熸垚html
+                var tds=that.renderTr(data,data[table.config.indexName]);
+                var trs='<tr data-index="'+ data[table.config.indexName] +'"'+that.renderTrUpids(data)+'>'+ tds.join('') + '</tr>';
+                if(index==0){//鍦ㄧ涓�涓綅缃彃鍏�
+                    var  tbody=that.layBody.find('table tbody');
+                    $(tbody).prepend(trs);
+                    that.layBody.find(".layui-none").remove();
+                }else{
+                    var o=that.layBody.find('[data-index='+(index-1)+']');//鐖惰妭鐐筪om鏍�
+                    $(o).after(trs);
+                }
+                that.renderPage(that.config.page.count+1);//鍒嗛〉娓叉煋
+                that.restNumbers();
+            }
+            /**
+             * 鍒犻櫎涓�琛屾垨澶氳鏁版嵁
+             * 锛堝鏋滄槸鏍戠姸鍒欏垹闄よ嚜宸卞拰瀛愯妭鐐癸級
+             * @param tableId
+             * @param data锛�1銆佹暟缁勶紱2銆佸璞★級
+             */
+            ,delRow:function (tableId, data) {
+                //1銆侀〉闈㈡竻闄� 2銆佺紦瀛樻竻闄�
+                var that=table.getClass(tableId)
+                    ,options=that.config
+                    ,list=table.getDataList(tableId);
+                var sonList=[];//闇�瑕佸垹闄ょ殑鏁版嵁
+                var delIds={};//闇�瑕佸垹闄ょ殑鏁版嵁map
+                var delDatas=[];
+                if(!that||!data)return;
+                if(table.kit.isArray(data)){//鏄暟缁勶紝鍒犻櫎澶氫釜
+                    delDatas=data;
+                }else{
+                    delDatas[0]=data;
+                }
+                sonList=options.isTree?table.treeFindSonList(that.config.id,delDatas):delDatas;
+                //椤甸潰鍏冪礌澶勭悊
+                sonList.forEach(function (temo) {
+                    var index=temo[table.config.indexName];
+                    delIds[index]=index;//璁剧疆浠e垹闄ょ殑id闆嗗悎
+                    var tr = that.layBody.find('tr[data-index="'+ index +'"]');
+                    tr.remove();
+                });
+                //鏁版嵁澶勭悊
+                that.restNumbers();
+                var newList=[];//閲嶆瀯涓�涓柊鐨勬暟缁�
+                for (var i=0,len=list.length;i<len;i++) {
+                    var isP=true;
+                    var temo1=null;
+                    sonList.forEach(function (temo) {
+                        if (temo[table.config.indexName] === list[i][table.config.indexName]) {
+                            isP = false;
+                        }
+                    });
+                    if(isP){
+                        newList.push(list[i]);
+                    }
+                }
+                table.restNumbers(newList);
+                that.resetData(newList);//鏇存柊缂撳瓨鏁版嵁
+                if(options.page)that.renderPage(that.config.page.count-Object.keys(delIds).length);//鍒嗛〉娓叉煋
+            }
+            ,restNumbers:function (list) {
+                if(!list)return;
+                var i=0;
+                list.forEach(function (o) {
+                    o[table.config.indexName]=i;
+                    i++;
+                });
+            }
+            /**
+             * 鑾峰彇鍏ㄩ儴闇�瑕佸瓙鑺傜偣瀵硅薄闆嗗悎
+             * @param data锛堟暟缁勬垨瀵硅薄锛�
+             */
+            ,treeFindSonList:function (tableId,data) {
+                var that=table.getClass(tableId);
+                if(!that||!data)return [];
+                var delDatas=[];
+                var sonList=[];//闇�瑕佸垹闄ょ殑鏁版嵁
+                var delIds={};//闇�瑕佸垹闄ょ殑鏁版嵁map
+                if(table.kit.isArray(data)){//鏄暟缁勶紝鍒犻櫎澶氫釜
+                    delDatas=data;
+                }else{
+                    delDatas[0]=data;
+                }
+                delDatas.forEach(function (temo) {
+                    if(temo.children.length>0){
+                        var temSonList=that.treeFindSonData(temo);
+                        temSonList.forEach(function (temii) {
+                            if(!delIds[temii[table.config.indexName]]){
+                                sonList.push(temii);
+                                delIds[temii[table.config.indexName]]=temii[table.config.indexName];
+                            }
+                        });
+                    }
+                    sonList.push(temo);
+                    delIds[temo[table.config.indexName]]=temo[table.config.indexName];
+                });
+                return sonList;
+            }
+            /**
+             * 鑾峰彇鍏ㄩ儴闇�瑕佸瓙鑺傜偣id闆嗗悎
+             * @param data锛堟暟缁勬垨瀵硅薄锛�
+             */
+            ,treeFindSonIds:function (tableId,data) {
+                var delIds=[];
+                var sonList=table.treeFindSonList(tableId,data);
+                sonList.forEach(function (temo) {
+                    delIds.push([table.config.indexName]);
+                });
+                return delIds;
+            }
+            /**
+             * 鑾峰彇鍏ㄩ儴鐨刬d瀛楁闆嗗悎
+              * @param tableId
+             * @param data
+             * @returns {Array}
+             */
+            ,treeFindSonIdFields:function (tableId,data) {
+                var idField=[];
+                var that=table.getClass(tableId);
+                var sonList=table.treeFindSonList(tableId,data);
+                sonList.forEach(function (temo) {
+                    idField.push(temo[that.config.idField]);
+                });
+                return idField;
+            }
+            /**
+             * 宸ュ叿鏂规硶瀵硅薄
+             */
+            ,kit:{
+                isArray:function (o) {
+                    return Object.prototype.toString.call(o) === '[object Array]';
+                }
+            }
+        }
+        //鎿嶄綔褰撳墠瀹炰緥
+        ,thisTable = function(){
+            var that = this
+                ,options = that.config
+                ,id = options.id;
+            id && (thisTable.config[id] = options);
+            return {
+                reload: function(options){
+                    that.reload.call(that, options);
+                }
+                ,config: options
+            }
+        }
+        //瀛楃甯搁噺
+        ,MOD_NAME = 'dltable', ELEM = '.layui-table', THIS = 'layui-this', SHOW = 'layui-show', HIDE = 'layui-hide', DISABLED = 'layui-disabled', NONE = 'layui-none'
+        ,ELEM_VIEW = 'layui-table-view', ELEM_HEADER = '.layui-table-header', ELEM_BODY = '.layui-table-body', ELEM_MAIN = '.layui-table-main', ELEM_FIXED = '.layui-table-fixed', ELEM_FIXL = '.layui-table-fixed-l', ELEM_FIXR = '.layui-table-fixed-r', ELEM_TOOL = '.layui-table-tool', ELEM_PAGE = '.layui-table-page', ELEM_SORT = '.layui-table-sort', ELEM_EDIT = 'layui-table-edit', ELEM_HOVER = 'layui-table-hover'
+        ,TABLE_RADIO_ID='table_radio_'
+        ,ELEM_FILTER='.layui-table-filter'
+        ,TREE_ID='treeId',TREE_UPID='treeUpId',TREE_SHOW_NAME='treeShowName',TREE_KEY_MAP='tree_key_map'
+        //thead鍖哄煙妯℃澘
+        ,TPL_HEADER = function(options){
+            var rowCols = '{{#if(item2.colspan){}} colspan="{{item2.colspan}}"{{#} if(item2.rowspan){}} rowspan="{{item2.rowspan}}"{{#}}}';
+            options = options || {};
+            return ['<table cellspacing="0" cellpadding="0" border="0" class="layui-table" '
+                ,'{{# if(d.data.skin){ }}lay-skin="{{d.data.skin}}"{{# } }} {{# if(d.data.size){ }}lay-size="{{d.data.size}}"{{# } }} {{# if(d.data.even){ }}lay-even{{# } }}>'
+                ,'<thead>'
+                ,'{{# layui.each(d.data.cols, function(i1, item1){ }}'
+                ,'<tr>'
+                    ,'{{# layui.each(item1, function(i2, item2){ }}'
+                        ,'{{# if(item2.fixed && item2.fixed !== "right"){ left = true; } }}'
+                        ,'{{# if(item2.fixed === "right"){ right = true; } }}'
+                        ,function(){
+                            if(options.fixed && options.fixed !== 'right'){
+                                return '{{# if(item2.fixed && item2.fixed !== "right"){ }}';
+                            }
+                            if(options.fixed === 'right'){
+                                return '{{# if(item2.fixed === "right"){ }}';
+                            }
+                            return '';
+                        }()
+                        ,'<th data-field="{{ item2.field.split(\',\')[0]||i2 }}" {{# if(item2.minWidth){ }}data-minwidth="{{item2.minWidth}}"{{# } }} '+ rowCols +' {{# if(item2.unresize){ }}data-unresize="true"{{# } }}>'
+                        ,'<div class="layui-table-cell laytable-cell-'
+                        ,'{{# if(item2.colspan > 1){ }}'
+                        ,'group'
+                        ,'{{# } else { }}'
+                        ,'{{d.index}}-{{item2.field.split(",")[0].replace(\'.\',\'--\') || i2}}'
+                        ,'{{# if(item2.type !== "normal"){ }}'
+                        ,' laytable-cell-{{ item2.type }}'
+                        ,'{{# } }}'
+                        ,'{{# } }}'
+                        ,'" {{#if(item2.align){}}align="{{item2.align}}"{{#}}}>'
+                        ,'{{# if(item2.type === "checkbox"){ }}' //澶嶉�夋
+                        ,'<input type="checkbox" name="layTableCheckbox" lay-skin="primary" lay-filter="layTableAllChoose" {{# if(item2[d.data.checkName]){ }}checked{{# }; }}>'
+                        ,'{{# } else { }}'
+                        ,'<span>{{item2.title||""}}</span>'
+                        ,'{{# if(!(item2.colspan > 1) && item2.sort){ }}'
+                        ,'<span class="layui-table-sort layui-inline"><i class="layui-edge layui-table-sort-asc"></i><i class="layui-edge layui-table-sort-desc"></i></span>'
+                        ,'{{# } }}'
+                        ,'{{# } }}'
+                        ,'</div>'
+                        ,'</th>'
+                        ,(options.fixed ? '{{# }; }}' : '')
+                    ,'{{# }); }}'
+                ,'</tr>'
+                ,'{{# }); }}'
+                ,'</thead>'
+                ,'</table>'].join('');
+        }
+        /**
+         * 琛屽唴杩囨护鍖哄煙
+         */
+        ,TPL_FILTER = function(options){
+        }
+        //tbody鍖哄煙妯℃澘
+        ,TPL_BODY = ['<table cellspacing="0" cellpadding="0" border="0" class="layui-table" '
+            ,'{{# if(d.data.skin){ }}lay-skin="{{d.data.skin}}"{{# } }} {{# if(d.data.size){ }}lay-size="{{d.data.size}}"{{# } }} {{# if(d.data.even){ }}lay-even{{# } }}>'
+            ,'<tbody></tbody>'
+            ,'</table>'].join('')
+        //涓绘ā鏉�
+        ,TPL_MAIN = ['<div class="layui-form layui-border-box {{d.VIEW_CLASS}}" lay-filter="LAY-table-{{d.index}}" style="{{# if(d.data.width){ }}width:{{d.data.width}}px;{{# } }} {{# if(d.data.height){ }}height:{{d.data.height}}px;{{# } }}">'
+
+            ,'{{# if(d.data.toolbar){ }}'
+            ,'<div class="layui-table-tool"></div>'
+            ,'{{# } }}'
+
+            ,'<div class="layui-table-box">'
+            ,'{{# var left, right; }}'
+            ,'<div class="layui-table-header">'
+            ,TPL_HEADER()
+            ,'</div>'
+            ,'<div class="layui-table-filter">'
+            ,TPL_FILTER()
+            ,'</div>'
+            ,'<div class="layui-table-body layui-table-main">'
+            ,TPL_BODY
+            ,'</div>'
+
+            ,'{{# if(left){ }}'
+            ,'<div class="layui-table-fixed layui-table-fixed-l">'
+            ,'<div class="layui-table-header">'
+            ,TPL_HEADER({fixed: true})
+            ,'</div>'
+            ,'<div class="layui-table-body">'
+            ,TPL_BODY
+            ,'</div>'
+            ,'</div>'
+            ,'{{# }; }}'
+
+            ,'{{# if(right){ }}'
+            ,'<div class="layui-table-fixed layui-table-fixed-r">'
+            ,'<div class="layui-table-header">'
+            ,TPL_HEADER({fixed: 'right'})
+            ,'<div class="layui-table-mend"></div>'
+            ,'</div>'
+            ,'<div class="layui-table-body">'
+            ,TPL_BODY
+            ,'</div>'
+            ,'</div>'
+            ,'{{# }; }}'
+            ,'</div>'
+
+            ,'{{# if(d.data.page){ }}'
+            ,'<div class="layui-table-page">'
+            ,'<div id="layui-table-page{{d.index}}"></div>'
+            ,'</div>'
+            ,'{{# } }}'
+
+            ,'<style>'
+            ,'{{# layui.each(d.data.cols, function(i1, item1){'
+            ,'layui.each(item1, function(i2, item2){ }}'
+            ,".laytable-cell-{{d.index}}-{{item2.field.split(',')[0].replace(\'.\','--')||i2}}{ "
+            ,'{{# if(item2.width){ }}'
+            ,'width: {{item2.width}}px;'
+            ,'{{# } }}'
+            ,' }'
+            ,'{{# });'
+            ,'}); }}'
+            ,'</style>'
+            ,'</div>'].join('')
+        ,_WIN = $(window)
+        ,_DOC = $(document)
+
+        //鏋勯�犲櫒
+        ,Class = function(options){
+            var that = this;
+            that.index = ++table.index;
+            that.config = $.extend({}, that.config, table.config, options);
+            that.render();
+            table.pushClass(options.id,that);
+        };
+
+    //榛樿閰嶇疆
+    Class.prototype.config = {
+        limit: 10 //姣忛〉鏄剧ず鐨勬暟閲�
+        ,loading: true //璇锋眰鏁版嵁鏃讹紝鏄惁鏄剧ずloading
+        ,cellMinWidth: 60 //鎵�鏈夊崟鍏冩牸榛樿鏈�灏忓搴�
+        ,text: {
+            none: '鏃犳暟鎹�'
+        }
+        ,isFilter:false//鏄惁寮�鍚鍐呰繃婊�
+        ,method:'get'//榛樿浠ost鏂瑰紡璇锋眰鍚庡彴
+    };
+    //琛ㄦ牸娓叉煋
+    Class.prototype.render = function(){
+        var that = this
+            ,options = that.config;
+        options.elem = $(options.elem);
+        options.where = options.where || {};
+        options.id = options.id || options.elem.attr('id');
+        //璇锋眰鍙傛暟鐨勮嚜瀹氫箟鏍煎紡
+        options.request = $.extend({
+            pageName: 'page'
+            ,limitName: 'limit'
+        }, options.request)
+        //鍝嶅簲鏁版嵁鐨勮嚜瀹氫箟鏍煎紡
+        options.response = $.extend({
+            statusName: 'code'
+            ,statusCode: 200
+            ,msgName: 'msg'
+            ,dataName: 'data'
+            ,countName: 'total'
+        }, options.response);
+        //濡傛灉 page 浼犲叆 laypage 瀵硅薄
+        if(typeof options.page === 'object'){
+            options.limit = options.page.limit || options.limit;
+            options.limits = options.page.limits || options.limits;
+            that.page = options.page.curr = options.page.curr || 1;
+            delete options.page.elem;
+            delete options.page.jump;
+        }
+        if(!options.elem[0]) return that;
+        that.setArea(); //鍔ㄦ�佸垎閰嶅垪瀹介珮
+        //寮�濮嬫彃鍏ユ浛浠e厓绱�
+        var othis = options.elem
+            ,hasRender = othis.next('.' + ELEM_VIEW)
+
+            //涓诲鍣�
+            ,reElem = that.elem = $(laytpl(TPL_MAIN).render({
+                VIEW_CLASS: ELEM_VIEW
+                ,data: options
+                ,index: that.index //绱㈠紩
+            }));
+        options.index = that.index;
+        //鐢熸垚鏇夸唬鍏冪礌
+        hasRender[0] && hasRender.remove(); //濡傛灉宸茬粡娓叉煋锛屽垯Rerender
+        othis.after(reElem);
+        that.renderTdCss();
+        //鍚勭骇瀹瑰櫒
+        that.layHeader = reElem.find(ELEM_HEADER);  //琛ㄥご
+        that.layMain = reElem.find(ELEM_MAIN);//鍐呭鍖哄煙
+        that.layBody = reElem.find(ELEM_BODY);//鍐呭鍖哄煙
+        that.layFixed = reElem.find(ELEM_FIXED);//娴姩鍖哄煙
+        that.layFixLeft = reElem.find(ELEM_FIXL);//宸︽诞鍔�
+        that.layFixRight = reElem.find(ELEM_FIXR);//鏈夋诞鍔�
+        that.layTool = reElem.find(ELEM_TOOL);//宸ュ叿鏍忓尯鍩�
+        that.layPage = reElem.find(ELEM_PAGE);//鍒嗛〉鍖哄煙
+        that.layFilter=reElem.find(ELEM_FILTER);//琛屽唴杩囨护鏉′欢鍖哄煙
+        that.layTool.html(
+            laytpl($(options.toolbar).html()||'').render(options)
+        );
+        if(options.height) that.fullSize(); //璁剧疆body鍖哄煙楂樺害
+        //濡傛灉澶氱骇琛ㄥご锛屽垯濉ˉ琛ㄥご楂樺害
+        if(options.cols.length > 1){
+            var th = that.layFixed.find(ELEM_HEADER).find('th');
+            th.height(that.layHeader.height() - 1 - parseFloat(th.css('padding-top')) - parseFloat(th.css('padding-bottom')));
+        }
+        //娓叉煋杩囨护鍖哄煙
+        if(options.isFilter){
+            that.layFilter.html(
+                that.renderFilter()
+            );
+        }
+        //璇锋眰鏁版嵁
+        that.pullData(that.page);
+        that.events();
+    };
+    //鏍规嵁鍒楃被鍨嬶紝瀹氬埗鍖栧弬鏁�
+    Class.prototype.initOpts = function(item){
+        var that = this,
+            options = that.config
+            ,initWidth = {
+                checkbox: 48
+                ,space: 15
+                ,numbers: 40
+            };
+
+        //璁� type 鍙傛暟鍏煎鏃х増鏈�
+        if(item.checkbox) item.type = "checkbox";
+        if(item.space) item.type = "space";
+        if(!item.type) item.type = "normal";
+
+        if(item.type !== "normal"){
+            item.unresize = true;
+            item.width = item.width || initWidth[item.type];
+        }
+
+        if(options.isFilter){//寮�鍚鍐呰繃婊�
+            if(item.isFilter!=false){
+                item.isFilter=true;
+            }
+        }
+    };
+    //鍔ㄦ�佸垎閰嶅垪瀹介珮
+    Class.prototype.setArea = function(){
+        var that = this,
+            options = that.config
+            ,colNums = 0 //鍒椾釜鏁�
+            ,autoColNums = 0 //鑷姩鍒楀鐨勫垪涓暟
+            ,autoWidth = 0 //鑷姩鍒楀垎閰嶇殑瀹藉害
+            ,countWidth = 0 //鎵�鏈夊垪鎬诲搴﹀拰
+            ,cntrWidth = options.width ||function(){ //鑾峰彇瀹瑰櫒瀹藉害
+                //濡傛灉鐖跺厓绱犲搴︿负0锛堜竴鑸负闅愯棌鍏冪礌锛夛紝鍒欑户缁煡鎵句笂灞傚厓绱狅紝鐩村埌鎵惧埌鐪熷疄瀹藉害涓烘
+                var getWidth = function(parent){
+                    var width, isNone;
+                    parent = parent || options.elem.parent()
+                    width = parent.width();
+                    try {
+                        isNone = parent.css('display') === 'none';
+                    } catch(e){}
+                    if(parent[0] && (!width || isNone)) return getWidth(parent.parent());
+                    return width;
+                };
+                return getWidth();
+            }();
+        //缁熻鍒椾釜鏁�
+        that.eachCols(function(){
+            colNums++;
+        });
+        //鍑忓幓杈规宸�
+        cntrWidth = cntrWidth - function(){
+            return (options.skin === 'line' || options.skin === 'nob') ? 2 : colNums + 1;
+        }();
+        //閬嶅巻鎵�鏈夊垪
+        layui.each(options.cols, function(i1, item1){
+            layui.each(item1, function(i2, item2){
+                var width;
+                if(!item2){
+                    item1.splice(i2, 1);
+                    return;
+                }
+                that.initOpts(item2);
+                width = item2.width || 0;
+                if(item2.colspan > 1) return;
+                if(/\d+%$/.test(width)){
+                    item2.width = width = Math.floor((parseFloat(width) / 100) * cntrWidth);
+                } else if(item2._is_width_dev||!width){ //鍒楀鏈~鍐�
+                    item2._is_width_dev=true;//閲囩敤榛樿瀹藉害鐨勫垪
+                    item2.width = width = 0;
+                    autoColNums++;
+                }
+                countWidth = countWidth + width;
+            });
+        });
+        that.autoColNums = autoColNums; //璁板綍鑷姩鍒楁暟
+        //濡傛灉鏈~鍏呮弧锛屽垯灏嗗墿浣欏搴﹀钩鍒嗐�傚惁鍒欙紝缁欐湭璁惧畾瀹藉害鐨勫垪璧嬪�间竴涓粯璁ゅ
+        (cntrWidth > countWidth && autoColNums) && (
+            autoWidth = (cntrWidth - countWidth) / autoColNums
+        );
+        layui.each(options.cols, function(i1, item1){
+            layui.each(item1, function(i2, item2){
+                var minWidth = item2.minWidth || options.cellMinWidth;
+                if(item2.colspan > 1) return;
+                if(item2.width === 0){
+                    item2.width = Math.floor(autoWidth >= minWidth ? autoWidth : minWidth); //涓嶈兘浣庝簬璁惧畾鐨勬渶灏忓搴�
+                }
+            });
+        });
+
+        //楂樺害閾烘弧锛歠ull-宸窛鍊�
+        var th=that.getParentDivHeight(options.id);
+        that.fullHeightGap=0;
+        if(options.height){
+            if(/^full-\d+$/.test(options.height)){
+                that.fullHeightGap = options.height.split('-')[1];
+            }
+        }
+        options.height = th - that.fullHeightGap;
+
+        layui.each(options.cols, function(i1, item1){
+            layui.each(item1, function(i2, item2){
+            })
+        });
+    };
+    /**
+     * 琛ㄦ牸鑾峰彇鐖跺鍣ㄩ珮搴�
+     * @param tableId
+     */
+    Class.prototype.getParentDivHeight = function(tableId){
+        var th=$("#"+tableId).parent().height();
+        return th;
+    };
+    //琛ㄦ牸閲嶈浇
+    Class.prototype.reload = function(options){
+        var that = this;
+        if(that.config.data && that.config.data.constructor === Array) delete that.config.data;
+        that.config = $.extend({}, that.config, options);
+        //鑾峰彇琛屽唴杩囨护鐨勫��
+        that.render();
+    };
+    //椤电爜
+    Class.prototype.page = 1;
+    /**
+     * 閲嶇疆涓嬫爣锛堟彃鍏ュ垹闄ょ瓑鎿嶄綔锛�
+     * 1銆乨ata-index涓殑涓嬫爣
+     * 2銆乼r涓璬ata鐨勫��
+     * 3銆佷笅鏍囧瓧娈电殑鍊�
+     * @param list
+     */
+    Class.prototype.restNumbers=function(){
+        var that = this
+            ,options = that.config;
+        var  trs=that.layBody.find('table tbody tr');
+        var i=0;
+        trs.each(function (o) {
+            $(this).attr("data-index",i);
+            $(this).find(".laytable-cell-numbers p").text(i+1);
+            $(this).data('index',i);
+            i++;
+        });
+    }
+    /**
+     * 閲嶇疆褰撳墠琛ㄦ牸鐨勬暟鎹紙1銆佹櫘閫氬垪琛紱2鏍戠姸琛ㄦ牸锛�
+     * 灏嗗垪琛ㄦ暟鎹浆鎴愭爲褰㈢粨鏋勫拰绗﹀悎table灞曠ず鐨勫垪琛�
+     * @param list          鍒楄〃鏁版嵁
+     * @param field_Id      鏍戝舰缁撴瀯涓婚敭瀛楁
+     * @param field_upId    鏍戝舰缁撴瀯涓婄骇瀛楁
+     * @returns {Array}     [0]琛ㄦ牸鍒楄〃  [1]鏍戝舰缁撴瀯
+     */
+    Class.prototype.resetData=function(list) {
+        var that = this
+            ,options = that.config;
+        var datas=[];
+        var treeList=[];
+        var tableList=[];
+        var map={};//鍒楄〃map锛宖ieldId涓簁ey
+        datas.push(tableList);//table缁撴瀯
+        datas.push(treeList)//tree鏍戠粨鏋�
+        datas.push(map)//data鏁版嵁 map缁撴瀯
+        if(list==null||list.length<=0)return datas;
+        //璁剧疆榛樿鍙傛暟
+        for (var i = 0; i < list.length; i++) {
+            var n = list[i];
+            if(options.isTree){
+                if(!n.hasOwnProperty("is_open")){//濡傛灉涓嶅瓨鍦ㄨ灞炴�у垯榛樿涓簍rue
+                    n.is_open=true;
+                }
+                if(!n.hasOwnProperty("is_show")){//濡傛灉涓嶅瓨鍦ㄨ灞炴�у垯榛樿涓簍rue
+                    n.is_show=true;
+                }
+            }
+        }
+        if(options.isTree){//鏍戠姸
+            var field_Id=options[TREE_ID];
+            var field_upId=options[TREE_UPID];
+            //澶勭悊鏍戠粨鏋�
+            var parentValue = options.parentValue;
+            var roots= [];
+            var childrens = [];
+            layui.each(list,function (_index,_item){
+                if(($webUtil.isNull(_item[field_upId]) || $webUtil.isNull(parentValue))
+                    || _item[field_upId] == parentValue){
+                    roots.push(_item);
+                }else{
+                    childrens.push(_item);
+                }
+            });
+            var findChild = function(roots,childrens){
+                for(var i = 0 ; i < roots.length ; i ++){
+                    var root = roots[i];
+                    for(var j = 0 ; j < childrens.length; j ++){
+                        var child = childrens[j];
+                        if(root[field_Id] == child[field_upId]){
+                            if(!root.children){
+                                root.children = [];
+                            }
+                            root.children.push(child);
+                        }
+                    }
+                    if(root.children && root.children.length>0){
+                        findChild(root.children,childrens)
+                    }
+                }
+            }
+            findChild(roots,childrens);
+            // var fa = function(upId) {
+            //     var _array = [];
+            //     for (var i = 0; i < list.length; i++) {
+            //         var n = list[i];
+            //         if (n[field_upId] === upId) {
+            //             n.children = fa(n[field_Id]);
+            //             _array.push(n);
+            //         }
+            //     }
+            //     return _array;
+            // }
+            //treeList=fa(list[0][field_upId],"");//閫掑綊
+            treeList = roots;
+            //澶勭悊琛ㄦ牸缁撴瀯
+            var fa2=function (l,level,upids) {
+                for (var i = 0; i < l.length; i++) {
+                    var n = l[i];
+                    n.level=level;//璁剧疆褰撳墠灞傜骇
+                    n.upIds=upids;
+                    tableList.push(n);
+                    if (n.children&&n.children.length>0) {
+                        fa2(n.children,1+level,upids+"_"+n[field_Id]+"_");
+                    }
+                }
+                return;
+            }
+            fa2(treeList,1,"");
+        }
+        else{
+            tableList=list;
+        }
+        //璁剧疆map鏁版嵁闆嗗悎
+        tableList.forEach(function (o) {
+            map[o[field_Id]]=o;
+        });
+        //璁剧疆鍒板唴瀛樹腑鍘�
+        table.setDataList(that.config.id,tableList);
+        table.setDataTreeList(that.config.id,treeList);
+        table.setDataMap(that.config.id,map);
+        return datas;
+    }
+    /**
+     * 鏍规嵁id浠庤〃鏍兼暟鎹腑鑾峰彇瀵硅薄
+     * @param data
+     * @param field_Id
+     * @param field_upId
+     * @returns {Array}
+     */
+    Class.prototype.treeFindDataById=function(u_Id) {
+        var that = this
+            ,options = that.config;
+        var e=null;
+        var list=table.getDataList(that.key);
+        var key=options[TREE_ID];
+        list.forEach(function (o) {
+             if(o[key]==u_Id){
+                 e=o;
+                 return;
+             }
+        });
+        return e;
+    }
+    /**
+     * 鑾峰彇鐖惰妭鐐�
+     * @param u_Id
+     */
+    Class.prototype.treeFindUpData=function(o){
+        var uOjb=null;
+        var that = this
+            ,options = that.config;
+        //澶勭悊鐖剁骇
+        var key=options[TREE_UPID];//鐖惰妭鐐筴ey鍚嶇О
+        var mapData=table.getDataMap(that.config.id);//鑾峰彇map褰㈠紡瀵硅薄闆嗗悎
+        uOjb=mapData[o[key]];
+        return uOjb;
+    }
+    /**
+     * 鏍规嵁鐖秈d鑾峰彇鍏ㄩ儴鐨勫彾瀛愯妭鐐�(閫掑綊)
+     * @param o 鏁版嵁瀵硅薄
+     * @return {string}
+     */
+    Class.prototype.treeFindSonData=function (data) {
+        var objs=[];
+        function f(o) {
+            if(o.children.length>0){
+                o.children.forEach(function (i) {
+                    objs.push(i);
+                    if(i.children.length>0){
+                        f(i);
+                    }
+                });
+            }
+        }f(data);
+        return objs;
+    };
+    /**
+     * 鍙跺瓙鑺傜偣鏄剧ず杞崲
+     * @param o             鏁版嵁
+     * @param fieldName     鏍戞樉绀哄垪鍚�
+     * @returns {string}
+     */
+    Class.prototype.treeConvertShowName=function (o) {
+        var that = this
+            ,options = that.config;
+        var isTreeNode=(o.children&&o.children.length>0);
+        var temhtml='<div style="float: left;height: 28px;line-height: 28px;padding-left: '+
+            function () {
+                if(isTreeNode){
+                    return '5px'
+                }else{
+                    return '21px'
+                }
+            }()
+            +'">'
+            +function () {//浣嶇Щ閲�
+                var nbspHtml="<i>"//涓�娆′綅绉�
+                for(var i=1;i<o.level;i++) {
+                    nbspHtml = nbspHtml + "&nbsp;&nbsp;&nbsp;&nbsp;";
+                }
+                nbspHtml=nbspHtml+"</i>";
+                return nbspHtml;
+            }()
+            +function () {//鍥炬爣鎴栧崰浣嶇
+                var temTreeHtml='';
+                if(isTreeNode)temTreeHtml='<i class="layui-icon layui-tree-head">&#xe625;</i> ';
+                return temTreeHtml;
+            }()
+            +'</div>';
+        return temhtml;
+    };
+    /**
+     * 鑺傜偣鐨勫睍寮�鎴栨姌鍙�
+     * @param o         鑺傜偣鏁版嵁锛堟爲鐘惰〃鏍硷級
+     * @param is_open    灞曞紑锛坱rue锛夋垨鎶樺彔锛坒alse锛�
+     *
+     * 姣忎釜鑺傜偣鏈変袱绉嶇姸鎬侊紝
+     * 1銆佹墦寮�鐘舵�侊紙is_open锛�   鎵撳紑鐘舵�佸彧闇�鍦ㄧ偣鍑荤灛闂存帶鍒讹紝鍏朵粬鏃跺�欎笉闇�瑕佸彉鍔�
+     * 2銆佹樉绀虹姸鎬侊紙鏄剧ず鎴栭殣钘忥級 鏄剧ず鐘舵�佹牴鎹埗绾ц妭鐐规帶鍒讹紝鐖剁骇鑺傜偣鏄樉绀哄苟涓旀墦寮�鐘舵�佺殑鍒欐樉绀猴紝鍚﹀垯涓嶆樉绀猴紝浣嗕笉褰卞搷鍏舵墦寮�鐘舵��
+     */
+    Class.prototype.treeNodeOpen=function (o,is_open) {
+        var that = this
+            ,options = that.config
+            ,tr = that.layBody.find('tr[data-index="'+ o[table.config.indexName] +'"]');
+        o.is_open=is_open;
+        //澶勭悊鏍戠粨鏋�
+        var fa = function(e) {
+            if(e.children&&e.children.length>0){
+                var temList=e.children;
+                for (var i = 0; i < temList.length; i++) {
+                    var n = temList[i];
+                    if(o.is_open){//鎵撳紑鐘舵�佺殑锛屽叧闂�
+                        if(e.is_open&&e.is_show){//璇ヨ妭鐐规樉绀�
+                            var temo=that.layBody.find('tr[data-index="'+ n[table.config.indexName] +'"]');
+                            temo.show();
+                            n.is_show=true;
+                        }
+                    }else{
+                        var temo=that.layBody.find('tr[data-index="'+ n[table.config.indexName] +'"]');
+                        temo.hide();
+                        n.is_show=false;
+                    }
+                    fa(n);
+                }
+            }
+        }
+        fa(o);
+        //澶勭悊鍥炬爣
+        var dbClickI=tr.find('.layui-tree-head');
+        if(o.is_open){//鎵撳紑鐘舵��
+            dbClickI.html('&#xe625;');
+        }else{
+            dbClickI.html('&#xe623;');
+        }
+    };
+    //鑾峰緱鏁版嵁
+    Class.prototype.pullData = function(curr, loadIndex){
+        var that = this
+            ,options = that.config
+            ,request = options.request
+            ,response = options.response
+            ,sort = function(){
+            if(typeof options.initSort === 'object'){
+                that.sort(options.initSort.field, options.initSort.type);
+            }
+        };
+        that.startTime = new Date().getTime(); //娓叉煋寮�濮嬫椂闂�
+        if(options.url){ //Ajax璇锋眰
+            var params = {};
+            if(options.page){
+                params[request.pageName] = curr;
+                params[request.limitName] = options.limit;
+            }else{
+                params[request.pageName] = 1;
+                params[request.limitName] = -1;
+            }
+            //琛屽唴杩囨护鏉′欢
+            var list=that.layFilter.find("[name^='filter_']");
+            layui.each(list,function (i, o) {
+               params[o.name]=$(o).val();
+            });
+            var queryParams={}
+            if(options.sourceDataParams){
+                //璇存槑鏄墿灞曞睘鎬�
+                for (var key in options.sourceDataParams) {
+                    if(key && key.constructor === Object) return;
+                    queryParams['sourceData["'+key+'"]' ] = options.sourceDataParams[key];//鏂扮殑鏂瑰紡
+                }
+            }
+            var url = options.url;
+            if($webUtil.isNotNull(options.backPath)){
+                url = options.backPath + options.url;
+            }
+            var header = {};
+            header[TOKEN_KEY] = $webUtil.getToken();
+            $.ajax({
+                type: options.method || 'get'
+                ,url: url
+                ,data: $.extend(params, options.where,options.extraParams,queryParams)
+                ,dataType: 'json'
+                ,headers:header
+                ,success: function(res){
+                    that.resetData(res.data);
+                    res.data=table.getDataList(options.id);
+                    if(res[response.statusName] != 0 && res[response.statusName] != response.statusCode){
+                        that.renderForm();
+                        that.layMain.html('<div class="'+ NONE +'">'+ (res[response.msgName] || '杩斿洖鐨勬暟鎹姸鎬佸紓甯�') +'</div>');
+                    } else {
+                        that.renderData(res, curr, res[response.countName],!options.remoteSort);
+                        if(options.remoteSort && that.sortKey){
+                            //璇存槑鏄粠鍚庡彴鍘绘帓搴忕殑锛屽氨涓嶉渶瑕佸墠绔帓搴忎簡
+                        }else {
+                            sort();
+                        }
+                        options.time = (new Date().getTime() - that.startTime) + ' ms'; //鑰楁椂锛堟帴鍙h姹�+瑙嗗浘娓叉煋锛�
+                    }
+                    loadIndex && layer.close(loadIndex);
+                    typeof options.done === 'function' && options.done(res, curr, res[response.countName]);
+
+                }
+                ,error: function(e, m){
+                    that.layMain.html('<div class="'+ NONE +'">鏁版嵁鎺ュ彛璇锋眰寮傚父</div>');
+                    that.renderForm();
+                    loadIndex && layer.close(loadIndex);
+                }
+            });
+        } else if(options.data && options.data.constructor === Array){ //宸茬煡鏁版嵁
+            var res = {},startLimit = curr*options.limit - options.limit
+            res[response.dataName] = options.data.concat().splice(startLimit, options.limit);
+            res[response.countName] = options.data.length;
+            that.renderData(res, curr, options.data.length), sort();
+            typeof options.done === 'function' && options.done(res, curr, res[response.countName]);
+        }
+    };
+    //閬嶅巻琛ㄥご
+    Class.prototype.eachCols = function(callback){
+        var cols = $.extend(true, [], this.config.cols)
+            ,arrs = [], index = 0;
+
+        //閲嶆柊鏁寸悊琛ㄥご缁撴瀯
+        layui.each(cols, function(i1, item1){
+            layui.each(item1, function(i2, item2){
+                //濡傛灉鏄粍鍚堝垪锛屽垯鎹曡幏瀵瑰簲鐨勫瓙鍒�
+                if(item2.colspan > 1){
+                    var childIndex = 0;
+                    index++
+                    item2.CHILD_COLS = [];
+                    layui.each(cols[i1 + 1], function(i22, item22){
+                        if(item22.PARENT_COL || childIndex == item2.colspan) return;
+                        item22.PARENT_COL = index;
+                        item2.CHILD_COLS.push(item22);
+                        childIndex = childIndex + (item22.colspan > 1 ? item22.colspan : 1);
+                    });
+                }
+                if(item2.PARENT_COL) return; //濡傛灉鏄瓙鍒楋紝鍒欎笉杩涜杩藉姞锛屽洜涓哄凡缁忓瓨鍌ㄥ湪鐖跺垪涓�
+                arrs.push(item2)
+            });
+        });
+
+        //閲嶆柊閬嶅巻鍒楋紝濡傛灉鏈夊瓙鍒楋紝鍒欒繘鍏ラ�掑綊
+        var eachArrs = function(obj){
+            layui.each(obj || arrs, function(i, item){
+                if(item.CHILD_COLS) return eachArrs(item.CHILD_COLS);
+                callback(i, item);
+            });
+        };
+
+        eachArrs();
+    };
+
+    /**
+     * 娓叉煋鑺傜偣鏄剧ず
+     * @param callback
+     */
+    Class.prototype.renderTreeConvertShowName = function(o){
+        var that = this
+            ,options = that.config
+            ,m=options.elem
+            ,hasRender = m.next('.' + ELEM_VIEW);
+        var temhtml=that.treeConvertShowName(o);
+        var temdiv=that.layBody.find('tr[data-index="'+ o[table.config.indexName] +'"]').find('td[data-field='+options[TREE_SHOW_NAME]+']').find('.layui-table-cell');
+        $(temdiv).find('div').remove();
+        $(temdiv).prepend(temhtml);
+    }
+    /**
+     * 娓叉煋琛ㄦ牸鍗曞厓鏍兼牱寮�(瀹藉害鏍峰紡璁剧疆)
+     * @param callback
+     */
+    Class.prototype.renderTdCss = function(){
+        var that = this
+            ,options = that.config
+            ,m=options.elem
+            ,hasRender = m.next('.' + ELEM_VIEW);
+        var id=that.index+'_dltable_td_style';
+        hasRender.find("#"+id).remove();
+        var styel='<style id="'+id+'">'
+            +function () {
+                var ret="";
+                layui.each(that.config.cols,function (i1, item1) {
+                    layui.each(item1, function(i2, item2){
+                        ret+='.laytable-cell-'+that.index+'-'+(item2.field||i2)+'{' +
+                            'width:'+(item2.width?item2.width+"px":"0px")
+                            +'}';
+                    });
+                });
+                return ret;
+            }()+'</style>';
+        hasRender.append(styel);
+    }
+    /**
+     * 鐢熸垚鍗曞厓鏍�
+     * @param obj       琛屾暟鎹�
+     * @param numbers   涓嬫爣
+     * @param cols      鍒楀畾涔夋暟鎹�
+     * @param i3        绗嚑鍒�
+     */
+    Class.prototype.renderTrUpids=function (obj) {
+        var that = this
+            ,options = that.config;
+        var tree_upid_key=options[TREE_UPID];
+        var upids=' upids="'+obj["upIds"]+'" ';
+        var u_id=' u_id="'+obj[tree_upid_key]+'" '
+        var ret=options.isTree?u_id:'';
+        return ret;
+    }
+    /**
+     * 鐢熸垚鍗曞厓鏍�
+     * @param obj       琛屾暟鎹�
+     * @param numbers   涓嬫爣
+     * @param cols      鍒楀畾涔夋暟鎹�
+     * @param i3        绗嚑鍒�
+     */
+    Class.prototype.renderTd=function (param) {
+        var that = this
+            ,options = that.config;
+        var cols=param.cols;
+        var obj=param.obj;
+        var numbers=param.numbers;
+        var i3=param.i3;
+
+        var field = cols.field || i3, content = obj[field]||''
+            ,cell = that.getColElem(that.layHeader, field.split(',')[0]);
+        if(field.indexOf("_")>-1 && field.replace("_",".") in obj){//鍙傜収瀛楁鐨勬樉绀哄��
+            content = obj[field.replace("_",".")];
+        }
+        if(field.indexOf(".")>-1 && field.split(".")[0] in obj && obj[field.split(".")[0]][field.split(".")[1]]){//瀛楁鏄璞★紝鑾峰彇璇ュ璞′腑鐨勫��
+            content = obj[field.split(".")[0]][field.split(".")[1]];
+        }
+        if(field.indexOf(",")>-1){//涓�鍒楁樉绀哄涓瓧娈�,瀛楁涔嬮棿浠�','鍒嗘牸,鍙负瀛楃涓�
+            content = '';
+            layui.each(field.split(','), function(fi,fitem){
+                content += obj[$.trim(fitem)] || ((fitem in obj)?'':fitem);
+            })
+        }
+        if(cols.dateFormate){
+            content = $webUtil.formateDateByFormate(content,cols.dateFormate);
+        }
+        if(content === undefined || content === null) content = '';
+        var treeImgHtml='';
+        if(options.isTree){
+            if(options.treeShowName==cols.field){
+                treeImgHtml=that.treeConvertShowName(obj);
+            }
+        }
+        if(cols.colspan > 1) return;
+        field=field.split(',')[0];
+        //td鍐呭
+        var td = ['<td data-field="'+ field +'" '+ function(){
+            var attr = [];
+            if(cols.edit) attr.push('data-edit="'+ cols.edit +'"'); //鏄惁鍏佽鍗曞厓鏍肩紪杈�
+            if(cols.align) attr.push('align="'+ cols.align +'"'); //瀵归綈鏂瑰紡
+            if(cols.templet) attr.push('data-content="'+ content +'"'); //鑷畾涔夋ā鏉�
+            if(cols.toolbar) attr.push('data-off="true"'); //鑷畾涔夋ā鏉�
+            if(cols.event) attr.push('lay-event="'+ cols.event +'"'); //鑷畾涔変簨浠�
+            if(cols.style) attr.push('style="'+ cols.style +'"'); //鑷畾涔夋牱寮�
+            if(cols.minWidth) attr.push('data-minwidth="'+ cols.minWidth +'"'); //鍗曞厓鏍兼渶灏忓搴�
+            return attr.join(' ');
+        }() +'>'
+            ,'<div class="layui-table-cell laytable-cell-'+ function(){ //杩斿洖瀵瑰簲鐨凜SS绫绘爣璇�
+                var str = (options.index + '-' + field.replace('.','--'));
+                return cols.type === 'normal' ? str
+                    : (str + ' laytable-cell-' + cols.type);
+            }() +'">'+treeImgHtml+'<p style="width: auto;height: 100%;">'+ function(){
+                var tplData = $.extend(true, {
+                    LAY_INDEX: numbers
+                }, obj);
+                //娓叉煋澶嶉�夋鍒楄鍥�
+                if(cols.type === 'checkbox'){
+                    return '<input type="checkbox" name="layTableCheckbox" value="'+tplData[table.config.indexName]+'" lay-skin="primary" '+ function(){
+                            var checkName = table.config.checkName;
+                            //濡傛灉鏄叏閫�
+                            if(cols[checkName]){
+                                obj[checkName] = cols[checkName];
+                                return cols[checkName] ? 'checked' : '';
+                            }
+                            return tplData[checkName] ? 'checked' : '';
+                        }() +'>';
+                } else if(cols.type === 'numbers'){ //娓叉煋搴忓彿
+                    return numbers;
+                }else if(cols.type === 'drop'){//涓嬫媺妗�
+                    var rowsField=dl.ui.table.drop.findFieldObj(options.cols[0],field);
+                    if(rowsField&&rowsField['drop']){
+                        var o=dl.cache.code.get(rowsField.drop);
+                        return dl.ui.table.drop.findDropLable(rowsField.drop,content);
+                    }
+                }else if(cols.type === 'radio'){//鍗曢��
+                    return '<input type="radio" name="'+TABLE_RADIO_ID+options.id+'" value="'+tplData[table.config.indexName]+'" checked="">';
+                }
+
+                //瑙f瀽宸ュ叿鍒楁ā鏉�
+                if(cols.toolbar){
+                    return laytpl($(cols.toolbar).html()||'').render(tplData);
+                }
+
+                return cols.templet ? function(){
+                    return typeof cols.templet === 'function'
+                        ? cols.templet(tplData)
+                        : laytpl($(cols.templet).html() || String(content)).render(tplData)
+                }() : content;
+            }()
+            ,'</p></div></td>'].join('');
+
+        return td;
+    }
+    /**
+     * 鐢熸垚tr涓殑涓�琛�
+     * @param obj            琛屾暟鎹�
+     * @param numbers          琛屽彿
+     * @returns {*}
+     */
+    Class.prototype.renderTr=function (obj,numbers) {
+        var that = this
+            ,options = that.config;
+        var tds= [];
+        that.eachCols(function(i3, cols){//cols鍒楀畾涔�
+            var field = cols.field || i3, content = obj[field]
+                ,cell = that.getColElem(that.layHeader, field.split(',')[0]);
+            if(content === undefined || content === null) content = '';
+            if(cols.colspan > 1) return;
+            //td鍐呭
+            var td = that.renderTd({
+                'obj':obj,'numbers':numbers,'cols':cols,'i3':i3
+            });
+            tds.push(td);
+            // if(item3.fixed && item3.fixed !== 'right') tds_fixed.push(td);
+            // if(item3.fixed === 'right') tds_fixed_r.push(td);
+        });
+        return tds;
+    };
+    /**
+     * 琛ㄦ牸鏁版嵁閮ㄥ垎娓叉煋鍏ュ彛
+     * @param res
+     * @param curr
+     * @param count
+     * @param sort
+     */
+    Class.prototype.renderData = function(res, curr, count, sort){
+        var that = this
+            ,options = that.config
+            ,data = res[options.response.dataName] || []
+            ,trs = []
+            ,trs_fixed = []
+            ,trs_fixed_r = []
+            //娓叉煋瑙嗗浘
+            ,render = function(){ //鍚庣画鎬ц兘鎻愬崌鐨勯噸鐐�
+                if(!sort && that.sortKey){
+                    return that.sort(that.sortKey.field, that.sortKey.sort, true);
+                }
+                layui.each(data, function(i1, obj){
+                    var tds = [], tds_fixed = [], tds_fixed_r = []
+                        ,numbers = i1 + options.limit*(curr - 1) + 1; //搴忓彿
+                    if(obj.length === 0) return;
+                    if(!sort){
+                        obj[table.config.indexName] = i1;
+                    }
+                    if($webUtil.isNull(item1['data'])){
+                        delete item1['data'];
+                    }
+                    tds=that.renderTr(obj,numbers);
+                    trs.push('<tr data-index="'+ i1 +'" '+that.renderTrUpids(obj)+'>'+ tds.join('') + '</tr>');
+
+                    trs_fixed.push('<tr data-index="'+ i1 +'">'+ tds_fixed.join('') + '</tr>');
+                    trs_fixed_r.push('<tr data-index="'+ i1 +'">'+ tds_fixed_r.join('') + '</tr>');
+                });
+
+                //if(data.length === 0) return;
+
+                that.layBody.scrollTop(0);
+                that.layMain.find('.'+ NONE).remove();
+                that.layMain.find('tbody').html(trs.join(''));
+                that.layFixLeft.find('tbody').html(trs_fixed.join(''));
+                that.layFixRight.find('tbody').html(trs_fixed_r.join(''));
+
+                that.renderForm();
+                that.syncCheckAll();
+                that.haveInit ? that.scrollPatch() : setTimeout(function(){
+                    that.scrollPatch();
+                }, 50);
+                that.haveInit = true;
+                layer.close(that.tipsIndex);
+            };
+        that.key = options.id || options.index;
+        // table.cache[that.key] = data; //璁板綍鏁版嵁
+        table.setDataList(that.key,data);
+        //鏄剧ず闅愯棌鍒嗛〉鏍�
+        that.layPage[data.length === 0 && curr == 1 ? 'addClass' : 'removeClass'](HIDE);
+        //鎺掑簭
+        if(sort){
+            return render();
+        }
+        if(data.length === 0){
+            that.renderForm();
+            that.layFixed.remove();
+            that.layMain.find('tbody').html('');
+            that.layMain.find('.'+ NONE).remove();
+            return that.layMain.append('<div class="'+ NONE +'">'+ options.text.none +'</div>');
+        }
+        render();
+        that.renderPage(count);//鍒嗛〉娓叉煋
+        //calss鍔犺浇瀹屾垚
+        table.pushClassIds(options.id,true);
+
+        layui.each(options.cols, function(i1, item1){
+            layui.each(item1, function(i2, item2){
+            })
+        });
+    };
+    /**
+     * 娓叉煋鍒嗛〉
+     */
+    Class.prototype.renderPage=function (count) {
+        var that = this
+            ,options = that.config;
+        //鍚屾鍒嗛〉鐘舵��
+        if(options.page){
+            options.page = $.extend({
+                elem: 'layui-table-page' + options.index
+                ,count: count
+                ,limit: options.limit
+                ,limits: options.limits || [10,15,20,30,40,50,60,70,80,90]
+                ,groups: 3
+                ,layout: ['prev', 'page', 'next', 'skip', 'count', 'limit']
+                ,prev: '<i class="layui-icon">&#xe603;</i>'
+                ,next: '<i class="layui-icon">&#xe602;</i>'
+                ,jump: function(obj, first){
+                    if(!first){
+                        //鍒嗛〉鏈韩骞堕潪闇�瑕佸仛浠ヤ笅鏇存柊锛屼笅闈㈠弬鏁扮殑鍚屾锛屼富瑕佹槸鍥犱负鍏跺畠澶勭悊缁熶竴鐢ㄥ埌浜嗗畠浠�
+                        //鑰屽苟闈炵敤鐨勬槸 options.page 涓殑鍙傛暟锛堜互纭繚鍒嗛〉鏈紑鍚殑鎯呭喌浠嶈兘姝e父浣跨敤锛�
+                        that.page = obj.curr; //鏇存柊椤电爜
+                        options.limit = obj.limit; //鏇存柊姣忛〉鏉℃暟
+                        that.pullData(obj.curr, that.loading());
+                    }
+                }
+            }, options.page);
+            options.page.count = count; //鏇存柊鎬绘潯鏁�
+            laypage.render(options.page);
+        }
+    };
+    /**
+     * 杩囨护鍖哄煙鐨勬覆鏌�
+     */
+    Class.prototype.renderFilter = function(){
+        var that = this
+            ,options = that.config
+            ,VIEW_CLASS=ELEM_VIEW
+            ,index=that.index; //绱㈠紩
+        var v = [];
+        v.push('<form method="post"  id="'+options.id+'_filter_form">');
+        v.push('<table cellspacing="0" cellpadding="0" border="0" class="layui-table"><thead><tr>');
+        layui.each(options.cols,function (i, o) {
+            layui.each(o, function(i2, item2){
+                var field=item2.field||i2;
+                var minW=item2.minWidth?"data-minwidth='"+item2.minWidth+"'":"";
+                var rowCols=item2.colspan?'colspan="'+item2.colspan+'"':'';
+                var rowspan=item2.rowspan?'rowspan="'+item2.rowspan+'"':'';
+                var unresize=item2.unresize?'data-unresize="true"':'';
+                v.push('<th data-field="'+field+'"'+minW+rowCols+rowspan +unresize+'>');
+                v.push('<div class="layui-table-cell laytable-cell-'+function () {
+                    var tem="";
+                    if (item2.colspan > 1) {
+                        tem='group';
+                    }else{
+                        tem=index+"-"+field.replace('.','--');
+                        if(item2.type !== "normal"){
+                            tem+=" laytable-cell-"+item2.type;
+                        }
+                    }
+                    return tem;
+                }()+'">');
+                if(!item2.isFilter||!item2.field){//涓嶅紑鍚鍐呰繃婊ゆ垨娌℃湁鍒楀悕
+                    v.push('');
+                }else{
+                    v.push('<input class="layui-input '+ ELEM_EDIT +'" id="filter_'+item2.field+'" name="filter_'+item2.field+'">');
+                }
+                v.push('</div></th>');
+
+            });
+        });
+        v.push('</tr></thead></table>');
+        v.push('</form>');
+        return v.join('');
+    };
+    //鎵惧埌瀵瑰簲鐨勫垪鍏冪礌
+    Class.prototype.getColElem = function(parent, field){
+        var that = this
+            ,options = that.config;
+        return parent.eq(0).find('.laytable-cell-'+ (options.index + '-' + field) + ':eq(0)');
+    };
+    //娓叉煋琛ㄥ崟
+    Class.prototype.renderForm = function(type){
+        form.render(type, 'LAY-table-'+ this.index);
+    }
+    //鏁版嵁鎺掑簭
+    Class.prototype.sort = function(th, type, pull, formEvent){
+        var that = this
+            ,field
+            ,res = {}
+            ,options = that.config
+            ,filter = options.elem.attr('lay-filter')
+            ,data = table.getDataList(that.key), thisData;
+
+        //瀛楁鍖归厤
+        if(typeof th === 'string'){
+            that.layHeader.find('th').each(function(i, item){
+                var othis = $(this)
+                    ,_field = othis.data('field');
+                if(_field === th){
+                    th = othis;
+                    field = _field;
+                    return false;
+                }
+            });
+        }
+
+        try {
+            var field = field || th.data('field');
+
+            //濡傛灉娆叉墽琛岀殑鎺掑簭宸插湪鐘舵�佷腑锛屽垯涓嶆墽琛屾覆鏌�
+            if(that.sortKey && !pull){
+                if(field === that.sortKey.field && type === that.sortKey.sort){
+                    return;
+                }
+            }
+
+            var elemSort = that.layHeader.find('th .laytable-cell-'+ options.index +'-'+ field).find(ELEM_SORT);
+            that.layHeader.find('th').find(ELEM_SORT).removeAttr('lay-sort'); //娓呴櫎鍏跺畠鏍囬鎺掑簭鐘舵��
+            elemSort.attr('lay-sort', type || null);
+            that.layFixed.find('th')
+        } catch(e){
+            return hint.error('Table modules: Did not match to field');
+        }
+
+        //璁板綍鎺掑簭绱㈠紩鍜岀被鍨�
+        that.sortKey = {
+            field: field
+            ,sort: type
+        };
+
+        if(type === 'asc'){ //鍗囧簭
+            thisData = layui.sort(data, field);
+        } else if(type === 'desc'){ //闄嶅簭
+            thisData = layui.sort(data, field, true);
+        } else { //娓呴櫎鎺掑簭
+            thisData = layui.sort(data, table.config.indexName);
+            delete that.sortKey;
+        }
+
+        res[options.response.dataName] = thisData;
+        that.renderData(res, that.page, that.count, true);
+
+        if(formEvent){
+            layui.event.call(th, MOD_NAME, 'sort('+ filter +')', {
+                field: field
+                ,type: type
+            });
+        }
+    };
+    //璇锋眰loading
+    Class.prototype.loading = function(){
+        var that = this
+            ,options = that.config;
+        if(options.loading && options.url){
+            return layer.msg('鏁版嵁璇锋眰涓�', {
+                icon: 16
+                ,offset: [
+                    that.elem.offset().top + that.elem.height()/2 - 35 - _WIN.scrollTop() + 'px'
+                    ,that.elem.offset().left + that.elem.width()/2 - 90 - _WIN.scrollLeft() + 'px'
+                ]
+                ,time: -1
+                ,anim: -1
+                ,fixed: false
+            });
+        }
+    };
+    //鍚屾閫変腑鍊肩姸鎬�
+    Class.prototype.setCheckData = function(index, checked){
+        var that = this
+            ,options = that.config
+            ,thisData = table.getDataList(that.key);
+        if(!thisData[index]) return;
+        if(thisData[index].constructor === Array) return;
+        thisData[index][options.checkName] = checked;
+    };
+    //鍚屾鍏ㄩ�夋寜閽姸鎬�
+    Class.prototype.syncCheckAll = function(){
+        var that = this
+            ,options = that.config
+            ,checkAllElem = that.layHeader.find('input[name="layTableCheckbox"]')
+            ,syncColsCheck = function(checked){
+            that.eachCols(function(i, item){
+                if(item.type === 'checkbox'){
+                    item[options.checkName] = checked;
+                }
+            });
+            return checked;
+        };
+
+        if(!checkAllElem[0]) return;
+
+        if(table.checkStatus(that.key).isAll){
+            if(!checkAllElem[0].checked){
+                checkAllElem.prop('checked', true);
+                that.renderForm('checkbox');
+            }
+            syncColsCheck(true);
+        } else {
+            if(checkAllElem[0].checked){
+                checkAllElem.prop('checked', false);
+                that.renderForm('checkbox');
+            }
+            syncColsCheck(false);
+        }
+    };
+    //鑾峰彇cssRule
+    Class.prototype.getCssRule = function(field, callback){
+        var that = this
+            ,style = that.elem.find('style')[0]
+            ,sheet = style.sheet || style.styleSheet || {}
+            ,rules = sheet.cssRules || sheet.rules;
+        layui.each(rules, function(i, item){
+            if(item.selectorText === ('.laytable-cell-'+ that.index +'-'+ field.split(',')[0].replace(/\./g,'--'))){
+                return callback(item), true;
+            }
+        });
+    };
+    /**
+     * 绐椾綋鍙樺寲鑷�傚簲
+     */
+    Class.prototype.resize = function(){
+        var that = this;
+        //鏍规嵁鐖剁獥浣撻珮搴﹁缃畉able鐨勯珮搴�
+        // 1銆乼able鑷韩椤剁骇瀹瑰櫒楂樺害锛坙ayui-table-view锛�
+        // 2銆佸唴瀹瑰尯鍩熼珮搴︼紙layui-table-main锛�
+        that.setArea();
+        that.fullSize();//楂樺害鎺у埗
+        //瀹藉害鎺у埗锛堟渶鍚庝竴琛岋級
+        that.resizeWidth();
+        that.scrollPatch();
+    };
+    /**
+     * 閲嶆柊娓叉煋瀹藉害
+     */
+    Class.prototype.resizeWidth = function(){
+        var that = this;
+        that.renderTdCss();
+    };
+    //閾烘弧琛ㄦ牸涓讳綋楂樺害
+    Class.prototype.fullSize = function(){
+        var that = this
+            ,options = that.config
+            ,height = options.height, bodyHeight;
+
+        height = that.getParentDivHeight(options.id) - that.fullHeightGap;
+        if(height < 135) height = 135;
+        that.elem.css('height', height);
+
+        //tbody鍖哄煙楂樺害
+        // bodyHeight = parseFloat(height) - parseFloat(that.layHeader.height()) - 1;//鍘熸湰浠g爜
+        var theader=options.isFilter?76:38;//娌℃湁琛屽唴杩囨护鍖哄煙
+        bodyHeight = parseFloat(height) - theader - 1;//###娉ㄦ剰锛氱幇鍦ㄥ啓姝昏〃澶村浐瀹氶珮搴︿负38px锛屽嵆涓嶆敮鎸佸琛ㄥご鏂瑰紡锛堝湪tab鏂瑰紡涓嬫棤娉曡幏鍙栨纭殑楂樺害锛屽緟澶勭悊锛�
+        if(options.toolbar){
+            bodyHeight = bodyHeight - that.layTool.outerHeight();
+        }
+        if(options.page){
+            bodyHeight = bodyHeight - that.layPage.outerHeight() - 1;
+        }
+        that.layMain.css('height', bodyHeight);
+        // console.log(bodyHeight,that.layHeader.height());
+    };
+    //鑾峰彇婊氬姩鏉″搴�
+    Class.prototype.getScrollWidth = function(elem){
+        var width = 0;
+        if(elem){
+            width = elem.offsetWidth - elem.clientWidth;
+        } else {
+            elem = document.createElement('div');
+            elem.style.width = '100px';
+            elem.style.height = '100px';
+            elem.style.overflowY = 'scroll';
+
+            document.body.appendChild(elem);
+            width = elem.offsetWidth - elem.clientWidth;
+            document.body.removeChild(elem);
+        }
+        return width;
+    };
+    //婊氬姩鏉¤ˉ涓�
+    Class.prototype.scrollPatch = function(){
+        var that = this
+            ,layMainTable = that.layMain.children('table')
+            ,scollWidth = that.layMain.width() - that.layMain.prop('clientWidth') //绾靛悜婊氬姩鏉″搴�
+            ,scollHeight = that.layMain.height() - that.layMain.prop('clientHeight') //妯悜婊氬姩鏉¢珮搴�
+            ,getScrollWidth = that.getScrollWidth(that.layMain[0]) //鑾峰彇涓诲鍣ㄦ粴鍔ㄦ潯瀹藉害锛屽鏋滄湁鐨勮瘽
+            ,outWidth = layMainTable.outerWidth() - that.layMain.width(); //琛ㄦ牸鍐呭鍣ㄧ殑瓒呭嚭瀹藉害
+
+        //濡傛灉瀛樺湪鑷姩鍒楀锛屽垯瑕佷繚璇佺粷瀵瑰~鍏呮弧锛屽苟涓斾笉鑳藉嚭鐜版í鍚戞粴鍔ㄦ潯
+        if(that.autoColNums && outWidth < 5 && !that.scrollPatchWStatus){
+            var th = that.layHeader.eq(0).find('thead th:last-child')
+                ,field = th.data('field').split(',')[0].replace(/\./g,'--');
+            that.getCssRule(field, function(item){
+                var width = item.style.width || th.outerWidth();
+                item.style.width = (parseFloat(width) - getScrollWidth - outWidth) + 'px';
+                //浜屾鏍¢獙锛屽鏋滀粛鐒跺嚭鐜版í鍚戞粴鍔ㄦ潯
+                if(that.layMain.height() - that.layMain.prop('clientHeight') > 0){
+                    item.style.width = parseFloat(item.style.width) - 1 + 'px';
+                }
+                that.scrollPatchWStatus = true;
+            });
+        }
+        if(scollWidth && scollHeight){
+            if(that.elem.find('.layui-table-patch').length<=0){
+                var patchElem = $('<th class="layui-table-patch"><div class="layui-table-cell"></div></th>'); //琛ヤ竵鍏冪礌
+                patchElem.find('div').css({
+                    width: scollWidth
+                });
+                that.layHeader.eq(0).find('thead tr').append(patchElem);
+                //that.layFilter.find('table thead tr').append(patchElem);
+            }
+        } else {
+            that.layFilter.eq(0).find('.layui-table-patch').remove();
+            that.layHeader.eq(0).find('.layui-table-patch').remove();
+        }
+        //鍥哄畾鍒楀尯鍩熼珮搴�
+        var mainHeight = that.layMain.height()
+            ,fixHeight = mainHeight - scollHeight;
+        that.layFixed.find(ELEM_BODY).css('height', layMainTable.height() > fixHeight ? fixHeight : 'auto');
+        //琛ㄦ牸瀹藉害灏忎簬瀹瑰櫒瀹藉害鏃讹紝闅愯棌鍥哄畾鍒�
+        that.layFixRight[outWidth > 0 ? 'removeClass' : 'addClass'](HIDE);
+        //鎿嶄綔鏍�
+        that.layFixRight.css('right', scollWidth - 1);
+    };
+    //浜嬩欢澶勭悊
+    Class.prototype.events = function(){
+        var that = this
+            ,options = that.config
+            ,_BODY = $('body')
+            ,dict = {}
+            ,th = that.layHeader.find('th')
+            ,resizing
+            ,ELEM_CELL = '.layui-table-cell'
+            ,filter = options.elem.attr('lay-filter')
+            ,layFilter=that.layFilter.find("[name^='filter_']")//琛屽唴杩囨护鍏冪礌
+            ;
+
+        //琛屽唴杩囨护
+        layFilter.on('keyup',function () {
+            that.page=1;
+            that.pullData(that.page, that.loading());
+        });
+
+
+        //鎷栨嫿璋冩暣瀹藉害
+        th.on('mousemove', function(e){
+            var othis = $(this)
+                ,oLeft = othis.offset().left
+                ,pLeft = e.clientX - oLeft;
+            if(othis.attr('colspan') > 1 || othis.data('unresize') || dict.resizeStart){
+                return;
+            }
+            dict.allowResize = othis.width() - pLeft <= 10; //鏄惁澶勪簬鎷栨嫿鍏佽鍖哄煙
+            _BODY.css('cursor', (dict.allowResize ? 'col-resize' : ''));
+        }).on('mouseleave', function(){
+            var othis = $(this);
+            if(dict.resizeStart) return;
+            _BODY.css('cursor', '');
+        }).on('mousedown', function(e){
+            var othis = $(this);
+            if(dict.allowResize){
+                var field = othis.data('field');
+                e.preventDefault();
+                dict.resizeStart = true; //寮�濮嬫嫋鎷�
+                dict.offset = [e.clientX, e.clientY]; //璁板綍鍒濆鍧愭爣
+
+                that.getCssRule(field, function(item){
+                    var width = item.style.width || othis.outerWidth();
+                    dict.rule = item;
+                    dict.ruleWidth = parseFloat(width);
+                    dict.minWidth = othis.data('minwidth') || options.cellMinWidth;
+                });
+            }
+        });
+        //鎷栨嫿涓�
+        _DOC.on('mousemove', function(e){
+            if(dict.resizeStart){
+                e.preventDefault();
+                if(dict.rule){
+                    var setWidth = dict.ruleWidth + e.clientX - dict.offset[0];
+                    if(setWidth < dict.minWidth) setWidth = dict.minWidth;
+                    dict.rule.style.width = setWidth + 'px';
+                    layer.close(that.tipsIndex);
+                }
+                resizing = 1
+            }
+        }).on('mouseup', function(e){
+            if(dict.resizeStart){
+                dict = {};
+                _BODY.css('cursor', '');
+                that.scrollPatch();
+            }
+            if(resizing === 2){
+                resizing = null;
+            }
+        });
+
+        //鎺掑簭
+        th.on('click', function(){
+            var othis = $(this)
+                ,elemSort = othis.find(ELEM_SORT)
+                ,nowType = elemSort.attr('lay-sort')
+                ,type;
+
+            if(!elemSort[0] || resizing === 1) return resizing = 2;
+
+            if(nowType === 'asc'){
+                type = 'desc';
+            } else if(nowType === 'desc'){
+                type = null;
+            } else {
+                type = 'asc';
+            }
+            that.sort(othis, type, null, true);
+        }).find(ELEM_SORT+' .layui-edge ').on('click', function(e){
+            var othis = $(this)
+                ,index = othis.index()
+                ,field = othis.parents('th').eq(0).data('field')
+            layui.stope(e);
+            if(index === 0){
+                that.sort(field, 'asc', null, true);
+            } else {
+                that.sort(field, 'desc', null, true);
+            }
+        });
+
+        /**
+         * 鏍戝舰鑺傜偣鐐瑰嚮浜嬩欢锛堥殣钘忓睍寮�涓嬬骇鑺傜偣锛�
+         */
+        that.elem.on('click', 'i.layui-tree-head', function(){
+            var othis = $(this)
+                ,index = othis.parents('tr').eq(0).data('index')
+                ,tr = that.layBody.find('tr[data-index="'+ index +'"]')
+                ,options=that.config
+                ,tree_id=options[TREE_ID]
+                ,datas=table.getDataList(that.key);//鏁版嵁
+            var o=datas[index];
+            that.treeNodeOpen(o,!o.is_open);
+        });
+
+        //澶嶉�夋閫夋嫨
+        that.elem.on('click', 'input[name="layTableCheckbox"]+', function(){
+            var checkbox = $(this).prev()
+                ,childs = that.layBody.find('input[name="layTableCheckbox"]')
+                ,index = checkbox.parents('tr').eq(0).data('index')
+                ,checked = checkbox[0].checked
+                ,isAll = checkbox.attr('lay-filter') === 'layTableAllChoose';
+
+            //鍏ㄩ��
+            if(isAll){
+                childs.each(function(i, item){
+                    item.checked = checked;
+                    that.setCheckData(i, checked);
+                });
+                that.syncCheckAll();
+                that.renderForm('checkbox');
+            } else {
+                that.setCheckData(index, checked);
+                that.syncCheckAll();
+            }
+            layui.event.call(this, MOD_NAME, 'checkbox('+ filter +')', {
+                checked: checked
+                ,data: table.getDataList(that.key) ? (table.getDataList(that.key)[index] || {}) : {}
+                ,type: isAll ? 'all' : 'one'
+            });
+        });
+
+        //琛屼簨浠�
+        that.layBody.on('mouseenter', 'tr', function(){
+            var othis = $(this)
+                ,index = othis.index();
+            that.layBody.find('tr:eq('+ index +')').addClass(ELEM_HOVER)
+        })
+        that.layBody.on('mouseleave', 'tr', function(){
+            var othis = $(this)
+                ,index = othis.index();
+            that.layBody.find('tr:eq('+ index +')').removeClass(ELEM_HOVER)
+        });
+
+
+//鍗曞厓鏍肩紪杈�
+        that.layBody.on('change', '.'+ELEM_EDIT, function(){
+            var othis = $(this)
+                ,value = this.value
+                ,field = othis.parent().data('field')
+                ,index = othis.parents('tr').eq(0).data('index')
+                ,data = table.getDataList(that.key)[index];
+            data[field] = value; //鏇存柊缂撳瓨涓殑鍊�
+            layui.event.call(this, MOD_NAME, 'edit('+ filter +')', {
+                value: value
+                ,data: data
+                ,field: field
+            });
+        });
+
+        that.layBody.on('blur', '.'+ELEM_EDIT, function(){//鍗曞厓鏍煎け鍘荤劍鐐�
+            var templet
+                ,othis = $(this)
+                ,field = othis.parent().data('field')
+                ,index = othis.parents('tr').eq(0).data('index')
+                ,editType = othis.parent().data('edit')
+                ,data = table.getDataList(that.key)[index];
+            var  options = that.config;
+            that.eachCols(function(i, item){
+                if(item.field == field && item.templet){
+                    templet = item.templet;
+                }
+            });
+            var value="";
+            if(editType === 'select') { //閫夋嫨妗�
+                var rowsField=dl.ui.table.drop.findFieldObj(options.cols[0],field);
+                if(rowsField&&rowsField['drop']){
+                    var o=dl.cache.code.get(rowsField.drop);
+                    value=dl.ui.table.drop.findDropLable(rowsField.drop,this.value);
+                }
+                othis.parent().find(ELEM_CELL+' p').html(
+                    templet ? laytpl($(templet).html() || value).render(data) : value
+                );
+            } else {//杈撳叆妗�
+                othis.parent().find(ELEM_CELL+' p').html(
+                    templet ? laytpl($(templet).html() || this.value).render(data) : this.value
+                );
+            }
+            othis.parent().data('content', this.value);
+            othis.remove();
+        });
+
+        //鍗曞厓鏍间簨浠�
+        that.layBody.on('click', 'td div.layui-table-cell p', function(){
+            var othis = $(this).parent().parent()
+                ,field = othis.data('field')
+                ,editType = othis.data('edit')
+                ,index = othis.parents('tr').eq(0).data('index')
+                ,data = table.getDataList(that.key)[index]
+                ,elemCell = othis.children(ELEM_CELL);
+            var  options = that.config;
+            layer.close(that.tipsIndex);
+            if(othis.data('off')) return;
+
+            //鏄剧ず缂栬緫琛ㄥ崟
+            if(editType){
+                if(editType === 'select') { //閫夋嫨妗�
+                    var dropName=othis.data('drop');
+                    var rowsField=dl.ui.table.drop.findFieldObj(options.cols[0],field);
+                    var o=dl.cache.code.get(rowsField.drop);
+                    var html='';
+                    var scv=o.syscodevaluecache;
+                    for(var i in scv){
+                        var isSelected="";
+                        if(scv[i].scv_value==data[field]){
+                            isSelected="selected='selected'";
+                        }
+                        //閫変腑
+                        html+='<option '+isSelected+'  value="'+scv[i].scv_value+'">'+scv[i].scv_show_name+'</option>'
+                    }
+                    var select = $('<select class="'+ ELEM_EDIT +'" lay-ignore>' +
+                        html+
+                        '</select>');
+                    othis.find('.'+ELEM_EDIT)[0] || othis.append(select);
+                } else { //杈撳叆妗�
+                    var input = $('<input class="layui-input '+ ELEM_EDIT +'">');
+                    input[0].value = $.trim($(this).text());//  othis.data('content') || elemCell.text();
+                    othis.find('.'+ELEM_EDIT)[0] || othis.append(input);
+                    input.focus();
+                }
+                return;
+            }
+
+            //濡傛灉鍑虹幇鐪佺暐锛屽垯鍙煡鐪嬫洿澶�
+            if(elemCell.find('.layui-form-switch,.layui-form-checkbox')[0]) return; //闄愬埗涓嶅嚭鐜版洿澶氾紙鏆傛椂锛�
+            if(Math.round(elemCell.prop('scrollWidth')) > Math.round(elemCell.outerWidth())){
+                that.tipsIndex = layer.tips([
+                    '<div class="layui-table-tips-main" style="margin-top: -'+ (elemCell.height() + 16) +'px;'+ function(){
+                        if(options.size === 'sm'){
+                            return 'padding: 4px 15px; font-size: 12px;';
+                        }
+                        if(options.size === 'lg'){
+                            return 'padding: 14px 15px;';
+                        }
+                        return '';
+                    }() +'">'
+                    ,elemCell.html()
+                    ,'</div>'
+                    ,'<i class="layui-icon layui-table-tips-c">&#x1006;</i>'
+                ].join(''), elemCell[0], {
+                    tips: [3, '']
+                    ,time: -1
+                    ,anim: -1
+                    ,maxWidth: (device.ios || device.android) ? 300 : 600
+                    ,isOutAnim: false
+                    ,skin: 'layui-table-tips'
+                    ,success: function(layero, index){
+                        layero.find('.layui-table-tips-c').on('click', function(){
+                            layer.close(index);
+                        });
+                    }
+                });
+            }
+        });
+
+        //宸ュ叿鏉℃搷浣滀簨浠�
+        that.layBody.on('click', '*[lay-event]', function(){
+            var othis = $(this)
+                ,index = othis.parents('tr').eq(0).data('index')
+                ,tr = that.layBody.find('tr[data-index="'+ index +'"]')
+                ,ELEM_CLICK = 'layui-table-click'
+                ,list = table.getDataList(that.key)
+                ,data = table.getDataList(that.key)[index];
+            layui.event.call(this, MOD_NAME, 'tool('+ filter +')', {
+                data: data//table.clearCacheKey(data)
+                ,event: othis.attr('lay-event')
+                ,tr: tr
+                ,del: function(){
+                    table.delRow(options.id,data);
+                }
+                ,update: function(fields){
+                    fields = fields || {};
+                    layui.each(fields, function(key, value){
+                        if(key in data){
+                            var templet, td = tr.children('td[data-field="'+ key +'"]');
+                            data[key] = value;
+                            that.eachCols(function(i, item2){
+                                if(item2.field == key && item2.templet){
+                                    templet = item2.templet;
+                                }
+                            });
+                            td.children(ELEM_CELL).html(
+                                templet ? laytpl($(templet).html() || value).render(data) : value
+                            );
+                            td.data('content', value);
+                        }
+                    });
+                }
+            });
+            tr.addClass(ELEM_CLICK).siblings('tr').removeClass(ELEM_CLICK);
+        });
+
+        //鍚屾婊氬姩鏉�
+        that.layMain.on('scroll', function(){
+            var othis = $(this)
+                ,scrollLeft = othis.scrollLeft()
+                ,scrollTop = othis.scrollTop();
+
+            that.layHeader.scrollLeft(scrollLeft);
+            that.layFixed.find(ELEM_BODY).scrollTop(scrollTop);
+
+            layer.close(that.tipsIndex);
+        });
+
+        _WIN.on('resize', function(){ //鑷�傚簲
+            that.resize();
+        });
+    };
+    table.selectRecord = function(id,selectRecords){
+        var that = this
+            ,options = table.getConfig(id)
+            ,thisData = table.cache[id];
+        if(!$.isArray(selectRecords)){
+            selectRecords = [selectRecords];
+        }
+        layui.each(selectRecords, function (_index, item) {
+            if (item.LAY_TABLE_INDEX*1>=0 || item.index*1>=0) {
+                $(options.elem).next().find('tbody>tr[data-index="' + ((that.config.indexName in item)?item[that.config.indexName]:item.index) + '"]').each(function (i) {
+                    $(this).click();
+                    //modify by weidy@2020-12-19锛屽湪鏈塼oolbar鐨勬椂鍊欙紝浼氭湁涓や釜锛屾墍浠ョ涓�涓氨杩斿洖
+                    return false;
+                });
+            }
+        });
+    };
+    table.getConfig = function(id){
+        return thisTable.config[id];
+    };
+    table.setConfig = function(options){
+        if(!table.settings){
+            table.settings = {};
+        }
+        table.settings[options.id] = options;
+        thisTable.config[options.id] = options;
+    };
+
+    //琛ㄦ牸閲嶈浇
+    thisTable.config = {};
+    //鑷姩瀹屾垚娓叉煋
+    table.init();
+    //layui.link('design/extend/treeGrid.css');//寮曞叆css
+    exports(MOD_NAME, table);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/dropdown.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/dropdown.js
new file mode 100644
index 0000000..5dae4b5
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/dropdown.js
@@ -0,0 +1,528 @@
+/**
+ 
+ @Name锛歞ropdown 涓嬫媺鑿滃崟缁勪欢
+ @License锛歁IT
+
+ */
+
+layui.define(['jquery', 'laytpl', 'lay'], function(exports){
+  "use strict";
+  
+  var $ = layui.$
+  ,laytpl = layui.laytpl
+  ,hint = layui.hint()
+  ,device = layui.device()
+  ,clickOrMousedown = (device.mobile ? 'click' : 'mousedown')
+  
+  //妯″潡鍚�
+  ,MOD_NAME = 'dropdown'
+  ,MOD_INDEX = 'layui_'+ MOD_NAME +'_index' //妯″潡绱㈠紩鍚�
+
+  //澶栭儴鎺ュ彛
+  ,dropdown = {
+    config: {}
+    ,index: layui[MOD_NAME] ? (layui[MOD_NAME].index + 10000) : 0
+
+    //璁剧疆鍏ㄥ眬椤�
+    ,set: function(options){
+      var that = this;
+      that.config = $.extend({}, that.config, options);
+      return that;
+    }
+    
+    //浜嬩欢
+    ,on: function(events, callback){
+      return layui.onevent.call(this, MOD_NAME, events, callback);
+    }
+  }
+
+  //鎿嶄綔褰撳墠瀹炰緥
+  ,thisModule = function(){
+    var that = this
+    ,options = that.config
+    ,id = options.id;
+
+    thisModule.that[id] = that; //璁板綍褰撳墠瀹炰緥瀵硅薄
+
+    return {
+      config: options
+      //閲嶇疆瀹炰緥
+      ,reload: function(options){
+        that.reload.call(that, options);
+      }
+    }
+  }
+
+  //瀛楃甯搁噺
+  ,STR_ELEM = 'layui-dropdown', STR_HIDE = 'layui-hide', STR_DISABLED = 'layui-disabled', STR_NONE = 'layui-none'
+  ,STR_ITEM_UP = 'layui-menu-item-up', STR_ITEM_DOWN = 'layui-menu-item-down', STR_MENU_TITLE = 'layui-menu-body-title', STR_ITEM_GROUP = 'layui-menu-item-group', STR_ITEM_PARENT = 'layui-menu-item-parent', STR_ITEM_DIV = 'layui-menu-item-divider', STR_ITEM_CHECKED = 'layui-menu-item-checked', STR_ITEM_CHECKED2 = 'layui-menu-item-checked2', STR_MENU_PANEL = 'layui-menu-body-panel', STR_MENU_PANEL_L = 'layui-menu-body-panel-left'
+  
+  ,STR_GROUP_TITLE = '.'+ STR_ITEM_GROUP + '>.'+ STR_MENU_TITLE
+
+  //鏋勯�犲櫒
+  ,Class = function(options){
+    var that = this;
+    that.index = ++dropdown.index;
+    that.config = $.extend({}, that.config, dropdown.config, options);
+    that.init();
+  };
+
+  //榛樿閰嶇疆
+  Class.prototype.config = {
+    trigger: 'click' //浜嬩欢绫诲瀷
+    ,content: '' //鑷畾涔夎彍鍗曞唴瀹�
+    ,className: '' //鑷畾涔夋牱寮忕被鍚�
+    ,style: '' //璁剧疆闈㈡澘 style 灞炴��
+    ,show: false //鏄惁鍒濆鍗虫樉绀鸿彍鍗曢潰鏉�
+    ,isAllowSpread: true //鏄惁鍏佽鑿滃崟缁勫睍寮�鏀剁缉
+    ,isSpreadItem: true //鏄惁鍒濆灞曞紑瀛愯彍鍗�
+    ,data: [] //鑿滃崟鏁版嵁缁撴瀯
+    ,delay: 300 //寤惰繜鍏抽棴鐨勬绉掓暟锛岃嫢 trigger 涓� hover 鏃舵墠鐢熸晥
+  };
+  
+  //閲嶈浇瀹炰緥
+  Class.prototype.reload = function(options){
+    var that = this;
+    that.config = $.extend({}, that.config, options);
+    that.init(true);
+  };
+
+  //鍒濆鍖栧噯澶�
+  Class.prototype.init = function(rerender){
+    var that = this
+    ,options = that.config
+    ,elem = options.elem = $(options.elem);
+    
+    //鑻� elem 闈炲敮涓�
+    if(elem.length > 1){
+      layui.each(elem, function(){
+        dropdown.render($.extend({}, options, {
+          elem: this
+        }));
+      });
+      return that;
+    }
+
+    //鑻ラ噸澶嶆墽琛� render锛屽垯瑙嗕负 reload 澶勭悊
+    if(!rerender && elem[0] && elem.data(MOD_INDEX)){;
+      var newThat = thisModule.getThis(elem.data(MOD_INDEX));
+      if(!newThat) return;
+
+      return newThat.reload(options);
+    };
+    
+    //鍒濆鍖� id 鍙傛暟
+    options.id = ('id' in options) ? options.id : that.index;
+    
+    if(options.show) that.render(rerender); //鍒濆鍗虫樉绀�
+    that.events(); //浜嬩欢
+  };
+  
+  //娓叉煋
+  Class.prototype.render = function(rerender){
+    var that = this
+    ,options = that.config
+    ,elemBody = $('body')
+    
+    //榛樿鑿滃崟鍐呭
+    ,getDefaultView = function(){
+      var elemUl = $('<ul class="layui-menu layui-dropdown-menu"></ul>');
+      if(options.data.length > 0 ){
+        eachItemView(elemUl, options.data)
+      } else {
+        elemUl.html('<li class="layui-menu-item-none">no menu</li>');
+      }
+      return elemUl;
+    }
+    
+    //閬嶅巻鑿滃崟椤�
+    ,eachItemView = function(views, data){
+      //var views = [];
+      layui.each(data, function(index, item){
+        //鏄惁瀛樺湪瀛愮骇
+        var isChild = item.child && item.child.length > 0
+        ,isSpreadItem = ('isSpreadItem' in item) ? item.isSpreadItem : options.isSpreadItem
+        ,title = item.templet 
+          ? laytpl(item.templet).render(item) 
+        : (options.templet ? laytpl(options.templet).render(item) : item.title)
+        
+        //鍒濆绫诲瀷
+        ,type = function(){
+          if(isChild){
+            item.type = item.type || 'parent';
+          }
+          if(item.type){
+            return ({
+              group: 'group'
+              ,parent: 'parent'
+              ,'-': '-'
+            })[item.type] || 'parent';
+          }
+          return '';
+        }();
+
+        if(type !== '-' && (!item.title && !item.id && !isChild)) return;
+        
+        //鍒楄〃鍏冪礌
+        var viewLi = $(['<li'+ function(){
+          var className = {
+            group: 'layui-menu-item-group'+ (
+              options.isAllowSpread ? (
+                isSpreadItem ? ' layui-menu-item-down' : ' layui-menu-item-up'
+              ) : ''
+            )
+            ,parent: STR_ITEM_PARENT
+            ,'-': 'layui-menu-item-divider'
+          };
+          if(isChild || type){
+            return ' class="'+ className[type] +'"';
+          }
+          return '';
+        }() +'>'
+        
+          //鏍囬鍖�
+          ,function(){
+            //鏄惁瓒呮枃鏈�
+            var viewText = ('href' in item) ? (
+              '<a href="'+ item.href +'" target="'+ (item.target || '_self') +'">'+ title +'</a>'
+            ) : title;
+            
+            //鏄惁瀛樺湪瀛愮骇
+            if(isChild){
+              return '<div class="'+ STR_MENU_TITLE +'">'+ viewText + function(){
+                if(type === 'parent'){
+                  return '<i class="layui-icon layui-icon-right"></i>';
+                } else if(type === 'group' && options.isAllowSpread){
+                  return '<i class="layui-icon layui-icon-'+ (isSpreadItem ? 'up' : 'down') +'"></i>';
+                } else {
+                  return '';
+                }
+              }() +'</div>'
+              
+            }
+            return '<div class="'+ STR_MENU_TITLE +'">'+ viewText +'</div>';
+          }()
+        ,'</li>'].join(''));
+        
+        viewLi.data('item', item);
+        
+        //瀛愮骇鍖�
+        if(isChild){
+          var elemPanel = $('<div class="layui-panel layui-menu-body-panel"></div>')
+          ,elemUl = $('<ul></ul>');
+
+          if(type === 'parent'){
+            elemPanel.append(eachItemView(elemUl, item.child));
+            viewLi.append(elemPanel);
+          } else {
+            viewLi.append(eachItemView(elemUl, item.child));
+          }
+        }
+
+        views.append(viewLi);
+      });
+      return views;
+    }
+    
+    //涓绘ā鏉�
+    ,TPL_MAIN = ['<div class="layui-dropdown layui-border-box layui-panel layui-anim layui-anim-downbit">'
+    ,'</div>'].join('');
+    
+    //濡傛灉鏄彸閿簨浠讹紝鍒欐瘡娆¤Е鍙戜簨浠舵椂锛屽皢鍏佽閲嶆柊娓叉煋
+    if(options.trigger === 'contextmenu' || lay.isTopElem(options.elem[0])) rerender = true;
+    
+    //鍒ゆ柇鏄惁宸茬粡鎵撳紑浜嗕笅鎷夎彍鍗曢潰鏉�
+    if(!rerender && options.elem.data(MOD_INDEX +'_opened')) return;
+
+    //璁板綍妯℃澘瀵硅薄
+    that.elemView = $(TPL_MAIN);
+    that.elemView.append(options.content || getDefaultView());
+    
+    //鍒濆鍖栨煇浜涘睘鎬�
+    if(options.className) that.elemView.addClass(options.className);
+    if(options.style) that.elemView.attr('style', options.style);
+    
+    
+    //璁板綍褰撳墠鎵ц鐨勫疄渚嬬储寮�
+    dropdown.thisId = options.id;
+    
+    //鎻掑叆瑙嗗浘
+    that.remove(); //绉婚櫎闈炲綋鍓嶇粦瀹氬厓绱犵殑闈㈡澘
+    elemBody.append(that.elemView);
+    options.elem.data(MOD_INDEX +'_opened', true);
+    
+    //鍧愭爣瀹氫綅
+    that.position();
+    thisModule.prevElem = that.elemView; //璁板綍褰撳墠鎵撳紑鐨勫厓绱狅紝浠ヤ究鍦ㄤ笅娆″叧闂�
+    thisModule.prevElem.data('prevElem', options.elem); //灏嗗綋鍓嶇粦瀹氱殑鍏冪礌锛岃褰曞湪鎵撳紑鍏冪礌鐨� data 瀵硅薄涓�
+    
+    //闃绘鍏ㄥ眬浜嬩欢
+    that.elemView.find('.layui-menu').on(clickOrMousedown, function(e){
+      layui.stope(e);
+    });
+
+    //瑙﹀彂鑿滃崟鍒楄〃浜嬩欢
+    that.elemView.find('.layui-menu li').on('click', function(e){
+      var othis = $(this)
+      ,data = othis.data('item') || {}
+      ,isChild = data.child && data.child.length > 0;
+      
+      if(!isChild && data.type !== '-'){
+        that.remove();
+        typeof options.click === 'function' && options.click(data, othis);
+      }
+    });
+    
+    //瑙﹀彂鑿滃崟缁勫睍寮�鏀剁缉
+    that.elemView.find(STR_GROUP_TITLE).on('click', function(e){
+      var othis = $(this)
+      ,elemGroup = othis.parent()
+      ,data = elemGroup.data('item') || {}
+      
+      if(data.type === 'group' && options.isAllowSpread){
+        thisModule.spread(elemGroup);
+      }
+    });
+    
+    //濡傛灉鏄紶鏍囩Щ鍏ヤ簨浠讹紝鍒欓紶鏍囩Щ鍑烘椂鑷姩鍏抽棴
+    if(options.trigger === 'mouseenter'){
+      that.elemView.on('mouseenter', function(){
+        clearTimeout(thisModule.timer);
+      }).on('mouseleave', function(){
+        that.delayRemove();
+      });
+    }
+
+  };
+  
+  //浣嶇疆瀹氫綅
+  Class.prototype.position = function(obj){
+    var that = this
+    ,options = that.config;
+    
+    lay.position(options.elem[0], that.elemView[0], {
+      position: options.position
+      ,e: that.e
+      ,clickType: options.trigger === 'contextmenu' ? 'right' : null
+      ,align: options.align || null
+    });
+  };
+  
+  //鍒犻櫎瑙嗗浘
+  Class.prototype.remove = function(){
+    var that = this
+    ,options = that.config
+    ,elemPrev = thisModule.prevElem;
+    
+    //鑻ュ瓨鍦ㄥ凡鎵撳紑鐨勯潰鏉垮厓绱狅紝鍒欑Щ闄�
+    if(elemPrev){
+      elemPrev.data('prevElem') && (
+        elemPrev.data('prevElem').data(MOD_INDEX +'_opened', false)
+      );
+      elemPrev.remove();
+    }
+  };
+  
+  //寤惰繜鍒犻櫎瑙嗗浘
+  Class.prototype.delayRemove = function(){
+    var that = this
+    ,options = that.config;
+    clearTimeout(thisModule.timer);
+
+    thisModule.timer = setTimeout(function(){
+      that.remove();
+    }, options.delay);
+  };
+  
+  //浜嬩欢
+  Class.prototype.events = function(){
+    var that = this
+    ,options = that.config;
+    
+    //濡傛灉浼犲叆 hover锛屽垯瑙f瀽涓� mouseenter
+    if(options.trigger === 'hover') options.trigger = 'mouseenter';
+
+    //瑙i櫎涓婁竴涓簨浠�
+    if(that.prevElem) that.prevElem.off(options.trigger, that.prevElemCallback);
+    
+    //璁板綍琚粦瀹氱殑鍏冪礌鍙婂洖璋�
+    that.prevElem = options.elem;
+    that.prevElemCallback = function(e){
+      clearTimeout(thisModule.timer);
+      that.e = e;
+      that.render();
+      e.preventDefault();
+      
+      //缁勪欢鎵撳紑瀹屾瘯鐨勬椂闂�
+      typeof options.ready === 'function' && options.ready(that.elemView, options.elem, that.e.target);
+    };
+
+    //瑙﹀彂鍏冪礌浜嬩欢
+    options.elem.on(options.trigger, that.prevElemCallback);
+    
+    //濡傛灉鏄紶鏍囩Щ鍏ヤ簨浠�
+    if(options.trigger === 'mouseenter'){
+      //鐩磋榧犳爣绉诲嚭浜嬩欢
+      options.elem.on('mouseleave', function(){
+        that.delayRemove();
+      });
+    }
+  };
+  
+  //璁板綍鎵�鏈夊疄渚�
+  thisModule.that = {}; //璁板綍鎵�鏈夊疄渚嬪璞�
+  
+  //鑾峰彇褰撳墠瀹炰緥瀵硅薄
+  thisModule.getThis = function(id){
+    var that = thisModule.that[id];
+    if(!that) hint.error(id ? (MOD_NAME +' instance with ID \''+ id +'\' not found') : 'ID argument required');
+    return that;
+  };
+  
+  //璁剧疆鑿滃崟缁勫睍寮�鍜屾敹缂╃姸鎬�
+  thisModule.spread = function(othis){
+    //鑿滃崟缁勫睍寮�鍜屾敹缂�
+    var elemIcon = othis.children('.'+ STR_MENU_TITLE).find('.layui-icon');
+    if(othis.hasClass(STR_ITEM_UP)){
+      othis.removeClass(STR_ITEM_UP).addClass(STR_ITEM_DOWN);
+      elemIcon.removeClass('layui-icon-down').addClass('layui-icon-up');
+    } else {
+      othis.removeClass(STR_ITEM_DOWN).addClass(STR_ITEM_UP);
+      elemIcon.removeClass('layui-icon-up').addClass('layui-icon-down')
+    }
+  };
+  
+  //鍏ㄥ眬浜嬩欢
+  ;!function(){
+    var _WIN = $(window)
+    ,_DOC = $(document);
+    
+    //鑷�傚簲瀹氫綅
+    _WIN.on('resize', function(){
+      if(!dropdown.thisId) return;
+      var that = thisModule.getThis(dropdown.thisId);
+      if(!that) return;
+      
+      if(!that.elemView[0] || !$('.'+ STR_ELEM)[0]){
+        return false;
+      }
+      
+      var options = that.config;
+      
+      if(options.trigger === 'contextmenu'){
+        that.remove();
+      } else {
+        that.position();
+      }
+    });
+    
+    
+      
+    //鐐瑰嚮浠绘剰澶勫叧闂�
+    _DOC.on(clickOrMousedown, function(e){
+      if(!dropdown.thisId) return;
+      var that = thisModule.getThis(dropdown.thisId)
+      if(!that) return;
+      
+      var options = that.config;
+      
+      //濡傛灉瑙﹀彂鐨勬槸缁戝畾鐨勫厓绱狅紝鎴栬�呭睘浜庣粦瀹氬厓绱犵殑瀛愬厓绱狅紝鍒欎笉鍏抽棴
+      //婊¤冻鏉′欢锛氬綋鍓嶇粦瀹氱殑鍏冪礌涓嶆槸 body document锛屾垨鑰呬笉鏄紶鏍囧彸閿簨浠�
+      if(!(lay.isTopElem(options.elem[0]) || options.trigger === 'contextmenu')){
+        if(
+          e.target === options.elem[0] || 
+          options.elem.find(e.target)[0] ||
+          e.target === that.elemView[0] ||
+          (that.elemView && that.elemView.find(e.target)[0])
+        ) return;
+      }
+      
+      that.remove();
+    });
+    
+    //鍩虹鑿滃崟鐨勯潤鎬佸厓绱犱簨浠�
+    var ELEM_LI = '.layui-menu:not(.layui-dropdown-menu) li';
+    _DOC.on('click', ELEM_LI, function(e){
+      var othis = $(this)
+      ,parent = othis.parents('.layui-menu').eq(0)
+      ,isChild = othis.hasClass(STR_ITEM_GROUP) || othis.hasClass(STR_ITEM_PARENT)
+      ,filter = parent.attr('lay-filter') || parent.attr('id')
+      ,options = lay.options(this);
+      
+      //闈炶Е鍙戝厓绱�
+      if(othis.hasClass(STR_ITEM_DIV)) return;
+
+      //闈炶彍鍗曠粍
+      if(!isChild){
+        //閫変腑
+        parent.find('.'+ STR_ITEM_CHECKED).removeClass(STR_ITEM_CHECKED); //娓呴櫎閫変腑鏍峰紡
+        parent.find('.'+ STR_ITEM_CHECKED2).removeClass(STR_ITEM_CHECKED2); //娓呴櫎鐖剁骇鑿滃崟閫変腑鏍峰紡
+        othis.addClass(STR_ITEM_CHECKED); //娣诲姞閫変腑鏍峰紡
+        othis.parents('.'+ STR_ITEM_PARENT).addClass(STR_ITEM_CHECKED2); //娣诲姞鐖剁骇鑿滃崟閫変腑鏍峰紡
+        
+        //瑙﹀彂浜嬩欢
+        layui.event.call(this, MOD_NAME, 'click('+ filter +')', options);
+      }
+    });
+    
+    //鍩虹鑿滃崟鐨勫睍寮�鏀剁缉浜嬩欢
+    _DOC.on('click', (ELEM_LI + STR_GROUP_TITLE), function(e){
+      var othis = $(this)
+      ,elemGroup = othis.parents('.'+ STR_ITEM_GROUP +':eq(0)')
+      ,options = lay.options(elemGroup[0]);
+
+      if(('isAllowSpread' in options) ? options.isAllowSpread : true){
+        thisModule.spread(elemGroup);
+      };
+    });
+    
+    //鍒ゆ柇瀛愮骇鑿滃崟鏄惁瓒呭嚭灞忓箷
+    var ELEM_LI_PAR = '.layui-menu .'+ STR_ITEM_PARENT
+    _DOC.on('mouseenter', ELEM_LI_PAR, function(e){
+      var othis = $(this)
+      ,elemPanel = othis.find('.'+ STR_MENU_PANEL);
+
+      if(!elemPanel[0]) return;
+      var rect = elemPanel[0].getBoundingClientRect();
+      
+      //鏄惁瓒呭嚭鍙充晶灞忓箷
+      if(rect.right > _WIN.width()){
+        elemPanel.addClass(STR_MENU_PANEL_L);
+        //涓嶅厑璁歌秴鍑哄乏渚у睆骞�
+        rect = elemPanel[0].getBoundingClientRect();
+        if(rect.left < 0){
+          elemPanel.removeClass(STR_MENU_PANEL_L);
+        }
+      }
+      
+      //鏄惁瓒呭嚭搴曢儴灞忓箷
+      if(rect.bottom > _WIN.height()){
+        elemPanel.eq(0).css('margin-top', -(rect.bottom - _WIN.height()));
+      };
+    }).on('mouseleave', ELEM_LI_PAR, function(e){
+      var othis = $(this)
+      ,elemPanel = othis.children('.'+ STR_MENU_PANEL);
+      
+      elemPanel.removeClass(STR_MENU_PANEL_L);
+      elemPanel.css('margin-top', 0);
+    });
+    
+  }();
+  
+  //閲嶈浇瀹炰緥
+  dropdown.reload = function(id, options){
+    var that = thisModule.getThis(id);
+    if(!that) return this;
+
+    that.reload(options);
+    return thisModule.call(that);
+  };
+
+  //鏍稿績鍏ュ彛
+  dropdown.render = function(options){
+    var inst = new Class(options);
+    return thisModule.call(inst);
+  };
+
+  exports(MOD_NAME, dropdown);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/echarts.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/echarts.js
new file mode 100644
index 0000000..b378949
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/echarts.js
@@ -0,0 +1,83891 @@
+(function (global, factory) {
+	typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
+	typeof define === 'function' && define.amd ? define(['exports'], factory) :
+    window.layui && layui.define ? layui.define(function(exports){exports('echarts',factory(exports))}) :
+	(factory((global.echarts = {})));
+}(this, (function (exports) { 'use strict';
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+// (1) The code `if (__DEV__) ...` can be removed by build tool.
+// (2) If intend to use `__DEV__`, this module should be imported. Use a global
+// variable `__DEV__` may cause that miss the declaration (see #6535), or the
+// declaration is behind of the using position (for example in `Model.extent`,
+// And tools like rollup can not analysis the dependency if not import).
+
+/**
+ * zrender: 鐢熸垚鍞竴id
+ *
+ * @author errorrik (errorrik@gmail.com)
+ */
+var idStart = 0x0907;
+var guid = function () {
+  return idStart++;
+};
+
+/**
+ * echarts璁惧鐜璇嗗埆
+ *
+ * @desc echarts鍩轰簬Canvas锛岀函Javascript鍥捐〃搴擄紝鎻愪緵鐩磋锛岀敓鍔紝鍙氦浜掞紝鍙釜鎬у寲瀹氬埗鐨勬暟鎹粺璁″浘琛ㄣ��
+ * @author firede[firede@firede.us]
+ * @desc thanks zepto.
+ */
+var env = {};
+
+if (typeof wx === 'object' && typeof wx.getSystemInfoSync === 'function') {
+  // In Weixin Application
+  env = {
+    browser: {},
+    os: {},
+    node: false,
+    wxa: true,
+    // Weixin Application
+    canvasSupported: true,
+    svgSupported: false,
+    touchEventsSupported: true,
+    domSupported: false
+  };
+} else if (typeof document === 'undefined' && typeof self !== 'undefined') {
+  // In worker
+  env = {
+    browser: {},
+    os: {},
+    node: false,
+    worker: true,
+    canvasSupported: true,
+    domSupported: false
+  };
+} else if (typeof navigator === 'undefined') {
+  // In node
+  env = {
+    browser: {},
+    os: {},
+    node: true,
+    worker: false,
+    // Assume canvas is supported
+    canvasSupported: true,
+    svgSupported: true,
+    domSupported: false
+  };
+} else {
+  env = detect(navigator.userAgent);
+}
+
+var env$1 = env; // Zepto.js
+// (c) 2010-2013 Thomas Fuchs
+// Zepto.js may be freely distributed under the MIT license.
+
+function detect(ua) {
+  var os = {};
+  var browser = {}; // var webkit = ua.match(/Web[kK]it[\/]{0,1}([\d.]+)/);
+  // var android = ua.match(/(Android);?[\s\/]+([\d.]+)?/);
+  // var ipad = ua.match(/(iPad).*OS\s([\d_]+)/);
+  // var ipod = ua.match(/(iPod)(.*OS\s([\d_]+))?/);
+  // var iphone = !ipad && ua.match(/(iPhone\sOS)\s([\d_]+)/);
+  // var webos = ua.match(/(webOS|hpwOS)[\s\/]([\d.]+)/);
+  // var touchpad = webos && ua.match(/TouchPad/);
+  // var kindle = ua.match(/Kindle\/([\d.]+)/);
+  // var silk = ua.match(/Silk\/([\d._]+)/);
+  // var blackberry = ua.match(/(BlackBerry).*Version\/([\d.]+)/);
+  // var bb10 = ua.match(/(BB10).*Version\/([\d.]+)/);
+  // var rimtabletos = ua.match(/(RIM\sTablet\sOS)\s([\d.]+)/);
+  // var playbook = ua.match(/PlayBook/);
+  // var chrome = ua.match(/Chrome\/([\d.]+)/) || ua.match(/CriOS\/([\d.]+)/);
+
+  var firefox = ua.match(/Firefox\/([\d.]+)/); // var safari = webkit && ua.match(/Mobile\//) && !chrome;
+  // var webview = ua.match(/(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/) && !chrome;
+
+  var ie = ua.match(/MSIE\s([\d.]+)/) // IE 11 Trident/7.0; rv:11.0
+  || ua.match(/Trident\/.+?rv:(([\d.]+))/);
+  var edge = ua.match(/Edge\/([\d.]+)/); // IE 12 and 12+
+
+  var weChat = /micromessenger/i.test(ua); // Todo: clean this up with a better OS/browser seperation:
+  // - discern (more) between multiple browsers on android
+  // - decide if kindle fire in silk mode is android or not
+  // - Firefox on Android doesn't specify the Android version
+  // - possibly devide in os, device and browser hashes
+  // if (browser.webkit = !!webkit) browser.version = webkit[1];
+  // if (android) os.android = true, os.version = android[2];
+  // if (iphone && !ipod) os.ios = os.iphone = true, os.version = iphone[2].replace(/_/g, '.');
+  // if (ipad) os.ios = os.ipad = true, os.version = ipad[2].replace(/_/g, '.');
+  // if (ipod) os.ios = os.ipod = true, os.version = ipod[3] ? ipod[3].replace(/_/g, '.') : null;
+  // if (webos) os.webos = true, os.version = webos[2];
+  // if (touchpad) os.touchpad = true;
+  // if (blackberry) os.blackberry = true, os.version = blackberry[2];
+  // if (bb10) os.bb10 = true, os.version = bb10[2];
+  // if (rimtabletos) os.rimtabletos = true, os.version = rimtabletos[2];
+  // if (playbook) browser.playbook = true;
+  // if (kindle) os.kindle = true, os.version = kindle[1];
+  // if (silk) browser.silk = true, browser.version = silk[1];
+  // if (!silk && os.android && ua.match(/Kindle Fire/)) browser.silk = true;
+  // if (chrome) browser.chrome = true, browser.version = chrome[1];
+
+  if (firefox) {
+    browser.firefox = true;
+    browser.version = firefox[1];
+  } // if (safari && (ua.match(/Safari/) || !!os.ios)) browser.safari = true;
+  // if (webview) browser.webview = true;
+
+
+  if (ie) {
+    browser.ie = true;
+    browser.version = ie[1];
+  }
+
+  if (edge) {
+    browser.edge = true;
+    browser.version = edge[1];
+  } // It is difficult to detect WeChat in Win Phone precisely, because ua can
+  // not be set on win phone. So we do not consider Win Phone.
+
+
+  if (weChat) {
+    browser.weChat = true;
+  } // os.tablet = !!(ipad || playbook || (android && !ua.match(/Mobile/)) ||
+  //     (firefox && ua.match(/Tablet/)) || (ie && !ua.match(/Phone/) && ua.match(/Touch/)));
+  // os.phone  = !!(!os.tablet && !os.ipod && (android || iphone || webos ||
+  //     (chrome && ua.match(/Android/)) || (chrome && ua.match(/CriOS\/([\d.]+)/)) ||
+  //     (firefox && ua.match(/Mobile/)) || (ie && ua.match(/Touch/))));
+
+
+  return {
+    browser: browser,
+    os: os,
+    node: false,
+    // 鍘熺敓canvas鏀寔锛屾敼鏋佺鐐逛簡
+    // canvasSupported : !(browser.ie && parseFloat(browser.version) < 9)
+    canvasSupported: !!document.createElement('canvas').getContext,
+    svgSupported: typeof SVGRect !== 'undefined',
+    // works on most browsers
+    // IE10/11 does not support touch event, and MS Edge supports them but not by
+    // default, so we dont check navigator.maxTouchPoints for them here.
+    touchEventsSupported: 'ontouchstart' in window && !browser.ie && !browser.edge,
+    // <http://caniuse.com/#search=pointer%20event>.
+    pointerEventsSupported: 'onpointerdown' in window // Firefox supports pointer but not by default, only MS browsers are reliable on pointer
+    // events currently. So we dont use that on other browsers unless tested sufficiently.
+    // Although IE 10 supports pointer event, it use old style and is different from the
+    // standard. So we exclude that. (IE 10 is hardly used on touch device)
+    && (browser.edge || browser.ie && browser.version >= 11),
+    // passiveSupported: detectPassiveSupport()
+    domSupported: typeof document !== 'undefined'
+  };
+} // See https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md#feature-detection
+// function detectPassiveSupport() {
+//     // Test via a getter in the options object to see if the passive property is accessed
+//     var supportsPassive = false;
+//     try {
+//         var opts = Object.defineProperty({}, 'passive', {
+//             get: function() {
+//                 supportsPassive = true;
+//             }
+//         });
+//         window.addEventListener('testPassive', function() {}, opts);
+//     } catch (e) {
+//     }
+//     return supportsPassive;
+// }
+
+/**
+ * @module zrender/core/util
+ */
+// 鐢ㄤ簬澶勭悊merge鏃舵棤娉曢亶鍘咲ate绛夊璞$殑闂
+var BUILTIN_OBJECT = {
+  '[object Function]': 1,
+  '[object RegExp]': 1,
+  '[object Date]': 1,
+  '[object Error]': 1,
+  '[object CanvasGradient]': 1,
+  '[object CanvasPattern]': 1,
+  // For node-canvas
+  '[object Image]': 1,
+  '[object Canvas]': 1
+};
+var TYPED_ARRAY = {
+  '[object Int8Array]': 1,
+  '[object Uint8Array]': 1,
+  '[object Uint8ClampedArray]': 1,
+  '[object Int16Array]': 1,
+  '[object Uint16Array]': 1,
+  '[object Int32Array]': 1,
+  '[object Uint32Array]': 1,
+  '[object Float32Array]': 1,
+  '[object Float64Array]': 1
+};
+var objToString = Object.prototype.toString;
+var arrayProto = Array.prototype;
+var nativeForEach = arrayProto.forEach;
+var nativeFilter = arrayProto.filter;
+var nativeSlice = arrayProto.slice;
+var nativeMap = arrayProto.map;
+var nativeReduce = arrayProto.reduce; // Avoid assign to an exported variable, for transforming to cjs.
+
+var methods = {};
+function $override(name, fn) {
+  // Clear ctx instance for different environment
+  if (name === 'createCanvas') {
+    _ctx = null;
+  }
+
+  methods[name] = fn;
+}
+/**
+ * Those data types can be cloned:
+ *     Plain object, Array, TypedArray, number, string, null, undefined.
+ * Those data types will be assgined using the orginal data:
+ *     BUILTIN_OBJECT
+ * Instance of user defined class will be cloned to a plain object, without
+ * properties in prototype.
+ * Other data types is not supported (not sure what will happen).
+ *
+ * Caution: do not support clone Date, for performance consideration.
+ * (There might be a large number of date in `series.data`).
+ * So date should not be modified in and out of echarts.
+ *
+ * @param {*} source
+ * @return {*} new
+ */
+
+function clone(source) {
+  if (source == null || typeof source != 'object') {
+    return source;
+  }
+
+  var result = source;
+  var typeStr = objToString.call(source);
+
+  if (typeStr === '[object Array]') {
+    if (!isPrimitive(source)) {
+      result = [];
+
+      for (var i = 0, len = source.length; i < len; i++) {
+        result[i] = clone(source[i]);
+      }
+    }
+  } else if (TYPED_ARRAY[typeStr]) {
+    if (!isPrimitive(source)) {
+      var Ctor = source.constructor;
+
+      if (source.constructor.from) {
+        result = Ctor.from(source);
+      } else {
+        result = new Ctor(source.length);
+
+        for (var i = 0, len = source.length; i < len; i++) {
+          result[i] = clone(source[i]);
+        }
+      }
+    }
+  } else if (!BUILTIN_OBJECT[typeStr] && !isPrimitive(source) && !isDom(source)) {
+    result = {};
+
+    for (var key in source) {
+      if (source.hasOwnProperty(key)) {
+        result[key] = clone(source[key]);
+      }
+    }
+  }
+
+  return result;
+}
+/**
+ * @memberOf module:zrender/core/util
+ * @param {*} target
+ * @param {*} source
+ * @param {boolean} [overwrite=false]
+ */
+
+function merge(target, source, overwrite) {
+  // We should escapse that source is string
+  // and enter for ... in ...
+  if (!isObject$1(source) || !isObject$1(target)) {
+    return overwrite ? clone(source) : target;
+  }
+
+  for (var key in source) {
+    if (source.hasOwnProperty(key)) {
+      var targetProp = target[key];
+      var sourceProp = source[key];
+
+      if (isObject$1(sourceProp) && isObject$1(targetProp) && !isArray(sourceProp) && !isArray(targetProp) && !isDom(sourceProp) && !isDom(targetProp) && !isBuiltInObject(sourceProp) && !isBuiltInObject(targetProp) && !isPrimitive(sourceProp) && !isPrimitive(targetProp)) {
+        // 濡傛灉闇�瑕侀�掑綊瑕嗙洊锛屽氨閫掑綊璋冪敤merge
+        merge(targetProp, sourceProp, overwrite);
+      } else if (overwrite || !(key in target)) {
+        // 鍚﹀垯鍙鐞唎verwrite涓簍rue锛屾垨鑰呭湪鐩爣瀵硅薄涓病鏈夋灞炴�х殑鎯呭喌
+        // NOTE锛屽湪 target[key] 涓嶅瓨鍦ㄧ殑鏃跺�欎篃鏄洿鎺ヨ鐩�
+        target[key] = clone(source[key], true);
+      }
+    }
+  }
+
+  return target;
+}
+/**
+ * @param {Array} targetAndSources The first item is target, and the rests are source.
+ * @param {boolean} [overwrite=false]
+ * @return {*} target
+ */
+
+function mergeAll(targetAndSources, overwrite) {
+  var result = targetAndSources[0];
+
+  for (var i = 1, len = targetAndSources.length; i < len; i++) {
+    result = merge(result, targetAndSources[i], overwrite);
+  }
+
+  return result;
+}
+/**
+ * @param {*} target
+ * @param {*} source
+ * @memberOf module:zrender/core/util
+ */
+
+function extend(target, source) {
+  for (var key in source) {
+    if (source.hasOwnProperty(key)) {
+      target[key] = source[key];
+    }
+  }
+
+  return target;
+}
+/**
+ * @param {*} target
+ * @param {*} source
+ * @param {boolean} [overlay=false]
+ * @memberOf module:zrender/core/util
+ */
+
+function defaults(target, source, overlay) {
+  for (var key in source) {
+    if (source.hasOwnProperty(key) && (overlay ? source[key] != null : target[key] == null)) {
+      target[key] = source[key];
+    }
+  }
+
+  return target;
+}
+var createCanvas = function () {
+  return methods.createCanvas();
+};
+
+methods.createCanvas = function () {
+  return document.createElement('canvas');
+}; // FIXME
+
+
+var _ctx;
+
+function getContext() {
+  if (!_ctx) {
+    // Use util.createCanvas instead of createCanvas
+    // because createCanvas may be overwritten in different environment
+    _ctx = createCanvas().getContext('2d');
+  }
+
+  return _ctx;
+}
+/**
+ * 鏌ヨ鏁扮粍涓厓绱犵殑index
+ * @memberOf module:zrender/core/util
+ */
+
+function indexOf(array, value) {
+  if (array) {
+    if (array.indexOf) {
+      return array.indexOf(value);
+    }
+
+    for (var i = 0, len = array.length; i < len; i++) {
+      if (array[i] === value) {
+        return i;
+      }
+    }
+  }
+
+  return -1;
+}
+/**
+ * 鏋勯�犵被缁ф壙鍏崇郴
+ *
+ * @memberOf module:zrender/core/util
+ * @param {Function} clazz 婧愮被
+ * @param {Function} baseClazz 鍩虹被
+ */
+
+function inherits(clazz, baseClazz) {
+  var clazzPrototype = clazz.prototype;
+
+  function F() {}
+
+  F.prototype = baseClazz.prototype;
+  clazz.prototype = new F();
+
+  for (var prop in clazzPrototype) {
+    clazz.prototype[prop] = clazzPrototype[prop];
+  }
+
+  clazz.prototype.constructor = clazz;
+  clazz.superClass = baseClazz;
+}
+/**
+ * @memberOf module:zrender/core/util
+ * @param {Object|Function} target
+ * @param {Object|Function} sorce
+ * @param {boolean} overlay
+ */
+
+function mixin(target, source, overlay) {
+  target = 'prototype' in target ? target.prototype : target;
+  source = 'prototype' in source ? source.prototype : source;
+  defaults(target, source, overlay);
+}
+/**
+ * Consider typed array.
+ * @param {Array|TypedArray} data
+ */
+
+function isArrayLike(data) {
+  if (!data) {
+    return;
+  }
+
+  if (typeof data == 'string') {
+    return false;
+  }
+
+  return typeof data.length == 'number';
+}
+/**
+ * 鏁扮粍鎴栧璞¢亶鍘�
+ * @memberOf module:zrender/core/util
+ * @param {Object|Array} obj
+ * @param {Function} cb
+ * @param {*} [context]
+ */
+
+function each$1(obj, cb, context) {
+  if (!(obj && cb)) {
+    return;
+  }
+
+  if (obj.forEach && obj.forEach === nativeForEach) {
+    obj.forEach(cb, context);
+  } else if (obj.length === +obj.length) {
+    for (var i = 0, len = obj.length; i < len; i++) {
+      cb.call(context, obj[i], i, obj);
+    }
+  } else {
+    for (var key in obj) {
+      if (obj.hasOwnProperty(key)) {
+        cb.call(context, obj[key], key, obj);
+      }
+    }
+  }
+}
+/**
+ * 鏁扮粍鏄犲皠
+ * @memberOf module:zrender/core/util
+ * @param {Array} obj
+ * @param {Function} cb
+ * @param {*} [context]
+ * @return {Array}
+ */
+
+function map(obj, cb, context) {
+  if (!(obj && cb)) {
+    return;
+  }
+
+  if (obj.map && obj.map === nativeMap) {
+    return obj.map(cb, context);
+  } else {
+    var result = [];
+
+    for (var i = 0, len = obj.length; i < len; i++) {
+      result.push(cb.call(context, obj[i], i, obj));
+    }
+
+    return result;
+  }
+}
+/**
+ * @memberOf module:zrender/core/util
+ * @param {Array} obj
+ * @param {Function} cb
+ * @param {Object} [memo]
+ * @param {*} [context]
+ * @return {Array}
+ */
+
+function reduce(obj, cb, memo, context) {
+  if (!(obj && cb)) {
+    return;
+  }
+
+  if (obj.reduce && obj.reduce === nativeReduce) {
+    return obj.reduce(cb, memo, context);
+  } else {
+    for (var i = 0, len = obj.length; i < len; i++) {
+      memo = cb.call(context, memo, obj[i], i, obj);
+    }
+
+    return memo;
+  }
+}
+/**
+ * 鏁扮粍杩囨护
+ * @memberOf module:zrender/core/util
+ * @param {Array} obj
+ * @param {Function} cb
+ * @param {*} [context]
+ * @return {Array}
+ */
+
+function filter(obj, cb, context) {
+  if (!(obj && cb)) {
+    return;
+  }
+
+  if (obj.filter && obj.filter === nativeFilter) {
+    return obj.filter(cb, context);
+  } else {
+    var result = [];
+
+    for (var i = 0, len = obj.length; i < len; i++) {
+      if (cb.call(context, obj[i], i, obj)) {
+        result.push(obj[i]);
+      }
+    }
+
+    return result;
+  }
+}
+/**
+ * 鏁扮粍椤规煡鎵�
+ * @memberOf module:zrender/core/util
+ * @param {Array} obj
+ * @param {Function} cb
+ * @param {*} [context]
+ * @return {*}
+ */
+
+function find(obj, cb, context) {
+  if (!(obj && cb)) {
+    return;
+  }
+
+  for (var i = 0, len = obj.length; i < len; i++) {
+    if (cb.call(context, obj[i], i, obj)) {
+      return obj[i];
+    }
+  }
+}
+/**
+ * @memberOf module:zrender/core/util
+ * @param {Function} func
+ * @param {*} context
+ * @return {Function}
+ */
+
+function bind(func, context) {
+  var args = nativeSlice.call(arguments, 2);
+  return function () {
+    return func.apply(context, args.concat(nativeSlice.call(arguments)));
+  };
+}
+/**
+ * @memberOf module:zrender/core/util
+ * @param {Function} func
+ * @return {Function}
+ */
+
+function curry(func) {
+  var args = nativeSlice.call(arguments, 1);
+  return function () {
+    return func.apply(this, args.concat(nativeSlice.call(arguments)));
+  };
+}
+/**
+ * @memberOf module:zrender/core/util
+ * @param {*} value
+ * @return {boolean}
+ */
+
+function isArray(value) {
+  return objToString.call(value) === '[object Array]';
+}
+/**
+ * @memberOf module:zrender/core/util
+ * @param {*} value
+ * @return {boolean}
+ */
+
+function isFunction$1(value) {
+  return typeof value === 'function';
+}
+/**
+ * @memberOf module:zrender/core/util
+ * @param {*} value
+ * @return {boolean}
+ */
+
+function isString(value) {
+  return objToString.call(value) === '[object String]';
+}
+/**
+ * @memberOf module:zrender/core/util
+ * @param {*} value
+ * @return {boolean}
+ */
+
+function isObject$1(value) {
+  // Avoid a V8 JIT bug in Chrome 19-20.
+  // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.
+  var type = typeof value;
+  return type === 'function' || !!value && type == 'object';
+}
+/**
+ * @memberOf module:zrender/core/util
+ * @param {*} value
+ * @return {boolean}
+ */
+
+function isBuiltInObject(value) {
+  return !!BUILTIN_OBJECT[objToString.call(value)];
+}
+/**
+ * @memberOf module:zrender/core/util
+ * @param {*} value
+ * @return {boolean}
+ */
+
+function isTypedArray(value) {
+  return !!TYPED_ARRAY[objToString.call(value)];
+}
+/**
+ * @memberOf module:zrender/core/util
+ * @param {*} value
+ * @return {boolean}
+ */
+
+function isDom(value) {
+  return typeof value === 'object' && typeof value.nodeType === 'number' && typeof value.ownerDocument === 'object';
+}
+/**
+ * Whether is exactly NaN. Notice isNaN('a') returns true.
+ * @param {*} value
+ * @return {boolean}
+ */
+
+function eqNaN(value) {
+  return value !== value;
+}
+/**
+ * If value1 is not null, then return value1, otherwise judget rest of values.
+ * Low performance.
+ * @memberOf module:zrender/core/util
+ * @return {*} Final value
+ */
+
+function retrieve(values) {
+  for (var i = 0, len = arguments.length; i < len; i++) {
+    if (arguments[i] != null) {
+      return arguments[i];
+    }
+  }
+}
+function retrieve2(value0, value1) {
+  return value0 != null ? value0 : value1;
+}
+function retrieve3(value0, value1, value2) {
+  return value0 != null ? value0 : value1 != null ? value1 : value2;
+}
+/**
+ * @memberOf module:zrender/core/util
+ * @param {Array} arr
+ * @param {number} startIndex
+ * @param {number} endIndex
+ * @return {Array}
+ */
+
+function slice() {
+  return Function.call.apply(nativeSlice, arguments);
+}
+/**
+ * Normalize css liked array configuration
+ * e.g.
+ *  3 => [3, 3, 3, 3]
+ *  [4, 2] => [4, 2, 4, 2]
+ *  [4, 3, 2] => [4, 3, 2, 3]
+ * @param {number|Array.<number>} val
+ * @return {Array.<number>}
+ */
+
+function normalizeCssArray(val) {
+  if (typeof val === 'number') {
+    return [val, val, val, val];
+  }
+
+  var len = val.length;
+
+  if (len === 2) {
+    // vertical | horizontal
+    return [val[0], val[1], val[0], val[1]];
+  } else if (len === 3) {
+    // top | horizontal | bottom
+    return [val[0], val[1], val[2], val[1]];
+  }
+
+  return val;
+}
+/**
+ * @memberOf module:zrender/core/util
+ * @param {boolean} condition
+ * @param {string} message
+ */
+
+function assert$1(condition, message) {
+  if (!condition) {
+    throw new Error(message);
+  }
+}
+/**
+ * @memberOf module:zrender/core/util
+ * @param {string} str string to be trimed
+ * @return {string} trimed string
+ */
+
+function trim(str) {
+  if (str == null) {
+    return null;
+  } else if (typeof str.trim === 'function') {
+    return str.trim();
+  } else {
+    return str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
+  }
+}
+var primitiveKey = '__ec_primitive__';
+/**
+ * Set an object as primitive to be ignored traversing children in clone or merge
+ */
+
+function setAsPrimitive(obj) {
+  obj[primitiveKey] = true;
+}
+function isPrimitive(obj) {
+  return obj[primitiveKey];
+}
+/**
+ * @constructor
+ * @param {Object} obj Only apply `ownProperty`.
+ */
+
+function HashMap(obj) {
+  var isArr = isArray(obj); // Key should not be set on this, otherwise
+  // methods get/set/... may be overrided.
+
+  this.data = {};
+  var thisMap = this;
+  obj instanceof HashMap ? obj.each(visit) : obj && each$1(obj, visit);
+
+  function visit(value, key) {
+    isArr ? thisMap.set(value, key) : thisMap.set(key, value);
+  }
+}
+
+HashMap.prototype = {
+  constructor: HashMap,
+  // Do not provide `has` method to avoid defining what is `has`.
+  // (We usually treat `null` and `undefined` as the same, different
+  // from ES6 Map).
+  get: function (key) {
+    return this.data.hasOwnProperty(key) ? this.data[key] : null;
+  },
+  set: function (key, value) {
+    // Comparing with invocation chaining, `return value` is more commonly
+    // used in this case: `var someVal = map.set('a', genVal());`
+    return this.data[key] = value;
+  },
+  // Although util.each can be performed on this hashMap directly, user
+  // should not use the exposed keys, who are prefixed.
+  each: function (cb, context) {
+    context !== void 0 && (cb = bind(cb, context));
+
+    for (var key in this.data) {
+      this.data.hasOwnProperty(key) && cb(this.data[key], key);
+    }
+  },
+  // Do not use this method if performance sensitive.
+  removeKey: function (key) {
+    delete this.data[key];
+  }
+};
+function createHashMap(obj) {
+  return new HashMap(obj);
+}
+function concatArray(a, b) {
+  var newArray = new a.constructor(a.length + b.length);
+
+  for (var i = 0; i < a.length; i++) {
+    newArray[i] = a[i];
+  }
+
+  var offset = a.length;
+
+  for (i = 0; i < b.length; i++) {
+    newArray[i + offset] = b[i];
+  }
+
+  return newArray;
+}
+function noop() {}
+
+var zrUtil = (Object.freeze || Object)({
+	$override: $override,
+	clone: clone,
+	merge: merge,
+	mergeAll: mergeAll,
+	extend: extend,
+	defaults: defaults,
+	createCanvas: createCanvas,
+	getContext: getContext,
+	indexOf: indexOf,
+	inherits: inherits,
+	mixin: mixin,
+	isArrayLike: isArrayLike,
+	each: each$1,
+	map: map,
+	reduce: reduce,
+	filter: filter,
+	find: find,
+	bind: bind,
+	curry: curry,
+	isArray: isArray,
+	isFunction: isFunction$1,
+	isString: isString,
+	isObject: isObject$1,
+	isBuiltInObject: isBuiltInObject,
+	isTypedArray: isTypedArray,
+	isDom: isDom,
+	eqNaN: eqNaN,
+	retrieve: retrieve,
+	retrieve2: retrieve2,
+	retrieve3: retrieve3,
+	slice: slice,
+	normalizeCssArray: normalizeCssArray,
+	assert: assert$1,
+	trim: trim,
+	setAsPrimitive: setAsPrimitive,
+	isPrimitive: isPrimitive,
+	createHashMap: createHashMap,
+	concatArray: concatArray,
+	noop: noop
+});
+
+var ArrayCtor = typeof Float32Array === 'undefined' ? Array : Float32Array;
+/**
+ * 鍒涘缓涓�涓悜閲�
+ * @param {number} [x=0]
+ * @param {number} [y=0]
+ * @return {Vector2}
+ */
+
+function create(x, y) {
+  var out = new ArrayCtor(2);
+
+  if (x == null) {
+    x = 0;
+  }
+
+  if (y == null) {
+    y = 0;
+  }
+
+  out[0] = x;
+  out[1] = y;
+  return out;
+}
+/**
+ * 澶嶅埗鍚戦噺鏁版嵁
+ * @param {Vector2} out
+ * @param {Vector2} v
+ * @return {Vector2}
+ */
+
+function copy(out, v) {
+  out[0] = v[0];
+  out[1] = v[1];
+  return out;
+}
+/**
+ * 鍏嬮殕涓�涓悜閲�
+ * @param {Vector2} v
+ * @return {Vector2}
+ */
+
+function clone$1(v) {
+  var out = new ArrayCtor(2);
+  out[0] = v[0];
+  out[1] = v[1];
+  return out;
+}
+/**
+ * 璁剧疆鍚戦噺鐨勪袱涓」
+ * @param {Vector2} out
+ * @param {number} a
+ * @param {number} b
+ * @return {Vector2} 缁撴灉
+ */
+
+function set(out, a, b) {
+  out[0] = a;
+  out[1] = b;
+  return out;
+}
+/**
+ * 鍚戦噺鐩稿姞
+ * @param {Vector2} out
+ * @param {Vector2} v1
+ * @param {Vector2} v2
+ */
+
+function add(out, v1, v2) {
+  out[0] = v1[0] + v2[0];
+  out[1] = v1[1] + v2[1];
+  return out;
+}
+/**
+ * 鍚戦噺缂╂斁鍚庣浉鍔�
+ * @param {Vector2} out
+ * @param {Vector2} v1
+ * @param {Vector2} v2
+ * @param {number} a
+ */
+
+function scaleAndAdd(out, v1, v2, a) {
+  out[0] = v1[0] + v2[0] * a;
+  out[1] = v1[1] + v2[1] * a;
+  return out;
+}
+/**
+ * 鍚戦噺鐩稿噺
+ * @param {Vector2} out
+ * @param {Vector2} v1
+ * @param {Vector2} v2
+ */
+
+function sub(out, v1, v2) {
+  out[0] = v1[0] - v2[0];
+  out[1] = v1[1] - v2[1];
+  return out;
+}
+/**
+ * 鍚戦噺闀垮害
+ * @param {Vector2} v
+ * @return {number}
+ */
+
+function len(v) {
+  return Math.sqrt(lenSquare(v));
+}
+var length = len; // jshint ignore:line
+
+/**
+ * 鍚戦噺闀垮害骞虫柟
+ * @param {Vector2} v
+ * @return {number}
+ */
+
+function lenSquare(v) {
+  return v[0] * v[0] + v[1] * v[1];
+}
+var lengthSquare = lenSquare;
+/**
+ * 鍚戦噺涔樻硶
+ * @param {Vector2} out
+ * @param {Vector2} v1
+ * @param {Vector2} v2
+ */
+
+function mul(out, v1, v2) {
+  out[0] = v1[0] * v2[0];
+  out[1] = v1[1] * v2[1];
+  return out;
+}
+/**
+ * 鍚戦噺闄ゆ硶
+ * @param {Vector2} out
+ * @param {Vector2} v1
+ * @param {Vector2} v2
+ */
+
+function div(out, v1, v2) {
+  out[0] = v1[0] / v2[0];
+  out[1] = v1[1] / v2[1];
+  return out;
+}
+/**
+ * 鍚戦噺鐐逛箻
+ * @param {Vector2} v1
+ * @param {Vector2} v2
+ * @return {number}
+ */
+
+function dot(v1, v2) {
+  return v1[0] * v2[0] + v1[1] * v2[1];
+}
+/**
+ * 鍚戦噺缂╂斁
+ * @param {Vector2} out
+ * @param {Vector2} v
+ * @param {number} s
+ */
+
+function scale(out, v, s) {
+  out[0] = v[0] * s;
+  out[1] = v[1] * s;
+  return out;
+}
+/**
+ * 鍚戦噺褰掍竴鍖�
+ * @param {Vector2} out
+ * @param {Vector2} v
+ */
+
+function normalize(out, v) {
+  var d = len(v);
+
+  if (d === 0) {
+    out[0] = 0;
+    out[1] = 0;
+  } else {
+    out[0] = v[0] / d;
+    out[1] = v[1] / d;
+  }
+
+  return out;
+}
+/**
+ * 璁$畻鍚戦噺闂磋窛绂�
+ * @param {Vector2} v1
+ * @param {Vector2} v2
+ * @return {number}
+ */
+
+function distance(v1, v2) {
+  return Math.sqrt((v1[0] - v2[0]) * (v1[0] - v2[0]) + (v1[1] - v2[1]) * (v1[1] - v2[1]));
+}
+var dist = distance;
+/**
+ * 鍚戦噺璺濈骞虫柟
+ * @param {Vector2} v1
+ * @param {Vector2} v2
+ * @return {number}
+ */
+
+function distanceSquare(v1, v2) {
+  return (v1[0] - v2[0]) * (v1[0] - v2[0]) + (v1[1] - v2[1]) * (v1[1] - v2[1]);
+}
+var distSquare = distanceSquare;
+/**
+ * 姹傝礋鍚戦噺
+ * @param {Vector2} out
+ * @param {Vector2} v
+ */
+
+function negate(out, v) {
+  out[0] = -v[0];
+  out[1] = -v[1];
+  return out;
+}
+/**
+ * 鎻掑�间袱涓偣
+ * @param {Vector2} out
+ * @param {Vector2} v1
+ * @param {Vector2} v2
+ * @param {number} t
+ */
+
+function lerp(out, v1, v2, t) {
+  out[0] = v1[0] + t * (v2[0] - v1[0]);
+  out[1] = v1[1] + t * (v2[1] - v1[1]);
+  return out;
+}
+/**
+ * 鐭╅樀宸︿箻鍚戦噺
+ * @param {Vector2} out
+ * @param {Vector2} v
+ * @param {Vector2} m
+ */
+
+function applyTransform(out, v, m) {
+  var x = v[0];
+  var y = v[1];
+  out[0] = m[0] * x + m[2] * y + m[4];
+  out[1] = m[1] * x + m[3] * y + m[5];
+  return out;
+}
+/**
+ * 姹備袱涓悜閲忔渶灏忓��
+ * @param  {Vector2} out
+ * @param  {Vector2} v1
+ * @param  {Vector2} v2
+ */
+
+function min(out, v1, v2) {
+  out[0] = Math.min(v1[0], v2[0]);
+  out[1] = Math.min(v1[1], v2[1]);
+  return out;
+}
+/**
+ * 姹備袱涓悜閲忔渶澶у��
+ * @param  {Vector2} out
+ * @param  {Vector2} v1
+ * @param  {Vector2} v2
+ */
+
+function max(out, v1, v2) {
+  out[0] = Math.max(v1[0], v2[0]);
+  out[1] = Math.max(v1[1], v2[1]);
+  return out;
+}
+
+var vector = (Object.freeze || Object)({
+	create: create,
+	copy: copy,
+	clone: clone$1,
+	set: set,
+	add: add,
+	scaleAndAdd: scaleAndAdd,
+	sub: sub,
+	len: len,
+	length: length,
+	lenSquare: lenSquare,
+	lengthSquare: lengthSquare,
+	mul: mul,
+	div: div,
+	dot: dot,
+	scale: scale,
+	normalize: normalize,
+	distance: distance,
+	dist: dist,
+	distanceSquare: distanceSquare,
+	distSquare: distSquare,
+	negate: negate,
+	lerp: lerp,
+	applyTransform: applyTransform,
+	min: min,
+	max: max
+});
+
+// TODO Draggable for group
+// FIXME Draggable on element which has parent rotation or scale
+function Draggable() {
+  this.on('mousedown', this._dragStart, this);
+  this.on('mousemove', this._drag, this);
+  this.on('mouseup', this._dragEnd, this);
+  this.on('globalout', this._dragEnd, this); // this._dropTarget = null;
+  // this._draggingTarget = null;
+  // this._x = 0;
+  // this._y = 0;
+}
+
+Draggable.prototype = {
+  constructor: Draggable,
+  _dragStart: function (e) {
+    var draggingTarget = e.target;
+
+    if (draggingTarget && draggingTarget.draggable) {
+      this._draggingTarget = draggingTarget;
+      draggingTarget.dragging = true;
+      this._x = e.offsetX;
+      this._y = e.offsetY;
+      this.dispatchToElement(param(draggingTarget, e), 'dragstart', e.event);
+    }
+  },
+  _drag: function (e) {
+    var draggingTarget = this._draggingTarget;
+
+    if (draggingTarget) {
+      var x = e.offsetX;
+      var y = e.offsetY;
+      var dx = x - this._x;
+      var dy = y - this._y;
+      this._x = x;
+      this._y = y;
+      draggingTarget.drift(dx, dy, e);
+      this.dispatchToElement(param(draggingTarget, e), 'drag', e.event);
+      var dropTarget = this.findHover(x, y, draggingTarget).target;
+      var lastDropTarget = this._dropTarget;
+      this._dropTarget = dropTarget;
+
+      if (draggingTarget !== dropTarget) {
+        if (lastDropTarget && dropTarget !== lastDropTarget) {
+          this.dispatchToElement(param(lastDropTarget, e), 'dragleave', e.event);
+        }
+
+        if (dropTarget && dropTarget !== lastDropTarget) {
+          this.dispatchToElement(param(dropTarget, e), 'dragenter', e.event);
+        }
+      }
+    }
+  },
+  _dragEnd: function (e) {
+    var draggingTarget = this._draggingTarget;
+
+    if (draggingTarget) {
+      draggingTarget.dragging = false;
+    }
+
+    this.dispatchToElement(param(draggingTarget, e), 'dragend', e.event);
+
+    if (this._dropTarget) {
+      this.dispatchToElement(param(this._dropTarget, e), 'drop', e.event);
+    }
+
+    this._draggingTarget = null;
+    this._dropTarget = null;
+  }
+};
+
+function param(target, e) {
+  return {
+    target: target,
+    topTarget: e && e.topTarget
+  };
+}
+
+/**
+ * Event Mixin
+ * @module zrender/mixin/Eventful
+ * @author Kener (@Kener-鏋楀嘲, kener.linfeng@gmail.com)
+ *         pissang (https://www.github.com/pissang)
+ */
+var arrySlice = Array.prototype.slice;
+/**
+ * Event dispatcher.
+ *
+ * @alias module:zrender/mixin/Eventful
+ * @constructor
+ * @param {Object} [eventProcessor] The object eventProcessor is the scope when
+ *        `eventProcessor.xxx` called.
+ * @param {Function} [eventProcessor.normalizeQuery]
+ *        param: {string|Object} Raw query.
+ *        return: {string|Object} Normalized query.
+ * @param {Function} [eventProcessor.filter] Event will be dispatched only
+ *        if it returns `true`.
+ *        param: {string} eventType
+ *        param: {string|Object} query
+ *        return: {boolean}
+ * @param {Function} [eventProcessor.afterTrigger] Call after all handlers called.
+ *        param: {string} eventType
+ */
+
+var Eventful = function (eventProcessor) {
+  this._$handlers = {};
+  this._$eventProcessor = eventProcessor;
+};
+
+Eventful.prototype = {
+  constructor: Eventful,
+
+  /**
+   * The handler can only be triggered once, then removed.
+   *
+   * @param {string} event The event name.
+   * @param {string|Object} [query] Condition used on event filter.
+   * @param {Function} handler The event handler.
+   * @param {Object} context
+   */
+  one: function (event, query, handler, context) {
+    var _h = this._$handlers;
+
+    if (typeof query === 'function') {
+      context = handler;
+      handler = query;
+      query = null;
+    }
+
+    if (!handler || !event) {
+      return this;
+    }
+
+    query = normalizeQuery(this, query);
+
+    if (!_h[event]) {
+      _h[event] = [];
+    }
+
+    for (var i = 0; i < _h[event].length; i++) {
+      if (_h[event][i].h === handler) {
+        return this;
+      }
+    }
+
+    _h[event].push({
+      h: handler,
+      one: true,
+      query: query,
+      ctx: context || this
+    });
+
+    return this;
+  },
+
+  /**
+   * Bind a handler.
+   *
+   * @param {string} event The event name.
+   * @param {string|Object} [query] Condition used on event filter.
+   * @param {Function} handler The event handler.
+   * @param {Object} [context]
+   */
+  on: function (event, query, handler, context) {
+    var _h = this._$handlers;
+
+    if (typeof query === 'function') {
+      context = handler;
+      handler = query;
+      query = null;
+    }
+
+    if (!handler || !event) {
+      return this;
+    }
+
+    query = normalizeQuery(this, query);
+
+    if (!_h[event]) {
+      _h[event] = [];
+    }
+
+    for (var i = 0; i < _h[event].length; i++) {
+      if (_h[event][i].h === handler) {
+        return this;
+      }
+    }
+
+    _h[event].push({
+      h: handler,
+      one: false,
+      query: query,
+      ctx: context || this
+    });
+
+    return this;
+  },
+
+  /**
+   * Whether any handler has bound.
+   *
+   * @param  {string}  event
+   * @return {boolean}
+   */
+  isSilent: function (event) {
+    var _h = this._$handlers;
+    return _h[event] && _h[event].length;
+  },
+
+  /**
+   * Unbind a event.
+   *
+   * @param {string} event The event name.
+   * @param {Function} [handler] The event handler.
+   */
+  off: function (event, handler) {
+    var _h = this._$handlers;
+
+    if (!event) {
+      this._$handlers = {};
+      return this;
+    }
+
+    if (handler) {
+      if (_h[event]) {
+        var newList = [];
+
+        for (var i = 0, l = _h[event].length; i < l; i++) {
+          if (_h[event][i].h !== handler) {
+            newList.push(_h[event][i]);
+          }
+        }
+
+        _h[event] = newList;
+      }
+
+      if (_h[event] && _h[event].length === 0) {
+        delete _h[event];
+      }
+    } else {
+      delete _h[event];
+    }
+
+    return this;
+  },
+
+  /**
+   * Dispatch a event.
+   *
+   * @param {string} type The event name.
+   */
+  trigger: function (type) {
+    var _h = this._$handlers[type];
+    var eventProcessor = this._$eventProcessor;
+
+    if (_h) {
+      var args = arguments;
+      var argLen = args.length;
+
+      if (argLen > 3) {
+        args = arrySlice.call(args, 1);
+      }
+
+      var len = _h.length;
+
+      for (var i = 0; i < len;) {
+        var hItem = _h[i];
+
+        if (eventProcessor && eventProcessor.filter && hItem.query != null && !eventProcessor.filter(type, hItem.query)) {
+          i++;
+          continue;
+        } // Optimize advise from backbone
+
+
+        switch (argLen) {
+          case 1:
+            hItem.h.call(hItem.ctx);
+            break;
+
+          case 2:
+            hItem.h.call(hItem.ctx, args[1]);
+            break;
+
+          case 3:
+            hItem.h.call(hItem.ctx, args[1], args[2]);
+            break;
+
+          default:
+            // have more than 2 given arguments
+            hItem.h.apply(hItem.ctx, args);
+            break;
+        }
+
+        if (hItem.one) {
+          _h.splice(i, 1);
+
+          len--;
+        } else {
+          i++;
+        }
+      }
+    }
+
+    eventProcessor && eventProcessor.afterTrigger && eventProcessor.afterTrigger(type);
+    return this;
+  },
+
+  /**
+   * Dispatch a event with context, which is specified at the last parameter.
+   *
+   * @param {string} type The event name.
+   */
+  triggerWithContext: function (type) {
+    var _h = this._$handlers[type];
+    var eventProcessor = this._$eventProcessor;
+
+    if (_h) {
+      var args = arguments;
+      var argLen = args.length;
+
+      if (argLen > 4) {
+        args = arrySlice.call(args, 1, args.length - 1);
+      }
+
+      var ctx = args[args.length - 1];
+      var len = _h.length;
+
+      for (var i = 0; i < len;) {
+        var hItem = _h[i];
+
+        if (eventProcessor && eventProcessor.filter && hItem.query != null && !eventProcessor.filter(type, hItem.query)) {
+          i++;
+          continue;
+        } // Optimize advise from backbone
+
+
+        switch (argLen) {
+          case 1:
+            hItem.h.call(ctx);
+            break;
+
+          case 2:
+            hItem.h.call(ctx, args[1]);
+            break;
+
+          case 3:
+            hItem.h.call(ctx, args[1], args[2]);
+            break;
+
+          default:
+            // have more than 2 given arguments
+            hItem.h.apply(ctx, args);
+            break;
+        }
+
+        if (hItem.one) {
+          _h.splice(i, 1);
+
+          len--;
+        } else {
+          i++;
+        }
+      }
+    }
+
+    eventProcessor && eventProcessor.afterTrigger && eventProcessor.afterTrigger(type);
+    return this;
+  }
+};
+
+function normalizeQuery(host, query) {
+  var eventProcessor = host._$eventProcessor;
+
+  if (query != null && eventProcessor && eventProcessor.normalizeQuery) {
+    query = eventProcessor.normalizeQuery(query);
+  }
+
+  return query;
+} // ----------------------
+
+/**
+ * 浜嬩欢杈呭姪绫�
+ * @module zrender/core/event
+ * @author Kener (@Kener-鏋楀嘲, kener.linfeng@gmail.com)
+ */
+var isDomLevel2 = typeof window !== 'undefined' && !!window.addEventListener;
+var MOUSE_EVENT_REG = /^(?:mouse|pointer|contextmenu|drag|drop)|click/;
+
+function getBoundingClientRect(el) {
+  // BlackBerry 5, iOS 3 (original iPhone) don't have getBoundingRect
+  return el.getBoundingClientRect ? el.getBoundingClientRect() : {
+    left: 0,
+    top: 0
+  };
+} // `calculate` is optional, default false
+
+
+function clientToLocal(el, e, out, calculate) {
+  out = out || {}; // According to the W3C Working Draft, offsetX and offsetY should be relative
+  // to the padding edge of the target element. The only browser using this convention
+  // is IE. Webkit uses the border edge, Opera uses the content edge, and FireFox does
+  // not support the properties.
+  // (see http://www.jacklmoore.com/notes/mouse-position/)
+  // In zr painter.dom, padding edge equals to border edge.
+  // FIXME
+  // When mousemove event triggered on ec tooltip, target is not zr painter.dom, and
+  // offsetX/Y is relative to e.target, where the calculation of zrX/Y via offsetX/Y
+  // is too complex. So css-transfrom dont support in this case temporarily.
+
+  if (calculate || !env$1.canvasSupported) {
+    defaultGetZrXY(el, e, out);
+  } // Caution: In FireFox, layerX/layerY Mouse position relative to the closest positioned
+  // ancestor element, so we should make sure el is positioned (e.g., not position:static).
+  // BTW1, Webkit don't return the same results as FF in non-simple cases (like add
+  // zoom-factor, overflow / opacity layers, transforms ...)
+  // BTW2, (ev.offsetY || ev.pageY - $(ev.target).offset().top) is not correct in preserve-3d.
+  // <https://bugs.jquery.com/ticket/8523#comment:14>
+  // BTW3, In ff, offsetX/offsetY is always 0.
+  else if (env$1.browser.firefox && e.layerX != null && e.layerX !== e.offsetX) {
+      out.zrX = e.layerX;
+      out.zrY = e.layerY;
+    } // For IE6+, chrome, safari, opera. (When will ff support offsetX?)
+    else if (e.offsetX != null) {
+        out.zrX = e.offsetX;
+        out.zrY = e.offsetY;
+      } // For some other device, e.g., IOS safari.
+      else {
+          defaultGetZrXY(el, e, out);
+        }
+
+  return out;
+}
+
+function defaultGetZrXY(el, e, out) {
+  // This well-known method below does not support css transform.
+  var box = getBoundingClientRect(el);
+  out.zrX = e.clientX - box.left;
+  out.zrY = e.clientY - box.top;
+}
+/**
+ * 濡傛灉瀛樺湪绗笁鏂瑰祵鍏ョ殑涓�浜沝om瑙﹀彂鐨勪簨浠讹紝鎴杢ouch浜嬩欢锛岄渶瑕佽浆鎹竴涓嬩簨浠跺潗鏍�.
+ * `calculate` is optional, default false.
+ */
+
+
+function normalizeEvent(el, e, calculate) {
+  e = e || window.event;
+
+  if (e.zrX != null) {
+    return e;
+  }
+
+  var eventType = e.type;
+  var isTouch = eventType && eventType.indexOf('touch') >= 0;
+
+  if (!isTouch) {
+    clientToLocal(el, e, e, calculate);
+    e.zrDelta = e.wheelDelta ? e.wheelDelta / 120 : -(e.detail || 0) / 3;
+  } else {
+    var touch = eventType != 'touchend' ? e.targetTouches[0] : e.changedTouches[0];
+    touch && clientToLocal(el, touch, e, calculate);
+  } // Add which for click: 1 === left; 2 === middle; 3 === right; otherwise: 0;
+  // See jQuery: https://github.com/jquery/jquery/blob/master/src/event.js
+  // If e.which has been defined, if may be readonly,
+  // see: https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/which
+
+
+  var button = e.button;
+
+  if (e.which == null && button !== undefined && MOUSE_EVENT_REG.test(e.type)) {
+    e.which = button & 1 ? 1 : button & 2 ? 3 : button & 4 ? 2 : 0;
+  }
+
+  return e;
+}
+/**
+ * @param {HTMLElement} el
+ * @param {string} name
+ * @param {Function} handler
+ */
+
+function addEventListener(el, name, handler) {
+  if (isDomLevel2) {
+    // Reproduct the console warning:
+    // [Violation] Added non-passive event listener to a scroll-blocking <some> event.
+    // Consider marking event handler as 'passive' to make the page more responsive.
+    // Just set console log level: verbose in chrome dev tool.
+    // then the warning log will be printed when addEventListener called.
+    // See https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md
+    // We have not yet found a neat way to using passive. Because in zrender the dom event
+    // listener delegate all of the upper events of element. Some of those events need
+    // to prevent default. For example, the feature `preventDefaultMouseMove` of echarts.
+    // Before passive can be adopted, these issues should be considered:
+    // (1) Whether and how a zrender user specifies an event listener passive. And by default,
+    // passive or not.
+    // (2) How to tread that some zrender event listener is passive, and some is not. If
+    // we use other way but not preventDefault of mousewheel and touchmove, browser
+    // compatibility should be handled.
+    // var opts = (env.passiveSupported && name === 'mousewheel')
+    //     ? {passive: true}
+    //     // By default, the third param of el.addEventListener is `capture: false`.
+    //     : void 0;
+    // el.addEventListener(name, handler /* , opts */);
+    el.addEventListener(name, handler);
+  } else {
+    el.attachEvent('on' + name, handler);
+  }
+}
+function removeEventListener(el, name, handler) {
+  if (isDomLevel2) {
+    el.removeEventListener(name, handler);
+  } else {
+    el.detachEvent('on' + name, handler);
+  }
+}
+/**
+ * preventDefault and stopPropagation.
+ * Notice: do not do that in zrender. Upper application
+ * do that if necessary.
+ *
+ * @memberOf module:zrender/core/event
+ * @method
+ * @param {Event} e : event瀵硅薄
+ */
+
+var stop = isDomLevel2 ? function (e) {
+  e.preventDefault();
+  e.stopPropagation();
+  e.cancelBubble = true;
+} : function (e) {
+  e.returnValue = false;
+  e.cancelBubble = true;
+};
+function notLeftMouse(e) {
+  // If e.which is undefined, considered as left mouse event.
+  return e.which > 1;
+} // 鍋氬悜涓婂吋瀹�
+
+var SILENT = 'silent';
+
+function makeEventPacket(eveType, targetInfo, event) {
+  return {
+    type: eveType,
+    event: event,
+    // target can only be an element that is not silent.
+    target: targetInfo.target,
+    // topTarget can be a silent element.
+    topTarget: targetInfo.topTarget,
+    cancelBubble: false,
+    offsetX: event.zrX,
+    offsetY: event.zrY,
+    gestureEvent: event.gestureEvent,
+    pinchX: event.pinchX,
+    pinchY: event.pinchY,
+    pinchScale: event.pinchScale,
+    wheelDelta: event.zrDelta,
+    zrByTouch: event.zrByTouch,
+    which: event.which,
+    stop: stopEvent
+  };
+}
+
+function stopEvent(event) {
+  stop(this.event);
+}
+
+function EmptyProxy() {}
+
+EmptyProxy.prototype.dispose = function () {};
+
+var handlerNames = ['click', 'dblclick', 'mousewheel', 'mouseout', 'mouseup', 'mousedown', 'mousemove', 'contextmenu'];
+/**
+ * @alias module:zrender/Handler
+ * @constructor
+ * @extends module:zrender/mixin/Eventful
+ * @param {module:zrender/Storage} storage Storage instance.
+ * @param {module:zrender/Painter} painter Painter instance.
+ * @param {module:zrender/dom/HandlerProxy} proxy HandlerProxy instance.
+ * @param {HTMLElement} painterRoot painter.root (not painter.getViewportRoot()).
+ */
+
+var Handler = function (storage, painter, proxy, painterRoot) {
+  Eventful.call(this);
+  this.storage = storage;
+  this.painter = painter;
+  this.painterRoot = painterRoot;
+  proxy = proxy || new EmptyProxy();
+  /**
+   * Proxy of event. can be Dom, WebGLSurface, etc.
+   */
+
+  this.proxy = null;
+  /**
+   * {target, topTarget, x, y}
+   * @private
+   * @type {Object}
+   */
+
+  this._hovered = {};
+  /**
+   * @private
+   * @type {Date}
+   */
+
+  this._lastTouchMoment;
+  /**
+   * @private
+   * @type {number}
+   */
+
+  this._lastX;
+  /**
+   * @private
+   * @type {number}
+   */
+
+  this._lastY;
+  Draggable.call(this);
+  this.setHandlerProxy(proxy);
+};
+
+Handler.prototype = {
+  constructor: Handler,
+  setHandlerProxy: function (proxy) {
+    if (this.proxy) {
+      this.proxy.dispose();
+    }
+
+    if (proxy) {
+      each$1(handlerNames, function (name) {
+        proxy.on && proxy.on(name, this[name], this);
+      }, this); // Attach handler
+
+      proxy.handler = this;
+    }
+
+    this.proxy = proxy;
+  },
+  mousemove: function (event) {
+    var x = event.zrX;
+    var y = event.zrY;
+    var lastHovered = this._hovered;
+    var lastHoveredTarget = lastHovered.target; // If lastHoveredTarget is removed from zr (detected by '__zr') by some API call
+    // (like 'setOption' or 'dispatchAction') in event handlers, we should find
+    // lastHovered again here. Otherwise 'mouseout' can not be triggered normally.
+    // See #6198.
+
+    if (lastHoveredTarget && !lastHoveredTarget.__zr) {
+      lastHovered = this.findHover(lastHovered.x, lastHovered.y);
+      lastHoveredTarget = lastHovered.target;
+    }
+
+    var hovered = this._hovered = this.findHover(x, y);
+    var hoveredTarget = hovered.target;
+    var proxy = this.proxy;
+    proxy.setCursor && proxy.setCursor(hoveredTarget ? hoveredTarget.cursor : 'default'); // Mouse out on previous hovered element
+
+    if (lastHoveredTarget && hoveredTarget !== lastHoveredTarget) {
+      this.dispatchToElement(lastHovered, 'mouseout', event);
+    } // Mouse moving on one element
+
+
+    this.dispatchToElement(hovered, 'mousemove', event); // Mouse over on a new element
+
+    if (hoveredTarget && hoveredTarget !== lastHoveredTarget) {
+      this.dispatchToElement(hovered, 'mouseover', event);
+    }
+  },
+  mouseout: function (event) {
+    this.dispatchToElement(this._hovered, 'mouseout', event); // There might be some doms created by upper layer application
+    // at the same level of painter.getViewportRoot() (e.g., tooltip
+    // dom created by echarts), where 'globalout' event should not
+    // be triggered when mouse enters these doms. (But 'mouseout'
+    // should be triggered at the original hovered element as usual).
+
+    var element = event.toElement || event.relatedTarget;
+    var innerDom;
+
+    do {
+      element = element && element.parentNode;
+    } while (element && element.nodeType != 9 && !(innerDom = element === this.painterRoot));
+
+    !innerDom && this.trigger('globalout', {
+      event: event
+    });
+  },
+
+  /**
+   * Resize
+   */
+  resize: function (event) {
+    this._hovered = {};
+  },
+
+  /**
+   * Dispatch event
+   * @param {string} eventName
+   * @param {event=} eventArgs
+   */
+  dispatch: function (eventName, eventArgs) {
+    var handler = this[eventName];
+    handler && handler.call(this, eventArgs);
+  },
+
+  /**
+   * Dispose
+   */
+  dispose: function () {
+    this.proxy.dispose();
+    this.storage = this.proxy = this.painter = null;
+  },
+
+  /**
+   * 璁剧疆榛樿鐨刢ursor style
+   * @param {string} [cursorStyle='default'] 渚嬪 crosshair
+   */
+  setCursorStyle: function (cursorStyle) {
+    var proxy = this.proxy;
+    proxy.setCursor && proxy.setCursor(cursorStyle);
+  },
+
+  /**
+   * 浜嬩欢鍒嗗彂浠g悊
+   *
+   * @private
+   * @param {Object} targetInfo {target, topTarget} 鐩爣鍥惧舰鍏冪礌
+   * @param {string} eventName 浜嬩欢鍚嶇О
+   * @param {Object} event 浜嬩欢瀵硅薄
+   */
+  dispatchToElement: function (targetInfo, eventName, event) {
+    targetInfo = targetInfo || {};
+    var el = targetInfo.target;
+
+    if (el && el.silent) {
+      return;
+    }
+
+    var eventHandler = 'on' + eventName;
+    var eventPacket = makeEventPacket(eventName, targetInfo, event);
+
+    while (el) {
+      el[eventHandler] && (eventPacket.cancelBubble = el[eventHandler].call(el, eventPacket));
+      el.trigger(eventName, eventPacket);
+      el = el.parent;
+
+      if (eventPacket.cancelBubble) {
+        break;
+      }
+    }
+
+    if (!eventPacket.cancelBubble) {
+      // 鍐掓场鍒伴《绾� zrender 瀵硅薄
+      this.trigger(eventName, eventPacket); // 鍒嗗彂浜嬩欢鍒扮敤鎴疯嚜瀹氫箟灞�
+      // 鐢ㄦ埛鏈夊彲鑳藉湪鍏ㄥ眬 click 浜嬩欢涓� dispose锛屾墍浠ラ渶瑕佸垽鏂笅 painter 鏄惁瀛樺湪
+
+      this.painter && this.painter.eachOtherLayer(function (layer) {
+        if (typeof layer[eventHandler] == 'function') {
+          layer[eventHandler].call(layer, eventPacket);
+        }
+
+        if (layer.trigger) {
+          layer.trigger(eventName, eventPacket);
+        }
+      });
+    }
+  },
+
+  /**
+   * @private
+   * @param {number} x
+   * @param {number} y
+   * @param {module:zrender/graphic/Displayable} exclude
+   * @return {model:zrender/Element}
+   * @method
+   */
+  findHover: function (x, y, exclude) {
+    var list = this.storage.getDisplayList();
+    var out = {
+      x: x,
+      y: y
+    };
+
+    for (var i = list.length - 1; i >= 0; i--) {
+      var hoverCheckResult;
+
+      if (list[i] !== exclude // getDisplayList may include ignored item in VML mode
+      && !list[i].ignore && (hoverCheckResult = isHover(list[i], x, y))) {
+        !out.topTarget && (out.topTarget = list[i]);
+
+        if (hoverCheckResult !== SILENT) {
+          out.target = list[i];
+          break;
+        }
+      }
+    }
+
+    return out;
+  }
+}; // Common handlers
+
+each$1(['click', 'mousedown', 'mouseup', 'mousewheel', 'dblclick', 'contextmenu'], function (name) {
+  Handler.prototype[name] = function (event) {
+    // Find hover again to avoid click event is dispatched manually. Or click is triggered without mouseover
+    var hovered = this.findHover(event.zrX, event.zrY);
+    var hoveredTarget = hovered.target;
+
+    if (name === 'mousedown') {
+      this._downEl = hoveredTarget;
+      this._downPoint = [event.zrX, event.zrY]; // In case click triggered before mouseup
+
+      this._upEl = hoveredTarget;
+    } else if (name === 'mouseup') {
+      this._upEl = hoveredTarget;
+    } else if (name === 'click') {
+      if (this._downEl !== this._upEl // Original click event is triggered on the whole canvas element,
+      // including the case that `mousedown` - `mousemove` - `mouseup`,
+      // which should be filtered, otherwise it will bring trouble to
+      // pan and zoom.
+      || !this._downPoint // Arbitrary value
+      || dist(this._downPoint, [event.zrX, event.zrY]) > 4) {
+        return;
+      }
+
+      this._downPoint = null;
+    }
+
+    this.dispatchToElement(hovered, name, event);
+  };
+});
+
+function isHover(displayable, x, y) {
+  if (displayable[displayable.rectHover ? 'rectContain' : 'contain'](x, y)) {
+    var el = displayable;
+    var isSilent;
+
+    while (el) {
+      // If clipped by ancestor.
+      // FIXME: If clipPath has neither stroke nor fill,
+      // el.clipPath.contain(x, y) will always return false.
+      if (el.clipPath && !el.clipPath.contain(x, y)) {
+        return false;
+      }
+
+      if (el.silent) {
+        isSilent = true;
+      }
+
+      el = el.parent;
+    }
+
+    return isSilent ? SILENT : true;
+  }
+
+  return false;
+}
+
+mixin(Handler, Eventful);
+mixin(Handler, Draggable);
+
+/**
+ * 3x2鐭╅樀鎿嶄綔绫�
+ * @exports zrender/tool/matrix
+ */
+var ArrayCtor$1 = typeof Float32Array === 'undefined' ? Array : Float32Array;
+/**
+ * Create a identity matrix.
+ * @return {Float32Array|Array.<number>}
+ */
+
+function create$1() {
+  var out = new ArrayCtor$1(6);
+  identity(out);
+  return out;
+}
+/**
+ * 璁剧疆鐭╅樀涓哄崟浣嶇煩闃�
+ * @param {Float32Array|Array.<number>} out
+ */
+
+function identity(out) {
+  out[0] = 1;
+  out[1] = 0;
+  out[2] = 0;
+  out[3] = 1;
+  out[4] = 0;
+  out[5] = 0;
+  return out;
+}
+/**
+ * 澶嶅埗鐭╅樀
+ * @param {Float32Array|Array.<number>} out
+ * @param {Float32Array|Array.<number>} m
+ */
+
+function copy$1(out, m) {
+  out[0] = m[0];
+  out[1] = m[1];
+  out[2] = m[2];
+  out[3] = m[3];
+  out[4] = m[4];
+  out[5] = m[5];
+  return out;
+}
+/**
+ * 鐭╅樀鐩镐箻
+ * @param {Float32Array|Array.<number>} out
+ * @param {Float32Array|Array.<number>} m1
+ * @param {Float32Array|Array.<number>} m2
+ */
+
+function mul$1(out, m1, m2) {
+  // Consider matrix.mul(m, m2, m);
+  // where out is the same as m2.
+  // So use temp variable to escape error.
+  var out0 = m1[0] * m2[0] + m1[2] * m2[1];
+  var out1 = m1[1] * m2[0] + m1[3] * m2[1];
+  var out2 = m1[0] * m2[2] + m1[2] * m2[3];
+  var out3 = m1[1] * m2[2] + m1[3] * m2[3];
+  var out4 = m1[0] * m2[4] + m1[2] * m2[5] + m1[4];
+  var out5 = m1[1] * m2[4] + m1[3] * m2[5] + m1[5];
+  out[0] = out0;
+  out[1] = out1;
+  out[2] = out2;
+  out[3] = out3;
+  out[4] = out4;
+  out[5] = out5;
+  return out;
+}
+/**
+ * 骞崇Щ鍙樻崲
+ * @param {Float32Array|Array.<number>} out
+ * @param {Float32Array|Array.<number>} a
+ * @param {Float32Array|Array.<number>} v
+ */
+
+function translate(out, a, v) {
+  out[0] = a[0];
+  out[1] = a[1];
+  out[2] = a[2];
+  out[3] = a[3];
+  out[4] = a[4] + v[0];
+  out[5] = a[5] + v[1];
+  return out;
+}
+/**
+ * 鏃嬭浆鍙樻崲
+ * @param {Float32Array|Array.<number>} out
+ * @param {Float32Array|Array.<number>} a
+ * @param {number} rad
+ */
+
+function rotate(out, a, rad) {
+  var aa = a[0];
+  var ac = a[2];
+  var atx = a[4];
+  var ab = a[1];
+  var ad = a[3];
+  var aty = a[5];
+  var st = Math.sin(rad);
+  var ct = Math.cos(rad);
+  out[0] = aa * ct + ab * st;
+  out[1] = -aa * st + ab * ct;
+  out[2] = ac * ct + ad * st;
+  out[3] = -ac * st + ct * ad;
+  out[4] = ct * atx + st * aty;
+  out[5] = ct * aty - st * atx;
+  return out;
+}
+/**
+ * 缂╂斁鍙樻崲
+ * @param {Float32Array|Array.<number>} out
+ * @param {Float32Array|Array.<number>} a
+ * @param {Float32Array|Array.<number>} v
+ */
+
+function scale$1(out, a, v) {
+  var vx = v[0];
+  var vy = v[1];
+  out[0] = a[0] * vx;
+  out[1] = a[1] * vy;
+  out[2] = a[2] * vx;
+  out[3] = a[3] * vy;
+  out[4] = a[4] * vx;
+  out[5] = a[5] * vy;
+  return out;
+}
+/**
+ * 姹傞�嗙煩闃�
+ * @param {Float32Array|Array.<number>} out
+ * @param {Float32Array|Array.<number>} a
+ */
+
+function invert(out, a) {
+  var aa = a[0];
+  var ac = a[2];
+  var atx = a[4];
+  var ab = a[1];
+  var ad = a[3];
+  var aty = a[5];
+  var det = aa * ad - ab * ac;
+
+  if (!det) {
+    return null;
+  }
+
+  det = 1.0 / det;
+  out[0] = ad * det;
+  out[1] = -ab * det;
+  out[2] = -ac * det;
+  out[3] = aa * det;
+  out[4] = (ac * aty - ad * atx) * det;
+  out[5] = (ab * atx - aa * aty) * det;
+  return out;
+}
+/**
+ * Clone a new matrix.
+ * @param {Float32Array|Array.<number>} a
+ */
+
+function clone$2(a) {
+  var b = create$1();
+  copy$1(b, a);
+  return b;
+}
+
+var matrix = (Object.freeze || Object)({
+	create: create$1,
+	identity: identity,
+	copy: copy$1,
+	mul: mul$1,
+	translate: translate,
+	rotate: rotate,
+	scale: scale$1,
+	invert: invert,
+	clone: clone$2
+});
+
+/**
+ * 鎻愪緵鍙樻崲鎵╁睍
+ * @module zrender/mixin/Transformable
+ * @author pissang (https://www.github.com/pissang)
+ */
+var mIdentity = identity;
+var EPSILON = 5e-5;
+
+function isNotAroundZero(val) {
+  return val > EPSILON || val < -EPSILON;
+}
+/**
+ * @alias module:zrender/mixin/Transformable
+ * @constructor
+ */
+
+
+var Transformable = function (opts) {
+  opts = opts || {}; // If there are no given position, rotation, scale
+
+  if (!opts.position) {
+    /**
+     * 骞崇Щ
+     * @type {Array.<number>}
+     * @default [0, 0]
+     */
+    this.position = [0, 0];
+  }
+
+  if (opts.rotation == null) {
+    /**
+     * 鏃嬭浆
+     * @type {Array.<number>}
+     * @default 0
+     */
+    this.rotation = 0;
+  }
+
+  if (!opts.scale) {
+    /**
+     * 缂╂斁
+     * @type {Array.<number>}
+     * @default [1, 1]
+     */
+    this.scale = [1, 1];
+  }
+  /**
+   * 鏃嬭浆鍜岀缉鏀剧殑鍘熺偣
+   * @type {Array.<number>}
+   * @default null
+   */
+
+
+  this.origin = this.origin || null;
+};
+
+var transformableProto = Transformable.prototype;
+transformableProto.transform = null;
+/**
+ * 鍒ゆ柇鏄惁闇�瑕佹湁鍧愭爣鍙樻崲
+ * 濡傛灉鏈夊潗鏍囧彉鎹�, 鍒欎粠position, rotation, scale浠ュ強鐖惰妭鐐圭殑transform璁$畻鍑鸿嚜韬殑transform鐭╅樀
+ */
+
+transformableProto.needLocalTransform = function () {
+  return isNotAroundZero(this.rotation) || isNotAroundZero(this.position[0]) || isNotAroundZero(this.position[1]) || isNotAroundZero(this.scale[0] - 1) || isNotAroundZero(this.scale[1] - 1);
+};
+
+var scaleTmp = [];
+
+transformableProto.updateTransform = function () {
+  var parent = this.parent;
+  var parentHasTransform = parent && parent.transform;
+  var needLocalTransform = this.needLocalTransform();
+  var m = this.transform;
+
+  if (!(needLocalTransform || parentHasTransform)) {
+    m && mIdentity(m);
+    return;
+  }
+
+  m = m || create$1();
+
+  if (needLocalTransform) {
+    this.getLocalTransform(m);
+  } else {
+    mIdentity(m);
+  } // 搴旂敤鐖惰妭鐐瑰彉鎹�
+
+
+  if (parentHasTransform) {
+    if (needLocalTransform) {
+      mul$1(m, parent.transform, m);
+    } else {
+      copy$1(m, parent.transform);
+    }
+  } // 淇濆瓨杩欎釜鍙樻崲鐭╅樀
+
+
+  this.transform = m;
+  var globalScaleRatio = this.globalScaleRatio;
+
+  if (globalScaleRatio != null && globalScaleRatio !== 1) {
+    this.getGlobalScale(scaleTmp);
+    var relX = scaleTmp[0] < 0 ? -1 : 1;
+    var relY = scaleTmp[1] < 0 ? -1 : 1;
+    var sx = ((scaleTmp[0] - relX) * globalScaleRatio + relX) / scaleTmp[0] || 0;
+    var sy = ((scaleTmp[1] - relY) * globalScaleRatio + relY) / scaleTmp[1] || 0;
+    m[0] *= sx;
+    m[1] *= sx;
+    m[2] *= sy;
+    m[3] *= sy;
+  }
+
+  this.invTransform = this.invTransform || create$1();
+  invert(this.invTransform, m);
+};
+
+transformableProto.getLocalTransform = function (m) {
+  return Transformable.getLocalTransform(this, m);
+};
+/**
+ * 灏嗚嚜宸辩殑transform搴旂敤鍒癱ontext涓�
+ * @param {CanvasRenderingContext2D} ctx
+ */
+
+
+transformableProto.setTransform = function (ctx) {
+  var m = this.transform;
+  var dpr = ctx.dpr || 1;
+
+  if (m) {
+    ctx.setTransform(dpr * m[0], dpr * m[1], dpr * m[2], dpr * m[3], dpr * m[4], dpr * m[5]);
+  } else {
+    ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
+  }
+};
+
+transformableProto.restoreTransform = function (ctx) {
+  var dpr = ctx.dpr || 1;
+  ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
+};
+
+var tmpTransform = [];
+var originTransform = create$1();
+
+transformableProto.setLocalTransform = function (m) {
+  if (!m) {
+    // TODO return or set identity?
+    return;
+  }
+
+  var sx = m[0] * m[0] + m[1] * m[1];
+  var sy = m[2] * m[2] + m[3] * m[3];
+  var position = this.position;
+  var scale$$1 = this.scale;
+
+  if (isNotAroundZero(sx - 1)) {
+    sx = Math.sqrt(sx);
+  }
+
+  if (isNotAroundZero(sy - 1)) {
+    sy = Math.sqrt(sy);
+  }
+
+  if (m[0] < 0) {
+    sx = -sx;
+  }
+
+  if (m[3] < 0) {
+    sy = -sy;
+  }
+
+  position[0] = m[4];
+  position[1] = m[5];
+  scale$$1[0] = sx;
+  scale$$1[1] = sy;
+  this.rotation = Math.atan2(-m[1] / sy, m[0] / sx);
+};
+/**
+ * 鍒嗚В`transform`鐭╅樀鍒癭position`, `rotation`, `scale`
+ */
+
+
+transformableProto.decomposeTransform = function () {
+  if (!this.transform) {
+    return;
+  }
+
+  var parent = this.parent;
+  var m = this.transform;
+
+  if (parent && parent.transform) {
+    // Get local transform and decompose them to position, scale, rotation
+    mul$1(tmpTransform, parent.invTransform, m);
+    m = tmpTransform;
+  }
+
+  var origin = this.origin;
+
+  if (origin && (origin[0] || origin[1])) {
+    originTransform[4] = origin[0];
+    originTransform[5] = origin[1];
+    mul$1(tmpTransform, m, originTransform);
+    tmpTransform[4] -= origin[0];
+    tmpTransform[5] -= origin[1];
+    m = tmpTransform;
+  }
+
+  this.setLocalTransform(m);
+};
+/**
+ * Get global scale
+ * @return {Array.<number>}
+ */
+
+
+transformableProto.getGlobalScale = function (out) {
+  var m = this.transform;
+  out = out || [];
+
+  if (!m) {
+    out[0] = 1;
+    out[1] = 1;
+    return out;
+  }
+
+  out[0] = Math.sqrt(m[0] * m[0] + m[1] * m[1]);
+  out[1] = Math.sqrt(m[2] * m[2] + m[3] * m[3]);
+
+  if (m[0] < 0) {
+    out[0] = -out[0];
+  }
+
+  if (m[3] < 0) {
+    out[1] = -out[1];
+  }
+
+  return out;
+};
+/**
+ * 鍙樻崲鍧愭爣浣嶇疆鍒� shape 鐨勫眬閮ㄥ潗鏍囩┖闂�
+ * @method
+ * @param {number} x
+ * @param {number} y
+ * @return {Array.<number>}
+ */
+
+
+transformableProto.transformCoordToLocal = function (x, y) {
+  var v2 = [x, y];
+  var invTransform = this.invTransform;
+
+  if (invTransform) {
+    applyTransform(v2, v2, invTransform);
+  }
+
+  return v2;
+};
+/**
+ * 鍙樻崲灞�閮ㄥ潗鏍囦綅缃埌鍏ㄥ眬鍧愭爣绌洪棿
+ * @method
+ * @param {number} x
+ * @param {number} y
+ * @return {Array.<number>}
+ */
+
+
+transformableProto.transformCoordToGlobal = function (x, y) {
+  var v2 = [x, y];
+  var transform = this.transform;
+
+  if (transform) {
+    applyTransform(v2, v2, transform);
+  }
+
+  return v2;
+};
+/**
+ * @static
+ * @param {Object} target
+ * @param {Array.<number>} target.origin
+ * @param {number} target.rotation
+ * @param {Array.<number>} target.position
+ * @param {Array.<number>} [m]
+ */
+
+
+Transformable.getLocalTransform = function (target, m) {
+  m = m || [];
+  mIdentity(m);
+  var origin = target.origin;
+  var scale$$1 = target.scale || [1, 1];
+  var rotation = target.rotation || 0;
+  var position = target.position || [0, 0];
+
+  if (origin) {
+    // Translate to origin
+    m[4] -= origin[0];
+    m[5] -= origin[1];
+  }
+
+  scale$1(m, m, scale$$1);
+
+  if (rotation) {
+    rotate(m, m, rotation);
+  }
+
+  if (origin) {
+    // Translate back from origin
+    m[4] += origin[0];
+    m[5] += origin[1];
+  }
+
+  m[4] += position[0];
+  m[5] += position[1];
+  return m;
+};
+
+/**
+ * 缂撳姩浠g爜鏉ヨ嚜 https://github.com/sole/tween.js/blob/master/src/Tween.js
+ * @see http://sole.github.io/tween.js/examples/03_graphs.html
+ * @exports zrender/animation/easing
+ */
+var easing = {
+  /**
+  * @param {number} k
+  * @return {number}
+  */
+  linear: function (k) {
+    return k;
+  },
+
+  /**
+  * @param {number} k
+  * @return {number}
+  */
+  quadraticIn: function (k) {
+    return k * k;
+  },
+
+  /**
+  * @param {number} k
+  * @return {number}
+  */
+  quadraticOut: function (k) {
+    return k * (2 - k);
+  },
+
+  /**
+  * @param {number} k
+  * @return {number}
+  */
+  quadraticInOut: function (k) {
+    if ((k *= 2) < 1) {
+      return 0.5 * k * k;
+    }
+
+    return -0.5 * (--k * (k - 2) - 1);
+  },
+  // 涓夋鏂圭殑缂撳姩锛坱^3锛�
+
+  /**
+  * @param {number} k
+  * @return {number}
+  */
+  cubicIn: function (k) {
+    return k * k * k;
+  },
+
+  /**
+  * @param {number} k
+  * @return {number}
+  */
+  cubicOut: function (k) {
+    return --k * k * k + 1;
+  },
+
+  /**
+  * @param {number} k
+  * @return {number}
+  */
+  cubicInOut: function (k) {
+    if ((k *= 2) < 1) {
+      return 0.5 * k * k * k;
+    }
+
+    return 0.5 * ((k -= 2) * k * k + 2);
+  },
+  // 鍥涙鏂圭殑缂撳姩锛坱^4锛�
+
+  /**
+  * @param {number} k
+  * @return {number}
+  */
+  quarticIn: function (k) {
+    return k * k * k * k;
+  },
+
+  /**
+  * @param {number} k
+  * @return {number}
+  */
+  quarticOut: function (k) {
+    return 1 - --k * k * k * k;
+  },
+
+  /**
+  * @param {number} k
+  * @return {number}
+  */
+  quarticInOut: function (k) {
+    if ((k *= 2) < 1) {
+      return 0.5 * k * k * k * k;
+    }
+
+    return -0.5 * ((k -= 2) * k * k * k - 2);
+  },
+  // 浜旀鏂圭殑缂撳姩锛坱^5锛�
+
+  /**
+  * @param {number} k
+  * @return {number}
+  */
+  quinticIn: function (k) {
+    return k * k * k * k * k;
+  },
+
+  /**
+  * @param {number} k
+  * @return {number}
+  */
+  quinticOut: function (k) {
+    return --k * k * k * k * k + 1;
+  },
+
+  /**
+  * @param {number} k
+  * @return {number}
+  */
+  quinticInOut: function (k) {
+    if ((k *= 2) < 1) {
+      return 0.5 * k * k * k * k * k;
+    }
+
+    return 0.5 * ((k -= 2) * k * k * k * k + 2);
+  },
+  // 姝e鸡鏇茬嚎鐨勭紦鍔紙sin(t)锛�
+
+  /**
+  * @param {number} k
+  * @return {number}
+  */
+  sinusoidalIn: function (k) {
+    return 1 - Math.cos(k * Math.PI / 2);
+  },
+
+  /**
+  * @param {number} k
+  * @return {number}
+  */
+  sinusoidalOut: function (k) {
+    return Math.sin(k * Math.PI / 2);
+  },
+
+  /**
+  * @param {number} k
+  * @return {number}
+  */
+  sinusoidalInOut: function (k) {
+    return 0.5 * (1 - Math.cos(Math.PI * k));
+  },
+  // 鎸囨暟鏇茬嚎鐨勭紦鍔紙2^t锛�
+
+  /**
+  * @param {number} k
+  * @return {number}
+  */
+  exponentialIn: function (k) {
+    return k === 0 ? 0 : Math.pow(1024, k - 1);
+  },
+
+  /**
+  * @param {number} k
+  * @return {number}
+  */
+  exponentialOut: function (k) {
+    return k === 1 ? 1 : 1 - Math.pow(2, -10 * k);
+  },
+
+  /**
+  * @param {number} k
+  * @return {number}
+  */
+  exponentialInOut: function (k) {
+    if (k === 0) {
+      return 0;
+    }
+
+    if (k === 1) {
+      return 1;
+    }
+
+    if ((k *= 2) < 1) {
+      return 0.5 * Math.pow(1024, k - 1);
+    }
+
+    return 0.5 * (-Math.pow(2, -10 * (k - 1)) + 2);
+  },
+  // 鍦嗗舰鏇茬嚎鐨勭紦鍔紙sqrt(1-t^2)锛�
+
+  /**
+  * @param {number} k
+  * @return {number}
+  */
+  circularIn: function (k) {
+    return 1 - Math.sqrt(1 - k * k);
+  },
+
+  /**
+  * @param {number} k
+  * @return {number}
+  */
+  circularOut: function (k) {
+    return Math.sqrt(1 - --k * k);
+  },
+
+  /**
+  * @param {number} k
+  * @return {number}
+  */
+  circularInOut: function (k) {
+    if ((k *= 2) < 1) {
+      return -0.5 * (Math.sqrt(1 - k * k) - 1);
+    }
+
+    return 0.5 * (Math.sqrt(1 - (k -= 2) * k) + 1);
+  },
+  // 鍒涘缓绫讳技浜庡脊绨у湪鍋滄鍓嶆潵鍥炴尟鑽$殑鍔ㄧ敾
+
+  /**
+  * @param {number} k
+  * @return {number}
+  */
+  elasticIn: function (k) {
+    var s;
+    var a = 0.1;
+    var p = 0.4;
+
+    if (k === 0) {
+      return 0;
+    }
+
+    if (k === 1) {
+      return 1;
+    }
+
+    if (!a || a < 1) {
+      a = 1;
+      s = p / 4;
+    } else {
+      s = p * Math.asin(1 / a) / (2 * Math.PI);
+    }
+
+    return -(a * Math.pow(2, 10 * (k -= 1)) * Math.sin((k - s) * (2 * Math.PI) / p));
+  },
+
+  /**
+  * @param {number} k
+  * @return {number}
+  */
+  elasticOut: function (k) {
+    var s;
+    var a = 0.1;
+    var p = 0.4;
+
+    if (k === 0) {
+      return 0;
+    }
+
+    if (k === 1) {
+      return 1;
+    }
+
+    if (!a || a < 1) {
+      a = 1;
+      s = p / 4;
+    } else {
+      s = p * Math.asin(1 / a) / (2 * Math.PI);
+    }
+
+    return a * Math.pow(2, -10 * k) * Math.sin((k - s) * (2 * Math.PI) / p) + 1;
+  },
+
+  /**
+  * @param {number} k
+  * @return {number}
+  */
+  elasticInOut: function (k) {
+    var s;
+    var a = 0.1;
+    var p = 0.4;
+
+    if (k === 0) {
+      return 0;
+    }
+
+    if (k === 1) {
+      return 1;
+    }
+
+    if (!a || a < 1) {
+      a = 1;
+      s = p / 4;
+    } else {
+      s = p * Math.asin(1 / a) / (2 * Math.PI);
+    }
+
+    if ((k *= 2) < 1) {
+      return -0.5 * (a * Math.pow(2, 10 * (k -= 1)) * Math.sin((k - s) * (2 * Math.PI) / p));
+    }
+
+    return a * Math.pow(2, -10 * (k -= 1)) * Math.sin((k - s) * (2 * Math.PI) / p) * 0.5 + 1;
+  },
+  // 鍦ㄦ煇涓�鍔ㄧ敾寮�濮嬫部鎸囩ず鐨勮矾寰勮繘琛屽姩鐢诲鐞嗗墠绋嶇◢鏀跺洖璇ュ姩鐢荤殑绉诲姩
+
+  /**
+  * @param {number} k
+  * @return {number}
+  */
+  backIn: function (k) {
+    var s = 1.70158;
+    return k * k * ((s + 1) * k - s);
+  },
+
+  /**
+  * @param {number} k
+  * @return {number}
+  */
+  backOut: function (k) {
+    var s = 1.70158;
+    return --k * k * ((s + 1) * k + s) + 1;
+  },
+
+  /**
+  * @param {number} k
+  * @return {number}
+  */
+  backInOut: function (k) {
+    var s = 1.70158 * 1.525;
+
+    if ((k *= 2) < 1) {
+      return 0.5 * (k * k * ((s + 1) * k - s));
+    }
+
+    return 0.5 * ((k -= 2) * k * ((s + 1) * k + s) + 2);
+  },
+  // 鍒涘缓寮硅烦鏁堟灉
+
+  /**
+  * @param {number} k
+  * @return {number}
+  */
+  bounceIn: function (k) {
+    return 1 - easing.bounceOut(1 - k);
+  },
+
+  /**
+  * @param {number} k
+  * @return {number}
+  */
+  bounceOut: function (k) {
+    if (k < 1 / 2.75) {
+      return 7.5625 * k * k;
+    } else if (k < 2 / 2.75) {
+      return 7.5625 * (k -= 1.5 / 2.75) * k + 0.75;
+    } else if (k < 2.5 / 2.75) {
+      return 7.5625 * (k -= 2.25 / 2.75) * k + 0.9375;
+    } else {
+      return 7.5625 * (k -= 2.625 / 2.75) * k + 0.984375;
+    }
+  },
+
+  /**
+  * @param {number} k
+  * @return {number}
+  */
+  bounceInOut: function (k) {
+    if (k < 0.5) {
+      return easing.bounceIn(k * 2) * 0.5;
+    }
+
+    return easing.bounceOut(k * 2 - 1) * 0.5 + 0.5;
+  }
+};
+
+/**
+ * 鍔ㄧ敾涓绘帶鍒跺櫒
+ * @config target 鍔ㄧ敾瀵硅薄锛屽彲浠ユ槸鏁扮粍锛屽鏋滄槸鏁扮粍鐨勮瘽浼氭壒閲忓垎鍙憃nframe绛変簨浠�
+ * @config life(1000) 鍔ㄧ敾鏃堕暱
+ * @config delay(0) 鍔ㄧ敾寤惰繜鏃堕棿
+ * @config loop(true)
+ * @config gap(0) 寰幆鐨勯棿闅旀椂闂�
+ * @config onframe
+ * @config easing(optional)
+ * @config ondestroy(optional)
+ * @config onrestart(optional)
+ *
+ * TODO pause
+ */
+function Clip(options) {
+  this._target = options.target; // 鐢熷懡鍛ㄦ湡
+
+  this._life = options.life || 1000; // 寤舵椂
+
+  this._delay = options.delay || 0; // 寮�濮嬫椂闂�
+  // this._startTime = new Date().getTime() + this._delay;// 鍗曚綅姣
+
+  this._initialized = false; // 鏄惁寰幆
+
+  this.loop = options.loop == null ? false : options.loop;
+  this.gap = options.gap || 0;
+  this.easing = options.easing || 'Linear';
+  this.onframe = options.onframe;
+  this.ondestroy = options.ondestroy;
+  this.onrestart = options.onrestart;
+  this._pausedTime = 0;
+  this._paused = false;
+}
+
+Clip.prototype = {
+  constructor: Clip,
+  step: function (globalTime, deltaTime) {
+    // Set startTime on first step, or _startTime may has milleseconds different between clips
+    // PENDING
+    if (!this._initialized) {
+      this._startTime = globalTime + this._delay;
+      this._initialized = true;
+    }
+
+    if (this._paused) {
+      this._pausedTime += deltaTime;
+      return;
+    }
+
+    var percent = (globalTime - this._startTime - this._pausedTime) / this._life; // 杩樻病寮�濮�
+
+    if (percent < 0) {
+      return;
+    }
+
+    percent = Math.min(percent, 1);
+    var easing$$1 = this.easing;
+    var easingFunc = typeof easing$$1 == 'string' ? easing[easing$$1] : easing$$1;
+    var schedule = typeof easingFunc === 'function' ? easingFunc(percent) : percent;
+    this.fire('frame', schedule); // 缁撴潫
+
+    if (percent == 1) {
+      if (this.loop) {
+        this.restart(globalTime); // 閲嶆柊寮�濮嬪懆鏈�
+        // 鎶涘嚭鑰屼笉鏄洿鎺ヨ皟鐢ㄤ簨浠剁洿鍒� stage.update 鍚庡啀缁熶竴璋冪敤杩欎簺浜嬩欢
+
+        return 'restart';
+      } // 鍔ㄧ敾瀹屾垚灏嗚繖涓帶鍒跺櫒鏍囪瘑涓哄緟鍒犻櫎
+      // 鍦ˋnimation.update涓繘琛屾壒閲忓垹闄�
+
+
+      this._needsRemove = true;
+      return 'destroy';
+    }
+
+    return null;
+  },
+  restart: function (globalTime) {
+    var remainder = (globalTime - this._startTime - this._pausedTime) % this._life;
+    this._startTime = globalTime - remainder + this.gap;
+    this._pausedTime = 0;
+    this._needsRemove = false;
+  },
+  fire: function (eventType, arg) {
+    eventType = 'on' + eventType;
+
+    if (this[eventType]) {
+      this[eventType](this._target, arg);
+    }
+  },
+  pause: function () {
+    this._paused = true;
+  },
+  resume: function () {
+    this._paused = false;
+  }
+};
+
+// Simple LRU cache use doubly linked list
+// @module zrender/core/LRU
+
+/**
+ * Simple double linked list. Compared with array, it has O(1) remove operation.
+ * @constructor
+ */
+var LinkedList = function () {
+  /**
+   * @type {module:zrender/core/LRU~Entry}
+   */
+  this.head = null;
+  /**
+   * @type {module:zrender/core/LRU~Entry}
+   */
+
+  this.tail = null;
+  this._len = 0;
+};
+
+var linkedListProto = LinkedList.prototype;
+/**
+ * Insert a new value at the tail
+ * @param  {} val
+ * @return {module:zrender/core/LRU~Entry}
+ */
+
+linkedListProto.insert = function (val) {
+  var entry = new Entry(val);
+  this.insertEntry(entry);
+  return entry;
+};
+/**
+ * Insert an entry at the tail
+ * @param  {module:zrender/core/LRU~Entry} entry
+ */
+
+
+linkedListProto.insertEntry = function (entry) {
+  if (!this.head) {
+    this.head = this.tail = entry;
+  } else {
+    this.tail.next = entry;
+    entry.prev = this.tail;
+    entry.next = null;
+    this.tail = entry;
+  }
+
+  this._len++;
+};
+/**
+ * Remove entry.
+ * @param  {module:zrender/core/LRU~Entry} entry
+ */
+
+
+linkedListProto.remove = function (entry) {
+  var prev = entry.prev;
+  var next = entry.next;
+
+  if (prev) {
+    prev.next = next;
+  } else {
+    // Is head
+    this.head = next;
+  }
+
+  if (next) {
+    next.prev = prev;
+  } else {
+    // Is tail
+    this.tail = prev;
+  }
+
+  entry.next = entry.prev = null;
+  this._len--;
+};
+/**
+ * @return {number}
+ */
+
+
+linkedListProto.len = function () {
+  return this._len;
+};
+/**
+ * Clear list
+ */
+
+
+linkedListProto.clear = function () {
+  this.head = this.tail = null;
+  this._len = 0;
+};
+/**
+ * @constructor
+ * @param {} val
+ */
+
+
+var Entry = function (val) {
+  /**
+   * @type {}
+   */
+  this.value = val;
+  /**
+   * @type {module:zrender/core/LRU~Entry}
+   */
+
+  this.next;
+  /**
+   * @type {module:zrender/core/LRU~Entry}
+   */
+
+  this.prev;
+};
+/**
+ * LRU Cache
+ * @constructor
+ * @alias module:zrender/core/LRU
+ */
+
+
+var LRU = function (maxSize) {
+  this._list = new LinkedList();
+  this._map = {};
+  this._maxSize = maxSize || 10;
+  this._lastRemovedEntry = null;
+};
+
+var LRUProto = LRU.prototype;
+/**
+ * @param  {string} key
+ * @param  {} value
+ * @return {} Removed value
+ */
+
+LRUProto.put = function (key, value) {
+  var list = this._list;
+  var map = this._map;
+  var removed = null;
+
+  if (map[key] == null) {
+    var len = list.len(); // Reuse last removed entry
+
+    var entry = this._lastRemovedEntry;
+
+    if (len >= this._maxSize && len > 0) {
+      // Remove the least recently used
+      var leastUsedEntry = list.head;
+      list.remove(leastUsedEntry);
+      delete map[leastUsedEntry.key];
+      removed = leastUsedEntry.value;
+      this._lastRemovedEntry = leastUsedEntry;
+    }
+
+    if (entry) {
+      entry.value = value;
+    } else {
+      entry = new Entry(value);
+    }
+
+    entry.key = key;
+    list.insertEntry(entry);
+    map[key] = entry;
+  }
+
+  return removed;
+};
+/**
+ * @param  {string} key
+ * @return {}
+ */
+
+
+LRUProto.get = function (key) {
+  var entry = this._map[key];
+  var list = this._list;
+
+  if (entry != null) {
+    // Put the latest used entry in the tail
+    if (entry !== list.tail) {
+      list.remove(entry);
+      list.insertEntry(entry);
+    }
+
+    return entry.value;
+  }
+};
+/**
+ * Clear the cache
+ */
+
+
+LRUProto.clear = function () {
+  this._list.clear();
+
+  this._map = {};
+};
+
+var kCSSColorTable = {
+  'transparent': [0, 0, 0, 0],
+  'aliceblue': [240, 248, 255, 1],
+  'antiquewhite': [250, 235, 215, 1],
+  'aqua': [0, 255, 255, 1],
+  'aquamarine': [127, 255, 212, 1],
+  'azure': [240, 255, 255, 1],
+  'beige': [245, 245, 220, 1],
+  'bisque': [255, 228, 196, 1],
+  'black': [0, 0, 0, 1],
+  'blanchedalmond': [255, 235, 205, 1],
+  'blue': [0, 0, 255, 1],
+  'blueviolet': [138, 43, 226, 1],
+  'brown': [165, 42, 42, 1],
+  'burlywood': [222, 184, 135, 1],
+  'cadetblue': [95, 158, 160, 1],
+  'chartreuse': [127, 255, 0, 1],
+  'chocolate': [210, 105, 30, 1],
+  'coral': [255, 127, 80, 1],
+  'cornflowerblue': [100, 149, 237, 1],
+  'cornsilk': [255, 248, 220, 1],
+  'crimson': [220, 20, 60, 1],
+  'cyan': [0, 255, 255, 1],
+  'darkblue': [0, 0, 139, 1],
+  'darkcyan': [0, 139, 139, 1],
+  'darkgoldenrod': [184, 134, 11, 1],
+  'darkgray': [169, 169, 169, 1],
+  'darkgreen': [0, 100, 0, 1],
+  'darkgrey': [169, 169, 169, 1],
+  'darkkhaki': [189, 183, 107, 1],
+  'darkmagenta': [139, 0, 139, 1],
+  'darkolivegreen': [85, 107, 47, 1],
+  'darkorange': [255, 140, 0, 1],
+  'darkorchid': [153, 50, 204, 1],
+  'darkred': [139, 0, 0, 1],
+  'darksalmon': [233, 150, 122, 1],
+  'darkseagreen': [143, 188, 143, 1],
+  'darkslateblue': [72, 61, 139, 1],
+  'darkslategray': [47, 79, 79, 1],
+  'darkslategrey': [47, 79, 79, 1],
+  'darkturquoise': [0, 206, 209, 1],
+  'darkviolet': [148, 0, 211, 1],
+  'deeppink': [255, 20, 147, 1],
+  'deepskyblue': [0, 191, 255, 1],
+  'dimgray': [105, 105, 105, 1],
+  'dimgrey': [105, 105, 105, 1],
+  'dodgerblue': [30, 144, 255, 1],
+  'firebrick': [178, 34, 34, 1],
+  'floralwhite': [255, 250, 240, 1],
+  'forestgreen': [34, 139, 34, 1],
+  'fuchsia': [255, 0, 255, 1],
+  'gainsboro': [220, 220, 220, 1],
+  'ghostwhite': [248, 248, 255, 1],
+  'gold': [255, 215, 0, 1],
+  'goldenrod': [218, 165, 32, 1],
+  'gray': [128, 128, 128, 1],
+  'green': [0, 128, 0, 1],
+  'greenyellow': [173, 255, 47, 1],
+  'grey': [128, 128, 128, 1],
+  'honeydew': [240, 255, 240, 1],
+  'hotpink': [255, 105, 180, 1],
+  'indianred': [205, 92, 92, 1],
+  'indigo': [75, 0, 130, 1],
+  'ivory': [255, 255, 240, 1],
+  'khaki': [240, 230, 140, 1],
+  'lavender': [230, 230, 250, 1],
+  'lavenderblush': [255, 240, 245, 1],
+  'lawngreen': [124, 252, 0, 1],
+  'lemonchiffon': [255, 250, 205, 1],
+  'lightblue': [173, 216, 230, 1],
+  'lightcoral': [240, 128, 128, 1],
+  'lightcyan': [224, 255, 255, 1],
+  'lightgoldenrodyellow': [250, 250, 210, 1],
+  'lightgray': [211, 211, 211, 1],
+  'lightgreen': [144, 238, 144, 1],
+  'lightgrey': [211, 211, 211, 1],
+  'lightpink': [255, 182, 193, 1],
+  'lightsalmon': [255, 160, 122, 1],
+  'lightseagreen': [32, 178, 170, 1],
+  'lightskyblue': [135, 206, 250, 1],
+  'lightslategray': [119, 136, 153, 1],
+  'lightslategrey': [119, 136, 153, 1],
+  'lightsteelblue': [176, 196, 222, 1],
+  'lightyellow': [255, 255, 224, 1],
+  'lime': [0, 255, 0, 1],
+  'limegreen': [50, 205, 50, 1],
+  'linen': [250, 240, 230, 1],
+  'magenta': [255, 0, 255, 1],
+  'maroon': [128, 0, 0, 1],
+  'mediumaquamarine': [102, 205, 170, 1],
+  'mediumblue': [0, 0, 205, 1],
+  'mediumorchid': [186, 85, 211, 1],
+  'mediumpurple': [147, 112, 219, 1],
+  'mediumseagreen': [60, 179, 113, 1],
+  'mediumslateblue': [123, 104, 238, 1],
+  'mediumspringgreen': [0, 250, 154, 1],
+  'mediumturquoise': [72, 209, 204, 1],
+  'mediumvioletred': [199, 21, 133, 1],
+  'midnightblue': [25, 25, 112, 1],
+  'mintcream': [245, 255, 250, 1],
+  'mistyrose': [255, 228, 225, 1],
+  'moccasin': [255, 228, 181, 1],
+  'navajowhite': [255, 222, 173, 1],
+  'navy': [0, 0, 128, 1],
+  'oldlace': [253, 245, 230, 1],
+  'olive': [128, 128, 0, 1],
+  'olivedrab': [107, 142, 35, 1],
+  'orange': [255, 165, 0, 1],
+  'orangered': [255, 69, 0, 1],
+  'orchid': [218, 112, 214, 1],
+  'palegoldenrod': [238, 232, 170, 1],
+  'palegreen': [152, 251, 152, 1],
+  'paleturquoise': [175, 238, 238, 1],
+  'palevioletred': [219, 112, 147, 1],
+  'papayawhip': [255, 239, 213, 1],
+  'peachpuff': [255, 218, 185, 1],
+  'peru': [205, 133, 63, 1],
+  'pink': [255, 192, 203, 1],
+  'plum': [221, 160, 221, 1],
+  'powderblue': [176, 224, 230, 1],
+  'purple': [128, 0, 128, 1],
+  'red': [255, 0, 0, 1],
+  'rosybrown': [188, 143, 143, 1],
+  'royalblue': [65, 105, 225, 1],
+  'saddlebrown': [139, 69, 19, 1],
+  'salmon': [250, 128, 114, 1],
+  'sandybrown': [244, 164, 96, 1],
+  'seagreen': [46, 139, 87, 1],
+  'seashell': [255, 245, 238, 1],
+  'sienna': [160, 82, 45, 1],
+  'silver': [192, 192, 192, 1],
+  'skyblue': [135, 206, 235, 1],
+  'slateblue': [106, 90, 205, 1],
+  'slategray': [112, 128, 144, 1],
+  'slategrey': [112, 128, 144, 1],
+  'snow': [255, 250, 250, 1],
+  'springgreen': [0, 255, 127, 1],
+  'steelblue': [70, 130, 180, 1],
+  'tan': [210, 180, 140, 1],
+  'teal': [0, 128, 128, 1],
+  'thistle': [216, 191, 216, 1],
+  'tomato': [255, 99, 71, 1],
+  'turquoise': [64, 224, 208, 1],
+  'violet': [238, 130, 238, 1],
+  'wheat': [245, 222, 179, 1],
+  'white': [255, 255, 255, 1],
+  'whitesmoke': [245, 245, 245, 1],
+  'yellow': [255, 255, 0, 1],
+  'yellowgreen': [154, 205, 50, 1]
+};
+
+function clampCssByte(i) {
+  // Clamp to integer 0 .. 255.
+  i = Math.round(i); // Seems to be what Chrome does (vs truncation).
+
+  return i < 0 ? 0 : i > 255 ? 255 : i;
+}
+
+function clampCssAngle(i) {
+  // Clamp to integer 0 .. 360.
+  i = Math.round(i); // Seems to be what Chrome does (vs truncation).
+
+  return i < 0 ? 0 : i > 360 ? 360 : i;
+}
+
+function clampCssFloat(f) {
+  // Clamp to float 0.0 .. 1.0.
+  return f < 0 ? 0 : f > 1 ? 1 : f;
+}
+
+function parseCssInt(str) {
+  // int or percentage.
+  if (str.length && str.charAt(str.length - 1) === '%') {
+    return clampCssByte(parseFloat(str) / 100 * 255);
+  }
+
+  return clampCssByte(parseInt(str, 10));
+}
+
+function parseCssFloat(str) {
+  // float or percentage.
+  if (str.length && str.charAt(str.length - 1) === '%') {
+    return clampCssFloat(parseFloat(str) / 100);
+  }
+
+  return clampCssFloat(parseFloat(str));
+}
+
+function cssHueToRgb(m1, m2, h) {
+  if (h < 0) {
+    h += 1;
+  } else if (h > 1) {
+    h -= 1;
+  }
+
+  if (h * 6 < 1) {
+    return m1 + (m2 - m1) * h * 6;
+  }
+
+  if (h * 2 < 1) {
+    return m2;
+  }
+
+  if (h * 3 < 2) {
+    return m1 + (m2 - m1) * (2 / 3 - h) * 6;
+  }
+
+  return m1;
+}
+
+function lerpNumber(a, b, p) {
+  return a + (b - a) * p;
+}
+
+function setRgba(out, r, g, b, a) {
+  out[0] = r;
+  out[1] = g;
+  out[2] = b;
+  out[3] = a;
+  return out;
+}
+
+function copyRgba(out, a) {
+  out[0] = a[0];
+  out[1] = a[1];
+  out[2] = a[2];
+  out[3] = a[3];
+  return out;
+}
+
+var colorCache = new LRU(20);
+var lastRemovedArr = null;
+
+function putToCache(colorStr, rgbaArr) {
+  // Reuse removed array
+  if (lastRemovedArr) {
+    copyRgba(lastRemovedArr, rgbaArr);
+  }
+
+  lastRemovedArr = colorCache.put(colorStr, lastRemovedArr || rgbaArr.slice());
+}
+/**
+ * @param {string} colorStr
+ * @param {Array.<number>} out
+ * @return {Array.<number>}
+ * @memberOf module:zrender/util/color
+ */
+
+
+function parse(colorStr, rgbaArr) {
+  if (!colorStr) {
+    return;
+  }
+
+  rgbaArr = rgbaArr || [];
+  var cached = colorCache.get(colorStr);
+
+  if (cached) {
+    return copyRgba(rgbaArr, cached);
+  } // colorStr may be not string
+
+
+  colorStr = colorStr + ''; // Remove all whitespace, not compliant, but should just be more accepting.
+
+  var str = colorStr.replace(/ /g, '').toLowerCase(); // Color keywords (and transparent) lookup.
+
+  if (str in kCSSColorTable) {
+    copyRgba(rgbaArr, kCSSColorTable[str]);
+    putToCache(colorStr, rgbaArr);
+    return rgbaArr;
+  } // #abc and #abc123 syntax.
+
+
+  if (str.charAt(0) === '#') {
+    if (str.length === 4) {
+      var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing.
+
+      if (!(iv >= 0 && iv <= 0xfff)) {
+        setRgba(rgbaArr, 0, 0, 0, 1);
+        return; // Covers NaN.
+      }
+
+      setRgba(rgbaArr, (iv & 0xf00) >> 4 | (iv & 0xf00) >> 8, iv & 0xf0 | (iv & 0xf0) >> 4, iv & 0xf | (iv & 0xf) << 4, 1);
+      putToCache(colorStr, rgbaArr);
+      return rgbaArr;
+    } else if (str.length === 7) {
+      var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing.
+
+      if (!(iv >= 0 && iv <= 0xffffff)) {
+        setRgba(rgbaArr, 0, 0, 0, 1);
+        return; // Covers NaN.
+      }
+
+      setRgba(rgbaArr, (iv & 0xff0000) >> 16, (iv & 0xff00) >> 8, iv & 0xff, 1);
+      putToCache(colorStr, rgbaArr);
+      return rgbaArr;
+    }
+
+    return;
+  }
+
+  var op = str.indexOf('('),
+      ep = str.indexOf(')');
+
+  if (op !== -1 && ep + 1 === str.length) {
+    var fname = str.substr(0, op);
+    var params = str.substr(op + 1, ep - (op + 1)).split(',');
+    var alpha = 1; // To allow case fallthrough.
+
+    switch (fname) {
+      case 'rgba':
+        if (params.length !== 4) {
+          setRgba(rgbaArr, 0, 0, 0, 1);
+          return;
+        }
+
+        alpha = parseCssFloat(params.pop());
+      // jshint ignore:line
+      // Fall through.
+
+      case 'rgb':
+        if (params.length !== 3) {
+          setRgba(rgbaArr, 0, 0, 0, 1);
+          return;
+        }
+
+        setRgba(rgbaArr, parseCssInt(params[0]), parseCssInt(params[1]), parseCssInt(params[2]), alpha);
+        putToCache(colorStr, rgbaArr);
+        return rgbaArr;
+
+      case 'hsla':
+        if (params.length !== 4) {
+          setRgba(rgbaArr, 0, 0, 0, 1);
+          return;
+        }
+
+        params[3] = parseCssFloat(params[3]);
+        hsla2rgba(params, rgbaArr);
+        putToCache(colorStr, rgbaArr);
+        return rgbaArr;
+
+      case 'hsl':
+        if (params.length !== 3) {
+          setRgba(rgbaArr, 0, 0, 0, 1);
+          return;
+        }
+
+        hsla2rgba(params, rgbaArr);
+        putToCache(colorStr, rgbaArr);
+        return rgbaArr;
+
+      default:
+        return;
+    }
+  }
+
+  setRgba(rgbaArr, 0, 0, 0, 1);
+  return;
+}
+/**
+ * @param {Array.<number>} hsla
+ * @param {Array.<number>} rgba
+ * @return {Array.<number>} rgba
+ */
+
+function hsla2rgba(hsla, rgba) {
+  var h = (parseFloat(hsla[0]) % 360 + 360) % 360 / 360; // 0 .. 1
+  // NOTE(deanm): According to the CSS spec s/l should only be
+  // percentages, but we don't bother and let float or percentage.
+
+  var s = parseCssFloat(hsla[1]);
+  var l = parseCssFloat(hsla[2]);
+  var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;
+  var m1 = l * 2 - m2;
+  rgba = rgba || [];
+  setRgba(rgba, clampCssByte(cssHueToRgb(m1, m2, h + 1 / 3) * 255), clampCssByte(cssHueToRgb(m1, m2, h) * 255), clampCssByte(cssHueToRgb(m1, m2, h - 1 / 3) * 255), 1);
+
+  if (hsla.length === 4) {
+    rgba[3] = hsla[3];
+  }
+
+  return rgba;
+}
+/**
+ * @param {Array.<number>} rgba
+ * @return {Array.<number>} hsla
+ */
+
+
+function rgba2hsla(rgba) {
+  if (!rgba) {
+    return;
+  } // RGB from 0 to 255
+
+
+  var R = rgba[0] / 255;
+  var G = rgba[1] / 255;
+  var B = rgba[2] / 255;
+  var vMin = Math.min(R, G, B); // Min. value of RGB
+
+  var vMax = Math.max(R, G, B); // Max. value of RGB
+
+  var delta = vMax - vMin; // Delta RGB value
+
+  var L = (vMax + vMin) / 2;
+  var H;
+  var S; // HSL results from 0 to 1
+
+  if (delta === 0) {
+    H = 0;
+    S = 0;
+  } else {
+    if (L < 0.5) {
+      S = delta / (vMax + vMin);
+    } else {
+      S = delta / (2 - vMax - vMin);
+    }
+
+    var deltaR = ((vMax - R) / 6 + delta / 2) / delta;
+    var deltaG = ((vMax - G) / 6 + delta / 2) / delta;
+    var deltaB = ((vMax - B) / 6 + delta / 2) / delta;
+
+    if (R === vMax) {
+      H = deltaB - deltaG;
+    } else if (G === vMax) {
+      H = 1 / 3 + deltaR - deltaB;
+    } else if (B === vMax) {
+      H = 2 / 3 + deltaG - deltaR;
+    }
+
+    if (H < 0) {
+      H += 1;
+    }
+
+    if (H > 1) {
+      H -= 1;
+    }
+  }
+
+  var hsla = [H * 360, S, L];
+
+  if (rgba[3] != null) {
+    hsla.push(rgba[3]);
+  }
+
+  return hsla;
+}
+/**
+ * @param {string} color
+ * @param {number} level
+ * @return {string}
+ * @memberOf module:zrender/util/color
+ */
+
+
+function lift(color, level) {
+  var colorArr = parse(color);
+
+  if (colorArr) {
+    for (var i = 0; i < 3; i++) {
+      if (level < 0) {
+        colorArr[i] = colorArr[i] * (1 - level) | 0;
+      } else {
+        colorArr[i] = (255 - colorArr[i]) * level + colorArr[i] | 0;
+      }
+
+      if (colorArr[i] > 255) {
+        colorArr[i] = 255;
+      } else if (color[i] < 0) {
+        colorArr[i] = 0;
+      }
+    }
+
+    return stringify(colorArr, colorArr.length === 4 ? 'rgba' : 'rgb');
+  }
+}
+/**
+ * @param {string} color
+ * @return {string}
+ * @memberOf module:zrender/util/color
+ */
+
+function toHex(color) {
+  var colorArr = parse(color);
+
+  if (colorArr) {
+    return ((1 << 24) + (colorArr[0] << 16) + (colorArr[1] << 8) + +colorArr[2]).toString(16).slice(1);
+  }
+}
+/**
+ * Map value to color. Faster than lerp methods because color is represented by rgba array.
+ * @param {number} normalizedValue A float between 0 and 1.
+ * @param {Array.<Array.<number>>} colors List of rgba color array
+ * @param {Array.<number>} [out] Mapped gba color array
+ * @return {Array.<number>} will be null/undefined if input illegal.
+ */
+
+function fastLerp(normalizedValue, colors, out) {
+  if (!(colors && colors.length) || !(normalizedValue >= 0 && normalizedValue <= 1)) {
+    return;
+  }
+
+  out = out || [];
+  var value = normalizedValue * (colors.length - 1);
+  var leftIndex = Math.floor(value);
+  var rightIndex = Math.ceil(value);
+  var leftColor = colors[leftIndex];
+  var rightColor = colors[rightIndex];
+  var dv = value - leftIndex;
+  out[0] = clampCssByte(lerpNumber(leftColor[0], rightColor[0], dv));
+  out[1] = clampCssByte(lerpNumber(leftColor[1], rightColor[1], dv));
+  out[2] = clampCssByte(lerpNumber(leftColor[2], rightColor[2], dv));
+  out[3] = clampCssFloat(lerpNumber(leftColor[3], rightColor[3], dv));
+  return out;
+}
+/**
+ * @deprecated
+ */
+
+var fastMapToColor = fastLerp;
+/**
+ * @param {number} normalizedValue A float between 0 and 1.
+ * @param {Array.<string>} colors Color list.
+ * @param {boolean=} fullOutput Default false.
+ * @return {(string|Object)} Result color. If fullOutput,
+ *                           return {color: ..., leftIndex: ..., rightIndex: ..., value: ...},
+ * @memberOf module:zrender/util/color
+ */
+
+function lerp$1(normalizedValue, colors, fullOutput) {
+  if (!(colors && colors.length) || !(normalizedValue >= 0 && normalizedValue <= 1)) {
+    return;
+  }
+
+  var value = normalizedValue * (colors.length - 1);
+  var leftIndex = Math.floor(value);
+  var rightIndex = Math.ceil(value);
+  var leftColor = parse(colors[leftIndex]);
+  var rightColor = parse(colors[rightIndex]);
+  var dv = value - leftIndex;
+  var color = stringify([clampCssByte(lerpNumber(leftColor[0], rightColor[0], dv)), clampCssByte(lerpNumber(leftColor[1], rightColor[1], dv)), clampCssByte(lerpNumber(leftColor[2], rightColor[2], dv)), clampCssFloat(lerpNumber(leftColor[3], rightColor[3], dv))], 'rgba');
+  return fullOutput ? {
+    color: color,
+    leftIndex: leftIndex,
+    rightIndex: rightIndex,
+    value: value
+  } : color;
+}
+/**
+ * @deprecated
+ */
+
+var mapToColor = lerp$1;
+/**
+ * @param {string} color
+ * @param {number=} h 0 ~ 360, ignore when null.
+ * @param {number=} s 0 ~ 1, ignore when null.
+ * @param {number=} l 0 ~ 1, ignore when null.
+ * @return {string} Color string in rgba format.
+ * @memberOf module:zrender/util/color
+ */
+
+function modifyHSL(color, h, s, l) {
+  color = parse(color);
+
+  if (color) {
+    color = rgba2hsla(color);
+    h != null && (color[0] = clampCssAngle(h));
+    s != null && (color[1] = parseCssFloat(s));
+    l != null && (color[2] = parseCssFloat(l));
+    return stringify(hsla2rgba(color), 'rgba');
+  }
+}
+/**
+ * @param {string} color
+ * @param {number=} alpha 0 ~ 1
+ * @return {string} Color string in rgba format.
+ * @memberOf module:zrender/util/color
+ */
+
+function modifyAlpha(color, alpha) {
+  color = parse(color);
+
+  if (color && alpha != null) {
+    color[3] = clampCssFloat(alpha);
+    return stringify(color, 'rgba');
+  }
+}
+/**
+ * @param {Array.<number>} arrColor like [12,33,44,0.4]
+ * @param {string} type 'rgba', 'hsva', ...
+ * @return {string} Result color. (If input illegal, return undefined).
+ */
+
+function stringify(arrColor, type) {
+  if (!arrColor || !arrColor.length) {
+    return;
+  }
+
+  var colorStr = arrColor[0] + ',' + arrColor[1] + ',' + arrColor[2];
+
+  if (type === 'rgba' || type === 'hsva' || type === 'hsla') {
+    colorStr += ',' + arrColor[3];
+  }
+
+  return type + '(' + colorStr + ')';
+}
+
+var color = (Object.freeze || Object)({
+	parse: parse,
+	lift: lift,
+	toHex: toHex,
+	fastLerp: fastLerp,
+	fastMapToColor: fastMapToColor,
+	lerp: lerp$1,
+	mapToColor: mapToColor,
+	modifyHSL: modifyHSL,
+	modifyAlpha: modifyAlpha,
+	stringify: stringify
+});
+
+/**
+ * @module echarts/animation/Animator
+ */
+var arraySlice = Array.prototype.slice;
+
+function defaultGetter(target, key) {
+  return target[key];
+}
+
+function defaultSetter(target, key, value) {
+  target[key] = value;
+}
+/**
+ * @param  {number} p0
+ * @param  {number} p1
+ * @param  {number} percent
+ * @return {number}
+ */
+
+
+function interpolateNumber(p0, p1, percent) {
+  return (p1 - p0) * percent + p0;
+}
+/**
+ * @param  {string} p0
+ * @param  {string} p1
+ * @param  {number} percent
+ * @return {string}
+ */
+
+
+function interpolateString(p0, p1, percent) {
+  return percent > 0.5 ? p1 : p0;
+}
+/**
+ * @param  {Array} p0
+ * @param  {Array} p1
+ * @param  {number} percent
+ * @param  {Array} out
+ * @param  {number} arrDim
+ */
+
+
+function interpolateArray(p0, p1, percent, out, arrDim) {
+  var len = p0.length;
+
+  if (arrDim == 1) {
+    for (var i = 0; i < len; i++) {
+      out[i] = interpolateNumber(p0[i], p1[i], percent);
+    }
+  } else {
+    var len2 = len && p0[0].length;
+
+    for (var i = 0; i < len; i++) {
+      for (var j = 0; j < len2; j++) {
+        out[i][j] = interpolateNumber(p0[i][j], p1[i][j], percent);
+      }
+    }
+  }
+} // arr0 is source array, arr1 is target array.
+// Do some preprocess to avoid error happened when interpolating from arr0 to arr1
+
+
+function fillArr(arr0, arr1, arrDim) {
+  var arr0Len = arr0.length;
+  var arr1Len = arr1.length;
+
+  if (arr0Len !== arr1Len) {
+    // FIXME Not work for TypedArray
+    var isPreviousLarger = arr0Len > arr1Len;
+
+    if (isPreviousLarger) {
+      // Cut the previous
+      arr0.length = arr1Len;
+    } else {
+      // Fill the previous
+      for (var i = arr0Len; i < arr1Len; i++) {
+        arr0.push(arrDim === 1 ? arr1[i] : arraySlice.call(arr1[i]));
+      }
+    }
+  } // Handling NaN value
+
+
+  var len2 = arr0[0] && arr0[0].length;
+
+  for (var i = 0; i < arr0.length; i++) {
+    if (arrDim === 1) {
+      if (isNaN(arr0[i])) {
+        arr0[i] = arr1[i];
+      }
+    } else {
+      for (var j = 0; j < len2; j++) {
+        if (isNaN(arr0[i][j])) {
+          arr0[i][j] = arr1[i][j];
+        }
+      }
+    }
+  }
+}
+/**
+ * @param  {Array} arr0
+ * @param  {Array} arr1
+ * @param  {number} arrDim
+ * @return {boolean}
+ */
+
+
+function isArraySame(arr0, arr1, arrDim) {
+  if (arr0 === arr1) {
+    return true;
+  }
+
+  var len = arr0.length;
+
+  if (len !== arr1.length) {
+    return false;
+  }
+
+  if (arrDim === 1) {
+    for (var i = 0; i < len; i++) {
+      if (arr0[i] !== arr1[i]) {
+        return false;
+      }
+    }
+  } else {
+    var len2 = arr0[0].length;
+
+    for (var i = 0; i < len; i++) {
+      for (var j = 0; j < len2; j++) {
+        if (arr0[i][j] !== arr1[i][j]) {
+          return false;
+        }
+      }
+    }
+  }
+
+  return true;
+}
+/**
+ * Catmull Rom interpolate array
+ * @param  {Array} p0
+ * @param  {Array} p1
+ * @param  {Array} p2
+ * @param  {Array} p3
+ * @param  {number} t
+ * @param  {number} t2
+ * @param  {number} t3
+ * @param  {Array} out
+ * @param  {number} arrDim
+ */
+
+
+function catmullRomInterpolateArray(p0, p1, p2, p3, t, t2, t3, out, arrDim) {
+  var len = p0.length;
+
+  if (arrDim == 1) {
+    for (var i = 0; i < len; i++) {
+      out[i] = catmullRomInterpolate(p0[i], p1[i], p2[i], p3[i], t, t2, t3);
+    }
+  } else {
+    var len2 = p0[0].length;
+
+    for (var i = 0; i < len; i++) {
+      for (var j = 0; j < len2; j++) {
+        out[i][j] = catmullRomInterpolate(p0[i][j], p1[i][j], p2[i][j], p3[i][j], t, t2, t3);
+      }
+    }
+  }
+}
+/**
+ * Catmull Rom interpolate number
+ * @param  {number} p0
+ * @param  {number} p1
+ * @param  {number} p2
+ * @param  {number} p3
+ * @param  {number} t
+ * @param  {number} t2
+ * @param  {number} t3
+ * @return {number}
+ */
+
+
+function catmullRomInterpolate(p0, p1, p2, p3, t, t2, t3) {
+  var v0 = (p2 - p0) * 0.5;
+  var v1 = (p3 - p1) * 0.5;
+  return (2 * (p1 - p2) + v0 + v1) * t3 + (-3 * (p1 - p2) - 2 * v0 - v1) * t2 + v0 * t + p1;
+}
+
+function cloneValue(value) {
+  if (isArrayLike(value)) {
+    var len = value.length;
+
+    if (isArrayLike(value[0])) {
+      var ret = [];
+
+      for (var i = 0; i < len; i++) {
+        ret.push(arraySlice.call(value[i]));
+      }
+
+      return ret;
+    }
+
+    return arraySlice.call(value);
+  }
+
+  return value;
+}
+
+function rgba2String(rgba) {
+  rgba[0] = Math.floor(rgba[0]);
+  rgba[1] = Math.floor(rgba[1]);
+  rgba[2] = Math.floor(rgba[2]);
+  return 'rgba(' + rgba.join(',') + ')';
+}
+
+function getArrayDim(keyframes) {
+  var lastValue = keyframes[keyframes.length - 1].value;
+  return isArrayLike(lastValue && lastValue[0]) ? 2 : 1;
+}
+
+function createTrackClip(animator, easing, oneTrackDone, keyframes, propName, forceAnimate) {
+  var getter = animator._getter;
+  var setter = animator._setter;
+  var useSpline = easing === 'spline';
+  var trackLen = keyframes.length;
+
+  if (!trackLen) {
+    return;
+  } // Guess data type
+
+
+  var firstVal = keyframes[0].value;
+  var isValueArray = isArrayLike(firstVal);
+  var isValueColor = false;
+  var isValueString = false; // For vertices morphing
+
+  var arrDim = isValueArray ? getArrayDim(keyframes) : 0;
+  var trackMaxTime; // Sort keyframe as ascending
+
+  keyframes.sort(function (a, b) {
+    return a.time - b.time;
+  });
+  trackMaxTime = keyframes[trackLen - 1].time; // Percents of each keyframe
+
+  var kfPercents = []; // Value of each keyframe
+
+  var kfValues = [];
+  var prevValue = keyframes[0].value;
+  var isAllValueEqual = true;
+
+  for (var i = 0; i < trackLen; i++) {
+    kfPercents.push(keyframes[i].time / trackMaxTime); // Assume value is a color when it is a string
+
+    var value = keyframes[i].value; // Check if value is equal, deep check if value is array
+
+    if (!(isValueArray && isArraySame(value, prevValue, arrDim) || !isValueArray && value === prevValue)) {
+      isAllValueEqual = false;
+    }
+
+    prevValue = value; // Try converting a string to a color array
+
+    if (typeof value == 'string') {
+      var colorArray = parse(value);
+
+      if (colorArray) {
+        value = colorArray;
+        isValueColor = true;
+      } else {
+        isValueString = true;
+      }
+    }
+
+    kfValues.push(value);
+  }
+
+  if (!forceAnimate && isAllValueEqual) {
+    return;
+  }
+
+  var lastValue = kfValues[trackLen - 1]; // Polyfill array and NaN value
+
+  for (var i = 0; i < trackLen - 1; i++) {
+    if (isValueArray) {
+      fillArr(kfValues[i], lastValue, arrDim);
+    } else {
+      if (isNaN(kfValues[i]) && !isNaN(lastValue) && !isValueString && !isValueColor) {
+        kfValues[i] = lastValue;
+      }
+    }
+  }
+
+  isValueArray && fillArr(getter(animator._target, propName), lastValue, arrDim); // Cache the key of last frame to speed up when
+  // animation playback is sequency
+
+  var lastFrame = 0;
+  var lastFramePercent = 0;
+  var start;
+  var w;
+  var p0;
+  var p1;
+  var p2;
+  var p3;
+
+  if (isValueColor) {
+    var rgba = [0, 0, 0, 0];
+  }
+
+  var onframe = function (target, percent) {
+    // Find the range keyframes
+    // kf1-----kf2---------current--------kf3
+    // find kf2 and kf3 and do interpolation
+    var frame; // In the easing function like elasticOut, percent may less than 0
+
+    if (percent < 0) {
+      frame = 0;
+    } else if (percent < lastFramePercent) {
+      // Start from next key
+      // PENDING start from lastFrame ?
+      start = Math.min(lastFrame + 1, trackLen - 1);
+
+      for (frame = start; frame >= 0; frame--) {
+        if (kfPercents[frame] <= percent) {
+          break;
+        }
+      } // PENDING really need to do this ?
+
+
+      frame = Math.min(frame, trackLen - 2);
+    } else {
+      for (frame = lastFrame; frame < trackLen; frame++) {
+        if (kfPercents[frame] > percent) {
+          break;
+        }
+      }
+
+      frame = Math.min(frame - 1, trackLen - 2);
+    }
+
+    lastFrame = frame;
+    lastFramePercent = percent;
+    var range = kfPercents[frame + 1] - kfPercents[frame];
+
+    if (range === 0) {
+      return;
+    } else {
+      w = (percent - kfPercents[frame]) / range;
+    }
+
+    if (useSpline) {
+      p1 = kfValues[frame];
+      p0 = kfValues[frame === 0 ? frame : frame - 1];
+      p2 = kfValues[frame > trackLen - 2 ? trackLen - 1 : frame + 1];
+      p3 = kfValues[frame > trackLen - 3 ? trackLen - 1 : frame + 2];
+
+      if (isValueArray) {
+        catmullRomInterpolateArray(p0, p1, p2, p3, w, w * w, w * w * w, getter(target, propName), arrDim);
+      } else {
+        var value;
+
+        if (isValueColor) {
+          value = catmullRomInterpolateArray(p0, p1, p2, p3, w, w * w, w * w * w, rgba, 1);
+          value = rgba2String(rgba);
+        } else if (isValueString) {
+          // String is step(0.5)
+          return interpolateString(p1, p2, w);
+        } else {
+          value = catmullRomInterpolate(p0, p1, p2, p3, w, w * w, w * w * w);
+        }
+
+        setter(target, propName, value);
+      }
+    } else {
+      if (isValueArray) {
+        interpolateArray(kfValues[frame], kfValues[frame + 1], w, getter(target, propName), arrDim);
+      } else {
+        var value;
+
+        if (isValueColor) {
+          interpolateArray(kfValues[frame], kfValues[frame + 1], w, rgba, 1);
+          value = rgba2String(rgba);
+        } else if (isValueString) {
+          // String is step(0.5)
+          return interpolateString(kfValues[frame], kfValues[frame + 1], w);
+        } else {
+          value = interpolateNumber(kfValues[frame], kfValues[frame + 1], w);
+        }
+
+        setter(target, propName, value);
+      }
+    }
+  };
+
+  var clip = new Clip({
+    target: animator._target,
+    life: trackMaxTime,
+    loop: animator._loop,
+    delay: animator._delay,
+    onframe: onframe,
+    ondestroy: oneTrackDone
+  });
+
+  if (easing && easing !== 'spline') {
+    clip.easing = easing;
+  }
+
+  return clip;
+}
+/**
+ * @alias module:zrender/animation/Animator
+ * @constructor
+ * @param {Object} target
+ * @param {boolean} loop
+ * @param {Function} getter
+ * @param {Function} setter
+ */
+
+
+var Animator = function (target, loop, getter, setter) {
+  this._tracks = {};
+  this._target = target;
+  this._loop = loop || false;
+  this._getter = getter || defaultGetter;
+  this._setter = setter || defaultSetter;
+  this._clipCount = 0;
+  this._delay = 0;
+  this._doneList = [];
+  this._onframeList = [];
+  this._clipList = [];
+};
+
+Animator.prototype = {
+  /**
+   * 璁剧疆鍔ㄧ敾鍏抽敭甯�
+   * @param  {number} time 鍏抽敭甯ф椂闂达紝鍗曚綅鏄痬s
+   * @param  {Object} props 鍏抽敭甯х殑灞炴�у�硷紝key-value琛ㄧず
+   * @return {module:zrender/animation/Animator}
+   */
+  when: function (time
+  /* ms */
+  , props) {
+    var tracks = this._tracks;
+
+    for (var propName in props) {
+      if (!props.hasOwnProperty(propName)) {
+        continue;
+      }
+
+      if (!tracks[propName]) {
+        tracks[propName] = []; // Invalid value
+
+        var value = this._getter(this._target, propName);
+
+        if (value == null) {
+          // zrLog('Invalid property ' + propName);
+          continue;
+        } // If time is 0
+        //  Then props is given initialize value
+        // Else
+        //  Initialize value from current prop value
+
+
+        if (time !== 0) {
+          tracks[propName].push({
+            time: 0,
+            value: cloneValue(value)
+          });
+        }
+      }
+
+      tracks[propName].push({
+        time: time,
+        value: props[propName]
+      });
+    }
+
+    return this;
+  },
+
+  /**
+   * 娣诲姞鍔ㄧ敾姣忎竴甯х殑鍥炶皟鍑芥暟
+   * @param  {Function} callback
+   * @return {module:zrender/animation/Animator}
+   */
+  during: function (callback) {
+    this._onframeList.push(callback);
+
+    return this;
+  },
+  pause: function () {
+    for (var i = 0; i < this._clipList.length; i++) {
+      this._clipList[i].pause();
+    }
+
+    this._paused = true;
+  },
+  resume: function () {
+    for (var i = 0; i < this._clipList.length; i++) {
+      this._clipList[i].resume();
+    }
+
+    this._paused = false;
+  },
+  isPaused: function () {
+    return !!this._paused;
+  },
+  _doneCallback: function () {
+    // Clear all tracks
+    this._tracks = {}; // Clear all clips
+
+    this._clipList.length = 0;
+    var doneList = this._doneList;
+    var len = doneList.length;
+
+    for (var i = 0; i < len; i++) {
+      doneList[i].call(this);
+    }
+  },
+
+  /**
+   * 寮�濮嬫墽琛屽姩鐢�
+   * @param  {string|Function} [easing]
+   *         鍔ㄧ敾缂撳姩鍑芥暟锛岃瑙亄@link module:zrender/animation/easing}
+   * @param  {boolean} forceAnimate
+   * @return {module:zrender/animation/Animator}
+   */
+  start: function (easing, forceAnimate) {
+    var self = this;
+    var clipCount = 0;
+
+    var oneTrackDone = function () {
+      clipCount--;
+
+      if (!clipCount) {
+        self._doneCallback();
+      }
+    };
+
+    var lastClip;
+
+    for (var propName in this._tracks) {
+      if (!this._tracks.hasOwnProperty(propName)) {
+        continue;
+      }
+
+      var clip = createTrackClip(this, easing, oneTrackDone, this._tracks[propName], propName, forceAnimate);
+
+      if (clip) {
+        this._clipList.push(clip);
+
+        clipCount++; // If start after added to animation
+
+        if (this.animation) {
+          this.animation.addClip(clip);
+        }
+
+        lastClip = clip;
+      }
+    } // Add during callback on the last clip
+
+
+    if (lastClip) {
+      var oldOnFrame = lastClip.onframe;
+
+      lastClip.onframe = function (target, percent) {
+        oldOnFrame(target, percent);
+
+        for (var i = 0; i < self._onframeList.length; i++) {
+          self._onframeList[i](target, percent);
+        }
+      };
+    } // This optimization will help the case that in the upper application
+    // the view may be refreshed frequently, where animation will be
+    // called repeatly but nothing changed.
+
+
+    if (!clipCount) {
+      this._doneCallback();
+    }
+
+    return this;
+  },
+
+  /**
+   * 鍋滄鍔ㄧ敾
+   * @param {boolean} forwardToLast If move to last frame before stop
+   */
+  stop: function (forwardToLast) {
+    var clipList = this._clipList;
+    var animation = this.animation;
+
+    for (var i = 0; i < clipList.length; i++) {
+      var clip = clipList[i];
+
+      if (forwardToLast) {
+        // Move to last frame before stop
+        clip.onframe(this._target, 1);
+      }
+
+      animation && animation.removeClip(clip);
+    }
+
+    clipList.length = 0;
+  },
+
+  /**
+   * 璁剧疆鍔ㄧ敾寤惰繜寮�濮嬬殑鏃堕棿
+   * @param  {number} time 鍗曚綅ms
+   * @return {module:zrender/animation/Animator}
+   */
+  delay: function (time) {
+    this._delay = time;
+    return this;
+  },
+
+  /**
+   * 娣诲姞鍔ㄧ敾缁撴潫鐨勫洖璋�
+   * @param  {Function} cb
+   * @return {module:zrender/animation/Animator}
+   */
+  done: function (cb) {
+    if (cb) {
+      this._doneList.push(cb);
+    }
+
+    return this;
+  },
+
+  /**
+   * @return {Array.<module:zrender/animation/Clip>}
+   */
+  getClips: function () {
+    return this._clipList;
+  }
+};
+
+var dpr = 1; // If in browser environment
+
+if (typeof window !== 'undefined') {
+  dpr = Math.max(window.devicePixelRatio || 1, 1);
+}
+/**
+ * config榛樿閰嶇疆椤�
+ * @exports zrender/config
+ * @author Kener (@Kener-鏋楀嘲, kener.linfeng@gmail.com)
+ */
+
+/**
+ * debug鏃ュ織閫夐」锛歝atchBrushException涓簍rue涓嬫湁鏁�
+ * 0 : 涓嶇敓鎴恉ebug鏁版嵁锛屽彂甯冪敤
+ * 1 : 寮傚父鎶涘嚭锛岃皟璇曠敤
+ * 2 : 鎺у埗鍙拌緭鍑猴紝璋冭瘯鐢�
+ */
+
+
+var debugMode = 0; // retina 灞忓箷浼樺寲
+
+var devicePixelRatio = dpr;
+
+var log = function () {};
+
+if (debugMode === 1) {
+  log = function () {
+    for (var k in arguments) {
+      throw new Error(arguments[k]);
+    }
+  };
+} else if (debugMode > 1) {
+  log = function () {
+    for (var k in arguments) {
+      console.log(arguments[k]);
+    }
+  };
+}
+
+var zrLog = log;
+
+/**
+ * @alias modue:zrender/mixin/Animatable
+ * @constructor
+ */
+
+var Animatable = function () {
+  /**
+   * @type {Array.<module:zrender/animation/Animator>}
+   * @readOnly
+   */
+  this.animators = [];
+};
+
+Animatable.prototype = {
+  constructor: Animatable,
+
+  /**
+   * 鍔ㄧ敾
+   *
+   * @param {string} path The path to fetch value from object, like 'a.b.c'.
+   * @param {boolean} [loop] Whether to loop animation.
+   * @return {module:zrender/animation/Animator}
+   * @example:
+   *     el.animate('style', false)
+   *         .when(1000, {x: 10} )
+   *         .done(function(){ // Animation done })
+   *         .start()
+   */
+  animate: function (path, loop) {
+    var target;
+    var animatingShape = false;
+    var el = this;
+    var zr = this.__zr;
+
+    if (path) {
+      var pathSplitted = path.split('.');
+      var prop = el; // If animating shape
+
+      animatingShape = pathSplitted[0] === 'shape';
+
+      for (var i = 0, l = pathSplitted.length; i < l; i++) {
+        if (!prop) {
+          continue;
+        }
+
+        prop = prop[pathSplitted[i]];
+      }
+
+      if (prop) {
+        target = prop;
+      }
+    } else {
+      target = el;
+    }
+
+    if (!target) {
+      zrLog('Property "' + path + '" is not existed in element ' + el.id);
+      return;
+    }
+
+    var animators = el.animators;
+    var animator = new Animator(target, loop);
+    animator.during(function (target) {
+      el.dirty(animatingShape);
+    }).done(function () {
+      // FIXME Animator will not be removed if use `Animator#stop` to stop animation
+      animators.splice(indexOf(animators, animator), 1);
+    });
+    animators.push(animator); // If animate after added to the zrender
+
+    if (zr) {
+      zr.animation.addAnimator(animator);
+    }
+
+    return animator;
+  },
+
+  /**
+   * 鍋滄鍔ㄧ敾
+   * @param {boolean} forwardToLast If move to last frame before stop
+   */
+  stopAnimation: function (forwardToLast) {
+    var animators = this.animators;
+    var len = animators.length;
+
+    for (var i = 0; i < len; i++) {
+      animators[i].stop(forwardToLast);
+    }
+
+    animators.length = 0;
+    return this;
+  },
+
+  /**
+   * Caution: this method will stop previous animation.
+   * So do not use this method to one element twice before
+   * animation starts, unless you know what you are doing.
+   * @param {Object} target
+   * @param {number} [time=500] Time in ms
+   * @param {string} [easing='linear']
+   * @param {number} [delay=0]
+   * @param {Function} [callback]
+   * @param {Function} [forceAnimate] Prevent stop animation and callback
+   *        immediently when target values are the same as current values.
+   *
+   * @example
+   *  // Animate position
+   *  el.animateTo({
+   *      position: [10, 10]
+   *  }, function () { // done })
+   *
+   *  // Animate shape, style and position in 100ms, delayed 100ms, with cubicOut easing
+   *  el.animateTo({
+   *      shape: {
+   *          width: 500
+   *      },
+   *      style: {
+   *          fill: 'red'
+   *      }
+   *      position: [10, 10]
+   *  }, 100, 100, 'cubicOut', function () { // done })
+   */
+  // TODO Return animation key
+  animateTo: function (target, time, delay, easing, callback, forceAnimate) {
+    animateTo(this, target, time, delay, easing, callback, forceAnimate);
+  },
+
+  /**
+   * Animate from the target state to current state.
+   * The params and the return value are the same as `this.animateTo`.
+   */
+  animateFrom: function (target, time, delay, easing, callback, forceAnimate) {
+    animateTo(this, target, time, delay, easing, callback, forceAnimate, true);
+  }
+};
+
+function animateTo(animatable, target, time, delay, easing, callback, forceAnimate, reverse) {
+  // animateTo(target, time, easing, callback);
+  if (isString(delay)) {
+    callback = easing;
+    easing = delay;
+    delay = 0;
+  } // animateTo(target, time, delay, callback);
+  else if (isFunction$1(easing)) {
+      callback = easing;
+      easing = 'linear';
+      delay = 0;
+    } // animateTo(target, time, callback);
+    else if (isFunction$1(delay)) {
+        callback = delay;
+        delay = 0;
+      } // animateTo(target, callback)
+      else if (isFunction$1(time)) {
+          callback = time;
+          time = 500;
+        } // animateTo(target)
+        else if (!time) {
+            time = 500;
+          } // Stop all previous animations
+
+
+  animatable.stopAnimation();
+  animateToShallow(animatable, '', animatable, target, time, delay, reverse); // Animators may be removed immediately after start
+  // if there is nothing to animate
+
+  var animators = animatable.animators.slice();
+  var count = animators.length;
+
+  function done() {
+    count--;
+
+    if (!count) {
+      callback && callback();
+    }
+  } // No animators. This should be checked before animators[i].start(),
+  // because 'done' may be executed immediately if no need to animate.
+
+
+  if (!count) {
+    callback && callback();
+  } // Start after all animators created
+  // Incase any animator is done immediately when all animation properties are not changed
+
+
+  for (var i = 0; i < animators.length; i++) {
+    animators[i].done(done).start(easing, forceAnimate);
+  }
+}
+/**
+ * @param {string} path=''
+ * @param {Object} source=animatable
+ * @param {Object} target
+ * @param {number} [time=500]
+ * @param {number} [delay=0]
+ * @param {boolean} [reverse] If `true`, animate
+ *        from the `target` to current state.
+ *
+ * @example
+ *  // Animate position
+ *  el._animateToShallow({
+ *      position: [10, 10]
+ *  })
+ *
+ *  // Animate shape, style and position in 100ms, delayed 100ms
+ *  el._animateToShallow({
+ *      shape: {
+ *          width: 500
+ *      },
+ *      style: {
+ *          fill: 'red'
+ *      }
+ *      position: [10, 10]
+ *  }, 100, 100)
+ */
+
+
+function animateToShallow(animatable, path, source, target, time, delay, reverse) {
+  var objShallow = {};
+  var propertyCount = 0;
+
+  for (var name in target) {
+    if (!target.hasOwnProperty(name)) {
+      continue;
+    }
+
+    if (source[name] != null) {
+      if (isObject$1(target[name]) && !isArrayLike(target[name])) {
+        animateToShallow(animatable, path ? path + '.' + name : name, source[name], target[name], time, delay, reverse);
+      } else {
+        if (reverse) {
+          objShallow[name] = source[name];
+          setAttrByPath(animatable, path, name, target[name]);
+        } else {
+          objShallow[name] = target[name];
+        }
+
+        propertyCount++;
+      }
+    } else if (target[name] != null && !reverse) {
+      setAttrByPath(animatable, path, name, target[name]);
+    }
+  }
+
+  if (propertyCount > 0) {
+    animatable.animate(path, false).when(time == null ? 500 : time, objShallow).delay(delay || 0);
+  }
+}
+
+function setAttrByPath(el, path, name, value) {
+  // Attr directly if not has property
+  // FIXME, if some property not needed for element ?
+  if (!path) {
+    el.attr(name, value);
+  } else {
+    // Only support set shape or style
+    var props = {};
+    props[path] = {};
+    props[path][name] = value;
+    el.attr(props);
+  }
+}
+
+/**
+ * @alias module:zrender/Element
+ * @constructor
+ * @extends {module:zrender/mixin/Animatable}
+ * @extends {module:zrender/mixin/Transformable}
+ * @extends {module:zrender/mixin/Eventful}
+ */
+
+var Element = function (opts) {
+  // jshint ignore:line
+  Transformable.call(this, opts);
+  Eventful.call(this, opts);
+  Animatable.call(this, opts);
+  /**
+   * 鐢诲竷鍏冪礌ID
+   * @type {string}
+   */
+
+  this.id = opts.id || guid();
+};
+
+Element.prototype = {
+  /**
+   * 鍏冪礌绫诲瀷
+   * Element type
+   * @type {string}
+   */
+  type: 'element',
+
+  /**
+   * 鍏冪礌鍚嶅瓧
+   * Element name
+   * @type {string}
+   */
+  name: '',
+
+  /**
+   * ZRender 瀹炰緥瀵硅薄锛屼細鍦� element 娣诲姞鍒� zrender 瀹炰緥涓悗鑷姩璧嬪��
+   * ZRender instance will be assigned when element is associated with zrender
+   * @name module:/zrender/Element#__zr
+   * @type {module:zrender/ZRender}
+   */
+  __zr: null,
+
+  /**
+   * 鍥惧舰鏄惁蹇界暐锛屼负true鏃跺拷鐣ュ浘褰㈢殑缁樺埗浠ュ強浜嬩欢瑙﹀彂
+   * If ignore drawing and events of the element object
+   * @name module:/zrender/Element#ignore
+   * @type {boolean}
+   * @default false
+   */
+  ignore: false,
+
+  /**
+   * 鐢ㄤ簬瑁佸壀鐨勮矾寰�(shape)锛屾墍鏈� Group 鍐呯殑璺緞鍦ㄧ粯鍒舵椂閮戒細琚繖涓矾寰勮鍓�
+   * 璇ヨ矾寰勪細缁ф壙琚鍑忓璞$殑鍙樻崲
+   * @type {module:zrender/graphic/Path}
+   * @see http://www.w3.org/TR/2dcontext/#clipping-region
+   * @readOnly
+   */
+  clipPath: null,
+
+  /**
+   * 鏄惁鏄� Group
+   * @type {boolean}
+   */
+  isGroup: false,
+
+  /**
+   * Drift element
+   * @param  {number} dx dx on the global space
+   * @param  {number} dy dy on the global space
+   */
+  drift: function (dx, dy) {
+    switch (this.draggable) {
+      case 'horizontal':
+        dy = 0;
+        break;
+
+      case 'vertical':
+        dx = 0;
+        break;
+    }
+
+    var m = this.transform;
+
+    if (!m) {
+      m = this.transform = [1, 0, 0, 1, 0, 0];
+    }
+
+    m[4] += dx;
+    m[5] += dy;
+    this.decomposeTransform();
+    this.dirty(false);
+  },
+
+  /**
+   * Hook before update
+   */
+  beforeUpdate: function () {},
+
+  /**
+   * Hook after update
+   */
+  afterUpdate: function () {},
+
+  /**
+   * Update each frame
+   */
+  update: function () {
+    this.updateTransform();
+  },
+
+  /**
+   * @param  {Function} cb
+   * @param  {}   context
+   */
+  traverse: function (cb, context) {},
+
+  /**
+   * @protected
+   */
+  attrKV: function (key, value) {
+    if (key === 'position' || key === 'scale' || key === 'origin') {
+      // Copy the array
+      if (value) {
+        var target = this[key];
+
+        if (!target) {
+          target = this[key] = [];
+        }
+
+        target[0] = value[0];
+        target[1] = value[1];
+      }
+    } else {
+      this[key] = value;
+    }
+  },
+
+  /**
+   * Hide the element
+   */
+  hide: function () {
+    this.ignore = true;
+    this.__zr && this.__zr.refresh();
+  },
+
+  /**
+   * Show the element
+   */
+  show: function () {
+    this.ignore = false;
+    this.__zr && this.__zr.refresh();
+  },
+
+  /**
+   * @param {string|Object} key
+   * @param {*} value
+   */
+  attr: function (key, value) {
+    if (typeof key === 'string') {
+      this.attrKV(key, value);
+    } else if (isObject$1(key)) {
+      for (var name in key) {
+        if (key.hasOwnProperty(name)) {
+          this.attrKV(name, key[name]);
+        }
+      }
+    }
+
+    this.dirty(false);
+    return this;
+  },
+
+  /**
+   * @param {module:zrender/graphic/Path} clipPath
+   */
+  setClipPath: function (clipPath) {
+    var zr = this.__zr;
+
+    if (zr) {
+      clipPath.addSelfToZr(zr);
+    } // Remove previous clip path
+
+
+    if (this.clipPath && this.clipPath !== clipPath) {
+      this.removeClipPath();
+    }
+
+    this.clipPath = clipPath;
+    clipPath.__zr = zr;
+    clipPath.__clipTarget = this;
+    this.dirty(false);
+  },
+
+  /**
+   */
+  removeClipPath: function () {
+    var clipPath = this.clipPath;
+
+    if (clipPath) {
+      if (clipPath.__zr) {
+        clipPath.removeSelfFromZr(clipPath.__zr);
+      }
+
+      clipPath.__zr = null;
+      clipPath.__clipTarget = null;
+      this.clipPath = null;
+      this.dirty(false);
+    }
+  },
+
+  /**
+   * Add self from zrender instance.
+   * Not recursively because it will be invoked when element added to storage.
+   * @param {module:zrender/ZRender} zr
+   */
+  addSelfToZr: function (zr) {
+    this.__zr = zr; // 娣诲姞鍔ㄧ敾
+
+    var animators = this.animators;
+
+    if (animators) {
+      for (var i = 0; i < animators.length; i++) {
+        zr.animation.addAnimator(animators[i]);
+      }
+    }
+
+    if (this.clipPath) {
+      this.clipPath.addSelfToZr(zr);
+    }
+  },
+
+  /**
+   * Remove self from zrender instance.
+   * Not recursively because it will be invoked when element added to storage.
+   * @param {module:zrender/ZRender} zr
+   */
+  removeSelfFromZr: function (zr) {
+    this.__zr = null; // 绉婚櫎鍔ㄧ敾
+
+    var animators = this.animators;
+
+    if (animators) {
+      for (var i = 0; i < animators.length; i++) {
+        zr.animation.removeAnimator(animators[i]);
+      }
+    }
+
+    if (this.clipPath) {
+      this.clipPath.removeSelfFromZr(zr);
+    }
+  }
+};
+mixin(Element, Animatable);
+mixin(Element, Transformable);
+mixin(Element, Eventful);
+
+/**
+ * @module echarts/core/BoundingRect
+ */
+var v2ApplyTransform = applyTransform;
+var mathMin = Math.min;
+var mathMax = Math.max;
+/**
+ * @alias module:echarts/core/BoundingRect
+ */
+
+function BoundingRect(x, y, width, height) {
+  if (width < 0) {
+    x = x + width;
+    width = -width;
+  }
+
+  if (height < 0) {
+    y = y + height;
+    height = -height;
+  }
+  /**
+   * @type {number}
+   */
+
+
+  this.x = x;
+  /**
+   * @type {number}
+   */
+
+  this.y = y;
+  /**
+   * @type {number}
+   */
+
+  this.width = width;
+  /**
+   * @type {number}
+   */
+
+  this.height = height;
+}
+
+BoundingRect.prototype = {
+  constructor: BoundingRect,
+
+  /**
+   * @param {module:echarts/core/BoundingRect} other
+   */
+  union: function (other) {
+    var x = mathMin(other.x, this.x);
+    var y = mathMin(other.y, this.y);
+    this.width = mathMax(other.x + other.width, this.x + this.width) - x;
+    this.height = mathMax(other.y + other.height, this.y + this.height) - y;
+    this.x = x;
+    this.y = y;
+  },
+
+  /**
+   * @param {Array.<number>} m
+   * @methods
+   */
+  applyTransform: function () {
+    var lt = [];
+    var rb = [];
+    var lb = [];
+    var rt = [];
+    return function (m) {
+      // In case usage like this
+      // el.getBoundingRect().applyTransform(el.transform)
+      // And element has no transform
+      if (!m) {
+        return;
+      }
+
+      lt[0] = lb[0] = this.x;
+      lt[1] = rt[1] = this.y;
+      rb[0] = rt[0] = this.x + this.width;
+      rb[1] = lb[1] = this.y + this.height;
+      v2ApplyTransform(lt, lt, m);
+      v2ApplyTransform(rb, rb, m);
+      v2ApplyTransform(lb, lb, m);
+      v2ApplyTransform(rt, rt, m);
+      this.x = mathMin(lt[0], rb[0], lb[0], rt[0]);
+      this.y = mathMin(lt[1], rb[1], lb[1], rt[1]);
+      var maxX = mathMax(lt[0], rb[0], lb[0], rt[0]);
+      var maxY = mathMax(lt[1], rb[1], lb[1], rt[1]);
+      this.width = maxX - this.x;
+      this.height = maxY - this.y;
+    };
+  }(),
+
+  /**
+   * Calculate matrix of transforming from self to target rect
+   * @param  {module:zrender/core/BoundingRect} b
+   * @return {Array.<number>}
+   */
+  calculateTransform: function (b) {
+    var a = this;
+    var sx = b.width / a.width;
+    var sy = b.height / a.height;
+    var m = create$1(); // 鐭╅樀鍙充箻
+
+    translate(m, m, [-a.x, -a.y]);
+    scale$1(m, m, [sx, sy]);
+    translate(m, m, [b.x, b.y]);
+    return m;
+  },
+
+  /**
+   * @param {(module:echarts/core/BoundingRect|Object)} b
+   * @return {boolean}
+   */
+  intersect: function (b) {
+    if (!b) {
+      return false;
+    }
+
+    if (!(b instanceof BoundingRect)) {
+      // Normalize negative width/height.
+      b = BoundingRect.create(b);
+    }
+
+    var a = this;
+    var ax0 = a.x;
+    var ax1 = a.x + a.width;
+    var ay0 = a.y;
+    var ay1 = a.y + a.height;
+    var bx0 = b.x;
+    var bx1 = b.x + b.width;
+    var by0 = b.y;
+    var by1 = b.y + b.height;
+    return !(ax1 < bx0 || bx1 < ax0 || ay1 < by0 || by1 < ay0);
+  },
+  contain: function (x, y) {
+    var rect = this;
+    return x >= rect.x && x <= rect.x + rect.width && y >= rect.y && y <= rect.y + rect.height;
+  },
+
+  /**
+   * @return {module:echarts/core/BoundingRect}
+   */
+  clone: function () {
+    return new BoundingRect(this.x, this.y, this.width, this.height);
+  },
+
+  /**
+   * Copy from another rect
+   */
+  copy: function (other) {
+    this.x = other.x;
+    this.y = other.y;
+    this.width = other.width;
+    this.height = other.height;
+  },
+  plain: function () {
+    return {
+      x: this.x,
+      y: this.y,
+      width: this.width,
+      height: this.height
+    };
+  }
+};
+/**
+ * @param {Object|module:zrender/core/BoundingRect} rect
+ * @param {number} rect.x
+ * @param {number} rect.y
+ * @param {number} rect.width
+ * @param {number} rect.height
+ * @return {module:zrender/core/BoundingRect}
+ */
+
+BoundingRect.create = function (rect) {
+  return new BoundingRect(rect.x, rect.y, rect.width, rect.height);
+};
+
+/**
+ * Group鏄竴涓鍣紝鍙互鎻掑叆瀛愯妭鐐癸紝Group鐨勫彉鎹篃浼氳搴旂敤鍒板瓙鑺傜偣涓�
+ * @module zrender/graphic/Group
+ * @example
+ *     var Group = require('zrender/container/Group');
+ *     var Circle = require('zrender/graphic/shape/Circle');
+ *     var g = new Group();
+ *     g.position[0] = 100;
+ *     g.position[1] = 100;
+ *     g.add(new Circle({
+ *         style: {
+ *             x: 100,
+ *             y: 100,
+ *             r: 20,
+ *         }
+ *     }));
+ *     zr.add(g);
+ */
+/**
+ * @alias module:zrender/graphic/Group
+ * @constructor
+ * @extends module:zrender/mixin/Transformable
+ * @extends module:zrender/mixin/Eventful
+ */
+
+var Group = function (opts) {
+  opts = opts || {};
+  Element.call(this, opts);
+
+  for (var key in opts) {
+    if (opts.hasOwnProperty(key)) {
+      this[key] = opts[key];
+    }
+  }
+
+  this._children = [];
+  this.__storage = null;
+  this.__dirty = true;
+};
+
+Group.prototype = {
+  constructor: Group,
+  isGroup: true,
+
+  /**
+   * @type {string}
+   */
+  type: 'group',
+
+  /**
+   * 鎵�鏈夊瓙瀛欏厓绱犳槸鍚﹀搷搴旈紶鏍囦簨浠�
+   * @name module:/zrender/container/Group#silent
+   * @type {boolean}
+   * @default false
+   */
+  silent: false,
+
+  /**
+   * @return {Array.<module:zrender/Element>}
+   */
+  children: function () {
+    return this._children.slice();
+  },
+
+  /**
+   * 鑾峰彇鎸囧畾 index 鐨勫効瀛愯妭鐐�
+   * @param  {number} idx
+   * @return {module:zrender/Element}
+   */
+  childAt: function (idx) {
+    return this._children[idx];
+  },
+
+  /**
+   * 鑾峰彇鎸囧畾鍚嶅瓧鐨勫効瀛愯妭鐐�
+   * @param  {string} name
+   * @return {module:zrender/Element}
+   */
+  childOfName: function (name) {
+    var children = this._children;
+
+    for (var i = 0; i < children.length; i++) {
+      if (children[i].name === name) {
+        return children[i];
+      }
+    }
+  },
+
+  /**
+   * @return {number}
+   */
+  childCount: function () {
+    return this._children.length;
+  },
+
+  /**
+   * 娣诲姞瀛愯妭鐐瑰埌鏈�鍚�
+   * @param {module:zrender/Element} child
+   */
+  add: function (child) {
+    if (child && child !== this && child.parent !== this) {
+      this._children.push(child);
+
+      this._doAdd(child);
+    }
+
+    return this;
+  },
+
+  /**
+   * 娣诲姞瀛愯妭鐐瑰湪 nextSibling 涔嬪墠
+   * @param {module:zrender/Element} child
+   * @param {module:zrender/Element} nextSibling
+   */
+  addBefore: function (child, nextSibling) {
+    if (child && child !== this && child.parent !== this && nextSibling && nextSibling.parent === this) {
+      var children = this._children;
+      var idx = children.indexOf(nextSibling);
+
+      if (idx >= 0) {
+        children.splice(idx, 0, child);
+
+        this._doAdd(child);
+      }
+    }
+
+    return this;
+  },
+  _doAdd: function (child) {
+    if (child.parent) {
+      child.parent.remove(child);
+    }
+
+    child.parent = this;
+    var storage = this.__storage;
+    var zr = this.__zr;
+
+    if (storage && storage !== child.__storage) {
+      storage.addToStorage(child);
+
+      if (child instanceof Group) {
+        child.addChildrenToStorage(storage);
+      }
+    }
+
+    zr && zr.refresh();
+  },
+
+  /**
+   * 绉婚櫎瀛愯妭鐐�
+   * @param {module:zrender/Element} child
+   */
+  remove: function (child) {
+    var zr = this.__zr;
+    var storage = this.__storage;
+    var children = this._children;
+    var idx = indexOf(children, child);
+
+    if (idx < 0) {
+      return this;
+    }
+
+    children.splice(idx, 1);
+    child.parent = null;
+
+    if (storage) {
+      storage.delFromStorage(child);
+
+      if (child instanceof Group) {
+        child.delChildrenFromStorage(storage);
+      }
+    }
+
+    zr && zr.refresh();
+    return this;
+  },
+
+  /**
+   * 绉婚櫎鎵�鏈夊瓙鑺傜偣
+   */
+  removeAll: function () {
+    var children = this._children;
+    var storage = this.__storage;
+    var child;
+    var i;
+
+    for (i = 0; i < children.length; i++) {
+      child = children[i];
+
+      if (storage) {
+        storage.delFromStorage(child);
+
+        if (child instanceof Group) {
+          child.delChildrenFromStorage(storage);
+        }
+      }
+
+      child.parent = null;
+    }
+
+    children.length = 0;
+    return this;
+  },
+
+  /**
+   * 閬嶅巻鎵�鏈夊瓙鑺傜偣
+   * @param  {Function} cb
+   * @param  {}   context
+   */
+  eachChild: function (cb, context) {
+    var children = this._children;
+
+    for (var i = 0; i < children.length; i++) {
+      var child = children[i];
+      cb.call(context, child, i);
+    }
+
+    return this;
+  },
+
+  /**
+   * 娣卞害浼樺厛閬嶅巻鎵�鏈夊瓙瀛欒妭鐐�
+   * @param  {Function} cb
+   * @param  {}   context
+   */
+  traverse: function (cb, context) {
+    for (var i = 0; i < this._children.length; i++) {
+      var child = this._children[i];
+      cb.call(context, child);
+
+      if (child.type === 'group') {
+        child.traverse(cb, context);
+      }
+    }
+
+    return this;
+  },
+  addChildrenToStorage: function (storage) {
+    for (var i = 0; i < this._children.length; i++) {
+      var child = this._children[i];
+      storage.addToStorage(child);
+
+      if (child instanceof Group) {
+        child.addChildrenToStorage(storage);
+      }
+    }
+  },
+  delChildrenFromStorage: function (storage) {
+    for (var i = 0; i < this._children.length; i++) {
+      var child = this._children[i];
+      storage.delFromStorage(child);
+
+      if (child instanceof Group) {
+        child.delChildrenFromStorage(storage);
+      }
+    }
+  },
+  dirty: function () {
+    this.__dirty = true;
+    this.__zr && this.__zr.refresh();
+    return this;
+  },
+
+  /**
+   * @return {module:zrender/core/BoundingRect}
+   */
+  getBoundingRect: function (includeChildren) {
+    // TODO Caching
+    var rect = null;
+    var tmpRect = new BoundingRect(0, 0, 0, 0);
+    var children = includeChildren || this._children;
+    var tmpMat = [];
+
+    for (var i = 0; i < children.length; i++) {
+      var child = children[i];
+
+      if (child.ignore || child.invisible) {
+        continue;
+      }
+
+      var childRect = child.getBoundingRect();
+      var transform = child.getLocalTransform(tmpMat); // TODO
+      // The boundingRect cacluated by transforming original
+      // rect may be bigger than the actual bundingRect when rotation
+      // is used. (Consider a circle rotated aginst its center, where
+      // the actual boundingRect should be the same as that not be
+      // rotated.) But we can not find better approach to calculate
+      // actual boundingRect yet, considering performance.
+
+      if (transform) {
+        tmpRect.copy(childRect);
+        tmpRect.applyTransform(transform);
+        rect = rect || tmpRect.clone();
+        rect.union(tmpRect);
+      } else {
+        rect = rect || childRect.clone();
+        rect.union(childRect);
+      }
+    }
+
+    return rect || tmpRect;
+  }
+};
+inherits(Group, Element);
+
+// https://github.com/mziccard/node-timsort
+var DEFAULT_MIN_MERGE = 32;
+var DEFAULT_MIN_GALLOPING = 7;
+function minRunLength(n) {
+  var r = 0;
+
+  while (n >= DEFAULT_MIN_MERGE) {
+    r |= n & 1;
+    n >>= 1;
+  }
+
+  return n + r;
+}
+
+function makeAscendingRun(array, lo, hi, compare) {
+  var runHi = lo + 1;
+
+  if (runHi === hi) {
+    return 1;
+  }
+
+  if (compare(array[runHi++], array[lo]) < 0) {
+    while (runHi < hi && compare(array[runHi], array[runHi - 1]) < 0) {
+      runHi++;
+    }
+
+    reverseRun(array, lo, runHi);
+  } else {
+    while (runHi < hi && compare(array[runHi], array[runHi - 1]) >= 0) {
+      runHi++;
+    }
+  }
+
+  return runHi - lo;
+}
+
+function reverseRun(array, lo, hi) {
+  hi--;
+
+  while (lo < hi) {
+    var t = array[lo];
+    array[lo++] = array[hi];
+    array[hi--] = t;
+  }
+}
+
+function binaryInsertionSort(array, lo, hi, start, compare) {
+  if (start === lo) {
+    start++;
+  }
+
+  for (; start < hi; start++) {
+    var pivot = array[start];
+    var left = lo;
+    var right = start;
+    var mid;
+
+    while (left < right) {
+      mid = left + right >>> 1;
+
+      if (compare(pivot, array[mid]) < 0) {
+        right = mid;
+      } else {
+        left = mid + 1;
+      }
+    }
+
+    var n = start - left;
+
+    switch (n) {
+      case 3:
+        array[left + 3] = array[left + 2];
+
+      case 2:
+        array[left + 2] = array[left + 1];
+
+      case 1:
+        array[left + 1] = array[left];
+        break;
+
+      default:
+        while (n > 0) {
+          array[left + n] = array[left + n - 1];
+          n--;
+        }
+
+    }
+
+    array[left] = pivot;
+  }
+}
+
+function gallopLeft(value, array, start, length, hint, compare) {
+  var lastOffset = 0;
+  var maxOffset = 0;
+  var offset = 1;
+
+  if (compare(value, array[start + hint]) > 0) {
+    maxOffset = length - hint;
+
+    while (offset < maxOffset && compare(value, array[start + hint + offset]) > 0) {
+      lastOffset = offset;
+      offset = (offset << 1) + 1;
+
+      if (offset <= 0) {
+        offset = maxOffset;
+      }
+    }
+
+    if (offset > maxOffset) {
+      offset = maxOffset;
+    }
+
+    lastOffset += hint;
+    offset += hint;
+  } else {
+    maxOffset = hint + 1;
+
+    while (offset < maxOffset && compare(value, array[start + hint - offset]) <= 0) {
+      lastOffset = offset;
+      offset = (offset << 1) + 1;
+
+      if (offset <= 0) {
+        offset = maxOffset;
+      }
+    }
+
+    if (offset > maxOffset) {
+      offset = maxOffset;
+    }
+
+    var tmp = lastOffset;
+    lastOffset = hint - offset;
+    offset = hint - tmp;
+  }
+
+  lastOffset++;
+
+  while (lastOffset < offset) {
+    var m = lastOffset + (offset - lastOffset >>> 1);
+
+    if (compare(value, array[start + m]) > 0) {
+      lastOffset = m + 1;
+    } else {
+      offset = m;
+    }
+  }
+
+  return offset;
+}
+
+function gallopRight(value, array, start, length, hint, compare) {
+  var lastOffset = 0;
+  var maxOffset = 0;
+  var offset = 1;
+
+  if (compare(value, array[start + hint]) < 0) {
+    maxOffset = hint + 1;
+
+    while (offset < maxOffset && compare(value, array[start + hint - offset]) < 0) {
+      lastOffset = offset;
+      offset = (offset << 1) + 1;
+
+      if (offset <= 0) {
+        offset = maxOffset;
+      }
+    }
+
+    if (offset > maxOffset) {
+      offset = maxOffset;
+    }
+
+    var tmp = lastOffset;
+    lastOffset = hint - offset;
+    offset = hint - tmp;
+  } else {
+    maxOffset = length - hint;
+
+    while (offset < maxOffset && compare(value, array[start + hint + offset]) >= 0) {
+      lastOffset = offset;
+      offset = (offset << 1) + 1;
+
+      if (offset <= 0) {
+        offset = maxOffset;
+      }
+    }
+
+    if (offset > maxOffset) {
+      offset = maxOffset;
+    }
+
+    lastOffset += hint;
+    offset += hint;
+  }
+
+  lastOffset++;
+
+  while (lastOffset < offset) {
+    var m = lastOffset + (offset - lastOffset >>> 1);
+
+    if (compare(value, array[start + m]) < 0) {
+      offset = m;
+    } else {
+      lastOffset = m + 1;
+    }
+  }
+
+  return offset;
+}
+
+function TimSort(array, compare) {
+  var minGallop = DEFAULT_MIN_GALLOPING;
+  var runStart;
+  var runLength;
+  var stackSize = 0;
+  var tmp = [];
+  runStart = [];
+  runLength = [];
+
+  function pushRun(_runStart, _runLength) {
+    runStart[stackSize] = _runStart;
+    runLength[stackSize] = _runLength;
+    stackSize += 1;
+  }
+
+  function mergeRuns() {
+    while (stackSize > 1) {
+      var n = stackSize - 2;
+
+      if (n >= 1 && runLength[n - 1] <= runLength[n] + runLength[n + 1] || n >= 2 && runLength[n - 2] <= runLength[n] + runLength[n - 1]) {
+        if (runLength[n - 1] < runLength[n + 1]) {
+          n--;
+        }
+      } else if (runLength[n] > runLength[n + 1]) {
+        break;
+      }
+
+      mergeAt(n);
+    }
+  }
+
+  function forceMergeRuns() {
+    while (stackSize > 1) {
+      var n = stackSize - 2;
+
+      if (n > 0 && runLength[n - 1] < runLength[n + 1]) {
+        n--;
+      }
+
+      mergeAt(n);
+    }
+  }
+
+  function mergeAt(i) {
+    var start1 = runStart[i];
+    var length1 = runLength[i];
+    var start2 = runStart[i + 1];
+    var length2 = runLength[i + 1];
+    runLength[i] = length1 + length2;
+
+    if (i === stackSize - 3) {
+      runStart[i + 1] = runStart[i + 2];
+      runLength[i + 1] = runLength[i + 2];
+    }
+
+    stackSize--;
+    var k = gallopRight(array[start2], array, start1, length1, 0, compare);
+    start1 += k;
+    length1 -= k;
+
+    if (length1 === 0) {
+      return;
+    }
+
+    length2 = gallopLeft(array[start1 + length1 - 1], array, start2, length2, length2 - 1, compare);
+
+    if (length2 === 0) {
+      return;
+    }
+
+    if (length1 <= length2) {
+      mergeLow(start1, length1, start2, length2);
+    } else {
+      mergeHigh(start1, length1, start2, length2);
+    }
+  }
+
+  function mergeLow(start1, length1, start2, length2) {
+    var i = 0;
+
+    for (i = 0; i < length1; i++) {
+      tmp[i] = array[start1 + i];
+    }
+
+    var cursor1 = 0;
+    var cursor2 = start2;
+    var dest = start1;
+    array[dest++] = array[cursor2++];
+
+    if (--length2 === 0) {
+      for (i = 0; i < length1; i++) {
+        array[dest + i] = tmp[cursor1 + i];
+      }
+
+      return;
+    }
+
+    if (length1 === 1) {
+      for (i = 0; i < length2; i++) {
+        array[dest + i] = array[cursor2 + i];
+      }
+
+      array[dest + length2] = tmp[cursor1];
+      return;
+    }
+
+    var _minGallop = minGallop;
+    var count1, count2, exit;
+
+    while (1) {
+      count1 = 0;
+      count2 = 0;
+      exit = false;
+
+      do {
+        if (compare(array[cursor2], tmp[cursor1]) < 0) {
+          array[dest++] = array[cursor2++];
+          count2++;
+          count1 = 0;
+
+          if (--length2 === 0) {
+            exit = true;
+            break;
+          }
+        } else {
+          array[dest++] = tmp[cursor1++];
+          count1++;
+          count2 = 0;
+
+          if (--length1 === 1) {
+            exit = true;
+            break;
+          }
+        }
+      } while ((count1 | count2) < _minGallop);
+
+      if (exit) {
+        break;
+      }
+
+      do {
+        count1 = gallopRight(array[cursor2], tmp, cursor1, length1, 0, compare);
+
+        if (count1 !== 0) {
+          for (i = 0; i < count1; i++) {
+            array[dest + i] = tmp[cursor1 + i];
+          }
+
+          dest += count1;
+          cursor1 += count1;
+          length1 -= count1;
+
+          if (length1 <= 1) {
+            exit = true;
+            break;
+          }
+        }
+
+        array[dest++] = array[cursor2++];
+
+        if (--length2 === 0) {
+          exit = true;
+          break;
+        }
+
+        count2 = gallopLeft(tmp[cursor1], array, cursor2, length2, 0, compare);
+
+        if (count2 !== 0) {
+          for (i = 0; i < count2; i++) {
+            array[dest + i] = array[cursor2 + i];
+          }
+
+          dest += count2;
+          cursor2 += count2;
+          length2 -= count2;
+
+          if (length2 === 0) {
+            exit = true;
+            break;
+          }
+        }
+
+        array[dest++] = tmp[cursor1++];
+
+        if (--length1 === 1) {
+          exit = true;
+          break;
+        }
+
+        _minGallop--;
+      } while (count1 >= DEFAULT_MIN_GALLOPING || count2 >= DEFAULT_MIN_GALLOPING);
+
+      if (exit) {
+        break;
+      }
+
+      if (_minGallop < 0) {
+        _minGallop = 0;
+      }
+
+      _minGallop += 2;
+    }
+
+    minGallop = _minGallop;
+    minGallop < 1 && (minGallop = 1);
+
+    if (length1 === 1) {
+      for (i = 0; i < length2; i++) {
+        array[dest + i] = array[cursor2 + i];
+      }
+
+      array[dest + length2] = tmp[cursor1];
+    } else if (length1 === 0) {
+      throw new Error(); // throw new Error('mergeLow preconditions were not respected');
+    } else {
+      for (i = 0; i < length1; i++) {
+        array[dest + i] = tmp[cursor1 + i];
+      }
+    }
+  }
+
+  function mergeHigh(start1, length1, start2, length2) {
+    var i = 0;
+
+    for (i = 0; i < length2; i++) {
+      tmp[i] = array[start2 + i];
+    }
+
+    var cursor1 = start1 + length1 - 1;
+    var cursor2 = length2 - 1;
+    var dest = start2 + length2 - 1;
+    var customCursor = 0;
+    var customDest = 0;
+    array[dest--] = array[cursor1--];
+
+    if (--length1 === 0) {
+      customCursor = dest - (length2 - 1);
+
+      for (i = 0; i < length2; i++) {
+        array[customCursor + i] = tmp[i];
+      }
+
+      return;
+    }
+
+    if (length2 === 1) {
+      dest -= length1;
+      cursor1 -= length1;
+      customDest = dest + 1;
+      customCursor = cursor1 + 1;
+
+      for (i = length1 - 1; i >= 0; i--) {
+        array[customDest + i] = array[customCursor + i];
+      }
+
+      array[dest] = tmp[cursor2];
+      return;
+    }
+
+    var _minGallop = minGallop;
+
+    while (true) {
+      var count1 = 0;
+      var count2 = 0;
+      var exit = false;
+
+      do {
+        if (compare(tmp[cursor2], array[cursor1]) < 0) {
+          array[dest--] = array[cursor1--];
+          count1++;
+          count2 = 0;
+
+          if (--length1 === 0) {
+            exit = true;
+            break;
+          }
+        } else {
+          array[dest--] = tmp[cursor2--];
+          count2++;
+          count1 = 0;
+
+          if (--length2 === 1) {
+            exit = true;
+            break;
+          }
+        }
+      } while ((count1 | count2) < _minGallop);
+
+      if (exit) {
+        break;
+      }
+
+      do {
+        count1 = length1 - gallopRight(tmp[cursor2], array, start1, length1, length1 - 1, compare);
+
+        if (count1 !== 0) {
+          dest -= count1;
+          cursor1 -= count1;
+          length1 -= count1;
+          customDest = dest + 1;
+          customCursor = cursor1 + 1;
+
+          for (i = count1 - 1; i >= 0; i--) {
+            array[customDest + i] = array[customCursor + i];
+          }
+
+          if (length1 === 0) {
+            exit = true;
+            break;
+          }
+        }
+
+        array[dest--] = tmp[cursor2--];
+
+        if (--length2 === 1) {
+          exit = true;
+          break;
+        }
+
+        count2 = length2 - gallopLeft(array[cursor1], tmp, 0, length2, length2 - 1, compare);
+
+        if (count2 !== 0) {
+          dest -= count2;
+          cursor2 -= count2;
+          length2 -= count2;
+          customDest = dest + 1;
+          customCursor = cursor2 + 1;
+
+          for (i = 0; i < count2; i++) {
+            array[customDest + i] = tmp[customCursor + i];
+          }
+
+          if (length2 <= 1) {
+            exit = true;
+            break;
+          }
+        }
+
+        array[dest--] = array[cursor1--];
+
+        if (--length1 === 0) {
+          exit = true;
+          break;
+        }
+
+        _minGallop--;
+      } while (count1 >= DEFAULT_MIN_GALLOPING || count2 >= DEFAULT_MIN_GALLOPING);
+
+      if (exit) {
+        break;
+      }
+
+      if (_minGallop < 0) {
+        _minGallop = 0;
+      }
+
+      _minGallop += 2;
+    }
+
+    minGallop = _minGallop;
+
+    if (minGallop < 1) {
+      minGallop = 1;
+    }
+
+    if (length2 === 1) {
+      dest -= length1;
+      cursor1 -= length1;
+      customDest = dest + 1;
+      customCursor = cursor1 + 1;
+
+      for (i = length1 - 1; i >= 0; i--) {
+        array[customDest + i] = array[customCursor + i];
+      }
+
+      array[dest] = tmp[cursor2];
+    } else if (length2 === 0) {
+      throw new Error(); // throw new Error('mergeHigh preconditions were not respected');
+    } else {
+      customCursor = dest - (length2 - 1);
+
+      for (i = 0; i < length2; i++) {
+        array[customCursor + i] = tmp[i];
+      }
+    }
+  }
+
+  this.mergeRuns = mergeRuns;
+  this.forceMergeRuns = forceMergeRuns;
+  this.pushRun = pushRun;
+}
+
+function sort(array, compare, lo, hi) {
+  if (!lo) {
+    lo = 0;
+  }
+
+  if (!hi) {
+    hi = array.length;
+  }
+
+  var remaining = hi - lo;
+
+  if (remaining < 2) {
+    return;
+  }
+
+  var runLength = 0;
+
+  if (remaining < DEFAULT_MIN_MERGE) {
+    runLength = makeAscendingRun(array, lo, hi, compare);
+    binaryInsertionSort(array, lo, hi, lo + runLength, compare);
+    return;
+  }
+
+  var ts = new TimSort(array, compare);
+  var minRun = minRunLength(remaining);
+
+  do {
+    runLength = makeAscendingRun(array, lo, hi, compare);
+
+    if (runLength < minRun) {
+      var force = remaining;
+
+      if (force > minRun) {
+        force = minRun;
+      }
+
+      binaryInsertionSort(array, lo, lo + force, lo + runLength, compare);
+      runLength = force;
+    }
+
+    ts.pushRun(lo, runLength);
+    ts.mergeRuns();
+    remaining -= runLength;
+    lo += runLength;
+  } while (remaining !== 0);
+
+  ts.forceMergeRuns();
+}
+
+// https://jsfiddle.net/pissang/jr4x7mdm/8/
+
+function shapeCompareFunc(a, b) {
+  if (a.zlevel === b.zlevel) {
+    if (a.z === b.z) {
+      // if (a.z2 === b.z2) {
+      //     // FIXME Slow has renderidx compare
+      //     // http://stackoverflow.com/questions/20883421/sorting-in-javascript-should-every-compare-function-have-a-return-0-statement
+      //     // https://github.com/v8/v8/blob/47cce544a31ed5577ffe2963f67acb4144ee0232/src/js/array.js#L1012
+      //     return a.__renderidx - b.__renderidx;
+      // }
+      return a.z2 - b.z2;
+    }
+
+    return a.z - b.z;
+  }
+
+  return a.zlevel - b.zlevel;
+}
+/**
+ * 鍐呭浠撳簱 (M)
+ * @alias module:zrender/Storage
+ * @constructor
+ */
+
+
+var Storage = function () {
+  // jshint ignore:line
+  this._roots = [];
+  this._displayList = [];
+  this._displayListLen = 0;
+};
+
+Storage.prototype = {
+  constructor: Storage,
+
+  /**
+   * @param  {Function} cb
+   *
+   */
+  traverse: function (cb, context) {
+    for (var i = 0; i < this._roots.length; i++) {
+      this._roots[i].traverse(cb, context);
+    }
+  },
+
+  /**
+   * 杩斿洖鎵�鏈夊浘褰㈢殑缁樺埗闃熷垪
+   * @param {boolean} [update=false] 鏄惁鍦ㄨ繑鍥炲墠鏇存柊璇ユ暟缁�
+   * @param {boolean} [includeIgnore=false] 鏄惁鍖呭惈 ignore 鐨勬暟缁�, 鍦� update 涓� true 鐨勬椂鍊欐湁鏁�
+   *
+   * 璇﹁{@link module:zrender/graphic/Displayable.prototype.updateDisplayList}
+   * @return {Array.<module:zrender/graphic/Displayable>}
+   */
+  getDisplayList: function (update, includeIgnore) {
+    includeIgnore = includeIgnore || false;
+
+    if (update) {
+      this.updateDisplayList(includeIgnore);
+    }
+
+    return this._displayList;
+  },
+
+  /**
+   * 鏇存柊鍥惧舰鐨勭粯鍒堕槦鍒椼��
+   * 姣忔缁樺埗鍓嶉兘浼氳皟鐢紝璇ユ柟娉曚細鍏堟繁搴︿紭鍏堥亶鍘嗘暣涓爲锛屾洿鏂版墍鏈塆roup鍜孲hape鐨勫彉鎹㈠苟涓旀妸鎵�鏈夊彲瑙佺殑Shape淇濆瓨鍒版暟缁勪腑锛�
+   * 鏈�鍚庢牴鎹粯鍒剁殑浼樺厛绾э紙zlevel > z > 鎻掑叆椤哄簭锛夋帓搴忓緱鍒扮粯鍒堕槦鍒�
+   * @param {boolean} [includeIgnore=false] 鏄惁鍖呭惈 ignore 鐨勬暟缁�
+   */
+  updateDisplayList: function (includeIgnore) {
+    this._displayListLen = 0;
+    var roots = this._roots;
+    var displayList = this._displayList;
+
+    for (var i = 0, len = roots.length; i < len; i++) {
+      this._updateAndAddDisplayable(roots[i], null, includeIgnore);
+    }
+
+    displayList.length = this._displayListLen;
+    env$1.canvasSupported && sort(displayList, shapeCompareFunc);
+  },
+  _updateAndAddDisplayable: function (el, clipPaths, includeIgnore) {
+    if (el.ignore && !includeIgnore) {
+      return;
+    }
+
+    el.beforeUpdate();
+
+    if (el.__dirty) {
+      el.update();
+    }
+
+    el.afterUpdate();
+    var userSetClipPath = el.clipPath;
+
+    if (userSetClipPath) {
+      // FIXME 鏁堢巼褰卞搷
+      if (clipPaths) {
+        clipPaths = clipPaths.slice();
+      } else {
+        clipPaths = [];
+      }
+
+      var currentClipPath = userSetClipPath;
+      var parentClipPath = el; // Recursively add clip path
+
+      while (currentClipPath) {
+        // clipPath 鐨勫彉鎹㈡槸鍩轰簬浣跨敤杩欎釜 clipPath 鐨勫厓绱�
+        currentClipPath.parent = parentClipPath;
+        currentClipPath.updateTransform();
+        clipPaths.push(currentClipPath);
+        parentClipPath = currentClipPath;
+        currentClipPath = currentClipPath.clipPath;
+      }
+    }
+
+    if (el.isGroup) {
+      var children = el._children;
+
+      for (var i = 0; i < children.length; i++) {
+        var child = children[i]; // Force to mark as dirty if group is dirty
+        // FIXME __dirtyPath ?
+
+        if (el.__dirty) {
+          child.__dirty = true;
+        }
+
+        this._updateAndAddDisplayable(child, clipPaths, includeIgnore);
+      } // Mark group clean here
+
+
+      el.__dirty = false;
+    } else {
+      el.__clipPaths = clipPaths;
+      this._displayList[this._displayListLen++] = el;
+    }
+  },
+
+  /**
+   * 娣诲姞鍥惧舰(Shape)鎴栬�呯粍(Group)鍒版牴鑺傜偣
+   * @param {module:zrender/Element} el
+   */
+  addRoot: function (el) {
+    if (el.__storage === this) {
+      return;
+    }
+
+    if (el instanceof Group) {
+      el.addChildrenToStorage(this);
+    }
+
+    this.addToStorage(el);
+
+    this._roots.push(el);
+  },
+
+  /**
+   * 鍒犻櫎鎸囧畾鐨勫浘褰�(Shape)鎴栬�呯粍(Group)
+   * @param {string|Array.<string>} [el] 濡傛灉涓虹┖娓呯┖鏁翠釜Storage
+   */
+  delRoot: function (el) {
+    if (el == null) {
+      // 涓嶆寚瀹歟l娓呯┖
+      for (var i = 0; i < this._roots.length; i++) {
+        var root = this._roots[i];
+
+        if (root instanceof Group) {
+          root.delChildrenFromStorage(this);
+        }
+      }
+
+      this._roots = [];
+      this._displayList = [];
+      this._displayListLen = 0;
+      return;
+    }
+
+    if (el instanceof Array) {
+      for (var i = 0, l = el.length; i < l; i++) {
+        this.delRoot(el[i]);
+      }
+
+      return;
+    }
+
+    var idx = indexOf(this._roots, el);
+
+    if (idx >= 0) {
+      this.delFromStorage(el);
+
+      this._roots.splice(idx, 1);
+
+      if (el instanceof Group) {
+        el.delChildrenFromStorage(this);
+      }
+    }
+  },
+  addToStorage: function (el) {
+    if (el) {
+      el.__storage = this;
+      el.dirty(false);
+    }
+
+    return this;
+  },
+  delFromStorage: function (el) {
+    if (el) {
+      el.__storage = null;
+    }
+
+    return this;
+  },
+
+  /**
+   * 娓呯┖骞朵笖閲婃斁Storage
+   */
+  dispose: function () {
+    this._renderList = this._roots = null;
+  },
+  displayableSortFunc: shapeCompareFunc
+};
+
+var SHADOW_PROPS = {
+  'shadowBlur': 1,
+  'shadowOffsetX': 1,
+  'shadowOffsetY': 1,
+  'textShadowBlur': 1,
+  'textShadowOffsetX': 1,
+  'textShadowOffsetY': 1,
+  'textBoxShadowBlur': 1,
+  'textBoxShadowOffsetX': 1,
+  'textBoxShadowOffsetY': 1
+};
+var fixShadow = function (ctx, propName, value) {
+  if (SHADOW_PROPS.hasOwnProperty(propName)) {
+    return value *= ctx.dpr;
+  }
+
+  return value;
+};
+
+var STYLE_COMMON_PROPS = [['shadowBlur', 0], ['shadowOffsetX', 0], ['shadowOffsetY', 0], ['shadowColor', '#000'], ['lineCap', 'butt'], ['lineJoin', 'miter'], ['miterLimit', 10]]; // var SHADOW_PROPS = STYLE_COMMON_PROPS.slice(0, 4);
+// var LINE_PROPS = STYLE_COMMON_PROPS.slice(4);
+
+var Style = function (opts) {
+  this.extendFrom(opts, false);
+};
+
+function createLinearGradient(ctx, obj, rect) {
+  var x = obj.x == null ? 0 : obj.x;
+  var x2 = obj.x2 == null ? 1 : obj.x2;
+  var y = obj.y == null ? 0 : obj.y;
+  var y2 = obj.y2 == null ? 0 : obj.y2;
+
+  if (!obj.global) {
+    x = x * rect.width + rect.x;
+    x2 = x2 * rect.width + rect.x;
+    y = y * rect.height + rect.y;
+    y2 = y2 * rect.height + rect.y;
+  } // Fix NaN when rect is Infinity
+
+
+  x = isNaN(x) ? 0 : x;
+  x2 = isNaN(x2) ? 1 : x2;
+  y = isNaN(y) ? 0 : y;
+  y2 = isNaN(y2) ? 0 : y2;
+  var canvasGradient = ctx.createLinearGradient(x, y, x2, y2);
+  return canvasGradient;
+}
+
+function createRadialGradient(ctx, obj, rect) {
+  var width = rect.width;
+  var height = rect.height;
+  var min = Math.min(width, height);
+  var x = obj.x == null ? 0.5 : obj.x;
+  var y = obj.y == null ? 0.5 : obj.y;
+  var r = obj.r == null ? 0.5 : obj.r;
+
+  if (!obj.global) {
+    x = x * width + rect.x;
+    y = y * height + rect.y;
+    r = r * min;
+  }
+
+  var canvasGradient = ctx.createRadialGradient(x, y, 0, x, y, r);
+  return canvasGradient;
+}
+
+Style.prototype = {
+  constructor: Style,
+
+  /**
+   * @type {string}
+   */
+  fill: '#000',
+
+  /**
+   * @type {string}
+   */
+  stroke: null,
+
+  /**
+   * @type {number}
+   */
+  opacity: 1,
+
+  /**
+   * @type {number}
+   */
+  fillOpacity: null,
+
+  /**
+   * @type {number}
+   */
+  strokeOpacity: null,
+
+  /**
+   * @type {Array.<number>}
+   */
+  lineDash: null,
+
+  /**
+   * @type {number}
+   */
+  lineDashOffset: 0,
+
+  /**
+   * @type {number}
+   */
+  shadowBlur: 0,
+
+  /**
+   * @type {number}
+   */
+  shadowOffsetX: 0,
+
+  /**
+   * @type {number}
+   */
+  shadowOffsetY: 0,
+
+  /**
+   * @type {number}
+   */
+  lineWidth: 1,
+
+  /**
+   * If stroke ignore scale
+   * @type {Boolean}
+   */
+  strokeNoScale: false,
+  // Bounding rect text configuration
+  // Not affected by element transform
+
+  /**
+   * @type {string}
+   */
+  text: null,
+
+  /**
+   * If `fontSize` or `fontFamily` exists, `font` will be reset by
+   * `fontSize`, `fontStyle`, `fontWeight`, `fontFamily`.
+   * So do not visit it directly in upper application (like echarts),
+   * but use `contain/text#makeFont` instead.
+   * @type {string}
+   */
+  font: null,
+
+  /**
+   * The same as font. Use font please.
+   * @deprecated
+   * @type {string}
+   */
+  textFont: null,
+
+  /**
+   * It helps merging respectively, rather than parsing an entire font string.
+   * @type {string}
+   */
+  fontStyle: null,
+
+  /**
+   * It helps merging respectively, rather than parsing an entire font string.
+   * @type {string}
+   */
+  fontWeight: null,
+
+  /**
+   * It helps merging respectively, rather than parsing an entire font string.
+   * Should be 12 but not '12px'.
+   * @type {number}
+   */
+  fontSize: null,
+
+  /**
+   * It helps merging respectively, rather than parsing an entire font string.
+   * @type {string}
+   */
+  fontFamily: null,
+
+  /**
+   * Reserved for special functinality, like 'hr'.
+   * @type {string}
+   */
+  textTag: null,
+
+  /**
+   * @type {string}
+   */
+  textFill: '#000',
+
+  /**
+   * @type {string}
+   */
+  textStroke: null,
+
+  /**
+   * @type {number}
+   */
+  textWidth: null,
+
+  /**
+   * Only for textBackground.
+   * @type {number}
+   */
+  textHeight: null,
+
+  /**
+   * textStroke may be set as some color as a default
+   * value in upper applicaion, where the default value
+   * of textStrokeWidth should be 0 to make sure that
+   * user can choose to do not use text stroke.
+   * @type {number}
+   */
+  textStrokeWidth: 0,
+
+  /**
+   * @type {number}
+   */
+  textLineHeight: null,
+
+  /**
+   * 'inside', 'left', 'right', 'top', 'bottom'
+   * [x, y]
+   * Based on x, y of rect.
+   * @type {string|Array.<number>}
+   * @default 'inside'
+   */
+  textPosition: 'inside',
+
+  /**
+   * If not specified, use the boundingRect of a `displayable`.
+   * @type {Object}
+   */
+  textRect: null,
+
+  /**
+   * [x, y]
+   * @type {Array.<number>}
+   */
+  textOffset: null,
+
+  /**
+   * @type {string}
+   */
+  textAlign: null,
+
+  /**
+   * @type {string}
+   */
+  textVerticalAlign: null,
+
+  /**
+   * @type {number}
+   */
+  textDistance: 5,
+
+  /**
+   * @type {string}
+   */
+  textShadowColor: 'transparent',
+
+  /**
+   * @type {number}
+   */
+  textShadowBlur: 0,
+
+  /**
+   * @type {number}
+   */
+  textShadowOffsetX: 0,
+
+  /**
+   * @type {number}
+   */
+  textShadowOffsetY: 0,
+
+  /**
+   * @type {string}
+   */
+  textBoxShadowColor: 'transparent',
+
+  /**
+   * @type {number}
+   */
+  textBoxShadowBlur: 0,
+
+  /**
+   * @type {number}
+   */
+  textBoxShadowOffsetX: 0,
+
+  /**
+   * @type {number}
+   */
+  textBoxShadowOffsetY: 0,
+
+  /**
+   * Whether transform text.
+   * Only useful in Path and Image element
+   * @type {boolean}
+   */
+  transformText: false,
+
+  /**
+   * Text rotate around position of Path or Image
+   * Only useful in Path and Image element and transformText is false.
+   */
+  textRotation: 0,
+
+  /**
+   * Text origin of text rotation, like [10, 40].
+   * Based on x, y of rect.
+   * Useful in label rotation of circular symbol.
+   * By default, this origin is textPosition.
+   * Can be 'center'.
+   * @type {string|Array.<number>}
+   */
+  textOrigin: null,
+
+  /**
+   * @type {string}
+   */
+  textBackgroundColor: null,
+
+  /**
+   * @type {string}
+   */
+  textBorderColor: null,
+
+  /**
+   * @type {number}
+   */
+  textBorderWidth: 0,
+
+  /**
+   * @type {number}
+   */
+  textBorderRadius: 0,
+
+  /**
+   * Can be `2` or `[2, 4]` or `[2, 3, 4, 5]`
+   * @type {number|Array.<number>}
+   */
+  textPadding: null,
+
+  /**
+   * Text styles for rich text.
+   * @type {Object}
+   */
+  rich: null,
+
+  /**
+   * {outerWidth, outerHeight, ellipsis, placeholder}
+   * @type {Object}
+   */
+  truncate: null,
+
+  /**
+   * https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation
+   * @type {string}
+   */
+  blend: null,
+
+  /**
+   * @param {CanvasRenderingContext2D} ctx
+   */
+  bind: function (ctx, el, prevEl) {
+    var style = this;
+    var prevStyle = prevEl && prevEl.style;
+    var firstDraw = !prevStyle;
+
+    for (var i = 0; i < STYLE_COMMON_PROPS.length; i++) {
+      var prop = STYLE_COMMON_PROPS[i];
+      var styleName = prop[0];
+
+      if (firstDraw || style[styleName] !== prevStyle[styleName]) {
+        // FIXME Invalid property value will cause style leak from previous element.
+        ctx[styleName] = fixShadow(ctx, styleName, style[styleName] || prop[1]);
+      }
+    }
+
+    if (firstDraw || style.fill !== prevStyle.fill) {
+      ctx.fillStyle = style.fill;
+    }
+
+    if (firstDraw || style.stroke !== prevStyle.stroke) {
+      ctx.strokeStyle = style.stroke;
+    }
+
+    if (firstDraw || style.opacity !== prevStyle.opacity) {
+      ctx.globalAlpha = style.opacity == null ? 1 : style.opacity;
+    }
+
+    if (firstDraw || style.blend !== prevStyle.blend) {
+      ctx.globalCompositeOperation = style.blend || 'source-over';
+    }
+
+    if (this.hasStroke()) {
+      var lineWidth = style.lineWidth;
+      ctx.lineWidth = lineWidth / (this.strokeNoScale && el && el.getLineScale ? el.getLineScale() : 1);
+    }
+  },
+  hasFill: function () {
+    var fill = this.fill;
+    return fill != null && fill !== 'none';
+  },
+  hasStroke: function () {
+    var stroke = this.stroke;
+    return stroke != null && stroke !== 'none' && this.lineWidth > 0;
+  },
+
+  /**
+   * Extend from other style
+   * @param {zrender/graphic/Style} otherStyle
+   * @param {boolean} overwrite true: overwrirte any way.
+   *                            false: overwrite only when !target.hasOwnProperty
+   *                            others: overwrite when property is not null/undefined.
+   */
+  extendFrom: function (otherStyle, overwrite) {
+    if (otherStyle) {
+      for (var name in otherStyle) {
+        if (otherStyle.hasOwnProperty(name) && (overwrite === true || (overwrite === false ? !this.hasOwnProperty(name) : otherStyle[name] != null))) {
+          this[name] = otherStyle[name];
+        }
+      }
+    }
+  },
+
+  /**
+   * Batch setting style with a given object
+   * @param {Object|string} obj
+   * @param {*} [obj]
+   */
+  set: function (obj, value) {
+    if (typeof obj === 'string') {
+      this[obj] = value;
+    } else {
+      this.extendFrom(obj, true);
+    }
+  },
+
+  /**
+   * Clone
+   * @return {zrender/graphic/Style} [description]
+   */
+  clone: function () {
+    var newStyle = new this.constructor();
+    newStyle.extendFrom(this, true);
+    return newStyle;
+  },
+  getGradient: function (ctx, obj, rect) {
+    var method = obj.type === 'radial' ? createRadialGradient : createLinearGradient;
+    var canvasGradient = method(ctx, obj, rect);
+    var colorStops = obj.colorStops;
+
+    for (var i = 0; i < colorStops.length; i++) {
+      canvasGradient.addColorStop(colorStops[i].offset, colorStops[i].color);
+    }
+
+    return canvasGradient;
+  }
+};
+var styleProto = Style.prototype;
+
+for (var i = 0; i < STYLE_COMMON_PROPS.length; i++) {
+  var prop = STYLE_COMMON_PROPS[i];
+
+  if (!(prop[0] in styleProto)) {
+    styleProto[prop[0]] = prop[1];
+  }
+} // Provide for others
+
+
+Style.getGradient = styleProto.getGradient;
+
+var Pattern = function (image, repeat) {
+  // Should do nothing more in this constructor. Because gradient can be
+  // declard by `color: {image: ...}`, where this constructor will not be called.
+  this.image = image;
+  this.repeat = repeat; // Can be cloned
+
+  this.type = 'pattern';
+};
+
+Pattern.prototype.getCanvasPattern = function (ctx) {
+  return ctx.createPattern(this.image, this.repeat || 'repeat');
+};
+
+/**
+ * @module zrender/Layer
+ * @author pissang(https://www.github.com/pissang)
+ */
+function returnFalse() {
+  return false;
+}
+/**
+ * 鍒涘缓dom
+ *
+ * @inner
+ * @param {string} id dom id 寰呯敤
+ * @param {Painter} painter painter instance
+ * @param {number} number
+ */
+
+
+function createDom(id, painter, dpr) {
+  var newDom = createCanvas();
+  var width = painter.getWidth();
+  var height = painter.getHeight();
+  var newDomStyle = newDom.style;
+
+  if (newDomStyle) {
+    // In node or some other non-browser environment
+    newDomStyle.position = 'absolute';
+    newDomStyle.left = 0;
+    newDomStyle.top = 0;
+    newDomStyle.width = width + 'px';
+    newDomStyle.height = height + 'px';
+    newDom.setAttribute('data-zr-dom-id', id);
+  }
+
+  newDom.width = width * dpr;
+  newDom.height = height * dpr;
+  return newDom;
+}
+/**
+ * @alias module:zrender/Layer
+ * @constructor
+ * @extends module:zrender/mixin/Transformable
+ * @param {string} id
+ * @param {module:zrender/Painter} painter
+ * @param {number} [dpr]
+ */
+
+
+var Layer = function (id, painter, dpr) {
+  var dom;
+  dpr = dpr || devicePixelRatio;
+
+  if (typeof id === 'string') {
+    dom = createDom(id, painter, dpr);
+  } // Not using isDom because in node it will return false
+  else if (isObject$1(id)) {
+      dom = id;
+      id = dom.id;
+    }
+
+  this.id = id;
+  this.dom = dom;
+  var domStyle = dom.style;
+
+  if (domStyle) {
+    // Not in node
+    dom.onselectstart = returnFalse; // 閬垮厤椤甸潰閫変腑鐨勫按灏�
+
+    domStyle['-webkit-user-select'] = 'none';
+    domStyle['user-select'] = 'none';
+    domStyle['-webkit-touch-callout'] = 'none';
+    domStyle['-webkit-tap-highlight-color'] = 'rgba(0,0,0,0)';
+    domStyle['padding'] = 0;
+    domStyle['margin'] = 0;
+    domStyle['border-width'] = 0;
+  }
+
+  this.domBack = null;
+  this.ctxBack = null;
+  this.painter = painter;
+  this.config = null; // Configs
+
+  /**
+   * 姣忔娓呯┖鐢诲竷鐨勯鑹�
+   * @type {string}
+   * @default 0
+   */
+
+  this.clearColor = 0;
+  /**
+   * 鏄惁寮�鍚姩鎬佹ā绯�
+   * @type {boolean}
+   * @default false
+   */
+
+  this.motionBlur = false;
+  /**
+   * 鍦ㄥ紑鍚姩鎬佹ā绯婄殑鏃跺�欎娇鐢紝涓庝笂涓�甯ф贩鍚堢殑alpha鍊硷紝鍊艰秺澶у熬杩硅秺鏄庢樉
+   * @type {number}
+   * @default 0.7
+   */
+
+  this.lastFrameAlpha = 0.7;
+  /**
+   * Layer dpr
+   * @type {number}
+   */
+
+  this.dpr = dpr;
+};
+
+Layer.prototype = {
+  constructor: Layer,
+  __dirty: true,
+  __used: false,
+  __drawIndex: 0,
+  __startIndex: 0,
+  __endIndex: 0,
+  incremental: false,
+  getElementCount: function () {
+    return this.__endIndex - this.__startIndex;
+  },
+  initContext: function () {
+    this.ctx = this.dom.getContext('2d');
+    this.ctx.dpr = this.dpr;
+  },
+  createBackBuffer: function () {
+    var dpr = this.dpr;
+    this.domBack = createDom('back-' + this.id, this.painter, dpr);
+    this.ctxBack = this.domBack.getContext('2d');
+
+    if (dpr != 1) {
+      this.ctxBack.scale(dpr, dpr);
+    }
+  },
+
+  /**
+   * @param  {number} width
+   * @param  {number} height
+   */
+  resize: function (width, height) {
+    var dpr = this.dpr;
+    var dom = this.dom;
+    var domStyle = dom.style;
+    var domBack = this.domBack;
+
+    if (domStyle) {
+      domStyle.width = width + 'px';
+      domStyle.height = height + 'px';
+    }
+
+    dom.width = width * dpr;
+    dom.height = height * dpr;
+
+    if (domBack) {
+      domBack.width = width * dpr;
+      domBack.height = height * dpr;
+
+      if (dpr != 1) {
+        this.ctxBack.scale(dpr, dpr);
+      }
+    }
+  },
+
+  /**
+   * 娓呯┖璇ュ眰鐢诲竷
+   * @param {boolean} [clearAll]=false Clear all with out motion blur
+   * @param {Color} [clearColor]
+   */
+  clear: function (clearAll, clearColor) {
+    var dom = this.dom;
+    var ctx = this.ctx;
+    var width = dom.width;
+    var height = dom.height;
+    var clearColor = clearColor || this.clearColor;
+    var haveMotionBLur = this.motionBlur && !clearAll;
+    var lastFrameAlpha = this.lastFrameAlpha;
+    var dpr = this.dpr;
+
+    if (haveMotionBLur) {
+      if (!this.domBack) {
+        this.createBackBuffer();
+      }
+
+      this.ctxBack.globalCompositeOperation = 'copy';
+      this.ctxBack.drawImage(dom, 0, 0, width / dpr, height / dpr);
+    }
+
+    ctx.clearRect(0, 0, width, height);
+
+    if (clearColor && clearColor !== 'transparent') {
+      var clearColorGradientOrPattern; // Gradient
+
+      if (clearColor.colorStops) {
+        // Cache canvas gradient
+        clearColorGradientOrPattern = clearColor.__canvasGradient || Style.getGradient(ctx, clearColor, {
+          x: 0,
+          y: 0,
+          width: width,
+          height: height
+        });
+        clearColor.__canvasGradient = clearColorGradientOrPattern;
+      } // Pattern
+      else if (clearColor.image) {
+          clearColorGradientOrPattern = Pattern.prototype.getCanvasPattern.call(clearColor, ctx);
+        }
+
+      ctx.save();
+      ctx.fillStyle = clearColorGradientOrPattern || clearColor;
+      ctx.fillRect(0, 0, width, height);
+      ctx.restore();
+    }
+
+    if (haveMotionBLur) {
+      var domBack = this.domBack;
+      ctx.save();
+      ctx.globalAlpha = lastFrameAlpha;
+      ctx.drawImage(domBack, 0, 0, width, height);
+      ctx.restore();
+    }
+  }
+};
+
+var requestAnimationFrame = typeof window !== 'undefined' && (window.requestAnimationFrame && window.requestAnimationFrame.bind(window) || // https://github.com/ecomfe/zrender/issues/189#issuecomment-224919809
+window.msRequestAnimationFrame && window.msRequestAnimationFrame.bind(window) || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame) || function (func) {
+  setTimeout(func, 16);
+};
+
+var globalImageCache = new LRU(50);
+/**
+ * @param {string|HTMLImageElement|HTMLCanvasElement|Canvas} newImageOrSrc
+ * @return {HTMLImageElement|HTMLCanvasElement|Canvas} image
+ */
+
+function findExistImage(newImageOrSrc) {
+  if (typeof newImageOrSrc === 'string') {
+    var cachedImgObj = globalImageCache.get(newImageOrSrc);
+    return cachedImgObj && cachedImgObj.image;
+  } else {
+    return newImageOrSrc;
+  }
+}
+/**
+ * Caution: User should cache loaded images, but not just count on LRU.
+ * Consider if required images more than LRU size, will dead loop occur?
+ *
+ * @param {string|HTMLImageElement|HTMLCanvasElement|Canvas} newImageOrSrc
+ * @param {HTMLImageElement|HTMLCanvasElement|Canvas} image Existent image.
+ * @param {module:zrender/Element} [hostEl] For calling `dirty`.
+ * @param {Function} [cb] params: (image, cbPayload)
+ * @param {Object} [cbPayload] Payload on cb calling.
+ * @return {HTMLImageElement|HTMLCanvasElement|Canvas} image
+ */
+
+function createOrUpdateImage(newImageOrSrc, image, hostEl, cb, cbPayload) {
+  if (!newImageOrSrc) {
+    return image;
+  } else if (typeof newImageOrSrc === 'string') {
+    // Image should not be loaded repeatly.
+    if (image && image.__zrImageSrc === newImageOrSrc || !hostEl) {
+      return image;
+    } // Only when there is no existent image or existent image src
+    // is different, this method is responsible for load.
+
+
+    var cachedImgObj = globalImageCache.get(newImageOrSrc);
+    var pendingWrap = {
+      hostEl: hostEl,
+      cb: cb,
+      cbPayload: cbPayload
+    };
+
+    if (cachedImgObj) {
+      image = cachedImgObj.image;
+      !isImageReady(image) && cachedImgObj.pending.push(pendingWrap);
+    } else {
+      !image && (image = new Image());
+      image.onload = image.onerror = imageOnLoad;
+      globalImageCache.put(newImageOrSrc, image.__cachedImgObj = {
+        image: image,
+        pending: [pendingWrap]
+      });
+      image.src = image.__zrImageSrc = newImageOrSrc;
+    }
+
+    return image;
+  } // newImageOrSrc is an HTMLImageElement or HTMLCanvasElement or Canvas
+  else {
+      return newImageOrSrc;
+    }
+}
+
+function imageOnLoad() {
+  var cachedImgObj = this.__cachedImgObj;
+  this.onload = this.onerror = this.__cachedImgObj = null;
+
+  for (var i = 0; i < cachedImgObj.pending.length; i++) {
+    var pendingWrap = cachedImgObj.pending[i];
+    var cb = pendingWrap.cb;
+    cb && cb(this, pendingWrap.cbPayload);
+    pendingWrap.hostEl.dirty();
+  }
+
+  cachedImgObj.pending.length = 0;
+}
+
+function isImageReady(image) {
+  return image && image.width && image.height;
+}
+
+var textWidthCache = {};
+var textWidthCacheCounter = 0;
+var TEXT_CACHE_MAX = 5000;
+var STYLE_REG = /\{([a-zA-Z0-9_]+)\|([^}]*)\}/g;
+var DEFAULT_FONT = '12px sans-serif'; // Avoid assign to an exported variable, for transforming to cjs.
+
+var methods$1 = {};
+function $override$1(name, fn) {
+  methods$1[name] = fn;
+}
+/**
+ * @public
+ * @param {string} text
+ * @param {string} font
+ * @return {number} width
+ */
+
+function getWidth(text, font) {
+  font = font || DEFAULT_FONT;
+  var key = text + ':' + font;
+
+  if (textWidthCache[key]) {
+    return textWidthCache[key];
+  }
+
+  var textLines = (text + '').split('\n');
+  var width = 0;
+
+  for (var i = 0, l = textLines.length; i < l; i++) {
+    // textContain.measureText may be overrided in SVG or VML
+    width = Math.max(measureText(textLines[i], font).width, width);
+  }
+
+  if (textWidthCacheCounter > TEXT_CACHE_MAX) {
+    textWidthCacheCounter = 0;
+    textWidthCache = {};
+  }
+
+  textWidthCacheCounter++;
+  textWidthCache[key] = width;
+  return width;
+}
+/**
+ * @public
+ * @param {string} text
+ * @param {string} font
+ * @param {string} [textAlign='left']
+ * @param {string} [textVerticalAlign='top']
+ * @param {Array.<number>} [textPadding]
+ * @param {Object} [rich]
+ * @param {Object} [truncate]
+ * @return {Object} {x, y, width, height, lineHeight}
+ */
+
+function getBoundingRect(text, font, textAlign, textVerticalAlign, textPadding, rich, truncate) {
+  return rich ? getRichTextRect(text, font, textAlign, textVerticalAlign, textPadding, rich, truncate) : getPlainTextRect(text, font, textAlign, textVerticalAlign, textPadding, truncate);
+}
+
+function getPlainTextRect(text, font, textAlign, textVerticalAlign, textPadding, truncate) {
+  var contentBlock = parsePlainText(text, font, textPadding, truncate);
+  var outerWidth = getWidth(text, font);
+
+  if (textPadding) {
+    outerWidth += textPadding[1] + textPadding[3];
+  }
+
+  var outerHeight = contentBlock.outerHeight;
+  var x = adjustTextX(0, outerWidth, textAlign);
+  var y = adjustTextY(0, outerHeight, textVerticalAlign);
+  var rect = new BoundingRect(x, y, outerWidth, outerHeight);
+  rect.lineHeight = contentBlock.lineHeight;
+  return rect;
+}
+
+function getRichTextRect(text, font, textAlign, textVerticalAlign, textPadding, rich, truncate) {
+  var contentBlock = parseRichText(text, {
+    rich: rich,
+    truncate: truncate,
+    font: font,
+    textAlign: textAlign,
+    textPadding: textPadding
+  });
+  var outerWidth = contentBlock.outerWidth;
+  var outerHeight = contentBlock.outerHeight;
+  var x = adjustTextX(0, outerWidth, textAlign);
+  var y = adjustTextY(0, outerHeight, textVerticalAlign);
+  return new BoundingRect(x, y, outerWidth, outerHeight);
+}
+/**
+ * @public
+ * @param {number} x
+ * @param {number} width
+ * @param {string} [textAlign='left']
+ * @return {number} Adjusted x.
+ */
+
+
+function adjustTextX(x, width, textAlign) {
+  // FIXME Right to left language
+  if (textAlign === 'right') {
+    x -= width;
+  } else if (textAlign === 'center') {
+    x -= width / 2;
+  }
+
+  return x;
+}
+/**
+ * @public
+ * @param {number} y
+ * @param {number} height
+ * @param {string} [textVerticalAlign='top']
+ * @return {number} Adjusted y.
+ */
+
+function adjustTextY(y, height, textVerticalAlign) {
+  if (textVerticalAlign === 'middle') {
+    y -= height / 2;
+  } else if (textVerticalAlign === 'bottom') {
+    y -= height;
+  }
+
+  return y;
+}
+/**
+ * @public
+ * @param {stirng} textPosition
+ * @param {Object} rect {x, y, width, height}
+ * @param {number} distance
+ * @return {Object} {x, y, textAlign, textVerticalAlign}
+ */
+
+function adjustTextPositionOnRect(textPosition, rect, distance) {
+  var x = rect.x;
+  var y = rect.y;
+  var height = rect.height;
+  var width = rect.width;
+  var halfHeight = height / 2;
+  var textAlign = 'left';
+  var textVerticalAlign = 'top';
+
+  switch (textPosition) {
+    case 'left':
+      x -= distance;
+      y += halfHeight;
+      textAlign = 'right';
+      textVerticalAlign = 'middle';
+      break;
+
+    case 'right':
+      x += distance + width;
+      y += halfHeight;
+      textVerticalAlign = 'middle';
+      break;
+
+    case 'top':
+      x += width / 2;
+      y -= distance;
+      textAlign = 'center';
+      textVerticalAlign = 'bottom';
+      break;
+
+    case 'bottom':
+      x += width / 2;
+      y += height + distance;
+      textAlign = 'center';
+      break;
+
+    case 'inside':
+      x += width / 2;
+      y += halfHeight;
+      textAlign = 'center';
+      textVerticalAlign = 'middle';
+      break;
+
+    case 'insideLeft':
+      x += distance;
+      y += halfHeight;
+      textVerticalAlign = 'middle';
+      break;
+
+    case 'insideRight':
+      x += width - distance;
+      y += halfHeight;
+      textAlign = 'right';
+      textVerticalAlign = 'middle';
+      break;
+
+    case 'insideTop':
+      x += width / 2;
+      y += distance;
+      textAlign = 'center';
+      break;
+
+    case 'insideBottom':
+      x += width / 2;
+      y += height - distance;
+      textAlign = 'center';
+      textVerticalAlign = 'bottom';
+      break;
+
+    case 'insideTopLeft':
+      x += distance;
+      y += distance;
+      break;
+
+    case 'insideTopRight':
+      x += width - distance;
+      y += distance;
+      textAlign = 'right';
+      break;
+
+    case 'insideBottomLeft':
+      x += distance;
+      y += height - distance;
+      textVerticalAlign = 'bottom';
+      break;
+
+    case 'insideBottomRight':
+      x += width - distance;
+      y += height - distance;
+      textAlign = 'right';
+      textVerticalAlign = 'bottom';
+      break;
+  }
+
+  return {
+    x: x,
+    y: y,
+    textAlign: textAlign,
+    textVerticalAlign: textVerticalAlign
+  };
+}
+/**
+ * Show ellipsis if overflow.
+ *
+ * @public
+ * @param  {string} text
+ * @param  {string} containerWidth
+ * @param  {string} font
+ * @param  {number} [ellipsis='...']
+ * @param  {Object} [options]
+ * @param  {number} [options.maxIterations=3]
+ * @param  {number} [options.minChar=0] If truncate result are less
+ *                  then minChar, ellipsis will not show, which is
+ *                  better for user hint in some cases.
+ * @param  {number} [options.placeholder=''] When all truncated, use the placeholder.
+ * @return {string}
+ */
+
+function truncateText(text, containerWidth, font, ellipsis, options) {
+  if (!containerWidth) {
+    return '';
+  }
+
+  var textLines = (text + '').split('\n');
+  options = prepareTruncateOptions(containerWidth, font, ellipsis, options); // FIXME
+  // It is not appropriate that every line has '...' when truncate multiple lines.
+
+  for (var i = 0, len = textLines.length; i < len; i++) {
+    textLines[i] = truncateSingleLine(textLines[i], options);
+  }
+
+  return textLines.join('\n');
+}
+
+function prepareTruncateOptions(containerWidth, font, ellipsis, options) {
+  options = extend({}, options);
+  options.font = font;
+  var ellipsis = retrieve2(ellipsis, '...');
+  options.maxIterations = retrieve2(options.maxIterations, 2);
+  var minChar = options.minChar = retrieve2(options.minChar, 0); // FIXME
+  // Other languages?
+
+  options.cnCharWidth = getWidth('鍥�', font); // FIXME
+  // Consider proportional font?
+
+  var ascCharWidth = options.ascCharWidth = getWidth('a', font);
+  options.placeholder = retrieve2(options.placeholder, ''); // Example 1: minChar: 3, text: 'asdfzxcv', truncate result: 'asdf', but not: 'a...'.
+  // Example 2: minChar: 3, text: '缁村害', truncate result: '缁�', but not: '...'.
+
+  var contentWidth = containerWidth = Math.max(0, containerWidth - 1); // Reserve some gap.
+
+  for (var i = 0; i < minChar && contentWidth >= ascCharWidth; i++) {
+    contentWidth -= ascCharWidth;
+  }
+
+  var ellipsisWidth = getWidth(ellipsis);
+
+  if (ellipsisWidth > contentWidth) {
+    ellipsis = '';
+    ellipsisWidth = 0;
+  }
+
+  contentWidth = containerWidth - ellipsisWidth;
+  options.ellipsis = ellipsis;
+  options.ellipsisWidth = ellipsisWidth;
+  options.contentWidth = contentWidth;
+  options.containerWidth = containerWidth;
+  return options;
+}
+
+function truncateSingleLine(textLine, options) {
+  var containerWidth = options.containerWidth;
+  var font = options.font;
+  var contentWidth = options.contentWidth;
+
+  if (!containerWidth) {
+    return '';
+  }
+
+  var lineWidth = getWidth(textLine, font);
+
+  if (lineWidth <= containerWidth) {
+    return textLine;
+  }
+
+  for (var j = 0;; j++) {
+    if (lineWidth <= contentWidth || j >= options.maxIterations) {
+      textLine += options.ellipsis;
+      break;
+    }
+
+    var subLength = j === 0 ? estimateLength(textLine, contentWidth, options.ascCharWidth, options.cnCharWidth) : lineWidth > 0 ? Math.floor(textLine.length * contentWidth / lineWidth) : 0;
+    textLine = textLine.substr(0, subLength);
+    lineWidth = getWidth(textLine, font);
+  }
+
+  if (textLine === '') {
+    textLine = options.placeholder;
+  }
+
+  return textLine;
+}
+
+function estimateLength(text, contentWidth, ascCharWidth, cnCharWidth) {
+  var width = 0;
+  var i = 0;
+
+  for (var len = text.length; i < len && width < contentWidth; i++) {
+    var charCode = text.charCodeAt(i);
+    width += 0 <= charCode && charCode <= 127 ? ascCharWidth : cnCharWidth;
+  }
+
+  return i;
+}
+/**
+ * @public
+ * @param {string} font
+ * @return {number} line height
+ */
+
+
+function getLineHeight(font) {
+  // FIXME A rough approach.
+  return getWidth('鍥�', font);
+}
+/**
+ * @public
+ * @param {string} text
+ * @param {string} font
+ * @return {Object} width
+ */
+
+function measureText(text, font) {
+  return methods$1.measureText(text, font);
+} // Avoid assign to an exported variable, for transforming to cjs.
+
+methods$1.measureText = function (text, font) {
+  var ctx = getContext();
+  ctx.font = font || DEFAULT_FONT;
+  return ctx.measureText(text);
+};
+/**
+ * @public
+ * @param {string} text
+ * @param {string} font
+ * @param {Object} [truncate]
+ * @return {Object} block: {lineHeight, lines, height, outerHeight}
+ *  Notice: for performance, do not calculate outerWidth util needed.
+ */
+
+
+function parsePlainText(text, font, padding, truncate) {
+  text != null && (text += '');
+  var lineHeight = getLineHeight(font);
+  var lines = text ? text.split('\n') : [];
+  var height = lines.length * lineHeight;
+  var outerHeight = height;
+
+  if (padding) {
+    outerHeight += padding[0] + padding[2];
+  }
+
+  if (text && truncate) {
+    var truncOuterHeight = truncate.outerHeight;
+    var truncOuterWidth = truncate.outerWidth;
+
+    if (truncOuterHeight != null && outerHeight > truncOuterHeight) {
+      text = '';
+      lines = [];
+    } else if (truncOuterWidth != null) {
+      var options = prepareTruncateOptions(truncOuterWidth - (padding ? padding[1] + padding[3] : 0), font, truncate.ellipsis, {
+        minChar: truncate.minChar,
+        placeholder: truncate.placeholder
+      }); // FIXME
+      // It is not appropriate that every line has '...' when truncate multiple lines.
+
+      for (var i = 0, len = lines.length; i < len; i++) {
+        lines[i] = truncateSingleLine(lines[i], options);
+      }
+    }
+  }
+
+  return {
+    lines: lines,
+    height: height,
+    outerHeight: outerHeight,
+    lineHeight: lineHeight
+  };
+}
+/**
+ * For example: 'some text {a|some text}other text{b|some text}xxx{c|}xxx'
+ * Also consider 'bbbb{a|xxx\nzzz}xxxx\naaaa'.
+ *
+ * @public
+ * @param {string} text
+ * @param {Object} style
+ * @return {Object} block
+ * {
+ *      width,
+ *      height,
+ *      lines: [{
+ *          lineHeight,
+ *          width,
+ *          tokens: [[{
+ *              styleName,
+ *              text,
+ *              width,      // include textPadding
+ *              height,     // include textPadding
+ *              textWidth, // pure text width
+ *              textHeight, // pure text height
+ *              lineHeihgt,
+ *              font,
+ *              textAlign,
+ *              textVerticalAlign
+ *          }], [...], ...]
+ *      }, ...]
+ * }
+ * If styleName is undefined, it is plain text.
+ */
+
+function parseRichText(text, style) {
+  var contentBlock = {
+    lines: [],
+    width: 0,
+    height: 0
+  };
+  text != null && (text += '');
+
+  if (!text) {
+    return contentBlock;
+  }
+
+  var lastIndex = STYLE_REG.lastIndex = 0;
+  var result;
+
+  while ((result = STYLE_REG.exec(text)) != null) {
+    var matchedIndex = result.index;
+
+    if (matchedIndex > lastIndex) {
+      pushTokens(contentBlock, text.substring(lastIndex, matchedIndex));
+    }
+
+    pushTokens(contentBlock, result[2], result[1]);
+    lastIndex = STYLE_REG.lastIndex;
+  }
+
+  if (lastIndex < text.length) {
+    pushTokens(contentBlock, text.substring(lastIndex, text.length));
+  }
+
+  var lines = contentBlock.lines;
+  var contentHeight = 0;
+  var contentWidth = 0; // For `textWidth: 100%`
+
+  var pendingList = [];
+  var stlPadding = style.textPadding;
+  var truncate = style.truncate;
+  var truncateWidth = truncate && truncate.outerWidth;
+  var truncateHeight = truncate && truncate.outerHeight;
+
+  if (stlPadding) {
+    truncateWidth != null && (truncateWidth -= stlPadding[1] + stlPadding[3]);
+    truncateHeight != null && (truncateHeight -= stlPadding[0] + stlPadding[2]);
+  } // Calculate layout info of tokens.
+
+
+  for (var i = 0; i < lines.length; i++) {
+    var line = lines[i];
+    var lineHeight = 0;
+    var lineWidth = 0;
+
+    for (var j = 0; j < line.tokens.length; j++) {
+      var token = line.tokens[j];
+      var tokenStyle = token.styleName && style.rich[token.styleName] || {}; // textPadding should not inherit from style.
+
+      var textPadding = token.textPadding = tokenStyle.textPadding; // textFont has been asigned to font by `normalizeStyle`.
+
+      var font = token.font = tokenStyle.font || style.font; // textHeight can be used when textVerticalAlign is specified in token.
+
+      var tokenHeight = token.textHeight = retrieve2( // textHeight should not be inherited, consider it can be specified
+      // as box height of the block.
+      tokenStyle.textHeight, getLineHeight(font));
+      textPadding && (tokenHeight += textPadding[0] + textPadding[2]);
+      token.height = tokenHeight;
+      token.lineHeight = retrieve3(tokenStyle.textLineHeight, style.textLineHeight, tokenHeight);
+      token.textAlign = tokenStyle && tokenStyle.textAlign || style.textAlign;
+      token.textVerticalAlign = tokenStyle && tokenStyle.textVerticalAlign || 'middle';
+
+      if (truncateHeight != null && contentHeight + token.lineHeight > truncateHeight) {
+        return {
+          lines: [],
+          width: 0,
+          height: 0
+        };
+      }
+
+      token.textWidth = getWidth(token.text, font);
+      var tokenWidth = tokenStyle.textWidth;
+      var tokenWidthNotSpecified = tokenWidth == null || tokenWidth === 'auto'; // Percent width, can be `100%`, can be used in drawing separate
+      // line when box width is needed to be auto.
+
+      if (typeof tokenWidth === 'string' && tokenWidth.charAt(tokenWidth.length - 1) === '%') {
+        token.percentWidth = tokenWidth;
+        pendingList.push(token);
+        tokenWidth = 0; // Do not truncate in this case, because there is no user case
+        // and it is too complicated.
+      } else {
+        if (tokenWidthNotSpecified) {
+          tokenWidth = token.textWidth; // FIXME: If image is not loaded and textWidth is not specified, calling
+          // `getBoundingRect()` will not get correct result.
+
+          var textBackgroundColor = tokenStyle.textBackgroundColor;
+          var bgImg = textBackgroundColor && textBackgroundColor.image; // Use cases:
+          // (1) If image is not loaded, it will be loaded at render phase and call
+          // `dirty()` and `textBackgroundColor.image` will be replaced with the loaded
+          // image, and then the right size will be calculated here at the next tick.
+          // See `graphic/helper/text.js`.
+          // (2) If image loaded, and `textBackgroundColor.image` is image src string,
+          // use `imageHelper.findExistImage` to find cached image.
+          // `imageHelper.findExistImage` will always be called here before
+          // `imageHelper.createOrUpdateImage` in `graphic/helper/text.js#renderRichText`
+          // which ensures that image will not be rendered before correct size calcualted.
+
+          if (bgImg) {
+            bgImg = findExistImage(bgImg);
+
+            if (isImageReady(bgImg)) {
+              tokenWidth = Math.max(tokenWidth, bgImg.width * tokenHeight / bgImg.height);
+            }
+          }
+        }
+
+        var paddingW = textPadding ? textPadding[1] + textPadding[3] : 0;
+        tokenWidth += paddingW;
+        var remianTruncWidth = truncateWidth != null ? truncateWidth - lineWidth : null;
+
+        if (remianTruncWidth != null && remianTruncWidth < tokenWidth) {
+          if (!tokenWidthNotSpecified || remianTruncWidth < paddingW) {
+            token.text = '';
+            token.textWidth = tokenWidth = 0;
+          } else {
+            token.text = truncateText(token.text, remianTruncWidth - paddingW, font, truncate.ellipsis, {
+              minChar: truncate.minChar
+            });
+            token.textWidth = getWidth(token.text, font);
+            tokenWidth = token.textWidth + paddingW;
+          }
+        }
+      }
+
+      lineWidth += token.width = tokenWidth;
+      tokenStyle && (lineHeight = Math.max(lineHeight, token.lineHeight));
+    }
+
+    line.width = lineWidth;
+    line.lineHeight = lineHeight;
+    contentHeight += lineHeight;
+    contentWidth = Math.max(contentWidth, lineWidth);
+  }
+
+  contentBlock.outerWidth = contentBlock.width = retrieve2(style.textWidth, contentWidth);
+  contentBlock.outerHeight = contentBlock.height = retrieve2(style.textHeight, contentHeight);
+
+  if (stlPadding) {
+    contentBlock.outerWidth += stlPadding[1] + stlPadding[3];
+    contentBlock.outerHeight += stlPadding[0] + stlPadding[2];
+  }
+
+  for (var i = 0; i < pendingList.length; i++) {
+    var token = pendingList[i];
+    var percentWidth = token.percentWidth; // Should not index on outerWidth, because token can not be placed out of padding.
+
+    token.width = parseInt(percentWidth, 10) / 100 * contentWidth;
+  }
+
+  return contentBlock;
+}
+
+function pushTokens(block, str, styleName) {
+  var isEmptyStr = str === '';
+  var strs = str.split('\n');
+  var lines = block.lines;
+
+  for (var i = 0; i < strs.length; i++) {
+    var text = strs[i];
+    var token = {
+      styleName: styleName,
+      text: text,
+      isLineHolder: !text && !isEmptyStr
+    }; // The first token should be appended to the last line.
+
+    if (!i) {
+      var tokens = (lines[lines.length - 1] || (lines[0] = {
+        tokens: []
+      })).tokens; // Consider cases:
+      // (1) ''.split('\n') => ['', '\n', ''], the '' at the first item
+      // (which is a placeholder) should be replaced by new token.
+      // (2) A image backage, where token likes {a|}.
+      // (3) A redundant '' will affect textAlign in line.
+      // (4) tokens with the same tplName should not be merged, because
+      // they should be displayed in different box (with border and padding).
+
+      var tokensLen = tokens.length;
+      tokensLen === 1 && tokens[0].isLineHolder ? tokens[0] = token : // Consider text is '', only insert when it is the "lineHolder" or
+      // "emptyStr". Otherwise a redundant '' will affect textAlign in line.
+      (text || !tokensLen || isEmptyStr) && tokens.push(token);
+    } // Other tokens always start a new line.
+    else {
+        // If there is '', insert it as a placeholder.
+        lines.push({
+          tokens: [token]
+        });
+      }
+  }
+}
+
+function makeFont(style) {
+  // FIXME in node-canvas fontWeight is before fontStyle
+  // Use `fontSize` `fontFamily` to check whether font properties are defined.
+  var font = (style.fontSize || style.fontFamily) && [style.fontStyle, style.fontWeight, (style.fontSize || 12) + 'px', // If font properties are defined, `fontFamily` should not be ignored.
+  style.fontFamily || 'sans-serif'].join(' ');
+  return font && trim(font) || style.textFont || style.font;
+}
+
+function buildPath(ctx, shape) {
+  var x = shape.x;
+  var y = shape.y;
+  var width = shape.width;
+  var height = shape.height;
+  var r = shape.r;
+  var r1;
+  var r2;
+  var r3;
+  var r4; // Convert width and height to positive for better borderRadius
+
+  if (width < 0) {
+    x = x + width;
+    width = -width;
+  }
+
+  if (height < 0) {
+    y = y + height;
+    height = -height;
+  }
+
+  if (typeof r === 'number') {
+    r1 = r2 = r3 = r4 = r;
+  } else if (r instanceof Array) {
+    if (r.length === 1) {
+      r1 = r2 = r3 = r4 = r[0];
+    } else if (r.length === 2) {
+      r1 = r3 = r[0];
+      r2 = r4 = r[1];
+    } else if (r.length === 3) {
+      r1 = r[0];
+      r2 = r4 = r[1];
+      r3 = r[2];
+    } else {
+      r1 = r[0];
+      r2 = r[1];
+      r3 = r[2];
+      r4 = r[3];
+    }
+  } else {
+    r1 = r2 = r3 = r4 = 0;
+  }
+
+  var total;
+
+  if (r1 + r2 > width) {
+    total = r1 + r2;
+    r1 *= width / total;
+    r2 *= width / total;
+  }
+
+  if (r3 + r4 > width) {
+    total = r3 + r4;
+    r3 *= width / total;
+    r4 *= width / total;
+  }
+
+  if (r2 + r3 > height) {
+    total = r2 + r3;
+    r2 *= height / total;
+    r3 *= height / total;
+  }
+
+  if (r1 + r4 > height) {
+    total = r1 + r4;
+    r1 *= height / total;
+    r4 *= height / total;
+  }
+
+  ctx.moveTo(x + r1, y);
+  ctx.lineTo(x + width - r2, y);
+  r2 !== 0 && ctx.arc(x + width - r2, y + r2, r2, -Math.PI / 2, 0);
+  ctx.lineTo(x + width, y + height - r3);
+  r3 !== 0 && ctx.arc(x + width - r3, y + height - r3, r3, 0, Math.PI / 2);
+  ctx.lineTo(x + r4, y + height);
+  r4 !== 0 && ctx.arc(x + r4, y + height - r4, r4, Math.PI / 2, Math.PI);
+  ctx.lineTo(x, y + r1);
+  r1 !== 0 && ctx.arc(x + r1, y + r1, r1, Math.PI, Math.PI * 1.5);
+}
+
+var VALID_TEXT_ALIGN = {
+  left: 1,
+  right: 1,
+  center: 1
+};
+var VALID_TEXT_VERTICAL_ALIGN = {
+  top: 1,
+  bottom: 1,
+  middle: 1
+}; // Different from `STYLE_COMMON_PROPS` of `graphic/Style`,
+// the default value of shadowColor is `'transparent'`.
+
+var SHADOW_STYLE_COMMON_PROPS = [['textShadowBlur', 'shadowBlur', 0], ['textShadowOffsetX', 'shadowOffsetX', 0], ['textShadowOffsetY', 'shadowOffsetY', 0], ['textShadowColor', 'shadowColor', 'transparent']];
+/**
+ * @param {module:zrender/graphic/Style} style
+ * @return {module:zrender/graphic/Style} The input style.
+ */
+
+function normalizeTextStyle(style) {
+  normalizeStyle(style);
+  each$1(style.rich, normalizeStyle);
+  return style;
+}
+
+function normalizeStyle(style) {
+  if (style) {
+    style.font = makeFont(style);
+    var textAlign = style.textAlign;
+    textAlign === 'middle' && (textAlign = 'center');
+    style.textAlign = textAlign == null || VALID_TEXT_ALIGN[textAlign] ? textAlign : 'left'; // Compatible with textBaseline.
+
+    var textVerticalAlign = style.textVerticalAlign || style.textBaseline;
+    textVerticalAlign === 'center' && (textVerticalAlign = 'middle');
+    style.textVerticalAlign = textVerticalAlign == null || VALID_TEXT_VERTICAL_ALIGN[textVerticalAlign] ? textVerticalAlign : 'top';
+    var textPadding = style.textPadding;
+
+    if (textPadding) {
+      style.textPadding = normalizeCssArray(style.textPadding);
+    }
+  }
+}
+/**
+ * @param {CanvasRenderingContext2D} ctx
+ * @param {string} text
+ * @param {module:zrender/graphic/Style} style
+ * @param {Object|boolean} [rect] {x, y, width, height}
+ *                  If set false, rect text is not used.
+ * @param {Element} [prevEl] For ctx prop cache.
+ */
+
+
+function renderText(hostEl, ctx, text, style, rect, prevEl) {
+  style.rich ? renderRichText(hostEl, ctx, text, style, rect) : renderPlainText(hostEl, ctx, text, style, rect, prevEl);
+} // Avoid setting to ctx according to prevEl if possible for
+// performance in scenarios of large amount text.
+
+function renderPlainText(hostEl, ctx, text, style, rect, prevEl) {
+  'use strict';
+
+  var prevStyle = prevEl && prevEl.style; // Some cache only available on textEl.
+
+  var isPrevTextEl = prevStyle && prevEl.type === 'text';
+  var styleFont = style.font || DEFAULT_FONT;
+
+  if (!isPrevTextEl || styleFont !== (prevStyle.font || DEFAULT_FONT)) {
+    ctx.font = styleFont;
+  } // Use the final font from context-2d, because the final
+  // font might not be the style.font when it is illegal.
+  // But get `ctx.font` might be time consuming.
+
+
+  var computedFont = hostEl.__computedFont;
+
+  if (hostEl.__styleFont !== styleFont) {
+    hostEl.__styleFont = styleFont;
+    computedFont = hostEl.__computedFont = ctx.font;
+  }
+
+  var textPadding = style.textPadding;
+  var contentBlock = hostEl.__textCotentBlock;
+
+  if (!contentBlock || hostEl.__dirtyText) {
+    contentBlock = hostEl.__textCotentBlock = parsePlainText(text, computedFont, textPadding, style.truncate);
+  }
+
+  var outerHeight = contentBlock.outerHeight;
+  var textLines = contentBlock.lines;
+  var lineHeight = contentBlock.lineHeight;
+  var boxPos = getBoxPosition(outerHeight, style, rect);
+  var baseX = boxPos.baseX;
+  var baseY = boxPos.baseY;
+  var textAlign = boxPos.textAlign || 'left';
+  var textVerticalAlign = boxPos.textVerticalAlign; // Origin of textRotation should be the index point of text drawing.
+
+  applyTextRotation(ctx, style, rect, baseX, baseY);
+  var boxY = adjustTextY(baseY, outerHeight, textVerticalAlign);
+  var textX = baseX;
+  var textY = boxY;
+  var needDrawBg = needDrawBackground(style);
+
+  if (needDrawBg || textPadding) {
+    // Consider performance, do not call getTextWidth util necessary.
+    var textWidth = getWidth(text, computedFont);
+    var outerWidth = textWidth;
+    textPadding && (outerWidth += textPadding[1] + textPadding[3]);
+    var boxX = adjustTextX(baseX, outerWidth, textAlign);
+    needDrawBg && drawBackground(hostEl, ctx, style, boxX, boxY, outerWidth, outerHeight);
+
+    if (textPadding) {
+      textX = getTextXForPadding(baseX, textAlign, textPadding);
+      textY += textPadding[0];
+    }
+  } // Always set textAlign and textBase line, because it is difficute to calculate
+  // textAlign from prevEl, and we dont sure whether textAlign will be reset if
+  // font set happened.
+
+
+  ctx.textAlign = textAlign; // Force baseline to be "middle". Otherwise, if using "top", the
+  // text will offset downward a little bit in font "Microsoft YaHei".
+
+  ctx.textBaseline = 'middle'; // Always set shadowBlur and shadowOffset to avoid leak from displayable.
+
+  for (var i = 0; i < SHADOW_STYLE_COMMON_PROPS.length; i++) {
+    var propItem = SHADOW_STYLE_COMMON_PROPS[i];
+    var styleProp = propItem[0];
+    var ctxProp = propItem[1];
+    var val = style[styleProp];
+
+    if (!isPrevTextEl || val !== prevStyle[styleProp]) {
+      ctx[ctxProp] = fixShadow(ctx, ctxProp, val || propItem[2]);
+    }
+  } // `textBaseline` is set as 'middle'.
+
+
+  textY += lineHeight / 2;
+  var textStrokeWidth = style.textStrokeWidth;
+  var textStrokeWidthPrev = isPrevTextEl ? prevStyle.textStrokeWidth : null;
+  var strokeWidthChanged = !isPrevTextEl || textStrokeWidth !== textStrokeWidthPrev;
+  var strokeChanged = !isPrevTextEl || strokeWidthChanged || style.textStroke !== prevStyle.textStroke;
+  var textStroke = getStroke(style.textStroke, textStrokeWidth);
+  var textFill = getFill(style.textFill);
+
+  if (textStroke) {
+    if (strokeWidthChanged) {
+      ctx.lineWidth = textStrokeWidth;
+    }
+
+    if (strokeChanged) {
+      ctx.strokeStyle = textStroke;
+    }
+  }
+
+  if (textFill) {
+    if (!isPrevTextEl || style.textFill !== prevStyle.textFill || prevStyle.textBackgroundColor) {
+      ctx.fillStyle = textFill;
+    }
+  } // Optimize simply, in most cases only one line exists.
+
+
+  if (textLines.length === 1) {
+    // Fill after stroke so the outline will not cover the main part.
+    textStroke && ctx.strokeText(textLines[0], textX, textY);
+    textFill && ctx.fillText(textLines[0], textX, textY);
+  } else {
+    for (var i = 0; i < textLines.length; i++) {
+      // Fill after stroke so the outline will not cover the main part.
+      textStroke && ctx.strokeText(textLines[i], textX, textY);
+      textFill && ctx.fillText(textLines[i], textX, textY);
+      textY += lineHeight;
+    }
+  }
+}
+
+function renderRichText(hostEl, ctx, text, style, rect) {
+  var contentBlock = hostEl.__textCotentBlock;
+
+  if (!contentBlock || hostEl.__dirtyText) {
+    contentBlock = hostEl.__textCotentBlock = parseRichText(text, style);
+  }
+
+  drawRichText(hostEl, ctx, contentBlock, style, rect);
+}
+
+function drawRichText(hostEl, ctx, contentBlock, style, rect) {
+  var contentWidth = contentBlock.width;
+  var outerWidth = contentBlock.outerWidth;
+  var outerHeight = contentBlock.outerHeight;
+  var textPadding = style.textPadding;
+  var boxPos = getBoxPosition(outerHeight, style, rect);
+  var baseX = boxPos.baseX;
+  var baseY = boxPos.baseY;
+  var textAlign = boxPos.textAlign;
+  var textVerticalAlign = boxPos.textVerticalAlign; // Origin of textRotation should be the index point of text drawing.
+
+  applyTextRotation(ctx, style, rect, baseX, baseY);
+  var boxX = adjustTextX(baseX, outerWidth, textAlign);
+  var boxY = adjustTextY(baseY, outerHeight, textVerticalAlign);
+  var xLeft = boxX;
+  var lineTop = boxY;
+
+  if (textPadding) {
+    xLeft += textPadding[3];
+    lineTop += textPadding[0];
+  }
+
+  var xRight = xLeft + contentWidth;
+  needDrawBackground(style) && drawBackground(hostEl, ctx, style, boxX, boxY, outerWidth, outerHeight);
+
+  for (var i = 0; i < contentBlock.lines.length; i++) {
+    var line = contentBlock.lines[i];
+    var tokens = line.tokens;
+    var tokenCount = tokens.length;
+    var lineHeight = line.lineHeight;
+    var usedWidth = line.width;
+    var leftIndex = 0;
+    var lineXLeft = xLeft;
+    var lineXRight = xRight;
+    var rightIndex = tokenCount - 1;
+    var token;
+
+    while (leftIndex < tokenCount && (token = tokens[leftIndex], !token.textAlign || token.textAlign === 'left')) {
+      placeToken(hostEl, ctx, token, style, lineHeight, lineTop, lineXLeft, 'left');
+      usedWidth -= token.width;
+      lineXLeft += token.width;
+      leftIndex++;
+    }
+
+    while (rightIndex >= 0 && (token = tokens[rightIndex], token.textAlign === 'right')) {
+      placeToken(hostEl, ctx, token, style, lineHeight, lineTop, lineXRight, 'right');
+      usedWidth -= token.width;
+      lineXRight -= token.width;
+      rightIndex--;
+    } // The other tokens are placed as textAlign 'center' if there is enough space.
+
+
+    lineXLeft += (contentWidth - (lineXLeft - xLeft) - (xRight - lineXRight) - usedWidth) / 2;
+
+    while (leftIndex <= rightIndex) {
+      token = tokens[leftIndex]; // Consider width specified by user, use 'center' rather than 'left'.
+
+      placeToken(hostEl, ctx, token, style, lineHeight, lineTop, lineXLeft + token.width / 2, 'center');
+      lineXLeft += token.width;
+      leftIndex++;
+    }
+
+    lineTop += lineHeight;
+  }
+}
+
+function applyTextRotation(ctx, style, rect, x, y) {
+  // textRotation only apply in RectText.
+  if (rect && style.textRotation) {
+    var origin = style.textOrigin;
+
+    if (origin === 'center') {
+      x = rect.width / 2 + rect.x;
+      y = rect.height / 2 + rect.y;
+    } else if (origin) {
+      x = origin[0] + rect.x;
+      y = origin[1] + rect.y;
+    }
+
+    ctx.translate(x, y); // Positive: anticlockwise
+
+    ctx.rotate(-style.textRotation);
+    ctx.translate(-x, -y);
+  }
+}
+
+function placeToken(hostEl, ctx, token, style, lineHeight, lineTop, x, textAlign) {
+  var tokenStyle = style.rich[token.styleName] || {};
+  tokenStyle.text = token.text; // 'ctx.textBaseline' is always set as 'middle', for sake of
+  // the bias of "Microsoft YaHei".
+
+  var textVerticalAlign = token.textVerticalAlign;
+  var y = lineTop + lineHeight / 2;
+
+  if (textVerticalAlign === 'top') {
+    y = lineTop + token.height / 2;
+  } else if (textVerticalAlign === 'bottom') {
+    y = lineTop + lineHeight - token.height / 2;
+  }
+
+  !token.isLineHolder && needDrawBackground(tokenStyle) && drawBackground(hostEl, ctx, tokenStyle, textAlign === 'right' ? x - token.width : textAlign === 'center' ? x - token.width / 2 : x, y - token.height / 2, token.width, token.height);
+  var textPadding = token.textPadding;
+
+  if (textPadding) {
+    x = getTextXForPadding(x, textAlign, textPadding);
+    y -= token.height / 2 - textPadding[2] - token.textHeight / 2;
+  }
+
+  setCtx(ctx, 'shadowBlur', retrieve3(tokenStyle.textShadowBlur, style.textShadowBlur, 0));
+  setCtx(ctx, 'shadowColor', tokenStyle.textShadowColor || style.textShadowColor || 'transparent');
+  setCtx(ctx, 'shadowOffsetX', retrieve3(tokenStyle.textShadowOffsetX, style.textShadowOffsetX, 0));
+  setCtx(ctx, 'shadowOffsetY', retrieve3(tokenStyle.textShadowOffsetY, style.textShadowOffsetY, 0));
+  setCtx(ctx, 'textAlign', textAlign); // Force baseline to be "middle". Otherwise, if using "top", the
+  // text will offset downward a little bit in font "Microsoft YaHei".
+
+  setCtx(ctx, 'textBaseline', 'middle');
+  setCtx(ctx, 'font', token.font || DEFAULT_FONT);
+  var textStroke = getStroke(tokenStyle.textStroke || style.textStroke, textStrokeWidth);
+  var textFill = getFill(tokenStyle.textFill || style.textFill);
+  var textStrokeWidth = retrieve2(tokenStyle.textStrokeWidth, style.textStrokeWidth); // Fill after stroke so the outline will not cover the main part.
+
+  if (textStroke) {
+    setCtx(ctx, 'lineWidth', textStrokeWidth);
+    setCtx(ctx, 'strokeStyle', textStroke);
+    ctx.strokeText(token.text, x, y);
+  }
+
+  if (textFill) {
+    setCtx(ctx, 'fillStyle', textFill);
+    ctx.fillText(token.text, x, y);
+  }
+}
+
+function needDrawBackground(style) {
+  return style.textBackgroundColor || style.textBorderWidth && style.textBorderColor;
+} // style: {textBackgroundColor, textBorderWidth, textBorderColor, textBorderRadius, text}
+// shape: {x, y, width, height}
+
+
+function drawBackground(hostEl, ctx, style, x, y, width, height) {
+  var textBackgroundColor = style.textBackgroundColor;
+  var textBorderWidth = style.textBorderWidth;
+  var textBorderColor = style.textBorderColor;
+  var isPlainBg = isString(textBackgroundColor);
+  setCtx(ctx, 'shadowBlur', style.textBoxShadowBlur || 0);
+  setCtx(ctx, 'shadowColor', style.textBoxShadowColor || 'transparent');
+  setCtx(ctx, 'shadowOffsetX', style.textBoxShadowOffsetX || 0);
+  setCtx(ctx, 'shadowOffsetY', style.textBoxShadowOffsetY || 0);
+
+  if (isPlainBg || textBorderWidth && textBorderColor) {
+    ctx.beginPath();
+    var textBorderRadius = style.textBorderRadius;
+
+    if (!textBorderRadius) {
+      ctx.rect(x, y, width, height);
+    } else {
+      buildPath(ctx, {
+        x: x,
+        y: y,
+        width: width,
+        height: height,
+        r: textBorderRadius
+      });
+    }
+
+    ctx.closePath();
+  }
+
+  if (isPlainBg) {
+    setCtx(ctx, 'fillStyle', textBackgroundColor);
+
+    if (style.fillOpacity != null) {
+      var originalGlobalAlpha = ctx.globalAlpha;
+      ctx.globalAlpha = style.fillOpacity * style.opacity;
+      ctx.fill();
+      ctx.globalAlpha = originalGlobalAlpha;
+    } else {
+      ctx.fill();
+    }
+  } else if (isFunction$1(textBackgroundColor)) {
+    setCtx(ctx, 'fillStyle', textBackgroundColor(style));
+    ctx.fill();
+  } else if (isObject$1(textBackgroundColor)) {
+    var image = textBackgroundColor.image;
+    image = createOrUpdateImage(image, null, hostEl, onBgImageLoaded, textBackgroundColor);
+
+    if (image && isImageReady(image)) {
+      ctx.drawImage(image, x, y, width, height);
+    }
+  }
+
+  if (textBorderWidth && textBorderColor) {
+    setCtx(ctx, 'lineWidth', textBorderWidth);
+    setCtx(ctx, 'strokeStyle', textBorderColor);
+
+    if (style.strokeOpacity != null) {
+      var originalGlobalAlpha = ctx.globalAlpha;
+      ctx.globalAlpha = style.strokeOpacity * style.opacity;
+      ctx.stroke();
+      ctx.globalAlpha = originalGlobalAlpha;
+    } else {
+      ctx.stroke();
+    }
+  }
+}
+
+function onBgImageLoaded(image, textBackgroundColor) {
+  // Replace image, so that `contain/text.js#parseRichText`
+  // will get correct result in next tick.
+  textBackgroundColor.image = image;
+}
+
+function getBoxPosition(blockHeiht, style, rect) {
+  var baseX = style.x || 0;
+  var baseY = style.y || 0;
+  var textAlign = style.textAlign;
+  var textVerticalAlign = style.textVerticalAlign; // Text position represented by coord
+
+  if (rect) {
+    var textPosition = style.textPosition;
+
+    if (textPosition instanceof Array) {
+      // Percent
+      baseX = rect.x + parsePercent(textPosition[0], rect.width);
+      baseY = rect.y + parsePercent(textPosition[1], rect.height);
+    } else {
+      var res = adjustTextPositionOnRect(textPosition, rect, style.textDistance);
+      baseX = res.x;
+      baseY = res.y; // Default align and baseline when has textPosition
+
+      textAlign = textAlign || res.textAlign;
+      textVerticalAlign = textVerticalAlign || res.textVerticalAlign;
+    } // textOffset is only support in RectText, otherwise
+    // we have to adjust boundingRect for textOffset.
+
+
+    var textOffset = style.textOffset;
+
+    if (textOffset) {
+      baseX += textOffset[0];
+      baseY += textOffset[1];
+    }
+  }
+
+  return {
+    baseX: baseX,
+    baseY: baseY,
+    textAlign: textAlign,
+    textVerticalAlign: textVerticalAlign
+  };
+}
+
+function setCtx(ctx, prop, value) {
+  ctx[prop] = fixShadow(ctx, prop, value);
+  return ctx[prop];
+}
+/**
+ * @param {string} [stroke] If specified, do not check style.textStroke.
+ * @param {string} [lineWidth] If specified, do not check style.textStroke.
+ * @param {number} style
+ */
+
+
+function getStroke(stroke, lineWidth) {
+  return stroke == null || lineWidth <= 0 || stroke === 'transparent' || stroke === 'none' ? null // TODO pattern and gradient?
+  : stroke.image || stroke.colorStops ? '#000' : stroke;
+}
+function getFill(fill) {
+  return fill == null || fill === 'none' ? null // TODO pattern and gradient?
+  : fill.image || fill.colorStops ? '#000' : fill;
+}
+
+function parsePercent(value, maxValue) {
+  if (typeof value === 'string') {
+    if (value.lastIndexOf('%') >= 0) {
+      return parseFloat(value) / 100 * maxValue;
+    }
+
+    return parseFloat(value);
+  }
+
+  return value;
+}
+
+function getTextXForPadding(x, textAlign, textPadding) {
+  return textAlign === 'right' ? x - textPadding[1] : textAlign === 'center' ? x + textPadding[3] / 2 - textPadding[1] / 2 : x + textPadding[3];
+}
+/**
+ * @param {string} text
+ * @param {module:zrender/Style} style
+ * @return {boolean}
+ */
+
+
+function needDrawText(text, style) {
+  return text != null && (text || style.textBackgroundColor || style.textBorderWidth && style.textBorderColor || style.textPadding);
+}
+
+/**
+ * Mixin for drawing text in a element bounding rect
+ * @module zrender/mixin/RectText
+ */
+var tmpRect$1 = new BoundingRect();
+
+var RectText = function () {};
+
+RectText.prototype = {
+  constructor: RectText,
+
+  /**
+   * Draw text in a rect with specified position.
+   * @param  {CanvasRenderingContext2D} ctx
+   * @param  {Object} rect Displayable rect
+   */
+  drawRectText: function (ctx, rect) {
+    var style = this.style;
+    rect = style.textRect || rect; // Optimize, avoid normalize every time.
+
+    this.__dirty && normalizeTextStyle(style, true);
+    var text = style.text; // Convert to string
+
+    text != null && (text += '');
+
+    if (!needDrawText(text, style)) {
+      return;
+    } // FIXME
+    // Do not provide prevEl to `textHelper.renderText` for ctx prop cache,
+    // but use `ctx.save()` and `ctx.restore()`. Because the cache for rect
+    // text propably break the cache for its host elements.
+
+
+    ctx.save(); // Transform rect to view space
+
+    var transform = this.transform;
+
+    if (!style.transformText) {
+      if (transform) {
+        tmpRect$1.copy(rect);
+        tmpRect$1.applyTransform(transform);
+        rect = tmpRect$1;
+      }
+    } else {
+      this.setTransform(ctx);
+    } // transformText and textRotation can not be used at the same time.
+
+
+    renderText(this, ctx, text, style, rect);
+    ctx.restore();
+  }
+};
+
+/**
+ * 鍙粯鍒剁殑鍥惧舰鍩虹被
+ * Base class of all displayable graphic objects
+ * @module zrender/graphic/Displayable
+ */
+/**
+ * @alias module:zrender/graphic/Displayable
+ * @extends module:zrender/Element
+ * @extends module:zrender/graphic/mixin/RectText
+ */
+
+function Displayable(opts) {
+  opts = opts || {};
+  Element.call(this, opts); // Extend properties
+
+  for (var name in opts) {
+    if (opts.hasOwnProperty(name) && name !== 'style') {
+      this[name] = opts[name];
+    }
+  }
+  /**
+   * @type {module:zrender/graphic/Style}
+   */
+
+
+  this.style = new Style(opts.style, this);
+  this._rect = null; // Shapes for cascade clipping.
+
+  this.__clipPaths = []; // FIXME Stateful must be mixined after style is setted
+  // Stateful.call(this, opts);
+}
+
+Displayable.prototype = {
+  constructor: Displayable,
+  type: 'displayable',
+
+  /**
+   * Displayable 鏄惁涓鸿剰锛孭ainter 涓細鏍规嵁璇ユ爣璁板垽鏂槸鍚﹂渶瑕佹槸鍚﹂渶瑕侀噸鏂扮粯鍒�
+   * Dirty flag. From which painter will determine if this displayable object needs brush
+   * @name module:zrender/graphic/Displayable#__dirty
+   * @type {boolean}
+   */
+  __dirty: true,
+
+  /**
+   * 鍥惧舰鏄惁鍙锛屼负true鏃朵笉缁樺埗鍥惧舰锛屼絾鏄粛鑳借Е鍙戦紶鏍囦簨浠�
+   * If ignore drawing of the displayable object. Mouse event will still be triggered
+   * @name module:/zrender/graphic/Displayable#invisible
+   * @type {boolean}
+   * @default false
+   */
+  invisible: false,
+
+  /**
+   * @name module:/zrender/graphic/Displayable#z
+   * @type {number}
+   * @default 0
+   */
+  z: 0,
+
+  /**
+   * @name module:/zrender/graphic/Displayable#z
+   * @type {number}
+   * @default 0
+   */
+  z2: 0,
+
+  /**
+   * z灞俵evel锛屽喅瀹氱粯鐢诲湪鍝眰canvas涓�
+   * @name module:/zrender/graphic/Displayable#zlevel
+   * @type {number}
+   * @default 0
+   */
+  zlevel: 0,
+
+  /**
+   * 鏄惁鍙嫋鎷�
+   * @name module:/zrender/graphic/Displayable#draggable
+   * @type {boolean}
+   * @default false
+   */
+  draggable: false,
+
+  /**
+   * 鏄惁姝e湪鎷栨嫿
+   * @name module:/zrender/graphic/Displayable#draggable
+   * @type {boolean}
+   * @default false
+   */
+  dragging: false,
+
+  /**
+   * 鏄惁鐩稿簲榧犳爣浜嬩欢
+   * @name module:/zrender/graphic/Displayable#silent
+   * @type {boolean}
+   * @default false
+   */
+  silent: false,
+
+  /**
+   * If enable culling
+   * @type {boolean}
+   * @default false
+   */
+  culling: false,
+
+  /**
+   * Mouse cursor when hovered
+   * @name module:/zrender/graphic/Displayable#cursor
+   * @type {string}
+   */
+  cursor: 'pointer',
+
+  /**
+   * If hover area is bounding rect
+   * @name module:/zrender/graphic/Displayable#rectHover
+   * @type {string}
+   */
+  rectHover: false,
+
+  /**
+   * Render the element progressively when the value >= 0,
+   * usefull for large data.
+   * @type {boolean}
+   */
+  progressive: false,
+
+  /**
+   * @type {boolean}
+   */
+  incremental: false,
+
+  /**
+   * Scale ratio for global scale.
+   * @type {boolean}
+   */
+  globalScaleRatio: 1,
+  beforeBrush: function (ctx) {},
+  afterBrush: function (ctx) {},
+
+  /**
+   * 鍥惧舰缁樺埗鏂规硶
+   * @param {CanvasRenderingContext2D} ctx
+   */
+  // Interface
+  brush: function (ctx, prevEl) {},
+
+  /**
+   * 鑾峰彇鏈�灏忓寘鍥寸洅
+   * @return {module:zrender/core/BoundingRect}
+   */
+  // Interface
+  getBoundingRect: function () {},
+
+  /**
+   * 鍒ゆ柇鍧愭爣 x, y 鏄惁鍦ㄥ浘褰笂
+   * If displayable element contain coord x, y
+   * @param  {number} x
+   * @param  {number} y
+   * @return {boolean}
+   */
+  contain: function (x, y) {
+    return this.rectContain(x, y);
+  },
+
+  /**
+   * @param  {Function} cb
+   * @param  {}   context
+   */
+  traverse: function (cb, context) {
+    cb.call(context, this);
+  },
+
+  /**
+   * 鍒ゆ柇鍧愭爣 x, y 鏄惁鍦ㄥ浘褰㈢殑鍖呭洿鐩掍笂
+   * If bounding rect of element contain coord x, y
+   * @param  {number} x
+   * @param  {number} y
+   * @return {boolean}
+   */
+  rectContain: function (x, y) {
+    var coord = this.transformCoordToLocal(x, y);
+    var rect = this.getBoundingRect();
+    return rect.contain(coord[0], coord[1]);
+  },
+
+  /**
+   * 鏍囪鍥惧舰鍏冪礌涓鸿剰锛屽苟涓斿湪涓嬩竴甯ч噸缁�
+   * Mark displayable element dirty and refresh next frame
+   */
+  dirty: function () {
+    this.__dirty = this.__dirtyText = true;
+    this._rect = null;
+    this.__zr && this.__zr.refresh();
+  },
+
+  /**
+   * 鍥惧舰鏄惁浼氳Е鍙戜簨浠�
+   * If displayable object binded any event
+   * @return {boolean}
+   */
+  // TODO, 閫氳繃 bind 缁戝畾鐨勪簨浠�
+  // isSilent: function () {
+  //     return !(
+  //         this.hoverable || this.draggable
+  //         || this.onmousemove || this.onmouseover || this.onmouseout
+  //         || this.onmousedown || this.onmouseup || this.onclick
+  //         || this.ondragenter || this.ondragover || this.ondragleave
+  //         || this.ondrop
+  //     );
+  // },
+
+  /**
+   * Alias for animate('style')
+   * @param {boolean} loop
+   */
+  animateStyle: function (loop) {
+    return this.animate('style', loop);
+  },
+  attrKV: function (key, value) {
+    if (key !== 'style') {
+      Element.prototype.attrKV.call(this, key, value);
+    } else {
+      this.style.set(value);
+    }
+  },
+
+  /**
+   * @param {Object|string} key
+   * @param {*} value
+   */
+  setStyle: function (key, value) {
+    this.style.set(key, value);
+    this.dirty(false);
+    return this;
+  },
+
+  /**
+   * Use given style object
+   * @param  {Object} obj
+   */
+  useStyle: function (obj) {
+    this.style = new Style(obj, this);
+    this.dirty(false);
+    return this;
+  }
+};
+inherits(Displayable, Element);
+mixin(Displayable, RectText); // zrUtil.mixin(Displayable, Stateful);
+
+/**
+ * @alias zrender/graphic/Image
+ * @extends module:zrender/graphic/Displayable
+ * @constructor
+ * @param {Object} opts
+ */
+
+function ZImage(opts) {
+  Displayable.call(this, opts);
+}
+
+ZImage.prototype = {
+  constructor: ZImage,
+  type: 'image',
+  brush: function (ctx, prevEl) {
+    var style = this.style;
+    var src = style.image; // Must bind each time
+
+    style.bind(ctx, this, prevEl);
+    var image = this._image = createOrUpdateImage(src, this._image, this, this.onload);
+
+    if (!image || !isImageReady(image)) {
+      return;
+    } // 鍥剧墖宸茬粡鍔犺浇瀹屾垚
+    // if (image.nodeName.toUpperCase() == 'IMG') {
+    //     if (!image.complete) {
+    //         return;
+    //     }
+    // }
+    // Else is canvas
+
+
+    var x = style.x || 0;
+    var y = style.y || 0;
+    var width = style.width;
+    var height = style.height;
+    var aspect = image.width / image.height;
+
+    if (width == null && height != null) {
+      // Keep image/height ratio
+      width = height * aspect;
+    } else if (height == null && width != null) {
+      height = width / aspect;
+    } else if (width == null && height == null) {
+      width = image.width;
+      height = image.height;
+    } // 璁剧疆transform
+
+
+    this.setTransform(ctx);
+
+    if (style.sWidth && style.sHeight) {
+      var sx = style.sx || 0;
+      var sy = style.sy || 0;
+      ctx.drawImage(image, sx, sy, style.sWidth, style.sHeight, x, y, width, height);
+    } else if (style.sx && style.sy) {
+      var sx = style.sx;
+      var sy = style.sy;
+      var sWidth = width - sx;
+      var sHeight = height - sy;
+      ctx.drawImage(image, sx, sy, sWidth, sHeight, x, y, width, height);
+    } else {
+      ctx.drawImage(image, x, y, width, height);
+    } // Draw rect text
+
+
+    if (style.text != null) {
+      // Only restore transform when needs draw text.
+      this.restoreTransform(ctx);
+      this.drawRectText(ctx, this.getBoundingRect());
+    }
+  },
+  getBoundingRect: function () {
+    var style = this.style;
+
+    if (!this._rect) {
+      this._rect = new BoundingRect(style.x || 0, style.y || 0, style.width || 0, style.height || 0);
+    }
+
+    return this._rect;
+  }
+};
+inherits(ZImage, Displayable);
+
+var HOVER_LAYER_ZLEVEL = 1e5;
+var CANVAS_ZLEVEL = 314159;
+var EL_AFTER_INCREMENTAL_INC = 0.01;
+var INCREMENTAL_INC = 0.001;
+
+function parseInt10(val) {
+  return parseInt(val, 10);
+}
+
+function isLayerValid(layer) {
+  if (!layer) {
+    return false;
+  }
+
+  if (layer.__builtin__) {
+    return true;
+  }
+
+  if (typeof layer.resize !== 'function' || typeof layer.refresh !== 'function') {
+    return false;
+  }
+
+  return true;
+}
+
+var tmpRect = new BoundingRect(0, 0, 0, 0);
+var viewRect = new BoundingRect(0, 0, 0, 0);
+
+function isDisplayableCulled(el, width, height) {
+  tmpRect.copy(el.getBoundingRect());
+
+  if (el.transform) {
+    tmpRect.applyTransform(el.transform);
+  }
+
+  viewRect.width = width;
+  viewRect.height = height;
+  return !tmpRect.intersect(viewRect);
+}
+
+function isClipPathChanged(clipPaths, prevClipPaths) {
+  if (clipPaths == prevClipPaths) {
+    // Can both be null or undefined
+    return false;
+  }
+
+  if (!clipPaths || !prevClipPaths || clipPaths.length !== prevClipPaths.length) {
+    return true;
+  }
+
+  for (var i = 0; i < clipPaths.length; i++) {
+    if (clipPaths[i] !== prevClipPaths[i]) {
+      return true;
+    }
+  }
+}
+
+function doClip(clipPaths, ctx) {
+  for (var i = 0; i < clipPaths.length; i++) {
+    var clipPath = clipPaths[i];
+    clipPath.setTransform(ctx);
+    ctx.beginPath();
+    clipPath.buildPath(ctx, clipPath.shape);
+    ctx.clip(); // Transform back
+
+    clipPath.restoreTransform(ctx);
+  }
+}
+
+function createRoot(width, height) {
+  var domRoot = document.createElement('div'); // domRoot.onselectstart = returnFalse; // 閬垮厤椤甸潰閫変腑鐨勫按灏�
+
+  domRoot.style.cssText = ['position:relative', 'overflow:hidden', 'width:' + width + 'px', 'height:' + height + 'px', 'padding:0', 'margin:0', 'border-width:0'].join(';') + ';';
+  return domRoot;
+}
+/**
+ * @alias module:zrender/Painter
+ * @constructor
+ * @param {HTMLElement} root 缁樺浘瀹瑰櫒
+ * @param {module:zrender/Storage} storage
+ * @param {Object} opts
+ */
+
+
+var Painter = function (root, storage, opts) {
+  this.type = 'canvas'; // In node environment using node-canvas
+
+  var singleCanvas = !root.nodeName // In node ?
+  || root.nodeName.toUpperCase() === 'CANVAS';
+  this._opts = opts = extend({}, opts || {});
+  /**
+   * @type {number}
+   */
+
+  this.dpr = opts.devicePixelRatio || devicePixelRatio;
+  /**
+   * @type {boolean}
+   * @private
+   */
+
+  this._singleCanvas = singleCanvas;
+  /**
+   * 缁樺浘瀹瑰櫒
+   * @type {HTMLElement}
+   */
+
+  this.root = root;
+  var rootStyle = root.style;
+
+  if (rootStyle) {
+    rootStyle['-webkit-tap-highlight-color'] = 'transparent';
+    rootStyle['-webkit-user-select'] = rootStyle['user-select'] = rootStyle['-webkit-touch-callout'] = 'none';
+    root.innerHTML = '';
+  }
+  /**
+   * @type {module:zrender/Storage}
+   */
+
+
+  this.storage = storage;
+  /**
+   * @type {Array.<number>}
+   * @private
+   */
+
+  var zlevelList = this._zlevelList = [];
+  /**
+   * @type {Object.<string, module:zrender/Layer>}
+   * @private
+   */
+
+  var layers = this._layers = {};
+  /**
+   * @type {Object.<string, Object>}
+   * @private
+   */
+
+  this._layerConfig = {};
+  /**
+   * zrender will do compositing when root is a canvas and have multiple zlevels.
+   */
+
+  this._needsManuallyCompositing = false;
+
+  if (!singleCanvas) {
+    this._width = this._getSize(0);
+    this._height = this._getSize(1);
+    var domRoot = this._domRoot = createRoot(this._width, this._height);
+    root.appendChild(domRoot);
+  } else {
+    var width = root.width;
+    var height = root.height;
+
+    if (opts.width != null) {
+      width = opts.width;
+    }
+
+    if (opts.height != null) {
+      height = opts.height;
+    }
+
+    this.dpr = opts.devicePixelRatio || 1; // Use canvas width and height directly
+
+    root.width = width * this.dpr;
+    root.height = height * this.dpr;
+    this._width = width;
+    this._height = height; // Create layer if only one given canvas
+    // Device can be specified to create a high dpi image.
+
+    var mainLayer = new Layer(root, this, this.dpr);
+    mainLayer.__builtin__ = true;
+    mainLayer.initContext(); // FIXME Use canvas width and height
+    // mainLayer.resize(width, height);
+
+    layers[CANVAS_ZLEVEL] = mainLayer;
+    mainLayer.zlevel = CANVAS_ZLEVEL; // Not use common zlevel.
+
+    zlevelList.push(CANVAS_ZLEVEL);
+    this._domRoot = root;
+  }
+  /**
+   * @type {module:zrender/Layer}
+   * @private
+   */
+
+
+  this._hoverlayer = null;
+  this._hoverElements = [];
+};
+
+Painter.prototype = {
+  constructor: Painter,
+  getType: function () {
+    return 'canvas';
+  },
+
+  /**
+   * If painter use a single canvas
+   * @return {boolean}
+   */
+  isSingleCanvas: function () {
+    return this._singleCanvas;
+  },
+
+  /**
+   * @return {HTMLDivElement}
+   */
+  getViewportRoot: function () {
+    return this._domRoot;
+  },
+  getViewportRootOffset: function () {
+    var viewportRoot = this.getViewportRoot();
+
+    if (viewportRoot) {
+      return {
+        offsetLeft: viewportRoot.offsetLeft || 0,
+        offsetTop: viewportRoot.offsetTop || 0
+      };
+    }
+  },
+
+  /**
+   * 鍒锋柊
+   * @param {boolean} [paintAll=false] 寮哄埗缁樺埗鎵�鏈塪isplayable
+   */
+  refresh: function (paintAll) {
+    var list = this.storage.getDisplayList(true);
+    var zlevelList = this._zlevelList;
+    this._redrawId = Math.random();
+
+    this._paintList(list, paintAll, this._redrawId); // Paint custum layers
+
+
+    for (var i = 0; i < zlevelList.length; i++) {
+      var z = zlevelList[i];
+      var layer = this._layers[z];
+
+      if (!layer.__builtin__ && layer.refresh) {
+        var clearColor = i === 0 ? this._backgroundColor : null;
+        layer.refresh(clearColor);
+      }
+    }
+
+    this.refreshHover();
+    return this;
+  },
+  addHover: function (el, hoverStyle) {
+    if (el.__hoverMir) {
+      return;
+    }
+
+    var elMirror = new el.constructor({
+      style: el.style,
+      shape: el.shape,
+      z: el.z,
+      z2: el.z2,
+      silent: el.silent
+    });
+    elMirror.__from = el;
+    el.__hoverMir = elMirror;
+    hoverStyle && elMirror.setStyle(hoverStyle);
+
+    this._hoverElements.push(elMirror);
+
+    return elMirror;
+  },
+  removeHover: function (el) {
+    var elMirror = el.__hoverMir;
+    var hoverElements = this._hoverElements;
+    var idx = indexOf(hoverElements, elMirror);
+
+    if (idx >= 0) {
+      hoverElements.splice(idx, 1);
+    }
+
+    el.__hoverMir = null;
+  },
+  clearHover: function (el) {
+    var hoverElements = this._hoverElements;
+
+    for (var i = 0; i < hoverElements.length; i++) {
+      var from = hoverElements[i].__from;
+
+      if (from) {
+        from.__hoverMir = null;
+      }
+    }
+
+    hoverElements.length = 0;
+  },
+  refreshHover: function () {
+    var hoverElements = this._hoverElements;
+    var len = hoverElements.length;
+    var hoverLayer = this._hoverlayer;
+    hoverLayer && hoverLayer.clear();
+
+    if (!len) {
+      return;
+    }
+
+    sort(hoverElements, this.storage.displayableSortFunc); // Use a extream large zlevel
+    // FIXME?
+
+    if (!hoverLayer) {
+      hoverLayer = this._hoverlayer = this.getLayer(HOVER_LAYER_ZLEVEL);
+    }
+
+    var scope = {};
+    hoverLayer.ctx.save();
+
+    for (var i = 0; i < len;) {
+      var el = hoverElements[i];
+      var originalEl = el.__from; // Original el is removed
+      // PENDING
+
+      if (!(originalEl && originalEl.__zr)) {
+        hoverElements.splice(i, 1);
+        originalEl.__hoverMir = null;
+        len--;
+        continue;
+      }
+
+      i++; // Use transform
+      // FIXME style and shape ?
+
+      if (!originalEl.invisible) {
+        el.transform = originalEl.transform;
+        el.invTransform = originalEl.invTransform;
+        el.__clipPaths = originalEl.__clipPaths; // el.
+
+        this._doPaintEl(el, hoverLayer, true, scope);
+      }
+    }
+
+    hoverLayer.ctx.restore();
+  },
+  getHoverLayer: function () {
+    return this.getLayer(HOVER_LAYER_ZLEVEL);
+  },
+  _paintList: function (list, paintAll, redrawId) {
+    if (this._redrawId !== redrawId) {
+      return;
+    }
+
+    paintAll = paintAll || false;
+
+    this._updateLayerStatus(list);
+
+    var finished = this._doPaintList(list, paintAll);
+
+    if (this._needsManuallyCompositing) {
+      this._compositeManually();
+    }
+
+    if (!finished) {
+      var self = this;
+      requestAnimationFrame(function () {
+        self._paintList(list, paintAll, redrawId);
+      });
+    }
+  },
+  _compositeManually: function () {
+    var ctx = this.getLayer(CANVAS_ZLEVEL).ctx;
+    var width = this._domRoot.width;
+    var height = this._domRoot.height;
+    ctx.clearRect(0, 0, width, height); // PENDING, If only builtin layer?
+
+    this.eachBuiltinLayer(function (layer) {
+      if (layer.virtual) {
+        ctx.drawImage(layer.dom, 0, 0, width, height);
+      }
+    });
+  },
+  _doPaintList: function (list, paintAll) {
+    var layerList = [];
+
+    for (var zi = 0; zi < this._zlevelList.length; zi++) {
+      var zlevel = this._zlevelList[zi];
+      var layer = this._layers[zlevel];
+
+      if (layer.__builtin__ && layer !== this._hoverlayer && (layer.__dirty || paintAll)) {
+        layerList.push(layer);
+      }
+    }
+
+    var finished = true;
+
+    for (var k = 0; k < layerList.length; k++) {
+      var layer = layerList[k];
+      var ctx = layer.ctx;
+      var scope = {};
+      ctx.save();
+      var start = paintAll ? layer.__startIndex : layer.__drawIndex;
+      var useTimer = !paintAll && layer.incremental && Date.now;
+      var startTime = useTimer && Date.now();
+      var clearColor = layer.zlevel === this._zlevelList[0] ? this._backgroundColor : null; // All elements in this layer are cleared.
+
+      if (layer.__startIndex === layer.__endIndex) {
+        layer.clear(false, clearColor);
+      } else if (start === layer.__startIndex) {
+        var firstEl = list[start];
+
+        if (!firstEl.incremental || !firstEl.notClear || paintAll) {
+          layer.clear(false, clearColor);
+        }
+      }
+
+      if (start === -1) {
+        console.error('For some unknown reason. drawIndex is -1');
+        start = layer.__startIndex;
+      }
+
+      for (var i = start; i < layer.__endIndex; i++) {
+        var el = list[i];
+
+        this._doPaintEl(el, layer, paintAll, scope);
+
+        el.__dirty = el.__dirtyText = false;
+
+        if (useTimer) {
+          // Date.now can be executed in 13,025,305 ops/second.
+          var dTime = Date.now() - startTime; // Give 15 millisecond to draw.
+          // The rest elements will be drawn in the next frame.
+
+          if (dTime > 15) {
+            break;
+          }
+        }
+      }
+
+      layer.__drawIndex = i;
+
+      if (layer.__drawIndex < layer.__endIndex) {
+        finished = false;
+      }
+
+      if (scope.prevElClipPaths) {
+        // Needs restore the state. If last drawn element is in the clipping area.
+        ctx.restore();
+      }
+
+      ctx.restore();
+    }
+
+    if (env$1.wxa) {
+      // Flush for weixin application
+      each$1(this._layers, function (layer) {
+        if (layer && layer.ctx && layer.ctx.draw) {
+          layer.ctx.draw();
+        }
+      });
+    }
+
+    return finished;
+  },
+  _doPaintEl: function (el, currentLayer, forcePaint, scope) {
+    var ctx = currentLayer.ctx;
+    var m = el.transform;
+
+    if ((currentLayer.__dirty || forcePaint) && // Ignore invisible element
+    !el.invisible // Ignore transparent element
+    && el.style.opacity !== 0 // Ignore scale 0 element, in some environment like node-canvas
+    // Draw a scale 0 element can cause all following draw wrong
+    // And setTransform with scale 0 will cause set back transform failed.
+    && !(m && !m[0] && !m[3]) // Ignore culled element
+    && !(el.culling && isDisplayableCulled(el, this._width, this._height))) {
+      var clipPaths = el.__clipPaths; // Optimize when clipping on group with several elements
+
+      if (!scope.prevElClipPaths || isClipPathChanged(clipPaths, scope.prevElClipPaths)) {
+        // If has previous clipping state, restore from it
+        if (scope.prevElClipPaths) {
+          currentLayer.ctx.restore();
+          scope.prevElClipPaths = null; // Reset prevEl since context has been restored
+
+          scope.prevEl = null;
+        } // New clipping state
+
+
+        if (clipPaths) {
+          ctx.save();
+          doClip(clipPaths, ctx);
+          scope.prevElClipPaths = clipPaths;
+        }
+      }
+
+      el.beforeBrush && el.beforeBrush(ctx);
+      el.brush(ctx, scope.prevEl || null);
+      scope.prevEl = el;
+      el.afterBrush && el.afterBrush(ctx);
+    }
+  },
+
+  /**
+   * 鑾峰彇 zlevel 鎵�鍦ㄥ眰锛屽鏋滀笉瀛樺湪鍒欎細鍒涘缓涓�涓柊鐨勫眰
+   * @param {number} zlevel
+   * @param {boolean} virtual Virtual layer will not be inserted into dom.
+   * @return {module:zrender/Layer}
+   */
+  getLayer: function (zlevel, virtual) {
+    if (this._singleCanvas && !this._needsManuallyCompositing) {
+      zlevel = CANVAS_ZLEVEL;
+    }
+
+    var layer = this._layers[zlevel];
+
+    if (!layer) {
+      // Create a new layer
+      layer = new Layer('zr_' + zlevel, this, this.dpr);
+      layer.zlevel = zlevel;
+      layer.__builtin__ = true;
+
+      if (this._layerConfig[zlevel]) {
+        merge(layer, this._layerConfig[zlevel], true);
+      }
+
+      if (virtual) {
+        layer.virtual = virtual;
+      }
+
+      this.insertLayer(zlevel, layer); // Context is created after dom inserted to document
+      // Or excanvas will get 0px clientWidth and clientHeight
+
+      layer.initContext();
+    }
+
+    return layer;
+  },
+  insertLayer: function (zlevel, layer) {
+    var layersMap = this._layers;
+    var zlevelList = this._zlevelList;
+    var len = zlevelList.length;
+    var prevLayer = null;
+    var i = -1;
+    var domRoot = this._domRoot;
+
+    if (layersMap[zlevel]) {
+      zrLog('ZLevel ' + zlevel + ' has been used already');
+      return;
+    } // Check if is a valid layer
+
+
+    if (!isLayerValid(layer)) {
+      zrLog('Layer of zlevel ' + zlevel + ' is not valid');
+      return;
+    }
+
+    if (len > 0 && zlevel > zlevelList[0]) {
+      for (i = 0; i < len - 1; i++) {
+        if (zlevelList[i] < zlevel && zlevelList[i + 1] > zlevel) {
+          break;
+        }
+      }
+
+      prevLayer = layersMap[zlevelList[i]];
+    }
+
+    zlevelList.splice(i + 1, 0, zlevel);
+    layersMap[zlevel] = layer; // Vitual layer will not directly show on the screen.
+    // (It can be a WebGL layer and assigned to a ZImage element)
+    // But it still under management of zrender.
+
+    if (!layer.virtual) {
+      if (prevLayer) {
+        var prevDom = prevLayer.dom;
+
+        if (prevDom.nextSibling) {
+          domRoot.insertBefore(layer.dom, prevDom.nextSibling);
+        } else {
+          domRoot.appendChild(layer.dom);
+        }
+      } else {
+        if (domRoot.firstChild) {
+          domRoot.insertBefore(layer.dom, domRoot.firstChild);
+        } else {
+          domRoot.appendChild(layer.dom);
+        }
+      }
+    }
+  },
+  // Iterate each layer
+  eachLayer: function (cb, context) {
+    var zlevelList = this._zlevelList;
+    var z;
+    var i;
+
+    for (i = 0; i < zlevelList.length; i++) {
+      z = zlevelList[i];
+      cb.call(context, this._layers[z], z);
+    }
+  },
+  // Iterate each buildin layer
+  eachBuiltinLayer: function (cb, context) {
+    var zlevelList = this._zlevelList;
+    var layer;
+    var z;
+    var i;
+
+    for (i = 0; i < zlevelList.length; i++) {
+      z = zlevelList[i];
+      layer = this._layers[z];
+
+      if (layer.__builtin__) {
+        cb.call(context, layer, z);
+      }
+    }
+  },
+  // Iterate each other layer except buildin layer
+  eachOtherLayer: function (cb, context) {
+    var zlevelList = this._zlevelList;
+    var layer;
+    var z;
+    var i;
+
+    for (i = 0; i < zlevelList.length; i++) {
+      z = zlevelList[i];
+      layer = this._layers[z];
+
+      if (!layer.__builtin__) {
+        cb.call(context, layer, z);
+      }
+    }
+  },
+
+  /**
+   * 鑾峰彇鎵�鏈夊凡鍒涘缓鐨勫眰
+   * @param {Array.<module:zrender/Layer>} [prevLayer]
+   */
+  getLayers: function () {
+    return this._layers;
+  },
+  _updateLayerStatus: function (list) {
+    this.eachBuiltinLayer(function (layer, z) {
+      layer.__dirty = layer.__used = false;
+    });
+
+    function updatePrevLayer(idx) {
+      if (prevLayer) {
+        if (prevLayer.__endIndex !== idx) {
+          prevLayer.__dirty = true;
+        }
+
+        prevLayer.__endIndex = idx;
+      }
+    }
+
+    if (this._singleCanvas) {
+      for (var i = 1; i < list.length; i++) {
+        var el = list[i];
+
+        if (el.zlevel !== list[i - 1].zlevel || el.incremental) {
+          this._needsManuallyCompositing = true;
+          break;
+        }
+      }
+    }
+
+    var prevLayer = null;
+    var incrementalLayerCount = 0;
+
+    for (var i = 0; i < list.length; i++) {
+      var el = list[i];
+      var zlevel = el.zlevel;
+      var layer; // PENDING If change one incremental element style ?
+      // TODO Where there are non-incremental elements between incremental elements.
+
+      if (el.incremental) {
+        layer = this.getLayer(zlevel + INCREMENTAL_INC, this._needsManuallyCompositing);
+        layer.incremental = true;
+        incrementalLayerCount = 1;
+      } else {
+        layer = this.getLayer(zlevel + (incrementalLayerCount > 0 ? EL_AFTER_INCREMENTAL_INC : 0), this._needsManuallyCompositing);
+      }
+
+      if (!layer.__builtin__) {
+        zrLog('ZLevel ' + zlevel + ' has been used by unkown layer ' + layer.id);
+      }
+
+      if (layer !== prevLayer) {
+        layer.__used = true;
+
+        if (layer.__startIndex !== i) {
+          layer.__dirty = true;
+        }
+
+        layer.__startIndex = i;
+
+        if (!layer.incremental) {
+          layer.__drawIndex = i;
+        } else {
+          // Mark layer draw index needs to update.
+          layer.__drawIndex = -1;
+        }
+
+        updatePrevLayer(i);
+        prevLayer = layer;
+      }
+
+      if (el.__dirty) {
+        layer.__dirty = true;
+
+        if (layer.incremental && layer.__drawIndex < 0) {
+          // Start draw from the first dirty element.
+          layer.__drawIndex = i;
+        }
+      }
+    }
+
+    updatePrevLayer(i);
+    this.eachBuiltinLayer(function (layer, z) {
+      // Used in last frame but not in this frame. Needs clear
+      if (!layer.__used && layer.getElementCount() > 0) {
+        layer.__dirty = true;
+        layer.__startIndex = layer.__endIndex = layer.__drawIndex = 0;
+      } // For incremental layer. In case start index changed and no elements are dirty.
+
+
+      if (layer.__dirty && layer.__drawIndex < 0) {
+        layer.__drawIndex = layer.__startIndex;
+      }
+    });
+  },
+
+  /**
+   * 娓呴櫎hover灞傚鎵�鏈夊唴瀹�
+   */
+  clear: function () {
+    this.eachBuiltinLayer(this._clearLayer);
+    return this;
+  },
+  _clearLayer: function (layer) {
+    layer.clear();
+  },
+  setBackgroundColor: function (backgroundColor) {
+    this._backgroundColor = backgroundColor;
+  },
+
+  /**
+   * 淇敼鎸囧畾zlevel鐨勭粯鍒跺弬鏁�
+   *
+   * @param {string} zlevel
+   * @param {Object} config 閰嶇疆瀵硅薄
+   * @param {string} [config.clearColor=0] 姣忔娓呯┖鐢诲竷鐨勯鑹�
+   * @param {string} [config.motionBlur=false] 鏄惁寮�鍚姩鎬佹ā绯�
+   * @param {number} [config.lastFrameAlpha=0.7]
+   *                 鍦ㄥ紑鍚姩鎬佹ā绯婄殑鏃跺�欎娇鐢紝涓庝笂涓�甯ф贩鍚堢殑alpha鍊硷紝鍊艰秺澶у熬杩硅秺鏄庢樉
+   */
+  configLayer: function (zlevel, config) {
+    if (config) {
+      var layerConfig = this._layerConfig;
+
+      if (!layerConfig[zlevel]) {
+        layerConfig[zlevel] = config;
+      } else {
+        merge(layerConfig[zlevel], config, true);
+      }
+
+      for (var i = 0; i < this._zlevelList.length; i++) {
+        var _zlevel = this._zlevelList[i];
+
+        if (_zlevel === zlevel || _zlevel === zlevel + EL_AFTER_INCREMENTAL_INC) {
+          var layer = this._layers[_zlevel];
+          merge(layer, layerConfig[zlevel], true);
+        }
+      }
+    }
+  },
+
+  /**
+   * 鍒犻櫎鎸囧畾灞�
+   * @param {number} zlevel 灞傛墍鍦ㄧ殑zlevel
+   */
+  delLayer: function (zlevel) {
+    var layers = this._layers;
+    var zlevelList = this._zlevelList;
+    var layer = layers[zlevel];
+
+    if (!layer) {
+      return;
+    }
+
+    layer.dom.parentNode.removeChild(layer.dom);
+    delete layers[zlevel];
+    zlevelList.splice(indexOf(zlevelList, zlevel), 1);
+  },
+
+  /**
+   * 鍖哄煙澶у皬鍙樺寲鍚庨噸缁�
+   */
+  resize: function (width, height) {
+    if (!this._domRoot.style) {
+      // Maybe in node or worker
+      if (width == null || height == null) {
+        return;
+      }
+
+      this._width = width;
+      this._height = height;
+      this.getLayer(CANVAS_ZLEVEL).resize(width, height);
+    } else {
+      var domRoot = this._domRoot; // FIXME Why ?
+
+      domRoot.style.display = 'none'; // Save input w/h
+
+      var opts = this._opts;
+      width != null && (opts.width = width);
+      height != null && (opts.height = height);
+      width = this._getSize(0);
+      height = this._getSize(1);
+      domRoot.style.display = ''; // 浼樺寲娌℃湁瀹為檯鏀瑰彉鐨剅esize
+
+      if (this._width != width || height != this._height) {
+        domRoot.style.width = width + 'px';
+        domRoot.style.height = height + 'px';
+
+        for (var id in this._layers) {
+          if (this._layers.hasOwnProperty(id)) {
+            this._layers[id].resize(width, height);
+          }
+        }
+
+        each$1(this._progressiveLayers, function (layer) {
+          layer.resize(width, height);
+        });
+        this.refresh(true);
+      }
+
+      this._width = width;
+      this._height = height;
+    }
+
+    return this;
+  },
+
+  /**
+   * 娓呴櫎鍗曠嫭鐨勪竴涓眰
+   * @param {number} zlevel
+   */
+  clearLayer: function (zlevel) {
+    var layer = this._layers[zlevel];
+
+    if (layer) {
+      layer.clear();
+    }
+  },
+
+  /**
+   * 閲婃斁
+   */
+  dispose: function () {
+    this.root.innerHTML = '';
+    this.root = this.storage = this._domRoot = this._layers = null;
+  },
+
+  /**
+   * Get canvas which has all thing rendered
+   * @param {Object} opts
+   * @param {string} [opts.backgroundColor]
+   * @param {number} [opts.pixelRatio]
+   */
+  getRenderedCanvas: function (opts) {
+    opts = opts || {};
+
+    if (this._singleCanvas && !this._compositeManually) {
+      return this._layers[CANVAS_ZLEVEL].dom;
+    }
+
+    var imageLayer = new Layer('image', this, opts.pixelRatio || this.dpr);
+    imageLayer.initContext();
+    imageLayer.clear(false, opts.backgroundColor || this._backgroundColor);
+
+    if (opts.pixelRatio <= this.dpr) {
+      this.refresh();
+      var width = imageLayer.dom.width;
+      var height = imageLayer.dom.height;
+      var ctx = imageLayer.ctx;
+      this.eachLayer(function (layer) {
+        if (layer.__builtin__) {
+          ctx.drawImage(layer.dom, 0, 0, width, height);
+        } else if (layer.renderToCanvas) {
+          imageLayer.ctx.save();
+          layer.renderToCanvas(imageLayer.ctx);
+          imageLayer.ctx.restore();
+        }
+      });
+    } else {
+      // PENDING, echarts-gl and incremental rendering.
+      var scope = {};
+      var displayList = this.storage.getDisplayList(true);
+
+      for (var i = 0; i < displayList.length; i++) {
+        var el = displayList[i];
+
+        this._doPaintEl(el, imageLayer, true, scope);
+      }
+    }
+
+    return imageLayer.dom;
+  },
+
+  /**
+   * 鑾峰彇缁樺浘鍖哄煙瀹藉害
+   */
+  getWidth: function () {
+    return this._width;
+  },
+
+  /**
+   * 鑾峰彇缁樺浘鍖哄煙楂樺害
+   */
+  getHeight: function () {
+    return this._height;
+  },
+  _getSize: function (whIdx) {
+    var opts = this._opts;
+    var wh = ['width', 'height'][whIdx];
+    var cwh = ['clientWidth', 'clientHeight'][whIdx];
+    var plt = ['paddingLeft', 'paddingTop'][whIdx];
+    var prb = ['paddingRight', 'paddingBottom'][whIdx];
+
+    if (opts[wh] != null && opts[wh] !== 'auto') {
+      return parseFloat(opts[wh]);
+    }
+
+    var root = this.root; // IE8 does not support getComputedStyle, but it use VML.
+
+    var stl = document.defaultView.getComputedStyle(root);
+    return (root[cwh] || parseInt10(stl[wh]) || parseInt10(root.style[wh])) - (parseInt10(stl[plt]) || 0) - (parseInt10(stl[prb]) || 0) | 0;
+  },
+  pathToImage: function (path, dpr) {
+    dpr = dpr || this.dpr;
+    var canvas = document.createElement('canvas');
+    var ctx = canvas.getContext('2d');
+    var rect = path.getBoundingRect();
+    var style = path.style;
+    var shadowBlurSize = style.shadowBlur * dpr;
+    var shadowOffsetX = style.shadowOffsetX * dpr;
+    var shadowOffsetY = style.shadowOffsetY * dpr;
+    var lineWidth = style.hasStroke() ? style.lineWidth : 0;
+    var leftMargin = Math.max(lineWidth / 2, -shadowOffsetX + shadowBlurSize);
+    var rightMargin = Math.max(lineWidth / 2, shadowOffsetX + shadowBlurSize);
+    var topMargin = Math.max(lineWidth / 2, -shadowOffsetY + shadowBlurSize);
+    var bottomMargin = Math.max(lineWidth / 2, shadowOffsetY + shadowBlurSize);
+    var width = rect.width + leftMargin + rightMargin;
+    var height = rect.height + topMargin + bottomMargin;
+    canvas.width = width * dpr;
+    canvas.height = height * dpr;
+    ctx.scale(dpr, dpr);
+    ctx.clearRect(0, 0, width, height);
+    ctx.dpr = dpr;
+    var pathTransform = {
+      position: path.position,
+      rotation: path.rotation,
+      scale: path.scale
+    };
+    path.position = [leftMargin - rect.x, topMargin - rect.y];
+    path.rotation = 0;
+    path.scale = [1, 1];
+    path.updateTransform();
+
+    if (path) {
+      path.brush(ctx);
+    }
+
+    var ImageShape = ZImage;
+    var imgShape = new ImageShape({
+      style: {
+        x: 0,
+        y: 0,
+        image: canvas
+      }
+    });
+
+    if (pathTransform.position != null) {
+      imgShape.position = path.position = pathTransform.position;
+    }
+
+    if (pathTransform.rotation != null) {
+      imgShape.rotation = path.rotation = pathTransform.rotation;
+    }
+
+    if (pathTransform.scale != null) {
+      imgShape.scale = path.scale = pathTransform.scale;
+    }
+
+    return imgShape;
+  }
+};
+
+/**
+ * 鍔ㄧ敾涓荤被, 璋冨害鍜岀鐞嗘墍鏈夊姩鐢绘帶鍒跺櫒
+ *
+ * @module zrender/animation/Animation
+ * @author pissang(https://github.com/pissang)
+ */
+// TODO Additive animation
+// http://iosoteric.com/additive-animations-animatewithduration-in-ios-8/
+// https://developer.apple.com/videos/wwdc2014/#236
+/**
+ * @typedef {Object} IZRenderStage
+ * @property {Function} update
+ */
+
+/**
+ * @alias module:zrender/animation/Animation
+ * @constructor
+ * @param {Object} [options]
+ * @param {Function} [options.onframe]
+ * @param {IZRenderStage} [options.stage]
+ * @example
+ *     var animation = new Animation();
+ *     var obj = {
+ *         x: 100,
+ *         y: 100
+ *     };
+ *     animation.animate(node.position)
+ *         .when(1000, {
+ *             x: 500,
+ *             y: 500
+ *         })
+ *         .when(2000, {
+ *             x: 100,
+ *             y: 100
+ *         })
+ *         .start('spline');
+ */
+
+var Animation = function (options) {
+  options = options || {};
+  this.stage = options.stage || {};
+
+  this.onframe = options.onframe || function () {}; // private properties
+
+
+  this._clips = [];
+  this._running = false;
+  this._time;
+  this._pausedTime;
+  this._pauseStart;
+  this._paused = false;
+  Eventful.call(this);
+};
+
+Animation.prototype = {
+  constructor: Animation,
+
+  /**
+   * 娣诲姞 clip
+   * @param {module:zrender/animation/Clip} clip
+   */
+  addClip: function (clip) {
+    this._clips.push(clip);
+  },
+
+  /**
+   * 娣诲姞 animator
+   * @param {module:zrender/animation/Animator} animator
+   */
+  addAnimator: function (animator) {
+    animator.animation = this;
+    var clips = animator.getClips();
+
+    for (var i = 0; i < clips.length; i++) {
+      this.addClip(clips[i]);
+    }
+  },
+
+  /**
+   * 鍒犻櫎鍔ㄧ敾鐗囨
+   * @param {module:zrender/animation/Clip} clip
+   */
+  removeClip: function (clip) {
+    var idx = indexOf(this._clips, clip);
+
+    if (idx >= 0) {
+      this._clips.splice(idx, 1);
+    }
+  },
+
+  /**
+   * 鍒犻櫎鍔ㄧ敾鐗囨
+   * @param {module:zrender/animation/Animator} animator
+   */
+  removeAnimator: function (animator) {
+    var clips = animator.getClips();
+
+    for (var i = 0; i < clips.length; i++) {
+      this.removeClip(clips[i]);
+    }
+
+    animator.animation = null;
+  },
+  _update: function () {
+    var time = new Date().getTime() - this._pausedTime;
+
+    var delta = time - this._time;
+    var clips = this._clips;
+    var len = clips.length;
+    var deferredEvents = [];
+    var deferredClips = [];
+
+    for (var i = 0; i < len; i++) {
+      var clip = clips[i];
+      var e = clip.step(time, delta); // Throw out the events need to be called after
+      // stage.update, like destroy
+
+      if (e) {
+        deferredEvents.push(e);
+        deferredClips.push(clip);
+      }
+    } // Remove the finished clip
+
+
+    for (var i = 0; i < len;) {
+      if (clips[i]._needsRemove) {
+        clips[i] = clips[len - 1];
+        clips.pop();
+        len--;
+      } else {
+        i++;
+      }
+    }
+
+    len = deferredEvents.length;
+
+    for (var i = 0; i < len; i++) {
+      deferredClips[i].fire(deferredEvents[i]);
+    }
+
+    this._time = time;
+    this.onframe(delta); // 'frame' should be triggered before stage, because upper application
+    // depends on the sequence (e.g., echarts-stream and finish
+    // event judge)
+
+    this.trigger('frame', delta);
+
+    if (this.stage.update) {
+      this.stage.update();
+    }
+  },
+  _startLoop: function () {
+    var self = this;
+    this._running = true;
+
+    function step() {
+      if (self._running) {
+        requestAnimationFrame(step);
+        !self._paused && self._update();
+      }
+    }
+
+    requestAnimationFrame(step);
+  },
+
+  /**
+   * Start animation.
+   */
+  start: function () {
+    this._time = new Date().getTime();
+    this._pausedTime = 0;
+
+    this._startLoop();
+  },
+
+  /**
+   * Stop animation.
+   */
+  stop: function () {
+    this._running = false;
+  },
+
+  /**
+   * Pause animation.
+   */
+  pause: function () {
+    if (!this._paused) {
+      this._pauseStart = new Date().getTime();
+      this._paused = true;
+    }
+  },
+
+  /**
+   * Resume animation.
+   */
+  resume: function () {
+    if (this._paused) {
+      this._pausedTime += new Date().getTime() - this._pauseStart;
+      this._paused = false;
+    }
+  },
+
+  /**
+   * Clear animation.
+   */
+  clear: function () {
+    this._clips = [];
+  },
+
+  /**
+   * Whether animation finished.
+   */
+  isFinished: function () {
+    return !this._clips.length;
+  },
+
+  /**
+   * Creat animator for a target, whose props can be animated.
+   *
+   * @param  {Object} target
+   * @param  {Object} options
+   * @param  {boolean} [options.loop=false] Whether loop animation.
+   * @param  {Function} [options.getter=null] Get value from target.
+   * @param  {Function} [options.setter=null] Set value to target.
+   * @return {module:zrender/animation/Animation~Animator}
+   */
+  // TODO Gap
+  animate: function (target, options) {
+    options = options || {};
+    var animator = new Animator(target, options.loop, options.getter, options.setter);
+    this.addAnimator(animator);
+    return animator;
+  }
+};
+mixin(Animation, Eventful);
+
+/**
+ * Only implements needed gestures for mobile.
+ */
+var GestureMgr = function () {
+  /**
+   * @private
+   * @type {Array.<Object>}
+   */
+  this._track = [];
+};
+
+GestureMgr.prototype = {
+  constructor: GestureMgr,
+  recognize: function (event, target, root) {
+    this._doTrack(event, target, root);
+
+    return this._recognize(event);
+  },
+  clear: function () {
+    this._track.length = 0;
+    return this;
+  },
+  _doTrack: function (event, target, root) {
+    var touches = event.touches;
+
+    if (!touches) {
+      return;
+    }
+
+    var trackItem = {
+      points: [],
+      touches: [],
+      target: target,
+      event: event
+    };
+
+    for (var i = 0, len = touches.length; i < len; i++) {
+      var touch = touches[i];
+      var pos = clientToLocal(root, touch, {});
+      trackItem.points.push([pos.zrX, pos.zrY]);
+      trackItem.touches.push(touch);
+    }
+
+    this._track.push(trackItem);
+  },
+  _recognize: function (event) {
+    for (var eventName in recognizers) {
+      if (recognizers.hasOwnProperty(eventName)) {
+        var gestureInfo = recognizers[eventName](this._track, event);
+
+        if (gestureInfo) {
+          return gestureInfo;
+        }
+      }
+    }
+  }
+};
+
+function dist$1(pointPair) {
+  var dx = pointPair[1][0] - pointPair[0][0];
+  var dy = pointPair[1][1] - pointPair[0][1];
+  return Math.sqrt(dx * dx + dy * dy);
+}
+
+function center(pointPair) {
+  return [(pointPair[0][0] + pointPair[1][0]) / 2, (pointPair[0][1] + pointPair[1][1]) / 2];
+}
+
+var recognizers = {
+  pinch: function (track, event) {
+    var trackLen = track.length;
+
+    if (!trackLen) {
+      return;
+    }
+
+    var pinchEnd = (track[trackLen - 1] || {}).points;
+    var pinchPre = (track[trackLen - 2] || {}).points || pinchEnd;
+
+    if (pinchPre && pinchPre.length > 1 && pinchEnd && pinchEnd.length > 1) {
+      var pinchScale = dist$1(pinchEnd) / dist$1(pinchPre);
+      !isFinite(pinchScale) && (pinchScale = 1);
+      event.pinchScale = pinchScale;
+      var pinchCenter = center(pinchEnd);
+      event.pinchX = pinchCenter[0];
+      event.pinchY = pinchCenter[1];
+      return {
+        type: 'pinch',
+        target: track[0].target,
+        event: event
+      };
+    }
+  } // Only pinch currently.
+
+};
+
+var TOUCH_CLICK_DELAY = 300;
+var mouseHandlerNames = ['click', 'dblclick', 'mousewheel', 'mouseout', 'mouseup', 'mousedown', 'mousemove', 'contextmenu'];
+var touchHandlerNames = ['touchstart', 'touchend', 'touchmove'];
+var pointerEventNames = {
+  pointerdown: 1,
+  pointerup: 1,
+  pointermove: 1,
+  pointerout: 1
+};
+var pointerHandlerNames = map(mouseHandlerNames, function (name) {
+  var nm = name.replace('mouse', 'pointer');
+  return pointerEventNames[nm] ? nm : name;
+});
+
+function eventNameFix(name) {
+  return name === 'mousewheel' && env$1.browser.firefox ? 'DOMMouseScroll' : name;
+}
+
+function processGesture(proxy, event, stage) {
+  var gestureMgr = proxy._gestureMgr;
+  stage === 'start' && gestureMgr.clear();
+  var gestureInfo = gestureMgr.recognize(event, proxy.handler.findHover(event.zrX, event.zrY, null).target, proxy.dom);
+  stage === 'end' && gestureMgr.clear(); // Do not do any preventDefault here. Upper application do that if necessary.
+
+  if (gestureInfo) {
+    var type = gestureInfo.type;
+    event.gestureEvent = type;
+    proxy.handler.dispatchToElement({
+      target: gestureInfo.target
+    }, type, gestureInfo.event);
+  }
+} // function onMSGestureChange(proxy, event) {
+//     if (event.translationX || event.translationY) {
+//         // mousemove is carried by MSGesture to reduce the sensitivity.
+//         proxy.handler.dispatchToElement(event.target, 'mousemove', event);
+//     }
+//     if (event.scale !== 1) {
+//         event.pinchX = event.offsetX;
+//         event.pinchY = event.offsetY;
+//         event.pinchScale = event.scale;
+//         proxy.handler.dispatchToElement(event.target, 'pinch', event);
+//     }
+// }
+
+/**
+ * Prevent mouse event from being dispatched after Touch Events action
+ * @see <https://github.com/deltakosh/handjs/blob/master/src/hand.base.js>
+ * 1. Mobile browsers dispatch mouse events 300ms after touchend.
+ * 2. Chrome for Android dispatch mousedown for long-touch about 650ms
+ * Result: Blocking Mouse Events for 700ms.
+ */
+
+
+function setTouchTimer(instance) {
+  instance._touching = true;
+  clearTimeout(instance._touchTimer);
+  instance._touchTimer = setTimeout(function () {
+    instance._touching = false;
+  }, 700);
+}
+
+var domHandlers = {
+  /**
+   * Mouse move handler
+   * @inner
+   * @param {Event} event
+   */
+  mousemove: function (event) {
+    event = normalizeEvent(this.dom, event);
+    this.trigger('mousemove', event);
+  },
+
+  /**
+   * Mouse out handler
+   * @inner
+   * @param {Event} event
+   */
+  mouseout: function (event) {
+    event = normalizeEvent(this.dom, event);
+    var element = event.toElement || event.relatedTarget;
+
+    if (element != this.dom) {
+      while (element && element.nodeType != 9) {
+        // 蹇界暐鍖呭惈鍦╮oot涓殑dom寮曡捣鐨刴ouseOut
+        if (element === this.dom) {
+          return;
+        }
+
+        element = element.parentNode;
+      }
+    }
+
+    this.trigger('mouseout', event);
+  },
+
+  /**
+   * Touch寮�濮嬪搷搴斿嚱鏁�
+   * @inner
+   * @param {Event} event
+   */
+  touchstart: function (event) {
+    // Default mouse behaviour should not be disabled here.
+    // For example, page may needs to be slided.
+    event = normalizeEvent(this.dom, event); // Mark touch, which is useful in distinguish touch and
+    // mouse event in upper applicatoin.
+
+    event.zrByTouch = true;
+    this._lastTouchMoment = new Date();
+    processGesture(this, event, 'start'); // In touch device, trigger `mousemove`(`mouseover`) should
+    // be triggered, and must before `mousedown` triggered.
+
+    domHandlers.mousemove.call(this, event);
+    domHandlers.mousedown.call(this, event);
+    setTouchTimer(this);
+  },
+
+  /**
+   * Touch绉诲姩鍝嶅簲鍑芥暟
+   * @inner
+   * @param {Event} event
+   */
+  touchmove: function (event) {
+    event = normalizeEvent(this.dom, event); // Mark touch, which is useful in distinguish touch and
+    // mouse event in upper applicatoin.
+
+    event.zrByTouch = true;
+    processGesture(this, event, 'change'); // Mouse move should always be triggered no matter whether
+    // there is gestrue event, because mouse move and pinch may
+    // be used at the same time.
+
+    domHandlers.mousemove.call(this, event);
+    setTouchTimer(this);
+  },
+
+  /**
+   * Touch缁撴潫鍝嶅簲鍑芥暟
+   * @inner
+   * @param {Event} event
+   */
+  touchend: function (event) {
+    event = normalizeEvent(this.dom, event); // Mark touch, which is useful in distinguish touch and
+    // mouse event in upper applicatoin.
+
+    event.zrByTouch = true;
+    processGesture(this, event, 'end');
+    domHandlers.mouseup.call(this, event); // Do not trigger `mouseout` here, in spite of `mousemove`(`mouseover`) is
+    // triggered in `touchstart`. This seems to be illogical, but by this mechanism,
+    // we can conveniently implement "hover style" in both PC and touch device just
+    // by listening to `mouseover` to add "hover style" and listening to `mouseout`
+    // to remove "hover style" on an element, without any additional code for
+    // compatibility. (`mouseout` will not be triggered in `touchend`, so "hover
+    // style" will remain for user view)
+    // click event should always be triggered no matter whether
+    // there is gestrue event. System click can not be prevented.
+
+    if (+new Date() - this._lastTouchMoment < TOUCH_CLICK_DELAY) {
+      domHandlers.click.call(this, event);
+    }
+
+    setTouchTimer(this);
+  },
+  pointerdown: function (event) {
+    domHandlers.mousedown.call(this, event); // if (useMSGuesture(this, event)) {
+    //     this._msGesture.addPointer(event.pointerId);
+    // }
+  },
+  pointermove: function (event) {
+    // FIXME
+    // pointermove is so sensitive that it always triggered when
+    // tap(click) on touch screen, which affect some judgement in
+    // upper application. So, we dont support mousemove on MS touch
+    // device yet.
+    if (!isPointerFromTouch(event)) {
+      domHandlers.mousemove.call(this, event);
+    }
+  },
+  pointerup: function (event) {
+    domHandlers.mouseup.call(this, event);
+  },
+  pointerout: function (event) {
+    // pointerout will be triggered when tap on touch screen
+    // (IE11+/Edge on MS Surface) after click event triggered,
+    // which is inconsistent with the mousout behavior we defined
+    // in touchend. So we unify them.
+    // (check domHandlers.touchend for detailed explanation)
+    if (!isPointerFromTouch(event)) {
+      domHandlers.mouseout.call(this, event);
+    }
+  }
+};
+
+function isPointerFromTouch(event) {
+  var pointerType = event.pointerType;
+  return pointerType === 'pen' || pointerType === 'touch';
+} // function useMSGuesture(handlerProxy, event) {
+//     return isPointerFromTouch(event) && !!handlerProxy._msGesture;
+// }
+// Common handlers
+
+
+each$1(['click', 'mousedown', 'mouseup', 'mousewheel', 'dblclick', 'contextmenu'], function (name) {
+  domHandlers[name] = function (event) {
+    event = normalizeEvent(this.dom, event);
+    this.trigger(name, event);
+  };
+});
+/**
+ * 涓烘帶鍒剁被瀹炰緥鍒濆鍖杁om 浜嬩欢澶勭悊鍑芥暟
+ *
+ * @inner
+ * @param {module:zrender/Handler} instance 鎺у埗绫诲疄渚�
+ */
+
+function initDomHandler(instance) {
+  each$1(touchHandlerNames, function (name) {
+    instance._handlers[name] = bind(domHandlers[name], instance);
+  });
+  each$1(pointerHandlerNames, function (name) {
+    instance._handlers[name] = bind(domHandlers[name], instance);
+  });
+  each$1(mouseHandlerNames, function (name) {
+    instance._handlers[name] = makeMouseHandler(domHandlers[name], instance);
+  });
+
+  function makeMouseHandler(fn, instance) {
+    return function () {
+      if (instance._touching) {
+        return;
+      }
+
+      return fn.apply(instance, arguments);
+    };
+  }
+}
+
+function HandlerDomProxy(dom) {
+  Eventful.call(this);
+  this.dom = dom;
+  /**
+   * @private
+   * @type {boolean}
+   */
+
+  this._touching = false;
+  /**
+   * @private
+   * @type {number}
+   */
+
+  this._touchTimer;
+  /**
+   * @private
+   * @type {module:zrender/core/GestureMgr}
+   */
+
+  this._gestureMgr = new GestureMgr();
+  this._handlers = {};
+  initDomHandler(this);
+
+  if (env$1.pointerEventsSupported) {
+    // Only IE11+/Edge
+    // 1. On devices that both enable touch and mouse (e.g., MS Surface and lenovo X240),
+    // IE11+/Edge do not trigger touch event, but trigger pointer event and mouse event
+    // at the same time.
+    // 2. On MS Surface, it probablely only trigger mousedown but no mouseup when tap on
+    // screen, which do not occurs in pointer event.
+    // So we use pointer event to both detect touch gesture and mouse behavior.
+    mountHandlers(pointerHandlerNames, this); // FIXME
+    // Note: MS Gesture require CSS touch-action set. But touch-action is not reliable,
+    // which does not prevent defuault behavior occasionally (which may cause view port
+    // zoomed in but use can not zoom it back). And event.preventDefault() does not work.
+    // So we have to not to use MSGesture and not to support touchmove and pinch on MS
+    // touch screen. And we only support click behavior on MS touch screen now.
+    // MS Gesture Event is only supported on IE11+/Edge and on Windows 8+.
+    // We dont support touch on IE on win7.
+    // See <https://msdn.microsoft.com/en-us/library/dn433243(v=vs.85).aspx>
+    // if (typeof MSGesture === 'function') {
+    //     (this._msGesture = new MSGesture()).target = dom; // jshint ignore:line
+    //     dom.addEventListener('MSGestureChange', onMSGestureChange);
+    // }
+  } else {
+    if (env$1.touchEventsSupported) {
+      mountHandlers(touchHandlerNames, this); // Handler of 'mouseout' event is needed in touch mode, which will be mounted below.
+      // addEventListener(root, 'mouseout', this._mouseoutHandler);
+    } // 1. Considering some devices that both enable touch and mouse event (like on MS Surface
+    // and lenovo X240, @see #2350), we make mouse event be always listened, otherwise
+    // mouse event can not be handle in those devices.
+    // 2. On MS Surface, Chrome will trigger both touch event and mouse event. How to prevent
+    // mouseevent after touch event triggered, see `setTouchTimer`.
+
+
+    mountHandlers(mouseHandlerNames, this);
+  }
+
+  function mountHandlers(handlerNames, instance) {
+    each$1(handlerNames, function (name) {
+      addEventListener(dom, eventNameFix(name), instance._handlers[name]);
+    }, instance);
+  }
+}
+
+var handlerDomProxyProto = HandlerDomProxy.prototype;
+
+handlerDomProxyProto.dispose = function () {
+  var handlerNames = mouseHandlerNames.concat(touchHandlerNames);
+
+  for (var i = 0; i < handlerNames.length; i++) {
+    var name = handlerNames[i];
+    removeEventListener(this.dom, eventNameFix(name), this._handlers[name]);
+  }
+};
+
+handlerDomProxyProto.setCursor = function (cursorStyle) {
+  this.dom.style && (this.dom.style.cursor = cursorStyle || 'default');
+};
+
+mixin(HandlerDomProxy, Eventful);
+
+/*!
+* ZRender, a high performance 2d drawing library.
+*
+* Copyright (c) 2013, Baidu Inc.
+* All rights reserved.
+*
+* LICENSE
+* https://github.com/ecomfe/zrender/blob/master/LICENSE.txt
+*/
+var useVML = !env$1.canvasSupported;
+var painterCtors = {
+  canvas: Painter
+};
+var instances$1 = {}; // ZRender瀹炰緥map绱㈠紩
+
+/**
+ * @type {string}
+ */
+
+var version$1 = '4.0.5';
+/**
+ * Initializing a zrender instance
+ * @param {HTMLElement} dom
+ * @param {Object} opts
+ * @param {string} [opts.renderer='canvas'] 'canvas' or 'svg'
+ * @param {number} [opts.devicePixelRatio]
+ * @param {number|string} [opts.width] Can be 'auto' (the same as null/undefined)
+ * @param {number|string} [opts.height] Can be 'auto' (the same as null/undefined)
+ * @return {module:zrender/ZRender}
+ */
+
+function init$1(dom, opts) {
+  var zr = new ZRender(guid(), dom, opts);
+  instances$1[zr.id] = zr;
+  return zr;
+}
+/**
+ * Dispose zrender instance
+ * @param {module:zrender/ZRender} zr
+ */
+
+function dispose$1(zr) {
+  if (zr) {
+    zr.dispose();
+  } else {
+    for (var key in instances$1) {
+      if (instances$1.hasOwnProperty(key)) {
+        instances$1[key].dispose();
+      }
+    }
+
+    instances$1 = {};
+  }
+
+  return this;
+}
+/**
+ * Get zrender instance by id
+ * @param {string} id zrender instance id
+ * @return {module:zrender/ZRender}
+ */
+
+function getInstance(id) {
+  return instances$1[id];
+}
+function registerPainter(name, Ctor) {
+  painterCtors[name] = Ctor;
+}
+
+function delInstance(id) {
+  delete instances$1[id];
+}
+/**
+ * @module zrender/ZRender
+ */
+
+/**
+ * @constructor
+ * @alias module:zrender/ZRender
+ * @param {string} id
+ * @param {HTMLElement} dom
+ * @param {Object} opts
+ * @param {string} [opts.renderer='canvas'] 'canvas' or 'svg'
+ * @param {number} [opts.devicePixelRatio]
+ * @param {number} [opts.width] Can be 'auto' (the same as null/undefined)
+ * @param {number} [opts.height] Can be 'auto' (the same as null/undefined)
+ */
+
+
+var ZRender = function (id, dom, opts) {
+  opts = opts || {};
+  /**
+   * @type {HTMLDomElement}
+   */
+
+  this.dom = dom;
+  /**
+   * @type {string}
+   */
+
+  this.id = id;
+  var self = this;
+  var storage = new Storage();
+  var rendererType = opts.renderer; // TODO WebGL
+
+  if (useVML) {
+    if (!painterCtors.vml) {
+      throw new Error('You need to require \'zrender/vml/vml\' to support IE8');
+    }
+
+    rendererType = 'vml';
+  } else if (!rendererType || !painterCtors[rendererType]) {
+    rendererType = 'canvas';
+  }
+
+  var painter = new painterCtors[rendererType](dom, storage, opts, id);
+  this.storage = storage;
+  this.painter = painter;
+  var handerProxy = !env$1.node && !env$1.worker ? new HandlerDomProxy(painter.getViewportRoot()) : null;
+  this.handler = new Handler(storage, painter, handerProxy, painter.root);
+  /**
+   * @type {module:zrender/animation/Animation}
+   */
+
+  this.animation = new Animation({
+    stage: {
+      update: bind(this.flush, this)
+    }
+  });
+  this.animation.start();
+  /**
+   * @type {boolean}
+   * @private
+   */
+
+  this._needsRefresh; // 淇敼 storage.delFromStorage, 姣忔鍒犻櫎鍏冪礌涔嬪墠鍒犻櫎鍔ㄧ敾
+  // FIXME 鏈夌偣ugly
+
+  var oldDelFromStorage = storage.delFromStorage;
+  var oldAddToStorage = storage.addToStorage;
+
+  storage.delFromStorage = function (el) {
+    oldDelFromStorage.call(storage, el);
+    el && el.removeSelfFromZr(self);
+  };
+
+  storage.addToStorage = function (el) {
+    oldAddToStorage.call(storage, el);
+    el.addSelfToZr(self);
+  };
+};
+
+ZRender.prototype = {
+  constructor: ZRender,
+
+  /**
+   * 鑾峰彇瀹炰緥鍞竴鏍囪瘑
+   * @return {string}
+   */
+  getId: function () {
+    return this.id;
+  },
+
+  /**
+   * 娣诲姞鍏冪礌
+   * @param  {module:zrender/Element} el
+   */
+  add: function (el) {
+    this.storage.addRoot(el);
+    this._needsRefresh = true;
+  },
+
+  /**
+   * 鍒犻櫎鍏冪礌
+   * @param  {module:zrender/Element} el
+   */
+  remove: function (el) {
+    this.storage.delRoot(el);
+    this._needsRefresh = true;
+  },
+
+  /**
+   * Change configuration of layer
+   * @param {string} zLevel
+   * @param {Object} config
+   * @param {string} [config.clearColor=0] Clear color
+   * @param {string} [config.motionBlur=false] If enable motion blur
+   * @param {number} [config.lastFrameAlpha=0.7] Motion blur factor. Larger value cause longer trailer
+  */
+  configLayer: function (zLevel, config) {
+    if (this.painter.configLayer) {
+      this.painter.configLayer(zLevel, config);
+    }
+
+    this._needsRefresh = true;
+  },
+
+  /**
+   * Set background color
+   * @param {string} backgroundColor
+   */
+  setBackgroundColor: function (backgroundColor) {
+    if (this.painter.setBackgroundColor) {
+      this.painter.setBackgroundColor(backgroundColor);
+    }
+
+    this._needsRefresh = true;
+  },
+
+  /**
+   * Repaint the canvas immediately
+   */
+  refreshImmediately: function () {
+    // var start = new Date();
+    // Clear needsRefresh ahead to avoid something wrong happens in refresh
+    // Or it will cause zrender refreshes again and again.
+    this._needsRefresh = false;
+    this.painter.refresh();
+    /**
+     * Avoid trigger zr.refresh in Element#beforeUpdate hook
+     */
+
+    this._needsRefresh = false; // var end = new Date();
+    // var log = document.getElementById('log');
+    // if (log) {
+    //     log.innerHTML = log.innerHTML + '<br>' + (end - start);
+    // }
+  },
+
+  /**
+   * Mark and repaint the canvas in the next frame of browser
+   */
+  refresh: function () {
+    this._needsRefresh = true;
+  },
+
+  /**
+   * Perform all refresh
+   */
+  flush: function () {
+    var triggerRendered;
+
+    if (this._needsRefresh) {
+      triggerRendered = true;
+      this.refreshImmediately();
+    }
+
+    if (this._needsRefreshHover) {
+      triggerRendered = true;
+      this.refreshHoverImmediately();
+    }
+
+    triggerRendered && this.trigger('rendered');
+  },
+
+  /**
+   * Add element to hover layer
+   * @param  {module:zrender/Element} el
+   * @param {Object} style
+   */
+  addHover: function (el, style) {
+    if (this.painter.addHover) {
+      var elMirror = this.painter.addHover(el, style);
+      this.refreshHover();
+      return elMirror;
+    }
+  },
+
+  /**
+   * Add element from hover layer
+   * @param  {module:zrender/Element} el
+   */
+  removeHover: function (el) {
+    if (this.painter.removeHover) {
+      this.painter.removeHover(el);
+      this.refreshHover();
+    }
+  },
+
+  /**
+   * Clear all hover elements in hover layer
+   * @param  {module:zrender/Element} el
+   */
+  clearHover: function () {
+    if (this.painter.clearHover) {
+      this.painter.clearHover();
+      this.refreshHover();
+    }
+  },
+
+  /**
+   * Refresh hover in next frame
+   */
+  refreshHover: function () {
+    this._needsRefreshHover = true;
+  },
+
+  /**
+   * Refresh hover immediately
+   */
+  refreshHoverImmediately: function () {
+    this._needsRefreshHover = false;
+    this.painter.refreshHover && this.painter.refreshHover();
+  },
+
+  /**
+   * Resize the canvas.
+   * Should be invoked when container size is changed
+   * @param {Object} [opts]
+   * @param {number|string} [opts.width] Can be 'auto' (the same as null/undefined)
+   * @param {number|string} [opts.height] Can be 'auto' (the same as null/undefined)
+   */
+  resize: function (opts) {
+    opts = opts || {};
+    this.painter.resize(opts.width, opts.height);
+    this.handler.resize();
+  },
+
+  /**
+   * Stop and clear all animation immediately
+   */
+  clearAnimation: function () {
+    this.animation.clear();
+  },
+
+  /**
+   * Get container width
+   */
+  getWidth: function () {
+    return this.painter.getWidth();
+  },
+
+  /**
+   * Get container height
+   */
+  getHeight: function () {
+    return this.painter.getHeight();
+  },
+
+  /**
+   * Export the canvas as Base64 URL
+   * @param {string} type
+   * @param {string} [backgroundColor='#fff']
+   * @return {string} Base64 URL
+   */
+  // toDataURL: function(type, backgroundColor) {
+  //     return this.painter.getRenderedCanvas({
+  //         backgroundColor: backgroundColor
+  //     }).toDataURL(type);
+  // },
+
+  /**
+   * Converting a path to image.
+   * It has much better performance of drawing image rather than drawing a vector path.
+   * @param {module:zrender/graphic/Path} e
+   * @param {number} width
+   * @param {number} height
+   */
+  pathToImage: function (e, dpr) {
+    return this.painter.pathToImage(e, dpr);
+  },
+
+  /**
+   * Set default cursor
+   * @param {string} [cursorStyle='default'] 渚嬪 crosshair
+   */
+  setCursorStyle: function (cursorStyle) {
+    this.handler.setCursorStyle(cursorStyle);
+  },
+
+  /**
+   * Find hovered element
+   * @param {number} x
+   * @param {number} y
+   * @return {Object} {target, topTarget}
+   */
+  findHover: function (x, y) {
+    return this.handler.findHover(x, y);
+  },
+
+  /**
+   * Bind event
+   *
+   * @param {string} eventName Event name
+   * @param {Function} eventHandler Handler function
+   * @param {Object} [context] Context object
+   */
+  on: function (eventName, eventHandler, context) {
+    this.handler.on(eventName, eventHandler, context);
+  },
+
+  /**
+   * Unbind event
+   * @param {string} eventName Event name
+   * @param {Function} [eventHandler] Handler function
+   */
+  off: function (eventName, eventHandler) {
+    this.handler.off(eventName, eventHandler);
+  },
+
+  /**
+   * Trigger event manually
+   *
+   * @param {string} eventName Event name
+   * @param {event=} event Event object
+   */
+  trigger: function (eventName, event) {
+    this.handler.trigger(eventName, event);
+  },
+
+  /**
+   * Clear all objects and the canvas.
+   */
+  clear: function () {
+    this.storage.delRoot();
+    this.painter.clear();
+  },
+
+  /**
+   * Dispose self.
+   */
+  dispose: function () {
+    this.animation.stop();
+    this.clear();
+    this.storage.dispose();
+    this.painter.dispose();
+    this.handler.dispose();
+    this.animation = this.storage = this.painter = this.handler = null;
+    delInstance(this.id);
+  }
+};
+
+var zrender = (Object.freeze || Object)({
+	version: version$1,
+	init: init$1,
+	dispose: dispose$1,
+	getInstance: getInstance,
+	registerPainter: registerPainter
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var each$2 = each$1;
+var isObject$2 = isObject$1;
+var isArray$1 = isArray;
+/**
+ * Make the name displayable. But we should
+ * make sure it is not duplicated with user
+ * specified name, so use '\0';
+ */
+
+var DUMMY_COMPONENT_NAME_PREFIX = 'series\0';
+/**
+ * If value is not array, then translate it to array.
+ * @param  {*} value
+ * @return {Array} [value] or value
+ */
+
+function normalizeToArray(value) {
+  return value instanceof Array ? value : value == null ? [] : [value];
+}
+/**
+ * Sync default option between normal and emphasis like `position` and `show`
+ * In case some one will write code like
+ *     label: {
+ *          show: false,
+ *          position: 'outside',
+ *          fontSize: 18
+ *     },
+ *     emphasis: {
+ *          label: { show: true }
+ *     }
+ * @param {Object} opt
+ * @param {string} key
+ * @param {Array.<string>} subOpts
+ */
+
+function defaultEmphasis(opt, key, subOpts) {
+  // Caution: performance sensitive.
+  if (opt) {
+    opt[key] = opt[key] || {};
+    opt.emphasis = opt.emphasis || {};
+    opt.emphasis[key] = opt.emphasis[key] || {}; // Default emphasis option from normal
+
+    for (var i = 0, len = subOpts.length; i < len; i++) {
+      var subOptName = subOpts[i];
+
+      if (!opt.emphasis[key].hasOwnProperty(subOptName) && opt[key].hasOwnProperty(subOptName)) {
+        opt.emphasis[key][subOptName] = opt[key][subOptName];
+      }
+    }
+  }
+}
+var TEXT_STYLE_OPTIONS = ['fontStyle', 'fontWeight', 'fontSize', 'fontFamily', 'rich', 'tag', 'color', 'textBorderColor', 'textBorderWidth', 'width', 'height', 'lineHeight', 'align', 'verticalAlign', 'baseline', 'shadowColor', 'shadowBlur', 'shadowOffsetX', 'shadowOffsetY', 'textShadowColor', 'textShadowBlur', 'textShadowOffsetX', 'textShadowOffsetY', 'backgroundColor', 'borderColor', 'borderWidth', 'borderRadius', 'padding']; // modelUtil.LABEL_OPTIONS = modelUtil.TEXT_STYLE_OPTIONS.concat([
+//     'position', 'offset', 'rotate', 'origin', 'show', 'distance', 'formatter',
+//     'fontStyle', 'fontWeight', 'fontSize', 'fontFamily',
+//     // FIXME: deprecated, check and remove it.
+//     'textStyle'
+// ]);
+
+/**
+ * The method do not ensure performance.
+ * data could be [12, 2323, {value: 223}, [1221, 23], {value: [2, 23]}]
+ * This helper method retieves value from data.
+ * @param {string|number|Date|Array|Object} dataItem
+ * @return {number|string|Date|Array.<number|string|Date>}
+ */
+
+function getDataItemValue(dataItem) {
+  return isObject$2(dataItem) && !isArray$1(dataItem) && !(dataItem instanceof Date) ? dataItem.value : dataItem;
+}
+/**
+ * data could be [12, 2323, {value: 223}, [1221, 23], {value: [2, 23]}]
+ * This helper method determine if dataItem has extra option besides value
+ * @param {string|number|Date|Array|Object} dataItem
+ */
+
+function isDataItemOption(dataItem) {
+  return isObject$2(dataItem) && !(dataItem instanceof Array); // // markLine data can be array
+  // && !(dataItem[0] && isObject(dataItem[0]) && !(dataItem[0] instanceof Array));
+}
+/**
+ * Mapping to exists for merge.
+ *
+ * @public
+ * @param {Array.<Object>|Array.<module:echarts/model/Component>} exists
+ * @param {Object|Array.<Object>} newCptOptions
+ * @return {Array.<Object>} Result, like [{exist: ..., option: ...}, {}],
+ *                          index of which is the same as exists.
+ */
+
+function mappingToExists(exists, newCptOptions) {
+  // Mapping by the order by original option (but not order of
+  // new option) in merge mode. Because we should ensure
+  // some specified index (like xAxisIndex) is consistent with
+  // original option, which is easy to understand, espatially in
+  // media query. And in most case, merge option is used to
+  // update partial option but not be expected to change order.
+  newCptOptions = (newCptOptions || []).slice();
+  var result = map(exists || [], function (obj, index) {
+    return {
+      exist: obj
+    };
+  }); // Mapping by id or name if specified.
+
+  each$2(newCptOptions, function (cptOption, index) {
+    if (!isObject$2(cptOption)) {
+      return;
+    } // id has highest priority.
+
+
+    for (var i = 0; i < result.length; i++) {
+      if (!result[i].option // Consider name: two map to one.
+      && cptOption.id != null && result[i].exist.id === cptOption.id + '') {
+        result[i].option = cptOption;
+        newCptOptions[index] = null;
+        return;
+      }
+    }
+
+    for (var i = 0; i < result.length; i++) {
+      var exist = result[i].exist;
+
+      if (!result[i].option // Consider name: two map to one.
+      // Can not match when both ids exist but different.
+      && (exist.id == null || cptOption.id == null) && cptOption.name != null && !isIdInner(cptOption) && !isIdInner(exist) && exist.name === cptOption.name + '') {
+        result[i].option = cptOption;
+        newCptOptions[index] = null;
+        return;
+      }
+    }
+  }); // Otherwise mapping by index.
+
+  each$2(newCptOptions, function (cptOption, index) {
+    if (!isObject$2(cptOption)) {
+      return;
+    }
+
+    var i = 0;
+
+    for (; i < result.length; i++) {
+      var exist = result[i].exist;
+
+      if (!result[i].option // Existing model that already has id should be able to
+      // mapped to (because after mapping performed model may
+      // be assigned with a id, whish should not affect next
+      // mapping), except those has inner id.
+      && !isIdInner(exist) // Caution:
+      // Do not overwrite id. But name can be overwritten,
+      // because axis use name as 'show label text'.
+      // 'exist' always has id and name and we dont
+      // need to check it.
+      && cptOption.id == null) {
+        result[i].option = cptOption;
+        break;
+      }
+    }
+
+    if (i >= result.length) {
+      result.push({
+        option: cptOption
+      });
+    }
+  });
+  return result;
+}
+/**
+ * Make id and name for mapping result (result of mappingToExists)
+ * into `keyInfo` field.
+ *
+ * @public
+ * @param {Array.<Object>} Result, like [{exist: ..., option: ...}, {}],
+ *                          which order is the same as exists.
+ * @return {Array.<Object>} The input.
+ */
+
+function makeIdAndName(mapResult) {
+  // We use this id to hash component models and view instances
+  // in echarts. id can be specified by user, or auto generated.
+  // The id generation rule ensures new view instance are able
+  // to mapped to old instance when setOption are called in
+  // no-merge mode. So we generate model id by name and plus
+  // type in view id.
+  // name can be duplicated among components, which is convenient
+  // to specify multi components (like series) by one name.
+  // Ensure that each id is distinct.
+  var idMap = createHashMap();
+  each$2(mapResult, function (item, index) {
+    var existCpt = item.exist;
+    existCpt && idMap.set(existCpt.id, item);
+  });
+  each$2(mapResult, function (item, index) {
+    var opt = item.option;
+    assert$1(!opt || opt.id == null || !idMap.get(opt.id) || idMap.get(opt.id) === item, 'id duplicates: ' + (opt && opt.id));
+    opt && opt.id != null && idMap.set(opt.id, item);
+    !item.keyInfo && (item.keyInfo = {});
+  }); // Make name and id.
+
+  each$2(mapResult, function (item, index) {
+    var existCpt = item.exist;
+    var opt = item.option;
+    var keyInfo = item.keyInfo;
+
+    if (!isObject$2(opt)) {
+      return;
+    } // name can be overwitten. Consider case: axis.name = '20km'.
+    // But id generated by name will not be changed, which affect
+    // only in that case: setOption with 'not merge mode' and view
+    // instance will be recreated, which can be accepted.
+
+
+    keyInfo.name = opt.name != null ? opt.name + '' : existCpt ? existCpt.name // Avoid diffferent series has the same name,
+    // because name may be used like in color pallet.
+    : DUMMY_COMPONENT_NAME_PREFIX + index;
+
+    if (existCpt) {
+      keyInfo.id = existCpt.id;
+    } else if (opt.id != null) {
+      keyInfo.id = opt.id + '';
+    } else {
+      // Consider this situatoin:
+      //  optionA: [{name: 'a'}, {name: 'a'}, {..}]
+      //  optionB [{..}, {name: 'a'}, {name: 'a'}]
+      // Series with the same name between optionA and optionB
+      // should be mapped.
+      var idNum = 0;
+
+      do {
+        keyInfo.id = '\0' + keyInfo.name + '\0' + idNum++;
+      } while (idMap.get(keyInfo.id));
+    }
+
+    idMap.set(keyInfo.id, item);
+  });
+}
+function isNameSpecified(componentModel) {
+  var name = componentModel.name; // Is specified when `indexOf` get -1 or > 0.
+
+  return !!(name && name.indexOf(DUMMY_COMPONENT_NAME_PREFIX));
+}
+/**
+ * @public
+ * @param {Object} cptOption
+ * @return {boolean}
+ */
+
+function isIdInner(cptOption) {
+  return isObject$2(cptOption) && cptOption.id && (cptOption.id + '').indexOf('\0_ec_\0') === 0;
+}
+/**
+ * A helper for removing duplicate items between batchA and batchB,
+ * and in themselves, and categorize by series.
+ *
+ * @param {Array.<Object>} batchA Like: [{seriesId: 2, dataIndex: [32, 4, 5]}, ...]
+ * @param {Array.<Object>} batchB Like: [{seriesId: 2, dataIndex: [32, 4, 5]}, ...]
+ * @return {Array.<Array.<Object>, Array.<Object>>} result: [resultBatchA, resultBatchB]
+ */
+
+function compressBatches(batchA, batchB) {
+  var mapA = {};
+  var mapB = {};
+  makeMap(batchA || [], mapA);
+  makeMap(batchB || [], mapB, mapA);
+  return [mapToArray(mapA), mapToArray(mapB)];
+
+  function makeMap(sourceBatch, map$$1, otherMap) {
+    for (var i = 0, len = sourceBatch.length; i < len; i++) {
+      var seriesId = sourceBatch[i].seriesId;
+      var dataIndices = normalizeToArray(sourceBatch[i].dataIndex);
+      var otherDataIndices = otherMap && otherMap[seriesId];
+
+      for (var j = 0, lenj = dataIndices.length; j < lenj; j++) {
+        var dataIndex = dataIndices[j];
+
+        if (otherDataIndices && otherDataIndices[dataIndex]) {
+          otherDataIndices[dataIndex] = null;
+        } else {
+          (map$$1[seriesId] || (map$$1[seriesId] = {}))[dataIndex] = 1;
+        }
+      }
+    }
+  }
+
+  function mapToArray(map$$1, isData) {
+    var result = [];
+
+    for (var i in map$$1) {
+      if (map$$1.hasOwnProperty(i) && map$$1[i] != null) {
+        if (isData) {
+          result.push(+i);
+        } else {
+          var dataIndices = mapToArray(map$$1[i], true);
+          dataIndices.length && result.push({
+            seriesId: i,
+            dataIndex: dataIndices
+          });
+        }
+      }
+    }
+
+    return result;
+  }
+}
+/**
+ * @param {module:echarts/data/List} data
+ * @param {Object} payload Contains dataIndex (means rawIndex) / dataIndexInside / name
+ *                         each of which can be Array or primary type.
+ * @return {number|Array.<number>} dataIndex If not found, return undefined/null.
+ */
+
+function queryDataIndex(data, payload) {
+  if (payload.dataIndexInside != null) {
+    return payload.dataIndexInside;
+  } else if (payload.dataIndex != null) {
+    return isArray(payload.dataIndex) ? map(payload.dataIndex, function (value) {
+      return data.indexOfRawIndex(value);
+    }) : data.indexOfRawIndex(payload.dataIndex);
+  } else if (payload.name != null) {
+    return isArray(payload.name) ? map(payload.name, function (value) {
+      return data.indexOfName(value);
+    }) : data.indexOfName(payload.name);
+  }
+}
+/**
+ * Enable property storage to any host object.
+ * Notice: Serialization is not supported.
+ *
+ * For example:
+ * var inner = zrUitl.makeInner();
+ *
+ * function some1(hostObj) {
+ *      inner(hostObj).someProperty = 1212;
+ *      ...
+ * }
+ * function some2() {
+ *      var fields = inner(this);
+ *      fields.someProperty1 = 1212;
+ *      fields.someProperty2 = 'xx';
+ *      ...
+ * }
+ *
+ * @return {Function}
+ */
+
+function makeInner() {
+  // Consider different scope by es module import.
+  var key = '__\0ec_inner_' + innerUniqueIndex++ + '_' + Math.random().toFixed(5);
+  return function (hostObj) {
+    return hostObj[key] || (hostObj[key] = {});
+  };
+}
+var innerUniqueIndex = 0;
+/**
+ * @param {module:echarts/model/Global} ecModel
+ * @param {string|Object} finder
+ *        If string, e.g., 'geo', means {geoIndex: 0}.
+ *        If Object, could contain some of these properties below:
+ *        {
+ *            seriesIndex, seriesId, seriesName,
+ *            geoIndex, geoId, geoName,
+ *            bmapIndex, bmapId, bmapName,
+ *            xAxisIndex, xAxisId, xAxisName,
+ *            yAxisIndex, yAxisId, yAxisName,
+ *            gridIndex, gridId, gridName,
+ *            ... (can be extended)
+ *        }
+ *        Each properties can be number|string|Array.<number>|Array.<string>
+ *        For example, a finder could be
+ *        {
+ *            seriesIndex: 3,
+ *            geoId: ['aa', 'cc'],
+ *            gridName: ['xx', 'rr']
+ *        }
+ *        xxxIndex can be set as 'all' (means all xxx) or 'none' (means not specify)
+ *        If nothing or null/undefined specified, return nothing.
+ * @param {Object} [opt]
+ * @param {string} [opt.defaultMainType]
+ * @param {Array.<string>} [opt.includeMainTypes]
+ * @return {Object} result like:
+ *        {
+ *            seriesModels: [seriesModel1, seriesModel2],
+ *            seriesModel: seriesModel1, // The first model
+ *            geoModels: [geoModel1, geoModel2],
+ *            geoModel: geoModel1, // The first model
+ *            ...
+ *        }
+ */
+
+function parseFinder(ecModel, finder, opt) {
+  if (isString(finder)) {
+    var obj = {};
+    obj[finder + 'Index'] = 0;
+    finder = obj;
+  }
+
+  var defaultMainType = opt && opt.defaultMainType;
+
+  if (defaultMainType && !has(finder, defaultMainType + 'Index') && !has(finder, defaultMainType + 'Id') && !has(finder, defaultMainType + 'Name')) {
+    finder[defaultMainType + 'Index'] = 0;
+  }
+
+  var result = {};
+  each$2(finder, function (value, key) {
+    var value = finder[key]; // Exclude 'dataIndex' and other illgal keys.
+
+    if (key === 'dataIndex' || key === 'dataIndexInside') {
+      result[key] = value;
+      return;
+    }
+
+    var parsedKey = key.match(/^(\w+)(Index|Id|Name)$/) || [];
+    var mainType = parsedKey[1];
+    var queryType = (parsedKey[2] || '').toLowerCase();
+
+    if (!mainType || !queryType || value == null || queryType === 'index' && value === 'none' || opt && opt.includeMainTypes && indexOf(opt.includeMainTypes, mainType) < 0) {
+      return;
+    }
+
+    var queryParam = {
+      mainType: mainType
+    };
+
+    if (queryType !== 'index' || value !== 'all') {
+      queryParam[queryType] = value;
+    }
+
+    var models = ecModel.queryComponents(queryParam);
+    result[mainType + 'Models'] = models;
+    result[mainType + 'Model'] = models[0];
+  });
+  return result;
+}
+
+function has(obj, prop) {
+  return obj && obj.hasOwnProperty(prop);
+}
+
+function setAttribute(dom, key, value) {
+  dom.setAttribute ? dom.setAttribute(key, value) : dom[key] = value;
+}
+function getAttribute(dom, key) {
+  return dom.getAttribute ? dom.getAttribute(key) : dom[key];
+}
+function getTooltipRenderMode(renderModeOption) {
+  if (renderModeOption === 'auto') {
+    // Using html when `document` exists, use richText otherwise
+    return env$1.domSupported ? 'html' : 'richText';
+  } else {
+    return renderModeOption || 'html';
+  }
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var TYPE_DELIMITER = '.';
+var IS_CONTAINER = '___EC__COMPONENT__CONTAINER___';
+/**
+ * Notice, parseClassType('') should returns {main: '', sub: ''}
+ * @public
+ */
+
+function parseClassType$1(componentType) {
+  var ret = {
+    main: '',
+    sub: ''
+  };
+
+  if (componentType) {
+    componentType = componentType.split(TYPE_DELIMITER);
+    ret.main = componentType[0] || '';
+    ret.sub = componentType[1] || '';
+  }
+
+  return ret;
+}
+/**
+ * @public
+ */
+
+function checkClassType(componentType) {
+  assert$1(/^[a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)?$/.test(componentType), 'componentType "' + componentType + '" illegal');
+}
+/**
+ * @public
+ */
+
+
+function enableClassExtend(RootClass, mandatoryMethods) {
+  RootClass.$constructor = RootClass;
+
+  RootClass.extend = function (proto) {
+    var superClass = this;
+
+    var ExtendedClass = function () {
+      if (!proto.$constructor) {
+        superClass.apply(this, arguments);
+      } else {
+        proto.$constructor.apply(this, arguments);
+      }
+    };
+
+    extend(ExtendedClass.prototype, proto);
+    ExtendedClass.extend = this.extend;
+    ExtendedClass.superCall = superCall;
+    ExtendedClass.superApply = superApply;
+    inherits(ExtendedClass, this);
+    ExtendedClass.superClass = superClass;
+    return ExtendedClass;
+  };
+}
+var classBase = 0;
+/**
+ * Can not use instanceof, consider different scope by
+ * cross domain or es module import in ec extensions.
+ * Mount a method "isInstance()" to Clz.
+ */
+
+function enableClassCheck(Clz) {
+  var classAttr = ['__\0is_clz', classBase++, Math.random().toFixed(3)].join('_');
+  Clz.prototype[classAttr] = true;
+
+  Clz.isInstance = function (obj) {
+    return !!(obj && obj[classAttr]);
+  };
+} // superCall should have class info, which can not be fetch from 'this'.
+// Consider this case:
+// class A has method f,
+// class B inherits class A, overrides method f, f call superApply('f'),
+// class C inherits class B, do not overrides method f,
+// then when method of class C is called, dead loop occured.
+
+function superCall(context, methodName) {
+  var args = slice(arguments, 2);
+  return this.superClass.prototype[methodName].apply(context, args);
+}
+
+function superApply(context, methodName, args) {
+  return this.superClass.prototype[methodName].apply(context, args);
+}
+/**
+ * @param {Object} entity
+ * @param {Object} options
+ * @param {boolean} [options.registerWhenExtend]
+ * @public
+ */
+
+
+function enableClassManagement(entity, options) {
+  options = options || {};
+  /**
+   * Component model classes
+   * key: componentType,
+   * value:
+   *     componentClass, when componentType is 'xxx'
+   *     or Object.<subKey, componentClass>, when componentType is 'xxx.yy'
+   * @type {Object}
+   */
+
+  var storage = {};
+
+  entity.registerClass = function (Clazz, componentType) {
+    if (componentType) {
+      checkClassType(componentType);
+      componentType = parseClassType$1(componentType);
+
+      if (!componentType.sub) {
+        storage[componentType.main] = Clazz;
+      } else if (componentType.sub !== IS_CONTAINER) {
+        var container = makeContainer(componentType);
+        container[componentType.sub] = Clazz;
+      }
+    }
+
+    return Clazz;
+  };
+
+  entity.getClass = function (componentMainType, subType, throwWhenNotFound) {
+    var Clazz = storage[componentMainType];
+
+    if (Clazz && Clazz[IS_CONTAINER]) {
+      Clazz = subType ? Clazz[subType] : null;
+    }
+
+    if (throwWhenNotFound && !Clazz) {
+      throw new Error(!subType ? componentMainType + '.' + 'type should be specified.' : 'Component ' + componentMainType + '.' + (subType || '') + ' not exists. Load it first.');
+    }
+
+    return Clazz;
+  };
+
+  entity.getClassesByMainType = function (componentType) {
+    componentType = parseClassType$1(componentType);
+    var result = [];
+    var obj = storage[componentType.main];
+
+    if (obj && obj[IS_CONTAINER]) {
+      each$1(obj, function (o, type) {
+        type !== IS_CONTAINER && result.push(o);
+      });
+    } else {
+      result.push(obj);
+    }
+
+    return result;
+  };
+
+  entity.hasClass = function (componentType) {
+    // Just consider componentType.main.
+    componentType = parseClassType$1(componentType);
+    return !!storage[componentType.main];
+  };
+  /**
+   * @return {Array.<string>} Like ['aa', 'bb'], but can not be ['aa.xx']
+   */
+
+
+  entity.getAllClassMainTypes = function () {
+    var types = [];
+    each$1(storage, function (obj, type) {
+      types.push(type);
+    });
+    return types;
+  };
+  /**
+   * If a main type is container and has sub types
+   * @param  {string}  mainType
+   * @return {boolean}
+   */
+
+
+  entity.hasSubTypes = function (componentType) {
+    componentType = parseClassType$1(componentType);
+    var obj = storage[componentType.main];
+    return obj && obj[IS_CONTAINER];
+  };
+
+  entity.parseClassType = parseClassType$1;
+
+  function makeContainer(componentType) {
+    var container = storage[componentType.main];
+
+    if (!container || !container[IS_CONTAINER]) {
+      container = storage[componentType.main] = {};
+      container[IS_CONTAINER] = true;
+    }
+
+    return container;
+  }
+
+  if (options.registerWhenExtend) {
+    var originalExtend = entity.extend;
+
+    if (originalExtend) {
+      entity.extend = function (proto) {
+        var ExtendedClass = originalExtend.call(this, proto);
+        return entity.registerClass(ExtendedClass, proto.type);
+      };
+    }
+  }
+
+  return entity;
+}
+/**
+ * @param {string|Array.<string>} properties
+ */
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+// TODO Parse shadow style
+// TODO Only shallow path support
+var makeStyleMapper = function (properties) {
+  // Normalize
+  for (var i = 0; i < properties.length; i++) {
+    if (!properties[i][1]) {
+      properties[i][1] = properties[i][0];
+    }
+  }
+
+  return function (model, excludes, includes) {
+    var style = {};
+
+    for (var i = 0; i < properties.length; i++) {
+      var propName = properties[i][1];
+
+      if (excludes && indexOf(excludes, propName) >= 0 || includes && indexOf(includes, propName) < 0) {
+        continue;
+      }
+
+      var val = model.getShallow(propName);
+
+      if (val != null) {
+        style[properties[i][0]] = val;
+      }
+    }
+
+    return style;
+  };
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var getLineStyle = makeStyleMapper([['lineWidth', 'width'], ['stroke', 'color'], ['opacity'], ['shadowBlur'], ['shadowOffsetX'], ['shadowOffsetY'], ['shadowColor']]);
+var lineStyleMixin = {
+  getLineStyle: function (excludes) {
+    var style = getLineStyle(this, excludes);
+    var lineDash = this.getLineDash(style.lineWidth);
+    lineDash && (style.lineDash = lineDash);
+    return style;
+  },
+  getLineDash: function (lineWidth) {
+    if (lineWidth == null) {
+      lineWidth = 1;
+    }
+
+    var lineType = this.get('type');
+    var dotSize = Math.max(lineWidth, 2);
+    var dashSize = lineWidth * 4;
+    return lineType === 'solid' || lineType == null ? null : lineType === 'dashed' ? [dashSize, dashSize] : [dotSize, dotSize];
+  }
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var getAreaStyle = makeStyleMapper([['fill', 'color'], ['shadowBlur'], ['shadowOffsetX'], ['shadowOffsetY'], ['opacity'], ['shadowColor']]);
+var areaStyleMixin = {
+  getAreaStyle: function (excludes, includes) {
+    return getAreaStyle(this, excludes, includes);
+  }
+};
+
+/**
+ * 鏇茬嚎杈呭姪妯″潡
+ * @module zrender/core/curve
+ * @author pissang(https://www.github.com/pissang)
+ */
+var mathPow = Math.pow;
+var mathSqrt$2 = Math.sqrt;
+var EPSILON$1 = 1e-8;
+var EPSILON_NUMERIC = 1e-4;
+var THREE_SQRT = mathSqrt$2(3);
+var ONE_THIRD = 1 / 3; // 涓存椂鍙橀噺
+
+var _v0 = create();
+
+var _v1 = create();
+
+var _v2 = create();
+
+function isAroundZero(val) {
+  return val > -EPSILON$1 && val < EPSILON$1;
+}
+
+function isNotAroundZero$1(val) {
+  return val > EPSILON$1 || val < -EPSILON$1;
+}
+/**
+ * 璁$畻涓夋璐濆灏斿��
+ * @memberOf module:zrender/core/curve
+ * @param  {number} p0
+ * @param  {number} p1
+ * @param  {number} p2
+ * @param  {number} p3
+ * @param  {number} t
+ * @return {number}
+ */
+
+
+function cubicAt(p0, p1, p2, p3, t) {
+  var onet = 1 - t;
+  return onet * onet * (onet * p0 + 3 * t * p1) + t * t * (t * p3 + 3 * onet * p2);
+}
+/**
+ * 璁$畻涓夋璐濆灏斿鏁板��
+ * @memberOf module:zrender/core/curve
+ * @param  {number} p0
+ * @param  {number} p1
+ * @param  {number} p2
+ * @param  {number} p3
+ * @param  {number} t
+ * @return {number}
+ */
+
+function cubicDerivativeAt(p0, p1, p2, p3, t) {
+  var onet = 1 - t;
+  return 3 * (((p1 - p0) * onet + 2 * (p2 - p1) * t) * onet + (p3 - p2) * t * t);
+}
+/**
+ * 璁$畻涓夋璐濆灏旀柟绋嬫牴锛屼娇鐢ㄧ洓閲戝叕寮�
+ * @memberOf module:zrender/core/curve
+ * @param  {number} p0
+ * @param  {number} p1
+ * @param  {number} p2
+ * @param  {number} p3
+ * @param  {number} val
+ * @param  {Array.<number>} roots
+ * @return {number} 鏈夋晥鏍规暟鐩�
+ */
+
+function cubicRootAt(p0, p1, p2, p3, val, roots) {
+  // Evaluate roots of cubic functions
+  var a = p3 + 3 * (p1 - p2) - p0;
+  var b = 3 * (p2 - p1 * 2 + p0);
+  var c = 3 * (p1 - p0);
+  var d = p0 - val;
+  var A = b * b - 3 * a * c;
+  var B = b * c - 9 * a * d;
+  var C = c * c - 3 * b * d;
+  var n = 0;
+
+  if (isAroundZero(A) && isAroundZero(B)) {
+    if (isAroundZero(b)) {
+      roots[0] = 0;
+    } else {
+      var t1 = -c / b; //t1, t2, t3, b is not zero
+
+      if (t1 >= 0 && t1 <= 1) {
+        roots[n++] = t1;
+      }
+    }
+  } else {
+    var disc = B * B - 4 * A * C;
+
+    if (isAroundZero(disc)) {
+      var K = B / A;
+      var t1 = -b / a + K; // t1, a is not zero
+
+      var t2 = -K / 2; // t2, t3
+
+      if (t1 >= 0 && t1 <= 1) {
+        roots[n++] = t1;
+      }
+
+      if (t2 >= 0 && t2 <= 1) {
+        roots[n++] = t2;
+      }
+    } else if (disc > 0) {
+      var discSqrt = mathSqrt$2(disc);
+      var Y1 = A * b + 1.5 * a * (-B + discSqrt);
+      var Y2 = A * b + 1.5 * a * (-B - discSqrt);
+
+      if (Y1 < 0) {
+        Y1 = -mathPow(-Y1, ONE_THIRD);
+      } else {
+        Y1 = mathPow(Y1, ONE_THIRD);
+      }
+
+      if (Y2 < 0) {
+        Y2 = -mathPow(-Y2, ONE_THIRD);
+      } else {
+        Y2 = mathPow(Y2, ONE_THIRD);
+      }
+
+      var t1 = (-b - (Y1 + Y2)) / (3 * a);
+
+      if (t1 >= 0 && t1 <= 1) {
+        roots[n++] = t1;
+      }
+    } else {
+      var T = (2 * A * b - 3 * a * B) / (2 * mathSqrt$2(A * A * A));
+      var theta = Math.acos(T) / 3;
+      var ASqrt = mathSqrt$2(A);
+      var tmp = Math.cos(theta);
+      var t1 = (-b - 2 * ASqrt * tmp) / (3 * a);
+      var t2 = (-b + ASqrt * (tmp + THREE_SQRT * Math.sin(theta))) / (3 * a);
+      var t3 = (-b + ASqrt * (tmp - THREE_SQRT * Math.sin(theta))) / (3 * a);
+
+      if (t1 >= 0 && t1 <= 1) {
+        roots[n++] = t1;
+      }
+
+      if (t2 >= 0 && t2 <= 1) {
+        roots[n++] = t2;
+      }
+
+      if (t3 >= 0 && t3 <= 1) {
+        roots[n++] = t3;
+      }
+    }
+  }
+
+  return n;
+}
+/**
+ * 璁$畻涓夋璐濆灏旀柟绋嬫瀬闄愬�肩殑浣嶇疆
+ * @memberOf module:zrender/core/curve
+ * @param  {number} p0
+ * @param  {number} p1
+ * @param  {number} p2
+ * @param  {number} p3
+ * @param  {Array.<number>} extrema
+ * @return {number} 鏈夋晥鏁扮洰
+ */
+
+function cubicExtrema(p0, p1, p2, p3, extrema) {
+  var b = 6 * p2 - 12 * p1 + 6 * p0;
+  var a = 9 * p1 + 3 * p3 - 3 * p0 - 9 * p2;
+  var c = 3 * p1 - 3 * p0;
+  var n = 0;
+
+  if (isAroundZero(a)) {
+    if (isNotAroundZero$1(b)) {
+      var t1 = -c / b;
+
+      if (t1 >= 0 && t1 <= 1) {
+        extrema[n++] = t1;
+      }
+    }
+  } else {
+    var disc = b * b - 4 * a * c;
+
+    if (isAroundZero(disc)) {
+      extrema[0] = -b / (2 * a);
+    } else if (disc > 0) {
+      var discSqrt = mathSqrt$2(disc);
+      var t1 = (-b + discSqrt) / (2 * a);
+      var t2 = (-b - discSqrt) / (2 * a);
+
+      if (t1 >= 0 && t1 <= 1) {
+        extrema[n++] = t1;
+      }
+
+      if (t2 >= 0 && t2 <= 1) {
+        extrema[n++] = t2;
+      }
+    }
+  }
+
+  return n;
+}
+/**
+ * 缁嗗垎涓夋璐濆灏旀洸绾�
+ * @memberOf module:zrender/core/curve
+ * @param  {number} p0
+ * @param  {number} p1
+ * @param  {number} p2
+ * @param  {number} p3
+ * @param  {number} t
+ * @param  {Array.<number>} out
+ */
+
+function cubicSubdivide(p0, p1, p2, p3, t, out) {
+  var p01 = (p1 - p0) * t + p0;
+  var p12 = (p2 - p1) * t + p1;
+  var p23 = (p3 - p2) * t + p2;
+  var p012 = (p12 - p01) * t + p01;
+  var p123 = (p23 - p12) * t + p12;
+  var p0123 = (p123 - p012) * t + p012; // Seg0
+
+  out[0] = p0;
+  out[1] = p01;
+  out[2] = p012;
+  out[3] = p0123; // Seg1
+
+  out[4] = p0123;
+  out[5] = p123;
+  out[6] = p23;
+  out[7] = p3;
+}
+/**
+ * 鎶曞皠鐐瑰埌涓夋璐濆灏旀洸绾夸笂锛岃繑鍥炴姇灏勮窛绂汇��
+ * 鎶曞皠鐐规湁鍙兘浼氭湁涓�涓垨鑰呭涓紝杩欓噷鍙繑鍥炲叾涓窛绂绘渶鐭殑涓�涓��
+ * @param {number} x0
+ * @param {number} y0
+ * @param {number} x1
+ * @param {number} y1
+ * @param {number} x2
+ * @param {number} y2
+ * @param {number} x3
+ * @param {number} y3
+ * @param {number} x
+ * @param {number} y
+ * @param {Array.<number>} [out] 鎶曞皠鐐�
+ * @return {number}
+ */
+
+function cubicProjectPoint(x0, y0, x1, y1, x2, y2, x3, y3, x, y, out) {
+  // http://pomax.github.io/bezierinfo/#projections
+  var t;
+  var interval = 0.005;
+  var d = Infinity;
+  var prev;
+  var next;
+  var d1;
+  var d2;
+  _v0[0] = x;
+  _v0[1] = y; // 鍏堢矖鐣ヤ及璁′竴涓嬪彲鑳界殑鏈�灏忚窛绂荤殑 t 鍊�
+  // PENDING
+
+  for (var _t = 0; _t < 1; _t += 0.05) {
+    _v1[0] = cubicAt(x0, x1, x2, x3, _t);
+    _v1[1] = cubicAt(y0, y1, y2, y3, _t);
+    d1 = distSquare(_v0, _v1);
+
+    if (d1 < d) {
+      t = _t;
+      d = d1;
+    }
+  }
+
+  d = Infinity; // At most 32 iteration
+
+  for (var i = 0; i < 32; i++) {
+    if (interval < EPSILON_NUMERIC) {
+      break;
+    }
+
+    prev = t - interval;
+    next = t + interval; // t - interval
+
+    _v1[0] = cubicAt(x0, x1, x2, x3, prev);
+    _v1[1] = cubicAt(y0, y1, y2, y3, prev);
+    d1 = distSquare(_v1, _v0);
+
+    if (prev >= 0 && d1 < d) {
+      t = prev;
+      d = d1;
+    } else {
+      // t + interval
+      _v2[0] = cubicAt(x0, x1, x2, x3, next);
+      _v2[1] = cubicAt(y0, y1, y2, y3, next);
+      d2 = distSquare(_v2, _v0);
+
+      if (next <= 1 && d2 < d) {
+        t = next;
+        d = d2;
+      } else {
+        interval *= 0.5;
+      }
+    }
+  } // t
+
+
+  if (out) {
+    out[0] = cubicAt(x0, x1, x2, x3, t);
+    out[1] = cubicAt(y0, y1, y2, y3, t);
+  } // console.log(interval, i);
+
+
+  return mathSqrt$2(d);
+}
+/**
+ * 璁$畻浜屾鏂硅礉濉炲皵鍊�
+ * @param  {number} p0
+ * @param  {number} p1
+ * @param  {number} p2
+ * @param  {number} t
+ * @return {number}
+ */
+
+function quadraticAt(p0, p1, p2, t) {
+  var onet = 1 - t;
+  return onet * (onet * p0 + 2 * t * p1) + t * t * p2;
+}
+/**
+ * 璁$畻浜屾鏂硅礉濉炲皵瀵兼暟鍊�
+ * @param  {number} p0
+ * @param  {number} p1
+ * @param  {number} p2
+ * @param  {number} t
+ * @return {number}
+ */
+
+function quadraticDerivativeAt(p0, p1, p2, t) {
+  return 2 * ((1 - t) * (p1 - p0) + t * (p2 - p1));
+}
+/**
+ * 璁$畻浜屾鏂硅礉濉炲皵鏂圭▼鏍�
+ * @param  {number} p0
+ * @param  {number} p1
+ * @param  {number} p2
+ * @param  {number} t
+ * @param  {Array.<number>} roots
+ * @return {number} 鏈夋晥鏍规暟鐩�
+ */
+
+function quadraticRootAt(p0, p1, p2, val, roots) {
+  var a = p0 - 2 * p1 + p2;
+  var b = 2 * (p1 - p0);
+  var c = p0 - val;
+  var n = 0;
+
+  if (isAroundZero(a)) {
+    if (isNotAroundZero$1(b)) {
+      var t1 = -c / b;
+
+      if (t1 >= 0 && t1 <= 1) {
+        roots[n++] = t1;
+      }
+    }
+  } else {
+    var disc = b * b - 4 * a * c;
+
+    if (isAroundZero(disc)) {
+      var t1 = -b / (2 * a);
+
+      if (t1 >= 0 && t1 <= 1) {
+        roots[n++] = t1;
+      }
+    } else if (disc > 0) {
+      var discSqrt = mathSqrt$2(disc);
+      var t1 = (-b + discSqrt) / (2 * a);
+      var t2 = (-b - discSqrt) / (2 * a);
+
+      if (t1 >= 0 && t1 <= 1) {
+        roots[n++] = t1;
+      }
+
+      if (t2 >= 0 && t2 <= 1) {
+        roots[n++] = t2;
+      }
+    }
+  }
+
+  return n;
+}
+/**
+ * 璁$畻浜屾璐濆灏旀柟绋嬫瀬闄愬��
+ * @memberOf module:zrender/core/curve
+ * @param  {number} p0
+ * @param  {number} p1
+ * @param  {number} p2
+ * @return {number}
+ */
+
+function quadraticExtremum(p0, p1, p2) {
+  var divider = p0 + p2 - 2 * p1;
+
+  if (divider === 0) {
+    // p1 is center of p0 and p2
+    return 0.5;
+  } else {
+    return (p0 - p1) / divider;
+  }
+}
+/**
+ * 缁嗗垎浜屾璐濆灏旀洸绾�
+ * @memberOf module:zrender/core/curve
+ * @param  {number} p0
+ * @param  {number} p1
+ * @param  {number} p2
+ * @param  {number} t
+ * @param  {Array.<number>} out
+ */
+
+function quadraticSubdivide(p0, p1, p2, t, out) {
+  var p01 = (p1 - p0) * t + p0;
+  var p12 = (p2 - p1) * t + p1;
+  var p012 = (p12 - p01) * t + p01; // Seg0
+
+  out[0] = p0;
+  out[1] = p01;
+  out[2] = p012; // Seg1
+
+  out[3] = p012;
+  out[4] = p12;
+  out[5] = p2;
+}
+/**
+ * 鎶曞皠鐐瑰埌浜屾璐濆灏旀洸绾夸笂锛岃繑鍥炴姇灏勮窛绂汇��
+ * 鎶曞皠鐐规湁鍙兘浼氭湁涓�涓垨鑰呭涓紝杩欓噷鍙繑鍥炲叾涓窛绂绘渶鐭殑涓�涓��
+ * @param {number} x0
+ * @param {number} y0
+ * @param {number} x1
+ * @param {number} y1
+ * @param {number} x2
+ * @param {number} y2
+ * @param {number} x
+ * @param {number} y
+ * @param {Array.<number>} out 鎶曞皠鐐�
+ * @return {number}
+ */
+
+function quadraticProjectPoint(x0, y0, x1, y1, x2, y2, x, y, out) {
+  // http://pomax.github.io/bezierinfo/#projections
+  var t;
+  var interval = 0.005;
+  var d = Infinity;
+  _v0[0] = x;
+  _v0[1] = y; // 鍏堢矖鐣ヤ及璁′竴涓嬪彲鑳界殑鏈�灏忚窛绂荤殑 t 鍊�
+  // PENDING
+
+  for (var _t = 0; _t < 1; _t += 0.05) {
+    _v1[0] = quadraticAt(x0, x1, x2, _t);
+    _v1[1] = quadraticAt(y0, y1, y2, _t);
+    var d1 = distSquare(_v0, _v1);
+
+    if (d1 < d) {
+      t = _t;
+      d = d1;
+    }
+  }
+
+  d = Infinity; // At most 32 iteration
+
+  for (var i = 0; i < 32; i++) {
+    if (interval < EPSILON_NUMERIC) {
+      break;
+    }
+
+    var prev = t - interval;
+    var next = t + interval; // t - interval
+
+    _v1[0] = quadraticAt(x0, x1, x2, prev);
+    _v1[1] = quadraticAt(y0, y1, y2, prev);
+    var d1 = distSquare(_v1, _v0);
+
+    if (prev >= 0 && d1 < d) {
+      t = prev;
+      d = d1;
+    } else {
+      // t + interval
+      _v2[0] = quadraticAt(x0, x1, x2, next);
+      _v2[1] = quadraticAt(y0, y1, y2, next);
+      var d2 = distSquare(_v2, _v0);
+
+      if (next <= 1 && d2 < d) {
+        t = next;
+        d = d2;
+      } else {
+        interval *= 0.5;
+      }
+    }
+  } // t
+
+
+  if (out) {
+    out[0] = quadraticAt(x0, x1, x2, t);
+    out[1] = quadraticAt(y0, y1, y2, t);
+  } // console.log(interval, i);
+
+
+  return mathSqrt$2(d);
+}
+
+/**
+ * @author Yi Shen(https://github.com/pissang)
+ */
+var mathMin$3 = Math.min;
+var mathMax$3 = Math.max;
+var mathSin$2 = Math.sin;
+var mathCos$2 = Math.cos;
+var PI2 = Math.PI * 2;
+var start = create();
+var end = create();
+var extremity = create();
+/**
+ * 浠庨《鐐规暟缁勪腑璁$畻鍑烘渶灏忓寘鍥寸洅锛屽啓鍏min`鍜宍max`涓�
+ * @module zrender/core/bbox
+ * @param {Array<Object>} points 椤剁偣鏁扮粍
+ * @param {number} min
+ * @param {number} max
+ */
+
+function fromPoints(points, min$$1, max$$1) {
+  if (points.length === 0) {
+    return;
+  }
+
+  var p = points[0];
+  var left = p[0];
+  var right = p[0];
+  var top = p[1];
+  var bottom = p[1];
+  var i;
+
+  for (i = 1; i < points.length; i++) {
+    p = points[i];
+    left = mathMin$3(left, p[0]);
+    right = mathMax$3(right, p[0]);
+    top = mathMin$3(top, p[1]);
+    bottom = mathMax$3(bottom, p[1]);
+  }
+
+  min$$1[0] = left;
+  min$$1[1] = top;
+  max$$1[0] = right;
+  max$$1[1] = bottom;
+}
+/**
+ * @memberOf module:zrender/core/bbox
+ * @param {number} x0
+ * @param {number} y0
+ * @param {number} x1
+ * @param {number} y1
+ * @param {Array.<number>} min
+ * @param {Array.<number>} max
+ */
+
+function fromLine(x0, y0, x1, y1, min$$1, max$$1) {
+  min$$1[0] = mathMin$3(x0, x1);
+  min$$1[1] = mathMin$3(y0, y1);
+  max$$1[0] = mathMax$3(x0, x1);
+  max$$1[1] = mathMax$3(y0, y1);
+}
+var xDim = [];
+var yDim = [];
+/**
+ * 浠庝笁闃惰礉濉炲皵鏇茬嚎(p0, p1, p2, p3)涓绠楀嚭鏈�灏忓寘鍥寸洅锛屽啓鍏min`鍜宍max`涓�
+ * @memberOf module:zrender/core/bbox
+ * @param {number} x0
+ * @param {number} y0
+ * @param {number} x1
+ * @param {number} y1
+ * @param {number} x2
+ * @param {number} y2
+ * @param {number} x3
+ * @param {number} y3
+ * @param {Array.<number>} min
+ * @param {Array.<number>} max
+ */
+
+function fromCubic(x0, y0, x1, y1, x2, y2, x3, y3, min$$1, max$$1) {
+  var cubicExtrema$$1 = cubicExtrema;
+  var cubicAt$$1 = cubicAt;
+  var i;
+  var n = cubicExtrema$$1(x0, x1, x2, x3, xDim);
+  min$$1[0] = Infinity;
+  min$$1[1] = Infinity;
+  max$$1[0] = -Infinity;
+  max$$1[1] = -Infinity;
+
+  for (i = 0; i < n; i++) {
+    var x = cubicAt$$1(x0, x1, x2, x3, xDim[i]);
+    min$$1[0] = mathMin$3(x, min$$1[0]);
+    max$$1[0] = mathMax$3(x, max$$1[0]);
+  }
+
+  n = cubicExtrema$$1(y0, y1, y2, y3, yDim);
+
+  for (i = 0; i < n; i++) {
+    var y = cubicAt$$1(y0, y1, y2, y3, yDim[i]);
+    min$$1[1] = mathMin$3(y, min$$1[1]);
+    max$$1[1] = mathMax$3(y, max$$1[1]);
+  }
+
+  min$$1[0] = mathMin$3(x0, min$$1[0]);
+  max$$1[0] = mathMax$3(x0, max$$1[0]);
+  min$$1[0] = mathMin$3(x3, min$$1[0]);
+  max$$1[0] = mathMax$3(x3, max$$1[0]);
+  min$$1[1] = mathMin$3(y0, min$$1[1]);
+  max$$1[1] = mathMax$3(y0, max$$1[1]);
+  min$$1[1] = mathMin$3(y3, min$$1[1]);
+  max$$1[1] = mathMax$3(y3, max$$1[1]);
+}
+/**
+ * 浠庝簩闃惰礉濉炲皵鏇茬嚎(p0, p1, p2)涓绠楀嚭鏈�灏忓寘鍥寸洅锛屽啓鍏min`鍜宍max`涓�
+ * @memberOf module:zrender/core/bbox
+ * @param {number} x0
+ * @param {number} y0
+ * @param {number} x1
+ * @param {number} y1
+ * @param {number} x2
+ * @param {number} y2
+ * @param {Array.<number>} min
+ * @param {Array.<number>} max
+ */
+
+function fromQuadratic(x0, y0, x1, y1, x2, y2, min$$1, max$$1) {
+  var quadraticExtremum$$1 = quadraticExtremum;
+  var quadraticAt$$1 = quadraticAt; // Find extremities, where derivative in x dim or y dim is zero
+
+  var tx = mathMax$3(mathMin$3(quadraticExtremum$$1(x0, x1, x2), 1), 0);
+  var ty = mathMax$3(mathMin$3(quadraticExtremum$$1(y0, y1, y2), 1), 0);
+  var x = quadraticAt$$1(x0, x1, x2, tx);
+  var y = quadraticAt$$1(y0, y1, y2, ty);
+  min$$1[0] = mathMin$3(x0, x2, x);
+  min$$1[1] = mathMin$3(y0, y2, y);
+  max$$1[0] = mathMax$3(x0, x2, x);
+  max$$1[1] = mathMax$3(y0, y2, y);
+}
+/**
+ * 浠庡渾寮т腑璁$畻鍑烘渶灏忓寘鍥寸洅锛屽啓鍏min`鍜宍max`涓�
+ * @method
+ * @memberOf module:zrender/core/bbox
+ * @param {number} x
+ * @param {number} y
+ * @param {number} rx
+ * @param {number} ry
+ * @param {number} startAngle
+ * @param {number} endAngle
+ * @param {number} anticlockwise
+ * @param {Array.<number>} min
+ * @param {Array.<number>} max
+ */
+
+function fromArc(x, y, rx, ry, startAngle, endAngle, anticlockwise, min$$1, max$$1) {
+  var vec2Min = min;
+  var vec2Max = max;
+  var diff = Math.abs(startAngle - endAngle);
+
+  if (diff % PI2 < 1e-4 && diff > 1e-4) {
+    // Is a circle
+    min$$1[0] = x - rx;
+    min$$1[1] = y - ry;
+    max$$1[0] = x + rx;
+    max$$1[1] = y + ry;
+    return;
+  }
+
+  start[0] = mathCos$2(startAngle) * rx + x;
+  start[1] = mathSin$2(startAngle) * ry + y;
+  end[0] = mathCos$2(endAngle) * rx + x;
+  end[1] = mathSin$2(endAngle) * ry + y;
+  vec2Min(min$$1, start, end);
+  vec2Max(max$$1, start, end); // Thresh to [0, Math.PI * 2]
+
+  startAngle = startAngle % PI2;
+
+  if (startAngle < 0) {
+    startAngle = startAngle + PI2;
+  }
+
+  endAngle = endAngle % PI2;
+
+  if (endAngle < 0) {
+    endAngle = endAngle + PI2;
+  }
+
+  if (startAngle > endAngle && !anticlockwise) {
+    endAngle += PI2;
+  } else if (startAngle < endAngle && anticlockwise) {
+    startAngle += PI2;
+  }
+
+  if (anticlockwise) {
+    var tmp = endAngle;
+    endAngle = startAngle;
+    startAngle = tmp;
+  } // var number = 0;
+  // var step = (anticlockwise ? -Math.PI : Math.PI) / 2;
+
+
+  for (var angle = 0; angle < endAngle; angle += Math.PI / 2) {
+    if (angle > startAngle) {
+      extremity[0] = mathCos$2(angle) * rx + x;
+      extremity[1] = mathSin$2(angle) * ry + y;
+      vec2Min(min$$1, extremity, min$$1);
+      vec2Max(max$$1, extremity, max$$1);
+    }
+  }
+}
+
+/**
+ * Path 浠g悊锛屽彲浠ュ湪`buildPath`涓敤浜庢浛浠ctx`, 浼氫繚瀛樻瘡涓猵ath鎿嶄綔鐨勫懡浠ゅ埌pathCommands灞炴�т腑
+ * 鍙互鐢ㄤ簬 isInsidePath 鍒ゆ柇浠ュ強鑾峰彇boundingRect
+ *
+ * @module zrender/core/PathProxy
+ * @author Yi Shen (http://www.github.com/pissang)
+ */
+// TODO getTotalLength, getPointAtLength
+var CMD = {
+  M: 1,
+  L: 2,
+  C: 3,
+  Q: 4,
+  A: 5,
+  Z: 6,
+  // Rect
+  R: 7
+}; // var CMD_MEM_SIZE = {
+//     M: 3,
+//     L: 3,
+//     C: 7,
+//     Q: 5,
+//     A: 9,
+//     R: 5,
+//     Z: 1
+// };
+
+var min$1 = [];
+var max$1 = [];
+var min2 = [];
+var max2 = [];
+var mathMin$2 = Math.min;
+var mathMax$2 = Math.max;
+var mathCos$1 = Math.cos;
+var mathSin$1 = Math.sin;
+var mathSqrt$1 = Math.sqrt;
+var mathAbs = Math.abs;
+var hasTypedArray = typeof Float32Array != 'undefined';
+/**
+ * @alias module:zrender/core/PathProxy
+ * @constructor
+ */
+
+var PathProxy = function (notSaveData) {
+  this._saveData = !(notSaveData || false);
+
+  if (this._saveData) {
+    /**
+     * Path data. Stored as flat array
+     * @type {Array.<Object>}
+     */
+    this.data = [];
+  }
+
+  this._ctx = null;
+};
+/**
+ * 蹇�熻绠桺ath鍖呭洿鐩掞紙骞朵笉鏄渶灏忓寘鍥寸洅锛�
+ * @return {Object}
+ */
+
+
+PathProxy.prototype = {
+  constructor: PathProxy,
+  _xi: 0,
+  _yi: 0,
+  _x0: 0,
+  _y0: 0,
+  // Unit x, Unit y. Provide for avoiding drawing that too short line segment
+  _ux: 0,
+  _uy: 0,
+  _len: 0,
+  _lineDash: null,
+  _dashOffset: 0,
+  _dashIdx: 0,
+  _dashSum: 0,
+
+  /**
+   * @readOnly
+   */
+  setScale: function (sx, sy) {
+    this._ux = mathAbs(1 / devicePixelRatio / sx) || 0;
+    this._uy = mathAbs(1 / devicePixelRatio / sy) || 0;
+  },
+  getContext: function () {
+    return this._ctx;
+  },
+
+  /**
+   * @param  {CanvasRenderingContext2D} ctx
+   * @return {module:zrender/core/PathProxy}
+   */
+  beginPath: function (ctx) {
+    this._ctx = ctx;
+    ctx && ctx.beginPath();
+    ctx && (this.dpr = ctx.dpr); // Reset
+
+    if (this._saveData) {
+      this._len = 0;
+    }
+
+    if (this._lineDash) {
+      this._lineDash = null;
+      this._dashOffset = 0;
+    }
+
+    return this;
+  },
+
+  /**
+   * @param  {number} x
+   * @param  {number} y
+   * @return {module:zrender/core/PathProxy}
+   */
+  moveTo: function (x, y) {
+    this.addData(CMD.M, x, y);
+    this._ctx && this._ctx.moveTo(x, y); // x0, y0, xi, yi 鏄褰曞湪 _dashedXXXXTo 鏂规硶涓娇鐢�
+    // xi, yi 璁板綍褰撳墠鐐�, x0, y0 鍦� closePath 鐨勬椂鍊欏洖鍒拌捣濮嬬偣銆�
+    // 鏈夊彲鑳藉湪 beginPath 涔嬪悗鐩存帴璋冪敤 lineTo锛岃繖鏃跺�� x0, y0 闇�瑕�
+    // 鍦� lineTo 鏂规硶涓褰曪紝杩欓噷鍏堜笉鑰冭檻杩欑鎯呭喌锛宒ashed line 涔熷彧鍦� IE10- 涓笉鏀寔
+
+    this._x0 = x;
+    this._y0 = y;
+    this._xi = x;
+    this._yi = y;
+    return this;
+  },
+
+  /**
+   * @param  {number} x
+   * @param  {number} y
+   * @return {module:zrender/core/PathProxy}
+   */
+  lineTo: function (x, y) {
+    var exceedUnit = mathAbs(x - this._xi) > this._ux || mathAbs(y - this._yi) > this._uy // Force draw the first segment
+    || this._len < 5;
+    this.addData(CMD.L, x, y);
+
+    if (this._ctx && exceedUnit) {
+      this._needsDash() ? this._dashedLineTo(x, y) : this._ctx.lineTo(x, y);
+    }
+
+    if (exceedUnit) {
+      this._xi = x;
+      this._yi = y;
+    }
+
+    return this;
+  },
+
+  /**
+   * @param  {number} x1
+   * @param  {number} y1
+   * @param  {number} x2
+   * @param  {number} y2
+   * @param  {number} x3
+   * @param  {number} y3
+   * @return {module:zrender/core/PathProxy}
+   */
+  bezierCurveTo: function (x1, y1, x2, y2, x3, y3) {
+    this.addData(CMD.C, x1, y1, x2, y2, x3, y3);
+
+    if (this._ctx) {
+      this._needsDash() ? this._dashedBezierTo(x1, y1, x2, y2, x3, y3) : this._ctx.bezierCurveTo(x1, y1, x2, y2, x3, y3);
+    }
+
+    this._xi = x3;
+    this._yi = y3;
+    return this;
+  },
+
+  /**
+   * @param  {number} x1
+   * @param  {number} y1
+   * @param  {number} x2
+   * @param  {number} y2
+   * @return {module:zrender/core/PathProxy}
+   */
+  quadraticCurveTo: function (x1, y1, x2, y2) {
+    this.addData(CMD.Q, x1, y1, x2, y2);
+
+    if (this._ctx) {
+      this._needsDash() ? this._dashedQuadraticTo(x1, y1, x2, y2) : this._ctx.quadraticCurveTo(x1, y1, x2, y2);
+    }
+
+    this._xi = x2;
+    this._yi = y2;
+    return this;
+  },
+
+  /**
+   * @param  {number} cx
+   * @param  {number} cy
+   * @param  {number} r
+   * @param  {number} startAngle
+   * @param  {number} endAngle
+   * @param  {boolean} anticlockwise
+   * @return {module:zrender/core/PathProxy}
+   */
+  arc: function (cx, cy, r, startAngle, endAngle, anticlockwise) {
+    this.addData(CMD.A, cx, cy, r, r, startAngle, endAngle - startAngle, 0, anticlockwise ? 0 : 1);
+    this._ctx && this._ctx.arc(cx, cy, r, startAngle, endAngle, anticlockwise);
+    this._xi = mathCos$1(endAngle) * r + cx;
+    this._yi = mathSin$1(endAngle) * r + cy;
+    return this;
+  },
+  // TODO
+  arcTo: function (x1, y1, x2, y2, radius) {
+    if (this._ctx) {
+      this._ctx.arcTo(x1, y1, x2, y2, radius);
+    }
+
+    return this;
+  },
+  // TODO
+  rect: function (x, y, w, h) {
+    this._ctx && this._ctx.rect(x, y, w, h);
+    this.addData(CMD.R, x, y, w, h);
+    return this;
+  },
+
+  /**
+   * @return {module:zrender/core/PathProxy}
+   */
+  closePath: function () {
+    this.addData(CMD.Z);
+    var ctx = this._ctx;
+    var x0 = this._x0;
+    var y0 = this._y0;
+
+    if (ctx) {
+      this._needsDash() && this._dashedLineTo(x0, y0);
+      ctx.closePath();
+    }
+
+    this._xi = x0;
+    this._yi = y0;
+    return this;
+  },
+
+  /**
+   * Context 浠庡閮ㄤ紶鍏ワ紝鍥犱负鏈夊彲鑳芥槸 rebuildPath 瀹屼箣鍚庡啀 fill銆�
+   * stroke 鍚屾牱
+   * @param {CanvasRenderingContext2D} ctx
+   * @return {module:zrender/core/PathProxy}
+   */
+  fill: function (ctx) {
+    ctx && ctx.fill();
+    this.toStatic();
+  },
+
+  /**
+   * @param {CanvasRenderingContext2D} ctx
+   * @return {module:zrender/core/PathProxy}
+   */
+  stroke: function (ctx) {
+    ctx && ctx.stroke();
+    this.toStatic();
+  },
+
+  /**
+   * 蹇呴』鍦ㄥ叾瀹冪粯鍒跺懡浠ゅ墠璋冪敤
+   * Must be invoked before all other path drawing methods
+   * @return {module:zrender/core/PathProxy}
+   */
+  setLineDash: function (lineDash) {
+    if (lineDash instanceof Array) {
+      this._lineDash = lineDash;
+      this._dashIdx = 0;
+      var lineDashSum = 0;
+
+      for (var i = 0; i < lineDash.length; i++) {
+        lineDashSum += lineDash[i];
+      }
+
+      this._dashSum = lineDashSum;
+    }
+
+    return this;
+  },
+
+  /**
+   * 蹇呴』鍦ㄥ叾瀹冪粯鍒跺懡浠ゅ墠璋冪敤
+   * Must be invoked before all other path drawing methods
+   * @return {module:zrender/core/PathProxy}
+   */
+  setLineDashOffset: function (offset) {
+    this._dashOffset = offset;
+    return this;
+  },
+
+  /**
+   *
+   * @return {boolean}
+   */
+  len: function () {
+    return this._len;
+  },
+
+  /**
+   * 鐩存帴璁剧疆 Path 鏁版嵁
+   */
+  setData: function (data) {
+    var len$$1 = data.length;
+
+    if (!(this.data && this.data.length == len$$1) && hasTypedArray) {
+      this.data = new Float32Array(len$$1);
+    }
+
+    for (var i = 0; i < len$$1; i++) {
+      this.data[i] = data[i];
+    }
+
+    this._len = len$$1;
+  },
+
+  /**
+   * 娣诲姞瀛愯矾寰�
+   * @param {module:zrender/core/PathProxy|Array.<module:zrender/core/PathProxy>} path
+   */
+  appendPath: function (path) {
+    if (!(path instanceof Array)) {
+      path = [path];
+    }
+
+    var len$$1 = path.length;
+    var appendSize = 0;
+    var offset = this._len;
+
+    for (var i = 0; i < len$$1; i++) {
+      appendSize += path[i].len();
+    }
+
+    if (hasTypedArray && this.data instanceof Float32Array) {
+      this.data = new Float32Array(offset + appendSize);
+    }
+
+    for (var i = 0; i < len$$1; i++) {
+      var appendPathData = path[i].data;
+
+      for (var k = 0; k < appendPathData.length; k++) {
+        this.data[offset++] = appendPathData[k];
+      }
+    }
+
+    this._len = offset;
+  },
+
+  /**
+   * 濉厖 Path 鏁版嵁銆�
+   * 灏介噺澶嶇敤鑰屼笉鐢虫槑鏂扮殑鏁扮粍銆傚ぇ閮ㄥ垎鍥惧舰閲嶇粯鐨勬寚浠ゆ暟鎹暱搴﹂兘鏄笉鍙樼殑銆�
+   */
+  addData: function (cmd) {
+    if (!this._saveData) {
+      return;
+    }
+
+    var data = this.data;
+
+    if (this._len + arguments.length > data.length) {
+      // 鍥犱负涔嬪墠鐨勬暟缁勫凡缁忚浆鎹㈡垚闈欐�佺殑 Float32Array
+      // 鎵�浠ヤ笉澶熺敤鏃堕渶瑕佹墿灞曚竴涓柊鐨勫姩鎬佹暟缁�
+      this._expandData();
+
+      data = this.data;
+    }
+
+    for (var i = 0; i < arguments.length; i++) {
+      data[this._len++] = arguments[i];
+    }
+
+    this._prevCmd = cmd;
+  },
+  _expandData: function () {
+    // Only if data is Float32Array
+    if (!(this.data instanceof Array)) {
+      var newData = [];
+
+      for (var i = 0; i < this._len; i++) {
+        newData[i] = this.data[i];
+      }
+
+      this.data = newData;
+    }
+  },
+
+  /**
+   * If needs js implemented dashed line
+   * @return {boolean}
+   * @private
+   */
+  _needsDash: function () {
+    return this._lineDash;
+  },
+  _dashedLineTo: function (x1, y1) {
+    var dashSum = this._dashSum;
+    var offset = this._dashOffset;
+    var lineDash = this._lineDash;
+    var ctx = this._ctx;
+    var x0 = this._xi;
+    var y0 = this._yi;
+    var dx = x1 - x0;
+    var dy = y1 - y0;
+    var dist$$1 = mathSqrt$1(dx * dx + dy * dy);
+    var x = x0;
+    var y = y0;
+    var dash;
+    var nDash = lineDash.length;
+    var idx;
+    dx /= dist$$1;
+    dy /= dist$$1;
+
+    if (offset < 0) {
+      // Convert to positive offset
+      offset = dashSum + offset;
+    }
+
+    offset %= dashSum;
+    x -= offset * dx;
+    y -= offset * dy;
+
+    while (dx > 0 && x <= x1 || dx < 0 && x >= x1 || dx == 0 && (dy > 0 && y <= y1 || dy < 0 && y >= y1)) {
+      idx = this._dashIdx;
+      dash = lineDash[idx];
+      x += dx * dash;
+      y += dy * dash;
+      this._dashIdx = (idx + 1) % nDash; // Skip positive offset
+
+      if (dx > 0 && x < x0 || dx < 0 && x > x0 || dy > 0 && y < y0 || dy < 0 && y > y0) {
+        continue;
+      }
+
+      ctx[idx % 2 ? 'moveTo' : 'lineTo'](dx >= 0 ? mathMin$2(x, x1) : mathMax$2(x, x1), dy >= 0 ? mathMin$2(y, y1) : mathMax$2(y, y1));
+    } // Offset for next lineTo
+
+
+    dx = x - x1;
+    dy = y - y1;
+    this._dashOffset = -mathSqrt$1(dx * dx + dy * dy);
+  },
+  // Not accurate dashed line to
+  _dashedBezierTo: function (x1, y1, x2, y2, x3, y3) {
+    var dashSum = this._dashSum;
+    var offset = this._dashOffset;
+    var lineDash = this._lineDash;
+    var ctx = this._ctx;
+    var x0 = this._xi;
+    var y0 = this._yi;
+    var t;
+    var dx;
+    var dy;
+    var cubicAt$$1 = cubicAt;
+    var bezierLen = 0;
+    var idx = this._dashIdx;
+    var nDash = lineDash.length;
+    var x;
+    var y;
+    var tmpLen = 0;
+
+    if (offset < 0) {
+      // Convert to positive offset
+      offset = dashSum + offset;
+    }
+
+    offset %= dashSum; // Bezier approx length
+
+    for (t = 0; t < 1; t += 0.1) {
+      dx = cubicAt$$1(x0, x1, x2, x3, t + 0.1) - cubicAt$$1(x0, x1, x2, x3, t);
+      dy = cubicAt$$1(y0, y1, y2, y3, t + 0.1) - cubicAt$$1(y0, y1, y2, y3, t);
+      bezierLen += mathSqrt$1(dx * dx + dy * dy);
+    } // Find idx after add offset
+
+
+    for (; idx < nDash; idx++) {
+      tmpLen += lineDash[idx];
+
+      if (tmpLen > offset) {
+        break;
+      }
+    }
+
+    t = (tmpLen - offset) / bezierLen;
+
+    while (t <= 1) {
+      x = cubicAt$$1(x0, x1, x2, x3, t);
+      y = cubicAt$$1(y0, y1, y2, y3, t); // Use line to approximate dashed bezier
+      // Bad result if dash is long
+
+      idx % 2 ? ctx.moveTo(x, y) : ctx.lineTo(x, y);
+      t += lineDash[idx] / bezierLen;
+      idx = (idx + 1) % nDash;
+    } // Finish the last segment and calculate the new offset
+
+
+    idx % 2 !== 0 && ctx.lineTo(x3, y3);
+    dx = x3 - x;
+    dy = y3 - y;
+    this._dashOffset = -mathSqrt$1(dx * dx + dy * dy);
+  },
+  _dashedQuadraticTo: function (x1, y1, x2, y2) {
+    // Convert quadratic to cubic using degree elevation
+    var x3 = x2;
+    var y3 = y2;
+    x2 = (x2 + 2 * x1) / 3;
+    y2 = (y2 + 2 * y1) / 3;
+    x1 = (this._xi + 2 * x1) / 3;
+    y1 = (this._yi + 2 * y1) / 3;
+
+    this._dashedBezierTo(x1, y1, x2, y2, x3, y3);
+  },
+
+  /**
+   * 杞垚闈欐�佺殑 Float32Array 鍑忓皯鍫嗗唴瀛樺崰鐢�
+   * Convert dynamic array to static Float32Array
+   */
+  toStatic: function () {
+    var data = this.data;
+
+    if (data instanceof Array) {
+      data.length = this._len;
+
+      if (hasTypedArray) {
+        this.data = new Float32Array(data);
+      }
+    }
+  },
+
+  /**
+   * @return {module:zrender/core/BoundingRect}
+   */
+  getBoundingRect: function () {
+    min$1[0] = min$1[1] = min2[0] = min2[1] = Number.MAX_VALUE;
+    max$1[0] = max$1[1] = max2[0] = max2[1] = -Number.MAX_VALUE;
+    var data = this.data;
+    var xi = 0;
+    var yi = 0;
+    var x0 = 0;
+    var y0 = 0;
+
+    for (var i = 0; i < data.length;) {
+      var cmd = data[i++];
+
+      if (i == 1) {
+        // 濡傛灉绗竴涓懡浠ゆ槸 L, C, Q
+        // 鍒� previous point 鍚岀粯鍒跺懡浠ょ殑绗竴涓� point
+        //
+        // 绗竴涓懡浠や负 Arc 鐨勬儏鍐典笅浼氬湪鍚庨潰鐗规畩澶勭悊
+        xi = data[i];
+        yi = data[i + 1];
+        x0 = xi;
+        y0 = yi;
+      }
+
+      switch (cmd) {
+        case CMD.M:
+          // moveTo 鍛戒护閲嶆柊鍒涘缓涓�涓柊鐨� subpath, 骞朵笖鏇存柊鏂扮殑璧风偣
+          // 鍦� closePath 鐨勬椂鍊欎娇鐢�
+          x0 = data[i++];
+          y0 = data[i++];
+          xi = x0;
+          yi = y0;
+          min2[0] = x0;
+          min2[1] = y0;
+          max2[0] = x0;
+          max2[1] = y0;
+          break;
+
+        case CMD.L:
+          fromLine(xi, yi, data[i], data[i + 1], min2, max2);
+          xi = data[i++];
+          yi = data[i++];
+          break;
+
+        case CMD.C:
+          fromCubic(xi, yi, data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1], min2, max2);
+          xi = data[i++];
+          yi = data[i++];
+          break;
+
+        case CMD.Q:
+          fromQuadratic(xi, yi, data[i++], data[i++], data[i], data[i + 1], min2, max2);
+          xi = data[i++];
+          yi = data[i++];
+          break;
+
+        case CMD.A:
+          // TODO Arc 鍒ゆ柇鐨勫紑閿�姣旇緝澶�
+          var cx = data[i++];
+          var cy = data[i++];
+          var rx = data[i++];
+          var ry = data[i++];
+          var startAngle = data[i++];
+          var endAngle = data[i++] + startAngle; // TODO Arc 鏃嬭浆
+
+          var psi = data[i++];
+          var anticlockwise = 1 - data[i++];
+
+          if (i == 1) {
+            // 鐩存帴浣跨敤 arc 鍛戒护
+            // 绗竴涓懡浠よ捣鐐硅繕鏈畾涔�
+            x0 = mathCos$1(startAngle) * rx + cx;
+            y0 = mathSin$1(startAngle) * ry + cy;
+          }
+
+          fromArc(cx, cy, rx, ry, startAngle, endAngle, anticlockwise, min2, max2);
+          xi = mathCos$1(endAngle) * rx + cx;
+          yi = mathSin$1(endAngle) * ry + cy;
+          break;
+
+        case CMD.R:
+          x0 = xi = data[i++];
+          y0 = yi = data[i++];
+          var width = data[i++];
+          var height = data[i++]; // Use fromLine
+
+          fromLine(x0, y0, x0 + width, y0 + height, min2, max2);
+          break;
+
+        case CMD.Z:
+          xi = x0;
+          yi = y0;
+          break;
+      } // Union
+
+
+      min(min$1, min$1, min2);
+      max(max$1, max$1, max2);
+    } // No data
+
+
+    if (i === 0) {
+      min$1[0] = min$1[1] = max$1[0] = max$1[1] = 0;
+    }
+
+    return new BoundingRect(min$1[0], min$1[1], max$1[0] - min$1[0], max$1[1] - min$1[1]);
+  },
+
+  /**
+   * Rebuild path from current data
+   * Rebuild path will not consider javascript implemented line dash.
+   * @param {CanvasRenderingContext2D} ctx
+   */
+  rebuildPath: function (ctx) {
+    var d = this.data;
+    var x0, y0;
+    var xi, yi;
+    var x, y;
+    var ux = this._ux;
+    var uy = this._uy;
+    var len$$1 = this._len;
+
+    for (var i = 0; i < len$$1;) {
+      var cmd = d[i++];
+
+      if (i == 1) {
+        // 濡傛灉绗竴涓懡浠ゆ槸 L, C, Q
+        // 鍒� previous point 鍚岀粯鍒跺懡浠ょ殑绗竴涓� point
+        //
+        // 绗竴涓懡浠や负 Arc 鐨勬儏鍐典笅浼氬湪鍚庨潰鐗规畩澶勭悊
+        xi = d[i];
+        yi = d[i + 1];
+        x0 = xi;
+        y0 = yi;
+      }
+
+      switch (cmd) {
+        case CMD.M:
+          x0 = xi = d[i++];
+          y0 = yi = d[i++];
+          ctx.moveTo(xi, yi);
+          break;
+
+        case CMD.L:
+          x = d[i++];
+          y = d[i++]; // Not draw too small seg between
+
+          if (mathAbs(x - xi) > ux || mathAbs(y - yi) > uy || i === len$$1 - 1) {
+            ctx.lineTo(x, y);
+            xi = x;
+            yi = y;
+          }
+
+          break;
+
+        case CMD.C:
+          ctx.bezierCurveTo(d[i++], d[i++], d[i++], d[i++], d[i++], d[i++]);
+          xi = d[i - 2];
+          yi = d[i - 1];
+          break;
+
+        case CMD.Q:
+          ctx.quadraticCurveTo(d[i++], d[i++], d[i++], d[i++]);
+          xi = d[i - 2];
+          yi = d[i - 1];
+          break;
+
+        case CMD.A:
+          var cx = d[i++];
+          var cy = d[i++];
+          var rx = d[i++];
+          var ry = d[i++];
+          var theta = d[i++];
+          var dTheta = d[i++];
+          var psi = d[i++];
+          var fs = d[i++];
+          var r = rx > ry ? rx : ry;
+          var scaleX = rx > ry ? 1 : rx / ry;
+          var scaleY = rx > ry ? ry / rx : 1;
+          var isEllipse = Math.abs(rx - ry) > 1e-3;
+          var endAngle = theta + dTheta;
+
+          if (isEllipse) {
+            ctx.translate(cx, cy);
+            ctx.rotate(psi);
+            ctx.scale(scaleX, scaleY);
+            ctx.arc(0, 0, r, theta, endAngle, 1 - fs);
+            ctx.scale(1 / scaleX, 1 / scaleY);
+            ctx.rotate(-psi);
+            ctx.translate(-cx, -cy);
+          } else {
+            ctx.arc(cx, cy, r, theta, endAngle, 1 - fs);
+          }
+
+          if (i == 1) {
+            // 鐩存帴浣跨敤 arc 鍛戒护
+            // 绗竴涓懡浠よ捣鐐硅繕鏈畾涔�
+            x0 = mathCos$1(theta) * rx + cx;
+            y0 = mathSin$1(theta) * ry + cy;
+          }
+
+          xi = mathCos$1(endAngle) * rx + cx;
+          yi = mathSin$1(endAngle) * ry + cy;
+          break;
+
+        case CMD.R:
+          x0 = xi = d[i];
+          y0 = yi = d[i + 1];
+          ctx.rect(d[i++], d[i++], d[i++], d[i++]);
+          break;
+
+        case CMD.Z:
+          ctx.closePath();
+          xi = x0;
+          yi = y0;
+      }
+    }
+  }
+};
+PathProxy.CMD = CMD;
+
+/**
+ * 绾挎鍖呭惈鍒ゆ柇
+ * @param  {number}  x0
+ * @param  {number}  y0
+ * @param  {number}  x1
+ * @param  {number}  y1
+ * @param  {number}  lineWidth
+ * @param  {number}  x
+ * @param  {number}  y
+ * @return {boolean}
+ */
+function containStroke$1(x0, y0, x1, y1, lineWidth, x, y) {
+  if (lineWidth === 0) {
+    return false;
+  }
+
+  var _l = lineWidth;
+  var _a = 0;
+  var _b = x0; // Quick reject
+
+  if (y > y0 + _l && y > y1 + _l || y < y0 - _l && y < y1 - _l || x > x0 + _l && x > x1 + _l || x < x0 - _l && x < x1 - _l) {
+    return false;
+  }
+
+  if (x0 !== x1) {
+    _a = (y0 - y1) / (x0 - x1);
+    _b = (x0 * y1 - x1 * y0) / (x0 - x1);
+  } else {
+    return Math.abs(x - x0) <= _l / 2;
+  }
+
+  var tmp = _a * x - y + _b;
+
+  var _s = tmp * tmp / (_a * _a + 1);
+
+  return _s <= _l / 2 * _l / 2;
+}
+
+/**
+ * 涓夋璐濆灏旀洸绾挎弿杈瑰寘鍚垽鏂�
+ * @param  {number}  x0
+ * @param  {number}  y0
+ * @param  {number}  x1
+ * @param  {number}  y1
+ * @param  {number}  x2
+ * @param  {number}  y2
+ * @param  {number}  x3
+ * @param  {number}  y3
+ * @param  {number}  lineWidth
+ * @param  {number}  x
+ * @param  {number}  y
+ * @return {boolean}
+ */
+
+function containStroke$2(x0, y0, x1, y1, x2, y2, x3, y3, lineWidth, x, y) {
+  if (lineWidth === 0) {
+    return false;
+  }
+
+  var _l = lineWidth; // Quick reject
+
+  if (y > y0 + _l && y > y1 + _l && y > y2 + _l && y > y3 + _l || y < y0 - _l && y < y1 - _l && y < y2 - _l && y < y3 - _l || x > x0 + _l && x > x1 + _l && x > x2 + _l && x > x3 + _l || x < x0 - _l && x < x1 - _l && x < x2 - _l && x < x3 - _l) {
+    return false;
+  }
+
+  var d = cubicProjectPoint(x0, y0, x1, y1, x2, y2, x3, y3, x, y, null);
+  return d <= _l / 2;
+}
+
+/**
+ * 浜屾璐濆灏旀洸绾挎弿杈瑰寘鍚垽鏂�
+ * @param  {number}  x0
+ * @param  {number}  y0
+ * @param  {number}  x1
+ * @param  {number}  y1
+ * @param  {number}  x2
+ * @param  {number}  y2
+ * @param  {number}  lineWidth
+ * @param  {number}  x
+ * @param  {number}  y
+ * @return {boolean}
+ */
+
+function containStroke$3(x0, y0, x1, y1, x2, y2, lineWidth, x, y) {
+  if (lineWidth === 0) {
+    return false;
+  }
+
+  var _l = lineWidth; // Quick reject
+
+  if (y > y0 + _l && y > y1 + _l && y > y2 + _l || y < y0 - _l && y < y1 - _l && y < y2 - _l || x > x0 + _l && x > x1 + _l && x > x2 + _l || x < x0 - _l && x < x1 - _l && x < x2 - _l) {
+    return false;
+  }
+
+  var d = quadraticProjectPoint(x0, y0, x1, y1, x2, y2, x, y, null);
+  return d <= _l / 2;
+}
+
+var PI2$3 = Math.PI * 2;
+function normalizeRadian(angle) {
+  angle %= PI2$3;
+
+  if (angle < 0) {
+    angle += PI2$3;
+  }
+
+  return angle;
+}
+
+var PI2$2 = Math.PI * 2;
+/**
+ * 鍦嗗姬鎻忚竟鍖呭惈鍒ゆ柇
+ * @param  {number}  cx
+ * @param  {number}  cy
+ * @param  {number}  r
+ * @param  {number}  startAngle
+ * @param  {number}  endAngle
+ * @param  {boolean}  anticlockwise
+ * @param  {number} lineWidth
+ * @param  {number}  x
+ * @param  {number}  y
+ * @return {Boolean}
+ */
+
+function containStroke$4(cx, cy, r, startAngle, endAngle, anticlockwise, lineWidth, x, y) {
+  if (lineWidth === 0) {
+    return false;
+  }
+
+  var _l = lineWidth;
+  x -= cx;
+  y -= cy;
+  var d = Math.sqrt(x * x + y * y);
+
+  if (d - _l > r || d + _l < r) {
+    return false;
+  }
+
+  if (Math.abs(startAngle - endAngle) % PI2$2 < 1e-4) {
+    // Is a circle
+    return true;
+  }
+
+  if (anticlockwise) {
+    var tmp = startAngle;
+    startAngle = normalizeRadian(endAngle);
+    endAngle = normalizeRadian(tmp);
+  } else {
+    startAngle = normalizeRadian(startAngle);
+    endAngle = normalizeRadian(endAngle);
+  }
+
+  if (startAngle > endAngle) {
+    endAngle += PI2$2;
+  }
+
+  var angle = Math.atan2(y, x);
+
+  if (angle < 0) {
+    angle += PI2$2;
+  }
+
+  return angle >= startAngle && angle <= endAngle || angle + PI2$2 >= startAngle && angle + PI2$2 <= endAngle;
+}
+
+function windingLine(x0, y0, x1, y1, x, y) {
+  if (y > y0 && y > y1 || y < y0 && y < y1) {
+    return 0;
+  } // Ignore horizontal line
+
+
+  if (y1 === y0) {
+    return 0;
+  }
+
+  var dir = y1 < y0 ? 1 : -1;
+  var t = (y - y0) / (y1 - y0); // Avoid winding error when intersection point is the connect point of two line of polygon
+
+  if (t === 1 || t === 0) {
+    dir = y1 < y0 ? 0.5 : -0.5;
+  }
+
+  var x_ = t * (x1 - x0) + x0; // If (x, y) on the line, considered as "contain".
+
+  return x_ === x ? Infinity : x_ > x ? dir : 0;
+}
+
+var CMD$1 = PathProxy.CMD;
+var PI2$1 = Math.PI * 2;
+var EPSILON$2 = 1e-4;
+
+function isAroundEqual(a, b) {
+  return Math.abs(a - b) < EPSILON$2;
+} // 涓存椂鏁扮粍
+
+
+var roots = [-1, -1, -1];
+var extrema = [-1, -1];
+
+function swapExtrema() {
+  var tmp = extrema[0];
+  extrema[0] = extrema[1];
+  extrema[1] = tmp;
+}
+
+function windingCubic(x0, y0, x1, y1, x2, y2, x3, y3, x, y) {
+  // Quick reject
+  if (y > y0 && y > y1 && y > y2 && y > y3 || y < y0 && y < y1 && y < y2 && y < y3) {
+    return 0;
+  }
+
+  var nRoots = cubicRootAt(y0, y1, y2, y3, y, roots);
+
+  if (nRoots === 0) {
+    return 0;
+  } else {
+    var w = 0;
+    var nExtrema = -1;
+    var y0_, y1_;
+
+    for (var i = 0; i < nRoots; i++) {
+      var t = roots[i]; // Avoid winding error when intersection point is the connect point of two line of polygon
+
+      var unit = t === 0 || t === 1 ? 0.5 : 1;
+      var x_ = cubicAt(x0, x1, x2, x3, t);
+
+      if (x_ < x) {
+        // Quick reject
+        continue;
+      }
+
+      if (nExtrema < 0) {
+        nExtrema = cubicExtrema(y0, y1, y2, y3, extrema);
+
+        if (extrema[1] < extrema[0] && nExtrema > 1) {
+          swapExtrema();
+        }
+
+        y0_ = cubicAt(y0, y1, y2, y3, extrema[0]);
+
+        if (nExtrema > 1) {
+          y1_ = cubicAt(y0, y1, y2, y3, extrema[1]);
+        }
+      }
+
+      if (nExtrema == 2) {
+        // 鍒嗘垚涓夋鍗曡皟鍑芥暟
+        if (t < extrema[0]) {
+          w += y0_ < y0 ? unit : -unit;
+        } else if (t < extrema[1]) {
+          w += y1_ < y0_ ? unit : -unit;
+        } else {
+          w += y3 < y1_ ? unit : -unit;
+        }
+      } else {
+        // 鍒嗘垚涓ゆ鍗曡皟鍑芥暟
+        if (t < extrema[0]) {
+          w += y0_ < y0 ? unit : -unit;
+        } else {
+          w += y3 < y0_ ? unit : -unit;
+        }
+      }
+    }
+
+    return w;
+  }
+}
+
+function windingQuadratic(x0, y0, x1, y1, x2, y2, x, y) {
+  // Quick reject
+  if (y > y0 && y > y1 && y > y2 || y < y0 && y < y1 && y < y2) {
+    return 0;
+  }
+
+  var nRoots = quadraticRootAt(y0, y1, y2, y, roots);
+
+  if (nRoots === 0) {
+    return 0;
+  } else {
+    var t = quadraticExtremum(y0, y1, y2);
+
+    if (t >= 0 && t <= 1) {
+      var w = 0;
+      var y_ = quadraticAt(y0, y1, y2, t);
+
+      for (var i = 0; i < nRoots; i++) {
+        // Remove one endpoint.
+        var unit = roots[i] === 0 || roots[i] === 1 ? 0.5 : 1;
+        var x_ = quadraticAt(x0, x1, x2, roots[i]);
+
+        if (x_ < x) {
+          // Quick reject
+          continue;
+        }
+
+        if (roots[i] < t) {
+          w += y_ < y0 ? unit : -unit;
+        } else {
+          w += y2 < y_ ? unit : -unit;
+        }
+      }
+
+      return w;
+    } else {
+      // Remove one endpoint.
+      var unit = roots[0] === 0 || roots[0] === 1 ? 0.5 : 1;
+      var x_ = quadraticAt(x0, x1, x2, roots[0]);
+
+      if (x_ < x) {
+        // Quick reject
+        return 0;
+      }
+
+      return y2 < y0 ? unit : -unit;
+    }
+  }
+} // TODO
+// Arc 鏃嬭浆
+
+
+function windingArc(cx, cy, r, startAngle, endAngle, anticlockwise, x, y) {
+  y -= cy;
+
+  if (y > r || y < -r) {
+    return 0;
+  }
+
+  var tmp = Math.sqrt(r * r - y * y);
+  roots[0] = -tmp;
+  roots[1] = tmp;
+  var diff = Math.abs(startAngle - endAngle);
+
+  if (diff < 1e-4) {
+    return 0;
+  }
+
+  if (diff % PI2$1 < 1e-4) {
+    // Is a circle
+    startAngle = 0;
+    endAngle = PI2$1;
+    var dir = anticlockwise ? 1 : -1;
+
+    if (x >= roots[0] + cx && x <= roots[1] + cx) {
+      return dir;
+    } else {
+      return 0;
+    }
+  }
+
+  if (anticlockwise) {
+    var tmp = startAngle;
+    startAngle = normalizeRadian(endAngle);
+    endAngle = normalizeRadian(tmp);
+  } else {
+    startAngle = normalizeRadian(startAngle);
+    endAngle = normalizeRadian(endAngle);
+  }
+
+  if (startAngle > endAngle) {
+    endAngle += PI2$1;
+  }
+
+  var w = 0;
+
+  for (var i = 0; i < 2; i++) {
+    var x_ = roots[i];
+
+    if (x_ + cx > x) {
+      var angle = Math.atan2(y, x_);
+      var dir = anticlockwise ? 1 : -1;
+
+      if (angle < 0) {
+        angle = PI2$1 + angle;
+      }
+
+      if (angle >= startAngle && angle <= endAngle || angle + PI2$1 >= startAngle && angle + PI2$1 <= endAngle) {
+        if (angle > Math.PI / 2 && angle < Math.PI * 1.5) {
+          dir = -dir;
+        }
+
+        w += dir;
+      }
+    }
+  }
+
+  return w;
+}
+
+function containPath(data, lineWidth, isStroke, x, y) {
+  var w = 0;
+  var xi = 0;
+  var yi = 0;
+  var x0 = 0;
+  var y0 = 0;
+
+  for (var i = 0; i < data.length;) {
+    var cmd = data[i++]; // Begin a new subpath
+
+    if (cmd === CMD$1.M && i > 1) {
+      // Close previous subpath
+      if (!isStroke) {
+        w += windingLine(xi, yi, x0, y0, x, y);
+      } // 濡傛灉琚换浣曚竴涓� subpath 鍖呭惈
+      // if (w !== 0) {
+      //     return true;
+      // }
+
+    }
+
+    if (i == 1) {
+      // 濡傛灉绗竴涓懡浠ゆ槸 L, C, Q
+      // 鍒� previous point 鍚岀粯鍒跺懡浠ょ殑绗竴涓� point
+      //
+      // 绗竴涓懡浠や负 Arc 鐨勬儏鍐典笅浼氬湪鍚庨潰鐗规畩澶勭悊
+      xi = data[i];
+      yi = data[i + 1];
+      x0 = xi;
+      y0 = yi;
+    }
+
+    switch (cmd) {
+      case CMD$1.M:
+        // moveTo 鍛戒护閲嶆柊鍒涘缓涓�涓柊鐨� subpath, 骞朵笖鏇存柊鏂扮殑璧风偣
+        // 鍦� closePath 鐨勬椂鍊欎娇鐢�
+        x0 = data[i++];
+        y0 = data[i++];
+        xi = x0;
+        yi = y0;
+        break;
+
+      case CMD$1.L:
+        if (isStroke) {
+          if (containStroke$1(xi, yi, data[i], data[i + 1], lineWidth, x, y)) {
+            return true;
+          }
+        } else {
+          // NOTE 鍦ㄧ涓�涓懡浠や负 L, C, Q 鐨勬椂鍊欎細璁$畻鍑� NaN
+          w += windingLine(xi, yi, data[i], data[i + 1], x, y) || 0;
+        }
+
+        xi = data[i++];
+        yi = data[i++];
+        break;
+
+      case CMD$1.C:
+        if (isStroke) {
+          if (containStroke$2(xi, yi, data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1], lineWidth, x, y)) {
+            return true;
+          }
+        } else {
+          w += windingCubic(xi, yi, data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1], x, y) || 0;
+        }
+
+        xi = data[i++];
+        yi = data[i++];
+        break;
+
+      case CMD$1.Q:
+        if (isStroke) {
+          if (containStroke$3(xi, yi, data[i++], data[i++], data[i], data[i + 1], lineWidth, x, y)) {
+            return true;
+          }
+        } else {
+          w += windingQuadratic(xi, yi, data[i++], data[i++], data[i], data[i + 1], x, y) || 0;
+        }
+
+        xi = data[i++];
+        yi = data[i++];
+        break;
+
+      case CMD$1.A:
+        // TODO Arc 鍒ゆ柇鐨勫紑閿�姣旇緝澶�
+        var cx = data[i++];
+        var cy = data[i++];
+        var rx = data[i++];
+        var ry = data[i++];
+        var theta = data[i++];
+        var dTheta = data[i++]; // TODO Arc 鏃嬭浆
+
+        var psi = data[i++];
+        var anticlockwise = 1 - data[i++];
+        var x1 = Math.cos(theta) * rx + cx;
+        var y1 = Math.sin(theta) * ry + cy; // 涓嶆槸鐩存帴浣跨敤 arc 鍛戒护
+
+        if (i > 1) {
+          w += windingLine(xi, yi, x1, y1, x, y);
+        } else {
+          // 绗竴涓懡浠よ捣鐐硅繕鏈畾涔�
+          x0 = x1;
+          y0 = y1;
+        } // zr 浣跨敤scale鏉ユā鎷熸き鍦�, 杩欓噷涔熷x鍋氫竴瀹氱殑缂╂斁
+
+
+        var _x = (x - cx) * ry / rx + cx;
+
+        if (isStroke) {
+          if (containStroke$4(cx, cy, ry, theta, theta + dTheta, anticlockwise, lineWidth, _x, y)) {
+            return true;
+          }
+        } else {
+          w += windingArc(cx, cy, ry, theta, theta + dTheta, anticlockwise, _x, y);
+        }
+
+        xi = Math.cos(theta + dTheta) * rx + cx;
+        yi = Math.sin(theta + dTheta) * ry + cy;
+        break;
+
+      case CMD$1.R:
+        x0 = xi = data[i++];
+        y0 = yi = data[i++];
+        var width = data[i++];
+        var height = data[i++];
+        var x1 = x0 + width;
+        var y1 = y0 + height;
+
+        if (isStroke) {
+          if (containStroke$1(x0, y0, x1, y0, lineWidth, x, y) || containStroke$1(x1, y0, x1, y1, lineWidth, x, y) || containStroke$1(x1, y1, x0, y1, lineWidth, x, y) || containStroke$1(x0, y1, x0, y0, lineWidth, x, y)) {
+            return true;
+          }
+        } else {
+          // FIXME Clockwise ?
+          w += windingLine(x1, y0, x1, y1, x, y);
+          w += windingLine(x0, y1, x0, y0, x, y);
+        }
+
+        break;
+
+      case CMD$1.Z:
+        if (isStroke) {
+          if (containStroke$1(xi, yi, x0, y0, lineWidth, x, y)) {
+            return true;
+          }
+        } else {
+          // Close a subpath
+          w += windingLine(xi, yi, x0, y0, x, y); // 濡傛灉琚换浣曚竴涓� subpath 鍖呭惈
+          // FIXME subpaths may overlap
+          // if (w !== 0) {
+          //     return true;
+          // }
+        }
+
+        xi = x0;
+        yi = y0;
+        break;
+    }
+  }
+
+  if (!isStroke && !isAroundEqual(yi, y0)) {
+    w += windingLine(xi, yi, x0, y0, x, y) || 0;
+  }
+
+  return w !== 0;
+}
+
+function contain(pathData, x, y) {
+  return containPath(pathData, 0, false, x, y);
+}
+function containStroke(pathData, lineWidth, x, y) {
+  return containPath(pathData, lineWidth, true, x, y);
+}
+
+var getCanvasPattern = Pattern.prototype.getCanvasPattern;
+var abs = Math.abs;
+var pathProxyForDraw = new PathProxy(true);
+/**
+ * @alias module:zrender/graphic/Path
+ * @extends module:zrender/graphic/Displayable
+ * @constructor
+ * @param {Object} opts
+ */
+
+function Path(opts) {
+  Displayable.call(this, opts);
+  /**
+   * @type {module:zrender/core/PathProxy}
+   * @readOnly
+   */
+
+  this.path = null;
+}
+
+Path.prototype = {
+  constructor: Path,
+  type: 'path',
+  __dirtyPath: true,
+  strokeContainThreshold: 5,
+  brush: function (ctx, prevEl) {
+    var style = this.style;
+    var path = this.path || pathProxyForDraw;
+    var hasStroke = style.hasStroke();
+    var hasFill = style.hasFill();
+    var fill = style.fill;
+    var stroke = style.stroke;
+    var hasFillGradient = hasFill && !!fill.colorStops;
+    var hasStrokeGradient = hasStroke && !!stroke.colorStops;
+    var hasFillPattern = hasFill && !!fill.image;
+    var hasStrokePattern = hasStroke && !!stroke.image;
+    style.bind(ctx, this, prevEl);
+    this.setTransform(ctx);
+
+    if (this.__dirty) {
+      var rect; // Update gradient because bounding rect may changed
+
+      if (hasFillGradient) {
+        rect = rect || this.getBoundingRect();
+        this._fillGradient = style.getGradient(ctx, fill, rect);
+      }
+
+      if (hasStrokeGradient) {
+        rect = rect || this.getBoundingRect();
+        this._strokeGradient = style.getGradient(ctx, stroke, rect);
+      }
+    } // Use the gradient or pattern
+
+
+    if (hasFillGradient) {
+      // PENDING If may have affect the state
+      ctx.fillStyle = this._fillGradient;
+    } else if (hasFillPattern) {
+      ctx.fillStyle = getCanvasPattern.call(fill, ctx);
+    }
+
+    if (hasStrokeGradient) {
+      ctx.strokeStyle = this._strokeGradient;
+    } else if (hasStrokePattern) {
+      ctx.strokeStyle = getCanvasPattern.call(stroke, ctx);
+    }
+
+    var lineDash = style.lineDash;
+    var lineDashOffset = style.lineDashOffset;
+    var ctxLineDash = !!ctx.setLineDash; // Update path sx, sy
+
+    var scale = this.getGlobalScale();
+    path.setScale(scale[0], scale[1]); // Proxy context
+    // Rebuild path in following 2 cases
+    // 1. Path is dirty
+    // 2. Path needs javascript implemented lineDash stroking.
+    //    In this case, lineDash information will not be saved in PathProxy
+
+    if (this.__dirtyPath || lineDash && !ctxLineDash && hasStroke) {
+      path.beginPath(ctx); // Setting line dash before build path
+
+      if (lineDash && !ctxLineDash) {
+        path.setLineDash(lineDash);
+        path.setLineDashOffset(lineDashOffset);
+      }
+
+      this.buildPath(path, this.shape, false); // Clear path dirty flag
+
+      if (this.path) {
+        this.__dirtyPath = false;
+      }
+    } else {
+      // Replay path building
+      ctx.beginPath();
+      this.path.rebuildPath(ctx);
+    }
+
+    if (hasFill) {
+      if (style.fillOpacity != null) {
+        var originalGlobalAlpha = ctx.globalAlpha;
+        ctx.globalAlpha = style.fillOpacity * style.opacity;
+        path.fill(ctx);
+        ctx.globalAlpha = originalGlobalAlpha;
+      } else {
+        path.fill(ctx);
+      }
+    }
+
+    if (lineDash && ctxLineDash) {
+      ctx.setLineDash(lineDash);
+      ctx.lineDashOffset = lineDashOffset;
+    }
+
+    if (hasStroke) {
+      if (style.strokeOpacity != null) {
+        var originalGlobalAlpha = ctx.globalAlpha;
+        ctx.globalAlpha = style.strokeOpacity * style.opacity;
+        path.stroke(ctx);
+        ctx.globalAlpha = originalGlobalAlpha;
+      } else {
+        path.stroke(ctx);
+      }
+    }
+
+    if (lineDash && ctxLineDash) {
+      // PENDING
+      // Remove lineDash
+      ctx.setLineDash([]);
+    } // Draw rect text
+
+
+    if (style.text != null) {
+      // Only restore transform when needs draw text.
+      this.restoreTransform(ctx);
+      this.drawRectText(ctx, this.getBoundingRect());
+    }
+  },
+  // When bundling path, some shape may decide if use moveTo to begin a new subpath or closePath
+  // Like in circle
+  buildPath: function (ctx, shapeCfg, inBundle) {},
+  createPathProxy: function () {
+    this.path = new PathProxy();
+  },
+  getBoundingRect: function () {
+    var rect = this._rect;
+    var style = this.style;
+    var needsUpdateRect = !rect;
+
+    if (needsUpdateRect) {
+      var path = this.path;
+
+      if (!path) {
+        // Create path on demand.
+        path = this.path = new PathProxy();
+      }
+
+      if (this.__dirtyPath) {
+        path.beginPath();
+        this.buildPath(path, this.shape, false);
+      }
+
+      rect = path.getBoundingRect();
+    }
+
+    this._rect = rect;
+
+    if (style.hasStroke()) {
+      // Needs update rect with stroke lineWidth when
+      // 1. Element changes scale or lineWidth
+      // 2. Shape is changed
+      var rectWithStroke = this._rectWithStroke || (this._rectWithStroke = rect.clone());
+
+      if (this.__dirty || needsUpdateRect) {
+        rectWithStroke.copy(rect); // FIXME Must after updateTransform
+
+        var w = style.lineWidth; // PENDING, Min line width is needed when line is horizontal or vertical
+
+        var lineScale = style.strokeNoScale ? this.getLineScale() : 1; // Only add extra hover lineWidth when there are no fill
+
+        if (!style.hasFill()) {
+          w = Math.max(w, this.strokeContainThreshold || 4);
+        } // Consider line width
+        // Line scale can't be 0;
+
+
+        if (lineScale > 1e-10) {
+          rectWithStroke.width += w / lineScale;
+          rectWithStroke.height += w / lineScale;
+          rectWithStroke.x -= w / lineScale / 2;
+          rectWithStroke.y -= w / lineScale / 2;
+        }
+      } // Return rect with stroke
+
+
+      return rectWithStroke;
+    }
+
+    return rect;
+  },
+  contain: function (x, y) {
+    var localPos = this.transformCoordToLocal(x, y);
+    var rect = this.getBoundingRect();
+    var style = this.style;
+    x = localPos[0];
+    y = localPos[1];
+
+    if (rect.contain(x, y)) {
+      var pathData = this.path.data;
+
+      if (style.hasStroke()) {
+        var lineWidth = style.lineWidth;
+        var lineScale = style.strokeNoScale ? this.getLineScale() : 1; // Line scale can't be 0;
+
+        if (lineScale > 1e-10) {
+          // Only add extra hover lineWidth when there are no fill
+          if (!style.hasFill()) {
+            lineWidth = Math.max(lineWidth, this.strokeContainThreshold);
+          }
+
+          if (containStroke(pathData, lineWidth / lineScale, x, y)) {
+            return true;
+          }
+        }
+      }
+
+      if (style.hasFill()) {
+        return contain(pathData, x, y);
+      }
+    }
+
+    return false;
+  },
+
+  /**
+   * @param  {boolean} dirtyPath
+   */
+  dirty: function (dirtyPath) {
+    if (dirtyPath == null) {
+      dirtyPath = true;
+    } // Only mark dirty, not mark clean
+
+
+    if (dirtyPath) {
+      this.__dirtyPath = dirtyPath;
+      this._rect = null;
+    }
+
+    this.__dirty = this.__dirtyText = true;
+    this.__zr && this.__zr.refresh(); // Used as a clipping path
+
+    if (this.__clipTarget) {
+      this.__clipTarget.dirty();
+    }
+  },
+
+  /**
+   * Alias for animate('shape')
+   * @param {boolean} loop
+   */
+  animateShape: function (loop) {
+    return this.animate('shape', loop);
+  },
+  // Overwrite attrKV
+  attrKV: function (key, value) {
+    // FIXME
+    if (key === 'shape') {
+      this.setShape(value);
+      this.__dirtyPath = true;
+      this._rect = null;
+    } else {
+      Displayable.prototype.attrKV.call(this, key, value);
+    }
+  },
+
+  /**
+   * @param {Object|string} key
+   * @param {*} value
+   */
+  setShape: function (key, value) {
+    var shape = this.shape; // Path from string may not have shape
+
+    if (shape) {
+      if (isObject$1(key)) {
+        for (var name in key) {
+          if (key.hasOwnProperty(name)) {
+            shape[name] = key[name];
+          }
+        }
+      } else {
+        shape[key] = value;
+      }
+
+      this.dirty(true);
+    }
+
+    return this;
+  },
+  getLineScale: function () {
+    var m = this.transform; // Get the line scale.
+    // Determinant of `m` means how much the area is enlarged by the
+    // transformation. So its square root can be used as a scale factor
+    // for width.
+
+    return m && abs(m[0] - 1) > 1e-10 && abs(m[3] - 1) > 1e-10 ? Math.sqrt(abs(m[0] * m[3] - m[2] * m[1])) : 1;
+  }
+};
+/**
+ * 鎵╁睍涓�涓� Path element, 姣斿鏄熷舰锛屽渾绛夈��
+ * Extend a path element
+ * @param {Object} props
+ * @param {string} props.type Path type
+ * @param {Function} props.init Initialize
+ * @param {Function} props.buildPath Overwrite buildPath method
+ * @param {Object} [props.style] Extended default style config
+ * @param {Object} [props.shape] Extended default shape config
+ */
+
+Path.extend = function (defaults$$1) {
+  var Sub = function (opts) {
+    Path.call(this, opts);
+
+    if (defaults$$1.style) {
+      // Extend default style
+      this.style.extendFrom(defaults$$1.style, false);
+    } // Extend default shape
+
+
+    var defaultShape = defaults$$1.shape;
+
+    if (defaultShape) {
+      this.shape = this.shape || {};
+      var thisShape = this.shape;
+
+      for (var name in defaultShape) {
+        if (!thisShape.hasOwnProperty(name) && defaultShape.hasOwnProperty(name)) {
+          thisShape[name] = defaultShape[name];
+        }
+      }
+    }
+
+    defaults$$1.init && defaults$$1.init.call(this, opts);
+  };
+
+  inherits(Sub, Path); // FIXME 涓嶈兘 extend position, rotation 绛夊紩鐢ㄥ璞�
+
+  for (var name in defaults$$1) {
+    // Extending prototype values and methods
+    if (name !== 'style' && name !== 'shape') {
+      Sub.prototype[name] = defaults$$1[name];
+    }
+  }
+
+  return Sub;
+};
+
+inherits(Path, Displayable);
+
+var CMD$2 = PathProxy.CMD;
+var points = [[], [], []];
+var mathSqrt$3 = Math.sqrt;
+var mathAtan2 = Math.atan2;
+var transformPath = function (path, m) {
+  var data = path.data;
+  var cmd;
+  var nPoint;
+  var i;
+  var j;
+  var k;
+  var p;
+  var M = CMD$2.M;
+  var C = CMD$2.C;
+  var L = CMD$2.L;
+  var R = CMD$2.R;
+  var A = CMD$2.A;
+  var Q = CMD$2.Q;
+
+  for (i = 0, j = 0; i < data.length;) {
+    cmd = data[i++];
+    j = i;
+    nPoint = 0;
+
+    switch (cmd) {
+      case M:
+        nPoint = 1;
+        break;
+
+      case L:
+        nPoint = 1;
+        break;
+
+      case C:
+        nPoint = 3;
+        break;
+
+      case Q:
+        nPoint = 2;
+        break;
+
+      case A:
+        var x = m[4];
+        var y = m[5];
+        var sx = mathSqrt$3(m[0] * m[0] + m[1] * m[1]);
+        var sy = mathSqrt$3(m[2] * m[2] + m[3] * m[3]);
+        var angle = mathAtan2(-m[1] / sy, m[0] / sx); // cx
+
+        data[i] *= sx;
+        data[i++] += x; // cy
+
+        data[i] *= sy;
+        data[i++] += y; // Scale rx and ry
+        // FIXME Assume psi is 0 here
+
+        data[i++] *= sx;
+        data[i++] *= sy; // Start angle
+
+        data[i++] += angle; // end angle
+
+        data[i++] += angle; // FIXME psi
+
+        i += 2;
+        j = i;
+        break;
+
+      case R:
+        // x0, y0
+        p[0] = data[i++];
+        p[1] = data[i++];
+        applyTransform(p, p, m);
+        data[j++] = p[0];
+        data[j++] = p[1]; // x1, y1
+
+        p[0] += data[i++];
+        p[1] += data[i++];
+        applyTransform(p, p, m);
+        data[j++] = p[0];
+        data[j++] = p[1];
+    }
+
+    for (k = 0; k < nPoint; k++) {
+      var p = points[k];
+      p[0] = data[i++];
+      p[1] = data[i++];
+      applyTransform(p, p, m); // Write back
+
+      data[j++] = p[0];
+      data[j++] = p[1];
+    }
+  }
+};
+
+// var cc = [
+//     'm', 'M', 'l', 'L', 'v', 'V', 'h', 'H', 'z', 'Z',
+//     'c', 'C', 'q', 'Q', 't', 'T', 's', 'S', 'a', 'A'
+// ];
+
+var mathSqrt = Math.sqrt;
+var mathSin = Math.sin;
+var mathCos = Math.cos;
+var PI = Math.PI;
+
+var vMag = function (v) {
+  return Math.sqrt(v[0] * v[0] + v[1] * v[1]);
+};
+
+var vRatio = function (u, v) {
+  return (u[0] * v[0] + u[1] * v[1]) / (vMag(u) * vMag(v));
+};
+
+var vAngle = function (u, v) {
+  return (u[0] * v[1] < u[1] * v[0] ? -1 : 1) * Math.acos(vRatio(u, v));
+};
+
+function processArc(x1, y1, x2, y2, fa, fs, rx, ry, psiDeg, cmd, path) {
+  var psi = psiDeg * (PI / 180.0);
+  var xp = mathCos(psi) * (x1 - x2) / 2.0 + mathSin(psi) * (y1 - y2) / 2.0;
+  var yp = -1 * mathSin(psi) * (x1 - x2) / 2.0 + mathCos(psi) * (y1 - y2) / 2.0;
+  var lambda = xp * xp / (rx * rx) + yp * yp / (ry * ry);
+
+  if (lambda > 1) {
+    rx *= mathSqrt(lambda);
+    ry *= mathSqrt(lambda);
+  }
+
+  var f = (fa === fs ? -1 : 1) * mathSqrt((rx * rx * (ry * ry) - rx * rx * (yp * yp) - ry * ry * (xp * xp)) / (rx * rx * (yp * yp) + ry * ry * (xp * xp))) || 0;
+  var cxp = f * rx * yp / ry;
+  var cyp = f * -ry * xp / rx;
+  var cx = (x1 + x2) / 2.0 + mathCos(psi) * cxp - mathSin(psi) * cyp;
+  var cy = (y1 + y2) / 2.0 + mathSin(psi) * cxp + mathCos(psi) * cyp;
+  var theta = vAngle([1, 0], [(xp - cxp) / rx, (yp - cyp) / ry]);
+  var u = [(xp - cxp) / rx, (yp - cyp) / ry];
+  var v = [(-1 * xp - cxp) / rx, (-1 * yp - cyp) / ry];
+  var dTheta = vAngle(u, v);
+
+  if (vRatio(u, v) <= -1) {
+    dTheta = PI;
+  }
+
+  if (vRatio(u, v) >= 1) {
+    dTheta = 0;
+  }
+
+  if (fs === 0 && dTheta > 0) {
+    dTheta = dTheta - 2 * PI;
+  }
+
+  if (fs === 1 && dTheta < 0) {
+    dTheta = dTheta + 2 * PI;
+  }
+
+  path.addData(cmd, cx, cy, rx, ry, theta, dTheta, psi, fs);
+}
+
+var commandReg = /([mlvhzcqtsa])([^mlvhzcqtsa]*)/ig; // Consider case:
+// (1) delimiter can be comma or space, where continuous commas
+// or spaces should be seen as one comma.
+// (2) value can be like:
+// '2e-4', 'l.5.9' (ignore 0), 'M-10-10', 'l-2.43e-1,34.9983',
+// 'l-.5E1,54', '121-23-44-11' (no delimiter)
+
+var numberReg = /-?([0-9]*\.)?[0-9]+([eE]-?[0-9]+)?/g; // var valueSplitReg = /[\s,]+/;
+
+function createPathProxyFromString(data) {
+  if (!data) {
+    return new PathProxy();
+  } // var data = data.replace(/-/g, ' -')
+  //     .replace(/  /g, ' ')
+  //     .replace(/ /g, ',')
+  //     .replace(/,,/g, ',');
+  // var n;
+  // create pipes so that we can split the data
+  // for (n = 0; n < cc.length; n++) {
+  //     cs = cs.replace(new RegExp(cc[n], 'g'), '|' + cc[n]);
+  // }
+  // data = data.replace(/-/g, ',-');
+  // create array
+  // var arr = cs.split('|');
+  // init context point
+
+
+  var cpx = 0;
+  var cpy = 0;
+  var subpathX = cpx;
+  var subpathY = cpy;
+  var prevCmd;
+  var path = new PathProxy();
+  var CMD = PathProxy.CMD; // commandReg.lastIndex = 0;
+  // var cmdResult;
+  // while ((cmdResult = commandReg.exec(data)) != null) {
+  //     var cmdStr = cmdResult[1];
+  //     var cmdContent = cmdResult[2];
+
+  var cmdList = data.match(commandReg);
+
+  for (var l = 0; l < cmdList.length; l++) {
+    var cmdText = cmdList[l];
+    var cmdStr = cmdText.charAt(0);
+    var cmd; // String#split is faster a little bit than String#replace or RegExp#exec.
+    // var p = cmdContent.split(valueSplitReg);
+    // var pLen = 0;
+    // for (var i = 0; i < p.length; i++) {
+    //     // '' and other invalid str => NaN
+    //     var val = parseFloat(p[i]);
+    //     !isNaN(val) && (p[pLen++] = val);
+    // }
+
+    var p = cmdText.match(numberReg) || [];
+    var pLen = p.length;
+
+    for (var i = 0; i < pLen; i++) {
+      p[i] = parseFloat(p[i]);
+    }
+
+    var off = 0;
+
+    while (off < pLen) {
+      var ctlPtx;
+      var ctlPty;
+      var rx;
+      var ry;
+      var psi;
+      var fa;
+      var fs;
+      var x1 = cpx;
+      var y1 = cpy; // convert l, H, h, V, and v to L
+
+      switch (cmdStr) {
+        case 'l':
+          cpx += p[off++];
+          cpy += p[off++];
+          cmd = CMD.L;
+          path.addData(cmd, cpx, cpy);
+          break;
+
+        case 'L':
+          cpx = p[off++];
+          cpy = p[off++];
+          cmd = CMD.L;
+          path.addData(cmd, cpx, cpy);
+          break;
+
+        case 'm':
+          cpx += p[off++];
+          cpy += p[off++];
+          cmd = CMD.M;
+          path.addData(cmd, cpx, cpy);
+          subpathX = cpx;
+          subpathY = cpy;
+          cmdStr = 'l';
+          break;
+
+        case 'M':
+          cpx = p[off++];
+          cpy = p[off++];
+          cmd = CMD.M;
+          path.addData(cmd, cpx, cpy);
+          subpathX = cpx;
+          subpathY = cpy;
+          cmdStr = 'L';
+          break;
+
+        case 'h':
+          cpx += p[off++];
+          cmd = CMD.L;
+          path.addData(cmd, cpx, cpy);
+          break;
+
+        case 'H':
+          cpx = p[off++];
+          cmd = CMD.L;
+          path.addData(cmd, cpx, cpy);
+          break;
+
+        case 'v':
+          cpy += p[off++];
+          cmd = CMD.L;
+          path.addData(cmd, cpx, cpy);
+          break;
+
+        case 'V':
+          cpy = p[off++];
+          cmd = CMD.L;
+          path.addData(cmd, cpx, cpy);
+          break;
+
+        case 'C':
+          cmd = CMD.C;
+          path.addData(cmd, p[off++], p[off++], p[off++], p[off++], p[off++], p[off++]);
+          cpx = p[off - 2];
+          cpy = p[off - 1];
+          break;
+
+        case 'c':
+          cmd = CMD.C;
+          path.addData(cmd, p[off++] + cpx, p[off++] + cpy, p[off++] + cpx, p[off++] + cpy, p[off++] + cpx, p[off++] + cpy);
+          cpx += p[off - 2];
+          cpy += p[off - 1];
+          break;
+
+        case 'S':
+          ctlPtx = cpx;
+          ctlPty = cpy;
+          var len = path.len();
+          var pathData = path.data;
+
+          if (prevCmd === CMD.C) {
+            ctlPtx += cpx - pathData[len - 4];
+            ctlPty += cpy - pathData[len - 3];
+          }
+
+          cmd = CMD.C;
+          x1 = p[off++];
+          y1 = p[off++];
+          cpx = p[off++];
+          cpy = p[off++];
+          path.addData(cmd, ctlPtx, ctlPty, x1, y1, cpx, cpy);
+          break;
+
+        case 's':
+          ctlPtx = cpx;
+          ctlPty = cpy;
+          var len = path.len();
+          var pathData = path.data;
+
+          if (prevCmd === CMD.C) {
+            ctlPtx += cpx - pathData[len - 4];
+            ctlPty += cpy - pathData[len - 3];
+          }
+
+          cmd = CMD.C;
+          x1 = cpx + p[off++];
+          y1 = cpy + p[off++];
+          cpx += p[off++];
+          cpy += p[off++];
+          path.addData(cmd, ctlPtx, ctlPty, x1, y1, cpx, cpy);
+          break;
+
+        case 'Q':
+          x1 = p[off++];
+          y1 = p[off++];
+          cpx = p[off++];
+          cpy = p[off++];
+          cmd = CMD.Q;
+          path.addData(cmd, x1, y1, cpx, cpy);
+          break;
+
+        case 'q':
+          x1 = p[off++] + cpx;
+          y1 = p[off++] + cpy;
+          cpx += p[off++];
+          cpy += p[off++];
+          cmd = CMD.Q;
+          path.addData(cmd, x1, y1, cpx, cpy);
+          break;
+
+        case 'T':
+          ctlPtx = cpx;
+          ctlPty = cpy;
+          var len = path.len();
+          var pathData = path.data;
+
+          if (prevCmd === CMD.Q) {
+            ctlPtx += cpx - pathData[len - 4];
+            ctlPty += cpy - pathData[len - 3];
+          }
+
+          cpx = p[off++];
+          cpy = p[off++];
+          cmd = CMD.Q;
+          path.addData(cmd, ctlPtx, ctlPty, cpx, cpy);
+          break;
+
+        case 't':
+          ctlPtx = cpx;
+          ctlPty = cpy;
+          var len = path.len();
+          var pathData = path.data;
+
+          if (prevCmd === CMD.Q) {
+            ctlPtx += cpx - pathData[len - 4];
+            ctlPty += cpy - pathData[len - 3];
+          }
+
+          cpx += p[off++];
+          cpy += p[off++];
+          cmd = CMD.Q;
+          path.addData(cmd, ctlPtx, ctlPty, cpx, cpy);
+          break;
+
+        case 'A':
+          rx = p[off++];
+          ry = p[off++];
+          psi = p[off++];
+          fa = p[off++];
+          fs = p[off++];
+          x1 = cpx, y1 = cpy;
+          cpx = p[off++];
+          cpy = p[off++];
+          cmd = CMD.A;
+          processArc(x1, y1, cpx, cpy, fa, fs, rx, ry, psi, cmd, path);
+          break;
+
+        case 'a':
+          rx = p[off++];
+          ry = p[off++];
+          psi = p[off++];
+          fa = p[off++];
+          fs = p[off++];
+          x1 = cpx, y1 = cpy;
+          cpx += p[off++];
+          cpy += p[off++];
+          cmd = CMD.A;
+          processArc(x1, y1, cpx, cpy, fa, fs, rx, ry, psi, cmd, path);
+          break;
+      }
+    }
+
+    if (cmdStr === 'z' || cmdStr === 'Z') {
+      cmd = CMD.Z;
+      path.addData(cmd); // z may be in the middle of the path.
+
+      cpx = subpathX;
+      cpy = subpathY;
+    }
+
+    prevCmd = cmd;
+  }
+
+  path.toStatic();
+  return path;
+} // TODO Optimize double memory cost problem
+
+
+function createPathOptions(str, opts) {
+  var pathProxy = createPathProxyFromString(str);
+  opts = opts || {};
+
+  opts.buildPath = function (path) {
+    if (path.setData) {
+      path.setData(pathProxy.data); // Svg and vml renderer don't have context
+
+      var ctx = path.getContext();
+
+      if (ctx) {
+        path.rebuildPath(ctx);
+      }
+    } else {
+      var ctx = path;
+      pathProxy.rebuildPath(ctx);
+    }
+  };
+
+  opts.applyTransform = function (m) {
+    transformPath(pathProxy, m);
+    this.dirty(true);
+  };
+
+  return opts;
+}
+/**
+ * Create a Path object from path string data
+ * http://www.w3.org/TR/SVG/paths.html#PathData
+ * @param  {Object} opts Other options
+ */
+
+
+function createFromString(str, opts) {
+  return new Path(createPathOptions(str, opts));
+}
+/**
+ * Create a Path class from path string data
+ * @param  {string} str
+ * @param  {Object} opts Other options
+ */
+
+function extendFromString(str, opts) {
+  return Path.extend(createPathOptions(str, opts));
+}
+/**
+ * Merge multiple paths
+ */
+// TODO Apply transform
+// TODO stroke dash
+// TODO Optimize double memory cost problem
+
+function mergePath$1(pathEls, opts) {
+  var pathList = [];
+  var len = pathEls.length;
+
+  for (var i = 0; i < len; i++) {
+    var pathEl = pathEls[i];
+
+    if (!pathEl.path) {
+      pathEl.createPathProxy();
+    }
+
+    if (pathEl.__dirtyPath) {
+      pathEl.buildPath(pathEl.path, pathEl.shape, true);
+    }
+
+    pathList.push(pathEl.path);
+  }
+
+  var pathBundle = new Path(opts); // Need path proxy.
+
+  pathBundle.createPathProxy();
+
+  pathBundle.buildPath = function (path) {
+    path.appendPath(pathList); // Svg and vml renderer don't have context
+
+    var ctx = path.getContext();
+
+    if (ctx) {
+      path.rebuildPath(ctx);
+    }
+  };
+
+  return pathBundle;
+}
+
+/**
+ * @alias zrender/graphic/Text
+ * @extends module:zrender/graphic/Displayable
+ * @constructor
+ * @param {Object} opts
+ */
+
+var Text = function (opts) {
+  // jshint ignore:line
+  Displayable.call(this, opts);
+};
+
+Text.prototype = {
+  constructor: Text,
+  type: 'text',
+  brush: function (ctx, prevEl) {
+    var style = this.style; // Optimize, avoid normalize every time.
+
+    this.__dirty && normalizeTextStyle(style, true); // Use props with prefix 'text'.
+
+    style.fill = style.stroke = style.shadowBlur = style.shadowColor = style.shadowOffsetX = style.shadowOffsetY = null;
+    var text = style.text; // Convert to string
+
+    text != null && (text += ''); // Do not apply style.bind in Text node. Because the real bind job
+    // is in textHelper.renderText, and performance of text render should
+    // be considered.
+    // style.bind(ctx, this, prevEl);
+
+    if (!needDrawText(text, style)) {
+      return;
+    }
+
+    this.setTransform(ctx);
+    renderText(this, ctx, text, style, null, prevEl);
+    this.restoreTransform(ctx);
+  },
+  getBoundingRect: function () {
+    var style = this.style; // Optimize, avoid normalize every time.
+
+    this.__dirty && normalizeTextStyle(style, true);
+
+    if (!this._rect) {
+      var text = style.text;
+      text != null ? text += '' : text = '';
+      var rect = getBoundingRect(style.text + '', style.font, style.textAlign, style.textVerticalAlign, style.textPadding, style.rich);
+      rect.x += style.x || 0;
+      rect.y += style.y || 0;
+
+      if (getStroke(style.textStroke, style.textStrokeWidth)) {
+        var w = style.textStrokeWidth;
+        rect.x -= w / 2;
+        rect.y -= w / 2;
+        rect.width += w;
+        rect.height += w;
+      }
+
+      this._rect = rect;
+    }
+
+    return this._rect;
+  }
+};
+inherits(Text, Displayable);
+
+/**
+ * 鍦嗗舰
+ * @module zrender/shape/Circle
+ */
+var Circle = Path.extend({
+  type: 'circle',
+  shape: {
+    cx: 0,
+    cy: 0,
+    r: 0
+  },
+  buildPath: function (ctx, shape, inBundle) {
+    // Better stroking in ShapeBundle
+    // Always do it may have performence issue ( fill may be 2x more cost)
+    if (inBundle) {
+      ctx.moveTo(shape.cx + shape.r, shape.cy);
+    } // else {
+    //     if (ctx.allocate && !ctx.data.length) {
+    //         ctx.allocate(ctx.CMD_MEM_SIZE.A);
+    //     }
+    // }
+    // Better stroking in ShapeBundle
+    // ctx.moveTo(shape.cx + shape.r, shape.cy);
+
+
+    ctx.arc(shape.cx, shape.cy, shape.r, 0, Math.PI * 2, true);
+  }
+});
+
+// where exception "unexpected call to method or property access"
+// might be thrown when calling ctx.fill or ctx.stroke after a path
+// whose area size is zero is drawn and ctx.clip() is called and
+// shadowBlur is set. See #4572, #3112, #5777.
+// (e.g.,
+//  ctx.moveTo(10, 10);
+//  ctx.lineTo(20, 10);
+//  ctx.closePath();
+//  ctx.clip();
+//  ctx.shadowBlur = 10;
+//  ...
+//  ctx.fill();
+// )
+
+var shadowTemp = [['shadowBlur', 0], ['shadowColor', '#000'], ['shadowOffsetX', 0], ['shadowOffsetY', 0]];
+var fixClipWithShadow = function (orignalBrush) {
+  // version string can be: '11.0'
+  return env$1.browser.ie && env$1.browser.version >= 11 ? function () {
+    var clipPaths = this.__clipPaths;
+    var style = this.style;
+    var modified;
+
+    if (clipPaths) {
+      for (var i = 0; i < clipPaths.length; i++) {
+        var clipPath = clipPaths[i];
+        var shape = clipPath && clipPath.shape;
+        var type = clipPath && clipPath.type;
+
+        if (shape && (type === 'sector' && shape.startAngle === shape.endAngle || type === 'rect' && (!shape.width || !shape.height))) {
+          for (var j = 0; j < shadowTemp.length; j++) {
+            // It is save to put shadowTemp static, because shadowTemp
+            // will be all modified each item brush called.
+            shadowTemp[j][2] = style[shadowTemp[j][0]];
+            style[shadowTemp[j][0]] = shadowTemp[j][1];
+          }
+
+          modified = true;
+          break;
+        }
+      }
+    }
+
+    orignalBrush.apply(this, arguments);
+
+    if (modified) {
+      for (var j = 0; j < shadowTemp.length; j++) {
+        style[shadowTemp[j][0]] = shadowTemp[j][2];
+      }
+    }
+  } : orignalBrush;
+};
+
+/**
+ * 鎵囧舰
+ * @module zrender/graphic/shape/Sector
+ */
+var Sector = Path.extend({
+  type: 'sector',
+  shape: {
+    cx: 0,
+    cy: 0,
+    r0: 0,
+    r: 0,
+    startAngle: 0,
+    endAngle: Math.PI * 2,
+    clockwise: true
+  },
+  brush: fixClipWithShadow(Path.prototype.brush),
+  buildPath: function (ctx, shape) {
+    var x = shape.cx;
+    var y = shape.cy;
+    var r0 = Math.max(shape.r0 || 0, 0);
+    var r = Math.max(shape.r, 0);
+    var startAngle = shape.startAngle;
+    var endAngle = shape.endAngle;
+    var clockwise = shape.clockwise;
+    var unitX = Math.cos(startAngle);
+    var unitY = Math.sin(startAngle);
+    ctx.moveTo(unitX * r0 + x, unitY * r0 + y);
+    ctx.lineTo(unitX * r + x, unitY * r + y);
+    ctx.arc(x, y, r, startAngle, endAngle, !clockwise);
+    ctx.lineTo(Math.cos(endAngle) * r0 + x, Math.sin(endAngle) * r0 + y);
+
+    if (r0 !== 0) {
+      ctx.arc(x, y, r0, endAngle, startAngle, clockwise);
+    }
+
+    ctx.closePath();
+  }
+});
+
+/**
+ * 鍦嗙幆
+ * @module zrender/graphic/shape/Ring
+ */
+var Ring = Path.extend({
+  type: 'ring',
+  shape: {
+    cx: 0,
+    cy: 0,
+    r: 0,
+    r0: 0
+  },
+  buildPath: function (ctx, shape) {
+    var x = shape.cx;
+    var y = shape.cy;
+    var PI2 = Math.PI * 2;
+    ctx.moveTo(x + shape.r, y);
+    ctx.arc(x, y, shape.r, 0, PI2, false);
+    ctx.moveTo(x + shape.r0, y);
+    ctx.arc(x, y, shape.r0, 0, PI2, true);
+  }
+});
+
+/**
+ * Catmull-Rom spline 鎻掑�兼姌绾�
+ * @module zrender/shape/util/smoothSpline
+ * @author pissang (https://www.github.com/pissang)
+ *         Kener (@Kener-鏋楀嘲, kener.linfeng@gmail.com)
+ *         errorrik (errorrik@gmail.com)
+ */
+/**
+ * @inner
+ */
+
+function interpolate(p0, p1, p2, p3, t, t2, t3) {
+  var v0 = (p2 - p0) * 0.5;
+  var v1 = (p3 - p1) * 0.5;
+  return (2 * (p1 - p2) + v0 + v1) * t3 + (-3 * (p1 - p2) - 2 * v0 - v1) * t2 + v0 * t + p1;
+}
+/**
+ * @alias module:zrender/shape/util/smoothSpline
+ * @param {Array} points 绾挎椤剁偣鏁扮粍
+ * @param {boolean} isLoop
+ * @return {Array}
+ */
+
+
+var smoothSpline = function (points, isLoop) {
+  var len$$1 = points.length;
+  var ret = [];
+  var distance$$1 = 0;
+
+  for (var i = 1; i < len$$1; i++) {
+    distance$$1 += distance(points[i - 1], points[i]);
+  }
+
+  var segs = distance$$1 / 2;
+  segs = segs < len$$1 ? len$$1 : segs;
+
+  for (var i = 0; i < segs; i++) {
+    var pos = i / (segs - 1) * (isLoop ? len$$1 : len$$1 - 1);
+    var idx = Math.floor(pos);
+    var w = pos - idx;
+    var p0;
+    var p1 = points[idx % len$$1];
+    var p2;
+    var p3;
+
+    if (!isLoop) {
+      p0 = points[idx === 0 ? idx : idx - 1];
+      p2 = points[idx > len$$1 - 2 ? len$$1 - 1 : idx + 1];
+      p3 = points[idx > len$$1 - 3 ? len$$1 - 1 : idx + 2];
+    } else {
+      p0 = points[(idx - 1 + len$$1) % len$$1];
+      p2 = points[(idx + 1) % len$$1];
+      p3 = points[(idx + 2) % len$$1];
+    }
+
+    var w2 = w * w;
+    var w3 = w * w2;
+    ret.push([interpolate(p0[0], p1[0], p2[0], p3[0], w, w2, w3), interpolate(p0[1], p1[1], p2[1], p3[1], w, w2, w3)]);
+  }
+
+  return ret;
+};
+
+/**
+ * 璐濆灏斿钩婊戞洸绾�
+ * @module zrender/shape/util/smoothBezier
+ * @author pissang (https://www.github.com/pissang)
+ *         Kener (@Kener-鏋楀嘲, kener.linfeng@gmail.com)
+ *         errorrik (errorrik@gmail.com)
+ */
+/**
+ * 璐濆灏斿钩婊戞洸绾�
+ * @alias module:zrender/shape/util/smoothBezier
+ * @param {Array} points 绾挎椤剁偣鏁扮粍
+ * @param {number} smooth 骞虫粦绛夌骇, 0-1
+ * @param {boolean} isLoop
+ * @param {Array} constraint 灏嗚绠楀嚭鏉ョ殑鎺у埗鐐圭害鏉熷湪涓�涓寘鍥寸洅鍐�
+ *                           姣斿 [[0, 0], [100, 100]], 杩欎釜鍖呭洿鐩掍細涓�
+ *                           鏁翠釜鎶樼嚎鐨勫寘鍥寸洅鍋氫竴涓苟闆嗙敤鏉ョ害鏉熸帶鍒剁偣銆�
+ * @param {Array} 璁$畻鍑烘潵鐨勬帶鍒剁偣鏁扮粍
+ */
+
+var smoothBezier = function (points, smooth, isLoop, constraint) {
+  var cps = [];
+  var v = [];
+  var v1 = [];
+  var v2 = [];
+  var prevPoint;
+  var nextPoint;
+  var min$$1, max$$1;
+
+  if (constraint) {
+    min$$1 = [Infinity, Infinity];
+    max$$1 = [-Infinity, -Infinity];
+
+    for (var i = 0, len$$1 = points.length; i < len$$1; i++) {
+      min(min$$1, min$$1, points[i]);
+      max(max$$1, max$$1, points[i]);
+    } // 涓庢寚瀹氱殑鍖呭洿鐩掑仛骞堕泦
+
+
+    min(min$$1, min$$1, constraint[0]);
+    max(max$$1, max$$1, constraint[1]);
+  }
+
+  for (var i = 0, len$$1 = points.length; i < len$$1; i++) {
+    var point = points[i];
+
+    if (isLoop) {
+      prevPoint = points[i ? i - 1 : len$$1 - 1];
+      nextPoint = points[(i + 1) % len$$1];
+    } else {
+      if (i === 0 || i === len$$1 - 1) {
+        cps.push(clone$1(points[i]));
+        continue;
+      } else {
+        prevPoint = points[i - 1];
+        nextPoint = points[i + 1];
+      }
+    }
+
+    sub(v, nextPoint, prevPoint); // use degree to scale the handle length
+
+    scale(v, v, smooth);
+    var d0 = distance(point, prevPoint);
+    var d1 = distance(point, nextPoint);
+    var sum = d0 + d1;
+
+    if (sum !== 0) {
+      d0 /= sum;
+      d1 /= sum;
+    }
+
+    scale(v1, v, -d0);
+    scale(v2, v, d1);
+    var cp0 = add([], point, v1);
+    var cp1 = add([], point, v2);
+
+    if (constraint) {
+      max(cp0, cp0, min$$1);
+      min(cp0, cp0, max$$1);
+      max(cp1, cp1, min$$1);
+      min(cp1, cp1, max$$1);
+    }
+
+    cps.push(cp0);
+    cps.push(cp1);
+  }
+
+  if (isLoop) {
+    cps.push(cps.shift());
+  }
+
+  return cps;
+};
+
+function buildPath$1(ctx, shape, closePath) {
+  var points = shape.points;
+  var smooth = shape.smooth;
+
+  if (points && points.length >= 2) {
+    if (smooth && smooth !== 'spline') {
+      var controlPoints = smoothBezier(points, smooth, closePath, shape.smoothConstraint);
+      ctx.moveTo(points[0][0], points[0][1]);
+      var len = points.length;
+
+      for (var i = 0; i < (closePath ? len : len - 1); i++) {
+        var cp1 = controlPoints[i * 2];
+        var cp2 = controlPoints[i * 2 + 1];
+        var p = points[(i + 1) % len];
+        ctx.bezierCurveTo(cp1[0], cp1[1], cp2[0], cp2[1], p[0], p[1]);
+      }
+    } else {
+      if (smooth === 'spline') {
+        points = smoothSpline(points, closePath);
+      }
+
+      ctx.moveTo(points[0][0], points[0][1]);
+
+      for (var i = 1, l = points.length; i < l; i++) {
+        ctx.lineTo(points[i][0], points[i][1]);
+      }
+    }
+
+    closePath && ctx.closePath();
+  }
+}
+
+/**
+ * 澶氳竟褰�
+ * @module zrender/shape/Polygon
+ */
+var Polygon = Path.extend({
+  type: 'polygon',
+  shape: {
+    points: null,
+    smooth: false,
+    smoothConstraint: null
+  },
+  buildPath: function (ctx, shape) {
+    buildPath$1(ctx, shape, true);
+  }
+});
+
+/**
+ * @module zrender/graphic/shape/Polyline
+ */
+var Polyline = Path.extend({
+  type: 'polyline',
+  shape: {
+    points: null,
+    smooth: false,
+    smoothConstraint: null
+  },
+  style: {
+    stroke: '#000',
+    fill: null
+  },
+  buildPath: function (ctx, shape) {
+    buildPath$1(ctx, shape, false);
+  }
+});
+
+/**
+ * 鐭╁舰
+ * @module zrender/graphic/shape/Rect
+ */
+var Rect = Path.extend({
+  type: 'rect',
+  shape: {
+    // 宸︿笂銆佸彸涓娿�佸彸涓嬨�佸乏涓嬭鐨勫崐寰勪緷娆′负r1銆乺2銆乺3銆乺4
+    // r缂╁啓涓�1         鐩稿綋浜� [1, 1, 1, 1]
+    // r缂╁啓涓篬1]       鐩稿綋浜� [1, 1, 1, 1]
+    // r缂╁啓涓篬1, 2]    鐩稿綋浜� [1, 2, 1, 2]
+    // r缂╁啓涓篬1, 2, 3] 鐩稿綋浜� [1, 2, 3, 2]
+    r: 0,
+    x: 0,
+    y: 0,
+    width: 0,
+    height: 0
+  },
+  buildPath: function (ctx, shape) {
+    var x = shape.x;
+    var y = shape.y;
+    var width = shape.width;
+    var height = shape.height;
+
+    if (!shape.r) {
+      ctx.rect(x, y, width, height);
+    } else {
+      buildPath(ctx, shape);
+    }
+
+    ctx.closePath();
+    return;
+  }
+});
+
+/**
+ * 鐩寸嚎
+ * @module zrender/graphic/shape/Line
+ */
+var Line = Path.extend({
+  type: 'line',
+  shape: {
+    // Start point
+    x1: 0,
+    y1: 0,
+    // End point
+    x2: 0,
+    y2: 0,
+    percent: 1
+  },
+  style: {
+    stroke: '#000',
+    fill: null
+  },
+  buildPath: function (ctx, shape) {
+    var x1 = shape.x1;
+    var y1 = shape.y1;
+    var x2 = shape.x2;
+    var y2 = shape.y2;
+    var percent = shape.percent;
+
+    if (percent === 0) {
+      return;
+    }
+
+    ctx.moveTo(x1, y1);
+
+    if (percent < 1) {
+      x2 = x1 * (1 - percent) + x2 * percent;
+      y2 = y1 * (1 - percent) + y2 * percent;
+    }
+
+    ctx.lineTo(x2, y2);
+  },
+
+  /**
+   * Get point at percent
+   * @param  {number} percent
+   * @return {Array.<number>}
+   */
+  pointAt: function (p) {
+    var shape = this.shape;
+    return [shape.x1 * (1 - p) + shape.x2 * p, shape.y1 * (1 - p) + shape.y2 * p];
+  }
+});
+
+/**
+ * 璐濆灏旀洸绾�
+ * @module zrender/shape/BezierCurve
+ */
+var out = [];
+
+function someVectorAt(shape, t, isTangent) {
+  var cpx2 = shape.cpx2;
+  var cpy2 = shape.cpy2;
+
+  if (cpx2 === null || cpy2 === null) {
+    return [(isTangent ? cubicDerivativeAt : cubicAt)(shape.x1, shape.cpx1, shape.cpx2, shape.x2, t), (isTangent ? cubicDerivativeAt : cubicAt)(shape.y1, shape.cpy1, shape.cpy2, shape.y2, t)];
+  } else {
+    return [(isTangent ? quadraticDerivativeAt : quadraticAt)(shape.x1, shape.cpx1, shape.x2, t), (isTangent ? quadraticDerivativeAt : quadraticAt)(shape.y1, shape.cpy1, shape.y2, t)];
+  }
+}
+
+var BezierCurve = Path.extend({
+  type: 'bezier-curve',
+  shape: {
+    x1: 0,
+    y1: 0,
+    x2: 0,
+    y2: 0,
+    cpx1: 0,
+    cpy1: 0,
+    // cpx2: 0,
+    // cpy2: 0
+    // Curve show percent, for animating
+    percent: 1
+  },
+  style: {
+    stroke: '#000',
+    fill: null
+  },
+  buildPath: function (ctx, shape) {
+    var x1 = shape.x1;
+    var y1 = shape.y1;
+    var x2 = shape.x2;
+    var y2 = shape.y2;
+    var cpx1 = shape.cpx1;
+    var cpy1 = shape.cpy1;
+    var cpx2 = shape.cpx2;
+    var cpy2 = shape.cpy2;
+    var percent = shape.percent;
+
+    if (percent === 0) {
+      return;
+    }
+
+    ctx.moveTo(x1, y1);
+
+    if (cpx2 == null || cpy2 == null) {
+      if (percent < 1) {
+        quadraticSubdivide(x1, cpx1, x2, percent, out);
+        cpx1 = out[1];
+        x2 = out[2];
+        quadraticSubdivide(y1, cpy1, y2, percent, out);
+        cpy1 = out[1];
+        y2 = out[2];
+      }
+
+      ctx.quadraticCurveTo(cpx1, cpy1, x2, y2);
+    } else {
+      if (percent < 1) {
+        cubicSubdivide(x1, cpx1, cpx2, x2, percent, out);
+        cpx1 = out[1];
+        cpx2 = out[2];
+        x2 = out[3];
+        cubicSubdivide(y1, cpy1, cpy2, y2, percent, out);
+        cpy1 = out[1];
+        cpy2 = out[2];
+        y2 = out[3];
+      }
+
+      ctx.bezierCurveTo(cpx1, cpy1, cpx2, cpy2, x2, y2);
+    }
+  },
+
+  /**
+   * Get point at percent
+   * @param  {number} t
+   * @return {Array.<number>}
+   */
+  pointAt: function (t) {
+    return someVectorAt(this.shape, t, false);
+  },
+
+  /**
+   * Get tangent at percent
+   * @param  {number} t
+   * @return {Array.<number>}
+   */
+  tangentAt: function (t) {
+    var p = someVectorAt(this.shape, t, true);
+    return normalize(p, p);
+  }
+});
+
+/**
+ * 鍦嗗姬
+ * @module zrender/graphic/shape/Arc
+ */
+var Arc = Path.extend({
+  type: 'arc',
+  shape: {
+    cx: 0,
+    cy: 0,
+    r: 0,
+    startAngle: 0,
+    endAngle: Math.PI * 2,
+    clockwise: true
+  },
+  style: {
+    stroke: '#000',
+    fill: null
+  },
+  buildPath: function (ctx, shape) {
+    var x = shape.cx;
+    var y = shape.cy;
+    var r = Math.max(shape.r, 0);
+    var startAngle = shape.startAngle;
+    var endAngle = shape.endAngle;
+    var clockwise = shape.clockwise;
+    var unitX = Math.cos(startAngle);
+    var unitY = Math.sin(startAngle);
+    ctx.moveTo(unitX * r + x, unitY * r + y);
+    ctx.arc(x, y, r, startAngle, endAngle, !clockwise);
+  }
+});
+
+// CompoundPath to improve performance
+var CompoundPath = Path.extend({
+  type: 'compound',
+  shape: {
+    paths: null
+  },
+  _updatePathDirty: function () {
+    var dirtyPath = this.__dirtyPath;
+    var paths = this.shape.paths;
+
+    for (var i = 0; i < paths.length; i++) {
+      // Mark as dirty if any subpath is dirty
+      dirtyPath = dirtyPath || paths[i].__dirtyPath;
+    }
+
+    this.__dirtyPath = dirtyPath;
+    this.__dirty = this.__dirty || dirtyPath;
+  },
+  beforeBrush: function () {
+    this._updatePathDirty();
+
+    var paths = this.shape.paths || [];
+    var scale = this.getGlobalScale(); // Update path scale
+
+    for (var i = 0; i < paths.length; i++) {
+      if (!paths[i].path) {
+        paths[i].createPathProxy();
+      }
+
+      paths[i].path.setScale(scale[0], scale[1]);
+    }
+  },
+  buildPath: function (ctx, shape) {
+    var paths = shape.paths || [];
+
+    for (var i = 0; i < paths.length; i++) {
+      paths[i].buildPath(ctx, paths[i].shape, true);
+    }
+  },
+  afterBrush: function () {
+    var paths = this.shape.paths || [];
+
+    for (var i = 0; i < paths.length; i++) {
+      paths[i].__dirtyPath = false;
+    }
+  },
+  getBoundingRect: function () {
+    this._updatePathDirty();
+
+    return Path.prototype.getBoundingRect.call(this);
+  }
+});
+
+/**
+ * @param {Array.<Object>} colorStops
+ */
+var Gradient = function (colorStops) {
+  this.colorStops = colorStops || [];
+};
+
+Gradient.prototype = {
+  constructor: Gradient,
+  addColorStop: function (offset, color) {
+    this.colorStops.push({
+      offset: offset,
+      color: color
+    });
+  }
+};
+
+/**
+ * x, y, x2, y2 are all percent from 0 to 1
+ * @param {number} [x=0]
+ * @param {number} [y=0]
+ * @param {number} [x2=1]
+ * @param {number} [y2=0]
+ * @param {Array.<Object>} colorStops
+ * @param {boolean} [globalCoord=false]
+ */
+
+var LinearGradient = function (x, y, x2, y2, colorStops, globalCoord) {
+  // Should do nothing more in this constructor. Because gradient can be
+  // declard by `color: {type: 'linear', colorStops: ...}`, where
+  // this constructor will not be called.
+  this.x = x == null ? 0 : x;
+  this.y = y == null ? 0 : y;
+  this.x2 = x2 == null ? 1 : x2;
+  this.y2 = y2 == null ? 0 : y2; // Can be cloned
+
+  this.type = 'linear'; // If use global coord
+
+  this.global = globalCoord || false;
+  Gradient.call(this, colorStops);
+};
+
+LinearGradient.prototype = {
+  constructor: LinearGradient
+};
+inherits(LinearGradient, Gradient);
+
+/**
+ * x, y, r are all percent from 0 to 1
+ * @param {number} [x=0.5]
+ * @param {number} [y=0.5]
+ * @param {number} [r=0.5]
+ * @param {Array.<Object>} [colorStops]
+ * @param {boolean} [globalCoord=false]
+ */
+
+var RadialGradient = function (x, y, r, colorStops, globalCoord) {
+  // Should do nothing more in this constructor. Because gradient can be
+  // declard by `color: {type: 'radial', colorStops: ...}`, where
+  // this constructor will not be called.
+  this.x = x == null ? 0.5 : x;
+  this.y = y == null ? 0.5 : y;
+  this.r = r == null ? 0.5 : r; // Can be cloned
+
+  this.type = 'radial'; // If use global coord
+
+  this.global = globalCoord || false;
+  Gradient.call(this, colorStops);
+};
+
+RadialGradient.prototype = {
+  constructor: RadialGradient
+};
+inherits(RadialGradient, Gradient);
+
+/**
+ * Displayable for incremental rendering. It will be rendered in a separate layer
+ * IncrementalDisplay have too main methods. `clearDisplayables` and `addDisplayables`
+ * addDisplayables will render the added displayables incremetally.
+ *
+ * It use a not clearFlag to tell the painter don't clear the layer if it's the first element.
+ */
+function IncrementalDisplayble(opts) {
+  Displayable.call(this, opts);
+  this._displayables = [];
+  this._temporaryDisplayables = [];
+  this._cursor = 0;
+  this.notClear = true;
+}
+
+IncrementalDisplayble.prototype.incremental = true;
+
+IncrementalDisplayble.prototype.clearDisplaybles = function () {
+  this._displayables = [];
+  this._temporaryDisplayables = [];
+  this._cursor = 0;
+  this.dirty();
+  this.notClear = false;
+};
+
+IncrementalDisplayble.prototype.addDisplayable = function (displayable, notPersistent) {
+  if (notPersistent) {
+    this._temporaryDisplayables.push(displayable);
+  } else {
+    this._displayables.push(displayable);
+  }
+
+  this.dirty();
+};
+
+IncrementalDisplayble.prototype.addDisplayables = function (displayables, notPersistent) {
+  notPersistent = notPersistent || false;
+
+  for (var i = 0; i < displayables.length; i++) {
+    this.addDisplayable(displayables[i], notPersistent);
+  }
+};
+
+IncrementalDisplayble.prototype.eachPendingDisplayable = function (cb) {
+  for (var i = this._cursor; i < this._displayables.length; i++) {
+    cb && cb(this._displayables[i]);
+  }
+
+  for (var i = 0; i < this._temporaryDisplayables.length; i++) {
+    cb && cb(this._temporaryDisplayables[i]);
+  }
+};
+
+IncrementalDisplayble.prototype.update = function () {
+  this.updateTransform();
+
+  for (var i = this._cursor; i < this._displayables.length; i++) {
+    var displayable = this._displayables[i]; // PENDING
+
+    displayable.parent = this;
+    displayable.update();
+    displayable.parent = null;
+  }
+
+  for (var i = 0; i < this._temporaryDisplayables.length; i++) {
+    var displayable = this._temporaryDisplayables[i]; // PENDING
+
+    displayable.parent = this;
+    displayable.update();
+    displayable.parent = null;
+  }
+};
+
+IncrementalDisplayble.prototype.brush = function (ctx, prevEl) {
+  // Render persistant displayables.
+  for (var i = this._cursor; i < this._displayables.length; i++) {
+    var displayable = this._displayables[i];
+    displayable.beforeBrush && displayable.beforeBrush(ctx);
+    displayable.brush(ctx, i === this._cursor ? null : this._displayables[i - 1]);
+    displayable.afterBrush && displayable.afterBrush(ctx);
+  }
+
+  this._cursor = i; // Render temporary displayables.
+
+  for (var i = 0; i < this._temporaryDisplayables.length; i++) {
+    var displayable = this._temporaryDisplayables[i];
+    displayable.beforeBrush && displayable.beforeBrush(ctx);
+    displayable.brush(ctx, i === 0 ? null : this._temporaryDisplayables[i - 1]);
+    displayable.afterBrush && displayable.afterBrush(ctx);
+  }
+
+  this._temporaryDisplayables = [];
+  this.notClear = true;
+};
+
+var m = [];
+
+IncrementalDisplayble.prototype.getBoundingRect = function () {
+  if (!this._rect) {
+    var rect = new BoundingRect(Infinity, Infinity, -Infinity, -Infinity);
+
+    for (var i = 0; i < this._displayables.length; i++) {
+      var displayable = this._displayables[i];
+      var childRect = displayable.getBoundingRect().clone();
+
+      if (displayable.needLocalTransform()) {
+        childRect.applyTransform(displayable.getLocalTransform(m));
+      }
+
+      rect.union(childRect);
+    }
+
+    this._rect = rect;
+  }
+
+  return this._rect;
+};
+
+IncrementalDisplayble.prototype.contain = function (x, y) {
+  var localPos = this.transformCoordToLocal(x, y);
+  var rect = this.getBoundingRect();
+
+  if (rect.contain(localPos[0], localPos[1])) {
+    for (var i = 0; i < this._displayables.length; i++) {
+      var displayable = this._displayables[i];
+
+      if (displayable.contain(x, y)) {
+        return true;
+      }
+    }
+  }
+
+  return false;
+};
+
+inherits(IncrementalDisplayble, Displayable);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var round = Math.round;
+var mathMax$1 = Math.max;
+var mathMin$1 = Math.min;
+var EMPTY_OBJ = {};
+/**
+ * Extend shape with parameters
+ */
+
+function extendShape(opts) {
+  return Path.extend(opts);
+}
+/**
+ * Extend path
+ */
+
+function extendPath(pathData, opts) {
+  return extendFromString(pathData, opts);
+}
+/**
+ * Create a path element from path data string
+ * @param {string} pathData
+ * @param {Object} opts
+ * @param {module:zrender/core/BoundingRect} rect
+ * @param {string} [layout=cover] 'center' or 'cover'
+ */
+
+function makePath(pathData, opts, rect, layout) {
+  var path = createFromString(pathData, opts);
+
+  if (rect) {
+    if (layout === 'center') {
+      rect = centerGraphic(rect, path.getBoundingRect());
+    }
+
+    resizePath(path, rect);
+  }
+
+  return path;
+}
+/**
+ * Create a image element from image url
+ * @param {string} imageUrl image url
+ * @param {Object} opts options
+ * @param {module:zrender/core/BoundingRect} rect constrain rect
+ * @param {string} [layout=cover] 'center' or 'cover'
+ */
+
+function makeImage(imageUrl, rect, layout) {
+  var path = new ZImage({
+    style: {
+      image: imageUrl,
+      x: rect.x,
+      y: rect.y,
+      width: rect.width,
+      height: rect.height
+    },
+    onload: function (img) {
+      if (layout === 'center') {
+        var boundingRect = {
+          width: img.width,
+          height: img.height
+        };
+        path.setStyle(centerGraphic(rect, boundingRect));
+      }
+    }
+  });
+  return path;
+}
+/**
+ * Get position of centered element in bounding box.
+ *
+ * @param  {Object} rect         element local bounding box
+ * @param  {Object} boundingRect constraint bounding box
+ * @return {Object} element position containing x, y, width, and height
+ */
+
+function centerGraphic(rect, boundingRect) {
+  // Set rect to center, keep width / height ratio.
+  var aspect = boundingRect.width / boundingRect.height;
+  var width = rect.height * aspect;
+  var height;
+
+  if (width <= rect.width) {
+    height = rect.height;
+  } else {
+    width = rect.width;
+    height = width / aspect;
+  }
+
+  var cx = rect.x + rect.width / 2;
+  var cy = rect.y + rect.height / 2;
+  return {
+    x: cx - width / 2,
+    y: cy - height / 2,
+    width: width,
+    height: height
+  };
+}
+
+var mergePath = mergePath$1;
+/**
+ * Resize a path to fit the rect
+ * @param {module:zrender/graphic/Path} path
+ * @param {Object} rect
+ */
+
+function resizePath(path, rect) {
+  if (!path.applyTransform) {
+    return;
+  }
+
+  var pathRect = path.getBoundingRect();
+  var m = pathRect.calculateTransform(rect);
+  path.applyTransform(m);
+}
+/**
+ * Sub pixel optimize line for canvas
+ *
+ * @param {Object} param
+ * @param {Object} [param.shape]
+ * @param {number} [param.shape.x1]
+ * @param {number} [param.shape.y1]
+ * @param {number} [param.shape.x2]
+ * @param {number} [param.shape.y2]
+ * @param {Object} [param.style]
+ * @param {number} [param.style.lineWidth]
+ * @return {Object} Modified param
+ */
+
+function subPixelOptimizeLine(param) {
+  var shape = param.shape;
+  var lineWidth = param.style.lineWidth;
+
+  if (round(shape.x1 * 2) === round(shape.x2 * 2)) {
+    shape.x1 = shape.x2 = subPixelOptimize(shape.x1, lineWidth, true);
+  }
+
+  if (round(shape.y1 * 2) === round(shape.y2 * 2)) {
+    shape.y1 = shape.y2 = subPixelOptimize(shape.y1, lineWidth, true);
+  }
+
+  return param;
+}
+/**
+ * Sub pixel optimize rect for canvas
+ *
+ * @param {Object} param
+ * @param {Object} [param.shape]
+ * @param {number} [param.shape.x]
+ * @param {number} [param.shape.y]
+ * @param {number} [param.shape.width]
+ * @param {number} [param.shape.height]
+ * @param {Object} [param.style]
+ * @param {number} [param.style.lineWidth]
+ * @return {Object} Modified param
+ */
+
+function subPixelOptimizeRect(param) {
+  var shape = param.shape;
+  var lineWidth = param.style.lineWidth;
+  var originX = shape.x;
+  var originY = shape.y;
+  var originWidth = shape.width;
+  var originHeight = shape.height;
+  shape.x = subPixelOptimize(shape.x, lineWidth, true);
+  shape.y = subPixelOptimize(shape.y, lineWidth, true);
+  shape.width = Math.max(subPixelOptimize(originX + originWidth, lineWidth, false) - shape.x, originWidth === 0 ? 0 : 1);
+  shape.height = Math.max(subPixelOptimize(originY + originHeight, lineWidth, false) - shape.y, originHeight === 0 ? 0 : 1);
+  return param;
+}
+/**
+ * Sub pixel optimize for canvas
+ *
+ * @param {number} position Coordinate, such as x, y
+ * @param {number} lineWidth Should be nonnegative integer.
+ * @param {boolean=} positiveOrNegative Default false (negative).
+ * @return {number} Optimized position.
+ */
+
+function subPixelOptimize(position, lineWidth, positiveOrNegative) {
+  // Assure that (position + lineWidth / 2) is near integer edge,
+  // otherwise line will be fuzzy in canvas.
+  var doubledPosition = round(position * 2);
+  return (doubledPosition + round(lineWidth)) % 2 === 0 ? doubledPosition / 2 : (doubledPosition + (positiveOrNegative ? 1 : -1)) / 2;
+}
+
+function hasFillOrStroke(fillOrStroke) {
+  return fillOrStroke != null && fillOrStroke !== 'none';
+} // Most lifted color are duplicated.
+
+
+var liftedColorMap = createHashMap();
+var liftedColorCount = 0;
+
+function liftColor(color) {
+  if (typeof color !== 'string') {
+    return color;
+  }
+
+  var liftedColor = liftedColorMap.get(color);
+
+  if (!liftedColor) {
+    liftedColor = lift(color, -0.1);
+
+    if (liftedColorCount < 10000) {
+      liftedColorMap.set(color, liftedColor);
+      liftedColorCount++;
+    }
+  }
+
+  return liftedColor;
+}
+
+function cacheElementStl(el) {
+  if (!el.__hoverStlDirty) {
+    return;
+  }
+
+  el.__hoverStlDirty = false;
+  var hoverStyle = el.__hoverStl;
+
+  if (!hoverStyle) {
+    el.__normalStl = null;
+    return;
+  }
+
+  var normalStyle = el.__normalStl = {};
+  var elStyle = el.style;
+
+  for (var name in hoverStyle) {
+    // See comment in `doSingleEnterHover`.
+    if (hoverStyle[name] != null) {
+      normalStyle[name] = elStyle[name];
+    }
+  } // Always cache fill and stroke to normalStyle for lifting color.
+
+
+  normalStyle.fill = elStyle.fill;
+  normalStyle.stroke = elStyle.stroke;
+}
+
+function doSingleEnterHover(el) {
+  var hoverStl = el.__hoverStl;
+
+  if (!hoverStl || el.__highlighted) {
+    return;
+  }
+
+  var useHoverLayer = el.useHoverLayer;
+  el.__highlighted = useHoverLayer ? 'layer' : 'plain';
+  var zr = el.__zr;
+
+  if (!zr && useHoverLayer) {
+    return;
+  }
+
+  var elTarget = el;
+  var targetStyle = el.style;
+
+  if (useHoverLayer) {
+    elTarget = zr.addHover(el);
+    targetStyle = elTarget.style;
+  } // Consider case: only `position: 'top'` is set on emphasis, then text
+  // color should be returned to `autoColor`, rather than remain '#fff'.
+  // So we should rollback then apply again after style merging.
+
+
+  rollbackDefaultTextStyle(targetStyle);
+
+  if (!useHoverLayer) {
+    cacheElementStl(elTarget);
+  } // styles can be:
+  // {
+  //    label: {
+  //        show: false,
+  //        position: 'outside',
+  //        fontSize: 18
+  //    },
+  //    emphasis: {
+  //        label: {
+  //            show: true
+  //        }
+  //    }
+  // },
+  // where properties of `emphasis` may not appear in `normal`. We previously use
+  // module:echarts/util/model#defaultEmphasis to merge `normal` to `emphasis`.
+  // But consider rich text and setOption in merge mode, it is impossible to cover
+  // all properties in merge. So we use merge mode when setting style here, where
+  // only properties that is not `null/undefined` can be set. The disadventage:
+  // null/undefined can not be used to remove style any more in `emphasis`.
+
+
+  targetStyle.extendFrom(hoverStl);
+  setDefaultHoverFillStroke(targetStyle, hoverStl, 'fill');
+  setDefaultHoverFillStroke(targetStyle, hoverStl, 'stroke');
+  applyDefaultTextStyle(targetStyle);
+
+  if (!useHoverLayer) {
+    el.dirty(false);
+    el.z2 += 1;
+  }
+}
+
+function setDefaultHoverFillStroke(targetStyle, hoverStyle, prop) {
+  if (!hasFillOrStroke(hoverStyle[prop]) && hasFillOrStroke(targetStyle[prop])) {
+    targetStyle[prop] = liftColor(targetStyle[prop]);
+  }
+}
+
+function doSingleLeaveHover(el) {
+  if (el.__highlighted) {
+    doSingleRestoreHoverStyle(el);
+    el.__highlighted = false;
+  }
+}
+
+function doSingleRestoreHoverStyle(el) {
+  var highlighted = el.__highlighted;
+
+  if (highlighted === 'layer') {
+    el.__zr && el.__zr.removeHover(el);
+  } else if (highlighted) {
+    var style = el.style;
+    var normalStl = el.__normalStl;
+
+    if (normalStl) {
+      rollbackDefaultTextStyle(style); // Consider null/undefined value, should use
+      // `setStyle` but not `extendFrom(stl, true)`.
+
+      el.setStyle(normalStl);
+      applyDefaultTextStyle(style);
+      el.z2 -= 1;
+    }
+  }
+}
+
+function traverseCall(el, method) {
+  el.isGroup ? el.traverse(function (child) {
+    !child.isGroup && method(child);
+  }) : method(el);
+}
+/**
+ * Set hover style of element.
+ *
+ * @param {module:zrender/Element} el Should not be `zrender/container/Group`.
+ * @param {Object|boolean} [hoverStl] The specified hover style.
+ *        If set as `false`, disable the hover style.
+ *        Similarly, The `el.hoverStyle` can alse be set
+ *        as `false` to disable the hover style.
+ *        Otherwise, use the default hover style if not provided.
+ * @param {Object} [opt]
+ * @param {boolean} [opt.hoverSilentOnTouch=false] See `graphic.setAsHoverStyleTrigger`
+ */
+
+
+function setElementHoverStyle(el, hoverStl) {
+  hoverStl = el.__hoverStl = hoverStl !== false && (hoverStl || {});
+  el.__hoverStlDirty = true;
+
+  if (el.__highlighted) {
+    doSingleLeaveHover(el);
+    doSingleEnterHover(el);
+  }
+}
+/**
+ * Emphasis (called by API) has higher priority than `mouseover`.
+ * When element has been called to be entered emphasis, mouse over
+ * should not trigger the highlight effect (for example, animation
+ * scale) again, and `mouseout` should not downplay the highlight
+ * effect. So the listener of `mouseover` and `mouseout` should
+ * check `isInEmphasis`.
+ *
+ * @param {module:zrender/Element} el
+ * @return {boolean}
+ */
+
+function isInEmphasis(el) {
+  return el && el.__isEmphasisEntered;
+}
+
+function onElementMouseOver(e) {
+  if (this.__hoverSilentOnTouch && e.zrByTouch) {
+    return;
+  } // Only if element is not in emphasis status
+
+
+  !this.__isEmphasisEntered && traverseCall(this, doSingleEnterHover);
+}
+
+function onElementMouseOut(e) {
+  if (this.__hoverSilentOnTouch && e.zrByTouch) {
+    return;
+  } // Only if element is not in emphasis status
+
+
+  !this.__isEmphasisEntered && traverseCall(this, doSingleLeaveHover);
+}
+
+function enterEmphasis() {
+  this.__isEmphasisEntered = true;
+  traverseCall(this, doSingleEnterHover);
+}
+
+function leaveEmphasis() {
+  this.__isEmphasisEntered = false;
+  traverseCall(this, doSingleLeaveHover);
+}
+/**
+ * Set hover style of element.
+ *
+ * [Caveat]:
+ * This method can be called repeatly and achieve the same result.
+ *
+ * [Usage]:
+ * Call the method for a "root" element once. Do not call it for each descendants.
+ * If the descendants elemenets of a group has itself hover style different from the
+ * root group, we can simply mount the style on `el.hoverStyle` for them, but should
+ * not call this method for them.
+ *
+ * @param {module:zrender/Element} el
+ * @param {Object|boolean} [hoverStyle] See `graphic.setElementHoverStyle`.
+ * @param {Object} [opt]
+ * @param {boolean} [opt.hoverSilentOnTouch=false] See `graphic.setAsHoverStyleTrigger`.
+ */
+
+
+function setHoverStyle(el, hoverStyle, opt) {
+  el.isGroup ? el.traverse(function (child) {
+    // If element has sepcified hoverStyle, then use it instead of given hoverStyle
+    // Often used when item group has a label element and it's hoverStyle is different
+    !child.isGroup && setElementHoverStyle(child, child.hoverStyle || hoverStyle);
+  }) : setElementHoverStyle(el, el.hoverStyle || hoverStyle);
+  setAsHoverStyleTrigger(el, opt);
+}
+/**
+ * @param {Object|boolean} [opt] If `false`, means disable trigger.
+ * @param {boolean} [opt.hoverSilentOnTouch=false]
+ *        In touch device, mouseover event will be trigger on touchstart event
+ *        (see module:zrender/dom/HandlerProxy). By this mechanism, we can
+ *        conveniently use hoverStyle when tap on touch screen without additional
+ *        code for compatibility.
+ *        But if the chart/component has select feature, which usually also use
+ *        hoverStyle, there might be conflict between 'select-highlight' and
+ *        'hover-highlight' especially when roam is enabled (see geo for example).
+ *        In this case, hoverSilentOnTouch should be used to disable hover-highlight
+ *        on touch device.
+ */
+
+function setAsHoverStyleTrigger(el, opt) {
+  var disable = opt === false;
+  el.__hoverSilentOnTouch = opt != null && opt.hoverSilentOnTouch; // Simple optimize, since this method might be
+  // called for each elements of a group in some cases.
+
+  if (!disable || el.__hoverStyleTrigger) {
+    var method = disable ? 'off' : 'on'; // Duplicated function will be auto-ignored, see Eventful.js.
+
+    el[method]('mouseover', onElementMouseOver)[method]('mouseout', onElementMouseOut); // Emphasis, normal can be triggered manually
+
+    el[method]('emphasis', enterEmphasis)[method]('normal', leaveEmphasis);
+    el.__hoverStyleTrigger = !disable;
+  }
+}
+/**
+ * @param {Object|module:zrender/graphic/Style} normalStyle
+ * @param {Object} emphasisStyle
+ * @param {module:echarts/model/Model} normalModel
+ * @param {module:echarts/model/Model} emphasisModel
+ * @param {Object} opt Check `opt` of `setTextStyleCommon` to find other props.
+ * @param {string|Function} [opt.defaultText]
+ * @param {module:echarts/model/Model} [opt.labelFetcher] Fetch text by
+ *      `opt.labelFetcher.getFormattedLabel(opt.labelDataIndex, 'normal'/'emphasis', null, opt.labelDimIndex)`
+ * @param {module:echarts/model/Model} [opt.labelDataIndex] Fetch text by
+ *      `opt.textFetcher.getFormattedLabel(opt.labelDataIndex, 'normal'/'emphasis', null, opt.labelDimIndex)`
+ * @param {module:echarts/model/Model} [opt.labelDimIndex] Fetch text by
+ *      `opt.textFetcher.getFormattedLabel(opt.labelDataIndex, 'normal'/'emphasis', null, opt.labelDimIndex)`
+ * @param {Object} [normalSpecified]
+ * @param {Object} [emphasisSpecified]
+ */
+
+function setLabelStyle(normalStyle, emphasisStyle, normalModel, emphasisModel, opt, normalSpecified, emphasisSpecified) {
+  opt = opt || EMPTY_OBJ;
+  var labelFetcher = opt.labelFetcher;
+  var labelDataIndex = opt.labelDataIndex;
+  var labelDimIndex = opt.labelDimIndex; // This scenario, `label.normal.show = true; label.emphasis.show = false`,
+  // is not supported util someone requests.
+
+  var showNormal = normalModel.getShallow('show');
+  var showEmphasis = emphasisModel.getShallow('show'); // Consider performance, only fetch label when necessary.
+  // If `normal.show` is `false` and `emphasis.show` is `true` and `emphasis.formatter` is not set,
+  // label should be displayed, where text is fetched by `normal.formatter` or `opt.defaultText`.
+
+  var baseText;
+
+  if (showNormal || showEmphasis) {
+    if (labelFetcher) {
+      baseText = labelFetcher.getFormattedLabel(labelDataIndex, 'normal', null, labelDimIndex);
+    }
+
+    if (baseText == null) {
+      baseText = isFunction$1(opt.defaultText) ? opt.defaultText(labelDataIndex, opt) : opt.defaultText;
+    }
+  }
+
+  var normalStyleText = showNormal ? baseText : null;
+  var emphasisStyleText = showEmphasis ? retrieve2(labelFetcher ? labelFetcher.getFormattedLabel(labelDataIndex, 'emphasis', null, labelDimIndex) : null, baseText) : null; // Optimize: If style.text is null, text will not be drawn.
+
+  if (normalStyleText != null || emphasisStyleText != null) {
+    // Always set `textStyle` even if `normalStyle.text` is null, because default
+    // values have to be set on `normalStyle`.
+    // If we set default values on `emphasisStyle`, consider case:
+    // Firstly, `setOption(... label: {normal: {text: null}, emphasis: {show: true}} ...);`
+    // Secondly, `setOption(... label: {noraml: {show: true, text: 'abc', color: 'red'} ...);`
+    // Then the 'red' will not work on emphasis.
+    setTextStyle(normalStyle, normalModel, normalSpecified, opt);
+    setTextStyle(emphasisStyle, emphasisModel, emphasisSpecified, opt, true);
+  }
+
+  normalStyle.text = normalStyleText;
+  emphasisStyle.text = emphasisStyleText;
+}
+/**
+ * Set basic textStyle properties.
+ * @param {Object|module:zrender/graphic/Style} textStyle
+ * @param {module:echarts/model/Model} model
+ * @param {Object} [specifiedTextStyle] Can be overrided by settings in model.
+ * @param {Object} [opt] See `opt` of `setTextStyleCommon`.
+ * @param {boolean} [isEmphasis]
+ */
+
+function setTextStyle(textStyle, textStyleModel, specifiedTextStyle, opt, isEmphasis) {
+  setTextStyleCommon(textStyle, textStyleModel, opt, isEmphasis);
+  specifiedTextStyle && extend(textStyle, specifiedTextStyle); // textStyle.host && textStyle.host.dirty && textStyle.host.dirty(false);
+
+  return textStyle;
+}
+/**
+ * Set text option in the style.
+ * @deprecated
+ * @param {Object} textStyle
+ * @param {module:echarts/model/Model} labelModel
+ * @param {string|boolean} defaultColor Default text color.
+ *        If set as false, it will be processed as a emphasis style.
+ */
+
+function setText(textStyle, labelModel, defaultColor) {
+  var opt = {
+    isRectText: true
+  };
+  var isEmphasis;
+
+  if (defaultColor === false) {
+    isEmphasis = true;
+  } else {
+    // Support setting color as 'auto' to get visual color.
+    opt.autoColor = defaultColor;
+  }
+
+  setTextStyleCommon(textStyle, labelModel, opt, isEmphasis); // textStyle.host && textStyle.host.dirty && textStyle.host.dirty(false);
+}
+/**
+ * {
+ *      disableBox: boolean, Whether diable drawing box of block (outer most).
+ *      isRectText: boolean,
+ *      autoColor: string, specify a color when color is 'auto',
+ *              for textFill, textStroke, textBackgroundColor, and textBorderColor.
+ *              If autoColor specified, it is used as default textFill.
+ *      useInsideStyle:
+ *              `true`: Use inside style (textFill, textStroke, textStrokeWidth)
+ *                  if `textFill` is not specified.
+ *              `false`: Do not use inside style.
+ *              `null/undefined`: use inside style if `isRectText` is true and
+ *                  `textFill` is not specified and textPosition contains `'inside'`.
+ *      forceRich: boolean
+ * }
+ */
+
+function setTextStyleCommon(textStyle, textStyleModel, opt, isEmphasis) {
+  // Consider there will be abnormal when merge hover style to normal style if given default value.
+  opt = opt || EMPTY_OBJ;
+
+  if (opt.isRectText) {
+    var textPosition = textStyleModel.getShallow('position') || (isEmphasis ? null : 'inside'); // 'outside' is not a valid zr textPostion value, but used
+    // in bar series, and magric type should be considered.
+
+    textPosition === 'outside' && (textPosition = 'top');
+    textStyle.textPosition = textPosition;
+    textStyle.textOffset = textStyleModel.getShallow('offset');
+    var labelRotate = textStyleModel.getShallow('rotate');
+    labelRotate != null && (labelRotate *= Math.PI / 180);
+    textStyle.textRotation = labelRotate;
+    textStyle.textDistance = retrieve2(textStyleModel.getShallow('distance'), isEmphasis ? null : 5);
+  }
+
+  var ecModel = textStyleModel.ecModel;
+  var globalTextStyle = ecModel && ecModel.option.textStyle; // Consider case:
+  // {
+  //     data: [{
+  //         value: 12,
+  //         label: {
+  //             rich: {
+  //                 // no 'a' here but using parent 'a'.
+  //             }
+  //         }
+  //     }],
+  //     rich: {
+  //         a: { ... }
+  //     }
+  // }
+
+  var richItemNames = getRichItemNames(textStyleModel);
+  var richResult;
+
+  if (richItemNames) {
+    richResult = {};
+
+    for (var name in richItemNames) {
+      if (richItemNames.hasOwnProperty(name)) {
+        // Cascade is supported in rich.
+        var richTextStyle = textStyleModel.getModel(['rich', name]); // In rich, never `disableBox`.
+
+        setTokenTextStyle(richResult[name] = {}, richTextStyle, globalTextStyle, opt, isEmphasis);
+      }
+    }
+  }
+
+  textStyle.rich = richResult;
+  setTokenTextStyle(textStyle, textStyleModel, globalTextStyle, opt, isEmphasis, true);
+
+  if (opt.forceRich && !opt.textStyle) {
+    opt.textStyle = {};
+  }
+
+  return textStyle;
+} // Consider case:
+// {
+//     data: [{
+//         value: 12,
+//         label: {
+//             rich: {
+//                 // no 'a' here but using parent 'a'.
+//             }
+//         }
+//     }],
+//     rich: {
+//         a: { ... }
+//     }
+// }
+
+
+function getRichItemNames(textStyleModel) {
+  // Use object to remove duplicated names.
+  var richItemNameMap;
+
+  while (textStyleModel && textStyleModel !== textStyleModel.ecModel) {
+    var rich = (textStyleModel.option || EMPTY_OBJ).rich;
+
+    if (rich) {
+      richItemNameMap = richItemNameMap || {};
+
+      for (var name in rich) {
+        if (rich.hasOwnProperty(name)) {
+          richItemNameMap[name] = 1;
+        }
+      }
+    }
+
+    textStyleModel = textStyleModel.parentModel;
+  }
+
+  return richItemNameMap;
+}
+
+function setTokenTextStyle(textStyle, textStyleModel, globalTextStyle, opt, isEmphasis, isBlock) {
+  // In merge mode, default value should not be given.
+  globalTextStyle = !isEmphasis && globalTextStyle || EMPTY_OBJ;
+  textStyle.textFill = getAutoColor(textStyleModel.getShallow('color'), opt) || globalTextStyle.color;
+  textStyle.textStroke = getAutoColor(textStyleModel.getShallow('textBorderColor'), opt) || globalTextStyle.textBorderColor;
+  textStyle.textStrokeWidth = retrieve2(textStyleModel.getShallow('textBorderWidth'), globalTextStyle.textBorderWidth); // Save original textPosition, because style.textPosition will be repalced by
+  // real location (like [10, 30]) in zrender.
+
+  textStyle.insideRawTextPosition = textStyle.textPosition;
+
+  if (!isEmphasis) {
+    if (isBlock) {
+      textStyle.insideRollbackOpt = opt;
+      applyDefaultTextStyle(textStyle);
+    } // Set default finally.
+
+
+    if (textStyle.textFill == null) {
+      textStyle.textFill = opt.autoColor;
+    }
+  } // Do not use `getFont` here, because merge should be supported, where
+  // part of these properties may be changed in emphasis style, and the
+  // others should remain their original value got from normal style.
+
+
+  textStyle.fontStyle = textStyleModel.getShallow('fontStyle') || globalTextStyle.fontStyle;
+  textStyle.fontWeight = textStyleModel.getShallow('fontWeight') || globalTextStyle.fontWeight;
+  textStyle.fontSize = textStyleModel.getShallow('fontSize') || globalTextStyle.fontSize;
+  textStyle.fontFamily = textStyleModel.getShallow('fontFamily') || globalTextStyle.fontFamily;
+  textStyle.textAlign = textStyleModel.getShallow('align');
+  textStyle.textVerticalAlign = textStyleModel.getShallow('verticalAlign') || textStyleModel.getShallow('baseline');
+  textStyle.textLineHeight = textStyleModel.getShallow('lineHeight');
+  textStyle.textWidth = textStyleModel.getShallow('width');
+  textStyle.textHeight = textStyleModel.getShallow('height');
+  textStyle.textTag = textStyleModel.getShallow('tag');
+
+  if (!isBlock || !opt.disableBox) {
+    textStyle.textBackgroundColor = getAutoColor(textStyleModel.getShallow('backgroundColor'), opt);
+    textStyle.textPadding = textStyleModel.getShallow('padding');
+    textStyle.textBorderColor = getAutoColor(textStyleModel.getShallow('borderColor'), opt);
+    textStyle.textBorderWidth = textStyleModel.getShallow('borderWidth');
+    textStyle.textBorderRadius = textStyleModel.getShallow('borderRadius');
+    textStyle.textBoxShadowColor = textStyleModel.getShallow('shadowColor');
+    textStyle.textBoxShadowBlur = textStyleModel.getShallow('shadowBlur');
+    textStyle.textBoxShadowOffsetX = textStyleModel.getShallow('shadowOffsetX');
+    textStyle.textBoxShadowOffsetY = textStyleModel.getShallow('shadowOffsetY');
+  }
+
+  textStyle.textShadowColor = textStyleModel.getShallow('textShadowColor') || globalTextStyle.textShadowColor;
+  textStyle.textShadowBlur = textStyleModel.getShallow('textShadowBlur') || globalTextStyle.textShadowBlur;
+  textStyle.textShadowOffsetX = textStyleModel.getShallow('textShadowOffsetX') || globalTextStyle.textShadowOffsetX;
+  textStyle.textShadowOffsetY = textStyleModel.getShallow('textShadowOffsetY') || globalTextStyle.textShadowOffsetY;
+}
+
+function getAutoColor(color, opt) {
+  return color !== 'auto' ? color : opt && opt.autoColor ? opt.autoColor : null;
+} // When text position is `inside` and `textFill` not specified, we
+// provide a mechanism to auto make text border for better view. But
+// text position changing when hovering or being emphasis should be
+// considered, where the `insideRollback` enables to restore the style.
+
+
+function applyDefaultTextStyle(textStyle) {
+  var opt = textStyle.insideRollbackOpt; // Only insideRollbackOpt create (setTextStyleCommon used),
+  // applyDefaultTextStyle works.
+
+  if (!opt || textStyle.textFill != null) {
+    return;
+  }
+
+  var useInsideStyle = opt.useInsideStyle;
+  var textPosition = textStyle.insideRawTextPosition;
+  var insideRollback;
+  var autoColor = opt.autoColor;
+
+  if (useInsideStyle !== false && (useInsideStyle === true || opt.isRectText && textPosition // textPosition can be [10, 30]
+  && typeof textPosition === 'string' && textPosition.indexOf('inside') >= 0)) {
+    insideRollback = {
+      textFill: null,
+      textStroke: textStyle.textStroke,
+      textStrokeWidth: textStyle.textStrokeWidth
+    };
+    textStyle.textFill = '#fff'; // Consider text with #fff overflow its container.
+
+    if (textStyle.textStroke == null) {
+      textStyle.textStroke = autoColor;
+      textStyle.textStrokeWidth == null && (textStyle.textStrokeWidth = 2);
+    }
+  } else if (autoColor != null) {
+    insideRollback = {
+      textFill: null
+    };
+    textStyle.textFill = autoColor;
+  } // Always set `insideRollback`, for clearing previous.
+
+
+  if (insideRollback) {
+    textStyle.insideRollback = insideRollback;
+  }
+}
+
+function rollbackDefaultTextStyle(style) {
+  var insideRollback = style.insideRollback;
+
+  if (insideRollback) {
+    style.textFill = insideRollback.textFill;
+    style.textStroke = insideRollback.textStroke;
+    style.textStrokeWidth = insideRollback.textStrokeWidth;
+    style.insideRollback = null;
+  }
+}
+
+function getFont(opt, ecModel) {
+  // ecModel or default text style model.
+  var gTextStyleModel = ecModel || ecModel.getModel('textStyle');
+  return trim([// FIXME in node-canvas fontWeight is before fontStyle
+  opt.fontStyle || gTextStyleModel && gTextStyleModel.getShallow('fontStyle') || '', opt.fontWeight || gTextStyleModel && gTextStyleModel.getShallow('fontWeight') || '', (opt.fontSize || gTextStyleModel && gTextStyleModel.getShallow('fontSize') || 12) + 'px', opt.fontFamily || gTextStyleModel && gTextStyleModel.getShallow('fontFamily') || 'sans-serif'].join(' '));
+}
+
+function animateOrSetProps(isUpdate, el, props, animatableModel, dataIndex, cb) {
+  if (typeof dataIndex === 'function') {
+    cb = dataIndex;
+    dataIndex = null;
+  } // Do not check 'animation' property directly here. Consider this case:
+  // animation model is an `itemModel`, whose does not have `isAnimationEnabled`
+  // but its parent model (`seriesModel`) does.
+
+
+  var animationEnabled = animatableModel && animatableModel.isAnimationEnabled();
+
+  if (animationEnabled) {
+    var postfix = isUpdate ? 'Update' : '';
+    var duration = animatableModel.getShallow('animationDuration' + postfix);
+    var animationEasing = animatableModel.getShallow('animationEasing' + postfix);
+    var animationDelay = animatableModel.getShallow('animationDelay' + postfix);
+
+    if (typeof animationDelay === 'function') {
+      animationDelay = animationDelay(dataIndex, animatableModel.getAnimationDelayParams ? animatableModel.getAnimationDelayParams(el, dataIndex) : null);
+    }
+
+    if (typeof duration === 'function') {
+      duration = duration(dataIndex);
+    }
+
+    duration > 0 ? el.animateTo(props, duration, animationDelay || 0, animationEasing, cb, !!cb) : (el.stopAnimation(), el.attr(props), cb && cb());
+  } else {
+    el.stopAnimation();
+    el.attr(props);
+    cb && cb();
+  }
+}
+/**
+ * Update graphic element properties with or without animation according to the
+ * configuration in series.
+ *
+ * Caution: this method will stop previous animation.
+ * So if do not use this method to one element twice before
+ * animation starts, unless you know what you are doing.
+ *
+ * @param {module:zrender/Element} el
+ * @param {Object} props
+ * @param {module:echarts/model/Model} [animatableModel]
+ * @param {number} [dataIndex]
+ * @param {Function} [cb]
+ * @example
+ *     graphic.updateProps(el, {
+ *         position: [100, 100]
+ *     }, seriesModel, dataIndex, function () { console.log('Animation done!'); });
+ *     // Or
+ *     graphic.updateProps(el, {
+ *         position: [100, 100]
+ *     }, seriesModel, function () { console.log('Animation done!'); });
+ */
+
+
+function updateProps(el, props, animatableModel, dataIndex, cb) {
+  animateOrSetProps(true, el, props, animatableModel, dataIndex, cb);
+}
+/**
+ * Init graphic element properties with or without animation according to the
+ * configuration in series.
+ *
+ * Caution: this method will stop previous animation.
+ * So if do not use this method to one element twice before
+ * animation starts, unless you know what you are doing.
+ *
+ * @param {module:zrender/Element} el
+ * @param {Object} props
+ * @param {module:echarts/model/Model} [animatableModel]
+ * @param {number} [dataIndex]
+ * @param {Function} cb
+ */
+
+function initProps(el, props, animatableModel, dataIndex, cb) {
+  animateOrSetProps(false, el, props, animatableModel, dataIndex, cb);
+}
+/**
+ * Get transform matrix of target (param target),
+ * in coordinate of its ancestor (param ancestor)
+ *
+ * @param {module:zrender/mixin/Transformable} target
+ * @param {module:zrender/mixin/Transformable} [ancestor]
+ */
+
+function getTransform(target, ancestor) {
+  var mat = identity([]);
+
+  while (target && target !== ancestor) {
+    mul$1(mat, target.getLocalTransform(), mat);
+    target = target.parent;
+  }
+
+  return mat;
+}
+/**
+ * Apply transform to an vertex.
+ * @param {Array.<number>} target [x, y]
+ * @param {Array.<number>|TypedArray.<number>|Object} transform Can be:
+ *      + Transform matrix: like [1, 0, 0, 1, 0, 0]
+ *      + {position, rotation, scale}, the same as `zrender/Transformable`.
+ * @param {boolean=} invert Whether use invert matrix.
+ * @return {Array.<number>} [x, y]
+ */
+
+function applyTransform$1(target, transform, invert$$1) {
+  if (transform && !isArrayLike(transform)) {
+    transform = Transformable.getLocalTransform(transform);
+  }
+
+  if (invert$$1) {
+    transform = invert([], transform);
+  }
+
+  return applyTransform([], target, transform);
+}
+/**
+ * @param {string} direction 'left' 'right' 'top' 'bottom'
+ * @param {Array.<number>} transform Transform matrix: like [1, 0, 0, 1, 0, 0]
+ * @param {boolean=} invert Whether use invert matrix.
+ * @return {string} Transformed direction. 'left' 'right' 'top' 'bottom'
+ */
+
+function transformDirection(direction, transform, invert$$1) {
+  // Pick a index, ensure that transform result will not be (0, 0).
+  var hBase = transform[4] === 0 || transform[5] === 0 || transform[0] === 0 ? 1 : Math.abs(2 * transform[4] / transform[0]);
+  var vBase = transform[4] === 0 || transform[5] === 0 || transform[2] === 0 ? 1 : Math.abs(2 * transform[4] / transform[2]);
+  var vertex = [direction === 'left' ? -hBase : direction === 'right' ? hBase : 0, direction === 'top' ? -vBase : direction === 'bottom' ? vBase : 0];
+  vertex = applyTransform$1(vertex, transform, invert$$1);
+  return Math.abs(vertex[0]) > Math.abs(vertex[1]) ? vertex[0] > 0 ? 'right' : 'left' : vertex[1] > 0 ? 'bottom' : 'top';
+}
+/**
+ * Apply group transition animation from g1 to g2.
+ * If no animatableModel, no animation.
+ */
+
+function groupTransition(g1, g2, animatableModel, cb) {
+  if (!g1 || !g2) {
+    return;
+  }
+
+  function getElMap(g) {
+    var elMap = {};
+    g.traverse(function (el) {
+      if (!el.isGroup && el.anid) {
+        elMap[el.anid] = el;
+      }
+    });
+    return elMap;
+  }
+
+  function getAnimatableProps(el) {
+    var obj = {
+      position: clone$1(el.position),
+      rotation: el.rotation
+    };
+
+    if (el.shape) {
+      obj.shape = extend({}, el.shape);
+    }
+
+    return obj;
+  }
+
+  var elMap1 = getElMap(g1);
+  g2.traverse(function (el) {
+    if (!el.isGroup && el.anid) {
+      var oldEl = elMap1[el.anid];
+
+      if (oldEl) {
+        var newProp = getAnimatableProps(el);
+        el.attr(getAnimatableProps(oldEl));
+        updateProps(el, newProp, animatableModel, el.dataIndex);
+      } // else {
+      //     if (el.previousProps) {
+      //         graphic.updateProps
+      //     }
+      // }
+
+    }
+  });
+}
+/**
+ * @param {Array.<Array.<number>>} points Like: [[23, 44], [53, 66], ...]
+ * @param {Object} rect {x, y, width, height}
+ * @return {Array.<Array.<number>>} A new clipped points.
+ */
+
+function clipPointsByRect(points, rect) {
+  // FIXME: this way migth be incorrect when grpahic clipped by a corner.
+  // and when element have border.
+  return map(points, function (point) {
+    var x = point[0];
+    x = mathMax$1(x, rect.x);
+    x = mathMin$1(x, rect.x + rect.width);
+    var y = point[1];
+    y = mathMax$1(y, rect.y);
+    y = mathMin$1(y, rect.y + rect.height);
+    return [x, y];
+  });
+}
+/**
+ * @param {Object} targetRect {x, y, width, height}
+ * @param {Object} rect {x, y, width, height}
+ * @return {Object} A new clipped rect. If rect size are negative, return undefined.
+ */
+
+function clipRectByRect(targetRect, rect) {
+  var x = mathMax$1(targetRect.x, rect.x);
+  var x2 = mathMin$1(targetRect.x + targetRect.width, rect.x + rect.width);
+  var y = mathMax$1(targetRect.y, rect.y);
+  var y2 = mathMin$1(targetRect.y + targetRect.height, rect.y + rect.height); // If the total rect is cliped, nothing, including the border,
+  // should be painted. So return undefined.
+
+  if (x2 >= x && y2 >= y) {
+    return {
+      x: x,
+      y: y,
+      width: x2 - x,
+      height: y2 - y
+    };
+  }
+}
+/**
+ * @param {string} iconStr Support 'image://' or 'path://' or direct svg path.
+ * @param {Object} [opt] Properties of `module:zrender/Element`, except `style`.
+ * @param {Object} [rect] {x, y, width, height}
+ * @return {module:zrender/Element} Icon path or image element.
+ */
+
+function createIcon(iconStr, opt, rect) {
+  opt = extend({
+    rectHover: true
+  }, opt);
+  var style = opt.style = {
+    strokeNoScale: true
+  };
+  rect = rect || {
+    x: -1,
+    y: -1,
+    width: 2,
+    height: 2
+  };
+
+  if (iconStr) {
+    return iconStr.indexOf('image://') === 0 ? (style.image = iconStr.slice(8), defaults(style, rect), new ZImage(opt)) : makePath(iconStr.replace('path://', ''), opt, rect, 'center');
+  }
+}
+
+
+var graphicUtil = (Object.freeze || Object)({
+	extendShape: extendShape,
+	extendPath: extendPath,
+	makePath: makePath,
+	makeImage: makeImage,
+	mergePath: mergePath,
+	resizePath: resizePath,
+	subPixelOptimizeLine: subPixelOptimizeLine,
+	subPixelOptimizeRect: subPixelOptimizeRect,
+	subPixelOptimize: subPixelOptimize,
+	setElementHoverStyle: setElementHoverStyle,
+	isInEmphasis: isInEmphasis,
+	setHoverStyle: setHoverStyle,
+	setAsHoverStyleTrigger: setAsHoverStyleTrigger,
+	setLabelStyle: setLabelStyle,
+	setTextStyle: setTextStyle,
+	setText: setText,
+	getFont: getFont,
+	updateProps: updateProps,
+	initProps: initProps,
+	getTransform: getTransform,
+	applyTransform: applyTransform$1,
+	transformDirection: transformDirection,
+	groupTransition: groupTransition,
+	clipPointsByRect: clipPointsByRect,
+	clipRectByRect: clipRectByRect,
+	createIcon: createIcon,
+	Group: Group,
+	Image: ZImage,
+	Text: Text,
+	Circle: Circle,
+	Sector: Sector,
+	Ring: Ring,
+	Polygon: Polygon,
+	Polyline: Polyline,
+	Rect: Rect,
+	Line: Line,
+	BezierCurve: BezierCurve,
+	Arc: Arc,
+	IncrementalDisplayable: IncrementalDisplayble,
+	CompoundPath: CompoundPath,
+	LinearGradient: LinearGradient,
+	RadialGradient: RadialGradient,
+	BoundingRect: BoundingRect
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var PATH_COLOR = ['textStyle', 'color'];
+var textStyleMixin = {
+  /**
+   * Get color property or get color from option.textStyle.color
+   * @param {boolean} [isEmphasis]
+   * @return {string}
+   */
+  getTextColor: function (isEmphasis) {
+    var ecModel = this.ecModel;
+    return this.getShallow('color') || (!isEmphasis && ecModel ? ecModel.get(PATH_COLOR) : null);
+  },
+
+  /**
+   * Create font string from fontStyle, fontWeight, fontSize, fontFamily
+   * @return {string}
+   */
+  getFont: function () {
+    return getFont({
+      fontStyle: this.getShallow('fontStyle'),
+      fontWeight: this.getShallow('fontWeight'),
+      fontSize: this.getShallow('fontSize'),
+      fontFamily: this.getShallow('fontFamily')
+    }, this.ecModel);
+  },
+  getTextRect: function (text) {
+    return getBoundingRect(text, this.getFont(), this.getShallow('align'), this.getShallow('verticalAlign') || this.getShallow('baseline'), this.getShallow('padding'), this.getShallow('rich'), this.getShallow('truncateText'));
+  }
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var getItemStyle = makeStyleMapper([['fill', 'color'], ['stroke', 'borderColor'], ['lineWidth', 'borderWidth'], ['opacity'], ['shadowBlur'], ['shadowOffsetX'], ['shadowOffsetY'], ['shadowColor'], ['textPosition'], ['textAlign']]);
+var itemStyleMixin = {
+  getItemStyle: function (excludes, includes) {
+    var style = getItemStyle(this, excludes, includes);
+    var lineDash = this.getBorderLineDash();
+    lineDash && (style.lineDash = lineDash);
+    return style;
+  },
+  getBorderLineDash: function () {
+    var lineType = this.get('borderType');
+    return lineType === 'solid' || lineType == null ? null : lineType === 'dashed' ? [5, 5] : [1, 1];
+  }
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * @module echarts/model/Model
+ */
+var mixin$1 = mixin;
+var inner = makeInner();
+/**
+ * @alias module:echarts/model/Model
+ * @constructor
+ * @param {Object} option
+ * @param {module:echarts/model/Model} [parentModel]
+ * @param {module:echarts/model/Global} [ecModel]
+ */
+
+function Model(option, parentModel, ecModel) {
+  /**
+   * @type {module:echarts/model/Model}
+   * @readOnly
+   */
+  this.parentModel = parentModel;
+  /**
+   * @type {module:echarts/model/Global}
+   * @readOnly
+   */
+
+  this.ecModel = ecModel;
+  /**
+   * @type {Object}
+   * @protected
+   */
+
+  this.option = option; // Simple optimization
+  // if (this.init) {
+  //     if (arguments.length <= 4) {
+  //         this.init(option, parentModel, ecModel, extraOpt);
+  //     }
+  //     else {
+  //         this.init.apply(this, arguments);
+  //     }
+  // }
+}
+
+Model.prototype = {
+  constructor: Model,
+
+  /**
+   * Model 鐨勫垵濮嬪寲鍑芥暟
+   * @param {Object} option
+   */
+  init: null,
+
+  /**
+   * 浠庢柊鐨� Option merge
+   */
+  mergeOption: function (option) {
+    merge(this.option, option, true);
+  },
+
+  /**
+   * @param {string|Array.<string>} path
+   * @param {boolean} [ignoreParent=false]
+   * @return {*}
+   */
+  get: function (path, ignoreParent) {
+    if (path == null) {
+      return this.option;
+    }
+
+    return doGet(this.option, this.parsePath(path), !ignoreParent && getParent(this, path));
+  },
+
+  /**
+   * @param {string} key
+   * @param {boolean} [ignoreParent=false]
+   * @return {*}
+   */
+  getShallow: function (key, ignoreParent) {
+    var option = this.option;
+    var val = option == null ? option : option[key];
+    var parentModel = !ignoreParent && getParent(this, key);
+
+    if (val == null && parentModel) {
+      val = parentModel.getShallow(key);
+    }
+
+    return val;
+  },
+
+  /**
+   * @param {string|Array.<string>} [path]
+   * @param {module:echarts/model/Model} [parentModel]
+   * @return {module:echarts/model/Model}
+   */
+  getModel: function (path, parentModel) {
+    var obj = path == null ? this.option : doGet(this.option, path = this.parsePath(path));
+    var thisParentModel;
+    parentModel = parentModel || (thisParentModel = getParent(this, path)) && thisParentModel.getModel(path);
+    return new Model(obj, parentModel, this.ecModel);
+  },
+
+  /**
+   * If model has option
+   */
+  isEmpty: function () {
+    return this.option == null;
+  },
+  restoreData: function () {},
+  // Pending
+  clone: function () {
+    var Ctor = this.constructor;
+    return new Ctor(clone(this.option));
+  },
+  setReadOnly: function (properties) {// clazzUtil.setReadOnly(this, properties);
+  },
+  // If path is null/undefined, return null/undefined.
+  parsePath: function (path) {
+    if (typeof path === 'string') {
+      path = path.split('.');
+    }
+
+    return path;
+  },
+
+  /**
+   * @param {Function} getParentMethod
+   *        param {Array.<string>|string} path
+   *        return {module:echarts/model/Model}
+   */
+  customizeGetParent: function (getParentMethod) {
+    inner(this).getParent = getParentMethod;
+  },
+  isAnimationEnabled: function () {
+    if (!env$1.node) {
+      if (this.option.animation != null) {
+        return !!this.option.animation;
+      } else if (this.parentModel) {
+        return this.parentModel.isAnimationEnabled();
+      }
+    }
+  }
+};
+
+function doGet(obj, pathArr, parentModel) {
+  for (var i = 0; i < pathArr.length; i++) {
+    // Ignore empty
+    if (!pathArr[i]) {
+      continue;
+    } // obj could be number/string/... (like 0)
+
+
+    obj = obj && typeof obj === 'object' ? obj[pathArr[i]] : null;
+
+    if (obj == null) {
+      break;
+    }
+  }
+
+  if (obj == null && parentModel) {
+    obj = parentModel.get(pathArr);
+  }
+
+  return obj;
+} // `path` can be null/undefined
+
+
+function getParent(model, path) {
+  var getParentMethod = inner(model).getParent;
+  return getParentMethod ? getParentMethod.call(model, path) : model.parentModel;
+} // Enable Model.extend.
+
+
+enableClassExtend(Model);
+enableClassCheck(Model);
+mixin$1(Model, lineStyleMixin);
+mixin$1(Model, areaStyleMixin);
+mixin$1(Model, textStyleMixin);
+mixin$1(Model, itemStyleMixin);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var base = 0;
+/**
+ * @public
+ * @param {string} type
+ * @return {string}
+ */
+
+function getUID(type) {
+  // Considering the case of crossing js context,
+  // use Math.random to make id as unique as possible.
+  return [type || '', base++, Math.random().toFixed(5)].join('_');
+}
+/**
+ * @inner
+ */
+
+function enableSubTypeDefaulter(entity) {
+  var subTypeDefaulters = {};
+
+  entity.registerSubTypeDefaulter = function (componentType, defaulter) {
+    componentType = parseClassType$1(componentType);
+    subTypeDefaulters[componentType.main] = defaulter;
+  };
+
+  entity.determineSubType = function (componentType, option) {
+    var type = option.type;
+
+    if (!type) {
+      var componentTypeMain = parseClassType$1(componentType).main;
+
+      if (entity.hasSubTypes(componentType) && subTypeDefaulters[componentTypeMain]) {
+        type = subTypeDefaulters[componentTypeMain](option);
+      }
+    }
+
+    return type;
+  };
+
+  return entity;
+}
+/**
+ * Topological travel on Activity Network (Activity On Vertices).
+ * Dependencies is defined in Model.prototype.dependencies, like ['xAxis', 'yAxis'].
+ *
+ * If 'xAxis' or 'yAxis' is absent in componentTypeList, just ignore it in topology.
+ *
+ * If there is circle dependencey, Error will be thrown.
+ *
+ */
+
+function enableTopologicalTravel(entity, dependencyGetter) {
+  /**
+   * @public
+   * @param {Array.<string>} targetNameList Target Component type list.
+   *                                           Can be ['aa', 'bb', 'aa.xx']
+   * @param {Array.<string>} fullNameList By which we can build dependency graph.
+   * @param {Function} callback Params: componentType, dependencies.
+   * @param {Object} context Scope of callback.
+   */
+  entity.topologicalTravel = function (targetNameList, fullNameList, callback, context) {
+    if (!targetNameList.length) {
+      return;
+    }
+
+    var result = makeDepndencyGraph(fullNameList);
+    var graph = result.graph;
+    var stack = result.noEntryList;
+    var targetNameSet = {};
+    each$1(targetNameList, function (name) {
+      targetNameSet[name] = true;
+    });
+
+    while (stack.length) {
+      var currComponentType = stack.pop();
+      var currVertex = graph[currComponentType];
+      var isInTargetNameSet = !!targetNameSet[currComponentType];
+
+      if (isInTargetNameSet) {
+        callback.call(context, currComponentType, currVertex.originalDeps.slice());
+        delete targetNameSet[currComponentType];
+      }
+
+      each$1(currVertex.successor, isInTargetNameSet ? removeEdgeAndAdd : removeEdge);
+    }
+
+    each$1(targetNameSet, function () {
+      throw new Error('Circle dependency may exists');
+    });
+
+    function removeEdge(succComponentType) {
+      graph[succComponentType].entryCount--;
+
+      if (graph[succComponentType].entryCount === 0) {
+        stack.push(succComponentType);
+      }
+    } // Consider this case: legend depends on series, and we call
+    // chart.setOption({series: [...]}), where only series is in option.
+    // If we do not have 'removeEdgeAndAdd', legendModel.mergeOption will
+    // not be called, but only sereis.mergeOption is called. Thus legend
+    // have no chance to update its local record about series (like which
+    // name of series is available in legend).
+
+
+    function removeEdgeAndAdd(succComponentType) {
+      targetNameSet[succComponentType] = true;
+      removeEdge(succComponentType);
+    }
+  };
+  /**
+   * DepndencyGraph: {Object}
+   * key: conponentType,
+   * value: {
+   *     successor: [conponentTypes...],
+   *     originalDeps: [conponentTypes...],
+   *     entryCount: {number}
+   * }
+   */
+
+
+  function makeDepndencyGraph(fullNameList) {
+    var graph = {};
+    var noEntryList = [];
+    each$1(fullNameList, function (name) {
+      var thisItem = createDependencyGraphItem(graph, name);
+      var originalDeps = thisItem.originalDeps = dependencyGetter(name);
+      var availableDeps = getAvailableDependencies(originalDeps, fullNameList);
+      thisItem.entryCount = availableDeps.length;
+
+      if (thisItem.entryCount === 0) {
+        noEntryList.push(name);
+      }
+
+      each$1(availableDeps, function (dependentName) {
+        if (indexOf(thisItem.predecessor, dependentName) < 0) {
+          thisItem.predecessor.push(dependentName);
+        }
+
+        var thatItem = createDependencyGraphItem(graph, dependentName);
+
+        if (indexOf(thatItem.successor, dependentName) < 0) {
+          thatItem.successor.push(name);
+        }
+      });
+    });
+    return {
+      graph: graph,
+      noEntryList: noEntryList
+    };
+  }
+
+  function createDependencyGraphItem(graph, name) {
+    if (!graph[name]) {
+      graph[name] = {
+        predecessor: [],
+        successor: []
+      };
+    }
+
+    return graph[name];
+  }
+
+  function getAvailableDependencies(originalDeps, fullNameList) {
+    var availableDeps = [];
+    each$1(originalDeps, function (dep) {
+      indexOf(fullNameList, dep) >= 0 && availableDeps.push(dep);
+    });
+    return availableDeps;
+  }
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var RADIAN_EPSILON = 1e-4;
+
+function _trim(str) {
+  return str.replace(/^\s+/, '').replace(/\s+$/, '');
+}
+/**
+ * Linear mapping a value from domain to range
+ * @memberOf module:echarts/util/number
+ * @param  {(number|Array.<number>)} val
+ * @param  {Array.<number>} domain Domain extent domain[0] can be bigger than domain[1]
+ * @param  {Array.<number>} range  Range extent range[0] can be bigger than range[1]
+ * @param  {boolean} clamp
+ * @return {(number|Array.<number>}
+ */
+
+
+function linearMap(val, domain, range, clamp) {
+  var subDomain = domain[1] - domain[0];
+  var subRange = range[1] - range[0];
+
+  if (subDomain === 0) {
+    return subRange === 0 ? range[0] : (range[0] + range[1]) / 2;
+  } // Avoid accuracy problem in edge, such as
+  // 146.39 - 62.83 === 83.55999999999999.
+  // See echarts/test/ut/spec/util/number.js#linearMap#accuracyError
+  // It is a little verbose for efficiency considering this method
+  // is a hotspot.
+
+
+  if (clamp) {
+    if (subDomain > 0) {
+      if (val <= domain[0]) {
+        return range[0];
+      } else if (val >= domain[1]) {
+        return range[1];
+      }
+    } else {
+      if (val >= domain[0]) {
+        return range[0];
+      } else if (val <= domain[1]) {
+        return range[1];
+      }
+    }
+  } else {
+    if (val === domain[0]) {
+      return range[0];
+    }
+
+    if (val === domain[1]) {
+      return range[1];
+    }
+  }
+
+  return (val - domain[0]) / subDomain * subRange + range[0];
+}
+/**
+ * Convert a percent string to absolute number.
+ * Returns NaN if percent is not a valid string or number
+ * @memberOf module:echarts/util/number
+ * @param {string|number} percent
+ * @param {number} all
+ * @return {number}
+ */
+
+function parsePercent$1(percent, all) {
+  switch (percent) {
+    case 'center':
+    case 'middle':
+      percent = '50%';
+      break;
+
+    case 'left':
+    case 'top':
+      percent = '0%';
+      break;
+
+    case 'right':
+    case 'bottom':
+      percent = '100%';
+      break;
+  }
+
+  if (typeof percent === 'string') {
+    if (_trim(percent).match(/%$/)) {
+      return parseFloat(percent) / 100 * all;
+    }
+
+    return parseFloat(percent);
+  }
+
+  return percent == null ? NaN : +percent;
+}
+/**
+ * (1) Fix rounding error of float numbers.
+ * (2) Support return string to avoid scientific notation like '3.5e-7'.
+ *
+ * @param {number} x
+ * @param {number} [precision]
+ * @param {boolean} [returnStr]
+ * @return {number|string}
+ */
+
+function round$1(x, precision, returnStr) {
+  if (precision == null) {
+    precision = 10;
+  } // Avoid range error
+
+
+  precision = Math.min(Math.max(0, precision), 20);
+  x = (+x).toFixed(precision);
+  return returnStr ? x : +x;
+}
+function asc(arr) {
+  arr.sort(function (a, b) {
+    return a - b;
+  });
+  return arr;
+}
+/**
+ * Get precision
+ * @param {number} val
+ */
+
+function getPrecision(val) {
+  val = +val;
+
+  if (isNaN(val)) {
+    return 0;
+  } // It is much faster than methods converting number to string as follows
+  //      var tmp = val.toString();
+  //      return tmp.length - 1 - tmp.indexOf('.');
+  // especially when precision is low
+
+
+  var e = 1;
+  var count = 0;
+
+  while (Math.round(val * e) / e !== val) {
+    e *= 10;
+    count++;
+  }
+
+  return count;
+}
+/**
+ * @param {string|number} val
+ * @return {number}
+ */
+
+function getPrecisionSafe(val) {
+  var str = val.toString(); // Consider scientific notation: '3.4e-12' '3.4e+12'
+
+  var eIndex = str.indexOf('e');
+
+  if (eIndex > 0) {
+    var precision = +str.slice(eIndex + 1);
+    return precision < 0 ? -precision : 0;
+  } else {
+    var dotIndex = str.indexOf('.');
+    return dotIndex < 0 ? 0 : str.length - 1 - dotIndex;
+  }
+}
+/**
+ * Minimal dicernible data precisioin according to a single pixel.
+ *
+ * @param {Array.<number>} dataExtent
+ * @param {Array.<number>} pixelExtent
+ * @return {number} precision
+ */
+
+function getPixelPrecision(dataExtent, pixelExtent) {
+  var log = Math.log;
+  var LN10 = Math.LN10;
+  var dataQuantity = Math.floor(log(dataExtent[1] - dataExtent[0]) / LN10);
+  var sizeQuantity = Math.round(log(Math.abs(pixelExtent[1] - pixelExtent[0])) / LN10); // toFixed() digits argument must be between 0 and 20.
+
+  var precision = Math.min(Math.max(-dataQuantity + sizeQuantity, 0), 20);
+  return !isFinite(precision) ? 20 : precision;
+}
+/**
+ * Get a data of given precision, assuring the sum of percentages
+ * in valueList is 1.
+ * The largest remainer method is used.
+ * https://en.wikipedia.org/wiki/Largest_remainder_method
+ *
+ * @param {Array.<number>} valueList a list of all data
+ * @param {number} idx index of the data to be processed in valueList
+ * @param {number} precision integer number showing digits of precision
+ * @return {number} percent ranging from 0 to 100
+ */
+
+function getPercentWithPrecision(valueList, idx, precision) {
+  if (!valueList[idx]) {
+    return 0;
+  }
+
+  var sum = reduce(valueList, function (acc, val) {
+    return acc + (isNaN(val) ? 0 : val);
+  }, 0);
+
+  if (sum === 0) {
+    return 0;
+  }
+
+  var digits = Math.pow(10, precision);
+  var votesPerQuota = map(valueList, function (val) {
+    return (isNaN(val) ? 0 : val) / sum * digits * 100;
+  });
+  var targetSeats = digits * 100;
+  var seats = map(votesPerQuota, function (votes) {
+    // Assign automatic seats.
+    return Math.floor(votes);
+  });
+  var currentSum = reduce(seats, function (acc, val) {
+    return acc + val;
+  }, 0);
+  var remainder = map(votesPerQuota, function (votes, idx) {
+    return votes - seats[idx];
+  }); // Has remainding votes.
+
+  while (currentSum < targetSeats) {
+    // Find next largest remainder.
+    var max = Number.NEGATIVE_INFINITY;
+    var maxId = null;
+
+    for (var i = 0, len = remainder.length; i < len; ++i) {
+      if (remainder[i] > max) {
+        max = remainder[i];
+        maxId = i;
+      }
+    } // Add a vote to max remainder.
+
+
+    ++seats[maxId];
+    remainder[maxId] = 0;
+    ++currentSum;
+  }
+
+  return seats[idx] / digits;
+} // Number.MAX_SAFE_INTEGER, ie do not support.
+
+var MAX_SAFE_INTEGER = 9007199254740991;
+/**
+ * To 0 - 2 * PI, considering negative radian.
+ * @param {number} radian
+ * @return {number}
+ */
+
+function remRadian(radian) {
+  var pi2 = Math.PI * 2;
+  return (radian % pi2 + pi2) % pi2;
+}
+/**
+ * @param {type} radian
+ * @return {boolean}
+ */
+
+function isRadianAroundZero(val) {
+  return val > -RADIAN_EPSILON && val < RADIAN_EPSILON;
+}
+/* eslint-disable */
+
+var TIME_REG = /^(?:(\d{4})(?:[-\/](\d{1,2})(?:[-\/](\d{1,2})(?:[T ](\d{1,2})(?::(\d\d)(?::(\d\d)(?:[.,](\d+))?)?)?(Z|[\+\-]\d\d:?\d\d)?)?)?)?)?$/; // jshint ignore:line
+
+/* eslint-enable */
+
+/**
+ * @param {string|Date|number} value These values can be accepted:
+ *   + An instance of Date, represent a time in its own time zone.
+ *   + Or string in a subset of ISO 8601, only including:
+ *     + only year, month, date: '2012-03', '2012-03-01', '2012-03-01 05', '2012-03-01 05:06',
+ *     + separated with T or space: '2012-03-01T12:22:33.123', '2012-03-01 12:22:33.123',
+ *     + time zone: '2012-03-01T12:22:33Z', '2012-03-01T12:22:33+8000', '2012-03-01T12:22:33-05:00',
+ *     all of which will be treated as local time if time zone is not specified
+ *     (see <https://momentjs.com/>).
+ *   + Or other string format, including (all of which will be treated as loacal time):
+ *     '2012', '2012-3-1', '2012/3/1', '2012/03/01',
+ *     '2009/6/12 2:00', '2009/6/12 2:05:08', '2009/6/12 2:05:08.123'
+ *   + a timestamp, which represent a time in UTC.
+ * @return {Date} date
+ */
+
+function parseDate(value) {
+  if (value instanceof Date) {
+    return value;
+  } else if (typeof value === 'string') {
+    // Different browsers parse date in different way, so we parse it manually.
+    // Some other issues:
+    // new Date('1970-01-01') is UTC,
+    // new Date('1970/01/01') and new Date('1970-1-01') is local.
+    // See issue #3623
+    var match = TIME_REG.exec(value);
+
+    if (!match) {
+      // return Invalid Date.
+      return new Date(NaN);
+    } // Use local time when no timezone offset specifed.
+
+
+    if (!match[8]) {
+      // match[n] can only be string or undefined.
+      // But take care of '12' + 1 => '121'.
+      return new Date(+match[1], +(match[2] || 1) - 1, +match[3] || 1, +match[4] || 0, +(match[5] || 0), +match[6] || 0, +match[7] || 0);
+    } // Timezoneoffset of Javascript Date has considered DST (Daylight Saving Time,
+    // https://tc39.github.io/ecma262/#sec-daylight-saving-time-adjustment).
+    // For example, system timezone is set as "Time Zone: America/Toronto",
+    // then these code will get different result:
+    // `new Date(1478411999999).getTimezoneOffset();  // get 240`
+    // `new Date(1478412000000).getTimezoneOffset();  // get 300`
+    // So we should not use `new Date`, but use `Date.UTC`.
+    else {
+        var hour = +match[4] || 0;
+
+        if (match[8].toUpperCase() !== 'Z') {
+          hour -= match[8].slice(0, 3);
+        }
+
+        return new Date(Date.UTC(+match[1], +(match[2] || 1) - 1, +match[3] || 1, hour, +(match[5] || 0), +match[6] || 0, +match[7] || 0));
+      }
+  } else if (value == null) {
+    return new Date(NaN);
+  }
+
+  return new Date(Math.round(value));
+}
+/**
+ * Quantity of a number. e.g. 0.1, 1, 10, 100
+ *
+ * @param  {number} val
+ * @return {number}
+ */
+
+function quantity(val) {
+  return Math.pow(10, quantityExponent(val));
+}
+
+function quantityExponent(val) {
+  return Math.floor(Math.log(val) / Math.LN10);
+}
+/**
+ * find a 鈥渘ice鈥� number approximately equal to x. Round the number if round = true,
+ * take ceiling if round = false. The primary observation is that the 鈥渘icest鈥�
+ * numbers in decimal are 1, 2, and 5, and all power-of-ten multiples of these numbers.
+ *
+ * See "Nice Numbers for Graph Labels" of Graphic Gems.
+ *
+ * @param  {number} val Non-negative value.
+ * @param  {boolean} round
+ * @return {number}
+ */
+
+
+function nice(val, round) {
+  var exponent = quantityExponent(val);
+  var exp10 = Math.pow(10, exponent);
+  var f = val / exp10; // 1 <= f < 10
+
+  var nf;
+
+  if (round) {
+    if (f < 1.5) {
+      nf = 1;
+    } else if (f < 2.5) {
+      nf = 2;
+    } else if (f < 4) {
+      nf = 3;
+    } else if (f < 7) {
+      nf = 5;
+    } else {
+      nf = 10;
+    }
+  } else {
+    if (f < 1) {
+      nf = 1;
+    } else if (f < 2) {
+      nf = 2;
+    } else if (f < 3) {
+      nf = 3;
+    } else if (f < 5) {
+      nf = 5;
+    } else {
+      nf = 10;
+    }
+  }
+
+  val = nf * exp10; // Fix 3 * 0.1 === 0.30000000000000004 issue (see IEEE 754).
+  // 20 is the uppper bound of toFixed.
+
+  return exponent >= -20 ? +val.toFixed(exponent < 0 ? -exponent : 0) : val;
+}
+/**
+ * BSD 3-Clause
+ *
+ * Copyright (c) 2010-2015, Michael Bostock
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, this
+ *   list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ *   this list of conditions and the following disclaimer in the documentation
+ *   and/or other materials provided with the distribution.
+ *
+ * * The name Michael Bostock may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL MICHAEL BOSTOCK BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * @see <https://github.com/mbostock/d3/blob/master/src/arrays/quantile.js>
+ * @see <http://en.wikipedia.org/wiki/Quantile>
+ * @param {Array.<number>} ascArr
+ */
+
+function quantile(ascArr, p) {
+  var H = (ascArr.length - 1) * p + 1;
+  var h = Math.floor(H);
+  var v = +ascArr[h - 1];
+  var e = H - h;
+  return e ? v + e * (ascArr[h] - v) : v;
+}
+/**
+ * Order intervals asc, and split them when overlap.
+ * expect(numberUtil.reformIntervals([
+ *     {interval: [18, 62], close: [1, 1]},
+ *     {interval: [-Infinity, -70], close: [0, 0]},
+ *     {interval: [-70, -26], close: [1, 1]},
+ *     {interval: [-26, 18], close: [1, 1]},
+ *     {interval: [62, 150], close: [1, 1]},
+ *     {interval: [106, 150], close: [1, 1]},
+ *     {interval: [150, Infinity], close: [0, 0]}
+ * ])).toEqual([
+ *     {interval: [-Infinity, -70], close: [0, 0]},
+ *     {interval: [-70, -26], close: [1, 1]},
+ *     {interval: [-26, 18], close: [0, 1]},
+ *     {interval: [18, 62], close: [0, 1]},
+ *     {interval: [62, 150], close: [0, 1]},
+ *     {interval: [150, Infinity], close: [0, 0]}
+ * ]);
+ * @param {Array.<Object>} list, where `close` mean open or close
+ *        of the interval, and Infinity can be used.
+ * @return {Array.<Object>} The origin list, which has been reformed.
+ */
+
+function reformIntervals(list) {
+  list.sort(function (a, b) {
+    return littleThan(a, b, 0) ? -1 : 1;
+  });
+  var curr = -Infinity;
+  var currClose = 1;
+
+  for (var i = 0; i < list.length;) {
+    var interval = list[i].interval;
+    var close = list[i].close;
+
+    for (var lg = 0; lg < 2; lg++) {
+      if (interval[lg] <= curr) {
+        interval[lg] = curr;
+        close[lg] = !lg ? 1 - currClose : 1;
+      }
+
+      curr = interval[lg];
+      currClose = close[lg];
+    }
+
+    if (interval[0] === interval[1] && close[0] * close[1] !== 1) {
+      list.splice(i, 1);
+    } else {
+      i++;
+    }
+  }
+
+  return list;
+
+  function littleThan(a, b, lg) {
+    return a.interval[lg] < b.interval[lg] || a.interval[lg] === b.interval[lg] && (a.close[lg] - b.close[lg] === (!lg ? 1 : -1) || !lg && littleThan(a, b, 1));
+  }
+}
+/**
+ * parseFloat NaNs numeric-cast false positives (null|true|false|"")
+ * ...but misinterprets leading-number strings, particularly hex literals ("0x...")
+ * subtraction forces infinities to NaN
+ *
+ * @param {*} v
+ * @return {boolean}
+ */
+
+function isNumeric(v) {
+  return v - parseFloat(v) >= 0;
+}
+
+var number = (Object.freeze || Object)({
+	linearMap: linearMap,
+	parsePercent: parsePercent$1,
+	round: round$1,
+	asc: asc,
+	getPrecision: getPrecision,
+	getPrecisionSafe: getPrecisionSafe,
+	getPixelPrecision: getPixelPrecision,
+	getPercentWithPrecision: getPercentWithPrecision,
+	MAX_SAFE_INTEGER: MAX_SAFE_INTEGER,
+	remRadian: remRadian,
+	isRadianAroundZero: isRadianAroundZero,
+	parseDate: parseDate,
+	quantity: quantity,
+	nice: nice,
+	quantile: quantile,
+	reformIntervals: reformIntervals,
+	isNumeric: isNumeric
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+/**
+ * 姣忎笁浣嶉粯璁ゅ姞,鏍煎紡鍖�
+ * @param {string|number} x
+ * @return {string}
+ */
+
+function addCommas(x) {
+  if (isNaN(x)) {
+    return '-';
+  }
+
+  x = (x + '').split('.');
+  return x[0].replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g, '$1,') + (x.length > 1 ? '.' + x[1] : '');
+}
+/**
+ * @param {string} str
+ * @param {boolean} [upperCaseFirst=false]
+ * @return {string} str
+ */
+
+function toCamelCase(str, upperCaseFirst) {
+  str = (str || '').toLowerCase().replace(/-(.)/g, function (match, group1) {
+    return group1.toUpperCase();
+  });
+
+  if (upperCaseFirst && str) {
+    str = str.charAt(0).toUpperCase() + str.slice(1);
+  }
+
+  return str;
+}
+var normalizeCssArray$1 = normalizeCssArray;
+var replaceReg = /([&<>"'])/g;
+var replaceMap = {
+  '&': '&amp;',
+  '<': '&lt;',
+  '>': '&gt;',
+  '"': '&quot;',
+  '\'': '&#39;'
+};
+function encodeHTML(source) {
+  return source == null ? '' : (source + '').replace(replaceReg, function (str, c) {
+    return replaceMap[c];
+  });
+}
+var TPL_VAR_ALIAS = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];
+
+var wrapVar = function (varName, seriesIdx) {
+  return '{' + varName + (seriesIdx == null ? '' : seriesIdx) + '}';
+};
+/**
+ * Template formatter
+ * @param {string} tpl
+ * @param {Array.<Object>|Object} paramsList
+ * @param {boolean} [encode=false]
+ * @return {string}
+ */
+
+
+function formatTpl(tpl, paramsList, encode) {
+  if (!isArray(paramsList)) {
+    paramsList = [paramsList];
+  }
+
+  var seriesLen = paramsList.length;
+
+  if (!seriesLen) {
+    return '';
+  }
+
+  var $vars = paramsList[0].$vars || [];
+
+  for (var i = 0; i < $vars.length; i++) {
+    var alias = TPL_VAR_ALIAS[i];
+    tpl = tpl.replace(wrapVar(alias), wrapVar(alias, 0));
+  }
+
+  for (var seriesIdx = 0; seriesIdx < seriesLen; seriesIdx++) {
+    for (var k = 0; k < $vars.length; k++) {
+      var val = paramsList[seriesIdx][$vars[k]];
+      tpl = tpl.replace(wrapVar(TPL_VAR_ALIAS[k], seriesIdx), encode ? encodeHTML(val) : val);
+    }
+  }
+
+  return tpl;
+}
+/**
+ * simple Template formatter
+ *
+ * @param {string} tpl
+ * @param {Object} param
+ * @param {boolean} [encode=false]
+ * @return {string}
+ */
+
+function formatTplSimple(tpl, param, encode) {
+  each$1(param, function (value, key) {
+    tpl = tpl.replace('{' + key + '}', encode ? encodeHTML(value) : value);
+  });
+  return tpl;
+}
+/**
+ * @param {Object|string} [opt] If string, means color.
+ * @param {string} [opt.color]
+ * @param {string} [opt.extraCssText]
+ * @param {string} [opt.type='item'] 'item' or 'subItem'
+ * @param {string} [opt.renderMode='html'] render mode of tooltip, 'html' or 'richText'
+ * @param {string} [opt.markerId='X'] id name for marker. If only one marker is in a rich text, this can be omitted.
+ * @return {string}
+ */
+
+function getTooltipMarker(opt, extraCssText) {
+  opt = isString(opt) ? {
+    color: opt,
+    extraCssText: extraCssText
+  } : opt || {};
+  var color = opt.color;
+  var type = opt.type;
+  var extraCssText = opt.extraCssText;
+  var renderMode = opt.renderMode || 'html';
+  var markerId = opt.markerId || 'X';
+
+  if (!color) {
+    return '';
+  }
+
+  if (renderMode === 'html') {
+    return type === 'subItem' ? '<span style="display:inline-block;vertical-align:middle;margin-right:8px;margin-left:3px;' + 'border-radius:4px;width:4px;height:4px;background-color:' + encodeHTML(color) + ';' + (extraCssText || '') + '"></span>' : '<span style="display:inline-block;margin-right:5px;' + 'border-radius:10px;width:10px;height:10px;background-color:' + encodeHTML(color) + ';' + (extraCssText || '') + '"></span>';
+  } else {
+    // Space for rich element marker
+    return {
+      renderMode: renderMode,
+      content: '{marker' + markerId + '|}  ',
+      style: {
+        color: color
+      }
+    };
+  }
+}
+
+function pad(str, len) {
+  str += '';
+  return '0000'.substr(0, len - str.length) + str;
+}
+/**
+ * ISO Date format
+ * @param {string} tpl
+ * @param {number} value
+ * @param {boolean} [isUTC=false] Default in local time.
+ *           see `module:echarts/scale/Time`
+ *           and `module:echarts/util/number#parseDate`.
+ * @inner
+ */
+
+
+function formatTime(tpl, value, isUTC) {
+  if (tpl === 'week' || tpl === 'month' || tpl === 'quarter' || tpl === 'half-year' || tpl === 'year') {
+    tpl = 'MM-dd\nyyyy';
+  }
+
+  var date = parseDate(value);
+  var utc = isUTC ? 'UTC' : '';
+  var y = date['get' + utc + 'FullYear']();
+  var M = date['get' + utc + 'Month']() + 1;
+  var d = date['get' + utc + 'Date']();
+  var h = date['get' + utc + 'Hours']();
+  var m = date['get' + utc + 'Minutes']();
+  var s = date['get' + utc + 'Seconds']();
+  var S = date['get' + utc + 'Milliseconds']();
+  tpl = tpl.replace('MM', pad(M, 2)).replace('M', M).replace('yyyy', y).replace('yy', y % 100).replace('dd', pad(d, 2)).replace('d', d).replace('hh', pad(h, 2)).replace('h', h).replace('mm', pad(m, 2)).replace('m', m).replace('ss', pad(s, 2)).replace('s', s).replace('SSS', pad(S, 3));
+  return tpl;
+}
+/**
+ * Capital first
+ * @param {string} str
+ * @return {string}
+ */
+
+function capitalFirst(str) {
+  return str ? str.charAt(0).toUpperCase() + str.substr(1) : str;
+}
+var truncateText$1 = truncateText;
+var getTextRect = getBoundingRect;
+
+var format = (Object.freeze || Object)({
+	addCommas: addCommas,
+	toCamelCase: toCamelCase,
+	normalizeCssArray: normalizeCssArray$1,
+	encodeHTML: encodeHTML,
+	formatTpl: formatTpl,
+	formatTplSimple: formatTplSimple,
+	getTooltipMarker: getTooltipMarker,
+	formatTime: formatTime,
+	capitalFirst: capitalFirst,
+	truncateText: truncateText$1,
+	getTextRect: getTextRect
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+// Layout helpers for each component positioning
+var each$3 = each$1;
+/**
+ * @public
+ */
+
+var LOCATION_PARAMS = ['left', 'right', 'top', 'bottom', 'width', 'height'];
+/**
+ * @public
+ */
+
+var HV_NAMES = [['width', 'left', 'right'], ['height', 'top', 'bottom']];
+
+function boxLayout(orient, group, gap, maxWidth, maxHeight) {
+  var x = 0;
+  var y = 0;
+
+  if (maxWidth == null) {
+    maxWidth = Infinity;
+  }
+
+  if (maxHeight == null) {
+    maxHeight = Infinity;
+  }
+
+  var currentLineMaxSize = 0;
+  group.eachChild(function (child, idx) {
+    var position = child.position;
+    var rect = child.getBoundingRect();
+    var nextChild = group.childAt(idx + 1);
+    var nextChildRect = nextChild && nextChild.getBoundingRect();
+    var nextX;
+    var nextY;
+
+    if (orient === 'horizontal') {
+      var moveX = rect.width + (nextChildRect ? -nextChildRect.x + rect.x : 0);
+      nextX = x + moveX; // Wrap when width exceeds maxWidth or meet a `newline` group
+      // FIXME compare before adding gap?
+
+      if (nextX > maxWidth || child.newline) {
+        x = 0;
+        nextX = moveX;
+        y += currentLineMaxSize + gap;
+        currentLineMaxSize = rect.height;
+      } else {
+        // FIXME: consider rect.y is not `0`?
+        currentLineMaxSize = Math.max(currentLineMaxSize, rect.height);
+      }
+    } else {
+      var moveY = rect.height + (nextChildRect ? -nextChildRect.y + rect.y : 0);
+      nextY = y + moveY; // Wrap when width exceeds maxHeight or meet a `newline` group
+
+      if (nextY > maxHeight || child.newline) {
+        x += currentLineMaxSize + gap;
+        y = 0;
+        nextY = moveY;
+        currentLineMaxSize = rect.width;
+      } else {
+        currentLineMaxSize = Math.max(currentLineMaxSize, rect.width);
+      }
+    }
+
+    if (child.newline) {
+      return;
+    }
+
+    position[0] = x;
+    position[1] = y;
+    orient === 'horizontal' ? x = nextX + gap : y = nextY + gap;
+  });
+}
+/**
+ * VBox or HBox layouting
+ * @param {string} orient
+ * @param {module:zrender/container/Group} group
+ * @param {number} gap
+ * @param {number} [width=Infinity]
+ * @param {number} [height=Infinity]
+ */
+
+
+var box = boxLayout;
+/**
+ * VBox layouting
+ * @param {module:zrender/container/Group} group
+ * @param {number} gap
+ * @param {number} [width=Infinity]
+ * @param {number} [height=Infinity]
+ */
+
+var vbox = curry(boxLayout, 'vertical');
+/**
+ * HBox layouting
+ * @param {module:zrender/container/Group} group
+ * @param {number} gap
+ * @param {number} [width=Infinity]
+ * @param {number} [height=Infinity]
+ */
+
+var hbox = curry(boxLayout, 'horizontal');
+/**
+ * If x or x2 is not specified or 'center' 'left' 'right',
+ * the width would be as long as possible.
+ * If y or y2 is not specified or 'middle' 'top' 'bottom',
+ * the height would be as long as possible.
+ *
+ * @param {Object} positionInfo
+ * @param {number|string} [positionInfo.x]
+ * @param {number|string} [positionInfo.y]
+ * @param {number|string} [positionInfo.x2]
+ * @param {number|string} [positionInfo.y2]
+ * @param {Object} containerRect {width, height}
+ * @param {string|number} margin
+ * @return {Object} {width, height}
+ */
+
+function getAvailableSize(positionInfo, containerRect, margin) {
+  var containerWidth = containerRect.width;
+  var containerHeight = containerRect.height;
+  var x = parsePercent$1(positionInfo.x, containerWidth);
+  var y = parsePercent$1(positionInfo.y, containerHeight);
+  var x2 = parsePercent$1(positionInfo.x2, containerWidth);
+  var y2 = parsePercent$1(positionInfo.y2, containerHeight);
+  (isNaN(x) || isNaN(parseFloat(positionInfo.x))) && (x = 0);
+  (isNaN(x2) || isNaN(parseFloat(positionInfo.x2))) && (x2 = containerWidth);
+  (isNaN(y) || isNaN(parseFloat(positionInfo.y))) && (y = 0);
+  (isNaN(y2) || isNaN(parseFloat(positionInfo.y2))) && (y2 = containerHeight);
+  margin = normalizeCssArray$1(margin || 0);
+  return {
+    width: Math.max(x2 - x - margin[1] - margin[3], 0),
+    height: Math.max(y2 - y - margin[0] - margin[2], 0)
+  };
+}
+/**
+ * Parse position info.
+ *
+ * @param {Object} positionInfo
+ * @param {number|string} [positionInfo.left]
+ * @param {number|string} [positionInfo.top]
+ * @param {number|string} [positionInfo.right]
+ * @param {number|string} [positionInfo.bottom]
+ * @param {number|string} [positionInfo.width]
+ * @param {number|string} [positionInfo.height]
+ * @param {number|string} [positionInfo.aspect] Aspect is width / height
+ * @param {Object} containerRect
+ * @param {string|number} [margin]
+ *
+ * @return {module:zrender/core/BoundingRect}
+ */
+
+function getLayoutRect(positionInfo, containerRect, margin) {
+  margin = normalizeCssArray$1(margin || 0);
+  var containerWidth = containerRect.width;
+  var containerHeight = containerRect.height;
+  var left = parsePercent$1(positionInfo.left, containerWidth);
+  var top = parsePercent$1(positionInfo.top, containerHeight);
+  var right = parsePercent$1(positionInfo.right, containerWidth);
+  var bottom = parsePercent$1(positionInfo.bottom, containerHeight);
+  var width = parsePercent$1(positionInfo.width, containerWidth);
+  var height = parsePercent$1(positionInfo.height, containerHeight);
+  var verticalMargin = margin[2] + margin[0];
+  var horizontalMargin = margin[1] + margin[3];
+  var aspect = positionInfo.aspect; // If width is not specified, calculate width from left and right
+
+  if (isNaN(width)) {
+    width = containerWidth - right - horizontalMargin - left;
+  }
+
+  if (isNaN(height)) {
+    height = containerHeight - bottom - verticalMargin - top;
+  }
+
+  if (aspect != null) {
+    // If width and height are not given
+    // 1. Graph should not exceeds the container
+    // 2. Aspect must be keeped
+    // 3. Graph should take the space as more as possible
+    // FIXME
+    // Margin is not considered, because there is no case that both
+    // using margin and aspect so far.
+    if (isNaN(width) && isNaN(height)) {
+      if (aspect > containerWidth / containerHeight) {
+        width = containerWidth * 0.8;
+      } else {
+        height = containerHeight * 0.8;
+      }
+    } // Calculate width or height with given aspect
+
+
+    if (isNaN(width)) {
+      width = aspect * height;
+    }
+
+    if (isNaN(height)) {
+      height = width / aspect;
+    }
+  } // If left is not specified, calculate left from right and width
+
+
+  if (isNaN(left)) {
+    left = containerWidth - right - width - horizontalMargin;
+  }
+
+  if (isNaN(top)) {
+    top = containerHeight - bottom - height - verticalMargin;
+  } // Align left and top
+
+
+  switch (positionInfo.left || positionInfo.right) {
+    case 'center':
+      left = containerWidth / 2 - width / 2 - margin[3];
+      break;
+
+    case 'right':
+      left = containerWidth - width - horizontalMargin;
+      break;
+  }
+
+  switch (positionInfo.top || positionInfo.bottom) {
+    case 'middle':
+    case 'center':
+      top = containerHeight / 2 - height / 2 - margin[0];
+      break;
+
+    case 'bottom':
+      top = containerHeight - height - verticalMargin;
+      break;
+  } // If something is wrong and left, top, width, height are calculated as NaN
+
+
+  left = left || 0;
+  top = top || 0;
+
+  if (isNaN(width)) {
+    // Width may be NaN if only one value is given except width
+    width = containerWidth - horizontalMargin - left - (right || 0);
+  }
+
+  if (isNaN(height)) {
+    // Height may be NaN if only one value is given except height
+    height = containerHeight - verticalMargin - top - (bottom || 0);
+  }
+
+  var rect = new BoundingRect(left + margin[3], top + margin[0], width, height);
+  rect.margin = margin;
+  return rect;
+}
+/**
+ * Position a zr element in viewport
+ *  Group position is specified by either
+ *  {left, top}, {right, bottom}
+ *  If all properties exists, right and bottom will be igonred.
+ *
+ * Logic:
+ *     1. Scale (against origin point in parent coord)
+ *     2. Rotate (against origin point in parent coord)
+ *     3. Traslate (with el.position by this method)
+ * So this method only fixes the last step 'Traslate', which does not affect
+ * scaling and rotating.
+ *
+ * If be called repeatly with the same input el, the same result will be gotten.
+ *
+ * @param {module:zrender/Element} el Should have `getBoundingRect` method.
+ * @param {Object} positionInfo
+ * @param {number|string} [positionInfo.left]
+ * @param {number|string} [positionInfo.top]
+ * @param {number|string} [positionInfo.right]
+ * @param {number|string} [positionInfo.bottom]
+ * @param {number|string} [positionInfo.width] Only for opt.boundingModel: 'raw'
+ * @param {number|string} [positionInfo.height] Only for opt.boundingModel: 'raw'
+ * @param {Object} containerRect
+ * @param {string|number} margin
+ * @param {Object} [opt]
+ * @param {Array.<number>} [opt.hv=[1,1]] Only horizontal or only vertical.
+ * @param {Array.<number>} [opt.boundingMode='all']
+ *        Specify how to calculate boundingRect when locating.
+ *        'all': Position the boundingRect that is transformed and uioned
+ *               both itself and its descendants.
+ *               This mode simplies confine the elements in the bounding
+ *               of their container (e.g., using 'right: 0').
+ *        'raw': Position the boundingRect that is not transformed and only itself.
+ *               This mode is useful when you want a element can overflow its
+ *               container. (Consider a rotated circle needs to be located in a corner.)
+ *               In this mode positionInfo.width/height can only be number.
+ */
+
+function positionElement(el, positionInfo, containerRect, margin, opt) {
+  var h = !opt || !opt.hv || opt.hv[0];
+  var v = !opt || !opt.hv || opt.hv[1];
+  var boundingMode = opt && opt.boundingMode || 'all';
+
+  if (!h && !v) {
+    return;
+  }
+
+  var rect;
+
+  if (boundingMode === 'raw') {
+    rect = el.type === 'group' ? new BoundingRect(0, 0, +positionInfo.width || 0, +positionInfo.height || 0) : el.getBoundingRect();
+  } else {
+    rect = el.getBoundingRect();
+
+    if (el.needLocalTransform()) {
+      var transform = el.getLocalTransform(); // Notice: raw rect may be inner object of el,
+      // which should not be modified.
+
+      rect = rect.clone();
+      rect.applyTransform(transform);
+    }
+  } // The real width and height can not be specified but calculated by the given el.
+
+
+  positionInfo = getLayoutRect(defaults({
+    width: rect.width,
+    height: rect.height
+  }, positionInfo), containerRect, margin); // Because 'tranlate' is the last step in transform
+  // (see zrender/core/Transformable#getLocalTransform),
+  // we can just only modify el.position to get final result.
+
+  var elPos = el.position;
+  var dx = h ? positionInfo.x - rect.x : 0;
+  var dy = v ? positionInfo.y - rect.y : 0;
+  el.attr('position', boundingMode === 'raw' ? [dx, dy] : [elPos[0] + dx, elPos[1] + dy]);
+}
+/**
+ * @param {Object} option Contains some of the properties in HV_NAMES.
+ * @param {number} hvIdx 0: horizontal; 1: vertical.
+ */
+
+function sizeCalculable(option, hvIdx) {
+  return option[HV_NAMES[hvIdx][0]] != null || option[HV_NAMES[hvIdx][1]] != null && option[HV_NAMES[hvIdx][2]] != null;
+}
+/**
+ * Consider Case:
+ * When defulat option has {left: 0, width: 100}, and we set {right: 0}
+ * through setOption or media query, using normal zrUtil.merge will cause
+ * {right: 0} does not take effect.
+ *
+ * @example
+ * ComponentModel.extend({
+ *     init: function () {
+ *         ...
+ *         var inputPositionParams = layout.getLayoutParams(option);
+ *         this.mergeOption(inputPositionParams);
+ *     },
+ *     mergeOption: function (newOption) {
+ *         newOption && zrUtil.merge(thisOption, newOption, true);
+ *         layout.mergeLayoutParam(thisOption, newOption);
+ *     }
+ * });
+ *
+ * @param {Object} targetOption
+ * @param {Object} newOption
+ * @param {Object|string} [opt]
+ * @param {boolean|Array.<boolean>} [opt.ignoreSize=false] Used for the components
+ *  that width (or height) should not be calculated by left and right (or top and bottom).
+ */
+
+function mergeLayoutParam(targetOption, newOption, opt) {
+  !isObject$1(opt) && (opt = {});
+  var ignoreSize = opt.ignoreSize;
+  !isArray(ignoreSize) && (ignoreSize = [ignoreSize, ignoreSize]);
+  var hResult = merge$$1(HV_NAMES[0], 0);
+  var vResult = merge$$1(HV_NAMES[1], 1);
+  copy(HV_NAMES[0], targetOption, hResult);
+  copy(HV_NAMES[1], targetOption, vResult);
+
+  function merge$$1(names, hvIdx) {
+    var newParams = {};
+    var newValueCount = 0;
+    var merged = {};
+    var mergedValueCount = 0;
+    var enoughParamNumber = 2;
+    each$3(names, function (name) {
+      merged[name] = targetOption[name];
+    });
+    each$3(names, function (name) {
+      // Consider case: newOption.width is null, which is
+      // set by user for removing width setting.
+      hasProp(newOption, name) && (newParams[name] = merged[name] = newOption[name]);
+      hasValue(newParams, name) && newValueCount++;
+      hasValue(merged, name) && mergedValueCount++;
+    });
+
+    if (ignoreSize[hvIdx]) {
+      // Only one of left/right is premitted to exist.
+      if (hasValue(newOption, names[1])) {
+        merged[names[2]] = null;
+      } else if (hasValue(newOption, names[2])) {
+        merged[names[1]] = null;
+      }
+
+      return merged;
+    } // Case: newOption: {width: ..., right: ...},
+    // or targetOption: {right: ...} and newOption: {width: ...},
+    // There is no conflict when merged only has params count
+    // little than enoughParamNumber.
+
+
+    if (mergedValueCount === enoughParamNumber || !newValueCount) {
+      return merged;
+    } // Case: newOption: {width: ..., right: ...},
+    // Than we can make sure user only want those two, and ignore
+    // all origin params in targetOption.
+    else if (newValueCount >= enoughParamNumber) {
+        return newParams;
+      } else {
+        // Chose another param from targetOption by priority.
+        for (var i = 0; i < names.length; i++) {
+          var name = names[i];
+
+          if (!hasProp(newParams, name) && hasProp(targetOption, name)) {
+            newParams[name] = targetOption[name];
+            break;
+          }
+        }
+
+        return newParams;
+      }
+  }
+
+  function hasProp(obj, name) {
+    return obj.hasOwnProperty(name);
+  }
+
+  function hasValue(obj, name) {
+    return obj[name] != null && obj[name] !== 'auto';
+  }
+
+  function copy(names, target, source) {
+    each$3(names, function (name) {
+      target[name] = source[name];
+    });
+  }
+}
+/**
+ * Retrieve 'left', 'right', 'top', 'bottom', 'width', 'height' from object.
+ * @param {Object} source
+ * @return {Object} Result contains those props.
+ */
+
+function getLayoutParams(source) {
+  return copyLayoutParams({}, source);
+}
+/**
+ * Retrieve 'left', 'right', 'top', 'bottom', 'width', 'height' from object.
+ * @param {Object} source
+ * @return {Object} Result contains those props.
+ */
+
+function copyLayoutParams(target, source) {
+  source && target && each$3(LOCATION_PARAMS, function (name) {
+    source.hasOwnProperty(name) && (target[name] = source[name]);
+  });
+  return target;
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var boxLayoutMixin = {
+  getBoxLayoutParams: function () {
+    return {
+      left: this.get('left'),
+      top: this.get('top'),
+      right: this.get('right'),
+      bottom: this.get('bottom'),
+      width: this.get('width'),
+      height: this.get('height')
+    };
+  }
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * Component model
+ *
+ * @module echarts/model/Component
+ */
+var inner$1 = makeInner();
+/**
+ * @alias module:echarts/model/Component
+ * @constructor
+ * @param {Object} option
+ * @param {module:echarts/model/Model} parentModel
+ * @param {module:echarts/model/Model} ecModel
+ */
+
+var ComponentModel = Model.extend({
+  type: 'component',
+
+  /**
+   * @readOnly
+   * @type {string}
+   */
+  id: '',
+
+  /**
+   * Because simplified concept is probably better, series.name (or component.name)
+   * has been having too many resposibilities:
+   * (1) Generating id (which requires name in option should not be modified).
+   * (2) As an index to mapping series when merging option or calling API (a name
+   * can refer to more then one components, which is convinient is some case).
+   * (3) Display.
+   * @readOnly
+   */
+  name: '',
+
+  /**
+   * @readOnly
+   * @type {string}
+   */
+  mainType: '',
+
+  /**
+   * @readOnly
+   * @type {string}
+   */
+  subType: '',
+
+  /**
+   * @readOnly
+   * @type {number}
+   */
+  componentIndex: 0,
+
+  /**
+   * @type {Object}
+   * @protected
+   */
+  defaultOption: null,
+
+  /**
+   * @type {module:echarts/model/Global}
+   * @readOnly
+   */
+  ecModel: null,
+
+  /**
+   * key: componentType
+   * value:  Component model list, can not be null.
+   * @type {Object.<string, Array.<module:echarts/model/Model>>}
+   * @readOnly
+   */
+  dependentModels: [],
+
+  /**
+   * @type {string}
+   * @readOnly
+   */
+  uid: null,
+
+  /**
+   * Support merge layout params.
+   * Only support 'box' now (left/right/top/bottom/width/height).
+   * @type {string|Object} Object can be {ignoreSize: true}
+   * @readOnly
+   */
+  layoutMode: null,
+  $constructor: function (option, parentModel, ecModel, extraOpt) {
+    Model.call(this, option, parentModel, ecModel, extraOpt);
+    this.uid = getUID('ec_cpt_model');
+  },
+  init: function (option, parentModel, ecModel, extraOpt) {
+    this.mergeDefaultAndTheme(option, ecModel);
+  },
+  mergeDefaultAndTheme: function (option, ecModel) {
+    var layoutMode = this.layoutMode;
+    var inputPositionParams = layoutMode ? getLayoutParams(option) : {};
+    var themeModel = ecModel.getTheme();
+    merge(option, themeModel.get(this.mainType));
+    merge(option, this.getDefaultOption());
+
+    if (layoutMode) {
+      mergeLayoutParam(option, inputPositionParams, layoutMode);
+    }
+  },
+  mergeOption: function (option, extraOpt) {
+    merge(this.option, option, true);
+    var layoutMode = this.layoutMode;
+
+    if (layoutMode) {
+      mergeLayoutParam(this.option, option, layoutMode);
+    }
+  },
+  // Hooker after init or mergeOption
+  optionUpdated: function (newCptOption, isInit) {},
+  getDefaultOption: function () {
+    var fields = inner$1(this);
+
+    if (!fields.defaultOption) {
+      var optList = [];
+      var Class = this.constructor;
+
+      while (Class) {
+        var opt = Class.prototype.defaultOption;
+        opt && optList.push(opt);
+        Class = Class.superClass;
+      }
+
+      var defaultOption = {};
+
+      for (var i = optList.length - 1; i >= 0; i--) {
+        defaultOption = merge(defaultOption, optList[i], true);
+      }
+
+      fields.defaultOption = defaultOption;
+    }
+
+    return fields.defaultOption;
+  },
+  getReferringComponents: function (mainType) {
+    return this.ecModel.queryComponents({
+      mainType: mainType,
+      index: this.get(mainType + 'Index', true),
+      id: this.get(mainType + 'Id', true)
+    });
+  }
+}); // Reset ComponentModel.extend, add preConstruct.
+// clazzUtil.enableClassExtend(
+//     ComponentModel,
+//     function (option, parentModel, ecModel, extraOpt) {
+//         // Set dependentModels, componentIndex, name, id, mainType, subType.
+//         zrUtil.extend(this, extraOpt);
+//         this.uid = componentUtil.getUID('componentModel');
+//         // this.setReadOnly([
+//         //     'type', 'id', 'uid', 'name', 'mainType', 'subType',
+//         //     'dependentModels', 'componentIndex'
+//         // ]);
+//     }
+// );
+// Add capability of registerClass, getClass, hasClass, registerSubTypeDefaulter and so on.
+
+enableClassManagement(ComponentModel, {
+  registerWhenExtend: true
+});
+enableSubTypeDefaulter(ComponentModel); // Add capability of ComponentModel.topologicalTravel.
+
+enableTopologicalTravel(ComponentModel, getDependencies);
+
+function getDependencies(componentType) {
+  var deps = [];
+  each$1(ComponentModel.getClassesByMainType(componentType), function (Clazz) {
+    deps = deps.concat(Clazz.prototype.dependencies || []);
+  }); // Ensure main type.
+
+  deps = map(deps, function (type) {
+    return parseClassType$1(type).main;
+  }); // Hack dataset for convenience.
+
+  if (componentType !== 'dataset' && indexOf(deps, 'dataset') <= 0) {
+    deps.unshift('dataset');
+  }
+
+  return deps;
+}
+
+mixin(ComponentModel, boxLayoutMixin);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var platform = ''; // Navigator not exists in node
+
+if (typeof navigator !== 'undefined') {
+  platform = navigator.platform || '';
+}
+
+var globalDefault = {
+  // backgroundColor: 'rgba(0,0,0,0)',
+  // https://dribbble.com/shots/1065960-Infographic-Pie-chart-visualization
+  // color: ['#5793f3', '#d14a61', '#fd9c35', '#675bba', '#fec42c', '#dd4444', '#d4df5a', '#cd4870'],
+  // Light colors:
+  // color: ['#bcd3bb', '#e88f70', '#edc1a5', '#9dc5c8', '#e1e8c8', '#7b7c68', '#e5b5b5', '#f0b489', '#928ea8', '#bda29a'],
+  // color: ['#cc5664', '#9bd6ec', '#ea946e', '#8acaaa', '#f1ec64', '#ee8686', '#a48dc1', '#5da6bc', '#b9dcae'],
+  // Dark colors:
+  color: ['#c23531', '#2f4554', '#61a0a8', '#d48265', '#91c7ae', '#749f83', '#ca8622', '#bda29a', '#6e7074', '#546570', '#c4ccd3'],
+  gradientColor: ['#f6efa6', '#d88273', '#bf444c'],
+  // If xAxis and yAxis declared, grid is created by default.
+  // grid: {},
+  textStyle: {
+    // color: '#000',
+    // decoration: 'none',
+    // PENDING
+    fontFamily: platform.match(/^Win/) ? 'Microsoft YaHei' : 'sans-serif',
+    // fontFamily: 'Arial, Verdana, sans-serif',
+    fontSize: 12,
+    fontStyle: 'normal',
+    fontWeight: 'normal'
+  },
+  // http://blogs.adobe.com/webplatform/2014/02/24/using-blend-modes-in-html-canvas/
+  // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation
+  // Default is source-over
+  blendMode: null,
+  animation: 'auto',
+  animationDuration: 1000,
+  animationDurationUpdate: 300,
+  animationEasing: 'exponentialOut',
+  animationEasingUpdate: 'cubicOut',
+  animationThreshold: 2000,
+  // Configuration for progressive/incremental rendering
+  progressiveThreshold: 3000,
+  progressive: 400,
+  // Threshold of if use single hover layer to optimize.
+  // It is recommended that `hoverLayerThreshold` is equivalent to or less than
+  // `progressiveThreshold`, otherwise hover will cause restart of progressive,
+  // which is unexpected.
+  // see example <echarts/test/heatmap-large.html>.
+  hoverLayerThreshold: 3000,
+  // See: module:echarts/scale/Time
+  useUTC: false
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var inner$2 = makeInner();
+
+function getNearestColorPalette(colors, requestColorNum) {
+  var paletteNum = colors.length; // TODO colors must be in order
+
+  for (var i = 0; i < paletteNum; i++) {
+    if (colors[i].length > requestColorNum) {
+      return colors[i];
+    }
+  }
+
+  return colors[paletteNum - 1];
+}
+
+var colorPaletteMixin = {
+  clearColorPalette: function () {
+    inner$2(this).colorIdx = 0;
+    inner$2(this).colorNameMap = {};
+  },
+
+  /**
+   * @param {string} name MUST NOT be null/undefined. Otherwise call this function
+   *                 twise with the same parameters will get different result.
+   * @param {Object} [scope=this]
+   * @param {Object} [requestColorNum]
+   * @return {string} color string.
+   */
+  getColorFromPalette: function (name, scope, requestColorNum) {
+    scope = scope || this;
+    var scopeFields = inner$2(scope);
+    var colorIdx = scopeFields.colorIdx || 0;
+    var colorNameMap = scopeFields.colorNameMap = scopeFields.colorNameMap || {}; // Use `hasOwnProperty` to avoid conflict with Object.prototype.
+
+    if (colorNameMap.hasOwnProperty(name)) {
+      return colorNameMap[name];
+    }
+
+    var defaultColorPalette = normalizeToArray(this.get('color', true));
+    var layeredColorPalette = this.get('colorLayer', true);
+    var colorPalette = requestColorNum == null || !layeredColorPalette ? defaultColorPalette : getNearestColorPalette(layeredColorPalette, requestColorNum); // In case can't find in layered color palette.
+
+    colorPalette = colorPalette || defaultColorPalette;
+
+    if (!colorPalette || !colorPalette.length) {
+      return;
+    }
+
+    var color = colorPalette[colorIdx];
+
+    if (name) {
+      colorNameMap[name] = color;
+    }
+
+    scopeFields.colorIdx = (colorIdx + 1) % colorPalette.length;
+    return color;
+  }
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * Helper for model references.
+ * There are many manners to refer axis/coordSys.
+ */
+// TODO
+// merge relevant logic to this file?
+// check: "modelHelper" of tooltip and "BrushTargetManager".
+/**
+ * @return {Object} For example:
+ * {
+ *     coordSysName: 'cartesian2d',
+ *     coordSysDims: ['x', 'y', ...],
+ *     axisMap: HashMap({
+ *         x: xAxisModel,
+ *         y: yAxisModel
+ *     }),
+ *     categoryAxisMap: HashMap({
+ *         x: xAxisModel,
+ *         y: undefined
+ *     }),
+ *     // It also indicate that whether there is category axis.
+ *     firstCategoryDimIndex: 1,
+ *     // To replace user specified encode.
+ * }
+ */
+
+function getCoordSysDefineBySeries(seriesModel) {
+  var coordSysName = seriesModel.get('coordinateSystem');
+  var result = {
+    coordSysName: coordSysName,
+    coordSysDims: [],
+    axisMap: createHashMap(),
+    categoryAxisMap: createHashMap()
+  };
+  var fetch = fetchers[coordSysName];
+
+  if (fetch) {
+    fetch(seriesModel, result, result.axisMap, result.categoryAxisMap);
+    return result;
+  }
+}
+var fetchers = {
+  cartesian2d: function (seriesModel, result, axisMap, categoryAxisMap) {
+    var xAxisModel = seriesModel.getReferringComponents('xAxis')[0];
+    var yAxisModel = seriesModel.getReferringComponents('yAxis')[0];
+    result.coordSysDims = ['x', 'y'];
+    axisMap.set('x', xAxisModel);
+    axisMap.set('y', yAxisModel);
+
+    if (isCategory(xAxisModel)) {
+      categoryAxisMap.set('x', xAxisModel);
+      result.firstCategoryDimIndex = 0;
+    }
+
+    if (isCategory(yAxisModel)) {
+      categoryAxisMap.set('y', yAxisModel);
+      result.firstCategoryDimIndex = 1;
+    }
+  },
+  singleAxis: function (seriesModel, result, axisMap, categoryAxisMap) {
+    var singleAxisModel = seriesModel.getReferringComponents('singleAxis')[0];
+    result.coordSysDims = ['single'];
+    axisMap.set('single', singleAxisModel);
+
+    if (isCategory(singleAxisModel)) {
+      categoryAxisMap.set('single', singleAxisModel);
+      result.firstCategoryDimIndex = 0;
+    }
+  },
+  polar: function (seriesModel, result, axisMap, categoryAxisMap) {
+    var polarModel = seriesModel.getReferringComponents('polar')[0];
+    var radiusAxisModel = polarModel.findAxisModel('radiusAxis');
+    var angleAxisModel = polarModel.findAxisModel('angleAxis');
+    result.coordSysDims = ['radius', 'angle'];
+    axisMap.set('radius', radiusAxisModel);
+    axisMap.set('angle', angleAxisModel);
+
+    if (isCategory(radiusAxisModel)) {
+      categoryAxisMap.set('radius', radiusAxisModel);
+      result.firstCategoryDimIndex = 0;
+    }
+
+    if (isCategory(angleAxisModel)) {
+      categoryAxisMap.set('angle', angleAxisModel);
+      result.firstCategoryDimIndex = 1;
+    }
+  },
+  geo: function (seriesModel, result, axisMap, categoryAxisMap) {
+    result.coordSysDims = ['lng', 'lat'];
+  },
+  parallel: function (seriesModel, result, axisMap, categoryAxisMap) {
+    var ecModel = seriesModel.ecModel;
+    var parallelModel = ecModel.getComponent('parallel', seriesModel.get('parallelIndex'));
+    var coordSysDims = result.coordSysDims = parallelModel.dimensions.slice();
+    each$1(parallelModel.parallelAxisIndex, function (axisIndex, index) {
+      var axisModel = ecModel.getComponent('parallelAxis', axisIndex);
+      var axisDim = coordSysDims[index];
+      axisMap.set(axisDim, axisModel);
+
+      if (isCategory(axisModel) && result.firstCategoryDimIndex == null) {
+        categoryAxisMap.set(axisDim, axisModel);
+        result.firstCategoryDimIndex = index;
+      }
+    });
+  }
+};
+
+function isCategory(axisModel) {
+  return axisModel.get('type') === 'category';
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+// Avoid typo.
+var SOURCE_FORMAT_ORIGINAL = 'original';
+var SOURCE_FORMAT_ARRAY_ROWS = 'arrayRows';
+var SOURCE_FORMAT_OBJECT_ROWS = 'objectRows';
+var SOURCE_FORMAT_KEYED_COLUMNS = 'keyedColumns';
+var SOURCE_FORMAT_UNKNOWN = 'unknown'; // ??? CHANGE A NAME
+
+var SOURCE_FORMAT_TYPED_ARRAY = 'typedArray';
+var SERIES_LAYOUT_BY_COLUMN = 'column';
+var SERIES_LAYOUT_BY_ROW = 'row';
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+/**
+ * [sourceFormat]
+ *
+ * + "original":
+ * This format is only used in series.data, where
+ * itemStyle can be specified in data item.
+ *
+ * + "arrayRows":
+ * [
+ *     ['product', 'score', 'amount'],
+ *     ['Matcha Latte', 89.3, 95.8],
+ *     ['Milk Tea', 92.1, 89.4],
+ *     ['Cheese Cocoa', 94.4, 91.2],
+ *     ['Walnut Brownie', 85.4, 76.9]
+ * ]
+ *
+ * + "objectRows":
+ * [
+ *     {product: 'Matcha Latte', score: 89.3, amount: 95.8},
+ *     {product: 'Milk Tea', score: 92.1, amount: 89.4},
+ *     {product: 'Cheese Cocoa', score: 94.4, amount: 91.2},
+ *     {product: 'Walnut Brownie', score: 85.4, amount: 76.9}
+ * ]
+ *
+ * + "keyedColumns":
+ * {
+ *     'product': ['Matcha Latte', 'Milk Tea', 'Cheese Cocoa', 'Walnut Brownie'],
+ *     'count': [823, 235, 1042, 988],
+ *     'score': [95.8, 81.4, 91.2, 76.9]
+ * }
+ *
+ * + "typedArray"
+ *
+ * + "unknown"
+ */
+
+/**
+ * @constructor
+ * @param {Object} fields
+ * @param {string} fields.sourceFormat
+ * @param {Array|Object} fields.fromDataset
+ * @param {Array|Object} [fields.data]
+ * @param {string} [seriesLayoutBy='column']
+ * @param {Array.<Object|string>} [dimensionsDefine]
+ * @param {Objet|HashMap} [encodeDefine]
+ * @param {number} [startIndex=0]
+ * @param {number} [dimensionsDetectCount]
+ */
+
+function Source(fields) {
+  /**
+   * @type {boolean}
+   */
+  this.fromDataset = fields.fromDataset;
+  /**
+   * Not null/undefined.
+   * @type {Array|Object}
+   */
+
+  this.data = fields.data || (fields.sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS ? {} : []);
+  /**
+   * See also "detectSourceFormat".
+   * Not null/undefined.
+   * @type {string}
+   */
+
+  this.sourceFormat = fields.sourceFormat || SOURCE_FORMAT_UNKNOWN;
+  /**
+   * 'row' or 'column'
+   * Not null/undefined.
+   * @type {string} seriesLayoutBy
+   */
+
+  this.seriesLayoutBy = fields.seriesLayoutBy || SERIES_LAYOUT_BY_COLUMN;
+  /**
+   * dimensions definition in option.
+   * can be null/undefined.
+   * @type {Array.<Object|string>}
+   */
+
+  this.dimensionsDefine = fields.dimensionsDefine;
+  /**
+   * encode definition in option.
+   * can be null/undefined.
+   * @type {Objet|HashMap}
+   */
+
+  this.encodeDefine = fields.encodeDefine && createHashMap(fields.encodeDefine);
+  /**
+   * Not null/undefined, uint.
+   * @type {number}
+   */
+
+  this.startIndex = fields.startIndex || 0;
+  /**
+   * Can be null/undefined (when unknown), uint.
+   * @type {number}
+   */
+
+  this.dimensionsDetectCount = fields.dimensionsDetectCount;
+}
+/**
+ * Wrap original series data for some compatibility cases.
+ */
+
+
+Source.seriesDataToSource = function (data) {
+  return new Source({
+    data: data,
+    sourceFormat: isTypedArray(data) ? SOURCE_FORMAT_TYPED_ARRAY : SOURCE_FORMAT_ORIGINAL,
+    fromDataset: false
+  });
+};
+
+enableClassCheck(Source);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var inner$3 = makeInner();
+/**
+ * @see {module:echarts/data/Source}
+ * @param {module:echarts/component/dataset/DatasetModel} datasetModel
+ * @return {string} sourceFormat
+ */
+
+function detectSourceFormat(datasetModel) {
+  var data = datasetModel.option.source;
+  var sourceFormat = SOURCE_FORMAT_UNKNOWN;
+
+  if (isTypedArray(data)) {
+    sourceFormat = SOURCE_FORMAT_TYPED_ARRAY;
+  } else if (isArray(data)) {
+    // FIXME Whether tolerate null in top level array?
+    if (data.length === 0) {
+      sourceFormat = SOURCE_FORMAT_ARRAY_ROWS;
+    }
+
+    for (var i = 0, len = data.length; i < len; i++) {
+      var item = data[i];
+
+      if (item == null) {
+        continue;
+      } else if (isArray(item)) {
+        sourceFormat = SOURCE_FORMAT_ARRAY_ROWS;
+        break;
+      } else if (isObject$1(item)) {
+        sourceFormat = SOURCE_FORMAT_OBJECT_ROWS;
+        break;
+      }
+    }
+  } else if (isObject$1(data)) {
+    for (var key in data) {
+      if (data.hasOwnProperty(key) && isArrayLike(data[key])) {
+        sourceFormat = SOURCE_FORMAT_KEYED_COLUMNS;
+        break;
+      }
+    }
+  } else if (data != null) {
+    throw new Error('Invalid data');
+  }
+
+  inner$3(datasetModel).sourceFormat = sourceFormat;
+}
+/**
+ * [Scenarios]:
+ * (1) Provide source data directly:
+ *     series: {
+ *         encode: {...},
+ *         dimensions: [...]
+ *         seriesLayoutBy: 'row',
+ *         data: [[...]]
+ *     }
+ * (2) Refer to datasetModel.
+ *     series: [{
+ *         encode: {...}
+ *         // Ignore datasetIndex means `datasetIndex: 0`
+ *         // and the dimensions defination in dataset is used
+ *     }, {
+ *         encode: {...},
+ *         seriesLayoutBy: 'column',
+ *         datasetIndex: 1
+ *     }]
+ *
+ * Get data from series itself or datset.
+ * @return {module:echarts/data/Source} source
+ */
+
+function getSource(seriesModel) {
+  return inner$3(seriesModel).source;
+}
+/**
+ * MUST be called before mergeOption of all series.
+ * @param {module:echarts/model/Global} ecModel
+ */
+
+function resetSourceDefaulter(ecModel) {
+  // `datasetMap` is used to make default encode.
+  inner$3(ecModel).datasetMap = createHashMap();
+}
+/**
+ * [Caution]:
+ * MUST be called after series option merged and
+ * before "series.getInitailData()" called.
+ *
+ * [The rule of making default encode]:
+ * Category axis (if exists) alway map to the first dimension.
+ * Each other axis occupies a subsequent dimension.
+ *
+ * [Why make default encode]:
+ * Simplify the typing of encode in option, avoiding the case like that:
+ * series: [{encode: {x: 0, y: 1}}, {encode: {x: 0, y: 2}}, {encode: {x: 0, y: 3}}],
+ * where the "y" have to be manually typed as "1, 2, 3, ...".
+ *
+ * @param {module:echarts/model/Series} seriesModel
+ */
+
+function prepareSource(seriesModel) {
+  var seriesOption = seriesModel.option;
+  var data = seriesOption.data;
+  var sourceFormat = isTypedArray(data) ? SOURCE_FORMAT_TYPED_ARRAY : SOURCE_FORMAT_ORIGINAL;
+  var fromDataset = false;
+  var seriesLayoutBy = seriesOption.seriesLayoutBy;
+  var sourceHeader = seriesOption.sourceHeader;
+  var dimensionsDefine = seriesOption.dimensions;
+  var datasetModel = getDatasetModel(seriesModel);
+
+  if (datasetModel) {
+    var datasetOption = datasetModel.option;
+    data = datasetOption.source;
+    sourceFormat = inner$3(datasetModel).sourceFormat;
+    fromDataset = true; // These settings from series has higher priority.
+
+    seriesLayoutBy = seriesLayoutBy || datasetOption.seriesLayoutBy;
+    sourceHeader == null && (sourceHeader = datasetOption.sourceHeader);
+    dimensionsDefine = dimensionsDefine || datasetOption.dimensions;
+  }
+
+  var completeResult = completeBySourceData(data, sourceFormat, seriesLayoutBy, sourceHeader, dimensionsDefine); // Note: dataset option does not have `encode`.
+
+  var encodeDefine = seriesOption.encode;
+
+  if (!encodeDefine && datasetModel) {
+    encodeDefine = makeDefaultEncode(seriesModel, datasetModel, data, sourceFormat, seriesLayoutBy, completeResult);
+  }
+
+  inner$3(seriesModel).source = new Source({
+    data: data,
+    fromDataset: fromDataset,
+    seriesLayoutBy: seriesLayoutBy,
+    sourceFormat: sourceFormat,
+    dimensionsDefine: completeResult.dimensionsDefine,
+    startIndex: completeResult.startIndex,
+    dimensionsDetectCount: completeResult.dimensionsDetectCount,
+    encodeDefine: encodeDefine
+  });
+} // return {startIndex, dimensionsDefine, dimensionsCount}
+
+function completeBySourceData(data, sourceFormat, seriesLayoutBy, sourceHeader, dimensionsDefine) {
+  if (!data) {
+    return {
+      dimensionsDefine: normalizeDimensionsDefine(dimensionsDefine)
+    };
+  }
+
+  var dimensionsDetectCount;
+  var startIndex;
+  var findPotentialName;
+
+  if (sourceFormat === SOURCE_FORMAT_ARRAY_ROWS) {
+    // Rule: Most of the first line are string: it is header.
+    // Caution: consider a line with 5 string and 1 number,
+    // it still can not be sure it is a head, because the
+    // 5 string may be 5 values of category columns.
+    if (sourceHeader === 'auto' || sourceHeader == null) {
+      arrayRowsTravelFirst(function (val) {
+        // '-' is regarded as null/undefined.
+        if (val != null && val !== '-') {
+          if (isString(val)) {
+            startIndex == null && (startIndex = 1);
+          } else {
+            startIndex = 0;
+          }
+        } // 10 is an experience number, avoid long loop.
+
+      }, seriesLayoutBy, data, 10);
+    } else {
+      startIndex = sourceHeader ? 1 : 0;
+    }
+
+    if (!dimensionsDefine && startIndex === 1) {
+      dimensionsDefine = [];
+      arrayRowsTravelFirst(function (val, index) {
+        dimensionsDefine[index] = val != null ? val : '';
+      }, seriesLayoutBy, data);
+    }
+
+    dimensionsDetectCount = dimensionsDefine ? dimensionsDefine.length : seriesLayoutBy === SERIES_LAYOUT_BY_ROW ? data.length : data[0] ? data[0].length : null;
+  } else if (sourceFormat === SOURCE_FORMAT_OBJECT_ROWS) {
+    if (!dimensionsDefine) {
+      dimensionsDefine = objectRowsCollectDimensions(data);
+      findPotentialName = true;
+    }
+  } else if (sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS) {
+    if (!dimensionsDefine) {
+      dimensionsDefine = [];
+      findPotentialName = true;
+      each$1(data, function (colArr, key) {
+        dimensionsDefine.push(key);
+      });
+    }
+  } else if (sourceFormat === SOURCE_FORMAT_ORIGINAL) {
+    var value0 = getDataItemValue(data[0]);
+    dimensionsDetectCount = isArray(value0) && value0.length || 1;
+  } else if (sourceFormat === SOURCE_FORMAT_TYPED_ARRAY) {}
+
+  var potentialNameDimIndex;
+
+  if (findPotentialName) {
+    each$1(dimensionsDefine, function (dim, idx) {
+      if ((isObject$1(dim) ? dim.name : dim) === 'name') {
+        potentialNameDimIndex = idx;
+      }
+    });
+  }
+
+  return {
+    startIndex: startIndex,
+    dimensionsDefine: normalizeDimensionsDefine(dimensionsDefine),
+    dimensionsDetectCount: dimensionsDetectCount,
+    potentialNameDimIndex: potentialNameDimIndex // TODO: potentialIdDimIdx
+
+  };
+} // Consider dimensions defined like ['A', 'price', 'B', 'price', 'C', 'price'],
+// which is reasonable. But dimension name is duplicated.
+// Returns undefined or an array contains only object without null/undefiend or string.
+
+
+function normalizeDimensionsDefine(dimensionsDefine) {
+  if (!dimensionsDefine) {
+    // The meaning of null/undefined is different from empty array.
+    return;
+  }
+
+  var nameMap = createHashMap();
+  return map(dimensionsDefine, function (item, index) {
+    item = extend({}, isObject$1(item) ? item : {
+      name: item
+    }); // User can set null in dimensions.
+    // We dont auto specify name, othewise a given name may
+    // cause it be refered unexpectedly.
+
+    if (item.name == null) {
+      return item;
+    } // Also consider number form like 2012.
+
+
+    item.name += ''; // User may also specify displayName.
+    // displayName will always exists except user not
+    // specified or dim name is not specified or detected.
+    // (A auto generated dim name will not be used as
+    // displayName).
+
+    if (item.displayName == null) {
+      item.displayName = item.name;
+    }
+
+    var exist = nameMap.get(item.name);
+
+    if (!exist) {
+      nameMap.set(item.name, {
+        count: 1
+      });
+    } else {
+      item.name += '-' + exist.count++;
+    }
+
+    return item;
+  });
+}
+
+function arrayRowsTravelFirst(cb, seriesLayoutBy, data, maxLoop) {
+  maxLoop == null && (maxLoop = Infinity);
+
+  if (seriesLayoutBy === SERIES_LAYOUT_BY_ROW) {
+    for (var i = 0; i < data.length && i < maxLoop; i++) {
+      cb(data[i] ? data[i][0] : null, i);
+    }
+  } else {
+    var value0 = data[0] || [];
+
+    for (var i = 0; i < value0.length && i < maxLoop; i++) {
+      cb(value0[i], i);
+    }
+  }
+}
+
+function objectRowsCollectDimensions(data) {
+  var firstIndex = 0;
+  var obj;
+
+  while (firstIndex < data.length && !(obj = data[firstIndex++])) {} // jshint ignore: line
+
+
+  if (obj) {
+    var dimensions = [];
+    each$1(obj, function (value, key) {
+      dimensions.push(key);
+    });
+    return dimensions;
+  }
+} // ??? TODO merge to completedimensions, where also has
+// default encode making logic. And the default rule
+// should depends on series? consider 'map'.
+
+
+function makeDefaultEncode(seriesModel, datasetModel, data, sourceFormat, seriesLayoutBy, completeResult) {
+  var coordSysDefine = getCoordSysDefineBySeries(seriesModel);
+  var encode = {}; // var encodeTooltip = [];
+  // var encodeLabel = [];
+
+  var encodeItemName = [];
+  var encodeSeriesName = [];
+  var seriesType = seriesModel.subType; // ??? TODO refactor: provide by series itself.
+  // Consider the case: 'map' series is based on geo coordSys,
+  // 'graph', 'heatmap' can be based on cartesian. But can not
+  // give default rule simply here.
+
+  var nSeriesMap = createHashMap(['pie', 'map', 'funnel']);
+  var cSeriesMap = createHashMap(['line', 'bar', 'pictorialBar', 'scatter', 'effectScatter', 'candlestick', 'boxplot']); // Usually in this case series will use the first data
+  // dimension as the "value" dimension, or other default
+  // processes respectively.
+
+  if (coordSysDefine && cSeriesMap.get(seriesType) != null) {
+    var ecModel = seriesModel.ecModel;
+    var datasetMap = inner$3(ecModel).datasetMap;
+    var key = datasetModel.uid + '_' + seriesLayoutBy;
+    var datasetRecord = datasetMap.get(key) || datasetMap.set(key, {
+      categoryWayDim: 1,
+      valueWayDim: 0
+    }); // TODO
+    // Auto detect first time axis and do arrangement.
+
+    each$1(coordSysDefine.coordSysDims, function (coordDim) {
+      // In value way.
+      if (coordSysDefine.firstCategoryDimIndex == null) {
+        var dataDim = datasetRecord.valueWayDim++;
+        encode[coordDim] = dataDim; // ??? TODO give a better default series name rule?
+        // especially when encode x y specified.
+        // consider: when mutiple series share one dimension
+        // category axis, series name should better use
+        // the other dimsion name. On the other hand, use
+        // both dimensions name.
+
+        encodeSeriesName.push(dataDim); // encodeTooltip.push(dataDim);
+        // encodeLabel.push(dataDim);
+      } // In category way, category axis.
+      else if (coordSysDefine.categoryAxisMap.get(coordDim)) {
+          encode[coordDim] = 0;
+          encodeItemName.push(0);
+        } // In category way, non-category axis.
+        else {
+            var dataDim = datasetRecord.categoryWayDim++;
+            encode[coordDim] = dataDim; // encodeTooltip.push(dataDim);
+            // encodeLabel.push(dataDim);
+
+            encodeSeriesName.push(dataDim);
+          }
+    });
+  } // Do not make a complex rule! Hard to code maintain and not necessary.
+  // ??? TODO refactor: provide by series itself.
+  // [{name: ..., value: ...}, ...] like:
+  else if (nSeriesMap.get(seriesType) != null) {
+      // Find the first not ordinal. (5 is an experience value)
+      var firstNotOrdinal;
+
+      for (var i = 0; i < 5 && firstNotOrdinal == null; i++) {
+        if (!doGuessOrdinal(data, sourceFormat, seriesLayoutBy, completeResult.dimensionsDefine, completeResult.startIndex, i)) {
+          firstNotOrdinal = i;
+        }
+      }
+
+      if (firstNotOrdinal != null) {
+        encode.value = firstNotOrdinal;
+        var nameDimIndex = completeResult.potentialNameDimIndex || Math.max(firstNotOrdinal - 1, 0); // By default, label use itemName in charts.
+        // So we dont set encodeLabel here.
+
+        encodeSeriesName.push(nameDimIndex);
+        encodeItemName.push(nameDimIndex); // encodeTooltip.push(firstNotOrdinal);
+      }
+    } // encodeTooltip.length && (encode.tooltip = encodeTooltip);
+  // encodeLabel.length && (encode.label = encodeLabel);
+
+
+  encodeItemName.length && (encode.itemName = encodeItemName);
+  encodeSeriesName.length && (encode.seriesName = encodeSeriesName);
+  return encode;
+}
+/**
+ * If return null/undefined, indicate that should not use datasetModel.
+ */
+
+
+function getDatasetModel(seriesModel) {
+  var option = seriesModel.option; // Caution: consider the scenario:
+  // A dataset is declared and a series is not expected to use the dataset,
+  // and at the beginning `setOption({series: { noData })` (just prepare other
+  // option but no data), then `setOption({series: {data: [...]}); In this case,
+  // the user should set an empty array to avoid that dataset is used by default.
+
+  var thisData = option.data;
+
+  if (!thisData) {
+    return seriesModel.ecModel.getComponent('dataset', option.datasetIndex || 0);
+  }
+}
+/**
+ * The rule should not be complex, otherwise user might not
+ * be able to known where the data is wrong.
+ * The code is ugly, but how to make it neat?
+ *
+ * @param {module:echars/data/Source} source
+ * @param {number} dimIndex
+ * @return {boolean} Whether ordinal.
+ */
+
+
+function guessOrdinal(source, dimIndex) {
+  return doGuessOrdinal(source.data, source.sourceFormat, source.seriesLayoutBy, source.dimensionsDefine, source.startIndex, dimIndex);
+} // dimIndex may be overflow source data.
+
+function doGuessOrdinal(data, sourceFormat, seriesLayoutBy, dimensionsDefine, startIndex, dimIndex) {
+  var result; // Experience value.
+
+  var maxLoop = 5;
+
+  if (isTypedArray(data)) {
+    return false;
+  } // When sourceType is 'objectRows' or 'keyedColumns', dimensionsDefine
+  // always exists in source.
+
+
+  var dimName;
+
+  if (dimensionsDefine) {
+    dimName = dimensionsDefine[dimIndex];
+    dimName = isObject$1(dimName) ? dimName.name : dimName;
+  }
+
+  if (sourceFormat === SOURCE_FORMAT_ARRAY_ROWS) {
+    if (seriesLayoutBy === SERIES_LAYOUT_BY_ROW) {
+      var sample = data[dimIndex];
+
+      for (var i = 0; i < (sample || []).length && i < maxLoop; i++) {
+        if ((result = detectValue(sample[startIndex + i])) != null) {
+          return result;
+        }
+      }
+    } else {
+      for (var i = 0; i < data.length && i < maxLoop; i++) {
+        var row = data[startIndex + i];
+
+        if (row && (result = detectValue(row[dimIndex])) != null) {
+          return result;
+        }
+      }
+    }
+  } else if (sourceFormat === SOURCE_FORMAT_OBJECT_ROWS) {
+    if (!dimName) {
+      return;
+    }
+
+    for (var i = 0; i < data.length && i < maxLoop; i++) {
+      var item = data[i];
+
+      if (item && (result = detectValue(item[dimName])) != null) {
+        return result;
+      }
+    }
+  } else if (sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS) {
+    if (!dimName) {
+      return;
+    }
+
+    var sample = data[dimName];
+
+    if (!sample || isTypedArray(sample)) {
+      return false;
+    }
+
+    for (var i = 0; i < sample.length && i < maxLoop; i++) {
+      if ((result = detectValue(sample[i])) != null) {
+        return result;
+      }
+    }
+  } else if (sourceFormat === SOURCE_FORMAT_ORIGINAL) {
+    for (var i = 0; i < data.length && i < maxLoop; i++) {
+      var item = data[i];
+      var val = getDataItemValue(item);
+
+      if (!isArray(val)) {
+        return false;
+      }
+
+      if ((result = detectValue(val[dimIndex])) != null) {
+        return result;
+      }
+    }
+  }
+
+  function detectValue(val) {
+    // Consider usage convenience, '1', '2' will be treated as "number".
+    // `isFinit('')` get `true`.
+    if (val != null && isFinite(val) && val !== '') {
+      return false;
+    } else if (isString(val) && val !== '-') {
+      return true;
+    }
+  }
+
+  return false;
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * ECharts global model
+ *
+ * @module {echarts/model/Global}
+ */
+
+/**
+ * Caution: If the mechanism should be changed some day, these cases
+ * should be considered:
+ *
+ * (1) In `merge option` mode, if using the same option to call `setOption`
+ * many times, the result should be the same (try our best to ensure that).
+ * (2) In `merge option` mode, if a component has no id/name specified, it
+ * will be merged by index, and the result sequence of the components is
+ * consistent to the original sequence.
+ * (3) `reset` feature (in toolbox). Find detailed info in comments about
+ * `mergeOption` in module:echarts/model/OptionManager.
+ */
+var OPTION_INNER_KEY = '\0_ec_inner';
+/**
+ * @alias module:echarts/model/Global
+ *
+ * @param {Object} option
+ * @param {module:echarts/model/Model} parentModel
+ * @param {Object} theme
+ */
+
+var GlobalModel = Model.extend({
+  init: function (option, parentModel, theme, optionManager) {
+    theme = theme || {};
+    this.option = null; // Mark as not initialized.
+
+    /**
+     * @type {module:echarts/model/Model}
+     * @private
+     */
+
+    this._theme = new Model(theme);
+    /**
+     * @type {module:echarts/model/OptionManager}
+     */
+
+    this._optionManager = optionManager;
+  },
+  setOption: function (option, optionPreprocessorFuncs) {
+    assert$1(!(OPTION_INNER_KEY in option), 'please use chart.getOption()');
+
+    this._optionManager.setOption(option, optionPreprocessorFuncs);
+
+    this.resetOption(null);
+  },
+
+  /**
+   * @param {string} type null/undefined: reset all.
+   *                      'recreate': force recreate all.
+   *                      'timeline': only reset timeline option
+   *                      'media': only reset media query option
+   * @return {boolean} Whether option changed.
+   */
+  resetOption: function (type) {
+    var optionChanged = false;
+    var optionManager = this._optionManager;
+
+    if (!type || type === 'recreate') {
+      var baseOption = optionManager.mountOption(type === 'recreate');
+
+      if (!this.option || type === 'recreate') {
+        initBase.call(this, baseOption);
+      } else {
+        this.restoreData();
+        this.mergeOption(baseOption);
+      }
+
+      optionChanged = true;
+    }
+
+    if (type === 'timeline' || type === 'media') {
+      this.restoreData();
+    }
+
+    if (!type || type === 'recreate' || type === 'timeline') {
+      var timelineOption = optionManager.getTimelineOption(this);
+      timelineOption && (this.mergeOption(timelineOption), optionChanged = true);
+    }
+
+    if (!type || type === 'recreate' || type === 'media') {
+      var mediaOptions = optionManager.getMediaOption(this, this._api);
+
+      if (mediaOptions.length) {
+        each$1(mediaOptions, function (mediaOption) {
+          this.mergeOption(mediaOption, optionChanged = true);
+        }, this);
+      }
+    }
+
+    return optionChanged;
+  },
+
+  /**
+   * @protected
+   */
+  mergeOption: function (newOption) {
+    var option = this.option;
+    var componentsMap = this._componentsMap;
+    var newCptTypes = [];
+    resetSourceDefaulter(this); // If no component class, merge directly.
+    // For example: color, animaiton options, etc.
+
+    each$1(newOption, function (componentOption, mainType) {
+      if (componentOption == null) {
+        return;
+      }
+
+      if (!ComponentModel.hasClass(mainType)) {
+        // globalSettingTask.dirty();
+        option[mainType] = option[mainType] == null ? clone(componentOption) : merge(option[mainType], componentOption, true);
+      } else if (mainType) {
+        newCptTypes.push(mainType);
+      }
+    });
+    ComponentModel.topologicalTravel(newCptTypes, ComponentModel.getAllClassMainTypes(), visitComponent, this);
+
+    function visitComponent(mainType, dependencies) {
+      var newCptOptionList = normalizeToArray(newOption[mainType]);
+      var mapResult = mappingToExists(componentsMap.get(mainType), newCptOptionList);
+      makeIdAndName(mapResult); // Set mainType and complete subType.
+
+      each$1(mapResult, function (item, index) {
+        var opt = item.option;
+
+        if (isObject$1(opt)) {
+          item.keyInfo.mainType = mainType;
+          item.keyInfo.subType = determineSubType(mainType, opt, item.exist);
+        }
+      });
+      var dependentModels = getComponentsByTypes(componentsMap, dependencies);
+      option[mainType] = [];
+      componentsMap.set(mainType, []);
+      each$1(mapResult, function (resultItem, index) {
+        var componentModel = resultItem.exist;
+        var newCptOption = resultItem.option;
+        assert$1(isObject$1(newCptOption) || componentModel, 'Empty component definition'); // Consider where is no new option and should be merged using {},
+        // see removeEdgeAndAdd in topologicalTravel and
+        // ComponentModel.getAllClassMainTypes.
+
+        if (!newCptOption) {
+          componentModel.mergeOption({}, this);
+          componentModel.optionUpdated({}, false);
+        } else {
+          var ComponentModelClass = ComponentModel.getClass(mainType, resultItem.keyInfo.subType, true);
+
+          if (componentModel && componentModel instanceof ComponentModelClass) {
+            componentModel.name = resultItem.keyInfo.name; // componentModel.settingTask && componentModel.settingTask.dirty();
+
+            componentModel.mergeOption(newCptOption, this);
+            componentModel.optionUpdated(newCptOption, false);
+          } else {
+            // PENDING Global as parent ?
+            var extraOpt = extend({
+              dependentModels: dependentModels,
+              componentIndex: index
+            }, resultItem.keyInfo);
+            componentModel = new ComponentModelClass(newCptOption, this, this, extraOpt);
+            extend(componentModel, extraOpt);
+            componentModel.init(newCptOption, this, this, extraOpt); // Call optionUpdated after init.
+            // newCptOption has been used as componentModel.option
+            // and may be merged with theme and default, so pass null
+            // to avoid confusion.
+
+            componentModel.optionUpdated(null, true);
+          }
+        }
+
+        componentsMap.get(mainType)[index] = componentModel;
+        option[mainType][index] = componentModel.option;
+      }, this); // Backup series for filtering.
+
+      if (mainType === 'series') {
+        createSeriesIndices(this, componentsMap.get('series'));
+      }
+    }
+
+    this._seriesIndicesMap = createHashMap(this._seriesIndices = this._seriesIndices || []);
+  },
+
+  /**
+   * Get option for output (cloned option and inner info removed)
+   * @public
+   * @return {Object}
+   */
+  getOption: function () {
+    var option = clone(this.option);
+    each$1(option, function (opts, mainType) {
+      if (ComponentModel.hasClass(mainType)) {
+        var opts = normalizeToArray(opts);
+
+        for (var i = opts.length - 1; i >= 0; i--) {
+          // Remove options with inner id.
+          if (isIdInner(opts[i])) {
+            opts.splice(i, 1);
+          }
+        }
+
+        option[mainType] = opts;
+      }
+    });
+    delete option[OPTION_INNER_KEY];
+    return option;
+  },
+
+  /**
+   * @return {module:echarts/model/Model}
+   */
+  getTheme: function () {
+    return this._theme;
+  },
+
+  /**
+   * @param {string} mainType
+   * @param {number} [idx=0]
+   * @return {module:echarts/model/Component}
+   */
+  getComponent: function (mainType, idx) {
+    var list = this._componentsMap.get(mainType);
+
+    if (list) {
+      return list[idx || 0];
+    }
+  },
+
+  /**
+   * If none of index and id and name used, return all components with mainType.
+   * @param {Object} condition
+   * @param {string} condition.mainType
+   * @param {string} [condition.subType] If ignore, only query by mainType
+   * @param {number|Array.<number>} [condition.index] Either input index or id or name.
+   * @param {string|Array.<string>} [condition.id] Either input index or id or name.
+   * @param {string|Array.<string>} [condition.name] Either input index or id or name.
+   * @return {Array.<module:echarts/model/Component>}
+   */
+  queryComponents: function (condition) {
+    var mainType = condition.mainType;
+
+    if (!mainType) {
+      return [];
+    }
+
+    var index = condition.index;
+    var id = condition.id;
+    var name = condition.name;
+
+    var cpts = this._componentsMap.get(mainType);
+
+    if (!cpts || !cpts.length) {
+      return [];
+    }
+
+    var result;
+
+    if (index != null) {
+      if (!isArray(index)) {
+        index = [index];
+      }
+
+      result = filter(map(index, function (idx) {
+        return cpts[idx];
+      }), function (val) {
+        return !!val;
+      });
+    } else if (id != null) {
+      var isIdArray = isArray(id);
+      result = filter(cpts, function (cpt) {
+        return isIdArray && indexOf(id, cpt.id) >= 0 || !isIdArray && cpt.id === id;
+      });
+    } else if (name != null) {
+      var isNameArray = isArray(name);
+      result = filter(cpts, function (cpt) {
+        return isNameArray && indexOf(name, cpt.name) >= 0 || !isNameArray && cpt.name === name;
+      });
+    } else {
+      // Return all components with mainType
+      result = cpts.slice();
+    }
+
+    return filterBySubType(result, condition);
+  },
+
+  /**
+   * The interface is different from queryComponents,
+   * which is convenient for inner usage.
+   *
+   * @usage
+   * var result = findComponents(
+   *     {mainType: 'dataZoom', query: {dataZoomId: 'abc'}}
+   * );
+   * var result = findComponents(
+   *     {mainType: 'series', subType: 'pie', query: {seriesName: 'uio'}}
+   * );
+   * var result = findComponents(
+   *     {mainType: 'series'},
+   *     function (model, index) {...}
+   * );
+   * // result like [component0, componnet1, ...]
+   *
+   * @param {Object} condition
+   * @param {string} condition.mainType Mandatory.
+   * @param {string} [condition.subType] Optional.
+   * @param {Object} [condition.query] like {xxxIndex, xxxId, xxxName},
+   *        where xxx is mainType.
+   *        If query attribute is null/undefined or has no index/id/name,
+   *        do not filtering by query conditions, which is convenient for
+   *        no-payload situations or when target of action is global.
+   * @param {Function} [condition.filter] parameter: component, return boolean.
+   * @return {Array.<module:echarts/model/Component>}
+   */
+  findComponents: function (condition) {
+    var query = condition.query;
+    var mainType = condition.mainType;
+    var queryCond = getQueryCond(query);
+    var result = queryCond ? this.queryComponents(queryCond) : this._componentsMap.get(mainType);
+    return doFilter(filterBySubType(result, condition));
+
+    function getQueryCond(q) {
+      var indexAttr = mainType + 'Index';
+      var idAttr = mainType + 'Id';
+      var nameAttr = mainType + 'Name';
+      return q && (q[indexAttr] != null || q[idAttr] != null || q[nameAttr] != null) ? {
+        mainType: mainType,
+        // subType will be filtered finally.
+        index: q[indexAttr],
+        id: q[idAttr],
+        name: q[nameAttr]
+      } : null;
+    }
+
+    function doFilter(res) {
+      return condition.filter ? filter(res, condition.filter) : res;
+    }
+  },
+
+  /**
+   * @usage
+   * eachComponent('legend', function (legendModel, index) {
+   *     ...
+   * });
+   * eachComponent(function (componentType, model, index) {
+   *     // componentType does not include subType
+   *     // (componentType is 'xxx' but not 'xxx.aa')
+   * });
+   * eachComponent(
+   *     {mainType: 'dataZoom', query: {dataZoomId: 'abc'}},
+   *     function (model, index) {...}
+   * );
+   * eachComponent(
+   *     {mainType: 'series', subType: 'pie', query: {seriesName: 'uio'}},
+   *     function (model, index) {...}
+   * );
+   *
+   * @param {string|Object=} mainType When mainType is object, the definition
+   *                                  is the same as the method 'findComponents'.
+   * @param {Function} cb
+   * @param {*} context
+   */
+  eachComponent: function (mainType, cb, context) {
+    var componentsMap = this._componentsMap;
+
+    if (typeof mainType === 'function') {
+      context = cb;
+      cb = mainType;
+      componentsMap.each(function (components, componentType) {
+        each$1(components, function (component, index) {
+          cb.call(context, componentType, component, index);
+        });
+      });
+    } else if (isString(mainType)) {
+      each$1(componentsMap.get(mainType), cb, context);
+    } else if (isObject$1(mainType)) {
+      var queryResult = this.findComponents(mainType);
+      each$1(queryResult, cb, context);
+    }
+  },
+
+  /**
+   * @param {string} name
+   * @return {Array.<module:echarts/model/Series>}
+   */
+  getSeriesByName: function (name) {
+    var series = this._componentsMap.get('series');
+
+    return filter(series, function (oneSeries) {
+      return oneSeries.name === name;
+    });
+  },
+
+  /**
+   * @param {number} seriesIndex
+   * @return {module:echarts/model/Series}
+   */
+  getSeriesByIndex: function (seriesIndex) {
+    return this._componentsMap.get('series')[seriesIndex];
+  },
+
+  /**
+   * Get series list before filtered by type.
+   * FIXME: rename to getRawSeriesByType?
+   *
+   * @param {string} subType
+   * @return {Array.<module:echarts/model/Series>}
+   */
+  getSeriesByType: function (subType) {
+    var series = this._componentsMap.get('series');
+
+    return filter(series, function (oneSeries) {
+      return oneSeries.subType === subType;
+    });
+  },
+
+  /**
+   * @return {Array.<module:echarts/model/Series>}
+   */
+  getSeries: function () {
+    return this._componentsMap.get('series').slice();
+  },
+
+  /**
+   * @return {number}
+   */
+  getSeriesCount: function () {
+    return this._componentsMap.get('series').length;
+  },
+
+  /**
+   * After filtering, series may be different
+   * frome raw series.
+   *
+   * @param {Function} cb
+   * @param {*} context
+   */
+  eachSeries: function (cb, context) {
+    each$1(this._seriesIndices, function (rawSeriesIndex) {
+      var series = this._componentsMap.get('series')[rawSeriesIndex];
+
+      cb.call(context, series, rawSeriesIndex);
+    }, this);
+  },
+
+  /**
+   * Iterate raw series before filtered.
+   *
+   * @param {Function} cb
+   * @param {*} context
+   */
+  eachRawSeries: function (cb, context) {
+    each$1(this._componentsMap.get('series'), cb, context);
+  },
+
+  /**
+   * After filtering, series may be different.
+   * frome raw series.
+   *
+   * @parma {string} subType
+   * @param {Function} cb
+   * @param {*} context
+   */
+  eachSeriesByType: function (subType, cb, context) {
+    each$1(this._seriesIndices, function (rawSeriesIndex) {
+      var series = this._componentsMap.get('series')[rawSeriesIndex];
+
+      if (series.subType === subType) {
+        cb.call(context, series, rawSeriesIndex);
+      }
+    }, this);
+  },
+
+  /**
+   * Iterate raw series before filtered of given type.
+   *
+   * @parma {string} subType
+   * @param {Function} cb
+   * @param {*} context
+   */
+  eachRawSeriesByType: function (subType, cb, context) {
+    return each$1(this.getSeriesByType(subType), cb, context);
+  },
+
+  /**
+   * @param {module:echarts/model/Series} seriesModel
+   */
+  isSeriesFiltered: function (seriesModel) {
+    return this._seriesIndicesMap.get(seriesModel.componentIndex) == null;
+  },
+
+  /**
+   * @return {Array.<number>}
+   */
+  getCurrentSeriesIndices: function () {
+    return (this._seriesIndices || []).slice();
+  },
+
+  /**
+   * @param {Function} cb
+   * @param {*} context
+   */
+  filterSeries: function (cb, context) {
+    var filteredSeries = filter(this._componentsMap.get('series'), cb, context);
+    createSeriesIndices(this, filteredSeries);
+  },
+  restoreData: function (payload) {
+    var componentsMap = this._componentsMap;
+    createSeriesIndices(this, componentsMap.get('series'));
+    var componentTypes = [];
+    componentsMap.each(function (components, componentType) {
+      componentTypes.push(componentType);
+    });
+    ComponentModel.topologicalTravel(componentTypes, ComponentModel.getAllClassMainTypes(), function (componentType, dependencies) {
+      each$1(componentsMap.get(componentType), function (component) {
+        (componentType !== 'series' || !isNotTargetSeries(component, payload)) && component.restoreData();
+      });
+    });
+  }
+});
+
+function isNotTargetSeries(seriesModel, payload) {
+  if (payload) {
+    var index = payload.seiresIndex;
+    var id = payload.seriesId;
+    var name = payload.seriesName;
+    return index != null && seriesModel.componentIndex !== index || id != null && seriesModel.id !== id || name != null && seriesModel.name !== name;
+  }
+}
+/**
+ * @inner
+ */
+
+
+function mergeTheme(option, theme) {
+  // PENDING
+  // NOT use `colorLayer` in theme if option has `color`
+  var notMergeColorLayer = option.color && !option.colorLayer;
+  each$1(theme, function (themeItem, name) {
+    if (name === 'colorLayer' && notMergeColorLayer) {
+      return;
+    } // 濡傛灉鏈� component model 鍒欐妸鍏蜂綋鐨� merge 閫昏緫浜ょ粰璇� model 澶勭悊
+
+
+    if (!ComponentModel.hasClass(name)) {
+      if (typeof themeItem === 'object') {
+        option[name] = !option[name] ? clone(themeItem) : merge(option[name], themeItem, false);
+      } else {
+        if (option[name] == null) {
+          option[name] = themeItem;
+        }
+      }
+    }
+  });
+}
+
+function initBase(baseOption) {
+  baseOption = baseOption; // Using OPTION_INNER_KEY to mark that this option can not be used outside,
+  // i.e. `chart.setOption(chart.getModel().option);` is forbiden.
+
+  this.option = {};
+  this.option[OPTION_INNER_KEY] = 1;
+  /**
+   * Init with series: [], in case of calling findSeries method
+   * before series initialized.
+   * @type {Object.<string, Array.<module:echarts/model/Model>>}
+   * @private
+   */
+
+  this._componentsMap = createHashMap({
+    series: []
+  });
+  /**
+   * Mapping between filtered series list and raw series list.
+   * key: filtered series indices, value: raw series indices.
+   * @type {Array.<nubmer>}
+   * @private
+   */
+
+  this._seriesIndices;
+  this._seriesIndicesMap;
+  mergeTheme(baseOption, this._theme.option); // TODO Needs clone when merging to the unexisted property
+
+  merge(baseOption, globalDefault, false);
+  this.mergeOption(baseOption);
+}
+/**
+ * @inner
+ * @param {Array.<string>|string} types model types
+ * @return {Object} key: {string} type, value: {Array.<Object>} models
+ */
+
+
+function getComponentsByTypes(componentsMap, types) {
+  if (!isArray(types)) {
+    types = types ? [types] : [];
+  }
+
+  var ret = {};
+  each$1(types, function (type) {
+    ret[type] = (componentsMap.get(type) || []).slice();
+  });
+  return ret;
+}
+/**
+ * @inner
+ */
+
+
+function determineSubType(mainType, newCptOption, existComponent) {
+  var subType = newCptOption.type ? newCptOption.type : existComponent ? existComponent.subType // Use determineSubType only when there is no existComponent.
+  : ComponentModel.determineSubType(mainType, newCptOption); // tooltip, markline, markpoint may always has no subType
+
+  return subType;
+}
+/**
+ * @inner
+ */
+
+
+function createSeriesIndices(ecModel, seriesModels) {
+  ecModel._seriesIndicesMap = createHashMap(ecModel._seriesIndices = map(seriesModels, function (series) {
+    return series.componentIndex;
+  }) || []);
+}
+/**
+ * @inner
+ */
+
+
+function filterBySubType(components, condition) {
+  // Using hasOwnProperty for restrict. Consider
+  // subType is undefined in user payload.
+  return condition.hasOwnProperty('subType') ? filter(components, function (cpt) {
+    return cpt.subType === condition.subType;
+  }) : components;
+}
+mixin(GlobalModel, colorPaletteMixin);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var echartsAPIList = ['getDom', 'getZr', 'getWidth', 'getHeight', 'getDevicePixelRatio', 'dispatchAction', 'isDisposed', 'on', 'off', 'getDataURL', 'getConnectedDataURL', 'getModel', 'getOption', 'getViewOfComponentModel', 'getViewOfSeriesModel']; // And `getCoordinateSystems` and `getComponentByElement` will be injected in echarts.js
+
+function ExtensionAPI(chartInstance) {
+  each$1(echartsAPIList, function (name) {
+    this[name] = bind(chartInstance[name], chartInstance);
+  }, this);
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var coordinateSystemCreators = {};
+
+function CoordinateSystemManager() {
+  this._coordinateSystems = [];
+}
+
+CoordinateSystemManager.prototype = {
+  constructor: CoordinateSystemManager,
+  create: function (ecModel, api) {
+    var coordinateSystems = [];
+    each$1(coordinateSystemCreators, function (creater, type) {
+      var list = creater.create(ecModel, api);
+      coordinateSystems = coordinateSystems.concat(list || []);
+    });
+    this._coordinateSystems = coordinateSystems;
+  },
+  update: function (ecModel, api) {
+    each$1(this._coordinateSystems, function (coordSys) {
+      coordSys.update && coordSys.update(ecModel, api);
+    });
+  },
+  getCoordinateSystems: function () {
+    return this._coordinateSystems.slice();
+  }
+};
+
+CoordinateSystemManager.register = function (type, coordinateSystemCreator) {
+  coordinateSystemCreators[type] = coordinateSystemCreator;
+};
+
+CoordinateSystemManager.get = function (type) {
+  return coordinateSystemCreators[type];
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * ECharts option manager
+ *
+ * @module {echarts/model/OptionManager}
+ */
+var each$4 = each$1;
+var clone$3 = clone;
+var map$1 = map;
+var merge$1 = merge;
+var QUERY_REG = /^(min|max)?(.+)$/;
+/**
+ * TERM EXPLANATIONS:
+ *
+ * [option]:
+ *
+ *     An object that contains definitions of components. For example:
+ *     var option = {
+ *         title: {...},
+ *         legend: {...},
+ *         visualMap: {...},
+ *         series: [
+ *             {data: [...]},
+ *             {data: [...]},
+ *             ...
+ *         ]
+ *     };
+ *
+ * [rawOption]:
+ *
+ *     An object input to echarts.setOption. 'rawOption' may be an
+ *     'option', or may be an object contains multi-options. For example:
+ *     var option = {
+ *         baseOption: {
+ *             title: {...},
+ *             legend: {...},
+ *             series: [
+ *                 {data: [...]},
+ *                 {data: [...]},
+ *                 ...
+ *             ]
+ *         },
+ *         timeline: {...},
+ *         options: [
+ *             {title: {...}, series: {data: [...]}},
+ *             {title: {...}, series: {data: [...]}},
+ *             ...
+ *         ],
+ *         media: [
+ *             {
+ *                 query: {maxWidth: 320},
+ *                 option: {series: {x: 20}, visualMap: {show: false}}
+ *             },
+ *             {
+ *                 query: {minWidth: 320, maxWidth: 720},
+ *                 option: {series: {x: 500}, visualMap: {show: true}}
+ *             },
+ *             {
+ *                 option: {series: {x: 1200}, visualMap: {show: true}}
+ *             }
+ *         ]
+ *     };
+ *
+ * @alias module:echarts/model/OptionManager
+ * @param {module:echarts/ExtensionAPI} api
+ */
+
+function OptionManager(api) {
+  /**
+   * @private
+   * @type {module:echarts/ExtensionAPI}
+   */
+  this._api = api;
+  /**
+   * @private
+   * @type {Array.<number>}
+   */
+
+  this._timelineOptions = [];
+  /**
+   * @private
+   * @type {Array.<Object>}
+   */
+
+  this._mediaList = [];
+  /**
+   * @private
+   * @type {Object}
+   */
+
+  this._mediaDefault;
+  /**
+   * -1, means default.
+   * empty means no media.
+   * @private
+   * @type {Array.<number>}
+   */
+
+  this._currentMediaIndices = [];
+  /**
+   * @private
+   * @type {Object}
+   */
+
+  this._optionBackup;
+  /**
+   * @private
+   * @type {Object}
+   */
+
+  this._newBaseOption;
+} // timeline.notMerge is not supported in ec3. Firstly there is rearly
+// case that notMerge is needed. Secondly supporting 'notMerge' requires
+// rawOption cloned and backuped when timeline changed, which does no
+// good to performance. What's more, that both timeline and setOption
+// method supply 'notMerge' brings complex and some problems.
+// Consider this case:
+// (step1) chart.setOption({timeline: {notMerge: false}, ...}, false);
+// (step2) chart.setOption({timeline: {notMerge: true}, ...}, false);
+
+
+OptionManager.prototype = {
+  constructor: OptionManager,
+
+  /**
+   * @public
+   * @param {Object} rawOption Raw option.
+   * @param {module:echarts/model/Global} ecModel
+   * @param {Array.<Function>} optionPreprocessorFuncs
+   * @return {Object} Init option
+   */
+  setOption: function (rawOption, optionPreprocessorFuncs) {
+    if (rawOption) {
+      // That set dat primitive is dangerous if user reuse the data when setOption again.
+      each$1(normalizeToArray(rawOption.series), function (series) {
+        series && series.data && isTypedArray(series.data) && setAsPrimitive(series.data);
+      });
+    } // Caution: some series modify option data, if do not clone,
+    // it should ensure that the repeat modify correctly
+    // (create a new object when modify itself).
+
+
+    rawOption = clone$3(rawOption, true); // FIXME
+    // 濡傛灉 timeline options 鎴栬�� media 涓缃簡鏌愪釜灞炴�э紝鑰宐aseOption涓病鏈夎缃紝鍒欒繘琛岃鍛娿��
+
+    var oldOptionBackup = this._optionBackup;
+    var newParsedOption = parseRawOption.call(this, rawOption, optionPreprocessorFuncs, !oldOptionBackup);
+    this._newBaseOption = newParsedOption.baseOption; // For setOption at second time (using merge mode);
+
+    if (oldOptionBackup) {
+      // Only baseOption can be merged.
+      mergeOption(oldOptionBackup.baseOption, newParsedOption.baseOption); // For simplicity, timeline options and media options do not support merge,
+      // that is, if you `setOption` twice and both has timeline options, the latter
+      // timeline opitons will not be merged to the formers, but just substitude them.
+
+      if (newParsedOption.timelineOptions.length) {
+        oldOptionBackup.timelineOptions = newParsedOption.timelineOptions;
+      }
+
+      if (newParsedOption.mediaList.length) {
+        oldOptionBackup.mediaList = newParsedOption.mediaList;
+      }
+
+      if (newParsedOption.mediaDefault) {
+        oldOptionBackup.mediaDefault = newParsedOption.mediaDefault;
+      }
+    } else {
+      this._optionBackup = newParsedOption;
+    }
+  },
+
+  /**
+   * @param {boolean} isRecreate
+   * @return {Object}
+   */
+  mountOption: function (isRecreate) {
+    var optionBackup = this._optionBackup; // TODO
+    // 濡傛灉娌℃湁reset鍔熻兘鍒欎笉clone銆�
+
+    this._timelineOptions = map$1(optionBackup.timelineOptions, clone$3);
+    this._mediaList = map$1(optionBackup.mediaList, clone$3);
+    this._mediaDefault = clone$3(optionBackup.mediaDefault);
+    this._currentMediaIndices = [];
+    return clone$3(isRecreate // this._optionBackup.baseOption, which is created at the first `setOption`
+    // called, and is merged into every new option by inner method `mergeOption`
+    // each time `setOption` called, can be only used in `isRecreate`, because
+    // its reliability is under suspicion. In other cases option merge is
+    // performed by `model.mergeOption`.
+    ? optionBackup.baseOption : this._newBaseOption);
+  },
+
+  /**
+   * @param {module:echarts/model/Global} ecModel
+   * @return {Object}
+   */
+  getTimelineOption: function (ecModel) {
+    var option;
+    var timelineOptions = this._timelineOptions;
+
+    if (timelineOptions.length) {
+      // getTimelineOption can only be called after ecModel inited,
+      // so we can get currentIndex from timelineModel.
+      var timelineModel = ecModel.getComponent('timeline');
+
+      if (timelineModel) {
+        option = clone$3(timelineOptions[timelineModel.getCurrentIndex()], true);
+      }
+    }
+
+    return option;
+  },
+
+  /**
+   * @param {module:echarts/model/Global} ecModel
+   * @return {Array.<Object>}
+   */
+  getMediaOption: function (ecModel) {
+    var ecWidth = this._api.getWidth();
+
+    var ecHeight = this._api.getHeight();
+
+    var mediaList = this._mediaList;
+    var mediaDefault = this._mediaDefault;
+    var indices = [];
+    var result = []; // No media defined.
+
+    if (!mediaList.length && !mediaDefault) {
+      return result;
+    } // Multi media may be applied, the latter defined media has higher priority.
+
+
+    for (var i = 0, len = mediaList.length; i < len; i++) {
+      if (applyMediaQuery(mediaList[i].query, ecWidth, ecHeight)) {
+        indices.push(i);
+      }
+    } // FIXME
+    // 鏄惁mediaDefault搴旇寮哄埗鐢ㄦ埛璁剧疆锛屽惁鍒欏彲鑳戒慨鏀逛笉鑳藉洖褰掋��
+
+
+    if (!indices.length && mediaDefault) {
+      indices = [-1];
+    }
+
+    if (indices.length && !indicesEquals(indices, this._currentMediaIndices)) {
+      result = map$1(indices, function (index) {
+        return clone$3(index === -1 ? mediaDefault.option : mediaList[index].option);
+      });
+    } // Otherwise return nothing.
+
+
+    this._currentMediaIndices = indices;
+    return result;
+  }
+};
+
+function parseRawOption(rawOption, optionPreprocessorFuncs, isNew) {
+  var timelineOptions = [];
+  var mediaList = [];
+  var mediaDefault;
+  var baseOption; // Compatible with ec2.
+
+  var timelineOpt = rawOption.timeline;
+
+  if (rawOption.baseOption) {
+    baseOption = rawOption.baseOption;
+  } // For timeline
+
+
+  if (timelineOpt || rawOption.options) {
+    baseOption = baseOption || {};
+    timelineOptions = (rawOption.options || []).slice();
+  } // For media query
+
+
+  if (rawOption.media) {
+    baseOption = baseOption || {};
+    var media = rawOption.media;
+    each$4(media, function (singleMedia) {
+      if (singleMedia && singleMedia.option) {
+        if (singleMedia.query) {
+          mediaList.push(singleMedia);
+        } else if (!mediaDefault) {
+          // Use the first media default.
+          mediaDefault = singleMedia;
+        }
+      }
+    });
+  } // For normal option
+
+
+  if (!baseOption) {
+    baseOption = rawOption;
+  } // Set timelineOpt to baseOption in ec3,
+  // which is convenient for merge option.
+
+
+  if (!baseOption.timeline) {
+    baseOption.timeline = timelineOpt;
+  } // Preprocess.
+
+
+  each$4([baseOption].concat(timelineOptions).concat(map(mediaList, function (media) {
+    return media.option;
+  })), function (option) {
+    each$4(optionPreprocessorFuncs, function (preProcess) {
+      preProcess(option, isNew);
+    });
+  });
+  return {
+    baseOption: baseOption,
+    timelineOptions: timelineOptions,
+    mediaDefault: mediaDefault,
+    mediaList: mediaList
+  };
+}
+/**
+ * @see <http://www.w3.org/TR/css3-mediaqueries/#media1>
+ * Support: width, height, aspectRatio
+ * Can use max or min as prefix.
+ */
+
+
+function applyMediaQuery(query, ecWidth, ecHeight) {
+  var realMap = {
+    width: ecWidth,
+    height: ecHeight,
+    aspectratio: ecWidth / ecHeight // lowser case for convenientce.
+
+  };
+  var applicatable = true;
+  each$1(query, function (value, attr) {
+    var matched = attr.match(QUERY_REG);
+
+    if (!matched || !matched[1] || !matched[2]) {
+      return;
+    }
+
+    var operator = matched[1];
+    var realAttr = matched[2].toLowerCase();
+
+    if (!compare(realMap[realAttr], value, operator)) {
+      applicatable = false;
+    }
+  });
+  return applicatable;
+}
+
+function compare(real, expect, operator) {
+  if (operator === 'min') {
+    return real >= expect;
+  } else if (operator === 'max') {
+    return real <= expect;
+  } else {
+    // Equals
+    return real === expect;
+  }
+}
+
+function indicesEquals(indices1, indices2) {
+  // indices is always order by asc and has only finite number.
+  return indices1.join(',') === indices2.join(',');
+}
+/**
+ * Consider case:
+ * `chart.setOption(opt1);`
+ * Then user do some interaction like dataZoom, dataView changing.
+ * `chart.setOption(opt2);`
+ * Then user press 'reset button' in toolbox.
+ *
+ * After doing that all of the interaction effects should be reset, the
+ * chart should be the same as the result of invoke
+ * `chart.setOption(opt1); chart.setOption(opt2);`.
+ *
+ * Although it is not able ensure that
+ * `chart.setOption(opt1); chart.setOption(opt2);` is equivalents to
+ * `chart.setOption(merge(opt1, opt2));` exactly,
+ * this might be the only simple way to implement that feature.
+ *
+ * MEMO: We've considered some other approaches:
+ * 1. Each model handle its self restoration but not uniform treatment.
+ *     (Too complex in logic and error-prone)
+ * 2. Use a shadow ecModel. (Performace expensive)
+ */
+
+
+function mergeOption(oldOption, newOption) {
+  newOption = newOption || {};
+  each$4(newOption, function (newCptOpt, mainType) {
+    if (newCptOpt == null) {
+      return;
+    }
+
+    var oldCptOpt = oldOption[mainType];
+
+    if (!ComponentModel.hasClass(mainType)) {
+      oldOption[mainType] = merge$1(oldCptOpt, newCptOpt, true);
+    } else {
+      newCptOpt = normalizeToArray(newCptOpt);
+      oldCptOpt = normalizeToArray(oldCptOpt);
+      var mapResult = mappingToExists(oldCptOpt, newCptOpt);
+      oldOption[mainType] = map$1(mapResult, function (item) {
+        return item.option && item.exist ? merge$1(item.exist, item.option, true) : item.exist || item.option;
+      });
+    }
+  });
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var each$5 = each$1;
+var isObject$3 = isObject$1;
+var POSSIBLE_STYLES = ['areaStyle', 'lineStyle', 'nodeStyle', 'linkStyle', 'chordStyle', 'label', 'labelLine'];
+
+function compatEC2ItemStyle(opt) {
+  var itemStyleOpt = opt && opt.itemStyle;
+
+  if (!itemStyleOpt) {
+    return;
+  }
+
+  for (var i = 0, len = POSSIBLE_STYLES.length; i < len; i++) {
+    var styleName = POSSIBLE_STYLES[i];
+    var normalItemStyleOpt = itemStyleOpt.normal;
+    var emphasisItemStyleOpt = itemStyleOpt.emphasis;
+
+    if (normalItemStyleOpt && normalItemStyleOpt[styleName]) {
+      opt[styleName] = opt[styleName] || {};
+
+      if (!opt[styleName].normal) {
+        opt[styleName].normal = normalItemStyleOpt[styleName];
+      } else {
+        merge(opt[styleName].normal, normalItemStyleOpt[styleName]);
+      }
+
+      normalItemStyleOpt[styleName] = null;
+    }
+
+    if (emphasisItemStyleOpt && emphasisItemStyleOpt[styleName]) {
+      opt[styleName] = opt[styleName] || {};
+
+      if (!opt[styleName].emphasis) {
+        opt[styleName].emphasis = emphasisItemStyleOpt[styleName];
+      } else {
+        merge(opt[styleName].emphasis, emphasisItemStyleOpt[styleName]);
+      }
+
+      emphasisItemStyleOpt[styleName] = null;
+    }
+  }
+}
+
+function convertNormalEmphasis(opt, optType, useExtend) {
+  if (opt && opt[optType] && (opt[optType].normal || opt[optType].emphasis)) {
+    var normalOpt = opt[optType].normal;
+    var emphasisOpt = opt[optType].emphasis;
+
+    if (normalOpt) {
+      // Timeline controlStyle has other properties besides normal and emphasis
+      if (useExtend) {
+        opt[optType].normal = opt[optType].emphasis = null;
+        defaults(opt[optType], normalOpt);
+      } else {
+        opt[optType] = normalOpt;
+      }
+    }
+
+    if (emphasisOpt) {
+      opt.emphasis = opt.emphasis || {};
+      opt.emphasis[optType] = emphasisOpt;
+    }
+  }
+}
+
+function removeEC3NormalStatus(opt) {
+  convertNormalEmphasis(opt, 'itemStyle');
+  convertNormalEmphasis(opt, 'lineStyle');
+  convertNormalEmphasis(opt, 'areaStyle');
+  convertNormalEmphasis(opt, 'label');
+  convertNormalEmphasis(opt, 'labelLine'); // treemap
+
+  convertNormalEmphasis(opt, 'upperLabel'); // graph
+
+  convertNormalEmphasis(opt, 'edgeLabel');
+}
+
+function compatTextStyle(opt, propName) {
+  // Check whether is not object (string\null\undefined ...)
+  var labelOptSingle = isObject$3(opt) && opt[propName];
+  var textStyle = isObject$3(labelOptSingle) && labelOptSingle.textStyle;
+
+  if (textStyle) {
+    for (var i = 0, len = TEXT_STYLE_OPTIONS.length; i < len; i++) {
+      var propName = TEXT_STYLE_OPTIONS[i];
+
+      if (textStyle.hasOwnProperty(propName)) {
+        labelOptSingle[propName] = textStyle[propName];
+      }
+    }
+  }
+}
+
+function compatEC3CommonStyles(opt) {
+  if (opt) {
+    removeEC3NormalStatus(opt);
+    compatTextStyle(opt, 'label');
+    opt.emphasis && compatTextStyle(opt.emphasis, 'label');
+  }
+}
+
+function processSeries(seriesOpt) {
+  if (!isObject$3(seriesOpt)) {
+    return;
+  }
+
+  compatEC2ItemStyle(seriesOpt);
+  removeEC3NormalStatus(seriesOpt);
+  compatTextStyle(seriesOpt, 'label'); // treemap
+
+  compatTextStyle(seriesOpt, 'upperLabel'); // graph
+
+  compatTextStyle(seriesOpt, 'edgeLabel');
+
+  if (seriesOpt.emphasis) {
+    compatTextStyle(seriesOpt.emphasis, 'label'); // treemap
+
+    compatTextStyle(seriesOpt.emphasis, 'upperLabel'); // graph
+
+    compatTextStyle(seriesOpt.emphasis, 'edgeLabel');
+  }
+
+  var markPoint = seriesOpt.markPoint;
+
+  if (markPoint) {
+    compatEC2ItemStyle(markPoint);
+    compatEC3CommonStyles(markPoint);
+  }
+
+  var markLine = seriesOpt.markLine;
+
+  if (markLine) {
+    compatEC2ItemStyle(markLine);
+    compatEC3CommonStyles(markLine);
+  }
+
+  var markArea = seriesOpt.markArea;
+
+  if (markArea) {
+    compatEC3CommonStyles(markArea);
+  }
+
+  var data = seriesOpt.data; // Break with ec3: if `setOption` again, there may be no `type` in option,
+  // then the backward compat based on option type will not be performed.
+
+  if (seriesOpt.type === 'graph') {
+    data = data || seriesOpt.nodes;
+    var edgeData = seriesOpt.links || seriesOpt.edges;
+
+    if (edgeData && !isTypedArray(edgeData)) {
+      for (var i = 0; i < edgeData.length; i++) {
+        compatEC3CommonStyles(edgeData[i]);
+      }
+    }
+
+    each$1(seriesOpt.categories, function (opt) {
+      removeEC3NormalStatus(opt);
+    });
+  }
+
+  if (data && !isTypedArray(data)) {
+    for (var i = 0; i < data.length; i++) {
+      compatEC3CommonStyles(data[i]);
+    }
+  } // mark point data
+
+
+  var markPoint = seriesOpt.markPoint;
+
+  if (markPoint && markPoint.data) {
+    var mpData = markPoint.data;
+
+    for (var i = 0; i < mpData.length; i++) {
+      compatEC3CommonStyles(mpData[i]);
+    }
+  } // mark line data
+
+
+  var markLine = seriesOpt.markLine;
+
+  if (markLine && markLine.data) {
+    var mlData = markLine.data;
+
+    for (var i = 0; i < mlData.length; i++) {
+      if (isArray(mlData[i])) {
+        compatEC3CommonStyles(mlData[i][0]);
+        compatEC3CommonStyles(mlData[i][1]);
+      } else {
+        compatEC3CommonStyles(mlData[i]);
+      }
+    }
+  } // Series
+
+
+  if (seriesOpt.type === 'gauge') {
+    compatTextStyle(seriesOpt, 'axisLabel');
+    compatTextStyle(seriesOpt, 'title');
+    compatTextStyle(seriesOpt, 'detail');
+  } else if (seriesOpt.type === 'treemap') {
+    convertNormalEmphasis(seriesOpt.breadcrumb, 'itemStyle');
+    each$1(seriesOpt.levels, function (opt) {
+      removeEC3NormalStatus(opt);
+    });
+  } else if (seriesOpt.type === 'tree') {
+    removeEC3NormalStatus(seriesOpt.leaves);
+  } // sunburst starts from ec4, so it does not need to compat levels.
+
+}
+
+function toArr(o) {
+  return isArray(o) ? o : o ? [o] : [];
+}
+
+function toObj(o) {
+  return (isArray(o) ? o[0] : o) || {};
+}
+
+var compatStyle = function (option, isTheme) {
+  each$5(toArr(option.series), function (seriesOpt) {
+    isObject$3(seriesOpt) && processSeries(seriesOpt);
+  });
+  var axes = ['xAxis', 'yAxis', 'radiusAxis', 'angleAxis', 'singleAxis', 'parallelAxis', 'radar'];
+  isTheme && axes.push('valueAxis', 'categoryAxis', 'logAxis', 'timeAxis');
+  each$5(axes, function (axisName) {
+    each$5(toArr(option[axisName]), function (axisOpt) {
+      if (axisOpt) {
+        compatTextStyle(axisOpt, 'axisLabel');
+        compatTextStyle(axisOpt.axisPointer, 'label');
+      }
+    });
+  });
+  each$5(toArr(option.parallel), function (parallelOpt) {
+    var parallelAxisDefault = parallelOpt && parallelOpt.parallelAxisDefault;
+    compatTextStyle(parallelAxisDefault, 'axisLabel');
+    compatTextStyle(parallelAxisDefault && parallelAxisDefault.axisPointer, 'label');
+  });
+  each$5(toArr(option.calendar), function (calendarOpt) {
+    convertNormalEmphasis(calendarOpt, 'itemStyle');
+    compatTextStyle(calendarOpt, 'dayLabel');
+    compatTextStyle(calendarOpt, 'monthLabel');
+    compatTextStyle(calendarOpt, 'yearLabel');
+  }); // radar.name.textStyle
+
+  each$5(toArr(option.radar), function (radarOpt) {
+    compatTextStyle(radarOpt, 'name');
+  });
+  each$5(toArr(option.geo), function (geoOpt) {
+    if (isObject$3(geoOpt)) {
+      compatEC3CommonStyles(geoOpt);
+      each$5(toArr(geoOpt.regions), function (regionObj) {
+        compatEC3CommonStyles(regionObj);
+      });
+    }
+  });
+  each$5(toArr(option.timeline), function (timelineOpt) {
+    compatEC3CommonStyles(timelineOpt);
+    convertNormalEmphasis(timelineOpt, 'label');
+    convertNormalEmphasis(timelineOpt, 'itemStyle');
+    convertNormalEmphasis(timelineOpt, 'controlStyle', true);
+    var data = timelineOpt.data;
+    isArray(data) && each$1(data, function (item) {
+      if (isObject$1(item)) {
+        convertNormalEmphasis(item, 'label');
+        convertNormalEmphasis(item, 'itemStyle');
+      }
+    });
+  });
+  each$5(toArr(option.toolbox), function (toolboxOpt) {
+    convertNormalEmphasis(toolboxOpt, 'iconStyle');
+    each$5(toolboxOpt.feature, function (featureOpt) {
+      convertNormalEmphasis(featureOpt, 'iconStyle');
+    });
+  });
+  compatTextStyle(toObj(option.axisPointer), 'label');
+  compatTextStyle(toObj(option.tooltip).axisPointer, 'label');
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+// Compatitable with 2.0
+function get(opt, path) {
+  path = path.split(',');
+  var obj = opt;
+
+  for (var i = 0; i < path.length; i++) {
+    obj = obj && obj[path[i]];
+
+    if (obj == null) {
+      break;
+    }
+  }
+
+  return obj;
+}
+
+function set$1(opt, path, val, overwrite) {
+  path = path.split(',');
+  var obj = opt;
+  var key;
+
+  for (var i = 0; i < path.length - 1; i++) {
+    key = path[i];
+
+    if (obj[key] == null) {
+      obj[key] = {};
+    }
+
+    obj = obj[key];
+  }
+
+  if (overwrite || obj[path[i]] == null) {
+    obj[path[i]] = val;
+  }
+}
+
+function compatLayoutProperties(option) {
+  each$1(LAYOUT_PROPERTIES, function (prop) {
+    if (prop[0] in option && !(prop[1] in option)) {
+      option[prop[1]] = option[prop[0]];
+    }
+  });
+}
+
+var LAYOUT_PROPERTIES = [['x', 'left'], ['y', 'top'], ['x2', 'right'], ['y2', 'bottom']];
+var COMPATITABLE_COMPONENTS = ['grid', 'geo', 'parallel', 'legend', 'toolbox', 'title', 'visualMap', 'dataZoom', 'timeline'];
+var backwardCompat = function (option, isTheme) {
+  compatStyle(option, isTheme); // Make sure series array for model initialization.
+
+  option.series = normalizeToArray(option.series);
+  each$1(option.series, function (seriesOpt) {
+    if (!isObject$1(seriesOpt)) {
+      return;
+    }
+
+    var seriesType = seriesOpt.type;
+
+    if (seriesType === 'pie' || seriesType === 'gauge') {
+      if (seriesOpt.clockWise != null) {
+        seriesOpt.clockwise = seriesOpt.clockWise;
+      }
+    }
+
+    if (seriesType === 'gauge') {
+      var pointerColor = get(seriesOpt, 'pointer.color');
+      pointerColor != null && set$1(seriesOpt, 'itemStyle.normal.color', pointerColor);
+    }
+
+    compatLayoutProperties(seriesOpt);
+  }); // dataRange has changed to visualMap
+
+  if (option.dataRange) {
+    option.visualMap = option.dataRange;
+  }
+
+  each$1(COMPATITABLE_COMPONENTS, function (componentName) {
+    var options = option[componentName];
+
+    if (options) {
+      if (!isArray(options)) {
+        options = [options];
+      }
+
+      each$1(options, function (option) {
+        compatLayoutProperties(option);
+      });
+    }
+  });
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+//     data processing stage is blocked in stream.
+//     See <module:echarts/stream/Scheduler#performDataProcessorTasks>
+// (2) Only register once when import repeatly.
+//     Should be executed before after series filtered and before stack calculation.
+
+var dataStack = function (ecModel) {
+  var stackInfoMap = createHashMap();
+  ecModel.eachSeries(function (seriesModel) {
+    var stack = seriesModel.get('stack'); // Compatibal: when `stack` is set as '', do not stack.
+
+    if (stack) {
+      var stackInfoList = stackInfoMap.get(stack) || stackInfoMap.set(stack, []);
+      var data = seriesModel.getData();
+      var stackInfo = {
+        // Used for calculate axis extent automatically.
+        stackResultDimension: data.getCalculationInfo('stackResultDimension'),
+        stackedOverDimension: data.getCalculationInfo('stackedOverDimension'),
+        stackedDimension: data.getCalculationInfo('stackedDimension'),
+        stackedByDimension: data.getCalculationInfo('stackedByDimension'),
+        isStackedByIndex: data.getCalculationInfo('isStackedByIndex'),
+        data: data,
+        seriesModel: seriesModel
+      }; // If stacked on axis that do not support data stack.
+
+      if (!stackInfo.stackedDimension || !(stackInfo.isStackedByIndex || stackInfo.stackedByDimension)) {
+        return;
+      }
+
+      stackInfoList.length && data.setCalculationInfo('stackedOnSeries', stackInfoList[stackInfoList.length - 1].seriesModel);
+      stackInfoList.push(stackInfo);
+    }
+  });
+  stackInfoMap.each(calculateStack);
+};
+
+function calculateStack(stackInfoList) {
+  each$1(stackInfoList, function (targetStackInfo, idxInStack) {
+    var resultVal = [];
+    var resultNaN = [NaN, NaN];
+    var dims = [targetStackInfo.stackResultDimension, targetStackInfo.stackedOverDimension];
+    var targetData = targetStackInfo.data;
+    var isStackedByIndex = targetStackInfo.isStackedByIndex; // Should not write on raw data, because stack series model list changes
+    // depending on legend selection.
+
+    var newData = targetData.map(dims, function (v0, v1, dataIndex) {
+      var sum = targetData.get(targetStackInfo.stackedDimension, dataIndex); // Consider `connectNulls` of line area, if value is NaN, stackedOver
+      // should also be NaN, to draw a appropriate belt area.
+
+      if (isNaN(sum)) {
+        return resultNaN;
+      }
+
+      var byValue;
+      var stackedDataRawIndex;
+
+      if (isStackedByIndex) {
+        stackedDataRawIndex = targetData.getRawIndex(dataIndex);
+      } else {
+        byValue = targetData.get(targetStackInfo.stackedByDimension, dataIndex);
+      } // If stackOver is NaN, chart view will render point on value start.
+
+
+      var stackedOver = NaN;
+
+      for (var j = idxInStack - 1; j >= 0; j--) {
+        var stackInfo = stackInfoList[j]; // Has been optimized by inverted indices on `stackedByDimension`.
+
+        if (!isStackedByIndex) {
+          stackedDataRawIndex = stackInfo.data.rawIndexOf(stackInfo.stackedByDimension, byValue);
+        }
+
+        if (stackedDataRawIndex >= 0) {
+          var val = stackInfo.data.getByRawIndex(stackInfo.stackResultDimension, stackedDataRawIndex); // Considering positive stack, negative stack and empty data
+
+          if (sum >= 0 && val > 0 || // Positive stack
+          sum <= 0 && val < 0 // Negative stack
+          ) {
+              sum += val;
+              stackedOver = val;
+              break;
+            }
+        }
+      }
+
+      resultVal[0] = sum;
+      resultVal[1] = stackedOver;
+      return resultVal;
+    });
+    targetData.hostModel.setData(newData); // Update for consequent calculation
+
+    targetStackInfo.data = newData;
+  });
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+// TODO
+// ??? refactor? check the outer usage of data provider.
+// merge with defaultDimValueGetter?
+/**
+ * If normal array used, mutable chunk size is supported.
+ * If typed array used, chunk size must be fixed.
+ */
+
+function DefaultDataProvider(source, dimSize) {
+  if (!Source.isInstance(source)) {
+    source = Source.seriesDataToSource(source);
+  }
+
+  this._source = source;
+  var data = this._data = source.data;
+  var sourceFormat = source.sourceFormat; // Typed array. TODO IE10+?
+
+  if (sourceFormat === SOURCE_FORMAT_TYPED_ARRAY) {
+    this._offset = 0;
+    this._dimSize = dimSize;
+    this._data = data;
+  }
+
+  var methods = providerMethods[sourceFormat === SOURCE_FORMAT_ARRAY_ROWS ? sourceFormat + '_' + source.seriesLayoutBy : sourceFormat];
+  extend(this, methods);
+}
+var providerProto = DefaultDataProvider.prototype; // If data is pure without style configuration
+
+providerProto.pure = false; // If data is persistent and will not be released after use.
+
+providerProto.persistent = true; // ???! FIXME legacy data provider do not has method getSource
+
+providerProto.getSource = function () {
+  return this._source;
+};
+
+var providerMethods = {
+  'arrayRows_column': {
+    pure: true,
+    count: function () {
+      return Math.max(0, this._data.length - this._source.startIndex);
+    },
+    getItem: function (idx) {
+      return this._data[idx + this._source.startIndex];
+    },
+    appendData: appendDataSimply
+  },
+  'arrayRows_row': {
+    pure: true,
+    count: function () {
+      var row = this._data[0];
+      return row ? Math.max(0, row.length - this._source.startIndex) : 0;
+    },
+    getItem: function (idx) {
+      idx += this._source.startIndex;
+      var item = [];
+      var data = this._data;
+
+      for (var i = 0; i < data.length; i++) {
+        var row = data[i];
+        item.push(row ? row[idx] : null);
+      }
+
+      return item;
+    },
+    appendData: function () {
+      throw new Error('Do not support appendData when set seriesLayoutBy: "row".');
+    }
+  },
+  'objectRows': {
+    pure: true,
+    count: countSimply,
+    getItem: getItemSimply,
+    appendData: appendDataSimply
+  },
+  'keyedColumns': {
+    pure: true,
+    count: function () {
+      var dimName = this._source.dimensionsDefine[0].name;
+      var col = this._data[dimName];
+      return col ? col.length : 0;
+    },
+    getItem: function (idx) {
+      var item = [];
+      var dims = this._source.dimensionsDefine;
+
+      for (var i = 0; i < dims.length; i++) {
+        var col = this._data[dims[i].name];
+        item.push(col ? col[idx] : null);
+      }
+
+      return item;
+    },
+    appendData: function (newData) {
+      var data = this._data;
+      each$1(newData, function (newCol, key) {
+        var oldCol = data[key] || (data[key] = []);
+
+        for (var i = 0; i < (newCol || []).length; i++) {
+          oldCol.push(newCol[i]);
+        }
+      });
+    }
+  },
+  'original': {
+    count: countSimply,
+    getItem: getItemSimply,
+    appendData: appendDataSimply
+  },
+  'typedArray': {
+    persistent: false,
+    pure: true,
+    count: function () {
+      return this._data ? this._data.length / this._dimSize : 0;
+    },
+    getItem: function (idx, out) {
+      idx = idx - this._offset;
+      out = out || [];
+      var offset = this._dimSize * idx;
+
+      for (var i = 0; i < this._dimSize; i++) {
+        out[i] = this._data[offset + i];
+      }
+
+      return out;
+    },
+    appendData: function (newData) {
+      this._data = newData;
+    },
+    // Clean self if data is already used.
+    clean: function () {
+      // PENDING
+      this._offset += this.count();
+      this._data = null;
+    }
+  }
+};
+
+function countSimply() {
+  return this._data.length;
+}
+
+function getItemSimply(idx) {
+  return this._data[idx];
+}
+
+function appendDataSimply(newData) {
+  for (var i = 0; i < newData.length; i++) {
+    this._data.push(newData[i]);
+  }
+}
+
+var rawValueGetters = {
+  arrayRows: getRawValueSimply,
+  objectRows: function (dataItem, dataIndex, dimIndex, dimName) {
+    return dimIndex != null ? dataItem[dimName] : dataItem;
+  },
+  keyedColumns: getRawValueSimply,
+  original: function (dataItem, dataIndex, dimIndex, dimName) {
+    // FIXME
+    // In some case (markpoint in geo (geo-map.html)), dataItem
+    // is {coord: [...]}
+    var value = getDataItemValue(dataItem);
+    return dimIndex == null || !(value instanceof Array) ? value : value[dimIndex];
+  },
+  typedArray: getRawValueSimply
+};
+
+function getRawValueSimply(dataItem, dataIndex, dimIndex, dimName) {
+  return dimIndex != null ? dataItem[dimIndex] : dataItem;
+}
+
+var defaultDimValueGetters = {
+  arrayRows: getDimValueSimply,
+  objectRows: function (dataItem, dimName, dataIndex, dimIndex) {
+    return converDataValue(dataItem[dimName], this._dimensionInfos[dimName]);
+  },
+  keyedColumns: getDimValueSimply,
+  original: function (dataItem, dimName, dataIndex, dimIndex) {
+    // Performance sensitive, do not use modelUtil.getDataItemValue.
+    // If dataItem is an plain object with no value field, the var `value`
+    // will be assigned with the object, but it will be tread correctly
+    // in the `convertDataValue`.
+    var value = dataItem && (dataItem.value == null ? dataItem : dataItem.value); // If any dataItem is like { value: 10 }
+
+    if (!this._rawData.pure && isDataItemOption(dataItem)) {
+      this.hasItemOption = true;
+    }
+
+    return converDataValue(value instanceof Array ? value[dimIndex] // If value is a single number or something else not array.
+    : value, this._dimensionInfos[dimName]);
+  },
+  typedArray: function (dataItem, dimName, dataIndex, dimIndex) {
+    return dataItem[dimIndex];
+  }
+};
+
+function getDimValueSimply(dataItem, dimName, dataIndex, dimIndex) {
+  return converDataValue(dataItem[dimIndex], this._dimensionInfos[dimName]);
+}
+/**
+ * This helper method convert value in data.
+ * @param {string|number|Date} value
+ * @param {Object|string} [dimInfo] If string (like 'x'), dimType defaults 'number'.
+ *        If "dimInfo.ordinalParseAndSave", ordinal value can be parsed.
+ */
+
+
+function converDataValue(value, dimInfo) {
+  // Performance sensitive.
+  var dimType = dimInfo && dimInfo.type;
+
+  if (dimType === 'ordinal') {
+    // If given value is a category string
+    var ordinalMeta = dimInfo && dimInfo.ordinalMeta;
+    return ordinalMeta ? ordinalMeta.parseAndCollect(value) : value;
+  }
+
+  if (dimType === 'time' // spead up when using timestamp
+  && typeof value !== 'number' && value != null && value !== '-') {
+    value = +parseDate(value);
+  } // dimType defaults 'number'.
+  // If dimType is not ordinal and value is null or undefined or NaN or '-',
+  // parse to NaN.
+
+
+  return value == null || value === '' ? NaN // If string (like '-'), using '+' parse to NaN
+  // If object, also parse to NaN
+  : +value;
+} // ??? FIXME can these logic be more neat: getRawValue, getRawDataItem,
+// Consider persistent.
+// Caution: why use raw value to display on label or tooltip?
+// A reason is to avoid format. For example time value we do not know
+// how to format is expected. More over, if stack is used, calculated
+// value may be 0.91000000001, which have brings trouble to display.
+// TODO: consider how to treat null/undefined/NaN when display?
+
+/**
+ * @param {module:echarts/data/List} data
+ * @param {number} dataIndex
+ * @param {string|number} [dim] dimName or dimIndex
+ * @return {Array.<number>|string|number} can be null/undefined.
+ */
+
+
+function retrieveRawValue(data, dataIndex, dim) {
+  if (!data) {
+    return;
+  } // Consider data may be not persistent.
+
+
+  var dataItem = data.getRawDataItem(dataIndex);
+
+  if (dataItem == null) {
+    return;
+  }
+
+  var sourceFormat = data.getProvider().getSource().sourceFormat;
+  var dimName;
+  var dimIndex;
+  var dimInfo = data.getDimensionInfo(dim);
+
+  if (dimInfo) {
+    dimName = dimInfo.name;
+    dimIndex = dimInfo.index;
+  }
+
+  return rawValueGetters[sourceFormat](dataItem, dataIndex, dimIndex, dimName);
+}
+/**
+ * Compatible with some cases (in pie, map) like:
+ * data: [{name: 'xx', value: 5, selected: true}, ...]
+ * where only sourceFormat is 'original' and 'objectRows' supported.
+ *
+ * ??? TODO
+ * Supported detail options in data item when using 'arrayRows'.
+ *
+ * @param {module:echarts/data/List} data
+ * @param {number} dataIndex
+ * @param {string} attr like 'selected'
+ */
+
+function retrieveRawAttr(data, dataIndex, attr) {
+  if (!data) {
+    return;
+  }
+
+  var sourceFormat = data.getProvider().getSource().sourceFormat;
+
+  if (sourceFormat !== SOURCE_FORMAT_ORIGINAL && sourceFormat !== SOURCE_FORMAT_OBJECT_ROWS) {
+    return;
+  }
+
+  var dataItem = data.getRawDataItem(dataIndex);
+
+  if (sourceFormat === SOURCE_FORMAT_ORIGINAL && !isObject$1(dataItem)) {
+    dataItem = null;
+  }
+
+  if (dataItem) {
+    return dataItem[attr];
+  }
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var DIMENSION_LABEL_REG = /\{@(.+?)\}/g; // PENDING A little ugly
+
+var dataFormatMixin = {
+  /**
+   * Get params for formatter
+   * @param {number} dataIndex
+   * @param {string} [dataType]
+   * @return {Object}
+   */
+  getDataParams: function (dataIndex, dataType) {
+    var data = this.getData(dataType);
+    var rawValue = this.getRawValue(dataIndex, dataType);
+    var rawDataIndex = data.getRawIndex(dataIndex);
+    var name = data.getName(dataIndex);
+    var itemOpt = data.getRawDataItem(dataIndex);
+    var color = data.getItemVisual(dataIndex, 'color');
+    var tooltipModel = this.ecModel.getComponent('tooltip');
+    var renderModeOption = tooltipModel && tooltipModel.get('renderMode');
+    var renderMode = getTooltipRenderMode(renderModeOption);
+    var mainType = this.mainType;
+    var isSeries = mainType === 'series';
+    return {
+      componentType: mainType,
+      componentSubType: this.subType,
+      componentIndex: this.componentIndex,
+      seriesType: isSeries ? this.subType : null,
+      seriesIndex: this.seriesIndex,
+      seriesId: isSeries ? this.id : null,
+      seriesName: isSeries ? this.name : null,
+      name: name,
+      dataIndex: rawDataIndex,
+      data: itemOpt,
+      dataType: dataType,
+      value: rawValue,
+      color: color,
+      marker: getTooltipMarker({
+        color: color,
+        renderMode: renderMode
+      }),
+      // Param name list for mapping `a`, `b`, `c`, `d`, `e`
+      $vars: ['seriesName', 'name', 'value']
+    };
+  },
+
+  /**
+   * Format label
+   * @param {number} dataIndex
+   * @param {string} [status='normal'] 'normal' or 'emphasis'
+   * @param {string} [dataType]
+   * @param {number} [dimIndex]
+   * @param {string} [labelProp='label']
+   * @return {string} If not formatter, return null/undefined
+   */
+  getFormattedLabel: function (dataIndex, status, dataType, dimIndex, labelProp) {
+    status = status || 'normal';
+    var data = this.getData(dataType);
+    var itemModel = data.getItemModel(dataIndex);
+    var params = this.getDataParams(dataIndex, dataType);
+
+    if (dimIndex != null && params.value instanceof Array) {
+      params.value = params.value[dimIndex];
+    }
+
+    var formatter = itemModel.get(status === 'normal' ? [labelProp || 'label', 'formatter'] : [status, labelProp || 'label', 'formatter']);
+
+    if (typeof formatter === 'function') {
+      params.status = status;
+      return formatter(params);
+    } else if (typeof formatter === 'string') {
+      var str = formatTpl(formatter, params); // Support 'aaa{@[3]}bbb{@product}ccc'.
+      // Do not support '}' in dim name util have to.
+
+      return str.replace(DIMENSION_LABEL_REG, function (origin, dim) {
+        var len = dim.length;
+
+        if (dim.charAt(0) === '[' && dim.charAt(len - 1) === ']') {
+          dim = +dim.slice(1, len - 1); // Also: '[]' => 0
+        }
+
+        return retrieveRawValue(data, dataIndex, dim);
+      });
+    }
+  },
+
+  /**
+   * Get raw value in option
+   * @param {number} idx
+   * @param {string} [dataType]
+   * @return {Array|number|string}
+   */
+  getRawValue: function (idx, dataType) {
+    return retrieveRawValue(this.getData(dataType), idx);
+  },
+
+  /**
+   * Should be implemented.
+   * @param {number} dataIndex
+   * @param {boolean} [multipleSeries=false]
+   * @param {number} [dataType]
+   * @return {string} tooltip string
+   */
+  formatTooltip: function () {// Empty function
+  }
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+/**
+ * @param {Object} define
+ * @return See the return of `createTask`.
+ */
+
+function createTask(define) {
+  return new Task(define);
+}
+/**
+ * @constructor
+ * @param {Object} define
+ * @param {Function} define.reset Custom reset
+ * @param {Function} [define.plan] Returns 'reset' indicate reset immediately.
+ * @param {Function} [define.count] count is used to determin data task.
+ * @param {Function} [define.onDirty] count is used to determin data task.
+ */
+
+function Task(define) {
+  define = define || {};
+  this._reset = define.reset;
+  this._plan = define.plan;
+  this._count = define.count;
+  this._onDirty = define.onDirty;
+  this._dirty = true; // Context must be specified implicitly, to
+  // avoid miss update context when model changed.
+
+  this.context;
+}
+
+var taskProto = Task.prototype;
+/**
+ * @param {Object} performArgs
+ * @param {number} [performArgs.step] Specified step.
+ * @param {number} [performArgs.skip] Skip customer perform call.
+ * @param {number} [performArgs.modBy] Sampling window size.
+ * @param {number} [performArgs.modDataCount] Sampling count.
+ */
+
+taskProto.perform = function (performArgs) {
+  var upTask = this._upstream;
+  var skip = performArgs && performArgs.skip; // TODO some refactor.
+  // Pull data. Must pull data each time, because context.data
+  // may be updated by Series.setData.
+
+  if (this._dirty && upTask) {
+    var context = this.context;
+    context.data = context.outputData = upTask.context.outputData;
+  }
+
+  if (this.__pipeline) {
+    this.__pipeline.currentTask = this;
+  }
+
+  var planResult;
+
+  if (this._plan && !skip) {
+    planResult = this._plan(this.context);
+  } // Support sharding by mod, which changes the render sequence and makes the rendered graphic
+  // elements uniformed distributed when progress, especially when moving or zooming.
+
+
+  var lastModBy = normalizeModBy(this._modBy);
+  var lastModDataCount = this._modDataCount || 0;
+  var modBy = normalizeModBy(performArgs && performArgs.modBy);
+  var modDataCount = performArgs && performArgs.modDataCount || 0;
+
+  if (lastModBy !== modBy || lastModDataCount !== modDataCount) {
+    planResult = 'reset';
+  }
+
+  function normalizeModBy(val) {
+    !(val >= 1) && (val = 1); // jshint ignore:line
+
+    return val;
+  }
+
+  var forceFirstProgress;
+
+  if (this._dirty || planResult === 'reset') {
+    this._dirty = false;
+    forceFirstProgress = reset(this, skip);
+  }
+
+  this._modBy = modBy;
+  this._modDataCount = modDataCount;
+  var step = performArgs && performArgs.step;
+
+  if (upTask) {
+    this._dueEnd = upTask._outputDueEnd;
+  } // DataTask or overallTask
+  else {
+      this._dueEnd = this._count ? this._count(this.context) : Infinity;
+    } // Note: Stubs, that its host overall task let it has progress, has progress.
+  // If no progress, pass index from upstream to downstream each time plan called.
+
+
+  if (this._progress) {
+    var start = this._dueIndex;
+    var end = Math.min(step != null ? this._dueIndex + step : Infinity, this._dueEnd);
+
+    if (!skip && (forceFirstProgress || start < end)) {
+      var progress = this._progress;
+
+      if (isArray(progress)) {
+        for (var i = 0; i < progress.length; i++) {
+          doProgress(this, progress[i], start, end, modBy, modDataCount);
+        }
+      } else {
+        doProgress(this, progress, start, end, modBy, modDataCount);
+      }
+    }
+
+    this._dueIndex = end; // If no `outputDueEnd`, assume that output data and
+    // input data is the same, so use `dueIndex` as `outputDueEnd`.
+
+    var outputDueEnd = this._settedOutputEnd != null ? this._settedOutputEnd : end;
+    this._outputDueEnd = outputDueEnd;
+  } else {
+    // (1) Some overall task has no progress.
+    // (2) Stubs, that its host overall task do not let it has progress, has no progress.
+    // This should always be performed so it can be passed to downstream.
+    this._dueIndex = this._outputDueEnd = this._settedOutputEnd != null ? this._settedOutputEnd : this._dueEnd;
+  }
+
+  return this.unfinished();
+};
+
+var iterator = function () {
+  var end;
+  var current;
+  var modBy;
+  var modDataCount;
+  var winCount;
+  var it = {
+    reset: function (s, e, sStep, sCount) {
+      current = s;
+      end = e;
+      modBy = sStep;
+      modDataCount = sCount;
+      winCount = Math.ceil(modDataCount / modBy);
+      it.next = modBy > 1 && modDataCount > 0 ? modNext : sequentialNext;
+    }
+  };
+  return it;
+
+  function sequentialNext() {
+    return current < end ? current++ : null;
+  }
+
+  function modNext() {
+    var dataIndex = current % winCount * modBy + Math.ceil(current / winCount);
+    var result = current >= end ? null : dataIndex < modDataCount ? dataIndex // If modDataCount is smaller than data.count() (consider `appendData` case),
+    // Use normal linear rendering mode.
+    : current;
+    current++;
+    return result;
+  }
+}();
+
+taskProto.dirty = function () {
+  this._dirty = true;
+  this._onDirty && this._onDirty(this.context);
+};
+
+function doProgress(taskIns, progress, start, end, modBy, modDataCount) {
+  iterator.reset(start, end, modBy, modDataCount);
+  taskIns._callingProgress = progress;
+
+  taskIns._callingProgress({
+    start: start,
+    end: end,
+    count: end - start,
+    next: iterator.next
+  }, taskIns.context);
+}
+
+function reset(taskIns, skip) {
+  taskIns._dueIndex = taskIns._outputDueEnd = taskIns._dueEnd = 0;
+  taskIns._settedOutputEnd = null;
+  var progress;
+  var forceFirstProgress;
+
+  if (!skip && taskIns._reset) {
+    progress = taskIns._reset(taskIns.context);
+
+    if (progress && progress.progress) {
+      forceFirstProgress = progress.forceFirstProgress;
+      progress = progress.progress;
+    } // To simplify no progress checking, array must has item.
+
+
+    if (isArray(progress) && !progress.length) {
+      progress = null;
+    }
+  }
+
+  taskIns._progress = progress;
+  taskIns._modBy = taskIns._modDataCount = null;
+  var downstream = taskIns._downstream;
+  downstream && downstream.dirty();
+  return forceFirstProgress;
+}
+/**
+ * @return {boolean}
+ */
+
+
+taskProto.unfinished = function () {
+  return this._progress && this._dueIndex < this._dueEnd;
+};
+/**
+ * @param {Object} downTask The downstream task.
+ * @return {Object} The downstream task.
+ */
+
+
+taskProto.pipe = function (downTask) {
+  // If already downstream, do not dirty downTask.
+  if (this._downstream !== downTask || this._dirty) {
+    this._downstream = downTask;
+    downTask._upstream = this;
+    downTask.dirty();
+  }
+};
+
+taskProto.dispose = function () {
+  if (this._disposed) {
+    return;
+  }
+
+  this._upstream && (this._upstream._downstream = null);
+  this._downstream && (this._downstream._upstream = null);
+  this._dirty = false;
+  this._disposed = true;
+};
+
+taskProto.getUpstream = function () {
+  return this._upstream;
+};
+
+taskProto.getDownstream = function () {
+  return this._downstream;
+};
+
+taskProto.setOutputEnd = function (end) {
+  // This only happend in dataTask, dataZoom, map, currently.
+  // where dataZoom do not set end each time, but only set
+  // when reset. So we should record the setted end, in case
+  // that the stub of dataZoom perform again and earse the
+  // setted end by upstream.
+  this._outputDueEnd = this._settedOutputEnd = end;
+}; ///////////////////////////////////////////////////////////
+// For stream debug (Should be commented out after used!)
+// Usage: printTask(this, 'begin');
+// Usage: printTask(this, null, {someExtraProp});
+// function printTask(task, prefix, extra) {
+//     window.ecTaskUID == null && (window.ecTaskUID = 0);
+//     task.uidDebug == null && (task.uidDebug = `task_${window.ecTaskUID++}`);
+//     task.agent && task.agent.uidDebug == null && (task.agent.uidDebug = `task_${window.ecTaskUID++}`);
+//     var props = [];
+//     if (task.__pipeline) {
+//         var val = `${task.__idxInPipeline}/${task.__pipeline.tail.__idxInPipeline} ${task.agent ? '(stub)' : ''}`;
+//         props.push({text: 'idx', value: val});
+//     } else {
+//         var stubCount = 0;
+//         task.agentStubMap.each(() => stubCount++);
+//         props.push({text: 'idx', value: `overall (stubs: ${stubCount})`});
+//     }
+//     props.push({text: 'uid', value: task.uidDebug});
+//     if (task.__pipeline) {
+//         props.push({text: 'pid', value: task.__pipeline.id});
+//         task.agent && props.push(
+//             {text: 'stubFor', value: task.agent.uidDebug}
+//         );
+//     }
+//     props.push(
+//         {text: 'dirty', value: task._dirty},
+//         {text: 'dueIndex', value: task._dueIndex},
+//         {text: 'dueEnd', value: task._dueEnd},
+//         {text: 'outputDueEnd', value: task._outputDueEnd}
+//     );
+//     if (extra) {
+//         Object.keys(extra).forEach(key => {
+//             props.push({text: key, value: extra[key]});
+//         });
+//     }
+//     var args = ['color: blue'];
+//     var msg = `%c[${prefix || 'T'}] %c` + props.map(item => (
+//         args.push('color: black', 'color: red'),
+//         `${item.text}: %c${item.value}`
+//     )).join('%c, ');
+//     console.log.apply(console, [msg].concat(args));
+//     // console.log(this);
+// }
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var inner$4 = makeInner();
+var SeriesModel = ComponentModel.extend({
+  type: 'series.__base__',
+
+  /**
+   * @readOnly
+   */
+  seriesIndex: 0,
+  // coodinateSystem will be injected in the echarts/CoordinateSystem
+  coordinateSystem: null,
+
+  /**
+   * @type {Object}
+   * @protected
+   */
+  defaultOption: null,
+
+  /**
+   * Data provided for legend
+   * @type {Function}
+   */
+  // PENDING
+  legendDataProvider: null,
+
+  /**
+   * Access path of color for visual
+   */
+  visualColorAccessPath: 'itemStyle.color',
+
+  /**
+   * Support merge layout params.
+   * Only support 'box' now (left/right/top/bottom/width/height).
+   * @type {string|Object} Object can be {ignoreSize: true}
+   * @readOnly
+   */
+  layoutMode: null,
+  init: function (option, parentModel, ecModel, extraOpt) {
+    /**
+     * @type {number}
+     * @readOnly
+     */
+    this.seriesIndex = this.componentIndex;
+    this.dataTask = createTask({
+      count: dataTaskCount,
+      reset: dataTaskReset
+    });
+    this.dataTask.context = {
+      model: this
+    };
+    this.mergeDefaultAndTheme(option, ecModel);
+    prepareSource(this);
+    var data = this.getInitialData(option, ecModel);
+    wrapData(data, this);
+    this.dataTask.context.data = data;
+
+    /**
+     * @type {module:echarts/data/List|module:echarts/data/Tree|module:echarts/data/Graph}
+     * @private
+     */
+    inner$4(this).dataBeforeProcessed = data; // If we reverse the order (make data firstly, and then make
+    // dataBeforeProcessed by cloneShallow), cloneShallow will
+    // cause data.graph.data !== data when using
+    // module:echarts/data/Graph or module:echarts/data/Tree.
+    // See module:echarts/data/helper/linkList
+    // Theoretically, it is unreasonable to call `seriesModel.getData()` in the model
+    // init or merge stage, because the data can be restored. So we do not `restoreData`
+    // and `setData` here, which forbids calling `seriesModel.getData()` in this stage.
+    // Call `seriesModel.getRawData()` instead.
+    // this.restoreData();
+
+    autoSeriesName(this);
+  },
+
+  /**
+   * Util for merge default and theme to option
+   * @param  {Object} option
+   * @param  {module:echarts/model/Global} ecModel
+   */
+  mergeDefaultAndTheme: function (option, ecModel) {
+    var layoutMode = this.layoutMode;
+    var inputPositionParams = layoutMode ? getLayoutParams(option) : {}; // Backward compat: using subType on theme.
+    // But if name duplicate between series subType
+    // (for example: parallel) add component mainType,
+    // add suffix 'Series'.
+
+    var themeSubType = this.subType;
+
+    if (ComponentModel.hasClass(themeSubType)) {
+      themeSubType += 'Series';
+    }
+
+    merge(option, ecModel.getTheme().get(this.subType));
+    merge(option, this.getDefaultOption()); // Default label emphasis `show`
+
+    defaultEmphasis(option, 'label', ['show']);
+    this.fillDataTextStyle(option.data);
+
+    if (layoutMode) {
+      mergeLayoutParam(option, inputPositionParams, layoutMode);
+    }
+  },
+  mergeOption: function (newSeriesOption, ecModel) {
+    // this.settingTask.dirty();
+    newSeriesOption = merge(this.option, newSeriesOption, true);
+    this.fillDataTextStyle(newSeriesOption.data);
+    var layoutMode = this.layoutMode;
+
+    if (layoutMode) {
+      mergeLayoutParam(this.option, newSeriesOption, layoutMode);
+    }
+
+    prepareSource(this);
+    var data = this.getInitialData(newSeriesOption, ecModel);
+    wrapData(data, this);
+    this.dataTask.dirty();
+    this.dataTask.context.data = data;
+    inner$4(this).dataBeforeProcessed = data;
+    autoSeriesName(this);
+  },
+  fillDataTextStyle: function (data) {
+    // Default data label emphasis `show`
+    // FIXME Tree structure data ?
+    // FIXME Performance ?
+    if (data && !isTypedArray(data)) {
+      var props = ['show'];
+
+      for (var i = 0; i < data.length; i++) {
+        if (data[i] && data[i].label) {
+          defaultEmphasis(data[i], 'label', props);
+        }
+      }
+    }
+  },
+
+  /**
+   * Init a data structure from data related option in series
+   * Must be overwritten
+   */
+  getInitialData: function () {},
+
+  /**
+   * Append data to list
+   * @param {Object} params
+   * @param {Array|TypedArray} params.data
+   */
+  appendData: function (params) {
+    // FIXME ???
+    // (1) If data from dataset, forbidden append.
+    // (2) support append data of dataset.
+    var data = this.getRawData();
+    data.appendData(params.data);
+  },
+
+  /**
+   * Consider some method like `filter`, `map` need make new data,
+   * We should make sure that `seriesModel.getData()` get correct
+   * data in the stream procedure. So we fetch data from upstream
+   * each time `task.perform` called.
+   * @param {string} [dataType]
+   * @return {module:echarts/data/List}
+   */
+  getData: function (dataType) {
+    var task = getCurrentTask(this);
+
+    if (task) {
+      var data = task.context.data;
+      return dataType == null ? data : data.getLinkedData(dataType);
+    } else {
+      // When series is not alive (that may happen when click toolbox
+      // restore or setOption with not merge mode), series data may
+      // be still need to judge animation or something when graphic
+      // elements want to know whether fade out.
+      return inner$4(this).data;
+    }
+  },
+
+  /**
+   * @param {module:echarts/data/List} data
+   */
+  setData: function (data) {
+    var task = getCurrentTask(this);
+
+    if (task) {
+      var context = task.context; // Consider case: filter, data sample.
+
+      if (context.data !== data && task.modifyOutputEnd) {
+        task.setOutputEnd(data.count());
+      }
+
+      context.outputData = data; // Caution: setData should update context.data,
+      // Because getData may be called multiply in a
+      // single stage and expect to get the data just
+      // set. (For example, AxisProxy, x y both call
+      // getData and setDate sequentially).
+      // So the context.data should be fetched from
+      // upstream each time when a stage starts to be
+      // performed.
+
+      if (task !== this.dataTask) {
+        context.data = data;
+      }
+    }
+
+    inner$4(this).data = data;
+  },
+
+  /**
+   * @see {module:echarts/data/helper/sourceHelper#getSource}
+   * @return {module:echarts/data/Source} source
+   */
+  getSource: function () {
+    return getSource(this);
+  },
+
+  /**
+   * Get data before processed
+   * @return {module:echarts/data/List}
+   */
+  getRawData: function () {
+    return inner$4(this).dataBeforeProcessed;
+  },
+
+  /**
+   * Get index axis if has coordinate system and has axis.
+   * By default use coordSys.getBaseAxis();
+   * Can be overrided for some chart.
+   * @return {type} description
+   */
+  getBaseAxis: function () {
+    var coordSys = this.coordinateSystem;
+    return coordSys && coordSys.getBaseAxis && coordSys.getBaseAxis();
+  },
+  // FIXME
+
+  /**
+   * Default tooltip formatter
+   *
+   * @param {number} dataIndex
+   * @param {boolean} [multipleSeries=false]
+   * @param {number} [dataType]
+   * @param {string} [renderMode='html'] valid values: 'html' and 'richText'.
+   *                                     'html' is used for rendering tooltip in extra DOM form, and the result
+   *                                     string is used as DOM HTML content.
+   *                                     'richText' is used for rendering tooltip in rich text form, for those where
+   *                                     DOM operation is not supported.
+   * @return {Object} formatted tooltip with `html` and `markers`
+   */
+  formatTooltip: function (dataIndex, multipleSeries, dataType, renderMode) {
+    var series = this;
+    renderMode = renderMode || 'html';
+    var newLine = renderMode === 'html' ? '<br/>' : '\n';
+    var isRichText = renderMode === 'richText';
+    var markers = {};
+    var markerId = 0;
+
+    function formatArrayValue(value) {
+      // ??? TODO refactor these logic.
+      // check: category-no-encode-has-axis-data in dataset.html
+      var vertially = reduce(value, function (vertially, val, idx) {
+        var dimItem = data.getDimensionInfo(idx);
+        return vertially |= dimItem && dimItem.tooltip !== false && dimItem.displayName != null;
+      }, 0);
+      var result = [];
+      tooltipDims.length ? each$1(tooltipDims, function (dim) {
+        setEachItem(retrieveRawValue(data, dataIndex, dim), dim);
+      }) // By default, all dims is used on tooltip.
+      : each$1(value, setEachItem);
+
+      function setEachItem(val, dim) {
+        var dimInfo = data.getDimensionInfo(dim); // If `dimInfo.tooltip` is not set, show tooltip.
+
+        if (!dimInfo || dimInfo.otherDims.tooltip === false) {
+          return;
+        }
+
+        var dimType = dimInfo.type;
+        var markName = 'sub' + series.seriesIndex + 'at' + markerId;
+        var dimHead = getTooltipMarker({
+          color: color,
+          type: 'subItem',
+          renderMode: renderMode,
+          markerId: markName
+        });
+        var dimHeadStr = typeof dimHead === 'string' ? dimHead : dimHead.content;
+        var valStr = (vertially ? dimHeadStr + encodeHTML(dimInfo.displayName || '-') + ': ' : '') + // FIXME should not format time for raw data?
+        encodeHTML(dimType === 'ordinal' ? val + '' : dimType === 'time' ? multipleSeries ? '' : formatTime('yyyy/MM/dd hh:mm:ss', val) : addCommas(val));
+        valStr && result.push(valStr);
+
+        if (isRichText) {
+          markers[markName] = color;
+          ++markerId;
+        }
+      }
+
+      var newLine = vertially ? isRichText ? '\n' : '<br/>' : '';
+      var content = newLine + result.join(newLine || ', ');
+      return {
+        renderMode: renderMode,
+        content: content,
+        style: markers
+      };
+    }
+
+    function formatSingleValue(val) {
+      // return encodeHTML(addCommas(val));
+      return {
+        renderMode: renderMode,
+        content: encodeHTML(addCommas(val)),
+        style: markers
+      };
+    }
+
+    var data = this.getData();
+    var tooltipDims = data.mapDimension('defaultedTooltip', true);
+    var tooltipDimLen = tooltipDims.length;
+    var value = this.getRawValue(dataIndex);
+    var isValueArr = isArray(value);
+    var color = data.getItemVisual(dataIndex, 'color');
+
+    if (isObject$1(color) && color.colorStops) {
+      color = (color.colorStops[0] || {}).color;
+    }
+
+    color = color || 'transparent'; // Complicated rule for pretty tooltip.
+
+    var formattedValue = tooltipDimLen > 1 || isValueArr && !tooltipDimLen ? formatArrayValue(value) : tooltipDimLen ? formatSingleValue(retrieveRawValue(data, dataIndex, tooltipDims[0])) : formatSingleValue(isValueArr ? value[0] : value);
+    var content = formattedValue.content;
+    var markName = series.seriesIndex + 'at' + markerId;
+    var colorEl = getTooltipMarker({
+      color: color,
+      type: 'item',
+      renderMode: renderMode,
+      markerId: markName
+    });
+    markers[markName] = color;
+    ++markerId;
+    var name = data.getName(dataIndex);
+    var seriesName = this.name;
+
+    if (!isNameSpecified(this)) {
+      seriesName = '';
+    }
+
+    seriesName = seriesName ? encodeHTML(seriesName) + (!multipleSeries ? newLine : ': ') : '';
+    var colorStr = typeof colorEl === 'string' ? colorEl : colorEl.content;
+    var html = !multipleSeries ? seriesName + colorStr + (name ? encodeHTML(name) + ': ' + content : content) : colorStr + seriesName + content;
+    return {
+      html: html,
+      markers: markers
+    };
+  },
+
+  /**
+   * @return {boolean}
+   */
+  isAnimationEnabled: function () {
+    if (env$1.node) {
+      return false;
+    }
+
+    var animationEnabled = this.getShallow('animation');
+
+    if (animationEnabled) {
+      if (this.getData().count() > this.getShallow('animationThreshold')) {
+        animationEnabled = false;
+      }
+    }
+
+    return animationEnabled;
+  },
+  restoreData: function () {
+    this.dataTask.dirty();
+  },
+  getColorFromPalette: function (name, scope, requestColorNum) {
+    var ecModel = this.ecModel; // PENDING
+
+    var color = colorPaletteMixin.getColorFromPalette.call(this, name, scope, requestColorNum);
+
+    if (!color) {
+      color = ecModel.getColorFromPalette(name, scope, requestColorNum);
+    }
+
+    return color;
+  },
+
+  /**
+   * Use `data.mapDimension(coordDim, true)` instead.
+   * @deprecated
+   */
+  coordDimToDataDim: function (coordDim) {
+    return this.getRawData().mapDimension(coordDim, true);
+  },
+
+  /**
+   * Get progressive rendering count each step
+   * @return {number}
+   */
+  getProgressive: function () {
+    return this.get('progressive');
+  },
+
+  /**
+   * Get progressive rendering count each step
+   * @return {number}
+   */
+  getProgressiveThreshold: function () {
+    return this.get('progressiveThreshold');
+  },
+
+  /**
+   * Get data indices for show tooltip content. See tooltip.
+   * @abstract
+   * @param {Array.<string>|string} dim
+   * @param {Array.<number>} value
+   * @param {module:echarts/coord/single/SingleAxis} baseAxis
+   * @return {Object} {dataIndices, nestestValue}.
+   */
+  getAxisTooltipData: null,
+
+  /**
+   * See tooltip.
+   * @abstract
+   * @param {number} dataIndex
+   * @return {Array.<number>} Point of tooltip. null/undefined can be returned.
+   */
+  getTooltipPosition: null,
+
+  /**
+   * @see {module:echarts/stream/Scheduler}
+   */
+  pipeTask: null,
+
+  /**
+   * Convinient for override in extended class.
+   * @protected
+   * @type {Function}
+   */
+  preventIncremental: null,
+
+  /**
+   * @public
+   * @readOnly
+   * @type {Object}
+   */
+  pipelineContext: null
+});
+mixin(SeriesModel, dataFormatMixin);
+mixin(SeriesModel, colorPaletteMixin);
+/**
+ * MUST be called after `prepareSource` called
+ * Here we need to make auto series, especially for auto legend. But we
+ * do not modify series.name in option to avoid side effects.
+ */
+
+function autoSeriesName(seriesModel) {
+  // User specified name has higher priority, otherwise it may cause
+  // series can not be queried unexpectedly.
+  var name = seriesModel.name;
+
+  if (!isNameSpecified(seriesModel)) {
+    seriesModel.name = getSeriesAutoName(seriesModel) || name;
+  }
+}
+
+function getSeriesAutoName(seriesModel) {
+  var data = seriesModel.getRawData();
+  var dataDims = data.mapDimension('seriesName', true);
+  var nameArr = [];
+  each$1(dataDims, function (dataDim) {
+    var dimInfo = data.getDimensionInfo(dataDim);
+    dimInfo.displayName && nameArr.push(dimInfo.displayName);
+  });
+  return nameArr.join(' ');
+}
+
+function dataTaskCount(context) {
+  return context.model.getRawData().count();
+}
+
+function dataTaskReset(context) {
+  var seriesModel = context.model;
+  seriesModel.setData(seriesModel.getRawData().cloneShallow());
+  return dataTaskProgress;
+}
+
+function dataTaskProgress(param, context) {
+  // Avoid repead cloneShallow when data just created in reset.
+  if (param.end > context.outputData.count()) {
+    context.model.getRawData().cloneShallow(context.outputData);
+  }
+} // TODO refactor
+
+
+function wrapData(data, seriesModel) {
+  each$1(data.CHANGABLE_METHODS, function (methodName) {
+    data.wrapMethod(methodName, curry(onDataSelfChange, seriesModel));
+  });
+}
+
+function onDataSelfChange(seriesModel) {
+  var task = getCurrentTask(seriesModel);
+
+  if (task) {
+    // Consider case: filter, selectRange
+    task.setOutputEnd(this.count());
+  }
+}
+
+function getCurrentTask(seriesModel) {
+  var scheduler = (seriesModel.ecModel || {}).scheduler;
+  var pipeline = scheduler && scheduler.getPipeline(seriesModel.uid);
+
+  if (pipeline) {
+    // When pipline finished, the currrentTask keep the last
+    // task (renderTask).
+    var task = pipeline.currentTask;
+
+    if (task) {
+      var agentStubMap = task.agentStubMap;
+
+      if (agentStubMap) {
+        task = agentStubMap.get(seriesModel.uid);
+      }
+    }
+
+    return task;
+  }
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var Component$1 = function () {
+  /**
+   * @type {module:zrender/container/Group}
+   * @readOnly
+   */
+  this.group = new Group();
+  /**
+   * @type {string}
+   * @readOnly
+   */
+
+  this.uid = getUID('viewComponent');
+};
+
+Component$1.prototype = {
+  constructor: Component$1,
+  init: function (ecModel, api) {},
+  render: function (componentModel, ecModel, api, payload) {},
+  dispose: function () {},
+
+  /**
+   * @param {string} eventType
+   * @param {Object} query
+   * @param {module:zrender/Element} targetEl
+   * @param {Object} packedEvent
+   * @return {boolen} Pass only when return `true`.
+   */
+  filterForExposedEvent: null
+};
+var componentProto = Component$1.prototype;
+
+componentProto.updateView = componentProto.updateLayout = componentProto.updateVisual = function (seriesModel, ecModel, api, payload) {// Do nothing;
+}; // Enable Component.extend.
+
+
+enableClassExtend(Component$1); // Enable capability of registerClass, getClass, hasClass, registerSubTypeDefaulter and so on.
+
+enableClassManagement(Component$1, {
+  registerWhenExtend: true
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+/**
+ * @return {string} If large mode changed, return string 'reset';
+ */
+
+var createRenderPlanner = function () {
+  var inner = makeInner();
+  return function (seriesModel) {
+    var fields = inner(seriesModel);
+    var pipelineContext = seriesModel.pipelineContext;
+    var originalLarge = fields.large;
+    var originalProgressive = fields.progressiveRender;
+    var large = fields.large = pipelineContext.large;
+    var progressive = fields.progressiveRender = pipelineContext.progressiveRender;
+    return !!(originalLarge ^ large || originalProgressive ^ progressive) && 'reset';
+  };
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var inner$5 = makeInner();
+var renderPlanner = createRenderPlanner();
+
+function Chart() {
+  /**
+   * @type {module:zrender/container/Group}
+   * @readOnly
+   */
+  this.group = new Group();
+  /**
+   * @type {string}
+   * @readOnly
+   */
+
+  this.uid = getUID('viewChart');
+  this.renderTask = createTask({
+    plan: renderTaskPlan,
+    reset: renderTaskReset
+  });
+  this.renderTask.context = {
+    view: this
+  };
+}
+
+Chart.prototype = {
+  type: 'chart',
+
+  /**
+   * Init the chart.
+   * @param  {module:echarts/model/Global} ecModel
+   * @param  {module:echarts/ExtensionAPI} api
+   */
+  init: function (ecModel, api) {},
+
+  /**
+   * Render the chart.
+   * @param  {module:echarts/model/Series} seriesModel
+   * @param  {module:echarts/model/Global} ecModel
+   * @param  {module:echarts/ExtensionAPI} api
+   * @param  {Object} payload
+   */
+  render: function (seriesModel, ecModel, api, payload) {},
+
+  /**
+   * Highlight series or specified data item.
+   * @param  {module:echarts/model/Series} seriesModel
+   * @param  {module:echarts/model/Global} ecModel
+   * @param  {module:echarts/ExtensionAPI} api
+   * @param  {Object} payload
+   */
+  highlight: function (seriesModel, ecModel, api, payload) {
+    toggleHighlight(seriesModel.getData(), payload, 'emphasis');
+  },
+
+  /**
+   * Downplay series or specified data item.
+   * @param  {module:echarts/model/Series} seriesModel
+   * @param  {module:echarts/model/Global} ecModel
+   * @param  {module:echarts/ExtensionAPI} api
+   * @param  {Object} payload
+   */
+  downplay: function (seriesModel, ecModel, api, payload) {
+    toggleHighlight(seriesModel.getData(), payload, 'normal');
+  },
+
+  /**
+   * Remove self.
+   * @param  {module:echarts/model/Global} ecModel
+   * @param  {module:echarts/ExtensionAPI} api
+   */
+  remove: function (ecModel, api) {
+    this.group.removeAll();
+  },
+
+  /**
+   * Dispose self.
+   * @param  {module:echarts/model/Global} ecModel
+   * @param  {module:echarts/ExtensionAPI} api
+   */
+  dispose: function () {},
+
+  /**
+   * Rendering preparation in progressive mode.
+   * @param  {module:echarts/model/Series} seriesModel
+   * @param  {module:echarts/model/Global} ecModel
+   * @param  {module:echarts/ExtensionAPI} api
+   * @param  {Object} payload
+   */
+  incrementalPrepareRender: null,
+
+  /**
+   * Render in progressive mode.
+   * @param  {Object} params See taskParams in `stream/task.js`
+   * @param  {module:echarts/model/Series} seriesModel
+   * @param  {module:echarts/model/Global} ecModel
+   * @param  {module:echarts/ExtensionAPI} api
+   * @param  {Object} payload
+   */
+  incrementalRender: null,
+
+  /**
+   * Update transform directly.
+   * @param  {module:echarts/model/Series} seriesModel
+   * @param  {module:echarts/model/Global} ecModel
+   * @param  {module:echarts/ExtensionAPI} api
+   * @param  {Object} payload
+   * @return {Object} {update: true}
+   */
+  updateTransform: null,
+
+  /**
+   * The view contains the given point.
+   * @interface
+   * @param {Array.<number>} point
+   * @return {boolean}
+   */
+  // containPoint: function () {}
+
+  /**
+   * @param {string} eventType
+   * @param {Object} query
+   * @param {module:zrender/Element} targetEl
+   * @param {Object} packedEvent
+   * @return {boolen} Pass only when return `true`.
+   */
+  filterForExposedEvent: null
+};
+var chartProto = Chart.prototype;
+
+chartProto.updateView = chartProto.updateLayout = chartProto.updateVisual = function (seriesModel, ecModel, api, payload) {
+  this.render(seriesModel, ecModel, api, payload);
+};
+/**
+ * Set state of single element
+ * @param  {module:zrender/Element} el
+ * @param  {string} state
+ */
+
+
+function elSetState(el, state) {
+  if (el) {
+    el.trigger(state);
+
+    if (el.type === 'group') {
+      for (var i = 0; i < el.childCount(); i++) {
+        elSetState(el.childAt(i), state);
+      }
+    }
+  }
+}
+/**
+ * @param  {module:echarts/data/List} data
+ * @param  {Object} payload
+ * @param  {string} state 'normal'|'emphasis'
+ */
+
+
+function toggleHighlight(data, payload, state) {
+  var dataIndex = queryDataIndex(data, payload);
+
+  if (dataIndex != null) {
+    each$1(normalizeToArray(dataIndex), function (dataIdx) {
+      elSetState(data.getItemGraphicEl(dataIdx), state);
+    });
+  } else {
+    data.eachItemGraphicEl(function (el) {
+      elSetState(el, state);
+    });
+  }
+} // Enable Chart.extend.
+
+
+enableClassExtend(Chart, ['dispose']); // Add capability of registerClass, getClass, hasClass, registerSubTypeDefaulter and so on.
+
+enableClassManagement(Chart, {
+  registerWhenExtend: true
+});
+
+Chart.markUpdateMethod = function (payload, methodName) {
+  inner$5(payload).updateMethod = methodName;
+};
+
+function renderTaskPlan(context) {
+  return renderPlanner(context.model);
+}
+
+function renderTaskReset(context) {
+  var seriesModel = context.model;
+  var ecModel = context.ecModel;
+  var api = context.api;
+  var payload = context.payload; // ???! remove updateView updateVisual
+
+  var progressiveRender = seriesModel.pipelineContext.progressiveRender;
+  var view = context.view;
+  var updateMethod = payload && inner$5(payload).updateMethod;
+  var methodName = progressiveRender ? 'incrementalPrepareRender' : updateMethod && view[updateMethod] ? updateMethod // `appendData` is also supported when data amount
+  // is less than progressive threshold.
+  : 'render';
+
+  if (methodName !== 'render') {
+    view[methodName](seriesModel, ecModel, api, payload);
+  }
+
+  return progressMethodMap[methodName];
+}
+
+var progressMethodMap = {
+  incrementalPrepareRender: {
+    progress: function (params, context) {
+      context.view.incrementalRender(params, context.model, context.ecModel, context.api, context.payload);
+    }
+  },
+  render: {
+    // Put view.render in `progress` to support appendData. But in this case
+    // view.render should not be called in reset, otherwise it will be called
+    // twise. Use `forceFirstProgress` to make sure that view.render is called
+    // in any cases.
+    forceFirstProgress: true,
+    progress: function (params, context) {
+      context.view.render(context.model, context.ecModel, context.api, context.payload);
+    }
+  }
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var ORIGIN_METHOD = '\0__throttleOriginMethod';
+var RATE = '\0__throttleRate';
+var THROTTLE_TYPE = '\0__throttleType';
+/**
+ * @public
+ * @param {(Function)} fn
+ * @param {number} [delay=0] Unit: ms.
+ * @param {boolean} [debounce=false]
+ *        true: If call interval less than `delay`, only the last call works.
+ *        false: If call interval less than `delay, call works on fixed rate.
+ * @return {(Function)} throttled fn.
+ */
+
+function throttle(fn, delay, debounce) {
+  var currCall;
+  var lastCall = 0;
+  var lastExec = 0;
+  var timer = null;
+  var diff;
+  var scope;
+  var args;
+  var debounceNextCall;
+  delay = delay || 0;
+
+  function exec() {
+    lastExec = new Date().getTime();
+    timer = null;
+    fn.apply(scope, args || []);
+  }
+
+  var cb = function () {
+    currCall = new Date().getTime();
+    scope = this;
+    args = arguments;
+    var thisDelay = debounceNextCall || delay;
+    var thisDebounce = debounceNextCall || debounce;
+    debounceNextCall = null;
+    diff = currCall - (thisDebounce ? lastCall : lastExec) - thisDelay;
+    clearTimeout(timer); // Here we should make sure that: the `exec` SHOULD NOT be called later
+    // than a new call of `cb`, that is, preserving the command order. Consider
+    // calculating "scale rate" when roaming as an example. When a call of `cb`
+    // happens, either the `exec` is called dierectly, or the call is delayed.
+    // But the delayed call should never be later than next call of `cb`. Under
+    // this assurance, we can simply update view state each time `dispatchAction`
+    // triggered by user roaming, but not need to add extra code to avoid the
+    // state being "rolled-back".
+
+    if (thisDebounce) {
+      timer = setTimeout(exec, thisDelay);
+    } else {
+      if (diff >= 0) {
+        exec();
+      } else {
+        timer = setTimeout(exec, -diff);
+      }
+    }
+
+    lastCall = currCall;
+  };
+  /**
+   * Clear throttle.
+   * @public
+   */
+
+
+  cb.clear = function () {
+    if (timer) {
+      clearTimeout(timer);
+      timer = null;
+    }
+  };
+  /**
+   * Enable debounce once.
+   */
+
+
+  cb.debounceNextCall = function (debounceDelay) {
+    debounceNextCall = debounceDelay;
+  };
+
+  return cb;
+}
+/**
+ * Create throttle method or update throttle rate.
+ *
+ * @example
+ * ComponentView.prototype.render = function () {
+ *     ...
+ *     throttle.createOrUpdate(
+ *         this,
+ *         '_dispatchAction',
+ *         this.model.get('throttle'),
+ *         'fixRate'
+ *     );
+ * };
+ * ComponentView.prototype.remove = function () {
+ *     throttle.clear(this, '_dispatchAction');
+ * };
+ * ComponentView.prototype.dispose = function () {
+ *     throttle.clear(this, '_dispatchAction');
+ * };
+ *
+ * @public
+ * @param {Object} obj
+ * @param {string} fnAttr
+ * @param {number} [rate]
+ * @param {string} [throttleType='fixRate'] 'fixRate' or 'debounce'
+ * @return {Function} throttled function.
+ */
+
+function createOrUpdate(obj, fnAttr, rate, throttleType) {
+  var fn = obj[fnAttr];
+
+  if (!fn) {
+    return;
+  }
+
+  var originFn = fn[ORIGIN_METHOD] || fn;
+  var lastThrottleType = fn[THROTTLE_TYPE];
+  var lastRate = fn[RATE];
+
+  if (lastRate !== rate || lastThrottleType !== throttleType) {
+    if (rate == null || !throttleType) {
+      return obj[fnAttr] = originFn;
+    }
+
+    fn = obj[fnAttr] = throttle(originFn, rate, throttleType === 'debounce');
+    fn[ORIGIN_METHOD] = originFn;
+    fn[THROTTLE_TYPE] = throttleType;
+    fn[RATE] = rate;
+  }
+
+  return fn;
+}
+/**
+ * Clear throttle. Example see throttle.createOrUpdate.
+ *
+ * @public
+ * @param {Object} obj
+ * @param {string} fnAttr
+ */
+
+function clear(obj, fnAttr) {
+  var fn = obj[fnAttr];
+
+  if (fn && fn[ORIGIN_METHOD]) {
+    obj[fnAttr] = fn[ORIGIN_METHOD];
+  }
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var seriesColor = {
+  createOnAllSeries: true,
+  performRawSeries: true,
+  reset: function (seriesModel, ecModel) {
+    var data = seriesModel.getData();
+    var colorAccessPath = (seriesModel.visualColorAccessPath || 'itemStyle.color').split('.');
+    var color = seriesModel.get(colorAccessPath) // Set in itemStyle
+    || seriesModel.getColorFromPalette( // TODO series count changed.
+    seriesModel.name, null, ecModel.getSeriesCount()); // Default color
+    // FIXME Set color function or use the platte color
+
+    data.setVisual('color', color); // Only visible series has each data be visual encoded
+
+    if (!ecModel.isSeriesFiltered(seriesModel)) {
+      if (typeof color === 'function' && !(color instanceof Gradient)) {
+        data.each(function (idx) {
+          data.setItemVisual(idx, 'color', color(seriesModel.getDataParams(idx)));
+        });
+      } // itemStyle in each data item
+
+
+      var dataEach = function (data, idx) {
+        var itemModel = data.getItemModel(idx);
+        var color = itemModel.get(colorAccessPath, true);
+
+        if (color != null) {
+          data.setItemVisual(idx, 'color', color);
+        }
+      };
+
+      return {
+        dataEach: data.hasItemOption ? dataEach : null
+      };
+    }
+  }
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var lang = {
+  toolbox: {
+    brush: {
+      title: {
+        rect: '鐭╁舰閫夋嫨',
+        polygon: '鍦堥��',
+        lineX: '妯悜閫夋嫨',
+        lineY: '绾靛悜閫夋嫨',
+        keep: '淇濇寔閫夋嫨',
+        clear: '娓呴櫎閫夋嫨'
+      }
+    },
+    dataView: {
+      title: '鏁版嵁瑙嗗浘',
+      lang: ['鏁版嵁瑙嗗浘', '鍏抽棴', '鍒锋柊']
+    },
+    dataZoom: {
+      title: {
+        zoom: '鍖哄煙缂╂斁',
+        back: '鍖哄煙缂╂斁杩樺師'
+      }
+    },
+    magicType: {
+      title: {
+        line: '鍒囨崲涓烘姌绾垮浘',
+        bar: '鍒囨崲涓烘煴鐘跺浘',
+        stack: '鍒囨崲涓哄爢鍙�',
+        tiled: '鍒囨崲涓哄钩閾�'
+      }
+    },
+    restore: {
+      title: '杩樺師'
+    },
+    saveAsImage: {
+      title: '淇濆瓨涓哄浘鐗�',
+      lang: ['鍙抽敭鍙﹀瓨涓哄浘鐗�']
+    }
+  },
+  series: {
+    typeNames: {
+      pie: '楗煎浘',
+      bar: '鏌辩姸鍥�',
+      line: '鎶樼嚎鍥�',
+      scatter: '鏁g偣鍥�',
+      effectScatter: '娑熸吉鏁g偣鍥�',
+      radar: '闆疯揪鍥�',
+      tree: '鏍戝浘',
+      treemap: '鐭╁舰鏍戝浘',
+      boxplot: '绠卞瀷鍥�',
+      candlestick: 'K绾垮浘',
+      k: 'K绾垮浘',
+      heatmap: '鐑姏鍥�',
+      map: '鍦板浘',
+      parallel: '骞宠鍧愭爣鍥�',
+      lines: '绾垮浘',
+      graph: '鍏崇郴鍥�',
+      sankey: '妗戝熀鍥�',
+      funnel: '婕忔枟鍥�',
+      gauge: '浠〃鐩樺浘',
+      pictorialBar: '璞″舰鏌卞浘',
+      themeRiver: '涓婚娌虫祦鍥�',
+      sunburst: '鏃棩鍥�'
+    }
+  },
+  aria: {
+    general: {
+      withTitle: '杩欐槸涓�涓叧浜庘�渰title}鈥濈殑鍥捐〃銆�',
+      withoutTitle: '杩欐槸涓�涓浘琛紝'
+    },
+    series: {
+      single: {
+        prefix: '',
+        withName: '鍥捐〃绫诲瀷鏄瘂seriesType}锛岃〃绀簕seriesName}銆�',
+        withoutName: '鍥捐〃绫诲瀷鏄瘂seriesType}銆�'
+      },
+      multiple: {
+        prefix: '瀹冪敱{seriesCount}涓浘琛ㄧ郴鍒楃粍鎴愩��',
+        withName: '绗瑊seriesId}涓郴鍒楁槸涓�涓〃绀簕seriesName}鐨剓seriesType}锛�',
+        withoutName: '绗瑊seriesId}涓郴鍒楁槸涓�涓獅seriesType}锛�',
+        separator: {
+          middle: '锛�',
+          end: '銆�'
+        }
+      }
+    },
+    data: {
+      allData: '鍏舵暟鎹槸鈥斺��',
+      partialData: '鍏朵腑锛屽墠{displayCnt}椤规槸鈥斺��',
+      withName: '{name}鐨勬暟鎹槸{value}',
+      withoutName: '{value}',
+      separator: {
+        middle: '锛�',
+        end: ''
+      }
+    }
+  }
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var aria = function (dom, ecModel) {
+  var ariaModel = ecModel.getModel('aria');
+
+  if (!ariaModel.get('show')) {
+    return;
+  } else if (ariaModel.get('description')) {
+    dom.setAttribute('aria-label', ariaModel.get('description'));
+    return;
+  }
+
+  var seriesCnt = 0;
+  ecModel.eachSeries(function (seriesModel, idx) {
+    ++seriesCnt;
+  }, this);
+  var maxDataCnt = ariaModel.get('data.maxCount') || 10;
+  var maxSeriesCnt = ariaModel.get('series.maxCount') || 10;
+  var displaySeriesCnt = Math.min(seriesCnt, maxSeriesCnt);
+  var ariaLabel;
+
+  if (seriesCnt < 1) {
+    // No series, no aria label
+    return;
+  } else {
+    var title = getTitle();
+
+    if (title) {
+      ariaLabel = replace(getConfig('general.withTitle'), {
+        title: title
+      });
+    } else {
+      ariaLabel = getConfig('general.withoutTitle');
+    }
+
+    var seriesLabels = [];
+    var prefix = seriesCnt > 1 ? 'series.multiple.prefix' : 'series.single.prefix';
+    ariaLabel += replace(getConfig(prefix), {
+      seriesCount: seriesCnt
+    });
+    ecModel.eachSeries(function (seriesModel, idx) {
+      if (idx < displaySeriesCnt) {
+        var seriesLabel;
+        var seriesName = seriesModel.get('name');
+        var seriesTpl = 'series.' + (seriesCnt > 1 ? 'multiple' : 'single') + '.';
+        seriesLabel = getConfig(seriesName ? seriesTpl + 'withName' : seriesTpl + 'withoutName');
+        seriesLabel = replace(seriesLabel, {
+          seriesId: seriesModel.seriesIndex,
+          seriesName: seriesModel.get('name'),
+          seriesType: getSeriesTypeName(seriesModel.subType)
+        });
+        var data = seriesModel.getData();
+        window.data = data;
+
+        if (data.count() > maxDataCnt) {
+          // Show part of data
+          seriesLabel += replace(getConfig('data.partialData'), {
+            displayCnt: maxDataCnt
+          });
+        } else {
+          seriesLabel += getConfig('data.allData');
+        }
+
+        var dataLabels = [];
+
+        for (var i = 0; i < data.count(); i++) {
+          if (i < maxDataCnt) {
+            var name = data.getName(i);
+            var value = retrieveRawValue(data, i);
+            dataLabels.push(replace(name ? getConfig('data.withName') : getConfig('data.withoutName'), {
+              name: name,
+              value: value
+            }));
+          }
+        }
+
+        seriesLabel += dataLabels.join(getConfig('data.separator.middle')) + getConfig('data.separator.end');
+        seriesLabels.push(seriesLabel);
+      }
+    });
+    ariaLabel += seriesLabels.join(getConfig('series.multiple.separator.middle')) + getConfig('series.multiple.separator.end');
+    dom.setAttribute('aria-label', ariaLabel);
+  }
+
+  function replace(str, keyValues) {
+    if (typeof str !== 'string') {
+      return str;
+    }
+
+    var result = str;
+    each$1(keyValues, function (value, key) {
+      result = result.replace(new RegExp('\\{\\s*' + key + '\\s*\\}', 'g'), value);
+    });
+    return result;
+  }
+
+  function getConfig(path) {
+    var userConfig = ariaModel.get(path);
+
+    if (userConfig == null) {
+      var pathArr = path.split('.');
+      var result = lang.aria;
+
+      for (var i = 0; i < pathArr.length; ++i) {
+        result = result[pathArr[i]];
+      }
+
+      return result;
+    } else {
+      return userConfig;
+    }
+  }
+
+  function getTitle() {
+    var title = ecModel.getModel('title').option;
+
+    if (title && title.length) {
+      title = title[0];
+    }
+
+    return title && title.text;
+  }
+
+  function getSeriesTypeName(type) {
+    return lang.series.typeNames[type] || '鑷畾涔夊浘';
+  }
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var PI$1 = Math.PI;
+/**
+ * @param {module:echarts/ExtensionAPI} api
+ * @param {Object} [opts]
+ * @param {string} [opts.text]
+ * @param {string} [opts.color]
+ * @param {string} [opts.textColor]
+ * @return {module:zrender/Element}
+ */
+
+var loadingDefault = function (api, opts) {
+  opts = opts || {};
+  defaults(opts, {
+    text: 'loading',
+    color: '#c23531',
+    textColor: '#000',
+    maskColor: 'rgba(255, 255, 255, 0.8)',
+    zlevel: 0
+  });
+  var mask = new Rect({
+    style: {
+      fill: opts.maskColor
+    },
+    zlevel: opts.zlevel,
+    z: 10000
+  });
+  var arc = new Arc({
+    shape: {
+      startAngle: -PI$1 / 2,
+      endAngle: -PI$1 / 2 + 0.1,
+      r: 10
+    },
+    style: {
+      stroke: opts.color,
+      lineCap: 'round',
+      lineWidth: 5
+    },
+    zlevel: opts.zlevel,
+    z: 10001
+  });
+  var labelRect = new Rect({
+    style: {
+      fill: 'none',
+      text: opts.text,
+      textPosition: 'right',
+      textDistance: 10,
+      textFill: opts.textColor
+    },
+    zlevel: opts.zlevel,
+    z: 10001
+  });
+  arc.animateShape(true).when(1000, {
+    endAngle: PI$1 * 3 / 2
+  }).start('circularInOut');
+  arc.animateShape(true).when(1000, {
+    startAngle: PI$1 * 3 / 2
+  }).delay(300).start('circularInOut');
+  var group = new Group();
+  group.add(arc);
+  group.add(labelRect);
+  group.add(mask); // Inject resize
+
+  group.resize = function () {
+    var cx = api.getWidth() / 2;
+    var cy = api.getHeight() / 2;
+    arc.setShape({
+      cx: cx,
+      cy: cy
+    });
+    var r = arc.shape.r;
+    labelRect.setShape({
+      x: cx - r,
+      y: cy - r,
+      width: r * 2,
+      height: r * 2
+    });
+    mask.setShape({
+      x: 0,
+      y: 0,
+      width: api.getWidth(),
+      height: api.getHeight()
+    });
+  };
+
+  group.resize();
+  return group;
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * @module echarts/stream/Scheduler
+ */
+/**
+ * @constructor
+ */
+
+function Scheduler(ecInstance, api, dataProcessorHandlers, visualHandlers) {
+  this.ecInstance = ecInstance;
+  this.api = api;
+  this.unfinished; // Fix current processors in case that in some rear cases that
+  // processors might be registered after echarts instance created.
+  // Register processors incrementally for a echarts instance is
+  // not supported by this stream architecture.
+
+  var dataProcessorHandlers = this._dataProcessorHandlers = dataProcessorHandlers.slice();
+  var visualHandlers = this._visualHandlers = visualHandlers.slice();
+  this._allHandlers = dataProcessorHandlers.concat(visualHandlers);
+  /**
+   * @private
+   * @type {
+   *     [handlerUID: string]: {
+   *         seriesTaskMap?: {
+   *             [seriesUID: string]: Task
+   *         },
+   *         overallTask?: Task
+   *     }
+   * }
+   */
+
+  this._stageTaskMap = createHashMap();
+}
+
+var proto = Scheduler.prototype;
+/**
+ * @param {module:echarts/model/Global} ecModel
+ * @param {Object} payload
+ */
+
+proto.restoreData = function (ecModel, payload) {
+  // TODO: Only restroe needed series and components, but not all components.
+  // Currently `restoreData` of all of the series and component will be called.
+  // But some independent components like `title`, `legend`, `graphic`, `toolbox`,
+  // `tooltip`, `axisPointer`, etc, do not need series refresh when `setOption`,
+  // and some components like coordinate system, axes, dataZoom, visualMap only
+  // need their target series refresh.
+  // (1) If we are implementing this feature some day, we should consider these cases:
+  // if a data processor depends on a component (e.g., dataZoomProcessor depends
+  // on the settings of `dataZoom`), it should be re-performed if the component
+  // is modified by `setOption`.
+  // (2) If a processor depends on sevral series, speicified by its `getTargetSeries`,
+  // it should be re-performed when the result array of `getTargetSeries` changed.
+  // We use `dependencies` to cover these issues.
+  // (3) How to update target series when coordinate system related components modified.
+  // TODO: simply the dirty mechanism? Check whether only the case here can set tasks dirty,
+  // and this case all of the tasks will be set as dirty.
+  ecModel.restoreData(payload); // Theoretically an overall task not only depends on each of its target series, but also
+  // depends on all of the series.
+  // The overall task is not in pipeline, and `ecModel.restoreData` only set pipeline tasks
+  // dirty. If `getTargetSeries` of an overall task returns nothing, we should also ensure
+  // that the overall task is set as dirty and to be performed, otherwise it probably cause
+  // state chaos. So we have to set dirty of all of the overall tasks manually, otherwise it
+  // probably cause state chaos (consider `dataZoomProcessor`).
+
+  this._stageTaskMap.each(function (taskRecord) {
+    var overallTask = taskRecord.overallTask;
+    overallTask && overallTask.dirty();
+  });
+}; // If seriesModel provided, incremental threshold is check by series data.
+
+
+proto.getPerformArgs = function (task, isBlock) {
+  // For overall task
+  if (!task.__pipeline) {
+    return;
+  }
+
+  var pipeline = this._pipelineMap.get(task.__pipeline.id);
+
+  var pCtx = pipeline.context;
+  var incremental = !isBlock && pipeline.progressiveEnabled && (!pCtx || pCtx.progressiveRender) && task.__idxInPipeline > pipeline.blockIndex;
+  var step = incremental ? pipeline.step : null;
+  var modDataCount = pCtx && pCtx.modDataCount;
+  var modBy = modDataCount != null ? Math.ceil(modDataCount / step) : null;
+  return {
+    step: step,
+    modBy: modBy,
+    modDataCount: modDataCount
+  };
+};
+
+proto.getPipeline = function (pipelineId) {
+  return this._pipelineMap.get(pipelineId);
+};
+/**
+ * Current, progressive rendering starts from visual and layout.
+ * Always detect render mode in the same stage, avoiding that incorrect
+ * detection caused by data filtering.
+ * Caution:
+ * `updateStreamModes` use `seriesModel.getData()`.
+ */
+
+
+proto.updateStreamModes = function (seriesModel, view) {
+  var pipeline = this._pipelineMap.get(seriesModel.uid);
+
+  var data = seriesModel.getData();
+  var dataLen = data.count(); // `progressiveRender` means that can render progressively in each
+  // animation frame. Note that some types of series do not provide
+  // `view.incrementalPrepareRender` but support `chart.appendData`. We
+  // use the term `incremental` but not `progressive` to describe the
+  // case that `chart.appendData`.
+
+  var progressiveRender = pipeline.progressiveEnabled && view.incrementalPrepareRender && dataLen >= pipeline.threshold;
+  var large = seriesModel.get('large') && dataLen >= seriesModel.get('largeThreshold'); // TODO: modDataCount should not updated if `appendData`, otherwise cause whole repaint.
+  // see `test/candlestick-large3.html`
+
+  var modDataCount = seriesModel.get('progressiveChunkMode') === 'mod' ? dataLen : null;
+  seriesModel.pipelineContext = pipeline.context = {
+    progressiveRender: progressiveRender,
+    modDataCount: modDataCount,
+    large: large
+  };
+};
+
+proto.restorePipelines = function (ecModel) {
+  var scheduler = this;
+  var pipelineMap = scheduler._pipelineMap = createHashMap();
+  ecModel.eachSeries(function (seriesModel) {
+    var progressive = seriesModel.getProgressive();
+    var pipelineId = seriesModel.uid;
+    pipelineMap.set(pipelineId, {
+      id: pipelineId,
+      head: null,
+      tail: null,
+      threshold: seriesModel.getProgressiveThreshold(),
+      progressiveEnabled: progressive && !(seriesModel.preventIncremental && seriesModel.preventIncremental()),
+      blockIndex: -1,
+      step: Math.round(progressive || 700),
+      count: 0
+    });
+    pipe(scheduler, seriesModel, seriesModel.dataTask);
+  });
+};
+
+proto.prepareStageTasks = function () {
+  var stageTaskMap = this._stageTaskMap;
+  var ecModel = this.ecInstance.getModel();
+  var api = this.api;
+  each$1(this._allHandlers, function (handler) {
+    var record = stageTaskMap.get(handler.uid) || stageTaskMap.set(handler.uid, []);
+    handler.reset && createSeriesStageTask(this, handler, record, ecModel, api);
+    handler.overallReset && createOverallStageTask(this, handler, record, ecModel, api);
+  }, this);
+};
+
+proto.prepareView = function (view, model, ecModel, api) {
+  var renderTask = view.renderTask;
+  var context = renderTask.context;
+  context.model = model;
+  context.ecModel = ecModel;
+  context.api = api;
+  renderTask.__block = !view.incrementalPrepareRender;
+  pipe(this, model, renderTask);
+};
+
+proto.performDataProcessorTasks = function (ecModel, payload) {
+  // If we do not use `block` here, it should be considered when to update modes.
+  performStageTasks(this, this._dataProcessorHandlers, ecModel, payload, {
+    block: true
+  });
+}; // opt
+// opt.visualType: 'visual' or 'layout'
+// opt.setDirty
+
+
+proto.performVisualTasks = function (ecModel, payload, opt) {
+  performStageTasks(this, this._visualHandlers, ecModel, payload, opt);
+};
+
+function performStageTasks(scheduler, stageHandlers, ecModel, payload, opt) {
+  opt = opt || {};
+  var unfinished;
+  each$1(stageHandlers, function (stageHandler, idx) {
+    if (opt.visualType && opt.visualType !== stageHandler.visualType) {
+      return;
+    }
+
+    var stageHandlerRecord = scheduler._stageTaskMap.get(stageHandler.uid);
+
+    var seriesTaskMap = stageHandlerRecord.seriesTaskMap;
+    var overallTask = stageHandlerRecord.overallTask;
+
+    if (overallTask) {
+      var overallNeedDirty;
+      var agentStubMap = overallTask.agentStubMap;
+      agentStubMap.each(function (stub) {
+        if (needSetDirty(opt, stub)) {
+          stub.dirty();
+          overallNeedDirty = true;
+        }
+      });
+      overallNeedDirty && overallTask.dirty();
+      updatePayload(overallTask, payload);
+      var performArgs = scheduler.getPerformArgs(overallTask, opt.block); // Execute stubs firstly, which may set the overall task dirty,
+      // then execute the overall task. And stub will call seriesModel.setData,
+      // which ensures that in the overallTask seriesModel.getData() will not
+      // return incorrect data.
+
+      agentStubMap.each(function (stub) {
+        stub.perform(performArgs);
+      });
+      unfinished |= overallTask.perform(performArgs);
+    } else if (seriesTaskMap) {
+      seriesTaskMap.each(function (task, pipelineId) {
+        if (needSetDirty(opt, task)) {
+          task.dirty();
+        }
+
+        var performArgs = scheduler.getPerformArgs(task, opt.block);
+        performArgs.skip = !stageHandler.performRawSeries && ecModel.isSeriesFiltered(task.context.model);
+        updatePayload(task, payload);
+        unfinished |= task.perform(performArgs);
+      });
+    }
+  });
+
+  function needSetDirty(opt, task) {
+    return opt.setDirty && (!opt.dirtyMap || opt.dirtyMap.get(task.__pipeline.id));
+  }
+
+  scheduler.unfinished |= unfinished;
+}
+
+proto.performSeriesTasks = function (ecModel) {
+  var unfinished;
+  ecModel.eachSeries(function (seriesModel) {
+    // Progress to the end for dataInit and dataRestore.
+    unfinished |= seriesModel.dataTask.perform();
+  });
+  this.unfinished |= unfinished;
+};
+
+proto.plan = function () {
+  // Travel pipelines, check block.
+  this._pipelineMap.each(function (pipeline) {
+    var task = pipeline.tail;
+
+    do {
+      if (task.__block) {
+        pipeline.blockIndex = task.__idxInPipeline;
+        break;
+      }
+
+      task = task.getUpstream();
+    } while (task);
+  });
+};
+
+var updatePayload = proto.updatePayload = function (task, payload) {
+  payload !== 'remain' && (task.context.payload = payload);
+};
+
+function createSeriesStageTask(scheduler, stageHandler, stageHandlerRecord, ecModel, api) {
+  var seriesTaskMap = stageHandlerRecord.seriesTaskMap || (stageHandlerRecord.seriesTaskMap = createHashMap());
+  var seriesType = stageHandler.seriesType;
+  var getTargetSeries = stageHandler.getTargetSeries; // If a stageHandler should cover all series, `createOnAllSeries` should be declared mandatorily,
+  // to avoid some typo or abuse. Otherwise if an extension do not specify a `seriesType`,
+  // it works but it may cause other irrelevant charts blocked.
+
+  if (stageHandler.createOnAllSeries) {
+    ecModel.eachRawSeries(create);
+  } else if (seriesType) {
+    ecModel.eachRawSeriesByType(seriesType, create);
+  } else if (getTargetSeries) {
+    getTargetSeries(ecModel, api).each(create);
+  }
+
+  function create(seriesModel) {
+    var pipelineId = seriesModel.uid; // Init tasks for each seriesModel only once.
+    // Reuse original task instance.
+
+    var task = seriesTaskMap.get(pipelineId) || seriesTaskMap.set(pipelineId, createTask({
+      plan: seriesTaskPlan,
+      reset: seriesTaskReset,
+      count: seriesTaskCount
+    }));
+    task.context = {
+      model: seriesModel,
+      ecModel: ecModel,
+      api: api,
+      useClearVisual: stageHandler.isVisual && !stageHandler.isLayout,
+      plan: stageHandler.plan,
+      reset: stageHandler.reset,
+      scheduler: scheduler
+    };
+    pipe(scheduler, seriesModel, task);
+  } // Clear unused series tasks.
+
+
+  var pipelineMap = scheduler._pipelineMap;
+  seriesTaskMap.each(function (task, pipelineId) {
+    if (!pipelineMap.get(pipelineId)) {
+      task.dispose();
+      seriesTaskMap.removeKey(pipelineId);
+    }
+  });
+}
+
+function createOverallStageTask(scheduler, stageHandler, stageHandlerRecord, ecModel, api) {
+  var overallTask = stageHandlerRecord.overallTask = stageHandlerRecord.overallTask // For overall task, the function only be called on reset stage.
+  || createTask({
+    reset: overallTaskReset
+  });
+  overallTask.context = {
+    ecModel: ecModel,
+    api: api,
+    overallReset: stageHandler.overallReset,
+    scheduler: scheduler
+  }; // Reuse orignal stubs.
+
+  var agentStubMap = overallTask.agentStubMap = overallTask.agentStubMap || createHashMap();
+  var seriesType = stageHandler.seriesType;
+  var getTargetSeries = stageHandler.getTargetSeries;
+  var overallProgress = true;
+  var modifyOutputEnd = stageHandler.modifyOutputEnd; // An overall task with seriesType detected or has `getTargetSeries`, we add
+  // stub in each pipelines, it will set the overall task dirty when the pipeline
+  // progress. Moreover, to avoid call the overall task each frame (too frequent),
+  // we set the pipeline block.
+
+  if (seriesType) {
+    ecModel.eachRawSeriesByType(seriesType, createStub);
+  } else if (getTargetSeries) {
+    getTargetSeries(ecModel, api).each(createStub);
+  } // Otherwise, (usually it is legancy case), the overall task will only be
+  // executed when upstream dirty. Otherwise the progressive rendering of all
+  // pipelines will be disabled unexpectedly. But it still needs stubs to receive
+  // dirty info from upsteam.
+  else {
+      overallProgress = false;
+      each$1(ecModel.getSeries(), createStub);
+    }
+
+  function createStub(seriesModel) {
+    var pipelineId = seriesModel.uid;
+    var stub = agentStubMap.get(pipelineId);
+
+    if (!stub) {
+      stub = agentStubMap.set(pipelineId, createTask({
+        reset: stubReset,
+        onDirty: stubOnDirty
+      })); // When the result of `getTargetSeries` changed, the overallTask
+      // should be set as dirty and re-performed.
+
+      overallTask.dirty();
+    }
+
+    stub.context = {
+      model: seriesModel,
+      overallProgress: overallProgress,
+      modifyOutputEnd: modifyOutputEnd
+    };
+    stub.agent = overallTask;
+    stub.__block = overallProgress;
+    pipe(scheduler, seriesModel, stub);
+  } // Clear unused stubs.
+
+
+  var pipelineMap = scheduler._pipelineMap;
+  agentStubMap.each(function (stub, pipelineId) {
+    if (!pipelineMap.get(pipelineId)) {
+      stub.dispose(); // When the result of `getTargetSeries` changed, the overallTask
+      // should be set as dirty and re-performed.
+
+      overallTask.dirty();
+      agentStubMap.removeKey(pipelineId);
+    }
+  });
+}
+
+function overallTaskReset(context) {
+  context.overallReset(context.ecModel, context.api, context.payload);
+}
+
+function stubReset(context, upstreamContext) {
+  return context.overallProgress && stubProgress;
+}
+
+function stubProgress() {
+  this.agent.dirty();
+  this.getDownstream().dirty();
+}
+
+function stubOnDirty() {
+  this.agent && this.agent.dirty();
+}
+
+function seriesTaskPlan(context) {
+  return context.plan && context.plan(context.model, context.ecModel, context.api, context.payload);
+}
+
+function seriesTaskReset(context) {
+  if (context.useClearVisual) {
+    context.data.clearAllVisual();
+  }
+
+  var resetDefines = context.resetDefines = normalizeToArray(context.reset(context.model, context.ecModel, context.api, context.payload));
+  return resetDefines.length > 1 ? map(resetDefines, function (v, idx) {
+    return makeSeriesTaskProgress(idx);
+  }) : singleSeriesTaskProgress;
+}
+
+var singleSeriesTaskProgress = makeSeriesTaskProgress(0);
+
+function makeSeriesTaskProgress(resetDefineIdx) {
+  return function (params, context) {
+    var data = context.data;
+    var resetDefine = context.resetDefines[resetDefineIdx];
+
+    if (resetDefine && resetDefine.dataEach) {
+      for (var i = params.start; i < params.end; i++) {
+        resetDefine.dataEach(data, i);
+      }
+    } else if (resetDefine && resetDefine.progress) {
+      resetDefine.progress(params, data);
+    }
+  };
+}
+
+function seriesTaskCount(context) {
+  return context.data.count();
+}
+
+function pipe(scheduler, seriesModel, task) {
+  var pipelineId = seriesModel.uid;
+
+  var pipeline = scheduler._pipelineMap.get(pipelineId);
+
+  !pipeline.head && (pipeline.head = task);
+  pipeline.tail && pipeline.tail.pipe(task);
+  pipeline.tail = task;
+  task.__idxInPipeline = pipeline.count++;
+  task.__pipeline = pipeline;
+}
+
+Scheduler.wrapStageHandler = function (stageHandler, visualType) {
+  if (isFunction$1(stageHandler)) {
+    stageHandler = {
+      overallReset: stageHandler,
+      seriesType: detectSeriseType(stageHandler)
+    };
+  }
+
+  stageHandler.uid = getUID('stageHandler');
+  visualType && (stageHandler.visualType = visualType);
+  return stageHandler;
+};
+/**
+ * Only some legacy stage handlers (usually in echarts extensions) are pure function.
+ * To ensure that they can work normally, they should work in block mode, that is,
+ * they should not be started util the previous tasks finished. So they cause the
+ * progressive rendering disabled. We try to detect the series type, to narrow down
+ * the block range to only the series type they concern, but not all series.
+ */
+
+
+function detectSeriseType(legacyFunc) {
+  seriesType = null;
+
+  try {
+    // Assume there is no async when calling `eachSeriesByType`.
+    legacyFunc(ecModelMock, apiMock);
+  } catch (e) {}
+
+  return seriesType;
+}
+
+var ecModelMock = {};
+var apiMock = {};
+var seriesType;
+mockMethods(ecModelMock, GlobalModel);
+mockMethods(apiMock, ExtensionAPI);
+
+ecModelMock.eachSeriesByType = ecModelMock.eachRawSeriesByType = function (type) {
+  seriesType = type;
+};
+
+ecModelMock.eachComponent = function (cond) {
+  if (cond.mainType === 'series' && cond.subType) {
+    seriesType = cond.subType;
+  }
+};
+
+function mockMethods(target, Clz) {
+  /* eslint-disable */
+  for (var name in Clz.prototype) {
+    // Do not use hasOwnProperty
+    target[name] = noop;
+  }
+  /* eslint-enable */
+
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var colorAll = ['#37A2DA', '#32C5E9', '#67E0E3', '#9FE6B8', '#FFDB5C', '#ff9f7f', '#fb7293', '#E062AE', '#E690D1', '#e7bcf3', '#9d96f5', '#8378EA', '#96BFFF'];
+var lightTheme = {
+  color: colorAll,
+  colorLayer: [['#37A2DA', '#ffd85c', '#fd7b5f'], ['#37A2DA', '#67E0E3', '#FFDB5C', '#ff9f7f', '#E062AE', '#9d96f5'], ['#37A2DA', '#32C5E9', '#9FE6B8', '#FFDB5C', '#ff9f7f', '#fb7293', '#e7bcf3', '#8378EA', '#96BFFF'], colorAll]
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var contrastColor = '#eee';
+
+var axisCommon = function () {
+  return {
+    axisLine: {
+      lineStyle: {
+        color: contrastColor
+      }
+    },
+    axisTick: {
+      lineStyle: {
+        color: contrastColor
+      }
+    },
+    axisLabel: {
+      textStyle: {
+        color: contrastColor
+      }
+    },
+    splitLine: {
+      lineStyle: {
+        type: 'dashed',
+        color: '#aaa'
+      }
+    },
+    splitArea: {
+      areaStyle: {
+        color: contrastColor
+      }
+    }
+  };
+};
+
+var colorPalette = ['#dd6b66', '#759aa0', '#e69d87', '#8dc1a9', '#ea7e53', '#eedd78', '#73a373', '#73b9bc', '#7289ab', '#91ca8c', '#f49f42'];
+var theme = {
+  color: colorPalette,
+  backgroundColor: '#333',
+  tooltip: {
+    axisPointer: {
+      lineStyle: {
+        color: contrastColor
+      },
+      crossStyle: {
+        color: contrastColor
+      }
+    }
+  },
+  legend: {
+    textStyle: {
+      color: contrastColor
+    }
+  },
+  textStyle: {
+    color: contrastColor
+  },
+  title: {
+    textStyle: {
+      color: contrastColor
+    }
+  },
+  toolbox: {
+    iconStyle: {
+      normal: {
+        borderColor: contrastColor
+      }
+    }
+  },
+  dataZoom: {
+    textStyle: {
+      color: contrastColor
+    }
+  },
+  visualMap: {
+    textStyle: {
+      color: contrastColor
+    }
+  },
+  timeline: {
+    lineStyle: {
+      color: contrastColor
+    },
+    itemStyle: {
+      normal: {
+        color: colorPalette[1]
+      }
+    },
+    label: {
+      normal: {
+        textStyle: {
+          color: contrastColor
+        }
+      }
+    },
+    controlStyle: {
+      normal: {
+        color: contrastColor,
+        borderColor: contrastColor
+      }
+    }
+  },
+  timeAxis: axisCommon(),
+  logAxis: axisCommon(),
+  valueAxis: axisCommon(),
+  categoryAxis: axisCommon(),
+  line: {
+    symbol: 'circle'
+  },
+  graph: {
+    color: colorPalette
+  },
+  gauge: {
+    title: {
+      textStyle: {
+        color: contrastColor
+      }
+    }
+  },
+  candlestick: {
+    itemStyle: {
+      normal: {
+        color: '#FD1050',
+        color0: '#0CF49B',
+        borderColor: '#FD1050',
+        borderColor0: '#0CF49B'
+      }
+    }
+  }
+};
+theme.categoryAxis.splitLine.show = false;
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * This module is imported by echarts directly.
+ *
+ * Notice:
+ * Always keep this file exists for backward compatibility.
+ * Because before 4.1.0, dataset is an optional component,
+ * some users may import this module manually.
+ */
+ComponentModel.extend({
+  type: 'dataset',
+
+  /**
+   * @protected
+   */
+  defaultOption: {
+    // 'row', 'column'
+    seriesLayoutBy: SERIES_LAYOUT_BY_COLUMN,
+    // null/'auto': auto detect header, see "module:echarts/data/helper/sourceHelper"
+    sourceHeader: null,
+    dimensions: null,
+    source: null
+  },
+  optionUpdated: function () {
+    detectSourceFormat(this);
+  }
+});
+Component$1.extend({
+  type: 'dataset'
+});
+
+/**
+ * 妞渾褰㈢姸
+ * @module zrender/graphic/shape/Ellipse
+ */
+var Ellipse = Path.extend({
+  type: 'ellipse',
+  shape: {
+    cx: 0,
+    cy: 0,
+    rx: 0,
+    ry: 0
+  },
+  buildPath: function (ctx, shape) {
+    var k = 0.5522848;
+    var x = shape.cx;
+    var y = shape.cy;
+    var a = shape.rx;
+    var b = shape.ry;
+    var ox = a * k; // 姘村钩鎺у埗鐐瑰亸绉婚噺
+
+    var oy = b * k; // 鍨傜洿鎺у埗鐐瑰亸绉婚噺
+    // 浠庢き鍦嗙殑宸︾鐐瑰紑濮嬮『鏃堕拡缁樺埗鍥涙潯涓夋璐濆灏旀洸绾�
+
+    ctx.moveTo(x - a, y);
+    ctx.bezierCurveTo(x - a, y - oy, x - ox, y - b, x, y - b);
+    ctx.bezierCurveTo(x + ox, y - b, x + a, y - oy, x + a, y);
+    ctx.bezierCurveTo(x + a, y + oy, x + ox, y + b, x, y + b);
+    ctx.bezierCurveTo(x - ox, y + b, x - a, y + oy, x - a, y);
+    ctx.closePath();
+  }
+});
+
+// import Pattern from '../graphic/Pattern';
+
+var DILIMITER_REG = /[\s,]+/;
+/**
+ * For big svg string, this method might be time consuming.
+ *
+ * @param {string} svg xml string
+ * @return {Object} xml root.
+ */
+
+function parseXML(svg) {
+  if (isString(svg)) {
+    var parser = new DOMParser();
+    svg = parser.parseFromString(svg, 'text/xml');
+  } // Document node. If using $.get, doc node may be input.
+
+
+  if (svg.nodeType === 9) {
+    svg = svg.firstChild;
+  } // nodeName of <!DOCTYPE svg> is also 'svg'.
+
+
+  while (svg.nodeName.toLowerCase() !== 'svg' || svg.nodeType !== 1) {
+    svg = svg.nextSibling;
+  }
+
+  return svg;
+}
+
+function SVGParser() {
+  this._defs = {};
+  this._root = null;
+  this._isDefine = false;
+  this._isText = false;
+}
+
+SVGParser.prototype.parse = function (xml, opt) {
+  opt = opt || {};
+  var svg = parseXML(xml);
+
+  if (!svg) {
+    throw new Error('Illegal svg');
+  }
+
+  var root = new Group();
+  this._root = root; // parse view port
+
+  var viewBox = svg.getAttribute('viewBox') || ''; // If width/height not specified, means "100%" of `opt.width/height`.
+  // TODO: Other percent value not supported yet.
+
+  var width = parseFloat(svg.getAttribute('width') || opt.width);
+  var height = parseFloat(svg.getAttribute('height') || opt.height); // If width/height not specified, set as null for output.
+
+  isNaN(width) && (width = null);
+  isNaN(height) && (height = null); // Apply inline style on svg element.
+
+  parseAttributes(svg, root, null, true);
+  var child = svg.firstChild;
+
+  while (child) {
+    this._parseNode(child, root);
+
+    child = child.nextSibling;
+  }
+
+  var viewBoxRect;
+  var viewBoxTransform;
+
+  if (viewBox) {
+    var viewBoxArr = trim(viewBox).split(DILIMITER_REG); // Some invalid case like viewBox: 'none'.
+
+    if (viewBoxArr.length >= 4) {
+      viewBoxRect = {
+        x: parseFloat(viewBoxArr[0] || 0),
+        y: parseFloat(viewBoxArr[1] || 0),
+        width: parseFloat(viewBoxArr[2]),
+        height: parseFloat(viewBoxArr[3])
+      };
+    }
+  }
+
+  if (viewBoxRect && width != null && height != null) {
+    viewBoxTransform = makeViewBoxTransform(viewBoxRect, width, height);
+
+    if (!opt.ignoreViewBox) {
+      // If set transform on the output group, it probably bring trouble when
+      // some users only intend to show the clipped content inside the viewBox,
+      // but not intend to transform the output group. So we keep the output
+      // group no transform. If the user intend to use the viewBox as a
+      // camera, just set `opt.ignoreViewBox` as `true` and set transfrom
+      // manually according to the viewBox info in the output of this method.
+      var elRoot = root;
+      root = new Group();
+      root.add(elRoot);
+      elRoot.scale = viewBoxTransform.scale.slice();
+      elRoot.position = viewBoxTransform.position.slice();
+    }
+  } // Some shapes might be overflow the viewport, which should be
+  // clipped despite whether the viewBox is used, as the SVG does.
+
+
+  if (!opt.ignoreRootClip && width != null && height != null) {
+    root.setClipPath(new Rect({
+      shape: {
+        x: 0,
+        y: 0,
+        width: width,
+        height: height
+      }
+    }));
+  } // Set width/height on group just for output the viewport size.
+
+
+  return {
+    root: root,
+    width: width,
+    height: height,
+    viewBoxRect: viewBoxRect,
+    viewBoxTransform: viewBoxTransform
+  };
+};
+
+SVGParser.prototype._parseNode = function (xmlNode, parentGroup) {
+  var nodeName = xmlNode.nodeName.toLowerCase(); // TODO
+  // support <style>...</style> in svg, where nodeName is 'style',
+  // CSS classes is defined globally wherever the style tags are declared.
+
+  if (nodeName === 'defs') {
+    // define flag
+    this._isDefine = true;
+  } else if (nodeName === 'text') {
+    this._isText = true;
+  }
+
+  var el;
+
+  if (this._isDefine) {
+    var parser = defineParsers[nodeName];
+
+    if (parser) {
+      var def = parser.call(this, xmlNode);
+      var id = xmlNode.getAttribute('id');
+
+      if (id) {
+        this._defs[id] = def;
+      }
+    }
+  } else {
+    var parser = nodeParsers[nodeName];
+
+    if (parser) {
+      el = parser.call(this, xmlNode, parentGroup);
+      parentGroup.add(el);
+    }
+  }
+
+  var child = xmlNode.firstChild;
+
+  while (child) {
+    if (child.nodeType === 1) {
+      this._parseNode(child, el);
+    } // Is text
+
+
+    if (child.nodeType === 3 && this._isText) {
+      this._parseText(child, el);
+    }
+
+    child = child.nextSibling;
+  } // Quit define
+
+
+  if (nodeName === 'defs') {
+    this._isDefine = false;
+  } else if (nodeName === 'text') {
+    this._isText = false;
+  }
+};
+
+SVGParser.prototype._parseText = function (xmlNode, parentGroup) {
+  if (xmlNode.nodeType === 1) {
+    var dx = xmlNode.getAttribute('dx') || 0;
+    var dy = xmlNode.getAttribute('dy') || 0;
+    this._textX += parseFloat(dx);
+    this._textY += parseFloat(dy);
+  }
+
+  var text = new Text({
+    style: {
+      text: xmlNode.textContent,
+      transformText: true
+    },
+    position: [this._textX || 0, this._textY || 0]
+  });
+  inheritStyle(parentGroup, text);
+  parseAttributes(xmlNode, text, this._defs);
+  var fontSize = text.style.fontSize;
+
+  if (fontSize && fontSize < 9) {
+    // PENDING
+    text.style.fontSize = 9;
+    text.scale = text.scale || [1, 1];
+    text.scale[0] *= fontSize / 9;
+    text.scale[1] *= fontSize / 9;
+  }
+
+  var rect = text.getBoundingRect();
+  this._textX += rect.width;
+  parentGroup.add(text);
+  return text;
+};
+
+var nodeParsers = {
+  'g': function (xmlNode, parentGroup) {
+    var g = new Group();
+    inheritStyle(parentGroup, g);
+    parseAttributes(xmlNode, g, this._defs);
+    return g;
+  },
+  'rect': function (xmlNode, parentGroup) {
+    var rect = new Rect();
+    inheritStyle(parentGroup, rect);
+    parseAttributes(xmlNode, rect, this._defs);
+    rect.setShape({
+      x: parseFloat(xmlNode.getAttribute('x') || 0),
+      y: parseFloat(xmlNode.getAttribute('y') || 0),
+      width: parseFloat(xmlNode.getAttribute('width') || 0),
+      height: parseFloat(xmlNode.getAttribute('height') || 0)
+    }); // console.log(xmlNode.getAttribute('transform'));
+    // console.log(rect.transform);
+
+    return rect;
+  },
+  'circle': function (xmlNode, parentGroup) {
+    var circle = new Circle();
+    inheritStyle(parentGroup, circle);
+    parseAttributes(xmlNode, circle, this._defs);
+    circle.setShape({
+      cx: parseFloat(xmlNode.getAttribute('cx') || 0),
+      cy: parseFloat(xmlNode.getAttribute('cy') || 0),
+      r: parseFloat(xmlNode.getAttribute('r') || 0)
+    });
+    return circle;
+  },
+  'line': function (xmlNode, parentGroup) {
+    var line = new Line();
+    inheritStyle(parentGroup, line);
+    parseAttributes(xmlNode, line, this._defs);
+    line.setShape({
+      x1: parseFloat(xmlNode.getAttribute('x1') || 0),
+      y1: parseFloat(xmlNode.getAttribute('y1') || 0),
+      x2: parseFloat(xmlNode.getAttribute('x2') || 0),
+      y2: parseFloat(xmlNode.getAttribute('y2') || 0)
+    });
+    return line;
+  },
+  'ellipse': function (xmlNode, parentGroup) {
+    var ellipse = new Ellipse();
+    inheritStyle(parentGroup, ellipse);
+    parseAttributes(xmlNode, ellipse, this._defs);
+    ellipse.setShape({
+      cx: parseFloat(xmlNode.getAttribute('cx') || 0),
+      cy: parseFloat(xmlNode.getAttribute('cy') || 0),
+      rx: parseFloat(xmlNode.getAttribute('rx') || 0),
+      ry: parseFloat(xmlNode.getAttribute('ry') || 0)
+    });
+    return ellipse;
+  },
+  'polygon': function (xmlNode, parentGroup) {
+    var points = xmlNode.getAttribute('points');
+
+    if (points) {
+      points = parsePoints(points);
+    }
+
+    var polygon = new Polygon({
+      shape: {
+        points: points || []
+      }
+    });
+    inheritStyle(parentGroup, polygon);
+    parseAttributes(xmlNode, polygon, this._defs);
+    return polygon;
+  },
+  'polyline': function (xmlNode, parentGroup) {
+    var path = new Path();
+    inheritStyle(parentGroup, path);
+    parseAttributes(xmlNode, path, this._defs);
+    var points = xmlNode.getAttribute('points');
+
+    if (points) {
+      points = parsePoints(points);
+    }
+
+    var polyline = new Polyline({
+      shape: {
+        points: points || []
+      }
+    });
+    return polyline;
+  },
+  'image': function (xmlNode, parentGroup) {
+    var img = new ZImage();
+    inheritStyle(parentGroup, img);
+    parseAttributes(xmlNode, img, this._defs);
+    img.setStyle({
+      image: xmlNode.getAttribute('xlink:href'),
+      x: xmlNode.getAttribute('x'),
+      y: xmlNode.getAttribute('y'),
+      width: xmlNode.getAttribute('width'),
+      height: xmlNode.getAttribute('height')
+    });
+    return img;
+  },
+  'text': function (xmlNode, parentGroup) {
+    var x = xmlNode.getAttribute('x') || 0;
+    var y = xmlNode.getAttribute('y') || 0;
+    var dx = xmlNode.getAttribute('dx') || 0;
+    var dy = xmlNode.getAttribute('dy') || 0;
+    this._textX = parseFloat(x) + parseFloat(dx);
+    this._textY = parseFloat(y) + parseFloat(dy);
+    var g = new Group();
+    inheritStyle(parentGroup, g);
+    parseAttributes(xmlNode, g, this._defs);
+    return g;
+  },
+  'tspan': function (xmlNode, parentGroup) {
+    var x = xmlNode.getAttribute('x');
+    var y = xmlNode.getAttribute('y');
+
+    if (x != null) {
+      // new offset x
+      this._textX = parseFloat(x);
+    }
+
+    if (y != null) {
+      // new offset y
+      this._textY = parseFloat(y);
+    }
+
+    var dx = xmlNode.getAttribute('dx') || 0;
+    var dy = xmlNode.getAttribute('dy') || 0;
+    var g = new Group();
+    inheritStyle(parentGroup, g);
+    parseAttributes(xmlNode, g, this._defs);
+    this._textX += dx;
+    this._textY += dy;
+    return g;
+  },
+  'path': function (xmlNode, parentGroup) {
+    // TODO svg fill rule
+    // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/fill-rule
+    // path.style.globalCompositeOperation = 'xor';
+    var d = xmlNode.getAttribute('d') || ''; // Performance sensitive.
+
+    var path = createFromString(d);
+    inheritStyle(parentGroup, path);
+    parseAttributes(xmlNode, path, this._defs);
+    return path;
+  }
+};
+var defineParsers = {
+  'lineargradient': function (xmlNode) {
+    var x1 = parseInt(xmlNode.getAttribute('x1') || 0, 10);
+    var y1 = parseInt(xmlNode.getAttribute('y1') || 0, 10);
+    var x2 = parseInt(xmlNode.getAttribute('x2') || 10, 10);
+    var y2 = parseInt(xmlNode.getAttribute('y2') || 0, 10);
+    var gradient = new LinearGradient(x1, y1, x2, y2);
+
+    _parseGradientColorStops(xmlNode, gradient);
+
+    return gradient;
+  },
+  'radialgradient': function (xmlNode) {}
+};
+
+function _parseGradientColorStops(xmlNode, gradient) {
+  var stop = xmlNode.firstChild;
+
+  while (stop) {
+    if (stop.nodeType === 1) {
+      var offset = stop.getAttribute('offset');
+
+      if (offset.indexOf('%') > 0) {
+        // percentage
+        offset = parseInt(offset, 10) / 100;
+      } else if (offset) {
+        // number from 0 to 1
+        offset = parseFloat(offset);
+      } else {
+        offset = 0;
+      }
+
+      var stopColor = stop.getAttribute('stop-color') || '#000000';
+      gradient.addColorStop(offset, stopColor);
+    }
+
+    stop = stop.nextSibling;
+  }
+}
+
+function inheritStyle(parent, child) {
+  if (parent && parent.__inheritedStyle) {
+    if (!child.__inheritedStyle) {
+      child.__inheritedStyle = {};
+    }
+
+    defaults(child.__inheritedStyle, parent.__inheritedStyle);
+  }
+}
+
+function parsePoints(pointsString) {
+  var list = trim(pointsString).split(DILIMITER_REG);
+  var points = [];
+
+  for (var i = 0; i < list.length; i += 2) {
+    var x = parseFloat(list[i]);
+    var y = parseFloat(list[i + 1]);
+    points.push([x, y]);
+  }
+
+  return points;
+}
+
+var attributesMap = {
+  'fill': 'fill',
+  'stroke': 'stroke',
+  'stroke-width': 'lineWidth',
+  'opacity': 'opacity',
+  'fill-opacity': 'fillOpacity',
+  'stroke-opacity': 'strokeOpacity',
+  'stroke-dasharray': 'lineDash',
+  'stroke-dashoffset': 'lineDashOffset',
+  'stroke-linecap': 'lineCap',
+  'stroke-linejoin': 'lineJoin',
+  'stroke-miterlimit': 'miterLimit',
+  'font-family': 'fontFamily',
+  'font-size': 'fontSize',
+  'font-style': 'fontStyle',
+  'font-weight': 'fontWeight',
+  'text-align': 'textAlign',
+  'alignment-baseline': 'textBaseline'
+};
+
+function parseAttributes(xmlNode, el, defs, onlyInlineStyle) {
+  var zrStyle = el.__inheritedStyle || {};
+  var isTextEl = el.type === 'text'; // TODO Shadow
+
+  if (xmlNode.nodeType === 1) {
+    parseTransformAttribute(xmlNode, el);
+    extend(zrStyle, parseStyleAttribute(xmlNode));
+
+    if (!onlyInlineStyle) {
+      for (var svgAttrName in attributesMap) {
+        if (attributesMap.hasOwnProperty(svgAttrName)) {
+          var attrValue = xmlNode.getAttribute(svgAttrName);
+
+          if (attrValue != null) {
+            zrStyle[attributesMap[svgAttrName]] = attrValue;
+          }
+        }
+      }
+    }
+  }
+
+  var elFillProp = isTextEl ? 'textFill' : 'fill';
+  var elStrokeProp = isTextEl ? 'textStroke' : 'stroke';
+  el.style = el.style || new Style();
+  var elStyle = el.style;
+  zrStyle.fill != null && elStyle.set(elFillProp, getPaint(zrStyle.fill, defs));
+  zrStyle.stroke != null && elStyle.set(elStrokeProp, getPaint(zrStyle.stroke, defs));
+  each$1(['lineWidth', 'opacity', 'fillOpacity', 'strokeOpacity', 'miterLimit', 'fontSize'], function (propName) {
+    var elPropName = propName === 'lineWidth' && isTextEl ? 'textStrokeWidth' : propName;
+    zrStyle[propName] != null && elStyle.set(elPropName, parseFloat(zrStyle[propName]));
+  });
+
+  if (!zrStyle.textBaseline || zrStyle.textBaseline === 'auto') {
+    zrStyle.textBaseline = 'alphabetic';
+  }
+
+  if (zrStyle.textBaseline === 'alphabetic') {
+    zrStyle.textBaseline = 'bottom';
+  }
+
+  if (zrStyle.textAlign === 'start') {
+    zrStyle.textAlign = 'left';
+  }
+
+  if (zrStyle.textAlign === 'end') {
+    zrStyle.textAlign = 'right';
+  }
+
+  each$1(['lineDashOffset', 'lineCap', 'lineJoin', 'fontWeight', 'fontFamily', 'fontStyle', 'textAlign', 'textBaseline'], function (propName) {
+    zrStyle[propName] != null && elStyle.set(propName, zrStyle[propName]);
+  });
+
+  if (zrStyle.lineDash) {
+    el.style.lineDash = trim(zrStyle.lineDash).split(DILIMITER_REG);
+  }
+
+  if (elStyle[elStrokeProp] && elStyle[elStrokeProp] !== 'none') {
+    // enable stroke
+    el[elStrokeProp] = true;
+  }
+
+  el.__inheritedStyle = zrStyle;
+}
+
+var urlRegex = /url\(\s*#(.*?)\)/;
+
+function getPaint(str, defs) {
+  // if (str === 'none') {
+  //     return;
+  // }
+  var urlMatch = defs && str && str.match(urlRegex);
+
+  if (urlMatch) {
+    var url = trim(urlMatch[1]);
+    var def = defs[url];
+    return def;
+  }
+
+  return str;
+}
+
+var transformRegex = /(translate|scale|rotate|skewX|skewY|matrix)\(([\-\s0-9\.e,]*)\)/g;
+
+function parseTransformAttribute(xmlNode, node) {
+  var transform = xmlNode.getAttribute('transform');
+
+  if (transform) {
+    transform = transform.replace(/,/g, ' ');
+    var m = null;
+    var transformOps = [];
+    transform.replace(transformRegex, function (str, type, value) {
+      transformOps.push(type, value);
+    });
+
+    for (var i = transformOps.length - 1; i > 0; i -= 2) {
+      var value = transformOps[i];
+      var type = transformOps[i - 1];
+      m = m || create$1();
+
+      switch (type) {
+        case 'translate':
+          value = trim(value).split(DILIMITER_REG);
+          translate(m, m, [parseFloat(value[0]), parseFloat(value[1] || 0)]);
+          break;
+
+        case 'scale':
+          value = trim(value).split(DILIMITER_REG);
+          scale$1(m, m, [parseFloat(value[0]), parseFloat(value[1] || value[0])]);
+          break;
+
+        case 'rotate':
+          value = trim(value).split(DILIMITER_REG);
+          rotate(m, m, parseFloat(value[0]));
+          break;
+
+        case 'skew':
+          value = trim(value).split(DILIMITER_REG);
+          console.warn('Skew transform is not supported yet');
+          break;
+
+        case 'matrix':
+          var value = trim(value).split(DILIMITER_REG);
+          m[0] = parseFloat(value[0]);
+          m[1] = parseFloat(value[1]);
+          m[2] = parseFloat(value[2]);
+          m[3] = parseFloat(value[3]);
+          m[4] = parseFloat(value[4]);
+          m[5] = parseFloat(value[5]);
+          break;
+      }
+    }
+  }
+
+  node.setLocalTransform(m);
+} // Value may contain space.
+
+
+var styleRegex = /([^\s:;]+)\s*:\s*([^:;]+)/g;
+
+function parseStyleAttribute(xmlNode) {
+  var style = xmlNode.getAttribute('style');
+  var result = {};
+
+  if (!style) {
+    return result;
+  }
+
+  var styleList = {};
+  styleRegex.lastIndex = 0;
+  var styleRegResult;
+
+  while ((styleRegResult = styleRegex.exec(style)) != null) {
+    styleList[styleRegResult[1]] = styleRegResult[2];
+  }
+
+  for (var svgAttrName in attributesMap) {
+    if (attributesMap.hasOwnProperty(svgAttrName) && styleList[svgAttrName] != null) {
+      result[attributesMap[svgAttrName]] = styleList[svgAttrName];
+    }
+  }
+
+  return result;
+}
+/**
+ * @param {Array.<number>} viewBoxRect
+ * @param {number} width
+ * @param {number} height
+ * @return {Object} {scale, position}
+ */
+
+
+function makeViewBoxTransform(viewBoxRect, width, height) {
+  var scaleX = width / viewBoxRect.width;
+  var scaleY = height / viewBoxRect.height;
+  var scale = Math.min(scaleX, scaleY); // preserveAspectRatio 'xMidYMid'
+
+  var viewBoxScale = [scale, scale];
+  var viewBoxPosition = [-(viewBoxRect.x + viewBoxRect.width / 2) * scale + width / 2, -(viewBoxRect.y + viewBoxRect.height / 2) * scale + height / 2];
+  return {
+    scale: viewBoxScale,
+    position: viewBoxPosition
+  };
+}
+/**
+ * @param {string|XMLElement} xml
+ * @param {Object} [opt]
+ * @param {number} [opt.width] Default width if svg width not specified or is a percent value.
+ * @param {number} [opt.height] Default height if svg height not specified or is a percent value.
+ * @param {boolean} [opt.ignoreViewBox]
+ * @param {boolean} [opt.ignoreRootClip]
+ * @return {Object} result:
+ * {
+ *     root: Group, The root of the the result tree of zrender shapes,
+ *     width: number, the viewport width of the SVG,
+ *     height: number, the viewport height of the SVG,
+ *     viewBoxRect: {x, y, width, height}, the declared viewBox rect of the SVG, if exists,
+ *     viewBoxTransform: the {scale, position} calculated by viewBox and viewport, is exists.
+ * }
+ */
+
+function parseSVG(xml, opt) {
+  var parser = new SVGParser();
+  return parser.parse(xml, opt);
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var storage = createHashMap(); // For minimize the code size of common echarts package,
+// do not put too much logic in this module.
+
+var mapDataStorage = {
+  // The format of record: see `echarts.registerMap`.
+  // Compatible with previous `echarts.registerMap`.
+  registerMap: function (mapName, rawGeoJson, rawSpecialAreas) {
+    var records;
+
+    if (isArray(rawGeoJson)) {
+      records = rawGeoJson;
+    } else if (rawGeoJson.svg) {
+      records = [{
+        type: 'svg',
+        source: rawGeoJson.svg,
+        specialAreas: rawGeoJson.specialAreas
+      }];
+    } else {
+      // Backward compatibility.
+      if (rawGeoJson.geoJson && !rawGeoJson.features) {
+        rawSpecialAreas = rawGeoJson.specialAreas;
+        rawGeoJson = rawGeoJson.geoJson;
+      }
+
+      records = [{
+        type: 'geoJSON',
+        source: rawGeoJson,
+        specialAreas: rawSpecialAreas
+      }];
+    }
+
+    each$1(records, function (record) {
+      var type = record.type;
+      type === 'geoJson' && (type = record.type = 'geoJSON');
+      var parse = parsers[type];
+      parse(record);
+    });
+    return storage.set(mapName, records);
+  },
+  retrieveMap: function (mapName) {
+    return storage.get(mapName);
+  }
+};
+var parsers = {
+  geoJSON: function (record) {
+    var source = record.source;
+    record.geoJSON = !isString(source) ? source : typeof JSON !== 'undefined' && JSON.parse ? JSON.parse(source) : new Function('return (' + source + ');')();
+  },
+  // Only perform parse to XML object here, which might be time
+  // consiming for large SVG.
+  // Although convert XML to zrender element is also time consiming,
+  // if we do it here, the clone of zrender elements has to be
+  // required. So we do it once for each geo instance, util real
+  // performance issues call for optimizing it.
+  svg: function (record) {
+    record.svgXML = parseXML(record.source);
+  }
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var assert = assert$1;
+var each = each$1;
+var isFunction = isFunction$1;
+var isObject = isObject$1;
+var parseClassType = ComponentModel.parseClassType;
+var version = '4.2.0';
+var dependencies = {
+  zrender: '4.0.5'
+};
+var TEST_FRAME_REMAIN_TIME = 1;
+var PRIORITY_PROCESSOR_FILTER = 1000;
+var PRIORITY_PROCESSOR_STATISTIC = 5000;
+var PRIORITY_VISUAL_LAYOUT = 1000;
+var PRIORITY_VISUAL_GLOBAL = 2000;
+var PRIORITY_VISUAL_CHART = 3000;
+var PRIORITY_VISUAL_COMPONENT = 4000; // FIXME
+// necessary?
+
+var PRIORITY_VISUAL_BRUSH = 5000;
+var PRIORITY = {
+  PROCESSOR: {
+    FILTER: PRIORITY_PROCESSOR_FILTER,
+    STATISTIC: PRIORITY_PROCESSOR_STATISTIC
+  },
+  VISUAL: {
+    LAYOUT: PRIORITY_VISUAL_LAYOUT,
+    GLOBAL: PRIORITY_VISUAL_GLOBAL,
+    CHART: PRIORITY_VISUAL_CHART,
+    COMPONENT: PRIORITY_VISUAL_COMPONENT,
+    BRUSH: PRIORITY_VISUAL_BRUSH
+  }
+}; // Main process have three entries: `setOption`, `dispatchAction` and `resize`,
+// where they must not be invoked nestedly, except the only case: invoke
+// dispatchAction with updateMethod "none" in main process.
+// This flag is used to carry out this rule.
+// All events will be triggered out side main process (i.e. when !this[IN_MAIN_PROCESS]).
+
+var IN_MAIN_PROCESS = '__flagInMainProcess';
+var OPTION_UPDATED = '__optionUpdated';
+var ACTION_REG = /^[a-zA-Z0-9_]+$/;
+
+function createRegisterEventWithLowercaseName(method) {
+  return function (eventName, handler, context) {
+    // Event name is all lowercase
+    eventName = eventName && eventName.toLowerCase();
+    Eventful.prototype[method].call(this, eventName, handler, context);
+  };
+}
+/**
+ * @module echarts~MessageCenter
+ */
+
+
+function MessageCenter() {
+  Eventful.call(this);
+}
+
+MessageCenter.prototype.on = createRegisterEventWithLowercaseName('on');
+MessageCenter.prototype.off = createRegisterEventWithLowercaseName('off');
+MessageCenter.prototype.one = createRegisterEventWithLowercaseName('one');
+mixin(MessageCenter, Eventful);
+/**
+ * @module echarts~ECharts
+ */
+
+function ECharts(dom, theme$$1, opts) {
+  opts = opts || {}; // Get theme by name
+
+  if (typeof theme$$1 === 'string') {
+    theme$$1 = themeStorage[theme$$1];
+  }
+  /**
+   * @type {string}
+   */
+
+
+  this.id;
+  /**
+   * Group id
+   * @type {string}
+   */
+
+  this.group;
+  /**
+   * @type {HTMLElement}
+   * @private
+   */
+
+  this._dom = dom;
+  var defaultRenderer = 'canvas';
+
+  /**
+   * @type {module:zrender/ZRender}
+   * @private
+   */
+  var zr = this._zr = init$1(dom, {
+    renderer: opts.renderer || defaultRenderer,
+    devicePixelRatio: opts.devicePixelRatio,
+    width: opts.width,
+    height: opts.height
+  });
+  /**
+   * Expect 60 pfs.
+   * @type {Function}
+   * @private
+   */
+
+  this._throttledZrFlush = throttle(bind(zr.flush, zr), 17);
+  var theme$$1 = clone(theme$$1);
+  theme$$1 && backwardCompat(theme$$1, true);
+  /**
+   * @type {Object}
+   * @private
+   */
+
+  this._theme = theme$$1;
+  /**
+   * @type {Array.<module:echarts/view/Chart>}
+   * @private
+   */
+
+  this._chartsViews = [];
+  /**
+   * @type {Object.<string, module:echarts/view/Chart>}
+   * @private
+   */
+
+  this._chartsMap = {};
+  /**
+   * @type {Array.<module:echarts/view/Component>}
+   * @private
+   */
+
+  this._componentsViews = [];
+  /**
+   * @type {Object.<string, module:echarts/view/Component>}
+   * @private
+   */
+
+  this._componentsMap = {};
+  /**
+   * @type {module:echarts/CoordinateSystem}
+   * @private
+   */
+
+  this._coordSysMgr = new CoordinateSystemManager();
+  /**
+   * @type {module:echarts/ExtensionAPI}
+   * @private
+   */
+
+  var api = this._api = createExtensionAPI(this); // Sort on demand
+
+  function prioritySortFunc(a, b) {
+    return a.__prio - b.__prio;
+  }
+
+  sort(visualFuncs, prioritySortFunc);
+  sort(dataProcessorFuncs, prioritySortFunc);
+  /**
+   * @type {module:echarts/stream/Scheduler}
+   */
+
+  this._scheduler = new Scheduler(this, api, dataProcessorFuncs, visualFuncs);
+  Eventful.call(this, this._ecEventProcessor = new EventProcessor());
+  /**
+   * @type {module:echarts~MessageCenter}
+   * @private
+   */
+
+  this._messageCenter = new MessageCenter(); // Init mouse events
+
+  this._initEvents(); // In case some people write `window.onresize = chart.resize`
+
+
+  this.resize = bind(this.resize, this); // Can't dispatch action during rendering procedure
+
+  this._pendingActions = [];
+  zr.animation.on('frame', this._onframe, this);
+  bindRenderedEvent(zr, this); // ECharts instance can be used as value.
+
+  setAsPrimitive(this);
+}
+
+var echartsProto = ECharts.prototype;
+
+echartsProto._onframe = function () {
+  if (this._disposed) {
+    return;
+  }
+
+  var scheduler = this._scheduler; // Lazy update
+
+  if (this[OPTION_UPDATED]) {
+    var silent = this[OPTION_UPDATED].silent;
+    this[IN_MAIN_PROCESS] = true;
+    prepare(this);
+    updateMethods.update.call(this);
+    this[IN_MAIN_PROCESS] = false;
+    this[OPTION_UPDATED] = false;
+    flushPendingActions.call(this, silent);
+    triggerUpdatedEvent.call(this, silent);
+  } // Avoid do both lazy update and progress in one frame.
+  else if (scheduler.unfinished) {
+      // Stream progress.
+      var remainTime = TEST_FRAME_REMAIN_TIME;
+      var ecModel = this._model;
+      var api = this._api;
+      scheduler.unfinished = false;
+
+      do {
+        var startTime = +new Date();
+        scheduler.performSeriesTasks(ecModel); // Currently dataProcessorFuncs do not check threshold.
+
+        scheduler.performDataProcessorTasks(ecModel);
+        updateStreamModes(this, ecModel); // Do not update coordinate system here. Because that coord system update in
+        // each frame is not a good user experience. So we follow the rule that
+        // the extent of the coordinate system is determin in the first frame (the
+        // frame is executed immedietely after task reset.
+        // this._coordSysMgr.update(ecModel, api);
+        // console.log('--- ec frame visual ---', remainTime);
+
+        scheduler.performVisualTasks(ecModel);
+        renderSeries(this, this._model, api, 'remain');
+        remainTime -= +new Date() - startTime;
+      } while (remainTime > 0 && scheduler.unfinished); // Call flush explicitly for trigger finished event.
+
+
+      if (!scheduler.unfinished) {
+        this._zr.flush();
+      } // Else, zr flushing be ensue within the same frame,
+      // because zr flushing is after onframe event.
+
+    }
+};
+/**
+ * @return {HTMLElement}
+ */
+
+
+echartsProto.getDom = function () {
+  return this._dom;
+};
+/**
+ * @return {module:zrender~ZRender}
+ */
+
+
+echartsProto.getZr = function () {
+  return this._zr;
+};
+/**
+ * Usage:
+ * chart.setOption(option, notMerge, lazyUpdate);
+ * chart.setOption(option, {
+ *     notMerge: ...,
+ *     lazyUpdate: ...,
+ *     silent: ...
+ * });
+ *
+ * @param {Object} option
+ * @param {Object|boolean} [opts] opts or notMerge.
+ * @param {boolean} [opts.notMerge=false]
+ * @param {boolean} [opts.lazyUpdate=false] Useful when setOption frequently.
+ */
+
+
+echartsProto.setOption = function (option, notMerge, lazyUpdate) {
+  var silent;
+
+  if (isObject(notMerge)) {
+    lazyUpdate = notMerge.lazyUpdate;
+    silent = notMerge.silent;
+    notMerge = notMerge.notMerge;
+  }
+
+  this[IN_MAIN_PROCESS] = true;
+
+  if (!this._model || notMerge) {
+    var optionManager = new OptionManager(this._api);
+    var theme$$1 = this._theme;
+    var ecModel = this._model = new GlobalModel(null, null, theme$$1, optionManager);
+    ecModel.scheduler = this._scheduler;
+    ecModel.init(null, null, theme$$1, optionManager);
+  }
+
+  this._model.setOption(option, optionPreprocessorFuncs);
+
+  if (lazyUpdate) {
+    this[OPTION_UPDATED] = {
+      silent: silent
+    };
+    this[IN_MAIN_PROCESS] = false;
+  } else {
+    prepare(this);
+    updateMethods.update.call(this); // Ensure zr refresh sychronously, and then pixel in canvas can be
+    // fetched after `setOption`.
+
+    this._zr.flush();
+
+    this[OPTION_UPDATED] = false;
+    this[IN_MAIN_PROCESS] = false;
+    flushPendingActions.call(this, silent);
+    triggerUpdatedEvent.call(this, silent);
+  }
+};
+/**
+ * @DEPRECATED
+ */
+
+
+echartsProto.setTheme = function () {
+  console.error('ECharts#setTheme() is DEPRECATED in ECharts 3.0');
+};
+/**
+ * @return {module:echarts/model/Global}
+ */
+
+
+echartsProto.getModel = function () {
+  return this._model;
+};
+/**
+ * @return {Object}
+ */
+
+
+echartsProto.getOption = function () {
+  return this._model && this._model.getOption();
+};
+/**
+ * @return {number}
+ */
+
+
+echartsProto.getWidth = function () {
+  return this._zr.getWidth();
+};
+/**
+ * @return {number}
+ */
+
+
+echartsProto.getHeight = function () {
+  return this._zr.getHeight();
+};
+/**
+ * @return {number}
+ */
+
+
+echartsProto.getDevicePixelRatio = function () {
+  return this._zr.painter.dpr || window.devicePixelRatio || 1;
+};
+/**
+ * Get canvas which has all thing rendered
+ * @param {Object} opts
+ * @param {string} [opts.backgroundColor]
+ * @return {string}
+ */
+
+
+echartsProto.getRenderedCanvas = function (opts) {
+  if (!env$1.canvasSupported) {
+    return;
+  }
+
+  opts = opts || {};
+  opts.pixelRatio = opts.pixelRatio || 1;
+  opts.backgroundColor = opts.backgroundColor || this._model.get('backgroundColor');
+  var zr = this._zr; // var list = zr.storage.getDisplayList();
+  // Stop animations
+  // Never works before in init animation, so remove it.
+  // zrUtil.each(list, function (el) {
+  //     el.stopAnimation(true);
+  // });
+
+  return zr.painter.getRenderedCanvas(opts);
+};
+/**
+ * Get svg data url
+ * @return {string}
+ */
+
+
+echartsProto.getSvgDataUrl = function () {
+  if (!env$1.svgSupported) {
+    return;
+  }
+
+  var zr = this._zr;
+  var list = zr.storage.getDisplayList(); // Stop animations
+
+  each$1(list, function (el) {
+    el.stopAnimation(true);
+  });
+  return zr.painter.pathToDataUrl();
+};
+/**
+ * @return {string}
+ * @param {Object} opts
+ * @param {string} [opts.type='png']
+ * @param {string} [opts.pixelRatio=1]
+ * @param {string} [opts.backgroundColor]
+ * @param {string} [opts.excludeComponents]
+ */
+
+
+echartsProto.getDataURL = function (opts) {
+  opts = opts || {};
+  var excludeComponents = opts.excludeComponents;
+  var ecModel = this._model;
+  var excludesComponentViews = [];
+  var self = this;
+  each(excludeComponents, function (componentType) {
+    ecModel.eachComponent({
+      mainType: componentType
+    }, function (component) {
+      var view = self._componentsMap[component.__viewId];
+
+      if (!view.group.ignore) {
+        excludesComponentViews.push(view);
+        view.group.ignore = true;
+      }
+    });
+  });
+  var url = this._zr.painter.getType() === 'svg' ? this.getSvgDataUrl() : this.getRenderedCanvas(opts).toDataURL('image/' + (opts && opts.type || 'png'));
+  each(excludesComponentViews, function (view) {
+    view.group.ignore = false;
+  });
+  return url;
+};
+/**
+ * @return {string}
+ * @param {Object} opts
+ * @param {string} [opts.type='png']
+ * @param {string} [opts.pixelRatio=1]
+ * @param {string} [opts.backgroundColor]
+ */
+
+
+echartsProto.getConnectedDataURL = function (opts) {
+  if (!env$1.canvasSupported) {
+    return;
+  }
+
+  var groupId = this.group;
+  var mathMin = Math.min;
+  var mathMax = Math.max;
+  var MAX_NUMBER = Infinity;
+
+  if (connectedGroups[groupId]) {
+    var left = MAX_NUMBER;
+    var top = MAX_NUMBER;
+    var right = -MAX_NUMBER;
+    var bottom = -MAX_NUMBER;
+    var canvasList = [];
+    var dpr = opts && opts.pixelRatio || 1;
+    each$1(instances, function (chart, id) {
+      if (chart.group === groupId) {
+        var canvas = chart.getRenderedCanvas(clone(opts));
+        var boundingRect = chart.getDom().getBoundingClientRect();
+        left = mathMin(boundingRect.left, left);
+        top = mathMin(boundingRect.top, top);
+        right = mathMax(boundingRect.right, right);
+        bottom = mathMax(boundingRect.bottom, bottom);
+        canvasList.push({
+          dom: canvas,
+          left: boundingRect.left,
+          top: boundingRect.top
+        });
+      }
+    });
+    left *= dpr;
+    top *= dpr;
+    right *= dpr;
+    bottom *= dpr;
+    var width = right - left;
+    var height = bottom - top;
+    var targetCanvas = createCanvas();
+    targetCanvas.width = width;
+    targetCanvas.height = height;
+    var zr = init$1(targetCanvas);
+    each(canvasList, function (item) {
+      var img = new ZImage({
+        style: {
+          x: item.left * dpr - left,
+          y: item.top * dpr - top,
+          image: item.dom
+        }
+      });
+      zr.add(img);
+    });
+    zr.refreshImmediately();
+    return targetCanvas.toDataURL('image/' + (opts && opts.type || 'png'));
+  } else {
+    return this.getDataURL(opts);
+  }
+};
+/**
+ * Convert from logical coordinate system to pixel coordinate system.
+ * See CoordinateSystem#convertToPixel.
+ * @param {string|Object} finder
+ *        If string, e.g., 'geo', means {geoIndex: 0}.
+ *        If Object, could contain some of these properties below:
+ *        {
+ *            seriesIndex / seriesId / seriesName,
+ *            geoIndex / geoId, geoName,
+ *            bmapIndex / bmapId / bmapName,
+ *            xAxisIndex / xAxisId / xAxisName,
+ *            yAxisIndex / yAxisId / yAxisName,
+ *            gridIndex / gridId / gridName,
+ *            ... (can be extended)
+ *        }
+ * @param {Array|number} value
+ * @return {Array|number} result
+ */
+
+
+echartsProto.convertToPixel = curry(doConvertPixel, 'convertToPixel');
+/**
+ * Convert from pixel coordinate system to logical coordinate system.
+ * See CoordinateSystem#convertFromPixel.
+ * @param {string|Object} finder
+ *        If string, e.g., 'geo', means {geoIndex: 0}.
+ *        If Object, could contain some of these properties below:
+ *        {
+ *            seriesIndex / seriesId / seriesName,
+ *            geoIndex / geoId / geoName,
+ *            bmapIndex / bmapId / bmapName,
+ *            xAxisIndex / xAxisId / xAxisName,
+ *            yAxisIndex / yAxisId / yAxisName
+ *            gridIndex / gridId / gridName,
+ *            ... (can be extended)
+ *        }
+ * @param {Array|number} value
+ * @return {Array|number} result
+ */
+
+echartsProto.convertFromPixel = curry(doConvertPixel, 'convertFromPixel');
+
+function doConvertPixel(methodName, finder, value) {
+  var ecModel = this._model;
+
+  var coordSysList = this._coordSysMgr.getCoordinateSystems();
+
+  var result;
+  finder = parseFinder(ecModel, finder);
+
+  for (var i = 0; i < coordSysList.length; i++) {
+    var coordSys = coordSysList[i];
+
+    if (coordSys[methodName] && (result = coordSys[methodName](ecModel, finder, value)) != null) {
+      return result;
+    }
+  }
+}
+/**
+ * Is the specified coordinate systems or components contain the given pixel point.
+ * @param {string|Object} finder
+ *        If string, e.g., 'geo', means {geoIndex: 0}.
+ *        If Object, could contain some of these properties below:
+ *        {
+ *            seriesIndex / seriesId / seriesName,
+ *            geoIndex / geoId / geoName,
+ *            bmapIndex / bmapId / bmapName,
+ *            xAxisIndex / xAxisId / xAxisName,
+ *            yAxisIndex / yAxisId / yAxisName,
+ *            gridIndex / gridId / gridName,
+ *            ... (can be extended)
+ *        }
+ * @param {Array|number} value
+ * @return {boolean} result
+ */
+
+
+echartsProto.containPixel = function (finder, value) {
+  var ecModel = this._model;
+  var result;
+  finder = parseFinder(ecModel, finder);
+  each$1(finder, function (models, key) {
+    key.indexOf('Models') >= 0 && each$1(models, function (model) {
+      var coordSys = model.coordinateSystem;
+
+      if (coordSys && coordSys.containPoint) {
+        result |= !!coordSys.containPoint(value);
+      } else if (key === 'seriesModels') {
+        var view = this._chartsMap[model.__viewId];
+
+        if (view && view.containPoint) {
+          result |= view.containPoint(value, model);
+        } else {}
+      } else {}
+    }, this);
+  }, this);
+  return !!result;
+};
+/**
+ * Get visual from series or data.
+ * @param {string|Object} finder
+ *        If string, e.g., 'series', means {seriesIndex: 0}.
+ *        If Object, could contain some of these properties below:
+ *        {
+ *            seriesIndex / seriesId / seriesName,
+ *            dataIndex / dataIndexInside
+ *        }
+ *        If dataIndex is not specified, series visual will be fetched,
+ *        but not data item visual.
+ *        If all of seriesIndex, seriesId, seriesName are not specified,
+ *        visual will be fetched from first series.
+ * @param {string} visualType 'color', 'symbol', 'symbolSize'
+ */
+
+
+echartsProto.getVisual = function (finder, visualType) {
+  var ecModel = this._model;
+  finder = parseFinder(ecModel, finder, {
+    defaultMainType: 'series'
+  });
+  var seriesModel = finder.seriesModel;
+  var data = seriesModel.getData();
+  var dataIndexInside = finder.hasOwnProperty('dataIndexInside') ? finder.dataIndexInside : finder.hasOwnProperty('dataIndex') ? data.indexOfRawIndex(finder.dataIndex) : null;
+  return dataIndexInside != null ? data.getItemVisual(dataIndexInside, visualType) : data.getVisual(visualType);
+};
+/**
+ * Get view of corresponding component model
+ * @param  {module:echarts/model/Component} componentModel
+ * @return {module:echarts/view/Component}
+ */
+
+
+echartsProto.getViewOfComponentModel = function (componentModel) {
+  return this._componentsMap[componentModel.__viewId];
+};
+/**
+ * Get view of corresponding series model
+ * @param  {module:echarts/model/Series} seriesModel
+ * @return {module:echarts/view/Chart}
+ */
+
+
+echartsProto.getViewOfSeriesModel = function (seriesModel) {
+  return this._chartsMap[seriesModel.__viewId];
+};
+
+var updateMethods = {
+  prepareAndUpdate: function (payload) {
+    prepare(this);
+    updateMethods.update.call(this, payload);
+  },
+
+  /**
+   * @param {Object} payload
+   * @private
+   */
+  update: function (payload) {
+    // console.profile && console.profile('update');
+    var ecModel = this._model;
+    var api = this._api;
+    var zr = this._zr;
+    var coordSysMgr = this._coordSysMgr;
+    var scheduler = this._scheduler; // update before setOption
+
+    if (!ecModel) {
+      return;
+    }
+
+    scheduler.restoreData(ecModel, payload);
+    scheduler.performSeriesTasks(ecModel); // TODO
+    // Save total ecModel here for undo/redo (after restoring data and before processing data).
+    // Undo (restoration of total ecModel) can be carried out in 'action' or outside API call.
+    // Create new coordinate system each update
+    // In LineView may save the old coordinate system and use it to get the orignal point
+
+    coordSysMgr.create(ecModel, api);
+    scheduler.performDataProcessorTasks(ecModel, payload); // Current stream render is not supported in data process. So we can update
+    // stream modes after data processing, where the filtered data is used to
+    // deteming whether use progressive rendering.
+
+    updateStreamModes(this, ecModel); // We update stream modes before coordinate system updated, then the modes info
+    // can be fetched when coord sys updating (consider the barGrid extent fix). But
+    // the drawback is the full coord info can not be fetched. Fortunately this full
+    // coord is not requied in stream mode updater currently.
+
+    coordSysMgr.update(ecModel, api);
+    clearColorPalette(ecModel);
+    scheduler.performVisualTasks(ecModel, payload);
+    render(this, ecModel, api, payload); // Set background
+
+    var backgroundColor = ecModel.get('backgroundColor') || 'transparent'; // In IE8
+
+    if (!env$1.canvasSupported) {
+      var colorArr = parse(backgroundColor);
+      backgroundColor = stringify(colorArr, 'rgb');
+
+      if (colorArr[3] === 0) {
+        backgroundColor = 'transparent';
+      }
+    } else {
+      zr.setBackgroundColor(backgroundColor);
+    }
+
+    performPostUpdateFuncs(ecModel, api); // console.profile && console.profileEnd('update');
+  },
+
+  /**
+   * @param {Object} payload
+   * @private
+   */
+  updateTransform: function (payload) {
+    var ecModel = this._model;
+    var ecIns = this;
+    var api = this._api; // update before setOption
+
+    if (!ecModel) {
+      return;
+    } // ChartView.markUpdateMethod(payload, 'updateTransform');
+
+
+    var componentDirtyList = [];
+    ecModel.eachComponent(function (componentType, componentModel) {
+      var componentView = ecIns.getViewOfComponentModel(componentModel);
+
+      if (componentView && componentView.__alive) {
+        if (componentView.updateTransform) {
+          var result = componentView.updateTransform(componentModel, ecModel, api, payload);
+          result && result.update && componentDirtyList.push(componentView);
+        } else {
+          componentDirtyList.push(componentView);
+        }
+      }
+    });
+    var seriesDirtyMap = createHashMap();
+    ecModel.eachSeries(function (seriesModel) {
+      var chartView = ecIns._chartsMap[seriesModel.__viewId];
+
+      if (chartView.updateTransform) {
+        var result = chartView.updateTransform(seriesModel, ecModel, api, payload);
+        result && result.update && seriesDirtyMap.set(seriesModel.uid, 1);
+      } else {
+        seriesDirtyMap.set(seriesModel.uid, 1);
+      }
+    });
+    clearColorPalette(ecModel); // Keep pipe to the exist pipeline because it depends on the render task of the full pipeline.
+    // this._scheduler.performVisualTasks(ecModel, payload, 'layout', true);
+
+    this._scheduler.performVisualTasks(ecModel, payload, {
+      setDirty: true,
+      dirtyMap: seriesDirtyMap
+    }); // Currently, not call render of components. Geo render cost a lot.
+    // renderComponents(ecIns, ecModel, api, payload, componentDirtyList);
+
+
+    renderSeries(ecIns, ecModel, api, payload, seriesDirtyMap);
+    performPostUpdateFuncs(ecModel, this._api);
+  },
+
+  /**
+   * @param {Object} payload
+   * @private
+   */
+  updateView: function (payload) {
+    var ecModel = this._model; // update before setOption
+
+    if (!ecModel) {
+      return;
+    }
+
+    Chart.markUpdateMethod(payload, 'updateView');
+    clearColorPalette(ecModel); // Keep pipe to the exist pipeline because it depends on the render task of the full pipeline.
+
+    this._scheduler.performVisualTasks(ecModel, payload, {
+      setDirty: true
+    });
+
+    render(this, this._model, this._api, payload);
+    performPostUpdateFuncs(ecModel, this._api);
+  },
+
+  /**
+   * @param {Object} payload
+   * @private
+   */
+  updateVisual: function (payload) {
+    updateMethods.update.call(this, payload); // var ecModel = this._model;
+    // // update before setOption
+    // if (!ecModel) {
+    //     return;
+    // }
+    // ChartView.markUpdateMethod(payload, 'updateVisual');
+    // clearColorPalette(ecModel);
+    // // Keep pipe to the exist pipeline because it depends on the render task of the full pipeline.
+    // this._scheduler.performVisualTasks(ecModel, payload, {visualType: 'visual', setDirty: true});
+    // render(this, this._model, this._api, payload);
+    // performPostUpdateFuncs(ecModel, this._api);
+  },
+
+  /**
+   * @param {Object} payload
+   * @private
+   */
+  updateLayout: function (payload) {
+    updateMethods.update.call(this, payload); // var ecModel = this._model;
+    // // update before setOption
+    // if (!ecModel) {
+    //     return;
+    // }
+    // ChartView.markUpdateMethod(payload, 'updateLayout');
+    // // Keep pipe to the exist pipeline because it depends on the render task of the full pipeline.
+    // // this._scheduler.performVisualTasks(ecModel, payload, 'layout', true);
+    // this._scheduler.performVisualTasks(ecModel, payload, {setDirty: true});
+    // render(this, this._model, this._api, payload);
+    // performPostUpdateFuncs(ecModel, this._api);
+  }
+};
+
+function prepare(ecIns) {
+  var ecModel = ecIns._model;
+  var scheduler = ecIns._scheduler;
+  scheduler.restorePipelines(ecModel);
+  scheduler.prepareStageTasks();
+  prepareView(ecIns, 'component', ecModel, scheduler);
+  prepareView(ecIns, 'chart', ecModel, scheduler);
+  scheduler.plan();
+}
+/**
+ * @private
+ */
+
+
+function updateDirectly(ecIns, method, payload, mainType, subType) {
+  var ecModel = ecIns._model; // broadcast
+
+  if (!mainType) {
+    // FIXME
+    // Chart will not be update directly here, except set dirty.
+    // But there is no such scenario now.
+    each(ecIns._componentsViews.concat(ecIns._chartsViews), callView);
+    return;
+  }
+
+  var query = {};
+  query[mainType + 'Id'] = payload[mainType + 'Id'];
+  query[mainType + 'Index'] = payload[mainType + 'Index'];
+  query[mainType + 'Name'] = payload[mainType + 'Name'];
+  var condition = {
+    mainType: mainType,
+    query: query
+  };
+  subType && (condition.subType = subType); // subType may be '' by parseClassType;
+
+  var excludeSeriesId = payload.excludeSeriesId;
+
+  if (excludeSeriesId != null) {
+    excludeSeriesId = createHashMap(normalizeToArray(excludeSeriesId));
+  } // If dispatchAction before setOption, do nothing.
+
+
+  ecModel && ecModel.eachComponent(condition, function (model) {
+    if (!excludeSeriesId || excludeSeriesId.get(model.id) == null) {
+      callView(ecIns[mainType === 'series' ? '_chartsMap' : '_componentsMap'][model.__viewId]);
+    }
+  }, ecIns);
+
+  function callView(view) {
+    view && view.__alive && view[method] && view[method](view.__model, ecModel, ecIns._api, payload);
+  }
+}
+/**
+ * Resize the chart
+ * @param {Object} opts
+ * @param {number} [opts.width] Can be 'auto' (the same as null/undefined)
+ * @param {number} [opts.height] Can be 'auto' (the same as null/undefined)
+ * @param {boolean} [opts.silent=false]
+ */
+
+
+echartsProto.resize = function (opts) {
+  this._zr.resize(opts);
+
+  var ecModel = this._model; // Resize loading effect
+
+  this._loadingFX && this._loadingFX.resize();
+
+  if (!ecModel) {
+    return;
+  }
+
+  var optionChanged = ecModel.resetOption('media');
+  var silent = opts && opts.silent;
+  this[IN_MAIN_PROCESS] = true;
+  optionChanged && prepare(this);
+  updateMethods.update.call(this);
+  this[IN_MAIN_PROCESS] = false;
+  flushPendingActions.call(this, silent);
+  triggerUpdatedEvent.call(this, silent);
+};
+
+function updateStreamModes(ecIns, ecModel) {
+  var chartsMap = ecIns._chartsMap;
+  var scheduler = ecIns._scheduler;
+  ecModel.eachSeries(function (seriesModel) {
+    scheduler.updateStreamModes(seriesModel, chartsMap[seriesModel.__viewId]);
+  });
+}
+/**
+ * Show loading effect
+ * @param  {string} [name='default']
+ * @param  {Object} [cfg]
+ */
+
+
+echartsProto.showLoading = function (name, cfg) {
+  if (isObject(name)) {
+    cfg = name;
+    name = '';
+  }
+
+  name = name || 'default';
+  this.hideLoading();
+
+  if (!loadingEffects[name]) {
+    return;
+  }
+
+  var el = loadingEffects[name](this._api, cfg);
+  var zr = this._zr;
+  this._loadingFX = el;
+  zr.add(el);
+};
+/**
+ * Hide loading effect
+ */
+
+
+echartsProto.hideLoading = function () {
+  this._loadingFX && this._zr.remove(this._loadingFX);
+  this._loadingFX = null;
+};
+/**
+ * @param {Object} eventObj
+ * @return {Object}
+ */
+
+
+echartsProto.makeActionFromEvent = function (eventObj) {
+  var payload = extend({}, eventObj);
+  payload.type = eventActionMap[eventObj.type];
+  return payload;
+};
+/**
+ * @pubilc
+ * @param {Object} payload
+ * @param {string} [payload.type] Action type
+ * @param {Object|boolean} [opt] If pass boolean, means opt.silent
+ * @param {boolean} [opt.silent=false] Whether trigger events.
+ * @param {boolean} [opt.flush=undefined]
+ *                  true: Flush immediately, and then pixel in canvas can be fetched
+ *                      immediately. Caution: it might affect performance.
+ *                  false: Not not flush.
+ *                  undefined: Auto decide whether perform flush.
+ */
+
+
+echartsProto.dispatchAction = function (payload, opt) {
+  if (!isObject(opt)) {
+    opt = {
+      silent: !!opt
+    };
+  }
+
+  if (!actions[payload.type]) {
+    return;
+  } // Avoid dispatch action before setOption. Especially in `connect`.
+
+
+  if (!this._model) {
+    return;
+  } // May dispatchAction in rendering procedure
+
+
+  if (this[IN_MAIN_PROCESS]) {
+    this._pendingActions.push(payload);
+
+    return;
+  }
+
+  doDispatchAction.call(this, payload, opt.silent);
+
+  if (opt.flush) {
+    this._zr.flush(true);
+  } else if (opt.flush !== false && env$1.browser.weChat) {
+    // In WeChat embeded browser, `requestAnimationFrame` and `setInterval`
+    // hang when sliding page (on touch event), which cause that zr does not
+    // refresh util user interaction finished, which is not expected.
+    // But `dispatchAction` may be called too frequently when pan on touch
+    // screen, which impacts performance if do not throttle them.
+    this._throttledZrFlush();
+  }
+
+  flushPendingActions.call(this, opt.silent);
+  triggerUpdatedEvent.call(this, opt.silent);
+};
+
+function doDispatchAction(payload, silent) {
+  var payloadType = payload.type;
+  var escapeConnect = payload.escapeConnect;
+  var actionWrap = actions[payloadType];
+  var actionInfo = actionWrap.actionInfo;
+  var cptType = (actionInfo.update || 'update').split(':');
+  var updateMethod = cptType.pop();
+  cptType = cptType[0] != null && parseClassType(cptType[0]);
+  this[IN_MAIN_PROCESS] = true;
+  var payloads = [payload];
+  var batched = false; // Batch action
+
+  if (payload.batch) {
+    batched = true;
+    payloads = map(payload.batch, function (item) {
+      item = defaults(extend({}, item), payload);
+      item.batch = null;
+      return item;
+    });
+  }
+
+  var eventObjBatch = [];
+  var eventObj;
+  var isHighDown = payloadType === 'highlight' || payloadType === 'downplay';
+  each(payloads, function (batchItem) {
+    // Action can specify the event by return it.
+    eventObj = actionWrap.action(batchItem, this._model, this._api); // Emit event outside
+
+    eventObj = eventObj || extend({}, batchItem); // Convert type to eventType
+
+    eventObj.type = actionInfo.event || eventObj.type;
+    eventObjBatch.push(eventObj); // light update does not perform data process, layout and visual.
+
+    if (isHighDown) {
+      // method, payload, mainType, subType
+      updateDirectly(this, updateMethod, batchItem, 'series');
+    } else if (cptType) {
+      updateDirectly(this, updateMethod, batchItem, cptType.main, cptType.sub);
+    }
+  }, this);
+
+  if (updateMethod !== 'none' && !isHighDown && !cptType) {
+    // Still dirty
+    if (this[OPTION_UPDATED]) {
+      // FIXME Pass payload ?
+      prepare(this);
+      updateMethods.update.call(this, payload);
+      this[OPTION_UPDATED] = false;
+    } else {
+      updateMethods[updateMethod].call(this, payload);
+    }
+  } // Follow the rule of action batch
+
+
+  if (batched) {
+    eventObj = {
+      type: actionInfo.event || payloadType,
+      escapeConnect: escapeConnect,
+      batch: eventObjBatch
+    };
+  } else {
+    eventObj = eventObjBatch[0];
+  }
+
+  this[IN_MAIN_PROCESS] = false;
+  !silent && this._messageCenter.trigger(eventObj.type, eventObj);
+}
+
+function flushPendingActions(silent) {
+  var pendingActions = this._pendingActions;
+
+  while (pendingActions.length) {
+    var payload = pendingActions.shift();
+    doDispatchAction.call(this, payload, silent);
+  }
+}
+
+function triggerUpdatedEvent(silent) {
+  !silent && this.trigger('updated');
+}
+/**
+ * Event `rendered` is triggered when zr
+ * rendered. It is useful for realtime
+ * snapshot (reflect animation).
+ *
+ * Event `finished` is triggered when:
+ * (1) zrender rendering finished.
+ * (2) initial animation finished.
+ * (3) progressive rendering finished.
+ * (4) no pending action.
+ * (5) no delayed setOption needs to be processed.
+ */
+
+
+function bindRenderedEvent(zr, ecIns) {
+  zr.on('rendered', function () {
+    ecIns.trigger('rendered'); // The `finished` event should not be triggered repeatly,
+    // so it should only be triggered when rendering indeed happend
+    // in zrender. (Consider the case that dipatchAction is keep
+    // triggering when mouse move).
+
+    if ( // Although zr is dirty if initial animation is not finished
+    // and this checking is called on frame, we also check
+    // animation finished for robustness.
+    zr.animation.isFinished() && !ecIns[OPTION_UPDATED] && !ecIns._scheduler.unfinished && !ecIns._pendingActions.length) {
+      ecIns.trigger('finished');
+    }
+  });
+}
+/**
+ * @param {Object} params
+ * @param {number} params.seriesIndex
+ * @param {Array|TypedArray} params.data
+ */
+
+
+echartsProto.appendData = function (params) {
+  var seriesIndex = params.seriesIndex;
+  var ecModel = this.getModel();
+  var seriesModel = ecModel.getSeriesByIndex(seriesIndex);
+  seriesModel.appendData(params); // Note: `appendData` does not support that update extent of coordinate
+  // system, util some scenario require that. In the expected usage of
+  // `appendData`, the initial extent of coordinate system should better
+  // be fixed by axis `min`/`max` setting or initial data, otherwise if
+  // the extent changed while `appendData`, the location of the painted
+  // graphic elements have to be changed, which make the usage of
+  // `appendData` meaningless.
+
+  this._scheduler.unfinished = true;
+};
+/**
+ * Register event
+ * @method
+ */
+
+
+echartsProto.on = createRegisterEventWithLowercaseName('on');
+echartsProto.off = createRegisterEventWithLowercaseName('off');
+echartsProto.one = createRegisterEventWithLowercaseName('one');
+/**
+ * Prepare view instances of charts and components
+ * @param  {module:echarts/model/Global} ecModel
+ * @private
+ */
+
+function prepareView(ecIns, type, ecModel, scheduler) {
+  var isComponent = type === 'component';
+  var viewList = isComponent ? ecIns._componentsViews : ecIns._chartsViews;
+  var viewMap = isComponent ? ecIns._componentsMap : ecIns._chartsMap;
+  var zr = ecIns._zr;
+  var api = ecIns._api;
+
+  for (var i = 0; i < viewList.length; i++) {
+    viewList[i].__alive = false;
+  }
+
+  isComponent ? ecModel.eachComponent(function (componentType, model) {
+    componentType !== 'series' && doPrepare(model);
+  }) : ecModel.eachSeries(doPrepare);
+
+  function doPrepare(model) {
+    // Consider: id same and type changed.
+    var viewId = '_ec_' + model.id + '_' + model.type;
+    var view = viewMap[viewId];
+
+    if (!view) {
+      var classType = parseClassType(model.type);
+      var Clazz = isComponent ? Component$1.getClass(classType.main, classType.sub) : Chart.getClass(classType.sub);
+      view = new Clazz();
+      view.init(ecModel, api);
+      viewMap[viewId] = view;
+      viewList.push(view);
+      zr.add(view.group);
+    }
+
+    model.__viewId = view.__id = viewId;
+    view.__alive = true;
+    view.__model = model;
+    view.group.__ecComponentInfo = {
+      mainType: model.mainType,
+      index: model.componentIndex
+    };
+    !isComponent && scheduler.prepareView(view, model, ecModel, api);
+  }
+
+  for (var i = 0; i < viewList.length;) {
+    var view = viewList[i];
+
+    if (!view.__alive) {
+      !isComponent && view.renderTask.dispose();
+      zr.remove(view.group);
+      view.dispose(ecModel, api);
+      viewList.splice(i, 1);
+      delete viewMap[view.__id];
+      view.__id = view.group.__ecComponentInfo = null;
+    } else {
+      i++;
+    }
+  }
+} // /**
+//  * Encode visual infomation from data after data processing
+//  *
+//  * @param {module:echarts/model/Global} ecModel
+//  * @param {object} layout
+//  * @param {boolean} [layoutFilter] `true`: only layout,
+//  *                                 `false`: only not layout,
+//  *                                 `null`/`undefined`: all.
+//  * @param {string} taskBaseTag
+//  * @private
+//  */
+// function startVisualEncoding(ecIns, ecModel, api, payload, layoutFilter) {
+//     each(visualFuncs, function (visual, index) {
+//         var isLayout = visual.isLayout;
+//         if (layoutFilter == null
+//             || (layoutFilter === false && !isLayout)
+//             || (layoutFilter === true && isLayout)
+//         ) {
+//             visual.func(ecModel, api, payload);
+//         }
+//     });
+// }
+
+
+function clearColorPalette(ecModel) {
+  ecModel.clearColorPalette();
+  ecModel.eachSeries(function (seriesModel) {
+    seriesModel.clearColorPalette();
+  });
+}
+
+function render(ecIns, ecModel, api, payload) {
+  renderComponents(ecIns, ecModel, api, payload);
+  each(ecIns._chartsViews, function (chart) {
+    chart.__alive = false;
+  });
+  renderSeries(ecIns, ecModel, api, payload); // Remove groups of unrendered charts
+
+  each(ecIns._chartsViews, function (chart) {
+    if (!chart.__alive) {
+      chart.remove(ecModel, api);
+    }
+  });
+}
+
+function renderComponents(ecIns, ecModel, api, payload, dirtyList) {
+  each(dirtyList || ecIns._componentsViews, function (componentView) {
+    var componentModel = componentView.__model;
+    componentView.render(componentModel, ecModel, api, payload);
+    updateZ(componentModel, componentView);
+  });
+}
+/**
+ * Render each chart and component
+ * @private
+ */
+
+
+function renderSeries(ecIns, ecModel, api, payload, dirtyMap) {
+  // Render all charts
+  var scheduler = ecIns._scheduler;
+  var unfinished;
+  ecModel.eachSeries(function (seriesModel) {
+    var chartView = ecIns._chartsMap[seriesModel.__viewId];
+    chartView.__alive = true;
+    var renderTask = chartView.renderTask;
+    scheduler.updatePayload(renderTask, payload);
+
+    if (dirtyMap && dirtyMap.get(seriesModel.uid)) {
+      renderTask.dirty();
+    }
+
+    unfinished |= renderTask.perform(scheduler.getPerformArgs(renderTask));
+    chartView.group.silent = !!seriesModel.get('silent');
+    updateZ(seriesModel, chartView);
+    updateBlend(seriesModel, chartView);
+  });
+  scheduler.unfinished |= unfinished; // If use hover layer
+
+  updateHoverLayerStatus(ecIns._zr, ecModel); // Add aria
+
+  aria(ecIns._zr.dom, ecModel);
+}
+
+function performPostUpdateFuncs(ecModel, api) {
+  each(postUpdateFuncs, function (func) {
+    func(ecModel, api);
+  });
+}
+
+var MOUSE_EVENT_NAMES = ['click', 'dblclick', 'mouseover', 'mouseout', 'mousemove', 'mousedown', 'mouseup', 'globalout', 'contextmenu'];
+/**
+ * @private
+ */
+
+echartsProto._initEvents = function () {
+  each(MOUSE_EVENT_NAMES, function (eveName) {
+    this._zr.on(eveName, function (e) {
+      var ecModel = this.getModel();
+      var el = e.target;
+      var params;
+      var isGlobalOut = eveName === 'globalout'; // no e.target when 'globalout'.
+
+      if (isGlobalOut) {
+        params = {};
+      } else if (el && el.dataIndex != null) {
+        var dataModel = el.dataModel || ecModel.getSeriesByIndex(el.seriesIndex);
+        params = dataModel && dataModel.getDataParams(el.dataIndex, el.dataType, el) || {};
+      } // If element has custom eventData of components
+      else if (el && el.eventData) {
+          params = extend({}, el.eventData);
+        } // Contract: if params prepared in mouse event,
+      // these properties must be specified:
+      // {
+      //    componentType: string (component main type)
+      //    componentIndex: number
+      // }
+      // Otherwise event query can not work.
+
+
+      if (params) {
+        var componentType = params.componentType;
+        var componentIndex = params.componentIndex; // Special handling for historic reason: when trigger by
+        // markLine/markPoint/markArea, the componentType is
+        // 'markLine'/'markPoint'/'markArea', but we should better
+        // enable them to be queried by seriesIndex, since their
+        // option is set in each series.
+
+        if (componentType === 'markLine' || componentType === 'markPoint' || componentType === 'markArea') {
+          componentType = 'series';
+          componentIndex = params.seriesIndex;
+        }
+
+        var model = componentType && componentIndex != null && ecModel.getComponent(componentType, componentIndex);
+        var view = model && this[model.mainType === 'series' ? '_chartsMap' : '_componentsMap'][model.__viewId];
+        params.event = e;
+        params.type = eveName;
+        this._ecEventProcessor.eventInfo = {
+          targetEl: el,
+          packedEvent: params,
+          model: model,
+          view: view
+        };
+        this.trigger(eveName, params);
+      }
+    }, this);
+  }, this);
+  each(eventActionMap, function (actionType, eventType) {
+    this._messageCenter.on(eventType, function (event) {
+      this.trigger(eventType, event);
+    }, this);
+  }, this);
+};
+/**
+ * @return {boolean}
+ */
+
+
+echartsProto.isDisposed = function () {
+  return this._disposed;
+};
+/**
+ * Clear
+ */
+
+
+echartsProto.clear = function () {
+  this.setOption({
+    series: []
+  }, true);
+};
+/**
+ * Dispose instance
+ */
+
+
+echartsProto.dispose = function () {
+  if (this._disposed) {
+    return;
+  }
+
+  this._disposed = true;
+  setAttribute(this.getDom(), DOM_ATTRIBUTE_KEY, '');
+  var api = this._api;
+  var ecModel = this._model;
+  each(this._componentsViews, function (component) {
+    component.dispose(ecModel, api);
+  });
+  each(this._chartsViews, function (chart) {
+    chart.dispose(ecModel, api);
+  }); // Dispose after all views disposed
+
+  this._zr.dispose();
+
+  delete instances[this.id];
+};
+
+mixin(ECharts, Eventful);
+
+function updateHoverLayerStatus(zr, ecModel) {
+  var storage = zr.storage;
+  var elCount = 0;
+  storage.traverse(function (el) {
+    if (!el.isGroup) {
+      elCount++;
+    }
+  });
+
+  if (elCount > ecModel.get('hoverLayerThreshold') && !env$1.node) {
+    storage.traverse(function (el) {
+      if (!el.isGroup) {
+        // Don't switch back.
+        el.useHoverLayer = true;
+      }
+    });
+  }
+}
+/**
+ * Update chart progressive and blend.
+ * @param {module:echarts/model/Series|module:echarts/model/Component} model
+ * @param {module:echarts/view/Component|module:echarts/view/Chart} view
+ */
+
+
+function updateBlend(seriesModel, chartView) {
+  var blendMode = seriesModel.get('blendMode') || null;
+  chartView.group.traverse(function (el) {
+    // FIXME marker and other components
+    if (!el.isGroup) {
+      // Only set if blendMode is changed. In case element is incremental and don't wan't to rerender.
+      if (el.style.blend !== blendMode) {
+        el.setStyle('blend', blendMode);
+      }
+    }
+
+    if (el.eachPendingDisplayable) {
+      el.eachPendingDisplayable(function (displayable) {
+        displayable.setStyle('blend', blendMode);
+      });
+    }
+  });
+}
+/**
+ * @param {module:echarts/model/Series|module:echarts/model/Component} model
+ * @param {module:echarts/view/Component|module:echarts/view/Chart} view
+ */
+
+
+function updateZ(model, view) {
+  var z = model.get('z');
+  var zlevel = model.get('zlevel'); // Set z and zlevel
+
+  view.group.traverse(function (el) {
+    if (el.type !== 'group') {
+      z != null && (el.z = z);
+      zlevel != null && (el.zlevel = zlevel);
+    }
+  });
+}
+
+function createExtensionAPI(ecInstance) {
+  var coordSysMgr = ecInstance._coordSysMgr;
+  return extend(new ExtensionAPI(ecInstance), {
+    // Inject methods
+    getCoordinateSystems: bind(coordSysMgr.getCoordinateSystems, coordSysMgr),
+    getComponentByElement: function (el) {
+      while (el) {
+        var modelInfo = el.__ecComponentInfo;
+
+        if (modelInfo != null) {
+          return ecInstance._model.getComponent(modelInfo.mainType, modelInfo.index);
+        }
+
+        el = el.parent;
+      }
+    }
+  });
+}
+/**
+ * @class
+ * Usage of query:
+ * `chart.on('click', query, handler);`
+ * The `query` can be:
+ * + The component type query string, only `mainType` or `mainType.subType`,
+ *   like: 'xAxis', 'series', 'xAxis.category' or 'series.line'.
+ * + The component query object, like:
+ *   `{seriesIndex: 2}`, `{seriesName: 'xx'}`, `{seriesId: 'some'}`,
+ *   `{xAxisIndex: 2}`, `{xAxisName: 'xx'}`, `{xAxisId: 'some'}`.
+ * + The data query object, like:
+ *   `{dataIndex: 123}`, `{dataType: 'link'}`, `{name: 'some'}`.
+ * + The other query object (cmponent customized query), like:
+ *   `{element: 'some'}` (only available in custom series).
+ *
+ * Caveat: If a prop in the `query` object is `null/undefined`, it is the
+ * same as there is no such prop in the `query` object.
+ */
+
+
+function EventProcessor() {
+  // These info required: targetEl, packedEvent, model, view
+  this.eventInfo;
+}
+
+EventProcessor.prototype = {
+  constructor: EventProcessor,
+  normalizeQuery: function (query) {
+    var cptQuery = {};
+    var dataQuery = {};
+    var otherQuery = {}; // `query` is `mainType` or `mainType.subType` of component.
+
+    if (isString(query)) {
+      var condCptType = parseClassType(query); // `.main` and `.sub` may be ''.
+
+      cptQuery.mainType = condCptType.main || null;
+      cptQuery.subType = condCptType.sub || null;
+    } // `query` is an object, convert to {mainType, index, name, id}.
+    else {
+        // `xxxIndex`, `xxxName`, `xxxId`, `name`, `dataIndex`, `dataType` is reserved,
+        // can not be used in `compomentModel.filterForExposedEvent`.
+        var suffixes = ['Index', 'Name', 'Id'];
+        var dataKeys = {
+          name: 1,
+          dataIndex: 1,
+          dataType: 1
+        };
+        each$1(query, function (val, key) {
+          var reserved = false;
+
+          for (var i = 0; i < suffixes.length; i++) {
+            var propSuffix = suffixes[i];
+            var suffixPos = key.lastIndexOf(propSuffix);
+
+            if (suffixPos > 0 && suffixPos === key.length - propSuffix.length) {
+              var mainType = key.slice(0, suffixPos); // Consider `dataIndex`.
+
+              if (mainType !== 'data') {
+                cptQuery.mainType = mainType;
+                cptQuery[propSuffix.toLowerCase()] = val;
+                reserved = true;
+              }
+            }
+          }
+
+          if (dataKeys.hasOwnProperty(key)) {
+            dataQuery[key] = val;
+            reserved = true;
+          }
+
+          if (!reserved) {
+            otherQuery[key] = val;
+          }
+        });
+      }
+
+    return {
+      cptQuery: cptQuery,
+      dataQuery: dataQuery,
+      otherQuery: otherQuery
+    };
+  },
+  filter: function (eventType, query, args) {
+    // They should be assigned before each trigger call.
+    var eventInfo = this.eventInfo;
+
+    if (!eventInfo) {
+      return true;
+    }
+
+    var targetEl = eventInfo.targetEl;
+    var packedEvent = eventInfo.packedEvent;
+    var model = eventInfo.model;
+    var view = eventInfo.view; // For event like 'globalout'.
+
+    if (!model || !view) {
+      return true;
+    }
+
+    var cptQuery = query.cptQuery;
+    var dataQuery = query.dataQuery;
+    return check(cptQuery, model, 'mainType') && check(cptQuery, model, 'subType') && check(cptQuery, model, 'index', 'componentIndex') && check(cptQuery, model, 'name') && check(cptQuery, model, 'id') && check(dataQuery, packedEvent, 'name') && check(dataQuery, packedEvent, 'dataIndex') && check(dataQuery, packedEvent, 'dataType') && (!view.filterForExposedEvent || view.filterForExposedEvent(eventType, query.otherQuery, targetEl, packedEvent));
+
+    function check(query, host, prop, propOnHost) {
+      return query[prop] == null || host[propOnHost || prop] === query[prop];
+    }
+  },
+  afterTrigger: function () {
+    // Make sure the eventInfo wont be used in next trigger.
+    this.eventInfo = null;
+  }
+};
+/**
+ * @type {Object} key: actionType.
+ * @inner
+ */
+
+var actions = {};
+/**
+ * Map eventType to actionType
+ * @type {Object}
+ */
+
+var eventActionMap = {};
+/**
+ * Data processor functions of each stage
+ * @type {Array.<Object.<string, Function>>}
+ * @inner
+ */
+
+var dataProcessorFuncs = [];
+/**
+ * @type {Array.<Function>}
+ * @inner
+ */
+
+var optionPreprocessorFuncs = [];
+/**
+ * @type {Array.<Function>}
+ * @inner
+ */
+
+var postUpdateFuncs = [];
+/**
+ * Visual encoding functions of each stage
+ * @type {Array.<Object.<string, Function>>}
+ */
+
+var visualFuncs = [];
+/**
+ * Theme storage
+ * @type {Object.<key, Object>}
+ */
+
+var themeStorage = {};
+/**
+ * Loading effects
+ */
+
+var loadingEffects = {};
+var instances = {};
+var connectedGroups = {};
+var idBase = new Date() - 0;
+var groupIdBase = new Date() - 0;
+var DOM_ATTRIBUTE_KEY = '_echarts_instance_';
+
+function enableConnect(chart) {
+  var STATUS_PENDING = 0;
+  var STATUS_UPDATING = 1;
+  var STATUS_UPDATED = 2;
+  var STATUS_KEY = '__connectUpdateStatus';
+
+  function updateConnectedChartsStatus(charts, status) {
+    for (var i = 0; i < charts.length; i++) {
+      var otherChart = charts[i];
+      otherChart[STATUS_KEY] = status;
+    }
+  }
+
+  each(eventActionMap, function (actionType, eventType) {
+    chart._messageCenter.on(eventType, function (event) {
+      if (connectedGroups[chart.group] && chart[STATUS_KEY] !== STATUS_PENDING) {
+        if (event && event.escapeConnect) {
+          return;
+        }
+
+        var action = chart.makeActionFromEvent(event);
+        var otherCharts = [];
+        each(instances, function (otherChart) {
+          if (otherChart !== chart && otherChart.group === chart.group) {
+            otherCharts.push(otherChart);
+          }
+        });
+        updateConnectedChartsStatus(otherCharts, STATUS_PENDING);
+        each(otherCharts, function (otherChart) {
+          if (otherChart[STATUS_KEY] !== STATUS_UPDATING) {
+            otherChart.dispatchAction(action);
+          }
+        });
+        updateConnectedChartsStatus(otherCharts, STATUS_UPDATED);
+      }
+    });
+  });
+}
+/**
+ * @param {HTMLElement} dom
+ * @param {Object} [theme]
+ * @param {Object} opts
+ * @param {number} [opts.devicePixelRatio] Use window.devicePixelRatio by default
+ * @param {string} [opts.renderer] Currently only 'canvas' is supported.
+ * @param {number} [opts.width] Use clientWidth of the input `dom` by default.
+ *                              Can be 'auto' (the same as null/undefined)
+ * @param {number} [opts.height] Use clientHeight of the input `dom` by default.
+ *                               Can be 'auto' (the same as null/undefined)
+ */
+
+
+function init(dom, theme$$1, opts) {
+  var existInstance = getInstanceByDom(dom);
+
+  if (existInstance) {
+    return existInstance;
+  }
+
+  var chart = new ECharts(dom, theme$$1, opts);
+  chart.id = 'ec_' + idBase++;
+  instances[chart.id] = chart;
+  setAttribute(dom, DOM_ATTRIBUTE_KEY, chart.id);
+  enableConnect(chart);
+  return chart;
+}
+/**
+ * @return {string|Array.<module:echarts~ECharts>} groupId
+ */
+
+function connect(groupId) {
+  // Is array of charts
+  if (isArray(groupId)) {
+    var charts = groupId;
+    groupId = null; // If any chart has group
+
+    each(charts, function (chart) {
+      if (chart.group != null) {
+        groupId = chart.group;
+      }
+    });
+    groupId = groupId || 'g_' + groupIdBase++;
+    each(charts, function (chart) {
+      chart.group = groupId;
+    });
+  }
+
+  connectedGroups[groupId] = true;
+  return groupId;
+}
+/**
+ * @DEPRECATED
+ * @return {string} groupId
+ */
+
+function disConnect(groupId) {
+  connectedGroups[groupId] = false;
+}
+/**
+ * @return {string} groupId
+ */
+
+var disconnect = disConnect;
+/**
+ * Dispose a chart instance
+ * @param  {module:echarts~ECharts|HTMLDomElement|string} chart
+ */
+
+function dispose(chart) {
+  if (typeof chart === 'string') {
+    chart = instances[chart];
+  } else if (!(chart instanceof ECharts)) {
+    // Try to treat as dom
+    chart = getInstanceByDom(chart);
+  }
+
+  if (chart instanceof ECharts && !chart.isDisposed()) {
+    chart.dispose();
+  }
+}
+/**
+ * @param  {HTMLElement} dom
+ * @return {echarts~ECharts}
+ */
+
+function getInstanceByDom(dom) {
+  return instances[getAttribute(dom, DOM_ATTRIBUTE_KEY)];
+}
+/**
+ * @param {string} key
+ * @return {echarts~ECharts}
+ */
+
+function getInstanceById(key) {
+  return instances[key];
+}
+/**
+ * Register theme
+ */
+
+function registerTheme(name, theme$$1) {
+  themeStorage[name] = theme$$1;
+}
+/**
+ * Register option preprocessor
+ * @param {Function} preprocessorFunc
+ */
+
+function registerPreprocessor(preprocessorFunc) {
+  optionPreprocessorFuncs.push(preprocessorFunc);
+}
+/**
+ * @param {number} [priority=1000]
+ * @param {Object|Function} processor
+ */
+
+function registerProcessor(priority, processor) {
+  normalizeRegister(dataProcessorFuncs, priority, processor, PRIORITY_PROCESSOR_FILTER);
+}
+/**
+ * Register postUpdater
+ * @param {Function} postUpdateFunc
+ */
+
+function registerPostUpdate(postUpdateFunc) {
+  postUpdateFuncs.push(postUpdateFunc);
+}
+/**
+ * Usage:
+ * registerAction('someAction', 'someEvent', function () { ... });
+ * registerAction('someAction', function () { ... });
+ * registerAction(
+ *     {type: 'someAction', event: 'someEvent', update: 'updateView'},
+ *     function () { ... }
+ * );
+ *
+ * @param {(string|Object)} actionInfo
+ * @param {string} actionInfo.type
+ * @param {string} [actionInfo.event]
+ * @param {string} [actionInfo.update]
+ * @param {string} [eventName]
+ * @param {Function} action
+ */
+
+function registerAction(actionInfo, eventName, action) {
+  if (typeof eventName === 'function') {
+    action = eventName;
+    eventName = '';
+  }
+
+  var actionType = isObject(actionInfo) ? actionInfo.type : [actionInfo, actionInfo = {
+    event: eventName
+  }][0]; // Event name is all lowercase
+
+  actionInfo.event = (actionInfo.event || actionType).toLowerCase();
+  eventName = actionInfo.event; // Validate action type and event name.
+
+  assert(ACTION_REG.test(actionType) && ACTION_REG.test(eventName));
+
+  if (!actions[actionType]) {
+    actions[actionType] = {
+      action: action,
+      actionInfo: actionInfo
+    };
+  }
+
+  eventActionMap[eventName] = actionType;
+}
+/**
+ * @param {string} type
+ * @param {*} CoordinateSystem
+ */
+
+function registerCoordinateSystem(type, CoordinateSystem$$1) {
+  CoordinateSystemManager.register(type, CoordinateSystem$$1);
+}
+/**
+ * Get dimensions of specified coordinate system.
+ * @param {string} type
+ * @return {Array.<string|Object>}
+ */
+
+function getCoordinateSystemDimensions(type) {
+  var coordSysCreator = CoordinateSystemManager.get(type);
+
+  if (coordSysCreator) {
+    return coordSysCreator.getDimensionsInfo ? coordSysCreator.getDimensionsInfo() : coordSysCreator.dimensions.slice();
+  }
+}
+/**
+ * Layout is a special stage of visual encoding
+ * Most visual encoding like color are common for different chart
+ * But each chart has it's own layout algorithm
+ *
+ * @param {number} [priority=1000]
+ * @param {Function} layoutTask
+ */
+
+function registerLayout(priority, layoutTask) {
+  normalizeRegister(visualFuncs, priority, layoutTask, PRIORITY_VISUAL_LAYOUT, 'layout');
+}
+/**
+ * @param {number} [priority=3000]
+ * @param {module:echarts/stream/Task} visualTask
+ */
+
+function registerVisual(priority, visualTask) {
+  normalizeRegister(visualFuncs, priority, visualTask, PRIORITY_VISUAL_CHART, 'visual');
+}
+/**
+ * @param {Object|Function} fn: {seriesType, createOnAllSeries, performRawSeries, reset}
+ */
+
+function normalizeRegister(targetList, priority, fn, defaultPriority, visualType) {
+  if (isFunction(priority) || isObject(priority)) {
+    fn = priority;
+    priority = defaultPriority;
+  }
+
+  var stageHandler = Scheduler.wrapStageHandler(fn, visualType);
+  stageHandler.__prio = priority;
+  stageHandler.__raw = fn;
+  targetList.push(stageHandler);
+  return stageHandler;
+}
+/**
+ * @param {string} name
+ */
+
+
+function registerLoading(name, loadingFx) {
+  loadingEffects[name] = loadingFx;
+}
+/**
+ * @param {Object} opts
+ * @param {string} [superClass]
+ */
+
+function extendComponentModel(opts
+/*, superClass*/
+) {
+  // var Clazz = ComponentModel;
+  // if (superClass) {
+  //     var classType = parseClassType(superClass);
+  //     Clazz = ComponentModel.getClass(classType.main, classType.sub, true);
+  // }
+  return ComponentModel.extend(opts);
+}
+/**
+ * @param {Object} opts
+ * @param {string} [superClass]
+ */
+
+function extendComponentView(opts
+/*, superClass*/
+) {
+  // var Clazz = ComponentView;
+  // if (superClass) {
+  //     var classType = parseClassType(superClass);
+  //     Clazz = ComponentView.getClass(classType.main, classType.sub, true);
+  // }
+  return Component$1.extend(opts);
+}
+/**
+ * @param {Object} opts
+ * @param {string} [superClass]
+ */
+
+function extendSeriesModel(opts
+/*, superClass*/
+) {
+  // var Clazz = SeriesModel;
+  // if (superClass) {
+  //     superClass = 'series.' + superClass.replace('series.', '');
+  //     var classType = parseClassType(superClass);
+  //     Clazz = ComponentModel.getClass(classType.main, classType.sub, true);
+  // }
+  return SeriesModel.extend(opts);
+}
+/**
+ * @param {Object} opts
+ * @param {string} [superClass]
+ */
+
+function extendChartView(opts
+/*, superClass*/
+) {
+  // var Clazz = ChartView;
+  // if (superClass) {
+  //     superClass = superClass.replace('series.', '');
+  //     var classType = parseClassType(superClass);
+  //     Clazz = ChartView.getClass(classType.main, true);
+  // }
+  return Chart.extend(opts);
+}
+/**
+ * ZRender need a canvas context to do measureText.
+ * But in node environment canvas may be created by node-canvas.
+ * So we need to specify how to create a canvas instead of using document.createElement('canvas')
+ *
+ * Be careful of using it in the browser.
+ *
+ * @param {Function} creator
+ * @example
+ *     var Canvas = require('canvas');
+ *     var echarts = require('echarts');
+ *     echarts.setCanvasCreator(function () {
+ *         // Small size is enough.
+ *         return new Canvas(32, 32);
+ *     });
+ */
+
+function setCanvasCreator(creator) {
+  $override('createCanvas', creator);
+}
+/**
+ * @param {string} mapName
+ * @param {Array.<Object>|Object|string} geoJson
+ * @param {Object} [specialAreas]
+ *
+ * @example GeoJSON
+ *     $.get('USA.json', function (geoJson) {
+ *         echarts.registerMap('USA', geoJson);
+ *         // Or
+ *         echarts.registerMap('USA', {
+ *             geoJson: geoJson,
+ *             specialAreas: {}
+ *         })
+ *     });
+ *
+ *     $.get('airport.svg', function (svg) {
+ *         echarts.registerMap('airport', {
+ *             svg: svg
+ *         }
+ *     });
+ *
+ *     echarts.registerMap('eu', [
+ *         {svg: eu-topographic.svg},
+ *         {geoJSON: eu.json}
+ *     ])
+ */
+
+function registerMap(mapName, geoJson, specialAreas) {
+  mapDataStorage.registerMap(mapName, geoJson, specialAreas);
+}
+/**
+ * @param {string} mapName
+ * @return {Object}
+ */
+
+function getMap(mapName) {
+  // For backward compatibility, only return the first one.
+  var records = mapDataStorage.retrieveMap(mapName);
+  return records && records[0] && {
+    geoJson: records[0].geoJSON,
+    specialAreas: records[0].specialAreas
+  };
+}
+registerVisual(PRIORITY_VISUAL_GLOBAL, seriesColor);
+registerPreprocessor(backwardCompat);
+registerProcessor(PRIORITY_PROCESSOR_STATISTIC, dataStack);
+registerLoading('default', loadingDefault); // Default actions
+
+registerAction({
+  type: 'highlight',
+  event: 'highlight',
+  update: 'highlight'
+}, noop);
+registerAction({
+  type: 'downplay',
+  event: 'downplay',
+  update: 'downplay'
+}, noop); // Default theme
+
+registerTheme('light', lightTheme);
+registerTheme('dark', theme); // For backward compatibility, where the namespace `dataTool` will
+// be mounted on `echarts` is the extension `dataTool` is imported.
+
+var dataTool = {};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+function defaultKeyGetter(item) {
+  return item;
+}
+/**
+ * @param {Array} oldArr
+ * @param {Array} newArr
+ * @param {Function} oldKeyGetter
+ * @param {Function} newKeyGetter
+ * @param {Object} [context] Can be visited by this.context in callback.
+ */
+
+
+function DataDiffer(oldArr, newArr, oldKeyGetter, newKeyGetter, context) {
+  this._old = oldArr;
+  this._new = newArr;
+  this._oldKeyGetter = oldKeyGetter || defaultKeyGetter;
+  this._newKeyGetter = newKeyGetter || defaultKeyGetter;
+  this.context = context;
+}
+
+DataDiffer.prototype = {
+  constructor: DataDiffer,
+
+  /**
+   * Callback function when add a data
+   */
+  add: function (func) {
+    this._add = func;
+    return this;
+  },
+
+  /**
+   * Callback function when update a data
+   */
+  update: function (func) {
+    this._update = func;
+    return this;
+  },
+
+  /**
+   * Callback function when remove a data
+   */
+  remove: function (func) {
+    this._remove = func;
+    return this;
+  },
+  execute: function () {
+    var oldArr = this._old;
+    var newArr = this._new;
+    var oldDataIndexMap = {};
+    var newDataIndexMap = {};
+    var oldDataKeyArr = [];
+    var newDataKeyArr = [];
+    var i;
+    initIndexMap(oldArr, oldDataIndexMap, oldDataKeyArr, '_oldKeyGetter', this);
+    initIndexMap(newArr, newDataIndexMap, newDataKeyArr, '_newKeyGetter', this); // Travel by inverted order to make sure order consistency
+    // when duplicate keys exists (consider newDataIndex.pop() below).
+    // For performance consideration, these code below do not look neat.
+
+    for (i = 0; i < oldArr.length; i++) {
+      var key = oldDataKeyArr[i];
+      var idx = newDataIndexMap[key]; // idx can never be empty array here. see 'set null' logic below.
+
+      if (idx != null) {
+        // Consider there is duplicate key (for example, use dataItem.name as key).
+        // We should make sure every item in newArr and oldArr can be visited.
+        var len = idx.length;
+
+        if (len) {
+          len === 1 && (newDataIndexMap[key] = null);
+          idx = idx.unshift();
+        } else {
+          newDataIndexMap[key] = null;
+        }
+
+        this._update && this._update(idx, i);
+      } else {
+        this._remove && this._remove(i);
+      }
+    }
+
+    for (var i = 0; i < newDataKeyArr.length; i++) {
+      var key = newDataKeyArr[i];
+
+      if (newDataIndexMap.hasOwnProperty(key)) {
+        var idx = newDataIndexMap[key];
+
+        if (idx == null) {
+          continue;
+        } // idx can never be empty array here. see 'set null' logic above.
+
+
+        if (!idx.length) {
+          this._add && this._add(idx);
+        } else {
+          for (var j = 0, len = idx.length; j < len; j++) {
+            this._add && this._add(idx[j]);
+          }
+        }
+      }
+    }
+  }
+};
+
+function initIndexMap(arr, map, keyArr, keyGetterName, dataDiffer) {
+  for (var i = 0; i < arr.length; i++) {
+    // Add prefix to avoid conflict with Object.prototype.
+    var key = '_ec_' + dataDiffer[keyGetterName](arr[i], i);
+    var existence = map[key];
+
+    if (existence == null) {
+      keyArr.push(key);
+      map[key] = i;
+    } else {
+      if (!existence.length) {
+        map[key] = existence = [existence];
+      }
+
+      existence.push(i);
+    }
+  }
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var OTHER_DIMENSIONS = createHashMap(['tooltip', 'label', 'itemName', 'itemId', 'seriesName']);
+function summarizeDimensions(data) {
+  var summary = {};
+  var encode = summary.encode = {};
+  var notExtraCoordDimMap = createHashMap();
+  var defaultedLabel = [];
+  var defaultedTooltip = [];
+  each$1(data.dimensions, function (dimName) {
+    var dimItem = data.getDimensionInfo(dimName);
+    var coordDim = dimItem.coordDim;
+
+    if (coordDim) {
+      var coordDimArr = encode[coordDim];
+
+      if (!encode.hasOwnProperty(coordDim)) {
+        coordDimArr = encode[coordDim] = [];
+      }
+
+      coordDimArr[dimItem.coordDimIndex] = dimName;
+
+      if (!dimItem.isExtraCoord) {
+        notExtraCoordDimMap.set(coordDim, 1); // Use the last coord dim (and label friendly) as default label,
+        // because when dataset is used, it is hard to guess which dimension
+        // can be value dimension. If both show x, y on label is not look good,
+        // and conventionally y axis is focused more.
+
+        if (mayLabelDimType(dimItem.type)) {
+          defaultedLabel[0] = dimName;
+        }
+      }
+
+      if (dimItem.defaultTooltip) {
+        defaultedTooltip.push(dimName);
+      }
+    }
+
+    OTHER_DIMENSIONS.each(function (v, otherDim) {
+      var otherDimArr = encode[otherDim];
+
+      if (!encode.hasOwnProperty(otherDim)) {
+        otherDimArr = encode[otherDim] = [];
+      }
+
+      var dimIndex = dimItem.otherDims[otherDim];
+
+      if (dimIndex != null && dimIndex !== false) {
+        otherDimArr[dimIndex] = dimItem.name;
+      }
+    });
+  });
+  var dataDimsOnCoord = [];
+  var encodeFirstDimNotExtra = {};
+  notExtraCoordDimMap.each(function (v, coordDim) {
+    var dimArr = encode[coordDim]; // ??? FIXME extra coord should not be set in dataDimsOnCoord.
+    // But should fix the case that radar axes: simplify the logic
+    // of `completeDimension`, remove `extraPrefix`.
+
+    encodeFirstDimNotExtra[coordDim] = dimArr[0]; // Not necessary to remove duplicate, because a data
+    // dim canot on more than one coordDim.
+
+    dataDimsOnCoord = dataDimsOnCoord.concat(dimArr);
+  });
+  summary.dataDimsOnCoord = dataDimsOnCoord;
+  summary.encodeFirstDimNotExtra = encodeFirstDimNotExtra;
+  var encodeLabel = encode.label; // FIXME `encode.label` is not recommanded, because formatter can not be set
+  // in this way. Use label.formatter instead. May be remove this approach someday.
+
+  if (encodeLabel && encodeLabel.length) {
+    defaultedLabel = encodeLabel.slice();
+  }
+
+  var encodeTooltip = encode.tooltip;
+
+  if (encodeTooltip && encodeTooltip.length) {
+    defaultedTooltip = encodeTooltip.slice();
+  } else if (!defaultedTooltip.length) {
+    defaultedTooltip = defaultedLabel.slice();
+  }
+
+  encode.defaultedLabel = defaultedLabel;
+  encode.defaultedTooltip = defaultedTooltip;
+  return summary;
+}
+function getDimensionTypeByAxis(axisType) {
+  return axisType === 'category' ? 'ordinal' : axisType === 'time' ? 'time' : 'float';
+}
+
+function mayLabelDimType(dimType) {
+  // In most cases, ordinal and time do not suitable for label.
+  // Ordinal info can be displayed on axis. Time is too long.
+  return !(dimType === 'ordinal' || dimType === 'time');
+} // function findTheLastDimMayLabel(data) {
+//     // Get last value dim
+//     var dimensions = data.dimensions.slice();
+//     var valueType;
+//     var valueDim;
+//     while (dimensions.length && (
+//         valueDim = dimensions.pop(),
+//         valueType = data.getDimensionInfo(valueDim).type,
+//         valueType === 'ordinal' || valueType === 'time'
+//     )) {} // jshint ignore:line
+//     return valueDim;
+// }
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/* global Float64Array, Int32Array, Uint32Array, Uint16Array */
+
+/**
+ * List for data storage
+ * @module echarts/data/List
+ */
+var isObject$4 = isObject$1;
+var UNDEFINED = 'undefined'; // Use prefix to avoid index to be the same as otherIdList[idx],
+// which will cause weird udpate animation.
+
+var ID_PREFIX = 'e\0\0';
+var dataCtors = {
+  'float': typeof Float64Array === UNDEFINED ? Array : Float64Array,
+  'int': typeof Int32Array === UNDEFINED ? Array : Int32Array,
+  // Ordinal data type can be string or int
+  'ordinal': Array,
+  'number': Array,
+  'time': Array
+}; // Caution: MUST not use `new CtorUint32Array(arr, 0, len)`, because the Ctor of array is
+// different from the Ctor of typed array.
+
+var CtorUint32Array = typeof Uint32Array === UNDEFINED ? Array : Uint32Array;
+var CtorUint16Array = typeof Uint16Array === UNDEFINED ? Array : Uint16Array;
+
+function getIndicesCtor(list) {
+  // The possible max value in this._indicies is always this._rawCount despite of filtering.
+  return list._rawCount > 65535 ? CtorUint32Array : CtorUint16Array;
+}
+
+function cloneChunk(originalChunk) {
+  var Ctor = originalChunk.constructor; // Only shallow clone is enough when Array.
+
+  return Ctor === Array ? originalChunk.slice() : new Ctor(originalChunk);
+}
+
+var TRANSFERABLE_PROPERTIES = ['hasItemOption', '_nameList', '_idList', '_invertedIndicesMap', '_rawData', '_chunkSize', '_chunkCount', '_dimValueGetter', '_count', '_rawCount', '_nameDimIdx', '_idDimIdx'];
+var CLONE_PROPERTIES = ['_extent', '_approximateExtent', '_rawExtent'];
+
+function transferProperties(target, source) {
+  each$1(TRANSFERABLE_PROPERTIES.concat(source.__wrappedMethods || []), function (propName) {
+    if (source.hasOwnProperty(propName)) {
+      target[propName] = source[propName];
+    }
+  });
+  target.__wrappedMethods = source.__wrappedMethods;
+  each$1(CLONE_PROPERTIES, function (propName) {
+    target[propName] = clone(source[propName]);
+  });
+  target._calculationInfo = extend(source._calculationInfo);
+}
+/**
+ * @constructor
+ * @alias module:echarts/data/List
+ *
+ * @param {Array.<string|Object>} dimensions
+ *      For example, ['someDimName', {name: 'someDimName', type: 'someDimType'}, ...].
+ *      Dimensions should be concrete names like x, y, z, lng, lat, angle, radius
+ *      Spetial fields: {
+ *          ordinalMeta: <module:echarts/data/OrdinalMeta>
+ *          createInvertedIndices: <boolean>
+ *      }
+ * @param {module:echarts/model/Model} hostModel
+ */
+
+
+var List = function (dimensions, hostModel) {
+  dimensions = dimensions || ['x', 'y'];
+  var dimensionInfos = {};
+  var dimensionNames = [];
+  var invertedIndicesMap = {};
+
+  for (var i = 0; i < dimensions.length; i++) {
+    // Use the original dimensions[i], where other flag props may exists.
+    var dimensionInfo = dimensions[i];
+
+    if (isString(dimensionInfo)) {
+      dimensionInfo = {
+        name: dimensionInfo
+      };
+    }
+
+    var dimensionName = dimensionInfo.name;
+    dimensionInfo.type = dimensionInfo.type || 'float';
+
+    if (!dimensionInfo.coordDim) {
+      dimensionInfo.coordDim = dimensionName;
+      dimensionInfo.coordDimIndex = 0;
+    }
+
+    dimensionInfo.otherDims = dimensionInfo.otherDims || {};
+    dimensionNames.push(dimensionName);
+    dimensionInfos[dimensionName] = dimensionInfo;
+    dimensionInfo.index = i;
+
+    if (dimensionInfo.createInvertedIndices) {
+      invertedIndicesMap[dimensionName] = [];
+    }
+  }
+  /**
+   * @readOnly
+   * @type {Array.<string>}
+   */
+
+
+  this.dimensions = dimensionNames;
+  /**
+   * Infomation of each data dimension, like data type.
+   * @type {Object}
+   */
+
+  this._dimensionInfos = dimensionInfos;
+  /**
+   * @type {module:echarts/model/Model}
+   */
+
+  this.hostModel = hostModel;
+  /**
+   * @type {module:echarts/model/Model}
+   */
+
+  this.dataType;
+  /**
+   * Indices stores the indices of data subset after filtered.
+   * This data subset will be used in chart.
+   * @type {Array.<number>}
+   * @readOnly
+   */
+
+  this._indices = null;
+  this._count = 0;
+  this._rawCount = 0;
+  /**
+   * Data storage
+   * @type {Object.<key, Array.<TypedArray|Array>>}
+   * @private
+   */
+
+  this._storage = {};
+  /**
+   * @type {Array.<string>}
+   */
+
+  this._nameList = [];
+  /**
+   * @type {Array.<string>}
+   */
+
+  this._idList = [];
+  /**
+   * Models of data option is stored sparse for optimizing memory cost
+   * @type {Array.<module:echarts/model/Model>}
+   * @private
+   */
+
+  this._optionModels = [];
+  /**
+   * Global visual properties after visual coding
+   * @type {Object}
+   * @private
+   */
+
+  this._visual = {};
+  /**
+   * Globel layout properties.
+   * @type {Object}
+   * @private
+   */
+
+  this._layout = {};
+  /**
+   * Item visual properties after visual coding
+   * @type {Array.<Object>}
+   * @private
+   */
+
+  this._itemVisuals = [];
+  /**
+   * Key: visual type, Value: boolean
+   * @type {Object}
+   * @readOnly
+   */
+
+  this.hasItemVisual = {};
+  /**
+   * Item layout properties after layout
+   * @type {Array.<Object>}
+   * @private
+   */
+
+  this._itemLayouts = [];
+  /**
+   * Graphic elemnents
+   * @type {Array.<module:zrender/Element>}
+   * @private
+   */
+
+  this._graphicEls = [];
+  /**
+   * Max size of each chunk.
+   * @type {number}
+   * @private
+   */
+
+  this._chunkSize = 1e5;
+  /**
+   * @type {number}
+   * @private
+   */
+
+  this._chunkCount = 0;
+  /**
+   * @type {Array.<Array|Object>}
+   * @private
+   */
+
+  this._rawData;
+  /**
+   * Raw extent will not be cloned, but only transfered.
+   * It will not be calculated util needed.
+   * key: dim,
+   * value: {end: number, extent: Array.<number>}
+   * @type {Object}
+   * @private
+   */
+
+  this._rawExtent = {};
+  /**
+   * @type {Object}
+   * @private
+   */
+
+  this._extent = {};
+  /**
+   * key: dim
+   * value: extent
+   * @type {Object}
+   * @private
+   */
+
+  this._approximateExtent = {};
+  /**
+   * Cache summary info for fast visit. See "dimensionHelper".
+   * @type {Object}
+   * @private
+   */
+
+  this._dimensionsSummary = summarizeDimensions(this);
+  /**
+   * @type {Object.<Array|TypedArray>}
+   * @private
+   */
+
+  this._invertedIndicesMap = invertedIndicesMap;
+  /**
+   * @type {Object}
+   * @private
+   */
+
+  this._calculationInfo = {};
+};
+
+var listProto = List.prototype;
+listProto.type = 'list';
+/**
+ * If each data item has it's own option
+ * @type {boolean}
+ */
+
+listProto.hasItemOption = true;
+/**
+ * Get dimension name
+ * @param {string|number} dim
+ *        Dimension can be concrete names like x, y, z, lng, lat, angle, radius
+ *        Or a ordinal number. For example getDimensionInfo(0) will return 'x' or 'lng' or 'radius'
+ * @return {string} Concrete dim name.
+ */
+
+listProto.getDimension = function (dim) {
+  if (!isNaN(dim)) {
+    dim = this.dimensions[dim] || dim;
+  }
+
+  return dim;
+};
+/**
+ * Get type and calculation info of particular dimension
+ * @param {string|number} dim
+ *        Dimension can be concrete names like x, y, z, lng, lat, angle, radius
+ *        Or a ordinal number. For example getDimensionInfo(0) will return 'x' or 'lng' or 'radius'
+ */
+
+
+listProto.getDimensionInfo = function (dim) {
+  // Do not clone, because there may be categories in dimInfo.
+  return this._dimensionInfos[this.getDimension(dim)];
+};
+/**
+ * @return {Array.<string>} concrete dimension name list on coord.
+ */
+
+
+listProto.getDimensionsOnCoord = function () {
+  return this._dimensionsSummary.dataDimsOnCoord.slice();
+};
+/**
+ * @param {string} coordDim
+ * @param {number} [idx] A coordDim may map to more than one data dim.
+ *        If idx is `true`, return a array of all mapped dims.
+ *        If idx is not specified, return the first dim not extra.
+ * @return {string|Array.<string>} concrete data dim.
+ *        If idx is number, and not found, return null/undefined.
+ *        If idx is `true`, and not found, return empty array (always return array).
+ */
+
+
+listProto.mapDimension = function (coordDim, idx) {
+  var dimensionsSummary = this._dimensionsSummary;
+
+  if (idx == null) {
+    return dimensionsSummary.encodeFirstDimNotExtra[coordDim];
+  }
+
+  var dims = dimensionsSummary.encode[coordDim];
+  return idx === true // always return array if idx is `true`
+  ? (dims || []).slice() : dims && dims[idx];
+};
+/**
+ * Initialize from data
+ * @param {Array.<Object|number|Array>} data source or data or data provider.
+ * @param {Array.<string>} [nameLIst] The name of a datum is used on data diff and
+ *        defualt label/tooltip.
+ *        A name can be specified in encode.itemName,
+ *        or dataItem.name (only for series option data),
+ *        or provided in nameList from outside.
+ * @param {Function} [dimValueGetter] (dataItem, dimName, dataIndex, dimIndex) => number
+ */
+
+
+listProto.initData = function (data, nameList, dimValueGetter) {
+  var notProvider = Source.isInstance(data) || isArrayLike(data);
+
+  if (notProvider) {
+    data = new DefaultDataProvider(data, this.dimensions.length);
+  }
+
+  this._rawData = data; // Clear
+
+  this._storage = {};
+  this._indices = null;
+  this._nameList = nameList || [];
+  this._idList = [];
+  this._nameRepeatCount = {};
+
+  if (!dimValueGetter) {
+    this.hasItemOption = false;
+  }
+  /**
+   * @readOnly
+   */
+
+
+  this.defaultDimValueGetter = defaultDimValueGetters[this._rawData.getSource().sourceFormat]; // Default dim value getter
+
+  this._dimValueGetter = dimValueGetter = dimValueGetter || this.defaultDimValueGetter; // Reset raw extent.
+
+  this._rawExtent = {};
+
+  this._initDataFromProvider(0, data.count()); // If data has no item option.
+
+
+  if (data.pure) {
+    this.hasItemOption = false;
+  }
+};
+
+listProto.getProvider = function () {
+  return this._rawData;
+};
+
+listProto.appendData = function (data) {
+  var rawData = this._rawData;
+  var start = this.count();
+  rawData.appendData(data);
+  var end = rawData.count();
+
+  if (!rawData.persistent) {
+    end += start;
+  }
+
+  this._initDataFromProvider(start, end);
+};
+
+listProto._initDataFromProvider = function (start, end) {
+  // Optimize.
+  if (start >= end) {
+    return;
+  }
+
+  var chunkSize = this._chunkSize;
+  var rawData = this._rawData;
+  var storage = this._storage;
+  var dimensions = this.dimensions;
+  var dimLen = dimensions.length;
+  var dimensionInfoMap = this._dimensionInfos;
+  var nameList = this._nameList;
+  var idList = this._idList;
+  var rawExtent = this._rawExtent;
+  var nameRepeatCount = this._nameRepeatCount = {};
+  var nameDimIdx;
+  var chunkCount = this._chunkCount;
+  var lastChunkIndex = chunkCount - 1;
+
+  for (var i = 0; i < dimLen; i++) {
+    var dim = dimensions[i];
+
+    if (!rawExtent[dim]) {
+      rawExtent[dim] = getInitialExtent();
+    }
+
+    var dimInfo = dimensionInfoMap[dim];
+
+    if (dimInfo.otherDims.itemName === 0) {
+      nameDimIdx = this._nameDimIdx = i;
+    }
+
+    if (dimInfo.otherDims.itemId === 0) {
+      this._idDimIdx = i;
+    }
+
+    var DataCtor = dataCtors[dimInfo.type];
+
+    if (!storage[dim]) {
+      storage[dim] = [];
+    }
+
+    var resizeChunkArray = storage[dim][lastChunkIndex];
+
+    if (resizeChunkArray && resizeChunkArray.length < chunkSize) {
+      var newStore = new DataCtor(Math.min(end - lastChunkIndex * chunkSize, chunkSize)); // The cost of the copy is probably inconsiderable
+      // within the initial chunkSize.
+
+      for (var j = 0; j < resizeChunkArray.length; j++) {
+        newStore[j] = resizeChunkArray[j];
+      }
+
+      storage[dim][lastChunkIndex] = newStore;
+    } // Create new chunks.
+
+
+    for (var k = chunkCount * chunkSize; k < end; k += chunkSize) {
+      storage[dim].push(new DataCtor(Math.min(end - k, chunkSize)));
+    }
+
+    this._chunkCount = storage[dim].length;
+  }
+
+  var dataItem = new Array(dimLen);
+
+  for (var idx = start; idx < end; idx++) {
+    // NOTICE: Try not to write things into dataItem
+    dataItem = rawData.getItem(idx, dataItem); // Each data item is value
+    // [1, 2]
+    // 2
+    // Bar chart, line chart which uses category axis
+    // only gives the 'y' value. 'x' value is the indices of category
+    // Use a tempValue to normalize the value to be a (x, y) value
+
+    var chunkIndex = Math.floor(idx / chunkSize);
+    var chunkOffset = idx % chunkSize; // Store the data by dimensions
+
+    for (var k = 0; k < dimLen; k++) {
+      var dim = dimensions[k];
+      var dimStorage = storage[dim][chunkIndex]; // PENDING NULL is empty or zero
+
+      var val = this._dimValueGetter(dataItem, dim, idx, k);
+
+      dimStorage[chunkOffset] = val;
+      var dimRawExtent = rawExtent[dim];
+
+      if (val < dimRawExtent[0]) {
+        dimRawExtent[0] = val;
+      }
+
+      if (val > dimRawExtent[1]) {
+        dimRawExtent[1] = val;
+      }
+    } // ??? FIXME not check by pure but sourceFormat?
+    // TODO refactor these logic.
+
+
+    if (!rawData.pure) {
+      var name = nameList[idx];
+
+      if (dataItem && name == null) {
+        // If dataItem is {name: ...}, it has highest priority.
+        // That is appropriate for many common cases.
+        if (dataItem.name != null) {
+          // There is no other place to persistent dataItem.name,
+          // so save it to nameList.
+          nameList[idx] = name = dataItem.name;
+        } else if (nameDimIdx != null) {
+          var nameDim = dimensions[nameDimIdx];
+          var nameDimChunk = storage[nameDim][chunkIndex];
+
+          if (nameDimChunk) {
+            name = nameDimChunk[chunkOffset];
+            var ordinalMeta = dimensionInfoMap[nameDim].ordinalMeta;
+
+            if (ordinalMeta && ordinalMeta.categories.length) {
+              name = ordinalMeta.categories[name];
+            }
+          }
+        }
+      } // Try using the id in option
+      // id or name is used on dynamical data, mapping old and new items.
+
+
+      var id = dataItem == null ? null : dataItem.id;
+
+      if (id == null && name != null) {
+        // Use name as id and add counter to avoid same name
+        nameRepeatCount[name] = nameRepeatCount[name] || 0;
+        id = name;
+
+        if (nameRepeatCount[name] > 0) {
+          id += '__ec__' + nameRepeatCount[name];
+        }
+
+        nameRepeatCount[name]++;
+      }
+
+      id != null && (idList[idx] = id);
+    }
+  }
+
+  if (!rawData.persistent && rawData.clean) {
+    // Clean unused data if data source is typed array.
+    rawData.clean();
+  }
+
+  this._rawCount = this._count = end; // Reset data extent
+
+  this._extent = {};
+  prepareInvertedIndex(this);
+};
+
+function prepareInvertedIndex(list) {
+  var invertedIndicesMap = list._invertedIndicesMap;
+  each$1(invertedIndicesMap, function (invertedIndices, dim) {
+    var dimInfo = list._dimensionInfos[dim]; // Currently, only dimensions that has ordinalMeta can create inverted indices.
+
+    var ordinalMeta = dimInfo.ordinalMeta;
+
+    if (ordinalMeta) {
+      invertedIndices = invertedIndicesMap[dim] = new CtorUint32Array(ordinalMeta.categories.length); // The default value of TypedArray is 0. To avoid miss
+      // mapping to 0, we should set it as NaN.
+
+      for (var i = 0; i < invertedIndices.length; i++) {
+        invertedIndices[i] = NaN;
+      }
+
+      for (var i = 0; i < list._count; i++) {
+        // Only support the case that all values are distinct.
+        invertedIndices[list.get(dim, i)] = i;
+      }
+    }
+  });
+}
+
+function getRawValueFromStore(list, dimIndex, rawIndex) {
+  var val;
+
+  if (dimIndex != null) {
+    var chunkSize = list._chunkSize;
+    var chunkIndex = Math.floor(rawIndex / chunkSize);
+    var chunkOffset = rawIndex % chunkSize;
+    var dim = list.dimensions[dimIndex];
+    var chunk = list._storage[dim][chunkIndex];
+
+    if (chunk) {
+      val = chunk[chunkOffset];
+      var ordinalMeta = list._dimensionInfos[dim].ordinalMeta;
+
+      if (ordinalMeta && ordinalMeta.categories.length) {
+        val = ordinalMeta.categories[val];
+      }
+    }
+  }
+
+  return val;
+}
+/**
+ * @return {number}
+ */
+
+
+listProto.count = function () {
+  return this._count;
+};
+
+listProto.getIndices = function () {
+  var newIndices;
+  var indices = this._indices;
+
+  if (indices) {
+    var Ctor = indices.constructor;
+    var thisCount = this._count; // `new Array(a, b, c)` is different from `new Uint32Array(a, b, c)`.
+
+    if (Ctor === Array) {
+      newIndices = new Ctor(thisCount);
+
+      for (var i = 0; i < thisCount; i++) {
+        newIndices[i] = indices[i];
+      }
+    } else {
+      newIndices = new Ctor(indices.buffer, 0, thisCount);
+    }
+  } else {
+    var Ctor = getIndicesCtor(this);
+    var newIndices = new Ctor(this.count());
+
+    for (var i = 0; i < newIndices.length; i++) {
+      newIndices[i] = i;
+    }
+  }
+
+  return newIndices;
+};
+/**
+ * Get value. Return NaN if idx is out of range.
+ * @param {string} dim Dim must be concrete name.
+ * @param {number} idx
+ * @param {boolean} stack
+ * @return {number}
+ */
+
+
+listProto.get = function (dim, idx
+/*, stack */
+) {
+  if (!(idx >= 0 && idx < this._count)) {
+    return NaN;
+  }
+
+  var storage = this._storage;
+
+  if (!storage[dim]) {
+    // TODO Warn ?
+    return NaN;
+  }
+
+  idx = this.getRawIndex(idx);
+  var chunkIndex = Math.floor(idx / this._chunkSize);
+  var chunkOffset = idx % this._chunkSize;
+  var chunkStore = storage[dim][chunkIndex];
+  var value = chunkStore[chunkOffset]; // FIXME ordinal data type is not stackable
+  // if (stack) {
+  //     var dimensionInfo = this._dimensionInfos[dim];
+  //     if (dimensionInfo && dimensionInfo.stackable) {
+  //         var stackedOn = this.stackedOn;
+  //         while (stackedOn) {
+  //             // Get no stacked data of stacked on
+  //             var stackedValue = stackedOn.get(dim, idx);
+  //             // Considering positive stack, negative stack and empty data
+  //             if ((value >= 0 && stackedValue > 0)  // Positive stack
+  //                 || (value <= 0 && stackedValue < 0) // Negative stack
+  //             ) {
+  //                 value += stackedValue;
+  //             }
+  //             stackedOn = stackedOn.stackedOn;
+  //         }
+  //     }
+  // }
+
+  return value;
+};
+/**
+ * @param {string} dim concrete dim
+ * @param {number} rawIndex
+ * @return {number|string}
+ */
+
+
+listProto.getByRawIndex = function (dim, rawIdx) {
+  if (!(rawIdx >= 0 && rawIdx < this._rawCount)) {
+    return NaN;
+  }
+
+  var dimStore = this._storage[dim];
+
+  if (!dimStore) {
+    // TODO Warn ?
+    return NaN;
+  }
+
+  var chunkIndex = Math.floor(rawIdx / this._chunkSize);
+  var chunkOffset = rawIdx % this._chunkSize;
+  var chunkStore = dimStore[chunkIndex];
+  return chunkStore[chunkOffset];
+};
+/**
+ * FIXME Use `get` on chrome maybe slow(in filterSelf and selectRange).
+ * Hack a much simpler _getFast
+ * @private
+ */
+
+
+listProto._getFast = function (dim, rawIdx) {
+  var chunkIndex = Math.floor(rawIdx / this._chunkSize);
+  var chunkOffset = rawIdx % this._chunkSize;
+  var chunkStore = this._storage[dim][chunkIndex];
+  return chunkStore[chunkOffset];
+};
+/**
+ * Get value for multi dimensions.
+ * @param {Array.<string>} [dimensions] If ignored, using all dimensions.
+ * @param {number} idx
+ * @return {number}
+ */
+
+
+listProto.getValues = function (dimensions, idx
+/*, stack */
+) {
+  var values = [];
+
+  if (!isArray(dimensions)) {
+    // stack = idx;
+    idx = dimensions;
+    dimensions = this.dimensions;
+  }
+
+  for (var i = 0, len = dimensions.length; i < len; i++) {
+    values.push(this.get(dimensions[i], idx
+    /*, stack */
+    ));
+  }
+
+  return values;
+};
+/**
+ * If value is NaN. Inlcuding '-'
+ * Only check the coord dimensions.
+ * @param {string} dim
+ * @param {number} idx
+ * @return {number}
+ */
+
+
+listProto.hasValue = function (idx) {
+  var dataDimsOnCoord = this._dimensionsSummary.dataDimsOnCoord;
+  var dimensionInfos = this._dimensionInfos;
+
+  for (var i = 0, len = dataDimsOnCoord.length; i < len; i++) {
+    if ( // Ordinal type can be string or number
+    dimensionInfos[dataDimsOnCoord[i]].type !== 'ordinal' // FIXME check ordinal when using index?
+    && isNaN(this.get(dataDimsOnCoord[i], idx))) {
+      return false;
+    }
+  }
+
+  return true;
+};
+/**
+ * Get extent of data in one dimension
+ * @param {string} dim
+ * @param {boolean} stack
+ */
+
+
+listProto.getDataExtent = function (dim
+/*, stack */
+) {
+  // Make sure use concrete dim as cache name.
+  dim = this.getDimension(dim);
+  var dimData = this._storage[dim];
+  var initialExtent = getInitialExtent(); // stack = !!((stack || false) && this.getCalculationInfo(dim));
+
+  if (!dimData) {
+    return initialExtent;
+  } // Make more strict checkings to ensure hitting cache.
+
+
+  var currEnd = this.count(); // var cacheName = [dim, !!stack].join('_');
+  // var cacheName = dim;
+  // Consider the most cases when using data zoom, `getDataExtent`
+  // happened before filtering. We cache raw extent, which is not
+  // necessary to be cleared and recalculated when restore data.
+
+  var useRaw = !this._indices; // && !stack;
+
+  var dimExtent;
+
+  if (useRaw) {
+    return this._rawExtent[dim].slice();
+  }
+
+  dimExtent = this._extent[dim];
+
+  if (dimExtent) {
+    return dimExtent.slice();
+  }
+
+  dimExtent = initialExtent;
+  var min = dimExtent[0];
+  var max = dimExtent[1];
+
+  for (var i = 0; i < currEnd; i++) {
+    // var value = stack ? this.get(dim, i, true) : this._getFast(dim, this.getRawIndex(i));
+    var value = this._getFast(dim, this.getRawIndex(i));
+
+    value < min && (min = value);
+    value > max && (max = value);
+  }
+
+  dimExtent = [min, max];
+  this._extent[dim] = dimExtent;
+  return dimExtent;
+};
+/**
+ * Optimize for the scenario that data is filtered by a given extent.
+ * Consider that if data amount is more than hundreds of thousand,
+ * extent calculation will cost more than 10ms and the cache will
+ * be erased because of the filtering.
+ */
+
+
+listProto.getApproximateExtent = function (dim
+/*, stack */
+) {
+  dim = this.getDimension(dim);
+  return this._approximateExtent[dim] || this.getDataExtent(dim
+  /*, stack */
+  );
+};
+
+listProto.setApproximateExtent = function (extent, dim
+/*, stack */
+) {
+  dim = this.getDimension(dim);
+  this._approximateExtent[dim] = extent.slice();
+};
+/**
+ * @param {string} key
+ * @return {*}
+ */
+
+
+listProto.getCalculationInfo = function (key) {
+  return this._calculationInfo[key];
+};
+/**
+ * @param {string|Object} key or k-v object
+ * @param {*} [value]
+ */
+
+
+listProto.setCalculationInfo = function (key, value) {
+  isObject$4(key) ? extend(this._calculationInfo, key) : this._calculationInfo[key] = value;
+};
+/**
+ * Get sum of data in one dimension
+ * @param {string} dim
+ */
+
+
+listProto.getSum = function (dim
+/*, stack */
+) {
+  var dimData = this._storage[dim];
+  var sum = 0;
+
+  if (dimData) {
+    for (var i = 0, len = this.count(); i < len; i++) {
+      var value = this.get(dim, i
+      /*, stack */
+      );
+
+      if (!isNaN(value)) {
+        sum += value;
+      }
+    }
+  }
+
+  return sum;
+};
+/**
+ * Get median of data in one dimension
+ * @param {string} dim
+ */
+
+
+listProto.getMedian = function (dim
+/*, stack */
+) {
+  var dimDataArray = []; // map all data of one dimension
+
+  this.each(dim, function (val, idx) {
+    if (!isNaN(val)) {
+      dimDataArray.push(val);
+    }
+  }); // TODO
+  // Use quick select?
+  // immutability & sort
+
+  var sortedDimDataArray = [].concat(dimDataArray).sort(function (a, b) {
+    return a - b;
+  });
+  var len = this.count(); // calculate median
+
+  return len === 0 ? 0 : len % 2 === 1 ? sortedDimDataArray[(len - 1) / 2] : (sortedDimDataArray[len / 2] + sortedDimDataArray[len / 2 - 1]) / 2;
+}; // /**
+//  * Retreive the index with given value
+//  * @param {string} dim Concrete dimension.
+//  * @param {number} value
+//  * @return {number}
+//  */
+// Currently incorrect: should return dataIndex but not rawIndex.
+// Do not fix it until this method is to be used somewhere.
+// FIXME Precision of float value
+// listProto.indexOf = function (dim, value) {
+//     var storage = this._storage;
+//     var dimData = storage[dim];
+//     var chunkSize = this._chunkSize;
+//     if (dimData) {
+//         for (var i = 0, len = this.count(); i < len; i++) {
+//             var chunkIndex = Math.floor(i / chunkSize);
+//             var chunkOffset = i % chunkSize;
+//             if (dimData[chunkIndex][chunkOffset] === value) {
+//                 return i;
+//             }
+//         }
+//     }
+//     return -1;
+// };
+
+/**
+ * Only support the dimension which inverted index created.
+ * Do not support other cases until required.
+ * @param {string} concrete dim
+ * @param {number|string} value
+ * @return {number} rawIndex
+ */
+
+
+listProto.rawIndexOf = function (dim, value) {
+  var invertedIndices = dim && this._invertedIndicesMap[dim];
+  var rawIndex = invertedIndices[value];
+
+  if (rawIndex == null || isNaN(rawIndex)) {
+    return -1;
+  }
+
+  return rawIndex;
+};
+/**
+ * Retreive the index with given name
+ * @param {number} idx
+ * @param {number} name
+ * @return {number}
+ */
+
+
+listProto.indexOfName = function (name) {
+  for (var i = 0, len = this.count(); i < len; i++) {
+    if (this.getName(i) === name) {
+      return i;
+    }
+  }
+
+  return -1;
+};
+/**
+ * Retreive the index with given raw data index
+ * @param {number} idx
+ * @param {number} name
+ * @return {number}
+ */
+
+
+listProto.indexOfRawIndex = function (rawIndex) {
+  if (!this._indices) {
+    return rawIndex;
+  }
+
+  if (rawIndex >= this._rawCount || rawIndex < 0) {
+    return -1;
+  } // Indices are ascending
+
+
+  var indices = this._indices; // If rawIndex === dataIndex
+
+  var rawDataIndex = indices[rawIndex];
+
+  if (rawDataIndex != null && rawDataIndex < this._count && rawDataIndex === rawIndex) {
+    return rawIndex;
+  }
+
+  var left = 0;
+  var right = this._count - 1;
+
+  while (left <= right) {
+    var mid = (left + right) / 2 | 0;
+
+    if (indices[mid] < rawIndex) {
+      left = mid + 1;
+    } else if (indices[mid] > rawIndex) {
+      right = mid - 1;
+    } else {
+      return mid;
+    }
+  }
+
+  return -1;
+};
+/**
+ * Retreive the index of nearest value
+ * @param {string} dim
+ * @param {number} value
+ * @param {number} [maxDistance=Infinity]
+ * @return {Array.<number>} Considere multiple points has the same value.
+ */
+
+
+listProto.indicesOfNearest = function (dim, value, maxDistance) {
+  var storage = this._storage;
+  var dimData = storage[dim];
+  var nearestIndices = [];
+
+  if (!dimData) {
+    return nearestIndices;
+  }
+
+  if (maxDistance == null) {
+    maxDistance = Infinity;
+  }
+
+  var minDist = Number.MAX_VALUE;
+  var minDiff = -1;
+
+  for (var i = 0, len = this.count(); i < len; i++) {
+    var diff = value - this.get(dim, i
+    /*, stack */
+    );
+    var dist = Math.abs(diff);
+
+    if (diff <= maxDistance && dist <= minDist) {
+      // For the case of two data are same on xAxis, which has sequence data.
+      // Show the nearest index
+      // https://github.com/ecomfe/echarts/issues/2869
+      if (dist < minDist || diff >= 0 && minDiff < 0) {
+        minDist = dist;
+        minDiff = diff;
+        nearestIndices.length = 0;
+      }
+
+      nearestIndices.push(i);
+    }
+  }
+
+  return nearestIndices;
+};
+/**
+ * Get raw data index
+ * @param {number} idx
+ * @return {number}
+ */
+
+
+listProto.getRawIndex = getRawIndexWithoutIndices;
+
+function getRawIndexWithoutIndices(idx) {
+  return idx;
+}
+
+function getRawIndexWithIndices(idx) {
+  if (idx < this._count && idx >= 0) {
+    return this._indices[idx];
+  }
+
+  return -1;
+}
+/**
+ * Get raw data item
+ * @param {number} idx
+ * @return {number}
+ */
+
+
+listProto.getRawDataItem = function (idx) {
+  if (!this._rawData.persistent) {
+    var val = [];
+
+    for (var i = 0; i < this.dimensions.length; i++) {
+      var dim = this.dimensions[i];
+      val.push(this.get(dim, idx));
+    }
+
+    return val;
+  } else {
+    return this._rawData.getItem(this.getRawIndex(idx));
+  }
+};
+/**
+ * @param {number} idx
+ * @param {boolean} [notDefaultIdx=false]
+ * @return {string}
+ */
+
+
+listProto.getName = function (idx) {
+  var rawIndex = this.getRawIndex(idx);
+  return this._nameList[rawIndex] || getRawValueFromStore(this, this._nameDimIdx, rawIndex) || '';
+};
+/**
+ * @param {number} idx
+ * @param {boolean} [notDefaultIdx=false]
+ * @return {string}
+ */
+
+
+listProto.getId = function (idx) {
+  return getId(this, this.getRawIndex(idx));
+};
+
+function getId(list, rawIndex) {
+  var id = list._idList[rawIndex];
+
+  if (id == null) {
+    id = getRawValueFromStore(list, list._idDimIdx, rawIndex);
+  }
+
+  if (id == null) {
+    // FIXME Check the usage in graph, should not use prefix.
+    id = ID_PREFIX + rawIndex;
+  }
+
+  return id;
+}
+
+function normalizeDimensions(dimensions) {
+  if (!isArray(dimensions)) {
+    dimensions = [dimensions];
+  }
+
+  return dimensions;
+}
+
+/**
+ * Data iteration
+ * @param {string|Array.<string>}
+ * @param {Function} cb
+ * @param {*} [context=this]
+ *
+ * @example
+ *  list.each('x', function (x, idx) {});
+ *  list.each(['x', 'y'], function (x, y, idx) {});
+ *  list.each(function (idx) {})
+ */
+
+
+listProto.each = function (dims, cb, context, contextCompat) {
+  'use strict';
+
+  if (!this._count) {
+    return;
+  }
+
+  if (typeof dims === 'function') {
+    contextCompat = context;
+    context = cb;
+    cb = dims;
+    dims = [];
+  } // contextCompat just for compat echarts3
+
+
+  context = context || contextCompat || this;
+  dims = map(normalizeDimensions(dims), this.getDimension, this);
+  var dimSize = dims.length;
+
+  for (var i = 0; i < this.count(); i++) {
+    // Simple optimization
+    switch (dimSize) {
+      case 0:
+        cb.call(context, i);
+        break;
+
+      case 1:
+        cb.call(context, this.get(dims[0], i), i);
+        break;
+
+      case 2:
+        cb.call(context, this.get(dims[0], i), this.get(dims[1], i), i);
+        break;
+
+      default:
+        var k = 0;
+        var value = [];
+
+        for (; k < dimSize; k++) {
+          value[k] = this.get(dims[k], i);
+        } // Index
+
+
+        value[k] = i;
+        cb.apply(context, value);
+    }
+  }
+};
+/**
+ * Data filter
+ * @param {string|Array.<string>}
+ * @param {Function} cb
+ * @param {*} [context=this]
+ */
+
+
+listProto.filterSelf = function (dimensions, cb, context, contextCompat) {
+  'use strict';
+
+  if (!this._count) {
+    return;
+  }
+
+  if (typeof dimensions === 'function') {
+    contextCompat = context;
+    context = cb;
+    cb = dimensions;
+    dimensions = [];
+  } // contextCompat just for compat echarts3
+
+
+  context = context || contextCompat || this;
+  dimensions = map(normalizeDimensions(dimensions), this.getDimension, this);
+  var count = this.count();
+  var Ctor = getIndicesCtor(this);
+  var newIndices = new Ctor(count);
+  var value = [];
+  var dimSize = dimensions.length;
+  var offset = 0;
+  var dim0 = dimensions[0];
+
+  for (var i = 0; i < count; i++) {
+    var keep;
+    var rawIdx = this.getRawIndex(i); // Simple optimization
+
+    if (dimSize === 0) {
+      keep = cb.call(context, i);
+    } else if (dimSize === 1) {
+      var val = this._getFast(dim0, rawIdx);
+
+      keep = cb.call(context, val, i);
+    } else {
+      for (var k = 0; k < dimSize; k++) {
+        value[k] = this._getFast(dim0, rawIdx);
+      }
+
+      value[k] = i;
+      keep = cb.apply(context, value);
+    }
+
+    if (keep) {
+      newIndices[offset++] = rawIdx;
+    }
+  } // Set indices after filtered.
+
+
+  if (offset < count) {
+    this._indices = newIndices;
+  }
+
+  this._count = offset; // Reset data extent
+
+  this._extent = {};
+  this.getRawIndex = this._indices ? getRawIndexWithIndices : getRawIndexWithoutIndices;
+  return this;
+};
+/**
+ * Select data in range. (For optimization of filter)
+ * (Manually inline code, support 5 million data filtering in data zoom.)
+ */
+
+
+listProto.selectRange = function (range) {
+  'use strict';
+
+  if (!this._count) {
+    return;
+  }
+
+  var dimensions = [];
+
+  for (var dim in range) {
+    if (range.hasOwnProperty(dim)) {
+      dimensions.push(dim);
+    }
+  }
+
+  var dimSize = dimensions.length;
+
+  if (!dimSize) {
+    return;
+  }
+
+  var originalCount = this.count();
+  var Ctor = getIndicesCtor(this);
+  var newIndices = new Ctor(originalCount);
+  var offset = 0;
+  var dim0 = dimensions[0];
+  var min = range[dim0][0];
+  var max = range[dim0][1];
+  var quickFinished = false;
+
+  if (!this._indices) {
+    // Extreme optimization for common case. About 2x faster in chrome.
+    var idx = 0;
+
+    if (dimSize === 1) {
+      var dimStorage = this._storage[dimensions[0]];
+
+      for (var k = 0; k < this._chunkCount; k++) {
+        var chunkStorage = dimStorage[k];
+        var len = Math.min(this._count - k * this._chunkSize, this._chunkSize);
+
+        for (var i = 0; i < len; i++) {
+          var val = chunkStorage[i]; // NaN will not be filtered. Consider the case, in line chart, empty
+          // value indicates the line should be broken. But for the case like
+          // scatter plot, a data item with empty value will not be rendered,
+          // but the axis extent may be effected if some other dim of the data
+          // item has value. Fortunately it is not a significant negative effect.
+
+          if (val >= min && val <= max || isNaN(val)) {
+            newIndices[offset++] = idx;
+          }
+
+          idx++;
+        }
+      }
+
+      quickFinished = true;
+    } else if (dimSize === 2) {
+      var dimStorage = this._storage[dim0];
+      var dimStorage2 = this._storage[dimensions[1]];
+      var min2 = range[dimensions[1]][0];
+      var max2 = range[dimensions[1]][1];
+
+      for (var k = 0; k < this._chunkCount; k++) {
+        var chunkStorage = dimStorage[k];
+        var chunkStorage2 = dimStorage2[k];
+        var len = Math.min(this._count - k * this._chunkSize, this._chunkSize);
+
+        for (var i = 0; i < len; i++) {
+          var val = chunkStorage[i];
+          var val2 = chunkStorage2[i]; // Do not filter NaN, see comment above.
+
+          if ((val >= min && val <= max || isNaN(val)) && (val2 >= min2 && val2 <= max2 || isNaN(val2))) {
+            newIndices[offset++] = idx;
+          }
+
+          idx++;
+        }
+      }
+
+      quickFinished = true;
+    }
+  }
+
+  if (!quickFinished) {
+    if (dimSize === 1) {
+      for (var i = 0; i < originalCount; i++) {
+        var rawIndex = this.getRawIndex(i);
+
+        var val = this._getFast(dim0, rawIndex); // Do not filter NaN, see comment above.
+
+
+        if (val >= min && val <= max || isNaN(val)) {
+          newIndices[offset++] = rawIndex;
+        }
+      }
+    } else {
+      for (var i = 0; i < originalCount; i++) {
+        var keep = true;
+        var rawIndex = this.getRawIndex(i);
+
+        for (var k = 0; k < dimSize; k++) {
+          var dimk = dimensions[k];
+
+          var val = this._getFast(dim, rawIndex); // Do not filter NaN, see comment above.
+
+
+          if (val < range[dimk][0] || val > range[dimk][1]) {
+            keep = false;
+          }
+        }
+
+        if (keep) {
+          newIndices[offset++] = this.getRawIndex(i);
+        }
+      }
+    }
+  } // Set indices after filtered.
+
+
+  if (offset < originalCount) {
+    this._indices = newIndices;
+  }
+
+  this._count = offset; // Reset data extent
+
+  this._extent = {};
+  this.getRawIndex = this._indices ? getRawIndexWithIndices : getRawIndexWithoutIndices;
+  return this;
+};
+/**
+ * Data mapping to a plain array
+ * @param {string|Array.<string>} [dimensions]
+ * @param {Function} cb
+ * @param {*} [context=this]
+ * @return {Array}
+ */
+
+
+listProto.mapArray = function (dimensions, cb, context, contextCompat) {
+  'use strict';
+
+  if (typeof dimensions === 'function') {
+    contextCompat = context;
+    context = cb;
+    cb = dimensions;
+    dimensions = [];
+  } // contextCompat just for compat echarts3
+
+
+  context = context || contextCompat || this;
+  var result = [];
+  this.each(dimensions, function () {
+    result.push(cb && cb.apply(this, arguments));
+  }, context);
+  return result;
+}; // Data in excludeDimensions is copied, otherwise transfered.
+
+
+function cloneListForMapAndSample(original, excludeDimensions) {
+  var allDimensions = original.dimensions;
+  var list = new List(map(allDimensions, original.getDimensionInfo, original), original.hostModel); // FIXME If needs stackedOn, value may already been stacked
+
+  transferProperties(list, original);
+  var storage = list._storage = {};
+  var originalStorage = original._storage; // Init storage
+
+  for (var i = 0; i < allDimensions.length; i++) {
+    var dim = allDimensions[i];
+
+    if (originalStorage[dim]) {
+      // Notice that we do not reset invertedIndicesMap here, becuase
+      // there is no scenario of mapping or sampling ordinal dimension.
+      if (indexOf(excludeDimensions, dim) >= 0) {
+        storage[dim] = cloneDimStore(originalStorage[dim]);
+        list._rawExtent[dim] = getInitialExtent();
+        list._extent[dim] = null;
+      } else {
+        // Direct reference for other dimensions
+        storage[dim] = originalStorage[dim];
+      }
+    }
+  }
+
+  return list;
+}
+
+function cloneDimStore(originalDimStore) {
+  var newDimStore = new Array(originalDimStore.length);
+
+  for (var j = 0; j < originalDimStore.length; j++) {
+    newDimStore[j] = cloneChunk(originalDimStore[j]);
+  }
+
+  return newDimStore;
+}
+
+function getInitialExtent() {
+  return [Infinity, -Infinity];
+}
+/**
+ * Data mapping to a new List with given dimensions
+ * @param {string|Array.<string>} dimensions
+ * @param {Function} cb
+ * @param {*} [context=this]
+ * @return {Array}
+ */
+
+
+listProto.map = function (dimensions, cb, context, contextCompat) {
+  'use strict'; // contextCompat just for compat echarts3
+
+  context = context || contextCompat || this;
+  dimensions = map(normalizeDimensions(dimensions), this.getDimension, this);
+  var list = cloneListForMapAndSample(this, dimensions); // Following properties are all immutable.
+  // So we can reference to the same value
+
+  list._indices = this._indices;
+  list.getRawIndex = list._indices ? getRawIndexWithIndices : getRawIndexWithoutIndices;
+  var storage = list._storage;
+  var tmpRetValue = [];
+  var chunkSize = this._chunkSize;
+  var dimSize = dimensions.length;
+  var dataCount = this.count();
+  var values = [];
+  var rawExtent = list._rawExtent;
+
+  for (var dataIndex = 0; dataIndex < dataCount; dataIndex++) {
+    for (var dimIndex = 0; dimIndex < dimSize; dimIndex++) {
+      values[dimIndex] = this.get(dimensions[dimIndex], dataIndex
+      /*, stack */
+      );
+    }
+
+    values[dimSize] = dataIndex;
+    var retValue = cb && cb.apply(context, values);
+
+    if (retValue != null) {
+      // a number or string (in oridinal dimension)?
+      if (typeof retValue !== 'object') {
+        tmpRetValue[0] = retValue;
+        retValue = tmpRetValue;
+      }
+
+      var rawIndex = this.getRawIndex(dataIndex);
+      var chunkIndex = Math.floor(rawIndex / chunkSize);
+      var chunkOffset = rawIndex % chunkSize;
+
+      for (var i = 0; i < retValue.length; i++) {
+        var dim = dimensions[i];
+        var val = retValue[i];
+        var rawExtentOnDim = rawExtent[dim];
+        var dimStore = storage[dim];
+
+        if (dimStore) {
+          dimStore[chunkIndex][chunkOffset] = val;
+        }
+
+        if (val < rawExtentOnDim[0]) {
+          rawExtentOnDim[0] = val;
+        }
+
+        if (val > rawExtentOnDim[1]) {
+          rawExtentOnDim[1] = val;
+        }
+      }
+    }
+  }
+
+  return list;
+};
+/**
+ * Large data down sampling on given dimension
+ * @param {string} dimension
+ * @param {number} rate
+ * @param {Function} sampleValue
+ * @param {Function} sampleIndex Sample index for name and id
+ */
+
+
+listProto.downSample = function (dimension, rate, sampleValue, sampleIndex) {
+  var list = cloneListForMapAndSample(this, [dimension]);
+  var targetStorage = list._storage;
+  var frameValues = [];
+  var frameSize = Math.floor(1 / rate);
+  var dimStore = targetStorage[dimension];
+  var len = this.count();
+  var chunkSize = this._chunkSize;
+  var rawExtentOnDim = list._rawExtent[dimension];
+  var newIndices = new (getIndicesCtor(this))(len);
+  var offset = 0;
+
+  for (var i = 0; i < len; i += frameSize) {
+    // Last frame
+    if (frameSize > len - i) {
+      frameSize = len - i;
+      frameValues.length = frameSize;
+    }
+
+    for (var k = 0; k < frameSize; k++) {
+      var dataIdx = this.getRawIndex(i + k);
+      var originalChunkIndex = Math.floor(dataIdx / chunkSize);
+      var originalChunkOffset = dataIdx % chunkSize;
+      frameValues[k] = dimStore[originalChunkIndex][originalChunkOffset];
+    }
+
+    var value = sampleValue(frameValues);
+    var sampleFrameIdx = this.getRawIndex(Math.min(i + sampleIndex(frameValues, value) || 0, len - 1));
+    var sampleChunkIndex = Math.floor(sampleFrameIdx / chunkSize);
+    var sampleChunkOffset = sampleFrameIdx % chunkSize; // Only write value on the filtered data
+
+    dimStore[sampleChunkIndex][sampleChunkOffset] = value;
+
+    if (value < rawExtentOnDim[0]) {
+      rawExtentOnDim[0] = value;
+    }
+
+    if (value > rawExtentOnDim[1]) {
+      rawExtentOnDim[1] = value;
+    }
+
+    newIndices[offset++] = sampleFrameIdx;
+  }
+
+  list._count = offset;
+  list._indices = newIndices;
+  list.getRawIndex = getRawIndexWithIndices;
+  return list;
+};
+/**
+ * Get model of one data item.
+ *
+ * @param {number} idx
+ */
+// FIXME Model proxy ?
+
+
+listProto.getItemModel = function (idx) {
+  var hostModel = this.hostModel;
+  return new Model(this.getRawDataItem(idx), hostModel, hostModel && hostModel.ecModel);
+};
+/**
+ * Create a data differ
+ * @param {module:echarts/data/List} otherList
+ * @return {module:echarts/data/DataDiffer}
+ */
+
+
+listProto.diff = function (otherList) {
+  var thisList = this;
+  return new DataDiffer(otherList ? otherList.getIndices() : [], this.getIndices(), function (idx) {
+    return getId(otherList, idx);
+  }, function (idx) {
+    return getId(thisList, idx);
+  });
+};
+/**
+ * Get visual property.
+ * @param {string} key
+ */
+
+
+listProto.getVisual = function (key) {
+  var visual = this._visual;
+  return visual && visual[key];
+};
+/**
+ * Set visual property
+ * @param {string|Object} key
+ * @param {*} [value]
+ *
+ * @example
+ *  setVisual('color', color);
+ *  setVisual({
+ *      'color': color
+ *  });
+ */
+
+
+listProto.setVisual = function (key, val) {
+  if (isObject$4(key)) {
+    for (var name in key) {
+      if (key.hasOwnProperty(name)) {
+        this.setVisual(name, key[name]);
+      }
+    }
+
+    return;
+  }
+
+  this._visual = this._visual || {};
+  this._visual[key] = val;
+};
+/**
+ * Set layout property.
+ * @param {string|Object} key
+ * @param {*} [val]
+ */
+
+
+listProto.setLayout = function (key, val) {
+  if (isObject$4(key)) {
+    for (var name in key) {
+      if (key.hasOwnProperty(name)) {
+        this.setLayout(name, key[name]);
+      }
+    }
+
+    return;
+  }
+
+  this._layout[key] = val;
+};
+/**
+ * Get layout property.
+ * @param  {string} key.
+ * @return {*}
+ */
+
+
+listProto.getLayout = function (key) {
+  return this._layout[key];
+};
+/**
+ * Get layout of single data item
+ * @param {number} idx
+ */
+
+
+listProto.getItemLayout = function (idx) {
+  return this._itemLayouts[idx];
+};
+/**
+ * Set layout of single data item
+ * @param {number} idx
+ * @param {Object} layout
+ * @param {boolean=} [merge=false]
+ */
+
+
+listProto.setItemLayout = function (idx, layout, merge$$1) {
+  this._itemLayouts[idx] = merge$$1 ? extend(this._itemLayouts[idx] || {}, layout) : layout;
+};
+/**
+ * Clear all layout of single data item
+ */
+
+
+listProto.clearItemLayouts = function () {
+  this._itemLayouts.length = 0;
+};
+/**
+ * Get visual property of single data item
+ * @param {number} idx
+ * @param {string} key
+ * @param {boolean} [ignoreParent=false]
+ */
+
+
+listProto.getItemVisual = function (idx, key, ignoreParent) {
+  var itemVisual = this._itemVisuals[idx];
+  var val = itemVisual && itemVisual[key];
+
+  if (val == null && !ignoreParent) {
+    // Use global visual property
+    return this.getVisual(key);
+  }
+
+  return val;
+};
+/**
+ * Set visual property of single data item
+ *
+ * @param {number} idx
+ * @param {string|Object} key
+ * @param {*} [value]
+ *
+ * @example
+ *  setItemVisual(0, 'color', color);
+ *  setItemVisual(0, {
+ *      'color': color
+ *  });
+ */
+
+
+listProto.setItemVisual = function (idx, key, value) {
+  var itemVisual = this._itemVisuals[idx] || {};
+  var hasItemVisual = this.hasItemVisual;
+  this._itemVisuals[idx] = itemVisual;
+
+  if (isObject$4(key)) {
+    for (var name in key) {
+      if (key.hasOwnProperty(name)) {
+        itemVisual[name] = key[name];
+        hasItemVisual[name] = true;
+      }
+    }
+
+    return;
+  }
+
+  itemVisual[key] = value;
+  hasItemVisual[key] = true;
+};
+/**
+ * Clear itemVisuals and list visual.
+ */
+
+
+listProto.clearAllVisual = function () {
+  this._visual = {};
+  this._itemVisuals = [];
+  this.hasItemVisual = {};
+};
+
+var setItemDataAndSeriesIndex = function (child) {
+  child.seriesIndex = this.seriesIndex;
+  child.dataIndex = this.dataIndex;
+  child.dataType = this.dataType;
+};
+/**
+ * Set graphic element relative to data. It can be set as null
+ * @param {number} idx
+ * @param {module:zrender/Element} [el]
+ */
+
+
+listProto.setItemGraphicEl = function (idx, el) {
+  var hostModel = this.hostModel;
+
+  if (el) {
+    // Add data index and series index for indexing the data by element
+    // Useful in tooltip
+    el.dataIndex = idx;
+    el.dataType = this.dataType;
+    el.seriesIndex = hostModel && hostModel.seriesIndex;
+
+    if (el.type === 'group') {
+      el.traverse(setItemDataAndSeriesIndex, el);
+    }
+  }
+
+  this._graphicEls[idx] = el;
+};
+/**
+ * @param {number} idx
+ * @return {module:zrender/Element}
+ */
+
+
+listProto.getItemGraphicEl = function (idx) {
+  return this._graphicEls[idx];
+};
+/**
+ * @param {Function} cb
+ * @param {*} context
+ */
+
+
+listProto.eachItemGraphicEl = function (cb, context) {
+  each$1(this._graphicEls, function (el, idx) {
+    if (el) {
+      cb && cb.call(context, el, idx);
+    }
+  });
+};
+/**
+ * Shallow clone a new list except visual and layout properties, and graph elements.
+ * New list only change the indices.
+ */
+
+
+listProto.cloneShallow = function (list) {
+  if (!list) {
+    var dimensionInfoList = map(this.dimensions, this.getDimensionInfo, this);
+    list = new List(dimensionInfoList, this.hostModel);
+  } // FIXME
+
+
+  list._storage = this._storage;
+  transferProperties(list, this); // Clone will not change the data extent and indices
+
+  if (this._indices) {
+    var Ctor = this._indices.constructor;
+    list._indices = new Ctor(this._indices);
+  } else {
+    list._indices = null;
+  }
+
+  list.getRawIndex = list._indices ? getRawIndexWithIndices : getRawIndexWithoutIndices;
+  return list;
+};
+/**
+ * Wrap some method to add more feature
+ * @param {string} methodName
+ * @param {Function} injectFunction
+ */
+
+
+listProto.wrapMethod = function (methodName, injectFunction) {
+  var originalMethod = this[methodName];
+
+  if (typeof originalMethod !== 'function') {
+    return;
+  }
+
+  this.__wrappedMethods = this.__wrappedMethods || [];
+
+  this.__wrappedMethods.push(methodName);
+
+  this[methodName] = function () {
+    var res = originalMethod.apply(this, arguments);
+    return injectFunction.apply(this, [res].concat(slice(arguments)));
+  };
+}; // Methods that create a new list based on this list should be listed here.
+// Notice that those method should `RETURN` the new list.
+
+
+listProto.TRANSFERABLE_METHODS = ['cloneShallow', 'downSample', 'map']; // Methods that change indices of this list should be listed here.
+
+listProto.CHANGABLE_METHODS = ['filterSelf', 'selectRange'];
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * @deprecated
+ * Use `echarts/data/helper/createDimensions` instead.
+ */
+/**
+ * @see {module:echarts/test/ut/spec/data/completeDimensions}
+ *
+ * Complete the dimensions array, by user defined `dimension` and `encode`,
+ * and guessing from the data structure.
+ * If no 'value' dimension specified, the first no-named dimension will be
+ * named as 'value'.
+ *
+ * @param {Array.<string>} sysDims Necessary dimensions, like ['x', 'y'], which
+ *      provides not only dim template, but also default order.
+ *      properties: 'name', 'type', 'displayName'.
+ *      `name` of each item provides default coord name.
+ *      [{dimsDef: [string|Object, ...]}, ...] dimsDef of sysDim item provides default dim name, and
+ *                                    provide dims count that the sysDim required.
+ *      [{ordinalMeta}] can be specified.
+ * @param {module:echarts/data/Source|Array|Object} source or data (for compatibal with pervious)
+ * @param {Object} [opt]
+ * @param {Array.<Object|string>} [opt.dimsDef] option.series.dimensions User defined dimensions
+ *      For example: ['asdf', {name, type}, ...].
+ * @param {Object|HashMap} [opt.encodeDef] option.series.encode {x: 2, y: [3, 1], tooltip: [1, 2], label: 3}
+ * @param {string} [opt.generateCoord] Generate coord dim with the given name.
+ *                 If not specified, extra dim names will be:
+ *                 'value', 'value0', 'value1', ...
+ * @param {number} [opt.generateCoordCount] By default, the generated dim name is `generateCoord`.
+ *                 If `generateCoordCount` specified, the generated dim names will be:
+ *                 `generateCoord` + 0, `generateCoord` + 1, ...
+ *                 can be Infinity, indicate that use all of the remain columns.
+ * @param {number} [opt.dimCount] If not specified, guess by the first data item.
+ * @param {number} [opt.encodeDefaulter] If not specified, auto find the next available data dim.
+ * @return {Array.<Object>} [{
+ *      name: string mandatory,
+ *      displayName: string, the origin name in dimsDef, see source helper.
+ *                 If displayName given, the tooltip will displayed vertically.
+ *      coordDim: string mandatory,
+ *      coordDimIndex: number mandatory,
+ *      type: string optional,
+ *      otherDims: { never null/undefined
+ *          tooltip: number optional,
+ *          label: number optional,
+ *          itemName: number optional,
+ *          seriesName: number optional,
+ *      },
+ *      isExtraCoord: boolean true if coord is generated
+ *          (not specified in encode and not series specified)
+ *      other props ...
+ * }]
+ */
+
+function completeDimensions(sysDims, source, opt) {
+  if (!Source.isInstance(source)) {
+    source = Source.seriesDataToSource(source);
+  }
+
+  opt = opt || {};
+  sysDims = (sysDims || []).slice();
+  var dimsDef = (opt.dimsDef || []).slice();
+  var encodeDef = createHashMap(opt.encodeDef);
+  var dataDimNameMap = createHashMap();
+  var coordDimNameMap = createHashMap(); // var valueCandidate;
+
+  var result = [];
+  var dimCount = getDimCount(source, sysDims, dimsDef, opt.dimCount); // Apply user defined dims (`name` and `type`) and init result.
+
+  for (var i = 0; i < dimCount; i++) {
+    var dimDefItem = dimsDef[i] = extend({}, isObject$1(dimsDef[i]) ? dimsDef[i] : {
+      name: dimsDef[i]
+    });
+    var userDimName = dimDefItem.name;
+    var resultItem = result[i] = {
+      otherDims: {}
+    }; // Name will be applied later for avoiding duplication.
+
+    if (userDimName != null && dataDimNameMap.get(userDimName) == null) {
+      // Only if `series.dimensions` is defined in option
+      // displayName, will be set, and dimension will be diplayed vertically in
+      // tooltip by default.
+      resultItem.name = resultItem.displayName = userDimName;
+      dataDimNameMap.set(userDimName, i);
+    }
+
+    dimDefItem.type != null && (resultItem.type = dimDefItem.type);
+    dimDefItem.displayName != null && (resultItem.displayName = dimDefItem.displayName);
+  } // Set `coordDim` and `coordDimIndex` by `encodeDef` and normalize `encodeDef`.
+
+
+  encodeDef.each(function (dataDims, coordDim) {
+    dataDims = normalizeToArray(dataDims).slice(); // Note: It is allowed that `dataDims.length` is `0`, e.g., options is
+    // `{encode: {x: -1, y: 1}}`. Should not filter anything in
+    // this case.
+
+    if (dataDims.length === 1 && dataDims[0] < 0) {
+      encodeDef.set(coordDim, false);
+      return;
+    }
+
+    var validDataDims = encodeDef.set(coordDim, []);
+    each$1(dataDims, function (resultDimIdx, idx) {
+      // The input resultDimIdx can be dim name or index.
+      isString(resultDimIdx) && (resultDimIdx = dataDimNameMap.get(resultDimIdx));
+
+      if (resultDimIdx != null && resultDimIdx < dimCount) {
+        validDataDims[idx] = resultDimIdx;
+        applyDim(result[resultDimIdx], coordDim, idx);
+      }
+    });
+  }); // Apply templetes and default order from `sysDims`.
+
+  var availDimIdx = 0;
+  each$1(sysDims, function (sysDimItem, sysDimIndex) {
+    var coordDim;
+    var sysDimItem;
+    var sysDimItemDimsDef;
+    var sysDimItemOtherDims;
+
+    if (isString(sysDimItem)) {
+      coordDim = sysDimItem;
+      sysDimItem = {};
+    } else {
+      coordDim = sysDimItem.name;
+      var ordinalMeta = sysDimItem.ordinalMeta;
+      sysDimItem.ordinalMeta = null;
+      sysDimItem = clone(sysDimItem);
+      sysDimItem.ordinalMeta = ordinalMeta; // `coordDimIndex` should not be set directly.
+
+      sysDimItemDimsDef = sysDimItem.dimsDef;
+      sysDimItemOtherDims = sysDimItem.otherDims;
+      sysDimItem.name = sysDimItem.coordDim = sysDimItem.coordDimIndex = sysDimItem.dimsDef = sysDimItem.otherDims = null;
+    }
+
+    var dataDims = encodeDef.get(coordDim); // negative resultDimIdx means no need to mapping.
+
+    if (dataDims === false) {
+      return;
+    }
+
+    var dataDims = normalizeToArray(dataDims); // dimensions provides default dim sequences.
+
+    if (!dataDims.length) {
+      for (var i = 0; i < (sysDimItemDimsDef && sysDimItemDimsDef.length || 1); i++) {
+        while (availDimIdx < result.length && result[availDimIdx].coordDim != null) {
+          availDimIdx++;
+        }
+
+        availDimIdx < result.length && dataDims.push(availDimIdx++);
+      }
+    } // Apply templates.
+
+
+    each$1(dataDims, function (resultDimIdx, coordDimIndex) {
+      var resultItem = result[resultDimIdx];
+      applyDim(defaults(resultItem, sysDimItem), coordDim, coordDimIndex);
+
+      if (resultItem.name == null && sysDimItemDimsDef) {
+        var sysDimItemDimsDefItem = sysDimItemDimsDef[coordDimIndex];
+        !isObject$1(sysDimItemDimsDefItem) && (sysDimItemDimsDefItem = {
+          name: sysDimItemDimsDefItem
+        });
+        resultItem.name = resultItem.displayName = sysDimItemDimsDefItem.name;
+        resultItem.defaultTooltip = sysDimItemDimsDefItem.defaultTooltip;
+      } // FIXME refactor, currently only used in case: {otherDims: {tooltip: false}}
+
+
+      sysDimItemOtherDims && defaults(resultItem.otherDims, sysDimItemOtherDims);
+    });
+  });
+
+  function applyDim(resultItem, coordDim, coordDimIndex) {
+    if (OTHER_DIMENSIONS.get(coordDim) != null) {
+      resultItem.otherDims[coordDim] = coordDimIndex;
+    } else {
+      resultItem.coordDim = coordDim;
+      resultItem.coordDimIndex = coordDimIndex;
+      coordDimNameMap.set(coordDim, true);
+    }
+  } // Make sure the first extra dim is 'value'.
+
+
+  var generateCoord = opt.generateCoord;
+  var generateCoordCount = opt.generateCoordCount;
+  var fromZero = generateCoordCount != null;
+  generateCoordCount = generateCoord ? generateCoordCount || 1 : 0;
+  var extra = generateCoord || 'value'; // Set dim `name` and other `coordDim` and other props.
+
+  for (var resultDimIdx = 0; resultDimIdx < dimCount; resultDimIdx++) {
+    var resultItem = result[resultDimIdx] = result[resultDimIdx] || {};
+    var coordDim = resultItem.coordDim;
+
+    if (coordDim == null) {
+      resultItem.coordDim = genName(extra, coordDimNameMap, fromZero);
+      resultItem.coordDimIndex = 0;
+
+      if (!generateCoord || generateCoordCount <= 0) {
+        resultItem.isExtraCoord = true;
+      }
+
+      generateCoordCount--;
+    }
+
+    resultItem.name == null && (resultItem.name = genName(resultItem.coordDim, dataDimNameMap));
+
+    if (resultItem.type == null && guessOrdinal(source, resultDimIdx, resultItem.name)) {
+      resultItem.type = 'ordinal';
+    }
+  }
+
+  return result;
+} // ??? TODO
+// Originally detect dimCount by data[0]. Should we
+// optimize it to only by sysDims and dimensions and encode.
+// So only necessary dims will be initialized.
+// But
+// (1) custom series should be considered. where other dims
+// may be visited.
+// (2) sometimes user need to calcualte bubble size or use visualMap
+// on other dimensions besides coordSys needed.
+// So, dims that is not used by system, should be shared in storage?
+
+
+function getDimCount(source, sysDims, dimsDef, optDimCount) {
+  // Note that the result dimCount should not small than columns count
+  // of data, otherwise `dataDimNameMap` checking will be incorrect.
+  var dimCount = Math.max(source.dimensionsDetectCount || 1, sysDims.length, dimsDef.length, optDimCount || 0);
+  each$1(sysDims, function (sysDimItem) {
+    var sysDimItemDimsDef = sysDimItem.dimsDef;
+    sysDimItemDimsDef && (dimCount = Math.max(dimCount, sysDimItemDimsDef.length));
+  });
+  return dimCount;
+}
+
+function genName(name, map$$1, fromZero) {
+  if (fromZero || map$$1.get(name) != null) {
+    var i = 0;
+
+    while (map$$1.get(name + i) != null) {
+      i++;
+    }
+
+    name += i;
+  }
+
+  map$$1.set(name, true);
+  return name;
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * Substitute `completeDimensions`.
+ * `completeDimensions` is to be deprecated.
+ */
+/**
+ * @param {module:echarts/data/Source|module:echarts/data/List} source or data.
+ * @param {Object|Array} [opt]
+ * @param {Array.<string|Object>} [opt.coordDimensions=[]]
+ * @param {number} [opt.dimensionsCount]
+ * @param {string} [opt.generateCoord]
+ * @param {string} [opt.generateCoordCount]
+ * @param {Array.<string|Object>} [opt.dimensionsDefine=source.dimensionsDefine] Overwrite source define.
+ * @param {Object|HashMap} [opt.encodeDefine=source.encodeDefine] Overwrite source define.
+ * @return {Array.<Object>} dimensionsInfo
+ */
+
+var createDimensions = function (source, opt) {
+  opt = opt || {};
+  return completeDimensions(opt.coordDimensions || [], source, {
+    dimsDef: opt.dimensionsDefine || source.dimensionsDefine,
+    encodeDef: opt.encodeDefine || source.encodeDefine,
+    dimCount: opt.dimensionsCount,
+    generateCoord: opt.generateCoord,
+    generateCoordCount: opt.generateCoordCount
+  });
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+/**
+ * Note that it is too complicated to support 3d stack by value
+ * (have to create two-dimension inverted index), so in 3d case
+ * we just support that stacked by index.
+ *
+ * @param {module:echarts/model/Series} seriesModel
+ * @param {Array.<string|Object>} dimensionInfoList The same as the input of <module:echarts/data/List>.
+ *        The input dimensionInfoList will be modified.
+ * @param {Object} [opt]
+ * @param {boolean} [opt.stackedCoordDimension=''] Specify a coord dimension if needed.
+ * @param {boolean} [opt.byIndex=false]
+ * @return {Object} calculationInfo
+ * {
+ *     stackedDimension: string
+ *     stackedByDimension: string
+ *     isStackedByIndex: boolean
+ *     stackedOverDimension: string
+ *     stackResultDimension: string
+ * }
+ */
+
+function enableDataStack(seriesModel, dimensionInfoList, opt) {
+  opt = opt || {};
+  var byIndex = opt.byIndex;
+  var stackedCoordDimension = opt.stackedCoordDimension; // Compatibal: when `stack` is set as '', do not stack.
+
+  var mayStack = !!(seriesModel && seriesModel.get('stack'));
+  var stackedByDimInfo;
+  var stackedDimInfo;
+  var stackResultDimension;
+  var stackedOverDimension;
+  each$1(dimensionInfoList, function (dimensionInfo, index) {
+    if (isString(dimensionInfo)) {
+      dimensionInfoList[index] = dimensionInfo = {
+        name: dimensionInfo
+      };
+    }
+
+    if (mayStack && !dimensionInfo.isExtraCoord) {
+      // Find the first ordinal dimension as the stackedByDimInfo.
+      if (!byIndex && !stackedByDimInfo && dimensionInfo.ordinalMeta) {
+        stackedByDimInfo = dimensionInfo;
+      } // Find the first stackable dimension as the stackedDimInfo.
+
+
+      if (!stackedDimInfo && dimensionInfo.type !== 'ordinal' && dimensionInfo.type !== 'time' && (!stackedCoordDimension || stackedCoordDimension === dimensionInfo.coordDim)) {
+        stackedDimInfo = dimensionInfo;
+      }
+    }
+  });
+
+  if (stackedDimInfo && !byIndex && !stackedByDimInfo) {
+    // Compatible with previous design, value axis (time axis) only stack by index.
+    // It may make sense if the user provides elaborately constructed data.
+    byIndex = true;
+  } // Add stack dimension, they can be both calculated by coordinate system in `unionExtent`.
+  // That put stack logic in List is for using conveniently in echarts extensions, but it
+  // might not be a good way.
+
+
+  if (stackedDimInfo) {
+    // Use a weird name that not duplicated with other names.
+    stackResultDimension = '__\0ecstackresult';
+    stackedOverDimension = '__\0ecstackedover'; // Create inverted index to fast query index by value.
+
+    if (stackedByDimInfo) {
+      stackedByDimInfo.createInvertedIndices = true;
+    }
+
+    var stackedDimCoordDim = stackedDimInfo.coordDim;
+    var stackedDimType = stackedDimInfo.type;
+    var stackedDimCoordIndex = 0;
+    each$1(dimensionInfoList, function (dimensionInfo) {
+      if (dimensionInfo.coordDim === stackedDimCoordDim) {
+        stackedDimCoordIndex++;
+      }
+    });
+    dimensionInfoList.push({
+      name: stackResultDimension,
+      coordDim: stackedDimCoordDim,
+      coordDimIndex: stackedDimCoordIndex,
+      type: stackedDimType,
+      isExtraCoord: true,
+      isCalculationCoord: true
+    });
+    stackedDimCoordIndex++;
+    dimensionInfoList.push({
+      name: stackedOverDimension,
+      // This dimension contains stack index (generally, 0), so do not set it as
+      // `stackedDimCoordDim` to avoid extent calculation, consider log scale.
+      coordDim: stackedOverDimension,
+      coordDimIndex: stackedDimCoordIndex,
+      type: stackedDimType,
+      isExtraCoord: true,
+      isCalculationCoord: true
+    });
+  }
+
+  return {
+    stackedDimension: stackedDimInfo && stackedDimInfo.name,
+    stackedByDimension: stackedByDimInfo && stackedByDimInfo.name,
+    isStackedByIndex: byIndex,
+    stackedOverDimension: stackedOverDimension,
+    stackResultDimension: stackResultDimension
+  };
+}
+/**
+ * @param {module:echarts/data/List} data
+ * @param {string} stackedDim
+ */
+
+function isDimensionStacked(data, stackedDim
+/*, stackedByDim*/
+) {
+  // Each single series only maps to one pair of axis. So we do not need to
+  // check stackByDim, whatever stacked by a dimension or stacked by index.
+  return !!stackedDim && stackedDim === data.getCalculationInfo('stackedDimension'); // && (
+  //     stackedByDim != null
+  //         ? stackedByDim === data.getCalculationInfo('stackedByDimension')
+  //         : data.getCalculationInfo('isStackedByIndex')
+  // );
+}
+/**
+ * @param {module:echarts/data/List} data
+ * @param {string} targetDim
+ * @param {string} [stackedByDim] If not input this parameter, check whether
+ *                                stacked by index.
+ * @return {string} dimension
+ */
+
+function getStackedDimension(data, targetDim) {
+  return isDimensionStacked(data, targetDim) ? data.getCalculationInfo('stackResultDimension') : targetDim;
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+/**
+ * @param {module:echarts/data/Source|Array} source Or raw data.
+ * @param {module:echarts/model/Series} seriesModel
+ * @param {Object} [opt]
+ * @param {string} [opt.generateCoord]
+ */
+
+function createListFromArray(source, seriesModel, opt) {
+  opt = opt || {};
+
+  if (!Source.isInstance(source)) {
+    source = Source.seriesDataToSource(source);
+  }
+
+  var coordSysName = seriesModel.get('coordinateSystem');
+  var registeredCoordSys = CoordinateSystemManager.get(coordSysName);
+  var coordSysDefine = getCoordSysDefineBySeries(seriesModel);
+  var coordSysDimDefs;
+
+  if (coordSysDefine) {
+    coordSysDimDefs = map(coordSysDefine.coordSysDims, function (dim) {
+      var dimInfo = {
+        name: dim
+      };
+      var axisModel = coordSysDefine.axisMap.get(dim);
+
+      if (axisModel) {
+        var axisType = axisModel.get('type');
+        dimInfo.type = getDimensionTypeByAxis(axisType); // dimInfo.stackable = isStackable(axisType);
+      }
+
+      return dimInfo;
+    });
+  }
+
+  if (!coordSysDimDefs) {
+    // Get dimensions from registered coordinate system
+    coordSysDimDefs = registeredCoordSys && (registeredCoordSys.getDimensionsInfo ? registeredCoordSys.getDimensionsInfo() : registeredCoordSys.dimensions.slice()) || ['x', 'y'];
+  }
+
+  var dimInfoList = createDimensions(source, {
+    coordDimensions: coordSysDimDefs,
+    generateCoord: opt.generateCoord
+  });
+  var firstCategoryDimIndex;
+  var hasNameEncode;
+  coordSysDefine && each$1(dimInfoList, function (dimInfo, dimIndex) {
+    var coordDim = dimInfo.coordDim;
+    var categoryAxisModel = coordSysDefine.categoryAxisMap.get(coordDim);
+
+    if (categoryAxisModel) {
+      if (firstCategoryDimIndex == null) {
+        firstCategoryDimIndex = dimIndex;
+      }
+
+      dimInfo.ordinalMeta = categoryAxisModel.getOrdinalMeta();
+    }
+
+    if (dimInfo.otherDims.itemName != null) {
+      hasNameEncode = true;
+    }
+  });
+
+  if (!hasNameEncode && firstCategoryDimIndex != null) {
+    dimInfoList[firstCategoryDimIndex].otherDims.itemName = 0;
+  }
+
+  var stackCalculationInfo = enableDataStack(seriesModel, dimInfoList);
+  var list = new List(dimInfoList, seriesModel);
+  list.setCalculationInfo(stackCalculationInfo);
+  var dimValueGetter = firstCategoryDimIndex != null && isNeedCompleteOrdinalData(source) ? function (itemOpt, dimName, dataIndex, dimIndex) {
+    // Use dataIndex as ordinal value in categoryAxis
+    return dimIndex === firstCategoryDimIndex ? dataIndex : this.defaultDimValueGetter(itemOpt, dimName, dataIndex, dimIndex);
+  } : null;
+  list.hasItemOption = false;
+  list.initData(source, null, dimValueGetter);
+  return list;
+}
+
+function isNeedCompleteOrdinalData(source) {
+  if (source.sourceFormat === SOURCE_FORMAT_ORIGINAL) {
+    var sampleItem = firstDataNotNull(source.data || []);
+    return sampleItem != null && !isArray(getDataItemValue(sampleItem));
+  }
+}
+
+function firstDataNotNull(data) {
+  var i = 0;
+
+  while (i < data.length && data[i] == null) {
+    i++;
+  }
+
+  return data[i];
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * // Scale class management
+ * @module echarts/scale/Scale
+ */
+/**
+ * @param {Object} [setting]
+ */
+
+function Scale(setting) {
+  this._setting = setting || {};
+  /**
+   * Extent
+   * @type {Array.<number>}
+   * @protected
+   */
+
+  this._extent = [Infinity, -Infinity];
+  /**
+   * Step is calculated in adjustExtent
+   * @type {Array.<number>}
+   * @protected
+   */
+
+  this._interval = 0;
+  this.init && this.init.apply(this, arguments);
+}
+/**
+ * Parse input val to valid inner number.
+ * @param {*} val
+ * @return {number}
+ */
+
+
+Scale.prototype.parse = function (val) {
+  // Notice: This would be a trap here, If the implementation
+  // of this method depends on extent, and this method is used
+  // before extent set (like in dataZoom), it would be wrong.
+  // Nevertheless, parse does not depend on extent generally.
+  return val;
+};
+
+Scale.prototype.getSetting = function (name) {
+  return this._setting[name];
+};
+
+Scale.prototype.contain = function (val) {
+  var extent = this._extent;
+  return val >= extent[0] && val <= extent[1];
+};
+/**
+ * Normalize value to linear [0, 1], return 0.5 if extent span is 0
+ * @param {number} val
+ * @return {number}
+ */
+
+
+Scale.prototype.normalize = function (val) {
+  var extent = this._extent;
+
+  if (extent[1] === extent[0]) {
+    return 0.5;
+  }
+
+  return (val - extent[0]) / (extent[1] - extent[0]);
+};
+/**
+ * Scale normalized value
+ * @param {number} val
+ * @return {number}
+ */
+
+
+Scale.prototype.scale = function (val) {
+  var extent = this._extent;
+  return val * (extent[1] - extent[0]) + extent[0];
+};
+/**
+ * Set extent from data
+ * @param {Array.<number>} other
+ */
+
+
+Scale.prototype.unionExtent = function (other) {
+  var extent = this._extent;
+  other[0] < extent[0] && (extent[0] = other[0]);
+  other[1] > extent[1] && (extent[1] = other[1]); // not setExtent because in log axis it may transformed to power
+  // this.setExtent(extent[0], extent[1]);
+};
+/**
+ * Set extent from data
+ * @param {module:echarts/data/List} data
+ * @param {string} dim
+ */
+
+
+Scale.prototype.unionExtentFromData = function (data, dim) {
+  this.unionExtent(data.getApproximateExtent(dim));
+};
+/**
+ * Get extent
+ * @return {Array.<number>}
+ */
+
+
+Scale.prototype.getExtent = function () {
+  return this._extent.slice();
+};
+/**
+ * Set extent
+ * @param {number} start
+ * @param {number} end
+ */
+
+
+Scale.prototype.setExtent = function (start, end) {
+  var thisExtent = this._extent;
+
+  if (!isNaN(start)) {
+    thisExtent[0] = start;
+  }
+
+  if (!isNaN(end)) {
+    thisExtent[1] = end;
+  }
+};
+/**
+ * When axis extent depends on data and no data exists,
+ * axis ticks should not be drawn, which is named 'blank'.
+ */
+
+
+Scale.prototype.isBlank = function () {
+  return this._isBlank;
+},
+/**
+ * When axis extent depends on data and no data exists,
+ * axis ticks should not be drawn, which is named 'blank'.
+ */
+Scale.prototype.setBlank = function (isBlank) {
+  this._isBlank = isBlank;
+};
+/**
+ * @abstract
+ * @param {*} tick
+ * @return {string} label of the tick.
+ */
+
+Scale.prototype.getLabel = null;
+enableClassExtend(Scale);
+enableClassManagement(Scale, {
+  registerWhenExtend: true
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+/**
+ * @constructor
+ * @param {Object} [opt]
+ * @param {Object} [opt.categories=[]]
+ * @param {Object} [opt.needCollect=false]
+ * @param {Object} [opt.deduplication=false]
+ */
+
+function OrdinalMeta(opt) {
+  /**
+   * @readOnly
+   * @type {Array.<string>}
+   */
+  this.categories = opt.categories || [];
+  /**
+   * @private
+   * @type {boolean}
+   */
+
+  this._needCollect = opt.needCollect;
+  /**
+   * @private
+   * @type {boolean}
+   */
+
+  this._deduplication = opt.deduplication;
+  /**
+   * @private
+   * @type {boolean}
+   */
+
+  this._map;
+}
+/**
+ * @param {module:echarts/model/Model} axisModel
+ * @return {module:echarts/data/OrdinalMeta}
+ */
+
+
+OrdinalMeta.createByAxisModel = function (axisModel) {
+  var option = axisModel.option;
+  var data = option.data;
+  var categories = data && map(data, getName);
+  return new OrdinalMeta({
+    categories: categories,
+    needCollect: !categories,
+    // deduplication is default in axis.
+    deduplication: option.dedplication !== false
+  });
+};
+
+var proto$1 = OrdinalMeta.prototype;
+/**
+ * @param {string} category
+ * @return {number} ordinal
+ */
+
+proto$1.getOrdinal = function (category) {
+  return getOrCreateMap(this).get(category);
+};
+/**
+ * @param {*} category
+ * @return {number} The ordinal. If not found, return NaN.
+ */
+
+
+proto$1.parseAndCollect = function (category) {
+  var index;
+  var needCollect = this._needCollect; // The value of category dim can be the index of the given category set.
+  // This feature is only supported when !needCollect, because we should
+  // consider a common case: a value is 2017, which is a number but is
+  // expected to be tread as a category. This case usually happen in dataset,
+  // where it happent to be no need of the index feature.
+
+  if (typeof category !== 'string' && !needCollect) {
+    return category;
+  } // Optimize for the scenario:
+  // category is ['2012-01-01', '2012-01-02', ...], where the input
+  // data has been ensured not duplicate and is large data.
+  // Notice, if a dataset dimension provide categroies, usually echarts
+  // should remove duplication except user tell echarts dont do that
+  // (set axis.deduplication = false), because echarts do not know whether
+  // the values in the category dimension has duplication (consider the
+  // parallel-aqi example)
+
+
+  if (needCollect && !this._deduplication) {
+    index = this.categories.length;
+    this.categories[index] = category;
+    return index;
+  }
+
+  var map$$1 = getOrCreateMap(this);
+  index = map$$1.get(category);
+
+  if (index == null) {
+    if (needCollect) {
+      index = this.categories.length;
+      this.categories[index] = category;
+      map$$1.set(category, index);
+    } else {
+      index = NaN;
+    }
+  }
+
+  return index;
+}; // Consider big data, do not create map until needed.
+
+
+function getOrCreateMap(ordinalMeta) {
+  return ordinalMeta._map || (ordinalMeta._map = createHashMap(ordinalMeta.categories));
+}
+
+function getName(obj) {
+  if (isObject$1(obj) && obj.value != null) {
+    return obj.value;
+  } else {
+    return obj + '';
+  }
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * Linear continuous scale
+ * @module echarts/coord/scale/Ordinal
+ *
+ * http://en.wikipedia.org/wiki/Level_of_measurement
+ */
+// FIXME only one data
+var scaleProto = Scale.prototype;
+var OrdinalScale = Scale.extend({
+  type: 'ordinal',
+
+  /**
+   * @param {module:echarts/data/OrdianlMeta|Array.<string>} ordinalMeta
+   */
+  init: function (ordinalMeta, extent) {
+    // Caution: Should not use instanceof, consider ec-extensions using
+    // import approach to get OrdinalMeta class.
+    if (!ordinalMeta || isArray(ordinalMeta)) {
+      ordinalMeta = new OrdinalMeta({
+        categories: ordinalMeta
+      });
+    }
+
+    this._ordinalMeta = ordinalMeta;
+    this._extent = extent || [0, ordinalMeta.categories.length - 1];
+  },
+  parse: function (val) {
+    return typeof val === 'string' ? this._ordinalMeta.getOrdinal(val) // val might be float.
+    : Math.round(val);
+  },
+  contain: function (rank) {
+    rank = this.parse(rank);
+    return scaleProto.contain.call(this, rank) && this._ordinalMeta.categories[rank] != null;
+  },
+
+  /**
+   * Normalize given rank or name to linear [0, 1]
+   * @param {number|string} [val]
+   * @return {number}
+   */
+  normalize: function (val) {
+    return scaleProto.normalize.call(this, this.parse(val));
+  },
+  scale: function (val) {
+    return Math.round(scaleProto.scale.call(this, val));
+  },
+
+  /**
+   * @return {Array}
+   */
+  getTicks: function () {
+    var ticks = [];
+    var extent = this._extent;
+    var rank = extent[0];
+
+    while (rank <= extent[1]) {
+      ticks.push(rank);
+      rank++;
+    }
+
+    return ticks;
+  },
+
+  /**
+   * Get item on rank n
+   * @param {number} n
+   * @return {string}
+   */
+  getLabel: function (n) {
+    if (!this.isBlank()) {
+      // Note that if no data, ordinalMeta.categories is an empty array.
+      return this._ordinalMeta.categories[n];
+    }
+  },
+
+  /**
+   * @return {number}
+   */
+  count: function () {
+    return this._extent[1] - this._extent[0] + 1;
+  },
+
+  /**
+   * @override
+   */
+  unionExtentFromData: function (data, dim) {
+    this.unionExtent(data.getApproximateExtent(dim));
+  },
+  getOrdinalMeta: function () {
+    return this._ordinalMeta;
+  },
+  niceTicks: noop,
+  niceExtent: noop
+});
+/**
+ * @return {module:echarts/scale/Time}
+ */
+
+OrdinalScale.create = function () {
+  return new OrdinalScale();
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * For testable.
+ */
+var roundNumber$1 = round$1;
+/**
+ * @param {Array.<number>} extent Both extent[0] and extent[1] should be valid number.
+ *                                Should be extent[0] < extent[1].
+ * @param {number} splitNumber splitNumber should be >= 1.
+ * @param {number} [minInterval]
+ * @param {number} [maxInterval]
+ * @return {Object} {interval, intervalPrecision, niceTickExtent}
+ */
+
+function intervalScaleNiceTicks(extent, splitNumber, minInterval, maxInterval) {
+  var result = {};
+  var span = extent[1] - extent[0];
+  var interval = result.interval = nice(span / splitNumber, true);
+
+  if (minInterval != null && interval < minInterval) {
+    interval = result.interval = minInterval;
+  }
+
+  if (maxInterval != null && interval > maxInterval) {
+    interval = result.interval = maxInterval;
+  } // Tow more digital for tick.
+
+
+  var precision = result.intervalPrecision = getIntervalPrecision(interval); // Niced extent inside original extent
+
+  var niceTickExtent = result.niceTickExtent = [roundNumber$1(Math.ceil(extent[0] / interval) * interval, precision), roundNumber$1(Math.floor(extent[1] / interval) * interval, precision)];
+  fixExtent(niceTickExtent, extent);
+  return result;
+}
+/**
+ * @param {number} interval
+ * @return {number} interval precision
+ */
+
+function getIntervalPrecision(interval) {
+  // Tow more digital for tick.
+  return getPrecisionSafe(interval) + 2;
+}
+
+function clamp(niceTickExtent, idx, extent) {
+  niceTickExtent[idx] = Math.max(Math.min(niceTickExtent[idx], extent[1]), extent[0]);
+} // In some cases (e.g., splitNumber is 1), niceTickExtent may be out of extent.
+
+
+function fixExtent(niceTickExtent, extent) {
+  !isFinite(niceTickExtent[0]) && (niceTickExtent[0] = extent[0]);
+  !isFinite(niceTickExtent[1]) && (niceTickExtent[1] = extent[1]);
+  clamp(niceTickExtent, 0, extent);
+  clamp(niceTickExtent, 1, extent);
+
+  if (niceTickExtent[0] > niceTickExtent[1]) {
+    niceTickExtent[0] = niceTickExtent[1];
+  }
+}
+function intervalScaleGetTicks(interval, extent, niceTickExtent, intervalPrecision) {
+  var ticks = []; // If interval is 0, return [];
+
+  if (!interval) {
+    return ticks;
+  } // Consider this case: using dataZoom toolbox, zoom and zoom.
+
+
+  var safeLimit = 10000;
+
+  if (extent[0] < niceTickExtent[0]) {
+    ticks.push(extent[0]);
+  }
+
+  var tick = niceTickExtent[0];
+
+  while (tick <= niceTickExtent[1]) {
+    ticks.push(tick); // Avoid rounding error
+
+    tick = roundNumber$1(tick + interval, intervalPrecision);
+
+    if (tick === ticks[ticks.length - 1]) {
+      // Consider out of safe float point, e.g.,
+      // -3711126.9907707 + 2e-10 === -3711126.9907707
+      break;
+    }
+
+    if (ticks.length > safeLimit) {
+      return [];
+    }
+  } // Consider this case: the last item of ticks is smaller
+  // than niceTickExtent[1] and niceTickExtent[1] === extent[1].
+
+
+  if (extent[1] > (ticks.length ? ticks[ticks.length - 1] : niceTickExtent[1])) {
+    ticks.push(extent[1]);
+  }
+
+  return ticks;
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * Interval scale
+ * @module echarts/scale/Interval
+ */
+var roundNumber = round$1;
+/**
+ * @alias module:echarts/coord/scale/Interval
+ * @constructor
+ */
+
+var IntervalScale = Scale.extend({
+  type: 'interval',
+  _interval: 0,
+  _intervalPrecision: 2,
+  setExtent: function (start, end) {
+    var thisExtent = this._extent; //start,end may be a Number like '25',so...
+
+    if (!isNaN(start)) {
+      thisExtent[0] = parseFloat(start);
+    }
+
+    if (!isNaN(end)) {
+      thisExtent[1] = parseFloat(end);
+    }
+  },
+  unionExtent: function (other) {
+    var extent = this._extent;
+    other[0] < extent[0] && (extent[0] = other[0]);
+    other[1] > extent[1] && (extent[1] = other[1]); // unionExtent may called by it's sub classes
+
+    IntervalScale.prototype.setExtent.call(this, extent[0], extent[1]);
+  },
+
+  /**
+   * Get interval
+   */
+  getInterval: function () {
+    return this._interval;
+  },
+
+  /**
+   * Set interval
+   */
+  setInterval: function (interval) {
+    this._interval = interval; // Dropped auto calculated niceExtent and use user setted extent
+    // We assume user wan't to set both interval, min, max to get a better result
+
+    this._niceExtent = this._extent.slice();
+    this._intervalPrecision = getIntervalPrecision(interval);
+  },
+
+  /**
+   * @return {Array.<number>}
+   */
+  getTicks: function () {
+    return intervalScaleGetTicks(this._interval, this._extent, this._niceExtent, this._intervalPrecision);
+  },
+
+  /**
+   * @param {number} data
+   * @param {Object} [opt]
+   * @param {number|string} [opt.precision] If 'auto', use nice presision.
+   * @param {boolean} [opt.pad] returns 1.50 but not 1.5 if precision is 2.
+   * @return {string}
+   */
+  getLabel: function (data, opt) {
+    if (data == null) {
+      return '';
+    }
+
+    var precision = opt && opt.precision;
+
+    if (precision == null) {
+      precision = getPrecisionSafe(data) || 0;
+    } else if (precision === 'auto') {
+      // Should be more precise then tick.
+      precision = this._intervalPrecision;
+    } // (1) If `precision` is set, 12.005 should be display as '12.00500'.
+    // (2) Use roundNumber (toFixed) to avoid scientific notation like '3.5e-7'.
+
+
+    data = roundNumber(data, precision, true);
+    return addCommas(data);
+  },
+
+  /**
+   * Update interval and extent of intervals for nice ticks
+   *
+   * @param {number} [splitNumber = 5] Desired number of ticks
+   * @param {number} [minInterval]
+   * @param {number} [maxInterval]
+   */
+  niceTicks: function (splitNumber, minInterval, maxInterval) {
+    splitNumber = splitNumber || 5;
+    var extent = this._extent;
+    var span = extent[1] - extent[0];
+
+    if (!isFinite(span)) {
+      return;
+    } // User may set axis min 0 and data are all negative
+    // FIXME If it needs to reverse ?
+
+
+    if (span < 0) {
+      span = -span;
+      extent.reverse();
+    }
+
+    var result = intervalScaleNiceTicks(extent, splitNumber, minInterval, maxInterval);
+    this._intervalPrecision = result.intervalPrecision;
+    this._interval = result.interval;
+    this._niceExtent = result.niceTickExtent;
+  },
+
+  /**
+   * Nice extent.
+   * @param {Object} opt
+   * @param {number} [opt.splitNumber = 5] Given approx tick number
+   * @param {boolean} [opt.fixMin=false]
+   * @param {boolean} [opt.fixMax=false]
+   * @param {boolean} [opt.minInterval]
+   * @param {boolean} [opt.maxInterval]
+   */
+  niceExtent: function (opt) {
+    var extent = this._extent; // If extent start and end are same, expand them
+
+    if (extent[0] === extent[1]) {
+      if (extent[0] !== 0) {
+        // Expand extent
+        var expandSize = extent[0]; // In the fowllowing case
+        //      Axis has been fixed max 100
+        //      Plus data are all 100 and axis extent are [100, 100].
+        // Extend to the both side will cause expanded max is larger than fixed max.
+        // So only expand to the smaller side.
+
+        if (!opt.fixMax) {
+          extent[1] += expandSize / 2;
+          extent[0] -= expandSize / 2;
+        } else {
+          extent[0] -= expandSize / 2;
+        }
+      } else {
+        extent[1] = 1;
+      }
+    }
+
+    var span = extent[1] - extent[0]; // If there are no data and extent are [Infinity, -Infinity]
+
+    if (!isFinite(span)) {
+      extent[0] = 0;
+      extent[1] = 1;
+    }
+
+    this.niceTicks(opt.splitNumber, opt.minInterval, opt.maxInterval); // var extent = this._extent;
+
+    var interval = this._interval;
+
+    if (!opt.fixMin) {
+      extent[0] = roundNumber(Math.floor(extent[0] / interval) * interval);
+    }
+
+    if (!opt.fixMax) {
+      extent[1] = roundNumber(Math.ceil(extent[1] / interval) * interval);
+    }
+  }
+});
+/**
+ * @return {module:echarts/scale/Time}
+ */
+
+IntervalScale.create = function () {
+  return new IntervalScale();
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/* global Float32Array */
+var STACK_PREFIX = '__ec_stack_';
+var LARGE_BAR_MIN_WIDTH = 0.5;
+var LargeArr = typeof Float32Array !== 'undefined' ? Float32Array : Array;
+
+function getSeriesStackId(seriesModel) {
+  return seriesModel.get('stack') || STACK_PREFIX + seriesModel.seriesIndex;
+}
+
+function getAxisKey(axis) {
+  return axis.dim + axis.index;
+}
+/**
+ * @param {Object} opt
+ * @param {module:echarts/coord/Axis} opt.axis Only support category axis currently.
+ * @param {number} opt.count Positive interger.
+ * @param {number} [opt.barWidth]
+ * @param {number} [opt.barMaxWidth]
+ * @param {number} [opt.barGap]
+ * @param {number} [opt.barCategoryGap]
+ * @return {Object} {width, offset, offsetCenter} If axis.type is not 'category', return undefined.
+ */
+
+
+function getLayoutOnAxis(opt) {
+  var params = [];
+  var baseAxis = opt.axis;
+  var axisKey = 'axis0';
+
+  if (baseAxis.type !== 'category') {
+    return;
+  }
+
+  var bandWidth = baseAxis.getBandWidth();
+
+  for (var i = 0; i < opt.count || 0; i++) {
+    params.push(defaults({
+      bandWidth: bandWidth,
+      axisKey: axisKey,
+      stackId: STACK_PREFIX + i
+    }, opt));
+  }
+
+  var widthAndOffsets = doCalBarWidthAndOffset(params);
+  var result = [];
+
+  for (var i = 0; i < opt.count; i++) {
+    var item = widthAndOffsets[axisKey][STACK_PREFIX + i];
+    item.offsetCenter = item.offset + item.width / 2;
+    result.push(item);
+  }
+
+  return result;
+}
+function prepareLayoutBarSeries(seriesType, ecModel) {
+  var seriesModels = [];
+  ecModel.eachSeriesByType(seriesType, function (seriesModel) {
+    // Check series coordinate, do layout for cartesian2d only
+    if (isOnCartesian(seriesModel) && !isInLargeMode(seriesModel)) {
+      seriesModels.push(seriesModel);
+    }
+  });
+  return seriesModels;
+}
+function makeColumnLayout(barSeries) {
+  var seriesInfoList = [];
+  each$1(barSeries, function (seriesModel) {
+    var data = seriesModel.getData();
+    var cartesian = seriesModel.coordinateSystem;
+    var baseAxis = cartesian.getBaseAxis();
+    var axisExtent = baseAxis.getExtent();
+    var bandWidth = baseAxis.type === 'category' ? baseAxis.getBandWidth() : Math.abs(axisExtent[1] - axisExtent[0]) / data.count();
+    var barWidth = parsePercent$1(seriesModel.get('barWidth'), bandWidth);
+    var barMaxWidth = parsePercent$1(seriesModel.get('barMaxWidth'), bandWidth);
+    var barGap = seriesModel.get('barGap');
+    var barCategoryGap = seriesModel.get('barCategoryGap');
+    seriesInfoList.push({
+      bandWidth: bandWidth,
+      barWidth: barWidth,
+      barMaxWidth: barMaxWidth,
+      barGap: barGap,
+      barCategoryGap: barCategoryGap,
+      axisKey: getAxisKey(baseAxis),
+      stackId: getSeriesStackId(seriesModel)
+    });
+  });
+  return doCalBarWidthAndOffset(seriesInfoList);
+}
+
+function doCalBarWidthAndOffset(seriesInfoList) {
+  // Columns info on each category axis. Key is cartesian name
+  var columnsMap = {};
+  each$1(seriesInfoList, function (seriesInfo, idx) {
+    var axisKey = seriesInfo.axisKey;
+    var bandWidth = seriesInfo.bandWidth;
+    var columnsOnAxis = columnsMap[axisKey] || {
+      bandWidth: bandWidth,
+      remainedWidth: bandWidth,
+      autoWidthCount: 0,
+      categoryGap: '20%',
+      gap: '30%',
+      stacks: {}
+    };
+    var stacks = columnsOnAxis.stacks;
+    columnsMap[axisKey] = columnsOnAxis;
+    var stackId = seriesInfo.stackId;
+
+    if (!stacks[stackId]) {
+      columnsOnAxis.autoWidthCount++;
+    }
+
+    stacks[stackId] = stacks[stackId] || {
+      width: 0,
+      maxWidth: 0
+    }; // Caution: In a single coordinate system, these barGrid attributes
+    // will be shared by series. Consider that they have default values,
+    // only the attributes set on the last series will work.
+    // Do not change this fact unless there will be a break change.
+    // TODO
+
+    var barWidth = seriesInfo.barWidth;
+
+    if (barWidth && !stacks[stackId].width) {
+      // See #6312, do not restrict width.
+      stacks[stackId].width = barWidth;
+      barWidth = Math.min(columnsOnAxis.remainedWidth, barWidth);
+      columnsOnAxis.remainedWidth -= barWidth;
+    }
+
+    var barMaxWidth = seriesInfo.barMaxWidth;
+    barMaxWidth && (stacks[stackId].maxWidth = barMaxWidth);
+    var barGap = seriesInfo.barGap;
+    barGap != null && (columnsOnAxis.gap = barGap);
+    var barCategoryGap = seriesInfo.barCategoryGap;
+    barCategoryGap != null && (columnsOnAxis.categoryGap = barCategoryGap);
+  });
+  var result = {};
+  each$1(columnsMap, function (columnsOnAxis, coordSysName) {
+    result[coordSysName] = {};
+    var stacks = columnsOnAxis.stacks;
+    var bandWidth = columnsOnAxis.bandWidth;
+    var categoryGap = parsePercent$1(columnsOnAxis.categoryGap, bandWidth);
+    var barGapPercent = parsePercent$1(columnsOnAxis.gap, 1);
+    var remainedWidth = columnsOnAxis.remainedWidth;
+    var autoWidthCount = columnsOnAxis.autoWidthCount;
+    var autoWidth = (remainedWidth - categoryGap) / (autoWidthCount + (autoWidthCount - 1) * barGapPercent);
+    autoWidth = Math.max(autoWidth, 0); // Find if any auto calculated bar exceeded maxBarWidth
+
+    each$1(stacks, function (column, stack) {
+      var maxWidth = column.maxWidth;
+
+      if (maxWidth && maxWidth < autoWidth) {
+        maxWidth = Math.min(maxWidth, remainedWidth);
+
+        if (column.width) {
+          maxWidth = Math.min(maxWidth, column.width);
+        }
+
+        remainedWidth -= maxWidth;
+        column.width = maxWidth;
+        autoWidthCount--;
+      }
+    }); // Recalculate width again
+
+    autoWidth = (remainedWidth - categoryGap) / (autoWidthCount + (autoWidthCount - 1) * barGapPercent);
+    autoWidth = Math.max(autoWidth, 0);
+    var widthSum = 0;
+    var lastColumn;
+    each$1(stacks, function (column, idx) {
+      if (!column.width) {
+        column.width = autoWidth;
+      }
+
+      lastColumn = column;
+      widthSum += column.width * (1 + barGapPercent);
+    });
+
+    if (lastColumn) {
+      widthSum -= lastColumn.width * barGapPercent;
+    }
+
+    var offset = -widthSum / 2;
+    each$1(stacks, function (column, stackId) {
+      result[coordSysName][stackId] = result[coordSysName][stackId] || {
+        offset: offset,
+        width: column.width
+      };
+      offset += column.width * (1 + barGapPercent);
+    });
+  });
+  return result;
+}
+/**
+ * @param {Object} barWidthAndOffset The result of makeColumnLayout
+ * @param {module:echarts/coord/Axis} axis
+ * @param {module:echarts/model/Series} [seriesModel] If not provided, return all.
+ * @return {Object} {stackId: {offset, width}} or {offset, width} if seriesModel provided.
+ */
+
+
+function retrieveColumnLayout(barWidthAndOffset, axis, seriesModel) {
+  if (barWidthAndOffset && axis) {
+    var result = barWidthAndOffset[getAxisKey(axis)];
+
+    if (result != null && seriesModel != null) {
+      result = result[getSeriesStackId(seriesModel)];
+    }
+
+    return result;
+  }
+}
+/**
+ * @param {string} seriesType
+ * @param {module:echarts/model/Global} ecModel
+ */
+
+function layout(seriesType, ecModel) {
+  var seriesModels = prepareLayoutBarSeries(seriesType, ecModel);
+  var barWidthAndOffset = makeColumnLayout(seriesModels);
+  var lastStackCoords = {};
+  each$1(seriesModels, function (seriesModel) {
+    var data = seriesModel.getData();
+    var cartesian = seriesModel.coordinateSystem;
+    var baseAxis = cartesian.getBaseAxis();
+    var stackId = getSeriesStackId(seriesModel);
+    var columnLayoutInfo = barWidthAndOffset[getAxisKey(baseAxis)][stackId];
+    var columnOffset = columnLayoutInfo.offset;
+    var columnWidth = columnLayoutInfo.width;
+    var valueAxis = cartesian.getOtherAxis(baseAxis);
+    var barMinHeight = seriesModel.get('barMinHeight') || 0;
+    lastStackCoords[stackId] = lastStackCoords[stackId] || [];
+    data.setLayout({
+      offset: columnOffset,
+      size: columnWidth
+    });
+    var valueDim = data.mapDimension(valueAxis.dim);
+    var baseDim = data.mapDimension(baseAxis.dim);
+    var stacked = isDimensionStacked(data, valueDim
+    /*, baseDim*/
+    );
+    var isValueAxisH = valueAxis.isHorizontal();
+    var valueAxisStart = getValueAxisStart(baseAxis, valueAxis, stacked);
+
+    for (var idx = 0, len = data.count(); idx < len; idx++) {
+      var value = data.get(valueDim, idx);
+      var baseValue = data.get(baseDim, idx);
+
+      if (isNaN(value)) {
+        continue;
+      }
+
+      var sign = value >= 0 ? 'p' : 'n';
+      var baseCoord = valueAxisStart; // Because of the barMinHeight, we can not use the value in
+      // stackResultDimension directly.
+
+      if (stacked) {
+        // Only ordinal axis can be stacked.
+        if (!lastStackCoords[stackId][baseValue]) {
+          lastStackCoords[stackId][baseValue] = {
+            p: valueAxisStart,
+            // Positive stack
+            n: valueAxisStart // Negative stack
+
+          };
+        } // Should also consider #4243
+
+
+        baseCoord = lastStackCoords[stackId][baseValue][sign];
+      }
+
+      var x;
+      var y;
+      var width;
+      var height;
+
+      if (isValueAxisH) {
+        var coord = cartesian.dataToPoint([value, baseValue]);
+        x = baseCoord;
+        y = coord[1] + columnOffset;
+        width = coord[0] - valueAxisStart;
+        height = columnWidth;
+
+        if (Math.abs(width) < barMinHeight) {
+          width = (width < 0 ? -1 : 1) * barMinHeight;
+        }
+
+        stacked && (lastStackCoords[stackId][baseValue][sign] += width);
+      } else {
+        var coord = cartesian.dataToPoint([baseValue, value]);
+        x = coord[0] + columnOffset;
+        y = baseCoord;
+        width = columnWidth;
+        height = coord[1] - valueAxisStart;
+
+        if (Math.abs(height) < barMinHeight) {
+          // Include zero to has a positive bar
+          height = (height <= 0 ? -1 : 1) * barMinHeight;
+        }
+
+        stacked && (lastStackCoords[stackId][baseValue][sign] += height);
+      }
+
+      data.setItemLayout(idx, {
+        x: x,
+        y: y,
+        width: width,
+        height: height
+      });
+    }
+  }, this);
+} // TODO: Do not support stack in large mode yet.
+
+var largeLayout = {
+  seriesType: 'bar',
+  plan: createRenderPlanner(),
+  reset: function (seriesModel) {
+    if (!isOnCartesian(seriesModel) || !isInLargeMode(seriesModel)) {
+      return;
+    }
+
+    var data = seriesModel.getData();
+    var cartesian = seriesModel.coordinateSystem;
+    var baseAxis = cartesian.getBaseAxis();
+    var valueAxis = cartesian.getOtherAxis(baseAxis);
+    var valueDim = data.mapDimension(valueAxis.dim);
+    var baseDim = data.mapDimension(baseAxis.dim);
+    var valueAxisHorizontal = valueAxis.isHorizontal();
+    var valueDimIdx = valueAxisHorizontal ? 0 : 1;
+    var barWidth = retrieveColumnLayout(makeColumnLayout([seriesModel]), baseAxis, seriesModel).width;
+
+    if (!(barWidth > LARGE_BAR_MIN_WIDTH)) {
+      // jshint ignore:line
+      barWidth = LARGE_BAR_MIN_WIDTH;
+    }
+
+    return {
+      progress: progress
+    };
+
+    function progress(params, data) {
+      var largePoints = new LargeArr(params.count * 2);
+      var dataIndex;
+      var coord = [];
+      var valuePair = [];
+      var offset = 0;
+
+      while ((dataIndex = params.next()) != null) {
+        valuePair[valueDimIdx] = data.get(valueDim, dataIndex);
+        valuePair[1 - valueDimIdx] = data.get(baseDim, dataIndex);
+        coord = cartesian.dataToPoint(valuePair, null, coord);
+        largePoints[offset++] = coord[0];
+        largePoints[offset++] = coord[1];
+      }
+
+      data.setLayout({
+        largePoints: largePoints,
+        barWidth: barWidth,
+        valueAxisStart: getValueAxisStart(baseAxis, valueAxis, false),
+        valueAxisHorizontal: valueAxisHorizontal
+      });
+    }
+  }
+};
+
+function isOnCartesian(seriesModel) {
+  return seriesModel.coordinateSystem && seriesModel.coordinateSystem.type === 'cartesian2d';
+}
+
+function isInLargeMode(seriesModel) {
+  return seriesModel.pipelineContext && seriesModel.pipelineContext.large;
+} // See cases in `test/bar-start.html` and `#7412`, `#8747`.
+
+
+function getValueAxisStart(baseAxis, valueAxis, stacked) {
+  var extent = valueAxis.getGlobalExtent();
+  var min;
+  var max;
+
+  if (extent[0] > extent[1]) {
+    min = extent[1];
+    max = extent[0];
+  } else {
+    min = extent[0];
+    max = extent[1];
+  }
+
+  var valueStart = valueAxis.toGlobalCoord(valueAxis.dataToCoord(0));
+  valueStart < min && (valueStart = min);
+  valueStart > max && (valueStart = max);
+  return valueStart;
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/*
+* The `scaleLevels` references to d3.js. The use of the source
+* code of this file is also subject to the terms and consitions
+* of its license (BSD-3Clause, see <echarts/src/licenses/LICENSE-d3>).
+*/
+// [About UTC and local time zone]:
+// In most cases, `number.parseDate` will treat input data string as local time
+// (except time zone is specified in time string). And `format.formateTime` returns
+// local time by default. option.useUTC is false by default. This design have
+// concidered these common case:
+// (1) Time that is persistent in server is in UTC, but it is needed to be diplayed
+// in local time by default.
+// (2) By default, the input data string (e.g., '2011-01-02') should be displayed
+// as its original time, without any time difference.
+var intervalScaleProto = IntervalScale.prototype;
+var mathCeil = Math.ceil;
+var mathFloor = Math.floor;
+var ONE_SECOND = 1000;
+var ONE_MINUTE = ONE_SECOND * 60;
+var ONE_HOUR = ONE_MINUTE * 60;
+var ONE_DAY = ONE_HOUR * 24; // FIXME 鍏敤锛�
+
+var bisect = function (a, x, lo, hi) {
+  while (lo < hi) {
+    var mid = lo + hi >>> 1;
+
+    if (a[mid][1] < x) {
+      lo = mid + 1;
+    } else {
+      hi = mid;
+    }
+  }
+
+  return lo;
+};
+/**
+ * @alias module:echarts/coord/scale/Time
+ * @constructor
+ */
+
+
+var TimeScale = IntervalScale.extend({
+  type: 'time',
+
+  /**
+   * @override
+   */
+  getLabel: function (val) {
+    var stepLvl = this._stepLvl;
+    var date = new Date(val);
+    return formatTime(stepLvl[0], date, this.getSetting('useUTC'));
+  },
+
+  /**
+   * @override
+   */
+  niceExtent: function (opt) {
+    var extent = this._extent; // If extent start and end are same, expand them
+
+    if (extent[0] === extent[1]) {
+      // Expand extent
+      extent[0] -= ONE_DAY;
+      extent[1] += ONE_DAY;
+    } // If there are no data and extent are [Infinity, -Infinity]
+
+
+    if (extent[1] === -Infinity && extent[0] === Infinity) {
+      var d = new Date();
+      extent[1] = +new Date(d.getFullYear(), d.getMonth(), d.getDate());
+      extent[0] = extent[1] - ONE_DAY;
+    }
+
+    this.niceTicks(opt.splitNumber, opt.minInterval, opt.maxInterval); // var extent = this._extent;
+
+    var interval = this._interval;
+
+    if (!opt.fixMin) {
+      extent[0] = round$1(mathFloor(extent[0] / interval) * interval);
+    }
+
+    if (!opt.fixMax) {
+      extent[1] = round$1(mathCeil(extent[1] / interval) * interval);
+    }
+  },
+
+  /**
+   * @override
+   */
+  niceTicks: function (approxTickNum, minInterval, maxInterval) {
+    approxTickNum = approxTickNum || 10;
+    var extent = this._extent;
+    var span = extent[1] - extent[0];
+    var approxInterval = span / approxTickNum;
+
+    if (minInterval != null && approxInterval < minInterval) {
+      approxInterval = minInterval;
+    }
+
+    if (maxInterval != null && approxInterval > maxInterval) {
+      approxInterval = maxInterval;
+    }
+
+    var scaleLevelsLen = scaleLevels.length;
+    var idx = bisect(scaleLevels, approxInterval, 0, scaleLevelsLen);
+    var level = scaleLevels[Math.min(idx, scaleLevelsLen - 1)];
+    var interval = level[1]; // Same with interval scale if span is much larger than 1 year
+
+    if (level[0] === 'year') {
+      var yearSpan = span / interval; // From "Nice Numbers for Graph Labels" of Graphic Gems
+      // var niceYearSpan = numberUtil.nice(yearSpan, false);
+
+      var yearStep = nice(yearSpan / approxTickNum, true);
+      interval *= yearStep;
+    }
+
+    var timezoneOffset = this.getSetting('useUTC') ? 0 : new Date(+extent[0] || +extent[1]).getTimezoneOffset() * 60 * 1000;
+    var niceExtent = [Math.round(mathCeil((extent[0] - timezoneOffset) / interval) * interval + timezoneOffset), Math.round(mathFloor((extent[1] - timezoneOffset) / interval) * interval + timezoneOffset)];
+    fixExtent(niceExtent, extent);
+    this._stepLvl = level; // Interval will be used in getTicks
+
+    this._interval = interval;
+    this._niceExtent = niceExtent;
+  },
+  parse: function (val) {
+    // val might be float.
+    return +parseDate(val);
+  }
+});
+each$1(['contain', 'normalize'], function (methodName) {
+  TimeScale.prototype[methodName] = function (val) {
+    return intervalScaleProto[methodName].call(this, this.parse(val));
+  };
+}); // Steps from d3, see the license statement at the top of this file.
+
+var scaleLevels = [// Format              interval
+['hh:mm:ss', ONE_SECOND], // 1s
+['hh:mm:ss', ONE_SECOND * 5], // 5s
+['hh:mm:ss', ONE_SECOND * 10], // 10s
+['hh:mm:ss', ONE_SECOND * 15], // 15s
+['hh:mm:ss', ONE_SECOND * 30], // 30s
+['hh:mm\nMM-dd', ONE_MINUTE], // 1m
+['hh:mm\nMM-dd', ONE_MINUTE * 5], // 5m
+['hh:mm\nMM-dd', ONE_MINUTE * 10], // 10m
+['hh:mm\nMM-dd', ONE_MINUTE * 15], // 15m
+['hh:mm\nMM-dd', ONE_MINUTE * 30], // 30m
+['hh:mm\nMM-dd', ONE_HOUR], // 1h
+['hh:mm\nMM-dd', ONE_HOUR * 2], // 2h
+['hh:mm\nMM-dd', ONE_HOUR * 6], // 6h
+['hh:mm\nMM-dd', ONE_HOUR * 12], // 12h
+['MM-dd\nyyyy', ONE_DAY], // 1d
+['MM-dd\nyyyy', ONE_DAY * 2], // 2d
+['MM-dd\nyyyy', ONE_DAY * 3], // 3d
+['MM-dd\nyyyy', ONE_DAY * 4], // 4d
+['MM-dd\nyyyy', ONE_DAY * 5], // 5d
+['MM-dd\nyyyy', ONE_DAY * 6], // 6d
+['week', ONE_DAY * 7], // 7d
+['MM-dd\nyyyy', ONE_DAY * 10], // 10d
+['week', ONE_DAY * 14], // 2w
+['week', ONE_DAY * 21], // 3w
+['month', ONE_DAY * 31], // 1M
+['week', ONE_DAY * 42], // 6w
+['month', ONE_DAY * 62], // 2M
+['week', ONE_DAY * 70], // 10w
+['quarter', ONE_DAY * 95], // 3M
+['month', ONE_DAY * 31 * 4], // 4M
+['month', ONE_DAY * 31 * 5], // 5M
+['half-year', ONE_DAY * 380 / 2], // 6M
+['month', ONE_DAY * 31 * 8], // 8M
+['month', ONE_DAY * 31 * 10], // 10M
+['year', ONE_DAY * 380] // 1Y
+];
+/**
+ * @param {module:echarts/model/Model}
+ * @return {module:echarts/scale/Time}
+ */
+
+TimeScale.create = function (model) {
+  return new TimeScale({
+    useUTC: model.ecModel.get('useUTC')
+  });
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * Log scale
+ * @module echarts/scale/Log
+ */
+var scaleProto$1 = Scale.prototype;
+var intervalScaleProto$1 = IntervalScale.prototype;
+var getPrecisionSafe$1 = getPrecisionSafe;
+var roundingErrorFix = round$1;
+var mathFloor$1 = Math.floor;
+var mathCeil$1 = Math.ceil;
+var mathPow$1 = Math.pow;
+var mathLog = Math.log;
+var LogScale = Scale.extend({
+  type: 'log',
+  base: 10,
+  $constructor: function () {
+    Scale.apply(this, arguments);
+    this._originalScale = new IntervalScale();
+  },
+
+  /**
+   * @return {Array.<number>}
+   */
+  getTicks: function () {
+    var originalScale = this._originalScale;
+    var extent = this._extent;
+    var originalExtent = originalScale.getExtent();
+    return map(intervalScaleProto$1.getTicks.call(this), function (val) {
+      var powVal = round$1(mathPow$1(this.base, val)); // Fix #4158
+
+      powVal = val === extent[0] && originalScale.__fixMin ? fixRoundingError(powVal, originalExtent[0]) : powVal;
+      powVal = val === extent[1] && originalScale.__fixMax ? fixRoundingError(powVal, originalExtent[1]) : powVal;
+      return powVal;
+    }, this);
+  },
+
+  /**
+   * @param {number} val
+   * @return {string}
+   */
+  getLabel: intervalScaleProto$1.getLabel,
+
+  /**
+   * @param  {number} val
+   * @return {number}
+   */
+  scale: function (val) {
+    val = scaleProto$1.scale.call(this, val);
+    return mathPow$1(this.base, val);
+  },
+
+  /**
+   * @param {number} start
+   * @param {number} end
+   */
+  setExtent: function (start, end) {
+    var base = this.base;
+    start = mathLog(start) / mathLog(base);
+    end = mathLog(end) / mathLog(base);
+    intervalScaleProto$1.setExtent.call(this, start, end);
+  },
+
+  /**
+   * @return {number} end
+   */
+  getExtent: function () {
+    var base = this.base;
+    var extent = scaleProto$1.getExtent.call(this);
+    extent[0] = mathPow$1(base, extent[0]);
+    extent[1] = mathPow$1(base, extent[1]); // Fix #4158
+
+    var originalScale = this._originalScale;
+    var originalExtent = originalScale.getExtent();
+    originalScale.__fixMin && (extent[0] = fixRoundingError(extent[0], originalExtent[0]));
+    originalScale.__fixMax && (extent[1] = fixRoundingError(extent[1], originalExtent[1]));
+    return extent;
+  },
+
+  /**
+   * @param  {Array.<number>} extent
+   */
+  unionExtent: function (extent) {
+    this._originalScale.unionExtent(extent);
+
+    var base = this.base;
+    extent[0] = mathLog(extent[0]) / mathLog(base);
+    extent[1] = mathLog(extent[1]) / mathLog(base);
+    scaleProto$1.unionExtent.call(this, extent);
+  },
+
+  /**
+   * @override
+   */
+  unionExtentFromData: function (data, dim) {
+    // TODO
+    // filter value that <= 0
+    this.unionExtent(data.getApproximateExtent(dim));
+  },
+
+  /**
+   * Update interval and extent of intervals for nice ticks
+   * @param  {number} [approxTickNum = 10] Given approx tick number
+   */
+  niceTicks: function (approxTickNum) {
+    approxTickNum = approxTickNum || 10;
+    var extent = this._extent;
+    var span = extent[1] - extent[0];
+
+    if (span === Infinity || span <= 0) {
+      return;
+    }
+
+    var interval = quantity(span);
+    var err = approxTickNum / span * interval; // Filter ticks to get closer to the desired count.
+
+    if (err <= 0.5) {
+      interval *= 10;
+    } // Interval should be integer
+
+
+    while (!isNaN(interval) && Math.abs(interval) < 1 && Math.abs(interval) > 0) {
+      interval *= 10;
+    }
+
+    var niceExtent = [round$1(mathCeil$1(extent[0] / interval) * interval), round$1(mathFloor$1(extent[1] / interval) * interval)];
+    this._interval = interval;
+    this._niceExtent = niceExtent;
+  },
+
+  /**
+   * Nice extent.
+   * @override
+   */
+  niceExtent: function (opt) {
+    intervalScaleProto$1.niceExtent.call(this, opt);
+    var originalScale = this._originalScale;
+    originalScale.__fixMin = opt.fixMin;
+    originalScale.__fixMax = opt.fixMax;
+  }
+});
+each$1(['contain', 'normalize'], function (methodName) {
+  LogScale.prototype[methodName] = function (val) {
+    val = mathLog(val) / mathLog(this.base);
+    return scaleProto$1[methodName].call(this, val);
+  };
+});
+
+LogScale.create = function () {
+  return new LogScale();
+};
+
+function fixRoundingError(val, originalVal) {
+  return roundingErrorFix(val, getPrecisionSafe$1(originalVal));
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+/**
+ * Get axis scale extent before niced.
+ * Item of returned array can only be number (including Infinity and NaN).
+ */
+
+function getScaleExtent(scale, model) {
+  var scaleType = scale.type;
+  var min = model.getMin();
+  var max = model.getMax();
+  var fixMin = min != null;
+  var fixMax = max != null;
+  var originalExtent = scale.getExtent();
+  var axisDataLen;
+  var boundaryGap;
+  var span;
+
+  if (scaleType === 'ordinal') {
+    axisDataLen = model.getCategories().length;
+  } else {
+    boundaryGap = model.get('boundaryGap');
+
+    if (!isArray(boundaryGap)) {
+      boundaryGap = [boundaryGap || 0, boundaryGap || 0];
+    }
+
+    if (typeof boundaryGap[0] === 'boolean') {
+      boundaryGap = [0, 0];
+    }
+
+    boundaryGap[0] = parsePercent$1(boundaryGap[0], 1);
+    boundaryGap[1] = parsePercent$1(boundaryGap[1], 1);
+    span = originalExtent[1] - originalExtent[0] || Math.abs(originalExtent[0]);
+  } // Notice: When min/max is not set (that is, when there are null/undefined,
+  // which is the most common case), these cases should be ensured:
+  // (1) For 'ordinal', show all axis.data.
+  // (2) For others:
+  //      + `boundaryGap` is applied (if min/max set, boundaryGap is
+  //      disabled).
+  //      + If `needCrossZero`, min/max should be zero, otherwise, min/max should
+  //      be the result that originalExtent enlarged by boundaryGap.
+  // (3) If no data, it should be ensured that `scale.setBlank` is set.
+  // FIXME
+  // (1) When min/max is 'dataMin' or 'dataMax', should boundaryGap be able to used?
+  // (2) When `needCrossZero` and all data is positive/negative, should it be ensured
+  // that the results processed by boundaryGap are positive/negative?
+
+
+  if (min == null) {
+    min = scaleType === 'ordinal' ? axisDataLen ? 0 : NaN : originalExtent[0] - boundaryGap[0] * span;
+  }
+
+  if (max == null) {
+    max = scaleType === 'ordinal' ? axisDataLen ? axisDataLen - 1 : NaN : originalExtent[1] + boundaryGap[1] * span;
+  }
+
+  if (min === 'dataMin') {
+    min = originalExtent[0];
+  } else if (typeof min === 'function') {
+    min = min({
+      min: originalExtent[0],
+      max: originalExtent[1]
+    });
+  }
+
+  if (max === 'dataMax') {
+    max = originalExtent[1];
+  } else if (typeof max === 'function') {
+    max = max({
+      min: originalExtent[0],
+      max: originalExtent[1]
+    });
+  }
+
+  (min == null || !isFinite(min)) && (min = NaN);
+  (max == null || !isFinite(max)) && (max = NaN);
+  scale.setBlank(eqNaN(min) || eqNaN(max) || scaleType === 'ordinal' && !scale.getOrdinalMeta().categories.length); // Evaluate if axis needs cross zero
+
+  if (model.getNeedCrossZero()) {
+    // Axis is over zero and min is not set
+    if (min > 0 && max > 0 && !fixMin) {
+      min = 0;
+    } // Axis is under zero and max is not set
+
+
+    if (min < 0 && max < 0 && !fixMax) {
+      max = 0;
+    }
+  } // If bars are placed on a index axis of type time or interval account for axis boundary overflow and current axis
+  // is index axis
+  // FIXME
+  // (1) Consider support value axis, where below zero and axis `onZero` should be handled properly.
+  // (2) Refactor the logic with `barGrid`. Is it not need to `makeBarWidthAndOffsetInfo` twice with different extent?
+  //     Should not depend on series type `bar`?
+  // (3) Fix that might overlap when using dataZoom.
+  // (4) Consider other chart types using `barGrid`?
+  // See #6728, #4862, `test/bar-overflow-time-plot.html`
+
+
+  var ecModel = model.ecModel;
+
+  if (ecModel && scaleType === 'time'
+  /*|| scaleType === 'interval' */
+  ) {
+    var barSeriesModels = prepareLayoutBarSeries('bar', ecModel);
+    var isBaseAxisAndHasBarSeries;
+    each$1(barSeriesModels, function (seriesModel) {
+      isBaseAxisAndHasBarSeries |= seriesModel.getBaseAxis() === model.axis;
+    });
+
+    if (isBaseAxisAndHasBarSeries) {
+      // Calculate placement of bars on axis
+      var barWidthAndOffset = makeColumnLayout(barSeriesModels); // Adjust axis min and max to account for overflow
+
+      var adjustedScale = adjustScaleForOverflow(min, max, model, barWidthAndOffset);
+      min = adjustedScale.min;
+      max = adjustedScale.max;
+    }
+  }
+
+  return [min, max];
+}
+
+function adjustScaleForOverflow(min, max, model, barWidthAndOffset) {
+  // Get Axis Length
+  var axisExtent = model.axis.getExtent();
+  var axisLength = axisExtent[1] - axisExtent[0]; // Get bars on current index axis and calculate min and max overflow
+
+  var barsOnCurrentAxis = retrieveColumnLayout(barWidthAndOffset, model.axis);
+
+  if (barsOnCurrentAxis === undefined) {
+    return {
+      min: min,
+      max: max
+    };
+  }
+
+  var minOverflow = Infinity;
+  each$1(barsOnCurrentAxis, function (item) {
+    minOverflow = Math.min(item.offset, minOverflow);
+  });
+  var maxOverflow = -Infinity;
+  each$1(barsOnCurrentAxis, function (item) {
+    maxOverflow = Math.max(item.offset + item.width, maxOverflow);
+  });
+  minOverflow = Math.abs(minOverflow);
+  maxOverflow = Math.abs(maxOverflow);
+  var totalOverFlow = minOverflow + maxOverflow; // Calulate required buffer based on old range and overflow
+
+  var oldRange = max - min;
+  var oldRangePercentOfNew = 1 - (minOverflow + maxOverflow) / axisLength;
+  var overflowBuffer = oldRange / oldRangePercentOfNew - oldRange;
+  max += overflowBuffer * (maxOverflow / totalOverFlow);
+  min -= overflowBuffer * (minOverflow / totalOverFlow);
+  return {
+    min: min,
+    max: max
+  };
+}
+
+function niceScaleExtent(scale, model) {
+  var extent = getScaleExtent(scale, model);
+  var fixMin = model.getMin() != null;
+  var fixMax = model.getMax() != null;
+  var splitNumber = model.get('splitNumber');
+
+  if (scale.type === 'log') {
+    scale.base = model.get('logBase');
+  }
+
+  var scaleType = scale.type;
+  scale.setExtent(extent[0], extent[1]);
+  scale.niceExtent({
+    splitNumber: splitNumber,
+    fixMin: fixMin,
+    fixMax: fixMax,
+    minInterval: scaleType === 'interval' || scaleType === 'time' ? model.get('minInterval') : null,
+    maxInterval: scaleType === 'interval' || scaleType === 'time' ? model.get('maxInterval') : null
+  }); // If some one specified the min, max. And the default calculated interval
+  // is not good enough. He can specify the interval. It is often appeared
+  // in angle axis with angle 0 - 360. Interval calculated in interval scale is hard
+  // to be 60.
+  // FIXME
+
+  var interval = model.get('interval');
+
+  if (interval != null) {
+    scale.setInterval && scale.setInterval(interval);
+  }
+}
+/**
+ * @param {module:echarts/model/Model} model
+ * @param {string} [axisType] Default retrieve from model.type
+ * @return {module:echarts/scale/*}
+ */
+
+function createScaleByModel(model, axisType) {
+  axisType = axisType || model.get('type');
+
+  if (axisType) {
+    switch (axisType) {
+      // Buildin scale
+      case 'category':
+        return new OrdinalScale(model.getOrdinalMeta ? model.getOrdinalMeta() : model.getCategories(), [Infinity, -Infinity]);
+
+      case 'value':
+        return new IntervalScale();
+      // Extended scale, like time and log
+
+      default:
+        return (Scale.getClass(axisType) || IntervalScale).create(model);
+    }
+  }
+}
+/**
+ * Check if the axis corss 0
+ */
+
+function ifAxisCrossZero(axis) {
+  var dataExtent = axis.scale.getExtent();
+  var min = dataExtent[0];
+  var max = dataExtent[1];
+  return !(min > 0 && max > 0 || min < 0 && max < 0);
+}
+/**
+ * @param {module:echarts/coord/Axis} axis
+ * @return {Function} Label formatter function.
+ *         param: {number} tickValue,
+ *         param: {number} idx, the index in all ticks.
+ *                         If category axis, this param is not requied.
+ *         return: {string} label string.
+ */
+
+function makeLabelFormatter(axis) {
+  var labelFormatter = axis.getLabelModel().get('formatter');
+  var categoryTickStart = axis.type === 'category' ? axis.scale.getExtent()[0] : null;
+
+  if (typeof labelFormatter === 'string') {
+    labelFormatter = function (tpl) {
+      return function (val) {
+        // For category axis, get raw value; for numeric axis,
+        // get foramtted label like '1,333,444'.
+        val = axis.scale.getLabel(val);
+        return tpl.replace('{value}', val != null ? val : '');
+      };
+    }(labelFormatter); // Consider empty array
+
+
+    return labelFormatter;
+  } else if (typeof labelFormatter === 'function') {
+    return function (tickValue, idx) {
+      // The original intention of `idx` is "the index of the tick in all ticks".
+      // But the previous implementation of category axis do not consider the
+      // `axisLabel.interval`, which cause that, for example, the `interval` is
+      // `1`, then the ticks "name5", "name7", "name9" are displayed, where the
+      // corresponding `idx` are `0`, `2`, `4`, but not `0`, `1`, `2`. So we keep
+      // the definition here for back compatibility.
+      if (categoryTickStart != null) {
+        idx = tickValue - categoryTickStart;
+      }
+
+      return labelFormatter(getAxisRawValue(axis, tickValue), idx);
+    };
+  } else {
+    return function (tick) {
+      return axis.scale.getLabel(tick);
+    };
+  }
+}
+function getAxisRawValue(axis, value) {
+  // In category axis with data zoom, tick is not the original
+  // index of axis.data. So tick should not be exposed to user
+  // in category axis.
+  return axis.type === 'category' ? axis.scale.getLabel(value) : value;
+}
+/**
+ * @param {module:echarts/coord/Axis} axis
+ * @return {module:zrender/core/BoundingRect} Be null/undefined if no labels.
+ */
+
+function estimateLabelUnionRect(axis) {
+  var axisModel = axis.model;
+  var scale = axis.scale;
+
+  if (!axisModel.get('axisLabel.show') || scale.isBlank()) {
+    return;
+  }
+
+  var isCategory = axis.type === 'category';
+  var realNumberScaleTicks;
+  var tickCount;
+  var categoryScaleExtent = scale.getExtent(); // Optimize for large category data, avoid call `getTicks()`.
+
+  if (isCategory) {
+    tickCount = scale.count();
+  } else {
+    realNumberScaleTicks = scale.getTicks();
+    tickCount = realNumberScaleTicks.length;
+  }
+
+  var axisLabelModel = axis.getLabelModel();
+  var labelFormatter = makeLabelFormatter(axis);
+  var rect;
+  var step = 1; // Simple optimization for large amount of labels
+
+  if (tickCount > 40) {
+    step = Math.ceil(tickCount / 40);
+  }
+
+  for (var i = 0; i < tickCount; i += step) {
+    var tickValue = realNumberScaleTicks ? realNumberScaleTicks[i] : categoryScaleExtent[0] + i;
+    var label = labelFormatter(tickValue);
+    var unrotatedSingleRect = axisLabelModel.getTextRect(label);
+    var singleRect = rotateTextRect(unrotatedSingleRect, axisLabelModel.get('rotate') || 0);
+    rect ? rect.union(singleRect) : rect = singleRect;
+  }
+
+  return rect;
+}
+
+function rotateTextRect(textRect, rotate) {
+  var rotateRadians = rotate * Math.PI / 180;
+  var boundingBox = textRect.plain();
+  var beforeWidth = boundingBox.width;
+  var beforeHeight = boundingBox.height;
+  var afterWidth = beforeWidth * Math.cos(rotateRadians) + beforeHeight * Math.sin(rotateRadians);
+  var afterHeight = beforeWidth * Math.sin(rotateRadians) + beforeHeight * Math.cos(rotateRadians);
+  var rotatedRect = new BoundingRect(boundingBox.x, boundingBox.y, afterWidth, afterHeight);
+  return rotatedRect;
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var axisModelCommonMixin = {
+  /**
+   * @param {boolean} origin
+   * @return {number|string} min value or 'dataMin' or null/undefined (means auto) or NaN
+   */
+  getMin: function (origin) {
+    var option = this.option;
+    var min = !origin && option.rangeStart != null ? option.rangeStart : option.min;
+
+    if (this.axis && min != null && min !== 'dataMin' && typeof min !== 'function' && !eqNaN(min)) {
+      min = this.axis.scale.parse(min);
+    }
+
+    return min;
+  },
+
+  /**
+   * @param {boolean} origin
+   * @return {number|string} max value or 'dataMax' or null/undefined (means auto) or NaN
+   */
+  getMax: function (origin) {
+    var option = this.option;
+    var max = !origin && option.rangeEnd != null ? option.rangeEnd : option.max;
+
+    if (this.axis && max != null && max !== 'dataMax' && typeof max !== 'function' && !eqNaN(max)) {
+      max = this.axis.scale.parse(max);
+    }
+
+    return max;
+  },
+
+  /**
+   * @return {boolean}
+   */
+  getNeedCrossZero: function () {
+    var option = this.option;
+    return option.rangeStart != null || option.rangeEnd != null ? false : !option.scale;
+  },
+
+  /**
+   * Should be implemented by each axis model if necessary.
+   * @return {module:echarts/model/Component} coordinate system model
+   */
+  getCoordSysModel: noop,
+
+  /**
+   * @param {number} rangeStart Can only be finite number or null/undefined or NaN.
+   * @param {number} rangeEnd Can only be finite number or null/undefined or NaN.
+   */
+  setRange: function (rangeStart, rangeEnd) {
+    this.option.rangeStart = rangeStart;
+    this.option.rangeEnd = rangeEnd;
+  },
+
+  /**
+   * Reset range
+   */
+  resetRange: function () {
+    // rangeStart and rangeEnd is readonly.
+    this.option.rangeStart = this.option.rangeEnd = null;
+  }
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+// Symbol factory
+/**
+ * Triangle shape
+ * @inner
+ */
+
+var Triangle = extendShape({
+  type: 'triangle',
+  shape: {
+    cx: 0,
+    cy: 0,
+    width: 0,
+    height: 0
+  },
+  buildPath: function (path, shape) {
+    var cx = shape.cx;
+    var cy = shape.cy;
+    var width = shape.width / 2;
+    var height = shape.height / 2;
+    path.moveTo(cx, cy - height);
+    path.lineTo(cx + width, cy + height);
+    path.lineTo(cx - width, cy + height);
+    path.closePath();
+  }
+});
+/**
+ * Diamond shape
+ * @inner
+ */
+
+var Diamond = extendShape({
+  type: 'diamond',
+  shape: {
+    cx: 0,
+    cy: 0,
+    width: 0,
+    height: 0
+  },
+  buildPath: function (path, shape) {
+    var cx = shape.cx;
+    var cy = shape.cy;
+    var width = shape.width / 2;
+    var height = shape.height / 2;
+    path.moveTo(cx, cy - height);
+    path.lineTo(cx + width, cy);
+    path.lineTo(cx, cy + height);
+    path.lineTo(cx - width, cy);
+    path.closePath();
+  }
+});
+/**
+ * Pin shape
+ * @inner
+ */
+
+var Pin = extendShape({
+  type: 'pin',
+  shape: {
+    // x, y on the cusp
+    x: 0,
+    y: 0,
+    width: 0,
+    height: 0
+  },
+  buildPath: function (path, shape) {
+    var x = shape.x;
+    var y = shape.y;
+    var w = shape.width / 5 * 3; // Height must be larger than width
+
+    var h = Math.max(w, shape.height);
+    var r = w / 2; // Dist on y with tangent point and circle center
+
+    var dy = r * r / (h - r);
+    var cy = y - h + r + dy;
+    var angle = Math.asin(dy / r); // Dist on x with tangent point and circle center
+
+    var dx = Math.cos(angle) * r;
+    var tanX = Math.sin(angle);
+    var tanY = Math.cos(angle);
+    var cpLen = r * 0.6;
+    var cpLen2 = r * 0.7;
+    path.moveTo(x - dx, cy + dy);
+    path.arc(x, cy, r, Math.PI - angle, Math.PI * 2 + angle);
+    path.bezierCurveTo(x + dx - tanX * cpLen, cy + dy + tanY * cpLen, x, y - cpLen2, x, y);
+    path.bezierCurveTo(x, y - cpLen2, x - dx + tanX * cpLen, cy + dy + tanY * cpLen, x - dx, cy + dy);
+    path.closePath();
+  }
+});
+/**
+ * Arrow shape
+ * @inner
+ */
+
+var Arrow = extendShape({
+  type: 'arrow',
+  shape: {
+    x: 0,
+    y: 0,
+    width: 0,
+    height: 0
+  },
+  buildPath: function (ctx, shape) {
+    var height = shape.height;
+    var width = shape.width;
+    var x = shape.x;
+    var y = shape.y;
+    var dx = width / 3 * 2;
+    ctx.moveTo(x, y);
+    ctx.lineTo(x + dx, y + height);
+    ctx.lineTo(x, y + height / 4 * 3);
+    ctx.lineTo(x - dx, y + height);
+    ctx.lineTo(x, y);
+    ctx.closePath();
+  }
+});
+/**
+ * Map of path contructors
+ * @type {Object.<string, module:zrender/graphic/Path>}
+ */
+
+var symbolCtors = {
+  line: Line,
+  rect: Rect,
+  roundRect: Rect,
+  square: Rect,
+  circle: Circle,
+  diamond: Diamond,
+  pin: Pin,
+  arrow: Arrow,
+  triangle: Triangle
+};
+var symbolShapeMakers = {
+  line: function (x, y, w, h, shape) {
+    // FIXME
+    shape.x1 = x;
+    shape.y1 = y + h / 2;
+    shape.x2 = x + w;
+    shape.y2 = y + h / 2;
+  },
+  rect: function (x, y, w, h, shape) {
+    shape.x = x;
+    shape.y = y;
+    shape.width = w;
+    shape.height = h;
+  },
+  roundRect: function (x, y, w, h, shape) {
+    shape.x = x;
+    shape.y = y;
+    shape.width = w;
+    shape.height = h;
+    shape.r = Math.min(w, h) / 4;
+  },
+  square: function (x, y, w, h, shape) {
+    var size = Math.min(w, h);
+    shape.x = x;
+    shape.y = y;
+    shape.width = size;
+    shape.height = size;
+  },
+  circle: function (x, y, w, h, shape) {
+    // Put circle in the center of square
+    shape.cx = x + w / 2;
+    shape.cy = y + h / 2;
+    shape.r = Math.min(w, h) / 2;
+  },
+  diamond: function (x, y, w, h, shape) {
+    shape.cx = x + w / 2;
+    shape.cy = y + h / 2;
+    shape.width = w;
+    shape.height = h;
+  },
+  pin: function (x, y, w, h, shape) {
+    shape.x = x + w / 2;
+    shape.y = y + h / 2;
+    shape.width = w;
+    shape.height = h;
+  },
+  arrow: function (x, y, w, h, shape) {
+    shape.x = x + w / 2;
+    shape.y = y + h / 2;
+    shape.width = w;
+    shape.height = h;
+  },
+  triangle: function (x, y, w, h, shape) {
+    shape.cx = x + w / 2;
+    shape.cy = y + h / 2;
+    shape.width = w;
+    shape.height = h;
+  }
+};
+var symbolBuildProxies = {};
+each$1(symbolCtors, function (Ctor, name) {
+  symbolBuildProxies[name] = new Ctor();
+});
+var SymbolClz = extendShape({
+  type: 'symbol',
+  shape: {
+    symbolType: '',
+    x: 0,
+    y: 0,
+    width: 0,
+    height: 0
+  },
+  beforeBrush: function () {
+    var style = this.style;
+    var shape = this.shape; // FIXME
+
+    if (shape.symbolType === 'pin' && style.textPosition === 'inside') {
+      style.textPosition = ['50%', '40%'];
+      style.textAlign = 'center';
+      style.textVerticalAlign = 'middle';
+    }
+  },
+  buildPath: function (ctx, shape, inBundle) {
+    var symbolType = shape.symbolType;
+    var proxySymbol = symbolBuildProxies[symbolType];
+
+    if (shape.symbolType !== 'none') {
+      if (!proxySymbol) {
+        // Default rect
+        symbolType = 'rect';
+        proxySymbol = symbolBuildProxies[symbolType];
+      }
+
+      symbolShapeMakers[symbolType](shape.x, shape.y, shape.width, shape.height, proxySymbol.shape);
+      proxySymbol.buildPath(ctx, proxySymbol.shape, inBundle);
+    }
+  }
+}); // Provide setColor helper method to avoid determine if set the fill or stroke outside
+
+function symbolPathSetColor(color, innerColor) {
+  if (this.type !== 'image') {
+    var symbolStyle = this.style;
+    var symbolShape = this.shape;
+
+    if (symbolShape && symbolShape.symbolType === 'line') {
+      symbolStyle.stroke = color;
+    } else if (this.__isEmptyBrush) {
+      symbolStyle.stroke = color;
+      symbolStyle.fill = innerColor || '#fff';
+    } else {
+      // FIXME 鍒ゆ柇鍥惧舰榛樿鏄~鍏呰繕鏄弿杈癸紝浣跨敤 onlyStroke ?
+      symbolStyle.fill && (symbolStyle.fill = color);
+      symbolStyle.stroke && (symbolStyle.stroke = color);
+    }
+
+    this.dirty(false);
+  }
+}
+/**
+ * Create a symbol element with given symbol configuration: shape, x, y, width, height, color
+ * @param {string} symbolType
+ * @param {number} x
+ * @param {number} y
+ * @param {number} w
+ * @param {number} h
+ * @param {string} color
+ * @param {boolean} [keepAspect=false] whether to keep the ratio of w/h,
+ *                            for path and image only.
+ */
+
+
+function createSymbol(symbolType, x, y, w, h, color, keepAspect) {
+  // TODO Support image object, DynamicImage.
+  var isEmpty = symbolType.indexOf('empty') === 0;
+
+  if (isEmpty) {
+    symbolType = symbolType.substr(5, 1).toLowerCase() + symbolType.substr(6);
+  }
+
+  var symbolPath;
+
+  if (symbolType.indexOf('image://') === 0) {
+    symbolPath = makeImage(symbolType.slice(8), new BoundingRect(x, y, w, h), keepAspect ? 'center' : 'cover');
+  } else if (symbolType.indexOf('path://') === 0) {
+    symbolPath = makePath(symbolType.slice(7), {}, new BoundingRect(x, y, w, h), keepAspect ? 'center' : 'cover');
+  } else {
+    symbolPath = new SymbolClz({
+      shape: {
+        symbolType: symbolType,
+        x: x,
+        y: y,
+        width: w,
+        height: h
+      }
+    });
+  }
+
+  symbolPath.__isEmptyBrush = isEmpty;
+  symbolPath.setColor = symbolPathSetColor;
+  symbolPath.setColor(color);
+  return symbolPath;
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+/**
+ * Create a muti dimension List structure from seriesModel.
+ * @param  {module:echarts/model/Model} seriesModel
+ * @return {module:echarts/data/List} list
+ */
+
+function createList(seriesModel) {
+  return createListFromArray(seriesModel.getSource(), seriesModel);
+} // export function createGraph(seriesModel) {
+var dataStack$1 = {
+  isDimensionStacked: isDimensionStacked,
+  enableDataStack: enableDataStack,
+  getStackedDimension: getStackedDimension
+};
+/**
+ * Create scale
+ * @param {Array.<number>} dataExtent
+ * @param {Object|module:echarts/Model} option
+ */
+
+function createScale(dataExtent, option) {
+  var axisModel = option;
+
+  if (!Model.isInstance(option)) {
+    axisModel = new Model(option);
+    mixin(axisModel, axisModelCommonMixin);
+  }
+
+  var scale = createScaleByModel(axisModel);
+  scale.setExtent(dataExtent[0], dataExtent[1]);
+  niceScaleExtent(scale, axisModel);
+  return scale;
+}
+/**
+ * Mixin common methods to axis model,
+ *
+ * Inlcude methods
+ * `getFormattedLabels() => Array.<string>`
+ * `getCategories() => Array.<string>`
+ * `getMin(origin: boolean) => number`
+ * `getMax(origin: boolean) => number`
+ * `getNeedCrossZero() => boolean`
+ * `setRange(start: number, end: number)`
+ * `resetRange()`
+ */
+
+function mixinAxisModelCommonMethods(Model$$1) {
+  mixin(Model$$1, axisModelCommonMixin);
+}
+
+var helper = (Object.freeze || Object)({
+	createList: createList,
+	getLayoutRect: getLayoutRect,
+	dataStack: dataStack$1,
+	createScale: createScale,
+	mixinAxisModelCommonMethods: mixinAxisModelCommonMethods,
+	completeDimensions: completeDimensions,
+	createDimensions: createDimensions,
+	createSymbol: createSymbol
+});
+
+var EPSILON$3 = 1e-8;
+
+function isAroundEqual$1(a, b) {
+  return Math.abs(a - b) < EPSILON$3;
+}
+
+function contain$1(points, x, y) {
+  var w = 0;
+  var p = points[0];
+
+  if (!p) {
+    return false;
+  }
+
+  for (var i = 1; i < points.length; i++) {
+    var p2 = points[i];
+    w += windingLine(p[0], p[1], p2[0], p2[1], x, y);
+    p = p2;
+  } // Close polygon
+
+
+  var p0 = points[0];
+
+  if (!isAroundEqual$1(p[0], p0[0]) || !isAroundEqual$1(p[1], p0[1])) {
+    w += windingLine(p[0], p[1], p0[0], p0[1], x, y);
+  }
+
+  return w !== 0;
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * @module echarts/coord/geo/Region
+ */
+/**
+ * @param {string|Region} name
+ * @param {Array} geometries
+ * @param {Array.<number>} cp
+ */
+
+function Region(name, geometries, cp) {
+  /**
+   * @type {string}
+   * @readOnly
+   */
+  this.name = name;
+  /**
+   * @type {Array.<Array>}
+   * @readOnly
+   */
+
+  this.geometries = geometries;
+
+  if (!cp) {
+    var rect = this.getBoundingRect();
+    cp = [rect.x + rect.width / 2, rect.y + rect.height / 2];
+  } else {
+    cp = [cp[0], cp[1]];
+  }
+  /**
+   * @type {Array.<number>}
+   */
+
+
+  this.center = cp;
+}
+
+Region.prototype = {
+  constructor: Region,
+  properties: null,
+
+  /**
+   * @return {module:zrender/core/BoundingRect}
+   */
+  getBoundingRect: function () {
+    var rect = this._rect;
+
+    if (rect) {
+      return rect;
+    }
+
+    var MAX_NUMBER = Number.MAX_VALUE;
+    var min$$1 = [MAX_NUMBER, MAX_NUMBER];
+    var max$$1 = [-MAX_NUMBER, -MAX_NUMBER];
+    var min2 = [];
+    var max2 = [];
+    var geometries = this.geometries;
+
+    for (var i = 0; i < geometries.length; i++) {
+      // Only support polygon
+      if (geometries[i].type !== 'polygon') {
+        continue;
+      } // Doesn't consider hole
+
+
+      var exterior = geometries[i].exterior;
+      fromPoints(exterior, min2, max2);
+      min(min$$1, min$$1, min2);
+      max(max$$1, max$$1, max2);
+    } // No data
+
+
+    if (i === 0) {
+      min$$1[0] = min$$1[1] = max$$1[0] = max$$1[1] = 0;
+    }
+
+    return this._rect = new BoundingRect(min$$1[0], min$$1[1], max$$1[0] - min$$1[0], max$$1[1] - min$$1[1]);
+  },
+
+  /**
+   * @param {<Array.<number>} coord
+   * @return {boolean}
+   */
+  contain: function (coord) {
+    var rect = this.getBoundingRect();
+    var geometries = this.geometries;
+
+    if (!rect.contain(coord[0], coord[1])) {
+      return false;
+    }
+
+    loopGeo: for (var i = 0, len$$1 = geometries.length; i < len$$1; i++) {
+      // Only support polygon.
+      if (geometries[i].type !== 'polygon') {
+        continue;
+      }
+
+      var exterior = geometries[i].exterior;
+      var interiors = geometries[i].interiors;
+
+      if (contain$1(exterior, coord[0], coord[1])) {
+        // Not in the region if point is in the hole.
+        for (var k = 0; k < (interiors ? interiors.length : 0); k++) {
+          if (contain$1(interiors[k])) {
+            continue loopGeo;
+          }
+        }
+
+        return true;
+      }
+    }
+
+    return false;
+  },
+  transformTo: function (x, y, width, height) {
+    var rect = this.getBoundingRect();
+    var aspect = rect.width / rect.height;
+
+    if (!width) {
+      width = aspect * height;
+    } else if (!height) {
+      height = width / aspect;
+    }
+
+    var target = new BoundingRect(x, y, width, height);
+    var transform = rect.calculateTransform(target);
+    var geometries = this.geometries;
+
+    for (var i = 0; i < geometries.length; i++) {
+      // Only support polygon.
+      if (geometries[i].type !== 'polygon') {
+        continue;
+      }
+
+      var exterior = geometries[i].exterior;
+      var interiors = geometries[i].interiors;
+
+      for (var p = 0; p < exterior.length; p++) {
+        applyTransform(exterior[p], exterior[p], transform);
+      }
+
+      for (var h = 0; h < (interiors ? interiors.length : 0); h++) {
+        for (var p = 0; p < interiors[h].length; p++) {
+          applyTransform(interiors[h][p], interiors[h][p], transform);
+        }
+      }
+    }
+
+    rect = this._rect;
+    rect.copy(target); // Update center
+
+    this.center = [rect.x + rect.width / 2, rect.y + rect.height / 2];
+  },
+  cloneShallow: function (name) {
+    name == null && (name = this.name);
+    var newRegion = new Region(name, this.geometries, this.center);
+    newRegion._rect = this._rect;
+    newRegion.transformTo = null; // Simply avoid to be called.
+
+    return newRegion;
+  }
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * Parse and decode geo json
+ * @module echarts/coord/geo/parseGeoJson
+ */
+function decode(json) {
+  if (!json.UTF8Encoding) {
+    return json;
+  }
+
+  var encodeScale = json.UTF8Scale;
+
+  if (encodeScale == null) {
+    encodeScale = 1024;
+  }
+
+  var features = json.features;
+
+  for (var f = 0; f < features.length; f++) {
+    var feature = features[f];
+    var geometry = feature.geometry;
+    var coordinates = geometry.coordinates;
+    var encodeOffsets = geometry.encodeOffsets;
+
+    for (var c = 0; c < coordinates.length; c++) {
+      var coordinate = coordinates[c];
+
+      if (geometry.type === 'Polygon') {
+        coordinates[c] = decodePolygon(coordinate, encodeOffsets[c], encodeScale);
+      } else if (geometry.type === 'MultiPolygon') {
+        for (var c2 = 0; c2 < coordinate.length; c2++) {
+          var polygon = coordinate[c2];
+          coordinate[c2] = decodePolygon(polygon, encodeOffsets[c][c2], encodeScale);
+        }
+      }
+    }
+  } // Has been decoded
+
+
+  json.UTF8Encoding = false;
+  return json;
+}
+
+function decodePolygon(coordinate, encodeOffsets, encodeScale) {
+  var result = [];
+  var prevX = encodeOffsets[0];
+  var prevY = encodeOffsets[1];
+
+  for (var i = 0; i < coordinate.length; i += 2) {
+    var x = coordinate.charCodeAt(i) - 64;
+    var y = coordinate.charCodeAt(i + 1) - 64; // ZigZag decoding
+
+    x = x >> 1 ^ -(x & 1);
+    y = y >> 1 ^ -(y & 1); // Delta deocding
+
+    x += prevX;
+    y += prevY;
+    prevX = x;
+    prevY = y; // Dequantize
+
+    result.push([x / encodeScale, y / encodeScale]);
+  }
+
+  return result;
+}
+/**
+ * @alias module:echarts/coord/geo/parseGeoJson
+ * @param {Object} geoJson
+ * @return {module:zrender/container/Group}
+ */
+
+
+var parseGeoJson$1 = function (geoJson) {
+  decode(geoJson);
+  return map(filter(geoJson.features, function (featureObj) {
+    // Output of mapshaper may have geometry null
+    return featureObj.geometry && featureObj.properties && featureObj.geometry.coordinates.length > 0;
+  }), function (featureObj) {
+    var properties = featureObj.properties;
+    var geo = featureObj.geometry;
+    var coordinates = geo.coordinates;
+    var geometries = [];
+
+    if (geo.type === 'Polygon') {
+      geometries.push({
+        type: 'polygon',
+        // According to the GeoJSON specification.
+        // First must be exterior, and the rest are all interior(holes).
+        exterior: coordinates[0],
+        interiors: coordinates.slice(1)
+      });
+    }
+
+    if (geo.type === 'MultiPolygon') {
+      each$1(coordinates, function (item) {
+        if (item[0]) {
+          geometries.push({
+            type: 'polygon',
+            exterior: item[0],
+            interiors: item.slice(1)
+          });
+        }
+      });
+    }
+
+    var region = new Region(properties.name, geometries, properties.cp);
+    region.properties = properties;
+    return region;
+  });
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var inner$6 = makeInner();
+/**
+ * @param {module:echats/coord/Axis} axis
+ * @return {Object} {
+ *     labels: [{
+ *         formattedLabel: string,
+ *         rawLabel: string,
+ *         tickValue: number
+ *     }, ...],
+ *     labelCategoryInterval: number
+ * }
+ */
+
+function createAxisLabels(axis) {
+  // Only ordinal scale support tick interval
+  return axis.type === 'category' ? makeCategoryLabels(axis) : makeRealNumberLabels(axis);
+}
+/**
+ * @param {module:echats/coord/Axis} axis
+ * @param {module:echarts/model/Model} tickModel For example, can be axisTick, splitLine, splitArea.
+ * @return {Object} {
+ *     ticks: Array.<number>
+ *     tickCategoryInterval: number
+ * }
+ */
+
+function createAxisTicks(axis, tickModel) {
+  // Only ordinal scale support tick interval
+  return axis.type === 'category' ? makeCategoryTicks(axis, tickModel) : {
+    ticks: axis.scale.getTicks()
+  };
+}
+
+function makeCategoryLabels(axis) {
+  var labelModel = axis.getLabelModel();
+  var result = makeCategoryLabelsActually(axis, labelModel);
+  return !labelModel.get('show') || axis.scale.isBlank() ? {
+    labels: [],
+    labelCategoryInterval: result.labelCategoryInterval
+  } : result;
+}
+
+function makeCategoryLabelsActually(axis, labelModel) {
+  var labelsCache = getListCache(axis, 'labels');
+  var optionLabelInterval = getOptionCategoryInterval(labelModel);
+  var result = listCacheGet(labelsCache, optionLabelInterval);
+
+  if (result) {
+    return result;
+  }
+
+  var labels;
+  var numericLabelInterval;
+
+  if (isFunction$1(optionLabelInterval)) {
+    labels = makeLabelsByCustomizedCategoryInterval(axis, optionLabelInterval);
+  } else {
+    numericLabelInterval = optionLabelInterval === 'auto' ? makeAutoCategoryInterval(axis) : optionLabelInterval;
+    labels = makeLabelsByNumericCategoryInterval(axis, numericLabelInterval);
+  } // Cache to avoid calling interval function repeatly.
+
+
+  return listCacheSet(labelsCache, optionLabelInterval, {
+    labels: labels,
+    labelCategoryInterval: numericLabelInterval
+  });
+}
+
+function makeCategoryTicks(axis, tickModel) {
+  var ticksCache = getListCache(axis, 'ticks');
+  var optionTickInterval = getOptionCategoryInterval(tickModel);
+  var result = listCacheGet(ticksCache, optionTickInterval);
+
+  if (result) {
+    return result;
+  }
+
+  var ticks;
+  var tickCategoryInterval; // Optimize for the case that large category data and no label displayed,
+  // we should not return all ticks.
+
+  if (!tickModel.get('show') || axis.scale.isBlank()) {
+    ticks = [];
+  }
+
+  if (isFunction$1(optionTickInterval)) {
+    ticks = makeLabelsByCustomizedCategoryInterval(axis, optionTickInterval, true);
+  } // Always use label interval by default despite label show. Consider this
+  // scenario, Use multiple grid with the xAxis sync, and only one xAxis shows
+  // labels. `splitLine` and `axisTick` should be consistent in this case.
+  else if (optionTickInterval === 'auto') {
+      var labelsResult = makeCategoryLabelsActually(axis, axis.getLabelModel());
+      tickCategoryInterval = labelsResult.labelCategoryInterval;
+      ticks = map(labelsResult.labels, function (labelItem) {
+        return labelItem.tickValue;
+      });
+    } else {
+      tickCategoryInterval = optionTickInterval;
+      ticks = makeLabelsByNumericCategoryInterval(axis, tickCategoryInterval, true);
+    } // Cache to avoid calling interval function repeatly.
+
+
+  return listCacheSet(ticksCache, optionTickInterval, {
+    ticks: ticks,
+    tickCategoryInterval: tickCategoryInterval
+  });
+}
+
+function makeRealNumberLabels(axis) {
+  var ticks = axis.scale.getTicks();
+  var labelFormatter = makeLabelFormatter(axis);
+  return {
+    labels: map(ticks, function (tickValue, idx) {
+      return {
+        formattedLabel: labelFormatter(tickValue, idx),
+        rawLabel: axis.scale.getLabel(tickValue),
+        tickValue: tickValue
+      };
+    })
+  };
+} // Large category data calculation is performence sensitive, and ticks and label
+// probably be fetched by multiple times. So we cache the result.
+// axis is created each time during a ec process, so we do not need to clear cache.
+
+
+function getListCache(axis, prop) {
+  // Because key can be funciton, and cache size always be small, we use array cache.
+  return inner$6(axis)[prop] || (inner$6(axis)[prop] = []);
+}
+
+function listCacheGet(cache, key) {
+  for (var i = 0; i < cache.length; i++) {
+    if (cache[i].key === key) {
+      return cache[i].value;
+    }
+  }
+}
+
+function listCacheSet(cache, key, value) {
+  cache.push({
+    key: key,
+    value: value
+  });
+  return value;
+}
+
+function makeAutoCategoryInterval(axis) {
+  var result = inner$6(axis).autoInterval;
+  return result != null ? result : inner$6(axis).autoInterval = axis.calculateCategoryInterval();
+}
+/**
+ * Calculate interval for category axis ticks and labels.
+ * To get precise result, at least one of `getRotate` and `isHorizontal`
+ * should be implemented in axis.
+ */
+
+
+function calculateCategoryInterval(axis) {
+  var params = fetchAutoCategoryIntervalCalculationParams(axis);
+  var labelFormatter = makeLabelFormatter(axis);
+  var rotation = (params.axisRotate - params.labelRotate) / 180 * Math.PI;
+  var ordinalScale = axis.scale;
+  var ordinalExtent = ordinalScale.getExtent(); // Providing this method is for optimization:
+  // avoid generating a long array by `getTicks`
+  // in large category data case.
+
+  var tickCount = ordinalScale.count();
+
+  if (ordinalExtent[1] - ordinalExtent[0] < 1) {
+    return 0;
+  }
+
+  var step = 1; // Simple optimization. Empirical value: tick count should less than 40.
+
+  if (tickCount > 40) {
+    step = Math.max(1, Math.floor(tickCount / 40));
+  }
+
+  var tickValue = ordinalExtent[0];
+  var unitSpan = axis.dataToCoord(tickValue + 1) - axis.dataToCoord(tickValue);
+  var unitW = Math.abs(unitSpan * Math.cos(rotation));
+  var unitH = Math.abs(unitSpan * Math.sin(rotation));
+  var maxW = 0;
+  var maxH = 0; // Caution: Performance sensitive for large category data.
+  // Consider dataZoom, we should make appropriate step to avoid O(n) loop.
+
+  for (; tickValue <= ordinalExtent[1]; tickValue += step) {
+    var width = 0;
+    var height = 0; // Not precise, do not consider align and vertical align
+    // and each distance from axis line yet.
+
+    var rect = getBoundingRect(labelFormatter(tickValue), params.font, 'center', 'top'); // Magic number
+
+    width = rect.width * 1.3;
+    height = rect.height * 1.3; // Min size, void long loop.
+
+    maxW = Math.max(maxW, width, 7);
+    maxH = Math.max(maxH, height, 7);
+  }
+
+  var dw = maxW / unitW;
+  var dh = maxH / unitH; // 0/0 is NaN, 1/0 is Infinity.
+
+  isNaN(dw) && (dw = Infinity);
+  isNaN(dh) && (dh = Infinity);
+  var interval = Math.max(0, Math.floor(Math.min(dw, dh)));
+  var cache = inner$6(axis.model);
+  var lastAutoInterval = cache.lastAutoInterval;
+  var lastTickCount = cache.lastTickCount; // Use cache to keep interval stable while moving zoom window,
+  // otherwise the calculated interval might jitter when the zoom
+  // window size is close to the interval-changing size.
+
+  if (lastAutoInterval != null && lastTickCount != null && Math.abs(lastAutoInterval - interval) <= 1 && Math.abs(lastTickCount - tickCount) <= 1 // Always choose the bigger one, otherwise the critical
+  // point is not the same when zooming in or zooming out.
+  && lastAutoInterval > interval) {
+    interval = lastAutoInterval;
+  } // Only update cache if cache not used, otherwise the
+  // changing of interval is too insensitive.
+  else {
+      cache.lastTickCount = tickCount;
+      cache.lastAutoInterval = interval;
+    }
+
+  return interval;
+}
+
+function fetchAutoCategoryIntervalCalculationParams(axis) {
+  var labelModel = axis.getLabelModel();
+  return {
+    axisRotate: axis.getRotate ? axis.getRotate() : axis.isHorizontal && !axis.isHorizontal() ? 90 : 0,
+    labelRotate: labelModel.get('rotate') || 0,
+    font: labelModel.getFont()
+  };
+}
+
+function makeLabelsByNumericCategoryInterval(axis, categoryInterval, onlyTick) {
+  var labelFormatter = makeLabelFormatter(axis);
+  var ordinalScale = axis.scale;
+  var ordinalExtent = ordinalScale.getExtent();
+  var labelModel = axis.getLabelModel();
+  var result = []; // TODO: axisType: ordinalTime, pick the tick from each month/day/year/...
+
+  var step = Math.max((categoryInterval || 0) + 1, 1);
+  var startTick = ordinalExtent[0];
+  var tickCount = ordinalScale.count(); // Calculate start tick based on zero if possible to keep label consistent
+  // while zooming and moving while interval > 0. Otherwise the selection
+  // of displayable ticks and symbols probably keep changing.
+  // 3 is empirical value.
+
+  if (startTick !== 0 && step > 1 && tickCount / step > 2) {
+    startTick = Math.round(Math.ceil(startTick / step) * step);
+  } // (1) Only add min max label here but leave overlap checking
+  // to render stage, which also ensure the returned list
+  // suitable for splitLine and splitArea rendering.
+  // (2) Scales except category always contain min max label so
+  // do not need to perform this process.
+
+
+  var showMinMax = {
+    min: labelModel.get('showMinLabel'),
+    max: labelModel.get('showMaxLabel')
+  };
+
+  if (showMinMax.min && startTick !== ordinalExtent[0]) {
+    addItem(ordinalExtent[0]);
+  } // Optimize: avoid generating large array by `ordinalScale.getTicks()`.
+
+
+  var tickValue = startTick;
+
+  for (; tickValue <= ordinalExtent[1]; tickValue += step) {
+    addItem(tickValue);
+  }
+
+  if (showMinMax.max && tickValue !== ordinalExtent[1]) {
+    addItem(ordinalExtent[1]);
+  }
+
+  function addItem(tVal) {
+    result.push(onlyTick ? tVal : {
+      formattedLabel: labelFormatter(tVal),
+      rawLabel: ordinalScale.getLabel(tVal),
+      tickValue: tVal
+    });
+  }
+
+  return result;
+} // When interval is function, the result `false` means ignore the tick.
+// It is time consuming for large category data.
+
+
+function makeLabelsByCustomizedCategoryInterval(axis, categoryInterval, onlyTick) {
+  var ordinalScale = axis.scale;
+  var labelFormatter = makeLabelFormatter(axis);
+  var result = [];
+  each$1(ordinalScale.getTicks(), function (tickValue) {
+    var rawLabel = ordinalScale.getLabel(tickValue);
+
+    if (categoryInterval(tickValue, rawLabel)) {
+      result.push(onlyTick ? tickValue : {
+        formattedLabel: labelFormatter(tickValue),
+        rawLabel: rawLabel,
+        tickValue: tickValue
+      });
+    }
+  });
+  return result;
+} // Can be null|'auto'|number|function
+
+
+function getOptionCategoryInterval(model) {
+  var interval = model.get('interval');
+  return interval == null ? 'auto' : interval;
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var NORMALIZED_EXTENT = [0, 1];
+/**
+ * Base class of Axis.
+ * @constructor
+ */
+
+var Axis = function (dim, scale, extent) {
+  /**
+   * Axis dimension. Such as 'x', 'y', 'z', 'angle', 'radius'.
+   * @type {string}
+   */
+  this.dim = dim;
+  /**
+   * Axis scale
+   * @type {module:echarts/coord/scale/*}
+   */
+
+  this.scale = scale;
+  /**
+   * @type {Array.<number>}
+   * @private
+   */
+
+  this._extent = extent || [0, 0];
+  /**
+   * @type {boolean}
+   */
+
+  this.inverse = false;
+  /**
+   * Usually true when axis has a ordinal scale
+   * @type {boolean}
+   */
+
+  this.onBand = false;
+};
+
+Axis.prototype = {
+  constructor: Axis,
+
+  /**
+   * If axis extent contain given coord
+   * @param {number} coord
+   * @return {boolean}
+   */
+  contain: function (coord) {
+    var extent = this._extent;
+    var min = Math.min(extent[0], extent[1]);
+    var max = Math.max(extent[0], extent[1]);
+    return coord >= min && coord <= max;
+  },
+
+  /**
+   * If axis extent contain given data
+   * @param {number} data
+   * @return {boolean}
+   */
+  containData: function (data) {
+    return this.contain(this.dataToCoord(data));
+  },
+
+  /**
+   * Get coord extent.
+   * @return {Array.<number>}
+   */
+  getExtent: function () {
+    return this._extent.slice();
+  },
+
+  /**
+   * Get precision used for formatting
+   * @param {Array.<number>} [dataExtent]
+   * @return {number}
+   */
+  getPixelPrecision: function (dataExtent) {
+    return getPixelPrecision(dataExtent || this.scale.getExtent(), this._extent);
+  },
+
+  /**
+   * Set coord extent
+   * @param {number} start
+   * @param {number} end
+   */
+  setExtent: function (start, end) {
+    var extent = this._extent;
+    extent[0] = start;
+    extent[1] = end;
+  },
+
+  /**
+   * Convert data to coord. Data is the rank if it has an ordinal scale
+   * @param {number} data
+   * @param  {boolean} clamp
+   * @return {number}
+   */
+  dataToCoord: function (data, clamp) {
+    var extent = this._extent;
+    var scale = this.scale;
+    data = scale.normalize(data);
+
+    if (this.onBand && scale.type === 'ordinal') {
+      extent = extent.slice();
+      fixExtentWithBands(extent, scale.count());
+    }
+
+    return linearMap(data, NORMALIZED_EXTENT, extent, clamp);
+  },
+
+  /**
+   * Convert coord to data. Data is the rank if it has an ordinal scale
+   * @param {number} coord
+   * @param  {boolean} clamp
+   * @return {number}
+   */
+  coordToData: function (coord, clamp) {
+    var extent = this._extent;
+    var scale = this.scale;
+
+    if (this.onBand && scale.type === 'ordinal') {
+      extent = extent.slice();
+      fixExtentWithBands(extent, scale.count());
+    }
+
+    var t = linearMap(coord, extent, NORMALIZED_EXTENT, clamp);
+    return this.scale.scale(t);
+  },
+
+  /**
+   * Convert pixel point to data in axis
+   * @param {Array.<number>} point
+   * @param  {boolean} clamp
+   * @return {number} data
+   */
+  pointToData: function (point, clamp) {// Should be implemented in derived class if necessary.
+  },
+
+  /**
+   * Different from `zrUtil.map(axis.getTicks(), axis.dataToCoord, axis)`,
+   * `axis.getTicksCoords` considers `onBand`, which is used by
+   * `boundaryGap:true` of category axis and splitLine and splitArea.
+   * @param {Object} [opt]
+   * @param {number} [opt.tickModel=axis.model.getModel('axisTick')]
+   * @param {boolean} [opt.clamp] If `true`, the first and the last
+   *        tick must be at the axis end points. Otherwise, clip ticks
+   *        that outside the axis extent.
+   * @return {Array.<Object>} [{
+   *     coord: ...,
+   *     tickValue: ...
+   * }, ...]
+   */
+  getTicksCoords: function (opt) {
+    opt = opt || {};
+    var tickModel = opt.tickModel || this.getTickModel();
+    var result = createAxisTicks(this, tickModel);
+    var ticks = result.ticks;
+    var ticksCoords = map(ticks, function (tickValue) {
+      return {
+        coord: this.dataToCoord(tickValue),
+        tickValue: tickValue
+      };
+    }, this);
+    var alignWithLabel = tickModel.get('alignWithLabel');
+    fixOnBandTicksCoords(this, ticksCoords, result.tickCategoryInterval, alignWithLabel, opt.clamp);
+    return ticksCoords;
+  },
+
+  /**
+   * @return {Array.<Object>} [{
+   *     formattedLabel: string,
+   *     rawLabel: axis.scale.getLabel(tickValue)
+   *     tickValue: number
+   * }, ...]
+   */
+  getViewLabels: function () {
+    return createAxisLabels(this).labels;
+  },
+
+  /**
+   * @return {module:echarts/coord/model/Model}
+   */
+  getLabelModel: function () {
+    return this.model.getModel('axisLabel');
+  },
+
+  /**
+   * Notice here we only get the default tick model. For splitLine
+   * or splitArea, we should pass the splitLineModel or splitAreaModel
+   * manually when calling `getTicksCoords`.
+   * In GL, this method may be overrided to:
+   * `axisModel.getModel('axisTick', grid3DModel.getModel('axisTick'));`
+   * @return {module:echarts/coord/model/Model}
+   */
+  getTickModel: function () {
+    return this.model.getModel('axisTick');
+  },
+
+  /**
+   * Get width of band
+   * @return {number}
+   */
+  getBandWidth: function () {
+    var axisExtent = this._extent;
+    var dataExtent = this.scale.getExtent();
+    var len = dataExtent[1] - dataExtent[0] + (this.onBand ? 1 : 0); // Fix #2728, avoid NaN when only one data.
+
+    len === 0 && (len = 1);
+    var size = Math.abs(axisExtent[1] - axisExtent[0]);
+    return Math.abs(size) / len;
+  },
+
+  /**
+   * @abstract
+   * @return {boolean} Is horizontal
+   */
+  isHorizontal: null,
+
+  /**
+   * @abstract
+   * @return {number} Get axis rotate, by degree.
+   */
+  getRotate: null,
+
+  /**
+   * Only be called in category axis.
+   * Can be overrided, consider other axes like in 3D.
+   * @return {number} Auto interval for cateogry axis tick and label
+   */
+  calculateCategoryInterval: function () {
+    return calculateCategoryInterval(this);
+  }
+};
+
+function fixExtentWithBands(extent, nTick) {
+  var size = extent[1] - extent[0];
+  var len = nTick;
+  var margin = size / len / 2;
+  extent[0] += margin;
+  extent[1] -= margin;
+} // If axis has labels [1, 2, 3, 4]. Bands on the axis are
+// |---1---|---2---|---3---|---4---|.
+// So the displayed ticks and splitLine/splitArea should between
+// each data item, otherwise cause misleading (e.g., split tow bars
+// of a single data item when there are two bar series).
+// Also consider if tickCategoryInterval > 0 and onBand, ticks and
+// splitLine/spliteArea should layout appropriately corresponding
+// to displayed labels. (So we should not use `getBandWidth` in this
+// case).
+
+
+function fixOnBandTicksCoords(axis, ticksCoords, tickCategoryInterval, alignWithLabel, clamp) {
+  var ticksLen = ticksCoords.length;
+
+  if (!axis.onBand || alignWithLabel || !ticksLen) {
+    return;
+  }
+
+  var axisExtent = axis.getExtent();
+  var last;
+
+  if (ticksLen === 1) {
+    ticksCoords[0].coord = axisExtent[0];
+    last = ticksCoords[1] = {
+      coord: axisExtent[0]
+    };
+  } else {
+    var shift = ticksCoords[1].coord - ticksCoords[0].coord;
+    each$1(ticksCoords, function (ticksItem) {
+      ticksItem.coord -= shift / 2;
+      var tickCategoryInterval = tickCategoryInterval || 0; // Avoid split a single data item when odd interval.
+
+      if (tickCategoryInterval % 2 > 0) {
+        ticksItem.coord -= shift / ((tickCategoryInterval + 1) * 2);
+      }
+    });
+    last = {
+      coord: ticksCoords[ticksLen - 1].coord + shift
+    };
+    ticksCoords.push(last);
+  }
+
+  var inverse = axisExtent[0] > axisExtent[1];
+
+  if (littleThan(ticksCoords[0].coord, axisExtent[0])) {
+    clamp ? ticksCoords[0].coord = axisExtent[0] : ticksCoords.shift();
+  }
+
+  if (clamp && littleThan(axisExtent[0], ticksCoords[0].coord)) {
+    ticksCoords.unshift({
+      coord: axisExtent[0]
+    });
+  }
+
+  if (littleThan(axisExtent[1], last.coord)) {
+    clamp ? last.coord = axisExtent[1] : ticksCoords.pop();
+  }
+
+  if (clamp && littleThan(last.coord, axisExtent[1])) {
+    ticksCoords.push({
+      coord: axisExtent[1]
+    });
+  }
+
+  function littleThan(a, b) {
+    return inverse ? a > b : a < b;
+  }
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * Do not mount those modules on 'src/echarts' for better tree shaking.
+ */
+var parseGeoJson = parseGeoJson$1;
+var ecUtil = {};
+each$1(['map', 'each', 'filter', 'indexOf', 'inherits', 'reduce', 'filter', 'bind', 'curry', 'isArray', 'isString', 'isObject', 'isFunction', 'extend', 'defaults', 'clone', 'merge'], function (name) {
+  ecUtil[name] = zrUtil[name];
+});
+var graphic = {};
+each$1(['extendShape', 'extendPath', 'makePath', 'makeImage', 'mergePath', 'resizePath', 'createIcon', 'setHoverStyle', 'setLabelStyle', 'setTextStyle', 'setText', 'getFont', 'updateProps', 'initProps', 'getTransform', 'clipPointsByRect', 'clipRectByRect', 'Group', 'Image', 'Text', 'Circle', 'Sector', 'Ring', 'Polygon', 'Polyline', 'Rect', 'Line', 'BezierCurve', 'Arc', 'IncrementalDisplayable', 'CompoundPath', 'LinearGradient', 'RadialGradient', 'BoundingRect'], function (name) {
+  graphic[name] = graphicUtil[name];
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * Cartesian coordinate system
+ * @module  echarts/coord/Cartesian
+ *
+ */
+function dimAxisMapper(dim) {
+  return this._axes[dim];
+}
+/**
+ * @alias module:echarts/coord/Cartesian
+ * @constructor
+ */
+
+
+var Cartesian = function (name) {
+  this._axes = {};
+  this._dimList = [];
+  /**
+   * @type {string}
+   */
+
+  this.name = name || '';
+};
+
+Cartesian.prototype = {
+  constructor: Cartesian,
+  type: 'cartesian',
+
+  /**
+   * Get axis
+   * @param  {number|string} dim
+   * @return {module:echarts/coord/Cartesian~Axis}
+   */
+  getAxis: function (dim) {
+    return this._axes[dim];
+  },
+
+  /**
+   * Get axes list
+   * @return {Array.<module:echarts/coord/Cartesian~Axis>}
+   */
+  getAxes: function () {
+    return map(this._dimList, dimAxisMapper, this);
+  },
+
+  /**
+   * Get axes list by given scale type
+   */
+  getAxesByScale: function (scaleType) {
+    scaleType = scaleType.toLowerCase();
+    return filter(this.getAxes(), function (axis) {
+      return axis.scale.type === scaleType;
+    });
+  },
+
+  /**
+   * Add axis
+   * @param {module:echarts/coord/Cartesian.Axis}
+   */
+  addAxis: function (axis) {
+    var dim = axis.dim;
+    this._axes[dim] = axis;
+
+    this._dimList.push(dim);
+  },
+
+  /**
+   * Convert data to coord in nd space
+   * @param {Array.<number>|Object.<string, number>} val
+   * @return {Array.<number>|Object.<string, number>}
+   */
+  dataToCoord: function (val) {
+    return this._dataCoordConvert(val, 'dataToCoord');
+  },
+
+  /**
+   * Convert coord in nd space to data
+   * @param  {Array.<number>|Object.<string, number>} val
+   * @return {Array.<number>|Object.<string, number>}
+   */
+  coordToData: function (val) {
+    return this._dataCoordConvert(val, 'coordToData');
+  },
+  _dataCoordConvert: function (input, method) {
+    var dimList = this._dimList;
+    var output = input instanceof Array ? [] : {};
+
+    for (var i = 0; i < dimList.length; i++) {
+      var dim = dimList[i];
+      var axis = this._axes[dim];
+      output[dim] = axis[method](input[dim]);
+    }
+
+    return output;
+  }
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+function Cartesian2D(name) {
+  Cartesian.call(this, name);
+}
+
+Cartesian2D.prototype = {
+  constructor: Cartesian2D,
+  type: 'cartesian2d',
+
+  /**
+   * @type {Array.<string>}
+   * @readOnly
+   */
+  dimensions: ['x', 'y'],
+
+  /**
+   * Base axis will be used on stacking.
+   *
+   * @return {module:echarts/coord/cartesian/Axis2D}
+   */
+  getBaseAxis: function () {
+    return this.getAxesByScale('ordinal')[0] || this.getAxesByScale('time')[0] || this.getAxis('x');
+  },
+
+  /**
+   * If contain point
+   * @param {Array.<number>} point
+   * @return {boolean}
+   */
+  containPoint: function (point) {
+    var axisX = this.getAxis('x');
+    var axisY = this.getAxis('y');
+    return axisX.contain(axisX.toLocalCoord(point[0])) && axisY.contain(axisY.toLocalCoord(point[1]));
+  },
+
+  /**
+   * If contain data
+   * @param {Array.<number>} data
+   * @return {boolean}
+   */
+  containData: function (data) {
+    return this.getAxis('x').containData(data[0]) && this.getAxis('y').containData(data[1]);
+  },
+
+  /**
+   * @param {Array.<number>} data
+   * @param {Array.<number>} out
+   * @return {Array.<number>}
+   */
+  dataToPoint: function (data, reserved, out) {
+    var xAxis = this.getAxis('x');
+    var yAxis = this.getAxis('y');
+    out = out || [];
+    out[0] = xAxis.toGlobalCoord(xAxis.dataToCoord(data[0]));
+    out[1] = yAxis.toGlobalCoord(yAxis.dataToCoord(data[1]));
+    return out;
+  },
+
+  /**
+   * @param {Array.<number>} data
+   * @param {Array.<number>} out
+   * @return {Array.<number>}
+   */
+  clampData: function (data, out) {
+    var xScale = this.getAxis('x').scale;
+    var yScale = this.getAxis('y').scale;
+    var xAxisExtent = xScale.getExtent();
+    var yAxisExtent = yScale.getExtent();
+    var x = xScale.parse(data[0]);
+    var y = yScale.parse(data[1]);
+    out = out || [];
+    out[0] = Math.min(Math.max(Math.min(xAxisExtent[0], xAxisExtent[1]), x), Math.max(xAxisExtent[0], xAxisExtent[1]));
+    out[1] = Math.min(Math.max(Math.min(yAxisExtent[0], yAxisExtent[1]), y), Math.max(yAxisExtent[0], yAxisExtent[1]));
+    return out;
+  },
+
+  /**
+   * @param {Array.<number>} point
+   * @param {Array.<number>} out
+   * @return {Array.<number>}
+   */
+  pointToData: function (point, out) {
+    var xAxis = this.getAxis('x');
+    var yAxis = this.getAxis('y');
+    out = out || [];
+    out[0] = xAxis.coordToData(xAxis.toLocalCoord(point[0]));
+    out[1] = yAxis.coordToData(yAxis.toLocalCoord(point[1]));
+    return out;
+  },
+
+  /**
+   * Get other axis
+   * @param {module:echarts/coord/cartesian/Axis2D} axis
+   */
+  getOtherAxis: function (axis) {
+    return this.getAxis(axis.dim === 'x' ? 'y' : 'x');
+  }
+};
+inherits(Cartesian2D, Cartesian);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+/**
+ * Extend axis 2d
+ * @constructor module:echarts/coord/cartesian/Axis2D
+ * @extends {module:echarts/coord/cartesian/Axis}
+ * @param {string} dim
+ * @param {*} scale
+ * @param {Array.<number>} coordExtent
+ * @param {string} axisType
+ * @param {string} position
+ */
+
+var Axis2D = function (dim, scale, coordExtent, axisType, position) {
+  Axis.call(this, dim, scale, coordExtent);
+  /**
+   * Axis type
+   *  - 'category'
+   *  - 'value'
+   *  - 'time'
+   *  - 'log'
+   * @type {string}
+   */
+
+  this.type = axisType || 'value';
+  /**
+   * Axis position
+   *  - 'top'
+   *  - 'bottom'
+   *  - 'left'
+   *  - 'right'
+   */
+
+  this.position = position || 'bottom';
+};
+
+Axis2D.prototype = {
+  constructor: Axis2D,
+
+  /**
+   * Index of axis, can be used as key
+   */
+  index: 0,
+
+  /**
+   * Implemented in <module:echarts/coord/cartesian/Grid>.
+   * @return {Array.<module:echarts/coord/cartesian/Axis2D>}
+   *         If not on zero of other axis, return null/undefined.
+   *         If no axes, return an empty array.
+   */
+  getAxesOnZeroOf: null,
+
+  /**
+   * Axis model
+   * @param {module:echarts/coord/cartesian/AxisModel}
+   */
+  model: null,
+  isHorizontal: function () {
+    var position = this.position;
+    return position === 'top' || position === 'bottom';
+  },
+
+  /**
+   * Each item cooresponds to this.getExtent(), which
+   * means globalExtent[0] may greater than globalExtent[1],
+   * unless `asc` is input.
+   *
+   * @param {boolean} [asc]
+   * @return {Array.<number>}
+   */
+  getGlobalExtent: function (asc) {
+    var ret = this.getExtent();
+    ret[0] = this.toGlobalCoord(ret[0]);
+    ret[1] = this.toGlobalCoord(ret[1]);
+    asc && ret[0] > ret[1] && ret.reverse();
+    return ret;
+  },
+  getOtherAxis: function () {
+    this.grid.getOtherAxis();
+  },
+
+  /**
+   * @override
+   */
+  pointToData: function (point, clamp) {
+    return this.coordToData(this.toLocalCoord(point[this.dim === 'x' ? 0 : 1]), clamp);
+  },
+
+  /**
+   * Transform global coord to local coord,
+   * i.e. var localCoord = axis.toLocalCoord(80);
+   * designate by module:echarts/coord/cartesian/Grid.
+   * @type {Function}
+   */
+  toLocalCoord: null,
+
+  /**
+   * Transform global coord to local coord,
+   * i.e. var globalCoord = axis.toLocalCoord(40);
+   * designate by module:echarts/coord/cartesian/Grid.
+   * @type {Function}
+   */
+  toGlobalCoord: null
+};
+inherits(Axis2D, Axis);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var defaultOption = {
+  show: true,
+  zlevel: 0,
+  z: 0,
+  // Inverse the axis.
+  inverse: false,
+  // Axis name displayed.
+  name: '',
+  // 'start' | 'middle' | 'end'
+  nameLocation: 'end',
+  // By degree. By defualt auto rotate by nameLocation.
+  nameRotate: null,
+  nameTruncate: {
+    maxWidth: null,
+    ellipsis: '...',
+    placeholder: '.'
+  },
+  // Use global text style by default.
+  nameTextStyle: {},
+  // The gap between axisName and axisLine.
+  nameGap: 15,
+  // Default `false` to support tooltip.
+  silent: false,
+  // Default `false` to avoid legacy user event listener fail.
+  triggerEvent: false,
+  tooltip: {
+    show: false
+  },
+  axisPointer: {},
+  axisLine: {
+    show: true,
+    onZero: true,
+    onZeroAxisIndex: null,
+    lineStyle: {
+      color: '#333',
+      width: 1,
+      type: 'solid'
+    },
+    // The arrow at both ends the the axis.
+    symbol: ['none', 'none'],
+    symbolSize: [10, 15]
+  },
+  axisTick: {
+    show: true,
+    // Whether axisTick is inside the grid or outside the grid.
+    inside: false,
+    // The length of axisTick.
+    length: 5,
+    lineStyle: {
+      width: 1
+    }
+  },
+  axisLabel: {
+    show: true,
+    // Whether axisLabel is inside the grid or outside the grid.
+    inside: false,
+    rotate: 0,
+    // true | false | null/undefined (auto)
+    showMinLabel: null,
+    // true | false | null/undefined (auto)
+    showMaxLabel: null,
+    margin: 8,
+    // formatter: null,
+    fontSize: 12
+  },
+  splitLine: {
+    show: true,
+    lineStyle: {
+      color: ['#ccc'],
+      width: 1,
+      type: 'solid'
+    }
+  },
+  splitArea: {
+    show: false,
+    areaStyle: {
+      color: ['rgba(250,250,250,0.3)', 'rgba(200,200,200,0.3)']
+    }
+  }
+};
+var axisDefault = {};
+axisDefault.categoryAxis = merge({
+  // The gap at both ends of the axis. For categoryAxis, boolean.
+  boundaryGap: true,
+  // Set false to faster category collection.
+  // Only usefull in the case like: category is
+  // ['2012-01-01', '2012-01-02', ...], where the input
+  // data has been ensured not duplicate and is large data.
+  // null means "auto":
+  // if axis.data provided, do not deduplication,
+  // else do deduplication.
+  deduplication: null,
+  // splitArea: {
+  // show: false
+  // },
+  splitLine: {
+    show: false
+  },
+  axisTick: {
+    // If tick is align with label when boundaryGap is true
+    alignWithLabel: false,
+    interval: 'auto'
+  },
+  axisLabel: {
+    interval: 'auto'
+  }
+}, defaultOption);
+axisDefault.valueAxis = merge({
+  // The gap at both ends of the axis. For value axis, [GAP, GAP], where
+  // `GAP` can be an absolute pixel number (like `35`), or percent (like `'30%'`)
+  boundaryGap: [0, 0],
+  // TODO
+  // min/max: [30, datamin, 60] or [20, datamin] or [datamin, 60]
+  // Min value of the axis. can be:
+  // + a number
+  // + 'dataMin': use the min value in data.
+  // + null/undefined: auto decide min value (consider pretty look and boundaryGap).
+  // min: null,
+  // Max value of the axis. can be:
+  // + a number
+  // + 'dataMax': use the max value in data.
+  // + null/undefined: auto decide max value (consider pretty look and boundaryGap).
+  // max: null,
+  // Readonly prop, specifies start value of the range when using data zoom.
+  // rangeStart: null
+  // Readonly prop, specifies end value of the range when using data zoom.
+  // rangeEnd: null
+  // Optional value can be:
+  // + `false`: always include value 0.
+  // + `true`: the extent do not consider value 0.
+  // scale: false,
+  // AxisTick and axisLabel and splitLine are caculated based on splitNumber.
+  splitNumber: 5 // Interval specifies the span of the ticks is mandatorily.
+  // interval: null
+  // Specify min interval when auto calculate tick interval.
+  // minInterval: null
+  // Specify max interval when auto calculate tick interval.
+  // maxInterval: null
+
+}, defaultOption);
+axisDefault.timeAxis = defaults({
+  scale: true,
+  min: 'dataMin',
+  max: 'dataMax'
+}, axisDefault.valueAxis);
+axisDefault.logAxis = defaults({
+  scale: true,
+  logBase: 10
+}, axisDefault.valueAxis);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var AXIS_TYPES = ['value', 'category', 'time', 'log'];
+/**
+ * Generate sub axis model class
+ * @param {string} axisName 'x' 'y' 'radius' 'angle' 'parallel'
+ * @param {module:echarts/model/Component} BaseAxisModelClass
+ * @param {Function} axisTypeDefaulter
+ * @param {Object} [extraDefaultOption]
+ */
+
+var axisModelCreator = function (axisName, BaseAxisModelClass, axisTypeDefaulter, extraDefaultOption) {
+  each$1(AXIS_TYPES, function (axisType) {
+    BaseAxisModelClass.extend({
+      /**
+       * @readOnly
+       */
+      type: axisName + 'Axis.' + axisType,
+      mergeDefaultAndTheme: function (option, ecModel) {
+        var layoutMode = this.layoutMode;
+        var inputPositionParams = layoutMode ? getLayoutParams(option) : {};
+        var themeModel = ecModel.getTheme();
+        merge(option, themeModel.get(axisType + 'Axis'));
+        merge(option, this.getDefaultOption());
+        option.type = axisTypeDefaulter(axisName, option);
+
+        if (layoutMode) {
+          mergeLayoutParam(option, inputPositionParams, layoutMode);
+        }
+      },
+
+      /**
+       * @override
+       */
+      optionUpdated: function () {
+        var thisOption = this.option;
+
+        if (thisOption.type === 'category') {
+          this.__ordinalMeta = OrdinalMeta.createByAxisModel(this);
+        }
+      },
+
+      /**
+       * Should not be called before all of 'getInitailData' finished.
+       * Because categories are collected during initializing data.
+       */
+      getCategories: function (rawData) {
+        var option = this.option; // FIXME
+        // warning if called before all of 'getInitailData' finished.
+
+        if (option.type === 'category') {
+          if (rawData) {
+            return option.data;
+          }
+
+          return this.__ordinalMeta.categories;
+        }
+      },
+      getOrdinalMeta: function () {
+        return this.__ordinalMeta;
+      },
+      defaultOption: mergeAll([{}, axisDefault[axisType + 'Axis'], extraDefaultOption], true)
+    });
+  });
+  ComponentModel.registerSubTypeDefaulter(axisName + 'Axis', curry(axisTypeDefaulter, axisName));
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var AxisModel = ComponentModel.extend({
+  type: 'cartesian2dAxis',
+
+  /**
+   * @type {module:echarts/coord/cartesian/Axis2D}
+   */
+  axis: null,
+
+  /**
+   * @override
+   */
+  init: function () {
+    AxisModel.superApply(this, 'init', arguments);
+    this.resetRange();
+  },
+
+  /**
+   * @override
+   */
+  mergeOption: function () {
+    AxisModel.superApply(this, 'mergeOption', arguments);
+    this.resetRange();
+  },
+
+  /**
+   * @override
+   */
+  restoreData: function () {
+    AxisModel.superApply(this, 'restoreData', arguments);
+    this.resetRange();
+  },
+
+  /**
+   * @override
+   * @return {module:echarts/model/Component}
+   */
+  getCoordSysModel: function () {
+    return this.ecModel.queryComponents({
+      mainType: 'grid',
+      index: this.option.gridIndex,
+      id: this.option.gridId
+    })[0];
+  }
+});
+
+function getAxisType(axisDim, option) {
+  // Default axis with data is category axis
+  return option.type || (option.data ? 'category' : 'value');
+}
+
+merge(AxisModel.prototype, axisModelCommonMixin);
+var extraOption = {
+  // gridIndex: 0,
+  // gridId: '',
+  // Offset is for multiple axis on the same position
+  offset: 0
+};
+axisModelCreator('x', AxisModel, getAxisType, extraOption);
+axisModelCreator('y', AxisModel, getAxisType, extraOption);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+// Grid 鏄湪鏈夌洿瑙掑潗鏍囩郴鐨勬椂鍊欏繀椤昏瀛樺湪鐨�
+// 鎵�浠ヨ繖閲屼篃瑕佽 Cartesian2D 渚濊禆
+ComponentModel.extend({
+  type: 'grid',
+  dependencies: ['xAxis', 'yAxis'],
+  layoutMode: 'box',
+
+  /**
+   * @type {module:echarts/coord/cartesian/Grid}
+   */
+  coordinateSystem: null,
+  defaultOption: {
+    show: false,
+    zlevel: 0,
+    z: 0,
+    left: '10%',
+    top: 60,
+    right: '10%',
+    bottom: 60,
+    // If grid size contain label
+    containLabel: false,
+    // width: {totalWidth} - left - right,
+    // height: {totalHeight} - top - bottom,
+    backgroundColor: 'rgba(0,0,0,0)',
+    borderWidth: 1,
+    borderColor: '#ccc'
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * Grid is a region which contains at most 4 cartesian systems
+ *
+ * TODO Default cartesian
+ */
+/**
+ * Check if the axis is used in the specified grid
+ * @inner
+ */
+
+function isAxisUsedInTheGrid(axisModel, gridModel, ecModel) {
+  return axisModel.getCoordSysModel() === gridModel;
+}
+
+function Grid(gridModel, ecModel, api) {
+  /**
+   * @type {Object.<string, module:echarts/coord/cartesian/Cartesian2D>}
+   * @private
+   */
+  this._coordsMap = {};
+  /**
+   * @type {Array.<module:echarts/coord/cartesian/Cartesian>}
+   * @private
+   */
+
+  this._coordsList = [];
+  /**
+   * @type {Object.<string, module:echarts/coord/cartesian/Axis2D>}
+   * @private
+   */
+
+  this._axesMap = {};
+  /**
+   * @type {Array.<module:echarts/coord/cartesian/Axis2D>}
+   * @private
+   */
+
+  this._axesList = [];
+
+  this._initCartesian(gridModel, ecModel, api);
+
+  this.model = gridModel;
+}
+
+var gridProto = Grid.prototype;
+gridProto.type = 'grid';
+gridProto.axisPointerEnabled = true;
+
+gridProto.getRect = function () {
+  return this._rect;
+};
+
+gridProto.update = function (ecModel, api) {
+  var axesMap = this._axesMap;
+
+  this._updateScale(ecModel, this.model);
+
+  each$1(axesMap.x, function (xAxis) {
+    niceScaleExtent(xAxis.scale, xAxis.model);
+  });
+  each$1(axesMap.y, function (yAxis) {
+    niceScaleExtent(yAxis.scale, yAxis.model);
+  }); // Key: axisDim_axisIndex, value: boolean, whether onZero target.
+
+  var onZeroRecords = {};
+  each$1(axesMap.x, function (xAxis) {
+    fixAxisOnZero(axesMap, 'y', xAxis, onZeroRecords);
+  });
+  each$1(axesMap.y, function (yAxis) {
+    fixAxisOnZero(axesMap, 'x', yAxis, onZeroRecords);
+  }); // Resize again if containLabel is enabled
+  // FIXME It may cause getting wrong grid size in data processing stage
+
+  this.resize(this.model, api);
+};
+
+function fixAxisOnZero(axesMap, otherAxisDim, axis, onZeroRecords) {
+  axis.getAxesOnZeroOf = function () {
+    // TODO: onZero of multiple axes.
+    return otherAxisOnZeroOf ? [otherAxisOnZeroOf] : [];
+  }; // onZero can not be enabled in these two situations:
+  // 1. When any other axis is a category axis.
+  // 2. When no axis is cross 0 point.
+
+
+  var otherAxes = axesMap[otherAxisDim];
+  var otherAxisOnZeroOf;
+  var axisModel = axis.model;
+  var onZero = axisModel.get('axisLine.onZero');
+  var onZeroAxisIndex = axisModel.get('axisLine.onZeroAxisIndex');
+
+  if (!onZero) {
+    return;
+  } // If target axis is specified.
+
+
+  if (onZeroAxisIndex != null) {
+    if (canOnZeroToAxis(otherAxes[onZeroAxisIndex])) {
+      otherAxisOnZeroOf = otherAxes[onZeroAxisIndex];
+    }
+  } else {
+    // Find the first available other axis.
+    for (var idx in otherAxes) {
+      if (otherAxes.hasOwnProperty(idx) && canOnZeroToAxis(otherAxes[idx]) // Consider that two Y axes on one value axis,
+      // if both onZero, the two Y axes overlap.
+      && !onZeroRecords[getOnZeroRecordKey(otherAxes[idx])]) {
+        otherAxisOnZeroOf = otherAxes[idx];
+        break;
+      }
+    }
+  }
+
+  if (otherAxisOnZeroOf) {
+    onZeroRecords[getOnZeroRecordKey(otherAxisOnZeroOf)] = true;
+  }
+
+  function getOnZeroRecordKey(axis) {
+    return axis.dim + '_' + axis.index;
+  }
+}
+
+function canOnZeroToAxis(axis) {
+  return axis && axis.type !== 'category' && axis.type !== 'time' && ifAxisCrossZero(axis);
+}
+/**
+ * Resize the grid
+ * @param {module:echarts/coord/cartesian/GridModel} gridModel
+ * @param {module:echarts/ExtensionAPI} api
+ */
+
+
+gridProto.resize = function (gridModel, api, ignoreContainLabel) {
+  var gridRect = getLayoutRect(gridModel.getBoxLayoutParams(), {
+    width: api.getWidth(),
+    height: api.getHeight()
+  });
+  this._rect = gridRect;
+  var axesList = this._axesList;
+  adjustAxes(); // Minus label size
+
+  if (!ignoreContainLabel && gridModel.get('containLabel')) {
+    each$1(axesList, function (axis) {
+      if (!axis.model.get('axisLabel.inside')) {
+        var labelUnionRect = estimateLabelUnionRect(axis);
+
+        if (labelUnionRect) {
+          var dim = axis.isHorizontal() ? 'height' : 'width';
+          var margin = axis.model.get('axisLabel.margin');
+          gridRect[dim] -= labelUnionRect[dim] + margin;
+
+          if (axis.position === 'top') {
+            gridRect.y += labelUnionRect.height + margin;
+          } else if (axis.position === 'left') {
+            gridRect.x += labelUnionRect.width + margin;
+          }
+        }
+      }
+    });
+    adjustAxes();
+  }
+
+  function adjustAxes() {
+    each$1(axesList, function (axis) {
+      var isHorizontal = axis.isHorizontal();
+      var extent = isHorizontal ? [0, gridRect.width] : [0, gridRect.height];
+      var idx = axis.inverse ? 1 : 0;
+      axis.setExtent(extent[idx], extent[1 - idx]);
+      updateAxisTransform(axis, isHorizontal ? gridRect.x : gridRect.y);
+    });
+  }
+};
+/**
+ * @param {string} axisType
+ * @param {number} [axisIndex]
+ */
+
+
+gridProto.getAxis = function (axisType, axisIndex) {
+  var axesMapOnDim = this._axesMap[axisType];
+
+  if (axesMapOnDim != null) {
+    if (axisIndex == null) {
+      // Find first axis
+      for (var name in axesMapOnDim) {
+        if (axesMapOnDim.hasOwnProperty(name)) {
+          return axesMapOnDim[name];
+        }
+      }
+    }
+
+    return axesMapOnDim[axisIndex];
+  }
+};
+/**
+ * @return {Array.<module:echarts/coord/Axis>}
+ */
+
+
+gridProto.getAxes = function () {
+  return this._axesList.slice();
+};
+/**
+ * Usage:
+ *      grid.getCartesian(xAxisIndex, yAxisIndex);
+ *      grid.getCartesian(xAxisIndex);
+ *      grid.getCartesian(null, yAxisIndex);
+ *      grid.getCartesian({xAxisIndex: ..., yAxisIndex: ...});
+ *
+ * @param {number|Object} [xAxisIndex]
+ * @param {number} [yAxisIndex]
+ */
+
+
+gridProto.getCartesian = function (xAxisIndex, yAxisIndex) {
+  if (xAxisIndex != null && yAxisIndex != null) {
+    var key = 'x' + xAxisIndex + 'y' + yAxisIndex;
+    return this._coordsMap[key];
+  }
+
+  if (isObject$1(xAxisIndex)) {
+    yAxisIndex = xAxisIndex.yAxisIndex;
+    xAxisIndex = xAxisIndex.xAxisIndex;
+  } // When only xAxisIndex or yAxisIndex given, find its first cartesian.
+
+
+  for (var i = 0, coordList = this._coordsList; i < coordList.length; i++) {
+    if (coordList[i].getAxis('x').index === xAxisIndex || coordList[i].getAxis('y').index === yAxisIndex) {
+      return coordList[i];
+    }
+  }
+};
+
+gridProto.getCartesians = function () {
+  return this._coordsList.slice();
+};
+/**
+ * @implements
+ * see {module:echarts/CoodinateSystem}
+ */
+
+
+gridProto.convertToPixel = function (ecModel, finder, value) {
+  var target = this._findConvertTarget(ecModel, finder);
+
+  return target.cartesian ? target.cartesian.dataToPoint(value) : target.axis ? target.axis.toGlobalCoord(target.axis.dataToCoord(value)) : null;
+};
+/**
+ * @implements
+ * see {module:echarts/CoodinateSystem}
+ */
+
+
+gridProto.convertFromPixel = function (ecModel, finder, value) {
+  var target = this._findConvertTarget(ecModel, finder);
+
+  return target.cartesian ? target.cartesian.pointToData(value) : target.axis ? target.axis.coordToData(target.axis.toLocalCoord(value)) : null;
+};
+/**
+ * @inner
+ */
+
+
+gridProto._findConvertTarget = function (ecModel, finder) {
+  var seriesModel = finder.seriesModel;
+  var xAxisModel = finder.xAxisModel || seriesModel && seriesModel.getReferringComponents('xAxis')[0];
+  var yAxisModel = finder.yAxisModel || seriesModel && seriesModel.getReferringComponents('yAxis')[0];
+  var gridModel = finder.gridModel;
+  var coordsList = this._coordsList;
+  var cartesian;
+  var axis;
+
+  if (seriesModel) {
+    cartesian = seriesModel.coordinateSystem;
+    indexOf(coordsList, cartesian) < 0 && (cartesian = null);
+  } else if (xAxisModel && yAxisModel) {
+    cartesian = this.getCartesian(xAxisModel.componentIndex, yAxisModel.componentIndex);
+  } else if (xAxisModel) {
+    axis = this.getAxis('x', xAxisModel.componentIndex);
+  } else if (yAxisModel) {
+    axis = this.getAxis('y', yAxisModel.componentIndex);
+  } // Lowest priority.
+  else if (gridModel) {
+      var grid = gridModel.coordinateSystem;
+
+      if (grid === this) {
+        cartesian = this._coordsList[0];
+      }
+    }
+
+  return {
+    cartesian: cartesian,
+    axis: axis
+  };
+};
+/**
+ * @implements
+ * see {module:echarts/CoodinateSystem}
+ */
+
+
+gridProto.containPoint = function (point) {
+  var coord = this._coordsList[0];
+
+  if (coord) {
+    return coord.containPoint(point);
+  }
+};
+/**
+ * Initialize cartesian coordinate systems
+ * @private
+ */
+
+
+gridProto._initCartesian = function (gridModel, ecModel, api) {
+  var axisPositionUsed = {
+    left: false,
+    right: false,
+    top: false,
+    bottom: false
+  };
+  var axesMap = {
+    x: {},
+    y: {}
+  };
+  var axesCount = {
+    x: 0,
+    y: 0
+  }; /// Create axis
+
+  ecModel.eachComponent('xAxis', createAxisCreator('x'), this);
+  ecModel.eachComponent('yAxis', createAxisCreator('y'), this);
+
+  if (!axesCount.x || !axesCount.y) {
+    // Roll back when there no either x or y axis
+    this._axesMap = {};
+    this._axesList = [];
+    return;
+  }
+
+  this._axesMap = axesMap; /// Create cartesian2d
+
+  each$1(axesMap.x, function (xAxis, xAxisIndex) {
+    each$1(axesMap.y, function (yAxis, yAxisIndex) {
+      var key = 'x' + xAxisIndex + 'y' + yAxisIndex;
+      var cartesian = new Cartesian2D(key);
+      cartesian.grid = this;
+      cartesian.model = gridModel;
+      this._coordsMap[key] = cartesian;
+
+      this._coordsList.push(cartesian);
+
+      cartesian.addAxis(xAxis);
+      cartesian.addAxis(yAxis);
+    }, this);
+  }, this);
+
+  function createAxisCreator(axisType) {
+    return function (axisModel, idx) {
+      if (!isAxisUsedInTheGrid(axisModel, gridModel, ecModel)) {
+        return;
+      }
+
+      var axisPosition = axisModel.get('position');
+
+      if (axisType === 'x') {
+        // Fix position
+        if (axisPosition !== 'top' && axisPosition !== 'bottom') {
+          // Default bottom of X
+          axisPosition = 'bottom';
+
+          if (axisPositionUsed[axisPosition]) {
+            axisPosition = axisPosition === 'top' ? 'bottom' : 'top';
+          }
+        }
+      } else {
+        // Fix position
+        if (axisPosition !== 'left' && axisPosition !== 'right') {
+          // Default left of Y
+          axisPosition = 'left';
+
+          if (axisPositionUsed[axisPosition]) {
+            axisPosition = axisPosition === 'left' ? 'right' : 'left';
+          }
+        }
+      }
+
+      axisPositionUsed[axisPosition] = true;
+      var axis = new Axis2D(axisType, createScaleByModel(axisModel), [0, 0], axisModel.get('type'), axisPosition);
+      var isCategory = axis.type === 'category';
+      axis.onBand = isCategory && axisModel.get('boundaryGap');
+      axis.inverse = axisModel.get('inverse'); // Inject axis into axisModel
+
+      axisModel.axis = axis; // Inject axisModel into axis
+
+      axis.model = axisModel; // Inject grid info axis
+
+      axis.grid = this; // Index of axis, can be used as key
+
+      axis.index = idx;
+
+      this._axesList.push(axis);
+
+      axesMap[axisType][idx] = axis;
+      axesCount[axisType]++;
+    };
+  }
+};
+/**
+ * Update cartesian properties from series
+ * @param  {module:echarts/model/Option} option
+ * @private
+ */
+
+
+gridProto._updateScale = function (ecModel, gridModel) {
+  // Reset scale
+  each$1(this._axesList, function (axis) {
+    axis.scale.setExtent(Infinity, -Infinity);
+  });
+  ecModel.eachSeries(function (seriesModel) {
+    if (isCartesian2D(seriesModel)) {
+      var axesModels = findAxesModels(seriesModel, ecModel);
+      var xAxisModel = axesModels[0];
+      var yAxisModel = axesModels[1];
+
+      if (!isAxisUsedInTheGrid(xAxisModel, gridModel, ecModel) || !isAxisUsedInTheGrid(yAxisModel, gridModel, ecModel)) {
+        return;
+      }
+
+      var cartesian = this.getCartesian(xAxisModel.componentIndex, yAxisModel.componentIndex);
+      var data = seriesModel.getData();
+      var xAxis = cartesian.getAxis('x');
+      var yAxis = cartesian.getAxis('y');
+
+      if (data.type === 'list') {
+        unionExtent(data, xAxis, seriesModel);
+        unionExtent(data, yAxis, seriesModel);
+      }
+    }
+  }, this);
+
+  function unionExtent(data, axis, seriesModel) {
+    each$1(data.mapDimension(axis.dim, true), function (dim) {
+      axis.scale.unionExtentFromData( // For example, the extent of the orginal dimension
+      // is [0.1, 0.5], the extent of the `stackResultDimension`
+      // is [7, 9], the final extent should not include [0.1, 0.5].
+      data, getStackedDimension(data, dim));
+    });
+  }
+};
+/**
+ * @param {string} [dim] 'x' or 'y' or 'auto' or null/undefined
+ * @return {Object} {baseAxes: [], otherAxes: []}
+ */
+
+
+gridProto.getTooltipAxes = function (dim) {
+  var baseAxes = [];
+  var otherAxes = [];
+  each$1(this.getCartesians(), function (cartesian) {
+    var baseAxis = dim != null && dim !== 'auto' ? cartesian.getAxis(dim) : cartesian.getBaseAxis();
+    var otherAxis = cartesian.getOtherAxis(baseAxis);
+    indexOf(baseAxes, baseAxis) < 0 && baseAxes.push(baseAxis);
+    indexOf(otherAxes, otherAxis) < 0 && otherAxes.push(otherAxis);
+  });
+  return {
+    baseAxes: baseAxes,
+    otherAxes: otherAxes
+  };
+};
+/**
+ * @inner
+ */
+
+
+function updateAxisTransform(axis, coordBase) {
+  var axisExtent = axis.getExtent();
+  var axisExtentSum = axisExtent[0] + axisExtent[1]; // Fast transform
+
+  axis.toGlobalCoord = axis.dim === 'x' ? function (coord) {
+    return coord + coordBase;
+  } : function (coord) {
+    return axisExtentSum - coord + coordBase;
+  };
+  axis.toLocalCoord = axis.dim === 'x' ? function (coord) {
+    return coord - coordBase;
+  } : function (coord) {
+    return axisExtentSum - coord + coordBase;
+  };
+}
+
+var axesTypes = ['xAxis', 'yAxis'];
+/**
+ * @inner
+ */
+
+function findAxesModels(seriesModel, ecModel) {
+  return map(axesTypes, function (axisType) {
+    var axisModel = seriesModel.getReferringComponents(axisType)[0];
+    return axisModel;
+  });
+}
+/**
+ * @inner
+ */
+
+
+function isCartesian2D(seriesModel) {
+  return seriesModel.get('coordinateSystem') === 'cartesian2d';
+}
+
+Grid.create = function (ecModel, api) {
+  var grids = [];
+  ecModel.eachComponent('grid', function (gridModel, idx) {
+    var grid = new Grid(gridModel, ecModel, api);
+    grid.name = 'grid_' + idx; // dataSampling requires axis extent, so resize
+    // should be performed in create stage.
+
+    grid.resize(gridModel, api, true);
+    gridModel.coordinateSystem = grid;
+    grids.push(grid);
+  }); // Inject the coordinateSystems into seriesModel
+
+  ecModel.eachSeries(function (seriesModel) {
+    if (!isCartesian2D(seriesModel)) {
+      return;
+    }
+
+    var axesModels = findAxesModels(seriesModel, ecModel);
+    var xAxisModel = axesModels[0];
+    var yAxisModel = axesModels[1];
+    var gridModel = xAxisModel.getCoordSysModel();
+    var grid = gridModel.coordinateSystem;
+    seriesModel.coordinateSystem = grid.getCartesian(xAxisModel.componentIndex, yAxisModel.componentIndex);
+  });
+  return grids;
+}; // For deciding which dimensions to use when creating list data
+
+
+Grid.dimensions = Grid.prototype.dimensions = Cartesian2D.prototype.dimensions;
+CoordinateSystemManager.register('cartesian2d', Grid);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var BaseBarSeries = SeriesModel.extend({
+  type: 'series.__base_bar__',
+  getInitialData: function (option, ecModel) {
+    return createListFromArray(this.getSource(), this);
+  },
+  getMarkerPosition: function (value) {
+    var coordSys = this.coordinateSystem;
+
+    if (coordSys) {
+      // PENDING if clamp ?
+      var pt = coordSys.dataToPoint(coordSys.clampData(value));
+      var data = this.getData();
+      var offset = data.getLayout('offset');
+      var size = data.getLayout('size');
+      var offsetIndex = coordSys.getBaseAxis().isHorizontal() ? 0 : 1;
+      pt[offsetIndex] += offset + size / 2;
+      return pt;
+    }
+
+    return [NaN, NaN];
+  },
+  defaultOption: {
+    zlevel: 0,
+    // 涓�绾у眰鍙�
+    z: 2,
+    // 浜岀骇灞傚彔
+    coordinateSystem: 'cartesian2d',
+    legendHoverLink: true,
+    // stack: null
+    // Cartesian coordinate system
+    // xAxisIndex: 0,
+    // yAxisIndex: 0,
+    // 鏈�灏忛珮搴︽敼涓�0
+    barMinHeight: 0,
+    // 鏈�灏忚搴︿负0锛屼粎瀵规瀬鍧愭爣绯讳笅鐨勬煴鐘跺浘鏈夋晥
+    barMinAngle: 0,
+    // cursor: null,
+    large: false,
+    largeThreshold: 400,
+    progressive: 3e3,
+    progressiveChunkMode: 'mod',
+    // barMaxWidth: null,
+    // 榛樿鑷�傚簲
+    // barWidth: null,
+    // 鏌遍棿璺濈锛岄粯璁や负鏌卞舰瀹藉害鐨�30%锛屽彲璁惧浐瀹氬��
+    // barGap: '30%',
+    // 绫荤洰闂存煴褰㈣窛绂伙紝榛樿涓虹被鐩棿璺濈殑20%锛屽彲璁惧浐瀹氬��
+    // barCategoryGap: '20%',
+    // label: {
+    //      show: false
+    // },
+    itemStyle: {},
+    emphasis: {}
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+BaseBarSeries.extend({
+  type: 'series.bar',
+  dependencies: ['grid', 'polar'],
+  brushSelector: 'rect',
+
+  /**
+   * @override
+   */
+  getProgressive: function () {
+    // Do not support progressive in normal mode.
+    return this.get('large') ? this.get('progressive') : false;
+  },
+
+  /**
+   * @override
+   */
+  getProgressiveThreshold: function () {
+    // Do not support progressive in normal mode.
+    var progressiveThreshold = this.get('progressiveThreshold');
+    var largeThreshold = this.get('largeThreshold');
+
+    if (largeThreshold > progressiveThreshold) {
+      progressiveThreshold = largeThreshold;
+    }
+
+    return progressiveThreshold;
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+/**
+ * @param {module:echarts/data/List} data
+ * @param {number} dataIndex
+ * @return {string} label string. Not null/undefined
+ */
+
+function getDefaultLabel(data, dataIndex) {
+  var labelDims = data.mapDimension('defaultedLabel', true);
+  var len = labelDims.length; // Simple optimization (in lots of cases, label dims length is 1)
+
+  if (len === 1) {
+    return retrieveRawValue(data, dataIndex, labelDims[0]);
+  } else if (len) {
+    var vals = [];
+
+    for (var i = 0; i < labelDims.length; i++) {
+      var val = retrieveRawValue(data, dataIndex, labelDims[i]);
+      vals.push(val);
+    }
+
+    return vals.join(' ');
+  }
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+function setLabel(normalStyle, hoverStyle, itemModel, color, seriesModel, dataIndex, labelPositionOutside) {
+  var labelModel = itemModel.getModel('label');
+  var hoverLabelModel = itemModel.getModel('emphasis.label');
+  setLabelStyle(normalStyle, hoverStyle, labelModel, hoverLabelModel, {
+    labelFetcher: seriesModel,
+    labelDataIndex: dataIndex,
+    defaultText: getDefaultLabel(seriesModel.getData(), dataIndex),
+    isRectText: true,
+    autoColor: color
+  });
+  fixPosition(normalStyle);
+  fixPosition(hoverStyle);
+}
+
+function fixPosition(style, labelPositionOutside) {
+  if (style.textPosition === 'outside') {
+    style.textPosition = labelPositionOutside;
+  }
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var getBarItemStyle = makeStyleMapper([['fill', 'color'], ['stroke', 'borderColor'], ['lineWidth', 'borderWidth'], // Compatitable with 2
+['stroke', 'barBorderColor'], ['lineWidth', 'barBorderWidth'], ['opacity'], ['shadowBlur'], ['shadowOffsetX'], ['shadowOffsetY'], ['shadowColor']]);
+var barItemStyle = {
+  getBarItemStyle: function (excludes) {
+    var style = getBarItemStyle(this, excludes);
+
+    if (this.getBorderLineDash) {
+      var lineDash = this.getBorderLineDash();
+      lineDash && (style.lineDash = lineDash);
+    }
+
+    return style;
+  }
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var BAR_BORDER_WIDTH_QUERY = ['itemStyle', 'barBorderWidth']; // FIXME
+// Just for compatible with ec2.
+
+extend(Model.prototype, barItemStyle);
+extendChartView({
+  type: 'bar',
+  render: function (seriesModel, ecModel, api) {
+    this._updateDrawMode(seriesModel);
+
+    var coordinateSystemType = seriesModel.get('coordinateSystem');
+
+    if (coordinateSystemType === 'cartesian2d' || coordinateSystemType === 'polar') {
+      this._isLargeDraw ? this._renderLarge(seriesModel, ecModel, api) : this._renderNormal(seriesModel, ecModel, api);
+    } else {}
+
+    return this.group;
+  },
+  incrementalPrepareRender: function (seriesModel, ecModel, api) {
+    this._clear();
+
+    this._updateDrawMode(seriesModel);
+  },
+  incrementalRender: function (params, seriesModel, ecModel, api) {
+    // Do not support progressive in normal mode.
+    this._incrementalRenderLarge(params, seriesModel);
+  },
+  _updateDrawMode: function (seriesModel) {
+    var isLargeDraw = seriesModel.pipelineContext.large;
+
+    if (this._isLargeDraw == null || isLargeDraw ^ this._isLargeDraw) {
+      this._isLargeDraw = isLargeDraw;
+
+      this._clear();
+    }
+  },
+  _renderNormal: function (seriesModel, ecModel, api) {
+    var group = this.group;
+    var data = seriesModel.getData();
+    var oldData = this._data;
+    var coord = seriesModel.coordinateSystem;
+    var baseAxis = coord.getBaseAxis();
+    var isHorizontalOrRadial;
+
+    if (coord.type === 'cartesian2d') {
+      isHorizontalOrRadial = baseAxis.isHorizontal();
+    } else if (coord.type === 'polar') {
+      isHorizontalOrRadial = baseAxis.dim === 'angle';
+    }
+
+    var animationModel = seriesModel.isAnimationEnabled() ? seriesModel : null;
+    data.diff(oldData).add(function (dataIndex) {
+      if (!data.hasValue(dataIndex)) {
+        return;
+      }
+
+      var itemModel = data.getItemModel(dataIndex);
+      var layout = getLayout[coord.type](data, dataIndex, itemModel);
+      var el = elementCreator[coord.type](data, dataIndex, itemModel, layout, isHorizontalOrRadial, animationModel);
+      data.setItemGraphicEl(dataIndex, el);
+      group.add(el);
+      updateStyle(el, data, dataIndex, itemModel, layout, seriesModel, isHorizontalOrRadial, coord.type === 'polar');
+    }).update(function (newIndex, oldIndex) {
+      var el = oldData.getItemGraphicEl(oldIndex);
+
+      if (!data.hasValue(newIndex)) {
+        group.remove(el);
+        return;
+      }
+
+      var itemModel = data.getItemModel(newIndex);
+      var layout = getLayout[coord.type](data, newIndex, itemModel);
+
+      if (el) {
+        updateProps(el, {
+          shape: layout
+        }, animationModel, newIndex);
+      } else {
+        el = elementCreator[coord.type](data, newIndex, itemModel, layout, isHorizontalOrRadial, animationModel, true);
+      }
+
+      data.setItemGraphicEl(newIndex, el); // Add back
+
+      group.add(el);
+      updateStyle(el, data, newIndex, itemModel, layout, seriesModel, isHorizontalOrRadial, coord.type === 'polar');
+    }).remove(function (dataIndex) {
+      var el = oldData.getItemGraphicEl(dataIndex);
+
+      if (coord.type === 'cartesian2d') {
+        el && removeRect(dataIndex, animationModel, el);
+      } else {
+        el && removeSector(dataIndex, animationModel, el);
+      }
+    }).execute();
+    this._data = data;
+  },
+  _renderLarge: function (seriesModel, ecModel, api) {
+    this._clear();
+
+    createLarge(seriesModel, this.group);
+  },
+  _incrementalRenderLarge: function (params, seriesModel) {
+    createLarge(seriesModel, this.group, true);
+  },
+  dispose: noop,
+  remove: function (ecModel) {
+    this._clear(ecModel);
+  },
+  _clear: function (ecModel) {
+    var group = this.group;
+    var data = this._data;
+
+    if (ecModel && ecModel.get('animation') && data && !this._isLargeDraw) {
+      data.eachItemGraphicEl(function (el) {
+        if (el.type === 'sector') {
+          removeSector(el.dataIndex, ecModel, el);
+        } else {
+          removeRect(el.dataIndex, ecModel, el);
+        }
+      });
+    } else {
+      group.removeAll();
+    }
+
+    this._data = null;
+  }
+});
+var elementCreator = {
+  cartesian2d: function (data, dataIndex, itemModel, layout, isHorizontal, animationModel, isUpdate) {
+    var rect = new Rect({
+      shape: extend({}, layout)
+    }); // Animation
+
+    if (animationModel) {
+      var rectShape = rect.shape;
+      var animateProperty = isHorizontal ? 'height' : 'width';
+      var animateTarget = {};
+      rectShape[animateProperty] = 0;
+      animateTarget[animateProperty] = layout[animateProperty];
+      graphicUtil[isUpdate ? 'updateProps' : 'initProps'](rect, {
+        shape: animateTarget
+      }, animationModel, dataIndex);
+    }
+
+    return rect;
+  },
+  polar: function (data, dataIndex, itemModel, layout, isRadial, animationModel, isUpdate) {
+    // Keep the same logic with bar in catesion: use end value to control
+    // direction. Notice that if clockwise is true (by default), the sector
+    // will always draw clockwisely, no matter whether endAngle is greater
+    // or less than startAngle.
+    var clockwise = layout.startAngle < layout.endAngle;
+    var sector = new Sector({
+      shape: defaults({
+        clockwise: clockwise
+      }, layout)
+    }); // Animation
+
+    if (animationModel) {
+      var sectorShape = sector.shape;
+      var animateProperty = isRadial ? 'r' : 'endAngle';
+      var animateTarget = {};
+      sectorShape[animateProperty] = isRadial ? 0 : layout.startAngle;
+      animateTarget[animateProperty] = layout[animateProperty];
+      graphicUtil[isUpdate ? 'updateProps' : 'initProps'](sector, {
+        shape: animateTarget
+      }, animationModel, dataIndex);
+    }
+
+    return sector;
+  }
+};
+
+function removeRect(dataIndex, animationModel, el) {
+  // Not show text when animating
+  el.style.text = null;
+  updateProps(el, {
+    shape: {
+      width: 0
+    }
+  }, animationModel, dataIndex, function () {
+    el.parent && el.parent.remove(el);
+  });
+}
+
+function removeSector(dataIndex, animationModel, el) {
+  // Not show text when animating
+  el.style.text = null;
+  updateProps(el, {
+    shape: {
+      r: el.shape.r0
+    }
+  }, animationModel, dataIndex, function () {
+    el.parent && el.parent.remove(el);
+  });
+}
+
+var getLayout = {
+  cartesian2d: function (data, dataIndex, itemModel) {
+    var layout = data.getItemLayout(dataIndex);
+    var fixedLineWidth = getLineWidth(itemModel, layout); // fix layout with lineWidth
+
+    var signX = layout.width > 0 ? 1 : -1;
+    var signY = layout.height > 0 ? 1 : -1;
+    return {
+      x: layout.x + signX * fixedLineWidth / 2,
+      y: layout.y + signY * fixedLineWidth / 2,
+      width: layout.width - signX * fixedLineWidth,
+      height: layout.height - signY * fixedLineWidth
+    };
+  },
+  polar: function (data, dataIndex, itemModel) {
+    var layout = data.getItemLayout(dataIndex);
+    return {
+      cx: layout.cx,
+      cy: layout.cy,
+      r0: layout.r0,
+      r: layout.r,
+      startAngle: layout.startAngle,
+      endAngle: layout.endAngle
+    };
+  }
+};
+
+function updateStyle(el, data, dataIndex, itemModel, layout, seriesModel, isHorizontal, isPolar) {
+  var color = data.getItemVisual(dataIndex, 'color');
+  var opacity = data.getItemVisual(dataIndex, 'opacity');
+  var itemStyleModel = itemModel.getModel('itemStyle');
+  var hoverStyle = itemModel.getModel('emphasis.itemStyle').getBarItemStyle();
+
+  if (!isPolar) {
+    el.setShape('r', itemStyleModel.get('barBorderRadius') || 0);
+  }
+
+  el.useStyle(defaults({
+    fill: color,
+    opacity: opacity
+  }, itemStyleModel.getBarItemStyle()));
+  var cursorStyle = itemModel.getShallow('cursor');
+  cursorStyle && el.attr('cursor', cursorStyle);
+  var labelPositionOutside = isHorizontal ? layout.height > 0 ? 'bottom' : 'top' : layout.width > 0 ? 'left' : 'right';
+
+  if (!isPolar) {
+    setLabel(el.style, hoverStyle, itemModel, color, seriesModel, dataIndex, labelPositionOutside);
+  }
+
+  setHoverStyle(el, hoverStyle);
+} // In case width or height are too small.
+
+
+function getLineWidth(itemModel, rawLayout) {
+  var lineWidth = itemModel.get(BAR_BORDER_WIDTH_QUERY) || 0;
+  return Math.min(lineWidth, Math.abs(rawLayout.width), Math.abs(rawLayout.height));
+}
+
+var LargePath = Path.extend({
+  type: 'largeBar',
+  shape: {
+    points: []
+  },
+  buildPath: function (ctx, shape) {
+    // Drawing lines is more efficient than drawing
+    // a whole line or drawing rects.
+    var points = shape.points;
+    var startPoint = this.__startPoint;
+    var valueIdx = this.__valueIdx;
+
+    for (var i = 0; i < points.length; i += 2) {
+      startPoint[this.__valueIdx] = points[i + valueIdx];
+      ctx.moveTo(startPoint[0], startPoint[1]);
+      ctx.lineTo(points[i], points[i + 1]);
+    }
+  }
+});
+
+function createLarge(seriesModel, group, incremental) {
+  // TODO support polar
+  var data = seriesModel.getData();
+  var startPoint = [];
+  var valueIdx = data.getLayout('valueAxisHorizontal') ? 1 : 0;
+  startPoint[1 - valueIdx] = data.getLayout('valueAxisStart');
+  var el = new LargePath({
+    shape: {
+      points: data.getLayout('largePoints')
+    },
+    incremental: !!incremental,
+    __startPoint: startPoint,
+    __valueIdx: valueIdx
+  });
+  group.add(el);
+  setLargeStyle(el, seriesModel, data);
+}
+
+function setLargeStyle(el, seriesModel, data) {
+  var borderColor = data.getVisual('borderColor') || data.getVisual('color');
+  var itemStyle = seriesModel.getModel('itemStyle').getItemStyle(['color', 'borderColor']);
+  el.useStyle(itemStyle);
+  el.style.fill = null;
+  el.style.stroke = borderColor;
+  el.style.lineWidth = data.getLayout('barWidth');
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var PI$2 = Math.PI;
+
+function makeAxisEventDataBase(axisModel) {
+  var eventData = {
+    componentType: axisModel.mainType,
+    componentIndex: axisModel.componentIndex
+  };
+  eventData[axisModel.mainType + 'Index'] = axisModel.componentIndex;
+  return eventData;
+}
+/**
+ * A final axis is translated and rotated from a "standard axis".
+ * So opt.position and opt.rotation is required.
+ *
+ * A standard axis is and axis from [0, 0] to [0, axisExtent[1]],
+ * for example: (0, 0) ------------> (0, 50)
+ *
+ * nameDirection or tickDirection or labelDirection is 1 means tick
+ * or label is below the standard axis, whereas is -1 means above
+ * the standard axis. labelOffset means offset between label and axis,
+ * which is useful when 'onZero', where axisLabel is in the grid and
+ * label in outside grid.
+ *
+ * Tips: like always,
+ * positive rotation represents anticlockwise, and negative rotation
+ * represents clockwise.
+ * The direction of position coordinate is the same as the direction
+ * of screen coordinate.
+ *
+ * Do not need to consider axis 'inverse', which is auto processed by
+ * axis extent.
+ *
+ * @param {module:zrender/container/Group} group
+ * @param {Object} axisModel
+ * @param {Object} opt Standard axis parameters.
+ * @param {Array.<number>} opt.position [x, y]
+ * @param {number} opt.rotation by radian
+ * @param {number} [opt.nameDirection=1] 1 or -1 Used when nameLocation is 'middle' or 'center'.
+ * @param {number} [opt.tickDirection=1] 1 or -1
+ * @param {number} [opt.labelDirection=1] 1 or -1
+ * @param {number} [opt.labelOffset=0] Usefull when onZero.
+ * @param {string} [opt.axisLabelShow] default get from axisModel.
+ * @param {string} [opt.axisName] default get from axisModel.
+ * @param {number} [opt.axisNameAvailableWidth]
+ * @param {number} [opt.labelRotate] by degree, default get from axisModel.
+ * @param {number} [opt.strokeContainThreshold] Default label interval when label
+ * @param {number} [opt.nameTruncateMaxWidth]
+ */
+
+
+var AxisBuilder = function (axisModel, opt) {
+  /**
+   * @readOnly
+   */
+  this.opt = opt;
+  /**
+   * @readOnly
+   */
+
+  this.axisModel = axisModel; // Default value
+
+  defaults(opt, {
+    labelOffset: 0,
+    nameDirection: 1,
+    tickDirection: 1,
+    labelDirection: 1,
+    silent: true
+  });
+  /**
+   * @readOnly
+   */
+
+  this.group = new Group(); // FIXME Not use a seperate text group?
+
+  var dumbGroup = new Group({
+    position: opt.position.slice(),
+    rotation: opt.rotation
+  }); // this.group.add(dumbGroup);
+  // this._dumbGroup = dumbGroup;
+
+  dumbGroup.updateTransform();
+  this._transform = dumbGroup.transform;
+  this._dumbGroup = dumbGroup;
+};
+
+AxisBuilder.prototype = {
+  constructor: AxisBuilder,
+  hasBuilder: function (name) {
+    return !!builders[name];
+  },
+  add: function (name) {
+    builders[name].call(this);
+  },
+  getGroup: function () {
+    return this.group;
+  }
+};
+var builders = {
+  /**
+   * @private
+   */
+  axisLine: function () {
+    var opt = this.opt;
+    var axisModel = this.axisModel;
+
+    if (!axisModel.get('axisLine.show')) {
+      return;
+    }
+
+    var extent = this.axisModel.axis.getExtent();
+    var matrix = this._transform;
+    var pt1 = [extent[0], 0];
+    var pt2 = [extent[1], 0];
+
+    if (matrix) {
+      applyTransform(pt1, pt1, matrix);
+      applyTransform(pt2, pt2, matrix);
+    }
+
+    var lineStyle = extend({
+      lineCap: 'round'
+    }, axisModel.getModel('axisLine.lineStyle').getLineStyle());
+    this.group.add(new Line(subPixelOptimizeLine({
+      // Id for animation
+      anid: 'line',
+      shape: {
+        x1: pt1[0],
+        y1: pt1[1],
+        x2: pt2[0],
+        y2: pt2[1]
+      },
+      style: lineStyle,
+      strokeContainThreshold: opt.strokeContainThreshold || 5,
+      silent: true,
+      z2: 1
+    })));
+    var arrows = axisModel.get('axisLine.symbol');
+    var arrowSize = axisModel.get('axisLine.symbolSize');
+    var arrowOffset = axisModel.get('axisLine.symbolOffset') || 0;
+
+    if (typeof arrowOffset === 'number') {
+      arrowOffset = [arrowOffset, arrowOffset];
+    }
+
+    if (arrows != null) {
+      if (typeof arrows === 'string') {
+        // Use the same arrow for start and end point
+        arrows = [arrows, arrows];
+      }
+
+      if (typeof arrowSize === 'string' || typeof arrowSize === 'number') {
+        // Use the same size for width and height
+        arrowSize = [arrowSize, arrowSize];
+      }
+
+      var symbolWidth = arrowSize[0];
+      var symbolHeight = arrowSize[1];
+      each$1([{
+        rotate: opt.rotation + Math.PI / 2,
+        offset: arrowOffset[0],
+        r: 0
+      }, {
+        rotate: opt.rotation - Math.PI / 2,
+        offset: arrowOffset[1],
+        r: Math.sqrt((pt1[0] - pt2[0]) * (pt1[0] - pt2[0]) + (pt1[1] - pt2[1]) * (pt1[1] - pt2[1]))
+      }], function (point, index) {
+        if (arrows[index] !== 'none' && arrows[index] != null) {
+          var symbol = createSymbol(arrows[index], -symbolWidth / 2, -symbolHeight / 2, symbolWidth, symbolHeight, lineStyle.stroke, true); // Calculate arrow position with offset
+
+          var r = point.r + point.offset;
+          var pos = [pt1[0] + r * Math.cos(opt.rotation), pt1[1] - r * Math.sin(opt.rotation)];
+          symbol.attr({
+            rotation: point.rotate,
+            position: pos,
+            silent: true
+          });
+          this.group.add(symbol);
+        }
+      }, this);
+    }
+  },
+
+  /**
+   * @private
+   */
+  axisTickLabel: function () {
+    var axisModel = this.axisModel;
+    var opt = this.opt;
+    var tickEls = buildAxisTick(this, axisModel, opt);
+    var labelEls = buildAxisLabel(this, axisModel, opt);
+    fixMinMaxLabelShow(axisModel, labelEls, tickEls);
+  },
+
+  /**
+   * @private
+   */
+  axisName: function () {
+    var opt = this.opt;
+    var axisModel = this.axisModel;
+    var name = retrieve(opt.axisName, axisModel.get('name'));
+
+    if (!name) {
+      return;
+    }
+
+    var nameLocation = axisModel.get('nameLocation');
+    var nameDirection = opt.nameDirection;
+    var textStyleModel = axisModel.getModel('nameTextStyle');
+    var gap = axisModel.get('nameGap') || 0;
+    var extent = this.axisModel.axis.getExtent();
+    var gapSignal = extent[0] > extent[1] ? -1 : 1;
+    var pos = [nameLocation === 'start' ? extent[0] - gapSignal * gap : nameLocation === 'end' ? extent[1] + gapSignal * gap : (extent[0] + extent[1]) / 2, // 'middle'
+    // Reuse labelOffset.
+    isNameLocationCenter(nameLocation) ? opt.labelOffset + nameDirection * gap : 0];
+    var labelLayout;
+    var nameRotation = axisModel.get('nameRotate');
+
+    if (nameRotation != null) {
+      nameRotation = nameRotation * PI$2 / 180; // To radian.
+    }
+
+    var axisNameAvailableWidth;
+
+    if (isNameLocationCenter(nameLocation)) {
+      labelLayout = innerTextLayout(opt.rotation, nameRotation != null ? nameRotation : opt.rotation, // Adapt to axis.
+      nameDirection);
+    } else {
+      labelLayout = endTextLayout(opt, nameLocation, nameRotation || 0, extent);
+      axisNameAvailableWidth = opt.axisNameAvailableWidth;
+
+      if (axisNameAvailableWidth != null) {
+        axisNameAvailableWidth = Math.abs(axisNameAvailableWidth / Math.sin(labelLayout.rotation));
+        !isFinite(axisNameAvailableWidth) && (axisNameAvailableWidth = null);
+      }
+    }
+
+    var textFont = textStyleModel.getFont();
+    var truncateOpt = axisModel.get('nameTruncate', true) || {};
+    var ellipsis = truncateOpt.ellipsis;
+    var maxWidth = retrieve(opt.nameTruncateMaxWidth, truncateOpt.maxWidth, axisNameAvailableWidth); // FIXME
+    // truncate rich text? (consider performance)
+
+    var truncatedText = ellipsis != null && maxWidth != null ? truncateText$1(name, maxWidth, textFont, ellipsis, {
+      minChar: 2,
+      placeholder: truncateOpt.placeholder
+    }) : name;
+    var tooltipOpt = axisModel.get('tooltip', true);
+    var mainType = axisModel.mainType;
+    var formatterParams = {
+      componentType: mainType,
+      name: name,
+      $vars: ['name']
+    };
+    formatterParams[mainType + 'Index'] = axisModel.componentIndex;
+    var textEl = new Text({
+      // Id for animation
+      anid: 'name',
+      __fullText: name,
+      __truncatedText: truncatedText,
+      position: pos,
+      rotation: labelLayout.rotation,
+      silent: isSilent(axisModel),
+      z2: 1,
+      tooltip: tooltipOpt && tooltipOpt.show ? extend({
+        content: name,
+        formatter: function () {
+          return name;
+        },
+        formatterParams: formatterParams
+      }, tooltipOpt) : null
+    });
+    setTextStyle(textEl.style, textStyleModel, {
+      text: truncatedText,
+      textFont: textFont,
+      textFill: textStyleModel.getTextColor() || axisModel.get('axisLine.lineStyle.color'),
+      textAlign: labelLayout.textAlign,
+      textVerticalAlign: labelLayout.textVerticalAlign
+    });
+
+    if (axisModel.get('triggerEvent')) {
+      textEl.eventData = makeAxisEventDataBase(axisModel);
+      textEl.eventData.targetType = 'axisName';
+      textEl.eventData.name = name;
+    } // FIXME
+
+
+    this._dumbGroup.add(textEl);
+
+    textEl.updateTransform();
+    this.group.add(textEl);
+    textEl.decomposeTransform();
+  }
+};
+/**
+ * @public
+ * @static
+ * @param {Object} opt
+ * @param {number} axisRotation in radian
+ * @param {number} textRotation in radian
+ * @param {number} direction
+ * @return {Object} {
+ *  rotation, // according to axis
+ *  textAlign,
+ *  textVerticalAlign
+ * }
+ */
+
+var innerTextLayout = AxisBuilder.innerTextLayout = function (axisRotation, textRotation, direction) {
+  var rotationDiff = remRadian(textRotation - axisRotation);
+  var textAlign;
+  var textVerticalAlign;
+
+  if (isRadianAroundZero(rotationDiff)) {
+    // Label is parallel with axis line.
+    textVerticalAlign = direction > 0 ? 'top' : 'bottom';
+    textAlign = 'center';
+  } else if (isRadianAroundZero(rotationDiff - PI$2)) {
+    // Label is inverse parallel with axis line.
+    textVerticalAlign = direction > 0 ? 'bottom' : 'top';
+    textAlign = 'center';
+  } else {
+    textVerticalAlign = 'middle';
+
+    if (rotationDiff > 0 && rotationDiff < PI$2) {
+      textAlign = direction > 0 ? 'right' : 'left';
+    } else {
+      textAlign = direction > 0 ? 'left' : 'right';
+    }
+  }
+
+  return {
+    rotation: rotationDiff,
+    textAlign: textAlign,
+    textVerticalAlign: textVerticalAlign
+  };
+};
+
+function endTextLayout(opt, textPosition, textRotate, extent) {
+  var rotationDiff = remRadian(textRotate - opt.rotation);
+  var textAlign;
+  var textVerticalAlign;
+  var inverse = extent[0] > extent[1];
+  var onLeft = textPosition === 'start' && !inverse || textPosition !== 'start' && inverse;
+
+  if (isRadianAroundZero(rotationDiff - PI$2 / 2)) {
+    textVerticalAlign = onLeft ? 'bottom' : 'top';
+    textAlign = 'center';
+  } else if (isRadianAroundZero(rotationDiff - PI$2 * 1.5)) {
+    textVerticalAlign = onLeft ? 'top' : 'bottom';
+    textAlign = 'center';
+  } else {
+    textVerticalAlign = 'middle';
+
+    if (rotationDiff < PI$2 * 1.5 && rotationDiff > PI$2 / 2) {
+      textAlign = onLeft ? 'left' : 'right';
+    } else {
+      textAlign = onLeft ? 'right' : 'left';
+    }
+  }
+
+  return {
+    rotation: rotationDiff,
+    textAlign: textAlign,
+    textVerticalAlign: textVerticalAlign
+  };
+}
+
+function isSilent(axisModel) {
+  var tooltipOpt = axisModel.get('tooltip');
+  return axisModel.get('silent') // Consider mouse cursor, add these restrictions.
+  || !(axisModel.get('triggerEvent') || tooltipOpt && tooltipOpt.show);
+}
+
+function fixMinMaxLabelShow(axisModel, labelEls, tickEls) {
+  // If min or max are user set, we need to check
+  // If the tick on min(max) are overlap on their neighbour tick
+  // If they are overlapped, we need to hide the min(max) tick label
+  var showMinLabel = axisModel.get('axisLabel.showMinLabel');
+  var showMaxLabel = axisModel.get('axisLabel.showMaxLabel'); // FIXME
+  // Have not consider onBand yet, where tick els is more than label els.
+
+  labelEls = labelEls || [];
+  tickEls = tickEls || [];
+  var firstLabel = labelEls[0];
+  var nextLabel = labelEls[1];
+  var lastLabel = labelEls[labelEls.length - 1];
+  var prevLabel = labelEls[labelEls.length - 2];
+  var firstTick = tickEls[0];
+  var nextTick = tickEls[1];
+  var lastTick = tickEls[tickEls.length - 1];
+  var prevTick = tickEls[tickEls.length - 2];
+
+  if (showMinLabel === false) {
+    ignoreEl(firstLabel);
+    ignoreEl(firstTick);
+  } else if (isTwoLabelOverlapped(firstLabel, nextLabel)) {
+    if (showMinLabel) {
+      ignoreEl(nextLabel);
+      ignoreEl(nextTick);
+    } else {
+      ignoreEl(firstLabel);
+      ignoreEl(firstTick);
+    }
+  }
+
+  if (showMaxLabel === false) {
+    ignoreEl(lastLabel);
+    ignoreEl(lastTick);
+  } else if (isTwoLabelOverlapped(prevLabel, lastLabel)) {
+    if (showMaxLabel) {
+      ignoreEl(prevLabel);
+      ignoreEl(prevTick);
+    } else {
+      ignoreEl(lastLabel);
+      ignoreEl(lastTick);
+    }
+  }
+}
+
+function ignoreEl(el) {
+  el && (el.ignore = true);
+}
+
+function isTwoLabelOverlapped(current, next, labelLayout) {
+  // current and next has the same rotation.
+  var firstRect = current && current.getBoundingRect().clone();
+  var nextRect = next && next.getBoundingRect().clone();
+
+  if (!firstRect || !nextRect) {
+    return;
+  } // When checking intersect of two rotated labels, we use mRotationBack
+  // to avoid that boundingRect is enlarge when using `boundingRect.applyTransform`.
+
+
+  var mRotationBack = identity([]);
+  rotate(mRotationBack, mRotationBack, -current.rotation);
+  firstRect.applyTransform(mul$1([], mRotationBack, current.getLocalTransform()));
+  nextRect.applyTransform(mul$1([], mRotationBack, next.getLocalTransform()));
+  return firstRect.intersect(nextRect);
+}
+
+function isNameLocationCenter(nameLocation) {
+  return nameLocation === 'middle' || nameLocation === 'center';
+}
+
+function buildAxisTick(axisBuilder, axisModel, opt) {
+  var axis = axisModel.axis;
+
+  if (!axisModel.get('axisTick.show') || axis.scale.isBlank()) {
+    return;
+  }
+
+  var tickModel = axisModel.getModel('axisTick');
+  var lineStyleModel = tickModel.getModel('lineStyle');
+  var tickLen = tickModel.get('length');
+  var ticksCoords = axis.getTicksCoords();
+  var pt1 = [];
+  var pt2 = [];
+  var matrix = axisBuilder._transform;
+  var tickEls = [];
+
+  for (var i = 0; i < ticksCoords.length; i++) {
+    var tickCoord = ticksCoords[i].coord;
+    pt1[0] = tickCoord;
+    pt1[1] = 0;
+    pt2[0] = tickCoord;
+    pt2[1] = opt.tickDirection * tickLen;
+
+    if (matrix) {
+      applyTransform(pt1, pt1, matrix);
+      applyTransform(pt2, pt2, matrix);
+    } // Tick line, Not use group transform to have better line draw
+
+
+    var tickEl = new Line(subPixelOptimizeLine({
+      // Id for animation
+      anid: 'tick_' + ticksCoords[i].tickValue,
+      shape: {
+        x1: pt1[0],
+        y1: pt1[1],
+        x2: pt2[0],
+        y2: pt2[1]
+      },
+      style: defaults(lineStyleModel.getLineStyle(), {
+        stroke: axisModel.get('axisLine.lineStyle.color')
+      }),
+      z2: 2,
+      silent: true
+    }));
+    axisBuilder.group.add(tickEl);
+    tickEls.push(tickEl);
+  }
+
+  return tickEls;
+}
+
+function buildAxisLabel(axisBuilder, axisModel, opt) {
+  var axis = axisModel.axis;
+  var show = retrieve(opt.axisLabelShow, axisModel.get('axisLabel.show'));
+
+  if (!show || axis.scale.isBlank()) {
+    return;
+  }
+
+  var labelModel = axisModel.getModel('axisLabel');
+  var labelMargin = labelModel.get('margin');
+  var labels = axis.getViewLabels(); // Special label rotate.
+
+  var labelRotation = (retrieve(opt.labelRotate, labelModel.get('rotate')) || 0) * PI$2 / 180;
+  var labelLayout = innerTextLayout(opt.rotation, labelRotation, opt.labelDirection);
+  var rawCategoryData = axisModel.getCategories(true);
+  var labelEls = [];
+  var silent = isSilent(axisModel);
+  var triggerEvent = axisModel.get('triggerEvent');
+  each$1(labels, function (labelItem, index) {
+    var tickValue = labelItem.tickValue;
+    var formattedLabel = labelItem.formattedLabel;
+    var rawLabel = labelItem.rawLabel;
+    var itemLabelModel = labelModel;
+
+    if (rawCategoryData && rawCategoryData[tickValue] && rawCategoryData[tickValue].textStyle) {
+      itemLabelModel = new Model(rawCategoryData[tickValue].textStyle, labelModel, axisModel.ecModel);
+    }
+
+    var textColor = itemLabelModel.getTextColor() || axisModel.get('axisLine.lineStyle.color');
+    var tickCoord = axis.dataToCoord(tickValue);
+    var pos = [tickCoord, opt.labelOffset + opt.labelDirection * labelMargin];
+    var textEl = new Text({
+      // Id for animation
+      anid: 'label_' + tickValue,
+      position: pos,
+      rotation: labelLayout.rotation,
+      silent: silent,
+      z2: 10
+    });
+    setTextStyle(textEl.style, itemLabelModel, {
+      text: formattedLabel,
+      textAlign: itemLabelModel.getShallow('align', true) || labelLayout.textAlign,
+      textVerticalAlign: itemLabelModel.getShallow('verticalAlign', true) || itemLabelModel.getShallow('baseline', true) || labelLayout.textVerticalAlign,
+      textFill: typeof textColor === 'function' ? textColor( // (1) In category axis with data zoom, tick is not the original
+      // index of axis.data. So tick should not be exposed to user
+      // in category axis.
+      // (2) Compatible with previous version, which always use formatted label as
+      // input. But in interval scale the formatted label is like '223,445', which
+      // maked user repalce ','. So we modify it to return original val but remain
+      // it as 'string' to avoid error in replacing.
+      axis.type === 'category' ? rawLabel : axis.type === 'value' ? tickValue + '' : tickValue, index) : textColor
+    }); // Pack data for mouse event
+
+    if (triggerEvent) {
+      textEl.eventData = makeAxisEventDataBase(axisModel);
+      textEl.eventData.targetType = 'axisLabel';
+      textEl.eventData.value = rawLabel;
+    } // FIXME
+
+
+    axisBuilder._dumbGroup.add(textEl);
+
+    textEl.updateTransform();
+    labelEls.push(textEl);
+    axisBuilder.group.add(textEl);
+    textEl.decomposeTransform();
+  });
+  return labelEls;
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var each$6 = each$1;
+var curry$1 = curry; // Build axisPointerModel, mergin tooltip.axisPointer model for each axis.
+// allAxesInfo should be updated when setOption performed.
+
+function collect(ecModel, api) {
+  var result = {
+    /**
+     * key: makeKey(axis.model)
+     * value: {
+     *      axis,
+     *      coordSys,
+     *      axisPointerModel,
+     *      triggerTooltip,
+     *      involveSeries,
+     *      snap,
+     *      seriesModels,
+     *      seriesDataCount
+     * }
+     */
+    axesInfo: {},
+    seriesInvolved: false,
+
+    /**
+     * key: makeKey(coordSys.model)
+     * value: Object: key makeKey(axis.model), value: axisInfo
+     */
+    coordSysAxesInfo: {},
+    coordSysMap: {}
+  };
+  collectAxesInfo(result, ecModel, api); // Check seriesInvolved for performance, in case too many series in some chart.
+
+  result.seriesInvolved && collectSeriesInfo(result, ecModel);
+  return result;
+}
+
+function collectAxesInfo(result, ecModel, api) {
+  var globalTooltipModel = ecModel.getComponent('tooltip');
+  var globalAxisPointerModel = ecModel.getComponent('axisPointer'); // links can only be set on global.
+
+  var linksOption = globalAxisPointerModel.get('link', true) || [];
+  var linkGroups = []; // Collect axes info.
+
+  each$6(api.getCoordinateSystems(), function (coordSys) {
+    // Some coordinate system do not support axes, like geo.
+    if (!coordSys.axisPointerEnabled) {
+      return;
+    }
+
+    var coordSysKey = makeKey(coordSys.model);
+    var axesInfoInCoordSys = result.coordSysAxesInfo[coordSysKey] = {};
+    result.coordSysMap[coordSysKey] = coordSys; // Set tooltip (like 'cross') is a convienent way to show axisPointer
+    // for user. So we enable seting tooltip on coordSys model.
+
+    var coordSysModel = coordSys.model;
+    var baseTooltipModel = coordSysModel.getModel('tooltip', globalTooltipModel);
+    each$6(coordSys.getAxes(), curry$1(saveTooltipAxisInfo, false, null)); // If axis tooltip used, choose tooltip axis for each coordSys.
+    // Notice this case: coordSys is `grid` but not `cartesian2D` here.
+
+    if (coordSys.getTooltipAxes && globalTooltipModel // If tooltip.showContent is set as false, tooltip will not
+    // show but axisPointer will show as normal.
+    && baseTooltipModel.get('show')) {
+      // Compatible with previous logic. But series.tooltip.trigger: 'axis'
+      // or series.data[n].tooltip.trigger: 'axis' are not support any more.
+      var triggerAxis = baseTooltipModel.get('trigger') === 'axis';
+      var cross = baseTooltipModel.get('axisPointer.type') === 'cross';
+      var tooltipAxes = coordSys.getTooltipAxes(baseTooltipModel.get('axisPointer.axis'));
+
+      if (triggerAxis || cross) {
+        each$6(tooltipAxes.baseAxes, curry$1(saveTooltipAxisInfo, cross ? 'cross' : true, triggerAxis));
+      }
+
+      if (cross) {
+        each$6(tooltipAxes.otherAxes, curry$1(saveTooltipAxisInfo, 'cross', false));
+      }
+    } // fromTooltip: true | false | 'cross'
+    // triggerTooltip: true | false | null
+
+
+    function saveTooltipAxisInfo(fromTooltip, triggerTooltip, axis) {
+      var axisPointerModel = axis.model.getModel('axisPointer', globalAxisPointerModel);
+      var axisPointerShow = axisPointerModel.get('show');
+
+      if (!axisPointerShow || axisPointerShow === 'auto' && !fromTooltip && !isHandleTrigger(axisPointerModel)) {
+        return;
+      }
+
+      if (triggerTooltip == null) {
+        triggerTooltip = axisPointerModel.get('triggerTooltip');
+      }
+
+      axisPointerModel = fromTooltip ? makeAxisPointerModel(axis, baseTooltipModel, globalAxisPointerModel, ecModel, fromTooltip, triggerTooltip) : axisPointerModel;
+      var snap = axisPointerModel.get('snap');
+      var key = makeKey(axis.model);
+      var involveSeries = triggerTooltip || snap || axis.type === 'category'; // If result.axesInfo[key] exist, override it (tooltip has higher priority).
+
+      var axisInfo = result.axesInfo[key] = {
+        key: key,
+        axis: axis,
+        coordSys: coordSys,
+        axisPointerModel: axisPointerModel,
+        triggerTooltip: triggerTooltip,
+        involveSeries: involveSeries,
+        snap: snap,
+        useHandle: isHandleTrigger(axisPointerModel),
+        seriesModels: []
+      };
+      axesInfoInCoordSys[key] = axisInfo;
+      result.seriesInvolved |= involveSeries;
+      var groupIndex = getLinkGroupIndex(linksOption, axis);
+
+      if (groupIndex != null) {
+        var linkGroup = linkGroups[groupIndex] || (linkGroups[groupIndex] = {
+          axesInfo: {}
+        });
+        linkGroup.axesInfo[key] = axisInfo;
+        linkGroup.mapper = linksOption[groupIndex].mapper;
+        axisInfo.linkGroup = linkGroup;
+      }
+    }
+  });
+}
+
+function makeAxisPointerModel(axis, baseTooltipModel, globalAxisPointerModel, ecModel, fromTooltip, triggerTooltip) {
+  var tooltipAxisPointerModel = baseTooltipModel.getModel('axisPointer');
+  var volatileOption = {};
+  each$6(['type', 'snap', 'lineStyle', 'shadowStyle', 'label', 'animation', 'animationDurationUpdate', 'animationEasingUpdate', 'z'], function (field) {
+    volatileOption[field] = clone(tooltipAxisPointerModel.get(field));
+  }); // category axis do not auto snap, otherwise some tick that do not
+  // has value can not be hovered. value/time/log axis default snap if
+  // triggered from tooltip and trigger tooltip.
+
+  volatileOption.snap = axis.type !== 'category' && !!triggerTooltip; // Compatibel with previous behavior, tooltip axis do not show label by default.
+  // Only these properties can be overrided from tooltip to axisPointer.
+
+  if (tooltipAxisPointerModel.get('type') === 'cross') {
+    volatileOption.type = 'line';
+  }
+
+  var labelOption = volatileOption.label || (volatileOption.label = {}); // Follow the convention, do not show label when triggered by tooltip by default.
+
+  labelOption.show == null && (labelOption.show = false);
+
+  if (fromTooltip === 'cross') {
+    // When 'cross', both axes show labels.
+    var tooltipAxisPointerLabelShow = tooltipAxisPointerModel.get('label.show');
+    labelOption.show = tooltipAxisPointerLabelShow != null ? tooltipAxisPointerLabelShow : true; // If triggerTooltip, this is a index axis, which should better not use cross style
+    // (cross style is dashed by default)
+
+    if (!triggerTooltip) {
+      var crossStyle = volatileOption.lineStyle = tooltipAxisPointerModel.get('crossStyle');
+      crossStyle && defaults(labelOption, crossStyle.textStyle);
+    }
+  }
+
+  return axis.model.getModel('axisPointer', new Model(volatileOption, globalAxisPointerModel, ecModel));
+}
+
+function collectSeriesInfo(result, ecModel) {
+  // Prepare data for axis trigger
+  ecModel.eachSeries(function (seriesModel) {
+    // Notice this case: this coordSys is `cartesian2D` but not `grid`.
+    var coordSys = seriesModel.coordinateSystem;
+    var seriesTooltipTrigger = seriesModel.get('tooltip.trigger', true);
+    var seriesTooltipShow = seriesModel.get('tooltip.show', true);
+
+    if (!coordSys || seriesTooltipTrigger === 'none' || seriesTooltipTrigger === false || seriesTooltipTrigger === 'item' || seriesTooltipShow === false || seriesModel.get('axisPointer.show', true) === false) {
+      return;
+    }
+
+    each$6(result.coordSysAxesInfo[makeKey(coordSys.model)], function (axisInfo) {
+      var axis = axisInfo.axis;
+
+      if (coordSys.getAxis(axis.dim) === axis) {
+        axisInfo.seriesModels.push(seriesModel);
+        axisInfo.seriesDataCount == null && (axisInfo.seriesDataCount = 0);
+        axisInfo.seriesDataCount += seriesModel.getData().count();
+      }
+    });
+  }, this);
+}
+/**
+ * For example:
+ * {
+ *     axisPointer: {
+ *         links: [{
+ *             xAxisIndex: [2, 4],
+ *             yAxisIndex: 'all'
+ *         }, {
+ *             xAxisId: ['a5', 'a7'],
+ *             xAxisName: 'xxx'
+ *         }]
+ *     }
+ * }
+ */
+
+
+function getLinkGroupIndex(linksOption, axis) {
+  var axisModel = axis.model;
+  var dim = axis.dim;
+
+  for (var i = 0; i < linksOption.length; i++) {
+    var linkOption = linksOption[i] || {};
+
+    if (checkPropInLink(linkOption[dim + 'AxisId'], axisModel.id) || checkPropInLink(linkOption[dim + 'AxisIndex'], axisModel.componentIndex) || checkPropInLink(linkOption[dim + 'AxisName'], axisModel.name)) {
+      return i;
+    }
+  }
+}
+
+function checkPropInLink(linkPropValue, axisPropValue) {
+  return linkPropValue === 'all' || isArray(linkPropValue) && indexOf(linkPropValue, axisPropValue) >= 0 || linkPropValue === axisPropValue;
+}
+
+function fixValue(axisModel) {
+  var axisInfo = getAxisInfo(axisModel);
+
+  if (!axisInfo) {
+    return;
+  }
+
+  var axisPointerModel = axisInfo.axisPointerModel;
+  var scale = axisInfo.axis.scale;
+  var option = axisPointerModel.option;
+  var status = axisPointerModel.get('status');
+  var value = axisPointerModel.get('value'); // Parse init value for category and time axis.
+
+  if (value != null) {
+    value = scale.parse(value);
+  }
+
+  var useHandle = isHandleTrigger(axisPointerModel); // If `handle` used, `axisPointer` will always be displayed, so value
+  // and status should be initialized.
+
+  if (status == null) {
+    option.status = useHandle ? 'show' : 'hide';
+  }
+
+  var extent = scale.getExtent().slice();
+  extent[0] > extent[1] && extent.reverse();
+
+  if ( // Pick a value on axis when initializing.
+  value == null // If both `handle` and `dataZoom` are used, value may be out of axis extent,
+  // where we should re-pick a value to keep `handle` displaying normally.
+  || value > extent[1]) {
+    // Make handle displayed on the end of the axis when init, which looks better.
+    value = extent[1];
+  }
+
+  if (value < extent[0]) {
+    value = extent[0];
+  }
+
+  option.value = value;
+
+  if (useHandle) {
+    option.status = axisInfo.axis.scale.isBlank() ? 'hide' : 'show';
+  }
+}
+function getAxisInfo(axisModel) {
+  var coordSysAxesInfo = (axisModel.ecModel.getComponent('axisPointer') || {}).coordSysAxesInfo;
+  return coordSysAxesInfo && coordSysAxesInfo.axesInfo[makeKey(axisModel)];
+}
+function getAxisPointerModel(axisModel) {
+  var axisInfo = getAxisInfo(axisModel);
+  return axisInfo && axisInfo.axisPointerModel;
+}
+
+function isHandleTrigger(axisPointerModel) {
+  return !!axisPointerModel.get('handle.show');
+}
+/**
+ * @param {module:echarts/model/Model} model
+ * @return {string} unique key
+ */
+
+
+function makeKey(model) {
+  return model.type + '||' + model.id;
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+/**
+ * Base class of AxisView.
+ */
+
+var AxisView = extendComponentView({
+  type: 'axis',
+
+  /**
+   * @private
+   */
+  _axisPointer: null,
+
+  /**
+   * @protected
+   * @type {string}
+   */
+  axisPointerClass: null,
+
+  /**
+   * @override
+   */
+  render: function (axisModel, ecModel, api, payload) {
+    // FIXME
+    // This process should proformed after coordinate systems updated
+    // (axis scale updated), and should be performed each time update.
+    // So put it here temporarily, although it is not appropriate to
+    // put a model-writing procedure in `view`.
+    this.axisPointerClass && fixValue(axisModel);
+    AxisView.superApply(this, 'render', arguments);
+    updateAxisPointer(this, axisModel, ecModel, api, payload, true);
+  },
+
+  /**
+   * Action handler.
+   * @public
+   * @param {module:echarts/coord/cartesian/AxisModel} axisModel
+   * @param {module:echarts/model/Global} ecModel
+   * @param {module:echarts/ExtensionAPI} api
+   * @param {Object} payload
+   */
+  updateAxisPointer: function (axisModel, ecModel, api, payload, force) {
+    updateAxisPointer(this, axisModel, ecModel, api, payload, false);
+  },
+
+  /**
+   * @override
+   */
+  remove: function (ecModel, api) {
+    var axisPointer = this._axisPointer;
+    axisPointer && axisPointer.remove(api);
+    AxisView.superApply(this, 'remove', arguments);
+  },
+
+  /**
+   * @override
+   */
+  dispose: function (ecModel, api) {
+    disposeAxisPointer(this, api);
+    AxisView.superApply(this, 'dispose', arguments);
+  }
+});
+
+function updateAxisPointer(axisView, axisModel, ecModel, api, payload, forceRender) {
+  var Clazz = AxisView.getAxisPointerClass(axisView.axisPointerClass);
+
+  if (!Clazz) {
+    return;
+  }
+
+  var axisPointerModel = getAxisPointerModel(axisModel);
+  axisPointerModel ? (axisView._axisPointer || (axisView._axisPointer = new Clazz())).render(axisModel, axisPointerModel, api, forceRender) : disposeAxisPointer(axisView, api);
+}
+
+function disposeAxisPointer(axisView, ecModel, api) {
+  var axisPointer = axisView._axisPointer;
+  axisPointer && axisPointer.dispose(ecModel, api);
+  axisView._axisPointer = null;
+}
+
+var axisPointerClazz = [];
+
+AxisView.registerAxisPointerClass = function (type, clazz) {
+  axisPointerClazz[type] = clazz;
+};
+
+AxisView.getAxisPointerClass = function (type) {
+  return type && axisPointerClazz[type];
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+/**
+ * Can only be called after coordinate system creation stage.
+ * (Can be called before coordinate system update stage).
+ *
+ * @param {Object} opt {labelInside}
+ * @return {Object} {
+ *  position, rotation, labelDirection, labelOffset,
+ *  tickDirection, labelRotate, z2
+ * }
+ */
+
+function layout$1(gridModel, axisModel, opt) {
+  opt = opt || {};
+  var grid = gridModel.coordinateSystem;
+  var axis = axisModel.axis;
+  var layout = {};
+  var otherAxisOnZeroOf = axis.getAxesOnZeroOf()[0];
+  var rawAxisPosition = axis.position;
+  var axisPosition = otherAxisOnZeroOf ? 'onZero' : rawAxisPosition;
+  var axisDim = axis.dim;
+  var rect = grid.getRect();
+  var rectBound = [rect.x, rect.x + rect.width, rect.y, rect.y + rect.height];
+  var idx = {
+    left: 0,
+    right: 1,
+    top: 0,
+    bottom: 1,
+    onZero: 2
+  };
+  var axisOffset = axisModel.get('offset') || 0;
+  var posBound = axisDim === 'x' ? [rectBound[2] - axisOffset, rectBound[3] + axisOffset] : [rectBound[0] - axisOffset, rectBound[1] + axisOffset];
+
+  if (otherAxisOnZeroOf) {
+    var onZeroCoord = otherAxisOnZeroOf.toGlobalCoord(otherAxisOnZeroOf.dataToCoord(0));
+    posBound[idx.onZero] = Math.max(Math.min(onZeroCoord, posBound[1]), posBound[0]);
+  } // Axis position
+
+
+  layout.position = [axisDim === 'y' ? posBound[idx[axisPosition]] : rectBound[0], axisDim === 'x' ? posBound[idx[axisPosition]] : rectBound[3]]; // Axis rotation
+
+  layout.rotation = Math.PI / 2 * (axisDim === 'x' ? 0 : 1); // Tick and label direction, x y is axisDim
+
+  var dirMap = {
+    top: -1,
+    bottom: 1,
+    left: -1,
+    right: 1
+  };
+  layout.labelDirection = layout.tickDirection = layout.nameDirection = dirMap[rawAxisPosition];
+  layout.labelOffset = otherAxisOnZeroOf ? posBound[idx[rawAxisPosition]] - posBound[idx.onZero] : 0;
+
+  if (axisModel.get('axisTick.inside')) {
+    layout.tickDirection = -layout.tickDirection;
+  }
+
+  if (retrieve(opt.labelInside, axisModel.get('axisLabel.inside'))) {
+    layout.labelDirection = -layout.labelDirection;
+  } // Special label rotation
+
+
+  var labelRotate = axisModel.get('axisLabel.rotate');
+  layout.labelRotate = axisPosition === 'top' ? -labelRotate : labelRotate; // Over splitLine and splitArea
+
+  layout.z2 = 1;
+  return layout;
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var axisBuilderAttrs = ['axisLine', 'axisTickLabel', 'axisName'];
+var selfBuilderAttrs = ['splitArea', 'splitLine']; // function getAlignWithLabel(model, axisModel) {
+//     var alignWithLabel = model.get('alignWithLabel');
+//     if (alignWithLabel === 'auto') {
+//         alignWithLabel = axisModel.get('axisTick.alignWithLabel');
+//     }
+//     return alignWithLabel;
+// }
+
+var CartesianAxisView = AxisView.extend({
+  type: 'cartesianAxis',
+  axisPointerClass: 'CartesianAxisPointer',
+
+  /**
+   * @override
+   */
+  render: function (axisModel, ecModel, api, payload) {
+    this.group.removeAll();
+    var oldAxisGroup = this._axisGroup;
+    this._axisGroup = new Group();
+    this.group.add(this._axisGroup);
+
+    if (!axisModel.get('show')) {
+      return;
+    }
+
+    var gridModel = axisModel.getCoordSysModel();
+    var layout = layout$1(gridModel, axisModel);
+    var axisBuilder = new AxisBuilder(axisModel, layout);
+    each$1(axisBuilderAttrs, axisBuilder.add, axisBuilder);
+
+    this._axisGroup.add(axisBuilder.getGroup());
+
+    each$1(selfBuilderAttrs, function (name) {
+      if (axisModel.get(name + '.show')) {
+        this['_' + name](axisModel, gridModel);
+      }
+    }, this);
+    groupTransition(oldAxisGroup, this._axisGroup, axisModel);
+    CartesianAxisView.superCall(this, 'render', axisModel, ecModel, api, payload);
+  },
+  remove: function () {
+    this._splitAreaColors = null;
+  },
+
+  /**
+   * @param {module:echarts/coord/cartesian/AxisModel} axisModel
+   * @param {module:echarts/coord/cartesian/GridModel} gridModel
+   * @private
+   */
+  _splitLine: function (axisModel, gridModel) {
+    var axis = axisModel.axis;
+
+    if (axis.scale.isBlank()) {
+      return;
+    }
+
+    var splitLineModel = axisModel.getModel('splitLine');
+    var lineStyleModel = splitLineModel.getModel('lineStyle');
+    var lineColors = lineStyleModel.get('color');
+    lineColors = isArray(lineColors) ? lineColors : [lineColors];
+    var gridRect = gridModel.coordinateSystem.getRect();
+    var isHorizontal = axis.isHorizontal();
+    var lineCount = 0;
+    var ticksCoords = axis.getTicksCoords({
+      tickModel: splitLineModel
+    });
+    var p1 = [];
+    var p2 = []; // Simple optimization
+    // Batching the lines if color are the same
+
+    var lineStyle = lineStyleModel.getLineStyle();
+
+    for (var i = 0; i < ticksCoords.length; i++) {
+      var tickCoord = axis.toGlobalCoord(ticksCoords[i].coord);
+
+      if (isHorizontal) {
+        p1[0] = tickCoord;
+        p1[1] = gridRect.y;
+        p2[0] = tickCoord;
+        p2[1] = gridRect.y + gridRect.height;
+      } else {
+        p1[0] = gridRect.x;
+        p1[1] = tickCoord;
+        p2[0] = gridRect.x + gridRect.width;
+        p2[1] = tickCoord;
+      }
+
+      var colorIndex = lineCount++ % lineColors.length;
+      var tickValue = ticksCoords[i].tickValue;
+
+      this._axisGroup.add(new Line(subPixelOptimizeLine({
+        anid: tickValue != null ? 'line_' + ticksCoords[i].tickValue : null,
+        shape: {
+          x1: p1[0],
+          y1: p1[1],
+          x2: p2[0],
+          y2: p2[1]
+        },
+        style: defaults({
+          stroke: lineColors[colorIndex]
+        }, lineStyle),
+        silent: true
+      })));
+    }
+  },
+
+  /**
+   * @param {module:echarts/coord/cartesian/AxisModel} axisModel
+   * @param {module:echarts/coord/cartesian/GridModel} gridModel
+   * @private
+   */
+  _splitArea: function (axisModel, gridModel) {
+    var axis = axisModel.axis;
+
+    if (axis.scale.isBlank()) {
+      return;
+    }
+
+    var splitAreaModel = axisModel.getModel('splitArea');
+    var areaStyleModel = splitAreaModel.getModel('areaStyle');
+    var areaColors = areaStyleModel.get('color');
+    var gridRect = gridModel.coordinateSystem.getRect();
+    var ticksCoords = axis.getTicksCoords({
+      tickModel: splitAreaModel,
+      clamp: true
+    });
+
+    if (!ticksCoords.length) {
+      return;
+    } // For Making appropriate splitArea animation, the color and anid
+    // should be corresponding to previous one if possible.
+
+
+    var areaColorsLen = areaColors.length;
+    var lastSplitAreaColors = this._splitAreaColors;
+    var newSplitAreaColors = createHashMap();
+    var colorIndex = 0;
+
+    if (lastSplitAreaColors) {
+      for (var i = 0; i < ticksCoords.length; i++) {
+        var cIndex = lastSplitAreaColors.get(ticksCoords[i].tickValue);
+
+        if (cIndex != null) {
+          colorIndex = (cIndex + (areaColorsLen - 1) * i) % areaColorsLen;
+          break;
+        }
+      }
+    }
+
+    var prev = axis.toGlobalCoord(ticksCoords[0].coord);
+    var areaStyle = areaStyleModel.getAreaStyle();
+    areaColors = isArray(areaColors) ? areaColors : [areaColors];
+
+    for (var i = 1; i < ticksCoords.length; i++) {
+      var tickCoord = axis.toGlobalCoord(ticksCoords[i].coord);
+      var x;
+      var y;
+      var width;
+      var height;
+
+      if (axis.isHorizontal()) {
+        x = prev;
+        y = gridRect.y;
+        width = tickCoord - x;
+        height = gridRect.height;
+        prev = x + width;
+      } else {
+        x = gridRect.x;
+        y = prev;
+        width = gridRect.width;
+        height = tickCoord - y;
+        prev = y + height;
+      }
+
+      var tickValue = ticksCoords[i - 1].tickValue;
+      tickValue != null && newSplitAreaColors.set(tickValue, colorIndex);
+
+      this._axisGroup.add(new Rect({
+        anid: tickValue != null ? 'area_' + tickValue : null,
+        shape: {
+          x: x,
+          y: y,
+          width: width,
+          height: height
+        },
+        style: defaults({
+          fill: areaColors[colorIndex]
+        }, areaStyle),
+        silent: true
+      }));
+
+      colorIndex = (colorIndex + 1) % areaColorsLen;
+    }
+
+    this._splitAreaColors = newSplitAreaColors;
+  }
+});
+CartesianAxisView.extend({
+  type: 'xAxis'
+});
+CartesianAxisView.extend({
+  type: 'yAxis'
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+extendComponentView({
+  type: 'grid',
+  render: function (gridModel, ecModel) {
+    this.group.removeAll();
+
+    if (gridModel.get('show')) {
+      this.group.add(new Rect({
+        shape: gridModel.coordinateSystem.getRect(),
+        style: defaults({
+          fill: gridModel.get('backgroundColor')
+        }, gridModel.getItemStyle()),
+        silent: true,
+        z2: -1
+      }));
+    }
+  }
+});
+registerPreprocessor(function (option) {
+  // Only create grid when need
+  if (option.xAxis && option.yAxis && !option.grid) {
+    option.grid = {};
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+registerLayout(curry(layout, 'bar')); // Should after normal bar layout, otherwise it is blocked by normal bar layout.
+
+registerLayout(largeLayout);
+registerVisual({
+  seriesType: 'bar',
+  reset: function (seriesModel) {
+    // Visual coding for legend
+    seriesModel.getData().setVisual('legendSymbol', 'roundRect');
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+SeriesModel.extend({
+  type: 'series.line',
+  dependencies: ['grid', 'polar'],
+  getInitialData: function (option, ecModel) {
+    return createListFromArray(this.getSource(), this);
+  },
+  defaultOption: {
+    zlevel: 0,
+    z: 2,
+    coordinateSystem: 'cartesian2d',
+    legendHoverLink: true,
+    hoverAnimation: true,
+    // stack: null
+    // xAxisIndex: 0,
+    // yAxisIndex: 0,
+    // polarIndex: 0,
+    // If clip the overflow value
+    clipOverflow: true,
+    // cursor: null,
+    label: {
+      position: 'top'
+    },
+    // itemStyle: {
+    // },
+    lineStyle: {
+      width: 2,
+      type: 'solid'
+    },
+    // areaStyle: {
+    // origin of areaStyle. Valid values:
+    // `'auto'/null/undefined`: from axisLine to data
+    // `'start'`: from min to data
+    // `'end'`: from data to max
+    // origin: 'auto'
+    // },
+    // false, 'start', 'end', 'middle'
+    step: false,
+    // Disabled if step is true
+    smooth: false,
+    smoothMonotone: null,
+    symbol: 'emptyCircle',
+    symbolSize: 4,
+    symbolRotate: null,
+    showSymbol: true,
+    // `false`: follow the label interval strategy.
+    // `true`: show all symbols.
+    // `'auto'`: If possible, show all symbols, otherwise
+    //           follow the label interval strategy.
+    showAllSymbol: 'auto',
+    // Whether to connect break point.
+    connectNulls: false,
+    // Sampling for large data. Can be: 'average', 'max', 'min', 'sum'.
+    sampling: 'none',
+    animationEasing: 'linear',
+    // Disable progressive
+    progressive: 0,
+    hoverLayerThreshold: Infinity
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * @module echarts/chart/helper/Symbol
+ */
+/**
+ * @constructor
+ * @alias {module:echarts/chart/helper/Symbol}
+ * @param {module:echarts/data/List} data
+ * @param {number} idx
+ * @extends {module:zrender/graphic/Group}
+ */
+
+function SymbolClz$1(data, idx, seriesScope) {
+  Group.call(this);
+  this.updateData(data, idx, seriesScope);
+}
+
+var symbolProto = SymbolClz$1.prototype;
+/**
+ * @public
+ * @static
+ * @param {module:echarts/data/List} data
+ * @param {number} dataIndex
+ * @return {Array.<number>} [width, height]
+ */
+
+var getSymbolSize = SymbolClz$1.getSymbolSize = function (data, idx) {
+  var symbolSize = data.getItemVisual(idx, 'symbolSize');
+  return symbolSize instanceof Array ? symbolSize.slice() : [+symbolSize, +symbolSize];
+};
+
+function getScale(symbolSize) {
+  return [symbolSize[0] / 2, symbolSize[1] / 2];
+}
+
+function driftSymbol(dx, dy) {
+  this.parent.drift(dx, dy);
+}
+
+symbolProto._createSymbol = function (symbolType, data, idx, symbolSize, keepAspect) {
+  // Remove paths created before
+  this.removeAll();
+  var color = data.getItemVisual(idx, 'color'); // var symbolPath = createSymbol(
+  //     symbolType, -0.5, -0.5, 1, 1, color
+  // );
+  // If width/height are set too small (e.g., set to 1) on ios10
+  // and macOS Sierra, a circle stroke become a rect, no matter what
+  // the scale is set. So we set width/height as 2. See #4150.
+
+  var symbolPath = createSymbol(symbolType, -1, -1, 2, 2, color, keepAspect);
+  symbolPath.attr({
+    z2: 100,
+    culling: true,
+    scale: getScale(symbolSize)
+  }); // Rewrite drift method
+
+  symbolPath.drift = driftSymbol;
+  this._symbolType = symbolType;
+  this.add(symbolPath);
+};
+/**
+ * Stop animation
+ * @param {boolean} toLastFrame
+ */
+
+
+symbolProto.stopSymbolAnimation = function (toLastFrame) {
+  this.childAt(0).stopAnimation(toLastFrame);
+};
+/**
+ * FIXME:
+ * Caution: This method breaks the encapsulation of this module,
+ * but it indeed brings convenience. So do not use the method
+ * unless you detailedly know all the implements of `Symbol`,
+ * especially animation.
+ *
+ * Get symbol path element.
+ */
+
+
+symbolProto.getSymbolPath = function () {
+  return this.childAt(0);
+};
+/**
+ * Get scale(aka, current symbol size).
+ * Including the change caused by animation
+ */
+
+
+symbolProto.getScale = function () {
+  return this.childAt(0).scale;
+};
+/**
+ * Highlight symbol
+ */
+
+
+symbolProto.highlight = function () {
+  this.childAt(0).trigger('emphasis');
+};
+/**
+ * Downplay symbol
+ */
+
+
+symbolProto.downplay = function () {
+  this.childAt(0).trigger('normal');
+};
+/**
+ * @param {number} zlevel
+ * @param {number} z
+ */
+
+
+symbolProto.setZ = function (zlevel, z) {
+  var symbolPath = this.childAt(0);
+  symbolPath.zlevel = zlevel;
+  symbolPath.z = z;
+};
+
+symbolProto.setDraggable = function (draggable) {
+  var symbolPath = this.childAt(0);
+  symbolPath.draggable = draggable;
+  symbolPath.cursor = draggable ? 'move' : 'pointer';
+};
+/**
+ * Update symbol properties
+ * @param {module:echarts/data/List} data
+ * @param {number} idx
+ * @param {Object} [seriesScope]
+ * @param {Object} [seriesScope.itemStyle]
+ * @param {Object} [seriesScope.hoverItemStyle]
+ * @param {Object} [seriesScope.symbolRotate]
+ * @param {Object} [seriesScope.symbolOffset]
+ * @param {module:echarts/model/Model} [seriesScope.labelModel]
+ * @param {module:echarts/model/Model} [seriesScope.hoverLabelModel]
+ * @param {boolean} [seriesScope.hoverAnimation]
+ * @param {Object} [seriesScope.cursorStyle]
+ * @param {module:echarts/model/Model} [seriesScope.itemModel]
+ * @param {string} [seriesScope.symbolInnerColor]
+ * @param {Object} [seriesScope.fadeIn=false]
+ */
+
+
+symbolProto.updateData = function (data, idx, seriesScope) {
+  this.silent = false;
+  var symbolType = data.getItemVisual(idx, 'symbol') || 'circle';
+  var seriesModel = data.hostModel;
+  var symbolSize = getSymbolSize(data, idx);
+  var isInit = symbolType !== this._symbolType;
+
+  if (isInit) {
+    var keepAspect = data.getItemVisual(idx, 'symbolKeepAspect');
+
+    this._createSymbol(symbolType, data, idx, symbolSize, keepAspect);
+  } else {
+    var symbolPath = this.childAt(0);
+    symbolPath.silent = false;
+    updateProps(symbolPath, {
+      scale: getScale(symbolSize)
+    }, seriesModel, idx);
+  }
+
+  this._updateCommon(data, idx, symbolSize, seriesScope);
+
+  if (isInit) {
+    var symbolPath = this.childAt(0);
+    var fadeIn = seriesScope && seriesScope.fadeIn;
+    var target = {
+      scale: symbolPath.scale.slice()
+    };
+    fadeIn && (target.style = {
+      opacity: symbolPath.style.opacity
+    });
+    symbolPath.scale = [0, 0];
+    fadeIn && (symbolPath.style.opacity = 0);
+    initProps(symbolPath, target, seriesModel, idx);
+  }
+
+  this._seriesModel = seriesModel;
+}; // Update common properties
+
+
+var normalStyleAccessPath = ['itemStyle'];
+var emphasisStyleAccessPath = ['emphasis', 'itemStyle'];
+var normalLabelAccessPath = ['label'];
+var emphasisLabelAccessPath = ['emphasis', 'label'];
+/**
+ * @param {module:echarts/data/List} data
+ * @param {number} idx
+ * @param {Array.<number>} symbolSize
+ * @param {Object} [seriesScope]
+ */
+
+symbolProto._updateCommon = function (data, idx, symbolSize, seriesScope) {
+  var symbolPath = this.childAt(0);
+  var seriesModel = data.hostModel;
+  var color = data.getItemVisual(idx, 'color'); // Reset style
+
+  if (symbolPath.type !== 'image') {
+    symbolPath.useStyle({
+      strokeNoScale: true
+    });
+  }
+
+  var itemStyle = seriesScope && seriesScope.itemStyle;
+  var hoverItemStyle = seriesScope && seriesScope.hoverItemStyle;
+  var symbolRotate = seriesScope && seriesScope.symbolRotate;
+  var symbolOffset = seriesScope && seriesScope.symbolOffset;
+  var labelModel = seriesScope && seriesScope.labelModel;
+  var hoverLabelModel = seriesScope && seriesScope.hoverLabelModel;
+  var hoverAnimation = seriesScope && seriesScope.hoverAnimation;
+  var cursorStyle = seriesScope && seriesScope.cursorStyle;
+
+  if (!seriesScope || data.hasItemOption) {
+    var itemModel = seriesScope && seriesScope.itemModel ? seriesScope.itemModel : data.getItemModel(idx); // Color must be excluded.
+    // Because symbol provide setColor individually to set fill and stroke
+
+    itemStyle = itemModel.getModel(normalStyleAccessPath).getItemStyle(['color']);
+    hoverItemStyle = itemModel.getModel(emphasisStyleAccessPath).getItemStyle();
+    symbolRotate = itemModel.getShallow('symbolRotate');
+    symbolOffset = itemModel.getShallow('symbolOffset');
+    labelModel = itemModel.getModel(normalLabelAccessPath);
+    hoverLabelModel = itemModel.getModel(emphasisLabelAccessPath);
+    hoverAnimation = itemModel.getShallow('hoverAnimation');
+    cursorStyle = itemModel.getShallow('cursor');
+  } else {
+    hoverItemStyle = extend({}, hoverItemStyle);
+  }
+
+  var elStyle = symbolPath.style;
+  symbolPath.attr('rotation', (symbolRotate || 0) * Math.PI / 180 || 0);
+
+  if (symbolOffset) {
+    symbolPath.attr('position', [parsePercent$1(symbolOffset[0], symbolSize[0]), parsePercent$1(symbolOffset[1], symbolSize[1])]);
+  }
+
+  cursorStyle && symbolPath.attr('cursor', cursorStyle); // PENDING setColor before setStyle!!!
+
+  symbolPath.setColor(color, seriesScope && seriesScope.symbolInnerColor);
+  symbolPath.setStyle(itemStyle);
+  var opacity = data.getItemVisual(idx, 'opacity');
+
+  if (opacity != null) {
+    elStyle.opacity = opacity;
+  }
+
+  var liftZ = data.getItemVisual(idx, 'liftZ');
+  var z2Origin = symbolPath.__z2Origin;
+
+  if (liftZ != null) {
+    if (z2Origin == null) {
+      symbolPath.__z2Origin = symbolPath.z2;
+      symbolPath.z2 += liftZ;
+    }
+  } else if (z2Origin != null) {
+    symbolPath.z2 = z2Origin;
+    symbolPath.__z2Origin = null;
+  }
+
+  var useNameLabel = seriesScope && seriesScope.useNameLabel;
+  setLabelStyle(elStyle, hoverItemStyle, labelModel, hoverLabelModel, {
+    labelFetcher: seriesModel,
+    labelDataIndex: idx,
+    defaultText: getLabelDefaultText,
+    isRectText: true,
+    autoColor: color
+  }); // Do not execute util needed.
+
+  function getLabelDefaultText(idx, opt) {
+    return useNameLabel ? data.getName(idx) : getDefaultLabel(data, idx);
+  }
+
+  symbolPath.off('mouseover').off('mouseout').off('emphasis').off('normal');
+  symbolPath.hoverStyle = hoverItemStyle; // FIXME
+  // Do not use symbol.trigger('emphasis'), but use symbol.highlight() instead.
+
+  setHoverStyle(symbolPath);
+  symbolPath.__symbolOriginalScale = getScale(symbolSize);
+
+  if (hoverAnimation && seriesModel.isAnimationEnabled()) {
+    // Note: consider `off`, should use static function here.
+    symbolPath.on('mouseover', onMouseOver).on('mouseout', onMouseOut).on('emphasis', onEmphasis).on('normal', onNormal);
+  }
+};
+
+function onMouseOver() {
+  // see comment in `graphic.isInEmphasis`
+  !isInEmphasis(this) && onEmphasis.call(this);
+}
+
+function onMouseOut() {
+  // see comment in `graphic.isInEmphasis`
+  !isInEmphasis(this) && onNormal.call(this);
+}
+
+function onEmphasis() {
+  // Do not support this hover animation util some scenario required.
+  // Animation can only be supported in hover layer when using `el.incremetal`.
+  if (this.incremental || this.useHoverLayer) {
+    return;
+  }
+
+  var scale = this.__symbolOriginalScale;
+  var ratio = scale[1] / scale[0];
+  this.animateTo({
+    scale: [Math.max(scale[0] * 1.1, scale[0] + 3), Math.max(scale[1] * 1.1, scale[1] + 3 * ratio)]
+  }, 400, 'elasticOut');
+}
+
+function onNormal() {
+  if (this.incremental || this.useHoverLayer) {
+    return;
+  }
+
+  this.animateTo({
+    scale: this.__symbolOriginalScale
+  }, 400, 'elasticOut');
+}
+/**
+ * @param {Function} cb
+ * @param {Object} [opt]
+ * @param {Object} [opt.keepLabel=true]
+ */
+
+
+symbolProto.fadeOut = function (cb, opt) {
+  var symbolPath = this.childAt(0); // Avoid mistaken hover when fading out
+
+  this.silent = symbolPath.silent = true; // Not show text when animating
+
+  !(opt && opt.keepLabel) && (symbolPath.style.text = null);
+  updateProps(symbolPath, {
+    style: {
+      opacity: 0
+    },
+    scale: [0, 0]
+  }, this._seriesModel, this.dataIndex, cb);
+};
+
+inherits(SymbolClz$1, Group);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * @module echarts/chart/helper/SymbolDraw
+ */
+/**
+ * @constructor
+ * @alias module:echarts/chart/helper/SymbolDraw
+ * @param {module:zrender/graphic/Group} [symbolCtor]
+ */
+
+function SymbolDraw(symbolCtor) {
+  this.group = new Group();
+  this._symbolCtor = symbolCtor || SymbolClz$1;
+}
+
+var symbolDrawProto = SymbolDraw.prototype;
+
+function symbolNeedsDraw(data, point, idx, opt) {
+  return point && !isNaN(point[0]) && !isNaN(point[1]) && !(opt.isIgnore && opt.isIgnore(idx)) // We do not set clipShape on group, because it will cut part of
+  // the symbol element shape. We use the same clip shape here as
+  // the line clip.
+  && !(opt.clipShape && !opt.clipShape.contain(point[0], point[1])) && data.getItemVisual(idx, 'symbol') !== 'none';
+}
+/**
+ * Update symbols draw by new data
+ * @param {module:echarts/data/List} data
+ * @param {Object} [opt] Or isIgnore
+ * @param {Function} [opt.isIgnore]
+ * @param {Object} [opt.clipShape]
+ */
+
+
+symbolDrawProto.updateData = function (data, opt) {
+  opt = normalizeUpdateOpt(opt);
+  var group = this.group;
+  var seriesModel = data.hostModel;
+  var oldData = this._data;
+  var SymbolCtor = this._symbolCtor;
+  var seriesScope = makeSeriesScope(data); // There is no oldLineData only when first rendering or switching from
+  // stream mode to normal mode, where previous elements should be removed.
+
+  if (!oldData) {
+    group.removeAll();
+  }
+
+  data.diff(oldData).add(function (newIdx) {
+    var point = data.getItemLayout(newIdx);
+
+    if (symbolNeedsDraw(data, point, newIdx, opt)) {
+      var symbolEl = new SymbolCtor(data, newIdx, seriesScope);
+      symbolEl.attr('position', point);
+      data.setItemGraphicEl(newIdx, symbolEl);
+      group.add(symbolEl);
+    }
+  }).update(function (newIdx, oldIdx) {
+    var symbolEl = oldData.getItemGraphicEl(oldIdx);
+    var point = data.getItemLayout(newIdx);
+
+    if (!symbolNeedsDraw(data, point, newIdx, opt)) {
+      group.remove(symbolEl);
+      return;
+    }
+
+    if (!symbolEl) {
+      symbolEl = new SymbolCtor(data, newIdx);
+      symbolEl.attr('position', point);
+    } else {
+      symbolEl.updateData(data, newIdx, seriesScope);
+      updateProps(symbolEl, {
+        position: point
+      }, seriesModel);
+    } // Add back
+
+
+    group.add(symbolEl);
+    data.setItemGraphicEl(newIdx, symbolEl);
+  }).remove(function (oldIdx) {
+    var el = oldData.getItemGraphicEl(oldIdx);
+    el && el.fadeOut(function () {
+      group.remove(el);
+    });
+  }).execute();
+  this._data = data;
+};
+
+symbolDrawProto.isPersistent = function () {
+  return true;
+};
+
+symbolDrawProto.updateLayout = function () {
+  var data = this._data;
+
+  if (data) {
+    // Not use animation
+    data.eachItemGraphicEl(function (el, idx) {
+      var point = data.getItemLayout(idx);
+      el.attr('position', point);
+    });
+  }
+};
+
+symbolDrawProto.incrementalPrepareUpdate = function (data) {
+  this._seriesScope = makeSeriesScope(data);
+  this._data = null;
+  this.group.removeAll();
+};
+/**
+ * Update symbols draw by new data
+ * @param {module:echarts/data/List} data
+ * @param {Object} [opt] Or isIgnore
+ * @param {Function} [opt.isIgnore]
+ * @param {Object} [opt.clipShape]
+ */
+
+
+symbolDrawProto.incrementalUpdate = function (taskParams, data, opt) {
+  opt = normalizeUpdateOpt(opt);
+
+  function updateIncrementalAndHover(el) {
+    if (!el.isGroup) {
+      el.incremental = el.useHoverLayer = true;
+    }
+  }
+
+  for (var idx = taskParams.start; idx < taskParams.end; idx++) {
+    var point = data.getItemLayout(idx);
+
+    if (symbolNeedsDraw(data, point, idx, opt)) {
+      var el = new this._symbolCtor(data, idx, this._seriesScope);
+      el.traverse(updateIncrementalAndHover);
+      el.attr('position', point);
+      this.group.add(el);
+      data.setItemGraphicEl(idx, el);
+    }
+  }
+};
+
+function normalizeUpdateOpt(opt) {
+  if (opt != null && !isObject$1(opt)) {
+    opt = {
+      isIgnore: opt
+    };
+  }
+
+  return opt || {};
+}
+
+symbolDrawProto.remove = function (enableAnimation) {
+  var group = this.group;
+  var data = this._data; // Incremental model do not have this._data.
+
+  if (data && enableAnimation) {
+    data.eachItemGraphicEl(function (el) {
+      el.fadeOut(function () {
+        group.remove(el);
+      });
+    });
+  } else {
+    group.removeAll();
+  }
+};
+
+function makeSeriesScope(data) {
+  var seriesModel = data.hostModel;
+  return {
+    itemStyle: seriesModel.getModel('itemStyle').getItemStyle(['color']),
+    hoverItemStyle: seriesModel.getModel('emphasis.itemStyle').getItemStyle(),
+    symbolRotate: seriesModel.get('symbolRotate'),
+    symbolOffset: seriesModel.get('symbolOffset'),
+    hoverAnimation: seriesModel.get('hoverAnimation'),
+    labelModel: seriesModel.getModel('label'),
+    hoverLabelModel: seriesModel.getModel('emphasis.label'),
+    cursorStyle: seriesModel.get('cursor')
+  };
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+/**
+ * @param {Object} coordSys
+ * @param {module:echarts/data/List} data
+ * @param {string} valueOrigin lineSeries.option.areaStyle.origin
+ */
+
+function prepareDataCoordInfo(coordSys, data, valueOrigin) {
+  var baseAxis = coordSys.getBaseAxis();
+  var valueAxis = coordSys.getOtherAxis(baseAxis);
+  var valueStart = getValueStart(valueAxis, valueOrigin);
+  var baseAxisDim = baseAxis.dim;
+  var valueAxisDim = valueAxis.dim;
+  var valueDim = data.mapDimension(valueAxisDim);
+  var baseDim = data.mapDimension(baseAxisDim);
+  var baseDataOffset = valueAxisDim === 'x' || valueAxisDim === 'radius' ? 1 : 0;
+  var dims = map(coordSys.dimensions, function (coordDim) {
+    return data.mapDimension(coordDim);
+  });
+  var stacked;
+  var stackResultDim = data.getCalculationInfo('stackResultDimension');
+
+  if (stacked |= isDimensionStacked(data, dims[0]
+  /*, dims[1]*/
+  )) {
+    // jshint ignore:line
+    dims[0] = stackResultDim;
+  }
+
+  if (stacked |= isDimensionStacked(data, dims[1]
+  /*, dims[0]*/
+  )) {
+    // jshint ignore:line
+    dims[1] = stackResultDim;
+  }
+
+  return {
+    dataDimsForPoint: dims,
+    valueStart: valueStart,
+    valueAxisDim: valueAxisDim,
+    baseAxisDim: baseAxisDim,
+    stacked: !!stacked,
+    valueDim: valueDim,
+    baseDim: baseDim,
+    baseDataOffset: baseDataOffset,
+    stackedOverDimension: data.getCalculationInfo('stackedOverDimension')
+  };
+}
+
+function getValueStart(valueAxis, valueOrigin) {
+  var valueStart = 0;
+  var extent = valueAxis.scale.getExtent();
+
+  if (valueOrigin === 'start') {
+    valueStart = extent[0];
+  } else if (valueOrigin === 'end') {
+    valueStart = extent[1];
+  } // auto
+  else {
+      // Both positive
+      if (extent[0] > 0) {
+        valueStart = extent[0];
+      } // Both negative
+      else if (extent[1] < 0) {
+          valueStart = extent[1];
+        } // If is one positive, and one negative, onZero shall be true
+
+    }
+
+  return valueStart;
+}
+
+function getStackedOnPoint(dataCoordInfo, coordSys, data, idx) {
+  var value = NaN;
+
+  if (dataCoordInfo.stacked) {
+    value = data.get(data.getCalculationInfo('stackedOverDimension'), idx);
+  }
+
+  if (isNaN(value)) {
+    value = dataCoordInfo.valueStart;
+  }
+
+  var baseDataOffset = dataCoordInfo.baseDataOffset;
+  var stackedData = [];
+  stackedData[baseDataOffset] = data.get(dataCoordInfo.baseDim, idx);
+  stackedData[1 - baseDataOffset] = value;
+  return coordSys.dataToPoint(stackedData);
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+// 'zrender/src/core/arrayDiff' has been used before, but it did
+// not do well in performance when roam with fixed dataZoom window.
+// function convertToIntId(newIdList, oldIdList) {
+//     // Generate int id instead of string id.
+//     // Compare string maybe slow in score function of arrDiff
+//     // Assume id in idList are all unique
+//     var idIndicesMap = {};
+//     var idx = 0;
+//     for (var i = 0; i < newIdList.length; i++) {
+//         idIndicesMap[newIdList[i]] = idx;
+//         newIdList[i] = idx++;
+//     }
+//     for (var i = 0; i < oldIdList.length; i++) {
+//         var oldId = oldIdList[i];
+//         // Same with newIdList
+//         if (idIndicesMap[oldId]) {
+//             oldIdList[i] = idIndicesMap[oldId];
+//         }
+//         else {
+//             oldIdList[i] = idx++;
+//         }
+//     }
+// }
+
+function diffData(oldData, newData) {
+  var diffResult = [];
+  newData.diff(oldData).add(function (idx) {
+    diffResult.push({
+      cmd: '+',
+      idx: idx
+    });
+  }).update(function (newIdx, oldIdx) {
+    diffResult.push({
+      cmd: '=',
+      idx: oldIdx,
+      idx1: newIdx
+    });
+  }).remove(function (idx) {
+    diffResult.push({
+      cmd: '-',
+      idx: idx
+    });
+  }).execute();
+  return diffResult;
+}
+
+var lineAnimationDiff = function (oldData, newData, oldStackedOnPoints, newStackedOnPoints, oldCoordSys, newCoordSys, oldValueOrigin, newValueOrigin) {
+  var diff = diffData(oldData, newData); // var newIdList = newData.mapArray(newData.getId);
+  // var oldIdList = oldData.mapArray(oldData.getId);
+  // convertToIntId(newIdList, oldIdList);
+  // // FIXME One data ?
+  // diff = arrayDiff(oldIdList, newIdList);
+
+  var currPoints = [];
+  var nextPoints = []; // Points for stacking index line
+
+  var currStackedPoints = [];
+  var nextStackedPoints = [];
+  var status = [];
+  var sortedIndices = [];
+  var rawIndices = [];
+  var newDataOldCoordInfo = prepareDataCoordInfo(oldCoordSys, newData, oldValueOrigin);
+  var oldDataNewCoordInfo = prepareDataCoordInfo(newCoordSys, oldData, newValueOrigin);
+
+  for (var i = 0; i < diff.length; i++) {
+    var diffItem = diff[i];
+    var pointAdded = true; // FIXME, animation is not so perfect when dataZoom window moves fast
+    // Which is in case remvoing or add more than one data in the tail or head
+
+    switch (diffItem.cmd) {
+      case '=':
+        var currentPt = oldData.getItemLayout(diffItem.idx);
+        var nextPt = newData.getItemLayout(diffItem.idx1); // If previous data is NaN, use next point directly
+
+        if (isNaN(currentPt[0]) || isNaN(currentPt[1])) {
+          currentPt = nextPt.slice();
+        }
+
+        currPoints.push(currentPt);
+        nextPoints.push(nextPt);
+        currStackedPoints.push(oldStackedOnPoints[diffItem.idx]);
+        nextStackedPoints.push(newStackedOnPoints[diffItem.idx1]);
+        rawIndices.push(newData.getRawIndex(diffItem.idx1));
+        break;
+
+      case '+':
+        var idx = diffItem.idx;
+        currPoints.push(oldCoordSys.dataToPoint([newData.get(newDataOldCoordInfo.dataDimsForPoint[0], idx), newData.get(newDataOldCoordInfo.dataDimsForPoint[1], idx)]));
+        nextPoints.push(newData.getItemLayout(idx).slice());
+        currStackedPoints.push(getStackedOnPoint(newDataOldCoordInfo, oldCoordSys, newData, idx));
+        nextStackedPoints.push(newStackedOnPoints[idx]);
+        rawIndices.push(newData.getRawIndex(idx));
+        break;
+
+      case '-':
+        var idx = diffItem.idx;
+        var rawIndex = oldData.getRawIndex(idx); // Data is replaced. In the case of dynamic data queue
+        // FIXME FIXME FIXME
+
+        if (rawIndex !== idx) {
+          currPoints.push(oldData.getItemLayout(idx));
+          nextPoints.push(newCoordSys.dataToPoint([oldData.get(oldDataNewCoordInfo.dataDimsForPoint[0], idx), oldData.get(oldDataNewCoordInfo.dataDimsForPoint[1], idx)]));
+          currStackedPoints.push(oldStackedOnPoints[idx]);
+          nextStackedPoints.push(getStackedOnPoint(oldDataNewCoordInfo, newCoordSys, oldData, idx));
+          rawIndices.push(rawIndex);
+        } else {
+          pointAdded = false;
+        }
+
+    } // Original indices
+
+
+    if (pointAdded) {
+      status.push(diffItem);
+      sortedIndices.push(sortedIndices.length);
+    }
+  } // Diff result may be crossed if all items are changed
+  // Sort by data index
+
+
+  sortedIndices.sort(function (a, b) {
+    return rawIndices[a] - rawIndices[b];
+  });
+  var sortedCurrPoints = [];
+  var sortedNextPoints = [];
+  var sortedCurrStackedPoints = [];
+  var sortedNextStackedPoints = [];
+  var sortedStatus = [];
+
+  for (var i = 0; i < sortedIndices.length; i++) {
+    var idx = sortedIndices[i];
+    sortedCurrPoints[i] = currPoints[idx];
+    sortedNextPoints[i] = nextPoints[idx];
+    sortedCurrStackedPoints[i] = currStackedPoints[idx];
+    sortedNextStackedPoints[i] = nextStackedPoints[idx];
+    sortedStatus[i] = status[idx];
+  }
+
+  return {
+    current: sortedCurrPoints,
+    next: sortedNextPoints,
+    stackedOnCurrent: sortedCurrStackedPoints,
+    stackedOnNext: sortedNextStackedPoints,
+    status: sortedStatus
+  };
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+// Poly path support NaN point
+var vec2Min = min;
+var vec2Max = max;
+var scaleAndAdd$1 = scaleAndAdd;
+var v2Copy = copy; // Temporary variable
+
+var v = [];
+var cp0 = [];
+var cp1 = [];
+
+function isPointNull(p) {
+  return isNaN(p[0]) || isNaN(p[1]);
+}
+
+function drawSegment(ctx, points, start, segLen, allLen, dir, smoothMin, smoothMax, smooth, smoothMonotone, connectNulls) {
+  // if (smoothMonotone == null) {
+  //     if (isMono(points, 'x')) {
+  //         return drawMono(ctx, points, start, segLen, allLen,
+  //             dir, smoothMin, smoothMax, smooth, 'x', connectNulls);
+  //     }
+  //     else if (isMono(points, 'y')) {
+  //         return drawMono(ctx, points, start, segLen, allLen,
+  //             dir, smoothMin, smoothMax, smooth, 'y', connectNulls);
+  //     }
+  //     else {
+  //         return drawNonMono.apply(this, arguments);
+  //     }
+  // }
+  // else if (smoothMonotone !== 'none' && isMono(points, smoothMonotone)) {
+  //     return drawMono.apply(this, arguments);
+  // }
+  // else {
+  //     return drawNonMono.apply(this, arguments);
+  // }
+  if (smoothMonotone === 'none' || !smoothMonotone) {
+    return drawNonMono.apply(this, arguments);
+  } else {
+    return drawMono.apply(this, arguments);
+  }
+}
+/**
+ * Check if points is in monotone.
+ *
+ * @param {number[][]} points         Array of points which is in [x, y] form
+ * @param {string}     smoothMonotone 'x', 'y', or 'none', stating for which
+ *                                    dimension that is checking.
+ *                                    If is 'none', `drawNonMono` should be
+ *                                    called.
+ *                                    If is undefined, either being monotone
+ *                                    in 'x' or 'y' will call `drawMono`.
+ */
+// function isMono(points, smoothMonotone) {
+//     if (points.length <= 1) {
+//         return true;
+//     }
+//     var dim = smoothMonotone === 'x' ? 0 : 1;
+//     var last = points[0][dim];
+//     var lastDiff = 0;
+//     for (var i = 1; i < points.length; ++i) {
+//         var diff = points[i][dim] - last;
+//         if (!isNaN(diff) && !isNaN(lastDiff)
+//             && diff !== 0 && lastDiff !== 0
+//             && ((diff >= 0) !== (lastDiff >= 0))
+//         ) {
+//             return false;
+//         }
+//         if (!isNaN(diff) && diff !== 0) {
+//             lastDiff = diff;
+//             last = points[i][dim];
+//         }
+//     }
+//     return true;
+// }
+
+/**
+ * Draw smoothed line in monotone, in which only vertical or horizontal bezier
+ * control points will be used. This should be used when points are monotone
+ * either in x or y dimension.
+ */
+
+
+function drawMono(ctx, points, start, segLen, allLen, dir, smoothMin, smoothMax, smooth, smoothMonotone, connectNulls) {
+  var prevIdx = 0;
+  var idx = start;
+
+  for (var k = 0; k < segLen; k++) {
+    var p = points[idx];
+
+    if (idx >= allLen || idx < 0) {
+      break;
+    }
+
+    if (isPointNull(p)) {
+      if (connectNulls) {
+        idx += dir;
+        continue;
+      }
+
+      break;
+    }
+
+    if (idx === start) {
+      ctx[dir > 0 ? 'moveTo' : 'lineTo'](p[0], p[1]);
+    } else {
+      if (smooth > 0) {
+        var prevP = points[prevIdx];
+        var dim = smoothMonotone === 'y' ? 1 : 0; // Length of control point to p, either in x or y, but not both
+
+        var ctrlLen = (p[dim] - prevP[dim]) * smooth;
+        v2Copy(cp0, prevP);
+        cp0[dim] = prevP[dim] + ctrlLen;
+        v2Copy(cp1, p);
+        cp1[dim] = p[dim] - ctrlLen;
+        ctx.bezierCurveTo(cp0[0], cp0[1], cp1[0], cp1[1], p[0], p[1]);
+      } else {
+        ctx.lineTo(p[0], p[1]);
+      }
+    }
+
+    prevIdx = idx;
+    idx += dir;
+  }
+
+  return k;
+}
+/**
+ * Draw smoothed line in non-monotone, in may cause undesired curve in extreme
+ * situations. This should be used when points are non-monotone neither in x or
+ * y dimension.
+ */
+
+
+function drawNonMono(ctx, points, start, segLen, allLen, dir, smoothMin, smoothMax, smooth, smoothMonotone, connectNulls) {
+  var prevIdx = 0;
+  var idx = start;
+
+  for (var k = 0; k < segLen; k++) {
+    var p = points[idx];
+
+    if (idx >= allLen || idx < 0) {
+      break;
+    }
+
+    if (isPointNull(p)) {
+      if (connectNulls) {
+        idx += dir;
+        continue;
+      }
+
+      break;
+    }
+
+    if (idx === start) {
+      ctx[dir > 0 ? 'moveTo' : 'lineTo'](p[0], p[1]);
+      v2Copy(cp0, p);
+    } else {
+      if (smooth > 0) {
+        var nextIdx = idx + dir;
+        var nextP = points[nextIdx];
+
+        if (connectNulls) {
+          // Find next point not null
+          while (nextP && isPointNull(points[nextIdx])) {
+            nextIdx += dir;
+            nextP = points[nextIdx];
+          }
+        }
+
+        var ratioNextSeg = 0.5;
+        var prevP = points[prevIdx];
+        var nextP = points[nextIdx]; // Last point
+
+        if (!nextP || isPointNull(nextP)) {
+          v2Copy(cp1, p);
+        } else {
+          // If next data is null in not connect case
+          if (isPointNull(nextP) && !connectNulls) {
+            nextP = p;
+          }
+
+          sub(v, nextP, prevP);
+          var lenPrevSeg;
+          var lenNextSeg;
+
+          if (smoothMonotone === 'x' || smoothMonotone === 'y') {
+            var dim = smoothMonotone === 'x' ? 0 : 1;
+            lenPrevSeg = Math.abs(p[dim] - prevP[dim]);
+            lenNextSeg = Math.abs(p[dim] - nextP[dim]);
+          } else {
+            lenPrevSeg = dist(p, prevP);
+            lenNextSeg = dist(p, nextP);
+          } // Use ratio of seg length
+
+
+          ratioNextSeg = lenNextSeg / (lenNextSeg + lenPrevSeg);
+          scaleAndAdd$1(cp1, p, v, -smooth * (1 - ratioNextSeg));
+        } // Smooth constraint
+
+
+        vec2Min(cp0, cp0, smoothMax);
+        vec2Max(cp0, cp0, smoothMin);
+        vec2Min(cp1, cp1, smoothMax);
+        vec2Max(cp1, cp1, smoothMin);
+        ctx.bezierCurveTo(cp0[0], cp0[1], cp1[0], cp1[1], p[0], p[1]); // cp0 of next segment
+
+        scaleAndAdd$1(cp0, p, v, smooth * ratioNextSeg);
+      } else {
+        ctx.lineTo(p[0], p[1]);
+      }
+    }
+
+    prevIdx = idx;
+    idx += dir;
+  }
+
+  return k;
+}
+
+function getBoundingBox(points, smoothConstraint) {
+  var ptMin = [Infinity, Infinity];
+  var ptMax = [-Infinity, -Infinity];
+
+  if (smoothConstraint) {
+    for (var i = 0; i < points.length; i++) {
+      var pt = points[i];
+
+      if (pt[0] < ptMin[0]) {
+        ptMin[0] = pt[0];
+      }
+
+      if (pt[1] < ptMin[1]) {
+        ptMin[1] = pt[1];
+      }
+
+      if (pt[0] > ptMax[0]) {
+        ptMax[0] = pt[0];
+      }
+
+      if (pt[1] > ptMax[1]) {
+        ptMax[1] = pt[1];
+      }
+    }
+  }
+
+  return {
+    min: smoothConstraint ? ptMin : ptMax,
+    max: smoothConstraint ? ptMax : ptMin
+  };
+}
+
+var Polyline$1 = Path.extend({
+  type: 'ec-polyline',
+  shape: {
+    points: [],
+    smooth: 0,
+    smoothConstraint: true,
+    smoothMonotone: null,
+    connectNulls: false
+  },
+  style: {
+    fill: null,
+    stroke: '#000'
+  },
+  brush: fixClipWithShadow(Path.prototype.brush),
+  buildPath: function (ctx, shape) {
+    var points = shape.points;
+    var i = 0;
+    var len$$1 = points.length;
+    var result = getBoundingBox(points, shape.smoothConstraint);
+
+    if (shape.connectNulls) {
+      // Must remove first and last null values avoid draw error in polygon
+      for (; len$$1 > 0; len$$1--) {
+        if (!isPointNull(points[len$$1 - 1])) {
+          break;
+        }
+      }
+
+      for (; i < len$$1; i++) {
+        if (!isPointNull(points[i])) {
+          break;
+        }
+      }
+    }
+
+    while (i < len$$1) {
+      i += drawSegment(ctx, points, i, len$$1, len$$1, 1, result.min, result.max, shape.smooth, shape.smoothMonotone, shape.connectNulls) + 1;
+    }
+  }
+});
+var Polygon$1 = Path.extend({
+  type: 'ec-polygon',
+  shape: {
+    points: [],
+    // Offset between stacked index points and points
+    stackedOnPoints: [],
+    smooth: 0,
+    stackedOnSmooth: 0,
+    smoothConstraint: true,
+    smoothMonotone: null,
+    connectNulls: false
+  },
+  brush: fixClipWithShadow(Path.prototype.brush),
+  buildPath: function (ctx, shape) {
+    var points = shape.points;
+    var stackedOnPoints = shape.stackedOnPoints;
+    var i = 0;
+    var len$$1 = points.length;
+    var smoothMonotone = shape.smoothMonotone;
+    var bbox = getBoundingBox(points, shape.smoothConstraint);
+    var stackedOnBBox = getBoundingBox(stackedOnPoints, shape.smoothConstraint);
+
+    if (shape.connectNulls) {
+      // Must remove first and last null values avoid draw error in polygon
+      for (; len$$1 > 0; len$$1--) {
+        if (!isPointNull(points[len$$1 - 1])) {
+          break;
+        }
+      }
+
+      for (; i < len$$1; i++) {
+        if (!isPointNull(points[i])) {
+          break;
+        }
+      }
+    }
+
+    while (i < len$$1) {
+      var k = drawSegment(ctx, points, i, len$$1, len$$1, 1, bbox.min, bbox.max, shape.smooth, smoothMonotone, shape.connectNulls);
+      drawSegment(ctx, stackedOnPoints, i + k - 1, k, len$$1, -1, stackedOnBBox.min, stackedOnBBox.max, shape.stackedOnSmooth, smoothMonotone, shape.connectNulls);
+      i += k + 1;
+      ctx.closePath();
+    }
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+// FIXME step not support polar
+function isPointsSame(points1, points2) {
+  if (points1.length !== points2.length) {
+    return;
+  }
+
+  for (var i = 0; i < points1.length; i++) {
+    var p1 = points1[i];
+    var p2 = points2[i];
+
+    if (p1[0] !== p2[0] || p1[1] !== p2[1]) {
+      return;
+    }
+  }
+
+  return true;
+}
+
+function getSmooth(smooth) {
+  return typeof smooth === 'number' ? smooth : smooth ? 0.5 : 0;
+}
+
+function getAxisExtentWithGap(axis) {
+  var extent = axis.getGlobalExtent();
+
+  if (axis.onBand) {
+    // Remove extra 1px to avoid line miter in clipped edge
+    var halfBandWidth = axis.getBandWidth() / 2 - 1;
+    var dir = extent[1] > extent[0] ? 1 : -1;
+    extent[0] += dir * halfBandWidth;
+    extent[1] -= dir * halfBandWidth;
+  }
+
+  return extent;
+}
+/**
+ * @param {module:echarts/coord/cartesian/Cartesian2D|module:echarts/coord/polar/Polar} coordSys
+ * @param {module:echarts/data/List} data
+ * @param {Object} dataCoordInfo
+ * @param {Array.<Array.<number>>} points
+ */
+
+
+function getStackedOnPoints(coordSys, data, dataCoordInfo) {
+  if (!dataCoordInfo.valueDim) {
+    return [];
+  }
+
+  var points = [];
+
+  for (var idx = 0, len = data.count(); idx < len; idx++) {
+    points.push(getStackedOnPoint(dataCoordInfo, coordSys, data, idx));
+  }
+
+  return points;
+}
+
+function createGridClipShape(cartesian, hasAnimation, forSymbol, seriesModel) {
+  var xExtent = getAxisExtentWithGap(cartesian.getAxis('x'));
+  var yExtent = getAxisExtentWithGap(cartesian.getAxis('y'));
+  var isHorizontal = cartesian.getBaseAxis().isHorizontal();
+  var x = Math.min(xExtent[0], xExtent[1]);
+  var y = Math.min(yExtent[0], yExtent[1]);
+  var width = Math.max(xExtent[0], xExtent[1]) - x;
+  var height = Math.max(yExtent[0], yExtent[1]) - y; // Avoid float number rounding error for symbol on the edge of axis extent.
+  // See #7913 and `test/dataZoom-clip.html`.
+
+  if (forSymbol) {
+    x -= 0.5;
+    width += 0.5;
+    y -= 0.5;
+    height += 0.5;
+  } else {
+    var lineWidth = seriesModel.get('lineStyle.width') || 2; // Expand clip shape to avoid clipping when line value exceeds axis
+
+    var expandSize = seriesModel.get('clipOverflow') ? lineWidth / 2 : Math.max(width, height);
+
+    if (isHorizontal) {
+      y -= expandSize;
+      height += expandSize * 2;
+    } else {
+      x -= expandSize;
+      width += expandSize * 2;
+    }
+  }
+
+  var clipPath = new Rect({
+    shape: {
+      x: x,
+      y: y,
+      width: width,
+      height: height
+    }
+  });
+
+  if (hasAnimation) {
+    clipPath.shape[isHorizontal ? 'width' : 'height'] = 0;
+    initProps(clipPath, {
+      shape: {
+        width: width,
+        height: height
+      }
+    }, seriesModel);
+  }
+
+  return clipPath;
+}
+
+function createPolarClipShape(polar, hasAnimation, forSymbol, seriesModel) {
+  var angleAxis = polar.getAngleAxis();
+  var radiusAxis = polar.getRadiusAxis();
+  var radiusExtent = radiusAxis.getExtent().slice();
+  radiusExtent[0] > radiusExtent[1] && radiusExtent.reverse();
+  var angleExtent = angleAxis.getExtent();
+  var RADIAN = Math.PI / 180; // Avoid float number rounding error for symbol on the edge of axis extent.
+
+  if (forSymbol) {
+    radiusExtent[0] -= 0.5;
+    radiusExtent[1] += 0.5;
+  }
+
+  var clipPath = new Sector({
+    shape: {
+      cx: round$1(polar.cx, 1),
+      cy: round$1(polar.cy, 1),
+      r0: round$1(radiusExtent[0], 1),
+      r: round$1(radiusExtent[1], 1),
+      startAngle: -angleExtent[0] * RADIAN,
+      endAngle: -angleExtent[1] * RADIAN,
+      clockwise: angleAxis.inverse
+    }
+  });
+
+  if (hasAnimation) {
+    clipPath.shape.endAngle = -angleExtent[0] * RADIAN;
+    initProps(clipPath, {
+      shape: {
+        endAngle: -angleExtent[1] * RADIAN
+      }
+    }, seriesModel);
+  }
+
+  return clipPath;
+}
+
+function createClipShape(coordSys, hasAnimation, forSymbol, seriesModel) {
+  return coordSys.type === 'polar' ? createPolarClipShape(coordSys, hasAnimation, forSymbol, seriesModel) : createGridClipShape(coordSys, hasAnimation, forSymbol, seriesModel);
+}
+
+function turnPointsIntoStep(points, coordSys, stepTurnAt) {
+  var baseAxis = coordSys.getBaseAxis();
+  var baseIndex = baseAxis.dim === 'x' || baseAxis.dim === 'radius' ? 0 : 1;
+  var stepPoints = [];
+
+  for (var i = 0; i < points.length - 1; i++) {
+    var nextPt = points[i + 1];
+    var pt = points[i];
+    stepPoints.push(pt);
+    var stepPt = [];
+
+    switch (stepTurnAt) {
+      case 'end':
+        stepPt[baseIndex] = nextPt[baseIndex];
+        stepPt[1 - baseIndex] = pt[1 - baseIndex]; // default is start
+
+        stepPoints.push(stepPt);
+        break;
+
+      case 'middle':
+        // default is start
+        var middle = (pt[baseIndex] + nextPt[baseIndex]) / 2;
+        var stepPt2 = [];
+        stepPt[baseIndex] = stepPt2[baseIndex] = middle;
+        stepPt[1 - baseIndex] = pt[1 - baseIndex];
+        stepPt2[1 - baseIndex] = nextPt[1 - baseIndex];
+        stepPoints.push(stepPt);
+        stepPoints.push(stepPt2);
+        break;
+
+      default:
+        stepPt[baseIndex] = pt[baseIndex];
+        stepPt[1 - baseIndex] = nextPt[1 - baseIndex]; // default is start
+
+        stepPoints.push(stepPt);
+    }
+  } // Last points
+
+
+  points[i] && stepPoints.push(points[i]);
+  return stepPoints;
+}
+
+function getVisualGradient(data, coordSys) {
+  var visualMetaList = data.getVisual('visualMeta');
+
+  if (!visualMetaList || !visualMetaList.length || !data.count()) {
+    // When data.count() is 0, gradient range can not be calculated.
+    return;
+  }
+
+  if (coordSys.type !== 'cartesian2d') {
+    return;
+  }
+
+  var coordDim;
+  var visualMeta;
+
+  for (var i = visualMetaList.length - 1; i >= 0; i--) {
+    var dimIndex = visualMetaList[i].dimension;
+    var dimName = data.dimensions[dimIndex];
+    var dimInfo = data.getDimensionInfo(dimName);
+    coordDim = dimInfo && dimInfo.coordDim; // Can only be x or y
+
+    if (coordDim === 'x' || coordDim === 'y') {
+      visualMeta = visualMetaList[i];
+      break;
+    }
+  }
+
+  if (!visualMeta) {
+    return;
+  } // If the area to be rendered is bigger than area defined by LinearGradient,
+  // the canvas spec prescribes that the color of the first stop and the last
+  // stop should be used. But if two stops are added at offset 0, in effect
+  // browsers use the color of the second stop to render area outside
+  // LinearGradient. So we can only infinitesimally extend area defined in
+  // LinearGradient to render `outerColors`.
+
+
+  var axis = coordSys.getAxis(coordDim); // dataToCoor mapping may not be linear, but must be monotonic.
+
+  var colorStops = map(visualMeta.stops, function (stop) {
+    return {
+      coord: axis.toGlobalCoord(axis.dataToCoord(stop.value)),
+      color: stop.color
+    };
+  });
+  var stopLen = colorStops.length;
+  var outerColors = visualMeta.outerColors.slice();
+
+  if (stopLen && colorStops[0].coord > colorStops[stopLen - 1].coord) {
+    colorStops.reverse();
+    outerColors.reverse();
+  }
+
+  var tinyExtent = 10; // Arbitrary value: 10px
+
+  var minCoord = colorStops[0].coord - tinyExtent;
+  var maxCoord = colorStops[stopLen - 1].coord + tinyExtent;
+  var coordSpan = maxCoord - minCoord;
+
+  if (coordSpan < 1e-3) {
+    return 'transparent';
+  }
+
+  each$1(colorStops, function (stop) {
+    stop.offset = (stop.coord - minCoord) / coordSpan;
+  });
+  colorStops.push({
+    offset: stopLen ? colorStops[stopLen - 1].offset : 0.5,
+    color: outerColors[1] || 'transparent'
+  });
+  colorStops.unshift({
+    // notice colorStops.length have been changed.
+    offset: stopLen ? colorStops[0].offset : 0.5,
+    color: outerColors[0] || 'transparent'
+  }); // zrUtil.each(colorStops, function (colorStop) {
+  //     // Make sure each offset has rounded px to avoid not sharp edge
+  //     colorStop.offset = (Math.round(colorStop.offset * (end - start) + start) - start) / (end - start);
+  // });
+
+  var gradient = new LinearGradient(0, 0, 0, 0, colorStops, true);
+  gradient[coordDim] = minCoord;
+  gradient[coordDim + '2'] = maxCoord;
+  return gradient;
+}
+
+function getIsIgnoreFunc(seriesModel, data, coordSys) {
+  var showAllSymbol = seriesModel.get('showAllSymbol');
+  var isAuto = showAllSymbol === 'auto';
+
+  if (showAllSymbol && !isAuto) {
+    return;
+  }
+
+  var categoryAxis = coordSys.getAxesByScale('ordinal')[0];
+
+  if (!categoryAxis) {
+    return;
+  } // Note that category label interval strategy might bring some weird effect
+  // in some scenario: users may wonder why some of the symbols are not
+  // displayed. So we show all symbols as possible as we can.
+
+
+  if (isAuto // Simplify the logic, do not determine label overlap here.
+  && canShowAllSymbolForCategory(categoryAxis, data)) {
+    return;
+  } // Otherwise follow the label interval strategy on category axis.
+
+
+  var categoryDataDim = data.mapDimension(categoryAxis.dim);
+  var labelMap = {};
+  each$1(categoryAxis.getViewLabels(), function (labelItem) {
+    labelMap[labelItem.tickValue] = 1;
+  });
+  return function (dataIndex) {
+    return !labelMap.hasOwnProperty(data.get(categoryDataDim, dataIndex));
+  };
+}
+
+function canShowAllSymbolForCategory(categoryAxis, data) {
+  // In mose cases, line is monotonous on category axis, and the label size
+  // is close with each other. So we check the symbol size and some of the
+  // label size alone with the category axis to estimate whether all symbol
+  // can be shown without overlap.
+  var axisExtent = categoryAxis.getExtent();
+  var availSize = Math.abs(axisExtent[1] - axisExtent[0]) / categoryAxis.scale.count();
+  isNaN(availSize) && (availSize = 0); // 0/0 is NaN.
+  // Sampling some points, max 5.
+
+  var dataLen = data.count();
+  var step = Math.max(1, Math.round(dataLen / 5));
+
+  for (var dataIndex = 0; dataIndex < dataLen; dataIndex += step) {
+    if (SymbolClz$1.getSymbolSize(data, dataIndex // Only for cartesian, where `isHorizontal` exists.
+    )[categoryAxis.isHorizontal() ? 1 : 0] // Empirical number
+    * 1.5 > availSize) {
+      return false;
+    }
+  }
+
+  return true;
+}
+
+Chart.extend({
+  type: 'line',
+  init: function () {
+    var lineGroup = new Group();
+    var symbolDraw = new SymbolDraw();
+    this.group.add(symbolDraw.group);
+    this._symbolDraw = symbolDraw;
+    this._lineGroup = lineGroup;
+  },
+  render: function (seriesModel, ecModel, api) {
+    var coordSys = seriesModel.coordinateSystem;
+    var group = this.group;
+    var data = seriesModel.getData();
+    var lineStyleModel = seriesModel.getModel('lineStyle');
+    var areaStyleModel = seriesModel.getModel('areaStyle');
+    var points = data.mapArray(data.getItemLayout);
+    var isCoordSysPolar = coordSys.type === 'polar';
+    var prevCoordSys = this._coordSys;
+    var symbolDraw = this._symbolDraw;
+    var polyline = this._polyline;
+    var polygon = this._polygon;
+    var lineGroup = this._lineGroup;
+    var hasAnimation = seriesModel.get('animation');
+    var isAreaChart = !areaStyleModel.isEmpty();
+    var valueOrigin = areaStyleModel.get('origin');
+    var dataCoordInfo = prepareDataCoordInfo(coordSys, data, valueOrigin);
+    var stackedOnPoints = getStackedOnPoints(coordSys, data, dataCoordInfo);
+    var showSymbol = seriesModel.get('showSymbol');
+    var isIgnoreFunc = showSymbol && !isCoordSysPolar && getIsIgnoreFunc(seriesModel, data, coordSys); // Remove temporary symbols
+
+    var oldData = this._data;
+    oldData && oldData.eachItemGraphicEl(function (el, idx) {
+      if (el.__temp) {
+        group.remove(el);
+        oldData.setItemGraphicEl(idx, null);
+      }
+    }); // Remove previous created symbols if showSymbol changed to false
+
+    if (!showSymbol) {
+      symbolDraw.remove();
+    }
+
+    group.add(lineGroup); // FIXME step not support polar
+
+    var step = !isCoordSysPolar && seriesModel.get('step'); // Initialization animation or coordinate system changed
+
+    if (!(polyline && prevCoordSys.type === coordSys.type && step === this._step)) {
+      showSymbol && symbolDraw.updateData(data, {
+        isIgnore: isIgnoreFunc,
+        clipShape: createClipShape(coordSys, false, true, seriesModel)
+      });
+
+      if (step) {
+        // TODO If stacked series is not step
+        points = turnPointsIntoStep(points, coordSys, step);
+        stackedOnPoints = turnPointsIntoStep(stackedOnPoints, coordSys, step);
+      }
+
+      polyline = this._newPolyline(points, coordSys, hasAnimation);
+
+      if (isAreaChart) {
+        polygon = this._newPolygon(points, stackedOnPoints, coordSys, hasAnimation);
+      }
+
+      lineGroup.setClipPath(createClipShape(coordSys, true, false, seriesModel));
+    } else {
+      if (isAreaChart && !polygon) {
+        // If areaStyle is added
+        polygon = this._newPolygon(points, stackedOnPoints, coordSys, hasAnimation);
+      } else if (polygon && !isAreaChart) {
+        // If areaStyle is removed
+        lineGroup.remove(polygon);
+        polygon = this._polygon = null;
+      } // Update clipPath
+
+
+      lineGroup.setClipPath(createClipShape(coordSys, false, false, seriesModel)); // Always update, or it is wrong in the case turning on legend
+      // because points are not changed
+
+      showSymbol && symbolDraw.updateData(data, {
+        isIgnore: isIgnoreFunc,
+        clipShape: createClipShape(coordSys, false, true, seriesModel)
+      }); // Stop symbol animation and sync with line points
+      // FIXME performance?
+
+      data.eachItemGraphicEl(function (el) {
+        el.stopAnimation(true);
+      }); // In the case data zoom triggerred refreshing frequently
+      // Data may not change if line has a category axis. So it should animate nothing
+
+      if (!isPointsSame(this._stackedOnPoints, stackedOnPoints) || !isPointsSame(this._points, points)) {
+        if (hasAnimation) {
+          this._updateAnimation(data, stackedOnPoints, coordSys, api, step, valueOrigin);
+        } else {
+          // Not do it in update with animation
+          if (step) {
+            // TODO If stacked series is not step
+            points = turnPointsIntoStep(points, coordSys, step);
+            stackedOnPoints = turnPointsIntoStep(stackedOnPoints, coordSys, step);
+          }
+
+          polyline.setShape({
+            points: points
+          });
+          polygon && polygon.setShape({
+            points: points,
+            stackedOnPoints: stackedOnPoints
+          });
+        }
+      }
+    }
+
+    var visualColor = getVisualGradient(data, coordSys) || data.getVisual('color');
+    polyline.useStyle(defaults( // Use color in lineStyle first
+    lineStyleModel.getLineStyle(), {
+      fill: 'none',
+      stroke: visualColor,
+      lineJoin: 'bevel'
+    }));
+    var smooth = seriesModel.get('smooth');
+    smooth = getSmooth(seriesModel.get('smooth'));
+    polyline.setShape({
+      smooth: smooth,
+      smoothMonotone: seriesModel.get('smoothMonotone'),
+      connectNulls: seriesModel.get('connectNulls')
+    });
+
+    if (polygon) {
+      var stackedOnSeries = data.getCalculationInfo('stackedOnSeries');
+      var stackedOnSmooth = 0;
+      polygon.useStyle(defaults(areaStyleModel.getAreaStyle(), {
+        fill: visualColor,
+        opacity: 0.7,
+        lineJoin: 'bevel'
+      }));
+
+      if (stackedOnSeries) {
+        stackedOnSmooth = getSmooth(stackedOnSeries.get('smooth'));
+      }
+
+      polygon.setShape({
+        smooth: smooth,
+        stackedOnSmooth: stackedOnSmooth,
+        smoothMonotone: seriesModel.get('smoothMonotone'),
+        connectNulls: seriesModel.get('connectNulls')
+      });
+    }
+
+    this._data = data; // Save the coordinate system for transition animation when data changed
+
+    this._coordSys = coordSys;
+    this._stackedOnPoints = stackedOnPoints;
+    this._points = points;
+    this._step = step;
+    this._valueOrigin = valueOrigin;
+  },
+  dispose: function () {},
+  highlight: function (seriesModel, ecModel, api, payload) {
+    var data = seriesModel.getData();
+    var dataIndex = queryDataIndex(data, payload);
+
+    if (!(dataIndex instanceof Array) && dataIndex != null && dataIndex >= 0) {
+      var symbol = data.getItemGraphicEl(dataIndex);
+
+      if (!symbol) {
+        // Create a temporary symbol if it is not exists
+        var pt = data.getItemLayout(dataIndex);
+
+        if (!pt) {
+          // Null data
+          return;
+        }
+
+        symbol = new SymbolClz$1(data, dataIndex);
+        symbol.position = pt;
+        symbol.setZ(seriesModel.get('zlevel'), seriesModel.get('z'));
+        symbol.ignore = isNaN(pt[0]) || isNaN(pt[1]);
+        symbol.__temp = true;
+        data.setItemGraphicEl(dataIndex, symbol); // Stop scale animation
+
+        symbol.stopSymbolAnimation(true);
+        this.group.add(symbol);
+      }
+
+      symbol.highlight();
+    } else {
+      // Highlight whole series
+      Chart.prototype.highlight.call(this, seriesModel, ecModel, api, payload);
+    }
+  },
+  downplay: function (seriesModel, ecModel, api, payload) {
+    var data = seriesModel.getData();
+    var dataIndex = queryDataIndex(data, payload);
+
+    if (dataIndex != null && dataIndex >= 0) {
+      var symbol = data.getItemGraphicEl(dataIndex);
+
+      if (symbol) {
+        if (symbol.__temp) {
+          data.setItemGraphicEl(dataIndex, null);
+          this.group.remove(symbol);
+        } else {
+          symbol.downplay();
+        }
+      }
+    } else {
+      // FIXME
+      // can not downplay completely.
+      // Downplay whole series
+      Chart.prototype.downplay.call(this, seriesModel, ecModel, api, payload);
+    }
+  },
+
+  /**
+   * @param {module:zrender/container/Group} group
+   * @param {Array.<Array.<number>>} points
+   * @private
+   */
+  _newPolyline: function (points) {
+    var polyline = this._polyline; // Remove previous created polyline
+
+    if (polyline) {
+      this._lineGroup.remove(polyline);
+    }
+
+    polyline = new Polyline$1({
+      shape: {
+        points: points
+      },
+      silent: true,
+      z2: 10
+    });
+
+    this._lineGroup.add(polyline);
+
+    this._polyline = polyline;
+    return polyline;
+  },
+
+  /**
+   * @param {module:zrender/container/Group} group
+   * @param {Array.<Array.<number>>} stackedOnPoints
+   * @param {Array.<Array.<number>>} points
+   * @private
+   */
+  _newPolygon: function (points, stackedOnPoints) {
+    var polygon = this._polygon; // Remove previous created polygon
+
+    if (polygon) {
+      this._lineGroup.remove(polygon);
+    }
+
+    polygon = new Polygon$1({
+      shape: {
+        points: points,
+        stackedOnPoints: stackedOnPoints
+      },
+      silent: true
+    });
+
+    this._lineGroup.add(polygon);
+
+    this._polygon = polygon;
+    return polygon;
+  },
+
+  /**
+   * @private
+   */
+  // FIXME Two value axis
+  _updateAnimation: function (data, stackedOnPoints, coordSys, api, step, valueOrigin) {
+    var polyline = this._polyline;
+    var polygon = this._polygon;
+    var seriesModel = data.hostModel;
+    var diff = lineAnimationDiff(this._data, data, this._stackedOnPoints, stackedOnPoints, this._coordSys, coordSys, this._valueOrigin, valueOrigin);
+    var current = diff.current;
+    var stackedOnCurrent = diff.stackedOnCurrent;
+    var next = diff.next;
+    var stackedOnNext = diff.stackedOnNext;
+
+    if (step) {
+      // TODO If stacked series is not step
+      current = turnPointsIntoStep(diff.current, coordSys, step);
+      stackedOnCurrent = turnPointsIntoStep(diff.stackedOnCurrent, coordSys, step);
+      next = turnPointsIntoStep(diff.next, coordSys, step);
+      stackedOnNext = turnPointsIntoStep(diff.stackedOnNext, coordSys, step);
+    } // `diff.current` is subset of `current` (which should be ensured by
+    // turnPointsIntoStep), so points in `__points` can be updated when
+    // points in `current` are update during animation.
+
+
+    polyline.shape.__points = diff.current;
+    polyline.shape.points = current;
+    updateProps(polyline, {
+      shape: {
+        points: next
+      }
+    }, seriesModel);
+
+    if (polygon) {
+      polygon.setShape({
+        points: current,
+        stackedOnPoints: stackedOnCurrent
+      });
+      updateProps(polygon, {
+        shape: {
+          points: next,
+          stackedOnPoints: stackedOnNext
+        }
+      }, seriesModel);
+    }
+
+    var updatedDataInfo = [];
+    var diffStatus = diff.status;
+
+    for (var i = 0; i < diffStatus.length; i++) {
+      var cmd = diffStatus[i].cmd;
+
+      if (cmd === '=') {
+        var el = data.getItemGraphicEl(diffStatus[i].idx1);
+
+        if (el) {
+          updatedDataInfo.push({
+            el: el,
+            ptIdx: i // Index of points
+
+          });
+        }
+      }
+    }
+
+    if (polyline.animators && polyline.animators.length) {
+      polyline.animators[0].during(function () {
+        for (var i = 0; i < updatedDataInfo.length; i++) {
+          var el = updatedDataInfo[i].el;
+          el.attr('position', polyline.shape.__points[updatedDataInfo[i].ptIdx]);
+        }
+      });
+    }
+  },
+  remove: function (ecModel) {
+    var group = this.group;
+    var oldData = this._data;
+
+    this._lineGroup.removeAll();
+
+    this._symbolDraw.remove(true); // Remove temporary created elements when highlighting
+
+
+    oldData && oldData.eachItemGraphicEl(function (el, idx) {
+      if (el.__temp) {
+        group.remove(el);
+        oldData.setItemGraphicEl(idx, null);
+      }
+    });
+    this._polyline = this._polygon = this._coordSys = this._points = this._stackedOnPoints = this._data = null;
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var visualSymbol = function (seriesType, defaultSymbolType, legendSymbol) {
+  // Encoding visual for all series include which is filtered for legend drawing
+  return {
+    seriesType: seriesType,
+    // For legend.
+    performRawSeries: true,
+    reset: function (seriesModel, ecModel, api) {
+      var data = seriesModel.getData();
+      var symbolType = seriesModel.get('symbol') || defaultSymbolType;
+      var symbolSize = seriesModel.get('symbolSize');
+      var keepAspect = seriesModel.get('symbolKeepAspect');
+      data.setVisual({
+        legendSymbol: legendSymbol || symbolType,
+        symbol: symbolType,
+        symbolSize: symbolSize,
+        symbolKeepAspect: keepAspect
+      }); // Only visible series has each data be visual encoded
+
+      if (ecModel.isSeriesFiltered(seriesModel)) {
+        return;
+      }
+
+      var hasCallback = typeof symbolSize === 'function';
+
+      function dataEach(data, idx) {
+        if (typeof symbolSize === 'function') {
+          var rawValue = seriesModel.getRawValue(idx); // FIXME
+
+          var params = seriesModel.getDataParams(idx);
+          data.setItemVisual(idx, 'symbolSize', symbolSize(rawValue, params));
+        }
+
+        if (data.hasItemOption) {
+          var itemModel = data.getItemModel(idx);
+          var itemSymbolType = itemModel.getShallow('symbol', true);
+          var itemSymbolSize = itemModel.getShallow('symbolSize', true);
+          var itemSymbolKeepAspect = itemModel.getShallow('symbolKeepAspect', true); // If has item symbol
+
+          if (itemSymbolType != null) {
+            data.setItemVisual(idx, 'symbol', itemSymbolType);
+          }
+
+          if (itemSymbolSize != null) {
+            // PENDING Transform symbolSize ?
+            data.setItemVisual(idx, 'symbolSize', itemSymbolSize);
+          }
+
+          if (itemSymbolKeepAspect != null) {
+            data.setItemVisual(idx, 'symbolKeepAspect', itemSymbolKeepAspect);
+          }
+        }
+      }
+
+      return {
+        dataEach: data.hasItemOption || hasCallback ? dataEach : null
+      };
+    }
+  };
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/* global Float32Array */
+var pointsLayout = function (seriesType) {
+  return {
+    seriesType: seriesType,
+    plan: createRenderPlanner(),
+    reset: function (seriesModel) {
+      var data = seriesModel.getData();
+      var coordSys = seriesModel.coordinateSystem;
+      var pipelineContext = seriesModel.pipelineContext;
+      var isLargeRender = pipelineContext.large;
+
+      if (!coordSys) {
+        return;
+      }
+
+      var dims = map(coordSys.dimensions, function (dim) {
+        return data.mapDimension(dim);
+      }).slice(0, 2);
+      var dimLen = dims.length;
+      var stackResultDim = data.getCalculationInfo('stackResultDimension');
+
+      if (isDimensionStacked(data, dims[0]
+      /*, dims[1]*/
+      )) {
+        dims[0] = stackResultDim;
+      }
+
+      if (isDimensionStacked(data, dims[1]
+      /*, dims[0]*/
+      )) {
+        dims[1] = stackResultDim;
+      }
+
+      function progress(params, data) {
+        var segCount = params.end - params.start;
+        var points = isLargeRender && new Float32Array(segCount * dimLen);
+
+        for (var i = params.start, offset = 0, tmpIn = [], tmpOut = []; i < params.end; i++) {
+          var point;
+
+          if (dimLen === 1) {
+            var x = data.get(dims[0], i);
+            point = !isNaN(x) && coordSys.dataToPoint(x, null, tmpOut);
+          } else {
+            var x = tmpIn[0] = data.get(dims[0], i);
+            var y = tmpIn[1] = data.get(dims[1], i); // Also {Array.<number>}, not undefined to avoid if...else... statement
+
+            point = !isNaN(x) && !isNaN(y) && coordSys.dataToPoint(tmpIn, null, tmpOut);
+          }
+
+          if (isLargeRender) {
+            points[offset++] = point ? point[0] : NaN;
+            points[offset++] = point ? point[1] : NaN;
+          } else {
+            data.setItemLayout(i, point && point.slice() || [NaN, NaN]);
+          }
+        }
+
+        isLargeRender && data.setLayout('symbolPoints', points);
+      }
+
+      return dimLen && {
+        progress: progress
+      };
+    }
+  };
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var samplers = {
+  average: function (frame) {
+    var sum = 0;
+    var count = 0;
+
+    for (var i = 0; i < frame.length; i++) {
+      if (!isNaN(frame[i])) {
+        sum += frame[i];
+        count++;
+      }
+    } // Return NaN if count is 0
+
+
+    return count === 0 ? NaN : sum / count;
+  },
+  sum: function (frame) {
+    var sum = 0;
+
+    for (var i = 0; i < frame.length; i++) {
+      // Ignore NaN
+      sum += frame[i] || 0;
+    }
+
+    return sum;
+  },
+  max: function (frame) {
+    var max = -Infinity;
+
+    for (var i = 0; i < frame.length; i++) {
+      frame[i] > max && (max = frame[i]);
+    } // NaN will cause illegal axis extent.
+
+
+    return isFinite(max) ? max : NaN;
+  },
+  min: function (frame) {
+    var min = Infinity;
+
+    for (var i = 0; i < frame.length; i++) {
+      frame[i] < min && (min = frame[i]);
+    } // NaN will cause illegal axis extent.
+
+
+    return isFinite(min) ? min : NaN;
+  },
+  // TODO
+  // Median
+  nearest: function (frame) {
+    return frame[0];
+  }
+};
+
+var indexSampler = function (frame, value) {
+  return Math.round(frame.length / 2);
+};
+
+var dataSample = function (seriesType) {
+  return {
+    seriesType: seriesType,
+    modifyOutputEnd: true,
+    reset: function (seriesModel, ecModel, api) {
+      var data = seriesModel.getData();
+      var sampling = seriesModel.get('sampling');
+      var coordSys = seriesModel.coordinateSystem; // Only cartesian2d support down sampling
+
+      if (coordSys.type === 'cartesian2d' && sampling) {
+        var baseAxis = coordSys.getBaseAxis();
+        var valueAxis = coordSys.getOtherAxis(baseAxis);
+        var extent = baseAxis.getExtent(); // Coordinste system has been resized
+
+        var size = extent[1] - extent[0];
+        var rate = Math.round(data.count() / size);
+
+        if (rate > 1) {
+          var sampler;
+
+          if (typeof sampling === 'string') {
+            sampler = samplers[sampling];
+          } else if (typeof sampling === 'function') {
+            sampler = sampling;
+          }
+
+          if (sampler) {
+            // Only support sample the first dim mapped from value axis.
+            seriesModel.setData(data.downSample(data.mapDimension(valueAxis.dim), 1 / rate, sampler, indexSampler));
+          }
+        }
+      }
+    }
+  };
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+registerVisual(visualSymbol('line', 'circle', 'line'));
+registerLayout(pointsLayout('line')); // Down sample after filter
+
+registerProcessor(PRIORITY.PROCESSOR.STATISTIC, dataSample('line'));
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+/**
+ * [Usage]:
+ * (1)
+ * createListSimply(seriesModel, ['value']);
+ * (2)
+ * createListSimply(seriesModel, {
+ *     coordDimensions: ['value'],
+ *     dimensionsCount: 5
+ * });
+ *
+ * @param {module:echarts/model/Series} seriesModel
+ * @param {Object|Array.<string|Object>} opt opt or coordDimensions
+ *        The options in opt, see `echarts/data/helper/createDimensions`
+ * @param {Array.<string>} [nameList]
+ * @return {module:echarts/data/List}
+ */
+
+var createListSimply = function (seriesModel, opt, nameList) {
+  opt = isArray(opt) && {
+    coordDimensions: opt
+  } || extend({}, opt);
+  var source = seriesModel.getSource();
+  var dimensionsInfo = createDimensions(source, opt);
+  var list = new List(dimensionsInfo, seriesModel);
+  list.initData(source, nameList);
+  return list;
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * Data selectable mixin for chart series.
+ * To eanble data select, option of series must have `selectedMode`.
+ * And each data item will use `selected` to toggle itself selected status
+ */
+var selectableMixin = {
+  /**
+   * @param {Array.<Object>} targetList [{name, value, selected}, ...]
+   *        If targetList is an array, it should like [{name: ..., value: ...}, ...].
+   *        If targetList is a "List", it must have coordDim: 'value' dimension and name.
+   */
+  updateSelectedMap: function (targetList) {
+    this._targetList = isArray(targetList) ? targetList.slice() : [];
+    this._selectTargetMap = reduce(targetList || [], function (targetMap, target) {
+      targetMap.set(target.name, target);
+      return targetMap;
+    }, createHashMap());
+  },
+
+  /**
+   * Either name or id should be passed as input here.
+   * If both of them are defined, id is used.
+   *
+   * @param {string|undefined} name name of data
+   * @param {number|undefined} id dataIndex of data
+   */
+  // PENGING If selectedMode is null ?
+  select: function (name, id) {
+    var target = id != null ? this._targetList[id] : this._selectTargetMap.get(name);
+    var selectedMode = this.get('selectedMode');
+
+    if (selectedMode === 'single') {
+      this._selectTargetMap.each(function (target) {
+        target.selected = false;
+      });
+    }
+
+    target && (target.selected = true);
+  },
+
+  /**
+   * Either name or id should be passed as input here.
+   * If both of them are defined, id is used.
+   *
+   * @param {string|undefined} name name of data
+   * @param {number|undefined} id dataIndex of data
+   */
+  unSelect: function (name, id) {
+    var target = id != null ? this._targetList[id] : this._selectTargetMap.get(name); // var selectedMode = this.get('selectedMode');
+    // selectedMode !== 'single' && target && (target.selected = false);
+
+    target && (target.selected = false);
+  },
+
+  /**
+   * Either name or id should be passed as input here.
+   * If both of them are defined, id is used.
+   *
+   * @param {string|undefined} name name of data
+   * @param {number|undefined} id dataIndex of data
+   */
+  toggleSelected: function (name, id) {
+    var target = id != null ? this._targetList[id] : this._selectTargetMap.get(name);
+
+    if (target != null) {
+      this[target.selected ? 'unSelect' : 'select'](name, id);
+      return target.selected;
+    }
+  },
+
+  /**
+   * Either name or id should be passed as input here.
+   * If both of them are defined, id is used.
+   *
+   * @param {string|undefined} name name of data
+   * @param {number|undefined} id dataIndex of data
+   */
+  isSelected: function (name, id) {
+    var target = id != null ? this._targetList[id] : this._selectTargetMap.get(name);
+    return target && target.selected;
+  }
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var PieSeries = extendSeriesModel({
+  type: 'series.pie',
+  // Overwrite
+  init: function (option) {
+    PieSeries.superApply(this, 'init', arguments); // Enable legend selection for each data item
+    // Use a function instead of direct access because data reference may changed
+
+    this.legendDataProvider = function () {
+      return this.getRawData();
+    };
+
+    this.updateSelectedMap(this._createSelectableList());
+
+    this._defaultLabelLine(option);
+  },
+  // Overwrite
+  mergeOption: function (newOption) {
+    PieSeries.superCall(this, 'mergeOption', newOption);
+    this.updateSelectedMap(this._createSelectableList());
+  },
+  getInitialData: function (option, ecModel) {
+    return createListSimply(this, ['value']);
+  },
+  _createSelectableList: function () {
+    var data = this.getRawData();
+    var valueDim = data.mapDimension('value');
+    var targetList = [];
+
+    for (var i = 0, len = data.count(); i < len; i++) {
+      targetList.push({
+        name: data.getName(i),
+        value: data.get(valueDim, i),
+        selected: retrieveRawAttr(data, i, 'selected')
+      });
+    }
+
+    return targetList;
+  },
+  // Overwrite
+  getDataParams: function (dataIndex) {
+    var data = this.getData();
+    var params = PieSeries.superCall(this, 'getDataParams', dataIndex); // FIXME toFixed?
+
+    var valueList = [];
+    data.each(data.mapDimension('value'), function (value) {
+      valueList.push(value);
+    });
+    params.percent = getPercentWithPrecision(valueList, dataIndex, data.hostModel.get('percentPrecision'));
+    params.$vars.push('percent');
+    return params;
+  },
+  _defaultLabelLine: function (option) {
+    // Extend labelLine emphasis
+    defaultEmphasis(option, 'labelLine', ['show']);
+    var labelLineNormalOpt = option.labelLine;
+    var labelLineEmphasisOpt = option.emphasis.labelLine; // Not show label line if `label.normal.show = false`
+
+    labelLineNormalOpt.show = labelLineNormalOpt.show && option.label.show;
+    labelLineEmphasisOpt.show = labelLineEmphasisOpt.show && option.emphasis.label.show;
+  },
+  defaultOption: {
+    zlevel: 0,
+    z: 2,
+    legendHoverLink: true,
+    hoverAnimation: true,
+    // 榛樿鍏ㄥ眬灞呬腑
+    center: ['50%', '50%'],
+    radius: [0, '75%'],
+    // 榛樿椤烘椂閽�
+    clockwise: true,
+    startAngle: 90,
+    // 鏈�灏忚搴︽敼涓�0
+    minAngle: 0,
+    // 閫変腑鏃舵墖鍖哄亸绉婚噺
+    selectedOffset: 10,
+    // 楂樹寒鎵囧尯鍋忕Щ閲�
+    hoverOffset: 10,
+    // If use strategy to avoid label overlapping
+    avoidLabelOverlap: true,
+    // 閫夋嫨妯″紡锛岄粯璁ゅ叧闂紝鍙�塻ingle锛宮ultiple
+    // selectedMode: false,
+    // 鍗椾竵鏍煎皵鐜懓鍥炬ā寮忥紝'radius'锛堝崐寰勶級 | 'area'锛堥潰绉級
+    // roseType: null,
+    percentPrecision: 2,
+    // If still show when all data zero.
+    stillShowZeroSum: true,
+    // cursor: null,
+    label: {
+      // If rotate around circle
+      rotate: false,
+      show: true,
+      // 'outer', 'inside', 'center'
+      position: 'outer' // formatter: 鏍囩鏂囨湰鏍煎紡鍣紝鍚孴ooltip.formatter锛屼笉鏀寔寮傛鍥炶皟
+      // 榛樿浣跨敤鍏ㄥ眬鏂囨湰鏍峰紡锛岃瑙乀EXTSTYLE
+      // distance: 褰損osition涓篿nner鏃舵湁鏁堬紝涓簂abel浣嶇疆鍒板渾蹇冪殑璺濈涓庡渾鍗婂緞(鐜姸鍥句负鍐呭鍗婂緞鍜�)鐨勬瘮渚嬬郴鏁�
+
+    },
+    // Enabled when label.normal.position is 'outer'
+    labelLine: {
+      show: true,
+      // 寮曞绾夸袱娈典腑鐨勭涓�娈甸暱搴�
+      length: 15,
+      // 寮曞绾夸袱娈典腑鐨勭浜屾闀垮害
+      length2: 15,
+      smooth: false,
+      lineStyle: {
+        // color: 鍚勫紓,
+        width: 1,
+        type: 'solid'
+      }
+    },
+    itemStyle: {
+      borderWidth: 1
+    },
+    // Animation type canbe expansion, scale
+    animationType: 'expansion',
+    animationEasing: 'cubicOut'
+  }
+});
+mixin(PieSeries, selectableMixin);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+/**
+ * @param {module:echarts/model/Series} seriesModel
+ * @param {boolean} hasAnimation
+ * @inner
+ */
+
+function updateDataSelected(uid, seriesModel, hasAnimation, api) {
+  var data = seriesModel.getData();
+  var dataIndex = this.dataIndex;
+  var name = data.getName(dataIndex);
+  var selectedOffset = seriesModel.get('selectedOffset');
+  api.dispatchAction({
+    type: 'pieToggleSelect',
+    from: uid,
+    name: name,
+    seriesId: seriesModel.id
+  });
+  data.each(function (idx) {
+    toggleItemSelected(data.getItemGraphicEl(idx), data.getItemLayout(idx), seriesModel.isSelected(data.getName(idx)), selectedOffset, hasAnimation);
+  });
+}
+/**
+ * @param {module:zrender/graphic/Sector} el
+ * @param {Object} layout
+ * @param {boolean} isSelected
+ * @param {number} selectedOffset
+ * @param {boolean} hasAnimation
+ * @inner
+ */
+
+
+function toggleItemSelected(el, layout, isSelected, selectedOffset, hasAnimation) {
+  var midAngle = (layout.startAngle + layout.endAngle) / 2;
+  var dx = Math.cos(midAngle);
+  var dy = Math.sin(midAngle);
+  var offset = isSelected ? selectedOffset : 0;
+  var position = [dx * offset, dy * offset];
+  hasAnimation // animateTo will stop revious animation like update transition
+  ? el.animate().when(200, {
+    position: position
+  }).start('bounceOut') : el.attr('position', position);
+}
+/**
+ * Piece of pie including Sector, Label, LabelLine
+ * @constructor
+ * @extends {module:zrender/graphic/Group}
+ */
+
+
+function PiePiece(data, idx) {
+  Group.call(this);
+  var sector = new Sector({
+    z2: 2
+  });
+  var polyline = new Polyline();
+  var text = new Text();
+  this.add(sector);
+  this.add(polyline);
+  this.add(text);
+  this.updateData(data, idx, true); // Hover to change label and labelLine
+
+  function onEmphasis() {
+    polyline.ignore = polyline.hoverIgnore;
+    text.ignore = text.hoverIgnore;
+  }
+
+  function onNormal() {
+    polyline.ignore = polyline.normalIgnore;
+    text.ignore = text.normalIgnore;
+  }
+
+  this.on('emphasis', onEmphasis).on('normal', onNormal).on('mouseover', onEmphasis).on('mouseout', onNormal);
+}
+
+var piePieceProto = PiePiece.prototype;
+
+piePieceProto.updateData = function (data, idx, firstCreate) {
+  var sector = this.childAt(0);
+  var seriesModel = data.hostModel;
+  var itemModel = data.getItemModel(idx);
+  var layout = data.getItemLayout(idx);
+  var sectorShape = extend({}, layout);
+  sectorShape.label = null;
+
+  if (firstCreate) {
+    sector.setShape(sectorShape);
+    var animationType = seriesModel.getShallow('animationType');
+
+    if (animationType === 'scale') {
+      sector.shape.r = layout.r0;
+      initProps(sector, {
+        shape: {
+          r: layout.r
+        }
+      }, seriesModel, idx);
+    } // Expansion
+    else {
+        sector.shape.endAngle = layout.startAngle;
+        updateProps(sector, {
+          shape: {
+            endAngle: layout.endAngle
+          }
+        }, seriesModel, idx);
+      }
+  } else {
+    updateProps(sector, {
+      shape: sectorShape
+    }, seriesModel, idx);
+  } // Update common style
+
+
+  var visualColor = data.getItemVisual(idx, 'color');
+  sector.useStyle(defaults({
+    lineJoin: 'bevel',
+    fill: visualColor
+  }, itemModel.getModel('itemStyle').getItemStyle()));
+  sector.hoverStyle = itemModel.getModel('emphasis.itemStyle').getItemStyle();
+  var cursorStyle = itemModel.getShallow('cursor');
+  cursorStyle && sector.attr('cursor', cursorStyle); // Toggle selected
+
+  toggleItemSelected(this, data.getItemLayout(idx), seriesModel.isSelected(null, idx), seriesModel.get('selectedOffset'), seriesModel.get('animation'));
+
+  function onEmphasis() {
+    // Sector may has animation of updating data. Force to move to the last frame
+    // Or it may stopped on the wrong shape
+    sector.stopAnimation(true);
+    sector.animateTo({
+      shape: {
+        r: layout.r + seriesModel.get('hoverOffset')
+      }
+    }, 300, 'elasticOut');
+  }
+
+  function onNormal() {
+    sector.stopAnimation(true);
+    sector.animateTo({
+      shape: {
+        r: layout.r
+      }
+    }, 300, 'elasticOut');
+  }
+
+  sector.off('mouseover').off('mouseout').off('emphasis').off('normal');
+
+  if (itemModel.get('hoverAnimation') && seriesModel.isAnimationEnabled()) {
+    sector.on('mouseover', onEmphasis).on('mouseout', onNormal).on('emphasis', onEmphasis).on('normal', onNormal);
+  }
+
+  this._updateLabel(data, idx);
+
+  setHoverStyle(this);
+};
+
+piePieceProto._updateLabel = function (data, idx) {
+  var labelLine = this.childAt(1);
+  var labelText = this.childAt(2);
+  var seriesModel = data.hostModel;
+  var itemModel = data.getItemModel(idx);
+  var layout = data.getItemLayout(idx);
+  var labelLayout = layout.label;
+  var visualColor = data.getItemVisual(idx, 'color');
+  updateProps(labelLine, {
+    shape: {
+      points: labelLayout.linePoints || [[labelLayout.x, labelLayout.y], [labelLayout.x, labelLayout.y], [labelLayout.x, labelLayout.y]]
+    }
+  }, seriesModel, idx);
+  updateProps(labelText, {
+    style: {
+      x: labelLayout.x,
+      y: labelLayout.y
+    }
+  }, seriesModel, idx);
+  labelText.attr({
+    rotation: labelLayout.rotation,
+    origin: [labelLayout.x, labelLayout.y],
+    z2: 10
+  });
+  var labelModel = itemModel.getModel('label');
+  var labelHoverModel = itemModel.getModel('emphasis.label');
+  var labelLineModel = itemModel.getModel('labelLine');
+  var labelLineHoverModel = itemModel.getModel('emphasis.labelLine');
+  var visualColor = data.getItemVisual(idx, 'color');
+  setLabelStyle(labelText.style, labelText.hoverStyle = {}, labelModel, labelHoverModel, {
+    labelFetcher: data.hostModel,
+    labelDataIndex: idx,
+    defaultText: data.getName(idx),
+    autoColor: visualColor,
+    useInsideStyle: !!labelLayout.inside
+  }, {
+    textAlign: labelLayout.textAlign,
+    textVerticalAlign: labelLayout.verticalAlign,
+    opacity: data.getItemVisual(idx, 'opacity')
+  });
+  labelText.ignore = labelText.normalIgnore = !labelModel.get('show');
+  labelText.hoverIgnore = !labelHoverModel.get('show');
+  labelLine.ignore = labelLine.normalIgnore = !labelLineModel.get('show');
+  labelLine.hoverIgnore = !labelLineHoverModel.get('show'); // Default use item visual color
+
+  labelLine.setStyle({
+    stroke: visualColor,
+    opacity: data.getItemVisual(idx, 'opacity')
+  });
+  labelLine.setStyle(labelLineModel.getModel('lineStyle').getLineStyle());
+  labelLine.hoverStyle = labelLineHoverModel.getModel('lineStyle').getLineStyle();
+  var smooth = labelLineModel.get('smooth');
+
+  if (smooth && smooth === true) {
+    smooth = 0.4;
+  }
+
+  labelLine.setShape({
+    smooth: smooth
+  });
+};
+
+inherits(PiePiece, Group); // Pie view
+
+var PieView = Chart.extend({
+  type: 'pie',
+  init: function () {
+    var sectorGroup = new Group();
+    this._sectorGroup = sectorGroup;
+  },
+  render: function (seriesModel, ecModel, api, payload) {
+    if (payload && payload.from === this.uid) {
+      return;
+    }
+
+    var data = seriesModel.getData();
+    var oldData = this._data;
+    var group = this.group;
+    var hasAnimation = ecModel.get('animation');
+    var isFirstRender = !oldData;
+    var animationType = seriesModel.get('animationType');
+    var onSectorClick = curry(updateDataSelected, this.uid, seriesModel, hasAnimation, api);
+    var selectedMode = seriesModel.get('selectedMode');
+    data.diff(oldData).add(function (idx) {
+      var piePiece = new PiePiece(data, idx); // Default expansion animation
+
+      if (isFirstRender && animationType !== 'scale') {
+        piePiece.eachChild(function (child) {
+          child.stopAnimation(true);
+        });
+      }
+
+      selectedMode && piePiece.on('click', onSectorClick);
+      data.setItemGraphicEl(idx, piePiece);
+      group.add(piePiece);
+    }).update(function (newIdx, oldIdx) {
+      var piePiece = oldData.getItemGraphicEl(oldIdx);
+      piePiece.updateData(data, newIdx);
+      piePiece.off('click');
+      selectedMode && piePiece.on('click', onSectorClick);
+      group.add(piePiece);
+      data.setItemGraphicEl(newIdx, piePiece);
+    }).remove(function (idx) {
+      var piePiece = oldData.getItemGraphicEl(idx);
+      group.remove(piePiece);
+    }).execute();
+
+    if (hasAnimation && isFirstRender && data.count() > 0 // Default expansion animation
+    && animationType !== 'scale') {
+      var shape = data.getItemLayout(0);
+      var r = Math.max(api.getWidth(), api.getHeight()) / 2;
+      var removeClipPath = bind(group.removeClipPath, group);
+      group.setClipPath(this._createClipPath(shape.cx, shape.cy, r, shape.startAngle, shape.clockwise, removeClipPath, seriesModel));
+    } else {
+      // clipPath is used in first-time animation, so remove it when otherwise. See: #8994
+      group.removeClipPath();
+    }
+
+    this._data = data;
+  },
+  dispose: function () {},
+  _createClipPath: function (cx, cy, r, startAngle, clockwise, cb, seriesModel) {
+    var clipPath = new Sector({
+      shape: {
+        cx: cx,
+        cy: cy,
+        r0: 0,
+        r: r,
+        startAngle: startAngle,
+        endAngle: startAngle,
+        clockwise: clockwise
+      }
+    });
+    initProps(clipPath, {
+      shape: {
+        endAngle: startAngle + (clockwise ? 1 : -1) * Math.PI * 2
+      }
+    }, seriesModel, cb);
+    return clipPath;
+  },
+
+  /**
+   * @implement
+   */
+  containPoint: function (point, seriesModel) {
+    var data = seriesModel.getData();
+    var itemLayout = data.getItemLayout(0);
+
+    if (itemLayout) {
+      var dx = point[0] - itemLayout.cx;
+      var dy = point[1] - itemLayout.cy;
+      var radius = Math.sqrt(dx * dx + dy * dy);
+      return radius <= itemLayout.r && radius >= itemLayout.r0;
+    }
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var createDataSelectAction = function (seriesType, actionInfos) {
+  each$1(actionInfos, function (actionInfo) {
+    actionInfo.update = 'updateView';
+    /**
+     * @payload
+     * @property {string} seriesName
+     * @property {string} name
+     */
+
+    registerAction(actionInfo, function (payload, ecModel) {
+      var selected = {};
+      ecModel.eachComponent({
+        mainType: 'series',
+        subType: seriesType,
+        query: payload
+      }, function (seriesModel) {
+        if (seriesModel[actionInfo.method]) {
+          seriesModel[actionInfo.method](payload.name, payload.dataIndex);
+        }
+
+        var data = seriesModel.getData(); // Create selected map
+
+        data.each(function (idx) {
+          var name = data.getName(idx);
+          selected[name] = seriesModel.isSelected(name) || false;
+        });
+      });
+      return {
+        name: payload.name,
+        selected: selected
+      };
+    });
+  });
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+// Pick color from palette for each data item.
+// Applicable for charts that require applying color palette
+// in data level (like pie, funnel, chord).
+var dataColor = function (seriesType) {
+  return {
+    getTargetSeries: function (ecModel) {
+      // Pie and funnel may use diferrent scope
+      var paletteScope = {};
+      var seiresModelMap = createHashMap();
+      ecModel.eachSeriesByType(seriesType, function (seriesModel) {
+        seriesModel.__paletteScope = paletteScope;
+        seiresModelMap.set(seriesModel.uid, seriesModel);
+      });
+      return seiresModelMap;
+    },
+    reset: function (seriesModel, ecModel) {
+      var dataAll = seriesModel.getRawData();
+      var idxMap = {};
+      var data = seriesModel.getData();
+      data.each(function (idx) {
+        var rawIdx = data.getRawIndex(idx);
+        idxMap[rawIdx] = idx;
+      });
+      dataAll.each(function (rawIdx) {
+        var filteredIdx = idxMap[rawIdx]; // If series.itemStyle.normal.color is a function. itemVisual may be encoded
+
+        var singleDataColor = filteredIdx != null && data.getItemVisual(filteredIdx, 'color', true);
+
+        if (!singleDataColor) {
+          // FIXME Performance
+          var itemModel = dataAll.getItemModel(rawIdx);
+          var color = itemModel.get('itemStyle.color') || seriesModel.getColorFromPalette(dataAll.getName(rawIdx) || rawIdx + '', seriesModel.__paletteScope, dataAll.count()); // Legend may use the visual info in data before processed
+
+          dataAll.setItemVisual(rawIdx, 'color', color); // Data is not filtered
+
+          if (filteredIdx != null) {
+            data.setItemVisual(filteredIdx, 'color', color);
+          }
+        } else {
+          // Set data all color for legend
+          dataAll.setItemVisual(rawIdx, 'color', singleDataColor);
+        }
+      });
+    }
+  };
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+// FIXME emphasis label position is not same with normal label position
+function adjustSingleSide(list, cx, cy, r, dir, viewWidth, viewHeight) {
+  list.sort(function (a, b) {
+    return a.y - b.y;
+  }); // 鍘�
+
+  function shiftDown(start, end, delta, dir) {
+    for (var j = start; j < end; j++) {
+      list[j].y += delta;
+
+      if (j > start && j + 1 < end && list[j + 1].y > list[j].y + list[j].height) {
+        shiftUp(j, delta / 2);
+        return;
+      }
+    }
+
+    shiftUp(end - 1, delta / 2);
+  } // 寮�
+
+
+  function shiftUp(end, delta) {
+    for (var j = end; j >= 0; j--) {
+      list[j].y -= delta;
+
+      if (j > 0 && list[j].y > list[j - 1].y + list[j - 1].height) {
+        break;
+      }
+    }
+  }
+
+  function changeX(list, isDownList, cx, cy, r, dir) {
+    var lastDeltaX = dir > 0 ? isDownList // 鍙充晶
+    ? Number.MAX_VALUE // 涓�
+    : 0 // 涓�
+    : isDownList // 宸︿晶
+    ? Number.MAX_VALUE // 涓�
+    : 0; // 涓�
+
+    for (var i = 0, l = list.length; i < l; i++) {
+      // Not change x for center label
+      if (list[i].position === 'center') {
+        continue;
+      }
+
+      var deltaY = Math.abs(list[i].y - cy);
+      var length = list[i].len;
+      var length2 = list[i].len2;
+      var deltaX = deltaY < r + length ? Math.sqrt((r + length + length2) * (r + length + length2) - deltaY * deltaY) : Math.abs(list[i].x - cx);
+
+      if (isDownList && deltaX >= lastDeltaX) {
+        // 鍙充笅锛屽乏涓�
+        deltaX = lastDeltaX - 10;
+      }
+
+      if (!isDownList && deltaX <= lastDeltaX) {
+        // 鍙充笂锛屽乏涓�
+        deltaX = lastDeltaX + 10;
+      }
+
+      list[i].x = cx + deltaX * dir;
+      lastDeltaX = deltaX;
+    }
+  }
+
+  var lastY = 0;
+  var delta;
+  var len = list.length;
+  var upList = [];
+  var downList = [];
+
+  for (var i = 0; i < len; i++) {
+    delta = list[i].y - lastY;
+
+    if (delta < 0) {
+      shiftDown(i, len, -delta, dir);
+    }
+
+    lastY = list[i].y + list[i].height;
+  }
+
+  if (viewHeight - lastY < 0) {
+    shiftUp(len - 1, lastY - viewHeight);
+  }
+
+  for (var i = 0; i < len; i++) {
+    if (list[i].y >= cy) {
+      downList.push(list[i]);
+    } else {
+      upList.push(list[i]);
+    }
+  }
+
+  changeX(upList, false, cx, cy, r, dir);
+  changeX(downList, true, cx, cy, r, dir);
+}
+
+function avoidOverlap(labelLayoutList, cx, cy, r, viewWidth, viewHeight) {
+  var leftList = [];
+  var rightList = [];
+
+  for (var i = 0; i < labelLayoutList.length; i++) {
+    if (labelLayoutList[i].x < cx) {
+      leftList.push(labelLayoutList[i]);
+    } else {
+      rightList.push(labelLayoutList[i]);
+    }
+  }
+
+  adjustSingleSide(rightList, cx, cy, r, 1, viewWidth, viewHeight);
+  adjustSingleSide(leftList, cx, cy, r, -1, viewWidth, viewHeight);
+
+  for (var i = 0; i < labelLayoutList.length; i++) {
+    var linePoints = labelLayoutList[i].linePoints;
+
+    if (linePoints) {
+      var dist = linePoints[1][0] - linePoints[2][0];
+
+      if (labelLayoutList[i].x < cx) {
+        linePoints[2][0] = labelLayoutList[i].x + 3;
+      } else {
+        linePoints[2][0] = labelLayoutList[i].x - 3;
+      }
+
+      linePoints[1][1] = linePoints[2][1] = labelLayoutList[i].y;
+      linePoints[1][0] = linePoints[2][0] + dist;
+    }
+  }
+}
+
+var labelLayout = function (seriesModel, r, viewWidth, viewHeight) {
+  var data = seriesModel.getData();
+  var labelLayoutList = [];
+  var cx;
+  var cy;
+  var hasLabelRotate = false;
+  data.each(function (idx) {
+    var layout = data.getItemLayout(idx);
+    var itemModel = data.getItemModel(idx);
+    var labelModel = itemModel.getModel('label'); // Use position in normal or emphasis
+
+    var labelPosition = labelModel.get('position') || itemModel.get('emphasis.label.position');
+    var labelLineModel = itemModel.getModel('labelLine');
+    var labelLineLen = labelLineModel.get('length');
+    var labelLineLen2 = labelLineModel.get('length2');
+    var midAngle = (layout.startAngle + layout.endAngle) / 2;
+    var dx = Math.cos(midAngle);
+    var dy = Math.sin(midAngle);
+    var textX;
+    var textY;
+    var linePoints;
+    var textAlign;
+    cx = layout.cx;
+    cy = layout.cy;
+    var isLabelInside = labelPosition === 'inside' || labelPosition === 'inner';
+
+    if (labelPosition === 'center') {
+      textX = layout.cx;
+      textY = layout.cy;
+      textAlign = 'center';
+    } else {
+      var x1 = (isLabelInside ? (layout.r + layout.r0) / 2 * dx : layout.r * dx) + cx;
+      var y1 = (isLabelInside ? (layout.r + layout.r0) / 2 * dy : layout.r * dy) + cy;
+      textX = x1 + dx * 3;
+      textY = y1 + dy * 3;
+
+      if (!isLabelInside) {
+        // For roseType
+        var x2 = x1 + dx * (labelLineLen + r - layout.r);
+        var y2 = y1 + dy * (labelLineLen + r - layout.r);
+        var x3 = x2 + (dx < 0 ? -1 : 1) * labelLineLen2;
+        var y3 = y2;
+        textX = x3 + (dx < 0 ? -5 : 5);
+        textY = y3;
+        linePoints = [[x1, y1], [x2, y2], [x3, y3]];
+      }
+
+      textAlign = isLabelInside ? 'center' : dx > 0 ? 'left' : 'right';
+    }
+
+    var font = labelModel.getFont();
+    var labelRotate = labelModel.get('rotate') ? dx < 0 ? -midAngle + Math.PI : -midAngle : 0;
+    var text = seriesModel.getFormattedLabel(idx, 'normal') || data.getName(idx);
+    var textRect = getBoundingRect(text, font, textAlign, 'top');
+    hasLabelRotate = !!labelRotate;
+    layout.label = {
+      x: textX,
+      y: textY,
+      position: labelPosition,
+      height: textRect.height,
+      len: labelLineLen,
+      len2: labelLineLen2,
+      linePoints: linePoints,
+      textAlign: textAlign,
+      verticalAlign: 'middle',
+      rotation: labelRotate,
+      inside: isLabelInside
+    }; // Not layout the inside label
+
+    if (!isLabelInside) {
+      labelLayoutList.push(layout.label);
+    }
+  });
+
+  if (!hasLabelRotate && seriesModel.get('avoidLabelOverlap')) {
+    avoidOverlap(labelLayoutList, cx, cy, r, viewWidth, viewHeight);
+  }
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var PI2$4 = Math.PI * 2;
+var RADIAN = Math.PI / 180;
+var pieLayout = function (seriesType, ecModel, api, payload) {
+  ecModel.eachSeriesByType(seriesType, function (seriesModel) {
+    var data = seriesModel.getData();
+    var valueDim = data.mapDimension('value');
+    var center = seriesModel.get('center');
+    var radius = seriesModel.get('radius');
+
+    if (!isArray(radius)) {
+      radius = [0, radius];
+    }
+
+    if (!isArray(center)) {
+      center = [center, center];
+    }
+
+    var width = api.getWidth();
+    var height = api.getHeight();
+    var size = Math.min(width, height);
+    var cx = parsePercent$1(center[0], width);
+    var cy = parsePercent$1(center[1], height);
+    var r0 = parsePercent$1(radius[0], size / 2);
+    var r = parsePercent$1(radius[1], size / 2);
+    var startAngle = -seriesModel.get('startAngle') * RADIAN;
+    var minAngle = seriesModel.get('minAngle') * RADIAN;
+    var validDataCount = 0;
+    data.each(valueDim, function (value) {
+      !isNaN(value) && validDataCount++;
+    });
+    var sum = data.getSum(valueDim); // Sum may be 0
+
+    var unitRadian = Math.PI / (sum || validDataCount) * 2;
+    var clockwise = seriesModel.get('clockwise');
+    var roseType = seriesModel.get('roseType');
+    var stillShowZeroSum = seriesModel.get('stillShowZeroSum'); // [0...max]
+
+    var extent = data.getDataExtent(valueDim);
+    extent[0] = 0; // In the case some sector angle is smaller than minAngle
+
+    var restAngle = PI2$4;
+    var valueSumLargerThanMinAngle = 0;
+    var currentAngle = startAngle;
+    var dir = clockwise ? 1 : -1;
+    data.each(valueDim, function (value, idx) {
+      var angle;
+
+      if (isNaN(value)) {
+        data.setItemLayout(idx, {
+          angle: NaN,
+          startAngle: NaN,
+          endAngle: NaN,
+          clockwise: clockwise,
+          cx: cx,
+          cy: cy,
+          r0: r0,
+          r: roseType ? NaN : r
+        });
+        return;
+      } // FIXME 鍏煎 2.0 浣嗘槸 roseType 鏄� area 鐨勬椂鍊欐墠鏄繖鏍凤紵
+
+
+      if (roseType !== 'area') {
+        angle = sum === 0 && stillShowZeroSum ? unitRadian : value * unitRadian;
+      } else {
+        angle = PI2$4 / validDataCount;
+      }
+
+      if (angle < minAngle) {
+        angle = minAngle;
+        restAngle -= minAngle;
+      } else {
+        valueSumLargerThanMinAngle += value;
+      }
+
+      var endAngle = currentAngle + dir * angle;
+      data.setItemLayout(idx, {
+        angle: angle,
+        startAngle: currentAngle,
+        endAngle: endAngle,
+        clockwise: clockwise,
+        cx: cx,
+        cy: cy,
+        r0: r0,
+        r: roseType ? linearMap(value, extent, [r0, r]) : r
+      });
+      currentAngle = endAngle;
+    }); // Some sector is constrained by minAngle
+    // Rest sectors needs recalculate angle
+
+    if (restAngle < PI2$4 && validDataCount) {
+      // Average the angle if rest angle is not enough after all angles is
+      // Constrained by minAngle
+      if (restAngle <= 1e-3) {
+        var angle = PI2$4 / validDataCount;
+        data.each(valueDim, function (value, idx) {
+          if (!isNaN(value)) {
+            var layout = data.getItemLayout(idx);
+            layout.angle = angle;
+            layout.startAngle = startAngle + dir * idx * angle;
+            layout.endAngle = startAngle + dir * (idx + 1) * angle;
+          }
+        });
+      } else {
+        unitRadian = restAngle / valueSumLargerThanMinAngle;
+        currentAngle = startAngle;
+        data.each(valueDim, function (value, idx) {
+          if (!isNaN(value)) {
+            var layout = data.getItemLayout(idx);
+            var angle = layout.angle === minAngle ? minAngle : value * unitRadian;
+            layout.startAngle = currentAngle;
+            layout.endAngle = currentAngle + dir * angle;
+            currentAngle += dir * angle;
+          }
+        });
+      }
+    }
+
+    labelLayout(seriesModel, r, width, height);
+  });
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var dataFilter = function (seriesType) {
+  return {
+    seriesType: seriesType,
+    reset: function (seriesModel, ecModel) {
+      var legendModels = ecModel.findComponents({
+        mainType: 'legend'
+      });
+
+      if (!legendModels || !legendModels.length) {
+        return;
+      }
+
+      var data = seriesModel.getData();
+      data.filterSelf(function (idx) {
+        var name = data.getName(idx); // If in any legend component the status is not selected.
+
+        for (var i = 0; i < legendModels.length; i++) {
+          if (!legendModels[i].isSelected(name)) {
+            return false;
+          }
+        }
+
+        return true;
+      });
+    }
+  };
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+createDataSelectAction('pie', [{
+  type: 'pieToggleSelect',
+  event: 'pieselectchanged',
+  method: 'toggleSelected'
+}, {
+  type: 'pieSelect',
+  event: 'pieselected',
+  method: 'select'
+}, {
+  type: 'pieUnSelect',
+  event: 'pieunselected',
+  method: 'unSelect'
+}]);
+registerVisual(dataColor('pie'));
+registerLayout(curry(pieLayout, 'pie'));
+registerProcessor(dataFilter('pie'));
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+SeriesModel.extend({
+  type: 'series.scatter',
+  dependencies: ['grid', 'polar', 'geo', 'singleAxis', 'calendar'],
+  getInitialData: function (option, ecModel) {
+    return createListFromArray(this.getSource(), this);
+  },
+  brushSelector: 'point',
+  getProgressive: function () {
+    var progressive = this.option.progressive;
+
+    if (progressive == null) {
+      // PENDING
+      return this.option.large ? 5e3 : this.get('progressive');
+    }
+
+    return progressive;
+  },
+  getProgressiveThreshold: function () {
+    var progressiveThreshold = this.option.progressiveThreshold;
+
+    if (progressiveThreshold == null) {
+      // PENDING
+      return this.option.large ? 1e4 : this.get('progressiveThreshold');
+    }
+
+    return progressiveThreshold;
+  },
+  defaultOption: {
+    coordinateSystem: 'cartesian2d',
+    zlevel: 0,
+    z: 2,
+    legendHoverLink: true,
+    hoverAnimation: true,
+    // Cartesian coordinate system
+    // xAxisIndex: 0,
+    // yAxisIndex: 0,
+    // Polar coordinate system
+    // polarIndex: 0,
+    // Geo coordinate system
+    // geoIndex: 0,
+    // symbol: null,        // 鍥惧舰绫诲瀷
+    symbolSize: 10,
+    // 鍥惧舰澶у皬锛屽崐瀹斤紙鍗婂緞锛夊弬鏁帮紝褰撳浘褰负鏂瑰悜鎴栬彵褰㈠垯鎬诲搴︿负symbolSize * 2
+    // symbolRotate: null,  // 鍥惧舰鏃嬭浆鎺у埗
+    large: false,
+    // Available when large is true
+    largeThreshold: 2000,
+    // cursor: null,
+    // label: {
+    // show: false
+    // distance: 5,
+    // formatter: 鏍囩鏂囨湰鏍煎紡鍣紝鍚孴ooltip.formatter锛屼笉鏀寔寮傛鍥炶皟
+    // position: 榛樿鑷�傚簲锛屾按骞冲竷灞�涓�'top'锛屽瀭鐩村竷灞�涓�'right'锛屽彲閫変负
+    //           'inside'|'left'|'right'|'top'|'bottom'
+    // 榛樿浣跨敤鍏ㄥ眬鏂囨湰鏍峰紡锛岃瑙乀EXTSTYLE
+    // },
+    itemStyle: {
+      opacity: 0.8 // color: 鍚勫紓
+      // progressive: null
+
+    }
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/* global Float32Array */
+// TODO Batch by color
+var BOOST_SIZE_THRESHOLD = 4;
+var LargeSymbolPath = extendShape({
+  shape: {
+    points: null
+  },
+  symbolProxy: null,
+  buildPath: function (path, shape) {
+    var points = shape.points;
+    var size = shape.size;
+    var symbolProxy = this.symbolProxy;
+    var symbolProxyShape = symbolProxy.shape;
+    var ctx = path.getContext ? path.getContext() : path;
+    var canBoost = ctx && size[0] < BOOST_SIZE_THRESHOLD; // Do draw in afterBrush.
+
+    if (canBoost) {
+      return;
+    }
+
+    for (var i = 0; i < points.length;) {
+      var x = points[i++];
+      var y = points[i++];
+
+      if (isNaN(x) || isNaN(y)) {
+        continue;
+      }
+
+      symbolProxyShape.x = x - size[0] / 2;
+      symbolProxyShape.y = y - size[1] / 2;
+      symbolProxyShape.width = size[0];
+      symbolProxyShape.height = size[1];
+      symbolProxy.buildPath(path, symbolProxyShape, true);
+    }
+  },
+  afterBrush: function (ctx) {
+    var shape = this.shape;
+    var points = shape.points;
+    var size = shape.size;
+    var canBoost = size[0] < BOOST_SIZE_THRESHOLD;
+
+    if (!canBoost) {
+      return;
+    }
+
+    this.setTransform(ctx); // PENDING If style or other canvas status changed?
+
+    for (var i = 0; i < points.length;) {
+      var x = points[i++];
+      var y = points[i++];
+
+      if (isNaN(x) || isNaN(y)) {
+        continue;
+      } // fillRect is faster than building a rect path and draw.
+      // And it support light globalCompositeOperation.
+
+
+      ctx.fillRect(x - size[0] / 2, y - size[1] / 2, size[0], size[1]);
+    }
+
+    this.restoreTransform(ctx);
+  },
+  findDataIndex: function (x, y) {
+    // TODO ???
+    // Consider transform
+    var shape = this.shape;
+    var points = shape.points;
+    var size = shape.size;
+    var w = Math.max(size[0], 4);
+    var h = Math.max(size[1], 4); // Not consider transform
+    // Treat each element as a rect
+    // top down traverse
+
+    for (var idx = points.length / 2 - 1; idx >= 0; idx--) {
+      var i = idx * 2;
+      var x0 = points[i] - w / 2;
+      var y0 = points[i + 1] - h / 2;
+
+      if (x >= x0 && y >= y0 && x <= x0 + w && y <= y0 + h) {
+        return idx;
+      }
+    }
+
+    return -1;
+  }
+});
+
+function LargeSymbolDraw() {
+  this.group = new Group();
+}
+
+var largeSymbolProto = LargeSymbolDraw.prototype;
+
+largeSymbolProto.isPersistent = function () {
+  return !this._incremental;
+};
+/**
+ * Update symbols draw by new data
+ * @param {module:echarts/data/List} data
+ */
+
+
+largeSymbolProto.updateData = function (data) {
+  this.group.removeAll();
+  var symbolEl = new LargeSymbolPath({
+    rectHover: true,
+    cursor: 'default'
+  });
+  symbolEl.setShape({
+    points: data.getLayout('symbolPoints')
+  });
+
+  this._setCommon(symbolEl, data);
+
+  this.group.add(symbolEl);
+  this._incremental = null;
+};
+
+largeSymbolProto.updateLayout = function (data) {
+  if (this._incremental) {
+    return;
+  }
+
+  var points = data.getLayout('symbolPoints');
+  this.group.eachChild(function (child) {
+    if (child.startIndex != null) {
+      var len = (child.endIndex - child.startIndex) * 2;
+      var byteOffset = child.startIndex * 4 * 2;
+      points = new Float32Array(points.buffer, byteOffset, len);
+    }
+
+    child.setShape('points', points);
+  });
+};
+
+largeSymbolProto.incrementalPrepareUpdate = function (data) {
+  this.group.removeAll();
+
+  this._clearIncremental(); // Only use incremental displayables when data amount is larger than 2 million.
+  // PENDING Incremental data?
+
+
+  if (data.count() > 2e6) {
+    if (!this._incremental) {
+      this._incremental = new IncrementalDisplayble({
+        silent: true
+      });
+    }
+
+    this.group.add(this._incremental);
+  } else {
+    this._incremental = null;
+  }
+};
+
+largeSymbolProto.incrementalUpdate = function (taskParams, data) {
+  var symbolEl;
+
+  if (this._incremental) {
+    symbolEl = new LargeSymbolPath();
+
+    this._incremental.addDisplayable(symbolEl, true);
+  } else {
+    symbolEl = new LargeSymbolPath({
+      rectHover: true,
+      cursor: 'default',
+      startIndex: taskParams.start,
+      endIndex: taskParams.end
+    });
+    symbolEl.incremental = true;
+    this.group.add(symbolEl);
+  }
+
+  symbolEl.setShape({
+    points: data.getLayout('symbolPoints')
+  });
+
+  this._setCommon(symbolEl, data, !!this._incremental);
+};
+
+largeSymbolProto._setCommon = function (symbolEl, data, isIncremental) {
+  var hostModel = data.hostModel; // TODO
+  // if (data.hasItemVisual.symbolSize) {
+  //     // TODO typed array?
+  //     symbolEl.setShape('sizes', data.mapArray(
+  //         function (idx) {
+  //             var size = data.getItemVisual(idx, 'symbolSize');
+  //             return (size instanceof Array) ? size : [size, size];
+  //         }
+  //     ));
+  // }
+  // else {
+
+  var size = data.getVisual('symbolSize');
+  symbolEl.setShape('size', size instanceof Array ? size : [size, size]); // }
+  // Create symbolProxy to build path for each data
+
+  symbolEl.symbolProxy = createSymbol(data.getVisual('symbol'), 0, 0, 0, 0); // Use symbolProxy setColor method
+
+  symbolEl.setColor = symbolEl.symbolProxy.setColor;
+  var extrudeShadow = symbolEl.shape.size[0] < BOOST_SIZE_THRESHOLD;
+  symbolEl.useStyle( // Draw shadow when doing fillRect is extremely slow.
+  hostModel.getModel('itemStyle').getItemStyle(extrudeShadow ? ['color', 'shadowBlur', 'shadowColor'] : ['color']));
+  var visualColor = data.getVisual('color');
+
+  if (visualColor) {
+    symbolEl.setColor(visualColor);
+  }
+
+  if (!isIncremental) {
+    // Enable tooltip
+    // PENDING May have performance issue when path is extremely large
+    symbolEl.seriesIndex = hostModel.seriesIndex;
+    symbolEl.on('mousemove', function (e) {
+      symbolEl.dataIndex = null;
+      var dataIndex = symbolEl.findDataIndex(e.offsetX, e.offsetY);
+
+      if (dataIndex >= 0) {
+        // Provide dataIndex for tooltip
+        symbolEl.dataIndex = dataIndex + (symbolEl.startIndex || 0);
+      }
+    });
+  }
+};
+
+largeSymbolProto.remove = function () {
+  this._clearIncremental();
+
+  this._incremental = null;
+  this.group.removeAll();
+};
+
+largeSymbolProto._clearIncremental = function () {
+  var incremental = this._incremental;
+
+  if (incremental) {
+    incremental.clearDisplaybles();
+  }
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+extendChartView({
+  type: 'scatter',
+  render: function (seriesModel, ecModel, api) {
+    var data = seriesModel.getData();
+
+    var symbolDraw = this._updateSymbolDraw(data, seriesModel);
+
+    symbolDraw.updateData(data);
+    this._finished = true;
+  },
+  incrementalPrepareRender: function (seriesModel, ecModel, api) {
+    var data = seriesModel.getData();
+
+    var symbolDraw = this._updateSymbolDraw(data, seriesModel);
+
+    symbolDraw.incrementalPrepareUpdate(data);
+    this._finished = false;
+  },
+  incrementalRender: function (taskParams, seriesModel, ecModel) {
+    this._symbolDraw.incrementalUpdate(taskParams, seriesModel.getData());
+
+    this._finished = taskParams.end === seriesModel.getData().count();
+  },
+  updateTransform: function (seriesModel, ecModel, api) {
+    var data = seriesModel.getData(); // Must mark group dirty and make sure the incremental layer will be cleared
+    // PENDING
+
+    this.group.dirty();
+
+    if (!this._finished || data.count() > 1e4 || !this._symbolDraw.isPersistent()) {
+      return {
+        update: true
+      };
+    } else {
+      var res = pointsLayout().reset(seriesModel);
+
+      if (res.progress) {
+        res.progress({
+          start: 0,
+          end: data.count()
+        }, data);
+      }
+
+      this._symbolDraw.updateLayout(data);
+    }
+  },
+  _updateSymbolDraw: function (data, seriesModel) {
+    var symbolDraw = this._symbolDraw;
+    var pipelineContext = seriesModel.pipelineContext;
+    var isLargeDraw = pipelineContext.large;
+
+    if (!symbolDraw || isLargeDraw !== this._isLargeDraw) {
+      symbolDraw && symbolDraw.remove();
+      symbolDraw = this._symbolDraw = isLargeDraw ? new LargeSymbolDraw() : new SymbolDraw();
+      this._isLargeDraw = isLargeDraw;
+      this.group.removeAll();
+    }
+
+    this.group.add(symbolDraw.group);
+    return symbolDraw;
+  },
+  remove: function (ecModel, api) {
+    this._symbolDraw && this._symbolDraw.remove(true);
+    this._symbolDraw = null;
+  },
+  dispose: function () {}
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+registerVisual(visualSymbol('scatter', 'circle'));
+registerLayout(pointsLayout('scatter')); // echarts.registerProcessor(function (ecModel, api) {
+//     ecModel.eachSeriesByType('scatter', function (seriesModel) {
+//         var data = seriesModel.getData();
+//         var coordSys = seriesModel.coordinateSystem;
+//         if (coordSys.type !== 'geo') {
+//             return;
+//         }
+//         var startPt = coordSys.pointToData([0, 0]);
+//         var endPt = coordSys.pointToData([api.getWidth(), api.getHeight()]);
+//         var dims = zrUtil.map(coordSys.dimensions, function (dim) {
+//             return data.mapDimension(dim);
+//         });
+//         var range = {};
+//         range[dims[0]] = [Math.min(startPt[0], endPt[0]), Math.max(startPt[0], endPt[0])];
+//         range[dims[1]] = [Math.min(startPt[1], endPt[1]), Math.max(startPt[1], endPt[1])];
+//         data.selectRange(range);
+//     });
+// });
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+SeriesModel.extend({
+  type: 'series.effectScatter',
+  dependencies: ['grid', 'polar'],
+  getInitialData: function (option, ecModel) {
+    return createListFromArray(this.getSource(), this);
+  },
+  brushSelector: 'point',
+  defaultOption: {
+    coordinateSystem: 'cartesian2d',
+    zlevel: 0,
+    z: 2,
+    legendHoverLink: true,
+    effectType: 'ripple',
+    progressive: 0,
+    // When to show the effect, option: 'render'|'emphasis'
+    showEffectOn: 'render',
+    // Ripple effect config
+    rippleEffect: {
+      period: 4,
+      // Scale of ripple
+      scale: 2.5,
+      // Brush type can be fill or stroke
+      brushType: 'fill'
+    },
+    // Cartesian coordinate system
+    // xAxisIndex: 0,
+    // yAxisIndex: 0,
+    // Polar coordinate system
+    // polarIndex: 0,
+    // Geo coordinate system
+    // geoIndex: 0,
+    // symbol: null,        // 鍥惧舰绫诲瀷
+    symbolSize: 10 // 鍥惧舰澶у皬锛屽崐瀹斤紙鍗婂緞锛夊弬鏁帮紝褰撳浘褰负鏂瑰悜鎴栬彵褰㈠垯鎬诲搴︿负symbolSize * 2
+    // symbolRotate: null,  // 鍥惧舰鏃嬭浆鎺у埗
+    // large: false,
+    // Available when large is true
+    // largeThreshold: 2000,
+    // itemStyle: {
+    //     opacity: 1
+    // }
+
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * Symbol with ripple effect
+ * @module echarts/chart/helper/EffectSymbol
+ */
+var EFFECT_RIPPLE_NUMBER = 3;
+
+function normalizeSymbolSize(symbolSize) {
+  if (!isArray(symbolSize)) {
+    symbolSize = [+symbolSize, +symbolSize];
+  }
+
+  return symbolSize;
+}
+
+function updateRipplePath(rippleGroup, effectCfg) {
+  rippleGroup.eachChild(function (ripplePath) {
+    ripplePath.attr({
+      z: effectCfg.z,
+      zlevel: effectCfg.zlevel,
+      style: {
+        stroke: effectCfg.brushType === 'stroke' ? effectCfg.color : null,
+        fill: effectCfg.brushType === 'fill' ? effectCfg.color : null
+      }
+    });
+  });
+}
+/**
+ * @constructor
+ * @param {module:echarts/data/List} data
+ * @param {number} idx
+ * @extends {module:zrender/graphic/Group}
+ */
+
+
+function EffectSymbol(data, idx) {
+  Group.call(this);
+  var symbol = new SymbolClz$1(data, idx);
+  var rippleGroup = new Group();
+  this.add(symbol);
+  this.add(rippleGroup);
+
+  rippleGroup.beforeUpdate = function () {
+    this.attr(symbol.getScale());
+  };
+
+  this.updateData(data, idx);
+}
+
+var effectSymbolProto = EffectSymbol.prototype;
+
+effectSymbolProto.stopEffectAnimation = function () {
+  this.childAt(1).removeAll();
+};
+
+effectSymbolProto.startEffectAnimation = function (effectCfg) {
+  var symbolType = effectCfg.symbolType;
+  var color = effectCfg.color;
+  var rippleGroup = this.childAt(1);
+
+  for (var i = 0; i < EFFECT_RIPPLE_NUMBER; i++) {
+    // var ripplePath = createSymbol(
+    //     symbolType, -0.5, -0.5, 1, 1, color
+    // );
+    // If width/height are set too small (e.g., set to 1) on ios10
+    // and macOS Sierra, a circle stroke become a rect, no matter what
+    // the scale is set. So we set width/height as 2. See #4136.
+    var ripplePath = createSymbol(symbolType, -1, -1, 2, 2, color);
+    ripplePath.attr({
+      style: {
+        strokeNoScale: true
+      },
+      z2: 99,
+      silent: true,
+      scale: [0.5, 0.5]
+    });
+    var delay = -i / EFFECT_RIPPLE_NUMBER * effectCfg.period + effectCfg.effectOffset; // TODO Configurable effectCfg.period
+
+    ripplePath.animate('', true).when(effectCfg.period, {
+      scale: [effectCfg.rippleScale / 2, effectCfg.rippleScale / 2]
+    }).delay(delay).start();
+    ripplePath.animateStyle(true).when(effectCfg.period, {
+      opacity: 0
+    }).delay(delay).start();
+    rippleGroup.add(ripplePath);
+  }
+
+  updateRipplePath(rippleGroup, effectCfg);
+};
+/**
+ * Update effect symbol
+ */
+
+
+effectSymbolProto.updateEffectAnimation = function (effectCfg) {
+  var oldEffectCfg = this._effectCfg;
+  var rippleGroup = this.childAt(1); // Must reinitialize effect if following configuration changed
+
+  var DIFFICULT_PROPS = ['symbolType', 'period', 'rippleScale'];
+
+  for (var i = 0; i < DIFFICULT_PROPS.length; i++) {
+    var propName = DIFFICULT_PROPS[i];
+
+    if (oldEffectCfg[propName] !== effectCfg[propName]) {
+      this.stopEffectAnimation();
+      this.startEffectAnimation(effectCfg);
+      return;
+    }
+  }
+
+  updateRipplePath(rippleGroup, effectCfg);
+};
+/**
+ * Highlight symbol
+ */
+
+
+effectSymbolProto.highlight = function () {
+  this.trigger('emphasis');
+};
+/**
+ * Downplay symbol
+ */
+
+
+effectSymbolProto.downplay = function () {
+  this.trigger('normal');
+};
+/**
+ * Update symbol properties
+ * @param  {module:echarts/data/List} data
+ * @param  {number} idx
+ */
+
+
+effectSymbolProto.updateData = function (data, idx) {
+  var seriesModel = data.hostModel;
+  this.childAt(0).updateData(data, idx);
+  var rippleGroup = this.childAt(1);
+  var itemModel = data.getItemModel(idx);
+  var symbolType = data.getItemVisual(idx, 'symbol');
+  var symbolSize = normalizeSymbolSize(data.getItemVisual(idx, 'symbolSize'));
+  var color = data.getItemVisual(idx, 'color');
+  rippleGroup.attr('scale', symbolSize);
+  rippleGroup.traverse(function (ripplePath) {
+    ripplePath.attr({
+      fill: color
+    });
+  });
+  var symbolOffset = itemModel.getShallow('symbolOffset');
+
+  if (symbolOffset) {
+    var pos = rippleGroup.position;
+    pos[0] = parsePercent$1(symbolOffset[0], symbolSize[0]);
+    pos[1] = parsePercent$1(symbolOffset[1], symbolSize[1]);
+  }
+
+  rippleGroup.rotation = (itemModel.getShallow('symbolRotate') || 0) * Math.PI / 180 || 0;
+  var effectCfg = {};
+  effectCfg.showEffectOn = seriesModel.get('showEffectOn');
+  effectCfg.rippleScale = itemModel.get('rippleEffect.scale');
+  effectCfg.brushType = itemModel.get('rippleEffect.brushType');
+  effectCfg.period = itemModel.get('rippleEffect.period') * 1000;
+  effectCfg.effectOffset = idx / data.count();
+  effectCfg.z = itemModel.getShallow('z') || 0;
+  effectCfg.zlevel = itemModel.getShallow('zlevel') || 0;
+  effectCfg.symbolType = symbolType;
+  effectCfg.color = color;
+  this.off('mouseover').off('mouseout').off('emphasis').off('normal');
+
+  if (effectCfg.showEffectOn === 'render') {
+    this._effectCfg ? this.updateEffectAnimation(effectCfg) : this.startEffectAnimation(effectCfg);
+    this._effectCfg = effectCfg;
+  } else {
+    // Not keep old effect config
+    this._effectCfg = null;
+    this.stopEffectAnimation();
+    var symbol = this.childAt(0);
+
+    var onEmphasis = function () {
+      symbol.highlight();
+
+      if (effectCfg.showEffectOn !== 'render') {
+        this.startEffectAnimation(effectCfg);
+      }
+    };
+
+    var onNormal = function () {
+      symbol.downplay();
+
+      if (effectCfg.showEffectOn !== 'render') {
+        this.stopEffectAnimation();
+      }
+    };
+
+    this.on('mouseover', onEmphasis, this).on('mouseout', onNormal, this).on('emphasis', onEmphasis, this).on('normal', onNormal, this);
+  }
+
+  this._effectCfg = effectCfg;
+};
+
+effectSymbolProto.fadeOut = function (cb) {
+  this.off('mouseover').off('mouseout').off('emphasis').off('normal');
+  cb && cb();
+};
+
+inherits(EffectSymbol, Group);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+extendChartView({
+  type: 'effectScatter',
+  init: function () {
+    this._symbolDraw = new SymbolDraw(EffectSymbol);
+  },
+  render: function (seriesModel, ecModel, api) {
+    var data = seriesModel.getData();
+    var effectSymbolDraw = this._symbolDraw;
+    effectSymbolDraw.updateData(data);
+    this.group.add(effectSymbolDraw.group);
+  },
+  updateTransform: function (seriesModel, ecModel, api) {
+    var data = seriesModel.getData();
+    this.group.dirty();
+    var res = pointsLayout().reset(seriesModel);
+
+    if (res.progress) {
+      res.progress({
+        start: 0,
+        end: data.count()
+      }, data);
+    }
+
+    this._symbolDraw.updateLayout(data);
+  },
+  _updateGroupTransform: function (seriesModel) {
+    var coordSys = seriesModel.coordinateSystem;
+
+    if (coordSys && coordSys.getRoamTransform) {
+      this.group.transform = clone$2(coordSys.getRoamTransform());
+      this.group.decomposeTransform();
+    }
+  },
+  remove: function (ecModel, api) {
+    this._symbolDraw && this._symbolDraw.remove(api);
+  },
+  dispose: function () {}
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+registerVisual(visualSymbol('effectScatter', 'circle'));
+registerLayout(pointsLayout('effectScatter'));
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var seriesModelMixin = {
+  /**
+   * @private
+   * @type {string}
+   */
+  _baseAxisDim: null,
+
+  /**
+   * @override
+   */
+  getInitialData: function (option, ecModel) {
+    // When both types of xAxis and yAxis are 'value', layout is
+    // needed to be specified by user. Otherwise, layout can be
+    // judged by which axis is category.
+    var ordinalMeta;
+    var xAxisModel = ecModel.getComponent('xAxis', this.get('xAxisIndex'));
+    var yAxisModel = ecModel.getComponent('yAxis', this.get('yAxisIndex'));
+    var xAxisType = xAxisModel.get('type');
+    var yAxisType = yAxisModel.get('type');
+    var addOrdinal; // FIXME
+    // 鑰冭檻鏃堕棿杞�
+
+    if (xAxisType === 'category') {
+      option.layout = 'horizontal';
+      ordinalMeta = xAxisModel.getOrdinalMeta();
+      addOrdinal = true;
+    } else if (yAxisType === 'category') {
+      option.layout = 'vertical';
+      ordinalMeta = yAxisModel.getOrdinalMeta();
+      addOrdinal = true;
+    } else {
+      option.layout = option.layout || 'horizontal';
+    }
+
+    var coordDims = ['x', 'y'];
+    var baseAxisDimIndex = option.layout === 'horizontal' ? 0 : 1;
+    var baseAxisDim = this._baseAxisDim = coordDims[baseAxisDimIndex];
+    var otherAxisDim = coordDims[1 - baseAxisDimIndex];
+    var axisModels = [xAxisModel, yAxisModel];
+    var baseAxisType = axisModels[baseAxisDimIndex].get('type');
+    var otherAxisType = axisModels[1 - baseAxisDimIndex].get('type');
+    var data = option.data; // ??? FIXME make a stage to perform data transfrom.
+    // MUST create a new data, consider setOption({}) again.
+
+    if (data && addOrdinal) {
+      var newOptionData = [];
+      each$1(data, function (item, index) {
+        var newItem;
+
+        if (item.value && isArray(item.value)) {
+          newItem = item.value.slice();
+          item.value.unshift(index);
+        } else if (isArray(item)) {
+          newItem = item.slice();
+          item.unshift(index);
+        } else {
+          newItem = item;
+        }
+
+        newOptionData.push(newItem);
+      });
+      option.data = newOptionData;
+    }
+
+    var defaultValueDimensions = this.defaultValueDimensions;
+    return createListSimply(this, {
+      coordDimensions: [{
+        name: baseAxisDim,
+        type: getDimensionTypeByAxis(baseAxisType),
+        ordinalMeta: ordinalMeta,
+        otherDims: {
+          tooltip: false,
+          itemName: 0
+        },
+        dimsDef: ['base']
+      }, {
+        name: otherAxisDim,
+        type: getDimensionTypeByAxis(otherAxisType),
+        dimsDef: defaultValueDimensions.slice()
+      }],
+      dimensionsCount: defaultValueDimensions.length + 1
+    });
+  },
+
+  /**
+   * If horizontal, index axis is x, otherwise y.
+   * @override
+   */
+  getBaseAxis: function () {
+    var dim = this._baseAxisDim;
+    return this.ecModel.getComponent(dim + 'Axis', this.get(dim + 'AxisIndex')).axis;
+  }
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var CandlestickSeries = SeriesModel.extend({
+  type: 'series.candlestick',
+  dependencies: ['xAxis', 'yAxis', 'grid'],
+
+  /**
+   * @readOnly
+   */
+  defaultValueDimensions: [{
+    name: 'open',
+    defaultTooltip: true
+  }, {
+    name: 'close',
+    defaultTooltip: true
+  }, {
+    name: 'lowest',
+    defaultTooltip: true
+  }, {
+    name: 'highest',
+    defaultTooltip: true
+  }],
+
+  /**
+   * @type {Array.<string>}
+   * @readOnly
+   */
+  dimensions: null,
+
+  /**
+   * @override
+   */
+  defaultOption: {
+    zlevel: 0,
+    z: 2,
+    coordinateSystem: 'cartesian2d',
+    legendHoverLink: true,
+    hoverAnimation: true,
+    // xAxisIndex: 0,
+    // yAxisIndex: 0,
+    layout: null,
+    // 'horizontal' or 'vertical'
+    itemStyle: {
+      color: '#c23531',
+      // 闃崇嚎 positive
+      color0: '#314656',
+      // 闃寸嚎 negative     '#c23531', '#314656'
+      borderWidth: 1,
+      // FIXME
+      // ec2涓娇鐢ㄧ殑鏄痩ineStyle.color 鍜� lineStyle.color0
+      borderColor: '#c23531',
+      borderColor0: '#314656'
+    },
+    emphasis: {
+      itemStyle: {
+        borderWidth: 2
+      }
+    },
+    barMaxWidth: null,
+    barMinWidth: null,
+    barWidth: null,
+    large: true,
+    largeThreshold: 600,
+    progressive: 3e3,
+    progressiveThreshold: 1e4,
+    progressiveChunkMode: 'mod',
+    animationUpdate: false,
+    animationEasing: 'linear',
+    animationDuration: 300
+  },
+
+  /**
+   * Get dimension for shadow in dataZoom
+   * @return {string} dimension name
+   */
+  getShadowDim: function () {
+    return 'open';
+  },
+  brushSelector: function (dataIndex, data, selectors) {
+    var itemLayout = data.getItemLayout(dataIndex);
+    return itemLayout && selectors.rect(itemLayout.brushRect);
+  }
+});
+mixin(CandlestickSeries, seriesModelMixin, true);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var NORMAL_ITEM_STYLE_PATH = ['itemStyle'];
+var EMPHASIS_ITEM_STYLE_PATH = ['emphasis', 'itemStyle'];
+var SKIP_PROPS = ['color', 'color0', 'borderColor', 'borderColor0'];
+var CandlestickView = Chart.extend({
+  type: 'candlestick',
+  render: function (seriesModel, ecModel, api) {
+    this._updateDrawMode(seriesModel);
+
+    this._isLargeDraw ? this._renderLarge(seriesModel) : this._renderNormal(seriesModel);
+  },
+  incrementalPrepareRender: function (seriesModel, ecModel, api) {
+    this._clear();
+
+    this._updateDrawMode(seriesModel);
+  },
+  incrementalRender: function (params, seriesModel, ecModel, api) {
+    this._isLargeDraw ? this._incrementalRenderLarge(params, seriesModel) : this._incrementalRenderNormal(params, seriesModel);
+  },
+  _updateDrawMode: function (seriesModel) {
+    var isLargeDraw = seriesModel.pipelineContext.large;
+
+    if (this._isLargeDraw == null || isLargeDraw ^ this._isLargeDraw) {
+      this._isLargeDraw = isLargeDraw;
+
+      this._clear();
+    }
+  },
+  _renderNormal: function (seriesModel) {
+    var data = seriesModel.getData();
+    var oldData = this._data;
+    var group = this.group;
+    var isSimpleBox = data.getLayout('isSimpleBox'); // There is no old data only when first rendering or switching from
+    // stream mode to normal mode, where previous elements should be removed.
+
+    if (!this._data) {
+      group.removeAll();
+    }
+
+    data.diff(oldData).add(function (newIdx) {
+      if (data.hasValue(newIdx)) {
+        var el;
+        var itemLayout = data.getItemLayout(newIdx);
+        el = createNormalBox(itemLayout, newIdx, true);
+        initProps(el, {
+          shape: {
+            points: itemLayout.ends
+          }
+        }, seriesModel, newIdx);
+        setBoxCommon(el, data, newIdx, isSimpleBox);
+        group.add(el);
+        data.setItemGraphicEl(newIdx, el);
+      }
+    }).update(function (newIdx, oldIdx) {
+      var el = oldData.getItemGraphicEl(oldIdx); // Empty data
+
+      if (!data.hasValue(newIdx)) {
+        group.remove(el);
+        return;
+      }
+
+      var itemLayout = data.getItemLayout(newIdx);
+
+      if (!el) {
+        el = createNormalBox(itemLayout, newIdx);
+      } else {
+        updateProps(el, {
+          shape: {
+            points: itemLayout.ends
+          }
+        }, seriesModel, newIdx);
+      }
+
+      setBoxCommon(el, data, newIdx, isSimpleBox);
+      group.add(el);
+      data.setItemGraphicEl(newIdx, el);
+    }).remove(function (oldIdx) {
+      var el = oldData.getItemGraphicEl(oldIdx);
+      el && group.remove(el);
+    }).execute();
+    this._data = data;
+  },
+  _renderLarge: function (seriesModel) {
+    this._clear();
+
+    createLarge$1(seriesModel, this.group);
+  },
+  _incrementalRenderNormal: function (params, seriesModel) {
+    var data = seriesModel.getData();
+    var isSimpleBox = data.getLayout('isSimpleBox');
+    var dataIndex;
+
+    while ((dataIndex = params.next()) != null) {
+      var el;
+      var itemLayout = data.getItemLayout(dataIndex);
+      el = createNormalBox(itemLayout, dataIndex);
+      setBoxCommon(el, data, dataIndex, isSimpleBox);
+      el.incremental = true;
+      this.group.add(el);
+    }
+  },
+  _incrementalRenderLarge: function (params, seriesModel) {
+    createLarge$1(seriesModel, this.group, true);
+  },
+  remove: function (ecModel) {
+    this._clear();
+  },
+  _clear: function () {
+    this.group.removeAll();
+    this._data = null;
+  },
+  dispose: noop
+});
+var NormalBoxPath = Path.extend({
+  type: 'normalCandlestickBox',
+  shape: {},
+  buildPath: function (ctx, shape) {
+    var ends = shape.points;
+
+    if (this.__simpleBox) {
+      ctx.moveTo(ends[4][0], ends[4][1]);
+      ctx.lineTo(ends[6][0], ends[6][1]);
+    } else {
+      ctx.moveTo(ends[0][0], ends[0][1]);
+      ctx.lineTo(ends[1][0], ends[1][1]);
+      ctx.lineTo(ends[2][0], ends[2][1]);
+      ctx.lineTo(ends[3][0], ends[3][1]);
+      ctx.closePath();
+      ctx.moveTo(ends[4][0], ends[4][1]);
+      ctx.lineTo(ends[5][0], ends[5][1]);
+      ctx.moveTo(ends[6][0], ends[6][1]);
+      ctx.lineTo(ends[7][0], ends[7][1]);
+    }
+  }
+});
+
+function createNormalBox(itemLayout, dataIndex, isInit) {
+  var ends = itemLayout.ends;
+  return new NormalBoxPath({
+    shape: {
+      points: isInit ? transInit(ends, itemLayout) : ends
+    },
+    z2: 100
+  });
+}
+
+function setBoxCommon(el, data, dataIndex, isSimpleBox) {
+  var itemModel = data.getItemModel(dataIndex);
+  var normalItemStyleModel = itemModel.getModel(NORMAL_ITEM_STYLE_PATH);
+  var color = data.getItemVisual(dataIndex, 'color');
+  var borderColor = data.getItemVisual(dataIndex, 'borderColor') || color; // Color must be excluded.
+  // Because symbol provide setColor individually to set fill and stroke
+
+  var itemStyle = normalItemStyleModel.getItemStyle(SKIP_PROPS);
+  el.useStyle(itemStyle);
+  el.style.strokeNoScale = true;
+  el.style.fill = color;
+  el.style.stroke = borderColor;
+  el.__simpleBox = isSimpleBox;
+  var hoverStyle = itemModel.getModel(EMPHASIS_ITEM_STYLE_PATH).getItemStyle();
+  setHoverStyle(el, hoverStyle);
+}
+
+function transInit(points, itemLayout) {
+  return map(points, function (point) {
+    point = point.slice();
+    point[1] = itemLayout.initBaseline;
+    return point;
+  });
+}
+
+var LargeBoxPath = Path.extend({
+  type: 'largeCandlestickBox',
+  shape: {},
+  buildPath: function (ctx, shape) {
+    // Drawing lines is more efficient than drawing
+    // a whole line or drawing rects.
+    var points = shape.points;
+
+    for (var i = 0; i < points.length;) {
+      if (this.__sign === points[i++]) {
+        var x = points[i++];
+        ctx.moveTo(x, points[i++]);
+        ctx.lineTo(x, points[i++]);
+      } else {
+        i += 3;
+      }
+    }
+  }
+});
+
+function createLarge$1(seriesModel, group, incremental) {
+  var data = seriesModel.getData();
+  var largePoints = data.getLayout('largePoints');
+  var elP = new LargeBoxPath({
+    shape: {
+      points: largePoints
+    },
+    __sign: 1
+  });
+  group.add(elP);
+  var elN = new LargeBoxPath({
+    shape: {
+      points: largePoints
+    },
+    __sign: -1
+  });
+  group.add(elN);
+  setLargeStyle$1(1, elP, seriesModel, data);
+  setLargeStyle$1(-1, elN, seriesModel, data);
+
+  if (incremental) {
+    elP.incremental = true;
+    elN.incremental = true;
+  }
+}
+
+function setLargeStyle$1(sign, el, seriesModel, data) {
+  var suffix = sign > 0 ? 'P' : 'N';
+  var borderColor = data.getVisual('borderColor' + suffix) || data.getVisual('color' + suffix); // Color must be excluded.
+  // Because symbol provide setColor individually to set fill and stroke
+
+  var itemStyle = seriesModel.getModel(NORMAL_ITEM_STYLE_PATH).getItemStyle(SKIP_PROPS);
+  el.useStyle(itemStyle);
+  el.style.fill = null;
+  el.style.stroke = borderColor; // No different
+  // el.style.lineWidth = .5;
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var preprocessor = function (option) {
+  if (!option || !isArray(option.series)) {
+    return;
+  } // Translate 'k' to 'candlestick'.
+
+
+  each$1(option.series, function (seriesItem) {
+    if (isObject$1(seriesItem) && seriesItem.type === 'k') {
+      seriesItem.type = 'candlestick';
+    }
+  });
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var positiveBorderColorQuery = ['itemStyle', 'borderColor'];
+var negativeBorderColorQuery = ['itemStyle', 'borderColor0'];
+var positiveColorQuery = ['itemStyle', 'color'];
+var negativeColorQuery = ['itemStyle', 'color0'];
+var candlestickVisual = {
+  seriesType: 'candlestick',
+  plan: createRenderPlanner(),
+  // For legend.
+  performRawSeries: true,
+  reset: function (seriesModel, ecModel) {
+    var data = seriesModel.getData();
+    var isLargeRender = seriesModel.pipelineContext.large;
+    data.setVisual({
+      legendSymbol: 'roundRect',
+      colorP: getColor(1, seriesModel),
+      colorN: getColor(-1, seriesModel),
+      borderColorP: getBorderColor(1, seriesModel),
+      borderColorN: getBorderColor(-1, seriesModel)
+    }); // Only visible series has each data be visual encoded
+
+    if (ecModel.isSeriesFiltered(seriesModel)) {
+      return;
+    }
+
+    return !isLargeRender && {
+      progress: progress
+    };
+
+    function progress(params, data) {
+      var dataIndex;
+
+      while ((dataIndex = params.next()) != null) {
+        var itemModel = data.getItemModel(dataIndex);
+        var sign = data.getItemLayout(dataIndex).sign;
+        data.setItemVisual(dataIndex, {
+          color: getColor(sign, itemModel),
+          borderColor: getBorderColor(sign, itemModel)
+        });
+      }
+    }
+
+    function getColor(sign, model) {
+      return model.get(sign > 0 ? positiveColorQuery : negativeColorQuery);
+    }
+
+    function getBorderColor(sign, model) {
+      return model.get(sign > 0 ? positiveBorderColorQuery : negativeBorderColorQuery);
+    }
+  }
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/* global Float32Array */
+var LargeArr$1 = typeof Float32Array !== 'undefined' ? Float32Array : Array;
+var candlestickLayout = {
+  seriesType: 'candlestick',
+  plan: createRenderPlanner(),
+  reset: function (seriesModel) {
+    var coordSys = seriesModel.coordinateSystem;
+    var data = seriesModel.getData();
+    var candleWidth = calculateCandleWidth(seriesModel, data);
+    var cDimIdx = 0;
+    var vDimIdx = 1;
+    var coordDims = ['x', 'y'];
+    var cDim = data.mapDimension(coordDims[cDimIdx]);
+    var vDims = data.mapDimension(coordDims[vDimIdx], true);
+    var openDim = vDims[0];
+    var closeDim = vDims[1];
+    var lowestDim = vDims[2];
+    var highestDim = vDims[3];
+    data.setLayout({
+      candleWidth: candleWidth,
+      // The value is experimented visually.
+      isSimpleBox: candleWidth <= 1.3
+    });
+
+    if (cDim == null || vDims.length < 4) {
+      return;
+    }
+
+    return {
+      progress: seriesModel.pipelineContext.large ? largeProgress : normalProgress
+    };
+
+    function normalProgress(params, data) {
+      var dataIndex;
+
+      while ((dataIndex = params.next()) != null) {
+        var axisDimVal = data.get(cDim, dataIndex);
+        var openVal = data.get(openDim, dataIndex);
+        var closeVal = data.get(closeDim, dataIndex);
+        var lowestVal = data.get(lowestDim, dataIndex);
+        var highestVal = data.get(highestDim, dataIndex);
+        var ocLow = Math.min(openVal, closeVal);
+        var ocHigh = Math.max(openVal, closeVal);
+        var ocLowPoint = getPoint(ocLow, axisDimVal);
+        var ocHighPoint = getPoint(ocHigh, axisDimVal);
+        var lowestPoint = getPoint(lowestVal, axisDimVal);
+        var highestPoint = getPoint(highestVal, axisDimVal);
+        var ends = [];
+        addBodyEnd(ends, ocHighPoint, 0);
+        addBodyEnd(ends, ocLowPoint, 1);
+        ends.push(subPixelOptimizePoint(highestPoint), subPixelOptimizePoint(ocHighPoint), subPixelOptimizePoint(lowestPoint), subPixelOptimizePoint(ocLowPoint));
+        data.setItemLayout(dataIndex, {
+          sign: getSign(data, dataIndex, openVal, closeVal, closeDim),
+          initBaseline: openVal > closeVal ? ocHighPoint[vDimIdx] : ocLowPoint[vDimIdx],
+          // open point.
+          ends: ends,
+          brushRect: makeBrushRect(lowestVal, highestVal, axisDimVal)
+        });
+      }
+
+      function getPoint(val, axisDimVal) {
+        var p = [];
+        p[cDimIdx] = axisDimVal;
+        p[vDimIdx] = val;
+        return isNaN(axisDimVal) || isNaN(val) ? [NaN, NaN] : coordSys.dataToPoint(p);
+      }
+
+      function addBodyEnd(ends, point, start) {
+        var point1 = point.slice();
+        var point2 = point.slice();
+        point1[cDimIdx] = subPixelOptimize(point1[cDimIdx] + candleWidth / 2, 1, false);
+        point2[cDimIdx] = subPixelOptimize(point2[cDimIdx] - candleWidth / 2, 1, true);
+        start ? ends.push(point1, point2) : ends.push(point2, point1);
+      }
+
+      function makeBrushRect(lowestVal, highestVal, axisDimVal) {
+        var pmin = getPoint(lowestVal, axisDimVal);
+        var pmax = getPoint(highestVal, axisDimVal);
+        pmin[cDimIdx] -= candleWidth / 2;
+        pmax[cDimIdx] -= candleWidth / 2;
+        return {
+          x: pmin[0],
+          y: pmin[1],
+          width: vDimIdx ? candleWidth : pmax[0] - pmin[0],
+          height: vDimIdx ? pmax[1] - pmin[1] : candleWidth
+        };
+      }
+
+      function subPixelOptimizePoint(point) {
+        point[cDimIdx] = subPixelOptimize(point[cDimIdx], 1);
+        return point;
+      }
+    }
+
+    function largeProgress(params, data) {
+      // Structure: [sign, x, yhigh, ylow, sign, x, yhigh, ylow, ...]
+      var points = new LargeArr$1(params.count * 5);
+      var offset = 0;
+      var point;
+      var tmpIn = [];
+      var tmpOut = [];
+      var dataIndex;
+
+      while ((dataIndex = params.next()) != null) {
+        var axisDimVal = data.get(cDim, dataIndex);
+        var openVal = data.get(openDim, dataIndex);
+        var closeVal = data.get(closeDim, dataIndex);
+        var lowestVal = data.get(lowestDim, dataIndex);
+        var highestVal = data.get(highestDim, dataIndex);
+
+        if (isNaN(axisDimVal) || isNaN(lowestVal) || isNaN(highestVal)) {
+          points[offset++] = NaN;
+          offset += 4;
+          continue;
+        }
+
+        points[offset++] = getSign(data, dataIndex, openVal, closeVal, closeDim);
+        tmpIn[cDimIdx] = axisDimVal;
+        tmpIn[vDimIdx] = lowestVal;
+        point = coordSys.dataToPoint(tmpIn, null, tmpOut);
+        points[offset++] = point ? point[0] : NaN;
+        points[offset++] = point ? point[1] : NaN;
+        tmpIn[vDimIdx] = highestVal;
+        point = coordSys.dataToPoint(tmpIn, null, tmpOut);
+        points[offset++] = point ? point[1] : NaN;
+      }
+
+      data.setLayout('largePoints', points);
+    }
+  }
+};
+
+function getSign(data, dataIndex, openVal, closeVal, closeDim) {
+  var sign;
+
+  if (openVal > closeVal) {
+    sign = -1;
+  } else if (openVal < closeVal) {
+    sign = 1;
+  } else {
+    sign = dataIndex > 0 // If close === open, compare with close of last record
+    ? data.get(closeDim, dataIndex - 1) <= closeVal ? 1 : -1 : // No record of previous, set to be positive
+    1;
+  }
+
+  return sign;
+}
+
+function calculateCandleWidth(seriesModel, data) {
+  var baseAxis = seriesModel.getBaseAxis();
+  var extent;
+  var bandWidth = baseAxis.type === 'category' ? baseAxis.getBandWidth() : (extent = baseAxis.getExtent(), Math.abs(extent[1] - extent[0]) / data.count());
+  var barMaxWidth = parsePercent$1(retrieve2(seriesModel.get('barMaxWidth'), bandWidth), bandWidth);
+  var barMinWidth = parsePercent$1(retrieve2(seriesModel.get('barMinWidth'), 1), bandWidth);
+  var barWidth = seriesModel.get('barWidth');
+  return barWidth != null ? parsePercent$1(barWidth, bandWidth) // Put max outer to ensure bar visible in spite of overlap.
+  : Math.max(Math.min(bandWidth / 2, barMaxWidth), barMinWidth);
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+registerPreprocessor(preprocessor);
+registerVisual(candlestickVisual);
+registerLayout(candlestickLayout);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+function IndicatorAxis(dim, scale, radiusExtent) {
+  Axis.call(this, dim, scale, radiusExtent);
+  /**
+   * Axis type
+   *  - 'category'
+   *  - 'value'
+   *  - 'time'
+   *  - 'log'
+   * @type {string}
+   */
+
+  this.type = 'value';
+  this.angle = 0;
+  /**
+   * Indicator name
+   * @type {string}
+   */
+
+  this.name = '';
+  /**
+   * @type {module:echarts/model/Model}
+   */
+
+  this.model;
+}
+
+inherits(IndicatorAxis, Axis);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+// TODO clockwise
+function Radar(radarModel, ecModel, api) {
+  this._model = radarModel;
+  /**
+   * Radar dimensions
+   * @type {Array.<string>}
+   */
+
+  this.dimensions = [];
+  this._indicatorAxes = map(radarModel.getIndicatorModels(), function (indicatorModel, idx) {
+    var dim = 'indicator_' + idx;
+    var indicatorAxis = new IndicatorAxis(dim, new IntervalScale());
+    indicatorAxis.name = indicatorModel.get('name'); // Inject model and axis
+
+    indicatorAxis.model = indicatorModel;
+    indicatorModel.axis = indicatorAxis;
+    this.dimensions.push(dim);
+    return indicatorAxis;
+  }, this);
+  this.resize(radarModel, api);
+  /**
+   * @type {number}
+   * @readOnly
+   */
+
+  this.cx;
+  /**
+   * @type {number}
+   * @readOnly
+   */
+
+  this.cy;
+  /**
+   * @type {number}
+   * @readOnly
+   */
+
+  this.r;
+  /**
+   * @type {number}
+   * @readOnly
+   */
+
+  this.r0;
+  /**
+   * @type {number}
+   * @readOnly
+   */
+
+  this.startAngle;
+}
+
+Radar.prototype.getIndicatorAxes = function () {
+  return this._indicatorAxes;
+};
+
+Radar.prototype.dataToPoint = function (value, indicatorIndex) {
+  var indicatorAxis = this._indicatorAxes[indicatorIndex];
+  return this.coordToPoint(indicatorAxis.dataToCoord(value), indicatorIndex);
+};
+
+Radar.prototype.coordToPoint = function (coord, indicatorIndex) {
+  var indicatorAxis = this._indicatorAxes[indicatorIndex];
+  var angle = indicatorAxis.angle;
+  var x = this.cx + coord * Math.cos(angle);
+  var y = this.cy - coord * Math.sin(angle);
+  return [x, y];
+};
+
+Radar.prototype.pointToData = function (pt) {
+  var dx = pt[0] - this.cx;
+  var dy = pt[1] - this.cy;
+  var radius = Math.sqrt(dx * dx + dy * dy);
+  dx /= radius;
+  dy /= radius;
+  var radian = Math.atan2(-dy, dx); // Find the closest angle
+  // FIXME index can calculated directly
+
+  var minRadianDiff = Infinity;
+  var closestAxis;
+  var closestAxisIdx = -1;
+
+  for (var i = 0; i < this._indicatorAxes.length; i++) {
+    var indicatorAxis = this._indicatorAxes[i];
+    var diff = Math.abs(radian - indicatorAxis.angle);
+
+    if (diff < minRadianDiff) {
+      closestAxis = indicatorAxis;
+      closestAxisIdx = i;
+      minRadianDiff = diff;
+    }
+  }
+
+  return [closestAxisIdx, +(closestAxis && closestAxis.coodToData(radius))];
+};
+
+Radar.prototype.resize = function (radarModel, api) {
+  var center = radarModel.get('center');
+  var viewWidth = api.getWidth();
+  var viewHeight = api.getHeight();
+  var viewSize = Math.min(viewWidth, viewHeight) / 2;
+  this.cx = parsePercent$1(center[0], viewWidth);
+  this.cy = parsePercent$1(center[1], viewHeight);
+  this.startAngle = radarModel.get('startAngle') * Math.PI / 180; // radius may be single value like `20`, `'80%'`, or array like `[10, '80%']`
+
+  var radius = radarModel.get('radius');
+
+  if (typeof radius === 'string' || typeof radius === 'number') {
+    radius = [0, radius];
+  }
+
+  this.r0 = parsePercent$1(radius[0], viewSize);
+  this.r = parsePercent$1(radius[1], viewSize);
+  each$1(this._indicatorAxes, function (indicatorAxis, idx) {
+    indicatorAxis.setExtent(this.r0, this.r);
+    var angle = this.startAngle + idx * Math.PI * 2 / this._indicatorAxes.length; // Normalize to [-PI, PI]
+
+    angle = Math.atan2(Math.sin(angle), Math.cos(angle));
+    indicatorAxis.angle = angle;
+  }, this);
+};
+
+Radar.prototype.update = function (ecModel, api) {
+  var indicatorAxes = this._indicatorAxes;
+  var radarModel = this._model;
+  each$1(indicatorAxes, function (indicatorAxis) {
+    indicatorAxis.scale.setExtent(Infinity, -Infinity);
+  });
+  ecModel.eachSeriesByType('radar', function (radarSeries, idx) {
+    if (radarSeries.get('coordinateSystem') !== 'radar' || ecModel.getComponent('radar', radarSeries.get('radarIndex')) !== radarModel) {
+      return;
+    }
+
+    var data = radarSeries.getData();
+    each$1(indicatorAxes, function (indicatorAxis) {
+      indicatorAxis.scale.unionExtentFromData(data, data.mapDimension(indicatorAxis.dim));
+    });
+  }, this);
+  var splitNumber = radarModel.get('splitNumber');
+
+  function increaseInterval(interval) {
+    var exp10 = Math.pow(10, Math.floor(Math.log(interval) / Math.LN10)); // Increase interval
+
+    var f = interval / exp10;
+
+    if (f === 2) {
+      f = 5;
+    } else {
+      // f is 2 or 5
+      f *= 2;
+    }
+
+    return f * exp10;
+  } // Force all the axis fixing the maxSplitNumber.
+
+
+  each$1(indicatorAxes, function (indicatorAxis, idx) {
+    var rawExtent = getScaleExtent(indicatorAxis.scale, indicatorAxis.model);
+    niceScaleExtent(indicatorAxis.scale, indicatorAxis.model);
+    var axisModel = indicatorAxis.model;
+    var scale = indicatorAxis.scale;
+    var fixedMin = axisModel.getMin();
+    var fixedMax = axisModel.getMax();
+    var interval = scale.getInterval();
+
+    if (fixedMin != null && fixedMax != null) {
+      // User set min, max, divide to get new interval
+      scale.setExtent(+fixedMin, +fixedMax);
+      scale.setInterval((fixedMax - fixedMin) / splitNumber);
+    } else if (fixedMin != null) {
+      var max; // User set min, expand extent on the other side
+
+      do {
+        max = fixedMin + interval * splitNumber;
+        scale.setExtent(+fixedMin, max); // Interval must been set after extent
+        // FIXME
+
+        scale.setInterval(interval);
+        interval = increaseInterval(interval);
+      } while (max < rawExtent[1] && isFinite(max) && isFinite(rawExtent[1]));
+    } else if (fixedMax != null) {
+      var min; // User set min, expand extent on the other side
+
+      do {
+        min = fixedMax - interval * splitNumber;
+        scale.setExtent(min, +fixedMax);
+        scale.setInterval(interval);
+        interval = increaseInterval(interval);
+      } while (min > rawExtent[0] && isFinite(min) && isFinite(rawExtent[0]));
+    } else {
+      var nicedSplitNumber = scale.getTicks().length - 1;
+
+      if (nicedSplitNumber > splitNumber) {
+        interval = increaseInterval(interval);
+      } // PENDING
+
+
+      var center = Math.round((rawExtent[0] + rawExtent[1]) / 2 / interval) * interval;
+      var halfSplitNumber = Math.round(splitNumber / 2);
+      scale.setExtent(round$1(center - halfSplitNumber * interval), round$1(center + (splitNumber - halfSplitNumber) * interval));
+      scale.setInterval(interval);
+    }
+  });
+};
+/**
+ * Radar dimensions is based on the data
+ * @type {Array}
+ */
+
+
+Radar.dimensions = [];
+
+Radar.create = function (ecModel, api) {
+  var radarList = [];
+  ecModel.eachComponent('radar', function (radarModel) {
+    var radar = new Radar(radarModel, ecModel, api);
+    radarList.push(radar);
+    radarModel.coordinateSystem = radar;
+  });
+  ecModel.eachSeriesByType('radar', function (radarSeries) {
+    if (radarSeries.get('coordinateSystem') === 'radar') {
+      // Inject coordinate system
+      radarSeries.coordinateSystem = radarList[radarSeries.get('radarIndex') || 0];
+    }
+  });
+  return radarList;
+};
+
+CoordinateSystemManager.register('radar', Radar);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var valueAxisDefault = axisDefault.valueAxis;
+
+function defaultsShow(opt, show) {
+  return defaults({
+    show: show
+  }, opt);
+}
+
+var RadarModel = extendComponentModel({
+  type: 'radar',
+  optionUpdated: function () {
+    var boundaryGap = this.get('boundaryGap');
+    var splitNumber = this.get('splitNumber');
+    var scale = this.get('scale');
+    var axisLine = this.get('axisLine');
+    var axisTick = this.get('axisTick');
+    var axisLabel = this.get('axisLabel');
+    var nameTextStyle = this.get('name');
+    var showName = this.get('name.show');
+    var nameFormatter = this.get('name.formatter');
+    var nameGap = this.get('nameGap');
+    var triggerEvent = this.get('triggerEvent');
+    var indicatorModels = map(this.get('indicator') || [], function (indicatorOpt) {
+      // PENDING
+      if (indicatorOpt.max != null && indicatorOpt.max > 0 && !indicatorOpt.min) {
+        indicatorOpt.min = 0;
+      } else if (indicatorOpt.min != null && indicatorOpt.min < 0 && !indicatorOpt.max) {
+        indicatorOpt.max = 0;
+      }
+
+      var iNameTextStyle = nameTextStyle;
+
+      if (indicatorOpt.color != null) {
+        iNameTextStyle = defaults({
+          color: indicatorOpt.color
+        }, nameTextStyle);
+      } // Use same configuration
+
+
+      indicatorOpt = merge(clone(indicatorOpt), {
+        boundaryGap: boundaryGap,
+        splitNumber: splitNumber,
+        scale: scale,
+        axisLine: axisLine,
+        axisTick: axisTick,
+        axisLabel: axisLabel,
+        // Competitable with 2 and use text
+        name: indicatorOpt.text,
+        nameLocation: 'end',
+        nameGap: nameGap,
+        // min: 0,
+        nameTextStyle: iNameTextStyle,
+        triggerEvent: triggerEvent
+      }, false);
+
+      if (!showName) {
+        indicatorOpt.name = '';
+      }
+
+      if (typeof nameFormatter === 'string') {
+        var indName = indicatorOpt.name;
+        indicatorOpt.name = nameFormatter.replace('{value}', indName != null ? indName : '');
+      } else if (typeof nameFormatter === 'function') {
+        indicatorOpt.name = nameFormatter(indicatorOpt.name, indicatorOpt);
+      }
+
+      var model = extend(new Model(indicatorOpt, null, this.ecModel), axisModelCommonMixin); // For triggerEvent.
+
+      model.mainType = 'radar';
+      model.componentIndex = this.componentIndex;
+      return model;
+    }, this);
+
+    this.getIndicatorModels = function () {
+      return indicatorModels;
+    };
+  },
+  defaultOption: {
+    zlevel: 0,
+    z: 0,
+    center: ['50%', '50%'],
+    radius: '75%',
+    startAngle: 90,
+    name: {
+      show: true // formatter: null
+      // textStyle: {}
+
+    },
+    boundaryGap: [0, 0],
+    splitNumber: 5,
+    nameGap: 15,
+    scale: false,
+    // Polygon or circle
+    shape: 'polygon',
+    axisLine: merge({
+      lineStyle: {
+        color: '#bbb'
+      }
+    }, valueAxisDefault.axisLine),
+    axisLabel: defaultsShow(valueAxisDefault.axisLabel, false),
+    axisTick: defaultsShow(valueAxisDefault.axisTick, false),
+    splitLine: defaultsShow(valueAxisDefault.splitLine, true),
+    splitArea: defaultsShow(valueAxisDefault.splitArea, true),
+    // {text, min, max}
+    indicator: []
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var axisBuilderAttrs$1 = ['axisLine', 'axisTickLabel', 'axisName'];
+extendComponentView({
+  type: 'radar',
+  render: function (radarModel, ecModel, api) {
+    var group = this.group;
+    group.removeAll();
+
+    this._buildAxes(radarModel);
+
+    this._buildSplitLineAndArea(radarModel);
+  },
+  _buildAxes: function (radarModel) {
+    var radar = radarModel.coordinateSystem;
+    var indicatorAxes = radar.getIndicatorAxes();
+    var axisBuilders = map(indicatorAxes, function (indicatorAxis) {
+      var axisBuilder = new AxisBuilder(indicatorAxis.model, {
+        position: [radar.cx, radar.cy],
+        rotation: indicatorAxis.angle,
+        labelDirection: -1,
+        tickDirection: -1,
+        nameDirection: 1
+      });
+      return axisBuilder;
+    });
+    each$1(axisBuilders, function (axisBuilder) {
+      each$1(axisBuilderAttrs$1, axisBuilder.add, axisBuilder);
+      this.group.add(axisBuilder.getGroup());
+    }, this);
+  },
+  _buildSplitLineAndArea: function (radarModel) {
+    var radar = radarModel.coordinateSystem;
+    var indicatorAxes = radar.getIndicatorAxes();
+
+    if (!indicatorAxes.length) {
+      return;
+    }
+
+    var shape = radarModel.get('shape');
+    var splitLineModel = radarModel.getModel('splitLine');
+    var splitAreaModel = radarModel.getModel('splitArea');
+    var lineStyleModel = splitLineModel.getModel('lineStyle');
+    var areaStyleModel = splitAreaModel.getModel('areaStyle');
+    var showSplitLine = splitLineModel.get('show');
+    var showSplitArea = splitAreaModel.get('show');
+    var splitLineColors = lineStyleModel.get('color');
+    var splitAreaColors = areaStyleModel.get('color');
+    splitLineColors = isArray(splitLineColors) ? splitLineColors : [splitLineColors];
+    splitAreaColors = isArray(splitAreaColors) ? splitAreaColors : [splitAreaColors];
+    var splitLines = [];
+    var splitAreas = [];
+
+    function getColorIndex(areaOrLine, areaOrLineColorList, idx) {
+      var colorIndex = idx % areaOrLineColorList.length;
+      areaOrLine[colorIndex] = areaOrLine[colorIndex] || [];
+      return colorIndex;
+    }
+
+    if (shape === 'circle') {
+      var ticksRadius = indicatorAxes[0].getTicksCoords();
+      var cx = radar.cx;
+      var cy = radar.cy;
+
+      for (var i = 0; i < ticksRadius.length; i++) {
+        if (showSplitLine) {
+          var colorIndex = getColorIndex(splitLines, splitLineColors, i);
+          splitLines[colorIndex].push(new Circle({
+            shape: {
+              cx: cx,
+              cy: cy,
+              r: ticksRadius[i].coord
+            }
+          }));
+        }
+
+        if (showSplitArea && i < ticksRadius.length - 1) {
+          var colorIndex = getColorIndex(splitAreas, splitAreaColors, i);
+          splitAreas[colorIndex].push(new Ring({
+            shape: {
+              cx: cx,
+              cy: cy,
+              r0: ticksRadius[i].coord,
+              r: ticksRadius[i + 1].coord
+            }
+          }));
+        }
+      }
+    } // Polyyon
+    else {
+        var realSplitNumber;
+        var axesTicksPoints = map(indicatorAxes, function (indicatorAxis, idx) {
+          var ticksCoords = indicatorAxis.getTicksCoords();
+          realSplitNumber = realSplitNumber == null ? ticksCoords.length - 1 : Math.min(ticksCoords.length - 1, realSplitNumber);
+          return map(ticksCoords, function (tickCoord) {
+            return radar.coordToPoint(tickCoord.coord, idx);
+          });
+        });
+        var prevPoints = [];
+
+        for (var i = 0; i <= realSplitNumber; i++) {
+          var points = [];
+
+          for (var j = 0; j < indicatorAxes.length; j++) {
+            points.push(axesTicksPoints[j][i]);
+          } // Close
+
+
+          if (points[0]) {
+            points.push(points[0].slice());
+          } else {}
+
+          if (showSplitLine) {
+            var colorIndex = getColorIndex(splitLines, splitLineColors, i);
+            splitLines[colorIndex].push(new Polyline({
+              shape: {
+                points: points
+              }
+            }));
+          }
+
+          if (showSplitArea && prevPoints) {
+            var colorIndex = getColorIndex(splitAreas, splitAreaColors, i - 1);
+            splitAreas[colorIndex].push(new Polygon({
+              shape: {
+                points: points.concat(prevPoints)
+              }
+            }));
+          }
+
+          prevPoints = points.slice().reverse();
+        }
+      }
+
+    var lineStyle = lineStyleModel.getLineStyle();
+    var areaStyle = areaStyleModel.getAreaStyle(); // Add splitArea before splitLine
+
+    each$1(splitAreas, function (splitAreas, idx) {
+      this.group.add(mergePath(splitAreas, {
+        style: defaults({
+          stroke: 'none',
+          fill: splitAreaColors[idx % splitAreaColors.length]
+        }, areaStyle),
+        silent: true
+      }));
+    }, this);
+    each$1(splitLines, function (splitLines, idx) {
+      this.group.add(mergePath(splitLines, {
+        style: defaults({
+          fill: 'none',
+          stroke: splitLineColors[idx % splitLineColors.length]
+        }, lineStyle),
+        silent: true
+      }));
+    }, this);
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var RadarSeries = SeriesModel.extend({
+  type: 'series.radar',
+  dependencies: ['radar'],
+  // Overwrite
+  init: function (option) {
+    RadarSeries.superApply(this, 'init', arguments); // Enable legend selection for each data item
+    // Use a function instead of direct access because data reference may changed
+
+    this.legendDataProvider = function () {
+      return this.getRawData();
+    };
+  },
+  getInitialData: function (option, ecModel) {
+    return createListSimply(this, {
+      generateCoord: 'indicator_',
+      generateCoordCount: Infinity
+    });
+  },
+  formatTooltip: function (dataIndex) {
+    var data = this.getData();
+    var coordSys = this.coordinateSystem;
+    var indicatorAxes = coordSys.getIndicatorAxes();
+    var name = this.getData().getName(dataIndex);
+    return encodeHTML(name === '' ? this.name : name) + '<br/>' + map(indicatorAxes, function (axis, idx) {
+      var val = data.get(data.mapDimension(axis.dim), dataIndex);
+      return encodeHTML(axis.name + ' : ' + val);
+    }).join('<br />');
+  },
+  defaultOption: {
+    zlevel: 0,
+    z: 2,
+    coordinateSystem: 'radar',
+    legendHoverLink: true,
+    radarIndex: 0,
+    lineStyle: {
+      width: 2,
+      type: 'solid'
+    },
+    label: {
+      position: 'top'
+    },
+    // areaStyle: {
+    // },
+    // itemStyle: {}
+    symbol: 'emptyCircle',
+    symbolSize: 4 // symbolRotate: null
+
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+function normalizeSymbolSize$1(symbolSize) {
+  if (!isArray(symbolSize)) {
+    symbolSize = [+symbolSize, +symbolSize];
+  }
+
+  return symbolSize;
+}
+
+extendChartView({
+  type: 'radar',
+  render: function (seriesModel, ecModel, api) {
+    var polar = seriesModel.coordinateSystem;
+    var group = this.group;
+    var data = seriesModel.getData();
+    var oldData = this._data;
+
+    function createSymbol$$1(data, idx) {
+      var symbolType = data.getItemVisual(idx, 'symbol') || 'circle';
+      var color = data.getItemVisual(idx, 'color');
+
+      if (symbolType === 'none') {
+        return;
+      }
+
+      var symbolSize = normalizeSymbolSize$1(data.getItemVisual(idx, 'symbolSize'));
+      var symbolPath = createSymbol(symbolType, -1, -1, 2, 2, color);
+      symbolPath.attr({
+        style: {
+          strokeNoScale: true
+        },
+        z2: 100,
+        scale: [symbolSize[0] / 2, symbolSize[1] / 2]
+      });
+      return symbolPath;
+    }
+
+    function updateSymbols(oldPoints, newPoints, symbolGroup, data, idx, isInit) {
+      // Simply rerender all
+      symbolGroup.removeAll();
+
+      for (var i = 0; i < newPoints.length - 1; i++) {
+        var symbolPath = createSymbol$$1(data, idx);
+
+        if (symbolPath) {
+          symbolPath.__dimIdx = i;
+
+          if (oldPoints[i]) {
+            symbolPath.attr('position', oldPoints[i]);
+            graphicUtil[isInit ? 'initProps' : 'updateProps'](symbolPath, {
+              position: newPoints[i]
+            }, seriesModel, idx);
+          } else {
+            symbolPath.attr('position', newPoints[i]);
+          }
+
+          symbolGroup.add(symbolPath);
+        }
+      }
+    }
+
+    function getInitialPoints(points) {
+      return map(points, function (pt) {
+        return [polar.cx, polar.cy];
+      });
+    }
+
+    data.diff(oldData).add(function (idx) {
+      var points = data.getItemLayout(idx);
+
+      if (!points) {
+        return;
+      }
+
+      var polygon = new Polygon();
+      var polyline = new Polyline();
+      var target = {
+        shape: {
+          points: points
+        }
+      };
+      polygon.shape.points = getInitialPoints(points);
+      polyline.shape.points = getInitialPoints(points);
+      initProps(polygon, target, seriesModel, idx);
+      initProps(polyline, target, seriesModel, idx);
+      var itemGroup = new Group();
+      var symbolGroup = new Group();
+      itemGroup.add(polyline);
+      itemGroup.add(polygon);
+      itemGroup.add(symbolGroup);
+      updateSymbols(polyline.shape.points, points, symbolGroup, data, idx, true);
+      data.setItemGraphicEl(idx, itemGroup);
+    }).update(function (newIdx, oldIdx) {
+      var itemGroup = oldData.getItemGraphicEl(oldIdx);
+      var polyline = itemGroup.childAt(0);
+      var polygon = itemGroup.childAt(1);
+      var symbolGroup = itemGroup.childAt(2);
+      var target = {
+        shape: {
+          points: data.getItemLayout(newIdx)
+        }
+      };
+
+      if (!target.shape.points) {
+        return;
+      }
+
+      updateSymbols(polyline.shape.points, target.shape.points, symbolGroup, data, newIdx, false);
+      updateProps(polyline, target, seriesModel);
+      updateProps(polygon, target, seriesModel);
+      data.setItemGraphicEl(newIdx, itemGroup);
+    }).remove(function (idx) {
+      group.remove(oldData.getItemGraphicEl(idx));
+    }).execute();
+    data.eachItemGraphicEl(function (itemGroup, idx) {
+      var itemModel = data.getItemModel(idx);
+      var polyline = itemGroup.childAt(0);
+      var polygon = itemGroup.childAt(1);
+      var symbolGroup = itemGroup.childAt(2);
+      var color = data.getItemVisual(idx, 'color');
+      group.add(itemGroup);
+      polyline.useStyle(defaults(itemModel.getModel('lineStyle').getLineStyle(), {
+        fill: 'none',
+        stroke: color
+      }));
+      polyline.hoverStyle = itemModel.getModel('emphasis.lineStyle').getLineStyle();
+      var areaStyleModel = itemModel.getModel('areaStyle');
+      var hoverAreaStyleModel = itemModel.getModel('emphasis.areaStyle');
+      var polygonIgnore = areaStyleModel.isEmpty() && areaStyleModel.parentModel.isEmpty();
+      var hoverPolygonIgnore = hoverAreaStyleModel.isEmpty() && hoverAreaStyleModel.parentModel.isEmpty();
+      hoverPolygonIgnore = hoverPolygonIgnore && polygonIgnore;
+      polygon.ignore = polygonIgnore;
+      polygon.useStyle(defaults(areaStyleModel.getAreaStyle(), {
+        fill: color,
+        opacity: 0.7
+      }));
+      polygon.hoverStyle = hoverAreaStyleModel.getAreaStyle();
+      var itemStyle = itemModel.getModel('itemStyle').getItemStyle(['color']);
+      var itemHoverStyle = itemModel.getModel('emphasis.itemStyle').getItemStyle();
+      var labelModel = itemModel.getModel('label');
+      var labelHoverModel = itemModel.getModel('emphasis.label');
+      symbolGroup.eachChild(function (symbolPath) {
+        symbolPath.setStyle(itemStyle);
+        symbolPath.hoverStyle = clone(itemHoverStyle);
+        setLabelStyle(symbolPath.style, symbolPath.hoverStyle, labelModel, labelHoverModel, {
+          labelFetcher: data.hostModel,
+          labelDataIndex: idx,
+          labelDimIndex: symbolPath.__dimIdx,
+          defaultText: data.get(data.dimensions[symbolPath.__dimIdx], idx),
+          autoColor: color,
+          isRectText: true
+        });
+      });
+
+      function onEmphasis() {
+        polygon.attr('ignore', hoverPolygonIgnore);
+      }
+
+      function onNormal() {
+        polygon.attr('ignore', polygonIgnore);
+      }
+
+      itemGroup.off('mouseover').off('mouseout').off('normal').off('emphasis');
+      itemGroup.on('emphasis', onEmphasis).on('mouseover', onEmphasis).on('normal', onNormal).on('mouseout', onNormal);
+      setHoverStyle(itemGroup);
+    });
+    this._data = data;
+  },
+  remove: function () {
+    this.group.removeAll();
+    this._data = null;
+  },
+  dispose: function () {}
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var radarLayout = function (ecModel) {
+  ecModel.eachSeriesByType('radar', function (seriesModel) {
+    var data = seriesModel.getData();
+    var points = [];
+    var coordSys = seriesModel.coordinateSystem;
+
+    if (!coordSys) {
+      return;
+    }
+
+    function pointsConverter(val, idx) {
+      points[idx] = points[idx] || [];
+      points[idx][i] = coordSys.dataToPoint(val, i);
+    }
+
+    var axes = coordSys.getIndicatorAxes();
+
+    for (var i = 0; i < axes.length; i++) {
+      data.each(data.mapDimension(axes[i].dim), pointsConverter);
+    }
+
+    data.each(function (idx) {
+      // Close polygon
+      points[idx][0] && points[idx].push(points[idx][0].slice());
+      data.setItemLayout(idx, points[idx]);
+    });
+  });
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+// Backward compat for radar chart in 2
+var backwardCompat$1 = function (option) {
+  var polarOptArr = option.polar;
+
+  if (polarOptArr) {
+    if (!isArray(polarOptArr)) {
+      polarOptArr = [polarOptArr];
+    }
+
+    var polarNotRadar = [];
+    each$1(polarOptArr, function (polarOpt, idx) {
+      if (polarOpt.indicator) {
+        if (polarOpt.type && !polarOpt.shape) {
+          polarOpt.shape = polarOpt.type;
+        }
+
+        option.radar = option.radar || [];
+
+        if (!isArray(option.radar)) {
+          option.radar = [option.radar];
+        }
+
+        option.radar.push(polarOpt);
+      } else {
+        polarNotRadar.push(polarOpt);
+      }
+    });
+    option.polar = polarNotRadar;
+  }
+
+  each$1(option.series, function (seriesOpt) {
+    if (seriesOpt && seriesOpt.type === 'radar' && seriesOpt.polarIndex) {
+      seriesOpt.radarIndex = seriesOpt.polarIndex;
+    }
+  });
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+registerVisual(dataColor('radar'));
+registerVisual(visualSymbol('radar', 'circle'));
+registerLayout(radarLayout);
+registerProcessor(dataFilter('radar'));
+registerPreprocessor(backwardCompat$1);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+SeriesModel.extend({
+  type: 'series.heatmap',
+  getInitialData: function (option, ecModel) {
+    return createListFromArray(this.getSource(), this, {
+      generateCoord: 'value'
+    });
+  },
+  preventIncremental: function () {
+    var coordSysCreator = CoordinateSystemManager.get(this.get('coordinateSystem'));
+
+    if (coordSysCreator && coordSysCreator.dimensions) {
+      return coordSysCreator.dimensions[0] === 'lng' && coordSysCreator.dimensions[1] === 'lat';
+    }
+  },
+  defaultOption: {
+    // Cartesian2D or geo
+    coordinateSystem: 'cartesian2d',
+    zlevel: 0,
+    z: 2,
+    // Cartesian coordinate system
+    // xAxisIndex: 0,
+    // yAxisIndex: 0,
+    // Geo coordinate system
+    geoIndex: 0,
+    blurSize: 30,
+    pointSize: 20,
+    maxOpacity: 1,
+    minOpacity: 0
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/* global Uint8ClampedArray */
+
+/**
+ * @file defines echarts Heatmap Chart
+ * @author Ovilia (me@zhangwenli.com)
+ * Inspired by https://github.com/mourner/simpleheat
+ *
+ * @module
+ */
+var GRADIENT_LEVELS = 256;
+/**
+ * Heatmap Chart
+ *
+ * @class
+ */
+
+function Heatmap() {
+  var canvas = createCanvas();
+  this.canvas = canvas;
+  this.blurSize = 30;
+  this.pointSize = 20;
+  this.maxOpacity = 1;
+  this.minOpacity = 0;
+  this._gradientPixels = {};
+}
+
+Heatmap.prototype = {
+  /**
+   * Renders Heatmap and returns the rendered canvas
+   * @param {Array} data array of data, each has x, y, value
+   * @param {number} width canvas width
+   * @param {number} height canvas height
+   */
+  update: function (data, width, height, normalize, colorFunc, isInRange) {
+    var brush = this._getBrush();
+
+    var gradientInRange = this._getGradient(data, colorFunc, 'inRange');
+
+    var gradientOutOfRange = this._getGradient(data, colorFunc, 'outOfRange');
+
+    var r = this.pointSize + this.blurSize;
+    var canvas = this.canvas;
+    var ctx = canvas.getContext('2d');
+    var len = data.length;
+    canvas.width = width;
+    canvas.height = height;
+
+    for (var i = 0; i < len; ++i) {
+      var p = data[i];
+      var x = p[0];
+      var y = p[1];
+      var value = p[2]; // calculate alpha using value
+
+      var alpha = normalize(value); // draw with the circle brush with alpha
+
+      ctx.globalAlpha = alpha;
+      ctx.drawImage(brush, x - r, y - r);
+    }
+
+    if (!canvas.width || !canvas.height) {
+      // Avoid "Uncaught DOMException: Failed to execute 'getImageData' on
+      // 'CanvasRenderingContext2D': The source height is 0."
+      return canvas;
+    } // colorize the canvas using alpha value and set with gradient
+
+
+    var imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
+    var pixels = imageData.data;
+    var offset = 0;
+    var pixelLen = pixels.length;
+    var minOpacity = this.minOpacity;
+    var maxOpacity = this.maxOpacity;
+    var diffOpacity = maxOpacity - minOpacity;
+
+    while (offset < pixelLen) {
+      var alpha = pixels[offset + 3] / 256;
+      var gradientOffset = Math.floor(alpha * (GRADIENT_LEVELS - 1)) * 4; // Simple optimize to ignore the empty data
+
+      if (alpha > 0) {
+        var gradient = isInRange(alpha) ? gradientInRange : gradientOutOfRange; // Any alpha > 0 will be mapped to [minOpacity, maxOpacity]
+
+        alpha > 0 && (alpha = alpha * diffOpacity + minOpacity);
+        pixels[offset++] = gradient[gradientOffset];
+        pixels[offset++] = gradient[gradientOffset + 1];
+        pixels[offset++] = gradient[gradientOffset + 2];
+        pixels[offset++] = gradient[gradientOffset + 3] * alpha * 256;
+      } else {
+        offset += 4;
+      }
+    }
+
+    ctx.putImageData(imageData, 0, 0);
+    return canvas;
+  },
+
+  /**
+   * get canvas of a black circle brush used for canvas to draw later
+   * @private
+   * @returns {Object} circle brush canvas
+   */
+  _getBrush: function () {
+    var brushCanvas = this._brushCanvas || (this._brushCanvas = createCanvas()); // set brush size
+
+    var r = this.pointSize + this.blurSize;
+    var d = r * 2;
+    brushCanvas.width = d;
+    brushCanvas.height = d;
+    var ctx = brushCanvas.getContext('2d');
+    ctx.clearRect(0, 0, d, d); // in order to render shadow without the distinct circle,
+    // draw the distinct circle in an invisible place,
+    // and use shadowOffset to draw shadow in the center of the canvas
+
+    ctx.shadowOffsetX = d;
+    ctx.shadowBlur = this.blurSize; // draw the shadow in black, and use alpha and shadow blur to generate
+    // color in color map
+
+    ctx.shadowColor = '#000'; // draw circle in the left to the canvas
+
+    ctx.beginPath();
+    ctx.arc(-r, r, this.pointSize, 0, Math.PI * 2, true);
+    ctx.closePath();
+    ctx.fill();
+    return brushCanvas;
+  },
+
+  /**
+   * get gradient color map
+   * @private
+   */
+  _getGradient: function (data, colorFunc, state) {
+    var gradientPixels = this._gradientPixels;
+    var pixelsSingleState = gradientPixels[state] || (gradientPixels[state] = new Uint8ClampedArray(256 * 4));
+    var color = [0, 0, 0, 0];
+    var off = 0;
+
+    for (var i = 0; i < 256; i++) {
+      colorFunc[state](i / 255, true, color);
+      pixelsSingleState[off++] = color[0];
+      pixelsSingleState[off++] = color[1];
+      pixelsSingleState[off++] = color[2];
+      pixelsSingleState[off++] = color[3];
+    }
+
+    return pixelsSingleState;
+  }
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+function getIsInPiecewiseRange(dataExtent, pieceList, selected) {
+  var dataSpan = dataExtent[1] - dataExtent[0];
+  pieceList = map(pieceList, function (piece) {
+    return {
+      interval: [(piece.interval[0] - dataExtent[0]) / dataSpan, (piece.interval[1] - dataExtent[0]) / dataSpan]
+    };
+  });
+  var len = pieceList.length;
+  var lastIndex = 0;
+  return function (val) {
+    // Try to find in the location of the last found
+    for (var i = lastIndex; i < len; i++) {
+      var interval = pieceList[i].interval;
+
+      if (interval[0] <= val && val <= interval[1]) {
+        lastIndex = i;
+        break;
+      }
+    }
+
+    if (i === len) {
+      // Not found, back interation
+      for (var i = lastIndex - 1; i >= 0; i--) {
+        var interval = pieceList[i].interval;
+
+        if (interval[0] <= val && val <= interval[1]) {
+          lastIndex = i;
+          break;
+        }
+      }
+    }
+
+    return i >= 0 && i < len && selected[i];
+  };
+}
+
+function getIsInContinuousRange(dataExtent, range) {
+  var dataSpan = dataExtent[1] - dataExtent[0];
+  range = [(range[0] - dataExtent[0]) / dataSpan, (range[1] - dataExtent[0]) / dataSpan];
+  return function (val) {
+    return val >= range[0] && val <= range[1];
+  };
+}
+
+function isGeoCoordSys(coordSys) {
+  var dimensions = coordSys.dimensions; // Not use coorSys.type === 'geo' because coordSys maybe extended
+
+  return dimensions[0] === 'lng' && dimensions[1] === 'lat';
+}
+
+extendChartView({
+  type: 'heatmap',
+  render: function (seriesModel, ecModel, api) {
+    var visualMapOfThisSeries;
+    ecModel.eachComponent('visualMap', function (visualMap) {
+      visualMap.eachTargetSeries(function (targetSeries) {
+        if (targetSeries === seriesModel) {
+          visualMapOfThisSeries = visualMap;
+        }
+      });
+    });
+    this.group.removeAll();
+    this._incrementalDisplayable = null;
+    var coordSys = seriesModel.coordinateSystem;
+
+    if (coordSys.type === 'cartesian2d' || coordSys.type === 'calendar') {
+      this._renderOnCartesianAndCalendar(seriesModel, api, 0, seriesModel.getData().count());
+    } else if (isGeoCoordSys(coordSys)) {
+      this._renderOnGeo(coordSys, seriesModel, visualMapOfThisSeries, api);
+    }
+  },
+  incrementalPrepareRender: function (seriesModel, ecModel, api) {
+    this.group.removeAll();
+  },
+  incrementalRender: function (params, seriesModel, ecModel, api) {
+    var coordSys = seriesModel.coordinateSystem;
+
+    if (coordSys) {
+      this._renderOnCartesianAndCalendar(seriesModel, api, params.start, params.end, true);
+    }
+  },
+  _renderOnCartesianAndCalendar: function (seriesModel, api, start, end, incremental) {
+    var coordSys = seriesModel.coordinateSystem;
+    var width;
+    var height;
+
+    if (coordSys.type === 'cartesian2d') {
+      var xAxis = coordSys.getAxis('x');
+      var yAxis = coordSys.getAxis('y');
+      width = xAxis.getBandWidth();
+      height = yAxis.getBandWidth();
+    }
+
+    var group = this.group;
+    var data = seriesModel.getData();
+    var itemStyleQuery = 'itemStyle';
+    var hoverItemStyleQuery = 'emphasis.itemStyle';
+    var labelQuery = 'label';
+    var hoverLabelQuery = 'emphasis.label';
+    var style = seriesModel.getModel(itemStyleQuery).getItemStyle(['color']);
+    var hoverStl = seriesModel.getModel(hoverItemStyleQuery).getItemStyle();
+    var labelModel = seriesModel.getModel(labelQuery);
+    var hoverLabelModel = seriesModel.getModel(hoverLabelQuery);
+    var coordSysType = coordSys.type;
+    var dataDims = coordSysType === 'cartesian2d' ? [data.mapDimension('x'), data.mapDimension('y'), data.mapDimension('value')] : [data.mapDimension('time'), data.mapDimension('value')];
+
+    for (var idx = start; idx < end; idx++) {
+      var rect;
+
+      if (coordSysType === 'cartesian2d') {
+        // Ignore empty data
+        if (isNaN(data.get(dataDims[2], idx))) {
+          continue;
+        }
+
+        var point = coordSys.dataToPoint([data.get(dataDims[0], idx), data.get(dataDims[1], idx)]);
+        rect = new Rect({
+          shape: {
+            x: point[0] - width / 2,
+            y: point[1] - height / 2,
+            width: width,
+            height: height
+          },
+          style: {
+            fill: data.getItemVisual(idx, 'color'),
+            opacity: data.getItemVisual(idx, 'opacity')
+          }
+        });
+      } else {
+        // Ignore empty data
+        if (isNaN(data.get(dataDims[1], idx))) {
+          continue;
+        }
+
+        rect = new Rect({
+          z2: 1,
+          shape: coordSys.dataToRect([data.get(dataDims[0], idx)]).contentShape,
+          style: {
+            fill: data.getItemVisual(idx, 'color'),
+            opacity: data.getItemVisual(idx, 'opacity')
+          }
+        });
+      }
+
+      var itemModel = data.getItemModel(idx); // Optimization for large datset
+
+      if (data.hasItemOption) {
+        style = itemModel.getModel(itemStyleQuery).getItemStyle(['color']);
+        hoverStl = itemModel.getModel(hoverItemStyleQuery).getItemStyle();
+        labelModel = itemModel.getModel(labelQuery);
+        hoverLabelModel = itemModel.getModel(hoverLabelQuery);
+      }
+
+      var rawValue = seriesModel.getRawValue(idx);
+      var defaultText = '-';
+
+      if (rawValue && rawValue[2] != null) {
+        defaultText = rawValue[2];
+      }
+
+      setLabelStyle(style, hoverStl, labelModel, hoverLabelModel, {
+        labelFetcher: seriesModel,
+        labelDataIndex: idx,
+        defaultText: defaultText,
+        isRectText: true
+      });
+      rect.setStyle(style);
+      setHoverStyle(rect, data.hasItemOption ? hoverStl : extend({}, hoverStl));
+      rect.incremental = incremental; // PENDING
+
+      if (incremental) {
+        // Rect must use hover layer if it's incremental.
+        rect.useHoverLayer = true;
+      }
+
+      group.add(rect);
+      data.setItemGraphicEl(idx, rect);
+    }
+  },
+  _renderOnGeo: function (geo, seriesModel, visualMapModel, api) {
+    var inRangeVisuals = visualMapModel.targetVisuals.inRange;
+    var outOfRangeVisuals = visualMapModel.targetVisuals.outOfRange; // if (!visualMapping) {
+    //     throw new Error('Data range must have color visuals');
+    // }
+
+    var data = seriesModel.getData();
+    var hmLayer = this._hmLayer || this._hmLayer || new Heatmap();
+    hmLayer.blurSize = seriesModel.get('blurSize');
+    hmLayer.pointSize = seriesModel.get('pointSize');
+    hmLayer.minOpacity = seriesModel.get('minOpacity');
+    hmLayer.maxOpacity = seriesModel.get('maxOpacity');
+    var rect = geo.getViewRect().clone();
+    var roamTransform = geo.getRoamTransform();
+    rect.applyTransform(roamTransform); // Clamp on viewport
+
+    var x = Math.max(rect.x, 0);
+    var y = Math.max(rect.y, 0);
+    var x2 = Math.min(rect.width + rect.x, api.getWidth());
+    var y2 = Math.min(rect.height + rect.y, api.getHeight());
+    var width = x2 - x;
+    var height = y2 - y;
+    var dims = [data.mapDimension('lng'), data.mapDimension('lat'), data.mapDimension('value')];
+    var points = data.mapArray(dims, function (lng, lat, value) {
+      var pt = geo.dataToPoint([lng, lat]);
+      pt[0] -= x;
+      pt[1] -= y;
+      pt.push(value);
+      return pt;
+    });
+    var dataExtent = visualMapModel.getExtent();
+    var isInRange = visualMapModel.type === 'visualMap.continuous' ? getIsInContinuousRange(dataExtent, visualMapModel.option.range) : getIsInPiecewiseRange(dataExtent, visualMapModel.getPieceList(), visualMapModel.option.selected);
+    hmLayer.update(points, width, height, inRangeVisuals.color.getNormalizer(), {
+      inRange: inRangeVisuals.color.getColorMapper(),
+      outOfRange: outOfRangeVisuals.color.getColorMapper()
+    }, isInRange);
+    var img = new ZImage({
+      style: {
+        width: width,
+        height: height,
+        x: x,
+        y: y,
+        image: hmLayer.canvas
+      },
+      silent: true
+    });
+    this.group.add(img);
+  },
+  dispose: function () {}
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * Link lists and struct (graph or tree)
+ */
+var each$7 = each$1;
+var DATAS = '\0__link_datas';
+var MAIN_DATA = '\0__link_mainData'; // Caution:
+// In most case, either list or its shallow clones (see list.cloneShallow)
+// is active in echarts process. So considering heap memory consumption,
+// we do not clone tree or graph, but share them among list and its shallow clones.
+// But in some rare case, we have to keep old list (like do animation in chart). So
+// please take care that both the old list and the new list share the same tree/graph.
+
+/**
+ * @param {Object} opt
+ * @param {module:echarts/data/List} opt.mainData
+ * @param {Object} [opt.struct] For example, instance of Graph or Tree.
+ * @param {string} [opt.structAttr] designation: list[structAttr] = struct;
+ * @param {Object} [opt.datas] {dataType: data},
+ *                 like: {node: nodeList, edge: edgeList}.
+ *                 Should contain mainData.
+ * @param {Object} [opt.datasAttr] {dataType: attr},
+ *                 designation: struct[datasAttr[dataType]] = list;
+ */
+
+function linkList(opt) {
+  var mainData = opt.mainData;
+  var datas = opt.datas;
+
+  if (!datas) {
+    datas = {
+      main: mainData
+    };
+    opt.datasAttr = {
+      main: 'data'
+    };
+  }
+
+  opt.datas = opt.mainData = null;
+  linkAll(mainData, datas, opt); // Porxy data original methods.
+
+  each$7(datas, function (data) {
+    each$7(mainData.TRANSFERABLE_METHODS, function (methodName) {
+      data.wrapMethod(methodName, curry(transferInjection, opt));
+    });
+  }); // Beyond transfer, additional features should be added to `cloneShallow`.
+
+  mainData.wrapMethod('cloneShallow', curry(cloneShallowInjection, opt)); // Only mainData trigger change, because struct.update may trigger
+  // another changable methods, which may bring about dead lock.
+
+  each$7(mainData.CHANGABLE_METHODS, function (methodName) {
+    mainData.wrapMethod(methodName, curry(changeInjection, opt));
+  }); // Make sure datas contains mainData.
+
+  assert$1(datas[mainData.dataType] === mainData);
+}
+
+function transferInjection(opt, res) {
+  if (isMainData(this)) {
+    // Transfer datas to new main data.
+    var datas = extend({}, this[DATAS]);
+    datas[this.dataType] = res;
+    linkAll(res, datas, opt);
+  } else {
+    // Modify the reference in main data to point newData.
+    linkSingle(res, this.dataType, this[MAIN_DATA], opt);
+  }
+
+  return res;
+}
+
+function changeInjection(opt, res) {
+  opt.struct && opt.struct.update(this);
+  return res;
+}
+
+function cloneShallowInjection(opt, res) {
+  // cloneShallow, which brings about some fragilities, may be inappropriate
+  // to be exposed as an API. So for implementation simplicity we can make
+  // the restriction that cloneShallow of not-mainData should not be invoked
+  // outside, but only be invoked here.
+  each$7(res[DATAS], function (data, dataType) {
+    data !== res && linkSingle(data.cloneShallow(), dataType, res, opt);
+  });
+  return res;
+}
+/**
+ * Supplement method to List.
+ *
+ * @public
+ * @param {string} [dataType] If not specified, return mainData.
+ * @return {module:echarts/data/List}
+ */
+
+
+function getLinkedData(dataType) {
+  var mainData = this[MAIN_DATA];
+  return dataType == null || mainData == null ? mainData : mainData[DATAS][dataType];
+}
+
+function isMainData(data) {
+  return data[MAIN_DATA] === data;
+}
+
+function linkAll(mainData, datas, opt) {
+  mainData[DATAS] = {};
+  each$7(datas, function (data, dataType) {
+    linkSingle(data, dataType, mainData, opt);
+  });
+}
+
+function linkSingle(data, dataType, mainData, opt) {
+  mainData[DATAS][dataType] = data;
+  data[MAIN_DATA] = mainData;
+  data.dataType = dataType;
+
+  if (opt.struct) {
+    data[opt.structAttr] = opt.struct;
+    opt.struct[opt.datasAttr[dataType]] = data;
+  } // Supplement method.
+
+
+  data.getLinkedData = getLinkedData;
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * Tree data structure
+ *
+ * @module echarts/data/Tree
+ */
+/**
+ * @constructor module:echarts/data/Tree~TreeNode
+ * @param {string} name
+ * @param {module:echarts/data/Tree} hostTree
+ */
+
+var TreeNode = function (name, hostTree) {
+  /**
+   * @type {string}
+   */
+  this.name = name || '';
+  /**
+   * Depth of node
+   *
+   * @type {number}
+   * @readOnly
+   */
+
+  this.depth = 0;
+  /**
+   * Height of the subtree rooted at this node.
+   * @type {number}
+   * @readOnly
+   */
+
+  this.height = 0;
+  /**
+   * @type {module:echarts/data/Tree~TreeNode}
+   * @readOnly
+   */
+
+  this.parentNode = null;
+  /**
+   * Reference to list item.
+   * Do not persistent dataIndex outside,
+   * besause it may be changed by list.
+   * If dataIndex -1,
+   * this node is logical deleted (filtered) in list.
+   *
+   * @type {Object}
+   * @readOnly
+   */
+
+  this.dataIndex = -1;
+  /**
+   * @type {Array.<module:echarts/data/Tree~TreeNode>}
+   * @readOnly
+   */
+
+  this.children = [];
+  /**
+   * @type {Array.<module:echarts/data/Tree~TreeNode>}
+   * @pubilc
+   */
+
+  this.viewChildren = [];
+  /**
+   * @type {moduel:echarts/data/Tree}
+   * @readOnly
+   */
+
+  this.hostTree = hostTree;
+};
+
+TreeNode.prototype = {
+  constructor: TreeNode,
+
+  /**
+   * The node is removed.
+   * @return {boolean} is removed.
+   */
+  isRemoved: function () {
+    return this.dataIndex < 0;
+  },
+
+  /**
+   * Travel this subtree (include this node).
+   * Usage:
+   *    node.eachNode(function () { ... }); // preorder
+   *    node.eachNode('preorder', function () { ... }); // preorder
+   *    node.eachNode('postorder', function () { ... }); // postorder
+   *    node.eachNode(
+   *        {order: 'postorder', attr: 'viewChildren'},
+   *        function () { ... }
+   *    ); // postorder
+   *
+   * @param {(Object|string)} options If string, means order.
+   * @param {string=} options.order 'preorder' or 'postorder'
+   * @param {string=} options.attr 'children' or 'viewChildren'
+   * @param {Function} cb If in preorder and return false,
+   *                      its subtree will not be visited.
+   * @param {Object} [context]
+   */
+  eachNode: function (options, cb, context) {
+    if (typeof options === 'function') {
+      context = cb;
+      cb = options;
+      options = null;
+    }
+
+    options = options || {};
+
+    if (isString(options)) {
+      options = {
+        order: options
+      };
+    }
+
+    var order = options.order || 'preorder';
+    var children = this[options.attr || 'children'];
+    var suppressVisitSub;
+    order === 'preorder' && (suppressVisitSub = cb.call(context, this));
+
+    for (var i = 0; !suppressVisitSub && i < children.length; i++) {
+      children[i].eachNode(options, cb, context);
+    }
+
+    order === 'postorder' && cb.call(context, this);
+  },
+
+  /**
+   * Update depth and height of this subtree.
+   *
+   * @param  {number} depth
+   */
+  updateDepthAndHeight: function (depth) {
+    var height = 0;
+    this.depth = depth;
+
+    for (var i = 0; i < this.children.length; i++) {
+      var child = this.children[i];
+      child.updateDepthAndHeight(depth + 1);
+
+      if (child.height > height) {
+        height = child.height;
+      }
+    }
+
+    this.height = height + 1;
+  },
+
+  /**
+   * @param  {string} id
+   * @return {module:echarts/data/Tree~TreeNode}
+   */
+  getNodeById: function (id) {
+    if (this.getId() === id) {
+      return this;
+    }
+
+    for (var i = 0, children = this.children, len = children.length; i < len; i++) {
+      var res = children[i].getNodeById(id);
+
+      if (res) {
+        return res;
+      }
+    }
+  },
+
+  /**
+   * @param {module:echarts/data/Tree~TreeNode} node
+   * @return {boolean}
+   */
+  contains: function (node) {
+    if (node === this) {
+      return true;
+    }
+
+    for (var i = 0, children = this.children, len = children.length; i < len; i++) {
+      var res = children[i].contains(node);
+
+      if (res) {
+        return res;
+      }
+    }
+  },
+
+  /**
+   * @param {boolean} includeSelf Default false.
+   * @return {Array.<module:echarts/data/Tree~TreeNode>} order: [root, child, grandchild, ...]
+   */
+  getAncestors: function (includeSelf) {
+    var ancestors = [];
+    var node = includeSelf ? this : this.parentNode;
+
+    while (node) {
+      ancestors.push(node);
+      node = node.parentNode;
+    }
+
+    ancestors.reverse();
+    return ancestors;
+  },
+
+  /**
+   * @param {string|Array=} [dimension='value'] Default 'value'. can be 0, 1, 2, 3
+   * @return {number} Value.
+   */
+  getValue: function (dimension) {
+    var data = this.hostTree.data;
+    return data.get(data.getDimension(dimension || 'value'), this.dataIndex);
+  },
+
+  /**
+   * @param {Object} layout
+   * @param {boolean=} [merge=false]
+   */
+  setLayout: function (layout, merge$$1) {
+    this.dataIndex >= 0 && this.hostTree.data.setItemLayout(this.dataIndex, layout, merge$$1);
+  },
+
+  /**
+   * @return {Object} layout
+   */
+  getLayout: function () {
+    return this.hostTree.data.getItemLayout(this.dataIndex);
+  },
+
+  /**
+   * @param {string} [path]
+   * @return {module:echarts/model/Model}
+   */
+  getModel: function (path) {
+    if (this.dataIndex < 0) {
+      return;
+    }
+
+    var hostTree = this.hostTree;
+    var itemModel = hostTree.data.getItemModel(this.dataIndex);
+    var levelModel = this.getLevelModel();
+    var leavesModel;
+
+    if (!levelModel && (this.children.length === 0 || this.children.length !== 0 && this.isExpand === false)) {
+      leavesModel = this.getLeavesModel();
+    }
+
+    return itemModel.getModel(path, (levelModel || leavesModel || hostTree.hostModel).getModel(path));
+  },
+
+  /**
+   * @return {module:echarts/model/Model}
+   */
+  getLevelModel: function () {
+    return (this.hostTree.levelModels || [])[this.depth];
+  },
+
+  /**
+   * @return {module:echarts/model/Model}
+   */
+  getLeavesModel: function () {
+    return this.hostTree.leavesModel;
+  },
+
+  /**
+   * @example
+   *  setItemVisual('color', color);
+   *  setItemVisual({
+   *      'color': color
+   *  });
+   */
+  setVisual: function (key, value) {
+    this.dataIndex >= 0 && this.hostTree.data.setItemVisual(this.dataIndex, key, value);
+  },
+
+  /**
+   * Get item visual
+   */
+  getVisual: function (key, ignoreParent) {
+    return this.hostTree.data.getItemVisual(this.dataIndex, key, ignoreParent);
+  },
+
+  /**
+   * @public
+   * @return {number}
+   */
+  getRawIndex: function () {
+    return this.hostTree.data.getRawIndex(this.dataIndex);
+  },
+
+  /**
+   * @public
+   * @return {string}
+   */
+  getId: function () {
+    return this.hostTree.data.getId(this.dataIndex);
+  },
+
+  /**
+   * if this is an ancestor of another node
+   *
+   * @public
+   * @param {TreeNode} node another node
+   * @return {boolean} if is ancestor
+   */
+  isAncestorOf: function (node) {
+    var parent = node.parentNode;
+
+    while (parent) {
+      if (parent === this) {
+        return true;
+      }
+
+      parent = parent.parentNode;
+    }
+
+    return false;
+  },
+
+  /**
+   * if this is an descendant of another node
+   *
+   * @public
+   * @param {TreeNode} node another node
+   * @return {boolean} if is descendant
+   */
+  isDescendantOf: function (node) {
+    return node !== this && node.isAncestorOf(this);
+  }
+};
+/**
+ * @constructor
+ * @alias module:echarts/data/Tree
+ * @param {module:echarts/model/Model} hostModel
+ * @param {Array.<Object>} levelOptions
+ * @param {Object} leavesOption
+ */
+
+function Tree(hostModel, levelOptions, leavesOption) {
+  /**
+   * @type {module:echarts/data/Tree~TreeNode}
+   * @readOnly
+   */
+  this.root;
+  /**
+   * @type {module:echarts/data/List}
+   * @readOnly
+   */
+
+  this.data;
+  /**
+   * Index of each item is the same as the raw index of coresponding list item.
+   * @private
+   * @type {Array.<module:echarts/data/Tree~TreeNode}
+   */
+
+  this._nodes = [];
+  /**
+   * @private
+   * @readOnly
+   * @type {module:echarts/model/Model}
+   */
+
+  this.hostModel = hostModel;
+  /**
+   * @private
+   * @readOnly
+   * @type {Array.<module:echarts/model/Model}
+   */
+
+  this.levelModels = map(levelOptions || [], function (levelDefine) {
+    return new Model(levelDefine, hostModel, hostModel.ecModel);
+  });
+  this.leavesModel = new Model(leavesOption || {}, hostModel, hostModel.ecModel);
+}
+
+Tree.prototype = {
+  constructor: Tree,
+  type: 'tree',
+
+  /**
+   * Travel this subtree (include this node).
+   * Usage:
+   *    node.eachNode(function () { ... }); // preorder
+   *    node.eachNode('preorder', function () { ... }); // preorder
+   *    node.eachNode('postorder', function () { ... }); // postorder
+   *    node.eachNode(
+   *        {order: 'postorder', attr: 'viewChildren'},
+   *        function () { ... }
+   *    ); // postorder
+   *
+   * @param {(Object|string)} options If string, means order.
+   * @param {string=} options.order 'preorder' or 'postorder'
+   * @param {string=} options.attr 'children' or 'viewChildren'
+   * @param {Function} cb
+   * @param {Object}   [context]
+   */
+  eachNode: function (options, cb, context) {
+    this.root.eachNode(options, cb, context);
+  },
+
+  /**
+   * @param {number} dataIndex
+   * @return {module:echarts/data/Tree~TreeNode}
+   */
+  getNodeByDataIndex: function (dataIndex) {
+    var rawIndex = this.data.getRawIndex(dataIndex);
+    return this._nodes[rawIndex];
+  },
+
+  /**
+   * @param {string} name
+   * @return {module:echarts/data/Tree~TreeNode}
+   */
+  getNodeByName: function (name) {
+    return this.root.getNodeByName(name);
+  },
+
+  /**
+   * Update item available by list,
+   * when list has been performed options like 'filterSelf' or 'map'.
+   */
+  update: function () {
+    var data = this.data;
+    var nodes = this._nodes;
+
+    for (var i = 0, len = nodes.length; i < len; i++) {
+      nodes[i].dataIndex = -1;
+    }
+
+    for (var i = 0, len = data.count(); i < len; i++) {
+      nodes[data.getRawIndex(i)].dataIndex = i;
+    }
+  },
+
+  /**
+   * Clear all layouts
+   */
+  clearLayouts: function () {
+    this.data.clearItemLayouts();
+  }
+};
+/**
+ * data node format:
+ * {
+ *     name: ...
+ *     value: ...
+ *     children: [
+ *         {
+ *             name: ...
+ *             value: ...
+ *             children: ...
+ *         },
+ *         ...
+ *     ]
+ * }
+ *
+ * @static
+ * @param {Object} dataRoot Root node.
+ * @param {module:echarts/model/Model} hostModel
+ * @param {Object} treeOptions
+ * @param {Array.<Object>} treeOptions.levels
+ * @param {Array.<Object>} treeOptions.leaves
+ * @return module:echarts/data/Tree
+ */
+
+Tree.createTree = function (dataRoot, hostModel, treeOptions) {
+  var tree = new Tree(hostModel, treeOptions.levels, treeOptions.leaves);
+  var listData = [];
+  var dimMax = 1;
+  buildHierarchy(dataRoot);
+
+  function buildHierarchy(dataNode, parentNode) {
+    var value = dataNode.value;
+    dimMax = Math.max(dimMax, isArray(value) ? value.length : 1);
+    listData.push(dataNode);
+    var node = new TreeNode(dataNode.name, tree);
+    parentNode ? addChild(node, parentNode) : tree.root = node;
+
+    tree._nodes.push(node);
+
+    var children = dataNode.children;
+
+    if (children) {
+      for (var i = 0; i < children.length; i++) {
+        buildHierarchy(children[i], node);
+      }
+    }
+  }
+
+  tree.root.updateDepthAndHeight(0);
+  var dimensionsInfo = createDimensions(listData, {
+    coordDimensions: ['value'],
+    dimensionsCount: dimMax
+  });
+  var list = new List(dimensionsInfo, hostModel);
+  list.initData(listData);
+  linkList({
+    mainData: list,
+    struct: tree,
+    structAttr: 'tree'
+  });
+  tree.update();
+  return tree;
+};
+/**
+ * It is needed to consider the mess of 'list', 'hostModel' when creating a TreeNote,
+ * so this function is not ready and not necessary to be public.
+ *
+ * @param {(module:echarts/data/Tree~TreeNode|Object)} child
+ */
+
+
+function addChild(child, node) {
+  var children = node.children;
+
+  if (child.parentNode === node) {
+    return;
+  }
+
+  children.push(child);
+  child.parentNode = node;
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * @file Create data struct and define tree view's series model
+ * @author Deqing Li(annong035@gmail.com)
+ */
+SeriesModel.extend({
+  type: 'series.tree',
+  layoutInfo: null,
+  // can support the position parameters 'left', 'top','right','bottom', 'width',
+  // 'height' in the setOption() with 'merge' mode normal.
+  layoutMode: 'box',
+
+  /**
+   * Init a tree data structure from data in option series
+   * @param  {Object} option  the object used to config echarts view
+   * @return {module:echarts/data/List} storage initial data
+   */
+  getInitialData: function (option) {
+    //create an virtual root
+    var root = {
+      name: option.name,
+      children: option.data
+    };
+    var leaves = option.leaves || {};
+    var treeOption = {};
+    treeOption.leaves = leaves;
+    var tree = Tree.createTree(root, this, treeOption);
+    var treeDepth = 0;
+    tree.eachNode('preorder', function (node) {
+      if (node.depth > treeDepth) {
+        treeDepth = node.depth;
+      }
+    });
+    var expandAndCollapse = option.expandAndCollapse;
+    var expandTreeDepth = expandAndCollapse && option.initialTreeDepth >= 0 ? option.initialTreeDepth : treeDepth;
+    tree.root.eachNode('preorder', function (node) {
+      var item = node.hostTree.data.getRawDataItem(node.dataIndex); // Add item.collapsed != null, because users can collapse node original in the series.data.
+
+      node.isExpand = item && item.collapsed != null ? !item.collapsed : node.depth <= expandTreeDepth;
+    });
+    return tree.data;
+  },
+
+  /**
+   * Make the configuration 'orient' backward compatibly, with 'horizontal = LR', 'vertical = TB'.
+   * @returns {string} orient
+   */
+  getOrient: function () {
+    var orient = this.get('orient');
+
+    if (orient === 'horizontal') {
+      orient = 'LR';
+    } else if (orient === 'vertical') {
+      orient = 'TB';
+    }
+
+    return orient;
+  },
+  setZoom: function (zoom) {
+    this.option.zoom = zoom;
+  },
+  setCenter: function (center) {
+    this.option.center = center;
+  },
+
+  /**
+   * @override
+   * @param {number} dataIndex
+   */
+  formatTooltip: function (dataIndex) {
+    var tree = this.getData().tree;
+    var realRoot = tree.root.children[0];
+    var node = tree.getNodeByDataIndex(dataIndex);
+    var value = node.getValue();
+    var name = node.name;
+
+    while (node && node !== realRoot) {
+      name = node.parentNode.name + '.' + name;
+      node = node.parentNode;
+    }
+
+    return encodeHTML(name + (isNaN(value) || value == null ? '' : ' : ' + value));
+  },
+  defaultOption: {
+    zlevel: 0,
+    z: 2,
+    coordinateSystem: 'view',
+    // the position of the whole view
+    left: '12%',
+    top: '12%',
+    right: '12%',
+    bottom: '12%',
+    // the layout of the tree, two value can be selected, 'orthogonal' or 'radial'
+    layout: 'orthogonal',
+    roam: false,
+    // true | false | 'move' | 'scale', see module:component/helper/RoamController.
+    // Symbol size scale ratio in roam
+    nodeScaleRatio: 0.4,
+    // Default on center of graph
+    center: null,
+    zoom: 1,
+    // The orient of orthoginal layout, can be setted to 'LR', 'TB', 'RL', 'BT'.
+    // and the backward compatibility configuration 'horizontal = LR', 'vertical = TB'.
+    orient: 'LR',
+    symbol: 'emptyCircle',
+    symbolSize: 7,
+    expandAndCollapse: true,
+    initialTreeDepth: 2,
+    lineStyle: {
+      color: '#ccc',
+      width: 1.5,
+      curveness: 0.5
+    },
+    itemStyle: {
+      color: 'lightsteelblue',
+      borderColor: '#c23531',
+      borderWidth: 1.5
+    },
+    label: {
+      show: true,
+      color: '#555'
+    },
+    leaves: {
+      label: {
+        show: true
+      }
+    },
+    animationEasing: 'linear',
+    animationDuration: 700,
+    animationDurationUpdate: 1000
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/*
+* The tree layout implementation references to d3.js
+* (https://github.com/d3/d3-hierarchy). The use of the source
+* code of this file is also subject to the terms and consitions
+* of its license (BSD-3Clause, see <echarts/src/licenses/LICENSE-d3>).
+*/
+
+/**
+ * @file The layout algorithm of node-link tree diagrams. Here we using Reingold-Tilford algorithm to drawing
+ *       the tree.
+ * @see https://github.com/d3/d3-hierarchy
+ */
+/**
+ * Initialize all computational message for following algorithm
+ * @param  {module:echarts/data/Tree~TreeNode} root   The virtual root of the tree
+ */
+
+function init$2(root) {
+  root.hierNode = {
+    defaultAncestor: null,
+    ancestor: root,
+    prelim: 0,
+    modifier: 0,
+    change: 0,
+    shift: 0,
+    i: 0,
+    thread: null
+  };
+  var nodes = [root];
+  var node;
+  var children;
+
+  while (node = nodes.pop()) {
+    // jshint ignore:line
+    children = node.children;
+
+    if (node.isExpand && children.length) {
+      var n = children.length;
+
+      for (var i = n - 1; i >= 0; i--) {
+        var child = children[i];
+        child.hierNode = {
+          defaultAncestor: null,
+          ancestor: child,
+          prelim: 0,
+          modifier: 0,
+          change: 0,
+          shift: 0,
+          i: i,
+          thread: null
+        };
+        nodes.push(child);
+      }
+    }
+  }
+}
+/**
+ * Computes a preliminary x coordinate for node. Before that, this function is
+ * applied recursively to the children of node, as well as the function
+ * apportion(). After spacing out the children by calling executeShifts(), the
+ * node is placed to the midpoint of its outermost children.
+ * @param  {module:echarts/data/Tree~TreeNode} node
+ * @param {Function} separation
+ */
+
+function firstWalk(node, separation) {
+  var children = node.isExpand ? node.children : [];
+  var siblings = node.parentNode.children;
+  var subtreeW = node.hierNode.i ? siblings[node.hierNode.i - 1] : null;
+
+  if (children.length) {
+    executeShifts(node);
+    var midPoint = (children[0].hierNode.prelim + children[children.length - 1].hierNode.prelim) / 2;
+
+    if (subtreeW) {
+      node.hierNode.prelim = subtreeW.hierNode.prelim + separation(node, subtreeW);
+      node.hierNode.modifier = node.hierNode.prelim - midPoint;
+    } else {
+      node.hierNode.prelim = midPoint;
+    }
+  } else if (subtreeW) {
+    node.hierNode.prelim = subtreeW.hierNode.prelim + separation(node, subtreeW);
+  }
+
+  node.parentNode.hierNode.defaultAncestor = apportion(node, subtreeW, node.parentNode.hierNode.defaultAncestor || siblings[0], separation);
+}
+/**
+ * Computes all real x-coordinates by summing up the modifiers recursively.
+ * @param  {module:echarts/data/Tree~TreeNode} node
+ */
+
+function secondWalk(node) {
+  var nodeX = node.hierNode.prelim + node.parentNode.hierNode.modifier;
+  node.setLayout({
+    x: nodeX
+  }, true);
+  node.hierNode.modifier += node.parentNode.hierNode.modifier;
+}
+function separation(cb) {
+  return arguments.length ? cb : defaultSeparation;
+}
+/**
+ * Transform the common coordinate to radial coordinate
+ * @param  {number} x
+ * @param  {number} y
+ * @return {Object}
+ */
+
+function radialCoordinate(x, y) {
+  var radialCoor = {};
+  x -= Math.PI / 2;
+  radialCoor.x = y * Math.cos(x);
+  radialCoor.y = y * Math.sin(x);
+  return radialCoor;
+}
+/**
+ * Get the layout position of the whole view
+ * @param {module:echarts/model/Series} seriesModel  the model object of sankey series
+ * @param {module:echarts/ExtensionAPI} api  provide the API list that the developer can call
+ * @return {module:zrender/core/BoundingRect}  size of rect to draw the sankey view
+ */
+
+function getViewRect(seriesModel, api) {
+  return getLayoutRect(seriesModel.getBoxLayoutParams(), {
+    width: api.getWidth(),
+    height: api.getHeight()
+  });
+}
+/**
+ * All other shifts, applied to the smaller subtrees between w- and w+, are
+ * performed by this function.
+ * @param  {module:echarts/data/Tree~TreeNode} node
+ */
+
+function executeShifts(node) {
+  var children = node.children;
+  var n = children.length;
+  var shift = 0;
+  var change = 0;
+
+  while (--n >= 0) {
+    var child = children[n];
+    child.hierNode.prelim += shift;
+    child.hierNode.modifier += shift;
+    change += child.hierNode.change;
+    shift += child.hierNode.shift + change;
+  }
+}
+/**
+ * The core of the algorithm. Here, a new subtree is combined with the
+ * previous subtrees. Threads are used to traverse the inside and outside
+ * contours of the left and right subtree up to the highest common level.
+ * Whenever two nodes of the inside contours conflict, we compute the left
+ * one of the greatest uncommon ancestors using the function nextAncestor()
+ * and call moveSubtree() to shift the subtree and prepare the shifts of
+ * smaller subtrees. Finally, we add a new thread (if necessary).
+ * @param  {module:echarts/data/Tree~TreeNode} subtreeV
+ * @param  {module:echarts/data/Tree~TreeNode} subtreeW
+ * @param  {module:echarts/data/Tree~TreeNode} ancestor
+ * @param  {Function} separation
+ * @return {module:echarts/data/Tree~TreeNode}
+ */
+
+
+function apportion(subtreeV, subtreeW, ancestor, separation) {
+  if (subtreeW) {
+    var nodeOutRight = subtreeV;
+    var nodeInRight = subtreeV;
+    var nodeOutLeft = nodeInRight.parentNode.children[0];
+    var nodeInLeft = subtreeW;
+    var sumOutRight = nodeOutRight.hierNode.modifier;
+    var sumInRight = nodeInRight.hierNode.modifier;
+    var sumOutLeft = nodeOutLeft.hierNode.modifier;
+    var sumInLeft = nodeInLeft.hierNode.modifier;
+
+    while (nodeInLeft = nextRight(nodeInLeft), nodeInRight = nextLeft(nodeInRight), nodeInLeft && nodeInRight) {
+      nodeOutRight = nextRight(nodeOutRight);
+      nodeOutLeft = nextLeft(nodeOutLeft);
+      nodeOutRight.hierNode.ancestor = subtreeV;
+      var shift = nodeInLeft.hierNode.prelim + sumInLeft - nodeInRight.hierNode.prelim - sumInRight + separation(nodeInLeft, nodeInRight);
+
+      if (shift > 0) {
+        moveSubtree(nextAncestor(nodeInLeft, subtreeV, ancestor), subtreeV, shift);
+        sumInRight += shift;
+        sumOutRight += shift;
+      }
+
+      sumInLeft += nodeInLeft.hierNode.modifier;
+      sumInRight += nodeInRight.hierNode.modifier;
+      sumOutRight += nodeOutRight.hierNode.modifier;
+      sumOutLeft += nodeOutLeft.hierNode.modifier;
+    }
+
+    if (nodeInLeft && !nextRight(nodeOutRight)) {
+      nodeOutRight.hierNode.thread = nodeInLeft;
+      nodeOutRight.hierNode.modifier += sumInLeft - sumOutRight;
+    }
+
+    if (nodeInRight && !nextLeft(nodeOutLeft)) {
+      nodeOutLeft.hierNode.thread = nodeInRight;
+      nodeOutLeft.hierNode.modifier += sumInRight - sumOutLeft;
+      ancestor = subtreeV;
+    }
+  }
+
+  return ancestor;
+}
+/**
+ * This function is used to traverse the right contour of a subtree.
+ * It returns the rightmost child of node or the thread of node. The function
+ * returns null if and only if node is on the highest depth of its subtree.
+ * @param  {module:echarts/data/Tree~TreeNode} node
+ * @return {module:echarts/data/Tree~TreeNode}
+ */
+
+
+function nextRight(node) {
+  var children = node.children;
+  return children.length && node.isExpand ? children[children.length - 1] : node.hierNode.thread;
+}
+/**
+ * This function is used to traverse the left contour of a subtree (or a subforest).
+ * It returns the leftmost child of node or the thread of node. The function
+ * returns null if and only if node is on the highest depth of its subtree.
+ * @param  {module:echarts/data/Tree~TreeNode} node
+ * @return {module:echarts/data/Tree~TreeNode}
+ */
+
+
+function nextLeft(node) {
+  var children = node.children;
+  return children.length && node.isExpand ? children[0] : node.hierNode.thread;
+}
+/**
+ * If nodeInLeft鈥檚 ancestor is a sibling of node, returns nodeInLeft鈥檚 ancestor.
+ * Otherwise, returns the specified ancestor.
+ * @param  {module:echarts/data/Tree~TreeNode} nodeInLeft
+ * @param  {module:echarts/data/Tree~TreeNode} node
+ * @param  {module:echarts/data/Tree~TreeNode} ancestor
+ * @return {module:echarts/data/Tree~TreeNode}
+ */
+
+
+function nextAncestor(nodeInLeft, node, ancestor) {
+  return nodeInLeft.hierNode.ancestor.parentNode === node.parentNode ? nodeInLeft.hierNode.ancestor : ancestor;
+}
+/**
+ * Shifts the current subtree rooted at wr. This is done by increasing prelim(w+) and modifier(w+) by shift.
+ * @param  {module:echarts/data/Tree~TreeNode} wl
+ * @param  {module:echarts/data/Tree~TreeNode} wr
+ * @param  {number} shift [description]
+ */
+
+
+function moveSubtree(wl, wr, shift) {
+  var change = shift / (wr.hierNode.i - wl.hierNode.i);
+  wr.hierNode.change -= change;
+  wr.hierNode.shift += shift;
+  wr.hierNode.modifier += shift;
+  wr.hierNode.prelim += shift;
+  wl.hierNode.change += change;
+}
+
+function defaultSeparation(node1, node2) {
+  return node1.parentNode === node2.parentNode ? 1 : 2;
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * Simple view coordinate system
+ * Mapping given x, y to transformd view x, y
+ */
+var v2ApplyTransform$1 = applyTransform; // Dummy transform node
+
+function TransformDummy() {
+  Transformable.call(this);
+}
+
+mixin(TransformDummy, Transformable);
+
+function View(name) {
+  /**
+   * @type {string}
+   */
+  this.name = name;
+  /**
+   * @type {Object}
+   */
+
+  this.zoomLimit;
+  Transformable.call(this);
+  this._roamTransformable = new TransformDummy();
+  this._rawTransformable = new TransformDummy();
+  this._center;
+  this._zoom;
+}
+
+View.prototype = {
+  constructor: View,
+  type: 'view',
+
+  /**
+   * @param {Array.<string>}
+   * @readOnly
+   */
+  dimensions: ['x', 'y'],
+
+  /**
+   * Set bounding rect
+   * @param {number} x
+   * @param {number} y
+   * @param {number} width
+   * @param {number} height
+   */
+  // PENDING to getRect
+  setBoundingRect: function (x, y, width, height) {
+    this._rect = new BoundingRect(x, y, width, height);
+    return this._rect;
+  },
+
+  /**
+   * @return {module:zrender/core/BoundingRect}
+   */
+  // PENDING to getRect
+  getBoundingRect: function () {
+    return this._rect;
+  },
+
+  /**
+   * @param {number} x
+   * @param {number} y
+   * @param {number} width
+   * @param {number} height
+   */
+  setViewRect: function (x, y, width, height) {
+    this.transformTo(x, y, width, height);
+    this._viewRect = new BoundingRect(x, y, width, height);
+  },
+
+  /**
+   * Transformed to particular position and size
+   * @param {number} x
+   * @param {number} y
+   * @param {number} width
+   * @param {number} height
+   */
+  transformTo: function (x, y, width, height) {
+    var rect = this.getBoundingRect();
+    var rawTransform = this._rawTransformable;
+    rawTransform.transform = rect.calculateTransform(new BoundingRect(x, y, width, height));
+    rawTransform.decomposeTransform();
+
+    this._updateTransform();
+  },
+
+  /**
+   * Set center of view
+   * @param {Array.<number>} [centerCoord]
+   */
+  setCenter: function (centerCoord) {
+    if (!centerCoord) {
+      return;
+    }
+
+    this._center = centerCoord;
+
+    this._updateCenterAndZoom();
+  },
+
+  /**
+   * @param {number} zoom
+   */
+  setZoom: function (zoom) {
+    zoom = zoom || 1;
+    var zoomLimit = this.zoomLimit;
+
+    if (zoomLimit) {
+      if (zoomLimit.max != null) {
+        zoom = Math.min(zoomLimit.max, zoom);
+      }
+
+      if (zoomLimit.min != null) {
+        zoom = Math.max(zoomLimit.min, zoom);
+      }
+    }
+
+    this._zoom = zoom;
+
+    this._updateCenterAndZoom();
+  },
+
+  /**
+   * Get default center without roam
+   */
+  getDefaultCenter: function () {
+    // Rect before any transform
+    var rawRect = this.getBoundingRect();
+    var cx = rawRect.x + rawRect.width / 2;
+    var cy = rawRect.y + rawRect.height / 2;
+    return [cx, cy];
+  },
+  getCenter: function () {
+    return this._center || this.getDefaultCenter();
+  },
+  getZoom: function () {
+    return this._zoom || 1;
+  },
+
+  /**
+   * @return {Array.<number}
+   */
+  getRoamTransform: function () {
+    return this._roamTransformable.getLocalTransform();
+  },
+
+  /**
+   * Remove roam
+   */
+  _updateCenterAndZoom: function () {
+    // Must update after view transform updated
+    var rawTransformMatrix = this._rawTransformable.getLocalTransform();
+
+    var roamTransform = this._roamTransformable;
+    var defaultCenter = this.getDefaultCenter();
+    var center = this.getCenter();
+    var zoom = this.getZoom();
+    center = applyTransform([], center, rawTransformMatrix);
+    defaultCenter = applyTransform([], defaultCenter, rawTransformMatrix);
+    roamTransform.origin = center;
+    roamTransform.position = [defaultCenter[0] - center[0], defaultCenter[1] - center[1]];
+    roamTransform.scale = [zoom, zoom];
+
+    this._updateTransform();
+  },
+
+  /**
+   * Update transform from roam and mapLocation
+   * @private
+   */
+  _updateTransform: function () {
+    var roamTransformable = this._roamTransformable;
+    var rawTransformable = this._rawTransformable;
+    rawTransformable.parent = roamTransformable;
+    roamTransformable.updateTransform();
+    rawTransformable.updateTransform();
+    copy$1(this.transform || (this.transform = []), rawTransformable.transform || create$1());
+    this._rawTransform = rawTransformable.getLocalTransform();
+    this.invTransform = this.invTransform || [];
+    invert(this.invTransform, this.transform);
+    this.decomposeTransform();
+  },
+
+  /**
+   * @return {module:zrender/core/BoundingRect}
+   */
+  getViewRect: function () {
+    return this._viewRect;
+  },
+
+  /**
+   * Get view rect after roam transform
+   * @return {module:zrender/core/BoundingRect}
+   */
+  getViewRectAfterRoam: function () {
+    var rect = this.getBoundingRect().clone();
+    rect.applyTransform(this.transform);
+    return rect;
+  },
+
+  /**
+   * Convert a single (lon, lat) data item to (x, y) point.
+   * @param {Array.<number>} data
+   * @param {boolean} noRoam
+   * @param {Array.<number>} [out]
+   * @return {Array.<number>}
+   */
+  dataToPoint: function (data, noRoam, out) {
+    var transform = noRoam ? this._rawTransform : this.transform;
+    out = out || [];
+    return transform ? v2ApplyTransform$1(out, data, transform) : copy(out, data);
+  },
+
+  /**
+   * Convert a (x, y) point to (lon, lat) data
+   * @param {Array.<number>} point
+   * @return {Array.<number>}
+   */
+  pointToData: function (point) {
+    var invTransform = this.invTransform;
+    return invTransform ? v2ApplyTransform$1([], point, invTransform) : [point[0], point[1]];
+  },
+
+  /**
+   * @implements
+   * see {module:echarts/CoodinateSystem}
+   */
+  convertToPixel: curry(doConvert, 'dataToPoint'),
+
+  /**
+   * @implements
+   * see {module:echarts/CoodinateSystem}
+   */
+  convertFromPixel: curry(doConvert, 'pointToData'),
+
+  /**
+   * @implements
+   * see {module:echarts/CoodinateSystem}
+   */
+  containPoint: function (point) {
+    return this.getViewRectAfterRoam().contain(point[0], point[1]);
+  }
+  /**
+   * @return {number}
+   */
+  // getScalarScale: function () {
+  //     // Use determinant square root of transform to mutiply scalar
+  //     var m = this.transform;
+  //     var det = Math.sqrt(Math.abs(m[0] * m[3] - m[2] * m[1]));
+  //     return det;
+  // }
+
+};
+mixin(View, Transformable);
+
+function doConvert(methodName, ecModel, finder, value) {
+  var seriesModel = finder.seriesModel;
+  var coordSys = seriesModel ? seriesModel.coordinateSystem : null; // e.g., graph.
+
+  return coordSys === this ? coordSys[methodName](value) : null;
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * For geo and graph.
+ *
+ * @param {Object} controllerHost
+ * @param {module:zrender/Element} controllerHost.target
+ */
+function updateViewOnPan(controllerHost, dx, dy) {
+  var target = controllerHost.target;
+  var pos = target.position;
+  pos[0] += dx;
+  pos[1] += dy;
+  target.dirty();
+}
+/**
+ * For geo and graph.
+ *
+ * @param {Object} controllerHost
+ * @param {module:zrender/Element} controllerHost.target
+ * @param {number} controllerHost.zoom
+ * @param {number} controllerHost.zoomLimit like: {min: 1, max: 2}
+ */
+
+function updateViewOnZoom(controllerHost, zoomDelta, zoomX, zoomY) {
+  var target = controllerHost.target;
+  var zoomLimit = controllerHost.zoomLimit;
+  var pos = target.position;
+  var scale = target.scale;
+  var newZoom = controllerHost.zoom = controllerHost.zoom || 1;
+  newZoom *= zoomDelta;
+
+  if (zoomLimit) {
+    var zoomMin = zoomLimit.min || 0;
+    var zoomMax = zoomLimit.max || Infinity;
+    newZoom = Math.max(Math.min(zoomMax, newZoom), zoomMin);
+  }
+
+  var zoomScale = newZoom / controllerHost.zoom;
+  controllerHost.zoom = newZoom; // Keep the mouse center when scaling
+
+  pos[0] -= (zoomX - pos[0]) * (zoomScale - 1);
+  pos[1] -= (zoomY - pos[1]) * (zoomScale - 1);
+  scale[0] *= zoomScale;
+  scale[1] *= zoomScale;
+  target.dirty();
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var ATTR = '\0_ec_interaction_mutex';
+function take(zr, resourceKey, userKey) {
+  var store = getStore(zr);
+  store[resourceKey] = userKey;
+}
+function release(zr, resourceKey, userKey) {
+  var store = getStore(zr);
+  var uKey = store[resourceKey];
+
+  if (uKey === userKey) {
+    store[resourceKey] = null;
+  }
+}
+function isTaken(zr, resourceKey) {
+  return !!getStore(zr)[resourceKey];
+}
+
+function getStore(zr) {
+  return zr[ATTR] || (zr[ATTR] = {});
+}
+/**
+ * payload: {
+ *     type: 'takeGlobalCursor',
+ *     key: 'dataZoomSelect', or 'brush', or ...,
+ *         If no userKey, release global cursor.
+ * }
+ */
+
+
+registerAction({
+  type: 'takeGlobalCursor',
+  event: 'globalCursorTaken',
+  update: 'update'
+}, function () {});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+/**
+ * @alias module:echarts/component/helper/RoamController
+ * @constructor
+ * @mixin {module:zrender/mixin/Eventful}
+ *
+ * @param {module:zrender/zrender~ZRender} zr
+ */
+
+function RoamController(zr) {
+  /**
+   * @type {Function}
+   */
+  this.pointerChecker;
+  /**
+   * @type {module:zrender}
+   */
+
+  this._zr = zr;
+  /**
+   * @type {Object}
+   */
+
+  this._opt = {}; // Avoid two roamController bind the same handler
+
+  var bind$$1 = bind;
+  var mousedownHandler = bind$$1(mousedown, this);
+  var mousemoveHandler = bind$$1(mousemove, this);
+  var mouseupHandler = bind$$1(mouseup, this);
+  var mousewheelHandler = bind$$1(mousewheel, this);
+  var pinchHandler = bind$$1(pinch, this);
+  Eventful.call(this);
+  /**
+   * @param {Function} pointerChecker
+   *                   input: x, y
+   *                   output: boolean
+   */
+
+  this.setPointerChecker = function (pointerChecker) {
+    this.pointerChecker = pointerChecker;
+  };
+  /**
+   * Notice: only enable needed types. For example, if 'zoom'
+   * is not needed, 'zoom' should not be enabled, otherwise
+   * default mousewheel behaviour (scroll page) will be disabled.
+   *
+   * @param  {boolean|string} [controlType=true] Specify the control type,
+   *                          which can be null/undefined or true/false
+   *                          or 'pan/move' or 'zoom'/'scale'
+   * @param {Object} [opt]
+   * @param {Object} [opt.zoomOnMouseWheel=true] The value can be: true / false / 'shift' / 'ctrl' / 'alt'.
+   * @param {Object} [opt.moveOnMouseMove=true] The value can be: true / false / 'shift' / 'ctrl' / 'alt'.
+   * @param {Object} [opt.moveOnMouseWheel=false] The value can be: true / false / 'shift' / 'ctrl' / 'alt'.
+   * @param {Object} [opt.preventDefaultMouseMove=true] When pan.
+   */
+
+
+  this.enable = function (controlType, opt) {
+    // Disable previous first
+    this.disable();
+    this._opt = defaults(clone(opt) || {}, {
+      zoomOnMouseWheel: true,
+      moveOnMouseMove: true,
+      // By default, wheel do not trigger move.
+      moveOnMouseWheel: false,
+      preventDefaultMouseMove: true
+    });
+
+    if (controlType == null) {
+      controlType = true;
+    }
+
+    if (controlType === true || controlType === 'move' || controlType === 'pan') {
+      zr.on('mousedown', mousedownHandler);
+      zr.on('mousemove', mousemoveHandler);
+      zr.on('mouseup', mouseupHandler);
+    }
+
+    if (controlType === true || controlType === 'scale' || controlType === 'zoom') {
+      zr.on('mousewheel', mousewheelHandler);
+      zr.on('pinch', pinchHandler);
+    }
+  };
+
+  this.disable = function () {
+    zr.off('mousedown', mousedownHandler);
+    zr.off('mousemove', mousemoveHandler);
+    zr.off('mouseup', mouseupHandler);
+    zr.off('mousewheel', mousewheelHandler);
+    zr.off('pinch', pinchHandler);
+  };
+
+  this.dispose = this.disable;
+
+  this.isDragging = function () {
+    return this._dragging;
+  };
+
+  this.isPinching = function () {
+    return this._pinching;
+  };
+}
+
+mixin(RoamController, Eventful);
+
+function mousedown(e) {
+  if (notLeftMouse(e) || e.target && e.target.draggable) {
+    return;
+  }
+
+  var x = e.offsetX;
+  var y = e.offsetY; // Only check on mosedown, but not mousemove.
+  // Mouse can be out of target when mouse moving.
+
+  if (this.pointerChecker && this.pointerChecker(e, x, y)) {
+    this._x = x;
+    this._y = y;
+    this._dragging = true;
+  }
+}
+
+function mousemove(e) {
+  if (notLeftMouse(e) || !isAvailableBehavior('moveOnMouseMove', e, this._opt) || !this._dragging || e.gestureEvent === 'pinch' || isTaken(this._zr, 'globalPan')) {
+    return;
+  }
+
+  var x = e.offsetX;
+  var y = e.offsetY;
+  var oldX = this._x;
+  var oldY = this._y;
+  var dx = x - oldX;
+  var dy = y - oldY;
+  this._x = x;
+  this._y = y;
+  this._opt.preventDefaultMouseMove && stop(e.event);
+  trigger(this, 'pan', 'moveOnMouseMove', e, {
+    dx: dx,
+    dy: dy,
+    oldX: oldX,
+    oldY: oldY,
+    newX: x,
+    newY: y
+  });
+}
+
+function mouseup(e) {
+  if (!notLeftMouse(e)) {
+    this._dragging = false;
+  }
+}
+
+function mousewheel(e) {
+  var shouldZoom = isAvailableBehavior('zoomOnMouseWheel', e, this._opt);
+  var shouldMove = isAvailableBehavior('moveOnMouseWheel', e, this._opt);
+  var wheelDelta = e.wheelDelta;
+  var absWheelDeltaDelta = Math.abs(wheelDelta);
+  var originX = e.offsetX;
+  var originY = e.offsetY; // wheelDelta maybe -0 in chrome mac.
+
+  if (wheelDelta === 0 || !shouldZoom && !shouldMove) {
+    return;
+  } // If both `shouldZoom` and `shouldMove` is true, trigger
+  // their event both, and the final behavior is determined
+  // by event listener themselves.
+
+
+  if (shouldZoom) {
+    // Convenience:
+    // Mac and VM Windows on Mac: scroll up: zoom out.
+    // Windows: scroll up: zoom in.
+    // FIXME: Should do more test in different environment.
+    // wheelDelta is too complicated in difference nvironment
+    // (https://developer.mozilla.org/en-US/docs/Web/Events/mousewheel),
+    // although it has been normallized by zrender.
+    // wheelDelta of mouse wheel is bigger than touch pad.
+    var factor = absWheelDeltaDelta > 3 ? 1.4 : absWheelDeltaDelta > 1 ? 1.2 : 1.1;
+    var scale = wheelDelta > 0 ? factor : 1 / factor;
+    checkPointerAndTrigger(this, 'zoom', 'zoomOnMouseWheel', e, {
+      scale: scale,
+      originX: originX,
+      originY: originY
+    });
+  }
+
+  if (shouldMove) {
+    // FIXME: Should do more test in different environment.
+    var absDelta = Math.abs(wheelDelta); // wheelDelta of mouse wheel is bigger than touch pad.
+
+    var scrollDelta = (wheelDelta > 0 ? 1 : -1) * (absDelta > 3 ? 0.4 : absDelta > 1 ? 0.15 : 0.05);
+    checkPointerAndTrigger(this, 'scrollMove', 'moveOnMouseWheel', e, {
+      scrollDelta: scrollDelta,
+      originX: originX,
+      originY: originY
+    });
+  }
+}
+
+function pinch(e) {
+  if (isTaken(this._zr, 'globalPan')) {
+    return;
+  }
+
+  var scale = e.pinchScale > 1 ? 1.1 : 1 / 1.1;
+  checkPointerAndTrigger(this, 'zoom', null, e, {
+    scale: scale,
+    originX: e.pinchX,
+    originY: e.pinchY
+  });
+}
+
+function checkPointerAndTrigger(controller, eventName, behaviorToCheck, e, contollerEvent) {
+  if (controller.pointerChecker && controller.pointerChecker(e, contollerEvent.originX, contollerEvent.originY)) {
+    // When mouse is out of roamController rect,
+    // default befavoius should not be be disabled, otherwise
+    // page sliding is disabled, contrary to expectation.
+    stop(e.event);
+    trigger(controller, eventName, behaviorToCheck, e, contollerEvent);
+  }
+}
+
+function trigger(controller, eventName, behaviorToCheck, e, contollerEvent) {
+  // Also provide behavior checker for event listener, for some case that
+  // multiple components share one listener.
+  contollerEvent.isAvailableBehavior = bind(isAvailableBehavior, null, behaviorToCheck, e);
+  controller.trigger(eventName, contollerEvent);
+} // settings: {
+//     zoomOnMouseWheel
+//     moveOnMouseMove
+//     moveOnMouseWheel
+// }
+// The value can be: true / false / 'shift' / 'ctrl' / 'alt'.
+
+
+function isAvailableBehavior(behaviorToCheck, e, settings) {
+  var setting = settings[behaviorToCheck];
+  return !behaviorToCheck || setting && (!isString(setting) || e.event[setting + 'Key']);
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var IRRELEVANT_EXCLUDES = {
+  'axisPointer': 1,
+  'tooltip': 1,
+  'brush': 1
+};
+/**
+ * Avoid that: mouse click on a elements that is over geo or graph,
+ * but roam is triggered.
+ */
+
+function onIrrelevantElement(e, api, targetCoordSysModel) {
+  var model = api.getComponentByElement(e.topTarget); // If model is axisModel, it works only if it is injected with coordinateSystem.
+
+  var coordSys = model && model.coordinateSystem;
+  return model && model !== targetCoordSysModel && !IRRELEVANT_EXCLUDES[model.mainType] && coordSys && coordSys.model !== targetCoordSysModel;
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * @file This file used to draw tree view.
+ * @author Deqing Li(annong035@gmail.com)
+ */
+extendChartView({
+  type: 'tree',
+
+  /**
+   * Init the chart
+   * @override
+   * @param  {module:echarts/model/Global} ecModel
+   * @param  {module:echarts/ExtensionAPI} api
+   */
+  init: function (ecModel, api) {
+    /**
+     * @private
+     * @type {module:echarts/data/Tree}
+     */
+    this._oldTree;
+    /**
+     * @private
+     * @type {module:zrender/container/Group}
+     */
+
+    this._mainGroup = new Group();
+    /**
+     * @private
+     * @type {module:echarts/componet/helper/RoamController}
+     */
+
+    this._controller = new RoamController(api.getZr());
+    this._controllerHost = {
+      target: this.group
+    };
+    this.group.add(this._mainGroup);
+  },
+  render: function (seriesModel, ecModel, api, payload) {
+    var data = seriesModel.getData();
+    var layoutInfo = seriesModel.layoutInfo;
+    var group = this._mainGroup;
+    var layout = seriesModel.get('layout');
+
+    if (layout === 'radial') {
+      group.attr('position', [layoutInfo.x + layoutInfo.width / 2, layoutInfo.y + layoutInfo.height / 2]);
+    } else {
+      group.attr('position', [layoutInfo.x, layoutInfo.y]);
+    }
+
+    this._updateViewCoordSys(seriesModel);
+
+    this._updateController(seriesModel, ecModel, api);
+
+    var oldData = this._data;
+    var seriesScope = {
+      expandAndCollapse: seriesModel.get('expandAndCollapse'),
+      layout: layout,
+      orient: seriesModel.getOrient(),
+      curvature: seriesModel.get('lineStyle.curveness'),
+      symbolRotate: seriesModel.get('symbolRotate'),
+      symbolOffset: seriesModel.get('symbolOffset'),
+      hoverAnimation: seriesModel.get('hoverAnimation'),
+      useNameLabel: true,
+      fadeIn: true
+    };
+    data.diff(oldData).add(function (newIdx) {
+      if (symbolNeedsDraw$1(data, newIdx)) {
+        // Create node and edge
+        updateNode(data, newIdx, null, group, seriesModel, seriesScope);
+      }
+    }).update(function (newIdx, oldIdx) {
+      var symbolEl = oldData.getItemGraphicEl(oldIdx);
+
+      if (!symbolNeedsDraw$1(data, newIdx)) {
+        symbolEl && removeNode(oldData, oldIdx, symbolEl, group, seriesModel, seriesScope);
+        return;
+      } // Update node and edge
+
+
+      updateNode(data, newIdx, symbolEl, group, seriesModel, seriesScope);
+    }).remove(function (oldIdx) {
+      var symbolEl = oldData.getItemGraphicEl(oldIdx); // When remove a collapsed node of subtree, since the collapsed
+      // node haven't been initialized with a symbol element,
+      // you can't found it's symbol element through index.
+      // so if we want to remove the symbol element we should insure
+      // that the symbol element is not null.
+
+      if (symbolEl) {
+        removeNode(oldData, oldIdx, symbolEl, group, seriesModel, seriesScope);
+      }
+    }).execute();
+    this._nodeScaleRatio = seriesModel.get('nodeScaleRatio');
+
+    this._updateNodeAndLinkScale(seriesModel);
+
+    if (seriesScope.expandAndCollapse === true) {
+      data.eachItemGraphicEl(function (el, dataIndex) {
+        el.off('click').on('click', function () {
+          api.dispatchAction({
+            type: 'treeExpandAndCollapse',
+            seriesId: seriesModel.id,
+            dataIndex: dataIndex
+          });
+        });
+      });
+    }
+
+    this._data = data;
+  },
+  _updateViewCoordSys: function (seriesModel) {
+    var data = seriesModel.getData();
+    var points = [];
+    data.each(function (idx) {
+      var layout = data.getItemLayout(idx);
+
+      if (layout && !isNaN(layout.x) && !isNaN(layout.y)) {
+        points.push([+layout.x, +layout.y]);
+      }
+    });
+    var min = [];
+    var max = [];
+    fromPoints(points, min, max); // If width or height is 0
+
+    if (max[0] - min[0] === 0) {
+      max[0] += 1;
+      min[0] -= 1;
+    }
+
+    if (max[1] - min[1] === 0) {
+      max[1] += 1;
+      min[1] -= 1;
+    }
+
+    var viewCoordSys = seriesModel.coordinateSystem = new View();
+    viewCoordSys.zoomLimit = seriesModel.get('scaleLimit');
+    viewCoordSys.setBoundingRect(min[0], min[1], max[0] - min[0], max[1] - min[1]);
+    viewCoordSys.setCenter(seriesModel.get('center'));
+    viewCoordSys.setZoom(seriesModel.get('zoom')); // Here we use viewCoordSys just for computing the 'position' and 'scale' of the group
+
+    this.group.attr({
+      position: viewCoordSys.position,
+      scale: viewCoordSys.scale
+    });
+    this._viewCoordSys = viewCoordSys;
+  },
+  _updateController: function (seriesModel, ecModel, api) {
+    var controller = this._controller;
+    var controllerHost = this._controllerHost;
+    var group = this.group;
+    controller.setPointerChecker(function (e, x, y) {
+      var rect = group.getBoundingRect();
+      rect.applyTransform(group.transform);
+      return rect.contain(x, y) && !onIrrelevantElement(e, api, seriesModel);
+    });
+    controller.enable(seriesModel.get('roam'));
+    controllerHost.zoomLimit = seriesModel.get('scaleLimit');
+    controllerHost.zoom = seriesModel.coordinateSystem.getZoom();
+    controller.off('pan').off('zoom').on('pan', function (e) {
+      updateViewOnPan(controllerHost, e.dx, e.dy);
+      api.dispatchAction({
+        seriesId: seriesModel.id,
+        type: 'treeRoam',
+        dx: e.dx,
+        dy: e.dy
+      });
+    }, this).on('zoom', function (e) {
+      updateViewOnZoom(controllerHost, e.scale, e.originX, e.originY);
+      api.dispatchAction({
+        seriesId: seriesModel.id,
+        type: 'treeRoam',
+        zoom: e.scale,
+        originX: e.originX,
+        originY: e.originY
+      });
+
+      this._updateNodeAndLinkScale(seriesModel);
+    }, this);
+  },
+  _updateNodeAndLinkScale: function (seriesModel) {
+    var data = seriesModel.getData();
+
+    var nodeScale = this._getNodeGlobalScale(seriesModel);
+
+    var invScale = [nodeScale, nodeScale];
+    data.eachItemGraphicEl(function (el, idx) {
+      el.attr('scale', invScale);
+    });
+  },
+  _getNodeGlobalScale: function (seriesModel) {
+    var coordSys = seriesModel.coordinateSystem;
+
+    if (coordSys.type !== 'view') {
+      return 1;
+    }
+
+    var nodeScaleRatio = this._nodeScaleRatio;
+    var groupScale = coordSys.scale;
+    var groupZoom = groupScale && groupScale[0] || 1; // Scale node when zoom changes
+
+    var roamZoom = coordSys.getZoom();
+    var nodeScale = (roamZoom - 1) * nodeScaleRatio + 1;
+    return nodeScale / groupZoom;
+  },
+  dispose: function () {
+    this._controller && this._controller.dispose();
+    this._controllerHost = {};
+  },
+  remove: function () {
+    this._mainGroup.removeAll();
+
+    this._data = null;
+  }
+});
+
+function symbolNeedsDraw$1(data, dataIndex) {
+  var layout = data.getItemLayout(dataIndex);
+  return layout && !isNaN(layout.x) && !isNaN(layout.y) && data.getItemVisual(dataIndex, 'symbol') !== 'none';
+}
+
+function getTreeNodeStyle(node, itemModel, seriesScope) {
+  seriesScope.itemModel = itemModel;
+  seriesScope.itemStyle = itemModel.getModel('itemStyle').getItemStyle();
+  seriesScope.hoverItemStyle = itemModel.getModel('emphasis.itemStyle').getItemStyle();
+  seriesScope.lineStyle = itemModel.getModel('lineStyle').getLineStyle();
+  seriesScope.labelModel = itemModel.getModel('label');
+  seriesScope.hoverLabelModel = itemModel.getModel('emphasis.label');
+
+  if (node.isExpand === false && node.children.length !== 0) {
+    seriesScope.symbolInnerColor = seriesScope.itemStyle.fill;
+  } else {
+    seriesScope.symbolInnerColor = '#fff';
+  }
+
+  return seriesScope;
+}
+
+function updateNode(data, dataIndex, symbolEl, group, seriesModel, seriesScope) {
+  var isInit = !symbolEl;
+  var node = data.tree.getNodeByDataIndex(dataIndex);
+  var itemModel = node.getModel();
+  var seriesScope = getTreeNodeStyle(node, itemModel, seriesScope);
+  var virtualRoot = data.tree.root;
+  var source = node.parentNode === virtualRoot ? node : node.parentNode || node;
+  var sourceSymbolEl = data.getItemGraphicEl(source.dataIndex);
+  var sourceLayout = source.getLayout();
+  var sourceOldLayout = sourceSymbolEl ? {
+    x: sourceSymbolEl.position[0],
+    y: sourceSymbolEl.position[1],
+    rawX: sourceSymbolEl.__radialOldRawX,
+    rawY: sourceSymbolEl.__radialOldRawY
+  } : sourceLayout;
+  var targetLayout = node.getLayout();
+
+  if (isInit) {
+    symbolEl = new SymbolClz$1(data, dataIndex, seriesScope);
+    symbolEl.attr('position', [sourceOldLayout.x, sourceOldLayout.y]);
+  } else {
+    symbolEl.updateData(data, dataIndex, seriesScope);
+  }
+
+  symbolEl.__radialOldRawX = symbolEl.__radialRawX;
+  symbolEl.__radialOldRawY = symbolEl.__radialRawY;
+  symbolEl.__radialRawX = targetLayout.rawX;
+  symbolEl.__radialRawY = targetLayout.rawY;
+  group.add(symbolEl);
+  data.setItemGraphicEl(dataIndex, symbolEl);
+  updateProps(symbolEl, {
+    position: [targetLayout.x, targetLayout.y]
+  }, seriesModel);
+  var symbolPath = symbolEl.getSymbolPath();
+
+  if (seriesScope.layout === 'radial') {
+    var realRoot = virtualRoot.children[0];
+    var rootLayout = realRoot.getLayout();
+    var length = realRoot.children.length;
+    var rad;
+    var isLeft;
+
+    if (targetLayout.x === rootLayout.x && node.isExpand === true) {
+      var center = {};
+      center.x = (realRoot.children[0].getLayout().x + realRoot.children[length - 1].getLayout().x) / 2;
+      center.y = (realRoot.children[0].getLayout().y + realRoot.children[length - 1].getLayout().y) / 2;
+      rad = Math.atan2(center.y - rootLayout.y, center.x - rootLayout.x);
+
+      if (rad < 0) {
+        rad = Math.PI * 2 + rad;
+      }
+
+      isLeft = center.x < rootLayout.x;
+
+      if (isLeft) {
+        rad = rad - Math.PI;
+      }
+    } else {
+      rad = Math.atan2(targetLayout.y - rootLayout.y, targetLayout.x - rootLayout.x);
+
+      if (rad < 0) {
+        rad = Math.PI * 2 + rad;
+      }
+
+      if (node.children.length === 0 || node.children.length !== 0 && node.isExpand === false) {
+        isLeft = targetLayout.x < rootLayout.x;
+
+        if (isLeft) {
+          rad = rad - Math.PI;
+        }
+      } else {
+        isLeft = targetLayout.x > rootLayout.x;
+
+        if (!isLeft) {
+          rad = rad - Math.PI;
+        }
+      }
+    }
+
+    var textPosition = isLeft ? 'left' : 'right';
+    symbolPath.setStyle({
+      textPosition: textPosition,
+      textRotation: -rad,
+      textOrigin: 'center',
+      verticalAlign: 'middle'
+    });
+  }
+
+  if (node.parentNode && node.parentNode !== virtualRoot) {
+    var edge = symbolEl.__edge;
+
+    if (!edge) {
+      edge = symbolEl.__edge = new BezierCurve({
+        shape: getEdgeShape(seriesScope, sourceOldLayout, sourceOldLayout),
+        style: defaults({
+          opacity: 0,
+          strokeNoScale: true
+        }, seriesScope.lineStyle)
+      });
+    }
+
+    updateProps(edge, {
+      shape: getEdgeShape(seriesScope, sourceLayout, targetLayout),
+      style: {
+        opacity: 1
+      }
+    }, seriesModel);
+    group.add(edge);
+  }
+}
+
+function removeNode(data, dataIndex, symbolEl, group, seriesModel, seriesScope) {
+  var node = data.tree.getNodeByDataIndex(dataIndex);
+  var virtualRoot = data.tree.root;
+  var itemModel = node.getModel();
+  var seriesScope = getTreeNodeStyle(node, itemModel, seriesScope);
+  var source = node.parentNode === virtualRoot ? node : node.parentNode || node;
+  var sourceLayout;
+
+  while (sourceLayout = source.getLayout(), sourceLayout == null) {
+    source = source.parentNode === virtualRoot ? source : source.parentNode || source;
+  }
+
+  updateProps(symbolEl, {
+    position: [sourceLayout.x + 1, sourceLayout.y + 1]
+  }, seriesModel, function () {
+    group.remove(symbolEl);
+    data.setItemGraphicEl(dataIndex, null);
+  });
+  symbolEl.fadeOut(null, {
+    keepLabel: true
+  });
+  var edge = symbolEl.__edge;
+
+  if (edge) {
+    updateProps(edge, {
+      shape: getEdgeShape(seriesScope, sourceLayout, sourceLayout),
+      style: {
+        opacity: 0
+      }
+    }, seriesModel, function () {
+      group.remove(edge);
+    });
+  }
+}
+
+function getEdgeShape(seriesScope, sourceLayout, targetLayout) {
+  var cpx1;
+  var cpy1;
+  var cpx2;
+  var cpy2;
+  var orient = seriesScope.orient;
+  var x1;
+  var x2;
+  var y1;
+  var y2;
+
+  if (seriesScope.layout === 'radial') {
+    x1 = sourceLayout.rawX;
+    y1 = sourceLayout.rawY;
+    x2 = targetLayout.rawX;
+    y2 = targetLayout.rawY;
+    var radialCoor1 = radialCoordinate(x1, y1);
+    var radialCoor2 = radialCoordinate(x1, y1 + (y2 - y1) * seriesScope.curvature);
+    var radialCoor3 = radialCoordinate(x2, y2 + (y1 - y2) * seriesScope.curvature);
+    var radialCoor4 = radialCoordinate(x2, y2);
+    return {
+      x1: radialCoor1.x,
+      y1: radialCoor1.y,
+      x2: radialCoor4.x,
+      y2: radialCoor4.y,
+      cpx1: radialCoor2.x,
+      cpy1: radialCoor2.y,
+      cpx2: radialCoor3.x,
+      cpy2: radialCoor3.y
+    };
+  } else {
+    x1 = sourceLayout.x;
+    y1 = sourceLayout.y;
+    x2 = targetLayout.x;
+    y2 = targetLayout.y;
+
+    if (orient === 'LR' || orient === 'RL') {
+      cpx1 = x1 + (x2 - x1) * seriesScope.curvature;
+      cpy1 = y1;
+      cpx2 = x2 + (x1 - x2) * seriesScope.curvature;
+      cpy2 = y2;
+    }
+
+    if (orient === 'TB' || orient === 'BT') {
+      cpx1 = x1;
+      cpy1 = y1 + (y2 - y1) * seriesScope.curvature;
+      cpx2 = x2;
+      cpy2 = y2 + (y1 - y2) * seriesScope.curvature;
+    }
+  }
+
+  return {
+    x1: x1,
+    y1: y1,
+    x2: x2,
+    y2: y2,
+    cpx1: cpx1,
+    cpy1: cpy1,
+    cpx2: cpx2,
+    cpy2: cpy2
+  };
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * @param {module:echarts/coord/View} view
+ * @param {Object} payload
+ * @param {Object} [zoomLimit]
+ */
+function updateCenterAndZoom(view, payload, zoomLimit) {
+  var previousZoom = view.getZoom();
+  var center = view.getCenter();
+  var zoom = payload.zoom;
+  var point = view.dataToPoint(center);
+
+  if (payload.dx != null && payload.dy != null) {
+    point[0] -= payload.dx;
+    point[1] -= payload.dy;
+    var center = view.pointToData(point);
+    view.setCenter(center);
+  }
+
+  if (zoom != null) {
+    if (zoomLimit) {
+      var zoomMin = zoomLimit.min || 0;
+      var zoomMax = zoomLimit.max || Infinity;
+      zoom = Math.max(Math.min(previousZoom * zoom, zoomMax), zoomMin) / previousZoom;
+    } // Zoom on given point(originX, originY)
+
+
+    view.scale[0] *= zoom;
+    view.scale[1] *= zoom;
+    var position = view.position;
+    var fixX = (payload.originX - position[0]) * (zoom - 1);
+    var fixY = (payload.originY - position[1]) * (zoom - 1);
+    position[0] -= fixX;
+    position[1] -= fixY;
+    view.updateTransform(); // Get the new center
+
+    var center = view.pointToData(point);
+    view.setCenter(center);
+    view.setZoom(zoom * previousZoom);
+  }
+
+  return {
+    center: view.getCenter(),
+    zoom: view.getZoom()
+  };
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * @file Register the actions of the tree
+ * @author Deqing Li(annong035@gmail.com)
+ */
+registerAction({
+  type: 'treeExpandAndCollapse',
+  event: 'treeExpandAndCollapse',
+  update: 'update'
+}, function (payload, ecModel) {
+  ecModel.eachComponent({
+    mainType: 'series',
+    subType: 'tree',
+    query: payload
+  }, function (seriesModel) {
+    var dataIndex = payload.dataIndex;
+    var tree = seriesModel.getData().tree;
+    var node = tree.getNodeByDataIndex(dataIndex);
+    node.isExpand = !node.isExpand;
+  });
+});
+registerAction({
+  type: 'treeRoam',
+  event: 'treeRoam',
+  // Here we set 'none' instead of 'update', because roam action
+  // just need to update the transform matrix without having to recalculate
+  // the layout. So don't need to go through the whole update process, such
+  // as 'dataPrcocess', 'coordSystemUpdate', 'layout' and so on.
+  update: 'none'
+}, function (payload, ecModel) {
+  ecModel.eachComponent({
+    mainType: 'series',
+    subType: 'tree',
+    query: payload
+  }, function (seriesModel) {
+    var coordSys = seriesModel.coordinateSystem;
+    var res = updateCenterAndZoom(coordSys, payload);
+    seriesModel.setCenter && seriesModel.setCenter(res.center);
+    seriesModel.setZoom && seriesModel.setZoom(res.zoom);
+  });
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * Traverse the tree from bottom to top and do something
+ * @param  {module:echarts/data/Tree~TreeNode} root  The real root of the tree
+ * @param  {Function} callback
+ */
+function eachAfter(root, callback, separation) {
+  var nodes = [root];
+  var next = [];
+  var node;
+
+  while (node = nodes.pop()) {
+    // jshint ignore:line
+    next.push(node);
+
+    if (node.isExpand) {
+      var children = node.children;
+
+      if (children.length) {
+        for (var i = 0; i < children.length; i++) {
+          nodes.push(children[i]);
+        }
+      }
+    }
+  }
+
+  while (node = next.pop()) {
+    // jshint ignore:line
+    callback(node, separation);
+  }
+}
+/**
+ * Traverse the tree from top to bottom and do something
+ * @param  {module:echarts/data/Tree~TreeNode} root  The real root of the tree
+ * @param  {Function} callback
+ */
+
+
+function eachBefore(root, callback) {
+  var nodes = [root];
+  var node;
+
+  while (node = nodes.pop()) {
+    // jshint ignore:line
+    callback(node);
+
+    if (node.isExpand) {
+      var children = node.children;
+
+      if (children.length) {
+        for (var i = children.length - 1; i >= 0; i--) {
+          nodes.push(children[i]);
+        }
+      }
+    }
+  }
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var treeLayout = function (ecModel, api) {
+  ecModel.eachSeriesByType('tree', function (seriesModel) {
+    commonLayout(seriesModel, api);
+  });
+};
+
+function commonLayout(seriesModel, api) {
+  var layoutInfo = getViewRect(seriesModel, api);
+  seriesModel.layoutInfo = layoutInfo;
+  var layout = seriesModel.get('layout');
+  var width = 0;
+  var height = 0;
+  var separation$$1 = null;
+
+  if (layout === 'radial') {
+    width = 2 * Math.PI;
+    height = Math.min(layoutInfo.height, layoutInfo.width) / 2;
+    separation$$1 = separation(function (node1, node2) {
+      return (node1.parentNode === node2.parentNode ? 1 : 2) / node1.depth;
+    });
+  } else {
+    width = layoutInfo.width;
+    height = layoutInfo.height;
+    separation$$1 = separation();
+  }
+
+  var virtualRoot = seriesModel.getData().tree.root;
+  var realRoot = virtualRoot.children[0];
+
+  if (realRoot) {
+    init$2(virtualRoot);
+    eachAfter(realRoot, firstWalk, separation$$1);
+    virtualRoot.hierNode.modifier = -realRoot.hierNode.prelim;
+    eachBefore(realRoot, secondWalk);
+    var left = realRoot;
+    var right = realRoot;
+    var bottom = realRoot;
+    eachBefore(realRoot, function (node) {
+      var x = node.getLayout().x;
+
+      if (x < left.getLayout().x) {
+        left = node;
+      }
+
+      if (x > right.getLayout().x) {
+        right = node;
+      }
+
+      if (node.depth > bottom.depth) {
+        bottom = node;
+      }
+    });
+    var delta = left === right ? 1 : separation$$1(left, right) / 2;
+    var tx = delta - left.getLayout().x;
+    var kx = 0;
+    var ky = 0;
+    var coorX = 0;
+    var coorY = 0;
+
+    if (layout === 'radial') {
+      kx = width / (right.getLayout().x + delta + tx); // here we use (node.depth - 1), bucause the real root's depth is 1
+
+      ky = height / (bottom.depth - 1 || 1);
+      eachBefore(realRoot, function (node) {
+        coorX = (node.getLayout().x + tx) * kx;
+        coorY = (node.depth - 1) * ky;
+        var finalCoor = radialCoordinate(coorX, coorY);
+        node.setLayout({
+          x: finalCoor.x,
+          y: finalCoor.y,
+          rawX: coorX,
+          rawY: coorY
+        }, true);
+      });
+    } else {
+      var orient = seriesModel.getOrient();
+
+      if (orient === 'RL' || orient === 'LR') {
+        ky = height / (right.getLayout().x + delta + tx);
+        kx = width / (bottom.depth - 1 || 1);
+        eachBefore(realRoot, function (node) {
+          coorY = (node.getLayout().x + tx) * ky;
+          coorX = orient === 'LR' ? (node.depth - 1) * kx : width - (node.depth - 1) * kx;
+          node.setLayout({
+            x: coorX,
+            y: coorY
+          }, true);
+        });
+      } else if (orient === 'TB' || orient === 'BT') {
+        kx = width / (right.getLayout().x + delta + tx);
+        ky = height / (bottom.depth - 1 || 1);
+        eachBefore(realRoot, function (node) {
+          coorX = (node.getLayout().x + tx) * kx;
+          coorY = orient === 'TB' ? (node.depth - 1) * ky : height - (node.depth - 1) * ky;
+          node.setLayout({
+            x: coorX,
+            y: coorY
+          }, true);
+        });
+      }
+    }
+  }
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+registerVisual(visualSymbol('tree', 'circle'));
+registerLayout(treeLayout);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+function retrieveTargetInfo(payload, validPayloadTypes, seriesModel) {
+  if (payload && indexOf(validPayloadTypes, payload.type) >= 0) {
+    var root = seriesModel.getData().tree.root;
+    var targetNode = payload.targetNode;
+
+    if (typeof targetNode === 'string') {
+      targetNode = root.getNodeById(targetNode);
+    }
+
+    if (targetNode && root.contains(targetNode)) {
+      return {
+        node: targetNode
+      };
+    }
+
+    var targetNodeId = payload.targetNodeId;
+
+    if (targetNodeId != null && (targetNode = root.getNodeById(targetNodeId))) {
+      return {
+        node: targetNode
+      };
+    }
+  }
+} // Not includes the given node at the last item.
+
+function getPathToRoot(node) {
+  var path = [];
+
+  while (node) {
+    node = node.parentNode;
+    node && path.push(node);
+  }
+
+  return path.reverse();
+}
+function aboveViewRoot(viewRoot, node) {
+  var viewPath = getPathToRoot(viewRoot);
+  return indexOf(viewPath, node) >= 0;
+} // From root to the input node (the input node will be included).
+
+function wrapTreePathInfo(node, seriesModel) {
+  var treePathInfo = [];
+
+  while (node) {
+    var nodeDataIndex = node.dataIndex;
+    treePathInfo.push({
+      name: node.name,
+      dataIndex: nodeDataIndex,
+      value: seriesModel.getRawValue(nodeDataIndex)
+    });
+    node = node.parentNode;
+  }
+
+  treePathInfo.reverse();
+  return treePathInfo;
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+SeriesModel.extend({
+  type: 'series.treemap',
+  layoutMode: 'box',
+  dependencies: ['grid', 'polar'],
+
+  /**
+   * @type {module:echarts/data/Tree~Node}
+   */
+  _viewRoot: null,
+  defaultOption: {
+    // Disable progressive rendering
+    progressive: 0,
+    hoverLayerThreshold: Infinity,
+    // center: ['50%', '50%'],          // not supported in ec3.
+    // size: ['80%', '80%'],            // deprecated, compatible with ec2.
+    left: 'center',
+    top: 'middle',
+    right: null,
+    bottom: null,
+    width: '80%',
+    height: '80%',
+    sort: true,
+    // Can be null or false or true
+    // (order by desc default, asc not supported yet (strange effect))
+    clipWindow: 'origin',
+    // Size of clipped window when zooming. 'origin' or 'fullscreen'
+    squareRatio: 0.5 * (1 + Math.sqrt(5)),
+    // golden ratio
+    leafDepth: null,
+    // Nodes on depth from root are regarded as leaves.
+    // Count from zero (zero represents only view root).
+    drillDownIcon: '鈻�',
+    // Use html character temporarily because it is complicated
+    // to align specialized icon. 鈻封柖鉂掆潗鈻尖湚
+    zoomToNodeRatio: 0.32 * 0.32,
+    // Be effective when using zoomToNode. Specify the proportion of the
+    // target node area in the view area.
+    roam: true,
+    // true, false, 'scale' or 'zoom', 'move'.
+    nodeClick: 'zoomToNode',
+    // Leaf node click behaviour: 'zoomToNode', 'link', false.
+    // If leafDepth is set and clicking a node which has children but
+    // be on left depth, the behaviour would be changing root. Otherwise
+    // use behavious defined above.
+    animation: true,
+    animationDurationUpdate: 900,
+    animationEasing: 'quinticInOut',
+    breadcrumb: {
+      show: true,
+      height: 22,
+      left: 'center',
+      top: 'bottom',
+      // right
+      // bottom
+      emptyItemWidth: 25,
+      // Width of empty node.
+      itemStyle: {
+        color: 'rgba(0,0,0,0.7)',
+        //'#5793f3',
+        borderColor: 'rgba(255,255,255,0.7)',
+        borderWidth: 1,
+        shadowColor: 'rgba(150,150,150,1)',
+        shadowBlur: 3,
+        shadowOffsetX: 0,
+        shadowOffsetY: 0,
+        textStyle: {
+          color: '#fff'
+        }
+      },
+      emphasis: {
+        textStyle: {}
+      }
+    },
+    label: {
+      show: true,
+      // Do not use textDistance, for ellipsis rect just the same as treemap node rect.
+      distance: 0,
+      padding: 5,
+      position: 'inside',
+      // Can be [5, '5%'] or position stirng like 'insideTopLeft', ...
+      // formatter: null,
+      color: '#fff',
+      ellipsis: true // align
+      // verticalAlign
+
+    },
+    upperLabel: {
+      // Label when node is parent.
+      show: false,
+      position: [0, '50%'],
+      height: 20,
+      // formatter: null,
+      color: '#fff',
+      ellipsis: true,
+      // align: null,
+      verticalAlign: 'middle'
+    },
+    itemStyle: {
+      color: null,
+      // Can be 'none' if not necessary.
+      colorAlpha: null,
+      // Can be 'none' if not necessary.
+      colorSaturation: null,
+      // Can be 'none' if not necessary.
+      borderWidth: 0,
+      gapWidth: 0,
+      borderColor: '#fff',
+      borderColorSaturation: null // If specified, borderColor will be ineffective, and the
+      // border color is evaluated by color of current node and
+      // borderColorSaturation.
+
+    },
+    emphasis: {
+      upperLabel: {
+        show: true,
+        position: [0, '50%'],
+        color: '#fff',
+        ellipsis: true,
+        verticalAlign: 'middle'
+      }
+    },
+    visualDimension: 0,
+    // Can be 0, 1, 2, 3.
+    visualMin: null,
+    visualMax: null,
+    color: [],
+    // + treemapSeries.color should not be modified. Please only modified
+    // level[n].color (if necessary).
+    // + Specify color list of each level. level[0].color would be global
+    // color list if not specified. (see method `setDefault`).
+    // + But set as a empty array to forbid fetch color from global palette
+    // when using nodeModel.get('color'), otherwise nodes on deep level
+    // will always has color palette set and are not able to inherit color
+    // from parent node.
+    // + TreemapSeries.color can not be set as 'none', otherwise effect
+    // legend color fetching (see seriesColor.js).
+    colorAlpha: null,
+    // Array. Specify color alpha range of each level, like [0.2, 0.8]
+    colorSaturation: null,
+    // Array. Specify color saturation of each level, like [0.2, 0.5]
+    colorMappingBy: 'index',
+    // 'value' or 'index' or 'id'.
+    visibleMin: 10,
+    // If area less than this threshold (unit: pixel^2), node will not
+    // be rendered. Only works when sort is 'asc' or 'desc'.
+    childrenVisibleMin: null,
+    // If area of a node less than this threshold (unit: pixel^2),
+    // grandchildren will not show.
+    // Why grandchildren? If not grandchildren but children,
+    // some siblings show children and some not,
+    // the appearance may be mess and not consistent,
+    levels: [] // Each item: {
+    //     visibleMin, itemStyle, visualDimension, label
+    // }
+    // data: {
+    //      value: [],
+    //      children: [],
+    //      link: 'http://xxx.xxx.xxx',
+    //      target: 'blank' or 'self'
+    // }
+
+  },
+
+  /**
+   * @override
+   */
+  getInitialData: function (option, ecModel) {
+    // Create a virtual root.
+    var root = {
+      name: option.name,
+      children: option.data
+    };
+    completeTreeValue(root);
+    var levels = option.levels || [];
+    levels = option.levels = setDefault(levels, ecModel);
+    var treeOption = {};
+    treeOption.levels = levels; // Make sure always a new tree is created when setOption,
+    // in TreemapView, we check whether oldTree === newTree
+    // to choose mappings approach among old shapes and new shapes.
+
+    return Tree.createTree(root, this, treeOption).data;
+  },
+  optionUpdated: function () {
+    this.resetViewRoot();
+  },
+
+  /**
+   * @override
+   * @param {number} dataIndex
+   * @param {boolean} [mutipleSeries=false]
+   */
+  formatTooltip: function (dataIndex) {
+    var data = this.getData();
+    var value = this.getRawValue(dataIndex);
+    var formattedValue = isArray(value) ? addCommas(value[0]) : addCommas(value);
+    var name = data.getName(dataIndex);
+    return encodeHTML(name + ': ' + formattedValue);
+  },
+
+  /**
+   * Add tree path to tooltip param
+   *
+   * @override
+   * @param {number} dataIndex
+   * @return {Object}
+   */
+  getDataParams: function (dataIndex) {
+    var params = SeriesModel.prototype.getDataParams.apply(this, arguments);
+    var node = this.getData().tree.getNodeByDataIndex(dataIndex);
+    params.treePathInfo = wrapTreePathInfo(node, this);
+    return params;
+  },
+
+  /**
+   * @public
+   * @param {Object} layoutInfo {
+   *                                x: containerGroup x
+   *                                y: containerGroup y
+   *                                width: containerGroup width
+   *                                height: containerGroup height
+   *                            }
+   */
+  setLayoutInfo: function (layoutInfo) {
+    /**
+     * @readOnly
+     * @type {Object}
+     */
+    this.layoutInfo = this.layoutInfo || {};
+    extend(this.layoutInfo, layoutInfo);
+  },
+
+  /**
+   * @param  {string} id
+   * @return {number} index
+   */
+  mapIdToIndex: function (id) {
+    // A feature is implemented:
+    // index is monotone increasing with the sequence of
+    // input id at the first time.
+    // This feature can make sure that each data item and its
+    // mapped color have the same index between data list and
+    // color list at the beginning, which is useful for user
+    // to adjust data-color mapping.
+
+    /**
+     * @private
+     * @type {Object}
+     */
+    var idIndexMap = this._idIndexMap;
+
+    if (!idIndexMap) {
+      idIndexMap = this._idIndexMap = createHashMap();
+      /**
+       * @private
+       * @type {number}
+       */
+
+      this._idIndexMapCount = 0;
+    }
+
+    var index = idIndexMap.get(id);
+
+    if (index == null) {
+      idIndexMap.set(id, index = this._idIndexMapCount++);
+    }
+
+    return index;
+  },
+  getViewRoot: function () {
+    return this._viewRoot;
+  },
+
+  /**
+   * @param {module:echarts/data/Tree~Node} [viewRoot]
+   */
+  resetViewRoot: function (viewRoot) {
+    viewRoot ? this._viewRoot = viewRoot : viewRoot = this._viewRoot;
+    var root = this.getRawData().tree.root;
+
+    if (!viewRoot || viewRoot !== root && !root.contains(viewRoot)) {
+      this._viewRoot = root;
+    }
+  }
+});
+/**
+ * @param {Object} dataNode
+ */
+
+function completeTreeValue(dataNode) {
+  // Postorder travel tree.
+  // If value of none-leaf node is not set,
+  // calculate it by suming up the value of all children.
+  var sum = 0;
+  each$1(dataNode.children, function (child) {
+    completeTreeValue(child);
+    var childValue = child.value;
+    isArray(childValue) && (childValue = childValue[0]);
+    sum += childValue;
+  });
+  var thisValue = dataNode.value;
+
+  if (isArray(thisValue)) {
+    thisValue = thisValue[0];
+  }
+
+  if (thisValue == null || isNaN(thisValue)) {
+    thisValue = sum;
+  } // Value should not less than 0.
+
+
+  if (thisValue < 0) {
+    thisValue = 0;
+  }
+
+  isArray(dataNode.value) ? dataNode.value[0] = thisValue : dataNode.value = thisValue;
+}
+/**
+ * set default to level configuration
+ */
+
+
+function setDefault(levels, ecModel) {
+  var globalColorList = ecModel.get('color');
+
+  if (!globalColorList) {
+    return;
+  }
+
+  levels = levels || [];
+  var hasColorDefine;
+  each$1(levels, function (levelDefine) {
+    var model = new Model(levelDefine);
+    var modelColor = model.get('color');
+
+    if (model.get('itemStyle.color') || modelColor && modelColor !== 'none') {
+      hasColorDefine = true;
+    }
+  });
+
+  if (!hasColorDefine) {
+    var level0 = levels[0] || (levels[0] = {});
+    level0.color = globalColorList.slice();
+  }
+
+  return levels;
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var TEXT_PADDING = 8;
+var ITEM_GAP = 8;
+var ARRAY_LENGTH = 5;
+
+function Breadcrumb(containerGroup) {
+  /**
+   * @private
+   * @type {module:zrender/container/Group}
+   */
+  this.group = new Group();
+  containerGroup.add(this.group);
+}
+
+Breadcrumb.prototype = {
+  constructor: Breadcrumb,
+  render: function (seriesModel, api, targetNode, onSelect) {
+    var model = seriesModel.getModel('breadcrumb');
+    var thisGroup = this.group;
+    thisGroup.removeAll();
+
+    if (!model.get('show') || !targetNode) {
+      return;
+    }
+
+    var normalStyleModel = model.getModel('itemStyle'); // var emphasisStyleModel = model.getModel('emphasis.itemStyle');
+
+    var textStyleModel = normalStyleModel.getModel('textStyle');
+    var layoutParam = {
+      pos: {
+        left: model.get('left'),
+        right: model.get('right'),
+        top: model.get('top'),
+        bottom: model.get('bottom')
+      },
+      box: {
+        width: api.getWidth(),
+        height: api.getHeight()
+      },
+      emptyItemWidth: model.get('emptyItemWidth'),
+      totalWidth: 0,
+      renderList: []
+    };
+
+    this._prepare(targetNode, layoutParam, textStyleModel);
+
+    this._renderContent(seriesModel, layoutParam, normalStyleModel, textStyleModel, onSelect);
+
+    positionElement(thisGroup, layoutParam.pos, layoutParam.box);
+  },
+
+  /**
+   * Prepare render list and total width
+   * @private
+   */
+  _prepare: function (targetNode, layoutParam, textStyleModel) {
+    for (var node = targetNode; node; node = node.parentNode) {
+      var text = node.getModel().get('name');
+      var textRect = textStyleModel.getTextRect(text);
+      var itemWidth = Math.max(textRect.width + TEXT_PADDING * 2, layoutParam.emptyItemWidth);
+      layoutParam.totalWidth += itemWidth + ITEM_GAP;
+      layoutParam.renderList.push({
+        node: node,
+        text: text,
+        width: itemWidth
+      });
+    }
+  },
+
+  /**
+   * @private
+   */
+  _renderContent: function (seriesModel, layoutParam, normalStyleModel, textStyleModel, onSelect) {
+    // Start rendering.
+    var lastX = 0;
+    var emptyItemWidth = layoutParam.emptyItemWidth;
+    var height = seriesModel.get('breadcrumb.height');
+    var availableSize = getAvailableSize(layoutParam.pos, layoutParam.box);
+    var totalWidth = layoutParam.totalWidth;
+    var renderList = layoutParam.renderList;
+
+    for (var i = renderList.length - 1; i >= 0; i--) {
+      var item = renderList[i];
+      var itemNode = item.node;
+      var itemWidth = item.width;
+      var text = item.text; // Hdie text and shorten width if necessary.
+
+      if (totalWidth > availableSize.width) {
+        totalWidth -= itemWidth - emptyItemWidth;
+        itemWidth = emptyItemWidth;
+        text = null;
+      }
+
+      var el = new Polygon({
+        shape: {
+          points: makeItemPoints(lastX, 0, itemWidth, height, i === renderList.length - 1, i === 0)
+        },
+        style: defaults(normalStyleModel.getItemStyle(), {
+          lineJoin: 'bevel',
+          text: text,
+          textFill: textStyleModel.getTextColor(),
+          textFont: textStyleModel.getFont()
+        }),
+        z: 10,
+        onclick: curry(onSelect, itemNode)
+      });
+      this.group.add(el);
+      packEventData(el, seriesModel, itemNode);
+      lastX += itemWidth + ITEM_GAP;
+    }
+  },
+
+  /**
+   * @override
+   */
+  remove: function () {
+    this.group.removeAll();
+  }
+};
+
+function makeItemPoints(x, y, itemWidth, itemHeight, head, tail) {
+  var points = [[head ? x : x - ARRAY_LENGTH, y], [x + itemWidth, y], [x + itemWidth, y + itemHeight], [head ? x : x - ARRAY_LENGTH, y + itemHeight]];
+  !tail && points.splice(2, 0, [x + itemWidth + ARRAY_LENGTH, y + itemHeight / 2]);
+  !head && points.push([x, y + itemHeight / 2]);
+  return points;
+} // Package custom mouse event.
+
+
+function packEventData(el, seriesModel, itemNode) {
+  el.eventData = {
+    componentType: 'series',
+    componentSubType: 'treemap',
+    componentIndex: seriesModel.componentIndex,
+    seriesIndex: seriesModel.componentIndex,
+    seriesName: seriesModel.name,
+    seriesType: 'treemap',
+    selfType: 'breadcrumb',
+    // Distinguish with click event on treemap node.
+    nodeData: {
+      dataIndex: itemNode && itemNode.dataIndex,
+      name: itemNode && itemNode.name
+    },
+    treePathInfo: itemNode && wrapTreePathInfo(itemNode, seriesModel)
+  };
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+/**
+ * @param {number} [time=500] Time in ms
+ * @param {string} [easing='linear']
+ * @param {number} [delay=0]
+ * @param {Function} [callback]
+ *
+ * @example
+ *  // Animate position
+ *  animation
+ *      .createWrap()
+ *      .add(el1, {position: [10, 10]})
+ *      .add(el2, {shape: {width: 500}, style: {fill: 'red'}}, 400)
+ *      .done(function () { // done })
+ *      .start('cubicOut');
+ */
+
+function createWrap() {
+  var storage = [];
+  var elExistsMap = {};
+  var doneCallback;
+  return {
+    /**
+     * Caution: a el can only be added once, otherwise 'done'
+     * might not be called. This method checks this (by el.id),
+     * suppresses adding and returns false when existing el found.
+     *
+     * @param {modele:zrender/Element} el
+     * @param {Object} target
+     * @param {number} [time=500]
+     * @param {number} [delay=0]
+     * @param {string} [easing='linear']
+     * @return {boolean} Whether adding succeeded.
+     *
+     * @example
+     *     add(el, target, time, delay, easing);
+     *     add(el, target, time, easing);
+     *     add(el, target, time);
+     *     add(el, target);
+     */
+    add: function (el, target, time, delay, easing) {
+      if (isString(delay)) {
+        easing = delay;
+        delay = 0;
+      }
+
+      if (elExistsMap[el.id]) {
+        return false;
+      }
+
+      elExistsMap[el.id] = 1;
+      storage.push({
+        el: el,
+        target: target,
+        time: time,
+        delay: delay,
+        easing: easing
+      });
+      return true;
+    },
+
+    /**
+     * Only execute when animation finished. Will not execute when any
+     * of 'stop' or 'stopAnimation' called.
+     *
+     * @param {Function} callback
+     */
+    done: function (callback) {
+      doneCallback = callback;
+      return this;
+    },
+
+    /**
+     * Will stop exist animation firstly.
+     */
+    start: function () {
+      var count = storage.length;
+
+      for (var i = 0, len = storage.length; i < len; i++) {
+        var item = storage[i];
+        item.el.animateTo(item.target, item.time, item.delay, item.easing, done);
+      }
+
+      return this;
+
+      function done() {
+        count--;
+
+        if (!count) {
+          storage.length = 0;
+          elExistsMap = {};
+          doneCallback && doneCallback();
+        }
+      }
+    }
+  };
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var bind$1 = bind;
+var Group$2 = Group;
+var Rect$1 = Rect;
+var each$8 = each$1;
+var DRAG_THRESHOLD = 3;
+var PATH_LABEL_NOAMAL = ['label'];
+var PATH_LABEL_EMPHASIS = ['emphasis', 'label'];
+var PATH_UPPERLABEL_NORMAL = ['upperLabel'];
+var PATH_UPPERLABEL_EMPHASIS = ['emphasis', 'upperLabel'];
+var Z_BASE = 10; // Should bigger than every z.
+
+var Z_BG = 1;
+var Z_CONTENT = 2;
+var getItemStyleEmphasis = makeStyleMapper([['fill', 'color'], // `borderColor` and `borderWidth` has been occupied,
+// so use `stroke` to indicate the stroke of the rect.
+['stroke', 'strokeColor'], ['lineWidth', 'strokeWidth'], ['shadowBlur'], ['shadowOffsetX'], ['shadowOffsetY'], ['shadowColor']]);
+
+var getItemStyleNormal = function (model) {
+  // Normal style props should include emphasis style props.
+  var itemStyle = getItemStyleEmphasis(model); // Clear styles set by emphasis.
+
+  itemStyle.stroke = itemStyle.fill = itemStyle.lineWidth = null;
+  return itemStyle;
+};
+
+extendChartView({
+  type: 'treemap',
+
+  /**
+   * @override
+   */
+  init: function (o, api) {
+    /**
+     * @private
+     * @type {module:zrender/container/Group}
+     */
+    this._containerGroup;
+    /**
+     * @private
+     * @type {Object.<string, Array.<module:zrender/container/Group>>}
+     */
+
+    this._storage = createStorage();
+    /**
+     * @private
+     * @type {module:echarts/data/Tree}
+     */
+
+    this._oldTree;
+    /**
+     * @private
+     * @type {module:echarts/chart/treemap/Breadcrumb}
+     */
+
+    this._breadcrumb;
+    /**
+     * @private
+     * @type {module:echarts/component/helper/RoamController}
+     */
+
+    this._controller;
+    /**
+     * 'ready', 'animating'
+     * @private
+     */
+
+    this._state = 'ready';
+  },
+
+  /**
+   * @override
+   */
+  render: function (seriesModel, ecModel, api, payload) {
+    var models = ecModel.findComponents({
+      mainType: 'series',
+      subType: 'treemap',
+      query: payload
+    });
+
+    if (indexOf(models, seriesModel) < 0) {
+      return;
+    }
+
+    this.seriesModel = seriesModel;
+    this.api = api;
+    this.ecModel = ecModel;
+    var types = ['treemapZoomToNode', 'treemapRootToNode'];
+    var targetInfo = retrieveTargetInfo(payload, types, seriesModel);
+    var payloadType = payload && payload.type;
+    var layoutInfo = seriesModel.layoutInfo;
+    var isInit = !this._oldTree;
+    var thisStorage = this._storage; // Mark new root when action is treemapRootToNode.
+
+    var reRoot = payloadType === 'treemapRootToNode' && targetInfo && thisStorage ? {
+      rootNodeGroup: thisStorage.nodeGroup[targetInfo.node.getRawIndex()],
+      direction: payload.direction
+    } : null;
+
+    var containerGroup = this._giveContainerGroup(layoutInfo);
+
+    var renderResult = this._doRender(containerGroup, seriesModel, reRoot);
+
+    !isInit && (!payloadType || payloadType === 'treemapZoomToNode' || payloadType === 'treemapRootToNode') ? this._doAnimation(containerGroup, renderResult, seriesModel, reRoot) : renderResult.renderFinally();
+
+    this._resetController(api);
+
+    this._renderBreadcrumb(seriesModel, api, targetInfo);
+  },
+
+  /**
+   * @private
+   */
+  _giveContainerGroup: function (layoutInfo) {
+    var containerGroup = this._containerGroup;
+
+    if (!containerGroup) {
+      // FIXME
+      // 鍔犱竴灞俢ontainerGroup鏄负浜哻lip锛屼絾鏄幇鍦╟lip鍔熻兘骞舵病鏈夊疄鐜般��
+      containerGroup = this._containerGroup = new Group$2();
+
+      this._initEvents(containerGroup);
+
+      this.group.add(containerGroup);
+    }
+
+    containerGroup.attr('position', [layoutInfo.x, layoutInfo.y]);
+    return containerGroup;
+  },
+
+  /**
+   * @private
+   */
+  _doRender: function (containerGroup, seriesModel, reRoot) {
+    var thisTree = seriesModel.getData().tree;
+    var oldTree = this._oldTree; // Clear last shape records.
+
+    var lastsForAnimation = createStorage();
+    var thisStorage = createStorage();
+    var oldStorage = this._storage;
+    var willInvisibleEls = [];
+    var doRenderNode = curry(renderNode, seriesModel, thisStorage, oldStorage, reRoot, lastsForAnimation, willInvisibleEls); // Notice: when thisTree and oldTree are the same tree (see list.cloneShallow),
+    // the oldTree is actually losted, so we can not find all of the old graphic
+    // elements from tree. So we use this stragegy: make element storage, move
+    // from old storage to new storage, clear old storage.
+
+    dualTravel(thisTree.root ? [thisTree.root] : [], oldTree && oldTree.root ? [oldTree.root] : [], containerGroup, thisTree === oldTree || !oldTree, 0); // Process all removing.
+
+    var willDeleteEls = clearStorage(oldStorage);
+    this._oldTree = thisTree;
+    this._storage = thisStorage;
+    return {
+      lastsForAnimation: lastsForAnimation,
+      willDeleteEls: willDeleteEls,
+      renderFinally: renderFinally
+    };
+
+    function dualTravel(thisViewChildren, oldViewChildren, parentGroup, sameTree, depth) {
+      // When 'render' is triggered by action,
+      // 'this' and 'old' may be the same tree,
+      // we use rawIndex in that case.
+      if (sameTree) {
+        oldViewChildren = thisViewChildren;
+        each$8(thisViewChildren, function (child, index) {
+          !child.isRemoved() && processNode(index, index);
+        });
+      } // Diff hierarchically (diff only in each subtree, but not whole).
+      // because, consistency of view is important.
+      else {
+          new DataDiffer(oldViewChildren, thisViewChildren, getKey, getKey).add(processNode).update(processNode).remove(curry(processNode, null)).execute();
+        }
+
+      function getKey(node) {
+        // Identify by name or raw index.
+        return node.getId();
+      }
+
+      function processNode(newIndex, oldIndex) {
+        var thisNode = newIndex != null ? thisViewChildren[newIndex] : null;
+        var oldNode = oldIndex != null ? oldViewChildren[oldIndex] : null;
+        var group = doRenderNode(thisNode, oldNode, parentGroup, depth);
+        group && dualTravel(thisNode && thisNode.viewChildren || [], oldNode && oldNode.viewChildren || [], group, sameTree, depth + 1);
+      }
+    }
+
+    function clearStorage(storage) {
+      var willDeleteEls = createStorage();
+      storage && each$8(storage, function (store, storageName) {
+        var delEls = willDeleteEls[storageName];
+        each$8(store, function (el) {
+          el && (delEls.push(el), el.__tmWillDelete = 1);
+        });
+      });
+      return willDeleteEls;
+    }
+
+    function renderFinally() {
+      each$8(willDeleteEls, function (els) {
+        each$8(els, function (el) {
+          el.parent && el.parent.remove(el);
+        });
+      });
+      each$8(willInvisibleEls, function (el) {
+        el.invisible = true; // Setting invisible is for optimizing, so no need to set dirty,
+        // just mark as invisible.
+
+        el.dirty();
+      });
+    }
+  },
+
+  /**
+   * @private
+   */
+  _doAnimation: function (containerGroup, renderResult, seriesModel, reRoot) {
+    if (!seriesModel.get('animation')) {
+      return;
+    }
+
+    var duration = seriesModel.get('animationDurationUpdate');
+    var easing = seriesModel.get('animationEasing');
+    var animationWrap = createWrap(); // Make delete animations.
+
+    each$8(renderResult.willDeleteEls, function (store, storageName) {
+      each$8(store, function (el, rawIndex) {
+        if (el.invisible) {
+          return;
+        }
+
+        var parent = el.parent; // Always has parent, and parent is nodeGroup.
+
+        var target;
+
+        if (reRoot && reRoot.direction === 'drillDown') {
+          target = parent === reRoot.rootNodeGroup // This is the content element of view root.
+          // Only `content` will enter this branch, because
+          // `background` and `nodeGroup` will not be deleted.
+          ? {
+            shape: {
+              x: 0,
+              y: 0,
+              width: parent.__tmNodeWidth,
+              height: parent.__tmNodeHeight
+            },
+            style: {
+              opacity: 0
+            } // Others.
+
+          } : {
+            style: {
+              opacity: 0
+            }
+          };
+        } else {
+          var targetX = 0;
+          var targetY = 0;
+
+          if (!parent.__tmWillDelete) {
+            // Let node animate to right-bottom corner, cooperating with fadeout,
+            // which is appropriate for user understanding.
+            // Divided by 2 for reRoot rolling up effect.
+            targetX = parent.__tmNodeWidth / 2;
+            targetY = parent.__tmNodeHeight / 2;
+          }
+
+          target = storageName === 'nodeGroup' ? {
+            position: [targetX, targetY],
+            style: {
+              opacity: 0
+            }
+          } : {
+            shape: {
+              x: targetX,
+              y: targetY,
+              width: 0,
+              height: 0
+            },
+            style: {
+              opacity: 0
+            }
+          };
+        }
+
+        target && animationWrap.add(el, target, duration, easing);
+      });
+    }); // Make other animations
+
+    each$8(this._storage, function (store, storageName) {
+      each$8(store, function (el, rawIndex) {
+        var last = renderResult.lastsForAnimation[storageName][rawIndex];
+        var target = {};
+
+        if (!last) {
+          return;
+        }
+
+        if (storageName === 'nodeGroup') {
+          if (last.old) {
+            target.position = el.position.slice();
+            el.attr('position', last.old);
+          }
+        } else {
+          if (last.old) {
+            target.shape = extend({}, el.shape);
+            el.setShape(last.old);
+          }
+
+          if (last.fadein) {
+            el.setStyle('opacity', 0);
+            target.style = {
+              opacity: 1
+            };
+          } // When animation is stopped for succedent animation starting,
+          // el.style.opacity might not be 1
+          else if (el.style.opacity !== 1) {
+              target.style = {
+                opacity: 1
+              };
+            }
+        }
+
+        animationWrap.add(el, target, duration, easing);
+      });
+    }, this);
+    this._state = 'animating';
+    animationWrap.done(bind$1(function () {
+      this._state = 'ready';
+      renderResult.renderFinally();
+    }, this)).start();
+  },
+
+  /**
+   * @private
+   */
+  _resetController: function (api) {
+    var controller = this._controller; // Init controller.
+
+    if (!controller) {
+      controller = this._controller = new RoamController(api.getZr());
+      controller.enable(this.seriesModel.get('roam'));
+      controller.on('pan', bind$1(this._onPan, this));
+      controller.on('zoom', bind$1(this._onZoom, this));
+    }
+
+    var rect = new BoundingRect(0, 0, api.getWidth(), api.getHeight());
+    controller.setPointerChecker(function (e, x, y) {
+      return rect.contain(x, y);
+    });
+  },
+
+  /**
+   * @private
+   */
+  _clearController: function () {
+    var controller = this._controller;
+
+    if (controller) {
+      controller.dispose();
+      controller = null;
+    }
+  },
+
+  /**
+   * @private
+   */
+  _onPan: function (e) {
+    if (this._state !== 'animating' && (Math.abs(e.dx) > DRAG_THRESHOLD || Math.abs(e.dy) > DRAG_THRESHOLD)) {
+      // These param must not be cached.
+      var root = this.seriesModel.getData().tree.root;
+
+      if (!root) {
+        return;
+      }
+
+      var rootLayout = root.getLayout();
+
+      if (!rootLayout) {
+        return;
+      }
+
+      this.api.dispatchAction({
+        type: 'treemapMove',
+        from: this.uid,
+        seriesId: this.seriesModel.id,
+        rootRect: {
+          x: rootLayout.x + e.dx,
+          y: rootLayout.y + e.dy,
+          width: rootLayout.width,
+          height: rootLayout.height
+        }
+      });
+    }
+  },
+
+  /**
+   * @private
+   */
+  _onZoom: function (e) {
+    var mouseX = e.originX;
+    var mouseY = e.originY;
+
+    if (this._state !== 'animating') {
+      // These param must not be cached.
+      var root = this.seriesModel.getData().tree.root;
+
+      if (!root) {
+        return;
+      }
+
+      var rootLayout = root.getLayout();
+
+      if (!rootLayout) {
+        return;
+      }
+
+      var rect = new BoundingRect(rootLayout.x, rootLayout.y, rootLayout.width, rootLayout.height);
+      var layoutInfo = this.seriesModel.layoutInfo; // Transform mouse coord from global to containerGroup.
+
+      mouseX -= layoutInfo.x;
+      mouseY -= layoutInfo.y; // Scale root bounding rect.
+
+      var m = create$1();
+      translate(m, m, [-mouseX, -mouseY]);
+      scale$1(m, m, [e.scale, e.scale]);
+      translate(m, m, [mouseX, mouseY]);
+      rect.applyTransform(m);
+      this.api.dispatchAction({
+        type: 'treemapRender',
+        from: this.uid,
+        seriesId: this.seriesModel.id,
+        rootRect: {
+          x: rect.x,
+          y: rect.y,
+          width: rect.width,
+          height: rect.height
+        }
+      });
+    }
+  },
+
+  /**
+   * @private
+   */
+  _initEvents: function (containerGroup) {
+    containerGroup.on('click', function (e) {
+      if (this._state !== 'ready') {
+        return;
+      }
+
+      var nodeClick = this.seriesModel.get('nodeClick', true);
+
+      if (!nodeClick) {
+        return;
+      }
+
+      var targetInfo = this.findTarget(e.offsetX, e.offsetY);
+
+      if (!targetInfo) {
+        return;
+      }
+
+      var node = targetInfo.node;
+
+      if (node.getLayout().isLeafRoot) {
+        this._rootToNode(targetInfo);
+      } else {
+        if (nodeClick === 'zoomToNode') {
+          this._zoomToNode(targetInfo);
+        } else if (nodeClick === 'link') {
+          var itemModel = node.hostTree.data.getItemModel(node.dataIndex);
+          var link = itemModel.get('link', true);
+          var linkTarget = itemModel.get('target', true) || 'blank';
+          link && window.open(link, linkTarget);
+        }
+      }
+    }, this);
+  },
+
+  /**
+   * @private
+   */
+  _renderBreadcrumb: function (seriesModel, api, targetInfo) {
+    if (!targetInfo) {
+      targetInfo = seriesModel.get('leafDepth', true) != null ? {
+        node: seriesModel.getViewRoot() // FIXME
+        // better way?
+        // Find breadcrumb tail on center of containerGroup.
+
+      } : this.findTarget(api.getWidth() / 2, api.getHeight() / 2);
+
+      if (!targetInfo) {
+        targetInfo = {
+          node: seriesModel.getData().tree.root
+        };
+      }
+    }
+
+    (this._breadcrumb || (this._breadcrumb = new Breadcrumb(this.group))).render(seriesModel, api, targetInfo.node, bind$1(onSelect, this));
+
+    function onSelect(node) {
+      if (this._state !== 'animating') {
+        aboveViewRoot(seriesModel.getViewRoot(), node) ? this._rootToNode({
+          node: node
+        }) : this._zoomToNode({
+          node: node
+        });
+      }
+    }
+  },
+
+  /**
+   * @override
+   */
+  remove: function () {
+    this._clearController();
+
+    this._containerGroup && this._containerGroup.removeAll();
+    this._storage = createStorage();
+    this._state = 'ready';
+    this._breadcrumb && this._breadcrumb.remove();
+  },
+  dispose: function () {
+    this._clearController();
+  },
+
+  /**
+   * @private
+   */
+  _zoomToNode: function (targetInfo) {
+    this.api.dispatchAction({
+      type: 'treemapZoomToNode',
+      from: this.uid,
+      seriesId: this.seriesModel.id,
+      targetNode: targetInfo.node
+    });
+  },
+
+  /**
+   * @private
+   */
+  _rootToNode: function (targetInfo) {
+    this.api.dispatchAction({
+      type: 'treemapRootToNode',
+      from: this.uid,
+      seriesId: this.seriesModel.id,
+      targetNode: targetInfo.node
+    });
+  },
+
+  /**
+   * @public
+   * @param {number} x Global coord x.
+   * @param {number} y Global coord y.
+   * @return {Object} info If not found, return undefined;
+   * @return {number} info.node Target node.
+   * @return {number} info.offsetX x refer to target node.
+   * @return {number} info.offsetY y refer to target node.
+   */
+  findTarget: function (x, y) {
+    var targetInfo;
+    var viewRoot = this.seriesModel.getViewRoot();
+    viewRoot.eachNode({
+      attr: 'viewChildren',
+      order: 'preorder'
+    }, function (node) {
+      var bgEl = this._storage.background[node.getRawIndex()]; // If invisible, there might be no element.
+
+
+      if (bgEl) {
+        var point = bgEl.transformCoordToLocal(x, y);
+        var shape = bgEl.shape; // For performance consideration, dont use 'getBoundingRect'.
+
+        if (shape.x <= point[0] && point[0] <= shape.x + shape.width && shape.y <= point[1] && point[1] <= shape.y + shape.height) {
+          targetInfo = {
+            node: node,
+            offsetX: point[0],
+            offsetY: point[1]
+          };
+        } else {
+          return false; // Suppress visit subtree.
+        }
+      }
+    }, this);
+    return targetInfo;
+  }
+});
+/**
+ * @inner
+ */
+
+function createStorage() {
+  return {
+    nodeGroup: [],
+    background: [],
+    content: []
+  };
+}
+/**
+ * @inner
+ * @return Return undefined means do not travel further.
+ */
+
+
+function renderNode(seriesModel, thisStorage, oldStorage, reRoot, lastsForAnimation, willInvisibleEls, thisNode, oldNode, parentGroup, depth) {
+  // Whether under viewRoot.
+  if (!thisNode) {
+    // Deleting nodes will be performed finally. This method just find
+    // element from old storage, or create new element, set them to new
+    // storage, and set styles.
+    return;
+  } // -------------------------------------------------------------------
+  // Start of closure variables available in "Procedures in renderNode".
+
+
+  var thisLayout = thisNode.getLayout();
+
+  if (!thisLayout || !thisLayout.isInView) {
+    return;
+  }
+
+  var thisWidth = thisLayout.width;
+  var thisHeight = thisLayout.height;
+  var borderWidth = thisLayout.borderWidth;
+  var thisInvisible = thisLayout.invisible;
+  var thisRawIndex = thisNode.getRawIndex();
+  var oldRawIndex = oldNode && oldNode.getRawIndex();
+  var thisViewChildren = thisNode.viewChildren;
+  var upperHeight = thisLayout.upperHeight;
+  var isParent = thisViewChildren && thisViewChildren.length;
+  var itemStyleNormalModel = thisNode.getModel('itemStyle');
+  var itemStyleEmphasisModel = thisNode.getModel('emphasis.itemStyle'); // End of closure ariables available in "Procedures in renderNode".
+  // -----------------------------------------------------------------
+  // Node group
+
+  var group = giveGraphic('nodeGroup', Group$2);
+
+  if (!group) {
+    return;
+  }
+
+  parentGroup.add(group); // x,y are not set when el is above view root.
+
+  group.attr('position', [thisLayout.x || 0, thisLayout.y || 0]);
+  group.__tmNodeWidth = thisWidth;
+  group.__tmNodeHeight = thisHeight;
+
+  if (thisLayout.isAboveViewRoot) {
+    return group;
+  } // Background
+
+
+  var bg = giveGraphic('background', Rect$1, depth, Z_BG);
+  bg && renderBackground(group, bg, isParent && thisLayout.upperHeight); // No children, render content.
+
+  if (!isParent) {
+    var content = giveGraphic('content', Rect$1, depth, Z_CONTENT);
+    content && renderContent(group, content);
+  }
+
+  return group; // ----------------------------
+  // | Procedures in renderNode |
+  // ----------------------------
+
+  function renderBackground(group, bg, useUpperLabel) {
+    // For tooltip.
+    bg.dataIndex = thisNode.dataIndex;
+    bg.seriesIndex = seriesModel.seriesIndex;
+    bg.setShape({
+      x: 0,
+      y: 0,
+      width: thisWidth,
+      height: thisHeight
+    });
+    var visualBorderColor = thisNode.getVisual('borderColor', true);
+    var emphasisBorderColor = itemStyleEmphasisModel.get('borderColor');
+    updateStyle(bg, function () {
+      var normalStyle = getItemStyleNormal(itemStyleNormalModel);
+      normalStyle.fill = visualBorderColor;
+      var emphasisStyle = getItemStyleEmphasis(itemStyleEmphasisModel);
+      emphasisStyle.fill = emphasisBorderColor;
+
+      if (useUpperLabel) {
+        var upperLabelWidth = thisWidth - 2 * borderWidth;
+        prepareText(normalStyle, emphasisStyle, visualBorderColor, upperLabelWidth, upperHeight, {
+          x: borderWidth,
+          y: 0,
+          width: upperLabelWidth,
+          height: upperHeight
+        });
+      } // For old bg.
+      else {
+          normalStyle.text = emphasisStyle.text = null;
+        }
+
+      bg.setStyle(normalStyle);
+      setHoverStyle(bg, emphasisStyle);
+    });
+    group.add(bg);
+  }
+
+  function renderContent(group, content) {
+    // For tooltip.
+    content.dataIndex = thisNode.dataIndex;
+    content.seriesIndex = seriesModel.seriesIndex;
+    var contentWidth = Math.max(thisWidth - 2 * borderWidth, 0);
+    var contentHeight = Math.max(thisHeight - 2 * borderWidth, 0);
+    content.culling = true;
+    content.setShape({
+      x: borderWidth,
+      y: borderWidth,
+      width: contentWidth,
+      height: contentHeight
+    });
+    var visualColor = thisNode.getVisual('color', true);
+    updateStyle(content, function () {
+      var normalStyle = getItemStyleNormal(itemStyleNormalModel);
+      normalStyle.fill = visualColor;
+      var emphasisStyle = getItemStyleEmphasis(itemStyleEmphasisModel);
+      prepareText(normalStyle, emphasisStyle, visualColor, contentWidth, contentHeight);
+      content.setStyle(normalStyle);
+      setHoverStyle(content, emphasisStyle);
+    });
+    group.add(content);
+  }
+
+  function updateStyle(element, cb) {
+    if (!thisInvisible) {
+      // If invisible, do not set visual, otherwise the element will
+      // change immediately before animation. We think it is OK to
+      // remain its origin color when moving out of the view window.
+      cb();
+
+      if (!element.__tmWillVisible) {
+        element.invisible = false;
+      }
+    } else {
+      // Delay invisible setting utill animation finished,
+      // avoid element vanish suddenly before animation.
+      !element.invisible && willInvisibleEls.push(element);
+    }
+  }
+
+  function prepareText(normalStyle, emphasisStyle, visualColor, width, height, upperLabelRect) {
+    var nodeModel = thisNode.getModel();
+    var text = retrieve(seriesModel.getFormattedLabel(thisNode.dataIndex, 'normal', null, null, upperLabelRect ? 'upperLabel' : 'label'), nodeModel.get('name'));
+
+    if (!upperLabelRect && thisLayout.isLeafRoot) {
+      var iconChar = seriesModel.get('drillDownIcon', true);
+      text = iconChar ? iconChar + ' ' + text : text;
+    }
+
+    var normalLabelModel = nodeModel.getModel(upperLabelRect ? PATH_UPPERLABEL_NORMAL : PATH_LABEL_NOAMAL);
+    var emphasisLabelModel = nodeModel.getModel(upperLabelRect ? PATH_UPPERLABEL_EMPHASIS : PATH_LABEL_EMPHASIS);
+    var isShow = normalLabelModel.getShallow('show');
+    setLabelStyle(normalStyle, emphasisStyle, normalLabelModel, emphasisLabelModel, {
+      defaultText: isShow ? text : null,
+      autoColor: visualColor,
+      isRectText: true
+    });
+    upperLabelRect && (normalStyle.textRect = clone(upperLabelRect));
+    normalStyle.truncate = isShow && normalLabelModel.get('ellipsis') ? {
+      outerWidth: width,
+      outerHeight: height,
+      minChar: 2
+    } : null;
+  }
+
+  function giveGraphic(storageName, Ctor, depth, z) {
+    var element = oldRawIndex != null && oldStorage[storageName][oldRawIndex];
+    var lasts = lastsForAnimation[storageName];
+
+    if (element) {
+      // Remove from oldStorage
+      oldStorage[storageName][oldRawIndex] = null;
+      prepareAnimationWhenHasOld(lasts, element, storageName);
+    } // If invisible and no old element, do not create new element (for optimizing).
+    else if (!thisInvisible) {
+        element = new Ctor({
+          z: calculateZ(depth, z)
+        });
+        element.__tmDepth = depth;
+        element.__tmStorageName = storageName;
+        prepareAnimationWhenNoOld(lasts, element, storageName);
+      } // Set to thisStorage
+
+
+    return thisStorage[storageName][thisRawIndex] = element;
+  }
+
+  function prepareAnimationWhenHasOld(lasts, element, storageName) {
+    var lastCfg = lasts[thisRawIndex] = {};
+    lastCfg.old = storageName === 'nodeGroup' ? element.position.slice() : extend({}, element.shape);
+  } // If a element is new, we need to find the animation start point carefully,
+  // otherwise it will looks strange when 'zoomToNode'.
+
+
+  function prepareAnimationWhenNoOld(lasts, element, storageName) {
+    var lastCfg = lasts[thisRawIndex] = {};
+    var parentNode = thisNode.parentNode;
+
+    if (parentNode && (!reRoot || reRoot.direction === 'drillDown')) {
+      var parentOldX = 0;
+      var parentOldY = 0; // New nodes appear from right-bottom corner in 'zoomToNode' animation.
+      // For convenience, get old bounding rect from background.
+
+      var parentOldBg = lastsForAnimation.background[parentNode.getRawIndex()];
+
+      if (!reRoot && parentOldBg && parentOldBg.old) {
+        parentOldX = parentOldBg.old.width;
+        parentOldY = parentOldBg.old.height;
+      } // When no parent old shape found, its parent is new too,
+      // so we can just use {x:0, y:0}.
+
+
+      lastCfg.old = storageName === 'nodeGroup' ? [0, parentOldY] : {
+        x: parentOldX,
+        y: parentOldY,
+        width: 0,
+        height: 0
+      };
+    } // Fade in, user can be aware that these nodes are new.
+
+
+    lastCfg.fadein = storageName !== 'nodeGroup';
+  }
+} // We can not set all backgroud with the same z, Because the behaviour of
+// drill down and roll up differ background creation sequence from tree
+// hierarchy sequence, which cause that lowser background element overlap
+// upper ones. So we calculate z based on depth.
+// Moreover, we try to shrink down z interval to [0, 1] to avoid that
+// treemap with large z overlaps other components.
+
+
+function calculateZ(depth, zInLevel) {
+  var zb = depth * Z_BASE + zInLevel;
+  return (zb - 1) / zb;
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * @file Treemap action
+ */
+var noop$1 = function () {};
+
+var actionTypes = ['treemapZoomToNode', 'treemapRender', 'treemapMove'];
+
+for (var i$1 = 0; i$1 < actionTypes.length; i$1++) {
+  registerAction({
+    type: actionTypes[i$1],
+    update: 'updateView'
+  }, noop$1);
+}
+
+registerAction({
+  type: 'treemapRootToNode',
+  update: 'updateView'
+}, function (payload, ecModel) {
+  ecModel.eachComponent({
+    mainType: 'series',
+    subType: 'treemap',
+    query: payload
+  }, handleRootToNode);
+
+  function handleRootToNode(model, index) {
+    var types = ['treemapZoomToNode', 'treemapRootToNode'];
+    var targetInfo = retrieveTargetInfo(payload, types, model);
+
+    if (targetInfo) {
+      var originViewRoot = model.getViewRoot();
+
+      if (originViewRoot) {
+        payload.direction = aboveViewRoot(originViewRoot, targetInfo.node) ? 'rollUp' : 'drillDown';
+      }
+
+      model.resetViewRoot(targetInfo.node);
+    }
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var each$9 = each$1;
+var isObject$5 = isObject$1;
+var CATEGORY_DEFAULT_VISUAL_INDEX = -1;
+/**
+ * @param {Object} option
+ * @param {string} [option.type] See visualHandlers.
+ * @param {string} [option.mappingMethod] 'linear' or 'piecewise' or 'category' or 'fixed'
+ * @param {Array.<number>=} [option.dataExtent] [minExtent, maxExtent],
+ *                                              required when mappingMethod is 'linear'
+ * @param {Array.<Object>=} [option.pieceList] [
+ *                                             {value: someValue},
+ *                                             {interval: [min1, max1], visual: {...}},
+ *                                             {interval: [min2, max2]}
+ *                                             ],
+ *                                            required when mappingMethod is 'piecewise'.
+ *                                            Visual for only each piece can be specified.
+ * @param {Array.<string|Object>=} [option.categories] ['cate1', 'cate2']
+ *                                            required when mappingMethod is 'category'.
+ *                                            If no option.categories, categories is set
+ *                                            as [0, 1, 2, ...].
+ * @param {boolean} [option.loop=false] Whether loop mapping when mappingMethod is 'category'.
+ * @param {(Array|Object|*)} [option.visual]  Visual data.
+ *                                            when mappingMethod is 'category',
+ *                                            visual data can be array or object
+ *                                            (like: {cate1: '#222', none: '#fff'})
+ *                                            or primary types (which represents
+ *                                            defualt category visual), otherwise visual
+ *                                            can be array or primary (which will be
+ *                                            normalized to array).
+ *
+ */
+
+var VisualMapping = function (option) {
+  var mappingMethod = option.mappingMethod;
+  var visualType = option.type;
+  /**
+   * @readOnly
+   * @type {Object}
+   */
+
+  var thisOption = this.option = clone(option);
+  /**
+   * @readOnly
+   * @type {string}
+   */
+
+  this.type = visualType;
+  /**
+   * @readOnly
+   * @type {string}
+   */
+
+  this.mappingMethod = mappingMethod;
+  /**
+   * @private
+   * @type {Function}
+   */
+
+  this._normalizeData = normalizers[mappingMethod];
+  var visualHandler = visualHandlers[visualType];
+  /**
+   * @public
+   * @type {Function}
+   */
+
+  this.applyVisual = visualHandler.applyVisual;
+  /**
+   * @public
+   * @type {Function}
+   */
+
+  this.getColorMapper = visualHandler.getColorMapper;
+  /**
+   * @private
+   * @type {Function}
+   */
+
+  this._doMap = visualHandler._doMap[mappingMethod];
+
+  if (mappingMethod === 'piecewise') {
+    normalizeVisualRange(thisOption);
+    preprocessForPiecewise(thisOption);
+  } else if (mappingMethod === 'category') {
+    thisOption.categories ? preprocessForSpecifiedCategory(thisOption) // categories is ordinal when thisOption.categories not specified,
+    // which need no more preprocess except normalize visual.
+    : normalizeVisualRange(thisOption, true);
+  } else {
+    // mappingMethod === 'linear' or 'fixed'
+    assert$1(mappingMethod !== 'linear' || thisOption.dataExtent);
+    normalizeVisualRange(thisOption);
+  }
+};
+
+VisualMapping.prototype = {
+  constructor: VisualMapping,
+  mapValueToVisual: function (value) {
+    var normalized = this._normalizeData(value);
+
+    return this._doMap(normalized, value);
+  },
+  getNormalizer: function () {
+    return bind(this._normalizeData, this);
+  }
+};
+var visualHandlers = VisualMapping.visualHandlers = {
+  color: {
+    applyVisual: makeApplyVisual('color'),
+
+    /**
+     * Create a mapper function
+     * @return {Function}
+     */
+    getColorMapper: function () {
+      var thisOption = this.option;
+      return bind(thisOption.mappingMethod === 'category' ? function (value, isNormalized) {
+        !isNormalized && (value = this._normalizeData(value));
+        return doMapCategory.call(this, value);
+      } : function (value, isNormalized, out) {
+        // If output rgb array
+        // which will be much faster and useful in pixel manipulation
+        var returnRGBArray = !!out;
+        !isNormalized && (value = this._normalizeData(value));
+        out = fastLerp(value, thisOption.parsedVisual, out);
+        return returnRGBArray ? out : stringify(out, 'rgba');
+      }, this);
+    },
+    _doMap: {
+      linear: function (normalized) {
+        return stringify(fastLerp(normalized, this.option.parsedVisual), 'rgba');
+      },
+      category: doMapCategory,
+      piecewise: function (normalized, value) {
+        var result = getSpecifiedVisual.call(this, value);
+
+        if (result == null) {
+          result = stringify(fastLerp(normalized, this.option.parsedVisual), 'rgba');
+        }
+
+        return result;
+      },
+      fixed: doMapFixed
+    }
+  },
+  colorHue: makePartialColorVisualHandler(function (color, value) {
+    return modifyHSL(color, value);
+  }),
+  colorSaturation: makePartialColorVisualHandler(function (color, value) {
+    return modifyHSL(color, null, value);
+  }),
+  colorLightness: makePartialColorVisualHandler(function (color, value) {
+    return modifyHSL(color, null, null, value);
+  }),
+  colorAlpha: makePartialColorVisualHandler(function (color, value) {
+    return modifyAlpha(color, value);
+  }),
+  opacity: {
+    applyVisual: makeApplyVisual('opacity'),
+    _doMap: makeDoMap([0, 1])
+  },
+  liftZ: {
+    applyVisual: makeApplyVisual('liftZ'),
+    _doMap: {
+      linear: doMapFixed,
+      category: doMapFixed,
+      piecewise: doMapFixed,
+      fixed: doMapFixed
+    }
+  },
+  symbol: {
+    applyVisual: function (value, getter, setter) {
+      var symbolCfg = this.mapValueToVisual(value);
+
+      if (isString(symbolCfg)) {
+        setter('symbol', symbolCfg);
+      } else if (isObject$5(symbolCfg)) {
+        for (var name in symbolCfg) {
+          if (symbolCfg.hasOwnProperty(name)) {
+            setter(name, symbolCfg[name]);
+          }
+        }
+      }
+    },
+    _doMap: {
+      linear: doMapToArray,
+      category: doMapCategory,
+      piecewise: function (normalized, value) {
+        var result = getSpecifiedVisual.call(this, value);
+
+        if (result == null) {
+          result = doMapToArray.call(this, normalized);
+        }
+
+        return result;
+      },
+      fixed: doMapFixed
+    }
+  },
+  symbolSize: {
+    applyVisual: makeApplyVisual('symbolSize'),
+    _doMap: makeDoMap([0, 1])
+  }
+};
+
+function preprocessForPiecewise(thisOption) {
+  var pieceList = thisOption.pieceList;
+  thisOption.hasSpecialVisual = false;
+  each$1(pieceList, function (piece, index) {
+    piece.originIndex = index; // piece.visual is "result visual value" but not
+    // a visual range, so it does not need to be normalized.
+
+    if (piece.visual != null) {
+      thisOption.hasSpecialVisual = true;
+    }
+  });
+}
+
+function preprocessForSpecifiedCategory(thisOption) {
+  // Hash categories.
+  var categories = thisOption.categories;
+  var visual = thisOption.visual;
+  var categoryMap = thisOption.categoryMap = {};
+  each$9(categories, function (cate, index) {
+    categoryMap[cate] = index;
+  }); // Process visual map input.
+
+  if (!isArray(visual)) {
+    var visualArr = [];
+
+    if (isObject$1(visual)) {
+      each$9(visual, function (v, cate) {
+        var index = categoryMap[cate];
+        visualArr[index != null ? index : CATEGORY_DEFAULT_VISUAL_INDEX] = v;
+      });
+    } else {
+      // Is primary type, represents default visual.
+      visualArr[CATEGORY_DEFAULT_VISUAL_INDEX] = visual;
+    }
+
+    visual = setVisualToOption(thisOption, visualArr);
+  } // Remove categories that has no visual,
+  // then we can mapping them to CATEGORY_DEFAULT_VISUAL_INDEX.
+
+
+  for (var i = categories.length - 1; i >= 0; i--) {
+    if (visual[i] == null) {
+      delete categoryMap[categories[i]];
+      categories.pop();
+    }
+  }
+}
+
+function normalizeVisualRange(thisOption, isCategory) {
+  var visual = thisOption.visual;
+  var visualArr = [];
+
+  if (isObject$1(visual)) {
+    each$9(visual, function (v) {
+      visualArr.push(v);
+    });
+  } else if (visual != null) {
+    visualArr.push(visual);
+  }
+
+  var doNotNeedPair = {
+    color: 1,
+    symbol: 1
+  };
+
+  if (!isCategory && visualArr.length === 1 && !doNotNeedPair.hasOwnProperty(thisOption.type)) {
+    // Do not care visualArr.length === 0, which is illegal.
+    visualArr[1] = visualArr[0];
+  }
+
+  setVisualToOption(thisOption, visualArr);
+}
+
+function makePartialColorVisualHandler(applyValue) {
+  return {
+    applyVisual: function (value, getter, setter) {
+      value = this.mapValueToVisual(value); // Must not be array value
+
+      setter('color', applyValue(getter('color'), value));
+    },
+    _doMap: makeDoMap([0, 1])
+  };
+}
+
+function doMapToArray(normalized) {
+  var visual = this.option.visual;
+  return visual[Math.round(linearMap(normalized, [0, 1], [0, visual.length - 1], true))] || {};
+}
+
+function makeApplyVisual(visualType) {
+  return function (value, getter, setter) {
+    setter(visualType, this.mapValueToVisual(value));
+  };
+}
+
+function doMapCategory(normalized) {
+  var visual = this.option.visual;
+  return visual[this.option.loop && normalized !== CATEGORY_DEFAULT_VISUAL_INDEX ? normalized % visual.length : normalized];
+}
+
+function doMapFixed() {
+  return this.option.visual[0];
+}
+
+function makeDoMap(sourceExtent) {
+  return {
+    linear: function (normalized) {
+      return linearMap(normalized, sourceExtent, this.option.visual, true);
+    },
+    category: doMapCategory,
+    piecewise: function (normalized, value) {
+      var result = getSpecifiedVisual.call(this, value);
+
+      if (result == null) {
+        result = linearMap(normalized, sourceExtent, this.option.visual, true);
+      }
+
+      return result;
+    },
+    fixed: doMapFixed
+  };
+}
+
+function getSpecifiedVisual(value) {
+  var thisOption = this.option;
+  var pieceList = thisOption.pieceList;
+
+  if (thisOption.hasSpecialVisual) {
+    var pieceIndex = VisualMapping.findPieceIndex(value, pieceList);
+    var piece = pieceList[pieceIndex];
+
+    if (piece && piece.visual) {
+      return piece.visual[this.type];
+    }
+  }
+}
+
+function setVisualToOption(thisOption, visualArr) {
+  thisOption.visual = visualArr;
+
+  if (thisOption.type === 'color') {
+    thisOption.parsedVisual = map(visualArr, function (item) {
+      return parse(item);
+    });
+  }
+
+  return visualArr;
+}
+/**
+ * Normalizers by mapping methods.
+ */
+
+
+var normalizers = {
+  linear: function (value) {
+    return linearMap(value, this.option.dataExtent, [0, 1], true);
+  },
+  piecewise: function (value) {
+    var pieceList = this.option.pieceList;
+    var pieceIndex = VisualMapping.findPieceIndex(value, pieceList, true);
+
+    if (pieceIndex != null) {
+      return linearMap(pieceIndex, [0, pieceList.length - 1], [0, 1], true);
+    }
+  },
+  category: function (value) {
+    var index = this.option.categories ? this.option.categoryMap[value] : value; // ordinal
+
+    return index == null ? CATEGORY_DEFAULT_VISUAL_INDEX : index;
+  },
+  fixed: noop
+};
+/**
+ * List available visual types.
+ *
+ * @public
+ * @return {Array.<string>}
+ */
+
+VisualMapping.listVisualTypes = function () {
+  var visualTypes = [];
+  each$1(visualHandlers, function (handler, key) {
+    visualTypes.push(key);
+  });
+  return visualTypes;
+};
+/**
+ * @public
+ */
+
+
+VisualMapping.addVisualHandler = function (name, handler) {
+  visualHandlers[name] = handler;
+};
+/**
+ * @public
+ */
+
+
+VisualMapping.isValidType = function (visualType) {
+  return visualHandlers.hasOwnProperty(visualType);
+};
+/**
+ * Convinent method.
+ * Visual can be Object or Array or primary type.
+ *
+ * @public
+ */
+
+
+VisualMapping.eachVisual = function (visual, callback, context) {
+  if (isObject$1(visual)) {
+    each$1(visual, callback, context);
+  } else {
+    callback.call(context, visual);
+  }
+};
+
+VisualMapping.mapVisual = function (visual, callback, context) {
+  var isPrimary;
+  var newVisual = isArray(visual) ? [] : isObject$1(visual) ? {} : (isPrimary = true, null);
+  VisualMapping.eachVisual(visual, function (v, key) {
+    var newVal = callback.call(context, v, key);
+    isPrimary ? newVisual = newVal : newVisual[key] = newVal;
+  });
+  return newVisual;
+};
+/**
+ * @public
+ * @param {Object} obj
+ * @return {Object} new object containers visual values.
+ *                 If no visuals, return null.
+ */
+
+
+VisualMapping.retrieveVisuals = function (obj) {
+  var ret = {};
+  var hasVisual;
+  obj && each$9(visualHandlers, function (h, visualType) {
+    if (obj.hasOwnProperty(visualType)) {
+      ret[visualType] = obj[visualType];
+      hasVisual = true;
+    }
+  });
+  return hasVisual ? ret : null;
+};
+/**
+ * Give order to visual types, considering colorSaturation, colorAlpha depends on color.
+ *
+ * @public
+ * @param {(Object|Array)} visualTypes If Object, like: {color: ..., colorSaturation: ...}
+ *                                     IF Array, like: ['color', 'symbol', 'colorSaturation']
+ * @return {Array.<string>} Sorted visual types.
+ */
+
+
+VisualMapping.prepareVisualTypes = function (visualTypes) {
+  if (isObject$5(visualTypes)) {
+    var types = [];
+    each$9(visualTypes, function (item, type) {
+      types.push(type);
+    });
+    visualTypes = types;
+  } else if (isArray(visualTypes)) {
+    visualTypes = visualTypes.slice();
+  } else {
+    return [];
+  }
+
+  visualTypes.sort(function (type1, type2) {
+    // color should be front of colorSaturation, colorAlpha, ...
+    // symbol and symbolSize do not matter.
+    return type2 === 'color' && type1 !== 'color' && type1.indexOf('color') === 0 ? 1 : -1;
+  });
+  return visualTypes;
+};
+/**
+ * 'color', 'colorSaturation', 'colorAlpha', ... are depends on 'color'.
+ * Other visuals are only depends on themself.
+ *
+ * @public
+ * @param {string} visualType1
+ * @param {string} visualType2
+ * @return {boolean}
+ */
+
+
+VisualMapping.dependsOn = function (visualType1, visualType2) {
+  return visualType2 === 'color' ? !!(visualType1 && visualType1.indexOf(visualType2) === 0) : visualType1 === visualType2;
+};
+/**
+ * @param {number} value
+ * @param {Array.<Object>} pieceList [{value: ..., interval: [min, max]}, ...]
+ *                         Always from small to big.
+ * @param {boolean} [findClosestWhenOutside=false]
+ * @return {number} index
+ */
+
+
+VisualMapping.findPieceIndex = function (value, pieceList, findClosestWhenOutside) {
+  var possibleI;
+  var abs = Infinity; // value has the higher priority.
+
+  for (var i = 0, len = pieceList.length; i < len; i++) {
+    var pieceValue = pieceList[i].value;
+
+    if (pieceValue != null) {
+      if (pieceValue === value // FIXME
+      // It is supposed to compare value according to value type of dimension,
+      // but currently value type can exactly be string or number.
+      // Compromise for numeric-like string (like '12'), especially
+      // in the case that visualMap.categories is ['22', '33'].
+      || typeof pieceValue === 'string' && pieceValue === value + '') {
+        return i;
+      }
+
+      findClosestWhenOutside && updatePossible(pieceValue, i);
+    }
+  }
+
+  for (var i = 0, len = pieceList.length; i < len; i++) {
+    var piece = pieceList[i];
+    var interval = piece.interval;
+    var close = piece.close;
+
+    if (interval) {
+      if (interval[0] === -Infinity) {
+        if (littleThan(close[1], value, interval[1])) {
+          return i;
+        }
+      } else if (interval[1] === Infinity) {
+        if (littleThan(close[0], interval[0], value)) {
+          return i;
+        }
+      } else if (littleThan(close[0], interval[0], value) && littleThan(close[1], value, interval[1])) {
+        return i;
+      }
+
+      findClosestWhenOutside && updatePossible(interval[0], i);
+      findClosestWhenOutside && updatePossible(interval[1], i);
+    }
+  }
+
+  if (findClosestWhenOutside) {
+    return value === Infinity ? pieceList.length - 1 : value === -Infinity ? 0 : possibleI;
+  }
+
+  function updatePossible(val, index) {
+    var newAbs = Math.abs(val - value);
+
+    if (newAbs < abs) {
+      abs = newAbs;
+      possibleI = index;
+    }
+  }
+};
+
+function littleThan(close, a, b) {
+  return close ? a <= b : a < b;
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var isArray$2 = isArray;
+var ITEM_STYLE_NORMAL = 'itemStyle';
+var treemapVisual = {
+  seriesType: 'treemap',
+  reset: function (seriesModel, ecModel, api, payload) {
+    var tree = seriesModel.getData().tree;
+    var root = tree.root;
+    var seriesItemStyleModel = seriesModel.getModel(ITEM_STYLE_NORMAL);
+
+    if (root.isRemoved()) {
+      return;
+    }
+
+    var levelItemStyles = map(tree.levelModels, function (levelModel) {
+      return levelModel ? levelModel.get(ITEM_STYLE_NORMAL) : null;
+    });
+    travelTree(root, // Visual should calculate from tree root but not view root.
+    {}, levelItemStyles, seriesItemStyleModel, seriesModel.getViewRoot().getAncestors(), seriesModel);
+  }
+};
+
+function travelTree(node, designatedVisual, levelItemStyles, seriesItemStyleModel, viewRootAncestors, seriesModel) {
+  var nodeModel = node.getModel();
+  var nodeLayout = node.getLayout(); // Optimize
+
+  if (!nodeLayout || nodeLayout.invisible || !nodeLayout.isInView) {
+    return;
+  }
+
+  var nodeItemStyleModel = node.getModel(ITEM_STYLE_NORMAL);
+  var levelItemStyle = levelItemStyles[node.depth];
+  var visuals = buildVisuals(nodeItemStyleModel, designatedVisual, levelItemStyle, seriesItemStyleModel); // calculate border color
+
+  var borderColor = nodeItemStyleModel.get('borderColor');
+  var borderColorSaturation = nodeItemStyleModel.get('borderColorSaturation');
+  var thisNodeColor;
+
+  if (borderColorSaturation != null) {
+    // For performance, do not always execute 'calculateColor'.
+    thisNodeColor = calculateColor(visuals, node);
+    borderColor = calculateBorderColor(borderColorSaturation, thisNodeColor);
+  }
+
+  node.setVisual('borderColor', borderColor);
+  var viewChildren = node.viewChildren;
+
+  if (!viewChildren || !viewChildren.length) {
+    thisNodeColor = calculateColor(visuals, node); // Apply visual to this node.
+
+    node.setVisual('color', thisNodeColor);
+  } else {
+    var mapping = buildVisualMapping(node, nodeModel, nodeLayout, nodeItemStyleModel, visuals, viewChildren); // Designate visual to children.
+
+    each$1(viewChildren, function (child, index) {
+      // If higher than viewRoot, only ancestors of viewRoot is needed to visit.
+      if (child.depth >= viewRootAncestors.length || child === viewRootAncestors[child.depth]) {
+        var childVisual = mapVisual(nodeModel, visuals, child, index, mapping, seriesModel);
+        travelTree(child, childVisual, levelItemStyles, seriesItemStyleModel, viewRootAncestors, seriesModel);
+      }
+    });
+  }
+}
+
+function buildVisuals(nodeItemStyleModel, designatedVisual, levelItemStyle, seriesItemStyleModel) {
+  var visuals = extend({}, designatedVisual);
+  each$1(['color', 'colorAlpha', 'colorSaturation'], function (visualName) {
+    // Priority: thisNode > thisLevel > parentNodeDesignated > seriesModel
+    var val = nodeItemStyleModel.get(visualName, true); // Ignore parent
+
+    val == null && levelItemStyle && (val = levelItemStyle[visualName]);
+    val == null && (val = designatedVisual[visualName]);
+    val == null && (val = seriesItemStyleModel.get(visualName));
+    val != null && (visuals[visualName] = val);
+  });
+  return visuals;
+}
+
+function calculateColor(visuals) {
+  var color = getValueVisualDefine(visuals, 'color');
+
+  if (color) {
+    var colorAlpha = getValueVisualDefine(visuals, 'colorAlpha');
+    var colorSaturation = getValueVisualDefine(visuals, 'colorSaturation');
+
+    if (colorSaturation) {
+      color = modifyHSL(color, null, null, colorSaturation);
+    }
+
+    if (colorAlpha) {
+      color = modifyAlpha(color, colorAlpha);
+    }
+
+    return color;
+  }
+}
+
+function calculateBorderColor(borderColorSaturation, thisNodeColor) {
+  return thisNodeColor != null ? modifyHSL(thisNodeColor, null, null, borderColorSaturation) : null;
+}
+
+function getValueVisualDefine(visuals, name) {
+  var value = visuals[name];
+
+  if (value != null && value !== 'none') {
+    return value;
+  }
+}
+
+function buildVisualMapping(node, nodeModel, nodeLayout, nodeItemStyleModel, visuals, viewChildren) {
+  if (!viewChildren || !viewChildren.length) {
+    return;
+  }
+
+  var rangeVisual = getRangeVisual(nodeModel, 'color') || visuals.color != null && visuals.color !== 'none' && (getRangeVisual(nodeModel, 'colorAlpha') || getRangeVisual(nodeModel, 'colorSaturation'));
+
+  if (!rangeVisual) {
+    return;
+  }
+
+  var visualMin = nodeModel.get('visualMin');
+  var visualMax = nodeModel.get('visualMax');
+  var dataExtent = nodeLayout.dataExtent.slice();
+  visualMin != null && visualMin < dataExtent[0] && (dataExtent[0] = visualMin);
+  visualMax != null && visualMax > dataExtent[1] && (dataExtent[1] = visualMax);
+  var colorMappingBy = nodeModel.get('colorMappingBy');
+  var opt = {
+    type: rangeVisual.name,
+    dataExtent: dataExtent,
+    visual: rangeVisual.range
+  };
+
+  if (opt.type === 'color' && (colorMappingBy === 'index' || colorMappingBy === 'id')) {
+    opt.mappingMethod = 'category';
+    opt.loop = true; // categories is ordinal, so do not set opt.categories.
+  } else {
+    opt.mappingMethod = 'linear';
+  }
+
+  var mapping = new VisualMapping(opt);
+  mapping.__drColorMappingBy = colorMappingBy;
+  return mapping;
+} // Notice: If we dont have the attribute 'colorRange', but only use
+// attribute 'color' to represent both concepts of 'colorRange' and 'color',
+// (It means 'colorRange' when 'color' is Array, means 'color' when not array),
+// this problem will be encountered:
+// If a level-1 node dont have children, and its siblings has children,
+// and colorRange is set on level-1, then the node can not be colored.
+// So we separate 'colorRange' and 'color' to different attributes.
+
+
+function getRangeVisual(nodeModel, name) {
+  // 'colorRange', 'colorARange', 'colorSRange'.
+  // If not exsits on this node, fetch from levels and series.
+  var range = nodeModel.get(name);
+  return isArray$2(range) && range.length ? {
+    name: name,
+    range: range
+  } : null;
+}
+
+function mapVisual(nodeModel, visuals, child, index, mapping, seriesModel) {
+  var childVisuals = extend({}, visuals);
+
+  if (mapping) {
+    var mappingType = mapping.type;
+    var colorMappingBy = mappingType === 'color' && mapping.__drColorMappingBy;
+    var value = colorMappingBy === 'index' ? index : colorMappingBy === 'id' ? seriesModel.mapIdToIndex(child.getId()) : child.getValue(nodeModel.get('visualDimension'));
+    childVisuals[mappingType] = mapping.mapValueToVisual(value);
+  }
+
+  return childVisuals;
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/*
+* The treemap layout implementation references to the treemap
+* layout of d3.js (d3/src/layout/treemap.js in v3). The use of
+* the source code of this file is also subject to the terms
+* and consitions of its license (BSD-3Clause, see
+* <echarts/src/licenses/LICENSE-d3>).
+*/
+var mathMax$4 = Math.max;
+var mathMin$4 = Math.min;
+var retrieveValue = retrieve;
+var each$10 = each$1;
+var PATH_BORDER_WIDTH = ['itemStyle', 'borderWidth'];
+var PATH_GAP_WIDTH = ['itemStyle', 'gapWidth'];
+var PATH_UPPER_LABEL_SHOW = ['upperLabel', 'show'];
+var PATH_UPPER_LABEL_HEIGHT = ['upperLabel', 'height'];
+/**
+ * @public
+ */
+
+var treemapLayout = {
+  seriesType: 'treemap',
+  reset: function (seriesModel, ecModel, api, payload) {
+    // Layout result in each node:
+    // {x, y, width, height, area, borderWidth}
+    var ecWidth = api.getWidth();
+    var ecHeight = api.getHeight();
+    var seriesOption = seriesModel.option;
+    var layoutInfo = getLayoutRect(seriesModel.getBoxLayoutParams(), {
+      width: api.getWidth(),
+      height: api.getHeight()
+    });
+    var size = seriesOption.size || []; // Compatible with ec2.
+
+    var containerWidth = parsePercent$1(retrieveValue(layoutInfo.width, size[0]), ecWidth);
+    var containerHeight = parsePercent$1(retrieveValue(layoutInfo.height, size[1]), ecHeight); // Fetch payload info.
+
+    var payloadType = payload && payload.type;
+    var types = ['treemapZoomToNode', 'treemapRootToNode'];
+    var targetInfo = retrieveTargetInfo(payload, types, seriesModel);
+    var rootRect = payloadType === 'treemapRender' || payloadType === 'treemapMove' ? payload.rootRect : null;
+    var viewRoot = seriesModel.getViewRoot();
+    var viewAbovePath = getPathToRoot(viewRoot);
+
+    if (payloadType !== 'treemapMove') {
+      var rootSize = payloadType === 'treemapZoomToNode' ? estimateRootSize(seriesModel, targetInfo, viewRoot, containerWidth, containerHeight) : rootRect ? [rootRect.width, rootRect.height] : [containerWidth, containerHeight];
+      var sort = seriesOption.sort;
+
+      if (sort && sort !== 'asc' && sort !== 'desc') {
+        sort = 'desc';
+      }
+
+      var options = {
+        squareRatio: seriesOption.squareRatio,
+        sort: sort,
+        leafDepth: seriesOption.leafDepth
+      }; // layout should be cleared because using updateView but not update.
+
+      viewRoot.hostTree.clearLayouts(); // TODO
+      // optimize: if out of view clip, do not layout.
+      // But take care that if do not render node out of view clip,
+      // how to calculate start po
+
+      var viewRootLayout = {
+        x: 0,
+        y: 0,
+        width: rootSize[0],
+        height: rootSize[1],
+        area: rootSize[0] * rootSize[1]
+      };
+      viewRoot.setLayout(viewRootLayout);
+      squarify(viewRoot, options, false, 0); // Supplement layout.
+
+      var viewRootLayout = viewRoot.getLayout();
+      each$10(viewAbovePath, function (node, index) {
+        var childValue = (viewAbovePath[index + 1] || viewRoot).getValue();
+        node.setLayout(extend({
+          dataExtent: [childValue, childValue],
+          borderWidth: 0,
+          upperHeight: 0
+        }, viewRootLayout));
+      });
+    }
+
+    var treeRoot = seriesModel.getData().tree.root;
+    treeRoot.setLayout(calculateRootPosition(layoutInfo, rootRect, targetInfo), true);
+    seriesModel.setLayoutInfo(layoutInfo); // FIXME
+    // 鐜板湪娌℃湁clip鍔熻兘锛屾殏鏃跺彇ec楂樺銆�
+
+    prunning(treeRoot, // Transform to index element coordinate system.
+    new BoundingRect(-layoutInfo.x, -layoutInfo.y, ecWidth, ecHeight), viewAbovePath, viewRoot, 0);
+  }
+};
+/**
+ * Layout treemap with squarify algorithm.
+ * @see https://graphics.ethz.ch/teaching/scivis_common/Literature/squarifiedTreeMaps.pdf
+ * The implementation references to the treemap layout of d3.js.
+ * See the license statement at the head of this file.
+ *
+ * @protected
+ * @param {module:echarts/data/Tree~TreeNode} node
+ * @param {Object} options
+ * @param {string} options.sort 'asc' or 'desc'
+ * @param {number} options.squareRatio
+ * @param {boolean} hideChildren
+ * @param {number} depth
+ */
+
+function squarify(node, options, hideChildren, depth) {
+  var width;
+  var height;
+
+  if (node.isRemoved()) {
+    return;
+  }
+
+  var thisLayout = node.getLayout();
+  width = thisLayout.width;
+  height = thisLayout.height; // Considering border and gap
+
+  var nodeModel = node.getModel();
+  var borderWidth = nodeModel.get(PATH_BORDER_WIDTH);
+  var halfGapWidth = nodeModel.get(PATH_GAP_WIDTH) / 2;
+  var upperLabelHeight = getUpperLabelHeight(nodeModel);
+  var upperHeight = Math.max(borderWidth, upperLabelHeight);
+  var layoutOffset = borderWidth - halfGapWidth;
+  var layoutOffsetUpper = upperHeight - halfGapWidth;
+  var nodeModel = node.getModel();
+  node.setLayout({
+    borderWidth: borderWidth,
+    upperHeight: upperHeight,
+    upperLabelHeight: upperLabelHeight
+  }, true);
+  width = mathMax$4(width - 2 * layoutOffset, 0);
+  height = mathMax$4(height - layoutOffset - layoutOffsetUpper, 0);
+  var totalArea = width * height;
+  var viewChildren = initChildren(node, nodeModel, totalArea, options, hideChildren, depth);
+
+  if (!viewChildren.length) {
+    return;
+  }
+
+  var rect = {
+    x: layoutOffset,
+    y: layoutOffsetUpper,
+    width: width,
+    height: height
+  };
+  var rowFixedLength = mathMin$4(width, height);
+  var best = Infinity; // the best row score so far
+
+  var row = [];
+  row.area = 0;
+
+  for (var i = 0, len = viewChildren.length; i < len;) {
+    var child = viewChildren[i];
+    row.push(child);
+    row.area += child.getLayout().area;
+    var score = worst(row, rowFixedLength, options.squareRatio); // continue with this orientation
+
+    if (score <= best) {
+      i++;
+      best = score;
+    } // abort, and try a different orientation
+    else {
+        row.area -= row.pop().getLayout().area;
+        position(row, rowFixedLength, rect, halfGapWidth, false);
+        rowFixedLength = mathMin$4(rect.width, rect.height);
+        row.length = row.area = 0;
+        best = Infinity;
+      }
+  }
+
+  if (row.length) {
+    position(row, rowFixedLength, rect, halfGapWidth, true);
+  }
+
+  if (!hideChildren) {
+    var childrenVisibleMin = nodeModel.get('childrenVisibleMin');
+
+    if (childrenVisibleMin != null && totalArea < childrenVisibleMin) {
+      hideChildren = true;
+    }
+  }
+
+  for (var i = 0, len = viewChildren.length; i < len; i++) {
+    squarify(viewChildren[i], options, hideChildren, depth + 1);
+  }
+}
+/**
+ * Set area to each child, and calculate data extent for visual coding.
+ */
+
+
+function initChildren(node, nodeModel, totalArea, options, hideChildren, depth) {
+  var viewChildren = node.children || [];
+  var orderBy = options.sort;
+  orderBy !== 'asc' && orderBy !== 'desc' && (orderBy = null);
+  var overLeafDepth = options.leafDepth != null && options.leafDepth <= depth; // leafDepth has higher priority.
+
+  if (hideChildren && !overLeafDepth) {
+    return node.viewChildren = [];
+  } // Sort children, order by desc.
+
+
+  viewChildren = filter(viewChildren, function (child) {
+    return !child.isRemoved();
+  });
+  sort$1(viewChildren, orderBy);
+  var info = statistic(nodeModel, viewChildren, orderBy);
+
+  if (info.sum === 0) {
+    return node.viewChildren = [];
+  }
+
+  info.sum = filterByThreshold(nodeModel, totalArea, info.sum, orderBy, viewChildren);
+
+  if (info.sum === 0) {
+    return node.viewChildren = [];
+  } // Set area to each child.
+
+
+  for (var i = 0, len = viewChildren.length; i < len; i++) {
+    var area = viewChildren[i].getValue() / info.sum * totalArea; // Do not use setLayout({...}, true), because it is needed to clear last layout.
+
+    viewChildren[i].setLayout({
+      area: area
+    });
+  }
+
+  if (overLeafDepth) {
+    viewChildren.length && node.setLayout({
+      isLeafRoot: true
+    }, true);
+    viewChildren.length = 0;
+  }
+
+  node.viewChildren = viewChildren;
+  node.setLayout({
+    dataExtent: info.dataExtent
+  }, true);
+  return viewChildren;
+}
+/**
+ * Consider 'visibleMin'. Modify viewChildren and get new sum.
+ */
+
+
+function filterByThreshold(nodeModel, totalArea, sum, orderBy, orderedChildren) {
+  // visibleMin is not supported yet when no option.sort.
+  if (!orderBy) {
+    return sum;
+  }
+
+  var visibleMin = nodeModel.get('visibleMin');
+  var len = orderedChildren.length;
+  var deletePoint = len; // Always travel from little value to big value.
+
+  for (var i = len - 1; i >= 0; i--) {
+    var value = orderedChildren[orderBy === 'asc' ? len - i - 1 : i].getValue();
+
+    if (value / sum * totalArea < visibleMin) {
+      deletePoint = i;
+      sum -= value;
+    }
+  }
+
+  orderBy === 'asc' ? orderedChildren.splice(0, len - deletePoint) : orderedChildren.splice(deletePoint, len - deletePoint);
+  return sum;
+}
+/**
+ * Sort
+ */
+
+
+function sort$1(viewChildren, orderBy) {
+  if (orderBy) {
+    viewChildren.sort(function (a, b) {
+      var diff = orderBy === 'asc' ? a.getValue() - b.getValue() : b.getValue() - a.getValue();
+      return diff === 0 ? orderBy === 'asc' ? a.dataIndex - b.dataIndex : b.dataIndex - a.dataIndex : diff;
+    });
+  }
+
+  return viewChildren;
+}
+/**
+ * Statistic
+ */
+
+
+function statistic(nodeModel, children, orderBy) {
+  // Calculate sum.
+  var sum = 0;
+
+  for (var i = 0, len = children.length; i < len; i++) {
+    sum += children[i].getValue();
+  } // Statistic data extent for latter visual coding.
+  // Notice: data extent should be calculate based on raw children
+  // but not filtered view children, otherwise visual mapping will not
+  // be stable when zoom (where children is filtered by visibleMin).
+
+
+  var dimension = nodeModel.get('visualDimension');
+  var dataExtent; // The same as area dimension.
+
+  if (!children || !children.length) {
+    dataExtent = [NaN, NaN];
+  } else if (dimension === 'value' && orderBy) {
+    dataExtent = [children[children.length - 1].getValue(), children[0].getValue()];
+    orderBy === 'asc' && dataExtent.reverse();
+  } // Other dimension.
+  else {
+      var dataExtent = [Infinity, -Infinity];
+      each$10(children, function (child) {
+        var value = child.getValue(dimension);
+        value < dataExtent[0] && (dataExtent[0] = value);
+        value > dataExtent[1] && (dataExtent[1] = value);
+      });
+    }
+
+  return {
+    sum: sum,
+    dataExtent: dataExtent
+  };
+}
+/**
+ * Computes the score for the specified row,
+ * as the worst aspect ratio.
+ */
+
+
+function worst(row, rowFixedLength, ratio) {
+  var areaMax = 0;
+  var areaMin = Infinity;
+
+  for (var i = 0, area, len = row.length; i < len; i++) {
+    area = row[i].getLayout().area;
+
+    if (area) {
+      area < areaMin && (areaMin = area);
+      area > areaMax && (areaMax = area);
+    }
+  }
+
+  var squareArea = row.area * row.area;
+  var f = rowFixedLength * rowFixedLength * ratio;
+  return squareArea ? mathMax$4(f * areaMax / squareArea, squareArea / (f * areaMin)) : Infinity;
+}
+/**
+ * Positions the specified row of nodes. Modifies `rect`.
+ */
+
+
+function position(row, rowFixedLength, rect, halfGapWidth, flush) {
+  // When rowFixedLength === rect.width,
+  // it is horizontal subdivision,
+  // rowFixedLength is the width of the subdivision,
+  // rowOtherLength is the height of the subdivision,
+  // and nodes will be positioned from left to right.
+  // wh[idx0WhenH] means: when horizontal,
+  //      wh[idx0WhenH] => wh[0] => 'width'.
+  //      xy[idx1WhenH] => xy[1] => 'y'.
+  var idx0WhenH = rowFixedLength === rect.width ? 0 : 1;
+  var idx1WhenH = 1 - idx0WhenH;
+  var xy = ['x', 'y'];
+  var wh = ['width', 'height'];
+  var last = rect[xy[idx0WhenH]];
+  var rowOtherLength = rowFixedLength ? row.area / rowFixedLength : 0;
+
+  if (flush || rowOtherLength > rect[wh[idx1WhenH]]) {
+    rowOtherLength = rect[wh[idx1WhenH]]; // over+underflow
+  }
+
+  for (var i = 0, rowLen = row.length; i < rowLen; i++) {
+    var node = row[i];
+    var nodeLayout = {};
+    var step = rowOtherLength ? node.getLayout().area / rowOtherLength : 0;
+    var wh1 = nodeLayout[wh[idx1WhenH]] = mathMax$4(rowOtherLength - 2 * halfGapWidth, 0); // We use Math.max/min to avoid negative width/height when considering gap width.
+
+    var remain = rect[xy[idx0WhenH]] + rect[wh[idx0WhenH]] - last;
+    var modWH = i === rowLen - 1 || remain < step ? remain : step;
+    var wh0 = nodeLayout[wh[idx0WhenH]] = mathMax$4(modWH - 2 * halfGapWidth, 0);
+    nodeLayout[xy[idx1WhenH]] = rect[xy[idx1WhenH]] + mathMin$4(halfGapWidth, wh1 / 2);
+    nodeLayout[xy[idx0WhenH]] = last + mathMin$4(halfGapWidth, wh0 / 2);
+    last += modWH;
+    node.setLayout(nodeLayout, true);
+  }
+
+  rect[xy[idx1WhenH]] += rowOtherLength;
+  rect[wh[idx1WhenH]] -= rowOtherLength;
+} // Return [containerWidth, containerHeight] as defualt.
+
+
+function estimateRootSize(seriesModel, targetInfo, viewRoot, containerWidth, containerHeight) {
+  // If targetInfo.node exists, we zoom to the node,
+  // so estimate whold width and heigth by target node.
+  var currNode = (targetInfo || {}).node;
+  var defaultSize = [containerWidth, containerHeight];
+
+  if (!currNode || currNode === viewRoot) {
+    return defaultSize;
+  }
+
+  var parent;
+  var viewArea = containerWidth * containerHeight;
+  var area = viewArea * seriesModel.option.zoomToNodeRatio;
+
+  while (parent = currNode.parentNode) {
+    // jshint ignore:line
+    var sum = 0;
+    var siblings = parent.children;
+
+    for (var i = 0, len = siblings.length; i < len; i++) {
+      sum += siblings[i].getValue();
+    }
+
+    var currNodeValue = currNode.getValue();
+
+    if (currNodeValue === 0) {
+      return defaultSize;
+    }
+
+    area *= sum / currNodeValue; // Considering border, suppose aspect ratio is 1.
+
+    var parentModel = parent.getModel();
+    var borderWidth = parentModel.get(PATH_BORDER_WIDTH);
+    var upperHeight = Math.max(borderWidth, getUpperLabelHeight(parentModel, borderWidth));
+    area += 4 * borderWidth * borderWidth + (3 * borderWidth + upperHeight) * Math.pow(area, 0.5);
+    area > MAX_SAFE_INTEGER && (area = MAX_SAFE_INTEGER);
+    currNode = parent;
+  }
+
+  area < viewArea && (area = viewArea);
+  var scale = Math.pow(area / viewArea, 0.5);
+  return [containerWidth * scale, containerHeight * scale];
+} // Root postion index on coord of containerGroup
+
+
+function calculateRootPosition(layoutInfo, rootRect, targetInfo) {
+  if (rootRect) {
+    return {
+      x: rootRect.x,
+      y: rootRect.y
+    };
+  }
+
+  var defaultPosition = {
+    x: 0,
+    y: 0
+  };
+
+  if (!targetInfo) {
+    return defaultPosition;
+  } // If targetInfo is fetched by 'retrieveTargetInfo',
+  // old tree and new tree are the same tree,
+  // so the node still exists and we can visit it.
+
+
+  var targetNode = targetInfo.node;
+  var layout = targetNode.getLayout();
+
+  if (!layout) {
+    return defaultPosition;
+  } // Transform coord from local to container.
+
+
+  var targetCenter = [layout.width / 2, layout.height / 2];
+  var node = targetNode;
+
+  while (node) {
+    var nodeLayout = node.getLayout();
+    targetCenter[0] += nodeLayout.x;
+    targetCenter[1] += nodeLayout.y;
+    node = node.parentNode;
+  }
+
+  return {
+    x: layoutInfo.width / 2 - targetCenter[0],
+    y: layoutInfo.height / 2 - targetCenter[1]
+  };
+} // Mark nodes visible for prunning when visual coding and rendering.
+// Prunning depends on layout and root position, so we have to do it after layout.
+
+
+function prunning(node, clipRect, viewAbovePath, viewRoot, depth) {
+  var nodeLayout = node.getLayout();
+  var nodeInViewAbovePath = viewAbovePath[depth];
+  var isAboveViewRoot = nodeInViewAbovePath && nodeInViewAbovePath === node;
+
+  if (nodeInViewAbovePath && !isAboveViewRoot || depth === viewAbovePath.length && node !== viewRoot) {
+    return;
+  }
+
+  node.setLayout({
+    // isInView means: viewRoot sub tree + viewAbovePath
+    isInView: true,
+    // invisible only means: outside view clip so that the node can not
+    // see but still layout for animation preparation but not render.
+    invisible: !isAboveViewRoot && !clipRect.intersect(nodeLayout),
+    isAboveViewRoot: isAboveViewRoot
+  }, true); // Transform to child coordinate.
+
+  var childClipRect = new BoundingRect(clipRect.x - nodeLayout.x, clipRect.y - nodeLayout.y, clipRect.width, clipRect.height);
+  each$10(node.viewChildren || [], function (child) {
+    prunning(child, childClipRect, viewAbovePath, viewRoot, depth + 1);
+  });
+}
+
+function getUpperLabelHeight(model) {
+  return model.get(PATH_UPPER_LABEL_SHOW) ? model.get(PATH_UPPER_LABEL_HEIGHT) : 0;
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+registerVisual(treemapVisual);
+registerLayout(treemapLayout);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+SeriesModel.extend({
+  type: 'series.sunburst',
+
+  /**
+   * @type {module:echarts/data/Tree~Node}
+   */
+  _viewRoot: null,
+  getInitialData: function (option, ecModel) {
+    // Create a virtual root.
+    var root = {
+      name: option.name,
+      children: option.data
+    };
+    completeTreeValue$1(root);
+    var levels = option.levels || []; // levels = option.levels = setDefault(levels, ecModel);
+
+    var treeOption = {};
+    treeOption.levels = levels; // Make sure always a new tree is created when setOption,
+    // in TreemapView, we check whether oldTree === newTree
+    // to choose mappings approach among old shapes and new shapes.
+
+    return Tree.createTree(root, this, treeOption).data;
+  },
+  optionUpdated: function () {
+    this.resetViewRoot();
+  },
+
+  /*
+   * @override
+   */
+  getDataParams: function (dataIndex) {
+    var params = SeriesModel.prototype.getDataParams.apply(this, arguments);
+    var node = this.getData().tree.getNodeByDataIndex(dataIndex);
+    params.treePathInfo = wrapTreePathInfo(node, this);
+    return params;
+  },
+  defaultOption: {
+    zlevel: 0,
+    z: 2,
+    // 榛樿鍏ㄥ眬灞呬腑
+    center: ['50%', '50%'],
+    radius: [0, '75%'],
+    // 榛樿椤烘椂閽�
+    clockwise: true,
+    startAngle: 90,
+    // 鏈�灏忚搴︽敼涓�0
+    minAngle: 0,
+    percentPrecision: 2,
+    // If still show when all data zero.
+    stillShowZeroSum: true,
+    // Policy of highlighting pieces when hover on one
+    // Valid values: 'none' (for not downplay others), 'descendant',
+    // 'ancestor', 'self'
+    highlightPolicy: 'descendant',
+    // 'rootToNode', 'link', or false
+    nodeClick: 'rootToNode',
+    renderLabelForZeroData: false,
+    label: {
+      // could be: 'radial', 'tangential', or 'none'
+      rotate: 'radial',
+      show: true,
+      opacity: 1,
+      // 'left' is for inner side of inside, and 'right' is for outter
+      // side for inside
+      align: 'center',
+      position: 'inside',
+      distance: 5,
+      silent: true,
+      emphasis: {}
+    },
+    itemStyle: {
+      borderWidth: 1,
+      borderColor: 'white',
+      borderType: 'solid',
+      shadowBlur: 0,
+      shadowColor: 'rgba(0, 0, 0, 0.2)',
+      shadowOffsetX: 0,
+      shadowOffsetY: 0,
+      opacity: 1,
+      emphasis: {},
+      highlight: {
+        opacity: 1
+      },
+      downplay: {
+        opacity: 0.9
+      }
+    },
+    // Animation type canbe expansion, scale
+    animationType: 'expansion',
+    animationDuration: 1000,
+    animationDurationUpdate: 500,
+    animationEasing: 'cubicOut',
+    data: [],
+    levels: [],
+
+    /**
+     * Sort order.
+     *
+     * Valid values: 'desc', 'asc', null, or callback function.
+     * 'desc' and 'asc' for descend and ascendant order;
+     * null for not sorting;
+     * example of callback function:
+     * function(nodeA, nodeB) {
+     *     return nodeA.getValue() - nodeB.getValue();
+     * }
+     */
+    sort: 'desc'
+  },
+  getViewRoot: function () {
+    return this._viewRoot;
+  },
+
+  /**
+   * @param {module:echarts/data/Tree~Node} [viewRoot]
+   */
+  resetViewRoot: function (viewRoot) {
+    viewRoot ? this._viewRoot = viewRoot : viewRoot = this._viewRoot;
+    var root = this.getRawData().tree.root;
+
+    if (!viewRoot || viewRoot !== root && !root.contains(viewRoot)) {
+      this._viewRoot = root;
+    }
+  }
+});
+/**
+ * @param {Object} dataNode
+ */
+
+function completeTreeValue$1(dataNode) {
+  // Postorder travel tree.
+  // If value of none-leaf node is not set,
+  // calculate it by suming up the value of all children.
+  var sum = 0;
+  each$1(dataNode.children, function (child) {
+    completeTreeValue$1(child);
+    var childValue = child.value;
+    isArray(childValue) && (childValue = childValue[0]);
+    sum += childValue;
+  });
+  var thisValue = dataNode.value;
+
+  if (isArray(thisValue)) {
+    thisValue = thisValue[0];
+  }
+
+  if (thisValue == null || isNaN(thisValue)) {
+    thisValue = sum;
+  } // Value should not less than 0.
+
+
+  if (thisValue < 0) {
+    thisValue = 0;
+  }
+
+  isArray(dataNode.value) ? dataNode.value[0] = thisValue : dataNode.value = thisValue;
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var NodeHighlightPolicy = {
+  NONE: 'none',
+  // not downplay others
+  DESCENDANT: 'descendant',
+  ANCESTOR: 'ancestor',
+  SELF: 'self'
+};
+var DEFAULT_SECTOR_Z = 2;
+var DEFAULT_TEXT_Z = 4;
+/**
+ * Sunburstce of Sunburst including Sector, Label, LabelLine
+ * @constructor
+ * @extends {module:zrender/graphic/Group}
+ */
+
+function SunburstPiece(node, seriesModel, ecModel) {
+  Group.call(this);
+  var sector = new Sector({
+    z2: DEFAULT_SECTOR_Z
+  });
+  sector.seriesIndex = seriesModel.seriesIndex;
+  var text = new Text({
+    z2: DEFAULT_TEXT_Z,
+    silent: node.getModel('label').get('silent')
+  });
+  this.add(sector);
+  this.add(text);
+  this.updateData(true, node, 'normal', seriesModel, ecModel); // Hover to change label and labelLine
+
+  function onEmphasis() {
+    text.ignore = text.hoverIgnore;
+  }
+
+  function onNormal() {
+    text.ignore = text.normalIgnore;
+  }
+
+  this.on('emphasis', onEmphasis).on('normal', onNormal).on('mouseover', onEmphasis).on('mouseout', onNormal);
+}
+
+var SunburstPieceProto = SunburstPiece.prototype;
+
+SunburstPieceProto.updateData = function (firstCreate, node, state, seriesModel, ecModel) {
+  this.node = node;
+  node.piece = this;
+  seriesModel = seriesModel || this._seriesModel;
+  ecModel = ecModel || this._ecModel;
+  var sector = this.childAt(0);
+  sector.dataIndex = node.dataIndex;
+  var itemModel = node.getModel();
+  var layout = node.getLayout();
+
+  if (!layout) {
+    console.log(node.getLayout());
+  }
+
+  var sectorShape = extend({}, layout);
+  sectorShape.label = null;
+  var visualColor = getNodeColor(node, seriesModel, ecModel);
+  var normalStyle = itemModel.getModel('itemStyle').getItemStyle();
+  var style;
+
+  if (state === 'normal') {
+    style = normalStyle;
+  } else {
+    var stateStyle = itemModel.getModel(state + '.itemStyle').getItemStyle();
+    style = merge(stateStyle, normalStyle);
+  }
+
+  style = defaults({
+    lineJoin: 'bevel',
+    fill: style.fill || visualColor
+  }, style);
+
+  if (firstCreate) {
+    sector.setShape(sectorShape);
+    sector.shape.r = layout.r0;
+    updateProps(sector, {
+      shape: {
+        r: layout.r
+      }
+    }, seriesModel, node.dataIndex);
+    sector.useStyle(style);
+  } else if (typeof style.fill === 'object' && style.fill.type || typeof sector.style.fill === 'object' && sector.style.fill.type) {
+    // Disable animation for gradient since no interpolation method
+    // is supported for gradient
+    updateProps(sector, {
+      shape: sectorShape
+    }, seriesModel);
+    sector.useStyle(style);
+  } else {
+    updateProps(sector, {
+      shape: sectorShape,
+      style: style
+    }, seriesModel);
+  }
+
+  this._updateLabel(seriesModel, visualColor, state);
+
+  var cursorStyle = itemModel.getShallow('cursor');
+  cursorStyle && sector.attr('cursor', cursorStyle);
+
+  if (firstCreate) {
+    var highlightPolicy = seriesModel.getShallow('highlightPolicy');
+
+    this._initEvents(sector, node, seriesModel, highlightPolicy);
+  }
+
+  this._seriesModel = seriesModel || this._seriesModel;
+  this._ecModel = ecModel || this._ecModel;
+};
+
+SunburstPieceProto.onEmphasis = function (highlightPolicy) {
+  var that = this;
+  this.node.hostTree.root.eachNode(function (n) {
+    if (n.piece) {
+      if (that.node === n) {
+        n.piece.updateData(false, n, 'emphasis');
+      } else if (isNodeHighlighted(n, that.node, highlightPolicy)) {
+        n.piece.childAt(0).trigger('highlight');
+      } else if (highlightPolicy !== NodeHighlightPolicy.NONE) {
+        n.piece.childAt(0).trigger('downplay');
+      }
+    }
+  });
+};
+
+SunburstPieceProto.onNormal = function () {
+  this.node.hostTree.root.eachNode(function (n) {
+    if (n.piece) {
+      n.piece.updateData(false, n, 'normal');
+    }
+  });
+};
+
+SunburstPieceProto.onHighlight = function () {
+  this.updateData(false, this.node, 'highlight');
+};
+
+SunburstPieceProto.onDownplay = function () {
+  this.updateData(false, this.node, 'downplay');
+};
+
+SunburstPieceProto._updateLabel = function (seriesModel, visualColor, state) {
+  var itemModel = this.node.getModel();
+  var normalModel = itemModel.getModel('label');
+  var labelModel = state === 'normal' || state === 'emphasis' ? normalModel : itemModel.getModel(state + '.label');
+  var labelHoverModel = itemModel.getModel('emphasis.label');
+  var text = retrieve(seriesModel.getFormattedLabel(this.node.dataIndex, 'normal', null, null, 'label'), this.node.name);
+
+  if (getLabelAttr('show') === false) {
+    text = '';
+  }
+
+  var layout = this.node.getLayout();
+  var labelMinAngle = labelModel.get('minAngle');
+
+  if (labelMinAngle == null) {
+    labelMinAngle = normalModel.get('minAngle');
+  }
+
+  labelMinAngle = labelMinAngle / 180 * Math.PI;
+  var angle = layout.endAngle - layout.startAngle;
+
+  if (labelMinAngle != null && Math.abs(angle) < labelMinAngle) {
+    // Not displaying text when angle is too small
+    text = '';
+  }
+
+  var label = this.childAt(1);
+  setLabelStyle(label.style, label.hoverStyle || {}, normalModel, labelHoverModel, {
+    defaultText: labelModel.getShallow('show') ? text : null,
+    autoColor: visualColor,
+    useInsideStyle: true
+  });
+  var midAngle = (layout.startAngle + layout.endAngle) / 2;
+  var dx = Math.cos(midAngle);
+  var dy = Math.sin(midAngle);
+  var r;
+  var labelPosition = getLabelAttr('position');
+  var labelPadding = getLabelAttr('distance') || 0;
+  var textAlign = getLabelAttr('align');
+
+  if (labelPosition === 'outside') {
+    r = layout.r + labelPadding;
+    textAlign = midAngle > Math.PI / 2 ? 'right' : 'left';
+  } else {
+    if (!textAlign || textAlign === 'center') {
+      r = (layout.r + layout.r0) / 2;
+      textAlign = 'center';
+    } else if (textAlign === 'left') {
+      r = layout.r0 + labelPadding;
+
+      if (midAngle > Math.PI / 2) {
+        textAlign = 'right';
+      }
+    } else if (textAlign === 'right') {
+      r = layout.r - labelPadding;
+
+      if (midAngle > Math.PI / 2) {
+        textAlign = 'left';
+      }
+    }
+  }
+
+  label.attr('style', {
+    text: text,
+    textAlign: textAlign,
+    textVerticalAlign: getLabelAttr('verticalAlign') || 'middle',
+    opacity: getLabelAttr('opacity')
+  });
+  var textX = r * dx + layout.cx;
+  var textY = r * dy + layout.cy;
+  label.attr('position', [textX, textY]);
+  var rotateType = getLabelAttr('rotate');
+  var rotate = 0;
+
+  if (rotateType === 'radial') {
+    rotate = -midAngle;
+
+    if (rotate < -Math.PI / 2) {
+      rotate += Math.PI;
+    }
+  } else if (rotateType === 'tangential') {
+    rotate = Math.PI / 2 - midAngle;
+
+    if (rotate > Math.PI / 2) {
+      rotate -= Math.PI;
+    } else if (rotate < -Math.PI / 2) {
+      rotate += Math.PI;
+    }
+  } else if (typeof rotateType === 'number') {
+    rotate = rotateType * Math.PI / 180;
+  }
+
+  label.attr('rotation', rotate);
+
+  function getLabelAttr(name) {
+    var stateAttr = labelModel.get(name);
+
+    if (stateAttr == null) {
+      return normalModel.get(name);
+    } else {
+      return stateAttr;
+    }
+  }
+};
+
+SunburstPieceProto._initEvents = function (sector, node, seriesModel, highlightPolicy) {
+  sector.off('mouseover').off('mouseout').off('emphasis').off('normal');
+  var that = this;
+
+  var onEmphasis = function () {
+    that.onEmphasis(highlightPolicy);
+  };
+
+  var onNormal = function () {
+    that.onNormal();
+  };
+
+  var onDownplay = function () {
+    that.onDownplay();
+  };
+
+  var onHighlight = function () {
+    that.onHighlight();
+  };
+
+  if (seriesModel.isAnimationEnabled()) {
+    sector.on('mouseover', onEmphasis).on('mouseout', onNormal).on('emphasis', onEmphasis).on('normal', onNormal).on('downplay', onDownplay).on('highlight', onHighlight);
+  }
+};
+
+inherits(SunburstPiece, Group);
+/**
+ * Get node color
+ *
+ * @param {TreeNode} node the node to get color
+ * @param {module:echarts/model/Series} seriesModel series
+ * @param {module:echarts/model/Global} ecModel echarts defaults
+ */
+
+function getNodeColor(node, seriesModel, ecModel) {
+  // Color from visualMap
+  var visualColor = node.getVisual('color');
+  var visualMetaList = node.getVisual('visualMeta');
+
+  if (!visualMetaList || visualMetaList.length === 0) {
+    // Use first-generation color if has no visualMap
+    visualColor = null;
+  } // Self color or level color
+
+
+  var color = node.getModel('itemStyle').get('color');
+
+  if (color) {
+    return color;
+  } else if (visualColor) {
+    // Color mapping
+    return visualColor;
+  } else if (node.depth === 0) {
+    // Virtual root node
+    return ecModel.option.color[0];
+  } else {
+    // First-generation color
+    var length = ecModel.option.color.length;
+    color = ecModel.option.color[getRootId(node) % length];
+  }
+
+  return color;
+}
+/**
+ * Get index of root in sorted order
+ *
+ * @param {TreeNode} node current node
+ * @return {number} index in root
+ */
+
+
+function getRootId(node) {
+  var ancestor = node;
+
+  while (ancestor.depth > 1) {
+    ancestor = ancestor.parentNode;
+  }
+
+  var virtualRoot = node.getAncestors()[0];
+  return indexOf(virtualRoot.children, ancestor);
+}
+
+function isNodeHighlighted(node, activeNode, policy) {
+  if (policy === NodeHighlightPolicy.NONE) {
+    return false;
+  } else if (policy === NodeHighlightPolicy.SELF) {
+    return node === activeNode;
+  } else if (policy === NodeHighlightPolicy.ANCESTOR) {
+    return node === activeNode || node.isAncestorOf(activeNode);
+  } else {
+    return node === activeNode || node.isDescendantOf(activeNode);
+  }
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var ROOT_TO_NODE_ACTION = 'sunburstRootToNode';
+var SunburstView = Chart.extend({
+  type: 'sunburst',
+  init: function () {},
+  render: function (seriesModel, ecModel, api, payload) {
+    var that = this;
+    this.seriesModel = seriesModel;
+    this.api = api;
+    this.ecModel = ecModel;
+    var data = seriesModel.getData();
+    var virtualRoot = data.tree.root;
+    var newRoot = seriesModel.getViewRoot();
+    var group = this.group;
+    var renderLabelForZeroData = seriesModel.get('renderLabelForZeroData');
+    var newChildren = [];
+    newRoot.eachNode(function (node) {
+      newChildren.push(node);
+    });
+    var oldChildren = this._oldChildren || [];
+    dualTravel(newChildren, oldChildren);
+    renderRollUp(virtualRoot, newRoot);
+
+    if (payload && payload.highlight && payload.highlight.piece) {
+      var highlightPolicy = seriesModel.getShallow('highlightPolicy');
+      payload.highlight.piece.onEmphasis(highlightPolicy);
+    } else if (payload && payload.unhighlight) {
+      var piece = this.virtualPiece;
+
+      if (!piece && virtualRoot.children.length) {
+        piece = virtualRoot.children[0].piece;
+      }
+
+      if (piece) {
+        piece.onNormal();
+      }
+    }
+
+    this._initEvents();
+
+    this._oldChildren = newChildren;
+
+    function dualTravel(newChildren, oldChildren) {
+      if (newChildren.length === 0 && oldChildren.length === 0) {
+        return;
+      }
+
+      new DataDiffer(oldChildren, newChildren, getKey, getKey).add(processNode).update(processNode).remove(curry(processNode, null)).execute();
+
+      function getKey(node) {
+        return node.getId();
+      }
+
+      function processNode(newId, oldId) {
+        var newNode = newId == null ? null : newChildren[newId];
+        var oldNode = oldId == null ? null : oldChildren[oldId];
+        doRenderNode(newNode, oldNode);
+      }
+    }
+
+    function doRenderNode(newNode, oldNode) {
+      if (!renderLabelForZeroData && newNode && !newNode.getValue()) {
+        // Not render data with value 0
+        newNode = null;
+      }
+
+      if (newNode !== virtualRoot && oldNode !== virtualRoot) {
+        if (oldNode && oldNode.piece) {
+          if (newNode) {
+            // Update
+            oldNode.piece.updateData(false, newNode, 'normal', seriesModel, ecModel); // For tooltip
+
+            data.setItemGraphicEl(newNode.dataIndex, oldNode.piece);
+          } else {
+            // Remove
+            removeNode(oldNode);
+          }
+        } else if (newNode) {
+          // Add
+          var piece = new SunburstPiece(newNode, seriesModel, ecModel);
+          group.add(piece); // For tooltip
+
+          data.setItemGraphicEl(newNode.dataIndex, piece);
+        }
+      }
+    }
+
+    function removeNode(node) {
+      if (!node) {
+        return;
+      }
+
+      if (node.piece) {
+        group.remove(node.piece);
+        node.piece = null;
+      }
+    }
+
+    function renderRollUp(virtualRoot, viewRoot) {
+      if (viewRoot.depth > 0) {
+        // Render
+        if (that.virtualPiece) {
+          // Update
+          that.virtualPiece.updateData(false, virtualRoot, 'normal', seriesModel, ecModel);
+        } else {
+          // Add
+          that.virtualPiece = new SunburstPiece(virtualRoot, seriesModel, ecModel);
+          group.add(that.virtualPiece);
+        }
+
+        if (viewRoot.piece._onclickEvent) {
+          viewRoot.piece.off('click', viewRoot.piece._onclickEvent);
+        }
+
+        var event = function (e) {
+          that._rootToNode(viewRoot.parentNode);
+        };
+
+        viewRoot.piece._onclickEvent = event;
+        that.virtualPiece.on('click', event);
+      } else if (that.virtualPiece) {
+        // Remove
+        group.remove(that.virtualPiece);
+        that.virtualPiece = null;
+      }
+    }
+  },
+  dispose: function () {},
+
+  /**
+   * @private
+   */
+  _initEvents: function () {
+    var that = this;
+
+    var event = function (e) {
+      var targetFound = false;
+      var viewRoot = that.seriesModel.getViewRoot();
+      viewRoot.eachNode(function (node) {
+        if (!targetFound && node.piece && node.piece.childAt(0) === e.target) {
+          var nodeClick = node.getModel().get('nodeClick');
+
+          if (nodeClick === 'rootToNode') {
+            that._rootToNode(node);
+          } else if (nodeClick === 'link') {
+            var itemModel = node.getModel();
+            var link = itemModel.get('link');
+
+            if (link) {
+              var linkTarget = itemModel.get('target', true) || '_blank';
+              window.open(link, linkTarget);
+            }
+          }
+
+          targetFound = true;
+        }
+      });
+    };
+
+    if (this.group._onclickEvent) {
+      this.group.off('click', this.group._onclickEvent);
+    }
+
+    this.group.on('click', event);
+    this.group._onclickEvent = event;
+  },
+
+  /**
+   * @private
+   */
+  _rootToNode: function (node) {
+    if (node !== this.seriesModel.getViewRoot()) {
+      this.api.dispatchAction({
+        type: ROOT_TO_NODE_ACTION,
+        from: this.uid,
+        seriesId: this.seriesModel.id,
+        targetNode: node
+      });
+    }
+  },
+
+  /**
+   * @implement
+   */
+  containPoint: function (point, seriesModel) {
+    var treeRoot = seriesModel.getData();
+    var itemLayout = treeRoot.getItemLayout(0);
+
+    if (itemLayout) {
+      var dx = point[0] - itemLayout.cx;
+      var dy = point[1] - itemLayout.cy;
+      var radius = Math.sqrt(dx * dx + dy * dy);
+      return radius <= itemLayout.r && radius >= itemLayout.r0;
+    }
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * @file Sunburst action
+ */
+var ROOT_TO_NODE_ACTION$1 = 'sunburstRootToNode';
+registerAction({
+  type: ROOT_TO_NODE_ACTION$1,
+  update: 'updateView'
+}, function (payload, ecModel) {
+  ecModel.eachComponent({
+    mainType: 'series',
+    subType: 'sunburst',
+    query: payload
+  }, handleRootToNode);
+
+  function handleRootToNode(model, index) {
+    var targetInfo = retrieveTargetInfo(payload, [ROOT_TO_NODE_ACTION$1], model);
+
+    if (targetInfo) {
+      var originViewRoot = model.getViewRoot();
+
+      if (originViewRoot) {
+        payload.direction = aboveViewRoot(originViewRoot, targetInfo.node) ? 'rollUp' : 'drillDown';
+      }
+
+      model.resetViewRoot(targetInfo.node);
+    }
+  }
+});
+var HIGHLIGHT_ACTION = 'sunburstHighlight';
+registerAction({
+  type: HIGHLIGHT_ACTION,
+  update: 'updateView'
+}, function (payload, ecModel) {
+  ecModel.eachComponent({
+    mainType: 'series',
+    subType: 'sunburst',
+    query: payload
+  }, handleHighlight);
+
+  function handleHighlight(model, index) {
+    var targetInfo = retrieveTargetInfo(payload, [HIGHLIGHT_ACTION], model);
+
+    if (targetInfo) {
+      payload.highlight = targetInfo.node;
+    }
+  }
+});
+var UNHIGHLIGHT_ACTION = 'sunburstUnhighlight';
+registerAction({
+  type: UNHIGHLIGHT_ACTION,
+  update: 'updateView'
+}, function (payload, ecModel) {
+  ecModel.eachComponent({
+    mainType: 'series',
+    subType: 'sunburst',
+    query: payload
+  }, handleUnhighlight);
+
+  function handleUnhighlight(model, index) {
+    payload.unhighlight = true;
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var RADIAN$1 = Math.PI / 180;
+var sunburstLayout = function (seriesType, ecModel, api, payload) {
+  ecModel.eachSeriesByType(seriesType, function (seriesModel) {
+    var center = seriesModel.get('center');
+    var radius = seriesModel.get('radius');
+
+    if (!isArray(radius)) {
+      radius = [0, radius];
+    }
+
+    if (!isArray(center)) {
+      center = [center, center];
+    }
+
+    var width = api.getWidth();
+    var height = api.getHeight();
+    var size = Math.min(width, height);
+    var cx = parsePercent$1(center[0], width);
+    var cy = parsePercent$1(center[1], height);
+    var r0 = parsePercent$1(radius[0], size / 2);
+    var r = parsePercent$1(radius[1], size / 2);
+    var startAngle = -seriesModel.get('startAngle') * RADIAN$1;
+    var minAngle = seriesModel.get('minAngle') * RADIAN$1;
+    var virtualRoot = seriesModel.getData().tree.root;
+    var treeRoot = seriesModel.getViewRoot();
+    var rootDepth = treeRoot.depth;
+    var sort = seriesModel.get('sort');
+
+    if (sort != null) {
+      initChildren$1(treeRoot, sort);
+    }
+
+    var validDataCount = 0;
+    each$1(treeRoot.children, function (child) {
+      !isNaN(child.getValue()) && validDataCount++;
+    });
+    var sum = treeRoot.getValue(); // Sum may be 0
+
+    var unitRadian = Math.PI / (sum || validDataCount) * 2;
+    var renderRollupNode = treeRoot.depth > 0;
+    var levels = treeRoot.height - (renderRollupNode ? -1 : 1);
+    var rPerLevel = (r - r0) / (levels || 1);
+    var clockwise = seriesModel.get('clockwise');
+    var stillShowZeroSum = seriesModel.get('stillShowZeroSum'); // In the case some sector angle is smaller than minAngle
+
+    var dir = clockwise ? 1 : -1;
+    /**
+     * Render a tree
+     * @return increased angle
+     */
+
+    var renderNode = function (node, startAngle) {
+      if (!node) {
+        return;
+      }
+
+      var endAngle = startAngle; // Render self
+
+      if (node !== virtualRoot) {
+        // Tree node is virtual, so it doesn't need to be drawn
+        var value = node.getValue();
+        var angle = sum === 0 && stillShowZeroSum ? unitRadian : value * unitRadian;
+
+        if (angle < minAngle) {
+          angle = minAngle;
+          
+        } else {
+          
+        }
+
+        endAngle = startAngle + dir * angle;
+        var depth = node.depth - rootDepth - (renderRollupNode ? -1 : 1);
+        var rStart = r0 + rPerLevel * depth;
+        var rEnd = r0 + rPerLevel * (depth + 1);
+        var itemModel = node.getModel();
+
+        if (itemModel.get('r0') != null) {
+          rStart = parsePercent$1(itemModel.get('r0'), size / 2);
+        }
+
+        if (itemModel.get('r') != null) {
+          rEnd = parsePercent$1(itemModel.get('r'), size / 2);
+        }
+
+        node.setLayout({
+          angle: angle,
+          startAngle: startAngle,
+          endAngle: endAngle,
+          clockwise: clockwise,
+          cx: cx,
+          cy: cy,
+          r0: rStart,
+          r: rEnd
+        });
+      } // Render children
+
+
+      if (node.children && node.children.length) {
+        // currentAngle = startAngle;
+        var siblingAngle = 0;
+        each$1(node.children, function (node) {
+          siblingAngle += renderNode(node, startAngle + siblingAngle);
+        });
+      }
+
+      return endAngle - startAngle;
+    }; // Virtual root node for roll up
+
+
+    if (renderRollupNode) {
+      var rStart = r0;
+      var rEnd = r0 + rPerLevel;
+      var angle = Math.PI * 2;
+      virtualRoot.setLayout({
+        angle: angle,
+        startAngle: startAngle,
+        endAngle: startAngle + angle,
+        clockwise: clockwise,
+        cx: cx,
+        cy: cy,
+        r0: rStart,
+        r: rEnd
+      });
+    }
+
+    renderNode(treeRoot, startAngle);
+  });
+};
+/**
+ * Init node children by order and update visual
+ *
+ * @param {TreeNode} node  root node
+ * @param {boolean}  isAsc if is in ascendant order
+ */
+
+function initChildren$1(node, isAsc) {
+  var children = node.children || [];
+  node.children = sort$2(children, isAsc); // Init children recursively
+
+  if (children.length) {
+    each$1(node.children, function (child) {
+      initChildren$1(child, isAsc);
+    });
+  }
+}
+/**
+ * Sort children nodes
+ *
+ * @param {TreeNode[]}               children children of node to be sorted
+ * @param {string | function | null} sort sort method
+ *                                   See SunburstSeries.js for details.
+ */
+
+
+function sort$2(children, sortOrder) {
+  if (typeof sortOrder === 'function') {
+    return children.sort(sortOrder);
+  } else {
+    var isAsc = sortOrder === 'asc';
+    return children.sort(function (a, b) {
+      var diff = (a.getValue() - b.getValue()) * (isAsc ? 1 : -1);
+      return diff === 0 ? (a.dataIndex - b.dataIndex) * (isAsc ? -1 : 1) : diff;
+    });
+  }
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+registerVisual(curry(dataColor, 'sunburst'));
+registerLayout(curry(sunburstLayout, 'sunburst'));
+registerProcessor(curry(dataFilter, 'sunburst'));
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+// Fix for 鍗楁捣璇稿矝
+var geoCoord = [126, 25];
+var points$1 = [[[0, 3.5], [7, 11.2], [15, 11.9], [30, 7], [42, 0.7], [52, 0.7], [56, 7.7], [59, 0.7], [64, 0.7], [64, 0], [5, 0], [0, 3.5]], [[13, 16.1], [19, 14.7], [16, 21.7], [11, 23.1], [13, 16.1]], [[12, 32.2], [14, 38.5], [15, 38.5], [13, 32.2], [12, 32.2]], [[16, 47.6], [12, 53.2], [13, 53.2], [18, 47.6], [16, 47.6]], [[6, 64.4], [8, 70], [9, 70], [8, 64.4], [6, 64.4]], [[23, 82.6], [29, 79.8], [30, 79.8], [25, 82.6], [23, 82.6]], [[37, 70.7], [43, 62.3], [44, 62.3], [39, 70.7], [37, 70.7]], [[48, 51.1], [51, 45.5], [53, 45.5], [50, 51.1], [48, 51.1]], [[51, 35], [51, 28.7], [53, 28.7], [53, 35], [51, 35]], [[52, 22.4], [55, 17.5], [56, 17.5], [53, 22.4], [52, 22.4]], [[58, 12.6], [62, 7], [63, 7], [60, 12.6], [58, 12.6]], [[0, 3.5], [0, 93.1], [64, 93.1], [64, 0], [63, 0], [63, 92.4], [1, 92.4], [1, 3.5], [0, 3.5]]];
+
+for (var i$2 = 0; i$2 < points$1.length; i$2++) {
+  for (var k = 0; k < points$1[i$2].length; k++) {
+    points$1[i$2][k][0] /= 10.5;
+    points$1[i$2][k][1] /= -10.5 / 0.75;
+    points$1[i$2][k][0] += geoCoord[0];
+    points$1[i$2][k][1] += geoCoord[1];
+  }
+}
+
+var fixNanhai = function (mapType, regions) {
+  if (mapType === 'china') {
+    regions.push(new Region('鍗楁捣璇稿矝', map(points$1, function (exterior) {
+      return {
+        type: 'polygon',
+        exterior: exterior
+      };
+    }), geoCoord));
+  }
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var coordsOffsetMap = {
+  '鍗楁捣璇稿矝': [32, 80],
+  // 鍏ㄥ浗
+  '骞夸笢': [0, -10],
+  '棣欐腐': [10, 5],
+  '婢抽棬': [-10, 10],
+  //'鍖椾含': [-10, 0],
+  '澶╂触': [5, 5]
+};
+var fixTextCoord = function (mapType, region) {
+  if (mapType === 'china') {
+    var coordFix = coordsOffsetMap[region.name];
+
+    if (coordFix) {
+      var cp = region.center;
+      cp[0] += coordFix[0] / 10.5;
+      cp[1] += -coordFix[1] / (10.5 / 0.75);
+    }
+  }
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var geoCoordMap = {
+  'Russia': [100, 60],
+  'United States': [-99, 38],
+  'United States of America': [-99, 38]
+};
+var fixGeoCoord = function (mapType, region) {
+  if (mapType === 'world') {
+    var geoCoord = geoCoordMap[region.name];
+
+    if (geoCoord) {
+      var cp = region.center;
+      cp[0] = geoCoord[0];
+      cp[1] = geoCoord[1];
+    }
+  }
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+// Fix for 閽撻奔宀�
+// var Region = require('../Region');
+// var zrUtil = require('zrender/src/core/util');
+// var geoCoord = [126, 25];
+var points$2 = [[[123.45165252685547, 25.73527164402261], [123.49731445312499, 25.73527164402261], [123.49731445312499, 25.750734064600884], [123.45165252685547, 25.750734064600884], [123.45165252685547, 25.73527164402261]]];
+var fixDiaoyuIsland = function (mapType, region) {
+  if (mapType === 'china' && region.name === '鍙版咕') {
+    region.geometries.push({
+      type: 'polygon',
+      exterior: points$2[0]
+    });
+  }
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var inner$7 = makeInner();
+var geoJSONLoader = {
+  /**
+   * @param {string} mapName
+   * @param {Object} mapRecord {specialAreas, geoJSON}
+   * @return {Object} {regions, boundingRect}
+   */
+  load: function (mapName, mapRecord) {
+    var parsed = inner$7(mapRecord).parsed;
+
+    if (parsed) {
+      return parsed;
+    }
+
+    var specialAreas = mapRecord.specialAreas || {};
+    var geoJSON = mapRecord.geoJSON;
+    var regions; // https://jsperf.com/try-catch-performance-overhead
+
+    try {
+      regions = geoJSON ? parseGeoJson$1(geoJSON) : [];
+    } catch (e) {
+      throw new Error('Invalid geoJson format\n' + e.message);
+    }
+
+    each$1(regions, function (region) {
+      var regionName = region.name;
+      fixTextCoord(mapName, region);
+      fixGeoCoord(mapName, region);
+      fixDiaoyuIsland(mapName, region); // Some area like Alaska in USA map needs to be tansformed
+      // to look better
+
+      var specialArea = specialAreas[regionName];
+
+      if (specialArea) {
+        region.transformTo(specialArea.left, specialArea.top, specialArea.width, specialArea.height);
+      }
+    });
+    fixNanhai(mapName, regions);
+    return inner$7(mapRecord).parsed = {
+      regions: regions,
+      boundingRect: getBoundingRect$1(regions)
+    };
+  }
+};
+
+function getBoundingRect$1(regions) {
+  var rect;
+
+  for (var i = 0; i < regions.length; i++) {
+    var regionRect = regions[i].getBoundingRect();
+    rect = rect || regionRect.clone();
+    rect.union(regionRect);
+  }
+
+  return rect;
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var inner$8 = makeInner();
+var geoSVGLoader = {
+  /**
+   * @param {string} mapName
+   * @param {Object} mapRecord {specialAreas, geoJSON}
+   * @return {Object} {root, boundingRect}
+   */
+  load: function (mapName, mapRecord) {
+    var originRoot = inner$8(mapRecord).originRoot;
+
+    if (originRoot) {
+      return {
+        root: originRoot,
+        boundingRect: inner$8(mapRecord).boundingRect
+      };
+    }
+
+    var graphic = buildGraphic(mapRecord);
+    inner$8(mapRecord).originRoot = graphic.root;
+    inner$8(mapRecord).boundingRect = graphic.boundingRect;
+    return graphic;
+  },
+  makeGraphic: function (mapName, mapRecord, hostKey) {
+    // For performance consideration (in large SVG), graphic only maked
+    // when necessary and reuse them according to hostKey.
+    var field = inner$8(mapRecord);
+    var rootMap = field.rootMap || (field.rootMap = createHashMap());
+    var root = rootMap.get(hostKey);
+
+    if (root) {
+      return root;
+    }
+
+    var originRoot = field.originRoot;
+    var boundingRect = field.boundingRect; // For performance, if originRoot is not used by a view,
+    // assign it to a view, but not reproduce graphic elements.
+
+    if (!field.originRootHostKey) {
+      field.originRootHostKey = hostKey;
+      root = originRoot;
+    } else {
+      root = buildGraphic(mapRecord, boundingRect).root;
+    }
+
+    return rootMap.set(hostKey, root);
+  },
+  removeGraphic: function (mapName, mapRecord, hostKey) {
+    var field = inner$8(mapRecord);
+    var rootMap = field.rootMap;
+    rootMap && rootMap.removeKey(hostKey);
+
+    if (hostKey === field.originRootHostKey) {
+      field.originRootHostKey = null;
+    }
+  }
+};
+
+function buildGraphic(mapRecord, boundingRect) {
+  var svgXML = mapRecord.svgXML;
+  var result;
+  var root;
+
+  try {
+    result = svgXML && parseSVG(svgXML, {
+      ignoreViewBox: true,
+      ignoreRootClip: true
+    }) || {};
+    root = result.root;
+    assert$1(root != null);
+  } catch (e) {
+    throw new Error('Invalid svg format\n' + e.message);
+  }
+
+  var svgWidth = result.width;
+  var svgHeight = result.height;
+  var viewBoxRect = result.viewBoxRect;
+
+  if (!boundingRect) {
+    boundingRect = svgWidth == null || svgHeight == null ? // If svg width / height not specified, calculate
+    // bounding rect as the width / height
+    root.getBoundingRect() : new BoundingRect(0, 0, 0, 0);
+
+    if (svgWidth != null) {
+      boundingRect.width = svgWidth;
+    }
+
+    if (svgHeight != null) {
+      boundingRect.height = svgHeight;
+    }
+  }
+
+  if (viewBoxRect) {
+    var viewBoxTransform = makeViewBoxTransform(viewBoxRect, boundingRect.width, boundingRect.height);
+    var elRoot = root;
+    root = new Group();
+    root.add(elRoot);
+    elRoot.scale = viewBoxTransform.scale;
+    elRoot.position = viewBoxTransform.position;
+  }
+
+  root.setClipPath(new Rect({
+    shape: boundingRect.plain()
+  }));
+  return {
+    root: root,
+    boundingRect: boundingRect
+  };
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var loaders = {
+  geoJSON: geoJSONLoader,
+  svg: geoSVGLoader
+};
+var geoSourceManager = {
+  /**
+   * @param {string} mapName
+   * @param {Object} nameMap
+   * @return {Object} source {regions, regionsMap, nameCoordMap, boundingRect}
+   */
+  load: function (mapName, nameMap) {
+    var regions = [];
+    var regionsMap = createHashMap();
+    var nameCoordMap = createHashMap();
+    var boundingRect;
+    var mapRecords = retrieveMap(mapName);
+    each$1(mapRecords, function (record) {
+      var singleSource = loaders[record.type].load(mapName, record);
+      each$1(singleSource.regions, function (region) {
+        var regionName = region.name; // Try use the alias in geoNameMap
+
+        if (nameMap && nameMap.hasOwnProperty(regionName)) {
+          region = region.cloneShallow(regionName = nameMap[regionName]);
+        }
+
+        regions.push(region);
+        regionsMap.set(regionName, region);
+        nameCoordMap.set(regionName, region.center);
+      });
+      var rect = singleSource.boundingRect;
+
+      if (rect) {
+        boundingRect ? boundingRect.union(rect) : boundingRect = rect.clone();
+      }
+    });
+    return {
+      regions: regions,
+      regionsMap: regionsMap,
+      nameCoordMap: nameCoordMap,
+      // FIXME Always return new ?
+      boundingRect: boundingRect || new BoundingRect(0, 0, 0, 0)
+    };
+  },
+
+  /**
+   * @param {string} mapName
+   * @param {string} hostKey For cache.
+   * @return {Array.<module:zrender/Element>} Roots.
+   */
+  makeGraphic: makeInvoker('makeGraphic'),
+
+  /**
+   * @param {string} mapName
+   * @param {string} hostKey For cache.
+   */
+  removeGraphic: makeInvoker('removeGraphic')
+};
+
+function makeInvoker(methodName) {
+  return function (mapName, hostKey) {
+    var mapRecords = retrieveMap(mapName);
+    var results = [];
+    each$1(mapRecords, function (record) {
+      var method = loaders[record.type][methodName];
+      method && results.push(method(mapName, record, hostKey));
+    });
+    return results;
+  };
+}
+
+function retrieveMap(mapName) {
+  var mapRecords = mapDataStorage.retrieveMap(mapName) || [];
+  return mapRecords;
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+/**
+ * [Geo description]
+ * For backward compatibility, the orginal interface:
+ * `name, map, geoJson, specialAreas, nameMap` is kept.
+ *
+ * @param {string|Object} name
+ * @param {string} map Map type
+ *        Specify the positioned areas by left, top, width, height
+ * @param {Object.<string, string>} [nameMap]
+ *        Specify name alias
+ * @param {boolean} [invertLongitute=true]
+ */
+
+function Geo(name, map$$1, nameMap, invertLongitute) {
+  View.call(this, name);
+  /**
+   * Map type
+   * @type {string}
+   */
+
+  this.map = map$$1;
+  var source = geoSourceManager.load(map$$1, nameMap);
+  this._nameCoordMap = source.nameCoordMap;
+  this._regionsMap = source.nameCoordMap;
+  this._invertLongitute = invertLongitute == null ? true : invertLongitute;
+  /**
+   * @readOnly
+   */
+
+  this.regions = source.regions;
+  /**
+   * @type {module:zrender/src/core/BoundingRect}
+   */
+
+  this._rect = source.boundingRect;
+}
+
+Geo.prototype = {
+  constructor: Geo,
+  type: 'geo',
+
+  /**
+   * @param {Array.<string>}
+   * @readOnly
+   */
+  dimensions: ['lng', 'lat'],
+
+  /**
+   * If contain given lng,lat coord
+   * @param {Array.<number>}
+   * @readOnly
+   */
+  containCoord: function (coord) {
+    var regions = this.regions;
+
+    for (var i = 0; i < regions.length; i++) {
+      if (regions[i].contain(coord)) {
+        return true;
+      }
+    }
+
+    return false;
+  },
+
+  /**
+   * @override
+   */
+  transformTo: function (x, y, width, height) {
+    var rect = this.getBoundingRect();
+    var invertLongitute = this._invertLongitute;
+    rect = rect.clone();
+
+    if (invertLongitute) {
+      // Longitute is inverted
+      rect.y = -rect.y - rect.height;
+    }
+
+    var rawTransformable = this._rawTransformable;
+    rawTransformable.transform = rect.calculateTransform(new BoundingRect(x, y, width, height));
+    rawTransformable.decomposeTransform();
+
+    if (invertLongitute) {
+      var scale = rawTransformable.scale;
+      scale[1] = -scale[1];
+    }
+
+    rawTransformable.updateTransform();
+
+    this._updateTransform();
+  },
+
+  /**
+   * @param {string} name
+   * @return {module:echarts/coord/geo/Region}
+   */
+  getRegion: function (name) {
+    return this._regionsMap.get(name);
+  },
+  getRegionByCoord: function (coord) {
+    var regions = this.regions;
+
+    for (var i = 0; i < regions.length; i++) {
+      if (regions[i].contain(coord)) {
+        return regions[i];
+      }
+    }
+  },
+
+  /**
+   * Add geoCoord for indexing by name
+   * @param {string} name
+   * @param {Array.<number>} geoCoord
+   */
+  addGeoCoord: function (name, geoCoord) {
+    this._nameCoordMap.set(name, geoCoord);
+  },
+
+  /**
+   * Get geoCoord by name
+   * @param {string} name
+   * @return {Array.<number>}
+   */
+  getGeoCoord: function (name) {
+    return this._nameCoordMap.get(name);
+  },
+
+  /**
+   * @override
+   */
+  getBoundingRect: function () {
+    return this._rect;
+  },
+
+  /**
+   * @param {string|Array.<number>} data
+   * @param {boolean} noRoam
+   * @param {Array.<number>} [out]
+   * @return {Array.<number>}
+   */
+  dataToPoint: function (data, noRoam, out) {
+    if (typeof data === 'string') {
+      // Map area name to geoCoord
+      data = this.getGeoCoord(data);
+    }
+
+    if (data) {
+      return View.prototype.dataToPoint.call(this, data, noRoam, out);
+    }
+  },
+
+  /**
+   * @override
+   */
+  convertToPixel: curry(doConvert$1, 'dataToPoint'),
+
+  /**
+   * @override
+   */
+  convertFromPixel: curry(doConvert$1, 'pointToData')
+};
+mixin(Geo, View);
+
+function doConvert$1(methodName, ecModel, finder, value) {
+  var geoModel = finder.geoModel;
+  var seriesModel = finder.seriesModel;
+  var coordSys = geoModel ? geoModel.coordinateSystem : seriesModel ? seriesModel.coordinateSystem // For map.
+  || (seriesModel.getReferringComponents('geo')[0] || {}).coordinateSystem : null;
+  return coordSys === this ? coordSys[methodName](value) : null;
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+/**
+ * Resize method bound to the geo
+ * @param {module:echarts/coord/geo/GeoModel|module:echarts/chart/map/MapModel} geoModel
+ * @param {module:echarts/ExtensionAPI} api
+ */
+
+function resizeGeo(geoModel, api) {
+  var boundingCoords = geoModel.get('boundingCoords');
+
+  if (boundingCoords != null) {
+    var leftTop = boundingCoords[0];
+    var rightBottom = boundingCoords[1];
+
+    if (isNaN(leftTop[0]) || isNaN(leftTop[1]) || isNaN(rightBottom[0]) || isNaN(rightBottom[1])) {} else {
+      this.setBoundingRect(leftTop[0], leftTop[1], rightBottom[0] - leftTop[0], rightBottom[1] - leftTop[1]);
+    }
+  }
+
+  var rect = this.getBoundingRect();
+  var boxLayoutOption;
+  var center = geoModel.get('layoutCenter');
+  var size = geoModel.get('layoutSize');
+  var viewWidth = api.getWidth();
+  var viewHeight = api.getHeight();
+  var aspect = rect.width / rect.height * this.aspectScale;
+  var useCenterAndSize = false;
+
+  if (center && size) {
+    center = [parsePercent$1(center[0], viewWidth), parsePercent$1(center[1], viewHeight)];
+    size = parsePercent$1(size, Math.min(viewWidth, viewHeight));
+
+    if (!isNaN(center[0]) && !isNaN(center[1]) && !isNaN(size)) {
+      useCenterAndSize = true;
+    } else {}
+  }
+
+  var viewRect;
+
+  if (useCenterAndSize) {
+    var viewRect = {};
+
+    if (aspect > 1) {
+      // Width is same with size
+      viewRect.width = size;
+      viewRect.height = size / aspect;
+    } else {
+      viewRect.height = size;
+      viewRect.width = size * aspect;
+    }
+
+    viewRect.y = center[1] - viewRect.height / 2;
+    viewRect.x = center[0] - viewRect.width / 2;
+  } else {
+    // Use left/top/width/height
+    boxLayoutOption = geoModel.getBoxLayoutParams(); // 0.75 rate
+
+    boxLayoutOption.aspect = aspect;
+    viewRect = getLayoutRect(boxLayoutOption, {
+      width: viewWidth,
+      height: viewHeight
+    });
+  }
+
+  this.setViewRect(viewRect.x, viewRect.y, viewRect.width, viewRect.height);
+  this.setCenter(geoModel.get('center'));
+  this.setZoom(geoModel.get('zoom'));
+}
+/**
+ * @param {module:echarts/coord/Geo} geo
+ * @param {module:echarts/model/Model} model
+ * @inner
+ */
+
+
+function setGeoCoords(geo, model) {
+  each$1(model.get('geoCoord'), function (geoCoord, name) {
+    geo.addGeoCoord(name, geoCoord);
+  });
+}
+
+var geoCreator = {
+  // For deciding which dimensions to use when creating list data
+  dimensions: Geo.prototype.dimensions,
+  create: function (ecModel, api) {
+    var geoList = []; // FIXME Create each time may be slow
+
+    ecModel.eachComponent('geo', function (geoModel, idx) {
+      var name = geoModel.get('map');
+      var aspectScale = geoModel.get('aspectScale');
+      var invertLongitute = true;
+      var mapRecords = mapDataStorage.retrieveMap(name);
+
+      if (mapRecords && mapRecords[0] && mapRecords[0].type === 'svg') {
+        aspectScale == null && (aspectScale = 1);
+        invertLongitute = false;
+      } else {
+        aspectScale == null && (aspectScale = 0.75);
+      }
+
+      var geo = new Geo(name + idx, name, geoModel.get('nameMap'), invertLongitute);
+      geo.aspectScale = aspectScale;
+      geo.zoomLimit = geoModel.get('scaleLimit');
+      geoList.push(geo);
+      setGeoCoords(geo, geoModel);
+      geoModel.coordinateSystem = geo;
+      geo.model = geoModel; // Inject resize method
+
+      geo.resize = resizeGeo;
+      geo.resize(geoModel, api);
+    });
+    ecModel.eachSeries(function (seriesModel) {
+      var coordSys = seriesModel.get('coordinateSystem');
+
+      if (coordSys === 'geo') {
+        var geoIndex = seriesModel.get('geoIndex') || 0;
+        seriesModel.coordinateSystem = geoList[geoIndex];
+      }
+    }); // If has map series
+
+    var mapModelGroupBySeries = {};
+    ecModel.eachSeriesByType('map', function (seriesModel) {
+      if (!seriesModel.getHostGeoModel()) {
+        var mapType = seriesModel.getMapType();
+        mapModelGroupBySeries[mapType] = mapModelGroupBySeries[mapType] || [];
+        mapModelGroupBySeries[mapType].push(seriesModel);
+      }
+    });
+    each$1(mapModelGroupBySeries, function (mapSeries, mapType) {
+      var nameMapList = map(mapSeries, function (singleMapSeries) {
+        return singleMapSeries.get('nameMap');
+      });
+      var geo = new Geo(mapType, mapType, mergeAll(nameMapList));
+      geo.zoomLimit = retrieve.apply(null, map(mapSeries, function (singleMapSeries) {
+        return singleMapSeries.get('scaleLimit');
+      }));
+      geoList.push(geo); // Inject resize method
+
+      geo.resize = resizeGeo;
+      geo.aspectScale = mapSeries[0].get('aspectScale');
+      geo.resize(mapSeries[0], api);
+      each$1(mapSeries, function (singleMapSeries) {
+        singleMapSeries.coordinateSystem = geo;
+        setGeoCoords(geo, singleMapSeries);
+      });
+    });
+    return geoList;
+  },
+
+  /**
+   * Fill given regions array
+   * @param  {Array.<Object>} originRegionArr
+   * @param  {string} mapName
+   * @param  {Object} [nameMap]
+   * @return {Array}
+   */
+  getFilledRegions: function (originRegionArr, mapName, nameMap) {
+    // Not use the original
+    var regionsArr = (originRegionArr || []).slice();
+    var dataNameMap = createHashMap();
+
+    for (var i = 0; i < regionsArr.length; i++) {
+      dataNameMap.set(regionsArr[i].name, regionsArr[i]);
+    }
+
+    var source = geoSourceManager.load(mapName, nameMap);
+    each$1(source.regions, function (region) {
+      var name = region.name;
+      !dataNameMap.get(name) && regionsArr.push({
+        name: name
+      });
+    });
+    return regionsArr;
+  }
+};
+registerCoordinateSystem('geo', geoCreator);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var MapSeries = SeriesModel.extend({
+  type: 'series.map',
+  dependencies: ['geo'],
+  layoutMode: 'box',
+
+  /**
+   * Only first map series of same mapType will drawMap
+   * @type {boolean}
+   */
+  needsDrawMap: false,
+
+  /**
+   * Group of all map series with same mapType
+   * @type {boolean}
+   */
+  seriesGroup: [],
+  init: function (option) {
+    // this._fillOption(option, this.getMapType());
+    // this.option = option;
+    MapSeries.superApply(this, 'init', arguments);
+    this.updateSelectedMap(this._createSelectableList());
+  },
+  getInitialData: function (option) {
+    return createListSimply(this, ['value']);
+  },
+  mergeOption: function (newOption) {
+    // this._fillOption(newOption, this.getMapType());
+    MapSeries.superApply(this, 'mergeOption', arguments);
+    this.updateSelectedMap(this._createSelectableList());
+  },
+  _createSelectableList: function () {
+    var data = this.getRawData();
+    var valueDim = data.mapDimension('value');
+    var targetList = [];
+
+    for (var i = 0, len = data.count(); i < len; i++) {
+      targetList.push({
+        name: data.getName(i),
+        value: data.get(valueDim, i),
+        selected: retrieveRawAttr(data, i, 'selected')
+      });
+    }
+
+    targetList = geoCreator.getFilledRegions(targetList, this.getMapType(), this.option.nameMap);
+    return targetList;
+  },
+
+  /**
+   * If no host geo model, return null, which means using a
+   * inner exclusive geo model.
+   */
+  getHostGeoModel: function () {
+    var geoIndex = this.option.geoIndex;
+    return geoIndex != null ? this.dependentModels.geo[geoIndex] : null;
+  },
+  getMapType: function () {
+    return (this.getHostGeoModel() || this).option.map;
+  },
+  _fillOption: function (option, mapName) {// Shallow clone
+    // option = zrUtil.extend({}, option);
+    // option.data = geoCreator.getFilledRegions(option.data, mapName, option.nameMap);
+    // return option;
+  },
+  getRawValue: function (dataIndex) {
+    // Use value stored in data instead because it is calculated from multiple series
+    // FIXME Provide all value of multiple series ?
+    var data = this.getData();
+    return data.get(data.mapDimension('value'), dataIndex);
+  },
+
+  /**
+   * Get model of region
+   * @param  {string} name
+   * @return {module:echarts/model/Model}
+   */
+  getRegionModel: function (regionName) {
+    var data = this.getData();
+    return data.getItemModel(data.indexOfName(regionName));
+  },
+
+  /**
+   * Map tooltip formatter
+   *
+   * @param {number} dataIndex
+   */
+  formatTooltip: function (dataIndex) {
+    // FIXME orignalData and data is a bit confusing
+    var data = this.getData();
+    var formattedValue = addCommas(this.getRawValue(dataIndex));
+    var name = data.getName(dataIndex);
+    var seriesGroup = this.seriesGroup;
+    var seriesNames = [];
+
+    for (var i = 0; i < seriesGroup.length; i++) {
+      var otherIndex = seriesGroup[i].originalData.indexOfName(name);
+      var valueDim = data.mapDimension('value');
+
+      if (!isNaN(seriesGroup[i].originalData.get(valueDim, otherIndex))) {
+        seriesNames.push(encodeHTML(seriesGroup[i].name));
+      }
+    }
+
+    return seriesNames.join(', ') + '<br />' + encodeHTML(name + ' : ' + formattedValue);
+  },
+
+  /**
+   * @implement
+   */
+  getTooltipPosition: function (dataIndex) {
+    if (dataIndex != null) {
+      var name = this.getData().getName(dataIndex);
+      var geo = this.coordinateSystem;
+      var region = geo.getRegion(name);
+      return region && geo.dataToPoint(region.center);
+    }
+  },
+  setZoom: function (zoom) {
+    this.option.zoom = zoom;
+  },
+  setCenter: function (center) {
+    this.option.center = center;
+  },
+  defaultOption: {
+    // 涓�绾у眰鍙�
+    zlevel: 0,
+    // 浜岀骇灞傚彔
+    z: 2,
+    coordinateSystem: 'geo',
+    // map should be explicitly specified since ec3.
+    map: '',
+    // If `geoIndex` is not specified, a exclusive geo will be
+    // created. Otherwise use the specified geo component, and
+    // `map` and `mapType` are ignored.
+    // geoIndex: 0,
+    // 'center' | 'left' | 'right' | 'x%' | {number}
+    left: 'center',
+    // 'center' | 'top' | 'bottom' | 'x%' | {number}
+    top: 'center',
+    // right
+    // bottom
+    // width:
+    // height
+    // Aspect is width / height. Inited to be geoJson bbox aspect
+    // This parameter is used for scale this aspect
+    aspectScale: 0.75,
+    ///// Layout with center and size
+    // If you wan't to put map in a fixed size box with right aspect ratio
+    // This two properties may more conveninet
+    // layoutCenter: [50%, 50%]
+    // layoutSize: 100
+    // 鏁板�煎悎骞舵柟寮忥紝榛樿鍔犲拰锛屽彲閫変负锛�
+    // 'sum' | 'average' | 'max' | 'min'
+    // mapValueCalculation: 'sum',
+    // 鍦板浘鏁板�艰绠楃粨鏋滃皬鏁扮簿搴�
+    // mapValuePrecision: 0,
+    // 鏄剧ず鍥句緥棰滆壊鏍囪瘑锛堢郴鍒楁爣璇嗙殑灏忓渾鐐癸級锛屽浘渚嬪紑鍚椂鏈夋晥
+    showLegendSymbol: true,
+    // 閫夋嫨妯″紡锛岄粯璁ゅ叧闂紝鍙�塻ingle锛宮ultiple
+    // selectedMode: false,
+    dataRangeHoverLink: true,
+    // 鏄惁寮�鍚缉鏀惧強婕父妯″紡
+    // roam: false,
+    // Define left-top, right-bottom coords to control view
+    // For example, [ [180, 90], [-180, -90] ],
+    // higher priority than center and zoom
+    boundingCoords: null,
+    // Default on center of map
+    center: null,
+    zoom: 1,
+    scaleLimit: null,
+    label: {
+      show: false,
+      color: '#000'
+    },
+    // scaleLimit: null,
+    itemStyle: {
+      borderWidth: 0.5,
+      borderColor: '#444',
+      areaColor: '#eee'
+    },
+    emphasis: {
+      label: {
+        show: true,
+        color: 'rgb(100,0,0)'
+      },
+      itemStyle: {
+        areaColor: 'rgba(255,215,0,0.8)'
+      }
+    }
+  }
+});
+mixin(MapSeries, selectableMixin);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+function getFixedItemStyle(model, scale) {
+  var itemStyle = model.getItemStyle();
+  var areaColor = model.get('areaColor'); // If user want the color not to be changed when hover,
+  // they should both set areaColor and color to be null.
+
+  if (areaColor != null) {
+    itemStyle.fill = areaColor;
+  }
+
+  return itemStyle;
+}
+
+function updateMapSelectHandler(mapDraw, mapOrGeoModel, regionsGroup, api, fromView) {
+  regionsGroup.off('click');
+  regionsGroup.off('mousedown');
+
+  if (mapOrGeoModel.get('selectedMode')) {
+    regionsGroup.on('mousedown', function () {
+      mapDraw._mouseDownFlag = true;
+    });
+    regionsGroup.on('click', function (e) {
+      if (!mapDraw._mouseDownFlag) {
+        return;
+      }
+
+      mapDraw._mouseDownFlag = false;
+      var el = e.target;
+
+      while (!el.__regions) {
+        el = el.parent;
+      }
+
+      if (!el) {
+        return;
+      }
+
+      var action = {
+        type: (mapOrGeoModel.mainType === 'geo' ? 'geo' : 'map') + 'ToggleSelect',
+        batch: map(el.__regions, function (region) {
+          return {
+            name: region.name,
+            from: fromView.uid
+          };
+        })
+      };
+      action[mapOrGeoModel.mainType + 'Id'] = mapOrGeoModel.id;
+      api.dispatchAction(action);
+      updateMapSelected(mapOrGeoModel, regionsGroup);
+    });
+  }
+}
+
+function updateMapSelected(mapOrGeoModel, regionsGroup) {
+  // FIXME
+  regionsGroup.eachChild(function (otherRegionEl) {
+    each$1(otherRegionEl.__regions, function (region) {
+      otherRegionEl.trigger(mapOrGeoModel.isSelected(region.name) ? 'emphasis' : 'normal');
+    });
+  });
+}
+/**
+ * @alias module:echarts/component/helper/MapDraw
+ * @param {module:echarts/ExtensionAPI} api
+ * @param {boolean} updateGroup
+ */
+
+
+function MapDraw(api, updateGroup) {
+  var group = new Group();
+  /**
+   * @type {string}
+   * @private
+   */
+
+  this.uid = getUID('ec_map_draw');
+  /**
+   * @type {module:echarts/component/helper/RoamController}
+   * @private
+   */
+
+  this._controller = new RoamController(api.getZr());
+  /**
+   * @type {Object} {target, zoom, zoomLimit}
+   * @private
+   */
+
+  this._controllerHost = {
+    target: updateGroup ? group : null
+  };
+  /**
+   * @type {module:zrender/container/Group}
+   * @readOnly
+   */
+
+  this.group = group;
+  /**
+   * @type {boolean}
+   * @private
+   */
+
+  this._updateGroup = updateGroup;
+  /**
+   * This flag is used to make sure that only one among
+   * `pan`, `zoom`, `click` can occurs, otherwise 'selected'
+   * action may be triggered when `pan`, which is unexpected.
+   * @type {booelan}
+   */
+
+  this._mouseDownFlag;
+  /**
+   * @type {string}
+   */
+
+  this._mapName;
+  /**
+   * @type {boolean}
+   */
+
+  this._initialized;
+  /**
+   * @type {module:zrender/container/Group}
+   */
+
+  group.add(this._regionsGroup = new Group());
+  /**
+   * @type {module:zrender/container/Group}
+   */
+
+  group.add(this._backgroundGroup = new Group());
+}
+
+MapDraw.prototype = {
+  constructor: MapDraw,
+  draw: function (mapOrGeoModel, ecModel, api, fromView, payload) {
+    var isGeo = mapOrGeoModel.mainType === 'geo'; // Map series has data. GEO model that controlled by map series
+    // will be assigned with map data. Other GEO model has no data.
+
+    var data = mapOrGeoModel.getData && mapOrGeoModel.getData();
+    isGeo && ecModel.eachComponent({
+      mainType: 'series',
+      subType: 'map'
+    }, function (mapSeries) {
+      if (!data && mapSeries.getHostGeoModel() === mapOrGeoModel) {
+        data = mapSeries.getData();
+      }
+    });
+    var geo = mapOrGeoModel.coordinateSystem;
+
+    this._updateBackground(geo);
+
+    var regionsGroup = this._regionsGroup;
+    var group = this.group;
+    var scale = geo.scale;
+    var transform = {
+      position: geo.position,
+      scale: scale
+    }; // No animation when first draw or in action
+
+    if (!regionsGroup.childAt(0) || payload) {
+      group.attr(transform);
+    } else {
+      updateProps(group, transform, mapOrGeoModel);
+    }
+
+    regionsGroup.removeAll();
+    var itemStyleAccessPath = ['itemStyle'];
+    var hoverItemStyleAccessPath = ['emphasis', 'itemStyle'];
+    var labelAccessPath = ['label'];
+    var hoverLabelAccessPath = ['emphasis', 'label'];
+    var nameMap = createHashMap();
+    each$1(geo.regions, function (region) {
+      // Consider in GeoJson properties.name may be duplicated, for example,
+      // there is multiple region named "United Kindom" or "France" (so many
+      // colonies). And it is not appropriate to merge them in geo, which
+      // will make them share the same label and bring trouble in label
+      // location calculation.
+      var regionGroup = nameMap.get(region.name) || nameMap.set(region.name, new Group());
+      var compoundPath = new CompoundPath({
+        shape: {
+          paths: []
+        }
+      });
+      regionGroup.add(compoundPath);
+      var regionModel = mapOrGeoModel.getRegionModel(region.name) || mapOrGeoModel;
+      var itemStyleModel = regionModel.getModel(itemStyleAccessPath);
+      var hoverItemStyleModel = regionModel.getModel(hoverItemStyleAccessPath);
+      var itemStyle = getFixedItemStyle(itemStyleModel, scale);
+      var hoverItemStyle = getFixedItemStyle(hoverItemStyleModel, scale);
+      var labelModel = regionModel.getModel(labelAccessPath);
+      var hoverLabelModel = regionModel.getModel(hoverLabelAccessPath);
+      var dataIdx; // Use the itemStyle in data if has data
+
+      if (data) {
+        dataIdx = data.indexOfName(region.name); // Only visual color of each item will be used. It can be encoded by dataRange
+        // But visual color of series is used in symbol drawing
+        //
+        // Visual color for each series is for the symbol draw
+
+        var visualColor = data.getItemVisual(dataIdx, 'color', true);
+
+        if (visualColor) {
+          itemStyle.fill = visualColor;
+        }
+      }
+
+      each$1(region.geometries, function (geometry) {
+        if (geometry.type !== 'polygon') {
+          return;
+        }
+
+        compoundPath.shape.paths.push(new Polygon({
+          shape: {
+            points: geometry.exterior
+          }
+        }));
+
+        for (var i = 0; i < (geometry.interiors ? geometry.interiors.length : 0); i++) {
+          compoundPath.shape.paths.push(new Polygon({
+            shape: {
+              points: geometry.interiors[i]
+            }
+          }));
+        }
+      });
+      compoundPath.setStyle(itemStyle);
+      compoundPath.style.strokeNoScale = true;
+      compoundPath.culling = true; // Label
+
+      var showLabel = labelModel.get('show');
+      var hoverShowLabel = hoverLabelModel.get('show');
+      var isDataNaN = data && isNaN(data.get(data.mapDimension('value'), dataIdx));
+      var itemLayout = data && data.getItemLayout(dataIdx); // In the following cases label will be drawn
+      // 1. In map series and data value is NaN
+      // 2. In geo component
+      // 4. Region has no series legendSymbol, which will be add a showLabel flag in mapSymbolLayout
+
+      if (isGeo || isDataNaN && (showLabel || hoverShowLabel) || itemLayout && itemLayout.showLabel) {
+        var query = !isGeo ? dataIdx : region.name;
+        var labelFetcher; // Consider dataIdx not found.
+
+        if (!data || dataIdx >= 0) {
+          labelFetcher = mapOrGeoModel;
+        }
+
+        var textEl = new Text({
+          position: region.center.slice(),
+          scale: [1 / scale[0], 1 / scale[1]],
+          z2: 10,
+          silent: true
+        });
+        setLabelStyle(textEl.style, textEl.hoverStyle = {}, labelModel, hoverLabelModel, {
+          labelFetcher: labelFetcher,
+          labelDataIndex: query,
+          defaultText: region.name,
+          useInsideStyle: false
+        }, {
+          textAlign: 'center',
+          textVerticalAlign: 'middle'
+        });
+        regionGroup.add(textEl);
+      } // setItemGraphicEl, setHoverStyle after all polygons and labels
+      // are added to the rigionGroup
+
+
+      if (data) {
+        data.setItemGraphicEl(dataIdx, regionGroup);
+      } else {
+        var regionModel = mapOrGeoModel.getRegionModel(region.name); // Package custom mouse event for geo component
+
+        compoundPath.eventData = {
+          componentType: 'geo',
+          componentIndex: mapOrGeoModel.componentIndex,
+          geoIndex: mapOrGeoModel.componentIndex,
+          name: region.name,
+          region: regionModel && regionModel.option || {}
+        };
+      }
+
+      var groupRegions = regionGroup.__regions || (regionGroup.__regions = []);
+      groupRegions.push(region);
+      setHoverStyle(regionGroup, hoverItemStyle, {
+        hoverSilentOnTouch: !!mapOrGeoModel.get('selectedMode')
+      });
+      regionsGroup.add(regionGroup);
+    });
+
+    this._updateController(mapOrGeoModel, ecModel, api);
+
+    updateMapSelectHandler(this, mapOrGeoModel, regionsGroup, api, fromView);
+    updateMapSelected(mapOrGeoModel, regionsGroup);
+  },
+  remove: function () {
+    this._regionsGroup.removeAll();
+
+    this._backgroundGroup.removeAll();
+
+    this._controller.dispose();
+
+    this._mapName && geoSourceManager.removeGraphic(this._mapName, this.uid);
+    this._mapName = null;
+    this._controllerHost = {};
+  },
+  _updateBackground: function (geo) {
+    var mapName = geo.map;
+
+    if (this._mapName !== mapName) {
+      each$1(geoSourceManager.makeGraphic(mapName, this.uid), function (root) {
+        this._backgroundGroup.add(root);
+      }, this);
+    }
+
+    this._mapName = mapName;
+  },
+  _updateController: function (mapOrGeoModel, ecModel, api) {
+    var geo = mapOrGeoModel.coordinateSystem;
+    var controller = this._controller;
+    var controllerHost = this._controllerHost;
+    controllerHost.zoomLimit = mapOrGeoModel.get('scaleLimit');
+    controllerHost.zoom = geo.getZoom(); // roamType is will be set default true if it is null
+
+    controller.enable(mapOrGeoModel.get('roam') || false);
+    var mainType = mapOrGeoModel.mainType;
+
+    function makeActionBase() {
+      var action = {
+        type: 'geoRoam',
+        componentType: mainType
+      };
+      action[mainType + 'Id'] = mapOrGeoModel.id;
+      return action;
+    }
+
+    controller.off('pan').on('pan', function (e) {
+      this._mouseDownFlag = false;
+      updateViewOnPan(controllerHost, e.dx, e.dy);
+      api.dispatchAction(extend(makeActionBase(), {
+        dx: e.dx,
+        dy: e.dy
+      }));
+    }, this);
+    controller.off('zoom').on('zoom', function (e) {
+      this._mouseDownFlag = false;
+      updateViewOnZoom(controllerHost, e.scale, e.originX, e.originY);
+      api.dispatchAction(extend(makeActionBase(), {
+        zoom: e.scale,
+        originX: e.originX,
+        originY: e.originY
+      }));
+
+      if (this._updateGroup) {
+        var scale = this.group.scale;
+
+        this._regionsGroup.traverse(function (el) {
+          if (el.type === 'text') {
+            el.attr('scale', [1 / scale[0], 1 / scale[1]]);
+          }
+        });
+      }
+    }, this);
+    controller.setPointerChecker(function (e, x, y) {
+      return geo.getViewRectAfterRoam().contain(x, y) && !onIrrelevantElement(e, api, mapOrGeoModel);
+    });
+  }
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+extendChartView({
+  type: 'map',
+  render: function (mapModel, ecModel, api, payload) {
+    // Not render if it is an toggleSelect action from self
+    if (payload && payload.type === 'mapToggleSelect' && payload.from === this.uid) {
+      return;
+    }
+
+    var group = this.group;
+    group.removeAll();
+
+    if (mapModel.getHostGeoModel()) {
+      return;
+    } // Not update map if it is an roam action from self
+
+
+    if (!(payload && payload.type === 'geoRoam' && payload.componentType === 'series' && payload.seriesId === mapModel.id)) {
+      if (mapModel.needsDrawMap) {
+        var mapDraw = this._mapDraw || new MapDraw(api, true);
+        group.add(mapDraw.group);
+        mapDraw.draw(mapModel, ecModel, api, this, payload);
+        this._mapDraw = mapDraw;
+      } else {
+        // Remove drawed map
+        this._mapDraw && this._mapDraw.remove();
+        this._mapDraw = null;
+      }
+    } else {
+      var mapDraw = this._mapDraw;
+      mapDraw && group.add(mapDraw.group);
+    }
+
+    mapModel.get('showLegendSymbol') && ecModel.getComponent('legend') && this._renderSymbols(mapModel, ecModel, api);
+  },
+  remove: function () {
+    this._mapDraw && this._mapDraw.remove();
+    this._mapDraw = null;
+    this.group.removeAll();
+  },
+  dispose: function () {
+    this._mapDraw && this._mapDraw.remove();
+    this._mapDraw = null;
+  },
+  _renderSymbols: function (mapModel, ecModel, api) {
+    var originalData = mapModel.originalData;
+    var group = this.group;
+    originalData.each(originalData.mapDimension('value'), function (value, idx) {
+      if (isNaN(value)) {
+        return;
+      }
+
+      var layout = originalData.getItemLayout(idx);
+
+      if (!layout || !layout.point) {
+        // Not exists in map
+        return;
+      }
+
+      var point = layout.point;
+      var offset = layout.offset;
+      var circle = new Circle({
+        style: {
+          // Because the special of map draw.
+          // Which needs statistic of multiple series and draw on one map.
+          // And each series also need a symbol with legend color
+          //
+          // Layout and visual are put one the different data
+          fill: mapModel.getData().getVisual('color')
+        },
+        shape: {
+          cx: point[0] + offset * 9,
+          cy: point[1],
+          r: 3
+        },
+        silent: true,
+        // Do not overlap the first series, on which labels are displayed.
+        z2: !offset ? 10 : 8
+      }); // First data on the same region
+
+      if (!offset) {
+        var fullData = mapModel.mainSeries.getData();
+        var name = originalData.getName(idx);
+        var fullIndex = fullData.indexOfName(name);
+        var itemModel = originalData.getItemModel(idx);
+        var labelModel = itemModel.getModel('label');
+        var hoverLabelModel = itemModel.getModel('emphasis.label');
+        var polygonGroups = fullData.getItemGraphicEl(fullIndex);
+        var normalText = retrieve2(mapModel.getFormattedLabel(idx, 'normal'), name);
+        var emphasisText = retrieve2(mapModel.getFormattedLabel(idx, 'emphasis'), normalText);
+
+        var onEmphasis = function () {
+          var hoverStyle = setTextStyle({}, hoverLabelModel, {
+            text: hoverLabelModel.get('show') ? emphasisText : null
+          }, {
+            isRectText: true,
+            useInsideStyle: false
+          }, true);
+          circle.style.extendFrom(hoverStyle); // Make label upper than others if overlaps.
+
+          circle.__mapOriginalZ2 = circle.z2;
+          circle.z2 += 1;
+        };
+
+        var onNormal = function () {
+          setTextStyle(circle.style, labelModel, {
+            text: labelModel.get('show') ? normalText : null,
+            textPosition: labelModel.getShallow('position') || 'bottom'
+          }, {
+            isRectText: true,
+            useInsideStyle: false
+          });
+
+          if (circle.__mapOriginalZ2 != null) {
+            circle.z2 = circle.__mapOriginalZ2;
+            circle.__mapOriginalZ2 = null;
+          }
+        };
+
+        polygonGroups.on('mouseover', onEmphasis).on('mouseout', onNormal).on('emphasis', onEmphasis).on('normal', onNormal);
+        onNormal();
+      }
+
+      group.add(circle);
+    });
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+/**
+ * @payload
+ * @property {string} [componentType=series]
+ * @property {number} [dx]
+ * @property {number} [dy]
+ * @property {number} [zoom]
+ * @property {number} [originX]
+ * @property {number} [originY]
+ */
+
+registerAction({
+  type: 'geoRoam',
+  event: 'geoRoam',
+  update: 'updateTransform'
+}, function (payload, ecModel) {
+  var componentType = payload.componentType || 'series';
+  ecModel.eachComponent({
+    mainType: componentType,
+    query: payload
+  }, function (componentModel) {
+    var geo = componentModel.coordinateSystem;
+
+    if (geo.type !== 'geo') {
+      return;
+    }
+
+    var res = updateCenterAndZoom(geo, payload, componentModel.get('scaleLimit'));
+    componentModel.setCenter && componentModel.setCenter(res.center);
+    componentModel.setZoom && componentModel.setZoom(res.zoom); // All map series with same `map` use the same geo coordinate system
+    // So the center and zoom must be in sync. Include the series not selected by legend
+
+    if (componentType === 'series') {
+      each$1(componentModel.seriesGroup, function (seriesModel) {
+        seriesModel.setCenter(res.center);
+        seriesModel.setZoom(res.zoom);
+      });
+    }
+  });
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var mapSymbolLayout = function (ecModel) {
+  var processedMapType = {};
+  ecModel.eachSeriesByType('map', function (mapSeries) {
+    var mapType = mapSeries.getMapType();
+
+    if (mapSeries.getHostGeoModel() || processedMapType[mapType]) {
+      return;
+    }
+
+    var mapSymbolOffsets = {};
+    each$1(mapSeries.seriesGroup, function (subMapSeries) {
+      var geo = subMapSeries.coordinateSystem;
+      var data = subMapSeries.originalData;
+
+      if (subMapSeries.get('showLegendSymbol') && ecModel.getComponent('legend')) {
+        data.each(data.mapDimension('value'), function (value, idx) {
+          var name = data.getName(idx);
+          var region = geo.getRegion(name); // If input series.data is [11, 22, '-'/null/undefined, 44],
+          // it will be filled with NaN: [11, 22, NaN, 44] and NaN will
+          // not be drawn. So here must validate if value is NaN.
+
+          if (!region || isNaN(value)) {
+            return;
+          }
+
+          var offset = mapSymbolOffsets[name] || 0;
+          var point = geo.dataToPoint(region.center);
+          mapSymbolOffsets[name] = offset + 1;
+          data.setItemLayout(idx, {
+            point: point,
+            offset: offset
+          });
+        });
+      }
+    }); // Show label of those region not has legendSymbol(which is offset 0)
+
+    var data = mapSeries.getData();
+    data.each(function (idx) {
+      var name = data.getName(idx);
+      var layout = data.getItemLayout(idx) || {};
+      layout.showLabel = !mapSymbolOffsets[name];
+      data.setItemLayout(idx, layout);
+    });
+    processedMapType[mapType] = true;
+  });
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var mapVisual$1 = function (ecModel) {
+  ecModel.eachSeriesByType('map', function (seriesModel) {
+    var colorList = seriesModel.get('color');
+    var itemStyleModel = seriesModel.getModel('itemStyle');
+    var areaColor = itemStyleModel.get('areaColor');
+    var color = itemStyleModel.get('color') || colorList[seriesModel.seriesIndex % colorList.length];
+    seriesModel.getData().setVisual({
+      'areaColor': areaColor,
+      'color': color
+    });
+  });
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+/**
+ * @param {Array.<module:echarts/data/List>} datas
+ * @param {string} statisticType 'average' 'sum'
+ * @inner
+ */
+
+function dataStatistics(datas, statisticType) {
+  var dataNameMap = {};
+  each$1(datas, function (data) {
+    data.each(data.mapDimension('value'), function (value, idx) {
+      // Add prefix to avoid conflict with Object.prototype.
+      var mapKey = 'ec-' + data.getName(idx);
+      dataNameMap[mapKey] = dataNameMap[mapKey] || [];
+
+      if (!isNaN(value)) {
+        dataNameMap[mapKey].push(value);
+      }
+    });
+  });
+  return datas[0].map(datas[0].mapDimension('value'), function (value, idx) {
+    var mapKey = 'ec-' + datas[0].getName(idx);
+    var sum = 0;
+    var min = Infinity;
+    var max = -Infinity;
+    var len = dataNameMap[mapKey].length;
+
+    for (var i = 0; i < len; i++) {
+      min = Math.min(min, dataNameMap[mapKey][i]);
+      max = Math.max(max, dataNameMap[mapKey][i]);
+      sum += dataNameMap[mapKey][i];
+    }
+
+    var result;
+
+    if (statisticType === 'min') {
+      result = min;
+    } else if (statisticType === 'max') {
+      result = max;
+    } else if (statisticType === 'average') {
+      result = sum / len;
+    } else {
+      result = sum;
+    }
+
+    return len === 0 ? NaN : result;
+  });
+}
+
+var mapDataStatistic = function (ecModel) {
+  var seriesGroups = {};
+  ecModel.eachSeriesByType('map', function (seriesModel) {
+    var hostGeoModel = seriesModel.getHostGeoModel();
+    var key = hostGeoModel ? 'o' + hostGeoModel.id : 'i' + seriesModel.getMapType();
+    (seriesGroups[key] = seriesGroups[key] || []).push(seriesModel);
+  });
+  each$1(seriesGroups, function (seriesList, key) {
+    var data = dataStatistics(map(seriesList, function (seriesModel) {
+      return seriesModel.getData();
+    }), seriesList[0].get('mapValueCalculation'));
+
+    for (var i = 0; i < seriesList.length; i++) {
+      seriesList[i].originalData = seriesList[i].getData();
+    } // FIXME Put where?
+
+
+    for (var i = 0; i < seriesList.length; i++) {
+      seriesList[i].seriesGroup = seriesList;
+      seriesList[i].needsDrawMap = i === 0 && !seriesList[i].getHostGeoModel();
+      seriesList[i].setData(data.cloneShallow());
+      seriesList[i].mainSeries = seriesList[0];
+    }
+  });
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var backwardCompat$2 = function (option) {
+  // Save geoCoord
+  var mapSeries = [];
+  each$1(option.series, function (seriesOpt) {
+    if (seriesOpt && seriesOpt.type === 'map') {
+      mapSeries.push(seriesOpt);
+      seriesOpt.map = seriesOpt.map || seriesOpt.mapType; // Put x, y, width, height, x2, y2 in the top level
+
+      defaults(seriesOpt, seriesOpt.mapLocation);
+    }
+  });
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+registerLayout(mapSymbolLayout);
+registerVisual(mapVisual$1);
+registerProcessor(PRIORITY.PROCESSOR.STATISTIC, mapDataStatistic);
+registerPreprocessor(backwardCompat$2);
+createDataSelectAction('map', [{
+  type: 'mapToggleSelect',
+  event: 'mapselectchanged',
+  method: 'toggleSelected'
+}, {
+  type: 'mapSelect',
+  event: 'mapselected',
+  method: 'select'
+}, {
+  type: 'mapUnSelect',
+  event: 'mapunselected',
+  method: 'unSelect'
+}]);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/* global Uint32Array, Float64Array, Float32Array */
+var Uint32Arr = typeof Uint32Array === 'undefined' ? Array : Uint32Array;
+var Float64Arr = typeof Float64Array === 'undefined' ? Array : Float64Array;
+
+function compatEc2(seriesOpt) {
+  var data = seriesOpt.data;
+
+  if (data && data[0] && data[0][0] && data[0][0].coord) {
+    seriesOpt.data = map(data, function (itemOpt) {
+      var coords = [itemOpt[0].coord, itemOpt[1].coord];
+      var target = {
+        coords: coords
+      };
+
+      if (itemOpt[0].name) {
+        target.fromName = itemOpt[0].name;
+      }
+
+      if (itemOpt[1].name) {
+        target.toName = itemOpt[1].name;
+      }
+
+      return mergeAll([target, itemOpt[0], itemOpt[1]]);
+    });
+  }
+}
+
+var LinesSeries = SeriesModel.extend({
+  type: 'series.lines',
+  dependencies: ['grid', 'polar'],
+  visualColorAccessPath: 'lineStyle.color',
+  init: function (option) {
+    // The input data may be null/undefined.
+    option.data = option.data || []; // Not using preprocessor because mergeOption may not have series.type
+
+    compatEc2(option);
+
+    var result = this._processFlatCoordsArray(option.data);
+
+    this._flatCoords = result.flatCoords;
+    this._flatCoordsOffset = result.flatCoordsOffset;
+
+    if (result.flatCoords) {
+      option.data = new Float32Array(result.count);
+    }
+
+    LinesSeries.superApply(this, 'init', arguments);
+  },
+  mergeOption: function (option) {
+    // The input data may be null/undefined.
+    option.data = option.data || [];
+    compatEc2(option);
+
+    if (option.data) {
+      // Only update when have option data to merge.
+      var result = this._processFlatCoordsArray(option.data);
+
+      this._flatCoords = result.flatCoords;
+      this._flatCoordsOffset = result.flatCoordsOffset;
+
+      if (result.flatCoords) {
+        option.data = new Float32Array(result.count);
+      }
+    }
+
+    LinesSeries.superApply(this, 'mergeOption', arguments);
+  },
+  appendData: function (params) {
+    var result = this._processFlatCoordsArray(params.data);
+
+    if (result.flatCoords) {
+      if (!this._flatCoords) {
+        this._flatCoords = result.flatCoords;
+        this._flatCoordsOffset = result.flatCoordsOffset;
+      } else {
+        this._flatCoords = concatArray(this._flatCoords, result.flatCoords);
+        this._flatCoordsOffset = concatArray(this._flatCoordsOffset, result.flatCoordsOffset);
+      }
+
+      params.data = new Float32Array(result.count);
+    }
+
+    this.getRawData().appendData(params.data);
+  },
+  _getCoordsFromItemModel: function (idx) {
+    var itemModel = this.getData().getItemModel(idx);
+    var coords = itemModel.option instanceof Array ? itemModel.option : itemModel.getShallow('coords');
+    return coords;
+  },
+  getLineCoordsCount: function (idx) {
+    if (this._flatCoordsOffset) {
+      return this._flatCoordsOffset[idx * 2 + 1];
+    } else {
+      return this._getCoordsFromItemModel(idx).length;
+    }
+  },
+  getLineCoords: function (idx, out) {
+    if (this._flatCoordsOffset) {
+      var offset = this._flatCoordsOffset[idx * 2];
+      var len = this._flatCoordsOffset[idx * 2 + 1];
+
+      for (var i = 0; i < len; i++) {
+        out[i] = out[i] || [];
+        out[i][0] = this._flatCoords[offset + i * 2];
+        out[i][1] = this._flatCoords[offset + i * 2 + 1];
+      }
+
+      return len;
+    } else {
+      var coords = this._getCoordsFromItemModel(idx);
+
+      for (var i = 0; i < coords.length; i++) {
+        out[i] = out[i] || [];
+        out[i][0] = coords[i][0];
+        out[i][1] = coords[i][1];
+      }
+
+      return coords.length;
+    }
+  },
+  _processFlatCoordsArray: function (data) {
+    var startOffset = 0;
+
+    if (this._flatCoords) {
+      startOffset = this._flatCoords.length;
+    } // Stored as a typed array. In format
+    // Points Count(2) | x | y | x | y | Points Count(3) | x |  y | x | y | x | y |
+
+
+    if (typeof data[0] === 'number') {
+      var len = data.length; // Store offset and len of each segment
+
+      var coordsOffsetAndLenStorage = new Uint32Arr(len);
+      var coordsStorage = new Float64Arr(len);
+      var coordsCursor = 0;
+      var offsetCursor = 0;
+      var dataCount = 0;
+
+      for (var i = 0; i < len;) {
+        dataCount++;
+        var count = data[i++]; // Offset
+
+        coordsOffsetAndLenStorage[offsetCursor++] = coordsCursor + startOffset; // Len
+
+        coordsOffsetAndLenStorage[offsetCursor++] = count;
+
+        for (var k = 0; k < count; k++) {
+          var x = data[i++];
+          var y = data[i++];
+          coordsStorage[coordsCursor++] = x;
+          coordsStorage[coordsCursor++] = y;
+
+          
+        }
+      }
+
+      return {
+        flatCoordsOffset: new Uint32Array(coordsOffsetAndLenStorage.buffer, 0, offsetCursor),
+        flatCoords: coordsStorage,
+        count: dataCount
+      };
+    }
+
+    return {
+      flatCoordsOffset: null,
+      flatCoords: null,
+      count: data.length
+    };
+  },
+  getInitialData: function (option, ecModel) {
+    var lineData = new List(['value'], this);
+    lineData.hasItemOption = false;
+    lineData.initData(option.data, [], function (dataItem, dimName, dataIndex, dimIndex) {
+      // dataItem is simply coords
+      if (dataItem instanceof Array) {
+        return NaN;
+      } else {
+        lineData.hasItemOption = true;
+        var value = dataItem.value;
+
+        if (value != null) {
+          return value instanceof Array ? value[dimIndex] : value;
+        }
+      }
+    });
+    return lineData;
+  },
+  formatTooltip: function (dataIndex) {
+    var data = this.getData();
+    var itemModel = data.getItemModel(dataIndex);
+    var name = itemModel.get('name');
+
+    if (name) {
+      return name;
+    }
+
+    var fromName = itemModel.get('fromName');
+    var toName = itemModel.get('toName');
+    var html = [];
+    fromName != null && html.push(fromName);
+    toName != null && html.push(toName);
+    return encodeHTML(html.join(' > '));
+  },
+  preventIncremental: function () {
+    return !!this.get('effect.show');
+  },
+  getProgressive: function () {
+    var progressive = this.option.progressive;
+
+    if (progressive == null) {
+      return this.option.large ? 1e4 : this.get('progressive');
+    }
+
+    return progressive;
+  },
+  getProgressiveThreshold: function () {
+    var progressiveThreshold = this.option.progressiveThreshold;
+
+    if (progressiveThreshold == null) {
+      return this.option.large ? 2e4 : this.get('progressiveThreshold');
+    }
+
+    return progressiveThreshold;
+  },
+  defaultOption: {
+    coordinateSystem: 'geo',
+    zlevel: 0,
+    z: 2,
+    legendHoverLink: true,
+    hoverAnimation: true,
+    // Cartesian coordinate system
+    xAxisIndex: 0,
+    yAxisIndex: 0,
+    symbol: ['none', 'none'],
+    symbolSize: [10, 10],
+    // Geo coordinate system
+    geoIndex: 0,
+    effect: {
+      show: false,
+      period: 4,
+      // Animation delay. support callback
+      // delay: 0,
+      // If move with constant speed px/sec
+      // period will be ignored if this property is > 0,
+      constantSpeed: 0,
+      symbol: 'circle',
+      symbolSize: 3,
+      loop: true,
+      // Length of trail, 0 - 1
+      trailLength: 0.2 // Same with lineStyle.color
+      // color
+
+    },
+    large: false,
+    // Available when large is true
+    largeThreshold: 2000,
+    // If lines are polyline
+    // polyline not support curveness, label, animation
+    polyline: false,
+    label: {
+      show: false,
+      position: 'end' // distance: 5,
+      // formatter: 鏍囩鏂囨湰鏍煎紡鍣紝鍚孴ooltip.formatter锛屼笉鏀寔寮傛鍥炶皟
+
+    },
+    lineStyle: {
+      opacity: 0.5
+    }
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * Line path for bezier and straight line draw
+ */
+var straightLineProto = Line.prototype;
+var bezierCurveProto = BezierCurve.prototype;
+
+function isLine(shape) {
+  return isNaN(+shape.cpx1) || isNaN(+shape.cpy1);
+}
+
+var LinePath = extendShape({
+  type: 'ec-line',
+  style: {
+    stroke: '#000',
+    fill: null
+  },
+  shape: {
+    x1: 0,
+    y1: 0,
+    x2: 0,
+    y2: 0,
+    percent: 1,
+    cpx1: null,
+    cpy1: null
+  },
+  buildPath: function (ctx, shape) {
+    (isLine(shape) ? straightLineProto : bezierCurveProto).buildPath(ctx, shape);
+  },
+  pointAt: function (t) {
+    return isLine(this.shape) ? straightLineProto.pointAt.call(this, t) : bezierCurveProto.pointAt.call(this, t);
+  },
+  tangentAt: function (t) {
+    var shape = this.shape;
+    var p = isLine(shape) ? [shape.x2 - shape.x1, shape.y2 - shape.y1] : bezierCurveProto.tangentAt.call(this, t);
+    return normalize(p, p);
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * @module echarts/chart/helper/Line
+ */
+var SYMBOL_CATEGORIES = ['fromSymbol', 'toSymbol'];
+
+function makeSymbolTypeKey(symbolCategory) {
+  return '_' + symbolCategory + 'Type';
+}
+/**
+ * @inner
+ */
+
+
+function createSymbol$1(name, lineData, idx) {
+  var color = lineData.getItemVisual(idx, 'color');
+  var symbolType = lineData.getItemVisual(idx, name);
+  var symbolSize = lineData.getItemVisual(idx, name + 'Size');
+
+  if (!symbolType || symbolType === 'none') {
+    return;
+  }
+
+  if (!isArray(symbolSize)) {
+    symbolSize = [symbolSize, symbolSize];
+  }
+
+  var symbolPath = createSymbol(symbolType, -symbolSize[0] / 2, -symbolSize[1] / 2, symbolSize[0], symbolSize[1], color);
+  symbolPath.name = name;
+  return symbolPath;
+}
+
+function createLine(points) {
+  var line = new LinePath({
+    name: 'line'
+  });
+  setLinePoints(line.shape, points);
+  return line;
+}
+
+function setLinePoints(targetShape, points) {
+  var p1 = points[0];
+  var p2 = points[1];
+  var cp1 = points[2];
+  targetShape.x1 = p1[0];
+  targetShape.y1 = p1[1];
+  targetShape.x2 = p2[0];
+  targetShape.y2 = p2[1];
+  targetShape.percent = 1;
+
+  if (cp1) {
+    targetShape.cpx1 = cp1[0];
+    targetShape.cpy1 = cp1[1];
+  } else {
+    targetShape.cpx1 = NaN;
+    targetShape.cpy1 = NaN;
+  }
+}
+
+function updateSymbolAndLabelBeforeLineUpdate() {
+  var lineGroup = this;
+  var symbolFrom = lineGroup.childOfName('fromSymbol');
+  var symbolTo = lineGroup.childOfName('toSymbol');
+  var label = lineGroup.childOfName('label'); // Quick reject
+
+  if (!symbolFrom && !symbolTo && label.ignore) {
+    return;
+  }
+
+  var invScale = 1;
+  var parentNode = this.parent;
+
+  while (parentNode) {
+    if (parentNode.scale) {
+      invScale /= parentNode.scale[0];
+    }
+
+    parentNode = parentNode.parent;
+  }
+
+  var line = lineGroup.childOfName('line'); // If line not changed
+  // FIXME Parent scale changed
+
+  if (!this.__dirty && !line.__dirty) {
+    return;
+  }
+
+  var percent = line.shape.percent;
+  var fromPos = line.pointAt(0);
+  var toPos = line.pointAt(percent);
+  var d = sub([], toPos, fromPos);
+  normalize(d, d);
+
+  if (symbolFrom) {
+    symbolFrom.attr('position', fromPos);
+    var tangent = line.tangentAt(0);
+    symbolFrom.attr('rotation', Math.PI / 2 - Math.atan2(tangent[1], tangent[0]));
+    symbolFrom.attr('scale', [invScale * percent, invScale * percent]);
+  }
+
+  if (symbolTo) {
+    symbolTo.attr('position', toPos);
+    var tangent = line.tangentAt(1);
+    symbolTo.attr('rotation', -Math.PI / 2 - Math.atan2(tangent[1], tangent[0]));
+    symbolTo.attr('scale', [invScale * percent, invScale * percent]);
+  }
+
+  if (!label.ignore) {
+    label.attr('position', toPos);
+    var textPosition;
+    var textAlign;
+    var textVerticalAlign;
+    var distance$$1 = 5 * invScale; // End
+
+    if (label.__position === 'end') {
+      textPosition = [d[0] * distance$$1 + toPos[0], d[1] * distance$$1 + toPos[1]];
+      textAlign = d[0] > 0.8 ? 'left' : d[0] < -0.8 ? 'right' : 'center';
+      textVerticalAlign = d[1] > 0.8 ? 'top' : d[1] < -0.8 ? 'bottom' : 'middle';
+    } // Middle
+    else if (label.__position === 'middle') {
+        var halfPercent = percent / 2;
+        var tangent = line.tangentAt(halfPercent);
+        var n = [tangent[1], -tangent[0]];
+        var cp = line.pointAt(halfPercent);
+
+        if (n[1] > 0) {
+          n[0] = -n[0];
+          n[1] = -n[1];
+        }
+
+        textPosition = [cp[0] + n[0] * distance$$1, cp[1] + n[1] * distance$$1];
+        textAlign = 'center';
+        textVerticalAlign = 'bottom';
+        var rotation = -Math.atan2(tangent[1], tangent[0]);
+
+        if (toPos[0] < fromPos[0]) {
+          rotation = Math.PI + rotation;
+        }
+
+        label.attr('rotation', rotation);
+      } // Start
+      else {
+          textPosition = [-d[0] * distance$$1 + fromPos[0], -d[1] * distance$$1 + fromPos[1]];
+          textAlign = d[0] > 0.8 ? 'right' : d[0] < -0.8 ? 'left' : 'center';
+          textVerticalAlign = d[1] > 0.8 ? 'bottom' : d[1] < -0.8 ? 'top' : 'middle';
+        }
+
+    label.attr({
+      style: {
+        // Use the user specified text align and baseline first
+        textVerticalAlign: label.__verticalAlign || textVerticalAlign,
+        textAlign: label.__textAlign || textAlign
+      },
+      position: textPosition,
+      scale: [invScale, invScale]
+    });
+  }
+}
+/**
+ * @constructor
+ * @extends {module:zrender/graphic/Group}
+ * @alias {module:echarts/chart/helper/Line}
+ */
+
+
+function Line$1(lineData, idx, seriesScope) {
+  Group.call(this);
+
+  this._createLine(lineData, idx, seriesScope);
+}
+
+var lineProto = Line$1.prototype; // Update symbol position and rotation
+
+lineProto.beforeUpdate = updateSymbolAndLabelBeforeLineUpdate;
+
+lineProto._createLine = function (lineData, idx, seriesScope) {
+  var seriesModel = lineData.hostModel;
+  var linePoints = lineData.getItemLayout(idx);
+  var line = createLine(linePoints);
+  line.shape.percent = 0;
+  initProps(line, {
+    shape: {
+      percent: 1
+    }
+  }, seriesModel, idx);
+  this.add(line);
+  var label = new Text({
+    name: 'label'
+  });
+  this.add(label);
+  each$1(SYMBOL_CATEGORIES, function (symbolCategory) {
+    var symbol = createSymbol$1(symbolCategory, lineData, idx); // symbols must added after line to make sure
+    // it will be updated after line#update.
+    // Or symbol position and rotation update in line#beforeUpdate will be one frame slow
+
+    this.add(symbol);
+    this[makeSymbolTypeKey(symbolCategory)] = lineData.getItemVisual(idx, symbolCategory);
+  }, this);
+
+  this._updateCommonStl(lineData, idx, seriesScope);
+};
+
+lineProto.updateData = function (lineData, idx, seriesScope) {
+  var seriesModel = lineData.hostModel;
+  var line = this.childOfName('line');
+  var linePoints = lineData.getItemLayout(idx);
+  var target = {
+    shape: {}
+  };
+  setLinePoints(target.shape, linePoints);
+  updateProps(line, target, seriesModel, idx);
+  each$1(SYMBOL_CATEGORIES, function (symbolCategory) {
+    var symbolType = lineData.getItemVisual(idx, symbolCategory);
+    var key = makeSymbolTypeKey(symbolCategory); // Symbol changed
+
+    if (this[key] !== symbolType) {
+      this.remove(this.childOfName(symbolCategory));
+      var symbol = createSymbol$1(symbolCategory, lineData, idx);
+      this.add(symbol);
+    }
+
+    this[key] = symbolType;
+  }, this);
+
+  this._updateCommonStl(lineData, idx, seriesScope);
+};
+
+lineProto._updateCommonStl = function (lineData, idx, seriesScope) {
+  var seriesModel = lineData.hostModel;
+  var line = this.childOfName('line');
+  var lineStyle = seriesScope && seriesScope.lineStyle;
+  var hoverLineStyle = seriesScope && seriesScope.hoverLineStyle;
+  var labelModel = seriesScope && seriesScope.labelModel;
+  var hoverLabelModel = seriesScope && seriesScope.hoverLabelModel; // Optimization for large dataset
+
+  if (!seriesScope || lineData.hasItemOption) {
+    var itemModel = lineData.getItemModel(idx);
+    lineStyle = itemModel.getModel('lineStyle').getLineStyle();
+    hoverLineStyle = itemModel.getModel('emphasis.lineStyle').getLineStyle();
+    labelModel = itemModel.getModel('label');
+    hoverLabelModel = itemModel.getModel('emphasis.label');
+  }
+
+  var visualColor = lineData.getItemVisual(idx, 'color');
+  var visualOpacity = retrieve3(lineData.getItemVisual(idx, 'opacity'), lineStyle.opacity, 1);
+  line.useStyle(defaults({
+    strokeNoScale: true,
+    fill: 'none',
+    stroke: visualColor,
+    opacity: visualOpacity
+  }, lineStyle));
+  line.hoverStyle = hoverLineStyle; // Update symbol
+
+  each$1(SYMBOL_CATEGORIES, function (symbolCategory) {
+    var symbol = this.childOfName(symbolCategory);
+
+    if (symbol) {
+      symbol.setColor(visualColor);
+      symbol.setStyle({
+        opacity: visualOpacity
+      });
+    }
+  }, this);
+  var showLabel = labelModel.getShallow('show');
+  var hoverShowLabel = hoverLabelModel.getShallow('show');
+  var label = this.childOfName('label');
+  var defaultLabelColor;
+  var baseText; // FIXME: the logic below probably should be merged to `graphic.setLabelStyle`.
+
+  if (showLabel || hoverShowLabel) {
+    defaultLabelColor = visualColor || '#000';
+    baseText = seriesModel.getFormattedLabel(idx, 'normal', lineData.dataType);
+
+    if (baseText == null) {
+      var rawVal = seriesModel.getRawValue(idx);
+      baseText = rawVal == null ? lineData.getName(idx) : isFinite(rawVal) ? round$1(rawVal) : rawVal;
+    }
+  }
+
+  var normalText = showLabel ? baseText : null;
+  var emphasisText = hoverShowLabel ? retrieve2(seriesModel.getFormattedLabel(idx, 'emphasis', lineData.dataType), baseText) : null;
+  var labelStyle = label.style; // Always set `textStyle` even if `normalStyle.text` is null, because default
+  // values have to be set on `normalStyle`.
+
+  if (normalText != null || emphasisText != null) {
+    setTextStyle(label.style, labelModel, {
+      text: normalText
+    }, {
+      autoColor: defaultLabelColor
+    });
+    label.__textAlign = labelStyle.textAlign;
+    label.__verticalAlign = labelStyle.textVerticalAlign; // 'start', 'middle', 'end'
+
+    label.__position = labelModel.get('position') || 'middle';
+  }
+
+  if (emphasisText != null) {
+    // Only these properties supported in this emphasis style here.
+    label.hoverStyle = {
+      text: emphasisText,
+      textFill: hoverLabelModel.getTextColor(true),
+      // For merging hover style to normal style, do not use
+      // `hoverLabelModel.getFont()` here.
+      fontStyle: hoverLabelModel.getShallow('fontStyle'),
+      fontWeight: hoverLabelModel.getShallow('fontWeight'),
+      fontSize: hoverLabelModel.getShallow('fontSize'),
+      fontFamily: hoverLabelModel.getShallow('fontFamily')
+    };
+  } else {
+    label.hoverStyle = {
+      text: null
+    };
+  }
+
+  label.ignore = !showLabel && !hoverShowLabel;
+  setHoverStyle(this);
+};
+
+lineProto.highlight = function () {
+  this.trigger('emphasis');
+};
+
+lineProto.downplay = function () {
+  this.trigger('normal');
+};
+
+lineProto.updateLayout = function (lineData, idx) {
+  this.setLinePoints(lineData.getItemLayout(idx));
+};
+
+lineProto.setLinePoints = function (points) {
+  var linePath = this.childOfName('line');
+  setLinePoints(linePath.shape, points);
+  linePath.dirty();
+};
+
+inherits(Line$1, Group);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * @module echarts/chart/helper/LineDraw
+ */
+/**
+ * @alias module:echarts/component/marker/LineDraw
+ * @constructor
+ */
+
+function LineDraw(ctor) {
+  this._ctor = ctor || Line$1;
+  this.group = new Group();
+}
+
+var lineDrawProto = LineDraw.prototype;
+
+lineDrawProto.isPersistent = function () {
+  return true;
+};
+/**
+ * @param {module:echarts/data/List} lineData
+ */
+
+
+lineDrawProto.updateData = function (lineData) {
+  var lineDraw = this;
+  var group = lineDraw.group;
+  var oldLineData = lineDraw._lineData;
+  lineDraw._lineData = lineData; // There is no oldLineData only when first rendering or switching from
+  // stream mode to normal mode, where previous elements should be removed.
+
+  if (!oldLineData) {
+    group.removeAll();
+  }
+
+  var seriesScope = makeSeriesScope$1(lineData);
+  lineData.diff(oldLineData).add(function (idx) {
+    doAdd(lineDraw, lineData, idx, seriesScope);
+  }).update(function (newIdx, oldIdx) {
+    doUpdate(lineDraw, oldLineData, lineData, oldIdx, newIdx, seriesScope);
+  }).remove(function (idx) {
+    group.remove(oldLineData.getItemGraphicEl(idx));
+  }).execute();
+};
+
+function doAdd(lineDraw, lineData, idx, seriesScope) {
+  var itemLayout = lineData.getItemLayout(idx);
+
+  if (!lineNeedsDraw(itemLayout)) {
+    return;
+  }
+
+  var el = new lineDraw._ctor(lineData, idx, seriesScope);
+  lineData.setItemGraphicEl(idx, el);
+  lineDraw.group.add(el);
+}
+
+function doUpdate(lineDraw, oldLineData, newLineData, oldIdx, newIdx, seriesScope) {
+  var itemEl = oldLineData.getItemGraphicEl(oldIdx);
+
+  if (!lineNeedsDraw(newLineData.getItemLayout(newIdx))) {
+    lineDraw.group.remove(itemEl);
+    return;
+  }
+
+  if (!itemEl) {
+    itemEl = new lineDraw._ctor(newLineData, newIdx, seriesScope);
+  } else {
+    itemEl.updateData(newLineData, newIdx, seriesScope);
+  }
+
+  newLineData.setItemGraphicEl(newIdx, itemEl);
+  lineDraw.group.add(itemEl);
+}
+
+lineDrawProto.updateLayout = function () {
+  var lineData = this._lineData; // Do not support update layout in incremental mode.
+
+  if (!lineData) {
+    return;
+  }
+
+  lineData.eachItemGraphicEl(function (el, idx) {
+    el.updateLayout(lineData, idx);
+  }, this);
+};
+
+lineDrawProto.incrementalPrepareUpdate = function (lineData) {
+  this._seriesScope = makeSeriesScope$1(lineData);
+  this._lineData = null;
+  this.group.removeAll();
+};
+
+lineDrawProto.incrementalUpdate = function (taskParams, lineData) {
+  function updateIncrementalAndHover(el) {
+    if (!el.isGroup) {
+      el.incremental = el.useHoverLayer = true;
+    }
+  }
+
+  for (var idx = taskParams.start; idx < taskParams.end; idx++) {
+    var itemLayout = lineData.getItemLayout(idx);
+
+    if (lineNeedsDraw(itemLayout)) {
+      var el = new this._ctor(lineData, idx, this._seriesScope);
+      el.traverse(updateIncrementalAndHover);
+      this.group.add(el);
+      lineData.setItemGraphicEl(idx, el);
+    }
+  }
+};
+
+function makeSeriesScope$1(lineData) {
+  var hostModel = lineData.hostModel;
+  return {
+    lineStyle: hostModel.getModel('lineStyle').getLineStyle(),
+    hoverLineStyle: hostModel.getModel('emphasis.lineStyle').getLineStyle(),
+    labelModel: hostModel.getModel('label'),
+    hoverLabelModel: hostModel.getModel('emphasis.label')
+  };
+}
+
+lineDrawProto.remove = function () {
+  this._clearIncremental();
+
+  this._incremental = null;
+  this.group.removeAll();
+};
+
+lineDrawProto._clearIncremental = function () {
+  var incremental = this._incremental;
+
+  if (incremental) {
+    incremental.clearDisplaybles();
+  }
+};
+
+function isPointNaN(pt) {
+  return isNaN(pt[0]) || isNaN(pt[1]);
+}
+
+function lineNeedsDraw(pts) {
+  return !isPointNaN(pts[0]) && !isPointNaN(pts[1]);
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * Provide effect for line
+ * @module echarts/chart/helper/EffectLine
+ */
+/**
+ * @constructor
+ * @extends {module:zrender/graphic/Group}
+ * @alias {module:echarts/chart/helper/Line}
+ */
+
+function EffectLine(lineData, idx, seriesScope) {
+  Group.call(this);
+  this.add(this.createLine(lineData, idx, seriesScope));
+
+  this._updateEffectSymbol(lineData, idx);
+}
+
+var effectLineProto = EffectLine.prototype;
+
+effectLineProto.createLine = function (lineData, idx, seriesScope) {
+  return new Line$1(lineData, idx, seriesScope);
+};
+
+effectLineProto._updateEffectSymbol = function (lineData, idx) {
+  var itemModel = lineData.getItemModel(idx);
+  var effectModel = itemModel.getModel('effect');
+  var size = effectModel.get('symbolSize');
+  var symbolType = effectModel.get('symbol');
+
+  if (!isArray(size)) {
+    size = [size, size];
+  }
+
+  var color = effectModel.get('color') || lineData.getItemVisual(idx, 'color');
+  var symbol = this.childAt(1);
+
+  if (this._symbolType !== symbolType) {
+    // Remove previous
+    this.remove(symbol);
+    symbol = createSymbol(symbolType, -0.5, -0.5, 1, 1, color);
+    symbol.z2 = 100;
+    symbol.culling = true;
+    this.add(symbol);
+  } // Symbol may be removed if loop is false
+
+
+  if (!symbol) {
+    return;
+  } // Shadow color is same with color in default
+
+
+  symbol.setStyle('shadowColor', color);
+  symbol.setStyle(effectModel.getItemStyle(['color']));
+  symbol.attr('scale', size);
+  symbol.setColor(color);
+  symbol.attr('scale', size);
+  this._symbolType = symbolType;
+
+  this._updateEffectAnimation(lineData, effectModel, idx);
+};
+
+effectLineProto._updateEffectAnimation = function (lineData, effectModel, idx) {
+  var symbol = this.childAt(1);
+
+  if (!symbol) {
+    return;
+  }
+
+  var self = this;
+  var points = lineData.getItemLayout(idx);
+  var period = effectModel.get('period') * 1000;
+  var loop = effectModel.get('loop');
+  var constantSpeed = effectModel.get('constantSpeed');
+  var delayExpr = retrieve(effectModel.get('delay'), function (idx) {
+    return idx / lineData.count() * period / 3;
+  });
+  var isDelayFunc = typeof delayExpr === 'function'; // Ignore when updating
+
+  symbol.ignore = true;
+  this.updateAnimationPoints(symbol, points);
+
+  if (constantSpeed > 0) {
+    period = this.getLineLength(symbol) / constantSpeed * 1000;
+  }
+
+  if (period !== this._period || loop !== this._loop) {
+    symbol.stopAnimation();
+    var delay = delayExpr;
+
+    if (isDelayFunc) {
+      delay = delayExpr(idx);
+    }
+
+    if (symbol.__t > 0) {
+      delay = -period * symbol.__t;
+    }
+
+    symbol.__t = 0;
+    var animator = symbol.animate('', loop).when(period, {
+      __t: 1
+    }).delay(delay).during(function () {
+      self.updateSymbolPosition(symbol);
+    });
+
+    if (!loop) {
+      animator.done(function () {
+        self.remove(symbol);
+      });
+    }
+
+    animator.start();
+  }
+
+  this._period = period;
+  this._loop = loop;
+};
+
+effectLineProto.getLineLength = function (symbol) {
+  // Not so accurate
+  return dist(symbol.__p1, symbol.__cp1) + dist(symbol.__cp1, symbol.__p2);
+};
+
+effectLineProto.updateAnimationPoints = function (symbol, points) {
+  symbol.__p1 = points[0];
+  symbol.__p2 = points[1];
+  symbol.__cp1 = points[2] || [(points[0][0] + points[1][0]) / 2, (points[0][1] + points[1][1]) / 2];
+};
+
+effectLineProto.updateData = function (lineData, idx, seriesScope) {
+  this.childAt(0).updateData(lineData, idx, seriesScope);
+
+  this._updateEffectSymbol(lineData, idx);
+};
+
+effectLineProto.updateSymbolPosition = function (symbol) {
+  var p1 = symbol.__p1;
+  var p2 = symbol.__p2;
+  var cp1 = symbol.__cp1;
+  var t = symbol.__t;
+  var pos = symbol.position;
+  var quadraticAt$$1 = quadraticAt;
+  var quadraticDerivativeAt$$1 = quadraticDerivativeAt;
+  pos[0] = quadraticAt$$1(p1[0], cp1[0], p2[0], t);
+  pos[1] = quadraticAt$$1(p1[1], cp1[1], p2[1], t); // Tangent
+
+  var tx = quadraticDerivativeAt$$1(p1[0], cp1[0], p2[0], t);
+  var ty = quadraticDerivativeAt$$1(p1[1], cp1[1], p2[1], t);
+  symbol.rotation = -Math.atan2(ty, tx) - Math.PI / 2;
+  symbol.ignore = false;
+};
+
+effectLineProto.updateLayout = function (lineData, idx) {
+  this.childAt(0).updateLayout(lineData, idx);
+  var effectModel = lineData.getItemModel(idx).getModel('effect');
+
+  this._updateEffectAnimation(lineData, effectModel, idx);
+};
+
+inherits(EffectLine, Group);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * @module echarts/chart/helper/Line
+ */
+/**
+ * @constructor
+ * @extends {module:zrender/graphic/Group}
+ * @alias {module:echarts/chart/helper/Polyline}
+ */
+
+function Polyline$2(lineData, idx, seriesScope) {
+  Group.call(this);
+
+  this._createPolyline(lineData, idx, seriesScope);
+}
+
+var polylineProto = Polyline$2.prototype;
+
+polylineProto._createPolyline = function (lineData, idx, seriesScope) {
+  // var seriesModel = lineData.hostModel;
+  var points = lineData.getItemLayout(idx);
+  var line = new Polyline({
+    shape: {
+      points: points
+    }
+  });
+  this.add(line);
+
+  this._updateCommonStl(lineData, idx, seriesScope);
+};
+
+polylineProto.updateData = function (lineData, idx, seriesScope) {
+  var seriesModel = lineData.hostModel;
+  var line = this.childAt(0);
+  var target = {
+    shape: {
+      points: lineData.getItemLayout(idx)
+    }
+  };
+  updateProps(line, target, seriesModel, idx);
+
+  this._updateCommonStl(lineData, idx, seriesScope);
+};
+
+polylineProto._updateCommonStl = function (lineData, idx, seriesScope) {
+  var line = this.childAt(0);
+  var itemModel = lineData.getItemModel(idx);
+  var visualColor = lineData.getItemVisual(idx, 'color');
+  var lineStyle = seriesScope && seriesScope.lineStyle;
+  var hoverLineStyle = seriesScope && seriesScope.hoverLineStyle;
+
+  if (!seriesScope || lineData.hasItemOption) {
+    lineStyle = itemModel.getModel('lineStyle').getLineStyle();
+    hoverLineStyle = itemModel.getModel('emphasis.lineStyle').getLineStyle();
+  }
+
+  line.useStyle(defaults({
+    strokeNoScale: true,
+    fill: 'none',
+    stroke: visualColor
+  }, lineStyle));
+  line.hoverStyle = hoverLineStyle;
+  setHoverStyle(this);
+};
+
+polylineProto.updateLayout = function (lineData, idx) {
+  var polyline = this.childAt(0);
+  polyline.setShape('points', lineData.getItemLayout(idx));
+};
+
+inherits(Polyline$2, Group);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * Provide effect for line
+ * @module echarts/chart/helper/EffectLine
+ */
+/**
+ * @constructor
+ * @extends {module:echarts/chart/helper/EffectLine}
+ * @alias {module:echarts/chart/helper/Polyline}
+ */
+
+function EffectPolyline(lineData, idx, seriesScope) {
+  EffectLine.call(this, lineData, idx, seriesScope);
+  this._lastFrame = 0;
+  this._lastFramePercent = 0;
+}
+
+var effectPolylineProto = EffectPolyline.prototype; // Overwrite
+
+effectPolylineProto.createLine = function (lineData, idx, seriesScope) {
+  return new Polyline$2(lineData, idx, seriesScope);
+}; // Overwrite
+
+
+effectPolylineProto.updateAnimationPoints = function (symbol, points) {
+  this._points = points;
+  var accLenArr = [0];
+  var len$$1 = 0;
+
+  for (var i = 1; i < points.length; i++) {
+    var p1 = points[i - 1];
+    var p2 = points[i];
+    len$$1 += dist(p1, p2);
+    accLenArr.push(len$$1);
+  }
+
+  if (len$$1 === 0) {
+    return;
+  }
+
+  for (var i = 0; i < accLenArr.length; i++) {
+    accLenArr[i] /= len$$1;
+  }
+
+  this._offsets = accLenArr;
+  this._length = len$$1;
+}; // Overwrite
+
+
+effectPolylineProto.getLineLength = function (symbol) {
+  return this._length;
+}; // Overwrite
+
+
+effectPolylineProto.updateSymbolPosition = function (symbol) {
+  var t = symbol.__t;
+  var points = this._points;
+  var offsets = this._offsets;
+  var len$$1 = points.length;
+
+  if (!offsets) {
+    // Has length 0
+    return;
+  }
+
+  var lastFrame = this._lastFrame;
+  var frame;
+
+  if (t < this._lastFramePercent) {
+    // Start from the next frame
+    // PENDING start from lastFrame ?
+    var start = Math.min(lastFrame + 1, len$$1 - 1);
+
+    for (frame = start; frame >= 0; frame--) {
+      if (offsets[frame] <= t) {
+        break;
+      }
+    } // PENDING really need to do this ?
+
+
+    frame = Math.min(frame, len$$1 - 2);
+  } else {
+    for (var frame = lastFrame; frame < len$$1; frame++) {
+      if (offsets[frame] > t) {
+        break;
+      }
+    }
+
+    frame = Math.min(frame - 1, len$$1 - 2);
+  }
+
+  lerp(symbol.position, points[frame], points[frame + 1], (t - offsets[frame]) / (offsets[frame + 1] - offsets[frame]));
+  var tx = points[frame + 1][0] - points[frame][0];
+  var ty = points[frame + 1][1] - points[frame][1];
+  symbol.rotation = -Math.atan2(ty, tx) - Math.PI / 2;
+  this._lastFrame = frame;
+  this._lastFramePercent = t;
+  symbol.ignore = false;
+};
+
+inherits(EffectPolyline, EffectLine);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+// TODO Batch by color
+var LargeLineShape = extendShape({
+  shape: {
+    polyline: false,
+    curveness: 0,
+    segs: []
+  },
+  buildPath: function (path, shape) {
+    var segs = shape.segs;
+    var curveness = shape.curveness;
+
+    if (shape.polyline) {
+      for (var i = 0; i < segs.length;) {
+        var count = segs[i++];
+
+        if (count > 0) {
+          path.moveTo(segs[i++], segs[i++]);
+
+          for (var k = 1; k < count; k++) {
+            path.lineTo(segs[i++], segs[i++]);
+          }
+        }
+      }
+    } else {
+      for (var i = 0; i < segs.length;) {
+        var x0 = segs[i++];
+        var y0 = segs[i++];
+        var x1 = segs[i++];
+        var y1 = segs[i++];
+        path.moveTo(x0, y0);
+
+        if (curveness > 0) {
+          var x2 = (x0 + x1) / 2 - (y0 - y1) * curveness;
+          var y2 = (y0 + y1) / 2 - (x1 - x0) * curveness;
+          path.quadraticCurveTo(x2, y2, x1, y1);
+        } else {
+          path.lineTo(x1, y1);
+        }
+      }
+    }
+  },
+  findDataIndex: function (x, y) {
+    var shape = this.shape;
+    var segs = shape.segs;
+    var curveness = shape.curveness;
+
+    if (shape.polyline) {
+      var dataIndex = 0;
+
+      for (var i = 0; i < segs.length;) {
+        var count = segs[i++];
+
+        if (count > 0) {
+          var x0 = segs[i++];
+          var y0 = segs[i++];
+
+          for (var k = 1; k < count; k++) {
+            var x1 = segs[i++];
+            var y1 = segs[i++];
+
+            if (containStroke$1(x0, y0, x1, y1)) {
+              return dataIndex;
+            }
+          }
+        }
+
+        dataIndex++;
+      }
+    } else {
+      var dataIndex = 0;
+
+      for (var i = 0; i < segs.length;) {
+        var x0 = segs[i++];
+        var y0 = segs[i++];
+        var x1 = segs[i++];
+        var y1 = segs[i++];
+
+        if (curveness > 0) {
+          var x2 = (x0 + x1) / 2 - (y0 - y1) * curveness;
+          var y2 = (y0 + y1) / 2 - (x1 - x0) * curveness;
+
+          if (containStroke$3(x0, y0, x2, y2, x1, y1)) {
+            return dataIndex;
+          }
+        } else {
+          if (containStroke$1(x0, y0, x1, y1)) {
+            return dataIndex;
+          }
+        }
+
+        dataIndex++;
+      }
+    }
+
+    return -1;
+  }
+});
+
+function LargeLineDraw() {
+  this.group = new Group();
+}
+
+var largeLineProto = LargeLineDraw.prototype;
+
+largeLineProto.isPersistent = function () {
+  return !this._incremental;
+};
+/**
+ * Update symbols draw by new data
+ * @param {module:echarts/data/List} data
+ */
+
+
+largeLineProto.updateData = function (data) {
+  this.group.removeAll();
+  var lineEl = new LargeLineShape({
+    rectHover: true,
+    cursor: 'default'
+  });
+  lineEl.setShape({
+    segs: data.getLayout('linesPoints')
+  });
+
+  this._setCommon(lineEl, data); // Add back
+
+
+  this.group.add(lineEl);
+  this._incremental = null;
+};
+/**
+ * @override
+ */
+
+
+largeLineProto.incrementalPrepareUpdate = function (data) {
+  this.group.removeAll();
+
+  this._clearIncremental();
+
+  if (data.count() > 5e5) {
+    if (!this._incremental) {
+      this._incremental = new IncrementalDisplayble({
+        silent: true
+      });
+    }
+
+    this.group.add(this._incremental);
+  } else {
+    this._incremental = null;
+  }
+};
+/**
+ * @override
+ */
+
+
+largeLineProto.incrementalUpdate = function (taskParams, data) {
+  var lineEl = new LargeLineShape();
+  lineEl.setShape({
+    segs: data.getLayout('linesPoints')
+  });
+
+  this._setCommon(lineEl, data, !!this._incremental);
+
+  if (!this._incremental) {
+    lineEl.rectHover = true;
+    lineEl.cursor = 'default';
+    lineEl.__startIndex = taskParams.start;
+    this.group.add(lineEl);
+  } else {
+    this._incremental.addDisplayable(lineEl, true);
+  }
+};
+/**
+ * @override
+ */
+
+
+largeLineProto.remove = function () {
+  this._clearIncremental();
+
+  this._incremental = null;
+  this.group.removeAll();
+};
+
+largeLineProto._setCommon = function (lineEl, data, isIncremental) {
+  var hostModel = data.hostModel;
+  lineEl.setShape({
+    polyline: hostModel.get('polyline'),
+    curveness: hostModel.get('lineStyle.curveness')
+  });
+  lineEl.useStyle(hostModel.getModel('lineStyle').getLineStyle());
+  lineEl.style.strokeNoScale = true;
+  var visualColor = data.getVisual('color');
+
+  if (visualColor) {
+    lineEl.setStyle('stroke', visualColor);
+  }
+
+  lineEl.setStyle('fill');
+
+  if (!isIncremental) {
+    // Enable tooltip
+    // PENDING May have performance issue when path is extremely large
+    lineEl.seriesIndex = hostModel.seriesIndex;
+    lineEl.on('mousemove', function (e) {
+      lineEl.dataIndex = null;
+      var dataIndex = lineEl.findDataIndex(e.offsetX, e.offsetY);
+
+      if (dataIndex > 0) {
+        // Provide dataIndex for tooltip
+        lineEl.dataIndex = dataIndex + lineEl.__startIndex;
+      }
+    });
+  }
+};
+
+largeLineProto._clearIncremental = function () {
+  var incremental = this._incremental;
+
+  if (incremental) {
+    incremental.clearDisplaybles();
+  }
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/* global Float32Array */
+var linesLayout = {
+  seriesType: 'lines',
+  plan: createRenderPlanner(),
+  reset: function (seriesModel) {
+    var coordSys = seriesModel.coordinateSystem;
+    var isPolyline = seriesModel.get('polyline');
+    var isLarge = seriesModel.pipelineContext.large;
+
+    function progress(params, lineData) {
+      var lineCoords = [];
+
+      if (isLarge) {
+        var points;
+        var segCount = params.end - params.start;
+
+        if (isPolyline) {
+          var totalCoordsCount = 0;
+
+          for (var i = params.start; i < params.end; i++) {
+            totalCoordsCount += seriesModel.getLineCoordsCount(i);
+          }
+
+          points = new Float32Array(segCount + totalCoordsCount * 2);
+        } else {
+          points = new Float32Array(segCount * 4);
+        }
+
+        var offset = 0;
+        var pt = [];
+
+        for (var i = params.start; i < params.end; i++) {
+          var len = seriesModel.getLineCoords(i, lineCoords);
+
+          if (isPolyline) {
+            points[offset++] = len;
+          }
+
+          for (var k = 0; k < len; k++) {
+            pt = coordSys.dataToPoint(lineCoords[k], false, pt);
+            points[offset++] = pt[0];
+            points[offset++] = pt[1];
+          }
+        }
+
+        lineData.setLayout('linesPoints', points);
+      } else {
+        for (var i = params.start; i < params.end; i++) {
+          var itemModel = lineData.getItemModel(i);
+          var len = seriesModel.getLineCoords(i, lineCoords);
+          var pts = [];
+
+          if (isPolyline) {
+            for (var j = 0; j < len; j++) {
+              pts.push(coordSys.dataToPoint(lineCoords[j]));
+            }
+          } else {
+            pts[0] = coordSys.dataToPoint(lineCoords[0]);
+            pts[1] = coordSys.dataToPoint(lineCoords[1]);
+            var curveness = itemModel.get('lineStyle.curveness');
+
+            if (+curveness) {
+              pts[2] = [(pts[0][0] + pts[1][0]) / 2 - (pts[0][1] - pts[1][1]) * curveness, (pts[0][1] + pts[1][1]) / 2 - (pts[1][0] - pts[0][0]) * curveness];
+            }
+          }
+
+          lineData.setItemLayout(i, pts);
+        }
+      }
+    }
+
+    return {
+      progress: progress
+    };
+  }
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+extendChartView({
+  type: 'lines',
+  init: function () {},
+  render: function (seriesModel, ecModel, api) {
+    var data = seriesModel.getData();
+
+    var lineDraw = this._updateLineDraw(data, seriesModel);
+
+    var zlevel = seriesModel.get('zlevel');
+    var trailLength = seriesModel.get('effect.trailLength');
+    var zr = api.getZr(); // Avoid the drag cause ghost shadow
+    // FIXME Better way ?
+    // SVG doesn't support
+
+    var isSvg = zr.painter.getType() === 'svg';
+
+    if (!isSvg) {
+      zr.painter.getLayer(zlevel).clear(true);
+    } // Config layer with motion blur
+
+
+    if (this._lastZlevel != null && !isSvg) {
+      zr.configLayer(this._lastZlevel, {
+        motionBlur: false
+      });
+    }
+
+    if (this._showEffect(seriesModel) && trailLength) {
+      if (!isSvg) {
+        zr.configLayer(zlevel, {
+          motionBlur: true,
+          lastFrameAlpha: Math.max(Math.min(trailLength / 10 + 0.9, 1), 0)
+        });
+      }
+    }
+
+    lineDraw.updateData(data);
+    this._lastZlevel = zlevel;
+    this._finished = true;
+  },
+  incrementalPrepareRender: function (seriesModel, ecModel, api) {
+    var data = seriesModel.getData();
+
+    var lineDraw = this._updateLineDraw(data, seriesModel);
+
+    lineDraw.incrementalPrepareUpdate(data);
+
+    this._clearLayer(api);
+
+    this._finished = false;
+  },
+  incrementalRender: function (taskParams, seriesModel, ecModel) {
+    this._lineDraw.incrementalUpdate(taskParams, seriesModel.getData());
+
+    this._finished = taskParams.end === seriesModel.getData().count();
+  },
+  updateTransform: function (seriesModel, ecModel, api) {
+    var data = seriesModel.getData();
+    var pipelineContext = seriesModel.pipelineContext;
+
+    if (!this._finished || pipelineContext.large || pipelineContext.progressiveRender) {
+      // TODO Don't have to do update in large mode. Only do it when there are millions of data.
+      return {
+        update: true
+      };
+    } else {
+      // TODO Use same logic with ScatterView.
+      // Manually update layout
+      var res = linesLayout.reset(seriesModel);
+
+      if (res.progress) {
+        res.progress({
+          start: 0,
+          end: data.count()
+        }, data);
+      }
+
+      this._lineDraw.updateLayout();
+
+      this._clearLayer(api);
+    }
+  },
+  _updateLineDraw: function (data, seriesModel) {
+    var lineDraw = this._lineDraw;
+
+    var hasEffect = this._showEffect(seriesModel);
+
+    var isPolyline = !!seriesModel.get('polyline');
+    var pipelineContext = seriesModel.pipelineContext;
+    var isLargeDraw = pipelineContext.large;
+
+    if (!lineDraw || hasEffect !== this._hasEffet || isPolyline !== this._isPolyline || isLargeDraw !== this._isLargeDraw) {
+      if (lineDraw) {
+        lineDraw.remove();
+      }
+
+      lineDraw = this._lineDraw = isLargeDraw ? new LargeLineDraw() : new LineDraw(isPolyline ? hasEffect ? EffectPolyline : Polyline$2 : hasEffect ? EffectLine : Line$1);
+      this._hasEffet = hasEffect;
+      this._isPolyline = isPolyline;
+      this._isLargeDraw = isLargeDraw;
+      this.group.removeAll();
+    }
+
+    this.group.add(lineDraw.group);
+    return lineDraw;
+  },
+  _showEffect: function (seriesModel) {
+    return !!seriesModel.get('effect.show');
+  },
+  _clearLayer: function (api) {
+    // Not use motion when dragging or zooming
+    var zr = api.getZr();
+    var isSvg = zr.painter.getType() === 'svg';
+
+    if (!isSvg && this._lastZlevel != null) {
+      zr.painter.getLayer(this._lastZlevel).clear(true);
+    }
+  },
+  remove: function (ecModel, api) {
+    this._lineDraw && this._lineDraw.remove();
+    this._lineDraw = null; // Clear motion when lineDraw is removed
+
+    this._clearLayer(api);
+  },
+  dispose: function () {}
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+function normalize$1(a) {
+  if (!(a instanceof Array)) {
+    a = [a, a];
+  }
+
+  return a;
+}
+
+var opacityQuery = 'lineStyle.opacity'.split('.');
+var linesVisual = {
+  seriesType: 'lines',
+  reset: function (seriesModel, ecModel, api) {
+    var symbolType = normalize$1(seriesModel.get('symbol'));
+    var symbolSize = normalize$1(seriesModel.get('symbolSize'));
+    var data = seriesModel.getData();
+    data.setVisual('fromSymbol', symbolType && symbolType[0]);
+    data.setVisual('toSymbol', symbolType && symbolType[1]);
+    data.setVisual('fromSymbolSize', symbolSize && symbolSize[0]);
+    data.setVisual('toSymbolSize', symbolSize && symbolSize[1]);
+    data.setVisual('opacity', seriesModel.get(opacityQuery));
+
+    function dataEach(data, idx) {
+      var itemModel = data.getItemModel(idx);
+      var symbolType = normalize$1(itemModel.getShallow('symbol', true));
+      var symbolSize = normalize$1(itemModel.getShallow('symbolSize', true));
+      var opacity = itemModel.get(opacityQuery);
+      symbolType[0] && data.setItemVisual(idx, 'fromSymbol', symbolType[0]);
+      symbolType[1] && data.setItemVisual(idx, 'toSymbol', symbolType[1]);
+      symbolSize[0] && data.setItemVisual(idx, 'fromSymbolSize', symbolSize[0]);
+      symbolSize[1] && data.setItemVisual(idx, 'toSymbolSize', symbolSize[1]);
+      data.setItemVisual(idx, 'opacity', opacity);
+    }
+
+    return {
+      dataEach: data.hasItemOption ? dataEach : null
+    };
+  }
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+registerLayout(linesLayout);
+registerVisual(linesVisual);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * Graph data structure
+ *
+ * @module echarts/data/Graph
+ * @author Yi Shen(https://www.github.com/pissang)
+ */
+function generateNodeKey(id) {
+  return '_EC_' + id;
+}
+/**
+ * @alias module:echarts/data/Graph
+ * @constructor
+ * @param {boolean} directed
+ */
+
+
+var Graph = function (directed) {
+  /**
+   * 鏄惁鏄湁鍚戝浘
+   * @type {boolean}
+   * @private
+   */
+  this._directed = directed || false;
+  /**
+   * @type {Array.<module:echarts/data/Graph.Node>}
+   * @readOnly
+   */
+
+  this.nodes = [];
+  /**
+   * @type {Array.<module:echarts/data/Graph.Edge>}
+   * @readOnly
+   */
+
+  this.edges = [];
+  /**
+   * @type {Object.<string, module:echarts/data/Graph.Node>}
+   * @private
+   */
+
+  this._nodesMap = {};
+  /**
+   * @type {Object.<string, module:echarts/data/Graph.Edge>}
+   * @private
+   */
+
+  this._edgesMap = {};
+  /**
+   * @type {module:echarts/data/List}
+   * @readOnly
+   */
+
+  this.data;
+  /**
+   * @type {module:echarts/data/List}
+   * @readOnly
+   */
+
+  this.edgeData;
+};
+
+var graphProto = Graph.prototype;
+/**
+ * @type {string}
+ */
+
+graphProto.type = 'graph';
+/**
+ * If is directed graph
+ * @return {boolean}
+ */
+
+graphProto.isDirected = function () {
+  return this._directed;
+};
+/**
+ * Add a new node
+ * @param {string} id
+ * @param {number} [dataIndex]
+ */
+
+
+graphProto.addNode = function (id, dataIndex) {
+  id = id || '' + dataIndex;
+  var nodesMap = this._nodesMap;
+
+  if (nodesMap[generateNodeKey(id)]) {
+    return;
+  }
+
+  var node = new Node(id, dataIndex);
+  node.hostGraph = this;
+  this.nodes.push(node);
+  nodesMap[generateNodeKey(id)] = node;
+  return node;
+};
+/**
+ * Get node by data index
+ * @param  {number} dataIndex
+ * @return {module:echarts/data/Graph~Node}
+ */
+
+
+graphProto.getNodeByIndex = function (dataIndex) {
+  var rawIdx = this.data.getRawIndex(dataIndex);
+  return this.nodes[rawIdx];
+};
+/**
+ * Get node by id
+ * @param  {string} id
+ * @return {module:echarts/data/Graph.Node}
+ */
+
+
+graphProto.getNodeById = function (id) {
+  return this._nodesMap[generateNodeKey(id)];
+};
+/**
+ * Add a new edge
+ * @param {number|string|module:echarts/data/Graph.Node} n1
+ * @param {number|string|module:echarts/data/Graph.Node} n2
+ * @param {number} [dataIndex=-1]
+ * @return {module:echarts/data/Graph.Edge}
+ */
+
+
+graphProto.addEdge = function (n1, n2, dataIndex) {
+  var nodesMap = this._nodesMap;
+  var edgesMap = this._edgesMap; // PNEDING
+
+  if (typeof n1 === 'number') {
+    n1 = this.nodes[n1];
+  }
+
+  if (typeof n2 === 'number') {
+    n2 = this.nodes[n2];
+  }
+
+  if (!Node.isInstance(n1)) {
+    n1 = nodesMap[generateNodeKey(n1)];
+  }
+
+  if (!Node.isInstance(n2)) {
+    n2 = nodesMap[generateNodeKey(n2)];
+  }
+
+  if (!n1 || !n2) {
+    return;
+  }
+
+  var key = n1.id + '-' + n2.id; // PENDING
+
+  if (edgesMap[key]) {
+    return;
+  }
+
+  var edge = new Edge(n1, n2, dataIndex);
+  edge.hostGraph = this;
+
+  if (this._directed) {
+    n1.outEdges.push(edge);
+    n2.inEdges.push(edge);
+  }
+
+  n1.edges.push(edge);
+
+  if (n1 !== n2) {
+    n2.edges.push(edge);
+  }
+
+  this.edges.push(edge);
+  edgesMap[key] = edge;
+  return edge;
+};
+/**
+ * Get edge by data index
+ * @param  {number} dataIndex
+ * @return {module:echarts/data/Graph~Node}
+ */
+
+
+graphProto.getEdgeByIndex = function (dataIndex) {
+  var rawIdx = this.edgeData.getRawIndex(dataIndex);
+  return this.edges[rawIdx];
+};
+/**
+ * Get edge by two linked nodes
+ * @param  {module:echarts/data/Graph.Node|string} n1
+ * @param  {module:echarts/data/Graph.Node|string} n2
+ * @return {module:echarts/data/Graph.Edge}
+ */
+
+
+graphProto.getEdge = function (n1, n2) {
+  if (Node.isInstance(n1)) {
+    n1 = n1.id;
+  }
+
+  if (Node.isInstance(n2)) {
+    n2 = n2.id;
+  }
+
+  var edgesMap = this._edgesMap;
+
+  if (this._directed) {
+    return edgesMap[n1 + '-' + n2];
+  } else {
+    return edgesMap[n1 + '-' + n2] || edgesMap[n2 + '-' + n1];
+  }
+};
+/**
+ * Iterate all nodes
+ * @param  {Function} cb
+ * @param  {*} [context]
+ */
+
+
+graphProto.eachNode = function (cb, context) {
+  var nodes = this.nodes;
+  var len = nodes.length;
+
+  for (var i = 0; i < len; i++) {
+    if (nodes[i].dataIndex >= 0) {
+      cb.call(context, nodes[i], i);
+    }
+  }
+};
+/**
+ * Iterate all edges
+ * @param  {Function} cb
+ * @param  {*} [context]
+ */
+
+
+graphProto.eachEdge = function (cb, context) {
+  var edges = this.edges;
+  var len = edges.length;
+
+  for (var i = 0; i < len; i++) {
+    if (edges[i].dataIndex >= 0 && edges[i].node1.dataIndex >= 0 && edges[i].node2.dataIndex >= 0) {
+      cb.call(context, edges[i], i);
+    }
+  }
+};
+/**
+ * Breadth first traverse
+ * @param {Function} cb
+ * @param {module:echarts/data/Graph.Node} startNode
+ * @param {string} [direction='none'] 'none'|'in'|'out'
+ * @param {*} [context]
+ */
+
+
+graphProto.breadthFirstTraverse = function (cb, startNode, direction, context) {
+  if (!Node.isInstance(startNode)) {
+    startNode = this._nodesMap[generateNodeKey(startNode)];
+  }
+
+  if (!startNode) {
+    return;
+  }
+
+  var edgeType = direction === 'out' ? 'outEdges' : direction === 'in' ? 'inEdges' : 'edges';
+
+  for (var i = 0; i < this.nodes.length; i++) {
+    this.nodes[i].__visited = false;
+  }
+
+  if (cb.call(context, startNode, null)) {
+    return;
+  }
+
+  var queue = [startNode];
+
+  while (queue.length) {
+    var currentNode = queue.shift();
+    var edges = currentNode[edgeType];
+
+    for (var i = 0; i < edges.length; i++) {
+      var e = edges[i];
+      var otherNode = e.node1 === currentNode ? e.node2 : e.node1;
+
+      if (!otherNode.__visited) {
+        if (cb.call(context, otherNode, currentNode)) {
+          // Stop traversing
+          return;
+        }
+
+        queue.push(otherNode);
+        otherNode.__visited = true;
+      }
+    }
+  }
+}; // TODO
+// graphProto.depthFirstTraverse = function (
+//     cb, startNode, direction, context
+// ) {
+// };
+// Filter update
+
+
+graphProto.update = function () {
+  var data = this.data;
+  var edgeData = this.edgeData;
+  var nodes = this.nodes;
+  var edges = this.edges;
+
+  for (var i = 0, len = nodes.length; i < len; i++) {
+    nodes[i].dataIndex = -1;
+  }
+
+  for (var i = 0, len = data.count(); i < len; i++) {
+    nodes[data.getRawIndex(i)].dataIndex = i;
+  }
+
+  edgeData.filterSelf(function (idx) {
+    var edge = edges[edgeData.getRawIndex(idx)];
+    return edge.node1.dataIndex >= 0 && edge.node2.dataIndex >= 0;
+  }); // Update edge
+
+  for (var i = 0, len = edges.length; i < len; i++) {
+    edges[i].dataIndex = -1;
+  }
+
+  for (var i = 0, len = edgeData.count(); i < len; i++) {
+    edges[edgeData.getRawIndex(i)].dataIndex = i;
+  }
+};
+/**
+ * @return {module:echarts/data/Graph}
+ */
+
+
+graphProto.clone = function () {
+  var graph = new Graph(this._directed);
+  var nodes = this.nodes;
+  var edges = this.edges;
+
+  for (var i = 0; i < nodes.length; i++) {
+    graph.addNode(nodes[i].id, nodes[i].dataIndex);
+  }
+
+  for (var i = 0; i < edges.length; i++) {
+    var e = edges[i];
+    graph.addEdge(e.node1.id, e.node2.id, e.dataIndex);
+  }
+
+  return graph;
+};
+/**
+ * @alias module:echarts/data/Graph.Node
+ */
+
+
+function Node(id, dataIndex) {
+  /**
+  * @type {string}
+  */
+  this.id = id == null ? '' : id;
+  /**
+  * @type {Array.<module:echarts/data/Graph.Edge>}
+  */
+
+  this.inEdges = [];
+  /**
+  * @type {Array.<module:echarts/data/Graph.Edge>}
+  */
+
+  this.outEdges = [];
+  /**
+  * @type {Array.<module:echarts/data/Graph.Edge>}
+  */
+
+  this.edges = [];
+  /**
+   * @type {module:echarts/data/Graph}
+   */
+
+  this.hostGraph;
+  /**
+   * @type {number}
+   */
+
+  this.dataIndex = dataIndex == null ? -1 : dataIndex;
+}
+
+Node.prototype = {
+  constructor: Node,
+
+  /**
+   * @return {number}
+   */
+  degree: function () {
+    return this.edges.length;
+  },
+
+  /**
+   * @return {number}
+   */
+  inDegree: function () {
+    return this.inEdges.length;
+  },
+
+  /**
+  * @return {number}
+  */
+  outDegree: function () {
+    return this.outEdges.length;
+  },
+
+  /**
+   * @param {string} [path]
+   * @return {module:echarts/model/Model}
+   */
+  getModel: function (path) {
+    if (this.dataIndex < 0) {
+      return;
+    }
+
+    var graph = this.hostGraph;
+    var itemModel = graph.data.getItemModel(this.dataIndex);
+    return itemModel.getModel(path);
+  }
+};
+/**
+ * 鍥捐竟
+ * @alias module:echarts/data/Graph.Edge
+ * @param {module:echarts/data/Graph.Node} n1
+ * @param {module:echarts/data/Graph.Node} n2
+ * @param {number} [dataIndex=-1]
+ */
+
+function Edge(n1, n2, dataIndex) {
+  /**
+   * 鑺傜偣1锛屽鏋滄槸鏈夊悜鍥惧垯涓烘簮鑺傜偣
+   * @type {module:echarts/data/Graph.Node}
+   */
+  this.node1 = n1;
+  /**
+   * 鑺傜偣2锛屽鏋滄槸鏈夊悜鍥惧垯涓虹洰鏍囪妭鐐�
+   * @type {module:echarts/data/Graph.Node}
+   */
+
+  this.node2 = n2;
+  this.dataIndex = dataIndex == null ? -1 : dataIndex;
+}
+/**
+ * @param {string} [path]
+ * @return {module:echarts/model/Model}
+ */
+
+
+Edge.prototype.getModel = function (path) {
+  if (this.dataIndex < 0) {
+    return;
+  }
+
+  var graph = this.hostGraph;
+  var itemModel = graph.edgeData.getItemModel(this.dataIndex);
+  return itemModel.getModel(path);
+};
+
+var createGraphDataProxyMixin = function (hostName, dataName) {
+  return {
+    /**
+     * @param {string=} [dimension='value'] Default 'value'. can be 'a', 'b', 'c', 'd', 'e'.
+     * @return {number}
+     */
+    getValue: function (dimension) {
+      var data = this[hostName][dataName];
+      return data.get(data.getDimension(dimension || 'value'), this.dataIndex);
+    },
+
+    /**
+     * @param {Object|string} key
+     * @param {*} [value]
+     */
+    setVisual: function (key, value) {
+      this.dataIndex >= 0 && this[hostName][dataName].setItemVisual(this.dataIndex, key, value);
+    },
+
+    /**
+     * @param {string} key
+     * @return {boolean}
+     */
+    getVisual: function (key, ignoreParent) {
+      return this[hostName][dataName].getItemVisual(this.dataIndex, key, ignoreParent);
+    },
+
+    /**
+     * @param {Object} layout
+     * @return {boolean} [merge=false]
+     */
+    setLayout: function (layout, merge$$1) {
+      this.dataIndex >= 0 && this[hostName][dataName].setItemLayout(this.dataIndex, layout, merge$$1);
+    },
+
+    /**
+     * @return {Object}
+     */
+    getLayout: function () {
+      return this[hostName][dataName].getItemLayout(this.dataIndex);
+    },
+
+    /**
+     * @return {module:zrender/Element}
+     */
+    getGraphicEl: function () {
+      return this[hostName][dataName].getItemGraphicEl(this.dataIndex);
+    },
+
+    /**
+     * @return {number}
+     */
+    getRawIndex: function () {
+      return this[hostName][dataName].getRawIndex(this.dataIndex);
+    }
+  };
+};
+
+mixin(Node, createGraphDataProxyMixin('hostGraph', 'data'));
+mixin(Edge, createGraphDataProxyMixin('hostGraph', 'edgeData'));
+Graph.Node = Node;
+Graph.Edge = Edge;
+enableClassCheck(Node);
+enableClassCheck(Edge);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var createGraphFromNodeEdge = function (nodes, edges, seriesModel, directed, beforeLink) {
+  // ??? TODO
+  // support dataset?
+  var graph = new Graph(directed);
+
+  for (var i = 0; i < nodes.length; i++) {
+    graph.addNode(retrieve( // Id, name, dataIndex
+    nodes[i].id, nodes[i].name, i), i);
+  }
+
+  var linkNameList = [];
+  var validEdges = [];
+  var linkCount = 0;
+
+  for (var i = 0; i < edges.length; i++) {
+    var link = edges[i];
+    var source = link.source;
+    var target = link.target; // addEdge may fail when source or target not exists
+
+    if (graph.addEdge(source, target, linkCount)) {
+      validEdges.push(link);
+      linkNameList.push(retrieve(link.id, source + ' > ' + target));
+      linkCount++;
+    }
+  }
+
+  var coordSys = seriesModel.get('coordinateSystem');
+  var nodeData;
+
+  if (coordSys === 'cartesian2d' || coordSys === 'polar') {
+    nodeData = createListFromArray(nodes, seriesModel);
+  } else {
+    var coordSysCtor = CoordinateSystemManager.get(coordSys);
+    var coordDimensions = coordSysCtor && coordSysCtor.type !== 'view' ? coordSysCtor.dimensions || [] : []; // FIXME: Some geo do not need `value` dimenson, whereas `calendar` needs
+    // `value` dimension, but graph need `value` dimension. It's better to
+    // uniform this behavior.
+
+    if (indexOf(coordDimensions, 'value') < 0) {
+      coordDimensions.concat(['value']);
+    }
+
+    var dimensionNames = createDimensions(nodes, {
+      coordDimensions: coordDimensions
+    });
+    nodeData = new List(dimensionNames, seriesModel);
+    nodeData.initData(nodes);
+  }
+
+  var edgeData = new List(['value'], seriesModel);
+  edgeData.initData(validEdges, linkNameList);
+  beforeLink && beforeLink(nodeData, edgeData);
+  linkList({
+    mainData: nodeData,
+    struct: graph,
+    structAttr: 'graph',
+    datas: {
+      node: nodeData,
+      edge: edgeData
+    },
+    datasAttr: {
+      node: 'data',
+      edge: 'edgeData'
+    }
+  }); // Update dataIndex of nodes and edges because invalid edge may be removed
+
+  graph.update();
+  return graph;
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var GraphSeries = extendSeriesModel({
+  type: 'series.graph',
+  init: function (option) {
+    GraphSeries.superApply(this, 'init', arguments); // Provide data for legend select
+
+    this.legendDataProvider = function () {
+      return this._categoriesData;
+    };
+
+    this.fillDataTextStyle(option.edges || option.links);
+
+    this._updateCategoriesData();
+  },
+  mergeOption: function (option) {
+    GraphSeries.superApply(this, 'mergeOption', arguments);
+    this.fillDataTextStyle(option.edges || option.links);
+
+    this._updateCategoriesData();
+  },
+  mergeDefaultAndTheme: function (option) {
+    GraphSeries.superApply(this, 'mergeDefaultAndTheme', arguments);
+    defaultEmphasis(option, ['edgeLabel'], ['show']);
+  },
+  getInitialData: function (option, ecModel) {
+    var edges = option.edges || option.links || [];
+    var nodes = option.data || option.nodes || [];
+    var self = this;
+
+    if (nodes && edges) {
+      return createGraphFromNodeEdge(nodes, edges, this, true, beforeLink).data;
+    }
+
+    function beforeLink(nodeData, edgeData) {
+      // Overwrite nodeData.getItemModel to
+      nodeData.wrapMethod('getItemModel', function (model) {
+        var categoriesModels = self._categoriesModels;
+        var categoryIdx = model.getShallow('category');
+        var categoryModel = categoriesModels[categoryIdx];
+
+        if (categoryModel) {
+          categoryModel.parentModel = model.parentModel;
+          model.parentModel = categoryModel;
+        }
+
+        return model;
+      });
+      var edgeLabelModel = self.getModel('edgeLabel'); // For option `edgeLabel` can be found by label.xxx.xxx on item mode.
+
+      var fakeSeriesModel = new Model({
+        label: edgeLabelModel.option
+      }, edgeLabelModel.parentModel, ecModel);
+      var emphasisEdgeLabelModel = self.getModel('emphasis.edgeLabel');
+      var emphasisFakeSeriesModel = new Model({
+        emphasis: {
+          label: emphasisEdgeLabelModel.option
+        }
+      }, emphasisEdgeLabelModel.parentModel, ecModel);
+      edgeData.wrapMethod('getItemModel', function (model) {
+        model.customizeGetParent(edgeGetParent);
+        return model;
+      });
+
+      function edgeGetParent(path) {
+        path = this.parsePath(path);
+        return path && path[0] === 'label' ? fakeSeriesModel : path && path[0] === 'emphasis' && path[1] === 'label' ? emphasisFakeSeriesModel : this.parentModel;
+      }
+    }
+  },
+
+  /**
+   * @return {module:echarts/data/Graph}
+   */
+  getGraph: function () {
+    return this.getData().graph;
+  },
+
+  /**
+   * @return {module:echarts/data/List}
+   */
+  getEdgeData: function () {
+    return this.getGraph().edgeData;
+  },
+
+  /**
+   * @return {module:echarts/data/List}
+   */
+  getCategoriesData: function () {
+    return this._categoriesData;
+  },
+
+  /**
+   * @override
+   */
+  formatTooltip: function (dataIndex, multipleSeries, dataType) {
+    if (dataType === 'edge') {
+      var nodeData = this.getData();
+      var params = this.getDataParams(dataIndex, dataType);
+      var edge = nodeData.graph.getEdgeByIndex(dataIndex);
+      var sourceName = nodeData.getName(edge.node1.dataIndex);
+      var targetName = nodeData.getName(edge.node2.dataIndex);
+      var html = [];
+      sourceName != null && html.push(sourceName);
+      targetName != null && html.push(targetName);
+      html = encodeHTML(html.join(' > '));
+
+      if (params.value) {
+        html += ' : ' + encodeHTML(params.value);
+      }
+
+      return html;
+    } else {
+      // dataType === 'node' or empty
+      return GraphSeries.superApply(this, 'formatTooltip', arguments);
+    }
+  },
+  _updateCategoriesData: function () {
+    var categories = map(this.option.categories || [], function (category) {
+      // Data must has value
+      return category.value != null ? category : extend({
+        value: 0
+      }, category);
+    });
+    var categoriesData = new List(['value'], this);
+    categoriesData.initData(categories);
+    this._categoriesData = categoriesData;
+    this._categoriesModels = categoriesData.mapArray(function (idx) {
+      return categoriesData.getItemModel(idx, true);
+    });
+  },
+  setZoom: function (zoom) {
+    this.option.zoom = zoom;
+  },
+  setCenter: function (center) {
+    this.option.center = center;
+  },
+  isAnimationEnabled: function () {
+    return GraphSeries.superCall(this, 'isAnimationEnabled') // Not enable animation when do force layout
+    && !(this.get('layout') === 'force' && this.get('force.layoutAnimation'));
+  },
+  defaultOption: {
+    zlevel: 0,
+    z: 2,
+    coordinateSystem: 'view',
+    // Default option for all coordinate systems
+    // xAxisIndex: 0,
+    // yAxisIndex: 0,
+    // polarIndex: 0,
+    // geoIndex: 0,
+    legendHoverLink: true,
+    hoverAnimation: true,
+    layout: null,
+    focusNodeAdjacency: false,
+    // Configuration of circular layout
+    circular: {
+      rotateLabel: false
+    },
+    // Configuration of force directed layout
+    force: {
+      initLayout: null,
+      // Node repulsion. Can be an array to represent range.
+      repulsion: [0, 50],
+      gravity: 0.1,
+      // Edge length. Can be an array to represent range.
+      edgeLength: 30,
+      layoutAnimation: true
+    },
+    left: 'center',
+    top: 'center',
+    // right: null,
+    // bottom: null,
+    // width: '80%',
+    // height: '80%',
+    symbol: 'circle',
+    symbolSize: 10,
+    edgeSymbol: ['none', 'none'],
+    edgeSymbolSize: 10,
+    edgeLabel: {
+      position: 'middle'
+    },
+    draggable: false,
+    roam: false,
+    // Default on center of graph
+    center: null,
+    zoom: 1,
+    // Symbol size scale ratio in roam
+    nodeScaleRatio: 0.6,
+    // cursor: null,
+    // categories: [],
+    // data: []
+    // Or
+    // nodes: []
+    //
+    // links: []
+    // Or
+    // edges: []
+    label: {
+      show: false,
+      formatter: '{b}'
+    },
+    itemStyle: {},
+    lineStyle: {
+      color: '#aaa',
+      width: 1,
+      curveness: 0,
+      opacity: 0.5
+    },
+    emphasis: {
+      label: {
+        show: true
+      }
+    }
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var v1 = [];
+var v2 = [];
+var v3 = [];
+var quadraticAt$1 = quadraticAt;
+var v2DistSquare = distSquare;
+var mathAbs$1 = Math.abs;
+
+function intersectCurveCircle(curvePoints, center, radius) {
+  var p0 = curvePoints[0];
+  var p1 = curvePoints[1];
+  var p2 = curvePoints[2];
+  var d = Infinity;
+  var t;
+  var radiusSquare = radius * radius;
+  var interval = 0.1;
+
+  for (var _t = 0.1; _t <= 0.9; _t += 0.1) {
+    v1[0] = quadraticAt$1(p0[0], p1[0], p2[0], _t);
+    v1[1] = quadraticAt$1(p0[1], p1[1], p2[1], _t);
+    var diff = mathAbs$1(v2DistSquare(v1, center) - radiusSquare);
+
+    if (diff < d) {
+      d = diff;
+      t = _t;
+    }
+  } // Assume the segment is monotone锛孎ind root through Bisection method
+  // At most 32 iteration
+
+
+  for (var i = 0; i < 32; i++) {
+    // var prev = t - interval;
+    var next = t + interval; // v1[0] = quadraticAt(p0[0], p1[0], p2[0], prev);
+    // v1[1] = quadraticAt(p0[1], p1[1], p2[1], prev);
+
+    v2[0] = quadraticAt$1(p0[0], p1[0], p2[0], t);
+    v2[1] = quadraticAt$1(p0[1], p1[1], p2[1], t);
+    v3[0] = quadraticAt$1(p0[0], p1[0], p2[0], next);
+    v3[1] = quadraticAt$1(p0[1], p1[1], p2[1], next);
+    var diff = v2DistSquare(v2, center) - radiusSquare;
+
+    if (mathAbs$1(diff) < 1e-2) {
+      break;
+    } // var prevDiff = v2DistSquare(v1, center) - radiusSquare;
+
+
+    var nextDiff = v2DistSquare(v3, center) - radiusSquare;
+    interval /= 2;
+
+    if (diff < 0) {
+      if (nextDiff >= 0) {
+        t = t + interval;
+      } else {
+        t = t - interval;
+      }
+    } else {
+      if (nextDiff >= 0) {
+        t = t - interval;
+      } else {
+        t = t + interval;
+      }
+    }
+  }
+
+  return t;
+} // Adjust edge to avoid
+
+
+var adjustEdge = function (graph, scale$$1) {
+  var tmp0 = [];
+  var quadraticSubdivide$$1 = quadraticSubdivide;
+  var pts = [[], [], []];
+  var pts2 = [[], []];
+  var v = [];
+  scale$$1 /= 2;
+
+  function getSymbolSize(node) {
+    var symbolSize = node.getVisual('symbolSize');
+
+    if (symbolSize instanceof Array) {
+      symbolSize = (symbolSize[0] + symbolSize[1]) / 2;
+    }
+
+    return symbolSize;
+  }
+
+  graph.eachEdge(function (edge, idx) {
+    var linePoints = edge.getLayout();
+    var fromSymbol = edge.getVisual('fromSymbol');
+    var toSymbol = edge.getVisual('toSymbol');
+
+    if (!linePoints.__original) {
+      linePoints.__original = [clone$1(linePoints[0]), clone$1(linePoints[1])];
+
+      if (linePoints[2]) {
+        linePoints.__original.push(clone$1(linePoints[2]));
+      }
+    }
+
+    var originalPoints = linePoints.__original; // Quadratic curve
+
+    if (linePoints[2] != null) {
+      copy(pts[0], originalPoints[0]);
+      copy(pts[1], originalPoints[2]);
+      copy(pts[2], originalPoints[1]);
+
+      if (fromSymbol && fromSymbol !== 'none') {
+        var symbolSize = getSymbolSize(edge.node1);
+        var t = intersectCurveCircle(pts, originalPoints[0], symbolSize * scale$$1); // Subdivide and get the second
+
+        quadraticSubdivide$$1(pts[0][0], pts[1][0], pts[2][0], t, tmp0);
+        pts[0][0] = tmp0[3];
+        pts[1][0] = tmp0[4];
+        quadraticSubdivide$$1(pts[0][1], pts[1][1], pts[2][1], t, tmp0);
+        pts[0][1] = tmp0[3];
+        pts[1][1] = tmp0[4];
+      }
+
+      if (toSymbol && toSymbol !== 'none') {
+        var symbolSize = getSymbolSize(edge.node2);
+        var t = intersectCurveCircle(pts, originalPoints[1], symbolSize * scale$$1); // Subdivide and get the first
+
+        quadraticSubdivide$$1(pts[0][0], pts[1][0], pts[2][0], t, tmp0);
+        pts[1][0] = tmp0[1];
+        pts[2][0] = tmp0[2];
+        quadraticSubdivide$$1(pts[0][1], pts[1][1], pts[2][1], t, tmp0);
+        pts[1][1] = tmp0[1];
+        pts[2][1] = tmp0[2];
+      } // Copy back to layout
+
+
+      copy(linePoints[0], pts[0]);
+      copy(linePoints[1], pts[2]);
+      copy(linePoints[2], pts[1]);
+    } // Line
+    else {
+        copy(pts2[0], originalPoints[0]);
+        copy(pts2[1], originalPoints[1]);
+        sub(v, pts2[1], pts2[0]);
+        normalize(v, v);
+
+        if (fromSymbol && fromSymbol !== 'none') {
+          var symbolSize = getSymbolSize(edge.node1);
+          scaleAndAdd(pts2[0], pts2[0], v, symbolSize * scale$$1);
+        }
+
+        if (toSymbol && toSymbol !== 'none') {
+          var symbolSize = getSymbolSize(edge.node2);
+          scaleAndAdd(pts2[1], pts2[1], v, -symbolSize * scale$$1);
+        }
+
+        copy(linePoints[0], pts2[0]);
+        copy(linePoints[1], pts2[1]);
+      }
+  });
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var nodeOpacityPath = ['itemStyle', 'opacity'];
+var lineOpacityPath = ['lineStyle', 'opacity'];
+
+function getItemOpacity(item, opacityPath) {
+  return item.getVisual('opacity') || item.getModel().get(opacityPath);
+}
+
+function fadeOutItem(item, opacityPath, opacityRatio) {
+  var el = item.getGraphicEl();
+  var opacity = getItemOpacity(item, opacityPath);
+
+  if (opacityRatio != null) {
+    opacity == null && (opacity = 1);
+    opacity *= opacityRatio;
+  }
+
+  el.downplay && el.downplay();
+  el.traverse(function (child) {
+    if (child.type !== 'group') {
+      child.setStyle('opacity', opacity);
+    }
+  });
+}
+
+function fadeInItem(item, opacityPath) {
+  var opacity = getItemOpacity(item, opacityPath);
+  var el = item.getGraphicEl();
+  el.highlight && el.highlight();
+  el.traverse(function (child) {
+    if (child.type !== 'group') {
+      child.setStyle('opacity', opacity);
+    }
+  });
+}
+
+extendChartView({
+  type: 'graph',
+  init: function (ecModel, api) {
+    var symbolDraw = new SymbolDraw();
+    var lineDraw = new LineDraw();
+    var group = this.group;
+    this._controller = new RoamController(api.getZr());
+    this._controllerHost = {
+      target: group
+    };
+    group.add(symbolDraw.group);
+    group.add(lineDraw.group);
+    this._symbolDraw = symbolDraw;
+    this._lineDraw = lineDraw;
+    this._firstRender = true;
+  },
+  render: function (seriesModel, ecModel, api) {
+    var coordSys = seriesModel.coordinateSystem;
+    this._model = seriesModel;
+    this._nodeScaleRatio = seriesModel.get('nodeScaleRatio');
+    var symbolDraw = this._symbolDraw;
+    var lineDraw = this._lineDraw;
+    var group = this.group;
+
+    if (coordSys.type === 'view') {
+      var groupNewProp = {
+        position: coordSys.position,
+        scale: coordSys.scale
+      };
+
+      if (this._firstRender) {
+        group.attr(groupNewProp);
+      } else {
+        updateProps(group, groupNewProp, seriesModel);
+      }
+    } // Fix edge contact point with node
+
+
+    adjustEdge(seriesModel.getGraph(), this._getNodeGlobalScale(seriesModel));
+    var data = seriesModel.getData();
+    symbolDraw.updateData(data);
+    var edgeData = seriesModel.getEdgeData();
+    lineDraw.updateData(edgeData);
+
+    this._updateNodeAndLinkScale();
+
+    this._updateController(seriesModel, ecModel, api);
+
+    clearTimeout(this._layoutTimeout);
+    var forceLayout = seriesModel.forceLayout;
+    var layoutAnimation = seriesModel.get('force.layoutAnimation');
+
+    if (forceLayout) {
+      this._startForceLayoutIteration(forceLayout, layoutAnimation);
+    }
+
+    data.eachItemGraphicEl(function (el, idx) {
+      var itemModel = data.getItemModel(idx); // Update draggable
+
+      el.off('drag').off('dragend');
+      var draggable = itemModel.get('draggable');
+
+      if (draggable) {
+        el.on('drag', function () {
+          if (forceLayout) {
+            forceLayout.warmUp();
+            !this._layouting && this._startForceLayoutIteration(forceLayout, layoutAnimation);
+            forceLayout.setFixed(idx); // Write position back to layout
+
+            data.setItemLayout(idx, el.position);
+          }
+        }, this).on('dragend', function () {
+          if (forceLayout) {
+            forceLayout.setUnfixed(idx);
+          }
+        }, this);
+      }
+
+      el.setDraggable(draggable && forceLayout);
+      el.off('mouseover', el.__focusNodeAdjacency);
+      el.off('mouseout', el.__unfocusNodeAdjacency);
+
+      if (itemModel.get('focusNodeAdjacency')) {
+        el.on('mouseover', el.__focusNodeAdjacency = function () {
+          api.dispatchAction({
+            type: 'focusNodeAdjacency',
+            seriesId: seriesModel.id,
+            dataIndex: el.dataIndex
+          });
+        });
+        el.on('mouseout', el.__unfocusNodeAdjacency = function () {
+          api.dispatchAction({
+            type: 'unfocusNodeAdjacency',
+            seriesId: seriesModel.id
+          });
+        });
+      }
+    }, this);
+    data.graph.eachEdge(function (edge) {
+      var el = edge.getGraphicEl();
+      el.off('mouseover', el.__focusNodeAdjacency);
+      el.off('mouseout', el.__unfocusNodeAdjacency);
+
+      if (edge.getModel().get('focusNodeAdjacency')) {
+        el.on('mouseover', el.__focusNodeAdjacency = function () {
+          api.dispatchAction({
+            type: 'focusNodeAdjacency',
+            seriesId: seriesModel.id,
+            edgeDataIndex: edge.dataIndex
+          });
+        });
+        el.on('mouseout', el.__unfocusNodeAdjacency = function () {
+          api.dispatchAction({
+            type: 'unfocusNodeAdjacency',
+            seriesId: seriesModel.id
+          });
+        });
+      }
+    });
+    var circularRotateLabel = seriesModel.get('layout') === 'circular' && seriesModel.get('circular.rotateLabel');
+    var cx = data.getLayout('cx');
+    var cy = data.getLayout('cy');
+    data.eachItemGraphicEl(function (el, idx) {
+      var symbolPath = el.getSymbolPath();
+
+      if (circularRotateLabel) {
+        var pos = data.getItemLayout(idx);
+        var rad = Math.atan2(pos[1] - cy, pos[0] - cx);
+
+        if (rad < 0) {
+          rad = Math.PI * 2 + rad;
+        }
+
+        var isLeft = pos[0] < cx;
+
+        if (isLeft) {
+          rad = rad - Math.PI;
+        }
+
+        var textPosition = isLeft ? 'left' : 'right';
+        symbolPath.setStyle({
+          textRotation: -rad,
+          textPosition: textPosition,
+          textOrigin: 'center'
+        });
+        symbolPath.hoverStyle && (symbolPath.hoverStyle.textPosition = textPosition);
+      } else {
+        symbolPath.setStyle({
+          textRotation: 0
+        });
+      }
+    });
+    this._firstRender = false;
+  },
+  dispose: function () {
+    this._controller && this._controller.dispose();
+    this._controllerHost = {};
+  },
+  focusNodeAdjacency: function (seriesModel, ecModel, api, payload) {
+    var data = this._model.getData();
+
+    var graph = data.graph;
+    var dataIndex = payload.dataIndex;
+    var edgeDataIndex = payload.edgeDataIndex;
+    var node = graph.getNodeByIndex(dataIndex);
+    var edge = graph.getEdgeByIndex(edgeDataIndex);
+
+    if (!node && !edge) {
+      return;
+    }
+
+    graph.eachNode(function (node) {
+      fadeOutItem(node, nodeOpacityPath, 0.1);
+    });
+    graph.eachEdge(function (edge) {
+      fadeOutItem(edge, lineOpacityPath, 0.1);
+    });
+
+    if (node) {
+      fadeInItem(node, nodeOpacityPath);
+      each$1(node.edges, function (adjacentEdge) {
+        if (adjacentEdge.dataIndex < 0) {
+          return;
+        }
+
+        fadeInItem(adjacentEdge, lineOpacityPath);
+        fadeInItem(adjacentEdge.node1, nodeOpacityPath);
+        fadeInItem(adjacentEdge.node2, nodeOpacityPath);
+      });
+    }
+
+    if (edge) {
+      fadeInItem(edge, lineOpacityPath);
+      fadeInItem(edge.node1, nodeOpacityPath);
+      fadeInItem(edge.node2, nodeOpacityPath);
+    }
+  },
+  unfocusNodeAdjacency: function (seriesModel, ecModel, api, payload) {
+    var graph = this._model.getData().graph;
+
+    graph.eachNode(function (node) {
+      fadeOutItem(node, nodeOpacityPath);
+    });
+    graph.eachEdge(function (edge) {
+      fadeOutItem(edge, lineOpacityPath);
+    });
+  },
+  _startForceLayoutIteration: function (forceLayout, layoutAnimation) {
+    var self = this;
+
+    (function step() {
+      forceLayout.step(function (stopped) {
+        self.updateLayout(self._model);
+        (self._layouting = !stopped) && (layoutAnimation ? self._layoutTimeout = setTimeout(step, 16) : step());
+      });
+    })();
+  },
+  _updateController: function (seriesModel, ecModel, api) {
+    var controller = this._controller;
+    var controllerHost = this._controllerHost;
+    var group = this.group;
+    controller.setPointerChecker(function (e, x, y) {
+      var rect = group.getBoundingRect();
+      rect.applyTransform(group.transform);
+      return rect.contain(x, y) && !onIrrelevantElement(e, api, seriesModel);
+    });
+
+    if (seriesModel.coordinateSystem.type !== 'view') {
+      controller.disable();
+      return;
+    }
+
+    controller.enable(seriesModel.get('roam'));
+    controllerHost.zoomLimit = seriesModel.get('scaleLimit');
+    controllerHost.zoom = seriesModel.coordinateSystem.getZoom();
+    controller.off('pan').off('zoom').on('pan', function (e) {
+      updateViewOnPan(controllerHost, e.dx, e.dy);
+      api.dispatchAction({
+        seriesId: seriesModel.id,
+        type: 'graphRoam',
+        dx: e.dx,
+        dy: e.dy
+      });
+    }).on('zoom', function (e) {
+      updateViewOnZoom(controllerHost, e.scale, e.originX, e.originY);
+      api.dispatchAction({
+        seriesId: seriesModel.id,
+        type: 'graphRoam',
+        zoom: e.scale,
+        originX: e.originX,
+        originY: e.originY
+      });
+
+      this._updateNodeAndLinkScale();
+
+      adjustEdge(seriesModel.getGraph(), this._getNodeGlobalScale(seriesModel));
+
+      this._lineDraw.updateLayout();
+    }, this);
+  },
+  _updateNodeAndLinkScale: function () {
+    var seriesModel = this._model;
+    var data = seriesModel.getData();
+
+    var nodeScale = this._getNodeGlobalScale(seriesModel);
+
+    var invScale = [nodeScale, nodeScale];
+    data.eachItemGraphicEl(function (el, idx) {
+      el.attr('scale', invScale);
+    });
+  },
+  _getNodeGlobalScale: function (seriesModel) {
+    var coordSys = seriesModel.coordinateSystem;
+
+    if (coordSys.type !== 'view') {
+      return 1;
+    }
+
+    var nodeScaleRatio = this._nodeScaleRatio;
+    var groupScale = coordSys.scale;
+    var groupZoom = groupScale && groupScale[0] || 1; // Scale node when zoom changes
+
+    var roamZoom = coordSys.getZoom();
+    var nodeScale = (roamZoom - 1) * nodeScaleRatio + 1;
+    return nodeScale / groupZoom;
+  },
+  updateLayout: function (seriesModel) {
+    adjustEdge(seriesModel.getGraph(), this._getNodeGlobalScale(seriesModel));
+
+    this._symbolDraw.updateLayout();
+
+    this._lineDraw.updateLayout();
+  },
+  remove: function (ecModel, api) {
+    this._symbolDraw && this._symbolDraw.remove();
+    this._lineDraw && this._lineDraw.remove();
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+/**
+ * @payload
+ * @property {number} [seriesIndex]
+ * @property {string} [seriesId]
+ * @property {string} [seriesName]
+ * @property {number} [dataIndex]
+ */
+
+registerAction({
+  type: 'focusNodeAdjacency',
+  event: 'focusNodeAdjacency',
+  update: 'series:focusNodeAdjacency'
+}, function () {});
+/**
+ * @payload
+ * @property {number} [seriesIndex]
+ * @property {string} [seriesId]
+ * @property {string} [seriesName]
+ */
+
+registerAction({
+  type: 'unfocusNodeAdjacency',
+  event: 'unfocusNodeAdjacency',
+  update: 'series:unfocusNodeAdjacency'
+}, function () {});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var actionInfo = {
+  type: 'graphRoam',
+  event: 'graphRoam',
+  update: 'none'
+};
+/**
+ * @payload
+ * @property {string} name Series name
+ * @property {number} [dx]
+ * @property {number} [dy]
+ * @property {number} [zoom]
+ * @property {number} [originX]
+ * @property {number} [originY]
+ */
+
+registerAction(actionInfo, function (payload, ecModel) {
+  ecModel.eachComponent({
+    mainType: 'series',
+    query: payload
+  }, function (seriesModel) {
+    var coordSys = seriesModel.coordinateSystem;
+    var res = updateCenterAndZoom(coordSys, payload);
+    seriesModel.setCenter && seriesModel.setCenter(res.center);
+    seriesModel.setZoom && seriesModel.setZoom(res.zoom);
+  });
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var categoryFilter = function (ecModel) {
+  var legendModels = ecModel.findComponents({
+    mainType: 'legend'
+  });
+
+  if (!legendModels || !legendModels.length) {
+    return;
+  }
+
+  ecModel.eachSeriesByType('graph', function (graphSeries) {
+    var categoriesData = graphSeries.getCategoriesData();
+    var graph = graphSeries.getGraph();
+    var data = graph.data;
+    var categoryNames = categoriesData.mapArray(categoriesData.getName);
+    data.filterSelf(function (idx) {
+      var model = data.getItemModel(idx);
+      var category = model.getShallow('category');
+
+      if (category != null) {
+        if (typeof category === 'number') {
+          category = categoryNames[category];
+        } // If in any legend component the status is not selected.
+
+
+        for (var i = 0; i < legendModels.length; i++) {
+          if (!legendModels[i].isSelected(category)) {
+            return false;
+          }
+        }
+      }
+
+      return true;
+    });
+  }, this);
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var categoryVisual = function (ecModel) {
+  var paletteScope = {};
+  ecModel.eachSeriesByType('graph', function (seriesModel) {
+    var categoriesData = seriesModel.getCategoriesData();
+    var data = seriesModel.getData();
+    var categoryNameIdxMap = {};
+    categoriesData.each(function (idx) {
+      var name = categoriesData.getName(idx); // Add prefix to avoid conflict with Object.prototype.
+
+      categoryNameIdxMap['ec-' + name] = idx;
+      var itemModel = categoriesData.getItemModel(idx);
+      var color = itemModel.get('itemStyle.color') || seriesModel.getColorFromPalette(name, paletteScope);
+      categoriesData.setItemVisual(idx, 'color', color);
+    }); // Assign category color to visual
+
+    if (categoriesData.count()) {
+      data.each(function (idx) {
+        var model = data.getItemModel(idx);
+        var category = model.getShallow('category');
+
+        if (category != null) {
+          if (typeof category === 'string') {
+            category = categoryNameIdxMap['ec-' + category];
+          }
+
+          if (!data.getItemVisual(idx, 'color', true)) {
+            data.setItemVisual(idx, 'color', categoriesData.getItemVisual(category, 'color'));
+          }
+        }
+      });
+    }
+  });
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+function normalize$2(a) {
+  if (!(a instanceof Array)) {
+    a = [a, a];
+  }
+
+  return a;
+}
+
+var edgeVisual = function (ecModel) {
+  ecModel.eachSeriesByType('graph', function (seriesModel) {
+    var graph = seriesModel.getGraph();
+    var edgeData = seriesModel.getEdgeData();
+    var symbolType = normalize$2(seriesModel.get('edgeSymbol'));
+    var symbolSize = normalize$2(seriesModel.get('edgeSymbolSize'));
+    var colorQuery = 'lineStyle.color'.split('.');
+    var opacityQuery = 'lineStyle.opacity'.split('.');
+    edgeData.setVisual('fromSymbol', symbolType && symbolType[0]);
+    edgeData.setVisual('toSymbol', symbolType && symbolType[1]);
+    edgeData.setVisual('fromSymbolSize', symbolSize && symbolSize[0]);
+    edgeData.setVisual('toSymbolSize', symbolSize && symbolSize[1]);
+    edgeData.setVisual('color', seriesModel.get(colorQuery));
+    edgeData.setVisual('opacity', seriesModel.get(opacityQuery));
+    edgeData.each(function (idx) {
+      var itemModel = edgeData.getItemModel(idx);
+      var edge = graph.getEdgeByIndex(idx);
+      var symbolType = normalize$2(itemModel.getShallow('symbol', true));
+      var symbolSize = normalize$2(itemModel.getShallow('symbolSize', true)); // Edge visual must after node visual
+
+      var color = itemModel.get(colorQuery);
+      var opacity = itemModel.get(opacityQuery);
+
+      switch (color) {
+        case 'source':
+          color = edge.node1.getVisual('color');
+          break;
+
+        case 'target':
+          color = edge.node2.getVisual('color');
+          break;
+      }
+
+      symbolType[0] && edge.setVisual('fromSymbol', symbolType[0]);
+      symbolType[1] && edge.setVisual('toSymbol', symbolType[1]);
+      symbolSize[0] && edge.setVisual('fromSymbolSize', symbolSize[0]);
+      symbolSize[1] && edge.setVisual('toSymbolSize', symbolSize[1]);
+      edge.setVisual('color', color);
+      edge.setVisual('opacity', opacity);
+    });
+  });
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+function simpleLayout$1(seriesModel) {
+  var coordSys = seriesModel.coordinateSystem;
+
+  if (coordSys && coordSys.type !== 'view') {
+    return;
+  }
+
+  var graph = seriesModel.getGraph();
+  graph.eachNode(function (node) {
+    var model = node.getModel();
+    node.setLayout([+model.get('x'), +model.get('y')]);
+  });
+  simpleLayoutEdge(graph);
+}
+function simpleLayoutEdge(graph) {
+  graph.eachEdge(function (edge) {
+    var curveness = edge.getModel().get('lineStyle.curveness') || 0;
+    var p1 = clone$1(edge.node1.getLayout());
+    var p2 = clone$1(edge.node2.getLayout());
+    var points = [p1, p2];
+
+    if (+curveness) {
+      points.push([(p1[0] + p2[0]) / 2 - (p1[1] - p2[1]) * curveness, (p1[1] + p2[1]) / 2 - (p2[0] - p1[0]) * curveness]);
+    }
+
+    edge.setLayout(points);
+  });
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var simpleLayout = function (ecModel, api) {
+  ecModel.eachSeriesByType('graph', function (seriesModel) {
+    var layout = seriesModel.get('layout');
+    var coordSys = seriesModel.coordinateSystem;
+
+    if (coordSys && coordSys.type !== 'view') {
+      var data = seriesModel.getData();
+      var dimensions = [];
+      each$1(coordSys.dimensions, function (coordDim) {
+        dimensions = dimensions.concat(data.mapDimension(coordDim, true));
+      });
+
+      for (var dataIndex = 0; dataIndex < data.count(); dataIndex++) {
+        var value = [];
+        var hasValue = false;
+
+        for (var i = 0; i < dimensions.length; i++) {
+          var val = data.get(dimensions[i], dataIndex);
+
+          if (!isNaN(val)) {
+            hasValue = true;
+          }
+
+          value.push(val);
+        }
+
+        if (hasValue) {
+          data.setItemLayout(dataIndex, coordSys.dataToPoint(value));
+        } else {
+          // Also {Array.<number>}, not undefined to avoid if...else... statement
+          data.setItemLayout(dataIndex, [NaN, NaN]);
+        }
+      }
+
+      simpleLayoutEdge(data.graph);
+    } else if (!layout || layout === 'none') {
+      simpleLayout$1(seriesModel);
+    }
+  });
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+function circularLayout$1(seriesModel) {
+  var coordSys = seriesModel.coordinateSystem;
+
+  if (coordSys && coordSys.type !== 'view') {
+    return;
+  }
+
+  var rect = coordSys.getBoundingRect();
+  var nodeData = seriesModel.getData();
+  var graph = nodeData.graph;
+  var angle = 0;
+  var sum = nodeData.getSum('value');
+  var unitAngle = Math.PI * 2 / (sum || nodeData.count());
+  var cx = rect.width / 2 + rect.x;
+  var cy = rect.height / 2 + rect.y;
+  var r = Math.min(rect.width, rect.height) / 2;
+  graph.eachNode(function (node) {
+    var value = node.getValue('value');
+    angle += unitAngle * (sum ? value : 1) / 2;
+    node.setLayout([r * Math.cos(angle) + cx, r * Math.sin(angle) + cy]);
+    angle += unitAngle * (sum ? value : 1) / 2;
+  });
+  nodeData.setLayout({
+    cx: cx,
+    cy: cy
+  });
+  graph.eachEdge(function (edge) {
+    var curveness = edge.getModel().get('lineStyle.curveness') || 0;
+    var p1 = clone$1(edge.node1.getLayout());
+    var p2 = clone$1(edge.node2.getLayout());
+    var cp1;
+    var x12 = (p1[0] + p2[0]) / 2;
+    var y12 = (p1[1] + p2[1]) / 2;
+
+    if (+curveness) {
+      curveness *= 3;
+      cp1 = [cx * curveness + x12 * (1 - curveness), cy * curveness + y12 * (1 - curveness)];
+    }
+
+    edge.setLayout([p1, p2, cp1]);
+  });
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var circularLayout = function (ecModel) {
+  ecModel.eachSeriesByType('graph', function (seriesModel) {
+    if (seriesModel.get('layout') === 'circular') {
+      circularLayout$1(seriesModel);
+    }
+  });
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/*
+* The layout implementation references to d3.js. The use of
+* the source code of this file is also subject to the terms
+* and consitions of its license (BSD-3Clause, see
+* <echarts/src/licenses/LICENSE-d3>).
+*/
+var scaleAndAdd$2 = scaleAndAdd; // function adjacentNode(n, e) {
+//     return e.n1 === n ? e.n2 : e.n1;
+// }
+
+function forceLayout$1(nodes, edges, opts) {
+  var rect = opts.rect;
+  var width = rect.width;
+  var height = rect.height;
+  var center = [rect.x + width / 2, rect.y + height / 2]; // var scale = opts.scale || 1;
+
+  var gravity = opts.gravity == null ? 0.1 : opts.gravity; // for (var i = 0; i < edges.length; i++) {
+  //     var e = edges[i];
+  //     var n1 = e.n1;
+  //     var n2 = e.n2;
+  //     n1.edges = n1.edges || [];
+  //     n2.edges = n2.edges || [];
+  //     n1.edges.push(e);
+  //     n2.edges.push(e);
+  // }
+  // Init position
+
+  for (var i = 0; i < nodes.length; i++) {
+    var n = nodes[i];
+
+    if (!n.p) {
+      // Use the position from first adjecent node with defined position
+      // Or use a random position
+      // From d3
+      // if (n.edges) {
+      //     var j = -1;
+      //     while (++j < n.edges.length) {
+      //         var e = n.edges[j];
+      //         var other = adjacentNode(n, e);
+      //         if (other.p) {
+      //             n.p = vec2.clone(other.p);
+      //             break;
+      //         }
+      //     }
+      // }
+      // if (!n.p) {
+      n.p = create(width * (Math.random() - 0.5) + center[0], height * (Math.random() - 0.5) + center[1]); // }
+    }
+
+    n.pp = clone$1(n.p);
+    n.edges = null;
+  } // Formula in 'Graph Drawing by Force-directed Placement'
+  // var k = scale * Math.sqrt(width * height / nodes.length);
+  // var k2 = k * k;
+
+
+  var friction = 0.6;
+  return {
+    warmUp: function () {
+      friction = 0.5;
+    },
+    setFixed: function (idx) {
+      nodes[idx].fixed = true;
+    },
+    setUnfixed: function (idx) {
+      nodes[idx].fixed = false;
+    },
+    step: function (cb) {
+      var v12 = [];
+      var nLen = nodes.length;
+
+      for (var i = 0; i < edges.length; i++) {
+        var e = edges[i];
+        var n1 = e.n1;
+        var n2 = e.n2;
+        sub(v12, n2.p, n1.p);
+        var d = len(v12) - e.d;
+        var w = n2.w / (n1.w + n2.w);
+
+        if (isNaN(w)) {
+          w = 0;
+        }
+
+        normalize(v12, v12);
+        !n1.fixed && scaleAndAdd$2(n1.p, n1.p, v12, w * d * friction);
+        !n2.fixed && scaleAndAdd$2(n2.p, n2.p, v12, -(1 - w) * d * friction);
+      } // Gravity
+
+
+      for (var i = 0; i < nLen; i++) {
+        var n = nodes[i];
+
+        if (!n.fixed) {
+          sub(v12, center, n.p); // var d = vec2.len(v12);
+          // vec2.scale(v12, v12, 1 / d);
+          // var gravityFactor = gravity;
+
+          scaleAndAdd$2(n.p, n.p, v12, gravity * friction);
+        }
+      } // Repulsive
+      // PENDING
+
+
+      for (var i = 0; i < nLen; i++) {
+        var n1 = nodes[i];
+
+        for (var j = i + 1; j < nLen; j++) {
+          var n2 = nodes[j];
+          sub(v12, n2.p, n1.p);
+          var d = len(v12);
+
+          if (d === 0) {
+            // Random repulse
+            set(v12, Math.random() - 0.5, Math.random() - 0.5);
+            d = 1;
+          }
+
+          var repFact = (n1.rep + n2.rep) / d / d;
+          !n1.fixed && scaleAndAdd$2(n1.pp, n1.pp, v12, repFact);
+          !n2.fixed && scaleAndAdd$2(n2.pp, n2.pp, v12, -repFact);
+        }
+      }
+
+      var v = [];
+
+      for (var i = 0; i < nLen; i++) {
+        var n = nodes[i];
+
+        if (!n.fixed) {
+          sub(v, n.p, n.pp);
+          scaleAndAdd$2(n.p, n.p, v, friction);
+          copy(n.pp, n.p);
+        }
+      }
+
+      friction = friction * 0.992;
+      cb && cb(nodes, edges, friction < 0.01);
+    }
+  };
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var forceLayout = function (ecModel) {
+  ecModel.eachSeriesByType('graph', function (graphSeries) {
+    var coordSys = graphSeries.coordinateSystem;
+
+    if (coordSys && coordSys.type !== 'view') {
+      return;
+    }
+
+    if (graphSeries.get('layout') === 'force') {
+      var preservedPoints = graphSeries.preservedPoints || {};
+      var graph = graphSeries.getGraph();
+      var nodeData = graph.data;
+      var edgeData = graph.edgeData;
+      var forceModel = graphSeries.getModel('force');
+      var initLayout = forceModel.get('initLayout');
+
+      if (graphSeries.preservedPoints) {
+        nodeData.each(function (idx) {
+          var id = nodeData.getId(idx);
+          nodeData.setItemLayout(idx, preservedPoints[id] || [NaN, NaN]);
+        });
+      } else if (!initLayout || initLayout === 'none') {
+        simpleLayout$1(graphSeries);
+      } else if (initLayout === 'circular') {
+        circularLayout$1(graphSeries);
+      }
+
+      var nodeDataExtent = nodeData.getDataExtent('value');
+      var edgeDataExtent = edgeData.getDataExtent('value'); // var edgeDataExtent = edgeData.getDataExtent('value');
+
+      var repulsion = forceModel.get('repulsion');
+      var edgeLength = forceModel.get('edgeLength');
+
+      if (!isArray(repulsion)) {
+        repulsion = [repulsion, repulsion];
+      }
+
+      if (!isArray(edgeLength)) {
+        edgeLength = [edgeLength, edgeLength];
+      } // Larger value has smaller length
+
+
+      edgeLength = [edgeLength[1], edgeLength[0]];
+      var nodes = nodeData.mapArray('value', function (value, idx) {
+        var point = nodeData.getItemLayout(idx);
+        var rep = linearMap(value, nodeDataExtent, repulsion);
+
+        if (isNaN(rep)) {
+          rep = (repulsion[0] + repulsion[1]) / 2;
+        }
+
+        return {
+          w: rep,
+          rep: rep,
+          fixed: nodeData.getItemModel(idx).get('fixed'),
+          p: !point || isNaN(point[0]) || isNaN(point[1]) ? null : point
+        };
+      });
+      var edges = edgeData.mapArray('value', function (value, idx) {
+        var edge = graph.getEdgeByIndex(idx);
+        var d = linearMap(value, edgeDataExtent, edgeLength);
+
+        if (isNaN(d)) {
+          d = (edgeLength[0] + edgeLength[1]) / 2;
+        }
+
+        return {
+          n1: nodes[edge.node1.dataIndex],
+          n2: nodes[edge.node2.dataIndex],
+          d: d,
+          curveness: edge.getModel().get('lineStyle.curveness') || 0
+        };
+      });
+      var coordSys = graphSeries.coordinateSystem;
+      var rect = coordSys.getBoundingRect();
+      var forceInstance = forceLayout$1(nodes, edges, {
+        rect: rect,
+        gravity: forceModel.get('gravity')
+      });
+      var oldStep = forceInstance.step;
+
+      forceInstance.step = function (cb) {
+        for (var i = 0, l = nodes.length; i < l; i++) {
+          if (nodes[i].fixed) {
+            // Write back to layout instance
+            copy(nodes[i].p, graph.getNodeByIndex(i).getLayout());
+          }
+        }
+
+        oldStep(function (nodes, edges, stopped) {
+          for (var i = 0, l = nodes.length; i < l; i++) {
+            if (!nodes[i].fixed) {
+              graph.getNodeByIndex(i).setLayout(nodes[i].p);
+            }
+
+            preservedPoints[nodeData.getId(i)] = nodes[i].p;
+          }
+
+          for (var i = 0, l = edges.length; i < l; i++) {
+            var e = edges[i];
+            var edge = graph.getEdgeByIndex(i);
+            var p1 = e.n1.p;
+            var p2 = e.n2.p;
+            var points = edge.getLayout();
+            points = points ? points.slice() : [];
+            points[0] = points[0] || [];
+            points[1] = points[1] || [];
+            copy(points[0], p1);
+            copy(points[1], p2);
+
+            if (+e.curveness) {
+              points[2] = [(p1[0] + p2[0]) / 2 - (p1[1] - p2[1]) * e.curveness, (p1[1] + p2[1]) / 2 - (p2[0] - p1[0]) * e.curveness];
+            }
+
+            edge.setLayout(points);
+          } // Update layout
+
+
+          cb && cb(stopped);
+        });
+      };
+
+      graphSeries.forceLayout = forceInstance;
+      graphSeries.preservedPoints = preservedPoints; // Step to get the layout
+
+      forceInstance.step();
+    } else {
+      // Remove prev injected forceLayout instance
+      graphSeries.forceLayout = null;
+    }
+  });
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+// FIXME Where to create the simple view coordinate system
+function getViewRect$1(seriesModel, api, aspect) {
+  var option = seriesModel.getBoxLayoutParams();
+  option.aspect = aspect;
+  return getLayoutRect(option, {
+    width: api.getWidth(),
+    height: api.getHeight()
+  });
+}
+
+var createView = function (ecModel, api) {
+  var viewList = [];
+  ecModel.eachSeriesByType('graph', function (seriesModel) {
+    var coordSysType = seriesModel.get('coordinateSystem');
+
+    if (!coordSysType || coordSysType === 'view') {
+      var data = seriesModel.getData();
+      var positions = data.mapArray(function (idx) {
+        var itemModel = data.getItemModel(idx);
+        return [+itemModel.get('x'), +itemModel.get('y')];
+      });
+      var min = [];
+      var max = [];
+      fromPoints(positions, min, max); // If width or height is 0
+
+      if (max[0] - min[0] === 0) {
+        max[0] += 1;
+        min[0] -= 1;
+      }
+
+      if (max[1] - min[1] === 0) {
+        max[1] += 1;
+        min[1] -= 1;
+      }
+
+      var aspect = (max[0] - min[0]) / (max[1] - min[1]); // FIXME If get view rect after data processed?
+
+      var viewRect = getViewRect$1(seriesModel, api, aspect); // Position may be NaN, use view rect instead
+
+      if (isNaN(aspect)) {
+        min = [viewRect.x, viewRect.y];
+        max = [viewRect.x + viewRect.width, viewRect.y + viewRect.height];
+      }
+
+      var bbWidth = max[0] - min[0];
+      var bbHeight = max[1] - min[1];
+      var viewWidth = viewRect.width;
+      var viewHeight = viewRect.height;
+      var viewCoordSys = seriesModel.coordinateSystem = new View();
+      viewCoordSys.zoomLimit = seriesModel.get('scaleLimit');
+      viewCoordSys.setBoundingRect(min[0], min[1], bbWidth, bbHeight);
+      viewCoordSys.setViewRect(viewRect.x, viewRect.y, viewWidth, viewHeight); // Update roam info
+
+      viewCoordSys.setCenter(seriesModel.get('center'));
+      viewCoordSys.setZoom(seriesModel.get('zoom'));
+      viewList.push(viewCoordSys);
+    }
+  });
+  return viewList;
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+registerProcessor(categoryFilter);
+registerVisual(visualSymbol('graph', 'circle', null));
+registerVisual(categoryVisual);
+registerVisual(edgeVisual);
+registerLayout(simpleLayout);
+registerLayout(circularLayout);
+registerLayout(forceLayout); // Graph view coordinate system
+
+registerCoordinateSystem('graphView', {
+  create: createView
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var BoxplotSeries = SeriesModel.extend({
+  type: 'series.boxplot',
+  dependencies: ['xAxis', 'yAxis', 'grid'],
+  // TODO
+  // box width represents group size, so dimension should have 'size'.
+
+  /**
+   * @see <https://en.wikipedia.org/wiki/Box_plot>
+   * The meanings of 'min' and 'max' depend on user,
+   * and echarts do not need to know it.
+   * @readOnly
+   */
+  defaultValueDimensions: [{
+    name: 'min',
+    defaultTooltip: true
+  }, {
+    name: 'Q1',
+    defaultTooltip: true
+  }, {
+    name: 'median',
+    defaultTooltip: true
+  }, {
+    name: 'Q3',
+    defaultTooltip: true
+  }, {
+    name: 'max',
+    defaultTooltip: true
+  }],
+
+  /**
+   * @type {Array.<string>}
+   * @readOnly
+   */
+  dimensions: null,
+
+  /**
+   * @override
+   */
+  defaultOption: {
+    zlevel: 0,
+    // 涓�绾у眰鍙�
+    z: 2,
+    // 浜岀骇灞傚彔
+    coordinateSystem: 'cartesian2d',
+    legendHoverLink: true,
+    hoverAnimation: true,
+    // xAxisIndex: 0,
+    // yAxisIndex: 0,
+    layout: null,
+    // 'horizontal' or 'vertical'
+    boxWidth: [7, 50],
+    // [min, max] can be percent of band width.
+    itemStyle: {
+      color: '#fff',
+      borderWidth: 1
+    },
+    emphasis: {
+      itemStyle: {
+        borderWidth: 2,
+        shadowBlur: 5,
+        shadowOffsetX: 2,
+        shadowOffsetY: 2,
+        shadowColor: 'rgba(0,0,0,0.4)'
+      }
+    },
+    animationEasing: 'elasticOut',
+    animationDuration: 800
+  }
+});
+mixin(BoxplotSeries, seriesModelMixin, true);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var NORMAL_ITEM_STYLE_PATH$1 = ['itemStyle'];
+var EMPHASIS_ITEM_STYLE_PATH$1 = ['emphasis', 'itemStyle'];
+var BoxplotView = Chart.extend({
+  type: 'boxplot',
+  render: function (seriesModel, ecModel, api) {
+    var data = seriesModel.getData();
+    var group = this.group;
+    var oldData = this._data; // There is no old data only when first rendering or switching from
+    // stream mode to normal mode, where previous elements should be removed.
+
+    if (!this._data) {
+      group.removeAll();
+    }
+
+    var constDim = seriesModel.get('layout') === 'horizontal' ? 1 : 0;
+    data.diff(oldData).add(function (newIdx) {
+      if (data.hasValue(newIdx)) {
+        var itemLayout = data.getItemLayout(newIdx);
+        var symbolEl = createNormalBox$1(itemLayout, data, newIdx, constDim, true);
+        data.setItemGraphicEl(newIdx, symbolEl);
+        group.add(symbolEl);
+      }
+    }).update(function (newIdx, oldIdx) {
+      var symbolEl = oldData.getItemGraphicEl(oldIdx); // Empty data
+
+      if (!data.hasValue(newIdx)) {
+        group.remove(symbolEl);
+        return;
+      }
+
+      var itemLayout = data.getItemLayout(newIdx);
+
+      if (!symbolEl) {
+        symbolEl = createNormalBox$1(itemLayout, data, newIdx, constDim);
+      } else {
+        updateNormalBoxData(itemLayout, symbolEl, data, newIdx);
+      }
+
+      group.add(symbolEl);
+      data.setItemGraphicEl(newIdx, symbolEl);
+    }).remove(function (oldIdx) {
+      var el = oldData.getItemGraphicEl(oldIdx);
+      el && group.remove(el);
+    }).execute();
+    this._data = data;
+  },
+  remove: function (ecModel) {
+    var group = this.group;
+    var data = this._data;
+    this._data = null;
+    data && data.eachItemGraphicEl(function (el) {
+      el && group.remove(el);
+    });
+  },
+  dispose: noop
+});
+var BoxPath = Path.extend({
+  type: 'boxplotBoxPath',
+  shape: {},
+  buildPath: function (ctx, shape) {
+    var ends = shape.points;
+    var i = 0;
+    ctx.moveTo(ends[i][0], ends[i][1]);
+    i++;
+
+    for (; i < 4; i++) {
+      ctx.lineTo(ends[i][0], ends[i][1]);
+    }
+
+    ctx.closePath();
+
+    for (; i < ends.length; i++) {
+      ctx.moveTo(ends[i][0], ends[i][1]);
+      i++;
+      ctx.lineTo(ends[i][0], ends[i][1]);
+    }
+  }
+});
+
+function createNormalBox$1(itemLayout, data, dataIndex, constDim, isInit) {
+  var ends = itemLayout.ends;
+  var el = new BoxPath({
+    shape: {
+      points: isInit ? transInit$1(ends, constDim, itemLayout) : ends
+    }
+  });
+  updateNormalBoxData(itemLayout, el, data, dataIndex, isInit);
+  return el;
+}
+
+function updateNormalBoxData(itemLayout, el, data, dataIndex, isInit) {
+  var seriesModel = data.hostModel;
+  var updateMethod = graphicUtil[isInit ? 'initProps' : 'updateProps'];
+  updateMethod(el, {
+    shape: {
+      points: itemLayout.ends
+    }
+  }, seriesModel, dataIndex);
+  var itemModel = data.getItemModel(dataIndex);
+  var normalItemStyleModel = itemModel.getModel(NORMAL_ITEM_STYLE_PATH$1);
+  var borderColor = data.getItemVisual(dataIndex, 'color'); // Exclude borderColor.
+
+  var itemStyle = normalItemStyleModel.getItemStyle(['borderColor']);
+  itemStyle.stroke = borderColor;
+  itemStyle.strokeNoScale = true;
+  el.useStyle(itemStyle);
+  el.z2 = 100;
+  var hoverStyle = itemModel.getModel(EMPHASIS_ITEM_STYLE_PATH$1).getItemStyle();
+  setHoverStyle(el, hoverStyle);
+}
+
+function transInit$1(points, dim, itemLayout) {
+  return map(points, function (point) {
+    point = point.slice();
+    point[dim] = itemLayout.initBaseline;
+    return point;
+  });
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var borderColorQuery = ['itemStyle', 'borderColor'];
+var boxplotVisual = function (ecModel, api) {
+  var globalColors = ecModel.get('color');
+  ecModel.eachRawSeriesByType('boxplot', function (seriesModel) {
+    var defaulColor = globalColors[seriesModel.seriesIndex % globalColors.length];
+    var data = seriesModel.getData();
+    data.setVisual({
+      legendSymbol: 'roundRect',
+      // Use name 'color' but not 'borderColor' for legend usage and
+      // visual coding from other component like dataRange.
+      color: seriesModel.get(borderColorQuery) || defaulColor
+    }); // Only visible series has each data be visual encoded
+
+    if (!ecModel.isSeriesFiltered(seriesModel)) {
+      data.each(function (idx) {
+        var itemModel = data.getItemModel(idx);
+        data.setItemVisual(idx, {
+          color: itemModel.get(borderColorQuery, true)
+        });
+      });
+    }
+  });
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var each$11 = each$1;
+var boxplotLayout = function (ecModel) {
+  var groupResult = groupSeriesByAxis(ecModel);
+  each$11(groupResult, function (groupItem) {
+    var seriesModels = groupItem.seriesModels;
+
+    if (!seriesModels.length) {
+      return;
+    }
+
+    calculateBase(groupItem);
+    each$11(seriesModels, function (seriesModel, idx) {
+      layoutSingleSeries(seriesModel, groupItem.boxOffsetList[idx], groupItem.boxWidthList[idx]);
+    });
+  });
+};
+/**
+ * Group series by axis.
+ */
+
+function groupSeriesByAxis(ecModel) {
+  var result = [];
+  var axisList = [];
+  ecModel.eachSeriesByType('boxplot', function (seriesModel) {
+    var baseAxis = seriesModel.getBaseAxis();
+    var idx = indexOf(axisList, baseAxis);
+
+    if (idx < 0) {
+      idx = axisList.length;
+      axisList[idx] = baseAxis;
+      result[idx] = {
+        axis: baseAxis,
+        seriesModels: []
+      };
+    }
+
+    result[idx].seriesModels.push(seriesModel);
+  });
+  return result;
+}
+/**
+ * Calculate offset and box width for each series.
+ */
+
+
+function calculateBase(groupItem) {
+  var extent;
+  var baseAxis = groupItem.axis;
+  var seriesModels = groupItem.seriesModels;
+  var seriesCount = seriesModels.length;
+  var boxWidthList = groupItem.boxWidthList = [];
+  var boxOffsetList = groupItem.boxOffsetList = [];
+  var boundList = [];
+  var bandWidth;
+
+  if (baseAxis.type === 'category') {
+    bandWidth = baseAxis.getBandWidth();
+  } else {
+    var maxDataCount = 0;
+    each$11(seriesModels, function (seriesModel) {
+      maxDataCount = Math.max(maxDataCount, seriesModel.getData().count());
+    });
+    extent = baseAxis.getExtent(), Math.abs(extent[1] - extent[0]) / maxDataCount;
+  }
+
+  each$11(seriesModels, function (seriesModel) {
+    var boxWidthBound = seriesModel.get('boxWidth');
+
+    if (!isArray(boxWidthBound)) {
+      boxWidthBound = [boxWidthBound, boxWidthBound];
+    }
+
+    boundList.push([parsePercent$1(boxWidthBound[0], bandWidth) || 0, parsePercent$1(boxWidthBound[1], bandWidth) || 0]);
+  });
+  var availableWidth = bandWidth * 0.8 - 2;
+  var boxGap = availableWidth / seriesCount * 0.3;
+  var boxWidth = (availableWidth - boxGap * (seriesCount - 1)) / seriesCount;
+  var base = boxWidth / 2 - availableWidth / 2;
+  each$11(seriesModels, function (seriesModel, idx) {
+    boxOffsetList.push(base);
+    base += boxGap + boxWidth;
+    boxWidthList.push(Math.min(Math.max(boxWidth, boundList[idx][0]), boundList[idx][1]));
+  });
+}
+/**
+ * Calculate points location for each series.
+ */
+
+
+function layoutSingleSeries(seriesModel, offset, boxWidth) {
+  var coordSys = seriesModel.coordinateSystem;
+  var data = seriesModel.getData();
+  var halfWidth = boxWidth / 2;
+  var cDimIdx = seriesModel.get('layout') === 'horizontal' ? 0 : 1;
+  var vDimIdx = 1 - cDimIdx;
+  var coordDims = ['x', 'y'];
+  var cDim = data.mapDimension(coordDims[cDimIdx]);
+  var vDims = data.mapDimension(coordDims[vDimIdx], true);
+
+  if (cDim == null || vDims.length < 5) {
+    return;
+  }
+
+  for (var dataIndex = 0; dataIndex < data.count(); dataIndex++) {
+    var axisDimVal = data.get(cDim, dataIndex);
+    var median = getPoint(axisDimVal, vDims[2], dataIndex);
+    var end1 = getPoint(axisDimVal, vDims[0], dataIndex);
+    var end2 = getPoint(axisDimVal, vDims[1], dataIndex);
+    var end4 = getPoint(axisDimVal, vDims[3], dataIndex);
+    var end5 = getPoint(axisDimVal, vDims[4], dataIndex);
+    var ends = [];
+    addBodyEnd(ends, end2, 0);
+    addBodyEnd(ends, end4, 1);
+    ends.push(end1, end2, end5, end4);
+    layEndLine(ends, end1);
+    layEndLine(ends, end5);
+    layEndLine(ends, median);
+    data.setItemLayout(dataIndex, {
+      initBaseline: median[vDimIdx],
+      ends: ends
+    });
+  }
+
+  function getPoint(axisDimVal, dimIdx, dataIndex) {
+    var val = data.get(dimIdx, dataIndex);
+    var p = [];
+    p[cDimIdx] = axisDimVal;
+    p[vDimIdx] = val;
+    var point;
+
+    if (isNaN(axisDimVal) || isNaN(val)) {
+      point = [NaN, NaN];
+    } else {
+      point = coordSys.dataToPoint(p);
+      point[cDimIdx] += offset;
+    }
+
+    return point;
+  }
+
+  function addBodyEnd(ends, point, start) {
+    var point1 = point.slice();
+    var point2 = point.slice();
+    point1[cDimIdx] += halfWidth;
+    point2[cDimIdx] -= halfWidth;
+    start ? ends.push(point1, point2) : ends.push(point2, point1);
+  }
+
+  function layEndLine(ends, endCenter) {
+    var from = endCenter.slice();
+    var to = endCenter.slice();
+    from[cDimIdx] -= halfWidth;
+    to[cDimIdx] += halfWidth;
+    ends.push(from, to);
+  }
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+registerVisual(boxplotVisual);
+registerLayout(boxplotLayout);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var parallelPreprocessor = function (option) {
+  createParallelIfNeeded(option);
+  mergeAxisOptionFromParallel(option);
+};
+/**
+ * Create a parallel coordinate if not exists.
+ * @inner
+ */
+
+function createParallelIfNeeded(option) {
+  if (option.parallel) {
+    return;
+  }
+
+  var hasParallelSeries = false;
+  each$1(option.series, function (seriesOpt) {
+    if (seriesOpt && seriesOpt.type === 'parallel') {
+      hasParallelSeries = true;
+    }
+  });
+
+  if (hasParallelSeries) {
+    option.parallel = [{}];
+  }
+}
+/**
+ * Merge aixs definition from parallel option (if exists) to axis option.
+ * @inner
+ */
+
+
+function mergeAxisOptionFromParallel(option) {
+  var axes = normalizeToArray(option.parallelAxis);
+  each$1(axes, function (axisOption) {
+    if (!isObject$1(axisOption)) {
+      return;
+    }
+
+    var parallelIndex = axisOption.parallelIndex || 0;
+    var parallelOption = normalizeToArray(option.parallel)[parallelIndex];
+
+    if (parallelOption && parallelOption.parallelAxisDefault) {
+      merge(axisOption, parallelOption.parallelAxisDefault, false);
+    }
+  });
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+/**
+ * @constructor module:echarts/coord/parallel/ParallelAxis
+ * @extends {module:echarts/coord/Axis}
+ * @param {string} dim
+ * @param {*} scale
+ * @param {Array.<number>} coordExtent
+ * @param {string} axisType
+ */
+
+var ParallelAxis = function (dim, scale, coordExtent, axisType, axisIndex) {
+  Axis.call(this, dim, scale, coordExtent);
+  /**
+   * Axis type
+   *  - 'category'
+   *  - 'value'
+   *  - 'time'
+   *  - 'log'
+   * @type {string}
+   */
+
+  this.type = axisType || 'value';
+  /**
+   * @type {number}
+   * @readOnly
+   */
+
+  this.axisIndex = axisIndex;
+};
+
+ParallelAxis.prototype = {
+  constructor: ParallelAxis,
+
+  /**
+   * Axis model
+   * @param {module:echarts/coord/parallel/AxisModel}
+   */
+  model: null,
+
+  /**
+   * @override
+   */
+  isHorizontal: function () {
+    return this.coordinateSystem.getModel().get('layout') !== 'horizontal';
+  }
+};
+inherits(ParallelAxis, Axis);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * Calculate slider move result.
+ * Usage:
+ * (1) If both handle0 and handle1 are needed to be moved, set minSpan the same as
+ * maxSpan and the same as `Math.abs(handleEnd[1] - handleEnds[0])`.
+ * (2) If handle0 is forbidden to cross handle1, set minSpan as `0`.
+ *
+ * @param {number} delta Move length.
+ * @param {Array.<number>} handleEnds handleEnds[0] can be bigger then handleEnds[1].
+ *              handleEnds will be modified in this method.
+ * @param {Array.<number>} extent handleEnds is restricted by extent.
+ *              extent[0] should less or equals than extent[1].
+ * @param {number|string} handleIndex Can be 'all', means that both move the two handleEnds,
+ *              where the input minSpan and maxSpan will not work.
+ * @param {number} [minSpan] The range of dataZoom can not be smaller than that.
+ *              If not set, handle0 and cross handle1. If set as a non-negative
+ *              number (including `0`), handles will push each other when reaching
+ *              the minSpan.
+ * @param {number} [maxSpan] The range of dataZoom can not be larger than that.
+ * @return {Array.<number>} The input handleEnds.
+ */
+var sliderMove = function (delta, handleEnds, extent, handleIndex, minSpan, maxSpan) {
+  // Normalize firstly.
+  handleEnds[0] = restrict$1(handleEnds[0], extent);
+  handleEnds[1] = restrict$1(handleEnds[1], extent);
+  delta = delta || 0;
+  var extentSpan = extent[1] - extent[0]; // Notice maxSpan and minSpan can be null/undefined.
+
+  if (minSpan != null) {
+    minSpan = restrict$1(minSpan, [0, extentSpan]);
+  }
+
+  if (maxSpan != null) {
+    maxSpan = Math.max(maxSpan, minSpan != null ? minSpan : 0);
+  }
+
+  if (handleIndex === 'all') {
+    minSpan = maxSpan = Math.abs(handleEnds[1] - handleEnds[0]);
+    handleIndex = 0;
+  }
+
+  var originalDistSign = getSpanSign(handleEnds, handleIndex);
+  handleEnds[handleIndex] += delta; // Restrict in extent.
+
+  var extentMinSpan = minSpan || 0;
+  var realExtent = extent.slice();
+  originalDistSign.sign < 0 ? realExtent[0] += extentMinSpan : realExtent[1] -= extentMinSpan;
+  handleEnds[handleIndex] = restrict$1(handleEnds[handleIndex], realExtent); // Expand span.
+
+  var currDistSign = getSpanSign(handleEnds, handleIndex);
+
+  if (minSpan != null && (currDistSign.sign !== originalDistSign.sign || currDistSign.span < minSpan)) {
+    // If minSpan exists, 'cross' is forbinden.
+    handleEnds[1 - handleIndex] = handleEnds[handleIndex] + originalDistSign.sign * minSpan;
+  } // Shrink span.
+
+
+  var currDistSign = getSpanSign(handleEnds, handleIndex);
+
+  if (maxSpan != null && currDistSign.span > maxSpan) {
+    handleEnds[1 - handleIndex] = handleEnds[handleIndex] + currDistSign.sign * maxSpan;
+  }
+
+  return handleEnds;
+};
+
+function getSpanSign(handleEnds, handleIndex) {
+  var dist = handleEnds[handleIndex] - handleEnds[1 - handleIndex]; // If `handleEnds[0] === handleEnds[1]`, always believe that handleEnd[0]
+  // is at left of handleEnds[1] for non-cross case.
+
+  return {
+    span: Math.abs(dist),
+    sign: dist > 0 ? -1 : dist < 0 ? 1 : handleIndex ? -1 : 1
+  };
+}
+
+function restrict$1(value, extend) {
+  return Math.min(extend[1], Math.max(extend[0], value));
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * Parallel Coordinates
+ * <https://en.wikipedia.org/wiki/Parallel_coordinates>
+ */
+var each$12 = each$1;
+var mathMin$5 = Math.min;
+var mathMax$5 = Math.max;
+var mathFloor$2 = Math.floor;
+var mathCeil$2 = Math.ceil;
+var round$2 = round$1;
+var PI$3 = Math.PI;
+
+function Parallel(parallelModel, ecModel, api) {
+  /**
+   * key: dimension
+   * @type {Object.<string, module:echarts/coord/parallel/Axis>}
+   * @private
+   */
+  this._axesMap = createHashMap();
+  /**
+   * key: dimension
+   * value: {position: [], rotation, }
+   * @type {Object.<string, Object>}
+   * @private
+   */
+
+  this._axesLayout = {};
+  /**
+   * Always follow axis order.
+   * @type {Array.<string>}
+   * @readOnly
+   */
+
+  this.dimensions = parallelModel.dimensions;
+  /**
+   * @type {module:zrender/core/BoundingRect}
+   */
+
+  this._rect;
+  /**
+   * @type {module:echarts/coord/parallel/ParallelModel}
+   */
+
+  this._model = parallelModel;
+
+  this._init(parallelModel, ecModel, api);
+}
+
+Parallel.prototype = {
+  type: 'parallel',
+  constructor: Parallel,
+
+  /**
+   * Initialize cartesian coordinate systems
+   * @private
+   */
+  _init: function (parallelModel, ecModel, api) {
+    var dimensions = parallelModel.dimensions;
+    var parallelAxisIndex = parallelModel.parallelAxisIndex;
+    each$12(dimensions, function (dim, idx) {
+      var axisIndex = parallelAxisIndex[idx];
+      var axisModel = ecModel.getComponent('parallelAxis', axisIndex);
+
+      var axis = this._axesMap.set(dim, new ParallelAxis(dim, createScaleByModel(axisModel), [0, 0], axisModel.get('type'), axisIndex));
+
+      var isCategory = axis.type === 'category';
+      axis.onBand = isCategory && axisModel.get('boundaryGap');
+      axis.inverse = axisModel.get('inverse'); // Injection
+
+      axisModel.axis = axis;
+      axis.model = axisModel;
+      axis.coordinateSystem = axisModel.coordinateSystem = this;
+    }, this);
+  },
+
+  /**
+   * Update axis scale after data processed
+   * @param  {module:echarts/model/Global} ecModel
+   * @param  {module:echarts/ExtensionAPI} api
+   */
+  update: function (ecModel, api) {
+    this._updateAxesFromSeries(this._model, ecModel);
+  },
+
+  /**
+   * @override
+   */
+  containPoint: function (point) {
+    var layoutInfo = this._makeLayoutInfo();
+
+    var axisBase = layoutInfo.axisBase;
+    var layoutBase = layoutInfo.layoutBase;
+    var pixelDimIndex = layoutInfo.pixelDimIndex;
+    var pAxis = point[1 - pixelDimIndex];
+    var pLayout = point[pixelDimIndex];
+    return pAxis >= axisBase && pAxis <= axisBase + layoutInfo.axisLength && pLayout >= layoutBase && pLayout <= layoutBase + layoutInfo.layoutLength;
+  },
+  getModel: function () {
+    return this._model;
+  },
+
+  /**
+   * Update properties from series
+   * @private
+   */
+  _updateAxesFromSeries: function (parallelModel, ecModel) {
+    ecModel.eachSeries(function (seriesModel) {
+      if (!parallelModel.contains(seriesModel, ecModel)) {
+        return;
+      }
+
+      var data = seriesModel.getData();
+      each$12(this.dimensions, function (dim) {
+        var axis = this._axesMap.get(dim);
+
+        axis.scale.unionExtentFromData(data, data.mapDimension(dim));
+        niceScaleExtent(axis.scale, axis.model);
+      }, this);
+    }, this);
+  },
+
+  /**
+   * Resize the parallel coordinate system.
+   * @param {module:echarts/coord/parallel/ParallelModel} parallelModel
+   * @param {module:echarts/ExtensionAPI} api
+   */
+  resize: function (parallelModel, api) {
+    this._rect = getLayoutRect(parallelModel.getBoxLayoutParams(), {
+      width: api.getWidth(),
+      height: api.getHeight()
+    });
+
+    this._layoutAxes();
+  },
+
+  /**
+   * @return {module:zrender/core/BoundingRect}
+   */
+  getRect: function () {
+    return this._rect;
+  },
+
+  /**
+   * @private
+   */
+  _makeLayoutInfo: function () {
+    var parallelModel = this._model;
+    var rect = this._rect;
+    var xy = ['x', 'y'];
+    var wh = ['width', 'height'];
+    var layout = parallelModel.get('layout');
+    var pixelDimIndex = layout === 'horizontal' ? 0 : 1;
+    var layoutLength = rect[wh[pixelDimIndex]];
+    var layoutExtent = [0, layoutLength];
+    var axisCount = this.dimensions.length;
+    var axisExpandWidth = restrict(parallelModel.get('axisExpandWidth'), layoutExtent);
+    var axisExpandCount = restrict(parallelModel.get('axisExpandCount') || 0, [0, axisCount]);
+    var axisExpandable = parallelModel.get('axisExpandable') && axisCount > 3 && axisCount > axisExpandCount && axisExpandCount > 1 && axisExpandWidth > 0 && layoutLength > 0; // `axisExpandWindow` is According to the coordinates of [0, axisExpandLength],
+    // for sake of consider the case that axisCollapseWidth is 0 (when screen is narrow),
+    // where collapsed axes should be overlapped.
+
+    var axisExpandWindow = parallelModel.get('axisExpandWindow');
+    var winSize;
+
+    if (!axisExpandWindow) {
+      winSize = restrict(axisExpandWidth * (axisExpandCount - 1), layoutExtent);
+      var axisExpandCenter = parallelModel.get('axisExpandCenter') || mathFloor$2(axisCount / 2);
+      axisExpandWindow = [axisExpandWidth * axisExpandCenter - winSize / 2];
+      axisExpandWindow[1] = axisExpandWindow[0] + winSize;
+    } else {
+      winSize = restrict(axisExpandWindow[1] - axisExpandWindow[0], layoutExtent);
+      axisExpandWindow[1] = axisExpandWindow[0] + winSize;
+    }
+
+    var axisCollapseWidth = (layoutLength - winSize) / (axisCount - axisExpandCount); // Avoid axisCollapseWidth is too small.
+
+    axisCollapseWidth < 3 && (axisCollapseWidth = 0); // Find the first and last indices > ewin[0] and < ewin[1].
+
+    var winInnerIndices = [mathFloor$2(round$2(axisExpandWindow[0] / axisExpandWidth, 1)) + 1, mathCeil$2(round$2(axisExpandWindow[1] / axisExpandWidth, 1)) - 1]; // Pos in ec coordinates.
+
+    var axisExpandWindow0Pos = axisCollapseWidth / axisExpandWidth * axisExpandWindow[0];
+    return {
+      layout: layout,
+      pixelDimIndex: pixelDimIndex,
+      layoutBase: rect[xy[pixelDimIndex]],
+      layoutLength: layoutLength,
+      axisBase: rect[xy[1 - pixelDimIndex]],
+      axisLength: rect[wh[1 - pixelDimIndex]],
+      axisExpandable: axisExpandable,
+      axisExpandWidth: axisExpandWidth,
+      axisCollapseWidth: axisCollapseWidth,
+      axisExpandWindow: axisExpandWindow,
+      axisCount: axisCount,
+      winInnerIndices: winInnerIndices,
+      axisExpandWindow0Pos: axisExpandWindow0Pos
+    };
+  },
+
+  /**
+   * @private
+   */
+  _layoutAxes: function () {
+    var rect = this._rect;
+    var axes = this._axesMap;
+    var dimensions = this.dimensions;
+
+    var layoutInfo = this._makeLayoutInfo();
+
+    var layout = layoutInfo.layout;
+    axes.each(function (axis) {
+      var axisExtent = [0, layoutInfo.axisLength];
+      var idx = axis.inverse ? 1 : 0;
+      axis.setExtent(axisExtent[idx], axisExtent[1 - idx]);
+    });
+    each$12(dimensions, function (dim, idx) {
+      var posInfo = (layoutInfo.axisExpandable ? layoutAxisWithExpand : layoutAxisWithoutExpand)(idx, layoutInfo);
+      var positionTable = {
+        horizontal: {
+          x: posInfo.position,
+          y: layoutInfo.axisLength
+        },
+        vertical: {
+          x: 0,
+          y: posInfo.position
+        }
+      };
+      var rotationTable = {
+        horizontal: PI$3 / 2,
+        vertical: 0
+      };
+      var position = [positionTable[layout].x + rect.x, positionTable[layout].y + rect.y];
+      var rotation = rotationTable[layout];
+      var transform = create$1();
+      rotate(transform, transform, rotation);
+      translate(transform, transform, position); // TODO
+      // tick绛夋帓甯冧俊鎭��
+      // TODO
+      // 鏍规嵁axis order 鏇存柊 dimensions椤哄簭銆�
+
+      this._axesLayout[dim] = {
+        position: position,
+        rotation: rotation,
+        transform: transform,
+        axisNameAvailableWidth: posInfo.axisNameAvailableWidth,
+        axisLabelShow: posInfo.axisLabelShow,
+        nameTruncateMaxWidth: posInfo.nameTruncateMaxWidth,
+        tickDirection: 1,
+        labelDirection: 1
+      };
+    }, this);
+  },
+
+  /**
+   * Get axis by dim.
+   * @param {string} dim
+   * @return {module:echarts/coord/parallel/ParallelAxis} [description]
+   */
+  getAxis: function (dim) {
+    return this._axesMap.get(dim);
+  },
+
+  /**
+   * Convert a dim value of a single item of series data to Point.
+   * @param {*} value
+   * @param {string} dim
+   * @return {Array}
+   */
+  dataToPoint: function (value, dim) {
+    return this.axisCoordToPoint(this._axesMap.get(dim).dataToCoord(value), dim);
+  },
+
+  /**
+   * Travel data for one time, get activeState of each data item.
+   * @param {module:echarts/data/List} data
+   * @param {Functio} cb param: {string} activeState 'active' or 'inactive' or 'normal'
+   *                            {number} dataIndex
+   * @param {number} [start=0] the start dataIndex that travel from.
+   * @param {number} [end=data.count()] the next dataIndex of the last dataIndex will be travel.
+   */
+  eachActiveState: function (data, callback, start, end) {
+    start == null && (start = 0);
+    end == null && (end = data.count());
+    var axesMap = this._axesMap;
+    var dimensions = this.dimensions;
+    var dataDimensions = [];
+    var axisModels = [];
+    each$1(dimensions, function (axisDim) {
+      dataDimensions.push(data.mapDimension(axisDim));
+      axisModels.push(axesMap.get(axisDim).model);
+    });
+    var hasActiveSet = this.hasAxisBrushed();
+
+    for (var dataIndex = start; dataIndex < end; dataIndex++) {
+      var activeState;
+
+      if (!hasActiveSet) {
+        activeState = 'normal';
+      } else {
+        activeState = 'active';
+        var values = data.getValues(dataDimensions, dataIndex);
+
+        for (var j = 0, lenj = dimensions.length; j < lenj; j++) {
+          var state = axisModels[j].getActiveState(values[j]);
+
+          if (state === 'inactive') {
+            activeState = 'inactive';
+            break;
+          }
+        }
+      }
+
+      callback(activeState, dataIndex);
+    }
+  },
+
+  /**
+   * Whether has any activeSet.
+   * @return {boolean}
+   */
+  hasAxisBrushed: function () {
+    var dimensions = this.dimensions;
+    var axesMap = this._axesMap;
+    var hasActiveSet = false;
+
+    for (var j = 0, lenj = dimensions.length; j < lenj; j++) {
+      if (axesMap.get(dimensions[j]).model.getActiveState() !== 'normal') {
+        hasActiveSet = true;
+      }
+    }
+
+    return hasActiveSet;
+  },
+
+  /**
+   * Convert coords of each axis to Point.
+   *  Return point. For example: [10, 20]
+   * @param {Array.<number>} coords
+   * @param {string} dim
+   * @return {Array.<number>}
+   */
+  axisCoordToPoint: function (coord, dim) {
+    var axisLayout = this._axesLayout[dim];
+    return applyTransform$1([coord, 0], axisLayout.transform);
+  },
+
+  /**
+   * Get axis layout.
+   */
+  getAxisLayout: function (dim) {
+    return clone(this._axesLayout[dim]);
+  },
+
+  /**
+   * @param {Array.<number>} point
+   * @return {Object} {axisExpandWindow, delta, behavior: 'jump' | 'slide' | 'none'}.
+   */
+  getSlidedAxisExpandWindow: function (point) {
+    var layoutInfo = this._makeLayoutInfo();
+
+    var pixelDimIndex = layoutInfo.pixelDimIndex;
+    var axisExpandWindow = layoutInfo.axisExpandWindow.slice();
+    var winSize = axisExpandWindow[1] - axisExpandWindow[0];
+    var extent = [0, layoutInfo.axisExpandWidth * (layoutInfo.axisCount - 1)]; // Out of the area of coordinate system.
+
+    if (!this.containPoint(point)) {
+      return {
+        behavior: 'none',
+        axisExpandWindow: axisExpandWindow
+      };
+    } // Conver the point from global to expand coordinates.
+
+
+    var pointCoord = point[pixelDimIndex] - layoutInfo.layoutBase - layoutInfo.axisExpandWindow0Pos; // For dragging operation convenience, the window should not be
+    // slided when mouse is the center area of the window.
+
+    var delta;
+    var behavior = 'slide';
+    var axisCollapseWidth = layoutInfo.axisCollapseWidth;
+
+    var triggerArea = this._model.get('axisExpandSlideTriggerArea'); // But consider touch device, jump is necessary.
+
+
+    var useJump = triggerArea[0] != null;
+
+    if (axisCollapseWidth) {
+      if (useJump && axisCollapseWidth && pointCoord < winSize * triggerArea[0]) {
+        behavior = 'jump';
+        delta = pointCoord - winSize * triggerArea[2];
+      } else if (useJump && axisCollapseWidth && pointCoord > winSize * (1 - triggerArea[0])) {
+        behavior = 'jump';
+        delta = pointCoord - winSize * (1 - triggerArea[2]);
+      } else {
+        (delta = pointCoord - winSize * triggerArea[1]) >= 0 && (delta = pointCoord - winSize * (1 - triggerArea[1])) <= 0 && (delta = 0);
+      }
+
+      delta *= layoutInfo.axisExpandWidth / axisCollapseWidth;
+      delta ? sliderMove(delta, axisExpandWindow, extent, 'all') // Avoid nonsense triger on mousemove.
+      : behavior = 'none';
+    } // When screen is too narrow, make it visible and slidable, although it is hard to interact.
+    else {
+        var winSize = axisExpandWindow[1] - axisExpandWindow[0];
+        var pos = extent[1] * pointCoord / winSize;
+        axisExpandWindow = [mathMax$5(0, pos - winSize / 2)];
+        axisExpandWindow[1] = mathMin$5(extent[1], axisExpandWindow[0] + winSize);
+        axisExpandWindow[0] = axisExpandWindow[1] - winSize;
+      }
+
+    return {
+      axisExpandWindow: axisExpandWindow,
+      behavior: behavior
+    };
+  }
+};
+
+function restrict(len, extent) {
+  return mathMin$5(mathMax$5(len, extent[0]), extent[1]);
+}
+
+function layoutAxisWithoutExpand(axisIndex, layoutInfo) {
+  var step = layoutInfo.layoutLength / (layoutInfo.axisCount - 1);
+  return {
+    position: step * axisIndex,
+    axisNameAvailableWidth: step,
+    axisLabelShow: true
+  };
+}
+
+function layoutAxisWithExpand(axisIndex, layoutInfo) {
+  var layoutLength = layoutInfo.layoutLength;
+  var axisExpandWidth = layoutInfo.axisExpandWidth;
+  var axisCount = layoutInfo.axisCount;
+  var axisCollapseWidth = layoutInfo.axisCollapseWidth;
+  var winInnerIndices = layoutInfo.winInnerIndices;
+  var position;
+  var axisNameAvailableWidth = axisCollapseWidth;
+  var axisLabelShow = false;
+  var nameTruncateMaxWidth;
+
+  if (axisIndex < winInnerIndices[0]) {
+    position = axisIndex * axisCollapseWidth;
+    nameTruncateMaxWidth = axisCollapseWidth;
+  } else if (axisIndex <= winInnerIndices[1]) {
+    position = layoutInfo.axisExpandWindow0Pos + axisIndex * axisExpandWidth - layoutInfo.axisExpandWindow[0];
+    axisNameAvailableWidth = axisExpandWidth;
+    axisLabelShow = true;
+  } else {
+    position = layoutLength - (axisCount - 1 - axisIndex) * axisCollapseWidth;
+    nameTruncateMaxWidth = axisCollapseWidth;
+  }
+
+  return {
+    position: position,
+    axisNameAvailableWidth: axisNameAvailableWidth,
+    axisLabelShow: axisLabelShow,
+    nameTruncateMaxWidth: nameTruncateMaxWidth
+  };
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * Parallel coordinate system creater.
+ */
+function create$2(ecModel, api) {
+  var coordSysList = [];
+  ecModel.eachComponent('parallel', function (parallelModel, idx) {
+    var coordSys = new Parallel(parallelModel, ecModel, api);
+    coordSys.name = 'parallel_' + idx;
+    coordSys.resize(parallelModel, api);
+    parallelModel.coordinateSystem = coordSys;
+    coordSys.model = parallelModel;
+    coordSysList.push(coordSys);
+  }); // Inject the coordinateSystems into seriesModel
+
+  ecModel.eachSeries(function (seriesModel) {
+    if (seriesModel.get('coordinateSystem') === 'parallel') {
+      var parallelModel = ecModel.queryComponents({
+        mainType: 'parallel',
+        index: seriesModel.get('parallelIndex'),
+        id: seriesModel.get('parallelId')
+      })[0];
+      seriesModel.coordinateSystem = parallelModel.coordinateSystem;
+    }
+  });
+  return coordSysList;
+}
+
+CoordinateSystemManager.register('parallel', {
+  create: create$2
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var AxisModel$2 = ComponentModel.extend({
+  type: 'baseParallelAxis',
+
+  /**
+   * @type {module:echarts/coord/parallel/Axis}
+   */
+  axis: null,
+
+  /**
+   * @type {Array.<Array.<number>}
+   * @readOnly
+   */
+  activeIntervals: [],
+
+  /**
+   * @return {Object}
+   */
+  getAreaSelectStyle: function () {
+    return makeStyleMapper([['fill', 'color'], ['lineWidth', 'borderWidth'], ['stroke', 'borderColor'], ['width', 'width'], ['opacity', 'opacity']])(this.getModel('areaSelectStyle'));
+  },
+
+  /**
+   * The code of this feature is put on AxisModel but not ParallelAxis,
+   * because axisModel can be alive after echarts updating but instance of
+   * ParallelAxis having been disposed. this._activeInterval should be kept
+   * when action dispatched (i.e. legend click).
+   *
+   * @param {Array.<Array<number>>} intervals interval.length === 0
+   *                                          means set all active.
+   * @public
+   */
+  setActiveIntervals: function (intervals) {
+    var activeIntervals = this.activeIntervals = clone(intervals); // Normalize
+
+    if (activeIntervals) {
+      for (var i = activeIntervals.length - 1; i >= 0; i--) {
+        asc(activeIntervals[i]);
+      }
+    }
+  },
+
+  /**
+   * @param {number|string} [value] When attempting to detect 'no activeIntervals set',
+   *                         value can not be input.
+   * @return {string} 'normal': no activeIntervals set,
+   *                  'active',
+   *                  'inactive'.
+   * @public
+   */
+  getActiveState: function (value) {
+    var activeIntervals = this.activeIntervals;
+
+    if (!activeIntervals.length) {
+      return 'normal';
+    }
+
+    if (value == null || isNaN(value)) {
+      return 'inactive';
+    } // Simple optimization
+
+
+    if (activeIntervals.length === 1) {
+      var interval = activeIntervals[0];
+
+      if (interval[0] <= value && value <= interval[1]) {
+        return 'active';
+      }
+    } else {
+      for (var i = 0, len = activeIntervals.length; i < len; i++) {
+        if (activeIntervals[i][0] <= value && value <= activeIntervals[i][1]) {
+          return 'active';
+        }
+      }
+    }
+
+    return 'inactive';
+  }
+});
+var defaultOption$1 = {
+  type: 'value',
+
+  /**
+   * @type {Array.<number>}
+   */
+  dim: null,
+  // 0, 1, 2, ...
+  // parallelIndex: null,
+  areaSelectStyle: {
+    width: 20,
+    borderWidth: 1,
+    borderColor: 'rgba(160,197,232)',
+    color: 'rgba(160,197,232)',
+    opacity: 0.3
+  },
+  realtime: true,
+  // Whether realtime update view when select.
+  z: 10
+};
+merge(AxisModel$2.prototype, axisModelCommonMixin);
+
+function getAxisType$1(axisName, option) {
+  return option.type || (option.data ? 'category' : 'value');
+}
+
+axisModelCreator('parallel', AxisModel$2, getAxisType$1, defaultOption$1);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+ComponentModel.extend({
+  type: 'parallel',
+  dependencies: ['parallelAxis'],
+
+  /**
+   * @type {module:echarts/coord/parallel/Parallel}
+   */
+  coordinateSystem: null,
+
+  /**
+   * Each item like: 'dim0', 'dim1', 'dim2', ...
+   * @type {Array.<string>}
+   * @readOnly
+   */
+  dimensions: null,
+
+  /**
+   * Coresponding to dimensions.
+   * @type {Array.<number>}
+   * @readOnly
+   */
+  parallelAxisIndex: null,
+  layoutMode: 'box',
+  defaultOption: {
+    zlevel: 0,
+    z: 0,
+    left: 80,
+    top: 60,
+    right: 80,
+    bottom: 60,
+    // width: {totalWidth} - left - right,
+    // height: {totalHeight} - top - bottom,
+    layout: 'horizontal',
+    // 'horizontal' or 'vertical'
+    // FIXME
+    // naming?
+    axisExpandable: false,
+    axisExpandCenter: null,
+    axisExpandCount: 0,
+    axisExpandWidth: 50,
+    // FIXME '10%' ?
+    axisExpandRate: 17,
+    axisExpandDebounce: 50,
+    // [out, in, jumpTarget]. In percentage. If use [null, 0.05], null means full.
+    // Do not doc to user until necessary.
+    axisExpandSlideTriggerArea: [-0.15, 0.05, 0.4],
+    axisExpandTriggerOn: 'click',
+    // 'mousemove' or 'click'
+    parallelAxisDefault: null
+  },
+
+  /**
+   * @override
+   */
+  init: function () {
+    ComponentModel.prototype.init.apply(this, arguments);
+    this.mergeOption({});
+  },
+
+  /**
+   * @override
+   */
+  mergeOption: function (newOption) {
+    var thisOption = this.option;
+    newOption && merge(thisOption, newOption, true);
+
+    this._initDimensions();
+  },
+
+  /**
+   * Whether series or axis is in this coordinate system.
+   * @param {module:echarts/model/Series|module:echarts/coord/parallel/AxisModel} model
+   * @param {module:echarts/model/Global} ecModel
+   */
+  contains: function (model, ecModel) {
+    var parallelIndex = model.get('parallelIndex');
+    return parallelIndex != null && ecModel.getComponent('parallel', parallelIndex) === this;
+  },
+  setAxisExpand: function (opt) {
+    each$1(['axisExpandable', 'axisExpandCenter', 'axisExpandCount', 'axisExpandWidth', 'axisExpandWindow'], function (name) {
+      if (opt.hasOwnProperty(name)) {
+        this.option[name] = opt[name];
+      }
+    }, this);
+  },
+
+  /**
+   * @private
+   */
+  _initDimensions: function () {
+    var dimensions = this.dimensions = [];
+    var parallelAxisIndex = this.parallelAxisIndex = [];
+    var axisModels = filter(this.dependentModels.parallelAxis, function (axisModel) {
+      // Can not use this.contains here, because
+      // initialization has not been completed yet.
+      return (axisModel.get('parallelIndex') || 0) === this.componentIndex;
+    }, this);
+    each$1(axisModels, function (axisModel) {
+      dimensions.push('dim' + axisModel.get('dim'));
+      parallelAxisIndex.push(axisModel.componentIndex);
+    });
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+/**
+ * @payload
+ * @property {string} parallelAxisId
+ * @property {Array.<Array.<number>>} intervals
+ */
+
+var actionInfo$1 = {
+  type: 'axisAreaSelect',
+  event: 'axisAreaSelected' // update: 'updateVisual'
+
+};
+registerAction(actionInfo$1, function (payload, ecModel) {
+  ecModel.eachComponent({
+    mainType: 'parallelAxis',
+    query: payload
+  }, function (parallelAxisModel) {
+    parallelAxisModel.axis.model.setActiveIntervals(payload.intervals);
+  });
+});
+/**
+ * @payload
+ */
+
+registerAction('parallelAxisExpand', function (payload, ecModel) {
+  ecModel.eachComponent({
+    mainType: 'parallel',
+    query: payload
+  }, function (parallelModel) {
+    parallelModel.setAxisExpand(payload);
+  });
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var curry$2 = curry;
+var each$13 = each$1;
+var map$2 = map;
+var mathMin$6 = Math.min;
+var mathMax$6 = Math.max;
+var mathPow$2 = Math.pow;
+var COVER_Z = 10000;
+var UNSELECT_THRESHOLD = 6;
+var MIN_RESIZE_LINE_WIDTH = 6;
+var MUTEX_RESOURCE_KEY = 'globalPan';
+var DIRECTION_MAP = {
+  w: [0, 0],
+  e: [0, 1],
+  n: [1, 0],
+  s: [1, 1]
+};
+var CURSOR_MAP = {
+  w: 'ew',
+  e: 'ew',
+  n: 'ns',
+  s: 'ns',
+  ne: 'nesw',
+  sw: 'nesw',
+  nw: 'nwse',
+  se: 'nwse'
+};
+var DEFAULT_BRUSH_OPT = {
+  brushStyle: {
+    lineWidth: 2,
+    stroke: 'rgba(0,0,0,0.3)',
+    fill: 'rgba(0,0,0,0.1)'
+  },
+  transformable: true,
+  brushMode: 'single',
+  removeOnClick: false
+};
+var baseUID = 0;
+/**
+ * @alias module:echarts/component/helper/BrushController
+ * @constructor
+ * @mixin {module:zrender/mixin/Eventful}
+ * @event module:echarts/component/helper/BrushController#brush
+ *        params:
+ *            areas: Array.<Array>, coord relates to container group,
+ *                                    If no container specified, to global.
+ *            opt {
+ *                isEnd: boolean,
+ *                removeOnClick: boolean
+ *            }
+ *
+ * @param {module:zrender/zrender~ZRender} zr
+ */
+
+function BrushController(zr) {
+  Eventful.call(this);
+  /**
+   * @type {module:zrender/zrender~ZRender}
+   * @private
+   */
+
+  this._zr = zr;
+  /**
+   * @type {module:zrender/container/Group}
+   * @readOnly
+   */
+
+  this.group = new Group();
+  /**
+   * Only for drawing (after enabledBrush).
+   *     'line', 'rect', 'polygon' or false
+   *     If passing false/null/undefined, disable brush.
+   *     If passing 'auto', determined by panel.defaultBrushType
+   * @private
+   * @type {string}
+   */
+
+  this._brushType;
+  /**
+   * Only for drawing (after enabledBrush).
+   *
+   * @private
+   * @type {Object}
+   */
+
+  this._brushOption;
+  /**
+   * @private
+   * @type {Object}
+   */
+
+  this._panels;
+  /**
+   * @private
+   * @type {Array.<nubmer>}
+   */
+
+  this._track = [];
+  /**
+   * @private
+   * @type {boolean}
+   */
+
+  this._dragging;
+  /**
+   * @private
+   * @type {Array}
+   */
+
+  this._covers = [];
+  /**
+   * @private
+   * @type {moudule:zrender/container/Group}
+   */
+
+  this._creatingCover;
+  /**
+   * `true` means global panel
+   * @private
+   * @type {module:zrender/container/Group|boolean}
+   */
+
+  this._creatingPanel;
+  /**
+   * @private
+   * @type {boolean}
+   */
+
+  this._enableGlobalPan;
+  /**
+   * @private
+   * @type {boolean}
+   */
+
+  /**
+   * @private
+   * @type {string}
+   */
+  this._uid = 'brushController_' + baseUID++;
+  /**
+   * @private
+   * @type {Object}
+   */
+
+  this._handlers = {};
+  each$13(mouseHandlers, function (handler, eventName) {
+    this._handlers[eventName] = bind(handler, this);
+  }, this);
+}
+
+BrushController.prototype = {
+  constructor: BrushController,
+
+  /**
+   * If set to null/undefined/false, select disabled.
+   * @param {Object} brushOption
+   * @param {string|boolean} brushOption.brushType 'line', 'rect', 'polygon' or false
+   *                          If passing false/null/undefined, disable brush.
+   *                          If passing 'auto', determined by panel.defaultBrushType.
+   *                              ('auto' can not be used in global panel)
+   * @param {number} [brushOption.brushMode='single'] 'single' or 'multiple'
+   * @param {boolean} [brushOption.transformable=true]
+   * @param {boolean} [brushOption.removeOnClick=false]
+   * @param {Object} [brushOption.brushStyle]
+   * @param {number} [brushOption.brushStyle.width]
+   * @param {number} [brushOption.brushStyle.lineWidth]
+   * @param {string} [brushOption.brushStyle.stroke]
+   * @param {string} [brushOption.brushStyle.fill]
+   * @param {number} [brushOption.z]
+   */
+  enableBrush: function (brushOption) {
+    this._brushType && doDisableBrush(this);
+    brushOption.brushType && doEnableBrush(this, brushOption);
+    return this;
+  },
+
+  /**
+   * @param {Array.<Object>} panelOpts If not pass, it is global brush.
+   *        Each items: {
+   *            panelId, // mandatory.
+   *            clipPath, // mandatory. function.
+   *            isTargetByCursor, // mandatory. function.
+   *            defaultBrushType, // optional, only used when brushType is 'auto'.
+   *            getLinearBrushOtherExtent, // optional. function.
+   *        }
+   */
+  setPanels: function (panelOpts) {
+    if (panelOpts && panelOpts.length) {
+      var panels = this._panels = {};
+      each$1(panelOpts, function (panelOpts) {
+        panels[panelOpts.panelId] = clone(panelOpts);
+      });
+    } else {
+      this._panels = null;
+    }
+
+    return this;
+  },
+
+  /**
+   * @param {Object} [opt]
+   * @return {boolean} [opt.enableGlobalPan=false]
+   */
+  mount: function (opt) {
+    opt = opt || {};
+    this._enableGlobalPan = opt.enableGlobalPan;
+    var thisGroup = this.group;
+
+    this._zr.add(thisGroup);
+
+    thisGroup.attr({
+      position: opt.position || [0, 0],
+      rotation: opt.rotation || 0,
+      scale: opt.scale || [1, 1]
+    });
+    this._transform = thisGroup.getLocalTransform();
+    return this;
+  },
+  eachCover: function (cb, context) {
+    each$13(this._covers, cb, context);
+  },
+
+  /**
+   * Update covers.
+   * @param {Array.<Object>} brushOptionList Like:
+   *        [
+   *            {id: 'xx', brushType: 'line', range: [23, 44], brushStyle, transformable},
+   *            {id: 'yy', brushType: 'rect', range: [[23, 44], [23, 54]]},
+   *            ...
+   *        ]
+   *        `brushType` is required in each cover info. (can not be 'auto')
+   *        `id` is not mandatory.
+   *        `brushStyle`, `transformable` is not mandatory, use DEFAULT_BRUSH_OPT by default.
+   *        If brushOptionList is null/undefined, all covers removed.
+   */
+  updateCovers: function (brushOptionList) {
+    brushOptionList = map(brushOptionList, function (brushOption) {
+      return merge(clone(DEFAULT_BRUSH_OPT), brushOption, true);
+    });
+    var tmpIdPrefix = '\0-brush-index-';
+    var oldCovers = this._covers;
+    var newCovers = this._covers = [];
+    var controller = this;
+    var creatingCover = this._creatingCover;
+    new DataDiffer(oldCovers, brushOptionList, oldGetKey, getKey).add(addOrUpdate).update(addOrUpdate).remove(remove).execute();
+    return this;
+
+    function getKey(brushOption, index) {
+      return (brushOption.id != null ? brushOption.id : tmpIdPrefix + index) + '-' + brushOption.brushType;
+    }
+
+    function oldGetKey(cover, index) {
+      return getKey(cover.__brushOption, index);
+    }
+
+    function addOrUpdate(newIndex, oldIndex) {
+      var newBrushOption = brushOptionList[newIndex]; // Consider setOption in event listener of brushSelect,
+      // where updating cover when creating should be forbiden.
+
+      if (oldIndex != null && oldCovers[oldIndex] === creatingCover) {
+        newCovers[newIndex] = oldCovers[oldIndex];
+      } else {
+        var cover = newCovers[newIndex] = oldIndex != null ? (oldCovers[oldIndex].__brushOption = newBrushOption, oldCovers[oldIndex]) : endCreating(controller, createCover(controller, newBrushOption));
+        updateCoverAfterCreation(controller, cover);
+      }
+    }
+
+    function remove(oldIndex) {
+      if (oldCovers[oldIndex] !== creatingCover) {
+        controller.group.remove(oldCovers[oldIndex]);
+      }
+    }
+  },
+  unmount: function () {
+    this.enableBrush(false); // container may 'removeAll' outside.
+
+    clearCovers(this);
+
+    this._zr.remove(this.group);
+
+    return this;
+  },
+  dispose: function () {
+    this.unmount();
+    this.off();
+  }
+};
+mixin(BrushController, Eventful);
+
+function doEnableBrush(controller, brushOption) {
+  var zr = controller._zr; // Consider roam, which takes globalPan too.
+
+  if (!controller._enableGlobalPan) {
+    take(zr, MUTEX_RESOURCE_KEY, controller._uid);
+  }
+
+  each$13(controller._handlers, function (handler, eventName) {
+    zr.on(eventName, handler);
+  });
+  controller._brushType = brushOption.brushType;
+  controller._brushOption = merge(clone(DEFAULT_BRUSH_OPT), brushOption, true);
+}
+
+function doDisableBrush(controller) {
+  var zr = controller._zr;
+  release(zr, MUTEX_RESOURCE_KEY, controller._uid);
+  each$13(controller._handlers, function (handler, eventName) {
+    zr.off(eventName, handler);
+  });
+  controller._brushType = controller._brushOption = null;
+}
+
+function createCover(controller, brushOption) {
+  var cover = coverRenderers[brushOption.brushType].createCover(controller, brushOption);
+  cover.__brushOption = brushOption;
+  updateZ$1(cover, brushOption);
+  controller.group.add(cover);
+  return cover;
+}
+
+function endCreating(controller, creatingCover) {
+  var coverRenderer = getCoverRenderer(creatingCover);
+
+  if (coverRenderer.endCreating) {
+    coverRenderer.endCreating(controller, creatingCover);
+    updateZ$1(creatingCover, creatingCover.__brushOption);
+  }
+
+  return creatingCover;
+}
+
+function updateCoverShape(controller, cover) {
+  var brushOption = cover.__brushOption;
+  getCoverRenderer(cover).updateCoverShape(controller, cover, brushOption.range, brushOption);
+}
+
+function updateZ$1(cover, brushOption) {
+  var z = brushOption.z;
+  z == null && (z = COVER_Z);
+  cover.traverse(function (el) {
+    el.z = z;
+    el.z2 = z; // Consider in given container.
+  });
+}
+
+function updateCoverAfterCreation(controller, cover) {
+  getCoverRenderer(cover).updateCommon(controller, cover);
+  updateCoverShape(controller, cover);
+}
+
+function getCoverRenderer(cover) {
+  return coverRenderers[cover.__brushOption.brushType];
+} // return target panel or `true` (means global panel)
+
+
+function getPanelByPoint(controller, e, localCursorPoint) {
+  var panels = controller._panels;
+
+  if (!panels) {
+    return true; // Global panel
+  }
+
+  var panel;
+  var transform = controller._transform;
+  each$13(panels, function (pn) {
+    pn.isTargetByCursor(e, localCursorPoint, transform) && (panel = pn);
+  });
+  return panel;
+} // Return a panel or true
+
+
+function getPanelByCover(controller, cover) {
+  var panels = controller._panels;
+
+  if (!panels) {
+    return true; // Global panel
+  }
+
+  var panelId = cover.__brushOption.panelId; // User may give cover without coord sys info,
+  // which is then treated as global panel.
+
+  return panelId != null ? panels[panelId] : true;
+}
+
+function clearCovers(controller) {
+  var covers = controller._covers;
+  var originalLength = covers.length;
+  each$13(covers, function (cover) {
+    controller.group.remove(cover);
+  }, controller);
+  covers.length = 0;
+  return !!originalLength;
+}
+
+function trigger$1(controller, opt) {
+  var areas = map$2(controller._covers, function (cover) {
+    var brushOption = cover.__brushOption;
+    var range = clone(brushOption.range);
+    return {
+      brushType: brushOption.brushType,
+      panelId: brushOption.panelId,
+      range: range
+    };
+  });
+  controller.trigger('brush', areas, {
+    isEnd: !!opt.isEnd,
+    removeOnClick: !!opt.removeOnClick
+  });
+}
+
+function shouldShowCover(controller) {
+  var track = controller._track;
+
+  if (!track.length) {
+    return false;
+  }
+
+  var p2 = track[track.length - 1];
+  var p1 = track[0];
+  var dx = p2[0] - p1[0];
+  var dy = p2[1] - p1[1];
+  var dist = mathPow$2(dx * dx + dy * dy, 0.5);
+  return dist > UNSELECT_THRESHOLD;
+}
+
+function getTrackEnds(track) {
+  var tail = track.length - 1;
+  tail < 0 && (tail = 0);
+  return [track[0], track[tail]];
+}
+
+function createBaseRectCover(doDrift, controller, brushOption, edgeNames) {
+  var cover = new Group();
+  cover.add(new Rect({
+    name: 'main',
+    style: makeStyle(brushOption),
+    silent: true,
+    draggable: true,
+    cursor: 'move',
+    drift: curry$2(doDrift, controller, cover, 'nswe'),
+    ondragend: curry$2(trigger$1, controller, {
+      isEnd: true
+    })
+  }));
+  each$13(edgeNames, function (name) {
+    cover.add(new Rect({
+      name: name,
+      style: {
+        opacity: 0
+      },
+      draggable: true,
+      silent: true,
+      invisible: true,
+      drift: curry$2(doDrift, controller, cover, name),
+      ondragend: curry$2(trigger$1, controller, {
+        isEnd: true
+      })
+    }));
+  });
+  return cover;
+}
+
+function updateBaseRect(controller, cover, localRange, brushOption) {
+  var lineWidth = brushOption.brushStyle.lineWidth || 0;
+  var handleSize = mathMax$6(lineWidth, MIN_RESIZE_LINE_WIDTH);
+  var x = localRange[0][0];
+  var y = localRange[1][0];
+  var xa = x - lineWidth / 2;
+  var ya = y - lineWidth / 2;
+  var x2 = localRange[0][1];
+  var y2 = localRange[1][1];
+  var x2a = x2 - handleSize + lineWidth / 2;
+  var y2a = y2 - handleSize + lineWidth / 2;
+  var width = x2 - x;
+  var height = y2 - y;
+  var widtha = width + lineWidth;
+  var heighta = height + lineWidth;
+  updateRectShape(controller, cover, 'main', x, y, width, height);
+
+  if (brushOption.transformable) {
+    updateRectShape(controller, cover, 'w', xa, ya, handleSize, heighta);
+    updateRectShape(controller, cover, 'e', x2a, ya, handleSize, heighta);
+    updateRectShape(controller, cover, 'n', xa, ya, widtha, handleSize);
+    updateRectShape(controller, cover, 's', xa, y2a, widtha, handleSize);
+    updateRectShape(controller, cover, 'nw', xa, ya, handleSize, handleSize);
+    updateRectShape(controller, cover, 'ne', x2a, ya, handleSize, handleSize);
+    updateRectShape(controller, cover, 'sw', xa, y2a, handleSize, handleSize);
+    updateRectShape(controller, cover, 'se', x2a, y2a, handleSize, handleSize);
+  }
+}
+
+function updateCommon(controller, cover) {
+  var brushOption = cover.__brushOption;
+  var transformable = brushOption.transformable;
+  var mainEl = cover.childAt(0);
+  mainEl.useStyle(makeStyle(brushOption));
+  mainEl.attr({
+    silent: !transformable,
+    cursor: transformable ? 'move' : 'default'
+  });
+  each$13(['w', 'e', 'n', 's', 'se', 'sw', 'ne', 'nw'], function (name) {
+    var el = cover.childOfName(name);
+    var globalDir = getGlobalDirection(controller, name);
+    el && el.attr({
+      silent: !transformable,
+      invisible: !transformable,
+      cursor: transformable ? CURSOR_MAP[globalDir] + '-resize' : null
+    });
+  });
+}
+
+function updateRectShape(controller, cover, name, x, y, w, h) {
+  var el = cover.childOfName(name);
+  el && el.setShape(pointsToRect(clipByPanel(controller, cover, [[x, y], [x + w, y + h]])));
+}
+
+function makeStyle(brushOption) {
+  return defaults({
+    strokeNoScale: true
+  }, brushOption.brushStyle);
+}
+
+function formatRectRange(x, y, x2, y2) {
+  var min = [mathMin$6(x, x2), mathMin$6(y, y2)];
+  var max = [mathMax$6(x, x2), mathMax$6(y, y2)];
+  return [[min[0], max[0]], // x range
+  [min[1], max[1]] // y range
+  ];
+}
+
+function getTransform$1(controller) {
+  return getTransform(controller.group);
+}
+
+function getGlobalDirection(controller, localDirection) {
+  if (localDirection.length > 1) {
+    localDirection = localDirection.split('');
+    var globalDir = [getGlobalDirection(controller, localDirection[0]), getGlobalDirection(controller, localDirection[1])];
+    (globalDir[0] === 'e' || globalDir[0] === 'w') && globalDir.reverse();
+    return globalDir.join('');
+  } else {
+    var map$$1 = {
+      w: 'left',
+      e: 'right',
+      n: 'top',
+      s: 'bottom'
+    };
+    var inverseMap = {
+      left: 'w',
+      right: 'e',
+      top: 'n',
+      bottom: 's'
+    };
+    var globalDir = transformDirection(map$$1[localDirection], getTransform$1(controller));
+    return inverseMap[globalDir];
+  }
+}
+
+function driftRect(toRectRange, fromRectRange, controller, cover, name, dx, dy, e) {
+  var brushOption = cover.__brushOption;
+  var rectRange = toRectRange(brushOption.range);
+  var localDelta = toLocalDelta(controller, dx, dy);
+  each$13(name.split(''), function (namePart) {
+    var ind = DIRECTION_MAP[namePart];
+    rectRange[ind[0]][ind[1]] += localDelta[ind[0]];
+  });
+  brushOption.range = fromRectRange(formatRectRange(rectRange[0][0], rectRange[1][0], rectRange[0][1], rectRange[1][1]));
+  updateCoverAfterCreation(controller, cover);
+  trigger$1(controller, {
+    isEnd: false
+  });
+}
+
+function driftPolygon(controller, cover, dx, dy, e) {
+  var range = cover.__brushOption.range;
+  var localDelta = toLocalDelta(controller, dx, dy);
+  each$13(range, function (point) {
+    point[0] += localDelta[0];
+    point[1] += localDelta[1];
+  });
+  updateCoverAfterCreation(controller, cover);
+  trigger$1(controller, {
+    isEnd: false
+  });
+}
+
+function toLocalDelta(controller, dx, dy) {
+  var thisGroup = controller.group;
+  var localD = thisGroup.transformCoordToLocal(dx, dy);
+  var localZero = thisGroup.transformCoordToLocal(0, 0);
+  return [localD[0] - localZero[0], localD[1] - localZero[1]];
+}
+
+function clipByPanel(controller, cover, data) {
+  var panel = getPanelByCover(controller, cover);
+  return panel && panel !== true ? panel.clipPath(data, controller._transform) : clone(data);
+}
+
+function pointsToRect(points) {
+  var xmin = mathMin$6(points[0][0], points[1][0]);
+  var ymin = mathMin$6(points[0][1], points[1][1]);
+  var xmax = mathMax$6(points[0][0], points[1][0]);
+  var ymax = mathMax$6(points[0][1], points[1][1]);
+  return {
+    x: xmin,
+    y: ymin,
+    width: xmax - xmin,
+    height: ymax - ymin
+  };
+}
+
+function resetCursor(controller, e, localCursorPoint) {
+  // Check active
+  if (!controller._brushType) {
+    return;
+  }
+
+  var zr = controller._zr;
+  var covers = controller._covers;
+  var currPanel = getPanelByPoint(controller, e, localCursorPoint); // Check whether in covers.
+
+  if (!controller._dragging) {
+    for (var i = 0; i < covers.length; i++) {
+      var brushOption = covers[i].__brushOption;
+
+      if (currPanel && (currPanel === true || brushOption.panelId === currPanel.panelId) && coverRenderers[brushOption.brushType].contain(covers[i], localCursorPoint[0], localCursorPoint[1])) {
+        // Use cursor style set on cover.
+        return;
+      }
+    }
+  }
+
+  currPanel && zr.setCursorStyle('crosshair');
+}
+
+function preventDefault(e) {
+  var rawE = e.event;
+  rawE.preventDefault && rawE.preventDefault();
+}
+
+function mainShapeContain(cover, x, y) {
+  return cover.childOfName('main').contain(x, y);
+}
+
+function updateCoverByMouse(controller, e, localCursorPoint, isEnd) {
+  var creatingCover = controller._creatingCover;
+  var panel = controller._creatingPanel;
+  var thisBrushOption = controller._brushOption;
+  var eventParams;
+
+  controller._track.push(localCursorPoint.slice());
+
+  if (shouldShowCover(controller) || creatingCover) {
+    if (panel && !creatingCover) {
+      thisBrushOption.brushMode === 'single' && clearCovers(controller);
+      var brushOption = clone(thisBrushOption);
+      brushOption.brushType = determineBrushType(brushOption.brushType, panel);
+      brushOption.panelId = panel === true ? null : panel.panelId;
+      creatingCover = controller._creatingCover = createCover(controller, brushOption);
+
+      controller._covers.push(creatingCover);
+    }
+
+    if (creatingCover) {
+      var coverRenderer = coverRenderers[determineBrushType(controller._brushType, panel)];
+      var coverBrushOption = creatingCover.__brushOption;
+      coverBrushOption.range = coverRenderer.getCreatingRange(clipByPanel(controller, creatingCover, controller._track));
+
+      if (isEnd) {
+        endCreating(controller, creatingCover);
+        coverRenderer.updateCommon(controller, creatingCover);
+      }
+
+      updateCoverShape(controller, creatingCover);
+      eventParams = {
+        isEnd: isEnd
+      };
+    }
+  } else if (isEnd && thisBrushOption.brushMode === 'single' && thisBrushOption.removeOnClick) {
+    // Help user to remove covers easily, only by a tiny drag, in 'single' mode.
+    // But a single click do not clear covers, because user may have casual
+    // clicks (for example, click on other component and do not expect covers
+    // disappear).
+    // Only some cover removed, trigger action, but not every click trigger action.
+    if (getPanelByPoint(controller, e, localCursorPoint) && clearCovers(controller)) {
+      eventParams = {
+        isEnd: isEnd,
+        removeOnClick: true
+      };
+    }
+  }
+
+  return eventParams;
+}
+
+function determineBrushType(brushType, panel) {
+  if (brushType === 'auto') {
+    return panel.defaultBrushType;
+  }
+
+  return brushType;
+}
+
+var mouseHandlers = {
+  mousedown: function (e) {
+    if (this._dragging) {
+      // In case some browser do not support globalOut,
+      // and release mose out side the browser.
+      handleDragEnd.call(this, e);
+    } else if (!e.target || !e.target.draggable) {
+      preventDefault(e);
+      var localCursorPoint = this.group.transformCoordToLocal(e.offsetX, e.offsetY);
+      this._creatingCover = null;
+      var panel = this._creatingPanel = getPanelByPoint(this, e, localCursorPoint);
+
+      if (panel) {
+        this._dragging = true;
+        this._track = [localCursorPoint.slice()];
+      }
+    }
+  },
+  mousemove: function (e) {
+    var localCursorPoint = this.group.transformCoordToLocal(e.offsetX, e.offsetY);
+    resetCursor(this, e, localCursorPoint);
+
+    if (this._dragging) {
+      preventDefault(e);
+      var eventParams = updateCoverByMouse(this, e, localCursorPoint, false);
+      eventParams && trigger$1(this, eventParams);
+    }
+  },
+  mouseup: handleDragEnd //,
+  // FIXME
+  // in tooltip, globalout should not be triggered.
+  // globalout: handleDragEnd
+
+};
+
+function handleDragEnd(e) {
+  if (this._dragging) {
+    preventDefault(e);
+    var localCursorPoint = this.group.transformCoordToLocal(e.offsetX, e.offsetY);
+    var eventParams = updateCoverByMouse(this, e, localCursorPoint, true);
+    this._dragging = false;
+    this._track = [];
+    this._creatingCover = null; // trigger event shoule be at final, after procedure will be nested.
+
+    eventParams && trigger$1(this, eventParams);
+  }
+}
+/**
+ * key: brushType
+ * @type {Object}
+ */
+
+
+var coverRenderers = {
+  lineX: getLineRenderer(0),
+  lineY: getLineRenderer(1),
+  rect: {
+    createCover: function (controller, brushOption) {
+      return createBaseRectCover(curry$2(driftRect, function (range) {
+        return range;
+      }, function (range) {
+        return range;
+      }), controller, brushOption, ['w', 'e', 'n', 's', 'se', 'sw', 'ne', 'nw']);
+    },
+    getCreatingRange: function (localTrack) {
+      var ends = getTrackEnds(localTrack);
+      return formatRectRange(ends[1][0], ends[1][1], ends[0][0], ends[0][1]);
+    },
+    updateCoverShape: function (controller, cover, localRange, brushOption) {
+      updateBaseRect(controller, cover, localRange, brushOption);
+    },
+    updateCommon: updateCommon,
+    contain: mainShapeContain
+  },
+  polygon: {
+    createCover: function (controller, brushOption) {
+      var cover = new Group(); // Do not use graphic.Polygon because graphic.Polyline do not close the
+      // border of the shape when drawing, which is a better experience for user.
+
+      cover.add(new Polyline({
+        name: 'main',
+        style: makeStyle(brushOption),
+        silent: true
+      }));
+      return cover;
+    },
+    getCreatingRange: function (localTrack) {
+      return localTrack;
+    },
+    endCreating: function (controller, cover) {
+      cover.remove(cover.childAt(0)); // Use graphic.Polygon close the shape.
+
+      cover.add(new Polygon({
+        name: 'main',
+        draggable: true,
+        drift: curry$2(driftPolygon, controller, cover),
+        ondragend: curry$2(trigger$1, controller, {
+          isEnd: true
+        })
+      }));
+    },
+    updateCoverShape: function (controller, cover, localRange, brushOption) {
+      cover.childAt(0).setShape({
+        points: clipByPanel(controller, cover, localRange)
+      });
+    },
+    updateCommon: updateCommon,
+    contain: mainShapeContain
+  }
+};
+
+function getLineRenderer(xyIndex) {
+  return {
+    createCover: function (controller, brushOption) {
+      return createBaseRectCover(curry$2(driftRect, function (range) {
+        var rectRange = [range, [0, 100]];
+        xyIndex && rectRange.reverse();
+        return rectRange;
+      }, function (rectRange) {
+        return rectRange[xyIndex];
+      }), controller, brushOption, [['w', 'e'], ['n', 's']][xyIndex]);
+    },
+    getCreatingRange: function (localTrack) {
+      var ends = getTrackEnds(localTrack);
+      var min = mathMin$6(ends[0][xyIndex], ends[1][xyIndex]);
+      var max = mathMax$6(ends[0][xyIndex], ends[1][xyIndex]);
+      return [min, max];
+    },
+    updateCoverShape: function (controller, cover, localRange, brushOption) {
+      var otherExtent; // If brushWidth not specified, fit the panel.
+
+      var panel = getPanelByCover(controller, cover);
+
+      if (panel !== true && panel.getLinearBrushOtherExtent) {
+        otherExtent = panel.getLinearBrushOtherExtent(xyIndex, controller._transform);
+      } else {
+        var zr = controller._zr;
+        otherExtent = [0, [zr.getWidth(), zr.getHeight()][1 - xyIndex]];
+      }
+
+      var rectRange = [localRange, otherExtent];
+      xyIndex && rectRange.reverse();
+      updateBaseRect(controller, cover, rectRange, brushOption);
+    },
+    updateCommon: updateCommon,
+    contain: mainShapeContain
+  };
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+function makeRectPanelClipPath(rect) {
+  rect = normalizeRect(rect);
+  return function (localPoints, transform) {
+    return clipPointsByRect(localPoints, rect);
+  };
+}
+function makeLinearBrushOtherExtent(rect, specifiedXYIndex) {
+  rect = normalizeRect(rect);
+  return function (xyIndex) {
+    var idx = specifiedXYIndex != null ? specifiedXYIndex : xyIndex;
+    var brushWidth = idx ? rect.width : rect.height;
+    var base = idx ? rect.x : rect.y;
+    return [base, base + (brushWidth || 0)];
+  };
+}
+function makeRectIsTargetByCursor(rect, api, targetModel) {
+  rect = normalizeRect(rect);
+  return function (e, localCursorPoint, transform) {
+    return rect.contain(localCursorPoint[0], localCursorPoint[1]) && !onIrrelevantElement(e, api, targetModel);
+  };
+} // Consider width/height is negative.
+
+function normalizeRect(rect) {
+  return BoundingRect.create(rect);
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var elementList = ['axisLine', 'axisTickLabel', 'axisName'];
+var AxisView$2 = extendComponentView({
+  type: 'parallelAxis',
+
+  /**
+   * @override
+   */
+  init: function (ecModel, api) {
+    AxisView$2.superApply(this, 'init', arguments);
+    /**
+     * @type {module:echarts/component/helper/BrushController}
+     */
+
+    (this._brushController = new BrushController(api.getZr())).on('brush', bind(this._onBrush, this));
+  },
+
+  /**
+   * @override
+   */
+  render: function (axisModel, ecModel, api, payload) {
+    if (fromAxisAreaSelect(axisModel, ecModel, payload)) {
+      return;
+    }
+
+    this.axisModel = axisModel;
+    this.api = api;
+    this.group.removeAll();
+    var oldAxisGroup = this._axisGroup;
+    this._axisGroup = new Group();
+    this.group.add(this._axisGroup);
+
+    if (!axisModel.get('show')) {
+      return;
+    }
+
+    var coordSysModel = getCoordSysModel(axisModel, ecModel);
+    var coordSys = coordSysModel.coordinateSystem;
+    var areaSelectStyle = axisModel.getAreaSelectStyle();
+    var areaWidth = areaSelectStyle.width;
+    var dim = axisModel.axis.dim;
+    var axisLayout = coordSys.getAxisLayout(dim);
+    var builderOpt = extend({
+      strokeContainThreshold: areaWidth
+    }, axisLayout);
+    var axisBuilder = new AxisBuilder(axisModel, builderOpt);
+    each$1(elementList, axisBuilder.add, axisBuilder);
+
+    this._axisGroup.add(axisBuilder.getGroup());
+
+    this._refreshBrushController(builderOpt, areaSelectStyle, axisModel, coordSysModel, areaWidth, api);
+
+    var animationModel = payload && payload.animation === false ? null : axisModel;
+    groupTransition(oldAxisGroup, this._axisGroup, animationModel);
+  },
+  // /**
+  //  * @override
+  //  */
+  // updateVisual: function (axisModel, ecModel, api, payload) {
+  //     this._brushController && this._brushController
+  //         .updateCovers(getCoverInfoList(axisModel));
+  // },
+  _refreshBrushController: function (builderOpt, areaSelectStyle, axisModel, coordSysModel, areaWidth, api) {
+    // After filtering, axis may change, select area needs to be update.
+    var extent = axisModel.axis.getExtent();
+    var extentLen = extent[1] - extent[0];
+    var extra = Math.min(30, Math.abs(extentLen) * 0.1); // Arbitrary value.
+    // width/height might be negative, which will be
+    // normalized in BoundingRect.
+
+    var rect = BoundingRect.create({
+      x: extent[0],
+      y: -areaWidth / 2,
+      width: extentLen,
+      height: areaWidth
+    });
+    rect.x -= extra;
+    rect.width += 2 * extra;
+
+    this._brushController.mount({
+      enableGlobalPan: true,
+      rotation: builderOpt.rotation,
+      position: builderOpt.position
+    }).setPanels([{
+      panelId: 'pl',
+      clipPath: makeRectPanelClipPath(rect),
+      isTargetByCursor: makeRectIsTargetByCursor(rect, api, coordSysModel),
+      getLinearBrushOtherExtent: makeLinearBrushOtherExtent(rect, 0)
+    }]).enableBrush({
+      brushType: 'lineX',
+      brushStyle: areaSelectStyle,
+      removeOnClick: true
+    }).updateCovers(getCoverInfoList(axisModel));
+  },
+  _onBrush: function (coverInfoList, opt) {
+    // Do not cache these object, because the mey be changed.
+    var axisModel = this.axisModel;
+    var axis = axisModel.axis;
+    var intervals = map(coverInfoList, function (coverInfo) {
+      return [axis.coordToData(coverInfo.range[0], true), axis.coordToData(coverInfo.range[1], true)];
+    }); // If realtime is true, action is not dispatched on drag end, because
+    // the drag end emits the same params with the last drag move event,
+    // and may have some delay when using touch pad.
+
+    if (!axisModel.option.realtime === opt.isEnd || opt.removeOnClick) {
+      // jshint ignore:line
+      this.api.dispatchAction({
+        type: 'axisAreaSelect',
+        parallelAxisId: axisModel.id,
+        intervals: intervals
+      });
+    }
+  },
+
+  /**
+   * @override
+   */
+  dispose: function () {
+    this._brushController.dispose();
+  }
+});
+
+function fromAxisAreaSelect(axisModel, ecModel, payload) {
+  return payload && payload.type === 'axisAreaSelect' && ecModel.findComponents({
+    mainType: 'parallelAxis',
+    query: payload
+  })[0] === axisModel;
+}
+
+function getCoverInfoList(axisModel) {
+  var axis = axisModel.axis;
+  return map(axisModel.activeIntervals, function (interval) {
+    return {
+      brushType: 'lineX',
+      panelId: 'pl',
+      range: [axis.dataToCoord(interval[0], true), axis.dataToCoord(interval[1], true)]
+    };
+  });
+}
+
+function getCoordSysModel(axisModel, ecModel) {
+  return ecModel.getComponent('parallel', axisModel.get('parallelIndex'));
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var CLICK_THRESHOLD = 5; // > 4
+// Parallel view
+
+extendComponentView({
+  type: 'parallel',
+  render: function (parallelModel, ecModel, api) {
+    this._model = parallelModel;
+    this._api = api;
+
+    if (!this._handlers) {
+      this._handlers = {};
+      each$1(handlers, function (handler, eventName) {
+        api.getZr().on(eventName, this._handlers[eventName] = bind(handler, this));
+      }, this);
+    }
+
+    createOrUpdate(this, '_throttledDispatchExpand', parallelModel.get('axisExpandRate'), 'fixRate');
+  },
+  dispose: function (ecModel, api) {
+    each$1(this._handlers, function (handler, eventName) {
+      api.getZr().off(eventName, handler);
+    });
+    this._handlers = null;
+  },
+
+  /**
+   * @param {Object} [opt] If null, cancle the last action triggering for debounce.
+   */
+  _throttledDispatchExpand: function (opt) {
+    this._dispatchExpand(opt);
+  },
+  _dispatchExpand: function (opt) {
+    opt && this._api.dispatchAction(extend({
+      type: 'parallelAxisExpand'
+    }, opt));
+  }
+});
+var handlers = {
+  mousedown: function (e) {
+    if (checkTrigger(this, 'click')) {
+      this._mouseDownPoint = [e.offsetX, e.offsetY];
+    }
+  },
+  mouseup: function (e) {
+    var mouseDownPoint = this._mouseDownPoint;
+
+    if (checkTrigger(this, 'click') && mouseDownPoint) {
+      var point = [e.offsetX, e.offsetY];
+      var dist = Math.pow(mouseDownPoint[0] - point[0], 2) + Math.pow(mouseDownPoint[1] - point[1], 2);
+
+      if (dist > CLICK_THRESHOLD) {
+        return;
+      }
+
+      var result = this._model.coordinateSystem.getSlidedAxisExpandWindow([e.offsetX, e.offsetY]);
+
+      result.behavior !== 'none' && this._dispatchExpand({
+        axisExpandWindow: result.axisExpandWindow
+      });
+    }
+
+    this._mouseDownPoint = null;
+  },
+  mousemove: function (e) {
+    // Should do nothing when brushing.
+    if (this._mouseDownPoint || !checkTrigger(this, 'mousemove')) {
+      return;
+    }
+
+    var model = this._model;
+    var result = model.coordinateSystem.getSlidedAxisExpandWindow([e.offsetX, e.offsetY]);
+    var behavior = result.behavior;
+    behavior === 'jump' && this._throttledDispatchExpand.debounceNextCall(model.get('axisExpandDebounce'));
+
+    this._throttledDispatchExpand(behavior === 'none' ? null // Cancle the last trigger, in case that mouse slide out of the area quickly.
+    : {
+      axisExpandWindow: result.axisExpandWindow,
+      // Jumping uses animation, and sliding suppresses animation.
+      animation: behavior === 'jump' ? null : false
+    });
+  }
+};
+
+function checkTrigger(view, triggerOn) {
+  var model = view._model;
+  return model.get('axisExpandable') && model.get('axisExpandTriggerOn') === triggerOn;
+}
+
+registerPreprocessor(parallelPreprocessor);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+SeriesModel.extend({
+  type: 'series.parallel',
+  dependencies: ['parallel'],
+  visualColorAccessPath: 'lineStyle.color',
+  getInitialData: function (option, ecModel) {
+    var source = this.getSource();
+    setEncodeAndDimensions(source, this);
+    return createListFromArray(source, this);
+  },
+
+  /**
+   * User can get data raw indices on 'axisAreaSelected' event received.
+   *
+   * @public
+   * @param {string} activeState 'active' or 'inactive' or 'normal'
+   * @return {Array.<number>} Raw indices
+   */
+  getRawIndicesByActiveState: function (activeState) {
+    var coordSys = this.coordinateSystem;
+    var data = this.getData();
+    var indices = [];
+    coordSys.eachActiveState(data, function (theActiveState, dataIndex) {
+      if (activeState === theActiveState) {
+        indices.push(data.getRawIndex(dataIndex));
+      }
+    });
+    return indices;
+  },
+  defaultOption: {
+    zlevel: 0,
+    // 涓�绾у眰鍙�
+    z: 2,
+    // 浜岀骇灞傚彔
+    coordinateSystem: 'parallel',
+    parallelIndex: 0,
+    label: {
+      show: false
+    },
+    inactiveOpacity: 0.05,
+    activeOpacity: 1,
+    lineStyle: {
+      width: 1,
+      opacity: 0.45,
+      type: 'solid'
+    },
+    emphasis: {
+      label: {
+        show: false
+      }
+    },
+    progressive: 500,
+    smooth: false,
+    // true | false | number
+    animationEasing: 'linear'
+  }
+});
+
+function setEncodeAndDimensions(source, seriesModel) {
+  // The mapping of parallelAxis dimension to data dimension can
+  // be specified in parallelAxis.option.dim. For example, if
+  // parallelAxis.option.dim is 'dim3', it mapping to the third
+  // dimension of data. But `data.encode` has higher priority.
+  // Moreover, parallelModel.dimension should not be regarded as data
+  // dimensions. Consider dimensions = ['dim4', 'dim2', 'dim6'];
+  if (source.encodeDefine) {
+    return;
+  }
+
+  var parallelModel = seriesModel.ecModel.getComponent('parallel', seriesModel.get('parallelIndex'));
+
+  if (!parallelModel) {
+    return;
+  }
+
+  var encodeDefine = source.encodeDefine = createHashMap();
+  each$1(parallelModel.dimensions, function (axisDim) {
+    var dataDimIndex = convertDimNameToNumber(axisDim);
+    encodeDefine.set(axisDim, dataDimIndex);
+  });
+}
+
+function convertDimNameToNumber(dimName) {
+  return +dimName.replace('dim', '');
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var DEFAULT_SMOOTH = 0.3;
+var ParallelView = Chart.extend({
+  type: 'parallel',
+  init: function () {
+    /**
+     * @type {module:zrender/container/Group}
+     * @private
+     */
+    this._dataGroup = new Group();
+    this.group.add(this._dataGroup);
+    /**
+     * @type {module:echarts/data/List}
+     */
+
+    this._data;
+    /**
+     * @type {boolean}
+     */
+
+    this._initialized;
+  },
+
+  /**
+   * @override
+   */
+  render: function (seriesModel, ecModel, api, payload) {
+    var dataGroup = this._dataGroup;
+    var data = seriesModel.getData();
+    var oldData = this._data;
+    var coordSys = seriesModel.coordinateSystem;
+    var dimensions = coordSys.dimensions;
+    var seriesScope = makeSeriesScope$2(seriesModel);
+    data.diff(oldData).add(add).update(update).remove(remove).execute();
+
+    function add(newDataIndex) {
+      var line = addEl(data, dataGroup, newDataIndex, dimensions, coordSys);
+      updateElCommon(line, data, newDataIndex, seriesScope);
+    }
+
+    function update(newDataIndex, oldDataIndex) {
+      var line = oldData.getItemGraphicEl(oldDataIndex);
+      var points = createLinePoints(data, newDataIndex, dimensions, coordSys);
+      data.setItemGraphicEl(newDataIndex, line);
+      var animationModel = payload && payload.animation === false ? null : seriesModel;
+      updateProps(line, {
+        shape: {
+          points: points
+        }
+      }, animationModel, newDataIndex);
+      updateElCommon(line, data, newDataIndex, seriesScope);
+    }
+
+    function remove(oldDataIndex) {
+      var line = oldData.getItemGraphicEl(oldDataIndex);
+      dataGroup.remove(line);
+    } // First create
+
+
+    if (!this._initialized) {
+      this._initialized = true;
+      var clipPath = createGridClipShape$1(coordSys, seriesModel, function () {
+        // Callback will be invoked immediately if there is no animation
+        setTimeout(function () {
+          dataGroup.removeClipPath();
+        });
+      });
+      dataGroup.setClipPath(clipPath);
+    }
+
+    this._data = data;
+  },
+  incrementalPrepareRender: function (seriesModel, ecModel, api) {
+    this._initialized = true;
+    this._data = null;
+
+    this._dataGroup.removeAll();
+  },
+  incrementalRender: function (taskParams, seriesModel, ecModel) {
+    var data = seriesModel.getData();
+    var coordSys = seriesModel.coordinateSystem;
+    var dimensions = coordSys.dimensions;
+    var seriesScope = makeSeriesScope$2(seriesModel);
+
+    for (var dataIndex = taskParams.start; dataIndex < taskParams.end; dataIndex++) {
+      var line = addEl(data, this._dataGroup, dataIndex, dimensions, coordSys);
+      line.incremental = true;
+      updateElCommon(line, data, dataIndex, seriesScope);
+    }
+  },
+  dispose: function () {},
+  // _renderForProgressive: function (seriesModel) {
+  //     var dataGroup = this._dataGroup;
+  //     var data = seriesModel.getData();
+  //     var oldData = this._data;
+  //     var coordSys = seriesModel.coordinateSystem;
+  //     var dimensions = coordSys.dimensions;
+  //     var option = seriesModel.option;
+  //     var progressive = option.progressive;
+  //     var smooth = option.smooth ? SMOOTH : null;
+  //     // In progressive animation is disabled, so use simple data diff,
+  //     // which effects performance less.
+  //     // (Typically performance for data with length 7000+ like:
+  //     // simpleDiff: 60ms, addEl: 184ms,
+  //     // in RMBP 2.4GHz intel i7, OSX 10.9 chrome 50.0.2661.102 (64-bit))
+  //     if (simpleDiff(oldData, data, dimensions)) {
+  //         dataGroup.removeAll();
+  //         data.each(function (dataIndex) {
+  //             addEl(data, dataGroup, dataIndex, dimensions, coordSys);
+  //         });
+  //     }
+  //     updateElCommon(data, progressive, smooth);
+  //     // Consider switch between progressive and not.
+  //     data.__plProgressive = true;
+  //     this._data = data;
+  // },
+
+  /**
+   * @override
+   */
+  remove: function () {
+    this._dataGroup && this._dataGroup.removeAll();
+    this._data = null;
+  }
+});
+
+function createGridClipShape$1(coordSys, seriesModel, cb) {
+  var parallelModel = coordSys.model;
+  var rect = coordSys.getRect();
+  var rectEl = new Rect({
+    shape: {
+      x: rect.x,
+      y: rect.y,
+      width: rect.width,
+      height: rect.height
+    }
+  });
+  var dim = parallelModel.get('layout') === 'horizontal' ? 'width' : 'height';
+  rectEl.setShape(dim, 0);
+  initProps(rectEl, {
+    shape: {
+      width: rect.width,
+      height: rect.height
+    }
+  }, seriesModel, cb);
+  return rectEl;
+}
+
+function createLinePoints(data, dataIndex, dimensions, coordSys) {
+  var points = [];
+
+  for (var i = 0; i < dimensions.length; i++) {
+    var dimName = dimensions[i];
+    var value = data.get(data.mapDimension(dimName), dataIndex);
+
+    if (!isEmptyValue(value, coordSys.getAxis(dimName).type)) {
+      points.push(coordSys.dataToPoint(value, dimName));
+    }
+  }
+
+  return points;
+}
+
+function addEl(data, dataGroup, dataIndex, dimensions, coordSys) {
+  var points = createLinePoints(data, dataIndex, dimensions, coordSys);
+  var line = new Polyline({
+    shape: {
+      points: points
+    },
+    silent: true,
+    z2: 10
+  });
+  dataGroup.add(line);
+  data.setItemGraphicEl(dataIndex, line);
+  return line;
+}
+
+function makeSeriesScope$2(seriesModel) {
+  var smooth = seriesModel.get('smooth', true);
+  smooth === true && (smooth = DEFAULT_SMOOTH);
+  return {
+    lineStyle: seriesModel.getModel('lineStyle').getLineStyle(),
+    smooth: smooth != null ? smooth : DEFAULT_SMOOTH
+  };
+}
+
+function updateElCommon(el, data, dataIndex, seriesScope) {
+  var lineStyle = seriesScope.lineStyle;
+
+  if (data.hasItemOption) {
+    var lineStyleModel = data.getItemModel(dataIndex).getModel('lineStyle');
+    lineStyle = lineStyleModel.getLineStyle();
+  }
+
+  el.useStyle(lineStyle);
+  var elStyle = el.style;
+  elStyle.fill = null; // lineStyle.color have been set to itemVisual in module:echarts/visual/seriesColor.
+
+  elStyle.stroke = data.getItemVisual(dataIndex, 'color'); // lineStyle.opacity have been set to itemVisual in parallelVisual.
+
+  elStyle.opacity = data.getItemVisual(dataIndex, 'opacity');
+  seriesScope.smooth && (el.shape.smooth = seriesScope.smooth);
+} // function simpleDiff(oldData, newData, dimensions) {
+//     var oldLen;
+//     if (!oldData
+//         || !oldData.__plProgressive
+//         || (oldLen = oldData.count()) !== newData.count()
+//     ) {
+//         return true;
+//     }
+//     var dimLen = dimensions.length;
+//     for (var i = 0; i < oldLen; i++) {
+//         for (var j = 0; j < dimLen; j++) {
+//             if (oldData.get(dimensions[j], i) !== newData.get(dimensions[j], i)) {
+//                 return true;
+//             }
+//         }
+//     }
+//     return false;
+// }
+// FIXME
+// 鍏敤鏂规硶?
+
+
+function isEmptyValue(val, axisType) {
+  return axisType === 'category' ? val == null : val == null || isNaN(val); // axisType === 'value'
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var opacityAccessPath = ['lineStyle', 'normal', 'opacity'];
+var parallelVisual = {
+  seriesType: 'parallel',
+  reset: function (seriesModel, ecModel, api) {
+    var itemStyleModel = seriesModel.getModel('itemStyle');
+    var lineStyleModel = seriesModel.getModel('lineStyle');
+    var globalColors = ecModel.get('color');
+    var color = lineStyleModel.get('color') || itemStyleModel.get('color') || globalColors[seriesModel.seriesIndex % globalColors.length];
+    var inactiveOpacity = seriesModel.get('inactiveOpacity');
+    var activeOpacity = seriesModel.get('activeOpacity');
+    var lineStyle = seriesModel.getModel('lineStyle').getLineStyle();
+    var coordSys = seriesModel.coordinateSystem;
+    var data = seriesModel.getData();
+    var opacityMap = {
+      normal: lineStyle.opacity,
+      active: activeOpacity,
+      inactive: inactiveOpacity
+    };
+    data.setVisual('color', color);
+
+    function progress(params, data) {
+      coordSys.eachActiveState(data, function (activeState, dataIndex) {
+        var opacity = opacityMap[activeState];
+
+        if (activeState === 'normal' && data.hasItemOption) {
+          var itemOpacity = data.getItemModel(dataIndex).get(opacityAccessPath, true);
+          itemOpacity != null && (opacity = itemOpacity);
+        }
+
+        data.setItemVisual(dataIndex, 'opacity', opacity);
+      }, params.start, params.end);
+    }
+
+    return {
+      progress: progress
+    };
+  }
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+registerVisual(parallelVisual);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var GaugeSeries = SeriesModel.extend({
+  type: 'series.gauge',
+  getInitialData: function (option, ecModel) {
+    var dataOpt = option.data || [];
+
+    if (!isArray(dataOpt)) {
+      dataOpt = [dataOpt];
+    }
+
+    option.data = dataOpt;
+    return createListSimply(this, ['value']);
+  },
+  defaultOption: {
+    zlevel: 0,
+    z: 2,
+    // 榛樿鍏ㄥ眬灞呬腑
+    center: ['50%', '50%'],
+    legendHoverLink: true,
+    radius: '75%',
+    startAngle: 225,
+    endAngle: -45,
+    clockwise: true,
+    // 鏈�灏忓��
+    min: 0,
+    // 鏈�澶у��
+    max: 100,
+    // 鍒嗗壊娈垫暟锛岄粯璁や负10
+    splitNumber: 10,
+    // 鍧愭爣杞寸嚎
+    axisLine: {
+      // 榛樿鏄剧ず锛屽睘鎬how鎺у埗鏄剧ず涓庡惁
+      show: true,
+      lineStyle: {
+        // 灞炴�ineStyle鎺у埗绾挎潯鏍峰紡
+        color: [[0.2, '#91c7ae'], [0.8, '#63869e'], [1, '#c23531']],
+        width: 30
+      }
+    },
+    // 鍒嗛殧绾�
+    splitLine: {
+      // 榛樿鏄剧ず锛屽睘鎬how鎺у埗鏄剧ず涓庡惁
+      show: true,
+      // 灞炴�ength鎺у埗绾块暱
+      length: 30,
+      // 灞炴�ineStyle锛堣瑙乴ineStyle锛夋帶鍒剁嚎鏉℃牱寮�
+      lineStyle: {
+        color: '#eee',
+        width: 2,
+        type: 'solid'
+      }
+    },
+    // 鍧愭爣杞村皬鏍囪
+    axisTick: {
+      // 灞炴�how鎺у埗鏄剧ず涓庡惁锛岄粯璁や笉鏄剧ず
+      show: true,
+      // 姣忎唤split缁嗗垎澶氬皯娈�
+      splitNumber: 5,
+      // 灞炴�ength鎺у埗绾块暱
+      length: 8,
+      // 灞炴�ineStyle鎺у埗绾挎潯鏍峰紡
+      lineStyle: {
+        color: '#eee',
+        width: 1,
+        type: 'solid'
+      }
+    },
+    axisLabel: {
+      show: true,
+      distance: 5,
+      // formatter: null,
+      color: 'auto'
+    },
+    pointer: {
+      show: true,
+      length: '80%',
+      width: 8
+    },
+    itemStyle: {
+      color: 'auto'
+    },
+    title: {
+      show: true,
+      // x, y锛屽崟浣峱x
+      offsetCenter: [0, '-40%'],
+      // 鍏朵綑灞炴�ч粯璁や娇鐢ㄥ叏灞�鏂囨湰鏍峰紡锛岃瑙乀EXTSTYLE
+      color: '#333',
+      fontSize: 15
+    },
+    detail: {
+      show: true,
+      backgroundColor: 'rgba(0,0,0,0)',
+      borderWidth: 0,
+      borderColor: '#ccc',
+      width: 100,
+      height: null,
+      // self-adaption
+      padding: [5, 10],
+      // x, y锛屽崟浣峱x
+      offsetCenter: [0, '40%'],
+      // formatter: null,
+      // 鍏朵綑灞炴�ч粯璁や娇鐢ㄥ叏灞�鏂囨湰鏍峰紡锛岃瑙乀EXTSTYLE
+      color: 'auto',
+      fontSize: 30
+    }
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var PointerPath = Path.extend({
+  type: 'echartsGaugePointer',
+  shape: {
+    angle: 0,
+    width: 10,
+    r: 10,
+    x: 0,
+    y: 0
+  },
+  buildPath: function (ctx, shape) {
+    var mathCos = Math.cos;
+    var mathSin = Math.sin;
+    var r = shape.r;
+    var width = shape.width;
+    var angle = shape.angle;
+    var x = shape.x - mathCos(angle) * width * (width >= r / 3 ? 1 : 2);
+    var y = shape.y - mathSin(angle) * width * (width >= r / 3 ? 1 : 2);
+    angle = shape.angle - Math.PI / 2;
+    ctx.moveTo(x, y);
+    ctx.lineTo(shape.x + mathCos(angle) * width, shape.y + mathSin(angle) * width);
+    ctx.lineTo(shape.x + mathCos(shape.angle) * r, shape.y + mathSin(shape.angle) * r);
+    ctx.lineTo(shape.x - mathCos(angle) * width, shape.y - mathSin(angle) * width);
+    ctx.lineTo(x, y);
+    return;
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+function parsePosition(seriesModel, api) {
+  var center = seriesModel.get('center');
+  var width = api.getWidth();
+  var height = api.getHeight();
+  var size = Math.min(width, height);
+  var cx = parsePercent$1(center[0], api.getWidth());
+  var cy = parsePercent$1(center[1], api.getHeight());
+  var r = parsePercent$1(seriesModel.get('radius'), size / 2);
+  return {
+    cx: cx,
+    cy: cy,
+    r: r
+  };
+}
+
+function formatLabel(label, labelFormatter) {
+  if (labelFormatter) {
+    if (typeof labelFormatter === 'string') {
+      label = labelFormatter.replace('{value}', label != null ? label : '');
+    } else if (typeof labelFormatter === 'function') {
+      label = labelFormatter(label);
+    }
+  }
+
+  return label;
+}
+
+var PI2$6 = Math.PI * 2;
+var GaugeView = Chart.extend({
+  type: 'gauge',
+  render: function (seriesModel, ecModel, api) {
+    this.group.removeAll();
+    var colorList = seriesModel.get('axisLine.lineStyle.color');
+    var posInfo = parsePosition(seriesModel, api);
+
+    this._renderMain(seriesModel, ecModel, api, colorList, posInfo);
+  },
+  dispose: function () {},
+  _renderMain: function (seriesModel, ecModel, api, colorList, posInfo) {
+    var group = this.group;
+    var axisLineModel = seriesModel.getModel('axisLine');
+    var lineStyleModel = axisLineModel.getModel('lineStyle');
+    var clockwise = seriesModel.get('clockwise');
+    var startAngle = -seriesModel.get('startAngle') / 180 * Math.PI;
+    var endAngle = -seriesModel.get('endAngle') / 180 * Math.PI;
+    var angleRangeSpan = (endAngle - startAngle) % PI2$6;
+    var prevEndAngle = startAngle;
+    var axisLineWidth = lineStyleModel.get('width');
+
+    for (var i = 0; i < colorList.length; i++) {
+      // Clamp
+      var percent = Math.min(Math.max(colorList[i][0], 0), 1);
+      var endAngle = startAngle + angleRangeSpan * percent;
+      var sector = new Sector({
+        shape: {
+          startAngle: prevEndAngle,
+          endAngle: endAngle,
+          cx: posInfo.cx,
+          cy: posInfo.cy,
+          clockwise: clockwise,
+          r0: posInfo.r - axisLineWidth,
+          r: posInfo.r
+        },
+        silent: true
+      });
+      sector.setStyle({
+        fill: colorList[i][1]
+      });
+      sector.setStyle(lineStyleModel.getLineStyle( // Because we use sector to simulate arc
+      // so the properties for stroking are useless
+      ['color', 'borderWidth', 'borderColor']));
+      group.add(sector);
+      prevEndAngle = endAngle;
+    }
+
+    var getColor = function (percent) {
+      // Less than 0
+      if (percent <= 0) {
+        return colorList[0][1];
+      }
+
+      for (var i = 0; i < colorList.length; i++) {
+        if (colorList[i][0] >= percent && (i === 0 ? 0 : colorList[i - 1][0]) < percent) {
+          return colorList[i][1];
+        }
+      } // More than 1
+
+
+      return colorList[i - 1][1];
+    };
+
+    if (!clockwise) {
+      var tmp = startAngle;
+      startAngle = endAngle;
+      endAngle = tmp;
+    }
+
+    this._renderTicks(seriesModel, ecModel, api, getColor, posInfo, startAngle, endAngle, clockwise);
+
+    this._renderPointer(seriesModel, ecModel, api, getColor, posInfo, startAngle, endAngle, clockwise);
+
+    this._renderTitle(seriesModel, ecModel, api, getColor, posInfo);
+
+    this._renderDetail(seriesModel, ecModel, api, getColor, posInfo);
+  },
+  _renderTicks: function (seriesModel, ecModel, api, getColor, posInfo, startAngle, endAngle, clockwise) {
+    var group = this.group;
+    var cx = posInfo.cx;
+    var cy = posInfo.cy;
+    var r = posInfo.r;
+    var minVal = +seriesModel.get('min');
+    var maxVal = +seriesModel.get('max');
+    var splitLineModel = seriesModel.getModel('splitLine');
+    var tickModel = seriesModel.getModel('axisTick');
+    var labelModel = seriesModel.getModel('axisLabel');
+    var splitNumber = seriesModel.get('splitNumber');
+    var subSplitNumber = tickModel.get('splitNumber');
+    var splitLineLen = parsePercent$1(splitLineModel.get('length'), r);
+    var tickLen = parsePercent$1(tickModel.get('length'), r);
+    var angle = startAngle;
+    var step = (endAngle - startAngle) / splitNumber;
+    var subStep = step / subSplitNumber;
+    var splitLineStyle = splitLineModel.getModel('lineStyle').getLineStyle();
+    var tickLineStyle = tickModel.getModel('lineStyle').getLineStyle();
+
+    for (var i = 0; i <= splitNumber; i++) {
+      var unitX = Math.cos(angle);
+      var unitY = Math.sin(angle); // Split line
+
+      if (splitLineModel.get('show')) {
+        var splitLine = new Line({
+          shape: {
+            x1: unitX * r + cx,
+            y1: unitY * r + cy,
+            x2: unitX * (r - splitLineLen) + cx,
+            y2: unitY * (r - splitLineLen) + cy
+          },
+          style: splitLineStyle,
+          silent: true
+        });
+
+        if (splitLineStyle.stroke === 'auto') {
+          splitLine.setStyle({
+            stroke: getColor(i / splitNumber)
+          });
+        }
+
+        group.add(splitLine);
+      } // Label
+
+
+      if (labelModel.get('show')) {
+        var label = formatLabel(round$1(i / splitNumber * (maxVal - minVal) + minVal), labelModel.get('formatter'));
+        var distance = labelModel.get('distance');
+        var autoColor = getColor(i / splitNumber);
+        group.add(new Text({
+          style: setTextStyle({}, labelModel, {
+            text: label,
+            x: unitX * (r - splitLineLen - distance) + cx,
+            y: unitY * (r - splitLineLen - distance) + cy,
+            textVerticalAlign: unitY < -0.4 ? 'top' : unitY > 0.4 ? 'bottom' : 'middle',
+            textAlign: unitX < -0.4 ? 'left' : unitX > 0.4 ? 'right' : 'center'
+          }, {
+            autoColor: autoColor
+          }),
+          silent: true
+        }));
+      } // Axis tick
+
+
+      if (tickModel.get('show') && i !== splitNumber) {
+        for (var j = 0; j <= subSplitNumber; j++) {
+          var unitX = Math.cos(angle);
+          var unitY = Math.sin(angle);
+          var tickLine = new Line({
+            shape: {
+              x1: unitX * r + cx,
+              y1: unitY * r + cy,
+              x2: unitX * (r - tickLen) + cx,
+              y2: unitY * (r - tickLen) + cy
+            },
+            silent: true,
+            style: tickLineStyle
+          });
+
+          if (tickLineStyle.stroke === 'auto') {
+            tickLine.setStyle({
+              stroke: getColor((i + j / subSplitNumber) / splitNumber)
+            });
+          }
+
+          group.add(tickLine);
+          angle += subStep;
+        }
+
+        angle -= subStep;
+      } else {
+        angle += step;
+      }
+    }
+  },
+  _renderPointer: function (seriesModel, ecModel, api, getColor, posInfo, startAngle, endAngle, clockwise) {
+    var group = this.group;
+    var oldData = this._data;
+
+    if (!seriesModel.get('pointer.show')) {
+      // Remove old element
+      oldData && oldData.eachItemGraphicEl(function (el) {
+        group.remove(el);
+      });
+      return;
+    }
+
+    var valueExtent = [+seriesModel.get('min'), +seriesModel.get('max')];
+    var angleExtent = [startAngle, endAngle];
+    var data = seriesModel.getData();
+    var valueDim = data.mapDimension('value');
+    data.diff(oldData).add(function (idx) {
+      var pointer = new PointerPath({
+        shape: {
+          angle: startAngle
+        }
+      });
+      initProps(pointer, {
+        shape: {
+          angle: linearMap(data.get(valueDim, idx), valueExtent, angleExtent, true)
+        }
+      }, seriesModel);
+      group.add(pointer);
+      data.setItemGraphicEl(idx, pointer);
+    }).update(function (newIdx, oldIdx) {
+      var pointer = oldData.getItemGraphicEl(oldIdx);
+      updateProps(pointer, {
+        shape: {
+          angle: linearMap(data.get(valueDim, newIdx), valueExtent, angleExtent, true)
+        }
+      }, seriesModel);
+      group.add(pointer);
+      data.setItemGraphicEl(newIdx, pointer);
+    }).remove(function (idx) {
+      var pointer = oldData.getItemGraphicEl(idx);
+      group.remove(pointer);
+    }).execute();
+    data.eachItemGraphicEl(function (pointer, idx) {
+      var itemModel = data.getItemModel(idx);
+      var pointerModel = itemModel.getModel('pointer');
+      pointer.setShape({
+        x: posInfo.cx,
+        y: posInfo.cy,
+        width: parsePercent$1(pointerModel.get('width'), posInfo.r),
+        r: parsePercent$1(pointerModel.get('length'), posInfo.r)
+      });
+      pointer.useStyle(itemModel.getModel('itemStyle').getItemStyle());
+
+      if (pointer.style.fill === 'auto') {
+        pointer.setStyle('fill', getColor(linearMap(data.get(valueDim, idx), valueExtent, [0, 1], true)));
+      }
+
+      setHoverStyle(pointer, itemModel.getModel('emphasis.itemStyle').getItemStyle());
+    });
+    this._data = data;
+  },
+  _renderTitle: function (seriesModel, ecModel, api, getColor, posInfo) {
+    var data = seriesModel.getData();
+    var valueDim = data.mapDimension('value');
+    var titleModel = seriesModel.getModel('title');
+
+    if (titleModel.get('show')) {
+      var offsetCenter = titleModel.get('offsetCenter');
+      var x = posInfo.cx + parsePercent$1(offsetCenter[0], posInfo.r);
+      var y = posInfo.cy + parsePercent$1(offsetCenter[1], posInfo.r);
+      var minVal = +seriesModel.get('min');
+      var maxVal = +seriesModel.get('max');
+      var value = seriesModel.getData().get(valueDim, 0);
+      var autoColor = getColor(linearMap(value, [minVal, maxVal], [0, 1], true));
+      this.group.add(new Text({
+        silent: true,
+        style: setTextStyle({}, titleModel, {
+          x: x,
+          y: y,
+          // FIXME First data name ?
+          text: data.getName(0),
+          textAlign: 'center',
+          textVerticalAlign: 'middle'
+        }, {
+          autoColor: autoColor,
+          forceRich: true
+        })
+      }));
+    }
+  },
+  _renderDetail: function (seriesModel, ecModel, api, getColor, posInfo) {
+    var detailModel = seriesModel.getModel('detail');
+    var minVal = +seriesModel.get('min');
+    var maxVal = +seriesModel.get('max');
+
+    if (detailModel.get('show')) {
+      var offsetCenter = detailModel.get('offsetCenter');
+      var x = posInfo.cx + parsePercent$1(offsetCenter[0], posInfo.r);
+      var y = posInfo.cy + parsePercent$1(offsetCenter[1], posInfo.r);
+      var width = parsePercent$1(detailModel.get('width'), posInfo.r);
+      var height = parsePercent$1(detailModel.get('height'), posInfo.r);
+      var data = seriesModel.getData();
+      var value = data.get(data.mapDimension('value'), 0);
+      var autoColor = getColor(linearMap(value, [minVal, maxVal], [0, 1], true));
+      this.group.add(new Text({
+        silent: true,
+        style: setTextStyle({}, detailModel, {
+          x: x,
+          y: y,
+          text: formatLabel( // FIXME First data name ?
+          value, detailModel.get('formatter')),
+          textWidth: isNaN(width) ? null : width,
+          textHeight: isNaN(height) ? null : height,
+          textAlign: 'center',
+          textVerticalAlign: 'middle'
+        }, {
+          autoColor: autoColor,
+          forceRich: true
+        })
+      }));
+    }
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var FunnelSeries = extendSeriesModel({
+  type: 'series.funnel',
+  init: function (option) {
+    FunnelSeries.superApply(this, 'init', arguments); // Enable legend selection for each data item
+    // Use a function instead of direct access because data reference may changed
+
+    this.legendDataProvider = function () {
+      return this.getRawData();
+    }; // Extend labelLine emphasis
+
+
+    this._defaultLabelLine(option);
+  },
+  getInitialData: function (option, ecModel) {
+    return createListSimply(this, ['value']);
+  },
+  _defaultLabelLine: function (option) {
+    // Extend labelLine emphasis
+    defaultEmphasis(option, 'labelLine', ['show']);
+    var labelLineNormalOpt = option.labelLine;
+    var labelLineEmphasisOpt = option.emphasis.labelLine; // Not show label line if `label.normal.show = false`
+
+    labelLineNormalOpt.show = labelLineNormalOpt.show && option.label.show;
+    labelLineEmphasisOpt.show = labelLineEmphasisOpt.show && option.emphasis.label.show;
+  },
+  // Overwrite
+  getDataParams: function (dataIndex) {
+    var data = this.getData();
+    var params = FunnelSeries.superCall(this, 'getDataParams', dataIndex);
+    var valueDim = data.mapDimension('value');
+    var sum = data.getSum(valueDim); // Percent is 0 if sum is 0
+
+    params.percent = !sum ? 0 : +(data.get(valueDim, dataIndex) / sum * 100).toFixed(2);
+    params.$vars.push('percent');
+    return params;
+  },
+  defaultOption: {
+    zlevel: 0,
+    // 涓�绾у眰鍙�
+    z: 2,
+    // 浜岀骇灞傚彔
+    legendHoverLink: true,
+    left: 80,
+    top: 60,
+    right: 80,
+    bottom: 60,
+    // width: {totalWidth} - left - right,
+    // height: {totalHeight} - top - bottom,
+    // 榛樿鍙栨暟鎹渶灏忔渶澶у��
+    // min: 0,
+    // max: 100,
+    minSize: '0%',
+    maxSize: '100%',
+    sort: 'descending',
+    // 'ascending', 'descending'
+    gap: 0,
+    funnelAlign: 'center',
+    label: {
+      show: true,
+      position: 'outer' // formatter: 鏍囩鏂囨湰鏍煎紡鍣紝鍚孴ooltip.formatter锛屼笉鏀寔寮傛鍥炶皟
+
+    },
+    labelLine: {
+      show: true,
+      length: 20,
+      lineStyle: {
+        // color: 鍚勫紓,
+        width: 1,
+        type: 'solid'
+      }
+    },
+    itemStyle: {
+      // color: 鍚勫紓,
+      borderColor: '#fff',
+      borderWidth: 1
+    },
+    emphasis: {
+      label: {
+        show: true
+      }
+    }
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+/**
+ * Piece of pie including Sector, Label, LabelLine
+ * @constructor
+ * @extends {module:zrender/graphic/Group}
+ */
+
+function FunnelPiece(data, idx) {
+  Group.call(this);
+  var polygon = new Polygon();
+  var labelLine = new Polyline();
+  var text = new Text();
+  this.add(polygon);
+  this.add(labelLine);
+  this.add(text);
+  this.updateData(data, idx, true); // Hover to change label and labelLine
+
+  function onEmphasis() {
+    labelLine.ignore = labelLine.hoverIgnore;
+    text.ignore = text.hoverIgnore;
+  }
+
+  function onNormal() {
+    labelLine.ignore = labelLine.normalIgnore;
+    text.ignore = text.normalIgnore;
+  }
+
+  this.on('emphasis', onEmphasis).on('normal', onNormal).on('mouseover', onEmphasis).on('mouseout', onNormal);
+}
+
+var funnelPieceProto = FunnelPiece.prototype;
+var opacityAccessPath$1 = ['itemStyle', 'opacity'];
+
+funnelPieceProto.updateData = function (data, idx, firstCreate) {
+  var polygon = this.childAt(0);
+  var seriesModel = data.hostModel;
+  var itemModel = data.getItemModel(idx);
+  var layout = data.getItemLayout(idx);
+  var opacity = data.getItemModel(idx).get(opacityAccessPath$1);
+  opacity = opacity == null ? 1 : opacity; // Reset style
+
+  polygon.useStyle({});
+
+  if (firstCreate) {
+    polygon.setShape({
+      points: layout.points
+    });
+    polygon.setStyle({
+      opacity: 0
+    });
+    initProps(polygon, {
+      style: {
+        opacity: opacity
+      }
+    }, seriesModel, idx);
+  } else {
+    updateProps(polygon, {
+      style: {
+        opacity: opacity
+      },
+      shape: {
+        points: layout.points
+      }
+    }, seriesModel, idx);
+  } // Update common style
+
+
+  var itemStyleModel = itemModel.getModel('itemStyle');
+  var visualColor = data.getItemVisual(idx, 'color');
+  polygon.setStyle(defaults({
+    lineJoin: 'round',
+    fill: visualColor
+  }, itemStyleModel.getItemStyle(['opacity'])));
+  polygon.hoverStyle = itemStyleModel.getModel('emphasis').getItemStyle();
+
+  this._updateLabel(data, idx);
+
+  setHoverStyle(this);
+};
+
+funnelPieceProto._updateLabel = function (data, idx) {
+  var labelLine = this.childAt(1);
+  var labelText = this.childAt(2);
+  var seriesModel = data.hostModel;
+  var itemModel = data.getItemModel(idx);
+  var layout = data.getItemLayout(idx);
+  var labelLayout = layout.label;
+  var visualColor = data.getItemVisual(idx, 'color');
+  updateProps(labelLine, {
+    shape: {
+      points: labelLayout.linePoints || labelLayout.linePoints
+    }
+  }, seriesModel, idx);
+  updateProps(labelText, {
+    style: {
+      x: labelLayout.x,
+      y: labelLayout.y
+    }
+  }, seriesModel, idx);
+  labelText.attr({
+    rotation: labelLayout.rotation,
+    origin: [labelLayout.x, labelLayout.y],
+    z2: 10
+  });
+  var labelModel = itemModel.getModel('label');
+  var labelHoverModel = itemModel.getModel('emphasis.label');
+  var labelLineModel = itemModel.getModel('labelLine');
+  var labelLineHoverModel = itemModel.getModel('emphasis.labelLine');
+  var visualColor = data.getItemVisual(idx, 'color');
+  setLabelStyle(labelText.style, labelText.hoverStyle = {}, labelModel, labelHoverModel, {
+    labelFetcher: data.hostModel,
+    labelDataIndex: idx,
+    defaultText: data.getName(idx),
+    autoColor: visualColor,
+    useInsideStyle: !!labelLayout.inside
+  }, {
+    textAlign: labelLayout.textAlign,
+    textVerticalAlign: labelLayout.verticalAlign
+  });
+  labelText.ignore = labelText.normalIgnore = !labelModel.get('show');
+  labelText.hoverIgnore = !labelHoverModel.get('show');
+  labelLine.ignore = labelLine.normalIgnore = !labelLineModel.get('show');
+  labelLine.hoverIgnore = !labelLineHoverModel.get('show'); // Default use item visual color
+
+  labelLine.setStyle({
+    stroke: visualColor
+  });
+  labelLine.setStyle(labelLineModel.getModel('lineStyle').getLineStyle());
+  labelLine.hoverStyle = labelLineHoverModel.getModel('lineStyle').getLineStyle();
+};
+
+inherits(FunnelPiece, Group);
+var FunnelView = Chart.extend({
+  type: 'funnel',
+  render: function (seriesModel, ecModel, api) {
+    var data = seriesModel.getData();
+    var oldData = this._data;
+    var group = this.group;
+    data.diff(oldData).add(function (idx) {
+      var funnelPiece = new FunnelPiece(data, idx);
+      data.setItemGraphicEl(idx, funnelPiece);
+      group.add(funnelPiece);
+    }).update(function (newIdx, oldIdx) {
+      var piePiece = oldData.getItemGraphicEl(oldIdx);
+      piePiece.updateData(data, newIdx);
+      group.add(piePiece);
+      data.setItemGraphicEl(newIdx, piePiece);
+    }).remove(function (idx) {
+      var piePiece = oldData.getItemGraphicEl(idx);
+      group.remove(piePiece);
+    }).execute();
+    this._data = data;
+  },
+  remove: function () {
+    this.group.removeAll();
+    this._data = null;
+  },
+  dispose: function () {}
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+function getViewRect$2(seriesModel, api) {
+  return getLayoutRect(seriesModel.getBoxLayoutParams(), {
+    width: api.getWidth(),
+    height: api.getHeight()
+  });
+}
+
+function getSortedIndices(data, sort) {
+  var valueDim = data.mapDimension('value');
+  var valueArr = data.mapArray(valueDim, function (val) {
+    return val;
+  });
+  var indices = [];
+  var isAscending = sort === 'ascending';
+
+  for (var i = 0, len = data.count(); i < len; i++) {
+    indices[i] = i;
+  } // Add custom sortable function & none sortable opetion by "options.sort"
+
+
+  if (typeof sort === 'function') {
+    indices.sort(sort);
+  } else if (sort !== 'none') {
+    indices.sort(function (a, b) {
+      return isAscending ? valueArr[a] - valueArr[b] : valueArr[b] - valueArr[a];
+    });
+  }
+
+  return indices;
+}
+
+function labelLayout$1(data) {
+  data.each(function (idx) {
+    var itemModel = data.getItemModel(idx);
+    var labelModel = itemModel.getModel('label');
+    var labelPosition = labelModel.get('position');
+    var labelLineModel = itemModel.getModel('labelLine');
+    var layout = data.getItemLayout(idx);
+    var points = layout.points;
+    var isLabelInside = labelPosition === 'inner' || labelPosition === 'inside' || labelPosition === 'center';
+    var textAlign;
+    var textX;
+    var textY;
+    var linePoints;
+
+    if (isLabelInside) {
+      textX = (points[0][0] + points[1][0] + points[2][0] + points[3][0]) / 4;
+      textY = (points[0][1] + points[1][1] + points[2][1] + points[3][1]) / 4;
+      textAlign = 'center';
+      linePoints = [[textX, textY], [textX, textY]];
+    } else {
+      var x1;
+      var y1;
+      var x2;
+      var labelLineLen = labelLineModel.get('length');
+
+      if (labelPosition === 'left') {
+        // Left side
+        x1 = (points[3][0] + points[0][0]) / 2;
+        y1 = (points[3][1] + points[0][1]) / 2;
+        x2 = x1 - labelLineLen;
+        textX = x2 - 5;
+        textAlign = 'right';
+      } else {
+        // Right side
+        x1 = (points[1][0] + points[2][0]) / 2;
+        y1 = (points[1][1] + points[2][1]) / 2;
+        x2 = x1 + labelLineLen;
+        textX = x2 + 5;
+        textAlign = 'left';
+      }
+
+      var y2 = y1;
+      linePoints = [[x1, y1], [x2, y2]];
+      textY = y2;
+    }
+
+    layout.label = {
+      linePoints: linePoints,
+      x: textX,
+      y: textY,
+      verticalAlign: 'middle',
+      textAlign: textAlign,
+      inside: isLabelInside
+    };
+  });
+}
+
+var funnelLayout = function (ecModel, api, payload) {
+  ecModel.eachSeriesByType('funnel', function (seriesModel) {
+    var data = seriesModel.getData();
+    var valueDim = data.mapDimension('value');
+    var sort = seriesModel.get('sort');
+    var viewRect = getViewRect$2(seriesModel, api);
+    var indices = getSortedIndices(data, sort);
+    var sizeExtent = [parsePercent$1(seriesModel.get('minSize'), viewRect.width), parsePercent$1(seriesModel.get('maxSize'), viewRect.width)];
+    var dataExtent = data.getDataExtent(valueDim);
+    var min = seriesModel.get('min');
+    var max = seriesModel.get('max');
+
+    if (min == null) {
+      min = Math.min(dataExtent[0], 0);
+    }
+
+    if (max == null) {
+      max = dataExtent[1];
+    }
+
+    var funnelAlign = seriesModel.get('funnelAlign');
+    var gap = seriesModel.get('gap');
+    var itemHeight = (viewRect.height - gap * (data.count() - 1)) / data.count();
+    var y = viewRect.y;
+
+    var getLinePoints = function (idx, offY) {
+      // End point index is data.count() and we assign it 0
+      var val = data.get(valueDim, idx) || 0;
+      var itemWidth = linearMap(val, [min, max], sizeExtent, true);
+      var x0;
+
+      switch (funnelAlign) {
+        case 'left':
+          x0 = viewRect.x;
+          break;
+
+        case 'center':
+          x0 = viewRect.x + (viewRect.width - itemWidth) / 2;
+          break;
+
+        case 'right':
+          x0 = viewRect.x + viewRect.width - itemWidth;
+          break;
+      }
+
+      return [[x0, offY], [x0 + itemWidth, offY]];
+    };
+
+    if (sort === 'ascending') {
+      // From bottom to top
+      itemHeight = -itemHeight;
+      gap = -gap;
+      y += viewRect.height;
+      indices = indices.reverse();
+    }
+
+    for (var i = 0; i < indices.length; i++) {
+      var idx = indices[i];
+      var nextIdx = indices[i + 1];
+      var itemModel = data.getItemModel(idx);
+      var height = itemModel.get('itemStyle.height');
+
+      if (height == null) {
+        height = itemHeight;
+      } else {
+        height = parsePercent$1(height, viewRect.height);
+
+        if (sort === 'ascending') {
+          height = -height;
+        }
+      }
+
+      var start = getLinePoints(idx, y);
+      var end = getLinePoints(nextIdx, y + height);
+      y += height + gap;
+      data.setItemLayout(idx, {
+        points: start.concat(end.slice().reverse())
+      });
+    }
+
+    labelLayout$1(data);
+  });
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+registerVisual(dataColor('funnel'));
+registerLayout(funnelLayout);
+registerProcessor(dataFilter('funnel'));
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * @file Get initial data and define sankey view's series model
+ * @author Deqing Li(annong035@gmail.com)
+ */
+var SankeySeries = SeriesModel.extend({
+  type: 'series.sankey',
+  layoutInfo: null,
+
+  /**
+   * Init a graph data structure from data in option series
+   *
+   * @param  {Object} option  the object used to config echarts view
+   * @return {module:echarts/data/List} storage initial data
+   */
+  getInitialData: function (option) {
+    var links = option.edges || option.links;
+    var nodes = option.data || option.nodes;
+
+    if (nodes && links) {
+      var graph = createGraphFromNodeEdge(nodes, links, this, true);
+      return graph.data;
+    }
+  },
+  setNodePosition: function (dataIndex, localPosition) {
+    var dataItem = this.option.data[dataIndex];
+    dataItem.localX = localPosition[0];
+    dataItem.localY = localPosition[1];
+  },
+
+  /**
+   * Return the graphic data structure
+   *
+   * @return {module:echarts/data/Graph} graphic data structure
+   */
+  getGraph: function () {
+    return this.getData().graph;
+  },
+
+  /**
+   * Get edge data of graphic data structure
+   *
+   * @return {module:echarts/data/List} data structure of list
+   */
+  getEdgeData: function () {
+    return this.getGraph().edgeData;
+  },
+
+  /**
+   * @override
+   */
+  formatTooltip: function (dataIndex, multipleSeries, dataType) {
+    // dataType === 'node' or empty do not show tooltip by default
+    if (dataType === 'edge') {
+      var params = this.getDataParams(dataIndex, dataType);
+      var rawDataOpt = params.data;
+      var html = rawDataOpt.source + ' -- ' + rawDataOpt.target;
+
+      if (params.value) {
+        html += ' : ' + params.value;
+      }
+
+      return encodeHTML(html);
+    }
+
+    return SankeySeries.superCall(this, 'formatTooltip', dataIndex, multipleSeries);
+  },
+  optionUpdated: function () {
+    var option = this.option;
+
+    if (option.focusNodeAdjacency === true) {
+      option.focusNodeAdjacency = 'allEdges';
+    }
+  },
+  defaultOption: {
+    zlevel: 0,
+    z: 2,
+    coordinateSystem: 'view',
+    layout: null,
+    // The position of the whole view
+    left: '5%',
+    top: '5%',
+    right: '20%',
+    bottom: '5%',
+    // Value can be 'vertical'
+    orient: 'horizontal',
+    // The dx of the node
+    nodeWidth: 20,
+    // The vertical distance between two nodes
+    nodeGap: 8,
+    // Control if the node can move or not
+    draggable: true,
+    // Value can be 'inEdges', 'outEdges', 'allEdges', true (the same as 'allEdges').
+    focusNodeAdjacency: false,
+    // The number of iterations to change the position of the node
+    layoutIterations: 32,
+    label: {
+      show: true,
+      position: 'right',
+      color: '#000',
+      fontSize: 12
+    },
+    itemStyle: {
+      borderWidth: 1,
+      borderColor: '#333'
+    },
+    lineStyle: {
+      color: '#314656',
+      opacity: 0.2,
+      curveness: 0.5
+    },
+    emphasis: {
+      label: {
+        show: true
+      },
+      lineStyle: {
+        opacity: 0.6
+      }
+    },
+    animationEasing: 'linear',
+    animationDuration: 1000
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * @file  The file used to draw sankey view
+ * @author  Deqing Li(annong035@gmail.com)
+ */
+var nodeOpacityPath$1 = ['itemStyle', 'opacity'];
+var lineOpacityPath$1 = ['lineStyle', 'opacity'];
+
+function getItemOpacity$1(item, opacityPath) {
+  return item.getVisual('opacity') || item.getModel().get(opacityPath);
+}
+
+function fadeOutItem$1(item, opacityPath, opacityRatio) {
+  var el = item.getGraphicEl();
+  var opacity = getItemOpacity$1(item, opacityPath);
+
+  if (opacityRatio != null) {
+    opacity == null && (opacity = 1);
+    opacity *= opacityRatio;
+  }
+
+  el.downplay && el.downplay();
+  el.traverse(function (child) {
+    if (child.type !== 'group') {
+      child.setStyle('opacity', opacity);
+    }
+  });
+}
+
+function fadeInItem$1(item, opacityPath) {
+  var opacity = getItemOpacity$1(item, opacityPath);
+  var el = item.getGraphicEl();
+  el.highlight && el.highlight();
+  el.traverse(function (child) {
+    if (child.type !== 'group') {
+      child.setStyle('opacity', opacity);
+    }
+  });
+}
+
+var SankeyShape = extendShape({
+  shape: {
+    x1: 0,
+    y1: 0,
+    x2: 0,
+    y2: 0,
+    cpx1: 0,
+    cpy1: 0,
+    cpx2: 0,
+    cpy2: 0,
+    extent: 0,
+    orient: ''
+  },
+  buildPath: function (ctx, shape) {
+    var extent = shape.extent;
+    var orient = shape.orient;
+
+    if (orient === 'vertical') {
+      ctx.moveTo(shape.x1, shape.y1);
+      ctx.bezierCurveTo(shape.cpx1, shape.cpy1, shape.cpx2, shape.cpy2, shape.x2, shape.y2);
+      ctx.lineTo(shape.x2 + extent, shape.y2);
+      ctx.bezierCurveTo(shape.cpx2 + extent, shape.cpy2, shape.cpx1 + extent, shape.cpy1, shape.x1 + extent, shape.y1);
+    } else {
+      ctx.moveTo(shape.x1, shape.y1);
+      ctx.bezierCurveTo(shape.cpx1, shape.cpy1, shape.cpx2, shape.cpy2, shape.x2, shape.y2);
+      ctx.lineTo(shape.x2, shape.y2 + extent);
+      ctx.bezierCurveTo(shape.cpx2, shape.cpy2 + extent, shape.cpx1, shape.cpy1 + extent, shape.x1, shape.y1 + extent);
+    }
+
+    ctx.closePath();
+  }
+});
+extendChartView({
+  type: 'sankey',
+
+  /**
+   * @private
+   * @type {module:echarts/chart/sankey/SankeySeries}
+   */
+  _model: null,
+
+  /**
+   * @private
+   * @type {boolean}
+   */
+  _focusAdjacencyDisabled: false,
+  render: function (seriesModel, ecModel, api) {
+    var sankeyView = this;
+    var graph = seriesModel.getGraph();
+    var group = this.group;
+    var layoutInfo = seriesModel.layoutInfo; // view width
+
+    var width = layoutInfo.width; // view height
+
+    var height = layoutInfo.height;
+    var nodeData = seriesModel.getData();
+    var edgeData = seriesModel.getData('edge');
+    var orient = seriesModel.get('orient');
+    this._model = seriesModel;
+    group.removeAll();
+    group.attr('position', [layoutInfo.x, layoutInfo.y]); // generate a bezire Curve for each edge
+
+    graph.eachEdge(function (edge) {
+      var curve = new SankeyShape();
+      curve.dataIndex = edge.dataIndex;
+      curve.seriesIndex = seriesModel.seriesIndex;
+      curve.dataType = 'edge';
+      var lineStyleModel = edge.getModel('lineStyle');
+      var curvature = lineStyleModel.get('curveness');
+      var n1Layout = edge.node1.getLayout();
+      var node1Model = edge.node1.getModel();
+      var dragX1 = node1Model.get('localX');
+      var dragY1 = node1Model.get('localY');
+      var n2Layout = edge.node2.getLayout();
+      var node2Model = edge.node2.getModel();
+      var dragX2 = node2Model.get('localX');
+      var dragY2 = node2Model.get('localY');
+      var edgeLayout = edge.getLayout();
+      var x1;
+      var y1;
+      var x2;
+      var y2;
+      var cpx1;
+      var cpy1;
+      var cpx2;
+      var cpy2;
+      curve.shape.extent = Math.max(1, edgeLayout.dy);
+      curve.shape.orient = orient;
+
+      if (orient === 'vertical') {
+        x1 = (dragX1 != null ? dragX1 * width : n1Layout.x) + edgeLayout.sy;
+        y1 = (dragY1 != null ? dragY1 * height : n1Layout.y) + n1Layout.dy;
+        x2 = (dragX2 != null ? dragX2 * width : n2Layout.x) + edgeLayout.ty;
+        y2 = dragY2 != null ? dragY2 * height : n2Layout.y;
+        cpx1 = x1;
+        cpy1 = y1 * (1 - curvature) + y2 * curvature;
+        cpx2 = x2;
+        cpy2 = y1 * curvature + y2 * (1 - curvature);
+      } else {
+        x1 = (dragX1 != null ? dragX1 * width : n1Layout.x) + n1Layout.dx;
+        y1 = (dragY1 != null ? dragY1 * height : n1Layout.y) + edgeLayout.sy;
+        x2 = dragX2 != null ? dragX2 * width : n2Layout.x;
+        y2 = (dragY2 != null ? dragY2 * height : n2Layout.y) + edgeLayout.ty;
+        cpx1 = x1 * (1 - curvature) + x2 * curvature;
+        cpy1 = y1;
+        cpx2 = x1 * curvature + x2 * (1 - curvature);
+        cpy2 = y2;
+      }
+
+      curve.setShape({
+        x1: x1,
+        y1: y1,
+        x2: x2,
+        y2: y2,
+        cpx1: cpx1,
+        cpy1: cpy1,
+        cpx2: cpx2,
+        cpy2: cpy2
+      });
+      curve.setStyle(lineStyleModel.getItemStyle()); // Special color, use source node color or target node color
+
+      switch (curve.style.fill) {
+        case 'source':
+          curve.style.fill = edge.node1.getVisual('color');
+          break;
+
+        case 'target':
+          curve.style.fill = edge.node2.getVisual('color');
+          break;
+      }
+
+      setHoverStyle(curve, edge.getModel('emphasis.lineStyle').getItemStyle());
+      group.add(curve);
+      edgeData.setItemGraphicEl(edge.dataIndex, curve);
+    }); // Generate a rect for each node
+
+    graph.eachNode(function (node) {
+      var layout = node.getLayout();
+      var itemModel = node.getModel();
+      var dragX = itemModel.get('localX');
+      var dragY = itemModel.get('localY');
+      var labelModel = itemModel.getModel('label');
+      var labelHoverModel = itemModel.getModel('emphasis.label');
+      var rect = new Rect({
+        shape: {
+          x: dragX != null ? dragX * width : layout.x,
+          y: dragY != null ? dragY * height : layout.y,
+          width: layout.dx,
+          height: layout.dy
+        },
+        style: itemModel.getModel('itemStyle').getItemStyle()
+      });
+      var hoverStyle = node.getModel('emphasis.itemStyle').getItemStyle();
+      setLabelStyle(rect.style, hoverStyle, labelModel, labelHoverModel, {
+        labelFetcher: seriesModel,
+        labelDataIndex: node.dataIndex,
+        defaultText: node.id,
+        isRectText: true
+      });
+      rect.setStyle('fill', node.getVisual('color'));
+      setHoverStyle(rect, hoverStyle);
+      group.add(rect);
+      nodeData.setItemGraphicEl(node.dataIndex, rect);
+      rect.dataType = 'node';
+    });
+    nodeData.eachItemGraphicEl(function (el, dataIndex) {
+      var itemModel = nodeData.getItemModel(dataIndex);
+
+      if (itemModel.get('draggable')) {
+        el.drift = function (dx, dy) {
+          sankeyView._focusAdjacencyDisabled = true;
+          this.shape.x += dx;
+          this.shape.y += dy;
+          this.dirty();
+          api.dispatchAction({
+            type: 'dragNode',
+            seriesId: seriesModel.id,
+            dataIndex: nodeData.getRawIndex(dataIndex),
+            localX: this.shape.x / width,
+            localY: this.shape.y / height
+          });
+        };
+
+        el.ondragend = function () {
+          sankeyView._focusAdjacencyDisabled = false;
+        };
+
+        el.draggable = true;
+        el.cursor = 'move';
+      }
+
+      if (itemModel.get('focusNodeAdjacency')) {
+        el.off('mouseover').on('mouseover', function () {
+          if (!sankeyView._focusAdjacencyDisabled) {
+            api.dispatchAction({
+              type: 'focusNodeAdjacency',
+              seriesId: seriesModel.id,
+              dataIndex: el.dataIndex
+            });
+          }
+        });
+        el.off('mouseout').on('mouseout', function () {
+          if (!sankeyView._focusAdjacencyDisabled) {
+            api.dispatchAction({
+              type: 'unfocusNodeAdjacency',
+              seriesId: seriesModel.id
+            });
+          }
+        });
+      }
+    });
+    edgeData.eachItemGraphicEl(function (el, dataIndex) {
+      var edgeModel = edgeData.getItemModel(dataIndex);
+
+      if (edgeModel.get('focusNodeAdjacency')) {
+        el.off('mouseover').on('mouseover', function () {
+          if (!sankeyView._focusAdjacencyDisabled) {
+            api.dispatchAction({
+              type: 'focusNodeAdjacency',
+              seriesId: seriesModel.id,
+              edgeDataIndex: el.dataIndex
+            });
+          }
+        });
+        el.off('mouseout').on('mouseout', function () {
+          if (!sankeyView._focusAdjacencyDisabled) {
+            api.dispatchAction({
+              type: 'unfocusNodeAdjacency',
+              seriesId: seriesModel.id
+            });
+          }
+        });
+      }
+    });
+
+    if (!this._data && seriesModel.get('animation')) {
+      group.setClipPath(createGridClipShape$2(group.getBoundingRect(), seriesModel, function () {
+        group.removeClipPath();
+      }));
+    }
+
+    this._data = seriesModel.getData();
+  },
+  dispose: function () {},
+  focusNodeAdjacency: function (seriesModel, ecModel, api, payload) {
+    var data = this._model.getData();
+
+    var graph = data.graph;
+    var dataIndex = payload.dataIndex;
+    var itemModel = data.getItemModel(dataIndex);
+    var edgeDataIndex = payload.edgeDataIndex;
+
+    if (dataIndex == null && edgeDataIndex == null) {
+      return;
+    }
+
+    var node = graph.getNodeByIndex(dataIndex);
+    var edge = graph.getEdgeByIndex(edgeDataIndex);
+    graph.eachNode(function (node) {
+      fadeOutItem$1(node, nodeOpacityPath$1, 0.1);
+    });
+    graph.eachEdge(function (edge) {
+      fadeOutItem$1(edge, lineOpacityPath$1, 0.1);
+    });
+
+    if (node) {
+      fadeInItem$1(node, nodeOpacityPath$1);
+      var focusNodeAdj = itemModel.get('focusNodeAdjacency');
+
+      if (focusNodeAdj === 'outEdges') {
+        each$1(node.outEdges, function (edge) {
+          if (edge.dataIndex < 0) {
+            return;
+          }
+
+          fadeInItem$1(edge, lineOpacityPath$1);
+          fadeInItem$1(edge.node2, nodeOpacityPath$1);
+        });
+      } else if (focusNodeAdj === 'inEdges') {
+        each$1(node.inEdges, function (edge) {
+          if (edge.dataIndex < 0) {
+            return;
+          }
+
+          fadeInItem$1(edge, lineOpacityPath$1);
+          fadeInItem$1(edge.node1, nodeOpacityPath$1);
+        });
+      } else if (focusNodeAdj === 'allEdges') {
+        each$1(node.edges, function (edge) {
+          if (edge.dataIndex < 0) {
+            return;
+          }
+
+          fadeInItem$1(edge, lineOpacityPath$1);
+          fadeInItem$1(edge.node1, nodeOpacityPath$1);
+          fadeInItem$1(edge.node2, nodeOpacityPath$1);
+        });
+      }
+    }
+
+    if (edge) {
+      fadeInItem$1(edge, lineOpacityPath$1);
+      fadeInItem$1(edge.node1, nodeOpacityPath$1);
+      fadeInItem$1(edge.node2, nodeOpacityPath$1);
+    }
+  },
+  unfocusNodeAdjacency: function (seriesModel, ecModel, api, payload) {
+    var graph = this._model.getGraph();
+
+    graph.eachNode(function (node) {
+      fadeOutItem$1(node, nodeOpacityPath$1);
+    });
+    graph.eachEdge(function (edge) {
+      fadeOutItem$1(edge, lineOpacityPath$1);
+    });
+  }
+}); // Add animation to the view
+
+function createGridClipShape$2(rect, seriesModel, cb) {
+  var rectEl = new Rect({
+    shape: {
+      x: rect.x - 10,
+      y: rect.y - 10,
+      width: 0,
+      height: rect.height + 20
+    }
+  });
+  initProps(rectEl, {
+    shape: {
+      width: rect.width + 20,
+      height: rect.height + 20
+    }
+  }, seriesModel, cb);
+  return rectEl;
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * @file The interactive action of sankey view
+ * @author Deqing Li(annong035@gmail.com)
+ */
+registerAction({
+  type: 'dragNode',
+  event: 'dragNode',
+  // here can only use 'update' now, other value is not support in echarts.
+  update: 'update'
+}, function (payload, ecModel) {
+  ecModel.eachComponent({
+    mainType: 'series',
+    subType: 'sankey',
+    query: payload
+  }, function (seriesModel) {
+    seriesModel.setNodePosition(payload.dataIndex, [payload.localX, payload.localY]);
+  });
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/*
+* The implementation references to d3.js. The use of the source
+* code of this file is also subject to the terms and consitions
+* of its license (BSD-3Clause, see <echarts/src/licenses/LICENSE-d3>).
+*/
+/**
+ * nest helper used to group by the array.
+ * can specified the keys and sort the keys.
+ */
+
+function nest() {
+  var keysFunction = [];
+  var sortKeysFunction = [];
+  /**
+   * map an Array into the mapObject.
+   * @param {Array} array
+   * @param {number} depth
+   */
+
+  function map$$1(array, depth) {
+    if (depth >= keysFunction.length) {
+      return array;
+    }
+
+    var i = -1;
+    var n = array.length;
+    var keyFunction = keysFunction[depth++];
+    var mapObject = {};
+    var valuesByKey = {};
+
+    while (++i < n) {
+      var keyValue = keyFunction(array[i]);
+      var values = valuesByKey[keyValue];
+
+      if (values) {
+        values.push(array[i]);
+      } else {
+        valuesByKey[keyValue] = [array[i]];
+      }
+    }
+
+    each$1(valuesByKey, function (value, key) {
+      mapObject[key] = map$$1(value, depth);
+    });
+    return mapObject;
+  }
+  /**
+   * transform the Map Object to multidimensional Array
+   * @param {Object} map
+   * @param {number} depth
+   */
+
+
+  function entriesMap(mapObject, depth) {
+    if (depth >= keysFunction.length) {
+      return mapObject;
+    }
+
+    var array = [];
+    var sortKeyFunction = sortKeysFunction[depth++];
+    each$1(mapObject, function (value, key) {
+      array.push({
+        key: key,
+        values: entriesMap(value, depth)
+      });
+    });
+
+    if (sortKeyFunction) {
+      return array.sort(function (a, b) {
+        return sortKeyFunction(a.key, b.key);
+      });
+    }
+
+    return array;
+  }
+
+  return {
+    /**
+     * specified the key to groupby the arrays.
+     * users can specified one more keys.
+     * @param {Function} d
+     */
+    key: function (d) {
+      keysFunction.push(d);
+      return this;
+    },
+
+    /**
+     * specified the comparator to sort the keys
+     * @param {Function} order
+     */
+    sortKeys: function (order) {
+      sortKeysFunction[keysFunction.length - 1] = order;
+      return this;
+    },
+
+    /**
+     * the array to be grouped by.
+     * @param {Array} array
+     */
+    entries: function (array) {
+      return entriesMap(map$$1(array, 0), 0);
+    }
+  };
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * @file The layout algorithm of sankey view
+ * @author Deqing Li(annong035@gmail.com)
+ */
+var sankeyLayout = function (ecModel, api, payload) {
+  ecModel.eachSeriesByType('sankey', function (seriesModel) {
+    var nodeWidth = seriesModel.get('nodeWidth');
+    var nodeGap = seriesModel.get('nodeGap');
+    var layoutInfo = getViewRect$3(seriesModel, api);
+    seriesModel.layoutInfo = layoutInfo;
+    var width = layoutInfo.width;
+    var height = layoutInfo.height;
+    var graph = seriesModel.getGraph();
+    var nodes = graph.nodes;
+    var edges = graph.edges;
+    computeNodeValues(nodes);
+    var filteredNodes = filter(nodes, function (node) {
+      return node.getLayout().value === 0;
+    });
+    var iterations = filteredNodes.length !== 0 ? 0 : seriesModel.get('layoutIterations');
+    var orient = seriesModel.get('orient');
+    layoutSankey(nodes, edges, nodeWidth, nodeGap, width, height, iterations, orient);
+  });
+};
+/**
+ * Get the layout position of the whole view
+ *
+ * @param {module:echarts/model/Series} seriesModel  the model object of sankey series
+ * @param {module:echarts/ExtensionAPI} api  provide the API list that the developer can call
+ * @return {module:zrender/core/BoundingRect}  size of rect to draw the sankey view
+ */
+
+function getViewRect$3(seriesModel, api) {
+  return getLayoutRect(seriesModel.getBoxLayoutParams(), {
+    width: api.getWidth(),
+    height: api.getHeight()
+  });
+}
+
+function layoutSankey(nodes, edges, nodeWidth, nodeGap, width, height, iterations, orient) {
+  computeNodeBreadths(nodes, edges, nodeWidth, width, height, orient);
+  computeNodeDepths(nodes, edges, height, width, nodeGap, iterations, orient);
+  computeEdgeDepths(nodes, orient);
+}
+/**
+ * Compute the value of each node by summing the associated edge's value
+ *
+ * @param {module:echarts/data/Graph~Node} nodes  node of sankey view
+ */
+
+
+function computeNodeValues(nodes) {
+  each$1(nodes, function (node) {
+    var value1 = sum(node.outEdges, getEdgeValue);
+    var value2 = sum(node.inEdges, getEdgeValue);
+    var value = Math.max(value1, value2);
+    node.setLayout({
+      value: value
+    }, true);
+  });
+}
+/**
+ * Compute the x-position for each node.
+ *
+ * Here we use Kahn algorithm to detect cycle when we traverse
+ * the node to computer the initial x position.
+ *
+ * @param {module:echarts/data/Graph~Node} nodes  node of sankey view
+ * @param  {number} nodeWidth  the dx of the node
+ * @param  {number} width  the whole width of the area to draw the view
+ */
+
+
+function computeNodeBreadths(nodes, edges, nodeWidth, width, height, orient) {
+  // Used to mark whether the edge is deleted. if it is deleted,
+  // the value is 0, otherwise it is 1.
+  var remainEdges = []; // Storage each node's indegree.
+
+  var indegreeArr = []; //Used to storage the node with indegree is equal to 0.
+
+  var zeroIndegrees = [];
+  var nextNode = [];
+  var x = 0;
+  var kx = 0;
+
+  for (var i = 0; i < edges.length; i++) {
+    remainEdges[i] = 1;
+  }
+
+  for (i = 0; i < nodes.length; i++) {
+    indegreeArr[i] = nodes[i].inEdges.length;
+
+    if (indegreeArr[i] === 0) {
+      zeroIndegrees.push(nodes[i]);
+    }
+  }
+
+  while (zeroIndegrees.length) {
+    for (var idx = 0; idx < zeroIndegrees.length; idx++) {
+      var node = zeroIndegrees[idx];
+
+      if (orient === 'vertical') {
+        node.setLayout({
+          y: x
+        }, true);
+        node.setLayout({
+          dy: nodeWidth
+        }, true);
+      } else {
+        node.setLayout({
+          x: x
+        }, true);
+        node.setLayout({
+          dx: nodeWidth
+        }, true);
+      }
+
+      for (var oidx = 0; oidx < node.outEdges.length; oidx++) {
+        var edge = node.outEdges[oidx];
+        var indexEdge = edges.indexOf(edge);
+        remainEdges[indexEdge] = 0;
+        var targetNode = edge.node2;
+        var nodeIndex = nodes.indexOf(targetNode);
+
+        if (--indegreeArr[nodeIndex] === 0) {
+          nextNode.push(targetNode);
+        }
+      }
+    }
+
+    ++x;
+    zeroIndegrees = nextNode;
+    nextNode = [];
+  }
+
+  for (i = 0; i < remainEdges.length; i++) {}
+
+  moveSinksRight(nodes, x, orient);
+
+  if (orient === 'vertical') {
+    kx = (height - nodeWidth) / (x - 1);
+  } else {
+    kx = (width - nodeWidth) / (x - 1);
+  }
+
+  scaleNodeBreadths(nodes, kx, orient);
+}
+/**
+ * All the node without outEgdes are assigned maximum x-position and
+ *     be aligned in the last column.
+ *
+ * @param {module:echarts/data/Graph~Node} nodes  node of sankey view
+ * @param {number} x  value (x-1) use to assign to node without outEdges
+ *     as x-position
+ */
+
+
+function moveSinksRight(nodes, x, orient) {
+  each$1(nodes, function (node) {
+    if (!node.outEdges.length) {
+      if (orient === 'vertical') {
+        node.setLayout({
+          y: x - 1
+        }, true);
+      } else {
+        node.setLayout({
+          x: x - 1
+        }, true);
+      }
+    }
+  });
+}
+/**
+ * Scale node x-position to the width
+ *
+ * @param {module:echarts/data/Graph~Node} nodes  node of sankey view
+ * @param {number} kx   multiple used to scale nodes
+ */
+
+
+function scaleNodeBreadths(nodes, kx, orient) {
+  each$1(nodes, function (node) {
+    if (orient === 'vertical') {
+      var nodeY = node.getLayout().y * kx;
+      node.setLayout({
+        y: nodeY
+      }, true);
+    } else {
+      var nodeX = node.getLayout().x * kx;
+      node.setLayout({
+        x: nodeX
+      }, true);
+    }
+  });
+}
+/**
+ * Using Gauss-Seidel iterations method to compute the node depth(y-position)
+ *
+ * @param {module:echarts/data/Graph~Node} nodes  node of sankey view
+ * @param {module:echarts/data/Graph~Edge} edges  edge of sankey view
+ * @param {number} height  the whole height of the area to draw the view
+ * @param {number} nodeGap  the vertical distance between two nodes
+ *     in the same column.
+ * @param {number} iterations  the number of iterations for the algorithm
+ */
+
+
+function computeNodeDepths(nodes, edges, height, width, nodeGap, iterations, orient) {
+  var nodesByBreadth = nest().key(getKeyFunction(orient)).sortKeys(function (a, b) {
+    return a - b;
+  }).entries(nodes).map(function (d) {
+    return d.values;
+  });
+  initializeNodeDepth(nodes, nodesByBreadth, edges, height, width, nodeGap, orient);
+  resolveCollisions(nodesByBreadth, nodeGap, height, width, orient);
+
+  for (var alpha = 1; iterations > 0; iterations--) {
+    // 0.99 is a experience parameter, ensure that each iterations of
+    // changes as small as possible.
+    alpha *= 0.99;
+    relaxRightToLeft(nodesByBreadth, alpha, orient);
+    resolveCollisions(nodesByBreadth, nodeGap, height, width, orient);
+    relaxLeftToRight(nodesByBreadth, alpha, orient);
+    resolveCollisions(nodesByBreadth, nodeGap, height, width, orient);
+  }
+}
+
+function getKeyFunction(orient) {
+  if (orient === 'vertical') {
+    return function (d) {
+      return d.getLayout().y;
+    };
+  }
+
+  return function (d) {
+    return d.getLayout().x;
+  };
+}
+/**
+ * Compute the original y-position for each node
+ *
+ * @param {module:echarts/data/Graph~Node} nodes  node of sankey view
+ * @param {Array.<Array.<module:echarts/data/Graph~Node>>} nodesByBreadth
+ *     group by the array of all sankey nodes based on the nodes x-position.
+ * @param {module:echarts/data/Graph~Edge} edges  edge of sankey view
+ * @param {number} height  the whole height of the area to draw the view
+ * @param {number} nodeGap  the vertical distance between two nodes
+ */
+
+
+function initializeNodeDepth(nodes, nodesByBreadth, edges, height, width, nodeGap, orient) {
+  var kyArray = [];
+  each$1(nodesByBreadth, function (nodes) {
+    var n = nodes.length;
+    var sum = 0;
+    var ky = 0;
+    each$1(nodes, function (node) {
+      sum += node.getLayout().value;
+    });
+
+    if (orient === 'vertical') {
+      ky = (width - (n - 1) * nodeGap) / sum;
+    } else {
+      ky = (height - (n - 1) * nodeGap) / sum;
+    }
+
+    kyArray.push(ky);
+  });
+  kyArray.sort(function (a, b) {
+    return a - b;
+  });
+  var ky0 = kyArray[0];
+  each$1(nodesByBreadth, function (nodes) {
+    each$1(nodes, function (node, i) {
+      var nodeDy = node.getLayout().value * ky0;
+
+      if (orient === 'vertical') {
+        node.setLayout({
+          x: i
+        }, true);
+        node.setLayout({
+          dx: nodeDy
+        }, true);
+      } else {
+        node.setLayout({
+          y: i
+        }, true);
+        node.setLayout({
+          dy: nodeDy
+        }, true);
+      }
+    });
+  });
+  each$1(edges, function (edge) {
+    var edgeDy = +edge.getValue() * ky0;
+    edge.setLayout({
+      dy: edgeDy
+    }, true);
+  });
+}
+/**
+ * Resolve the collision of initialized depth (y-position)
+ *
+ * @param {Array.<Array.<module:echarts/data/Graph~Node>>} nodesByBreadth
+ *     group by the array of all sankey nodes based on the nodes x-position.
+ * @param {number} nodeGap  the vertical distance between two nodes
+ * @param {number} height  the whole height of the area to draw the view
+ */
+
+
+function resolveCollisions(nodesByBreadth, nodeGap, height, width, orient) {
+  each$1(nodesByBreadth, function (nodes) {
+    var node;
+    var dy;
+    var y0 = 0;
+    var n = nodes.length;
+    var i;
+
+    if (orient === 'vertical') {
+      var nodeX;
+      nodes.sort(function (a, b) {
+        return a.getLayout().x - b.getLayout().x;
+      });
+
+      for (i = 0; i < n; i++) {
+        node = nodes[i];
+        dy = y0 - node.getLayout().x;
+
+        if (dy > 0) {
+          nodeX = node.getLayout().x + dy;
+          node.setLayout({
+            x: nodeX
+          }, true);
+        }
+
+        y0 = node.getLayout().x + node.getLayout().dx + nodeGap;
+      } // If the bottommost node goes outside the bounds, push it back up
+
+
+      dy = y0 - nodeGap - width;
+
+      if (dy > 0) {
+        nodeX = node.getLayout().x - dy;
+        node.setLayout({
+          x: nodeX
+        }, true);
+        y0 = nodeX;
+
+        for (i = n - 2; i >= 0; --i) {
+          node = nodes[i];
+          dy = node.getLayout().x + node.getLayout().dx + nodeGap - y0;
+
+          if (dy > 0) {
+            nodeX = node.getLayout().x - dy;
+            node.setLayout({
+              x: nodeX
+            }, true);
+          }
+
+          y0 = node.getLayout().x;
+        }
+      }
+    } else {
+      var nodeY;
+      nodes.sort(function (a, b) {
+        return a.getLayout().y - b.getLayout().y;
+      });
+
+      for (i = 0; i < n; i++) {
+        node = nodes[i];
+        dy = y0 - node.getLayout().y;
+
+        if (dy > 0) {
+          nodeY = node.getLayout().y + dy;
+          node.setLayout({
+            y: nodeY
+          }, true);
+        }
+
+        y0 = node.getLayout().y + node.getLayout().dy + nodeGap;
+      } // If the bottommost node goes outside the bounds, push it back up
+
+
+      dy = y0 - nodeGap - height;
+
+      if (dy > 0) {
+        nodeY = node.getLayout().y - dy;
+        node.setLayout({
+          y: nodeY
+        }, true);
+        y0 = nodeY;
+
+        for (i = n - 2; i >= 0; --i) {
+          node = nodes[i];
+          dy = node.getLayout().y + node.getLayout().dy + nodeGap - y0;
+
+          if (dy > 0) {
+            nodeY = node.getLayout().y - dy;
+            node.setLayout({
+              y: nodeY
+            }, true);
+          }
+
+          y0 = node.getLayout().y;
+        }
+      }
+    }
+  });
+}
+/**
+ * Change the y-position of the nodes, except most the right side nodes
+ *
+ * @param {Array.<Array.<module:echarts/data/Graph~Node>>} nodesByBreadth
+ *     group by the array of all sankey nodes based on the node x-position.
+ * @param {number} alpha  parameter used to adjust the nodes y-position
+ */
+
+
+function relaxRightToLeft(nodesByBreadth, alpha, orient) {
+  each$1(nodesByBreadth.slice().reverse(), function (nodes) {
+    each$1(nodes, function (node) {
+      if (node.outEdges.length) {
+        var y = sum(node.outEdges, weightedTarget, orient) / sum(node.outEdges, getEdgeValue, orient);
+
+        if (orient === 'vertical') {
+          var nodeX = node.getLayout().x + (y - center$1(node, orient)) * alpha;
+          node.setLayout({
+            x: nodeX
+          }, true);
+        } else {
+          var nodeY = node.getLayout().y + (y - center$1(node, orient)) * alpha;
+          node.setLayout({
+            y: nodeY
+          }, true);
+        }
+      }
+    });
+  });
+}
+
+function weightedTarget(edge, orient) {
+  return center$1(edge.node2, orient) * edge.getValue();
+}
+
+function weightedSource(edge, orient) {
+  return center$1(edge.node1, orient) * edge.getValue();
+}
+
+function center$1(node, orient) {
+  if (orient === 'vertical') {
+    return node.getLayout().x + node.getLayout().dx / 2;
+  }
+
+  return node.getLayout().y + node.getLayout().dy / 2;
+}
+
+function getEdgeValue(edge) {
+  return edge.getValue();
+}
+
+function sum(array, f, orient) {
+  var sum = 0;
+  var len = array.length;
+  var i = -1;
+
+  while (++i < len) {
+    var value = +f.call(array, array[i], orient);
+
+    if (!isNaN(value)) {
+      sum += value;
+    }
+  }
+
+  return sum;
+}
+/**
+ * Change the y-position of the nodes, except most the left side nodes
+ *
+ * @param {Array.<Array.<module:echarts/data/Graph~Node>>} nodesByBreadth
+ *     group by the array of all sankey nodes based on the node x-position.
+ * @param {number} alpha  parameter used to adjust the nodes y-position
+ */
+
+
+function relaxLeftToRight(nodesByBreadth, alpha, orient) {
+  each$1(nodesByBreadth, function (nodes) {
+    each$1(nodes, function (node) {
+      if (node.inEdges.length) {
+        var y = sum(node.inEdges, weightedSource, orient) / sum(node.inEdges, getEdgeValue, orient);
+
+        if (orient === 'vertical') {
+          var nodeX = node.getLayout().x + (y - center$1(node, orient)) * alpha;
+          node.setLayout({
+            x: nodeX
+          }, true);
+        } else {
+          var nodeY = node.getLayout().y + (y - center$1(node, orient)) * alpha;
+          node.setLayout({
+            y: nodeY
+          }, true);
+        }
+      }
+    });
+  });
+}
+/**
+ * Compute the depth(y-position) of each edge
+ *
+ * @param {module:echarts/data/Graph~Node} nodes  node of sankey view
+ */
+
+
+function computeEdgeDepths(nodes, orient) {
+  each$1(nodes, function (node) {
+    if (orient === 'vertical') {
+      node.outEdges.sort(function (a, b) {
+        return a.node2.getLayout().x - b.node2.getLayout().x;
+      });
+      node.inEdges.sort(function (a, b) {
+        return a.node1.getLayout().x - b.node1.getLayout().x;
+      });
+    } else {
+      node.outEdges.sort(function (a, b) {
+        return a.node2.getLayout().y - b.node2.getLayout().y;
+      });
+      node.inEdges.sort(function (a, b) {
+        return a.node1.getLayout().y - b.node1.getLayout().y;
+      });
+    }
+  });
+  each$1(nodes, function (node) {
+    var sy = 0;
+    var ty = 0;
+    each$1(node.outEdges, function (edge) {
+      edge.setLayout({
+        sy: sy
+      }, true);
+      sy += edge.getLayout().dy;
+    });
+    each$1(node.inEdges, function (edge) {
+      edge.setLayout({
+        ty: ty
+      }, true);
+      ty += edge.getLayout().dy;
+    });
+  });
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * @file Visual encoding for sankey view
+ * @author  Deqing Li(annong035@gmail.com)
+ */
+var sankeyVisual = function (ecModel, payload) {
+  ecModel.eachSeriesByType('sankey', function (seriesModel) {
+    var graph = seriesModel.getGraph();
+    var nodes = graph.nodes;
+
+    if (nodes.length) {
+      var minValue = Infinity;
+      var maxValue = -Infinity;
+      each$1(nodes, function (node) {
+        var nodeValue = node.getLayout().value;
+
+        if (nodeValue < minValue) {
+          minValue = nodeValue;
+        }
+
+        if (nodeValue > maxValue) {
+          maxValue = nodeValue;
+        }
+      });
+      each$1(nodes, function (node) {
+        var mapping = new VisualMapping({
+          type: 'color',
+          mappingMethod: 'linear',
+          dataExtent: [minValue, maxValue],
+          visual: seriesModel.get('color')
+        });
+        var mapValueToColor = mapping.mapValueToVisual(node.getLayout().value);
+        node.setVisual('color', mapValueToColor); // If set itemStyle.normal.color
+
+        var itemModel = node.getModel();
+        var customColor = itemModel.get('itemStyle.color');
+
+        if (customColor != null) {
+          node.setVisual('color', customColor);
+        }
+      });
+    }
+  });
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+registerLayout(sankeyLayout);
+registerVisual(sankeyVisual);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+/**
+ * @constructor  module:echarts/coord/single/SingleAxis
+ * @extends {module:echarts/coord/Axis}
+ * @param {string} dim
+ * @param {*} scale
+ * @param {Array.<number>} coordExtent
+ * @param {string} axisType
+ * @param {string} position
+ */
+
+var SingleAxis = function (dim, scale, coordExtent, axisType, position) {
+  Axis.call(this, dim, scale, coordExtent);
+  /**
+   * Axis type
+   * - 'category'
+   * - 'value'
+   * - 'time'
+   * - 'log'
+   * @type {string}
+   */
+
+  this.type = axisType || 'value';
+  /**
+   * Axis position
+   *  - 'top'
+   *  - 'bottom'
+   *  - 'left'
+   *  - 'right'
+   *  @type {string}
+   */
+
+  this.position = position || 'bottom';
+  /**
+   * Axis orient
+   *  - 'horizontal'
+   *  - 'vertical'
+   * @type {[type]}
+   */
+
+  this.orient = null;
+};
+
+SingleAxis.prototype = {
+  constructor: SingleAxis,
+
+  /**
+   * Axis model
+   * @type {module:echarts/coord/single/AxisModel}
+   */
+  model: null,
+
+  /**
+   * Judge the orient of the axis.
+   * @return {boolean}
+   */
+  isHorizontal: function () {
+    var position = this.position;
+    return position === 'top' || position === 'bottom';
+  },
+
+  /**
+   * @override
+   */
+  pointToData: function (point, clamp) {
+    return this.coordinateSystem.pointToData(point, clamp)[0];
+  },
+
+  /**
+   * Convert the local coord(processed by dataToCoord())
+   * to global coord(concrete pixel coord).
+   * designated by module:echarts/coord/single/Single.
+   * @type {Function}
+   */
+  toGlobalCoord: null,
+
+  /**
+   * Convert the global coord to local coord.
+   * designated by module:echarts/coord/single/Single.
+   * @type {Function}
+   */
+  toLocalCoord: null
+};
+inherits(SingleAxis, Axis);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * Single coordinates system.
+ */
+/**
+ * Create a single coordinates system.
+ *
+ * @param {module:echarts/coord/single/AxisModel} axisModel
+ * @param {module:echarts/model/Global} ecModel
+ * @param {module:echarts/ExtensionAPI} api
+ */
+
+function Single(axisModel, ecModel, api) {
+  /**
+   * @type {string}
+   * @readOnly
+   */
+  this.dimension = 'single';
+  /**
+   * Add it just for draw tooltip.
+   *
+   * @type {Array.<string>}
+   * @readOnly
+   */
+
+  this.dimensions = ['single'];
+  /**
+   * @private
+   * @type {module:echarts/coord/single/SingleAxis}.
+   */
+
+  this._axis = null;
+  /**
+   * @private
+   * @type {module:zrender/core/BoundingRect}
+   */
+
+  this._rect;
+
+  this._init(axisModel, ecModel, api);
+  /**
+   * @type {module:echarts/coord/single/AxisModel}
+   */
+
+
+  this.model = axisModel;
+}
+
+Single.prototype = {
+  type: 'singleAxis',
+  axisPointerEnabled: true,
+  constructor: Single,
+
+  /**
+   * Initialize single coordinate system.
+   *
+   * @param  {module:echarts/coord/single/AxisModel} axisModel
+   * @param  {module:echarts/model/Global} ecModel
+   * @param  {module:echarts/ExtensionAPI} api
+   * @private
+   */
+  _init: function (axisModel, ecModel, api) {
+    var dim = this.dimension;
+    var axis = new SingleAxis(dim, createScaleByModel(axisModel), [0, 0], axisModel.get('type'), axisModel.get('position'));
+    var isCategory = axis.type === 'category';
+    axis.onBand = isCategory && axisModel.get('boundaryGap');
+    axis.inverse = axisModel.get('inverse');
+    axis.orient = axisModel.get('orient');
+    axisModel.axis = axis;
+    axis.model = axisModel;
+    axis.coordinateSystem = this;
+    this._axis = axis;
+  },
+
+  /**
+   * Update axis scale after data processed
+   * @param  {module:echarts/model/Global} ecModel
+   * @param  {module:echarts/ExtensionAPI} api
+   */
+  update: function (ecModel, api) {
+    ecModel.eachSeries(function (seriesModel) {
+      if (seriesModel.coordinateSystem === this) {
+        var data = seriesModel.getData();
+        each$1(data.mapDimension(this.dimension, true), function (dim) {
+          this._axis.scale.unionExtentFromData(data, dim);
+        }, this);
+        niceScaleExtent(this._axis.scale, this._axis.model);
+      }
+    }, this);
+  },
+
+  /**
+   * Resize the single coordinate system.
+   *
+   * @param  {module:echarts/coord/single/AxisModel} axisModel
+   * @param  {module:echarts/ExtensionAPI} api
+   */
+  resize: function (axisModel, api) {
+    this._rect = getLayoutRect({
+      left: axisModel.get('left'),
+      top: axisModel.get('top'),
+      right: axisModel.get('right'),
+      bottom: axisModel.get('bottom'),
+      width: axisModel.get('width'),
+      height: axisModel.get('height')
+    }, {
+      width: api.getWidth(),
+      height: api.getHeight()
+    });
+
+    this._adjustAxis();
+  },
+
+  /**
+   * @return {module:zrender/core/BoundingRect}
+   */
+  getRect: function () {
+    return this._rect;
+  },
+
+  /**
+   * @private
+   */
+  _adjustAxis: function () {
+    var rect = this._rect;
+    var axis = this._axis;
+    var isHorizontal = axis.isHorizontal();
+    var extent = isHorizontal ? [0, rect.width] : [0, rect.height];
+    var idx = axis.reverse ? 1 : 0;
+    axis.setExtent(extent[idx], extent[1 - idx]);
+
+    this._updateAxisTransform(axis, isHorizontal ? rect.x : rect.y);
+  },
+
+  /**
+   * @param  {module:echarts/coord/single/SingleAxis} axis
+   * @param  {number} coordBase
+   */
+  _updateAxisTransform: function (axis, coordBase) {
+    var axisExtent = axis.getExtent();
+    var extentSum = axisExtent[0] + axisExtent[1];
+    var isHorizontal = axis.isHorizontal();
+    axis.toGlobalCoord = isHorizontal ? function (coord) {
+      return coord + coordBase;
+    } : function (coord) {
+      return extentSum - coord + coordBase;
+    };
+    axis.toLocalCoord = isHorizontal ? function (coord) {
+      return coord - coordBase;
+    } : function (coord) {
+      return extentSum - coord + coordBase;
+    };
+  },
+
+  /**
+   * Get axis.
+   *
+   * @return {module:echarts/coord/single/SingleAxis}
+   */
+  getAxis: function () {
+    return this._axis;
+  },
+
+  /**
+   * Get axis, add it just for draw tooltip.
+   *
+   * @return {[type]} [description]
+   */
+  getBaseAxis: function () {
+    return this._axis;
+  },
+
+  /**
+   * @return {Array.<module:echarts/coord/Axis>}
+   */
+  getAxes: function () {
+    return [this._axis];
+  },
+
+  /**
+   * @return {Object} {baseAxes: [], otherAxes: []}
+   */
+  getTooltipAxes: function () {
+    return {
+      baseAxes: [this.getAxis()]
+    };
+  },
+
+  /**
+   * If contain point.
+   *
+   * @param  {Array.<number>} point
+   * @return {boolean}
+   */
+  containPoint: function (point) {
+    var rect = this.getRect();
+    var axis = this.getAxis();
+    var orient = axis.orient;
+
+    if (orient === 'horizontal') {
+      return axis.contain(axis.toLocalCoord(point[0])) && point[1] >= rect.y && point[1] <= rect.y + rect.height;
+    } else {
+      return axis.contain(axis.toLocalCoord(point[1])) && point[0] >= rect.y && point[0] <= rect.y + rect.height;
+    }
+  },
+
+  /**
+   * @param {Array.<number>} point
+   * @return {Array.<number>}
+   */
+  pointToData: function (point) {
+    var axis = this.getAxis();
+    return [axis.coordToData(axis.toLocalCoord(point[axis.orient === 'horizontal' ? 0 : 1]))];
+  },
+
+  /**
+   * Convert the series data to concrete point.
+   *
+   * @param  {number|Array.<number>} val
+   * @return {Array.<number>}
+   */
+  dataToPoint: function (val) {
+    var axis = this.getAxis();
+    var rect = this.getRect();
+    var pt = [];
+    var idx = axis.orient === 'horizontal' ? 0 : 1;
+
+    if (val instanceof Array) {
+      val = val[0];
+    }
+
+    pt[idx] = axis.toGlobalCoord(axis.dataToCoord(+val));
+    pt[1 - idx] = idx === 0 ? rect.y + rect.height / 2 : rect.x + rect.width / 2;
+    return pt;
+  }
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * Single coordinate system creator.
+ */
+/**
+ * Create single coordinate system and inject it into seriesModel.
+ *
+ * @param {module:echarts/model/Global} ecModel
+ * @param {module:echarts/ExtensionAPI} api
+ * @return {Array.<module:echarts/coord/single/Single>}
+ */
+
+function create$3(ecModel, api) {
+  var singles = [];
+  ecModel.eachComponent('singleAxis', function (axisModel, idx) {
+    var single = new Single(axisModel, ecModel, api);
+    single.name = 'single_' + idx;
+    single.resize(axisModel, api);
+    axisModel.coordinateSystem = single;
+    singles.push(single);
+  });
+  ecModel.eachSeries(function (seriesModel) {
+    if (seriesModel.get('coordinateSystem') === 'singleAxis') {
+      var singleAxisModel = ecModel.queryComponents({
+        mainType: 'singleAxis',
+        index: seriesModel.get('singleAxisIndex'),
+        id: seriesModel.get('singleAxisId')
+      })[0];
+      seriesModel.coordinateSystem = singleAxisModel && singleAxisModel.coordinateSystem;
+    }
+  });
+  return singles;
+}
+
+CoordinateSystemManager.register('single', {
+  create: create$3,
+  dimensions: Single.prototype.dimensions
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+/**
+ * @param {Object} opt {labelInside}
+ * @return {Object} {
+ *  position, rotation, labelDirection, labelOffset,
+ *  tickDirection, labelRotate, z2
+ * }
+ */
+
+function layout$2(axisModel, opt) {
+  opt = opt || {};
+  var single = axisModel.coordinateSystem;
+  var axis = axisModel.axis;
+  var layout = {};
+  var axisPosition = axis.position;
+  var orient = axis.orient;
+  var rect = single.getRect();
+  var rectBound = [rect.x, rect.x + rect.width, rect.y, rect.y + rect.height];
+  var positionMap = {
+    horizontal: {
+      top: rectBound[2],
+      bottom: rectBound[3]
+    },
+    vertical: {
+      left: rectBound[0],
+      right: rectBound[1]
+    }
+  };
+  layout.position = [orient === 'vertical' ? positionMap.vertical[axisPosition] : rectBound[0], orient === 'horizontal' ? positionMap.horizontal[axisPosition] : rectBound[3]];
+  var r = {
+    horizontal: 0,
+    vertical: 1
+  };
+  layout.rotation = Math.PI / 2 * r[orient];
+  var directionMap = {
+    top: -1,
+    bottom: 1,
+    right: 1,
+    left: -1
+  };
+  layout.labelDirection = layout.tickDirection = layout.nameDirection = directionMap[axisPosition];
+
+  if (axisModel.get('axisTick.inside')) {
+    layout.tickDirection = -layout.tickDirection;
+  }
+
+  if (retrieve(opt.labelInside, axisModel.get('axisLabel.inside'))) {
+    layout.labelDirection = -layout.labelDirection;
+  }
+
+  var labelRotation = opt.rotate;
+  labelRotation == null && (labelRotation = axisModel.get('axisLabel.rotate'));
+  layout.labelRotation = axisPosition === 'top' ? -labelRotation : labelRotation;
+  layout.z2 = 1;
+  return layout;
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var axisBuilderAttrs$2 = ['axisLine', 'axisTickLabel', 'axisName'];
+var selfBuilderAttr = 'splitLine';
+var SingleAxisView = AxisView.extend({
+  type: 'singleAxis',
+  axisPointerClass: 'SingleAxisPointer',
+  render: function (axisModel, ecModel, api, payload) {
+    var group = this.group;
+    group.removeAll();
+    var layout = layout$2(axisModel);
+    var axisBuilder = new AxisBuilder(axisModel, layout);
+    each$1(axisBuilderAttrs$2, axisBuilder.add, axisBuilder);
+    group.add(axisBuilder.getGroup());
+
+    if (axisModel.get(selfBuilderAttr + '.show')) {
+      this['_' + selfBuilderAttr](axisModel);
+    }
+
+    SingleAxisView.superCall(this, 'render', axisModel, ecModel, api, payload);
+  },
+  _splitLine: function (axisModel) {
+    var axis = axisModel.axis;
+
+    if (axis.scale.isBlank()) {
+      return;
+    }
+
+    var splitLineModel = axisModel.getModel('splitLine');
+    var lineStyleModel = splitLineModel.getModel('lineStyle');
+    var lineWidth = lineStyleModel.get('width');
+    var lineColors = lineStyleModel.get('color');
+    lineColors = lineColors instanceof Array ? lineColors : [lineColors];
+    var gridRect = axisModel.coordinateSystem.getRect();
+    var isHorizontal = axis.isHorizontal();
+    var splitLines = [];
+    var lineCount = 0;
+    var ticksCoords = axis.getTicksCoords({
+      tickModel: splitLineModel
+    });
+    var p1 = [];
+    var p2 = [];
+
+    for (var i = 0; i < ticksCoords.length; ++i) {
+      var tickCoord = axis.toGlobalCoord(ticksCoords[i].coord);
+
+      if (isHorizontal) {
+        p1[0] = tickCoord;
+        p1[1] = gridRect.y;
+        p2[0] = tickCoord;
+        p2[1] = gridRect.y + gridRect.height;
+      } else {
+        p1[0] = gridRect.x;
+        p1[1] = tickCoord;
+        p2[0] = gridRect.x + gridRect.width;
+        p2[1] = tickCoord;
+      }
+
+      var colorIndex = lineCount++ % lineColors.length;
+      splitLines[colorIndex] = splitLines[colorIndex] || [];
+      splitLines[colorIndex].push(new Line(subPixelOptimizeLine({
+        shape: {
+          x1: p1[0],
+          y1: p1[1],
+          x2: p2[0],
+          y2: p2[1]
+        },
+        style: {
+          lineWidth: lineWidth
+        },
+        silent: true
+      })));
+    }
+
+    for (var i = 0; i < splitLines.length; ++i) {
+      this.group.add(mergePath(splitLines[i], {
+        style: {
+          stroke: lineColors[i % lineColors.length],
+          lineDash: lineStyleModel.getLineDash(lineWidth),
+          lineWidth: lineWidth
+        },
+        silent: true
+      }));
+    }
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var AxisModel$4 = ComponentModel.extend({
+  type: 'singleAxis',
+  layoutMode: 'box',
+
+  /**
+   * @type {module:echarts/coord/single/SingleAxis}
+   */
+  axis: null,
+
+  /**
+   * @type {module:echarts/coord/single/Single}
+   */
+  coordinateSystem: null,
+
+  /**
+   * @override
+   */
+  getCoordSysModel: function () {
+    return this;
+  }
+});
+var defaultOption$2 = {
+  left: '5%',
+  top: '5%',
+  right: '5%',
+  bottom: '5%',
+  type: 'value',
+  position: 'bottom',
+  orient: 'horizontal',
+  axisLine: {
+    show: true,
+    lineStyle: {
+      width: 2,
+      type: 'solid'
+    }
+  },
+  // Single coordinate system and single axis is the,
+  // which is used as the parent tooltip model.
+  // same model, so we set default tooltip show as true.
+  tooltip: {
+    show: true
+  },
+  axisTick: {
+    show: true,
+    length: 6,
+    lineStyle: {
+      width: 2
+    }
+  },
+  axisLabel: {
+    show: true,
+    interval: 'auto'
+  },
+  splitLine: {
+    show: true,
+    lineStyle: {
+      type: 'dashed',
+      opacity: 0.2
+    }
+  }
+};
+
+function getAxisType$2(axisName, option) {
+  return option.type || (option.data ? 'category' : 'value');
+}
+
+merge(AxisModel$4.prototype, axisModelCommonMixin);
+axisModelCreator('single', AxisModel$4, getAxisType$2, defaultOption$2);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+/**
+ * @param {Object} finder contains {seriesIndex, dataIndex, dataIndexInside}
+ * @param {module:echarts/model/Global} ecModel
+ * @return {Object} {point: [x, y], el: ...} point Will not be null.
+ */
+
+var findPointFromSeries = function (finder, ecModel) {
+  var point = [];
+  var seriesIndex = finder.seriesIndex;
+  var seriesModel;
+
+  if (seriesIndex == null || !(seriesModel = ecModel.getSeriesByIndex(seriesIndex))) {
+    return {
+      point: []
+    };
+  }
+
+  var data = seriesModel.getData();
+  var dataIndex = queryDataIndex(data, finder);
+
+  if (dataIndex == null || dataIndex < 0 || isArray(dataIndex)) {
+    return {
+      point: []
+    };
+  }
+
+  var el = data.getItemGraphicEl(dataIndex);
+  var coordSys = seriesModel.coordinateSystem;
+
+  if (seriesModel.getTooltipPosition) {
+    point = seriesModel.getTooltipPosition(dataIndex) || [];
+  } else if (coordSys && coordSys.dataToPoint) {
+    point = coordSys.dataToPoint(data.getValues(map(coordSys.dimensions, function (dim) {
+      return data.mapDimension(dim);
+    }), dataIndex, true)) || [];
+  } else if (el) {
+    // Use graphic bounding rect
+    var rect = el.getBoundingRect().clone();
+    rect.applyTransform(el.transform);
+    point = [rect.x + rect.width / 2, rect.y + rect.height / 2];
+  }
+
+  return {
+    point: point,
+    el: el
+  };
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var each$14 = each$1;
+var curry$3 = curry;
+var inner$9 = makeInner();
+/**
+ * Basic logic: check all axis, if they do not demand show/highlight,
+ * then hide/downplay them.
+ *
+ * @param {Object} coordSysAxesInfo
+ * @param {Object} payload
+ * @param {string} [payload.currTrigger] 'click' | 'mousemove' | 'leave'
+ * @param {Array.<number>} [payload.x] x and y, which are mandatory, specify a point to
+ *              trigger axisPointer and tooltip.
+ * @param {Array.<number>} [payload.y] x and y, which are mandatory, specify a point to
+ *              trigger axisPointer and tooltip.
+ * @param {Object} [payload.seriesIndex] finder, optional, restrict target axes.
+ * @param {Object} [payload.dataIndex] finder, restrict target axes.
+ * @param {Object} [payload.axesInfo] finder, restrict target axes.
+ *        [{
+ *          axisDim: 'x'|'y'|'angle'|...,
+ *          axisIndex: ...,
+ *          value: ...
+ *        }, ...]
+ * @param {Function} [payload.dispatchAction]
+ * @param {Object} [payload.tooltipOption]
+ * @param {Object|Array.<number>|Function} [payload.position] Tooltip position,
+ *        which can be specified in dispatchAction
+ * @param {module:echarts/model/Global} ecModel
+ * @param {module:echarts/ExtensionAPI} api
+ * @return {Object} content of event obj for echarts.connect.
+ */
+
+var axisTrigger = function (payload, ecModel, api) {
+  var currTrigger = payload.currTrigger;
+  var point = [payload.x, payload.y];
+  var finder = payload;
+  var dispatchAction = payload.dispatchAction || bind(api.dispatchAction, api);
+  var coordSysAxesInfo = ecModel.getComponent('axisPointer').coordSysAxesInfo; // Pending
+  // See #6121. But we are not able to reproduce it yet.
+
+  if (!coordSysAxesInfo) {
+    return;
+  }
+
+  if (illegalPoint(point)) {
+    // Used in the default behavior of `connection`: use the sample seriesIndex
+    // and dataIndex. And also used in the tooltipView trigger.
+    point = findPointFromSeries({
+      seriesIndex: finder.seriesIndex,
+      // Do not use dataIndexInside from other ec instance.
+      // FIXME: auto detect it?
+      dataIndex: finder.dataIndex
+    }, ecModel).point;
+  }
+
+  var isIllegalPoint = illegalPoint(point); // Axis and value can be specified when calling dispatchAction({type: 'updateAxisPointer'}).
+  // Notice: In this case, it is difficult to get the `point` (which is necessary to show
+  // tooltip, so if point is not given, we just use the point found by sample seriesIndex
+  // and dataIndex.
+
+  var inputAxesInfo = finder.axesInfo;
+  var axesInfo = coordSysAxesInfo.axesInfo;
+  var shouldHide = currTrigger === 'leave' || illegalPoint(point);
+  var outputFinder = {};
+  var showValueMap = {};
+  var dataByCoordSys = {
+    list: [],
+    map: {}
+  };
+  var updaters = {
+    showPointer: curry$3(showPointer, showValueMap),
+    showTooltip: curry$3(showTooltip, dataByCoordSys)
+  }; // Process for triggered axes.
+
+  each$14(coordSysAxesInfo.coordSysMap, function (coordSys, coordSysKey) {
+    // If a point given, it must be contained by the coordinate system.
+    var coordSysContainsPoint = isIllegalPoint || coordSys.containPoint(point);
+    each$14(coordSysAxesInfo.coordSysAxesInfo[coordSysKey], function (axisInfo, key) {
+      var axis = axisInfo.axis;
+      var inputAxisInfo = findInputAxisInfo(inputAxesInfo, axisInfo); // If no inputAxesInfo, no axis is restricted.
+
+      if (!shouldHide && coordSysContainsPoint && (!inputAxesInfo || inputAxisInfo)) {
+        var val = inputAxisInfo && inputAxisInfo.value;
+
+        if (val == null && !isIllegalPoint) {
+          val = axis.pointToData(point);
+        }
+
+        val != null && processOnAxis(axisInfo, val, updaters, false, outputFinder);
+      }
+    });
+  }); // Process for linked axes.
+
+  var linkTriggers = {};
+  each$14(axesInfo, function (tarAxisInfo, tarKey) {
+    var linkGroup = tarAxisInfo.linkGroup; // If axis has been triggered in the previous stage, it should not be triggered by link.
+
+    if (linkGroup && !showValueMap[tarKey]) {
+      each$14(linkGroup.axesInfo, function (srcAxisInfo, srcKey) {
+        var srcValItem = showValueMap[srcKey]; // If srcValItem exist, source axis is triggered, so link to target axis.
+
+        if (srcAxisInfo !== tarAxisInfo && srcValItem) {
+          var val = srcValItem.value;
+          linkGroup.mapper && (val = tarAxisInfo.axis.scale.parse(linkGroup.mapper(val, makeMapperParam(srcAxisInfo), makeMapperParam(tarAxisInfo))));
+          linkTriggers[tarAxisInfo.key] = val;
+        }
+      });
+    }
+  });
+  each$14(linkTriggers, function (val, tarKey) {
+    processOnAxis(axesInfo[tarKey], val, updaters, true, outputFinder);
+  });
+  updateModelActually(showValueMap, axesInfo, outputFinder);
+  dispatchTooltipActually(dataByCoordSys, point, payload, dispatchAction);
+  dispatchHighDownActually(axesInfo, dispatchAction, api);
+  return outputFinder;
+};
+
+function processOnAxis(axisInfo, newValue, updaters, dontSnap, outputFinder) {
+  var axis = axisInfo.axis;
+
+  if (axis.scale.isBlank() || !axis.containData(newValue)) {
+    return;
+  }
+
+  if (!axisInfo.involveSeries) {
+    updaters.showPointer(axisInfo, newValue);
+    return;
+  } // Heavy calculation. So put it after axis.containData checking.
+
+
+  var payloadInfo = buildPayloadsBySeries(newValue, axisInfo);
+  var payloadBatch = payloadInfo.payloadBatch;
+  var snapToValue = payloadInfo.snapToValue; // Fill content of event obj for echarts.connect.
+  // By defualt use the first involved series data as a sample to connect.
+
+  if (payloadBatch[0] && outputFinder.seriesIndex == null) {
+    extend(outputFinder, payloadBatch[0]);
+  } // If no linkSource input, this process is for collecting link
+  // target, where snap should not be accepted.
+
+
+  if (!dontSnap && axisInfo.snap) {
+    if (axis.containData(snapToValue) && snapToValue != null) {
+      newValue = snapToValue;
+    }
+  }
+
+  updaters.showPointer(axisInfo, newValue, payloadBatch, outputFinder); // Tooltip should always be snapToValue, otherwise there will be
+  // incorrect "axis value ~ series value" mapping displayed in tooltip.
+
+  updaters.showTooltip(axisInfo, payloadInfo, snapToValue);
+}
+
+function buildPayloadsBySeries(value, axisInfo) {
+  var axis = axisInfo.axis;
+  var dim = axis.dim;
+  var snapToValue = value;
+  var payloadBatch = [];
+  var minDist = Number.MAX_VALUE;
+  var minDiff = -1;
+  each$14(axisInfo.seriesModels, function (series, idx) {
+    var dataDim = series.getData().mapDimension(dim, true);
+    var seriesNestestValue;
+    var dataIndices;
+
+    if (series.getAxisTooltipData) {
+      var result = series.getAxisTooltipData(dataDim, value, axis);
+      dataIndices = result.dataIndices;
+      seriesNestestValue = result.nestestValue;
+    } else {
+      dataIndices = series.getData().indicesOfNearest(dataDim[0], value, // Add a threshold to avoid find the wrong dataIndex
+      // when data length is not same.
+      // false,
+      axis.type === 'category' ? 0.5 : null);
+
+      if (!dataIndices.length) {
+        return;
+      }
+
+      seriesNestestValue = series.getData().get(dataDim[0], dataIndices[0]);
+    }
+
+    if (seriesNestestValue == null || !isFinite(seriesNestestValue)) {
+      return;
+    }
+
+    var diff = value - seriesNestestValue;
+    var dist = Math.abs(diff); // Consider category case
+
+    if (dist <= minDist) {
+      if (dist < minDist || diff >= 0 && minDiff < 0) {
+        minDist = dist;
+        minDiff = diff;
+        snapToValue = seriesNestestValue;
+        payloadBatch.length = 0;
+      }
+
+      each$14(dataIndices, function (dataIndex) {
+        payloadBatch.push({
+          seriesIndex: series.seriesIndex,
+          dataIndexInside: dataIndex,
+          dataIndex: series.getData().getRawIndex(dataIndex)
+        });
+      });
+    }
+  });
+  return {
+    payloadBatch: payloadBatch,
+    snapToValue: snapToValue
+  };
+}
+
+function showPointer(showValueMap, axisInfo, value, payloadBatch) {
+  showValueMap[axisInfo.key] = {
+    value: value,
+    payloadBatch: payloadBatch
+  };
+}
+
+function showTooltip(dataByCoordSys, axisInfo, payloadInfo, value) {
+  var payloadBatch = payloadInfo.payloadBatch;
+  var axis = axisInfo.axis;
+  var axisModel = axis.model;
+  var axisPointerModel = axisInfo.axisPointerModel; // If no data, do not create anything in dataByCoordSys,
+  // whose length will be used to judge whether dispatch action.
+
+  if (!axisInfo.triggerTooltip || !payloadBatch.length) {
+    return;
+  }
+
+  var coordSysModel = axisInfo.coordSys.model;
+  var coordSysKey = makeKey(coordSysModel);
+  var coordSysItem = dataByCoordSys.map[coordSysKey];
+
+  if (!coordSysItem) {
+    coordSysItem = dataByCoordSys.map[coordSysKey] = {
+      coordSysId: coordSysModel.id,
+      coordSysIndex: coordSysModel.componentIndex,
+      coordSysType: coordSysModel.type,
+      coordSysMainType: coordSysModel.mainType,
+      dataByAxis: []
+    };
+    dataByCoordSys.list.push(coordSysItem);
+  }
+
+  coordSysItem.dataByAxis.push({
+    axisDim: axis.dim,
+    axisIndex: axisModel.componentIndex,
+    axisType: axisModel.type,
+    axisId: axisModel.id,
+    value: value,
+    // Caustion: viewHelper.getValueLabel is actually on "view stage", which
+    // depends that all models have been updated. So it should not be performed
+    // here. Considering axisPointerModel used here is volatile, which is hard
+    // to be retrieve in TooltipView, we prepare parameters here.
+    valueLabelOpt: {
+      precision: axisPointerModel.get('label.precision'),
+      formatter: axisPointerModel.get('label.formatter')
+    },
+    seriesDataIndices: payloadBatch.slice()
+  });
+}
+
+function updateModelActually(showValueMap, axesInfo, outputFinder) {
+  var outputAxesInfo = outputFinder.axesInfo = []; // Basic logic: If no 'show' required, 'hide' this axisPointer.
+
+  each$14(axesInfo, function (axisInfo, key) {
+    var option = axisInfo.axisPointerModel.option;
+    var valItem = showValueMap[key];
+
+    if (valItem) {
+      !axisInfo.useHandle && (option.status = 'show');
+      option.value = valItem.value; // For label formatter param and highlight.
+
+      option.seriesDataIndices = (valItem.payloadBatch || []).slice();
+    } // When always show (e.g., handle used), remain
+    // original value and status.
+    else {
+        // If hide, value still need to be set, consider
+        // click legend to toggle axis blank.
+        !axisInfo.useHandle && (option.status = 'hide');
+      } // If status is 'hide', should be no info in payload.
+
+
+    option.status === 'show' && outputAxesInfo.push({
+      axisDim: axisInfo.axis.dim,
+      axisIndex: axisInfo.axis.model.componentIndex,
+      value: option.value
+    });
+  });
+}
+
+function dispatchTooltipActually(dataByCoordSys, point, payload, dispatchAction) {
+  // Basic logic: If no showTip required, hideTip will be dispatched.
+  if (illegalPoint(point) || !dataByCoordSys.list.length) {
+    dispatchAction({
+      type: 'hideTip'
+    });
+    return;
+  } // In most case only one axis (or event one series is used). It is
+  // convinient to fetch payload.seriesIndex and payload.dataIndex
+  // dirtectly. So put the first seriesIndex and dataIndex of the first
+  // axis on the payload.
+
+
+  var sampleItem = ((dataByCoordSys.list[0].dataByAxis[0] || {}).seriesDataIndices || [])[0] || {};
+  dispatchAction({
+    type: 'showTip',
+    escapeConnect: true,
+    x: point[0],
+    y: point[1],
+    tooltipOption: payload.tooltipOption,
+    position: payload.position,
+    dataIndexInside: sampleItem.dataIndexInside,
+    dataIndex: sampleItem.dataIndex,
+    seriesIndex: sampleItem.seriesIndex,
+    dataByCoordSys: dataByCoordSys.list
+  });
+}
+
+function dispatchHighDownActually(axesInfo, dispatchAction, api) {
+  // FIXME
+  // highlight status modification shoule be a stage of main process?
+  // (Consider confilct (e.g., legend and axisPointer) and setOption)
+  var zr = api.getZr();
+  var highDownKey = 'axisPointerLastHighlights';
+  var lastHighlights = inner$9(zr)[highDownKey] || {};
+  var newHighlights = inner$9(zr)[highDownKey] = {}; // Update highlight/downplay status according to axisPointer model.
+  // Build hash map and remove duplicate incidentally.
+
+  each$14(axesInfo, function (axisInfo, key) {
+    var option = axisInfo.axisPointerModel.option;
+    option.status === 'show' && each$14(option.seriesDataIndices, function (batchItem) {
+      var key = batchItem.seriesIndex + ' | ' + batchItem.dataIndex;
+      newHighlights[key] = batchItem;
+    });
+  }); // Diff.
+
+  var toHighlight = [];
+  var toDownplay = [];
+  each$1(lastHighlights, function (batchItem, key) {
+    !newHighlights[key] && toDownplay.push(batchItem);
+  });
+  each$1(newHighlights, function (batchItem, key) {
+    !lastHighlights[key] && toHighlight.push(batchItem);
+  });
+  toDownplay.length && api.dispatchAction({
+    type: 'downplay',
+    escapeConnect: true,
+    batch: toDownplay
+  });
+  toHighlight.length && api.dispatchAction({
+    type: 'highlight',
+    escapeConnect: true,
+    batch: toHighlight
+  });
+}
+
+function findInputAxisInfo(inputAxesInfo, axisInfo) {
+  for (var i = 0; i < (inputAxesInfo || []).length; i++) {
+    var inputAxisInfo = inputAxesInfo[i];
+
+    if (axisInfo.axis.dim === inputAxisInfo.axisDim && axisInfo.axis.model.componentIndex === inputAxisInfo.axisIndex) {
+      return inputAxisInfo;
+    }
+  }
+}
+
+function makeMapperParam(axisInfo) {
+  var axisModel = axisInfo.axis.model;
+  var item = {};
+  var dim = item.axisDim = axisInfo.axis.dim;
+  item.axisIndex = item[dim + 'AxisIndex'] = axisModel.componentIndex;
+  item.axisName = item[dim + 'AxisName'] = axisModel.name;
+  item.axisId = item[dim + 'AxisId'] = axisModel.id;
+  return item;
+}
+
+function illegalPoint(point) {
+  return !point || point[0] == null || isNaN(point[0]) || point[1] == null || isNaN(point[1]);
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var AxisPointerModel = extendComponentModel({
+  type: 'axisPointer',
+  coordSysAxesInfo: null,
+  defaultOption: {
+    // 'auto' means that show when triggered by tooltip or handle.
+    show: 'auto',
+    // 'click' | 'mousemove' | 'none'
+    triggerOn: null,
+    // set default in AxisPonterView.js
+    zlevel: 0,
+    z: 50,
+    type: 'line',
+    // 'line' 'shadow' 'cross' 'none'.
+    // axispointer triggered by tootip determine snap automatically,
+    // see `modelHelper`.
+    snap: false,
+    triggerTooltip: true,
+    value: null,
+    status: null,
+    // Init value depends on whether handle is used.
+    // [group0, group1, ...]
+    // Each group can be: {
+    //      mapper: function () {},
+    //      singleTooltip: 'multiple',  // 'multiple' or 'single'
+    //      xAxisId: ...,
+    //      yAxisName: ...,
+    //      angleAxisIndex: ...
+    // }
+    // mapper: can be ignored.
+    //      input: {axisInfo, value}
+    //      output: {axisInfo, value}
+    link: [],
+    // Do not set 'auto' here, otherwise global animation: false
+    // will not effect at this axispointer.
+    animation: null,
+    animationDurationUpdate: 200,
+    lineStyle: {
+      color: '#aaa',
+      width: 1,
+      type: 'solid'
+    },
+    shadowStyle: {
+      color: 'rgba(150,150,150,0.3)'
+    },
+    label: {
+      show: true,
+      formatter: null,
+      // string | Function
+      precision: 'auto',
+      // Or a number like 0, 1, 2 ...
+      margin: 3,
+      color: '#fff',
+      padding: [5, 7, 5, 7],
+      backgroundColor: 'auto',
+      // default: axis line color
+      borderColor: null,
+      borderWidth: 0,
+      shadowBlur: 3,
+      shadowColor: '#aaa' // Considering applicability, common style should
+      // better not have shadowOffset.
+      // shadowOffsetX: 0,
+      // shadowOffsetY: 2
+
+    },
+    handle: {
+      show: false,
+
+      /* eslint-disable */
+      icon: 'M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4h1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7v-1.2h6.6z M13.3,22H6.7v-1.2h6.6z M13.3,19.6H6.7v-1.2h6.6z',
+      // jshint ignore:line
+
+      /* eslint-enable */
+      size: 45,
+      // handle margin is from symbol center to axis, which is stable when circular move.
+      margin: 50,
+      // color: '#1b8bbd'
+      // color: '#2f4554'
+      color: '#333',
+      shadowBlur: 3,
+      shadowColor: '#aaa',
+      shadowOffsetX: 0,
+      shadowOffsetY: 2,
+      // For mobile performance
+      throttle: 40
+    }
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var inner$10 = makeInner();
+var each$15 = each$1;
+/**
+ * @param {string} key
+ * @param {module:echarts/ExtensionAPI} api
+ * @param {Function} handler
+ *      param: {string} currTrigger
+ *      param: {Array.<number>} point
+ */
+
+function register(key, api, handler) {
+  if (env$1.node) {
+    return;
+  }
+
+  var zr = api.getZr();
+  inner$10(zr).records || (inner$10(zr).records = {});
+  initGlobalListeners(zr, api);
+  var record = inner$10(zr).records[key] || (inner$10(zr).records[key] = {});
+  record.handler = handler;
+}
+
+function initGlobalListeners(zr, api) {
+  if (inner$10(zr).initialized) {
+    return;
+  }
+
+  inner$10(zr).initialized = true;
+  useHandler('click', curry(doEnter, 'click'));
+  useHandler('mousemove', curry(doEnter, 'mousemove')); // useHandler('mouseout', onLeave);
+
+  useHandler('globalout', onLeave);
+
+  function useHandler(eventType, cb) {
+    zr.on(eventType, function (e) {
+      var dis = makeDispatchAction(api);
+      each$15(inner$10(zr).records, function (record) {
+        record && cb(record, e, dis.dispatchAction);
+      });
+      dispatchTooltipFinally(dis.pendings, api);
+    });
+  }
+}
+
+function dispatchTooltipFinally(pendings, api) {
+  var showLen = pendings.showTip.length;
+  var hideLen = pendings.hideTip.length;
+  var actuallyPayload;
+
+  if (showLen) {
+    actuallyPayload = pendings.showTip[showLen - 1];
+  } else if (hideLen) {
+    actuallyPayload = pendings.hideTip[hideLen - 1];
+  }
+
+  if (actuallyPayload) {
+    actuallyPayload.dispatchAction = null;
+    api.dispatchAction(actuallyPayload);
+  }
+}
+
+function onLeave(record, e, dispatchAction) {
+  record.handler('leave', null, dispatchAction);
+}
+
+function doEnter(currTrigger, record, e, dispatchAction) {
+  record.handler(currTrigger, e, dispatchAction);
+}
+
+function makeDispatchAction(api) {
+  var pendings = {
+    showTip: [],
+    hideTip: []
+  }; // FIXME
+  // better approach?
+  // 'showTip' and 'hideTip' can be triggered by axisPointer and tooltip,
+  // which may be conflict, (axisPointer call showTip but tooltip call hideTip);
+  // So we have to add "final stage" to merge those dispatched actions.
+
+  var dispatchAction = function (payload) {
+    var pendingList = pendings[payload.type];
+
+    if (pendingList) {
+      pendingList.push(payload);
+    } else {
+      payload.dispatchAction = dispatchAction;
+      api.dispatchAction(payload);
+    }
+  };
+
+  return {
+    dispatchAction: dispatchAction,
+    pendings: pendings
+  };
+}
+/**
+ * @param {string} key
+ * @param {module:echarts/ExtensionAPI} api
+ */
+
+
+function unregister(key, api) {
+  if (env$1.node) {
+    return;
+  }
+
+  var zr = api.getZr();
+  var record = (inner$10(zr).records || {})[key];
+
+  if (record) {
+    inner$10(zr).records[key] = null;
+  }
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var AxisPointerView = extendComponentView({
+  type: 'axisPointer',
+  render: function (globalAxisPointerModel, ecModel, api) {
+    var globalTooltipModel = ecModel.getComponent('tooltip');
+    var triggerOn = globalAxisPointerModel.get('triggerOn') || globalTooltipModel && globalTooltipModel.get('triggerOn') || 'mousemove|click'; // Register global listener in AxisPointerView to enable
+    // AxisPointerView to be independent to Tooltip.
+
+    register('axisPointer', api, function (currTrigger, e, dispatchAction) {
+      // If 'none', it is not controlled by mouse totally.
+      if (triggerOn !== 'none' && (currTrigger === 'leave' || triggerOn.indexOf(currTrigger) >= 0)) {
+        dispatchAction({
+          type: 'updateAxisPointer',
+          currTrigger: currTrigger,
+          x: e && e.offsetX,
+          y: e && e.offsetY
+        });
+      }
+    });
+  },
+
+  /**
+   * @override
+   */
+  remove: function (ecModel, api) {
+    unregister(api.getZr(), 'axisPointer');
+    AxisPointerView.superApply(this._model, 'remove', arguments);
+  },
+
+  /**
+   * @override
+   */
+  dispose: function (ecModel, api) {
+    unregister('axisPointer', api);
+    AxisPointerView.superApply(this._model, 'dispose', arguments);
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var inner$11 = makeInner();
+var clone$4 = clone;
+var bind$2 = bind;
+/**
+ * Base axis pointer class in 2D.
+ * Implemenents {module:echarts/component/axis/IAxisPointer}.
+ */
+
+function BaseAxisPointer() {}
+
+BaseAxisPointer.prototype = {
+  /**
+   * @private
+   */
+  _group: null,
+
+  /**
+   * @private
+   */
+  _lastGraphicKey: null,
+
+  /**
+   * @private
+   */
+  _handle: null,
+
+  /**
+   * @private
+   */
+  _dragging: false,
+
+  /**
+   * @private
+   */
+  _lastValue: null,
+
+  /**
+   * @private
+   */
+  _lastStatus: null,
+
+  /**
+   * @private
+   */
+  _payloadInfo: null,
+
+  /**
+   * In px, arbitrary value. Do not set too small,
+   * no animation is ok for most cases.
+   * @protected
+   */
+  animationThreshold: 15,
+
+  /**
+   * @implement
+   */
+  render: function (axisModel, axisPointerModel, api, forceRender) {
+    var value = axisPointerModel.get('value');
+    var status = axisPointerModel.get('status'); // Bind them to `this`, not in closure, otherwise they will not
+    // be replaced when user calling setOption in not merge mode.
+
+    this._axisModel = axisModel;
+    this._axisPointerModel = axisPointerModel;
+    this._api = api; // Optimize: `render` will be called repeatly during mouse move.
+    // So it is power consuming if performing `render` each time,
+    // especially on mobile device.
+
+    if (!forceRender && this._lastValue === value && this._lastStatus === status) {
+      return;
+    }
+
+    this._lastValue = value;
+    this._lastStatus = status;
+    var group = this._group;
+    var handle = this._handle;
+
+    if (!status || status === 'hide') {
+      // Do not clear here, for animation better.
+      group && group.hide();
+      handle && handle.hide();
+      return;
+    }
+
+    group && group.show();
+    handle && handle.show(); // Otherwise status is 'show'
+
+    var elOption = {};
+    this.makeElOption(elOption, value, axisModel, axisPointerModel, api); // Enable change axis pointer type.
+
+    var graphicKey = elOption.graphicKey;
+
+    if (graphicKey !== this._lastGraphicKey) {
+      this.clear(api);
+    }
+
+    this._lastGraphicKey = graphicKey;
+    var moveAnimation = this._moveAnimation = this.determineAnimation(axisModel, axisPointerModel);
+
+    if (!group) {
+      group = this._group = new Group();
+      this.createPointerEl(group, elOption, axisModel, axisPointerModel);
+      this.createLabelEl(group, elOption, axisModel, axisPointerModel);
+      api.getZr().add(group);
+    } else {
+      var doUpdateProps = curry(updateProps$1, axisPointerModel, moveAnimation);
+      this.updatePointerEl(group, elOption, doUpdateProps, axisPointerModel);
+      this.updateLabelEl(group, elOption, doUpdateProps, axisPointerModel);
+    }
+
+    updateMandatoryProps(group, axisPointerModel, true);
+
+    this._renderHandle(value);
+  },
+
+  /**
+   * @implement
+   */
+  remove: function (api) {
+    this.clear(api);
+  },
+
+  /**
+   * @implement
+   */
+  dispose: function (api) {
+    this.clear(api);
+  },
+
+  /**
+   * @protected
+   */
+  determineAnimation: function (axisModel, axisPointerModel) {
+    var animation = axisPointerModel.get('animation');
+    var axis = axisModel.axis;
+    var isCategoryAxis = axis.type === 'category';
+    var useSnap = axisPointerModel.get('snap'); // Value axis without snap always do not snap.
+
+    if (!useSnap && !isCategoryAxis) {
+      return false;
+    }
+
+    if (animation === 'auto' || animation == null) {
+      var animationThreshold = this.animationThreshold;
+
+      if (isCategoryAxis && axis.getBandWidth() > animationThreshold) {
+        return true;
+      } // It is important to auto animation when snap used. Consider if there is
+      // a dataZoom, animation will be disabled when too many points exist, while
+      // it will be enabled for better visual effect when little points exist.
+
+
+      if (useSnap) {
+        var seriesDataCount = getAxisInfo(axisModel).seriesDataCount;
+        var axisExtent = axis.getExtent(); // Approximate band width
+
+        return Math.abs(axisExtent[0] - axisExtent[1]) / seriesDataCount > animationThreshold;
+      }
+
+      return false;
+    }
+
+    return animation === true;
+  },
+
+  /**
+   * add {pointer, label, graphicKey} to elOption
+   * @protected
+   */
+  makeElOption: function (elOption, value, axisModel, axisPointerModel, api) {// Shoule be implemenented by sub-class.
+  },
+
+  /**
+   * @protected
+   */
+  createPointerEl: function (group, elOption, axisModel, axisPointerModel) {
+    var pointerOption = elOption.pointer;
+
+    if (pointerOption) {
+      var pointerEl = inner$11(group).pointerEl = new graphicUtil[pointerOption.type](clone$4(elOption.pointer));
+      group.add(pointerEl);
+    }
+  },
+
+  /**
+   * @protected
+   */
+  createLabelEl: function (group, elOption, axisModel, axisPointerModel) {
+    if (elOption.label) {
+      var labelEl = inner$11(group).labelEl = new Rect(clone$4(elOption.label));
+      group.add(labelEl);
+      updateLabelShowHide(labelEl, axisPointerModel);
+    }
+  },
+
+  /**
+   * @protected
+   */
+  updatePointerEl: function (group, elOption, updateProps$$1) {
+    var pointerEl = inner$11(group).pointerEl;
+
+    if (pointerEl) {
+      pointerEl.setStyle(elOption.pointer.style);
+      updateProps$$1(pointerEl, {
+        shape: elOption.pointer.shape
+      });
+    }
+  },
+
+  /**
+   * @protected
+   */
+  updateLabelEl: function (group, elOption, updateProps$$1, axisPointerModel) {
+    var labelEl = inner$11(group).labelEl;
+
+    if (labelEl) {
+      labelEl.setStyle(elOption.label.style);
+      updateProps$$1(labelEl, {
+        // Consider text length change in vertical axis, animation should
+        // be used on shape, otherwise the effect will be weird.
+        shape: elOption.label.shape,
+        position: elOption.label.position
+      });
+      updateLabelShowHide(labelEl, axisPointerModel);
+    }
+  },
+
+  /**
+   * @private
+   */
+  _renderHandle: function (value) {
+    if (this._dragging || !this.updateHandleTransform) {
+      return;
+    }
+
+    var axisPointerModel = this._axisPointerModel;
+
+    var zr = this._api.getZr();
+
+    var handle = this._handle;
+    var handleModel = axisPointerModel.getModel('handle');
+    var status = axisPointerModel.get('status');
+
+    if (!handleModel.get('show') || !status || status === 'hide') {
+      handle && zr.remove(handle);
+      this._handle = null;
+      return;
+    }
+
+    var isInit;
+
+    if (!this._handle) {
+      isInit = true;
+      handle = this._handle = createIcon(handleModel.get('icon'), {
+        cursor: 'move',
+        draggable: true,
+        onmousemove: function (e) {
+          // Fot mobile devicem, prevent screen slider on the button.
+          stop(e.event);
+        },
+        onmousedown: bind$2(this._onHandleDragMove, this, 0, 0),
+        drift: bind$2(this._onHandleDragMove, this),
+        ondragend: bind$2(this._onHandleDragEnd, this)
+      });
+      zr.add(handle);
+    }
+
+    updateMandatoryProps(handle, axisPointerModel, false); // update style
+
+    var includeStyles = ['color', 'borderColor', 'borderWidth', 'opacity', 'shadowColor', 'shadowBlur', 'shadowOffsetX', 'shadowOffsetY'];
+    handle.setStyle(handleModel.getItemStyle(null, includeStyles)); // update position
+
+    var handleSize = handleModel.get('size');
+
+    if (!isArray(handleSize)) {
+      handleSize = [handleSize, handleSize];
+    }
+
+    handle.attr('scale', [handleSize[0] / 2, handleSize[1] / 2]);
+    createOrUpdate(this, '_doDispatchAxisPointer', handleModel.get('throttle') || 0, 'fixRate');
+
+    this._moveHandleToValue(value, isInit);
+  },
+
+  /**
+   * @private
+   */
+  _moveHandleToValue: function (value, isInit) {
+    updateProps$1(this._axisPointerModel, !isInit && this._moveAnimation, this._handle, getHandleTransProps(this.getHandleTransform(value, this._axisModel, this._axisPointerModel)));
+  },
+
+  /**
+   * @private
+   */
+  _onHandleDragMove: function (dx, dy) {
+    var handle = this._handle;
+
+    if (!handle) {
+      return;
+    }
+
+    this._dragging = true; // Persistent for throttle.
+
+    var trans = this.updateHandleTransform(getHandleTransProps(handle), [dx, dy], this._axisModel, this._axisPointerModel);
+    this._payloadInfo = trans;
+    handle.stopAnimation();
+    handle.attr(getHandleTransProps(trans));
+    inner$11(handle).lastProp = null;
+
+    this._doDispatchAxisPointer();
+  },
+
+  /**
+   * Throttled method.
+   * @private
+   */
+  _doDispatchAxisPointer: function () {
+    var handle = this._handle;
+
+    if (!handle) {
+      return;
+    }
+
+    var payloadInfo = this._payloadInfo;
+    var axisModel = this._axisModel;
+
+    this._api.dispatchAction({
+      type: 'updateAxisPointer',
+      x: payloadInfo.cursorPoint[0],
+      y: payloadInfo.cursorPoint[1],
+      tooltipOption: payloadInfo.tooltipOption,
+      axesInfo: [{
+        axisDim: axisModel.axis.dim,
+        axisIndex: axisModel.componentIndex
+      }]
+    });
+  },
+
+  /**
+   * @private
+   */
+  _onHandleDragEnd: function (moveAnimation) {
+    this._dragging = false;
+    var handle = this._handle;
+
+    if (!handle) {
+      return;
+    }
+
+    var value = this._axisPointerModel.get('value'); // Consider snap or categroy axis, handle may be not consistent with
+    // axisPointer. So move handle to align the exact value position when
+    // drag ended.
+
+
+    this._moveHandleToValue(value); // For the effect: tooltip will be shown when finger holding on handle
+    // button, and will be hidden after finger left handle button.
+
+
+    this._api.dispatchAction({
+      type: 'hideTip'
+    });
+  },
+
+  /**
+   * Should be implemenented by sub-class if support `handle`.
+   * @protected
+   * @param {number} value
+   * @param {module:echarts/model/Model} axisModel
+   * @param {module:echarts/model/Model} axisPointerModel
+   * @return {Object} {position: [x, y], rotation: 0}
+   */
+  getHandleTransform: null,
+
+  /**
+   * * Should be implemenented by sub-class if support `handle`.
+   * @protected
+   * @param {Object} transform {position, rotation}
+   * @param {Array.<number>} delta [dx, dy]
+   * @param {module:echarts/model/Model} axisModel
+   * @param {module:echarts/model/Model} axisPointerModel
+   * @return {Object} {position: [x, y], rotation: 0, cursorPoint: [x, y]}
+   */
+  updateHandleTransform: null,
+
+  /**
+   * @private
+   */
+  clear: function (api) {
+    this._lastValue = null;
+    this._lastStatus = null;
+    var zr = api.getZr();
+    var group = this._group;
+    var handle = this._handle;
+
+    if (zr && group) {
+      this._lastGraphicKey = null;
+      group && zr.remove(group);
+      handle && zr.remove(handle);
+      this._group = null;
+      this._handle = null;
+      this._payloadInfo = null;
+    }
+  },
+
+  /**
+   * @protected
+   */
+  doClear: function () {// Implemented by sub-class if necessary.
+  },
+
+  /**
+   * @protected
+   * @param {Array.<number>} xy
+   * @param {Array.<number>} wh
+   * @param {number} [xDimIndex=0] or 1
+   */
+  buildLabel: function (xy, wh, xDimIndex) {
+    xDimIndex = xDimIndex || 0;
+    return {
+      x: xy[xDimIndex],
+      y: xy[1 - xDimIndex],
+      width: wh[xDimIndex],
+      height: wh[1 - xDimIndex]
+    };
+  }
+};
+BaseAxisPointer.prototype.constructor = BaseAxisPointer;
+
+function updateProps$1(animationModel, moveAnimation, el, props) {
+  // Animation optimize.
+  if (!propsEqual(inner$11(el).lastProp, props)) {
+    inner$11(el).lastProp = props;
+    moveAnimation ? updateProps(el, props, animationModel) : (el.stopAnimation(), el.attr(props));
+  }
+}
+
+function propsEqual(lastProps, newProps) {
+  if (isObject$1(lastProps) && isObject$1(newProps)) {
+    var equals = true;
+    each$1(newProps, function (item, key) {
+      equals = equals && propsEqual(lastProps[key], item);
+    });
+    return !!equals;
+  } else {
+    return lastProps === newProps;
+  }
+}
+
+function updateLabelShowHide(labelEl, axisPointerModel) {
+  labelEl[axisPointerModel.get('label.show') ? 'show' : 'hide']();
+}
+
+function getHandleTransProps(trans) {
+  return {
+    position: trans.position.slice(),
+    rotation: trans.rotation || 0
+  };
+}
+
+function updateMandatoryProps(group, axisPointerModel, silent) {
+  var z = axisPointerModel.get('z');
+  var zlevel = axisPointerModel.get('zlevel');
+  group && group.traverse(function (el) {
+    if (el.type !== 'group') {
+      z != null && (el.z = z);
+      zlevel != null && (el.zlevel = zlevel);
+      el.silent = silent;
+    }
+  });
+}
+
+enableClassExtend(BaseAxisPointer);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+/**
+ * @param {module:echarts/model/Model} axisPointerModel
+ */
+
+function buildElStyle(axisPointerModel) {
+  var axisPointerType = axisPointerModel.get('type');
+  var styleModel = axisPointerModel.getModel(axisPointerType + 'Style');
+  var style;
+
+  if (axisPointerType === 'line') {
+    style = styleModel.getLineStyle();
+    style.fill = null;
+  } else if (axisPointerType === 'shadow') {
+    style = styleModel.getAreaStyle();
+    style.stroke = null;
+  }
+
+  return style;
+}
+/**
+ * @param {Function} labelPos {align, verticalAlign, position}
+ */
+
+function buildLabelElOption(elOption, axisModel, axisPointerModel, api, labelPos) {
+  var value = axisPointerModel.get('value');
+  var text = getValueLabel(value, axisModel.axis, axisModel.ecModel, axisPointerModel.get('seriesDataIndices'), {
+    precision: axisPointerModel.get('label.precision'),
+    formatter: axisPointerModel.get('label.formatter')
+  });
+  var labelModel = axisPointerModel.getModel('label');
+  var paddings = normalizeCssArray$1(labelModel.get('padding') || 0);
+  var font = labelModel.getFont();
+  var textRect = getBoundingRect(text, font);
+  var position = labelPos.position;
+  var width = textRect.width + paddings[1] + paddings[3];
+  var height = textRect.height + paddings[0] + paddings[2]; // Adjust by align.
+
+  var align = labelPos.align;
+  align === 'right' && (position[0] -= width);
+  align === 'center' && (position[0] -= width / 2);
+  var verticalAlign = labelPos.verticalAlign;
+  verticalAlign === 'bottom' && (position[1] -= height);
+  verticalAlign === 'middle' && (position[1] -= height / 2); // Not overflow ec container
+
+  confineInContainer(position, width, height, api);
+  var bgColor = labelModel.get('backgroundColor');
+
+  if (!bgColor || bgColor === 'auto') {
+    bgColor = axisModel.get('axisLine.lineStyle.color');
+  }
+
+  elOption.label = {
+    shape: {
+      x: 0,
+      y: 0,
+      width: width,
+      height: height,
+      r: labelModel.get('borderRadius')
+    },
+    position: position.slice(),
+    // TODO: rich
+    style: {
+      text: text,
+      textFont: font,
+      textFill: labelModel.getTextColor(),
+      textPosition: 'inside',
+      fill: bgColor,
+      stroke: labelModel.get('borderColor') || 'transparent',
+      lineWidth: labelModel.get('borderWidth') || 0,
+      shadowBlur: labelModel.get('shadowBlur'),
+      shadowColor: labelModel.get('shadowColor'),
+      shadowOffsetX: labelModel.get('shadowOffsetX'),
+      shadowOffsetY: labelModel.get('shadowOffsetY')
+    },
+    // Lable should be over axisPointer.
+    z2: 10
+  };
+} // Do not overflow ec container
+
+function confineInContainer(position, width, height, api) {
+  var viewWidth = api.getWidth();
+  var viewHeight = api.getHeight();
+  position[0] = Math.min(position[0] + width, viewWidth) - width;
+  position[1] = Math.min(position[1] + height, viewHeight) - height;
+  position[0] = Math.max(position[0], 0);
+  position[1] = Math.max(position[1], 0);
+}
+/**
+ * @param {number} value
+ * @param {module:echarts/coord/Axis} axis
+ * @param {module:echarts/model/Global} ecModel
+ * @param {Object} opt
+ * @param {Array.<Object>} seriesDataIndices
+ * @param {number|string} opt.precision 'auto' or a number
+ * @param {string|Function} opt.formatter label formatter
+ */
+
+
+function getValueLabel(value, axis, ecModel, seriesDataIndices, opt) {
+  value = axis.scale.parse(value);
+  var text = axis.scale.getLabel( // If `precision` is set, width can be fixed (like '12.00500'), which
+  // helps to debounce when when moving label.
+  value, {
+    precision: opt.precision
+  });
+  var formatter = opt.formatter;
+
+  if (formatter) {
+    var params = {
+      value: getAxisRawValue(axis, value),
+      seriesData: []
+    };
+    each$1(seriesDataIndices, function (idxItem) {
+      var series = ecModel.getSeriesByIndex(idxItem.seriesIndex);
+      var dataIndex = idxItem.dataIndexInside;
+      var dataParams = series && series.getDataParams(dataIndex);
+      dataParams && params.seriesData.push(dataParams);
+    });
+
+    if (isString(formatter)) {
+      text = formatter.replace('{value}', text);
+    } else if (isFunction$1(formatter)) {
+      text = formatter(params);
+    }
+  }
+
+  return text;
+}
+/**
+ * @param {module:echarts/coord/Axis} axis
+ * @param {number} value
+ * @param {Object} layoutInfo {
+ *  rotation, position, labelOffset, labelDirection, labelMargin
+ * }
+ */
+
+function getTransformedPosition(axis, value, layoutInfo) {
+  var transform = create$1();
+  rotate(transform, transform, layoutInfo.rotation);
+  translate(transform, transform, layoutInfo.position);
+  return applyTransform$1([axis.dataToCoord(value), (layoutInfo.labelOffset || 0) + (layoutInfo.labelDirection || 1) * (layoutInfo.labelMargin || 0)], transform);
+}
+function buildCartesianSingleLabelElOption(value, elOption, layoutInfo, axisModel, axisPointerModel, api) {
+  var textLayout = AxisBuilder.innerTextLayout(layoutInfo.rotation, 0, layoutInfo.labelDirection);
+  layoutInfo.labelMargin = axisPointerModel.get('label.margin');
+  buildLabelElOption(elOption, axisModel, axisPointerModel, api, {
+    position: getTransformedPosition(axisModel.axis, value, layoutInfo),
+    align: textLayout.textAlign,
+    verticalAlign: textLayout.textVerticalAlign
+  });
+}
+/**
+ * @param {Array.<number>} p1
+ * @param {Array.<number>} p2
+ * @param {number} [xDimIndex=0] or 1
+ */
+
+function makeLineShape(p1, p2, xDimIndex) {
+  xDimIndex = xDimIndex || 0;
+  return {
+    x1: p1[xDimIndex],
+    y1: p1[1 - xDimIndex],
+    x2: p2[xDimIndex],
+    y2: p2[1 - xDimIndex]
+  };
+}
+/**
+ * @param {Array.<number>} xy
+ * @param {Array.<number>} wh
+ * @param {number} [xDimIndex=0] or 1
+ */
+
+function makeRectShape(xy, wh, xDimIndex) {
+  xDimIndex = xDimIndex || 0;
+  return {
+    x: xy[xDimIndex],
+    y: xy[1 - xDimIndex],
+    width: wh[xDimIndex],
+    height: wh[1 - xDimIndex]
+  };
+}
+function makeSectorShape(cx, cy, r0, r, startAngle, endAngle) {
+  return {
+    cx: cx,
+    cy: cy,
+    r0: r0,
+    r: r,
+    startAngle: startAngle,
+    endAngle: endAngle,
+    clockwise: true
+  };
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var CartesianAxisPointer = BaseAxisPointer.extend({
+  /**
+   * @override
+   */
+  makeElOption: function (elOption, value, axisModel, axisPointerModel, api) {
+    var axis = axisModel.axis;
+    var grid = axis.grid;
+    var axisPointerType = axisPointerModel.get('type');
+    var otherExtent = getCartesian(grid, axis).getOtherAxis(axis).getGlobalExtent();
+    var pixelValue = axis.toGlobalCoord(axis.dataToCoord(value, true));
+
+    if (axisPointerType && axisPointerType !== 'none') {
+      var elStyle = buildElStyle(axisPointerModel);
+      var pointerOption = pointerShapeBuilder[axisPointerType](axis, pixelValue, otherExtent, elStyle);
+      pointerOption.style = elStyle;
+      elOption.graphicKey = pointerOption.type;
+      elOption.pointer = pointerOption;
+    }
+
+    var layoutInfo = layout$1(grid.model, axisModel);
+    buildCartesianSingleLabelElOption(value, elOption, layoutInfo, axisModel, axisPointerModel, api);
+  },
+
+  /**
+   * @override
+   */
+  getHandleTransform: function (value, axisModel, axisPointerModel) {
+    var layoutInfo = layout$1(axisModel.axis.grid.model, axisModel, {
+      labelInside: false
+    });
+    layoutInfo.labelMargin = axisPointerModel.get('handle.margin');
+    return {
+      position: getTransformedPosition(axisModel.axis, value, layoutInfo),
+      rotation: layoutInfo.rotation + (layoutInfo.labelDirection < 0 ? Math.PI : 0)
+    };
+  },
+
+  /**
+   * @override
+   */
+  updateHandleTransform: function (transform, delta, axisModel, axisPointerModel) {
+    var axis = axisModel.axis;
+    var grid = axis.grid;
+    var axisExtent = axis.getGlobalExtent(true);
+    var otherExtent = getCartesian(grid, axis).getOtherAxis(axis).getGlobalExtent();
+    var dimIndex = axis.dim === 'x' ? 0 : 1;
+    var currPosition = transform.position;
+    currPosition[dimIndex] += delta[dimIndex];
+    currPosition[dimIndex] = Math.min(axisExtent[1], currPosition[dimIndex]);
+    currPosition[dimIndex] = Math.max(axisExtent[0], currPosition[dimIndex]);
+    var cursorOtherValue = (otherExtent[1] + otherExtent[0]) / 2;
+    var cursorPoint = [cursorOtherValue, cursorOtherValue];
+    cursorPoint[dimIndex] = currPosition[dimIndex]; // Make tooltip do not overlap axisPointer and in the middle of the grid.
+
+    var tooltipOptions = [{
+      verticalAlign: 'middle'
+    }, {
+      align: 'center'
+    }];
+    return {
+      position: currPosition,
+      rotation: transform.rotation,
+      cursorPoint: cursorPoint,
+      tooltipOption: tooltipOptions[dimIndex]
+    };
+  }
+});
+
+function getCartesian(grid, axis) {
+  var opt = {};
+  opt[axis.dim + 'AxisIndex'] = axis.index;
+  return grid.getCartesian(opt);
+}
+
+var pointerShapeBuilder = {
+  line: function (axis, pixelValue, otherExtent, elStyle) {
+    var targetShape = makeLineShape([pixelValue, otherExtent[0]], [pixelValue, otherExtent[1]], getAxisDimIndex(axis));
+    subPixelOptimizeLine({
+      shape: targetShape,
+      style: elStyle
+    });
+    return {
+      type: 'Line',
+      shape: targetShape
+    };
+  },
+  shadow: function (axis, pixelValue, otherExtent, elStyle) {
+    var bandWidth = Math.max(1, axis.getBandWidth());
+    var span = otherExtent[1] - otherExtent[0];
+    return {
+      type: 'Rect',
+      shape: makeRectShape([pixelValue - bandWidth / 2, otherExtent[0]], [bandWidth, span], getAxisDimIndex(axis))
+    };
+  }
+};
+
+function getAxisDimIndex(axis) {
+  return axis.dim === 'x' ? 0 : 1;
+}
+
+AxisView.registerAxisPointerClass('CartesianAxisPointer', CartesianAxisPointer);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+// echarts.simple.js and online build tooltip, which only require gridSimple,
+// CartesianAxisPointer should be able to required somewhere.
+
+registerPreprocessor(function (option) {
+  // Always has a global axisPointerModel for default setting.
+  if (option) {
+    (!option.axisPointer || option.axisPointer.length === 0) && (option.axisPointer = {});
+    var link = option.axisPointer.link; // Normalize to array to avoid object mergin. But if link
+    // is not set, remain null/undefined, otherwise it will
+    // override existent link setting.
+
+    if (link && !isArray(link)) {
+      option.axisPointer.link = [link];
+    }
+  }
+}); // This process should proformed after coordinate systems created
+// and series data processed. So put it on statistic processing stage.
+
+registerProcessor(PRIORITY.PROCESSOR.STATISTIC, function (ecModel, api) {
+  // Build axisPointerModel, mergin tooltip.axisPointer model for each axis.
+  // allAxesInfo should be updated when setOption performed.
+  ecModel.getComponent('axisPointer').coordSysAxesInfo = collect(ecModel, api);
+}); // Broadcast to all views.
+
+registerAction({
+  type: 'updateAxisPointer',
+  event: 'updateAxisPointer',
+  update: ':updateAxisPointer'
+}, axisTrigger);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var XY = ['x', 'y'];
+var WH = ['width', 'height'];
+var SingleAxisPointer = BaseAxisPointer.extend({
+  /**
+   * @override
+   */
+  makeElOption: function (elOption, value, axisModel, axisPointerModel, api) {
+    var axis = axisModel.axis;
+    var coordSys = axis.coordinateSystem;
+    var otherExtent = getGlobalExtent(coordSys, 1 - getPointDimIndex(axis));
+    var pixelValue = coordSys.dataToPoint(value)[0];
+    var axisPointerType = axisPointerModel.get('type');
+
+    if (axisPointerType && axisPointerType !== 'none') {
+      var elStyle = buildElStyle(axisPointerModel);
+      var pointerOption = pointerShapeBuilder$1[axisPointerType](axis, pixelValue, otherExtent, elStyle);
+      pointerOption.style = elStyle;
+      elOption.graphicKey = pointerOption.type;
+      elOption.pointer = pointerOption;
+    }
+
+    var layoutInfo = layout$2(axisModel);
+    buildCartesianSingleLabelElOption(value, elOption, layoutInfo, axisModel, axisPointerModel, api);
+  },
+
+  /**
+   * @override
+   */
+  getHandleTransform: function (value, axisModel, axisPointerModel) {
+    var layoutInfo = layout$2(axisModel, {
+      labelInside: false
+    });
+    layoutInfo.labelMargin = axisPointerModel.get('handle.margin');
+    return {
+      position: getTransformedPosition(axisModel.axis, value, layoutInfo),
+      rotation: layoutInfo.rotation + (layoutInfo.labelDirection < 0 ? Math.PI : 0)
+    };
+  },
+
+  /**
+   * @override
+   */
+  updateHandleTransform: function (transform, delta, axisModel, axisPointerModel) {
+    var axis = axisModel.axis;
+    var coordSys = axis.coordinateSystem;
+    var dimIndex = getPointDimIndex(axis);
+    var axisExtent = getGlobalExtent(coordSys, dimIndex);
+    var currPosition = transform.position;
+    currPosition[dimIndex] += delta[dimIndex];
+    currPosition[dimIndex] = Math.min(axisExtent[1], currPosition[dimIndex]);
+    currPosition[dimIndex] = Math.max(axisExtent[0], currPosition[dimIndex]);
+    var otherExtent = getGlobalExtent(coordSys, 1 - dimIndex);
+    var cursorOtherValue = (otherExtent[1] + otherExtent[0]) / 2;
+    var cursorPoint = [cursorOtherValue, cursorOtherValue];
+    cursorPoint[dimIndex] = currPosition[dimIndex];
+    return {
+      position: currPosition,
+      rotation: transform.rotation,
+      cursorPoint: cursorPoint,
+      tooltipOption: {
+        verticalAlign: 'middle'
+      }
+    };
+  }
+});
+var pointerShapeBuilder$1 = {
+  line: function (axis, pixelValue, otherExtent, elStyle) {
+    var targetShape = makeLineShape([pixelValue, otherExtent[0]], [pixelValue, otherExtent[1]], getPointDimIndex(axis));
+    subPixelOptimizeLine({
+      shape: targetShape,
+      style: elStyle
+    });
+    return {
+      type: 'Line',
+      shape: targetShape
+    };
+  },
+  shadow: function (axis, pixelValue, otherExtent, elStyle) {
+    var bandWidth = axis.getBandWidth();
+    var span = otherExtent[1] - otherExtent[0];
+    return {
+      type: 'Rect',
+      shape: makeRectShape([pixelValue - bandWidth / 2, otherExtent[0]], [bandWidth, span], getPointDimIndex(axis))
+    };
+  }
+};
+
+function getPointDimIndex(axis) {
+  return axis.isHorizontal() ? 0 : 1;
+}
+
+function getGlobalExtent(coordSys, dimIndex) {
+  var rect = coordSys.getRect();
+  return [rect[XY[dimIndex]], rect[XY[dimIndex]] + rect[WH[dimIndex]]];
+}
+
+AxisView.registerAxisPointerClass('SingleAxisPointer', SingleAxisPointer);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+extendComponentView({
+  type: 'single'
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * @file  Define the themeRiver view's series model
+ * @author Deqing Li(annong035@gmail.com)
+ */
+var DATA_NAME_INDEX = 2;
+var ThemeRiverSeries = SeriesModel.extend({
+  type: 'series.themeRiver',
+  dependencies: ['singleAxis'],
+
+  /**
+   * @readOnly
+   * @type {module:zrender/core/util#HashMap}
+   */
+  nameMap: null,
+
+  /**
+   * @override
+   */
+  init: function (option) {
+    // eslint-disable-next-line
+    ThemeRiverSeries.superApply(this, 'init', arguments); // Put this function here is for the sake of consistency of code style.
+    // Enable legend selection for each data item
+    // Use a function instead of direct access because data reference may changed
+
+    this.legendDataProvider = function () {
+      return this.getRawData();
+    };
+  },
+
+  /**
+   * If there is no value of a certain point in the time for some event,set it value to 0.
+   *
+   * @param {Array} data  initial data in the option
+   * @return {Array}
+   */
+  fixData: function (data) {
+    var rawDataLength = data.length; // grouped data by name
+
+    var dataByName = nest().key(function (dataItem) {
+      return dataItem[2];
+    }).entries(data); // data group in each layer
+
+    var layData = map(dataByName, function (d) {
+      return {
+        name: d.key,
+        dataList: d.values
+      };
+    });
+    var layerNum = layData.length;
+    var largestLayer = -1;
+    var index = -1;
+
+    for (var i = 0; i < layerNum; ++i) {
+      var len = layData[i].dataList.length;
+
+      if (len > largestLayer) {
+        largestLayer = len;
+        index = i;
+      }
+    }
+
+    for (var k = 0; k < layerNum; ++k) {
+      if (k === index) {
+        continue;
+      }
+
+      var name = layData[k].name;
+
+      for (var j = 0; j < largestLayer; ++j) {
+        var timeValue = layData[index].dataList[j][0];
+        var length = layData[k].dataList.length;
+        var keyIndex = -1;
+
+        for (var l = 0; l < length; ++l) {
+          var value = layData[k].dataList[l][0];
+
+          if (value === timeValue) {
+            keyIndex = l;
+            break;
+          }
+        }
+
+        if (keyIndex === -1) {
+          data[rawDataLength] = [];
+          data[rawDataLength][0] = timeValue;
+          data[rawDataLength][1] = 0;
+          data[rawDataLength][2] = name;
+          rawDataLength++;
+        }
+      }
+    }
+
+    return data;
+  },
+
+  /**
+   * @override
+   * @param  {Object} option  the initial option that user gived
+   * @param  {module:echarts/model/Model} ecModel  the model object for themeRiver option
+   * @return {module:echarts/data/List}
+   */
+  getInitialData: function (option, ecModel) {
+    var singleAxisModel = ecModel.queryComponents({
+      mainType: 'singleAxis',
+      index: this.get('singleAxisIndex'),
+      id: this.get('singleAxisId')
+    })[0];
+    var axisType = singleAxisModel.get('type'); // filter the data item with the value of label is undefined
+
+    var filterData = filter(option.data, function (dataItem) {
+      return dataItem[2] !== undefined;
+    }); // ??? TODO design a stage to transfer data for themeRiver and lines?
+
+    var data = this.fixData(filterData || []);
+    var nameList = [];
+    var nameMap = this.nameMap = createHashMap();
+    var count = 0;
+
+    for (var i = 0; i < data.length; ++i) {
+      nameList.push(data[i][DATA_NAME_INDEX]);
+
+      if (!nameMap.get(data[i][DATA_NAME_INDEX])) {
+        nameMap.set(data[i][DATA_NAME_INDEX], count);
+        count++;
+      }
+    }
+
+    var dimensionsInfo = createDimensions(data, {
+      coordDimensions: ['single'],
+      dimensionsDefine: [{
+        name: 'time',
+        type: getDimensionTypeByAxis(axisType)
+      }, {
+        name: 'value',
+        type: 'float'
+      }, {
+        name: 'name',
+        type: 'ordinal'
+      }],
+      encodeDefine: {
+        single: 0,
+        value: 1,
+        itemName: 2
+      }
+    });
+    var list = new List(dimensionsInfo, this);
+    list.initData(data);
+    return list;
+  },
+
+  /**
+   * The raw data is divided into multiple layers and each layer
+   *     has same name.
+   *
+   * @return {Array.<Array.<number>>}
+   */
+  getLayerSeries: function () {
+    var data = this.getData();
+    var lenCount = data.count();
+    var indexArr = [];
+
+    for (var i = 0; i < lenCount; ++i) {
+      indexArr[i] = i;
+    } // data group by name
+
+
+    var dataByName = nest().key(function (index) {
+      return data.get('name', index);
+    }).entries(indexArr);
+    var layerSeries = map(dataByName, function (d) {
+      return {
+        name: d.key,
+        indices: d.values
+      };
+    });
+    var timeDim = data.mapDimension('single');
+
+    for (var j = 0; j < layerSeries.length; ++j) {
+      layerSeries[j].indices.sort(comparer);
+    }
+
+    function comparer(index1, index2) {
+      return data.get(timeDim, index1) - data.get(timeDim, index2);
+    }
+
+    return layerSeries;
+  },
+
+  /**
+   * Get data indices for show tooltip content
+   *
+   * @param {Array.<string>|string} dim  single coordinate dimension
+   * @param {number} value axis value
+   * @param {module:echarts/coord/single/SingleAxis} baseAxis  single Axis used
+   *     the themeRiver.
+   * @return {Object} {dataIndices, nestestValue}
+   */
+  getAxisTooltipData: function (dim, value, baseAxis) {
+    if (!isArray(dim)) {
+      dim = dim ? [dim] : [];
+    }
+
+    var data = this.getData();
+    var layerSeries = this.getLayerSeries();
+    var indices = [];
+    var layerNum = layerSeries.length;
+    var nestestValue;
+
+    for (var i = 0; i < layerNum; ++i) {
+      var minDist = Number.MAX_VALUE;
+      var nearestIdx = -1;
+      var pointNum = layerSeries[i].indices.length;
+
+      for (var j = 0; j < pointNum; ++j) {
+        var theValue = data.get(dim[0], layerSeries[i].indices[j]);
+        var dist = Math.abs(theValue - value);
+
+        if (dist <= minDist) {
+          nestestValue = theValue;
+          minDist = dist;
+          nearestIdx = layerSeries[i].indices[j];
+        }
+      }
+
+      indices.push(nearestIdx);
+    }
+
+    return {
+      dataIndices: indices,
+      nestestValue: nestestValue
+    };
+  },
+
+  /**
+   * @override
+   * @param {number} dataIndex  index of data
+   */
+  formatTooltip: function (dataIndex) {
+    var data = this.getData();
+    var htmlName = data.getName(dataIndex);
+    var htmlValue = data.get(data.mapDimension('value'), dataIndex);
+
+    if (isNaN(htmlValue) || htmlValue == null) {
+      htmlValue = '-';
+    }
+
+    return encodeHTML(htmlName + ' : ' + htmlValue);
+  },
+  defaultOption: {
+    zlevel: 0,
+    z: 2,
+    coordinateSystem: 'singleAxis',
+    // gap in axis's orthogonal orientation
+    boundaryGap: ['10%', '10%'],
+    // legendHoverLink: true,
+    singleAxisIndex: 0,
+    animationEasing: 'linear',
+    label: {
+      margin: 4,
+      show: true,
+      position: 'left',
+      color: '#000',
+      fontSize: 11
+    },
+    emphasis: {
+      label: {
+        show: true
+      }
+    }
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * @file  The file used to draw themeRiver view
+ * @author  Deqing Li(annong035@gmail.com)
+ */
+extendChartView({
+  type: 'themeRiver',
+  init: function () {
+    this._layers = [];
+  },
+  render: function (seriesModel, ecModel, api) {
+    var data = seriesModel.getData();
+    var group = this.group;
+    var layerSeries = seriesModel.getLayerSeries();
+    var layoutInfo = data.getLayout('layoutInfo');
+    var rect = layoutInfo.rect;
+    var boundaryGap = layoutInfo.boundaryGap;
+    group.attr('position', [0, rect.y + boundaryGap[0]]);
+
+    function keyGetter(item) {
+      return item.name;
+    }
+
+    var dataDiffer = new DataDiffer(this._layersSeries || [], layerSeries, keyGetter, keyGetter);
+    var newLayersGroups = {};
+    dataDiffer.add(bind(process, this, 'add')).update(bind(process, this, 'update')).remove(bind(process, this, 'remove')).execute();
+
+    function process(status, idx, oldIdx) {
+      var oldLayersGroups = this._layers;
+
+      if (status === 'remove') {
+        group.remove(oldLayersGroups[idx]);
+        return;
+      }
+
+      var points0 = [];
+      var points1 = [];
+      var color;
+      var indices = layerSeries[idx].indices;
+
+      for (var j = 0; j < indices.length; j++) {
+        var layout = data.getItemLayout(indices[j]);
+        var x = layout.x;
+        var y0 = layout.y0;
+        var y = layout.y;
+        points0.push([x, y0]);
+        points1.push([x, y0 + y]);
+        color = data.getItemVisual(indices[j], 'color');
+      }
+
+      var polygon;
+      var text;
+      var textLayout = data.getItemLayout(indices[0]);
+      var itemModel = data.getItemModel(indices[j - 1]);
+      var labelModel = itemModel.getModel('label');
+      var margin = labelModel.get('margin');
+
+      if (status === 'add') {
+        var layerGroup = newLayersGroups[idx] = new Group();
+        polygon = new Polygon$1({
+          shape: {
+            points: points0,
+            stackedOnPoints: points1,
+            smooth: 0.4,
+            stackedOnSmooth: 0.4,
+            smoothConstraint: false
+          },
+          z2: 0
+        });
+        text = new Text({
+          style: {
+            x: textLayout.x - margin,
+            y: textLayout.y0 + textLayout.y / 2
+          }
+        });
+        layerGroup.add(polygon);
+        layerGroup.add(text);
+        group.add(layerGroup);
+        polygon.setClipPath(createGridClipShape$3(polygon.getBoundingRect(), seriesModel, function () {
+          polygon.removeClipPath();
+        }));
+      } else {
+        var layerGroup = oldLayersGroups[oldIdx];
+        polygon = layerGroup.childAt(0);
+        text = layerGroup.childAt(1);
+        group.add(layerGroup);
+        newLayersGroups[idx] = layerGroup;
+        updateProps(polygon, {
+          shape: {
+            points: points0,
+            stackedOnPoints: points1
+          }
+        }, seriesModel);
+        updateProps(text, {
+          style: {
+            x: textLayout.x - margin,
+            y: textLayout.y0 + textLayout.y / 2
+          }
+        }, seriesModel);
+      }
+
+      var hoverItemStyleModel = itemModel.getModel('emphasis.itemStyle');
+      var itemStyleModel = itemModel.getModel('itemStyle');
+      setTextStyle(text.style, labelModel, {
+        text: labelModel.get('show') ? seriesModel.getFormattedLabel(indices[j - 1], 'normal') || data.getName(indices[j - 1]) : null,
+        textVerticalAlign: 'middle'
+      });
+      polygon.setStyle(extend({
+        fill: color
+      }, itemStyleModel.getItemStyle(['color'])));
+      setHoverStyle(polygon, hoverItemStyleModel.getItemStyle());
+    }
+
+    this._layersSeries = layerSeries;
+    this._layers = newLayersGroups;
+  },
+  dispose: function () {}
+}); // add animation to the view
+
+function createGridClipShape$3(rect, seriesModel, cb) {
+  var rectEl = new Rect({
+    shape: {
+      x: rect.x - 10,
+      y: rect.y - 10,
+      width: 0,
+      height: rect.height + 20
+    }
+  });
+  initProps(rectEl, {
+    shape: {
+      width: rect.width + 20,
+      height: rect.height + 20
+    }
+  }, seriesModel, cb);
+  return rectEl;
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * @file  Using layout algorithm transform the raw data to layout information.
+ * @author Deqing Li(annong035@gmail.com)
+ */
+var themeRiverLayout = function (ecModel, api) {
+  ecModel.eachSeriesByType('themeRiver', function (seriesModel) {
+    var data = seriesModel.getData();
+    var single = seriesModel.coordinateSystem;
+    var layoutInfo = {}; // use the axis boundingRect for view
+
+    var rect = single.getRect();
+    layoutInfo.rect = rect;
+    var boundaryGap = seriesModel.get('boundaryGap');
+    var axis = single.getAxis();
+    layoutInfo.boundaryGap = boundaryGap;
+
+    if (axis.orient === 'horizontal') {
+      boundaryGap[0] = parsePercent$1(boundaryGap[0], rect.height);
+      boundaryGap[1] = parsePercent$1(boundaryGap[1], rect.height);
+      var height = rect.height - boundaryGap[0] - boundaryGap[1];
+      themeRiverLayout$1(data, seriesModel, height);
+    } else {
+      boundaryGap[0] = parsePercent$1(boundaryGap[0], rect.width);
+      boundaryGap[1] = parsePercent$1(boundaryGap[1], rect.width);
+      var width = rect.width - boundaryGap[0] - boundaryGap[1];
+      themeRiverLayout$1(data, seriesModel, width);
+    }
+
+    data.setLayout('layoutInfo', layoutInfo);
+  });
+};
+/**
+ * The layout information about themeriver
+ *
+ * @param {module:echarts/data/List} data  data in the series
+ * @param {module:echarts/model/Series} seriesModel  the model object of themeRiver series
+ * @param {number} height  value used to compute every series height
+ */
+
+function themeRiverLayout$1(data, seriesModel, height) {
+  if (!data.count()) {
+    return;
+  }
+
+  var coordSys = seriesModel.coordinateSystem; // the data in each layer are organized into a series.
+
+  var layerSeries = seriesModel.getLayerSeries(); // the points in each layer.
+
+  var timeDim = data.mapDimension('single');
+  var valueDim = data.mapDimension('value');
+  var layerPoints = map(layerSeries, function (singleLayer) {
+    return map(singleLayer.indices, function (idx) {
+      var pt = coordSys.dataToPoint(data.get(timeDim, idx));
+      pt[1] = data.get(valueDim, idx);
+      return pt;
+    });
+  });
+  var base = computeBaseline(layerPoints);
+  var baseLine = base.y0;
+  var ky = height / base.max; // set layout information for each item.
+
+  var n = layerSeries.length;
+  var m = layerSeries[0].indices.length;
+  var baseY0;
+
+  for (var j = 0; j < m; ++j) {
+    baseY0 = baseLine[j] * ky;
+    data.setItemLayout(layerSeries[0].indices[j], {
+      layerIndex: 0,
+      x: layerPoints[0][j][0],
+      y0: baseY0,
+      y: layerPoints[0][j][1] * ky
+    });
+
+    for (var i = 1; i < n; ++i) {
+      baseY0 += layerPoints[i - 1][j][1] * ky;
+      data.setItemLayout(layerSeries[i].indices[j], {
+        layerIndex: i,
+        x: layerPoints[i][j][0],
+        y0: baseY0,
+        y: layerPoints[i][j][1] * ky
+      });
+    }
+  }
+}
+/**
+ * Compute the baseLine of the rawdata
+ * Inspired by Lee Byron's paper Stacked Graphs - Geometry & Aesthetics
+ *
+ * @param  {Array.<Array>} data  the points in each layer
+ * @return {Object}
+ */
+
+
+function computeBaseline(data) {
+  var layerNum = data.length;
+  var pointNum = data[0].length;
+  var sums = [];
+  var y0 = [];
+  var max = 0;
+  var temp;
+  var base = {};
+
+  for (var i = 0; i < pointNum; ++i) {
+    for (var j = 0, temp = 0; j < layerNum; ++j) {
+      temp += data[j][i][1];
+    }
+
+    if (temp > max) {
+      max = temp;
+    }
+
+    sums.push(temp);
+  }
+
+  for (var k = 0; k < pointNum; ++k) {
+    y0[k] = (max - sums[k]) / 2;
+  }
+
+  max = 0;
+
+  for (var l = 0; l < pointNum; ++l) {
+    var sum = sums[l] + y0[l];
+
+    if (sum > max) {
+      max = sum;
+    }
+  }
+
+  base.y0 = y0;
+  base.max = max;
+  return base;
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * @file Visual encoding for themeRiver view
+ * @author Deqing Li(annong035@gmail.com)
+ */
+var themeRiverVisual = function (ecModel) {
+  ecModel.eachSeriesByType('themeRiver', function (seriesModel) {
+    var data = seriesModel.getData();
+    var rawData = seriesModel.getRawData();
+    var colorList = seriesModel.get('color');
+    var idxMap = createHashMap();
+    data.each(function (idx) {
+      idxMap.set(data.getRawIndex(idx), idx);
+    });
+    rawData.each(function (rawIndex) {
+      var name = rawData.getName(rawIndex);
+      var color = colorList[(seriesModel.nameMap.get(name) - 1) % colorList.length];
+      rawData.setItemVisual(rawIndex, 'color', color);
+      var idx = idxMap.get(rawIndex);
+
+      if (idx != null) {
+        data.setItemVisual(idx, 'color', color);
+      }
+    });
+  });
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+registerLayout(themeRiverLayout);
+registerVisual(themeRiverVisual);
+registerProcessor(dataFilter('themeRiver'));
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var PictorialBarSeries = BaseBarSeries.extend({
+  type: 'series.pictorialBar',
+  dependencies: ['grid'],
+  defaultOption: {
+    symbol: 'circle',
+    // Customized bar shape
+    symbolSize: null,
+    // Can be ['100%', '100%'], null means auto.
+    symbolRotate: null,
+    symbolPosition: null,
+    // 'start' or 'end' or 'center', null means auto.
+    symbolOffset: null,
+    symbolMargin: null,
+    // start margin and end margin. Can be a number or a percent string.
+    // Auto margin by defualt.
+    symbolRepeat: false,
+    // false/null/undefined, means no repeat.
+    // Can be true, means auto calculate repeat times and cut by data.
+    // Can be a number, specifies repeat times, and do not cut by data.
+    // Can be 'fixed', means auto calculate repeat times but do not cut by data.
+    symbolRepeatDirection: 'end',
+    // 'end' means from 'start' to 'end'.
+    symbolClip: false,
+    symbolBoundingData: null,
+    // Can be 60 or -40 or [-40, 60]
+    symbolPatternSize: 400,
+    // 400 * 400 px
+    barGap: '-100%',
+    // In most case, overlap is needed.
+    // z can be set in data item, which is z2 actually.
+    // Disable progressive
+    progressive: 0,
+    hoverAnimation: false // Open only when needed.
+
+  },
+  getInitialData: function (option) {
+    // Disable stack.
+    option.stack = null;
+    return PictorialBarSeries.superApply(this, 'getInitialData', arguments);
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var BAR_BORDER_WIDTH_QUERY$1 = ['itemStyle', 'borderWidth']; // index: +isHorizontal
+
+var LAYOUT_ATTRS = [{
+  xy: 'x',
+  wh: 'width',
+  index: 0,
+  posDesc: ['left', 'right']
+}, {
+  xy: 'y',
+  wh: 'height',
+  index: 1,
+  posDesc: ['top', 'bottom']
+}];
+var pathForLineWidth = new Circle();
+var BarView$1 = extendChartView({
+  type: 'pictorialBar',
+  render: function (seriesModel, ecModel, api) {
+    var group = this.group;
+    var data = seriesModel.getData();
+    var oldData = this._data;
+    var cartesian = seriesModel.coordinateSystem;
+    var baseAxis = cartesian.getBaseAxis();
+    var isHorizontal = !!baseAxis.isHorizontal();
+    var coordSysRect = cartesian.grid.getRect();
+    var opt = {
+      ecSize: {
+        width: api.getWidth(),
+        height: api.getHeight()
+      },
+      seriesModel: seriesModel,
+      coordSys: cartesian,
+      coordSysExtent: [[coordSysRect.x, coordSysRect.x + coordSysRect.width], [coordSysRect.y, coordSysRect.y + coordSysRect.height]],
+      isHorizontal: isHorizontal,
+      valueDim: LAYOUT_ATTRS[+isHorizontal],
+      categoryDim: LAYOUT_ATTRS[1 - isHorizontal]
+    };
+    data.diff(oldData).add(function (dataIndex) {
+      if (!data.hasValue(dataIndex)) {
+        return;
+      }
+
+      var itemModel = getItemModel(data, dataIndex);
+      var symbolMeta = getSymbolMeta(data, dataIndex, itemModel, opt);
+      var bar = createBar(data, opt, symbolMeta);
+      data.setItemGraphicEl(dataIndex, bar);
+      group.add(bar);
+      updateCommon$1(bar, opt, symbolMeta);
+    }).update(function (newIndex, oldIndex) {
+      var bar = oldData.getItemGraphicEl(oldIndex);
+
+      if (!data.hasValue(newIndex)) {
+        group.remove(bar);
+        return;
+      }
+
+      var itemModel = getItemModel(data, newIndex);
+      var symbolMeta = getSymbolMeta(data, newIndex, itemModel, opt);
+      var pictorialShapeStr = getShapeStr(data, symbolMeta);
+
+      if (bar && pictorialShapeStr !== bar.__pictorialShapeStr) {
+        group.remove(bar);
+        data.setItemGraphicEl(newIndex, null);
+        bar = null;
+      }
+
+      if (bar) {
+        updateBar(bar, opt, symbolMeta);
+      } else {
+        bar = createBar(data, opt, symbolMeta, true);
+      }
+
+      data.setItemGraphicEl(newIndex, bar);
+      bar.__pictorialSymbolMeta = symbolMeta; // Add back
+
+      group.add(bar);
+      updateCommon$1(bar, opt, symbolMeta);
+    }).remove(function (dataIndex) {
+      var bar = oldData.getItemGraphicEl(dataIndex);
+      bar && removeBar(oldData, dataIndex, bar.__pictorialSymbolMeta.animationModel, bar);
+    }).execute();
+    this._data = data;
+    return this.group;
+  },
+  dispose: noop,
+  remove: function (ecModel, api) {
+    var group = this.group;
+    var data = this._data;
+
+    if (ecModel.get('animation')) {
+      if (data) {
+        data.eachItemGraphicEl(function (bar) {
+          removeBar(data, bar.dataIndex, ecModel, bar);
+        });
+      }
+    } else {
+      group.removeAll();
+    }
+  }
+}); // Set or calculate default value about symbol, and calculate layout info.
+
+function getSymbolMeta(data, dataIndex, itemModel, opt) {
+  var layout = data.getItemLayout(dataIndex);
+  var symbolRepeat = itemModel.get('symbolRepeat');
+  var symbolClip = itemModel.get('symbolClip');
+  var symbolPosition = itemModel.get('symbolPosition') || 'start';
+  var symbolRotate = itemModel.get('symbolRotate');
+  var rotation = (symbolRotate || 0) * Math.PI / 180 || 0;
+  var symbolPatternSize = itemModel.get('symbolPatternSize') || 2;
+  var isAnimationEnabled = itemModel.isAnimationEnabled();
+  var symbolMeta = {
+    dataIndex: dataIndex,
+    layout: layout,
+    itemModel: itemModel,
+    symbolType: data.getItemVisual(dataIndex, 'symbol') || 'circle',
+    color: data.getItemVisual(dataIndex, 'color'),
+    symbolClip: symbolClip,
+    symbolRepeat: symbolRepeat,
+    symbolRepeatDirection: itemModel.get('symbolRepeatDirection'),
+    symbolPatternSize: symbolPatternSize,
+    rotation: rotation,
+    animationModel: isAnimationEnabled ? itemModel : null,
+    hoverAnimation: isAnimationEnabled && itemModel.get('hoverAnimation'),
+    z2: itemModel.getShallow('z', true) || 0
+  };
+  prepareBarLength(itemModel, symbolRepeat, layout, opt, symbolMeta);
+  prepareSymbolSize(data, dataIndex, layout, symbolRepeat, symbolClip, symbolMeta.boundingLength, symbolMeta.pxSign, symbolPatternSize, opt, symbolMeta);
+  prepareLineWidth(itemModel, symbolMeta.symbolScale, rotation, opt, symbolMeta);
+  var symbolSize = symbolMeta.symbolSize;
+  var symbolOffset = itemModel.get('symbolOffset');
+
+  if (isArray(symbolOffset)) {
+    symbolOffset = [parsePercent$1(symbolOffset[0], symbolSize[0]), parsePercent$1(symbolOffset[1], symbolSize[1])];
+  }
+
+  prepareLayoutInfo(itemModel, symbolSize, layout, symbolRepeat, symbolClip, symbolOffset, symbolPosition, symbolMeta.valueLineWidth, symbolMeta.boundingLength, symbolMeta.repeatCutLength, opt, symbolMeta);
+  return symbolMeta;
+} // bar length can be negative.
+
+
+function prepareBarLength(itemModel, symbolRepeat, layout, opt, output) {
+  var valueDim = opt.valueDim;
+  var symbolBoundingData = itemModel.get('symbolBoundingData');
+  var valueAxis = opt.coordSys.getOtherAxis(opt.coordSys.getBaseAxis());
+  var zeroPx = valueAxis.toGlobalCoord(valueAxis.dataToCoord(0));
+  var pxSignIdx = 1 - +(layout[valueDim.wh] <= 0);
+  var boundingLength;
+
+  if (isArray(symbolBoundingData)) {
+    var symbolBoundingExtent = [convertToCoordOnAxis(valueAxis, symbolBoundingData[0]) - zeroPx, convertToCoordOnAxis(valueAxis, symbolBoundingData[1]) - zeroPx];
+    symbolBoundingExtent[1] < symbolBoundingExtent[0] && symbolBoundingExtent.reverse();
+    boundingLength = symbolBoundingExtent[pxSignIdx];
+  } else if (symbolBoundingData != null) {
+    boundingLength = convertToCoordOnAxis(valueAxis, symbolBoundingData) - zeroPx;
+  } else if (symbolRepeat) {
+    boundingLength = opt.coordSysExtent[valueDim.index][pxSignIdx] - zeroPx;
+  } else {
+    boundingLength = layout[valueDim.wh];
+  }
+
+  output.boundingLength = boundingLength;
+
+  if (symbolRepeat) {
+    output.repeatCutLength = layout[valueDim.wh];
+  }
+
+  output.pxSign = boundingLength > 0 ? 1 : boundingLength < 0 ? -1 : 0;
+}
+
+function convertToCoordOnAxis(axis, value) {
+  return axis.toGlobalCoord(axis.dataToCoord(axis.scale.parse(value)));
+} // Support ['100%', '100%']
+
+
+function prepareSymbolSize(data, dataIndex, layout, symbolRepeat, symbolClip, boundingLength, pxSign, symbolPatternSize, opt, output) {
+  var valueDim = opt.valueDim;
+  var categoryDim = opt.categoryDim;
+  var categorySize = Math.abs(layout[categoryDim.wh]);
+  var symbolSize = data.getItemVisual(dataIndex, 'symbolSize');
+
+  if (isArray(symbolSize)) {
+    symbolSize = symbolSize.slice();
+  } else {
+    if (symbolSize == null) {
+      symbolSize = '100%';
+    }
+
+    symbolSize = [symbolSize, symbolSize];
+  } // Note: percentage symbolSize (like '100%') do not consider lineWidth, because it is
+  // to complicated to calculate real percent value if considering scaled lineWidth.
+  // So the actual size will bigger than layout size if lineWidth is bigger than zero,
+  // which can be tolerated in pictorial chart.
+
+
+  symbolSize[categoryDim.index] = parsePercent$1(symbolSize[categoryDim.index], categorySize);
+  symbolSize[valueDim.index] = parsePercent$1(symbolSize[valueDim.index], symbolRepeat ? categorySize : Math.abs(boundingLength));
+  output.symbolSize = symbolSize; // If x or y is less than zero, show reversed shape.
+
+  var symbolScale = output.symbolScale = [symbolSize[0] / symbolPatternSize, symbolSize[1] / symbolPatternSize]; // Follow convention, 'right' and 'top' is the normal scale.
+
+  symbolScale[valueDim.index] *= (opt.isHorizontal ? -1 : 1) * pxSign;
+}
+
+function prepareLineWidth(itemModel, symbolScale, rotation, opt, output) {
+  // In symbols are drawn with scale, so do not need to care about the case that width
+  // or height are too small. But symbol use strokeNoScale, where acture lineWidth should
+  // be calculated.
+  var valueLineWidth = itemModel.get(BAR_BORDER_WIDTH_QUERY$1) || 0;
+
+  if (valueLineWidth) {
+    pathForLineWidth.attr({
+      scale: symbolScale.slice(),
+      rotation: rotation
+    });
+    pathForLineWidth.updateTransform();
+    valueLineWidth /= pathForLineWidth.getLineScale();
+    valueLineWidth *= symbolScale[opt.valueDim.index];
+  }
+
+  output.valueLineWidth = valueLineWidth;
+}
+
+function prepareLayoutInfo(itemModel, symbolSize, layout, symbolRepeat, symbolClip, symbolOffset, symbolPosition, valueLineWidth, boundingLength, repeatCutLength, opt, output) {
+  var categoryDim = opt.categoryDim;
+  var valueDim = opt.valueDim;
+  var pxSign = output.pxSign;
+  var unitLength = Math.max(symbolSize[valueDim.index] + valueLineWidth, 0);
+  var pathLen = unitLength; // Note: rotation will not effect the layout of symbols, because user may
+  // want symbols to rotate on its center, which should not be translated
+  // when rotating.
+
+  if (symbolRepeat) {
+    var absBoundingLength = Math.abs(boundingLength);
+    var symbolMargin = retrieve(itemModel.get('symbolMargin'), '15%') + '';
+    var hasEndGap = false;
+
+    if (symbolMargin.lastIndexOf('!') === symbolMargin.length - 1) {
+      hasEndGap = true;
+      symbolMargin = symbolMargin.slice(0, symbolMargin.length - 1);
+    }
+
+    symbolMargin = parsePercent$1(symbolMargin, symbolSize[valueDim.index]);
+    var uLenWithMargin = Math.max(unitLength + symbolMargin * 2, 0); // When symbol margin is less than 0, margin at both ends will be subtracted
+    // to ensure that all of the symbols will not be overflow the given area.
+
+    var endFix = hasEndGap ? 0 : symbolMargin * 2; // Both final repeatTimes and final symbolMargin area calculated based on
+    // boundingLength.
+
+    var repeatSpecified = isNumeric(symbolRepeat);
+    var repeatTimes = repeatSpecified ? symbolRepeat : toIntTimes((absBoundingLength + endFix) / uLenWithMargin); // Adjust calculate margin, to ensure each symbol is displayed
+    // entirely in the given layout area.
+
+    var mDiff = absBoundingLength - repeatTimes * unitLength;
+    symbolMargin = mDiff / 2 / (hasEndGap ? repeatTimes : repeatTimes - 1);
+    uLenWithMargin = unitLength + symbolMargin * 2;
+    endFix = hasEndGap ? 0 : symbolMargin * 2; // Update repeatTimes when not all symbol will be shown.
+
+    if (!repeatSpecified && symbolRepeat !== 'fixed') {
+      repeatTimes = repeatCutLength ? toIntTimes((Math.abs(repeatCutLength) + endFix) / uLenWithMargin) : 0;
+    }
+
+    pathLen = repeatTimes * uLenWithMargin - endFix;
+    output.repeatTimes = repeatTimes;
+    output.symbolMargin = symbolMargin;
+  }
+
+  var sizeFix = pxSign * (pathLen / 2);
+  var pathPosition = output.pathPosition = [];
+  pathPosition[categoryDim.index] = layout[categoryDim.wh] / 2;
+  pathPosition[valueDim.index] = symbolPosition === 'start' ? sizeFix : symbolPosition === 'end' ? boundingLength - sizeFix : boundingLength / 2; // 'center'
+
+  if (symbolOffset) {
+    pathPosition[0] += symbolOffset[0];
+    pathPosition[1] += symbolOffset[1];
+  }
+
+  var bundlePosition = output.bundlePosition = [];
+  bundlePosition[categoryDim.index] = layout[categoryDim.xy];
+  bundlePosition[valueDim.index] = layout[valueDim.xy];
+  var barRectShape = output.barRectShape = extend({}, layout);
+  barRectShape[valueDim.wh] = pxSign * Math.max(Math.abs(layout[valueDim.wh]), Math.abs(pathPosition[valueDim.index] + sizeFix));
+  barRectShape[categoryDim.wh] = layout[categoryDim.wh];
+  var clipShape = output.clipShape = {}; // Consider that symbol may be overflow layout rect.
+
+  clipShape[categoryDim.xy] = -layout[categoryDim.xy];
+  clipShape[categoryDim.wh] = opt.ecSize[categoryDim.wh];
+  clipShape[valueDim.xy] = 0;
+  clipShape[valueDim.wh] = layout[valueDim.wh];
+}
+
+function createPath(symbolMeta) {
+  var symbolPatternSize = symbolMeta.symbolPatternSize;
+  var path = createSymbol( // Consider texture img, make a big size.
+  symbolMeta.symbolType, -symbolPatternSize / 2, -symbolPatternSize / 2, symbolPatternSize, symbolPatternSize, symbolMeta.color);
+  path.attr({
+    culling: true
+  });
+  path.type !== 'image' && path.setStyle({
+    strokeNoScale: true
+  });
+  return path;
+}
+
+function createOrUpdateRepeatSymbols(bar, opt, symbolMeta, isUpdate) {
+  var bundle = bar.__pictorialBundle;
+  var symbolSize = symbolMeta.symbolSize;
+  var valueLineWidth = symbolMeta.valueLineWidth;
+  var pathPosition = symbolMeta.pathPosition;
+  var valueDim = opt.valueDim;
+  var repeatTimes = symbolMeta.repeatTimes || 0;
+  var index = 0;
+  var unit = symbolSize[opt.valueDim.index] + valueLineWidth + symbolMeta.symbolMargin * 2;
+  eachPath(bar, function (path) {
+    path.__pictorialAnimationIndex = index;
+    path.__pictorialRepeatTimes = repeatTimes;
+
+    if (index < repeatTimes) {
+      updateAttr(path, null, makeTarget(index), symbolMeta, isUpdate);
+    } else {
+      updateAttr(path, null, {
+        scale: [0, 0]
+      }, symbolMeta, isUpdate, function () {
+        bundle.remove(path);
+      });
+    }
+
+    updateHoverAnimation(path, symbolMeta);
+    index++;
+  });
+
+  for (; index < repeatTimes; index++) {
+    var path = createPath(symbolMeta);
+    path.__pictorialAnimationIndex = index;
+    path.__pictorialRepeatTimes = repeatTimes;
+    bundle.add(path);
+    var target = makeTarget(index);
+    updateAttr(path, {
+      position: target.position,
+      scale: [0, 0]
+    }, {
+      scale: target.scale,
+      rotation: target.rotation
+    }, symbolMeta, isUpdate); // FIXME
+    // If all emphasis/normal through action.
+
+    path.on('mouseover', onMouseOver).on('mouseout', onMouseOut);
+    updateHoverAnimation(path, symbolMeta);
+  }
+
+  function makeTarget(index) {
+    var position = pathPosition.slice(); // (start && pxSign > 0) || (end && pxSign < 0): i = repeatTimes - index
+    // Otherwise: i = index;
+
+    var pxSign = symbolMeta.pxSign;
+    var i = index;
+
+    if (symbolMeta.symbolRepeatDirection === 'start' ? pxSign > 0 : pxSign < 0) {
+      i = repeatTimes - 1 - index;
+    }
+
+    position[valueDim.index] = unit * (i - repeatTimes / 2 + 0.5) + pathPosition[valueDim.index];
+    return {
+      position: position,
+      scale: symbolMeta.symbolScale.slice(),
+      rotation: symbolMeta.rotation
+    };
+  }
+
+  function onMouseOver() {
+    eachPath(bar, function (path) {
+      path.trigger('emphasis');
+    });
+  }
+
+  function onMouseOut() {
+    eachPath(bar, function (path) {
+      path.trigger('normal');
+    });
+  }
+}
+
+function createOrUpdateSingleSymbol(bar, opt, symbolMeta, isUpdate) {
+  var bundle = bar.__pictorialBundle;
+  var mainPath = bar.__pictorialMainPath;
+
+  if (!mainPath) {
+    mainPath = bar.__pictorialMainPath = createPath(symbolMeta);
+    bundle.add(mainPath);
+    updateAttr(mainPath, {
+      position: symbolMeta.pathPosition.slice(),
+      scale: [0, 0],
+      rotation: symbolMeta.rotation
+    }, {
+      scale: symbolMeta.symbolScale.slice()
+    }, symbolMeta, isUpdate);
+    mainPath.on('mouseover', onMouseOver).on('mouseout', onMouseOut);
+  } else {
+    updateAttr(mainPath, null, {
+      position: symbolMeta.pathPosition.slice(),
+      scale: symbolMeta.symbolScale.slice(),
+      rotation: symbolMeta.rotation
+    }, symbolMeta, isUpdate);
+  }
+
+  updateHoverAnimation(mainPath, symbolMeta);
+
+  function onMouseOver() {
+    this.trigger('emphasis');
+  }
+
+  function onMouseOut() {
+    this.trigger('normal');
+  }
+} // bar rect is used for label.
+
+
+function createOrUpdateBarRect(bar, symbolMeta, isUpdate) {
+  var rectShape = extend({}, symbolMeta.barRectShape);
+  var barRect = bar.__pictorialBarRect;
+
+  if (!barRect) {
+    barRect = bar.__pictorialBarRect = new Rect({
+      z2: 2,
+      shape: rectShape,
+      silent: true,
+      style: {
+        stroke: 'transparent',
+        fill: 'transparent',
+        lineWidth: 0
+      }
+    });
+    bar.add(barRect);
+  } else {
+    updateAttr(barRect, null, {
+      shape: rectShape
+    }, symbolMeta, isUpdate);
+  }
+}
+
+function createOrUpdateClip(bar, opt, symbolMeta, isUpdate) {
+  // If not clip, symbol will be remove and rebuilt.
+  if (symbolMeta.symbolClip) {
+    var clipPath = bar.__pictorialClipPath;
+    var clipShape = extend({}, symbolMeta.clipShape);
+    var valueDim = opt.valueDim;
+    var animationModel = symbolMeta.animationModel;
+    var dataIndex = symbolMeta.dataIndex;
+
+    if (clipPath) {
+      updateProps(clipPath, {
+        shape: clipShape
+      }, animationModel, dataIndex);
+    } else {
+      clipShape[valueDim.wh] = 0;
+      clipPath = new Rect({
+        shape: clipShape
+      });
+
+      bar.__pictorialBundle.setClipPath(clipPath);
+
+      bar.__pictorialClipPath = clipPath;
+      var target = {};
+      target[valueDim.wh] = symbolMeta.clipShape[valueDim.wh];
+      graphicUtil[isUpdate ? 'updateProps' : 'initProps'](clipPath, {
+        shape: target
+      }, animationModel, dataIndex);
+    }
+  }
+}
+
+function getItemModel(data, dataIndex) {
+  var itemModel = data.getItemModel(dataIndex);
+  itemModel.getAnimationDelayParams = getAnimationDelayParams;
+  itemModel.isAnimationEnabled = isAnimationEnabled;
+  return itemModel;
+}
+
+function getAnimationDelayParams(path) {
+  // The order is the same as the z-order, see `symbolRepeatDiretion`.
+  return {
+    index: path.__pictorialAnimationIndex,
+    count: path.__pictorialRepeatTimes
+  };
+}
+
+function isAnimationEnabled() {
+  // `animation` prop can be set on itemModel in pictorial bar chart.
+  return this.parentModel.isAnimationEnabled() && !!this.getShallow('animation');
+}
+
+function updateHoverAnimation(path, symbolMeta) {
+  path.off('emphasis').off('normal');
+  var scale = symbolMeta.symbolScale.slice();
+  symbolMeta.hoverAnimation && path.on('emphasis', function () {
+    this.animateTo({
+      scale: [scale[0] * 1.1, scale[1] * 1.1]
+    }, 400, 'elasticOut');
+  }).on('normal', function () {
+    this.animateTo({
+      scale: scale.slice()
+    }, 400, 'elasticOut');
+  });
+}
+
+function createBar(data, opt, symbolMeta, isUpdate) {
+  // bar is the main element for each data.
+  var bar = new Group(); // bundle is used for location and clip.
+
+  var bundle = new Group();
+  bar.add(bundle);
+  bar.__pictorialBundle = bundle;
+  bundle.attr('position', symbolMeta.bundlePosition.slice());
+
+  if (symbolMeta.symbolRepeat) {
+    createOrUpdateRepeatSymbols(bar, opt, symbolMeta);
+  } else {
+    createOrUpdateSingleSymbol(bar, opt, symbolMeta);
+  }
+
+  createOrUpdateBarRect(bar, symbolMeta, isUpdate);
+  createOrUpdateClip(bar, opt, symbolMeta, isUpdate);
+  bar.__pictorialShapeStr = getShapeStr(data, symbolMeta);
+  bar.__pictorialSymbolMeta = symbolMeta;
+  return bar;
+}
+
+function updateBar(bar, opt, symbolMeta) {
+  var animationModel = symbolMeta.animationModel;
+  var dataIndex = symbolMeta.dataIndex;
+  var bundle = bar.__pictorialBundle;
+  updateProps(bundle, {
+    position: symbolMeta.bundlePosition.slice()
+  }, animationModel, dataIndex);
+
+  if (symbolMeta.symbolRepeat) {
+    createOrUpdateRepeatSymbols(bar, opt, symbolMeta, true);
+  } else {
+    createOrUpdateSingleSymbol(bar, opt, symbolMeta, true);
+  }
+
+  createOrUpdateBarRect(bar, symbolMeta, true);
+  createOrUpdateClip(bar, opt, symbolMeta, true);
+}
+
+function removeBar(data, dataIndex, animationModel, bar) {
+  // Not show text when animating
+  var labelRect = bar.__pictorialBarRect;
+  labelRect && (labelRect.style.text = null);
+  var pathes = [];
+  eachPath(bar, function (path) {
+    pathes.push(path);
+  });
+  bar.__pictorialMainPath && pathes.push(bar.__pictorialMainPath); // I do not find proper remove animation for clip yet.
+
+  bar.__pictorialClipPath && (animationModel = null);
+  each$1(pathes, function (path) {
+    updateProps(path, {
+      scale: [0, 0]
+    }, animationModel, dataIndex, function () {
+      bar.parent && bar.parent.remove(bar);
+    });
+  });
+  data.setItemGraphicEl(dataIndex, null);
+}
+
+function getShapeStr(data, symbolMeta) {
+  return [data.getItemVisual(symbolMeta.dataIndex, 'symbol') || 'none', !!symbolMeta.symbolRepeat, !!symbolMeta.symbolClip].join(':');
+}
+
+function eachPath(bar, cb, context) {
+  // Do not use Group#eachChild, because it do not support remove.
+  each$1(bar.__pictorialBundle.children(), function (el) {
+    el !== bar.__pictorialBarRect && cb.call(context, el);
+  });
+}
+
+function updateAttr(el, immediateAttrs, animationAttrs, symbolMeta, isUpdate, cb) {
+  immediateAttrs && el.attr(immediateAttrs); // when symbolCip used, only clip path has init animation, otherwise it would be weird effect.
+
+  if (symbolMeta.symbolClip && !isUpdate) {
+    animationAttrs && el.attr(animationAttrs);
+  } else {
+    animationAttrs && graphicUtil[isUpdate ? 'updateProps' : 'initProps'](el, animationAttrs, symbolMeta.animationModel, symbolMeta.dataIndex, cb);
+  }
+}
+
+function updateCommon$1(bar, opt, symbolMeta) {
+  var color = symbolMeta.color;
+  var dataIndex = symbolMeta.dataIndex;
+  var itemModel = symbolMeta.itemModel; // Color must be excluded.
+  // Because symbol provide setColor individually to set fill and stroke
+
+  var normalStyle = itemModel.getModel('itemStyle').getItemStyle(['color']);
+  var hoverStyle = itemModel.getModel('emphasis.itemStyle').getItemStyle();
+  var cursorStyle = itemModel.getShallow('cursor');
+  eachPath(bar, function (path) {
+    // PENDING setColor should be before setStyle!!!
+    path.setColor(color);
+    path.setStyle(defaults({
+      fill: color,
+      opacity: symbolMeta.opacity
+    }, normalStyle));
+    setHoverStyle(path, hoverStyle);
+    cursorStyle && (path.cursor = cursorStyle);
+    path.z2 = symbolMeta.z2;
+  });
+  var barRectHoverStyle = {};
+  var barPositionOutside = opt.valueDim.posDesc[+(symbolMeta.boundingLength > 0)];
+  var barRect = bar.__pictorialBarRect;
+  setLabel(barRect.style, barRectHoverStyle, itemModel, color, opt.seriesModel, dataIndex, barPositionOutside);
+  setHoverStyle(barRect, barRectHoverStyle);
+}
+
+function toIntTimes(times) {
+  var roundedTimes = Math.round(times); // Escapse accurate error
+
+  return Math.abs(times - roundedTimes) < 1e-4 ? roundedTimes : Math.ceil(times);
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+registerLayout(curry(layout, 'pictorialBar'));
+registerVisual(visualSymbol('pictorialBar', 'roundRect'));
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+function dataToCoordSize(dataSize, dataItem) {
+  // dataItem is necessary in log axis.
+  dataItem = dataItem || [0, 0];
+  return map(['x', 'y'], function (dim, dimIdx) {
+    var axis = this.getAxis(dim);
+    var val = dataItem[dimIdx];
+    var halfSize = dataSize[dimIdx] / 2;
+    return axis.type === 'category' ? axis.getBandWidth() : Math.abs(axis.dataToCoord(val - halfSize) - axis.dataToCoord(val + halfSize));
+  }, this);
+}
+
+var prepareCartesian2d = function (coordSys) {
+  var rect = coordSys.grid.getRect();
+  return {
+    coordSys: {
+      // The name exposed to user is always 'cartesian2d' but not 'grid'.
+      type: 'cartesian2d',
+      x: rect.x,
+      y: rect.y,
+      width: rect.width,
+      height: rect.height
+    },
+    api: {
+      coord: function (data) {
+        // do not provide "out" param
+        return coordSys.dataToPoint(data);
+      },
+      size: bind(dataToCoordSize, coordSys)
+    }
+  };
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+function dataToCoordSize$1(dataSize, dataItem) {
+  dataItem = dataItem || [0, 0];
+  return map([0, 1], function (dimIdx) {
+    var val = dataItem[dimIdx];
+    var halfSize = dataSize[dimIdx] / 2;
+    var p1 = [];
+    var p2 = [];
+    p1[dimIdx] = val - halfSize;
+    p2[dimIdx] = val + halfSize;
+    p1[1 - dimIdx] = p2[1 - dimIdx] = dataItem[1 - dimIdx];
+    return Math.abs(this.dataToPoint(p1)[dimIdx] - this.dataToPoint(p2)[dimIdx]);
+  }, this);
+}
+
+var prepareGeo = function (coordSys) {
+  var rect = coordSys.getBoundingRect();
+  return {
+    coordSys: {
+      type: 'geo',
+      x: rect.x,
+      y: rect.y,
+      width: rect.width,
+      height: rect.height,
+      zoom: coordSys.getZoom()
+    },
+    api: {
+      coord: function (data) {
+        // do not provide "out" and noRoam param,
+        // Compatible with this usage:
+        // echarts.util.map(item.points, api.coord)
+        return coordSys.dataToPoint(data);
+      },
+      size: bind(dataToCoordSize$1, coordSys)
+    }
+  };
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+function dataToCoordSize$2(dataSize, dataItem) {
+  // dataItem is necessary in log axis.
+  var axis = this.getAxis();
+  var val = dataItem instanceof Array ? dataItem[0] : dataItem;
+  var halfSize = (dataSize instanceof Array ? dataSize[0] : dataSize) / 2;
+  return axis.type === 'category' ? axis.getBandWidth() : Math.abs(axis.dataToCoord(val - halfSize) - axis.dataToCoord(val + halfSize));
+}
+
+var prepareSingleAxis = function (coordSys) {
+  var rect = coordSys.getRect();
+  return {
+    coordSys: {
+      type: 'singleAxis',
+      x: rect.x,
+      y: rect.y,
+      width: rect.width,
+      height: rect.height
+    },
+    api: {
+      coord: function (val) {
+        // do not provide "out" param
+        return coordSys.dataToPoint(val);
+      },
+      size: bind(dataToCoordSize$2, coordSys)
+    }
+  };
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+function dataToCoordSize$3(dataSize, dataItem) {
+  // dataItem is necessary in log axis.
+  return map(['Radius', 'Angle'], function (dim, dimIdx) {
+    var axis = this['get' + dim + 'Axis']();
+    var val = dataItem[dimIdx];
+    var halfSize = dataSize[dimIdx] / 2;
+    var method = 'dataTo' + dim;
+    var result = axis.type === 'category' ? axis.getBandWidth() : Math.abs(axis[method](val - halfSize) - axis[method](val + halfSize));
+
+    if (dim === 'Angle') {
+      result = result * Math.PI / 180;
+    }
+
+    return result;
+  }, this);
+}
+
+var preparePolar = function (coordSys) {
+  var radiusAxis = coordSys.getRadiusAxis();
+  var angleAxis = coordSys.getAngleAxis();
+  var radius = radiusAxis.getExtent();
+  radius[0] > radius[1] && radius.reverse();
+  return {
+    coordSys: {
+      type: 'polar',
+      cx: coordSys.cx,
+      cy: coordSys.cy,
+      r: radius[1],
+      r0: radius[0]
+    },
+    api: {
+      coord: bind(function (data) {
+        var radius = radiusAxis.dataToRadius(data[0]);
+        var angle = angleAxis.dataToAngle(data[1]);
+        var coord = coordSys.coordToPoint([radius, angle]);
+        coord.push(radius, angle * Math.PI / 180);
+        return coord;
+      }),
+      size: bind(dataToCoordSize$3, coordSys)
+    }
+  };
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var prepareCalendar = function (coordSys) {
+  var rect = coordSys.getRect();
+  var rangeInfo = coordSys.getRangeInfo();
+  return {
+    coordSys: {
+      type: 'calendar',
+      x: rect.x,
+      y: rect.y,
+      width: rect.width,
+      height: rect.height,
+      cellWidth: coordSys.getCellWidth(),
+      cellHeight: coordSys.getCellHeight(),
+      rangeInfo: {
+        start: rangeInfo.start,
+        end: rangeInfo.end,
+        weeks: rangeInfo.weeks,
+        dayCount: rangeInfo.allDay
+      }
+    },
+    api: {
+      coord: function (data, clamp) {
+        return coordSys.dataToPoint(data, clamp);
+      }
+    }
+  };
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var ITEM_STYLE_NORMAL_PATH = ['itemStyle'];
+var ITEM_STYLE_EMPHASIS_PATH = ['emphasis', 'itemStyle'];
+var LABEL_NORMAL = ['label'];
+var LABEL_EMPHASIS = ['emphasis', 'label']; // Use prefix to avoid index to be the same as el.name,
+// which will cause weird udpate animation.
+
+var GROUP_DIFF_PREFIX = 'e\0\0';
+/**
+ * To reduce total package size of each coordinate systems, the modules `prepareCustom`
+ * of each coordinate systems are not required by each coordinate systems directly, but
+ * required by the module `custom`.
+ *
+ * prepareInfoForCustomSeries {Function}: optional
+ *     @return {Object} {coordSys: {...}, api: {
+ *         coord: function (data, clamp) {}, // return point in global.
+ *         size: function (dataSize, dataItem) {} // return size of each axis in coordSys.
+ *     }}
+ */
+
+var prepareCustoms = {
+  cartesian2d: prepareCartesian2d,
+  geo: prepareGeo,
+  singleAxis: prepareSingleAxis,
+  polar: preparePolar,
+  calendar: prepareCalendar
+}; // ------
+// Model
+// ------
+
+SeriesModel.extend({
+  type: 'series.custom',
+  dependencies: ['grid', 'polar', 'geo', 'singleAxis', 'calendar'],
+  defaultOption: {
+    coordinateSystem: 'cartesian2d',
+    // Can be set as 'none'
+    zlevel: 0,
+    z: 2,
+    legendHoverLink: true,
+    useTransform: true // Cartesian coordinate system
+    // xAxisIndex: 0,
+    // yAxisIndex: 0,
+    // Polar coordinate system
+    // polarIndex: 0,
+    // Geo coordinate system
+    // geoIndex: 0,
+    // label: {}
+    // itemStyle: {}
+
+  },
+
+  /**
+   * @override
+   */
+  getInitialData: function (option, ecModel) {
+    return createListFromArray(this.getSource(), this);
+  },
+
+  /**
+   * @override
+   */
+  getDataParams: function (dataIndex, dataType, el) {
+    var params = SeriesModel.prototype.getDataParams.apply(this, arguments);
+    el && (params.info = el.info);
+    return params;
+  }
+}); // -----
+// View
+// -----
+
+Chart.extend({
+  type: 'custom',
+
+  /**
+   * @private
+   * @type {module:echarts/data/List}
+   */
+  _data: null,
+
+  /**
+   * @override
+   */
+  render: function (customSeries, ecModel, api, payload) {
+    var oldData = this._data;
+    var data = customSeries.getData();
+    var group = this.group;
+    var renderItem = makeRenderItem(customSeries, data, ecModel, api); // By default, merge mode is applied. In most cases, custom series is
+    // used in the scenario that data amount is not large but graphic elements
+    // is complicated, where merge mode is probably necessary for optimization.
+    // For example, reuse graphic elements and only update the transform when
+    // roam or data zoom according to `actionType`.
+
+    data.diff(oldData).add(function (newIdx) {
+      createOrUpdate$1(null, newIdx, renderItem(newIdx, payload), customSeries, group, data);
+    }).update(function (newIdx, oldIdx) {
+      var el = oldData.getItemGraphicEl(oldIdx);
+      createOrUpdate$1(el, newIdx, renderItem(newIdx, payload), customSeries, group, data);
+    }).remove(function (oldIdx) {
+      var el = oldData.getItemGraphicEl(oldIdx);
+      el && group.remove(el);
+    }).execute();
+    this._data = data;
+  },
+  incrementalPrepareRender: function (customSeries, ecModel, api) {
+    this.group.removeAll();
+    this._data = null;
+  },
+  incrementalRender: function (params, customSeries, ecModel, api, payload) {
+    var data = customSeries.getData();
+    var renderItem = makeRenderItem(customSeries, data, ecModel, api);
+
+    function setIncrementalAndHoverLayer(el) {
+      if (!el.isGroup) {
+        el.incremental = true;
+        el.useHoverLayer = true;
+      }
+    }
+
+    for (var idx = params.start; idx < params.end; idx++) {
+      var el = createOrUpdate$1(null, idx, renderItem(idx, payload), customSeries, this.group, data);
+      el.traverse(setIncrementalAndHoverLayer);
+    }
+  },
+
+  /**
+   * @override
+   */
+  dispose: noop,
+
+  /**
+   * @override
+   */
+  filterForExposedEvent: function (eventType, query, targetEl, packedEvent) {
+    var elementName = query.element;
+
+    if (elementName == null || targetEl.name === elementName) {
+      return true;
+    } // Enable to give a name on a group made by `renderItem`, and listen
+    // events that triggerd by its descendents.
+
+
+    while ((targetEl = targetEl.parent) && targetEl !== this.group) {
+      if (targetEl.name === elementName) {
+        return true;
+      }
+    }
+
+    return false;
+  }
+});
+
+function createEl(elOption) {
+  var graphicType = elOption.type;
+  var el;
+
+  if (graphicType === 'path') {
+    var shape = elOption.shape; // Using pathRect brings convenience to users sacle svg path.
+
+    var pathRect = shape.width != null && shape.height != null ? {
+      x: shape.x || 0,
+      y: shape.y || 0,
+      width: shape.width,
+      height: shape.height
+    } : null;
+    var pathData = getPathData(shape); // Path is also used for icon, so layout 'center' by default.
+
+    el = makePath(pathData, null, pathRect, shape.layout || 'center');
+    el.__customPathData = pathData;
+  } else if (graphicType === 'image') {
+    el = new ZImage({});
+    el.__customImagePath = elOption.style.image;
+  } else if (graphicType === 'text') {
+    el = new Text({});
+    el.__customText = elOption.style.text;
+  } else {
+    var Clz = graphicUtil[graphicType.charAt(0).toUpperCase() + graphicType.slice(1)];
+    el = new Clz();
+  }
+
+  el.__customGraphicType = graphicType;
+  el.name = elOption.name;
+  return el;
+}
+
+function updateEl(el, dataIndex, elOption, animatableModel, data, isInit, isRoot) {
+  var transitionProps = {};
+  var elOptionStyle = elOption.style || {};
+  elOption.shape && (transitionProps.shape = clone(elOption.shape));
+  elOption.position && (transitionProps.position = elOption.position.slice());
+  elOption.scale && (transitionProps.scale = elOption.scale.slice());
+  elOption.origin && (transitionProps.origin = elOption.origin.slice());
+  elOption.rotation && (transitionProps.rotation = elOption.rotation);
+
+  if (el.type === 'image' && elOption.style) {
+    var targetStyle = transitionProps.style = {};
+    each$1(['x', 'y', 'width', 'height'], function (prop) {
+      prepareStyleTransition(prop, targetStyle, elOptionStyle, el.style, isInit);
+    });
+  }
+
+  if (el.type === 'text' && elOption.style) {
+    var targetStyle = transitionProps.style = {};
+    each$1(['x', 'y'], function (prop) {
+      prepareStyleTransition(prop, targetStyle, elOptionStyle, el.style, isInit);
+    }); // Compatible with previous: both support
+    // textFill and fill, textStroke and stroke in 'text' element.
+
+    !elOptionStyle.hasOwnProperty('textFill') && elOptionStyle.fill && (elOptionStyle.textFill = elOptionStyle.fill);
+    !elOptionStyle.hasOwnProperty('textStroke') && elOptionStyle.stroke && (elOptionStyle.textStroke = elOptionStyle.stroke);
+  }
+
+  if (el.type !== 'group') {
+    el.useStyle(elOptionStyle); // Init animation.
+
+    if (isInit) {
+      el.style.opacity = 0;
+      var targetOpacity = elOptionStyle.opacity;
+      targetOpacity == null && (targetOpacity = 1);
+      initProps(el, {
+        style: {
+          opacity: targetOpacity
+        }
+      }, animatableModel, dataIndex);
+    }
+  }
+
+  if (isInit) {
+    el.attr(transitionProps);
+  } else {
+    updateProps(el, transitionProps, animatableModel, dataIndex);
+  } // Merge by default.
+  // z2 must not be null/undefined, otherwise sort error may occur.
+
+
+  elOption.hasOwnProperty('z2') && el.attr('z2', elOption.z2 || 0);
+  elOption.hasOwnProperty('silent') && el.attr('silent', elOption.silent);
+  elOption.hasOwnProperty('invisible') && el.attr('invisible', elOption.invisible);
+  elOption.hasOwnProperty('ignore') && el.attr('ignore', elOption.ignore); // `elOption.info` enables user to mount some info on
+  // elements and use them in event handlers.
+  // Update them only when user specified, otherwise, remain.
+
+  elOption.hasOwnProperty('info') && el.attr('info', elOption.info); // If `elOption.styleEmphasis` is `false`, remove hover style. The
+  // logic is ensured by `graphicUtil.setElementHoverStyle`.
+
+  var styleEmphasis = elOption.styleEmphasis;
+  var disableStyleEmphasis = styleEmphasis === false;
+
+  if (!( // Try to escapse setting hover style for performance.
+  el.__cusHasEmphStl && styleEmphasis == null || !el.__cusHasEmphStl && disableStyleEmphasis)) {
+    // Should not use graphicUtil.setHoverStyle, since the styleEmphasis
+    // should not be share by group and its descendants.
+    setElementHoverStyle(el, styleEmphasis);
+    el.__cusHasEmphStl = !disableStyleEmphasis;
+  }
+
+  isRoot && setAsHoverStyleTrigger(el, !disableStyleEmphasis);
+}
+
+function prepareStyleTransition(prop, targetStyle, elOptionStyle, oldElStyle, isInit) {
+  if (elOptionStyle[prop] != null && !isInit) {
+    targetStyle[prop] = elOptionStyle[prop];
+    elOptionStyle[prop] = oldElStyle[prop];
+  }
+}
+
+function makeRenderItem(customSeries, data, ecModel, api) {
+  var renderItem = customSeries.get('renderItem');
+  var coordSys = customSeries.coordinateSystem;
+  var prepareResult = {};
+
+  if (coordSys) {
+    prepareResult = coordSys.prepareCustoms ? coordSys.prepareCustoms() : prepareCustoms[coordSys.type](coordSys);
+  }
+
+  var userAPI = defaults({
+    getWidth: api.getWidth,
+    getHeight: api.getHeight,
+    getZr: api.getZr,
+    getDevicePixelRatio: api.getDevicePixelRatio,
+    value: value,
+    style: style,
+    styleEmphasis: styleEmphasis,
+    visual: visual,
+    barLayout: barLayout,
+    currentSeriesIndices: currentSeriesIndices,
+    font: font
+  }, prepareResult.api || {});
+  var userParams = {
+    // The life cycle of context: current round of rendering.
+    // The global life cycle is probably not necessary, because
+    // user can store global status by themselves.
+    context: {},
+    seriesId: customSeries.id,
+    seriesName: customSeries.name,
+    seriesIndex: customSeries.seriesIndex,
+    coordSys: prepareResult.coordSys,
+    dataInsideLength: data.count(),
+    encode: wrapEncodeDef(customSeries.getData())
+  }; // Do not support call `api` asynchronously without dataIndexInside input.
+
+  var currDataIndexInside;
+  var currDirty = true;
+  var currItemModel;
+  var currLabelNormalModel;
+  var currLabelEmphasisModel;
+  var currVisualColor;
+  return function (dataIndexInside, payload) {
+    currDataIndexInside = dataIndexInside;
+    currDirty = true;
+    return renderItem && renderItem(defaults({
+      dataIndexInside: dataIndexInside,
+      dataIndex: data.getRawIndex(dataIndexInside),
+      // Can be used for optimization when zoom or roam.
+      actionType: payload ? payload.type : null
+    }, userParams), userAPI);
+  }; // Do not update cache until api called.
+
+  function updateCache(dataIndexInside) {
+    dataIndexInside == null && (dataIndexInside = currDataIndexInside);
+
+    if (currDirty) {
+      currItemModel = data.getItemModel(dataIndexInside);
+      currLabelNormalModel = currItemModel.getModel(LABEL_NORMAL);
+      currLabelEmphasisModel = currItemModel.getModel(LABEL_EMPHASIS);
+      currVisualColor = data.getItemVisual(dataIndexInside, 'color');
+      currDirty = false;
+    }
+  }
+  /**
+   * @public
+   * @param {number|string} dim
+   * @param {number} [dataIndexInside=currDataIndexInside]
+   * @return {number|string} value
+   */
+
+
+  function value(dim, dataIndexInside) {
+    dataIndexInside == null && (dataIndexInside = currDataIndexInside);
+    return data.get(data.getDimension(dim || 0), dataIndexInside);
+  }
+  /**
+   * By default, `visual` is applied to style (to support visualMap).
+   * `visual.color` is applied at `fill`. If user want apply visual.color on `stroke`,
+   * it can be implemented as:
+   * `api.style({stroke: api.visual('color'), fill: null})`;
+   * @public
+   * @param {Object} [extra]
+   * @param {number} [dataIndexInside=currDataIndexInside]
+   */
+
+
+  function style(extra, dataIndexInside) {
+    dataIndexInside == null && (dataIndexInside = currDataIndexInside);
+    updateCache(dataIndexInside);
+    var itemStyle = currItemModel.getModel(ITEM_STYLE_NORMAL_PATH).getItemStyle();
+    currVisualColor != null && (itemStyle.fill = currVisualColor);
+    var opacity = data.getItemVisual(dataIndexInside, 'opacity');
+    opacity != null && (itemStyle.opacity = opacity);
+    setTextStyle(itemStyle, currLabelNormalModel, null, {
+      autoColor: currVisualColor,
+      isRectText: true
+    });
+    itemStyle.text = currLabelNormalModel.getShallow('show') ? retrieve2(customSeries.getFormattedLabel(dataIndexInside, 'normal'), getDefaultLabel(data, dataIndexInside)) : null;
+    extra && extend(itemStyle, extra);
+    return itemStyle;
+  }
+  /**
+   * @public
+   * @param {Object} [extra]
+   * @param {number} [dataIndexInside=currDataIndexInside]
+   */
+
+
+  function styleEmphasis(extra, dataIndexInside) {
+    dataIndexInside == null && (dataIndexInside = currDataIndexInside);
+    updateCache(dataIndexInside);
+    var itemStyle = currItemModel.getModel(ITEM_STYLE_EMPHASIS_PATH).getItemStyle();
+    setTextStyle(itemStyle, currLabelEmphasisModel, null, {
+      isRectText: true
+    }, true);
+    itemStyle.text = currLabelEmphasisModel.getShallow('show') ? retrieve3(customSeries.getFormattedLabel(dataIndexInside, 'emphasis'), customSeries.getFormattedLabel(dataIndexInside, 'normal'), getDefaultLabel(data, dataIndexInside)) : null;
+    extra && extend(itemStyle, extra);
+    return itemStyle;
+  }
+  /**
+   * @public
+   * @param {string} visualType
+   * @param {number} [dataIndexInside=currDataIndexInside]
+   */
+
+
+  function visual(visualType, dataIndexInside) {
+    dataIndexInside == null && (dataIndexInside = currDataIndexInside);
+    return data.getItemVisual(dataIndexInside, visualType);
+  }
+  /**
+   * @public
+   * @param {number} opt.count Positive interger.
+   * @param {number} [opt.barWidth]
+   * @param {number} [opt.barMaxWidth]
+   * @param {number} [opt.barGap]
+   * @param {number} [opt.barCategoryGap]
+   * @return {Object} {width, offset, offsetCenter} is not support, return undefined.
+   */
+
+
+  function barLayout(opt) {
+    if (coordSys.getBaseAxis) {
+      var baseAxis = coordSys.getBaseAxis();
+      return getLayoutOnAxis(defaults({
+        axis: baseAxis
+      }, opt), api);
+    }
+  }
+  /**
+   * @public
+   * @return {Array.<number>}
+   */
+
+
+  function currentSeriesIndices() {
+    return ecModel.getCurrentSeriesIndices();
+  }
+  /**
+   * @public
+   * @param {Object} opt
+   * @param {string} [opt.fontStyle]
+   * @param {number} [opt.fontWeight]
+   * @param {number} [opt.fontSize]
+   * @param {string} [opt.fontFamily]
+   * @return {string} font string
+   */
+
+
+  function font(opt) {
+    return getFont(opt, ecModel);
+  }
+}
+
+function wrapEncodeDef(data) {
+  var encodeDef = {};
+  each$1(data.dimensions, function (dimName, dataDimIndex) {
+    var dimInfo = data.getDimensionInfo(dimName);
+
+    if (!dimInfo.isExtraCoord) {
+      var coordDim = dimInfo.coordDim;
+      var dataDims = encodeDef[coordDim] = encodeDef[coordDim] || [];
+      dataDims[dimInfo.coordDimIndex] = dataDimIndex;
+    }
+  });
+  return encodeDef;
+}
+
+function createOrUpdate$1(el, dataIndex, elOption, animatableModel, group, data) {
+  el = doCreateOrUpdate(el, dataIndex, elOption, animatableModel, group, data, true);
+  el && data.setItemGraphicEl(dataIndex, el);
+  return el;
+}
+
+function doCreateOrUpdate(el, dataIndex, elOption, animatableModel, group, data, isRoot) {
+  // [Rule]
+  // By default, follow merge mode.
+  //     (It probably brings benifit for performance in some cases of large data, where
+  //     user program can be optimized to that only updated props needed to be re-calculated,
+  //     or according to `actionType` some calculation can be skipped.)
+  // If `renderItem` returns `null`/`undefined`/`false`, remove the previous el if existing.
+  //     (It seems that violate the "merge" principle, but most of users probably intuitively
+  //     regard "return;" as "show nothing element whatever", so make a exception to meet the
+  //     most cases.)
+  var simplyRemove = !elOption; // `null`/`undefined`/`false`
+
+  elOption = elOption || {};
+  var elOptionType = elOption.type;
+  var elOptionShape = elOption.shape;
+  var elOptionStyle = elOption.style;
+
+  if (el && (simplyRemove // || elOption.$merge === false
+  // If `elOptionType` is `null`, follow the merge principle.
+  || elOptionType != null && elOptionType !== el.__customGraphicType || elOptionType === 'path' && hasOwnPathData(elOptionShape) && getPathData(elOptionShape) !== el.__customPathData || elOptionType === 'image' && hasOwn(elOptionStyle, 'image') && elOptionStyle.image !== el.__customImagePath // FIXME test and remove this restriction?
+  || elOptionType === 'text' && hasOwn(elOptionShape, 'text') && elOptionStyle.text !== el.__customText)) {
+    group.remove(el);
+    el = null;
+  } // `elOption.type` is undefined when `renderItem` returns nothing.
+
+
+  if (simplyRemove) {
+    return;
+  }
+
+  var isInit = !el;
+  !el && (el = createEl(elOption));
+  updateEl(el, dataIndex, elOption, animatableModel, data, isInit, isRoot);
+
+  if (elOptionType === 'group') {
+    mergeChildren(el, dataIndex, elOption, animatableModel, data);
+  } // Always add whatever already added to ensure sequence.
+
+
+  group.add(el);
+  return el;
+} // Usage:
+// (1) By default, `elOption.$mergeChildren` is `'byIndex'`, which indicates that
+//     the existing children will not be removed, and enables the feature that
+//     update some of the props of some of the children simply by construct
+//     the returned children of `renderItem` like:
+//     `var children = group.children = []; children[3] = {opacity: 0.5};`
+// (2) If `elOption.$mergeChildren` is `'byName'`, add/update/remove children
+//     by child.name. But that might be lower performance.
+// (3) If `elOption.$mergeChildren` is `false`, the existing children will be
+//     replaced totally.
+// (4) If `!elOption.children`, following the "merge" principle, nothing will happen.
+//
+// For implementation simpleness, do not provide a direct way to remove sinlge
+// child (otherwise the total indicies of the children array have to be modified).
+// User can remove a single child by set its `ignore` as `true` or replace
+// it by another element, where its `$merge` can be set as `true` if necessary.
+
+
+function mergeChildren(el, dataIndex, elOption, animatableModel, data) {
+  var newChildren = elOption.children;
+  var newLen = newChildren ? newChildren.length : 0;
+  var mergeChildren = elOption.$mergeChildren; // `diffChildrenByName` has been deprecated.
+
+  var byName = mergeChildren === 'byName' || elOption.diffChildrenByName;
+  var notMerge = mergeChildren === false; // For better performance on roam update, only enter if necessary.
+
+  if (!newLen && !byName && !notMerge) {
+    return;
+  }
+
+  if (byName) {
+    diffGroupChildren({
+      oldChildren: el.children() || [],
+      newChildren: newChildren || [],
+      dataIndex: dataIndex,
+      animatableModel: animatableModel,
+      group: el,
+      data: data
+    });
+    return;
+  }
+
+  notMerge && el.removeAll(); // Mapping children of a group simply by index, which
+  // might be better performance.
+
+  var index = 0;
+
+  for (; index < newLen; index++) {
+    newChildren[index] && doCreateOrUpdate(el.childAt(index), dataIndex, newChildren[index], animatableModel, el, data);
+  }
+}
+
+function diffGroupChildren(context) {
+  new DataDiffer(context.oldChildren, context.newChildren, getKey, getKey, context).add(processAddUpdate).update(processAddUpdate).remove(processRemove).execute();
+}
+
+function getKey(item, idx) {
+  var name = item && item.name;
+  return name != null ? name : GROUP_DIFF_PREFIX + idx;
+}
+
+function processAddUpdate(newIndex, oldIndex) {
+  var context = this.context;
+  var childOption = newIndex != null ? context.newChildren[newIndex] : null;
+  var child = oldIndex != null ? context.oldChildren[oldIndex] : null;
+  doCreateOrUpdate(child, context.dataIndex, childOption, context.animatableModel, context.group, context.data);
+}
+
+function processRemove(oldIndex) {
+  var context = this.context;
+  var child = context.oldChildren[oldIndex];
+  child && context.group.remove(child);
+}
+
+function getPathData(shape) {
+  // "d" follows the SVG convention.
+  return shape && (shape.pathData || shape.d);
+}
+
+function hasOwnPathData(shape) {
+  return shape && (shape.hasOwnProperty('pathData') || shape.hasOwnProperty('d'));
+}
+
+function hasOwn(host, prop) {
+  return host && host.hasOwnProperty(prop);
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+function getSeriesStackId$1(seriesModel) {
+  return seriesModel.get('stack') || '__ec_stack_' + seriesModel.seriesIndex;
+}
+
+function getAxisKey$1(axis) {
+  return axis.dim;
+}
+/**
+ * @param {string} seriesType
+ * @param {module:echarts/model/Global} ecModel
+ * @param {module:echarts/ExtensionAPI} api
+ */
+
+
+function barLayoutPolar(seriesType, ecModel, api) {
+  // FIXME
+  // Revert becuase it brings bar progressive bug.
+  // The complete fix will be added in the next version.
+  var width = api.getWidth();
+  var height = api.getHeight();
+  var lastStackCoords = {};
+  var barWidthAndOffset = calRadialBar(filter(ecModel.getSeriesByType(seriesType), function (seriesModel) {
+    return !ecModel.isSeriesFiltered(seriesModel) && seriesModel.coordinateSystem && seriesModel.coordinateSystem.type === 'polar';
+  }));
+  ecModel.eachSeriesByType(seriesType, function (seriesModel) {
+    // Check series coordinate, do layout for polar only
+    if (seriesModel.coordinateSystem.type !== 'polar') {
+      return;
+    }
+
+    var data = seriesModel.getData();
+    var polar = seriesModel.coordinateSystem;
+    var baseAxis = polar.getBaseAxis();
+    var stackId = getSeriesStackId$1(seriesModel);
+    var columnLayoutInfo = barWidthAndOffset[getAxisKey$1(baseAxis)][stackId];
+    var columnOffset = columnLayoutInfo.offset;
+    var columnWidth = columnLayoutInfo.width;
+    var valueAxis = polar.getOtherAxis(baseAxis);
+    var cx = seriesModel.coordinateSystem.cx;
+    var cy = seriesModel.coordinateSystem.cy;
+    var barMinHeight = seriesModel.get('barMinHeight') || 0;
+    var barMinAngle = seriesModel.get('barMinAngle') || 0;
+    lastStackCoords[stackId] = lastStackCoords[stackId] || [];
+    var valueDim = data.mapDimension(valueAxis.dim);
+    var baseDim = data.mapDimension(baseAxis.dim);
+    var stacked = isDimensionStacked(data, valueDim
+    /*, baseDim*/
+    );
+    var valueAxisStart = valueAxis.getExtent()[0];
+
+    for (var idx = 0, len = data.count(); idx < len; idx++) {
+      var value = data.get(valueDim, idx);
+      var baseValue = data.get(baseDim, idx);
+
+      if (isNaN(value)) {
+        continue;
+      }
+
+      var sign = value >= 0 ? 'p' : 'n';
+      var baseCoord = valueAxisStart; // Because of the barMinHeight, we can not use the value in
+      // stackResultDimension directly.
+      // Only ordinal axis can be stacked.
+
+      if (stacked) {
+        if (!lastStackCoords[stackId][baseValue]) {
+          lastStackCoords[stackId][baseValue] = {
+            p: valueAxisStart,
+            // Positive stack
+            n: valueAxisStart // Negative stack
+
+          };
+        } // Should also consider #4243
+
+
+        baseCoord = lastStackCoords[stackId][baseValue][sign];
+      }
+
+      var r0;
+      var r;
+      var startAngle;
+      var endAngle; // radial sector
+
+      if (valueAxis.dim === 'radius') {
+        var radiusSpan = valueAxis.dataToRadius(value) - valueAxisStart;
+        var angle = baseAxis.dataToAngle(baseValue);
+
+        if (Math.abs(radiusSpan) < barMinHeight) {
+          radiusSpan = (radiusSpan < 0 ? -1 : 1) * barMinHeight;
+        }
+
+        r0 = baseCoord;
+        r = baseCoord + radiusSpan;
+        startAngle = angle - columnOffset;
+        endAngle = startAngle - columnWidth;
+        stacked && (lastStackCoords[stackId][baseValue][sign] = r);
+      } // tangential sector
+      else {
+          // angleAxis must be clamped.
+          var angleSpan = valueAxis.dataToAngle(value, true) - valueAxisStart;
+          var radius = baseAxis.dataToRadius(baseValue);
+
+          if (Math.abs(angleSpan) < barMinAngle) {
+            angleSpan = (angleSpan < 0 ? -1 : 1) * barMinAngle;
+          }
+
+          r0 = radius + columnOffset;
+          r = r0 + columnWidth;
+          startAngle = baseCoord;
+          endAngle = baseCoord + angleSpan; // if the previous stack is at the end of the ring,
+          // add a round to differentiate it from origin
+          // var extent = angleAxis.getExtent();
+          // var stackCoord = angle;
+          // if (stackCoord === extent[0] && value > 0) {
+          //     stackCoord = extent[1];
+          // }
+          // else if (stackCoord === extent[1] && value < 0) {
+          //     stackCoord = extent[0];
+          // }
+
+          stacked && (lastStackCoords[stackId][baseValue][sign] = endAngle);
+        }
+
+      data.setItemLayout(idx, {
+        cx: cx,
+        cy: cy,
+        r0: r0,
+        r: r,
+        // Consider that positive angle is anti-clockwise,
+        // while positive radian of sector is clockwise
+        startAngle: -startAngle * Math.PI / 180,
+        endAngle: -endAngle * Math.PI / 180
+      });
+    }
+  }, this);
+}
+/**
+ * Calculate bar width and offset for radial bar charts
+ */
+
+
+function calRadialBar(barSeries, api) {
+  // Columns info on each category axis. Key is polar name
+  var columnsMap = {};
+  each$1(barSeries, function (seriesModel, idx) {
+    var data = seriesModel.getData();
+    var polar = seriesModel.coordinateSystem;
+    var baseAxis = polar.getBaseAxis();
+    var axisExtent = baseAxis.getExtent();
+    var bandWidth = baseAxis.type === 'category' ? baseAxis.getBandWidth() : Math.abs(axisExtent[1] - axisExtent[0]) / data.count();
+    var columnsOnAxis = columnsMap[getAxisKey$1(baseAxis)] || {
+      bandWidth: bandWidth,
+      remainedWidth: bandWidth,
+      autoWidthCount: 0,
+      categoryGap: '20%',
+      gap: '30%',
+      stacks: {}
+    };
+    var stacks = columnsOnAxis.stacks;
+    columnsMap[getAxisKey$1(baseAxis)] = columnsOnAxis;
+    var stackId = getSeriesStackId$1(seriesModel);
+
+    if (!stacks[stackId]) {
+      columnsOnAxis.autoWidthCount++;
+    }
+
+    stacks[stackId] = stacks[stackId] || {
+      width: 0,
+      maxWidth: 0
+    };
+    var barWidth = parsePercent$1(seriesModel.get('barWidth'), bandWidth);
+    var barMaxWidth = parsePercent$1(seriesModel.get('barMaxWidth'), bandWidth);
+    var barGap = seriesModel.get('barGap');
+    var barCategoryGap = seriesModel.get('barCategoryGap');
+
+    if (barWidth && !stacks[stackId].width) {
+      barWidth = Math.min(columnsOnAxis.remainedWidth, barWidth);
+      stacks[stackId].width = barWidth;
+      columnsOnAxis.remainedWidth -= barWidth;
+    }
+
+    barMaxWidth && (stacks[stackId].maxWidth = barMaxWidth);
+    barGap != null && (columnsOnAxis.gap = barGap);
+    barCategoryGap != null && (columnsOnAxis.categoryGap = barCategoryGap);
+  });
+  var result = {};
+  each$1(columnsMap, function (columnsOnAxis, coordSysName) {
+    result[coordSysName] = {};
+    var stacks = columnsOnAxis.stacks;
+    var bandWidth = columnsOnAxis.bandWidth;
+    var categoryGap = parsePercent$1(columnsOnAxis.categoryGap, bandWidth);
+    var barGapPercent = parsePercent$1(columnsOnAxis.gap, 1);
+    var remainedWidth = columnsOnAxis.remainedWidth;
+    var autoWidthCount = columnsOnAxis.autoWidthCount;
+    var autoWidth = (remainedWidth - categoryGap) / (autoWidthCount + (autoWidthCount - 1) * barGapPercent);
+    autoWidth = Math.max(autoWidth, 0); // Find if any auto calculated bar exceeded maxBarWidth
+
+    each$1(stacks, function (column, stack) {
+      var maxWidth = column.maxWidth;
+
+      if (maxWidth && maxWidth < autoWidth) {
+        maxWidth = Math.min(maxWidth, remainedWidth);
+
+        if (column.width) {
+          maxWidth = Math.min(maxWidth, column.width);
+        }
+
+        remainedWidth -= maxWidth;
+        column.width = maxWidth;
+        autoWidthCount--;
+      }
+    }); // Recalculate width again
+
+    autoWidth = (remainedWidth - categoryGap) / (autoWidthCount + (autoWidthCount - 1) * barGapPercent);
+    autoWidth = Math.max(autoWidth, 0);
+    var widthSum = 0;
+    var lastColumn;
+    each$1(stacks, function (column, idx) {
+      if (!column.width) {
+        column.width = autoWidth;
+      }
+
+      lastColumn = column;
+      widthSum += column.width * (1 + barGapPercent);
+    });
+
+    if (lastColumn) {
+      widthSum -= lastColumn.width * barGapPercent;
+    }
+
+    var offset = -widthSum / 2;
+    each$1(stacks, function (column, stackId) {
+      result[coordSysName][stackId] = result[coordSysName][stackId] || {
+        offset: offset,
+        width: column.width
+      };
+      offset += column.width * (1 + barGapPercent);
+    });
+  });
+  return result;
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+function RadiusAxis(scale, radiusExtent) {
+  Axis.call(this, 'radius', scale, radiusExtent);
+  /**
+   * Axis type
+   *  - 'category'
+   *  - 'value'
+   *  - 'time'
+   *  - 'log'
+   * @type {string}
+   */
+
+  this.type = 'category';
+}
+
+RadiusAxis.prototype = {
+  constructor: RadiusAxis,
+
+  /**
+   * @override
+   */
+  pointToData: function (point, clamp) {
+    return this.polar.pointToData(point, clamp)[this.dim === 'radius' ? 0 : 1];
+  },
+  dataToRadius: Axis.prototype.dataToCoord,
+  radiusToData: Axis.prototype.coordToData
+};
+inherits(RadiusAxis, Axis);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var inner$12 = makeInner();
+
+function AngleAxis(scale, angleExtent) {
+  angleExtent = angleExtent || [0, 360];
+  Axis.call(this, 'angle', scale, angleExtent);
+  /**
+   * Axis type
+   *  - 'category'
+   *  - 'value'
+   *  - 'time'
+   *  - 'log'
+   * @type {string}
+   */
+
+  this.type = 'category';
+}
+
+AngleAxis.prototype = {
+  constructor: AngleAxis,
+
+  /**
+   * @override
+   */
+  pointToData: function (point, clamp) {
+    return this.polar.pointToData(point, clamp)[this.dim === 'radius' ? 0 : 1];
+  },
+  dataToAngle: Axis.prototype.dataToCoord,
+  angleToData: Axis.prototype.coordToData,
+
+  /**
+   * Only be called in category axis.
+   * Angle axis uses text height to decide interval
+   *
+   * @override
+   * @return {number} Auto interval for cateogry axis tick and label
+   */
+  calculateCategoryInterval: function () {
+    var axis = this;
+    var labelModel = axis.getLabelModel();
+    var ordinalScale = axis.scale;
+    var ordinalExtent = ordinalScale.getExtent(); // Providing this method is for optimization:
+    // avoid generating a long array by `getTicks`
+    // in large category data case.
+
+    var tickCount = ordinalScale.count();
+
+    if (ordinalExtent[1] - ordinalExtent[0] < 1) {
+      return 0;
+    }
+
+    var tickValue = ordinalExtent[0];
+    var unitSpan = axis.dataToCoord(tickValue + 1) - axis.dataToCoord(tickValue);
+    var unitH = Math.abs(unitSpan); // Not precise, just use height as text width
+    // and each distance from axis line yet.
+
+    var rect = getBoundingRect(tickValue, labelModel.getFont(), 'center', 'top');
+    var maxH = Math.max(rect.height, 7);
+    var dh = maxH / unitH; // 0/0 is NaN, 1/0 is Infinity.
+
+    isNaN(dh) && (dh = Infinity);
+    var interval = Math.max(0, Math.floor(dh));
+    var cache = inner$12(axis.model);
+    var lastAutoInterval = cache.lastAutoInterval;
+    var lastTickCount = cache.lastTickCount; // Use cache to keep interval stable while moving zoom window,
+    // otherwise the calculated interval might jitter when the zoom
+    // window size is close to the interval-changing size.
+
+    if (lastAutoInterval != null && lastTickCount != null && Math.abs(lastAutoInterval - interval) <= 1 && Math.abs(lastTickCount - tickCount) <= 1 // Always choose the bigger one, otherwise the critical
+    // point is not the same when zooming in or zooming out.
+    && lastAutoInterval > interval) {
+      interval = lastAutoInterval;
+    } // Only update cache if cache not used, otherwise the
+    // changing of interval is too insensitive.
+    else {
+        cache.lastTickCount = tickCount;
+        cache.lastAutoInterval = interval;
+      }
+
+    return interval;
+  }
+};
+inherits(AngleAxis, Axis);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * @module echarts/coord/polar/Polar
+ */
+/**
+ * @alias {module:echarts/coord/polar/Polar}
+ * @constructor
+ * @param {string} name
+ */
+
+var Polar = function (name) {
+  /**
+   * @type {string}
+   */
+  this.name = name || '';
+  /**
+   * x of polar center
+   * @type {number}
+   */
+
+  this.cx = 0;
+  /**
+   * y of polar center
+   * @type {number}
+   */
+
+  this.cy = 0;
+  /**
+   * @type {module:echarts/coord/polar/RadiusAxis}
+   * @private
+   */
+
+  this._radiusAxis = new RadiusAxis();
+  /**
+   * @type {module:echarts/coord/polar/AngleAxis}
+   * @private
+   */
+
+  this._angleAxis = new AngleAxis();
+  this._radiusAxis.polar = this._angleAxis.polar = this;
+};
+
+Polar.prototype = {
+  type: 'polar',
+  axisPointerEnabled: true,
+  constructor: Polar,
+
+  /**
+   * @param {Array.<string>}
+   * @readOnly
+   */
+  dimensions: ['radius', 'angle'],
+
+  /**
+   * @type {module:echarts/coord/PolarModel}
+   */
+  model: null,
+
+  /**
+   * If contain coord
+   * @param {Array.<number>} point
+   * @return {boolean}
+   */
+  containPoint: function (point) {
+    var coord = this.pointToCoord(point);
+    return this._radiusAxis.contain(coord[0]) && this._angleAxis.contain(coord[1]);
+  },
+
+  /**
+   * If contain data
+   * @param {Array.<number>} data
+   * @return {boolean}
+   */
+  containData: function (data) {
+    return this._radiusAxis.containData(data[0]) && this._angleAxis.containData(data[1]);
+  },
+
+  /**
+   * @param {string} dim
+   * @return {module:echarts/coord/polar/AngleAxis|module:echarts/coord/polar/RadiusAxis}
+   */
+  getAxis: function (dim) {
+    return this['_' + dim + 'Axis'];
+  },
+
+  /**
+   * @return {Array.<module:echarts/coord/Axis>}
+   */
+  getAxes: function () {
+    return [this._radiusAxis, this._angleAxis];
+  },
+
+  /**
+   * Get axes by type of scale
+   * @param {string} scaleType
+   * @return {module:echarts/coord/polar/AngleAxis|module:echarts/coord/polar/RadiusAxis}
+   */
+  getAxesByScale: function (scaleType) {
+    var axes = [];
+    var angleAxis = this._angleAxis;
+    var radiusAxis = this._radiusAxis;
+    angleAxis.scale.type === scaleType && axes.push(angleAxis);
+    radiusAxis.scale.type === scaleType && axes.push(radiusAxis);
+    return axes;
+  },
+
+  /**
+   * @return {module:echarts/coord/polar/AngleAxis}
+   */
+  getAngleAxis: function () {
+    return this._angleAxis;
+  },
+
+  /**
+   * @return {module:echarts/coord/polar/RadiusAxis}
+   */
+  getRadiusAxis: function () {
+    return this._radiusAxis;
+  },
+
+  /**
+   * @param {module:echarts/coord/polar/Axis}
+   * @return {module:echarts/coord/polar/Axis}
+   */
+  getOtherAxis: function (axis) {
+    var angleAxis = this._angleAxis;
+    return axis === angleAxis ? this._radiusAxis : angleAxis;
+  },
+
+  /**
+   * Base axis will be used on stacking.
+   *
+   * @return {module:echarts/coord/polar/Axis}
+   */
+  getBaseAxis: function () {
+    return this.getAxesByScale('ordinal')[0] || this.getAxesByScale('time')[0] || this.getAngleAxis();
+  },
+
+  /**
+   * @param {string} [dim] 'radius' or 'angle' or 'auto' or null/undefined
+   * @return {Object} {baseAxes: [], otherAxes: []}
+   */
+  getTooltipAxes: function (dim) {
+    var baseAxis = dim != null && dim !== 'auto' ? this.getAxis(dim) : this.getBaseAxis();
+    return {
+      baseAxes: [baseAxis],
+      otherAxes: [this.getOtherAxis(baseAxis)]
+    };
+  },
+
+  /**
+   * Convert a single data item to (x, y) point.
+   * Parameter data is an array which the first element is radius and the second is angle
+   * @param {Array.<number>} data
+   * @param {boolean} [clamp=false]
+   * @return {Array.<number>}
+   */
+  dataToPoint: function (data, clamp) {
+    return this.coordToPoint([this._radiusAxis.dataToRadius(data[0], clamp), this._angleAxis.dataToAngle(data[1], clamp)]);
+  },
+
+  /**
+   * Convert a (x, y) point to data
+   * @param {Array.<number>} point
+   * @param {boolean} [clamp=false]
+   * @return {Array.<number>}
+   */
+  pointToData: function (point, clamp) {
+    var coord = this.pointToCoord(point);
+    return [this._radiusAxis.radiusToData(coord[0], clamp), this._angleAxis.angleToData(coord[1], clamp)];
+  },
+
+  /**
+   * Convert a (x, y) point to (radius, angle) coord
+   * @param {Array.<number>} point
+   * @return {Array.<number>}
+   */
+  pointToCoord: function (point) {
+    var dx = point[0] - this.cx;
+    var dy = point[1] - this.cy;
+    var angleAxis = this.getAngleAxis();
+    var extent = angleAxis.getExtent();
+    var minAngle = Math.min(extent[0], extent[1]);
+    var maxAngle = Math.max(extent[0], extent[1]); // Fix fixed extent in polarCreator
+    // FIXME
+
+    angleAxis.inverse ? minAngle = maxAngle - 360 : maxAngle = minAngle + 360;
+    var radius = Math.sqrt(dx * dx + dy * dy);
+    dx /= radius;
+    dy /= radius;
+    var radian = Math.atan2(-dy, dx) / Math.PI * 180; // move to angleExtent
+
+    var dir = radian < minAngle ? 1 : -1;
+
+    while (radian < minAngle || radian > maxAngle) {
+      radian += dir * 360;
+    }
+
+    return [radius, radian];
+  },
+
+  /**
+   * Convert a (radius, angle) coord to (x, y) point
+   * @param {Array.<number>} coord
+   * @return {Array.<number>}
+   */
+  coordToPoint: function (coord) {
+    var radius = coord[0];
+    var radian = coord[1] / 180 * Math.PI;
+    var x = Math.cos(radian) * radius + this.cx; // Inverse the y
+
+    var y = -Math.sin(radian) * radius + this.cy;
+    return [x, y];
+  }
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var PolarAxisModel = ComponentModel.extend({
+  type: 'polarAxis',
+
+  /**
+   * @type {module:echarts/coord/polar/AngleAxis|module:echarts/coord/polar/RadiusAxis}
+   */
+  axis: null,
+
+  /**
+   * @override
+   */
+  getCoordSysModel: function () {
+    return this.ecModel.queryComponents({
+      mainType: 'polar',
+      index: this.option.polarIndex,
+      id: this.option.polarId
+    })[0];
+  }
+});
+merge(PolarAxisModel.prototype, axisModelCommonMixin);
+var polarAxisDefaultExtendedOption = {
+  angle: {
+    // polarIndex: 0,
+    // polarId: '',
+    startAngle: 90,
+    clockwise: true,
+    splitNumber: 12,
+    axisLabel: {
+      rotate: false
+    }
+  },
+  radius: {
+    // polarIndex: 0,
+    // polarId: '',
+    splitNumber: 5
+  }
+};
+
+function getAxisType$3(axisDim, option) {
+  // Default axis with data is category axis
+  return option.type || (option.data ? 'category' : 'value');
+}
+
+axisModelCreator('angle', PolarAxisModel, getAxisType$3, polarAxisDefaultExtendedOption.angle);
+axisModelCreator('radius', PolarAxisModel, getAxisType$3, polarAxisDefaultExtendedOption.radius);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+extendComponentModel({
+  type: 'polar',
+  dependencies: ['polarAxis', 'angleAxis'],
+
+  /**
+   * @type {module:echarts/coord/polar/Polar}
+   */
+  coordinateSystem: null,
+
+  /**
+   * @param {string} axisType
+   * @return {module:echarts/coord/polar/AxisModel}
+   */
+  findAxisModel: function (axisType) {
+    var foundAxisModel;
+    var ecModel = this.ecModel;
+    ecModel.eachComponent(axisType, function (axisModel) {
+      if (axisModel.getCoordSysModel() === this) {
+        foundAxisModel = axisModel;
+      }
+    }, this);
+    return foundAxisModel;
+  },
+  defaultOption: {
+    zlevel: 0,
+    z: 0,
+    center: ['50%', '50%'],
+    radius: '80%'
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+// TODO Axis scale
+/**
+ * Resize method bound to the polar
+ * @param {module:echarts/coord/polar/PolarModel} polarModel
+ * @param {module:echarts/ExtensionAPI} api
+ */
+
+function resizePolar(polar, polarModel, api) {
+  var center = polarModel.get('center');
+  var width = api.getWidth();
+  var height = api.getHeight();
+  polar.cx = parsePercent$1(center[0], width);
+  polar.cy = parsePercent$1(center[1], height);
+  var radiusAxis = polar.getRadiusAxis();
+  var size = Math.min(width, height) / 2;
+  var radius = parsePercent$1(polarModel.get('radius'), size);
+  radiusAxis.inverse ? radiusAxis.setExtent(radius, 0) : radiusAxis.setExtent(0, radius);
+}
+/**
+ * Update polar
+ */
+
+
+function updatePolarScale(ecModel, api) {
+  var polar = this;
+  var angleAxis = polar.getAngleAxis();
+  var radiusAxis = polar.getRadiusAxis(); // Reset scale
+
+  angleAxis.scale.setExtent(Infinity, -Infinity);
+  radiusAxis.scale.setExtent(Infinity, -Infinity);
+  ecModel.eachSeries(function (seriesModel) {
+    if (seriesModel.coordinateSystem === polar) {
+      var data = seriesModel.getData();
+      each$1(data.mapDimension('radius', true), function (dim) {
+        radiusAxis.scale.unionExtentFromData(data, getStackedDimension(data, dim));
+      });
+      each$1(data.mapDimension('angle', true), function (dim) {
+        angleAxis.scale.unionExtentFromData(data, getStackedDimension(data, dim));
+      });
+    }
+  });
+  niceScaleExtent(angleAxis.scale, angleAxis.model);
+  niceScaleExtent(radiusAxis.scale, radiusAxis.model); // Fix extent of category angle axis
+
+  if (angleAxis.type === 'category' && !angleAxis.onBand) {
+    var extent = angleAxis.getExtent();
+    var diff = 360 / angleAxis.scale.count();
+    angleAxis.inverse ? extent[1] += diff : extent[1] -= diff;
+    angleAxis.setExtent(extent[0], extent[1]);
+  }
+}
+/**
+ * Set common axis properties
+ * @param {module:echarts/coord/polar/AngleAxis|module:echarts/coord/polar/RadiusAxis}
+ * @param {module:echarts/coord/polar/AxisModel}
+ * @inner
+ */
+
+
+function setAxis(axis, axisModel) {
+  axis.type = axisModel.get('type');
+  axis.scale = createScaleByModel(axisModel);
+  axis.onBand = axisModel.get('boundaryGap') && axis.type === 'category';
+  axis.inverse = axisModel.get('inverse');
+
+  if (axisModel.mainType === 'angleAxis') {
+    axis.inverse ^= axisModel.get('clockwise');
+    var startAngle = axisModel.get('startAngle');
+    axis.setExtent(startAngle, startAngle + (axis.inverse ? -360 : 360));
+  } // Inject axis instance
+
+
+  axisModel.axis = axis;
+  axis.model = axisModel;
+}
+
+var polarCreator = {
+  dimensions: Polar.prototype.dimensions,
+  create: function (ecModel, api) {
+    var polarList = [];
+    ecModel.eachComponent('polar', function (polarModel, idx) {
+      var polar = new Polar(idx); // Inject resize and update method
+
+      polar.update = updatePolarScale;
+      var radiusAxis = polar.getRadiusAxis();
+      var angleAxis = polar.getAngleAxis();
+      var radiusAxisModel = polarModel.findAxisModel('radiusAxis');
+      var angleAxisModel = polarModel.findAxisModel('angleAxis');
+      setAxis(radiusAxis, radiusAxisModel);
+      setAxis(angleAxis, angleAxisModel);
+      resizePolar(polar, polarModel, api);
+      polarList.push(polar);
+      polarModel.coordinateSystem = polar;
+      polar.model = polarModel;
+    }); // Inject coordinateSystem to series
+
+    ecModel.eachSeries(function (seriesModel) {
+      if (seriesModel.get('coordinateSystem') === 'polar') {
+        var polarModel = ecModel.queryComponents({
+          mainType: 'polar',
+          index: seriesModel.get('polarIndex'),
+          id: seriesModel.get('polarId')
+        })[0];
+        seriesModel.coordinateSystem = polarModel.coordinateSystem;
+      }
+    });
+    return polarList;
+  }
+};
+CoordinateSystemManager.register('polar', polarCreator);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var elementList$1 = ['axisLine', 'axisLabel', 'axisTick', 'splitLine', 'splitArea'];
+
+function getAxisLineShape(polar, rExtent, angle) {
+  rExtent[1] > rExtent[0] && (rExtent = rExtent.slice().reverse());
+  var start = polar.coordToPoint([rExtent[0], angle]);
+  var end = polar.coordToPoint([rExtent[1], angle]);
+  return {
+    x1: start[0],
+    y1: start[1],
+    x2: end[0],
+    y2: end[1]
+  };
+}
+
+function getRadiusIdx(polar) {
+  var radiusAxis = polar.getRadiusAxis();
+  return radiusAxis.inverse ? 0 : 1;
+} // Remove the last tick which will overlap the first tick
+
+
+function fixAngleOverlap(list) {
+  var firstItem = list[0];
+  var lastItem = list[list.length - 1];
+
+  if (firstItem && lastItem && Math.abs(Math.abs(firstItem.coord - lastItem.coord) - 360) < 1e-4) {
+    list.pop();
+  }
+}
+
+AxisView.extend({
+  type: 'angleAxis',
+  axisPointerClass: 'PolarAxisPointer',
+  render: function (angleAxisModel, ecModel) {
+    this.group.removeAll();
+
+    if (!angleAxisModel.get('show')) {
+      return;
+    }
+
+    var angleAxis = angleAxisModel.axis;
+    var polar = angleAxis.polar;
+    var radiusExtent = polar.getRadiusAxis().getExtent();
+    var ticksAngles = angleAxis.getTicksCoords();
+    var labels = map(angleAxis.getViewLabels(), function (labelItem) {
+      var labelItem = clone(labelItem);
+      labelItem.coord = angleAxis.dataToCoord(labelItem.tickValue);
+      return labelItem;
+    });
+    fixAngleOverlap(labels);
+    fixAngleOverlap(ticksAngles);
+    each$1(elementList$1, function (name) {
+      if (angleAxisModel.get(name + '.show') && (!angleAxis.scale.isBlank() || name === 'axisLine')) {
+        this['_' + name](angleAxisModel, polar, ticksAngles, radiusExtent, labels);
+      }
+    }, this);
+  },
+
+  /**
+   * @private
+   */
+  _axisLine: function (angleAxisModel, polar, ticksAngles, radiusExtent) {
+    var lineStyleModel = angleAxisModel.getModel('axisLine.lineStyle');
+    var circle = new Circle({
+      shape: {
+        cx: polar.cx,
+        cy: polar.cy,
+        r: radiusExtent[getRadiusIdx(polar)]
+      },
+      style: lineStyleModel.getLineStyle(),
+      z2: 1,
+      silent: true
+    });
+    circle.style.fill = null;
+    this.group.add(circle);
+  },
+
+  /**
+   * @private
+   */
+  _axisTick: function (angleAxisModel, polar, ticksAngles, radiusExtent) {
+    var tickModel = angleAxisModel.getModel('axisTick');
+    var tickLen = (tickModel.get('inside') ? -1 : 1) * tickModel.get('length');
+    var radius = radiusExtent[getRadiusIdx(polar)];
+    var lines = map(ticksAngles, function (tickAngleItem) {
+      return new Line({
+        shape: getAxisLineShape(polar, [radius, radius + tickLen], tickAngleItem.coord)
+      });
+    });
+    this.group.add(mergePath(lines, {
+      style: defaults(tickModel.getModel('lineStyle').getLineStyle(), {
+        stroke: angleAxisModel.get('axisLine.lineStyle.color')
+      })
+    }));
+  },
+
+  /**
+   * @private
+   */
+  _axisLabel: function (angleAxisModel, polar, ticksAngles, radiusExtent, labels) {
+    var rawCategoryData = angleAxisModel.getCategories(true);
+    var commonLabelModel = angleAxisModel.getModel('axisLabel');
+    var labelMargin = commonLabelModel.get('margin'); // Use length of ticksAngles because it may remove the last tick to avoid overlapping
+
+    each$1(labels, function (labelItem, idx) {
+      var labelModel = commonLabelModel;
+      var tickValue = labelItem.tickValue;
+      var r = radiusExtent[getRadiusIdx(polar)];
+      var p = polar.coordToPoint([r + labelMargin, labelItem.coord]);
+      var cx = polar.cx;
+      var cy = polar.cy;
+      var labelTextAlign = Math.abs(p[0] - cx) / r < 0.3 ? 'center' : p[0] > cx ? 'left' : 'right';
+      var labelTextVerticalAlign = Math.abs(p[1] - cy) / r < 0.3 ? 'middle' : p[1] > cy ? 'top' : 'bottom';
+
+      if (rawCategoryData && rawCategoryData[tickValue] && rawCategoryData[tickValue].textStyle) {
+        labelModel = new Model(rawCategoryData[tickValue].textStyle, commonLabelModel, commonLabelModel.ecModel);
+      }
+
+      var textEl = new Text({
+        silent: true
+      });
+      this.group.add(textEl);
+      setTextStyle(textEl.style, labelModel, {
+        x: p[0],
+        y: p[1],
+        textFill: labelModel.getTextColor() || angleAxisModel.get('axisLine.lineStyle.color'),
+        text: labelItem.formattedLabel,
+        textAlign: labelTextAlign,
+        textVerticalAlign: labelTextVerticalAlign
+      });
+    }, this);
+  },
+
+  /**
+   * @private
+   */
+  _splitLine: function (angleAxisModel, polar, ticksAngles, radiusExtent) {
+    var splitLineModel = angleAxisModel.getModel('splitLine');
+    var lineStyleModel = splitLineModel.getModel('lineStyle');
+    var lineColors = lineStyleModel.get('color');
+    var lineCount = 0;
+    lineColors = lineColors instanceof Array ? lineColors : [lineColors];
+    var splitLines = [];
+
+    for (var i = 0; i < ticksAngles.length; i++) {
+      var colorIndex = lineCount++ % lineColors.length;
+      splitLines[colorIndex] = splitLines[colorIndex] || [];
+      splitLines[colorIndex].push(new Line({
+        shape: getAxisLineShape(polar, radiusExtent, ticksAngles[i].coord)
+      }));
+    } // Simple optimization
+    // Batching the lines if color are the same
+
+
+    for (var i = 0; i < splitLines.length; i++) {
+      this.group.add(mergePath(splitLines[i], {
+        style: defaults({
+          stroke: lineColors[i % lineColors.length]
+        }, lineStyleModel.getLineStyle()),
+        silent: true,
+        z: angleAxisModel.get('z')
+      }));
+    }
+  },
+
+  /**
+   * @private
+   */
+  _splitArea: function (angleAxisModel, polar, ticksAngles, radiusExtent) {
+    if (!ticksAngles.length) {
+      return;
+    }
+
+    var splitAreaModel = angleAxisModel.getModel('splitArea');
+    var areaStyleModel = splitAreaModel.getModel('areaStyle');
+    var areaColors = areaStyleModel.get('color');
+    var lineCount = 0;
+    areaColors = areaColors instanceof Array ? areaColors : [areaColors];
+    var splitAreas = [];
+    var RADIAN = Math.PI / 180;
+    var prevAngle = -ticksAngles[0].coord * RADIAN;
+    var r0 = Math.min(radiusExtent[0], radiusExtent[1]);
+    var r1 = Math.max(radiusExtent[0], radiusExtent[1]);
+    var clockwise = angleAxisModel.get('clockwise');
+
+    for (var i = 1; i < ticksAngles.length; i++) {
+      var colorIndex = lineCount++ % areaColors.length;
+      splitAreas[colorIndex] = splitAreas[colorIndex] || [];
+      splitAreas[colorIndex].push(new Sector({
+        shape: {
+          cx: polar.cx,
+          cy: polar.cy,
+          r0: r0,
+          r: r1,
+          startAngle: prevAngle,
+          endAngle: -ticksAngles[i].coord * RADIAN,
+          clockwise: clockwise
+        },
+        silent: true
+      }));
+      prevAngle = -ticksAngles[i].coord * RADIAN;
+    } // Simple optimization
+    // Batching the lines if color are the same
+
+
+    for (var i = 0; i < splitAreas.length; i++) {
+      this.group.add(mergePath(splitAreas[i], {
+        style: defaults({
+          fill: areaColors[i % areaColors.length]
+        }, areaStyleModel.getAreaStyle()),
+        silent: true
+      }));
+    }
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var axisBuilderAttrs$3 = ['axisLine', 'axisTickLabel', 'axisName'];
+var selfBuilderAttrs$1 = ['splitLine', 'splitArea'];
+AxisView.extend({
+  type: 'radiusAxis',
+  axisPointerClass: 'PolarAxisPointer',
+  render: function (radiusAxisModel, ecModel) {
+    this.group.removeAll();
+
+    if (!radiusAxisModel.get('show')) {
+      return;
+    }
+
+    var radiusAxis = radiusAxisModel.axis;
+    var polar = radiusAxis.polar;
+    var angleAxis = polar.getAngleAxis();
+    var ticksCoords = radiusAxis.getTicksCoords();
+    var axisAngle = angleAxis.getExtent()[0];
+    var radiusExtent = radiusAxis.getExtent();
+    var layout = layoutAxis(polar, radiusAxisModel, axisAngle);
+    var axisBuilder = new AxisBuilder(radiusAxisModel, layout);
+    each$1(axisBuilderAttrs$3, axisBuilder.add, axisBuilder);
+    this.group.add(axisBuilder.getGroup());
+    each$1(selfBuilderAttrs$1, function (name) {
+      if (radiusAxisModel.get(name + '.show') && !radiusAxis.scale.isBlank()) {
+        this['_' + name](radiusAxisModel, polar, axisAngle, radiusExtent, ticksCoords);
+      }
+    }, this);
+  },
+
+  /**
+   * @private
+   */
+  _splitLine: function (radiusAxisModel, polar, axisAngle, radiusExtent, ticksCoords) {
+    var splitLineModel = radiusAxisModel.getModel('splitLine');
+    var lineStyleModel = splitLineModel.getModel('lineStyle');
+    var lineColors = lineStyleModel.get('color');
+    var lineCount = 0;
+    lineColors = lineColors instanceof Array ? lineColors : [lineColors];
+    var splitLines = [];
+
+    for (var i = 0; i < ticksCoords.length; i++) {
+      var colorIndex = lineCount++ % lineColors.length;
+      splitLines[colorIndex] = splitLines[colorIndex] || [];
+      splitLines[colorIndex].push(new Circle({
+        shape: {
+          cx: polar.cx,
+          cy: polar.cy,
+          r: ticksCoords[i].coord
+        },
+        silent: true
+      }));
+    } // Simple optimization
+    // Batching the lines if color are the same
+
+
+    for (var i = 0; i < splitLines.length; i++) {
+      this.group.add(mergePath(splitLines[i], {
+        style: defaults({
+          stroke: lineColors[i % lineColors.length],
+          fill: null
+        }, lineStyleModel.getLineStyle()),
+        silent: true
+      }));
+    }
+  },
+
+  /**
+   * @private
+   */
+  _splitArea: function (radiusAxisModel, polar, axisAngle, radiusExtent, ticksCoords) {
+    if (!ticksCoords.length) {
+      return;
+    }
+
+    var splitAreaModel = radiusAxisModel.getModel('splitArea');
+    var areaStyleModel = splitAreaModel.getModel('areaStyle');
+    var areaColors = areaStyleModel.get('color');
+    var lineCount = 0;
+    areaColors = areaColors instanceof Array ? areaColors : [areaColors];
+    var splitAreas = [];
+    var prevRadius = ticksCoords[0].coord;
+
+    for (var i = 1; i < ticksCoords.length; i++) {
+      var colorIndex = lineCount++ % areaColors.length;
+      splitAreas[colorIndex] = splitAreas[colorIndex] || [];
+      splitAreas[colorIndex].push(new Sector({
+        shape: {
+          cx: polar.cx,
+          cy: polar.cy,
+          r0: prevRadius,
+          r: ticksCoords[i].coord,
+          startAngle: 0,
+          endAngle: Math.PI * 2
+        },
+        silent: true
+      }));
+      prevRadius = ticksCoords[i].coord;
+    } // Simple optimization
+    // Batching the lines if color are the same
+
+
+    for (var i = 0; i < splitAreas.length; i++) {
+      this.group.add(mergePath(splitAreas[i], {
+        style: defaults({
+          fill: areaColors[i % areaColors.length]
+        }, areaStyleModel.getAreaStyle()),
+        silent: true
+      }));
+    }
+  }
+});
+/**
+ * @inner
+ */
+
+function layoutAxis(polar, radiusAxisModel, axisAngle) {
+  return {
+    position: [polar.cx, polar.cy],
+    rotation: axisAngle / 180 * Math.PI,
+    labelDirection: -1,
+    tickDirection: -1,
+    nameDirection: 1,
+    labelRotate: radiusAxisModel.getModel('axisLabel').get('rotate'),
+    // Over splitLine and splitArea
+    z2: 1
+  };
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var PolarAxisPointer = BaseAxisPointer.extend({
+  /**
+   * @override
+   */
+  makeElOption: function (elOption, value, axisModel, axisPointerModel, api) {
+    var axis = axisModel.axis;
+
+    if (axis.dim === 'angle') {
+      this.animationThreshold = Math.PI / 18;
+    }
+
+    var polar = axis.polar;
+    var otherAxis = polar.getOtherAxis(axis);
+    var otherExtent = otherAxis.getExtent();
+    var coordValue;
+    coordValue = axis['dataTo' + capitalFirst(axis.dim)](value);
+    var axisPointerType = axisPointerModel.get('type');
+
+    if (axisPointerType && axisPointerType !== 'none') {
+      var elStyle = buildElStyle(axisPointerModel);
+      var pointerOption = pointerShapeBuilder$2[axisPointerType](axis, polar, coordValue, otherExtent, elStyle);
+      pointerOption.style = elStyle;
+      elOption.graphicKey = pointerOption.type;
+      elOption.pointer = pointerOption;
+    }
+
+    var labelMargin = axisPointerModel.get('label.margin');
+    var labelPos = getLabelPosition(value, axisModel, axisPointerModel, polar, labelMargin);
+    buildLabelElOption(elOption, axisModel, axisPointerModel, api, labelPos);
+  } // Do not support handle, utill any user requires it.
+
+});
+
+function getLabelPosition(value, axisModel, axisPointerModel, polar, labelMargin) {
+  var axis = axisModel.axis;
+  var coord = axis.dataToCoord(value);
+  var axisAngle = polar.getAngleAxis().getExtent()[0];
+  axisAngle = axisAngle / 180 * Math.PI;
+  var radiusExtent = polar.getRadiusAxis().getExtent();
+  var position;
+  var align;
+  var verticalAlign;
+
+  if (axis.dim === 'radius') {
+    var transform = create$1();
+    rotate(transform, transform, axisAngle);
+    translate(transform, transform, [polar.cx, polar.cy]);
+    position = applyTransform$1([coord, -labelMargin], transform);
+    var labelRotation = axisModel.getModel('axisLabel').get('rotate') || 0;
+    var labelLayout = AxisBuilder.innerTextLayout(axisAngle, labelRotation * Math.PI / 180, -1);
+    align = labelLayout.textAlign;
+    verticalAlign = labelLayout.textVerticalAlign;
+  } else {
+    // angle axis
+    var r = radiusExtent[1];
+    position = polar.coordToPoint([r + labelMargin, coord]);
+    var cx = polar.cx;
+    var cy = polar.cy;
+    align = Math.abs(position[0] - cx) / r < 0.3 ? 'center' : position[0] > cx ? 'left' : 'right';
+    verticalAlign = Math.abs(position[1] - cy) / r < 0.3 ? 'middle' : position[1] > cy ? 'top' : 'bottom';
+  }
+
+  return {
+    position: position,
+    align: align,
+    verticalAlign: verticalAlign
+  };
+}
+
+var pointerShapeBuilder$2 = {
+  line: function (axis, polar, coordValue, otherExtent, elStyle) {
+    return axis.dim === 'angle' ? {
+      type: 'Line',
+      shape: makeLineShape(polar.coordToPoint([otherExtent[0], coordValue]), polar.coordToPoint([otherExtent[1], coordValue]))
+    } : {
+      type: 'Circle',
+      shape: {
+        cx: polar.cx,
+        cy: polar.cy,
+        r: coordValue
+      }
+    };
+  },
+  shadow: function (axis, polar, coordValue, otherExtent, elStyle) {
+    var bandWidth = Math.max(1, axis.getBandWidth());
+    var radian = Math.PI / 180;
+    return axis.dim === 'angle' ? {
+      type: 'Sector',
+      shape: makeSectorShape(polar.cx, polar.cy, otherExtent[0], otherExtent[1], // In ECharts y is negative if angle is positive
+      (-coordValue - bandWidth / 2) * radian, (-coordValue + bandWidth / 2) * radian)
+    } : {
+      type: 'Sector',
+      shape: makeSectorShape(polar.cx, polar.cy, coordValue - bandWidth / 2, coordValue + bandWidth / 2, 0, Math.PI * 2)
+    };
+  }
+};
+AxisView.registerAxisPointerClass('PolarAxisPointer', PolarAxisPointer);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+registerLayout(curry(barLayoutPolar, 'bar')); // Polar view
+
+extendComponentView({
+  type: 'polar'
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var GeoModel = ComponentModel.extend({
+  type: 'geo',
+
+  /**
+   * @type {module:echarts/coord/geo/Geo}
+   */
+  coordinateSystem: null,
+  layoutMode: 'box',
+  init: function (option) {
+    ComponentModel.prototype.init.apply(this, arguments); // Default label emphasis `show`
+
+    defaultEmphasis(option, 'label', ['show']);
+  },
+  optionUpdated: function () {
+    var option = this.option;
+    var self = this;
+    option.regions = geoCreator.getFilledRegions(option.regions, option.map, option.nameMap);
+    this._optionModelMap = reduce(option.regions || [], function (optionModelMap, regionOpt) {
+      if (regionOpt.name) {
+        optionModelMap.set(regionOpt.name, new Model(regionOpt, self));
+      }
+
+      return optionModelMap;
+    }, createHashMap());
+    this.updateSelectedMap(option.regions);
+  },
+  defaultOption: {
+    zlevel: 0,
+    z: 0,
+    show: true,
+    left: 'center',
+    top: 'center',
+    // width:,
+    // height:,
+    // right
+    // bottom
+    // Aspect is width / height. Inited to be geoJson bbox aspect
+    // This parameter is used for scale this aspect
+    // If svg used, aspectScale is 1 by default.
+    // aspectScale: 0.75,
+    aspectScale: null,
+    ///// Layout with center and size
+    // If you wan't to put map in a fixed size box with right aspect ratio
+    // This two properties may more conveninet
+    // layoutCenter: [50%, 50%]
+    // layoutSize: 100
+    silent: false,
+    // Map type
+    map: '',
+    // Define left-top, right-bottom coords to control view
+    // For example, [ [180, 90], [-180, -90] ]
+    boundingCoords: null,
+    // Default on center of map
+    center: null,
+    zoom: 1,
+    scaleLimit: null,
+    // selectedMode: false
+    label: {
+      show: false,
+      color: '#000'
+    },
+    itemStyle: {
+      // color: 鍚勫紓,
+      borderWidth: 0.5,
+      borderColor: '#444',
+      color: '#eee'
+    },
+    emphasis: {
+      label: {
+        show: true,
+        color: 'rgb(100,0,0)'
+      },
+      itemStyle: {
+        color: 'rgba(255,215,0,0.8)'
+      }
+    },
+    regions: []
+  },
+
+  /**
+   * Get model of region
+   * @param  {string} name
+   * @return {module:echarts/model/Model}
+   */
+  getRegionModel: function (name) {
+    return this._optionModelMap.get(name) || new Model(null, this, this.ecModel);
+  },
+
+  /**
+   * Format label
+   * @param {string} name Region name
+   * @param {string} [status='normal'] 'normal' or 'emphasis'
+   * @return {string}
+   */
+  getFormattedLabel: function (name, status) {
+    var regionModel = this.getRegionModel(name);
+    var formatter = regionModel.get('label.' + status + '.formatter');
+    var params = {
+      name: name
+    };
+
+    if (typeof formatter === 'function') {
+      params.status = status;
+      return formatter(params);
+    } else if (typeof formatter === 'string') {
+      return formatter.replace('{a}', name != null ? name : '');
+    }
+  },
+  setZoom: function (zoom) {
+    this.option.zoom = zoom;
+  },
+  setCenter: function (center) {
+    this.option.center = center;
+  }
+});
+mixin(GeoModel, selectableMixin);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+extendComponentView({
+  type: 'geo',
+  init: function (ecModel, api) {
+    var mapDraw = new MapDraw(api, true);
+    this._mapDraw = mapDraw;
+    this.group.add(mapDraw.group);
+  },
+  render: function (geoModel, ecModel, api, payload) {
+    // Not render if it is an toggleSelect action from self
+    if (payload && payload.type === 'geoToggleSelect' && payload.from === this.uid) {
+      return;
+    }
+
+    var mapDraw = this._mapDraw;
+
+    if (geoModel.get('show')) {
+      mapDraw.draw(geoModel, ecModel, api, this, payload);
+    } else {
+      this._mapDraw.group.removeAll();
+    }
+
+    this.group.silent = geoModel.get('silent');
+  },
+  dispose: function () {
+    this._mapDraw && this._mapDraw.remove();
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+function makeAction(method, actionInfo) {
+  actionInfo.update = 'updateView';
+  registerAction(actionInfo, function (payload, ecModel) {
+    var selected = {};
+    ecModel.eachComponent({
+      mainType: 'geo',
+      query: payload
+    }, function (geoModel) {
+      geoModel[method](payload.name);
+      var geo = geoModel.coordinateSystem;
+      each$1(geo.regions, function (region) {
+        selected[region.name] = geoModel.isSelected(region.name) || false;
+      });
+    });
+    return {
+      selected: selected,
+      name: payload.name
+    };
+  });
+}
+
+makeAction('toggleSelected', {
+  type: 'geoToggleSelect',
+  event: 'geoselectchanged'
+});
+makeAction('select', {
+  type: 'geoSelect',
+  event: 'geoselected'
+});
+makeAction('unSelect', {
+  type: 'geoUnSelect',
+  event: 'geounselected'
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var PROXIMATE_ONE_DAY = 86400000;
+/**
+ * Calendar
+ *
+ * @constructor
+ *
+ * @param {Object} calendarModel calendarModel
+ * @param {Object} ecModel       ecModel
+ * @param {Object} api           api
+ */
+
+function Calendar(calendarModel, ecModel, api) {
+  this._model = calendarModel;
+}
+
+Calendar.prototype = {
+  constructor: Calendar,
+  type: 'calendar',
+  dimensions: ['time', 'value'],
+  // Required in createListFromData
+  getDimensionsInfo: function () {
+    return [{
+      name: 'time',
+      type: 'time'
+    }, 'value'];
+  },
+  getRangeInfo: function () {
+    return this._rangeInfo;
+  },
+  getModel: function () {
+    return this._model;
+  },
+  getRect: function () {
+    return this._rect;
+  },
+  getCellWidth: function () {
+    return this._sw;
+  },
+  getCellHeight: function () {
+    return this._sh;
+  },
+  getOrient: function () {
+    return this._orient;
+  },
+
+  /**
+   * getFirstDayOfWeek
+   *
+   * @example
+   *     0 : start at Sunday
+   *     1 : start at Monday
+   *
+   * @return {number}
+   */
+  getFirstDayOfWeek: function () {
+    return this._firstDayOfWeek;
+  },
+
+  /**
+   * get date info
+   *
+   * @param  {string|number} date date
+   * @return {Object}
+   * {
+   *      y: string, local full year, eg., '1940',
+   *      m: string, local month, from '01' ot '12',
+   *      d: string, local date, from '01' to '31' (if exists),
+   *      day: It is not date.getDay(). It is the location of the cell in a week, from 0 to 6,
+   *      time: timestamp,
+   *      formatedDate: string, yyyy-MM-dd,
+   *      date: original date object.
+   * }
+   */
+  getDateInfo: function (date) {
+    date = parseDate(date);
+    var y = date.getFullYear();
+    var m = date.getMonth() + 1;
+    m = m < 10 ? '0' + m : m;
+    var d = date.getDate();
+    d = d < 10 ? '0' + d : d;
+    var day = date.getDay();
+    day = Math.abs((day + 7 - this.getFirstDayOfWeek()) % 7);
+    return {
+      y: y,
+      m: m,
+      d: d,
+      day: day,
+      time: date.getTime(),
+      formatedDate: y + '-' + m + '-' + d,
+      date: date
+    };
+  },
+  getNextNDay: function (date, n) {
+    n = n || 0;
+
+    if (n === 0) {
+      return this.getDateInfo(date);
+    }
+
+    date = new Date(this.getDateInfo(date).time);
+    date.setDate(date.getDate() + n);
+    return this.getDateInfo(date);
+  },
+  update: function (ecModel, api) {
+    this._firstDayOfWeek = +this._model.getModel('dayLabel').get('firstDay');
+    this._orient = this._model.get('orient');
+    this._lineWidth = this._model.getModel('itemStyle').getItemStyle().lineWidth || 0;
+    this._rangeInfo = this._getRangeInfo(this._initRangeOption());
+    var weeks = this._rangeInfo.weeks || 1;
+    var whNames = ['width', 'height'];
+
+    var cellSize = this._model.get('cellSize').slice();
+
+    var layoutParams = this._model.getBoxLayoutParams();
+
+    var cellNumbers = this._orient === 'horizontal' ? [weeks, 7] : [7, weeks];
+    each$1([0, 1], function (idx) {
+      if (cellSizeSpecified(cellSize, idx)) {
+        layoutParams[whNames[idx]] = cellSize[idx] * cellNumbers[idx];
+      }
+    });
+    var whGlobal = {
+      width: api.getWidth(),
+      height: api.getHeight()
+    };
+    var calendarRect = this._rect = getLayoutRect(layoutParams, whGlobal);
+    each$1([0, 1], function (idx) {
+      if (!cellSizeSpecified(cellSize, idx)) {
+        cellSize[idx] = calendarRect[whNames[idx]] / cellNumbers[idx];
+      }
+    });
+
+    function cellSizeSpecified(cellSize, idx) {
+      return cellSize[idx] != null && cellSize[idx] !== 'auto';
+    }
+
+    this._sw = cellSize[0];
+    this._sh = cellSize[1];
+  },
+
+  /**
+   * Convert a time data(time, value) item to (x, y) point.
+   *
+   * @override
+   * @param  {Array|number} data data
+   * @param  {boolean} [clamp=true] out of range
+   * @return {Array} point
+   */
+  dataToPoint: function (data, clamp) {
+    isArray(data) && (data = data[0]);
+    clamp == null && (clamp = true);
+    var dayInfo = this.getDateInfo(data);
+    var range = this._rangeInfo;
+    var date = dayInfo.formatedDate; // if not in range return [NaN, NaN]
+
+    if (clamp && !(dayInfo.time >= range.start.time && dayInfo.time < range.end.time + PROXIMATE_ONE_DAY)) {
+      return [NaN, NaN];
+    }
+
+    var week = dayInfo.day;
+
+    var nthWeek = this._getRangeInfo([range.start.time, date]).nthWeek;
+
+    if (this._orient === 'vertical') {
+      return [this._rect.x + week * this._sw + this._sw / 2, this._rect.y + nthWeek * this._sh + this._sh / 2];
+    }
+
+    return [this._rect.x + nthWeek * this._sw + this._sw / 2, this._rect.y + week * this._sh + this._sh / 2];
+  },
+
+  /**
+   * Convert a (x, y) point to time data
+   *
+   * @override
+   * @param  {string} point point
+   * @return {string}       data
+   */
+  pointToData: function (point) {
+    var date = this.pointToDate(point);
+    return date && date.time;
+  },
+
+  /**
+   * Convert a time date item to (x, y) four point.
+   *
+   * @param  {Array} data  date[0] is date
+   * @param  {boolean} [clamp=true]  out of range
+   * @return {Object}       point
+   */
+  dataToRect: function (data, clamp) {
+    var point = this.dataToPoint(data, clamp);
+    return {
+      contentShape: {
+        x: point[0] - (this._sw - this._lineWidth) / 2,
+        y: point[1] - (this._sh - this._lineWidth) / 2,
+        width: this._sw - this._lineWidth,
+        height: this._sh - this._lineWidth
+      },
+      center: point,
+      tl: [point[0] - this._sw / 2, point[1] - this._sh / 2],
+      tr: [point[0] + this._sw / 2, point[1] - this._sh / 2],
+      br: [point[0] + this._sw / 2, point[1] + this._sh / 2],
+      bl: [point[0] - this._sw / 2, point[1] + this._sh / 2]
+    };
+  },
+
+  /**
+   * Convert a (x, y) point to time date
+   *
+   * @param  {Array} point point
+   * @return {Object}       date
+   */
+  pointToDate: function (point) {
+    var nthX = Math.floor((point[0] - this._rect.x) / this._sw) + 1;
+    var nthY = Math.floor((point[1] - this._rect.y) / this._sh) + 1;
+    var range = this._rangeInfo.range;
+
+    if (this._orient === 'vertical') {
+      return this._getDateByWeeksAndDay(nthY, nthX - 1, range);
+    }
+
+    return this._getDateByWeeksAndDay(nthX, nthY - 1, range);
+  },
+
+  /**
+   * @inheritDoc
+   */
+  convertToPixel: curry(doConvert$2, 'dataToPoint'),
+
+  /**
+   * @inheritDoc
+   */
+  convertFromPixel: curry(doConvert$2, 'pointToData'),
+
+  /**
+   * initRange
+   *
+   * @private
+   * @return {Array} [start, end]
+   */
+  _initRangeOption: function () {
+    var range = this._model.get('range');
+
+    var rg = range;
+
+    if (isArray(rg) && rg.length === 1) {
+      rg = rg[0];
+    }
+
+    if (/^\d{4}$/.test(rg)) {
+      range = [rg + '-01-01', rg + '-12-31'];
+    }
+
+    if (/^\d{4}[\/|-]\d{1,2}$/.test(rg)) {
+      var start = this.getDateInfo(rg);
+      var firstDay = start.date;
+      firstDay.setMonth(firstDay.getMonth() + 1);
+      var end = this.getNextNDay(firstDay, -1);
+      range = [start.formatedDate, end.formatedDate];
+    }
+
+    if (/^\d{4}[\/|-]\d{1,2}[\/|-]\d{1,2}$/.test(rg)) {
+      range = [rg, rg];
+    }
+
+    var tmp = this._getRangeInfo(range);
+
+    if (tmp.start.time > tmp.end.time) {
+      range.reverse();
+    }
+
+    return range;
+  },
+
+  /**
+   * range info
+   *
+   * @private
+   * @param  {Array} range range ['2017-01-01', '2017-07-08']
+   *  If range[0] > range[1], they will not be reversed.
+   * @return {Object}       obj
+   */
+  _getRangeInfo: function (range) {
+    range = [this.getDateInfo(range[0]), this.getDateInfo(range[1])];
+    var reversed;
+
+    if (range[0].time > range[1].time) {
+      reversed = true;
+      range.reverse();
+    }
+
+    var allDay = Math.floor(range[1].time / PROXIMATE_ONE_DAY) - Math.floor(range[0].time / PROXIMATE_ONE_DAY) + 1; // Consider case:
+    // Firstly set system timezone as "Time Zone: America/Toronto",
+    // ```
+    // var first = new Date(1478412000000 - 3600 * 1000 * 2.5);
+    // var second = new Date(1478412000000);
+    // var allDays = Math.floor(second / ONE_DAY) - Math.floor(first / ONE_DAY) + 1;
+    // ```
+    // will get wrong result because of DST. So we should fix it.
+
+    var date = new Date(range[0].time);
+    var startDateNum = date.getDate();
+    var endDateNum = range[1].date.getDate();
+    date.setDate(startDateNum + allDay - 1); // The bias can not over a month, so just compare date.
+
+    if (date.getDate() !== endDateNum) {
+      var sign = date.getTime() - range[1].time > 0 ? 1 : -1;
+
+      while (date.getDate() !== endDateNum && (date.getTime() - range[1].time) * sign > 0) {
+        allDay -= sign;
+        date.setDate(startDateNum + allDay - 1);
+      }
+    }
+
+    var weeks = Math.floor((allDay + range[0].day + 6) / 7);
+    var nthWeek = reversed ? -weeks + 1 : weeks - 1;
+    reversed && range.reverse();
+    return {
+      range: [range[0].formatedDate, range[1].formatedDate],
+      start: range[0],
+      end: range[1],
+      allDay: allDay,
+      weeks: weeks,
+      // From 0.
+      nthWeek: nthWeek,
+      fweek: range[0].day,
+      lweek: range[1].day
+    };
+  },
+
+  /**
+   * get date by nthWeeks and week day in range
+   *
+   * @private
+   * @param  {number} nthWeek the week
+   * @param  {number} day   the week day
+   * @param  {Array} range [d1, d2]
+   * @return {Object}
+   */
+  _getDateByWeeksAndDay: function (nthWeek, day, range) {
+    var rangeInfo = this._getRangeInfo(range);
+
+    if (nthWeek > rangeInfo.weeks || nthWeek === 0 && day < rangeInfo.fweek || nthWeek === rangeInfo.weeks && day > rangeInfo.lweek) {
+      return false;
+    }
+
+    var nthDay = (nthWeek - 1) * 7 - rangeInfo.fweek + day;
+    var date = new Date(rangeInfo.start.time);
+    date.setDate(rangeInfo.start.d + nthDay);
+    return this.getDateInfo(date);
+  }
+};
+Calendar.dimensions = Calendar.prototype.dimensions;
+Calendar.getDimensionsInfo = Calendar.prototype.getDimensionsInfo;
+
+Calendar.create = function (ecModel, api) {
+  var calendarList = [];
+  ecModel.eachComponent('calendar', function (calendarModel) {
+    var calendar = new Calendar(calendarModel, ecModel, api);
+    calendarList.push(calendar);
+    calendarModel.coordinateSystem = calendar;
+  });
+  ecModel.eachSeries(function (calendarSeries) {
+    if (calendarSeries.get('coordinateSystem') === 'calendar') {
+      // Inject coordinate system
+      calendarSeries.coordinateSystem = calendarList[calendarSeries.get('calendarIndex') || 0];
+    }
+  });
+  return calendarList;
+};
+
+function doConvert$2(methodName, ecModel, finder, value) {
+  var calendarModel = finder.calendarModel;
+  var seriesModel = finder.seriesModel;
+  var coordSys = calendarModel ? calendarModel.coordinateSystem : seriesModel ? seriesModel.coordinateSystem : null;
+  return coordSys === this ? coordSys[methodName](value) : null;
+}
+
+CoordinateSystemManager.register('calendar', Calendar);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var CalendarModel = ComponentModel.extend({
+  type: 'calendar',
+
+  /**
+   * @type {module:echarts/coord/calendar/Calendar}
+   */
+  coordinateSystem: null,
+  defaultOption: {
+    zlevel: 0,
+    z: 2,
+    left: 80,
+    top: 60,
+    cellSize: 20,
+    // horizontal vertical
+    orient: 'horizontal',
+    // month separate line style
+    splitLine: {
+      show: true,
+      lineStyle: {
+        color: '#000',
+        width: 1,
+        type: 'solid'
+      }
+    },
+    // rect style  temporarily unused emphasis
+    itemStyle: {
+      color: '#fff',
+      borderWidth: 1,
+      borderColor: '#ccc'
+    },
+    // week text style
+    dayLabel: {
+      show: true,
+      // a week first day
+      firstDay: 0,
+      // start end
+      position: 'start',
+      margin: '50%',
+      // 50% of cellSize
+      nameMap: 'en',
+      color: '#000'
+    },
+    // month text style
+    monthLabel: {
+      show: true,
+      // start end
+      position: 'start',
+      margin: 5,
+      // center or left
+      align: 'center',
+      // cn en []
+      nameMap: 'en',
+      formatter: null,
+      color: '#000'
+    },
+    // year text style
+    yearLabel: {
+      show: true,
+      // top bottom left right
+      position: null,
+      margin: 30,
+      formatter: null,
+      color: '#ccc',
+      fontFamily: 'sans-serif',
+      fontWeight: 'bolder',
+      fontSize: 20
+    }
+  },
+
+  /**
+   * @override
+   */
+  init: function (option, parentModel, ecModel, extraOpt) {
+    var inputPositionParams = getLayoutParams(option);
+    CalendarModel.superApply(this, 'init', arguments);
+    mergeAndNormalizeLayoutParams(option, inputPositionParams);
+  },
+
+  /**
+   * @override
+   */
+  mergeOption: function (option, extraOpt) {
+    CalendarModel.superApply(this, 'mergeOption', arguments);
+    mergeAndNormalizeLayoutParams(this.option, option);
+  }
+});
+
+function mergeAndNormalizeLayoutParams(target, raw) {
+  // Normalize cellSize
+  var cellSize = target.cellSize;
+
+  if (!isArray(cellSize)) {
+    cellSize = target.cellSize = [cellSize, cellSize];
+  } else if (cellSize.length === 1) {
+    cellSize[1] = cellSize[0];
+  }
+
+  var ignoreSize = map([0, 1], function (hvIdx) {
+    // If user have set `width` or both `left` and `right`, cellSize
+    // will be automatically set to 'auto', otherwise the default
+    // setting of cellSize will make `width` setting not work.
+    if (sizeCalculable(raw, hvIdx)) {
+      cellSize[hvIdx] = 'auto';
+    }
+
+    return cellSize[hvIdx] != null && cellSize[hvIdx] !== 'auto';
+  });
+  mergeLayoutParam(target, raw, {
+    type: 'box',
+    ignoreSize: ignoreSize
+  });
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var MONTH_TEXT = {
+  EN: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+  CN: ['涓�鏈�', '浜屾湀', '涓夋湀', '鍥涙湀', '浜旀湀', '鍏湀', '涓冩湀', '鍏湀', '涔濇湀', '鍗佹湀', '鍗佷竴鏈�', '鍗佷簩鏈�']
+};
+var WEEK_TEXT = {
+  EN: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
+  CN: ['鏃�', '涓�', '浜�', '涓�', '鍥�', '浜�', '鍏�']
+};
+extendComponentView({
+  type: 'calendar',
+
+  /**
+   * top/left line points
+   *  @private
+   */
+  _tlpoints: null,
+
+  /**
+   * bottom/right line points
+   *  @private
+   */
+  _blpoints: null,
+
+  /**
+   * first day of month
+   *  @private
+   */
+  _firstDayOfMonth: null,
+
+  /**
+   * first day point of month
+   *  @private
+   */
+  _firstDayPoints: null,
+  render: function (calendarModel, ecModel, api) {
+    var group = this.group;
+    group.removeAll();
+    var coordSys = calendarModel.coordinateSystem; // range info
+
+    var rangeData = coordSys.getRangeInfo();
+    var orient = coordSys.getOrient();
+
+    this._renderDayRect(calendarModel, rangeData, group); // _renderLines must be called prior to following function
+
+
+    this._renderLines(calendarModel, rangeData, orient, group);
+
+    this._renderYearText(calendarModel, rangeData, orient, group);
+
+    this._renderMonthText(calendarModel, orient, group);
+
+    this._renderWeekText(calendarModel, rangeData, orient, group);
+  },
+  // render day rect
+  _renderDayRect: function (calendarModel, rangeData, group) {
+    var coordSys = calendarModel.coordinateSystem;
+    var itemRectStyleModel = calendarModel.getModel('itemStyle').getItemStyle();
+    var sw = coordSys.getCellWidth();
+    var sh = coordSys.getCellHeight();
+
+    for (var i = rangeData.start.time; i <= rangeData.end.time; i = coordSys.getNextNDay(i, 1).time) {
+      var point = coordSys.dataToRect([i], false).tl; // every rect
+
+      var rect = new Rect({
+        shape: {
+          x: point[0],
+          y: point[1],
+          width: sw,
+          height: sh
+        },
+        cursor: 'default',
+        style: itemRectStyleModel
+      });
+      group.add(rect);
+    }
+  },
+  // render separate line
+  _renderLines: function (calendarModel, rangeData, orient, group) {
+    var self = this;
+    var coordSys = calendarModel.coordinateSystem;
+    var lineStyleModel = calendarModel.getModel('splitLine.lineStyle').getLineStyle();
+    var show = calendarModel.get('splitLine.show');
+    var lineWidth = lineStyleModel.lineWidth;
+    this._tlpoints = [];
+    this._blpoints = [];
+    this._firstDayOfMonth = [];
+    this._firstDayPoints = [];
+    var firstDay = rangeData.start;
+
+    for (var i = 0; firstDay.time <= rangeData.end.time; i++) {
+      addPoints(firstDay.formatedDate);
+
+      if (i === 0) {
+        firstDay = coordSys.getDateInfo(rangeData.start.y + '-' + rangeData.start.m);
+      }
+
+      var date = firstDay.date;
+      date.setMonth(date.getMonth() + 1);
+      firstDay = coordSys.getDateInfo(date);
+    }
+
+    addPoints(coordSys.getNextNDay(rangeData.end.time, 1).formatedDate);
+
+    function addPoints(date) {
+      self._firstDayOfMonth.push(coordSys.getDateInfo(date));
+
+      self._firstDayPoints.push(coordSys.dataToRect([date], false).tl);
+
+      var points = self._getLinePointsOfOneWeek(calendarModel, date, orient);
+
+      self._tlpoints.push(points[0]);
+
+      self._blpoints.push(points[points.length - 1]);
+
+      show && self._drawSplitline(points, lineStyleModel, group);
+    } // render top/left line
+
+
+    show && this._drawSplitline(self._getEdgesPoints(self._tlpoints, lineWidth, orient), lineStyleModel, group); // render bottom/right line
+
+    show && this._drawSplitline(self._getEdgesPoints(self._blpoints, lineWidth, orient), lineStyleModel, group);
+  },
+  // get points at both ends
+  _getEdgesPoints: function (points, lineWidth, orient) {
+    var rs = [points[0].slice(), points[points.length - 1].slice()];
+    var idx = orient === 'horizontal' ? 0 : 1; // both ends of the line are extend half lineWidth
+
+    rs[0][idx] = rs[0][idx] - lineWidth / 2;
+    rs[1][idx] = rs[1][idx] + lineWidth / 2;
+    return rs;
+  },
+  // render split line
+  _drawSplitline: function (points, lineStyleModel, group) {
+    var poyline = new Polyline({
+      z2: 20,
+      shape: {
+        points: points
+      },
+      style: lineStyleModel
+    });
+    group.add(poyline);
+  },
+  // render month line of one week points
+  _getLinePointsOfOneWeek: function (calendarModel, date, orient) {
+    var coordSys = calendarModel.coordinateSystem;
+    date = coordSys.getDateInfo(date);
+    var points = [];
+
+    for (var i = 0; i < 7; i++) {
+      var tmpD = coordSys.getNextNDay(date.time, i);
+      var point = coordSys.dataToRect([tmpD.time], false);
+      points[2 * tmpD.day] = point.tl;
+      points[2 * tmpD.day + 1] = point[orient === 'horizontal' ? 'bl' : 'tr'];
+    }
+
+    return points;
+  },
+  _formatterLabel: function (formatter, params) {
+    if (typeof formatter === 'string' && formatter) {
+      return formatTplSimple(formatter, params);
+    }
+
+    if (typeof formatter === 'function') {
+      return formatter(params);
+    }
+
+    return params.nameMap;
+  },
+  _yearTextPositionControl: function (textEl, point, orient, position, margin) {
+    point = point.slice();
+    var aligns = ['center', 'bottom'];
+
+    if (position === 'bottom') {
+      point[1] += margin;
+      aligns = ['center', 'top'];
+    } else if (position === 'left') {
+      point[0] -= margin;
+    } else if (position === 'right') {
+      point[0] += margin;
+      aligns = ['center', 'top'];
+    } else {
+      // top
+      point[1] -= margin;
+    }
+
+    var rotate = 0;
+
+    if (position === 'left' || position === 'right') {
+      rotate = Math.PI / 2;
+    }
+
+    return {
+      rotation: rotate,
+      position: point,
+      style: {
+        textAlign: aligns[0],
+        textVerticalAlign: aligns[1]
+      }
+    };
+  },
+  // render year
+  _renderYearText: function (calendarModel, rangeData, orient, group) {
+    var yearLabel = calendarModel.getModel('yearLabel');
+
+    if (!yearLabel.get('show')) {
+      return;
+    }
+
+    var margin = yearLabel.get('margin');
+    var pos = yearLabel.get('position');
+
+    if (!pos) {
+      pos = orient !== 'horizontal' ? 'top' : 'left';
+    }
+
+    var points = [this._tlpoints[this._tlpoints.length - 1], this._blpoints[0]];
+    var xc = (points[0][0] + points[1][0]) / 2;
+    var yc = (points[0][1] + points[1][1]) / 2;
+    var idx = orient === 'horizontal' ? 0 : 1;
+    var posPoints = {
+      top: [xc, points[idx][1]],
+      bottom: [xc, points[1 - idx][1]],
+      left: [points[1 - idx][0], yc],
+      right: [points[idx][0], yc]
+    };
+    var name = rangeData.start.y;
+
+    if (+rangeData.end.y > +rangeData.start.y) {
+      name = name + '-' + rangeData.end.y;
+    }
+
+    var formatter = yearLabel.get('formatter');
+    var params = {
+      start: rangeData.start.y,
+      end: rangeData.end.y,
+      nameMap: name
+    };
+
+    var content = this._formatterLabel(formatter, params);
+
+    var yearText = new Text({
+      z2: 30
+    });
+    setTextStyle(yearText.style, yearLabel, {
+      text: content
+    }), yearText.attr(this._yearTextPositionControl(yearText, posPoints[pos], orient, pos, margin));
+    group.add(yearText);
+  },
+  _monthTextPositionControl: function (point, isCenter, orient, position, margin) {
+    var align = 'left';
+    var vAlign = 'top';
+    var x = point[0];
+    var y = point[1];
+
+    if (orient === 'horizontal') {
+      y = y + margin;
+
+      if (isCenter) {
+        align = 'center';
+      }
+
+      if (position === 'start') {
+        vAlign = 'bottom';
+      }
+    } else {
+      x = x + margin;
+
+      if (isCenter) {
+        vAlign = 'middle';
+      }
+
+      if (position === 'start') {
+        align = 'right';
+      }
+    }
+
+    return {
+      x: x,
+      y: y,
+      textAlign: align,
+      textVerticalAlign: vAlign
+    };
+  },
+  // render month and year text
+  _renderMonthText: function (calendarModel, orient, group) {
+    var monthLabel = calendarModel.getModel('monthLabel');
+
+    if (!monthLabel.get('show')) {
+      return;
+    }
+
+    var nameMap = monthLabel.get('nameMap');
+    var margin = monthLabel.get('margin');
+    var pos = monthLabel.get('position');
+    var align = monthLabel.get('align');
+    var termPoints = [this._tlpoints, this._blpoints];
+
+    if (isString(nameMap)) {
+      nameMap = MONTH_TEXT[nameMap.toUpperCase()] || [];
+    }
+
+    var idx = pos === 'start' ? 0 : 1;
+    var axis = orient === 'horizontal' ? 0 : 1;
+    margin = pos === 'start' ? -margin : margin;
+    var isCenter = align === 'center';
+
+    for (var i = 0; i < termPoints[idx].length - 1; i++) {
+      var tmp = termPoints[idx][i].slice();
+      var firstDay = this._firstDayOfMonth[i];
+
+      if (isCenter) {
+        var firstDayPoints = this._firstDayPoints[i];
+        tmp[axis] = (firstDayPoints[axis] + termPoints[0][i + 1][axis]) / 2;
+      }
+
+      var formatter = monthLabel.get('formatter');
+      var name = nameMap[+firstDay.m - 1];
+      var params = {
+        yyyy: firstDay.y,
+        yy: (firstDay.y + '').slice(2),
+        MM: firstDay.m,
+        M: +firstDay.m,
+        nameMap: name
+      };
+
+      var content = this._formatterLabel(formatter, params);
+
+      var monthText = new Text({
+        z2: 30
+      });
+      extend(setTextStyle(monthText.style, monthLabel, {
+        text: content
+      }), this._monthTextPositionControl(tmp, isCenter, orient, pos, margin));
+      group.add(monthText);
+    }
+  },
+  _weekTextPositionControl: function (point, orient, position, margin, cellSize) {
+    var align = 'center';
+    var vAlign = 'middle';
+    var x = point[0];
+    var y = point[1];
+    var isStart = position === 'start';
+
+    if (orient === 'horizontal') {
+      x = x + margin + (isStart ? 1 : -1) * cellSize[0] / 2;
+      align = isStart ? 'right' : 'left';
+    } else {
+      y = y + margin + (isStart ? 1 : -1) * cellSize[1] / 2;
+      vAlign = isStart ? 'bottom' : 'top';
+    }
+
+    return {
+      x: x,
+      y: y,
+      textAlign: align,
+      textVerticalAlign: vAlign
+    };
+  },
+  // render weeks
+  _renderWeekText: function (calendarModel, rangeData, orient, group) {
+    var dayLabel = calendarModel.getModel('dayLabel');
+
+    if (!dayLabel.get('show')) {
+      return;
+    }
+
+    var coordSys = calendarModel.coordinateSystem;
+    var pos = dayLabel.get('position');
+    var nameMap = dayLabel.get('nameMap');
+    var margin = dayLabel.get('margin');
+    var firstDayOfWeek = coordSys.getFirstDayOfWeek();
+
+    if (isString(nameMap)) {
+      nameMap = WEEK_TEXT[nameMap.toUpperCase()] || [];
+    }
+
+    var start = coordSys.getNextNDay(rangeData.end.time, 7 - rangeData.lweek).time;
+    var cellSize = [coordSys.getCellWidth(), coordSys.getCellHeight()];
+    margin = parsePercent$1(margin, cellSize[orient === 'horizontal' ? 0 : 1]);
+
+    if (pos === 'start') {
+      start = coordSys.getNextNDay(rangeData.start.time, -(7 + rangeData.fweek)).time;
+      margin = -margin;
+    }
+
+    for (var i = 0; i < 7; i++) {
+      var tmpD = coordSys.getNextNDay(start, i);
+      var point = coordSys.dataToRect([tmpD.time], false).center;
+      var day = i;
+      day = Math.abs((i + firstDayOfWeek) % 7);
+      var weekText = new Text({
+        z2: 30
+      });
+      extend(setTextStyle(weekText.style, dayLabel, {
+        text: nameMap[day]
+      }), this._weekTextPositionControl(point, orient, pos, margin, cellSize));
+      group.add(weekText);
+    }
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * @file calendar.js
+ * @author dxh
+ */
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+extendComponentModel({
+  type: 'title',
+  layoutMode: {
+    type: 'box',
+    ignoreSize: true
+  },
+  defaultOption: {
+    // 涓�绾у眰鍙�
+    zlevel: 0,
+    // 浜岀骇灞傚彔
+    z: 6,
+    show: true,
+    text: '',
+    // 瓒呴摼鎺ヨ烦杞�
+    // link: null,
+    // 浠呮敮鎸乻elf | blank
+    target: 'blank',
+    subtext: '',
+    // 瓒呴摼鎺ヨ烦杞�
+    // sublink: null,
+    // 浠呮敮鎸乻elf | blank
+    subtarget: 'blank',
+    // 'center' 娄 'left' 娄 'right'
+    // 娄 {number}锛坸鍧愭爣锛屽崟浣峱x锛�
+    left: 0,
+    // 'top' 娄 'bottom' 娄 'center'
+    // 娄 {number}锛坹鍧愭爣锛屽崟浣峱x锛�
+    top: 0,
+    // 姘村钩瀵归綈
+    // 'auto' | 'left' | 'right' | 'center'
+    // 榛樿鏍规嵁 left 鐨勪綅缃垽鏂槸宸﹀榻愯繕鏄彸瀵归綈
+    // textAlign: null
+    //
+    // 鍨傜洿瀵归綈
+    // 'auto' | 'top' | 'bottom' | 'middle'
+    // 榛樿鏍规嵁 top 浣嶇疆鍒ゆ柇鏄笂瀵归綈杩樻槸涓嬪榻�
+    // textBaseline: null
+    backgroundColor: 'rgba(0,0,0,0)',
+    // 鏍囬杈规棰滆壊
+    borderColor: '#ccc',
+    // 鏍囬杈规绾垮锛屽崟浣峱x锛岄粯璁や负0锛堟棤杈规锛�
+    borderWidth: 0,
+    // 鏍囬鍐呰竟璺濓紝鍗曚綅px锛岄粯璁ゅ悇鏂瑰悜鍐呰竟璺濅负5锛�
+    // 鎺ュ彈鏁扮粍鍒嗗埆璁惧畾涓婂彸涓嬪乏杈硅窛锛屽悓css
+    padding: 5,
+    // 涓诲壇鏍囬绾靛悜闂撮殧锛屽崟浣峱x锛岄粯璁や负10锛�
+    itemGap: 10,
+    textStyle: {
+      fontSize: 18,
+      fontWeight: 'bolder',
+      color: '#333'
+    },
+    subtextStyle: {
+      color: '#aaa'
+    }
+  }
+}); // View
+
+extendComponentView({
+  type: 'title',
+  render: function (titleModel, ecModel, api) {
+    this.group.removeAll();
+
+    if (!titleModel.get('show')) {
+      return;
+    }
+
+    var group = this.group;
+    var textStyleModel = titleModel.getModel('textStyle');
+    var subtextStyleModel = titleModel.getModel('subtextStyle');
+    var textAlign = titleModel.get('textAlign');
+    var textBaseline = titleModel.get('textBaseline');
+    var textEl = new Text({
+      style: setTextStyle({}, textStyleModel, {
+        text: titleModel.get('text'),
+        textFill: textStyleModel.getTextColor()
+      }, {
+        disableBox: true
+      }),
+      z2: 10
+    });
+    var textRect = textEl.getBoundingRect();
+    var subText = titleModel.get('subtext');
+    var subTextEl = new Text({
+      style: setTextStyle({}, subtextStyleModel, {
+        text: subText,
+        textFill: subtextStyleModel.getTextColor(),
+        y: textRect.height + titleModel.get('itemGap'),
+        textVerticalAlign: 'top'
+      }, {
+        disableBox: true
+      }),
+      z2: 10
+    });
+    var link = titleModel.get('link');
+    var sublink = titleModel.get('sublink');
+    var triggerEvent = titleModel.get('triggerEvent', true);
+    textEl.silent = !link && !triggerEvent;
+    subTextEl.silent = !sublink && !triggerEvent;
+
+    if (link) {
+      textEl.on('click', function () {
+        window.open(link, '_' + titleModel.get('target'));
+      });
+    }
+
+    if (sublink) {
+      subTextEl.on('click', function () {
+        window.open(sublink, '_' + titleModel.get('subtarget'));
+      });
+    }
+
+    textEl.eventData = subTextEl.eventData = triggerEvent ? {
+      componentType: 'title',
+      componentIndex: titleModel.componentIndex
+    } : null;
+    group.add(textEl);
+    subText && group.add(subTextEl); // If no subText, but add subTextEl, there will be an empty line.
+
+    var groupRect = group.getBoundingRect();
+    var layoutOption = titleModel.getBoxLayoutParams();
+    layoutOption.width = groupRect.width;
+    layoutOption.height = groupRect.height;
+    var layoutRect = getLayoutRect(layoutOption, {
+      width: api.getWidth(),
+      height: api.getHeight()
+    }, titleModel.get('padding')); // Adjust text align based on position
+
+    if (!textAlign) {
+      // Align left if title is on the left. center and right is same
+      textAlign = titleModel.get('left') || titleModel.get('right');
+
+      if (textAlign === 'middle') {
+        textAlign = 'center';
+      } // Adjust layout by text align
+
+
+      if (textAlign === 'right') {
+        layoutRect.x += layoutRect.width;
+      } else if (textAlign === 'center') {
+        layoutRect.x += layoutRect.width / 2;
+      }
+    }
+
+    if (!textBaseline) {
+      textBaseline = titleModel.get('top') || titleModel.get('bottom');
+
+      if (textBaseline === 'center') {
+        textBaseline = 'middle';
+      }
+
+      if (textBaseline === 'bottom') {
+        layoutRect.y += layoutRect.height;
+      } else if (textBaseline === 'middle') {
+        layoutRect.y += layoutRect.height / 2;
+      }
+
+      textBaseline = textBaseline || 'top';
+    }
+
+    group.attr('position', [layoutRect.x, layoutRect.y]);
+    var alignStyle = {
+      textAlign: textAlign,
+      textVerticalAlign: textBaseline
+    };
+    textEl.setStyle(alignStyle);
+    subTextEl.setStyle(alignStyle); // Render background
+    // Get groupRect again because textAlign has been changed
+
+    groupRect = group.getBoundingRect();
+    var padding = layoutRect.margin;
+    var style = titleModel.getItemStyle(['color', 'opacity']);
+    style.fill = titleModel.get('backgroundColor');
+    var rect = new Rect({
+      shape: {
+        x: groupRect.x - padding[3],
+        y: groupRect.y - padding[0],
+        width: groupRect.width + padding[1] + padding[3],
+        height: groupRect.height + padding[0] + padding[2],
+        r: titleModel.get('borderRadius')
+      },
+      style: style,
+      silent: true
+    });
+    subPixelOptimizeRect(rect);
+    group.add(rect);
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var LegendModel = extendComponentModel({
+  type: 'legend.plain',
+  dependencies: ['series'],
+  layoutMode: {
+    type: 'box',
+    // legend.width/height are maxWidth/maxHeight actually,
+    // whereas realy width/height is calculated by its content.
+    // (Setting {left: 10, right: 10} does not make sense).
+    // So consider the case:
+    // `setOption({legend: {left: 10});`
+    // then `setOption({legend: {right: 10});`
+    // The previous `left` should be cleared by setting `ignoreSize`.
+    ignoreSize: true
+  },
+  init: function (option, parentModel, ecModel) {
+    this.mergeDefaultAndTheme(option, ecModel);
+    option.selected = option.selected || {};
+  },
+  mergeOption: function (option) {
+    LegendModel.superCall(this, 'mergeOption', option);
+  },
+  optionUpdated: function () {
+    this._updateData(this.ecModel);
+
+    var legendData = this._data; // If selectedMode is single, try to select one
+
+    if (legendData[0] && this.get('selectedMode') === 'single') {
+      var hasSelected = false; // If has any selected in option.selected
+
+      for (var i = 0; i < legendData.length; i++) {
+        var name = legendData[i].get('name');
+
+        if (this.isSelected(name)) {
+          // Force to unselect others
+          this.select(name);
+          hasSelected = true;
+          break;
+        }
+      } // Try select the first if selectedMode is single
+
+
+      !hasSelected && this.select(legendData[0].get('name'));
+    }
+  },
+  _updateData: function (ecModel) {
+    var potentialData = [];
+    var availableNames = [];
+    ecModel.eachRawSeries(function (seriesModel) {
+      var seriesName = seriesModel.name;
+      availableNames.push(seriesName);
+      var isPotential;
+
+      if (seriesModel.legendDataProvider) {
+        var data = seriesModel.legendDataProvider();
+        var names = data.mapArray(data.getName);
+
+        if (!ecModel.isSeriesFiltered(seriesModel)) {
+          availableNames = availableNames.concat(names);
+        }
+
+        if (names.length) {
+          potentialData = potentialData.concat(names);
+        } else {
+          isPotential = true;
+        }
+      } else {
+        isPotential = true;
+      }
+
+      if (isPotential && isNameSpecified(seriesModel)) {
+        potentialData.push(seriesModel.name);
+      }
+    });
+    /**
+     * @type {Array.<string>}
+     * @private
+     */
+
+    this._availableNames = availableNames; // If legend.data not specified in option, use availableNames as data,
+    // which is convinient for user preparing option.
+
+    var rawData = this.get('data') || potentialData;
+    var legendData = map(rawData, function (dataItem) {
+      // Can be string or number
+      if (typeof dataItem === 'string' || typeof dataItem === 'number') {
+        dataItem = {
+          name: dataItem
+        };
+      }
+
+      return new Model(dataItem, this, this.ecModel);
+    }, this);
+    /**
+     * @type {Array.<module:echarts/model/Model>}
+     * @private
+     */
+
+    this._data = legendData;
+  },
+
+  /**
+   * @return {Array.<module:echarts/model/Model>}
+   */
+  getData: function () {
+    return this._data;
+  },
+
+  /**
+   * @param {string} name
+   */
+  select: function (name) {
+    var selected = this.option.selected;
+    var selectedMode = this.get('selectedMode');
+
+    if (selectedMode === 'single') {
+      var data = this._data;
+      each$1(data, function (dataItem) {
+        selected[dataItem.get('name')] = false;
+      });
+    }
+
+    selected[name] = true;
+  },
+
+  /**
+   * @param {string} name
+   */
+  unSelect: function (name) {
+    if (this.get('selectedMode') !== 'single') {
+      this.option.selected[name] = false;
+    }
+  },
+
+  /**
+   * @param {string} name
+   */
+  toggleSelected: function (name) {
+    var selected = this.option.selected; // Default is true
+
+    if (!selected.hasOwnProperty(name)) {
+      selected[name] = true;
+    }
+
+    this[selected[name] ? 'unSelect' : 'select'](name);
+  },
+
+  /**
+   * @param {string} name
+   */
+  isSelected: function (name) {
+    var selected = this.option.selected;
+    return !(selected.hasOwnProperty(name) && !selected[name]) && indexOf(this._availableNames, name) >= 0;
+  },
+  defaultOption: {
+    // 涓�绾у眰鍙�
+    zlevel: 0,
+    // 浜岀骇灞傚彔
+    z: 4,
+    show: true,
+    // 甯冨眬鏂瑰紡锛岄粯璁や负姘村钩甯冨眬锛屽彲閫変负锛�
+    // 'horizontal' | 'vertical'
+    orient: 'horizontal',
+    left: 'center',
+    // right: 'center',
+    top: 0,
+    // bottom: null,
+    // 姘村钩瀵归綈
+    // 'auto' | 'left' | 'right'
+    // 榛樿涓� 'auto', 鏍规嵁 x 鐨勪綅缃垽鏂槸宸﹀榻愯繕鏄彸瀵归綈
+    align: 'auto',
+    backgroundColor: 'rgba(0,0,0,0)',
+    // 鍥句緥杈规棰滆壊
+    borderColor: '#ccc',
+    borderRadius: 0,
+    // 鍥句緥杈规绾垮锛屽崟浣峱x锛岄粯璁や负0锛堟棤杈规锛�
+    borderWidth: 0,
+    // 鍥句緥鍐呰竟璺濓紝鍗曚綅px锛岄粯璁ゅ悇鏂瑰悜鍐呰竟璺濅负5锛�
+    // 鎺ュ彈鏁扮粍鍒嗗埆璁惧畾涓婂彸涓嬪乏杈硅窛锛屽悓css
+    padding: 5,
+    // 鍚勪釜item涔嬮棿鐨勯棿闅旓紝鍗曚綅px锛岄粯璁や负10锛�
+    // 妯悜甯冨眬鏃朵负姘村钩闂撮殧锛岀旱鍚戝竷灞�鏃朵负绾靛悜闂撮殧
+    itemGap: 10,
+    // 鍥句緥鍥惧舰瀹藉害
+    itemWidth: 25,
+    // 鍥句緥鍥惧舰楂樺害
+    itemHeight: 14,
+    // 鍥句緥鍏抽棴鏃跺�欑殑棰滆壊
+    inactiveColor: '#ccc',
+    textStyle: {
+      // 鍥句緥鏂囧瓧棰滆壊
+      color: '#333'
+    },
+    // formatter: '',
+    // 閫夋嫨妯″紡锛岄粯璁ゅ紑鍚浘渚嬪紑鍏�
+    selectedMode: true,
+    // 閰嶇疆榛樿閫変腑鐘舵�侊紝鍙厤鍚圠EGEND.SELECTED浜嬩欢鍋氬姩鎬佹暟鎹浇鍏�
+    // selected: null,
+    // 鍥句緥鍐呭锛堣瑙乴egend.data锛屾暟缁勪腑姣忎竴椤逛唬琛ㄤ竴涓猧tem
+    // data: [],
+    // Tooltip 鐩稿叧閰嶇疆
+    tooltip: {
+      show: false
+    }
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+function legendSelectActionHandler(methodName, payload, ecModel) {
+  var selectedMap = {};
+  var isToggleSelect = methodName === 'toggleSelected';
+  var isSelected; // Update all legend components
+
+  ecModel.eachComponent('legend', function (legendModel) {
+    if (isToggleSelect && isSelected != null) {
+      // Force other legend has same selected status
+      // Or the first is toggled to true and other are toggled to false
+      // In the case one legend has some item unSelected in option. And if other legend
+      // doesn't has the item, they will assume it is selected.
+      legendModel[isSelected ? 'select' : 'unSelect'](payload.name);
+    } else {
+      legendModel[methodName](payload.name);
+      isSelected = legendModel.isSelected(payload.name);
+    }
+
+    var legendData = legendModel.getData();
+    each$1(legendData, function (model) {
+      var name = model.get('name'); // Wrap element
+
+      if (name === '\n' || name === '') {
+        return;
+      }
+
+      var isItemSelected = legendModel.isSelected(name);
+
+      if (selectedMap.hasOwnProperty(name)) {
+        // Unselected if any legend is unselected
+        selectedMap[name] = selectedMap[name] && isItemSelected;
+      } else {
+        selectedMap[name] = isItemSelected;
+      }
+    });
+  }); // Return the event explicitly
+
+  return {
+    name: payload.name,
+    selected: selectedMap
+  };
+}
+/**
+ * @event legendToggleSelect
+ * @type {Object}
+ * @property {string} type 'legendToggleSelect'
+ * @property {string} [from]
+ * @property {string} name Series name or data item name
+ */
+
+
+registerAction('legendToggleSelect', 'legendselectchanged', curry(legendSelectActionHandler, 'toggleSelected'));
+/**
+ * @event legendSelect
+ * @type {Object}
+ * @property {string} type 'legendSelect'
+ * @property {string} name Series name or data item name
+ */
+
+registerAction('legendSelect', 'legendselected', curry(legendSelectActionHandler, 'select'));
+/**
+ * @event legendUnSelect
+ * @type {Object}
+ * @property {string} type 'legendUnSelect'
+ * @property {string} name Series name or data item name
+ */
+
+registerAction('legendUnSelect', 'legendunselected', curry(legendSelectActionHandler, 'unSelect'));
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+/**
+ * Layout list like component.
+ * It will box layout each items in group of component and then position the whole group in the viewport
+ * @param {module:zrender/group/Group} group
+ * @param {module:echarts/model/Component} componentModel
+ * @param {module:echarts/ExtensionAPI}
+ */
+
+function layout$3(group, componentModel, api) {
+  var boxLayoutParams = componentModel.getBoxLayoutParams();
+  var padding = componentModel.get('padding');
+  var viewportSize = {
+    width: api.getWidth(),
+    height: api.getHeight()
+  };
+  var rect = getLayoutRect(boxLayoutParams, viewportSize, padding);
+  box(componentModel.get('orient'), group, componentModel.get('itemGap'), rect.width, rect.height);
+  positionElement(group, boxLayoutParams, viewportSize, padding);
+}
+function makeBackground(rect, componentModel) {
+  var padding = normalizeCssArray$1(componentModel.get('padding'));
+  var style = componentModel.getItemStyle(['color', 'opacity']);
+  style.fill = componentModel.get('backgroundColor');
+  var rect = new Rect({
+    shape: {
+      x: rect.x - padding[3],
+      y: rect.y - padding[0],
+      width: rect.width + padding[1] + padding[3],
+      height: rect.height + padding[0] + padding[2],
+      r: componentModel.get('borderRadius')
+    },
+    style: style,
+    silent: true,
+    z2: -1
+  }); // FIXME
+  // `subPixelOptimizeRect` may bring some gap between edge of viewpart
+  // and background rect when setting like `left: 0`, `top: 0`.
+  // graphic.subPixelOptimizeRect(rect);
+
+  return rect;
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var curry$4 = curry;
+var each$16 = each$1;
+var Group$3 = Group;
+var LegendView = extendComponentView({
+  type: 'legend.plain',
+  newlineDisabled: false,
+
+  /**
+   * @override
+   */
+  init: function () {
+    /**
+     * @private
+     * @type {module:zrender/container/Group}
+     */
+    this.group.add(this._contentGroup = new Group$3());
+    /**
+     * @private
+     * @type {module:zrender/Element}
+     */
+
+    this._backgroundEl;
+  },
+
+  /**
+   * @protected
+   */
+  getContentGroup: function () {
+    return this._contentGroup;
+  },
+
+  /**
+   * @override
+   */
+  render: function (legendModel, ecModel, api) {
+    this.resetInner();
+
+    if (!legendModel.get('show', true)) {
+      return;
+    }
+
+    var itemAlign = legendModel.get('align');
+
+    if (!itemAlign || itemAlign === 'auto') {
+      itemAlign = legendModel.get('left') === 'right' && legendModel.get('orient') === 'vertical' ? 'right' : 'left';
+    }
+
+    this.renderInner(itemAlign, legendModel, ecModel, api); // Perform layout.
+
+    var positionInfo = legendModel.getBoxLayoutParams();
+    var viewportSize = {
+      width: api.getWidth(),
+      height: api.getHeight()
+    };
+    var padding = legendModel.get('padding');
+    var maxSize = getLayoutRect(positionInfo, viewportSize, padding);
+    var mainRect = this.layoutInner(legendModel, itemAlign, maxSize); // Place mainGroup, based on the calculated `mainRect`.
+
+    var layoutRect = getLayoutRect(defaults({
+      width: mainRect.width,
+      height: mainRect.height
+    }, positionInfo), viewportSize, padding);
+    this.group.attr('position', [layoutRect.x - mainRect.x, layoutRect.y - mainRect.y]); // Render background after group is layout.
+
+    this.group.add(this._backgroundEl = makeBackground(mainRect, legendModel));
+  },
+
+  /**
+   * @protected
+   */
+  resetInner: function () {
+    this.getContentGroup().removeAll();
+    this._backgroundEl && this.group.remove(this._backgroundEl);
+  },
+
+  /**
+   * @protected
+   */
+  renderInner: function (itemAlign, legendModel, ecModel, api) {
+    var contentGroup = this.getContentGroup();
+    var legendDrawnMap = createHashMap();
+    var selectMode = legendModel.get('selectedMode');
+    var excludeSeriesId = [];
+    ecModel.eachRawSeries(function (seriesModel) {
+      !seriesModel.get('legendHoverLink') && excludeSeriesId.push(seriesModel.id);
+    });
+    each$16(legendModel.getData(), function (itemModel, dataIndex) {
+      var name = itemModel.get('name'); // Use empty string or \n as a newline string
+
+      if (!this.newlineDisabled && (name === '' || name === '\n')) {
+        contentGroup.add(new Group$3({
+          newline: true
+        }));
+        return;
+      } // Representitive series.
+
+
+      var seriesModel = ecModel.getSeriesByName(name)[0];
+
+      if (legendDrawnMap.get(name)) {
+        // Have been drawed
+        return;
+      } // Series legend
+
+
+      if (seriesModel) {
+        var data = seriesModel.getData();
+        var color = data.getVisual('color'); // If color is a callback function
+
+        if (typeof color === 'function') {
+          // Use the first data
+          color = color(seriesModel.getDataParams(0));
+        } // Using rect symbol defaultly
+
+
+        var legendSymbolType = data.getVisual('legendSymbol') || 'roundRect';
+        var symbolType = data.getVisual('symbol');
+
+        var itemGroup = this._createItem(name, dataIndex, itemModel, legendModel, legendSymbolType, symbolType, itemAlign, color, selectMode);
+
+        itemGroup.on('click', curry$4(dispatchSelectAction, name, api)).on('mouseover', curry$4(dispatchHighlightAction, seriesModel.name, null, api, excludeSeriesId)).on('mouseout', curry$4(dispatchDownplayAction, seriesModel.name, null, api, excludeSeriesId));
+        legendDrawnMap.set(name, true);
+      } else {
+        // Data legend of pie, funnel
+        ecModel.eachRawSeries(function (seriesModel) {
+          // In case multiple series has same data name
+          if (legendDrawnMap.get(name)) {
+            return;
+          }
+
+          if (seriesModel.legendDataProvider) {
+            var data = seriesModel.legendDataProvider();
+            var idx = data.indexOfName(name);
+
+            if (idx < 0) {
+              return;
+            }
+
+            var color = data.getItemVisual(idx, 'color');
+            var legendSymbolType = 'roundRect';
+
+            var itemGroup = this._createItem(name, dataIndex, itemModel, legendModel, legendSymbolType, null, itemAlign, color, selectMode); // FIXME: consider different series has items with the same name.
+
+
+            itemGroup.on('click', curry$4(dispatchSelectAction, name, api)) // Should not specify the series name, consider legend controls
+            // more than one pie series.
+            .on('mouseover', curry$4(dispatchHighlightAction, null, name, api, excludeSeriesId)).on('mouseout', curry$4(dispatchDownplayAction, null, name, api, excludeSeriesId));
+            legendDrawnMap.set(name, true);
+          }
+        }, this);
+      }
+    }, this);
+  },
+  _createItem: function (name, dataIndex, itemModel, legendModel, legendSymbolType, symbolType, itemAlign, color, selectMode) {
+    var itemWidth = legendModel.get('itemWidth');
+    var itemHeight = legendModel.get('itemHeight');
+    var inactiveColor = legendModel.get('inactiveColor');
+    var symbolKeepAspect = legendModel.get('symbolKeepAspect');
+    var isSelected = legendModel.isSelected(name);
+    var itemGroup = new Group$3();
+    var textStyleModel = itemModel.getModel('textStyle');
+    var itemIcon = itemModel.get('icon');
+    var tooltipModel = itemModel.getModel('tooltip');
+    var legendGlobalTooltipModel = tooltipModel.parentModel; // Use user given icon first
+
+    legendSymbolType = itemIcon || legendSymbolType;
+    itemGroup.add(createSymbol(legendSymbolType, 0, 0, itemWidth, itemHeight, isSelected ? color : inactiveColor, // symbolKeepAspect default true for legend
+    symbolKeepAspect == null ? true : symbolKeepAspect)); // Compose symbols
+    // PENDING
+
+    if (!itemIcon && symbolType // At least show one symbol, can't be all none
+    && (symbolType !== legendSymbolType || symbolType === 'none')) {
+      var size = itemHeight * 0.8;
+
+      if (symbolType === 'none') {
+        symbolType = 'circle';
+      } // Put symbol in the center
+
+
+      itemGroup.add(createSymbol(symbolType, (itemWidth - size) / 2, (itemHeight - size) / 2, size, size, isSelected ? color : inactiveColor, // symbolKeepAspect default true for legend
+      symbolKeepAspect == null ? true : symbolKeepAspect));
+    }
+
+    var textX = itemAlign === 'left' ? itemWidth + 5 : -5;
+    var textAlign = itemAlign;
+    var formatter = legendModel.get('formatter');
+    var content = name;
+
+    if (typeof formatter === 'string' && formatter) {
+      content = formatter.replace('{name}', name != null ? name : '');
+    } else if (typeof formatter === 'function') {
+      content = formatter(name);
+    }
+
+    itemGroup.add(new Text({
+      style: setTextStyle({}, textStyleModel, {
+        text: content,
+        x: textX,
+        y: itemHeight / 2,
+        textFill: isSelected ? textStyleModel.getTextColor() : inactiveColor,
+        textAlign: textAlign,
+        textVerticalAlign: 'middle'
+      })
+    })); // Add a invisible rect to increase the area of mouse hover
+
+    var hitRect = new Rect({
+      shape: itemGroup.getBoundingRect(),
+      invisible: true,
+      tooltip: tooltipModel.get('show') ? extend({
+        content: name,
+        // Defaul formatter
+        formatter: legendGlobalTooltipModel.get('formatter', true) || function () {
+          return name;
+        },
+        formatterParams: {
+          componentType: 'legend',
+          legendIndex: legendModel.componentIndex,
+          name: name,
+          $vars: ['name']
+        }
+      }, tooltipModel.option) : null
+    });
+    itemGroup.add(hitRect);
+    itemGroup.eachChild(function (child) {
+      child.silent = true;
+    });
+    hitRect.silent = !selectMode;
+    this.getContentGroup().add(itemGroup);
+    setHoverStyle(itemGroup);
+    itemGroup.__legendDataIndex = dataIndex;
+    return itemGroup;
+  },
+
+  /**
+   * @protected
+   */
+  layoutInner: function (legendModel, itemAlign, maxSize) {
+    var contentGroup = this.getContentGroup(); // Place items in contentGroup.
+
+    box(legendModel.get('orient'), contentGroup, legendModel.get('itemGap'), maxSize.width, maxSize.height);
+    var contentRect = contentGroup.getBoundingRect();
+    contentGroup.attr('position', [-contentRect.x, -contentRect.y]);
+    return this.group.getBoundingRect();
+  }
+});
+
+function dispatchSelectAction(name, api) {
+  api.dispatchAction({
+    type: 'legendToggleSelect',
+    name: name
+  });
+}
+
+function dispatchHighlightAction(seriesName, dataName, api, excludeSeriesId) {
+  // If element hover will move to a hoverLayer.
+  var el = api.getZr().storage.getDisplayList()[0];
+
+  if (!(el && el.useHoverLayer)) {
+    api.dispatchAction({
+      type: 'highlight',
+      seriesName: seriesName,
+      name: dataName,
+      excludeSeriesId: excludeSeriesId
+    });
+  }
+}
+
+function dispatchDownplayAction(seriesName, dataName, api, excludeSeriesId) {
+  // If element hover will move to a hoverLayer.
+  var el = api.getZr().storage.getDisplayList()[0];
+
+  if (!(el && el.useHoverLayer)) {
+    api.dispatchAction({
+      type: 'downplay',
+      seriesName: seriesName,
+      name: dataName,
+      excludeSeriesId: excludeSeriesId
+    });
+  }
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var legendFilter = function (ecModel) {
+  var legendModels = ecModel.findComponents({
+    mainType: 'legend'
+  });
+
+  if (legendModels && legendModels.length) {
+    ecModel.filterSeries(function (series) {
+      // If in any legend component the status is not selected.
+      // Because in legend series is assumed selected when it is not in the legend data.
+      for (var i = 0; i < legendModels.length; i++) {
+        if (!legendModels[i].isSelected(series.name)) {
+          return false;
+        }
+      }
+
+      return true;
+    });
+  }
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+// Do not contain scrollable legend, for sake of file size.
+registerProcessor(legendFilter);
+ComponentModel.registerSubTypeDefaulter('legend', function () {
+  // Default 'plain' when no type specified.
+  return 'plain';
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var ScrollableLegendModel = LegendModel.extend({
+  type: 'legend.scroll',
+
+  /**
+   * @param {number} scrollDataIndex
+   */
+  setScrollDataIndex: function (scrollDataIndex) {
+    this.option.scrollDataIndex = scrollDataIndex;
+  },
+  defaultOption: {
+    scrollDataIndex: 0,
+    pageButtonItemGap: 5,
+    pageButtonGap: null,
+    pageButtonPosition: 'end',
+    // 'start' or 'end'
+    pageFormatter: '{current}/{total}',
+    // If null/undefined, do not show page.
+    pageIcons: {
+      horizontal: ['M0,0L12,-10L12,10z', 'M0,0L-12,-10L-12,10z'],
+      vertical: ['M0,0L20,0L10,-20z', 'M0,0L20,0L10,20z']
+    },
+    pageIconColor: '#2f4554',
+    pageIconInactiveColor: '#aaa',
+    pageIconSize: 15,
+    // Can be [10, 3], which represents [width, height]
+    pageTextStyle: {
+      color: '#333'
+    },
+    animationDurationUpdate: 800
+  },
+
+  /**
+   * @override
+   */
+  init: function (option, parentModel, ecModel, extraOpt) {
+    var inputPositionParams = getLayoutParams(option);
+    ScrollableLegendModel.superCall(this, 'init', option, parentModel, ecModel, extraOpt);
+    mergeAndNormalizeLayoutParams$1(this, option, inputPositionParams);
+  },
+
+  /**
+   * @override
+   */
+  mergeOption: function (option, extraOpt) {
+    ScrollableLegendModel.superCall(this, 'mergeOption', option, extraOpt);
+    mergeAndNormalizeLayoutParams$1(this, this.option, option);
+  },
+  getOrient: function () {
+    return this.get('orient') === 'vertical' ? {
+      index: 1,
+      name: 'vertical'
+    } : {
+      index: 0,
+      name: 'horizontal'
+    };
+  }
+}); // Do not `ignoreSize` to enable setting {left: 10, right: 10}.
+
+function mergeAndNormalizeLayoutParams$1(legendModel, target, raw) {
+  var orient = legendModel.getOrient();
+  var ignoreSize = [1, 1];
+  ignoreSize[orient.index] = 0;
+  mergeLayoutParam(target, raw, {
+    type: 'box',
+    ignoreSize: ignoreSize
+  });
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * Separate legend and scrollable legend to reduce package size.
+ */
+var Group$4 = Group;
+var WH$1 = ['width', 'height'];
+var XY$1 = ['x', 'y'];
+var ScrollableLegendView = LegendView.extend({
+  type: 'legend.scroll',
+  newlineDisabled: true,
+  init: function () {
+    ScrollableLegendView.superCall(this, 'init');
+    /**
+     * @private
+     * @type {number} For `scroll`.
+     */
+
+    this._currentIndex = 0;
+    /**
+     * @private
+     * @type {module:zrender/container/Group}
+     */
+
+    this.group.add(this._containerGroup = new Group$4());
+
+    this._containerGroup.add(this.getContentGroup());
+    /**
+     * @private
+     * @type {module:zrender/container/Group}
+     */
+
+
+    this.group.add(this._controllerGroup = new Group$4());
+    /**
+     *
+     * @private
+     */
+
+    this._showController;
+  },
+
+  /**
+   * @override
+   */
+  resetInner: function () {
+    ScrollableLegendView.superCall(this, 'resetInner');
+
+    this._controllerGroup.removeAll();
+
+    this._containerGroup.removeClipPath();
+
+    this._containerGroup.__rectSize = null;
+  },
+
+  /**
+   * @override
+   */
+  renderInner: function (itemAlign, legendModel, ecModel, api) {
+    var me = this; // Render content items.
+
+    ScrollableLegendView.superCall(this, 'renderInner', itemAlign, legendModel, ecModel, api);
+    var controllerGroup = this._controllerGroup;
+    var pageIconSize = legendModel.get('pageIconSize', true);
+
+    if (!isArray(pageIconSize)) {
+      pageIconSize = [pageIconSize, pageIconSize];
+    }
+
+    createPageButton('pagePrev', 0);
+    var pageTextStyleModel = legendModel.getModel('pageTextStyle');
+    controllerGroup.add(new Text({
+      name: 'pageText',
+      style: {
+        textFill: pageTextStyleModel.getTextColor(),
+        font: pageTextStyleModel.getFont(),
+        textVerticalAlign: 'middle',
+        textAlign: 'center'
+      },
+      silent: true
+    }));
+    createPageButton('pageNext', 1);
+
+    function createPageButton(name, iconIdx) {
+      var pageDataIndexName = name + 'DataIndex';
+      var icon = createIcon(legendModel.get('pageIcons', true)[legendModel.getOrient().name][iconIdx], {
+        // Buttons will be created in each render, so we do not need
+        // to worry about avoiding using legendModel kept in scope.
+        onclick: bind(me._pageGo, me, pageDataIndexName, legendModel, api)
+      }, {
+        x: -pageIconSize[0] / 2,
+        y: -pageIconSize[1] / 2,
+        width: pageIconSize[0],
+        height: pageIconSize[1]
+      });
+      icon.name = name;
+      controllerGroup.add(icon);
+    }
+  },
+
+  /**
+   * @override
+   */
+  layoutInner: function (legendModel, itemAlign, maxSize) {
+    var contentGroup = this.getContentGroup();
+    var containerGroup = this._containerGroup;
+    var controllerGroup = this._controllerGroup;
+    var orientIdx = legendModel.getOrient().index;
+    var wh = WH$1[orientIdx];
+    var hw = WH$1[1 - orientIdx];
+    var yx = XY$1[1 - orientIdx]; // Place items in contentGroup.
+
+    box(legendModel.get('orient'), contentGroup, legendModel.get('itemGap'), !orientIdx ? null : maxSize.width, orientIdx ? null : maxSize.height);
+    box( // Buttons in controller are layout always horizontally.
+    'horizontal', controllerGroup, legendModel.get('pageButtonItemGap', true));
+    var contentRect = contentGroup.getBoundingRect();
+    var controllerRect = controllerGroup.getBoundingRect();
+    var showController = this._showController = contentRect[wh] > maxSize[wh];
+    var contentPos = [-contentRect.x, -contentRect.y]; // Remain contentPos when scroll animation perfroming.
+
+    contentPos[orientIdx] = contentGroup.position[orientIdx]; // Layout container group based on 0.
+
+    var containerPos = [0, 0];
+    var controllerPos = [-controllerRect.x, -controllerRect.y];
+    var pageButtonGap = retrieve2(legendModel.get('pageButtonGap', true), legendModel.get('itemGap', true)); // Place containerGroup and controllerGroup and contentGroup.
+
+    if (showController) {
+      var pageButtonPosition = legendModel.get('pageButtonPosition', true); // controller is on the right / bottom.
+
+      if (pageButtonPosition === 'end') {
+        controllerPos[orientIdx] += maxSize[wh] - controllerRect[wh];
+      } // controller is on the left / top.
+      else {
+          containerPos[orientIdx] += controllerRect[wh] + pageButtonGap;
+        }
+    } // Always align controller to content as 'middle'.
+
+
+    controllerPos[1 - orientIdx] += contentRect[hw] / 2 - controllerRect[hw] / 2;
+    contentGroup.attr('position', contentPos);
+    containerGroup.attr('position', containerPos);
+    controllerGroup.attr('position', controllerPos); // Calculate `mainRect` and set `clipPath`.
+    // mainRect should not be calculated by `this.group.getBoundingRect()`
+    // for sake of the overflow.
+
+    var mainRect = this.group.getBoundingRect();
+    var mainRect = {
+      x: 0,
+      y: 0
+    }; // Consider content may be overflow (should be clipped).
+
+    mainRect[wh] = showController ? maxSize[wh] : contentRect[wh];
+    mainRect[hw] = Math.max(contentRect[hw], controllerRect[hw]); // `containerRect[yx] + containerPos[1 - orientIdx]` is 0.
+
+    mainRect[yx] = Math.min(0, controllerRect[yx] + controllerPos[1 - orientIdx]);
+    containerGroup.__rectSize = maxSize[wh];
+
+    if (showController) {
+      var clipShape = {
+        x: 0,
+        y: 0
+      };
+      clipShape[wh] = Math.max(maxSize[wh] - controllerRect[wh] - pageButtonGap, 0);
+      clipShape[hw] = mainRect[hw];
+      containerGroup.setClipPath(new Rect({
+        shape: clipShape
+      })); // Consider content may be larger than container, container rect
+      // can not be obtained from `containerGroup.getBoundingRect()`.
+
+      containerGroup.__rectSize = clipShape[wh];
+    } else {
+      // Do not remove or ignore controller. Keep them set as place holders.
+      controllerGroup.eachChild(function (child) {
+        child.attr({
+          invisible: true,
+          silent: true
+        });
+      });
+    } // Content translate animation.
+
+
+    var pageInfo = this._getPageInfo(legendModel);
+
+    pageInfo.pageIndex != null && updateProps(contentGroup, {
+      position: pageInfo.contentPosition
+    }, // When switch from "show controller" to "not show controller", view should be
+    // updated immediately without animation, otherwise causes weird efffect.
+    showController ? legendModel : false);
+
+    this._updatePageInfoView(legendModel, pageInfo);
+
+    return mainRect;
+  },
+  _pageGo: function (to, legendModel, api) {
+    var scrollDataIndex = this._getPageInfo(legendModel)[to];
+
+    scrollDataIndex != null && api.dispatchAction({
+      type: 'legendScroll',
+      scrollDataIndex: scrollDataIndex,
+      legendId: legendModel.id
+    });
+  },
+  _updatePageInfoView: function (legendModel, pageInfo) {
+    var controllerGroup = this._controllerGroup;
+    each$1(['pagePrev', 'pageNext'], function (name) {
+      var canJump = pageInfo[name + 'DataIndex'] != null;
+      var icon = controllerGroup.childOfName(name);
+
+      if (icon) {
+        icon.setStyle('fill', canJump ? legendModel.get('pageIconColor', true) : legendModel.get('pageIconInactiveColor', true));
+        icon.cursor = canJump ? 'pointer' : 'default';
+      }
+    });
+    var pageText = controllerGroup.childOfName('pageText');
+    var pageFormatter = legendModel.get('pageFormatter');
+    var pageIndex = pageInfo.pageIndex;
+    var current = pageIndex != null ? pageIndex + 1 : 0;
+    var total = pageInfo.pageCount;
+    pageText && pageFormatter && pageText.setStyle('text', isString(pageFormatter) ? pageFormatter.replace('{current}', current).replace('{total}', total) : pageFormatter({
+      current: current,
+      total: total
+    }));
+  },
+
+  /**
+   * @param {module:echarts/model/Model} legendModel
+   * @return {Object} {
+   *  contentPosition: Array.<number>, null when data item not found.
+   *  pageIndex: number, null when data item not found.
+   *  pageCount: number, always be a number, can be 0.
+   *  pagePrevDataIndex: number, null when no next page.
+   *  pageNextDataIndex: number, null when no previous page.
+   * }
+   */
+  _getPageInfo: function (legendModel) {
+    // Align left or top by the current dataIndex.
+    var currDataIndex = legendModel.get('scrollDataIndex', true);
+    var contentGroup = this.getContentGroup();
+    var contentRect = contentGroup.getBoundingRect();
+    var containerRectSize = this._containerGroup.__rectSize;
+    var orientIdx = legendModel.getOrient().index;
+    var wh = WH$1[orientIdx];
+    var hw = WH$1[1 - orientIdx];
+    var xy = XY$1[orientIdx];
+    var contentPos = contentGroup.position.slice();
+    var pageIndex;
+    var pagePrevDataIndex;
+    var pageNextDataIndex;
+    var targetItemGroup;
+
+    if (this._showController) {
+      contentGroup.eachChild(function (child) {
+        if (child.__legendDataIndex === currDataIndex) {
+          targetItemGroup = child;
+        }
+      });
+    } else {
+      targetItemGroup = contentGroup.childAt(0);
+    }
+
+    var pageCount = containerRectSize ? Math.ceil(contentRect[wh] / containerRectSize) : 0;
+
+    if (targetItemGroup) {
+      var itemRect = targetItemGroup.getBoundingRect();
+      var itemLoc = targetItemGroup.position[orientIdx] + itemRect[xy];
+      contentPos[orientIdx] = -itemLoc - contentRect[xy];
+      pageIndex = Math.floor(pageCount * (itemLoc + itemRect[xy] + containerRectSize / 2) / contentRect[wh]);
+      pageIndex = contentRect[wh] && pageCount ? Math.max(0, Math.min(pageCount - 1, pageIndex)) : -1;
+      var winRect = {
+        x: 0,
+        y: 0
+      };
+      winRect[wh] = containerRectSize;
+      winRect[hw] = contentRect[hw];
+      winRect[xy] = -contentPos[orientIdx] - contentRect[xy];
+      var startIdx;
+      var children = contentGroup.children();
+      contentGroup.eachChild(function (child, index) {
+        var itemRect = getItemRect(child);
+
+        if (itemRect.intersect(winRect)) {
+          startIdx == null && (startIdx = index); // It is user-friendly that the last item shown in the
+          // current window is shown at the begining of next window.
+
+          pageNextDataIndex = child.__legendDataIndex;
+        } // If the last item is shown entirely, no next page.
+
+
+        if (index === children.length - 1 && itemRect[xy] + itemRect[wh] <= winRect[xy] + winRect[wh]) {
+          pageNextDataIndex = null;
+        }
+      }); // Always align based on the left/top most item, so the left/top most
+      // item in the previous window is needed to be found here.
+
+      if (startIdx != null) {
+        var startItem = children[startIdx];
+        var startRect = getItemRect(startItem);
+        winRect[xy] = startRect[xy] + startRect[wh] - winRect[wh]; // If the first item is shown entirely, no previous page.
+
+        if (startIdx <= 0 && startRect[xy] >= winRect[xy]) {
+          pagePrevDataIndex = null;
+        } else {
+          while (startIdx > 0 && getItemRect(children[startIdx - 1]).intersect(winRect)) {
+            startIdx--;
+          }
+
+          pagePrevDataIndex = children[startIdx].__legendDataIndex;
+        }
+      }
+    }
+
+    return {
+      contentPosition: contentPos,
+      pageIndex: pageIndex,
+      pageCount: pageCount,
+      pagePrevDataIndex: pagePrevDataIndex,
+      pageNextDataIndex: pageNextDataIndex
+    };
+
+    function getItemRect(el) {
+      var itemRect = el.getBoundingRect().clone();
+      itemRect[xy] += el.position[orientIdx];
+      return itemRect;
+    }
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+/**
+ * @event legendScroll
+ * @type {Object}
+ * @property {string} type 'legendScroll'
+ * @property {string} scrollDataIndex
+ */
+
+registerAction('legendScroll', 'legendscroll', function (payload, ecModel) {
+  var scrollDataIndex = payload.scrollDataIndex;
+  scrollDataIndex != null && ecModel.eachComponent({
+    mainType: 'legend',
+    subType: 'scroll',
+    query: payload
+  }, function (legendModel) {
+    legendModel.setScrollDataIndex(scrollDataIndex);
+  });
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * Legend component entry file8
+ */
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+extendComponentModel({
+  type: 'tooltip',
+  dependencies: ['axisPointer'],
+  defaultOption: {
+    zlevel: 0,
+    z: 60,
+    show: true,
+    // tooltip涓讳綋鍐呭
+    showContent: true,
+    // 'trigger' only works on coordinate system.
+    // 'item' | 'axis' | 'none'
+    trigger: 'item',
+    // 'click' | 'mousemove' | 'none'
+    triggerOn: 'mousemove|click',
+    alwaysShowContent: false,
+    displayMode: 'single',
+    // 'single' | 'multipleByCoordSys'
+    renderMode: 'auto',
+    // 'auto' | 'html' | 'richText'
+    // 'auto': use html by default, and use non-html if `document` is not defined
+    // 'html': use html for tooltip
+    // 'richText': use canvas, svg, and etc. for tooltip
+    // 浣嶇疆 {Array} | {Function}
+    // position: null
+    // Consider triggered from axisPointer handle, verticalAlign should be 'middle'
+    // align: null,
+    // verticalAlign: null,
+    // 鏄惁绾︽潫 content 鍦� viewRect 涓�傞粯璁� false 鏄负浜嗗吋瀹逛互鍓嶇増鏈��
+    confine: false,
+    // 鍐呭鏍煎紡鍣細{string}锛圱emplate锛� 娄 {Function}
+    // formatter: null
+    showDelay: 0,
+    // 闅愯棌寤惰繜锛屽崟浣峬s
+    hideDelay: 100,
+    // 鍔ㄧ敾鍙樻崲鏃堕棿锛屽崟浣峴
+    transitionDuration: 0.4,
+    enterable: false,
+    // 鎻愮ず鑳屾櫙棰滆壊锛岄粯璁や负閫忔槑搴︿负0.7鐨勯粦鑹�
+    backgroundColor: 'rgba(50,50,50,0.7)',
+    // 鎻愮ず杈规棰滆壊
+    borderColor: '#333',
+    // 鎻愮ず杈规鍦嗚锛屽崟浣峱x锛岄粯璁や负4
+    borderRadius: 4,
+    // 鎻愮ず杈规绾垮锛屽崟浣峱x锛岄粯璁や负0锛堟棤杈规锛�
+    borderWidth: 0,
+    // 鎻愮ず鍐呰竟璺濓紝鍗曚綅px锛岄粯璁ゅ悇鏂瑰悜鍐呰竟璺濅负5锛�
+    // 鎺ュ彈鏁扮粍鍒嗗埆璁惧畾涓婂彸涓嬪乏杈硅窛锛屽悓css
+    padding: 5,
+    // Extra css text
+    extraCssText: '',
+    // 鍧愭爣杞存寚绀哄櫒锛屽潗鏍囪酱瑙﹀彂鏈夋晥
+    axisPointer: {
+      // 榛樿涓虹洿绾�
+      // 鍙�変负锛�'line' | 'shadow' | 'cross'
+      type: 'line',
+      // type 涓� line 鐨勬椂鍊欐湁鏁堬紝鎸囧畾 tooltip line 鎵�鍦ㄧ殑杞达紝鍙��
+      // 鍙�� 'x' | 'y' | 'angle' | 'radius' | 'auto'
+      // 榛樿 'auto'锛屼細閫夋嫨绫诲瀷涓� category 鐨勮酱锛屽浜庡弻鏁板�艰酱锛岀瑳鍗″皵鍧愭爣绯讳細榛樿閫夋嫨 x 杞�
+      // 鏋佸潗鏍囩郴浼氶粯璁ら�夋嫨 angle 杞�
+      axis: 'auto',
+      animation: 'auto',
+      animationDurationUpdate: 200,
+      animationEasingUpdate: 'exponentialOut',
+      crossStyle: {
+        color: '#999',
+        width: 1,
+        type: 'dashed',
+        // TODO formatter
+        textStyle: {} // lineStyle and shadowStyle should not be specified here,
+        // otherwise it will always override those styles on option.axisPointer.
+
+      }
+    },
+    textStyle: {
+      color: '#fff',
+      fontSize: 14
+    }
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var each$18 = each$1;
+var toCamelCase$1 = toCamelCase;
+var vendors = ['', '-webkit-', '-moz-', '-o-'];
+var gCssText = 'position:absolute;display:block;border-style:solid;white-space:nowrap;z-index:9999999;';
+/**
+ * @param {number} duration
+ * @return {string}
+ * @inner
+ */
+
+function assembleTransition(duration) {
+  var transitionCurve = 'cubic-bezier(0.23, 1, 0.32, 1)';
+  var transitionText = 'left ' + duration + 's ' + transitionCurve + ',' + 'top ' + duration + 's ' + transitionCurve;
+  return map(vendors, function (vendorPrefix) {
+    return vendorPrefix + 'transition:' + transitionText;
+  }).join(';');
+}
+/**
+ * @param {Object} textStyle
+ * @return {string}
+ * @inner
+ */
+
+
+function assembleFont(textStyleModel) {
+  var cssText = [];
+  var fontSize = textStyleModel.get('fontSize');
+  var color = textStyleModel.getTextColor();
+  color && cssText.push('color:' + color);
+  cssText.push('font:' + textStyleModel.getFont());
+  fontSize && cssText.push('line-height:' + Math.round(fontSize * 3 / 2) + 'px');
+  each$18(['decoration', 'align'], function (name) {
+    var val = textStyleModel.get(name);
+    val && cssText.push('text-' + name + ':' + val);
+  });
+  return cssText.join(';');
+}
+/**
+ * @param {Object} tooltipModel
+ * @return {string}
+ * @inner
+ */
+
+
+function assembleCssText(tooltipModel) {
+  var cssText = [];
+  var transitionDuration = tooltipModel.get('transitionDuration');
+  var backgroundColor = tooltipModel.get('backgroundColor');
+  var textStyleModel = tooltipModel.getModel('textStyle');
+  var padding = tooltipModel.get('padding'); // Animation transition. Do not animate when transitionDuration is 0.
+
+  transitionDuration && cssText.push(assembleTransition(transitionDuration));
+
+  if (backgroundColor) {
+    if (env$1.canvasSupported) {
+      cssText.push('background-Color:' + backgroundColor);
+    } else {
+      // for ie
+      cssText.push('background-Color:#' + toHex(backgroundColor));
+      cssText.push('filter:alpha(opacity=70)');
+    }
+  } // Border style
+
+
+  each$18(['width', 'color', 'radius'], function (name) {
+    var borderName = 'border-' + name;
+    var camelCase = toCamelCase$1(borderName);
+    var val = tooltipModel.get(camelCase);
+    val != null && cssText.push(borderName + ':' + val + (name === 'color' ? '' : 'px'));
+  }); // Text style
+
+  cssText.push(assembleFont(textStyleModel)); // Padding
+
+  if (padding != null) {
+    cssText.push('padding:' + normalizeCssArray$1(padding).join('px ') + 'px');
+  }
+
+  return cssText.join(';') + ';';
+}
+/**
+ * @alias module:echarts/component/tooltip/TooltipContent
+ * @constructor
+ */
+
+
+function TooltipContent(container, api) {
+  if (env$1.wxa) {
+    return null;
+  }
+
+  var el = document.createElement('div');
+  var zr = this._zr = api.getZr();
+  this.el = el;
+  this._x = api.getWidth() / 2;
+  this._y = api.getHeight() / 2;
+  container.appendChild(el);
+  this._container = container;
+  this._show = false;
+  /**
+   * @private
+   */
+
+  this._hideTimeout;
+  var self = this;
+
+  el.onmouseenter = function () {
+    // clear the timeout in hideLater and keep showing tooltip
+    if (self._enterable) {
+      clearTimeout(self._hideTimeout);
+      self._show = true;
+    }
+
+    self._inContent = true;
+  };
+
+  el.onmousemove = function (e) {
+    e = e || window.event;
+
+    if (!self._enterable) {
+      // Try trigger zrender event to avoid mouse
+      // in and out shape too frequently
+      var handler = zr.handler;
+      normalizeEvent(container, e, true);
+      handler.dispatch('mousemove', e);
+    }
+  };
+
+  el.onmouseleave = function () {
+    if (self._enterable) {
+      if (self._show) {
+        self.hideLater(self._hideDelay);
+      }
+    }
+
+    self._inContent = false;
+  };
+}
+
+TooltipContent.prototype = {
+  constructor: TooltipContent,
+
+  /**
+   * @private
+   * @type {boolean}
+   */
+  _enterable: true,
+
+  /**
+   * Update when tooltip is rendered
+   */
+  update: function () {
+    // FIXME
+    // Move this logic to ec main?
+    var container = this._container;
+    var stl = container.currentStyle || document.defaultView.getComputedStyle(container);
+    var domStyle = container.style;
+
+    if (domStyle.position !== 'absolute' && stl.position !== 'absolute') {
+      domStyle.position = 'relative';
+    } // Hide the tooltip
+    // PENDING
+    // this.hide();
+
+  },
+  show: function (tooltipModel) {
+    clearTimeout(this._hideTimeout);
+    var el = this.el;
+    el.style.cssText = gCssText + assembleCssText(tooltipModel) // http://stackoverflow.com/questions/21125587/css3-transition-not-working-in-chrome-anymore
+    + ';left:' + this._x + 'px;top:' + this._y + 'px;' + (tooltipModel.get('extraCssText') || '');
+    el.style.display = el.innerHTML ? 'block' : 'none'; // If mouse occsionally move over the tooltip, a mouseout event will be
+    // triggered by canvas, and cuase some unexpectable result like dragging
+    // stop, "unfocusAdjacency". Here `pointer-events: none` is used to solve
+    // it. Although it is not suppored by IE8~IE10, fortunately it is a rare
+    // scenario.
+
+    el.style.pointerEvents = this._enterable ? 'auto' : 'none';
+    this._show = true;
+  },
+  setContent: function (content) {
+    this.el.innerHTML = content == null ? '' : content;
+  },
+  setEnterable: function (enterable) {
+    this._enterable = enterable;
+  },
+  getSize: function () {
+    var el = this.el;
+    return [el.clientWidth, el.clientHeight];
+  },
+  moveTo: function (x, y) {
+    // xy should be based on canvas root. But tooltipContent is
+    // the sibling of canvas root. So padding of ec container
+    // should be considered here.
+    var zr = this._zr;
+    var viewportRootOffset;
+
+    if (zr && zr.painter && (viewportRootOffset = zr.painter.getViewportRootOffset())) {
+      x += viewportRootOffset.offsetLeft;
+      y += viewportRootOffset.offsetTop;
+    }
+
+    var style = this.el.style;
+    style.left = x + 'px';
+    style.top = y + 'px';
+    this._x = x;
+    this._y = y;
+  },
+  hide: function () {
+    this.el.style.display = 'none';
+    this._show = false;
+  },
+  hideLater: function (time) {
+    if (this._show && !(this._inContent && this._enterable)) {
+      if (time) {
+        this._hideDelay = time; // Set show false to avoid invoke hideLater mutiple times
+
+        this._show = false;
+        this._hideTimeout = setTimeout(bind(this.hide, this), time);
+      } else {
+        this.hide();
+      }
+    }
+  },
+  isShow: function () {
+    return this._show;
+  },
+  getOuterSize: function () {
+    var width = this.el.clientWidth;
+    var height = this.el.clientHeight; // Consider browser compatibility.
+    // IE8 does not support getComputedStyle.
+
+    if (document.defaultView && document.defaultView.getComputedStyle) {
+      var stl = document.defaultView.getComputedStyle(this.el);
+
+      if (stl) {
+        width += parseInt(stl.paddingLeft, 10) + parseInt(stl.paddingRight, 10) + parseInt(stl.borderLeftWidth, 10) + parseInt(stl.borderRightWidth, 10);
+        height += parseInt(stl.paddingTop, 10) + parseInt(stl.paddingBottom, 10) + parseInt(stl.borderTopWidth, 10) + parseInt(stl.borderBottomWidth, 10);
+      }
+    }
+
+    return {
+      width: width,
+      height: height
+    };
+  }
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+/**
+ * @alias module:echarts/component/tooltip/TooltipRichContent
+ * @constructor
+ */
+
+function TooltipRichContent(api) {
+  this._zr = api.getZr();
+  this._show = false;
+  /**
+   * @private
+   */
+
+  this._hideTimeout;
+}
+
+TooltipRichContent.prototype = {
+  constructor: TooltipRichContent,
+
+  /**
+   * @private
+   * @type {boolean}
+   */
+  _enterable: true,
+
+  /**
+   * Update when tooltip is rendered
+   */
+  update: function () {// noop
+  },
+  show: function (tooltipModel) {
+    if (this._hideTimeout) {
+      clearTimeout(this._hideTimeout);
+    }
+
+    this.el.attr('show', true);
+    this._show = true;
+  },
+
+  /**
+   * Set tooltip content
+   *
+   * @param {string} content rich text string of content
+   * @param {Object} markerRich rich text style
+   * @param {Object} tooltipModel tooltip model
+   */
+  setContent: function (content, markerRich, tooltipModel) {
+    if (this.el) {
+      this._zr.remove(this.el);
+    }
+
+    var markers = {};
+    var text = content;
+    var prefix = '{marker';
+    var suffix = '|}';
+    var startId = text.indexOf(prefix);
+
+    while (startId >= 0) {
+      var endId = text.indexOf(suffix);
+      var name = text.substr(startId + prefix.length, endId - startId - prefix.length);
+
+      if (name.indexOf('sub') > -1) {
+        markers['marker' + name] = {
+          textWidth: 4,
+          textHeight: 4,
+          textBorderRadius: 2,
+          textBackgroundColor: markerRich[name],
+          // TODO: textOffset is not implemented for rich text
+          textOffset: [3, 0]
+        };
+      } else {
+        markers['marker' + name] = {
+          textWidth: 10,
+          textHeight: 10,
+          textBorderRadius: 5,
+          textBackgroundColor: markerRich[name]
+        };
+      }
+
+      text = text.substr(endId + 1);
+      startId = text.indexOf('{marker');
+    }
+
+    this.el = new Text({
+      style: {
+        rich: markers,
+        text: content,
+        textLineHeight: 20,
+        textBackgroundColor: tooltipModel.get('backgroundColor'),
+        textBorderRadius: tooltipModel.get('borderRadius'),
+        textFill: tooltipModel.get('textStyle.color'),
+        textPadding: tooltipModel.get('padding')
+      },
+      z: tooltipModel.get('z')
+    });
+
+    this._zr.add(this.el);
+
+    var self = this;
+    this.el.on('mouseover', function () {
+      // clear the timeout in hideLater and keep showing tooltip
+      if (self._enterable) {
+        clearTimeout(self._hideTimeout);
+        self._show = true;
+      }
+
+      self._inContent = true;
+    });
+    this.el.on('mouseout', function () {
+      if (self._enterable) {
+        if (self._show) {
+          self.hideLater(self._hideDelay);
+        }
+      }
+
+      self._inContent = false;
+    });
+  },
+  setEnterable: function (enterable) {
+    this._enterable = enterable;
+  },
+  getSize: function () {
+    var bounding = this.el.getBoundingRect();
+    return [bounding.width, bounding.height];
+  },
+  moveTo: function (x, y) {
+    if (this.el) {
+      this.el.attr('position', [x, y]);
+    }
+  },
+  hide: function () {
+    this.el.hide();
+    this._show = false;
+  },
+  hideLater: function (time) {
+    if (this._show && !(this._inContent && this._enterable)) {
+      if (time) {
+        this._hideDelay = time; // Set show false to avoid invoke hideLater mutiple times
+
+        this._show = false;
+        this._hideTimeout = setTimeout(bind(this.hide, this), time);
+      } else {
+        this.hide();
+      }
+    }
+  },
+  isShow: function () {
+    return this._show;
+  },
+  getOuterSize: function () {
+    return this.getSize();
+  }
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var bind$3 = bind;
+var each$17 = each$1;
+var parsePercent$2 = parsePercent$1;
+var proxyRect = new Rect({
+  shape: {
+    x: -1,
+    y: -1,
+    width: 2,
+    height: 2
+  }
+});
+extendComponentView({
+  type: 'tooltip',
+  init: function (ecModel, api) {
+    if (env$1.node) {
+      return;
+    }
+
+    var tooltipModel = ecModel.getComponent('tooltip');
+    var renderMode = tooltipModel.get('renderMode');
+    this._renderMode = getTooltipRenderMode(renderMode);
+    var tooltipContent;
+
+    if (this._renderMode === 'html') {
+      tooltipContent = new TooltipContent(api.getDom(), api);
+      this._newLine = '<br/>';
+    } else {
+      tooltipContent = new TooltipRichContent(api);
+      this._newLine = '\n';
+    }
+
+    this._tooltipContent = tooltipContent;
+  },
+  render: function (tooltipModel, ecModel, api) {
+    if (env$1.node) {
+      return;
+    } // Reset
+
+
+    this.group.removeAll();
+    /**
+     * @private
+     * @type {module:echarts/component/tooltip/TooltipModel}
+     */
+
+    this._tooltipModel = tooltipModel;
+    /**
+     * @private
+     * @type {module:echarts/model/Global}
+     */
+
+    this._ecModel = ecModel;
+    /**
+     * @private
+     * @type {module:echarts/ExtensionAPI}
+     */
+
+    this._api = api;
+    /**
+     * Should be cleaned when render.
+     * @private
+     * @type {Array.<Array.<Object>>}
+     */
+
+    this._lastDataByCoordSys = null;
+    /**
+     * @private
+     * @type {boolean}
+     */
+
+    this._alwaysShowContent = tooltipModel.get('alwaysShowContent');
+    var tooltipContent = this._tooltipContent;
+    tooltipContent.update();
+    tooltipContent.setEnterable(tooltipModel.get('enterable'));
+
+    this._initGlobalListener();
+
+    this._keepShow();
+  },
+  _initGlobalListener: function () {
+    var tooltipModel = this._tooltipModel;
+    var triggerOn = tooltipModel.get('triggerOn');
+    register('itemTooltip', this._api, bind$3(function (currTrigger, e, dispatchAction) {
+      // If 'none', it is not controlled by mouse totally.
+      if (triggerOn !== 'none') {
+        if (triggerOn.indexOf(currTrigger) >= 0) {
+          this._tryShow(e, dispatchAction);
+        } else if (currTrigger === 'leave') {
+          this._hide(dispatchAction);
+        }
+      }
+    }, this));
+  },
+  _keepShow: function () {
+    var tooltipModel = this._tooltipModel;
+    var ecModel = this._ecModel;
+    var api = this._api; // Try to keep the tooltip show when refreshing
+
+    if (this._lastX != null && this._lastY != null // When user is willing to control tooltip totally using API,
+    // self.manuallyShowTip({x, y}) might cause tooltip hide,
+    // which is not expected.
+    && tooltipModel.get('triggerOn') !== 'none') {
+      var self = this;
+      clearTimeout(this._refreshUpdateTimeout);
+      this._refreshUpdateTimeout = setTimeout(function () {
+        // Show tip next tick after other charts are rendered
+        // In case highlight action has wrong result
+        // FIXME
+        self.manuallyShowTip(tooltipModel, ecModel, api, {
+          x: self._lastX,
+          y: self._lastY
+        });
+      });
+    }
+  },
+
+  /**
+   * Show tip manually by
+   * dispatchAction({
+   *     type: 'showTip',
+   *     x: 10,
+   *     y: 10
+   * });
+   * Or
+   * dispatchAction({
+   *      type: 'showTip',
+   *      seriesIndex: 0,
+   *      dataIndex or dataIndexInside or name
+   * });
+   *
+   *  TODO Batch
+   */
+  manuallyShowTip: function (tooltipModel, ecModel, api, payload) {
+    if (payload.from === this.uid || env$1.node) {
+      return;
+    }
+
+    var dispatchAction = makeDispatchAction$1(payload, api); // Reset ticket
+
+    this._ticket = ''; // When triggered from axisPointer.
+
+    var dataByCoordSys = payload.dataByCoordSys;
+
+    if (payload.tooltip && payload.x != null && payload.y != null) {
+      var el = proxyRect;
+      el.position = [payload.x, payload.y];
+      el.update();
+      el.tooltip = payload.tooltip; // Manually show tooltip while view is not using zrender elements.
+
+      this._tryShow({
+        offsetX: payload.x,
+        offsetY: payload.y,
+        target: el
+      }, dispatchAction);
+    } else if (dataByCoordSys) {
+      this._tryShow({
+        offsetX: payload.x,
+        offsetY: payload.y,
+        position: payload.position,
+        event: {},
+        dataByCoordSys: payload.dataByCoordSys,
+        tooltipOption: payload.tooltipOption
+      }, dispatchAction);
+    } else if (payload.seriesIndex != null) {
+      if (this._manuallyAxisShowTip(tooltipModel, ecModel, api, payload)) {
+        return;
+      }
+
+      var pointInfo = findPointFromSeries(payload, ecModel);
+      var cx = pointInfo.point[0];
+      var cy = pointInfo.point[1];
+
+      if (cx != null && cy != null) {
+        this._tryShow({
+          offsetX: cx,
+          offsetY: cy,
+          position: payload.position,
+          target: pointInfo.el,
+          event: {}
+        }, dispatchAction);
+      }
+    } else if (payload.x != null && payload.y != null) {
+      // FIXME
+      // should wrap dispatchAction like `axisPointer/globalListener` ?
+      api.dispatchAction({
+        type: 'updateAxisPointer',
+        x: payload.x,
+        y: payload.y
+      });
+
+      this._tryShow({
+        offsetX: payload.x,
+        offsetY: payload.y,
+        position: payload.position,
+        target: api.getZr().findHover(payload.x, payload.y).target,
+        event: {}
+      }, dispatchAction);
+    }
+  },
+  manuallyHideTip: function (tooltipModel, ecModel, api, payload) {
+    var tooltipContent = this._tooltipContent;
+
+    if (!this._alwaysShowContent && this._tooltipModel) {
+      tooltipContent.hideLater(this._tooltipModel.get('hideDelay'));
+    }
+
+    this._lastX = this._lastY = null;
+
+    if (payload.from !== this.uid) {
+      this._hide(makeDispatchAction$1(payload, api));
+    }
+  },
+  // Be compatible with previous design, that is, when tooltip.type is 'axis' and
+  // dispatchAction 'showTip' with seriesIndex and dataIndex will trigger axis pointer
+  // and tooltip.
+  _manuallyAxisShowTip: function (tooltipModel, ecModel, api, payload) {
+    var seriesIndex = payload.seriesIndex;
+    var dataIndex = payload.dataIndex;
+    var coordSysAxesInfo = ecModel.getComponent('axisPointer').coordSysAxesInfo;
+
+    if (seriesIndex == null || dataIndex == null || coordSysAxesInfo == null) {
+      return;
+    }
+
+    var seriesModel = ecModel.getSeriesByIndex(seriesIndex);
+
+    if (!seriesModel) {
+      return;
+    }
+
+    var data = seriesModel.getData();
+    var tooltipModel = buildTooltipModel([data.getItemModel(dataIndex), seriesModel, (seriesModel.coordinateSystem || {}).model, tooltipModel]);
+
+    if (tooltipModel.get('trigger') !== 'axis') {
+      return;
+    }
+
+    api.dispatchAction({
+      type: 'updateAxisPointer',
+      seriesIndex: seriesIndex,
+      dataIndex: dataIndex,
+      position: payload.position
+    });
+    return true;
+  },
+  _tryShow: function (e, dispatchAction) {
+    var el = e.target;
+    var tooltipModel = this._tooltipModel;
+
+    if (!tooltipModel) {
+      return;
+    } // Save mouse x, mouse y. So we can try to keep showing the tip if chart is refreshed
+
+
+    this._lastX = e.offsetX;
+    this._lastY = e.offsetY;
+    var dataByCoordSys = e.dataByCoordSys;
+
+    if (dataByCoordSys && dataByCoordSys.length) {
+      this._showAxisTooltip(dataByCoordSys, e);
+    } // Always show item tooltip if mouse is on the element with dataIndex
+    else if (el && el.dataIndex != null) {
+        this._lastDataByCoordSys = null;
+
+        this._showSeriesItemTooltip(e, el, dispatchAction);
+      } // Tooltip provided directly. Like legend.
+      else if (el && el.tooltip) {
+          this._lastDataByCoordSys = null;
+
+          this._showComponentItemTooltip(e, el, dispatchAction);
+        } else {
+          this._lastDataByCoordSys = null;
+
+          this._hide(dispatchAction);
+        }
+  },
+  _showOrMove: function (tooltipModel, cb) {
+    // showDelay is used in this case: tooltip.enterable is set
+    // as true. User intent to move mouse into tooltip and click
+    // something. `showDelay` makes it easyer to enter the content
+    // but tooltip do not move immediately.
+    var delay = tooltipModel.get('showDelay');
+    cb = bind(cb, this);
+    clearTimeout(this._showTimout);
+    delay > 0 ? this._showTimout = setTimeout(cb, delay) : cb();
+  },
+  _showAxisTooltip: function (dataByCoordSys, e) {
+    var ecModel = this._ecModel;
+    var globalTooltipModel = this._tooltipModel;
+    var point = [e.offsetX, e.offsetY];
+    var singleDefaultHTML = [];
+    var singleParamsList = [];
+    var singleTooltipModel = buildTooltipModel([e.tooltipOption, globalTooltipModel]);
+    var renderMode = this._renderMode;
+    var newLine = this._newLine;
+    var markers = {};
+    each$17(dataByCoordSys, function (itemCoordSys) {
+      // var coordParamList = [];
+      // var coordDefaultHTML = [];
+      // var coordTooltipModel = buildTooltipModel([
+      //     e.tooltipOption,
+      //     itemCoordSys.tooltipOption,
+      //     ecModel.getComponent(itemCoordSys.coordSysMainType, itemCoordSys.coordSysIndex),
+      //     globalTooltipModel
+      // ]);
+      // var displayMode = coordTooltipModel.get('displayMode');
+      // var paramsList = displayMode === 'single' ? singleParamsList : [];
+      each$17(itemCoordSys.dataByAxis, function (item) {
+        var axisModel = ecModel.getComponent(item.axisDim + 'Axis', item.axisIndex);
+        var axisValue = item.value;
+        var seriesDefaultHTML = [];
+
+        if (!axisModel || axisValue == null) {
+          return;
+        }
+
+        var valueLabel = getValueLabel(axisValue, axisModel.axis, ecModel, item.seriesDataIndices, item.valueLabelOpt);
+        each$1(item.seriesDataIndices, function (idxItem) {
+          var series = ecModel.getSeriesByIndex(idxItem.seriesIndex);
+          var dataIndex = idxItem.dataIndexInside;
+          var dataParams = series && series.getDataParams(dataIndex);
+          dataParams.axisDim = item.axisDim;
+          dataParams.axisIndex = item.axisIndex;
+          dataParams.axisType = item.axisType;
+          dataParams.axisId = item.axisId;
+          dataParams.axisValue = getAxisRawValue(axisModel.axis, axisValue);
+          dataParams.axisValueLabel = valueLabel;
+
+          if (dataParams) {
+            singleParamsList.push(dataParams);
+            var seriesTooltip = series.formatTooltip(dataIndex, true, null, renderMode);
+            var html;
+
+            if (isObject$1(seriesTooltip)) {
+              html = seriesTooltip.html;
+              var newMarkers = seriesTooltip.markers;
+              merge(markers, newMarkers);
+            } else {
+              html = seriesTooltip;
+            }
+
+            seriesDefaultHTML.push(html);
+          }
+        }); // Default tooltip content
+        // FIXME
+        // (1) shold be the first data which has name?
+        // (2) themeRiver, firstDataIndex is array, and first line is unnecessary.
+
+        var firstLine = valueLabel;
+
+        if (renderMode !== 'html') {
+          singleDefaultHTML.push(seriesDefaultHTML.join(newLine));
+        } else {
+          singleDefaultHTML.push((firstLine ? encodeHTML(firstLine) + newLine : '') + seriesDefaultHTML.join(newLine));
+        }
+      });
+    }, this); // In most case, the second axis is shown upper than the first one.
+
+    singleDefaultHTML.reverse();
+    singleDefaultHTML = singleDefaultHTML.join(this._newLine + this._newLine);
+    var positionExpr = e.position;
+
+    this._showOrMove(singleTooltipModel, function () {
+      if (this._updateContentNotChangedOnAxis(dataByCoordSys)) {
+        this._updatePosition(singleTooltipModel, positionExpr, point[0], point[1], this._tooltipContent, singleParamsList);
+      } else {
+        this._showTooltipContent(singleTooltipModel, singleDefaultHTML, singleParamsList, Math.random(), point[0], point[1], positionExpr, undefined, markers);
+      }
+    }); // Do not trigger events here, because this branch only be entered
+    // from dispatchAction.
+
+  },
+  _showSeriesItemTooltip: function (e, el, dispatchAction) {
+    var ecModel = this._ecModel; // Use dataModel in element if possible
+    // Used when mouseover on a element like markPoint or edge
+    // In which case, the data is not main data in series.
+
+    var seriesIndex = el.seriesIndex;
+    var seriesModel = ecModel.getSeriesByIndex(seriesIndex); // For example, graph link.
+
+    var dataModel = el.dataModel || seriesModel;
+    var dataIndex = el.dataIndex;
+    var dataType = el.dataType;
+    var data = dataModel.getData();
+    var tooltipModel = buildTooltipModel([data.getItemModel(dataIndex), dataModel, seriesModel && (seriesModel.coordinateSystem || {}).model, this._tooltipModel]);
+    var tooltipTrigger = tooltipModel.get('trigger');
+
+    if (tooltipTrigger != null && tooltipTrigger !== 'item') {
+      return;
+    }
+
+    var params = dataModel.getDataParams(dataIndex, dataType);
+    var seriesTooltip = dataModel.formatTooltip(dataIndex, false, dataType, this._renderMode);
+    var defaultHtml;
+    var markers;
+
+    if (isObject$1(seriesTooltip)) {
+      defaultHtml = seriesTooltip.html;
+      markers = seriesTooltip.markers;
+    } else {
+      defaultHtml = seriesTooltip;
+      markers = null;
+    }
+
+    var asyncTicket = 'item_' + dataModel.name + '_' + dataIndex;
+
+    this._showOrMove(tooltipModel, function () {
+      this._showTooltipContent(tooltipModel, defaultHtml, params, asyncTicket, e.offsetX, e.offsetY, e.position, e.target, markers);
+    }); // FIXME
+    // duplicated showtip if manuallyShowTip is called from dispatchAction.
+
+
+    dispatchAction({
+      type: 'showTip',
+      dataIndexInside: dataIndex,
+      dataIndex: data.getRawIndex(dataIndex),
+      seriesIndex: seriesIndex,
+      from: this.uid
+    });
+  },
+  _showComponentItemTooltip: function (e, el, dispatchAction) {
+    var tooltipOpt = el.tooltip;
+
+    if (typeof tooltipOpt === 'string') {
+      var content = tooltipOpt;
+      tooltipOpt = {
+        content: content,
+        // Fixed formatter
+        formatter: content
+      };
+    }
+
+    var subTooltipModel = new Model(tooltipOpt, this._tooltipModel, this._ecModel);
+    var defaultHtml = subTooltipModel.get('content');
+    var asyncTicket = Math.random(); // Do not check whether `trigger` is 'none' here, because `trigger`
+    // only works on cooridinate system. In fact, we have not found case
+    // that requires setting `trigger` nothing on component yet.
+
+    this._showOrMove(subTooltipModel, function () {
+      this._showTooltipContent(subTooltipModel, defaultHtml, subTooltipModel.get('formatterParams') || {}, asyncTicket, e.offsetX, e.offsetY, e.position, el);
+    }); // If not dispatch showTip, tip may be hide triggered by axis.
+
+
+    dispatchAction({
+      type: 'showTip',
+      from: this.uid
+    });
+  },
+  _showTooltipContent: function (tooltipModel, defaultHtml, params, asyncTicket, x, y, positionExpr, el, markers) {
+    // Reset ticket
+    this._ticket = '';
+
+    if (!tooltipModel.get('showContent') || !tooltipModel.get('show')) {
+      return;
+    }
+
+    var tooltipContent = this._tooltipContent;
+    var formatter = tooltipModel.get('formatter');
+    positionExpr = positionExpr || tooltipModel.get('position');
+    var html = defaultHtml;
+
+    if (formatter && typeof formatter === 'string') {
+      html = formatTpl(formatter, params, true);
+    } else if (typeof formatter === 'function') {
+      var callback = bind$3(function (cbTicket, html) {
+        if (cbTicket === this._ticket) {
+          tooltipContent.setContent(html, markers, tooltipModel);
+
+          this._updatePosition(tooltipModel, positionExpr, x, y, tooltipContent, params, el);
+        }
+      }, this);
+      this._ticket = asyncTicket;
+      html = formatter(params, asyncTicket, callback);
+    }
+
+    tooltipContent.setContent(html, markers, tooltipModel);
+    tooltipContent.show(tooltipModel);
+
+    this._updatePosition(tooltipModel, positionExpr, x, y, tooltipContent, params, el);
+  },
+
+  /**
+   * @param  {string|Function|Array.<number>|Object} positionExpr
+   * @param  {number} x Mouse x
+   * @param  {number} y Mouse y
+   * @param  {boolean} confine Whether confine tooltip content in view rect.
+   * @param  {Object|<Array.<Object>} params
+   * @param  {module:zrender/Element} el target element
+   * @param  {module:echarts/ExtensionAPI} api
+   * @return {Array.<number>}
+   */
+  _updatePosition: function (tooltipModel, positionExpr, x, y, content, params, el) {
+    var viewWidth = this._api.getWidth();
+
+    var viewHeight = this._api.getHeight();
+
+    positionExpr = positionExpr || tooltipModel.get('position');
+    var contentSize = content.getSize();
+    var align = tooltipModel.get('align');
+    var vAlign = tooltipModel.get('verticalAlign');
+    var rect = el && el.getBoundingRect().clone();
+    el && rect.applyTransform(el.transform);
+
+    if (typeof positionExpr === 'function') {
+      // Callback of position can be an array or a string specify the position
+      positionExpr = positionExpr([x, y], params, content.el, rect, {
+        viewSize: [viewWidth, viewHeight],
+        contentSize: contentSize.slice()
+      });
+    }
+
+    if (isArray(positionExpr)) {
+      x = parsePercent$2(positionExpr[0], viewWidth);
+      y = parsePercent$2(positionExpr[1], viewHeight);
+    } else if (isObject$1(positionExpr)) {
+      positionExpr.width = contentSize[0];
+      positionExpr.height = contentSize[1];
+      var layoutRect = getLayoutRect(positionExpr, {
+        width: viewWidth,
+        height: viewHeight
+      });
+      x = layoutRect.x;
+      y = layoutRect.y;
+      align = null; // When positionExpr is left/top/right/bottom,
+      // align and verticalAlign will not work.
+
+      vAlign = null;
+    } // Specify tooltip position by string 'top' 'bottom' 'left' 'right' around graphic element
+    else if (typeof positionExpr === 'string' && el) {
+        var pos = calcTooltipPosition(positionExpr, rect, contentSize);
+        x = pos[0];
+        y = pos[1];
+      } else {
+        var pos = refixTooltipPosition(x, y, content, viewWidth, viewHeight, align ? null : 20, vAlign ? null : 20);
+        x = pos[0];
+        y = pos[1];
+      }
+
+    align && (x -= isCenterAlign(align) ? contentSize[0] / 2 : align === 'right' ? contentSize[0] : 0);
+    vAlign && (y -= isCenterAlign(vAlign) ? contentSize[1] / 2 : vAlign === 'bottom' ? contentSize[1] : 0);
+
+    if (tooltipModel.get('confine')) {
+      var pos = confineTooltipPosition(x, y, content, viewWidth, viewHeight);
+      x = pos[0];
+      y = pos[1];
+    }
+
+    content.moveTo(x, y);
+  },
+  // FIXME
+  // Should we remove this but leave this to user?
+  _updateContentNotChangedOnAxis: function (dataByCoordSys) {
+    var lastCoordSys = this._lastDataByCoordSys;
+    var contentNotChanged = !!lastCoordSys && lastCoordSys.length === dataByCoordSys.length;
+    contentNotChanged && each$17(lastCoordSys, function (lastItemCoordSys, indexCoordSys) {
+      var lastDataByAxis = lastItemCoordSys.dataByAxis || {};
+      var thisItemCoordSys = dataByCoordSys[indexCoordSys] || {};
+      var thisDataByAxis = thisItemCoordSys.dataByAxis || [];
+      contentNotChanged &= lastDataByAxis.length === thisDataByAxis.length;
+      contentNotChanged && each$17(lastDataByAxis, function (lastItem, indexAxis) {
+        var thisItem = thisDataByAxis[indexAxis] || {};
+        var lastIndices = lastItem.seriesDataIndices || [];
+        var newIndices = thisItem.seriesDataIndices || [];
+        contentNotChanged &= lastItem.value === thisItem.value && lastItem.axisType === thisItem.axisType && lastItem.axisId === thisItem.axisId && lastIndices.length === newIndices.length;
+        contentNotChanged && each$17(lastIndices, function (lastIdxItem, j) {
+          var newIdxItem = newIndices[j];
+          contentNotChanged &= lastIdxItem.seriesIndex === newIdxItem.seriesIndex && lastIdxItem.dataIndex === newIdxItem.dataIndex;
+        });
+      });
+    });
+    this._lastDataByCoordSys = dataByCoordSys;
+    return !!contentNotChanged;
+  },
+  _hide: function (dispatchAction) {
+    // Do not directly hideLater here, because this behavior may be prevented
+    // in dispatchAction when showTip is dispatched.
+    // FIXME
+    // duplicated hideTip if manuallyHideTip is called from dispatchAction.
+    this._lastDataByCoordSys = null;
+    dispatchAction({
+      type: 'hideTip',
+      from: this.uid
+    });
+  },
+  dispose: function (ecModel, api) {
+    if (env$1.node) {
+      return;
+    }
+
+    this._tooltipContent.hide();
+
+    unregister('itemTooltip', api);
+  }
+});
+/**
+ * @param {Array.<Object|module:echarts/model/Model>} modelCascade
+ * From top to bottom. (the last one should be globalTooltipModel);
+ */
+
+function buildTooltipModel(modelCascade) {
+  var resultModel = modelCascade.pop();
+
+  while (modelCascade.length) {
+    var tooltipOpt = modelCascade.pop();
+
+    if (tooltipOpt) {
+      if (Model.isInstance(tooltipOpt)) {
+        tooltipOpt = tooltipOpt.get('tooltip', true);
+      } // In each data item tooltip can be simply write:
+      // {
+      //  value: 10,
+      //  tooltip: 'Something you need to know'
+      // }
+
+
+      if (typeof tooltipOpt === 'string') {
+        tooltipOpt = {
+          formatter: tooltipOpt
+        };
+      }
+
+      resultModel = new Model(tooltipOpt, resultModel, resultModel.ecModel);
+    }
+  }
+
+  return resultModel;
+}
+
+function makeDispatchAction$1(payload, api) {
+  return payload.dispatchAction || bind(api.dispatchAction, api);
+}
+
+function refixTooltipPosition(x, y, content, viewWidth, viewHeight, gapH, gapV) {
+  var size = content.getOuterSize();
+  var width = size.width;
+  var height = size.height;
+
+  if (gapH != null) {
+    if (x + width + gapH > viewWidth) {
+      x -= width + gapH;
+    } else {
+      x += gapH;
+    }
+  }
+
+  if (gapV != null) {
+    if (y + height + gapV > viewHeight) {
+      y -= height + gapV;
+    } else {
+      y += gapV;
+    }
+  }
+
+  return [x, y];
+}
+
+function confineTooltipPosition(x, y, content, viewWidth, viewHeight) {
+  var size = content.getOuterSize();
+  var width = size.width;
+  var height = size.height;
+  x = Math.min(x + width, viewWidth) - width;
+  y = Math.min(y + height, viewHeight) - height;
+  x = Math.max(x, 0);
+  y = Math.max(y, 0);
+  return [x, y];
+}
+
+function calcTooltipPosition(position, rect, contentSize) {
+  var domWidth = contentSize[0];
+  var domHeight = contentSize[1];
+  var gap = 5;
+  var x = 0;
+  var y = 0;
+  var rectWidth = rect.width;
+  var rectHeight = rect.height;
+
+  switch (position) {
+    case 'inside':
+      x = rect.x + rectWidth / 2 - domWidth / 2;
+      y = rect.y + rectHeight / 2 - domHeight / 2;
+      break;
+
+    case 'top':
+      x = rect.x + rectWidth / 2 - domWidth / 2;
+      y = rect.y - domHeight - gap;
+      break;
+
+    case 'bottom':
+      x = rect.x + rectWidth / 2 - domWidth / 2;
+      y = rect.y + rectHeight + gap;
+      break;
+
+    case 'left':
+      x = rect.x - domWidth - gap;
+      y = rect.y + rectHeight / 2 - domHeight / 2;
+      break;
+
+    case 'right':
+      x = rect.x + rectWidth + gap;
+      y = rect.y + rectHeight / 2 - domHeight / 2;
+  }
+
+  return [x, y];
+}
+
+function isCenterAlign(align) {
+  return align === 'center' || align === 'middle';
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+// FIXME Better way to pack data in graphic element
+/**
+ * @action
+ * @property {string} type
+ * @property {number} seriesIndex
+ * @property {number} dataIndex
+ * @property {number} [x]
+ * @property {number} [y]
+ */
+
+registerAction({
+  type: 'showTip',
+  event: 'showTip',
+  update: 'tooltip:manuallyShowTip'
+}, // noop
+function () {});
+registerAction({
+  type: 'hideTip',
+  event: 'hideTip',
+  update: 'tooltip:manuallyHideTip'
+}, // noop
+function () {});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var addCommas$1 = addCommas;
+var encodeHTML$1 = encodeHTML;
+
+function fillLabel(opt) {
+  defaultEmphasis(opt, 'label', ['show']);
+}
+
+var MarkerModel = extendComponentModel({
+  type: 'marker',
+  dependencies: ['series', 'grid', 'polar', 'geo'],
+
+  /**
+   * @overrite
+   */
+  init: function (option, parentModel, ecModel, extraOpt) {
+    this.mergeDefaultAndTheme(option, ecModel);
+    this.mergeOption(option, ecModel, extraOpt.createdBySelf, true);
+  },
+
+  /**
+   * @return {boolean}
+   */
+  isAnimationEnabled: function () {
+    if (env$1.node) {
+      return false;
+    }
+
+    var hostSeries = this.__hostSeries;
+    return this.getShallow('animation') && hostSeries && hostSeries.isAnimationEnabled();
+  },
+  mergeOption: function (newOpt, ecModel, createdBySelf, isInit) {
+    var MarkerModel = this.constructor;
+    var modelPropName = this.mainType + 'Model';
+
+    if (!createdBySelf) {
+      ecModel.eachSeries(function (seriesModel) {
+        var markerOpt = seriesModel.get(this.mainType, true);
+        var markerModel = seriesModel[modelPropName];
+
+        if (!markerOpt || !markerOpt.data) {
+          seriesModel[modelPropName] = null;
+          return;
+        }
+
+        if (!markerModel) {
+          if (isInit) {
+            // Default label emphasis `position` and `show`
+            fillLabel(markerOpt);
+          }
+
+          each$1(markerOpt.data, function (item) {
+            // FIXME Overwrite fillLabel method ?
+            if (item instanceof Array) {
+              fillLabel(item[0]);
+              fillLabel(item[1]);
+            } else {
+              fillLabel(item);
+            }
+          });
+          markerModel = new MarkerModel(markerOpt, this, ecModel);
+          extend(markerModel, {
+            mainType: this.mainType,
+            // Use the same series index and name
+            seriesIndex: seriesModel.seriesIndex,
+            name: seriesModel.name,
+            createdBySelf: true
+          });
+          markerModel.__hostSeries = seriesModel;
+        } else {
+          markerModel.mergeOption(markerOpt, ecModel, true);
+        }
+
+        seriesModel[modelPropName] = markerModel;
+      }, this);
+    }
+  },
+  formatTooltip: function (dataIndex) {
+    var data = this.getData();
+    var value = this.getRawValue(dataIndex);
+    var formattedValue = isArray(value) ? map(value, addCommas$1).join(', ') : addCommas$1(value);
+    var name = data.getName(dataIndex);
+    var html = encodeHTML$1(this.name);
+
+    if (value != null || name) {
+      html += '<br />';
+    }
+
+    if (name) {
+      html += encodeHTML$1(name);
+
+      if (value != null) {
+        html += ' : ';
+      }
+    }
+
+    if (value != null) {
+      html += encodeHTML$1(formattedValue);
+    }
+
+    return html;
+  },
+  getData: function () {
+    return this._data;
+  },
+  setData: function (data) {
+    this._data = data;
+  }
+});
+mixin(MarkerModel, dataFormatMixin);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+MarkerModel.extend({
+  type: 'markPoint',
+  defaultOption: {
+    zlevel: 0,
+    z: 5,
+    symbol: 'pin',
+    symbolSize: 50,
+    //symbolRotate: 0,
+    //symbolOffset: [0, 0]
+    tooltip: {
+      trigger: 'item'
+    },
+    label: {
+      show: true,
+      position: 'inside'
+    },
+    itemStyle: {
+      borderWidth: 2
+    },
+    emphasis: {
+      label: {
+        show: true
+      }
+    }
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var indexOf$1 = indexOf;
+
+function hasXOrY(item) {
+  return !(isNaN(parseFloat(item.x)) && isNaN(parseFloat(item.y)));
+}
+
+function hasXAndY(item) {
+  return !isNaN(parseFloat(item.x)) && !isNaN(parseFloat(item.y));
+} // Make it simple, do not visit all stacked value to count precision.
+// function getPrecision(data, valueAxisDim, dataIndex) {
+//     var precision = -1;
+//     var stackedDim = data.mapDimension(valueAxisDim);
+//     do {
+//         precision = Math.max(
+//             numberUtil.getPrecision(data.get(stackedDim, dataIndex)),
+//             precision
+//         );
+//         var stackedOnSeries = data.getCalculationInfo('stackedOnSeries');
+//         if (stackedOnSeries) {
+//             var byValue = data.get(data.getCalculationInfo('stackedByDimension'), dataIndex);
+//             data = stackedOnSeries.getData();
+//             dataIndex = data.indexOf(data.getCalculationInfo('stackedByDimension'), byValue);
+//             stackedDim = data.getCalculationInfo('stackedDimension');
+//         }
+//         else {
+//             data = null;
+//         }
+//     } while (data);
+//     return precision;
+// }
+
+
+function markerTypeCalculatorWithExtent(mlType, data, otherDataDim, targetDataDim, otherCoordIndex, targetCoordIndex) {
+  var coordArr = [];
+  var stacked = isDimensionStacked(data, targetDataDim
+  /*, otherDataDim*/
+  );
+  var calcDataDim = stacked ? data.getCalculationInfo('stackResultDimension') : targetDataDim;
+  var value = numCalculate(data, calcDataDim, mlType);
+  var dataIndex = data.indicesOfNearest(calcDataDim, value)[0];
+  coordArr[otherCoordIndex] = data.get(otherDataDim, dataIndex);
+  coordArr[targetCoordIndex] = data.get(targetDataDim, dataIndex); // Make it simple, do not visit all stacked value to count precision.
+
+  var precision = getPrecision(data.get(targetDataDim, dataIndex));
+  precision = Math.min(precision, 20);
+
+  if (precision >= 0) {
+    coordArr[targetCoordIndex] = +coordArr[targetCoordIndex].toFixed(precision);
+  }
+
+  return coordArr;
+}
+
+var curry$5 = curry; // TODO Specified percent
+
+var markerTypeCalculator = {
+  /**
+   * @method
+   * @param {module:echarts/data/List} data
+   * @param {string} baseAxisDim
+   * @param {string} valueAxisDim
+   */
+  min: curry$5(markerTypeCalculatorWithExtent, 'min'),
+
+  /**
+   * @method
+   * @param {module:echarts/data/List} data
+   * @param {string} baseAxisDim
+   * @param {string} valueAxisDim
+   */
+  max: curry$5(markerTypeCalculatorWithExtent, 'max'),
+
+  /**
+   * @method
+   * @param {module:echarts/data/List} data
+   * @param {string} baseAxisDim
+   * @param {string} valueAxisDim
+   */
+  average: curry$5(markerTypeCalculatorWithExtent, 'average')
+};
+/**
+ * Transform markPoint data item to format used in List by do the following
+ * 1. Calculate statistic like `max`, `min`, `average`
+ * 2. Convert `item.xAxis`, `item.yAxis` to `item.coord` array
+ * @param  {module:echarts/model/Series} seriesModel
+ * @param  {module:echarts/coord/*} [coordSys]
+ * @param  {Object} item
+ * @return {Object}
+ */
+
+function dataTransform(seriesModel, item) {
+  var data = seriesModel.getData();
+  var coordSys = seriesModel.coordinateSystem; // 1. If not specify the position with pixel directly
+  // 2. If `coord` is not a data array. Which uses `xAxis`,
+  // `yAxis` to specify the coord on each dimension
+  // parseFloat first because item.x and item.y can be percent string like '20%'
+
+  if (item && !hasXAndY(item) && !isArray(item.coord) && coordSys) {
+    var dims = coordSys.dimensions;
+    var axisInfo = getAxisInfo$1(item, data, coordSys, seriesModel); // Clone the option
+    // Transform the properties xAxis, yAxis, radiusAxis, angleAxis, geoCoord to value
+
+    item = clone(item);
+
+    if (item.type && markerTypeCalculator[item.type] && axisInfo.baseAxis && axisInfo.valueAxis) {
+      var otherCoordIndex = indexOf$1(dims, axisInfo.baseAxis.dim);
+      var targetCoordIndex = indexOf$1(dims, axisInfo.valueAxis.dim);
+      item.coord = markerTypeCalculator[item.type](data, axisInfo.baseDataDim, axisInfo.valueDataDim, otherCoordIndex, targetCoordIndex); // Force to use the value of calculated value.
+
+      item.value = item.coord[targetCoordIndex];
+    } else {
+      // FIXME Only has one of xAxis and yAxis.
+      var coord = [item.xAxis != null ? item.xAxis : item.radiusAxis, item.yAxis != null ? item.yAxis : item.angleAxis]; // Each coord support max, min, average
+
+      for (var i = 0; i < 2; i++) {
+        if (markerTypeCalculator[coord[i]]) {
+          coord[i] = numCalculate(data, data.mapDimension(dims[i]), coord[i]);
+        }
+      }
+
+      item.coord = coord;
+    }
+  }
+
+  return item;
+}
+function getAxisInfo$1(item, data, coordSys, seriesModel) {
+  var ret = {};
+
+  if (item.valueIndex != null || item.valueDim != null) {
+    ret.valueDataDim = item.valueIndex != null ? data.getDimension(item.valueIndex) : item.valueDim;
+    ret.valueAxis = coordSys.getAxis(dataDimToCoordDim(seriesModel, ret.valueDataDim));
+    ret.baseAxis = coordSys.getOtherAxis(ret.valueAxis);
+    ret.baseDataDim = data.mapDimension(ret.baseAxis.dim);
+  } else {
+    ret.baseAxis = seriesModel.getBaseAxis();
+    ret.valueAxis = coordSys.getOtherAxis(ret.baseAxis);
+    ret.baseDataDim = data.mapDimension(ret.baseAxis.dim);
+    ret.valueDataDim = data.mapDimension(ret.valueAxis.dim);
+  }
+
+  return ret;
+}
+
+function dataDimToCoordDim(seriesModel, dataDim) {
+  var data = seriesModel.getData();
+  var dimensions = data.dimensions;
+  dataDim = data.getDimension(dataDim);
+
+  for (var i = 0; i < dimensions.length; i++) {
+    var dimItem = data.getDimensionInfo(dimensions[i]);
+
+    if (dimItem.name === dataDim) {
+      return dimItem.coordDim;
+    }
+  }
+}
+/**
+ * Filter data which is out of coordinateSystem range
+ * [dataFilter description]
+ * @param  {module:echarts/coord/*} [coordSys]
+ * @param  {Object} item
+ * @return {boolean}
+ */
+
+
+function dataFilter$1(coordSys, item) {
+  // Alwalys return true if there is no coordSys
+  return coordSys && coordSys.containData && item.coord && !hasXOrY(item) ? coordSys.containData(item.coord) : true;
+}
+function dimValueGetter(item, dimName, dataIndex, dimIndex) {
+  // x, y, radius, angle
+  if (dimIndex < 2) {
+    return item.coord && item.coord[dimIndex];
+  }
+
+  return item.value;
+}
+function numCalculate(data, valueDataDim, type) {
+  if (type === 'average') {
+    var sum = 0;
+    var count = 0;
+    data.each(valueDataDim, function (val, idx) {
+      if (!isNaN(val)) {
+        sum += val;
+        count++;
+      }
+    });
+    return sum / count;
+  } else if (type === 'median') {
+    return data.getMedian(valueDataDim);
+  } else {
+    // max & min
+    return data.getDataExtent(valueDataDim, true)[type === 'max' ? 1 : 0];
+  }
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var MarkerView = extendComponentView({
+  type: 'marker',
+  init: function () {
+    /**
+     * Markline grouped by series
+     * @private
+     * @type {module:zrender/core/util.HashMap}
+     */
+    this.markerGroupMap = createHashMap();
+  },
+  render: function (markerModel, ecModel, api) {
+    var markerGroupMap = this.markerGroupMap;
+    markerGroupMap.each(function (item) {
+      item.__keep = false;
+    });
+    var markerModelKey = this.type + 'Model';
+    ecModel.eachSeries(function (seriesModel) {
+      var markerModel = seriesModel[markerModelKey];
+      markerModel && this.renderSeries(seriesModel, markerModel, ecModel, api);
+    }, this);
+    markerGroupMap.each(function (item) {
+      !item.__keep && this.group.remove(item.group);
+    }, this);
+  },
+  renderSeries: function () {}
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+function updateMarkerLayout(mpData, seriesModel, api) {
+  var coordSys = seriesModel.coordinateSystem;
+  mpData.each(function (idx) {
+    var itemModel = mpData.getItemModel(idx);
+    var point;
+    var xPx = parsePercent$1(itemModel.get('x'), api.getWidth());
+    var yPx = parsePercent$1(itemModel.get('y'), api.getHeight());
+
+    if (!isNaN(xPx) && !isNaN(yPx)) {
+      point = [xPx, yPx];
+    } // Chart like bar may have there own marker positioning logic
+    else if (seriesModel.getMarkerPosition) {
+        // Use the getMarkerPoisition
+        point = seriesModel.getMarkerPosition(mpData.getValues(mpData.dimensions, idx));
+      } else if (coordSys) {
+        var x = mpData.get(coordSys.dimensions[0], idx);
+        var y = mpData.get(coordSys.dimensions[1], idx);
+        point = coordSys.dataToPoint([x, y]);
+      } // Use x, y if has any
+
+
+    if (!isNaN(xPx)) {
+      point[0] = xPx;
+    }
+
+    if (!isNaN(yPx)) {
+      point[1] = yPx;
+    }
+
+    mpData.setItemLayout(idx, point);
+  });
+}
+
+MarkerView.extend({
+  type: 'markPoint',
+  // updateLayout: function (markPointModel, ecModel, api) {
+  //     ecModel.eachSeries(function (seriesModel) {
+  //         var mpModel = seriesModel.markPointModel;
+  //         if (mpModel) {
+  //             updateMarkerLayout(mpModel.getData(), seriesModel, api);
+  //             this.markerGroupMap.get(seriesModel.id).updateLayout(mpModel);
+  //         }
+  //     }, this);
+  // },
+  updateTransform: function (markPointModel, ecModel, api) {
+    ecModel.eachSeries(function (seriesModel) {
+      var mpModel = seriesModel.markPointModel;
+
+      if (mpModel) {
+        updateMarkerLayout(mpModel.getData(), seriesModel, api);
+        this.markerGroupMap.get(seriesModel.id).updateLayout(mpModel);
+      }
+    }, this);
+  },
+  renderSeries: function (seriesModel, mpModel, ecModel, api) {
+    var coordSys = seriesModel.coordinateSystem;
+    var seriesId = seriesModel.id;
+    var seriesData = seriesModel.getData();
+    var symbolDrawMap = this.markerGroupMap;
+    var symbolDraw = symbolDrawMap.get(seriesId) || symbolDrawMap.set(seriesId, new SymbolDraw());
+    var mpData = createList$1(coordSys, seriesModel, mpModel); // FIXME
+
+    mpModel.setData(mpData);
+    updateMarkerLayout(mpModel.getData(), seriesModel, api);
+    mpData.each(function (idx) {
+      var itemModel = mpData.getItemModel(idx);
+      var symbolSize = itemModel.getShallow('symbolSize');
+
+      if (typeof symbolSize === 'function') {
+        // FIXME 杩欓噷涓嶅吋瀹� ECharts 2.x锛�2.x 璨屼技鍙傛暟鏄暣涓暟鎹紵
+        symbolSize = symbolSize(mpModel.getRawValue(idx), mpModel.getDataParams(idx));
+      }
+
+      mpData.setItemVisual(idx, {
+        symbolSize: symbolSize,
+        color: itemModel.get('itemStyle.color') || seriesData.getVisual('color'),
+        symbol: itemModel.getShallow('symbol')
+      });
+    }); // TODO Text are wrong
+
+    symbolDraw.updateData(mpData);
+    this.group.add(symbolDraw.group); // Set host model for tooltip
+    // FIXME
+
+    mpData.eachItemGraphicEl(function (el) {
+      el.traverse(function (child) {
+        child.dataModel = mpModel;
+      });
+    });
+    symbolDraw.__keep = true;
+    symbolDraw.group.silent = mpModel.get('silent') || seriesModel.get('silent');
+  }
+});
+/**
+ * @inner
+ * @param {module:echarts/coord/*} [coordSys]
+ * @param {module:echarts/model/Series} seriesModel
+ * @param {module:echarts/model/Model} mpModel
+ */
+
+function createList$1(coordSys, seriesModel, mpModel) {
+  var coordDimsInfos;
+
+  if (coordSys) {
+    coordDimsInfos = map(coordSys && coordSys.dimensions, function (coordDim) {
+      var info = seriesModel.getData().getDimensionInfo(seriesModel.getData().mapDimension(coordDim)) || {}; // In map series data don't have lng and lat dimension. Fallback to same with coordSys
+
+      return defaults({
+        name: coordDim
+      }, info);
+    });
+  } else {
+    coordDimsInfos = [{
+      name: 'value',
+      type: 'float'
+    }];
+  }
+
+  var mpData = new List(coordDimsInfos, mpModel);
+  var dataOpt = map(mpModel.get('data'), curry(dataTransform, seriesModel));
+
+  if (coordSys) {
+    dataOpt = filter(dataOpt, curry(dataFilter$1, coordSys));
+  }
+
+  mpData.initData(dataOpt, null, coordSys ? dimValueGetter : function (item) {
+    return item.value;
+  });
+  return mpData;
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+// HINT Markpoint can't be used too much
+registerPreprocessor(function (opt) {
+  // Make sure markPoint component is enabled
+  opt.markPoint = opt.markPoint || {};
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+MarkerModel.extend({
+  type: 'markLine',
+  defaultOption: {
+    zlevel: 0,
+    z: 5,
+    symbol: ['circle', 'arrow'],
+    symbolSize: [8, 16],
+    //symbolRotate: 0,
+    precision: 2,
+    tooltip: {
+      trigger: 'item'
+    },
+    label: {
+      show: true,
+      position: 'end'
+    },
+    lineStyle: {
+      type: 'dashed'
+    },
+    emphasis: {
+      label: {
+        show: true
+      },
+      lineStyle: {
+        width: 3
+      }
+    },
+    animationEasing: 'linear'
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var markLineTransform = function (seriesModel, coordSys, mlModel, item) {
+  var data = seriesModel.getData(); // Special type markLine like 'min', 'max', 'average', 'median'
+
+  var mlType = item.type;
+
+  if (!isArray(item) && (mlType === 'min' || mlType === 'max' || mlType === 'average' || mlType === 'median' // In case
+  // data: [{
+  //   yAxis: 10
+  // }]
+  || item.xAxis != null || item.yAxis != null)) {
+    var valueAxis;
+    var valueDataDim;
+    var value;
+
+    if (item.yAxis != null || item.xAxis != null) {
+      valueDataDim = item.yAxis != null ? 'y' : 'x';
+      valueAxis = coordSys.getAxis(valueDataDim);
+      value = retrieve(item.yAxis, item.xAxis);
+    } else {
+      var axisInfo = getAxisInfo$1(item, data, coordSys, seriesModel);
+      valueDataDim = axisInfo.valueDataDim;
+      valueAxis = axisInfo.valueAxis;
+      value = numCalculate(data, valueDataDim, mlType);
+    }
+
+    var valueIndex = valueDataDim === 'x' ? 0 : 1;
+    var baseIndex = 1 - valueIndex;
+    var mlFrom = clone(item);
+    var mlTo = {};
+    mlFrom.type = null;
+    mlFrom.coord = [];
+    mlTo.coord = [];
+    mlFrom.coord[baseIndex] = -Infinity;
+    mlTo.coord[baseIndex] = Infinity;
+    var precision = mlModel.get('precision');
+
+    if (precision >= 0 && typeof value === 'number') {
+      value = +value.toFixed(Math.min(precision, 20));
+    }
+
+    mlFrom.coord[valueIndex] = mlTo.coord[valueIndex] = value;
+    item = [mlFrom, mlTo, {
+      // Extra option for tooltip and label
+      type: mlType,
+      valueIndex: item.valueIndex,
+      // Force to use the value of calculated value.
+      value: value
+    }];
+  }
+
+  item = [dataTransform(seriesModel, item[0]), dataTransform(seriesModel, item[1]), extend({}, item[2])]; // Avoid line data type is extended by from(to) data type
+
+  item[2].type = item[2].type || ''; // Merge from option and to option into line option
+
+  merge(item[2], item[0]);
+  merge(item[2], item[1]);
+  return item;
+};
+
+function isInifinity(val) {
+  return !isNaN(val) && !isFinite(val);
+} // If a markLine has one dim
+
+
+function ifMarkLineHasOnlyDim(dimIndex, fromCoord, toCoord, coordSys) {
+  var otherDimIndex = 1 - dimIndex;
+  var dimName = coordSys.dimensions[dimIndex];
+  return isInifinity(fromCoord[otherDimIndex]) && isInifinity(toCoord[otherDimIndex]) && fromCoord[dimIndex] === toCoord[dimIndex] && coordSys.getAxis(dimName).containData(fromCoord[dimIndex]);
+}
+
+function markLineFilter(coordSys, item) {
+  if (coordSys.type === 'cartesian2d') {
+    var fromCoord = item[0].coord;
+    var toCoord = item[1].coord; // In case
+    // {
+    //  markLine: {
+    //    data: [{ yAxis: 2 }]
+    //  }
+    // }
+
+    if (fromCoord && toCoord && (ifMarkLineHasOnlyDim(1, fromCoord, toCoord, coordSys) || ifMarkLineHasOnlyDim(0, fromCoord, toCoord, coordSys))) {
+      return true;
+    }
+  }
+
+  return dataFilter$1(coordSys, item[0]) && dataFilter$1(coordSys, item[1]);
+}
+
+function updateSingleMarkerEndLayout(data, idx, isFrom, seriesModel, api) {
+  var coordSys = seriesModel.coordinateSystem;
+  var itemModel = data.getItemModel(idx);
+  var point;
+  var xPx = parsePercent$1(itemModel.get('x'), api.getWidth());
+  var yPx = parsePercent$1(itemModel.get('y'), api.getHeight());
+
+  if (!isNaN(xPx) && !isNaN(yPx)) {
+    point = [xPx, yPx];
+  } else {
+    // Chart like bar may have there own marker positioning logic
+    if (seriesModel.getMarkerPosition) {
+      // Use the getMarkerPoisition
+      point = seriesModel.getMarkerPosition(data.getValues(data.dimensions, idx));
+    } else {
+      var dims = coordSys.dimensions;
+      var x = data.get(dims[0], idx);
+      var y = data.get(dims[1], idx);
+      point = coordSys.dataToPoint([x, y]);
+    } // Expand line to the edge of grid if value on one axis is Inifnity
+    // In case
+    //  markLine: {
+    //    data: [{
+    //      yAxis: 2
+    //      // or
+    //      type: 'average'
+    //    }]
+    //  }
+
+
+    if (coordSys.type === 'cartesian2d') {
+      var xAxis = coordSys.getAxis('x');
+      var yAxis = coordSys.getAxis('y');
+      var dims = coordSys.dimensions;
+
+      if (isInifinity(data.get(dims[0], idx))) {
+        point[0] = xAxis.toGlobalCoord(xAxis.getExtent()[isFrom ? 0 : 1]);
+      } else if (isInifinity(data.get(dims[1], idx))) {
+        point[1] = yAxis.toGlobalCoord(yAxis.getExtent()[isFrom ? 0 : 1]);
+      }
+    } // Use x, y if has any
+
+
+    if (!isNaN(xPx)) {
+      point[0] = xPx;
+    }
+
+    if (!isNaN(yPx)) {
+      point[1] = yPx;
+    }
+  }
+
+  data.setItemLayout(idx, point);
+}
+
+MarkerView.extend({
+  type: 'markLine',
+  // updateLayout: function (markLineModel, ecModel, api) {
+  //     ecModel.eachSeries(function (seriesModel) {
+  //         var mlModel = seriesModel.markLineModel;
+  //         if (mlModel) {
+  //             var mlData = mlModel.getData();
+  //             var fromData = mlModel.__from;
+  //             var toData = mlModel.__to;
+  //             // Update visual and layout of from symbol and to symbol
+  //             fromData.each(function (idx) {
+  //                 updateSingleMarkerEndLayout(fromData, idx, true, seriesModel, api);
+  //                 updateSingleMarkerEndLayout(toData, idx, false, seriesModel, api);
+  //             });
+  //             // Update layout of line
+  //             mlData.each(function (idx) {
+  //                 mlData.setItemLayout(idx, [
+  //                     fromData.getItemLayout(idx),
+  //                     toData.getItemLayout(idx)
+  //                 ]);
+  //             });
+  //             this.markerGroupMap.get(seriesModel.id).updateLayout();
+  //         }
+  //     }, this);
+  // },
+  updateTransform: function (markLineModel, ecModel, api) {
+    ecModel.eachSeries(function (seriesModel) {
+      var mlModel = seriesModel.markLineModel;
+
+      if (mlModel) {
+        var mlData = mlModel.getData();
+        var fromData = mlModel.__from;
+        var toData = mlModel.__to; // Update visual and layout of from symbol and to symbol
+
+        fromData.each(function (idx) {
+          updateSingleMarkerEndLayout(fromData, idx, true, seriesModel, api);
+          updateSingleMarkerEndLayout(toData, idx, false, seriesModel, api);
+        }); // Update layout of line
+
+        mlData.each(function (idx) {
+          mlData.setItemLayout(idx, [fromData.getItemLayout(idx), toData.getItemLayout(idx)]);
+        });
+        this.markerGroupMap.get(seriesModel.id).updateLayout();
+      }
+    }, this);
+  },
+  renderSeries: function (seriesModel, mlModel, ecModel, api) {
+    var coordSys = seriesModel.coordinateSystem;
+    var seriesId = seriesModel.id;
+    var seriesData = seriesModel.getData();
+    var lineDrawMap = this.markerGroupMap;
+    var lineDraw = lineDrawMap.get(seriesId) || lineDrawMap.set(seriesId, new LineDraw());
+    this.group.add(lineDraw.group);
+    var mlData = createList$2(coordSys, seriesModel, mlModel);
+    var fromData = mlData.from;
+    var toData = mlData.to;
+    var lineData = mlData.line;
+    mlModel.__from = fromData;
+    mlModel.__to = toData; // Line data for tooltip and formatter
+
+    mlModel.setData(lineData);
+    var symbolType = mlModel.get('symbol');
+    var symbolSize = mlModel.get('symbolSize');
+
+    if (!isArray(symbolType)) {
+      symbolType = [symbolType, symbolType];
+    }
+
+    if (typeof symbolSize === 'number') {
+      symbolSize = [symbolSize, symbolSize];
+    } // Update visual and layout of from symbol and to symbol
+
+
+    mlData.from.each(function (idx) {
+      updateDataVisualAndLayout(fromData, idx, true);
+      updateDataVisualAndLayout(toData, idx, false);
+    }); // Update visual and layout of line
+
+    lineData.each(function (idx) {
+      var lineColor = lineData.getItemModel(idx).get('lineStyle.color');
+      lineData.setItemVisual(idx, {
+        color: lineColor || fromData.getItemVisual(idx, 'color')
+      });
+      lineData.setItemLayout(idx, [fromData.getItemLayout(idx), toData.getItemLayout(idx)]);
+      lineData.setItemVisual(idx, {
+        'fromSymbolSize': fromData.getItemVisual(idx, 'symbolSize'),
+        'fromSymbol': fromData.getItemVisual(idx, 'symbol'),
+        'toSymbolSize': toData.getItemVisual(idx, 'symbolSize'),
+        'toSymbol': toData.getItemVisual(idx, 'symbol')
+      });
+    });
+    lineDraw.updateData(lineData); // Set host model for tooltip
+    // FIXME
+
+    mlData.line.eachItemGraphicEl(function (el, idx) {
+      el.traverse(function (child) {
+        child.dataModel = mlModel;
+      });
+    });
+
+    function updateDataVisualAndLayout(data, idx, isFrom) {
+      var itemModel = data.getItemModel(idx);
+      updateSingleMarkerEndLayout(data, idx, isFrom, seriesModel, api);
+      data.setItemVisual(idx, {
+        symbolSize: itemModel.get('symbolSize') || symbolSize[isFrom ? 0 : 1],
+        symbol: itemModel.get('symbol', true) || symbolType[isFrom ? 0 : 1],
+        color: itemModel.get('itemStyle.color') || seriesData.getVisual('color')
+      });
+    }
+
+    lineDraw.__keep = true;
+    lineDraw.group.silent = mlModel.get('silent') || seriesModel.get('silent');
+  }
+});
+/**
+ * @inner
+ * @param {module:echarts/coord/*} coordSys
+ * @param {module:echarts/model/Series} seriesModel
+ * @param {module:echarts/model/Model} mpModel
+ */
+
+function createList$2(coordSys, seriesModel, mlModel) {
+  var coordDimsInfos;
+
+  if (coordSys) {
+    coordDimsInfos = map(coordSys && coordSys.dimensions, function (coordDim) {
+      var info = seriesModel.getData().getDimensionInfo(seriesModel.getData().mapDimension(coordDim)) || {}; // In map series data don't have lng and lat dimension. Fallback to same with coordSys
+
+      return defaults({
+        name: coordDim
+      }, info);
+    });
+  } else {
+    coordDimsInfos = [{
+      name: 'value',
+      type: 'float'
+    }];
+  }
+
+  var fromData = new List(coordDimsInfos, mlModel);
+  var toData = new List(coordDimsInfos, mlModel); // No dimensions
+
+  var lineData = new List([], mlModel);
+  var optData = map(mlModel.get('data'), curry(markLineTransform, seriesModel, coordSys, mlModel));
+
+  if (coordSys) {
+    optData = filter(optData, curry(markLineFilter, coordSys));
+  }
+
+  var dimValueGetter$$1 = coordSys ? dimValueGetter : function (item) {
+    return item.value;
+  };
+  fromData.initData(map(optData, function (item) {
+    return item[0];
+  }), null, dimValueGetter$$1);
+  toData.initData(map(optData, function (item) {
+    return item[1];
+  }), null, dimValueGetter$$1);
+  lineData.initData(map(optData, function (item) {
+    return item[2];
+  }));
+  lineData.hasItemOption = true;
+  return {
+    from: fromData,
+    to: toData,
+    line: lineData
+  };
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+registerPreprocessor(function (opt) {
+  // Make sure markLine component is enabled
+  opt.markLine = opt.markLine || {};
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+MarkerModel.extend({
+  type: 'markArea',
+  defaultOption: {
+    zlevel: 0,
+    // PENDING
+    z: 1,
+    tooltip: {
+      trigger: 'item'
+    },
+    // markArea should fixed on the coordinate system
+    animation: false,
+    label: {
+      show: true,
+      position: 'top'
+    },
+    itemStyle: {
+      // color and borderColor default to use color from series
+      // color: 'auto'
+      // borderColor: 'auto'
+      borderWidth: 0
+    },
+    emphasis: {
+      label: {
+        show: true,
+        position: 'top'
+      }
+    }
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+// TODO Better on polar
+var markAreaTransform = function (seriesModel, coordSys, maModel, item) {
+  var lt = dataTransform(seriesModel, item[0]);
+  var rb = dataTransform(seriesModel, item[1]);
+  var retrieve$$1 = retrieve; // FIXME make sure lt is less than rb
+
+  var ltCoord = lt.coord;
+  var rbCoord = rb.coord;
+  ltCoord[0] = retrieve$$1(ltCoord[0], -Infinity);
+  ltCoord[1] = retrieve$$1(ltCoord[1], -Infinity);
+  rbCoord[0] = retrieve$$1(rbCoord[0], Infinity);
+  rbCoord[1] = retrieve$$1(rbCoord[1], Infinity); // Merge option into one
+
+  var result = mergeAll([{}, lt, rb]);
+  result.coord = [lt.coord, rb.coord];
+  result.x0 = lt.x;
+  result.y0 = lt.y;
+  result.x1 = rb.x;
+  result.y1 = rb.y;
+  return result;
+};
+
+function isInifinity$1(val) {
+  return !isNaN(val) && !isFinite(val);
+} // If a markArea has one dim
+
+
+function ifMarkLineHasOnlyDim$1(dimIndex, fromCoord, toCoord, coordSys) {
+  var otherDimIndex = 1 - dimIndex;
+  return isInifinity$1(fromCoord[otherDimIndex]) && isInifinity$1(toCoord[otherDimIndex]);
+}
+
+function markAreaFilter(coordSys, item) {
+  var fromCoord = item.coord[0];
+  var toCoord = item.coord[1];
+
+  if (coordSys.type === 'cartesian2d') {
+    // In case
+    // {
+    //  markArea: {
+    //    data: [{ yAxis: 2 }]
+    //  }
+    // }
+    if (fromCoord && toCoord && (ifMarkLineHasOnlyDim$1(1, fromCoord, toCoord, coordSys) || ifMarkLineHasOnlyDim$1(0, fromCoord, toCoord, coordSys))) {
+      return true;
+    }
+  }
+
+  return dataFilter$1(coordSys, {
+    coord: fromCoord,
+    x: item.x0,
+    y: item.y0
+  }) || dataFilter$1(coordSys, {
+    coord: toCoord,
+    x: item.x1,
+    y: item.y1
+  });
+} // dims can be ['x0', 'y0'], ['x1', 'y1'], ['x0', 'y1'], ['x1', 'y0']
+
+
+function getSingleMarkerEndPoint(data, idx, dims, seriesModel, api) {
+  var coordSys = seriesModel.coordinateSystem;
+  var itemModel = data.getItemModel(idx);
+  var point;
+  var xPx = parsePercent$1(itemModel.get(dims[0]), api.getWidth());
+  var yPx = parsePercent$1(itemModel.get(dims[1]), api.getHeight());
+
+  if (!isNaN(xPx) && !isNaN(yPx)) {
+    point = [xPx, yPx];
+  } else {
+    // Chart like bar may have there own marker positioning logic
+    if (seriesModel.getMarkerPosition) {
+      // Use the getMarkerPoisition
+      point = seriesModel.getMarkerPosition(data.getValues(dims, idx));
+    } else {
+      var x = data.get(dims[0], idx);
+      var y = data.get(dims[1], idx);
+      var pt = [x, y];
+      coordSys.clampData && coordSys.clampData(pt, pt);
+      point = coordSys.dataToPoint(pt, true);
+    }
+
+    if (coordSys.type === 'cartesian2d') {
+      var xAxis = coordSys.getAxis('x');
+      var yAxis = coordSys.getAxis('y');
+      var x = data.get(dims[0], idx);
+      var y = data.get(dims[1], idx);
+
+      if (isInifinity$1(x)) {
+        point[0] = xAxis.toGlobalCoord(xAxis.getExtent()[dims[0] === 'x0' ? 0 : 1]);
+      } else if (isInifinity$1(y)) {
+        point[1] = yAxis.toGlobalCoord(yAxis.getExtent()[dims[1] === 'y0' ? 0 : 1]);
+      }
+    } // Use x, y if has any
+
+
+    if (!isNaN(xPx)) {
+      point[0] = xPx;
+    }
+
+    if (!isNaN(yPx)) {
+      point[1] = yPx;
+    }
+  }
+
+  return point;
+}
+
+var dimPermutations = [['x0', 'y0'], ['x1', 'y0'], ['x1', 'y1'], ['x0', 'y1']];
+MarkerView.extend({
+  type: 'markArea',
+  // updateLayout: function (markAreaModel, ecModel, api) {
+  //     ecModel.eachSeries(function (seriesModel) {
+  //         var maModel = seriesModel.markAreaModel;
+  //         if (maModel) {
+  //             var areaData = maModel.getData();
+  //             areaData.each(function (idx) {
+  //                 var points = zrUtil.map(dimPermutations, function (dim) {
+  //                     return getSingleMarkerEndPoint(areaData, idx, dim, seriesModel, api);
+  //                 });
+  //                 // Layout
+  //                 areaData.setItemLayout(idx, points);
+  //                 var el = areaData.getItemGraphicEl(idx);
+  //                 el.setShape('points', points);
+  //             });
+  //         }
+  //     }, this);
+  // },
+  updateTransform: function (markAreaModel, ecModel, api) {
+    ecModel.eachSeries(function (seriesModel) {
+      var maModel = seriesModel.markAreaModel;
+
+      if (maModel) {
+        var areaData = maModel.getData();
+        areaData.each(function (idx) {
+          var points = map(dimPermutations, function (dim) {
+            return getSingleMarkerEndPoint(areaData, idx, dim, seriesModel, api);
+          }); // Layout
+
+          areaData.setItemLayout(idx, points);
+          var el = areaData.getItemGraphicEl(idx);
+          el.setShape('points', points);
+        });
+      }
+    }, this);
+  },
+  renderSeries: function (seriesModel, maModel, ecModel, api) {
+    var coordSys = seriesModel.coordinateSystem;
+    var seriesId = seriesModel.id;
+    var seriesData = seriesModel.getData();
+    var areaGroupMap = this.markerGroupMap;
+    var polygonGroup = areaGroupMap.get(seriesId) || areaGroupMap.set(seriesId, {
+      group: new Group()
+    });
+    this.group.add(polygonGroup.group);
+    polygonGroup.__keep = true;
+    var areaData = createList$3(coordSys, seriesModel, maModel); // Line data for tooltip and formatter
+
+    maModel.setData(areaData); // Update visual and layout of line
+
+    areaData.each(function (idx) {
+      // Layout
+      areaData.setItemLayout(idx, map(dimPermutations, function (dim) {
+        return getSingleMarkerEndPoint(areaData, idx, dim, seriesModel, api);
+      })); // Visual
+
+      areaData.setItemVisual(idx, {
+        color: seriesData.getVisual('color')
+      });
+    });
+    areaData.diff(polygonGroup.__data).add(function (idx) {
+      var polygon = new Polygon({
+        shape: {
+          points: areaData.getItemLayout(idx)
+        }
+      });
+      areaData.setItemGraphicEl(idx, polygon);
+      polygonGroup.group.add(polygon);
+    }).update(function (newIdx, oldIdx) {
+      var polygon = polygonGroup.__data.getItemGraphicEl(oldIdx);
+
+      updateProps(polygon, {
+        shape: {
+          points: areaData.getItemLayout(newIdx)
+        }
+      }, maModel, newIdx);
+      polygonGroup.group.add(polygon);
+      areaData.setItemGraphicEl(newIdx, polygon);
+    }).remove(function (idx) {
+      var polygon = polygonGroup.__data.getItemGraphicEl(idx);
+
+      polygonGroup.group.remove(polygon);
+    }).execute();
+    areaData.eachItemGraphicEl(function (polygon, idx) {
+      var itemModel = areaData.getItemModel(idx);
+      var labelModel = itemModel.getModel('label');
+      var labelHoverModel = itemModel.getModel('emphasis.label');
+      var color = areaData.getItemVisual(idx, 'color');
+      polygon.useStyle(defaults(itemModel.getModel('itemStyle').getItemStyle(), {
+        fill: modifyAlpha(color, 0.4),
+        stroke: color
+      }));
+      polygon.hoverStyle = itemModel.getModel('emphasis.itemStyle').getItemStyle();
+      setLabelStyle(polygon.style, polygon.hoverStyle, labelModel, labelHoverModel, {
+        labelFetcher: maModel,
+        labelDataIndex: idx,
+        defaultText: areaData.getName(idx) || '',
+        isRectText: true,
+        autoColor: color
+      });
+      setHoverStyle(polygon, {});
+      polygon.dataModel = maModel;
+    });
+    polygonGroup.__data = areaData;
+    polygonGroup.group.silent = maModel.get('silent') || seriesModel.get('silent');
+  }
+});
+/**
+ * @inner
+ * @param {module:echarts/coord/*} coordSys
+ * @param {module:echarts/model/Series} seriesModel
+ * @param {module:echarts/model/Model} mpModel
+ */
+
+function createList$3(coordSys, seriesModel, maModel) {
+  var coordDimsInfos;
+  var areaData;
+  var dims = ['x0', 'y0', 'x1', 'y1'];
+
+  if (coordSys) {
+    coordDimsInfos = map(coordSys && coordSys.dimensions, function (coordDim) {
+      var data = seriesModel.getData();
+      var info = data.getDimensionInfo(data.mapDimension(coordDim)) || {}; // In map series data don't have lng and lat dimension. Fallback to same with coordSys
+
+      return defaults({
+        name: coordDim
+      }, info);
+    });
+    areaData = new List(map(dims, function (dim, idx) {
+      return {
+        name: dim,
+        type: coordDimsInfos[idx % 2].type
+      };
+    }), maModel);
+  } else {
+    coordDimsInfos = [{
+      name: 'value',
+      type: 'float'
+    }];
+    areaData = new List(coordDimsInfos, maModel);
+  }
+
+  var optData = map(maModel.get('data'), curry(markAreaTransform, seriesModel, coordSys, maModel));
+
+  if (coordSys) {
+    optData = filter(optData, curry(markAreaFilter, coordSys));
+  }
+
+  var dimValueGetter$$1 = coordSys ? function (item, dimName, dataIndex, dimIndex) {
+    return item.coord[Math.floor(dimIndex / 2)][dimIndex % 2];
+  } : function (item) {
+    return item.value;
+  };
+  areaData.initData(optData, null, dimValueGetter$$1);
+  areaData.hasItemOption = true;
+  return areaData;
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+registerPreprocessor(function (opt) {
+  // Make sure markArea component is enabled
+  opt.markArea = opt.markArea || {};
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var preprocessor$1 = function (option) {
+  var timelineOpt = option && option.timeline;
+
+  if (!isArray(timelineOpt)) {
+    timelineOpt = timelineOpt ? [timelineOpt] : [];
+  }
+
+  each$1(timelineOpt, function (opt) {
+    if (!opt) {
+      return;
+    }
+
+    compatibleEC2(opt);
+  });
+};
+
+function compatibleEC2(opt) {
+  var type = opt.type;
+  var ec2Types = {
+    'number': 'value',
+    'time': 'time'
+  }; // Compatible with ec2
+
+  if (ec2Types[type]) {
+    opt.axisType = ec2Types[type];
+    delete opt.type;
+  }
+
+  transferItem(opt);
+
+  if (has$1(opt, 'controlPosition')) {
+    var controlStyle = opt.controlStyle || (opt.controlStyle = {});
+
+    if (!has$1(controlStyle, 'position')) {
+      controlStyle.position = opt.controlPosition;
+    }
+
+    if (controlStyle.position === 'none' && !has$1(controlStyle, 'show')) {
+      controlStyle.show = false;
+      delete controlStyle.position;
+    }
+
+    delete opt.controlPosition;
+  }
+
+  each$1(opt.data || [], function (dataItem) {
+    if (isObject$1(dataItem) && !isArray(dataItem)) {
+      if (!has$1(dataItem, 'value') && has$1(dataItem, 'name')) {
+        // In ec2, using name as value.
+        dataItem.value = dataItem.name;
+      }
+
+      transferItem(dataItem);
+    }
+  });
+}
+
+function transferItem(opt) {
+  var itemStyle = opt.itemStyle || (opt.itemStyle = {});
+  var itemStyleEmphasis = itemStyle.emphasis || (itemStyle.emphasis = {}); // Transfer label out
+
+  var label = opt.label || opt.label || {};
+  var labelNormal = label.normal || (label.normal = {});
+  var excludeLabelAttr = {
+    normal: 1,
+    emphasis: 1
+  };
+  each$1(label, function (value, name) {
+    if (!excludeLabelAttr[name] && !has$1(labelNormal, name)) {
+      labelNormal[name] = value;
+    }
+  });
+
+  if (itemStyleEmphasis.label && !has$1(label, 'emphasis')) {
+    label.emphasis = itemStyleEmphasis.label;
+    delete itemStyleEmphasis.label;
+  }
+}
+
+function has$1(obj, attr) {
+  return obj.hasOwnProperty(attr);
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+ComponentModel.registerSubTypeDefaulter('timeline', function () {
+  // Only slider now.
+  return 'slider';
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+registerAction({
+  type: 'timelineChange',
+  event: 'timelineChanged',
+  update: 'prepareAndUpdate'
+}, function (payload, ecModel) {
+  var timelineModel = ecModel.getComponent('timeline');
+
+  if (timelineModel && payload.currentIndex != null) {
+    timelineModel.setCurrentIndex(payload.currentIndex);
+
+    if (!timelineModel.get('loop', true) && timelineModel.isIndexMax()) {
+      timelineModel.setPlayState(false);
+    }
+  } // Set normalized currentIndex to payload.
+
+
+  ecModel.resetOption('timeline');
+  return defaults({
+    currentIndex: timelineModel.option.currentIndex
+  }, payload);
+});
+registerAction({
+  type: 'timelinePlayChange',
+  event: 'timelinePlayChanged',
+  update: 'update'
+}, function (payload, ecModel) {
+  var timelineModel = ecModel.getComponent('timeline');
+
+  if (timelineModel && payload.playState != null) {
+    timelineModel.setPlayState(payload.playState);
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var TimelineModel = ComponentModel.extend({
+  type: 'timeline',
+  layoutMode: 'box',
+
+  /**
+   * @protected
+   */
+  defaultOption: {
+    zlevel: 0,
+    // 涓�绾у眰鍙�
+    z: 4,
+    // 浜岀骇灞傚彔
+    show: true,
+    axisType: 'time',
+    // 妯″紡鏄椂闂寸被鍨嬶紝鏀寔 value, category
+    realtime: true,
+    left: '20%',
+    top: null,
+    right: '20%',
+    bottom: 0,
+    width: null,
+    height: 40,
+    padding: 5,
+    controlPosition: 'left',
+    // 'left' 'right' 'top' 'bottom' 'none'
+    autoPlay: false,
+    rewind: false,
+    // 鍙嶅悜鎾斁
+    loop: true,
+    playInterval: 2000,
+    // 鎾斁鏃堕棿闂撮殧锛屽崟浣峬s
+    currentIndex: 0,
+    itemStyle: {},
+    label: {
+      color: '#000'
+    },
+    data: []
+  },
+
+  /**
+   * @override
+   */
+  init: function (option, parentModel, ecModel) {
+    /**
+     * @private
+     * @type {module:echarts/data/List}
+     */
+    this._data;
+    /**
+     * @private
+     * @type {Array.<string>}
+     */
+
+    this._names;
+    this.mergeDefaultAndTheme(option, ecModel);
+
+    this._initData();
+  },
+
+  /**
+   * @override
+   */
+  mergeOption: function (option) {
+    TimelineModel.superApply(this, 'mergeOption', arguments);
+
+    this._initData();
+  },
+
+  /**
+   * @param {number} [currentIndex]
+   */
+  setCurrentIndex: function (currentIndex) {
+    if (currentIndex == null) {
+      currentIndex = this.option.currentIndex;
+    }
+
+    var count = this._data.count();
+
+    if (this.option.loop) {
+      currentIndex = (currentIndex % count + count) % count;
+    } else {
+      currentIndex >= count && (currentIndex = count - 1);
+      currentIndex < 0 && (currentIndex = 0);
+    }
+
+    this.option.currentIndex = currentIndex;
+  },
+
+  /**
+   * @return {number} currentIndex
+   */
+  getCurrentIndex: function () {
+    return this.option.currentIndex;
+  },
+
+  /**
+   * @return {boolean}
+   */
+  isIndexMax: function () {
+    return this.getCurrentIndex() >= this._data.count() - 1;
+  },
+
+  /**
+   * @param {boolean} state true: play, false: stop
+   */
+  setPlayState: function (state) {
+    this.option.autoPlay = !!state;
+  },
+
+  /**
+   * @return {boolean} true: play, false: stop
+   */
+  getPlayState: function () {
+    return !!this.option.autoPlay;
+  },
+
+  /**
+   * @private
+   */
+  _initData: function () {
+    var thisOption = this.option;
+    var dataArr = thisOption.data || [];
+    var axisType = thisOption.axisType;
+    var names = this._names = [];
+
+    if (axisType === 'category') {
+      var idxArr = [];
+      each$1(dataArr, function (item, index) {
+        var value = getDataItemValue(item);
+        var newItem;
+
+        if (isObject$1(item)) {
+          newItem = clone(item);
+          newItem.value = index;
+        } else {
+          newItem = index;
+        }
+
+        idxArr.push(newItem);
+
+        if (!isString(value) && (value == null || isNaN(value))) {
+          value = '';
+        }
+
+        names.push(value + '');
+      });
+      dataArr = idxArr;
+    }
+
+    var dimType = {
+      category: 'ordinal',
+      time: 'time'
+    }[axisType] || 'number';
+    var data = this._data = new List([{
+      name: 'value',
+      type: dimType
+    }], this);
+    data.initData(dataArr, names);
+  },
+  getData: function () {
+    return this._data;
+  },
+
+  /**
+   * @public
+   * @return {Array.<string>} categoreis
+   */
+  getCategories: function () {
+    if (this.get('axisType') === 'category') {
+      return this._names.slice();
+    }
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var SliderTimelineModel = TimelineModel.extend({
+  type: 'timeline.slider',
+
+  /**
+   * @protected
+   */
+  defaultOption: {
+    backgroundColor: 'rgba(0,0,0,0)',
+    // 鏃堕棿杞磋儗鏅鑹�
+    borderColor: '#ccc',
+    // 鏃堕棿杞磋竟妗嗛鑹�
+    borderWidth: 0,
+    // 鏃堕棿杞磋竟妗嗙嚎瀹斤紝鍗曚綅px锛岄粯璁や负0锛堟棤杈规锛�
+    orient: 'horizontal',
+    // 'vertical'
+    inverse: false,
+    tooltip: {
+      // boolean or Object
+      trigger: 'item' // data item may also have tootip attr.
+
+    },
+    symbol: 'emptyCircle',
+    symbolSize: 10,
+    lineStyle: {
+      show: true,
+      width: 2,
+      color: '#304654'
+    },
+    label: {
+      // 鏂囨湰鏍囩
+      position: 'auto',
+      // auto left right top bottom
+      // When using number, label position is not
+      // restricted by viewRect.
+      // positive: right/bottom, negative: left/top
+      show: true,
+      interval: 'auto',
+      rotate: 0,
+      // formatter: null,
+      // 鍏朵綑灞炴�ч粯璁や娇鐢ㄥ叏灞�鏂囨湰鏍峰紡锛岃瑙乀EXTSTYLE
+      color: '#304654'
+    },
+    itemStyle: {
+      color: '#304654',
+      borderWidth: 1
+    },
+    checkpointStyle: {
+      symbol: 'circle',
+      symbolSize: 13,
+      color: '#c23531',
+      borderWidth: 5,
+      borderColor: 'rgba(194,53,49, 0.5)',
+      animation: true,
+      animationDuration: 300,
+      animationEasing: 'quinticInOut'
+    },
+    controlStyle: {
+      show: true,
+      showPlayBtn: true,
+      showPrevBtn: true,
+      showNextBtn: true,
+      itemSize: 22,
+      itemGap: 12,
+      position: 'left',
+      // 'left' 'right' 'top' 'bottom'
+      playIcon: 'path://M31.6,53C17.5,53,6,41.5,6,27.4S17.5,1.8,31.6,1.8C45.7,1.8,57.2,13.3,57.2,27.4S45.7,53,31.6,53z M31.6,3.3 C18.4,3.3,7.5,14.1,7.5,27.4c0,13.3,10.8,24.1,24.1,24.1C44.9,51.5,55.7,40.7,55.7,27.4C55.7,14.1,44.9,3.3,31.6,3.3z M24.9,21.3 c0-2.2,1.6-3.1,3.5-2l10.5,6.1c1.899,1.1,1.899,2.9,0,4l-10.5,6.1c-1.9,1.1-3.5,0.2-3.5-2V21.3z',
+      // jshint ignore:line
+      stopIcon: 'path://M30.9,53.2C16.8,53.2,5.3,41.7,5.3,27.6S16.8,2,30.9,2C45,2,56.4,13.5,56.4,27.6S45,53.2,30.9,53.2z M30.9,3.5C17.6,3.5,6.8,14.4,6.8,27.6c0,13.3,10.8,24.1,24.101,24.1C44.2,51.7,55,40.9,55,27.6C54.9,14.4,44.1,3.5,30.9,3.5z M36.9,35.8c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H36c0.5,0,0.9,0.4,0.9,1V35.8z M27.8,35.8 c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H27c0.5,0,0.9,0.4,0.9,1L27.8,35.8L27.8,35.8z',
+      // jshint ignore:line
+      nextIcon: 'path://M18.6,50.8l22.5-22.5c0.2-0.2,0.3-0.4,0.3-0.7c0-0.3-0.1-0.5-0.3-0.7L18.7,4.4c-0.1-0.1-0.2-0.3-0.2-0.5 c0-0.4,0.3-0.8,0.8-0.8c0.2,0,0.5,0.1,0.6,0.3l23.5,23.5l0,0c0.2,0.2,0.3,0.4,0.3,0.7c0,0.3-0.1,0.5-0.3,0.7l-0.1,0.1L19.7,52 c-0.1,0.1-0.3,0.2-0.5,0.2c-0.4,0-0.8-0.3-0.8-0.8C18.4,51.2,18.5,51,18.6,50.8z',
+      // jshint ignore:line
+      prevIcon: 'path://M43,52.8L20.4,30.3c-0.2-0.2-0.3-0.4-0.3-0.7c0-0.3,0.1-0.5,0.3-0.7L42.9,6.4c0.1-0.1,0.2-0.3,0.2-0.5 c0-0.4-0.3-0.8-0.8-0.8c-0.2,0-0.5,0.1-0.6,0.3L18.3,28.8l0,0c-0.2,0.2-0.3,0.4-0.3,0.7c0,0.3,0.1,0.5,0.3,0.7l0.1,0.1L41.9,54 c0.1,0.1,0.3,0.2,0.5,0.2c0.4,0,0.8-0.3,0.8-0.8C43.2,53.2,43.1,53,43,52.8z',
+      // jshint ignore:line
+      color: '#304654',
+      borderColor: '#304654',
+      borderWidth: 1
+    },
+    emphasis: {
+      label: {
+        show: true,
+        // 鍏朵綑灞炴�ч粯璁や娇鐢ㄥ叏灞�鏂囨湰鏍峰紡锛岃瑙乀EXTSTYLE
+        color: '#c23531'
+      },
+      itemStyle: {
+        color: '#c23531'
+      },
+      controlStyle: {
+        color: '#c23531',
+        borderColor: '#c23531',
+        borderWidth: 2
+      }
+    },
+    data: []
+  }
+});
+mixin(SliderTimelineModel, dataFormatMixin);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var TimelineView = Component$1.extend({
+  type: 'timeline'
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+/**
+ * Extend axis 2d
+ * @constructor module:echarts/coord/cartesian/Axis2D
+ * @extends {module:echarts/coord/cartesian/Axis}
+ * @param {string} dim
+ * @param {*} scale
+ * @param {Array.<number>} coordExtent
+ * @param {string} axisType
+ * @param {string} position
+ */
+
+var TimelineAxis = function (dim, scale, coordExtent, axisType) {
+  Axis.call(this, dim, scale, coordExtent);
+  /**
+   * Axis type
+   *  - 'category'
+   *  - 'value'
+   *  - 'time'
+   *  - 'log'
+   * @type {string}
+   */
+
+  this.type = axisType || 'value';
+  /**
+   * Axis model
+   * @param {module:echarts/component/TimelineModel}
+   */
+
+  this.model = null;
+};
+
+TimelineAxis.prototype = {
+  constructor: TimelineAxis,
+
+  /**
+   * @override
+   */
+  getLabelModel: function () {
+    return this.model.getModel('label');
+  },
+
+  /**
+   * @override
+   */
+  isHorizontal: function () {
+    return this.model.get('orient') === 'horizontal';
+  }
+};
+inherits(TimelineAxis, Axis);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var bind$4 = bind;
+var each$19 = each$1;
+var PI$4 = Math.PI;
+TimelineView.extend({
+  type: 'timeline.slider',
+  init: function (ecModel, api) {
+    this.api = api;
+    /**
+     * @private
+     * @type {module:echarts/component/timeline/TimelineAxis}
+     */
+
+    this._axis;
+    /**
+     * @private
+     * @type {module:zrender/core/BoundingRect}
+     */
+
+    this._viewRect;
+    /**
+     * @type {number}
+     */
+
+    this._timer;
+    /**
+     * @type {module:zrender/Element}
+     */
+
+    this._currentPointer;
+    /**
+     * @type {module:zrender/container/Group}
+     */
+
+    this._mainGroup;
+    /**
+     * @type {module:zrender/container/Group}
+     */
+
+    this._labelGroup;
+  },
+
+  /**
+   * @override
+   */
+  render: function (timelineModel, ecModel, api, payload) {
+    this.model = timelineModel;
+    this.api = api;
+    this.ecModel = ecModel;
+    this.group.removeAll();
+
+    if (timelineModel.get('show', true)) {
+      var layoutInfo = this._layout(timelineModel, api);
+
+      var mainGroup = this._createGroup('mainGroup');
+
+      var labelGroup = this._createGroup('labelGroup');
+      /**
+       * @private
+       * @type {module:echarts/component/timeline/TimelineAxis}
+       */
+
+
+      var axis = this._axis = this._createAxis(layoutInfo, timelineModel);
+
+      timelineModel.formatTooltip = function (dataIndex) {
+        return encodeHTML(axis.scale.getLabel(dataIndex));
+      };
+
+      each$19(['AxisLine', 'AxisTick', 'Control', 'CurrentPointer'], function (name) {
+        this['_render' + name](layoutInfo, mainGroup, axis, timelineModel);
+      }, this);
+
+      this._renderAxisLabel(layoutInfo, labelGroup, axis, timelineModel);
+
+      this._position(layoutInfo, timelineModel);
+    }
+
+    this._doPlayStop();
+  },
+
+  /**
+   * @override
+   */
+  remove: function () {
+    this._clearTimer();
+
+    this.group.removeAll();
+  },
+
+  /**
+   * @override
+   */
+  dispose: function () {
+    this._clearTimer();
+  },
+  _layout: function (timelineModel, api) {
+    var labelPosOpt = timelineModel.get('label.position');
+    var orient = timelineModel.get('orient');
+    var viewRect = getViewRect$4(timelineModel, api); // Auto label offset.
+
+    if (labelPosOpt == null || labelPosOpt === 'auto') {
+      labelPosOpt = orient === 'horizontal' ? viewRect.y + viewRect.height / 2 < api.getHeight() / 2 ? '-' : '+' : viewRect.x + viewRect.width / 2 < api.getWidth() / 2 ? '+' : '-';
+    } else if (isNaN(labelPosOpt)) {
+      labelPosOpt = {
+        horizontal: {
+          top: '-',
+          bottom: '+'
+        },
+        vertical: {
+          left: '-',
+          right: '+'
+        }
+      }[orient][labelPosOpt];
+    }
+
+    var labelAlignMap = {
+      horizontal: 'center',
+      vertical: labelPosOpt >= 0 || labelPosOpt === '+' ? 'left' : 'right'
+    };
+    var labelBaselineMap = {
+      horizontal: labelPosOpt >= 0 || labelPosOpt === '+' ? 'top' : 'bottom',
+      vertical: 'middle'
+    };
+    var rotationMap = {
+      horizontal: 0,
+      vertical: PI$4 / 2
+    }; // Position
+
+    var mainLength = orient === 'vertical' ? viewRect.height : viewRect.width;
+    var controlModel = timelineModel.getModel('controlStyle');
+    var showControl = controlModel.get('show', true);
+    var controlSize = showControl ? controlModel.get('itemSize') : 0;
+    var controlGap = showControl ? controlModel.get('itemGap') : 0;
+    var sizePlusGap = controlSize + controlGap; // Special label rotate.
+
+    var labelRotation = timelineModel.get('label.rotate') || 0;
+    labelRotation = labelRotation * PI$4 / 180; // To radian.
+
+    var playPosition;
+    var prevBtnPosition;
+    var nextBtnPosition;
+    var axisExtent;
+    var controlPosition = controlModel.get('position', true);
+    var showPlayBtn = showControl && controlModel.get('showPlayBtn', true);
+    var showPrevBtn = showControl && controlModel.get('showPrevBtn', true);
+    var showNextBtn = showControl && controlModel.get('showNextBtn', true);
+    var xLeft = 0;
+    var xRight = mainLength; // position[0] means left, position[1] means middle.
+
+    if (controlPosition === 'left' || controlPosition === 'bottom') {
+      showPlayBtn && (playPosition = [0, 0], xLeft += sizePlusGap);
+      showPrevBtn && (prevBtnPosition = [xLeft, 0], xLeft += sizePlusGap);
+      showNextBtn && (nextBtnPosition = [xRight - controlSize, 0], xRight -= sizePlusGap);
+    } else {
+      // 'top' 'right'
+      showPlayBtn && (playPosition = [xRight - controlSize, 0], xRight -= sizePlusGap);
+      showPrevBtn && (prevBtnPosition = [0, 0], xLeft += sizePlusGap);
+      showNextBtn && (nextBtnPosition = [xRight - controlSize, 0], xRight -= sizePlusGap);
+    }
+
+    axisExtent = [xLeft, xRight];
+
+    if (timelineModel.get('inverse')) {
+      axisExtent.reverse();
+    }
+
+    return {
+      viewRect: viewRect,
+      mainLength: mainLength,
+      orient: orient,
+      rotation: rotationMap[orient],
+      labelRotation: labelRotation,
+      labelPosOpt: labelPosOpt,
+      labelAlign: timelineModel.get('label.align') || labelAlignMap[orient],
+      labelBaseline: timelineModel.get('label.verticalAlign') || timelineModel.get('label.baseline') || labelBaselineMap[orient],
+      // Based on mainGroup.
+      playPosition: playPosition,
+      prevBtnPosition: prevBtnPosition,
+      nextBtnPosition: nextBtnPosition,
+      axisExtent: axisExtent,
+      controlSize: controlSize,
+      controlGap: controlGap
+    };
+  },
+  _position: function (layoutInfo, timelineModel) {
+    // Position is be called finally, because bounding rect is needed for
+    // adapt content to fill viewRect (auto adapt offset).
+    // Timeline may be not all in the viewRect when 'offset' is specified
+    // as a number, because it is more appropriate that label aligns at
+    // 'offset' but not the other edge defined by viewRect.
+    var mainGroup = this._mainGroup;
+    var labelGroup = this._labelGroup;
+    var viewRect = layoutInfo.viewRect;
+
+    if (layoutInfo.orient === 'vertical') {
+      // transform to horizontal, inverse rotate by left-top point.
+      var m = create$1();
+      var rotateOriginX = viewRect.x;
+      var rotateOriginY = viewRect.y + viewRect.height;
+      translate(m, m, [-rotateOriginX, -rotateOriginY]);
+      rotate(m, m, -PI$4 / 2);
+      translate(m, m, [rotateOriginX, rotateOriginY]);
+      viewRect = viewRect.clone();
+      viewRect.applyTransform(m);
+    }
+
+    var viewBound = getBound(viewRect);
+    var mainBound = getBound(mainGroup.getBoundingRect());
+    var labelBound = getBound(labelGroup.getBoundingRect());
+    var mainPosition = mainGroup.position;
+    var labelsPosition = labelGroup.position;
+    labelsPosition[0] = mainPosition[0] = viewBound[0][0];
+    var labelPosOpt = layoutInfo.labelPosOpt;
+
+    if (isNaN(labelPosOpt)) {
+      // '+' or '-'
+      var mainBoundIdx = labelPosOpt === '+' ? 0 : 1;
+      toBound(mainPosition, mainBound, viewBound, 1, mainBoundIdx);
+      toBound(labelsPosition, labelBound, viewBound, 1, 1 - mainBoundIdx);
+    } else {
+      var mainBoundIdx = labelPosOpt >= 0 ? 0 : 1;
+      toBound(mainPosition, mainBound, viewBound, 1, mainBoundIdx);
+      labelsPosition[1] = mainPosition[1] + labelPosOpt;
+    }
+
+    mainGroup.attr('position', mainPosition);
+    labelGroup.attr('position', labelsPosition);
+    mainGroup.rotation = labelGroup.rotation = layoutInfo.rotation;
+    setOrigin(mainGroup);
+    setOrigin(labelGroup);
+
+    function setOrigin(targetGroup) {
+      var pos = targetGroup.position;
+      targetGroup.origin = [viewBound[0][0] - pos[0], viewBound[1][0] - pos[1]];
+    }
+
+    function getBound(rect) {
+      // [[xmin, xmax], [ymin, ymax]]
+      return [[rect.x, rect.x + rect.width], [rect.y, rect.y + rect.height]];
+    }
+
+    function toBound(fromPos, from, to, dimIdx, boundIdx) {
+      fromPos[dimIdx] += to[dimIdx][boundIdx] - from[dimIdx][boundIdx];
+    }
+  },
+  _createAxis: function (layoutInfo, timelineModel) {
+    var data = timelineModel.getData();
+    var axisType = timelineModel.get('axisType');
+    var scale = createScaleByModel(timelineModel, axisType); // Customize scale. The `tickValue` is `dataIndex`.
+
+    scale.getTicks = function () {
+      return data.mapArray(['value'], function (value) {
+        return value;
+      });
+    };
+
+    var dataExtent = data.getDataExtent('value');
+    scale.setExtent(dataExtent[0], dataExtent[1]);
+    scale.niceTicks();
+    var axis = new TimelineAxis('value', scale, layoutInfo.axisExtent, axisType);
+    axis.model = timelineModel;
+    return axis;
+  },
+  _createGroup: function (name) {
+    var newGroup = this['_' + name] = new Group();
+    this.group.add(newGroup);
+    return newGroup;
+  },
+  _renderAxisLine: function (layoutInfo, group, axis, timelineModel) {
+    var axisExtent = axis.getExtent();
+
+    if (!timelineModel.get('lineStyle.show')) {
+      return;
+    }
+
+    group.add(new Line({
+      shape: {
+        x1: axisExtent[0],
+        y1: 0,
+        x2: axisExtent[1],
+        y2: 0
+      },
+      style: extend({
+        lineCap: 'round'
+      }, timelineModel.getModel('lineStyle').getLineStyle()),
+      silent: true,
+      z2: 1
+    }));
+  },
+
+  /**
+   * @private
+   */
+  _renderAxisTick: function (layoutInfo, group, axis, timelineModel) {
+    var data = timelineModel.getData(); // Show all ticks, despite ignoring strategy.
+
+    var ticks = axis.scale.getTicks(); // The value is dataIndex, see the costomized scale.
+
+    each$19(ticks, function (value) {
+      var tickCoord = axis.dataToCoord(value);
+      var itemModel = data.getItemModel(value);
+      var itemStyleModel = itemModel.getModel('itemStyle');
+      var hoverStyleModel = itemModel.getModel('emphasis.itemStyle');
+      var symbolOpt = {
+        position: [tickCoord, 0],
+        onclick: bind$4(this._changeTimeline, this, value)
+      };
+      var el = giveSymbol(itemModel, itemStyleModel, group, symbolOpt);
+      setHoverStyle(el, hoverStyleModel.getItemStyle());
+
+      if (itemModel.get('tooltip')) {
+        el.dataIndex = value;
+        el.dataModel = timelineModel;
+      } else {
+        el.dataIndex = el.dataModel = null;
+      }
+    }, this);
+  },
+
+  /**
+   * @private
+   */
+  _renderAxisLabel: function (layoutInfo, group, axis, timelineModel) {
+    var labelModel = axis.getLabelModel();
+
+    if (!labelModel.get('show')) {
+      return;
+    }
+
+    var data = timelineModel.getData();
+    var labels = axis.getViewLabels();
+    each$19(labels, function (labelItem) {
+      // The tickValue is dataIndex, see the costomized scale.
+      var dataIndex = labelItem.tickValue;
+      var itemModel = data.getItemModel(dataIndex);
+      var normalLabelModel = itemModel.getModel('label');
+      var hoverLabelModel = itemModel.getModel('emphasis.label');
+      var tickCoord = axis.dataToCoord(labelItem.tickValue);
+      var textEl = new Text({
+        position: [tickCoord, 0],
+        rotation: layoutInfo.labelRotation - layoutInfo.rotation,
+        onclick: bind$4(this._changeTimeline, this, dataIndex),
+        silent: false
+      });
+      setTextStyle(textEl.style, normalLabelModel, {
+        text: labelItem.formattedLabel,
+        textAlign: layoutInfo.labelAlign,
+        textVerticalAlign: layoutInfo.labelBaseline
+      });
+      group.add(textEl);
+      setHoverStyle(textEl, setTextStyle({}, hoverLabelModel));
+    }, this);
+  },
+
+  /**
+   * @private
+   */
+  _renderControl: function (layoutInfo, group, axis, timelineModel) {
+    var controlSize = layoutInfo.controlSize;
+    var rotation = layoutInfo.rotation;
+    var itemStyle = timelineModel.getModel('controlStyle').getItemStyle();
+    var hoverStyle = timelineModel.getModel('emphasis.controlStyle').getItemStyle();
+    var rect = [0, -controlSize / 2, controlSize, controlSize];
+    var playState = timelineModel.getPlayState();
+    var inverse = timelineModel.get('inverse', true);
+    makeBtn(layoutInfo.nextBtnPosition, 'controlStyle.nextIcon', bind$4(this._changeTimeline, this, inverse ? '-' : '+'));
+    makeBtn(layoutInfo.prevBtnPosition, 'controlStyle.prevIcon', bind$4(this._changeTimeline, this, inverse ? '+' : '-'));
+    makeBtn(layoutInfo.playPosition, 'controlStyle.' + (playState ? 'stopIcon' : 'playIcon'), bind$4(this._handlePlayClick, this, !playState), true);
+
+    function makeBtn(position, iconPath, onclick, willRotate) {
+      if (!position) {
+        return;
+      }
+
+      var opt = {
+        position: position,
+        origin: [controlSize / 2, 0],
+        rotation: willRotate ? -rotation : 0,
+        rectHover: true,
+        style: itemStyle,
+        onclick: onclick
+      };
+      var btn = makeIcon(timelineModel, iconPath, rect, opt);
+      group.add(btn);
+      setHoverStyle(btn, hoverStyle);
+    }
+  },
+  _renderCurrentPointer: function (layoutInfo, group, axis, timelineModel) {
+    var data = timelineModel.getData();
+    var currentIndex = timelineModel.getCurrentIndex();
+    var pointerModel = data.getItemModel(currentIndex).getModel('checkpointStyle');
+    var me = this;
+    var callback = {
+      onCreate: function (pointer) {
+        pointer.draggable = true;
+        pointer.drift = bind$4(me._handlePointerDrag, me);
+        pointer.ondragend = bind$4(me._handlePointerDragend, me);
+        pointerMoveTo(pointer, currentIndex, axis, timelineModel, true);
+      },
+      onUpdate: function (pointer) {
+        pointerMoveTo(pointer, currentIndex, axis, timelineModel);
+      }
+    }; // Reuse when exists, for animation and drag.
+
+    this._currentPointer = giveSymbol(pointerModel, pointerModel, this._mainGroup, {}, this._currentPointer, callback);
+  },
+  _handlePlayClick: function (nextState) {
+    this._clearTimer();
+
+    this.api.dispatchAction({
+      type: 'timelinePlayChange',
+      playState: nextState,
+      from: this.uid
+    });
+  },
+  _handlePointerDrag: function (dx, dy, e) {
+    this._clearTimer();
+
+    this._pointerChangeTimeline([e.offsetX, e.offsetY]);
+  },
+  _handlePointerDragend: function (e) {
+    this._pointerChangeTimeline([e.offsetX, e.offsetY], true);
+  },
+  _pointerChangeTimeline: function (mousePos, trigger) {
+    var toCoord = this._toAxisCoord(mousePos)[0];
+
+    var axis = this._axis;
+    var axisExtent = asc(axis.getExtent().slice());
+    toCoord > axisExtent[1] && (toCoord = axisExtent[1]);
+    toCoord < axisExtent[0] && (toCoord = axisExtent[0]);
+    this._currentPointer.position[0] = toCoord;
+
+    this._currentPointer.dirty();
+
+    var targetDataIndex = this._findNearestTick(toCoord);
+
+    var timelineModel = this.model;
+
+    if (trigger || targetDataIndex !== timelineModel.getCurrentIndex() && timelineModel.get('realtime')) {
+      this._changeTimeline(targetDataIndex);
+    }
+  },
+  _doPlayStop: function () {
+    this._clearTimer();
+
+    if (this.model.getPlayState()) {
+      this._timer = setTimeout(bind$4(handleFrame, this), this.model.get('playInterval'));
+    }
+
+    function handleFrame() {
+      // Do not cache
+      var timelineModel = this.model;
+
+      this._changeTimeline(timelineModel.getCurrentIndex() + (timelineModel.get('rewind', true) ? -1 : 1));
+    }
+  },
+  _toAxisCoord: function (vertex) {
+    var trans = this._mainGroup.getLocalTransform();
+
+    return applyTransform$1(vertex, trans, true);
+  },
+  _findNearestTick: function (axisCoord) {
+    var data = this.model.getData();
+    var dist = Infinity;
+    var targetDataIndex;
+    var axis = this._axis;
+    data.each(['value'], function (value, dataIndex) {
+      var coord = axis.dataToCoord(value);
+      var d = Math.abs(coord - axisCoord);
+
+      if (d < dist) {
+        dist = d;
+        targetDataIndex = dataIndex;
+      }
+    });
+    return targetDataIndex;
+  },
+  _clearTimer: function () {
+    if (this._timer) {
+      clearTimeout(this._timer);
+      this._timer = null;
+    }
+  },
+  _changeTimeline: function (nextIndex) {
+    var currentIndex = this.model.getCurrentIndex();
+
+    if (nextIndex === '+') {
+      nextIndex = currentIndex + 1;
+    } else if (nextIndex === '-') {
+      nextIndex = currentIndex - 1;
+    }
+
+    this.api.dispatchAction({
+      type: 'timelineChange',
+      currentIndex: nextIndex,
+      from: this.uid
+    });
+  }
+});
+
+function getViewRect$4(model, api) {
+  return getLayoutRect(model.getBoxLayoutParams(), {
+    width: api.getWidth(),
+    height: api.getHeight()
+  }, model.get('padding'));
+}
+
+function makeIcon(timelineModel, objPath, rect, opts) {
+  var icon = makePath(timelineModel.get(objPath).replace(/^path:\/\//, ''), clone(opts || {}), new BoundingRect(rect[0], rect[1], rect[2], rect[3]), 'center');
+  return icon;
+}
+/**
+ * Create symbol or update symbol
+ * opt: basic position and event handlers
+ */
+
+
+function giveSymbol(hostModel, itemStyleModel, group, opt, symbol, callback) {
+  var color = itemStyleModel.get('color');
+
+  if (!symbol) {
+    var symbolType = hostModel.get('symbol');
+    symbol = createSymbol(symbolType, -1, -1, 2, 2, color);
+    symbol.setStyle('strokeNoScale', true);
+    group.add(symbol);
+    callback && callback.onCreate(symbol);
+  } else {
+    symbol.setColor(color);
+    group.add(symbol); // Group may be new, also need to add.
+
+    callback && callback.onUpdate(symbol);
+  } // Style
+
+
+  var itemStyle = itemStyleModel.getItemStyle(['color', 'symbol', 'symbolSize']);
+  symbol.setStyle(itemStyle); // Transform and events.
+
+  opt = merge({
+    rectHover: true,
+    z2: 100
+  }, opt, true);
+  var symbolSize = hostModel.get('symbolSize');
+  symbolSize = symbolSize instanceof Array ? symbolSize.slice() : [+symbolSize, +symbolSize];
+  symbolSize[0] /= 2;
+  symbolSize[1] /= 2;
+  opt.scale = symbolSize;
+  var symbolOffset = hostModel.get('symbolOffset');
+
+  if (symbolOffset) {
+    var pos = opt.position = opt.position || [0, 0];
+    pos[0] += parsePercent$1(symbolOffset[0], symbolSize[0]);
+    pos[1] += parsePercent$1(symbolOffset[1], symbolSize[1]);
+  }
+
+  var symbolRotate = hostModel.get('symbolRotate');
+  opt.rotation = (symbolRotate || 0) * Math.PI / 180 || 0;
+  symbol.attr(opt); // FIXME
+  // (1) When symbol.style.strokeNoScale is true and updateTransform is not performed,
+  // getBoundingRect will return wrong result.
+  // (This is supposed to be resolved in zrender, but it is a little difficult to
+  // leverage performance and auto updateTransform)
+  // (2) All of ancesters of symbol do not scale, so we can just updateTransform symbol.
+
+  symbol.updateTransform();
+  return symbol;
+}
+
+function pointerMoveTo(pointer, dataIndex, axis, timelineModel, noAnimation) {
+  if (pointer.dragging) {
+    return;
+  }
+
+  var pointerModel = timelineModel.getModel('checkpointStyle');
+  var toCoord = axis.dataToCoord(timelineModel.getData().get(['value'], dataIndex));
+
+  if (noAnimation || !pointerModel.get('animation', true)) {
+    pointer.attr({
+      position: [toCoord, 0]
+    });
+  } else {
+    pointer.stopAnimation(true);
+    pointer.animateTo({
+      position: [toCoord, 0]
+    }, pointerModel.get('animationDuration', true), pointerModel.get('animationEasing', true));
+  }
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * DataZoom component entry
+ */
+registerPreprocessor(preprocessor$1);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+ComponentModel.registerSubTypeDefaulter('dataZoom', function () {
+  // Default 'slider' when no type specified.
+  return 'slider';
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var AXIS_DIMS = ['x', 'y', 'z', 'radius', 'angle', 'single']; // Supported coords.
+
+var COORDS = ['cartesian2d', 'polar', 'singleAxis'];
+/**
+ * @param {string} coordType
+ * @return {boolean}
+ */
+
+function isCoordSupported(coordType) {
+  return indexOf(COORDS, coordType) >= 0;
+}
+/**
+ * Create "each" method to iterate names.
+ *
+ * @pubilc
+ * @param  {Array.<string>} names
+ * @param  {Array.<string>=} attrs
+ * @return {Function}
+ */
+
+function createNameEach(names, attrs) {
+  names = names.slice();
+  var capitalNames = map(names, capitalFirst);
+  attrs = (attrs || []).slice();
+  var capitalAttrs = map(attrs, capitalFirst);
+  return function (callback, context) {
+    each$1(names, function (name, index) {
+      var nameObj = {
+        name: name,
+        capital: capitalNames[index]
+      };
+
+      for (var j = 0; j < attrs.length; j++) {
+        nameObj[attrs[j]] = name + capitalAttrs[j];
+      }
+
+      callback.call(context, nameObj);
+    });
+  };
+}
+/**
+ * Iterate each dimension name.
+ *
+ * @public
+ * @param {Function} callback The parameter is like:
+ *                            {
+ *                                name: 'angle',
+ *                                capital: 'Angle',
+ *                                axis: 'angleAxis',
+ *                                axisIndex: 'angleAixs',
+ *                                index: 'angleIndex'
+ *                            }
+ * @param {Object} context
+ */
+
+var eachAxisDim$1 = createNameEach(AXIS_DIMS, ['axisIndex', 'axis', 'index', 'id']);
+/**
+ * If tow dataZoomModels has the same axis controlled, we say that they are 'linked'.
+ * dataZoomModels and 'links' make up one or more graphics.
+ * This function finds the graphic where the source dataZoomModel is in.
+ *
+ * @public
+ * @param {Function} forEachNode Node iterator.
+ * @param {Function} forEachEdgeType edgeType iterator
+ * @param {Function} edgeIdGetter Giving node and edgeType, return an array of edge id.
+ * @return {Function} Input: sourceNode, Output: Like {nodes: [], dims: {}}
+ */
+
+function createLinkedNodesFinder(forEachNode, forEachEdgeType, edgeIdGetter) {
+  return function (sourceNode) {
+    var result = {
+      nodes: [],
+      records: {} // key: edgeType.name, value: Object (key: edge id, value: boolean).
+
+    };
+    forEachEdgeType(function (edgeType) {
+      result.records[edgeType.name] = {};
+    });
+
+    if (!sourceNode) {
+      return result;
+    }
+
+    absorb(sourceNode, result);
+    var existsLink;
+
+    do {
+      existsLink = false;
+      forEachNode(processSingleNode);
+    } while (existsLink);
+
+    function processSingleNode(node) {
+      if (!isNodeAbsorded(node, result) && isLinked(node, result)) {
+        absorb(node, result);
+        existsLink = true;
+      }
+    }
+
+    return result;
+  };
+
+  function isNodeAbsorded(node, result) {
+    return indexOf(result.nodes, node) >= 0;
+  }
+
+  function isLinked(node, result) {
+    var hasLink = false;
+    forEachEdgeType(function (edgeType) {
+      each$1(edgeIdGetter(node, edgeType) || [], function (edgeId) {
+        result.records[edgeType.name][edgeId] && (hasLink = true);
+      });
+    });
+    return hasLink;
+  }
+
+  function absorb(node, result) {
+    result.nodes.push(node);
+    forEachEdgeType(function (edgeType) {
+      each$1(edgeIdGetter(node, edgeType) || [], function (edgeId) {
+        result.records[edgeType.name][edgeId] = true;
+      });
+    });
+  }
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var each$21 = each$1;
+var asc$1 = asc;
+/**
+ * Operate single axis.
+ * One axis can only operated by one axis operator.
+ * Different dataZoomModels may be defined to operate the same axis.
+ * (i.e. 'inside' data zoom and 'slider' data zoom components)
+ * So dataZoomModels share one axisProxy in that case.
+ *
+ * @class
+ */
+
+var AxisProxy = function (dimName, axisIndex, dataZoomModel, ecModel) {
+  /**
+   * @private
+   * @type {string}
+   */
+  this._dimName = dimName;
+  /**
+   * @private
+   */
+
+  this._axisIndex = axisIndex;
+  /**
+   * @private
+   * @type {Array.<number>}
+   */
+
+  this._valueWindow;
+  /**
+   * @private
+   * @type {Array.<number>}
+   */
+
+  this._percentWindow;
+  /**
+   * @private
+   * @type {Array.<number>}
+   */
+
+  this._dataExtent;
+  /**
+   * {minSpan, maxSpan, minValueSpan, maxValueSpan}
+   * @private
+   * @type {Object}
+   */
+
+  this._minMaxSpan;
+  /**
+   * @readOnly
+   * @type {module: echarts/model/Global}
+   */
+
+  this.ecModel = ecModel;
+  /**
+   * @private
+   * @type {module: echarts/component/dataZoom/DataZoomModel}
+   */
+
+  this._dataZoomModel = dataZoomModel; // /**
+  //  * @readOnly
+  //  * @private
+  //  */
+  // this.hasSeriesStacked;
+};
+
+AxisProxy.prototype = {
+  constructor: AxisProxy,
+
+  /**
+   * Whether the axisProxy is hosted by dataZoomModel.
+   *
+   * @public
+   * @param {module: echarts/component/dataZoom/DataZoomModel} dataZoomModel
+   * @return {boolean}
+   */
+  hostedBy: function (dataZoomModel) {
+    return this._dataZoomModel === dataZoomModel;
+  },
+
+  /**
+   * @return {Array.<number>} Value can only be NaN or finite value.
+   */
+  getDataValueWindow: function () {
+    return this._valueWindow.slice();
+  },
+
+  /**
+   * @return {Array.<number>}
+   */
+  getDataPercentWindow: function () {
+    return this._percentWindow.slice();
+  },
+
+  /**
+   * @public
+   * @param {number} axisIndex
+   * @return {Array} seriesModels
+   */
+  getTargetSeriesModels: function () {
+    var seriesModels = [];
+    var ecModel = this.ecModel;
+    ecModel.eachSeries(function (seriesModel) {
+      if (isCoordSupported(seriesModel.get('coordinateSystem'))) {
+        var dimName = this._dimName;
+        var axisModel = ecModel.queryComponents({
+          mainType: dimName + 'Axis',
+          index: seriesModel.get(dimName + 'AxisIndex'),
+          id: seriesModel.get(dimName + 'AxisId')
+        })[0];
+
+        if (this._axisIndex === (axisModel && axisModel.componentIndex)) {
+          seriesModels.push(seriesModel);
+        }
+      }
+    }, this);
+    return seriesModels;
+  },
+  getAxisModel: function () {
+    return this.ecModel.getComponent(this._dimName + 'Axis', this._axisIndex);
+  },
+  getOtherAxisModel: function () {
+    var axisDim = this._dimName;
+    var ecModel = this.ecModel;
+    var axisModel = this.getAxisModel();
+    var isCartesian = axisDim === 'x' || axisDim === 'y';
+    var otherAxisDim;
+    var coordSysIndexName;
+
+    if (isCartesian) {
+      coordSysIndexName = 'gridIndex';
+      otherAxisDim = axisDim === 'x' ? 'y' : 'x';
+    } else {
+      coordSysIndexName = 'polarIndex';
+      otherAxisDim = axisDim === 'angle' ? 'radius' : 'angle';
+    }
+
+    var foundOtherAxisModel;
+    ecModel.eachComponent(otherAxisDim + 'Axis', function (otherAxisModel) {
+      if ((otherAxisModel.get(coordSysIndexName) || 0) === (axisModel.get(coordSysIndexName) || 0)) {
+        foundOtherAxisModel = otherAxisModel;
+      }
+    });
+    return foundOtherAxisModel;
+  },
+  getMinMaxSpan: function () {
+    return clone(this._minMaxSpan);
+  },
+
+  /**
+   * Only calculate by given range and this._dataExtent, do not change anything.
+   *
+   * @param {Object} opt
+   * @param {number} [opt.start]
+   * @param {number} [opt.end]
+   * @param {number} [opt.startValue]
+   * @param {number} [opt.endValue]
+   */
+  calculateDataWindow: function (opt) {
+    var dataExtent = this._dataExtent;
+    var axisModel = this.getAxisModel();
+    var scale = axisModel.axis.scale;
+
+    var rangePropMode = this._dataZoomModel.getRangePropMode();
+
+    var percentExtent = [0, 100];
+    var percentWindow = [opt.start, opt.end];
+    var valueWindow = [];
+    each$21(['startValue', 'endValue'], function (prop) {
+      valueWindow.push(opt[prop] != null ? scale.parse(opt[prop]) : null);
+    }); // Normalize bound.
+
+    each$21([0, 1], function (idx) {
+      var boundValue = valueWindow[idx];
+      var boundPercent = percentWindow[idx]; // Notice: dataZoom is based either on `percentProp` ('start', 'end') or
+      // on `valueProp` ('startValue', 'endValue'). The former one is suitable
+      // for cases that a dataZoom component controls multiple axes with different
+      // unit or extent, and the latter one is suitable for accurate zoom by pixel
+      // (e.g., in dataZoomSelect). `valueProp` can be calculated from `percentProp`,
+      // but it is awkward that `percentProp` can not be obtained from `valueProp`
+      // accurately (because all of values that are overflow the `dataExtent` will
+      // be calculated to percent '100%'). So we have to use
+      // `dataZoom.getRangePropMode()` to mark which prop is used.
+      // `rangePropMode` is updated only when setOption or dispatchAction, otherwise
+      // it remains its original value.
+
+      if (rangePropMode[idx] === 'percent') {
+        if (boundPercent == null) {
+          boundPercent = percentExtent[idx];
+        } // Use scale.parse to math round for category or time axis.
+
+
+        boundValue = scale.parse(linearMap(boundPercent, percentExtent, dataExtent, true));
+      } else {
+        // Calculating `percent` from `value` may be not accurate, because
+        // This calculation can not be inversed, because all of values that
+        // are overflow the `dataExtent` will be calculated to percent '100%'
+        boundPercent = linearMap(boundValue, dataExtent, percentExtent, true);
+      } // valueWindow[idx] = round(boundValue);
+      // percentWindow[idx] = round(boundPercent);
+
+
+      valueWindow[idx] = boundValue;
+      percentWindow[idx] = boundPercent;
+    });
+    return {
+      valueWindow: asc$1(valueWindow),
+      percentWindow: asc$1(percentWindow)
+    };
+  },
+
+  /**
+   * Notice: reset should not be called before series.restoreData() called,
+   * so it is recommanded to be called in "process stage" but not "model init
+   * stage".
+   *
+   * @param {module: echarts/component/dataZoom/DataZoomModel} dataZoomModel
+   */
+  reset: function (dataZoomModel) {
+    if (dataZoomModel !== this._dataZoomModel) {
+      return;
+    }
+
+    var targetSeries = this.getTargetSeriesModels(); // Culculate data window and data extent, and record them.
+
+    this._dataExtent = calculateDataExtent(this, this._dimName, targetSeries); // this.hasSeriesStacked = false;
+    // each(targetSeries, function (series) {
+    // var data = series.getData();
+    // var dataDim = data.mapDimension(this._dimName);
+    // var stackedDimension = data.getCalculationInfo('stackedDimension');
+    // if (stackedDimension && stackedDimension === dataDim) {
+    // this.hasSeriesStacked = true;
+    // }
+    // }, this);
+
+    var dataWindow = this.calculateDataWindow(dataZoomModel.option);
+    this._valueWindow = dataWindow.valueWindow;
+    this._percentWindow = dataWindow.percentWindow;
+    setMinMaxSpan(this); // Update axis setting then.
+
+    setAxisModel(this);
+  },
+
+  /**
+   * @param {module: echarts/component/dataZoom/DataZoomModel} dataZoomModel
+   */
+  restore: function (dataZoomModel) {
+    if (dataZoomModel !== this._dataZoomModel) {
+      return;
+    }
+
+    this._valueWindow = this._percentWindow = null;
+    setAxisModel(this, true);
+  },
+
+  /**
+   * @param {module: echarts/component/dataZoom/DataZoomModel} dataZoomModel
+   */
+  filterData: function (dataZoomModel, api) {
+    if (dataZoomModel !== this._dataZoomModel) {
+      return;
+    }
+
+    var axisDim = this._dimName;
+    var seriesModels = this.getTargetSeriesModels();
+    var filterMode = dataZoomModel.get('filterMode');
+    var valueWindow = this._valueWindow;
+
+    if (filterMode === 'none') {
+      return;
+    } // FIXME
+    // Toolbox may has dataZoom injected. And if there are stacked bar chart
+    // with NaN data, NaN will be filtered and stack will be wrong.
+    // So we need to force the mode to be set empty.
+    // In fect, it is not a big deal that do not support filterMode-'filter'
+    // when using toolbox#dataZoom, utill tooltip#dataZoom support "single axis
+    // selection" some day, which might need "adapt to data extent on the
+    // otherAxis", which is disabled by filterMode-'empty'.
+    // But currently, stack has been fixed to based on value but not index,
+    // so this is not an issue any more.
+    // var otherAxisModel = this.getOtherAxisModel();
+    // if (dataZoomModel.get('$fromToolbox')
+    //     && otherAxisModel
+    //     && otherAxisModel.hasSeriesStacked
+    // ) {
+    //     filterMode = 'empty';
+    // }
+    // TODO
+    // filterMode 'weakFilter' and 'empty' is not optimized for huge data yet.
+
+
+    each$21(seriesModels, function (seriesModel) {
+      var seriesData = seriesModel.getData();
+      var dataDims = seriesData.mapDimension(axisDim, true);
+
+      if (!dataDims.length) {
+        return;
+      }
+
+      if (filterMode === 'weakFilter') {
+        seriesData.filterSelf(function (dataIndex) {
+          var leftOut;
+          var rightOut;
+          var hasValue;
+
+          for (var i = 0; i < dataDims.length; i++) {
+            var value = seriesData.get(dataDims[i], dataIndex);
+            var thisHasValue = !isNaN(value);
+            var thisLeftOut = value < valueWindow[0];
+            var thisRightOut = value > valueWindow[1];
+
+            if (thisHasValue && !thisLeftOut && !thisRightOut) {
+              return true;
+            }
+
+            thisHasValue && (hasValue = true);
+            thisLeftOut && (leftOut = true);
+            thisRightOut && (rightOut = true);
+          } // If both left out and right out, do not filter.
+
+
+          return hasValue && leftOut && rightOut;
+        });
+      } else {
+        each$21(dataDims, function (dim) {
+          if (filterMode === 'empty') {
+            seriesModel.setData(seriesData.map(dim, function (value) {
+              return !isInWindow(value) ? NaN : value;
+            }));
+          } else {
+            var range = {};
+            range[dim] = valueWindow; // console.time('select');
+
+            seriesData.selectRange(range); // console.timeEnd('select');
+          }
+        });
+      }
+
+      each$21(dataDims, function (dim) {
+        seriesData.setApproximateExtent(valueWindow, dim);
+      });
+    });
+
+    function isInWindow(value) {
+      return value >= valueWindow[0] && value <= valueWindow[1];
+    }
+  }
+};
+
+function calculateDataExtent(axisProxy, axisDim, seriesModels) {
+  var dataExtent = [Infinity, -Infinity];
+  each$21(seriesModels, function (seriesModel) {
+    var seriesData = seriesModel.getData();
+
+    if (seriesData) {
+      each$21(seriesData.mapDimension(axisDim, true), function (dim) {
+        var seriesExtent = seriesData.getApproximateExtent(dim);
+        seriesExtent[0] < dataExtent[0] && (dataExtent[0] = seriesExtent[0]);
+        seriesExtent[1] > dataExtent[1] && (dataExtent[1] = seriesExtent[1]);
+      });
+    }
+  });
+
+  if (dataExtent[1] < dataExtent[0]) {
+    dataExtent = [NaN, NaN];
+  } // It is important to get "consistent" extent when more then one axes is
+  // controlled by a `dataZoom`, otherwise those axes will not be synchronized
+  // when zooming. But it is difficult to know what is "consistent", considering
+  // axes have different type or even different meanings (For example, two
+  // time axes are used to compare data of the same date in different years).
+  // So basically dataZoom just obtains extent by series.data (in category axis
+  // extent can be obtained from axis.data).
+  // Nevertheless, user can set min/max/scale on axes to make extent of axes
+  // consistent.
+
+
+  fixExtentByAxis(axisProxy, dataExtent);
+  return dataExtent;
+}
+
+function fixExtentByAxis(axisProxy, dataExtent) {
+  var axisModel = axisProxy.getAxisModel();
+  var min = axisModel.getMin(true); // For category axis, if min/max/scale are not set, extent is determined
+  // by axis.data by default.
+
+  var isCategoryAxis = axisModel.get('type') === 'category';
+  var axisDataLen = isCategoryAxis && axisModel.getCategories().length;
+
+  if (min != null && min !== 'dataMin' && typeof min !== 'function') {
+    dataExtent[0] = min;
+  } else if (isCategoryAxis) {
+    dataExtent[0] = axisDataLen > 0 ? 0 : NaN;
+  }
+
+  var max = axisModel.getMax(true);
+
+  if (max != null && max !== 'dataMax' && typeof max !== 'function') {
+    dataExtent[1] = max;
+  } else if (isCategoryAxis) {
+    dataExtent[1] = axisDataLen > 0 ? axisDataLen - 1 : NaN;
+  }
+
+  if (!axisModel.get('scale', true)) {
+    dataExtent[0] > 0 && (dataExtent[0] = 0);
+    dataExtent[1] < 0 && (dataExtent[1] = 0);
+  } // For value axis, if min/max/scale are not set, we just use the extent obtained
+  // by series data, which may be a little different from the extent calculated by
+  // `axisHelper.getScaleExtent`. But the different just affects the experience a
+  // little when zooming. So it will not be fixed until some users require it strongly.
+
+
+  return dataExtent;
+}
+
+function setAxisModel(axisProxy, isRestore) {
+  var axisModel = axisProxy.getAxisModel();
+  var percentWindow = axisProxy._percentWindow;
+  var valueWindow = axisProxy._valueWindow;
+
+  if (!percentWindow) {
+    return;
+  } // [0, 500]: arbitrary value, guess axis extent.
+
+
+  var precision = getPixelPrecision(valueWindow, [0, 500]);
+  precision = Math.min(precision, 20); // isRestore or isFull
+
+  var useOrigin = isRestore || percentWindow[0] === 0 && percentWindow[1] === 100;
+  axisModel.setRange(useOrigin ? null : +valueWindow[0].toFixed(precision), useOrigin ? null : +valueWindow[1].toFixed(precision));
+}
+
+function setMinMaxSpan(axisProxy) {
+  var minMaxSpan = axisProxy._minMaxSpan = {};
+  var dataZoomModel = axisProxy._dataZoomModel;
+  each$21(['min', 'max'], function (minMax) {
+    minMaxSpan[minMax + 'Span'] = dataZoomModel.get(minMax + 'Span'); // minValueSpan and maxValueSpan has higher priority than minSpan and maxSpan
+
+    var valueSpan = dataZoomModel.get(minMax + 'ValueSpan');
+
+    if (valueSpan != null) {
+      minMaxSpan[minMax + 'ValueSpan'] = valueSpan;
+      valueSpan = axisProxy.getAxisModel().axis.scale.parse(valueSpan);
+
+      if (valueSpan != null) {
+        var dataExtent = axisProxy._dataExtent;
+        minMaxSpan[minMax + 'Span'] = linearMap(dataExtent[0] + valueSpan, dataExtent, [0, 100], true);
+      }
+    }
+  });
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var each$20 = each$1;
+var eachAxisDim = eachAxisDim$1;
+var DataZoomModel = extendComponentModel({
+  type: 'dataZoom',
+  dependencies: ['xAxis', 'yAxis', 'zAxis', 'radiusAxis', 'angleAxis', 'singleAxis', 'series'],
+
+  /**
+   * @protected
+   */
+  defaultOption: {
+    zlevel: 0,
+    z: 4,
+    // Higher than normal component (z: 2).
+    orient: null,
+    // Default auto by axisIndex. Possible value: 'horizontal', 'vertical'.
+    xAxisIndex: null,
+    // Default the first horizontal category axis.
+    yAxisIndex: null,
+    // Default the first vertical category axis.
+    filterMode: 'filter',
+    // Possible values: 'filter' or 'empty' or 'weakFilter'.
+    // 'filter': data items which are out of window will be removed. This option is
+    //          applicable when filtering outliers. For each data item, it will be
+    //          filtered if one of the relevant dimensions is out of the window.
+    // 'weakFilter': data items which are out of window will be removed. This option
+    //          is applicable when filtering outliers. For each data item, it will be
+    //          filtered only if all  of the relevant dimensions are out of the same
+    //          side of the window.
+    // 'empty': data items which are out of window will be set to empty.
+    //          This option is applicable when user should not neglect
+    //          that there are some data items out of window.
+    // 'none': Do not filter.
+    // Taking line chart as an example, line will be broken in
+    // the filtered points when filterModel is set to 'empty', but
+    // be connected when set to 'filter'.
+    throttle: null,
+    // Dispatch action by the fixed rate, avoid frequency.
+    // default 100. Do not throttle when use null/undefined.
+    // If animation === true and animationDurationUpdate > 0,
+    // default value is 100, otherwise 20.
+    start: 0,
+    // Start percent. 0 ~ 100
+    end: 100,
+    // End percent. 0 ~ 100
+    startValue: null,
+    // Start value. If startValue specified, start is ignored.
+    endValue: null,
+    // End value. If endValue specified, end is ignored.
+    minSpan: null,
+    // 0 ~ 100
+    maxSpan: null,
+    // 0 ~ 100
+    minValueSpan: null,
+    // The range of dataZoom can not be smaller than that.
+    maxValueSpan: null,
+    // The range of dataZoom can not be larger than that.
+    rangeMode: null // Array, can be 'value' or 'percent'.
+
+  },
+
+  /**
+   * @override
+   */
+  init: function (option, parentModel, ecModel) {
+    /**
+     * key like x_0, y_1
+     * @private
+     * @type {Object}
+     */
+    this._dataIntervalByAxis = {};
+    /**
+     * @private
+     */
+
+    this._dataInfo = {};
+    /**
+     * key like x_0, y_1
+     * @private
+     */
+
+    this._axisProxies = {};
+    /**
+     * @readOnly
+     */
+
+    this.textStyleModel;
+    /**
+     * @private
+     */
+
+    this._autoThrottle = true;
+    /**
+     * 'percent' or 'value'
+     * @private
+     */
+
+    this._rangePropMode = ['percent', 'percent'];
+    var rawOption = retrieveRaw(option);
+    this.mergeDefaultAndTheme(option, ecModel);
+    this.doInit(rawOption);
+  },
+
+  /**
+   * @override
+   */
+  mergeOption: function (newOption) {
+    var rawOption = retrieveRaw(newOption); //FIX #2591
+
+    merge(this.option, newOption, true);
+    this.doInit(rawOption);
+  },
+
+  /**
+   * @protected
+   */
+  doInit: function (rawOption) {
+    var thisOption = this.option; // Disable realtime view update if canvas is not supported.
+
+    if (!env$1.canvasSupported) {
+      thisOption.realtime = false;
+    }
+
+    this._setDefaultThrottle(rawOption);
+
+    updateRangeUse(this, rawOption);
+    each$20([['start', 'startValue'], ['end', 'endValue']], function (names, index) {
+      // start/end has higher priority over startValue/endValue if they
+      // both set, but we should make chart.setOption({endValue: 1000})
+      // effective, rather than chart.setOption({endValue: 1000, end: null}).
+      if (this._rangePropMode[index] === 'value') {
+        thisOption[names[0]] = null;
+      } // Otherwise do nothing and use the merge result.
+
+    }, this);
+    this.textStyleModel = this.getModel('textStyle');
+
+    this._resetTarget();
+
+    this._giveAxisProxies();
+  },
+
+  /**
+   * @private
+   */
+  _giveAxisProxies: function () {
+    var axisProxies = this._axisProxies;
+    this.eachTargetAxis(function (dimNames, axisIndex, dataZoomModel, ecModel) {
+      var axisModel = this.dependentModels[dimNames.axis][axisIndex]; // If exists, share axisProxy with other dataZoomModels.
+
+      var axisProxy = axisModel.__dzAxisProxy || ( // Use the first dataZoomModel as the main model of axisProxy.
+      axisModel.__dzAxisProxy = new AxisProxy(dimNames.name, axisIndex, this, ecModel)); // FIXME
+      // dispose __dzAxisProxy
+
+      axisProxies[dimNames.name + '_' + axisIndex] = axisProxy;
+    }, this);
+  },
+
+  /**
+   * @private
+   */
+  _resetTarget: function () {
+    var thisOption = this.option;
+
+    var autoMode = this._judgeAutoMode();
+
+    eachAxisDim(function (dimNames) {
+      var axisIndexName = dimNames.axisIndex;
+      thisOption[axisIndexName] = normalizeToArray(thisOption[axisIndexName]);
+    }, this);
+
+    if (autoMode === 'axisIndex') {
+      this._autoSetAxisIndex();
+    } else if (autoMode === 'orient') {
+      this._autoSetOrient();
+    }
+  },
+
+  /**
+   * @private
+   */
+  _judgeAutoMode: function () {
+    // Auto set only works for setOption at the first time.
+    // The following is user's reponsibility. So using merged
+    // option is OK.
+    var thisOption = this.option;
+    var hasIndexSpecified = false;
+    eachAxisDim(function (dimNames) {
+      // When user set axisIndex as a empty array, we think that user specify axisIndex
+      // but do not want use auto mode. Because empty array may be encountered when
+      // some error occured.
+      if (thisOption[dimNames.axisIndex] != null) {
+        hasIndexSpecified = true;
+      }
+    }, this);
+    var orient = thisOption.orient;
+
+    if (orient == null && hasIndexSpecified) {
+      return 'orient';
+    } else if (!hasIndexSpecified) {
+      if (orient == null) {
+        thisOption.orient = 'horizontal';
+      }
+
+      return 'axisIndex';
+    }
+  },
+
+  /**
+   * @private
+   */
+  _autoSetAxisIndex: function () {
+    var autoAxisIndex = true;
+    var orient = this.get('orient', true);
+    var thisOption = this.option;
+    var dependentModels = this.dependentModels;
+
+    if (autoAxisIndex) {
+      // Find axis that parallel to dataZoom as default.
+      var dimName = orient === 'vertical' ? 'y' : 'x';
+
+      if (dependentModels[dimName + 'Axis'].length) {
+        thisOption[dimName + 'AxisIndex'] = [0];
+        autoAxisIndex = false;
+      } else {
+        each$20(dependentModels.singleAxis, function (singleAxisModel) {
+          if (autoAxisIndex && singleAxisModel.get('orient', true) === orient) {
+            thisOption.singleAxisIndex = [singleAxisModel.componentIndex];
+            autoAxisIndex = false;
+          }
+        });
+      }
+    }
+
+    if (autoAxisIndex) {
+      // Find the first category axis as default. (consider polar)
+      eachAxisDim(function (dimNames) {
+        if (!autoAxisIndex) {
+          return;
+        }
+
+        var axisIndices = [];
+        var axisModels = this.dependentModels[dimNames.axis];
+
+        if (axisModels.length && !axisIndices.length) {
+          for (var i = 0, len = axisModels.length; i < len; i++) {
+            if (axisModels[i].get('type') === 'category') {
+              axisIndices.push(i);
+            }
+          }
+        }
+
+        thisOption[dimNames.axisIndex] = axisIndices;
+
+        if (axisIndices.length) {
+          autoAxisIndex = false;
+        }
+      }, this);
+    }
+
+    if (autoAxisIndex) {
+      // FIXME
+      // 杩欓噷鏄吋瀹筫c2鐨勫啓娉曪紙娌℃寚瀹歺AxisIndex鍜寉AxisIndex鏃舵妸scatter鍜屽弻鏁板�艰酱鎶樻煴绾冲叆dataZoom鎺у埗锛夛紝
+      // 浣嗘槸瀹為檯鏄惁闇�瑕丟rid.js#getScaleByOption鏉ュ垽鏂紙鑰冭檻time锛宭og绛塧xis type锛夛紵
+      // If both dataZoom.xAxisIndex and dataZoom.yAxisIndex is not specified,
+      // dataZoom component auto adopts series that reference to
+      // both xAxis and yAxis which type is 'value'.
+      this.ecModel.eachSeries(function (seriesModel) {
+        if (this._isSeriesHasAllAxesTypeOf(seriesModel, 'value')) {
+          eachAxisDim(function (dimNames) {
+            var axisIndices = thisOption[dimNames.axisIndex];
+            var axisIndex = seriesModel.get(dimNames.axisIndex);
+            var axisId = seriesModel.get(dimNames.axisId);
+            var axisModel = seriesModel.ecModel.queryComponents({
+              mainType: dimNames.axis,
+              index: axisIndex,
+              id: axisId
+            })[0];
+            axisIndex = axisModel.componentIndex;
+
+            if (indexOf(axisIndices, axisIndex) < 0) {
+              axisIndices.push(axisIndex);
+            }
+          });
+        }
+      }, this);
+    }
+  },
+
+  /**
+   * @private
+   */
+  _autoSetOrient: function () {
+    var dim; // Find the first axis
+
+    this.eachTargetAxis(function (dimNames) {
+      !dim && (dim = dimNames.name);
+    }, this);
+    this.option.orient = dim === 'y' ? 'vertical' : 'horizontal';
+  },
+
+  /**
+   * @private
+   */
+  _isSeriesHasAllAxesTypeOf: function (seriesModel, axisType) {
+    // FIXME
+    // 闇�瑕乻eries鐨剎AxisIndex鍜寉AxisIndex閮介鍏堣嚜鍔ㄨ缃笂銆�
+    // 渚嬪series.type === scatter鏃躲��
+    var is = true;
+    eachAxisDim(function (dimNames) {
+      var seriesAxisIndex = seriesModel.get(dimNames.axisIndex);
+      var axisModel = this.dependentModels[dimNames.axis][seriesAxisIndex];
+
+      if (!axisModel || axisModel.get('type') !== axisType) {
+        is = false;
+      }
+    }, this);
+    return is;
+  },
+
+  /**
+   * @private
+   */
+  _setDefaultThrottle: function (rawOption) {
+    // When first time user set throttle, auto throttle ends.
+    if (rawOption.hasOwnProperty('throttle')) {
+      this._autoThrottle = false;
+    }
+
+    if (this._autoThrottle) {
+      var globalOption = this.ecModel.option;
+      this.option.throttle = globalOption.animation && globalOption.animationDurationUpdate > 0 ? 100 : 20;
+    }
+  },
+
+  /**
+   * @public
+   */
+  getFirstTargetAxisModel: function () {
+    var firstAxisModel;
+    eachAxisDim(function (dimNames) {
+      if (firstAxisModel == null) {
+        var indices = this.get(dimNames.axisIndex);
+
+        if (indices.length) {
+          firstAxisModel = this.dependentModels[dimNames.axis][indices[0]];
+        }
+      }
+    }, this);
+    return firstAxisModel;
+  },
+
+  /**
+   * @public
+   * @param {Function} callback param: axisModel, dimNames, axisIndex, dataZoomModel, ecModel
+   */
+  eachTargetAxis: function (callback, context) {
+    var ecModel = this.ecModel;
+    eachAxisDim(function (dimNames) {
+      each$20(this.get(dimNames.axisIndex), function (axisIndex) {
+        callback.call(context, dimNames, axisIndex, this, ecModel);
+      }, this);
+    }, this);
+  },
+
+  /**
+   * @param {string} dimName
+   * @param {number} axisIndex
+   * @return {module:echarts/component/dataZoom/AxisProxy} If not found, return null/undefined.
+   */
+  getAxisProxy: function (dimName, axisIndex) {
+    return this._axisProxies[dimName + '_' + axisIndex];
+  },
+
+  /**
+   * @param {string} dimName
+   * @param {number} axisIndex
+   * @return {module:echarts/model/Model} If not found, return null/undefined.
+   */
+  getAxisModel: function (dimName, axisIndex) {
+    var axisProxy = this.getAxisProxy(dimName, axisIndex);
+    return axisProxy && axisProxy.getAxisModel();
+  },
+
+  /**
+   * If not specified, set to undefined.
+   *
+   * @public
+   * @param {Object} opt
+   * @param {number} [opt.start]
+   * @param {number} [opt.end]
+   * @param {number} [opt.startValue]
+   * @param {number} [opt.endValue]
+   * @param {boolean} [ignoreUpdateRangeUsg=false]
+   */
+  setRawRange: function (opt, ignoreUpdateRangeUsg) {
+    var option = this.option;
+    each$20([['start', 'startValue'], ['end', 'endValue']], function (names) {
+      // If only one of 'start' and 'startValue' is not null/undefined, the other
+      // should be cleared, which enable clear the option.
+      // If both of them are not set, keep option with the original value, which
+      // enable use only set start but not set end when calling `dispatchAction`.
+      // The same as 'end' and 'endValue'.
+      if (opt[names[0]] != null || opt[names[1]] != null) {
+        option[names[0]] = opt[names[0]];
+        option[names[1]] = opt[names[1]];
+      }
+    }, this);
+    !ignoreUpdateRangeUsg && updateRangeUse(this, opt);
+  },
+
+  /**
+   * @public
+   * @return {Array.<number>} [startPercent, endPercent]
+   */
+  getPercentRange: function () {
+    var axisProxy = this.findRepresentativeAxisProxy();
+
+    if (axisProxy) {
+      return axisProxy.getDataPercentWindow();
+    }
+  },
+
+  /**
+   * @public
+   * For example, chart.getModel().getComponent('dataZoom').getValueRange('y', 0);
+   *
+   * @param {string} [axisDimName]
+   * @param {number} [axisIndex]
+   * @return {Array.<number>} [startValue, endValue] value can only be '-' or finite number.
+   */
+  getValueRange: function (axisDimName, axisIndex) {
+    if (axisDimName == null && axisIndex == null) {
+      var axisProxy = this.findRepresentativeAxisProxy();
+
+      if (axisProxy) {
+        return axisProxy.getDataValueWindow();
+      }
+    } else {
+      return this.getAxisProxy(axisDimName, axisIndex).getDataValueWindow();
+    }
+  },
+
+  /**
+   * @public
+   * @param {module:echarts/model/Model} [axisModel] If axisModel given, find axisProxy
+   *      corresponding to the axisModel
+   * @return {module:echarts/component/dataZoom/AxisProxy}
+   */
+  findRepresentativeAxisProxy: function (axisModel) {
+    if (axisModel) {
+      return axisModel.__dzAxisProxy;
+    } // Find the first hosted axisProxy
+
+
+    var axisProxies = this._axisProxies;
+
+    for (var key in axisProxies) {
+      if (axisProxies.hasOwnProperty(key) && axisProxies[key].hostedBy(this)) {
+        return axisProxies[key];
+      }
+    } // If no hosted axis find not hosted axisProxy.
+    // Consider this case: dataZoomModel1 and dataZoomModel2 control the same axis,
+    // and the option.start or option.end settings are different. The percentRange
+    // should follow axisProxy.
+    // (We encounter this problem in toolbox data zoom.)
+
+
+    for (var key in axisProxies) {
+      if (axisProxies.hasOwnProperty(key) && !axisProxies[key].hostedBy(this)) {
+        return axisProxies[key];
+      }
+    }
+  },
+
+  /**
+   * @return {Array.<string>}
+   */
+  getRangePropMode: function () {
+    return this._rangePropMode.slice();
+  }
+});
+
+function retrieveRaw(option) {
+  var ret = {};
+  each$20(['start', 'end', 'startValue', 'endValue', 'throttle'], function (name) {
+    option.hasOwnProperty(name) && (ret[name] = option[name]);
+  });
+  return ret;
+}
+
+function updateRangeUse(dataZoomModel, rawOption) {
+  var rangePropMode = dataZoomModel._rangePropMode;
+  var rangeModeInOption = dataZoomModel.get('rangeMode');
+  each$20([['start', 'startValue'], ['end', 'endValue']], function (names, index) {
+    var percentSpecified = rawOption[names[0]] != null;
+    var valueSpecified = rawOption[names[1]] != null;
+
+    if (percentSpecified && !valueSpecified) {
+      rangePropMode[index] = 'percent';
+    } else if (!percentSpecified && valueSpecified) {
+      rangePropMode[index] = 'value';
+    } else if (rangeModeInOption) {
+      rangePropMode[index] = rangeModeInOption[index];
+    } else if (percentSpecified) {
+      // percentSpecified && valueSpecified
+      rangePropMode[index] = 'percent';
+    } // else remain its original setting.
+
+  });
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var DataZoomView = Component$1.extend({
+  type: 'dataZoom',
+  render: function (dataZoomModel, ecModel, api, payload) {
+    this.dataZoomModel = dataZoomModel;
+    this.ecModel = ecModel;
+    this.api = api;
+  },
+
+  /**
+   * Find the first target coordinate system.
+   *
+   * @protected
+   * @return {Object} {
+   *                   grid: [
+   *                       {model: coord0, axisModels: [axis1, axis3], coordIndex: 1},
+   *                       {model: coord1, axisModels: [axis0, axis2], coordIndex: 0},
+   *                       ...
+   *                   ],  // cartesians must not be null/undefined.
+   *                   polar: [
+   *                       {model: coord0, axisModels: [axis4], coordIndex: 0},
+   *                       ...
+   *                   ],  // polars must not be null/undefined.
+   *                   singleAxis: [
+   *                       {model: coord0, axisModels: [], coordIndex: 0}
+   *                   ]
+   */
+  getTargetCoordInfo: function () {
+    var dataZoomModel = this.dataZoomModel;
+    var ecModel = this.ecModel;
+    var coordSysLists = {};
+    dataZoomModel.eachTargetAxis(function (dimNames, axisIndex) {
+      var axisModel = ecModel.getComponent(dimNames.axis, axisIndex);
+
+      if (axisModel) {
+        var coordModel = axisModel.getCoordSysModel();
+        coordModel && save(coordModel, axisModel, coordSysLists[coordModel.mainType] || (coordSysLists[coordModel.mainType] = []), coordModel.componentIndex);
+      }
+    }, this);
+
+    function save(coordModel, axisModel, store, coordIndex) {
+      var item;
+
+      for (var i = 0; i < store.length; i++) {
+        if (store[i].model === coordModel) {
+          item = store[i];
+          break;
+        }
+      }
+
+      if (!item) {
+        store.push(item = {
+          model: coordModel,
+          axisModels: [],
+          coordIndex: coordIndex
+        });
+      }
+
+      item.axisModels.push(axisModel);
+    }
+
+    return coordSysLists;
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var SliderZoomModel = DataZoomModel.extend({
+  type: 'dataZoom.slider',
+  layoutMode: 'box',
+
+  /**
+   * @protected
+   */
+  defaultOption: {
+    show: true,
+    // ph => placeholder. Using placehoder here because
+    // deault value can only be drived in view stage.
+    right: 'ph',
+    // Default align to grid rect.
+    top: 'ph',
+    // Default align to grid rect.
+    width: 'ph',
+    // Default align to grid rect.
+    height: 'ph',
+    // Default align to grid rect.
+    left: null,
+    // Default align to grid rect.
+    bottom: null,
+    // Default align to grid rect.
+    backgroundColor: 'rgba(47,69,84,0)',
+    // Background of slider zoom component.
+    // dataBackgroundColor: '#ddd',         // Background coor of data shadow and border of box,
+    // highest priority, remain for compatibility of
+    // previous version, but not recommended any more.
+    dataBackground: {
+      lineStyle: {
+        color: '#2f4554',
+        width: 0.5,
+        opacity: 0.3
+      },
+      areaStyle: {
+        color: 'rgba(47,69,84,0.3)',
+        opacity: 0.3
+      }
+    },
+    borderColor: '#ddd',
+    // border color of the box. For compatibility,
+    // if dataBackgroundColor is set, borderColor
+    // is ignored.
+    fillerColor: 'rgba(167,183,204,0.4)',
+    // Color of selected area.
+    // handleColor: 'rgba(89,170,216,0.95)',     // Color of handle.
+    // handleIcon: 'path://M4.9,17.8c0-1.4,4.5-10.5,5.5-12.4c0-0.1,0.6-1.1,0.9-1.1c0.4,0,0.9,1,0.9,1.1c1.1,2.2,5.4,11,5.4,12.4v17.8c0,1.5-0.6,2.1-1.3,2.1H6.1c-0.7,0-1.3-0.6-1.3-2.1V17.8z',
+
+    /* eslint-disable */
+    handleIcon: 'M8.2,13.6V3.9H6.3v9.7H3.1v14.9h3.3v9.7h1.8v-9.7h3.3V13.6H8.2z M9.7,24.4H4.8v-1.4h4.9V24.4z M9.7,19.1H4.8v-1.4h4.9V19.1z',
+
+    /* eslint-enable */
+    // Percent of the slider height
+    handleSize: '100%',
+    handleStyle: {
+      color: '#a7b7cc'
+    },
+    labelPrecision: null,
+    labelFormatter: null,
+    showDetail: true,
+    showDataShadow: 'auto',
+    // Default auto decision.
+    realtime: true,
+    zoomLock: false,
+    // Whether disable zoom.
+    textStyle: {
+      color: '#333'
+    }
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var Rect$2 = Rect;
+var linearMap$1 = linearMap;
+var asc$2 = asc;
+var bind$5 = bind;
+var each$22 = each$1; // Constants
+
+var DEFAULT_LOCATION_EDGE_GAP = 7;
+var DEFAULT_FRAME_BORDER_WIDTH = 1;
+var DEFAULT_FILLER_SIZE = 30;
+var HORIZONTAL = 'horizontal';
+var VERTICAL = 'vertical';
+var LABEL_GAP = 5;
+var SHOW_DATA_SHADOW_SERIES_TYPE = ['line', 'bar', 'candlestick', 'scatter'];
+var SliderZoomView = DataZoomView.extend({
+  type: 'dataZoom.slider',
+  init: function (ecModel, api) {
+    /**
+     * @private
+     * @type {Object}
+     */
+    this._displayables = {};
+    /**
+     * @private
+     * @type {string}
+     */
+
+    this._orient;
+    /**
+     * [0, 100]
+     * @private
+     */
+
+    this._range;
+    /**
+     * [coord of the first handle, coord of the second handle]
+     * @private
+     */
+
+    this._handleEnds;
+    /**
+     * [length, thick]
+     * @private
+     * @type {Array.<number>}
+     */
+
+    this._size;
+    /**
+     * @private
+     * @type {number}
+     */
+
+    this._handleWidth;
+    /**
+     * @private
+     * @type {number}
+     */
+
+    this._handleHeight;
+    /**
+     * @private
+     */
+
+    this._location;
+    /**
+     * @private
+     */
+
+    this._dragging;
+    /**
+     * @private
+     */
+
+    this._dataShadowInfo;
+    this.api = api;
+  },
+
+  /**
+   * @override
+   */
+  render: function (dataZoomModel, ecModel, api, payload) {
+    SliderZoomView.superApply(this, 'render', arguments);
+    createOrUpdate(this, '_dispatchZoomAction', this.dataZoomModel.get('throttle'), 'fixRate');
+    this._orient = dataZoomModel.get('orient');
+
+    if (this.dataZoomModel.get('show') === false) {
+      this.group.removeAll();
+      return;
+    } // Notice: this._resetInterval() should not be executed when payload.type
+    // is 'dataZoom', origin this._range should be maintained, otherwise 'pan'
+    // or 'zoom' info will be missed because of 'throttle' of this.dispatchAction,
+
+
+    if (!payload || payload.type !== 'dataZoom' || payload.from !== this.uid) {
+      this._buildView();
+    }
+
+    this._updateView();
+  },
+
+  /**
+   * @override
+   */
+  remove: function () {
+    SliderZoomView.superApply(this, 'remove', arguments);
+    clear(this, '_dispatchZoomAction');
+  },
+
+  /**
+   * @override
+   */
+  dispose: function () {
+    SliderZoomView.superApply(this, 'dispose', arguments);
+    clear(this, '_dispatchZoomAction');
+  },
+  _buildView: function () {
+    var thisGroup = this.group;
+    thisGroup.removeAll();
+
+    this._resetLocation();
+
+    this._resetInterval();
+
+    var barGroup = this._displayables.barGroup = new Group();
+
+    this._renderBackground();
+
+    this._renderHandle();
+
+    this._renderDataShadow();
+
+    thisGroup.add(barGroup);
+
+    this._positionGroup();
+  },
+
+  /**
+   * @private
+   */
+  _resetLocation: function () {
+    var dataZoomModel = this.dataZoomModel;
+    var api = this.api; // If some of x/y/width/height are not specified,
+    // auto-adapt according to target grid.
+
+    var coordRect = this._findCoordRect();
+
+    var ecSize = {
+      width: api.getWidth(),
+      height: api.getHeight()
+    }; // Default align by coordinate system rect.
+
+    var positionInfo = this._orient === HORIZONTAL ? {
+      // Why using 'right', because right should be used in vertical,
+      // and it is better to be consistent for dealing with position param merge.
+      right: ecSize.width - coordRect.x - coordRect.width,
+      top: ecSize.height - DEFAULT_FILLER_SIZE - DEFAULT_LOCATION_EDGE_GAP,
+      width: coordRect.width,
+      height: DEFAULT_FILLER_SIZE
+    } : {
+      // vertical
+      right: DEFAULT_LOCATION_EDGE_GAP,
+      top: coordRect.y,
+      width: DEFAULT_FILLER_SIZE,
+      height: coordRect.height
+    }; // Do not write back to option and replace value 'ph', because
+    // the 'ph' value should be recalculated when resize.
+
+    var layoutParams = getLayoutParams(dataZoomModel.option); // Replace the placeholder value.
+
+    each$1(['right', 'top', 'width', 'height'], function (name) {
+      if (layoutParams[name] === 'ph') {
+        layoutParams[name] = positionInfo[name];
+      }
+    });
+    var layoutRect = getLayoutRect(layoutParams, ecSize, dataZoomModel.padding);
+    this._location = {
+      x: layoutRect.x,
+      y: layoutRect.y
+    };
+    this._size = [layoutRect.width, layoutRect.height];
+    this._orient === VERTICAL && this._size.reverse();
+  },
+
+  /**
+   * @private
+   */
+  _positionGroup: function () {
+    var thisGroup = this.group;
+    var location = this._location;
+    var orient = this._orient; // Just use the first axis to determine mapping.
+
+    var targetAxisModel = this.dataZoomModel.getFirstTargetAxisModel();
+    var inverse = targetAxisModel && targetAxisModel.get('inverse');
+    var barGroup = this._displayables.barGroup;
+    var otherAxisInverse = (this._dataShadowInfo || {}).otherAxisInverse; // Transform barGroup.
+
+    barGroup.attr(orient === HORIZONTAL && !inverse ? {
+      scale: otherAxisInverse ? [1, 1] : [1, -1]
+    } : orient === HORIZONTAL && inverse ? {
+      scale: otherAxisInverse ? [-1, 1] : [-1, -1]
+    } : orient === VERTICAL && !inverse ? {
+      scale: otherAxisInverse ? [1, -1] : [1, 1],
+      rotation: Math.PI / 2 // Dont use Math.PI, considering shadow direction.
+
+    } : {
+      scale: otherAxisInverse ? [-1, -1] : [-1, 1],
+      rotation: Math.PI / 2
+    }); // Position barGroup
+
+    var rect = thisGroup.getBoundingRect([barGroup]);
+    thisGroup.attr('position', [location.x - rect.x, location.y - rect.y]);
+  },
+
+  /**
+   * @private
+   */
+  _getViewExtent: function () {
+    return [0, this._size[0]];
+  },
+  _renderBackground: function () {
+    var dataZoomModel = this.dataZoomModel;
+    var size = this._size;
+    var barGroup = this._displayables.barGroup;
+    barGroup.add(new Rect$2({
+      silent: true,
+      shape: {
+        x: 0,
+        y: 0,
+        width: size[0],
+        height: size[1]
+      },
+      style: {
+        fill: dataZoomModel.get('backgroundColor')
+      },
+      z2: -40
+    })); // Click panel, over shadow, below handles.
+
+    barGroup.add(new Rect$2({
+      shape: {
+        x: 0,
+        y: 0,
+        width: size[0],
+        height: size[1]
+      },
+      style: {
+        fill: 'transparent'
+      },
+      z2: 0,
+      onclick: bind(this._onClickPanelClick, this)
+    }));
+  },
+  _renderDataShadow: function () {
+    var info = this._dataShadowInfo = this._prepareDataShadowInfo();
+
+    if (!info) {
+      return;
+    }
+
+    var size = this._size;
+    var seriesModel = info.series;
+    var data = seriesModel.getRawData();
+    var otherDim = seriesModel.getShadowDim ? seriesModel.getShadowDim() // @see candlestick
+    : info.otherDim;
+
+    if (otherDim == null) {
+      return;
+    }
+
+    var otherDataExtent = data.getDataExtent(otherDim); // Nice extent.
+
+    var otherOffset = (otherDataExtent[1] - otherDataExtent[0]) * 0.3;
+    otherDataExtent = [otherDataExtent[0] - otherOffset, otherDataExtent[1] + otherOffset];
+    var otherShadowExtent = [0, size[1]];
+    var thisShadowExtent = [0, size[0]];
+    var areaPoints = [[size[0], 0], [0, 0]];
+    var linePoints = [];
+    var step = thisShadowExtent[1] / (data.count() - 1);
+    var thisCoord = 0; // Optimize for large data shadow
+
+    var stride = Math.round(data.count() / size[0]);
+    var lastIsEmpty;
+    data.each([otherDim], function (value, index) {
+      if (stride > 0 && index % stride) {
+        thisCoord += step;
+        return;
+      } // FIXME
+      // Should consider axis.min/axis.max when drawing dataShadow.
+      // FIXME
+      // 搴旇浣跨敤缁熶竴鐨勭┖鍒ゆ柇锛熻繕鏄湪list閲岃繘琛岀┖鍒ゆ柇锛�
+
+
+      var isEmpty = value == null || isNaN(value) || value === ''; // See #4235.
+
+      var otherCoord = isEmpty ? 0 : linearMap$1(value, otherDataExtent, otherShadowExtent, true); // Attempt to draw data shadow precisely when there are empty value.
+
+      if (isEmpty && !lastIsEmpty && index) {
+        areaPoints.push([areaPoints[areaPoints.length - 1][0], 0]);
+        linePoints.push([linePoints[linePoints.length - 1][0], 0]);
+      } else if (!isEmpty && lastIsEmpty) {
+        areaPoints.push([thisCoord, 0]);
+        linePoints.push([thisCoord, 0]);
+      }
+
+      areaPoints.push([thisCoord, otherCoord]);
+      linePoints.push([thisCoord, otherCoord]);
+      thisCoord += step;
+      lastIsEmpty = isEmpty;
+    });
+    var dataZoomModel = this.dataZoomModel; // var dataBackgroundModel = dataZoomModel.getModel('dataBackground');
+
+    this._displayables.barGroup.add(new Polygon({
+      shape: {
+        points: areaPoints
+      },
+      style: defaults({
+        fill: dataZoomModel.get('dataBackgroundColor')
+      }, dataZoomModel.getModel('dataBackground.areaStyle').getAreaStyle()),
+      silent: true,
+      z2: -20
+    }));
+
+    this._displayables.barGroup.add(new Polyline({
+      shape: {
+        points: linePoints
+      },
+      style: dataZoomModel.getModel('dataBackground.lineStyle').getLineStyle(),
+      silent: true,
+      z2: -19
+    }));
+  },
+  _prepareDataShadowInfo: function () {
+    var dataZoomModel = this.dataZoomModel;
+    var showDataShadow = dataZoomModel.get('showDataShadow');
+
+    if (showDataShadow === false) {
+      return;
+    } // Find a representative series.
+
+
+    var result;
+    var ecModel = this.ecModel;
+    dataZoomModel.eachTargetAxis(function (dimNames, axisIndex) {
+      var seriesModels = dataZoomModel.getAxisProxy(dimNames.name, axisIndex).getTargetSeriesModels();
+      each$1(seriesModels, function (seriesModel) {
+        if (result) {
+          return;
+        }
+
+        if (showDataShadow !== true && indexOf(SHOW_DATA_SHADOW_SERIES_TYPE, seriesModel.get('type')) < 0) {
+          return;
+        }
+
+        var thisAxis = ecModel.getComponent(dimNames.axis, axisIndex).axis;
+        var otherDim = getOtherDim(dimNames.name);
+        var otherAxisInverse;
+        var coordSys = seriesModel.coordinateSystem;
+
+        if (otherDim != null && coordSys.getOtherAxis) {
+          otherAxisInverse = coordSys.getOtherAxis(thisAxis).inverse;
+        }
+
+        otherDim = seriesModel.getData().mapDimension(otherDim);
+        result = {
+          thisAxis: thisAxis,
+          series: seriesModel,
+          thisDim: dimNames.name,
+          otherDim: otherDim,
+          otherAxisInverse: otherAxisInverse
+        };
+      }, this);
+    }, this);
+    return result;
+  },
+  _renderHandle: function () {
+    var displaybles = this._displayables;
+    var handles = displaybles.handles = [];
+    var handleLabels = displaybles.handleLabels = [];
+    var barGroup = this._displayables.barGroup;
+    var size = this._size;
+    var dataZoomModel = this.dataZoomModel;
+    barGroup.add(displaybles.filler = new Rect$2({
+      draggable: true,
+      cursor: getCursor(this._orient),
+      drift: bind$5(this._onDragMove, this, 'all'),
+      onmousemove: function (e) {
+        // Fot mobile devicem, prevent screen slider on the button.
+        stop(e.event);
+      },
+      ondragstart: bind$5(this._showDataInfo, this, true),
+      ondragend: bind$5(this._onDragEnd, this),
+      onmouseover: bind$5(this._showDataInfo, this, true),
+      onmouseout: bind$5(this._showDataInfo, this, false),
+      style: {
+        fill: dataZoomModel.get('fillerColor'),
+        textPosition: 'inside'
+      }
+    })); // Frame border.
+
+    barGroup.add(new Rect$2(subPixelOptimizeRect({
+      silent: true,
+      shape: {
+        x: 0,
+        y: 0,
+        width: size[0],
+        height: size[1]
+      },
+      style: {
+        stroke: dataZoomModel.get('dataBackgroundColor') || dataZoomModel.get('borderColor'),
+        lineWidth: DEFAULT_FRAME_BORDER_WIDTH,
+        fill: 'rgba(0,0,0,0)'
+      }
+    })));
+    each$22([0, 1], function (handleIndex) {
+      var path = createIcon(dataZoomModel.get('handleIcon'), {
+        cursor: getCursor(this._orient),
+        draggable: true,
+        drift: bind$5(this._onDragMove, this, handleIndex),
+        onmousemove: function (e) {
+          // Fot mobile devicem, prevent screen slider on the button.
+          stop(e.event);
+        },
+        ondragend: bind$5(this._onDragEnd, this),
+        onmouseover: bind$5(this._showDataInfo, this, true),
+        onmouseout: bind$5(this._showDataInfo, this, false)
+      }, {
+        x: -1,
+        y: 0,
+        width: 2,
+        height: 2
+      });
+      var bRect = path.getBoundingRect();
+      this._handleHeight = parsePercent$1(dataZoomModel.get('handleSize'), this._size[1]);
+      this._handleWidth = bRect.width / bRect.height * this._handleHeight;
+      path.setStyle(dataZoomModel.getModel('handleStyle').getItemStyle());
+      var handleColor = dataZoomModel.get('handleColor'); // Compatitable with previous version
+
+      if (handleColor != null) {
+        path.style.fill = handleColor;
+      }
+
+      barGroup.add(handles[handleIndex] = path);
+      var textStyleModel = dataZoomModel.textStyleModel;
+      this.group.add(handleLabels[handleIndex] = new Text({
+        silent: true,
+        invisible: true,
+        style: {
+          x: 0,
+          y: 0,
+          text: '',
+          textVerticalAlign: 'middle',
+          textAlign: 'center',
+          textFill: textStyleModel.getTextColor(),
+          textFont: textStyleModel.getFont()
+        },
+        z2: 10
+      }));
+    }, this);
+  },
+
+  /**
+   * @private
+   */
+  _resetInterval: function () {
+    var range = this._range = this.dataZoomModel.getPercentRange();
+
+    var viewExtent = this._getViewExtent();
+
+    this._handleEnds = [linearMap$1(range[0], [0, 100], viewExtent, true), linearMap$1(range[1], [0, 100], viewExtent, true)];
+  },
+
+  /**
+   * @private
+   * @param {(number|string)} handleIndex 0 or 1 or 'all'
+   * @param {number} delta
+   * @return {boolean} changed
+   */
+  _updateInterval: function (handleIndex, delta) {
+    var dataZoomModel = this.dataZoomModel;
+    var handleEnds = this._handleEnds;
+
+    var viewExtend = this._getViewExtent();
+
+    var minMaxSpan = dataZoomModel.findRepresentativeAxisProxy().getMinMaxSpan();
+    var percentExtent = [0, 100];
+    sliderMove(delta, handleEnds, viewExtend, dataZoomModel.get('zoomLock') ? 'all' : handleIndex, minMaxSpan.minSpan != null ? linearMap$1(minMaxSpan.minSpan, percentExtent, viewExtend, true) : null, minMaxSpan.maxSpan != null ? linearMap$1(minMaxSpan.maxSpan, percentExtent, viewExtend, true) : null);
+    var lastRange = this._range;
+    var range = this._range = asc$2([linearMap$1(handleEnds[0], viewExtend, percentExtent, true), linearMap$1(handleEnds[1], viewExtend, percentExtent, true)]);
+    return !lastRange || lastRange[0] !== range[0] || lastRange[1] !== range[1];
+  },
+
+  /**
+   * @private
+   */
+  _updateView: function (nonRealtime) {
+    var displaybles = this._displayables;
+    var handleEnds = this._handleEnds;
+    var handleInterval = asc$2(handleEnds.slice());
+    var size = this._size;
+    each$22([0, 1], function (handleIndex) {
+      // Handles
+      var handle = displaybles.handles[handleIndex];
+      var handleHeight = this._handleHeight;
+      handle.attr({
+        scale: [handleHeight / 2, handleHeight / 2],
+        position: [handleEnds[handleIndex], size[1] / 2 - handleHeight / 2]
+      });
+    }, this); // Filler
+
+    displaybles.filler.setShape({
+      x: handleInterval[0],
+      y: 0,
+      width: handleInterval[1] - handleInterval[0],
+      height: size[1]
+    });
+
+    this._updateDataInfo(nonRealtime);
+  },
+
+  /**
+   * @private
+   */
+  _updateDataInfo: function (nonRealtime) {
+    var dataZoomModel = this.dataZoomModel;
+    var displaybles = this._displayables;
+    var handleLabels = displaybles.handleLabels;
+    var orient = this._orient;
+    var labelTexts = ['', '']; // FIXME
+    // date鍨嬶紝鏀寔formatter锛宎utoformatter锛坋c2 date.getAutoFormatter锛�
+
+    if (dataZoomModel.get('showDetail')) {
+      var axisProxy = dataZoomModel.findRepresentativeAxisProxy();
+
+      if (axisProxy) {
+        var axis = axisProxy.getAxisModel().axis;
+        var range = this._range;
+        var dataInterval = nonRealtime // See #4434, data and axis are not processed and reset yet in non-realtime mode.
+        ? axisProxy.calculateDataWindow({
+          start: range[0],
+          end: range[1]
+        }).valueWindow : axisProxy.getDataValueWindow();
+        labelTexts = [this._formatLabel(dataInterval[0], axis), this._formatLabel(dataInterval[1], axis)];
+      }
+    }
+
+    var orderedHandleEnds = asc$2(this._handleEnds.slice());
+    setLabel.call(this, 0);
+    setLabel.call(this, 1);
+
+    function setLabel(handleIndex) {
+      // Label
+      // Text should not transform by barGroup.
+      // Ignore handlers transform
+      var barTransform = getTransform(displaybles.handles[handleIndex].parent, this.group);
+      var direction = transformDirection(handleIndex === 0 ? 'right' : 'left', barTransform);
+      var offset = this._handleWidth / 2 + LABEL_GAP;
+      var textPoint = applyTransform$1([orderedHandleEnds[handleIndex] + (handleIndex === 0 ? -offset : offset), this._size[1] / 2], barTransform);
+      handleLabels[handleIndex].setStyle({
+        x: textPoint[0],
+        y: textPoint[1],
+        textVerticalAlign: orient === HORIZONTAL ? 'middle' : direction,
+        textAlign: orient === HORIZONTAL ? direction : 'center',
+        text: labelTexts[handleIndex]
+      });
+    }
+  },
+
+  /**
+   * @private
+   */
+  _formatLabel: function (value, axis) {
+    var dataZoomModel = this.dataZoomModel;
+    var labelFormatter = dataZoomModel.get('labelFormatter');
+    var labelPrecision = dataZoomModel.get('labelPrecision');
+
+    if (labelPrecision == null || labelPrecision === 'auto') {
+      labelPrecision = axis.getPixelPrecision();
+    }
+
+    var valueStr = value == null || isNaN(value) ? '' // FIXME Glue code
+    : axis.type === 'category' || axis.type === 'time' ? axis.scale.getLabel(Math.round(value)) // param of toFixed should less then 20.
+    : value.toFixed(Math.min(labelPrecision, 20));
+    return isFunction$1(labelFormatter) ? labelFormatter(value, valueStr) : isString(labelFormatter) ? labelFormatter.replace('{value}', valueStr) : valueStr;
+  },
+
+  /**
+   * @private
+   * @param {boolean} showOrHide true: show, false: hide
+   */
+  _showDataInfo: function (showOrHide) {
+    // Always show when drgging.
+    showOrHide = this._dragging || showOrHide;
+    var handleLabels = this._displayables.handleLabels;
+    handleLabels[0].attr('invisible', !showOrHide);
+    handleLabels[1].attr('invisible', !showOrHide);
+  },
+  _onDragMove: function (handleIndex, dx, dy) {
+    this._dragging = true; // Transform dx, dy to bar coordination.
+
+    var barTransform = this._displayables.barGroup.getLocalTransform();
+
+    var vertex = applyTransform$1([dx, dy], barTransform, true);
+
+    var changed = this._updateInterval(handleIndex, vertex[0]);
+
+    var realtime = this.dataZoomModel.get('realtime');
+
+    this._updateView(!realtime); // Avoid dispatch dataZoom repeatly but range not changed,
+    // which cause bad visual effect when progressive enabled.
+
+
+    changed && realtime && this._dispatchZoomAction();
+  },
+  _onDragEnd: function () {
+    this._dragging = false;
+
+    this._showDataInfo(false); // While in realtime mode and stream mode, dispatch action when
+    // drag end will cause the whole view rerender, which is unnecessary.
+
+
+    var realtime = this.dataZoomModel.get('realtime');
+    !realtime && this._dispatchZoomAction();
+  },
+  _onClickPanelClick: function (e) {
+    var size = this._size;
+
+    var localPoint = this._displayables.barGroup.transformCoordToLocal(e.offsetX, e.offsetY);
+
+    if (localPoint[0] < 0 || localPoint[0] > size[0] || localPoint[1] < 0 || localPoint[1] > size[1]) {
+      return;
+    }
+
+    var handleEnds = this._handleEnds;
+    var center = (handleEnds[0] + handleEnds[1]) / 2;
+
+    var changed = this._updateInterval('all', localPoint[0] - center);
+
+    this._updateView();
+
+    changed && this._dispatchZoomAction();
+  },
+
+  /**
+   * This action will be throttled.
+   * @private
+   */
+  _dispatchZoomAction: function () {
+    var range = this._range;
+    this.api.dispatchAction({
+      type: 'dataZoom',
+      from: this.uid,
+      dataZoomId: this.dataZoomModel.id,
+      start: range[0],
+      end: range[1]
+    });
+  },
+
+  /**
+   * @private
+   */
+  _findCoordRect: function () {
+    // Find the grid coresponding to the first axis referred by dataZoom.
+    var rect;
+    each$22(this.getTargetCoordInfo(), function (coordInfoList) {
+      if (!rect && coordInfoList.length) {
+        var coordSys = coordInfoList[0].model.coordinateSystem;
+        rect = coordSys.getRect && coordSys.getRect();
+      }
+    });
+
+    if (!rect) {
+      var width = this.api.getWidth();
+      var height = this.api.getHeight();
+      rect = {
+        x: width * 0.2,
+        y: height * 0.2,
+        width: width * 0.6,
+        height: height * 0.6
+      };
+    }
+
+    return rect;
+  }
+});
+
+function getOtherDim(thisDim) {
+  // FIXME
+  // 杩欎釜閫昏緫鍜実etOtherAxis閲屼竴鑷达紝浣嗘槸鍐欏湪杩欓噷鏄惁涓嶅ソ
+  var map$$1 = {
+    x: 'y',
+    y: 'x',
+    radius: 'angle',
+    angle: 'radius'
+  };
+  return map$$1[thisDim];
+}
+
+function getCursor(orient) {
+  return orient === 'vertical' ? 'ns-resize' : 'ew-resize';
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+DataZoomModel.extend({
+  type: 'dataZoom.inside',
+
+  /**
+   * @protected
+   */
+  defaultOption: {
+    disabled: false,
+    // Whether disable this inside zoom.
+    zoomLock: false,
+    // Whether disable zoom but only pan.
+    zoomOnMouseWheel: true,
+    // Can be: true / false / 'shift' / 'ctrl' / 'alt'.
+    moveOnMouseMove: true,
+    // Can be: true / false / 'shift' / 'ctrl' / 'alt'.
+    moveOnMouseWheel: false,
+    // Can be: true / false / 'shift' / 'ctrl' / 'alt'.
+    preventDefaultMouseMove: true
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+// Only create one roam controller for each coordinate system.
+// one roam controller might be refered by two inside data zoom
+// components (for example, one for x and one for y). When user
+// pan or zoom, only dispatch one action for those data zoom
+// components.
+var ATTR$1 = '\0_ec_dataZoom_roams';
+/**
+ * @public
+ * @param {module:echarts/ExtensionAPI} api
+ * @param {Object} dataZoomInfo
+ * @param {string} dataZoomInfo.coordId
+ * @param {Function} dataZoomInfo.containsPoint
+ * @param {Array.<string>} dataZoomInfo.allCoordIds
+ * @param {string} dataZoomInfo.dataZoomId
+ * @param {Object} dataZoomInfo.getRange
+ * @param {Function} dataZoomInfo.getRange.pan
+ * @param {Function} dataZoomInfo.getRange.zoom
+ * @param {Function} dataZoomInfo.getRange.scrollMove
+ * @param {boolean} dataZoomInfo.dataZoomModel
+ */
+
+function register$1(api, dataZoomInfo) {
+  var store = giveStore(api);
+  var theDataZoomId = dataZoomInfo.dataZoomId;
+  var theCoordId = dataZoomInfo.coordId; // Do clean when a dataZoom changes its target coordnate system.
+  // Avoid memory leak, dispose all not-used-registered.
+
+  each$1(store, function (record, coordId) {
+    var dataZoomInfos = record.dataZoomInfos;
+
+    if (dataZoomInfos[theDataZoomId] && indexOf(dataZoomInfo.allCoordIds, theCoordId) < 0) {
+      delete dataZoomInfos[theDataZoomId];
+      record.count--;
+    }
+  });
+  cleanStore(store);
+  var record = store[theCoordId]; // Create if needed.
+
+  if (!record) {
+    record = store[theCoordId] = {
+      coordId: theCoordId,
+      dataZoomInfos: {},
+      count: 0
+    };
+    record.controller = createController(api, record);
+    record.dispatchAction = curry(dispatchAction, api);
+  } // Update reference of dataZoom.
+
+
+  !record.dataZoomInfos[theDataZoomId] && record.count++;
+  record.dataZoomInfos[theDataZoomId] = dataZoomInfo;
+  var controllerParams = mergeControllerParams(record.dataZoomInfos);
+  record.controller.enable(controllerParams.controlType, controllerParams.opt); // Consider resize, area should be always updated.
+
+  record.controller.setPointerChecker(dataZoomInfo.containsPoint); // Update throttle.
+
+  createOrUpdate(record, 'dispatchAction', dataZoomInfo.dataZoomModel.get('throttle', true), 'fixRate');
+}
+/**
+ * @public
+ * @param {module:echarts/ExtensionAPI} api
+ * @param {string} dataZoomId
+ */
+
+function unregister$1(api, dataZoomId) {
+  var store = giveStore(api);
+  each$1(store, function (record) {
+    record.controller.dispose();
+    var dataZoomInfos = record.dataZoomInfos;
+
+    if (dataZoomInfos[dataZoomId]) {
+      delete dataZoomInfos[dataZoomId];
+      record.count--;
+    }
+  });
+  cleanStore(store);
+}
+/**
+ * @public
+ */
+
+function generateCoordId(coordModel) {
+  return coordModel.type + '\0_' + coordModel.id;
+}
+/**
+ * Key: coordId, value: {dataZoomInfos: [], count, controller}
+ * @type {Array.<Object>}
+ */
+
+function giveStore(api) {
+  // Mount store on zrender instance, so that we do not
+  // need to worry about dispose.
+  var zr = api.getZr();
+  return zr[ATTR$1] || (zr[ATTR$1] = {});
+}
+
+function createController(api, newRecord) {
+  var controller = new RoamController(api.getZr());
+  each$1(['pan', 'zoom', 'scrollMove'], function (eventName) {
+    controller.on(eventName, function (event) {
+      var batch = [];
+      each$1(newRecord.dataZoomInfos, function (info) {
+        // Check whether the behaviors (zoomOnMouseWheel, moveOnMouseMove,
+        // moveOnMouseWheel, ...) enabled.
+        if (!event.isAvailableBehavior(info.dataZoomModel.option)) {
+          return;
+        }
+
+        var method = (info.getRange || {})[eventName];
+        var range = method && method(newRecord.controller, event);
+        !info.dataZoomModel.get('disabled', true) && range && batch.push({
+          dataZoomId: info.dataZoomId,
+          start: range[0],
+          end: range[1]
+        });
+      });
+      batch.length && newRecord.dispatchAction(batch);
+    });
+  });
+  return controller;
+}
+
+function cleanStore(store) {
+  each$1(store, function (record, coordId) {
+    if (!record.count) {
+      record.controller.dispose();
+      delete store[coordId];
+    }
+  });
+}
+/**
+ * This action will be throttled.
+ */
+
+
+function dispatchAction(api, batch) {
+  api.dispatchAction({
+    type: 'dataZoom',
+    batch: batch
+  });
+}
+/**
+ * Merge roamController settings when multiple dataZooms share one roamController.
+ */
+
+
+function mergeControllerParams(dataZoomInfos) {
+  var controlType; // DO NOT use reserved word (true, false, undefined) as key literally. Even if encapsulated
+  // as string, it is probably revert to reserved word by compress tool. See #7411.
+
+  var prefix = 'type_';
+  var typePriority = {
+    'type_true': 2,
+    'type_move': 1,
+    'type_false': 0,
+    'type_undefined': -1
+  };
+  var preventDefaultMouseMove = true;
+  each$1(dataZoomInfos, function (dataZoomInfo) {
+    var dataZoomModel = dataZoomInfo.dataZoomModel;
+    var oneType = dataZoomModel.get('disabled', true) ? false : dataZoomModel.get('zoomLock', true) ? 'move' : true;
+
+    if (typePriority[prefix + oneType] > typePriority[prefix + controlType]) {
+      controlType = oneType;
+    } // Prevent default move event by default. If one false, do not prevent. Otherwise
+    // users may be confused why it does not work when multiple insideZooms exist.
+
+
+    preventDefaultMouseMove &= dataZoomModel.get('preventDefaultMouseMove', true);
+  });
+  return {
+    controlType: controlType,
+    opt: {
+      // RoamController will enable all of these functionalities,
+      // and the final behavior is determined by its event listener
+      // provided by each inside zoom.
+      zoomOnMouseWheel: true,
+      moveOnMouseMove: true,
+      moveOnMouseWheel: true,
+      preventDefaultMouseMove: !!preventDefaultMouseMove
+    }
+  };
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var bind$6 = bind;
+var InsideZoomView = DataZoomView.extend({
+  type: 'dataZoom.inside',
+
+  /**
+   * @override
+   */
+  init: function (ecModel, api) {
+    /**
+     * 'throttle' is used in this.dispatchAction, so we save range
+     * to avoid missing some 'pan' info.
+     * @private
+     * @type {Array.<number>}
+     */
+    this._range;
+  },
+
+  /**
+   * @override
+   */
+  render: function (dataZoomModel, ecModel, api, payload) {
+    InsideZoomView.superApply(this, 'render', arguments); // Hance the `throttle` util ensures to preserve command order,
+    // here simply updating range all the time will not cause missing
+    // any of the the roam change.
+
+    this._range = dataZoomModel.getPercentRange(); // Reset controllers.
+
+    each$1(this.getTargetCoordInfo(), function (coordInfoList, coordSysName) {
+      var allCoordIds = map(coordInfoList, function (coordInfo) {
+        return generateCoordId(coordInfo.model);
+      });
+      each$1(coordInfoList, function (coordInfo) {
+        var coordModel = coordInfo.model;
+        var getRange = {};
+        each$1(['pan', 'zoom', 'scrollMove'], function (eventName) {
+          getRange[eventName] = bind$6(roamHandlers[eventName], this, coordInfo, coordSysName);
+        }, this);
+        register$1(api, {
+          coordId: generateCoordId(coordModel),
+          allCoordIds: allCoordIds,
+          containsPoint: function (e, x, y) {
+            return coordModel.coordinateSystem.containPoint([x, y]);
+          },
+          dataZoomId: dataZoomModel.id,
+          dataZoomModel: dataZoomModel,
+          getRange: getRange
+        });
+      }, this);
+    }, this);
+  },
+
+  /**
+   * @override
+   */
+  dispose: function () {
+    unregister$1(this.api, this.dataZoomModel.id);
+    InsideZoomView.superApply(this, 'dispose', arguments);
+    this._range = null;
+  }
+});
+var roamHandlers = {
+  /**
+   * @this {module:echarts/component/dataZoom/InsideZoomView}
+   */
+  zoom: function (coordInfo, coordSysName, controller, e) {
+    var lastRange = this._range;
+    var range = lastRange.slice(); // Calculate transform by the first axis.
+
+    var axisModel = coordInfo.axisModels[0];
+
+    if (!axisModel) {
+      return;
+    }
+
+    var directionInfo = getDirectionInfo[coordSysName](null, [e.originX, e.originY], axisModel, controller, coordInfo);
+    var percentPoint = (directionInfo.signal > 0 ? directionInfo.pixelStart + directionInfo.pixelLength - directionInfo.pixel : directionInfo.pixel - directionInfo.pixelStart) / directionInfo.pixelLength * (range[1] - range[0]) + range[0];
+    var scale = Math.max(1 / e.scale, 0);
+    range[0] = (range[0] - percentPoint) * scale + percentPoint;
+    range[1] = (range[1] - percentPoint) * scale + percentPoint; // Restrict range.
+
+    var minMaxSpan = this.dataZoomModel.findRepresentativeAxisProxy().getMinMaxSpan();
+    sliderMove(0, range, [0, 100], 0, minMaxSpan.minSpan, minMaxSpan.maxSpan);
+    this._range = range;
+
+    if (lastRange[0] !== range[0] || lastRange[1] !== range[1]) {
+      return range;
+    }
+  },
+
+  /**
+   * @this {module:echarts/component/dataZoom/InsideZoomView}
+   */
+  pan: makeMover(function (range, axisModel, coordInfo, coordSysName, controller, e) {
+    var directionInfo = getDirectionInfo[coordSysName]([e.oldX, e.oldY], [e.newX, e.newY], axisModel, controller, coordInfo);
+    return directionInfo.signal * (range[1] - range[0]) * directionInfo.pixel / directionInfo.pixelLength;
+  }),
+
+  /**
+   * @this {module:echarts/component/dataZoom/InsideZoomView}
+   */
+  scrollMove: makeMover(function (range, axisModel, coordInfo, coordSysName, controller, e) {
+    var directionInfo = getDirectionInfo[coordSysName]([0, 0], [e.scrollDelta, e.scrollDelta], axisModel, controller, coordInfo);
+    return directionInfo.signal * (range[1] - range[0]) * e.scrollDelta;
+  })
+};
+
+function makeMover(getPercentDelta) {
+  return function (coordInfo, coordSysName, controller, e) {
+    var lastRange = this._range;
+    var range = lastRange.slice(); // Calculate transform by the first axis.
+
+    var axisModel = coordInfo.axisModels[0];
+
+    if (!axisModel) {
+      return;
+    }
+
+    var percentDelta = getPercentDelta(range, axisModel, coordInfo, coordSysName, controller, e);
+    sliderMove(percentDelta, range, [0, 100], 'all');
+    this._range = range;
+
+    if (lastRange[0] !== range[0] || lastRange[1] !== range[1]) {
+      return range;
+    }
+  };
+}
+
+var getDirectionInfo = {
+  grid: function (oldPoint, newPoint, axisModel, controller, coordInfo) {
+    var axis = axisModel.axis;
+    var ret = {};
+    var rect = coordInfo.model.coordinateSystem.getRect();
+    oldPoint = oldPoint || [0, 0];
+
+    if (axis.dim === 'x') {
+      ret.pixel = newPoint[0] - oldPoint[0];
+      ret.pixelLength = rect.width;
+      ret.pixelStart = rect.x;
+      ret.signal = axis.inverse ? 1 : -1;
+    } else {
+      // axis.dim === 'y'
+      ret.pixel = newPoint[1] - oldPoint[1];
+      ret.pixelLength = rect.height;
+      ret.pixelStart = rect.y;
+      ret.signal = axis.inverse ? -1 : 1;
+    }
+
+    return ret;
+  },
+  polar: function (oldPoint, newPoint, axisModel, controller, coordInfo) {
+    var axis = axisModel.axis;
+    var ret = {};
+    var polar = coordInfo.model.coordinateSystem;
+    var radiusExtent = polar.getRadiusAxis().getExtent();
+    var angleExtent = polar.getAngleAxis().getExtent();
+    oldPoint = oldPoint ? polar.pointToCoord(oldPoint) : [0, 0];
+    newPoint = polar.pointToCoord(newPoint);
+
+    if (axisModel.mainType === 'radiusAxis') {
+      ret.pixel = newPoint[0] - oldPoint[0]; // ret.pixelLength = Math.abs(radiusExtent[1] - radiusExtent[0]);
+      // ret.pixelStart = Math.min(radiusExtent[0], radiusExtent[1]);
+
+      ret.pixelLength = radiusExtent[1] - radiusExtent[0];
+      ret.pixelStart = radiusExtent[0];
+      ret.signal = axis.inverse ? 1 : -1;
+    } else {
+      // 'angleAxis'
+      ret.pixel = newPoint[1] - oldPoint[1]; // ret.pixelLength = Math.abs(angleExtent[1] - angleExtent[0]);
+      // ret.pixelStart = Math.min(angleExtent[0], angleExtent[1]);
+
+      ret.pixelLength = angleExtent[1] - angleExtent[0];
+      ret.pixelStart = angleExtent[0];
+      ret.signal = axis.inverse ? -1 : 1;
+    }
+
+    return ret;
+  },
+  singleAxis: function (oldPoint, newPoint, axisModel, controller, coordInfo) {
+    var axis = axisModel.axis;
+    var rect = coordInfo.model.coordinateSystem.getRect();
+    var ret = {};
+    oldPoint = oldPoint || [0, 0];
+
+    if (axis.orient === 'horizontal') {
+      ret.pixel = newPoint[0] - oldPoint[0];
+      ret.pixelLength = rect.width;
+      ret.pixelStart = rect.x;
+      ret.signal = axis.inverse ? 1 : -1;
+    } else {
+      // 'vertical'
+      ret.pixel = newPoint[1] - oldPoint[1];
+      ret.pixelLength = rect.height;
+      ret.pixelStart = rect.y;
+      ret.signal = axis.inverse ? -1 : 1;
+    }
+
+    return ret;
+  }
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+registerProcessor({
+  // `dataZoomProcessor` will only be performed in needed series. Consider if
+  // there is a line series and a pie series, it is better not to update the
+  // line series if only pie series is needed to be updated.
+  getTargetSeries: function (ecModel) {
+    var seriesModelMap = createHashMap();
+    ecModel.eachComponent('dataZoom', function (dataZoomModel) {
+      dataZoomModel.eachTargetAxis(function (dimNames, axisIndex, dataZoomModel) {
+        var axisProxy = dataZoomModel.getAxisProxy(dimNames.name, axisIndex);
+        each$1(axisProxy.getTargetSeriesModels(), function (seriesModel) {
+          seriesModelMap.set(seriesModel.uid, seriesModel);
+        });
+      });
+    });
+    return seriesModelMap;
+  },
+  modifyOutputEnd: true,
+  // Consider appendData, where filter should be performed. Because data process is
+  // in block mode currently, it is not need to worry about that the overallProgress
+  // execute every frame.
+  overallReset: function (ecModel, api) {
+    ecModel.eachComponent('dataZoom', function (dataZoomModel) {
+      // We calculate window and reset axis here but not in model
+      // init stage and not after action dispatch handler, because
+      // reset should be called after seriesData.restoreData.
+      dataZoomModel.eachTargetAxis(function (dimNames, axisIndex, dataZoomModel) {
+        dataZoomModel.getAxisProxy(dimNames.name, axisIndex).reset(dataZoomModel, api);
+      }); // Caution: data zoom filtering is order sensitive when using
+      // percent range and no min/max/scale set on axis.
+      // For example, we have dataZoom definition:
+      // [
+      //      {xAxisIndex: 0, start: 30, end: 70},
+      //      {yAxisIndex: 0, start: 20, end: 80}
+      // ]
+      // In this case, [20, 80] of y-dataZoom should be based on data
+      // that have filtered by x-dataZoom using range of [30, 70],
+      // but should not be based on full raw data. Thus sliding
+      // x-dataZoom will change both ranges of xAxis and yAxis,
+      // while sliding y-dataZoom will only change the range of yAxis.
+      // So we should filter x-axis after reset x-axis immediately,
+      // and then reset y-axis and filter y-axis.
+
+      dataZoomModel.eachTargetAxis(function (dimNames, axisIndex, dataZoomModel) {
+        dataZoomModel.getAxisProxy(dimNames.name, axisIndex).filterData(dataZoomModel, api);
+      });
+    });
+    ecModel.eachComponent('dataZoom', function (dataZoomModel) {
+      // Fullfill all of the range props so that user
+      // is able to get them from chart.getOption().
+      var axisProxy = dataZoomModel.findRepresentativeAxisProxy();
+      var percentRange = axisProxy.getDataPercentWindow();
+      var valueRange = axisProxy.getDataValueWindow();
+      dataZoomModel.setRawRange({
+        start: percentRange[0],
+        end: percentRange[1],
+        startValue: valueRange[0],
+        endValue: valueRange[1]
+      }, true);
+    });
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+registerAction('dataZoom', function (payload, ecModel) {
+  var linkedNodesFinder = createLinkedNodesFinder(bind(ecModel.eachComponent, ecModel, 'dataZoom'), eachAxisDim$1, function (model, dimNames) {
+    return model.get(dimNames.axisIndex);
+  });
+  var effectedModels = [];
+  ecModel.eachComponent({
+    mainType: 'dataZoom',
+    query: payload
+  }, function (model, index) {
+    effectedModels.push.apply(effectedModels, linkedNodesFinder(model).nodes);
+  });
+  each$1(effectedModels, function (dataZoomModel, index) {
+    dataZoomModel.setRawRange({
+      start: payload.start,
+      end: payload.end,
+      startValue: payload.startValue,
+      endValue: payload.endValue
+    });
+  });
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * DataZoom component entry
+ */
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var DEFAULT_TOOLBOX_BTNS = ['rect', 'polygon', 'keep', 'clear'];
+var preprocessor$2 = function (option, isNew) {
+  var brushComponents = option && option.brush;
+
+  if (!isArray(brushComponents)) {
+    brushComponents = brushComponents ? [brushComponents] : [];
+  }
+
+  if (!brushComponents.length) {
+    return;
+  }
+
+  var brushComponentSpecifiedBtns = [];
+  each$1(brushComponents, function (brushOpt) {
+    var tbs = brushOpt.hasOwnProperty('toolbox') ? brushOpt.toolbox : [];
+
+    if (tbs instanceof Array) {
+      brushComponentSpecifiedBtns = brushComponentSpecifiedBtns.concat(tbs);
+    }
+  });
+  var toolbox = option && option.toolbox;
+
+  if (isArray(toolbox)) {
+    toolbox = toolbox[0];
+  }
+
+  if (!toolbox) {
+    toolbox = {
+      feature: {}
+    };
+    option.toolbox = [toolbox];
+  }
+
+  var toolboxFeature = toolbox.feature || (toolbox.feature = {});
+  var toolboxBrush = toolboxFeature.brush || (toolboxFeature.brush = {});
+  var brushTypes = toolboxBrush.type || (toolboxBrush.type = []);
+  brushTypes.push.apply(brushTypes, brushComponentSpecifiedBtns);
+  removeDuplicate(brushTypes);
+
+  if (isNew && !brushTypes.length) {
+    brushTypes.push.apply(brushTypes, DEFAULT_TOOLBOX_BTNS);
+  }
+};
+
+function removeDuplicate(arr) {
+  var map$$1 = {};
+  each$1(arr, function (val) {
+    map$$1[val] = 1;
+  });
+  arr.length = 0;
+  each$1(map$$1, function (flag, val) {
+    arr.push(val);
+  });
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * @file Visual solution, for consistent option specification.
+ */
+var each$23 = each$1;
+
+function hasKeys(obj) {
+  if (obj) {
+    for (var name in obj) {
+      if (obj.hasOwnProperty(name)) {
+        return true;
+      }
+    }
+  }
+}
+/**
+ * @param {Object} option
+ * @param {Array.<string>} stateList
+ * @param {Function} [supplementVisualOption]
+ * @return {Object} visualMappings <state, <visualType, module:echarts/visual/VisualMapping>>
+ */
+
+
+function createVisualMappings(option, stateList, supplementVisualOption) {
+  var visualMappings = {};
+  each$23(stateList, function (state) {
+    var mappings = visualMappings[state] = createMappings();
+    each$23(option[state], function (visualData, visualType) {
+      if (!VisualMapping.isValidType(visualType)) {
+        return;
+      }
+
+      var mappingOption = {
+        type: visualType,
+        visual: visualData
+      };
+      supplementVisualOption && supplementVisualOption(mappingOption, state);
+      mappings[visualType] = new VisualMapping(mappingOption); // Prepare a alpha for opacity, for some case that opacity
+      // is not supported, such as rendering using gradient color.
+
+      if (visualType === 'opacity') {
+        mappingOption = clone(mappingOption);
+        mappingOption.type = 'colorAlpha';
+        mappings.__hidden.__alphaForOpacity = new VisualMapping(mappingOption);
+      }
+    });
+  });
+  return visualMappings;
+
+  function createMappings() {
+    var Creater = function () {}; // Make sure hidden fields will not be visited by
+    // object iteration (with hasOwnProperty checking).
+
+
+    Creater.prototype.__hidden = Creater.prototype;
+    var obj = new Creater();
+    return obj;
+  }
+}
+/**
+ * @param {Object} thisOption
+ * @param {Object} newOption
+ * @param {Array.<string>} keys
+ */
+
+function replaceVisualOption(thisOption, newOption, keys) {
+  // Visual attributes merge is not supported, otherwise it
+  // brings overcomplicated merge logic. See #2853. So if
+  // newOption has anyone of these keys, all of these keys
+  // will be reset. Otherwise, all keys remain.
+  var has;
+  each$1(keys, function (key) {
+    if (newOption.hasOwnProperty(key) && hasKeys(newOption[key])) {
+      has = true;
+    }
+  });
+  has && each$1(keys, function (key) {
+    if (newOption.hasOwnProperty(key) && hasKeys(newOption[key])) {
+      thisOption[key] = clone(newOption[key]);
+    } else {
+      delete thisOption[key];
+    }
+  });
+}
+/**
+ * @param {Array.<string>} stateList
+ * @param {Object} visualMappings <state, Object.<visualType, module:echarts/visual/VisualMapping>>
+ * @param {module:echarts/data/List} list
+ * @param {Function} getValueState param: valueOrIndex, return: state.
+ * @param {object} [scope] Scope for getValueState
+ * @param {string} [dimension] Concrete dimension, if used.
+ */
+// ???! handle brush?
+
+function applyVisual(stateList, visualMappings, data, getValueState, scope, dimension) {
+  var visualTypesMap = {};
+  each$1(stateList, function (state) {
+    var visualTypes = VisualMapping.prepareVisualTypes(visualMappings[state]);
+    visualTypesMap[state] = visualTypes;
+  });
+  var dataIndex;
+
+  function getVisual(key) {
+    return data.getItemVisual(dataIndex, key);
+  }
+
+  function setVisual(key, value) {
+    data.setItemVisual(dataIndex, key, value);
+  }
+
+  if (dimension == null) {
+    data.each(eachItem);
+  } else {
+    data.each([dimension], eachItem);
+  }
+
+  function eachItem(valueOrIndex, index) {
+    dataIndex = dimension == null ? valueOrIndex : index;
+    var rawDataItem = data.getRawDataItem(dataIndex); // Consider performance
+
+    if (rawDataItem && rawDataItem.visualMap === false) {
+      return;
+    }
+
+    var valueState = getValueState.call(scope, valueOrIndex);
+    var mappings = visualMappings[valueState];
+    var visualTypes = visualTypesMap[valueState];
+
+    for (var i = 0, len = visualTypes.length; i < len; i++) {
+      var type = visualTypes[i];
+      mappings[type] && mappings[type].applyVisual(valueOrIndex, getVisual, setVisual);
+    }
+  }
+}
+/**
+ * @param {module:echarts/data/List} data
+ * @param {Array.<string>} stateList
+ * @param {Object} visualMappings <state, Object.<visualType, module:echarts/visual/VisualMapping>>
+ * @param {Function} getValueState param: valueOrIndex, return: state.
+ * @param {number} [dim] dimension or dimension index.
+ */
+
+function incrementalApplyVisual(stateList, visualMappings, getValueState, dim) {
+  var visualTypesMap = {};
+  each$1(stateList, function (state) {
+    var visualTypes = VisualMapping.prepareVisualTypes(visualMappings[state]);
+    visualTypesMap[state] = visualTypes;
+  });
+
+  function progress(params, data) {
+    if (dim != null) {
+      dim = data.getDimension(dim);
+    }
+
+    function getVisual(key) {
+      return data.getItemVisual(dataIndex, key);
+    }
+
+    function setVisual(key, value) {
+      data.setItemVisual(dataIndex, key, value);
+    }
+
+    var dataIndex;
+
+    while ((dataIndex = params.next()) != null) {
+      var rawDataItem = data.getRawDataItem(dataIndex); // Consider performance
+
+      if (rawDataItem && rawDataItem.visualMap === false) {
+        return;
+      }
+
+      var value = dim != null ? data.get(dim, dataIndex, true) : dataIndex;
+      var valueState = getValueState(value);
+      var mappings = visualMappings[valueState];
+      var visualTypes = visualTypesMap[valueState];
+
+      for (var i = 0, len = visualTypes.length; i < len; i++) {
+        var type = visualTypes[i];
+        mappings[type] && mappings[type].applyVisual(value, getVisual, setVisual);
+      }
+    }
+  }
+
+  return {
+    progress: progress
+  };
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+// Key of the second level is chart element type: `point`, `rect`.
+// See moudule:echarts/component/helper/BrushController
+// function param:
+//      {Object} itemLayout fetch from data.getItemLayout(dataIndex)
+//      {Object} selectors {point: selector, rect: selector, ...}
+//      {Object} area {range: [[], [], ..], boudingRect}
+// function return:
+//      {boolean} Whether in the given brush.
+
+var selector = {
+  lineX: getLineSelectors(0),
+  lineY: getLineSelectors(1),
+  rect: {
+    point: function (itemLayout, selectors, area) {
+      return itemLayout && area.boundingRect.contain(itemLayout[0], itemLayout[1]);
+    },
+    rect: function (itemLayout, selectors, area) {
+      return itemLayout && area.boundingRect.intersect(itemLayout);
+    }
+  },
+  polygon: {
+    point: function (itemLayout, selectors, area) {
+      return itemLayout && area.boundingRect.contain(itemLayout[0], itemLayout[1]) && contain$1(area.range, itemLayout[0], itemLayout[1]);
+    },
+    rect: function (itemLayout, selectors, area) {
+      var points = area.range;
+
+      if (!itemLayout || points.length <= 1) {
+        return false;
+      }
+
+      var x = itemLayout.x;
+      var y = itemLayout.y;
+      var width = itemLayout.width;
+      var height = itemLayout.height;
+      var p = points[0];
+
+      if (contain$1(points, x, y) || contain$1(points, x + width, y) || contain$1(points, x, y + height) || contain$1(points, x + width, y + height) || BoundingRect.create(itemLayout).contain(p[0], p[1]) || lineIntersectPolygon(x, y, x + width, y, points) || lineIntersectPolygon(x, y, x, y + height, points) || lineIntersectPolygon(x + width, y, x + width, y + height, points) || lineIntersectPolygon(x, y + height, x + width, y + height, points)) {
+        return true;
+      }
+    }
+  }
+};
+
+function getLineSelectors(xyIndex) {
+  var xy = ['x', 'y'];
+  var wh = ['width', 'height'];
+  return {
+    point: function (itemLayout, selectors, area) {
+      if (itemLayout) {
+        var range = area.range;
+        var p = itemLayout[xyIndex];
+        return inLineRange(p, range);
+      }
+    },
+    rect: function (itemLayout, selectors, area) {
+      if (itemLayout) {
+        var range = area.range;
+        var layoutRange = [itemLayout[xy[xyIndex]], itemLayout[xy[xyIndex]] + itemLayout[wh[xyIndex]]];
+        layoutRange[1] < layoutRange[0] && layoutRange.reverse();
+        return inLineRange(layoutRange[0], range) || inLineRange(layoutRange[1], range) || inLineRange(range[0], layoutRange) || inLineRange(range[1], layoutRange);
+      }
+    }
+  };
+}
+
+function inLineRange(p, range) {
+  return range[0] <= p && p <= range[1];
+}
+
+function lineIntersectPolygon(lx, ly, l2x, l2y, points) {
+  for (var i = 0, p2 = points[points.length - 1]; i < points.length; i++) {
+    var p = points[i];
+
+    if (lineIntersect(lx, ly, l2x, l2y, p[0], p[1], p2[0], p2[1])) {
+      return true;
+    }
+
+    p2 = p;
+  }
+} // Code from <http://blog.csdn.net/rickliuxiao/article/details/6259322> with some fix.
+// See <https://en.wikipedia.org/wiki/Line%E2%80%93line_intersection>
+
+
+function lineIntersect(a1x, a1y, a2x, a2y, b1x, b1y, b2x, b2y) {
+  var delta = determinant(a2x - a1x, b1x - b2x, a2y - a1y, b1y - b2y);
+
+  if (nearZero(delta)) {
+    // parallel
+    return false;
+  }
+
+  var namenda = determinant(b1x - a1x, b1x - b2x, b1y - a1y, b1y - b2y) / delta;
+
+  if (namenda < 0 || namenda > 1) {
+    return false;
+  }
+
+  var miu = determinant(a2x - a1x, b1x - a1x, a2y - a1y, b1y - a1y) / delta;
+
+  if (miu < 0 || miu > 1) {
+    return false;
+  }
+
+  return true;
+}
+
+function nearZero(val) {
+  return val <= 1e-6 && val >= -1e-6;
+}
+
+function determinant(v1, v2, v3, v4) {
+  return v1 * v4 - v2 * v3;
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var each$24 = each$1;
+var indexOf$2 = indexOf;
+var curry$6 = curry;
+var COORD_CONVERTS = ['dataToPoint', 'pointToData']; // FIXME
+// how to genarialize to more coordinate systems.
+
+var INCLUDE_FINDER_MAIN_TYPES = ['grid', 'xAxis', 'yAxis', 'geo', 'graph', 'polar', 'radiusAxis', 'angleAxis', 'bmap'];
+/**
+ * [option in constructor]:
+ * {
+ *     Index/Id/Name of geo, xAxis, yAxis, grid: See util/model#parseFinder.
+ * }
+ *
+ *
+ * [targetInfo]:
+ *
+ * There can be multiple axes in a single targetInfo. Consider the case
+ * of `grid` component, a targetInfo represents a grid which contains one or more
+ * cartesian and one or more axes. And consider the case of parallel system,
+ * which has multiple axes in a coordinate system.
+ * Can be {
+ *     panelId: ...,
+ *     coordSys: <a representitive cartesian in grid (first cartesian by default)>,
+ *     coordSyses: all cartesians.
+ *     gridModel: <grid component>
+ *     xAxes: correspond to coordSyses on index
+ *     yAxes: correspond to coordSyses on index
+ * }
+ * or {
+ *     panelId: ...,
+ *     coordSys: <geo coord sys>
+ *     coordSyses: [<geo coord sys>]
+ *     geoModel: <geo component>
+ * }
+ *
+ *
+ * [panelOpt]:
+ *
+ * Make from targetInfo. Input to BrushController.
+ * {
+ *     panelId: ...,
+ *     rect: ...
+ * }
+ *
+ *
+ * [area]:
+ *
+ * Generated by BrushController or user input.
+ * {
+ *     panelId: Used to locate coordInfo directly. If user inpput, no panelId.
+ *     brushType: determine how to convert to/from coord('rect' or 'polygon' or 'lineX/Y').
+ *     Index/Id/Name of geo, xAxis, yAxis, grid: See util/model#parseFinder.
+ *     range: pixel range.
+ *     coordRange: representitive coord range (the first one of coordRanges).
+ *     coordRanges: <Array> coord ranges, used in multiple cartesian in one grid.
+ * }
+ */
+
+/**
+ * @param {Object} option contains Index/Id/Name of xAxis/yAxis/geo/grid
+ *        Each can be {number|Array.<number>}. like: {xAxisIndex: [3, 4]}
+ * @param {module:echarts/model/Global} ecModel
+ * @param {Object} [opt]
+ * @param {Array.<string>} [opt.include] include coordinate system types.
+ */
+
+function BrushTargetManager(option, ecModel, opt) {
+  /**
+   * @private
+   * @type {Array.<Object>}
+   */
+  var targetInfoList = this._targetInfoList = [];
+  var info = {};
+  var foundCpts = parseFinder$1(ecModel, option);
+  each$24(targetInfoBuilders, function (builder, type) {
+    if (!opt || !opt.include || indexOf$2(opt.include, type) >= 0) {
+      builder(foundCpts, targetInfoList, info);
+    }
+  });
+}
+
+var proto$2 = BrushTargetManager.prototype;
+
+proto$2.setOutputRanges = function (areas, ecModel) {
+  this.matchOutputRanges(areas, ecModel, function (area, coordRange, coordSys) {
+    (area.coordRanges || (area.coordRanges = [])).push(coordRange); // area.coordRange is the first of area.coordRanges
+
+    if (!area.coordRange) {
+      area.coordRange = coordRange; // In 'category' axis, coord to pixel is not reversible, so we can not
+      // rebuild range by coordRange accrately, which may bring trouble when
+      // brushing only one item. So we use __rangeOffset to rebuilding range
+      // by coordRange. And this it only used in brush component so it is no
+      // need to be adapted to coordRanges.
+
+      var result = coordConvert[area.brushType](0, coordSys, coordRange);
+      area.__rangeOffset = {
+        offset: diffProcessor[area.brushType](result.values, area.range, [1, 1]),
+        xyMinMax: result.xyMinMax
+      };
+    }
+  });
+};
+
+proto$2.matchOutputRanges = function (areas, ecModel, cb) {
+  each$24(areas, function (area) {
+    var targetInfo = this.findTargetInfo(area, ecModel);
+
+    if (targetInfo && targetInfo !== true) {
+      each$1(targetInfo.coordSyses, function (coordSys) {
+        var result = coordConvert[area.brushType](1, coordSys, area.range);
+        cb(area, result.values, coordSys, ecModel);
+      });
+    }
+  }, this);
+};
+
+proto$2.setInputRanges = function (areas, ecModel) {
+  each$24(areas, function (area) {
+    var targetInfo = this.findTargetInfo(area, ecModel);
+    area.range = area.range || []; // convert coordRange to global range and set panelId.
+
+    if (targetInfo && targetInfo !== true) {
+      area.panelId = targetInfo.panelId; // (1) area.range shoule always be calculate from coordRange but does
+      // not keep its original value, for the sake of the dataZoom scenario,
+      // where area.coordRange remains unchanged but area.range may be changed.
+      // (2) Only support converting one coordRange to pixel range in brush
+      // component. So do not consider `coordRanges`.
+      // (3) About __rangeOffset, see comment above.
+
+      var result = coordConvert[area.brushType](0, targetInfo.coordSys, area.coordRange);
+      var rangeOffset = area.__rangeOffset;
+      area.range = rangeOffset ? diffProcessor[area.brushType](result.values, rangeOffset.offset, getScales(result.xyMinMax, rangeOffset.xyMinMax)) : result.values;
+    }
+  }, this);
+};
+
+proto$2.makePanelOpts = function (api, getDefaultBrushType) {
+  return map(this._targetInfoList, function (targetInfo) {
+    var rect = targetInfo.getPanelRect();
+    return {
+      panelId: targetInfo.panelId,
+      defaultBrushType: getDefaultBrushType && getDefaultBrushType(targetInfo),
+      clipPath: makeRectPanelClipPath(rect),
+      isTargetByCursor: makeRectIsTargetByCursor(rect, api, targetInfo.coordSysModel),
+      getLinearBrushOtherExtent: makeLinearBrushOtherExtent(rect)
+    };
+  });
+};
+
+proto$2.controlSeries = function (area, seriesModel, ecModel) {
+  // Check whether area is bound in coord, and series do not belong to that coord.
+  // If do not do this check, some brush (like lineX) will controll all axes.
+  var targetInfo = this.findTargetInfo(area, ecModel);
+  return targetInfo === true || targetInfo && indexOf$2(targetInfo.coordSyses, seriesModel.coordinateSystem) >= 0;
+};
+/**
+ * If return Object, a coord found.
+ * If reutrn true, global found.
+ * Otherwise nothing found.
+ *
+ * @param {Object} area
+ * @param {Array} targetInfoList
+ * @return {Object|boolean}
+ */
+
+
+proto$2.findTargetInfo = function (area, ecModel) {
+  var targetInfoList = this._targetInfoList;
+  var foundCpts = parseFinder$1(ecModel, area);
+
+  for (var i = 0; i < targetInfoList.length; i++) {
+    var targetInfo = targetInfoList[i];
+    var areaPanelId = area.panelId;
+
+    if (areaPanelId) {
+      if (targetInfo.panelId === areaPanelId) {
+        return targetInfo;
+      }
+    } else {
+      for (var i = 0; i < targetInfoMatchers.length; i++) {
+        if (targetInfoMatchers[i](foundCpts, targetInfo)) {
+          return targetInfo;
+        }
+      }
+    }
+  }
+
+  return true;
+};
+
+function formatMinMax(minMax) {
+  minMax[0] > minMax[1] && minMax.reverse();
+  return minMax;
+}
+
+function parseFinder$1(ecModel, option) {
+  return parseFinder(ecModel, option, {
+    includeMainTypes: INCLUDE_FINDER_MAIN_TYPES
+  });
+}
+
+var targetInfoBuilders = {
+  grid: function (foundCpts, targetInfoList) {
+    var xAxisModels = foundCpts.xAxisModels;
+    var yAxisModels = foundCpts.yAxisModels;
+    var gridModels = foundCpts.gridModels; // Remove duplicated.
+
+    var gridModelMap = createHashMap();
+    var xAxesHas = {};
+    var yAxesHas = {};
+
+    if (!xAxisModels && !yAxisModels && !gridModels) {
+      return;
+    }
+
+    each$24(xAxisModels, function (axisModel) {
+      var gridModel = axisModel.axis.grid.model;
+      gridModelMap.set(gridModel.id, gridModel);
+      xAxesHas[gridModel.id] = true;
+    });
+    each$24(yAxisModels, function (axisModel) {
+      var gridModel = axisModel.axis.grid.model;
+      gridModelMap.set(gridModel.id, gridModel);
+      yAxesHas[gridModel.id] = true;
+    });
+    each$24(gridModels, function (gridModel) {
+      gridModelMap.set(gridModel.id, gridModel);
+      xAxesHas[gridModel.id] = true;
+      yAxesHas[gridModel.id] = true;
+    });
+    gridModelMap.each(function (gridModel) {
+      var grid = gridModel.coordinateSystem;
+      var cartesians = [];
+      each$24(grid.getCartesians(), function (cartesian, index) {
+        if (indexOf$2(xAxisModels, cartesian.getAxis('x').model) >= 0 || indexOf$2(yAxisModels, cartesian.getAxis('y').model) >= 0) {
+          cartesians.push(cartesian);
+        }
+      });
+      targetInfoList.push({
+        panelId: 'grid--' + gridModel.id,
+        gridModel: gridModel,
+        coordSysModel: gridModel,
+        // Use the first one as the representitive coordSys.
+        coordSys: cartesians[0],
+        coordSyses: cartesians,
+        getPanelRect: panelRectBuilder.grid,
+        xAxisDeclared: xAxesHas[gridModel.id],
+        yAxisDeclared: yAxesHas[gridModel.id]
+      });
+    });
+  },
+  geo: function (foundCpts, targetInfoList) {
+    each$24(foundCpts.geoModels, function (geoModel) {
+      var coordSys = geoModel.coordinateSystem;
+      targetInfoList.push({
+        panelId: 'geo--' + geoModel.id,
+        geoModel: geoModel,
+        coordSysModel: geoModel,
+        coordSys: coordSys,
+        coordSyses: [coordSys],
+        getPanelRect: panelRectBuilder.geo
+      });
+    });
+  }
+};
+var targetInfoMatchers = [// grid
+function (foundCpts, targetInfo) {
+  var xAxisModel = foundCpts.xAxisModel;
+  var yAxisModel = foundCpts.yAxisModel;
+  var gridModel = foundCpts.gridModel;
+  !gridModel && xAxisModel && (gridModel = xAxisModel.axis.grid.model);
+  !gridModel && yAxisModel && (gridModel = yAxisModel.axis.grid.model);
+  return gridModel && gridModel === targetInfo.gridModel;
+}, // geo
+function (foundCpts, targetInfo) {
+  var geoModel = foundCpts.geoModel;
+  return geoModel && geoModel === targetInfo.geoModel;
+}];
+var panelRectBuilder = {
+  grid: function () {
+    // grid is not Transformable.
+    return this.coordSys.grid.getRect().clone();
+  },
+  geo: function () {
+    var coordSys = this.coordSys;
+    var rect = coordSys.getBoundingRect().clone(); // geo roam and zoom transform
+
+    rect.applyTransform(getTransform(coordSys));
+    return rect;
+  }
+};
+var coordConvert = {
+  lineX: curry$6(axisConvert, 0),
+  lineY: curry$6(axisConvert, 1),
+  rect: function (to, coordSys, rangeOrCoordRange) {
+    var xminymin = coordSys[COORD_CONVERTS[to]]([rangeOrCoordRange[0][0], rangeOrCoordRange[1][0]]);
+    var xmaxymax = coordSys[COORD_CONVERTS[to]]([rangeOrCoordRange[0][1], rangeOrCoordRange[1][1]]);
+    var values = [formatMinMax([xminymin[0], xmaxymax[0]]), formatMinMax([xminymin[1], xmaxymax[1]])];
+    return {
+      values: values,
+      xyMinMax: values
+    };
+  },
+  polygon: function (to, coordSys, rangeOrCoordRange) {
+    var xyMinMax = [[Infinity, -Infinity], [Infinity, -Infinity]];
+    var values = map(rangeOrCoordRange, function (item) {
+      var p = coordSys[COORD_CONVERTS[to]](item);
+      xyMinMax[0][0] = Math.min(xyMinMax[0][0], p[0]);
+      xyMinMax[1][0] = Math.min(xyMinMax[1][0], p[1]);
+      xyMinMax[0][1] = Math.max(xyMinMax[0][1], p[0]);
+      xyMinMax[1][1] = Math.max(xyMinMax[1][1], p[1]);
+      return p;
+    });
+    return {
+      values: values,
+      xyMinMax: xyMinMax
+    };
+  }
+};
+
+function axisConvert(axisNameIndex, to, coordSys, rangeOrCoordRange) {
+  var axis = coordSys.getAxis(['x', 'y'][axisNameIndex]);
+  var values = formatMinMax(map([0, 1], function (i) {
+    return to ? axis.coordToData(axis.toLocalCoord(rangeOrCoordRange[i])) : axis.toGlobalCoord(axis.dataToCoord(rangeOrCoordRange[i]));
+  }));
+  var xyMinMax = [];
+  xyMinMax[axisNameIndex] = values;
+  xyMinMax[1 - axisNameIndex] = [NaN, NaN];
+  return {
+    values: values,
+    xyMinMax: xyMinMax
+  };
+}
+
+var diffProcessor = {
+  lineX: curry$6(axisDiffProcessor, 0),
+  lineY: curry$6(axisDiffProcessor, 1),
+  rect: function (values, refer, scales) {
+    return [[values[0][0] - scales[0] * refer[0][0], values[0][1] - scales[0] * refer[0][1]], [values[1][0] - scales[1] * refer[1][0], values[1][1] - scales[1] * refer[1][1]]];
+  },
+  polygon: function (values, refer, scales) {
+    return map(values, function (item, idx) {
+      return [item[0] - scales[0] * refer[idx][0], item[1] - scales[1] * refer[idx][1]];
+    });
+  }
+};
+
+function axisDiffProcessor(axisNameIndex, values, refer, scales) {
+  return [values[0] - scales[axisNameIndex] * refer[0], values[1] - scales[axisNameIndex] * refer[1]];
+} // We have to process scale caused by dataZoom manually,
+// although it might be not accurate.
+
+
+function getScales(xyMinMaxCurr, xyMinMaxOrigin) {
+  var sizeCurr = getSize(xyMinMaxCurr);
+  var sizeOrigin = getSize(xyMinMaxOrigin);
+  var scales = [sizeCurr[0] / sizeOrigin[0], sizeCurr[1] / sizeOrigin[1]];
+  isNaN(scales[0]) && (scales[0] = 1);
+  isNaN(scales[1]) && (scales[1] = 1);
+  return scales;
+}
+
+function getSize(xyMinMax) {
+  return xyMinMax ? [xyMinMax[0][1] - xyMinMax[0][0], xyMinMax[1][1] - xyMinMax[1][0]] : [NaN, NaN];
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var STATE_LIST = ['inBrush', 'outOfBrush'];
+var DISPATCH_METHOD = '__ecBrushSelect';
+var DISPATCH_FLAG = '__ecInBrushSelectEvent';
+var PRIORITY_BRUSH = PRIORITY.VISUAL.BRUSH;
+/**
+ * Layout for visual, the priority higher than other layout, and before brush visual.
+ */
+
+registerLayout(PRIORITY_BRUSH, function (ecModel, api, payload) {
+  ecModel.eachComponent({
+    mainType: 'brush'
+  }, function (brushModel) {
+    payload && payload.type === 'takeGlobalCursor' && brushModel.setBrushOption(payload.key === 'brush' ? payload.brushOption : {
+      brushType: false
+    });
+    var brushTargetManager = brushModel.brushTargetManager = new BrushTargetManager(brushModel.option, ecModel);
+    brushTargetManager.setInputRanges(brushModel.areas, ecModel);
+  });
+});
+/**
+ * Register the visual encoding if this modules required.
+ */
+
+registerVisual(PRIORITY_BRUSH, function (ecModel, api, payload) {
+  var brushSelected = [];
+  var throttleType;
+  var throttleDelay;
+  ecModel.eachComponent({
+    mainType: 'brush'
+  }, function (brushModel, brushIndex) {
+    var thisBrushSelected = {
+      brushId: brushModel.id,
+      brushIndex: brushIndex,
+      brushName: brushModel.name,
+      areas: clone(brushModel.areas),
+      selected: []
+    }; // Every brush component exists in event params, convenient
+    // for user to find by index.
+
+    brushSelected.push(thisBrushSelected);
+    var brushOption = brushModel.option;
+    var brushLink = brushOption.brushLink;
+    var linkedSeriesMap = [];
+    var selectedDataIndexForLink = [];
+    var rangeInfoBySeries = [];
+    var hasBrushExists = 0;
+
+    if (!brushIndex) {
+      // Only the first throttle setting works.
+      throttleType = brushOption.throttleType;
+      throttleDelay = brushOption.throttleDelay;
+    } // Add boundingRect and selectors to range.
+
+
+    var areas = map(brushModel.areas, function (area) {
+      return bindSelector(defaults({
+        boundingRect: boundingRectBuilders[area.brushType](area)
+      }, area));
+    });
+    var visualMappings = createVisualMappings(brushModel.option, STATE_LIST, function (mappingOption) {
+      mappingOption.mappingMethod = 'fixed';
+    });
+    isArray(brushLink) && each$1(brushLink, function (seriesIndex) {
+      linkedSeriesMap[seriesIndex] = 1;
+    });
+
+    function linkOthers(seriesIndex) {
+      return brushLink === 'all' || linkedSeriesMap[seriesIndex];
+    } // If no supported brush or no brush on the series,
+    // all visuals should be in original state.
+
+
+    function brushed(rangeInfoList) {
+      return !!rangeInfoList.length;
+    }
+    /**
+     * Logic for each series: (If the logic has to be modified one day, do it carefully!)
+     *
+     * ( brushed 鈹� && 鈹琱asBrushExist 鈹� && linkOthers  ) => StepA: 鈹瑀ecord, 鈹� StepB: 鈹瑅isualByRecord.
+     *   !brushed鈹�    鈹渉asBrushExist 鈹�                            鈹攏othing,鈹�        鈹渧isualByRecord.
+     *                鈹�!hasBrushExist鈹�                                              鈹攏othing.
+     * ( !brushed  && 鈹琱asBrushExist 鈹� && linkOthers  ) => StepA:  nothing,  StepB: 鈹瑅isualByRecord.
+     *                鈹�!hasBrushExist鈹�                                              鈹攏othing.
+     * ( brushed 鈹� &&                     !linkOthers ) => StepA:  nothing,  StepB: 鈹瑅isualByCheck.
+     *   !brushed鈹�                                                                  鈹攏othing.
+     * ( !brushed  &&                     !linkOthers ) => StepA:  nothing,  StepB:  nothing.
+     */
+    // Step A
+
+
+    ecModel.eachSeries(function (seriesModel, seriesIndex) {
+      var rangeInfoList = rangeInfoBySeries[seriesIndex] = [];
+      seriesModel.subType === 'parallel' ? stepAParallel(seriesModel, seriesIndex, rangeInfoList) : stepAOthers(seriesModel, seriesIndex, rangeInfoList);
+    });
+
+    function stepAParallel(seriesModel, seriesIndex) {
+      var coordSys = seriesModel.coordinateSystem;
+      hasBrushExists |= coordSys.hasAxisBrushed();
+      linkOthers(seriesIndex) && coordSys.eachActiveState(seriesModel.getData(), function (activeState, dataIndex) {
+        activeState === 'active' && (selectedDataIndexForLink[dataIndex] = 1);
+      });
+    }
+
+    function stepAOthers(seriesModel, seriesIndex, rangeInfoList) {
+      var selectorsByBrushType = getSelectorsByBrushType(seriesModel);
+
+      if (!selectorsByBrushType || brushModelNotControll(brushModel, seriesIndex)) {
+        return;
+      }
+
+      each$1(areas, function (area) {
+        selectorsByBrushType[area.brushType] && brushModel.brushTargetManager.controlSeries(area, seriesModel, ecModel) && rangeInfoList.push(area);
+        hasBrushExists |= brushed(rangeInfoList);
+      });
+
+      if (linkOthers(seriesIndex) && brushed(rangeInfoList)) {
+        var data = seriesModel.getData();
+        data.each(function (dataIndex) {
+          if (checkInRange(selectorsByBrushType, rangeInfoList, data, dataIndex)) {
+            selectedDataIndexForLink[dataIndex] = 1;
+          }
+        });
+      }
+    } // Step B
+
+
+    ecModel.eachSeries(function (seriesModel, seriesIndex) {
+      var seriesBrushSelected = {
+        seriesId: seriesModel.id,
+        seriesIndex: seriesIndex,
+        seriesName: seriesModel.name,
+        dataIndex: []
+      }; // Every series exists in event params, convenient
+      // for user to find series by seriesIndex.
+
+      thisBrushSelected.selected.push(seriesBrushSelected);
+      var selectorsByBrushType = getSelectorsByBrushType(seriesModel);
+      var rangeInfoList = rangeInfoBySeries[seriesIndex];
+      var data = seriesModel.getData();
+      var getValueState = linkOthers(seriesIndex) ? function (dataIndex) {
+        return selectedDataIndexForLink[dataIndex] ? (seriesBrushSelected.dataIndex.push(data.getRawIndex(dataIndex)), 'inBrush') : 'outOfBrush';
+      } : function (dataIndex) {
+        return checkInRange(selectorsByBrushType, rangeInfoList, data, dataIndex) ? (seriesBrushSelected.dataIndex.push(data.getRawIndex(dataIndex)), 'inBrush') : 'outOfBrush';
+      }; // If no supported brush or no brush, all visuals are in original state.
+
+      (linkOthers(seriesIndex) ? hasBrushExists : brushed(rangeInfoList)) && applyVisual(STATE_LIST, visualMappings, data, getValueState);
+    });
+  });
+  dispatchAction$1(api, throttleType, throttleDelay, brushSelected, payload);
+});
+
+function dispatchAction$1(api, throttleType, throttleDelay, brushSelected, payload) {
+  // This event will not be triggered when `setOpion`, otherwise dead lock may
+  // triggered when do `setOption` in event listener, which we do not find
+  // satisfactory way to solve yet. Some considered resolutions:
+  // (a) Diff with prevoius selected data ant only trigger event when changed.
+  // But store previous data and diff precisely (i.e., not only by dataIndex, but
+  // also detect value changes in selected data) might bring complexity or fragility.
+  // (b) Use spectial param like `silent` to suppress event triggering.
+  // But such kind of volatile param may be weird in `setOption`.
+  if (!payload) {
+    return;
+  }
+
+  var zr = api.getZr();
+
+  if (zr[DISPATCH_FLAG]) {
+    return;
+  }
+
+  if (!zr[DISPATCH_METHOD]) {
+    zr[DISPATCH_METHOD] = doDispatch;
+  }
+
+  var fn = createOrUpdate(zr, DISPATCH_METHOD, throttleDelay, throttleType);
+  fn(api, brushSelected);
+}
+
+function doDispatch(api, brushSelected) {
+  if (!api.isDisposed()) {
+    var zr = api.getZr();
+    zr[DISPATCH_FLAG] = true;
+    api.dispatchAction({
+      type: 'brushSelect',
+      batch: brushSelected
+    });
+    zr[DISPATCH_FLAG] = false;
+  }
+}
+
+function checkInRange(selectorsByBrushType, rangeInfoList, data, dataIndex) {
+  for (var i = 0, len = rangeInfoList.length; i < len; i++) {
+    var area = rangeInfoList[i];
+
+    if (selectorsByBrushType[area.brushType](dataIndex, data, area.selectors, area)) {
+      return true;
+    }
+  }
+}
+
+function getSelectorsByBrushType(seriesModel) {
+  var brushSelector = seriesModel.brushSelector;
+
+  if (isString(brushSelector)) {
+    var sels = [];
+    each$1(selector, function (selectorsByElementType, brushType) {
+      sels[brushType] = function (dataIndex, data, selectors, area) {
+        var itemLayout = data.getItemLayout(dataIndex);
+        return selectorsByElementType[brushSelector](itemLayout, selectors, area);
+      };
+    });
+    return sels;
+  } else if (isFunction$1(brushSelector)) {
+    var bSelector = {};
+    each$1(selector, function (sel, brushType) {
+      bSelector[brushType] = brushSelector;
+    });
+    return bSelector;
+  }
+
+  return brushSelector;
+}
+
+function brushModelNotControll(brushModel, seriesIndex) {
+  var seriesIndices = brushModel.option.seriesIndex;
+  return seriesIndices != null && seriesIndices !== 'all' && (isArray(seriesIndices) ? indexOf(seriesIndices, seriesIndex) < 0 : seriesIndex !== seriesIndices);
+}
+
+function bindSelector(area) {
+  var selectors = area.selectors = {};
+  each$1(selector[area.brushType], function (selFn, elType) {
+    // Do not use function binding or curry for performance.
+    selectors[elType] = function (itemLayout) {
+      return selFn(itemLayout, selectors, area);
+    };
+  });
+  return area;
+}
+
+var boundingRectBuilders = {
+  lineX: noop,
+  lineY: noop,
+  rect: function (area) {
+    return getBoundingRectFromMinMax(area.range);
+  },
+  polygon: function (area) {
+    var minMax;
+    var range = area.range;
+
+    for (var i = 0, len = range.length; i < len; i++) {
+      minMax = minMax || [[Infinity, -Infinity], [Infinity, -Infinity]];
+      var rg = range[i];
+      rg[0] < minMax[0][0] && (minMax[0][0] = rg[0]);
+      rg[0] > minMax[0][1] && (minMax[0][1] = rg[0]);
+      rg[1] < minMax[1][0] && (minMax[1][0] = rg[1]);
+      rg[1] > minMax[1][1] && (minMax[1][1] = rg[1]);
+    }
+
+    return minMax && getBoundingRectFromMinMax(minMax);
+  }
+};
+
+function getBoundingRectFromMinMax(minMax) {
+  return new BoundingRect(minMax[0][0], minMax[1][0], minMax[0][1] - minMax[0][0], minMax[1][1] - minMax[1][0]);
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var DEFAULT_OUT_OF_BRUSH_COLOR = ['#ddd'];
+var BrushModel = extendComponentModel({
+  type: 'brush',
+  dependencies: ['geo', 'grid', 'xAxis', 'yAxis', 'parallel', 'series'],
+
+  /**
+   * @protected
+   */
+  defaultOption: {
+    // inBrush: null,
+    // outOfBrush: null,
+    toolbox: null,
+    // Default value see preprocessor.
+    brushLink: null,
+    // Series indices array, broadcast using dataIndex.
+    // or 'all', which means all series. 'none' or null means no series.
+    seriesIndex: 'all',
+    // seriesIndex array, specify series controlled by this brush component.
+    geoIndex: null,
+    //
+    xAxisIndex: null,
+    yAxisIndex: null,
+    brushType: 'rect',
+    // Default brushType, see BrushController.
+    brushMode: 'single',
+    // Default brushMode, 'single' or 'multiple'
+    transformable: true,
+    // Default transformable.
+    brushStyle: {
+      // Default brushStyle
+      borderWidth: 1,
+      color: 'rgba(120,140,180,0.3)',
+      borderColor: 'rgba(120,140,180,0.8)'
+    },
+    throttleType: 'fixRate',
+    // Throttle in brushSelected event. 'fixRate' or 'debounce'.
+    // If null, no throttle. Valid only in the first brush component
+    throttleDelay: 0,
+    // Unit: ms, 0 means every event will be triggered.
+    // FIXME
+    // 璇曢獙鏁堟灉
+    removeOnClick: true,
+    z: 10000
+  },
+
+  /**
+   * @readOnly
+   * @type {Array.<Object>}
+   */
+  areas: [],
+
+  /**
+   * Current activated brush type.
+   * If null, brush is inactived.
+   * see module:echarts/component/helper/BrushController
+   * @readOnly
+   * @type {string}
+   */
+  brushType: null,
+
+  /**
+   * Current brush opt.
+   * see module:echarts/component/helper/BrushController
+   * @readOnly
+   * @type {Object}
+   */
+  brushOption: {},
+
+  /**
+   * @readOnly
+   * @type {Array.<Object>}
+   */
+  coordInfoList: [],
+  optionUpdated: function (newOption, isInit) {
+    var thisOption = this.option;
+    !isInit && replaceVisualOption(thisOption, newOption, ['inBrush', 'outOfBrush']);
+    var inBrush = thisOption.inBrush = thisOption.inBrush || {}; // Always give default visual, consider setOption at the second time.
+
+    thisOption.outOfBrush = thisOption.outOfBrush || {
+      color: DEFAULT_OUT_OF_BRUSH_COLOR
+    };
+
+    if (!inBrush.hasOwnProperty('liftZ')) {
+      // Bigger than the highlight z lift, otherwise it will
+      // be effected by the highlight z when brush.
+      inBrush.liftZ = 5;
+    }
+  },
+
+  /**
+   * If ranges is null/undefined, range state remain.
+   *
+   * @param {Array.<Object>} [ranges]
+   */
+  setAreas: function (areas) {
+    // If ranges is null/undefined, range state remain.
+    // This helps user to dispatchAction({type: 'brush'}) with no areas
+    // set but just want to get the current brush select info from a `brush` event.
+    if (!areas) {
+      return;
+    }
+
+    this.areas = map(areas, function (area) {
+      return generateBrushOption(this.option, area);
+    }, this);
+  },
+
+  /**
+   * see module:echarts/component/helper/BrushController
+   * @param {Object} brushOption
+   */
+  setBrushOption: function (brushOption) {
+    this.brushOption = generateBrushOption(this.option, brushOption);
+    this.brushType = this.brushOption.brushType;
+  }
+});
+
+function generateBrushOption(option, brushOption) {
+  return merge({
+    brushType: option.brushType,
+    brushMode: option.brushMode,
+    transformable: option.transformable,
+    brushStyle: new Model(option.brushStyle).getItemStyle(),
+    removeOnClick: option.removeOnClick,
+    z: option.z
+  }, brushOption, true);
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+extendComponentView({
+  type: 'brush',
+  init: function (ecModel, api) {
+    /**
+     * @readOnly
+     * @type {module:echarts/model/Global}
+     */
+    this.ecModel = ecModel;
+    /**
+     * @readOnly
+     * @type {module:echarts/ExtensionAPI}
+     */
+
+    this.api = api;
+    /**
+     * @readOnly
+     * @type {module:echarts/component/brush/BrushModel}
+     */
+
+    this.model;
+    /**
+     * @private
+     * @type {module:echarts/component/helper/BrushController}
+     */
+
+    (this._brushController = new BrushController(api.getZr())).on('brush', bind(this._onBrush, this)).mount();
+  },
+
+  /**
+   * @override
+   */
+  render: function (brushModel) {
+    this.model = brushModel;
+    return updateController.apply(this, arguments);
+  },
+
+  /**
+   * @override
+   */
+  updateTransform: updateController,
+
+  /**
+   * @override
+   */
+  updateView: updateController,
+  // /**
+  //  * @override
+  //  */
+  // updateLayout: updateController,
+  // /**
+  //  * @override
+  //  */
+  // updateVisual: updateController,
+
+  /**
+   * @override
+   */
+  dispose: function () {
+    this._brushController.dispose();
+  },
+
+  /**
+   * @private
+   */
+  _onBrush: function (areas, opt) {
+    var modelId = this.model.id;
+    this.model.brushTargetManager.setOutputRanges(areas, this.ecModel); // Action is not dispatched on drag end, because the drag end
+    // emits the same params with the last drag move event, and
+    // may have some delay when using touch pad, which makes
+    // animation not smooth (when using debounce).
+
+    (!opt.isEnd || opt.removeOnClick) && this.api.dispatchAction({
+      type: 'brush',
+      brushId: modelId,
+      areas: clone(areas),
+      $from: modelId
+    });
+  }
+});
+
+function updateController(brushModel, ecModel, api, payload) {
+  // Do not update controller when drawing.
+  (!payload || payload.$from !== brushModel.id) && this._brushController.setPanels(brushModel.brushTargetManager.makePanelOpts(api)).enableBrush(brushModel.brushOption).updateCovers(brushModel.areas.slice());
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+/**
+ * payload: {
+ *      brushIndex: number, or,
+ *      brushId: string, or,
+ *      brushName: string,
+ *      globalRanges: Array
+ * }
+ */
+
+registerAction({
+  type: 'brush',
+  event: 'brush'
+  /*, update: 'updateView' */
+
+}, function (payload, ecModel) {
+  ecModel.eachComponent({
+    mainType: 'brush',
+    query: payload
+  }, function (brushModel) {
+    brushModel.setAreas(payload.areas);
+  });
+});
+/**
+ * payload: {
+ *      brushComponents: [
+ *          {
+ *              brushId,
+ *              brushIndex,
+ *              brushName,
+ *              series: [
+ *                  {
+ *                      seriesId,
+ *                      seriesIndex,
+ *                      seriesName,
+ *                      rawIndices: [21, 34, ...]
+ *                  },
+ *                  ...
+ *              ]
+ *          },
+ *          ...
+ *      ]
+ * }
+ */
+
+registerAction({
+  type: 'brushSelect',
+  event: 'brushSelected',
+  update: 'none'
+}, function () {});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var features = {};
+function register$2(name, ctor) {
+  features[name] = ctor;
+}
+function get$1(name) {
+  return features[name];
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var brushLang = lang.toolbox.brush;
+
+function Brush(model, ecModel, api) {
+  this.model = model;
+  this.ecModel = ecModel;
+  this.api = api;
+  /**
+   * @private
+   * @type {string}
+   */
+
+  this._brushType;
+  /**
+   * @private
+   * @type {string}
+   */
+
+  this._brushMode;
+}
+
+Brush.defaultOption = {
+  show: true,
+  type: ['rect', 'polygon', 'lineX', 'lineY', 'keep', 'clear'],
+  icon: {
+    /* eslint-disable */
+    rect: 'M7.3,34.7 M0.4,10V-0.2h9.8 M89.6,10V-0.2h-9.8 M0.4,60v10.2h9.8 M89.6,60v10.2h-9.8 M12.3,22.4V10.5h13.1 M33.6,10.5h7.8 M49.1,10.5h7.8 M77.5,22.4V10.5h-13 M12.3,31.1v8.2 M77.7,31.1v8.2 M12.3,47.6v11.9h13.1 M33.6,59.5h7.6 M49.1,59.5 h7.7 M77.5,47.6v11.9h-13',
+    // jshint ignore:line
+    polygon: 'M55.2,34.9c1.7,0,3.1,1.4,3.1,3.1s-1.4,3.1-3.1,3.1 s-3.1-1.4-3.1-3.1S53.5,34.9,55.2,34.9z M50.4,51c1.7,0,3.1,1.4,3.1,3.1c0,1.7-1.4,3.1-3.1,3.1c-1.7,0-3.1-1.4-3.1-3.1 C47.3,52.4,48.7,51,50.4,51z M55.6,37.1l1.5-7.8 M60.1,13.5l1.6-8.7l-7.8,4 M59,19l-1,5.3 M24,16.1l6.4,4.9l6.4-3.3 M48.5,11.6 l-5.9,3.1 M19.1,12.8L9.7,5.1l1.1,7.7 M13.4,29.8l1,7.3l6.6,1.6 M11.6,18.4l1,6.1 M32.8,41.9 M26.6,40.4 M27.3,40.2l6.1,1.6 M49.9,52.1l-5.6-7.6l-4.9-1.2',
+    // jshint ignore:line
+    lineX: 'M15.2,30 M19.7,15.6V1.9H29 M34.8,1.9H40.4 M55.3,15.6V1.9H45.9 M19.7,44.4V58.1H29 M34.8,58.1H40.4 M55.3,44.4 V58.1H45.9 M12.5,20.3l-9.4,9.6l9.6,9.8 M3.1,29.9h16.5 M62.5,20.3l9.4,9.6L62.3,39.7 M71.9,29.9H55.4',
+    // jshint ignore:line
+    lineY: 'M38.8,7.7 M52.7,12h13.2v9 M65.9,26.6V32 M52.7,46.3h13.2v-9 M24.9,12H11.8v9 M11.8,26.6V32 M24.9,46.3H11.8v-9 M48.2,5.1l-9.3-9l-9.4,9.2 M38.9-3.9V12 M48.2,53.3l-9.3,9l-9.4-9.2 M38.9,62.3V46.4',
+    // jshint ignore:line
+    keep: 'M4,10.5V1h10.3 M20.7,1h6.1 M33,1h6.1 M55.4,10.5V1H45.2 M4,17.3v6.6 M55.6,17.3v6.6 M4,30.5V40h10.3 M20.7,40 h6.1 M33,40h6.1 M55.4,30.5V40H45.2 M21,18.9h62.9v48.6H21V18.9z',
+    // jshint ignore:line
+    clear: 'M22,14.7l30.9,31 M52.9,14.7L22,45.7 M4.7,16.8V4.2h13.1 M26,4.2h7.8 M41.6,4.2h7.8 M70.3,16.8V4.2H57.2 M4.7,25.9v8.6 M70.3,25.9v8.6 M4.7,43.2v12.6h13.1 M26,55.8h7.8 M41.6,55.8h7.8 M70.3,43.2v12.6H57.2' // jshint ignore:line
+
+    /* eslint-enable */
+
+  },
+  // `rect`, `polygon`, `lineX`, `lineY`, `keep`, `clear`
+  title: clone(brushLang.title)
+};
+var proto$3 = Brush.prototype; // proto.updateLayout = function (featureModel, ecModel, api) {
+
+/* eslint-disable */
+
+proto$3.render =
+/* eslint-enable */
+proto$3.updateView = function (featureModel, ecModel, api) {
+  var brushType;
+  var brushMode;
+  var isBrushed;
+  ecModel.eachComponent({
+    mainType: 'brush'
+  }, function (brushModel) {
+    brushType = brushModel.brushType;
+    brushMode = brushModel.brushOption.brushMode || 'single';
+    isBrushed |= brushModel.areas.length;
+  });
+  this._brushType = brushType;
+  this._brushMode = brushMode;
+  each$1(featureModel.get('type', true), function (type) {
+    featureModel.setIconStatus(type, (type === 'keep' ? brushMode === 'multiple' : type === 'clear' ? isBrushed : type === brushType) ? 'emphasis' : 'normal');
+  });
+};
+
+proto$3.getIcons = function () {
+  var model = this.model;
+  var availableIcons = model.get('icon', true);
+  var icons = {};
+  each$1(model.get('type', true), function (type) {
+    if (availableIcons[type]) {
+      icons[type] = availableIcons[type];
+    }
+  });
+  return icons;
+};
+
+proto$3.onclick = function (ecModel, api, type) {
+  var brushType = this._brushType;
+  var brushMode = this._brushMode;
+
+  if (type === 'clear') {
+    // Trigger parallel action firstly
+    api.dispatchAction({
+      type: 'axisAreaSelect',
+      intervals: []
+    });
+    api.dispatchAction({
+      type: 'brush',
+      command: 'clear',
+      // Clear all areas of all brush components.
+      areas: []
+    });
+  } else {
+    api.dispatchAction({
+      type: 'takeGlobalCursor',
+      key: 'brush',
+      brushOption: {
+        brushType: type === 'keep' ? brushType : brushType === type ? false : type,
+        brushMode: type === 'keep' ? brushMode === 'multiple' ? 'single' : 'multiple' : brushMode
+      }
+    });
+  }
+};
+
+register$2('brush', Brush);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * Brush component entry
+ */
+registerPreprocessor(preprocessor$2);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var each$25 = each$1;
+var preprocessor$3 = function (option) {
+  var visualMap = option && option.visualMap;
+
+  if (!isArray(visualMap)) {
+    visualMap = visualMap ? [visualMap] : [];
+  }
+
+  each$25(visualMap, function (opt) {
+    if (!opt) {
+      return;
+    } // rename splitList to pieces
+
+
+    if (has$2(opt, 'splitList') && !has$2(opt, 'pieces')) {
+      opt.pieces = opt.splitList;
+      delete opt.splitList;
+    }
+
+    var pieces = opt.pieces;
+
+    if (pieces && isArray(pieces)) {
+      each$25(pieces, function (piece) {
+        if (isObject$1(piece)) {
+          if (has$2(piece, 'start') && !has$2(piece, 'min')) {
+            piece.min = piece.start;
+          }
+
+          if (has$2(piece, 'end') && !has$2(piece, 'max')) {
+            piece.max = piece.end;
+          }
+        }
+      });
+    }
+  });
+};
+
+function has$2(obj, name) {
+  return obj && obj.hasOwnProperty && obj.hasOwnProperty(name);
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+ComponentModel.registerSubTypeDefaulter('visualMap', function (option) {
+  // Compatible with ec2, when splitNumber === 0, continuous visualMap will be used.
+  return !option.categories && (!(option.pieces ? option.pieces.length > 0 : option.splitNumber > 0) || option.calculable) ? 'continuous' : 'piecewise';
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var VISUAL_PRIORITY = PRIORITY.VISUAL.COMPONENT;
+registerVisual(VISUAL_PRIORITY, {
+  createOnAllSeries: true,
+  reset: function (seriesModel, ecModel) {
+    var resetDefines = [];
+    ecModel.eachComponent('visualMap', function (visualMapModel) {
+      var pipelineContext = seriesModel.pipelineContext;
+
+      if (!visualMapModel.isTargetSeries(seriesModel) || pipelineContext && pipelineContext.large) {
+        return;
+      }
+
+      resetDefines.push(incrementalApplyVisual(visualMapModel.stateList, visualMapModel.targetVisuals, bind(visualMapModel.getValueState, visualMapModel), visualMapModel.getDataDimension(seriesModel.getData())));
+    });
+    return resetDefines;
+  }
+}); // Only support color.
+
+registerVisual(VISUAL_PRIORITY, {
+  createOnAllSeries: true,
+  reset: function (seriesModel, ecModel) {
+    var data = seriesModel.getData();
+    var visualMetaList = [];
+    ecModel.eachComponent('visualMap', function (visualMapModel) {
+      if (visualMapModel.isTargetSeries(seriesModel)) {
+        var visualMeta = visualMapModel.getVisualMeta(bind(getColorVisual, null, seriesModel, visualMapModel)) || {
+          stops: [],
+          outerColors: []
+        };
+        var concreteDim = visualMapModel.getDataDimension(data);
+        var dimInfo = data.getDimensionInfo(concreteDim);
+
+        if (dimInfo != null) {
+          // visualMeta.dimension should be dimension index, but not concrete dimension.
+          visualMeta.dimension = dimInfo.index;
+          visualMetaList.push(visualMeta);
+        }
+      }
+    }); // console.log(JSON.stringify(visualMetaList.map(a => a.stops)));
+
+    seriesModel.getData().setVisual('visualMeta', visualMetaList);
+  }
+}); // FIXME
+// performance and export for heatmap?
+// value can be Infinity or -Infinity
+
+function getColorVisual(seriesModel, visualMapModel, value, valueState) {
+  var mappings = visualMapModel.targetVisuals[valueState];
+  var visualTypes = VisualMapping.prepareVisualTypes(mappings);
+  var resultVisual = {
+    color: seriesModel.getData().getVisual('color') // default color.
+
+  };
+
+  for (var i = 0, len = visualTypes.length; i < len; i++) {
+    var type = visualTypes[i];
+    var mapping = mappings[type === 'opacity' ? '__alphaForOpacity' : type];
+    mapping && mapping.applyVisual(value, getVisual, setVisual);
+  }
+
+  return resultVisual.color;
+
+  function getVisual(key) {
+    return resultVisual[key];
+  }
+
+  function setVisual(key, value) {
+    resultVisual[key] = value;
+  }
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * @file Visual mapping.
+ */
+var visualDefault = {
+  /**
+   * @public
+   */
+  get: function (visualType, key, isCategory) {
+    var value = clone((defaultOption$3[visualType] || {})[key]);
+    return isCategory ? isArray(value) ? value[value.length - 1] : value : value;
+  }
+};
+var defaultOption$3 = {
+  color: {
+    active: ['#006edd', '#e0ffff'],
+    inactive: ['rgba(0,0,0,0)']
+  },
+  colorHue: {
+    active: [0, 360],
+    inactive: [0, 0]
+  },
+  colorSaturation: {
+    active: [0.3, 1],
+    inactive: [0, 0]
+  },
+  colorLightness: {
+    active: [0.9, 0.5],
+    inactive: [0, 0]
+  },
+  colorAlpha: {
+    active: [0.3, 1],
+    inactive: [0, 0]
+  },
+  opacity: {
+    active: [0.3, 1],
+    inactive: [0, 0]
+  },
+  symbol: {
+    active: ['circle', 'roundRect', 'diamond'],
+    inactive: ['none']
+  },
+  symbolSize: {
+    active: [10, 50],
+    inactive: [0, 0]
+  }
+};
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var mapVisual$2 = VisualMapping.mapVisual;
+var eachVisual = VisualMapping.eachVisual;
+var isArray$3 = isArray;
+var each$26 = each$1;
+var asc$3 = asc;
+var linearMap$2 = linearMap;
+var noop$2 = noop;
+var VisualMapModel = extendComponentModel({
+  type: 'visualMap',
+  dependencies: ['series'],
+
+  /**
+   * @readOnly
+   * @type {Array.<string>}
+   */
+  stateList: ['inRange', 'outOfRange'],
+
+  /**
+   * @readOnly
+   * @type {Array.<string>}
+   */
+  replacableOptionKeys: ['inRange', 'outOfRange', 'target', 'controller', 'color'],
+
+  /**
+   * [lowerBound, upperBound]
+   *
+   * @readOnly
+   * @type {Array.<number>}
+   */
+  dataBound: [-Infinity, Infinity],
+
+  /**
+   * @readOnly
+   * @type {string|Object}
+   */
+  layoutMode: {
+    type: 'box',
+    ignoreSize: true
+  },
+
+  /**
+   * @protected
+   */
+  defaultOption: {
+    show: true,
+    zlevel: 0,
+    z: 4,
+    seriesIndex: 'all',
+    // 'all' or null/undefined: all series.
+    // A number or an array of number: the specified series.
+    // set min: 0, max: 200, only for campatible with ec2.
+    // In fact min max should not have default value.
+    min: 0,
+    // min value, must specified if pieces is not specified.
+    max: 200,
+    // max value, must specified if pieces is not specified.
+    dimension: null,
+    inRange: null,
+    // 'color', 'colorHue', 'colorSaturation', 'colorLightness', 'colorAlpha',
+    // 'symbol', 'symbolSize'
+    outOfRange: null,
+    // 'color', 'colorHue', 'colorSaturation',
+    // 'colorLightness', 'colorAlpha',
+    // 'symbol', 'symbolSize'
+    left: 0,
+    // 'center' 娄 'left' 娄 'right' 娄 {number} (px)
+    right: null,
+    // The same as left.
+    top: null,
+    // 'top' 娄 'bottom' 娄 'center' 娄 {number} (px)
+    bottom: 0,
+    // The same as top.
+    itemWidth: null,
+    itemHeight: null,
+    inverse: false,
+    orient: 'vertical',
+    // 'horizontal' 娄 'vertical'
+    backgroundColor: 'rgba(0,0,0,0)',
+    borderColor: '#ccc',
+    // 鍊煎煙杈规棰滆壊
+    contentColor: '#5793f3',
+    inactiveColor: '#aaa',
+    borderWidth: 0,
+    // 鍊煎煙杈规绾垮锛屽崟浣峱x锛岄粯璁や负0锛堟棤杈规锛�
+    padding: 5,
+    // 鍊煎煙鍐呰竟璺濓紝鍗曚綅px锛岄粯璁ゅ悇鏂瑰悜鍐呰竟璺濅负5锛�
+    // 鎺ュ彈鏁扮粍鍒嗗埆璁惧畾涓婂彸涓嬪乏杈硅窛锛屽悓css
+    textGap: 10,
+    //
+    precision: 0,
+    // 灏忔暟绮惧害锛岄粯璁や负0锛屾棤灏忔暟鐐�
+    color: null,
+    //棰滆壊锛坉eprecated锛屽吋瀹筫c2锛岄『搴忓悓pieces锛屼笉鍚屼簬inRange/outOfRange锛�
+    formatter: null,
+    text: null,
+    // 鏂囨湰锛屽['楂�', '浣�']锛屽吋瀹筫c2锛宼ext[0]瀵瑰簲楂樺�硷紝text[1]瀵瑰簲浣庡��
+    textStyle: {
+      color: '#333' // 鍊煎煙鏂囧瓧棰滆壊
+
+    }
+  },
+
+  /**
+   * @protected
+   */
+  init: function (option, parentModel, ecModel) {
+    /**
+     * @private
+     * @type {Array.<number>}
+     */
+    this._dataExtent;
+    /**
+     * @readOnly
+     */
+
+    this.targetVisuals = {};
+    /**
+     * @readOnly
+     */
+
+    this.controllerVisuals = {};
+    /**
+     * @readOnly
+     */
+
+    this.textStyleModel;
+    /**
+     * [width, height]
+     * @readOnly
+     * @type {Array.<number>}
+     */
+
+    this.itemSize;
+    this.mergeDefaultAndTheme(option, ecModel);
+  },
+
+  /**
+   * @protected
+   */
+  optionUpdated: function (newOption, isInit) {
+    var thisOption = this.option; // FIXME
+    // necessary?
+    // Disable realtime view update if canvas is not supported.
+
+    if (!env$1.canvasSupported) {
+      thisOption.realtime = false;
+    }
+
+    !isInit && replaceVisualOption(thisOption, newOption, this.replacableOptionKeys);
+    this.textStyleModel = this.getModel('textStyle');
+    this.resetItemSize();
+    this.completeVisualOption();
+  },
+
+  /**
+   * @protected
+   */
+  resetVisual: function (supplementVisualOption) {
+    var stateList = this.stateList;
+    supplementVisualOption = bind(supplementVisualOption, this);
+    this.controllerVisuals = createVisualMappings(this.option.controller, stateList, supplementVisualOption);
+    this.targetVisuals = createVisualMappings(this.option.target, stateList, supplementVisualOption);
+  },
+
+  /**
+   * @protected
+   * @return {Array.<number>} An array of series indices.
+   */
+  getTargetSeriesIndices: function () {
+    var optionSeriesIndex = this.option.seriesIndex;
+    var seriesIndices = [];
+
+    if (optionSeriesIndex == null || optionSeriesIndex === 'all') {
+      this.ecModel.eachSeries(function (seriesModel, index) {
+        seriesIndices.push(index);
+      });
+    } else {
+      seriesIndices = normalizeToArray(optionSeriesIndex);
+    }
+
+    return seriesIndices;
+  },
+
+  /**
+   * @public
+   */
+  eachTargetSeries: function (callback, context) {
+    each$1(this.getTargetSeriesIndices(), function (seriesIndex) {
+      callback.call(context, this.ecModel.getSeriesByIndex(seriesIndex));
+    }, this);
+  },
+
+  /**
+   * @pubilc
+   */
+  isTargetSeries: function (seriesModel) {
+    var is = false;
+    this.eachTargetSeries(function (model) {
+      model === seriesModel && (is = true);
+    });
+    return is;
+  },
+
+  /**
+   * @example
+   * this.formatValueText(someVal); // format single numeric value to text.
+   * this.formatValueText(someVal, true); // format single category value to text.
+   * this.formatValueText([min, max]); // format numeric min-max to text.
+   * this.formatValueText([this.dataBound[0], max]); // using data lower bound.
+   * this.formatValueText([min, this.dataBound[1]]); // using data upper bound.
+   *
+   * @param {number|Array.<number>} value Real value, or this.dataBound[0 or 1].
+   * @param {boolean} [isCategory=false] Only available when value is number.
+   * @param {Array.<string>} edgeSymbols Open-close symbol when value is interval.
+   * @return {string}
+   * @protected
+   */
+  formatValueText: function (value, isCategory, edgeSymbols) {
+    var option = this.option;
+    var precision = option.precision;
+    var dataBound = this.dataBound;
+    var formatter = option.formatter;
+    var isMinMax;
+    var textValue;
+    edgeSymbols = edgeSymbols || ['<', '>'];
+
+    if (isArray(value)) {
+      value = value.slice();
+      isMinMax = true;
+    }
+
+    textValue = isCategory ? value : isMinMax ? [toFixed(value[0]), toFixed(value[1])] : toFixed(value);
+
+    if (isString(formatter)) {
+      return formatter.replace('{value}', isMinMax ? textValue[0] : textValue).replace('{value2}', isMinMax ? textValue[1] : textValue);
+    } else if (isFunction$1(formatter)) {
+      return isMinMax ? formatter(value[0], value[1]) : formatter(value);
+    }
+
+    if (isMinMax) {
+      if (value[0] === dataBound[0]) {
+        return edgeSymbols[0] + ' ' + textValue[1];
+      } else if (value[1] === dataBound[1]) {
+        return edgeSymbols[1] + ' ' + textValue[0];
+      } else {
+        return textValue[0] + ' - ' + textValue[1];
+      }
+    } else {
+      // Format single value (includes category case).
+      return textValue;
+    }
+
+    function toFixed(val) {
+      return val === dataBound[0] ? 'min' : val === dataBound[1] ? 'max' : (+val).toFixed(Math.min(precision, 20));
+    }
+  },
+
+  /**
+   * @protected
+   */
+  resetExtent: function () {
+    var thisOption = this.option; // Can not calculate data extent by data here.
+    // Because series and data may be modified in processing stage.
+    // So we do not support the feature "auto min/max".
+
+    var extent = asc$3([thisOption.min, thisOption.max]);
+    this._dataExtent = extent;
+  },
+
+  /**
+   * @public
+   * @param {module:echarts/data/List} list
+   * @return {string} Concrete dimention. If return null/undefined,
+   *                  no dimension used.
+   */
+  getDataDimension: function (list) {
+    var optDim = this.option.dimension;
+    var listDimensions = list.dimensions;
+
+    if (optDim == null && !listDimensions.length) {
+      return;
+    }
+
+    if (optDim != null) {
+      return list.getDimension(optDim);
+    }
+
+    var dimNames = list.dimensions;
+
+    for (var i = dimNames.length - 1; i >= 0; i--) {
+      var dimName = dimNames[i];
+      var dimInfo = list.getDimensionInfo(dimName);
+
+      if (!dimInfo.isCalculationCoord) {
+        return dimName;
+      }
+    }
+  },
+
+  /**
+   * @public
+   * @override
+   */
+  getExtent: function () {
+    return this._dataExtent.slice();
+  },
+
+  /**
+   * @protected
+   */
+  completeVisualOption: function () {
+    var ecModel = this.ecModel;
+    var thisOption = this.option;
+    var base = {
+      inRange: thisOption.inRange,
+      outOfRange: thisOption.outOfRange
+    };
+    var target = thisOption.target || (thisOption.target = {});
+    var controller = thisOption.controller || (thisOption.controller = {});
+    merge(target, base); // Do not override
+
+    merge(controller, base); // Do not override
+
+    var isCategory = this.isCategory();
+    completeSingle.call(this, target);
+    completeSingle.call(this, controller);
+    completeInactive.call(this, target, 'inRange', 'outOfRange'); // completeInactive.call(this, target, 'outOfRange', 'inRange');
+
+    completeController.call(this, controller);
+
+    function completeSingle(base) {
+      // Compatible with ec2 dataRange.color.
+      // The mapping order of dataRange.color is: [high value, ..., low value]
+      // whereas inRange.color and outOfRange.color is [low value, ..., high value]
+      // Notice: ec2 has no inverse.
+      if (isArray$3(thisOption.color) // If there has been inRange: {symbol: ...}, adding color is a mistake.
+      // So adding color only when no inRange defined.
+      && !base.inRange) {
+        base.inRange = {
+          color: thisOption.color.slice().reverse()
+        };
+      } // Compatible with previous logic, always give a defautl color, otherwise
+      // simple config with no inRange and outOfRange will not work.
+      // Originally we use visualMap.color as the default color, but setOption at
+      // the second time the default color will be erased. So we change to use
+      // constant DEFAULT_COLOR.
+      // If user do not want the defualt color, set inRange: {color: null}.
+
+
+      base.inRange = base.inRange || {
+        color: ecModel.get('gradientColor')
+      }; // If using shortcut like: {inRange: 'symbol'}, complete default value.
+
+      each$26(this.stateList, function (state) {
+        var visualType = base[state];
+
+        if (isString(visualType)) {
+          var defa = visualDefault.get(visualType, 'active', isCategory);
+
+          if (defa) {
+            base[state] = {};
+            base[state][visualType] = defa;
+          } else {
+            // Mark as not specified.
+            delete base[state];
+          }
+        }
+      }, this);
+    }
+
+    function completeInactive(base, stateExist, stateAbsent) {
+      var optExist = base[stateExist];
+      var optAbsent = base[stateAbsent];
+
+      if (optExist && !optAbsent) {
+        optAbsent = base[stateAbsent] = {};
+        each$26(optExist, function (visualData, visualType) {
+          if (!VisualMapping.isValidType(visualType)) {
+            return;
+          }
+
+          var defa = visualDefault.get(visualType, 'inactive', isCategory);
+
+          if (defa != null) {
+            optAbsent[visualType] = defa; // Compatibable with ec2:
+            // Only inactive color to rgba(0,0,0,0) can not
+            // make label transparent, so use opacity also.
+
+            if (visualType === 'color' && !optAbsent.hasOwnProperty('opacity') && !optAbsent.hasOwnProperty('colorAlpha')) {
+              optAbsent.opacity = [0, 0];
+            }
+          }
+        });
+      }
+    }
+
+    function completeController(controller) {
+      var symbolExists = (controller.inRange || {}).symbol || (controller.outOfRange || {}).symbol;
+      var symbolSizeExists = (controller.inRange || {}).symbolSize || (controller.outOfRange || {}).symbolSize;
+      var inactiveColor = this.get('inactiveColor');
+      each$26(this.stateList, function (state) {
+        var itemSize = this.itemSize;
+        var visuals = controller[state]; // Set inactive color for controller if no other color
+        // attr (like colorAlpha) specified.
+
+        if (!visuals) {
+          visuals = controller[state] = {
+            color: isCategory ? inactiveColor : [inactiveColor]
+          };
+        } // Consistent symbol and symbolSize if not specified.
+
+
+        if (visuals.symbol == null) {
+          visuals.symbol = symbolExists && clone(symbolExists) || (isCategory ? 'roundRect' : ['roundRect']);
+        }
+
+        if (visuals.symbolSize == null) {
+          visuals.symbolSize = symbolSizeExists && clone(symbolSizeExists) || (isCategory ? itemSize[0] : [itemSize[0], itemSize[0]]);
+        } // Filter square and none.
+
+
+        visuals.symbol = mapVisual$2(visuals.symbol, function (symbol) {
+          return symbol === 'none' || symbol === 'square' ? 'roundRect' : symbol;
+        }); // Normalize symbolSize
+
+        var symbolSize = visuals.symbolSize;
+
+        if (symbolSize != null) {
+          var max = -Infinity; // symbolSize can be object when categories defined.
+
+          eachVisual(symbolSize, function (value) {
+            value > max && (max = value);
+          });
+          visuals.symbolSize = mapVisual$2(symbolSize, function (value) {
+            return linearMap$2(value, [0, max], [0, itemSize[0]], true);
+          });
+        }
+      }, this);
+    }
+  },
+
+  /**
+   * @protected
+   */
+  resetItemSize: function () {
+    this.itemSize = [parseFloat(this.get('itemWidth')), parseFloat(this.get('itemHeight'))];
+  },
+
+  /**
+   * @public
+   */
+  isCategory: function () {
+    return !!this.option.categories;
+  },
+
+  /**
+   * @public
+   * @abstract
+   */
+  setSelected: noop$2,
+
+  /**
+   * @public
+   * @abstract
+   * @param {*|module:echarts/data/List} valueOrData
+   * @param {number} dataIndex
+   * @return {string} state See this.stateList
+   */
+  getValueState: noop$2,
+
+  /**
+   * FIXME
+   * Do not publish to thirt-part-dev temporarily
+   * util the interface is stable. (Should it return
+   * a function but not visual meta?)
+   *
+   * @pubilc
+   * @abstract
+   * @param {Function} getColorVisual
+   *        params: value, valueState
+   *        return: color
+   * @return {Object} visualMeta
+   *        should includes {stops, outerColors}
+   *        outerColor means [colorBeyondMinValue, colorBeyondMaxValue]
+   */
+  getVisualMeta: noop$2
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var DEFAULT_BAR_BOUND = [20, 140];
+var ContinuousModel = VisualMapModel.extend({
+  type: 'visualMap.continuous',
+
+  /**
+   * @protected
+   */
+  defaultOption: {
+    align: 'auto',
+    // 'auto', 'left', 'right', 'top', 'bottom'
+    calculable: false,
+    // This prop effect default component type determine,
+    // See echarts/component/visualMap/typeDefaulter.
+    range: null,
+    // selected range. In default case `range` is [min, max]
+    // and can auto change along with modification of min max,
+    // util use specifid a range.
+    realtime: true,
+    // Whether realtime update.
+    itemHeight: null,
+    // The length of the range control edge.
+    itemWidth: null,
+    // The length of the other side.
+    hoverLink: true,
+    // Enable hover highlight.
+    hoverLinkDataSize: null,
+    // The size of hovered data.
+    hoverLinkOnHandle: null // Whether trigger hoverLink when hover handle.
+    // If not specified, follow the value of `realtime`.
+
+  },
+
+  /**
+   * @override
+   */
+  optionUpdated: function (newOption, isInit) {
+    ContinuousModel.superApply(this, 'optionUpdated', arguments);
+    this.resetExtent();
+    this.resetVisual(function (mappingOption) {
+      mappingOption.mappingMethod = 'linear';
+      mappingOption.dataExtent = this.getExtent();
+    });
+
+    this._resetRange();
+  },
+
+  /**
+   * @protected
+   * @override
+   */
+  resetItemSize: function () {
+    ContinuousModel.superApply(this, 'resetItemSize', arguments);
+    var itemSize = this.itemSize;
+    this._orient === 'horizontal' && itemSize.reverse();
+    (itemSize[0] == null || isNaN(itemSize[0])) && (itemSize[0] = DEFAULT_BAR_BOUND[0]);
+    (itemSize[1] == null || isNaN(itemSize[1])) && (itemSize[1] = DEFAULT_BAR_BOUND[1]);
+  },
+
+  /**
+   * @private
+   */
+  _resetRange: function () {
+    var dataExtent = this.getExtent();
+    var range = this.option.range;
+
+    if (!range || range.auto) {
+      // `range` should always be array (so we dont use other
+      // value like 'auto') for user-friend. (consider getOption).
+      dataExtent.auto = 1;
+      this.option.range = dataExtent;
+    } else if (isArray(range)) {
+      if (range[0] > range[1]) {
+        range.reverse();
+      }
+
+      range[0] = Math.max(range[0], dataExtent[0]);
+      range[1] = Math.min(range[1], dataExtent[1]);
+    }
+  },
+
+  /**
+   * @protected
+   * @override
+   */
+  completeVisualOption: function () {
+    VisualMapModel.prototype.completeVisualOption.apply(this, arguments);
+    each$1(this.stateList, function (state) {
+      var symbolSize = this.option.controller[state].symbolSize;
+
+      if (symbolSize && symbolSize[0] !== symbolSize[1]) {
+        symbolSize[0] = 0; // For good looking.
+      }
+    }, this);
+  },
+
+  /**
+   * @override
+   */
+  setSelected: function (selected) {
+    this.option.range = selected.slice();
+
+    this._resetRange();
+  },
+
+  /**
+   * @public
+   */
+  getSelected: function () {
+    var dataExtent = this.getExtent();
+    var dataInterval = asc((this.get('range') || []).slice()); // Clamp
+
+    dataInterval[0] > dataExtent[1] && (dataInterval[0] = dataExtent[1]);
+    dataInterval[1] > dataExtent[1] && (dataInterval[1] = dataExtent[1]);
+    dataInterval[0] < dataExtent[0] && (dataInterval[0] = dataExtent[0]);
+    dataInterval[1] < dataExtent[0] && (dataInterval[1] = dataExtent[0]);
+    return dataInterval;
+  },
+
+  /**
+   * @override
+   */
+  getValueState: function (value) {
+    var range = this.option.range;
+    var dataExtent = this.getExtent(); // When range[0] === dataExtent[0], any value larger than dataExtent[0] maps to 'inRange'.
+    // range[1] is processed likewise.
+
+    return (range[0] <= dataExtent[0] || range[0] <= value) && (range[1] >= dataExtent[1] || value <= range[1]) ? 'inRange' : 'outOfRange';
+  },
+
+  /**
+   * @params {Array.<number>} range target value: range[0] <= value && value <= range[1]
+   * @return {Array.<Object>} [{seriesId, dataIndices: <Array.<number>>}, ...]
+   */
+  findTargetDataIndices: function (range) {
+    var result = [];
+    this.eachTargetSeries(function (seriesModel) {
+      var dataIndices = [];
+      var data = seriesModel.getData();
+      data.each(this.getDataDimension(data), function (value, dataIndex) {
+        range[0] <= value && value <= range[1] && dataIndices.push(dataIndex);
+      }, this);
+      result.push({
+        seriesId: seriesModel.id,
+        dataIndex: dataIndices
+      });
+    }, this);
+    return result;
+  },
+
+  /**
+   * @implement
+   */
+  getVisualMeta: function (getColorVisual) {
+    var oVals = getColorStopValues(this, 'outOfRange', this.getExtent());
+    var iVals = getColorStopValues(this, 'inRange', this.option.range.slice());
+    var stops = [];
+
+    function setStop(value, valueState) {
+      stops.push({
+        value: value,
+        color: getColorVisual(value, valueState)
+      });
+    } // Format to: outOfRange -- inRange -- outOfRange.
+
+
+    var iIdx = 0;
+    var oIdx = 0;
+    var iLen = iVals.length;
+    var oLen = oVals.length;
+
+    for (; oIdx < oLen && (!iVals.length || oVals[oIdx] <= iVals[0]); oIdx++) {
+      // If oVal[oIdx] === iVals[iIdx], oVal[oIdx] should be ignored.
+      if (oVals[oIdx] < iVals[iIdx]) {
+        setStop(oVals[oIdx], 'outOfRange');
+      }
+    }
+
+    for (var first = 1; iIdx < iLen; iIdx++, first = 0) {
+      // If range is full, value beyond min, max will be clamped.
+      // make a singularity
+      first && stops.length && setStop(iVals[iIdx], 'outOfRange');
+      setStop(iVals[iIdx], 'inRange');
+    }
+
+    for (var first = 1; oIdx < oLen; oIdx++) {
+      if (!iVals.length || iVals[iVals.length - 1] < oVals[oIdx]) {
+        // make a singularity
+        if (first) {
+          stops.length && setStop(stops[stops.length - 1].value, 'outOfRange');
+          first = 0;
+        }
+
+        setStop(oVals[oIdx], 'outOfRange');
+      }
+    }
+
+    var stopsLen = stops.length;
+    return {
+      stops: stops,
+      outerColors: [stopsLen ? stops[0].color : 'transparent', stopsLen ? stops[stopsLen - 1].color : 'transparent']
+    };
+  }
+});
+
+function getColorStopValues(visualMapModel, valueState, dataExtent) {
+  if (dataExtent[0] === dataExtent[1]) {
+    return dataExtent.slice();
+  } // When using colorHue mapping, it is not linear color any more.
+  // Moreover, canvas gradient seems not to be accurate linear.
+  // FIXME
+  // Should be arbitrary value 100? or based on pixel size?
+
+
+  var count = 200;
+  var step = (dataExtent[1] - dataExtent[0]) / count;
+  var value = dataExtent[0];
+  var stopValues = [];
+
+  for (var i = 0; i <= count && value < dataExtent[1]; i++) {
+    stopValues.push(value);
+    value += step;
+  }
+
+  stopValues.push(dataExtent[1]);
+  return stopValues;
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var VisualMapView = extendComponentView({
+  type: 'visualMap',
+
+  /**
+   * @readOnly
+   * @type {Object}
+   */
+  autoPositionValues: {
+    left: 1,
+    right: 1,
+    top: 1,
+    bottom: 1
+  },
+  init: function (ecModel, api) {
+    /**
+     * @readOnly
+     * @type {module:echarts/model/Global}
+     */
+    this.ecModel = ecModel;
+    /**
+     * @readOnly
+     * @type {module:echarts/ExtensionAPI}
+     */
+
+    this.api = api;
+    /**
+     * @readOnly
+     * @type {module:echarts/component/visualMap/visualMapModel}
+     */
+
+    this.visualMapModel;
+  },
+
+  /**
+   * @protected
+   */
+  render: function (visualMapModel, ecModel, api, payload) {
+    this.visualMapModel = visualMapModel;
+
+    if (visualMapModel.get('show') === false) {
+      this.group.removeAll();
+      return;
+    }
+
+    this.doRender.apply(this, arguments);
+  },
+
+  /**
+   * @protected
+   */
+  renderBackground: function (group) {
+    var visualMapModel = this.visualMapModel;
+    var padding = normalizeCssArray$1(visualMapModel.get('padding') || 0);
+    var rect = group.getBoundingRect();
+    group.add(new Rect({
+      z2: -1,
+      // Lay background rect on the lowest layer.
+      silent: true,
+      shape: {
+        x: rect.x - padding[3],
+        y: rect.y - padding[0],
+        width: rect.width + padding[3] + padding[1],
+        height: rect.height + padding[0] + padding[2]
+      },
+      style: {
+        fill: visualMapModel.get('backgroundColor'),
+        stroke: visualMapModel.get('borderColor'),
+        lineWidth: visualMapModel.get('borderWidth')
+      }
+    }));
+  },
+
+  /**
+   * @protected
+   * @param {number} targetValue can be Infinity or -Infinity
+   * @param {string=} visualCluster Only can be 'color' 'opacity' 'symbol' 'symbolSize'
+   * @param {Object} [opts]
+   * @param {string=} [opts.forceState] Specify state, instead of using getValueState method.
+   * @param {string=} [opts.convertOpacityToAlpha=false] For color gradient in controller widget.
+   * @return {*} Visual value.
+   */
+  getControllerVisual: function (targetValue, visualCluster, opts) {
+    opts = opts || {};
+    var forceState = opts.forceState;
+    var visualMapModel = this.visualMapModel;
+    var visualObj = {}; // Default values.
+
+    if (visualCluster === 'symbol') {
+      visualObj.symbol = visualMapModel.get('itemSymbol');
+    }
+
+    if (visualCluster === 'color') {
+      var defaultColor = visualMapModel.get('contentColor');
+      visualObj.color = defaultColor;
+    }
+
+    function getter(key) {
+      return visualObj[key];
+    }
+
+    function setter(key, value) {
+      visualObj[key] = value;
+    }
+
+    var mappings = visualMapModel.controllerVisuals[forceState || visualMapModel.getValueState(targetValue)];
+    var visualTypes = VisualMapping.prepareVisualTypes(mappings);
+    each$1(visualTypes, function (type) {
+      var visualMapping = mappings[type];
+
+      if (opts.convertOpacityToAlpha && type === 'opacity') {
+        type = 'colorAlpha';
+        visualMapping = mappings.__alphaForOpacity;
+      }
+
+      if (VisualMapping.dependsOn(type, visualCluster)) {
+        visualMapping && visualMapping.applyVisual(targetValue, getter, setter);
+      }
+    });
+    return visualObj[visualCluster];
+  },
+
+  /**
+   * @protected
+   */
+  positionGroup: function (group) {
+    var model = this.visualMapModel;
+    var api = this.api;
+    positionElement(group, model.getBoxLayoutParams(), {
+      width: api.getWidth(),
+      height: api.getHeight()
+    });
+  },
+
+  /**
+   * @protected
+   * @abstract
+   */
+  doRender: noop
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+/**
+ * @param {module:echarts/component/visualMap/VisualMapModel} visualMapModel\
+ * @param {module:echarts/ExtensionAPI} api
+ * @param {Array.<number>} itemSize always [short, long]
+ * @return {string} 'left' or 'right' or 'top' or 'bottom'
+ */
+
+function getItemAlign(visualMapModel, api, itemSize) {
+  var modelOption = visualMapModel.option;
+  var itemAlign = modelOption.align;
+
+  if (itemAlign != null && itemAlign !== 'auto') {
+    return itemAlign;
+  } // Auto decision align.
+
+
+  var ecSize = {
+    width: api.getWidth(),
+    height: api.getHeight()
+  };
+  var realIndex = modelOption.orient === 'horizontal' ? 1 : 0;
+  var paramsSet = [['left', 'right', 'width'], ['top', 'bottom', 'height']];
+  var reals = paramsSet[realIndex];
+  var fakeValue = [0, null, 10];
+  var layoutInput = {};
+
+  for (var i = 0; i < 3; i++) {
+    layoutInput[paramsSet[1 - realIndex][i]] = fakeValue[i];
+    layoutInput[reals[i]] = i === 2 ? itemSize[0] : modelOption[reals[i]];
+  }
+
+  var rParam = [['x', 'width', 3], ['y', 'height', 0]][realIndex];
+  var rect = getLayoutRect(layoutInput, ecSize, modelOption.padding);
+  return reals[(rect.margin[rParam[2]] || 0) + rect[rParam[0]] + rect[rParam[1]] * 0.5 < ecSize[rParam[1]] * 0.5 ? 0 : 1];
+}
+/**
+ * Prepare dataIndex for outside usage, where dataIndex means rawIndex, and
+ * dataIndexInside means filtered index.
+ */
+
+function convertDataIndex(batch) {
+  each$1(batch || [], function (batchItem) {
+    if (batch.dataIndex != null) {
+      batch.dataIndexInside = batch.dataIndex;
+      batch.dataIndex = null;
+    }
+  });
+  return batch;
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var linearMap$3 = linearMap;
+var each$27 = each$1;
+var mathMin$7 = Math.min;
+var mathMax$7 = Math.max; // Arbitrary value
+
+var HOVER_LINK_SIZE = 12;
+var HOVER_LINK_OUT = 6; // Notice:
+// Any "interval" should be by the order of [low, high].
+// "handle0" (handleIndex === 0) maps to
+// low data value: this._dataInterval[0] and has low coord.
+// "handle1" (handleIndex === 1) maps to
+// high data value: this._dataInterval[1] and has high coord.
+// The logic of transform is implemented in this._createBarGroup.
+
+var ContinuousView = VisualMapView.extend({
+  type: 'visualMap.continuous',
+
+  /**
+   * @override
+   */
+  init: function () {
+    ContinuousView.superApply(this, 'init', arguments);
+    /**
+     * @private
+     */
+
+    this._shapes = {};
+    /**
+     * @private
+     */
+
+    this._dataInterval = [];
+    /**
+     * @private
+     */
+
+    this._handleEnds = [];
+    /**
+     * @private
+     */
+
+    this._orient;
+    /**
+     * @private
+     */
+
+    this._useHandle;
+    /**
+     * @private
+     */
+
+    this._hoverLinkDataIndices = [];
+    /**
+     * @private
+     */
+
+    this._dragging;
+    /**
+     * @private
+     */
+
+    this._hovering;
+  },
+
+  /**
+   * @protected
+   * @override
+   */
+  doRender: function (visualMapModel, ecModel, api, payload) {
+    if (!payload || payload.type !== 'selectDataRange' || payload.from !== this.uid) {
+      this._buildView();
+    }
+  },
+
+  /**
+   * @private
+   */
+  _buildView: function () {
+    this.group.removeAll();
+    var visualMapModel = this.visualMapModel;
+    var thisGroup = this.group;
+    this._orient = visualMapModel.get('orient');
+    this._useHandle = visualMapModel.get('calculable');
+
+    this._resetInterval();
+
+    this._renderBar(thisGroup);
+
+    var dataRangeText = visualMapModel.get('text');
+
+    this._renderEndsText(thisGroup, dataRangeText, 0);
+
+    this._renderEndsText(thisGroup, dataRangeText, 1); // Do this for background size calculation.
+
+
+    this._updateView(true); // After updating view, inner shapes is built completely,
+    // and then background can be rendered.
+
+
+    this.renderBackground(thisGroup); // Real update view
+
+    this._updateView();
+
+    this._enableHoverLinkToSeries();
+
+    this._enableHoverLinkFromSeries();
+
+    this.positionGroup(thisGroup);
+  },
+
+  /**
+   * @private
+   */
+  _renderEndsText: function (group, dataRangeText, endsIndex) {
+    if (!dataRangeText) {
+      return;
+    } // Compatible with ec2, text[0] map to high value, text[1] map low value.
+
+
+    var text = dataRangeText[1 - endsIndex];
+    text = text != null ? text + '' : '';
+    var visualMapModel = this.visualMapModel;
+    var textGap = visualMapModel.get('textGap');
+    var itemSize = visualMapModel.itemSize;
+    var barGroup = this._shapes.barGroup;
+
+    var position = this._applyTransform([itemSize[0] / 2, endsIndex === 0 ? -textGap : itemSize[1] + textGap], barGroup);
+
+    var align = this._applyTransform(endsIndex === 0 ? 'bottom' : 'top', barGroup);
+
+    var orient = this._orient;
+    var textStyleModel = this.visualMapModel.textStyleModel;
+    this.group.add(new Text({
+      style: {
+        x: position[0],
+        y: position[1],
+        textVerticalAlign: orient === 'horizontal' ? 'middle' : align,
+        textAlign: orient === 'horizontal' ? align : 'center',
+        text: text,
+        textFont: textStyleModel.getFont(),
+        textFill: textStyleModel.getTextColor()
+      }
+    }));
+  },
+
+  /**
+   * @private
+   */
+  _renderBar: function (targetGroup) {
+    var visualMapModel = this.visualMapModel;
+    var shapes = this._shapes;
+    var itemSize = visualMapModel.itemSize;
+    var orient = this._orient;
+    var useHandle = this._useHandle;
+    var itemAlign = getItemAlign(visualMapModel, this.api, itemSize);
+
+    var barGroup = shapes.barGroup = this._createBarGroup(itemAlign); // Bar
+
+
+    barGroup.add(shapes.outOfRange = createPolygon());
+    barGroup.add(shapes.inRange = createPolygon(null, useHandle ? getCursor$1(this._orient) : null, bind(this._dragHandle, this, 'all', false), bind(this._dragHandle, this, 'all', true)));
+    var textRect = visualMapModel.textStyleModel.getTextRect('鍥�');
+    var textSize = mathMax$7(textRect.width, textRect.height); // Handle
+
+    if (useHandle) {
+      shapes.handleThumbs = [];
+      shapes.handleLabels = [];
+      shapes.handleLabelPoints = [];
+
+      this._createHandle(barGroup, 0, itemSize, textSize, orient, itemAlign);
+
+      this._createHandle(barGroup, 1, itemSize, textSize, orient, itemAlign);
+    }
+
+    this._createIndicator(barGroup, itemSize, textSize, orient);
+
+    targetGroup.add(barGroup);
+  },
+
+  /**
+   * @private
+   */
+  _createHandle: function (barGroup, handleIndex, itemSize, textSize, orient) {
+    var onDrift = bind(this._dragHandle, this, handleIndex, false);
+    var onDragEnd = bind(this._dragHandle, this, handleIndex, true);
+    var handleThumb = createPolygon(createHandlePoints(handleIndex, textSize), getCursor$1(this._orient), onDrift, onDragEnd);
+    handleThumb.position[0] = itemSize[0];
+    barGroup.add(handleThumb); // Text is always horizontal layout but should not be effected by
+    // transform (orient/inverse). So label is built separately but not
+    // use zrender/graphic/helper/RectText, and is located based on view
+    // group (according to handleLabelPoint) but not barGroup.
+
+    var textStyleModel = this.visualMapModel.textStyleModel;
+    var handleLabel = new Text({
+      draggable: true,
+      drift: onDrift,
+      onmousemove: function (e) {
+        // Fot mobile devicem, prevent screen slider on the button.
+        stop(e.event);
+      },
+      ondragend: onDragEnd,
+      style: {
+        x: 0,
+        y: 0,
+        text: '',
+        textFont: textStyleModel.getFont(),
+        textFill: textStyleModel.getTextColor()
+      }
+    });
+    this.group.add(handleLabel);
+    var handleLabelPoint = [orient === 'horizontal' ? textSize / 2 : textSize * 1.5, orient === 'horizontal' ? handleIndex === 0 ? -(textSize * 1.5) : textSize * 1.5 : handleIndex === 0 ? -textSize / 2 : textSize / 2];
+    var shapes = this._shapes;
+    shapes.handleThumbs[handleIndex] = handleThumb;
+    shapes.handleLabelPoints[handleIndex] = handleLabelPoint;
+    shapes.handleLabels[handleIndex] = handleLabel;
+  },
+
+  /**
+   * @private
+   */
+  _createIndicator: function (barGroup, itemSize, textSize, orient) {
+    var indicator = createPolygon([[0, 0]], 'move');
+    indicator.position[0] = itemSize[0];
+    indicator.attr({
+      invisible: true,
+      silent: true
+    });
+    barGroup.add(indicator);
+    var textStyleModel = this.visualMapModel.textStyleModel;
+    var indicatorLabel = new Text({
+      silent: true,
+      invisible: true,
+      style: {
+        x: 0,
+        y: 0,
+        text: '',
+        textFont: textStyleModel.getFont(),
+        textFill: textStyleModel.getTextColor()
+      }
+    });
+    this.group.add(indicatorLabel);
+    var indicatorLabelPoint = [orient === 'horizontal' ? textSize / 2 : HOVER_LINK_OUT + 3, 0];
+    var shapes = this._shapes;
+    shapes.indicator = indicator;
+    shapes.indicatorLabel = indicatorLabel;
+    shapes.indicatorLabelPoint = indicatorLabelPoint;
+  },
+
+  /**
+   * @private
+   */
+  _dragHandle: function (handleIndex, isEnd, dx, dy) {
+    if (!this._useHandle) {
+      return;
+    }
+
+    this._dragging = !isEnd;
+
+    if (!isEnd) {
+      // Transform dx, dy to bar coordination.
+      var vertex = this._applyTransform([dx, dy], this._shapes.barGroup, true);
+
+      this._updateInterval(handleIndex, vertex[1]); // Considering realtime, update view should be executed
+      // before dispatch action.
+
+
+      this._updateView();
+    } // dragEnd do not dispatch action when realtime.
+
+
+    if (isEnd === !this.visualMapModel.get('realtime')) {
+      // jshint ignore:line
+      this.api.dispatchAction({
+        type: 'selectDataRange',
+        from: this.uid,
+        visualMapId: this.visualMapModel.id,
+        selected: this._dataInterval.slice()
+      });
+    }
+
+    if (isEnd) {
+      !this._hovering && this._clearHoverLinkToSeries();
+    } else if (useHoverLinkOnHandle(this.visualMapModel)) {
+      this._doHoverLinkToSeries(this._handleEnds[handleIndex], false);
+    }
+  },
+
+  /**
+   * @private
+   */
+  _resetInterval: function () {
+    var visualMapModel = this.visualMapModel;
+    var dataInterval = this._dataInterval = visualMapModel.getSelected();
+    var dataExtent = visualMapModel.getExtent();
+    var sizeExtent = [0, visualMapModel.itemSize[1]];
+    this._handleEnds = [linearMap$3(dataInterval[0], dataExtent, sizeExtent, true), linearMap$3(dataInterval[1], dataExtent, sizeExtent, true)];
+  },
+
+  /**
+   * @private
+   * @param {(number|string)} handleIndex 0 or 1 or 'all'
+   * @param {number} dx
+   * @param {number} dy
+   */
+  _updateInterval: function (handleIndex, delta) {
+    delta = delta || 0;
+    var visualMapModel = this.visualMapModel;
+    var handleEnds = this._handleEnds;
+    var sizeExtent = [0, visualMapModel.itemSize[1]];
+    sliderMove(delta, handleEnds, sizeExtent, handleIndex, // cross is forbiden
+    0);
+    var dataExtent = visualMapModel.getExtent(); // Update data interval.
+
+    this._dataInterval = [linearMap$3(handleEnds[0], sizeExtent, dataExtent, true), linearMap$3(handleEnds[1], sizeExtent, dataExtent, true)];
+  },
+
+  /**
+   * @private
+   */
+  _updateView: function (forSketch) {
+    var visualMapModel = this.visualMapModel;
+    var dataExtent = visualMapModel.getExtent();
+    var shapes = this._shapes;
+    var outOfRangeHandleEnds = [0, visualMapModel.itemSize[1]];
+    var inRangeHandleEnds = forSketch ? outOfRangeHandleEnds : this._handleEnds;
+
+    var visualInRange = this._createBarVisual(this._dataInterval, dataExtent, inRangeHandleEnds, 'inRange');
+
+    var visualOutOfRange = this._createBarVisual(dataExtent, dataExtent, outOfRangeHandleEnds, 'outOfRange');
+
+    shapes.inRange.setStyle({
+      fill: visualInRange.barColor,
+      opacity: visualInRange.opacity
+    }).setShape('points', visualInRange.barPoints);
+    shapes.outOfRange.setStyle({
+      fill: visualOutOfRange.barColor,
+      opacity: visualOutOfRange.opacity
+    }).setShape('points', visualOutOfRange.barPoints);
+
+    this._updateHandle(inRangeHandleEnds, visualInRange);
+  },
+
+  /**
+   * @private
+   */
+  _createBarVisual: function (dataInterval, dataExtent, handleEnds, forceState) {
+    var opts = {
+      forceState: forceState,
+      convertOpacityToAlpha: true
+    };
+
+    var colorStops = this._makeColorGradient(dataInterval, opts);
+
+    var symbolSizes = [this.getControllerVisual(dataInterval[0], 'symbolSize', opts), this.getControllerVisual(dataInterval[1], 'symbolSize', opts)];
+
+    var barPoints = this._createBarPoints(handleEnds, symbolSizes);
+
+    return {
+      barColor: new LinearGradient(0, 0, 0, 1, colorStops),
+      barPoints: barPoints,
+      handlesColor: [colorStops[0].color, colorStops[colorStops.length - 1].color]
+    };
+  },
+
+  /**
+   * @private
+   */
+  _makeColorGradient: function (dataInterval, opts) {
+    // Considering colorHue, which is not linear, so we have to sample
+    // to calculate gradient color stops, but not only caculate head
+    // and tail.
+    var sampleNumber = 100; // Arbitrary value.
+
+    var colorStops = [];
+    var step = (dataInterval[1] - dataInterval[0]) / sampleNumber;
+    colorStops.push({
+      color: this.getControllerVisual(dataInterval[0], 'color', opts),
+      offset: 0
+    });
+
+    for (var i = 1; i < sampleNumber; i++) {
+      var currValue = dataInterval[0] + step * i;
+
+      if (currValue > dataInterval[1]) {
+        break;
+      }
+
+      colorStops.push({
+        color: this.getControllerVisual(currValue, 'color', opts),
+        offset: i / sampleNumber
+      });
+    }
+
+    colorStops.push({
+      color: this.getControllerVisual(dataInterval[1], 'color', opts),
+      offset: 1
+    });
+    return colorStops;
+  },
+
+  /**
+   * @private
+   */
+  _createBarPoints: function (handleEnds, symbolSizes) {
+    var itemSize = this.visualMapModel.itemSize;
+    return [[itemSize[0] - symbolSizes[0], handleEnds[0]], [itemSize[0], handleEnds[0]], [itemSize[0], handleEnds[1]], [itemSize[0] - symbolSizes[1], handleEnds[1]]];
+  },
+
+  /**
+   * @private
+   */
+  _createBarGroup: function (itemAlign) {
+    var orient = this._orient;
+    var inverse = this.visualMapModel.get('inverse');
+    return new Group(orient === 'horizontal' && !inverse ? {
+      scale: itemAlign === 'bottom' ? [1, 1] : [-1, 1],
+      rotation: Math.PI / 2
+    } : orient === 'horizontal' && inverse ? {
+      scale: itemAlign === 'bottom' ? [-1, 1] : [1, 1],
+      rotation: -Math.PI / 2
+    } : orient === 'vertical' && !inverse ? {
+      scale: itemAlign === 'left' ? [1, -1] : [-1, -1]
+    } : {
+      scale: itemAlign === 'left' ? [1, 1] : [-1, 1]
+    });
+  },
+
+  /**
+   * @private
+   */
+  _updateHandle: function (handleEnds, visualInRange) {
+    if (!this._useHandle) {
+      return;
+    }
+
+    var shapes = this._shapes;
+    var visualMapModel = this.visualMapModel;
+    var handleThumbs = shapes.handleThumbs;
+    var handleLabels = shapes.handleLabels;
+    each$27([0, 1], function (handleIndex) {
+      var handleThumb = handleThumbs[handleIndex];
+      handleThumb.setStyle('fill', visualInRange.handlesColor[handleIndex]);
+      handleThumb.position[1] = handleEnds[handleIndex]; // Update handle label position.
+
+      var textPoint = applyTransform$1(shapes.handleLabelPoints[handleIndex], getTransform(handleThumb, this.group));
+      handleLabels[handleIndex].setStyle({
+        x: textPoint[0],
+        y: textPoint[1],
+        text: visualMapModel.formatValueText(this._dataInterval[handleIndex]),
+        textVerticalAlign: 'middle',
+        textAlign: this._applyTransform(this._orient === 'horizontal' ? handleIndex === 0 ? 'bottom' : 'top' : 'left', shapes.barGroup)
+      });
+    }, this);
+  },
+
+  /**
+   * @private
+   * @param {number} cursorValue
+   * @param {number} textValue
+   * @param {string} [rangeSymbol]
+   * @param {number} [halfHoverLinkSize]
+   */
+  _showIndicator: function (cursorValue, textValue, rangeSymbol, halfHoverLinkSize) {
+    var visualMapModel = this.visualMapModel;
+    var dataExtent = visualMapModel.getExtent();
+    var itemSize = visualMapModel.itemSize;
+    var sizeExtent = [0, itemSize[1]];
+    var pos = linearMap$3(cursorValue, dataExtent, sizeExtent, true);
+    var shapes = this._shapes;
+    var indicator = shapes.indicator;
+
+    if (!indicator) {
+      return;
+    }
+
+    indicator.position[1] = pos;
+    indicator.attr('invisible', false);
+    indicator.setShape('points', createIndicatorPoints(!!rangeSymbol, halfHoverLinkSize, pos, itemSize[1]));
+    var opts = {
+      convertOpacityToAlpha: true
+    };
+    var color = this.getControllerVisual(cursorValue, 'color', opts);
+    indicator.setStyle('fill', color); // Update handle label position.
+
+    var textPoint = applyTransform$1(shapes.indicatorLabelPoint, getTransform(indicator, this.group));
+    var indicatorLabel = shapes.indicatorLabel;
+    indicatorLabel.attr('invisible', false);
+
+    var align = this._applyTransform('left', shapes.barGroup);
+
+    var orient = this._orient;
+    indicatorLabel.setStyle({
+      text: (rangeSymbol ? rangeSymbol : '') + visualMapModel.formatValueText(textValue),
+      textVerticalAlign: orient === 'horizontal' ? align : 'middle',
+      textAlign: orient === 'horizontal' ? 'center' : align,
+      x: textPoint[0],
+      y: textPoint[1]
+    });
+  },
+
+  /**
+   * @private
+   */
+  _enableHoverLinkToSeries: function () {
+    var self = this;
+
+    this._shapes.barGroup.on('mousemove', function (e) {
+      self._hovering = true;
+
+      if (!self._dragging) {
+        var itemSize = self.visualMapModel.itemSize;
+
+        var pos = self._applyTransform([e.offsetX, e.offsetY], self._shapes.barGroup, true, true); // For hover link show when hover handle, which might be
+        // below or upper than sizeExtent.
+
+
+        pos[1] = mathMin$7(mathMax$7(0, pos[1]), itemSize[1]);
+
+        self._doHoverLinkToSeries(pos[1], 0 <= pos[0] && pos[0] <= itemSize[0]);
+      }
+    }).on('mouseout', function () {
+      // When mouse is out of handle, hoverLink still need
+      // to be displayed when realtime is set as false.
+      self._hovering = false;
+      !self._dragging && self._clearHoverLinkToSeries();
+    });
+  },
+
+  /**
+   * @private
+   */
+  _enableHoverLinkFromSeries: function () {
+    var zr = this.api.getZr();
+
+    if (this.visualMapModel.option.hoverLink) {
+      zr.on('mouseover', this._hoverLinkFromSeriesMouseOver, this);
+      zr.on('mouseout', this._hideIndicator, this);
+    } else {
+      this._clearHoverLinkFromSeries();
+    }
+  },
+
+  /**
+   * @private
+   */
+  _doHoverLinkToSeries: function (cursorPos, hoverOnBar) {
+    var visualMapModel = this.visualMapModel;
+    var itemSize = visualMapModel.itemSize;
+
+    if (!visualMapModel.option.hoverLink) {
+      return;
+    }
+
+    var sizeExtent = [0, itemSize[1]];
+    var dataExtent = visualMapModel.getExtent(); // For hover link show when hover handle, which might be below or upper than sizeExtent.
+
+    cursorPos = mathMin$7(mathMax$7(sizeExtent[0], cursorPos), sizeExtent[1]);
+    var halfHoverLinkSize = getHalfHoverLinkSize(visualMapModel, dataExtent, sizeExtent);
+    var hoverRange = [cursorPos - halfHoverLinkSize, cursorPos + halfHoverLinkSize];
+    var cursorValue = linearMap$3(cursorPos, sizeExtent, dataExtent, true);
+    var valueRange = [linearMap$3(hoverRange[0], sizeExtent, dataExtent, true), linearMap$3(hoverRange[1], sizeExtent, dataExtent, true)]; // Consider data range is out of visualMap range, see test/visualMap-continuous.html,
+    // where china and india has very large population.
+
+    hoverRange[0] < sizeExtent[0] && (valueRange[0] = -Infinity);
+    hoverRange[1] > sizeExtent[1] && (valueRange[1] = Infinity); // Do not show indicator when mouse is over handle,
+    // otherwise labels overlap, especially when dragging.
+
+    if (hoverOnBar) {
+      if (valueRange[0] === -Infinity) {
+        this._showIndicator(cursorValue, valueRange[1], '< ', halfHoverLinkSize);
+      } else if (valueRange[1] === Infinity) {
+        this._showIndicator(cursorValue, valueRange[0], '> ', halfHoverLinkSize);
+      } else {
+        this._showIndicator(cursorValue, cursorValue, '鈮� ', halfHoverLinkSize);
+      }
+    } // When realtime is set as false, handles, which are in barGroup,
+    // also trigger hoverLink, which help user to realize where they
+    // focus on when dragging. (see test/heatmap-large.html)
+    // When realtime is set as true, highlight will not show when hover
+    // handle, because the label on handle, which displays a exact value
+    // but not range, might mislead users.
+
+
+    var oldBatch = this._hoverLinkDataIndices;
+    var newBatch = [];
+
+    if (hoverOnBar || useHoverLinkOnHandle(visualMapModel)) {
+      newBatch = this._hoverLinkDataIndices = visualMapModel.findTargetDataIndices(valueRange);
+    }
+
+    var resultBatches = compressBatches(oldBatch, newBatch);
+
+    this._dispatchHighDown('downplay', convertDataIndex(resultBatches[0]));
+
+    this._dispatchHighDown('highlight', convertDataIndex(resultBatches[1]));
+  },
+
+  /**
+   * @private
+   */
+  _hoverLinkFromSeriesMouseOver: function (e) {
+    var el = e.target;
+    var visualMapModel = this.visualMapModel;
+
+    if (!el || el.dataIndex == null) {
+      return;
+    }
+
+    var dataModel = this.ecModel.getSeriesByIndex(el.seriesIndex);
+
+    if (!visualMapModel.isTargetSeries(dataModel)) {
+      return;
+    }
+
+    var data = dataModel.getData(el.dataType);
+    var value = data.get(visualMapModel.getDataDimension(data), el.dataIndex, true);
+
+    if (!isNaN(value)) {
+      this._showIndicator(value, value);
+    }
+  },
+
+  /**
+   * @private
+   */
+  _hideIndicator: function () {
+    var shapes = this._shapes;
+    shapes.indicator && shapes.indicator.attr('invisible', true);
+    shapes.indicatorLabel && shapes.indicatorLabel.attr('invisible', true);
+  },
+
+  /**
+   * @private
+   */
+  _clearHoverLinkToSeries: function () {
+    this._hideIndicator();
+
+    var indices = this._hoverLinkDataIndices;
+
+    this._dispatchHighDown('downplay', convertDataIndex(indices));
+
+    indices.length = 0;
+  },
+
+  /**
+   * @private
+   */
+  _clearHoverLinkFromSeries: function () {
+    this._hideIndicator();
+
+    var zr = this.api.getZr();
+    zr.off('mouseover', this._hoverLinkFromSeriesMouseOver);
+    zr.off('mouseout', this._hideIndicator);
+  },
+
+  /**
+   * @private
+   */
+  _applyTransform: function (vertex, element, inverse, global) {
+    var transform = getTransform(element, global ? null : this.group);
+    return graphicUtil[isArray(vertex) ? 'applyTransform' : 'transformDirection'](vertex, transform, inverse);
+  },
+
+  /**
+   * @private
+   */
+  _dispatchHighDown: function (type, batch) {
+    batch && batch.length && this.api.dispatchAction({
+      type: type,
+      batch: batch
+    });
+  },
+
+  /**
+   * @override
+   */
+  dispose: function () {
+    this._clearHoverLinkFromSeries();
+
+    this._clearHoverLinkToSeries();
+  },
+
+  /**
+   * @override
+   */
+  remove: function () {
+    this._clearHoverLinkFromSeries();
+
+    this._clearHoverLinkToSeries();
+  }
+});
+
+function createPolygon(points, cursor, onDrift, onDragEnd) {
+  return new Polygon({
+    shape: {
+      points: points
+    },
+    draggable: !!onDrift,
+    cursor: cursor,
+    drift: onDrift,
+    onmousemove: function (e) {
+      // Fot mobile devicem, prevent screen slider on the button.
+      stop(e.event);
+    },
+    ondragend: onDragEnd
+  });
+}
+
+function createHandlePoints(handleIndex, textSize) {
+  return handleIndex === 0 ? [[0, 0], [textSize, 0], [textSize, -textSize]] : [[0, 0], [textSize, 0], [textSize, textSize]];
+}
+
+function createIndicatorPoints(isRange, halfHoverLinkSize, pos, extentMax) {
+  return isRange ? [// indicate range
+  [0, -mathMin$7(halfHoverLinkSize, mathMax$7(pos, 0))], [HOVER_LINK_OUT, 0], [0, mathMin$7(halfHoverLinkSize, mathMax$7(extentMax - pos, 0))]] : [// indicate single value
+  [0, 0], [5, -5], [5, 5]];
+}
+
+function getHalfHoverLinkSize(visualMapModel, dataExtent, sizeExtent) {
+  var halfHoverLinkSize = HOVER_LINK_SIZE / 2;
+  var hoverLinkDataSize = visualMapModel.get('hoverLinkDataSize');
+
+  if (hoverLinkDataSize) {
+    halfHoverLinkSize = linearMap$3(hoverLinkDataSize, dataExtent, sizeExtent, true) / 2;
+  }
+
+  return halfHoverLinkSize;
+}
+
+function useHoverLinkOnHandle(visualMapModel) {
+  var hoverLinkOnHandle = visualMapModel.get('hoverLinkOnHandle');
+  return !!(hoverLinkOnHandle == null ? visualMapModel.get('realtime') : hoverLinkOnHandle);
+}
+
+function getCursor$1(orient) {
+  return orient === 'vertical' ? 'ns-resize' : 'ew-resize';
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var actionInfo$2 = {
+  type: 'selectDataRange',
+  event: 'dataRangeSelected',
+  // FIXME use updateView appears wrong
+  update: 'update'
+};
+registerAction(actionInfo$2, function (payload, ecModel) {
+  ecModel.eachComponent({
+    mainType: 'visualMap',
+    query: payload
+  }, function (model) {
+    model.setSelected(payload.selected);
+  });
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * DataZoom component entry
+ */
+registerPreprocessor(preprocessor$3);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var PiecewiseModel = VisualMapModel.extend({
+  type: 'visualMap.piecewise',
+
+  /**
+   * Order Rule:
+   *
+   * option.categories / option.pieces / option.text / option.selected:
+   *     If !option.inverse,
+   *     Order when vertical: ['top', ..., 'bottom'].
+   *     Order when horizontal: ['left', ..., 'right'].
+   *     If option.inverse, the meaning of
+   *     the order should be reversed.
+   *
+   * this._pieceList:
+   *     The order is always [low, ..., high].
+   *
+   * Mapping from location to low-high:
+   *     If !option.inverse
+   *     When vertical, top is high.
+   *     When horizontal, right is high.
+   *     If option.inverse, reverse.
+   */
+
+  /**
+   * @protected
+   */
+  defaultOption: {
+    selected: null,
+    // Object. If not specified, means selected.
+    // When pieces and splitNumber: {'0': true, '5': true}
+    // When categories: {'cate1': false, 'cate3': true}
+    // When selected === false, means all unselected.
+    minOpen: false,
+    // Whether include values that smaller than `min`.
+    maxOpen: false,
+    // Whether include values that bigger than `max`.
+    align: 'auto',
+    // 'auto', 'left', 'right'
+    itemWidth: 20,
+    // When put the controller vertically, it is the length of
+    // horizontal side of each item. Otherwise, vertical side.
+    itemHeight: 14,
+    // When put the controller vertically, it is the length of
+    // vertical side of each item. Otherwise, horizontal side.
+    itemSymbol: 'roundRect',
+    pieceList: null,
+    // Each item is Object, with some of those attrs:
+    // {min, max, lt, gt, lte, gte, value,
+    // color, colorSaturation, colorAlpha, opacity,
+    // symbol, symbolSize}, which customize the range or visual
+    // coding of the certain piece. Besides, see "Order Rule".
+    categories: null,
+    // category names, like: ['some1', 'some2', 'some3'].
+    // Attr min/max are ignored when categories set. See "Order Rule"
+    splitNumber: 5,
+    // If set to 5, auto split five pieces equally.
+    // If set to 0 and component type not set, component type will be
+    // determined as "continuous". (It is less reasonable but for ec2
+    // compatibility, see echarts/component/visualMap/typeDefaulter)
+    selectedMode: 'multiple',
+    // Can be 'multiple' or 'single'.
+    itemGap: 10,
+    // The gap between two items, in px.
+    hoverLink: true,
+    // Enable hover highlight.
+    showLabel: null // By default, when text is used, label will hide (the logic
+    // is remained for compatibility reason)
+
+  },
+
+  /**
+   * @override
+   */
+  optionUpdated: function (newOption, isInit) {
+    PiecewiseModel.superApply(this, 'optionUpdated', arguments);
+    /**
+     * The order is always [low, ..., high].
+     * [{text: string, interval: Array.<number>}, ...]
+     * @private
+     * @type {Array.<Object>}
+     */
+
+    this._pieceList = [];
+    this.resetExtent();
+    /**
+     * 'pieces', 'categories', 'splitNumber'
+     * @type {string}
+     */
+
+    var mode = this._mode = this._determineMode();
+
+    resetMethods[this._mode].call(this);
+
+    this._resetSelected(newOption, isInit);
+
+    var categories = this.option.categories;
+    this.resetVisual(function (mappingOption, state) {
+      if (mode === 'categories') {
+        mappingOption.mappingMethod = 'category';
+        mappingOption.categories = clone(categories);
+      } else {
+        mappingOption.dataExtent = this.getExtent();
+        mappingOption.mappingMethod = 'piecewise';
+        mappingOption.pieceList = map(this._pieceList, function (piece) {
+          var piece = clone(piece);
+
+          if (state !== 'inRange') {
+            // FIXME
+            // outOfRange do not support special visual in pieces.
+            piece.visual = null;
+          }
+
+          return piece;
+        });
+      }
+    });
+  },
+
+  /**
+   * @protected
+   * @override
+   */
+  completeVisualOption: function () {
+    // Consider this case:
+    // visualMap: {
+    //      pieces: [{symbol: 'circle', lt: 0}, {symbol: 'rect', gte: 0}]
+    // }
+    // where no inRange/outOfRange set but only pieces. So we should make
+    // default inRange/outOfRange for this case, otherwise visuals that only
+    // appear in `pieces` will not be taken into account in visual encoding.
+    var option = this.option;
+    var visualTypesInPieces = {};
+    var visualTypes = VisualMapping.listVisualTypes();
+    var isCategory = this.isCategory();
+    each$1(option.pieces, function (piece) {
+      each$1(visualTypes, function (visualType) {
+        if (piece.hasOwnProperty(visualType)) {
+          visualTypesInPieces[visualType] = 1;
+        }
+      });
+    });
+    each$1(visualTypesInPieces, function (v, visualType) {
+      var exists = 0;
+      each$1(this.stateList, function (state) {
+        exists |= has(option, state, visualType) || has(option.target, state, visualType);
+      }, this);
+      !exists && each$1(this.stateList, function (state) {
+        (option[state] || (option[state] = {}))[visualType] = visualDefault.get(visualType, state === 'inRange' ? 'active' : 'inactive', isCategory);
+      });
+    }, this);
+
+    function has(obj, state, visualType) {
+      return obj && obj[state] && (isObject$1(obj[state]) ? obj[state].hasOwnProperty(visualType) : obj[state] === visualType // e.g., inRange: 'symbol'
+      );
+    }
+
+    VisualMapModel.prototype.completeVisualOption.apply(this, arguments);
+  },
+  _resetSelected: function (newOption, isInit) {
+    var thisOption = this.option;
+    var pieceList = this._pieceList; // Selected do not merge but all override.
+
+    var selected = (isInit ? thisOption : newOption).selected || {};
+    thisOption.selected = selected; // Consider 'not specified' means true.
+
+    each$1(pieceList, function (piece, index) {
+      var key = this.getSelectedMapKey(piece);
+
+      if (!selected.hasOwnProperty(key)) {
+        selected[key] = true;
+      }
+    }, this);
+
+    if (thisOption.selectedMode === 'single') {
+      // Ensure there is only one selected.
+      var hasSel = false;
+      each$1(pieceList, function (piece, index) {
+        var key = this.getSelectedMapKey(piece);
+
+        if (selected[key]) {
+          hasSel ? selected[key] = false : hasSel = true;
+        }
+      }, this);
+    } // thisOption.selectedMode === 'multiple', default: all selected.
+
+  },
+
+  /**
+   * @public
+   */
+  getSelectedMapKey: function (piece) {
+    return this._mode === 'categories' ? piece.value + '' : piece.index + '';
+  },
+
+  /**
+   * @public
+   */
+  getPieceList: function () {
+    return this._pieceList;
+  },
+
+  /**
+   * @private
+   * @return {string}
+   */
+  _determineMode: function () {
+    var option = this.option;
+    return option.pieces && option.pieces.length > 0 ? 'pieces' : this.option.categories ? 'categories' : 'splitNumber';
+  },
+
+  /**
+   * @public
+   * @override
+   */
+  setSelected: function (selected) {
+    this.option.selected = clone(selected);
+  },
+
+  /**
+   * @public
+   * @override
+   */
+  getValueState: function (value) {
+    var index = VisualMapping.findPieceIndex(value, this._pieceList);
+    return index != null ? this.option.selected[this.getSelectedMapKey(this._pieceList[index])] ? 'inRange' : 'outOfRange' : 'outOfRange';
+  },
+
+  /**
+   * @public
+   * @params {number} pieceIndex piece index in visualMapModel.getPieceList()
+   * @return {Array.<Object>} [{seriesId, dataIndices: <Array.<number>>}, ...]
+   */
+  findTargetDataIndices: function (pieceIndex) {
+    var result = [];
+    this.eachTargetSeries(function (seriesModel) {
+      var dataIndices = [];
+      var data = seriesModel.getData();
+      data.each(this.getDataDimension(data), function (value, dataIndex) {
+        // Should always index on model pieceList, because it is order sensitive.
+        var pIdx = VisualMapping.findPieceIndex(value, this._pieceList);
+        pIdx === pieceIndex && dataIndices.push(dataIndex);
+      }, this);
+      result.push({
+        seriesId: seriesModel.id,
+        dataIndex: dataIndices
+      });
+    }, this);
+    return result;
+  },
+
+  /**
+   * @private
+   * @param {Object} piece piece.value or piece.interval is required.
+   * @return {number} Can be Infinity or -Infinity
+   */
+  getRepresentValue: function (piece) {
+    var representValue;
+
+    if (this.isCategory()) {
+      representValue = piece.value;
+    } else {
+      if (piece.value != null) {
+        representValue = piece.value;
+      } else {
+        var pieceInterval = piece.interval || [];
+        representValue = pieceInterval[0] === -Infinity && pieceInterval[1] === Infinity ? 0 : (pieceInterval[0] + pieceInterval[1]) / 2;
+      }
+    }
+
+    return representValue;
+  },
+  getVisualMeta: function (getColorVisual) {
+    // Do not support category. (category axis is ordinal, numerical)
+    if (this.isCategory()) {
+      return;
+    }
+
+    var stops = [];
+    var outerColors = [];
+    var visualMapModel = this;
+
+    function setStop(interval, valueState) {
+      var representValue = visualMapModel.getRepresentValue({
+        interval: interval
+      });
+
+      if (!valueState) {
+        valueState = visualMapModel.getValueState(representValue);
+      }
+
+      var color = getColorVisual(representValue, valueState);
+
+      if (interval[0] === -Infinity) {
+        outerColors[0] = color;
+      } else if (interval[1] === Infinity) {
+        outerColors[1] = color;
+      } else {
+        stops.push({
+          value: interval[0],
+          color: color
+        }, {
+          value: interval[1],
+          color: color
+        });
+      }
+    } // Suplement
+
+
+    var pieceList = this._pieceList.slice();
+
+    if (!pieceList.length) {
+      pieceList.push({
+        interval: [-Infinity, Infinity]
+      });
+    } else {
+      var edge = pieceList[0].interval[0];
+      edge !== -Infinity && pieceList.unshift({
+        interval: [-Infinity, edge]
+      });
+      edge = pieceList[pieceList.length - 1].interval[1];
+      edge !== Infinity && pieceList.push({
+        interval: [edge, Infinity]
+      });
+    }
+
+    var curr = -Infinity;
+    each$1(pieceList, function (piece) {
+      var interval = piece.interval;
+
+      if (interval) {
+        // Fulfill gap.
+        interval[0] > curr && setStop([curr, interval[0]], 'outOfRange');
+        setStop(interval.slice());
+        curr = interval[1];
+      }
+    }, this);
+    return {
+      stops: stops,
+      outerColors: outerColors
+    };
+  }
+});
+/**
+ * Key is this._mode
+ * @type {Object}
+ * @this {module:echarts/component/viusalMap/PiecewiseMode}
+ */
+
+var resetMethods = {
+  splitNumber: function () {
+    var thisOption = this.option;
+    var pieceList = this._pieceList;
+    var precision = Math.min(thisOption.precision, 20);
+    var dataExtent = this.getExtent();
+    var splitNumber = thisOption.splitNumber;
+    splitNumber = Math.max(parseInt(splitNumber, 10), 1);
+    thisOption.splitNumber = splitNumber;
+    var splitStep = (dataExtent[1] - dataExtent[0]) / splitNumber; // Precision auto-adaption
+
+    while (+splitStep.toFixed(precision) !== splitStep && precision < 5) {
+      precision++;
+    }
+
+    thisOption.precision = precision;
+    splitStep = +splitStep.toFixed(precision);
+    var index = 0;
+
+    if (thisOption.minOpen) {
+      pieceList.push({
+        index: index++,
+        interval: [-Infinity, dataExtent[0]],
+        close: [0, 0]
+      });
+    }
+
+    for (var curr = dataExtent[0], len = index + splitNumber; index < len; curr += splitStep) {
+      var max = index === splitNumber - 1 ? dataExtent[1] : curr + splitStep;
+      pieceList.push({
+        index: index++,
+        interval: [curr, max],
+        close: [1, 1]
+      });
+    }
+
+    if (thisOption.maxOpen) {
+      pieceList.push({
+        index: index++,
+        interval: [dataExtent[1], Infinity],
+        close: [0, 0]
+      });
+    }
+
+    reformIntervals(pieceList);
+    each$1(pieceList, function (piece) {
+      piece.text = this.formatValueText(piece.interval);
+    }, this);
+  },
+  categories: function () {
+    var thisOption = this.option;
+    each$1(thisOption.categories, function (cate) {
+      // FIXME category妯″紡涔熶娇鐢╬ieceList锛屼絾鍦╲isualMapping涓笉鏄娇鐢╬ieceList銆�
+      // 鏄惁鏀逛竴鑷淬��
+      this._pieceList.push({
+        text: this.formatValueText(cate, true),
+        value: cate
+      });
+    }, this); // See "Order Rule".
+
+    normalizeReverse(thisOption, this._pieceList);
+  },
+  pieces: function () {
+    var thisOption = this.option;
+    var pieceList = this._pieceList;
+    each$1(thisOption.pieces, function (pieceListItem, index) {
+      if (!isObject$1(pieceListItem)) {
+        pieceListItem = {
+          value: pieceListItem
+        };
+      }
+
+      var item = {
+        text: '',
+        index: index
+      };
+
+      if (pieceListItem.label != null) {
+        item.text = pieceListItem.label;
+      }
+
+      if (pieceListItem.hasOwnProperty('value')) {
+        var value = item.value = pieceListItem.value;
+        item.interval = [value, value];
+        item.close = [1, 1];
+      } else {
+        // `min` `max` is legacy option.
+        // `lt` `gt` `lte` `gte` is recommanded.
+        var interval = item.interval = [];
+        var close = item.close = [0, 0];
+        var closeList = [1, 0, 1];
+        var infinityList = [-Infinity, Infinity];
+        var useMinMax = [];
+
+        for (var lg = 0; lg < 2; lg++) {
+          var names = [['gte', 'gt', 'min'], ['lte', 'lt', 'max']][lg];
+
+          for (var i = 0; i < 3 && interval[lg] == null; i++) {
+            interval[lg] = pieceListItem[names[i]];
+            close[lg] = closeList[i];
+            useMinMax[lg] = i === 2;
+          }
+
+          interval[lg] == null && (interval[lg] = infinityList[lg]);
+        }
+
+        useMinMax[0] && interval[1] === Infinity && (close[0] = 0);
+        useMinMax[1] && interval[0] === -Infinity && (close[1] = 0);
+
+        if (interval[0] === interval[1] && close[0] && close[1]) {
+          // Consider: [{min: 5, max: 5, visual: {...}}, {min: 0, max: 5}],
+          // we use value to lift the priority when min === max
+          item.value = interval[0];
+        }
+      }
+
+      item.visual = VisualMapping.retrieveVisuals(pieceListItem);
+      pieceList.push(item);
+    }, this); // See "Order Rule".
+
+    normalizeReverse(thisOption, pieceList); // Only pieces
+
+    reformIntervals(pieceList);
+    each$1(pieceList, function (piece) {
+      var close = piece.close;
+      var edgeSymbols = [['<', '鈮�'][close[1]], ['>', '鈮�'][close[0]]];
+      piece.text = piece.text || this.formatValueText(piece.value != null ? piece.value : piece.interval, false, edgeSymbols);
+    }, this);
+  }
+};
+
+function normalizeReverse(thisOption, pieceList) {
+  var inverse = thisOption.inverse;
+
+  if (thisOption.orient === 'vertical' ? !inverse : inverse) {
+    pieceList.reverse();
+  }
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var PiecewiseVisualMapView = VisualMapView.extend({
+  type: 'visualMap.piecewise',
+
+  /**
+   * @protected
+   * @override
+   */
+  doRender: function () {
+    var thisGroup = this.group;
+    thisGroup.removeAll();
+    var visualMapModel = this.visualMapModel;
+    var textGap = visualMapModel.get('textGap');
+    var textStyleModel = visualMapModel.textStyleModel;
+    var textFont = textStyleModel.getFont();
+    var textFill = textStyleModel.getTextColor();
+
+    var itemAlign = this._getItemAlign();
+
+    var itemSize = visualMapModel.itemSize;
+
+    var viewData = this._getViewData();
+
+    var endsText = viewData.endsText;
+    var showLabel = retrieve(visualMapModel.get('showLabel', true), !endsText);
+    endsText && this._renderEndsText(thisGroup, endsText[0], itemSize, showLabel, itemAlign);
+    each$1(viewData.viewPieceList, renderItem, this);
+    endsText && this._renderEndsText(thisGroup, endsText[1], itemSize, showLabel, itemAlign);
+    box(visualMapModel.get('orient'), thisGroup, visualMapModel.get('itemGap'));
+    this.renderBackground(thisGroup);
+    this.positionGroup(thisGroup);
+
+    function renderItem(item) {
+      var piece = item.piece;
+      var itemGroup = new Group();
+      itemGroup.onclick = bind(this._onItemClick, this, piece);
+
+      this._enableHoverLink(itemGroup, item.indexInModelPieceList);
+
+      var representValue = visualMapModel.getRepresentValue(piece);
+
+      this._createItemSymbol(itemGroup, representValue, [0, 0, itemSize[0], itemSize[1]]);
+
+      if (showLabel) {
+        var visualState = this.visualMapModel.getValueState(representValue);
+        itemGroup.add(new Text({
+          style: {
+            x: itemAlign === 'right' ? -textGap : itemSize[0] + textGap,
+            y: itemSize[1] / 2,
+            text: piece.text,
+            textVerticalAlign: 'middle',
+            textAlign: itemAlign,
+            textFont: textFont,
+            textFill: textFill,
+            opacity: visualState === 'outOfRange' ? 0.5 : 1
+          }
+        }));
+      }
+
+      thisGroup.add(itemGroup);
+    }
+  },
+
+  /**
+   * @private
+   */
+  _enableHoverLink: function (itemGroup, pieceIndex) {
+    itemGroup.on('mouseover', bind(onHoverLink, this, 'highlight')).on('mouseout', bind(onHoverLink, this, 'downplay'));
+
+    function onHoverLink(method) {
+      var visualMapModel = this.visualMapModel;
+      visualMapModel.option.hoverLink && this.api.dispatchAction({
+        type: method,
+        batch: convertDataIndex(visualMapModel.findTargetDataIndices(pieceIndex))
+      });
+    }
+  },
+
+  /**
+   * @private
+   */
+  _getItemAlign: function () {
+    var visualMapModel = this.visualMapModel;
+    var modelOption = visualMapModel.option;
+
+    if (modelOption.orient === 'vertical') {
+      return getItemAlign(visualMapModel, this.api, visualMapModel.itemSize);
+    } else {
+      // horizontal, most case left unless specifying right.
+      var align = modelOption.align;
+
+      if (!align || align === 'auto') {
+        align = 'left';
+      }
+
+      return align;
+    }
+  },
+
+  /**
+   * @private
+   */
+  _renderEndsText: function (group, text, itemSize, showLabel, itemAlign) {
+    if (!text) {
+      return;
+    }
+
+    var itemGroup = new Group();
+    var textStyleModel = this.visualMapModel.textStyleModel;
+    itemGroup.add(new Text({
+      style: {
+        x: showLabel ? itemAlign === 'right' ? itemSize[0] : 0 : itemSize[0] / 2,
+        y: itemSize[1] / 2,
+        textVerticalAlign: 'middle',
+        textAlign: showLabel ? itemAlign : 'center',
+        text: text,
+        textFont: textStyleModel.getFont(),
+        textFill: textStyleModel.getTextColor()
+      }
+    }));
+    group.add(itemGroup);
+  },
+
+  /**
+   * @private
+   * @return {Object} {peiceList, endsText} The order is the same as screen pixel order.
+   */
+  _getViewData: function () {
+    var visualMapModel = this.visualMapModel;
+    var viewPieceList = map(visualMapModel.getPieceList(), function (piece, index) {
+      return {
+        piece: piece,
+        indexInModelPieceList: index
+      };
+    });
+    var endsText = visualMapModel.get('text'); // Consider orient and inverse.
+
+    var orient = visualMapModel.get('orient');
+    var inverse = visualMapModel.get('inverse'); // Order of model pieceList is always [low, ..., high]
+
+    if (orient === 'horizontal' ? inverse : !inverse) {
+      viewPieceList.reverse();
+    } // Origin order of endsText is [high, low]
+    else if (endsText) {
+        endsText = endsText.slice().reverse();
+      }
+
+    return {
+      viewPieceList: viewPieceList,
+      endsText: endsText
+    };
+  },
+
+  /**
+   * @private
+   */
+  _createItemSymbol: function (group, representValue, shapeParam) {
+    group.add(createSymbol(this.getControllerVisual(representValue, 'symbol'), shapeParam[0], shapeParam[1], shapeParam[2], shapeParam[3], this.getControllerVisual(representValue, 'color')));
+  },
+
+  /**
+   * @private
+   */
+  _onItemClick: function (piece) {
+    var visualMapModel = this.visualMapModel;
+    var option = visualMapModel.option;
+    var selected = clone(option.selected);
+    var newKey = visualMapModel.getSelectedMapKey(piece);
+
+    if (option.selectedMode === 'single') {
+      selected[newKey] = true;
+      each$1(selected, function (o, key) {
+        selected[key] = key === newKey;
+      });
+    } else {
+      selected[newKey] = !selected[newKey];
+    }
+
+    this.api.dispatchAction({
+      type: 'selectDataRange',
+      from: this.uid,
+      visualMapId: this.visualMapModel.id,
+      selected: selected
+    });
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * DataZoom component entry
+ */
+registerPreprocessor(preprocessor$3);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * visualMap component entry
+ */
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var ToolboxModel = extendComponentModel({
+  type: 'toolbox',
+  layoutMode: {
+    type: 'box',
+    ignoreSize: true
+  },
+  optionUpdated: function () {
+    ToolboxModel.superApply(this, 'optionUpdated', arguments);
+    each$1(this.option.feature, function (featureOpt, featureName) {
+      var Feature = get$1(featureName);
+      Feature && merge(featureOpt, Feature.defaultOption);
+    });
+  },
+  defaultOption: {
+    show: true,
+    z: 6,
+    zlevel: 0,
+    orient: 'horizontal',
+    left: 'right',
+    top: 'top',
+    // right
+    // bottom
+    backgroundColor: 'transparent',
+    borderColor: '#ccc',
+    borderRadius: 0,
+    borderWidth: 0,
+    padding: 5,
+    itemSize: 15,
+    itemGap: 8,
+    showTitle: true,
+    iconStyle: {
+      borderColor: '#666',
+      color: 'none'
+    },
+    emphasis: {
+      iconStyle: {
+        borderColor: '#3E98C5'
+      } // textStyle: {},
+      // feature
+
+    }
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+extendComponentView({
+  type: 'toolbox',
+  render: function (toolboxModel, ecModel, api, payload) {
+    var group = this.group;
+    group.removeAll();
+
+    if (!toolboxModel.get('show')) {
+      return;
+    }
+
+    var itemSize = +toolboxModel.get('itemSize');
+    var featureOpts = toolboxModel.get('feature') || {};
+    var features = this._features || (this._features = {});
+    var featureNames = [];
+    each$1(featureOpts, function (opt, name) {
+      featureNames.push(name);
+    });
+    new DataDiffer(this._featureNames || [], featureNames).add(processFeature).update(processFeature).remove(curry(processFeature, null)).execute(); // Keep for diff.
+
+    this._featureNames = featureNames;
+
+    function processFeature(newIndex, oldIndex) {
+      var featureName = featureNames[newIndex];
+      var oldName = featureNames[oldIndex];
+      var featureOpt = featureOpts[featureName];
+      var featureModel = new Model(featureOpt, toolboxModel, toolboxModel.ecModel);
+      var feature;
+
+      if (featureName && !oldName) {
+        // Create
+        if (isUserFeatureName(featureName)) {
+          feature = {
+            model: featureModel,
+            onclick: featureModel.option.onclick,
+            featureName: featureName
+          };
+        } else {
+          var Feature = get$1(featureName);
+
+          if (!Feature) {
+            return;
+          }
+
+          feature = new Feature(featureModel, ecModel, api);
+        }
+
+        features[featureName] = feature;
+      } else {
+        feature = features[oldName]; // If feature does not exsit.
+
+        if (!feature) {
+          return;
+        }
+
+        feature.model = featureModel;
+        feature.ecModel = ecModel;
+        feature.api = api;
+      }
+
+      if (!featureName && oldName) {
+        feature.dispose && feature.dispose(ecModel, api);
+        return;
+      }
+
+      if (!featureModel.get('show') || feature.unusable) {
+        feature.remove && feature.remove(ecModel, api);
+        return;
+      }
+
+      createIconPaths(featureModel, feature, featureName);
+
+      featureModel.setIconStatus = function (iconName, status) {
+        var option = this.option;
+        var iconPaths = this.iconPaths;
+        option.iconStatus = option.iconStatus || {};
+        option.iconStatus[iconName] = status; // FIXME
+
+        iconPaths[iconName] && iconPaths[iconName].trigger(status);
+      };
+
+      if (feature.render) {
+        feature.render(featureModel, ecModel, api, payload);
+      }
+    }
+
+    function createIconPaths(featureModel, feature, featureName) {
+      var iconStyleModel = featureModel.getModel('iconStyle');
+      var iconStyleEmphasisModel = featureModel.getModel('emphasis.iconStyle'); // If one feature has mutiple icon. they are orginaized as
+      // {
+      //     icon: {
+      //         foo: '',
+      //         bar: ''
+      //     },
+      //     title: {
+      //         foo: '',
+      //         bar: ''
+      //     }
+      // }
+
+      var icons = feature.getIcons ? feature.getIcons() : featureModel.get('icon');
+      var titles = featureModel.get('title') || {};
+
+      if (typeof icons === 'string') {
+        var icon = icons;
+        var title = titles;
+        icons = {};
+        titles = {};
+        icons[featureName] = icon;
+        titles[featureName] = title;
+      }
+
+      var iconPaths = featureModel.iconPaths = {};
+      each$1(icons, function (iconStr, iconName) {
+        var path = createIcon(iconStr, {}, {
+          x: -itemSize / 2,
+          y: -itemSize / 2,
+          width: itemSize,
+          height: itemSize
+        });
+        path.setStyle(iconStyleModel.getItemStyle());
+        path.hoverStyle = iconStyleEmphasisModel.getItemStyle();
+        setHoverStyle(path);
+
+        if (toolboxModel.get('showTitle')) {
+          path.__title = titles[iconName];
+          path.on('mouseover', function () {
+            // Should not reuse above hoverStyle, which might be modified.
+            var hoverStyle = iconStyleEmphasisModel.getItemStyle();
+            path.setStyle({
+              text: titles[iconName],
+              textPosition: hoverStyle.textPosition || 'bottom',
+              textFill: hoverStyle.fill || hoverStyle.stroke || '#000',
+              textAlign: hoverStyle.textAlign || 'center'
+            });
+          }).on('mouseout', function () {
+            path.setStyle({
+              textFill: null
+            });
+          });
+        }
+
+        path.trigger(featureModel.get('iconStatus.' + iconName) || 'normal');
+        group.add(path);
+        path.on('click', bind(feature.onclick, feature, ecModel, api, iconName));
+        iconPaths[iconName] = path;
+      });
+    }
+
+    layout$3(group, toolboxModel, api); // Render background after group is layout
+    // FIXME
+
+    group.add(makeBackground(group.getBoundingRect(), toolboxModel)); // Adjust icon title positions to avoid them out of screen
+
+    group.eachChild(function (icon) {
+      var titleText = icon.__title;
+      var hoverStyle = icon.hoverStyle; // May be background element
+
+      if (hoverStyle && titleText) {
+        var rect = getBoundingRect(titleText, makeFont(hoverStyle));
+        var offsetX = icon.position[0] + group.position[0];
+        var offsetY = icon.position[1] + group.position[1] + itemSize;
+        var needPutOnTop = false;
+
+        if (offsetY + rect.height > api.getHeight()) {
+          hoverStyle.textPosition = 'top';
+          needPutOnTop = true;
+        }
+
+        var topOffset = needPutOnTop ? -5 - rect.height : itemSize + 8;
+
+        if (offsetX + rect.width / 2 > api.getWidth()) {
+          hoverStyle.textPosition = ['100%', topOffset];
+          hoverStyle.textAlign = 'right';
+        } else if (offsetX - rect.width / 2 < 0) {
+          hoverStyle.textPosition = [0, topOffset];
+          hoverStyle.textAlign = 'left';
+        }
+      }
+    });
+  },
+  updateView: function (toolboxModel, ecModel, api, payload) {
+    each$1(this._features, function (feature) {
+      feature.updateView && feature.updateView(feature.model, ecModel, api, payload);
+    });
+  },
+  // updateLayout: function (toolboxModel, ecModel, api, payload) {
+  //     zrUtil.each(this._features, function (feature) {
+  //         feature.updateLayout && feature.updateLayout(feature.model, ecModel, api, payload);
+  //     });
+  // },
+  remove: function (ecModel, api) {
+    each$1(this._features, function (feature) {
+      feature.remove && feature.remove(ecModel, api);
+    });
+    this.group.removeAll();
+  },
+  dispose: function (ecModel, api) {
+    each$1(this._features, function (feature) {
+      feature.dispose && feature.dispose(ecModel, api);
+    });
+  }
+});
+
+function isUserFeatureName(featureName) {
+  return featureName.indexOf('my') === 0;
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/* global Uint8Array */
+var saveAsImageLang = lang.toolbox.saveAsImage;
+
+function SaveAsImage(model) {
+  this.model = model;
+}
+
+SaveAsImage.defaultOption = {
+  show: true,
+  icon: 'M4.7,22.9L29.3,45.5L54.7,23.4M4.6,43.6L4.6,58L53.8,58L53.8,43.6M29.2,45.1L29.2,0',
+  title: saveAsImageLang.title,
+  type: 'png',
+  // Default use option.backgroundColor
+  // backgroundColor: '#fff',
+  name: '',
+  excludeComponents: ['toolbox'],
+  pixelRatio: 1,
+  lang: saveAsImageLang.lang.slice()
+};
+SaveAsImage.prototype.unusable = !env$1.canvasSupported;
+var proto$4 = SaveAsImage.prototype;
+
+proto$4.onclick = function (ecModel, api) {
+  var model = this.model;
+  var title = model.get('name') || ecModel.get('title.0.text') || 'echarts';
+  var $a = document.createElement('a');
+  var type = model.get('type', true) || 'png';
+  $a.download = title + '.' + type;
+  $a.target = '_blank';
+  var url = api.getConnectedDataURL({
+    type: type,
+    backgroundColor: model.get('backgroundColor', true) || ecModel.get('backgroundColor') || '#fff',
+    excludeComponents: model.get('excludeComponents'),
+    pixelRatio: model.get('pixelRatio')
+  });
+  $a.href = url; // Chrome and Firefox
+
+  if (typeof MouseEvent === 'function' && !env$1.browser.ie && !env$1.browser.edge) {
+    var evt = new MouseEvent('click', {
+      view: window,
+      bubbles: true,
+      cancelable: false
+    });
+    $a.dispatchEvent(evt);
+  } // IE
+  else {
+      if (window.navigator.msSaveOrOpenBlob) {
+        var bstr = atob(url.split(',')[1]);
+        var n = bstr.length;
+        var u8arr = new Uint8Array(n);
+
+        while (n--) {
+          u8arr[n] = bstr.charCodeAt(n);
+        }
+
+        var blob = new Blob([u8arr]);
+        window.navigator.msSaveOrOpenBlob(blob, title + '.' + type);
+      } else {
+        var lang$$1 = model.get('lang');
+        var html = '' + '<body style="margin:0;">' + '<img src="' + url + '" style="max-width:100%;" title="' + (lang$$1 && lang$$1[0] || '') + '" />' + '</body>';
+        var tab = window.open();
+        tab.document.write(html);
+      }
+    }
+};
+
+register$2('saveAsImage', SaveAsImage);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var magicTypeLang = lang.toolbox.magicType;
+
+function MagicType(model) {
+  this.model = model;
+}
+
+MagicType.defaultOption = {
+  show: true,
+  type: [],
+  // Icon group
+  icon: {
+    /* eslint-disable */
+    line: 'M4.1,28.9h7.1l9.3-22l7.4,38l9.7-19.7l3,12.8h14.9M4.1,58h51.4',
+    bar: 'M6.7,22.9h10V48h-10V22.9zM24.9,13h10v35h-10V13zM43.2,2h10v46h-10V2zM3.1,58h53.7',
+    stack: 'M8.2,38.4l-8.4,4.1l30.6,15.3L60,42.5l-8.1-4.1l-21.5,11L8.2,38.4z M51.9,30l-8.1,4.2l-13.4,6.9l-13.9-6.9L8.2,30l-8.4,4.2l8.4,4.2l22.2,11l21.5-11l8.1-4.2L51.9,30z M51.9,21.7l-8.1,4.2L35.7,30l-5.3,2.8L24.9,30l-8.4-4.1l-8.3-4.2l-8.4,4.2L8.2,30l8.3,4.2l13.9,6.9l13.4-6.9l8.1-4.2l8.1-4.1L51.9,21.7zM30.4,2.2L-0.2,17.5l8.4,4.1l8.3,4.2l8.4,4.2l5.5,2.7l5.3-2.7l8.1-4.2l8.1-4.2l8.1-4.1L30.4,2.2z',
+    // jshint ignore:line
+    tiled: 'M2.3,2.2h22.8V25H2.3V2.2z M35,2.2h22.8V25H35V2.2zM2.3,35h22.8v22.8H2.3V35z M35,35h22.8v22.8H35V35z'
+    /* eslint-enable */
+
+  },
+  // `line`, `bar`, `stack`, `tiled`
+  title: clone(magicTypeLang.title),
+  option: {},
+  seriesIndex: {}
+};
+var proto$5 = MagicType.prototype;
+
+proto$5.getIcons = function () {
+  var model = this.model;
+  var availableIcons = model.get('icon');
+  var icons = {};
+  each$1(model.get('type'), function (type) {
+    if (availableIcons[type]) {
+      icons[type] = availableIcons[type];
+    }
+  });
+  return icons;
+};
+
+var seriesOptGenreator = {
+  'line': function (seriesType, seriesId, seriesModel, model) {
+    if (seriesType === 'bar') {
+      return merge({
+        id: seriesId,
+        type: 'line',
+        // Preserve data related option
+        data: seriesModel.get('data'),
+        stack: seriesModel.get('stack'),
+        markPoint: seriesModel.get('markPoint'),
+        markLine: seriesModel.get('markLine')
+      }, model.get('option.line') || {}, true);
+    }
+  },
+  'bar': function (seriesType, seriesId, seriesModel, model) {
+    if (seriesType === 'line') {
+      return merge({
+        id: seriesId,
+        type: 'bar',
+        // Preserve data related option
+        data: seriesModel.get('data'),
+        stack: seriesModel.get('stack'),
+        markPoint: seriesModel.get('markPoint'),
+        markLine: seriesModel.get('markLine')
+      }, model.get('option.bar') || {}, true);
+    }
+  },
+  'stack': function (seriesType, seriesId, seriesModel, model) {
+    if (seriesType === 'line' || seriesType === 'bar') {
+      return merge({
+        id: seriesId,
+        stack: '__ec_magicType_stack__'
+      }, model.get('option.stack') || {}, true);
+    }
+  },
+  'tiled': function (seriesType, seriesId, seriesModel, model) {
+    if (seriesType === 'line' || seriesType === 'bar') {
+      return merge({
+        id: seriesId,
+        stack: ''
+      }, model.get('option.tiled') || {}, true);
+    }
+  }
+};
+var radioTypes = [['line', 'bar'], ['stack', 'tiled']];
+
+proto$5.onclick = function (ecModel, api, type) {
+  var model = this.model;
+  var seriesIndex = model.get('seriesIndex.' + type); // Not supported magicType
+
+  if (!seriesOptGenreator[type]) {
+    return;
+  }
+
+  var newOption = {
+    series: []
+  };
+
+  var generateNewSeriesTypes = function (seriesModel) {
+    var seriesType = seriesModel.subType;
+    var seriesId = seriesModel.id;
+    var newSeriesOpt = seriesOptGenreator[type](seriesType, seriesId, seriesModel, model);
+
+    if (newSeriesOpt) {
+      // PENDING If merge original option?
+      defaults(newSeriesOpt, seriesModel.option);
+      newOption.series.push(newSeriesOpt);
+    } // Modify boundaryGap
+
+
+    var coordSys = seriesModel.coordinateSystem;
+
+    if (coordSys && coordSys.type === 'cartesian2d' && (type === 'line' || type === 'bar')) {
+      var categoryAxis = coordSys.getAxesByScale('ordinal')[0];
+
+      if (categoryAxis) {
+        var axisDim = categoryAxis.dim;
+        var axisType = axisDim + 'Axis';
+        var axisModel = ecModel.queryComponents({
+          mainType: axisType,
+          index: seriesModel.get(name + 'Index'),
+          id: seriesModel.get(name + 'Id')
+        })[0];
+        var axisIndex = axisModel.componentIndex;
+        newOption[axisType] = newOption[axisType] || [];
+
+        for (var i = 0; i <= axisIndex; i++) {
+          newOption[axisType][axisIndex] = newOption[axisType][axisIndex] || {};
+        }
+
+        newOption[axisType][axisIndex].boundaryGap = type === 'bar';
+      }
+    }
+  };
+
+  each$1(radioTypes, function (radio) {
+    if (indexOf(radio, type) >= 0) {
+      each$1(radio, function (item) {
+        model.setIconStatus(item, 'normal');
+      });
+    }
+  });
+  model.setIconStatus(type, 'emphasis');
+  ecModel.eachComponent({
+    mainType: 'series',
+    query: seriesIndex == null ? null : {
+      seriesIndex: seriesIndex
+    }
+  }, generateNewSeriesTypes);
+  api.dispatchAction({
+    type: 'changeMagicType',
+    currentType: type,
+    newOption: newOption
+  });
+};
+
+registerAction({
+  type: 'changeMagicType',
+  event: 'magicTypeChanged',
+  update: 'prepareAndUpdate'
+}, function (payload, ecModel) {
+  ecModel.mergeOption(payload.newOption);
+});
+register$2('magicType', MagicType);
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var dataViewLang = lang.toolbox.dataView;
+var BLOCK_SPLITER = new Array(60).join('-');
+var ITEM_SPLITER = '\t';
+/**
+ * Group series into two types
+ *  1. on category axis, like line, bar
+ *  2. others, like scatter, pie
+ * @param {module:echarts/model/Global} ecModel
+ * @return {Object}
+ * @inner
+ */
+
+function groupSeries(ecModel) {
+  var seriesGroupByCategoryAxis = {};
+  var otherSeries = [];
+  var meta = [];
+  ecModel.eachRawSeries(function (seriesModel) {
+    var coordSys = seriesModel.coordinateSystem;
+
+    if (coordSys && (coordSys.type === 'cartesian2d' || coordSys.type === 'polar')) {
+      var baseAxis = coordSys.getBaseAxis();
+
+      if (baseAxis.type === 'category') {
+        var key = baseAxis.dim + '_' + baseAxis.index;
+
+        if (!seriesGroupByCategoryAxis[key]) {
+          seriesGroupByCategoryAxis[key] = {
+            categoryAxis: baseAxis,
+            valueAxis: coordSys.getOtherAxis(baseAxis),
+            series: []
+          };
+          meta.push({
+            axisDim: baseAxis.dim,
+            axisIndex: baseAxis.index
+          });
+        }
+
+        seriesGroupByCategoryAxis[key].series.push(seriesModel);
+      } else {
+        otherSeries.push(seriesModel);
+      }
+    } else {
+      otherSeries.push(seriesModel);
+    }
+  });
+  return {
+    seriesGroupByCategoryAxis: seriesGroupByCategoryAxis,
+    other: otherSeries,
+    meta: meta
+  };
+}
+/**
+ * Assemble content of series on cateogory axis
+ * @param {Array.<module:echarts/model/Series>} series
+ * @return {string}
+ * @inner
+ */
+
+
+function assembleSeriesWithCategoryAxis(series) {
+  var tables = [];
+  each$1(series, function (group, key) {
+    var categoryAxis = group.categoryAxis;
+    var valueAxis = group.valueAxis;
+    var valueAxisDim = valueAxis.dim;
+    var headers = [' '].concat(map(group.series, function (series) {
+      return series.name;
+    }));
+    var columns = [categoryAxis.model.getCategories()];
+    each$1(group.series, function (series) {
+      columns.push(series.getRawData().mapArray(valueAxisDim, function (val) {
+        return val;
+      }));
+    }); // Assemble table content
+
+    var lines = [headers.join(ITEM_SPLITER)];
+
+    for (var i = 0; i < columns[0].length; i++) {
+      var items = [];
+
+      for (var j = 0; j < columns.length; j++) {
+        items.push(columns[j][i]);
+      }
+
+      lines.push(items.join(ITEM_SPLITER));
+    }
+
+    tables.push(lines.join('\n'));
+  });
+  return tables.join('\n\n' + BLOCK_SPLITER + '\n\n');
+}
+/**
+ * Assemble content of other series
+ * @param {Array.<module:echarts/model/Series>} series
+ * @return {string}
+ * @inner
+ */
+
+
+function assembleOtherSeries(series) {
+  return map(series, function (series) {
+    var data = series.getRawData();
+    var lines = [series.name];
+    var vals = [];
+    data.each(data.dimensions, function () {
+      var argLen = arguments.length;
+      var dataIndex = arguments[argLen - 1];
+      var name = data.getName(dataIndex);
+
+      for (var i = 0; i < argLen - 1; i++) {
+        vals[i] = arguments[i];
+      }
+
+      lines.push((name ? name + ITEM_SPLITER : '') + vals.join(ITEM_SPLITER));
+    });
+    return lines.join('\n');
+  }).join('\n\n' + BLOCK_SPLITER + '\n\n');
+}
+/**
+ * @param {module:echarts/model/Global}
+ * @return {Object}
+ * @inner
+ */
+
+
+function getContentFromModel(ecModel) {
+  var result = groupSeries(ecModel);
+  return {
+    value: filter([assembleSeriesWithCategoryAxis(result.seriesGroupByCategoryAxis), assembleOtherSeries(result.other)], function (str) {
+      return str.replace(/[\n\t\s]/g, '');
+    }).join('\n\n' + BLOCK_SPLITER + '\n\n'),
+    meta: result.meta
+  };
+}
+
+function trim$1(str) {
+  return str.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
+}
+/**
+ * If a block is tsv format
+ */
+
+
+function isTSVFormat(block) {
+  // Simple method to find out if a block is tsv format
+  var firstLine = block.slice(0, block.indexOf('\n'));
+
+  if (firstLine.indexOf(ITEM_SPLITER) >= 0) {
+    return true;
+  }
+}
+
+var itemSplitRegex = new RegExp('[' + ITEM_SPLITER + ']+', 'g');
+/**
+ * @param {string} tsv
+ * @return {Object}
+ */
+
+function parseTSVContents(tsv) {
+  var tsvLines = tsv.split(/\n+/g);
+  var headers = trim$1(tsvLines.shift()).split(itemSplitRegex);
+  var categories = [];
+  var series = map(headers, function (header) {
+    return {
+      name: header,
+      data: []
+    };
+  });
+
+  for (var i = 0; i < tsvLines.length; i++) {
+    var items = trim$1(tsvLines[i]).split(itemSplitRegex);
+    categories.push(items.shift());
+
+    for (var j = 0; j < items.length; j++) {
+      series[j] && (series[j].data[i] = items[j]);
+    }
+  }
+
+  return {
+    series: series,
+    categories: categories
+  };
+}
+/**
+ * @param {string} str
+ * @return {Array.<Object>}
+ * @inner
+ */
+
+
+function parseListContents(str) {
+  var lines = str.split(/\n+/g);
+  var seriesName = trim$1(lines.shift());
+  var data = [];
+
+  for (var i = 0; i < lines.length; i++) {
+    var items = trim$1(lines[i]).split(itemSplitRegex);
+    var name = '';
+    var value;
+    var hasName = false;
+
+    if (isNaN(items[0])) {
+      // First item is name
+      hasName = true;
+      name = items[0];
+      items = items.slice(1);
+      data[i] = {
+        name: name,
+        value: []
+      };
+      value = data[i].value;
+    } else {
+      value = data[i] = [];
+    }
+
+    for (var j = 0; j < items.length; j++) {
+      value.push(+items[j]);
+    }
+
+    if (value.length === 1) {
+      hasName ? data[i].value = value[0] : data[i] = value[0];
+    }
+  }
+
+  return {
+    name: seriesName,
+    data: data
+  };
+}
+/**
+ * @param {string} str
+ * @param {Array.<Object>} blockMetaList
+ * @return {Object}
+ * @inner
+ */
+
+
+function parseContents(str, blockMetaList) {
+  var blocks = str.split(new RegExp('\n*' + BLOCK_SPLITER + '\n*', 'g'));
+  var newOption = {
+    series: []
+  };
+  each$1(blocks, function (block, idx) {
+    if (isTSVFormat(block)) {
+      var result = parseTSVContents(block);
+      var blockMeta = blockMetaList[idx];
+      var axisKey = blockMeta.axisDim + 'Axis';
+
+      if (blockMeta) {
+        newOption[axisKey] = newOption[axisKey] || [];
+        newOption[axisKey][blockMeta.axisIndex] = {
+          data: result.categories
+        };
+        newOption.series = newOption.series.concat(result.series);
+      }
+    } else {
+      var result = parseListContents(block);
+      newOption.series.push(result);
+    }
+  });
+  return newOption;
+}
+/**
+ * @alias {module:echarts/component/toolbox/feature/DataView}
+ * @constructor
+ * @param {module:echarts/model/Model} model
+ */
+
+
+function DataView(model) {
+  this._dom = null;
+  this.model = model;
+}
+
+DataView.defaultOption = {
+  show: true,
+  readOnly: false,
+  optionToContent: null,
+  contentToOption: null,
+  icon: 'M17.5,17.3H33 M17.5,17.3H33 M45.4,29.5h-28 M11.5,2v56H51V14.8L38.4,2H11.5z M38.4,2.2v12.7H51 M45.4,41.7h-28',
+  title: clone(dataViewLang.title),
+  lang: clone(dataViewLang.lang),
+  backgroundColor: '#fff',
+  textColor: '#000',
+  textareaColor: '#fff',
+  textareaBorderColor: '#333',
+  buttonColor: '#c23531',
+  buttonTextColor: '#fff'
+};
+
+DataView.prototype.onclick = function (ecModel, api) {
+  var container = api.getDom();
+  var model = this.model;
+
+  if (this._dom) {
+    container.removeChild(this._dom);
+  }
+
+  var root = document.createElement('div');
+  root.style.cssText = 'position:absolute;left:5px;top:5px;bottom:5px;right:5px;';
+  root.style.backgroundColor = model.get('backgroundColor') || '#fff'; // Create elements
+
+  var header = document.createElement('h4');
+  var lang$$1 = model.get('lang') || [];
+  header.innerHTML = lang$$1[0] || model.get('title');
+  header.style.cssText = 'margin: 10px 20px;';
+  header.style.color = model.get('textColor');
+  var viewMain = document.createElement('div');
+  var textarea = document.createElement('textarea');
+  viewMain.style.cssText = 'display:block;width:100%;overflow:auto;';
+  var optionToContent = model.get('optionToContent');
+  var contentToOption = model.get('contentToOption');
+  var result = getContentFromModel(ecModel);
+
+  if (typeof optionToContent === 'function') {
+    var htmlOrDom = optionToContent(api.getOption());
+
+    if (typeof htmlOrDom === 'string') {
+      viewMain.innerHTML = htmlOrDom;
+    } else if (isDom(htmlOrDom)) {
+      viewMain.appendChild(htmlOrDom);
+    }
+  } else {
+    // Use default textarea
+    viewMain.appendChild(textarea);
+    textarea.readOnly = model.get('readOnly');
+    textarea.style.cssText = 'width:100%;height:100%;font-family:monospace;font-size:14px;line-height:1.6rem;';
+    textarea.style.color = model.get('textColor');
+    textarea.style.borderColor = model.get('textareaBorderColor');
+    textarea.style.backgroundColor = model.get('textareaColor');
+    textarea.value = result.value;
+  }
+
+  var blockMetaList = result.meta;
+  var buttonContainer = document.createElement('div');
+  buttonContainer.style.cssText = 'position:absolute;bottom:0;left:0;right:0;';
+  var buttonStyle = 'float:right;margin-right:20px;border:none;' + 'cursor:pointer;padding:2px 5px;font-size:12px;border-radius:3px';
+  var closeButton = document.createElement('div');
+  var refreshButton = document.createElement('div');
+  buttonStyle += ';background-color:' + model.get('buttonColor');
+  buttonStyle += ';color:' + model.get('buttonTextColor');
+  var self = this;
+
+  function close() {
+    container.removeChild(root);
+    self._dom = null;
+  }
+
+  addEventListener(closeButton, 'click', close);
+  addEventListener(refreshButton, 'click', function () {
+    var newOption;
+
+    try {
+      if (typeof contentToOption === 'function') {
+        newOption = contentToOption(viewMain, api.getOption());
+      } else {
+        newOption = parseContents(textarea.value, blockMetaList);
+      }
+    } catch (e) {
+      close();
+      throw new Error('Data view format error ' + e);
+    }
+
+    if (newOption) {
+      api.dispatchAction({
+        type: 'changeDataView',
+        newOption: newOption
+      });
+    }
+
+    close();
+  });
+  closeButton.innerHTML = lang$$1[1];
+  refreshButton.innerHTML = lang$$1[2];
+  refreshButton.style.cssText = buttonStyle;
+  closeButton.style.cssText = buttonStyle;
+  !model.get('readOnly') && buttonContainer.appendChild(refreshButton);
+  buttonContainer.appendChild(closeButton); // http://stackoverflow.com/questions/6637341/use-tab-to-indent-in-textarea
+
+  addEventListener(textarea, 'keydown', function (e) {
+    if ((e.keyCode || e.which) === 9) {
+      // get caret position/selection
+      var val = this.value;
+      var start = this.selectionStart;
+      var end = this.selectionEnd; // set textarea value to: text before caret + tab + text after caret
+
+      this.value = val.substring(0, start) + ITEM_SPLITER + val.substring(end); // put caret at right position again
+
+      this.selectionStart = this.selectionEnd = start + 1; // prevent the focus lose
+
+      stop(e);
+    }
+  });
+  root.appendChild(header);
+  root.appendChild(viewMain);
+  root.appendChild(buttonContainer);
+  viewMain.style.height = container.clientHeight - 80 + 'px';
+  container.appendChild(root);
+  this._dom = root;
+};
+
+DataView.prototype.remove = function (ecModel, api) {
+  this._dom && api.getDom().removeChild(this._dom);
+};
+
+DataView.prototype.dispose = function (ecModel, api) {
+  this.remove(ecModel, api);
+};
+/**
+ * @inner
+ */
+
+
+function tryMergeDataOption(newData, originalData) {
+  return map(newData, function (newVal, idx) {
+    var original = originalData && originalData[idx];
+
+    if (isObject$1(original) && !isArray(original)) {
+      if (isObject$1(newVal) && !isArray(newVal)) {
+        newVal = newVal.value;
+      } // Original data has option
+
+
+      return defaults({
+        value: newVal
+      }, original);
+    } else {
+      return newVal;
+    }
+  });
+}
+
+register$2('dataView', DataView);
+registerAction({
+  type: 'changeDataView',
+  event: 'dataViewChanged',
+  update: 'prepareAndUpdate'
+}, function (payload, ecModel) {
+  var newSeriesOptList = [];
+  each$1(payload.newOption.series, function (seriesOpt) {
+    var seriesModel = ecModel.getSeriesByName(seriesOpt.name)[0];
+
+    if (!seriesModel) {
+      // New created series
+      // Geuss the series type
+      newSeriesOptList.push(extend({
+        // Default is scatter
+        type: 'scatter'
+      }, seriesOpt));
+    } else {
+      var originalData = seriesModel.get('data');
+      newSeriesOptList.push({
+        name: seriesOpt.name,
+        data: tryMergeDataOption(seriesOpt.data, originalData)
+      });
+    }
+  });
+  ecModel.mergeOption(defaults({
+    series: newSeriesOptList
+  }, payload.newOption));
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var each$29 = each$1;
+var ATTR$2 = '\0_ec_hist_store';
+/**
+ * @param {module:echarts/model/Global} ecModel
+ * @param {Object} newSnapshot {dataZoomId, batch: [payloadInfo, ...]}
+ */
+
+function push(ecModel, newSnapshot) {
+  var store = giveStore$1(ecModel); // If previous dataZoom can not be found,
+  // complete an range with current range.
+
+  each$29(newSnapshot, function (batchItem, dataZoomId) {
+    var i = store.length - 1;
+
+    for (; i >= 0; i--) {
+      var snapshot = store[i];
+
+      if (snapshot[dataZoomId]) {
+        break;
+      }
+    }
+
+    if (i < 0) {
+      // No origin range set, create one by current range.
+      var dataZoomModel = ecModel.queryComponents({
+        mainType: 'dataZoom',
+        subType: 'select',
+        id: dataZoomId
+      })[0];
+
+      if (dataZoomModel) {
+        var percentRange = dataZoomModel.getPercentRange();
+        store[0][dataZoomId] = {
+          dataZoomId: dataZoomId,
+          start: percentRange[0],
+          end: percentRange[1]
+        };
+      }
+    }
+  });
+  store.push(newSnapshot);
+}
+/**
+ * @param {module:echarts/model/Global} ecModel
+ * @return {Object} snapshot
+ */
+
+function pop(ecModel) {
+  var store = giveStore$1(ecModel);
+  var head = store[store.length - 1];
+  store.length > 1 && store.pop(); // Find top for all dataZoom.
+
+  var snapshot = {};
+  each$29(head, function (batchItem, dataZoomId) {
+    for (var i = store.length - 1; i >= 0; i--) {
+      var batchItem = store[i][dataZoomId];
+
+      if (batchItem) {
+        snapshot[dataZoomId] = batchItem;
+        break;
+      }
+    }
+  });
+  return snapshot;
+}
+/**
+ * @param {module:echarts/model/Global} ecModel
+ */
+
+function clear$1(ecModel) {
+  ecModel[ATTR$2] = null;
+}
+/**
+ * @param {module:echarts/model/Global} ecModel
+ * @return {number} records. always >= 1.
+ */
+
+function count(ecModel) {
+  return giveStore$1(ecModel).length;
+}
+/**
+ * [{key: dataZoomId, value: {dataZoomId, range}}, ...]
+ * History length of each dataZoom may be different.
+ * this._history[0] is used to store origin range.
+ * @type {Array.<Object>}
+ */
+
+function giveStore$1(ecModel) {
+  var store = ecModel[ATTR$2];
+
+  if (!store) {
+    store = ecModel[ATTR$2] = [{}];
+  }
+
+  return store;
+}
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+DataZoomModel.extend({
+  type: 'dataZoom.select'
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+DataZoomView.extend({
+  type: 'dataZoom.select'
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/**
+ * DataZoom component entry
+ */
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var dataZoomLang = lang.toolbox.dataZoom;
+var each$28 = each$1; // Spectial component id start with \0ec\0, see echarts/model/Global.js~hasInnerId
+
+var DATA_ZOOM_ID_BASE = '\0_ec_\0toolbox-dataZoom_';
+
+function DataZoom(model, ecModel, api) {
+  /**
+   * @private
+   * @type {module:echarts/component/helper/BrushController}
+   */
+  (this._brushController = new BrushController(api.getZr())).on('brush', bind(this._onBrush, this)).mount();
+  /**
+   * @private
+   * @type {boolean}
+   */
+
+  this._isZoomActive;
+}
+
+DataZoom.defaultOption = {
+  show: true,
+  // Icon group
+  icon: {
+    zoom: 'M0,13.5h26.9 M13.5,26.9V0 M32.1,13.5H58V58H13.5 V32.1',
+    back: 'M22,1.4L9.9,13.5l12.3,12.3 M10.3,13.5H54.9v44.6 H10.3v-26'
+  },
+  // `zoom`, `back`
+  title: clone(dataZoomLang.title)
+};
+var proto$6 = DataZoom.prototype;
+
+proto$6.render = function (featureModel, ecModel, api, payload) {
+  this.model = featureModel;
+  this.ecModel = ecModel;
+  this.api = api;
+  updateZoomBtnStatus(featureModel, ecModel, this, payload, api);
+  updateBackBtnStatus(featureModel, ecModel);
+};
+
+proto$6.onclick = function (ecModel, api, type) {
+  handlers$1[type].call(this);
+};
+
+proto$6.remove = function (ecModel, api) {
+  this._brushController.unmount();
+};
+
+proto$6.dispose = function (ecModel, api) {
+  this._brushController.dispose();
+};
+/**
+ * @private
+ */
+
+
+var handlers$1 = {
+  zoom: function () {
+    var nextActive = !this._isZoomActive;
+    this.api.dispatchAction({
+      type: 'takeGlobalCursor',
+      key: 'dataZoomSelect',
+      dataZoomSelectActive: nextActive
+    });
+  },
+  back: function () {
+    this._dispatchZoomAction(pop(this.ecModel));
+  }
+};
+/**
+ * @private
+ */
+
+proto$6._onBrush = function (areas, opt) {
+  if (!opt.isEnd || !areas.length) {
+    return;
+  }
+
+  var snapshot = {};
+  var ecModel = this.ecModel;
+
+  this._brushController.updateCovers([]); // remove cover
+
+
+  var brushTargetManager = new BrushTargetManager(retrieveAxisSetting(this.model.option), ecModel, {
+    include: ['grid']
+  });
+  brushTargetManager.matchOutputRanges(areas, ecModel, function (area, coordRange, coordSys) {
+    if (coordSys.type !== 'cartesian2d') {
+      return;
+    }
+
+    var brushType = area.brushType;
+
+    if (brushType === 'rect') {
+      setBatch('x', coordSys, coordRange[0]);
+      setBatch('y', coordSys, coordRange[1]);
+    } else {
+      setBatch({
+        lineX: 'x',
+        lineY: 'y'
+      }[brushType], coordSys, coordRange);
+    }
+  });
+  push(ecModel, snapshot);
+
+  this._dispatchZoomAction(snapshot);
+
+  function setBatch(dimName, coordSys, minMax) {
+    var axis = coordSys.getAxis(dimName);
+    var axisModel = axis.model;
+    var dataZoomModel = findDataZoom(dimName, axisModel, ecModel); // Restrict range.
+
+    var minMaxSpan = dataZoomModel.findRepresentativeAxisProxy(axisModel).getMinMaxSpan();
+
+    if (minMaxSpan.minValueSpan != null || minMaxSpan.maxValueSpan != null) {
+      minMax = sliderMove(0, minMax.slice(), axis.scale.getExtent(), 0, minMaxSpan.minValueSpan, minMaxSpan.maxValueSpan);
+    }
+
+    dataZoomModel && (snapshot[dataZoomModel.id] = {
+      dataZoomId: dataZoomModel.id,
+      startValue: minMax[0],
+      endValue: minMax[1]
+    });
+  }
+
+  function findDataZoom(dimName, axisModel, ecModel) {
+    var found;
+    ecModel.eachComponent({
+      mainType: 'dataZoom',
+      subType: 'select'
+    }, function (dzModel) {
+      var has = dzModel.getAxisModel(dimName, axisModel.componentIndex);
+      has && (found = dzModel);
+    });
+    return found;
+  }
+};
+/**
+ * @private
+ */
+
+
+proto$6._dispatchZoomAction = function (snapshot) {
+  var batch = []; // Convert from hash map to array.
+
+  each$28(snapshot, function (batchItem, dataZoomId) {
+    batch.push(clone(batchItem));
+  });
+  batch.length && this.api.dispatchAction({
+    type: 'dataZoom',
+    from: this.uid,
+    batch: batch
+  });
+};
+
+function retrieveAxisSetting(option) {
+  var setting = {}; // Compatible with previous setting: null => all axis, false => no axis.
+
+  each$1(['xAxisIndex', 'yAxisIndex'], function (name) {
+    setting[name] = option[name];
+    setting[name] == null && (setting[name] = 'all');
+    (setting[name] === false || setting[name] === 'none') && (setting[name] = []);
+  });
+  return setting;
+}
+
+function updateBackBtnStatus(featureModel, ecModel) {
+  featureModel.setIconStatus('back', count(ecModel) > 1 ? 'emphasis' : 'normal');
+}
+
+function updateZoomBtnStatus(featureModel, ecModel, view, payload, api) {
+  var zoomActive = view._isZoomActive;
+
+  if (payload && payload.type === 'takeGlobalCursor') {
+    zoomActive = payload.key === 'dataZoomSelect' ? payload.dataZoomSelectActive : false;
+  }
+
+  view._isZoomActive = zoomActive;
+  featureModel.setIconStatus('zoom', zoomActive ? 'emphasis' : 'normal');
+  var brushTargetManager = new BrushTargetManager(retrieveAxisSetting(featureModel.option), ecModel, {
+    include: ['grid']
+  });
+
+  view._brushController.setPanels(brushTargetManager.makePanelOpts(api, function (targetInfo) {
+    return targetInfo.xAxisDeclared && !targetInfo.yAxisDeclared ? 'lineX' : !targetInfo.xAxisDeclared && targetInfo.yAxisDeclared ? 'lineY' : 'rect';
+  })).enableBrush(zoomActive ? {
+    brushType: 'auto',
+    brushStyle: {
+      // FIXME user customized?
+      lineWidth: 0,
+      fill: 'rgba(0,0,0,0.2)'
+    }
+  } : false);
+}
+
+register$2('dataZoom', DataZoom); // Create special dataZoom option for select
+// FIXME consider the case of merge option, where axes options are not exists.
+
+registerPreprocessor(function (option) {
+  if (!option) {
+    return;
+  }
+
+  var dataZoomOpts = option.dataZoom || (option.dataZoom = []);
+
+  if (!isArray(dataZoomOpts)) {
+    option.dataZoom = dataZoomOpts = [dataZoomOpts];
+  }
+
+  var toolboxOpt = option.toolbox;
+
+  if (toolboxOpt) {
+    // Assume there is only one toolbox
+    if (isArray(toolboxOpt)) {
+      toolboxOpt = toolboxOpt[0];
+    }
+
+    if (toolboxOpt && toolboxOpt.feature) {
+      var dataZoomOpt = toolboxOpt.feature.dataZoom; // FIXME: If add dataZoom when setOption in merge mode,
+      // no axis info to be added. See `test/dataZoom-extreme.html`
+
+      addForAxis('xAxis', dataZoomOpt);
+      addForAxis('yAxis', dataZoomOpt);
+    }
+  }
+
+  function addForAxis(axisName, dataZoomOpt) {
+    if (!dataZoomOpt) {
+      return;
+    } // Try not to modify model, because it is not merged yet.
+
+
+    var axisIndicesName = axisName + 'Index';
+    var givenAxisIndices = dataZoomOpt[axisIndicesName];
+
+    if (givenAxisIndices != null && givenAxisIndices !== 'all' && !isArray(givenAxisIndices)) {
+      givenAxisIndices = givenAxisIndices === false || givenAxisIndices === 'none' ? [] : [givenAxisIndices];
+    }
+
+    forEachComponent(axisName, function (axisOpt, axisIndex) {
+      if (givenAxisIndices != null && givenAxisIndices !== 'all' && indexOf(givenAxisIndices, axisIndex) === -1) {
+        return;
+      }
+
+      var newOpt = {
+        type: 'select',
+        $fromToolbox: true,
+        // Id for merge mapping.
+        id: DATA_ZOOM_ID_BASE + axisName + axisIndex
+      }; // FIXME
+      // Only support one axis now.
+
+      newOpt[axisIndicesName] = axisIndex;
+      dataZoomOpts.push(newOpt);
+    });
+  }
+
+  function forEachComponent(mainType, cb) {
+    var opts = option[mainType];
+
+    if (!isArray(opts)) {
+      opts = opts ? [opts] : [];
+    }
+
+    each$28(opts, cb);
+  }
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+var restoreLang = lang.toolbox.restore;
+
+function Restore(model) {
+  this.model = model;
+}
+
+Restore.defaultOption = {
+  show: true,
+
+  /* eslint-disable */
+  icon: 'M3.8,33.4 M47,18.9h9.8V8.7 M56.3,20.1 C52.1,9,40.5,0.6,26.8,2.1C12.6,3.7,1.6,16.2,2.1,30.6 M13,41.1H3.1v10.2 M3.7,39.9c4.2,11.1,15.8,19.5,29.5,18 c14.2-1.6,25.2-14.1,24.7-28.5',
+
+  /* eslint-enable */
+  title: restoreLang.title
+};
+var proto$7 = Restore.prototype;
+
+proto$7.onclick = function (ecModel, api, type) {
+  clear$1(ecModel);
+  api.dispatchAction({
+    type: 'restore',
+    from: this.uid
+  });
+};
+
+register$2('restore', Restore);
+registerAction({
+  type: 'restore',
+  event: 'restore',
+  update: 'prepareAndUpdate'
+}, function (payload, ecModel) {
+  ecModel.resetOption('recreate');
+});
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License.  You may obtain a copy of the License at
+*
+*   http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+// Preprocessor
+// -------------
+
+registerPreprocessor(function (option) {
+  var graphicOption = option.graphic; // Convert
+  // {graphic: [{left: 10, type: 'circle'}, ...]}
+  // or
+  // {graphic: {left: 10, type: 'circle'}}
+  // to
+  // {graphic: [{elements: [{left: 10, type: 'circle'}, ...]}]}
+
+  if (isArray(graphicOption)) {
+    if (!graphicOption[0] || !graphicOption[0].elements) {
+      option.graphic = [{
+        elements: graphicOption
+      }];
+    } else {
+      // Only one graphic instance can be instantiated. (We dont
+      // want that too many views are created in echarts._viewMap)
+      option.graphic = [option.graphic[0]];
+    }
+  } else if (graphicOption && !graphicOption.elements) {
+    option.graphic = [{
+      elements: [graphicOption]
+    }];
+  }
+}); // ------
+// Model
+// ------
+
+var GraphicModel = extendComponentModel({
+  type: 'graphic',
+  defaultOption: {
+    // Extra properties for each elements:
+    //
+    // left/right/top/bottom: (like 12, '22%', 'center', default undefined)
+    //      If left/rigth is set, shape.x/shape.cx/position will not be used.
+    //      If top/bottom is set, shape.y/shape.cy/position will not be used.
+    //      This mechanism is useful when you want to position a group/element
+    //      against the right side or the center of this container.
+    //
+    // width/height: (can only be pixel value, default 0)
+    //      Only be used to specify contianer(group) size, if needed. And
+    //      can not be percentage value (like '33%'). See the reason in the
+    //      layout algorithm below.
+    //
+    // bounding: (enum: 'all' (default) | 'raw')
+    //      Specify how to calculate boundingRect when locating.
+    //      'all': Get uioned and transformed boundingRect
+    //          from both itself and its descendants.
+    //          This mode simplies confining a group of elements in the bounding
+    //          of their ancester container (e.g., using 'right: 0').
+    //      'raw': Only use the boundingRect of itself and before transformed.
+    //          This mode is similar to css behavior, which is useful when you
+    //          want an element to be able to overflow its container. (Consider
+    //          a rotated circle needs to be located in a corner.)
+    // info: custom info. enables user to mount some info on elements and use them
+    //      in event handlers. Update them only when user specified, otherwise, remain.
+    // Note: elements is always behind its ancestors in this elements array.
+    elements: [],
+    parentId: null
+  },
+
+  /**
+   * Save el options for the sake of the performance (only update modified graphics).
+   * The order is the same as those in option. (ancesters -> descendants)
+   *
+   * @private
+   * @type {Array.<Object>}
+   */
+  _elOptionsToUpdate: null,
+
+  /**
+   * @override
+   */
+  mergeOption: function (option) {
+    // Prevent default merge to elements
+    var elements = this.option.elements;
+    this.option.elements = null;
+    GraphicModel.superApply(this, 'mergeOption', arguments);
+    this.option.elements = elements;
+  },
+
+  /**
+   * @override
+   */
+  optionUpdated: function (newOption, isInit) {
+    var thisOption = this.option;
+    var newList = (isInit ? thisOption : newOption).elements;
+    var existList = thisOption.elements = isInit ? [] : thisOption.elements;
+    var flattenedList = [];
+
+    this._flatten(newList, flattenedList);
+
+    var mappingResult = mappingToExists(existList, flattenedList);
+    makeIdAndName(mappingResult); // Clear elOptionsToUpdate
+
+    var elOptionsToUpdate = this._elOptionsToUpdate = [];
+    each$1(mappingResult, function (resultItem, index) {
+      var newElOption = resultItem.option;
+
+      if (!newElOption) {
+        return;
+      }
+
+      elOptionsToUpdate.push(newElOption);
+      setKeyInfoToNewElOption(resultItem, newElOption);
+      mergeNewElOptionToExist(existList, index, newElOption);
+      setLayoutInfoToExist(existList[index], newElOption);
+    }, this); // Clean
+
+    for (var i = existList.length - 1; i >= 0; i--) {
+      if (existList[i] == null) {
+        existList.splice(i, 1);
+      } else {
+        // $action should be volatile, otherwise option gotten from
+        // `getOption` will contain unexpected $action.
+        delete existList[i].$action;
+      }
+    }
+  },
+
+  /**
+   * Convert
+   * [{
+   *  type: 'group',
+   *  id: 'xx',
+   *  children: [{type: 'circle'}, {type: 'polygon'}]
+   * }]
+   * to
+   * [
+   *  {type: 'group', id: 'xx'},
+   *  {type: 'circle', parentId: 'xx'},
+   *  {type: 'polygon', parentId: 'xx'}
+   * ]
+   *
+   * @private
+   * @param {Array.<Object>} optionList option list
+   * @param {Array.<Object>} result result of flatten
+   * @param {Object} parentOption parent option
+   */
+  _flatten: function (optionList, result, parentOption) {
+    each$1(optionList, function (option) {
+      if (!option) {
+        return;
+      }
+
+      if (parentOption) {
+        option.parentOption = parentOption;
+      }
+
+      result.push(option);
+      var children = option.children;
+
+      if (option.type === 'group' && children) {
+        this._flatten(children, result, option);
+      } // Deleting for JSON output, and for not affecting group creation.
+
+
+      delete option.children;
+    }, this);
+  },
+  // FIXME
+  // Pass to view using payload? setOption has a payload?
+  useElOptionsToUpdate: function () {
+    var els = this._elOptionsToUpdate; // Clear to avoid render duplicately when zooming.
+
+    this._elOptionsToUpdate = null;
+    return els;
+  }
+}); // -----
+// View
+// -----
+
+extendComponentView({
+  type: 'graphic',
+
+  /**
+   * @override
+   */
+  init: function (ecModel, api) {
+    /**
+     * @private
+     * @type {module:zrender/core/util.HashMap}
+     */
+    this._elMap = createHashMap();
+    /**
+     * @private
+     * @type {module:echarts/graphic/GraphicModel}
+     */
+
+    this._lastGraphicModel;
+  },
+
+  /**
+   * @override
+   */
+  render: function (graphicModel, ecModel, api) {
+    // Having leveraged between use cases and algorithm complexity, a very
+    // simple layout mechanism is used:
+    // The size(width/height) can be determined by itself or its parent (not
+    // implemented yet), but can not by its children. (Top-down travel)
+    // The location(x/y) can be determined by the bounding rect of itself
+    // (can including its descendants or not) and the size of its parent.
+    // (Bottom-up travel)
+    // When `chart.clear()` or `chart.setOption({...}, true)` with the same id,
+    // view will be reused.
+    if (graphicModel !== this._lastGraphicModel) {
+      this._clear();
+    }
+
+    this._lastGraphicModel = graphicModel;
+
+    this._updateElements(graphicModel);
+
+    this._relocate(graphicModel, api);
+  },
+
+  /**
+   * Update graphic elements.
+   *
+   * @private
+   * @param {Object} graphicModel graphic model
+   */
+  _updateElements: function (graphicModel) {
+    var elOptionsToUpdate = graphicModel.useElOptionsToUpdate();
+
+    if (!elOptionsToUpdate) {
+      return;
+    }
+
+    var elMap = this._elMap;
+    var rootGroup = this.group; // Top-down tranverse to assign graphic settings to each elements.
+
+    each$1(elOptionsToUpdate, function (elOption) {
+      var $action = elOption.$action;
+      var id = elOption.id;
+      var existEl = elMap.get(id);
+      var parentId = elOption.parentId;
+      var targetElParent = parentId != null ? elMap.get(parentId) : rootGroup;
+      var elOptionStyle = elOption.style;
+
+      if (elOption.type === 'text' && elOptionStyle) {
+        // In top/bottom mode, textVerticalAlign should not be used, which cause
+        // inaccurately locating.
+        if (elOption.hv && elOption.hv[1]) {
+          elOptionStyle.textVerticalAlign = elOptionStyle.textBaseline = null;
+        } // Compatible with previous setting: both support fill and textFill,
+        // stroke and textStroke.
+
+
+        !elOptionStyle.hasOwnProperty('textFill') && elOptionStyle.fill && (elOptionStyle.textFill = elOptionStyle.fill);
+        !elOptionStyle.hasOwnProperty('textStroke') && elOptionStyle.stroke && (elOptionStyle.textStroke = elOptionStyle.stroke);
+      } // Remove unnecessary props to avoid potential problems.
+
+
+      var elOptionCleaned = getCleanedElOption(elOption); // For simple, do not support parent change, otherwise reorder is needed.
+
+      if (!$action || $action === 'merge') {
+        existEl ? existEl.attr(elOptionCleaned) : createEl$1(id, targetElParent, elOptionCleaned, elMap);
+      } else if ($action === 'replace') {
+        removeEl(existEl, elMap);
+        createEl$1(id, targetElParent, elOptionCleaned, elMap);
+      } else if ($action === 'remove') {
+        removeEl(existEl, elMap);
+      }
+
+      var el = elMap.get(id);
+
+      if (el) {
+        el.__ecGraphicWidth = elOption.width;
+        el.__ecGraphicHeight = elOption.height;
+        setEventData(el, graphicModel, elOption);
+      }
+    });
+  },
+
+  /**
+   * Locate graphic elements.
+   *
+   * @private
+   * @param {Object} graphicModel graphic model
+   * @param {module:echarts/ExtensionAPI} api extension API
+   */
+  _relocate: function (graphicModel, api) {
+    var elOptions = graphicModel.option.elements;
+    var rootGroup = this.group;
+    var elMap = this._elMap; // Bottom-up tranvese all elements (consider ec resize) to locate elements.
+
+    for (var i = elOptions.length - 1; i >= 0; i--) {
+      var elOption = elOptions[i];
+      var el = elMap.get(elOption.id);
+
+      if (!el) {
+        continue;
+      }
+
+      var parentEl = el.parent;
+      var containerInfo = parentEl === rootGroup ? {
+        width: api.getWidth(),
+        height: api.getHeight()
+      } : {
+        // Like 'position:absolut' in css, default 0.
+        width: parentEl.__ecGraphicWidth || 0,
+        height: parentEl.__ecGraphicHeight || 0
+      };
+      positionElement(el, elOption, containerInfo, null, {
+        hv: elOption.hv,
+        boundingMode: elOption.bounding
+      });
+    }
+  },
+
+  /**
+   * Clear all elements.
+   *
+   * @private
+   */
+  _clear: function () {
+    var elMap = this._elMap;
+    elMap.each(function (el) {
+      removeEl(el, elMap);
+    });
+    this._elMap = createHashMap();
+  },
+
+  /**
+   * @override
+   */
+  dispose: function () {
+    this._clear();
+  }
+});
+
+function createEl$1(id, targetElParent, elOption, elMap) {
+  var graphicType = elOption.type;
+  var Clz = graphicUtil[graphicType.charAt(0).toUpperCase() + graphicType.slice(1)];
+  var el = new Clz(elOption);
+  targetElParent.add(el);
+  elMap.set(id, el);
+  el.__ecGraphicId = id;
+}
+
+function removeEl(existEl, elMap) {
+  var existElParent = existEl && existEl.parent;
+
+  if (existElParent) {
+    existEl.type === 'group' && existEl.traverse(function (el) {
+      removeEl(el, elMap);
+    });
+    elMap.removeKey(existEl.__ecGraphicId);
+    existElParent.remove(existEl);
+  }
+} // Remove unnecessary props to avoid potential problems.
+
+
+function getCleanedElOption(elOption) {
+  elOption = extend({}, elOption);
+  each$1(['id', 'parentId', '$action', 'hv', 'bounding'].concat(LOCATION_PARAMS), function (name) {
+    delete elOption[name];
+  });
+  return elOption;
+}
+
+function isSetLoc(obj, props) {
+  var isSet;
+  each$1(props, function (prop) {
+    obj[prop] != null && obj[prop] !== 'auto' && (isSet = true);
+  });
+  return isSet;
+}
+
+function setKeyInfoToNewElOption(resultItem, newElOption) {
+  var existElOption = resultItem.exist; // Set id and type after id assigned.
+
+  newElOption.id = resultItem.keyInfo.id;
+  !newElOption.type && existElOption && (newElOption.type = existElOption.type); // Set parent id if not specified
+
+  if (newElOption.parentId == null) {
+    var newElParentOption = newElOption.parentOption;
+
+    if (newElParentOption) {
+      newElOption.parentId = newElParentOption.id;
+    } else if (existElOption) {
+      newElOption.parentId = existElOption.parentId;
+    }
+  } // Clear
+
+
+  newElOption.parentOption = null;
+}
+
+function mergeNewElOptionToExist(existList, index, newElOption) {
+  // Update existing options, for `getOption` feature.
+  var newElOptCopy = extend({}, newElOption);
+  var existElOption = existList[index];
+  var $action = newElOption.$action || 'merge';
+
+  if ($action === 'merge') {
+    if (existElOption) {
+      // We can ensure that newElOptCopy and existElOption are not
+      // the same object, so `merge` will not change newElOptCopy.
+      merge(existElOption, newElOptCopy, true); // Rigid body, use ignoreSize.
+
+      mergeLayoutParam(existElOption, newElOptCopy, {
+        ignoreSize: true
+      }); // Will be used in render.
+
+      copyLayoutParams(newElOption, existElOption);
+    } else {
+      existList[index] = newElOptCopy;
+    }
+  } else if ($action === 'replace') {
+    existList[index] = newElOptCopy;
+  } else if ($action === 'remove') {
+    // null will be cleaned later.
+    existElOption && (existList[index] = null);
+  }
+}
+
+function setLayoutInfoToExist(existItem, newElOption) {
+  if (!existItem) {
+    return;
+  }
+
+  existItem.hv = newElOption.hv = [// Rigid body, dont care `width`.
+  isSetLoc(newElOption, ['left', 'right']), // Rigid body, dont care `height`.
+  isSetLoc(newElOption, ['top', 'bottom'])]; // Give default group size. Otherwise layout error may occur.
+
+  if (existItem.type === 'group') {
+    existItem.width == null && (existItem.width = newElOption.width = 0);
+    existItem.height == null && (existItem.height = newElOption.height = 0);
+  }
+}
+
+function setEventData(el, graphicModel, elOption) {
+  var eventData = el.eventData; // Simple optimize for large amount of elements that no need event.
+
+  if (!el.silent && !el.ignore && !eventData) {
+    eventData = el.eventData = {
+      componentType: 'graphic',
+      componentIndex: graphicModel.componentIndex,
+      name: el.name
+    };
+  } // `elOption.info` enables user to mount some info on
+  // elements and use them in event handlers.
+
+
+  if (eventData) {
+    eventData.info = el.info;
+  }
+}
+
+var urn = 'urn:schemas-microsoft-com:vml';
+var win = typeof window === 'undefined' ? null : window;
+var vmlInited = false;
+var doc = win && win.document;
+function createNode(tagName) {
+  return doCreateNode(tagName);
+} // Avoid assign to an exported variable, for transforming to cjs.
+
+var doCreateNode;
+
+if (doc && !env$1.canvasSupported) {
+  try {
+    !doc.namespaces.zrvml && doc.namespaces.add('zrvml', urn);
+
+    doCreateNode = function (tagName) {
+      return doc.createElement('<zrvml:' + tagName + ' class="zrvml">');
+    };
+  } catch (e) {
+    doCreateNode = function (tagName) {
+      return doc.createElement('<' + tagName + ' xmlns="' + urn + '" class="zrvml">');
+    };
+  }
+} // From raphael
+
+
+function initVML() {
+  if (vmlInited || !doc) {
+    return;
+  }
+
+  vmlInited = true;
+  var styleSheets = doc.styleSheets;
+
+  if (styleSheets.length < 31) {
+    doc.createStyleSheet().addRule('.zrvml', 'behavior:url(#default#VML)');
+  } else {
+    // http://msdn.microsoft.com/en-us/library/ms531194%28VS.85%29.aspx
+    styleSheets[0].addRule('.zrvml', 'behavior:url(#default#VML)');
+  }
+}
+
+// http://www.w3.org/TR/NOTE-VML
+// TODO Use proxy like svg instead of overwrite brush methods
+var CMD$3 = PathProxy.CMD;
+var round$3 = Math.round;
+var sqrt = Math.sqrt;
+var abs$1 = Math.abs;
+var cos = Math.cos;
+var sin = Math.sin;
+var mathMax$8 = Math.max;
+
+if (!env$1.canvasSupported) {
+  var comma = ',';
+  var imageTransformPrefix = 'progid:DXImageTransform.Microsoft';
+  var Z = 21600;
+  var Z2 = Z / 2;
+  var ZLEVEL_BASE = 100000;
+  var Z_BASE$1 = 1000;
+
+  var initRootElStyle = function (el) {
+    el.style.cssText = 'position:absolute;left:0;top:0;width:1px;height:1px;';
+    el.coordsize = Z + ',' + Z;
+    el.coordorigin = '0,0';
+  };
+
+  var encodeHtmlAttribute = function (s) {
+    return String(s).replace(/&/g, '&amp;').replace(/"/g, '&quot;');
+  };
+
+  var rgb2Str = function (r, g, b) {
+    return 'rgb(' + [r, g, b].join(',') + ')';
+  };
+
+  var append = function (parent, child) {
+    if (child && parent && child.parentNode !== parent) {
+      parent.appendChild(child);
+    }
+  };
+
+  var remove = function (parent, child) {
+    if (child && parent && child.parentNode === parent) {
+      parent.removeChild(child);
+    }
+  };
+
+  var getZIndex = function (zlevel, z, z2) {
+    // z 鐨勫彇鍊艰寖鍥翠负 [0, 1000]
+    return (parseFloat(zlevel) || 0) * ZLEVEL_BASE + (parseFloat(z) || 0) * Z_BASE$1 + z2;
+  };
+
+  var parsePercent$3 = function (value, maxValue) {
+    if (typeof value === 'string') {
+      if (value.lastIndexOf('%') >= 0) {
+        return parseFloat(value) / 100 * maxValue;
+      }
+
+      return parseFloat(value);
+    }
+
+    return value;
+  };
+  /***************************************************
+   * PATH
+   **************************************************/
+
+
+  var setColorAndOpacity = function (el, color, opacity) {
+    var colorArr = parse(color);
+    opacity = +opacity;
+
+    if (isNaN(opacity)) {
+      opacity = 1;
+    }
+
+    if (colorArr) {
+      el.color = rgb2Str(colorArr[0], colorArr[1], colorArr[2]);
+      el.opacity = opacity * colorArr[3];
+    }
+  };
+
+  var getColorAndAlpha = function (color) {
+    var colorArr = parse(color);
+    return [rgb2Str(colorArr[0], colorArr[1], colorArr[2]), colorArr[3]];
+  };
+
+  var updateFillNode = function (el, style, zrEl) {
+    // TODO pattern
+    var fill = style.fill;
+
+    if (fill != null) {
+      // Modified from excanvas
+      if (fill instanceof Gradient) {
+        var gradientType;
+        var angle = 0;
+        var focus = [0, 0]; // additional offset
+
+        var shift = 0; // scale factor for offset
+
+        var expansion = 1;
+        var rect = zrEl.getBoundingRect();
+        var rectWidth = rect.width;
+        var rectHeight = rect.height;
+
+        if (fill.type === 'linear') {
+          gradientType = 'gradient';
+          var transform = zrEl.transform;
+          var p0 = [fill.x * rectWidth, fill.y * rectHeight];
+          var p1 = [fill.x2 * rectWidth, fill.y2 * rectHeight];
+
+          if (transform) {
+            applyTransform(p0, p0, transform);
+            applyTransform(p1, p1, transform);
+          }
+
+          var dx = p1[0] - p0[0];
+          var dy = p1[1] - p0[1];
+          angle = Math.atan2(dx, dy) * 180 / Math.PI; // The angle should be a non-negative number.
+
+          if (angle < 0) {
+            angle += 360;
+          } // Very small angles produce an unexpected result because they are
+          // converted to a scientific notation string.
+
+
+          if (angle < 1e-6) {
+            angle = 0;
+          }
+        } else {
+          gradientType = 'gradientradial';
+          var p0 = [fill.x * rectWidth, fill.y * rectHeight];
+          var transform = zrEl.transform;
+          var scale$$1 = zrEl.scale;
+          var width = rectWidth;
+          var height = rectHeight;
+          focus = [// Percent in bounding rect
+          (p0[0] - rect.x) / width, (p0[1] - rect.y) / height];
+
+          if (transform) {
+            applyTransform(p0, p0, transform);
+          }
+
+          width /= scale$$1[0] * Z;
+          height /= scale$$1[1] * Z;
+          var dimension = mathMax$8(width, height);
+          shift = 2 * 0 / dimension;
+          expansion = 2 * fill.r / dimension - shift;
+        } // We need to sort the color stops in ascending order by offset,
+        // otherwise IE won't interpret it correctly.
+
+
+        var stops = fill.colorStops.slice();
+        stops.sort(function (cs1, cs2) {
+          return cs1.offset - cs2.offset;
+        });
+        var length$$1 = stops.length; // Color and alpha list of first and last stop
+
+        var colorAndAlphaList = [];
+        var colors = [];
+
+        for (var i = 0; i < length$$1; i++) {
+          var stop = stops[i];
+          var colorAndAlpha = getColorAndAlpha(stop.color);
+          colors.push(stop.offset * expansion + shift + ' ' + colorAndAlpha[0]);
+
+          if (i === 0 || i === length$$1 - 1) {
+            colorAndAlphaList.push(colorAndAlpha);
+          }
+        }
+
+        if (length$$1 >= 2) {
+          var color1 = colorAndAlphaList[0][0];
+          var color2 = colorAndAlphaList[1][0];
+          var opacity1 = colorAndAlphaList[0][1] * style.opacity;
+          var opacity2 = colorAndAlphaList[1][1] * style.opacity;
+          el.type = gradientType;
+          el.method = 'none';
+          el.focus = '100%';
+          el.angle = angle;
+          el.color = color1;
+          el.color2 = color2;
+          el.colors = colors.join(','); // When colors attribute is used, the meanings of opacity and o:opacity2
+          // are reversed.
+
+          el.opacity = opacity2; // FIXME g_o_:opacity ?
+
+          el.opacity2 = opacity1;
+        }
+
+        if (gradientType === 'radial') {
+          el.focusposition = focus.join(',');
+        }
+      } else {
+        // FIXME Change from Gradient fill to color fill
+        setColorAndOpacity(el, fill, style.opacity);
+      }
+    }
+  };
+
+  var updateStrokeNode = function (el, style) {
+    // if (style.lineJoin != null) {
+    //     el.joinstyle = style.lineJoin;
+    // }
+    // if (style.miterLimit != null) {
+    //     el.miterlimit = style.miterLimit * Z;
+    // }
+    // if (style.lineCap != null) {
+    //     el.endcap = style.lineCap;
+    // }
+    if (style.lineDash != null) {
+      el.dashstyle = style.lineDash.join(' ');
+    }
+
+    if (style.stroke != null && !(style.stroke instanceof Gradient)) {
+      setColorAndOpacity(el, style.stroke, style.opacity);
+    }
+  };
+
+  var updateFillAndStroke = function (vmlEl, type, style, zrEl) {
+    var isFill = type == 'fill';
+    var el = vmlEl.getElementsByTagName(type)[0]; // Stroke must have lineWidth
+
+    if (style[type] != null && style[type] !== 'none' && (isFill || !isFill && style.lineWidth)) {
+      vmlEl[isFill ? 'filled' : 'stroked'] = 'true'; // FIXME Remove before updating, or set `colors` will throw error
+
+      if (style[type] instanceof Gradient) {
+        remove(vmlEl, el);
+      }
+
+      if (!el) {
+        el = createNode(type);
+      }
+
+      isFill ? updateFillNode(el, style, zrEl) : updateStrokeNode(el, style);
+      append(vmlEl, el);
+    } else {
+      vmlEl[isFill ? 'filled' : 'stroked'] = 'false';
+      remove(vmlEl, el);
+    }
+  };
+
+  var points$3 = [[], [], []];
+
+  var pathDataToString = function (path, m) {
+    var M = CMD$3.M;
+    var C = CMD$3.C;
+    var L = CMD$3.L;
+    var A = CMD$3.A;
+    var Q = CMD$3.Q;
+    var str = [];
+    var nPoint;
+    var cmdStr;
+    var cmd;
+    var i;
+    var xi;
+    var yi;
+    var data = path.data;
+    var dataLength = path.len();
+
+    for (i = 0; i < dataLength;) {
+      cmd = data[i++];
+      cmdStr = '';
+      nPoint = 0;
+
+      switch (cmd) {
+        case M:
+          cmdStr = ' m ';
+          nPoint = 1;
+          xi = data[i++];
+          yi = data[i++];
+          points$3[0][0] = xi;
+          points$3[0][1] = yi;
+          break;
+
+        case L:
+          cmdStr = ' l ';
+          nPoint = 1;
+          xi = data[i++];
+          yi = data[i++];
+          points$3[0][0] = xi;
+          points$3[0][1] = yi;
+          break;
+
+        case Q:
+        case C:
+          cmdStr = ' c ';
+          nPoint = 3;
+          var x1 = data[i++];
+          var y1 = data[i++];
+          var x2 = data[i++];
+          var y2 = data[i++];
+          var x3;
+          var y3;
+
+          if (cmd === Q) {
+            // Convert quadratic to cubic using degree elevation
+            x3 = x2;
+            y3 = y2;
+            x2 = (x2 + 2 * x1) / 3;
+            y2 = (y2 + 2 * y1) / 3;
+            x1 = (xi + 2 * x1) / 3;
+            y1 = (yi + 2 * y1) / 3;
+          } else {
+            x3 = data[i++];
+            y3 = data[i++];
+          }
+
+          points$3[0][0] = x1;
+          points$3[0][1] = y1;
+          points$3[1][0] = x2;
+          points$3[1][1] = y2;
+          points$3[2][0] = x3;
+          points$3[2][1] = y3;
+          xi = x3;
+          yi = y3;
+          break;
+
+        case A:
+          var x = 0;
+          var y = 0;
+          var sx = 1;
+          var sy = 1;
+          var angle = 0;
+
+          if (m) {
+            // Extract SRT from matrix
+            x = m[4];
+            y = m[5];
+            sx = sqrt(m[0] * m[0] + m[1] * m[1]);
+            sy = sqrt(m[2] * m[2] + m[3] * m[3]);
+            angle = Math.atan2(-m[1] / sy, m[0] / sx);
+          }
+
+          var cx = data[i++];
+          var cy = data[i++];
+          var rx = data[i++];
+          var ry = data[i++];
+          var startAngle = data[i++] + angle;
+          var endAngle = data[i++] + startAngle + angle; // FIXME
+          // var psi = data[i++];
+
+          i++;
+          var clockwise = data[i++];
+          var x0 = cx + cos(startAngle) * rx;
+          var y0 = cy + sin(startAngle) * ry;
+          var x1 = cx + cos(endAngle) * rx;
+          var y1 = cy + sin(endAngle) * ry;
+          var type = clockwise ? ' wa ' : ' at ';
+
+          if (Math.abs(x0 - x1) < 1e-4) {
+            // IE won't render arches drawn counter clockwise if x0 == x1.
+            if (Math.abs(endAngle - startAngle) > 1e-2) {
+              // Offset x0 by 1/80 of a pixel. Use something
+              // that can be represented in binary
+              if (clockwise) {
+                x0 += 270 / Z;
+              }
+            } else {
+              // Avoid case draw full circle
+              if (Math.abs(y0 - cy) < 1e-4) {
+                if (clockwise && x0 < cx || !clockwise && x0 > cx) {
+                  y1 -= 270 / Z;
+                } else {
+                  y1 += 270 / Z;
+                }
+              } else if (clockwise && y0 < cy || !clockwise && y0 > cy) {
+                x1 += 270 / Z;
+              } else {
+                x1 -= 270 / Z;
+              }
+            }
+          }
+
+          str.push(type, round$3(((cx - rx) * sx + x) * Z - Z2), comma, round$3(((cy - ry) * sy + y) * Z - Z2), comma, round$3(((cx + rx) * sx + x) * Z - Z2), comma, round$3(((cy + ry) * sy + y) * Z - Z2), comma, round$3((x0 * sx + x) * Z - Z2), comma, round$3((y0 * sy + y) * Z - Z2), comma, round$3((x1 * sx + x) * Z - Z2), comma, round$3((y1 * sy + y) * Z - Z2));
+          xi = x1;
+          yi = y1;
+          break;
+
+        case CMD$3.R:
+          var p0 = points$3[0];
+          var p1 = points$3[1]; // x0, y0
+
+          p0[0] = data[i++];
+          p0[1] = data[i++]; // x1, y1
+
+          p1[0] = p0[0] + data[i++];
+          p1[1] = p0[1] + data[i++];
+
+          if (m) {
+            applyTransform(p0, p0, m);
+            applyTransform(p1, p1, m);
+          }
+
+          p0[0] = round$3(p0[0] * Z - Z2);
+          p1[0] = round$3(p1[0] * Z - Z2);
+          p0[1] = round$3(p0[1] * Z - Z2);
+          p1[1] = round$3(p1[1] * Z - Z2);
+          str.push( // x0, y0
+          ' m ', p0[0], comma, p0[1], // x1, y0
+          ' l ', p1[0], comma, p0[1], // x1, y1
+          ' l ', p1[0], comma, p1[1], // x0, y1
+          ' l ', p0[0], comma, p1[1]);
+          break;
+
+        case CMD$3.Z:
+          // FIXME Update xi, yi
+          str.push(' x ');
+      }
+
+      if (nPoint > 0) {
+        str.push(cmdStr);
+
+        for (var k = 0; k < nPoint; k++) {
+          var p = points$3[k];
+          m && applyTransform(p, p, m); // 涓� round 浼氶潪甯告參
+
+          str.push(round$3(p[0] * Z - Z2), comma, round$3(p[1] * Z - Z2), k < nPoint - 1 ? comma : '');
+        }
+      }
+    }
+
+    return str.join('');
+  }; // Rewrite the original path method
+
+
+  Path.prototype.brushVML = function (vmlRoot) {
+    var style = this.style;
+    var vmlEl = this._vmlEl;
+
+    if (!vmlEl) {
+      vmlEl = createNode('shape');
+      initRootElStyle(vmlEl);
+      this._vmlEl = vmlEl;
+    }
+
+    updateFillAndStroke(vmlEl, 'fill', style, this);
+    updateFillAndStroke(vmlEl, 'stroke', style, this);
+    var m = this.transform;
+    var needTransform = m != null;
+    var strokeEl = vmlEl.getElementsByTagName('stroke')[0];
+
+    if (strokeEl) {
+      var lineWidth = style.lineWidth; // Get the line scale.
+      // Determinant of this.m_ means how much the area is enlarged by the
+      // transformation. So its square root can be used as a scale factor
+      // for width.
+
+      if (needTransform && !style.strokeNoScale) {
+        var det = m[0] * m[3] - m[1] * m[2];
+        lineWidth *= sqrt(abs$1(det));
+      }
+
+      strokeEl.weight = lineWidth + 'px';
+    }
+
+    var path = this.path || (this.path = new PathProxy());
+
+    if (this.__dirtyPath) {
+      path.beginPath();
+      this.buildPath(path, this.shape);
+      path.toStatic();
+      this.__dirtyPath = false;
+    }
+
+    vmlEl.path = pathDataToString(path, this.transform);
+    vmlEl.style.zIndex = getZIndex(this.zlevel, this.z, this.z2); // Append to root
+
+    append(vmlRoot, vmlEl); // Text
+
+    if (style.text != null) {
+      this.drawRectText(vmlRoot, this.getBoundingRect());
+    } else {
+      this.removeRectText(vmlRoot);
+    }
+  };
+
+  Path.prototype.onRemove = function (vmlRoot) {
+    remove(vmlRoot, this._vmlEl);
+    this.removeRectText(vmlRoot);
+  };
+
+  Path.prototype.onAdd = function (vmlRoot) {
+    append(vmlRoot, this._vmlEl);
+    this.appendRectText(vmlRoot);
+  };
+  /***************************************************
+   * IMAGE
+   **************************************************/
+
+
+  var isImage = function (img) {
+    // FIXME img instanceof Image 濡傛灉 img 鏄竴涓瓧绗︿覆鐨勬椂鍊欙紝IE8 涓嬩細鎶ラ敊
+    return typeof img === 'object' && img.tagName && img.tagName.toUpperCase() === 'IMG'; // return img instanceof Image;
+  }; // Rewrite the original path method
+
+
+  ZImage.prototype.brushVML = function (vmlRoot) {
+    var style = this.style;
+    var image = style.image; // Image original width, height
+
+    var ow;
+    var oh;
+
+    if (isImage(image)) {
+      var src = image.src;
+
+      if (src === this._imageSrc) {
+        ow = this._imageWidth;
+        oh = this._imageHeight;
+      } else {
+        var imageRuntimeStyle = image.runtimeStyle;
+        var oldRuntimeWidth = imageRuntimeStyle.width;
+        var oldRuntimeHeight = imageRuntimeStyle.height;
+        imageRuntimeStyle.width = 'auto';
+        imageRuntimeStyle.height = 'auto'; // get the original size
+
+        ow = image.width;
+        oh = image.height; // and remove overides
+
+        imageRuntimeStyle.width = oldRuntimeWidth;
+        imageRuntimeStyle.height = oldRuntimeHeight; // Caching image original width, height and src
+
+        this._imageSrc = src;
+        this._imageWidth = ow;
+        this._imageHeight = oh;
+      }
+
+      image = src;
+    } else {
+      if (image === this._imageSrc) {
+        ow = this._imageWidth;
+        oh = this._imageHeight;
+      }
+    }
+
+    if (!image) {
+      return;
+    }
+
+    var x = style.x || 0;
+    var y = style.y || 0;
+    var dw = style.width;
+    var dh = style.height;
+    var sw = style.sWidth;
+    var sh = style.sHeight;
+    var sx = style.sx || 0;
+    var sy = style.sy || 0;
+    var hasCrop = sw && sh;
+    var vmlEl = this._vmlEl;
+
+    if (!vmlEl) {
+      // FIXME 浣跨敤 group 鍦� left, top 閮戒笉鏄� 0 鐨勬椂鍊欏氨鏃犳硶鏄剧ず浜嗐��
+      // vmlEl = vmlCore.createNode('group');
+      vmlEl = doc.createElement('div');
+      initRootElStyle(vmlEl);
+      this._vmlEl = vmlEl;
+    }
+
+    var vmlElStyle = vmlEl.style;
+    var hasRotation = false;
+    var m;
+    var scaleX = 1;
+    var scaleY = 1;
+
+    if (this.transform) {
+      m = this.transform;
+      scaleX = sqrt(m[0] * m[0] + m[1] * m[1]);
+      scaleY = sqrt(m[2] * m[2] + m[3] * m[3]);
+      hasRotation = m[1] || m[2];
+    }
+
+    if (hasRotation) {
+      // If filters are necessary (rotation exists), create them
+      // filters are bog-slow, so only create them if abbsolutely necessary
+      // The following check doesn't account for skews (which don't exist
+      // in the canvas spec (yet) anyway.
+      // From excanvas
+      var p0 = [x, y];
+      var p1 = [x + dw, y];
+      var p2 = [x, y + dh];
+      var p3 = [x + dw, y + dh];
+      applyTransform(p0, p0, m);
+      applyTransform(p1, p1, m);
+      applyTransform(p2, p2, m);
+      applyTransform(p3, p3, m);
+      var maxX = mathMax$8(p0[0], p1[0], p2[0], p3[0]);
+      var maxY = mathMax$8(p0[1], p1[1], p2[1], p3[1]);
+      var transformFilter = [];
+      transformFilter.push('M11=', m[0] / scaleX, comma, 'M12=', m[2] / scaleY, comma, 'M21=', m[1] / scaleX, comma, 'M22=', m[3] / scaleY, comma, 'Dx=', round$3(x * scaleX + m[4]), comma, 'Dy=', round$3(y * scaleY + m[5]));
+      vmlElStyle.padding = '0 ' + round$3(maxX) + 'px ' + round$3(maxY) + 'px 0'; // FIXME DXImageTransform 鍦� IE11 鐨勫吋瀹规ā寮忎笅涓嶈捣浣滅敤
+
+      vmlElStyle.filter = imageTransformPrefix + '.Matrix(' + transformFilter.join('') + ', SizingMethod=clip)';
+    } else {
+      if (m) {
+        x = x * scaleX + m[4];
+        y = y * scaleY + m[5];
+      }
+
+      vmlElStyle.filter = '';
+      vmlElStyle.left = round$3(x) + 'px';
+      vmlElStyle.top = round$3(y) + 'px';
+    }
+
+    var imageEl = this._imageEl;
+    var cropEl = this._cropEl;
+
+    if (!imageEl) {
+      imageEl = doc.createElement('div');
+      this._imageEl = imageEl;
+    }
+
+    var imageELStyle = imageEl.style;
+
+    if (hasCrop) {
+      // Needs know image original width and height
+      if (!(ow && oh)) {
+        var tmpImage = new Image();
+        var self = this;
+
+        tmpImage.onload = function () {
+          tmpImage.onload = null;
+          ow = tmpImage.width;
+          oh = tmpImage.height; // Adjust image width and height to fit the ratio destinationSize / sourceSize
+
+          imageELStyle.width = round$3(scaleX * ow * dw / sw) + 'px';
+          imageELStyle.height = round$3(scaleY * oh * dh / sh) + 'px'; // Caching image original width, height and src
+
+          self._imageWidth = ow;
+          self._imageHeight = oh;
+          self._imageSrc = image;
+        };
+
+        tmpImage.src = image;
+      } else {
+        imageELStyle.width = round$3(scaleX * ow * dw / sw) + 'px';
+        imageELStyle.height = round$3(scaleY * oh * dh / sh) + 'px';
+      }
+
+      if (!cropEl) {
+        cropEl = doc.createElement('div');
+        cropEl.style.overflow = 'hidden';
+        this._cropEl = cropEl;
+      }
+
+      var cropElStyle = cropEl.style;
+      cropElStyle.width = round$3((dw + sx * dw / sw) * scaleX);
+      cropElStyle.height = round$3((dh + sy * dh / sh) * scaleY);
+      cropElStyle.filter = imageTransformPrefix + '.Matrix(Dx=' + -sx * dw / sw * scaleX + ',Dy=' + -sy * dh / sh * scaleY + ')';
+
+      if (!cropEl.parentNode) {
+        vmlEl.appendChild(cropEl);
+      }
+
+      if (imageEl.parentNode != cropEl) {
+        cropEl.appendChild(imageEl);
+      }
+    } else {
+      imageELStyle.width = round$3(scaleX * dw) + 'px';
+      imageELStyle.height = round$3(scaleY * dh) + 'px';
+      vmlEl.appendChild(imageEl);
+
+      if (cropEl && cropEl.parentNode) {
+        vmlEl.removeChild(cropEl);
+        this._cropEl = null;
+      }
+    }
+
+    var filterStr = '';
+    var alpha = style.opacity;
+
+    if (alpha < 1) {
+      filterStr += '.Alpha(opacity=' + round$3(alpha * 100) + ') ';
+    }
+
+    filterStr += imageTransformPrefix + '.AlphaImageLoader(src=' + image + ', SizingMethod=scale)';
+    imageELStyle.filter = filterStr;
+    vmlEl.style.zIndex = getZIndex(this.zlevel, this.z, this.z2); // Append to root
+
+    append(vmlRoot, vmlEl); // Text
+
+    if (style.text != null) {
+      this.drawRectText(vmlRoot, this.getBoundingRect());
+    }
+  };
+
+  ZImage.prototype.onRemove = function (vmlRoot) {
+    remove(vmlRoot, this._vmlEl);
+    this._vmlEl = null;
+    this._cropEl = null;
+    this._imageEl = null;
+    this.removeRectText(vmlRoot);
+  };
+
+  ZImage.prototype.onAdd = function (vmlRoot) {
+    append(vmlRoot, this._vmlEl);
+    this.appendRectText(vmlRoot);
+  };
+  /***************************************************
+   * TEXT
+   **************************************************/
+
+
+  var DEFAULT_STYLE_NORMAL = 'normal';
+  var fontStyleCache = {};
+  var fontStyleCacheCount = 0;
+  var MAX_FONT_CACHE_SIZE = 100;
+  var fontEl = document.createElement('div');
+
+  var getFontStyle = function (fontString) {
+    var fontStyle = fontStyleCache[fontString];
+
+    if (!fontStyle) {
+      // Clear cache
+      if (fontStyleCacheCount > MAX_FONT_CACHE_SIZE) {
+        fontStyleCacheCount = 0;
+        fontStyleCache = {};
+      }
+
+      var style = fontEl.style;
+      var fontFamily;
+
+      try {
+        style.font = fontString;
+        fontFamily = style.fontFamily.split(',')[0];
+      } catch (e) {}
+
+      fontStyle = {
+        style: style.fontStyle || DEFAULT_STYLE_NORMAL,
+        variant: style.fontVariant || DEFAULT_STYLE_NORMAL,
+        weight: style.fontWeight || DEFAULT_STYLE_NORMAL,
+        size: parseFloat(style.fontSize || 12) | 0,
+        family: fontFamily || 'Microsoft YaHei'
+      };
+      fontStyleCache[fontString] = fontStyle;
+      fontStyleCacheCount++;
+    }
+
+    return fontStyle;
+  };
+
+  var textMeasureEl; // Overwrite measure text method
+
+  $override$1('measureText', function (text, textFont) {
+    var doc$$1 = doc;
+
+    if (!textMeasureEl) {
+      textMeasureEl = doc$$1.createElement('div');
+      textMeasureEl.style.cssText = 'position:absolute;top:-20000px;left:0;' + 'padding:0;margin:0;border:none;white-space:pre;';
+      doc.body.appendChild(textMeasureEl);
+    }
+
+    try {
+      textMeasureEl.style.font = textFont;
+    } catch (ex) {// Ignore failures to set to invalid font.
+    }
+
+    textMeasureEl.innerHTML = ''; // Don't use innerHTML or innerText because they allow markup/whitespace.
+
+    textMeasureEl.appendChild(doc$$1.createTextNode(text));
+    return {
+      width: textMeasureEl.offsetWidth
+    };
+  });
+  var tmpRect$2 = new BoundingRect();
+
+  var drawRectText = function (vmlRoot, rect, textRect, fromTextEl) {
+    var style = this.style; // Optimize, avoid normalize every time.
+
+    this.__dirty && normalizeTextStyle(style, true);
+    var text = style.text; // Convert to string
+
+    text != null && (text += '');
+
+    if (!text) {
+      return;
+    } // Convert rich text to plain text. Rich text is not supported in
+    // IE8-, but tags in rich text template will be removed.
+
+
+    if (style.rich) {
+      var contentBlock = parseRichText(text, style);
+      text = [];
+
+      for (var i = 0; i < contentBlock.lines.length; i++) {
+        var tokens = contentBlock.lines[i].tokens;
+        var textLine = [];
+
+        for (var j = 0; j < tokens.length; j++) {
+          textLine.push(tokens[j].text);
+        }
+
+        text.push(textLine.join(''));
+      }
+
+      text = text.join('\n');
+    }
+
+    var x;
+    var y;
+    var align = style.textAlign;
+    var verticalAlign = style.textVerticalAlign;
+    var fontStyle = getFontStyle(style.font); // FIXME encodeHtmlAttribute ?
+
+    var font = fontStyle.style + ' ' + fontStyle.variant + ' ' + fontStyle.weight + ' ' + fontStyle.size + 'px "' + fontStyle.family + '"';
+    textRect = textRect || getBoundingRect(text, font, align, verticalAlign); // Transform rect to view space
+
+    var m = this.transform; // Ignore transform for text in other element
+
+    if (m && !fromTextEl) {
+      tmpRect$2.copy(rect);
+      tmpRect$2.applyTransform(m);
+      rect = tmpRect$2;
+    }
+
+    if (!fromTextEl) {
+      var textPosition = style.textPosition;
+      var distance$$1 = style.textDistance; // Text position represented by coord
+
+      if (textPosition instanceof Array) {
+        x = rect.x + parsePercent$3(textPosition[0], rect.width);
+        y = rect.y + parsePercent$3(textPosition[1], rect.height);
+        align = align || 'left';
+      } else {
+        var res = adjustTextPositionOnRect(textPosition, rect, distance$$1);
+        x = res.x;
+        y = res.y; // Default align and baseline when has textPosition
+
+        align = align || res.textAlign;
+        verticalAlign = verticalAlign || res.textVerticalAlign;
+      }
+    } else {
+      x = rect.x;
+      y = rect.y;
+    }
+
+    x = adjustTextX(x, textRect.width, align);
+    y = adjustTextY(y, textRect.height, verticalAlign); // Force baseline 'middle'
+
+    y += textRect.height / 2; // var fontSize = fontStyle.size;
+    // 1.75 is an arbitrary number, as there is no info about the text baseline
+    // switch (baseline) {
+    // case 'hanging':
+    // case 'top':
+    //     y += fontSize / 1.75;
+    //     break;
+    //     case 'middle':
+    //         break;
+    //     default:
+    //     // case null:
+    //     // case 'alphabetic':
+    //     // case 'ideographic':
+    //     // case 'bottom':
+    //         y -= fontSize / 2.25;
+    //         break;
+    // }
+    // switch (align) {
+    //     case 'left':
+    //         break;
+    //     case 'center':
+    //         x -= textRect.width / 2;
+    //         break;
+    //     case 'right':
+    //         x -= textRect.width;
+    //         break;
+    // case 'end':
+    // align = elementStyle.direction == 'ltr' ? 'right' : 'left';
+    // break;
+    // case 'start':
+    // align = elementStyle.direction == 'rtl' ? 'right' : 'left';
+    // break;
+    // default:
+    //     align = 'left';
+    // }
+
+    var createNode$$1 = createNode;
+    var textVmlEl = this._textVmlEl;
+    var pathEl;
+    var textPathEl;
+    var skewEl;
+
+    if (!textVmlEl) {
+      textVmlEl = createNode$$1('line');
+      pathEl = createNode$$1('path');
+      textPathEl = createNode$$1('textpath');
+      skewEl = createNode$$1('skew'); // FIXME Why here is not cammel case
+      // Align 'center' seems wrong
+
+      textPathEl.style['v-text-align'] = 'left';
+      initRootElStyle(textVmlEl);
+      pathEl.textpathok = true;
+      textPathEl.on = true;
+      textVmlEl.from = '0 0';
+      textVmlEl.to = '1000 0.05';
+      append(textVmlEl, skewEl);
+      append(textVmlEl, pathEl);
+      append(textVmlEl, textPathEl);
+      this._textVmlEl = textVmlEl;
+    } else {
+      // 杩欓噷鏄湪鍓嶉潰 appendChild 淇濊瘉椤哄簭鐨勫墠鎻愪笅
+      skewEl = textVmlEl.firstChild;
+      pathEl = skewEl.nextSibling;
+      textPathEl = pathEl.nextSibling;
+    }
+
+    var coords = [x, y];
+    var textVmlElStyle = textVmlEl.style; // Ignore transform for text in other element
+
+    if (m && fromTextEl) {
+      applyTransform(coords, coords, m);
+      skewEl.on = true;
+      skewEl.matrix = m[0].toFixed(3) + comma + m[2].toFixed(3) + comma + m[1].toFixed(3) + comma + m[3].toFixed(3) + ',0,0'; // Text position
+
+      skewEl.offset = (round$3(coords[0]) || 0) + ',' + (round$3(coords[1]) || 0); // Left top point as origin
+
+      skewEl.origin = '0 0';
+      textVmlElStyle.left = '0px';
+      textVmlElStyle.top = '0px';
+    } else {
+      skewEl.on = false;
+      textVmlElStyle.left = round$3(x) + 'px';
+      textVmlElStyle.top = round$3(y) + 'px';
+    }
+
+    textPathEl.string = encodeHtmlAttribute(text); // TODO
+
+    try {
+      textPathEl.style.font = font;
+    } // Error font format
+    catch (e) {}
+
+    updateFillAndStroke(textVmlEl, 'fill', {
+      fill: style.textFill,
+      opacity: style.opacity
+    }, this);
+    updateFillAndStroke(textVmlEl, 'stroke', {
+      stroke: style.textStroke,
+      opacity: style.opacity,
+      lineDash: style.lineDash
+    }, this);
+    textVmlEl.style.zIndex = getZIndex(this.zlevel, this.z, this.z2); // Attached to root
+
+    append(vmlRoot, textVmlEl);
+  };
+
+  var removeRectText = function (vmlRoot) {
+    remove(vmlRoot, this._textVmlEl);
+    this._textVmlEl = null;
+  };
+
+  var appendRectText = function (vmlRoot) {
+    append(vmlRoot, this._textVmlEl);
+  };
+
+  var list = [RectText, Displayable, ZImage, Path, Text]; // In case Displayable has been mixed in RectText
+
+  for (var i$3 = 0; i$3 < list.length; i$3++) {
+    var proto$8 = list[i$3].prototype;
+    proto$8.drawRectText = drawRectText;
+    proto$8.removeRectText = removeRectText;
+    proto$8.appendRectText = appendRectText;
+  }
+
+  Text.prototype.brushVML = function (vmlRoot) {
+    var style = this.style;
+
+    if (style.text != null) {
+      this.drawRectText(vmlRoot, {
+        x: style.x || 0,
+        y: style.y || 0,
+        width: 0,
+        height: 0
+      }, this.getBoundingRect(), true);
+    } else {
+      this.removeRectText(vmlRoot);
+    }
+  };
+
+  Text.prototype.onRemove = function (vmlRoot) {
+    this.removeRectText(vmlRoot);
+  };
+
+  Text.prototype.onAdd = function (vmlRoot) {
+    this.appendRectText(vmlRoot);
+  };
+}
+
+/**
+ * VML Painter.
+ *
+ * @module zrender/vml/Painter
+ */
+function parseInt10$1(val) {
+  return parseInt(val, 10);
+}
+/**
+ * @alias module:zrender/vml/Painter
+ */
+
+
+function VMLPainter(root, storage) {
+  initVML();
+  this.root = root;
+  this.storage = storage;
+  var vmlViewport = document.createElement('div');
+  var vmlRoot = document.createElement('div');
+  vmlViewport.style.cssText = 'display:inline-block;overflow:hidden;position:relative;width:300px;height:150px;';
+  vmlRoot.style.cssText = 'position:absolute;left:0;top:0;';
+  root.appendChild(vmlViewport);
+  this._vmlRoot = vmlRoot;
+  this._vmlViewport = vmlViewport;
+  this.resize(); // Modify storage
+
+  var oldDelFromStorage = storage.delFromStorage;
+  var oldAddToStorage = storage.addToStorage;
+
+  storage.delFromStorage = function (el) {
+    oldDelFromStorage.call(storage, el);
+
+    if (el) {
+      el.onRemove && el.onRemove(vmlRoot);
+    }
+  };
+
+  storage.addToStorage = function (el) {
+    // Displayable already has a vml node
+    el.onAdd && el.onAdd(vmlRoot);
+    oldAddToStorage.call(storage, el);
+  };
+
+  this._firstPaint = true;
+}
+
+VMLPainter.prototype = {
+  constructor: VMLPainter,
+  getType: function () {
+    return 'vml';
+  },
+
+  /**
+   * @return {HTMLDivElement}
+   */
+  getViewportRoot: function () {
+    return this._vmlViewport;
+  },
+  getViewportRootOffset: function () {
+    var viewportRoot = this.getViewportRoot();
+
+    if (viewportRoot) {
+      return {
+        offsetLeft: viewportRoot.offsetLeft || 0,
+        offsetTop: viewportRoot.offsetTop || 0
+      };
+    }
+  },
+
+  /**
+   * 鍒锋柊
+   */
+  refresh: function () {
+    var list = this.storage.getDisplayList(true, true);
+
+    this._paintList(list);
+  },
+  _paintList: function (list) {
+    var vmlRoot = this._vmlRoot;
+
+    for (var i = 0; i < list.length; i++) {
+      var el = list[i];
+
+      if (el.invisible || el.ignore) {
+        if (!el.__alreadyNotVisible) {
+          el.onRemove(vmlRoot);
+        } // Set as already invisible
+
+
+        el.__alreadyNotVisible = true;
+      } else {
+        if (el.__alreadyNotVisible) {
+          el.onAdd(vmlRoot);
+        }
+
+        el.__alreadyNotVisible = false;
+
+        if (el.__dirty) {
+          el.beforeBrush && el.beforeBrush();
+          (el.brushVML || el.brush).call(el, vmlRoot);
+          el.afterBrush && el.afterBrush();
+        }
+      }
+
+      el.__dirty = false;
+    }
+
+    if (this._firstPaint) {
+      // Detached from document at first time
+      // to avoid page refreshing too many times
+      // FIXME 濡傛灉姣忔閮藉厛 removeChild 鍙兘浼氬鑷翠竴浜涘~鍏呭拰鎻忚竟鐨勬晥鏋滄敼鍙�
+      this._vmlViewport.appendChild(vmlRoot);
+
+      this._firstPaint = false;
+    }
+  },
+  resize: function (width, height) {
+    var width = width == null ? this._getWidth() : width;
+    var height = height == null ? this._getHeight() : height;
+
+    if (this._width != width || this._height != height) {
+      this._width = width;
+      this._height = height;
+      var vmlViewportStyle = this._vmlViewport.style;
+      vmlViewportStyle.width = width + 'px';
+      vmlViewportStyle.height = height + 'px';
+    }
+  },
+  dispose: function () {
+    this.root.innerHTML = '';
+    this._vmlRoot = this._vmlViewport = this.storage = null;
+  },
+  getWidth: function () {
+    return this._width;
+  },
+  getHeight: function () {
+    return this._height;
+  },
+  clear: function () {
+    if (this._vmlViewport) {
+      this.root.removeChild(this._vmlViewport);
+    }
+  },
+  _getWidth: function () {
+    var root = this.root;
+    var stl = root.currentStyle;
+    return (root.clientWidth || parseInt10$1(stl.width)) - parseInt10$1(stl.paddingLeft) - parseInt10$1(stl.paddingRight) | 0;
+  },
+  _getHeight: function () {
+    var root = this.root;
+    var stl = root.currentStyle;
+    return (root.clientHeight || parseInt10$1(stl.height)) - parseInt10$1(stl.paddingTop) - parseInt10$1(stl.paddingBottom) | 0;
+  }
+}; // Not supported methods
+
+function createMethodNotSupport(method) {
+  return function () {
+    zrLog('In IE8.0 VML mode painter not support method "' + method + '"');
+  };
+} // Unsupported methods
+
+
+each$1(['getLayer', 'insertLayer', 'eachLayer', 'eachBuiltinLayer', 'eachOtherLayer', 'getLayers', 'modLayer', 'delLayer', 'clearLayer', 'toDataURL', 'pathToImage'], function (name) {
+  VMLPainter.prototype[name] = createMethodNotSupport(name);
+});
+
+registerPainter('vml', VMLPainter);
+
+exports.version = version;
+exports.dependencies = dependencies;
+exports.PRIORITY = PRIORITY;
+exports.init = init;
+exports.connect = connect;
+exports.disConnect = disConnect;
+exports.disconnect = disconnect;
+exports.dispose = dispose;
+exports.getInstanceByDom = getInstanceByDom;
+exports.getInstanceById = getInstanceById;
+exports.registerTheme = registerTheme;
+exports.registerPreprocessor = registerPreprocessor;
+exports.registerProcessor = registerProcessor;
+exports.registerPostUpdate = registerPostUpdate;
+exports.registerAction = registerAction;
+exports.registerCoordinateSystem = registerCoordinateSystem;
+exports.getCoordinateSystemDimensions = getCoordinateSystemDimensions;
+exports.registerLayout = registerLayout;
+exports.registerVisual = registerVisual;
+exports.registerLoading = registerLoading;
+exports.extendComponentModel = extendComponentModel;
+exports.extendComponentView = extendComponentView;
+exports.extendSeriesModel = extendSeriesModel;
+exports.extendChartView = extendChartView;
+exports.setCanvasCreator = setCanvasCreator;
+exports.registerMap = registerMap;
+exports.getMap = getMap;
+exports.dataTool = dataTool;
+exports.zrender = zrender;
+exports.number = number;
+exports.format = format;
+exports.throttle = throttle;
+exports.helper = helper;
+exports.matrix = matrix;
+exports.vector = vector;
+exports.color = color;
+exports.parseGeoJSON = parseGeoJson$1;
+exports.parseGeoJson = parseGeoJson;
+exports.util = ecUtil;
+exports.graphic = graphic;
+exports.List = List;
+exports.Model = Model;
+exports.Axis = Axis;
+exports.env = env$1;
+return exports;  //蹇呭姞浠g爜
+})));
+
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/element.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/element.js
new file mode 100644
index 0000000..7ea6c32
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/element.js
@@ -0,0 +1,502 @@
+/**
+
+ @Name锛歭ayui.element 甯哥敤鍏冪礌鎿嶄綔
+ @Author锛氳搐蹇�
+ @License锛歁IT
+    
+ */
+ 
+layui.define('jquery', function(exports){
+  "use strict";
+  
+  var $ = layui.$
+  ,hint = layui.hint()
+  ,device = layui.device()
+  
+  ,MOD_NAME = 'element', THIS = 'layui-this', SHOW = 'layui-show'
+  
+  ,Element = function(){
+    this.config = {};
+  };
+  
+  //鍏ㄥ眬璁剧疆
+  Element.prototype.set = function(options){
+    var that = this;
+    $.extend(true, that.config, options);
+    return that;
+  };
+  
+  //琛ㄥ崟浜嬩欢鐩戝惉
+  Element.prototype.on = function(events, callback){
+    return layui.onevent.call(this, MOD_NAME, events, callback);
+  };
+  
+  //澶栭儴Tab鏂板
+  Element.prototype.tabAdd = function(filter, options){
+    var TITLE = '.layui-tab-title'
+    ,tabElem = $('.layui-tab[lay-filter='+ filter +']')
+    ,titElem = tabElem.children(TITLE)
+    ,barElem = titElem.children('.layui-tab-bar')
+    ,contElem = tabElem.children('.layui-tab-content')
+    ,li = '<li id="tab_'+ ((options.item && options.item.moduleKey)?options.item.moduleKey:options.id) +'" lay-id="'+ (options.id||'') +'"'
+    +(options.attr ? ' lay-attr="'+ options.attr +'"' : '') + ((options.unAllowClose)?' lay-unAllowClose="true" ' : '') + '>'+ (options.title||'unnaming') +'</li>';
+    
+    barElem[0] ? barElem.before(li) : titElem.append(li);
+
+    //weidy@2018-03-02淇敼 澧炲姞JS瀵硅薄鍜岄摼鎺ョ綉缁滐紝鍙互鍦ㄥ璞′腑鑾峰彇content
+      if(!element.tabConfig){
+         element.tabConfig = {};
+      }
+      if(options.content){
+          contElem.append('<div class="layui-tab-item">'+ (options.content||'') +'</div>');
+      }else if(options.item){
+          if(options.item.multiCompent){
+              contElem.append('<div class="layui-tab-item">' + (options.item.getContent(options.item.id)||'') +'</div>');
+              options.item.init(options.item.id,options.item.sourceData);
+          }else{
+              contElem.append('<div class="layui-tab-item">' + (options.item.getContent()||'') +'</div>');
+              options.item.init();
+          }
+          element.tabConfig[filter + "_" + options.id] = options.item;
+      }else if(options.href){
+          if(!options.id){
+              options.id = layui.util.uuid();
+          }
+          contElem.append('<div class="layui-tab-item" id="tabcontent_' + options.id + '"></div>');
+          var loadListener = function(){};
+          if(options.readListeners){
+              loadListener = options.readListeners;
+          }
+          $(".layui-tab[lay-filter='" + filter +"'] #tabcontent_" + options.id).load(projectName + options.href,loadListener);
+      }
+    //contElem.append('<div class="layui-tab-item">'+ (options.content||'') +'</div>');
+    call.hideTabMore(true);
+    call.tabAuto();
+    return this;
+  };
+  
+  //澶栭儴Tab鍒犻櫎
+  Element.prototype.tabDelete = function(filter, layid){
+    var TITLE = '.layui-tab-title'
+    ,tabElem = $('.layui-tab[lay-filter='+ filter +']')
+    ,titElem = tabElem.children(TITLE)
+    ,liElem = titElem.find('>li[lay-id="'+ layid +'"]');
+    call.tabDelete(null, liElem);
+    return this;
+  };
+  
+  //澶栭儴Tab鍒囨崲
+  Element.prototype.tabChange = function(filter, layid){
+    var TITLE = '.layui-tab-title'
+    ,tabElem = $('.layui-tab[lay-filter='+ filter +']')
+    ,titElem = tabElem.children(TITLE)
+    ,liElem = titElem.find('>li[lay-id="'+ layid +'"]');
+    call.tabClick.call(liElem[0], null, null, liElem);
+    return this;
+  };
+  
+  //鑷畾涔塗ab閫夐」鍗�
+  Element.prototype.tab = function(options){
+    options = options || {};
+    dom.on('click', options.headerElem, function(e){
+      var index = $(this).index();
+      call.tabClick.call(this, e, index, null, options);
+    });
+  };
+  
+  
+  //鍔ㄦ�佹敼鍙樿繘搴︽潯
+  Element.prototype.progress = function(filter, percent){
+    var ELEM = 'layui-progress'
+    ,elem = $('.'+ ELEM +'[lay-filter='+ filter +']')
+    ,elemBar = elem.find('.'+ ELEM +'-bar')
+    ,text = elemBar.find('.'+ ELEM +'-text');
+    elemBar.css('width', percent);
+    text.text(percent);
+    return this;
+  };
+  
+  var NAV_ELEM = '.layui-nav', NAV_ITEM = 'layui-nav-item', NAV_BAR = 'layui-nav-bar'
+  ,NAV_TREE = 'layui-nav-tree', NAV_CHILD = 'layui-nav-child', NAV_MORE = 'layui-nav-more'
+  ,NAV_ANIM = 'layui-anim layui-anim-upbit'
+  
+  //鍩虹浜嬩欢浣�
+  ,call = {
+    //Tab鐐瑰嚮
+    tabClick: function(e, index, liElem, options){
+      options = options || {};
+      var othis = liElem || $(this)
+      ,index = index || othis.parent().children('li').index(othis)
+      ,parents = options.headerElem ? othis.parent() : othis.parents('.layui-tab').eq(0)
+      ,item = options.bodyElem ? $(options.bodyElem) : parents.children('.layui-tab-content').children('.layui-tab-item')
+      ,elemA = othis.find('a')
+      ,filter = parents.attr('lay-filter');
+      
+      if(!(elemA.attr('href') !== 'javascript:;' && elemA.attr('target') === '_blank')){
+        othis.addClass(THIS).siblings().removeClass(THIS);
+        item.eq(index).addClass(SHOW).siblings().removeClass(SHOW);
+      }
+      
+      layui.event.call(this, MOD_NAME, 'tab('+ filter +')', {
+        elem: parents
+        ,index: index
+      });
+    }
+    
+    //Tab鍒犻櫎
+    ,tabDelete: function(e, othis){
+      var li = othis || $(this).parent(), index = li.index()
+      ,parents = li.parents('.layui-tab').eq(0)
+      ,item = parents.children('.layui-tab-content').children('.layui-tab-item')
+      ,filter = parents.attr('lay-filter');
+      
+      if(li.hasClass(THIS)){
+        if(li.next()[0]){
+          call.tabClick.call(li.next()[0], null, index + 1);
+        } else if(li.prev()[0]){
+          call.tabClick.call(li.prev()[0], null, index - 1);
+        }
+      }
+      
+      li.remove();
+      item.eq(index).remove();
+      setTimeout(function(){
+        call.tabAuto();
+      }, 50);
+      
+      layui.event.call(this, MOD_NAME, 'tabDelete('+ filter +')', {
+        elem: parents
+        ,index: index
+      });
+    }
+    
+    //Tab鑷�傚簲
+    ,tabAuto: function(){
+      var SCROLL = 'layui-tab-scroll', MORE = 'layui-tab-more', BAR = 'layui-tab-bar'
+      ,CLOSE = 'layui-tab-close', that = this;
+      
+      $('.layui-tab').each(function(){
+        var othis = $(this)
+        ,title = othis.children('.layui-tab-title')
+        ,item = othis.children('.layui-tab-content').children('.layui-tab-item')
+        ,STOPE = 'lay-stope="tabmore"'
+        ,span = $('<span class="layui-unselect layui-tab-bar" '+ STOPE +'><i '+ STOPE +' class="layui-icon">&#xe61a;</i></span>');
+
+        if(that === window && device.ie != 8){
+          call.hideTabMore(true)
+        }
+        
+        //鍏佽鍏抽棴
+        if(othis.attr('lay-allowClose')){
+          title.find('li').each(function(){
+            var li = $(this);
+            //weidy@2018-03-02淇敼锛屽鏋滈�夐」鍗′笉璁╁垹闄わ紝灏卞湪杩欎釜li涓婅缃� lay-unAllowClose
+            if(!li.find('.'+CLOSE)[0] && "true" != li.attr("lay-unAllowClose")){
+              var close = $('<i class="layui-icon layui-unselect '+ CLOSE +'">&#x1006;</i>');
+              close.on('click', call.tabDelete);
+              li.append(close);
+            }
+          });
+        }
+        
+        if(typeof othis.attr('lay-unauto') === 'string') return;
+        
+        //鍝嶅簲寮�
+        if(title.prop('scrollWidth') > title.outerWidth()+1){
+          if(title.find('.'+BAR)[0]) return;
+          title.append(span);
+          othis.attr('overflow', '');
+          span.on('click', function(e){
+            title[this.title ? 'removeClass' : 'addClass'](MORE);
+            this.title = this.title ? '' : '鏀剁缉';
+          });
+        } else {
+          title.find('.'+BAR).remove();
+          othis.removeAttr('overflow');
+        }
+      });
+    }
+    //闅愯棌鏇村Tab
+    ,hideTabMore: function(e){
+      var tsbTitle = $('.layui-tab-title');
+      if(e === true || $(e.target).attr('lay-stope') !== 'tabmore'){
+        tsbTitle.removeClass('layui-tab-more');
+        tsbTitle.find('.layui-tab-bar').attr('title','');
+      }
+    }
+    
+    //鐐瑰嚮涓�绾ц彍鍗�
+    /*
+    ,clickThis: function(){
+      var othis = $(this), parents = othis.parents(NAV_ELEM)
+      ,filter = parents.attr('lay-filter')
+      ,elemA = othis.find('a')
+      ,unselect = typeof othis.attr('lay-unselect') === 'string';
+
+      if(othis.find('.'+NAV_CHILD)[0]) return;
+      
+      if(!(elemA.attr('href') !== 'javascript:;' && elemA.attr('target') === '_blank') && !unselect){
+        parents.find('.'+THIS).removeClass(THIS);
+        othis.addClass(THIS);
+      }
+      
+      layui.event.call(this, MOD_NAME, 'nav('+ filter +')', othis);
+    }
+    )
+    */
+    
+    //鐐瑰嚮鑿滃崟 - a鏍囩瑙﹀彂
+    ,clickThis: function(){
+      var othis = $(this)
+      ,parents = othis.parents(NAV_ELEM)
+      ,filter = parents.attr('lay-filter')
+      ,parent = othis.parent() 
+      ,child = othis.siblings('.'+NAV_CHILD)
+      ,unselect = typeof parent.attr('lay-unselect') === 'string';
+      
+      if(!(othis.attr('href') !== 'javascript:;' && othis.attr('target') === '_blank') && !unselect){
+        if(!child[0]){
+          parents.find('.'+THIS).removeClass(THIS);
+          parent.addClass(THIS);
+        }
+      }
+      
+      //濡傛灉鏄瀭鐩磋彍鍗�
+      if(parents.hasClass(NAV_TREE)){
+        child.removeClass(NAV_ANIM);
+        
+        //濡傛灉鏈夊瓙鑿滃崟锛屽垯灞曞紑
+        if(child[0]){
+          if(!$("#portal_menu").hasClass('sidebarHover')) {
+            parent[child.css('display') === 'none' ? 'addClass': 'removeClass'](NAV_ITEM+'ed');
+          }
+          if(parents.attr('lay-shrink') === 'all'){
+            parent.siblings().removeClass(NAV_ITEM + 'ed');
+          }
+        }
+      }
+      
+      layui.event.call(this, MOD_NAME, 'nav('+ filter +')', othis);
+    }
+    
+    //鐐瑰嚮瀛愯彍鍗曢�変腑
+    /*
+    ,clickChild: function(){
+      var othis = $(this), parents = othis.parents(NAV_ELEM)
+      ,filter = parents.attr('lay-filter');
+      parents.find('.'+THIS).removeClass(THIS);
+      othis.addClass(THIS);
+      layui.event.call(this, MOD_NAME, 'nav('+ filter +')', othis);
+    }
+    */
+    
+    //鎶樺彔闈㈡澘
+    ,collapse: function(){
+      var othis = $(this), icon = othis.find('.layui-colla-icon')
+      ,elemCont = othis.siblings('.layui-colla-content')
+      ,parents = othis.parents('.layui-collapse').eq(0)
+      ,filter = parents.attr('lay-filter')
+      ,isNone = elemCont.css('display') === 'none';
+      
+      //鏄惁鎵嬮鐞�
+      if(typeof parents.attr('lay-accordion') === 'string'){
+        var show = parents.children('.layui-colla-item').children('.'+SHOW);
+        show.siblings('.layui-colla-title').children('.layui-colla-icon').html('&#xe602;');
+        show.removeClass(SHOW);
+      }
+      
+      elemCont[isNone ? 'addClass' : 'removeClass'](SHOW);
+      icon.html(isNone ? '&#xe61a;' : '&#xe602;');
+      
+      layui.event.call(this, MOD_NAME, 'collapse('+ filter +')', {
+        title: othis
+        ,content: elemCont
+        ,show: isNone
+      });
+    }
+  };
+  
+  //鍒濆鍖栧厓绱犳搷浣�
+  Element.prototype.init = function(type, filter){
+    var that = this, elemFilter = function(){
+      return filter ? ('[lay-filter="' + filter +'"]') : '';
+    }(), items = {
+      
+      //Tab閫夐」鍗�
+      tab: function(){
+        call.tabAuto.call({});
+      }
+      
+      //瀵艰埅鑿滃崟
+      ,nav: function(){
+        var TIME = 200, timer = {}, timerMore = {}, timeEnd = {}, follow = function(bar, nav, index){
+          var othis = $(this), child = othis.find('.'+NAV_CHILD);
+
+          if(nav.hasClass(NAV_TREE)){
+            bar.css({
+              top: othis.position().top-50
+              ,height: othis.children('a').outerHeight()
+              ,opacity: 1
+            });
+          } else {
+            child.addClass(NAV_ANIM);
+            bar.css({
+              left: othis.position().left + parseFloat(othis.css('marginLeft'))
+              ,top: othis.position().top + othis.height() - bar.height()
+            });
+            
+            timer[index] = setTimeout(function(){
+              bar.css({
+                width: othis.width()
+                ,opacity: 1
+              });
+            }, device.ie && device.ie < 10 ? 0 : TIME);
+            
+            clearTimeout(timeEnd[index]);
+            if(child.css('display') === 'block'){
+              clearTimeout(timerMore[index]);
+            }
+            timerMore[index] = setTimeout(function(){
+              child.addClass(SHOW)
+              othis.find('.'+NAV_MORE).addClass(NAV_MORE+'d');
+            }, 300);
+          }
+        }
+        
+        $(NAV_ELEM + elemFilter).each(function(index){
+          var othis = $(this)
+          ,bar = $('<span class="'+ NAV_BAR +'"></span>')
+          ,itemElem = othis.find('.'+NAV_ITEM);
+          
+          //Hover婊戝姩鏁堟灉
+          if(!othis.find('.'+NAV_BAR)[0]){
+            othis.append(bar);
+            itemElem.on('mouseenter', function(){
+              follow.call(this, bar, othis, index);
+            }).on('mouseleave', function(){
+              if(!othis.hasClass(NAV_TREE)){
+                clearTimeout(timerMore[index]);
+                timerMore[index] = setTimeout(function(){
+                  othis.find('.'+NAV_CHILD).removeClass(SHOW);
+                  othis.find('.'+NAV_MORE).removeClass(NAV_MORE+'d');
+                }, 300);
+              }
+            });
+            othis.on('mouseleave', function(){
+              clearTimeout(timer[index])
+              timeEnd[index] = setTimeout(function(){
+                if(othis.hasClass(NAV_TREE)){
+                  bar.css({
+                    height: 0
+                    ,top: bar.position().top + bar.height()/2
+                    ,opacity: 0
+                  });
+                } else {
+                  bar.css({
+                    width: 0
+                    ,left: bar.position().left + bar.width()/2
+                    ,opacity: 0
+                  });
+                }
+              }, TIME);
+            });
+          }
+          
+          //灞曞紑瀛愯彍鍗�
+          itemElem.find('a').each(function(){
+            var thisA = $(this)
+            ,parent = thisA.parent()
+            ,child = thisA.siblings('.'+NAV_CHILD);
+            
+            //杈撳嚭灏忕澶�
+            if(child[0] && !thisA.children('.'+NAV_MORE)[0]){
+              thisA.append('<span class="'+ NAV_MORE +'"></span>');
+            }
+            
+            thisA.off('click', call.clickThis).on('click', call.clickThis); //鐐瑰嚮鑿滃崟
+          });
+        });
+      }
+      
+      //闈㈠寘灞�
+      ,breadcrumb: function(){
+        var ELEM = '.layui-breadcrumb';
+        
+        $(ELEM + elemFilter).each(function(){
+          var othis = $(this)
+          ,ATTE_SPR = 'lay-separator'
+          ,separator = othis.attr(ATTE_SPR) || '/'
+          ,aNode = othis.find('a');
+          if(aNode.next('span['+ ATTE_SPR +']')[0]) return;
+          aNode.each(function(index){
+            if(index === aNode.length - 1) return;
+            $(this).after('<span '+ ATTE_SPR +'>'+ separator +'</span>');
+          });
+          othis.css('visibility', 'visible');
+        });
+      }
+      
+      //杩涘害鏉�
+      ,progress: function(){
+        var ELEM = 'layui-progress';
+        $('.' + ELEM + elemFilter).each(function(){
+          var othis = $(this)
+          ,elemBar = othis.find('.layui-progress-bar')
+          ,percent = elemBar.attr('lay-percent');
+
+          elemBar.css('width', function(){
+            return /^.+\/.+$/.test(percent) 
+              ? (new Function('return '+ percent)() * 100) + '%'
+           : percent;
+          }());
+          
+          if(othis.attr('lay-showPercent')){
+            setTimeout(function(){
+              elemBar.html('<span class="'+ ELEM +'-text">'+ percent +'</span>');
+            },350);
+          }
+        });
+      }
+      
+      //鎶樺彔闈㈡澘
+      ,collapse: function(){
+        var ELEM = 'layui-collapse';
+        
+        $('.' + ELEM + elemFilter).each(function(){
+          var elemItem = $(this).find('.layui-colla-item')
+          elemItem.each(function(){
+            var othis = $(this)
+            ,elemTitle = othis.find('.layui-colla-title')
+            ,elemCont = othis.find('.layui-colla-content')
+            ,isNone = elemCont.css('display') === 'none';
+            
+            //鍒濆鐘舵��
+            elemTitle.find('.layui-colla-icon').remove();
+            elemTitle.append('<i class="layui-icon layui-colla-icon">'+ (isNone ? '&#xe602;' : '&#xe61a;') +'</i>');
+
+            //鐐瑰嚮鏍囬
+            elemTitle.off('click', call.collapse).on('click', call.collapse);
+          });     
+         
+        });
+      }
+    };
+
+    return items[type] ? items[type]() : layui.each(items, function(index, item){
+      item();
+    });
+  };
+  
+  Element.prototype.render = Element.prototype.init;
+
+  var element = new Element(), dom = $(document);
+  element.render();
+  
+  var TITLE = '.layui-tab-title li';
+  dom.on('click', TITLE, call.tabClick); //Tab鍒囨崲
+  dom.on('click', call.hideTabMore); //闅愯棌灞曞紑鐨凾ab
+  $(window).on('resize', call.tabAuto); //鑷�傚簲
+  
+  exports(MOD_NAME, element);
+});
+
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/flow.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/flow.js
new file mode 100644
index 0000000..542c7ec
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/flow.js
@@ -0,0 +1,176 @@
+/**
+
+ @Name锛歭ayui.flow 娴佸姞杞�
+ @Author锛氳搐蹇�
+ @License锛歁IT
+    
+ */
+ 
+ 
+layui.define('jquery', function(exports){
+  "use strict";
+  
+  var $ = layui.$, Flow = function(options){}
+  ,ELEM_MORE = 'layui-flow-more'
+  ,ELEM_LOAD = '<i class="layui-anim layui-anim-rotate layui-anim-loop layui-icon ">&#xe63e;</i>';
+
+  //涓绘柟娉�
+  Flow.prototype.load = function(options){
+    var that = this, page = 0, lock, isOver, lazyimg, timer;
+    options = options || {};
+    
+    var elem = $(options.elem); if(!elem[0]) return;
+    var scrollElem = $(options.scrollElem || document); //婊氬姩鏉℃墍鍦ㄥ厓绱�
+    var mb = options.mb || 50; //涓庡簳閮ㄧ殑涓寸晫璺濈
+    var isAuto = 'isAuto' in options ? options.isAuto : true; //鏄惁鑷姩婊氬姩鍔犺浇
+    var end = options.end || '娌℃湁鏇村浜�'; //鈥滄湯椤碘�濇樉绀烘枃妗�
+    
+    //婊氬姩鏉℃墍鍦ㄥ厓绱犳槸鍚︿负document
+    var notDocment = options.scrollElem && options.scrollElem !== document;
+    
+    //鍔犺浇鏇村
+    var ELEM_TEXT = '<cite>鍔犺浇鏇村</cite>'
+    ,more = $('<div class="layui-flow-more"><a href="javascript:;">'+ ELEM_TEXT +'</a></div>');
+    
+    if(!elem.find('.layui-flow-more')[0]){
+      elem.append(more);
+    }
+    
+    //鍔犺浇涓嬩竴涓厓绱�
+    var next = function(html, over){ 
+      html = $(html);
+      more.before(html);
+      over = over == 0 ? true : null;
+      over ? more.html(end) : more.find('a').html(ELEM_TEXT);
+      isOver = over;
+      lock = null;
+      lazyimg && lazyimg();
+    };
+    
+    //瑙﹀彂璇锋眰
+    var done = function(){
+      lock = true;
+      more.find('a').html(ELEM_LOAD);
+      typeof options.done === 'function' && options.done(++page, next);
+    };
+    
+    done();
+    
+    //涓嶈嚜鍔ㄦ粴鍔ㄥ姞杞�
+    more.find('a').on('click', function(){
+      var othis = $(this);
+      if(isOver) return;
+      lock || done();
+    });
+    
+    //濡傛灉鍏佽鍥剧墖鎳掑姞杞�
+    if(options.isLazyimg){
+      var lazyimg = that.lazyimg({
+        elem: options.elem + ' img'
+        ,scrollElem: options.scrollElem
+      });
+    }
+    
+    if(!isAuto) return that;
+    
+    scrollElem.on('scroll', function(){
+      var othis = $(this), top = othis.scrollTop();
+      
+      if(timer) clearTimeout(timer);
+      if(isOver) return;
+      
+      timer = setTimeout(function(){
+        //璁$畻婊氬姩鎵�鍦ㄥ鍣ㄧ殑鍙楂樺害
+        var height = notDocment ? othis.height() : $(window).height();
+        
+        //璁$畻婊氬姩鎵�鍦ㄥ鍣ㄧ殑瀹為檯楂樺害
+        var scrollHeight = notDocment
+          ? othis.prop('scrollHeight')
+        : document.documentElement.scrollHeight;
+
+        //涓寸晫鐐�
+        if(scrollHeight - top - height <= mb){
+          lock || done();
+        }
+      }, 100);
+    });
+    return that;
+  };
+  
+  //鍥剧墖鎳掑姞杞�
+  Flow.prototype.lazyimg = function(options){
+    var that = this, index = 0, haveScroll;
+    options = options || {};
+    
+    var scrollElem = $(options.scrollElem || document); //婊氬姩鏉℃墍鍦ㄥ厓绱�
+    var elem = options.elem || 'img';
+    
+    //婊氬姩鏉℃墍鍦ㄥ厓绱犳槸鍚︿负document
+    var notDocment = options.scrollElem && options.scrollElem !== document;
+    
+    //鏄剧ず鍥剧墖
+    var show = function(item, height){
+      var start = scrollElem.scrollTop(), end = start + height;
+      var elemTop = notDocment ? function(){
+        return item.offset().top - scrollElem.offset().top + start;
+      }() : item.offset().top;
+
+      /* 濮嬬粓鍙姞杞藉湪褰撳墠灞忚寖鍥村唴鐨勫浘鐗� */
+      if(elemTop >= start && elemTop <= end){
+        if(!item.attr('src')){
+          var src = item.attr('lay-src');
+          layui.img(src, function(){
+            var next = that.lazyimg.elem.eq(index);
+            item.attr('src', src).removeAttr('lay-src');
+            
+            /* 褰撳墠鍥剧墖鍔犺浇灏辩华鍚庯紝妫�娴嬩笅涓�涓浘鐗囨槸鍚﹀湪褰撳墠灞� */
+            next[0] && render(next);
+            index++;
+          });
+        }
+      }
+    }, render = function(othis, scroll){
+      
+      //璁$畻婊氬姩鎵�鍦ㄥ鍣ㄧ殑鍙楂樺害
+      var height = notDocment ? (scroll||scrollElem).height() : $(window).height();
+      var start = scrollElem.scrollTop(), end = start + height;
+
+      that.lazyimg.elem = $(elem);
+
+      if(othis){
+        show(othis, height);
+      } else {
+        //璁$畻鏈姞杞借繃鐨勫浘鐗�
+        for(var i = 0; i < that.lazyimg.elem.length; i++){
+          var item = that.lazyimg.elem.eq(i), elemTop = notDocment ? function(){
+            return item.offset().top - scrollElem.offset().top + start;
+          }() : item.offset().top;
+          
+          show(item, height);
+          index = i;
+          
+          //濡傛灉鍥剧墖鐨則op鍧愭爣锛岃秴鍑轰簡褰撳墠灞忥紝鍒欑粓姝㈠悗缁浘鐗囩殑閬嶅巻
+          if(elemTop > end) break;
+        }
+      }
+    };
+    
+    render();
+    
+    if(!haveScroll){
+      var timer;
+      scrollElem.on('scroll', function(){
+        var othis = $(this);
+        if(timer) clearTimeout(timer)
+        timer = setTimeout(function(){
+          render(null, othis);
+        }, 50);
+      }); 
+      haveScroll = true;
+    }
+    return render;
+  };
+  
+  //鏆撮湶鎺ュ彛
+  exports('flow', new Flow());
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/form.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/form.js
new file mode 100644
index 0000000..d4b1cd9
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/form.js
@@ -0,0 +1,2115 @@
+/**
+
+ @Name锛歭ayui.form 琛ㄥ崟缁勪欢
+ @Author锛氳搐蹇�
+ @License锛歁IT
+
+ */
+
+layui.define(['layer','vciWebComboxStore','vciWebRefer','laydate','upload'], function(exports){
+  "use strict";
+
+  var $ = layui.$
+  ,layer = layui.layer
+  ,hint = layui.hint()
+  ,device = layui.device()
+
+  ,MOD_NAME = 'form', ELEM = '.layui-form', THIS = 'layui-this', SHOW = 'layui-show', HIDE = 'layui-hide', DISABLED = 'layui-disabled'
+
+  ,Form = function(){
+    this.config = {
+      verify: {
+        required: [
+          /[\S]+/
+          ,'蹇呭~椤逛笉鑳戒负绌�'
+        ]
+        ,phone: [
+          /^1\d{10}$/
+          ,'璇疯緭鍏ユ纭殑鎵嬫満鍙�'
+        ]
+        ,email: [
+          /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/
+          ,'閭鏍煎紡涓嶆纭�'
+        ]
+        ,url: [
+          /(^#)|(^http(s*):\/\/[^\s]+\.[^\s]+)/
+          ,'閾炬帴鏍煎紡涓嶆纭�'
+        ]
+        // ,number: function(value){
+        //   if(!value || isNaN(value)) return '鍙兘濉啓鏁板瓧'
+        // }
+        ,number: function(value){
+          if(isNaN(value)) return '鍙兘濉啓鏁板瓧'
+        }
+        ,positiveNumber: function(value){
+          if(!/^[+]{0,1}(\d+)$/.test(value)) return '鍙兘濉啓姝f暣鏁�'
+        }
+        //涓嶅寘鍚�0
+        ,numbernotzero: function(value){
+          if(!/^[1-9]\d*$/.test(value)) return '鍙兘濉啓姝f暣鏁�'
+        }
+        ,date: [
+          /^(\d{4})[-\/](\d{1}|0\d{1}|1[0-2])([-\/](\d{1}|0\d{1}|[1-2][0-9]|3[0-1]))*$/
+          ,'鏃ユ湡鏍煎紡涓嶆纭�'
+        ]
+        ,identity: [
+          /(^\d{15}$)|(^\d{17}(x|X|\d)$)/
+          ,'璇疯緭鍏ユ纭殑韬唤璇佸彿'
+        ]
+        ,letter: [
+          /^[A-Za-z]+$/
+          ,'鍙兘杈撳叆瀛楁瘝'
+        ]
+
+      }
+    };
+    this.layout = {//甯冨眬-weidy@2018-03-05娣诲姞锛屽鍔犲垪甯冨眬鐨勬柟寮�
+    	form:'form',
+    	column:'column'
+    };
+    this.elementConfig = {//瀛楁鐨勯厤缃紝weidy@2018-03-05 鐢ㄤ簬娣诲姞瀛楁鐨勭浉鍏抽厤缃�
+    		defaultConfig:{
+    			defaultColumnOneRow:1,
+    			defaultLabelWidth:100,
+        		defaultInputWidth:190,
+        		defaultLabelAlign:'right'
+    		}
+    };
+    this.fieldsMap = {//鎵�鏈夌殑瀛楁
+
+    };
+    this.callbackOfAddItem = '';//瀛樺偍addItems 鐨刢allback changeItems闇�瑕侀噸鏂版覆鏌�
+    this.sourceDataOfAddItem = '';////瀛樺偍addItems sourceData changeItems闇�瑕侀噸鏂版覆鏌�
+    this.isAppendOfAddItem = '';//瀛樺偍addItems ipAppend changeItems闇�瑕侀噸鏂版覆鏌�
+    this.referFieldsMap = {
+      //鍙傜収鐨勫瓧娈�
+    }
+  };
+
+  //鍏ㄥ眬璁剧疆
+  Form.prototype.set = function(options){
+    var that = this;
+    $.extend(true, that.config, options);
+    return that;
+  };
+
+  //楠岃瘉瑙勫垯璁惧畾
+  Form.prototype.verify = function(settings){
+    var that = this;
+    $.extend(true, that.config.verify, settings);
+    return that;
+  };
+
+  //琛ㄥ崟浜嬩欢鐩戝惉
+  Form.prototype.on = function(events, callback){
+    return layui.onevent.call(this, MOD_NAME, events, callback);
+  };
+
+  //琛ㄥ崟鎺т欢娓叉煋
+  Form.prototype.render = function(type, filter){
+    var that = this
+    ,elemForm = $(ELEM + function(){
+      return filter ? ('[lay-filter="' + filter +'"]') : '';
+    }())
+    ,items = {
+
+      //涓嬫媺閫夋嫨妗�
+      select: function(){
+        var TIPS = '璇烽�夋嫨', CLASS = 'layui-form-select', TITLE = 'layui-select-title'
+        ,NONE = 'layui-select-none', initValue = '', thatInput
+
+        ,selects = elemForm.find('select'), hide = function(e, clear){
+          if(!$(e.target).parent().hasClass(TITLE) || clear){
+            $('.'+CLASS).removeClass(CLASS+'ed ' + CLASS+'up');
+            thatInput && initValue && thatInput.val(initValue);
+          }
+          thatInput = null;
+        }
+
+        ,events = function(reElem, disabled, isSearch){
+          var select = $(this)
+          ,title = reElem.find('.' + TITLE)
+          ,input = title.find('input')
+          ,dl = reElem.find('dl')
+          ,dds = dl.children('dd')
+          ,showRefer = title.find(".layui-search")
+          ,clearRefer = title.find(".layui-clear");
+
+          if(disabled) return;
+
+          //灞曞紑涓嬫媺
+          var showDown = function(){
+            var top = reElem.offset().top + reElem.outerHeight() + 5 - win.scrollTop()
+            ,dlHeight = dl.outerHeight();
+            reElem.addClass(CLASS+'ed');
+            dds.removeClass(HIDE);
+
+            //涓婁笅瀹氫綅璇嗗埆
+            if(top + dlHeight > win.height() && top >= dlHeight){
+              reElem.addClass(CLASS + 'up');
+            }
+          }, hideDown = function(choose){
+            reElem.removeClass(CLASS+'ed ' + CLASS+'up');
+            input.blur();
+
+            if(choose) return;
+
+            notOption(input.val(), function(none){
+              if(none){
+                initValue = dl.find('.'+THIS).html();
+                input && input.val(initValue);
+              }
+            });
+          };
+          var refer = select.attr("lay-refer");
+          var referEditable = ("true" == select.attr("lay-refer-editable")) ;
+          if(showRefer && referEditable){
+            showRefer.on('click',function (e) {
+              var readOnly = select.attr("readOnly");
+              readOnly == "readonly"?readOnly=true:{};
+              if($webUtil.isNotNull(refer) &&!readOnly) {
+                //璇存槑鏄痳efer
+                var vciRefer = layui.vciWebRefer;
+                var thisReferName = select.attr("name");
+                var showFieldName = select.attr("lay-refer-showfield");
+                if (!filter) {
+                  filter = select.parents('form').attr("lay-filter");
+                }
+                var referItem = that.referFieldsMap[filter + "${refer}" + thisReferName];
+                var options = referItem.referConfig;
+                options.showField = showFieldName;
+                vciRefer.newRefer(filter, thisReferName, select, options);
+
+                var formValues = that.getValues(filter, true);
+                that.setValues(formValues, filter);
+                vciRefer.showRefer(filter, thisReferName, formValues);
+                vciRefer.addChangeValueListener(filter, thisReferName, showFieldName, function (tfilter, tempRefer, tempShowRefer, value, rawValue, selectData) {
+                  var tempValues = {};
+                  tempValues[tempRefer] = value;
+                  tempValues[tempShowRefer] = rawValue;
+                  that.setValues(tempValues, tfilter, true);
+                  layui.event.call(this, MOD_NAME, 'select(' + filter + ')', {
+                    elem: select[0]
+                    , value: value
+                    , othis: reElem,
+                    rowData: selectData,
+                    name: thisReferName
+                  });
+                });
+                return;
+              }
+            });
+          }
+          //鐐瑰嚮鏍囬鍖哄煙
+            title.on('click', function (e) {
+              if (referEditable) {
+                e.preventDefault();
+                input.focus();
+                //鎶婅繖涓笅鎷夋鐨勫�兼竻绌�.杩欐牱灏卞彧鑳借幏鍙栧埌鎵嬪姩杈撳叆鐨勫��
+                select.val("");
+                return;
+              }
+              //weidy鍦ㄨ繖閲屾坊鍔犲鏋滄槸鍙傜収鐨勬椂鍊�
+              var readOnly = select.attr("readOnly");
+              readOnly == "readonly" ? readOnly = true : {};
+              if(readOnly) return;
+              if ($webUtil.isNotNull(refer) && !readOnly) {
+                //璇存槑鏄痳efer
+                var vciRefer = layui.vciWebRefer;
+                var thisReferName = select.attr("name");
+                var showFieldName = select.attr("lay-refer-showfield");
+                if (!filter) {
+                  filter = select.parents('form').attr("lay-filter");
+                }
+                var referItem = that.referFieldsMap[filter + "${refer}" + thisReferName];
+                var options = referItem.referConfig;
+                options.showField = showFieldName;
+                vciRefer.newRefer(filter, thisReferName, select, options);
+                vciRefer.showRefer(filter, thisReferName, that.getValues(filter, true));
+                vciRefer.addChangeValueListener(filter, thisReferName, showFieldName, function (tfilter, tempRefer, tempShowRefer, value, rawValue, selectData) {
+                  var tempValues = {};
+                  tempValues[tempRefer] = value;
+                  tempValues[tempShowRefer] = rawValue;
+                  that.setValues(tempValues, tfilter, true);
+                  layui.event.call(this, MOD_NAME, 'select(' + filter + ')', {
+                    elem: select[0]
+                    , value: value
+                    , othis: reElem,
+                    rowData: selectData,
+                    name: thisReferName
+                  });
+                });
+                return;
+              } else if ($webUtil.isNotNull(refer) && readOnly) {
+                return;
+              }
+              reElem.hasClass(CLASS + 'ed') ? (
+                  hideDown()
+              ) : (
+                  hide(e, true),
+                      showDown()
+              );
+              dl.find('.' + NONE).remove();
+            });
+
+          //鐐瑰嚮绠ご鑾峰彇鐒︾偣
+          title.find('.layui-edge').on('click', function(){
+            input.focus();
+          });
+
+          if(clearRefer){
+        	  clearRefer.on('click',function(e){
+        		  var showFieldName = select.attr("lay-refer-showfield");
+        		  var thisRefer = select.attr("name");
+        		  var tempValues = {};
+    			  tempValues[thisRefer] = "";
+    			  tempValues[showFieldName] = "";
+    			  that.setValues(tempValues, filter,true);
+        		  var vciRefer = layui.vciWebRefer;
+        		  vciRefer.clearValue(filter,thisRefer);
+        		  layui.stope(e);
+        		  return false;
+        	  });
+          }
+
+          //閿洏浜嬩欢
+          input.on('keyup', function(e){
+            var keyCode = e.keyCode;
+            //Tab閿�
+            if(keyCode === 9){
+              showDown();
+            }
+          }).on('keydown', function(e){
+            var keyCode = e.keyCode;
+            //Tab閿�
+            if(keyCode === 9){
+              hideDown();
+            } else if(keyCode === 13){ //鍥炶溅閿�
+              e.preventDefault();
+            }
+          });
+
+          //妫�娴嬪�兼槸鍚︿笉灞炰簬select椤�
+          var notOption = function(value, callback, origin){
+            var num = 0;
+            layui.each(dds, function(){
+              var othis = $(this)
+              ,text = othis.text()
+              ,not = text.indexOf(value) === -1;
+              if(value === '' || (origin === 'blur') ? value !== text : not) num++;
+              origin === 'keyup' && othis[not ? 'addClass' : 'removeClass'](HIDE);
+            });
+            var none = num === dds.length;
+            return callback(none), none;
+          };
+
+          //鎼滅储鍖归厤
+          var search = function(e){
+            var value = this.value, keyCode = e.keyCode;
+
+            if(keyCode === 9 || keyCode === 13
+              || keyCode === 37 || keyCode === 38
+              || keyCode === 39 || keyCode === 40
+            ){
+              return false;
+            }
+
+            notOption(value, function(none){
+              if(none){
+                dl.find('.'+NONE)[0] || dl.append('<p class="'+ NONE +'">鏃犲尮閰嶉」</p>');
+              } else {
+                dl.find('.'+NONE).remove();
+              }
+            }, 'keyup');
+
+            if(value === ''){
+              dl.find('.'+NONE).remove();
+            }
+          };
+
+          if(isSearch) {
+            input.on('keyup', search).on('blur', function (e) {
+              var iseditable = select.attr('lay-combox-editable');
+              if (iseditable != 'true') {
+                thatInput = input;
+                initValue = dl.find('.' + THIS).html();
+                setTimeout(function () {
+                  notOption(input.val(), function (none) {
+                    initValue || input.val(''); //none && !initValue
+                  }, 'blur');
+                }, 200);
+              }
+
+            });
+          }
+
+          //閫夋嫨
+          dds.on('click', function(){
+            var othis = $(this), value = othis.attr('lay-value');var name = othis.text()
+            var selectFilter = select.attr('lay-filter'); //鑾峰彇杩囨护鍣�
+
+            if(othis.hasClass(DISABLED)) return false;
+
+            if(othis.hasClass('layui-select-tips')){
+              input.val('');
+            } else {
+              input.val(othis.text());
+              othis.addClass(THIS);
+            }
+
+            othis.siblings().removeClass(THIS);
+            select.val(value).removeClass('layui-form-danger')
+            layui.event.call(this, MOD_NAME, 'select('+ selectFilter +')', {
+              elem: select[0]
+              ,value: value
+              ,othis: reElem
+              ,name:name
+            });
+
+            hideDown(true);
+            return false;
+          });
+
+          reElem.find('dl>dt').on('click', function(e){
+            return false;
+          });
+
+          //鍏抽棴涓嬫媺
+          $(document).off('click', hide).on('click', hide);
+        }
+
+        selects.each(function(index, select){
+          var othis = $(this)
+          ,hasRender = othis.next('.'+CLASS)
+          ,disabled = this.disabled
+          ,value = select.value
+          ,selected = select.selectedIndex>-1?$(select.options[select.selectedIndex]) :{html:function (){return ''}} //鑾峰彇褰撳墠閫変腑椤�
+          ,optionsFirst = select.options[0];
+
+          if(typeof othis.attr('lay-ignore') === 'string') return othis.show();
+
+          var tooltips = typeof othis.attr('lay-tooltips') === 'string' ?othis.attr('lay-tooltips'):false
+
+          var isSearch = typeof othis.attr('lay-search') === 'string'
+          ,placeholder = optionsFirst ? (
+            optionsFirst.value ? TIPS : (optionsFirst.innerHTML || TIPS)
+          ) : TIPS;
+
+          var isNeedAddWidth = false;
+          var selectWidth = othis.css('width');
+          if($webUtil.isNotNull(selectWidth) || selectWidth>1){
+        	  isNeedAddWidth = true;
+          }
+          var isNeedAddHeight = false;
+          var selectHeight = othis.css('height');
+          if(othis.attr('style') ==null || othis.attr('style').indexOf('height') > -1 && ($webUtil.isNotNull(selectHeight) || selectHeight>1)){
+        	if (othis.attr('style') ==null) {
+              isNeedAddHeight = false;
+            }else{
+              isNeedAddHeight = true;
+            }
+
+          }
+        //weidy鍦ㄨ繖閲屾坊鍔犲鏋滄槸鍙傜収鐨勬椂鍊�
+    	  var refer = othis.attr("lay-refer");
+    	  var isRefer = false;
+    	  var isReferEditable = ("true" == othis.attr("lay-refer-editable"));
+          var isComboxEditable = ("true" == othis.attr("lay-combox-editable"));
+            var readOnly = othis.attr("readOnly");
+            if(readOnly == "readonly"){
+                readOnly = true;
+            }
+    	  if($webUtil.isNotNull(refer)){
+    		  isRefer = true;
+          }
+          var inDialog = false;
+          if(othis.attr("name") == 'conditionField' || othis.attr("name") == 'conditionOption' || othis.parent().attr("name") == 'conditionValue'){
+            inDialog = true;
+            isNeedAddWidth = false;
+          }
+    	  if("true" == othis.attr("inDialog")){
+              inDialog = true;
+          }
+          //鏇夸唬鍏冪礌
+          var selectNameText = othis.attr("selectTextName");
+          selectNameText= selectNameText?selectNameText:"";
+          var reElem = $(['<div class="'+ (isSearch ? '' : 'layui-unselect ') + CLASS + (readOnly ? ' layui-field-readonly ' : '')+ (disabled ? ' layui-select-disabled' : '')+ '"'
+                          + 'style="' + (isNeedAddWidth?('width:' + selectWidth + ';'):'')
+                          //+ ((!inDialog) ? 'margin-left:30px;':'')  wangting 闈炲脊绐楁槸鏄剧ず涓嶅锛屽幓鎺�
+                          + (isNeedAddHeight?('height:' + selectHeight + ';'):'')
+                          + '" >'
+            ,'<div class="'+ TITLE +'"><input type="text" name="' +  selectNameText + '" placeholder="'+ placeholder +'" value=\''+ (value ? selected.html() : '') +'\' '+(tooltips?'lay-tooltips="'+tooltips+'" ':'')+ ((isSearch  || isReferEditable || isComboxEditable)  ? '' : 'readonly') +' class="layui-input'+ (isSearch ? '' : ' layui-unselect') + (disabled ? (' ' + DISABLED) : '')  +  (readOnly? ' layui-field-readonly ':'')  + '" '  + (isNeedAddHeight?('style="height:' + selectHeight + ';"'):'') + '>'
+            //,((isRefer) ?(readOnly?'':'<i class="layui-search"></i><i class="layui-clear"></i></div>'):'<i class="layui-edge"></i></div>')
+            ,(readOnly ?'':(isRefer?'<i class="layui-search"></i><i class="layui-clear"></i></div>':'<i class="layui-edge"></i></div>'))
+            ,'<dl class="layui-anim layui-anim-upbit'+ (othis.find('optgroup')[0] ? ' layui-select-group' : '') +'">'+ function(options){
+              var arr = [];
+              layui.each(options, function(index, item){
+                if(index === 0 && !item.value){
+                  arr.push('<dd lay-value="" class="layui-select-tips">'+ (item.innerHTML || TIPS) +'</dd>');
+                } else if(item.tagName.toLowerCase() === 'optgroup'){
+                  arr.push('<dt>'+ item.label +'</dt>');
+                } else {
+                  if($(item).attr('data-type')){
+                    var dataType = $(item).attr('data-type')
+                    arr.push('<dd lay-value="'+ item.value +'" data-type="'+dataType+'" class="'+ (value === item.value ?  THIS : '') + (item.disabled ? (' '+DISABLED) : '') +'">'+ item.innerHTML +'</dd>');
+                  }else{
+                    arr.push('<dd lay-value="'+ item.value +'" class="'+ (value === item.value ?  THIS : '') + (item.disabled ? (' '+DISABLED) : '') +'">'+ item.innerHTML +'</dd>');
+                  }
+
+                }
+              });
+              arr.length === 0 && arr.push('<dd lay-value="" class="'+ DISABLED +'">娌℃湁閫夐」</dd>');
+              return arr.join('');
+            }(othis.find('*')) +'</dl>'
+          ,'</div>'].join(''));
+
+          hasRender[0] && hasRender.remove(); //濡傛灉宸茬粡娓叉煋锛屽垯Rerender
+          othis.after(reElem);
+          events.call(this, reElem, disabled, isSearch);
+        });
+      }
+      //澶嶉�夋/寮�鍏�
+      ,checkbox: function(){
+        var CLASS = {
+          checkbox: ['layui-form-checkbox', 'layui-form-checked', 'checkbox']
+          ,_switch: ['layui-form-switch', 'layui-form-onswitch', 'switch']
+        }
+        ,checks = elemForm.find('input[type=checkbox]')
+
+        ,events = function(reElem, RE_CLASS){
+          var check = $(this);
+
+          //鍕鹃��
+          reElem.on('click', function(){
+            var checkFilter = check.attr('lay-filter') //鑾峰彇杩囨护鍣�
+            ,text = (check.attr('lay-text')||'').split('|');
+            var skin = check.attr('lay-skin');
+            var isSwitch = false;
+            if(skin === 'switch'){
+              isSwitch = true;
+            }
+
+            if(check[0].disabled) return;
+
+            check[0].checked ? (
+              check[0].checked = false,
+                check.removeAttr('checked')
+              ,reElem.removeClass(RE_CLASS[1]).find('em').text(text[1]),
+                  (isSwitch?check[0].value='false':'')
+            ) : (
+              check[0].checked = true,
+            check.attr('checked','checked')
+              ,reElem.addClass(RE_CLASS[1]).find('em').text(text[0]),
+                  (isSwitch?check[0].value='true':'')
+            );
+
+            layui.event.call(check[0], MOD_NAME, RE_CLASS[2]+'('+ checkFilter +')', {
+              elem: check[0]
+              ,value: check[0].value
+              ,othis: reElem
+            });
+          });
+        }
+
+        checks.each(function(index, check){
+          var othis = $(this), skin = othis.attr('lay-skin')
+          ,text = (othis.attr('lay-text')||'').split('|'), disabled = this.disabled;
+          if(skin === 'switch') skin = '_'+skin;
+          var RE_CLASS = CLASS[skin] || CLASS.checkbox;
+
+          if(typeof othis.attr('lay-ignore') === 'string') return othis.show();
+
+          //鏇夸唬鍏冪礌
+          var hasRender = othis.next('.' + RE_CLASS[0]);
+          var reElem = $(['<div class="layui-unselect '+ RE_CLASS[0] + (
+            check.checked ? (' '+RE_CLASS[1]) : '') + (disabled ? ' layui-checkbox-disbaled '+DISABLED : '') +'" lay-skin="'+ (skin||'') +'">'
+          ,{
+            _switch: '<em>'+ ((check.checked ? text[0] : text[1])||'') +'</em><i></i>'
+          }[skin] || ((check.title.replace(/\s/g, '') ? ('<span>'+ check.title +'</span>') : '') +'<i class="layui-icon">'+ (skin ? '&#xe605;' : '&#xe605;') +'</i>')
+          ,'</div>'].join(''));
+
+          hasRender[0] && hasRender.remove(); //濡傛灉宸茬粡娓叉煋锛屽垯Rerender
+          othis.after(reElem);
+          events.call(this, reElem, RE_CLASS);
+        });
+      }
+      //鍗曢�夋
+      ,radio: function(){
+        var CLASS = 'layui-form-radio', ICON = ['&#xe643;', '&#xe63f;']
+        ,radios = elemForm.find('input[type=radio]')
+
+        ,events = function(reElem){
+          var radio = $(this), ANIM = 'layui-anim-scaleSpring';
+
+          reElem.on('click', function(){
+            var name = radio[0].name, forms = radio.parents(ELEM);
+            var radioFilter = radio.attr('lay-filter'); //鑾峰彇杩囨护鍣�
+            var sameRadio = forms.find('input[name='+ name.replace(/(\.|#|\[|\])/g, '\\$1') +']'); //鎵惧埌鐩稿悓name鐨勫厔寮�
+
+            if(radio[0].disabled) return;
+
+            layui.each(sameRadio, function(){
+              var next = $(this).next('.'+CLASS);
+              this.checked = false;
+              $(this).removeAttr('checked')
+              next.removeClass(CLASS+'ed');
+              next.find('.layui-icon').removeClass(ANIM).html(ICON[1]);
+            });
+
+            radio[0].checked = true;
+            radio.attr('checked','checked')
+            reElem.addClass(CLASS+'ed');
+            reElem.find('.layui-icon').addClass(ANIM).html(ICON[0]);
+
+            layui.event.call(radio[0], MOD_NAME, 'radio('+ radioFilter +')', {
+              elem: radio[0]
+              ,value: radio[0].value
+              ,othis: reElem
+            });
+          });
+        };
+
+        radios.each(function(index, radio){
+          var othis = $(this), hasRender = othis.next('.' + CLASS), disabled = this.disabled;
+
+          if(typeof othis.attr('lay-ignore') === 'string') return othis.show();
+          hasRender[0] && hasRender.remove(); //濡傛灉宸茬粡娓叉煋锛屽垯Rerender
+
+
+          //鏇夸唬鍏冪礌
+          var reElem = $(['<div class="layui-unselect '+ CLASS + (radio.checked ? (' '+CLASS+'ed') : '') + (disabled ? ' layui-radio-disbaled '+DISABLED : '') +'">'
+          ,'<i class="layui-anim layui-icon">'+ ICON[radio.checked ? 0 : 1] +'</i>'
+          ,'<div>'+ function(){
+            var title = radio.title || '';
+            if(typeof othis.next().attr('lay-radio') === 'string'){
+              title = othis.next().html();
+              othis.next().remove();
+            }
+            return title
+          }() +'</div>'
+          ,'</div>'].join(''));
+
+          othis.after(reElem);
+          events.call(this, reElem);
+        });
+      }
+      //鏂囨湰杈撳叆妗�
+      ,input:function () {
+        var inputs = elemForm.find('.layui-input[lay-tooltips],.layui-textarea[lay-tooltips]');
+        var  events = function (reElem, tipsStr) {
+          var input = $(this);
+          //閿洏浜嬩欢
+          input.on('mouseenter', function (e) {
+            that.tooltips = layer.tips(tipsStr, this, {tips: [2,"#FF5722"], time: 0})
+          }).on('mouseleave', function (e) {
+            layer.close(that.tooltips)
+          });
+        }
+
+        inputs.each(function (index, input) {
+          var othis = $(this)
+          if (typeof othis.attr('lay-tooltips') === 'string') {
+            events.call(this, input, othis.attr('lay-tooltips'));
+          }
+          ;
+        });
+      }
+    };
+    type ? (
+      items[type] ? items[type]() : hint.error('涓嶆敮鎸佺殑'+ type + '琛ㄥ崟娓叉煋')
+    ) : layui.each(items, function(index, item){
+      item();
+    });
+    return that;
+  };
+
+  //weidy@2018-03-05 澧炲姞琛ㄥ崟浠庡悗鍙板姞杞芥垨瀹氫箟銆佽缃�笺�佽幏鍙栧�煎拰楠岃瘉鐨勭瓑鏂规硶
+  Form.prototype.showCheckboxCss = function(checkes,checkboxEl,checked){
+      if(checkes && checkboxEl){
+          var RE_CLASS = 'layui-form-checked';
+          if(checkes.disabled) return;
+          checked  ? (
+              checkes.attr("checked",true)
+                  ,checkboxEl.addClass(RE_CLASS)
+          ) : (
+              checkes.attr("checked",false)
+                  ,checkboxEl.removeClass(RE_CLASS)
+          );
+      }
+  };
+  //wangting@2021-10-31 澧炲姞琛ㄥ崟浠庡悗鍙板姞杞芥垨瀹氫箟銆佽缃�笺�佽幏鍙栧�煎拰楠岃瘉鐨勭瓑鏂规硶
+  Form.prototype.showRadioCss = function(checkes,checkboxEl,checked){
+    if(checkes && checkboxEl){
+      var RE_CLASS = 'layui-form-radioed';
+      var s_CLASS = "layui-anim-scaleSpring",i = ["&#xe643;", "&#xe63f;"];
+      if(checkes.disabled) return;
+      checked  ? (
+          checkes.attr("checked",true)
+              ,checkboxEl.addClass(RE_CLASS).find(".layui-icon").addClass(s_CLASS).html(i[0])
+      ) : (
+          checkes.attr("checked",false)
+              ,checkboxEl.removeClass(RE_CLASS).find(".layui-icon").removeClass(s_CLASS).html(i[1])
+      );
+    }
+  };
+  //璁剧疆鍊肩殑鏂规硶
+  Form.prototype.setValues = function(values,filter,onlyReplace){
+	  var that = this;
+	  var elemForm = $(ELEM + function(){
+	      return filter ? ('[lay-filter="' + filter +'"]') : '';
+	    }());
+	  var fieldElem = elemForm.find('input,select,textarea');
+	  if(!that.formValues){
+	      that.formValues = {};
+      }
+      //modify by weidy锛屼笉鑳借缃畍alues鐨勫�硷紝鍚﹀垯鍙傜収鐨勬椂鍊欏氨浼氭妸浠ュ墠缂撳瓨鐨勫�奸兘娓呴櫎
+      //鍦ㄩ〉闈㈡�绘槸鏄剧ず琛ㄥ崟鐨勬椂鍊欙紝搴旇鍏坈lear鍚庡啀娣诲姞
+      if(!onlyReplace){
+        that.formValues[filter] = values;
+      }
+	  layui.each(fieldElem, function(_, item){
+	      item.name = (item.name || '').replace(/^\s*|\s*&/, '');
+
+	      if(!item.name) return;
+
+	      //鐢ㄤ簬鏀寔鏁扮粍 name
+	      if(/^.*\[\]$/.test(item.name)){
+	        var key = item.name.match(/^(.*)\[\]$/g)[0];
+	        nameIndex[key] = nameIndex[key] | 0;
+	        item.name = item.name.replace(/^(.*)\[\]$/, '$1['+ (nameIndex[key]++) +']');
+	      }
+	      //weidy@2018-12-3 澶嶉�夋涔熻缃�
+	     // if(/^checkbox|radio$/.test(item.type) && !item.checked) return;
+	      var name = item.name;
+	      if(values && (name in values)){
+	         if(values[name] == null){
+	            values[name] = "";
+             }
+	    	 if(item.type.indexOf("select")>-1){
+	    		 //璇存槑鏄笅鎷夋
+
+	    		 var showField = $(item).attr("lay-refer-showField");
+		   	     if($webUtil.isNotNull(showField)){
+		   	    	  var showValue = values[showField];
+		   	    	  if($webUtil.isNull(showValue)){
+		   	    		  showValue = '';
+		   	    	  }
+		   	    	  $(item).html('<option value=\'' + values[name] +'\' selected="selected">' + showValue + '</option>');
+		   	    	  $(item).parent().find('input').val(showValue);
+		   	     }else{
+		   	       //鏄剧ず涓嬫媺鑿滃崟鐨勫��
+                     $(item).parent().find('input').val($(item).find("option[value='" + values[name] + "']").text());
+                 }
+		   	     $(item).val(values[name]);
+		   	     //娓呴櫎閫夋嫨
+                 $(item).find("option").prop("selected", false);
+                 $(item).find("option[value='" + values[name] + "']").prop("selected", true);
+	    	 }else if(item.type.indexOf("textarea")>-1){
+	    		 $(item).val(values[name]);
+	    		 $(item).text($(item).val());
+	    	 }else if(item.type.indexOf("checkbox")> -1) {
+               //鐪嬬湅鏄笉鏄痵witch\
+               if ("_switch" == $(item).next().attr("lay-skin")) {
+                 //鐪嬬湅閲岄潰鐨勫�兼槸浠�涔�
+                 var checkedValue = $(item).attr("valueOnSelect");
+                 var showText = $(item).attr("lay-text");
+                 if ($webUtil.isNull(showText)) {
+                   showText = "ON|OFF";
+                 }
+                 var switchShowTexts = showText.split('|');
+                 if ((values[name] + '') == checkedValue) {
+                   $(item).attr("checked", "checked");
+                   $(item).next().addClass("layui-form-onswitch");
+                   $(item).next().find("em").html(switchShowTexts[0]);
+                   item.value = 'true'
+                 } else {
+                   $(item).next().removeClass("layui-form-onswitch");
+                   $(item).next().find("em").html(switchShowTexts[1]);
+                   $(item).attr("checked", "");
+                   item.value = 'false'
+                 }
+               } else {
+                 //澶嶉�夋
+                 if ($(item).val() == values[name]) {
+                   $(item).attr("checked", values[name]);
+                   $(item).next().addClass("layui-form-checked");
+                 } else {
+                   $(item).removeAttr("checked");
+                   $(item).next().removeClass("layui-form-checked");
+                 }
+               }
+             }else if(item.type.indexOf("radio")> -1) {
+               if ($(item).val() == values[name]) {
+                 $(item).attr("checked", values[name]);
+                 $(item).next().find('.layui-icon').html('&#xe643;');
+                 $(item).next().addClass("layui-form-radioed");
+               } else {
+                 $(item).removeAttr("checked");
+                 $(item).next().find('.layui-icon').html('&#xe63f;');
+                 $(item).next().removeClass("layui-form-radioed");
+               }
+             }else{
+	    		 $(item).val(values[name]);
+	    	 }
+	      }
+	      if(name.indexOf("[")>-1){
+	        //璇存槑鏄閫夋
+            //闇�瑕佽幏鍙栧叾鍊兼槸鍚﹁閫変腑
+            var itemName = name.substring(0,name.indexOf("["));
+            var needValue =  name.substring(name.indexOf("[") + 1,name.indexOf("]"));
+            if(values[itemName]){
+                var valueArray = values[itemName].split(',');
+                if($webUtil.inArray(valueArray,needValue)){
+                  $(item).attr("checked", "checked");
+                  $(item).next().addClass("layui-form-checked");
+                }
+            }
+          }
+	  });
+  };
+
+  //鑾峰彇鍊肩殑鏂规硶
+  Form.prototype.getValues = function(filter,hasCacheValue){
+	  var that = this;
+	  var elemForm = $(ELEM + function(){
+	      return filter ? ('[lay-filter="' + filter +'"]') : '';
+	    }());
+	  var fieldElem = elemForm.find('input,select,textarea');
+	  var values = '';
+      if(that.formValues){
+        values = that.formValues[filter]
+      }else{
+        values = '';
+      }
+	  if(!values || !hasCacheValue){
+	      values = {};
+      }
+	  var hasCheckNames = [];
+	  layui.each(fieldElem, function(_, item){
+	      /*item.name = (item.name || '').replace(/^\s*|\s*&/, '');
+
+	      if(!item.name) return;
+
+	      //鐢ㄤ簬鏀寔鏁扮粍 name
+	      if(/^.*\[\]$/.test(item.name)){
+	        var key = item.name.match(/^(.*)\[\]$/g)[0];
+	        nameIndex[key] = nameIndex[key] | 0;
+	        item.name = item.name.replace(/^(.*)\[\]$/, '$1['+ (nameIndex[key]++) +']');
+	      }item.name.indexOf
+
+	      if(/^checkbox|radio$/.test(item.type) && !item.checked) return;
+	      values[item.name] = item.value;*/
+         if(item.name.indexOf("[")>-1){
+             hasCheckNames.push(item.name);
+         }
+         if(item.type=='radio'){
+           values[item.name]=$(":radio[name='"+item.name+"']:checked",elemForm).val()
+         }else{
+           that.getValueByItem(item,values);
+         }
+
+	  });
+	  //鎵ц瀹屾垚鍚庝簡锛屽幓鏌ヨ澶嶉�夋
+      //澶嶉�夋鍙兘涓�涓兘娌℃湁閫夋嫨銆傞偅闇�瑕佸垽鏂繖涓�
+     if(hasCheckNames.length>0){
+       for(var index=0 ; index< hasCheckNames.length;index++){
+            var itemName = hasCheckNames[index].substring(0, hasCheckNames[index].indexOf("["));
+            if(itemName in values) {
+              delete values[itemName];
+            }
+        }
+     }
+      var checkboxKey = [];
+      for(var key in values) {
+        if (key.indexOf("[") > -1) {
+          //璇存槑鍙兘鏄閫夋
+          var valueOld = values[key];
+          var itemName = key.substring(0, key.indexOf("["));
+          if (!$webUtil.inArray(checkboxKey, itemName)) {
+            checkboxKey.push(itemName);
+          }
+          var value = key.substring(key.indexOf("[") + 1, key.indexOf("]"));
+          if (valueOld == "on") {
+            if (itemName in values && values[itemName] != null) {
+              values[itemName] = values[itemName] + "," + value;
+            } else {
+              values[itemName] = value;
+            }
+          } else {
+            if (itemName in values && values[itemName] != null) {
+              values[itemName] = values[itemName] + (valueOld?("," + valueOld):'');
+            } else {
+              values[itemName] = valueOld;
+            }
+          }
+          delete values[key];
+        }
+        if(key=='data' && $webUtil.isNull(values[key])){
+          delete values[key];
+        }
+      }
+	  return values;
+  };
+  Form.prototype.btmDefaultKeys = ['oid', 'id', 'name', 'description', 'revisionoid', 'nameoid', 'btmname', 'lastr', 'firstr', 'lastv', 'firstv', 'creator', 'createtime', 'lastModifier', 'lastmodifytime', 'revisionrule', 'revisionseq', 'revisionvalue', 'versionrule', 'versionseq', 'versionvalue', 'lcstatus', 'ts', 'owner', 'checkinby', 'checkintime', 'checkoutby', 'checkouttime', 'copyfromversion', 'secretgrade'];
+  Form.prototype.linkDefaultKeys = ['oid','creator','createtime','lastmodifier','lastmodifytime','f_oid','foid','f_revisionoid','frevisionoid','f_nameoid','fnameoid','f_btmname','fbtmname','t_oid','toid','t_revisionoid','trevisionoid','t_nameoid','tnameoid','t_btmname','tbtmname','ts'];
+
+  //wangting  2021-3-17
+  //灏嗗�兼媶鍒嗘垚榛樿灞炴�у拰闈為粯璁ゅ睘鎬т袱閮ㄥ垎
+  Form.prototype.getDefaultValues = function (filter,hasCacheValue,keys) {
+    var that = this;
+    var values = that.getValues(filter, hasCacheValue);
+    var defaultKeys = keys;
+    if (!defaultKeys) {
+      defaultKeys = that.btmDefaultKeys;
+    }
+    var defaultValues = {}, otherValue = {};
+    var indexofkey='';
+    if(device.ie && device.ie < 10){
+      defaultKeys.push('--');
+      defaultKeys=defaultKeys.join('--');
+      indexofkey='--';
+    }
+    for (var key in values) {
+      if (defaultKeys.indexOf(key.toLowerCase()+indexofkey) > -1) {
+        defaultValues[key] = values[key];
+      } else {
+        otherValue[key] = values[key];
+      }
+    }
+    return {
+      defaultValues:defaultValues,
+      otherValue:otherValue
+    }
+  }
+
+  Form.prototype.getValueByItem = function(item,values) {
+    var that = this;
+    var thisItemValue = that.getValueByEl(item);
+    if (typeof (thisItemValue) != "string" && thisItemValue == false) {
+      return false;
+    }
+    values[item.name] = thisItemValue;
+    //濡傛灉鏄弬鐓х殑
+    var showField = $(item).attr("lay-refer-showField");
+    if ($webUtil.isNotNull(showField)) {
+      if ($webUtil.isNull(thisItemValue)) {
+        var referConfig = eval("(" + $(item).attr("lay-refer") + ")");
+        if (referConfig.editable) {
+          //璇存槑鍙紪杈戠殑锛屽湪绌虹殑鏃跺�欒幏鍙栬緭鍏ョ殑鍊�
+          values[item.name] = $(item).next().find('input').val();
+          values[showField] = values[item.name];
+        } else {
+          values[showField] = $(item).find('option:selected').text();
+        }
+      } else {
+        values[showField] = $(item).find('option:selected').text();
+      }
+    }
+  };
+    Form.prototype.getValueByEl = function(item) {
+      item.name = (item.name || '').replace(/^\s*|\s*&/, '');
+
+      if (!item.name) return false;
+
+      //鐢ㄤ簬鏀寔鏁扮粍 name
+      if (/^.*\[\]$/.test(item.name)) {
+        var key = item.name.match(/^(.*)\[\]$/g)[0];
+        nameIndex[key] = nameIndex[key] | 0;
+        item.name = item.name.replace(/^(.*)\[\]$/, '$1[' + (nameIndex[key]++) + ']');
+      }
+
+      if (/^checkbox|radio$/.test(item.type)) {
+        //鐪嬬湅鏄笉鏄紑鍏�
+        var skin = $(item).attr("lay-skin");
+        if (skin === 'switch') {
+          return item.value;
+        } else {
+          if (item.checked) {
+            return item.value;
+          } else {
+            return '';
+          }
+        }
+      }
+      return item.value;
+    };
+
+  //楠岃瘉鏄惁閫氳繃
+  Form.prototype.validata = function(filter,verify) {
+    var that = this;
+    var elemForm = $(ELEM + function () {
+      return filter ? ('[lay-filter="' + filter + '"]') : '';
+    }());
+    //var fieldElem = elemForm.find('input,select,textarea');
+    if (!verify) {
+      verify = form.config.verify;
+    }
+    var stop = null;
+    var DANGER = 'layui-form-danger';
+    //鑾峰彇鎵�鏈夊惈鏈塴ay-verify鏍囪鐨勫瓧娈�
+    var verifyElem =$('*[lay-verify][type!="radio"][type!="checkbox"],*[lay-verify-div][lay-combox-type="radio"],*[lay-verify-div][lay-combox-type="checkbox"]',elemForm)
+
+    layui.each(verifyElem, function (_, item) {
+      var othis = $(this);
+      var vers,verText,verType,values={},value
+      if(othis.attr('lay-combox-type')=='radio'){
+        vers = othis.attr('lay-verify-div').split('|')
+        verText = othis.attr("lay-vertext-div")
+        values[othis.attr('lay-combox-name')]=$("input[name='"+othis.attr('lay-combox-name')+"']:checked",othis).val();
+        value = values[othis.attr('lay-combox-name')];
+      }else if(othis.attr('lay-combox-type')=='checkbox'){
+        vers = othis.attr('lay-verify-div').split('|')
+        verText = othis.attr("lay-vertext-div");
+        values[othis.attr('lay-combox-name')]=$("input[type='checkbox']:checked",othis).val();
+        value = values[othis.attr('lay-combox-name')];
+      }else {
+        vers = othis.attr('lay-verify').split('|')
+        verType = othis.attr('lay-verType') //鎻愮ず鏂瑰紡,
+        verText = othis.attr("lay-vertext")
+        that.getValueByItem(item, values);
+        value = values[item.name];
+      }
+
+
+      if (value == undefined) {
+        value = "";
+      }
+      othis.removeClass(DANGER);
+      layui.each(vers, function (_, thisVer) {
+        var isTrue //鏄惁鍛戒腑鏍¢獙
+            , errorText = '' //閿欒鎻愮ず鏂囨湰
+            , isFn = typeof verify[thisVer] === 'function';
+
+        //鍖归厤楠岃瘉瑙勫垯
+        if (verify[thisVer]) {
+          var isTrue = isFn ? errorText = verify[thisVer](value, item) : !verify[thisVer][0].test(value);
+          errorText = errorText || verify[thisVer][1];
+          if (layui.util.isNotNull(verText) && 'undefined' != verText) errorText = verText; //浠庡畾涔夌殑鍐呭涓婅幏鍙�
+          //weidy@2018-03-05.鎶婂瓧娈电殑鍚嶇О涔熷姞涓�
+          else if (othis.parent() && othis.parent().parent() && othis.parent().parent().children('label')) {
+            var fieldText=''
+            if(othis.attr('lay-verify-div')){
+              fieldText = othis.prev().html();
+            }else{
+              fieldText = othis.parent().prev().html();
+            }
+
+            if (fieldText != undefined) {
+              // if(fieldText != ''){
+              fieldText = fieldText.replace(":", "");
+              errorText = "(" + fieldText + ")" + errorText;
+            }
+          }
+          //濡傛灉鏄繀濉」鎴栬�呴潪绌哄懡涓牎楠岋紝鍒欓樆姝㈡彁浜わ紝寮瑰嚭鎻愮ず
+          if (isTrue) {
+            //鎻愮ず灞傞鏍�
+            if (verType === 'tips') {
+              layer.tips(errorText, function () {
+                if (typeof othis.attr('lay-ignore') !== 'string') {
+                  if (item.tagName.toLowerCase() === 'select' || /^checkbox|radio$/.test(item.type)) {
+                    return othis.next();
+                  }
+                }
+                return othis;
+              }(), {tips: 1});
+            } else if (verType === 'alert') {
+              layer.alert(errorText, {title: '鎻愮ず', shadeClose: true});
+            } else {
+              layer.msg(errorText, {icon: 5, shift: 6});
+            }
+            if (!device.android && !device.ios) item.focus(); //闈炵Щ鍔ㄨ澶囪嚜鍔ㄥ畾浣嶇劍鐐�
+            othis.addClass(DANGER);
+            return stop = true;
+          }
+        }
+      });
+      if (stop) return stop;
+    });
+
+    if (stop) {
+      return false;
+    } else {
+      return true;
+    }
+  };
+
+  //鍔犺浇鏁版嵁
+  Form.prototype.load = function(filter,options){
+	  var that = this;
+	  var elemForm = $(ELEM + function(){
+	      return filter ? ('[lay-filter="' + filter +'"]') : '';
+	    }());
+	  if(options){
+		  if(options.url){
+			  //璇存槑鏄�氳繃鍚庡彴鐨剈rl鏉ュ姞杞藉��
+			  $webUtil.ajax(options.method?options.method:'post',options.url,options.params?options.params:{},function(result){
+				  if(options.successParam?result[options.successParam]: result.success){
+				      if(options.setValueListener){
+                          options.setValueListener(result.obj,filter);
+                      }else {
+                          that.setValues(options.dataParam ? result[options.dataParam] : result.obj, filter);
+                      }
+					  if(options.callback){
+						  options.callback(result.obj,filter);
+					  }
+				  }
+			  },function (xhr,error) {
+                  $webUtil.showErrorMsg("鍔犺浇琛ㄥ崟鐨勬暟鎹殑鏃跺�欏嚭鐜颁簡閿欒锛屽彲鑳芥槸杩炰笉涓婃湇鍔″櫒");
+              },options.backPath?options.backPath:null,options.noProgress);
+		  }else if(options.data){
+			  that.setValues(options.data, filter);
+			  if(options.callback){
+				  options.callback();
+			  }
+		  }
+	  }
+  };
+  //娓呴櫎鎵�鏈夌殑鍊�
+  Form.prototype.clear = function(filter,isUseDefaultValue){
+	  var that = this;
+	  var elemForm = $(ELEM + function(){
+	      return filter ? ('[lay-filter="' + filter +'"]') : '';
+	    }());
+	  var fieldElem = elemForm.find('input,select,textarea');
+	  layui.each(fieldElem, function(_, item){
+	      item.name = (item.name || '').replace(/^\s*|\s*&/, '');
+
+	      if(!item.name) return;
+
+	      //鐢ㄤ簬鏀寔鏁扮粍 name
+	      if(/^.*\[\]$/.test(item.name)){
+	        var key = item.name.match(/^(.*)\[\]$/g)[0];
+	        nameIndex[key] = nameIndex[key] | 0;
+	        item.name = item.name.replace(/^(.*)\[\]$/, '$1['+ (nameIndex[key]++) +']');
+	      }
+
+	      if(/^checkbox|radio$/.test(item.type) && !item.checked) return;
+	      if(isUseDefaultValue || $webUtil.inArray(isUseDefaultValue,item.name)){
+	    	  item.value = that.getDefaultValue(filter,item.name);
+	      }else{
+	    	  item.value = "";
+	      }
+          var refer = $(item).attr("lay-refer");
+          if($webUtil.isNotNull(refer)) {
+              //璇存槑鏄痳efer
+              var vciRefer = layui.vciWebRefer;
+              var thisReferName = $(item).attr("name");
+              var values ={};
+              values[thisReferName] = '';
+              that.setValues(values,filter);
+              vciRefer.clearValue(filter, thisReferName);
+          }
+	  });
+  };
+
+
+
+  //璁剧疆榛樿鍊�,
+  Form.prototype.setDefaultValue=function(filter,defaultValueObject){
+	  var that = this;
+	  //濡傛灉defaultValueObject 涓嶆槸涓�涓暟缁勶紝鍒欐坊鍔犱负鏁扮粍
+	  if(!defaultValueObject){
+		  return;
+	  }
+	  if(!$webUtil.isArray(defaultValueObject)){
+		  defaultValueObject = [defaultValueObject];
+	  }
+	  if(!that.formDefaultValueMap){
+		  that.formDefaultValueMap = {};
+		  layui.each(defaultValueObject,function(_index,item){
+			  that.formDefaultValueMap[filter + "_" + item.name] = item.value;
+		  });
+	  }
+  };
+
+  //鑾峰彇榛樿鍊�
+  Form.prototype.getDefaultValue = function(filter,name){
+	  var that = this;
+	  if(!that.formDefaultValueMap){
+		  return '';
+	  }else{
+		  return that.formDefaultValueMap[filter + "_" + name];
+	  }
+  };
+
+  //琛ㄥ崟鎻愪氦
+  Form.prototype.submit=function(filter,options){
+	  var that = this;
+	  if(!options){
+		  options = {};
+	  }
+	  if(options.onSubmit){
+		  if(!options.onSubmit()){
+			  return;
+		  }
+	  }else{
+		  if(!that.validata(filter, options.verify?options.verify:{})){
+			  return;
+		  }
+	  }
+	  if(options.url){
+		  var values = that.getValues(filter);
+		  var submitValues = {};
+		  for(var key in values){
+			  var paramPrefix = "";
+			  if(options.paramPrefix){
+				  paramPrefix = options.paramPrefix;
+			  }
+			  var param = paramPrefix;
+			  if(options.paramMap && key in options.paramMap){
+				  param += options.paramMap[key];
+			  }else{
+				  param += key;
+			  }
+			  submitValues[param] = values[key];
+		  }
+		  if(options.extraParams){
+			  for(var key in options.extraParams){
+				  submitValues[key] = options.extraParams[key];
+			  }
+		  }
+		  $webUtil.post(url,submitValues,function(result){
+			  if(options.successParam?result[options.successParam]: result.success){
+				  if(options.clearOnSuccess){
+					  that.clear(filter, options.clearUseDefault?options.clearUseDefault:false);
+				  }
+				  if(options.callback){
+					  options.callback();
+				  }
+			  }
+		  });
+	  }
+  };
+  //璁剧疆瀛楁鍙/鍙栨秷鍙
+  Form.prototype.setReadOnly=function(filter,readOnly,fileds){
+	  var that = this;
+	  var elemForm = $(ELEM + function(){
+	      return filter ? ('[lay-filter="' + filter +'"]') : '';
+	    }());
+	  var fieldElem = elemForm.find('input,select,textarea');
+	  layui.each(fieldElem, function(_, item){
+	      item.name = (item.name || '').replace(/^\s*|\s*&/, '');
+
+	      if(!item.name) return;
+
+	      //鐢ㄤ簬鏀寔鏁扮粍 name
+	      if(/^.*\[\]$/.test(item.name)){
+	        var key = item.name.match(/^(.*)\[\]$/g)[0];
+	        nameIndex[key] = nameIndex[key] | 0;
+	        item.name = item.name.replace(/^(.*)\[\]$/, '$1['+ (nameIndex[key]++) +']');
+	      }
+
+	      if(/^checkbox|radio$/.test(item.type) && !item.checked) return;
+	      if(!fileds || (fields && $webUtil.inArray(fields,item.name))){
+	    	  if(readOnly){
+	    		  $(item).addClass('layui-field-readonly');
+	    		  $(item).attr('readOnly','readOnly');
+	    		  //璁剧疆readOnly
+	    	  }else{
+	    		  //鎵�鏈夌殑鍘婚櫎readOnly
+	    		  $(item).removeClass("layui-field-readonly");
+	    		  $(item).attr('readOnly',null);
+	    	  }
+	      }
+	  });
+  };
+
+  //璁剧疆瀛楁鐨勯厤缃�
+  Form.prototype.setElementConfig = function(filter,config){
+	  	//defaultColumnOneRow:1, 榛樿姣忚鏈夊灏戜釜瀛楁
+		//defaultLabelWidth:120,//瀛楁鐨勬爣绛剧殑瀹藉害
+		//defaultInputWidth:170,//瀛楁鐨勬枃鏈瀹藉害
+		//defaultLabelAlign:'right'//瀛楁鐨勫榻愭柟寮�
+	  var that = this;
+	  config = $.extend({},that.elementConfig['defaultConfig'],config);
+	  that.elementConfig[filter] = config;
+  };
+
+  Form.prototype.getElementConfig = function(filter){
+	  var that = this;
+	  if(filter in that.elementConfig){
+		  return that.elementConfig[filter];
+	  }else{
+		  return that.elementConfig['defaultConfig'];
+	  }
+  };
+
+
+  //娣诲姞瀛楁
+  Form.prototype.addItems = function(filter,items,callback,sourceData,config,isAppend){
+	  var that = this;
+      that.sourceDataOfAddItem = sourceData;
+      that.isAppendOfAddItem = isAppend;
+	  var elemForm = $(ELEM + function(){
+	      return filter ? ('[lay-filter="' + filter +'"]') : '';
+	  }());
+	  if(!config){
+	      config = {
+              defaultColumnOneRow:1,
+              inDialog:true
+          };
+      }
+      if(!("inDialog" in config)){
+          config['inDialog'] =true;
+      }
+	  if(config){//璁剧疆甯冨眬
+		  that.setElementConfig(filter,config);
+	  }
+	  config = that.getElementConfig(filter);
+	  if(!items){
+		  return ;
+	  }
+	  if(!$webUtil.isArray(items)){
+		  items = [items];
+	  }
+	    //defaultColumnOneRow:1, 榛樿姣忚鏈夊灏戜釜瀛楁
+		//defaultLabelWidth:120,//瀛楁鐨勬爣绛剧殑瀹藉害
+		//defaultInputWidth:170,//瀛楁鐨勬枃鏈瀹藉害
+		//defaultLabelAlign:'right'//瀛楁鐨勫榻愭柟寮�
+	  //娣诲姞瀛楁
+	  var colsCount =config.defaultColumnOneRow*1;
+	  if(colsCount<1){
+		  colsCount = 1;
+	  }
+	  var currentCol = 0;
+	  var itemsHtml ="";
+	  var allDefaultValue = {};
+	  var allAjaxItems =[];
+	  var allFinishAjaxCount = 0;
+      var allDateItems = [];
+      var allRateItems = [];
+	  layui.each(items,function(_index,item) {
+	      if(!("readOnly" in item) && config.readOnly){
+	          //璁剧疆鐨勫叏閮ㄩ兘鏄彧璇�
+              item.readOnly = true;
+          }
+          var isUseAllWidth = false;
+          var isNewRow = item.isNewRow;
+          //绫诲瀷
+          if (!item.type) {
+              item.type = "text";
+          }
+          item.type = item.type.toLocaleLowerCase();
+          if (item.field && !item.name) item.name = item.field;
+          if (item.key && !item.name) item.name = item.key;
+          if ($webUtil.inArray(['textarea', 'note', '5'], item.type) || item.useAllWidth) {
+              isUseAllWidth = true;
+          }
+          if($webUtil.inArray(['line'],item.type)){
+            isNewRow = true;
+            isUseAllWidth = true;
+          }
+          if (currentCol == 0 || isUseAllWidth || isNewRow ) {
+              if ((isNewRow || isUseAllWidth) && itemsHtml!='') {
+                  itemsHtml += '</div>';
+                  currentCol = 0;
+              }
+              itemsHtml += '<div class="layui-form-item">';
+          }
+
+          var name = $webUtil.getValueFromObj(item, ['name', 'field', 'key']);//name
+          item.name = name;
+          itemsHtml += that.getElementHtml(filter,item, config, sourceData);
+          if ($webUtil.inArray(['combox', 'select', 'combobox', '3'], item.type)) {
+              item.type = "combox";
+              var enumKey = $webUtil.getValueFromObj(item, ['comboxKey', 'comboxField', 'enumKey', 'enumField'], name);
+              item.comboxKey = enumKey;
+              allAjaxItems.push(item);
+          } else if ($webUtil.inArray(['date', 'datetime', 'time'], item.type)) {
+              //鏃ユ湡鏃堕棿
+              if (!item.name) {
+                  item.name = item.field || item.key;
+              }
+              allDateItems.push(item);
+          } else if ($webUtil.inArray(['rate'], item.type)) {
+            //鏃ユ湡鏃堕棿
+            if (!item.name) {
+              item.name = item.field || item.key;
+            }
+            allRateItems.push(item);
+          }else if($webUtil.inArray(['refer','combotree'],item.type)){
+            that.referFieldsMap[filter + "${refer}" + name] = item;
+          }else if ($webUtil.inArray(['radio', 'checkbox'], item.type)) {
+            if (!item.name) {
+              item.name = item.field || item.key;
+            }
+            allAjaxItems.push(item);
+          }
+
+          //榛樿鍊�
+          if (item.defaultValue) {
+              var tv = $webUtil.getDefaultValue(item.defaultValue, sourceData);
+              if (!tv) {
+                  tv = '';
+              }
+              allDefaultValue[name] = tv;
+          }
+          var hidden =  $webUtil.getBoolean($webUtil.getValueFromObj(item,['hidden','ishidden']));//鏄惁闅愯棌
+          // wangting 闅愯棌鍒椾笉璁℃暟
+          if(hidden){
+            currentCol--;
+          }
+          //if (!hidden) {
+              if (currentCol == colsCount - 1 || isUseAllWidth || isNewRow) {
+                  itemsHtml += '</div>';
+                  currentCol = 0;
+              } else {
+                 currentCol++;
+              }
+          //}
+	  });
+	  if(isAppend){
+		  elemForm.append(itemsHtml);
+		  var hasedItems = that.fieldsMap[filter];
+		  if(!hasedItems){
+			  hasedItems = [];
+		  }
+		  for(var i = 0 ;i < items.length ;i ++){
+			  hasedItems.push(items[i]);
+		  }
+		  that.fieldsMap[filter] = hasedItems;
+	  }else{
+		  that.fieldsMap[filter] = items;
+		  elemForm.html(itemsHtml);
+	  }
+      //weidy@2018-10-20 褰撳彧鏈変竴涓猧nput鐨勬椂鍊欙紝鐐瑰嚮鍥炶溅閿氨浼氬嚭鐜板埛鏂伴〉闈㈢殑鎯呭喌锛屽洜姝ゆ坊鍔犱竴涓殣钘忕殑input
+      elemForm.prepend('<input id="hiddenText" type="text" style="display:none" />');
+      if(allDateItems.length > 0){
+          //澶勭悊鏃堕棿鍜屾棩鏈熺殑瀛楁
+          var laydate = layui.laydate;
+          for(var i = 0 ; i < allDateItems.length ; i ++){
+              var item = allDateItems[i];
+              var format=item.format||item.dateFormate||'yyyy-MM-dd'
+              laydate.render({
+                  elem:'[lay-filter="' + filter +'"] input[name="' + item.name + '"]',
+                  type:item.type,
+                  value:$webUtil.formateDateByFormate(item.value,format),
+                  ready:item.ready,
+                  name:item.name,
+                  // format:item.format?item.format:'yyyy-MM-dd HH:mm:ss',
+                  format:format,
+                  done:function(value){
+                    layui.event.call(this, MOD_NAME, 'select('+ filter +')', {
+                      elem: this
+                      ,type: 'date'
+                      ,name:this.name
+                      ,value: value
+                    });
+                  }
+              });
+          }
+      }
+      if(allRateItems.length > 0){
+        //澶勭悊鏃堕棿鍜屾棩鏈熺殑瀛楁
+        var layrate = layui.rate;
+        for(var i = 0 ; i < allRateItems.length ; i ++){
+            var item = allRateItems[i];
+            var className = item.name;
+              layrate.render({
+                elem: '[lay-filter="' + filter +'"] div[name="' + item.name + '"]',
+                length: 5,  //鏄熸槦涓暟
+                value: 3, //鍒濆鍖栧��
+                theme: '#000099', //棰滆壊
+                half: false, //鏀寔鍗婇鏄�
+                text: false, //鏄剧ず鏂囨湰锛岄粯璁ゆ樉绀� '3.5鏄�'
+                readOnly: false,  //鍙
+                setText: function (value) {
+                  $("."+className).attr("data-value",value)
+                }
+            });
+        }
+      }
+	  if(allAjaxItems.length > 0 ){
+		  var combox = layui.vciWebComboxStore;
+		  for(var i = 0 ; i < allAjaxItems.length; i ++){
+			  var item = allAjaxItems[i];
+			  if(item.type == 'combox'||item.type == 'checkbox'||item.type == 'radio'){
+				  var options = {
+					  callback:function(comboxKey,data,allData) {
+                        //缁欎笅鎷夎彍鍗曡缃唴瀹�
+                        var selectElem = elemForm.find("[lay-combox='" + comboxKey + "']");
+                        selectElem.data(comboxKey,allData)
+                        var optionsHtml =[];
+                        var secretgrade = null;
+                        if (sourceData) {
+                          secretgrade = sourceData.secretgrade;
+                        }
+                        var i = 0;
+                        if (selectElem.attr("lay-combox-type") == 'checkbox') {
+                          selectElem.html(optionsHtml);
+                          var name = selectElem.attr("lay-combox-name");
+                          var readOnly = selectElem.attr("readOnly");
+                          for(var key in data){
+                            optionsHtml.push($( '<input type="checkbox" name="' + name +'[' + key + ']" value="' + key + '" title="' +data[key] +'" '
+                                + (readOnly="readOnly"?(' readOnly="readOnly" class="layui-field-readonly" '):'') + ' />').data('attributes',allData && allData[i]&&allData[i].attributes||{}));
+                            i++;
+                          }
+                          selectElem.empty().append(optionsHtml);
+                        } else if (selectElem.attr("lay-combox-type") == 'radio') {
+                          var name = selectElem.attr("lay-combox-name");
+                          var readOnly = selectElem.attr("readOnly");
+                          var selectedOption = '';
+                          for(var key in data){
+                            if (key == secretgrade) {
+                              selectedOption = "checked"
+                            } else if (key == item.defaultKey) {
+                              selectedOption = "checked"
+                            } else if (key == item.defaultValue) {
+                              selectedOption = "checked"
+                            } else if (i === 0) {
+                              selectedOption = "checked"
+                            } else {
+                              selectedOption = ""
+                            }
+                            optionsHtml.push($( '<input type="radio" name="' + name +'" value="' + key + '" title="' +data[key] +'" '+ selectedOption
+                                + ' lay-filter="' + selectElem.attr("lay-filter-div") + '" '
+                                + ' lay-verify="' + selectElem.attr("lay-verify-div") + '" '
+                                + ($webUtil.isNotNull(selectElem.attr("lay-vertext-div"))?' lay-vertext="' + selectElem.attr("lay-vertext-div") + '" ':'')
+                                + (readOnly="readOnly"?(' readOnly="readOnly" class="layui-field-readonly" '):'') + ' />').data('attributes',allData && allData[i]&&allData[i].attributes||{}));
+                            i++;
+                            selectedOption = "";
+                          }
+                          selectElem.empty().append(optionsHtml);
+                        } else {
+                          //combox
+                          optionsHtml =[$('<option value=""></option>')];
+                          var selectedOption = '';
+                          for (var key in data) {
+                            if (key == secretgrade) {
+                              selectedOption = "selected"
+                            } else if (key == item.defaultKey) {
+                              selectedOption = "selected"
+                            } else if (key == item.defaultValue) {
+                              selectedOption = "selected"
+                            } else if (i === 0) {
+                              selectedOption = "selected"
+                            } else {
+                              selectedOption = ""
+                            }
+                            if (item.unneedselect) {
+                              selectedOption = ""
+                            }
+                            optionsHtml.push($('<option value="' + key + '" '+selectedOption+'>' + data[key] + '</option>').data('attributes',allData && allData[i]&&allData[i].attributes||{}));
+                            i++;
+                            selectedOption = "";
+                          }
+                          selectElem.empty().append(optionsHtml);
+                        }
+                        allFinishAjaxCount++;
+                        if (allFinishAjaxCount == allAjaxItems.length) {
+                          that.render(null, filter);
+                          that.setValues(allDefaultValue, filter);
+                          if (callback) {
+                            callback(elemForm);
+                          }
+                        }
+                      },
+					  failCallback:function(comboxKey,msg){
+                          var selectElem = elemForm.find("[lay-combox='" + comboxKey +"']");
+                          selectElem.html(msg);
+						  allFinishAjaxCount++;
+						  if(allFinishAjaxCount == allAjaxItems.length){
+							  if(callback){
+								  callback(elemForm);
+							  }
+						  }
+					  },
+                      extraParams:item.extraParams
+				  };
+                  if("data" in item && $webUtil.isNotNull(item.data)){
+					  options['data'] = item['data'];
+				  }else{
+					  if("url" in item){
+						  options['url'] = item['url'];
+					  }else{
+						  options['url'] = "default";
+					  }
+				  }
+				  if("backPath" in item){
+				    options['backPath'] = item['backPath'];
+                  }
+                  if($webUtil.getBoolean($webUtil.getValueFromObj(item,['reloadCombox','reloadEnum'],false))){
+                      combox.newCombox(item.comboxKey,options,true);
+                  }else{
+                      combox.newCombox(item.comboxKey,options,false);
+                  }
+			  }else {
+
+              }
+		  }
+	  }
+	  else{
+		  that.render(null,filter);
+		  that.setValues(allDefaultValue,filter);
+		  if(callback){
+              that.callbackOfAddItem = callback;
+			  callback(elemForm);
+		  }
+	  }
+  };
+  Form.prototype.getFormItems = function(filter){
+    //鑾峰彇鍘熸湰
+      var that = this;
+      if(that.fieldsMap && filter in that.fieldsMap){
+        return that.fieldsMap[filter];
+      }
+      return null;
+  };
+    Form.prototype.changeItems = function(filter,items,beforeItems){
+        //闇�瑕佸浼犱竴涓師濮嬬殑瀛楁 beforeItems  淇敼鐨刬tems闇�瑕佸皢鍙傛暟鍐欏叏
+        //璋冩暣瀛楁鐨勯厤缃瓑鍐呭
+        var that = this;
+        var formValues = that.getValues(filter,true);
+        if(!beforeItems){
+          beforeItems = that.getFormItems(filter);
+        }
+        var elemForm = $(ELEM + function(){
+                return filter ? ('[lay-filter="' + filter +'"]') : '';
+            }());
+        var config = that.getElementConfig(filter);
+        if(!items){
+            return ;
+        }
+        if(!$webUtil.isArray(items)){
+            items = [items];
+        }
+        var combox = layui.vciWebComboxStore;
+        //defaultColumnOneRow:1, 榛樿姣忚鏈夊灏戜釜瀛楁
+        //defaultLabelWidth:120,//瀛楁鐨勬爣绛剧殑瀹藉害
+        //defaultInputWidth:170,//瀛楁鐨勬枃鏈瀹藉害
+        //defaultLabelAlign:'right'//瀛楁鐨勫榻愭柟寮�
+
+        //淇敼瀛楁----娉ㄦ剰鍙兘淇敼瀛楁鐨勯厤缃」锛屽寘鎷笅鎷夎彍鍗曪紝鍜屽弬鐓э紱
+        layui.each(items,function(_index,item){
+            //绫诲瀷
+            if(!item.type){
+                item.type = "text";
+            }
+            //item.name = item.name.trim();
+            item.type = item.type.toLocaleLowerCase();
+            var el = elemForm.find('[lay-filter="' + (item.name || item.field) + '"]');
+            if($webUtil.inArray(['combox','select','combobox','3'], item.type)){
+                //涓嬫媺鑿滃崟锛屽彲浠ヤ慨鏀筫numKey鍜岄�夋嫨鍐呭
+                var enumKey = $webUtil.getValueFromObj(item,['comboxKey','comboxField','enumKey','enumField'],name);//涓嬫媺鑿滃崟鐨勭紪鍙�
+                if(el && enumKey ){
+                    el.attr("lay-combox",enumKey);
+                }
+                if(item.data || item.url || item.reloadCombox){
+                    combox.reload(enumKey,item);
+                }
+            }else if($webUtil.inArray(['refer','combotree'],item.type)){
+                if(el && item.showField){
+                    el.attr("lay-refer-showField",item.showField);
+                }else if(el &&item.referConfig){
+                  var name = $webUtil.getValueFromObj(item, ['name', 'field', 'key']);//name
+                    var referConfig = item.referConfig;
+                    var vciRefer = layui.vciWebRefer;
+                    var oldReferConfig = vciRefer.getReferConfig(filter,name);
+                    oldReferConfig = $.extend(oldReferConfig,referConfig);
+                    vciRefer.newRefer(filter, name, el, oldReferConfig);
+                }
+            }
+        });
+         layui.each(beforeItems,function(bindex,bitem){
+             layui.each(items,function(_index,item){
+                 if((bitem.name || bitem.field) == (item.name || item.field)){
+                    bitem = $.extend(bitem,item);
+                    //beforeItems.splice(bindex,1,bitem);//灏嗗瓧娈靛彉涓烘渶鏂扮殑
+                 }
+             })
+         });
+         that.addItems(filter,beforeItems,that.callbackOfAddItem,that.sourceDataOfAddItem,config,that.isAppendOfAddItem);
+         that.setValues(formValues,filter);
+        //that.render(null,filter);
+    };
+
+    Form.prototype.removeItems = function(filter,items,isAll){
+        var that = this;
+        var elemForm = $(ELEM + function(){
+                return filter ? ('[lay-filter="' + filter +'"]') : '';
+            }());
+        var config = that.getElementConfig(filter);
+        if(!items && !isAll){
+            return ;
+        }
+        if(items && !$webUtil.isArray(items)){
+            items = [items];
+        }
+        if(isAll){
+            items = that.fieldsMap[filter];
+        }
+        var combox = layui.vciWebComboxStore;
+        var refer = layui.vciWebRefer;
+        layui.each(items,function(_index,item){
+            //绫诲瀷
+            if(!item.type){
+                item.type = "text";
+            }
+            item.name = item.name.trim();
+            item.type = item.type.toLocaleLowerCase();
+            var el = elemForm.find('[lay-filter="' + item.name + '"]');
+            var enumKey = el.attr("lay-combox");
+            if($webUtil.isNotNull(enumKey)){
+                //璇存槑鏄灇涓�
+                combox.destory(enumKey);
+            }
+            var referConfig = el.attr("lay-refer");
+            if($webUtil.isNotNull(referConfig)){
+                //璇存槑鏄弬鐓�
+                refer.destory(filter,item.name);
+            }
+            if(!isAll){
+                $webUtil.removeFormArray(that.fieldsMap[filter],item,"name");
+            }
+            el.remove();
+        });
+        if(isAll){
+            delete that.fieldsMap[filter];
+            elemForm.html("");
+        }
+    };
+
+  Form.prototype.getElementHtml = function(filter,item,config,sourceData){
+	  var that = this;
+	  //瀛楁鍚嶇О
+	  var name = $webUtil.getValueFromObj(item,['name','field','key']).trim();//name
+	  var title = $webUtil.getValueFromObj(item,['text','title']);//瀛楁鍚嶇О
+	  var titleColor = $webUtil.getValueFromObj(item,['titleColor','labelColor']);//瀛楁棰滆壊
+	  var titleWidth = $webUtil.getValueFromObj(item,['titleWidth','labelWidth'],config.labelWidth?config.labelWidth:config.defaultLabelWidth);//瀛楁瀹藉害
+	  var titleAlign = $webUtil.getValueFromObj(item,['titleAlign','labelAlign'],config.labelAlign?config.labelAlign:config.defaultLabelAlign);//瀛楁瀵归綈鏂瑰紡
+	  var titleHidden = $webUtil.getBoolean($webUtil.getValueFromObj(item,['hideTitle','hideLabel','hideFieldLabel'],false));//瀛楁瀵归綈鏂瑰紡
+	  var fieldIsNotNull = $webUtil.getBoolean($webUtil.getValueFromObj(item,['required','notNull','fieldNotNull'],false));//瀛楁鏄惁鍙互涓虹┖
+      var keyField = $webUtil.getBoolean($webUtil.getValueFromObj(item,['keyAttr'],false));
+	  var emptyText = $webUtil.getValueFromObj(item,['emptyTitle','emptyText','fieldEmptyText','fieldEmptyAlertText']);//瀛楁涓虹┖鏃剁殑鎻愮ず璇彞
+
+	  var textWidth = $webUtil.getValueFromObj(item,['textWidth','inputWidth'],config.textWidth?config.textWidth:config.defaultInputWidth);//鏂囨湰瀹藉害
+      var textStyle = $webUtil.getValueFromObj(item,['textStyle','inputStyle'],config.textStyle?config.textStyle:'');//鏂囨湰鏍峰紡
+	  var readOnly = $webUtil.getBoolean($webUtil.getValueFromObj(item,['readOnly','readonly','isDisable','disabled'],false));
+	  var placeholder = $webUtil.getValueFromObj(item,['placeholder','tiptext']);//瀛楁鎻愮ず淇℃伅
+	  var customLabelCss = $webUtil.getValueFromObj(item,['customLabelCss','customTitleCss']);//鑷畾涔夊瓧娈靛悕绉扮殑css
+	  var customTextCss = $webUtil.getValueFromObj(item,['customTextCss']);//鑷畾涔夊瓧娈电殑css
+	  var validateRule = $webUtil.getValueFromObj(item,['verify','validateRule']);//鑷畾涔夋牎楠岃鍒�
+	  var hidden =  $webUtil.getBoolean($webUtil.getValueFromObj(item,['hidden','ishidden'],false));//鏄惁闅愯棌
+      var search =  $webUtil.getBoolean($webUtil.getValueFromObj(item,['search','laysearch'],false));//涓嬫媺妗嗘槸鍚﹀彲鎼滅储
+      var tooltips =  $webUtil.getValueFromObj(item,['tooltips']);//鎻愮ず淇℃伅
+
+
+      var titleStyle = $webUtil.getValueFromObj(item,['titleStyle','labelStyle'],"");
+      var baseStyle='margin-left: 130px;margin-right:5px;';
+      if($webUtil.isNotNull(titleStyle) && !$webUtil.endWith(titleStyle,";")){
+        titleStyle = titleStyle + ";";
+      }
+	  if($webUtil.isNotNull(titleColor)){
+		  titleStyle = 'color:' + titleColor + ';';
+	  }
+	  if($webUtil.isNotNull(titleWidth) || titleWidth >0){
+		  titleStyle += 'width:' + titleWidth*1 +'px;';
+          baseStyle='margin-left:' + (titleWidth*1+30) +'px;';
+	  }
+	  if($webUtil.isNotNull(titleAlign) && $webUtil.inArray(['left','right','center'],titleAlign)){//鍙敮鎸佸乏瀵归綈鍜屽彸瀵归綈
+	      if($webUtil.inArray(['word','label'],item.type)){
+            titleAlign = "left";
+          }
+		  titleStyle += "text-align:" + titleAlign + ";" ;
+	  }
+	  if($webUtil.isNull(title) || titleHidden || hidden ){
+		  titleStyle += "display:none;";
+	  }
+    if(validateRule!=''&& !form.config.verify[validateRule]) {
+      form.config.verify[validateRule] = [
+        new RegExp(validateRule),
+        '杈撳叆鍐呭涓嶇鍚堥獙璇佽鍒�'
+      ]
+    }
+	  if(fieldIsNotNull ){
+		  validateRule = 'required|' + validateRule;
+		  customLabelCss = "layui-field-required " + customLabelCss;
+	  }
+      if(keyField){
+        customLabelCss = "layui-field-key-field " + customLabelCss;
+      }
+	  if($webUtil.isNotNull(validateRule) && $webUtil.endWith(validateRule,",")){
+		  validateRule = validateRule.substring(0,validateRule.length -1);
+	  }
+
+
+	  if($webUtil.isNotNull(textWidth) || textWidth>0){
+		 textStyle += ";width:" + textWidth*1 + "px;";
+	  }
+      var labelFlag = config.useLabelFlag?(" label-name-" + filter + "-" +name + " "):"";
+	  var labelHtml = '<label class="layui-form-label ' + labelFlag  + ($webUtil.isNotNull(customLabelCss)?customLabelCss:'') + '" '
+			  + ($webUtil.isNotNull(titleStyle)?('style="' + titleStyle +'" >'):'>') + title + ':</label>';
+	  if(readOnly){
+		  customTextCss = 'layui-field-readonly ' + customTextCss;
+	  }
+
+	  var baseCss = "layui-input-block";
+	  if(!config.inDialog){
+          config.inDialog = false;
+      }
+
+	  if(config.defaultColumnOneRow*1 >1 || config.inDialog){//鍦ㄥ脊鍑虹獥鍙i噷闈紝寰楅渶瑕乮nline
+		  baseCss = "layui-input-inline";
+          baseStyle='margin-right:5px;';
+        if($webUtil.isNotNull(textWidth) || textWidth>0){
+          baseStyle += "width:" + textWidth*1 + "px;";
+        }
+	  }
+      //鍓嶇紑
+      var prefix = $webUtil.getValueFromObj(item,['prefix']);
+      var prefixHtml = "";
+      if($webUtil.isNotNull(prefix)){
+          prefixHtml = "<div class='layui-form-mid layui-word-aux' " + (hidden?"style='display:none;'":"") + ">" + prefix + "</div>";
+      }
+      //鍚庣紑
+      var suffix =$webUtil.getValueFromObj(item,['suffix']);
+      var suffixHtml = "";
+      if($webUtil.isNotNull(suffix)){
+        suffixHtml = "<div class='layui-form-mid layui-word-aux' " + (hidden?"style='display:none;'":"") + ">" + suffix + "</div>";
+      }
+	  if($webUtil.inArray(['text','password','1','2','textfield','input','date','datetime','time'], item.type)){//鏂囨湰鍜屽瘑鐮佹---鏃ユ湡鏃堕棿涔熸槸鍦ㄨ繖閲岄潰
+		  var inputHtml = '<div class="' + baseCss + '" '  + 'style="'+(hidden?"display:none;":"")+baseStyle+'">';
+		  var inputType = "text";
+		  if($webUtil.inArray(['password','2'],item.type) ){
+			  inputType = 'password';
+		  }
+		  inputHtml+= ' <input type="' + inputType + '" name="' + name + '" ' + (fieldIsNotNull?'required ':'')
+			       + (readOnly?'readOnly="readOnly" ':'')
+                   + ' lay-filter="' + name + '" '
+			       + ($webUtil.isNotNull(validateRule)?('lay-verify="' +validateRule +'" '):'')
+                   + ($webUtil.isNotNull(emptyText)?('lay-vertext="' + emptyText +'" '):'')
+			       + ($webUtil.isNotNull(placeholder)?('placeholder="' + placeholder + '" '):'')
+                   + ($webUtil.isNotNull(tooltips)?('lay-tooltips="' + tooltips + '" '):'')
+			       + ($webUtil.isNotNull(textStyle)?(' style="' + textStyle +'" '):'')
+			       + ($webUtil.isNotNull(customTextCss)?('class="layui-input ' + customTextCss + '" '):'class="layui-input"')
+	               + ' autocomplete="off" />';
+		  return labelHtml + prefixHtml+ inputHtml  + '</div>' + suffixHtml;
+	  }
+	  else if($webUtil.inArray(['combox','select','combobox','3','radio','checkbox'], item.type)){//涓嬫媺妗嗭紝娉ㄦ剰鍙傜収涓嶄娇鐢ㄨ繖涓�
+		  var selectHtml = "<div ";//'<div class="layui-input-block" '  + hidden?'style="display:none;"':'';
+		  var enumKey = $webUtil.getValueFromObj(item,['comboxKey','comboxField','enumKey','enumField'],name);//涓嬫媺鑿滃崟鐨勭紪鍙�
+		  var isCheckbox = $webUtil.getBoolean($webUtil.getValueFromObj(item,['isCheckbox','isMutiSelect'])) || 'checkbox' == item.type;
+		  var isRadio = $webUtil.getBoolean($webUtil.getValueFromObj(item,['isRadio'])) || 'radio' == item.type;
+		  if(isCheckbox || isRadio){
+			  //澶氶�夋槸浣跨敤澶嶉�夋鐨勬柟寮忔潵灞曠ず
+			  if(hidden){
+				  textStyle += "display:none;";
+			  }
+			  selectHtml += ($webUtil.isNotNull(textStyle)?(' style="' + textStyle +'" '):'')
+				         + 'class="' + baseCss  + ' ' + ($webUtil.isNotNull(customTextCss)?(customTextCss + ' '):'') + '"'
+                         + ' lay-filter-div="' + name + '" '
+                         + ($webUtil.isNotNull(validateRule)?('lay-verify-div="' +validateRule +'" '):'')
+                         + (search?('lay-search="" '):'')
+                         + ($webUtil.isNotNull(tooltips)?('lay-tooltips="' + tooltips + '" '):'')
+                         + ($webUtil.isNotNull(emptyText)?('lay-vertext-div="' + emptyText +'" '):'')
+				         + ' lay-combox="' + enumKey +'" lay-combox-type="' + (isCheckbox? 'checkbox':'radio') +'" lay-combox-name="' + name +'" '
+				         + (readOnly?('readOnly="readOnly"'):'')
+                         + '>';
+		  }else{
+			  selectHtml += 'class="' + baseCss +'" '  + 'style="'+(hidden?"display:none;":"")+baseStyle+'"';
+			  selectHtml += '><select name="' + name + '" ' + (fieldIsNotNull?'required ':'' )
+				         + (readOnly?'readOnly="readOnly" ':'')
+                         + ' lay-filter="' + name + '" '
+                         + ($webUtil.isNotNull(emptyText)?('lay-vertext="' + emptyText +'" '):'')
+                         + (search?('lay-search="" '):'')
+                         + ($webUtil.isNotNull(tooltips)?('lay-tooltips="' + tooltips + '" '):'')
+					     + ($webUtil.isNotNull(validateRule)?('lay-verify="' +validateRule +'" '):'')
+						 + ($webUtil.isNotNull(textStyle)?(' style="' + textStyle +'" '):'')
+					     + ($webUtil.isNotNull(customTextCss)?('class="' + customTextCss + '" '):'')
+						 + 'lay-combox="' +  enumKey + '" inDialog="' + config.inDialog + '" '
+                         + (item.comboxTextField?(' selectTextName="' + item.comboxTextField + '" '):'')
+                         + ' lay-combox-editable="' + item.editable + '"></select>';
+		  }
+		  return labelHtml + prefixHtml +  selectHtml + "</div>" + suffixHtml;
+	  }else if($webUtil.inArray(['switch','boolean','truefalse','4'],item.type)){//寮�鍏�
+		  var switchHtml = '<div class="' + baseCss + '" '  + 'style="'+(hidden?"display:none;":"")+baseStyle+'">';
+		  var valueOnSelect = $webUtil.getValueFromObj(item,['switchCheckedValue'],"true");
+		  switchHtml+= ' <input type="checkbox" name="' + name + '" ' + (fieldIsNotNull?'required ':'')
+			       + (readOnly?'readOnly="readOnly" ':'')
+                   + ' lay-filter="' + name + '" '
+			       + ($webUtil.isNotNull(validateRule)?('lay-verify="' +validateRule +'" '):'')
+                   + ($webUtil.isNotNull(emptyText)?('lay-vertext="' + emptyText +'" '):'')
+			       + ($webUtil.isNotNull(placeholder)?('placeholder="' + placeholder + '" '):'')
+                   + ($webUtil.isNotNull(tooltips)?('lay-tooltips="' + tooltips + '" '):'')
+			       + ($webUtil.isNotNull(textStyle)?(' style="' + textStyle +'" '):'')
+			       + ($webUtil.isNotNull(customTextCss)?('class=" ' + customTextCss + '" '):'')
+	               + ' lay-skin="switch" lay-text="' + $webUtil.getValueFromObj(item,['switchText'],"鏄瘄鍚�")
+                   + '" valueOnSelect="' + valueOnSelect + '"/>';
+		  return labelHtml + prefixHtml + switchHtml +'</div>' + suffixHtml;
+    }else if($webUtil.inArray(['textarea','note','5'],item.type)){//鏂囨湰鍩�
+		  var inputHtml = '<div class="layui-input-block" '  + 'style="'+(($webUtil.isNotNull(titleWidth) || titleWidth>0)?'margin-left:'+titleWidth+'px;':'')+(hidden?"display:none;":"")+baseStyle+'">';
+          inputHtml+= ' <textarea name="' + name + '" ' + (fieldIsNotNull?'required ':'')
+			       + (readOnly?'readOnly="readOnly" ':'')
+                   + ' lay-filter="' + name + '" '
+			       + ($webUtil.isNotNull(validateRule)?('lay-verify="' +validateRule +'" '):'')
+                   + ($webUtil.isNotNull(emptyText)?('lay-vertext="' + emptyText +'" '):'')
+			       + ($webUtil.isNotNull(placeholder)?('placeholder="' + placeholder + '" '):'')
+                   + ($webUtil.isNotNull(tooltips)?('lay-tooltips="' + tooltips + '" '):'')
+                   + ($webUtil.isNotNull(textStyle)?('style="' + textStyle +'"'):'')
+			       + ($webUtil.isNotNull(customTextCss)?('class="layui-textarea ' + customTextCss + '" '):'class="layui-textarea"')
+	               + ' ></textarea>';
+		  return labelHtml + prefixHtml + inputHtml + '</div>' + suffixHtml;
+	  }else if($webUtil.inArray(['rate'],item.type)){
+        var rateHtml = '<div class="' + baseCss + '" '  + 'style="'+(hidden?"display:none;":"")+baseStyle+'">';
+        rateHtml += '<div name="' + name + '"  class="' + name + '" data-value="' + name + '">' +
+            '</div>';
+        return labelHtml + prefixHtml + rateHtml  +'</div>' + suffixHtml;
+      }else if($webUtil.inArray(['cycledate'],item.type)){
+          var inputHtml = '<div class="' + baseCss +'" '  + 'style="'+(hidden?"display:none;":"")+baseStyle+'">';
+          inputHtml+= ' <input type="text" name="' + name + '" ' + (fieldIsNotNull?'required ':'')
+              + (readOnly?'readOnly="readOnly" ':'')
+              + ' lay-filter="' + name + '" '
+              + ($webUtil.isNotNull(validateRule)?('lay-verify="' +validateRule +'" '):'')
+              + ($webUtil.isNotNull(emptyText)?('lay-vertext="' + emptyText +'" '):'')
+              + ($webUtil.isNotNull(placeholder)?('placeholder="' + placeholder + '" '):'')
+              + ($webUtil.isNotNull(tooltips)?('lay-tooltips="' + tooltips + '" '):'')
+              + ($webUtil.isNotNull(textStyle)?(' style="' + textStyle +'" '):'')
+              + ($webUtil.isNotNull(customTextCss)?('class="layui-input ' + customTextCss + '" '):'class="layui-input"')
+              + ' autocomplete="off" id="'+name+'"/>';
+          return labelHtml + prefixHtml + inputHtml + '</div>' + suffixHtml;
+      }else if($webUtil.inArray(['areadata'],item.type)){
+	      //璇存槑鏄尯闂村��
+          baseCss = "layui-inline";
+          var baseStyle= (hidden?'display:none;':'');
+          if(!textWidth ){
+              textWidth = 190;
+          }
+        baseStyle += "float:left;";
+          var childWidth = item.halfWidth;
+          if(!childWidth){
+              childWidth = (textWidth-30)/2;
+          }
+          textStyle = "";
+          var inputHtml = '<div class="' + baseCss + '" style="margin-right: 15px;' + baseStyle + '">';
+          var inputType = "text";
+          inputHtml += ' <div class="layui-input-inline" style="width: ' + childWidth + 'px;">';
+          inputHtml += ' <input type="' + inputType + '" name="' + name + '" ' + (fieldIsNotNull?'required ':'')
+              + (readOnly?'readOnly="readOnly" ':'')
+              + ' lay-filter="' + name + '" '
+              + ($webUtil.isNotNull(validateRule)?('lay-verify="' +validateRule +'" '):'')
+              + ($webUtil.isNotNull(emptyText)?('lay-vertext="' + emptyText +'" '):'')
+              + ($webUtil.isNotNull(placeholder)?('placeholder="' + placeholder + '" '):'')
+              + ($webUtil.isNotNull(tooltips)?('lay-tooltips="' + tooltips + '" '):'')
+              + ($webUtil.isNotNull(textStyle)?(' style="' + textStyle +'" '):'')
+              + ($webUtil.isNotNull(customTextCss)?('class="layui-input ' + customTextCss + '" '):'class="layui-input"')
+              + ' autocomplete="off" />';
+          inputHtml += '</div>';
+          inputHtml += '<div class="layui-form-mid">-</div>';
+          inputHtml += ' <div class="layui-input-inline" style="width: ' + childWidth + 'px;">';
+          var maxValueName =  $webUtil.getValueFromObj(item,['maxValueName']).trim();
+          if(item.maxValueNull){
+             fieldIsNotNull = false;
+             if(validateRule.indexOf("required,")>-1){
+                 validateRule = validateRule.replace("required,","");
+             }
+          }
+          inputHtml +=  ' <input type="' + inputType + '" name="' + maxValueName + '" ' + (fieldIsNotNull?'required ':'')
+            + (readOnly?'readOnly="readOnly" ':'')
+            + ' lay-filter="' + maxValueName + '" '
+            + ($webUtil.isNotNull(validateRule)?('lay-verify="' +validateRule +'" '):'')
+            + ($webUtil.isNotNull(emptyText)?('lay-vertext="' + emptyText +'" '):'')
+            + ($webUtil.isNotNull(placeholder)?('placeholder="' + placeholder + '" '):'')
+              + ($webUtil.isNotNull(tooltips)?('lay-tooltips="' + tooltips + '" '):'')
+            + ($webUtil.isNotNull(textStyle)?(' style="' + textStyle +'" '):'')
+            + ($webUtil.isNotNull(customTextCss)?('class="layui-input ' + customTextCss + '" '):'class="layui-input"')
+            + ' autocomplete="off" />';
+          return labelHtml + prefixHtml + inputHtml  +'</div></div>' + suffixHtml;
+      }else if($webUtil.inArray(['refer','combotree'],item.type)){//鍙傜収
+          var selectHtml = '<div class="' + baseCss +'" '  + 'style="'+(hidden?"display:none;":"")+baseStyle+'">';
+          selectHtml += '<select name="' + name + '" ' + (fieldIsNotNull?'required ':'')
+                + (readOnly?'readOnly="readOnly" ':'')
+                        + ' lay-filter="' + name + '" '
+                + ($webUtil.isNotNull(validateRule)?('lay-verify="' +validateRule +'" '):'')
+                          + ($webUtil.isNotNull(emptyText)?('lay-vertext="' + emptyText +'" '):'')
+              + ($webUtil.isNotNull(textStyle)?(' style="' + textStyle +'" '):'')
+              + ($webUtil.isNotNull(customTextCss)?('class=" ' + customTextCss + '" '):'')
+              + ' lay-refer="true" lay-refer-showField="' + item.showField + '" inDialog="' + config.inDialog + '" lay-refer-editable="' + item.editable + '">';
+          selectHtml += '<option value=""></option></select>';
+        // selectHtml += '<i class="layui-refer-clear"/>';
+          return labelHtml + prefixHtml + selectHtml + '</div>' + suffixHtml;
+	  }else if($webUtil.inArray(['line'],item.type)){
+	      //妯嚎锛屽彲浠ョ敤鏉ュ仛鍒嗙粍
+        var inputHtml = '<div class="' + baseCss + '" '  + (hidden?'style="display:none;width:100%;">':'style="width:100%">');
+        if(item.lineText || item.text){
+          //濡傛灉鏈夋枃瀛楃殑鏃跺�欙紝鎴戜滑浣跨敤fieldset鏉ュ鐞�
+          inputHtml += '<fieldset><legend><a href="javascript:void(0);">' + (item.lineText || item.text) + '</a></legend></fieldset>';
+        }else {
+          var color = 'gray';
+          if ($webUtil.isNotNull(item.lineColor)) {
+            color = item.lineColor;
+          }
+          inputHtml += '<hr class="layui-bg-' + color + '">';
+        }
+        return  prefixHtml + inputHtml + '</div>' + suffixHtml;
+      }else if($webUtil.inArray(['label','word'],item.type)){
+		  if(hidden){
+			  titleStyle = "display:none;" + titleStyle;
+		  }
+		  titleStyle += "padding-top:9px;padding-bottom:9px;";
+		  return prefixHtml + '<div class="' + baseCss +'" '  + 'style="'+(hidden?"display:none;":"")+baseStyle+'">'
+                  + '<div class="layui-word-aux '
+		           + ($webUtil.isNotNull(customLabelCss)?customLabelCss:'') +'"'
+                   + ' lay-filter="' + name + '" '
+		           + ($webUtil.isNotNull(titleStyle)?('style="' + titleStyle +'" >'):'>')
+		           + title + '</div> </div>' + suffixHtml;
+	  }else if($webUtil.inArray(['file'],item.type)){
+	    //鏂囦欢
+        var fileHtml = '<div class="' + baseCss +'" '  + (hidden?'style="display:none;">':'>');
+        fileHtml += '<div class="layui-upload-drag ' + name + '" data-value="' + name + '" id="upload-drag-' + name + '" '+
+            ' lay-filter="' + name + '" '+
+            ' extendAttrMap=\''+ JSON.stringify(item.extendAttrMap)+'\''+
+            ($webUtil.isNotNull(textStyle)?(' style="' + textStyle +';width: '+(textWidth*1-20)+'px" '):'')+
+            '>' +
+            '  <i class="layui-icon" style="font-size: 36px;">顧�</i>' +
+            '  <p style="font-size: 12px;">鐐瑰嚮涓婁紶锛屾垨灏嗘枃浠舵嫋鎷藉埌姝ゅ</p>' +
+            '  <div class="layui-hide uploadDemoView">' +
+            '    <hr>' +
+            '<input class="uploadFileOid" type="hidden" name="' + name + '">'+
+            '    <img src="" alt="宸蹭笂浼犲浘鐗�" style="max-width: '+(textWidth*1-20)+'px">' +
+            '  </div>' +
+            '</div>';
+        return labelHtml + prefixHtml + fileHtml + '</div>' + suffixHtml;
+      }else if($webUtil.inArray(['webeditor'],item.type)){
+	    //缂栬緫鍣�
+        var editorHtml = '<div class="layui-input-block" style="'+(hidden?"display:none;":"")+'margin-left: 30px;">';
+        editorHtml += '<textarea class="webeditor" id="editor_' + name + '" name="' + name + '" lay-filter="' + name + '"  data-value="' + name + '"'+
+              ' style="height:200px;'+($webUtil.isNotNull(textStyle)?textStyle:'width:' +(textWidth*1)+'px;')+'" ></textarea>';
+        return labelHtml + prefixHtml + editorHtml  +'</div>' + suffixHtml;
+      }
+	  return "";
+  };
+
+  //閿�姣佹柟娉�
+  Form.prototype.destory =function(filter){
+	  var that = this;
+	  //娓呴櫎璺熻繖涓猣ilter鐩稿叧鐨勬墍鏈夐厤缃�
+	  var allDefaultValueInThisFilter = [];
+	  for(var key in that.formDefaultValueMap){
+		  if($webUtil.startWith(key,filter+"_")){
+			  allDefaultValueInThisFilter.push(key);
+		  }
+	  }
+	  layui.each(allDefaultValueInThisFilter,function(_index,item){
+		  delete that.formDefaultValueMap[item];
+	  });
+	  allDefaultValueInThisFilter= null;
+	  //娓呴櫎璺熻繖涓猣ilter鐩稿叧鐨刢onfig
+	  if(filter in that.elementConfig){
+		  delete that.elementConfig[filter];
+	  }
+	  //鍒犻櫎鎵�鏈夌殑瀛楁
+	  if(filter in that.fieldsMap){
+		  delete that.fieldsMap[filter];
+	  }
+	  for(var key in that.referFieldsMap){
+	    if(key.indexOf(filter + "${refer}") == 0){
+	      delete that.referFieldsMap[key];
+        }
+      }
+  };
+  //end weidy
+
+  //琛ㄥ崟鎻愪氦鏍¢獙
+  var submit = function(){
+    var button = $(this), verify = form.config.verify, stop = null
+    ,DANGER = 'layui-form-danger', field = {} ,elem = button.parents(ELEM)
+
+    ,verifyElem = elem.find('*[lay-verify]') //鑾峰彇闇�瑕佹牎楠岀殑鍏冪礌
+    ,formElem = button.parents('form')[0] //鑾峰彇褰撳墠鎵�鍦ㄧ殑form鍏冪礌锛屽鏋滃瓨鍦ㄧ殑璇�
+    ,fieldElem = elem.find('input,select,textarea') //鑾峰彇鎵�鏈夎〃鍗曞煙
+    ,filter = button.attr('lay-filter'); //鑾峰彇杩囨护鍣�
+
+
+    //寮�濮嬫牎楠�
+    layui.each(verifyElem, function(_, item){
+      var othis = $(this)
+      ,vers = othis.attr('lay-verify').split('|')
+      ,verType = othis.attr('lay-verType') //鎻愮ず鏂瑰紡
+      ,value = othis.val();
+
+      othis.removeClass(DANGER);
+      layui.each(vers, function(_, thisVer){
+        var isTrue //鏄惁鍛戒腑鏍¢獙
+        ,errorText = '' //閿欒鎻愮ず鏂囨湰
+        ,isFn = typeof verify[thisVer] === 'function';
+
+        //鍖归厤楠岃瘉瑙勫垯
+        if(verify[thisVer]){
+          var isTrue = isFn ? errorText = verify[thisVer](value, item) : !verify[thisVer][0].test(value);
+          errorText = errorText || verify[thisVer][1];
+
+          //濡傛灉鏄繀濉」鎴栬�呴潪绌哄懡涓牎楠岋紝鍒欓樆姝㈡彁浜わ紝寮瑰嚭鎻愮ず
+          if(isTrue){
+            //鎻愮ず灞傞鏍�
+            if(verType === 'tips'){
+              layer.tips(errorText, function(){
+                if(typeof othis.attr('lay-ignore') !== 'string'){
+                  if(item.tagName.toLowerCase() === 'select' || /^checkbox|radio$/.test(item.type)){
+                    return othis.next();
+                  }
+                }
+                return othis;
+              }(), {tips: 1});
+            } else if(verType === 'alert') {
+              layer.alert(errorText, {title: '鎻愮ず', shadeClose: true});
+            } else {
+              layer.msg(errorText, {icon: 5, shift: 6});
+            }
+            if(!device.android && !device.ios) item.focus(); //闈炵Щ鍔ㄨ澶囪嚜鍔ㄥ畾浣嶇劍鐐�
+            othis.addClass(DANGER);
+            return stop = true;
+          }
+        }
+      });
+      if(stop) return stop;
+    });
+
+    if(stop) return false;
+
+    var nameIndex = {}; //鏁扮粍 name 绱㈠紩
+    layui.each(fieldElem, function(_, item){
+      item.name = (item.name || '').replace(/^\s*|\s*&/, '');
+
+      if(!item.name) return;
+
+      //鐢ㄤ簬鏀寔鏁扮粍 name
+      if(/^.*\[\]$/.test(item.name)){
+        var key = item.name.match(/^(.*)\[\]$/g)[0];
+        nameIndex[key] = nameIndex[key] | 0;
+        item.name = item.name.replace(/^(.*)\[\]$/, '$1['+ (nameIndex[key]++) +']');
+      }
+
+      if(/^checkbox|radio$/.test(item.type) && !item.checked) return;
+      field[item.name] = item.value;
+    });
+
+    //鑾峰彇瀛楁
+    return layui.event.call(this, MOD_NAME, 'submit('+ filter +')', {
+      elem: this
+      ,form: formElem
+      ,field: field
+    });
+  };
+
+  //鑷姩瀹屾垚娓叉煋
+  var form = new Form()
+  ,dom = $(document), win = $(window);
+
+  form.render();
+
+  //琛ㄥ崟reset閲嶇疆娓叉煋
+  dom.on('reset', ELEM, function(){
+    var filter = $(this).attr('lay-filter');
+    setTimeout(function(){
+      form.render(null, filter);
+    }, 50);
+  });
+
+  //琛ㄥ崟鎻愪氦浜嬩欢
+  dom.on('submit', ELEM, submit)
+  .on('click', '*[lay-submit]', submit);
+
+  exports(MOD_NAME, form);
+});
+
+
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/jquery.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/jquery.js
new file mode 100644
index 0000000..aa88d73
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/jquery.js
@@ -0,0 +1,10987 @@
+/*!
+ * jQuery JavaScript Library v1.12.3
+ * http://jquery.com/
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2016-04-05T19:16Z
+ */
+
+(function( global, factory ) {
+
+	if ( typeof module === "object" && typeof module.exports === "object" ) {
+		// For CommonJS and CommonJS-like environments where a proper `window`
+		// is present, execute the factory and get jQuery.
+		// For environments that do not have a `window` with a `document`
+		// (such as Node.js), expose a factory as module.exports.
+		// This accentuates the need for the creation of a real `window`.
+		// e.g. var jQuery = require("jquery")(window);
+		// See ticket #14549 for more info.
+		module.exports = global.document ?
+			factory( global, true ) :
+			function( w ) {
+				if ( !w.document ) {
+					throw new Error( "jQuery requires a window with a document" );
+				}
+				return factory( w );
+			};
+	} else {
+		factory( global );
+	}
+
+// Pass this if window is not defined yet
+}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
+
+// Support: Firefox 18+
+// Can't be in strict mode, several libs including ASP.NET trace
+// the stack via arguments.caller.callee and Firefox dies if
+// you try to trace through "use strict" call chains. (#13335)
+//"use strict";
+var deletedIds = [];
+
+var document = window.document;
+
+var slice = deletedIds.slice;
+
+var concat = deletedIds.concat;
+
+var push = deletedIds.push;
+
+var indexOf = deletedIds.indexOf;
+
+var class2type = {};
+
+var toString = class2type.toString;
+
+var hasOwn = class2type.hasOwnProperty;
+
+var support = {};
+
+
+
+var
+	version = "1.12.3",
+
+	// Define a local copy of jQuery
+	jQuery = function( selector, context ) {
+
+		// The jQuery object is actually just the init constructor 'enhanced'
+		// Need init if jQuery is called (just allow error to be thrown if not included)
+		return new jQuery.fn.init( selector, context );
+	},
+
+	// Support: Android<4.1, IE<9
+	// Make sure we trim BOM and NBSP
+	rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
+
+	// Matches dashed string for camelizing
+	rmsPrefix = /^-ms-/,
+	rdashAlpha = /-([\da-z])/gi,
+
+	// Used by jQuery.camelCase as callback to replace()
+	fcamelCase = function( all, letter ) {
+		return letter.toUpperCase();
+	};
+
+jQuery.fn = jQuery.prototype = {
+
+	// The current version of jQuery being used
+	jquery: version,
+
+	constructor: jQuery,
+
+	// Start with an empty selector
+	selector: "",
+
+	// The default length of a jQuery object is 0
+	length: 0,
+
+	toArray: function() {
+		return slice.call( this );
+	},
+
+	// Get the Nth element in the matched element set OR
+	// Get the whole matched element set as a clean array
+	get: function( num ) {
+		return num != null ?
+
+			// Return just the one element from the set
+			( num < 0 ? this[ num + this.length ] : this[ num ] ) :
+
+			// Return all the elements in a clean array
+			slice.call( this );
+	},
+
+	// Take an array of elements and push it onto the stack
+	// (returning the new matched element set)
+	pushStack: function( elems ) {
+
+		// Build a new jQuery matched element set
+		var ret = jQuery.merge( this.constructor(), elems );
+
+		// Add the old object onto the stack (as a reference)
+		ret.prevObject = this;
+		ret.context = this.context;
+
+		// Return the newly-formed element set
+		return ret;
+	},
+
+	// Execute a callback for every element in the matched set.
+	each: function( callback ) {
+		return jQuery.each( this, callback );
+	},
+
+	map: function( callback ) {
+		return this.pushStack( jQuery.map( this, function( elem, i ) {
+			return callback.call( elem, i, elem );
+		} ) );
+	},
+
+	slice: function() {
+		return this.pushStack( slice.apply( this, arguments ) );
+	},
+
+	first: function() {
+		return this.eq( 0 );
+	},
+
+	last: function() {
+		return this.eq( -1 );
+	},
+
+	eq: function( i ) {
+		var len = this.length,
+			j = +i + ( i < 0 ? len : 0 );
+		return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
+	},
+
+	end: function() {
+		return this.prevObject || this.constructor();
+	},
+
+	// For internal use only.
+	// Behaves like an Array's method, not like a jQuery method.
+	push: push,
+	sort: deletedIds.sort,
+	splice: deletedIds.splice
+};
+
+jQuery.extend = jQuery.fn.extend = function() {
+	var src, copyIsArray, copy, name, options, clone,
+		target = arguments[ 0 ] || {},
+		i = 1,
+		length = arguments.length,
+		deep = false;
+
+	// Handle a deep copy situation
+	if ( typeof target === "boolean" ) {
+		deep = target;
+
+		// skip the boolean and the target
+		target = arguments[ i ] || {};
+		i++;
+	}
+
+	// Handle case when target is a string or something (possible in deep copy)
+	if ( typeof target !== "object" && !jQuery.isFunction( target ) ) {
+		target = {};
+	}
+
+	// extend jQuery itself if only one argument is passed
+	if ( i === length ) {
+		target = this;
+		i--;
+	}
+
+	for ( ; i < length; i++ ) {
+
+		// Only deal with non-null/undefined values
+		if ( ( options = arguments[ i ] ) != null ) {
+
+			// Extend the index object
+			for ( name in options ) {
+				src = target[ name ];
+				copy = options[ name ];
+
+				// Prevent never-ending loop
+				if ( target === copy ) {
+					continue;
+				}
+
+				// Recurse if we're merging plain objects or arrays
+				if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
+					( copyIsArray = jQuery.isArray( copy ) ) ) ) {
+
+					if ( copyIsArray ) {
+						copyIsArray = false;
+						clone = src && jQuery.isArray( src ) ? src : [];
+
+					} else {
+						clone = src && jQuery.isPlainObject( src ) ? src : {};
+					}
+
+					// Never move original objects, clone them
+					target[ name ] = jQuery.extend( deep, clone, copy );
+
+				// Don't bring in undefined values
+				} else if ( copy !== undefined ) {
+					target[ name ] = copy;
+				}
+			}
+		}
+	}
+
+	// Return the modified object
+	return target;
+};
+
+jQuery.extend( {
+
+	// Unique for each copy of jQuery on the page
+	expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
+
+	// Assume jQuery is ready without the ready module
+	isReady: true,
+
+	error: function( msg ) {
+		throw new Error( msg );
+	},
+
+	noop: function() {},
+
+	// See test/unit/core.js for details concerning isFunction.
+	// Since version 1.3, DOM methods and functions like alert
+	// aren't supported. They return false on IE (#2968).
+	isFunction: function( obj ) {
+		return jQuery.type( obj ) === "function";
+	},
+
+	isArray: Array.isArray || function( obj ) {
+		return jQuery.type( obj ) === "array";
+	},
+
+	isWindow: function( obj ) {
+		/* jshint eqeqeq: false */
+		return obj != null && obj == obj.window;
+	},
+
+	isNumeric: function( obj ) {
+
+		// parseFloat NaNs numeric-cast false positives (null|true|false|"")
+		// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
+		// subtraction forces infinities to NaN
+		// adding 1 corrects loss of precision from parseFloat (#15100)
+		var realStringObj = obj && obj.toString();
+		return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0;
+	},
+
+	isEmptyObject: function( obj ) {
+		var name;
+		for ( name in obj ) {
+			return false;
+		}
+		return true;
+	},
+
+	isPlainObject: function( obj ) {
+		var key;
+
+		// Must be an Object.
+		// Because of IE, we also have to check the presence of the constructor property.
+		// Make sure that DOM nodes and window objects don't pass through, as well
+		if ( !obj || jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+			return false;
+		}
+
+		try {
+
+			// Not own constructor property must be Object
+			if ( obj.constructor &&
+				!hasOwn.call( obj, "constructor" ) &&
+				!hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) {
+				return false;
+			}
+		} catch ( e ) {
+
+			// IE8,9 Will throw exceptions on certain host objects #9897
+			return false;
+		}
+
+		// Support: IE<9
+		// Handle iteration over inherited properties before own properties.
+		if ( !support.ownFirst ) {
+			for ( key in obj ) {
+				return hasOwn.call( obj, key );
+			}
+		}
+
+		// Own properties are enumerated firstly, so to speed up,
+		// if last one is own, then all properties are own.
+		for ( key in obj ) {}
+
+		return key === undefined || hasOwn.call( obj, key );
+	},
+
+	type: function( obj ) {
+		if ( obj == null ) {
+			return obj + "";
+		}
+		return typeof obj === "object" || typeof obj === "function" ?
+			class2type[ toString.call( obj ) ] || "object" :
+			typeof obj;
+	},
+
+	// Workarounds based on findings by Jim Driscoll
+	// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
+	globalEval: function( data ) {
+		if ( data && jQuery.trim( data ) ) {
+
+			// We use execScript on Internet Explorer
+			// We use an anonymous function so that context is window
+			// rather than jQuery in Firefox
+			( window.execScript || function( data ) {
+				window[ "eval" ].call( window, data ); // jscs:ignore requireDotNotation
+			} )( data );
+		}
+	},
+
+	// Convert dashed to camelCase; used by the css and data modules
+	// Microsoft forgot to hump their vendor prefix (#9572)
+	camelCase: function( string ) {
+		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+	},
+
+	nodeName: function( elem, name ) {
+		return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+	},
+
+	each: function( obj, callback ) {
+		var length, i = 0;
+
+		if ( isArrayLike( obj ) ) {
+			length = obj.length;
+			for ( ; i < length; i++ ) {
+				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
+					break;
+				}
+			}
+		} else {
+			for ( i in obj ) {
+				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
+					break;
+				}
+			}
+		}
+
+		return obj;
+	},
+
+	// Support: Android<4.1, IE<9
+	trim: function( text ) {
+		return text == null ?
+			"" :
+			( text + "" ).replace( rtrim, "" );
+	},
+
+	// results is for internal usage only
+	makeArray: function( arr, results ) {
+		var ret = results || [];
+
+		if ( arr != null ) {
+			if ( isArrayLike( Object( arr ) ) ) {
+				jQuery.merge( ret,
+					typeof arr === "string" ?
+					[ arr ] : arr
+				);
+			} else {
+				push.call( ret, arr );
+			}
+		}
+
+		return ret;
+	},
+
+	inArray: function( elem, arr, i ) {
+		var len;
+
+		if ( arr ) {
+			if ( indexOf ) {
+				return indexOf.call( arr, elem, i );
+			}
+
+			len = arr.length;
+			i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
+
+			for ( ; i < len; i++ ) {
+
+				// Skip accessing in sparse arrays
+				if ( i in arr && arr[ i ] === elem ) {
+					return i;
+				}
+			}
+		}
+
+		return -1;
+	},
+
+	merge: function( first, second ) {
+		var len = +second.length,
+			j = 0,
+			i = first.length;
+
+		while ( j < len ) {
+			first[ i++ ] = second[ j++ ];
+		}
+
+		// Support: IE<9
+		// Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists)
+		if ( len !== len ) {
+			while ( second[ j ] !== undefined ) {
+				first[ i++ ] = second[ j++ ];
+			}
+		}
+
+		first.length = i;
+
+		return first;
+	},
+
+	grep: function( elems, callback, invert ) {
+		var callbackInverse,
+			matches = [],
+			i = 0,
+			length = elems.length,
+			callbackExpect = !invert;
+
+		// Go through the array, only saving the items
+		// that pass the validator function
+		for ( ; i < length; i++ ) {
+			callbackInverse = !callback( elems[ i ], i );
+			if ( callbackInverse !== callbackExpect ) {
+				matches.push( elems[ i ] );
+			}
+		}
+
+		return matches;
+	},
+
+	// arg is for internal usage only
+	map: function( elems, callback, arg ) {
+		var length, value,
+			i = 0,
+			ret = [];
+
+		// Go through the array, translating each of the items to their new values
+		if ( isArrayLike( elems ) ) {
+			length = elems.length;
+			for ( ; i < length; i++ ) {
+				value = callback( elems[ i ], i, arg );
+
+				if ( value != null ) {
+					ret.push( value );
+				}
+			}
+
+		// Go through every key on the object,
+		} else {
+			for ( i in elems ) {
+				value = callback( elems[ i ], i, arg );
+
+				if ( value != null ) {
+					ret.push( value );
+				}
+			}
+		}
+
+		// Flatten any nested arrays
+		return concat.apply( [], ret );
+	},
+
+	// A global GUID counter for objects
+	guid: 1,
+
+	// Bind a function to a context, optionally partially applying any
+	// arguments.
+	proxy: function( fn, context ) {
+		var args, proxy, tmp;
+
+		if ( typeof context === "string" ) {
+			tmp = fn[ context ];
+			context = fn;
+			fn = tmp;
+		}
+
+		// Quick check to determine if target is callable, in the spec
+		// this throws a TypeError, but we will just return undefined.
+		if ( !jQuery.isFunction( fn ) ) {
+			return undefined;
+		}
+
+		// Simulated bind
+		args = slice.call( arguments, 2 );
+		proxy = function() {
+			return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
+		};
+
+		// Set the guid of unique handler to the same of original handler, so it can be removed
+		proxy.guid = fn.guid = fn.guid || jQuery.guid++;
+
+		return proxy;
+	},
+
+	now: function() {
+		return +( new Date() );
+	},
+
+	// jQuery.support is not used in Core but other projects attach their
+	// properties to it so it needs to exist.
+	support: support
+} );
+
+// JSHint would error on this code due to the Symbol not being defined in ES5.
+// Defining this global in .jshintrc would create a danger of using the global
+// unguarded in another place, it seems safer to just disable JSHint for these
+// three lines.
+/* jshint ignore: start */
+if ( typeof Symbol === "function" ) {
+	jQuery.fn[ Symbol.iterator ] = deletedIds[ Symbol.iterator ];
+}
+/* jshint ignore: end */
+
+// Populate the class2type map
+jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
+function( i, name ) {
+	class2type[ "[object " + name + "]" ] = name.toLowerCase();
+} );
+
+function isArrayLike( obj ) {
+
+	// Support: iOS 8.2 (not reproducible in simulator)
+	// `in` check used to prevent JIT error (gh-2145)
+	// hasOwn isn't used here due to false negatives
+	// regarding Nodelist length in IE
+	var length = !!obj && "length" in obj && obj.length,
+		type = jQuery.type( obj );
+
+	if ( type === "function" || jQuery.isWindow( obj ) ) {
+		return false;
+	}
+
+	return type === "array" || length === 0 ||
+		typeof length === "number" && length > 0 && ( length - 1 ) in obj;
+}
+var Sizzle =
+/*!
+ * Sizzle CSS Selector Engine v2.2.1
+ * http://sizzlejs.com/
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2015-10-17
+ */
+(function( window ) {
+
+var i,
+	support,
+	Expr,
+	getText,
+	isXML,
+	tokenize,
+	compile,
+	select,
+	outermostContext,
+	sortInput,
+	hasDuplicate,
+
+	// Local document vars
+	setDocument,
+	document,
+	docElem,
+	documentIsHTML,
+	rbuggyQSA,
+	rbuggyMatches,
+	matches,
+	contains,
+
+	// Instance-specific data
+	expando = "sizzle" + 1 * new Date(),
+	preferredDoc = window.document,
+	dirruns = 0,
+	done = 0,
+	classCache = createCache(),
+	tokenCache = createCache(),
+	compilerCache = createCache(),
+	sortOrder = function( a, b ) {
+		if ( a === b ) {
+			hasDuplicate = true;
+		}
+		return 0;
+	},
+
+	// General-purpose constants
+	MAX_NEGATIVE = 1 << 31,
+
+	// Instance methods
+	hasOwn = ({}).hasOwnProperty,
+	arr = [],
+	pop = arr.pop,
+	push_native = arr.push,
+	push = arr.push,
+	slice = arr.slice,
+	// Use a stripped-down indexOf as it's faster than native
+	// http://jsperf.com/thor-indexof-vs-for/5
+	indexOf = function( list, elem ) {
+		var i = 0,
+			len = list.length;
+		for ( ; i < len; i++ ) {
+			if ( list[i] === elem ) {
+				return i;
+			}
+		}
+		return -1;
+	},
+
+	booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
+
+	// Regular expressions
+
+	// http://www.w3.org/TR/css3-selectors/#whitespace
+	whitespace = "[\\x20\\t\\r\\n\\f]",
+
+	// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
+	identifier = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
+
+	// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
+	attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
+		// Operator (capture 2)
+		"*([*^$|!~]?=)" + whitespace +
+		// "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
+		"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
+		"*\\]",
+
+	pseudos = ":(" + identifier + ")(?:\\((" +
+		// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
+		// 1. quoted (capture 3; capture 4 or capture 5)
+		"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
+		// 2. simple (capture 6)
+		"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
+		// 3. anything else (capture 2)
+		".*" +
+		")\\)|)",
+
+	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+	rwhitespace = new RegExp( whitespace + "+", "g" ),
+	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
+
+	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
+	rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
+
+	rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
+
+	rpseudo = new RegExp( pseudos ),
+	ridentifier = new RegExp( "^" + identifier + "$" ),
+
+	matchExpr = {
+		"ID": new RegExp( "^#(" + identifier + ")" ),
+		"CLASS": new RegExp( "^\\.(" + identifier + ")" ),
+		"TAG": new RegExp( "^(" + identifier + "|[*])" ),
+		"ATTR": new RegExp( "^" + attributes ),
+		"PSEUDO": new RegExp( "^" + pseudos ),
+		"CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
+			"*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
+			"*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
+		"bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
+		// For use in libraries implementing .is()
+		// We use this for POS matching in `select`
+		"needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
+			whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
+	},
+
+	rinputs = /^(?:input|select|textarea|button)$/i,
+	rheader = /^h\d$/i,
+
+	rnative = /^[^{]+\{\s*\[native \w/,
+
+	// Easily-parseable/retrievable ID or TAG or CLASS selectors
+	rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
+
+	rsibling = /[+~]/,
+	rescape = /'|\\/g,
+
+	// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
+	runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
+	funescape = function( _, escaped, escapedWhitespace ) {
+		var high = "0x" + escaped - 0x10000;
+		// NaN means non-codepoint
+		// Support: Firefox<24
+		// Workaround erroneous numeric interpretation of +"0x"
+		return high !== high || escapedWhitespace ?
+			escaped :
+			high < 0 ?
+				// BMP codepoint
+				String.fromCharCode( high + 0x10000 ) :
+				// Supplemental Plane codepoint (surrogate pair)
+				String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
+	},
+
+	// Used for iframes
+	// See setDocument()
+	// Removing the function wrapper causes a "Permission Denied"
+	// error in IE
+	unloadHandler = function() {
+		setDocument();
+	};
+
+// Optimize for push.apply( _, NodeList )
+try {
+	push.apply(
+		(arr = slice.call( preferredDoc.childNodes )),
+		preferredDoc.childNodes
+	);
+	// Support: Android<4.0
+	// Detect silently failing push.apply
+	arr[ preferredDoc.childNodes.length ].nodeType;
+} catch ( e ) {
+	push = { apply: arr.length ?
+
+		// Leverage slice if possible
+		function( target, els ) {
+			push_native.apply( target, slice.call(els) );
+		} :
+
+		// Support: IE<9
+		// Otherwise append directly
+		function( target, els ) {
+			var j = target.length,
+				i = 0;
+			// Can't trust NodeList.length
+			while ( (target[j++] = els[i++]) ) {}
+			target.length = j - 1;
+		}
+	};
+}
+
+function Sizzle( selector, context, results, seed ) {
+	var m, i, elem, nid, nidselect, match, groups, newSelector,
+		newContext = context && context.ownerDocument,
+
+		// nodeType defaults to 9, since context defaults to document
+		nodeType = context ? context.nodeType : 9;
+
+	results = results || [];
+
+	// Return early from calls with invalid selector or context
+	if ( typeof selector !== "string" || !selector ||
+		nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
+
+		return results;
+	}
+
+	// Try to shortcut find operations (as opposed to filters) in HTML documents
+	if ( !seed ) {
+
+		if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
+			setDocument( context );
+		}
+		context = context || document;
+
+		if ( documentIsHTML ) {
+
+			// If the selector is sufficiently simple, try using a "get*By*" DOM method
+			// (excepting DocumentFragment context, where the methods don't exist)
+			if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
+
+				// ID selector
+				if ( (m = match[1]) ) {
+
+					// Document context
+					if ( nodeType === 9 ) {
+						if ( (elem = context.getElementById( m )) ) {
+
+							// Support: IE, Opera, Webkit
+							// TODO: identify versions
+							// getElementById can match elements by name instead of ID
+							if ( elem.id === m ) {
+								results.push( elem );
+								return results;
+							}
+						} else {
+							return results;
+						}
+
+					// Element context
+					} else {
+
+						// Support: IE, Opera, Webkit
+						// TODO: identify versions
+						// getElementById can match elements by name instead of ID
+						if ( newContext && (elem = newContext.getElementById( m )) &&
+							contains( context, elem ) &&
+							elem.id === m ) {
+
+							results.push( elem );
+							return results;
+						}
+					}
+
+				// Type selector
+				} else if ( match[2] ) {
+					push.apply( results, context.getElementsByTagName( selector ) );
+					return results;
+
+				// Class selector
+				} else if ( (m = match[3]) && support.getElementsByClassName &&
+					context.getElementsByClassName ) {
+
+					push.apply( results, context.getElementsByClassName( m ) );
+					return results;
+				}
+			}
+
+			// Take advantage of querySelectorAll
+			if ( support.qsa &&
+				!compilerCache[ selector + " " ] &&
+				(!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
+
+				if ( nodeType !== 1 ) {
+					newContext = context;
+					newSelector = selector;
+
+				// qSA looks outside Element context, which is not what we want
+				// Thanks to Andrew Dupont for this workaround technique
+				// Support: IE <=8
+				// Exclude object elements
+				} else if ( context.nodeName.toLowerCase() !== "object" ) {
+
+					// Capture the context ID, setting it first if necessary
+					if ( (nid = context.getAttribute( "id" )) ) {
+						nid = nid.replace( rescape, "\\$&" );
+					} else {
+						context.setAttribute( "id", (nid = expando) );
+					}
+
+					// Prefix every selector in the list
+					groups = tokenize( selector );
+					i = groups.length;
+					nidselect = ridentifier.test( nid ) ? "#" + nid : "[id='" + nid + "']";
+					while ( i-- ) {
+						groups[i] = nidselect + " " + toSelector( groups[i] );
+					}
+					newSelector = groups.join( "," );
+
+					// Expand context for sibling selectors
+					newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
+						context;
+				}
+
+				if ( newSelector ) {
+					try {
+						push.apply( results,
+							newContext.querySelectorAll( newSelector )
+						);
+						return results;
+					} catch ( qsaError ) {
+					} finally {
+						if ( nid === expando ) {
+							context.removeAttribute( "id" );
+						}
+					}
+				}
+			}
+		}
+	}
+
+	// All others
+	return select( selector.replace( rtrim, "$1" ), context, results, seed );
+}
+
+/**
+ * Create key-value caches of limited size
+ * @returns {function(string, object)} Returns the Object data after storing it on itself with
+ *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
+ *	deleting the oldest entry
+ */
+function createCache() {
+	var keys = [];
+
+	function cache( key, value ) {
+		// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
+		if ( keys.push( key + " " ) > Expr.cacheLength ) {
+			// Only keep the most recent entries
+			delete cache[ keys.shift() ];
+		}
+		return (cache[ key + " " ] = value);
+	}
+	return cache;
+}
+
+/**
+ * Mark a function for special use by Sizzle
+ * @param {Function} fn The function to mark
+ */
+function markFunction( fn ) {
+	fn[ expando ] = true;
+	return fn;
+}
+
+/**
+ * Support testing using an element
+ * @param {Function} fn Passed the created div and expects a boolean result
+ */
+function assert( fn ) {
+	var div = document.createElement("div");
+
+	try {
+		return !!fn( div );
+	} catch (e) {
+		return false;
+	} finally {
+		// Remove from its parent by default
+		if ( div.parentNode ) {
+			div.parentNode.removeChild( div );
+		}
+		// release memory in IE
+		div = null;
+	}
+}
+
+/**
+ * Adds the same handler for all of the specified attrs
+ * @param {String} attrs Pipe-separated list of attributes
+ * @param {Function} handler The method that will be applied
+ */
+function addHandle( attrs, handler ) {
+	var arr = attrs.split("|"),
+		i = arr.length;
+
+	while ( i-- ) {
+		Expr.attrHandle[ arr[i] ] = handler;
+	}
+}
+
+/**
+ * Checks document order of two siblings
+ * @param {Element} a
+ * @param {Element} b
+ * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
+ */
+function siblingCheck( a, b ) {
+	var cur = b && a,
+		diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
+			( ~b.sourceIndex || MAX_NEGATIVE ) -
+			( ~a.sourceIndex || MAX_NEGATIVE );
+
+	// Use IE sourceIndex if available on both nodes
+	if ( diff ) {
+		return diff;
+	}
+
+	// Check if b follows a
+	if ( cur ) {
+		while ( (cur = cur.nextSibling) ) {
+			if ( cur === b ) {
+				return -1;
+			}
+		}
+	}
+
+	return a ? 1 : -1;
+}
+
+/**
+ * Returns a function to use in pseudos for input types
+ * @param {String} type
+ */
+function createInputPseudo( type ) {
+	return function( elem ) {
+		var name = elem.nodeName.toLowerCase();
+		return name === "input" && elem.type === type;
+	};
+}
+
+/**
+ * Returns a function to use in pseudos for buttons
+ * @param {String} type
+ */
+function createButtonPseudo( type ) {
+	return function( elem ) {
+		var name = elem.nodeName.toLowerCase();
+		return (name === "input" || name === "button") && elem.type === type;
+	};
+}
+
+/**
+ * Returns a function to use in pseudos for positionals
+ * @param {Function} fn
+ */
+function createPositionalPseudo( fn ) {
+	return markFunction(function( argument ) {
+		argument = +argument;
+		return markFunction(function( seed, matches ) {
+			var j,
+				matchIndexes = fn( [], seed.length, argument ),
+				i = matchIndexes.length;
+
+			// Match elements found at the specified indexes
+			while ( i-- ) {
+				if ( seed[ (j = matchIndexes[i]) ] ) {
+					seed[j] = !(matches[j] = seed[j]);
+				}
+			}
+		});
+	});
+}
+
+/**
+ * Checks a node for validity as a Sizzle context
+ * @param {Element|Object=} context
+ * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
+ */
+function testContext( context ) {
+	return context && typeof context.getElementsByTagName !== "undefined" && context;
+}
+
+// Expose support vars for convenience
+support = Sizzle.support = {};
+
+/**
+ * Detects XML nodes
+ * @param {Element|Object} elem An element or a document
+ * @returns {Boolean} True iff elem is a non-HTML XML node
+ */
+isXML = Sizzle.isXML = function( elem ) {
+	// documentElement is verified for cases where it doesn't yet exist
+	// (such as loading iframes in IE - #4833)
+	var documentElement = elem && (elem.ownerDocument || elem).documentElement;
+	return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+/**
+ * Sets document-related variables once based on the current document
+ * @param {Element|Object} [doc] An element or document object to use to set the document
+ * @returns {Object} Returns the current document
+ */
+setDocument = Sizzle.setDocument = function( node ) {
+	var hasCompare, parent,
+		doc = node ? node.ownerDocument || node : preferredDoc;
+
+	// Return early if doc is invalid or already selected
+	if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
+		return document;
+	}
+
+	// Update global variables
+	document = doc;
+	docElem = document.documentElement;
+	documentIsHTML = !isXML( document );
+
+	// Support: IE 9-11, Edge
+	// Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
+	if ( (parent = document.defaultView) && parent.top !== parent ) {
+		// Support: IE 11
+		if ( parent.addEventListener ) {
+			parent.addEventListener( "unload", unloadHandler, false );
+
+		// Support: IE 9 - 10 only
+		} else if ( parent.attachEvent ) {
+			parent.attachEvent( "onunload", unloadHandler );
+		}
+	}
+
+	/* Attributes
+	---------------------------------------------------------------------- */
+
+	// Support: IE<8
+	// Verify that getAttribute really returns attributes and not properties
+	// (excepting IE8 booleans)
+	support.attributes = assert(function( div ) {
+		div.className = "i";
+		return !div.getAttribute("className");
+	});
+
+	/* getElement(s)By*
+	---------------------------------------------------------------------- */
+
+	// Check if getElementsByTagName("*") returns only elements
+	support.getElementsByTagName = assert(function( div ) {
+		div.appendChild( document.createComment("") );
+		return !div.getElementsByTagName("*").length;
+	});
+
+	// Support: IE<9
+	support.getElementsByClassName = rnative.test( document.getElementsByClassName );
+
+	// Support: IE<10
+	// Check if getElementById returns elements by name
+	// The broken getElementById methods don't pick up programatically-set names,
+	// so use a roundabout getElementsByName test
+	support.getById = assert(function( div ) {
+		docElem.appendChild( div ).id = expando;
+		return !document.getElementsByName || !document.getElementsByName( expando ).length;
+	});
+
+	// ID find and filter
+	if ( support.getById ) {
+		Expr.find["ID"] = function( id, context ) {
+			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
+				var m = context.getElementById( id );
+				return m ? [ m ] : [];
+			}
+		};
+		Expr.filter["ID"] = function( id ) {
+			var attrId = id.replace( runescape, funescape );
+			return function( elem ) {
+				return elem.getAttribute("id") === attrId;
+			};
+		};
+	} else {
+		// Support: IE6/7
+		// getElementById is not reliable as a find shortcut
+		delete Expr.find["ID"];
+
+		Expr.filter["ID"] =  function( id ) {
+			var attrId = id.replace( runescape, funescape );
+			return function( elem ) {
+				var node = typeof elem.getAttributeNode !== "undefined" &&
+					elem.getAttributeNode("id");
+				return node && node.value === attrId;
+			};
+		};
+	}
+
+	// Tag
+	Expr.find["TAG"] = support.getElementsByTagName ?
+		function( tag, context ) {
+			if ( typeof context.getElementsByTagName !== "undefined" ) {
+				return context.getElementsByTagName( tag );
+
+			// DocumentFragment nodes don't have gEBTN
+			} else if ( support.qsa ) {
+				return context.querySelectorAll( tag );
+			}
+		} :
+
+		function( tag, context ) {
+			var elem,
+				tmp = [],
+				i = 0,
+				// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
+				results = context.getElementsByTagName( tag );
+
+			// Filter out possible comments
+			if ( tag === "*" ) {
+				while ( (elem = results[i++]) ) {
+					if ( elem.nodeType === 1 ) {
+						tmp.push( elem );
+					}
+				}
+
+				return tmp;
+			}
+			return results;
+		};
+
+	// Class
+	Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
+		if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
+			return context.getElementsByClassName( className );
+		}
+	};
+
+	/* QSA/matchesSelector
+	---------------------------------------------------------------------- */
+
+	// QSA and matchesSelector support
+
+	// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+	rbuggyMatches = [];
+
+	// qSa(:focus) reports false when true (Chrome 21)
+	// We allow this because of a bug in IE8/9 that throws an error
+	// whenever `document.activeElement` is accessed on an iframe
+	// So, we allow :focus to pass through QSA all the time to avoid the IE error
+	// See http://bugs.jquery.com/ticket/13378
+	rbuggyQSA = [];
+
+	if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
+		// Build QSA regex
+		// Regex strategy adopted from Diego Perini
+		assert(function( div ) {
+			// Select is set to empty string on purpose
+			// This is to test IE's treatment of not explicitly
+			// setting a boolean content attribute,
+			// since its presence should be enough
+			// http://bugs.jquery.com/ticket/12359
+			docElem.appendChild( div ).innerHTML = "<a id='" + expando + "'></a>" +
+				"<select id='" + expando + "-\r\\' msallowcapture=''>" +
+				"<option selected=''></option></select>";
+
+			// Support: IE8, Opera 11-12.16
+			// Nothing should be selected when empty strings follow ^= or $= or *=
+			// The test attribute must be unknown in Opera but "safe" for WinRT
+			// http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
+			if ( div.querySelectorAll("[msallowcapture^='']").length ) {
+				rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
+			}
+
+			// Support: IE8
+			// Boolean attributes and "value" are not treated correctly
+			if ( !div.querySelectorAll("[selected]").length ) {
+				rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
+			}
+
+			// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
+			if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
+				rbuggyQSA.push("~=");
+			}
+
+			// Webkit/Opera - :checked should return selected option elements
+			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+			// IE8 throws error here and will not see later tests
+			if ( !div.querySelectorAll(":checked").length ) {
+				rbuggyQSA.push(":checked");
+			}
+
+			// Support: Safari 8+, iOS 8+
+			// https://bugs.webkit.org/show_bug.cgi?id=136851
+			// In-page `selector#id sibing-combinator selector` fails
+			if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) {
+				rbuggyQSA.push(".#.+[+~]");
+			}
+		});
+
+		assert(function( div ) {
+			// Support: Windows 8 Native Apps
+			// The type and name attributes are restricted during .innerHTML assignment
+			var input = document.createElement("input");
+			input.setAttribute( "type", "hidden" );
+			div.appendChild( input ).setAttribute( "name", "D" );
+
+			// Support: IE8
+			// Enforce case-sensitivity of name attribute
+			if ( div.querySelectorAll("[name=d]").length ) {
+				rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
+			}
+
+			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
+			// IE8 throws error here and will not see later tests
+			if ( !div.querySelectorAll(":enabled").length ) {
+				rbuggyQSA.push( ":enabled", ":disabled" );
+			}
+
+			// Opera 10-11 does not throw on post-comma invalid pseudos
+			div.querySelectorAll("*,:x");
+			rbuggyQSA.push(",.*:");
+		});
+	}
+
+	if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
+		docElem.webkitMatchesSelector ||
+		docElem.mozMatchesSelector ||
+		docElem.oMatchesSelector ||
+		docElem.msMatchesSelector) )) ) {
+
+		assert(function( div ) {
+			// Check to see if it's possible to do matchesSelector
+			// on a disconnected node (IE 9)
+			support.disconnectedMatch = matches.call( div, "div" );
+
+			// This should fail with an exception
+			// Gecko does not error, returns false instead
+			matches.call( div, "[s!='']:x" );
+			rbuggyMatches.push( "!=", pseudos );
+		});
+	}
+
+	rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
+	rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
+
+	/* Contains
+	---------------------------------------------------------------------- */
+	hasCompare = rnative.test( docElem.compareDocumentPosition );
+
+	// Element contains another
+	// Purposefully self-exclusive
+	// As in, an element does not contain itself
+	contains = hasCompare || rnative.test( docElem.contains ) ?
+		function( a, b ) {
+			var adown = a.nodeType === 9 ? a.documentElement : a,
+				bup = b && b.parentNode;
+			return a === bup || !!( bup && bup.nodeType === 1 && (
+				adown.contains ?
+					adown.contains( bup ) :
+					a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
+			));
+		} :
+		function( a, b ) {
+			if ( b ) {
+				while ( (b = b.parentNode) ) {
+					if ( b === a ) {
+						return true;
+					}
+				}
+			}
+			return false;
+		};
+
+	/* Sorting
+	---------------------------------------------------------------------- */
+
+	// Document order sorting
+	sortOrder = hasCompare ?
+	function( a, b ) {
+
+		// Flag for duplicate removal
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+		}
+
+		// Sort on method existence if only one input has compareDocumentPosition
+		var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
+		if ( compare ) {
+			return compare;
+		}
+
+		// Calculate position if both inputs belong to the same document
+		compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
+			a.compareDocumentPosition( b ) :
+
+			// Otherwise we know they are disconnected
+			1;
+
+		// Disconnected nodes
+		if ( compare & 1 ||
+			(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
+
+			// Choose the first element that is related to our preferred document
+			if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
+				return -1;
+			}
+			if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
+				return 1;
+			}
+
+			// Maintain original order
+			return sortInput ?
+				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
+				0;
+		}
+
+		return compare & 4 ? -1 : 1;
+	} :
+	function( a, b ) {
+		// Exit early if the nodes are identical
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+		}
+
+		var cur,
+			i = 0,
+			aup = a.parentNode,
+			bup = b.parentNode,
+			ap = [ a ],
+			bp = [ b ];
+
+		// Parentless nodes are either documents or disconnected
+		if ( !aup || !bup ) {
+			return a === document ? -1 :
+				b === document ? 1 :
+				aup ? -1 :
+				bup ? 1 :
+				sortInput ?
+				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
+				0;
+
+		// If the nodes are siblings, we can do a quick check
+		} else if ( aup === bup ) {
+			return siblingCheck( a, b );
+		}
+
+		// Otherwise we need full lists of their ancestors for comparison
+		cur = a;
+		while ( (cur = cur.parentNode) ) {
+			ap.unshift( cur );
+		}
+		cur = b;
+		while ( (cur = cur.parentNode) ) {
+			bp.unshift( cur );
+		}
+
+		// Walk down the tree looking for a discrepancy
+		while ( ap[i] === bp[i] ) {
+			i++;
+		}
+
+		return i ?
+			// Do a sibling check if the nodes have a common ancestor
+			siblingCheck( ap[i], bp[i] ) :
+
+			// Otherwise nodes in our document sort first
+			ap[i] === preferredDoc ? -1 :
+			bp[i] === preferredDoc ? 1 :
+			0;
+	};
+
+	return document;
+};
+
+Sizzle.matches = function( expr, elements ) {
+	return Sizzle( expr, null, null, elements );
+};
+
+Sizzle.matchesSelector = function( elem, expr ) {
+	// Set document vars if needed
+	if ( ( elem.ownerDocument || elem ) !== document ) {
+		setDocument( elem );
+	}
+
+	// Make sure that attribute selectors are quoted
+	expr = expr.replace( rattributeQuotes, "='$1']" );
+
+	if ( support.matchesSelector && documentIsHTML &&
+		!compilerCache[ expr + " " ] &&
+		( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
+		( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {
+
+		try {
+			var ret = matches.call( elem, expr );
+
+			// IE 9's matchesSelector returns false on disconnected nodes
+			if ( ret || support.disconnectedMatch ||
+					// As well, disconnected nodes are said to be in a document
+					// fragment in IE 9
+					elem.document && elem.document.nodeType !== 11 ) {
+				return ret;
+			}
+		} catch (e) {}
+	}
+
+	return Sizzle( expr, document, null, [ elem ] ).length > 0;
+};
+
+Sizzle.contains = function( context, elem ) {
+	// Set document vars if needed
+	if ( ( context.ownerDocument || context ) !== document ) {
+		setDocument( context );
+	}
+	return contains( context, elem );
+};
+
+Sizzle.attr = function( elem, name ) {
+	// Set document vars if needed
+	if ( ( elem.ownerDocument || elem ) !== document ) {
+		setDocument( elem );
+	}
+
+	var fn = Expr.attrHandle[ name.toLowerCase() ],
+		// Don't get fooled by Object.prototype properties (jQuery #13807)
+		val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
+			fn( elem, name, !documentIsHTML ) :
+			undefined;
+
+	return val !== undefined ?
+		val :
+		support.attributes || !documentIsHTML ?
+			elem.getAttribute( name ) :
+			(val = elem.getAttributeNode(name)) && val.specified ?
+				val.value :
+				null;
+};
+
+Sizzle.error = function( msg ) {
+	throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+/**
+ * Document sorting and removing duplicates
+ * @param {ArrayLike} results
+ */
+Sizzle.uniqueSort = function( results ) {
+	var elem,
+		duplicates = [],
+		j = 0,
+		i = 0;
+
+	// Unless we *know* we can detect duplicates, assume their presence
+	hasDuplicate = !support.detectDuplicates;
+	sortInput = !support.sortStable && results.slice( 0 );
+	results.sort( sortOrder );
+
+	if ( hasDuplicate ) {
+		while ( (elem = results[i++]) ) {
+			if ( elem === results[ i ] ) {
+				j = duplicates.push( i );
+			}
+		}
+		while ( j-- ) {
+			results.splice( duplicates[ j ], 1 );
+		}
+	}
+
+	// Clear input after sorting to release objects
+	// See https://github.com/jquery/sizzle/pull/225
+	sortInput = null;
+
+	return results;
+};
+
+/**
+ * Utility function for retrieving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+getText = Sizzle.getText = function( elem ) {
+	var node,
+		ret = "",
+		i = 0,
+		nodeType = elem.nodeType;
+
+	if ( !nodeType ) {
+		// If no nodeType, this is expected to be an array
+		while ( (node = elem[i++]) ) {
+			// Do not traverse comment nodes
+			ret += getText( node );
+		}
+	} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+		// Use textContent for elements
+		// innerText usage removed for consistency of new lines (jQuery #11153)
+		if ( typeof elem.textContent === "string" ) {
+			return elem.textContent;
+		} else {
+			// Traverse its children
+			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+				ret += getText( elem );
+			}
+		}
+	} else if ( nodeType === 3 || nodeType === 4 ) {
+		return elem.nodeValue;
+	}
+	// Do not include comment or processing instruction nodes
+
+	return ret;
+};
+
+Expr = Sizzle.selectors = {
+
+	// Can be adjusted by the user
+	cacheLength: 50,
+
+	createPseudo: markFunction,
+
+	match: matchExpr,
+
+	attrHandle: {},
+
+	find: {},
+
+	relative: {
+		">": { dir: "parentNode", first: true },
+		" ": { dir: "parentNode" },
+		"+": { dir: "previousSibling", first: true },
+		"~": { dir: "previousSibling" }
+	},
+
+	preFilter: {
+		"ATTR": function( match ) {
+			match[1] = match[1].replace( runescape, funescape );
+
+			// Move the given value to match[3] whether quoted or unquoted
+			match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
+
+			if ( match[2] === "~=" ) {
+				match[3] = " " + match[3] + " ";
+			}
+
+			return match.slice( 0, 4 );
+		},
+
+		"CHILD": function( match ) {
+			/* matches from matchExpr["CHILD"]
+				1 type (only|nth|...)
+				2 what (child|of-type)
+				3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
+				4 xn-component of xn+y argument ([+-]?\d*n|)
+				5 sign of xn-component
+				6 x of xn-component
+				7 sign of y-component
+				8 y of y-component
+			*/
+			match[1] = match[1].toLowerCase();
+
+			if ( match[1].slice( 0, 3 ) === "nth" ) {
+				// nth-* requires argument
+				if ( !match[3] ) {
+					Sizzle.error( match[0] );
+				}
+
+				// numeric x and y parameters for Expr.filter.CHILD
+				// remember that false/true cast respectively to 0/1
+				match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
+				match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
+
+			// other types prohibit arguments
+			} else if ( match[3] ) {
+				Sizzle.error( match[0] );
+			}
+
+			return match;
+		},
+
+		"PSEUDO": function( match ) {
+			var excess,
+				unquoted = !match[6] && match[2];
+
+			if ( matchExpr["CHILD"].test( match[0] ) ) {
+				return null;
+			}
+
+			// Accept quoted arguments as-is
+			if ( match[3] ) {
+				match[2] = match[4] || match[5] || "";
+
+			// Strip excess characters from unquoted arguments
+			} else if ( unquoted && rpseudo.test( unquoted ) &&
+				// Get excess from tokenize (recursively)
+				(excess = tokenize( unquoted, true )) &&
+				// advance to the next closing parenthesis
+				(excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
+
+				// excess is a negative index
+				match[0] = match[0].slice( 0, excess );
+				match[2] = unquoted.slice( 0, excess );
+			}
+
+			// Return only captures needed by the pseudo filter method (type and argument)
+			return match.slice( 0, 3 );
+		}
+	},
+
+	filter: {
+
+		"TAG": function( nodeNameSelector ) {
+			var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
+			return nodeNameSelector === "*" ?
+				function() { return true; } :
+				function( elem ) {
+					return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
+				};
+		},
+
+		"CLASS": function( className ) {
+			var pattern = classCache[ className + " " ];
+
+			return pattern ||
+				(pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
+				classCache( className, function( elem ) {
+					return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
+				});
+		},
+
+		"ATTR": function( name, operator, check ) {
+			return function( elem ) {
+				var result = Sizzle.attr( elem, name );
+
+				if ( result == null ) {
+					return operator === "!=";
+				}
+				if ( !operator ) {
+					return true;
+				}
+
+				result += "";
+
+				return operator === "=" ? result === check :
+					operator === "!=" ? result !== check :
+					operator === "^=" ? check && result.indexOf( check ) === 0 :
+					operator === "*=" ? check && result.indexOf( check ) > -1 :
+					operator === "$=" ? check && result.slice( -check.length ) === check :
+					operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
+					operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
+					false;
+			};
+		},
+
+		"CHILD": function( type, what, argument, first, last ) {
+			var simple = type.slice( 0, 3 ) !== "nth",
+				forward = type.slice( -4 ) !== "last",
+				ofType = what === "of-type";
+
+			return first === 1 && last === 0 ?
+
+				// Shortcut for :nth-*(n)
+				function( elem ) {
+					return !!elem.parentNode;
+				} :
+
+				function( elem, context, xml ) {
+					var cache, uniqueCache, outerCache, node, nodeIndex, start,
+						dir = simple !== forward ? "nextSibling" : "previousSibling",
+						parent = elem.parentNode,
+						name = ofType && elem.nodeName.toLowerCase(),
+						useCache = !xml && !ofType,
+						diff = false;
+
+					if ( parent ) {
+
+						// :(first|last|only)-(child|of-type)
+						if ( simple ) {
+							while ( dir ) {
+								node = elem;
+								while ( (node = node[ dir ]) ) {
+									if ( ofType ?
+										node.nodeName.toLowerCase() === name :
+										node.nodeType === 1 ) {
+
+										return false;
+									}
+								}
+								// Reverse direction for :only-* (if we haven't yet done so)
+								start = dir = type === "only" && !start && "nextSibling";
+							}
+							return true;
+						}
+
+						start = [ forward ? parent.firstChild : parent.lastChild ];
+
+						// non-xml :nth-child(...) stores cache data on `parent`
+						if ( forward && useCache ) {
+
+							// Seek `elem` from a previously-cached index
+
+							// ...in a gzip-friendly way
+							node = parent;
+							outerCache = node[ expando ] || (node[ expando ] = {});
+
+							// Support: IE <9 only
+							// Defend against cloned attroperties (jQuery gh-1709)
+							uniqueCache = outerCache[ node.uniqueID ] ||
+								(outerCache[ node.uniqueID ] = {});
+
+							cache = uniqueCache[ type ] || [];
+							nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
+							diff = nodeIndex && cache[ 2 ];
+							node = nodeIndex && parent.childNodes[ nodeIndex ];
+
+							while ( (node = ++nodeIndex && node && node[ dir ] ||
+
+								// Fallback to seeking `elem` from the start
+								(diff = nodeIndex = 0) || start.pop()) ) {
+
+								// When found, cache indexes on `parent` and break
+								if ( node.nodeType === 1 && ++diff && node === elem ) {
+									uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
+									break;
+								}
+							}
+
+						} else {
+							// Use previously-cached element index if available
+							if ( useCache ) {
+								// ...in a gzip-friendly way
+								node = elem;
+								outerCache = node[ expando ] || (node[ expando ] = {});
+
+								// Support: IE <9 only
+								// Defend against cloned attroperties (jQuery gh-1709)
+								uniqueCache = outerCache[ node.uniqueID ] ||
+									(outerCache[ node.uniqueID ] = {});
+
+								cache = uniqueCache[ type ] || [];
+								nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
+								diff = nodeIndex;
+							}
+
+							// xml :nth-child(...)
+							// or :nth-last-child(...) or :nth(-last)?-of-type(...)
+							if ( diff === false ) {
+								// Use the same loop as above to seek `elem` from the start
+								while ( (node = ++nodeIndex && node && node[ dir ] ||
+									(diff = nodeIndex = 0) || start.pop()) ) {
+
+									if ( ( ofType ?
+										node.nodeName.toLowerCase() === name :
+										node.nodeType === 1 ) &&
+										++diff ) {
+
+										// Cache the index of each encountered element
+										if ( useCache ) {
+											outerCache = node[ expando ] || (node[ expando ] = {});
+
+											// Support: IE <9 only
+											// Defend against cloned attroperties (jQuery gh-1709)
+											uniqueCache = outerCache[ node.uniqueID ] ||
+												(outerCache[ node.uniqueID ] = {});
+
+											uniqueCache[ type ] = [ dirruns, diff ];
+										}
+
+										if ( node === elem ) {
+											break;
+										}
+									}
+								}
+							}
+						}
+
+						// Incorporate the offset, then check against cycle size
+						diff -= last;
+						return diff === first || ( diff % first === 0 && diff / first >= 0 );
+					}
+				};
+		},
+
+		"PSEUDO": function( pseudo, argument ) {
+			// pseudo-class names are case-insensitive
+			// http://www.w3.org/TR/selectors/#pseudo-classes
+			// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
+			// Remember that setFilters inherits from pseudos
+			var args,
+				fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
+					Sizzle.error( "unsupported pseudo: " + pseudo );
+
+			// The user may use createPseudo to indicate that
+			// arguments are needed to create the filter function
+			// just as Sizzle does
+			if ( fn[ expando ] ) {
+				return fn( argument );
+			}
+
+			// But maintain support for old signatures
+			if ( fn.length > 1 ) {
+				args = [ pseudo, pseudo, "", argument ];
+				return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
+					markFunction(function( seed, matches ) {
+						var idx,
+							matched = fn( seed, argument ),
+							i = matched.length;
+						while ( i-- ) {
+							idx = indexOf( seed, matched[i] );
+							seed[ idx ] = !( matches[ idx ] = matched[i] );
+						}
+					}) :
+					function( elem ) {
+						return fn( elem, 0, args );
+					};
+			}
+
+			return fn;
+		}
+	},
+
+	pseudos: {
+		// Potentially complex pseudos
+		"not": markFunction(function( selector ) {
+			// Trim the selector passed to compile
+			// to avoid treating leading and trailing
+			// spaces as combinators
+			var input = [],
+				results = [],
+				matcher = compile( selector.replace( rtrim, "$1" ) );
+
+			return matcher[ expando ] ?
+				markFunction(function( seed, matches, context, xml ) {
+					var elem,
+						unmatched = matcher( seed, null, xml, [] ),
+						i = seed.length;
+
+					// Match elements unmatched by `matcher`
+					while ( i-- ) {
+						if ( (elem = unmatched[i]) ) {
+							seed[i] = !(matches[i] = elem);
+						}
+					}
+				}) :
+				function( elem, context, xml ) {
+					input[0] = elem;
+					matcher( input, null, xml, results );
+					// Don't keep the element (issue #299)
+					input[0] = null;
+					return !results.pop();
+				};
+		}),
+
+		"has": markFunction(function( selector ) {
+			return function( elem ) {
+				return Sizzle( selector, elem ).length > 0;
+			};
+		}),
+
+		"contains": markFunction(function( text ) {
+			text = text.replace( runescape, funescape );
+			return function( elem ) {
+				return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
+			};
+		}),
+
+		// "Whether an element is represented by a :lang() selector
+		// is based solely on the element's language value
+		// being equal to the identifier C,
+		// or beginning with the identifier C immediately followed by "-".
+		// The matching of C against the element's language value is performed case-insensitively.
+		// The identifier C does not have to be a valid language name."
+		// http://www.w3.org/TR/selectors/#lang-pseudo
+		"lang": markFunction( function( lang ) {
+			// lang value must be a valid identifier
+			if ( !ridentifier.test(lang || "") ) {
+				Sizzle.error( "unsupported lang: " + lang );
+			}
+			lang = lang.replace( runescape, funescape ).toLowerCase();
+			return function( elem ) {
+				var elemLang;
+				do {
+					if ( (elemLang = documentIsHTML ?
+						elem.lang :
+						elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
+
+						elemLang = elemLang.toLowerCase();
+						return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
+					}
+				} while ( (elem = elem.parentNode) && elem.nodeType === 1 );
+				return false;
+			};
+		}),
+
+		// Miscellaneous
+		"target": function( elem ) {
+			var hash = window.location && window.location.hash;
+			return hash && hash.slice( 1 ) === elem.id;
+		},
+
+		"root": function( elem ) {
+			return elem === docElem;
+		},
+
+		"focus": function( elem ) {
+			return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
+		},
+
+		// Boolean properties
+		"enabled": function( elem ) {
+			return elem.disabled === false;
+		},
+
+		"disabled": function( elem ) {
+			return elem.disabled === true;
+		},
+
+		"checked": function( elem ) {
+			// In CSS3, :checked should return both checked and selected elements
+			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+			var nodeName = elem.nodeName.toLowerCase();
+			return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
+		},
+
+		"selected": function( elem ) {
+			// Accessing this property makes selected-by-default
+			// options in Safari work properly
+			if ( elem.parentNode ) {
+				elem.parentNode.selectedIndex;
+			}
+
+			return elem.selected === true;
+		},
+
+		// Contents
+		"empty": function( elem ) {
+			// http://www.w3.org/TR/selectors/#empty-pseudo
+			// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
+			//   but not by others (comment: 8; processing instruction: 7; etc.)
+			// nodeType < 6 works because attributes (2) do not appear as children
+			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+				if ( elem.nodeType < 6 ) {
+					return false;
+				}
+			}
+			return true;
+		},
+
+		"parent": function( elem ) {
+			return !Expr.pseudos["empty"]( elem );
+		},
+
+		// Element/input types
+		"header": function( elem ) {
+			return rheader.test( elem.nodeName );
+		},
+
+		"input": function( elem ) {
+			return rinputs.test( elem.nodeName );
+		},
+
+		"button": function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return name === "input" && elem.type === "button" || name === "button";
+		},
+
+		"text": function( elem ) {
+			var attr;
+			return elem.nodeName.toLowerCase() === "input" &&
+				elem.type === "text" &&
+
+				// Support: IE<8
+				// New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
+				( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
+		},
+
+		// Position-in-collection
+		"first": createPositionalPseudo(function() {
+			return [ 0 ];
+		}),
+
+		"last": createPositionalPseudo(function( matchIndexes, length ) {
+			return [ length - 1 ];
+		}),
+
+		"eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
+			return [ argument < 0 ? argument + length : argument ];
+		}),
+
+		"even": createPositionalPseudo(function( matchIndexes, length ) {
+			var i = 0;
+			for ( ; i < length; i += 2 ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		}),
+
+		"odd": createPositionalPseudo(function( matchIndexes, length ) {
+			var i = 1;
+			for ( ; i < length; i += 2 ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		}),
+
+		"lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+			var i = argument < 0 ? argument + length : argument;
+			for ( ; --i >= 0; ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		}),
+
+		"gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+			var i = argument < 0 ? argument + length : argument;
+			for ( ; ++i < length; ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		})
+	}
+};
+
+Expr.pseudos["nth"] = Expr.pseudos["eq"];
+
+// Add button/input type pseudos
+for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
+	Expr.pseudos[ i ] = createInputPseudo( i );
+}
+for ( i in { submit: true, reset: true } ) {
+	Expr.pseudos[ i ] = createButtonPseudo( i );
+}
+
+// Easy API for creating new setFilters
+function setFilters() {}
+setFilters.prototype = Expr.filters = Expr.pseudos;
+Expr.setFilters = new setFilters();
+
+tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
+	var matched, match, tokens, type,
+		soFar, groups, preFilters,
+		cached = tokenCache[ selector + " " ];
+
+	if ( cached ) {
+		return parseOnly ? 0 : cached.slice( 0 );
+	}
+
+	soFar = selector;
+	groups = [];
+	preFilters = Expr.preFilter;
+
+	while ( soFar ) {
+
+		// Comma and first run
+		if ( !matched || (match = rcomma.exec( soFar )) ) {
+			if ( match ) {
+				// Don't consume trailing commas as valid
+				soFar = soFar.slice( match[0].length ) || soFar;
+			}
+			groups.push( (tokens = []) );
+		}
+
+		matched = false;
+
+		// Combinators
+		if ( (match = rcombinators.exec( soFar )) ) {
+			matched = match.shift();
+			tokens.push({
+				value: matched,
+				// Cast descendant combinators to space
+				type: match[0].replace( rtrim, " " )
+			});
+			soFar = soFar.slice( matched.length );
+		}
+
+		// Filters
+		for ( type in Expr.filter ) {
+			if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
+				(match = preFilters[ type ]( match ))) ) {
+				matched = match.shift();
+				tokens.push({
+					value: matched,
+					type: type,
+					matches: match
+				});
+				soFar = soFar.slice( matched.length );
+			}
+		}
+
+		if ( !matched ) {
+			break;
+		}
+	}
+
+	// Return the length of the invalid excess
+	// if we're just parsing
+	// Otherwise, throw an error or return tokens
+	return parseOnly ?
+		soFar.length :
+		soFar ?
+			Sizzle.error( selector ) :
+			// Cache the tokens
+			tokenCache( selector, groups ).slice( 0 );
+};
+
+function toSelector( tokens ) {
+	var i = 0,
+		len = tokens.length,
+		selector = "";
+	for ( ; i < len; i++ ) {
+		selector += tokens[i].value;
+	}
+	return selector;
+}
+
+function addCombinator( matcher, combinator, base ) {
+	var dir = combinator.dir,
+		checkNonElements = base && dir === "parentNode",
+		doneName = done++;
+
+	return combinator.first ?
+		// Check against closest ancestor/preceding element
+		function( elem, context, xml ) {
+			while ( (elem = elem[ dir ]) ) {
+				if ( elem.nodeType === 1 || checkNonElements ) {
+					return matcher( elem, context, xml );
+				}
+			}
+		} :
+
+		// Check against all ancestor/preceding elements
+		function( elem, context, xml ) {
+			var oldCache, uniqueCache, outerCache,
+				newCache = [ dirruns, doneName ];
+
+			// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
+			if ( xml ) {
+				while ( (elem = elem[ dir ]) ) {
+					if ( elem.nodeType === 1 || checkNonElements ) {
+						if ( matcher( elem, context, xml ) ) {
+							return true;
+						}
+					}
+				}
+			} else {
+				while ( (elem = elem[ dir ]) ) {
+					if ( elem.nodeType === 1 || checkNonElements ) {
+						outerCache = elem[ expando ] || (elem[ expando ] = {});
+
+						// Support: IE <9 only
+						// Defend against cloned attroperties (jQuery gh-1709)
+						uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
+
+						if ( (oldCache = uniqueCache[ dir ]) &&
+							oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
+
+							// Assign to newCache so results back-propagate to previous elements
+							return (newCache[ 2 ] = oldCache[ 2 ]);
+						} else {
+							// Reuse newcache so results back-propagate to previous elements
+							uniqueCache[ dir ] = newCache;
+
+							// A match means we're done; a fail means we have to keep checking
+							if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
+								return true;
+							}
+						}
+					}
+				}
+			}
+		};
+}
+
+function elementMatcher( matchers ) {
+	return matchers.length > 1 ?
+		function( elem, context, xml ) {
+			var i = matchers.length;
+			while ( i-- ) {
+				if ( !matchers[i]( elem, context, xml ) ) {
+					return false;
+				}
+			}
+			return true;
+		} :
+		matchers[0];
+}
+
+function multipleContexts( selector, contexts, results ) {
+	var i = 0,
+		len = contexts.length;
+	for ( ; i < len; i++ ) {
+		Sizzle( selector, contexts[i], results );
+	}
+	return results;
+}
+
+function condense( unmatched, map, filter, context, xml ) {
+	var elem,
+		newUnmatched = [],
+		i = 0,
+		len = unmatched.length,
+		mapped = map != null;
+
+	for ( ; i < len; i++ ) {
+		if ( (elem = unmatched[i]) ) {
+			if ( !filter || filter( elem, context, xml ) ) {
+				newUnmatched.push( elem );
+				if ( mapped ) {
+					map.push( i );
+				}
+			}
+		}
+	}
+
+	return newUnmatched;
+}
+
+function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
+	if ( postFilter && !postFilter[ expando ] ) {
+		postFilter = setMatcher( postFilter );
+	}
+	if ( postFinder && !postFinder[ expando ] ) {
+		postFinder = setMatcher( postFinder, postSelector );
+	}
+	return markFunction(function( seed, results, context, xml ) {
+		var temp, i, elem,
+			preMap = [],
+			postMap = [],
+			preexisting = results.length,
+
+			// Get initial elements from seed or context
+			elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
+
+			// Prefilter to get matcher input, preserving a map for seed-results synchronization
+			matcherIn = preFilter && ( seed || !selector ) ?
+				condense( elems, preMap, preFilter, context, xml ) :
+				elems,
+
+			matcherOut = matcher ?
+				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
+				postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
+
+					// ...intermediate processing is necessary
+					[] :
+
+					// ...otherwise use results directly
+					results :
+				matcherIn;
+
+		// Find primary matches
+		if ( matcher ) {
+			matcher( matcherIn, matcherOut, context, xml );
+		}
+
+		// Apply postFilter
+		if ( postFilter ) {
+			temp = condense( matcherOut, postMap );
+			postFilter( temp, [], context, xml );
+
+			// Un-match failing elements by moving them back to matcherIn
+			i = temp.length;
+			while ( i-- ) {
+				if ( (elem = temp[i]) ) {
+					matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
+				}
+			}
+		}
+
+		if ( seed ) {
+			if ( postFinder || preFilter ) {
+				if ( postFinder ) {
+					// Get the final matcherOut by condensing this intermediate into postFinder contexts
+					temp = [];
+					i = matcherOut.length;
+					while ( i-- ) {
+						if ( (elem = matcherOut[i]) ) {
+							// Restore matcherIn since elem is not yet a final match
+							temp.push( (matcherIn[i] = elem) );
+						}
+					}
+					postFinder( null, (matcherOut = []), temp, xml );
+				}
+
+				// Move matched elements from seed to results to keep them synchronized
+				i = matcherOut.length;
+				while ( i-- ) {
+					if ( (elem = matcherOut[i]) &&
+						(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
+
+						seed[temp] = !(results[temp] = elem);
+					}
+				}
+			}
+
+		// Add elements to results, through postFinder if defined
+		} else {
+			matcherOut = condense(
+				matcherOut === results ?
+					matcherOut.splice( preexisting, matcherOut.length ) :
+					matcherOut
+			);
+			if ( postFinder ) {
+				postFinder( null, results, matcherOut, xml );
+			} else {
+				push.apply( results, matcherOut );
+			}
+		}
+	});
+}
+
+function matcherFromTokens( tokens ) {
+	var checkContext, matcher, j,
+		len = tokens.length,
+		leadingRelative = Expr.relative[ tokens[0].type ],
+		implicitRelative = leadingRelative || Expr.relative[" "],
+		i = leadingRelative ? 1 : 0,
+
+		// The foundational matcher ensures that elements are reachable from top-level context(s)
+		matchContext = addCombinator( function( elem ) {
+			return elem === checkContext;
+		}, implicitRelative, true ),
+		matchAnyContext = addCombinator( function( elem ) {
+			return indexOf( checkContext, elem ) > -1;
+		}, implicitRelative, true ),
+		matchers = [ function( elem, context, xml ) {
+			var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+				(checkContext = context).nodeType ?
+					matchContext( elem, context, xml ) :
+					matchAnyContext( elem, context, xml ) );
+			// Avoid hanging onto element (issue #299)
+			checkContext = null;
+			return ret;
+		} ];
+
+	for ( ; i < len; i++ ) {
+		if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
+			matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
+		} else {
+			matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
+
+			// Return special upon seeing a positional matcher
+			if ( matcher[ expando ] ) {
+				// Find the next relative operator (if any) for proper handling
+				j = ++i;
+				for ( ; j < len; j++ ) {
+					if ( Expr.relative[ tokens[j].type ] ) {
+						break;
+					}
+				}
+				return setMatcher(
+					i > 1 && elementMatcher( matchers ),
+					i > 1 && toSelector(
+						// If the preceding token was a descendant combinator, insert an implicit any-element `*`
+						tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
+					).replace( rtrim, "$1" ),
+					matcher,
+					i < j && matcherFromTokens( tokens.slice( i, j ) ),
+					j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
+					j < len && toSelector( tokens )
+				);
+			}
+			matchers.push( matcher );
+		}
+	}
+
+	return elementMatcher( matchers );
+}
+
+function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
+	var bySet = setMatchers.length > 0,
+		byElement = elementMatchers.length > 0,
+		superMatcher = function( seed, context, xml, results, outermost ) {
+			var elem, j, matcher,
+				matchedCount = 0,
+				i = "0",
+				unmatched = seed && [],
+				setMatched = [],
+				contextBackup = outermostContext,
+				// We must always have either seed elements or outermost context
+				elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
+				// Use integer dirruns iff this is the outermost matcher
+				dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
+				len = elems.length;
+
+			if ( outermost ) {
+				outermostContext = context === document || context || outermost;
+			}
+
+			// Add elements passing elementMatchers directly to results
+			// Support: IE<9, Safari
+			// Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
+			for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
+				if ( byElement && elem ) {
+					j = 0;
+					if ( !context && elem.ownerDocument !== document ) {
+						setDocument( elem );
+						xml = !documentIsHTML;
+					}
+					while ( (matcher = elementMatchers[j++]) ) {
+						if ( matcher( elem, context || document, xml) ) {
+							results.push( elem );
+							break;
+						}
+					}
+					if ( outermost ) {
+						dirruns = dirrunsUnique;
+					}
+				}
+
+				// Track unmatched elements for set filters
+				if ( bySet ) {
+					// They will have gone through all possible matchers
+					if ( (elem = !matcher && elem) ) {
+						matchedCount--;
+					}
+
+					// Lengthen the array for every element, matched or not
+					if ( seed ) {
+						unmatched.push( elem );
+					}
+				}
+			}
+
+			// `i` is now the count of elements visited above, and adding it to `matchedCount`
+			// makes the latter nonnegative.
+			matchedCount += i;
+
+			// Apply set filters to unmatched elements
+			// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
+			// equals `i`), unless we didn't visit _any_ elements in the above loop because we have
+			// no element matchers and no seed.
+			// Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
+			// case, which will result in a "00" `matchedCount` that differs from `i` but is also
+			// numerically zero.
+			if ( bySet && i !== matchedCount ) {
+				j = 0;
+				while ( (matcher = setMatchers[j++]) ) {
+					matcher( unmatched, setMatched, context, xml );
+				}
+
+				if ( seed ) {
+					// Reintegrate element matches to eliminate the need for sorting
+					if ( matchedCount > 0 ) {
+						while ( i-- ) {
+							if ( !(unmatched[i] || setMatched[i]) ) {
+								setMatched[i] = pop.call( results );
+							}
+						}
+					}
+
+					// Discard index placeholder values to get only actual matches
+					setMatched = condense( setMatched );
+				}
+
+				// Add matches to results
+				push.apply( results, setMatched );
+
+				// Seedless set matches succeeding multiple successful matchers stipulate sorting
+				if ( outermost && !seed && setMatched.length > 0 &&
+					( matchedCount + setMatchers.length ) > 1 ) {
+
+					Sizzle.uniqueSort( results );
+				}
+			}
+
+			// Override manipulation of globals by nested matchers
+			if ( outermost ) {
+				dirruns = dirrunsUnique;
+				outermostContext = contextBackup;
+			}
+
+			return unmatched;
+		};
+
+	return bySet ?
+		markFunction( superMatcher ) :
+		superMatcher;
+}
+
+compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
+	var i,
+		setMatchers = [],
+		elementMatchers = [],
+		cached = compilerCache[ selector + " " ];
+
+	if ( !cached ) {
+		// Generate a function of recursive functions that can be used to check each element
+		if ( !match ) {
+			match = tokenize( selector );
+		}
+		i = match.length;
+		while ( i-- ) {
+			cached = matcherFromTokens( match[i] );
+			if ( cached[ expando ] ) {
+				setMatchers.push( cached );
+			} else {
+				elementMatchers.push( cached );
+			}
+		}
+
+		// Cache the compiled function
+		cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
+
+		// Save selector and tokenization
+		cached.selector = selector;
+	}
+	return cached;
+};
+
+/**
+ * A low-level selection function that works with Sizzle's compiled
+ *  selector functions
+ * @param {String|Function} selector A selector or a pre-compiled
+ *  selector function built with Sizzle.compile
+ * @param {Element} context
+ * @param {Array} [results]
+ * @param {Array} [seed] A set of elements to match against
+ */
+select = Sizzle.select = function( selector, context, results, seed ) {
+	var i, tokens, token, type, find,
+		compiled = typeof selector === "function" && selector,
+		match = !seed && tokenize( (selector = compiled.selector || selector) );
+
+	results = results || [];
+
+	// Try to minimize operations if there is only one selector in the list and no seed
+	// (the latter of which guarantees us context)
+	if ( match.length === 1 ) {
+
+		// Reduce context if the leading compound selector is an ID
+		tokens = match[0] = match[0].slice( 0 );
+		if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
+				support.getById && context.nodeType === 9 && documentIsHTML &&
+				Expr.relative[ tokens[1].type ] ) {
+
+			context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
+			if ( !context ) {
+				return results;
+
+			// Precompiled matchers will still verify ancestry, so step up a level
+			} else if ( compiled ) {
+				context = context.parentNode;
+			}
+
+			selector = selector.slice( tokens.shift().value.length );
+		}
+
+		// Fetch a seed set for right-to-left matching
+		i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
+		while ( i-- ) {
+			token = tokens[i];
+
+			// Abort if we hit a combinator
+			if ( Expr.relative[ (type = token.type) ] ) {
+				break;
+			}
+			if ( (find = Expr.find[ type ]) ) {
+				// Search, expanding context for leading sibling combinators
+				if ( (seed = find(
+					token.matches[0].replace( runescape, funescape ),
+					rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
+				)) ) {
+
+					// If seed is empty or no tokens remain, we can return early
+					tokens.splice( i, 1 );
+					selector = seed.length && toSelector( tokens );
+					if ( !selector ) {
+						push.apply( results, seed );
+						return results;
+					}
+
+					break;
+				}
+			}
+		}
+	}
+
+	// Compile and execute a filtering function if one is not provided
+	// Provide `match` to avoid retokenization if we modified the selector above
+	( compiled || compile( selector, match ) )(
+		seed,
+		context,
+		!documentIsHTML,
+		results,
+		!context || rsibling.test( selector ) && testContext( context.parentNode ) || context
+	);
+	return results;
+};
+
+// One-time assignments
+
+// Sort stability
+support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
+
+// Support: Chrome 14-35+
+// Always assume duplicates if they aren't passed to the comparison function
+support.detectDuplicates = !!hasDuplicate;
+
+// Initialize against the default document
+setDocument();
+
+// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
+// Detached nodes confoundingly follow *each other*
+support.sortDetached = assert(function( div1 ) {
+	// Should return 1, but returns 4 (following)
+	return div1.compareDocumentPosition( document.createElement("div") ) & 1;
+});
+
+// Support: IE<8
+// Prevent attribute/property "interpolation"
+// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !assert(function( div ) {
+	div.innerHTML = "<a href='#'></a>";
+	return div.firstChild.getAttribute("href") === "#" ;
+}) ) {
+	addHandle( "type|href|height|width", function( elem, name, isXML ) {
+		if ( !isXML ) {
+			return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
+		}
+	});
+}
+
+// Support: IE<9
+// Use defaultValue in place of getAttribute("value")
+if ( !support.attributes || !assert(function( div ) {
+	div.innerHTML = "<input/>";
+	div.firstChild.setAttribute( "value", "" );
+	return div.firstChild.getAttribute( "value" ) === "";
+}) ) {
+	addHandle( "value", function( elem, name, isXML ) {
+		if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
+			return elem.defaultValue;
+		}
+	});
+}
+
+// Support: IE<9
+// Use getAttributeNode to fetch booleans when getAttribute lies
+if ( !assert(function( div ) {
+	return div.getAttribute("disabled") == null;
+}) ) {
+	addHandle( booleans, function( elem, name, isXML ) {
+		var val;
+		if ( !isXML ) {
+			return elem[ name ] === true ? name.toLowerCase() :
+					(val = elem.getAttributeNode( name )) && val.specified ?
+					val.value :
+				null;
+		}
+	});
+}
+
+return Sizzle;
+
+})( window );
+
+
+
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[ ":" ] = jQuery.expr.pseudos;
+jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+
+var dir = function( elem, dir, until ) {
+	var matched = [],
+		truncate = until !== undefined;
+
+	while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
+		if ( elem.nodeType === 1 ) {
+			if ( truncate && jQuery( elem ).is( until ) ) {
+				break;
+			}
+			matched.push( elem );
+		}
+	}
+	return matched;
+};
+
+
+var siblings = function( n, elem ) {
+	var matched = [];
+
+	for ( ; n; n = n.nextSibling ) {
+		if ( n.nodeType === 1 && n !== elem ) {
+			matched.push( n );
+		}
+	}
+
+	return matched;
+};
+
+
+var rneedsContext = jQuery.expr.match.needsContext;
+
+var rsingleTag = ( /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/ );
+
+
+
+var risSimple = /^.[^:#\[\.,]*$/;
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, not ) {
+	if ( jQuery.isFunction( qualifier ) ) {
+		return jQuery.grep( elements, function( elem, i ) {
+			/* jshint -W018 */
+			return !!qualifier.call( elem, i, elem ) !== not;
+		} );
+
+	}
+
+	if ( qualifier.nodeType ) {
+		return jQuery.grep( elements, function( elem ) {
+			return ( elem === qualifier ) !== not;
+		} );
+
+	}
+
+	if ( typeof qualifier === "string" ) {
+		if ( risSimple.test( qualifier ) ) {
+			return jQuery.filter( qualifier, elements, not );
+		}
+
+		qualifier = jQuery.filter( qualifier, elements );
+	}
+
+	return jQuery.grep( elements, function( elem ) {
+		return ( jQuery.inArray( elem, qualifier ) > -1 ) !== not;
+	} );
+}
+
+jQuery.filter = function( expr, elems, not ) {
+	var elem = elems[ 0 ];
+
+	if ( not ) {
+		expr = ":not(" + expr + ")";
+	}
+
+	return elems.length === 1 && elem.nodeType === 1 ?
+		jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
+		jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
+			return elem.nodeType === 1;
+		} ) );
+};
+
+jQuery.fn.extend( {
+	find: function( selector ) {
+		var i,
+			ret = [],
+			self = this,
+			len = self.length;
+
+		if ( typeof selector !== "string" ) {
+			return this.pushStack( jQuery( selector ).filter( function() {
+				for ( i = 0; i < len; i++ ) {
+					if ( jQuery.contains( self[ i ], this ) ) {
+						return true;
+					}
+				}
+			} ) );
+		}
+
+		for ( i = 0; i < len; i++ ) {
+			jQuery.find( selector, self[ i ], ret );
+		}
+
+		// Needed because $( selector, context ) becomes $( context ).find( selector )
+		ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
+		ret.selector = this.selector ? this.selector + " " + selector : selector;
+		return ret;
+	},
+	filter: function( selector ) {
+		return this.pushStack( winnow( this, selector || [], false ) );
+	},
+	not: function( selector ) {
+		return this.pushStack( winnow( this, selector || [], true ) );
+	},
+	is: function( selector ) {
+		return !!winnow(
+			this,
+
+			// If this is a positional/relative selector, check membership in the returned set
+			// so $("p:first").is("p:last") won't return true for a doc with two "p".
+			typeof selector === "string" && rneedsContext.test( selector ) ?
+				jQuery( selector ) :
+				selector || [],
+			false
+		).length;
+	}
+} );
+
+
+// Initialize a jQuery object
+
+
+// A central reference to the root jQuery(document)
+var rootjQuery,
+
+	// A simple way to check for HTML strings
+	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+	// Strict HTML recognition (#11290: must start with <)
+	rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
+
+	init = jQuery.fn.init = function( selector, context, root ) {
+		var match, elem;
+
+		// HANDLE: $(""), $(null), $(undefined), $(false)
+		if ( !selector ) {
+			return this;
+		}
+
+		// init accepts an alternate rootjQuery
+		// so migrate can support jQuery.sub (gh-2101)
+		root = root || rootjQuery;
+
+		// Handle HTML strings
+		if ( typeof selector === "string" ) {
+			if ( selector.charAt( 0 ) === "<" &&
+				selector.charAt( selector.length - 1 ) === ">" &&
+				selector.length >= 3 ) {
+
+				// Assume that strings that start and end with <> are HTML and skip the regex check
+				match = [ null, selector, null ];
+
+			} else {
+				match = rquickExpr.exec( selector );
+			}
+
+			// Match html or make sure no context is specified for #id
+			if ( match && ( match[ 1 ] || !context ) ) {
+
+				// HANDLE: $(html) -> $(array)
+				if ( match[ 1 ] ) {
+					context = context instanceof jQuery ? context[ 0 ] : context;
+
+					// scripts is true for back-compat
+					// Intentionally let the error be thrown if parseHTML is not present
+					jQuery.merge( this, jQuery.parseHTML(
+						match[ 1 ],
+						context && context.nodeType ? context.ownerDocument || context : document,
+						true
+					) );
+
+					// HANDLE: $(html, props)
+					if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
+						for ( match in context ) {
+
+							// Properties of context are called as methods if possible
+							if ( jQuery.isFunction( this[ match ] ) ) {
+								this[ match ]( context[ match ] );
+
+							// ...and otherwise set as attributes
+							} else {
+								this.attr( match, context[ match ] );
+							}
+						}
+					}
+
+					return this;
+
+				// HANDLE: $(#id)
+				} else {
+					elem = document.getElementById( match[ 2 ] );
+
+					// Check parentNode to catch when Blackberry 4.6 returns
+					// nodes that are no longer in the document #6963
+					if ( elem && elem.parentNode ) {
+
+						// Handle the case where IE and Opera return items
+						// by name instead of ID
+						if ( elem.id !== match[ 2 ] ) {
+							return rootjQuery.find( selector );
+						}
+
+						// Otherwise, we inject the element directly into the jQuery object
+						this.length = 1;
+						this[ 0 ] = elem;
+					}
+
+					this.context = document;
+					this.selector = selector;
+					return this;
+				}
+
+			// HANDLE: $(expr, $(...))
+			} else if ( !context || context.jquery ) {
+				return ( context || root ).find( selector );
+
+			// HANDLE: $(expr, context)
+			// (which is just equivalent to: $(context).find(expr)
+			} else {
+				return this.constructor( context ).find( selector );
+			}
+
+		// HANDLE: $(DOMElement)
+		} else if ( selector.nodeType ) {
+			this.context = this[ 0 ] = selector;
+			this.length = 1;
+			return this;
+
+		// HANDLE: $(function)
+		// Shortcut for document ready
+		} else if ( jQuery.isFunction( selector ) ) {
+			return typeof root.ready !== "undefined" ?
+				root.ready( selector ) :
+
+				// Execute immediately if ready is not present
+				selector( jQuery );
+		}
+
+		if ( selector.selector !== undefined ) {
+			this.selector = selector.selector;
+			this.context = selector.context;
+		}
+
+		return jQuery.makeArray( selector, this );
+	};
+
+// Give the init function the jQuery prototype for later instantiation
+init.prototype = jQuery.fn;
+
+// Initialize central reference
+rootjQuery = jQuery( document );
+
+
+var rparentsprev = /^(?:parents|prev(?:Until|All))/,
+
+	// methods guaranteed to produce a unique set when starting from a unique set
+	guaranteedUnique = {
+		children: true,
+		contents: true,
+		next: true,
+		prev: true
+	};
+
+jQuery.fn.extend( {
+	has: function( target ) {
+		var i,
+			targets = jQuery( target, this ),
+			len = targets.length;
+
+		return this.filter( function() {
+			for ( i = 0; i < len; i++ ) {
+				if ( jQuery.contains( this, targets[ i ] ) ) {
+					return true;
+				}
+			}
+		} );
+	},
+
+	closest: function( selectors, context ) {
+		var cur,
+			i = 0,
+			l = this.length,
+			matched = [],
+			pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
+				jQuery( selectors, context || this.context ) :
+				0;
+
+		for ( ; i < l; i++ ) {
+			for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
+
+				// Always skip document fragments
+				if ( cur.nodeType < 11 && ( pos ?
+					pos.index( cur ) > -1 :
+
+					// Don't pass non-elements to Sizzle
+					cur.nodeType === 1 &&
+						jQuery.find.matchesSelector( cur, selectors ) ) ) {
+
+					matched.push( cur );
+					break;
+				}
+			}
+		}
+
+		return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
+	},
+
+	// Determine the position of an element within
+	// the matched set of elements
+	index: function( elem ) {
+
+		// No argument, return index in parent
+		if ( !elem ) {
+			return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
+		}
+
+		// index in selector
+		if ( typeof elem === "string" ) {
+			return jQuery.inArray( this[ 0 ], jQuery( elem ) );
+		}
+
+		// Locate the position of the desired element
+		return jQuery.inArray(
+
+			// If it receives a jQuery object, the first element is used
+			elem.jquery ? elem[ 0 ] : elem, this );
+	},
+
+	add: function( selector, context ) {
+		return this.pushStack(
+			jQuery.uniqueSort(
+				jQuery.merge( this.get(), jQuery( selector, context ) )
+			)
+		);
+	},
+
+	addBack: function( selector ) {
+		return this.add( selector == null ?
+			this.prevObject : this.prevObject.filter( selector )
+		);
+	}
+} );
+
+function sibling( cur, dir ) {
+	do {
+		cur = cur[ dir ];
+	} while ( cur && cur.nodeType !== 1 );
+
+	return cur;
+}
+
+jQuery.each( {
+	parent: function( elem ) {
+		var parent = elem.parentNode;
+		return parent && parent.nodeType !== 11 ? parent : null;
+	},
+	parents: function( elem ) {
+		return dir( elem, "parentNode" );
+	},
+	parentsUntil: function( elem, i, until ) {
+		return dir( elem, "parentNode", until );
+	},
+	next: function( elem ) {
+		return sibling( elem, "nextSibling" );
+	},
+	prev: function( elem ) {
+		return sibling( elem, "previousSibling" );
+	},
+	nextAll: function( elem ) {
+		return dir( elem, "nextSibling" );
+	},
+	prevAll: function( elem ) {
+		return dir( elem, "previousSibling" );
+	},
+	nextUntil: function( elem, i, until ) {
+		return dir( elem, "nextSibling", until );
+	},
+	prevUntil: function( elem, i, until ) {
+		return dir( elem, "previousSibling", until );
+	},
+	siblings: function( elem ) {
+		return siblings( ( elem.parentNode || {} ).firstChild, elem );
+	},
+	children: function( elem ) {
+		return siblings( elem.firstChild );
+	},
+	contents: function( elem ) {
+		return jQuery.nodeName( elem, "iframe" ) ?
+			elem.contentDocument || elem.contentWindow.document :
+			jQuery.merge( [], elem.childNodes );
+	}
+}, function( name, fn ) {
+	jQuery.fn[ name ] = function( until, selector ) {
+		var ret = jQuery.map( this, fn, until );
+
+		if ( name.slice( -5 ) !== "Until" ) {
+			selector = until;
+		}
+
+		if ( selector && typeof selector === "string" ) {
+			ret = jQuery.filter( selector, ret );
+		}
+
+		if ( this.length > 1 ) {
+
+			// Remove duplicates
+			if ( !guaranteedUnique[ name ] ) {
+				ret = jQuery.uniqueSort( ret );
+			}
+
+			// Reverse order for parents* and prev-derivatives
+			if ( rparentsprev.test( name ) ) {
+				ret = ret.reverse();
+			}
+		}
+
+		return this.pushStack( ret );
+	};
+} );
+var rnotwhite = ( /\S+/g );
+
+
+
+// Convert String-formatted options into Object-formatted ones
+function createOptions( options ) {
+	var object = {};
+	jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {
+		object[ flag ] = true;
+	} );
+	return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ *	options: an optional list of space-separated options that will change how
+ *			the callback list behaves or a more traditional option object
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible options:
+ *
+ *	once:			will ensure the callback list can only be fired once (like a Deferred)
+ *
+ *	memory:			will keep track of previous values and will call any callback added
+ *					after the list has been fired right away with the latest "memorized"
+ *					values (like a Deferred)
+ *
+ *	unique:			will ensure a callback can only be added once (no duplicate in the list)
+ *
+ *	stopOnFalse:	interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( options ) {
+
+	// Convert options from String-formatted to Object-formatted if needed
+	// (we check in cache first)
+	options = typeof options === "string" ?
+		createOptions( options ) :
+		jQuery.extend( {}, options );
+
+	var // Flag to know if list is currently firing
+		firing,
+
+		// Last fire value for non-forgettable lists
+		memory,
+
+		// Flag to know if list was already fired
+		fired,
+
+		// Flag to prevent firing
+		locked,
+
+		// Actual callback list
+		list = [],
+
+		// Queue of execution data for repeatable lists
+		queue = [],
+
+		// Index of currently firing callback (modified by add/remove as needed)
+		firingIndex = -1,
+
+		// Fire callbacks
+		fire = function() {
+
+			// Enforce single-firing
+			locked = options.once;
+
+			// Execute callbacks for all pending executions,
+			// respecting firingIndex overrides and runtime changes
+			fired = firing = true;
+			for ( ; queue.length; firingIndex = -1 ) {
+				memory = queue.shift();
+				while ( ++firingIndex < list.length ) {
+
+					// Run callback and check for early termination
+					if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
+						options.stopOnFalse ) {
+
+						// Jump to end and forget the data so .add doesn't re-fire
+						firingIndex = list.length;
+						memory = false;
+					}
+				}
+			}
+
+			// Forget the data if we're done with it
+			if ( !options.memory ) {
+				memory = false;
+			}
+
+			firing = false;
+
+			// Clean up if we're done firing for good
+			if ( locked ) {
+
+				// Keep an empty list if we have data for future add calls
+				if ( memory ) {
+					list = [];
+
+				// Otherwise, this object is spent
+				} else {
+					list = "";
+				}
+			}
+		},
+
+		// Actual Callbacks object
+		self = {
+
+			// Add a callback or a collection of callbacks to the list
+			add: function() {
+				if ( list ) {
+
+					// If we have memory from a past run, we should fire after adding
+					if ( memory && !firing ) {
+						firingIndex = list.length - 1;
+						queue.push( memory );
+					}
+
+					( function add( args ) {
+						jQuery.each( args, function( _, arg ) {
+							if ( jQuery.isFunction( arg ) ) {
+								if ( !options.unique || !self.has( arg ) ) {
+									list.push( arg );
+								}
+							} else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) {
+
+								// Inspect recursively
+								add( arg );
+							}
+						} );
+					} )( arguments );
+
+					if ( memory && !firing ) {
+						fire();
+					}
+				}
+				return this;
+			},
+
+			// Remove a callback from the list
+			remove: function() {
+				jQuery.each( arguments, function( _, arg ) {
+					var index;
+					while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+						list.splice( index, 1 );
+
+						// Handle firing indexes
+						if ( index <= firingIndex ) {
+							firingIndex--;
+						}
+					}
+				} );
+				return this;
+			},
+
+			// Check if a given callback is in the list.
+			// If no argument is given, return whether or not list has callbacks attached.
+			has: function( fn ) {
+				return fn ?
+					jQuery.inArray( fn, list ) > -1 :
+					list.length > 0;
+			},
+
+			// Remove all callbacks from the list
+			empty: function() {
+				if ( list ) {
+					list = [];
+				}
+				return this;
+			},
+
+			// Disable .fire and .add
+			// Abort any current/pending executions
+			// Clear all callbacks and values
+			disable: function() {
+				locked = queue = [];
+				list = memory = "";
+				return this;
+			},
+			disabled: function() {
+				return !list;
+			},
+
+			// Disable .fire
+			// Also disable .add unless we have memory (since it would have no effect)
+			// Abort any pending executions
+			lock: function() {
+				locked = true;
+				if ( !memory ) {
+					self.disable();
+				}
+				return this;
+			},
+			locked: function() {
+				return !!locked;
+			},
+
+			// Call all callbacks with the given context and arguments
+			fireWith: function( context, args ) {
+				if ( !locked ) {
+					args = args || [];
+					args = [ context, args.slice ? args.slice() : args ];
+					queue.push( args );
+					if ( !firing ) {
+						fire();
+					}
+				}
+				return this;
+			},
+
+			// Call all the callbacks with the given arguments
+			fire: function() {
+				self.fireWith( this, arguments );
+				return this;
+			},
+
+			// To know if the callbacks have already been called at least once
+			fired: function() {
+				return !!fired;
+			}
+		};
+
+	return self;
+};
+
+
+jQuery.extend( {
+
+	Deferred: function( func ) {
+		var tuples = [
+
+				// action, add listener, listener list, final state
+				[ "resolve", "done", jQuery.Callbacks( "once memory" ), "resolved" ],
+				[ "reject", "fail", jQuery.Callbacks( "once memory" ), "rejected" ],
+				[ "notify", "progress", jQuery.Callbacks( "memory" ) ]
+			],
+			state = "pending",
+			promise = {
+				state: function() {
+					return state;
+				},
+				always: function() {
+					deferred.done( arguments ).fail( arguments );
+					return this;
+				},
+				then: function( /* fnDone, fnFail, fnProgress */ ) {
+					var fns = arguments;
+					return jQuery.Deferred( function( newDefer ) {
+						jQuery.each( tuples, function( i, tuple ) {
+							var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
+
+							// deferred[ done | fail | progress ] for forwarding actions to newDefer
+							deferred[ tuple[ 1 ] ]( function() {
+								var returned = fn && fn.apply( this, arguments );
+								if ( returned && jQuery.isFunction( returned.promise ) ) {
+									returned.promise()
+										.progress( newDefer.notify )
+										.done( newDefer.resolve )
+										.fail( newDefer.reject );
+								} else {
+									newDefer[ tuple[ 0 ] + "With" ](
+										this === promise ? newDefer.promise() : this,
+										fn ? [ returned ] : arguments
+									);
+								}
+							} );
+						} );
+						fns = null;
+					} ).promise();
+				},
+
+				// Get a promise for this deferred
+				// If obj is provided, the promise aspect is added to the object
+				promise: function( obj ) {
+					return obj != null ? jQuery.extend( obj, promise ) : promise;
+				}
+			},
+			deferred = {};
+
+		// Keep pipe for back-compat
+		promise.pipe = promise.then;
+
+		// Add list-specific methods
+		jQuery.each( tuples, function( i, tuple ) {
+			var list = tuple[ 2 ],
+				stateString = tuple[ 3 ];
+
+			// promise[ done | fail | progress ] = list.add
+			promise[ tuple[ 1 ] ] = list.add;
+
+			// Handle state
+			if ( stateString ) {
+				list.add( function() {
+
+					// state = [ resolved | rejected ]
+					state = stateString;
+
+				// [ reject_list | resolve_list ].disable; progress_list.lock
+				}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
+			}
+
+			// deferred[ resolve | reject | notify ]
+			deferred[ tuple[ 0 ] ] = function() {
+				deferred[ tuple[ 0 ] + "With" ]( this === deferred ? promise : this, arguments );
+				return this;
+			};
+			deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
+		} );
+
+		// Make the deferred a promise
+		promise.promise( deferred );
+
+		// Call given func if any
+		if ( func ) {
+			func.call( deferred, deferred );
+		}
+
+		// All done!
+		return deferred;
+	},
+
+	// Deferred helper
+	when: function( subordinate /* , ..., subordinateN */ ) {
+		var i = 0,
+			resolveValues = slice.call( arguments ),
+			length = resolveValues.length,
+
+			// the count of uncompleted subordinates
+			remaining = length !== 1 ||
+				( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
+
+			// the master Deferred.
+			// If resolveValues consist of only a single Deferred, just use that.
+			deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
+
+			// Update function for both resolve and progress values
+			updateFunc = function( i, contexts, values ) {
+				return function( value ) {
+					contexts[ i ] = this;
+					values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
+					if ( values === progressValues ) {
+						deferred.notifyWith( contexts, values );
+
+					} else if ( !( --remaining ) ) {
+						deferred.resolveWith( contexts, values );
+					}
+				};
+			},
+
+			progressValues, progressContexts, resolveContexts;
+
+		// add listeners to Deferred subordinates; treat others as resolved
+		if ( length > 1 ) {
+			progressValues = new Array( length );
+			progressContexts = new Array( length );
+			resolveContexts = new Array( length );
+			for ( ; i < length; i++ ) {
+				if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
+					resolveValues[ i ].promise()
+						.progress( updateFunc( i, progressContexts, progressValues ) )
+						.done( updateFunc( i, resolveContexts, resolveValues ) )
+						.fail( deferred.reject );
+				} else {
+					--remaining;
+				}
+			}
+		}
+
+		// if we're not waiting on anything, resolve the master
+		if ( !remaining ) {
+			deferred.resolveWith( resolveContexts, resolveValues );
+		}
+
+		return deferred.promise();
+	}
+} );
+
+
+// The deferred used on DOM ready
+var readyList;
+
+jQuery.fn.ready = function( fn ) {
+
+	// Add the callback
+	jQuery.ready.promise().done( fn );
+
+	return this;
+};
+
+jQuery.extend( {
+
+	// Is the DOM ready to be used? Set to true once it occurs.
+	isReady: false,
+
+	// A counter to track how many items to wait for before
+	// the ready event fires. See #6781
+	readyWait: 1,
+
+	// Hold (or release) the ready event
+	holdReady: function( hold ) {
+		if ( hold ) {
+			jQuery.readyWait++;
+		} else {
+			jQuery.ready( true );
+		}
+	},
+
+	// Handle when the DOM is ready
+	ready: function( wait ) {
+
+		// Abort if there are pending holds or we're already ready
+		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+			return;
+		}
+
+		// Remember that the DOM is ready
+		jQuery.isReady = true;
+
+		// If a normal DOM Ready event fired, decrement, and wait if need be
+		if ( wait !== true && --jQuery.readyWait > 0 ) {
+			return;
+		}
+
+		// If there are functions bound, to execute
+		readyList.resolveWith( document, [ jQuery ] );
+
+		// Trigger any bound ready events
+		if ( jQuery.fn.triggerHandler ) {
+			jQuery( document ).triggerHandler( "ready" );
+			jQuery( document ).off( "ready" );
+		}
+	}
+} );
+
+/**
+ * Clean-up method for dom ready events
+ */
+function detach() {
+	if ( document.addEventListener ) {
+		document.removeEventListener( "DOMContentLoaded", completed );
+		window.removeEventListener( "load", completed );
+
+	} else {
+		document.detachEvent( "onreadystatechange", completed );
+		window.detachEvent( "onload", completed );
+	}
+}
+
+/**
+ * The ready event handler and self cleanup method
+ */
+function completed() {
+
+	// readyState === "complete" is good enough for us to call the dom ready in oldIE
+	if ( document.addEventListener ||
+		window.event.type === "load" ||
+		document.readyState === "complete" ) {
+
+		detach();
+		jQuery.ready();
+	}
+}
+
+jQuery.ready.promise = function( obj ) {
+	if ( !readyList ) {
+
+		readyList = jQuery.Deferred();
+
+		// Catch cases where $(document).ready() is called
+		// after the browser event has already occurred.
+		// Support: IE6-10
+		// Older IE sometimes signals "interactive" too soon
+		if ( document.readyState === "complete" ||
+			( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
+
+			// Handle it asynchronously to allow scripts the opportunity to delay ready
+			window.setTimeout( jQuery.ready );
+
+		// Standards-based browsers support DOMContentLoaded
+		} else if ( document.addEventListener ) {
+
+			// Use the handy event callback
+			document.addEventListener( "DOMContentLoaded", completed );
+
+			// A fallback to window.onload, that will always work
+			window.addEventListener( "load", completed );
+
+		// If IE event model is used
+		} else {
+
+			// Ensure firing before onload, maybe late but safe also for iframes
+			document.attachEvent( "onreadystatechange", completed );
+
+			// A fallback to window.onload, that will always work
+			window.attachEvent( "onload", completed );
+
+			// If IE and not a frame
+			// continually check to see if the document is ready
+			var top = false;
+
+			try {
+				top = window.frameElement == null && document.documentElement;
+			} catch ( e ) {}
+
+			if ( top && top.doScroll ) {
+				( function doScrollCheck() {
+					if ( !jQuery.isReady ) {
+
+						try {
+
+							// Use the trick by Diego Perini
+							// http://javascript.nwbox.com/IEContentLoaded/
+							top.doScroll( "left" );
+						} catch ( e ) {
+							return window.setTimeout( doScrollCheck, 50 );
+						}
+
+						// detach all dom ready events
+						detach();
+
+						// and execute any waiting functions
+						jQuery.ready();
+					}
+				} )();
+			}
+		}
+	}
+	return readyList.promise( obj );
+};
+
+// Kick off the DOM ready check even if the user does not
+jQuery.ready.promise();
+
+
+
+
+// Support: IE<9
+// Iteration over object's inherited properties before its own
+var i;
+for ( i in jQuery( support ) ) {
+	break;
+}
+support.ownFirst = i === "0";
+
+// Note: most support tests are defined in their respective modules.
+// false until the test is run
+support.inlineBlockNeedsLayout = false;
+
+// Execute ASAP in case we need to set body.style.zoom
+jQuery( function() {
+
+	// Minified: var a,b,c,d
+	var val, div, body, container;
+
+	body = document.getElementsByTagName( "body" )[ 0 ];
+	if ( !body || !body.style ) {
+
+		// Return for frameset docs that don't have a body
+		return;
+	}
+
+	// Setup
+	div = document.createElement( "div" );
+	container = document.createElement( "div" );
+	container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px";
+	body.appendChild( container ).appendChild( div );
+
+	if ( typeof div.style.zoom !== "undefined" ) {
+
+		// Support: IE<8
+		// Check if natively block-level elements act like inline-block
+		// elements when setting their display to 'inline' and giving
+		// them layout
+		div.style.cssText = "display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1";
+
+		support.inlineBlockNeedsLayout = val = div.offsetWidth === 3;
+		if ( val ) {
+
+			// Prevent IE 6 from affecting layout for positioned elements #11048
+			// Prevent IE from shrinking the body in IE 7 mode #12869
+			// Support: IE<8
+			body.style.zoom = 1;
+		}
+	}
+
+	body.removeChild( container );
+} );
+
+
+( function() {
+	var div = document.createElement( "div" );
+
+	// Support: IE<9
+	support.deleteExpando = true;
+	try {
+		delete div.test;
+	} catch ( e ) {
+		support.deleteExpando = false;
+	}
+
+	// Null elements to avoid leaks in IE.
+	div = null;
+} )();
+var acceptData = function( elem ) {
+	var noData = jQuery.noData[ ( elem.nodeName + " " ).toLowerCase() ],
+		nodeType = +elem.nodeType || 1;
+
+	// Do not set data on non-element DOM nodes because it will not be cleared (#8335).
+	return nodeType !== 1 && nodeType !== 9 ?
+		false :
+
+		// Nodes accept data unless otherwise specified; rejection can be conditional
+		!noData || noData !== true && elem.getAttribute( "classid" ) === noData;
+};
+
+
+
+
+var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
+	rmultiDash = /([A-Z])/g;
+
+function dataAttr( elem, key, data ) {
+
+	// If nothing was found internally, try to fetch any
+	// data from the HTML5 data-* attribute
+	if ( data === undefined && elem.nodeType === 1 ) {
+
+		var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
+
+		data = elem.getAttribute( name );
+
+		if ( typeof data === "string" ) {
+			try {
+				data = data === "true" ? true :
+					data === "false" ? false :
+					data === "null" ? null :
+
+					// Only convert to a number if it doesn't change the string
+					+data + "" === data ? +data :
+					rbrace.test( data ) ? jQuery.parseJSON( data ) :
+					data;
+			} catch ( e ) {}
+
+			// Make sure we set the data so it isn't changed later
+			jQuery.data( elem, key, data );
+
+		} else {
+			data = undefined;
+		}
+	}
+
+	return data;
+}
+
+// checks a cache object for emptiness
+function isEmptyDataObject( obj ) {
+	var name;
+	for ( name in obj ) {
+
+		// if the public data object is empty, the private is still empty
+		if ( name === "data" && jQuery.isEmptyObject( obj[ name ] ) ) {
+			continue;
+		}
+		if ( name !== "toJSON" ) {
+			return false;
+		}
+	}
+
+	return true;
+}
+
+function internalData( elem, name, data, pvt /* Internal Use Only */ ) {
+	if ( !acceptData( elem ) ) {
+		return;
+	}
+
+	var ret, thisCache,
+		internalKey = jQuery.expando,
+
+		// We have to handle DOM nodes and JS objects differently because IE6-7
+		// can't GC object references properly across the DOM-JS boundary
+		isNode = elem.nodeType,
+
+		// Only DOM nodes need the global jQuery cache; JS object data is
+		// attached directly to the object so GC can occur automatically
+		cache = isNode ? jQuery.cache : elem,
+
+		// Only defining an ID for JS objects if its cache already exists allows
+		// the code to shortcut on the same path as a DOM node with no cache
+		id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
+
+	// Avoid doing any more work than we need to when trying to get data on an
+	// object that has no data at all
+	if ( ( !id || !cache[ id ] || ( !pvt && !cache[ id ].data ) ) &&
+		data === undefined && typeof name === "string" ) {
+		return;
+	}
+
+	if ( !id ) {
+
+		// Only DOM nodes need a new unique ID for each element since their data
+		// ends up in the global cache
+		if ( isNode ) {
+			id = elem[ internalKey ] = deletedIds.pop() || jQuery.guid++;
+		} else {
+			id = internalKey;
+		}
+	}
+
+	if ( !cache[ id ] ) {
+
+		// Avoid exposing jQuery metadata on plain JS objects when the object
+		// is serialized using JSON.stringify
+		cache[ id ] = isNode ? {} : { toJSON: jQuery.noop };
+	}
+
+	// An object can be passed to jQuery.data instead of a key/value pair; this gets
+	// shallow copied over onto the existing cache
+	if ( typeof name === "object" || typeof name === "function" ) {
+		if ( pvt ) {
+			cache[ id ] = jQuery.extend( cache[ id ], name );
+		} else {
+			cache[ id ].data = jQuery.extend( cache[ id ].data, name );
+		}
+	}
+
+	thisCache = cache[ id ];
+
+	// jQuery data() is stored in a separate object inside the object's internal data
+	// cache in order to avoid key collisions between internal data and user-defined
+	// data.
+	if ( !pvt ) {
+		if ( !thisCache.data ) {
+			thisCache.data = {};
+		}
+
+		thisCache = thisCache.data;
+	}
+
+	if ( data !== undefined ) {
+		thisCache[ jQuery.camelCase( name ) ] = data;
+	}
+
+	// Check for both converted-to-camel and non-converted data property names
+	// If a data property was specified
+	if ( typeof name === "string" ) {
+
+		// First Try to find as-is property data
+		ret = thisCache[ name ];
+
+		// Test for null|undefined property data
+		if ( ret == null ) {
+
+			// Try to find the camelCased property
+			ret = thisCache[ jQuery.camelCase( name ) ];
+		}
+	} else {
+		ret = thisCache;
+	}
+
+	return ret;
+}
+
+function internalRemoveData( elem, name, pvt ) {
+	if ( !acceptData( elem ) ) {
+		return;
+	}
+
+	var thisCache, i,
+		isNode = elem.nodeType,
+
+		// See jQuery.data for more information
+		cache = isNode ? jQuery.cache : elem,
+		id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
+
+	// If there is already no cache entry for this object, there is no
+	// purpose in continuing
+	if ( !cache[ id ] ) {
+		return;
+	}
+
+	if ( name ) {
+
+		thisCache = pvt ? cache[ id ] : cache[ id ].data;
+
+		if ( thisCache ) {
+
+			// Support array or space separated string names for data keys
+			if ( !jQuery.isArray( name ) ) {
+
+				// try the string as a key before any manipulation
+				if ( name in thisCache ) {
+					name = [ name ];
+				} else {
+
+					// split the camel cased version by spaces unless a key with the spaces exists
+					name = jQuery.camelCase( name );
+					if ( name in thisCache ) {
+						name = [ name ];
+					} else {
+						name = name.split( " " );
+					}
+				}
+			} else {
+
+				// If "name" is an array of keys...
+				// When data is initially created, via ("key", "val") signature,
+				// keys will be converted to camelCase.
+				// Since there is no way to tell _how_ a key was added, remove
+				// both plain key and camelCase key. #12786
+				// This will only penalize the array argument path.
+				name = name.concat( jQuery.map( name, jQuery.camelCase ) );
+			}
+
+			i = name.length;
+			while ( i-- ) {
+				delete thisCache[ name[ i ] ];
+			}
+
+			// If there is no data left in the cache, we want to continue
+			// and let the cache object itself get destroyed
+			if ( pvt ? !isEmptyDataObject( thisCache ) : !jQuery.isEmptyObject( thisCache ) ) {
+				return;
+			}
+		}
+	}
+
+	// See jQuery.data for more information
+	if ( !pvt ) {
+		delete cache[ id ].data;
+
+		// Don't destroy the parent cache unless the internal data object
+		// had been the only thing left in it
+		if ( !isEmptyDataObject( cache[ id ] ) ) {
+			return;
+		}
+	}
+
+	// Destroy the cache
+	if ( isNode ) {
+		jQuery.cleanData( [ elem ], true );
+
+	// Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
+	/* jshint eqeqeq: false */
+	} else if ( support.deleteExpando || cache != cache.window ) {
+		/* jshint eqeqeq: true */
+		delete cache[ id ];
+
+	// When all else fails, undefined
+	} else {
+		cache[ id ] = undefined;
+	}
+}
+
+jQuery.extend( {
+	cache: {},
+
+	// The following elements (space-suffixed to avoid Object.prototype collisions)
+	// throw uncatchable exceptions if you attempt to set expando properties
+	noData: {
+		"applet ": true,
+		"embed ": true,
+
+		// ...but Flash objects (which have this classid) *can* handle expandos
+		"object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
+	},
+
+	hasData: function( elem ) {
+		elem = elem.nodeType ? jQuery.cache[ elem[ jQuery.expando ] ] : elem[ jQuery.expando ];
+		return !!elem && !isEmptyDataObject( elem );
+	},
+
+	data: function( elem, name, data ) {
+		return internalData( elem, name, data );
+	},
+
+	removeData: function( elem, name ) {
+		return internalRemoveData( elem, name );
+	},
+
+	// For internal use only.
+	_data: function( elem, name, data ) {
+		return internalData( elem, name, data, true );
+	},
+
+	_removeData: function( elem, name ) {
+		return internalRemoveData( elem, name, true );
+	}
+} );
+
+jQuery.fn.extend( {
+	data: function( key, value ) {
+		var i, name, data,
+			elem = this[ 0 ],
+			attrs = elem && elem.attributes;
+
+		// Special expections of .data basically thwart jQuery.access,
+		// so implement the relevant behavior ourselves
+
+		// Gets all values
+		if ( key === undefined ) {
+			if ( this.length ) {
+				data = jQuery.data( elem );
+
+				if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
+					i = attrs.length;
+					while ( i-- ) {
+
+						// Support: IE11+
+						// The attrs elements can be null (#14894)
+						if ( attrs[ i ] ) {
+							name = attrs[ i ].name;
+							if ( name.indexOf( "data-" ) === 0 ) {
+								name = jQuery.camelCase( name.slice( 5 ) );
+								dataAttr( elem, name, data[ name ] );
+							}
+						}
+					}
+					jQuery._data( elem, "parsedAttrs", true );
+				}
+			}
+
+			return data;
+		}
+
+		// Sets multiple values
+		if ( typeof key === "object" ) {
+			return this.each( function() {
+				jQuery.data( this, key );
+			} );
+		}
+
+		return arguments.length > 1 ?
+
+			// Sets one value
+			this.each( function() {
+				jQuery.data( this, key, value );
+			} ) :
+
+			// Gets one value
+			// Try to fetch any internally stored data first
+			elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : undefined;
+	},
+
+	removeData: function( key ) {
+		return this.each( function() {
+			jQuery.removeData( this, key );
+		} );
+	}
+} );
+
+
+jQuery.extend( {
+	queue: function( elem, type, data ) {
+		var queue;
+
+		if ( elem ) {
+			type = ( type || "fx" ) + "queue";
+			queue = jQuery._data( elem, type );
+
+			// Speed up dequeue by getting out quickly if this is just a lookup
+			if ( data ) {
+				if ( !queue || jQuery.isArray( data ) ) {
+					queue = jQuery._data( elem, type, jQuery.makeArray( data ) );
+				} else {
+					queue.push( data );
+				}
+			}
+			return queue || [];
+		}
+	},
+
+	dequeue: function( elem, type ) {
+		type = type || "fx";
+
+		var queue = jQuery.queue( elem, type ),
+			startLength = queue.length,
+			fn = queue.shift(),
+			hooks = jQuery._queueHooks( elem, type ),
+			next = function() {
+				jQuery.dequeue( elem, type );
+			};
+
+		// If the fx queue is dequeued, always remove the progress sentinel
+		if ( fn === "inprogress" ) {
+			fn = queue.shift();
+			startLength--;
+		}
+
+		if ( fn ) {
+
+			// Add a progress sentinel to prevent the fx queue from being
+			// automatically dequeued
+			if ( type === "fx" ) {
+				queue.unshift( "inprogress" );
+			}
+
+			// clear up the last queue stop function
+			delete hooks.stop;
+			fn.call( elem, next, hooks );
+		}
+
+		if ( !startLength && hooks ) {
+			hooks.empty.fire();
+		}
+	},
+
+	// not intended for public consumption - generates a queueHooks object,
+	// or returns the current one
+	_queueHooks: function( elem, type ) {
+		var key = type + "queueHooks";
+		return jQuery._data( elem, key ) || jQuery._data( elem, key, {
+			empty: jQuery.Callbacks( "once memory" ).add( function() {
+				jQuery._removeData( elem, type + "queue" );
+				jQuery._removeData( elem, key );
+			} )
+		} );
+	}
+} );
+
+jQuery.fn.extend( {
+	queue: function( type, data ) {
+		var setter = 2;
+
+		if ( typeof type !== "string" ) {
+			data = type;
+			type = "fx";
+			setter--;
+		}
+
+		if ( arguments.length < setter ) {
+			return jQuery.queue( this[ 0 ], type );
+		}
+
+		return data === undefined ?
+			this :
+			this.each( function() {
+				var queue = jQuery.queue( this, type, data );
+
+				// ensure a hooks for this queue
+				jQuery._queueHooks( this, type );
+
+				if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
+					jQuery.dequeue( this, type );
+				}
+			} );
+	},
+	dequeue: function( type ) {
+		return this.each( function() {
+			jQuery.dequeue( this, type );
+		} );
+	},
+	clearQueue: function( type ) {
+		return this.queue( type || "fx", [] );
+	},
+
+	// Get a promise resolved when queues of a certain type
+	// are emptied (fx is the type by default)
+	promise: function( type, obj ) {
+		var tmp,
+			count = 1,
+			defer = jQuery.Deferred(),
+			elements = this,
+			i = this.length,
+			resolve = function() {
+				if ( !( --count ) ) {
+					defer.resolveWith( elements, [ elements ] );
+				}
+			};
+
+		if ( typeof type !== "string" ) {
+			obj = type;
+			type = undefined;
+		}
+		type = type || "fx";
+
+		while ( i-- ) {
+			tmp = jQuery._data( elements[ i ], type + "queueHooks" );
+			if ( tmp && tmp.empty ) {
+				count++;
+				tmp.empty.add( resolve );
+			}
+		}
+		resolve();
+		return defer.promise( obj );
+	}
+} );
+
+
+( function() {
+	var shrinkWrapBlocksVal;
+
+	support.shrinkWrapBlocks = function() {
+		if ( shrinkWrapBlocksVal != null ) {
+			return shrinkWrapBlocksVal;
+		}
+
+		// Will be changed later if needed.
+		shrinkWrapBlocksVal = false;
+
+		// Minified: var b,c,d
+		var div, body, container;
+
+		body = document.getElementsByTagName( "body" )[ 0 ];
+		if ( !body || !body.style ) {
+
+			// Test fired too early or in an unsupported environment, exit.
+			return;
+		}
+
+		// Setup
+		div = document.createElement( "div" );
+		container = document.createElement( "div" );
+		container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px";
+		body.appendChild( container ).appendChild( div );
+
+		// Support: IE6
+		// Check if elements with layout shrink-wrap their children
+		if ( typeof div.style.zoom !== "undefined" ) {
+
+			// Reset CSS: box-sizing; display; margin; border
+			div.style.cssText =
+
+				// Support: Firefox<29, Android 2.3
+				// Vendor-prefix box-sizing
+				"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" +
+				"box-sizing:content-box;display:block;margin:0;border:0;" +
+				"padding:1px;width:1px;zoom:1";
+			div.appendChild( document.createElement( "div" ) ).style.width = "5px";
+			shrinkWrapBlocksVal = div.offsetWidth !== 3;
+		}
+
+		body.removeChild( container );
+
+		return shrinkWrapBlocksVal;
+	};
+
+} )();
+var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
+
+var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
+
+
+var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
+
+var isHidden = function( elem, el ) {
+
+		// isHidden might be called from jQuery#filter function;
+		// in that case, element will be second argument
+		elem = el || elem;
+		return jQuery.css( elem, "display" ) === "none" ||
+			!jQuery.contains( elem.ownerDocument, elem );
+	};
+
+
+
+function adjustCSS( elem, prop, valueParts, tween ) {
+	var adjusted,
+		scale = 1,
+		maxIterations = 20,
+		currentValue = tween ?
+			function() { return tween.cur(); } :
+			function() { return jQuery.css( elem, prop, "" ); },
+		initial = currentValue(),
+		unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
+
+		// Starting value computation is required for potential unit mismatches
+		initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
+			rcssNum.exec( jQuery.css( elem, prop ) );
+
+	if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
+
+		// Trust units reported by jQuery.css
+		unit = unit || initialInUnit[ 3 ];
+
+		// Make sure we update the tween properties later on
+		valueParts = valueParts || [];
+
+		// Iteratively approximate from a nonzero starting point
+		initialInUnit = +initial || 1;
+
+		do {
+
+			// If previous iteration zeroed out, double until we get *something*.
+			// Use string for doubling so we don't accidentally see scale as unchanged below
+			scale = scale || ".5";
+
+			// Adjust and apply
+			initialInUnit = initialInUnit / scale;
+			jQuery.style( elem, prop, initialInUnit + unit );
+
+		// Update scale, tolerating zero or NaN from tween.cur()
+		// Break the loop if scale is unchanged or perfect, or if we've just had enough.
+		} while (
+			scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations
+		);
+	}
+
+	if ( valueParts ) {
+		initialInUnit = +initialInUnit || +initial || 0;
+
+		// Apply relative offset (+=/-=) if specified
+		adjusted = valueParts[ 1 ] ?
+			initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
+			+valueParts[ 2 ];
+		if ( tween ) {
+			tween.unit = unit;
+			tween.start = initialInUnit;
+			tween.end = adjusted;
+		}
+	}
+	return adjusted;
+}
+
+
+// Multifunctional method to get and set values of a collection
+// The value/s can optionally be executed if it's a function
+var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
+	var i = 0,
+		length = elems.length,
+		bulk = key == null;
+
+	// Sets many values
+	if ( jQuery.type( key ) === "object" ) {
+		chainable = true;
+		for ( i in key ) {
+			access( elems, fn, i, key[ i ], true, emptyGet, raw );
+		}
+
+	// Sets one value
+	} else if ( value !== undefined ) {
+		chainable = true;
+
+		if ( !jQuery.isFunction( value ) ) {
+			raw = true;
+		}
+
+		if ( bulk ) {
+
+			// Bulk operations run against the entire set
+			if ( raw ) {
+				fn.call( elems, value );
+				fn = null;
+
+			// ...except when executing function values
+			} else {
+				bulk = fn;
+				fn = function( elem, key, value ) {
+					return bulk.call( jQuery( elem ), value );
+				};
+			}
+		}
+
+		if ( fn ) {
+			for ( ; i < length; i++ ) {
+				fn(
+					elems[ i ],
+					key,
+					raw ? value : value.call( elems[ i ], i, fn( elems[ i ], key ) )
+				);
+			}
+		}
+	}
+
+	return chainable ?
+		elems :
+
+		// Gets
+		bulk ?
+			fn.call( elems ) :
+			length ? fn( elems[ 0 ], key ) : emptyGet;
+};
+var rcheckableType = ( /^(?:checkbox|radio)$/i );
+
+var rtagName = ( /<([\w:-]+)/ );
+
+var rscriptType = ( /^$|\/(?:java|ecma)script/i );
+
+var rleadingWhitespace = ( /^\s+/ );
+
+var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|" +
+		"details|dialog|figcaption|figure|footer|header|hgroup|main|" +
+		"mark|meter|nav|output|picture|progress|section|summary|template|time|video";
+
+
+
+function createSafeFragment( document ) {
+	var list = nodeNames.split( "|" ),
+		safeFrag = document.createDocumentFragment();
+
+	if ( safeFrag.createElement ) {
+		while ( list.length ) {
+			safeFrag.createElement(
+				list.pop()
+			);
+		}
+	}
+	return safeFrag;
+}
+
+
+( function() {
+	var div = document.createElement( "div" ),
+		fragment = document.createDocumentFragment(),
+		input = document.createElement( "input" );
+
+	// Setup
+	div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
+
+	// IE strips leading whitespace when .innerHTML is used
+	support.leadingWhitespace = div.firstChild.nodeType === 3;
+
+	// Make sure that tbody elements aren't automatically inserted
+	// IE will insert them into empty tables
+	support.tbody = !div.getElementsByTagName( "tbody" ).length;
+
+	// Make sure that link elements get serialized correctly by innerHTML
+	// This requires a wrapper element in IE
+	support.htmlSerialize = !!div.getElementsByTagName( "link" ).length;
+
+	// Makes sure cloning an html5 element does not cause problems
+	// Where outerHTML is undefined, this still works
+	support.html5Clone =
+		document.createElement( "nav" ).cloneNode( true ).outerHTML !== "<:nav></:nav>";
+
+	// Check if a disconnected checkbox will retain its checked
+	// value of true after appended to the DOM (IE6/7)
+	input.type = "checkbox";
+	input.checked = true;
+	fragment.appendChild( input );
+	support.appendChecked = input.checked;
+
+	// Make sure textarea (and checkbox) defaultValue is properly cloned
+	// Support: IE6-IE11+
+	div.innerHTML = "<textarea>x</textarea>";
+	support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
+
+	// #11217 - WebKit loses check when the name is after the checked attribute
+	fragment.appendChild( div );
+
+	// Support: Windows Web Apps (WWA)
+	// `name` and `type` must use .setAttribute for WWA (#14901)
+	input = document.createElement( "input" );
+	input.setAttribute( "type", "radio" );
+	input.setAttribute( "checked", "checked" );
+	input.setAttribute( "name", "t" );
+
+	div.appendChild( input );
+
+	// Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3
+	// old WebKit doesn't clone checked state correctly in fragments
+	support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+	// Support: IE<9
+	// Cloned elements keep attachEvent handlers, we use addEventListener on IE9+
+	support.noCloneEvent = !!div.addEventListener;
+
+	// Support: IE<9
+	// Since attributes and properties are the same in IE,
+	// cleanData must set properties to undefined rather than use removeAttribute
+	div[ jQuery.expando ] = 1;
+	support.attributes = !div.getAttribute( jQuery.expando );
+} )();
+
+
+// We have to close these tags to support XHTML (#13200)
+var wrapMap = {
+	option: [ 1, "<select multiple='multiple'>", "</select>" ],
+	legend: [ 1, "<fieldset>", "</fieldset>" ],
+	area: [ 1, "<map>", "</map>" ],
+
+	// Support: IE8
+	param: [ 1, "<object>", "</object>" ],
+	thead: [ 1, "<table>", "</table>" ],
+	tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+	col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
+	td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+
+	// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
+	// unless wrapped in a div with non-breaking characters in front of it.
+	_default: support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X<div>", "</div>" ]
+};
+
+// Support: IE8-IE9
+wrapMap.optgroup = wrapMap.option;
+
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+
+function getAll( context, tag ) {
+	var elems, elem,
+		i = 0,
+		found = typeof context.getElementsByTagName !== "undefined" ?
+			context.getElementsByTagName( tag || "*" ) :
+			typeof context.querySelectorAll !== "undefined" ?
+				context.querySelectorAll( tag || "*" ) :
+				undefined;
+
+	if ( !found ) {
+		for ( found = [], elems = context.childNodes || context;
+			( elem = elems[ i ] ) != null;
+			i++
+		) {
+			if ( !tag || jQuery.nodeName( elem, tag ) ) {
+				found.push( elem );
+			} else {
+				jQuery.merge( found, getAll( elem, tag ) );
+			}
+		}
+	}
+
+	return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
+		jQuery.merge( [ context ], found ) :
+		found;
+}
+
+
+// Mark scripts as having already been evaluated
+function setGlobalEval( elems, refElements ) {
+	var elem,
+		i = 0;
+	for ( ; ( elem = elems[ i ] ) != null; i++ ) {
+		jQuery._data(
+			elem,
+			"globalEval",
+			!refElements || jQuery._data( refElements[ i ], "globalEval" )
+		);
+	}
+}
+
+
+var rhtml = /<|&#?\w+;/,
+	rtbody = /<tbody/i;
+
+function fixDefaultChecked( elem ) {
+	if ( rcheckableType.test( elem.type ) ) {
+		elem.defaultChecked = elem.checked;
+	}
+}
+
+function buildFragment( elems, context, scripts, selection, ignored ) {
+	var j, elem, contains,
+		tmp, tag, tbody, wrap,
+		l = elems.length,
+
+		// Ensure a safe fragment
+		safe = createSafeFragment( context ),
+
+		nodes = [],
+		i = 0;
+
+	for ( ; i < l; i++ ) {
+		elem = elems[ i ];
+
+		if ( elem || elem === 0 ) {
+
+			// Add nodes directly
+			if ( jQuery.type( elem ) === "object" ) {
+				jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
+
+			// Convert non-html into a text node
+			} else if ( !rhtml.test( elem ) ) {
+				nodes.push( context.createTextNode( elem ) );
+
+			// Convert html into DOM nodes
+			} else {
+				tmp = tmp || safe.appendChild( context.createElement( "div" ) );
+
+				// Deserialize a standard representation
+				tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
+				wrap = wrapMap[ tag ] || wrapMap._default;
+
+				tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
+
+				// Descend through wrappers to the right content
+				j = wrap[ 0 ];
+				while ( j-- ) {
+					tmp = tmp.lastChild;
+				}
+
+				// Manually add leading whitespace removed by IE
+				if ( !support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
+					nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[ 0 ] ) );
+				}
+
+				// Remove IE's autoinserted <tbody> from table fragments
+				if ( !support.tbody ) {
+
+					// String was a <table>, *may* have spurious <tbody>
+					elem = tag === "table" && !rtbody.test( elem ) ?
+						tmp.firstChild :
+
+						// String was a bare <thead> or <tfoot>
+						wrap[ 1 ] === "<table>" && !rtbody.test( elem ) ?
+							tmp :
+							0;
+
+					j = elem && elem.childNodes.length;
+					while ( j-- ) {
+						if ( jQuery.nodeName( ( tbody = elem.childNodes[ j ] ), "tbody" ) &&
+							!tbody.childNodes.length ) {
+
+							elem.removeChild( tbody );
+						}
+					}
+				}
+
+				jQuery.merge( nodes, tmp.childNodes );
+
+				// Fix #12392 for WebKit and IE > 9
+				tmp.textContent = "";
+
+				// Fix #12392 for oldIE
+				while ( tmp.firstChild ) {
+					tmp.removeChild( tmp.firstChild );
+				}
+
+				// Remember the top-level container for proper cleanup
+				tmp = safe.lastChild;
+			}
+		}
+	}
+
+	// Fix #11356: Clear elements from fragment
+	if ( tmp ) {
+		safe.removeChild( tmp );
+	}
+
+	// Reset defaultChecked for any radios and checkboxes
+	// about to be appended to the DOM in IE 6/7 (#8060)
+	if ( !support.appendChecked ) {
+		jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked );
+	}
+
+	i = 0;
+	while ( ( elem = nodes[ i++ ] ) ) {
+
+		// Skip elements already in the context collection (trac-4087)
+		if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
+			if ( ignored ) {
+				ignored.push( elem );
+			}
+
+			continue;
+		}
+
+		contains = jQuery.contains( elem.ownerDocument, elem );
+
+		// Append to fragment
+		tmp = getAll( safe.appendChild( elem ), "script" );
+
+		// Preserve script evaluation history
+		if ( contains ) {
+			setGlobalEval( tmp );
+		}
+
+		// Capture executables
+		if ( scripts ) {
+			j = 0;
+			while ( ( elem = tmp[ j++ ] ) ) {
+				if ( rscriptType.test( elem.type || "" ) ) {
+					scripts.push( elem );
+				}
+			}
+		}
+	}
+
+	tmp = null;
+
+	return safe;
+}
+
+
+( function() {
+	var i, eventName,
+		div = document.createElement( "div" );
+
+	// Support: IE<9 (lack submit/change bubble), Firefox (lack focus(in | out) events)
+	for ( i in { submit: true, change: true, focusin: true } ) {
+		eventName = "on" + i;
+
+		if ( !( support[ i ] = eventName in window ) ) {
+
+			// Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)
+			div.setAttribute( eventName, "t" );
+			support[ i ] = div.attributes[ eventName ].expando === false;
+		}
+	}
+
+	// Null elements to avoid leaks in IE.
+	div = null;
+} )();
+
+
+var rformElems = /^(?:input|select|textarea)$/i,
+	rkeyEvent = /^key/,
+	rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
+	rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+	rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
+
+function returnTrue() {
+	return true;
+}
+
+function returnFalse() {
+	return false;
+}
+
+// Support: IE9
+// See #13393 for more info
+function safeActiveElement() {
+	try {
+		return document.activeElement;
+	} catch ( err ) { }
+}
+
+function on( elem, types, selector, data, fn, one ) {
+	var origFn, type;
+
+	// Types can be a map of types/handlers
+	if ( typeof types === "object" ) {
+
+		// ( types-Object, selector, data )
+		if ( typeof selector !== "string" ) {
+
+			// ( types-Object, data )
+			data = data || selector;
+			selector = undefined;
+		}
+		for ( type in types ) {
+			on( elem, type, selector, data, types[ type ], one );
+		}
+		return elem;
+	}
+
+	if ( data == null && fn == null ) {
+
+		// ( types, fn )
+		fn = selector;
+		data = selector = undefined;
+	} else if ( fn == null ) {
+		if ( typeof selector === "string" ) {
+
+			// ( types, selector, fn )
+			fn = data;
+			data = undefined;
+		} else {
+
+			// ( types, data, fn )
+			fn = data;
+			data = selector;
+			selector = undefined;
+		}
+	}
+	if ( fn === false ) {
+		fn = returnFalse;
+	} else if ( !fn ) {
+		return elem;
+	}
+
+	if ( one === 1 ) {
+		origFn = fn;
+		fn = function( event ) {
+
+			// Can use an empty set, since event contains the info
+			jQuery().off( event );
+			return origFn.apply( this, arguments );
+		};
+
+		// Use same guid so caller can remove using origFn
+		fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+	}
+	return elem.each( function() {
+		jQuery.event.add( this, types, fn, data, selector );
+	} );
+}
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+	global: {},
+
+	add: function( elem, types, handler, data, selector ) {
+		var tmp, events, t, handleObjIn,
+			special, eventHandle, handleObj,
+			handlers, type, namespaces, origType,
+			elemData = jQuery._data( elem );
+
+		// Don't attach events to noData or text/comment nodes (but allow plain objects)
+		if ( !elemData ) {
+			return;
+		}
+
+		// Caller can pass in an object of custom data in lieu of the handler
+		if ( handler.handler ) {
+			handleObjIn = handler;
+			handler = handleObjIn.handler;
+			selector = handleObjIn.selector;
+		}
+
+		// Make sure that the handler has a unique ID, used to find/remove it later
+		if ( !handler.guid ) {
+			handler.guid = jQuery.guid++;
+		}
+
+		// Init the element's event structure and main handler, if this is the first
+		if ( !( events = elemData.events ) ) {
+			events = elemData.events = {};
+		}
+		if ( !( eventHandle = elemData.handle ) ) {
+			eventHandle = elemData.handle = function( e ) {
+
+				// Discard the second event of a jQuery.event.trigger() and
+				// when an event is called after a page has unloaded
+				return typeof jQuery !== "undefined" &&
+					( !e || jQuery.event.triggered !== e.type ) ?
+					jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
+					undefined;
+			};
+
+			// Add elem as a property of the handle fn to prevent a memory leak
+			// with IE non-native events
+			eventHandle.elem = elem;
+		}
+
+		// Handle multiple events separated by a space
+		types = ( types || "" ).match( rnotwhite ) || [ "" ];
+		t = types.length;
+		while ( t-- ) {
+			tmp = rtypenamespace.exec( types[ t ] ) || [];
+			type = origType = tmp[ 1 ];
+			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
+
+			// There *must* be a type, no attaching namespace-only handlers
+			if ( !type ) {
+				continue;
+			}
+
+			// If event changes its type, use the special event handlers for the changed type
+			special = jQuery.event.special[ type ] || {};
+
+			// If selector defined, determine special event api type, otherwise given type
+			type = ( selector ? special.delegateType : special.bindType ) || type;
+
+			// Update special based on newly reset type
+			special = jQuery.event.special[ type ] || {};
+
+			// handleObj is passed to all event handlers
+			handleObj = jQuery.extend( {
+				type: type,
+				origType: origType,
+				data: data,
+				handler: handler,
+				guid: handler.guid,
+				selector: selector,
+				needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
+				namespace: namespaces.join( "." )
+			}, handleObjIn );
+
+			// Init the event handler queue if we're the first
+			if ( !( handlers = events[ type ] ) ) {
+				handlers = events[ type ] = [];
+				handlers.delegateCount = 0;
+
+				// Only use addEventListener/attachEvent if the special events handler returns false
+				if ( !special.setup ||
+					special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+
+					// Bind the global event handler to the element
+					if ( elem.addEventListener ) {
+						elem.addEventListener( type, eventHandle, false );
+
+					} else if ( elem.attachEvent ) {
+						elem.attachEvent( "on" + type, eventHandle );
+					}
+				}
+			}
+
+			if ( special.add ) {
+				special.add.call( elem, handleObj );
+
+				if ( !handleObj.handler.guid ) {
+					handleObj.handler.guid = handler.guid;
+				}
+			}
+
+			// Add to the element's handler list, delegates in front
+			if ( selector ) {
+				handlers.splice( handlers.delegateCount++, 0, handleObj );
+			} else {
+				handlers.push( handleObj );
+			}
+
+			// Keep track of which events have ever been used, for event optimization
+			jQuery.event.global[ type ] = true;
+		}
+
+		// Nullify elem to prevent memory leaks in IE
+		elem = null;
+	},
+
+	// Detach an event or set of events from an element
+	remove: function( elem, types, handler, selector, mappedTypes ) {
+		var j, handleObj, tmp,
+			origCount, t, events,
+			special, handlers, type,
+			namespaces, origType,
+			elemData = jQuery.hasData( elem ) && jQuery._data( elem );
+
+		if ( !elemData || !( events = elemData.events ) ) {
+			return;
+		}
+
+		// Once for each type.namespace in types; type may be omitted
+		types = ( types || "" ).match( rnotwhite ) || [ "" ];
+		t = types.length;
+		while ( t-- ) {
+			tmp = rtypenamespace.exec( types[ t ] ) || [];
+			type = origType = tmp[ 1 ];
+			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
+
+			// Unbind all events (on this namespace, if provided) for the element
+			if ( !type ) {
+				for ( type in events ) {
+					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+				}
+				continue;
+			}
+
+			special = jQuery.event.special[ type ] || {};
+			type = ( selector ? special.delegateType : special.bindType ) || type;
+			handlers = events[ type ] || [];
+			tmp = tmp[ 2 ] &&
+				new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
+
+			// Remove matching events
+			origCount = j = handlers.length;
+			while ( j-- ) {
+				handleObj = handlers[ j ];
+
+				if ( ( mappedTypes || origType === handleObj.origType ) &&
+					( !handler || handler.guid === handleObj.guid ) &&
+					( !tmp || tmp.test( handleObj.namespace ) ) &&
+					( !selector || selector === handleObj.selector ||
+						selector === "**" && handleObj.selector ) ) {
+					handlers.splice( j, 1 );
+
+					if ( handleObj.selector ) {
+						handlers.delegateCount--;
+					}
+					if ( special.remove ) {
+						special.remove.call( elem, handleObj );
+					}
+				}
+			}
+
+			// Remove generic event handler if we removed something and no more handlers exist
+			// (avoids potential for endless recursion during removal of special event handlers)
+			if ( origCount && !handlers.length ) {
+				if ( !special.teardown ||
+					special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
+
+					jQuery.removeEvent( elem, type, elemData.handle );
+				}
+
+				delete events[ type ];
+			}
+		}
+
+		// Remove the expando if it's no longer used
+		if ( jQuery.isEmptyObject( events ) ) {
+			delete elemData.handle;
+
+			// removeData also checks for emptiness and clears the expando if empty
+			// so use it instead of delete
+			jQuery._removeData( elem, "events" );
+		}
+	},
+
+	trigger: function( event, data, elem, onlyHandlers ) {
+		var handle, ontype, cur,
+			bubbleType, special, tmp, i,
+			eventPath = [ elem || document ],
+			type = hasOwn.call( event, "type" ) ? event.type : event,
+			namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
+
+		cur = tmp = elem = elem || document;
+
+		// Don't do events on text and comment nodes
+		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+			return;
+		}
+
+		// focus/blur morphs to focusin/out; ensure we're not firing them right now
+		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+			return;
+		}
+
+		if ( type.indexOf( "." ) > -1 ) {
+
+			// Namespaced trigger; create a regexp to match event type in handle()
+			namespaces = type.split( "." );
+			type = namespaces.shift();
+			namespaces.sort();
+		}
+		ontype = type.indexOf( ":" ) < 0 && "on" + type;
+
+		// Caller can pass in a jQuery.Event object, Object, or just an event type string
+		event = event[ jQuery.expando ] ?
+			event :
+			new jQuery.Event( type, typeof event === "object" && event );
+
+		// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
+		event.isTrigger = onlyHandlers ? 2 : 3;
+		event.namespace = namespaces.join( "." );
+		event.rnamespace = event.namespace ?
+			new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
+			null;
+
+		// Clean up the event in case it is being reused
+		event.result = undefined;
+		if ( !event.target ) {
+			event.target = elem;
+		}
+
+		// Clone any incoming data and prepend the event, creating the handler arg list
+		data = data == null ?
+			[ event ] :
+			jQuery.makeArray( data, [ event ] );
+
+		// Allow special events to draw outside the lines
+		special = jQuery.event.special[ type ] || {};
+		if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
+			return;
+		}
+
+		// Determine event propagation path in advance, per W3C events spec (#9951)
+		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+		if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+
+			bubbleType = special.delegateType || type;
+			if ( !rfocusMorph.test( bubbleType + type ) ) {
+				cur = cur.parentNode;
+			}
+			for ( ; cur; cur = cur.parentNode ) {
+				eventPath.push( cur );
+				tmp = cur;
+			}
+
+			// Only add window if we got to document (e.g., not plain obj or detached DOM)
+			if ( tmp === ( elem.ownerDocument || document ) ) {
+				eventPath.push( tmp.defaultView || tmp.parentWindow || window );
+			}
+		}
+
+		// Fire handlers on the event path
+		i = 0;
+		while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
+
+			event.type = i > 1 ?
+				bubbleType :
+				special.bindType || type;
+
+			// jQuery handler
+			handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] &&
+				jQuery._data( cur, "handle" );
+
+			if ( handle ) {
+				handle.apply( cur, data );
+			}
+
+			// Native handler
+			handle = ontype && cur[ ontype ];
+			if ( handle && handle.apply && acceptData( cur ) ) {
+				event.result = handle.apply( cur, data );
+				if ( event.result === false ) {
+					event.preventDefault();
+				}
+			}
+		}
+		event.type = type;
+
+		// If nobody prevented the default action, do it now
+		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+
+			if (
+				( !special._default ||
+				 special._default.apply( eventPath.pop(), data ) === false
+				) && acceptData( elem )
+			) {
+
+				// Call a native DOM method on the target with the same name name as the event.
+				// Can't use an .isFunction() check here because IE6/7 fails that test.
+				// Don't do default actions on window, that's where global variables be (#6170)
+				if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {
+
+					// Don't re-trigger an onFOO event when we call its FOO() method
+					tmp = elem[ ontype ];
+
+					if ( tmp ) {
+						elem[ ontype ] = null;
+					}
+
+					// Prevent re-triggering of the same event, since we already bubbled it above
+					jQuery.event.triggered = type;
+					try {
+						elem[ type ]();
+					} catch ( e ) {
+
+						// IE<9 dies on focus/blur to hidden element (#1486,#12518)
+						// only reproducible on winXP IE8 native, not IE9 in IE8 mode
+					}
+					jQuery.event.triggered = undefined;
+
+					if ( tmp ) {
+						elem[ ontype ] = tmp;
+					}
+				}
+			}
+		}
+
+		return event.result;
+	},
+
+	dispatch: function( event ) {
+
+		// Make a writable jQuery.Event from the native event object
+		event = jQuery.event.fix( event );
+
+		var i, j, ret, matched, handleObj,
+			handlerQueue = [],
+			args = slice.call( arguments ),
+			handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [],
+			special = jQuery.event.special[ event.type ] || {};
+
+		// Use the fix-ed jQuery.Event rather than the (read-only) native event
+		args[ 0 ] = event;
+		event.delegateTarget = this;
+
+		// Call the preDispatch hook for the mapped type, and let it bail if desired
+		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+			return;
+		}
+
+		// Determine handlers
+		handlerQueue = jQuery.event.handlers.call( this, event, handlers );
+
+		// Run delegates first; they may want to stop propagation beneath us
+		i = 0;
+		while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
+			event.currentTarget = matched.elem;
+
+			j = 0;
+			while ( ( handleObj = matched.handlers[ j++ ] ) &&
+				!event.isImmediatePropagationStopped() ) {
+
+				// Triggered event must either 1) have no namespace, or 2) have namespace(s)
+				// a subset or equal to those in the bound event (both can have no namespace).
+				if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {
+
+					event.handleObj = handleObj;
+					event.data = handleObj.data;
+
+					ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
+						handleObj.handler ).apply( matched.elem, args );
+
+					if ( ret !== undefined ) {
+						if ( ( event.result = ret ) === false ) {
+							event.preventDefault();
+							event.stopPropagation();
+						}
+					}
+				}
+			}
+		}
+
+		// Call the postDispatch hook for the mapped type
+		if ( special.postDispatch ) {
+			special.postDispatch.call( this, event );
+		}
+
+		return event.result;
+	},
+
+	handlers: function( event, handlers ) {
+		var i, matches, sel, handleObj,
+			handlerQueue = [],
+			delegateCount = handlers.delegateCount,
+			cur = event.target;
+
+		// Support (at least): Chrome, IE9
+		// Find delegate handlers
+		// Black-hole SVG <use> instance trees (#13180)
+		//
+		// Support: Firefox<=42+
+		// Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343)
+		if ( delegateCount && cur.nodeType &&
+			( event.type !== "click" || isNaN( event.button ) || event.button < 1 ) ) {
+
+			/* jshint eqeqeq: false */
+			for ( ; cur != this; cur = cur.parentNode || this ) {
+				/* jshint eqeqeq: true */
+
+				// Don't check non-elements (#13208)
+				// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
+				if ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== "click" ) ) {
+					matches = [];
+					for ( i = 0; i < delegateCount; i++ ) {
+						handleObj = handlers[ i ];
+
+						// Don't conflict with Object.prototype properties (#13203)
+						sel = handleObj.selector + " ";
+
+						if ( matches[ sel ] === undefined ) {
+							matches[ sel ] = handleObj.needsContext ?
+								jQuery( sel, this ).index( cur ) > -1 :
+								jQuery.find( sel, this, null, [ cur ] ).length;
+						}
+						if ( matches[ sel ] ) {
+							matches.push( handleObj );
+						}
+					}
+					if ( matches.length ) {
+						handlerQueue.push( { elem: cur, handlers: matches } );
+					}
+				}
+			}
+		}
+
+		// Add the remaining (directly-bound) handlers
+		if ( delegateCount < handlers.length ) {
+			handlerQueue.push( { elem: this, handlers: handlers.slice( delegateCount ) } );
+		}
+
+		return handlerQueue;
+	},
+
+	fix: function( event ) {
+		if ( event[ jQuery.expando ] ) {
+			return event;
+		}
+
+		// Create a writable copy of the event object and normalize some properties
+		var i, prop, copy,
+			type = event.type,
+			originalEvent = event,
+			fixHook = this.fixHooks[ type ];
+
+		if ( !fixHook ) {
+			this.fixHooks[ type ] = fixHook =
+				rmouseEvent.test( type ) ? this.mouseHooks :
+				rkeyEvent.test( type ) ? this.keyHooks :
+				{};
+		}
+		copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
+
+		event = new jQuery.Event( originalEvent );
+
+		i = copy.length;
+		while ( i-- ) {
+			prop = copy[ i ];
+			event[ prop ] = originalEvent[ prop ];
+		}
+
+		// Support: IE<9
+		// Fix target property (#1925)
+		if ( !event.target ) {
+			event.target = originalEvent.srcElement || document;
+		}
+
+		// Support: Safari 6-8+
+		// Target should not be a text node (#504, #13143)
+		if ( event.target.nodeType === 3 ) {
+			event.target = event.target.parentNode;
+		}
+
+		// Support: IE<9
+		// For mouse/key events, metaKey==false if it's undefined (#3368, #11328)
+		event.metaKey = !!event.metaKey;
+
+		return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
+	},
+
+	// Includes some event props shared by KeyEvent and MouseEvent
+	props: ( "altKey bubbles cancelable ctrlKey currentTarget detail eventPhase " +
+		"metaKey relatedTarget shiftKey target timeStamp view which" ).split( " " ),
+
+	fixHooks: {},
+
+	keyHooks: {
+		props: "char charCode key keyCode".split( " " ),
+		filter: function( event, original ) {
+
+			// Add which for key events
+			if ( event.which == null ) {
+				event.which = original.charCode != null ? original.charCode : original.keyCode;
+			}
+
+			return event;
+		}
+	},
+
+	mouseHooks: {
+		props: ( "button buttons clientX clientY fromElement offsetX offsetY " +
+			"pageX pageY screenX screenY toElement" ).split( " " ),
+		filter: function( event, original ) {
+			var body, eventDoc, doc,
+				button = original.button,
+				fromElement = original.fromElement;
+
+			// Calculate pageX/Y if missing and clientX/Y available
+			if ( event.pageX == null && original.clientX != null ) {
+				eventDoc = event.target.ownerDocument || document;
+				doc = eventDoc.documentElement;
+				body = eventDoc.body;
+
+				event.pageX = original.clientX +
+					( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) -
+					( doc && doc.clientLeft || body && body.clientLeft || 0 );
+				event.pageY = original.clientY +
+					( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) -
+					( doc && doc.clientTop  || body && body.clientTop  || 0 );
+			}
+
+			// Add relatedTarget, if necessary
+			if ( !event.relatedTarget && fromElement ) {
+				event.relatedTarget = fromElement === event.target ?
+					original.toElement :
+					fromElement;
+			}
+
+			// Add which for click: 1 === left; 2 === middle; 3 === right
+			// Note: button is not normalized, so don't use it
+			if ( !event.which && button !== undefined ) {
+				event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
+			}
+
+			return event;
+		}
+	},
+
+	special: {
+		load: {
+
+			// Prevent triggered image.load events from bubbling to window.load
+			noBubble: true
+		},
+		focus: {
+
+			// Fire native event if possible so blur/focus sequence is correct
+			trigger: function() {
+				if ( this !== safeActiveElement() && this.focus ) {
+					try {
+						this.focus();
+						return false;
+					} catch ( e ) {
+
+						// Support: IE<9
+						// If we error on focus to hidden element (#1486, #12518),
+						// let .trigger() run the handlers
+					}
+				}
+			},
+			delegateType: "focusin"
+		},
+		blur: {
+			trigger: function() {
+				if ( this === safeActiveElement() && this.blur ) {
+					this.blur();
+					return false;
+				}
+			},
+			delegateType: "focusout"
+		},
+		click: {
+
+			// For checkbox, fire native event so checked state will be right
+			trigger: function() {
+				if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) {
+					this.click();
+					return false;
+				}
+			},
+
+			// For cross-browser consistency, don't fire native .click() on links
+			_default: function( event ) {
+				return jQuery.nodeName( event.target, "a" );
+			}
+		},
+
+		beforeunload: {
+			postDispatch: function( event ) {
+
+				// Support: Firefox 20+
+				// Firefox doesn't alert if the returnValue field is not set.
+				if ( event.result !== undefined && event.originalEvent ) {
+					event.originalEvent.returnValue = event.result;
+				}
+			}
+		}
+	},
+
+	// Piggyback on a donor event to simulate a different one
+	simulate: function( type, elem, event ) {
+		var e = jQuery.extend(
+			new jQuery.Event(),
+			event,
+			{
+				type: type,
+				isSimulated: true
+
+				// Previously, `originalEvent: {}` was set here, so stopPropagation call
+				// would not be triggered on donor event, since in our own
+				// jQuery.event.stopPropagation function we had a check for existence of
+				// originalEvent.stopPropagation method, so, consequently it would be a noop.
+				//
+				// Guard for simulated events was moved to jQuery.event.stopPropagation function
+				// since `originalEvent` should point to the original event for the
+				// constancy with other events and for more focused logic
+			}
+		);
+
+		jQuery.event.trigger( e, null, elem );
+
+		if ( e.isDefaultPrevented() ) {
+			event.preventDefault();
+		}
+	}
+};
+
+jQuery.removeEvent = document.removeEventListener ?
+	function( elem, type, handle ) {
+
+		// This "if" is needed for plain objects
+		if ( elem.removeEventListener ) {
+			elem.removeEventListener( type, handle );
+		}
+	} :
+	function( elem, type, handle ) {
+		var name = "on" + type;
+
+		if ( elem.detachEvent ) {
+
+			// #8545, #7054, preventing memory leaks for custom events in IE6-8
+			// detachEvent needed property on element, by name of that event,
+			// to properly expose it to GC
+			if ( typeof elem[ name ] === "undefined" ) {
+				elem[ name ] = null;
+			}
+
+			elem.detachEvent( name, handle );
+		}
+	};
+
+jQuery.Event = function( src, props ) {
+
+	// Allow instantiation without the 'new' keyword
+	if ( !( this instanceof jQuery.Event ) ) {
+		return new jQuery.Event( src, props );
+	}
+
+	// Event object
+	if ( src && src.type ) {
+		this.originalEvent = src;
+		this.type = src.type;
+
+		// Events bubbling up the document may have been marked as prevented
+		// by a handler lower down the tree; reflect the correct value.
+		this.isDefaultPrevented = src.defaultPrevented ||
+				src.defaultPrevented === undefined &&
+
+				// Support: IE < 9, Android < 4.0
+				src.returnValue === false ?
+			returnTrue :
+			returnFalse;
+
+	// Event type
+	} else {
+		this.type = src;
+	}
+
+	// Put explicitly provided properties onto the event object
+	if ( props ) {
+		jQuery.extend( this, props );
+	}
+
+	// Create a timestamp if incoming event doesn't have one
+	this.timeStamp = src && src.timeStamp || jQuery.now();
+
+	// Mark it as fixed
+	this[ jQuery.expando ] = true;
+};
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+	constructor: jQuery.Event,
+	isDefaultPrevented: returnFalse,
+	isPropagationStopped: returnFalse,
+	isImmediatePropagationStopped: returnFalse,
+
+	preventDefault: function() {
+		var e = this.originalEvent;
+
+		this.isDefaultPrevented = returnTrue;
+		if ( !e ) {
+			return;
+		}
+
+		// If preventDefault exists, run it on the original event
+		if ( e.preventDefault ) {
+			e.preventDefault();
+
+		// Support: IE
+		// Otherwise set the returnValue property of the original event to false
+		} else {
+			e.returnValue = false;
+		}
+	},
+	stopPropagation: function() {
+		var e = this.originalEvent;
+
+		this.isPropagationStopped = returnTrue;
+
+		if ( !e || this.isSimulated ) {
+			return;
+		}
+
+		// If stopPropagation exists, run it on the original event
+		if ( e.stopPropagation ) {
+			e.stopPropagation();
+		}
+
+		// Support: IE
+		// Set the cancelBubble property of the original event to true
+		e.cancelBubble = true;
+	},
+	stopImmediatePropagation: function() {
+		var e = this.originalEvent;
+
+		this.isImmediatePropagationStopped = returnTrue;
+
+		if ( e && e.stopImmediatePropagation ) {
+			e.stopImmediatePropagation();
+		}
+
+		this.stopPropagation();
+	}
+};
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+// so that event delegation works in jQuery.
+// Do the same for pointerenter/pointerleave and pointerover/pointerout
+//
+// Support: Safari 7 only
+// Safari sends mouseenter too often; see:
+// https://code.google.com/p/chromium/issues/detail?id=470258
+// for the description of the bug (it existed in older Chrome versions as well).
+jQuery.each( {
+	mouseenter: "mouseover",
+	mouseleave: "mouseout",
+	pointerenter: "pointerover",
+	pointerleave: "pointerout"
+}, function( orig, fix ) {
+	jQuery.event.special[ orig ] = {
+		delegateType: fix,
+		bindType: fix,
+
+		handle: function( event ) {
+			var ret,
+				target = this,
+				related = event.relatedTarget,
+				handleObj = event.handleObj;
+
+			// For mouseenter/leave call the handler if related is outside the target.
+			// NB: No relatedTarget if the mouse left/entered the browser window
+			if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
+				event.type = handleObj.origType;
+				ret = handleObj.handler.apply( this, arguments );
+				event.type = fix;
+			}
+			return ret;
+		}
+	};
+} );
+
+// IE submit delegation
+if ( !support.submit ) {
+
+	jQuery.event.special.submit = {
+		setup: function() {
+
+			// Only need this for delegated form submit events
+			if ( jQuery.nodeName( this, "form" ) ) {
+				return false;
+			}
+
+			// Lazy-add a submit handler when a descendant form may potentially be submitted
+			jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
+
+				// Node name check avoids a VML-related crash in IE (#9807)
+				var elem = e.target,
+					form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ?
+
+						// Support: IE <=8
+						// We use jQuery.prop instead of elem.form
+						// to allow fixing the IE8 delegated submit issue (gh-2332)
+						// by 3rd party polyfills/workarounds.
+						jQuery.prop( elem, "form" ) :
+						undefined;
+
+				if ( form && !jQuery._data( form, "submit" ) ) {
+					jQuery.event.add( form, "submit._submit", function( event ) {
+						event._submitBubble = true;
+					} );
+					jQuery._data( form, "submit", true );
+				}
+			} );
+
+			// return undefined since we don't need an event listener
+		},
+
+		postDispatch: function( event ) {
+
+			// If form was submitted by the user, bubble the event up the tree
+			if ( event._submitBubble ) {
+				delete event._submitBubble;
+				if ( this.parentNode && !event.isTrigger ) {
+					jQuery.event.simulate( "submit", this.parentNode, event );
+				}
+			}
+		},
+
+		teardown: function() {
+
+			// Only need this for delegated form submit events
+			if ( jQuery.nodeName( this, "form" ) ) {
+				return false;
+			}
+
+			// Remove delegated handlers; cleanData eventually reaps submit handlers attached above
+			jQuery.event.remove( this, "._submit" );
+		}
+	};
+}
+
+// IE change delegation and checkbox/radio fix
+if ( !support.change ) {
+
+	jQuery.event.special.change = {
+
+		setup: function() {
+
+			if ( rformElems.test( this.nodeName ) ) {
+
+				// IE doesn't fire change on a check/radio until blur; trigger it on click
+				// after a propertychange. Eat the blur-change in special.change.handle.
+				// This still fires onchange a second time for check/radio after blur.
+				if ( this.type === "checkbox" || this.type === "radio" ) {
+					jQuery.event.add( this, "propertychange._change", function( event ) {
+						if ( event.originalEvent.propertyName === "checked" ) {
+							this._justChanged = true;
+						}
+					} );
+					jQuery.event.add( this, "click._change", function( event ) {
+						if ( this._justChanged && !event.isTrigger ) {
+							this._justChanged = false;
+						}
+
+						// Allow triggered, simulated change events (#11500)
+						jQuery.event.simulate( "change", this, event );
+					} );
+				}
+				return false;
+			}
+
+			// Delegated event; lazy-add a change handler on descendant inputs
+			jQuery.event.add( this, "beforeactivate._change", function( e ) {
+				var elem = e.target;
+
+				if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "change" ) ) {
+					jQuery.event.add( elem, "change._change", function( event ) {
+						if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
+							jQuery.event.simulate( "change", this.parentNode, event );
+						}
+					} );
+					jQuery._data( elem, "change", true );
+				}
+			} );
+		},
+
+		handle: function( event ) {
+			var elem = event.target;
+
+			// Swallow native change events from checkbox/radio, we already triggered them above
+			if ( this !== elem || event.isSimulated || event.isTrigger ||
+				( elem.type !== "radio" && elem.type !== "checkbox" ) ) {
+
+				return event.handleObj.handler.apply( this, arguments );
+			}
+		},
+
+		teardown: function() {
+			jQuery.event.remove( this, "._change" );
+
+			return !rformElems.test( this.nodeName );
+		}
+	};
+}
+
+// Support: Firefox
+// Firefox doesn't have focus(in | out) events
+// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
+//
+// Support: Chrome, Safari
+// focus(in | out) events fire after focus & blur events,
+// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
+// Related ticket - https://code.google.com/p/chromium/issues/detail?id=449857
+if ( !support.focusin ) {
+	jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+		// Attach a single capturing handler on the document while someone wants focusin/focusout
+		var handler = function( event ) {
+			jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
+		};
+
+		jQuery.event.special[ fix ] = {
+			setup: function() {
+				var doc = this.ownerDocument || this,
+					attaches = jQuery._data( doc, fix );
+
+				if ( !attaches ) {
+					doc.addEventListener( orig, handler, true );
+				}
+				jQuery._data( doc, fix, ( attaches || 0 ) + 1 );
+			},
+			teardown: function() {
+				var doc = this.ownerDocument || this,
+					attaches = jQuery._data( doc, fix ) - 1;
+
+				if ( !attaches ) {
+					doc.removeEventListener( orig, handler, true );
+					jQuery._removeData( doc, fix );
+				} else {
+					jQuery._data( doc, fix, attaches );
+				}
+			}
+		};
+	} );
+}
+
+jQuery.fn.extend( {
+
+	on: function( types, selector, data, fn ) {
+		return on( this, types, selector, data, fn );
+	},
+	one: function( types, selector, data, fn ) {
+		return on( this, types, selector, data, fn, 1 );
+	},
+	off: function( types, selector, fn ) {
+		var handleObj, type;
+		if ( types && types.preventDefault && types.handleObj ) {
+
+			// ( event )  dispatched jQuery.Event
+			handleObj = types.handleObj;
+			jQuery( types.delegateTarget ).off(
+				handleObj.namespace ?
+					handleObj.origType + "." + handleObj.namespace :
+					handleObj.origType,
+				handleObj.selector,
+				handleObj.handler
+			);
+			return this;
+		}
+		if ( typeof types === "object" ) {
+
+			// ( types-object [, selector] )
+			for ( type in types ) {
+				this.off( type, selector, types[ type ] );
+			}
+			return this;
+		}
+		if ( selector === false || typeof selector === "function" ) {
+
+			// ( types [, fn] )
+			fn = selector;
+			selector = undefined;
+		}
+		if ( fn === false ) {
+			fn = returnFalse;
+		}
+		return this.each( function() {
+			jQuery.event.remove( this, types, fn, selector );
+		} );
+	},
+
+	trigger: function( type, data ) {
+		return this.each( function() {
+			jQuery.event.trigger( type, data, this );
+		} );
+	},
+	triggerHandler: function( type, data ) {
+		var elem = this[ 0 ];
+		if ( elem ) {
+			return jQuery.event.trigger( type, data, elem, true );
+		}
+	}
+} );
+
+
+var rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
+	rnoshimcache = new RegExp( "<(?:" + nodeNames + ")[\\s/>]", "i" ),
+	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,
+
+	// Support: IE 10-11, Edge 10240+
+	// In IE/Edge using regex groups here causes severe slowdowns.
+	// See https://connect.microsoft.com/IE/feedback/details/1736512/
+	rnoInnerhtml = /<script|<style|<link/i,
+
+	// checked="checked" or checked
+	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+	rscriptTypeMasked = /^true\/(.*)/,
+	rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
+	safeFragment = createSafeFragment( document ),
+	fragmentDiv = safeFragment.appendChild( document.createElement( "div" ) );
+
+// Support: IE<8
+// Manipulating tables requires a tbody
+function manipulationTarget( elem, content ) {
+	return jQuery.nodeName( elem, "table" ) &&
+		jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ?
+
+		elem.getElementsByTagName( "tbody" )[ 0 ] ||
+			elem.appendChild( elem.ownerDocument.createElement( "tbody" ) ) :
+		elem;
+}
+
+// Replace/restore the type attribute of script elements for safe DOM manipulation
+function disableScript( elem ) {
+	elem.type = ( jQuery.find.attr( elem, "type" ) !== null ) + "/" + elem.type;
+	return elem;
+}
+function restoreScript( elem ) {
+	var match = rscriptTypeMasked.exec( elem.type );
+	if ( match ) {
+		elem.type = match[ 1 ];
+	} else {
+		elem.removeAttribute( "type" );
+	}
+	return elem;
+}
+
+function cloneCopyEvent( src, dest ) {
+	if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
+		return;
+	}
+
+	var type, i, l,
+		oldData = jQuery._data( src ),
+		curData = jQuery._data( dest, oldData ),
+		events = oldData.events;
+
+	if ( events ) {
+		delete curData.handle;
+		curData.events = {};
+
+		for ( type in events ) {
+			for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+				jQuery.event.add( dest, type, events[ type ][ i ] );
+			}
+		}
+	}
+
+	// make the cloned public data object a copy from the original
+	if ( curData.data ) {
+		curData.data = jQuery.extend( {}, curData.data );
+	}
+}
+
+function fixCloneNodeIssues( src, dest ) {
+	var nodeName, e, data;
+
+	// We do not need to do anything for non-Elements
+	if ( dest.nodeType !== 1 ) {
+		return;
+	}
+
+	nodeName = dest.nodeName.toLowerCase();
+
+	// IE6-8 copies events bound via attachEvent when using cloneNode.
+	if ( !support.noCloneEvent && dest[ jQuery.expando ] ) {
+		data = jQuery._data( dest );
+
+		for ( e in data.events ) {
+			jQuery.removeEvent( dest, e, data.handle );
+		}
+
+		// Event data gets referenced instead of copied if the expando gets copied too
+		dest.removeAttribute( jQuery.expando );
+	}
+
+	// IE blanks contents when cloning scripts, and tries to evaluate newly-set text
+	if ( nodeName === "script" && dest.text !== src.text ) {
+		disableScript( dest ).text = src.text;
+		restoreScript( dest );
+
+	// IE6-10 improperly clones children of object elements using classid.
+	// IE10 throws NoModificationAllowedError if parent is null, #12132.
+	} else if ( nodeName === "object" ) {
+		if ( dest.parentNode ) {
+			dest.outerHTML = src.outerHTML;
+		}
+
+		// This path appears unavoidable for IE9. When cloning an object
+		// element in IE9, the outerHTML strategy above is not sufficient.
+		// If the src has innerHTML and the destination does not,
+		// copy the src.innerHTML into the dest.innerHTML. #10324
+		if ( support.html5Clone && ( src.innerHTML && !jQuery.trim( dest.innerHTML ) ) ) {
+			dest.innerHTML = src.innerHTML;
+		}
+
+	} else if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
+
+		// IE6-8 fails to persist the checked state of a cloned checkbox
+		// or radio button. Worse, IE6-7 fail to give the cloned element
+		// a checked appearance if the defaultChecked value isn't also set
+
+		dest.defaultChecked = dest.checked = src.checked;
+
+		// IE6-7 get confused and end up setting the value of a cloned
+		// checkbox/radio button to an empty string instead of "on"
+		if ( dest.value !== src.value ) {
+			dest.value = src.value;
+		}
+
+	// IE6-8 fails to return the selected option to the default selected
+	// state when cloning options
+	} else if ( nodeName === "option" ) {
+		dest.defaultSelected = dest.selected = src.defaultSelected;
+
+	// IE6-8 fails to set the defaultValue to the correct value when
+	// cloning other types of input fields
+	} else if ( nodeName === "input" || nodeName === "textarea" ) {
+		dest.defaultValue = src.defaultValue;
+	}
+}
+
+function domManip( collection, args, callback, ignored ) {
+
+	// Flatten any nested arrays
+	args = concat.apply( [], args );
+
+	var first, node, hasScripts,
+		scripts, doc, fragment,
+		i = 0,
+		l = collection.length,
+		iNoClone = l - 1,
+		value = args[ 0 ],
+		isFunction = jQuery.isFunction( value );
+
+	// We can't cloneNode fragments that contain checked, in WebKit
+	if ( isFunction ||
+			( l > 1 && typeof value === "string" &&
+				!support.checkClone && rchecked.test( value ) ) ) {
+		return collection.each( function( index ) {
+			var self = collection.eq( index );
+			if ( isFunction ) {
+				args[ 0 ] = value.call( this, index, self.html() );
+			}
+			domManip( self, args, callback, ignored );
+		} );
+	}
+
+	if ( l ) {
+		fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
+		first = fragment.firstChild;
+
+		if ( fragment.childNodes.length === 1 ) {
+			fragment = first;
+		}
+
+		// Require either new content or an interest in ignored elements to invoke the callback
+		if ( first || ignored ) {
+			scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
+			hasScripts = scripts.length;
+
+			// Use the original fragment for the last item
+			// instead of the first because it can end up
+			// being emptied incorrectly in certain situations (#8070).
+			for ( ; i < l; i++ ) {
+				node = fragment;
+
+				if ( i !== iNoClone ) {
+					node = jQuery.clone( node, true, true );
+
+					// Keep references to cloned scripts for later restoration
+					if ( hasScripts ) {
+
+						// Support: Android<4.1, PhantomJS<2
+						// push.apply(_, arraylike) throws on ancient WebKit
+						jQuery.merge( scripts, getAll( node, "script" ) );
+					}
+				}
+
+				callback.call( collection[ i ], node, i );
+			}
+
+			if ( hasScripts ) {
+				doc = scripts[ scripts.length - 1 ].ownerDocument;
+
+				// Reenable scripts
+				jQuery.map( scripts, restoreScript );
+
+				// Evaluate executable scripts on first document insertion
+				for ( i = 0; i < hasScripts; i++ ) {
+					node = scripts[ i ];
+					if ( rscriptType.test( node.type || "" ) &&
+						!jQuery._data( node, "globalEval" ) &&
+						jQuery.contains( doc, node ) ) {
+
+						if ( node.src ) {
+
+							// Optional AJAX dependency, but won't run scripts if not present
+							if ( jQuery._evalUrl ) {
+								jQuery._evalUrl( node.src );
+							}
+						} else {
+							jQuery.globalEval(
+								( node.text || node.textContent || node.innerHTML || "" )
+									.replace( rcleanScript, "" )
+							);
+						}
+					}
+				}
+			}
+
+			// Fix #11809: Avoid leaking memory
+			fragment = first = null;
+		}
+	}
+
+	return collection;
+}
+
+function remove( elem, selector, keepData ) {
+	var node,
+		elems = selector ? jQuery.filter( selector, elem ) : elem,
+		i = 0;
+
+	for ( ; ( node = elems[ i ] ) != null; i++ ) {
+
+		if ( !keepData && node.nodeType === 1 ) {
+			jQuery.cleanData( getAll( node ) );
+		}
+
+		if ( node.parentNode ) {
+			if ( keepData && jQuery.contains( node.ownerDocument, node ) ) {
+				setGlobalEval( getAll( node, "script" ) );
+			}
+			node.parentNode.removeChild( node );
+		}
+	}
+
+	return elem;
+}
+
+jQuery.extend( {
+	htmlPrefilter: function( html ) {
+		return html.replace( rxhtmlTag, "<$1></$2>" );
+	},
+
+	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+		var destElements, node, clone, i, srcElements,
+			inPage = jQuery.contains( elem.ownerDocument, elem );
+
+		if ( support.html5Clone || jQuery.isXMLDoc( elem ) ||
+			!rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
+
+			clone = elem.cloneNode( true );
+
+		// IE<=8 does not properly clone detached, unknown element nodes
+		} else {
+			fragmentDiv.innerHTML = elem.outerHTML;
+			fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
+		}
+
+		if ( ( !support.noCloneEvent || !support.noCloneChecked ) &&
+				( elem.nodeType === 1 || elem.nodeType === 11 ) && !jQuery.isXMLDoc( elem ) ) {
+
+			// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
+			destElements = getAll( clone );
+			srcElements = getAll( elem );
+
+			// Fix all IE cloning issues
+			for ( i = 0; ( node = srcElements[ i ] ) != null; ++i ) {
+
+				// Ensure that the destination node is not null; Fixes #9587
+				if ( destElements[ i ] ) {
+					fixCloneNodeIssues( node, destElements[ i ] );
+				}
+			}
+		}
+
+		// Copy the events from the original to the clone
+		if ( dataAndEvents ) {
+			if ( deepDataAndEvents ) {
+				srcElements = srcElements || getAll( elem );
+				destElements = destElements || getAll( clone );
+
+				for ( i = 0; ( node = srcElements[ i ] ) != null; i++ ) {
+					cloneCopyEvent( node, destElements[ i ] );
+				}
+			} else {
+				cloneCopyEvent( elem, clone );
+			}
+		}
+
+		// Preserve script evaluation history
+		destElements = getAll( clone, "script" );
+		if ( destElements.length > 0 ) {
+			setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
+		}
+
+		destElements = srcElements = node = null;
+
+		// Return the cloned set
+		return clone;
+	},
+
+	cleanData: function( elems, /* internal */ forceAcceptData ) {
+		var elem, type, id, data,
+			i = 0,
+			internalKey = jQuery.expando,
+			cache = jQuery.cache,
+			attributes = support.attributes,
+			special = jQuery.event.special;
+
+		for ( ; ( elem = elems[ i ] ) != null; i++ ) {
+			if ( forceAcceptData || acceptData( elem ) ) {
+
+				id = elem[ internalKey ];
+				data = id && cache[ id ];
+
+				if ( data ) {
+					if ( data.events ) {
+						for ( type in data.events ) {
+							if ( special[ type ] ) {
+								jQuery.event.remove( elem, type );
+
+							// This is a shortcut to avoid jQuery.event.remove's overhead
+							} else {
+								jQuery.removeEvent( elem, type, data.handle );
+							}
+						}
+					}
+
+					// Remove cache only if it was not already removed by jQuery.event.remove
+					if ( cache[ id ] ) {
+
+						delete cache[ id ];
+
+						// Support: IE<9
+						// IE does not allow us to delete expando properties from nodes
+						// IE creates expando attributes along with the property
+						// IE does not have a removeAttribute function on Document nodes
+						if ( !attributes && typeof elem.removeAttribute !== "undefined" ) {
+							elem.removeAttribute( internalKey );
+
+						// Webkit & Blink performance suffers when deleting properties
+						// from DOM nodes, so set to undefined instead
+						// https://code.google.com/p/chromium/issues/detail?id=378607
+						} else {
+							elem[ internalKey ] = undefined;
+						}
+
+						deletedIds.push( id );
+					}
+				}
+			}
+		}
+	}
+} );
+
+jQuery.fn.extend( {
+
+	// Keep domManip exposed until 3.0 (gh-2225)
+	domManip: domManip,
+
+	detach: function( selector ) {
+		return remove( this, selector, true );
+	},
+
+	remove: function( selector ) {
+		return remove( this, selector );
+	},
+
+	text: function( value ) {
+		return access( this, function( value ) {
+			return value === undefined ?
+				jQuery.text( this ) :
+				this.empty().append(
+					( this[ 0 ] && this[ 0 ].ownerDocument || document ).createTextNode( value )
+				);
+		}, null, value, arguments.length );
+	},
+
+	append: function() {
+		return domManip( this, arguments, function( elem ) {
+			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+				var target = manipulationTarget( this, elem );
+				target.appendChild( elem );
+			}
+		} );
+	},
+
+	prepend: function() {
+		return domManip( this, arguments, function( elem ) {
+			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+				var target = manipulationTarget( this, elem );
+				target.insertBefore( elem, target.firstChild );
+			}
+		} );
+	},
+
+	before: function() {
+		return domManip( this, arguments, function( elem ) {
+			if ( this.parentNode ) {
+				this.parentNode.insertBefore( elem, this );
+			}
+		} );
+	},
+
+	after: function() {
+		return domManip( this, arguments, function( elem ) {
+			if ( this.parentNode ) {
+				this.parentNode.insertBefore( elem, this.nextSibling );
+			}
+		} );
+	},
+
+	empty: function() {
+		var elem,
+			i = 0;
+
+		for ( ; ( elem = this[ i ] ) != null; i++ ) {
+
+			// Remove element nodes and prevent memory leaks
+			if ( elem.nodeType === 1 ) {
+				jQuery.cleanData( getAll( elem, false ) );
+			}
+
+			// Remove any remaining nodes
+			while ( elem.firstChild ) {
+				elem.removeChild( elem.firstChild );
+			}
+
+			// If this is a select, ensure that it displays empty (#12336)
+			// Support: IE<9
+			if ( elem.options && jQuery.nodeName( elem, "select" ) ) {
+				elem.options.length = 0;
+			}
+		}
+
+		return this;
+	},
+
+	clone: function( dataAndEvents, deepDataAndEvents ) {
+		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+		return this.map( function() {
+			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+		} );
+	},
+
+	html: function( value ) {
+		return access( this, function( value ) {
+			var elem = this[ 0 ] || {},
+				i = 0,
+				l = this.length;
+
+			if ( value === undefined ) {
+				return elem.nodeType === 1 ?
+					elem.innerHTML.replace( rinlinejQuery, "" ) :
+					undefined;
+			}
+
+			// See if we can take a shortcut and just use innerHTML
+			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+				( support.htmlSerialize || !rnoshimcache.test( value )  ) &&
+				( support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
+				!wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
+
+				value = jQuery.htmlPrefilter( value );
+
+				try {
+					for ( ; i < l; i++ ) {
+
+						// Remove element nodes and prevent memory leaks
+						elem = this[ i ] || {};
+						if ( elem.nodeType === 1 ) {
+							jQuery.cleanData( getAll( elem, false ) );
+							elem.innerHTML = value;
+						}
+					}
+
+					elem = 0;
+
+				// If using innerHTML throws an exception, use the fallback method
+				} catch ( e ) {}
+			}
+
+			if ( elem ) {
+				this.empty().append( value );
+			}
+		}, null, value, arguments.length );
+	},
+
+	replaceWith: function() {
+		var ignored = [];
+
+		// Make the changes, replacing each non-ignored context element with the new content
+		return domManip( this, arguments, function( elem ) {
+			var parent = this.parentNode;
+
+			if ( jQuery.inArray( this, ignored ) < 0 ) {
+				jQuery.cleanData( getAll( this ) );
+				if ( parent ) {
+					parent.replaceChild( elem, this );
+				}
+			}
+
+		// Force callback invocation
+		}, ignored );
+	}
+} );
+
+jQuery.each( {
+	appendTo: "append",
+	prependTo: "prepend",
+	insertBefore: "before",
+	insertAfter: "after",
+	replaceAll: "replaceWith"
+}, function( name, original ) {
+	jQuery.fn[ name ] = function( selector ) {
+		var elems,
+			i = 0,
+			ret = [],
+			insert = jQuery( selector ),
+			last = insert.length - 1;
+
+		for ( ; i <= last; i++ ) {
+			elems = i === last ? this : this.clone( true );
+			jQuery( insert[ i ] )[ original ]( elems );
+
+			// Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()
+			push.apply( ret, elems.get() );
+		}
+
+		return this.pushStack( ret );
+	};
+} );
+
+
+var iframe,
+	elemdisplay = {
+
+		// Support: Firefox
+		// We have to pre-define these values for FF (#10227)
+		HTML: "block",
+		BODY: "block"
+	};
+
+/**
+ * Retrieve the actual display of a element
+ * @param {String} name nodeName of the element
+ * @param {Object} doc Document object
+ */
+
+// Called only from within defaultDisplay
+function actualDisplay( name, doc ) {
+	var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
+
+		display = jQuery.css( elem[ 0 ], "display" );
+
+	// We don't have any data stored on the element,
+	// so use "detach" method as fast way to get rid of the element
+	elem.detach();
+
+	return display;
+}
+
+/**
+ * Try to determine the default display value of an element
+ * @param {String} nodeName
+ */
+function defaultDisplay( nodeName ) {
+	var doc = document,
+		display = elemdisplay[ nodeName ];
+
+	if ( !display ) {
+		display = actualDisplay( nodeName, doc );
+
+		// If the simple way fails, read from inside an iframe
+		if ( display === "none" || !display ) {
+
+			// Use the already-created iframe if possible
+			iframe = ( iframe || jQuery( "<iframe frameborder='0' width='0' height='0'/>" ) )
+				.appendTo( doc.documentElement );
+
+			// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
+			doc = ( iframe[ 0 ].contentWindow || iframe[ 0 ].contentDocument ).document;
+
+			// Support: IE
+			doc.write();
+			doc.close();
+
+			display = actualDisplay( nodeName, doc );
+			iframe.detach();
+		}
+
+		// Store the correct default display
+		elemdisplay[ nodeName ] = display;
+	}
+
+	return display;
+}
+var rmargin = ( /^margin/ );
+
+var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
+
+var swap = function( elem, options, callback, args ) {
+	var ret, name,
+		old = {};
+
+	// Remember the old values, and insert the new ones
+	for ( name in options ) {
+		old[ name ] = elem.style[ name ];
+		elem.style[ name ] = options[ name ];
+	}
+
+	ret = callback.apply( elem, args || [] );
+
+	// Revert the old values
+	for ( name in options ) {
+		elem.style[ name ] = old[ name ];
+	}
+
+	return ret;
+};
+
+
+var documentElement = document.documentElement;
+
+
+
+( function() {
+	var pixelPositionVal, pixelMarginRightVal, boxSizingReliableVal,
+		reliableHiddenOffsetsVal, reliableMarginRightVal, reliableMarginLeftVal,
+		container = document.createElement( "div" ),
+		div = document.createElement( "div" );
+
+	// Finish early in limited (non-browser) environments
+	if ( !div.style ) {
+		return;
+	}
+
+	div.style.cssText = "float:left;opacity:.5";
+
+	// Support: IE<9
+	// Make sure that element opacity exists (as opposed to filter)
+	support.opacity = div.style.opacity === "0.5";
+
+	// Verify style float existence
+	// (IE uses styleFloat instead of cssFloat)
+	support.cssFloat = !!div.style.cssFloat;
+
+	div.style.backgroundClip = "content-box";
+	div.cloneNode( true ).style.backgroundClip = "";
+	support.clearCloneStyle = div.style.backgroundClip === "content-box";
+
+	container = document.createElement( "div" );
+	container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" +
+		"padding:0;margin-top:1px;position:absolute";
+	div.innerHTML = "";
+	container.appendChild( div );
+
+	// Support: Firefox<29, Android 2.3
+	// Vendor-prefix box-sizing
+	support.boxSizing = div.style.boxSizing === "" || div.style.MozBoxSizing === "" ||
+		div.style.WebkitBoxSizing === "";
+
+	jQuery.extend( support, {
+		reliableHiddenOffsets: function() {
+			if ( pixelPositionVal == null ) {
+				computeStyleTests();
+			}
+			return reliableHiddenOffsetsVal;
+		},
+
+		boxSizingReliable: function() {
+
+			// We're checking for pixelPositionVal here instead of boxSizingReliableVal
+			// since that compresses better and they're computed together anyway.
+			if ( pixelPositionVal == null ) {
+				computeStyleTests();
+			}
+			return boxSizingReliableVal;
+		},
+
+		pixelMarginRight: function() {
+
+			// Support: Android 4.0-4.3
+			if ( pixelPositionVal == null ) {
+				computeStyleTests();
+			}
+			return pixelMarginRightVal;
+		},
+
+		pixelPosition: function() {
+			if ( pixelPositionVal == null ) {
+				computeStyleTests();
+			}
+			return pixelPositionVal;
+		},
+
+		reliableMarginRight: function() {
+
+			// Support: Android 2.3
+			if ( pixelPositionVal == null ) {
+				computeStyleTests();
+			}
+			return reliableMarginRightVal;
+		},
+
+		reliableMarginLeft: function() {
+
+			// Support: IE <=8 only, Android 4.0 - 4.3 only, Firefox <=3 - 37
+			if ( pixelPositionVal == null ) {
+				computeStyleTests();
+			}
+			return reliableMarginLeftVal;
+		}
+	} );
+
+	function computeStyleTests() {
+		var contents, divStyle,
+			documentElement = document.documentElement;
+
+		// Setup
+		documentElement.appendChild( container );
+
+		div.style.cssText =
+
+			// Support: Android 2.3
+			// Vendor-prefix box-sizing
+			"-webkit-box-sizing:border-box;box-sizing:border-box;" +
+			"position:relative;display:block;" +
+			"margin:auto;border:1px;padding:1px;" +
+			"top:1%;width:50%";
+
+		// Support: IE<9
+		// Assume reasonable values in the absence of getComputedStyle
+		pixelPositionVal = boxSizingReliableVal = reliableMarginLeftVal = false;
+		pixelMarginRightVal = reliableMarginRightVal = true;
+
+		// Check for getComputedStyle so that this code is not run in IE<9.
+		if ( window.getComputedStyle ) {
+			divStyle = window.getComputedStyle( div );
+			pixelPositionVal = ( divStyle || {} ).top !== "1%";
+			reliableMarginLeftVal = ( divStyle || {} ).marginLeft === "2px";
+			boxSizingReliableVal = ( divStyle || { width: "4px" } ).width === "4px";
+
+			// Support: Android 4.0 - 4.3 only
+			// Some styles come back with percentage values, even though they shouldn't
+			div.style.marginRight = "50%";
+			pixelMarginRightVal = ( divStyle || { marginRight: "4px" } ).marginRight === "4px";
+
+			// Support: Android 2.3 only
+			// Div with explicit width and no margin-right incorrectly
+			// gets computed margin-right based on width of container (#3333)
+			// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+			contents = div.appendChild( document.createElement( "div" ) );
+
+			// Reset CSS: box-sizing; display; margin; border; padding
+			contents.style.cssText = div.style.cssText =
+
+				// Support: Android 2.3
+				// Vendor-prefix box-sizing
+				"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" +
+				"box-sizing:content-box;display:block;margin:0;border:0;padding:0";
+			contents.style.marginRight = contents.style.width = "0";
+			div.style.width = "1px";
+
+			reliableMarginRightVal =
+				!parseFloat( ( window.getComputedStyle( contents ) || {} ).marginRight );
+
+			div.removeChild( contents );
+		}
+
+		// Support: IE6-8
+		// First check that getClientRects works as expected
+		// Check if table cells still have offsetWidth/Height when they are set
+		// to display:none and there are still other visible table cells in a
+		// table row; if so, offsetWidth/Height are not reliable for use when
+		// determining if an element has been hidden directly using
+		// display:none (it is still safe to use offsets if a parent element is
+		// hidden; don safety goggles and see bug #4512 for more information).
+		div.style.display = "none";
+		reliableHiddenOffsetsVal = div.getClientRects().length === 0;
+		if ( reliableHiddenOffsetsVal ) {
+			div.style.display = "";
+			div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
+			contents = div.getElementsByTagName( "td" );
+			contents[ 0 ].style.cssText = "margin:0;border:0;padding:0;display:none";
+			reliableHiddenOffsetsVal = contents[ 0 ].offsetHeight === 0;
+			if ( reliableHiddenOffsetsVal ) {
+				contents[ 0 ].style.display = "";
+				contents[ 1 ].style.display = "none";
+				reliableHiddenOffsetsVal = contents[ 0 ].offsetHeight === 0;
+			}
+		}
+
+		// Teardown
+		documentElement.removeChild( container );
+	}
+
+} )();
+
+
+var getStyles, curCSS,
+	rposition = /^(top|right|bottom|left)$/;
+
+if ( window.getComputedStyle ) {
+	getStyles = function( elem ) {
+
+		// Support: IE<=11+, Firefox<=30+ (#15098, #14150)
+		// IE throws on elements created in popups
+		// FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
+		var view = elem.ownerDocument.defaultView;
+
+		if ( !view || !view.opener ) {
+			view = window;
+		}
+
+		return view.getComputedStyle( elem );
+	};
+
+	curCSS = function( elem, name, computed ) {
+		var width, minWidth, maxWidth, ret,
+			style = elem.style;
+
+		computed = computed || getStyles( elem );
+
+		// getPropertyValue is only needed for .css('filter') in IE9, see #12537
+		ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined;
+
+		// Support: Opera 12.1x only
+		// Fall back to style even without computed
+		// computed is undefined for elems on document fragments
+		if ( ( ret === "" || ret === undefined ) && !jQuery.contains( elem.ownerDocument, elem ) ) {
+			ret = jQuery.style( elem, name );
+		}
+
+		if ( computed ) {
+
+			// A tribute to the "awesome hack by Dean Edwards"
+			// Chrome < 17 and Safari 5.0 uses "computed value"
+			// instead of "used value" for margin-right
+			// Safari 5.1.7 (at least) returns percentage for a larger set of values,
+			// but width seems to be reliably pixels
+			// this is against the CSSOM draft spec:
+			// http://dev.w3.org/csswg/cssom/#resolved-values
+			if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) {
+
+				// Remember the original values
+				width = style.width;
+				minWidth = style.minWidth;
+				maxWidth = style.maxWidth;
+
+				// Put in the new values to get a computed value out
+				style.minWidth = style.maxWidth = style.width = ret;
+				ret = computed.width;
+
+				// Revert the changed values
+				style.width = width;
+				style.minWidth = minWidth;
+				style.maxWidth = maxWidth;
+			}
+		}
+
+		// Support: IE
+		// IE returns zIndex value as an integer.
+		return ret === undefined ?
+			ret :
+			ret + "";
+	};
+} else if ( documentElement.currentStyle ) {
+	getStyles = function( elem ) {
+		return elem.currentStyle;
+	};
+
+	curCSS = function( elem, name, computed ) {
+		var left, rs, rsLeft, ret,
+			style = elem.style;
+
+		computed = computed || getStyles( elem );
+		ret = computed ? computed[ name ] : undefined;
+
+		// Avoid setting ret to empty string here
+		// so we don't default to auto
+		if ( ret == null && style && style[ name ] ) {
+			ret = style[ name ];
+		}
+
+		// From the awesome hack by Dean Edwards
+		// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
+
+		// If we're not dealing with a regular pixel number
+		// but a number that has a weird ending, we need to convert it to pixels
+		// but not position css attributes, as those are
+		// proportional to the parent element instead
+		// and we can't measure the parent instead because it
+		// might trigger a "stacking dolls" problem
+		if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
+
+			// Remember the original values
+			left = style.left;
+			rs = elem.runtimeStyle;
+			rsLeft = rs && rs.left;
+
+			// Put in the new values to get a computed value out
+			if ( rsLeft ) {
+				rs.left = elem.currentStyle.left;
+			}
+			style.left = name === "fontSize" ? "1em" : ret;
+			ret = style.pixelLeft + "px";
+
+			// Revert the changed values
+			style.left = left;
+			if ( rsLeft ) {
+				rs.left = rsLeft;
+			}
+		}
+
+		// Support: IE
+		// IE returns zIndex value as an integer.
+		return ret === undefined ?
+			ret :
+			ret + "" || "auto";
+	};
+}
+
+
+
+
+function addGetHookIf( conditionFn, hookFn ) {
+
+	// Define the hook, we'll check on the first run if it's really needed.
+	return {
+		get: function() {
+			if ( conditionFn() ) {
+
+				// Hook not needed (or it's not possible to use it due
+				// to missing dependency), remove it.
+				delete this.get;
+				return;
+			}
+
+			// Hook needed; redefine it so that the support test is not executed again.
+			return ( this.get = hookFn ).apply( this, arguments );
+		}
+	};
+}
+
+
+var
+
+		ralpha = /alpha\([^)]*\)/i,
+	ropacity = /opacity\s*=\s*([^)]*)/i,
+
+	// swappable if display is none or starts with table except
+	// "table", "table-cell", or "table-caption"
+	// see here for display values:
+	// https://developer.mozilla.org/en-US/docs/CSS/display
+	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
+	rnumsplit = new RegExp( "^(" + pnum + ")(.*)$", "i" ),
+
+	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+	cssNormalTransform = {
+		letterSpacing: "0",
+		fontWeight: "400"
+	},
+
+	cssPrefixes = [ "Webkit", "O", "Moz", "ms" ],
+	emptyStyle = document.createElement( "div" ).style;
+
+
+// return a css property mapped to a potentially vendor prefixed property
+function vendorPropName( name ) {
+
+	// shortcut for names that are not vendor prefixed
+	if ( name in emptyStyle ) {
+		return name;
+	}
+
+	// check for vendor prefixed names
+	var capName = name.charAt( 0 ).toUpperCase() + name.slice( 1 ),
+		i = cssPrefixes.length;
+
+	while ( i-- ) {
+		name = cssPrefixes[ i ] + capName;
+		if ( name in emptyStyle ) {
+			return name;
+		}
+	}
+}
+
+function showHide( elements, show ) {
+	var display, elem, hidden,
+		values = [],
+		index = 0,
+		length = elements.length;
+
+	for ( ; index < length; index++ ) {
+		elem = elements[ index ];
+		if ( !elem.style ) {
+			continue;
+		}
+
+		values[ index ] = jQuery._data( elem, "olddisplay" );
+		display = elem.style.display;
+		if ( show ) {
+
+			// Reset the inline display of this element to learn if it is
+			// being hidden by cascaded rules or not
+			if ( !values[ index ] && display === "none" ) {
+				elem.style.display = "";
+			}
+
+			// Set elements which have been overridden with display: none
+			// in a stylesheet to whatever the default browser style is
+			// for such an element
+			if ( elem.style.display === "" && isHidden( elem ) ) {
+				values[ index ] =
+					jQuery._data( elem, "olddisplay", defaultDisplay( elem.nodeName ) );
+			}
+		} else {
+			hidden = isHidden( elem );
+
+			if ( display && display !== "none" || !hidden ) {
+				jQuery._data(
+					elem,
+					"olddisplay",
+					hidden ? display : jQuery.css( elem, "display" )
+				);
+			}
+		}
+	}
+
+	// Set the display of most of the elements in a second loop
+	// to avoid the constant reflow
+	for ( index = 0; index < length; index++ ) {
+		elem = elements[ index ];
+		if ( !elem.style ) {
+			continue;
+		}
+		if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
+			elem.style.display = show ? values[ index ] || "" : "none";
+		}
+	}
+
+	return elements;
+}
+
+function setPositiveNumber( elem, value, subtract ) {
+	var matches = rnumsplit.exec( value );
+	return matches ?
+
+		// Guard against undefined "subtract", e.g., when used as in cssHooks
+		Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
+		value;
+}
+
+function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
+	var i = extra === ( isBorderBox ? "border" : "content" ) ?
+
+		// If we already have the right measurement, avoid augmentation
+		4 :
+
+		// Otherwise initialize for horizontal or vertical properties
+		name === "width" ? 1 : 0,
+
+		val = 0;
+
+	for ( ; i < 4; i += 2 ) {
+
+		// both box models exclude margin, so add it if we want it
+		if ( extra === "margin" ) {
+			val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
+		}
+
+		if ( isBorderBox ) {
+
+			// border-box includes padding, so remove it if we want content
+			if ( extra === "content" ) {
+				val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+			}
+
+			// at this point, extra isn't border nor margin, so remove border
+			if ( extra !== "margin" ) {
+				val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+			}
+		} else {
+
+			// at this point, extra isn't content, so add padding
+			val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+
+			// at this point, extra isn't content nor padding, so add border
+			if ( extra !== "padding" ) {
+				val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+			}
+		}
+	}
+
+	return val;
+}
+
+function getWidthOrHeight( elem, name, extra ) {
+
+	// Start with offset property, which is equivalent to the border-box value
+	var valueIsBorderBox = true,
+		val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+		styles = getStyles( elem ),
+		isBorderBox = support.boxSizing &&
+			jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
+
+	// Support: IE11 only
+	// In IE 11 fullscreen elements inside of an iframe have
+	// 100x too small dimensions (gh-1764).
+	if ( document.msFullscreenElement && window.top !== window ) {
+
+		// Support: IE11 only
+		// Running getBoundingClientRect on a disconnected node
+		// in IE throws an error.
+		if ( elem.getClientRects().length ) {
+			val = Math.round( elem.getBoundingClientRect()[ name ] * 100 );
+		}
+	}
+
+	// some non-html elements return undefined for offsetWidth, so check for null/undefined
+	// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
+	// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
+	if ( val <= 0 || val == null ) {
+
+		// Fall back to computed then uncomputed css if necessary
+		val = curCSS( elem, name, styles );
+		if ( val < 0 || val == null ) {
+			val = elem.style[ name ];
+		}
+
+		// Computed unit is not pixels. Stop here and return.
+		if ( rnumnonpx.test( val ) ) {
+			return val;
+		}
+
+		// we need the check for style in case a browser which returns unreliable values
+		// for getComputedStyle silently falls back to the reliable elem.style
+		valueIsBorderBox = isBorderBox &&
+			( support.boxSizingReliable() || val === elem.style[ name ] );
+
+		// Normalize "", auto, and prepare for extra
+		val = parseFloat( val ) || 0;
+	}
+
+	// use the active box-sizing model to add/subtract irrelevant styles
+	return ( val +
+		augmentWidthOrHeight(
+			elem,
+			name,
+			extra || ( isBorderBox ? "border" : "content" ),
+			valueIsBorderBox,
+			styles
+		)
+	) + "px";
+}
+
+jQuery.extend( {
+
+	// Add in style property hooks for overriding the default
+	// behavior of getting and setting a style property
+	cssHooks: {
+		opacity: {
+			get: function( elem, computed ) {
+				if ( computed ) {
+
+					// We should always get a number back from opacity
+					var ret = curCSS( elem, "opacity" );
+					return ret === "" ? "1" : ret;
+				}
+			}
+		}
+	},
+
+	// Don't automatically add "px" to these possibly-unitless properties
+	cssNumber: {
+		"animationIterationCount": true,
+		"columnCount": true,
+		"fillOpacity": true,
+		"flexGrow": true,
+		"flexShrink": true,
+		"fontWeight": true,
+		"lineHeight": true,
+		"opacity": true,
+		"order": true,
+		"orphans": true,
+		"widows": true,
+		"zIndex": true,
+		"zoom": true
+	},
+
+	// Add in properties whose names you wish to fix before
+	// setting or getting the value
+	cssProps: {
+
+		// normalize float css property
+		"float": support.cssFloat ? "cssFloat" : "styleFloat"
+	},
+
+	// Get and set the style property on a DOM Node
+	style: function( elem, name, value, extra ) {
+
+		// Don't set styles on text and comment nodes
+		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+			return;
+		}
+
+		// Make sure that we're working with the right name
+		var ret, type, hooks,
+			origName = jQuery.camelCase( name ),
+			style = elem.style;
+
+		name = jQuery.cssProps[ origName ] ||
+			( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );
+
+		// gets hook for the prefixed version
+		// followed by the unprefixed version
+		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+		// Check if we're setting a value
+		if ( value !== undefined ) {
+			type = typeof value;
+
+			// Convert "+=" or "-=" to relative numbers (#7345)
+			if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
+				value = adjustCSS( elem, name, ret );
+
+				// Fixes bug #9237
+				type = "number";
+			}
+
+			// Make sure that null and NaN values aren't set. See: #7116
+			if ( value == null || value !== value ) {
+				return;
+			}
+
+			// If a number was passed in, add the unit (except for certain CSS properties)
+			if ( type === "number" ) {
+				value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
+			}
+
+			// Fixes #8908, it can be done more correctly by specifing setters in cssHooks,
+			// but it would mean to define eight
+			// (for every problematic property) identical functions
+			if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
+				style[ name ] = "inherit";
+			}
+
+			// If a hook was provided, use that value, otherwise just set the specified value
+			if ( !hooks || !( "set" in hooks ) ||
+				( value = hooks.set( elem, value, extra ) ) !== undefined ) {
+
+				// Support: IE
+				// Swallow errors from 'invalid' CSS values (#5509)
+				try {
+					style[ name ] = value;
+				} catch ( e ) {}
+			}
+
+		} else {
+
+			// If a hook was provided get the non-computed value from there
+			if ( hooks && "get" in hooks &&
+				( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
+
+				return ret;
+			}
+
+			// Otherwise just get the value from the style object
+			return style[ name ];
+		}
+	},
+
+	css: function( elem, name, extra, styles ) {
+		var num, val, hooks,
+			origName = jQuery.camelCase( name );
+
+		// Make sure that we're working with the right name
+		name = jQuery.cssProps[ origName ] ||
+			( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );
+
+		// gets hook for the prefixed version
+		// followed by the unprefixed version
+		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+		// If a hook was provided get the computed value from there
+		if ( hooks && "get" in hooks ) {
+			val = hooks.get( elem, true, extra );
+		}
+
+		// Otherwise, if a way to get the computed value exists, use that
+		if ( val === undefined ) {
+			val = curCSS( elem, name, styles );
+		}
+
+		//convert "normal" to computed value
+		if ( val === "normal" && name in cssNormalTransform ) {
+			val = cssNormalTransform[ name ];
+		}
+
+		// Return, converting to number if forced or a qualifier was provided and val looks numeric
+		if ( extra === "" || extra ) {
+			num = parseFloat( val );
+			return extra === true || isFinite( num ) ? num || 0 : val;
+		}
+		return val;
+	}
+} );
+
+jQuery.each( [ "height", "width" ], function( i, name ) {
+	jQuery.cssHooks[ name ] = {
+		get: function( elem, computed, extra ) {
+			if ( computed ) {
+
+				// certain elements can have dimension info if we invisibly show them
+				// however, it must have a current display style that would benefit from this
+				return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
+					elem.offsetWidth === 0 ?
+						swap( elem, cssShow, function() {
+							return getWidthOrHeight( elem, name, extra );
+						} ) :
+						getWidthOrHeight( elem, name, extra );
+			}
+		},
+
+		set: function( elem, value, extra ) {
+			var styles = extra && getStyles( elem );
+			return setPositiveNumber( elem, value, extra ?
+				augmentWidthOrHeight(
+					elem,
+					name,
+					extra,
+					support.boxSizing &&
+						jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
+					styles
+				) : 0
+			);
+		}
+	};
+} );
+
+if ( !support.opacity ) {
+	jQuery.cssHooks.opacity = {
+		get: function( elem, computed ) {
+
+			// IE uses filters for opacity
+			return ropacity.test( ( computed && elem.currentStyle ?
+				elem.currentStyle.filter :
+				elem.style.filter ) || "" ) ?
+					( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
+					computed ? "1" : "";
+		},
+
+		set: function( elem, value ) {
+			var style = elem.style,
+				currentStyle = elem.currentStyle,
+				opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
+				filter = currentStyle && currentStyle.filter || style.filter || "";
+
+			// IE has trouble with opacity if it does not have layout
+			// Force it by setting the zoom level
+			style.zoom = 1;
+
+			// if setting opacity to 1, and no other filters exist -
+			// attempt to remove filter attribute #6652
+			// if value === "", then remove inline opacity #12685
+			if ( ( value >= 1 || value === "" ) &&
+					jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
+					style.removeAttribute ) {
+
+				// Setting style.filter to null, "" & " " still leave "filter:" in the cssText
+				// if "filter:" is present at all, clearType is disabled, we want to avoid this
+				// style.removeAttribute is IE Only, but so apparently is this code path...
+				style.removeAttribute( "filter" );
+
+				// if there is no filter style applied in a css rule
+				// or unset inline opacity, we are done
+				if ( value === "" || currentStyle && !currentStyle.filter ) {
+					return;
+				}
+			}
+
+			// otherwise, set new filter values
+			style.filter = ralpha.test( filter ) ?
+				filter.replace( ralpha, opacity ) :
+				filter + " " + opacity;
+		}
+	};
+}
+
+jQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,
+	function( elem, computed ) {
+		if ( computed ) {
+			return swap( elem, { "display": "inline-block" },
+				curCSS, [ elem, "marginRight" ] );
+		}
+	}
+);
+
+jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
+	function( elem, computed ) {
+		if ( computed ) {
+			return (
+				parseFloat( curCSS( elem, "marginLeft" ) ) ||
+
+				// Support: IE<=11+
+				// Running getBoundingClientRect on a disconnected node in IE throws an error
+				// Support: IE8 only
+				// getClientRects() errors on disconnected elems
+				( jQuery.contains( elem.ownerDocument, elem ) ?
+					elem.getBoundingClientRect().left -
+						swap( elem, { marginLeft: 0 }, function() {
+							return elem.getBoundingClientRect().left;
+						} ) :
+					0
+				)
+			) + "px";
+		}
+	}
+);
+
+// These hooks are used by animate to expand properties
+jQuery.each( {
+	margin: "",
+	padding: "",
+	border: "Width"
+}, function( prefix, suffix ) {
+	jQuery.cssHooks[ prefix + suffix ] = {
+		expand: function( value ) {
+			var i = 0,
+				expanded = {},
+
+				// assumes a single number if not a string
+				parts = typeof value === "string" ? value.split( " " ) : [ value ];
+
+			for ( ; i < 4; i++ ) {
+				expanded[ prefix + cssExpand[ i ] + suffix ] =
+					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
+			}
+
+			return expanded;
+		}
+	};
+
+	if ( !rmargin.test( prefix ) ) {
+		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
+	}
+} );
+
+jQuery.fn.extend( {
+	css: function( name, value ) {
+		return access( this, function( elem, name, value ) {
+			var styles, len,
+				map = {},
+				i = 0;
+
+			if ( jQuery.isArray( name ) ) {
+				styles = getStyles( elem );
+				len = name.length;
+
+				for ( ; i < len; i++ ) {
+					map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
+				}
+
+				return map;
+			}
+
+			return value !== undefined ?
+				jQuery.style( elem, name, value ) :
+				jQuery.css( elem, name );
+		}, name, value, arguments.length > 1 );
+	},
+	show: function() {
+		return showHide( this, true );
+	},
+	hide: function() {
+		return showHide( this );
+	},
+	toggle: function( state ) {
+		if ( typeof state === "boolean" ) {
+			return state ? this.show() : this.hide();
+		}
+
+		return this.each( function() {
+			if ( isHidden( this ) ) {
+				jQuery( this ).show();
+			} else {
+				jQuery( this ).hide();
+			}
+		} );
+	}
+} );
+
+
+function Tween( elem, options, prop, end, easing ) {
+	return new Tween.prototype.init( elem, options, prop, end, easing );
+}
+jQuery.Tween = Tween;
+
+Tween.prototype = {
+	constructor: Tween,
+	init: function( elem, options, prop, end, easing, unit ) {
+		this.elem = elem;
+		this.prop = prop;
+		this.easing = easing || jQuery.easing._default;
+		this.options = options;
+		this.start = this.now = this.cur();
+		this.end = end;
+		this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+	},
+	cur: function() {
+		var hooks = Tween.propHooks[ this.prop ];
+
+		return hooks && hooks.get ?
+			hooks.get( this ) :
+			Tween.propHooks._default.get( this );
+	},
+	run: function( percent ) {
+		var eased,
+			hooks = Tween.propHooks[ this.prop ];
+
+		if ( this.options.duration ) {
+			this.pos = eased = jQuery.easing[ this.easing ](
+				percent, this.options.duration * percent, 0, 1, this.options.duration
+			);
+		} else {
+			this.pos = eased = percent;
+		}
+		this.now = ( this.end - this.start ) * eased + this.start;
+
+		if ( this.options.step ) {
+			this.options.step.call( this.elem, this.now, this );
+		}
+
+		if ( hooks && hooks.set ) {
+			hooks.set( this );
+		} else {
+			Tween.propHooks._default.set( this );
+		}
+		return this;
+	}
+};
+
+Tween.prototype.init.prototype = Tween.prototype;
+
+Tween.propHooks = {
+	_default: {
+		get: function( tween ) {
+			var result;
+
+			// Use a property on the element directly when it is not a DOM element,
+			// or when there is no matching style property that exists.
+			if ( tween.elem.nodeType !== 1 ||
+				tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {
+				return tween.elem[ tween.prop ];
+			}
+
+			// passing an empty string as a 3rd parameter to .css will automatically
+			// attempt a parseFloat and fallback to a string if the parse fails
+			// so, simple values such as "10px" are parsed to Float.
+			// complex values such as "rotate(1rad)" are returned as is.
+			result = jQuery.css( tween.elem, tween.prop, "" );
+
+			// Empty strings, null, undefined and "auto" are converted to 0.
+			return !result || result === "auto" ? 0 : result;
+		},
+		set: function( tween ) {
+
+			// use step hook for back compat - use cssHook if its there - use .style if its
+			// available and use plain properties where available
+			if ( jQuery.fx.step[ tween.prop ] ) {
+				jQuery.fx.step[ tween.prop ]( tween );
+			} else if ( tween.elem.nodeType === 1 &&
+				( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null ||
+					jQuery.cssHooks[ tween.prop ] ) ) {
+				jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
+			} else {
+				tween.elem[ tween.prop ] = tween.now;
+			}
+		}
+	}
+};
+
+// Support: IE <=9
+// Panic based approach to setting things on disconnected nodes
+
+Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
+	set: function( tween ) {
+		if ( tween.elem.nodeType && tween.elem.parentNode ) {
+			tween.elem[ tween.prop ] = tween.now;
+		}
+	}
+};
+
+jQuery.easing = {
+	linear: function( p ) {
+		return p;
+	},
+	swing: function( p ) {
+		return 0.5 - Math.cos( p * Math.PI ) / 2;
+	},
+	_default: "swing"
+};
+
+jQuery.fx = Tween.prototype.init;
+
+// Back Compat <1.8 extension point
+jQuery.fx.step = {};
+
+
+
+
+var
+	fxNow, timerId,
+	rfxtypes = /^(?:toggle|show|hide)$/,
+	rrun = /queueHooks$/;
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+	window.setTimeout( function() {
+		fxNow = undefined;
+	} );
+	return ( fxNow = jQuery.now() );
+}
+
+// Generate parameters to create a standard animation
+function genFx( type, includeWidth ) {
+	var which,
+		attrs = { height: type },
+		i = 0;
+
+	// if we include width, step value is 1 to do all cssExpand values,
+	// if we don't include width, step value is 2 to skip over Left and Right
+	includeWidth = includeWidth ? 1 : 0;
+	for ( ; i < 4 ; i += 2 - includeWidth ) {
+		which = cssExpand[ i ];
+		attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
+	}
+
+	if ( includeWidth ) {
+		attrs.opacity = attrs.width = type;
+	}
+
+	return attrs;
+}
+
+function createTween( value, prop, animation ) {
+	var tween,
+		collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),
+		index = 0,
+		length = collection.length;
+	for ( ; index < length; index++ ) {
+		if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {
+
+			// we're done with this property
+			return tween;
+		}
+	}
+}
+
+function defaultPrefilter( elem, props, opts ) {
+	/* jshint validthis: true */
+	var prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,
+		anim = this,
+		orig = {},
+		style = elem.style,
+		hidden = elem.nodeType && isHidden( elem ),
+		dataShow = jQuery._data( elem, "fxshow" );
+
+	// handle queue: false promises
+	if ( !opts.queue ) {
+		hooks = jQuery._queueHooks( elem, "fx" );
+		if ( hooks.unqueued == null ) {
+			hooks.unqueued = 0;
+			oldfire = hooks.empty.fire;
+			hooks.empty.fire = function() {
+				if ( !hooks.unqueued ) {
+					oldfire();
+				}
+			};
+		}
+		hooks.unqueued++;
+
+		anim.always( function() {
+
+			// doing this makes sure that the complete handler will be called
+			// before this completes
+			anim.always( function() {
+				hooks.unqueued--;
+				if ( !jQuery.queue( elem, "fx" ).length ) {
+					hooks.empty.fire();
+				}
+			} );
+		} );
+	}
+
+	// height/width overflow pass
+	if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
+
+		// Make sure that nothing sneaks out
+		// Record all 3 overflow attributes because IE does not
+		// change the overflow attribute when overflowX and
+		// overflowY are set to the same value
+		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
+
+		// Set display property to inline-block for height/width
+		// animations on inline elements that are having width/height animated
+		display = jQuery.css( elem, "display" );
+
+		// Test default display if display is currently "none"
+		checkDisplay = display === "none" ?
+			jQuery._data( elem, "olddisplay" ) || defaultDisplay( elem.nodeName ) : display;
+
+		if ( checkDisplay === "inline" && jQuery.css( elem, "float" ) === "none" ) {
+
+			// inline-level elements accept inline-block;
+			// block-level elements need to be inline with layout
+			if ( !support.inlineBlockNeedsLayout || defaultDisplay( elem.nodeName ) === "inline" ) {
+				style.display = "inline-block";
+			} else {
+				style.zoom = 1;
+			}
+		}
+	}
+
+	if ( opts.overflow ) {
+		style.overflow = "hidden";
+		if ( !support.shrinkWrapBlocks() ) {
+			anim.always( function() {
+				style.overflow = opts.overflow[ 0 ];
+				style.overflowX = opts.overflow[ 1 ];
+				style.overflowY = opts.overflow[ 2 ];
+			} );
+		}
+	}
+
+	// show/hide pass
+	for ( prop in props ) {
+		value = props[ prop ];
+		if ( rfxtypes.exec( value ) ) {
+			delete props[ prop ];
+			toggle = toggle || value === "toggle";
+			if ( value === ( hidden ? "hide" : "show" ) ) {
+
+				// If there is dataShow left over from a stopped hide or show
+				// and we are going to proceed with show, we should pretend to be hidden
+				if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
+					hidden = true;
+				} else {
+					continue;
+				}
+			}
+			orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
+
+		// Any non-fx value stops us from restoring the original display value
+		} else {
+			display = undefined;
+		}
+	}
+
+	if ( !jQuery.isEmptyObject( orig ) ) {
+		if ( dataShow ) {
+			if ( "hidden" in dataShow ) {
+				hidden = dataShow.hidden;
+			}
+		} else {
+			dataShow = jQuery._data( elem, "fxshow", {} );
+		}
+
+		// store state if its toggle - enables .stop().toggle() to "reverse"
+		if ( toggle ) {
+			dataShow.hidden = !hidden;
+		}
+		if ( hidden ) {
+			jQuery( elem ).show();
+		} else {
+			anim.done( function() {
+				jQuery( elem ).hide();
+			} );
+		}
+		anim.done( function() {
+			var prop;
+			jQuery._removeData( elem, "fxshow" );
+			for ( prop in orig ) {
+				jQuery.style( elem, prop, orig[ prop ] );
+			}
+		} );
+		for ( prop in orig ) {
+			tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
+
+			if ( !( prop in dataShow ) ) {
+				dataShow[ prop ] = tween.start;
+				if ( hidden ) {
+					tween.end = tween.start;
+					tween.start = prop === "width" || prop === "height" ? 1 : 0;
+				}
+			}
+		}
+
+	// If this is a noop like .hide().hide(), restore an overwritten display value
+	} else if ( ( display === "none" ? defaultDisplay( elem.nodeName ) : display ) === "inline" ) {
+		style.display = display;
+	}
+}
+
+function propFilter( props, specialEasing ) {
+	var index, name, easing, value, hooks;
+
+	// camelCase, specialEasing and expand cssHook pass
+	for ( index in props ) {
+		name = jQuery.camelCase( index );
+		easing = specialEasing[ name ];
+		value = props[ index ];
+		if ( jQuery.isArray( value ) ) {
+			easing = value[ 1 ];
+			value = props[ index ] = value[ 0 ];
+		}
+
+		if ( index !== name ) {
+			props[ name ] = value;
+			delete props[ index ];
+		}
+
+		hooks = jQuery.cssHooks[ name ];
+		if ( hooks && "expand" in hooks ) {
+			value = hooks.expand( value );
+			delete props[ name ];
+
+			// not quite $.extend, this wont overwrite keys already present.
+			// also - reusing 'index' from above because we have the correct "name"
+			for ( index in value ) {
+				if ( !( index in props ) ) {
+					props[ index ] = value[ index ];
+					specialEasing[ index ] = easing;
+				}
+			}
+		} else {
+			specialEasing[ name ] = easing;
+		}
+	}
+}
+
+function Animation( elem, properties, options ) {
+	var result,
+		stopped,
+		index = 0,
+		length = Animation.prefilters.length,
+		deferred = jQuery.Deferred().always( function() {
+
+			// don't match elem in the :animated selector
+			delete tick.elem;
+		} ),
+		tick = function() {
+			if ( stopped ) {
+				return false;
+			}
+			var currentTime = fxNow || createFxNow(),
+				remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
+
+				// Support: Android 2.3
+				// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
+				temp = remaining / animation.duration || 0,
+				percent = 1 - temp,
+				index = 0,
+				length = animation.tweens.length;
+
+			for ( ; index < length ; index++ ) {
+				animation.tweens[ index ].run( percent );
+			}
+
+			deferred.notifyWith( elem, [ animation, percent, remaining ] );
+
+			if ( percent < 1 && length ) {
+				return remaining;
+			} else {
+				deferred.resolveWith( elem, [ animation ] );
+				return false;
+			}
+		},
+		animation = deferred.promise( {
+			elem: elem,
+			props: jQuery.extend( {}, properties ),
+			opts: jQuery.extend( true, {
+				specialEasing: {},
+				easing: jQuery.easing._default
+			}, options ),
+			originalProperties: properties,
+			originalOptions: options,
+			startTime: fxNow || createFxNow(),
+			duration: options.duration,
+			tweens: [],
+			createTween: function( prop, end ) {
+				var tween = jQuery.Tween( elem, animation.opts, prop, end,
+						animation.opts.specialEasing[ prop ] || animation.opts.easing );
+				animation.tweens.push( tween );
+				return tween;
+			},
+			stop: function( gotoEnd ) {
+				var index = 0,
+
+					// if we are going to the end, we want to run all the tweens
+					// otherwise we skip this part
+					length = gotoEnd ? animation.tweens.length : 0;
+				if ( stopped ) {
+					return this;
+				}
+				stopped = true;
+				for ( ; index < length ; index++ ) {
+					animation.tweens[ index ].run( 1 );
+				}
+
+				// resolve when we played the last frame
+				// otherwise, reject
+				if ( gotoEnd ) {
+					deferred.notifyWith( elem, [ animation, 1, 0 ] );
+					deferred.resolveWith( elem, [ animation, gotoEnd ] );
+				} else {
+					deferred.rejectWith( elem, [ animation, gotoEnd ] );
+				}
+				return this;
+			}
+		} ),
+		props = animation.props;
+
+	propFilter( props, animation.opts.specialEasing );
+
+	for ( ; index < length ; index++ ) {
+		result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
+		if ( result ) {
+			if ( jQuery.isFunction( result.stop ) ) {
+				jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
+					jQuery.proxy( result.stop, result );
+			}
+			return result;
+		}
+	}
+
+	jQuery.map( props, createTween, animation );
+
+	if ( jQuery.isFunction( animation.opts.start ) ) {
+		animation.opts.start.call( elem, animation );
+	}
+
+	jQuery.fx.timer(
+		jQuery.extend( tick, {
+			elem: elem,
+			anim: animation,
+			queue: animation.opts.queue
+		} )
+	);
+
+	// attach callbacks from options
+	return animation.progress( animation.opts.progress )
+		.done( animation.opts.done, animation.opts.complete )
+		.fail( animation.opts.fail )
+		.always( animation.opts.always );
+}
+
+jQuery.Animation = jQuery.extend( Animation, {
+
+	tweeners: {
+		"*": [ function( prop, value ) {
+			var tween = this.createTween( prop, value );
+			adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
+			return tween;
+		} ]
+	},
+
+	tweener: function( props, callback ) {
+		if ( jQuery.isFunction( props ) ) {
+			callback = props;
+			props = [ "*" ];
+		} else {
+			props = props.match( rnotwhite );
+		}
+
+		var prop,
+			index = 0,
+			length = props.length;
+
+		for ( ; index < length ; index++ ) {
+			prop = props[ index ];
+			Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
+			Animation.tweeners[ prop ].unshift( callback );
+		}
+	},
+
+	prefilters: [ defaultPrefilter ],
+
+	prefilter: function( callback, prepend ) {
+		if ( prepend ) {
+			Animation.prefilters.unshift( callback );
+		} else {
+			Animation.prefilters.push( callback );
+		}
+	}
+} );
+
+jQuery.speed = function( speed, easing, fn ) {
+	var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
+		complete: fn || !fn && easing ||
+			jQuery.isFunction( speed ) && speed,
+		duration: speed,
+		easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
+	};
+
+	opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+		opt.duration in jQuery.fx.speeds ?
+			jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
+
+	// normalize opt.queue - true/undefined/null -> "fx"
+	if ( opt.queue == null || opt.queue === true ) {
+		opt.queue = "fx";
+	}
+
+	// Queueing
+	opt.old = opt.complete;
+
+	opt.complete = function() {
+		if ( jQuery.isFunction( opt.old ) ) {
+			opt.old.call( this );
+		}
+
+		if ( opt.queue ) {
+			jQuery.dequeue( this, opt.queue );
+		}
+	};
+
+	return opt;
+};
+
+jQuery.fn.extend( {
+	fadeTo: function( speed, to, easing, callback ) {
+
+		// show any hidden elements after setting opacity to 0
+		return this.filter( isHidden ).css( "opacity", 0 ).show()
+
+			// animate to the value specified
+			.end().animate( { opacity: to }, speed, easing, callback );
+	},
+	animate: function( prop, speed, easing, callback ) {
+		var empty = jQuery.isEmptyObject( prop ),
+			optall = jQuery.speed( speed, easing, callback ),
+			doAnimation = function() {
+
+				// Operate on a copy of prop so per-property easing won't be lost
+				var anim = Animation( this, jQuery.extend( {}, prop ), optall );
+
+				// Empty animations, or finishing resolves immediately
+				if ( empty || jQuery._data( this, "finish" ) ) {
+					anim.stop( true );
+				}
+			};
+			doAnimation.finish = doAnimation;
+
+		return empty || optall.queue === false ?
+			this.each( doAnimation ) :
+			this.queue( optall.queue, doAnimation );
+	},
+	stop: function( type, clearQueue, gotoEnd ) {
+		var stopQueue = function( hooks ) {
+			var stop = hooks.stop;
+			delete hooks.stop;
+			stop( gotoEnd );
+		};
+
+		if ( typeof type !== "string" ) {
+			gotoEnd = clearQueue;
+			clearQueue = type;
+			type = undefined;
+		}
+		if ( clearQueue && type !== false ) {
+			this.queue( type || "fx", [] );
+		}
+
+		return this.each( function() {
+			var dequeue = true,
+				index = type != null && type + "queueHooks",
+				timers = jQuery.timers,
+				data = jQuery._data( this );
+
+			if ( index ) {
+				if ( data[ index ] && data[ index ].stop ) {
+					stopQueue( data[ index ] );
+				}
+			} else {
+				for ( index in data ) {
+					if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
+						stopQueue( data[ index ] );
+					}
+				}
+			}
+
+			for ( index = timers.length; index--; ) {
+				if ( timers[ index ].elem === this &&
+					( type == null || timers[ index ].queue === type ) ) {
+
+					timers[ index ].anim.stop( gotoEnd );
+					dequeue = false;
+					timers.splice( index, 1 );
+				}
+			}
+
+			// start the next in the queue if the last step wasn't forced
+			// timers currently will call their complete callbacks, which will dequeue
+			// but only if they were gotoEnd
+			if ( dequeue || !gotoEnd ) {
+				jQuery.dequeue( this, type );
+			}
+		} );
+	},
+	finish: function( type ) {
+		if ( type !== false ) {
+			type = type || "fx";
+		}
+		return this.each( function() {
+			var index,
+				data = jQuery._data( this ),
+				queue = data[ type + "queue" ],
+				hooks = data[ type + "queueHooks" ],
+				timers = jQuery.timers,
+				length = queue ? queue.length : 0;
+
+			// enable finishing flag on private data
+			data.finish = true;
+
+			// empty the queue first
+			jQuery.queue( this, type, [] );
+
+			if ( hooks && hooks.stop ) {
+				hooks.stop.call( this, true );
+			}
+
+			// look for any active animations, and finish them
+			for ( index = timers.length; index--; ) {
+				if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
+					timers[ index ].anim.stop( true );
+					timers.splice( index, 1 );
+				}
+			}
+
+			// look for any animations in the old queue and finish them
+			for ( index = 0; index < length; index++ ) {
+				if ( queue[ index ] && queue[ index ].finish ) {
+					queue[ index ].finish.call( this );
+				}
+			}
+
+			// turn off finishing flag
+			delete data.finish;
+		} );
+	}
+} );
+
+jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) {
+	var cssFn = jQuery.fn[ name ];
+	jQuery.fn[ name ] = function( speed, easing, callback ) {
+		return speed == null || typeof speed === "boolean" ?
+			cssFn.apply( this, arguments ) :
+			this.animate( genFx( name, true ), speed, easing, callback );
+	};
+} );
+
+// Generate shortcuts for custom animations
+jQuery.each( {
+	slideDown: genFx( "show" ),
+	slideUp: genFx( "hide" ),
+	slideToggle: genFx( "toggle" ),
+	fadeIn: { opacity: "show" },
+	fadeOut: { opacity: "hide" },
+	fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+	jQuery.fn[ name ] = function( speed, easing, callback ) {
+		return this.animate( props, speed, easing, callback );
+	};
+} );
+
+jQuery.timers = [];
+jQuery.fx.tick = function() {
+	var timer,
+		timers = jQuery.timers,
+		i = 0;
+
+	fxNow = jQuery.now();
+
+	for ( ; i < timers.length; i++ ) {
+		timer = timers[ i ];
+
+		// Checks the timer has not already been removed
+		if ( !timer() && timers[ i ] === timer ) {
+			timers.splice( i--, 1 );
+		}
+	}
+
+	if ( !timers.length ) {
+		jQuery.fx.stop();
+	}
+	fxNow = undefined;
+};
+
+jQuery.fx.timer = function( timer ) {
+	jQuery.timers.push( timer );
+	if ( timer() ) {
+		jQuery.fx.start();
+	} else {
+		jQuery.timers.pop();
+	}
+};
+
+jQuery.fx.interval = 13;
+
+jQuery.fx.start = function() {
+	if ( !timerId ) {
+		timerId = window.setInterval( jQuery.fx.tick, jQuery.fx.interval );
+	}
+};
+
+jQuery.fx.stop = function() {
+	window.clearInterval( timerId );
+	timerId = null;
+};
+
+jQuery.fx.speeds = {
+	slow: 600,
+	fast: 200,
+
+	// Default speed
+	_default: 400
+};
+
+
+// Based off of the plugin by Clint Helfers, with permission.
+// http://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
+jQuery.fn.delay = function( time, type ) {
+	time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+	type = type || "fx";
+
+	return this.queue( type, function( next, hooks ) {
+		var timeout = window.setTimeout( next, time );
+		hooks.stop = function() {
+			window.clearTimeout( timeout );
+		};
+	} );
+};
+
+
+( function() {
+	var a,
+		input = document.createElement( "input" ),
+		div = document.createElement( "div" ),
+		select = document.createElement( "select" ),
+		opt = select.appendChild( document.createElement( "option" ) );
+
+	// Setup
+	div = document.createElement( "div" );
+	div.setAttribute( "className", "t" );
+	div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
+	a = div.getElementsByTagName( "a" )[ 0 ];
+
+	// Support: Windows Web Apps (WWA)
+	// `type` must use .setAttribute for WWA (#14901)
+	input.setAttribute( "type", "checkbox" );
+	div.appendChild( input );
+
+	a = div.getElementsByTagName( "a" )[ 0 ];
+
+	// First batch of tests.
+	a.style.cssText = "top:1px";
+
+	// Test setAttribute on camelCase class.
+	// If it works, we need attrFixes when doing get/setAttribute (ie6/7)
+	support.getSetAttribute = div.className !== "t";
+
+	// Get the style information from getAttribute
+	// (IE uses .cssText instead)
+	support.style = /top/.test( a.getAttribute( "style" ) );
+
+	// Make sure that URLs aren't manipulated
+	// (IE normalizes it by default)
+	support.hrefNormalized = a.getAttribute( "href" ) === "/a";
+
+	// Check the default checkbox/radio value ("" on WebKit; "on" elsewhere)
+	support.checkOn = !!input.value;
+
+	// Make sure that a selected-by-default option has a working selected property.
+	// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
+	support.optSelected = opt.selected;
+
+	// Tests for enctype support on a form (#6743)
+	support.enctype = !!document.createElement( "form" ).enctype;
+
+	// Make sure that the options inside disabled selects aren't marked as disabled
+	// (WebKit marks them as disabled)
+	select.disabled = true;
+	support.optDisabled = !opt.disabled;
+
+	// Support: IE8 only
+	// Check if we can trust getAttribute("value")
+	input = document.createElement( "input" );
+	input.setAttribute( "value", "" );
+	support.input = input.getAttribute( "value" ) === "";
+
+	// Check if an input maintains its value after becoming a radio
+	input.value = "t";
+	input.setAttribute( "type", "radio" );
+	support.radioValue = input.value === "t";
+} )();
+
+
+var rreturn = /\r/g,
+	rspaces = /[\x20\t\r\n\f]+/g;
+
+jQuery.fn.extend( {
+	val: function( value ) {
+		var hooks, ret, isFunction,
+			elem = this[ 0 ];
+
+		if ( !arguments.length ) {
+			if ( elem ) {
+				hooks = jQuery.valHooks[ elem.type ] ||
+					jQuery.valHooks[ elem.nodeName.toLowerCase() ];
+
+				if (
+					hooks &&
+					"get" in hooks &&
+					( ret = hooks.get( elem, "value" ) ) !== undefined
+				) {
+					return ret;
+				}
+
+				ret = elem.value;
+
+				return typeof ret === "string" ?
+
+					// handle most common string cases
+					ret.replace( rreturn, "" ) :
+
+					// handle cases where value is null/undef or number
+					ret == null ? "" : ret;
+			}
+
+			return;
+		}
+
+		isFunction = jQuery.isFunction( value );
+
+		return this.each( function( i ) {
+			var val;
+
+			if ( this.nodeType !== 1 ) {
+				return;
+			}
+
+			if ( isFunction ) {
+				val = value.call( this, i, jQuery( this ).val() );
+			} else {
+				val = value;
+			}
+
+			// Treat null/undefined as ""; convert numbers to string
+			if ( val == null ) {
+				val = "";
+			} else if ( typeof val === "number" ) {
+				val += "";
+			} else if ( jQuery.isArray( val ) ) {
+				val = jQuery.map( val, function( value ) {
+					return value == null ? "" : value + "";
+				} );
+			}
+
+			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
+
+			// If set returns undefined, fall back to normal setting
+			if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
+				this.value = val;
+			}
+		} );
+	}
+} );
+
+jQuery.extend( {
+	valHooks: {
+		option: {
+			get: function( elem ) {
+				var val = jQuery.find.attr( elem, "value" );
+				return val != null ?
+					val :
+
+					// Support: IE10-11+
+					// option.text throws exceptions (#14686, #14858)
+					// Strip and collapse whitespace
+					// https://html.spec.whatwg.org/#strip-and-collapse-whitespace
+					jQuery.trim( jQuery.text( elem ) ).replace( rspaces, " " );
+			}
+		},
+		select: {
+			get: function( elem ) {
+				var value, option,
+					options = elem.options,
+					index = elem.selectedIndex,
+					one = elem.type === "select-one" || index < 0,
+					values = one ? null : [],
+					max = one ? index + 1 : options.length,
+					i = index < 0 ?
+						max :
+						one ? index : 0;
+
+				// Loop through all the selected options
+				for ( ; i < max; i++ ) {
+					option = options[ i ];
+
+					// oldIE doesn't update selected after form reset (#2551)
+					if ( ( option.selected || i === index ) &&
+
+							// Don't return options that are disabled or in a disabled optgroup
+							( support.optDisabled ?
+								!option.disabled :
+								option.getAttribute( "disabled" ) === null ) &&
+							( !option.parentNode.disabled ||
+								!jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
+
+						// Get the specific value for the option
+						value = jQuery( option ).val();
+
+						// We don't need an array for one selects
+						if ( one ) {
+							return value;
+						}
+
+						// Multi-Selects return an array
+						values.push( value );
+					}
+				}
+
+				return values;
+			},
+
+			set: function( elem, value ) {
+				var optionSet, option,
+					options = elem.options,
+					values = jQuery.makeArray( value ),
+					i = options.length;
+
+				while ( i-- ) {
+					option = options[ i ];
+
+					if ( jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 ) {
+
+						// Support: IE6
+						// When new option element is added to select box we need to
+						// force reflow of newly added node in order to workaround delay
+						// of initialization properties
+						try {
+							option.selected = optionSet = true;
+
+						} catch ( _ ) {
+
+							// Will be executed only in IE6
+							option.scrollHeight;
+						}
+
+					} else {
+						option.selected = false;
+					}
+				}
+
+				// Force browsers to behave consistently when non-matching value is set
+				if ( !optionSet ) {
+					elem.selectedIndex = -1;
+				}
+
+				return options;
+			}
+		}
+	}
+} );
+
+// Radios and checkboxes getter/setter
+jQuery.each( [ "radio", "checkbox" ], function() {
+	jQuery.valHooks[ this ] = {
+		set: function( elem, value ) {
+			if ( jQuery.isArray( value ) ) {
+				return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
+			}
+		}
+	};
+	if ( !support.checkOn ) {
+		jQuery.valHooks[ this ].get = function( elem ) {
+			return elem.getAttribute( "value" ) === null ? "on" : elem.value;
+		};
+	}
+} );
+
+
+
+
+var nodeHook, boolHook,
+	attrHandle = jQuery.expr.attrHandle,
+	ruseDefault = /^(?:checked|selected)$/i,
+	getSetAttribute = support.getSetAttribute,
+	getSetInput = support.input;
+
+jQuery.fn.extend( {
+	attr: function( name, value ) {
+		return access( this, jQuery.attr, name, value, arguments.length > 1 );
+	},
+
+	removeAttr: function( name ) {
+		return this.each( function() {
+			jQuery.removeAttr( this, name );
+		} );
+	}
+} );
+
+jQuery.extend( {
+	attr: function( elem, name, value ) {
+		var ret, hooks,
+			nType = elem.nodeType;
+
+		// Don't get/set attributes on text, comment and attribute nodes
+		if ( nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		// Fallback to prop when attributes are not supported
+		if ( typeof elem.getAttribute === "undefined" ) {
+			return jQuery.prop( elem, name, value );
+		}
+
+		// All attributes are lowercase
+		// Grab necessary hook if one is defined
+		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
+			name = name.toLowerCase();
+			hooks = jQuery.attrHooks[ name ] ||
+				( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );
+		}
+
+		if ( value !== undefined ) {
+			if ( value === null ) {
+				jQuery.removeAttr( elem, name );
+				return;
+			}
+
+			if ( hooks && "set" in hooks &&
+				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
+				return ret;
+			}
+
+			elem.setAttribute( name, value + "" );
+			return value;
+		}
+
+		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
+			return ret;
+		}
+
+		ret = jQuery.find.attr( elem, name );
+
+		// Non-existent attributes return null, we normalize to undefined
+		return ret == null ? undefined : ret;
+	},
+
+	attrHooks: {
+		type: {
+			set: function( elem, value ) {
+				if ( !support.radioValue && value === "radio" &&
+					jQuery.nodeName( elem, "input" ) ) {
+
+					// Setting the type on a radio button after the value resets the value in IE8-9
+					// Reset value to default in case type is set after value during creation
+					var val = elem.value;
+					elem.setAttribute( "type", value );
+					if ( val ) {
+						elem.value = val;
+					}
+					return value;
+				}
+			}
+		}
+	},
+
+	removeAttr: function( elem, value ) {
+		var name, propName,
+			i = 0,
+			attrNames = value && value.match( rnotwhite );
+
+		if ( attrNames && elem.nodeType === 1 ) {
+			while ( ( name = attrNames[ i++ ] ) ) {
+				propName = jQuery.propFix[ name ] || name;
+
+				// Boolean attributes get special treatment (#10870)
+				if ( jQuery.expr.match.bool.test( name ) ) {
+
+					// Set corresponding property to false
+					if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
+						elem[ propName ] = false;
+
+					// Support: IE<9
+					// Also clear defaultChecked/defaultSelected (if appropriate)
+					} else {
+						elem[ jQuery.camelCase( "default-" + name ) ] =
+							elem[ propName ] = false;
+					}
+
+				// See #9699 for explanation of this approach (setting first, then removal)
+				} else {
+					jQuery.attr( elem, name, "" );
+				}
+
+				elem.removeAttribute( getSetAttribute ? name : propName );
+			}
+		}
+	}
+} );
+
+// Hooks for boolean attributes
+boolHook = {
+	set: function( elem, value, name ) {
+		if ( value === false ) {
+
+			// Remove boolean attributes when set to false
+			jQuery.removeAttr( elem, name );
+		} else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
+
+			// IE<8 needs the *property* name
+			elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );
+
+		} else {
+
+			// Support: IE<9
+			// Use defaultChecked and defaultSelected for oldIE
+			elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true;
+		}
+		return name;
+	}
+};
+
+jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
+	var getter = attrHandle[ name ] || jQuery.find.attr;
+
+	if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
+		attrHandle[ name ] = function( elem, name, isXML ) {
+			var ret, handle;
+			if ( !isXML ) {
+
+				// Avoid an infinite loop by temporarily removing this function from the getter
+				handle = attrHandle[ name ];
+				attrHandle[ name ] = ret;
+				ret = getter( elem, name, isXML ) != null ?
+					name.toLowerCase() :
+					null;
+				attrHandle[ name ] = handle;
+			}
+			return ret;
+		};
+	} else {
+		attrHandle[ name ] = function( elem, name, isXML ) {
+			if ( !isXML ) {
+				return elem[ jQuery.camelCase( "default-" + name ) ] ?
+					name.toLowerCase() :
+					null;
+			}
+		};
+	}
+} );
+
+// fix oldIE attroperties
+if ( !getSetInput || !getSetAttribute ) {
+	jQuery.attrHooks.value = {
+		set: function( elem, value, name ) {
+			if ( jQuery.nodeName( elem, "input" ) ) {
+
+				// Does not return so that setAttribute is also used
+				elem.defaultValue = value;
+			} else {
+
+				// Use nodeHook if defined (#1954); otherwise setAttribute is fine
+				return nodeHook && nodeHook.set( elem, value, name );
+			}
+		}
+	};
+}
+
+// IE6/7 do not support getting/setting some attributes with get/setAttribute
+if ( !getSetAttribute ) {
+
+	// Use this for any attribute in IE6/7
+	// This fixes almost every IE6/7 issue
+	nodeHook = {
+		set: function( elem, value, name ) {
+
+			// Set the existing or create a new attribute node
+			var ret = elem.getAttributeNode( name );
+			if ( !ret ) {
+				elem.setAttributeNode(
+					( ret = elem.ownerDocument.createAttribute( name ) )
+				);
+			}
+
+			ret.value = value += "";
+
+			// Break association with cloned elements by also using setAttribute (#9646)
+			if ( name === "value" || value === elem.getAttribute( name ) ) {
+				return value;
+			}
+		}
+	};
+
+	// Some attributes are constructed with empty-string values when not defined
+	attrHandle.id = attrHandle.name = attrHandle.coords =
+		function( elem, name, isXML ) {
+			var ret;
+			if ( !isXML ) {
+				return ( ret = elem.getAttributeNode( name ) ) && ret.value !== "" ?
+					ret.value :
+					null;
+			}
+		};
+
+	// Fixing value retrieval on a button requires this module
+	jQuery.valHooks.button = {
+		get: function( elem, name ) {
+			var ret = elem.getAttributeNode( name );
+			if ( ret && ret.specified ) {
+				return ret.value;
+			}
+		},
+		set: nodeHook.set
+	};
+
+	// Set contenteditable to false on removals(#10429)
+	// Setting to empty string throws an error as an invalid value
+	jQuery.attrHooks.contenteditable = {
+		set: function( elem, value, name ) {
+			nodeHook.set( elem, value === "" ? false : value, name );
+		}
+	};
+
+	// Set width and height to auto instead of 0 on empty string( Bug #8150 )
+	// This is for removals
+	jQuery.each( [ "width", "height" ], function( i, name ) {
+		jQuery.attrHooks[ name ] = {
+			set: function( elem, value ) {
+				if ( value === "" ) {
+					elem.setAttribute( name, "auto" );
+					return value;
+				}
+			}
+		};
+	} );
+}
+
+if ( !support.style ) {
+	jQuery.attrHooks.style = {
+		get: function( elem ) {
+
+			// Return undefined in the case of empty string
+			// Note: IE uppercases css property names, but if we were to .toLowerCase()
+			// .cssText, that would destroy case sensitivity in URL's, like in "background"
+			return elem.style.cssText || undefined;
+		},
+		set: function( elem, value ) {
+			return ( elem.style.cssText = value + "" );
+		}
+	};
+}
+
+
+
+
+var rfocusable = /^(?:input|select|textarea|button|object)$/i,
+	rclickable = /^(?:a|area)$/i;
+
+jQuery.fn.extend( {
+	prop: function( name, value ) {
+		return access( this, jQuery.prop, name, value, arguments.length > 1 );
+	},
+
+	removeProp: function( name ) {
+		name = jQuery.propFix[ name ] || name;
+		return this.each( function() {
+
+			// try/catch handles cases where IE balks (such as removing a property on window)
+			try {
+				this[ name ] = undefined;
+				delete this[ name ];
+			} catch ( e ) {}
+		} );
+	}
+} );
+
+jQuery.extend( {
+	prop: function( elem, name, value ) {
+		var ret, hooks,
+			nType = elem.nodeType;
+
+		// Don't get/set properties on text, comment and attribute nodes
+		if ( nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
+
+			// Fix name and attach hooks
+			name = jQuery.propFix[ name ] || name;
+			hooks = jQuery.propHooks[ name ];
+		}
+
+		if ( value !== undefined ) {
+			if ( hooks && "set" in hooks &&
+				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
+				return ret;
+			}
+
+			return ( elem[ name ] = value );
+		}
+
+		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
+			return ret;
+		}
+
+		return elem[ name ];
+	},
+
+	propHooks: {
+		tabIndex: {
+			get: function( elem ) {
+
+				// elem.tabIndex doesn't always return the
+				// correct value when it hasn't been explicitly set
+				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+				// Use proper attribute retrieval(#12072)
+				var tabindex = jQuery.find.attr( elem, "tabindex" );
+
+				return tabindex ?
+					parseInt( tabindex, 10 ) :
+					rfocusable.test( elem.nodeName ) ||
+						rclickable.test( elem.nodeName ) && elem.href ?
+							0 :
+							-1;
+			}
+		}
+	},
+
+	propFix: {
+		"for": "htmlFor",
+		"class": "className"
+	}
+} );
+
+// Some attributes require a special call on IE
+// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !support.hrefNormalized ) {
+
+	// href/src property should get the full normalized URL (#10299/#12915)
+	jQuery.each( [ "href", "src" ], function( i, name ) {
+		jQuery.propHooks[ name ] = {
+			get: function( elem ) {
+				return elem.getAttribute( name, 4 );
+			}
+		};
+	} );
+}
+
+// Support: Safari, IE9+
+// Accessing the selectedIndex property
+// forces the browser to respect setting selected
+// on the option
+// The getter ensures a default option is selected
+// when in an optgroup
+if ( !support.optSelected ) {
+	jQuery.propHooks.selected = {
+		get: function( elem ) {
+			var parent = elem.parentNode;
+
+			if ( parent ) {
+				parent.selectedIndex;
+
+				// Make sure that it also works with optgroups, see #5701
+				if ( parent.parentNode ) {
+					parent.parentNode.selectedIndex;
+				}
+			}
+			return null;
+		},
+		set: function( elem ) {
+			var parent = elem.parentNode;
+			if ( parent ) {
+				parent.selectedIndex;
+
+				if ( parent.parentNode ) {
+					parent.parentNode.selectedIndex;
+				}
+			}
+		}
+	};
+}
+
+jQuery.each( [
+	"tabIndex",
+	"readOnly",
+	"maxLength",
+	"cellSpacing",
+	"cellPadding",
+	"rowSpan",
+	"colSpan",
+	"useMap",
+	"frameBorder",
+	"contentEditable"
+], function() {
+	jQuery.propFix[ this.toLowerCase() ] = this;
+} );
+
+// IE6/7 call enctype encoding
+if ( !support.enctype ) {
+	jQuery.propFix.enctype = "encoding";
+}
+
+
+
+
+var rclass = /[\t\r\n\f]/g;
+
+function getClass( elem ) {
+	return jQuery.attr( elem, "class" ) || "";
+}
+
+jQuery.fn.extend( {
+	addClass: function( value ) {
+		var classes, elem, cur, curValue, clazz, j, finalValue,
+			i = 0;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each( function( j ) {
+				jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
+			} );
+		}
+
+		if ( typeof value === "string" && value ) {
+			classes = value.match( rnotwhite ) || [];
+
+			while ( ( elem = this[ i++ ] ) ) {
+				curValue = getClass( elem );
+				cur = elem.nodeType === 1 &&
+					( " " + curValue + " " ).replace( rclass, " " );
+
+				if ( cur ) {
+					j = 0;
+					while ( ( clazz = classes[ j++ ] ) ) {
+						if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
+							cur += clazz + " ";
+						}
+					}
+
+					// only assign if different to avoid unneeded rendering.
+					finalValue = jQuery.trim( cur );
+					if ( curValue !== finalValue ) {
+						jQuery.attr( elem, "class", finalValue );
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	removeClass: function( value ) {
+		var classes, elem, cur, curValue, clazz, j, finalValue,
+			i = 0;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each( function( j ) {
+				jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
+			} );
+		}
+
+		if ( !arguments.length ) {
+			return this.attr( "class", "" );
+		}
+
+		if ( typeof value === "string" && value ) {
+			classes = value.match( rnotwhite ) || [];
+
+			while ( ( elem = this[ i++ ] ) ) {
+				curValue = getClass( elem );
+
+				// This expression is here for better compressibility (see addClass)
+				cur = elem.nodeType === 1 &&
+					( " " + curValue + " " ).replace( rclass, " " );
+
+				if ( cur ) {
+					j = 0;
+					while ( ( clazz = classes[ j++ ] ) ) {
+
+						// Remove *all* instances
+						while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
+							cur = cur.replace( " " + clazz + " ", " " );
+						}
+					}
+
+					// Only assign if different to avoid unneeded rendering.
+					finalValue = jQuery.trim( cur );
+					if ( curValue !== finalValue ) {
+						jQuery.attr( elem, "class", finalValue );
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	toggleClass: function( value, stateVal ) {
+		var type = typeof value;
+
+		if ( typeof stateVal === "boolean" && type === "string" ) {
+			return stateVal ? this.addClass( value ) : this.removeClass( value );
+		}
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each( function( i ) {
+				jQuery( this ).toggleClass(
+					value.call( this, i, getClass( this ), stateVal ),
+					stateVal
+				);
+			} );
+		}
+
+		return this.each( function() {
+			var className, i, self, classNames;
+
+			if ( type === "string" ) {
+
+				// Toggle individual class names
+				i = 0;
+				self = jQuery( this );
+				classNames = value.match( rnotwhite ) || [];
+
+				while ( ( className = classNames[ i++ ] ) ) {
+
+					// Check each className given, space separated list
+					if ( self.hasClass( className ) ) {
+						self.removeClass( className );
+					} else {
+						self.addClass( className );
+					}
+				}
+
+			// Toggle whole class name
+			} else if ( value === undefined || type === "boolean" ) {
+				className = getClass( this );
+				if ( className ) {
+
+					// store className if set
+					jQuery._data( this, "__className__", className );
+				}
+
+				// If the element has a class name or if we're passed "false",
+				// then remove the whole classname (if there was one, the above saved it).
+				// Otherwise bring back whatever was previously saved (if anything),
+				// falling back to the empty string if nothing was stored.
+				jQuery.attr( this, "class",
+					className || value === false ?
+					"" :
+					jQuery._data( this, "__className__" ) || ""
+				);
+			}
+		} );
+	},
+
+	hasClass: function( selector ) {
+		var className, elem,
+			i = 0;
+
+		className = " " + selector + " ";
+		while ( ( elem = this[ i++ ] ) ) {
+			if ( elem.nodeType === 1 &&
+				( " " + getClass( elem ) + " " ).replace( rclass, " " )
+					.indexOf( className ) > -1
+			) {
+				return true;
+			}
+		}
+
+		return false;
+	}
+} );
+
+
+
+
+// Return jQuery for attributes-only inclusion
+
+
+jQuery.each( ( "blur focus focusin focusout load resize scroll unload click dblclick " +
+	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+	"change select submit keydown keypress keyup error contextmenu" ).split( " " ),
+	function( i, name ) {
+
+	// Handle event binding
+	jQuery.fn[ name ] = function( data, fn ) {
+		return arguments.length > 0 ?
+			this.on( name, null, data, fn ) :
+			this.trigger( name );
+	};
+} );
+
+jQuery.fn.extend( {
+	hover: function( fnOver, fnOut ) {
+		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+	}
+} );
+
+
+var location = window.location;
+
+var nonce = jQuery.now();
+
+var rquery = ( /\?/ );
+
+
+
+var rvalidtokens = /(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;
+
+jQuery.parseJSON = function( data ) {
+
+	// Attempt to parse using the native JSON parser first
+	if ( window.JSON && window.JSON.parse ) {
+
+		// Support: Android 2.3
+		// Workaround failure to string-cast null input
+		return window.JSON.parse( data + "" );
+	}
+
+	var requireNonComma,
+		depth = null,
+		str = jQuery.trim( data + "" );
+
+	// Guard against invalid (and possibly dangerous) input by ensuring that nothing remains
+	// after removing valid tokens
+	return str && !jQuery.trim( str.replace( rvalidtokens, function( token, comma, open, close ) {
+
+		// Force termination if we see a misplaced comma
+		if ( requireNonComma && comma ) {
+			depth = 0;
+		}
+
+		// Perform no more replacements after returning to outermost depth
+		if ( depth === 0 ) {
+			return token;
+		}
+
+		// Commas must not follow "[", "{", or ","
+		requireNonComma = open || comma;
+
+		// Determine new depth
+		// array/object open ("[" or "{"): depth += true - false (increment)
+		// array/object close ("]" or "}"): depth += false - true (decrement)
+		// other cases ("," or primitive): depth += true - true (numeric cast)
+		depth += !close - !open;
+
+		// Remove this token
+		return "";
+	} ) ) ?
+		( Function( "return " + str ) )() :
+		jQuery.error( "Invalid JSON: " + data );
+};
+
+
+// Cross-browser xml parsing
+jQuery.parseXML = function( data ) {
+	var xml, tmp;
+	if ( !data || typeof data !== "string" ) {
+		return null;
+	}
+	try {
+		if ( window.DOMParser ) { // Standard
+			tmp = new window.DOMParser();
+			xml = tmp.parseFromString( data, "text/xml" );
+		} else { // IE
+			xml = new window.ActiveXObject( "Microsoft.XMLDOM" );
+			xml.async = "false";
+			xml.loadXML( data );
+		}
+	} catch ( e ) {
+		xml = undefined;
+	}
+	if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
+		jQuery.error( "Invalid XML: " + data );
+	}
+	return xml;
+};
+
+
+var
+	rhash = /#.*$/,
+	rts = /([?&])_=[^&]*/,
+
+	// IE leaves an \r character at EOL
+	rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg,
+
+	// #7653, #8125, #8152: local protocol detection
+	rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
+	rnoContent = /^(?:GET|HEAD)$/,
+	rprotocol = /^\/\//,
+	rurl = /^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,
+
+	/* Prefilters
+	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+	 * 2) These are called:
+	 *    - BEFORE asking for a transport
+	 *    - AFTER param serialization (s.data is a string if s.processData is true)
+	 * 3) key is the dataType
+	 * 4) the catchall symbol "*" can be used
+	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
+	 */
+	prefilters = {},
+
+	/* Transports bindings
+	 * 1) key is the dataType
+	 * 2) the catchall symbol "*" can be used
+	 * 3) selection will start with transport dataType and THEN go to "*" if needed
+	 */
+	transports = {},
+
+	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+	allTypes = "*/".concat( "*" ),
+
+	// Document location
+	ajaxLocation = location.href,
+
+	// Segment location into parts
+	ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
+
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+function addToPrefiltersOrTransports( structure ) {
+
+	// dataTypeExpression is optional and defaults to "*"
+	return function( dataTypeExpression, func ) {
+
+		if ( typeof dataTypeExpression !== "string" ) {
+			func = dataTypeExpression;
+			dataTypeExpression = "*";
+		}
+
+		var dataType,
+			i = 0,
+			dataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];
+
+		if ( jQuery.isFunction( func ) ) {
+
+			// For each dataType in the dataTypeExpression
+			while ( ( dataType = dataTypes[ i++ ] ) ) {
+
+				// Prepend if requested
+				if ( dataType.charAt( 0 ) === "+" ) {
+					dataType = dataType.slice( 1 ) || "*";
+					( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );
+
+				// Otherwise append
+				} else {
+					( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
+				}
+			}
+		}
+	};
+}
+
+// Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
+
+	var inspected = {},
+		seekingTransport = ( structure === transports );
+
+	function inspect( dataType ) {
+		var selected;
+		inspected[ dataType ] = true;
+		jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
+			var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
+			if ( typeof dataTypeOrTransport === "string" &&
+				!seekingTransport && !inspected[ dataTypeOrTransport ] ) {
+
+				options.dataTypes.unshift( dataTypeOrTransport );
+				inspect( dataTypeOrTransport );
+				return false;
+			} else if ( seekingTransport ) {
+				return !( selected = dataTypeOrTransport );
+			}
+		} );
+		return selected;
+	}
+
+	return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
+}
+
+// A special extend for ajax options
+// that takes "flat" options (not to be deep extended)
+// Fixes #9887
+function ajaxExtend( target, src ) {
+	var deep, key,
+		flatOptions = jQuery.ajaxSettings.flatOptions || {};
+
+	for ( key in src ) {
+		if ( src[ key ] !== undefined ) {
+			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
+		}
+	}
+	if ( deep ) {
+		jQuery.extend( true, target, deep );
+	}
+
+	return target;
+}
+
+/* Handles responses to an ajax request:
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+	var firstDataType, ct, finalDataType, type,
+		contents = s.contents,
+		dataTypes = s.dataTypes;
+
+	// Remove auto dataType and get content-type in the process
+	while ( dataTypes[ 0 ] === "*" ) {
+		dataTypes.shift();
+		if ( ct === undefined ) {
+			ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
+		}
+	}
+
+	// Check if we're dealing with a known content-type
+	if ( ct ) {
+		for ( type in contents ) {
+			if ( contents[ type ] && contents[ type ].test( ct ) ) {
+				dataTypes.unshift( type );
+				break;
+			}
+		}
+	}
+
+	// Check to see if we have a response for the expected dataType
+	if ( dataTypes[ 0 ] in responses ) {
+		finalDataType = dataTypes[ 0 ];
+	} else {
+
+		// Try convertible dataTypes
+		for ( type in responses ) {
+			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
+				finalDataType = type;
+				break;
+			}
+			if ( !firstDataType ) {
+				firstDataType = type;
+			}
+		}
+
+		// Or just use first one
+		finalDataType = finalDataType || firstDataType;
+	}
+
+	// If we found a dataType
+	// We add the dataType to the list if needed
+	// and return the corresponding response
+	if ( finalDataType ) {
+		if ( finalDataType !== dataTypes[ 0 ] ) {
+			dataTypes.unshift( finalDataType );
+		}
+		return responses[ finalDataType ];
+	}
+}
+
+/* Chain conversions given the request and the original response
+ * Also sets the responseXXX fields on the jqXHR instance
+ */
+function ajaxConvert( s, response, jqXHR, isSuccess ) {
+	var conv2, current, conv, tmp, prev,
+		converters = {},
+
+		// Work with a copy of dataTypes in case we need to modify it for conversion
+		dataTypes = s.dataTypes.slice();
+
+	// Create converters map with lowercased keys
+	if ( dataTypes[ 1 ] ) {
+		for ( conv in s.converters ) {
+			converters[ conv.toLowerCase() ] = s.converters[ conv ];
+		}
+	}
+
+	current = dataTypes.shift();
+
+	// Convert to each sequential dataType
+	while ( current ) {
+
+		if ( s.responseFields[ current ] ) {
+			jqXHR[ s.responseFields[ current ] ] = response;
+		}
+
+		// Apply the dataFilter if provided
+		if ( !prev && isSuccess && s.dataFilter ) {
+			response = s.dataFilter( response, s.dataType );
+		}
+
+		prev = current;
+		current = dataTypes.shift();
+
+		if ( current ) {
+
+			// There's only work to do if current dataType is non-auto
+			if ( current === "*" ) {
+
+				current = prev;
+
+			// Convert response if prev dataType is non-auto and differs from current
+			} else if ( prev !== "*" && prev !== current ) {
+
+				// Seek a direct converter
+				conv = converters[ prev + " " + current ] || converters[ "* " + current ];
+
+				// If none found, seek a pair
+				if ( !conv ) {
+					for ( conv2 in converters ) {
+
+						// If conv2 outputs current
+						tmp = conv2.split( " " );
+						if ( tmp[ 1 ] === current ) {
+
+							// If prev can be converted to accepted input
+							conv = converters[ prev + " " + tmp[ 0 ] ] ||
+								converters[ "* " + tmp[ 0 ] ];
+							if ( conv ) {
+
+								// Condense equivalence converters
+								if ( conv === true ) {
+									conv = converters[ conv2 ];
+
+								// Otherwise, insert the intermediate dataType
+								} else if ( converters[ conv2 ] !== true ) {
+									current = tmp[ 0 ];
+									dataTypes.unshift( tmp[ 1 ] );
+								}
+								break;
+							}
+						}
+					}
+				}
+
+				// Apply converter (if not an equivalence)
+				if ( conv !== true ) {
+
+					// Unless errors are allowed to bubble, catch and return them
+					if ( conv && s[ "throws" ] ) { // jscs:ignore requireDotNotation
+						response = conv( response );
+					} else {
+						try {
+							response = conv( response );
+						} catch ( e ) {
+							return {
+								state: "parsererror",
+								error: conv ? e : "No conversion from " + prev + " to " + current
+							};
+						}
+					}
+				}
+			}
+		}
+	}
+
+	return { state: "success", data: response };
+}
+
+jQuery.extend( {
+
+	// Counter for holding the number of active queries
+	active: 0,
+
+	// Last-Modified header cache for next request
+	lastModified: {},
+	etag: {},
+
+	ajaxSettings: {
+		url: ajaxLocation,
+		type: "GET",
+		isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
+		global: true,
+		processData: true,
+		async: true,
+		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
+		/*
+		timeout: 0,
+		data: null,
+		dataType: null,
+		username: null,
+		password: null,
+		cache: null,
+		throws: false,
+		traditional: false,
+		headers: {},
+		*/
+
+		accepts: {
+			"*": allTypes,
+			text: "text/plain",
+			html: "text/html",
+			xml: "application/xml, text/xml",
+			json: "application/json, text/javascript"
+		},
+
+		contents: {
+			xml: /\bxml\b/,
+			html: /\bhtml/,
+			json: /\bjson\b/
+		},
+
+		responseFields: {
+			xml: "responseXML",
+			text: "responseText",
+			json: "responseJSON"
+		},
+
+		// Data converters
+		// Keys separate source (or catchall "*") and destination types with a single space
+		converters: {
+
+			// Convert anything to text
+			"* text": String,
+
+			// Text to html (true = no transformation)
+			"text html": true,
+
+			// Evaluate text as a json expression
+			"text json": jQuery.parseJSON,
+
+			// Parse text as xml
+			"text xml": jQuery.parseXML
+		},
+
+		// For options that shouldn't be deep extended:
+		// you can add your own custom options here if
+		// and when you create one that shouldn't be
+		// deep extended (see ajaxExtend)
+		flatOptions: {
+			url: true,
+			context: true
+		}
+	},
+
+	// Creates a full fledged settings object into target
+	// with both ajaxSettings and settings fields.
+	// If target is omitted, writes into ajaxSettings.
+	ajaxSetup: function( target, settings ) {
+		return settings ?
+
+			// Building a settings object
+			ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
+
+			// Extending ajaxSettings
+			ajaxExtend( jQuery.ajaxSettings, target );
+	},
+
+	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+	ajaxTransport: addToPrefiltersOrTransports( transports ),
+
+	// Main method
+	ajax: function( url, options ) {
+
+		// If url is an object, simulate pre-1.5 signature
+		if ( typeof url === "object" ) {
+			options = url;
+			url = undefined;
+		}
+
+		// Force options to be an object
+		options = options || {};
+
+		var
+
+			// Cross-domain detection vars
+			parts,
+
+			// Loop variable
+			i,
+
+			// URL without anti-cache param
+			cacheURL,
+
+			// Response headers as string
+			responseHeadersString,
+
+			// timeout handle
+			timeoutTimer,
+
+			// To know if global events are to be dispatched
+			fireGlobals,
+
+			transport,
+
+			// Response headers
+			responseHeaders,
+
+			// Create the final options object
+			s = jQuery.ajaxSetup( {}, options ),
+
+			// Callbacks context
+			callbackContext = s.context || s,
+
+			// Context for global events is callbackContext if it is a DOM node or jQuery collection
+			globalEventContext = s.context &&
+				( callbackContext.nodeType || callbackContext.jquery ) ?
+					jQuery( callbackContext ) :
+					jQuery.event,
+
+			// Deferreds
+			deferred = jQuery.Deferred(),
+			completeDeferred = jQuery.Callbacks( "once memory" ),
+
+			// Status-dependent callbacks
+			statusCode = s.statusCode || {},
+
+			// Headers (they are sent all at once)
+			requestHeaders = {},
+			requestHeadersNames = {},
+
+			// The jqXHR state
+			state = 0,
+
+			// Default abort message
+			strAbort = "canceled",
+
+			// Fake xhr
+			jqXHR = {
+				readyState: 0,
+
+				// Builds headers hashtable if needed
+				getResponseHeader: function( key ) {
+					var match;
+					if ( state === 2 ) {
+						if ( !responseHeaders ) {
+							responseHeaders = {};
+							while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
+								responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];
+							}
+						}
+						match = responseHeaders[ key.toLowerCase() ];
+					}
+					return match == null ? null : match;
+				},
+
+				// Raw string
+				getAllResponseHeaders: function() {
+					return state === 2 ? responseHeadersString : null;
+				},
+
+				// Caches the header
+				setRequestHeader: function( name, value ) {
+					var lname = name.toLowerCase();
+					if ( !state ) {
+						name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
+						requestHeaders[ name ] = value;
+					}
+					return this;
+				},
+
+				// Overrides response content-type header
+				overrideMimeType: function( type ) {
+					if ( !state ) {
+						s.mimeType = type;
+					}
+					return this;
+				},
+
+				// Status-dependent callbacks
+				statusCode: function( map ) {
+					var code;
+					if ( map ) {
+						if ( state < 2 ) {
+							for ( code in map ) {
+
+								// Lazy-add the new callback in a way that preserves old ones
+								statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
+							}
+						} else {
+
+							// Execute the appropriate callbacks
+							jqXHR.always( map[ jqXHR.status ] );
+						}
+					}
+					return this;
+				},
+
+				// Cancel the request
+				abort: function( statusText ) {
+					var finalText = statusText || strAbort;
+					if ( transport ) {
+						transport.abort( finalText );
+					}
+					done( 0, finalText );
+					return this;
+				}
+			};
+
+		// Attach deferreds
+		deferred.promise( jqXHR ).complete = completeDeferred.add;
+		jqXHR.success = jqXHR.done;
+		jqXHR.error = jqXHR.fail;
+
+		// Remove hash character (#7531: and string promotion)
+		// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
+		// Handle falsy url in the settings object (#10093: consistency with old signature)
+		// We also use the url parameter if available
+		s.url = ( ( url || s.url || ajaxLocation ) + "" )
+			.replace( rhash, "" )
+			.replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+		// Alias method option to type as per ticket #12004
+		s.type = options.method || options.type || s.method || s.type;
+
+		// Extract dataTypes list
+		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( rnotwhite ) || [ "" ];
+
+		// A cross-domain request is in order when we have a protocol:host:port mismatch
+		if ( s.crossDomain == null ) {
+			parts = rurl.exec( s.url.toLowerCase() );
+			s.crossDomain = !!( parts &&
+				( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
+					( parts[ 3 ] || ( parts[ 1 ] === "http:" ? "80" : "443" ) ) !==
+						( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? "80" : "443" ) ) )
+			);
+		}
+
+		// Convert data if not already a string
+		if ( s.data && s.processData && typeof s.data !== "string" ) {
+			s.data = jQuery.param( s.data, s.traditional );
+		}
+
+		// Apply prefilters
+		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
+
+		// If request was aborted inside a prefilter, stop there
+		if ( state === 2 ) {
+			return jqXHR;
+		}
+
+		// We can fire global events as of now if asked to
+		// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
+		fireGlobals = jQuery.event && s.global;
+
+		// Watch for a new set of requests
+		if ( fireGlobals && jQuery.active++ === 0 ) {
+			jQuery.event.trigger( "ajaxStart" );
+		}
+
+		// Uppercase the type
+		s.type = s.type.toUpperCase();
+
+		// Determine if request has content
+		s.hasContent = !rnoContent.test( s.type );
+
+		// Save the URL in case we're toying with the If-Modified-Since
+		// and/or If-None-Match header later on
+		cacheURL = s.url;
+
+		// More options handling for requests with no content
+		if ( !s.hasContent ) {
+
+			// If data is available, append data to url
+			if ( s.data ) {
+				cacheURL = ( s.url += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
+
+				// #9682: remove data so that it's not used in an eventual retry
+				delete s.data;
+			}
+
+			// Add anti-cache in url if needed
+			if ( s.cache === false ) {
+				s.url = rts.test( cacheURL ) ?
+
+					// If there is already a '_' parameter, set its value
+					cacheURL.replace( rts, "$1_=" + nonce++ ) :
+
+					// Otherwise add one to the end
+					cacheURL + ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + nonce++;
+			}
+		}
+
+		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+		if ( s.ifModified ) {
+			if ( jQuery.lastModified[ cacheURL ] ) {
+				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
+			}
+			if ( jQuery.etag[ cacheURL ] ) {
+				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
+			}
+		}
+
+		// Set the correct header, if data is being sent
+		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+			jqXHR.setRequestHeader( "Content-Type", s.contentType );
+		}
+
+		// Set the Accepts header for the server, depending on the dataType
+		jqXHR.setRequestHeader(
+			"Accept",
+			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
+				s.accepts[ s.dataTypes[ 0 ] ] +
+					( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
+				s.accepts[ "*" ]
+		);
+
+		// Check for headers option
+		for ( i in s.headers ) {
+			jqXHR.setRequestHeader( i, s.headers[ i ] );
+		}
+
+		// Allow custom headers/mimetypes and early abort
+		if ( s.beforeSend &&
+			( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
+
+			// Abort if not done already and return
+			return jqXHR.abort();
+		}
+
+		// aborting is no longer a cancellation
+		strAbort = "abort";
+
+		// Install callbacks on deferreds
+		for ( i in { success: 1, error: 1, complete: 1 } ) {
+			jqXHR[ i ]( s[ i ] );
+		}
+
+		// Get transport
+		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+
+		// If no transport, we auto-abort
+		if ( !transport ) {
+			done( -1, "No Transport" );
+		} else {
+			jqXHR.readyState = 1;
+
+			// Send global event
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+			}
+
+			// If request was aborted inside ajaxSend, stop there
+			if ( state === 2 ) {
+				return jqXHR;
+			}
+
+			// Timeout
+			if ( s.async && s.timeout > 0 ) {
+				timeoutTimer = window.setTimeout( function() {
+					jqXHR.abort( "timeout" );
+				}, s.timeout );
+			}
+
+			try {
+				state = 1;
+				transport.send( requestHeaders, done );
+			} catch ( e ) {
+
+				// Propagate exception as error if not done
+				if ( state < 2 ) {
+					done( -1, e );
+
+				// Simply rethrow otherwise
+				} else {
+					throw e;
+				}
+			}
+		}
+
+		// Callback for when everything is done
+		function done( status, nativeStatusText, responses, headers ) {
+			var isSuccess, success, error, response, modified,
+				statusText = nativeStatusText;
+
+			// Called once
+			if ( state === 2 ) {
+				return;
+			}
+
+			// State is "done" now
+			state = 2;
+
+			// Clear timeout if it exists
+			if ( timeoutTimer ) {
+				window.clearTimeout( timeoutTimer );
+			}
+
+			// Dereference transport for early garbage collection
+			// (no matter how long the jqXHR object will be used)
+			transport = undefined;
+
+			// Cache response headers
+			responseHeadersString = headers || "";
+
+			// Set readyState
+			jqXHR.readyState = status > 0 ? 4 : 0;
+
+			// Determine if successful
+			isSuccess = status >= 200 && status < 300 || status === 304;
+
+			// Get response data
+			if ( responses ) {
+				response = ajaxHandleResponses( s, jqXHR, responses );
+			}
+
+			// Convert no matter what (that way responseXXX fields are always set)
+			response = ajaxConvert( s, response, jqXHR, isSuccess );
+
+			// If successful, handle type chaining
+			if ( isSuccess ) {
+
+				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+				if ( s.ifModified ) {
+					modified = jqXHR.getResponseHeader( "Last-Modified" );
+					if ( modified ) {
+						jQuery.lastModified[ cacheURL ] = modified;
+					}
+					modified = jqXHR.getResponseHeader( "etag" );
+					if ( modified ) {
+						jQuery.etag[ cacheURL ] = modified;
+					}
+				}
+
+				// if no content
+				if ( status === 204 || s.type === "HEAD" ) {
+					statusText = "nocontent";
+
+				// if not modified
+				} else if ( status === 304 ) {
+					statusText = "notmodified";
+
+				// If we have data, let's convert it
+				} else {
+					statusText = response.state;
+					success = response.data;
+					error = response.error;
+					isSuccess = !error;
+				}
+			} else {
+
+				// We extract error from statusText
+				// then normalize statusText and status for non-aborts
+				error = statusText;
+				if ( status || !statusText ) {
+					statusText = "error";
+					if ( status < 0 ) {
+						status = 0;
+					}
+				}
+			}
+
+			// Set data for the fake xhr object
+			jqXHR.status = status;
+			jqXHR.statusText = ( nativeStatusText || statusText ) + "";
+
+			// Success/Error
+			if ( isSuccess ) {
+				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+			} else {
+				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+			}
+
+			// Status-dependent callbacks
+			jqXHR.statusCode( statusCode );
+			statusCode = undefined;
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
+					[ jqXHR, s, isSuccess ? success : error ] );
+			}
+
+			// Complete
+			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+
+				// Handle the global AJAX counter
+				if ( !( --jQuery.active ) ) {
+					jQuery.event.trigger( "ajaxStop" );
+				}
+			}
+		}
+
+		return jqXHR;
+	},
+
+	getJSON: function( url, data, callback ) {
+		return jQuery.get( url, data, callback, "json" );
+	},
+
+	getScript: function( url, callback ) {
+		return jQuery.get( url, undefined, callback, "script" );
+	}
+} );
+
+jQuery.each( [ "get", "post" ], function( i, method ) {
+	jQuery[ method ] = function( url, data, callback, type ) {
+
+		// shift arguments if data argument was omitted
+		if ( jQuery.isFunction( data ) ) {
+			type = type || callback;
+			callback = data;
+			data = undefined;
+		}
+
+		// The url can be an options object (which then must have .url)
+		return jQuery.ajax( jQuery.extend( {
+			url: url,
+			type: method,
+			dataType: type,
+			data: data,
+			success: callback
+		}, jQuery.isPlainObject( url ) && url ) );
+	};
+} );
+
+
+jQuery._evalUrl = function( url ) {
+	return jQuery.ajax( {
+		url: url,
+
+		// Make this explicit, since user can override this through ajaxSetup (#11264)
+		type: "GET",
+		dataType: "script",
+		cache: true,
+		async: false,
+		global: false,
+		"throws": true
+	} );
+};
+
+
+jQuery.fn.extend( {
+	wrapAll: function( html ) {
+		if ( jQuery.isFunction( html ) ) {
+			return this.each( function( i ) {
+				jQuery( this ).wrapAll( html.call( this, i ) );
+			} );
+		}
+
+		if ( this[ 0 ] ) {
+
+			// The elements to wrap the target around
+			var wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
+
+			if ( this[ 0 ].parentNode ) {
+				wrap.insertBefore( this[ 0 ] );
+			}
+
+			wrap.map( function() {
+				var elem = this;
+
+				while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
+					elem = elem.firstChild;
+				}
+
+				return elem;
+			} ).append( this );
+		}
+
+		return this;
+	},
+
+	wrapInner: function( html ) {
+		if ( jQuery.isFunction( html ) ) {
+			return this.each( function( i ) {
+				jQuery( this ).wrapInner( html.call( this, i ) );
+			} );
+		}
+
+		return this.each( function() {
+			var self = jQuery( this ),
+				contents = self.contents();
+
+			if ( contents.length ) {
+				contents.wrapAll( html );
+
+			} else {
+				self.append( html );
+			}
+		} );
+	},
+
+	wrap: function( html ) {
+		var isFunction = jQuery.isFunction( html );
+
+		return this.each( function( i ) {
+			jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html );
+		} );
+	},
+
+	unwrap: function() {
+		return this.parent().each( function() {
+			if ( !jQuery.nodeName( this, "body" ) ) {
+				jQuery( this ).replaceWith( this.childNodes );
+			}
+		} ).end();
+	}
+} );
+
+
+function getDisplay( elem ) {
+	return elem.style && elem.style.display || jQuery.css( elem, "display" );
+}
+
+function filterHidden( elem ) {
+	while ( elem && elem.nodeType === 1 ) {
+		if ( getDisplay( elem ) === "none" || elem.type === "hidden" ) {
+			return true;
+		}
+		elem = elem.parentNode;
+	}
+	return false;
+}
+
+jQuery.expr.filters.hidden = function( elem ) {
+
+	// Support: Opera <= 12.12
+	// Opera reports offsetWidths and offsetHeights less than zero on some elements
+	return support.reliableHiddenOffsets() ?
+		( elem.offsetWidth <= 0 && elem.offsetHeight <= 0 &&
+			!elem.getClientRects().length ) :
+			filterHidden( elem );
+};
+
+jQuery.expr.filters.visible = function( elem ) {
+	return !jQuery.expr.filters.hidden( elem );
+};
+
+
+
+
+var r20 = /%20/g,
+	rbracket = /\[\]$/,
+	rCRLF = /\r?\n/g,
+	rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
+	rsubmittable = /^(?:input|select|textarea|keygen)/i;
+
+function buildParams( prefix, obj, traditional, add ) {
+	var name;
+
+	if ( jQuery.isArray( obj ) ) {
+
+		// Serialize array item.
+		jQuery.each( obj, function( i, v ) {
+			if ( traditional || rbracket.test( prefix ) ) {
+
+				// Treat each array item as a scalar.
+				add( prefix, v );
+
+			} else {
+
+				// Item is non-scalar (array or object), encode its numeric index.
+				buildParams(
+					prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
+					v,
+					traditional,
+					add
+				);
+			}
+		} );
+
+	} else if ( !traditional && jQuery.type( obj ) === "object" ) {
+
+		// Serialize object item.
+		for ( name in obj ) {
+			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+		}
+
+	} else {
+
+		// Serialize scalar item.
+		add( prefix, obj );
+	}
+}
+
+// Serialize an array of form elements or a set of
+// key/values into a query string
+jQuery.param = function( a, traditional ) {
+	var prefix,
+		s = [],
+		add = function( key, value ) {
+
+			// If value is a function, invoke it and return its value
+			value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
+			s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+		};
+
+	// Set traditional to true for jQuery <= 1.3.2 behavior.
+	if ( traditional === undefined ) {
+		traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
+	}
+
+	// If an array was passed in, assume that it is an array of form elements.
+	if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+
+		// Serialize the form elements
+		jQuery.each( a, function() {
+			add( this.name, this.value );
+		} );
+
+	} else {
+
+		// If traditional, encode the "old" way (the way 1.3.2 or older
+		// did it), otherwise encode params recursively.
+		for ( prefix in a ) {
+			buildParams( prefix, a[ prefix ], traditional, add );
+		}
+	}
+
+	// Return the resulting serialization
+	return s.join( "&" ).replace( r20, "+" );
+};
+
+jQuery.fn.extend( {
+	serialize: function() {
+		return jQuery.param( this.serializeArray() );
+	},
+	serializeArray: function() {
+		return this.map( function() {
+
+			// Can add propHook for "elements" to filter or add form elements
+			var elements = jQuery.prop( this, "elements" );
+			return elements ? jQuery.makeArray( elements ) : this;
+		} )
+		.filter( function() {
+			var type = this.type;
+
+			// Use .is(":disabled") so that fieldset[disabled] works
+			return this.name && !jQuery( this ).is( ":disabled" ) &&
+				rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
+				( this.checked || !rcheckableType.test( type ) );
+		} )
+		.map( function( i, elem ) {
+			var val = jQuery( this ).val();
+
+			return val == null ?
+				null :
+				jQuery.isArray( val ) ?
+					jQuery.map( val, function( val ) {
+						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+					} ) :
+					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+		} ).get();
+	}
+} );
+
+
+// Create the request object
+// (This is still attached to ajaxSettings for backward compatibility)
+jQuery.ajaxSettings.xhr = window.ActiveXObject !== undefined ?
+
+	// Support: IE6-IE8
+	function() {
+
+		// XHR cannot access local files, always use ActiveX for that case
+		if ( this.isLocal ) {
+			return createActiveXHR();
+		}
+
+		// Support: IE 9-11
+		// IE seems to error on cross-domain PATCH requests when ActiveX XHR
+		// is used. In IE 9+ always use the native XHR.
+		// Note: this condition won't catch Edge as it doesn't define
+		// document.documentMode but it also doesn't support ActiveX so it won't
+		// reach this code.
+		if ( document.documentMode > 8 ) {
+			return createStandardXHR();
+		}
+
+		// Support: IE<9
+		// oldIE XHR does not support non-RFC2616 methods (#13240)
+		// See http://msdn.microsoft.com/en-us/library/ie/ms536648(v=vs.85).aspx
+		// and http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9
+		// Although this check for six methods instead of eight
+		// since IE also does not support "trace" and "connect"
+		return /^(get|post|head|put|delete|options)$/i.test( this.type ) &&
+			createStandardXHR() || createActiveXHR();
+	} :
+
+	// For all other browsers, use the standard XMLHttpRequest object
+	createStandardXHR;
+
+var xhrId = 0,
+	xhrCallbacks = {},
+	xhrSupported = jQuery.ajaxSettings.xhr();
+
+// Support: IE<10
+// Open requests must be manually aborted on unload (#5280)
+// See https://support.microsoft.com/kb/2856746 for more info
+if ( window.attachEvent ) {
+	window.attachEvent( "onunload", function() {
+		for ( var key in xhrCallbacks ) {
+			xhrCallbacks[ key ]( undefined, true );
+		}
+	} );
+}
+
+// Determine support properties
+support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
+xhrSupported = support.ajax = !!xhrSupported;
+
+// Create transport if the browser can provide an xhr
+if ( xhrSupported ) {
+
+	jQuery.ajaxTransport( function( options ) {
+
+		// Cross domain only allowed if supported through XMLHttpRequest
+		if ( !options.crossDomain || support.cors ) {
+
+			var callback;
+
+			return {
+				send: function( headers, complete ) {
+					var i,
+						xhr = options.xhr(),
+						id = ++xhrId;
+
+					// Open the socket
+					xhr.open(
+						options.type,
+						options.url,
+						options.async,
+						options.username,
+						options.password
+					);
+
+					// Apply custom fields if provided
+					if ( options.xhrFields ) {
+						for ( i in options.xhrFields ) {
+							xhr[ i ] = options.xhrFields[ i ];
+						}
+					}
+
+					// Override mime type if needed
+					if ( options.mimeType && xhr.overrideMimeType ) {
+						xhr.overrideMimeType( options.mimeType );
+					}
+
+					// X-Requested-With header
+					// For cross-domain requests, seeing as conditions for a preflight are
+					// akin to a jigsaw puzzle, we simply never set it to be sure.
+					// (it can always be set on a per-request basis or even using ajaxSetup)
+					// For same-domain requests, won't change header if already provided.
+					if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
+						headers[ "X-Requested-With" ] = "XMLHttpRequest";
+					}
+
+					// Set headers
+					for ( i in headers ) {
+
+						// Support: IE<9
+						// IE's ActiveXObject throws a 'Type Mismatch' exception when setting
+						// request header to a null-value.
+						//
+						// To keep consistent with other XHR implementations, cast the value
+						// to string and ignore `undefined`.
+						if ( headers[ i ] !== undefined ) {
+							xhr.setRequestHeader( i, headers[ i ] + "" );
+						}
+					}
+
+					// Do send the request
+					// This may raise an exception which is actually
+					// handled in jQuery.ajax (so no try/catch here)
+					xhr.send( ( options.hasContent && options.data ) || null );
+
+					// Listener
+					callback = function( _, isAbort ) {
+						var status, statusText, responses;
+
+						// Was never called and is aborted or complete
+						if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
+
+							// Clean up
+							delete xhrCallbacks[ id ];
+							callback = undefined;
+							xhr.onreadystatechange = jQuery.noop;
+
+							// Abort manually if needed
+							if ( isAbort ) {
+								if ( xhr.readyState !== 4 ) {
+									xhr.abort();
+								}
+							} else {
+								responses = {};
+								status = xhr.status;
+
+								// Support: IE<10
+								// Accessing binary-data responseText throws an exception
+								// (#11426)
+								if ( typeof xhr.responseText === "string" ) {
+									responses.text = xhr.responseText;
+								}
+
+								// Firefox throws an exception when accessing
+								// statusText for faulty cross-domain requests
+								try {
+									statusText = xhr.statusText;
+								} catch ( e ) {
+
+									// We normalize with Webkit giving an empty statusText
+									statusText = "";
+								}
+
+								// Filter status for non standard behaviors
+
+								// If the request is local and we have data: assume a success
+								// (success with no data won't get notified, that's the best we
+								// can do given current implementations)
+								if ( !status && options.isLocal && !options.crossDomain ) {
+									status = responses.text ? 200 : 404;
+
+								// IE - #1450: sometimes returns 1223 when it should be 204
+								} else if ( status === 1223 ) {
+									status = 204;
+								}
+							}
+						}
+
+						// Call complete if needed
+						if ( responses ) {
+							complete( status, statusText, responses, xhr.getAllResponseHeaders() );
+						}
+					};
+
+					// Do send the request
+					// `xhr.send` may raise an exception, but it will be
+					// handled in jQuery.ajax (so no try/catch here)
+					if ( !options.async ) {
+
+						// If we're in sync mode we fire the callback
+						callback();
+					} else if ( xhr.readyState === 4 ) {
+
+						// (IE6 & IE7) if it's in cache and has been
+						// retrieved directly we need to fire the callback
+						window.setTimeout( callback );
+					} else {
+
+						// Register the callback, but delay it in case `xhr.send` throws
+						// Add to the list of active xhr callbacks
+						xhr.onreadystatechange = xhrCallbacks[ id ] = callback;
+					}
+				},
+
+				abort: function() {
+					if ( callback ) {
+						callback( undefined, true );
+					}
+				}
+			};
+		}
+	} );
+}
+
+// Functions to create xhrs
+function createStandardXHR() {
+	try {
+		return new window.XMLHttpRequest();
+	} catch ( e ) {}
+}
+
+function createActiveXHR() {
+	try {
+		return new window.ActiveXObject( "Microsoft.XMLHTTP" );
+	} catch ( e ) {}
+}
+
+
+
+
+// Install script dataType
+jQuery.ajaxSetup( {
+	accepts: {
+		script: "text/javascript, application/javascript, " +
+			"application/ecmascript, application/x-ecmascript"
+	},
+	contents: {
+		script: /\b(?:java|ecma)script\b/
+	},
+	converters: {
+		"text script": function( text ) {
+			jQuery.globalEval( text );
+			return text;
+		}
+	}
+} );
+
+// Handle cache's special case and global
+jQuery.ajaxPrefilter( "script", function( s ) {
+	if ( s.cache === undefined ) {
+		s.cache = false;
+	}
+	if ( s.crossDomain ) {
+		s.type = "GET";
+		s.global = false;
+	}
+} );
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function( s ) {
+
+	// This transport only deals with cross domain requests
+	if ( s.crossDomain ) {
+
+		var script,
+			head = document.head || jQuery( "head" )[ 0 ] || document.documentElement;
+
+		return {
+
+			send: function( _, callback ) {
+
+				script = document.createElement( "script" );
+
+				script.async = true;
+
+				if ( s.scriptCharset ) {
+					script.charset = s.scriptCharset;
+				}
+
+				script.src = s.url;
+
+				// Attach handlers for all browsers
+				script.onload = script.onreadystatechange = function( _, isAbort ) {
+
+					if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
+
+						// Handle memory leak in IE
+						script.onload = script.onreadystatechange = null;
+
+						// Remove the script
+						if ( script.parentNode ) {
+							script.parentNode.removeChild( script );
+						}
+
+						// Dereference the script
+						script = null;
+
+						// Callback if not abort
+						if ( !isAbort ) {
+							callback( 200, "success" );
+						}
+					}
+				};
+
+				// Circumvent IE6 bugs with index elements (#2709 and #4378) by prepending
+				// Use native DOM manipulation to avoid our domManip AJAX trickery
+				head.insertBefore( script, head.firstChild );
+			},
+
+			abort: function() {
+				if ( script ) {
+					script.onload( undefined, true );
+				}
+			}
+		};
+	}
+} );
+
+
+
+
+var oldCallbacks = [],
+	rjsonp = /(=)\?(?=&|$)|\?\?/;
+
+// Default jsonp settings
+jQuery.ajaxSetup( {
+	jsonp: "callback",
+	jsonpCallback: function() {
+		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
+		this[ callback ] = true;
+		return callback;
+	}
+} );
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+	var callbackName, overwritten, responseContainer,
+		jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
+			"url" :
+			typeof s.data === "string" &&
+				( s.contentType || "" )
+					.indexOf( "application/x-www-form-urlencoded" ) === 0 &&
+				rjsonp.test( s.data ) && "data"
+		);
+
+	// Handle iff the expected data type is "jsonp" or we have a parameter to set
+	if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
+
+		// Get callback name, remembering preexisting value associated with it
+		callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
+			s.jsonpCallback() :
+			s.jsonpCallback;
+
+		// Insert callback into url or form data
+		if ( jsonProp ) {
+			s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
+		} else if ( s.jsonp !== false ) {
+			s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
+		}
+
+		// Use data converter to retrieve json after script execution
+		s.converters[ "script json" ] = function() {
+			if ( !responseContainer ) {
+				jQuery.error( callbackName + " was not called" );
+			}
+			return responseContainer[ 0 ];
+		};
+
+		// force json dataType
+		s.dataTypes[ 0 ] = "json";
+
+		// Install callback
+		overwritten = window[ callbackName ];
+		window[ callbackName ] = function() {
+			responseContainer = arguments;
+		};
+
+		// Clean-up function (fires after converters)
+		jqXHR.always( function() {
+
+			// If previous value didn't exist - remove it
+			if ( overwritten === undefined ) {
+				jQuery( window ).removeProp( callbackName );
+
+			// Otherwise restore preexisting value
+			} else {
+				window[ callbackName ] = overwritten;
+			}
+
+			// Save back as free
+			if ( s[ callbackName ] ) {
+
+				// make sure that re-using the options doesn't screw things around
+				s.jsonpCallback = originalSettings.jsonpCallback;
+
+				// save the callback name for future use
+				oldCallbacks.push( callbackName );
+			}
+
+			// Call if it was a function and we have a response
+			if ( responseContainer && jQuery.isFunction( overwritten ) ) {
+				overwritten( responseContainer[ 0 ] );
+			}
+
+			responseContainer = overwritten = undefined;
+		} );
+
+		// Delegate to script
+		return "script";
+	}
+} );
+
+
+
+
+// data: string of html
+// context (optional): If specified, the fragment will be created in this context,
+// defaults to document
+// keepScripts (optional): If true, will include scripts passed in the html string
+jQuery.parseHTML = function( data, context, keepScripts ) {
+	if ( !data || typeof data !== "string" ) {
+		return null;
+	}
+	if ( typeof context === "boolean" ) {
+		keepScripts = context;
+		context = false;
+	}
+	context = context || document;
+
+	var parsed = rsingleTag.exec( data ),
+		scripts = !keepScripts && [];
+
+	// Single tag
+	if ( parsed ) {
+		return [ context.createElement( parsed[ 1 ] ) ];
+	}
+
+	parsed = buildFragment( [ data ], context, scripts );
+
+	if ( scripts && scripts.length ) {
+		jQuery( scripts ).remove();
+	}
+
+	return jQuery.merge( [], parsed.childNodes );
+};
+
+
+// Keep a copy of the old load method
+var _load = jQuery.fn.load;
+
+/**
+ * Load a url into a page
+ */
+jQuery.fn.load = function( url, params, callback ) {
+	if ( typeof url !== "string" && _load ) {
+		return _load.apply( this, arguments );
+	}
+
+	var selector, type, response,
+		self = this,
+		off = url.indexOf( " " );
+
+	if ( off > -1 ) {
+		selector = jQuery.trim( url.slice( off, url.length ) );
+		url = url.slice( 0, off );
+	}
+
+	// If it's a function
+	if ( jQuery.isFunction( params ) ) {
+
+		// We assume that it's the callback
+		callback = params;
+		params = undefined;
+
+	// Otherwise, build a param string
+	} else if ( params && typeof params === "object" ) {
+		type = "POST";
+	}
+
+	// If we have elements to modify, make the request
+	if ( self.length > 0 ) {
+		jQuery.ajax( {
+			url: url,
+
+			// If "type" variable is undefined, then "GET" method will be used.
+			// Make value of this field explicit since
+			// user can override it through ajaxSetup method
+			type: type || "GET",
+			dataType: "html",
+			data: params
+		} ).done( function( responseText ) {
+
+			// Save response for use in complete callback
+			response = arguments;
+
+			self.html( selector ?
+
+				// If a selector was specified, locate the right elements in a dummy div
+				// Exclude scripts to avoid IE 'Permission Denied' errors
+				jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :
+
+				// Otherwise use the full result
+				responseText );
+
+		// If the request succeeds, this function gets "data", "status", "jqXHR"
+		// but they are ignored because response was set above.
+		// If it fails, this function gets "jqXHR", "status", "error"
+		} ).always( callback && function( jqXHR, status ) {
+			self.each( function() {
+				callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
+			} );
+		} );
+	}
+
+	return this;
+};
+
+
+
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( [
+	"ajaxStart",
+	"ajaxStop",
+	"ajaxComplete",
+	"ajaxError",
+	"ajaxSuccess",
+	"ajaxSend"
+], function( i, type ) {
+	jQuery.fn[ type ] = function( fn ) {
+		return this.on( type, fn );
+	};
+} );
+
+
+
+
+jQuery.expr.filters.animated = function( elem ) {
+	return jQuery.grep( jQuery.timers, function( fn ) {
+		return elem === fn.elem;
+	} ).length;
+};
+
+
+
+
+
+/**
+ * Gets a window from an element
+ */
+function getWindow( elem ) {
+	return jQuery.isWindow( elem ) ?
+		elem :
+		elem.nodeType === 9 ?
+			elem.defaultView || elem.parentWindow :
+			false;
+}
+
+jQuery.offset = {
+	setOffset: function( elem, options, i ) {
+		var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
+			position = jQuery.css( elem, "position" ),
+			curElem = jQuery( elem ),
+			props = {};
+
+		// set position first, in-case top/left are set even on static elem
+		if ( position === "static" ) {
+			elem.style.position = "relative";
+		}
+
+		curOffset = curElem.offset();
+		curCSSTop = jQuery.css( elem, "top" );
+		curCSSLeft = jQuery.css( elem, "left" );
+		calculatePosition = ( position === "absolute" || position === "fixed" ) &&
+			jQuery.inArray( "auto", [ curCSSTop, curCSSLeft ] ) > -1;
+
+		// need to be able to calculate position if either top or left
+		// is auto and position is either absolute or fixed
+		if ( calculatePosition ) {
+			curPosition = curElem.position();
+			curTop = curPosition.top;
+			curLeft = curPosition.left;
+		} else {
+			curTop = parseFloat( curCSSTop ) || 0;
+			curLeft = parseFloat( curCSSLeft ) || 0;
+		}
+
+		if ( jQuery.isFunction( options ) ) {
+
+			// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
+			options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
+		}
+
+		if ( options.top != null ) {
+			props.top = ( options.top - curOffset.top ) + curTop;
+		}
+		if ( options.left != null ) {
+			props.left = ( options.left - curOffset.left ) + curLeft;
+		}
+
+		if ( "using" in options ) {
+			options.using.call( elem, props );
+		} else {
+			curElem.css( props );
+		}
+	}
+};
+
+jQuery.fn.extend( {
+	offset: function( options ) {
+		if ( arguments.length ) {
+			return options === undefined ?
+				this :
+				this.each( function( i ) {
+					jQuery.offset.setOffset( this, options, i );
+				} );
+		}
+
+		var docElem, win,
+			box = { top: 0, left: 0 },
+			elem = this[ 0 ],
+			doc = elem && elem.ownerDocument;
+
+		if ( !doc ) {
+			return;
+		}
+
+		docElem = doc.documentElement;
+
+		// Make sure it's not a disconnected DOM node
+		if ( !jQuery.contains( docElem, elem ) ) {
+			return box;
+		}
+
+		// If we don't have gBCR, just use 0,0 rather than error
+		// BlackBerry 5, iOS 3 (original iPhone)
+		if ( typeof elem.getBoundingClientRect !== "undefined" ) {
+			box = elem.getBoundingClientRect();
+		}
+		win = getWindow( doc );
+		return {
+			top: box.top  + ( win.pageYOffset || docElem.scrollTop )  - ( docElem.clientTop  || 0 ),
+			left: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )
+		};
+	},
+
+	position: function() {
+		if ( !this[ 0 ] ) {
+			return;
+		}
+
+		var offsetParent, offset,
+			parentOffset = { top: 0, left: 0 },
+			elem = this[ 0 ];
+
+		// Fixed elements are offset from window (parentOffset = {top:0, left: 0},
+		// because it is its only offset parent
+		if ( jQuery.css( elem, "position" ) === "fixed" ) {
+
+			// we assume that getBoundingClientRect is available when computed position is fixed
+			offset = elem.getBoundingClientRect();
+		} else {
+
+			// Get *real* offsetParent
+			offsetParent = this.offsetParent();
+
+			// Get correct offsets
+			offset = this.offset();
+			if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
+				parentOffset = offsetParent.offset();
+			}
+
+			// Add offsetParent borders
+			parentOffset.top  += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
+			parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
+		}
+
+		// Subtract parent offsets and element margins
+		// note: when an element has margin: auto the offsetLeft and marginLeft
+		// are the same in Safari causing offset.left to incorrectly be 0
+		return {
+			top:  offset.top  - parentOffset.top - jQuery.css( elem, "marginTop", true ),
+			left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
+		};
+	},
+
+	offsetParent: function() {
+		return this.map( function() {
+			var offsetParent = this.offsetParent;
+
+			while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) &&
+				jQuery.css( offsetParent, "position" ) === "static" ) ) {
+				offsetParent = offsetParent.offsetParent;
+			}
+			return offsetParent || documentElement;
+		} );
+	}
+} );
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
+	var top = /Y/.test( prop );
+
+	jQuery.fn[ method ] = function( val ) {
+		return access( this, function( elem, method, val ) {
+			var win = getWindow( elem );
+
+			if ( val === undefined ) {
+				return win ? ( prop in win ) ? win[ prop ] :
+					win.document.documentElement[ method ] :
+					elem[ method ];
+			}
+
+			if ( win ) {
+				win.scrollTo(
+					!top ? val : jQuery( win ).scrollLeft(),
+					top ? val : jQuery( win ).scrollTop()
+				);
+
+			} else {
+				elem[ method ] = val;
+			}
+		}, method, val, arguments.length, null );
+	};
+} );
+
+// Support: Safari<7-8+, Chrome<37-44+
+// Add the top/left cssHooks using jQuery.fn.position
+// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
+// getComputedStyle returns percent when specified for top/left/bottom/right
+// rather than make the css module depend on the offset module, we just check for it here
+jQuery.each( [ "top", "left" ], function( i, prop ) {
+	jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
+		function( elem, computed ) {
+			if ( computed ) {
+				computed = curCSS( elem, prop );
+
+				// if curCSS returns percentage, fallback to offset
+				return rnumnonpx.test( computed ) ?
+					jQuery( elem ).position()[ prop ] + "px" :
+					computed;
+			}
+		}
+	);
+} );
+
+
+// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
+jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
+	jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
+	function( defaultExtra, funcName ) {
+
+		// margin is only for outerHeight, outerWidth
+		jQuery.fn[ funcName ] = function( margin, value ) {
+			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
+				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
+
+			return access( this, function( elem, type, value ) {
+				var doc;
+
+				if ( jQuery.isWindow( elem ) ) {
+
+					// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
+					// isn't a whole lot we can do. See pull request at this URL for discussion:
+					// https://github.com/jquery/jquery/pull/764
+					return elem.document.documentElement[ "client" + name ];
+				}
+
+				// Get document width or height
+				if ( elem.nodeType === 9 ) {
+					doc = elem.documentElement;
+
+					// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
+					// whichever is greatest
+					// unfortunately, this causes bug #3838 in IE6/8 only,
+					// but there is currently no good, small way to fix it.
+					return Math.max(
+						elem.body[ "scroll" + name ], doc[ "scroll" + name ],
+						elem.body[ "offset" + name ], doc[ "offset" + name ],
+						doc[ "client" + name ]
+					);
+				}
+
+				return value === undefined ?
+
+					// Get width or height on the element, requesting but not forcing parseFloat
+					jQuery.css( elem, type, extra ) :
+
+					// Set width or height on the element
+					jQuery.style( elem, type, value, extra );
+			}, type, chainable ? margin : undefined, chainable, null );
+		};
+	} );
+} );
+
+
+jQuery.fn.extend( {
+
+	bind: function( types, data, fn ) {
+		return this.on( types, null, data, fn );
+	},
+	unbind: function( types, fn ) {
+		return this.off( types, null, fn );
+	},
+
+	delegate: function( selector, types, data, fn ) {
+		return this.on( types, selector, data, fn );
+	},
+	undelegate: function( selector, types, fn ) {
+
+		// ( namespace ) or ( selector, types [, fn] )
+		return arguments.length === 1 ?
+			this.off( selector, "**" ) :
+			this.off( types, selector || "**", fn );
+	}
+} );
+
+// The number of elements contained in the matched element set
+jQuery.fn.size = function() {
+	return this.length;
+};
+
+jQuery.fn.andSelf = jQuery.fn.addBack;
+
+
+
+
+// Register as a named AMD module, since jQuery can be concatenated with other
+// files that may use define, but not via a proper concatenation script that
+// understands anonymous AMD modules. A named AMD is safest and most robust
+// way to register. Lowercase jquery is used because AMD module names are
+// derived from file names, and jQuery is normally delivered in a lowercase
+// file name. Do this after creating the global so that if an AMD module wants
+// to call noConflict to hide this version of jQuery, it will work.
+
+// Note that for maximum portability, libraries that are not jQuery should
+// declare themselves as anonymous modules, and avoid setting a global if an
+// AMD loader is present. jQuery is a special case. For more information, see
+// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
+
+
+//灏唈Query瀵硅薄灞�閮ㄦ毚闇茬粰layui
+layui.define(function(exports){
+  layui.$ = jQuery;
+  exports('jquery', jQuery);
+});
+
+return jQuery;
+}));
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/lay.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/lay.js
new file mode 100644
index 0000000..4bed1f0
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/lay.js
@@ -0,0 +1,418 @@
+
+/*! lay 鍩虹 DOM 鎿嶄綔 | MIT Licensed */
+
+;!function(window){ //gulp build: lay-header
+  "use strict";
+  
+  var MOD_NAME = 'lay' //妯″潡鍚�
+  ,document = window.document
+  
+  //DOM鏌ユ壘
+  ,lay = function(selector){   
+    return new LAY(selector);
+  }
+  
+  //DOM鏋勯�犲櫒
+  ,LAY = function(selector){
+    var index = 0
+    ,nativeDOM = typeof selector === 'object' ? [selector] : (
+      this.selector = selector
+      ,document.querySelectorAll(selector || null)
+    );
+    for(; index < nativeDOM.length; index++){
+      this.push(nativeDOM[index]);
+    }
+  };
+  
+  /*
+    lay 瀵硅薄鎿嶄綔
+  */
+  
+  LAY.prototype = [];
+  LAY.prototype.constructor = LAY;
+  
+  //鏅�氬璞℃繁搴︽墿灞�
+  lay.extend = function(){
+    var ai = 1, args = arguments
+    ,clone = function(target, obj){
+      target = target || (layui._typeof(obj) === 'array' ? [] : {}); //鐩爣瀵硅薄
+      for(var i in obj){
+        //濡傛灉鍊间负鏅�氬璞★紝鍒欒繘鍏ラ�掑綊锛岀户缁繁搴﹀悎骞�
+        target[i] = (obj[i] && obj[i].constructor === Object)
+          ? clone(target[i], obj[i])
+        : obj[i];
+      }
+      return target;
+    }
+
+    args[0] = typeof args[0] === 'object' ? args[0] : {};
+
+    for(; ai < args.length; ai++){
+      if(typeof args[ai] === 'object'){
+        clone(args[0], args[ai]);
+      }
+    }
+    return args[0];
+  };
+  
+  //lay 妯″潡鐗堟湰
+  lay.v = '1.0.8';
+  
+  //ie鐗堟湰
+  lay.ie = function(){
+    var agent = navigator.userAgent.toLowerCase();
+    return (!!window.ActiveXObject || "ActiveXObject" in window) ? (
+      (agent.match(/msie\s(\d+)/) || [])[1] || '11' //鐢变簬 ie11 骞舵病鏈� msie 鐨勬爣璇�
+    ) : false;
+  }();
+  
+  
+  
+  
+  
+  
+  /** 
+   * 鑾峰彇 layui 甯歌鏂规硶锛屼互渚跨敤浜庣粍浠跺崟鐙増
+   */
+  
+  lay.layui = layui || {};
+  lay.getPath = layui.cache.dir; //鑾峰彇褰撳墠 JS 鎵�鍦ㄧ洰褰�
+  lay.stope = layui.stope; //涓鍐掓场
+  lay.each = function(){ //閬嶅巻
+    layui.each.apply(layui, arguments);
+    return this;
+  };
+  
+  
+  
+  
+  
+  //鏁板瓧鍓嶇疆琛ラ浂
+  lay.digit = function(num, length, end){
+    var str = '';
+    num = String(num);
+    length = length || 2;
+    for(var i = num.length; i < length; i++){
+      str += '0';
+    }
+    return num < Math.pow(10, length) ? str + (num|0) : num;
+  };
+  
+  //鍒涘缓鍏冪礌
+  lay.elem = function(elemName, attr){
+    var elem = document.createElement(elemName);
+    lay.each(attr || {}, function(key, value){
+      elem.setAttribute(key, value);
+    });
+    return elem;
+  };
+
+  //褰撳墠椤甸潰鏄惁瀛樺湪婊氬姩鏉�
+  lay.hasScrollbar = function(){
+    return document.body.scrollHeight > (window.innerHeight || document.documentElement.clientHeight);
+  };
+  
+  //鍏冪礌瀹氫綅
+  lay.position = function(elem, elemView, obj){
+    if(!elemView) return;
+    obj = obj || {};
+    
+    //濡傛灉缁戝畾鐨勬槸 document 鎴� body 鍏冪礌锛屽垯鐩存帴鑾峰彇榧犳爣鍧愭爣
+    if(elem === document || elem === lay('body')[0]){
+      obj.clickType = 'right';
+    }
+
+    //缁戝畾缁戝畾鍏冪礌鐨勫潗鏍�
+    var rect = obj.clickType === 'right' ? function(){
+      var e = obj.e || window.event || {};
+      return {
+        left: e.clientX
+        ,top: e.clientY
+        ,right: e.clientX
+        ,bottom: e.clientY
+      }
+    }() : elem.getBoundingClientRect()
+    ,elemWidth = elemView.offsetWidth //鎺т欢鐨勫搴�
+    ,elemHeight = elemView.offsetHeight //鎺т欢鐨勯珮搴�
+    
+    //婊氬姩鏉¢珮搴�
+    ,scrollArea = function(type){
+      type = type ? 'scrollLeft' : 'scrollTop';
+      return document.body[type] | document.documentElement[type];
+    }
+    
+    //绐楀彛瀹介珮
+    ,winArea = function(type){
+      return document.documentElement[type ? 'clientWidth' : 'clientHeight']
+    }, margin = 5, left = rect.left, top = rect.bottom;
+    
+    //鐩稿鍏冪礌灞呬腑
+    if(obj.align === 'center'){
+      left = left - (elemWidth - elem.offsetWidth)/2;
+    } else if(obj.align === 'right'){
+      left = left - elemWidth + elem.offsetWidth;
+    }
+
+    //鍒ゆ柇鍙充晶鏄惁瓒呭嚭杈圭晫
+    if(left + elemWidth + margin > winArea('width')){
+      left = winArea('width') - elemWidth - margin; //濡傛灉瓒呭嚭鍙充晶锛屽垯灏嗛潰鏉垮悜鍙抽潬榻�
+    }
+    //宸︿晶鏄惁瓒呭嚭杈圭晫
+    if(left < margin) left = margin;
+    
+    //鍒ゆ柇搴曢儴鍜岄《閮ㄦ槸鍚﹁秴鍑鸿竟鐣�
+    if(top + elemHeight + margin > winArea()){
+      //浼樺厛椤堕儴鏄惁鏈夎冻澶熷尯鍩熸樉绀哄畬鍏�
+      if(rect.top > elemHeight + margin){
+        top = rect.top - elemHeight - margin*2; //椤堕儴鏈夎冻澶熺殑鍖哄煙鏄剧ず
+      } else {
+        //濡傛灉闈㈡澘鏄紶鏍囧彸閿脊鍑猴紝涓旈《閮ㄦ病鏈夎冻澶熷尯鍩熸樉绀猴紝鍒欏皢闈㈡澘鍚戝簳閮ㄩ潬榻�
+        if(obj.clickType === 'right'){
+          top = winArea() - elemHeight - margin*2;
+          if(top < 0) top = 0; //涓嶈兘婧㈠嚭绐楀彛椤堕儴
+        }
+      }
+    }
+    
+    //瀹氫綅绫诲瀷
+    var position = obj.position;
+    if(position) elemView.style.position = position;
+    
+    //璁剧疆鍧愭爣
+    elemView.style.left = left + (position === 'fixed' ? 0 : scrollArea(1)) + 'px';
+    elemView.style.top = top + (position === 'fixed' ? 0 : scrollArea()) + 'px';
+
+    //闃叉椤甸潰鏃犳粴鍔ㄦ潯鏃讹紝鍙堝洜涓哄脊鍑洪潰鏉胯�屽嚭鐜版粴鍔ㄦ潯瀵艰嚧鐨勫潗鏍囪绠楀亸宸�
+    if(!lay.hasScrollbar()){
+      var rect1 = elemView.getBoundingClientRect();
+      //濡傛灉寮瑰嚭闈㈡澘鐨勬孩鍑虹獥鍙e簳閮紝鍒欒〃绀哄皢鍑虹幇婊氬姩鏉★紝姝ゆ椂闇�瑕侀噸鏂拌绠楀潗鏍�
+      if(!obj.SYSTEM_RELOAD && (rect1.bottom + margin) > winArea()){
+        obj.SYSTEM_RELOAD = true;
+        setTimeout(function(){
+          lay.position(elem, elemView, obj);
+        }, 50);
+      }
+    }
+  };
+  
+  //鑾峰彇鍏冪礌涓婄殑鍙傛暟閰嶇疆涓�
+  lay.options = function(elem, attr){
+    var othis = lay(elem)
+    ,attrName = attr || 'lay-options';
+    try {
+      return new Function('return '+ (othis.attr(attrName) || '{}'))();
+    } catch(ev) {
+      hint.error('parseerror锛�'+ ev, 'error');
+      return {};
+    }
+  };
+  
+  //鍏冪礌鏄惁灞炰簬椤剁骇鍏冪礌锛坉ocument 鎴� body锛�
+  lay.isTopElem = function(elem){
+    var topElems = [document, lay('body')[0]]
+    ,matched = false;
+    lay.each(topElems, function(index, item){
+      if(item === elem){
+        return matched = true
+      }
+    });
+    return matched;
+  };
+  
+  //杩藉姞瀛楃
+  LAY.addStr = function(str, new_str){
+    str = str.replace(/\s+/, ' ');
+    new_str = new_str.replace(/\s+/, ' ').split(' ');
+    lay.each(new_str, function(ii, item){
+      if(!new RegExp('\\b'+ item + '\\b').test(str)){
+        str = str + ' ' + item;
+      }
+    });
+    return str.replace(/^\s|\s$/, '');
+  };
+  
+  //绉婚櫎鍊�
+  LAY.removeStr = function(str, new_str){
+    str = str.replace(/\s+/, ' ');
+    new_str = new_str.replace(/\s+/, ' ').split(' ');
+    lay.each(new_str, function(ii, item){
+      var exp = new RegExp('\\b'+ item + '\\b')
+      if(exp.test(str)){
+        str = str.replace(exp, '');
+      }
+    });
+    return str.replace(/\s+/, ' ').replace(/^\s|\s$/, '');
+  };
+  
+  //鏌ユ壘瀛愬厓绱�
+  LAY.prototype.find = function(selector){
+    var that = this;
+    var index = 0, arr = []
+    ,isObject = typeof selector === 'object';
+    
+    this.each(function(i, item){
+      var nativeDOM = isObject ? item.contains(selector) : item.querySelectorAll(selector || null);
+      for(; index < nativeDOM.length; index++){
+        arr.push(nativeDOM[index]);
+      }
+      that.shift();
+    });
+    
+    if(!isObject){
+      that.selector =  (that.selector ? that.selector + ' ' : '') + selector
+    }
+    
+    lay.each(arr, function(i, item){
+      that.push(item);
+    });
+    
+    return that;
+  };
+  
+  //DOM閬嶅巻
+  LAY.prototype.each = function(fn){
+    return lay.each.call(this, this, fn);
+  };
+  
+  //娣诲姞css绫�
+  LAY.prototype.addClass = function(className, type){
+    return this.each(function(index, item){
+      item.className = LAY[type ? 'removeStr' : 'addStr'](item.className, className)
+    });
+  };
+  
+  //绉婚櫎 css 绫�
+  LAY.prototype.removeClass = function(className){
+    return this.addClass(className, true);
+  };
+  
+  //鏄惁鍖呭惈 css 绫�
+  LAY.prototype.hasClass = function(className){
+    var has = false;
+    this.each(function(index, item){
+      if(new RegExp('\\b'+ className +'\\b').test(item.className)){
+        has = true;
+      }
+    });
+    return has;
+  };
+  
+  //娣诲姞鎴栬幏鍙� css style
+  LAY.prototype.css = function(key, value){
+    var that = this
+    ,parseValue = function(v){
+      return isNaN(v) ? v : (v +'px');
+    };
+    return (typeof key === 'string' && value === undefined) ? function(){
+      if(that.length > 0) return that[0].style[key];
+    }() : that.each(function(index, item){
+      typeof key === 'object' ? lay.each(key, function(thisKey, thisValue){
+        item.style[thisKey] = parseValue(thisValue);
+      }) : item.style[key] = parseValue(value);
+    });   
+  };
+  
+  //娣诲姞鎴栬幏鍙栧搴�
+  LAY.prototype.width = function(value){
+    var that = this;
+    return value === undefined ? function(){
+      if(that.length > 0) return that[0].offsetWidth; //姝ゅ杩橀渶鍋氬吋瀹�
+    }() : that.each(function(index, item){
+      that.css('width', value);
+    });   
+  };
+  
+  //娣诲姞鎴栬幏鍙栭珮搴�
+  LAY.prototype.height = function(value){
+    var that = this;
+    return value === undefined ? function(){
+      if(that.length > 0) return that[0].offsetHeight; //姝ゅ杩橀渶鍋氬吋瀹�
+    }() : that.each(function(index, item){
+      that.css('height', value);
+    });   
+  };
+  
+  //娣诲姞鎴栬幏鍙栧睘鎬�
+  LAY.prototype.attr = function(key, value){
+    var that = this;
+    return value === undefined ? function(){
+      if(that.length > 0) return that[0].getAttribute(key);
+    }() : that.each(function(index, item){
+      item.setAttribute(key, value);
+    });   
+  };
+  
+  //绉婚櫎灞炴��
+  LAY.prototype.removeAttr = function(key){
+    return this.each(function(index, item){
+      item.removeAttribute(key);
+    });
+  };
+  
+  //璁剧疆鎴栬幏鍙� HTML 鍐呭
+  LAY.prototype.html = function(html){
+    var that = this;
+    return html === undefined ? function(){
+      if(that.length > 0) return that[0].innerHTML;
+    }() : this.each(function(index, item){
+      item.innerHTML = html;
+    });
+  };
+  
+  //璁剧疆鎴栬幏鍙栧��
+  LAY.prototype.val = function(value){
+    var that = this;
+    return value === undefined ? function(){
+      if(that.length > 0) return that[0].value;
+    }() : this.each(function(index, item){
+        item.value = value;
+    });
+  };
+  
+  //杩藉姞鍐呭
+  LAY.prototype.append = function(elem){
+    return this.each(function(index, item){
+      typeof elem === 'object' 
+        ? item.appendChild(elem)
+      :  item.innerHTML = item.innerHTML + elem;
+    });
+  };
+  
+  //绉婚櫎鍐呭
+  LAY.prototype.remove = function(elem){
+    return this.each(function(index, item){
+      elem ? item.removeChild(elem) : item.parentNode.removeChild(item);
+    });
+  };
+  
+  //浜嬩欢缁戝畾
+  LAY.prototype.on = function(eventName, fn){
+    return this.each(function(index, item){
+      item.attachEvent ? item.attachEvent('on' + eventName, function(e){
+        e.target = e.srcElement;
+        fn.call(item, e);
+      }) : item.addEventListener(eventName, fn, false);
+    });
+  };
+  
+  //瑙i櫎浜嬩欢
+  LAY.prototype.off = function(eventName, fn){
+    return this.each(function(index, item){
+      item.detachEvent 
+        ? item.detachEvent('on'+ eventName, fn)  
+      : item.removeEventListener(eventName, fn, false);
+    });
+  };
+  
+  //鏆撮湶 lay 鍒板叏灞�浣滅敤鍩�
+  window.lay = lay;
+  
+  //濡傛灉鍦� layui 浣撶郴涓�
+  if(window.layui && layui.define){
+    layui.define(function(exports){ //layui 鍔犺浇
+      exports(MOD_NAME, lay);
+    });
+  }
+  
+}(window, window.document);
+
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/laydate.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/laydate.js
new file mode 100644
index 0000000..033bd77
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/laydate.js
@@ -0,0 +1,2009 @@
+/**
+
+ @Name : layDate 5.0.9 鏃ユ湡鏃堕棿鎺т欢
+ @Author: 璐ゅ績
+ @Site锛歨ttp://www.layui.com/laydate/
+ @License锛歁IT
+
+ */
+
+;!function(){
+  "use strict";
+
+  var isLayui = window.layui && layui.define, ready = {
+    getPath: function(){
+      var jsPath = document.currentScript ? document.currentScript.src : function(){
+        var js = document.scripts
+        ,last = js.length - 1
+        ,src;
+        for(var i = last; i > 0; i--){
+          if(js[i].readyState === 'interactive'){
+            src = js[i].src;
+            break;
+          }
+        }
+        return src || js[last].src;
+      }();
+      return jsPath.substring(0, jsPath.lastIndexOf('/') + 1);
+    }()
+
+    //鑾峰彇鑺傜偣鐨剆tyle灞炴�у��
+    ,getStyle: function(node, name){
+      var style = node.currentStyle ? node.currentStyle : window.getComputedStyle(node, null);
+      return style[style.getPropertyValue ? 'getPropertyValue' : 'getAttribute'](name);
+    }
+
+    //杞藉叆CSS閰嶄欢
+    ,link: function(href, fn, cssname){
+
+      //鏈缃矾寰勶紝鍒欎笉涓诲姩鍔犺浇css
+      if(!laydate.path) return;
+
+      var head = document.getElementsByTagName("head")[0], link = document.createElement('link');
+      if(typeof fn === 'string') cssname = fn;
+      var app = (cssname || href).replace(/\.|\//g, '');
+      var id = 'layuicss-'+ app, timeout = 0;
+
+      link.rel = 'stylesheet';
+      link.href = laydate.path + href;
+      link.id = id;
+
+      if(!document.getElementById(id)){
+        head.appendChild(link);
+      }
+
+      if(typeof fn !== 'function') return;
+
+      //杞css鏄惁鍔犺浇瀹屾瘯
+      (function poll() {
+        if(++timeout > 8 * 1000 / 100){
+          return window.console && console.error('laydate.css: Invalid');
+        };
+        parseInt(ready.getStyle(document.getElementById(id), 'width')) === 1989 ? fn() : setTimeout(poll, 100);
+      }());
+    }
+  }
+
+  ,laydate = {
+    v: '5.0.9'
+    ,config: {} //鍏ㄥ眬閰嶇疆椤�
+    ,index: (window.laydate && window.laydate.v) ? 100000 : 0
+    ,path: ready.getPath
+
+    //璁剧疆鍏ㄥ眬椤�
+    ,set: function(options){
+      var that = this;
+      that.config = lay.extend({}, that.config, options);
+      return that;
+    }
+
+    //涓讳綋CSS绛夊緟浜嬩欢
+    ,ready: function(fn){
+      var cssname = 'laydate', ver = ''
+      ,path = (isLayui ? 'modules/laydate/' : 'theme/') + 'default/laydate.css?v='+ laydate.v + ver;
+      isLayui ? layui.addcss(path, fn, cssname) : ready.link(path, fn, cssname);
+      return this;
+    }
+  }
+
+  //鎿嶄綔褰撳墠瀹炰緥
+  ,thisDate = function(){
+    var that = this;
+    return {
+      //鎻愮ず妗�
+      hint: function(content){
+        that.hint.call(that, content);
+      }
+      ,config: that.config
+    };
+  }
+
+  //瀛楃甯搁噺
+  ,MOD_NAME = 'laydate', ELEM = '.layui-laydate', THIS = 'layui-this', SHOW = 'layui-show', HIDE = 'layui-hide', DISABLED = 'laydate-disabled', TIPS_OUT = '寮�濮嬫棩鏈熻秴鍑轰簡缁撴潫鏃ユ湡<br>寤鸿閲嶆柊閫夋嫨', LIMIT_YEAR = [100, 200000]
+
+  ,ELEM_STATIC = 'layui-laydate-static', ELEM_LIST = 'layui-laydate-list', ELEM_SELECTED = 'laydate-selected', ELEM_HINT = 'layui-laydate-hint', ELEM_PREV = 'laydate-day-prev', ELEM_NEXT = 'laydate-day-next', ELEM_FOOTER = 'layui-laydate-footer', ELEM_CONFIRM = '.laydate-btns-confirm', ELEM_TIME_TEXT = 'laydate-time-text', ELEM_TIME_BTN = '.laydate-btns-time'
+
+  //缁勪欢鏋勯�犲櫒
+  ,Class = function(options){
+    var that = this;
+    that.index = ++laydate.index;
+    that.config = lay.extend({}, that.config, laydate.config, options);
+    laydate.ready(function(){
+      that.init();
+    });
+  }
+
+  //DOM鏌ユ壘
+  ,lay = function(selector){
+    return new LAY(selector);
+  }
+
+  //DOM鏋勯�犲櫒
+  ,LAY = function(selector){
+    var index = 0
+    ,nativeDOM = typeof selector === 'object' ? [selector] : (
+      this.selector = selector
+      ,document.querySelectorAll(selector || null)
+    );
+    for(; index < nativeDOM.length; index++){
+      this.push(nativeDOM[index]);
+    }
+  };
+
+
+  /*
+    lay瀵硅薄鎿嶄綔
+  */
+
+  LAY.prototype = [];
+  LAY.prototype.constructor = LAY;
+
+  //鏅�氬璞℃繁搴︽墿灞�
+  lay.extend = function(){
+    var ai = 1, args = arguments
+    ,clone = function(target, obj){
+      target = target || (obj.constructor === Array ? [] : {});
+      for(var i in obj){
+        //濡傛灉鍊间负瀵硅薄锛屽垯杩涘叆閫掑綊锛岀户缁繁搴﹀悎骞�
+        target[i] = (obj[i] && (obj[i].constructor === Object))
+          ? clone(target[i], obj[i])
+        : obj[i];
+      }
+      return target;
+    }
+
+    args[0] = typeof args[0] === 'object' ? args[0] : {};
+
+    for(; ai < args.length; ai++){
+      if(typeof args[ai] === 'object'){
+        clone(args[0], args[ai])
+      }
+    }
+    return args[0];
+  };
+
+  //ie鐗堟湰
+  lay.ie = function(){
+    var agent = navigator.userAgent.toLowerCase();
+    return (!!window.ActiveXObject || "ActiveXObject" in window) ? (
+      (agent.match(/msie\s(\d+)/) || [])[1] || '11' //鐢变簬ie11骞舵病鏈塵sie鐨勬爣璇�
+    ) : false;
+  }();
+
+  //涓鍐掓场
+  lay.stope = function(e){
+    e = e || window.event;
+    e.stopPropagation
+      ? e.stopPropagation()
+    : e.cancelBubble = true;
+  };
+
+  //瀵硅薄閬嶅巻
+  lay.each = function(obj, fn){
+    var key
+    ,that = this;
+    if(typeof fn !== 'function') return that;
+    obj = obj || [];
+    if(obj.constructor === Object){
+      for(key in obj){
+        if(fn.call(obj[key], key, obj[key])) break;
+      }
+    } else {
+      for(key = 0; key < obj.length; key++){
+        if(fn.call(obj[key], key, obj[key])) break;
+      }
+    }
+    return that;
+  };
+
+  //鏁板瓧鍓嶇疆琛ラ浂
+  lay.digit = function(num, length, end){
+    var str = '';
+    num = String(num);
+    length = length || 2;
+    for(var i = num.length; i < length; i++){
+      str += '0';
+    }
+    return num < Math.pow(10, length) ? str + (num|0) : num;
+  };
+
+  //鍒涘缓鍏冪礌
+  lay.elem = function(elemName, attr){
+    var elem = document.createElement(elemName);
+    lay.each(attr || {}, function(key, value){
+      elem.setAttribute(key, value);
+    });
+    return elem;
+  };
+
+  //杩藉姞瀛楃
+  LAY.addStr = function(str, new_str){
+    str = str.replace(/\s+/, ' ');
+    new_str = new_str.replace(/\s+/, ' ').split(' ');
+    lay.each(new_str, function(ii, item){
+      if(!new RegExp('\\b'+ item + '\\b').test(str)){
+        str = str + ' ' + item;
+      }
+    });
+    return str.replace(/^\s|\s$/, '');
+  };
+
+  //绉婚櫎鍊�
+  LAY.removeStr = function(str, new_str){
+    str = str.replace(/\s+/, ' ');
+    new_str = new_str.replace(/\s+/, ' ').split(' ');
+    lay.each(new_str, function(ii, item){
+      var exp = new RegExp('\\b'+ item + '\\b')
+      if(exp.test(str)){
+        str = str.replace(exp, '');
+      }
+    });
+    return str.replace(/\s+/, ' ').replace(/^\s|\s$/, '');
+  };
+
+  //鏌ユ壘瀛愬厓绱�
+  LAY.prototype.find = function(selector){
+    var that = this;
+    var index = 0, arr = []
+    ,isObject = typeof selector === 'object';
+
+    this.each(function(i, item){
+      var nativeDOM = isObject ? [selector] : item.querySelectorAll(selector || null);
+      for(; index < nativeDOM.length; index++){
+        arr.push(nativeDOM[index]);
+      }
+      that.shift();
+    });
+
+    if(!isObject){
+      that.selector =  (that.selector ? that.selector + ' ' : '') + selector
+    }
+
+    lay.each(arr, function(i, item){
+      that.push(item);
+    });
+
+    return that;
+  };
+
+  //DOM閬嶅巻
+  LAY.prototype.each = function(fn){
+    return lay.each.call(this, this, fn);
+  };
+
+  //娣诲姞css绫�
+  LAY.prototype.addClass = function(className, type){
+    return this.each(function(index, item){
+      item.className = LAY[type ? 'removeStr' : 'addStr'](item.className, className)
+    });
+  };
+
+  //绉婚櫎css绫�
+  LAY.prototype.removeClass = function(className){
+    return this.addClass(className, true);
+  };
+
+  //鏄惁鍖呭惈css绫�
+  LAY.prototype.hasClass = function(className){
+    var has = false;
+    this.each(function(index, item){
+      if(new RegExp('\\b'+ className +'\\b').test(item.className)){
+        has = true;
+      }
+    });
+    return has;
+  };
+
+  //娣诲姞鎴栬幏鍙栧睘鎬�
+  LAY.prototype.attr = function(key, value){
+    var that = this;
+    return value === undefined ? function(){
+      if(that.length > 0) return that[0].getAttribute(key);
+    }() : that.each(function(index, item){
+      item.setAttribute(key, value);
+    });
+  };
+
+  //绉婚櫎灞炴��
+  LAY.prototype.removeAttr = function(key){
+    return this.each(function(index, item){
+      item.removeAttribute(key);
+    });
+  };
+
+  //璁剧疆HTML鍐呭
+  LAY.prototype.html = function(html){
+    return this.each(function(index, item){
+      item.innerHTML = html;
+    });
+  };
+
+  //璁剧疆鍊�
+  LAY.prototype.val = function(value){
+    return this.each(function(index, item){
+      item.value = value;
+    });
+  };
+
+  //杩藉姞鍐呭
+  LAY.prototype.append = function(elem){
+    return this.each(function(index, item){
+      typeof elem === 'object'
+        ? item.appendChild(elem)
+      :  item.innerHTML = item.innerHTML + elem;
+    });
+  };
+
+  //绉婚櫎鍐呭
+  LAY.prototype.remove = function(elem){
+    return this.each(function(index, item){
+      elem ? item.removeChild(elem) : item.parentNode.removeChild(item);
+    });
+  };
+
+  //浜嬩欢缁戝畾
+  LAY.prototype.on = function(eventName, fn){
+    return this.each(function(index, item){
+      item.attachEvent ? item.attachEvent('on' + eventName, function(e){
+        e.target = e.srcElement;
+        fn.call(item, e);
+      }) : item.addEventListener(eventName, fn, false);
+    });
+  };
+
+  //瑙i櫎浜嬩欢
+  LAY.prototype.off = function(eventName, fn){
+    return this.each(function(index, item){
+      item.detachEvent
+        ? item.detachEvent('on'+ eventName, fn)
+      : item.removeEventListener(eventName, fn, false);
+    });
+  };
+
+
+  /*
+    缁勪欢鎿嶄綔
+  */
+
+
+  //鏄惁闂板勾
+  Class.isLeapYear = function(year){
+    return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
+  };
+
+  //榛樿閰嶇疆
+  Class.prototype.config = {
+    type: 'date' //鎺т欢绫诲瀷锛屾敮鎸侊細year/month/date/time/datetime
+    ,range: false //鏄惁寮�鍚寖鍥撮�夋嫨锛屽嵆鍙屾帶浠�
+    ,format: 'yyyy-MM-dd' //榛樿鏃ユ湡鏍煎紡
+    ,value: null //榛樿鏃ユ湡锛屾敮鎸佷紶鍏ew Date()锛屾垨鑰呯鍚坒ormat鍙傛暟璁惧畾鐨勬棩鏈熸牸寮忓瓧绗�
+    ,min: '1900-1-1' //鏈夋晥鏈�灏忔棩鏈燂紝骞存湀鏃ュ繀椤荤敤鈥�-鈥濆垎鍓诧紝鏃跺垎绉掑繀椤荤敤鈥�:鈥濆垎鍓层�傛敞鎰忥細瀹冨苟涓嶆槸閬靛惊 format 璁惧畾鐨勬牸寮忋��
+    ,max: '2099-12-31' //鏈夋晥鏈�澶ф棩鏈燂紝鍚屼笂
+    ,trigger: 'focus' //鍛煎嚭鎺т欢鐨勪簨浠�
+    ,show: false //鏄惁鐩存帴鏄剧ず锛屽鏋滆缃畉rue锛屽垯榛樿鐩存帴鏄剧ず鎺т欢
+    ,showBottom: true //鏄惁鏄剧ず搴曢儴鏍�
+    ,btns: ['clear', 'now', 'confirm'] //鍙充笅瑙掓樉绀虹殑鎸夐挳锛屼細鎸夌収鏁扮粍椤哄簭鎺掑垪
+    ,lang: 'cn' //璇█锛屽彧鏀寔cn/en锛屽嵆涓枃鍜岃嫳鏂�
+    ,theme: 'default' //涓婚
+    ,position: null //鎺т欢瀹氫綅鏂瑰紡瀹氫綅, 榛樿absolute锛屾敮鎸侊細fixed/absolute/static
+    ,calendar: false //鏄惁寮�鍚叕鍘嗛噸瑕佽妭鏃ワ紝浠呮敮鎸佷腑鏂囩増
+    ,mark: {} //鏃ユ湡澶囨敞锛屽閲嶈浜嬩欢鎴栨椿鍔ㄦ爣璁�
+    ,zIndex: null //鎺т欢灞傚彔椤哄簭
+    ,done: null //鎺т欢閫夋嫨瀹屾瘯鍚庣殑鍥炶皟锛岀偣鍑绘竻绌�/鐜板湪/纭畾涔熷潎浼氳Е鍙�
+    ,change: null //鏃ユ湡鏃堕棿鏀瑰彉鍚庣殑鍥炶皟
+  };
+
+  //澶氳瑷�
+  Class.prototype.lang = function(){
+    var that = this
+    ,options = that.config
+    ,text = {
+      cn: {
+        weeks: ['鏃�', '涓�', '浜�', '涓�', '鍥�', '浜�', '鍏�']
+        ,time: ['鏃�', '鍒�', '绉�']
+        ,timeTips: '閫夋嫨鏃堕棿'
+        ,startTime: '寮�濮嬫椂闂�'
+        ,endTime: '缁撴潫鏃堕棿'
+        ,dateTips: '杩斿洖鏃ユ湡'
+        ,month: ['涓�', '浜�', '涓�', '鍥�', '浜�', '鍏�', '涓�', '鍏�', '涔�', '鍗�', '鍗佷竴', '鍗佷簩']
+        ,tools: {
+          confirm: '纭畾'
+          ,clear: '娓呯┖'
+          ,now: '鐜板湪'
+        }
+      }
+      ,en: {
+        weeks: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']
+        ,time: ['Hours', 'Minutes', 'Seconds']
+        ,timeTips: 'Select Time'
+        ,startTime: 'Start Time'
+        ,endTime: 'End Time'
+        ,dateTips: 'Select Date'
+        ,month: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
+        ,tools: {
+          confirm: 'Confirm'
+          ,clear: 'Clear'
+          ,now: 'Now'
+        }
+      }
+    };
+    return text[options.lang] || text['cn'];
+  };
+
+  //鍒濆鍑嗗
+  Class.prototype.init = function(){
+    var that = this
+    ,options = that.config
+    ,dateType = 'yyyy|y|MM|M|dd|d|HH|H|mm|m|ss|s'
+    ,isStatic = options.position === 'static'
+    ,format = {
+      year: 'yyyy'
+      ,month: 'yyyy-MM'
+      ,date: 'yyyy-MM-dd'
+      ,time: 'HH:mm:ss'
+      ,datetime: 'yyyy-MM-dd HH:mm:ss'
+    };
+
+    options.elem = lay(options.elem);
+    options.eventElem = lay(options.eventElem);
+
+    if(!options.elem[0]) return;
+
+    //鏃ユ湡鑼冨洿鍒嗛殧绗�
+    if(options.range === true) options.range = '-';
+
+    //鏍规嵁涓嶅悓type锛屽垵濮嬪寲榛樿format
+    if(options.format === format.date){
+      options.format = format[options.type];
+    }
+
+    //灏嗘棩鏈熸牸寮忚浆鍖栨垚鏁扮粍
+    if(options.format)
+    that.format = options.format.match(new RegExp(dateType + '|.', 'g')) || [];
+
+    //鐢熸垚姝e垯琛ㄨ揪寮�
+    that.EXP_IF = '';
+    that.EXP_SPLIT = '';
+    lay.each(that.format, function(i, item){
+      var EXP =  new RegExp(dateType).test(item)
+        ? '\\d{'+ function(){
+          if(new RegExp(dateType).test(that.format[i === 0 ? i + 1 : i - 1]||'')){
+            if(/^yyyy|y$/.test(item)) return 4;
+            return item.length;
+          }
+          if(/^yyyy$/.test(item)) return '1,4';
+          if(/^y$/.test(item)) return '1,308';
+          return '1,2';
+        }() +'}'
+      : '\\' + item;
+      that.EXP_IF = that.EXP_IF + EXP;
+      that.EXP_SPLIT = that.EXP_SPLIT + '(' + EXP + ')';
+    });
+    that.EXP_IF = new RegExp('^'+ (
+      options.range ?
+        that.EXP_IF + '\\s\\'+ options.range + '\\s' + that.EXP_IF
+      : that.EXP_IF
+    ) +'$');
+    that.EXP_SPLIT = new RegExp('^'+ that.EXP_SPLIT +'$', '');
+
+    //濡傛灉涓嶆槸input|textarea鍏冪礌锛屽垯榛樿閲囩敤click浜嬩欢
+    if(!that.isInput(options.elem[0])){
+      if(options.trigger === 'focus'){
+        options.trigger = 'click';
+      }
+    }
+
+    //璁剧疆鍞竴KEY
+    if(!options.elem.attr('lay-key')){
+      options.elem.attr('lay-key', that.index);
+      options.eventElem.attr('lay-key', that.index);
+    }
+
+    //璁板綍閲嶈鏃ユ湡
+    options.mark = lay.extend({}, (options.calendar && options.lang === 'cn') ? {
+      '0-1-1': '鍏冩棪'
+      ,'0-2-14': '鎯呬汉'
+      ,'0-3-8': '濡囧コ'
+      ,'0-3-12': '妞嶆爲'
+      ,'0-4-1': '鎰氫汉'
+      ,'0-5-1': '鍔冲姩'
+      ,'0-5-4': '闈掑勾'
+      ,'0-6-1': '鍎跨'
+      ,'0-9-10': '鏁欏笀'
+      ,'0-9-18': '鍥借��'
+      ,'0-10-1': '鍥藉簡'
+      ,'0-12-25': '鍦h癁'
+    } : {}, options.mark);
+
+    //鑾峰彇闄愬埗鍐呮棩鏈�
+    lay.each(['min', 'max'], function(i, item){
+      var ymd = [], hms = [];
+      if(typeof options[item] === 'number'){ //濡傛灉涓烘暟瀛�
+        var day = options[item]
+        ,time = new Date().getTime()
+        ,STAMP = 86400000 //浠h〃涓�澶╃殑鏃堕棿鎴�
+        ,thisDate = new Date(
+          day ? (
+            day < STAMP ? time + day*STAMP : day //濡傛灉鏁板瓧灏忎簬涓�澶╃殑鏃堕棿鎴筹紝鍒欐暟瀛椾负澶╂暟锛屽惁鍒欎负鏃堕棿鎴�
+          ) : time
+        );
+        ymd = [thisDate.getFullYear(), thisDate.getMonth() + 1, thisDate.getDate()];
+        day < STAMP || (hms = [thisDate.getHours(), thisDate.getMinutes(), thisDate.getSeconds()]);
+      } else {
+        ymd = (options[item].match(/\d+-\d+-\d+/) || [''])[0].split('-');
+        hms = (options[item].match(/\d+:\d+:\d+/) || [''])[0].split(':');
+      }
+      options[item] = {
+        year: ymd[0] | 0 || new Date().getFullYear()
+        ,month: ymd[1] ? (ymd[1] | 0) - 1 : new Date().getMonth()
+        ,date: ymd[2] | 0 || new Date().getDate()
+        ,hours: hms[0] | 0
+        ,minutes: hms[1] | 0
+        ,seconds: hms[2] | 0
+      };
+    });
+
+    that.elemID = 'layui-laydate'+ options.elem.attr('lay-key');
+
+    if(options.show || isStatic) that.render();
+    isStatic || that.events();
+
+    //榛樿璧嬪��
+    if(options.value){
+      if(options.value.constructor === Date){
+        that.setValue(that.parse(0, that.systemDate(options.value)));
+      } else {
+        that.setValue(options.value);
+      }
+    }
+  };
+
+  //鎺т欢涓讳綋娓叉煋
+  Class.prototype.render = function(){
+    var that = this
+    ,options = that.config
+    ,lang = that.lang()
+    ,isStatic = options.position === 'static'
+
+    //涓婚潰鏉�
+    ,elem = that.elem = lay.elem('div', {
+      id: that.elemID
+      ,'class': [
+        'layui-laydate'
+        ,options.range ? ' layui-laydate-range' : ''
+        ,isStatic ? (' '+ ELEM_STATIC) : ''
+        ,options.theme && options.theme !== 'default' && !/^#/.test(options.theme) ? (' laydate-theme-' + options.theme) : ''
+      ].join('')
+    })
+
+    //涓诲尯鍩�
+    ,elemMain = that.elemMain = []
+    ,elemHeader = that.elemHeader = []
+    ,elemCont = that.elemCont = []
+    ,elemTable = that.table = []
+
+    //搴曢儴鍖哄煙
+    ,divFooter = that.footer = lay.elem('div', {
+      'class': ELEM_FOOTER
+    });
+
+    if(options.zIndex) elem.style.zIndex = options.zIndex;
+
+    //鍗曞弻鏃ュ巻鍖哄煙
+    lay.each(new Array(2), function(i){
+      if(!options.range && i > 0){
+        return true;
+      }
+
+      //澶撮儴鍖哄煙
+      var divHeader = lay.elem('div', {
+        'class': 'layui-laydate-header'
+      })
+
+      //宸﹀彸鍒囨崲
+      ,headerChild = [function(){ //涓婁竴骞�
+        var elem = lay.elem('i', {
+          'class': 'layui-icon laydate-icon laydate-prev-y'
+        });
+        elem.innerHTML = '&#xe65a;';
+        return elem;
+      }(), function(){ //涓婁竴鏈�
+        var elem = lay.elem('i', {
+          'class': 'layui-icon laydate-icon laydate-prev-m'
+        });
+        elem.innerHTML = '&#xe603;';
+        return elem;
+      }(), function(){ //骞存湀閫夋嫨
+        var elem = lay.elem('div', {
+          'class': 'laydate-set-ym'
+        }), spanY = lay.elem('span'), spanM = lay.elem('span');
+        elem.appendChild(spanY);
+        elem.appendChild(spanM);
+        return elem;
+      }(), function(){ //涓嬩竴鏈�
+        var elem = lay.elem('i', {
+          'class': 'layui-icon laydate-icon laydate-next-m'
+        });
+        elem.innerHTML = '&#xe602;';
+        return elem;
+      }(), function(){ //涓嬩竴骞�
+        var elem = lay.elem('i', {
+          'class': 'layui-icon laydate-icon laydate-next-y'
+        });
+        elem.innerHTML = '&#xe65b;';
+        return elem;
+      }()]
+
+      //鏃ュ巻鍐呭鍖哄煙
+      ,divContent = lay.elem('div', {
+        'class': 'layui-laydate-content'
+      })
+      ,table = lay.elem('table')
+      ,thead = lay.elem('thead'), theadTr = lay.elem('tr');
+
+      //鐢熸垚骞存湀閫夋嫨
+      lay.each(headerChild, function(i, item){
+        divHeader.appendChild(item);
+      });
+
+       //鐢熸垚琛ㄦ牸
+      thead.appendChild(theadTr);
+      lay.each(new Array(6), function(i){ //琛ㄤ綋
+        var tr = table.insertRow(0);
+        lay.each(new Array(7), function(j){
+          if(i === 0){
+            var th = lay.elem('th');
+            th.innerHTML = lang.weeks[j];
+            theadTr.appendChild(th);
+          }
+          tr.insertCell(j);
+        });
+      });
+      table.insertBefore(thead, table.children[0]); //琛ㄥご
+      divContent.appendChild(table);
+
+      elemMain[i] = lay.elem('div', {
+        'class': 'layui-laydate-main laydate-main-list-'+ i
+      });
+
+      elemMain[i].appendChild(divHeader);
+      elemMain[i].appendChild(divContent);
+
+      elemHeader.push(headerChild);
+      elemCont.push(divContent);
+      elemTable.push(table);
+    });
+
+    //鐢熸垚搴曢儴鏍�
+    lay(divFooter).html(function(){
+      var html = [], btns = [];
+      if(options.type === 'datetime'){
+        html.push('<span lay-type="datetime" class="laydate-btns-time">'+ lang.timeTips +'</span>');
+      }
+      lay.each(options.btns, function(i, item){
+        var title = lang.tools[item] || 'btn';
+        if(title === 'btn')
+          title = item;
+        if(options.range && item === 'now') return;
+        if(isStatic && item === 'clear') title = options.lang === 'cn' ? '閲嶇疆' : 'Reset';
+
+        if(Object.prototype.toString.call(item) == '[object Object]'){
+          var itemKey = Object.keys(item);
+          var itemValue = item[itemKey[0]];
+          btns.push('<span lay-type="'+ itemKey +'" class="laydate-btns-'+ itemKey +'">'+ itemValue +'</span>');
+        }else{
+          btns.push('<span lay-type="'+ item +'" class="laydate-btns-'+ item +'">'+ title +'</span>');
+        }
+
+      });
+      html.push('<div class="laydate-footer-btns">'+ btns.join('') +'</div>');
+      return html.join('');
+    }());
+
+    //鎻掑叆鍒颁富鍖哄煙
+    lay.each(elemMain, function(i, main){
+      elem.appendChild(main);
+    });
+    options.showBottom && elem.appendChild(divFooter);
+
+    //鐢熸垚鑷畾涔変富棰�
+    if(/^#/.test(options.theme)){
+      var style = lay.elem('style')
+      ,styleText = [
+        '#{{id}} .layui-laydate-header{background-color:{{theme}};}'
+        ,'#{{id}} .layui-this{background-color:{{theme}} !important;}'
+      ].join('').replace(/{{id}}/g, that.elemID).replace(/{{theme}}/g, options.theme);
+
+      if('styleSheet' in style){
+        style.setAttribute('type', 'text/css');
+        style.styleSheet.cssText = styleText;
+      } else {
+        style.innerHTML = styleText;
+      }
+
+      lay(elem).addClass('laydate-theme-molv');
+      elem.appendChild(style);
+    }
+
+    //绉婚櫎涓婁竴涓帶浠�
+    that.remove(Class.thisElemDate);
+
+    //濡傛灉鏄潤鎬佸畾浣嶏紝鍒欐彃鍏ュ埌鎸囧畾鐨勫鍣ㄤ腑锛屽惁鍒欙紝鎻掑叆鍒癰ody
+    isStatic ? options.elem.append(elem) : (
+      document.body.appendChild(elem)
+      ,that.position() //瀹氫綅
+    );
+
+    that.checkDate().calendar(); //鍒濆鏍¢獙
+    that.changeEvent(); //鏃ユ湡鍒囨崲
+
+    Class.thisElemDate = that.elemID;
+
+    typeof options.ready === 'function' && options.ready(lay.extend({}, options.dateTime, {
+      month: options.dateTime.month + 1
+    }));
+  };
+
+  //鎺т欢绉婚櫎
+  Class.prototype.remove = function(prev){
+    var that = this
+    ,options = that.config
+    ,elem = lay('#'+ (prev || that.elemID));
+    if(!elem.hasClass(ELEM_STATIC)){
+      that.checkDate(function(){
+        elem.remove();
+      });
+    }
+    return that;
+  };
+
+  //瀹氫綅绠楁硶
+  Class.prototype.position = function(){
+    var that = this
+    ,options = that.config
+    ,elem = that.bindElem || options.elem[0]
+    ,rect = elem.getBoundingClientRect() //缁戝畾鍏冪礌鐨勫潗鏍�
+    ,elemWidth = that.elem.offsetWidth //鎺т欢鐨勫搴�
+    ,elemHeight = that.elem.offsetHeight //鎺т欢鐨勯珮搴�
+
+    //婊氬姩鏉¢珮搴�
+    ,scrollArea = function(type){
+      type = type ? 'scrollLeft' : 'scrollTop';
+      return document.body[type] | document.documentElement[type];
+    }
+    ,winArea = function(type){
+      return document.documentElement[type ? 'clientWidth' : 'clientHeight']
+    }, margin = 5, left = rect.left, top = rect.bottom;
+
+    //濡傛灉鍙充晶瓒呭嚭杈圭晫
+    if(left + elemWidth + margin > winArea('width')){
+      left = winArea('width') - elemWidth - margin;
+    }
+
+    //濡傛灉搴曢儴瓒呭嚭杈圭晫
+    if(top + elemHeight + margin > winArea()){
+      top = rect.top > elemHeight //椤堕儴鏄惁鏈夎冻澶熷尯鍩熸樉绀哄畬鍏�
+        ? rect.top - elemHeight
+      : winArea() - elemHeight;
+      top = top - margin*2;
+    }
+
+    if(options.position){
+      that.elem.style.position = options.position;
+    }
+    that.elem.style.left = left + (options.position === 'fixed' ? 0 : scrollArea(1)) + 'px';
+    that.elem.style.top = top + (options.position === 'fixed' ? 0 : scrollArea()) + 'px';
+  };
+
+  //鎻愮ず
+  Class.prototype.hint = function(content){
+    if(!this.elem || !lay(ELEM)[0]){
+      return false;
+    }
+    var that = this
+    ,options = that.config
+    ,div = lay.elem('div', {
+      'class': ELEM_HINT
+    });
+
+    div.innerHTML = content || '';
+    lay(that.elem).find('.'+ ELEM_HINT).remove();
+    that.elem.appendChild(div);
+
+    clearTimeout(that.hinTimer);
+    that.hinTimer = setTimeout(function(){
+      lay(that.elem).find('.'+ ELEM_HINT).remove();
+    }, 3000);
+  };
+
+  //鑾峰彇閫掑/鍑忓悗鐨勫勾鏈�
+  Class.prototype.getAsYM = function(Y, M, type){
+    type ? M-- : M++;
+    if(M < 0){
+      M = 11;
+      Y--;
+    }
+    if(M > 11){
+      M = 0;
+      Y++;
+    }
+    return [Y, M];
+  };
+
+  //绯荤粺娑堟伅
+  Class.prototype.systemDate = function(newDate){
+    var thisDate = newDate || new Date();
+    return {
+      year: thisDate.getFullYear() //骞�
+      ,month: thisDate.getMonth() //鏈�
+      ,date: thisDate.getDate() //鏃�
+      ,hours: newDate ? newDate.getHours() : 0 //鏃�
+      ,minutes: newDate ? newDate.getMinutes() : 0 //鍒�
+      ,seconds: newDate ? newDate.getSeconds() : 0 //绉�
+    }
+  };
+
+  //鏃ユ湡鏍¢獙
+  Class.prototype.checkDate = function(fn){
+    var that = this
+    ,thisDate = new Date()
+    ,options = that.config
+    ,dateTime = options.dateTime = options.dateTime || that.systemDate()
+    ,thisMaxDate, error
+
+    ,elem = that.bindElem || options.elem[0]
+    ,valType = that.isInput(elem) ? 'val' : 'html'
+    ,value = that.isInput(elem) ? elem.value : (options.position === 'static' ? '' : elem.innerHTML)
+
+    //鏍¢獙鏃ユ湡鏈夋晥鏁板瓧
+    ,checkValid = function(dateTime){
+      if(dateTime.year > LIMIT_YEAR[1]) dateTime.year = LIMIT_YEAR[1], error = true; //涓嶈兘瓒呰繃20涓囧勾
+      if(dateTime.month > 11) dateTime.month = 11, error = true;
+      if(dateTime.hours > 23) dateTime.hours = 0, error = true;
+      if(dateTime.minutes > 59) dateTime.minutes = 0, dateTime.hours++, error = true;
+      if(dateTime.seconds > 59) dateTime.seconds = 0, dateTime.minutes++, error = true;
+
+      //璁$畻褰撳墠鏈堢殑鏈�鍚庝竴澶�
+      thisMaxDate = laydate.getEndDate(dateTime.month + 1, dateTime.year);
+      if(dateTime.date > thisMaxDate) dateTime.date = thisMaxDate, error = true;
+    }
+
+    //鑾峰緱鍒濆鍖栨棩鏈熷��
+    ,initDate = function(dateTime, value, index){
+      var startEnd = ['startTime', 'endTime'];
+      value = (value.match(that.EXP_SPLIT) || []).slice(1);
+      index = index || 0;
+      if(options.range){
+        that[startEnd[index]] = that[startEnd[index]] || {};
+      }
+      lay.each(that.format, function(i, item){
+        var thisv = parseFloat(value[i]);
+        if(value[i].length < item.length) error = true;
+        if(/yyyy|y/.test(item)){ //骞�
+          if(thisv < LIMIT_YEAR[0]) thisv = LIMIT_YEAR[0], error = true; //骞翠笉鑳戒綆浜�100骞�
+          dateTime.year = thisv;
+        } else if(/MM|M/.test(item)){ //鏈�
+          if(thisv < 1) thisv = 1, error = true;
+          dateTime.month = thisv - 1;
+        } else if(/dd|d/.test(item)){ //鏃�
+          if(thisv < 1) thisv = 1, error = true;
+          dateTime.date = thisv;
+        } else if(/HH|H/.test(item)){ //鏃�
+          if(thisv < 1) thisv = 0, error = true;
+          dateTime.hours = thisv;
+          options.range && (that[startEnd[index]].hours = thisv);
+        } else if(/mm|m/.test(item)){ //鍒�
+          if(thisv < 1) thisv = 0, error = true;
+          dateTime.minutes = thisv;
+          options.range && (that[startEnd[index]].minutes = thisv);
+        } else if(/ss|s/.test(item)){ //绉�
+          if(thisv < 1) thisv = 0, error = true;
+          dateTime.seconds = thisv;
+          options.range && (that[startEnd[index]].seconds = thisv);
+        }
+      });
+      checkValid(dateTime)
+    };
+
+    if(fn === 'limit') return checkValid(dateTime), that;
+
+    value = value || options.value;
+    if(typeof value === 'string'){
+      value = value.replace(/\s+/g, ' ').replace(/^\s|\s$/g, '');
+    }
+
+    //濡傛灉鐐瑰嚮浜嗗紑濮嬶紝鍗曟湭閫夋嫨缁撴潫灏卞叧闂紝鍒欓噸鏂伴�夋嫨寮�濮�
+    if(that.startState && !that.endState){
+      delete that.startState;
+      that.endState = true;
+    };
+
+    if(typeof value === 'string' && value){
+      if(that.EXP_IF.test(value)){ //鏍¢獙鏃ユ湡鏍煎紡
+        if(options.range){
+          value = value.split(' '+ options.range +' ');
+          that.startDate = that.startDate || that.systemDate();
+          that.endDate = that.endDate || that.systemDate();
+          options.dateTime = lay.extend({}, that.startDate);
+          lay.each([that.startDate, that.endDate], function(i, item){
+            initDate(item, value[i], i);
+          });
+        } else {
+          initDate(dateTime, value)
+        }
+      } else {
+        that.hint('鏃ユ湡鏍煎紡涓嶅悎娉�<br>蹇呴』閬靛惊涓嬭堪鏍煎紡锛�<br>'+ (
+          options.range ? (options.format + ' '+ options.range +' ' + options.format) : options.format
+        ) + '<br>宸蹭负浣犻噸缃�');
+        error = true;
+      }
+    } else if(value && value.constructor === Date){ //濡傛灉鍊间负鏃ユ湡瀵硅薄鏃�
+      options.dateTime = that.systemDate(value);
+    } else {
+      options.dateTime = that.systemDate();
+      delete that.startState;
+      delete that.endState;
+      delete that.startDate;
+      delete that.endDate;
+      delete that.startTime;
+      delete that.endTime;
+    }
+
+    checkValid(dateTime);
+
+    if(error && value){
+      that.setValue(
+        options.range ? (that.endDate ? that.parse() : '') : that.parse()
+      );
+    }
+    fn && fn();
+    return that;
+  };
+  //鏍囪鍛ㄦ湯 鍦ㄥ懆鏈笂鏍囨爣璁扳�樹紤鈥�
+  Class.prototype.week = function(){
+    var that = this;
+    var date=new Date();
+    var year=date.getFullYear();
+    var m,d,day,dayNum,result={};
+    for(m=1;m<=12;m++){
+      switch(m){
+        case 1:
+        case 3:
+        case 5:
+        case 7:
+        case 8:
+        case 10:
+        case 12:
+          dayNum=31;
+          break;
+        case 4:
+        case 6:
+        case 9:
+        case 11:
+          dayNum=30;
+          break;
+        case 2:
+          if(year%4==0&&year%100!=0||year%400==0){
+            dayNum=29;
+          }else{
+            dayNum=28;
+          }
+          break;
+      }
+      for(d=1;d<=dayNum;d++){
+        date.setMonth(m-1,d);
+        day=date.getDay();
+        if(day==0 || day == 6){
+          //result.push(date.getFullYear()+"-"+(date.getMonth()+1)+"-"+date.getDate());
+          result[date.getFullYear()+"-"+(date.getMonth()+1)+"-"+date.getDate()] ="<span>"+date.getDate()+"</span><sup style='font-size:10px'>浼�</sup>"//"浼�"
+        }
+      }
+    }
+    return result
+  };
+  //鍛ㄦ湯鏍囪
+  Class.prototype.markWeek = function(td,YMD){
+    var that = this
+        ,mark, options = that.config;
+    lay.each(that.week(), function(key, title){
+      var keys = key.split('-');
+      if((keys[0] == YMD[0] || keys[0] == 0) //姣忓勾鐨勬瘡鏈�
+          && (keys[1] == YMD[1] || keys[1] == 0) //姣忔湀鐨勬瘡鏃�
+          && keys[2] == YMD[2]){ //鐗瑰畾鏃�
+        mark = title || YMD[2];
+      }
+    });
+    mark && td.html( mark );
+
+    return that;
+  };
+  Class.prototype.specialMark = function(td,YMD){
+    var that = this
+        ,mark, options = that.config;
+    lay.each(options.specialmark, function(key, title){
+      var keys = key.split('-');
+      if((keys[0] == YMD[0] || keys[0] == 0) //姣忓勾鐨勬瘡鏈�
+          && (keys[1] == YMD[1] || keys[1] == 0) //姣忔湀鐨勬瘡鏃�
+          && keys[2] == YMD[2]){ //鐗瑰畾鏃�
+        mark = title || YMD[2];
+      }
+    });
+    mark && td.addClass(mark);//html('<span class="laydate-day-mark">'+ mark +'</span>');
+
+    //return that;
+  };
+  //鍏巻閲嶈鏃ユ湡涓庤嚜瀹氫箟澶囨敞
+  Class.prototype.mark = function(td, YMD){
+    var that = this
+    ,mark, options = that.config;
+    lay.each(options.mark, function(key, title){
+      var keys = key.split('-');
+      if((keys[0] == YMD[0] || keys[0] == 0) //姣忓勾鐨勬瘡鏈�
+      && (keys[1] == YMD[1] || keys[1] == 0) //姣忔湀鐨勬瘡鏃�
+      && keys[2] == YMD[2]){ //鐗瑰畾鏃�
+        mark = title || YMD[2];
+      }
+    });
+    mark && td.html('<span class="laydate-day-mark">'+ mark +'</span>');
+
+    return that;
+  };
+  //鐗规畩鏍峰紡
+  //鏃犳晥鏃ユ湡鑼冨洿鐨勬爣璁�
+  Class.prototype.limit = function(elem, date, index, time){
+    var that = this
+    ,options = that.config, timestrap = {}
+    ,dateTime = options[index > 41 ? 'endDate' : 'dateTime']
+    ,isOut, thisDateTime = lay.extend({}, dateTime, date || {});
+    lay.each({
+      now: thisDateTime
+      ,min: options.min
+      ,max: options.max
+    }, function(key, item){
+      timestrap[key] = that.newDate(lay.extend({
+        year: item.year
+        ,month: item.month
+        ,date: item.date
+      }, function(){
+        var hms = {};
+        lay.each(time, function(i, keys){
+          hms[keys] = item[keys];
+        });
+        return hms;
+      }())).getTime();  //time锛氭槸鍚︽瘮杈冩椂鍒嗙
+    });
+
+    isOut = timestrap.now < timestrap.min || timestrap.now > timestrap.max;
+    elem && elem[isOut ? 'addClass' : 'removeClass'](DISABLED);
+    return isOut;
+  };
+
+  //鏃ュ巻琛�
+  Class.prototype.calendar = function(value){
+    var that = this
+    ,options = that.config
+    ,dateTime = value || options.dateTime
+    ,thisDate = new Date(), startWeek, prevMaxDate, thisMaxDate
+    ,lang = that.lang()
+
+    ,isAlone = options.type !== 'date' && options.type !== 'datetime'
+    ,index = value ? 1 : 0
+    ,tds = lay(that.table[index]).find('td')
+    ,elemYM = lay(that.elemHeader[index][2]).find('span');
+
+    if(dateTime.year < LIMIT_YEAR[0]) dateTime.year = LIMIT_YEAR[0], that.hint('鏈�浣庡彧鑳芥敮鎸佸埌鍏厓'+ LIMIT_YEAR[0] +'骞�');
+    if(dateTime.year > LIMIT_YEAR[1]) dateTime.year = LIMIT_YEAR[1], that.hint('鏈�楂樺彧鑳芥敮鎸佸埌鍏厓'+ LIMIT_YEAR[1] +'骞�');
+
+    //璁板綍鍒濆鍊�
+    if(!that.firstDate){
+      that.firstDate = lay.extend({}, dateTime);
+    }
+
+    //璁$畻褰撳墠鏈堢涓�澶╃殑鏄熸湡
+    thisDate.setFullYear(dateTime.year, dateTime.month, 1);
+    startWeek = thisDate.getDay();
+
+    prevMaxDate = laydate.getEndDate(dateTime.month || 12, dateTime.year); //璁$畻涓婁釜鏈堢殑鏈�鍚庝竴澶�
+    thisMaxDate = laydate.getEndDate(dateTime.month + 1, dateTime.year); //璁$畻褰撳墠鏈堢殑鏈�鍚庝竴澶�
+
+    //璧嬪�兼棩
+    lay.each(tds, function(index, item){
+      var YMD = [dateTime.year, dateTime.month], st = 0;
+      item = lay(item);
+      item.removeAttr('class');
+      if(index < startWeek){
+        st = prevMaxDate - startWeek + index;
+        item.addClass('laydate-day-prev');
+        YMD = that.getAsYM(dateTime.year, dateTime.month, 'sub');
+      } else if(index >= startWeek && index < thisMaxDate + startWeek){
+        st = index - startWeek;
+        if(!options.range){
+          st + 1 === dateTime.date && item.addClass(THIS);
+        }
+      } else {
+        st = index - thisMaxDate - startWeek;
+        item.addClass('laydate-day-next');
+        YMD = that.getAsYM(dateTime.year, dateTime.month);
+      }
+      YMD[1]++;
+      YMD[2] = st + 1;
+      item.attr('lay-ymd', YMD.join('-')).html(YMD[2]);
+      that.mark(item, YMD).limit(item, {
+        year: YMD[0]
+        ,month: YMD[1] - 1
+        ,date: YMD[2]
+      }, index);
+      options.markweek && that.markWeek(item, YMD).limit(item, {
+        year: YMD[0]
+        ,month: YMD[1] - 1
+        ,date: YMD[2]
+      }, index);
+      options.specialmark && that.specialMark(item, YMD)
+    });
+
+    //鍚屾澶撮儴骞存湀
+    lay(elemYM[0]).attr('lay-ym', dateTime.year + '-' + (dateTime.month + 1));
+    lay(elemYM[1]).attr('lay-ym', dateTime.year + '-' + (dateTime.month + 1));
+
+    if(options.lang === 'cn'){
+      lay(elemYM[0]).attr('lay-type', 'year').html(dateTime.year + '骞�')
+      lay(elemYM[1]).attr('lay-type', 'month').html((dateTime.month + 1) + '鏈�');
+    } else {
+      lay(elemYM[0]).attr('lay-type', 'month').html(lang.month[dateTime.month]);
+      lay(elemYM[1]).attr('lay-type', 'year').html(dateTime.year);
+    }
+
+    //鍒濆榛樿閫夋嫨鍣�
+    if(isAlone){
+      if(options.range){
+        value ? that.endDate = (that.endDate || {
+          year: dateTime.year + (options.type === 'year' ? 1 : 0)
+          ,month: dateTime.month + (options.type === 'month' ? 0 : -1)
+        }) : (that.startDate = that.startDate || {
+          year: dateTime.year
+          ,month: dateTime.month
+        });
+        if(value){
+          that.listYM = [
+            [that.startDate.year, that.startDate.month + 1]
+            ,[that.endDate.year, that.endDate.month + 1]
+          ];
+          that.list(options.type, 0).list(options.type, 1);
+          //鍚屾鎸夐挳鍙偣鐘舵��
+          options.type === 'time' ? that.setBtnStatus('鏃堕棿'
+            ,lay.extend({}, that.systemDate(), that.startTime)
+            ,lay.extend({}, that.systemDate(), that.endTime)
+          ) : that.setBtnStatus(true);
+        }
+      }
+      if(!options.range){
+        that.listYM = [[dateTime.year, dateTime.month + 1]];
+        that.list(options.type, 0);
+      }
+    }
+
+    //璧嬪�煎弻鏃ュ巻
+    if(options.range && !value){
+      var EYM = that.getAsYM(dateTime.year, dateTime.month)
+      that.calendar(lay.extend({}, dateTime, {
+        year: EYM[0]
+        ,month: EYM[1]
+      }));
+    }
+
+    //閫氳繃妫�娴嬪綋鍓嶆湁鏁堟棩鏈燂紝鏉ヨ瀹氱‘瀹氭寜閽槸鍚﹀彲鐐�
+    if(!options.range) that.limit(lay(that.footer).find(ELEM_CONFIRM), null, 0, ['hours', 'minutes', 'seconds']);
+
+    //鏍囪閫夋嫨鑼冨洿
+    if(options.range && value && !isAlone) that.stampRange();
+    return that;
+  };
+
+  //鐢熸垚骞存湀鏃跺垎绉掑垪琛�
+  Class.prototype.list = function(type, index){
+    var that = this
+    ,options = that.config
+    ,dateTime = options.dateTime
+    ,lang = that.lang()
+    ,isAlone = options.range && options.type !== 'date' && options.type !== 'datetime' //鐙珛鑼冨洿閫夋嫨鍣�
+
+    ,ul = lay.elem('ul', {
+      'class': ELEM_LIST + ' ' + ({
+        year: 'laydate-year-list'
+        ,month: 'laydate-month-list'
+        ,time: 'laydate-time-list'
+      })[type]
+    })
+    ,elemHeader = that.elemHeader[index]
+    ,elemYM = lay(elemHeader[2]).find('span')
+    ,elemCont = that.elemCont[index || 0]
+    ,haveList = lay(elemCont).find('.'+ ELEM_LIST)[0]
+    ,isCN = options.lang === 'cn'
+    ,text = isCN ? '骞�' : ''
+
+    ,listYM = that.listYM[index] || {}
+    ,hms = ['hours', 'minutes', 'seconds']
+    ,startEnd = ['startTime', 'endTime'][index];
+
+    if(listYM[0] < 1) listYM[0] = 1;
+
+    if(type === 'year'){ //骞村垪琛�
+      var yearNum, startY = yearNum = listYM[0] - 7;
+      if(startY < 1) startY = yearNum = 1;
+      lay.each(new Array(15), function(i){
+        var li = lay.elem('li', {
+          'lay-ym': yearNum
+        }), ymd = {year: yearNum};
+        yearNum == listYM[0] && lay(li).addClass(THIS);
+        li.innerHTML = yearNum + text;
+        ul.appendChild(li);
+        if(yearNum < that.firstDate.year){
+          ymd.month = options.min.month;
+          ymd.date = options.min.date;
+        } else if(yearNum >= that.firstDate.year){
+          ymd.month = options.max.month;
+          ymd.date = options.max.date;
+        }
+        that.limit(lay(li), ymd, index);
+        yearNum++;
+      });
+      lay(elemYM[isCN ? 0 : 1]).attr('lay-ym', (yearNum - 8) + '-' + listYM[1])
+      .html((startY + text) + ' - ' + (yearNum - 1 + text));
+    } else if(type === 'month'){ //鏈堝垪琛�
+      lay.each(new Array(12), function(i){
+        var li = lay.elem('li', {
+          'lay-ym': i
+        }), ymd = {year: listYM[0], month: i};
+        i + 1 == listYM[1] && lay(li).addClass(THIS);
+        li.innerHTML = lang.month[i] + (isCN ? '鏈�' : '');
+        ul.appendChild(li);
+        if(listYM[0] < that.firstDate.year){
+          ymd.date = options.min.date;
+        } else if(listYM[0] >= that.firstDate.year){
+          ymd.date = options.max.date;
+        }
+        that.limit(lay(li), ymd, index);
+      });
+      lay(elemYM[isCN ? 0 : 1]).attr('lay-ym', listYM[0] + '-' + listYM[1])
+      .html(listYM[0] + text);
+    } else if(type === 'time'){ //鏃堕棿鍒楄〃
+      //妫�娴嬫椂鍒嗙鐘舵�佹槸鍚﹀湪鏈夋晥鏃ユ湡鏃堕棿鑼冨洿鍐�
+      var setTimeStatus = function(){
+        lay(ul).find('ol').each(function(i, ol){
+          lay(ol).find('li').each(function(ii, li){
+            that.limit(lay(li), [{
+              hours: ii
+            }, {
+              hours: that[startEnd].hours
+              ,minutes: ii
+            }, {
+              hours: that[startEnd].hours
+              ,minutes: that[startEnd].minutes
+              ,seconds: ii
+            }][i], index, [['hours'], ['hours', 'minutes'], ['hours', 'minutes', 'seconds']][i]);
+          });
+        });
+        if(!options.range) that.limit(lay(that.footer).find(ELEM_CONFIRM), that[startEnd], 0, ['hours', 'minutes', 'seconds']);
+      };
+      if(options.range){
+        if(!that[startEnd]) that[startEnd] = {
+          hours: 0
+          ,minutes: 0
+          ,seconds: 0
+        };
+      } else {
+        that[startEnd] = dateTime;
+      }
+      lay.each([24, 60, 60], function(i, item){
+        var li = lay.elem('li'), childUL = ['<p>'+ lang.time[i] +'</p><ol>'];
+        lay.each(new Array(item), function(ii){
+          childUL.push('<li'+ (that[startEnd][hms[i]] === ii ? ' class="'+ THIS +'"' : '') +'>'+ lay.digit(ii, 2) +'</li>');
+        });
+        li.innerHTML = childUL.join('') + '</ol>';
+        ul.appendChild(li);
+      });
+      setTimeStatus();
+    }
+
+    //鎻掑叆瀹瑰櫒
+    if(haveList) elemCont.removeChild(haveList);
+    elemCont.appendChild(ul);
+
+    //骞存湀
+    if(type === 'year' || type === 'month'){
+      //鏄剧ず鍒囨崲绠ご
+      lay(that.elemMain[index]).addClass('laydate-ym-show');
+
+      //閫変腑
+      lay(ul).find('li').on('click', function(){
+        var ym = lay(this).attr('lay-ym') | 0;
+        if(lay(this).hasClass(DISABLED)) return;
+
+        if(index === 0){
+          dateTime[type] = ym;
+          if(isAlone) that.startDate[type] = ym;
+          that.limit(lay(that.footer).find(ELEM_CONFIRM), null, 0);
+        } else { //鑼冨洿閫夋嫨
+          if(isAlone){ //闈瀌ate/datetime绫诲瀷
+            that.endDate[type] = ym;
+          } else { //date/datetime绫诲瀷
+            var YM = type === 'year'
+              ? that.getAsYM(ym, listYM[1] - 1, 'sub')
+            : that.getAsYM(listYM[0], ym, 'sub');
+            lay.extend(dateTime, {
+              year: YM[0]
+              ,month: YM[1]
+            });
+          }
+        }
+
+        if(options.type === 'year' || options.type === 'month'){
+          lay(ul).find('.'+ THIS).removeClass(THIS);
+          lay(this).addClass(THIS);
+
+          //濡傛灉涓哄勾鏈堥�夋嫨鍣紝鐐瑰嚮浜嗗勾鍒楄〃锛屽垯鍒囨崲鍒版湀閫夋嫨鍣�
+          if(options.type === 'month' && type === 'year'){
+            that.listYM[index][0] = ym;
+            isAlone && (that[['startDate', 'endDate'][index]].year = ym);
+            that.list('month', index);
+          }
+        } else {
+          that.checkDate('limit').calendar();
+          that.closeList();
+        }
+
+        that.setBtnStatus(); //鍚屾鎸夐挳鍙偣鐘舵��
+        options.range || that.done(null, 'change');
+        lay(that.footer).find(ELEM_TIME_BTN).removeClass(DISABLED);
+      });
+    } else {
+      var span = lay.elem('span', {
+        'class': ELEM_TIME_TEXT
+      }), scroll = function(){ //婊氬姩鏉″畾浣�
+        lay(ul).find('ol').each(function(i){
+          var ol = this
+          ,li = lay(ol).find('li')
+          ol.scrollTop = 30*(that[startEnd][hms[i]] - 2);
+          if(ol.scrollTop <= 0){
+            li.each(function(ii, item){
+              if(!lay(this).hasClass(DISABLED)){
+                ol.scrollTop = 30*(ii - 2);
+                return true;
+              }
+            });
+          }
+        });
+      }, haveSpan = lay(elemHeader[2]).find('.'+ ELEM_TIME_TEXT);
+      scroll()
+      span.innerHTML = options.range ? [lang.startTime,lang.endTime][index] : lang.timeTips
+      lay(that.elemMain[index]).addClass('laydate-time-show');
+      if(haveSpan[0]) haveSpan.remove();
+      elemHeader[2].appendChild(span);
+
+      lay(ul).find('ol').each(function(i){
+        var ol = this;
+        //閫夋嫨鏃跺垎绉�
+        lay(ol).find('li').on('click', function(){
+          var value = this.innerHTML | 0;
+          if(lay(this).hasClass(DISABLED)) return;
+          if(options.range){
+            that[startEnd][hms[i]]  = value;
+          } else {
+            dateTime[hms[i]] = value;
+          }
+          lay(ol).find('.'+ THIS).removeClass(THIS);
+          lay(this).addClass(THIS);
+
+          setTimeStatus();
+          scroll();
+          (that.endDate || options.type === 'time') && that.done(null, 'change');
+
+          //鍚屾鎸夐挳鍙偣鐘舵��
+          that.setBtnStatus();
+        });
+      });
+    }
+
+    return that;
+  };
+
+  //璁板綍鍒楄〃鍒囨崲鍚庣殑骞存湀
+  Class.prototype.listYM = [];
+
+  //鍏抽棴鍒楄〃
+  Class.prototype.closeList = function(){
+    var that = this
+    ,options = that.config;
+
+    lay.each(that.elemCont, function(index, item){
+      lay(this).find('.'+ ELEM_LIST).remove();
+      lay(that.elemMain[index]).removeClass('laydate-ym-show laydate-time-show');
+    });
+    lay(that.elem).find('.'+ ELEM_TIME_TEXT).remove();
+  };
+
+  //妫�娴嬬粨鏉熸棩鏈熸槸鍚﹁秴鍑哄紑濮嬫棩鏈�
+  Class.prototype.setBtnStatus = function(tips, start, end){
+    var that = this
+    ,options = that.config
+    ,isOut, elemBtn = lay(that.footer).find(ELEM_CONFIRM)
+    ,isAlone = options.range && options.type !== 'date' && options.type !== 'time';
+    if(isAlone){
+      start = start || that.startDate;
+      end = end || that.endDate;
+      isOut = that.newDate(start).getTime() > that.newDate(end).getTime();
+
+      //濡傛灉涓嶅湪鏈夋晥鏃ユ湡鍐咃紝鐩存帴绂佺敤鎸夐挳锛屽惁鍒欐瘮杈冨紑濮嬪拰缁撴潫鏃ユ湡
+      (that.limit(null, start) || that.limit(null, end))
+        ? elemBtn.addClass(DISABLED)
+      : elemBtn[isOut ? 'addClass' : 'removeClass'](DISABLED);
+
+      //鏄惁寮傚父鎻愮ず
+      if(tips && isOut) that.hint(
+        typeof tips === 'string' ? TIPS_OUT.replace(/鏃ユ湡/g, tips) : TIPS_OUT
+      );
+    }
+  };
+
+  //杞箟涓鸿瀹氭牸寮忕殑鏃ユ湡瀛楃
+  Class.prototype.parse = function(state, date){
+    var that = this
+    ,options = that.config
+    ,dateTime = date || (state
+      ? lay.extend({}, that.endDate, that.endTime)
+    : (options.range ? lay.extend({}, that.startDate, that.startTime) : options.dateTime))
+    ,format = that.format.concat();
+
+    //杞箟涓鸿瀹氭牸寮�
+    lay.each(format, function(i, item){
+      if(/yyyy|y/.test(item)){ //骞�
+        format[i] = lay.digit(dateTime.year, item.length);
+      } else if(/MM|M/.test(item)){ //鏈�
+        format[i] = lay.digit(dateTime.month + 1, item.length);
+      } else if(/dd|d/.test(item)){ //鏃�
+        format[i] = lay.digit(dateTime.date, item.length);
+      } else if(/HH|H/.test(item)){ //鏃�
+        format[i] = lay.digit(dateTime.hours, item.length);
+      } else if(/mm|m/.test(item)){ //鍒�
+        format[i] = lay.digit(dateTime.minutes, item.length);
+      } else if(/ss|s/.test(item)){ //绉�
+        format[i] = lay.digit(dateTime.seconds, item.length);
+      }
+    });
+
+    //杩斿洖鏃ユ湡鑼冨洿瀛楃
+    if(options.range && !state){
+      return format.join('') + ' '+ options.range +' ' + that.parse(1);
+    }
+
+    return format.join('');
+  };
+
+  //鍒涘缓鎸囧畾鏃ユ湡鏃堕棿瀵硅薄
+  Class.prototype.newDate = function(dateTime){
+    dateTime = dateTime || {};
+    return new Date(
+      dateTime.year || 1
+      ,dateTime.month || 0
+      ,dateTime.date || 1
+      ,dateTime.hours || 0
+      ,dateTime.minutes || 0
+      ,dateTime.seconds || 0
+    );
+  };
+
+  //璧嬪��
+  Class.prototype.setValue = function(value){
+    var that = this
+    ,options = that.config
+    ,elem = that.bindElem || options.elem[0]
+    ,valType = that.isInput(elem) ? 'val' : 'html'
+
+    options.position === 'static' || lay(elem)[valType](value || '');
+    return this;
+  };
+
+  //鏍囪鑼冨洿鍐呯殑鏃ユ湡
+  Class.prototype.stampRange = function(){
+    var that = this
+    ,options = that.config
+    ,startTime, endTime
+    ,tds = lay(that.elem).find('td');
+
+    if(options.range && !that.endDate) lay(that.footer).find(ELEM_CONFIRM).addClass(DISABLED);
+    if(!that.endDate) return;
+
+    startTime = that.newDate({
+      year: that.startDate.year
+      ,month: that.startDate.month
+      ,date: that.startDate.date
+    }).getTime();
+
+    endTime = that.newDate({
+      year: that.endDate.year
+      ,month: that.endDate.month
+      ,date: that.endDate.date
+    }).getTime();
+
+    if(startTime > endTime) return that.hint(TIPS_OUT);
+
+    lay.each(tds, function(i, item){
+      var ymd = lay(item).attr('lay-ymd').split('-')
+      ,thisTime = that.newDate({
+        year: ymd[0]
+        ,month: ymd[1] - 1
+        ,date: ymd[2]
+      }).getTime();
+      lay(item).removeClass(ELEM_SELECTED + ' ' + THIS);
+      if(thisTime === startTime || thisTime === endTime){
+        lay(item).addClass(
+          lay(item).hasClass(ELEM_PREV) || lay(item).hasClass(ELEM_NEXT)
+            ? ELEM_SELECTED
+          : THIS
+        );
+      }
+      if(thisTime > startTime && thisTime < endTime){
+        lay(item).addClass(ELEM_SELECTED);
+      }
+    });
+  };
+
+  //鎵цdone/change鍥炶皟
+  Class.prototype.done = function(param, type){
+    var that = this
+    ,options = that.config
+    ,start = lay.extend({}, that.startDate ? lay.extend(that.startDate, that.startTime) : options.dateTime)
+    ,end = lay.extend({}, lay.extend(that.endDate, that.endTime))
+
+    lay.each([start, end], function(i, item){
+      if(!('month' in item)) return;
+      lay.extend(item, {
+        month: item.month + 1
+      });
+    });
+
+    param = param || [that.parse(), start, end];
+    typeof options[type || 'done'] === 'function' && options[type || 'done'].apply(options, param);
+
+    return that;
+  };
+
+  //閫夋嫨鏃ユ湡
+  Class.prototype.choose = function(td){
+    var that = this
+    ,options = that.config
+    ,dateTime = options.dateTime
+
+    ,tds = lay(that.elem).find('td')
+    ,YMD = td.attr('lay-ymd').split('-')
+
+    ,setDateTime = function(one){
+      var thisDate = new Date();
+
+      //鍚屾dateTime
+      one && lay.extend(dateTime, YMD);
+
+      //璁板綍寮�濮嬫棩鏈�
+      if(options.range){
+        that.startDate ? lay.extend(that.startDate, YMD) : (
+          that.startDate = lay.extend({}, YMD, that.startTime)
+        );
+        that.startYMD = YMD;
+      }
+    };
+
+    YMD = {
+      year: YMD[0] | 0
+      ,month: (YMD[1] | 0) - 1
+      ,date: YMD[2] | 0
+    };
+
+    if(td.hasClass(DISABLED)) return;
+
+    //鑼冨洿閫夋嫨
+    if(options.range){
+
+      lay.each(['startTime', 'endTime'], function(i, item){
+        that[item] = that[item] || {
+          hours: 0
+          ,minutes: 0
+          ,seconds: 0
+        };
+      });
+
+      if(that.endState){ //閲嶆柊閫夋嫨
+        setDateTime();
+        delete that.endState;
+        delete that.endDate;
+        that.startState = true;
+        tds.removeClass(THIS + ' ' + ELEM_SELECTED);
+        td.addClass(THIS);
+      } else if(that.startState){ //閫変腑鎴
+        td.addClass(THIS);
+
+        that.endDate ? lay.extend(that.endDate, YMD) : (
+          that.endDate = lay.extend({}, YMD, that.endTime)
+        );
+
+        //鍒ゆ柇鏄惁椤烘椂鎴栭�嗘椂閫夋嫨
+        if(that.newDate(YMD).getTime() < that.newDate(that.startYMD).getTime()){
+          var startDate = lay.extend({}, that.endDate, {
+            hours: that.startDate.hours
+            ,minutes: that.startDate.minutes
+            ,seconds: that.startDate.seconds
+          });
+          lay.extend(that.endDate, that.startDate, {
+            hours: that.endDate.hours
+            ,minutes: that.endDate.minutes
+            ,seconds: that.endDate.seconds
+          });
+          that.startDate = startDate;
+        }
+
+        options.showBottom || that.done();
+        that.stampRange(); //鏍囪鑼冨洿鍐呯殑鏃ユ湡
+        that.endState = true;
+        that.done(null, 'change');
+      } else { //閫変腑寮�濮�
+        td.addClass(THIS);
+        setDateTime();
+        that.startState = true;
+      }
+      lay(that.footer).find(ELEM_CONFIRM)[that.endDate ? 'removeClass' : 'addClass'](DISABLED);
+    } else if(options.position === 'static'){ //鐩存帴宓屽鐨勯�変腑
+      setDateTime(true);
+      that.calendar().done().done(null, 'change');
+    } else if(options.type === 'date'){
+      setDateTime(true);
+      that.setValue(that.parse()).remove().done();
+    } else if(options.type === 'datetime'){
+      setDateTime(true);
+      that.calendar().done(null, 'change');
+    }
+  };
+
+  //搴曢儴鎸夐挳
+  Class.prototype.tool = function(btn, type){
+    var that = this
+    ,options = that.config
+    ,dateTime = options.dateTime
+    ,isStatic = options.position === 'static'
+    ,active = {
+      //閫夋嫨鏃堕棿
+      datetime: function(){
+        if(lay(btn).hasClass(DISABLED)) return;
+        that.list('time', 0);
+        options.range && that.list('time', 1);
+        lay(btn).attr('lay-type', 'date').html(that.lang().dateTips);
+      }
+
+      //閫夋嫨鏃ユ湡
+      ,date: function(){
+        that.closeList();
+        lay(btn).attr('lay-type', 'datetime').html(that.lang().timeTips);
+      }
+
+      //娓呯┖銆侀噸缃�
+      ,clear: function(){
+        that.setValue('').remove();
+        isStatic && (
+          lay.extend(dateTime, that.firstDate)
+          ,that.calendar()
+        )
+        options.range && (
+          delete that.startState
+          ,delete that.endState
+          ,delete that.endDate
+          ,delete that.startTime
+          ,delete that.endTime
+        );
+        that.done(['', {}, {}]);
+      }
+
+      //鐜板湪
+      ,now: function(){
+        var thisDate = new Date();
+        lay.extend(dateTime, that.systemDate(), {
+          hours: thisDate.getHours()
+          ,minutes: thisDate.getMinutes()
+          ,seconds: thisDate.getSeconds()
+        });
+        that.setValue(that.parse()).remove();
+        isStatic && that.calendar();
+        that.done();
+      }
+
+      //纭畾
+      ,confirm: function(){
+        if(options.range){
+          if(!that.endDate) return that.hint('璇峰厛閫夋嫨鏃ユ湡鑼冨洿');
+          if(lay(btn).hasClass(DISABLED)) return that.hint(
+            options.type === 'time' ? TIPS_OUT.replace(/鏃ユ湡/g, '鏃堕棿') : TIPS_OUT
+          );
+        } else {
+          if(lay(btn).hasClass(DISABLED)) return that.hint('涓嶅湪鏈夋晥鏃ユ湡鎴栨椂闂磋寖鍥村唴');
+        }
+        that.done();
+        that.setValue(that.parse()).remove()
+      },
+      //宸ヤ綔鏃�
+      workday: function(){
+          if(lay(btn).hasClass(DISABLED)) return that.hint('涓嶅湪鏈夋晥鏃ユ湡鎴栨椂闂磋寖鍥村唴');
+        that.done();
+        var  oid =options.detailoid[that.parse()]; //$webUtil.getOidFromGrid("table_" + options.thisid,true,true);
+        var param = {
+            oid : oid,
+           // date:that.parse(),
+            type:"workday"
+        };
+        $webUtil.post(options.workdayurl,param,function(result){
+          if(result.success){
+            $webUtil.showMsg("璁剧疆鎴愬姛");
+            layui.use("table",function(){
+              var table = layui.table;
+              table.reload("table_detail_"+options.thisid)
+            })
+          }else{
+            $webUtil.showErrorMsg(result.msg);
+          }
+        });
+      }
+      //鍋囨湡
+      ,holiday: function(){
+        if(lay(btn).hasClass(DISABLED)) return that.hint('涓嶅湪鏈夋晥鏃ユ湡鎴栨椂闂磋寖鍥村唴');
+        that.done();
+        var  oid = options.detailoid[that.parse()];//$webUtil.getOidFromGrid("table_" + options.thisid,true,true);
+        var param = {
+          oid : oid,
+        //  date:that.parse(),
+          type:"holidays"
+        };
+        $webUtil.post(options.holidayurl,param,function(result){
+          if(result.success){
+            $webUtil.showMsg("璁剧疆鎴愬姛");
+            layui.use("table",function(){
+              var table = layui.table;
+              table.reload("table_detail_"+options.thisid)
+            })
+          }else{
+            $webUtil.showErrorMsg(result.msg);
+          }
+        });
+      }
+    };
+    /*if(options.actions){
+      var actions = options.actions;
+      active[type] = actions[type]
+    }*/
+    active[type] && active[type]();
+  };
+
+  //缁熶竴鍒囨崲澶勭悊
+  Class.prototype.change = function(index){
+    var that = this
+    ,options = that.config
+    ,dateTime = options.dateTime
+    ,isAlone = options.range && (options.type === 'year' || options.type === 'month')
+
+    ,elemCont = that.elemCont[index || 0]
+    ,listYM = that.listYM[index]
+    ,addSubYeay = function(type){
+      var startEnd = ['startDate', 'endDate'][index]
+      ,isYear = lay(elemCont).find('.laydate-year-list')[0]
+      ,isMonth = lay(elemCont).find('.laydate-month-list')[0];
+
+      //鍒囨崲骞村垪琛�
+      if(isYear){
+        listYM[0] = type ? listYM[0] - 15 : listYM[0] + 15;
+        that.list('year', index);
+      }
+
+      if(isMonth){ //鍒囨崲鏈堥潰鏉夸腑鐨勫勾
+        type ? listYM[0]-- : listYM[0]++;
+        that.list('month', index);
+      }
+
+      if(isYear || isMonth){
+        lay.extend(dateTime, {
+          year: listYM[0]
+        });
+        if(isAlone) that[startEnd].year = listYM[0];
+        options.range || that.done(null, 'change');
+        that.setBtnStatus();
+        options.range || that.limit(lay(that.footer).find(ELEM_CONFIRM), {
+          year: listYM[0]
+        });
+      }
+      return isYear || isMonth;
+    };
+
+    return {
+      prevYear: function(){
+        if(addSubYeay('sub')) return;
+        dateTime.year--;
+        that.checkDate('limit').calendar();
+        options.range || that.done(null, 'change');
+      }
+      ,prevMonth: function(){
+        var YM = that.getAsYM(dateTime.year, dateTime.month, 'sub');
+        lay.extend(dateTime, {
+          year: YM[0]
+          ,month: YM[1]
+        });
+        that.checkDate('limit').calendar();
+        options.range || that.done(null, 'change');
+      }
+      ,nextMonth: function(){
+        var YM = that.getAsYM(dateTime.year, dateTime.month);
+        lay.extend(dateTime, {
+          year: YM[0]
+          ,month: YM[1]
+        });
+        that.checkDate('limit').calendar();
+        options.range || that.done(null, 'change');
+      }
+      ,nextYear: function(){
+        if(addSubYeay()) return;
+        dateTime.year++
+        that.checkDate('limit').calendar();
+        options.range || that.done(null, 'change');
+      }
+    };
+  };
+
+  //鏃ユ湡鍒囨崲浜嬩欢
+  Class.prototype.changeEvent = function(){
+    var that = this
+    ,options = that.config;
+
+    //鏃ユ湡閫夋嫨浜嬩欢
+    lay(that.elem).on('click', function(e){
+      lay.stope(e);
+    });
+
+    //骞存湀鍒囨崲
+    lay.each(that.elemHeader, function(i, header){
+      //涓婁竴骞�
+      lay(header[0]).on('click', function(e){
+        that.change(i).prevYear();
+      });
+
+      //涓婁竴鏈�
+      lay(header[1]).on('click', function(e){
+        that.change(i).prevMonth();
+      });
+
+      //閫夋嫨骞存湀
+      lay(header[2]).find('span').on('click', function(e){
+        var othis = lay(this)
+        ,layYM = othis.attr('lay-ym')
+        ,layType = othis.attr('lay-type');
+
+        if(!layYM) return;
+
+        layYM = layYM.split('-');
+
+        that.listYM[i] = [layYM[0] | 0, layYM[1] | 0];
+        that.list(layType, i);
+        lay(that.footer).find(ELEM_TIME_BTN).addClass(DISABLED);
+      });
+
+      //涓嬩竴鏈�
+      lay(header[3]).on('click', function(e){
+        that.change(i).nextMonth();
+      });
+
+      //涓嬩竴骞�
+      lay(header[4]).on('click', function(e){
+        that.change(i).nextYear();
+      });
+    });
+
+    //鐐瑰嚮鏃ユ湡
+    lay.each(that.table, function(i, table){
+      var tds = lay(table).find('td');
+      tds.on('click', function(){
+        that.choose(lay(this));
+      });
+    });
+
+    //鐐瑰嚮搴曢儴鎸夐挳
+    lay(that.footer).find('span').on('click', function(){
+      var type = lay(this).attr('lay-type');
+      that.tool(this, type);
+    });
+  };
+
+  //鏄惁杈撳叆妗�
+  Class.prototype.isInput = function(elem){
+    return /input|textarea/.test(elem.tagName.toLocaleLowerCase());
+  };
+
+  //缁戝畾鐨勫厓绱犱簨浠跺鐞�
+  Class.prototype.events = function(){
+    var that = this
+    ,options = that.config
+
+    //缁戝畾鍛煎嚭鎺т欢浜嬩欢
+    ,showEvent = function(elem, bind){
+      elem.on(options.trigger, function(){
+        bind && (that.bindElem = this);
+        if($(this).hasClass('layui-field-readonly')){
+          return;
+        }
+        that.render();
+      });
+    };
+
+    if(!options.elem[0] || options.elem[0].eventHandler) return;
+
+    showEvent(options.elem, 'bind');
+    showEvent(options.eventElem);
+
+    //缁戝畾鍏抽棴鎺т欢浜嬩欢
+    lay(document).on('click', function(e){
+      if(e.target === options.elem[0]
+      || e.target === options.eventElem[0]
+      || e.target === lay(options.closeStop)[0]){
+        return;
+      }
+      that.remove();
+    }).on('keydown', function(e){
+      if(e.keyCode === 13){
+        if(lay('#'+ that.elemID)[0] && that.elemID === Class.thisElem){
+          e.preventDefault();
+          lay(that.footer).find(ELEM_CONFIRM)[0].click();
+        }
+      }
+    });
+
+    //鑷�傚簲瀹氫綅
+    lay(window).on('resize', function(){
+      if(!that.elem || !lay(ELEM)[0]){
+        return false;
+      }
+      that.position();
+    });
+
+    options.elem[0].eventHandler = true;
+  };
+
+
+  //鏍稿績鎺ュ彛
+  laydate.render = function(options){
+    var inst = new Class(options);
+    return thisDate.call(inst);
+  };
+
+  //寰楀埌鏌愭湀鐨勬渶鍚庝竴澶�
+  laydate.getEndDate = function(month, year){
+    var thisDate = new Date();
+    //璁剧疆鏃ユ湡涓轰笅涓湀鐨勭涓�澶�
+    thisDate.setFullYear(
+      year || thisDate.getFullYear()
+      ,month || (thisDate.getMonth() + 1)
+    ,1);
+    //鍑忓幓涓�澶╋紝寰楀埌褰撳墠鏈堟渶鍚庝竴澶�
+    return new Date(thisDate.getTime() - 1000*60*60*24).getDate();
+  };
+
+  //鏆撮湶lay
+  window.lay = window.lay || lay;
+
+  //鍔犺浇鏂瑰紡
+  isLayui ? (
+    laydate.ready()
+    ,layui.define(function(exports){ //layui鍔犺浇
+      laydate.path = layui.cache.dir;
+      exports(MOD_NAME, laydate);
+    })
+  ) : (
+    (typeof define === 'function' && define.amd) ? define(function(){ //requirejs鍔犺浇
+      return laydate;
+    }) : function(){ //鏅�歴cript鏍囩鍔犺浇
+      laydate.ready();
+      window.laydate = laydate
+    }()
+  );
+
+}();
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/layedit.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/layedit.js
new file mode 100644
index 0000000..2c265a0
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/layedit.js
@@ -0,0 +1,649 @@
+/**
+
+ @Name锛歭ayui.layedit 瀵屾枃鏈紪杈戝櫒
+ @Author锛氳搐蹇�
+ @License锛歁IT
+    
+ */
+ 
+layui.define(['layer', 'form'], function(exports){
+  "use strict";
+  
+  var $ = layui.$
+  ,layer = layui.layer
+  ,form = layui.form
+  ,hint = layui.hint()
+  ,device = layui.device()
+  
+  ,MOD_NAME = 'layedit', THIS = 'layui-this', SHOW = 'layui-show', ABLED = 'layui-disabled'
+  
+  ,Edit = function(){
+    var that = this;
+    that.index = 0;
+    
+    //鍏ㄥ眬閰嶇疆
+    that.config = {
+      //榛樿宸ュ叿bar
+      tool: [
+        'strong', 'italic', 'underline', 'del'
+        ,'|'
+        ,'left', 'center', 'right'
+        ,'|'
+        ,'link', 'unlink', 'face', 'image'
+      ]
+      ,hideTool: []
+      ,height: 280 //榛樿楂�
+    };
+  };
+  
+  //鍏ㄥ眬璁剧疆
+  Edit.prototype.set = function(options){
+    var that = this;
+    $.extend(true, that.config, options);
+    return that;
+  };
+  
+  //浜嬩欢鐩戝惉
+  Edit.prototype.on = function(events, callback){
+    return layui.onevent(MOD_NAME, events, callback);
+  };
+  
+  //寤虹珛缂栬緫鍣�
+  Edit.prototype.build = function(id, settings){
+    settings = settings || {};
+    
+    var that = this
+    ,config = that.config
+    ,ELEM = 'layui-layedit', textArea = $('#'+id)
+    ,name =  'LAY_layedit_'+ (++that.index)
+    ,haveBuild = textArea.next('.'+ELEM)
+    
+    ,set = $.extend({}, config, settings)
+    
+    ,tool = function(){
+      var node = [], hideTools = {};
+      layui.each(set.hideTool, function(_, item){
+        hideTools[item] = true;
+      });
+      layui.each(set.tool, function(_, item){
+        if(tools[item] && !hideTools[item]){
+          node.push(tools[item]);
+        }
+      });
+      return node.join('');
+    }()
+ 
+    
+    ,editor = $(['<div class="'+ ELEM +'">'
+      ,'<div class="layui-unselect layui-layedit-tool">'+ tool +'</div>'
+      ,'<div class="layui-layedit-iframe">'
+        ,'<iframe id="'+ name +'" name="'+ name +'" textarea="'+ id +'" frameborder="0"></iframe>'
+      ,'</div>'
+    ,'</div>'].join(''))
+    
+    //缂栬緫鍣ㄤ笉鍏煎ie8浠ヤ笅
+    if(device.ie && device.ie < 8){
+      return textArea.removeClass('layui-hide').addClass(SHOW);
+    }
+
+    haveBuild[0] && (haveBuild.remove());
+
+    setIframe.call(that, editor, textArea[0], set)
+    textArea.addClass('layui-hide').after(editor);
+
+    return that.index;
+  };
+  
+  //鑾峰緱缂栬緫鍣ㄤ腑鍐呭
+  Edit.prototype.getContent = function(index){
+    var iframeWin = getWin(index);
+    if(!iframeWin[0]) return;
+    return toLower(iframeWin[0].document.body.innerHTML);
+  };
+  
+  //鑾峰緱缂栬緫鍣ㄤ腑绾枃鏈唴瀹�
+  Edit.prototype.getText = function(index){
+    var iframeWin = getWin(index);
+    if(!iframeWin[0]) return;
+    return $(iframeWin[0].document.body).text();
+  };
+  /**
+   * 璁剧疆缂栬緫鍣ㄥ唴瀹�
+   * @param {[type]} index   缂栬緫鍣ㄧ储寮�
+   * @param {[type]} content 瑕佽缃殑鍐呭
+   * @param {[type]} flag    鏄惁杩藉姞妯″紡
+   */
+  Edit.prototype.setContent = function(index, content, flag){
+    var iframeWin = getWin(index);
+    if(!iframeWin[0]) return;
+    if(flag){
+      $(iframeWin[0].document.body).append(content)
+    }else{
+      $(iframeWin[0].document.body).html(content)
+    };
+    this.sync(index)
+  };
+  //灏嗙紪杈戝櫒鍐呭鍚屾鍒皌extarea锛堜竴鑸敤浜庡紓姝ユ彁浜ゆ椂锛�
+  Edit.prototype.sync = function(index){
+    var iframeWin = getWin(index);
+    if(!iframeWin[0]) return;
+    var textarea = $('#'+iframeWin[1].attr('textarea'));
+    textarea.val(toLower(iframeWin[0].document.body.innerHTML));
+  };
+  
+  //鑾峰彇缂栬緫鍣ㄩ�変腑鍐呭
+  Edit.prototype.getSelection = function(index){
+    var iframeWin = getWin(index);
+    if(!iframeWin[0]) return;
+    var range = Range(iframeWin[0].document);
+    return document.selection ? range.text : range.toString();
+  };
+
+  //iframe鍒濆鍖�
+  var setIframe = function(editor, textArea, set){
+    var that = this, iframe = editor.find('iframe');
+
+    iframe.css({
+      height: set.height
+    }).on('load', function(){
+      var conts = iframe.contents()
+      ,iframeWin = iframe.prop('contentWindow')
+      ,head = conts.find('head')
+      ,style = $(['<style>'
+        ,'*{margin: 0; padding: 0;}'
+        ,'body{padding: 10px; line-height: 20px; overflow-x: hidden; word-wrap: break-word; font: 14px Helvetica Neue,Helvetica,PingFang SC,Microsoft YaHei,Tahoma,Arial,sans-serif; -webkit-box-sizing: border-box !important; -moz-box-sizing: border-box !important; box-sizing: border-box !important;}'
+        ,'a{color:#01AAED; text-decoration:none;}a:hover{color:#c00}'
+        ,'p{margin-bottom: 10px;}'
+        ,'img{display: inline-block; border: none; vertical-align: middle;}'
+        ,'pre{margin: 10px 0; padding: 10px; line-height: 20px; border: 1px solid #ddd; border-left-width: 6px; background-color: #F2F2F2; color: #333; font-family: Courier New; font-size: 12px;}'
+      ,'</style>'].join(''))
+      ,body = conts.find('body');
+      
+      head.append(style);
+      body.attr('contenteditable', 'true').css({
+        'min-height': set.height
+      }).html(textArea.value||'');
+
+      hotkey.apply(that, [iframeWin, iframe, textArea, set]); //蹇嵎閿鐞�
+      toolActive.call(that, iframeWin, editor, set); //瑙﹀彂宸ュ叿
+
+    });
+  }
+  
+  //鑾峰緱iframe绐楀彛瀵硅薄
+  ,getWin = function(index){
+    var iframe = $('#LAY_layedit_'+ index)
+    ,iframeWin = iframe.prop('contentWindow');
+    return [iframeWin, iframe];
+  }
+  
+  //IE8涓嬪皢鏍囩澶勭悊鎴愬皬鍐�
+  ,toLower = function(html){
+    if(device.ie == 8){
+      html = html.replace(/<.+>/g, function(str){
+        return str.toLowerCase();
+      });
+    }
+    return html;
+  }
+  
+  //蹇嵎閿鐞�
+  ,hotkey = function(iframeWin, iframe, textArea, set){
+    var iframeDOM = iframeWin.document, body = $(iframeDOM.body);
+    body.on('keydown', function(e){
+      var keycode = e.keyCode;
+      //澶勭悊鍥炶溅
+      if(keycode === 13){
+        var range = Range(iframeDOM);
+        var container = getContainer(range)
+        ,parentNode = container.parentNode;
+        
+        if(parentNode.tagName.toLowerCase() === 'pre'){
+          if(e.shiftKey) return
+          layer.msg('璇锋殏鏃剁敤shift+enter');
+          return false;
+        }
+        iframeDOM.execCommand('formatBlock', false, '<p>');
+      }
+    });
+    
+    //缁檛extarea鍚屾鍐呭
+    $(textArea).parents('form').on('submit', function(){
+      var html = body.html();
+      //IE8涓嬪皢鏍囩澶勭悊鎴愬皬鍐�
+      if(device.ie == 8){
+        html = html.replace(/<.+>/g, function(str){
+          return str.toLowerCase();
+        });
+      }
+      textArea.value = html;
+    });
+    
+    //澶勭悊绮樿创
+    body.on('paste', function(e){
+      iframeDOM.execCommand('formatBlock', false, '<p>');
+      setTimeout(function(){
+        filter.call(iframeWin, body);
+        textArea.value = body.html();
+      }, 100); 
+    });
+  }
+  
+  //鏍囩杩囨护
+  ,filter = function(body){
+    var iframeWin = this
+    ,iframeDOM = iframeWin.document;
+    
+    //娓呴櫎褰卞搷鐗堥潰鐨刢ss灞炴��
+    body.find('*[style]').each(function(){
+      var textAlign = this.style.textAlign;
+      this.removeAttribute('style');
+      $(this).css({
+        'text-align': textAlign || ''
+      })
+    });
+    
+    //淇グ琛ㄦ牸
+    body.find('table').addClass('layui-table');
+    
+    //绉婚櫎涓嶅畨鍏ㄧ殑鏍囩
+    body.find('script,link').remove();
+  }
+  
+  //Range瀵硅薄鍏煎鎬у鐞�
+  ,Range = function(iframeDOM){
+    return iframeDOM.selection 
+      ? iframeDOM.selection.createRange()
+    : iframeDOM.getSelection().getRangeAt(0);
+  }
+  
+  //褰撳墠Range瀵硅薄鐨別ndContainer鍏煎鎬у鐞�
+  ,getContainer = function(range){
+    return range.endContainer || range.parentElement().childNodes[0]
+  }
+  
+  //鍦ㄩ�夊尯鎻掑叆鍐呰仈鍏冪礌
+  ,insertInline = function(tagName, attr, range){
+    var iframeDOM = this.document
+    ,elem = document.createElement(tagName)
+    for(var key in attr){
+      elem.setAttribute(key, attr[key]);
+    }
+    elem.removeAttribute('text');
+
+    if(iframeDOM.selection){ //IE
+      var text = range.text || attr.text;
+      if(tagName === 'a' && !text) return;
+      if(text){
+        elem.innerHTML = text;
+      }
+      range.pasteHTML($(elem).prop('outerHTML')); 
+      range.select();
+    } else { //闈濱E
+      var text = range.toString() || attr.text;
+      if(tagName === 'a' && !text) return;
+      if(text){
+        elem.innerHTML = text;
+      }
+      range.deleteContents();
+      range.insertNode(elem);
+    }
+  }
+  
+  //宸ュ叿閫変腑
+  ,toolCheck = function(tools, othis){
+    var iframeDOM = this.document
+    ,CHECK = 'layedit-tool-active'
+    ,container = getContainer(Range(iframeDOM))
+    ,item = function(type){
+      return tools.find('.layedit-tool-'+type)
+    }
+
+    if(othis){
+      othis[othis.hasClass(CHECK) ? 'removeClass' : 'addClass'](CHECK);
+    }
+    
+    tools.find('>i').removeClass(CHECK);
+    item('unlink').addClass(ABLED);
+
+    $(container).parents().each(function(){
+      var tagName = this.tagName.toLowerCase()
+      ,textAlign = this.style.textAlign;
+
+      //鏂囧瓧
+      if(tagName === 'b' || tagName === 'strong'){
+        item('b').addClass(CHECK)
+      }
+      if(tagName === 'i' || tagName === 'em'){
+        item('i').addClass(CHECK)
+      }
+      if(tagName === 'u'){
+        item('u').addClass(CHECK)
+      }
+      if(tagName === 'strike'){
+        item('d').addClass(CHECK)
+      }
+      
+      //瀵归綈
+      if(tagName === 'p'){
+        if(textAlign === 'center'){
+          item('center').addClass(CHECK);
+        } else if(textAlign === 'right'){
+          item('right').addClass(CHECK);
+        } else {
+          item('left').addClass(CHECK);
+        }
+      }
+      
+      //瓒呴摼鎺�
+      if(tagName === 'a'){
+        item('link').addClass(CHECK);
+        item('unlink').removeClass(ABLED);
+      }
+    });
+  }
+
+  //瑙﹀彂宸ュ叿
+  ,toolActive = function(iframeWin, editor, set){
+    var iframeDOM = iframeWin.document
+    ,body = $(iframeDOM.body)
+    ,toolEvent = {
+      //瓒呴摼鎺�
+      link: function(range){
+        var container = getContainer(range)
+        ,parentNode = $(container).parent();
+        
+        link.call(body, {
+          href: parentNode.attr('href')
+          ,target: parentNode.attr('target')
+        }, function(field){
+          var parent = parentNode[0];
+          if(parent.tagName === 'A'){
+            parent.href = field.url;
+          } else {
+            insertInline.call(iframeWin, 'a', {
+              target: field.target
+              ,href: field.url
+              ,text: field.url
+            }, range);
+          }
+        });
+      }
+      //娓呴櫎瓒呴摼鎺�
+      ,unlink: function(range){
+        iframeDOM.execCommand('unlink');
+      }
+      //琛ㄦ儏
+      ,face: function(range){
+        face.call(this, function(img){
+          insertInline.call(iframeWin, 'img', {
+            src: img.src
+            ,alt: img.alt
+          }, range);
+        });
+      }
+      //鍥剧墖
+      ,image: function(range){
+        var that = this;
+        layui.use('upload', function(upload){
+          var uploadImage = set.uploadImage || {};
+          upload.render({
+            url: uploadImage.url
+            ,method: uploadImage.type
+            ,elem: $(that).find('input')[0]
+            ,done: function(res){
+              if(res.code == 0){
+                res.data = res.data || {};
+                insertInline.call(iframeWin, 'img', {
+                  src: res.data.src
+                  ,alt: res.data.title
+                }, range);
+              } else {
+                layer.msg(res.msg||'涓婁紶澶辫触');
+              }
+            }
+          });
+        });
+      }
+      //鎻掑叆浠g爜
+      ,code: function(range){
+        code.call(body, function(pre){
+          insertInline.call(iframeWin, 'pre', {
+            text: pre.code
+            ,'lay-lang': pre.lang
+          }, range);
+        });
+      }
+      //甯姪
+      ,help: function(){
+        layer.open({
+          type: 2
+          ,title: '甯姪'
+          ,area: ['600px', '380px']
+          ,shadeClose: true
+          ,shade: 0.1
+          ,skin: 'layui-layer-msg'
+          ,content: ['http://www.layui.com/about/layedit/help.html', 'no']
+        });
+      }
+    }
+    ,tools = editor.find('.layui-layedit-tool')
+    
+    ,click = function(){
+      var othis = $(this)
+      ,events = othis.attr('layedit-event')
+      ,command = othis.attr('lay-command');
+      
+      if(othis.hasClass(ABLED)) return;
+
+      body.focus();
+      
+      var range = Range(iframeDOM)
+      ,container = range.commonAncestorContainer
+      
+      if(command){
+        iframeDOM.execCommand(command);
+        if(/justifyLeft|justifyCenter|justifyRight/.test(command)){
+          iframeDOM.execCommand('formatBlock', false, '<p>');
+        }
+        setTimeout(function(){
+          body.focus();
+        }, 10);
+      } else {
+        toolEvent[events] && toolEvent[events].call(this, range);
+      }
+      toolCheck.call(iframeWin, tools, othis);
+    }
+    
+    ,isClick = /image/
+
+    tools.find('>i').on('mousedown', function(){
+      var othis = $(this)
+      ,events = othis.attr('layedit-event');
+      if(isClick.test(events)) return;
+      click.call(this)
+    }).on('click', function(){
+      var othis = $(this)
+      ,events = othis.attr('layedit-event');
+      if(!isClick.test(events)) return;
+      click.call(this)
+    });
+    
+    //瑙﹀彂鍐呭鍖哄煙
+    body.on('click', function(){
+      toolCheck.call(iframeWin, tools);
+      layer.close(face.index);
+    });
+  }
+  
+  //瓒呴摼鎺ラ潰鏉�
+  ,link = function(options, callback){
+    var body = this, index = layer.open({
+      type: 1
+      ,id: 'LAY_layedit_link'
+      ,area: '350px'
+      ,shade: 0.05
+      ,shadeClose: true
+      ,moveType: 1
+      ,title: '瓒呴摼鎺�'
+      ,skin: 'layui-layer-msg'
+      ,content: ['<ul class="layui-form" style="margin: 15px;">'
+        ,'<li class="layui-form-item">'
+          ,'<label class="layui-form-label" style="width: 60px;">URL</label>'
+          ,'<div class="layui-input-block" style="margin-left: 90px">'
+            ,'<input name="url" lay-verify="url" value="'+ (options.href||'') +'" autofocus="true" autocomplete="off" class="layui-input">'
+            ,'</div>'
+        ,'</li>'
+        ,'<li class="layui-form-item">'
+          ,'<label class="layui-form-label" style="width: 60px;">鎵撳紑鏂瑰紡</label>'
+          ,'<div class="layui-input-block" style="margin-left: 90px">'
+            ,'<input type="radio" name="target" value="_self" class="layui-input" title="褰撳墠绐楀彛"'
+            + ((options.target==='_self' || !options.target) ? 'checked' : '') +'>'
+            ,'<input type="radio" name="target" value="_blank" class="layui-input" title="鏂扮獥鍙�" '
+            + (options.target==='_blank' ? 'checked' : '') +'>'
+          ,'</div>'
+        ,'</li>'
+        ,'<li class="layui-form-item" style="text-align: center;">'
+          ,'<button type="button" lay-submit lay-filter="layedit-link-yes" class="layui-btn"> 纭畾 </button>'
+          ,'<button style="margin-left: 20px;" type="button" class="layui-btn layui-btn-primary"> 鍙栨秷 </button>'
+        ,'</li>'
+      ,'</ul>'].join('')
+      ,success: function(layero, index){
+        var eventFilter = 'submit(layedit-link-yes)';
+        form.render('radio');  
+        layero.find('.layui-btn-primary').on('click', function(){
+          layer.close(index);
+          body.focus();
+        });
+        form.on(eventFilter, function(data){
+          layer.close(link.index);
+          callback && callback(data.field);
+        });
+      }
+    });
+    link.index = index;
+  }
+  
+  //琛ㄦ儏闈㈡澘
+  ,face = function(callback){
+    //琛ㄦ儏搴�
+    var faces = function(){
+      var alt = ["[寰瑧]", "[鍢诲樆]", "[鍝堝搱]", "[鍙埍]", "[鍙�淽", "[鎸栭蓟]", "[鍚冩儕]", "[瀹崇緸]", "[鎸ょ溂]", "[闂槾]", "[閯欒]", "[鐖变綘]", "[娉猐", "[鍋风瑧]", "[浜蹭翰]", "[鐢熺梾]", "[澶紑蹇僝", "[鐧界溂]", "[鍙冲摷鍝糫", "[宸﹀摷鍝糫", "[鍢榏", "[琛癩", "[濮斿眻]", "[鍚怾", "[鍝堟瑺]", "[鎶辨姳]", "[鎬抅", "[鐤戦棶]", "[棣嬪槾]", "[鎷滄嫓]", "[鎬濊�僝", "[姹梋", "[鍥癩", "[鐫", "[閽盷", "[澶辨湜]", "[閰穄", "[鑹瞉", "[鍝糫", "[榧撴帉]", "[鏅昡", "[鎮蹭激]", "[鎶撶媯]", "[榛戠嚎]", "[闃撮櫓]", "[鎬掗獋]", "[浜掔矇]", "[蹇僝", "[浼ゅ績]", "[鐚ご]", "[鐔婄尗]", "[鍏斿瓙]", "[ok]", "[鑰禲", "[good]", "[NO]", "[璧瀅", "[鏉", "[寮盷", "[鑽夋偿椹琞", "[绁為┈]", "[鍥", "[娴簯]", "[缁欏姏]", "[鍥磋]", "[濞佹]", "[濂ョ壒鏇糫", "[绀肩墿]", "[閽焆", "[璇濈瓛]", "[铚$儧]", "[铔嬬硶]"], arr = {};
+      layui.each(alt, function(index, item){
+        arr[item] = layui.cache.dir + 'images/face/'+ index + '.gif';
+      });
+      return arr;
+    }();
+    face.hide = face.hide || function(e){
+      if($(e.target).attr('layedit-event') !== 'face'){
+        layer.close(face.index);
+      }
+    }
+    return face.index = layer.tips(function(){
+      var content = [];
+      layui.each(faces, function(key, item){
+        content.push('<li title="'+ key +'"><img src="'+ item +'" alt="'+ key +'"></li>');
+      });
+      return '<ul class="layui-clear">' + content.join('') + '</ul>';
+    }(), this, {
+      tips: 1
+      ,time: 0
+      ,skin: 'layui-box layui-util-face'
+      ,maxWidth: 500
+      ,success: function(layero, index){
+        layero.css({
+          marginTop: -4
+          ,marginLeft: -10
+        }).find('.layui-clear>li').on('click', function(){
+          callback && callback({
+            src: faces[this.title]
+            ,alt: this.title
+          });
+          layer.close(index);
+        });
+        $(document).off('click', face.hide).on('click', face.hide);
+      }
+    });
+  }
+  
+  //鎻掑叆浠g爜闈㈡澘
+  ,code = function(callback){
+    var body = this, index = layer.open({
+      type: 1
+      ,id: 'LAY_layedit_code'
+      ,area: '550px'
+      ,shade: 0.05
+      ,shadeClose: true
+      ,moveType: 1
+      ,title: '鎻掑叆浠g爜'
+      ,skin: 'layui-layer-msg'
+      ,content: ['<ul class="layui-form layui-form-pane" style="margin: 15px;">'
+        ,'<li class="layui-form-item">'
+          ,'<label class="layui-form-label">璇烽�夋嫨璇█</label>'
+          ,'<div class="layui-input-block">'
+            ,'<select name="lang">'
+              ,'<option value="JavaScript">JavaScript</option>'
+              ,'<option value="HTML">HTML</option>'
+              ,'<option value="CSS">CSS</option>'
+              ,'<option value="Java">Java</option>'
+              ,'<option value="PHP">PHP</option>'
+              ,'<option value="C#">C#</option>'
+              ,'<option value="Python">Python</option>'
+              ,'<option value="Ruby">Ruby</option>'
+              ,'<option value="Go">Go</option>'
+            ,'</select>'
+          ,'</div>'
+        ,'</li>'
+        ,'<li class="layui-form-item layui-form-text">'
+          ,'<label class="layui-form-label">浠g爜</label>'
+          ,'<div class="layui-input-block">'
+            ,'<textarea name="code" lay-verify="required" autofocus="true" class="layui-textarea" style="height: 200px;"></textarea>'
+          ,'</div>'
+        ,'</li>'
+        ,'<li class="layui-form-item" style="text-align: center;">'
+          ,'<button type="button" lay-submit lay-filter="layedit-code-yes" class="layui-btn"> 纭畾 </button>'
+          ,'<button style="margin-left: 20px;" type="button" class="layui-btn layui-btn-primary"> 鍙栨秷 </button>'
+        ,'</li>'
+      ,'</ul>'].join('')
+      ,success: function(layero, index){
+        var eventFilter = 'submit(layedit-code-yes)';
+        form.render('select');  
+        layero.find('.layui-btn-primary').on('click', function(){
+          layer.close(index);
+          body.focus();
+        });
+        form.on(eventFilter, function(data){
+          layer.close(code.index);
+          callback && callback(data.field);
+        });
+      }
+    });
+    code.index = index;
+  }
+  
+  //鍏ㄩ儴宸ュ叿
+  ,tools = {
+    html: '<i class="layui-icon layedit-tool-html" title="HTML婧愪唬鐮�" lay-command="html" layedit-event="html"">&#xe64b;</i><span class="layedit-tool-mid"></span>'
+    ,strong: '<i class="layui-icon layedit-tool-b" title="鍔犵矖" lay-command="Bold" layedit-event="b"">&#xe62b;</i>'
+    ,italic: '<i class="layui-icon layedit-tool-i" title="鏂滀綋" lay-command="italic" layedit-event="i"">&#xe644;</i>'
+    ,underline: '<i class="layui-icon layedit-tool-u" title="涓嬪垝绾�" lay-command="underline" layedit-event="u"">&#xe646;</i>'
+    ,del: '<i class="layui-icon layedit-tool-d" title="鍒犻櫎绾�" lay-command="strikeThrough" layedit-event="d"">&#xe64f;</i>'
+    
+    ,'|': '<span class="layedit-tool-mid"></span>'
+    
+    ,left: '<i class="layui-icon layedit-tool-left" title="宸﹀榻�" lay-command="justifyLeft" layedit-event="left"">&#xe649;</i>'
+    ,center: '<i class="layui-icon layedit-tool-center" title="灞呬腑瀵归綈" lay-command="justifyCenter" layedit-event="center"">&#xe647;</i>'
+    ,right: '<i class="layui-icon layedit-tool-right" title="鍙冲榻�" lay-command="justifyRight" layedit-event="right"">&#xe648;</i>'
+    ,link: '<i class="layui-icon layedit-tool-link" title="鎻掑叆閾炬帴" layedit-event="link"">&#xe64c;</i>'
+    ,unlink: '<i class="layui-icon layedit-tool-unlink layui-disabled" title="娓呴櫎閾炬帴" lay-command="unlink" layedit-event="unlink"">&#xe64d;</i>'
+    ,face: '<i class="layui-icon layedit-tool-face" title="琛ㄦ儏" layedit-event="face"">&#xe650;</i>'
+    ,image: '<i class="layui-icon layedit-tool-image" title="鍥剧墖" layedit-event="image">&#xe64a;<input type="file" name="file"></i>'
+    ,code: '<i class="layui-icon layedit-tool-code" title="鎻掑叆浠g爜" layedit-event="code">&#xe64e;</i>'
+    
+    ,help: '<i class="layui-icon layedit-tool-help" title="甯姪" layedit-event="help">&#xe607;</i>'
+  }
+  
+  ,edit = new Edit();
+
+  exports(MOD_NAME, edit);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/layer.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/layer.js
new file mode 100644
index 0000000..ebf263b
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/layer.js
@@ -0,0 +1,1427 @@
+锘�
+/*!
+ * layer - 閫氱敤 Web 寮瑰嚭灞傜粍浠�
+ * MIT Licensed
+ */
+
+;!function(window, undefined){
+"use strict";
+
+var isLayui = window.layui && layui.define, $, win, ready = {
+  getPath: function(){
+    var jsPath = document.currentScript ? document.currentScript.src : function(){
+      var js = document.scripts
+      ,last = js.length - 1
+      ,src;
+      for(var i = last; i > 0; i--){
+        if(js[i].readyState === 'interactive'){
+          src = js[i].src;
+          break;
+        }
+      }
+      return src || js[last].src;
+    }()
+    ,GLOBAL = window.LAYUI_GLOBAL || {};
+    return GLOBAL.layer_dir || jsPath.substring(0, jsPath.lastIndexOf('/') + 1);
+  }(),
+
+  config: {}, end: {}, minIndex: 0, minLeft: [],
+  btn: ['&#x786E;&#x5B9A;', '&#x53D6;&#x6D88;'],
+
+  //浜旂鍘熷灞傛ā寮�
+  type: ['dialog', 'page', 'iframe', 'loading', 'tips'],
+
+  //鑾峰彇鑺傜偣鐨剆tyle灞炴�у��
+  getStyle: function(node, name){
+    var style = node.currentStyle ? node.currentStyle : window.getComputedStyle(node, null);
+    return style[style.getPropertyValue ? 'getPropertyValue' : 'getAttribute'](name);
+  },
+
+  //杞藉叆 CSS 渚濊禆
+  link: function(href, fn, cssname){
+    //鏈缃矾寰勶紝鍒欎笉涓诲姩鍔犺浇css
+    if(!layer.path) return;
+
+    var head = document.getElementsByTagName("head")[0]
+    ,link = document.createElement('link');
+
+    if(typeof fn === 'string') cssname = fn;
+
+    var app = (cssname || href).replace(/\.|\//g, '');
+    var id = 'layuicss-'+ app
+    ,STAUTS_NAME = 'creating'
+    ,timeout = 0;
+
+    link.rel = 'stylesheet';
+    link.href = layer.path + href;
+    link.id = id;
+
+    if(!document.getElementById(id)){
+      head.appendChild(link);
+    }
+
+    if(typeof fn !== 'function') return;
+
+    //杞 css 鏄惁鍔犺浇瀹屾瘯
+    (function poll(status) {
+      var delay = 100
+      ,getLinkElem = document.getElementById(id); //鑾峰彇鍔ㄦ�佹彃鍏ョ殑 link 鍏冪礌
+
+      //濡傛灉杞瓒呰繃鎸囧畾绉掓暟锛屽垯瑙嗕负璇锋眰鏂囦欢澶辫触鎴� css 鏂囦欢涓嶇鍚堣鑼�
+      if(++timeout > 10 * 1000 / delay){
+        return window.console && console.error(app +'.css: Invalid');
+      };
+
+      //css 鍔犺浇灏辩华
+      if(parseInt(ready.getStyle(getLinkElem, 'width')) === 1989){
+        //濡傛灉鍙傛暟鏉ヨ嚜浜庡垵濮嬭疆璇紙鍗虫湭鍔犺浇灏辩华鏃剁殑锛夛紝鍒欑Щ闄� link 鏍囩鐘舵��
+        if(status === STAUTS_NAME) getLinkElem.removeAttribute('lay-status');
+        //濡傛灉 link 鏍囩鐨勭姸鎬佷粛涓恒�屽垱寤轰腑銆嶏紝鍒欑户缁繘鍏ヨ疆璇紝鐩村埌鐘舵�佹敼鍙橈紝鍒欐墽琛屽洖璋�
+        getLinkElem.getAttribute('lay-status') === STAUTS_NAME ? setTimeout(poll, delay) : fn();
+      } else {
+        getLinkElem.setAttribute('lay-status', STAUTS_NAME);
+        setTimeout(function(){
+          poll(STAUTS_NAME);
+        }, delay);
+      }
+
+      //parseInt(ready.getStyle(document.getElementById(id), 'width')) === 1989 ? fn() : setTimeout(poll, 1000);
+    }());
+
+  }
+};
+
+//榛樿鍐呯疆鏂规硶銆�
+var layer = {
+  v: '3.5.1',
+  ie: function(){ //ie鐗堟湰
+    var agent = navigator.userAgent.toLowerCase();
+    return (!!window.ActiveXObject || "ActiveXObject" in window) ? (
+      (agent.match(/msie\s(\d+)/) || [])[1] || '11' //鐢变簬ie11骞舵病鏈塵sie鐨勬爣璇�
+    ) : false;
+  }(),
+  index: (window.layer && window.layer.v) ? 100000 : 0,
+  path: ready.getPath,
+  config: function(options, fn){
+    options = options || {};
+    layer.cache = ready.config = $.extend({}, ready.config, options);
+    layer.path = ready.config.path || layer.path;
+    typeof options.extend === 'string' && (options.extend = [options.extend]);
+
+    //濡傛灉璁剧疆浜嗚矾寰勶紝鍒欏姞杞芥牱寮�
+    if(ready.config.path) layer.ready();
+
+    if(!options.extend) return this;
+
+    isLayui
+      ? layui.addcss('modules/layer/' + options.extend)
+    : ready.link('theme/' + options.extend);
+
+    return this;
+  },
+
+  //涓讳綋CSS绛夊緟浜嬩欢
+  ready: function(callback){
+    var cssname = 'layer', ver = ''
+    ,path = (isLayui ? 'modules/layer/' : 'theme/') + 'default/layer.css?v='+ layer.v + ver;
+    isLayui ? layui.addcss(path, callback, cssname) : ready.link(path, callback, cssname);
+    return this;
+  },
+
+  //鍚勭蹇嵎寮曠敤
+  alert: function(content, options, yes){
+    var type = typeof options === 'function';
+    if(type) yes = options;
+    return layer.open($.extend({
+      content: content,
+      yes: yes
+    }, type ? {} : options));
+  },
+
+  confirm: function(content, options, yes, cancel){
+    var type = typeof options === 'function';
+    if(type){
+      cancel = yes;
+      yes = options;
+    }
+    return layer.open($.extend({
+      content: content,
+      btn: ready.btn,
+      yes: yes,
+      btn2: cancel
+    }, type ? {} : options));
+  },
+
+  msg: function(content, options, end){ //鏈�甯哥敤鎻愮ず灞�
+    var type = typeof options === 'function', rskin = ready.config.skin;
+    var skin = (rskin ? rskin + ' ' + rskin + '-msg' : '')||'layui-layer-msg';
+    var anim = doms.anim.length - 1;
+    if(type) end = options;
+    return layer.open($.extend({
+      content: content,
+      time: 3000,
+      shade: false,
+      skin: skin,
+      title: false,
+      closeBtn: false,
+      btn: false,
+      resize: false,
+      end: end
+    }, (type && !ready.config.skin) ? {
+      skin: skin + ' layui-layer-hui',
+      anim: anim
+    } : function(){
+       options = options || {};
+       if(options.icon === -1 || options.icon === undefined && !ready.config.skin){
+         options.skin = skin + ' ' + (options.skin||'layui-layer-hui');
+       }
+       return options;
+    }()));
+  },
+
+  load: function(icon, options){
+    return layer.open($.extend({
+      type: 3,
+      icon: icon || 0,
+      resize: false,
+      shade: 0.01
+    }, options));
+  },
+
+  tips: function(content, follow, options){
+    return layer.open($.extend({
+      type: 4,
+      content: [content, follow],
+      closeBtn: false,
+      time: 3000,
+      shade: false,
+      resize: false,
+      fixed: false,
+      maxWidth: 260
+    }, options));
+  }
+};
+
+var Class = function(setings){
+  var that = this, creat = function(){
+    that.creat();
+  };
+  that.index = ++layer.index;
+  that.config.maxWidth = $(win).width() - 15*2; //鍒濆鏈�澶у搴︼細褰撳墠灞忓箷瀹斤紝宸﹀彸鐣� 15px 杈硅窛
+  that.config = $.extend({}, that.config, ready.config, setings);
+  document.body ? creat() : setTimeout(function(){
+    creat();
+  }, 30);
+};
+
+Class.pt = Class.prototype;
+
+//缂撳瓨甯哥敤瀛楃
+var doms = ['layui-layer', '.layui-layer-title', '.layui-layer-main', '.layui-layer-dialog', 'layui-layer-iframe', 'layui-layer-content', 'layui-layer-btn', 'layui-layer-close','layui-layer-btn-beforeinfo','layui-layer-content-title','layui-layer-content-pane','layui-layer-btn-content'];
+doms.anim = ['layer-anim-00', 'layer-anim-01', 'layer-anim-02', 'layer-anim-03', 'layer-anim-04', 'layer-anim-05', 'layer-anim-06'];
+
+doms.SHADE = 'layui-layer-shade';
+doms.MOVE = 'layui-layer-move';
+
+//榛樿閰嶇疆
+Class.pt.config = {
+  type: 0,
+  shade: 0.6,//weidy@2018-03-08 淇敼榛樿閫忔槑搴�
+  fixed: true,
+  move: doms[1],
+  title: '&#x4FE1;&#x606F;',
+  offset: 'auto',
+  area: 'auto',
+  closeBtn: 1,//weidy@2020-04-30淇敼涓�2锛屽師鏈槸1
+  time: 0, //0琛ㄧず涓嶈嚜鍔ㄥ叧闂�
+  zIndex: 19891014,
+  maxWidth: 360,
+  anim: 0,
+  isOutAnim: true,
+  icon: -1,
+  moveType: 1,
+  resize: true,
+  scrollbar: true, //鏄惁鍏佽娴忚鍣ㄦ粴鍔ㄦ潯
+  tips: 2,
+  //skin:'layui-layer-lan', //weidy@2020-04-30娣诲姞榛樿鐨偆锛屽師鏈病鏈夎繖涓厤缃�
+  shadeClose:true //weidy@2020-04-30娣诲姞鐐瑰嚮閬僵鍏抽棴锛屽師鏈病鏈夎繖涓厤缃�
+};
+
+//瀹瑰櫒
+Class.pt.vessel = function(conType, callback){
+  var that = this, times = that.index, config = that.config;
+  var zIndex = config.zIndex + times, titype = typeof config.title === 'object';
+  var ismax = config.maxmin && (config.type === 1 || config.type === 2);
+  var titleHTML = (config.title ? '<div class="layui-layer-title" style="'+ (titype ? config.title[1] : '') +'">'
+    + (titype ? config.title[0] : config.title)
+  + '</div>' : '');
+
+  config.zIndex = zIndex;
+  callback([
+    //閬僵
+    config.shade ? ('<div class="'+ doms.SHADE +'" id="'+ doms.SHADE + times +'" times="'+ times +'" style="'+ ('z-index:'+ (zIndex-1) +'; ') +'"></div>') : '',
+
+    //涓讳綋
+    '<div class="'+ doms[0] + (' layui-layer-'+ready.type[config.type]) + (((config.type == 0 || config.type == 2) && !config.shade) ? ' layui-layer-border' : '') + ' ' + (config.skin||'') +'" id="'+ doms[0] + times +'" type="'+ ready.type[config.type] +'" times="'+ times +'" showtime="'+ config.time +'" conType="'+ (conType ? 'object' : 'string') +'" style="z-index: '+ zIndex +'; width:'+ config.area[0] + ';height:' + config.area[1] + ';position:'+ (config.fixed ? 'fixed;' : 'absolute;') +'">'
+      + (conType && config.type != 2 ? '' : titleHTML)
+    //wangting @2021-12-6 澧炲姞layui-layer-content-title,layui-layer-content-pane鏍峰紡鐨刣iv锛岄厤缃负鈥渃ontentTitle鈥濄�俿kin涓簂ayui-layer-qin鏃讹紝灏嗗簳閮ㄦ寜閽涓婄Щ
+    + (config.contentTitle && config.contentTitle !=''? '<div class="'+ doms[9] +'">'+ config.contentTitle +'</div>' : '')
+    + (config.btn && config.skin =='layui-layer-qin'? function(){
+      var button = '';
+      typeof config.btn === 'string' && (config.btn = [config.btn]);
+      for(var i = 0, len = config.btn.length; i < len; i++){
+        button += '<a class="'+ doms[6] +''+ i +'">'+ config.btn[i] +'</a>'
+      }
+      return '<div class="'+ doms[6] +' layui-layer-btn-'+ (config.btnAlign||'') +'"><div class="'+ doms[11] +'">'+ button +'</div></div>'
+    }() : '')
+    + '<div id="'+ (config.id||'') +'" class="layui-layer-content '+ ((config.type == 0 && config.icon !== -1) ? ' layui-layer-padding' :'') + (config.type == 3 ? ' layui-layer-loading'+config.icon : '') +'">'
+    +'<div class="'+ doms[10] +'">'
+    + (config.type == 0 && config.icon !== -1 ? '<i class="layui-layer-ico layui-layer-ico'+ config.icon +'"></i>' : '')
+    + (config.type == 1 && conType ? '' : (config.content||''))
+    + '</div>'
+    + '</div>'
+    + '<span class="layui-layer-setwin">'+ function(){
+      var closebtn = ismax ? '<a class="layui-layer-min" href="javascript:;"><cite></cite></a><a class="layui-layer-ico layui-layer-max" href="javascript:;"></a>' : '';
+      config.closeBtn && (closebtn += '<a class="layui-layer-ico '+ doms[7] +' '+ doms[7] + (config.title ? config.closeBtn : (config.type == 4 ? '1' : '2')) +'" href="javascript:;"></a>');
+      return closebtn;
+    }() + '</span>'
+    //weidy@2018-03-08 娣诲姞鎸夐挳鍖哄煙鐨勬帶鍒�
+    + (config.btnBefore ? function(){
+      var beforeInfo = "";
+      typeof config.btnBefore === 'string' && (config.btnBefore = [config.btnBefore]);
+      for(var i = 0, len = config.btnBefore.length; i < len; i++){
+        beforeInfo += '<div>' + config.btnBefore[i] + '</div>';
+      }
+      return '<div class="' + doms[8]  + '">' + beforeInfo + '</div>'
+    }():'')
+      + (config.btn  &&  config.skin !='layui-layer-qin'? function(){
+        var button = '';
+        typeof config.btn === 'string' && (config.btn = [config.btn]);
+        for(var i = 0, len = config.btn.length; i < len; i++){
+          button += '<a class="'+ doms[6] +''+ i +'">'+ config.btn[i] +'</a>'
+        }
+        return '<div class="'+ doms[6] +' layui-layer-btn-'+ (config.btnAlign||'') +'"><div class="'+ doms[10] +'">'+ button +'</div></div>'
+      }() : '')
+      + (config.resize ? '<span class="layui-layer-resize"></span>' : '')
+    + '</div>'
+  ], titleHTML, $('<div class="'+ doms.MOVE +'" id="'+ doms.MOVE +'"></div>'));
+  return that;
+};
+
+//鍒涘缓楠ㄦ灦
+Class.pt.creat = function(){
+  var that = this
+  ,config = that.config
+  ,times = that.index, nodeIndex
+  ,content = config.content
+  ,conType = typeof content === 'object'
+  ,body = $('body');
+
+  if(config.id && $('#'+config.id)[0])  return;
+  //weidy@2020-04-30 澧炲姞鍏ㄥ睆鐨勮缃�
+  if(config.fullScreen){
+    //鑾峰彇绐楀彛鐨勫ぇ灏忥紝浣嗘槸鍥涢潰鐣�50鐨勭┖鐧�
+    if(window.innerWidth){
+      config.area = [(window.innerWidth-50) + "px",(window.innerHeight-50) + "px"];
+    }else{
+      config.area = [(document.documentElement.clientWidth-50) + "px",(document.documentElement.clientHeight-50) + "px"];
+    }
+  }
+  if(typeof config.area === 'string'){
+    config.area = config.area === 'auto' ? ['', ''] : [config.area, ''];
+  }
+
+  //anim鍏煎鏃х増shift
+  if(config.shift){
+    config.anim = config.shift;
+  }
+
+  if(layer.ie == 6){
+    config.fixed = false;
+  }
+
+  switch(config.type){
+    case 0:
+      config.btn = ('btn' in config) ? config.btn : ready.btn[0];
+      layer.closeAll('dialog');
+    break;
+    case 2:
+      var content = config.content = conType ? config.content : [config.content||'', 'auto'];
+      config.content = '<iframe scrolling="'+ (config.content[1]||'auto') +'" allowtransparency="true" id="'+ doms[4] +''+ times +'" name="'+ doms[4] +''+ times +'" onload="this.className=\'\';" class="layui-layer-load" frameborder="0" src="' + config.content[0] + '"></iframe>';
+    break;
+    case 3:
+      delete config.title;
+      delete config.closeBtn;
+      config.icon === -1 && (config.icon === 0);
+      layer.closeAll('loading');
+    break;
+    case 4:
+      conType || (config.content = [config.content, 'body']);
+      config.follow = config.content[1];
+      config.content = config.content[0] + '<i class="layui-layer-TipsG"></i>';
+      delete config.title;
+      config.tips = typeof config.tips === 'object' ? config.tips : [config.tips, true];
+      config.tipsMore || layer.closeAll('tips');
+    break;
+  }
+
+  //寤虹珛瀹瑰櫒
+  that.vessel(conType, function(html, titleHTML, moveElem){
+    body.append(html[0]);
+    conType ? function(){
+      (config.type == 2 || config.type == 4) ? function(){
+        $('body').append(html[1]);
+      }() : function(){
+        if(!content.parents('.'+doms[0])[0]){
+          content.data('display', content.css('display')).show().addClass('layui-layer-wrap').wrap(html[1]);
+          $('#'+ doms[0] + times).find('.'+doms[5]).before(titleHTML);
+        }
+      }();
+    }() : body.append(html[1]);
+    $('#'+ doms.MOVE)[0] || body.append(ready.moveElem = moveElem);
+
+    that.layero = $('#'+ doms[0] + times);
+    that.shadeo = $('#'+ doms.SHADE + times);
+
+    config.scrollbar || doms.html.css('overflow', 'hidden').attr('layer-full', times);
+  }).auto(times);
+
+  //閬僵
+  that.shadeo.css({
+    'background-color': config.shade[1] || '#fafafa'  //weidy@2018-03-05 淇敼閬僵鐨勯鑹诧紝榛樿涓�#000
+    ,'opacity': config.shade[0] ||0.6,
+    "filter": "alpha(opacity=60)"
+  });
+
+  config.type == 2 && layer.ie == 6 && that.layero.find('iframe').attr('src', content[0]);
+
+  //鍧愭爣鑷�傚簲娴忚鍣ㄧ獥鍙e昂瀵�
+  config.type == 4 ? that.tips() : function(){
+    that.offset()
+    //棣栨寮瑰嚭鏃讹紝鑻� css 灏氭湭鍔犺浇锛屽垯绛夊緟 css 鍔犺浇瀹屾瘯鍚庯紝閲嶆柊璁惧畾灏哄
+    parseInt(ready.getStyle(document.getElementById(doms.MOVE), 'z-index')) ||  function(){
+      that.layero.css('visibility', 'hidden');
+      layer.ready(function(){
+        that.offset();
+        that.layero.css('visibility', 'visible');
+      });
+    }();
+  }();
+
+  //濡傛灉鏄浐瀹氬畾浣�
+  if(config.fixed){
+    win.on('resize', function(){
+      that.offset();
+      (/^\d+%$/.test(config.area[0]) || /^\d+%$/.test(config.area[1])) && that.auto(times);
+      config.type == 4 && that.tips();
+    });
+  }
+
+  config.time <= 0 || setTimeout(function(){
+    layer.close(that.index);
+  }, config.time);
+  that.move().callback();
+
+  //涓哄吋瀹筳Query3.0鐨刢ss鍔ㄧ敾褰卞搷鍏冪礌灏哄璁$畻
+  if(doms.anim[config.anim]){
+    var animClass = 'layer-anim '+ doms.anim[config.anim];
+    that.layero.addClass(animClass).one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', function(){
+      $(this).removeClass(animClass);
+    });
+  };
+
+  //璁板綍鍏抽棴鍔ㄧ敾
+  if(config.isOutAnim){
+    that.layero.data('isOutAnim', true);
+  }
+};
+
+//鑷�傚簲
+Class.pt.auto = function(index){
+  var that = this, config = that.config, layero = $('#'+ doms[0] + index);
+
+  if(config.area[0] === '' && config.maxWidth > 0){
+    //涓轰簡淇IE7涓嬩竴涓浜洪毦浠ョ悊瑙g殑bug
+    if(layer.ie && layer.ie < 8 && config.btn){
+      layero.width(layero.innerWidth());
+    }
+    layero.outerWidth() > config.maxWidth && layero.width(config.maxWidth);
+  }
+
+  var area = [layero.innerWidth(), layero.innerHeight()]
+  ,titHeight = layero.find(doms[1]).outerHeight() || 0
+  ,btnHeight = layero.find('.'+doms[6]).outerHeight() || 0
+  ,setHeight = function(elem){
+    elem = layero.find(elem);
+    elem.height(area[1] - titHeight - btnHeight - 2*(parseFloat(elem.css('padding-top'))|0));
+  };
+
+  switch(config.type){
+    case 2:
+      setHeight('iframe');
+    break;
+    default:
+      if(config.area[1] === ''){
+        if(config.maxHeight > 0 && layero.outerHeight() > config.maxHeight){
+          area[1] = config.maxHeight;
+          setHeight('.'+doms[5]);
+        } else if(config.fixed && area[1] >= win.height()){
+          area[1] = win.height();
+          setHeight('.'+doms[5]);
+        }
+      } else {
+        setHeight('.'+doms[5]);
+      }
+    break;
+  };
+
+  return that;
+};
+
+//璁$畻鍧愭爣
+Class.pt.offset = function(){
+  var that = this, config = that.config, layero = that.layero;
+  var area = [layero.outerWidth(), layero.outerHeight()];
+  var type = typeof config.offset === 'object';
+  that.offsetTop = (win.height() - area[1])/2;
+  that.offsetLeft = (win.width() - area[0])/2;
+
+  if(type){
+    that.offsetTop = config.offset[0];
+    that.offsetLeft = config.offset[1]||that.offsetLeft;
+  } else if(config.offset !== 'auto'){
+
+    if(config.offset === 't'){ //涓�
+      that.offsetTop = 0;
+    } else if(config.offset === 'r'){ //鍙�
+      that.offsetLeft = win.width() - area[0];
+    } else if(config.offset === 'b'){ //涓�
+      that.offsetTop = win.height() - area[1];
+    } else if(config.offset === 'l'){ //宸�
+      that.offsetLeft = 0;
+    } else if(config.offset === 'lt'){ //宸︿笂瑙�
+      that.offsetTop = 0;
+      that.offsetLeft = 0;
+    } else if(config.offset === 'lb'){ //宸︿笅瑙�
+      that.offsetTop = win.height() - area[1];
+      that.offsetLeft = 0;
+    } else if(config.offset === 'rt'){ //鍙充笂瑙�
+      that.offsetTop = 0;
+      that.offsetLeft = win.width() - area[0];
+    } else if(config.offset === 'rb'){ //鍙充笅瑙�
+      that.offsetTop = win.height() - area[1];
+      that.offsetLeft = win.width() - area[0];
+    } else {
+      that.offsetTop = config.offset;
+    }
+
+  }
+
+  if(!config.fixed){
+    that.offsetTop = /%$/.test(that.offsetTop) ?
+      win.height()*parseFloat(that.offsetTop)/100
+    : parseFloat(that.offsetTop);
+    that.offsetLeft = /%$/.test(that.offsetLeft) ?
+      win.width()*parseFloat(that.offsetLeft)/100
+    : parseFloat(that.offsetLeft);
+    that.offsetTop += win.scrollTop();
+    that.offsetLeft += win.scrollLeft();
+  }
+
+  if(layero.attr('minLeft')){
+    that.offsetTop = win.height() - (layero.find(doms[1]).outerHeight() || 0);
+    that.offsetLeft = layero.css('left');
+  }
+
+  if(config.fullScreen || area[1]+55>=win.height()){
+    that.offsetTop=that.offsetTop>10?that.offsetTop:10;
+  }else{
+    that.offsetTop=that.offsetTop>50?that.offsetTop:50;
+  }
+  layero.css({top: that.offsetTop, left: that.offsetLeft>0?that.offsetLeft:0});
+
+};
+
+//Tips
+Class.pt.tips = function(){
+  var that = this, config = that.config, layero = that.layero;
+  var layArea = [layero.outerWidth(), layero.outerHeight()], follow = $(config.follow);
+  if(!follow[0]) follow = $('body');
+  var goal = {
+    width: follow.outerWidth(),
+    height: follow.outerHeight(),
+    top: follow.offset().top,
+    left: follow.offset().left
+  }, tipsG = layero.find('.layui-layer-TipsG');
+
+  var guide = config.tips[0];
+  config.tips[1] || tipsG.remove();
+
+  goal.autoLeft = function(){
+    if(goal.left + layArea[0] - win.width() > 0){
+      goal.tipLeft = goal.left + goal.width - layArea[0];
+      tipsG.css({right: 12, left: 'auto'});
+    } else {
+      goal.tipLeft = goal.left;
+    };
+  };
+
+  //杈ㄥ埆tips鐨勬柟浣�
+  goal.where = [function(){ //涓�
+    goal.autoLeft();
+    goal.tipTop = goal.top - layArea[1] - 10;
+    tipsG.removeClass('layui-layer-TipsB').addClass('layui-layer-TipsT').css('border-right-color', config.tips[1]);
+  }, function(){ //鍙�
+    goal.tipLeft = goal.left + goal.width + 10;
+    goal.tipTop = goal.top;
+    tipsG.removeClass('layui-layer-TipsL').addClass('layui-layer-TipsR').css('border-bottom-color', config.tips[1]);
+  }, function(){ //涓�
+    goal.autoLeft();
+    goal.tipTop = goal.top + goal.height + 10;
+    tipsG.removeClass('layui-layer-TipsT').addClass('layui-layer-TipsB').css('border-right-color', config.tips[1]);
+  }, function(){ //宸�
+    goal.tipLeft = goal.left - layArea[0] - 10;
+    goal.tipTop = goal.top;
+    tipsG.removeClass('layui-layer-TipsR').addClass('layui-layer-TipsL').css('border-bottom-color', config.tips[1]);
+  }];
+  goal.where[guide-1]();
+
+  /* 8*2涓哄皬涓夎褰㈠崰鎹殑绌洪棿 */
+  if(guide === 1){
+    goal.top - (win.scrollTop() + layArea[1] + 8*2) < 0 && goal.where[2]();
+  } else if(guide === 2){
+    win.width() - (goal.left + goal.width + layArea[0] + 8*2) > 0 || goal.where[3]()
+  } else if(guide === 3){
+    (goal.top - win.scrollTop() + goal.height + layArea[1] + 8*2) - win.height() > 0 && goal.where[0]();
+  } else if(guide === 4){
+     layArea[0] + 8*2 - goal.left > 0 && goal.where[1]()
+  }
+
+  layero.find('.'+doms[5]).css({
+    'background-color': config.tips[1],
+    'padding-right': (config.closeBtn ? '30px' : '')
+  });
+  layero.css({
+    left: goal.tipLeft - (config.fixed ? win.scrollLeft() : 0),
+    top: goal.tipTop  - (config.fixed ? win.scrollTop() : 0)
+  });
+}
+
+//鎷栨嫿灞�
+Class.pt.move = function(){
+  var that = this
+  ,config = that.config
+  ,_DOC = $(document)
+  ,layero = that.layero
+  ,moveElem = layero.find(config.move)
+  ,resizeElem = layero.find('.layui-layer-resize')
+  ,dict = {};
+
+  if(config.move){
+    moveElem.css('cursor', 'move');
+  }
+
+  moveElem.on('mousedown', function(e){
+    e.preventDefault();
+    if(config.move){
+      dict.moveStart = true;
+      dict.offset = [
+        e.clientX - parseFloat(layero.css('left'))
+        ,e.clientY - parseFloat(layero.css('top'))
+      ];
+      ready.moveElem.css('cursor', 'move').show();
+    }
+  });
+
+  resizeElem.on('mousedown', function(e){
+    e.preventDefault();
+    dict.resizeStart = true;
+    dict.offset = [e.clientX, e.clientY];
+    dict.area = [
+      layero.outerWidth()
+      ,layero.outerHeight()
+    ];
+    ready.moveElem.css('cursor', 'se-resize').show();
+  });
+
+  _DOC.on('mousemove', function(e){
+
+    //鎷栨嫿绉诲姩
+    if(dict.moveStart){
+      var X = e.clientX - dict.offset[0]
+      ,Y = e.clientY - dict.offset[1]
+      ,fixed = layero.css('position') === 'fixed';
+
+      e.preventDefault();
+
+      dict.stX = fixed ? 0 : win.scrollLeft();
+      dict.stY = fixed ? 0 : win.scrollTop();
+
+      //鎺у埗鍏冪礌涓嶈鎷栧嚭绐楀彛澶�
+      if(!config.moveOut){
+        var setRig = win.width() - layero.outerWidth() + dict.stX
+        ,setBot = win.height() - layero.outerHeight() + dict.stY;
+        X < dict.stX && (X = dict.stX);
+        X > setRig && (X = setRig);
+        Y < dict.stY && (Y = dict.stY);
+        Y > setBot && (Y = setBot);
+      }
+
+      layero.css({
+        left: X
+        ,top: Y
+      });
+    }
+
+    //Resize
+    if(config.resize && dict.resizeStart){
+      var X = e.clientX - dict.offset[0]
+      ,Y = e.clientY - dict.offset[1];
+
+      e.preventDefault();
+
+      layer.style(that.index, {
+        width: dict.area[0] + X
+        ,height: dict.area[1] + Y
+      })
+      dict.isResize = true;
+      config.resizing && config.resizing(layero);
+    }
+  }).on('mouseup', function(e){
+    if(dict.moveStart){
+      delete dict.moveStart;
+      ready.moveElem.hide();
+      config.moveEnd && config.moveEnd(layero);
+    }
+    if(dict.resizeStart){
+      delete dict.resizeStart;
+      ready.moveElem.hide();
+    }
+  });
+
+  return that;
+};
+
+Class.pt.callback = function(){
+  var that = this, layero = that.layero, config = that.config;
+  that.openLayer();
+  if(config.success){
+    if(config.type == 2){
+      layero.find('iframe').on('load', function(){
+        config.success(layero, that.index, that);
+      });
+    } else {
+      config.success(layero, that.index, that);
+    }
+  }
+  layer.ie == 6 && that.IE6(layero);
+
+  //鎸夐挳
+  layero.find('.'+ doms[6]).find('a').on('click', function(){
+    var index = $(this).index();
+    if(index === 0){
+      if(config.yes){
+        config.yes(that.index, layero)
+      } else if(config['btn1']){
+        config['btn1'](that.index, layero)
+      } else {
+        layer.close(that.index);
+      }
+    } else {
+      var close = config['btn'+(index+1)] && config['btn'+(index+1)](that.index, layero);
+      close === false || layer.close(that.index);
+    }
+  });
+
+  //鍙栨秷
+  function cancel(){
+    var close = config.cancel && config.cancel(that.index, layero);
+    close === false || layer.close(that.index);
+  }
+
+  //鍙充笂瑙掑叧闂洖璋�
+  layero.find('.'+ doms[7]).on('click', cancel);
+
+  //鐐归伄缃╁叧闂�
+  if(config.shadeClose){
+    that.shadeo.on('click', function(){
+      layer.close(that.index);
+    });
+  }
+
+  //鏈�灏忓寲
+  layero.find('.layui-layer-min').on('click', function(){
+    var min = config.min && config.min(layero, that.index);
+    min === false || layer.min(that.index, config);
+  });
+
+  //鍏ㄥ睆/杩樺師
+  layero.find('.layui-layer-max').on('click', function(){
+    if($(this).hasClass('layui-layer-maxmin')){
+      layer.restore(that.index);
+      config.restore && config.restore(layero, that.index);
+    } else {
+      layer.full(that.index, config);
+      setTimeout(function(){
+        config.full && config.full(layero, that.index);
+      }, 100);
+    }
+  });
+
+  config.end && (ready.end[that.index] = config.end);
+};
+
+//for ie6 鎭㈠select
+ready.reselect = function(){
+  $.each($('select'), function(index , value){
+    var sthis = $(this);
+    if(!sthis.parents('.'+doms[0])[0]){
+      (sthis.attr('layer') == 1 && $('.'+doms[0]).length < 1) && sthis.removeAttr('layer').show();
+    }
+    sthis = null;
+  });
+};
+
+Class.pt.IE6 = function(layero){
+  //闅愯棌select
+  $('select').each(function(index , value){
+    var sthis = $(this);
+    if(!sthis.parents('.'+doms[0])[0]){
+      sthis.css('display') === 'none' || sthis.attr({'layer' : '1'}).hide();
+    }
+    sthis = null;
+  });
+};
+
+//闇�渚濊禆鍘熷瀷鐨勫澶栨柟娉�
+Class.pt.openLayer = function(){
+  var that = this;
+
+  //缃《褰撳墠绐楀彛
+  layer.zIndex = that.config.zIndex;
+  layer.setTop = function(layero){
+    var setZindex = function(){
+      layer.zIndex++;
+      layero.css('z-index', layer.zIndex + 1);
+    };
+    layer.zIndex = parseInt(layero[0].style.zIndex);
+    layero.on('mousedown', setZindex);
+    return layer.zIndex;
+  };
+};
+
+//璁板綍瀹介珮鍧愭爣锛岀敤浜庤繕鍘�
+ready.record = function(layero){
+  var area = [
+    layero.width(),
+    layero.height(),
+    layero.position().top,
+    layero.position().left + parseFloat(layero.css('margin-left'))
+  ];
+  layero.find('.layui-layer-max').addClass('layui-layer-maxmin');
+  layero.attr({area: area});
+};
+
+ready.rescollbar = function(index){
+  if(doms.html.attr('layer-full') == index){
+    if(doms.html[0].style.removeProperty){
+      doms.html[0].style.removeProperty('overflow');
+    } else {
+      doms.html[0].style.removeAttribute('overflow');
+    }
+    doms.html.removeAttr('layer-full');
+  }
+};
+
+/** 鍐呯疆鎴愬憳 */
+
+window.layer = layer;
+
+//鑾峰彇瀛恑frame鐨凞OM
+layer.getChildFrame = function(selector, index){
+  index = index || $('.'+doms[4]).attr('times');
+  return $('#'+ doms[0] + index).find('iframe').contents().find(selector);
+};
+
+//寰楀埌褰撳墠iframe灞傜殑绱㈠紩锛屽瓙iframe鏃朵娇鐢�
+layer.getFrameIndex = function(name){
+  return $('#'+ name).parents('.'+doms[4]).attr('times');
+};
+
+//iframe灞傝嚜閫傚簲瀹介珮
+layer.iframeAuto = function(index){
+  if(!index) return;
+  var heg = layer.getChildFrame('html', index).outerHeight();
+  var layero = $('#'+ doms[0] + index);
+  var titHeight = layero.find(doms[1]).outerHeight() || 0;
+  var btnHeight = layero.find('.'+doms[6]).outerHeight() || 0;
+  layero.css({height: heg + titHeight + btnHeight});
+  layero.find('iframe').css({height: heg});
+};
+
+//閲嶇疆iframe url
+layer.iframeSrc = function(index, url){
+  $('#'+ doms[0] + index).find('iframe').attr('src', url);
+};
+
+//璁惧畾灞傜殑鏍峰紡
+layer.style = function(index, options, limit){
+  var layero = $('#'+ doms[0] + index)
+  ,contElem = layero.find('.layui-layer-content')
+  ,type = layero.attr('type')
+  ,titHeight = layero.find(doms[1]).outerHeight() || 0
+  ,btnHeight = layero.find('.'+doms[6]).outerHeight() || 0
+  ,minLeft = layero.attr('minLeft');
+
+  if(type === ready.type[3] || type === ready.type[4]){
+    return;
+  }
+
+  if(!limit){
+    if(parseFloat(options.width) <= 260){
+      options.width = 260;
+    };
+
+    if(parseFloat(options.height) - titHeight - btnHeight <= 64){
+      options.height = 64 + titHeight + btnHeight;
+    };
+  }
+
+  layero.css(options);
+  btnHeight = layero.find('.'+doms[6]).outerHeight();
+
+  if(type === ready.type[2]){
+    layero.find('iframe').css({
+      height: parseFloat(options.height) - titHeight - btnHeight
+    });
+  } else {
+    contElem.css({
+      height: parseFloat(options.height) - titHeight - btnHeight
+      - parseFloat(contElem.css('padding-top'))
+      - parseFloat(contElem.css('padding-bottom'))
+    })
+  }
+};
+
+//鏈�灏忓寲
+layer.min = function(index, options){
+  options = options || {};
+  var layero = $('#'+ doms[0] + index)
+  ,shadeo = $('#'+ doms.SHADE + index)
+  ,titHeight = layero.find(doms[1]).outerHeight() || 0
+  ,left = layero.attr('minLeft') || (181*ready.minIndex)+'px'
+  ,position = layero.css('position')
+  ,settings = {
+    width: 180
+    ,height: titHeight
+    ,position: 'fixed'
+    ,overflow: 'hidden'
+  };
+
+  //璁板綍瀹介珮鍧愭爣锛岀敤浜庤繕鍘�
+  ready.record(layero);
+
+  if(ready.minLeft[0]){
+    left = ready.minLeft[0];
+    ready.minLeft.shift();
+  }
+
+  //鏄惁鍫嗗彔鍦ㄥ乏涓嬭
+  if(options.minStack){
+    settings.left = left;
+    settings.top = win.height() - titHeight;
+    layero.attr('minLeft') || ready.minIndex++; //鍒濇鎵ц锛屾渶灏忓寲鎿嶄綔绱㈠紩鑷
+    layero.attr('minLeft', left);
+  }
+
+  layero.attr('position', position);
+  layer.style(index, settings, true);
+
+  layero.find('.layui-layer-min').hide();
+  layero.attr('type') === 'page' && layero.find(doms[4]).hide();
+  ready.rescollbar(index);
+
+  //闅愯棌閬僵
+  shadeo.hide();
+};
+
+//杩樺師
+layer.restore = function(index){
+  var layero = $('#'+ doms[0] + index)
+  ,shadeo = $('#'+ doms.SHADE + index)
+  ,area = layero.attr('area').split(',')
+  ,type = layero.attr('type');
+
+  //鎭㈠鍘熸潵灏哄
+  layer.style(index, {
+    width: parseFloat(area[0]),
+    height: parseFloat(area[1]),
+    top: parseFloat(area[2]),
+    left: parseFloat(area[3]),
+    position: layero.attr('position'),
+    overflow: 'visible'
+  }, true);
+
+  layero.find('.layui-layer-max').removeClass('layui-layer-maxmin');
+  layero.find('.layui-layer-min').show();
+  layero.attr('type') === 'page' && layero.find(doms[4]).show();
+  ready.rescollbar(index);
+
+  //鎭㈠閬僵
+  shadeo.show();
+};
+
+//鍏ㄥ睆
+layer.full = function(index){
+  var layero = $('#'+ doms[0] + index), timer;
+  ready.record(layero);
+  if(!doms.html.attr('layer-full')){
+    doms.html.css('overflow','hidden').attr('layer-full', index);
+  }
+  clearTimeout(timer);
+  timer = setTimeout(function(){
+    var isfix = layero.css('position') === 'fixed';
+    layer.style(index, {
+      top: isfix ? 0 : win.scrollTop(),
+      left: isfix ? 0 : win.scrollLeft(),
+      width: win.width(),
+      height: win.height()
+    }, true);
+    layero.find('.layui-layer-min').hide();
+  }, 100);
+};
+
+//鏀瑰彉title
+layer.title = function(name, index){
+  var title = $('#'+ doms[0] + (index||layer.index)).find(doms[1]);
+  title.html(name);
+};
+
+//鍏抽棴layer鎬绘柟娉�
+layer.close = function(index, callback){
+  var layero = $('#'+ doms[0] + index), type = layero.attr('type'), closeAnim = 'layer-anim-close';
+  if(!layero[0]) return;
+  var WRAP = 'layui-layer-wrap', remove = function(){
+    if(type === ready.type[1] && layero.attr('conType') === 'object'){
+      layero.children(':not(.'+ doms[5] +')').remove();
+      var wrap = layero.find('.'+WRAP);
+      for(var i = 0; i < 2; i++){
+        wrap.unwrap();
+      }
+      wrap.css('display', wrap.data('display')).removeClass(WRAP);
+    } else {
+      //浣庣増鏈琁E 鍥炴敹 iframe
+      if(type === ready.type[2]){
+        try {
+          var iframe = $('#'+doms[4]+index)[0];
+          iframe.contentWindow.document.write('');
+          iframe.contentWindow.close();
+          layero.find('.'+doms[5])[0].removeChild(iframe);
+        } catch(e){}
+      }
+      layero[0].innerHTML = '';
+      layero.remove();
+    }
+    typeof ready.end[index] === 'function' && ready.end[index]();
+    delete ready.end[index];
+    typeof callback === 'function' && callback();
+  };
+
+  if(layero.data('isOutAnim')){
+    layero.addClass('layer-anim '+ closeAnim);
+  }
+
+  $('#layui-layer-moves, #'+ doms.SHADE + index).remove();
+  layer.ie == 6 && ready.reselect();
+  ready.rescollbar(index);
+  if(layero.attr('minLeft')){
+    ready.minIndex--;
+    ready.minLeft.push(layero.attr('minLeft'));
+  }
+
+  if((layer.ie && layer.ie < 10) || !layero.data('isOutAnim')){
+    remove()
+  } else {
+    setTimeout(function(){
+      remove();
+    }, 200);
+  }
+};
+
+//鍏抽棴鎵�鏈夊眰
+layer.closeAll = function(type, callback){
+  if(typeof type === 'function'){
+    callback = type;
+    type = null;
+  };
+  var domsElem = $('.'+doms[0]);
+  $.each(domsElem, function(_index){
+    var othis = $(this);
+    var is = type ? (othis.attr('type') === type) : 1;
+    is && layer.close(othis.attr('times'), _index === domsElem.length - 1 ? callback : null);
+    is = null;
+  });
+  if(domsElem.length === 0) typeof callback === 'function' && callback();
+};
+
+/**
+
+  鎷撳睍妯″潡锛宭ayui 寮�濮嬪悎骞跺湪涓�璧�
+
+ */
+
+var cache = layer.cache||{}, skin = function(type){
+  return (cache.skin ? (' ' + cache.skin + ' ' + cache.skin + '-'+type) : '');
+};
+
+//浠跨郴缁焢rompt
+layer.prompt = function(options, yes){
+  var style = '';
+  options = options || {};
+
+  if(typeof options === 'function') yes = options;
+
+  if(options.area){
+    var area = options.area;
+    style = 'style="width: '+ area[0] +'; height: '+ area[1] + ';"';
+    delete options.area;
+  }
+  var prompt, content = options.formType == 2 ? '<textarea class="layui-layer-input"' + style +'></textarea>' : function(){
+    return '<input type="'+ (options.formType == 1 ? 'password' : 'text') +'" class="layui-layer-input">';
+  }();
+
+  var success = options.success;
+  delete options.success;
+
+  return layer.open($.extend({
+    type: 1
+    ,btn: ['&#x786E;&#x5B9A;','&#x53D6;&#x6D88;']
+    ,content: content
+    ,skin: 'layui-layer-prompt' + skin('prompt')
+    ,maxWidth: win.width()
+    ,success: function(layero){
+      prompt = layero.find('.layui-layer-input');
+      prompt.val(options.value || '').focus();
+      typeof success === 'function' && success(layero);
+    }
+    ,resize: false
+    ,yes: function(index){
+      var value = prompt.val();
+      if(value === ''){
+        prompt.focus();
+      } else if(value.length > (options.maxlength||500)) {
+        layer.tips('&#x6700;&#x591A;&#x8F93;&#x5165;'+ (options.maxlength || 500) +'&#x4E2A;&#x5B57;&#x6570;', prompt, {tips: 1});
+      } else {
+        yes && yes(value, index, prompt);
+      }
+    }
+  }, options));
+};
+
+//tab灞�
+layer.tab = function(options){
+  options = options || {};
+
+  var tab = options.tab || {}
+  ,THIS = 'layui-this'
+  ,success = options.success;
+
+  delete options.success;
+
+  return layer.open($.extend({
+    type: 1,
+    skin: 'layui-layer-tab' + skin('tab'),
+    resize: false,
+    title: function(){
+      var len = tab.length, ii = 1, str = '';
+      if(len > 0){
+        str = '<span class="'+ THIS +'">'+ tab[0].title +'</span>';
+        for(; ii < len; ii++){
+          str += '<span>'+ tab[ii].title +'</span>';
+        }
+      }
+      return str;
+    }(),
+    content: '<ul class="layui-layer-tabmain">'+ function(){
+      var len = tab.length, ii = 1, str = '';
+      if(len > 0){
+        str = '<li class="layui-layer-tabli '+ THIS +'">'+ (tab[0].content || 'no content') +'</li>';
+        for(; ii < len; ii++){
+          str += '<li class="layui-layer-tabli">'+ (tab[ii].content || 'no  content') +'</li>';
+        }
+      }
+      return str;
+    }() +'</ul>',
+    success: function(layero){
+      var btn = layero.find('.layui-layer-title').children();
+      var main = layero.find('.layui-layer-tabmain').children();
+      btn.on('mousedown', function(e){
+        e.stopPropagation ? e.stopPropagation() : e.cancelBubble = true;
+        var othis = $(this), index = othis.index();
+        othis.addClass(THIS).siblings().removeClass(THIS);
+        main.eq(index).show().siblings().hide();
+        typeof options.change === 'function' && options.change(index);
+      });
+      typeof success === 'function' && success(layero);
+    }
+  }, options));
+};
+
+//鐩稿唽灞�
+layer.photos = function(options, loop, key){
+  var dict = {};
+  options = options || {};
+  if(!options.photos) return;
+
+  //鑻� photos 骞堕潪閫夋嫨鍣ㄦ垨 jQuery 瀵硅薄锛屽垯涓烘櫘閫� object
+  var isObject = !(typeof options.photos === 'string' || options.photos instanceof $)
+  ,photos = isObject ? options.photos : {}
+  ,data = photos.data || []
+  ,start = photos.start || 0;
+
+  dict.imgIndex = (start|0) + 1;
+  options.img = options.img || 'img';
+
+  var success = options.success;
+  delete options.success;
+
+  //濡傛灉 options.photos 涓嶆槸涓�涓璞�
+  if(!isObject){ //椤甸潰鐩存帴鑾峰彇
+    var parent = $(options.photos), pushData = function(){
+      data = [];
+      parent.find(options.img).each(function(index){
+        var othis = $(this);
+        othis.attr('layer-index', index);
+        data.push({
+          alt: othis.attr('alt'),
+          pid: othis.attr('layer-pid'),
+          src: othis.attr('layer-src') || othis.attr('src'),
+          thumb: othis.attr('src')
+        });
+      });
+    };
+
+    pushData();
+
+    if (data.length === 0) return;
+
+    loop || parent.on('click', options.img, function(){
+      pushData();
+      var othis = $(this), index = othis.attr('layer-index');
+      layer.photos($.extend(options, {
+        photos: {
+          start: index,
+          data: data,
+          tab: options.tab
+        },
+        full: options.full
+      }), true);
+    });
+
+    //涓嶇洿鎺ュ脊鍑�
+    if(!loop) return;
+
+  } else if (data.length === 0){
+    return layer.msg('&#x6CA1;&#x6709;&#x56FE;&#x7247;');
+  }
+
+  //涓婁竴寮�
+  dict.imgprev = function(key){
+    dict.imgIndex--;
+    if(dict.imgIndex < 1){
+      dict.imgIndex = data.length;
+    }
+    dict.tabimg(key);
+  };
+
+  //涓嬩竴寮�
+  dict.imgnext = function(key,errorMsg){
+    dict.imgIndex++;
+    if(dict.imgIndex > data.length){
+      dict.imgIndex = 1;
+      if (errorMsg) {return};
+    }
+    dict.tabimg(key)
+  };
+
+  //鏂瑰悜閿�
+  dict.keyup = function(event){
+    if(!dict.end){
+      var code = event.keyCode;
+      event.preventDefault();
+      if(code === 37){
+        dict.imgprev(true);
+      } else if(code === 39) {
+        dict.imgnext(true);
+      } else if(code === 27) {
+        layer.close(dict.index);
+      }
+    }
+  }
+
+  //鍒囨崲
+  dict.tabimg = function(key){
+    if(data.length <= 1) return;
+    photos.start = dict.imgIndex - 1;
+    layer.close(dict.index);
+    return layer.photos(options, true, key);
+    setTimeout(function(){
+      layer.photos(options, true, key);
+    }, 200);
+  }
+
+  //涓�浜涘姩浣�
+  dict.event = function(){
+    /*
+    dict.bigimg.hover(function(){
+      dict.imgsee.show();
+    }, function(){
+      dict.imgsee.hide();
+    });
+    */
+
+    dict.bigimg.find('.layui-layer-imgprev').on('click', function(event){
+      event.preventDefault();
+      dict.imgprev(true);
+    });
+
+    dict.bigimg.find('.layui-layer-imgnext').on('click', function(event){
+      event.preventDefault();
+      dict.imgnext(true);
+    });
+
+    $(document).on('keyup', dict.keyup);
+  };
+
+  //鍥剧墖棰勫姞杞�
+  function loadImage(url, callback, error) {
+    var img = new Image();
+    img.src = url;
+    if(img.complete){
+      return callback(img);
+    }
+    img.onload = function(){
+      img.onload = null;
+      callback(img);
+    };
+    img.onerror = function(e){
+      img.onerror = null;
+      error(e);
+    };
+  };
+
+  dict.loadi = layer.load(1, {
+    shade: 'shade' in options ? false : 0.9,
+    scrollbar: false
+  });
+
+  loadImage(data[start].src, function(img){
+    layer.close(dict.loadi);
+
+    //鍒囨崲鍥剧墖鏃朵笉鍑虹幇鍔ㄧ敾
+    if(key) options.anim = -1;
+
+    //寮瑰嚭鍥剧墖灞�
+    dict.index = layer.open($.extend({
+      type: 1,
+      id: 'layui-layer-photos',
+      area: function(){
+        var imgarea = [img.width, img.height];
+        var winarea = [$(window).width() - 100, $(window).height() - 100];
+
+        //濡傛灉 瀹為檯鍥剧墖鐨勫鎴栬�呴珮姣� 灞忓箷澶э紙閭d箞杩涜缂╂斁锛�
+        if(!options.full && (imgarea[0]>winarea[0]||imgarea[1]>winarea[1])){
+          var wh = [imgarea[0]/winarea[0],imgarea[1]/winarea[1]];//鍙栧搴︾缉鏀炬瘮渚嬨�侀珮搴︾缉鏀炬瘮渚�
+          if(wh[0] > wh[1]){//鍙栫缉鏀炬瘮渚嬫渶澶х殑杩涜缂╂斁
+            imgarea[0] = imgarea[0]/wh[0];
+            imgarea[1] = imgarea[1]/wh[0];
+          } else if(wh[0] < wh[1]){
+            imgarea[0] = imgarea[0]/wh[1];
+            imgarea[1] = imgarea[1]/wh[1];
+          }
+        }
+
+        return [imgarea[0]+'px', imgarea[1]+'px'];
+      }(),
+      title: false,
+      shade: 0.9,
+      shadeClose: true,
+      closeBtn: false,
+      move: '.layui-layer-phimg img',
+      moveType: 1,
+      scrollbar: false,
+      moveOut: true,
+      anim: 5,
+      isOutAnim: false,
+      skin: 'layui-layer-photos' + skin('photos'),
+      content: '<div class="layui-layer-phimg">'
+        +'<img src="'+ data[start].src +'" alt="'+ (data[start].alt||'') +'" layer-pid="'+ data[start].pid +'">'
+        +function(){
+          if(data.length > 1){
+            return '<div class="layui-layer-imgsee">'
+              +'<span class="layui-layer-imguide"><a href="javascript:;" class="layui-layer-iconext layui-layer-imgprev"></a><a href="javascript:;" class="layui-layer-iconext layui-layer-imgnext"></a></span>'
+              +'<div class="layui-layer-imgbar" style="display:'+ (key ? 'block' : '') +'"><span class="layui-layer-imgtit"><a href="javascript:;">'+ (data[start].alt || '') +'</a><em>'+ dict.imgIndex +' / '+ data.length +'</em></span></div>'
+            +'</div>'
+          }
+          return '';
+        }()
+      +'</div>',
+      success: function(layero, index){
+        dict.bigimg = layero.find('.layui-layer-phimg');
+        dict.imgsee = layero.find('.layui-layer-imgbar');
+        dict.event(layero);
+        options.tab && options.tab(data[start], layero);
+        typeof success === 'function' && success(layero);
+      }, end: function(){
+        dict.end = true;
+        $(document).off('keyup', dict.keyup);
+      }
+    }, options));
+  }, function(){
+    layer.close(dict.loadi);
+    layer.msg('&#x5F53;&#x524D;&#x56FE;&#x7247;&#x5730;&#x5740;&#x5F02;&#x5E38;<br>&#x662F;&#x5426;&#x7EE7;&#x7EED;&#x67E5;&#x770B;&#x4E0B;&#x4E00;&#x5F20;&#xFF1F;', {
+      time: 30000,
+      btn: ['&#x4E0B;&#x4E00;&#x5F20;', '&#x4E0D;&#x770B;&#x4E86;'],
+      yes: function(){
+        data.length > 1 && dict.imgnext(true,true);
+      }
+    });
+  });
+};
+
+//涓诲叆鍙�
+ready.run = function(_$){
+  $ = _$;
+  win = $(window);
+  doms.html = $('html');
+  layer.open = function(deliver){
+    var o = new Class(deliver);
+    return o.index;
+  };
+};
+
+//鍔犺浇鏂瑰紡
+window.layui && layui.define ? (
+  layer.ready()
+  ,layui.define('jquery', function(exports){ //layui 鍔犺浇
+    layer.path = layui.cache.dir;
+    ready.run(layui.$);
+
+    //鏆撮湶妯″潡
+    window.layer = layer;
+    exports('layer', layer);
+  })
+) : (
+  (typeof define === 'function' && define.amd) ? define(['jquery'], function(){ //requirejs 鍔犺浇
+    ready.run(window.jQuery);
+    return layer;
+  }) : function(){ //鏅�� script 鏍囩鍔犺浇
+    layer.ready();
+    ready.run(window.jQuery);
+  }()
+);
+
+}(window);
+
+
+
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/layer.old.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/layer.old.js
new file mode 100644
index 0000000..9e342b8
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/layer.old.js
@@ -0,0 +1,1329 @@
+锘�/**
+
+ @Name锛歭ayer v3.1.2 Web寮瑰眰缁勪欢
+ @Author锛氳搐蹇�
+ @Site锛歨ttp://layer.layui.com
+ @License锛歁IT
+    
+ */
+
+;!function(window, undefined){
+"use strict";
+
+var isLayui = window.layui && layui.define, $, win, ready = {
+  getPath: function(){
+    var jsPath = document.currentScript ? document.currentScript.src : function(){
+      var js = document.scripts
+      ,last = js.length - 1
+      ,src;
+      for(var i = last; i > 0; i--){
+        if(js[i].readyState === 'interactive'){
+          src = js[i].src;
+          break;
+        }
+      }
+      return src || js[last].src;
+    }();
+    return jsPath.substring(0, jsPath.lastIndexOf('/') + 1);
+  }(),
+
+  config: {}, end: {}, minIndex: 0, minLeft: [],
+  btn: ['&#x786E;&#x5B9A;', '&#x53D6;&#x6D88;'],
+
+  //浜旂鍘熷灞傛ā寮�
+  type: ['dialog', 'page', 'iframe', 'loading', 'tips'],
+  
+  //鑾峰彇鑺傜偣鐨剆tyle灞炴�у��
+  getStyle: function(node, name){
+    var style = node.currentStyle ? node.currentStyle : window.getComputedStyle(node, null);
+    return style[style.getPropertyValue ? 'getPropertyValue' : 'getAttribute'](name);
+  },
+  
+  //杞藉叆CSS閰嶄欢
+  link: function(href, fn, cssname){
+    
+    //鏈缃矾寰勶紝鍒欎笉涓诲姩鍔犺浇css
+    if(!layer.path) return;
+    
+    var head = document.getElementsByTagName("head")[0], link = document.createElement('link');
+    if(typeof fn === 'string') cssname = fn;
+    var app = (cssname || href).replace(/\.|\//g, '');
+    var id = 'layuicss-'+ app, timeout = 0;
+    
+    link.rel = 'stylesheet';
+    link.href = layer.path + href;
+    link.id = id;
+    
+    if(!document.getElementById(id)){
+      head.appendChild(link);
+    }
+    
+    if(typeof fn !== 'function') return;
+    
+    //杞css鏄惁鍔犺浇瀹屾瘯
+    (function poll() {
+      if(++timeout > 8 * 1000 / 100){
+        return window.console && console.error('layer.css: Invalid');
+      };
+      parseInt(ready.getStyle(document.getElementById(id), 'width')) === 1989 ? fn() : setTimeout(poll, 100);
+    }());
+  }
+};
+
+//榛樿鍐呯疆鏂规硶銆�
+var layer = {
+  v: '3.1.1',
+  ie: function(){ //ie鐗堟湰
+    var agent = navigator.userAgent.toLowerCase();
+    return (!!window.ActiveXObject || "ActiveXObject" in window) ? (
+      (agent.match(/msie\s(\d+)/) || [])[1] || '11' //鐢变簬ie11骞舵病鏈塵sie鐨勬爣璇�
+    ) : false;
+  }(),
+  index: (window.layer && window.layer.v) ? 100000 : 0,
+  path: ready.getPath,
+  config: function(options, fn){
+    options = options || {};
+    layer.cache = ready.config = $.extend({}, ready.config, options);
+    layer.path = ready.config.path || layer.path;
+    typeof options.extend === 'string' && (options.extend = [options.extend]);
+    
+    if(ready.config.path) layer.ready();
+    
+    if(!options.extend) return this;
+    
+    isLayui 
+      ? layui.addcss('modules/layer/' + options.extend)
+    : ready.link('theme/' + options.extend);
+    
+    return this;
+  },
+
+  //涓讳綋CSS绛夊緟浜嬩欢
+  ready: function(callback){
+    var cssname = 'layer', ver = ''
+    ,path = (isLayui ? 'modules/layer/' : 'theme/') + 'default/layer.css?v='+ layer.v + ver;
+    isLayui ? layui.addcss(path, callback, cssname) : ready.link(path, callback, cssname);
+    return this;
+  },
+  
+  //鍚勭蹇嵎寮曠敤
+  alert: function(content, options, yes){
+    var type = typeof options === 'function';
+    if(type) yes = options;
+    return layer.open($.extend({
+      content: content,
+      yes: yes
+    }, type ? {} : options));
+  }, 
+  
+  confirm: function(content, options, yes, cancel){ 
+    var type = typeof options === 'function';
+    if(type){
+      cancel = yes;
+      yes = options;
+    }
+    return layer.open($.extend({
+      content: content,
+      btn: ready.btn,
+      yes: yes,
+      btn2: cancel
+    }, type ? {} : options));
+  },
+  
+  msg: function(content, options, end){ //鏈�甯哥敤鎻愮ず灞�
+    var type = typeof options === 'function', rskin = ready.config.skin;
+    var skin = (rskin ? rskin + ' ' + rskin + '-msg' : '')||'layui-layer-msg';
+    var anim = doms.anim.length - 1;
+    if(type) end = options;
+    return layer.open($.extend({
+      content: content,
+      time: 3000,
+      shade: false,
+      skin: skin,
+      title: false,
+      closeBtn: false,
+      btn: false,
+      resize: false,
+      end: end
+    }, (type && !ready.config.skin) ? {
+      skin: skin + ' layui-layer-hui',
+      anim: anim
+    } : function(){
+       options = options || {};
+       if(options.icon === -1 || options.icon === undefined && !ready.config.skin){
+         options.skin = skin + ' ' + (options.skin||'layui-layer-hui');
+       }
+       return options;
+    }()));  
+  },
+  
+  load: function(icon, options){
+    return layer.open($.extend({
+      type: 3,
+      icon: icon || 0,
+      resize: false,
+      shade: 0.01
+    }, options));
+  }, 
+  
+  tips: function(content, follow, options){
+    return layer.open($.extend({
+      type: 4,
+      content: [content, follow],
+      closeBtn: false,
+      time: 3000,
+      shade: false,
+      resize: false,
+      fixed: false,
+      maxWidth: 210
+    }, options));
+  }
+};
+
+var Class = function(setings){  
+  var that = this;
+  that.index = ++layer.index;
+  that.config = $.extend({}, that.config, ready.config, setings);
+  document.body ? that.creat() : setTimeout(function(){
+    that.creat();
+  }, 30);
+};
+
+Class.pt = Class.prototype;
+
+//缂撳瓨甯哥敤瀛楃
+var doms = ['layui-layer', '.layui-layer-title', '.layui-layer-main', '.layui-layer-dialog', 'layui-layer-iframe', 'layui-layer-content', 'layui-layer-btn', 'layui-layer-close','layui-layer-btn-beforeinfo'];
+doms.anim = ['layer-anim-00', 'layer-anim-01', 'layer-anim-02', 'layer-anim-03', 'layer-anim-04', 'layer-anim-05', 'layer-anim-06'];
+
+//榛樿閰嶇疆
+Class.pt.config = {
+  type: 0,
+  shade: 0.6,//weidy@2018-03-08 淇敼榛樿閫忔槑搴�
+  fixed: true,
+  move: doms[1],
+  title: '&#x4FE1;&#x606F;',
+  offset: 'auto',
+  area: 'auto',
+  closeBtn: 2,//weidy@2020-04-30淇敼涓�2锛屽師鏈槸1
+  time: 0, //0琛ㄧず涓嶈嚜鍔ㄥ叧闂�
+  zIndex: 19891014, 
+  maxWidth: 360,
+  anim: 0,
+  isOutAnim: true,
+  icon: -1,
+  moveType: 1,
+  resize: true,
+  scrollbar: true, //鏄惁鍏佽娴忚鍣ㄦ粴鍔ㄦ潯
+  tips: 2,
+  skin:'layui-layer-lan', //weidy@2020-04-30娣诲姞榛樿鐨偆锛屽師鏈病鏈夎繖涓厤缃�
+  shadeClose:true //weidy@2020-04-30娣诲姞鐐瑰嚮閬僵鍏抽棴锛屽師鏈病鏈夎繖涓厤缃�
+};
+
+//瀹瑰櫒
+Class.pt.vessel = function(conType, callback){
+  var that = this, times = that.index, config = that.config;
+  var zIndex = config.zIndex + times, titype = typeof config.title === 'object';
+  var ismax = config.maxmin && (config.type === 1 || config.type === 2);
+  var titleHTML = (config.title ? '<div class="layui-layer-title" style="'+ (titype ? config.title[1] : '') +'">' 
+    + (titype ? config.title[0] : config.title) 
+  + '</div>' : '');
+  
+  config.zIndex = zIndex;
+  callback([
+    //閬僵
+    config.shade ? ('<div class="layui-layer-shade" id="layui-layer-shade'+ times +'" times="'+ times +'" style="'+ ('z-index:'+ (zIndex-1) +'; ') +'"></div>') : '',
+    
+    //涓讳綋
+    '<div class="'+ doms[0] + (' layui-layer-'+ready.type[config.type]) + (((config.type == 0 || config.type == 2) && !config.shade) ? ' layui-layer-border' : '') + ' ' + (config.skin||'') +'" id="'+ doms[0] + times +'" type="'+ ready.type[config.type] +'" times="'+ times +'" showtime="'+ config.time +'" conType="'+ (conType ? 'object' : 'string') +'" style="z-index: '+ zIndex +'; width:'+ config.area[0] + ';height:' + config.area[1] + (config.fixed ? '' : ';position:absolute;') +'">'
+      + (conType && config.type != 2 ? '' : titleHTML)
+      + '<div id="'+ (config.id||'') +'" class="layui-layer-content'+ ((config.type == 0 && config.icon !== -1) ? ' layui-layer-padding' :'') + (config.type == 3 ? ' layui-layer-loading'+config.icon : '') +'">'
+        + (config.type == 0 && config.icon !== -1 ? '<i class="layui-layer-ico layui-layer-ico'+ config.icon +'"></i>' : '')
+        + (config.type == 1 && conType ? '' : (config.content||''))
+      + '</div>'
+      + '<span class="layui-layer-setwin">'+ function(){
+        var closebtn = ismax ? '<a class="layui-layer-min" href="javascript:;"><cite></cite></a><a class="layui-layer-ico layui-layer-max" href="javascript:;"></a>' : '';
+        config.closeBtn && (closebtn += '<a class="layui-layer-ico '+ doms[7] +' '+ doms[7] + (config.title ? config.closeBtn : (config.type == 4 ? '1' : '2')) +'" href="javascript:;"></a>');
+        return closebtn;
+      }() + '</span>'
+      //weidy@2018-03-08 娣诲姞鎸夐挳鍖哄煙鐨勬帶鍒�
+      + (config.btnBefore ? function(){
+    	  var beforeInfo = "";
+    	  typeof config.btnBefore === 'string' && (config.btnBefore = [config.btnBefore]);
+    	  for(var i = 0, len = config.btnBefore.length; i < len; i++){
+    		  beforeInfo += '<div>' + config.btnBefore[i] + '</div>';
+          }
+    	  return '<div class="' + doms[8]  + '">' + beforeInfo + '</div>'
+      }():'')
+      + (config.btn ? function(){
+        var button = '';
+        typeof config.btn === 'string' && (config.btn = [config.btn]);
+        for(var i = 0, len = config.btn.length; i < len; i++){
+          button += '<a class="'+ doms[6] +''+ i +'">'+ config.btn[i] +'</a>'
+        }
+        return '<div class="'+ doms[6] +' layui-layer-btn-'+ (config.btnAlign||'') +'">'+ button +'</div>'
+      }() : '')
+      + (config.resize ? '<span class="layui-layer-resize"></span>' : '')
+    + '</div>'
+  ], titleHTML, $('<div class="layui-layer-move"></div>'));
+  return that;
+};
+
+//鍒涘缓楠ㄦ灦
+Class.pt.creat = function(){
+  var that = this
+  ,config = that.config
+  ,times = that.index, nodeIndex
+  ,content = config.content
+  ,conType = typeof content === 'object'
+  ,body = $('body');
+  
+  if(config.id && $('#'+config.id)[0])  return;
+  //weidy@2020-04-30 澧炲姞鍏ㄥ睆鐨勮缃�
+  if(config.fullScreen){
+    //鑾峰彇绐楀彛鐨勫ぇ灏忥紝浣嗘槸鍥涢潰鐣�50鐨勭┖鐧�
+    if(window.innerWidth){
+      config.area = [(window.innerWidth-50) + "px",(window.innerHeight-50) + "px"];
+    }else{
+      config.area = [(document.documentElement.clientWidth-50) + "px",(document.documentElement.clientHeight-50) + "px"];
+    }
+  }
+  if(typeof config.area === 'string'){
+    config.area = config.area === 'auto' ? ['', ''] : [config.area, ''];
+  }
+  
+  //anim鍏煎鏃х増shift
+  if(config.shift){
+    config.anim = config.shift;
+  }
+  
+  if(layer.ie == 6){
+    config.fixed = false;
+  }
+  
+  switch(config.type){
+    case 0:
+      config.btn = ('btn' in config) ? config.btn : ready.btn[0];
+      layer.closeAll('dialog');
+    break;
+    case 2:
+      var content = config.content = conType ? config.content : [config.content||'http://layer.layui.com', 'auto'];
+      config.content = '<iframe scrolling="'+ (config.content[1]||'auto') +'" allowtransparency="true" id="'+ doms[4] +''+ times +'" name="'+ doms[4] +''+ times +'" onload="this.className=\'\';" class="layui-layer-load" frameborder="0" src="' + config.content[0] + '"></iframe>';
+    break;
+    case 3:
+      delete config.title;
+      delete config.closeBtn;
+      config.icon === -1 && (config.icon === 0);
+      layer.closeAll('loading');
+    break;
+    case 4:
+      conType || (config.content = [config.content, 'body']);
+      config.follow = config.content[1];
+      config.content = config.content[0] + '<i class="layui-layer-TipsG"></i>';
+      delete config.title;
+      config.tips = typeof config.tips === 'object' ? config.tips : [config.tips, true];
+      config.tipsMore || layer.closeAll('tips');
+    break;
+  }
+  
+  //寤虹珛瀹瑰櫒
+  that.vessel(conType, function(html, titleHTML, moveElem){
+    body.append(html[0]);
+    conType ? function(){
+      (config.type == 2 || config.type == 4) ? function(){
+        $('body').append(html[1]);
+      }() : function(){
+        if(!content.parents('.'+doms[0])[0]){
+          content.data('display', content.css('display')).show().addClass('layui-layer-wrap').wrap(html[1]);
+          $('#'+ doms[0] + times).find('.'+doms[5]).before(titleHTML);
+        }
+      }();
+    }() : body.append(html[1]);
+    $('.layui-layer-move')[0] || body.append(ready.moveElem = moveElem);
+    that.layero = $('#'+ doms[0] + times);
+    config.scrollbar || doms.html.css('overflow', 'hidden').attr('layer-full', times);
+  }).auto(times);
+  
+  //閬僵
+  $('#layui-layer-shade'+ that.index).css({
+    'background-color': config.shade[1] || '#fafafa'  //weidy@2018-03-05 淇敼閬僵鐨勯鑹诧紝榛樿涓�#000
+    ,'opacity': config.shade[0]||0.6,
+    "filter": "alpha(opacity=60)"
+  });
+
+  config.type == 2 && layer.ie == 6 && that.layero.find('iframe').attr('src', content[0]);
+
+  //鍧愭爣鑷�傚簲娴忚鍣ㄧ獥鍙e昂瀵�
+  config.type == 4 ? that.tips() : that.offset();
+  if(config.fixed){
+    win.on('resize', function(){
+      that.offset();
+      (/^\d+%$/.test(config.area[0]) || /^\d+%$/.test(config.area[1])) && that.auto(times);
+      config.type == 4 && that.tips();
+    });
+  }
+  
+  config.time <= 0 || setTimeout(function(){
+    layer.close(that.index)
+  }, config.time);
+  that.move().callback();
+  
+  //涓哄吋瀹筳Query3.0鐨刢ss鍔ㄧ敾褰卞搷鍏冪礌灏哄璁$畻
+  if(doms.anim[config.anim]){
+    var animClass = 'layer-anim '+ doms.anim[config.anim];
+    that.layero.addClass(animClass).one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', function(){
+      $(this).removeClass(animClass);
+    });
+  };
+  
+  //璁板綍鍏抽棴鍔ㄧ敾
+  if(config.isOutAnim){
+    that.layero.data('isOutAnim', true);
+  }
+};
+
+//鑷�傚簲
+Class.pt.auto = function(index){
+  var that = this, config = that.config, layero = $('#'+ doms[0] + index);
+  
+  if(config.area[0] === '' && config.maxWidth > 0){
+    //涓轰簡淇IE7涓嬩竴涓浜洪毦浠ョ悊瑙g殑bug
+    if(layer.ie && layer.ie < 8 && config.btn){
+      layero.width(layero.innerWidth());
+    }
+    layero.outerWidth() > config.maxWidth && layero.width(config.maxWidth);
+  }
+  
+  var area = [layero.innerWidth(), layero.innerHeight()]
+  ,titHeight = layero.find(doms[1]).outerHeight() || 0
+  ,btnHeight = layero.find('.'+doms[6]).outerHeight() || 0
+  ,setHeight = function(elem){
+    elem = layero.find(elem);
+    elem.height(area[1] - titHeight - btnHeight - 2*(parseFloat(elem.css('padding-top'))|0));
+  };
+
+  switch(config.type){
+    case 2: 
+      setHeight('iframe');
+    break;
+    default:
+      if(config.area[1] === ''){
+        if(config.maxHeight > 0 && layero.outerHeight() > config.maxHeight){
+          area[1] = config.maxHeight;
+          setHeight('.'+doms[5]);
+        } else if(config.fixed && area[1] >= win.height()){
+          area[1] = win.height();
+          setHeight('.'+doms[5]);
+        }
+      } else {
+        // wangting  鍖哄煙瀹藉害涓嶈兘瓒呰繃maxHeight
+        if(config.maxHeight > 0 && config.area[1]>config.maxHeight){
+          area[1] = config.maxHeight;
+        }
+        setHeight('.'+doms[5]);
+      }
+    break;
+  };
+  
+  return that;
+};
+
+//璁$畻鍧愭爣
+Class.pt.offset = function(){
+  var that = this, config = that.config, layero = that.layero;
+  var area = [layero.outerWidth(), layero.outerHeight()];
+  var type = typeof config.offset === 'object';
+  that.offsetTop = (win.height() - area[1])/2;
+  that.offsetLeft = (win.width() - area[0])/2;
+  
+  if(type){
+    that.offsetTop = config.offset[0];
+    that.offsetLeft = config.offset[1]||that.offsetLeft;
+  } else if(config.offset !== 'auto'){
+    
+    if(config.offset === 't'){ //涓�
+      that.offsetTop = 0;
+    } else if(config.offset === 'r'){ //鍙�
+      that.offsetLeft = win.width() - area[0];
+    } else if(config.offset === 'b'){ //涓�
+      that.offsetTop = win.height() - area[1];
+    } else if(config.offset === 'l'){ //宸�
+      that.offsetLeft = 0;
+    } else if(config.offset === 'lt'){ //宸︿笂瑙�
+      that.offsetTop = 0;
+      that.offsetLeft = 0;
+    } else if(config.offset === 'lb'){ //宸︿笅瑙�
+      that.offsetTop = win.height() - area[1];
+      that.offsetLeft = 0;
+    } else if(config.offset === 'rt'){ //鍙充笂瑙�
+      that.offsetTop = 0;
+      that.offsetLeft = win.width() - area[0];
+    } else if(config.offset === 'rb'){ //鍙充笅瑙�
+      that.offsetTop = win.height() - area[1];
+      that.offsetLeft = win.width() - area[0];
+    } else {
+      that.offsetTop = config.offset;
+    }
+    
+  }
+ 
+  if(!config.fixed){
+    that.offsetTop = /%$/.test(that.offsetTop) ? 
+      win.height()*parseFloat(that.offsetTop)/100
+    : parseFloat(that.offsetTop);
+    that.offsetLeft = /%$/.test(that.offsetLeft) ? 
+      win.width()*parseFloat(that.offsetLeft)/100
+    : parseFloat(that.offsetLeft);
+    that.offsetTop += win.scrollTop();
+    that.offsetLeft += win.scrollLeft();
+  }
+  
+  if(layero.attr('minLeft')){
+    that.offsetTop = win.height() - (layero.find(doms[1]).outerHeight() || 0);
+    that.offsetLeft = layero.css('left');
+  }
+
+  layero.css({top: that.offsetTop, left: that.offsetLeft});
+};
+
+//Tips
+Class.pt.tips = function(){
+  var that = this, config = that.config, layero = that.layero;
+  var layArea = [layero.outerWidth(), layero.outerHeight()], follow = $(config.follow);
+  if(!follow[0]) follow = $('body');
+  var goal = {
+    width: follow.outerWidth(),
+    height: follow.outerHeight(),
+    top: follow.offset().top,
+    left: follow.offset().left
+  }, tipsG = layero.find('.layui-layer-TipsG');
+  
+  var guide = config.tips[0];
+  config.tips[1] || tipsG.remove();
+  
+  goal.autoLeft = function(){
+    if(goal.left + layArea[0] - win.width() > 0){
+      goal.tipLeft = goal.left + goal.width - layArea[0];
+      tipsG.css({right: 12, left: 'auto'});
+    } else {
+      goal.tipLeft = goal.left;
+    };
+  };
+  
+  //杈ㄥ埆tips鐨勬柟浣�
+  goal.where = [function(){ //涓�        
+    goal.autoLeft();
+    goal.tipTop = goal.top - layArea[1] - 10;
+    tipsG.removeClass('layui-layer-TipsB').addClass('layui-layer-TipsT').css('border-right-color', config.tips[1]);
+  }, function(){ //鍙�
+    goal.tipLeft = goal.left + goal.width + 10;
+    goal.tipTop = goal.top;
+    tipsG.removeClass('layui-layer-TipsL').addClass('layui-layer-TipsR').css('border-bottom-color', config.tips[1]); 
+  }, function(){ //涓�
+    goal.autoLeft();
+    goal.tipTop = goal.top + goal.height + 10;
+    tipsG.removeClass('layui-layer-TipsT').addClass('layui-layer-TipsB').css('border-right-color', config.tips[1]);
+  }, function(){ //宸�
+    goal.tipLeft = goal.left - layArea[0] - 10;
+    goal.tipTop = goal.top;
+    tipsG.removeClass('layui-layer-TipsR').addClass('layui-layer-TipsL').css('border-bottom-color', config.tips[1]);
+  }];
+  goal.where[guide-1]();
+  
+  /* 8*2涓哄皬涓夎褰㈠崰鎹殑绌洪棿 */
+  if(guide === 1){
+    goal.top - (win.scrollTop() + layArea[1] + 8*2) < 0 && goal.where[2]();
+  } else if(guide === 2){
+    win.width() - (goal.left + goal.width + layArea[0] + 8*2) > 0 || goal.where[3]()
+  } else if(guide === 3){
+    (goal.top - win.scrollTop() + goal.height + layArea[1] + 8*2) - win.height() > 0 && goal.where[0]();
+  } else if(guide === 4){
+     layArea[0] + 8*2 - goal.left > 0 && goal.where[1]()
+  }
+
+  layero.find('.'+doms[5]).css({
+    'background-color': config.tips[1], 
+    'padding-right': (config.closeBtn ? '30px' : '')
+  });
+  layero.css({
+    left: goal.tipLeft - (config.fixed ? win.scrollLeft() : 0), 
+    top: goal.tipTop  - (config.fixed ? win.scrollTop() : 0)
+  });
+}
+
+//鎷栨嫿灞�
+Class.pt.move = function(){
+  var that = this
+  ,config = that.config
+  ,_DOC = $(document)
+  ,layero = that.layero
+  ,moveElem = layero.find(config.move)
+  ,resizeElem = layero.find('.layui-layer-resize')
+  ,dict = {};
+  
+  if(config.move){
+    moveElem.css('cursor', 'move');
+  }
+
+  moveElem.on('mousedown', function(e){
+    e.preventDefault();
+    if(config.move){
+      dict.moveStart = true;
+      dict.offset = [
+        e.clientX - parseFloat(layero.css('left'))
+        ,e.clientY - parseFloat(layero.css('top'))
+      ];
+      ready.moveElem.css('cursor', 'move').show();
+    }
+  });
+  
+  resizeElem.on('mousedown', function(e){
+    e.preventDefault();
+    dict.resizeStart = true;
+    dict.offset = [e.clientX, e.clientY];
+    dict.area = [
+      layero.outerWidth()
+      ,layero.outerHeight()
+    ];
+    ready.moveElem.css('cursor', 'se-resize').show();
+  });
+  
+  _DOC.on('mousemove', function(e){
+
+    //鎷栨嫿绉诲姩
+    if(dict.moveStart){
+      var X = e.clientX - dict.offset[0]
+      ,Y = e.clientY - dict.offset[1]
+      ,fixed = layero.css('position') === 'fixed';
+      
+      e.preventDefault();
+      
+      dict.stX = fixed ? 0 : win.scrollLeft();
+      dict.stY = fixed ? 0 : win.scrollTop();
+
+      //鎺у埗鍏冪礌涓嶈鎷栧嚭绐楀彛澶�
+      if(!config.moveOut){
+        var setRig = win.width() - layero.outerWidth() + dict.stX
+        ,setBot = win.height() - layero.outerHeight() + dict.stY;  
+        X < dict.stX && (X = dict.stX);
+        X > setRig && (X = setRig); 
+        Y < dict.stY && (Y = dict.stY);
+        Y > setBot && (Y = setBot);
+      }
+      
+      layero.css({
+        left: X
+        ,top: Y
+      });
+    }
+    
+    //Resize
+    if(config.resize && dict.resizeStart){
+      var X = e.clientX - dict.offset[0]
+      ,Y = e.clientY - dict.offset[1];
+      
+      e.preventDefault();
+      
+      layer.style(that.index, {
+        width: dict.area[0] + X
+        ,height: dict.area[1] + Y
+      })
+      dict.isResize = true;
+      config.resizing && config.resizing(layero);
+    }
+  }).on('mouseup', function(e){
+    if(dict.moveStart){
+      delete dict.moveStart;
+      ready.moveElem.hide();
+      config.moveEnd && config.moveEnd(layero);
+    }
+    if(dict.resizeStart){
+      delete dict.resizeStart;
+      ready.moveElem.hide();
+    }
+  });
+  
+  return that;
+};
+
+Class.pt.callback = function(){
+  var that = this, layero = that.layero, config = that.config;
+  that.openLayer();
+  if(config.success){
+    if(config.type == 2){
+      layero.find('iframe').on('load', function(){
+        config.success(layero, that.index,that);
+      });
+    } else {
+      config.success(layero, that.index,that);
+    }
+  }
+  layer.ie == 6 && that.IE6(layero);
+  
+  //鎸夐挳
+  layero.find('.'+ doms[6]).children('a').on('click', function(){
+    var index = $(this).index();
+    if(index === 0){
+      if(config.yes){
+        config.yes(that.index, layero)
+      } else if(config['btn1']){
+        config['btn1'](that.index, layero)
+      } else {
+        layer.close(that.index);
+      }
+    } else {
+      var close = config['btn'+(index+1)] && config['btn'+(index+1)](that.index, layero);
+      close === false || layer.close(that.index);
+    }
+  });
+  
+  //鍙栨秷
+  function cancel(){
+    var close = config.cancel && config.cancel(that.index, layero);
+    close === false || layer.close(that.index);
+  }
+  
+  //鍙充笂瑙掑叧闂洖璋�
+  layero.find('.'+ doms[7]).on('click', cancel);
+  
+  //鐐归伄缃╁叧闂�
+  if(config.shadeClose){
+    $('#layui-layer-shade'+ that.index).on('click', function(){
+      //layer.close(that.index);
+      cancel()
+    });
+  } 
+  
+  //鏈�灏忓寲
+  layero.find('.layui-layer-min').on('click', function(){
+    var min = config.min && config.min(layero);
+    min === false || layer.min(that.index, config); 
+  });
+  
+  //鍏ㄥ睆/杩樺師
+  layero.find('.layui-layer-max').on('click', function(){
+    if($(this).hasClass('layui-layer-maxmin')){
+      layer.restore(that.index);
+      config.restore && config.restore(layero);
+    } else {
+      layer.full(that.index, config);
+      setTimeout(function(){
+        config.full && config.full(layero);
+      }, 100);
+    }
+  });
+
+  config.end && (ready.end[that.index] = config.end);
+};
+
+//for ie6 鎭㈠select
+ready.reselect = function(){
+  $.each($('select'), function(index , value){
+    var sthis = $(this);
+    if(!sthis.parents('.'+doms[0])[0]){
+      (sthis.attr('layer') == 1 && $('.'+doms[0]).length < 1) && sthis.removeAttr('layer').show(); 
+    }
+    sthis = null;
+  });
+}; 
+
+Class.pt.IE6 = function(layero){
+  //闅愯棌select
+  $('select').each(function(index , value){
+    var sthis = $(this);
+    if(!sthis.parents('.'+doms[0])[0]){
+      sthis.css('display') === 'none' || sthis.attr({'layer' : '1'}).hide();
+    }
+    sthis = null;
+  });
+};
+
+//闇�渚濊禆鍘熷瀷鐨勫澶栨柟娉�
+Class.pt.openLayer = function(){
+  var that = this;
+  
+  //缃《褰撳墠绐楀彛
+  layer.zIndex = that.config.zIndex;
+  layer.setTop = function(layero){
+    var setZindex = function(){
+      layer.zIndex++;
+      layero.css('z-index', layer.zIndex + 1);
+    };
+    layer.zIndex = parseInt(layero[0].style.zIndex);
+    layero.on('mousedown', setZindex);
+    return layer.zIndex;
+  };
+};
+
+ready.record = function(layero){
+  var area = [
+    layero.width(),
+    layero.height(),
+    layero.position().top, 
+    layero.position().left + parseFloat(layero.css('margin-left'))
+  ];
+  layero.find('.layui-layer-max').addClass('layui-layer-maxmin');
+  layero.attr({area: area});
+};
+
+ready.rescollbar = function(index){
+  if(doms.html.attr('layer-full') == index){
+    if(doms.html[0].style.removeProperty){
+      doms.html[0].style.removeProperty('overflow');
+    } else {
+      doms.html[0].style.removeAttribute('overflow');
+    }
+    doms.html.removeAttr('layer-full');
+  }
+};
+
+/** 鍐呯疆鎴愬憳 */
+
+window.layer = layer;
+
+//鑾峰彇瀛恑frame鐨凞OM
+layer.getChildFrame = function(selector, index){
+  index = index || $('.'+doms[4]).attr('times');
+  return $('#'+ doms[0] + index).find('iframe').contents().find(selector);  
+};
+
+//寰楀埌褰撳墠iframe灞傜殑绱㈠紩锛屽瓙iframe鏃朵娇鐢�
+layer.getFrameIndex = function(name){
+  return $('#'+ name).parents('.'+doms[4]).attr('times');
+};
+
+//iframe灞傝嚜閫傚簲瀹介珮
+layer.iframeAuto = function(index){
+  if(!index) return;
+  var heg = layer.getChildFrame('html', index).outerHeight();
+  var layero = $('#'+ doms[0] + index);
+  var titHeight = layero.find(doms[1]).outerHeight() || 0;
+  var btnHeight = layero.find('.'+doms[6]).outerHeight() || 0;
+  layero.css({height: heg + titHeight + btnHeight});
+  layero.find('iframe').css({height: heg});
+};
+
+//閲嶇疆iframe url
+layer.iframeSrc = function(index, url){
+  $('#'+ doms[0] + index).find('iframe').attr('src', url);
+};
+
+//璁惧畾灞傜殑鏍峰紡
+layer.style = function(index, options, limit){
+  var layero = $('#'+ doms[0] + index)
+  ,contElem = layero.find('.layui-layer-content')
+  ,type = layero.attr('type')
+  ,titHeight = layero.find(doms[1]).outerHeight() || 0
+  ,btnHeight = layero.find('.'+doms[6]).outerHeight() || 0
+  ,minLeft = layero.attr('minLeft');
+  
+  if(type === ready.type[3] || type === ready.type[4]){
+    return;
+  }
+  
+  if(!limit){
+    if(parseFloat(options.width) <= 260){
+      options.width = 260;
+    };
+    
+    if(parseFloat(options.height) - titHeight - btnHeight <= 64){
+      options.height = 64 + titHeight + btnHeight;
+    };
+  }
+  
+  layero.css(options);
+  btnHeight = layero.find('.'+doms[6]).outerHeight();
+  
+  if(type === ready.type[2]){
+    layero.find('iframe').css({
+      height: parseFloat(options.height) - titHeight - btnHeight
+    });
+  } else {
+    contElem.css({
+      height: parseFloat(options.height) - titHeight - btnHeight
+      - parseFloat(contElem.css('padding-top'))
+      - parseFloat(contElem.css('padding-bottom'))
+    })
+  }
+};
+
+//鏈�灏忓寲
+layer.min = function(index, options){
+  var layero = $('#'+ doms[0] + index)
+  ,titHeight = layero.find(doms[1]).outerHeight() || 0
+  ,left = layero.attr('minLeft') || (181*ready.minIndex)+'px'
+  ,position = layero.css('position');
+  
+  ready.record(layero);
+  
+  if(ready.minLeft[0]){
+    left = ready.minLeft[0];
+    ready.minLeft.shift();
+  }
+  
+  layero.attr('position', position);
+  
+  layer.style(index, {
+    width: 180
+    ,height: titHeight
+    ,left: left
+    ,top: win.height() - titHeight
+    ,position: 'fixed'
+    ,overflow: 'hidden'
+  }, true);
+
+  layero.find('.layui-layer-min').hide();
+  layero.attr('type') === 'page' && layero.find(doms[4]).hide();
+  ready.rescollbar(index);
+  
+  if(!layero.attr('minLeft')){
+    ready.minIndex++;
+  }
+  layero.attr('minLeft', left);
+};
+
+//杩樺師
+layer.restore = function(index){
+  var layero = $('#'+ doms[0] + index), area = layero.attr('area').split(',');
+  var type = layero.attr('type');
+  layer.style(index, {
+    width: parseFloat(area[0]), 
+    height: parseFloat(area[1]), 
+    top: parseFloat(area[2]), 
+    left: parseFloat(area[3]),
+    position: layero.attr('position'),
+    overflow: 'visible'
+  }, true);
+  layero.find('.layui-layer-max').removeClass('layui-layer-maxmin');
+  layero.find('.layui-layer-min').show();
+  layero.attr('type') === 'page' && layero.find(doms[4]).show();
+  ready.rescollbar(index);
+};
+
+//鍏ㄥ睆
+layer.full = function(index){
+  var layero = $('#'+ doms[0] + index), timer;
+  ready.record(layero);
+  if(!doms.html.attr('layer-full')){
+    doms.html.css('overflow','hidden').attr('layer-full', index);
+  }
+  clearTimeout(timer);
+  timer = setTimeout(function(){
+    var isfix = layero.css('position') === 'fixed';
+    layer.style(index, {
+      top: isfix ? 0 : win.scrollTop(),
+      left: isfix ? 0 : win.scrollLeft(),
+      width: win.width(),
+      height: win.height()
+    }, true);
+    layero.find('.layui-layer-min').hide();
+  }, 100);
+};
+
+//鏀瑰彉title
+layer.title = function(name, index){
+  var title = $('#'+ doms[0] + (index||layer.index)).find(doms[1]);
+  title.html(name);
+};
+
+//鍏抽棴layer鎬绘柟娉�
+layer.close = function(index){
+  var layero = $('#'+ doms[0] + index), type = layero.attr('type'), closeAnim = 'layer-anim-close';
+  if(!layero[0]) return;
+  var WRAP = 'layui-layer-wrap', remove = function(){
+    if(type === ready.type[1] && layero.attr('conType') === 'object'){
+      layero.children(':not(.'+ doms[5] +')').remove();
+      var wrap = layero.find('.'+WRAP);
+      for(var i = 0; i < 2; i++){
+        wrap.unwrap();
+      }
+      wrap.css('display', wrap.data('display')).removeClass(WRAP);
+    } else {
+      //浣庣増鏈琁E 鍥炴敹 iframe
+      if(type === ready.type[2]){
+        try {
+          var iframe = $('#'+doms[4]+index)[0];
+          iframe.contentWindow.document.write('');
+          iframe.contentWindow.close();
+          layero.find('.'+doms[5])[0].removeChild(iframe);
+        } catch(e){}
+      }
+      layero[0].innerHTML = '';
+      layero.remove();
+    }
+    typeof ready.end[index] === 'function' && ready.end[index]();
+    delete ready.end[index];
+  };
+  
+  if(layero.data('isOutAnim')){
+    layero.addClass('layer-anim '+ closeAnim);
+  }
+  
+  $('#layui-layer-moves, #layui-layer-shade' + index).remove();
+  layer.ie == 6 && ready.reselect();
+  ready.rescollbar(index); 
+  if(layero.attr('minLeft')){
+    ready.minIndex--;
+    ready.minLeft.push(layero.attr('minLeft'));
+  }
+  
+  if((layer.ie && layer.ie < 10) || !layero.data('isOutAnim')){
+    remove()
+  } else {
+    setTimeout(function(){
+      remove();
+    }, 200);
+  }
+};
+
+//鍏抽棴鎵�鏈夊眰
+layer.closeAll = function(type){
+  $.each($('.'+doms[0]), function(){
+    var othis = $(this);
+    var is = type ? (othis.attr('type') === type) : 1;
+    is && layer.close(othis.attr('times'));
+    is = null;
+  });
+};
+
+/** 
+
+  鎷撳睍妯″潡锛宭ayui寮�濮嬪悎骞跺湪涓�璧�
+
+ */
+
+var cache = layer.cache||{}, skin = function(type){
+  return (cache.skin ? (' ' + cache.skin + ' ' + cache.skin + '-'+type) : '');
+}; 
+ 
+//浠跨郴缁焢rompt
+layer.prompt = function(options, yes){
+  var style = '';
+  options = options || {};
+  
+  if(typeof options === 'function') yes = options;
+  
+  if(options.area){
+    var area = options.area;
+    style = 'style="width: '+ area[0] +'; height: '+ area[1] + ';"';
+    delete options.area;
+  }
+  var prompt, content = options.formType == 2 ? '<textarea class="layui-layer-input"' + style +'></textarea>' : function(){
+    return '<input type="'+ (options.formType == 1 ? 'password' : 'text') +'" class="layui-layer-input">';
+  }();
+  
+  var success = options.success;
+  delete options.success;
+  
+  return layer.open($.extend({
+    type: 1
+    ,btn: ['&#x786E;&#x5B9A;','&#x53D6;&#x6D88;']
+    ,content: content
+    ,skin: 'layui-layer-prompt' + skin('prompt')
+    ,maxWidth: win.width()
+    ,success: function(layero){
+      prompt = layero.find('.layui-layer-input');
+      prompt.val(options.value || '').focus();
+      typeof success === 'function' && success(layero);
+    }
+    ,resize: false
+    ,yes: function(index){
+      var value = prompt.val();
+      if(value === ''){
+        prompt.focus();
+      } else if(value.length > (options.maxlength||500)) {
+        layer.tips('&#x6700;&#x591A;&#x8F93;&#x5165;'+ (options.maxlength || 500) +'&#x4E2A;&#x5B57;&#x6570;', prompt, {tips: 1});
+      } else {
+        yes && yes(value, index, prompt);
+      }
+    }
+  }, options));
+};
+
+//tab灞�
+layer.tab = function(options){
+  options = options || {};
+  
+  var tab = options.tab || {}
+  ,THIS = 'layui-this'
+  ,success = options.success;
+  
+  delete options.success;
+  
+  return layer.open($.extend({
+    type: 1,
+    skin: 'layui-layer-tab' + skin('tab'),
+    resize: false,
+    title: function(){
+      var len = tab.length, ii = 1, str = '';
+      if(len > 0){
+        str = '<span class="'+ THIS +'">'+ tab[0].title +'</span>';
+        for(; ii < len; ii++){
+          str += '<span>'+ tab[ii].title +'</span>';
+        }
+      }
+      return str;
+    }(),
+    content: '<ul class="layui-layer-tabmain">'+ function(){
+      var len = tab.length, ii = 1, str = '';
+      if(len > 0){
+        str = '<li class="layui-layer-tabli '+ THIS +'">'+ (tab[0].content || 'no content') +'</li>';
+        for(; ii < len; ii++){
+          str += '<li class="layui-layer-tabli">'+ (tab[ii].content || 'no  content') +'</li>';
+        }
+      }
+      return str;
+    }() +'</ul>',
+    success: function(layero){
+      var btn = layero.find('.layui-layer-title').children();
+      var main = layero.find('.layui-layer-tabmain').children();
+      btn.on('mousedown', function(e){
+        e.stopPropagation ? e.stopPropagation() : e.cancelBubble = true;
+        var othis = $(this), index = othis.index();
+        othis.addClass(THIS).siblings().removeClass(THIS);
+        main.eq(index).show().siblings().hide();
+        typeof options.change === 'function' && options.change(index);
+      });
+      typeof success === 'function' && success(layero);
+    }
+  }, options));
+};
+
+//鐩稿唽灞�
+layer.photos = function(options, loop, key){
+  var dict = {};
+  options = options || {};
+  if(!options.photos) return;
+  var type = options.photos.constructor === Object;
+  var photos = type ? options.photos : {}, data = photos.data || [];
+  var start = photos.start || 0;
+  dict.imgIndex = (start|0) + 1;
+  
+  options.img = options.img || 'img';
+  
+  var success = options.success;
+  delete options.success;
+
+  if(!type){ //椤甸潰鐩存帴鑾峰彇
+    var parent = $(options.photos), pushData = function(){
+      data = [];
+      parent.find(options.img).each(function(index){
+        var othis = $(this);
+        othis.attr('layer-index', index);
+        data.push({
+          alt: othis.attr('alt'),
+          pid: othis.attr('layer-pid'),
+          src: othis.attr('layer-src') || othis.attr('src'),
+          thumb: othis.attr('src')
+        });
+      })
+    };
+    
+    pushData();
+    
+    if (data.length === 0) return;
+    
+    loop || parent.on('click', options.img, function(){
+      var othis = $(this), index = othis.attr('layer-index'); 
+      layer.photos($.extend(options, {
+        photos: {
+          start: index,
+          data: data,
+          tab: options.tab
+        },
+        full: options.full
+      }), true);
+      pushData();
+    })
+    
+    //涓嶇洿鎺ュ脊鍑�
+    if(!loop) return;
+    
+  } else if (data.length === 0){
+    return layer.msg('&#x6CA1;&#x6709;&#x56FE;&#x7247;');
+  }
+  
+  //涓婁竴寮�
+  dict.imgprev = function(key){
+    dict.imgIndex--;
+    if(dict.imgIndex < 1){
+      dict.imgIndex = data.length;
+    }
+    dict.tabimg(key);
+  };
+  
+  //涓嬩竴寮�
+  dict.imgnext = function(key,errorMsg){
+    dict.imgIndex++;
+    if(dict.imgIndex > data.length){
+      dict.imgIndex = 1;
+      if (errorMsg) {return};
+    }
+    dict.tabimg(key)
+  };
+  
+  //鏂瑰悜閿�
+  dict.keyup = function(event){
+    if(!dict.end){
+      var code = event.keyCode;
+      event.preventDefault();
+      if(code === 37){
+        dict.imgprev(true);
+      } else if(code === 39) {
+        dict.imgnext(true);
+      } else if(code === 27) {
+        layer.close(dict.index);
+      }
+    }
+  }
+  
+  //鍒囨崲
+  dict.tabimg = function(key){
+    if(data.length <= 1) return;
+    photos.start = dict.imgIndex - 1;
+    layer.close(dict.index);
+    return layer.photos(options, true, key);
+    setTimeout(function(){
+      layer.photos(options, true, key);
+    }, 200);
+  }
+  
+  //涓�浜涘姩浣�
+  dict.event = function(){
+    dict.bigimg.hover(function(){
+      dict.imgsee.show();
+    }, function(){
+      dict.imgsee.hide();
+    });
+    
+    dict.bigimg.find('.layui-layer-imgprev').on('click', function(event){
+      event.preventDefault();
+      dict.imgprev();
+    });  
+    
+    dict.bigimg.find('.layui-layer-imgnext').on('click', function(event){     
+      event.preventDefault();
+      dict.imgnext();
+    });
+    
+    $(document).on('keyup', dict.keyup);
+  };
+  
+  //鍥剧墖棰勫姞杞�
+  function loadImage(url, callback, error) {   
+    var img = new Image();
+    img.src = url; 
+    if(img.complete){
+      return callback(img);
+    }
+    img.onload = function(){
+      img.onload = null;
+      callback(img);
+    };
+    img.onerror = function(e){
+      img.onerror = null;
+      error(e);
+    };  
+  };
+  
+  dict.loadi = layer.load(1, {
+    shade: 'shade' in options ? false : 0.9,
+    scrollbar: false
+  });
+
+  loadImage(data[start].src, function(img){
+    layer.close(dict.loadi);
+    dict.index = layer.open($.extend({
+      type: 1,
+      id: 'layui-layer-photos',
+      area: function(){
+        var imgarea = [img.width, img.height];
+        var winarea = [$(window).width() - 100, $(window).height() - 100];
+        
+        //濡傛灉 瀹為檯鍥剧墖鐨勫鎴栬�呴珮姣� 灞忓箷澶э紙閭d箞杩涜缂╂斁锛�
+        if(!options.full && (imgarea[0]>winarea[0]||imgarea[1]>winarea[1])){
+          var wh = [imgarea[0]/winarea[0],imgarea[1]/winarea[1]];//鍙栧搴︾缉鏀炬瘮渚嬨�侀珮搴︾缉鏀炬瘮渚�
+          if(wh[0] > wh[1]){//鍙栫缉鏀炬瘮渚嬫渶澶х殑杩涜缂╂斁
+            imgarea[0] = imgarea[0]/wh[0];
+            imgarea[1] = imgarea[1]/wh[0];
+          } else if(wh[0] < wh[1]){
+            imgarea[0] = imgarea[0]/wh[1];
+            imgarea[1] = imgarea[1]/wh[1];
+          }
+        }
+        
+        return [imgarea[0]+'px', imgarea[1]+'px']; 
+      }(),
+      title: false,
+      shade: 0.9,
+      shadeClose: true,
+      closeBtn: false,
+      move: '.layui-layer-phimg img',
+      moveType: 1,
+      scrollbar: false,
+      moveOut: true,
+      //anim: Math.random()*5|0,
+      isOutAnim: false,
+      skin: 'layui-layer-photos' + skin('photos'),
+      content: '<div class="layui-layer-phimg">'
+        +'<img src="'+ data[start].src +'" alt="'+ (data[start].alt||'') +'" layer-pid="'+ data[start].pid +'">'
+        +'<div class="layui-layer-imgsee">'
+          +(data.length > 1 ? '<span class="layui-layer-imguide"><a href="javascript:;" class="layui-layer-iconext layui-layer-imgprev"></a><a href="javascript:;" class="layui-layer-iconext layui-layer-imgnext"></a></span>' : '')
+          +'<div class="layui-layer-imgbar" style="display:'+ (key ? 'block' : '') +'"><span class="layui-layer-imgtit"><a href="javascript:;">'+ (data[start].alt||'') +'</a><em>'+ dict.imgIndex +'/'+ data.length +'</em></span></div>'
+        +'</div>'
+      +'</div>',
+      success: function(layero, index){
+        dict.bigimg = layero.find('.layui-layer-phimg');
+        dict.imgsee = layero.find('.layui-layer-imguide,.layui-layer-imgbar');
+        dict.event(layero);
+        options.tab && options.tab(data[start], layero);
+        typeof success === 'function' && success(layero);
+      }, end: function(){
+        dict.end = true;
+        $(document).off('keyup', dict.keyup);
+      }
+    }, options));
+  }, function(){
+    layer.close(dict.loadi);
+    layer.msg('&#x5F53;&#x524D;&#x56FE;&#x7247;&#x5730;&#x5740;&#x5F02;&#x5E38;<br>&#x662F;&#x5426;&#x7EE7;&#x7EED;&#x67E5;&#x770B;&#x4E0B;&#x4E00;&#x5F20;&#xFF1F;', {
+      time: 30000, 
+      btn: ['&#x4E0B;&#x4E00;&#x5F20;', '&#x4E0D;&#x770B;&#x4E86;'], 
+      yes: function(){
+        data.length > 1 && dict.imgnext(true,true);
+      }
+    });
+  });
+};
+
+//涓诲叆鍙�
+ready.run = function(_$){
+  $ = _$;
+  win = $(window);
+  doms.html = $('html');
+  layer.open = function(deliver){
+    var o = new Class(deliver);
+    return o.index;
+  };
+};
+
+//鍔犺浇鏂瑰紡
+window.layui && layui.define ? (
+  layer.ready()
+  ,layui.define('jquery', function(exports){ //layui鍔犺浇
+    layer.path = layui.cache.dir;
+    ready.run(layui.$);
+
+    //鏆撮湶妯″潡
+    window.layer = layer;
+    exports('layer', layer);
+  })
+) : (
+  (typeof define === 'function' && define.amd) ? define(['jquery'], function(){ //requirejs鍔犺浇
+    ready.run(window.jQuery);
+    return layer;
+  }) : function(){ //鏅�歴cript鏍囩鍔犺浇
+    ready.run(window.jQuery);
+    layer.ready();
+  }()
+);
+
+}(window);
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/laypage.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/laypage.js
new file mode 100644
index 0000000..854aac9
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/laypage.js
@@ -0,0 +1,342 @@
+/**
+ 
+ @Name : layui.laypage 鍒嗛〉缁勪欢
+ @Author锛氳搐蹇�
+ @License锛歁IT
+ 
+ */
+
+layui.define(function(exports){
+  "use strict";
+  
+  var doc = document
+  ,id = 'getElementById'
+  ,tag = 'getElementsByTagName'
+  
+  //瀛楃甯搁噺
+  ,MOD_NAME = 'laypage', DISABLED = 'layui-disabled'
+  
+  //鏋勯�犲櫒
+  ,Class = function(options){
+    var that = this;
+    that.config = options || {};
+    that.config.index = ++laypage.index;
+    that.render(true);
+  };
+
+  //鍒ゆ柇浼犲叆鐨勫鍣ㄧ被鍨�
+  Class.prototype.type = function(){
+    var config = this.config;
+    if(typeof config.elem === 'object'){
+      return config.elem.length === undefined ? 2 : 3;
+    }
+  };
+
+  //鍒嗛〉瑙嗗浘
+  Class.prototype.view = function(){
+    var that = this
+    ,config = that.config
+    ,groups = config.groups = 'groups' in config ? (config.groups|0) : 5; //杩炵画椤电爜涓暟
+    
+    //鎺掔増
+    config.layout = typeof config.layout === 'object' 
+      ? config.layout 
+    : ['prev', 'page', 'next','refresh'];
+    
+    config.count = config.count|0; //鏁版嵁鎬绘暟
+    config.curr = (config.curr|0) || 1; //褰撳墠椤�
+
+    //姣忛〉鏉℃暟鐨勯�夋嫨椤�
+    config.limits = typeof config.limits === 'object'
+      ? config.limits
+    : [10, 20, 30, 40, 50];
+    config.limit = (config.limit|0) || 10; //榛樿鏉℃暟
+    
+    //鎬婚〉鏁�
+    config.pages = Math.ceil(config.count/config.limit) || 1;
+    
+    //褰撳墠椤典笉鑳借秴杩囨�婚〉鏁�
+    if(config.curr > config.pages){
+      config.curr = config.pages;
+    }
+    
+    //杩炵画鍒嗛〉涓暟涓嶈兘浣庝簬0涓斾笉鑳藉ぇ浜庢�婚〉鏁�
+    if(groups < 0){
+      groups = 1;
+    } else if (groups > config.pages){
+      groups = config.pages;
+    }
+    
+    config.prev = 'prev' in config ? config.prev : '&#x4E0A;&#x4E00;&#x9875;'; //涓婁竴椤垫枃鏈�
+    config.next = 'next' in config ? config.next : '&#x4E0B;&#x4E00;&#x9875;'; //涓嬩竴椤垫枃鏈�
+    
+    //璁$畻褰撳墠缁�
+    var index = config.pages > groups 
+      ? Math.ceil( (config.curr + (groups > 1 ? 1 : 0)) / (groups > 0 ? groups : 1) )
+    : 1
+    
+    //璇曞浘鐗囨
+    ,views = {
+      //涓婁竴椤�
+      prev: function(){
+        return config.prev 
+          ? '<a href="javascript:;" class="layui-laypage-prev'+ (config.curr == 1 ? (' ' + DISABLED) : '') +'" data-page="'+ (config.curr - 1) +'">'+ config.prev +'</a>'
+        : '';
+      }()
+      
+      //椤电爜
+      ,page: function(){
+        var pager = [];
+        
+        //鏁版嵁閲忎负0鏃讹紝涓嶈緭鍑洪〉鐮�
+        if(config.count < 1){
+          return '';
+        }
+        
+        //棣栭〉
+        if(index > 1 && config.first !== false && groups !== 0){
+          pager.push('<a href="javascript:;" class="layui-laypage-first" data-page="1"  title="&#x9996;&#x9875;">'+ (config.first || 1) +'</a>');
+        }
+
+        //璁$畻褰撳墠椤电爜缁勭殑璧峰椤�
+        var halve = Math.floor((groups-1)/2) //椤电爜鏁扮瓑鍒�
+        ,start = index > 1 ? config.curr - halve : 1
+        ,end = index > 1 ? (function(){
+          var max = config.curr + (groups - halve - 1);
+          return max > config.pages ? config.pages : max;
+        }()) : groups;
+        
+        //闃叉鏈�鍚庝竴缁勫嚭鐜扳�滀笉瑙勫畾鈥濈殑杩炵画椤电爜鏁�
+        if(end - start < groups - 1){
+          start = end - groups + 1;
+        }
+
+        //杈撳嚭宸﹀垎鍓茬
+        if(config.first !== false && start > 2){
+          pager.push('<span class="layui-laypage-spr">&#x2026;</span>')
+        }
+        
+        //杈撳嚭杩炵画椤电爜
+        for(; start <= end; start++){
+          if(start === config.curr){
+            //褰撳墠椤�
+            pager.push('<span class="layui-laypage-curr"><em class="layui-laypage-em" '+ (/^#/.test(config.theme) ? 'style="background-color:'+ config.theme +';"' : '') +'></em><em>'+ start +'</em></span>');
+          } else {
+            pager.push('<a href="javascript:;" data-page="'+ start +'">'+ start +'</a>');
+          }
+        }
+        
+        //杈撳嚭杈撳嚭鍙冲垎闅旂 & 鏈〉
+        if(config.pages > groups && config.pages > end && config.last !== false){
+          if(end + 1 < config.pages){
+            pager.push('<span class="layui-laypage-spr">&#x2026;</span>');
+          }
+          if(groups !== 0){
+            pager.push('<a href="javascript:;" class="layui-laypage-last" title="&#x5C3E;&#x9875;"  data-page="'+ config.pages +'">'+ (config.last || config.pages) +'</a>');
+          }
+        }
+
+        return pager.join('');
+      }()
+      
+      //涓嬩竴椤�
+      ,next: function(){
+        return config.next 
+          ? '<a href="javascript:;" class="layui-laypage-next'+ (config.curr == config.pages ? (' ' + DISABLED) : '') +'" data-page="'+ (config.curr + 1) +'">'+ config.next +'</a>'
+        : '';
+      }()
+      
+      //鏁版嵁鎬绘暟
+      ,count: '<span class="layui-laypage-count">鍏� '+ config.count +' 鏉�</span>'
+      
+      //姣忛〉鏉℃暟
+      ,limit: function(){
+        var options = ['<span class="layui-laypage-limits"><select lay-ignore>'];
+        layui.each(config.limits, function(index, item){
+          options.push(
+            '<option value="'+ item +'"'
+            +(item === config.limit ? 'selected' : '') 
+            +'>'+ item +' 鏉�/椤�</option>'
+          );
+        });
+        return options.join('') +'</select></span>';
+      }()
+      
+      //璺抽〉鍖哄煙
+      ,skip: function(){
+        return ['<span class="layui-laypage-skip">&#x5230;&#x7B2C;'
+          ,'<input type="text" min="1" value="'+ config.curr +'" class="layui-input">'
+          ,'&#x9875;<button type="button" class="layui-laypage-btn">&#x786e;&#x5b9a;</button>'
+        ,'</span>'].join('');
+      }()
+      ,refresh:function(){//鍒锋柊鍥炬爣
+           return '<span><button type="button" class="layui-btn-xs layui-icon"><i class="layui-icon-refresh-3"></i> </button></span>';
+      }()
+    };
+
+    return ['<div class="layui-box layui-laypage layui-laypage-'+ (config.theme ? (
+      /^#/.test(config.theme) ? 'molv' : config.theme
+    ) : 'default') +'" id="layui-laypage-'+ config.index +'">'
+      ,function(){
+        var plate = [];
+        layui.each(config.layout, function(index, item){
+          if(views[item]){
+            plate.push(views[item])
+          }
+        });
+        return plate.join('');
+      }()
+    ,'</div>'].join('');
+  };
+  Class.prototype.doRefresh = function(elem){
+
+  };
+  //璺抽〉鐨勫洖璋�
+  Class.prototype.jump = function(elem, isskip,canJump){
+    if(!elem) return;
+    var that = this
+    ,config = that.config
+    ,childs = elem.children
+    ,btn = elem[tag]('button')[0]
+    ,input = elem[tag]('input')[0]
+    ,select = elem[tag]('select')[0]
+    ,skip = function(){
+      var curr = input.value.replace(/\s|\D/g, '')|0;
+      if(curr){
+        config.beforePageIndex = config.curr;
+        config.curr = curr;
+        that.render();
+      }
+    };
+    
+    if(isskip) return skip();
+    
+    //椤电爜
+    for(var i = 0, len = childs.length; i < len; i++){
+      if(childs[i].nodeName.toLowerCase() === 'a'){
+        laypage.on(childs[i], 'click', function(){
+          var curr = this.getAttribute('data-page')|0;
+          if(curr < 1 || curr > config.pages) return;
+          if(!config.beforePageIndex){
+              config.beforePageIndex = 1;
+          }
+          if(config.jumpBefore && !config.jumpBefore(config,curr == 1)){
+              //璇存槑涓嶈兘璺宠浆锛屼繚鎸佸師鏍峰氨琛屼簡 weidy@2019-05-15
+              return false;
+          }else{
+            config.beforePageIndex = config.curr;
+            config.curr = curr;
+          }
+          that.render();
+        });
+      }
+    }
+    
+    //鏉℃暟
+    if(select){
+      laypage.on(select, 'change', function(){
+        if(config.jumpBefore && !config.jumpBefore(config,config.curr == 1)){
+          return ;//璇存槑涓嶈兘璺宠浆锛屼笉鎵ц涓嬮潰鐨勫唴瀹� weidy@2019-05-15
+        }
+        var value = this.value;
+        if(config.curr*value > config.count){
+          config.curr = Math.ceil(config.count/value);
+        }
+        config.limit = value;
+        that.render();
+      });
+    }
+    
+    //纭畾
+    if(btn){
+      laypage.on(btn, 'click', function(){
+        if(config.jumpBefore && !config.jumpBefore(config,false)){
+           return ;//璇存槑涓嶈兘璺宠浆锛屼笉鎵ц涓嬮潰鐨勫唴瀹� weidy@2019-05-15
+        }
+        skip();
+      });
+    }
+
+    //娣诲姞鍒锋柊鎸夐挳鐩戝惉 weidy
+    var refresh = elem[tag]('button');
+    if(refresh){
+       if(refresh.length == 1){
+           laypage.on(refresh[0],'click',function(){
+             that.render();
+           });
+       }else if(refresh.length > 1){
+           laypage.on(refresh[1],'click',function(){
+             that.render();
+           });
+       }
+    }
+  };
+  
+  //杈撳叆椤垫暟瀛楁帶鍒�
+  Class.prototype.skip = function(elem){
+    if(!elem) return;
+    var that = this, input = elem[tag]('input')[0];
+    if(!input) return;
+    laypage.on(input, 'keyup', function(e){
+      var value = this.value
+      ,keyCode = e.keyCode;
+      if(/^(37|38|39|40)$/.test(keyCode)) return;
+      if(/\D/.test(value)){
+        this.value = value.replace(/\D/, '');
+      }
+      if(that.config.jumpBefore && !that.config.jumpBefore(that.config,this.value*1 == 1)){
+        return ;//澧炲姞璺宠浆鍓嶇‘璁�
+      }
+      if(keyCode === 13){
+        that.jump(elem, true);
+      }
+    });
+  };
+
+  //娓叉煋鍒嗛〉
+  Class.prototype.render = function(load){
+    var that = this
+    ,config = that.config
+    ,type = that.type()
+    ,view = that.view();
+    
+    if(type === 2){
+      config.elem && (config.elem.innerHTML = view);
+    } else if(type === 3){
+      config.elem.html(view);
+    } else {
+      if(doc[id](config.elem)){
+        doc[id](config.elem).innerHTML = view;
+      }
+    }
+    config.jump && config.jump(config, load);
+    var elem = doc[id]('layui-laypage-' + config.index);
+    that.jump(elem);
+
+    if(config.hash && !load){
+      location.hash = '!'+ config.hash +'='+ config.curr;
+    }
+    
+    that.skip(elem);
+
+  };
+  
+  //澶栭儴鎺ュ彛
+  var laypage = {
+    //鍒嗛〉娓叉煋
+    render: function(options){
+      var o = new Class(options);
+      return o.index;
+    }
+    ,index: layui.laypage ? (layui.laypage.index + 10000) : 0
+    ,on: function(elem, even, fn){
+      elem.attachEvent ? elem.attachEvent('on'+ even, function(e){ //for ie
+        e.target = e.srcElement;
+        fn.call(elem, e);
+      }) : elem.addEventListener(even, fn, false);
+      return this;
+    }
+  }
+
+  exports(MOD_NAME, laypage);
+});
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/laytpl.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/laytpl.js
new file mode 100644
index 0000000..9e91d96
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/laytpl.js
@@ -0,0 +1,123 @@
+锘�/**
+ 
+ @Name : layui.laytpl 妯℃澘寮曟搸
+ @Author锛氳搐蹇�
+ @License锛歁IT
+ 
+ */
+
+layui.define(function(exports){
+
+  "use strict";
+
+  var config = {
+    open: '{{',
+    close: '}}'
+  };
+
+  var tool = {
+    exp: function(str){
+      return new RegExp(str, 'g');
+    },
+    //鍖归厤婊¤冻瑙勫垯鍐呭
+    query: function(type, _, __){
+      var types = [
+        '#([\\s\\S])+?',   //js璇彞
+        '([^{#}])*?' //鏅�氬瓧娈�
+      ][type || 0];
+      return exp((_||'') + config.open + types + config.close + (__||''));
+    },   
+    escape: function(html){
+      return String(html||'').replace(/&(?!#?[a-zA-Z0-9]+;)/g, '&amp;')
+      .replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/'/g, '&#39;').replace(/"/g, '&quot;');
+    },
+    error: function(e, tplog){
+      var error = 'Laytpl Error锛�';
+      typeof console === 'object' && console.error(error + e + '\n'+ (tplog || ''));
+      return error + e;
+    }
+  };
+
+  var exp = tool.exp, Tpl = function(tpl){
+    this.tpl = tpl;
+  };
+
+  Tpl.pt = Tpl.prototype;
+
+  window.errors = 0;
+
+  //缂栬瘧妯$増
+  Tpl.pt.parse = function(tpl, data){
+    var that = this, tplog = tpl;
+    var jss = exp('^'+config.open+'#', ''), jsse = exp(config.close+'$', '');
+    
+    tpl = tpl.replace(/\s+|\r|\t|\n/g, ' ')
+    .replace(exp(config.open+'#'), config.open+'# ')
+    .replace(exp(config.close+'}'), '} '+config.close).replace(/\\/g, '\\\\')
+    
+    //涓嶅尮閰嶆寚瀹氬尯鍩熺殑鍐呭
+    .replace(exp(config.open + '!(.+?)!' + config.close), function(str){
+      str = str.replace(exp('^'+ config.open + '!'), '')
+      .replace(exp('!'+ config.close), '')
+      .replace(exp(config.open + '|' + config.close), function(tag){
+        return tag.replace(/(.)/g, '\\$1')
+      });
+      return str
+    })
+    
+    //鍖归厤JS瑙勫垯鍐呭
+    .replace(/(?="|')/g, '\\').replace(tool.query(), function(str){
+      str = str.replace(jss, '').replace(jsse, '');
+      return '";' + str.replace(/\\/g, '') + ';view+="';
+    })
+    
+    //鍖归厤鏅�氬瓧娈�
+    .replace(tool.query(1), function(str){
+      var start = '"+(';
+      if(str.replace(/\s/g, '') === config.open+config.close){
+        return '';
+      }
+      str = str.replace(exp(config.open+'|'+config.close), '');
+      if(/^=/.test(str)){
+        str = str.replace(/^=/, '');
+        start = '"+_escape_(';
+      }
+      return start + str.replace(/\\/g, '') + ')+"';
+    });
+    
+    tpl = '"use strict";var view = "' + tpl + '";return view;';
+
+    try{
+      that.cache = tpl = new Function('d, _escape_', tpl);
+      return tpl(data, tool.escape);
+    } catch(e){
+      delete that.cache;
+      return tool.error(e, tplog);
+    }
+  };
+
+  Tpl.pt.render = function(data, callback){
+    var that = this, tpl;
+    if(!data) return tool.error('no data');
+    tpl = that.cache ? that.cache(data, tool.escape) : that.parse(that.tpl, data);
+    if(!callback) return tpl;
+    callback(tpl);
+  };
+
+  var laytpl = function(tpl){
+    if(typeof tpl !== 'string') return tool.error('Template not found');
+    return new Tpl(tpl);
+  };
+
+  laytpl.config = function(options){
+    options = options || {};
+    for(var i in options){
+      config[i] = options[i];
+    }
+  };
+
+  laytpl.v = '1.2.0';
+  
+  exports('laytpl', laytpl);
+
+});
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/mobile.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/mobile.js
new file mode 100644
index 0000000..e6f0016
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/mobile.js
@@ -0,0 +1,30 @@
+/**
+
+ @Name锛歭ayui 绉诲姩妯″潡鍏ュ彛 | 鏋勫缓鍚庡垯涓虹Щ鍔ㄦā鍧楅泦鍚�
+ @Author锛氳搐蹇�
+ @License锛歁IT
+    
+ */
+
+ 
+if(!layui['layui.mobile']){
+  layui.config({
+    base: layui.cache.dir + 'lay/modules/mobile/'
+  }).extend({
+    'layer-mobile': 'layer-mobile'
+    ,'zepto': 'zepto'
+    ,'upload-mobile': 'upload-mobile'
+    ,'layim-mobile': 'layim-mobile'
+  });
+}  
+
+layui.define([
+  'layer-mobile'
+  ,'zepto'
+  ,'layim-mobile'
+], function(exports){
+  exports('mobile', {
+    layer: layui['layer-mobile'] //寮瑰眰
+    ,layim: layui['layim-mobile'] //WebIM
+  });
+});
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/mobile/layer-mobile.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/mobile/layer-mobile.js
new file mode 100644
index 0000000..1b9ff1f
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/mobile/layer-mobile.js
@@ -0,0 +1,189 @@
+/*!
+
+ @Name锛歭ayer mobile v2.0.0 寮瑰眰缁勪欢绉诲姩鐗�
+ @Author锛氳搐蹇�
+ @Site锛歨ttp://layer.layui.com/mobie/
+ @License锛歁IT
+    
+ */
+
+layui.define(function(exports){
+  
+  "use strict";
+
+  var win = window, doc = document, query = 'querySelectorAll', claname = 'getElementsByClassName', S = function(s){
+    return doc[query](s);
+  };
+
+  //榛樿閰嶇疆
+  var config = {
+    type: 0
+    ,shade: true
+    ,shadeClose: true
+    ,fixed: true
+    ,anim: 'scale' //榛樿鍔ㄧ敾绫诲瀷
+  };
+
+  var ready = {
+    extend: function(obj){
+      var newobj = JSON.parse(JSON.stringify(config));
+      for(var i in obj){
+        newobj[i] = obj[i];
+      }
+      return newobj;
+    }, 
+    timer: {}, end: {}
+  };
+
+  //鐐硅Е浜嬩欢
+  ready.touch = function(elem, fn){
+    elem.addEventListener('click', function(e){
+      fn.call(this, e);
+    }, false);
+  };
+
+  var index = 0, classs = ['layui-m-layer'], Layer = function(options){
+    var that = this;
+    that.config = ready.extend(options);
+    that.view();
+  };
+
+  Layer.prototype.view = function(){
+    var that = this, config = that.config, layerbox = doc.createElement('div');
+
+    that.id = layerbox.id = classs[0] + index;
+    layerbox.setAttribute('class', classs[0] + ' ' + classs[0]+(config.type || 0));
+    layerbox.setAttribute('index', index);
+    
+    //鏍囬鍖哄煙
+    var title = (function(){
+      var titype = typeof config.title === 'object';
+      return config.title
+      ? '<h3 style="'+ (titype ? config.title[1] : '') +'">'+ (titype ? config.title[0] : config.title)  +'</h3>'
+      : '';
+    }());
+    
+    //鎸夐挳鍖哄煙
+    var button = (function(){
+      typeof config.btn === 'string' && (config.btn = [config.btn]);
+      var btns = (config.btn || []).length, btndom;
+      if(btns === 0 || !config.btn){
+        return '';
+      }
+      btndom = '<span yes type="1">'+ config.btn[0] +'</span>'
+      if(btns === 2){
+        btndom = '<span no type="0">'+ config.btn[1] +'</span>' + btndom;
+      }
+      return '<div class="layui-m-layerbtn">'+ btndom + '</div>';
+    }());
+    
+    if(!config.fixed){
+      config.top = config.hasOwnProperty('top') ?  config.top : 100;
+      config.style = config.style || '';
+      config.style += ' top:'+ ( doc.body.scrollTop + config.top) + 'px';
+    }
+    
+    if(config.type === 2){
+      config.content = '<i></i><i class="layui-m-layerload"></i><i></i><p>'+ (config.content||'') +'</p>';
+    }
+    
+    if(config.skin) config.anim = 'up';
+    if(config.skin === 'msg') config.shade = false;
+    
+    layerbox.innerHTML = (config.shade ? '<div '+ (typeof config.shade === 'string' ? 'style="'+ config.shade +'"' : '') +' class="layui-m-layershade"></div>' : '')
+    +'<div class="layui-m-layermain" '+ (!config.fixed ? 'style="position:static;"' : '') +'>'
+      +'<div class="layui-m-layersection">'
+        +'<div class="layui-m-layerchild '+ (config.skin ? 'layui-m-layer-' + config.skin + ' ' : '') + (config.className ? config.className : '') + ' ' + (config.anim ? 'layui-m-anim-' + config.anim : '') +'" ' + ( config.style ? 'style="'+config.style+'"' : '' ) +'>'
+          + title
+          +'<div class="layui-m-layercont">'+ config.content +'</div>'
+          + button
+        +'</div>'
+      +'</div>'
+    +'</div>';
+    
+    if(!config.type || config.type === 2){
+      var dialogs = doc[claname](classs[0] + config.type), dialen = dialogs.length;
+      if(dialen >= 1){
+        layer.close(dialogs[0].getAttribute('index'))
+      }
+    }
+    
+    document.body.appendChild(layerbox);
+    var elem = that.elem = S('#'+that.id)[0];
+    config.success && config.success(elem);
+    
+    that.index = index++;
+    that.action(config, elem);
+  };
+
+  Layer.prototype.action = function(config, elem){
+    var that = this;
+    
+    //鑷姩鍏抽棴
+    if(config.time){
+      ready.timer[that.index] = setTimeout(function(){
+        layer.close(that.index);
+      }, config.time*1000);
+    }
+    
+    //纭鍙栨秷
+    var btn = function(){
+      var type = this.getAttribute('type');
+      if(type == 0){
+        config.no && config.no();
+        layer.close(that.index);
+      } else {
+        config.yes ? config.yes(that.index) : layer.close(that.index);
+      }
+    };
+    if(config.btn){
+      var btns = elem[claname]('layui-m-layerbtn')[0].children, btnlen = btns.length;
+      for(var ii = 0; ii < btnlen; ii++){
+        ready.touch(btns[ii], btn);
+      }
+    }
+    
+    //鐐归伄缃╁叧闂�
+    if(config.shade && config.shadeClose){
+      var shade = elem[claname]('layui-m-layershade')[0];
+      ready.touch(shade, function(){
+        layer.close(that.index, config.end);
+      });
+    }
+
+    config.end && (ready.end[that.index] = config.end);
+  };
+
+  var layer = {
+    v: '2.0 m',
+    index: index,
+    
+    //鏍稿績鏂规硶
+    open: function(options){
+      var o = new Layer(options || {});
+      return o.index;
+    },
+    
+    close: function(index){
+      var ibox = S('#'+classs[0]+index)[0];
+      if(!ibox) return;
+      ibox.innerHTML = '';
+      doc.body.removeChild(ibox);
+      clearTimeout(ready.timer[index]);
+      delete ready.timer[index];
+      typeof ready.end[index] === 'function' && ready.end[index]();
+      delete ready.end[index];
+    },
+    
+    //鍏抽棴鎵�鏈塴ayer灞�
+    closeAll: function(){
+      var boxs = doc[claname](classs[0]);
+      for(var i = 0, len = boxs.length; i < len; i++){
+        layer.close((boxs[0].getAttribute('index')|0));
+      }
+    }
+  };
+
+  exports('layer-mobile', layer);
+
+});
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/mobile/layim-mobile-open.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/mobile/layim-mobile-open.js
new file mode 100644
index 0000000..bd623c5
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/mobile/layim-mobile-open.js
@@ -0,0 +1,11 @@
+/**
+
+ @Name锛歭ayim mobile 寮�婧愬寘
+ @Author锛氳搐蹇�
+ @License锛歁IT
+    
+ */
+ 
+layui.define(function(exports){
+  exports('layim-mobile', layui.v);
+});
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/mobile/upload-mobile.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/mobile/upload-mobile.js
new file mode 100644
index 0000000..4f4ac7a
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/mobile/upload-mobile.js
@@ -0,0 +1,166 @@
+/*!
+
+ @Title: layui.upload 鍗曟枃浠朵笂浼� - 鍏ㄦ祻瑙堝櫒鍏煎鐗�
+ @Author: 璐ゅ績
+ @License锛歁IT
+
+ */
+ 
+layui.define(['layer-mobile', 'zepto'] , function(exports){
+  "use strict";
+  
+  var $ = layui.zepto;
+  var layer = layui['layer-mobile'];
+  var device = layui.device();
+  
+  var elemDragEnter = 'layui-upload-enter';
+  var elemIframe = 'layui-upload-iframe';
+ 
+  var msgConf = {
+    icon: 2
+    ,shift: 6
+  }, fileType = {
+    file: '鏂囦欢'
+    ,video: '瑙嗛'
+    ,audio: '闊抽'
+  };
+  
+  layer.msg = function(content){
+    return layer.open({
+      content: content || ''
+      ,skin: 'msg'
+      ,time: 2 //2绉掑悗鑷姩鍏抽棴
+    });
+  };
+  
+  var Upload = function(options){
+    this.options = options;
+  };
+  
+  //鍒濆鍖栨覆鏌�
+  Upload.prototype.init = function(){
+    var that = this, options = that.options;
+    var body = $('body'), elem = $(options.elem || '.layui-upload-file');
+    var iframe = $('<iframe id="'+ elemIframe +'" class="'+ elemIframe +'" name="'+ elemIframe +'"></iframe>');
+    
+    //鎻掑叆iframe    
+    $('#'+elemIframe)[0] || body.append(iframe);
+    
+    return elem.each(function(index, item){
+      item = $(item);
+      var form = '<form target="'+ elemIframe +'" method="'+ (options.method||'post') +'" key="set-mine" enctype="multipart/form-data" action="'+ (options.url||'') +'"></form>';
+      
+      var type = item.attr('lay-type') || options.type; //鑾峰彇鏂囦欢绫诲瀷
+
+      //鍖呰9ui鍏冪礌
+      if(!options.unwrap){
+        form = '<div class="layui-box layui-upload-button">' + form + '<span class="layui-upload-icon"><i class="layui-icon">&#xe608;</i>'+ (
+          item.attr('lay-title') || options.title|| ('涓婁紶'+ (fileType[type]||'鍥剧墖') )
+        ) +'</span></div>';
+      }
+      
+      form = $(form);
+      
+      //鎷栨嫿鏀寔
+      if(!options.unwrap){
+        form.on('dragover', function(e){
+          e.preventDefault();
+          $(this).addClass(elemDragEnter);
+        }).on('dragleave', function(){
+          $(this).removeClass(elemDragEnter);
+        }).on('drop', function(){
+          $(this).removeClass(elemDragEnter);
+        });
+      }
+      
+      //濡傛灉宸茬粡瀹炰緥鍖栵紝鍒欑Щ闄ゅ寘瑁瑰厓绱�
+      if(item.parent('form').attr('target') === elemIframe){
+        if(options.unwrap){
+          item.unwrap();
+        } else {
+          item.parent().next().remove();
+          item.unwrap().unwrap();
+        }
+      };
+      
+      //鍖呰9鍏冪礌
+      item.wrap(form);
+      
+      //瑙﹀彂涓婁紶
+      item.off('change').on('change', function(){
+        that.action(this, type);
+      });
+    });
+  };
+  
+  //鎻愪氦涓婁紶
+  Upload.prototype.action = function(input, type){
+    var that = this, options = that.options, val = input.value;
+    var item = $(input), ext = item.attr('lay-ext') || options.ext || ''; //鑾峰彇鏀寔涓婁紶鐨勬枃浠舵墿灞曞悕;
+
+    if(!val){
+      return;
+    };
+    
+    //鏍¢獙鏂囦欢
+    switch(type){
+      case 'file': //涓�鑸枃浠�
+        if(ext && !RegExp('\\w\\.('+ ext +')$', 'i').test(escape(val))){
+          layer.msg('涓嶆敮鎸佽鏂囦欢鏍煎紡', msgConf);
+          return input.value = '';
+        }
+      break;
+      case 'video': //瑙嗛鏂囦欢
+        if(!RegExp('\\w\\.('+ (ext||'avi|mp4|wma|rmvb|rm|flash|3gp|flv') +')$', 'i').test(escape(val))){
+          layer.msg('涓嶆敮鎸佽瑙嗛鏍煎紡', msgConf);
+          return input.value = '';
+        }
+      break;
+      case 'audio': //闊抽鏂囦欢
+        if(!RegExp('\\w\\.('+ (ext||'mp3|wav|mid') +')$', 'i').test(escape(val))){
+          layer.msg('涓嶆敮鎸佽闊抽鏍煎紡', msgConf);
+          return input.value = '';
+        }
+      break;
+      default: //鍥剧墖鏂囦欢
+        if(!RegExp('\\w\\.('+ (ext||'jpg|png|gif|bmp|jpeg') +')$', 'i').test(escape(val))){
+          layer.msg('涓嶆敮鎸佽鍥剧墖鏍煎紡', msgConf);
+          return input.value = '';
+        }
+      break;
+    }
+    
+    options.before && options.before(input);
+    item.parent().submit();
+
+    var iframe = $('#'+elemIframe), timer = setInterval(function() {
+      var res;
+      try {
+        res = iframe.contents().find('body').text();
+      } catch(e) {
+        layer.msg('涓婁紶鎺ュ彛瀛樺湪璺ㄥ煙', msgConf);
+        clearInterval(timer);
+      }
+      if(res){
+        clearInterval(timer);
+        iframe.contents().find('body').html('');
+        try {
+          res = JSON.parse(res);
+        } catch(e){
+          res = {};
+          return layer.msg('璇峰涓婁紶鎺ュ彛杩斿洖JSON瀛楃', msgConf);
+        }
+        typeof options.success === 'function' && options.success(res, input);
+      }
+    }, 30); 
+    
+    input.value = '';
+  };
+  
+  //鏆撮湶鎺ュ彛
+  exports('upload-mobile', function(options){
+    var upload = new Upload(options = options || {});
+    upload.init();
+  });
+});
+
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/mobile/zepto.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/mobile/zepto.js
new file mode 100644
index 0000000..fe2e8ea
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/mobile/zepto.js
@@ -0,0 +1,1646 @@
+/* Zepto v1.2.0 - zepto event ajax form ie - zeptojs.com/license */
+
+layui.define(function(exports){
+  
+  var Zepto = (function() {
+  var undefined, key, $, classList, emptyArray = [], concat = emptyArray.concat, filter = emptyArray.filter, slice = emptyArray.slice,
+    document = window.document,
+    elementDisplay = {}, classCache = {},
+    cssNumber = { 'column-count': 1, 'columns': 1, 'font-weight': 1, 'line-height': 1,'opacity': 1, 'z-index': 1, 'zoom': 1 },
+    fragmentRE = /^\s*<(\w+|!)[^>]*>/,
+    singleTagRE = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
+    tagExpanderRE = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
+    rootNodeRE = /^(?:body|html)$/i,
+    capitalRE = /([A-Z])/g,
+
+    // special attributes that should be get/set via method calls
+    methodAttributes = ['val', 'css', 'html', 'text', 'data', 'width', 'height', 'offset'],
+
+    adjacencyOperators = [ 'after', 'prepend', 'before', 'append' ],
+    table = document.createElement('table'),
+    tableRow = document.createElement('tr'),
+    containers = {
+      'tr': document.createElement('tbody'),
+      'tbody': table, 'thead': table, 'tfoot': table,
+      'td': tableRow, 'th': tableRow,
+      '*': document.createElement('div')
+    },
+    readyRE = /complete|loaded|interactive/,
+    simpleSelectorRE = /^[\w-]*$/,
+    class2type = {},
+    toString = class2type.toString,
+    zepto = {},
+    camelize, uniq,
+    tempParent = document.createElement('div'),
+    propMap = {
+      'tabindex': 'tabIndex',
+      'readonly': 'readOnly',
+      'for': 'htmlFor',
+      'class': 'className',
+      'maxlength': 'maxLength',
+      'cellspacing': 'cellSpacing',
+      'cellpadding': 'cellPadding',
+      'rowspan': 'rowSpan',
+      'colspan': 'colSpan',
+      'usemap': 'useMap',
+      'frameborder': 'frameBorder',
+      'contenteditable': 'contentEditable'
+    },
+    isArray = Array.isArray ||
+      function(object){ return object instanceof Array }
+
+  zepto.matches = function(element, selector) {
+    if (!selector || !element || element.nodeType !== 1) return false
+    var matchesSelector = element.matches || element.webkitMatchesSelector ||
+                          element.mozMatchesSelector || element.oMatchesSelector ||
+                          element.matchesSelector
+    if (matchesSelector) return matchesSelector.call(element, selector)
+    // fall back to performing a selector:
+    var match, parent = element.parentNode, temp = !parent
+    if (temp) (parent = tempParent).appendChild(element)
+    match = ~zepto.qsa(parent, selector).indexOf(element)
+    temp && tempParent.removeChild(element)
+    return match
+  }
+
+  function type(obj) {
+    return obj == null ? String(obj) :
+      class2type[toString.call(obj)] || "object"
+  }
+
+  function isFunction(value) { return type(value) == "function" }
+  function isWindow(obj)     { return obj != null && obj == obj.window }
+  function isDocument(obj)   { return obj != null && obj.nodeType == obj.DOCUMENT_NODE }
+  function isObject(obj)     { return type(obj) == "object" }
+  function isPlainObject(obj) {
+    return isObject(obj) && !isWindow(obj) && Object.getPrototypeOf(obj) == Object.prototype
+  }
+
+  function likeArray(obj) {
+    var length = !!obj && 'length' in obj && obj.length,
+      type = $.type(obj)
+
+    return 'function' != type && !isWindow(obj) && (
+      'array' == type || length === 0 ||
+        (typeof length == 'number' && length > 0 && (length - 1) in obj)
+    )
+  }
+
+  function compact(array) { return filter.call(array, function(item){ return item != null }) }
+  function flatten(array) { return array.length > 0 ? $.fn.concat.apply([], array) : array }
+  camelize = function(str){ return str.replace(/-+(.)?/g, function(match, chr){ return chr ? chr.toUpperCase() : '' }) }
+  function dasherize(str) {
+    return str.replace(/::/g, '/')
+           .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2')
+           .replace(/([a-z\d])([A-Z])/g, '$1_$2')
+           .replace(/_/g, '-')
+           .toLowerCase()
+  }
+  uniq = function(array){ return filter.call(array, function(item, idx){ return array.indexOf(item) == idx }) }
+
+  function classRE(name) {
+    return name in classCache ?
+      classCache[name] : (classCache[name] = new RegExp('(^|\\s)' + name + '(\\s|$)'))
+  }
+
+  function maybeAddPx(name, value) {
+    return (typeof value == "number" && !cssNumber[dasherize(name)]) ? value + "px" : value
+  }
+
+  function defaultDisplay(nodeName) {
+    var element, display
+    if (!elementDisplay[nodeName]) {
+      element = document.createElement(nodeName)
+      document.body.appendChild(element)
+      display = getComputedStyle(element, '').getPropertyValue("display")
+      element.parentNode.removeChild(element)
+      display == "none" && (display = "block")
+      elementDisplay[nodeName] = display
+    }
+    return elementDisplay[nodeName]
+  }
+
+  function children(element) {
+    return 'children' in element ?
+      slice.call(element.children) :
+      $.map(element.childNodes, function(node){ if (node.nodeType == 1) return node })
+  }
+
+  function Z(dom, selector) {
+    var i, len = dom ? dom.length : 0
+    for (i = 0; i < len; i++) this[i] = dom[i]
+    this.length = len
+    this.selector = selector || ''
+  }
+
+  // `$.zepto.fragment` takes a html string and an optional tag name
+  // to generate DOM nodes from the given html string.
+  // The generated DOM nodes are returned as an array.
+  // This function can be overridden in plugins for example to make
+  // it compatible with browsers that don't support the DOM fully.
+  zepto.fragment = function(html, name, properties) {
+    var dom, nodes, container
+
+    // A special case optimization for a single tag
+    if (singleTagRE.test(html)) dom = $(document.createElement(RegExp.$1))
+
+    if (!dom) {
+      if (html.replace) html = html.replace(tagExpanderRE, "<$1></$2>")
+      if (name === undefined) name = fragmentRE.test(html) && RegExp.$1
+      if (!(name in containers)) name = '*'
+
+      container = containers[name]
+      container.innerHTML = '' + html
+      dom = $.each(slice.call(container.childNodes), function(){
+        container.removeChild(this)
+      })
+    }
+
+    if (isPlainObject(properties)) {
+      nodes = $(dom)
+      $.each(properties, function(key, value) {
+        if (methodAttributes.indexOf(key) > -1) nodes[key](value)
+        else nodes.attr(key, value)
+      })
+    }
+
+    return dom
+  }
+
+  // `$.zepto.Z` swaps out the prototype of the given `dom` array
+  // of nodes with `$.fn` and thus supplying all the Zepto functions
+  // to the array. This method can be overridden in plugins.
+  zepto.Z = function(dom, selector) {
+    return new Z(dom, selector)
+  }
+
+  // `$.zepto.isZ` should return `true` if the given object is a Zepto
+  // collection. This method can be overridden in plugins.
+  zepto.isZ = function(object) {
+    return object instanceof zepto.Z
+  }
+
+  // `$.zepto.init` is Zepto's counterpart to jQuery's `$.fn.init` and
+  // takes a CSS selector and an optional context (and handles various
+  // special cases).
+  // This method can be overridden in plugins.
+  zepto.init = function(selector, context) {
+    var dom
+    // If nothing given, return an empty Zepto collection
+    if (!selector) return zepto.Z()
+    // Optimize for string selectors
+    else if (typeof selector == 'string') {
+      selector = selector.trim()
+      // If it's a html fragment, create nodes from it
+      // Note: In both Chrome 21 and Firefox 15, DOM error 12
+      // is thrown if the fragment doesn't begin with <
+      if (selector[0] == '<' && fragmentRE.test(selector))
+        dom = zepto.fragment(selector, RegExp.$1, context), selector = null
+      // If there's a context, create a collection on that context first, and select
+      // nodes from there
+      else if (context !== undefined) return $(context).find(selector)
+      // If it's a CSS selector, use it to select nodes.
+      else dom = zepto.qsa(document, selector)
+    }
+    // If a function is given, call it when the DOM is ready
+    else if (isFunction(selector)) return $(document).ready(selector)
+    // If a Zepto collection is given, just return it
+    else if (zepto.isZ(selector)) return selector
+    else {
+      // normalize array if an array of nodes is given
+      if (isArray(selector)) dom = compact(selector)
+      // Wrap DOM nodes.
+      else if (isObject(selector))
+        dom = [selector], selector = null
+      // If it's a html fragment, create nodes from it
+      else if (fragmentRE.test(selector))
+        dom = zepto.fragment(selector.trim(), RegExp.$1, context), selector = null
+      // If there's a context, create a collection on that context first, and select
+      // nodes from there
+      else if (context !== undefined) return $(context).find(selector)
+      // And last but no least, if it's a CSS selector, use it to select nodes.
+      else dom = zepto.qsa(document, selector)
+    }
+    // create a new Zepto collection from the nodes found
+    return zepto.Z(dom, selector)
+  }
+
+  // `$` will be the index `Zepto` object. When calling this
+  // function just call `$.zepto.init, which makes the implementation
+  // details of selecting nodes and creating Zepto collections
+  // patchable in plugins.
+  $ = function(selector, context){
+    return zepto.init(selector, context)
+  }
+
+  function extend(target, source, deep) {
+    for (key in source)
+      if (deep && (isPlainObject(source[key]) || isArray(source[key]))) {
+        if (isPlainObject(source[key]) && !isPlainObject(target[key]))
+          target[key] = {}
+        if (isArray(source[key]) && !isArray(target[key]))
+          target[key] = []
+        extend(target[key], source[key], deep)
+      }
+      else if (source[key] !== undefined) target[key] = source[key]
+  }
+
+  // Copy all but undefined properties from one or more
+  // objects to the `target` object.
+  $.extend = function(target){
+    var deep, args = slice.call(arguments, 1)
+    if (typeof target == 'boolean') {
+      deep = target
+      target = args.shift()
+    }
+    args.forEach(function(arg){ extend(target, arg, deep) })
+    return target
+  }
+
+  // `$.zepto.qsa` is Zepto's CSS selector implementation which
+  // uses `document.querySelectorAll` and optimizes for some special cases, like `#id`.
+  // This method can be overridden in plugins.
+  zepto.qsa = function(element, selector){
+    var found,
+        maybeID = selector[0] == '#',
+        maybeClass = !maybeID && selector[0] == '.',
+        nameOnly = maybeID || maybeClass ? selector.slice(1) : selector, // Ensure that a 1 char tag name still gets checked
+        isSimple = simpleSelectorRE.test(nameOnly)
+    return (element.getElementById && isSimple && maybeID) ? // Safari DocumentFragment doesn't have getElementById
+      ( (found = element.getElementById(nameOnly)) ? [found] : [] ) :
+      (element.nodeType !== 1 && element.nodeType !== 9 && element.nodeType !== 11) ? [] :
+      slice.call(
+        isSimple && !maybeID && element.getElementsByClassName ? // DocumentFragment doesn't have getElementsByClassName/TagName
+          maybeClass ? element.getElementsByClassName(nameOnly) : // If it's simple, it could be a class
+          element.getElementsByTagName(selector) : // Or a tag
+          element.querySelectorAll(selector) // Or it's not simple, and we need to query all
+      )
+  }
+
+  function filtered(nodes, selector) {
+    return selector == null ? $(nodes) : $(nodes).filter(selector)
+  }
+
+  $.contains = document.documentElement.contains ?
+    function(parent, node) {
+      return parent !== node && parent.contains(node)
+    } :
+    function(parent, node) {
+      while (node && (node = node.parentNode))
+        if (node === parent) return true
+      return false
+    }
+
+  function funcArg(context, arg, idx, payload) {
+    return isFunction(arg) ? arg.call(context, idx, payload) : arg
+  }
+
+  function setAttribute(node, name, value) {
+    value == null ? node.removeAttribute(name) : node.setAttribute(name, value)
+  }
+
+  // access className property while respecting SVGAnimatedString
+  function className(node, value){
+    var klass = node.className || '',
+        svg   = klass && klass.baseVal !== undefined
+
+    if (value === undefined) return svg ? klass.baseVal : klass
+    svg ? (klass.baseVal = value) : (node.className = value)
+  }
+
+  // "true"  => true
+  // "false" => false
+  // "null"  => null
+  // "42"    => 42
+  // "42.5"  => 42.5
+  // "08"    => "08"
+  // JSON    => parse if valid
+  // String  => self
+  function deserializeValue(value) {
+    try {
+      return value ?
+        value == "true" ||
+        ( value == "false" ? false :
+          value == "null" ? null :
+          +value + "" == value ? +value :
+          /^[\[\{]/.test(value) ? $.parseJSON(value) :
+          value )
+        : value
+    } catch(e) {
+      return value
+    }
+  }
+
+  $.type = type
+  $.isFunction = isFunction
+  $.isWindow = isWindow
+  $.isArray = isArray
+  $.isPlainObject = isPlainObject
+
+  $.isEmptyObject = function(obj) {
+    var name
+    for (name in obj) return false
+    return true
+  }
+
+  $.isNumeric = function(val) {
+    var num = Number(val), type = typeof val
+    return val != null && type != 'boolean' &&
+      (type != 'string' || val.length) &&
+      !isNaN(num) && isFinite(num) || false
+  }
+
+  $.inArray = function(elem, array, i){
+    return emptyArray.indexOf.call(array, elem, i)
+  }
+
+  $.camelCase = camelize
+  $.trim = function(str) {
+    return str == null ? "" : String.prototype.trim.call(str)
+  }
+
+  // plugin compatibility
+  $.uuid = 0
+  $.support = { }
+  $.expr = { }
+  $.noop = function() {}
+
+  $.map = function(elements, callback){
+    var value, values = [], i, key
+    if (likeArray(elements))
+      for (i = 0; i < elements.length; i++) {
+        value = callback(elements[i], i)
+        if (value != null) values.push(value)
+      }
+    else
+      for (key in elements) {
+        value = callback(elements[key], key)
+        if (value != null) values.push(value)
+      }
+    return flatten(values)
+  }
+
+  $.each = function(elements, callback){
+    var i, key
+    if (likeArray(elements)) {
+      for (i = 0; i < elements.length; i++)
+        if (callback.call(elements[i], i, elements[i]) === false) return elements
+    } else {
+      for (key in elements)
+        if (callback.call(elements[key], key, elements[key]) === false) return elements
+    }
+
+    return elements
+  }
+
+  $.grep = function(elements, callback){
+    return filter.call(elements, callback)
+  }
+
+  if (window.JSON) $.parseJSON = JSON.parse
+
+  // Populate the class2type map
+  $.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
+    class2type[ "[object " + name + "]" ] = name.toLowerCase()
+  })
+
+  // Define methods that will be available on all
+  // Zepto collections
+  $.fn = {
+    constructor: zepto.Z,
+    length: 0,
+
+    // Because a collection acts like an array
+    // copy over these useful array functions.
+    forEach: emptyArray.forEach,
+    reduce: emptyArray.reduce,
+    push: emptyArray.push,
+    sort: emptyArray.sort,
+    splice: emptyArray.splice,
+    indexOf: emptyArray.indexOf,
+    concat: function(){
+      var i, value, args = []
+      for (i = 0; i < arguments.length; i++) {
+        value = arguments[i]
+        args[i] = zepto.isZ(value) ? value.toArray() : value
+      }
+      return concat.apply(zepto.isZ(this) ? this.toArray() : this, args)
+    },
+
+    // `map` and `slice` in the jQuery API work differently
+    // from their array counterparts
+    map: function(fn){
+      return $($.map(this, function(el, i){ return fn.call(el, i, el) }))
+    },
+    slice: function(){
+      return $(slice.apply(this, arguments))
+    },
+
+    ready: function(callback){
+      // need to check if document.body exists for IE as that browser reports
+      // document ready when it hasn't yet created the body element
+      if (readyRE.test(document.readyState) && document.body) callback($)
+      else document.addEventListener('DOMContentLoaded', function(){ callback($) }, false)
+      return this
+    },
+    get: function(idx){
+      return idx === undefined ? slice.call(this) : this[idx >= 0 ? idx : idx + this.length]
+    },
+    toArray: function(){ return this.get() },
+    size: function(){
+      return this.length
+    },
+    remove: function(){
+      return this.each(function(){
+        if (this.parentNode != null)
+          this.parentNode.removeChild(this)
+      })
+    },
+    each: function(callback){
+      emptyArray.every.call(this, function(el, idx){
+        return callback.call(el, idx, el) !== false
+      })
+      return this
+    },
+    filter: function(selector){
+      if (isFunction(selector)) return this.not(this.not(selector))
+      return $(filter.call(this, function(element){
+        return zepto.matches(element, selector)
+      }))
+    },
+    add: function(selector,context){
+      return $(uniq(this.concat($(selector,context))))
+    },
+    is: function(selector){
+      return this.length > 0 && zepto.matches(this[0], selector)
+    },
+    not: function(selector){
+      var nodes=[]
+      if (isFunction(selector) && selector.call !== undefined)
+        this.each(function(idx){
+          if (!selector.call(this,idx)) nodes.push(this)
+        })
+      else {
+        var excludes = typeof selector == 'string' ? this.filter(selector) :
+          (likeArray(selector) && isFunction(selector.item)) ? slice.call(selector) : $(selector)
+        this.forEach(function(el){
+          if (excludes.indexOf(el) < 0) nodes.push(el)
+        })
+      }
+      return $(nodes)
+    },
+    has: function(selector){
+      return this.filter(function(){
+        return isObject(selector) ?
+          $.contains(this, selector) :
+          $(this).find(selector).size()
+      })
+    },
+    eq: function(idx){
+      return idx === -1 ? this.slice(idx) : this.slice(idx, + idx + 1)
+    },
+    first: function(){
+      var el = this[0]
+      return el && !isObject(el) ? el : $(el)
+    },
+    last: function(){
+      var el = this[this.length - 1]
+      return el && !isObject(el) ? el : $(el)
+    },
+    find: function(selector){
+      var result, $this = this
+      if (!selector) result = $()
+      else if (typeof selector == 'object')
+        result = $(selector).filter(function(){
+          var node = this
+          return emptyArray.some.call($this, function(parent){
+            return $.contains(parent, node)
+          })
+        })
+      else if (this.length == 1) result = $(zepto.qsa(this[0], selector))
+      else result = this.map(function(){ return zepto.qsa(this, selector) })
+      return result
+    },
+    closest: function(selector, context){
+      var nodes = [], collection = typeof selector == 'object' && $(selector)
+      this.each(function(_, node){
+        while (node && !(collection ? collection.indexOf(node) >= 0 : zepto.matches(node, selector)))
+          node = node !== context && !isDocument(node) && node.parentNode
+        if (node && nodes.indexOf(node) < 0) nodes.push(node)
+      })
+      return $(nodes)
+    },
+    parents: function(selector){
+      var ancestors = [], nodes = this
+      while (nodes.length > 0)
+        nodes = $.map(nodes, function(node){
+          if ((node = node.parentNode) && !isDocument(node) && ancestors.indexOf(node) < 0) {
+            ancestors.push(node)
+            return node
+          }
+        })
+      return filtered(ancestors, selector)
+    },
+    parent: function(selector){
+      return filtered(uniq(this.pluck('parentNode')), selector)
+    },
+    children: function(selector){
+      return filtered(this.map(function(){ return children(this) }), selector)
+    },
+    contents: function() {
+      return this.map(function() { return this.contentDocument || slice.call(this.childNodes) })
+    },
+    siblings: function(selector){
+      return filtered(this.map(function(i, el){
+        return filter.call(children(el.parentNode), function(child){ return child!==el })
+      }), selector)
+    },
+    empty: function(){
+      return this.each(function(){ this.innerHTML = '' })
+    },
+    // `pluck` is borrowed from Prototype.js
+    pluck: function(property){
+      return $.map(this, function(el){ return el[property] })
+    },
+    show: function(){
+      return this.each(function(){
+        this.style.display == "none" && (this.style.display = '')
+        if (getComputedStyle(this, '').getPropertyValue("display") == "none")
+          this.style.display = defaultDisplay(this.nodeName)
+      })
+    },
+    replaceWith: function(newContent){
+      return this.before(newContent).remove()
+    },
+    wrap: function(structure){
+      var func = isFunction(structure)
+      if (this[0] && !func)
+        var dom   = $(structure).get(0),
+            clone = dom.parentNode || this.length > 1
+
+      return this.each(function(index){
+        $(this).wrapAll(
+          func ? structure.call(this, index) :
+            clone ? dom.cloneNode(true) : dom
+        )
+      })
+    },
+    wrapAll: function(structure){
+      if (this[0]) {
+        $(this[0]).before(structure = $(structure))
+        var children
+        // drill down to the inmost element
+        while ((children = structure.children()).length) structure = children.first()
+        $(structure).append(this)
+      }
+      return this
+    },
+    wrapInner: function(structure){
+      var func = isFunction(structure)
+      return this.each(function(index){
+        var self = $(this), contents = self.contents(),
+            dom  = func ? structure.call(this, index) : structure
+        contents.length ? contents.wrapAll(dom) : self.append(dom)
+      })
+    },
+    unwrap: function(){
+      this.parent().each(function(){
+        $(this).replaceWith($(this).children())
+      })
+      return this
+    },
+    clone: function(){
+      return this.map(function(){ return this.cloneNode(true) })
+    },
+    hide: function(){
+      return this.css("display", "none")
+    },
+    toggle: function(setting){
+      return this.each(function(){
+        var el = $(this)
+        ;(setting === undefined ? el.css("display") == "none" : setting) ? el.show() : el.hide()
+      })
+    },
+    prev: function(selector){ return $(this.pluck('previousElementSibling')).filter(selector || '*') },
+    next: function(selector){ return $(this.pluck('nextElementSibling')).filter(selector || '*') },
+    html: function(html){
+      return 0 in arguments ?
+        this.each(function(idx){
+          var originHtml = this.innerHTML
+          $(this).empty().append( funcArg(this, html, idx, originHtml) )
+        }) :
+        (0 in this ? this[0].innerHTML : null)
+    },
+    text: function(text){
+      return 0 in arguments ?
+        this.each(function(idx){
+          var newText = funcArg(this, text, idx, this.textContent)
+          this.textContent = newText == null ? '' : ''+newText
+        }) :
+        (0 in this ? this.pluck('textContent').join("") : null)
+    },
+    attr: function(name, value){
+      var result
+      return (typeof name == 'string' && !(1 in arguments)) ?
+        (0 in this && this[0].nodeType == 1 && (result = this[0].getAttribute(name)) != null ? result : undefined) :
+        this.each(function(idx){
+          if (this.nodeType !== 1) return
+          if (isObject(name)) for (key in name) setAttribute(this, key, name[key])
+          else setAttribute(this, name, funcArg(this, value, idx, this.getAttribute(name)))
+        })
+    },
+    removeAttr: function(name){
+      return this.each(function(){ this.nodeType === 1 && name.split(' ').forEach(function(attribute){
+        setAttribute(this, attribute)
+      }, this)})
+    },
+    prop: function(name, value){
+      name = propMap[name] || name
+      return (1 in arguments) ?
+        this.each(function(idx){
+          this[name] = funcArg(this, value, idx, this[name])
+        }) :
+        (this[0] && this[0][name])
+    },
+    removeProp: function(name){
+      name = propMap[name] || name
+      return this.each(function(){ delete this[name] })
+    },
+    data: function(name, value){
+      var attrName = 'data-' + name.replace(capitalRE, '-$1').toLowerCase()
+
+      var data = (1 in arguments) ?
+        this.attr(attrName, value) :
+        this.attr(attrName)
+
+      return data !== null ? deserializeValue(data) : undefined
+    },
+    val: function(value){
+      if (0 in arguments) {
+        if (value == null) value = ""
+        return this.each(function(idx){
+          this.value = funcArg(this, value, idx, this.value)
+        })
+      } else {
+        return this[0] && (this[0].multiple ?
+           $(this[0]).find('option').filter(function(){ return this.selected }).pluck('value') :
+           this[0].value)
+      }
+    },
+    offset: function(coordinates){
+      if (coordinates) return this.each(function(index){
+        var $this = $(this),
+            coords = funcArg(this, coordinates, index, $this.offset()),
+            parentOffset = $this.offsetParent().offset(),
+            props = {
+              top:  coords.top  - parentOffset.top,
+              left: coords.left - parentOffset.left
+            }
+
+        if ($this.css('position') == 'static') props['position'] = 'relative'
+        $this.css(props)
+      })
+      if (!this.length) return null
+      if (document.documentElement !== this[0] && !$.contains(document.documentElement, this[0]))
+        return {top: 0, left: 0}
+      var obj = this[0].getBoundingClientRect()
+      return {
+        left: obj.left + window.pageXOffset,
+        top: obj.top + window.pageYOffset,
+        width: Math.round(obj.width),
+        height: Math.round(obj.height)
+      }
+    },
+    css: function(property, value){
+      if (arguments.length < 2) {
+        var element = this[0]
+        if (typeof property == 'string') {
+          if (!element) return
+          return element.style[camelize(property)] || getComputedStyle(element, '').getPropertyValue(property)
+        } else if (isArray(property)) {
+          if (!element) return
+          var props = {}
+          var computedStyle = getComputedStyle(element, '')
+          $.each(property, function(_, prop){
+            props[prop] = (element.style[camelize(prop)] || computedStyle.getPropertyValue(prop))
+          })
+          return props
+        }
+      }
+
+      var css = ''
+      if (type(property) == 'string') {
+        if (!value && value !== 0)
+          this.each(function(){ this.style.removeProperty(dasherize(property)) })
+        else
+          css = dasherize(property) + ":" + maybeAddPx(property, value)
+      } else {
+        for (key in property)
+          if (!property[key] && property[key] !== 0)
+            this.each(function(){ this.style.removeProperty(dasherize(key)) })
+          else
+            css += dasherize(key) + ':' + maybeAddPx(key, property[key]) + ';'
+      }
+
+      return this.each(function(){ this.style.cssText += ';' + css })
+    },
+    index: function(element){
+      return element ? this.indexOf($(element)[0]) : this.parent().children().indexOf(this[0])
+    },
+    hasClass: function(name){
+      if (!name) return false
+      return emptyArray.some.call(this, function(el){
+        return this.test(className(el))
+      }, classRE(name))
+    },
+    addClass: function(name){
+      if (!name) return this
+      return this.each(function(idx){
+        if (!('className' in this)) return
+        classList = []
+        var cls = className(this), newName = funcArg(this, name, idx, cls)
+        newName.split(/\s+/g).forEach(function(klass){
+          if (!$(this).hasClass(klass)) classList.push(klass)
+        }, this)
+        classList.length && className(this, cls + (cls ? " " : "") + classList.join(" "))
+      })
+    },
+    removeClass: function(name){
+      return this.each(function(idx){
+        if (!('className' in this)) return
+        if (name === undefined) return className(this, '')
+        classList = className(this)
+        funcArg(this, name, idx, classList).split(/\s+/g).forEach(function(klass){
+          classList = classList.replace(classRE(klass), " ")
+        })
+        className(this, classList.trim())
+      })
+    },
+    toggleClass: function(name, when){
+      if (!name) return this
+      return this.each(function(idx){
+        var $this = $(this), names = funcArg(this, name, idx, className(this))
+        names.split(/\s+/g).forEach(function(klass){
+          (when === undefined ? !$this.hasClass(klass) : when) ?
+            $this.addClass(klass) : $this.removeClass(klass)
+        })
+      })
+    },
+    scrollTop: function(value){
+      if (!this.length) return
+      var hasScrollTop = 'scrollTop' in this[0]
+      if (value === undefined) return hasScrollTop ? this[0].scrollTop : this[0].pageYOffset
+      return this.each(hasScrollTop ?
+        function(){ this.scrollTop = value } :
+        function(){ this.scrollTo(this.scrollX, value) })
+    },
+    scrollLeft: function(value){
+      if (!this.length) return
+      var hasScrollLeft = 'scrollLeft' in this[0]
+      if (value === undefined) return hasScrollLeft ? this[0].scrollLeft : this[0].pageXOffset
+      return this.each(hasScrollLeft ?
+        function(){ this.scrollLeft = value } :
+        function(){ this.scrollTo(value, this.scrollY) })
+    },
+    position: function() {
+      if (!this.length) return
+
+      var elem = this[0],
+        // Get *real* offsetParent
+        offsetParent = this.offsetParent(),
+        // Get correct offsets
+        offset       = this.offset(),
+        parentOffset = rootNodeRE.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset()
+
+      // Subtract element margins
+      // note: when an element has margin: auto the offsetLeft and marginLeft
+      // are the same in Safari causing offset.left to incorrectly be 0
+      offset.top  -= parseFloat( $(elem).css('margin-top') ) || 0
+      offset.left -= parseFloat( $(elem).css('margin-left') ) || 0
+
+      // Add offsetParent borders
+      parentOffset.top  += parseFloat( $(offsetParent[0]).css('border-top-width') ) || 0
+      parentOffset.left += parseFloat( $(offsetParent[0]).css('border-left-width') ) || 0
+
+      // Subtract the two offsets
+      return {
+        top:  offset.top  - parentOffset.top,
+        left: offset.left - parentOffset.left
+      }
+    },
+    offsetParent: function() {
+      return this.map(function(){
+        var parent = this.offsetParent || document.body
+        while (parent && !rootNodeRE.test(parent.nodeName) && $(parent).css("position") == "static")
+          parent = parent.offsetParent
+        return parent
+      })
+    }
+  }
+
+  // for now
+  $.fn.detach = $.fn.remove
+
+  // Generate the `width` and `height` functions
+  ;['width', 'height'].forEach(function(dimension){
+    var dimensionProperty =
+      dimension.replace(/./, function(m){ return m[0].toUpperCase() })
+
+    $.fn[dimension] = function(value){
+      var offset, el = this[0]
+      if (value === undefined) return isWindow(el) ? el['inner' + dimensionProperty] :
+        isDocument(el) ? el.documentElement['scroll' + dimensionProperty] :
+        (offset = this.offset()) && offset[dimension]
+      else return this.each(function(idx){
+        el = $(this)
+        el.css(dimension, funcArg(this, value, idx, el[dimension]()))
+      })
+    }
+  })
+
+  function traverseNode(node, fun) {
+    fun(node)
+    for (var i = 0, len = node.childNodes.length; i < len; i++)
+      traverseNode(node.childNodes[i], fun)
+  }
+
+  // Generate the `after`, `prepend`, `before`, `append`,
+  // `insertAfter`, `insertBefore`, `appendTo`, and `prependTo` methods.
+  adjacencyOperators.forEach(function(operator, operatorIndex) {
+    var inside = operatorIndex % 2 //=> prepend, append
+
+    $.fn[operator] = function(){
+      // arguments can be nodes, arrays of nodes, Zepto objects and HTML strings
+      var argType, nodes = $.map(arguments, function(arg) {
+            var arr = []
+            argType = type(arg)
+            if (argType == "array") {
+              arg.forEach(function(el) {
+                if (el.nodeType !== undefined) return arr.push(el)
+                else if ($.zepto.isZ(el)) return arr = arr.concat(el.get())
+                arr = arr.concat(zepto.fragment(el))
+              })
+              return arr
+            }
+            return argType == "object" || arg == null ?
+              arg : zepto.fragment(arg)
+          }),
+          parent, copyByClone = this.length > 1
+      if (nodes.length < 1) return this
+
+      return this.each(function(_, target){
+        parent = inside ? target : target.parentNode
+
+        // convert all methods to a "before" operation
+        target = operatorIndex == 0 ? target.nextSibling :
+                 operatorIndex == 1 ? target.firstChild :
+                 operatorIndex == 2 ? target :
+                 null
+
+        var parentInDocument = $.contains(document.documentElement, parent)
+
+        nodes.forEach(function(node){
+          if (copyByClone) node = node.cloneNode(true)
+          else if (!parent) return $(node).remove()
+
+          parent.insertBefore(node, target)
+          if (parentInDocument) traverseNode(node, function(el){
+            if (el.nodeName != null && el.nodeName.toUpperCase() === 'SCRIPT' &&
+               (!el.type || el.type === 'text/javascript') && !el.src){
+              var target = el.ownerDocument ? el.ownerDocument.defaultView : window
+              target['eval'].call(target, el.innerHTML)
+            }
+          })
+        })
+      })
+    }
+
+    // after    => insertAfter
+    // prepend  => prependTo
+    // before   => insertBefore
+    // append   => appendTo
+    $.fn[inside ? operator+'To' : 'insert'+(operatorIndex ? 'Before' : 'After')] = function(html){
+      $(html)[operator](this)
+      return this
+    }
+  })
+
+  zepto.Z.prototype = Z.prototype = $.fn
+
+  // Export internal API functions in the `$.zepto` namespace
+  zepto.uniq = uniq
+  zepto.deserializeValue = deserializeValue
+  $.zepto = zepto
+
+  return $
+})()
+
+;(function($){
+  var _zid = 1, undefined,
+      slice = Array.prototype.slice,
+      isFunction = $.isFunction,
+      isString = function(obj){ return typeof obj == 'string' },
+      handlers = {},
+      specialEvents={},
+      focusinSupported = 'onfocusin' in window,
+      focus = { focus: 'focusin', blur: 'focusout' },
+      hover = { mouseenter: 'mouseover', mouseleave: 'mouseout' }
+
+  specialEvents.click = specialEvents.mousedown = specialEvents.mouseup = specialEvents.mousemove = 'MouseEvents'
+
+  function zid(element) {
+    return element._zid || (element._zid = _zid++)
+  }
+  function findHandlers(element, event, fn, selector) {
+    event = parse(event)
+    if (event.ns) var matcher = matcherFor(event.ns)
+    return (handlers[zid(element)] || []).filter(function(handler) {
+      return handler
+        && (!event.e  || handler.e == event.e)
+        && (!event.ns || matcher.test(handler.ns))
+        && (!fn       || zid(handler.fn) === zid(fn))
+        && (!selector || handler.sel == selector)
+    })
+  }
+  function parse(event) {
+    var parts = ('' + event).split('.')
+    return {e: parts[0], ns: parts.slice(1).sort().join(' ')}
+  }
+  function matcherFor(ns) {
+    return new RegExp('(?:^| )' + ns.replace(' ', ' .* ?') + '(?: |$)')
+  }
+
+  function eventCapture(handler, captureSetting) {
+    return handler.del &&
+      (!focusinSupported && (handler.e in focus)) ||
+      !!captureSetting
+  }
+
+  function realEvent(type) {
+    return hover[type] || (focusinSupported && focus[type]) || type
+  }
+
+  function add(element, events, fn, data, selector, delegator, capture){
+    var id = zid(element), set = (handlers[id] || (handlers[id] = []))
+    events.split(/\s/).forEach(function(event){
+      if (event == 'ready') return $(document).ready(fn)
+      var handler   = parse(event)
+      handler.fn    = fn
+      handler.sel   = selector
+      // emulate mouseenter, mouseleave
+      if (handler.e in hover) fn = function(e){
+        var related = e.relatedTarget
+        if (!related || (related !== this && !$.contains(this, related)))
+          return handler.fn.apply(this, arguments)
+      }
+      handler.del   = delegator
+      var callback  = delegator || fn
+      handler.proxy = function(e){
+        e = compatible(e)
+        if (e.isImmediatePropagationStopped()) return
+        e.data = data
+        var result = callback.apply(element, e._args == undefined ? [e] : [e].concat(e._args))
+        if (result === false) e.preventDefault(), e.stopPropagation()
+        return result
+      }
+      handler.i = set.length
+      set.push(handler)
+      if ('addEventListener' in element)
+        element.addEventListener(realEvent(handler.e), handler.proxy, eventCapture(handler, capture))
+    })
+  }
+  function remove(element, events, fn, selector, capture){
+    var id = zid(element)
+    ;(events || '').split(/\s/).forEach(function(event){
+      findHandlers(element, event, fn, selector).forEach(function(handler){
+        delete handlers[id][handler.i]
+      if ('removeEventListener' in element)
+        element.removeEventListener(realEvent(handler.e), handler.proxy, eventCapture(handler, capture))
+      })
+    })
+  }
+
+  $.event = { add: add, remove: remove }
+
+  $.proxy = function(fn, context) {
+    var args = (2 in arguments) && slice.call(arguments, 2)
+    if (isFunction(fn)) {
+      var proxyFn = function(){ return fn.apply(context, args ? args.concat(slice.call(arguments)) : arguments) }
+      proxyFn._zid = zid(fn)
+      return proxyFn
+    } else if (isString(context)) {
+      if (args) {
+        args.unshift(fn[context], fn)
+        return $.proxy.apply(null, args)
+      } else {
+        return $.proxy(fn[context], fn)
+      }
+    } else {
+      throw new TypeError("expected function")
+    }
+  }
+
+  $.fn.bind = function(event, data, callback){
+    return this.on(event, data, callback)
+  }
+  $.fn.unbind = function(event, callback){
+    return this.off(event, callback)
+  }
+  $.fn.one = function(event, selector, data, callback){
+    return this.on(event, selector, data, callback, 1)
+  }
+
+  var returnTrue = function(){return true},
+      returnFalse = function(){return false},
+      ignoreProperties = /^([A-Z]|returnValue$|layer[XY]$|webkitMovement[XY]$)/,
+      eventMethods = {
+        preventDefault: 'isDefaultPrevented',
+        stopImmediatePropagation: 'isImmediatePropagationStopped',
+        stopPropagation: 'isPropagationStopped'
+      }
+
+  function compatible(event, source) {
+    if (source || !event.isDefaultPrevented) {
+      source || (source = event)
+
+      $.each(eventMethods, function(name, predicate) {
+        var sourceMethod = source[name]
+        event[name] = function(){
+          this[predicate] = returnTrue
+          return sourceMethod && sourceMethod.apply(source, arguments)
+        }
+        event[predicate] = returnFalse
+      })
+
+      event.timeStamp || (event.timeStamp = Date.now())
+
+      if (source.defaultPrevented !== undefined ? source.defaultPrevented :
+          'returnValue' in source ? source.returnValue === false :
+          source.getPreventDefault && source.getPreventDefault())
+        event.isDefaultPrevented = returnTrue
+    }
+    return event
+  }
+
+  function createProxy(event) {
+    var key, proxy = { originalEvent: event }
+    for (key in event)
+      if (!ignoreProperties.test(key) && event[key] !== undefined) proxy[key] = event[key]
+
+    return compatible(proxy, event)
+  }
+
+  $.fn.delegate = function(selector, event, callback){
+    return this.on(event, selector, callback)
+  }
+  $.fn.undelegate = function(selector, event, callback){
+    return this.off(event, selector, callback)
+  }
+
+  $.fn.live = function(event, callback){
+    $(document.body).delegate(this.selector, event, callback)
+    return this
+  }
+  $.fn.die = function(event, callback){
+    $(document.body).undelegate(this.selector, event, callback)
+    return this
+  }
+
+  $.fn.on = function(event, selector, data, callback, one){
+    var autoRemove, delegator, $this = this
+    if (event && !isString(event)) {
+      $.each(event, function(type, fn){
+        $this.on(type, selector, data, fn, one)
+      })
+      return $this
+    }
+
+    if (!isString(selector) && !isFunction(callback) && callback !== false)
+      callback = data, data = selector, selector = undefined
+    if (callback === undefined || data === false)
+      callback = data, data = undefined
+
+    if (callback === false) callback = returnFalse
+
+    return $this.each(function(_, element){
+      if (one) autoRemove = function(e){
+        remove(element, e.type, callback)
+        return callback.apply(this, arguments)
+      }
+
+      if (selector) delegator = function(e){
+        var evt, match = $(e.target).closest(selector, element).get(0)
+        if (match && match !== element) {
+          evt = $.extend(createProxy(e), {currentTarget: match, liveFired: element})
+          return (autoRemove || callback).apply(match, [evt].concat(slice.call(arguments, 1)))
+        }
+      }
+
+      add(element, event, callback, data, selector, delegator || autoRemove)
+    })
+  }
+  $.fn.off = function(event, selector, callback){
+    var $this = this
+    if (event && !isString(event)) {
+      $.each(event, function(type, fn){
+        $this.off(type, selector, fn)
+      })
+      return $this
+    }
+
+    if (!isString(selector) && !isFunction(callback) && callback !== false)
+      callback = selector, selector = undefined
+
+    if (callback === false) callback = returnFalse
+
+    return $this.each(function(){
+      remove(this, event, callback, selector)
+    })
+  }
+
+  $.fn.trigger = function(event, args){
+    event = (isString(event) || $.isPlainObject(event)) ? $.Event(event) : compatible(event)
+    event._args = args
+    return this.each(function(){
+      // handle focus(), blur() by calling them directly
+      if (event.type in focus && typeof this[event.type] == "function") this[event.type]()
+      // items in the collection might not be DOM elements
+      else if ('dispatchEvent' in this) this.dispatchEvent(event)
+      else $(this).triggerHandler(event, args)
+    })
+  }
+
+  // triggers event handlers on current element just as if an event occurred,
+  // doesn't trigger an actual event, doesn't bubble
+  $.fn.triggerHandler = function(event, args){
+    var e, result
+    this.each(function(i, element){
+      e = createProxy(isString(event) ? $.Event(event) : event)
+      e._args = args
+      e.target = element
+      $.each(findHandlers(element, event.type || event), function(i, handler){
+        result = handler.proxy(e)
+        if (e.isImmediatePropagationStopped()) return false
+      })
+    })
+    return result
+  }
+
+  // shortcut methods for `.bind(event, fn)` for each event type
+  ;('focusin focusout focus blur load resize scroll unload click dblclick '+
+  'mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave '+
+  'change select keydown keypress keyup error').split(' ').forEach(function(event) {
+    $.fn[event] = function(callback) {
+      return (0 in arguments) ?
+        this.bind(event, callback) :
+        this.trigger(event)
+    }
+  })
+
+  $.Event = function(type, props) {
+    if (!isString(type)) props = type, type = props.type
+    var event = document.createEvent(specialEvents[type] || 'Events'), bubbles = true
+    if (props) for (var name in props) (name == 'bubbles') ? (bubbles = !!props[name]) : (event[name] = props[name])
+    event.initEvent(type, bubbles, true)
+    return compatible(event)
+  }
+
+})(Zepto)
+
+;(function($){
+  var jsonpID = +new Date(),
+      document = window.document,
+      key,
+      name,
+      rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
+      scriptTypeRE = /^(?:text|application)\/javascript/i,
+      xmlTypeRE = /^(?:text|application)\/xml/i,
+      jsonType = 'application/json',
+      htmlType = 'text/html',
+      blankRE = /^\s*$/,
+      originAnchor = document.createElement('a')
+
+  originAnchor.href = window.location.href
+
+  // trigger a custom event and return false if it was cancelled
+  function triggerAndReturn(context, eventName, data) {
+    var event = $.Event(eventName)
+    $(context).trigger(event, data)
+    return !event.isDefaultPrevented()
+  }
+
+  // trigger an Ajax "global" event
+  function triggerGlobal(settings, context, eventName, data) {
+    if (settings.global) return triggerAndReturn(context || document, eventName, data)
+  }
+
+  // Number of active Ajax requests
+  $.active = 0
+
+  function ajaxStart(settings) {
+    if (settings.global && $.active++ === 0) triggerGlobal(settings, null, 'ajaxStart')
+  }
+  function ajaxStop(settings) {
+    if (settings.global && !(--$.active)) triggerGlobal(settings, null, 'ajaxStop')
+  }
+
+  // triggers an extra global event "ajaxBeforeSend" that's like "ajaxSend" but cancelable
+  function ajaxBeforeSend(xhr, settings) {
+    var context = settings.context
+    if (settings.beforeSend.call(context, xhr, settings) === false ||
+        triggerGlobal(settings, context, 'ajaxBeforeSend', [xhr, settings]) === false)
+      return false
+
+    triggerGlobal(settings, context, 'ajaxSend', [xhr, settings])
+  }
+  function ajaxSuccess(data, xhr, settings, deferred) {
+    var context = settings.context, status = 'success'
+    settings.success.call(context, data, status, xhr)
+    if (deferred) deferred.resolveWith(context, [data, status, xhr])
+    triggerGlobal(settings, context, 'ajaxSuccess', [xhr, settings, data])
+    ajaxComplete(status, xhr, settings)
+  }
+  // type: "timeout", "error", "abort", "parsererror"
+  function ajaxError(error, type, xhr, settings, deferred) {
+    var context = settings.context
+    settings.error.call(context, xhr, type, error)
+    if (deferred) deferred.rejectWith(context, [xhr, type, error])
+    triggerGlobal(settings, context, 'ajaxError', [xhr, settings, error || type])
+    ajaxComplete(type, xhr, settings)
+  }
+  // status: "success", "notmodified", "error", "timeout", "abort", "parsererror"
+  function ajaxComplete(status, xhr, settings) {
+    var context = settings.context
+    settings.complete.call(context, xhr, status)
+    triggerGlobal(settings, context, 'ajaxComplete', [xhr, settings])
+    ajaxStop(settings)
+  }
+
+  function ajaxDataFilter(data, type, settings) {
+    if (settings.dataFilter == empty) return data
+    var context = settings.context
+    return settings.dataFilter.call(context, data, type)
+  }
+
+  // Empty function, used as default callback
+  function empty() {}
+
+  $.ajaxJSONP = function(options, deferred){
+    if (!('type' in options)) return $.ajax(options)
+
+    var _callbackName = options.jsonpCallback,
+      callbackName = ($.isFunction(_callbackName) ?
+        _callbackName() : _callbackName) || ('Zepto' + (jsonpID++)),
+      script = document.createElement('script'),
+      originalCallback = window[callbackName],
+      responseData,
+      abort = function(errorType) {
+        $(script).triggerHandler('error', errorType || 'abort')
+      },
+      xhr = { abort: abort }, abortTimeout
+
+    if (deferred) deferred.promise(xhr)
+
+    $(script).on('load error', function(e, errorType){
+      clearTimeout(abortTimeout)
+      $(script).off().remove()
+
+      if (e.type == 'error' || !responseData) {
+        ajaxError(null, errorType || 'error', xhr, options, deferred)
+      } else {
+        ajaxSuccess(responseData[0], xhr, options, deferred)
+      }
+
+      window[callbackName] = originalCallback
+      if (responseData && $.isFunction(originalCallback))
+        originalCallback(responseData[0])
+
+      originalCallback = responseData = undefined
+    })
+
+    if (ajaxBeforeSend(xhr, options) === false) {
+      abort('abort')
+      return xhr
+    }
+
+    window[callbackName] = function(){
+      responseData = arguments
+    }
+
+    script.src = options.url.replace(/\?(.+)=\?/, '?$1=' + callbackName)
+    document.head.appendChild(script)
+
+    if (options.timeout > 0) abortTimeout = setTimeout(function(){
+      abort('timeout')
+    }, options.timeout)
+
+    return xhr
+  }
+
+  $.ajaxSettings = {
+    // Default type of request
+    type: 'GET',
+    // Callback that is executed before request
+    beforeSend: empty,
+    // Callback that is executed if the request succeeds
+    success: empty,
+    // Callback that is executed the the server drops error
+    error: empty,
+    // Callback that is executed on request complete (both: error and success)
+    complete: empty,
+    // The context for the callbacks
+    context: null,
+    // Whether to trigger "global" Ajax events
+    global: true,
+    // Transport
+    xhr: function () {
+      return new window.XMLHttpRequest()
+    },
+    // MIME types mapping
+    // IIS returns Javascript as "application/x-javascript"
+    accepts: {
+      script: 'text/javascript, application/javascript, application/x-javascript',
+      json:   jsonType,
+      xml:    'application/xml, text/xml',
+      html:   htmlType,
+      text:   'text/plain'
+    },
+    // Whether the request is to another domain
+    crossDomain: false,
+    // Default timeout
+    timeout: 0,
+    // Whether data should be serialized to string
+    processData: true,
+    // Whether the browser should be allowed to cache GET responses
+    cache: true,
+    //Used to handle the raw response data of XMLHttpRequest.
+    //This is a pre-filtering function to sanitize the response.
+    //The sanitized response should be returned
+    dataFilter: empty
+  }
+
+  function mimeToDataType(mime) {
+    if (mime) mime = mime.split(';', 2)[0]
+    return mime && ( mime == htmlType ? 'html' :
+      mime == jsonType ? 'json' :
+      scriptTypeRE.test(mime) ? 'script' :
+      xmlTypeRE.test(mime) && 'xml' ) || 'text'
+  }
+
+  function appendQuery(url, query) {
+    if (query == '') return url
+    return (url + '&' + query).replace(/[&?]{1,2}/, '?')
+  }
+
+  // serialize payload and append it to the URL for GET requests
+  function serializeData(options) {
+    if (options.processData && options.data && $.type(options.data) != "string")
+      options.data = $.param(options.data, options.traditional)
+    if (options.data && (!options.type || options.type.toUpperCase() == 'GET' || 'jsonp' == options.dataType))
+      options.url = appendQuery(options.url, options.data), options.data = undefined
+  }
+
+  $.ajax = function(options){
+    var settings = $.extend({}, options || {}),
+        deferred = $.Deferred && $.Deferred(),
+        urlAnchor, hashIndex
+    for (key in $.ajaxSettings) if (settings[key] === undefined) settings[key] = $.ajaxSettings[key]
+
+    ajaxStart(settings)
+
+    if (!settings.crossDomain) {
+      urlAnchor = document.createElement('a')
+      urlAnchor.href = settings.url
+      // cleans up URL for .href (IE only), see https://github.com/madrobby/zepto/pull/1049
+      urlAnchor.href = urlAnchor.href
+      settings.crossDomain = (originAnchor.protocol + '//' + originAnchor.host) !== (urlAnchor.protocol + '//' + urlAnchor.host)
+    }
+
+    if (!settings.url) settings.url = window.location.toString()
+    if ((hashIndex = settings.url.indexOf('#')) > -1) settings.url = settings.url.slice(0, hashIndex)
+    serializeData(settings)
+
+    var dataType = settings.dataType, hasPlaceholder = /\?.+=\?/.test(settings.url)
+    if (hasPlaceholder) dataType = 'jsonp'
+
+    if (settings.cache === false || (
+         (!options || options.cache !== true) &&
+         ('script' == dataType || 'jsonp' == dataType)
+        ))
+      settings.url = appendQuery(settings.url, '_=' + Date.now())
+
+    if ('jsonp' == dataType) {
+      if (!hasPlaceholder)
+        settings.url = appendQuery(settings.url,
+          settings.jsonp ? (settings.jsonp + '=?') : settings.jsonp === false ? '' : 'callback=?')
+      return $.ajaxJSONP(settings, deferred)
+    }
+
+    var mime = settings.accepts[dataType],
+        headers = { },
+        setHeader = function(name, value) { headers[name.toLowerCase()] = [name, value] },
+        protocol = /^([\w-]+:)\/\//.test(settings.url) ? RegExp.$1 : window.location.protocol,
+        xhr = settings.xhr(),
+        nativeSetHeader = xhr.setRequestHeader,
+        abortTimeout
+
+    if (deferred) deferred.promise(xhr)
+
+    if (!settings.crossDomain) setHeader('X-Requested-With', 'XMLHttpRequest')
+    setHeader('Accept', mime || '*/*')
+    if (mime = settings.mimeType || mime) {
+      if (mime.indexOf(',') > -1) mime = mime.split(',', 2)[0]
+      xhr.overrideMimeType && xhr.overrideMimeType(mime)
+    }
+    if (settings.contentType || (settings.contentType !== false && settings.data && settings.type.toUpperCase() != 'GET'))
+      setHeader('Content-Type', settings.contentType || 'application/x-www-form-urlencoded')
+
+    if (settings.headers) for (name in settings.headers) setHeader(name, settings.headers[name])
+    xhr.setRequestHeader = setHeader
+
+    xhr.onreadystatechange = function(){
+      if (xhr.readyState == 4) {
+        xhr.onreadystatechange = empty
+        clearTimeout(abortTimeout)
+        var result, error = false
+        if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304 || (xhr.status == 0 && protocol == 'file:')) {
+          dataType = dataType || mimeToDataType(settings.mimeType || xhr.getResponseHeader('content-type'))
+
+          if (xhr.responseType == 'arraybuffer' || xhr.responseType == 'blob')
+            result = xhr.response
+          else {
+            result = xhr.responseText
+
+            try {
+              // http://perfectionkills.com/global-eval-what-are-the-options/
+              // sanitize response accordingly if data filter callback provided
+              result = ajaxDataFilter(result, dataType, settings)
+              if (dataType == 'script')    (1,eval)(result)
+              else if (dataType == 'xml')  result = xhr.responseXML
+              else if (dataType == 'json') result = blankRE.test(result) ? null : $.parseJSON(result)
+            } catch (e) { error = e }
+
+            if (error) return ajaxError(error, 'parsererror', xhr, settings, deferred)
+          }
+
+          ajaxSuccess(result, xhr, settings, deferred)
+        } else {
+          ajaxError(xhr.statusText || null, xhr.status ? 'error' : 'abort', xhr, settings, deferred)
+        }
+      }
+    }
+
+    if (ajaxBeforeSend(xhr, settings) === false) {
+      xhr.abort()
+      ajaxError(null, 'abort', xhr, settings, deferred)
+      return xhr
+    }
+
+    var async = 'async' in settings ? settings.async : true
+    xhr.open(settings.type, settings.url, async, settings.username, settings.password)
+
+    if (settings.xhrFields) for (name in settings.xhrFields) xhr[name] = settings.xhrFields[name]
+
+    for (name in headers) nativeSetHeader.apply(xhr, headers[name])
+
+    if (settings.timeout > 0) abortTimeout = setTimeout(function(){
+        xhr.onreadystatechange = empty
+        xhr.abort()
+        ajaxError(null, 'timeout', xhr, settings, deferred)
+      }, settings.timeout)
+
+    // avoid sending empty string (#319)
+    xhr.send(settings.data ? settings.data : null)
+    return xhr
+  }
+
+  // handle optional data/success arguments
+  function parseArguments(url, data, success, dataType) {
+    if ($.isFunction(data)) dataType = success, success = data, data = undefined
+    if (!$.isFunction(success)) dataType = success, success = undefined
+    return {
+      url: url
+    , data: data
+    , success: success
+    , dataType: dataType
+    }
+  }
+
+  $.get = function(/* url, data, success, dataType */){
+    return $.ajax(parseArguments.apply(null, arguments))
+  }
+
+  $.post = function(/* url, data, success, dataType */){
+    var options = parseArguments.apply(null, arguments)
+    options.type = 'POST'
+    return $.ajax(options)
+  }
+
+  $.getJSON = function(/* url, data, success */){
+    var options = parseArguments.apply(null, arguments)
+    options.dataType = 'json'
+    return $.ajax(options)
+  }
+
+  $.fn.load = function(url, data, success){
+    if (!this.length) return this
+    var self = this, parts = url.split(/\s/), selector,
+        options = parseArguments(url, data, success),
+        callback = options.success
+    if (parts.length > 1) options.url = parts[0], selector = parts[1]
+    options.success = function(response){
+      self.html(selector ?
+        $('<div>').html(response.replace(rscript, "")).find(selector)
+        : response)
+      callback && callback.apply(self, arguments)
+    }
+    $.ajax(options)
+    return this
+  }
+
+  var escape = encodeURIComponent
+
+  function serialize(params, obj, traditional, scope){
+    var type, array = $.isArray(obj), hash = $.isPlainObject(obj)
+    $.each(obj, function(key, value) {
+      type = $.type(value)
+      if (scope) key = traditional ? scope :
+        scope + '[' + (hash || type == 'object' || type == 'array' ? key : '') + ']'
+      // handle data in serializeArray() format
+      if (!scope && array) params.add(value.name, value.value)
+      // recurse into nested objects
+      else if (type == "array" || (!traditional && type == "object"))
+        serialize(params, value, traditional, key)
+      else params.add(key, value)
+    })
+  }
+
+  $.param = function(obj, traditional){
+    var params = []
+    params.add = function(key, value) {
+      if ($.isFunction(value)) value = value()
+      if (value == null) value = ""
+      this.push(escape(key) + '=' + escape(value))
+    }
+    serialize(params, obj, traditional)
+    return params.join('&').replace(/%20/g, '+')
+  }
+})(Zepto)
+
+;(function($){
+  $.fn.serializeArray = function() {
+    var name, type, result = [],
+      add = function(value) {
+        if (value.forEach) return value.forEach(add)
+        result.push({ name: name, value: value })
+      }
+    if (this[0]) $.each(this[0].elements, function(_, field){
+      type = field.type, name = field.name
+      if (name && field.nodeName.toLowerCase() != 'fieldset' &&
+        !field.disabled && type != 'submit' && type != 'reset' && type != 'button' && type != 'file' &&
+        ((type != 'radio' && type != 'checkbox') || field.checked))
+          add($(field).val())
+    })
+    return result
+  }
+
+  $.fn.serialize = function(){
+    var result = []
+    this.serializeArray().forEach(function(elm){
+      result.push(encodeURIComponent(elm.name) + '=' + encodeURIComponent(elm.value))
+    })
+    return result.join('&')
+  }
+
+  $.fn.submit = function(callback) {
+    if (0 in arguments) this.bind('submit', callback)
+    else if (this.length) {
+      var event = $.Event('submit')
+      this.eq(0).trigger(event)
+      if (!event.isDefaultPrevented()) this.get(0).submit()
+    }
+    return this
+  }
+
+})(Zepto)
+
+;(function(){
+  // getComputedStyle shouldn't freak out when called
+  // without a valid element as argument
+  try {
+    getComputedStyle(undefined)
+  } catch(e) {
+    var nativeGetComputedStyle = getComputedStyle
+    window.getComputedStyle = function(element, pseudoElement){
+      try {
+        return nativeGetComputedStyle(element, pseudoElement)
+      } catch(e) {
+        return null
+      }
+    }
+  }
+})()
+  
+  
+  exports('zepto', Zepto)
+});
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/rate.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/rate.js
new file mode 100644
index 0000000..e79fc83
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/rate.js
@@ -0,0 +1,78 @@
+/** layui-v2.5.6 MIT License By https://www.layui.com */
+;layui.define("jquery", function (e) {
+    "use strict";
+    var a = layui.jquery, i = {
+            config: {}, index: layui.rate ? layui.rate.index + 1e4 : 0, set: function (e) {
+                var i = this;
+                return i.config = a.extend({}, i.config, e), i
+            }, on: function (e, a) {
+                return layui.onevent.call(this, n, e, a)
+            }
+        }, l = function () {
+            var e = this, a = e.config;
+            return {
+                setvalue: function (a) {
+                    e.setvalue.call(e, a)
+                }, config: a
+            }
+        }, n = "rate", t = "layui-rate", o = "layui-icon-rate", s = "layui-icon-rate-solid", u = "layui-icon-rate-half",
+        r = "layui-icon-rate-solid layui-icon-rate-half", c = "layui-icon-rate-solid layui-icon-rate",
+        f = "layui-icon-rate layui-icon-rate-half", v = function (e) {
+            var l = this;
+            l.index = ++i.index, l.config = a.extend({}, l.config, i.config, e), l.render()
+        };
+    v.prototype.config = {
+        length: 5,
+        text: !1,
+        readonly: !1,
+        half: !1,
+        value: 0,
+        theme: ""
+    }, v.prototype.render = function () {
+        var e = this, i = e.config, l = i.theme ? 'style="color: ' + i.theme + ';"' : "";
+        i.elem = a(i.elem), parseInt(i.value) !== i.value && (i.half || (i.value = Math.ceil(i.value) - i.value < .5 ? Math.ceil(i.value) : Math.floor(i.value)));
+        for (var n = '<ul class="layui-rate" ' + (i.readonly ? "readonly" : "") + ">", u = 1; u <= i.length; u++) {
+            var r = '<li class="layui-inline"><i class="layui-icon ' + (u > Math.floor(i.value) ? o : s) + '" ' + l + "></i></li>";
+            i.half && parseInt(i.value) !== i.value && u == Math.ceil(i.value) ? n = n + '<li><i class="layui-icon layui-icon-rate-half" ' + l + "></i></li>" : n += r
+        }
+        n += "</ul>" + (i.text ? '<span class="layui-inline">' + i.value + "鏄�" : "") + "</span>";
+        var c = i.elem, f = c.next("." + t);
+        f[0] && f.remove(), e.elemTemp = a(n), i.span = e.elemTemp.next("span"), i.setText && i.setText(i.value), c.html(e.elemTemp), c.addClass("layui-inline"), i.readonly || e.action()
+    }, v.prototype.setvalue = function (e) {
+        var a = this, i = a.config;
+        i.value = e, a.render()
+    }, v.prototype.action = function () {
+        var e = this, i = e.config, l = e.elemTemp, n = l.find("i").width();
+        l.children("li").each(function (e) {
+            var t = e + 1, v = a(this);
+            v.on("click", function (e) {
+                if (i.value = t, i.half) {
+                    var o = e.pageX - a(this).offset().left;
+                    o <= n / 2 && (i.value = i.value - .5)
+                }
+                i.text && l.next("span").text(i.value + "鏄�"), i.choose && i.choose(i.value), i.setText && i.setText(i.value)
+            }), v.on("mousemove", function (e) {
+                if (l.find("i").each(function () {
+                    a(this).addClass(o).removeClass(r)
+                }), l.find("i:lt(" + t + ")").each(function () {
+                    a(this).addClass(s).removeClass(f)
+                }), i.half) {
+                    var c = e.pageX - a(this).offset().left;
+                    c <= n / 2 && v.children("i").addClass(u).removeClass(s)
+                }
+            }), v.on("mouseleave", function () {
+                l.find("i").each(function () {
+                    a(this).addClass(o).removeClass(r)
+                }), l.find("i:lt(" + Math.floor(i.value) + ")").each(function () {
+                    a(this).addClass(s).removeClass(f)
+                }), i.half && parseInt(i.value) !== i.value && l.children("li:eq(" + Math.floor(i.value) + ")").children("i").addClass(u).removeClass(c)
+            })
+        })
+    }, v.prototype.events = function () {
+        var e = this;
+        e.config
+    }, i.render = function (e) {
+        var a = new v(e);
+        return l.call(a)
+    }, e(n, i)
+});
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/table.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/table.js
new file mode 100644
index 0000000..4ca5d5c
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/table.js
@@ -0,0 +1,3008 @@
+
+/*!
+ * layui.table
+ * 鏁版嵁琛ㄦ牸缁勪欢
+ */
+
+layui.define(['laytpl', 'laypage', 'layer', 'form','laydate','vciWebRefer','tree', 'util'], function(exports){
+  "use strict";
+
+  var $ = layui.$
+  ,laytpl = layui.laytpl
+  ,laypage = layui.laypage
+  ,layer = layui.layer
+  ,form = layui.form
+  ,util = layui.util
+  ,hint = layui.hint()
+  ,device = layui.device()
+  , laydate = layui.laydate
+
+  //澶栭儴鎺ュ彛
+  ,table = {
+        selectMode: {//琛ㄦ牸閫夋嫨妯″紡
+          single: 'single',
+          muti: 'muti'
+        },
+        config: {
+          even:true,
+          checkName: 'LAY_CHECKED', //鏄惁閫変腑鐘舵�佺殑瀛楁鍚�
+          indexName: 'LAY_TABLE_INDEX', //鍒濆涓嬫爣绱㈠紩鍚嶏紝鐢ㄤ簬鎭㈠鎺掑簭
+          remoteSort: true,//weidy@2018-03-05 鏄惁浣跨敤鍚庡彴鏉ユ帓搴�
+          checkOnSelect: true,//weidy@2018-05-17 鍗曢�夎鐨勬椂鍊欒嚜鍔ㄥ嬀閫�
+          selectMode: 'single'//weidy@2018-05-17 鏁版嵁鍗曢�夎繕鏄閫夛紝涓昏鍦╟heckOnSelect=true鐨勬椂鍊欏垽鏂槸鍚︽竻闄ゅ叾浠栬鐨勫閫夋
+        } //鍏ㄥ眬閰嶇疆椤�
+        , cache: {} //鏁版嵁缂撳瓨
+        , index: layui.table ? (layui.table.index + 10000) : 0
+
+        //璁剧疆鍏ㄥ眬椤�
+        , set: function (options) {
+          var that = this;
+          that.config = $.extend({}, that.config, options);
+          return that;
+        }
+
+        //浜嬩欢
+        , on: function (events, callback) {
+          return layui.onevent.call(this, MOD_NAME, events, callback);
+        }
+      }
+
+  //鎿嶄綔褰撳墠瀹炰緥
+  ,thisTable = function() {
+        var that = this
+            , options = that.config
+            , id = options.id || options.index;
+
+        if (id) {
+          thisTable.that[id] = that; //璁板綍褰撳墠瀹炰緥瀵硅薄
+          thisTable.config[id] = options; //璁板綍褰撳墠瀹炰緥閰嶇疆椤�
+        }
+
+        return {
+          config: options
+          , reload: function (options, deep) {
+            that.reload.call(that, options, deep);
+          }
+          , setColsWidth: function () {
+            that.setColsWidth.call(that);
+          }
+          , resize: function () { //閲嶇疆琛ㄦ牸灏哄/缁撴瀯
+            that.resize.call(that);
+          }
+        }
+      }
+
+  //鑾峰彇褰撳墠瀹炰緥閰嶇疆椤�
+  ,getThisTableConfig = function(id){
+    var config = thisTable.config[id];
+    if(!config) hint.error(id ? ('The table instance with ID \''+ id +'\' not found') : 'ID argument required');
+    return config || null;
+  }
+
+  //瑙f瀽鑷畾涔夋ā鏉挎暟鎹�
+  ,parseTempData = function(item3, content, tplData, text){ //琛ㄥご鏁版嵁銆佸師濮嬪唴瀹广�佽〃浣撴暟鎹�佹槸鍚﹀彧杩斿洖鏂囨湰
+    var options = this.config || {};
+
+    //鏄惁闃� xss
+    if(options.escape) content = util.escape(content);
+    //鑾峰彇鍐呭
+    var str = item3.templet ? function(){
+      if(typeof item3.templet === 'function'){
+        return item3.templet(tplData,item3)
+      }else if(typeof (item3.templet) == 'string' && $webUtil.isNotNull(item3.templet) && item3.templet.indexOf("function(d)")>-1){
+        item3.templet=eval("(" + item3.templet + ")");
+        return item3.templet(tplData,item3)
+      }else{
+        return laytpl($(item3.templet).html() || String(content)).render(tplData)
+      }
+    }() : content;
+    return text ? $('<div>'+ str +'</div>').text() : str;
+  }
+
+  //瀛楃甯搁噺
+  ,MOD_NAME = 'table', ELEM = '.layui-table', THIS = 'layui-this', SHOW = 'layui-show', HIDE = 'layui-hide', DISABLED = 'layui-disabled', NONE = 'layui-none'
+
+  ,ELEM_VIEW = 'layui-table-view', ELEM_TOOL = '.layui-table-tool', ELEM_BOX = '.layui-table-box', ELEM_INIT = '.layui-table-init', ELEM_HEADER = '.layui-table-header', ELEM_BODY = '.layui-table-body', ELEM_MAIN = '.layui-table-main', ELEM_FIXED = '.layui-table-fixed', ELEM_FIXL = '.layui-table-fixed-l', ELEM_FIXR = '.layui-table-fixed-r', ELEM_TOTAL = '.layui-table-total', ELEM_PAGE = '.layui-table-page', ELEM_SORT = '.layui-table-sort', ELEM_EDIT = 'layui-table-edit', ELEM_HOVER = 'layui-table-hover'
+
+  //thead鍖哄煙妯℃澘
+  ,TPL_HEADER = function(options){
+    var rowCols = '{{#if(item2.colspan){}} colspan="{{item2.colspan}}"{{#} if(item2.rowspan){}} rowspan="{{item2.rowspan}}"{{#}}}';
+
+    options = options || {};
+    return ['<table cellspacing="0" cellpadding="0" border="0" class="layui-table" '
+      ,'{{# if(d.data.skin){ }}lay-skin="{{d.data.skin}}"{{# } }} {{# if(d.data.size){ }}lay-size="{{d.data.size}}"{{# } }} {{# if(d.data.even){ }}lay-even{{# } }}>'
+      ,'<thead>'
+      ,'{{# layui.each(d.data.cols, function(i1, item1){ }}'
+        ,'<tr>'
+        ,'{{# layui.each(item1, function(i2, item2){ }}'
+          ,'{{# if(layui.device().ie && !item2.minWidth){ item2.minWidth=item2.width } }}'
+          ,'{{# if(item2.fixed && item2.fixed !== "right"){ left = true; } }}'
+          ,'{{# if(item2.fixed === "right"){ right = true; } }}'
+          ,function(){
+            if(options.fixed && options.fixed !== 'right'){
+              return '{{# if(item2.fixed && item2.fixed !== "right"){ }}';
+            }
+            if(options.fixed === 'right'){
+              return '{{# if(item2.fixed === "right"){ }}';
+            }
+            return '';
+          }()
+          ,'{{# var isSort = !(item2.colGroup) && item2.sort; }}'
+          ,'<th data-field="{{ item2.field.split(\',\')[0]||i2 }}" data-key="{{d.index}}-{{i1}}-{{i2}}" {{# if( item2.parentKey){ }}data-parentkey="{{ item2.parentKey }}"{{# } }} {{# if(item2.minWidth){ }}data-minwidth="{{item2.minWidth}}"{{# } }} '+ rowCols +' {{# if(item2.unresize || item2.colGroup){ }}data-unresize="true"{{# } }} class="{{# if(item2.hide||item2.hidden){ }}layui-hide{{# } }}{{# if(isSort){ }} layui-unselect{{# } }}{{# if(!item2.field.split(\',\')[0]){ }} layui-table-col-special{{# } }}">'
+            ,'<div class="layui-table-cell laytable-cell-'
+              ,'{{# if(item2.colGroup){ }}'
+                ,'group'
+              ,'{{# } else { }}'
+                ,'{{d.index}}-{{i1}}-{{i2}}'
+                ,'{{# if(item2.type !== "normal"){ }}'
+                  ,' laytable-cell-{{ item2.type }}'
+                ,'{{# } }}'
+              ,'{{# } }}'
+            ,'" {{#if(item2.align||item2.titleAlign){}}align="{{item2.align||item2.titleAlign}}"{{#}}}>'
+              ,'{{# if(item2.type === "checkbox"){ }}' //澶嶉�夋
+                ,'<input type="checkbox" name="layTableCheckbox" lay-skin="primary" lay-filter="layTableAllChoose" {{# if(item2[d.data.checkName]){ }}checked{{# }; }}>'
+              ,'{{# } else { }}'
+                ,'<span>{{item2.title||""}}</span>'
+                ,'{{# if(isSort){ }}'
+                  ,'<span class="layui-table-sort layui-inline"><i class="layui-edge layui-table-sort-asc" title="鍗囧簭"></i><i class="layui-edge layui-table-sort-desc" title="闄嶅簭"></i></span>'
+                ,'{{# } }}'
+              ,'{{# } }}'
+            ,'</div>'
+          ,'</th>'
+          ,(options.fixed ? '{{# }; }}' : '')
+        ,'{{# }); }}'
+        ,'</tr>'
+      ,'{{# }); }}'
+      ,'</thead>'
+    ,'</table>'].join('');
+  }
+
+  //tbody鍖哄煙妯℃澘
+  ,TPL_BODY = ['<table cellspacing="0" cellpadding="0" border="0" class="layui-table" '
+    ,'{{# if(d.data.skin){ }}lay-skin="{{d.data.skin}}"{{# } }} {{# if(d.data.size){ }}lay-size="{{d.data.size}}"{{# } }} {{# if(d.data.even){ }}lay-even{{# } }}>'
+    ,'<tbody></tbody>'
+  ,'</table>'].join('')
+
+  //涓绘ā鏉�
+  ,TPL_MAIN = ['<div class="layui-form layui-border-box {{d.VIEW_CLASS}}{{# if(d.data.className){ }} {{ d.data.className }}{{# } }}" lay-filter="LAY-table-{{d.index}}" lay-id="{{ d.data.id }}" style="{{# if(d.data.width){ }}width:{{d.data.width}}px;{{# } }} {{# if(d.data.height){ }}height:{{d.data.height}}px;{{# } }}">'
+
+    ,'{{# if(d.data.toolbar){ }}'
+    ,'<div class="layui-table-tool">'
+      ,'<div class="layui-table-tool-temp"></div>'
+      ,'<div class="layui-table-tool-self"></div>'
+    ,'</div>'
+    ,'{{# } }}'
+
+    ,'<div class="layui-table-box">'
+      ,'{{# if(d.data.loading){ }}'
+      ,'<div class="layui-table-init" style="background-color: #fff;">'
+        ,'<i class="layui-icon layui-icon-loading layui-anim layui-anim-rotate layui-anim-loop"></i>'
+      ,'</div>'
+      ,'{{# } }}'
+
+      ,'{{# var left, right; }}'
+      ,'<div class="layui-table-header">'
+        ,TPL_HEADER()
+      ,'</div>'
+      ,'<div class="layui-table-body layui-table-main">'
+        ,TPL_BODY
+      ,'</div>'
+
+      ,'{{# if(left){ }}'
+      ,'<div class="layui-table-fixed layui-table-fixed-l">'
+        ,'<div class="layui-table-header">'
+          ,TPL_HEADER({fixed: true})
+        ,'</div>'
+        ,'<div class="layui-table-body">'
+          ,TPL_BODY
+        ,'</div>'
+      ,'</div>'
+      ,'{{# }; }}'
+
+      ,'{{# if(right){ }}'
+      ,'<div class="layui-table-fixed layui-table-fixed-r">'
+        ,'<div class="layui-table-header">'
+          ,TPL_HEADER({fixed: 'right'})
+          ,'<div class="layui-table-mend"></div>'
+        ,'</div>'
+        ,'<div class="layui-table-body">'
+          ,TPL_BODY
+        ,'</div>'
+      ,'</div>'
+      ,'{{# }; }}'
+    ,'</div>'
+
+    ,'{{# if(d.data.totalRow){ }}'
+      ,'<div class="layui-table-total">'
+        ,'<table cellspacing="0" cellpadding="0" border="0" class="layui-table" '
+        ,'{{# if(d.data.skin){ }}lay-skin="{{d.data.skin}}"{{# } }} {{# if(d.data.size){ }}lay-size="{{d.data.size}}"{{# } }} {{# if(d.data.even){ }}lay-even{{# } }}>'
+          ,'<tbody><tr><td><div class="layui-table-cell" style="visibility: hidden;">Total</div></td></tr></tbody>'
+      , '</table>'
+      ,'</div>'
+    ,'{{# } }}'
+
+    ,'{{# if(d.data.page){ }}'
+    ,'<div class="layui-table-page">'
+      ,'<div id="layui-table-page{{d.index}}"></div>'
+    ,'</div>'
+    ,'{{# } }}'
+
+    ,'<style type="text/css">'
+    ,'{{# layui.each(d.data.cols, function(i1, item1){'
+      ,'layui.each(item1, function(i2, item2){ }}'
+        ,'.laytable-cell-{{d.index}}-{{i1}}-{{i2}}{ '
+        ,'{{# if(item2.width){ }}'
+          ,'width: {{item2.width}}px;'
+        ,'{{# } }}'
+        ,' }'
+      ,'{{# });'
+    ,'}); }}'
+    ,'</style>'
+  ,'</div>'].join('')
+
+  ,_WIN = $(window)
+  ,_DOC = $(document)
+
+  //鏋勯�犲櫒
+  ,Class = function(options){
+    var that = this;
+    that.index = ++table.index;
+    that.config = $.extend({}, that.config, table.config, options);
+    that.render();
+  };
+
+  //鍒濆榛樿閰嶇疆
+  Class.prototype.config = {
+    limit: 10 //姣忛〉鏄剧ず鐨勬暟閲�
+    ,loading: true //璇锋眰鏁版嵁鏃讹紝鏄惁鏄剧ず loading
+    ,cellMinWidth: 60 //鎵�鏈夊崟鍏冩牸榛樿鏈�灏忓搴�
+    ,defaultToolbar: ['filter', 'exports', 'print'] //宸ュ叿鏍忓彸渚у浘鏍�
+    ,autoSort: true //鏄惁鍓嶇鑷姩鎺掑簭銆傚鏋滃惁锛屽垯闇�鑷富鎺掑簭锛堥�氬父涓烘湇鍔$澶勭悊濂芥帓搴忥級
+    ,text: {
+      none: '鏃犳暟鎹�'
+    }
+  };
+
+  //琛ㄦ牸娓叉煋
+  Class.prototype.render = function(){
+    var that = this
+    ,options = that.config;
+
+    options.elem = $(options.elem);
+    options.where = options.where || {};
+    options.id = options.id || options.elem.attr('id') || that.index;
+
+    //璇锋眰鍙傛暟鐨勮嚜瀹氫箟鏍煎紡
+    options.request = $.extend({
+      pageName: 'page'
+      ,limitName: 'limit'
+      ,orderName:'order',//weidy@2018-03-05浣跨敤鎺掑簭鐨勭殑绫诲瀷锛� asc ,desc
+      sortName:'sort'//鎺掑簭鐨勫瓧娈碉紝
+    }, options.request)
+
+    //鍝嶅簲鏁版嵁鐨勮嚜瀹氫箟鏍煎紡
+    options.response = $.extend({
+      statusName: 'code' //瑙勫畾鏁版嵁鐘舵�佺殑瀛楁鍚嶇О
+      ,statusCode: 200 //瑙勫畾鎴愬姛鐨勭姸鎬佺爜   weidy@2020/2/24 淇敼姝g‘鐨勭姸鎬佺爜锛屼互鍓�0
+      ,msgName: 'msg' //瑙勫畾鐘舵�佷俊鎭殑瀛楁鍚嶇О
+      ,dataName: 'data' //瑙勫畾鏁版嵁鎬绘暟鐨勫瓧娈靛悕绉�
+      ,totalRowName: 'totalRow' //瑙勫畾鏁版嵁缁熻鐨勫瓧娈靛悕绉�
+      ,countName: 'total'  //weidy@2018-03-05淇敼榛樿鐨勫睘鎬э紝鍘熶负count
+    }, options.response);
+
+    //濡傛灉 page 浼犲叆 laypage 瀵硅薄
+    if(typeof options.page === 'object'){
+      options.limit = options.page.limit || options.limit;
+      options.limits = options.page.limits || options.limits;
+      that.page = options.page.curr = options.page.curr || 1;
+      delete options.page.elem;
+      delete options.page.jump;
+    }
+
+    if(!options.elem[0]) return that;
+
+    //楂樺害閾烘弧锛歠ull-宸窛鍊�
+    if(options.height && /^full-\d+$/.test(options.height)){
+      that.fullHeightGap = options.height.split('-')[1];
+      options.height = _WIN.height() - that.fullHeightGap;
+    }
+
+    //鍒濆鍖栦竴浜涘弬鏁�
+    that.setInit();
+
+    //寮�濮嬫彃鍏ユ浛浠e厓绱�
+    var othis = options.elem
+    ,hasRender = othis.next('.' + ELEM_VIEW)
+
+    //涓诲鍣�
+    ,reElem = that.elem = $(laytpl(TPL_MAIN).render({
+      VIEW_CLASS: ELEM_VIEW
+      ,data: options
+      ,index: that.index //绱㈠紩
+    }));
+
+    options.index = that.index;
+    that.key = options.id || options.index;
+
+    //鐢熸垚鏇夸唬鍏冪礌
+    hasRender[0] && hasRender.remove(); //濡傛灉宸茬粡娓叉煋锛屽垯Rerender
+    othis.after(reElem);
+
+    //鍚勭骇瀹瑰櫒
+    that.layTool = reElem.find(ELEM_TOOL);
+    that.layBox = reElem.find(ELEM_BOX);
+    that.layHeader = reElem.find(ELEM_HEADER);
+    that.layMain = reElem.find(ELEM_MAIN);
+    that.layBody = reElem.find(ELEM_BODY);
+    that.layFixed = reElem.find(ELEM_FIXED);
+    that.layFixLeft = reElem.find(ELEM_FIXL);
+    that.layFixRight = reElem.find(ELEM_FIXR);
+    that.layTotal = reElem.find(ELEM_TOTAL);
+    that.layPage = reElem.find(ELEM_PAGE);
+
+    //鍒濆鍖栧伐鍏锋爮
+    that.renderToolbar();
+
+    //璁╄〃鏍煎钩閾�
+    that.fullSize();
+
+    //濡傛灉澶氱骇琛ㄥご锛屽垯濉ˉ琛ㄥご楂樺害
+    if(options.cols.length > 1){
+      //琛ュ叏楂樺害
+      var th = that.layFixed.find(ELEM_HEADER).find('th');
+      th.height(that.layHeader.height() - 1 - parseFloat(th.css('padding-top')) - parseFloat(th.css('padding-bottom')));
+    }
+
+    that.pullData(that.page); //璇锋眰鏁版嵁
+    that.events(); //浜嬩欢
+  };
+
+  //鏍规嵁鍒楃被鍨嬶紝瀹氬埗鍖栧弬鏁�
+  Class.prototype.initOpts = function(item){
+    var that = this
+    ,options = that.config
+    ,initWidth = {
+      checkbox: 48
+      ,radio: 48
+      ,space: 15
+      ,numbers: 40
+    };
+
+    //璁� type 鍙傛暟鍏煎鏃х増鏈�
+    if(item.checkbox) item.type = "checkbox";
+    if(item.space) item.type = "space";
+    if(!item.type) item.type = "normal";
+
+    if(item.type !== "normal"){
+      item.unresize = true;
+      item.width = item.width || initWidth[item.type];
+    }
+  };
+
+  //鍒濆鍖栦竴浜涘弬鏁�
+  Class.prototype.setInit = function(type){
+    var that = this
+    ,options = that.config;
+
+    options.clientWidth = options.width || function(){ //鑾峰彇瀹瑰櫒瀹藉害
+      //濡傛灉鐖跺厓绱犲搴︿负0锛堜竴鑸负闅愯棌鍏冪礌锛夛紝鍒欑户缁煡鎵句笂灞傚厓绱狅紝鐩村埌鎵惧埌鐪熷疄瀹藉害涓烘
+      var getWidth = function(parent){
+        var width, isNone;
+        parent = parent || options.elem.parent()
+        width = parent.width();
+        try {
+          isNone = parent.css('display') === 'none';
+        } catch(e){}
+        if(parent[0] && (!width || isNone)) return getWidth(parent.parent());
+        return width;
+      };
+      return getWidth();
+    }();
+
+    if(type === 'width') return options.clientWidth;
+
+    //鍒濆鍖栧垪鍙傛暟
+    layui.each(options.cols, function(i1, item1){
+      layui.each(item1, function(i2, item2){
+
+        //濡傛灉鍒楀弬鏁颁负绌猴紝鍒欑Щ闄�
+        if(!item2){
+          item1.splice(i2, 1);
+          return;
+        }
+
+        item2.key = i1 + '-' + i2;
+        item2.hide = item2.hide || item2.hidden || false;
+
+        //璁剧疆鍒楃殑鐖跺垪绱㈠紩
+        //濡傛灉鏄粍鍚堝垪锛屽垯鎹曡幏瀵瑰簲鐨勫瓙鍒�
+        if(item2.colGroup || item2.colspan > 1){
+          var childIndex = 0;
+          layui.each(options.cols[i1 + 1], function(i22, item22){
+            //濡傛灉瀛愬垪宸茬粡琚爣娉ㄤ负{HAS_PARENT}锛屾垨鑰呭瓙鍒楃疮璁� colspan 鏁扮瓑浜庣埗鍒楀畾涔夌殑 colspan锛屽垯璺冲嚭褰撳墠瀛愬垪寰幆
+            if(item22.HAS_PARENT || (childIndex > 1 && childIndex == item2.colspan)) return;
+
+            item22.HAS_PARENT = true;
+            item22.parentKey = i1 + '-' + i2;
+
+            childIndex = childIndex + parseInt(item22.colspan > 1 ? item22.colspan : 1);
+          });
+          item2.colGroup = true; //鏍囨敞鏄粍鍚堝垪
+        }
+
+        //鏍规嵁鍒楃被鍨嬶紝瀹氬埗鍖栧弬鏁�
+        that.initOpts(item2);
+      });
+    });
+
+  };
+
+  //鍒濆宸ュ叿鏍�
+  Class.prototype.renderToolbar = function(){
+    var that = this
+    ,options = that.config
+
+    //娣诲姞宸ュ叿鏍忓乏渚фā鏉�
+    var leftDefaultTemp = [
+      '<div class="layui-inline" lay-event="add"><i class="layui-icon layui-icon-add-1"></i></div>'
+      ,'<div class="layui-inline" lay-event="update"><i class="layui-icon layui-icon-edit"></i></div>'
+      ,'<div class="layui-inline" lay-event="delete"><i class="layui-icon layui-icon-delete"></i></div>'
+    ].join('')
+    ,elemToolTemp = that.layTool.find('.layui-table-tool-temp');
+
+    if(options.toolbar === 'default'){
+      elemToolTemp.html(leftDefaultTemp);
+    } else if(typeof options.toolbar === 'string'){
+      var toolbarHtml = $(options.toolbar).html() || '';
+      toolbarHtml && elemToolTemp.html(
+        laytpl(toolbarHtml).render(options)
+      );
+    }
+
+    //娣诲姞宸ュ叿鏍忓彸渚ч潰鏉�
+    var layout = {
+      filter: {
+        title: '绛涢�夊垪'
+        ,layEvent: 'LAYTABLE_COLS'
+        ,icon: 'layui-icon-cols'
+      }
+      ,exports: {
+        title: '瀵煎嚭'
+        ,layEvent: 'LAYTABLE_EXPORT'
+        ,icon: 'layui-icon-export'
+      }
+      ,print: {
+        title: '鎵撳嵃'
+        ,layEvent: 'LAYTABLE_PRINT'
+        ,icon: 'layui-icon-print'
+      }
+    }, iconElem = [];
+
+    if(typeof options.defaultToolbar === 'object'){
+      layui.each(options.defaultToolbar, function(i, item){
+        var thisItem = typeof item === 'string' ? layout[item] : item;
+        if(thisItem){
+          iconElem.push('<div class="layui-inline" title="'+ thisItem.title +'" lay-event="'+ thisItem.layEvent +'">'
+            +'<i class="layui-icon '+ thisItem.icon +'"></i>'
+          +'</div>');
+        }
+      });
+    }
+    that.layTool.find('.layui-table-tool-self').html(iconElem.join(''));
+  }
+
+  //鍚屾琛ㄥご鐖跺垪鐨勭浉鍏冲��
+  Class.prototype.setParentCol = function(hide, parentKey){
+    var that = this
+    ,options = that.config
+
+    ,parentTh = that.layHeader.find('th[data-key="'+ options.index +'-'+ parentKey +'"]') //鑾峰彇鐖跺垪鍏冪礌
+    ,parentColspan = parseInt(parentTh.attr('colspan')) || 0;
+
+    if(parentTh[0]){
+      var arrParentKey = parentKey.split('-')
+      ,getThisCol = options.cols[arrParentKey[0]][arrParentKey[1]];
+
+      hide ? parentColspan-- : parentColspan++;
+
+      parentTh.attr('colspan', parentColspan);
+      parentTh[parentColspan < 1 ? 'addClass' : 'removeClass'](HIDE);
+
+      getThisCol.colspan = parentColspan; //鍚屾 colspan 鍙傛暟
+      getThisCol.hide = parentColspan < 1; //鍚屾 hide 鍙傛暟
+
+      //閫掑綊锛岀户缁線涓婃煡璇㈡槸鍚︽湁鐖跺垪
+      var nextParentKey = parentTh.data('parentkey');
+      nextParentKey && that.setParentCol(hide, nextParentKey);
+    }
+  };
+
+  //澶氱骇琛ㄥご琛ヤ竵
+  Class.prototype.setColsPatch = function(){
+    var that = this
+    ,options = that.config
+
+    //鍚屾琛ㄥご鐖跺垪鐨勭浉鍏冲��
+    layui.each(options.cols, function(i1, item1){
+      layui.each(item1, function(i2, item2){
+        if(item2.hide || item2.hidden){
+          that.setParentCol(item2.hide|| item2.hidden, item2.parentKey);
+        }
+      });
+    });
+  };
+
+  //鍔ㄦ�佸垎閰嶅垪瀹�
+  Class.prototype.setColsWidth = function(){
+    var that = this
+    ,options = that.config
+    ,colNums = 0 //鍒椾釜鏁�
+    ,autoColNums = 0 //鑷姩鍒楀鐨勫垪涓暟
+    ,autoWidth = 0 //鑷姩鍒楀垎閰嶇殑瀹藉害
+    ,countWidth = 0 //鎵�鏈夊垪鎬诲搴﹀拰
+    ,cntrWidth = that.setInit('width');
+
+    //缁熻鍒椾釜鏁�
+    that.eachCols(function(i, item){
+      item.hide || colNums++;
+    });
+
+    //鍑忓幓杈规宸拰婊氬姩鏉″
+    cntrWidth = cntrWidth - function(){
+      return (options.skin === 'line' || options.skin === 'nob') ? 2 : colNums + 1;
+    }() - that.getScrollWidth(that.layMain[0]) - 1;
+
+    //璁$畻鑷姩鍒嗛厤鐨勫搴�
+    var getAutoWidth = function(back){
+      //閬嶅巻鎵�鏈夊垪
+      layui.each(options.cols, function(i1, item1){
+        layui.each(item1, function(i2, item2){
+          var width = 0
+          ,minWidth = item2.minWidth || options.cellMinWidth; //鏈�灏忓搴�
+
+          if(!item2){
+            item1.splice(i2, 1);
+            return;
+          }
+
+          if(item2.colGroup || item2.hide) return;
+
+          if(!back){
+            width = item2.width || 0;
+            if(/\d+%$/.test(width)){ //鍒楀涓虹櫨鍒嗘瘮
+              width = Math.floor((parseFloat(width) / 100) * cntrWidth);
+              width < minWidth && (width = minWidth);
+            } else if(!width){ //鍒楀鏈~鍐�
+              item2.width = width = 0;
+              autoColNums++;
+            }
+          } else if(autoWidth && autoWidth < minWidth){
+            autoColNums--;
+            width = minWidth;
+          }
+
+          if(item2.hide) width = 0;
+          countWidth = countWidth + width;
+        });
+      });
+
+      //濡傛灉鏈~鍏呮弧锛屽垯灏嗗墿浣欏搴﹀钩鍒�
+      (cntrWidth > countWidth && autoColNums) && (
+        autoWidth = (cntrWidth - countWidth) / autoColNums
+      );
+    }
+
+    getAutoWidth();
+    getAutoWidth(true); //閲嶆柊妫�娴嬪垎閰嶇殑瀹藉害鏄惁浣庝簬鏈�灏忓垪瀹�
+
+    //璁板綍鑷姩鍒楁暟
+    that.autoColNums = autoColNums;
+
+    //璁剧疆鍒楀
+    that.eachCols(function(i3, item3){
+      var minWidth = item3.minWidth || options.cellMinWidth;
+      if(item3.colGroup || item3.hide) return;
+
+      //缁欎綅鍒嗛厤瀹界殑鍒楀钩鍧囧垎閰嶅
+      if(item3.width === 0){
+        that.getCssRule(options.index +'-'+ item3.key, function(item){
+          item.style.width = Math.floor(autoWidth >= minWidth ? autoWidth : minWidth) + 'px';
+        });
+      }
+
+      //缁欒瀹氱櫨鍒嗘瘮鐨勫垪鍒嗛厤鍒楀
+      else if(/\d+%$/.test(item3.width)){
+        that.getCssRule(options.index +'-'+ item3.key, function(item){
+          item.style.width = Math.floor((parseFloat(item3.width) / 100) * cntrWidth) + 'px';
+        });
+      }
+    });
+
+    //濉ˉ Math.floor 閫犳垚鐨勬暟宸�
+    var patchNums = that.layMain.width() - that.getScrollWidth(that.layMain[0])
+    - that.layMain.children('table').outerWidth();
+
+    if(that.autoColNums && patchNums >= -colNums && patchNums <= colNums){
+      var getEndTh = function(th){
+        var field;
+        th = th || that.layHeader.eq(0).find('thead th:last-child')
+        field = th.data('field');
+        if(!field && th.prev()[0]){
+          return getEndTh(th.prev())
+        }
+        return th
+      }
+      ,th = getEndTh()
+      ,key = th.data('key');
+
+      that.getCssRule(key, function(item){
+        var width = item.style.width || th.outerWidth();
+        item.style.width = (parseFloat(width) + patchNums) + 'px';
+
+        //浜屾鏍¢獙锛屽鏋滀粛鐒跺嚭鐜版í鍚戞粴鍔ㄦ潯锛堥�氬父鏄� 1px 鐨勮宸鑷达級
+        if(that.layMain.height() - that.layMain.prop('clientHeight') > 0){
+          item.style.width = (parseFloat(item.style.width) - 1) + 'px';
+        }
+      });
+    }
+
+    that.loading(!0);
+  };
+
+  //閲嶇疆琛ㄦ牸灏哄/缁撴瀯
+  Class.prototype.resize = function(){
+    var that = this;
+    that.fullSize(); //璁╄〃鏍奸摵婊�
+    that.setColsWidth(); //鑷�傚簲鍒楀
+    that.scrollPatch(); //婊氬姩鏉¤ˉ涓�
+  };
+
+  //琛ㄦ牸閲嶈浇
+  Class.prototype.reload = function(options, deep){
+    var that = this;
+
+    options = options || {};
+    delete that.haveInit;
+
+    //闃叉鏁扮粍娣卞害鍚堝苟
+    layui.each(options, function(key, item){
+      if(layui._typeof(item) === 'array') delete that.config[key];
+    });
+
+    //瀵瑰弬鏁拌繘琛屾繁搴︽垨娴呮墿灞�
+    that.config = $.extend(deep||true, {}, that.config, options);
+
+    //鎵ц娓叉煋
+    that.render();
+  };
+
+  //寮傚父鎻愮ず
+  Class.prototype.errorView = function(html){
+    var that = this
+    ,elemNone = that.layMain.find('.'+ NONE)
+    ,layNone = $('<div class="'+ NONE +'">'+ (html || 'Error') +'</div>');
+
+    if(elemNone[0]){
+      that.layNone.remove();
+      elemNone.remove();
+    }
+
+    that.layFixed.addClass(HIDE);
+    that.layMain.find('tbody').html('');
+
+    that.layMain.append(that.layNone = layNone);
+
+    table.cache[that.key] = []; //鏍煎紡鍖栫紦瀛樻暟鎹�
+  };
+
+  //椤电爜
+  Class.prototype.page = 1;
+
+  //鑾峰緱鏁版嵁
+  Class.prototype.pullData = function(curr){
+    var that = this
+    ,options = that.config
+    ,request = options.request
+    ,response = options.response
+    ,sort = function(){
+      if(options.initSort && typeof options.initSort === 'object'){
+        that.sort((options.initSort.sortField||options.initSort.field), options.initSort.type);
+      }
+    };
+
+    that.startTime = new Date().getTime(); //娓叉煋寮�濮嬫椂闂�
+
+    if(options.url) { //Ajax璇锋眰
+      var params = {};
+      if (options.page) {
+        params[request.pageName] = curr;
+        params[request.limitName] = options.limit;
+      } else {
+        params[request.pageName] = 1;
+        params[request.limitName] = -1;
+      }
+      if (options.remoteSort && that.sortKey) {
+        params[request.orderName] = that.sortKey.sort;//鏂规硶
+        params[request.sortName] = that.sortKey.field;//瀛楁
+      }
+      var sourceDataParams = {}
+      if (options.sourceDataParams) {
+        //璇存槑鏄墿灞曞睘鎬�
+        for (var key in options.sourceDataParams) {
+          if (key && key.constructor === Object) return;
+          sourceDataParams['sourceData["' + key + '"]'] = options.sourceDataParams[key];//鏂扮殑鏂瑰紡
+        }
+      }
+
+      //鍙傛暟
+      var paramsData = $.extend(params, options.where, options.extraParams,options.queryParams, sourceDataParams);
+      /*if(options.contentType && options.contentType.indexOf("application/json") == 0){ //鎻愪氦 json 鏍煎紡
+        data = JSON.stringify(data);
+      }*/
+
+      that.loading();
+
+      $webUtil.ajax(options.method || 'get', options.url, paramsData, function (res) {
+        //濡傛灉鏈夋暟鎹В鏋愮殑鍥炶皟锛屽垯鑾峰緱鍏惰繑鍥炵殑鏁版嵁
+        if (typeof options.parseData === 'function') {
+          res = options.parseData(res) || res;
+        }
+        //妫�鏌ユ暟鎹牸寮忔槸鍚︾鍚堣鑼�
+        if (res[response.statusName] != response.statusCode) {
+          that.renderForm();
+          that.errorView(res[response.msgName] || '杩斿洖鐨勬暟鎹姸鎬佸紓甯�');
+        } else {
+          that.renderData(res, curr, res[response.countName], !options.remoteSort);
+          if (options.remoteSort && that.sortKey) {
+            //璇存槑鏄粠鍚庡彴鍘绘帓搴忕殑锛屽氨涓嶉渶瑕佸墠绔帓搴忎簡
+          } else {
+            sort();
+          }
+          options.time = (new Date().getTime() - that.startTime) + ' ms'; //鑰楁椂锛堟帴鍙h姹�+瑙嗗浘娓叉煋锛�
+        }
+        that.setColsWidth();
+        typeof options.done === 'function' && options.done(res, curr, res[response.countName]);
+      }, function (e, msg) {
+        that.errorView('鏁版嵁鎺ュ彛璇锋眰寮傚父锛岄敊璇彁绀猴細' + msg);
+        that.renderForm();
+        that.setColsWidth();
+        $webUtil.showDebugMsg(msg);
+        typeof options.error === 'function' && options.error(e, msg);
+      }, options.backPath,true);
+    } else if(layui._typeof(options.data) === 'array'){ //宸茬煡鏁版嵁
+      var res = {}
+      ,startLimit = curr*options.limit - options.limit
+      if(options.limit > 0){
+        res[response.dataName] = options.data.concat().splice(startLimit, options.limit);
+        res[response.countName] = options.data.length;
+      }else{
+        res[response.dataName] = options.data;
+        res[response.countName] = options.data.length;
+      }
+
+      //璁板綍鍚堣琛屾暟鎹�
+      if(typeof options.totalRow === 'object'){
+        res[response.totalRowName] = $.extend({}, options.totalRow);
+      }
+
+      that.renderData(res, curr, res[response.countName]), sort();
+      that.setColsWidth();
+      typeof options.done === 'function' && options.done(res, curr, res[response.countName]);
+    }else{
+      that.loading(!0);
+    }
+  };
+
+  //閬嶅巻琛ㄥご
+  Class.prototype.eachCols = function(callback){
+    var that = this;
+    table.eachCols(null, callback, that.config.cols);
+    return that;
+  };
+
+  //鏁版嵁娓叉煋
+  Class.prototype.renderData = function(res, curr, count, sort){
+    var that = this
+    ,options = that.config
+    ,data = res[options.response.dataName] || [] //鍒楄〃鏁版嵁
+    ,totalRowData = res[options.response.totalRowName] //鍚堣琛屾暟鎹�
+    ,trs = []
+    ,trs_fixed = []
+    ,trs_fixed_r = []
+
+    //娓叉煋瑙嗗浘
+    ,render = function(){ //鍚庣画鎬ц兘鎻愬崌鐨勯噸鐐�
+      var thisCheckedRowIndex;
+          if(!sort && that.sortKey && !that.config.remoteSort){
+            return that.sort((that.sortKey.sortField||that.sortKey.field), that.sortKey.sort, true);
+          }
+      layui.each(data, function(i1, item1){
+        var tds = [], tds_fixed = [], tds_fixed_r = []
+        ,numbers = i1 + options.limit*(curr - 1) + 1; //搴忓彿
+
+        //鑻ユ暟鎹」涓虹┖鏁扮粍锛屽垯涓嶅線涓嬫墽琛岋紙鍥犱负鍒犻櫎鏁版嵁鏃讹紝浼氬皢鍘熸湁鏁版嵁璁剧疆涓� []锛�
+        if(layui._typeof(item1) === 'array' && item1.length === 0) return;
+
+        //璁板綍涓嬫爣绱㈠紩锛岀敤浜庢仮澶嶆帓搴�
+        if(!sort){
+          item1[table.config.indexName] = i1;
+        }
+        if($webUtil.isNull(item1['data'])){
+          delete item1['data'];
+        }
+        var tdTemplet=options.tdTemplet ? function(){
+          return typeof options.tdTemplet === 'function'
+              ? options.tdTemplet(item1)
+              : laytpl($(options.tdTemplet).html()).render(item1)
+        }() : ''
+
+        //閬嶅巻琛ㄥご
+        that.eachCols(function(i3, item3){
+          var field = item3.field || i3
+          ,key = options.index + '-' + item3.key
+          ,content = item1[field];
+
+          if(field.indexOf("_")>-1 && field.replace("_",".") in item1){//鍙傜収瀛楁鐨勬樉绀哄��
+            content = item1[field.replace("_",".")];
+          }
+          if(field.indexOf(".")>-1 && field.split(".")[0] in item1 && item1[field.split(".")[0]][field.split(".")[1]]){//瀛楁鏄璞★紝鑾峰彇璇ュ璞′腑鐨勫��
+            content = item1[field.split(".")[0]][field.split(".")[1]];
+          }
+          if(field.indexOf(",")>-1){//涓�鍒楁樉绀哄涓瓧娈�,瀛楁涔嬮棿浠�','鍒嗘牸,鍙负瀛楃涓�
+            content = '';
+            layui.each(field.split(','), function(fi,fitem){
+              content += item1[$.trim(fitem)] || ((fitem in item1)?'':fitem);
+            })
+          }
+          if(item3.dateFormate){
+            content = $webUtil.formateDateByFormate(content,item3.dateFormate);
+          }
+
+          if(content === undefined || content === null) content = '';
+          if(item3.colGroup) return;
+          field=field.split(',')[0];
+
+          //td鍐呭
+          var td = ['<td data-field="'+ field +'" data-key="'+ key +'" '+tdTemplet+ function(){ //杩藉姞鍚勭灞炴��
+            var attr = [];
+            if(item3.edit) attr.push('data-edit="'+ item3.edit +'"'); //鏄惁鍏佽鍗曞厓鏍肩紪杈�
+            if(item3.editConfig){
+              //modify by weidy@2020-12-21
+              //澧炲姞缂栬緫鐨勬椂鍊欑殑寮瑰嚭閰嶇疆
+              attr.push("data-editConfig='"+ JSON.stringify(item3.editConfig) +"'"); //鍗曞厓鏍煎弬鐓х紪杈�
+            }
+            if(item3.align) attr.push('align="'+ item3.align +'"'); //瀵归綈鏂瑰紡
+            if(item3.templet) attr.push('data-content="'+ content +'"'); //鑷畾涔夋ā鏉�
+            if(item3.toolbar) attr.push('data-off="true"'); //琛屽伐鍏峰垪鍏抽棴鍗曞厓鏍间簨浠�
+            if(item3.event) attr.push('lay-event="'+ item3.event +'"'); //鑷畾涔変簨浠�
+            if(item3.style) attr.push('style="'+ item3.style +'"'); //鑷畾涔夋牱寮�
+            if(item3.minWidth) {
+              attr.push(' data-minwidth="'+ item3.minWidth +'"');
+              /*if(device.ie){
+                item3.style=(item3.style||'')+';min-Width:'+item3.minWidth+'px'
+              }*/
+
+            } //鍗曞厓鏍兼渶灏忓搴�
+            if(item3.colSet) attr.push(' lay-colSet="' + item3.colSet + '"');
+            return attr.join(' ');
+          }() +' class="'+ function(){ //杩藉姞鏍峰紡
+            var classNames = [];
+            if(item3.hide||item3.hidden) classNames.push(HIDE); //鎻掑叆闅愯棌鍒楁牱寮�
+            if(!item3.field) classNames.push('layui-table-col-special'); //鎻掑叆鐗规畩鍒楁牱寮�
+            return classNames.join(' ');
+          }() +'">'
+            ,'<div class="layui-table-cell laytable-cell-'+ function(){ //杩斿洖瀵瑰簲鐨凜SS绫绘爣璇�
+              return item3.type === 'normal' ? key
+              : (key + ' laytable-cell-' + item3.type);
+            }() +'">' + function(){
+              var tplData = $.extend(true, {
+                LAY_INDEX: numbers
+                ,LAY_COL: item3
+              }, item1)
+              ,checkName = table.config.checkName;
+
+              //娓叉煋涓嶅悓椋庢牸鐨勫垪
+              switch(item3.type) {
+                case 'checkbox':
+                  return '<input type="checkbox" name="layTableCheckbox" lay-skin="primary" ' + function () {
+                    //濡傛灉鏄叏閫�
+                    if (item3[checkName]) {
+                      item1[checkName] = item3[checkName];
+                      return item3[checkName] ? 'checked' : '';
+                    }
+                    return tplData[checkName] ? 'checked' : '';
+                  }() + '>';
+                  break;
+                case 'radio':
+                  if (tplData[checkName]) {
+                    thisCheckedRowIndex = i1;
+                  }
+                  thisTable.config[that.key]['radioName']='LAY_RADIO'
+                  return '<input type="radio" name="layTableRadio_' + options.index + '" '
+                      + (tplData[checkName] ? 'checked' : '') + ' lay-type="layTableRadio">';
+                  break;
+                case 'numbers':
+                  return numbers;
+                  break;
+              };
+
+              //瑙f瀽宸ュ叿鍒楁ā鏉�
+              if(item3.toolbar){
+                return laytpl($(item3.toolbar).html()||'').render(tplData);
+              }
+              return parseTempData.call(that, item3, content, tplData);
+            }()
+          ,'</div></td>'].join('');
+
+          tds.push(td);
+          if(item3.fixed && item3.fixed !== 'right') tds_fixed.push(td);
+          if(item3.fixed === 'right') tds_fixed_r.push(td);
+        });
+
+        var trTemplet=options.trTemplet ? function(){
+          return typeof options.trTemplet === 'function'
+              ? options.trTemplet(item1)
+              : laytpl($(options.trTemplet).html()).render(item1)
+        }() : ''
+        trs.push('<tr data-index="'+ i1 +'" '+trTemplet+(options.even&&i1%2==1?' class="tr_even"':'')+'>'+ tds.join('') + '</tr>');
+        trs_fixed.push('<tr data-index="'+ i1 +'">'+ tds_fixed.join('') + '</tr>');
+        trs_fixed_r.push('<tr data-index="'+ i1 +'">'+ tds_fixed_r.join('') + '</tr>');
+      });
+
+      that.layBody.scrollTop(0);
+      that.layMain.find('.'+ NONE).remove();
+      that.layMain.find('tbody').html(trs.join(''));
+      that.layFixLeft.find('tbody').html(trs_fixed.join(''));
+      that.layFixRight.find('tbody').html(trs_fixed_r.join(''));
+
+      that.renderForm();
+      typeof thisCheckedRowIndex === 'number' && that.setThisRowChecked(thisCheckedRowIndex);
+      that.syncCheckAll();
+
+      //婊氬姩鏉¤ˉ涓�
+      that.haveInit ? that.scrollPatch() : setTimeout(function(){
+        that.scrollPatch();
+      }, 50);
+      that.haveInit = true;
+
+      layer.close(that.tipsIndex);
+
+      //鍚屾琛ㄥご鐖跺垪鐨勭浉鍏冲��
+      options.HAS_SET_COLS_PATCH || that.setColsPatch();
+      options.HAS_SET_COLS_PATCH = true;
+    };
+
+    table.cache[that.key] = data; //璁板綍鏁版嵁
+
+    //鏄剧ず闅愯棌鍒嗛〉鏍�
+    that.layPage[(count == 0 || (data.length === 0 && curr == 1)) ? 'addClass' : 'removeClass'](HIDE);
+
+    //濡傛灉鏃犳暟鎹�
+    if(data.length === 0){
+      that.renderForm();
+      return that.errorView(options.text.none);
+    } else {
+      that.layFixed.removeClass(HIDE);
+    }
+
+    //濡傛灉鎵ц鍒濆鎺掑簭
+    if(sort){
+      return render();
+    }
+
+    //姝e父鍒濆鍖栨暟鎹覆鏌�
+    render(); //娓叉煋鏁版嵁
+    that.renderTotal(data, totalRowData); //鏁版嵁鍚堣
+
+    //鍚屾鍒嗛〉鐘舵��
+    if(options.page){
+      var limits=[];
+      if(options.limits && options.limits.length>0){
+        limits=options.limits
+      }else{
+        limits=[10,20,30,50,100,200,500,1000]
+        if($.inArray(options.limit,limits)<0){
+          limits.push(options.limit);
+          limits.sort(function(a, b){return a-b});
+        }
+      }
+      options.page = $.extend({
+        elem: 'layui-table-page' + options.index
+        ,count: count
+        ,limit: options.limit
+        ,limits: limits
+        ,groups: 3
+        ,layout: ['prev', 'page', 'next', 'skip', 'count', 'limit','refresh']
+        ,prev: '<i class="layui-icon">&#xe603;</i>'
+        ,next: '<i class="layui-icon">&#xe602;</i>'
+        ,jumpBefore:function(obj,first){
+          if(options.beforePageJump){
+            return options.beforePageJump(obj,first);
+          }else{
+            return true;
+          }
+        },jump: function(obj, first){
+          if(!first){
+            //鍒嗛〉鏈韩骞堕潪闇�瑕佸仛浠ヤ笅鏇存柊锛屼笅闈㈠弬鏁扮殑鍚屾锛屼富瑕佹槸鍥犱负鍏跺畠澶勭悊缁熶竴鐢ㄥ埌浜嗗畠浠�
+            //鑰屽苟闈炵敤鐨勬槸 options.page 涓殑鍙傛暟锛堜互纭繚鍒嗛〉鏈紑鍚殑鎯呭喌浠嶈兘姝e父浣跨敤锛�
+            that.page = obj.curr; //鏇存柊椤电爜
+            options.limit = obj.limit; //鏇存柊姣忛〉鏉℃暟
+
+            that.pullData(obj.curr);
+          }
+          if(options.pageJump){//weidy@2019-05-15淇敼锛屽鍔犻〉闈㈣烦杞殑鍔熻兘
+            options.pageJump(obj,first);
+          }
+        }
+      }, options.page);
+      options.page.count = count; //鏇存柊鎬绘潯鏁�
+      laypage.render(options.page);
+    }
+  };
+
+  //鏁版嵁鍚堣琛�
+  Class.prototype.renderTotal = function(data, totalRowData){
+    var that = this
+    ,options = that.config
+    ,totalNums = {};
+
+    if(!options.totalRow) return;
+
+    layui.each(data, function(i1, item1){
+      //鑻ユ暟鎹」涓虹┖鏁扮粍锛屽垯涓嶅線涓嬫墽琛岋紙鍥犱负鍒犻櫎鏁版嵁鏃讹紝浼氬皢鍘熸湁鏁版嵁璁剧疆涓� []锛�
+      if(layui._typeof(item1) === 'array' && item1.length === 0) return;
+
+      that.eachCols(function(i3, item3){
+        var field = item3.field || i3
+        ,content = item1[field];
+
+        if(item3.totalRow){
+          totalNums[field] = (totalNums[field] || 0) + (parseFloat(content) || 0);
+        }
+      });
+    });
+
+    that.dataTotal = {};
+
+    var tds = [];
+    that.eachCols(function(i3, item3){
+      var field = item3.field || i3;
+
+      //td 鍐呭
+      var content = function(){
+        var text = item3.totalRowText || ''
+        ,thisTotalNum = parseFloat(totalNums[field]).toFixed(2)
+        ,tplData = {}
+        ,getContent;
+
+        tplData[field] = thisTotalNum;
+
+        //鑾峰彇鑷姩璁$畻鐨勫悎骞跺唴瀹�
+        getContent = item3.totalRow ? (parseTempData.call(that, item3, thisTotalNum, tplData) || text) : text;
+
+        //濡傛灉鐩存帴浼犲叆浜嗗悎璁¤鏁版嵁锛屽垯涓嶈緭鍑鸿嚜鍔ㄨ绠楃殑缁撴灉
+        return totalRowData ? (totalRowData[item3.field] || getContent) : getContent;
+      }()
+      ,td = ['<td data-field="'+ field +'" data-key="'+ options.index + '-'+ item3.key +'" '+ function(){
+        var attr = [];
+        if(item3.align) attr.push('align="'+ item3.align +'"'); //瀵归綈鏂瑰紡
+        if(item3.style) attr.push('style="'+ item3.style +'"'); //鑷畾涔夋牱寮�
+        if(item3.minWidth) attr.push('data-minwidth="'+ item3.minWidth +'"'); //鍗曞厓鏍兼渶灏忓搴�
+        return attr.join(' ');
+      }() +' class="'+ function(){ //杩藉姞鏍峰紡
+        var classNames = [];
+        if(item3.hide||item3.hidden) classNames.push(HIDE); //鎻掑叆闅愯棌鍒楁牱寮�
+        if(!item3.field) classNames.push('layui-table-col-special'); //鎻掑叆鐗规畩鍒楁牱寮�
+        return classNames.join(' ');
+      }() +'">'
+        ,'<div class="layui-table-cell laytable-cell-'+ function(){ //杩斿洖瀵瑰簲鐨凜SS绫绘爣璇�
+          var str = (options.index + '-' + item3.key);
+          return item3.type === 'normal' ? str
+          : (str + ' laytable-cell-' + item3.type);
+        }() +'">' + function(){
+          var totalRow = item3.totalRow || options.totalRow;
+          //濡傛灉 totalRow 鍙傛暟涓哄瓧绗︾被鍨嬶紝鍒欒В鏋愪负鑷畾涔夋ā鐗�
+          if(typeof totalRow === 'string'){
+            return laytpl(totalRow).render($.extend({
+              TOTAL_NUMS: content
+            }, item3))
+          }
+          return content;
+        }()
+      ,'</div></td>'].join('');
+
+      item3.field && (that.dataTotal[field] = content);
+      tds.push(td);
+    });
+
+    that.layTotal.find('tbody').html('<tr>' + tds.join('') + '</tr>');
+  };
+
+  //鎵惧埌瀵瑰簲鐨勫垪鍏冪礌
+  Class.prototype.getColElem = function(parent, key){
+    var that = this
+    ,options = that.config;
+    return parent.eq(0).find('.laytable-cell-'+ (options.index + '-' + key) + ':eq(0)');
+  };
+
+  //娓叉煋琛ㄥ崟
+  Class.prototype.renderForm = function(type){
+    form.render(type, 'LAY-table-'+ this.index);
+  };
+  //鍕鹃�夎幏鍙栧彇娑堝嬀閫夊閫夋
+  Class.prototype.renderCheckbox = function(checkbox,checkboxDiv,checked){
+    form.showCheckboxCss(checkbox,checkboxDiv,checked);
+  }
+
+  //鍕鹃�夊彇娑堝嬀閫夊崟閫夋
+  Class.prototype.renderRadio = function(radio,radioDiv,checked){
+    form.showRadioCss(radio,radioDiv,checked);
+  }
+
+  //鏍囪褰撳墠琛岄�変腑鐘舵��
+  Class.prototype.setThisRowChecked = function(index){
+    var that = this
+    ,options = that.config
+    ,ELEM_CLICK = 'layui-table-click'
+    ,tr = that.layBody.find('tr[data-index="'+ index +'"]');
+
+    tr.addClass(ELEM_CLICK).siblings('tr').removeClass(ELEM_CLICK);
+  };
+
+  //鏁版嵁鎺掑簭
+  Class.prototype.sort = function(th, type, pull, formEvent) {
+    var that = this
+        , field
+        , res = {}
+        , options = that.config
+        , filter = options.elem.attr('lay-filter')
+        , data = table.cache[that.key], thisData;
+
+    //瀛楁鍖归厤
+    if (typeof th === 'string') {
+      field = th;
+      that.layHeader.find('th').each(function (i, item) {
+        var othis = $(this)
+            , _field = othis.data('field');
+        if (_field === th) {
+          th = othis;
+          field = _field;
+          return false;
+        }
+      });
+    }
+
+    try {
+      var field = field.split(',')[0].replace(/\./g, '--') || th.data('field').split(',')[0].replace(/\./g, '--'),
+      key = th.data('key');
+      if(options.cols[th.parent().index()][th.index()].sortField){
+        field=options.cols[th.parent().index()][th.index()].sortField;
+      }
+
+      //濡傛灉娆叉墽琛岀殑鎺掑簭宸插湪鐘舵�佷腑锛屽垯涓嶆墽琛屾覆鏌�
+      if (that.sortKey && !pull) {
+        if (field === that.sortKey.field && type === that.sortKey.sort) {
+          return;
+        }
+      }
+
+      var elemSort = that.layHeader.find('th .laytable-cell-' + key).find(ELEM_SORT);
+      that.layHeader.find('th').find(ELEM_SORT).removeAttr('lay-sort'); //娓呴櫎鍏跺畠鏍囬鎺掑簭鐘舵��
+      elemSort.attr('lay-sort', type || null);
+      that.layFixed.find('th')
+    } catch (e) {
+      hint.error('Table modules: sort field \'' + field + '\' not matched');
+    }
+
+    //璁板綍鎺掑簭绱㈠紩鍜岀被鍨�
+    that.sortKey = {
+      field: field
+      , sort: type
+    };
+    if (that.config.remoteSort) {
+      /**
+       * weidy@2018-03-05 澧炲姞浣跨敤鍚庡彴鏉ヨ繘琛屾帓搴�
+       */
+      if (type != 'asc' && type != 'desc') {
+        that.sortKey = {};
+      }
+      that.pullData(that.page);
+    } else {
+      //榛樿涓哄墠绔嚜鍔ㄦ帓搴忋�傚鏋滃惁锛屽垯闇�鑷富鎺掑簭锛堥�氬父涓烘湇鍔$澶勭悊濂芥帓搴忥級
+      if (type === 'asc') { //鍗囧簭
+        thisData = layui.sort(data, field);
+      } else if (type === 'desc') { //闄嶅簭
+        thisData = layui.sort(data, field, true);
+      } else { //娓呴櫎鎺掑簭
+        thisData = layui.sort(data, table.config.indexName);
+        delete that.sortKey;
+      }
+
+      res[options.response.dataName] = thisData || data;
+      that.renderData(res, that.page, that.count, true);
+    }
+    if (formEvent) {
+      layui.event.call(th, MOD_NAME, 'sort(' + filter + ')', {
+        field: field
+        , type: type
+      });
+    }
+  };
+
+  //璇锋眰loading
+  Class.prototype.loading = function(hide){
+    var that = this
+    ,options = that.config;
+    if(options.loading){
+      if(hide){
+        that.layInit && that.layInit.remove();
+        delete that.layInit;
+        that.layBox.find(ELEM_INIT).remove();
+      } else {
+        that.layInit = $(['<div class="layui-table-init">'
+          ,'<i class="layui-icon layui-icon-loading layui-anim layui-anim-rotate layui-anim-loop"></i>'
+        ,'</div>'].join(''));
+        that.layBox.append(that.layInit);
+      }
+    }
+  };
+
+  //鍚屾閫変腑鍊肩姸鎬�
+  Class.prototype.setCheckData = function(index, checked){
+    var that = this
+    ,options = that.config
+    ,thisData = table.cache[that.key];
+    if(!thisData[index]) return;
+    if(layui._typeof(thisData[index]) === 'array') return;
+    thisData[index][options.checkName] = checked;
+  };
+
+  //鍚屾鍏ㄩ�夋寜閽姸鎬�
+  Class.prototype.syncCheckAll = function(){
+    var that = this
+    ,options = that.config
+    ,checkAllElem = that.layHeader.find('input[name="layTableCheckbox"]')
+    ,syncColsCheck = function(checked){
+      that.eachCols(function(i, item){
+        if(item.type === 'checkbox'){
+          item[options.checkName] = checked;
+        }
+      });
+      return checked;
+    };
+
+    if(!checkAllElem[0]) return;
+
+    if(table.checkStatus(that.key).isAll){
+      if(!checkAllElem[0].checked){
+        checkAllElem.prop('checked', true);
+        that.renderForm('checkbox');
+      }
+      syncColsCheck(true);
+    } else {
+      if(checkAllElem[0].checked){
+        checkAllElem.prop('checked', false);
+        that.renderForm('checkbox');
+      }
+      syncColsCheck(false);
+    }
+  };
+
+  //鑾峰彇cssRule
+  Class.prototype.getCssRule = function(key, callback){
+    var that = this
+    ,style = that.elem.find('style')[0]
+    ,sheet = style.sheet || style.styleSheet || {}
+    ,rules = sheet.cssRules || sheet.rules;
+    layui.each(rules, function(i, item){
+      if(item.selectorText === ('.laytable-cell-'+ key)){
+        return callback(item), true;
+      }
+    });
+  };
+
+  //璁╄〃鏍奸摵婊�
+  Class.prototype.fullSize = function(){
+    var that = this
+    ,options = that.config
+    ,height = options.height, bodyHeight;
+
+    if(that.fullHeightGap){
+      height = _WIN.height() - that.fullHeightGap;
+      if(height < 135) height = 135;
+      that.elem.css('height', height);
+    }
+
+    if(!height) return;
+
+    //鍑忓幓鍒楀ご鍖哄煙鐨勯珮搴�
+    bodyHeight = parseFloat(height) - (that.layHeader.outerHeight() || 26); //姝ゅ鐨勬暟瀛楀父閲忔槸涓轰簡闃叉瀹瑰櫒澶勫湪闅愯棌鍖哄煙鏃犳硶鑾峰緱楂樺害鐨勯棶棰橈紝鏆傛椂鍙榛樿灏哄鐨勮〃鏍煎仛鏀寔銆�
+
+    //鍑忓幓宸ュ叿鏍忕殑楂樺害
+    if(options.toolbar){
+      bodyHeight = bodyHeight - (that.layTool.outerHeight() || 50);
+    }
+
+    //鍑忓幓缁熻鏍忕殑楂樺害
+    if(options.totalRow){
+      bodyHeight = bodyHeight - (that.layTotal.outerHeight() || 40);
+    }
+
+    //鍑忓幓鍒嗛〉鏍忕殑楂樺害
+    if(options.page){
+      bodyHeight = bodyHeight - (that.layPage.outerHeight() || 41);
+    }
+
+    //鑰佺増鏈夛紝涓嶇煡閬撴槸鑷繁鍔犵殑杩樻槸鑰佺増鑷甫鐨�
+    /*if(options.size === 'lg'){
+      bodyHeight = parseFloat(height) - 26-66;
+    }*/
+
+    that.layMain.css('height', bodyHeight - 2);
+  };
+
+  //鑾峰彇婊氬姩鏉″搴�
+  Class.prototype.getScrollWidth = function(elem){
+    var width = 0;
+    if(elem){
+      width = elem.offsetWidth - elem.clientWidth;
+    } else {
+      elem = document.createElement('div');
+      elem.style.width = '100px';
+      elem.style.height = '100px';
+      elem.style.overflowY = 'scroll';
+
+      document.body.appendChild(elem);
+      width = elem.offsetWidth - elem.clientWidth;
+      document.body.removeChild(elem);
+    }
+    return width;
+  };
+
+  //婊氬姩鏉¤ˉ涓�
+  Class.prototype.scrollPatch = function(){
+    var that = this
+    ,layMainTable = that.layMain.children('table')
+    ,scollWidth = that.layMain.width() - that.layMain.prop('clientWidth') //绾靛悜婊氬姩鏉″搴�
+    ,scollHeight = that.layMain.height() - that.layMain.prop('clientHeight') //妯悜婊氬姩鏉¢珮搴�
+    ,getScrollWidth = that.getScrollWidth(that.layMain[0]) //鑾峰彇涓诲鍣ㄦ粴鍔ㄦ潯瀹藉害锛屽鏋滄湁鐨勮瘽
+    ,outWidth = layMainTable.outerWidth() - that.layMain.width() //琛ㄦ牸鍐呭鍣ㄧ殑瓒呭嚭瀹藉害
+
+    //娣诲姞琛ヤ竵
+    ,addPatch = function(elem){
+      if(scollWidth && scollHeight){
+        elem = elem.eq(0);
+        if(!elem.find('.layui-table-patch')[0]){
+          var patchElem = $('<th class="layui-table-patch"><div class="layui-table-cell"></div></th>'); //琛ヤ竵鍏冪礌
+          patchElem.find('div').css({
+            width: scollWidth
+          });
+          elem.find('tr').append(patchElem);
+        }
+      } else {
+        elem.find('.layui-table-patch').remove();
+      }
+    }
+
+    addPatch(that.layHeader);
+    addPatch(that.layTotal);
+
+    //鍥哄畾鍒楀尯鍩熼珮搴�
+    var mainHeight = that.layMain.height()
+    ,fixHeight = mainHeight - scollHeight;
+    that.layFixed.find(ELEM_BODY).css('height', layMainTable.height() >= fixHeight ? fixHeight : 'auto');
+    //wangting 瑙e喅鍥哄畾鍒楃殑楂樺害涓庡垪琛ㄦ瘡琛岄珮搴︿笉涓�鑷寸殑闂
+    var trs=that.layFixed.find(ELEM_BODY).find('tr');
+    var mainTrs=layMainTable.find('tr')
+    $.each(trs,function (i,item){
+      $(item).find('td:first-child').css('height',mainTrs.eq($(item).index()).find('td:first-child').height()+2)
+    })
+
+    //琛ㄦ牸瀹藉害灏忎簬瀹瑰櫒瀹藉害鏃讹紝闅愯棌鍥哄畾鍒�
+    that.layFixRight[outWidth > 0 ? 'removeClass' : 'addClass'](HIDE);
+
+    //鎿嶄綔鏍�
+    that.layFixRight.css('right', scollWidth - 1);
+  };
+
+  //浜嬩欢澶勭悊
+  Class.prototype.events = function(){
+    var that = this
+    ,options = that.config
+    ,_BODY = $('body')
+    ,dict = {}
+    ,th = that.layHeader.find('th')
+    ,resizing
+    ,ELEM_CELL = '.layui-table-cell'
+    ,filter = options.elem.attr('lay-filter');
+
+    //宸ュ叿鏍忔搷浣滀簨浠�
+    that.layTool.on('click', '*[lay-event]', function(e){
+      var othis = $(this)
+      ,events = othis.attr('lay-event')
+      ,openPanel = function(sets){
+        var list = $(sets.list)
+        ,panel = $('<ul class="layui-table-tool-panel"></ul>');
+
+        panel.html(list);
+
+        //闄愬埗鏈�澶ч珮搴�
+        if(options.height){
+          panel.css('max-height', options.height - (that.layTool.outerHeight() || 50));
+        }
+
+        //鎻掑叆鍏冪礌
+        othis.find('.layui-table-tool-panel')[0] || othis.append(panel);
+        that.renderForm();
+
+        panel.on('click', function(e){
+          layui.stope(e);
+        });
+
+        sets.done && sets.done(panel, list)
+      };
+
+      layui.stope(e);
+      _DOC.trigger('table.tool.panel.remove');
+      layer.close(that.tipsIndex);
+
+      switch(events){
+        case 'LAYTABLE_COLS': //绛涢�夊垪
+          openPanel({
+            list: function(){
+              var lis = [];
+              that.eachCols(function(i, item){
+                if(item.field && item.type == 'normal'){
+                  lis.push('<li><input type="checkbox" name="'+ item.field +'" data-key="'+ item.key +'" data-parentkey="'+ (item.parentKey||'') +'" lay-skin="primary" '+ (item.hide||item.hidden ? '' : 'checked') +' title="'+ (item.title || item.field) +'" lay-filter="LAY_TABLE_TOOL_COLS"></li>');
+                }
+              });
+              return lis.join('');
+            }()
+            ,done: function(){
+              form.on('checkbox(LAY_TABLE_TOOL_COLS)', function(obj){
+                var othis = $(obj.elem)
+                ,checked = this.checked
+                ,key = othis.data('key')
+                ,parentKey = othis.data('parentkey');
+
+                layui.each(options.cols, function(i1, item1){
+                  layui.each(item1, function(i2, item2){
+                    if(i1+ '-'+ i2 === key){
+                      var hide = item2.hide || item2.hidden;
+
+                      //鍚屾鍕鹃�夊垪鐨� hide 鍊煎拰闅愯棌鏍峰紡
+                      item2.hide = item2.hidden = !checked;
+                      that.elem.find('*[data-key="'+ options.index +'-'+ key +'"]')
+                      [checked ? 'removeClass' : 'addClass'](HIDE);
+
+                      //鏍规嵁鍒楃殑鏄剧ず闅愯棌锛屽悓姝ュ绾ц〃澶寸殑鐖剁骇鐩稿叧灞炴�у��
+                      if(hide != item2.hide){
+                        that.setParentCol(!checked, parentKey);
+                      }
+
+                      //閲嶆柊閫傞厤灏哄
+                      that.resize();
+                    }
+                  });
+                });
+              });
+            }
+          });
+        break;
+        case 'LAYTABLE_EXPORT': //瀵煎嚭
+          if(device.ie){
+            layer.tips('瀵煎嚭鍔熻兘涓嶆敮鎸� IE锛岃鐢� Chrome 绛夐珮绾ф祻瑙堝櫒瀵煎嚭', this, {
+              tips: 3
+            })
+          } else {
+            openPanel({
+              list: function(){
+                return [
+                  '<li data-type="csv">瀵煎嚭鍒� Csv 鏂囦欢</li>'
+                  ,'<li data-type="xls">瀵煎嚭鍒� Excel 鏂囦欢</li>'
+                ].join('')
+              }()
+              ,done: function(panel, list){
+                list.on('click', function(){
+                  var type = $(this).data('type')
+                  table.exportFile.call(that, options.id, null, type);
+                });
+              }
+            });
+          }
+        break;
+        case 'LAYTABLE_PRINT': //鎵撳嵃
+          var printWin = window.open('鎵撳嵃绐楀彛', '_blank')
+          ,style = ['<style>'
+            ,'body{font-size: 12px; color: #666;}'
+            ,'table{width: 100%; border-collapse: collapse; border-spacing: 0;}'
+            ,'th,td{line-height: 20px; padding: 9px 15px; border: 1px solid #ccc; text-align: left; font-size: 12px; color: #666;}'
+            ,'a{color: #666; text-decoration:none;}'
+            ,'*.layui-hide{display: none}'
+          ,'</style>'].join('')
+          ,html = $(that.layHeader.html()); //杈撳嚭琛ㄥご
+
+          html.append(that.layMain.find('table').html()); //杈撳嚭琛ㄤ綋
+          html.append(that.layTotal.find('table').html()) //杈撳嚭鍚堣琛�
+
+          html.find('th.layui-table-patch').remove(); //绉婚櫎琛ヤ竵
+          html.find('.layui-table-col-special').remove(); //绉婚櫎鐗规畩鍒�
+
+          printWin.document.write(style + html.prop('outerHTML'));
+          printWin.document.close();
+          printWin.print();
+          printWin.close();
+        break;
+      }
+
+      layui.event.call(this, MOD_NAME, 'toolbar('+ filter +')', $.extend({
+        event: events
+        ,config: options
+      },{}));
+    });
+
+    //鎷栨嫿璋冩暣瀹藉害
+    th.on('mousemove', function(e){
+      var othis = $(this)
+      ,oLeft = othis.offset().left
+      ,pLeft = e.clientX - oLeft;
+      if(othis.attr('colspan') > 1 || othis.data('unresize') || dict.resizeStart){
+        return;
+      }
+      dict.allowResize = othis.width() - pLeft <= 10; //鏄惁澶勪簬鎷栨嫿鍏佽鍖哄煙
+      _BODY.css('cursor', (dict.allowResize ? 'col-resize' : ''));
+    }).on('mouseleave', function(){
+      var othis = $(this);
+      if(dict.resizeStart) return;
+      _BODY.css('cursor', '');
+    }).on('mousedown', function(e){
+      var othis = $(this);
+      if(dict.allowResize){
+        var key = othis.data('key');
+        e.preventDefault();
+        dict.resizeStart = true; //寮�濮嬫嫋鎷�
+        dict.offset = [e.clientX, e.clientY]; //璁板綍鍒濆鍧愭爣
+
+        that.getCssRule(key, function(item){
+          var width = item.style.width || othis.outerWidth();
+          dict.rule = item;
+          dict.ruleWidth = parseFloat(width);
+          dict.minWidth = othis.data('minwidth') || options.cellMinWidth;
+        });
+      }
+    });
+
+    //鎷栨嫿涓�
+    _DOC.on('mousemove', function(e){
+      if(dict.resizeStart){
+        e.preventDefault();
+        if(dict.rule){
+          var setWidth = dict.ruleWidth + e.clientX - dict.offset[0];
+          if(setWidth < dict.minWidth) setWidth = dict.minWidth;
+          dict.rule.style.width = setWidth + 'px';
+          layer.close(that.tipsIndex);
+        }
+        resizing = 1
+      }
+    }).on('mouseup', function(e){
+      if(dict.resizeStart){
+        dict = {};
+        _BODY.css('cursor', '');
+        that.scrollPatch();
+      }
+      if(resizing === 2){
+        resizing = null;
+      }
+    });
+
+    //鎺掑簭
+    th.on('click', function(e){
+      var othis = $(this)
+      ,elemSort = othis.find(ELEM_SORT)
+      ,nowType = elemSort.attr('lay-sort')
+      ,type;
+
+      if(!elemSort[0] || resizing === 1) return resizing = 2;
+
+      if(nowType === 'asc'){
+        type = 'desc';
+      } else if(nowType === 'desc'){
+        type = null;
+      } else {
+        type = 'asc';
+      }
+      var field = othis.data('sortField')|| othis.data('field')
+      that.sort(field, type, null, true);
+    }).find(ELEM_SORT+' .layui-edge ').on('click', function(e){
+      var othis = $(this)
+      ,index = othis.index()
+      ,field = othis.parents('th').eq(0).data('sortField')|| othis.parents('th').eq(0).data('field')
+      layui.stope(e);
+      if(index === 0){
+        that.sort(field, 'asc', null, true);
+      } else {
+        that.sort(field, 'desc', null, true);
+      }
+    });
+
+    //鏁版嵁琛屼腑鐨勪簨浠惰繑鍥炵殑鍏叡瀵硅薄鎴愬憳
+    var commonMember = function(sets){
+      var othis = $(this)
+      ,index = othis.parents('tr').eq(0).data('index')
+      ,tr = that.layBody.find('tr[data-index="'+ index +'"]')
+      ,data = table.cache[that.key] || [];
+
+
+      data = data[index] || {};
+
+      return $.extend({
+        tr: tr //琛屽厓绱�
+        ,data: data //褰撳墠琛屾暟鎹�
+        ,del: function(){ //鍒犻櫎琛屾暟鎹�
+          table.cache[that.key][index] = [];
+          tr.remove();
+          that.scrollPatch();
+        }
+        ,update: function(fields){ //淇敼琛屾暟鎹�
+          fields = fields || {};
+          layui.each(fields, function(key, value){
+            if(key in data){
+              var templet, td = tr.children('td[data-field="'+ key +'"]');
+              data[key] = value;
+              that.eachCols(function(i, item2){
+                if(item2.field == key && item2.templet){
+                  templet = item2.templet;
+                }
+              });
+              td.children(ELEM_CELL).html(parseTempData.call(that, {
+                templet: templet
+              }, value, data));
+              td.data('content', value);
+            }
+          });
+        }
+      }, sets);
+    };
+
+    //澶嶉�夋閫夋嫨
+    that.elem.on('click', 'input[name="layTableCheckbox"]+', function(){ //鏇夸唬鍏冪礌鐨� click 浜嬩欢
+      var checkbox = $(this).prev()
+      ,childs = that.layBody.find('input[name="layTableCheckbox"]')
+      ,index = checkbox.parents('tr').eq(0).data('index')
+      ,checked = checkbox[0].checked
+      ,isAll = checkbox.attr('lay-filter') === 'layTableAllChoose';
+
+      //鍏ㄩ��
+      if(isAll){
+        childs.each(function(i, item){
+          item.checked = checked;
+          that.setCheckData(i, checked);
+          if(checked){
+            that.layBody.find('tr:eq('+ i +')').addClass("layui-table-select")
+          }else {
+            that.layBody.find('tr:eq('+ i +')').removeClass("layui-table-select")
+          }
+
+        });
+        that.syncCheckAll();
+        that.renderForm('checkbox');
+      } else {
+        that.setCheckData(index, checked);
+        that.syncCheckAll();
+        that.layBody.find('tr:eq('+ index +')').triggerClass("layui-table-select")
+      }
+
+      layui.event.call(checkbox[0], MOD_NAME, 'checkbox('+ filter +')', commonMember.call(checkbox[0], {
+        checked: checked
+        ,type: isAll ? 'all' : 'one'
+      }));
+    });
+
+    //鍗曢�夋閫夋嫨
+    that.elem.on('click', 'input[lay-type="layTableRadio"]+', function(){
+      var radio = $(this).prev()
+      ,checked = radio[0].checked
+      ,thisData = table.cache[that.key]
+      ,index = radio.parents('tr').eq(0).data('index');
+
+      //閲嶇疆鏁版嵁鍗曢�夊睘鎬�
+      layui.each(thisData, function(i, item){
+        if(index == i){
+          item[options.checkName] = true;
+          that.setCheckData(i, true);
+        } else {
+          that.setCheckData(i, false);
+        }
+      });
+      that.setThisRowChecked(index);
+
+      layui.event.call(this, MOD_NAME, 'radio('+ filter +')', commonMember.call(this, {
+        checked: checked
+      }));
+    });
+
+    //琛屼簨浠�
+    that.layBody.on('mouseenter', 'tr', function(){ //榧犳爣绉诲叆琛�
+      var othis = $(this)
+      ,options =that.config ;
+      if(othis.data('off')) return; //涓嶈Е鍙戜簨浠�
+      othis.addClass(ELEM_HOVER)
+      if(!!options.hoverCursor){
+        othis.find('td').css({cursor:options.hoverCursor==true?'pointer':options.hoverCursor})
+      }
+    }).on('mouseleave', 'tr', function(){ //榧犳爣绉诲嚭琛�
+      var othis = $(this)
+      ,options =that.config ;
+      if(othis.data('off')) return; //涓嶈Е鍙戜簨浠�
+      othis.removeClass(ELEM_HOVER)
+      if (!!options.hoverCursor) {
+        othis.find('td').css({cursor: 'default'})
+      }
+    }).on('click', 'tr', function(e){ //鍗曞嚮琛�
+      setRowEvent.call(this, 'row',e);
+    }).on('dblclick', 'tr', function(e){ //鍙屽嚮琛�
+      setRowEvent.call(this, 'rowDouble',e);
+    });
+
+    //鍒涘缓琛屽崟鍑汇�佸弻鍑讳簨浠�
+    var setRowEvent = function(eventType,e) {
+      var othis = $(this);
+      if (othis.data('off')) return; //涓嶈Е鍙戜簨浠�
+      var commonMemberData = commonMember.call(othis.children('td')[0])
+      if (eventType == 'row') {
+        //weidy@2018-05-07 澧炲姞琛岀偣鍑讳簨浠�
+        var othis = $(this), index = othis.index()
+            , dataIndex = othis.attr("data-index")
+            , options = that.config;//鏁版嵁鎵�鍦ㄨ
+        var data = commonMemberData.data;
+        var target = $(e.target)
+        /*if(options.checkOnSelect && data){
+            var newCheckValue = !data[options.checkName];
+            if(options.selectMode == table.selectMode.single){
+                //鍘婚櫎鍏朵粬鐨勫閫夋
+              that.layBody.find("input[name='layTableCheckbox']").each(function(_index){
+                //that.layBody.find('tr:eq('+ _index +')').removeClass("layui-table-click");
+                  that.setCheckData($(this).parent().parent().parent().attr("data-index"),false);
+                  that.renderCheckbox($(this),$(this).next(),false);
+              });
+              othis.addClass("layui-table-click").siblings('tr').removeClass("layui-table-click");
+            }else{
+              othis.toggleClass("layui-table-click")
+            }
+            that.setCheckData(dataIndex,newCheckValue);
+            var checkbox = that.layBody.find('tr:eq('+ index +') input[name="layTableCheckbox"]');
+            that.renderCheckbox(checkbox,checkbox.next(),newCheckValue);
+            that.syncCheckAll();
+        }*/
+        if (((e.ctrlKey && options.radioName == "LAY_RADIO") || (target.hasClass('layui-icon') && target.parent().hasClass('layui-form-radio'))) && data) {
+          //鐐瑰嚮鐨勬槸radio妗嗘垨鑰呯偣鍑绘椂ctrl宸叉寜涓�
+          var radio = othis.find('input[lay-type="layTableRadio"]');
+          var thisData = table.cache[that.key]
+          layui.each(thisData, function (i, item) {
+            if (dataIndex == i) {
+              item[options.checkName] = true;
+              that.setCheckData(i, true);
+              that.renderRadio(radio, radio.next(), true);
+              that.layBody.find('tr:eq('+ i +')').addClass("layui-table-select")
+              that.layFixed.find('tr:eq('+ i +')').addClass("layui-table-select");
+            } else {
+              that.setCheckData(i, false);
+              var r=that.layBody.find('tr:eq('+ i +') input[lay-type="layTableRadio"]');
+              that.renderRadio(r, r.next(), false);
+              that.layBody.find('tr:eq('+ i +')').removeClass("layui-table-select")
+              that.layFixed.find('tr:eq('+ i +')').removeClass("layui-table-select");
+            }
+          });
+
+          layui.event.call(this, MOD_NAME, 'radio(' + filter + ')', commonMember.call(this, {
+            checked: true
+          }));
+        } else if (((e.ctrlKey && options.checkName == "LAY_CHECKED") || (target.hasClass('layui-icon') && target.parent().hasClass('layui-form-checkbox'))) && data) {
+          //鐐瑰嚮鐨勬槸checkbox妗嗘垨鑰呯偣鍑绘椂ctrl宸叉寜涓�
+          var newCheckValue = !data[options.checkName];
+          that.setCheckData(dataIndex, newCheckValue);
+          var checkbox = othis.find('input[name="layTableCheckbox"]');
+          that.renderCheckbox(checkbox, checkbox.next(), newCheckValue);
+          that.syncCheckAll();
+          table.cache[that.key][dataIndex][options.checkName] = newCheckValue
+          layui.event.call(this, MOD_NAME, 'checkbox(' + filter + ')', $.extend(commonMemberData, {
+                checked: newCheckValue
+                , type: 'one'
+              })
+          );
+          if(newCheckValue){
+            othis.addClass("layui-table-select");
+            if(that.layFixed.find('tr').length>0){
+              //鏈夊浐瀹氬垪
+              that.layBody.find('tr:eq('+ index +')').addClass("layui-table-select")
+            }
+          }else{
+            othis.removeClass("layui-table-select")
+            if(that.layFixed.find('tr').length>0){
+              //鏈夊浐瀹氬垪
+              that.layBody.find('tr:eq('+ index +')').removeClass("layui-table-select")
+            }
+          }
+          layui.stope(e);
+
+        } else {
+          if(that.layFixed.find('tr').length>0){
+            //鏈夊浐瀹氬垪
+            that.layBody.find('tr:eq('+ index +')').addClass("layui-table-click").siblings('tr').removeClass("layui-table-click");
+            that.layFixLeft.find('tr:eq('+ index +')').addClass("layui-table-click").siblings('tr').removeClass("layui-table-click");
+            that.layFixRight.find('tr:eq('+ index +')').addClass("layui-table-click").siblings('tr').removeClass("layui-table-click");
+          }else{
+            othis.addClass("layui-table-click").siblings('tr').removeClass("layui-table-click");
+          }
+          layui.stope(e);
+        }
+
+        if (options.rowClick) {
+          options.rowClick(that.key, data, newCheckValue);
+        }
+
+      }else if (eventType == 'rowDouble') {
+        //wangting@2021-2-5 澧炲姞鍙屽嚮琛屼簨浠�
+        var othis = $(this), index = othis.index()
+            , dataIndex = othis.attr("data-index")
+            , options = that.config;//鏁版嵁鎵�鍦ㄨ
+        if (options.rowDBLClick) {
+          var data = commonMemberData.data;
+          options.rowDBLClick(that.key, data);
+        }
+        layui.stope(e);
+      }
+      layui.event.call(this,
+          MOD_NAME, eventType + '(' + filter + ')'
+          , commonMemberData
+      );
+    };
+
+    //鍗曞厓鏍肩紪杈�
+    that.layBody.on('change', '.'+ELEM_EDIT, function(){
+      var othis = $(this)
+      ,value = this.value
+      ,field = othis.parent().data('field')
+      ,index = othis.parents('tr').eq(0).data('index')
+      ,data = table.cache[that.key][index];
+
+      //weidy@2019-05-15 澧炲姞鍗曞厓鏍间慨鏀瑰墠鐨勫��
+      if(!table.editCache){
+        table.editCache = {};
+      }
+      if(!(that.key in table.editCache) ){
+        table.editCache[that.key] = {};
+      }
+      var editBeforeData = {};
+      for(var key in data){
+        editBeforeData[key] = data[key];
+      }
+      table.editCache[that.key][index] = editBeforeData;
+      //end weidy锛涙殏鏃朵笉鐩存帴浼犻�掑埌edit閲岋紝鍙互閫氳繃鏂规硶鑾峰彇鍒颁慨鏀瑰墠鐨勫��
+      if(othis.is('select')){
+        var text = othis.find('option:selected').text();
+        data[field] = text;
+        data[othis.attr('valueField')] = value;
+      }else {
+        data[field] = value; //鏇存柊缂撳瓨涓殑鍊�
+      }
+      othis.parent().addClass("layui-table-edit_notsubmit");
+
+      layui.event.call(this, MOD_NAME, 'edit('+ filter +')', commonMember.call(this, {
+        value: value
+        ,field: field
+      }));
+    }).on('blur', '.'+ELEM_EDIT, function(){
+      var templet
+      ,othis = $(this)
+      ,thisElem = this
+      ,field = othis.parent().data('field')
+      ,index = othis.parents('tr').eq(0).data('index')
+      ,data = table.cache[that.key][index];
+      var specialClass = othis.attr('class').split(' ')[0]
+
+      if(specialClass ==='laydate-grid-item'){//闃绘laydate 鐐瑰嚮涔嬪悗remove
+
+      }else {
+        var isRemove;
+        if (specialClass === 'grid-number-input') {
+          // var reg = new RegExp("^[0-9]+$"),value=this.value;
+          var reg = new RegExp("^(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*))$"),
+              value = this.value;
+          if ((value == null || value == '') || reg.test(value)) {
+            isRemove = false;
+          } else {
+            layui.layer.tips("鍙兘濉啓鏁板瓧", othis);
+            //$webUtil.showErrorMsg("鍙兘濉啓鏁板瓧");
+            isRemove = true;
+            this.value = '';
+          }
+        }
+        var displayValue = this.value;
+        if (specialClass === 'grid-select-input' || othis.is('select')) {
+          displayValue = othis.find('option:selected').text();
+        }
+        that.eachCols(function (i, item) {
+          if (item.field == field && item.templet) {
+            templet = item.templet;
+          }
+        });
+        othis.siblings(ELEM_CELL).html(function (value) {
+          return parseTempData.call(that, {
+            templet: templet
+          }, value, data);
+        }(displayValue));
+        othis.parent().data('content', displayValue);
+        isRemove || othis.remove();
+      }
+    });
+
+    //鍗曞厓鏍煎崟鍑讳簨浠�
+    that.layBody.on('click', 'td', function(e){
+      var othis = $(this)
+      ,field = othis.data('field')
+      ,editType = othis.data('edit')
+      ,elemCell = othis.children(ELEM_CELL)
+      ,editConfig=othis.attr("data-editConfig"),
+      index = othis.parents('tr').eq(0).data('index')
+          ,data = table.cache[that.key][index];
+
+      layer.close(that.tipsIndex);
+      if(othis.data('off')) return; //涓嶈Е鍙戜簨浠�
+
+      if(!editConfig){
+        editConfig = {};
+      }else{
+        editConfig = eval("(" + editConfig + ")");
+      }
+      var formselect=$('body .layui-tableform-select')
+      if(formselect.length>0) {
+        var initValue = formselect.find('input').val();
+        var selecttd=formselect.data('fortd');
+        var tdindex = selecttd.parents('tr').eq(0).data('index')
+            ,tddata = table.cache[that.key][tdindex];
+        var templet;
+        that.eachCols(function (i, item) {
+          if (item.field == selecttd.data('field') && item.templet) {
+            templet = item.templet;
+          }
+        });
+        if (tddata[selecttd.data('field')] != initValue) {
+          selecttd.children(ELEM_CELL).html(function (value) {
+            return parseTempData.call(that, {
+              templet: templet
+            }, value, tddata);
+          }(initValue));
+          selecttd.data('content', initValue);
+          selecttd.addClass("layui-table-edit_notsubmit");
+          layui.event.call(this, MOD_NAME, 'edit(' + filter + ')', commonMember.call(this, {
+            value: initValue
+            , field: selecttd.data('field')
+          }));
+
+          if (!table.editCache) {
+            table.editCache = {};
+          }
+          if (!(that.key in table.editCache)) {
+            table.editCache[that.key] = {};
+          }
+          var editBeforeData = {};
+          for (var key in tddata) {
+            editBeforeData[key] = tddata[key];
+          }
+          table.editCache[that.key][tdindex] = editBeforeData;
+          tddata[selecttd.data('field')] = initValue; //鏇存柊缂撳瓨涓殑鍊�
+        }
+        formselect.remove()
+      }
+
+      //鏄剧ず缂栬緫琛ㄥ崟
+      if(editType){
+        editType=editType.toLowerCase();
+        if(editType === 'select') { //閫夋嫨妗�
+          if(!editConfig.comboxKey){
+            $webUtil.showErrorMsg("浠g爜鏈夐敊璇紝缂栬緫鏃朵负涓嬫媺妗嗙殑鏃跺�欙紝璇疯缃甤omboxKey");
+            return false;
+          }
+          var content;
+          if(othis.data('content')){
+            content = othis.data('content');
+          }
+          var inputValue = elemCell.text() || content || '';
+          if(inputValue == undefined){
+            inputValue = '';
+          }
+          editConfig.valueField = editConfig.valueField?editConfig.valueField:field;
+
+          var displayed = othis.find('.'+ELEM_EDIT)[0];
+          var select;
+          //wangting 澧炲姞鍙紪杈戜笅鎷夋,鍙悳绱€�佸彲杈撳叆
+          if(editConfig.editable) {
+            formselect = $('<div class="layui-form-select layui-tableform-select" style="height:' + (othis.height() + 2) + 'px;position: absolute;width:' + (othis.width() + 1) + 'px;top:' + (othis.offset().top+1) + 'px;left:' + (othis.offset().left+1) + 'px;z-index: 198910230;"><div class="layui-select-title"><input type="text" placeholder="鐩存帴閫夋嫨鎴栬緭鍏�" value="' + inputValue + '" class="grid-textselect-input ' + ELEM_EDIT + ' layui-input" style=""><i class="layui-edge"></i></div></div>')
+            //othis.find('.'+ELEM_EDIT)[0] || othis.append(formselect);
+            select = $('<dl class="layui-anim layui-anim-upbit" ></dl>');
+            formselect.append(select)
+            formselect.data('fortd',othis)
+            $('body').append(formselect)
+
+            var title = formselect.find('.layui-select-title')
+            var input = title.find('input')
+            var dl = formselect.find('dl')
+            var dds= dl.children('dd')
+            var NONE = 'layui-select-none';
+            //灞曞紑涓嬫媺
+            var showDown = function () {
+              dds = dl.children('dd')
+              var top = formselect.offset().top + formselect.outerHeight() + 5 - $(window).scrollTop()
+                  , dlHeight = dl.outerHeight();
+              formselect.addClass('layui-form-selected');
+              dds.removeClass('layui-hide');
+
+              //涓婁笅瀹氫綅璇嗗埆
+              if (top + dlHeight > $(window).height() && top >= dlHeight) {
+                formselect.addClass('layui-form-selectup');
+              }
+
+              //閫夋嫨
+              dds.on('click', function () {
+                var dd = $(this), value = dd.attr('lay-value');
+                var name = dd.text();
+
+                if (dd.hasClass('layui-disabled')) return false;
+
+                if (dd.hasClass('layui-select-tips')) {
+                  input.val('').data('lay-value',value);
+                } else {
+                  input.val(name).data('lay-value',value);
+                  dd.addClass('layui-this');
+                }
+                dd.siblings().removeClass('layui-this');
+                hideDown(true);
+                return false;
+              });
+            }, hideDown = function (choose) {
+              formselect.removeClass('layui-form-selected  layui-form-selectup');
+            };
+            //妫�娴嬪�兼槸鍚︿笉灞炰簬select椤�
+            var notOption = function(value, callback, origin){
+              var num = 0;
+              layui.each(dds, function(){
+                var dd = $(this)
+                    ,text = dd.text()
+                    ,not = text.indexOf(value) === -1;
+                if(value === '' || (origin === 'blur') ? value !== text : not) num++;
+                origin === 'keyup' && dd[not ? 'addClass' : 'removeClass']('layui-hide');
+              });
+              var none = num === dds.length;
+              return callback(none), none;
+            };
+
+            //鎼滅储鍖归厤
+            var search = function(e){
+              var value = this.value, keyCode = e.keyCode;
+
+              if(keyCode === 9 || keyCode === 13
+                  || keyCode === 37 || keyCode === 38
+                  || keyCode === 39 || keyCode === 40
+              ){
+                return false;
+              }
+
+              notOption(value, function(none){
+                if(none){
+                  dl.find('.'+NONE)[0] || dl.append('<p class="'+ NONE +'">鏃犲尮閰嶉」</p>');
+                } else {
+                  dl.find('.'+NONE).remove();
+                }
+              }, 'keyup');
+
+              if(value === ''){
+                dl.find('.'+NONE).remove();
+              }
+            };
+            input.on('keyup', search);
+            title.on('click', function (e) {
+              formselect.hasClass('layui-form-selected') ? (hideDown()) : (
+                  $('.layui-form-select').removeClass('layui-form-selected layui-form-selectup'), showDown()
+              );
+              dl.find('.'+NONE).remove();
+            });
+            formselect.find('.layui-edge').on('click', function () {
+              input.focus();
+            });
+            function bindData(e){
+              if($(e.target).attr('class')==formselect.attr('class') || $(e.target).attr('class')==input.attr('class') || $(e.target).prev().attr('class')==input.attr('class')){
+                return;
+              }
+              hideDown()
+              var initText = input.val();
+              var initValue = input.data('lay-value');
+              var templet;
+              that.eachCols(function (i, item) {
+                if (item.field == field && item.templet) {
+                  templet = item.templet;
+                }
+              });
+              if(data[field]!=initText){
+                elemCell.html(function (value) {
+                  return parseTempData.call(that, {
+                    templet: templet
+                  }, value, data);
+                }(initText));
+                othis.data('content', initText);
+                othis.addClass("layui-table-edit_notsubmit");
+                layui.event.call(this, MOD_NAME, 'edit('+ filter +')', commonMember.call(this, {
+                  value: initText
+                  ,field: field
+                  ,valueField:editConfig.valueField
+                  ,valueFieldText:initValue
+                }));
+
+                if(!table.editCache){
+                  table.editCache = {};
+                }
+                if(!(that.key in table.editCache) ){
+                  table.editCache[that.key] = {};
+                }
+                var editBeforeData = {};
+                for(var key in data){
+                  editBeforeData[key] = data[key];
+                }
+                table.editCache[that.key][index] = editBeforeData;
+                data[field] = initText; //鏇存柊缂撳瓨涓殑鍊�
+                data[editConfig.valueField] = initValue;
+              }
+              formselect.remove()
+              $('body').unbind('click',bindData)
+            }
+            that.layBox.parent().parent().bind('scroll',function (){
+              formselect.remove()
+            })
+            that.layMain.bind('scroll',function (){
+              formselect.remove()
+            })
+            $('body').bind('click',bindData)
+
+          }else{
+            select = $('<select autofocus class="grid-select-input '+ ELEM_EDIT +'" lay-ignore valueField="' + editConfig.valueField + '"></select>');
+            select.val(inputValue);
+            othis.find('.'+ELEM_EDIT)[0] || othis.append(select);
+          }
+
+          //鍔犲唴瀹�
+          if(!displayed) {
+            layui.use('vciWebComboxStore', function () {
+              var comboxConfig = {};
+              for (var key in editConfig.comboxConfig) {
+                comboxConfig[key] = editConfig.comboxConfig[key];
+              }
+              comboxConfig.url = comboxConfig.url ? comboxConfig.url : (!comboxConfig.data?'default':'');
+              comboxConfig.callback = function (comboxKey, map) {
+                var html = [];
+                for (var key in map) {
+                  if(editConfig.editable){
+                    html.push('<dd lay-value="' + key + '" class="'+(map[key]==inputValue?'layui-this':'')+'">' + map[key] + '</dd>');
+                  }else{
+                    html.push('<option value="' + key + '" '+(key==inputValue || map[key]==inputValue?'selected':'')+'>' + map[key] + '</option>');
+                  }
+
+                }
+                select.html(html.join(''));
+              };
+              layui.vciWebComboxStore.newCombox(editConfig.comboxKey, comboxConfig, editConfig.reload);
+            });
+          }
+        } else if(editType ==='date'){
+          var input = $('<input class="laydate-grid-item '+ ELEM_EDIT +'">');
+          var content;
+          if(othis.data('content')){
+            content = othis.data('content').split('')[0];
+          }
+          var inputValue = elemCell.text() || content || '';
+          if(inputValue == undefined){
+            inputValue = '';
+          }
+          input[0].value = inputValue;
+          othis.find('.'+ELEM_EDIT)[0] || othis.append(input);
+          lay(".laydate-grid-item").each(function(index,elem){
+            laydate.render({
+              elem:elem,
+              change:function(value){
+                var date = value.split(" ")[0];
+                othis.find('div').html(date)
+              },
+              done:function(value){
+                var date = value.split(" ")[0];
+                othis.find('div').html(date);
+                setTimeout(function(){
+                  othis.find("input").remove();
+                  //var othis = $(elem)
+                  // var field = othis.parent().data('field')
+                  var index = othis.parents('tr').eq(0).data('index')
+                      , data = table.cache[that.key][index];
+                  data[field] = value; //鏇存柊缂撳瓨涓殑鍊�
+                  layui.event.call(this, MOD_NAME, 'edit(' + filter + ')', {
+                    value: value
+                    , data: data
+                    , field: field
+                  });
+                },200)
+              }
+            })
+          });
+          setTimeout(function(){input.focus()},200);
+        }else if(editType === 'refer'){
+          //璇存槑鏄弬鐓�
+          var input = $('<input  class="grid-refer-input layui-input '+ ELEM_EDIT +'"  >');
+          var inputValue = elemCell.text() || othis.data('content') ;
+          if(inputValue == undefined){
+            inputValue = "";
+          }
+          input[0].value = inputValue;
+          input.value = inputValue;
+          othis.find('.'+ELEM_EDIT)[0] || othis.append(input);
+          input.focus(function() {
+            var options = editConfig.referConfig;
+            if (!options) {
+              $webUtil.showErrorMsg("浠g爜閿欒锛屽湪缂栬緫鐨勭被鍨嬩负鍙傜収鐨勬椂鍊欙紝蹇呴』鏈塺eferConfig");
+              return false;
+            }
+            layui.vciWebRefer.newRefer(filter, field, input, options);
+            layui.vciWebRefer.addChangeValueListener(filter, field, options.showField, function (thisFilter, thisName, showField, value, rawValue, selectRecords) {
+              var index = othis.parents('tr').eq(0).data('index')
+                  , data = table.cache[that.key][index];
+              if (editConfig.referConfig.setValue) {
+                eval("(" + editConfig.referConfig.setValue + ")")
+                //editConfig.referConfig.setValue(thisFilter, thisName, showField, value, rawValue, selectRecords)
+              } else {
+                data[field] = rawValue;
+                if (editConfig.fieldMap && selectRecords && selectRecords.length > 0) {
+                  //璇存槑闇�瑕佹槧灏�
+                  for (var key in editConfig.fieldMap) {
+                    var mapFields = editConfig.fieldMap[key].split(",");
+                    var value = [];
+                    layui.each(selectRecords, function (_index, _item) {
+                      var temp;
+                      if (mapFields.length == 1) {
+                        var mapField = mapFields[0];
+                        if (mapField.indexOf("attribute.") > -1) {
+                          temp = _item['attributes'][mapField.subString("attribute.".length)];
+                        } else {
+                          temp = _item[mapField];
+                        }
+                      } else {
+                        //鏈夊涓�
+                        var mutiTemp = [];
+                        layui.each(mapFields, function (_indexField, _itemField) {
+                          if (_itemField.indexOf("attribute.") > -1) {
+                            mutiTemp.push(_item['attributes'][_itemField.subString("attribute.".length)]);
+                          } else {
+                            mutiTemp.push(_item[_itemField]);
+                          }
+                        });
+                        temp = mutiTemp.join(editConfig.textSep ? editConfig.textSep : ' ');
+                      }
+                      if (temp != null && temp != '') {
+                        value.push(temp);
+                      }
+                    });
+                    data[key] = value.join(',');
+                    var fieldTd = othis.parent().find('td[data-field="' + key + '"]');
+                    if (fieldTd) {
+                      fieldTd.find('div').html(data[key]);
+                    }
+                  }
+                }
+                othis.find('div').html(rawValue);
+              }
+              var selectValue = {
+                value: value,
+                rawValue: rawValue,
+                allValues: selectRecords
+              };
+              layui.event.call(this, MOD_NAME, 'edit(' + filter + ')', {
+                value: value
+                , data: data
+                , field: field
+                , index: index
+                , selectEditData: selectValue
+              });
+              othis.find('.grid-refer-input').remove();
+
+            });
+            layui.vciWebRefer.showRefer(filter, field, data);
+          });
+        } else { //鏂囨湰妗�
+          var input;
+          if(editType === 'number'){
+            input = $('<input  class="grid-number-input layui-input '+ ELEM_EDIT +'"  >');
+          }else{
+            input = $('<input class="layui-input '+ ELEM_EDIT +'">');
+          }
+          input[0].value = othis.data('content') || elemCell.text();
+          othis.find('.'+ELEM_EDIT)[0] || othis.append(input);
+          input.focus();
+        }
+        return;
+      }
+
+
+    }).on('mouseenter', 'td', function(){
+      gridExpand.call(this)
+    }).on('mouseleave', 'td', function(){
+       gridExpand.call(this, 'hide');
+    });
+
+    //鍗曞厓鏍煎睍寮�鍥炬爣
+    var ELEM_GRID = 'layui-table-grid', ELEM_GRID_DOWN = 'layui-table-grid-down', ELEM_GRID_PANEL = 'layui-table-grid-panel'
+    ,gridExpand = function(hide){
+      var othis = $(this)
+      ,elemCell = othis.children(ELEM_CELL);
+
+      if(othis.data('off')) return; //涓嶈Е鍙戜簨浠�
+
+      if(hide){
+        othis.find('.layui-table-grid-down').remove();
+      } else if(elemCell.prop('scrollWidth') > elemCell.outerWidth()){
+        if(elemCell.find('.'+ ELEM_GRID_DOWN)[0]) return;
+        othis.append('<div class="'+ ELEM_GRID_DOWN +'"><i class="layui-icon layui-icon-down"></i></div>');
+      }
+    };
+
+    //鍗曞厓鏍煎睍寮�浜嬩欢
+    that.layBody.on('click', '.'+ ELEM_GRID_DOWN, function(e){
+      var othis = $(this)
+      ,td = othis.parent()
+      ,elemCell = td.children(ELEM_CELL);
+
+      that.tipsIndex = layer.tips([
+        '<div class="layui-table-tips-main" style="margin-top: -'+ (elemCell.height() + 16) +'px;'+ function(){
+          if(options.size === 'sm'){
+            return 'padding: 4px 15px; font-size: 12px;';
+          }
+          if(options.size === 'lg'){
+            return 'padding: 14px 15px;';
+          }
+          return '';
+        }() +'">'
+          ,elemCell.html()
+        ,'</div>'
+        ,'<i class="layui-icon layui-table-tips-c layui-icon-close"></i>'
+      ].join(''), elemCell[0], {
+        tips: [3, '']
+        ,time: -1
+        ,anim: -1
+        ,maxWidth: (device.ios || device.android) ? 300 : that.elem.width()/2
+        ,isOutAnim: false
+        ,skin: 'layui-table-tips'
+        ,success: function(layero, index){
+          layero.find('.layui-table-tips-c').on('click', function(){
+            layer.close(index);
+          });
+        }
+      });
+
+      layui.stope(e);
+    });
+
+    //琛屽伐鍏锋潯鎿嶄綔浜嬩欢
+    that.layBody.on('click', '*[lay-event]', function(){
+      var othis = $(this)
+      ,index = othis.parents('tr').eq(0).data('index');
+      layui.event.call(this, MOD_NAME, 'tool('+ filter +')', commonMember.call(this, {
+        event: othis.attr('lay-event'),
+        index:index //modify by weidy@2020-5-18 鎶婅鍙蜂篃浼犻�掕繃鍘�
+      }));
+      that.setThisRowChecked(index);
+    });
+
+    //鍚屾婊氬姩鏉�
+    that.layMain.on('scroll', function(){
+      var othis = $(this)
+      ,scrollLeft = othis.scrollLeft()
+      ,scrollTop = othis.scrollTop();
+
+      that.layHeader.scrollLeft(scrollLeft);
+      that.layTotal.scrollLeft(scrollLeft);
+      that.layFixed.find(ELEM_BODY).scrollTop(scrollTop);
+
+      layer.close(that.tipsIndex);
+    });
+
+    //鑷�傚簲
+    _WIN.on('resize', function(){
+      that.resize();
+    });
+  };
+
+  //涓�娆℃�т簨浠�
+  ;(function(){
+    //鍏ㄥ眬鐐瑰嚮
+    _DOC.on('click', function(){
+      _DOC.trigger('table.remove.tool.panel');
+    });
+
+    //宸ュ叿闈㈡澘绉婚櫎浜嬩欢
+    _DOC.on('table.remove.tool.panel', function(){
+      $('.layui-table-tool-panel').remove();
+    });
+  })();
+
+  //鍒濆鍖�
+  table.init = function(filter, settings){
+    settings = settings || {};
+    var that = this
+    ,inst = null
+    ,elemTable = filter ? $('table[lay-filter="'+ filter +'"]') : $(ELEM + '[lay-data]')
+    ,errorTips = 'Table element property lay-data configuration item has a syntax error: ';
+
+    //閬嶅巻鏁版嵁琛ㄦ牸
+    elemTable.each(function(){
+      var othis = $(this), tableData = othis.attr('lay-data');
+
+      try {
+        tableData = new Function('return '+ tableData)();
+      } catch(e) {
+        hint.error(errorTips + tableData, 'error')
+      }
+
+      var cols = [], options = $.extend({
+        elem: this
+        ,cols: []
+        ,data: []
+        ,skin: othis.attr('lay-skin') //椋庢牸
+        ,size: othis.attr('lay-size') //灏哄
+        ,even: typeof othis.attr('lay-even') === 'string' //鍋舵暟琛岃儗鏅�
+      }, table.config, settings, tableData);
+
+      filter && othis.hide();
+
+      //鑾峰彇琛ㄥご鏁版嵁
+      othis.find('thead>tr').each(function(i){
+        options.cols[i] = [];
+        $(this).children().each(function(ii){
+          var th = $(this), itemData = th.attr('lay-data');
+
+          try{
+            itemData = new Function('return '+ itemData)();
+          } catch(e){
+            return hint.error(errorTips + itemData)
+          }
+
+          var row = $.extend({
+            title: th.text()
+            ,colspan: th.attr('colspan') || 0 //鍒楀崟鍏冩牸
+            ,rowspan: th.attr('rowspan') || 0 //琛屽崟鍏冩牸
+          }, itemData);
+
+          if(row.colspan < 2) cols.push(row);
+          options.cols[i].push(row);
+        });
+      });
+
+      //鑾峰彇琛ㄤ綋鏁版嵁
+      othis.find('tbody>tr').each(function(i1){
+        var tr = $(this), row = {};
+        //濡傛灉瀹氫箟浜嗗瓧娈靛悕
+        tr.children('td').each(function(i2, item2){
+          var td = $(this)
+          ,field = td.data('field');
+          if(field){
+            return row[field] = td.html();
+          }
+        });
+        //濡傛灉鏈畾涔夊瓧娈靛悕
+        layui.each(cols, function(i3, item3){
+          var td = tr.children('td').eq(i3);
+          row[item3.field] = td.html();
+        });
+        options.data[i1] = row;
+      });
+
+      //鎵ц娓叉煋
+      table.render(options);
+    });
+
+    return that;
+  };
+
+  //璁板綍鎵�鏈夊疄渚�
+  thisTable.that = {}; //璁板綍鎵�鏈夊疄渚嬪璞�
+  thisTable.config = {}; //璁板綍鎵�鏈夊疄渚嬮厤缃」
+
+  //閬嶅巻琛ㄥご
+  table.eachCols = function(id, callback, cols){
+    var config = thisTable.config[id] || {}
+    ,arrs = [], index = 0;
+
+    cols = $.extend(true, [], cols || config.cols);
+
+    //閲嶆柊鏁寸悊琛ㄥご缁撴瀯
+    layui.each(cols, function(i1, item1){
+      layui.each(item1, function(i2, item2){
+
+        //濡傛灉鏄粍鍚堝垪锛屽垯鎹曡幏瀵瑰簲鐨勫瓙鍒�
+        if(item2.colGroup){
+          var childIndex = 0;
+          index++
+          item2.CHILD_COLS = [];
+
+          layui.each(cols[i1 + 1], function(i22, item22){
+            //濡傛灉瀛愬垪宸茬粡琚爣娉ㄤ负{PARENT_COL_INDEX}锛屾垨鑰呭瓙鍒楃疮璁� colspan 鏁扮瓑浜庣埗鍒楀畾涔夌殑 colspan锛屽垯璺冲嚭褰撳墠瀛愬垪寰幆
+            if(item22.PARENT_COL_INDEX || (childIndex > 1 && childIndex == item2.colspan)) return;
+
+            item22.PARENT_COL_INDEX = index;
+
+            item2.CHILD_COLS.push(item22);
+            childIndex = childIndex + parseInt(item22.colspan > 1 ? item22.colspan : 1);
+          });
+        }
+
+        if(item2.PARENT_COL_INDEX) return; //濡傛灉鏄瓙鍒楋紝鍒欎笉杩涜杩藉姞锛屽洜涓哄凡缁忓瓨鍌ㄥ湪鐖跺垪涓�
+        arrs.push(item2)
+      });
+    });
+
+    //閲嶆柊閬嶅巻鍒楋紝濡傛灉鏈夊瓙鍒楋紝鍒欒繘鍏ラ�掑綊
+    var eachArrs = function(obj){
+      layui.each(obj || arrs, function(i, item){
+        if(item.CHILD_COLS) return eachArrs(item.CHILD_COLS);
+        typeof callback === 'function' && callback(i, item);
+      });
+    };
+
+    eachArrs();
+  };
+
+table.getConfig = function(id){
+  if(!table.settings){
+    table.settings = {};
+  }
+  return table.settings[id];
+};
+table.setConfig = function(options){
+  if(!table.settings){
+    table.settings = {};
+  }
+  table.settings[options.id] = options;
+  thisTable.config[options.id] = options;
+};
+
+  //琛ㄦ牸閫変腑鐘舵��
+  table.checkStatus = function(id,hasIndex){
+    var nums = 0
+    ,invalidNum = 0
+    ,arr = []
+    ,data = table.cache[id] || [];
+    //璁$畻鍏ㄩ�変釜鏁�
+    layui.each(data, function(i, item){
+      if(layui._typeof(item) === 'array'){
+        invalidNum++; //鏃犳晥鏁版嵁锛屾垨宸插垹闄ょ殑
+        return;
+      }
+      if(item[table.config.checkName]) {
+        nums++;
+        if (hasIndex) {
+          arr.push(item);
+        } else {
+          arr.push(table.clearCacheKey(item));
+        }
+      }
+    });
+    return {
+      data: arr //閫変腑鐨勬暟鎹�
+      ,isAll: data.length ? (nums === (data.length - invalidNum)) : false //鏄惁鍏ㄩ��
+    };
+  };
+
+  //weidy娣诲姞锛岃嚜鍔ㄩ�夋嫨鏌愪簺琛�
+  table.selectRecord = function(id,selectRecords){
+    var that = this
+        ,options = table.getConfig(id)
+        ,thisData = table.cache[id];
+    if(!$.isArray(selectRecords)){
+      selectRecords = [selectRecords];
+    }
+    layui.each(selectRecords, function (_index, item) {
+      if (item.LAY_TABLE_INDEX*1>=0 || item.index*1>=0) {
+        $(options.elem).next().find('tbody>tr[data-index="' + ((that.config.indexName in item)?item[that.config.indexName]:item.index) + '"]').each(function (i) {
+          $(this).click();
+          //modify by weidy@2020-12-19锛屽湪鏈塼oolbar鐨勬椂鍊欙紝浼氭湁涓や釜锛屾墍浠ョ涓�涓氨杩斿洖
+          return false;
+        });
+      }
+    });
+  };
+  //wangting娣诲姞锛屽閫夋鍕鹃��
+  table.checkRecord = function(id,checkRecords){
+    var that = this;
+    var options = table.getConfig(id);
+    if(!$.isArray(checkRecords)){
+      checkRecords = [checkRecords];
+    }
+    layui.each(checkRecords, function (_index, item) {
+      if (item.LAY_TABLE_INDEX*1>=0 || item.index*1>=0) {
+        var dataIndex=(that.config.indexName in item)?item[that.config.indexName]:item.index
+        $(options.elem).next().find('tbody>tr[data-index="' + dataIndex+ '"] input[name="layTableCheckbox"]+ ').find('.layui-icon').each(function (i) {
+          $(this).click();
+          return false;
+        });
+
+      }
+    });
+  };
+
+  //鑾峰彇琛ㄦ牸褰撳墠椤电殑鎵�鏈夎鏁版嵁
+  table.getData = function(id,delkey) {
+    var arr = []
+        , data = table.cache[id] || [];
+
+    layui.each(data, function (i, item) {
+      if (layui._typeof(item) === 'array') {
+        return;
+      }
+      if (delkey) {
+        arr.push(table.clearCacheKey(item));
+      } else {
+        arr.push(item);
+      }
+
+    });
+    return arr;
+  };
+
+  //weidy娣诲姞锛岃幏鍙栧綋鍓嶉〉闈㈢紪杈戣繃鐨勬暟鎹�
+  table.getModifyData = function(id){
+    var data = [];
+    var thisTableData = table.cache[id];
+    if(thisTableData && table.editCache && table.editCache[id]){
+      var thisTableBeforeData = table.editCache[id];
+      for(var rowIndex in thisTableBeforeData){
+        if(thisTableData[rowIndex]){
+          data.push(thisTableData[rowIndex]);
+        }
+      }
+    }
+    return data;
+  };
+  //weidy娣诲姞锛屾竻闄ゆ墍鏈夊凡缁忕紪杈戣繃鐨勬暟鎹�
+  table.clearModifyData = function(id,rowIndexs){
+    if(table.editCache && table.editCache[id]){
+      if(rowIndexs){
+        //璇存槑鎸囧畾浜嗗摢浜涜鐨�
+        var thisTableBeforeData = table.editCache[id];
+        if(! $webUtil.isArray(rowIndexs)){
+          rowIndexs = [rowIndexs];
+        }
+        layui.each(rowIndexs,function(_index,_item){
+          delete thisTableBeforeData[rowIndexs];
+        });
+        table.editCache[id] = thisTableBeforeData;
+      }else {
+        table.editCache[id] = {};
+      }
+      try {
+        this.getConfig(id).elem.next().find('.layui-table-edit_notsubmit').removeClass("layui-table-edit_notsubmit");
+      }catch(e){
+
+      }
+    }
+  };
+  //weidy娣诲姞锛屾坊鍔犳暟鎹埌鍒楄〃涓�
+  table.addData = function(id,data){
+    var cacheData = this.getData(id,true);
+    if(!data) data = [];
+    if(!cacheData){
+      cacheData = [];
+    }
+    if(!$webUtil.isArray(data)) data = [data];
+    for(var i = 0 ; i < data.length ; i ++){
+      cacheData.push(data[i]);
+    }
+    this.reload(id,{
+      data:cacheData,
+      modifyData:true
+    });
+  };
+
+  //wangting锛岀Щ鍔ㄦ暟鎹埌鎸囧畾浣嶇疆
+  table.moveData = function(id,index,toindex,changeField){
+    var cacheData = this.getData(id,true);
+    if(!cacheData){
+      cacheData = [];
+    }
+    cacheData[index]=cacheData.splice(toindex,1,cacheData[index])[0]
+    if(changeField){
+      if(!$webUtil.isArray(changeField)) changeField = [changeField];
+      for(var i = 0 ; i < changeField.length ; i ++){
+        var fieldValue=cacheData[index][changeField[i]];
+        var tofieldValue=cacheData[toindex][changeField[i]];
+        cacheData[index][changeField[i]]=tofieldValue;
+        cacheData[toindex][changeField[i]]=fieldValue;
+      }
+    }
+    this.reload(id,{
+      data:cacheData,
+      modifyData:true
+    });
+  };
+
+  /**
+   * 绉婚櫎鏁版嵁
+   * id 琛ㄦ牸鐨刬d
+   * index,鍙互鏄鍙�-1锛屼篃鍙互鏄暣琛屾暟鎹�傚彲浠ユ槸鏁扮粍锛屼篃鍙互鏄崟涓璞�
+   */
+  table.removeData = function(id,index){//绉婚櫎鏁版嵁
+    if(!$webUtil.isArray(index)) index = [index];
+    var data = this.getData(id);
+    if(!data){
+      return false;
+    }
+    var newData = [];
+    for(var i = 0 ; i < data.length ; i ++){
+      var isNeedDelete = false;
+      var record = data[i];
+      for(var j = 0 ; j < index.length ; j ++){
+        var selectData = index[j];
+        if(!isNaN(selectData)){
+          //鏄鍙风殑鏃跺��
+          if(selectData == record[table.config.indexName] ){
+            isNeedDelete = true;
+            break;
+          }
+        }else if("oid" in selectData && "oid" in record){
+          if(selectData["oid"] == record["oid"] ){
+            isNeedDelete = true;
+            break;
+          }
+        }else{
+          //鍙兘鍏ㄩ儴瀵规瘮鎵�鏈夌殑鏁版嵁
+          var same = true;
+          for(var key in selectData){
+            if(selectData[key] != record[key] ){
+              same = false;
+              break;
+            }
+          }
+          if(same){
+            isNeedDelete = true;
+            break;
+          }
+        }
+      }
+      if(!isNeedDelete){
+        var copyData = record;
+        delete copyData[table.config.indexName];
+        newData.push(copyData);
+      }
+    }
+    this.reload(id,{
+      data:newData,
+      modifyData:true
+    });
+  };
+
+  table.changeRecord = function(id,index,record){
+    //淇敼鏌愪竴琛岀殑鏁版嵁
+    var data = this.getData(id);
+    if(!data){
+      return false;
+    }
+    layui.each(data,function (_index,rowData) {
+      var same = false;
+      if(table.config.indexName in rowData
+          && table.config.indexName in record ){
+        if(rowData[table.config.indexName] == record[table.config.indexName] ){
+          same = true;
+        }
+      }else if("oid" in rowData && "oid" in record){
+        if(rowData["oid"] == record["oid"] ){
+          same = true;
+        }
+      }else{
+        same = true;
+        for(var key in rowData){
+          if(rowData[key] != rowData[key] ){
+            same = false;
+            break;
+          }
+        }
+
+      }
+      if(same){
+        data[_index] = record;
+        return true;
+      }
+    });
+    this.reload(id,{
+      data:data,
+      modifyData:true
+    });
+  };
+
+  /**
+   * 鎺掑簭
+   * id 琛ㄦ牸鐨刬d
+   * field,瑕佹帓搴忕殑瀛楁
+   * type锛屾帓搴忕被鍨�,asc\desc
+   */
+  table.sort = function(id,field, type, pull, formEvent){
+    if(!type){
+      type='asc'
+    }
+    thisTable.that[id].sort(field, type, pull, formEvent)
+  };
+
+  //琛ㄦ牸瀵煎嚭
+  table.exportFile = function(id, data, type){
+    var that = this;
+
+    data = data || table.clearCacheKey(table.cache[id]);
+    type = type || 'xls';
+
+    var thatTable = thisTable.that[id]
+    ,config = thisTable.config[id] || {}
+    ,textType = ({
+      csv: 'text/csv'
+      ,xls: 'application/vnd.ms-excel'
+    })[type]
+    ,alink = document.createElement("a");
+
+    if(device.ie) return hint.error('IE_NOT_SUPPORT_EXPORTS');
+
+    alink.href = 'data:'+ textType +';charset=utf-8,\ufeff'+ encodeURIComponent(function(){
+      var dataTitle = [], dataMain = [], dataTotal = [];
+
+      //琛ㄥご鍜岃〃浣�
+      layui.each(data, function(i1, item1){
+        var vals = [];
+        if(typeof id === 'object'){ //濡傛灉 id 鍙傛暟鐩存帴涓鸿〃澶存暟鎹�
+          layui.each(id, function(i, item){
+            i1 == 0 && dataTitle.push(item || '');
+          });
+          layui.each(table.clearCacheKey(item1), function(i2, item2){
+            vals.push('"'+ (item2 || '') +'"');
+          });
+        } else {
+          table.eachCols(id, function(i3, item3){
+            if(item3.field && item3.type == 'normal' && !(item3.hide || item3.hidden)){
+              var content = item1[item3.field];
+              if(content === undefined || content === null) content = '';
+
+              i1 == 0 && dataTitle.push(item3.title || '');
+              vals.push('"'+ parseTempData.call(thatTable, item3, content, item1, 'text') + '"');
+            }
+          });
+        }
+        dataMain.push(vals.join(','));
+      });
+
+      //琛ㄥ悎璁�
+      layui.each(that.dataTotal, function(key, value){
+        dataTotal.push(value);
+      });
+
+      return dataTitle.join(',') + '\r\n' + dataMain.join('\r\n') + '\r\n' + dataTotal.join(',');
+    }());
+
+    alink.download = (config.title || 'table_'+ (config.index || '')) + '.' + type;
+    document.body.appendChild(alink);
+    alink.click();
+    document.body.removeChild(alink);
+  };
+
+  //閲嶇疆琛ㄦ牸灏哄缁撴瀯
+  table.resize = function(id){
+    //濡傛灉鎸囧畾琛ㄦ牸鍞竴 id锛屽垯鍙墽琛岃 id 瀵瑰簲鐨勮〃鏍煎疄渚�
+    if(id){
+      var config = getThisTableConfig(id); //鑾峰彇褰撳墠瀹炰緥閰嶇疆椤�
+      if(!config) return;
+
+      thisTable.that[id].resize();
+
+    } else { //鍚﹀垯閲嶇疆鎵�鏈夎〃鏍煎疄渚嬪昂瀵�
+      layui.each(thisTable.that, function(){
+        this.resize();
+      });
+    }
+  };
+
+  //琛ㄦ牸閲嶈浇
+  table.reload = function(id, options, deep){
+    var config = getThisTableConfig(id); //鑾峰彇褰撳墠瀹炰緥閰嶇疆椤�
+    if(!config) return;
+
+    var that = thisTable.that[id];
+    if(options && options.data && options.data.constructor === Array) delete config.data;
+    return table.render($.extend(deep||true, {}, config, options));
+  };
+
+  table.getIndexColumn= function(config){
+    if(!config) config={}
+    if(device.ie){
+      return $.extend({field:table.config.indexName,type:'numbers',title:'搴忓彿',width:40,minWidth:40},config);
+    }else{
+      return $.extend({field:table.config.indexName,type:'numbers',title:'搴忓彿',width:40},config);
+    }
+
+  };
+  table.getCheckColumn = function (config) {
+    if(!config) config={}
+    if(device.ie){
+      return $.extend({field:table.config.checkName,type:'checkbox',width:30,minWidth:30},config);
+    }else{
+      return $.extend({field:table.config.checkName,type:'checkbox',width:30},config);
+    }
+
+  };
+  table.getRadioColumn = function (config) {
+    if(!config) config={}
+    if(device.ie){
+      return $.extend({field:table.config.checkName,type:'radio',width:30,minWidth:30},config);
+    }else{
+      return $.extend({field:table.config.checkName,type:'radio',width:30},config);
+    }
+
+  };
+
+  //鏍稿績鍏ュ彛
+  table.render = function(options){
+    if(layui.util.isNull(options.id)){
+      if(layui.util.isNotNull(options.elem) &&  $(options.elem)){
+        options.id = $(options.elem).attr("lay-filter");
+      }
+      if(layui.util.isNull(options.id))
+        options.id = layui.util.uuid();
+    }
+
+    if(!table.settings){
+      table.settings = {};
+    }
+    table.settings[options.id] = options;
+    var inst = new Class(options);
+    return thisTable.call(inst);
+  };
+
+  //娓呴櫎涓存椂Key
+  table.clearCacheKey = function(data) {
+    data = $.extend({}, data);
+    delete data[table.config.checkName];
+    delete data[table.config.indexName];
+    return data;
+  };
+  /**
+   * 閿�姣佽〃鏍�
+   * @param tableId 琛ㄦ牸鐨刬d
+   */
+  table.destory = function (tableId){
+    if(layui.util.isNull(tableId)){
+      return false;
+    }
+    //鍒犻櫎閰嶇疆
+    if(table.settings && table.settings[tableId]) {
+      delete table.settings[tableId];
+    }
+    //鍒犻櫎涓存椂鏁版嵁
+    if(table.cache && table.cache[tableId]) {
+      delete table.cache[tableId];
+    }
+    //鍒犻櫎缂栬緫鐨勬暟鎹�
+    if(table.editCache && table.editCache[tableId]){
+        return table.editCache[tableId];
+    }
+    //绉婚櫎html
+    var tableHtml = $("[lay-id='" + tableId + "']");
+    if(tableHtml){
+      tableHtml.remove();
+    }
+  };
+
+  //鑷姩瀹屾垚娓叉煋
+  $(function(){
+    table.init();
+  });
+
+  exports(MOD_NAME, table);
+});
+
+
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/table.old.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/table.old.js
new file mode 100644
index 0000000..addd635
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/table.old.js
@@ -0,0 +1,2180 @@
+/**
+
+ @Name锛歭ayui.table 琛ㄦ牸鎿嶄綔
+ @Author锛氳搐蹇�
+ @License锛歁IT
+    
+ */
+ 
+layui.define(['laytpl', 'laypage', 'layer', 'form','laydate','vciWebRefer','tree'], function(exports){
+  "use strict";
+  
+  var $ = layui.$
+  ,laytpl = layui.laytpl
+  ,laypage = layui.laypage
+  ,layer = layui.layer
+  ,form = layui.form
+  ,hint = layui.hint()
+  ,device = layui.device(),
+      laydate = layui.laydate
+  //澶栭儴鎺ュ彛
+  ,table = {
+    selectMode:{//琛ㄦ牸閫夋嫨妯″紡
+        single:'single',
+        muti:'muti'
+    }
+    ,config: {
+      checkName: 'LAY_CHECKED' //鏄惁閫変腑鐘舵�佺殑瀛楁鍚�
+      ,indexName: 'LAY_TABLE_INDEX', //涓嬫爣绱㈠紩鍚�
+      remoteSort:true,//weidy@2018-03-05 鏄惁浣跨敤鍚庡彴鏉ユ帓搴�
+      checkOnSelect:true,//weidy@2018-05-17 鍗曢�夎鐨勬椂鍊欒嚜鍔ㄥ嬀閫�
+      selectMode:'single'//weidy@2018-05-17 鏁版嵁鍗曢�夎繕鏄閫夛紝涓昏鍦╟heckOnSelect=true鐨勬椂鍊欏垽鏂槸鍚︽竻闄ゅ叾浠栬鐨勫閫夋
+    } //鍏ㄥ眬閰嶇疆椤�
+    ,cache: {} //鏁版嵁缂撳瓨
+    ,index: layui.table ? (layui.table.index + 10000) : 0
+    
+    //璁剧疆鍏ㄥ眬椤�
+    ,set: function(options){
+      var that = this;
+      that.config = $.extend({}, that.config, options);
+      return that;
+    }
+    
+    //浜嬩欢鐩戝惉
+    ,on: function(events, callback){
+      return layui.onevent.call(this, MOD_NAME, events, callback);
+    }
+  }
+  
+  //鎿嶄綔褰撳墠瀹炰緥
+  ,thisTable = function(){
+    var that = this
+    ,options = that.config
+    ,id = options.id;
+    
+    id && (thisTable.config[id] = options);
+    
+    return {
+      reload: function(options){
+        that.reload.call(that, options);
+      }
+      ,config: options
+    }
+  }
+  
+  //瀛楃甯搁噺
+  ,MOD_NAME = 'table', ELEM = '.layui-table', THIS = 'layui-this', SHOW = 'layui-show', HIDE = 'layui-hide', DISABLED = 'layui-disabled', NONE = 'layui-none'
+
+      ,ELEM_BOX='.layui-table-box' , ELEM_TOTAL='.layui-table-total',ELEM_VIEW = 'layui-table-view', ELEM_HEADER = '.layui-table-header', ELEM_BODY = '.layui-table-body', ELEM_MAIN = '.layui-table-main', ELEM_FIXED = '.layui-table-fixed', ELEM_FIXL = '.layui-table-fixed-l', ELEM_FIXR = '.layui-table-fixed-r', ELEM_TOOL = '.layui-table-tool',ELEM_TOOLS = '.layui-table-tool-self', ELEM_PAGE = '.layui-table-page', ELEM_SORT = '.layui-table-sort', ELEM_EDIT = 'layui-table-edit', ELEM_HOVER = 'layui-table-hover'
+  
+  //thead鍖哄煙妯℃澘
+  ,TPL_HEADER = function(options){
+    var rowCols = '{{#if(item2.colspan){}} colspan="{{item2.colspan}}"{{#} if(item2.rowspan){}} rowspan="{{item2.rowspan}}"{{#}}}';
+    
+    options = options || {};
+    return ['<table cellspacing="0" cellpadding="0" border="0" class="layui-table" '
+      ,'{{# if(d.data.skin){ }}lay-skin="{{d.data.skin}}"{{# } }} {{# if(d.data.size){ }}lay-size="{{d.data.size}}"{{# } }} {{# if(d.data.even){ }}lay-even{{# } }}>'
+      ,'<thead>'
+      ,'{{# layui.each(d.data.cols, function(i1, item1){ }}'
+        ,'<tr>'
+        ,'{{# layui.each(item1, function(i2, item2){ }}'
+          ,'{{# if(item2.fixed && item2.fixed !== "right"){ left = true; } }}'
+          ,'{{# if(item2.fixed === "right"){ right = true; } }}'
+          ,function(){
+            if(options.fixed && options.fixed !== 'right'){
+              return '{{# if(item2.fixed && item2.fixed !== "right"){ }}';
+            }
+            if(options.fixed === 'right'){
+              return '{{# if(item2.fixed === "right"){ }}';
+            }
+            return '';
+          }()
+          ,'<th data-field="{{item2.field.split(\',\')[0]||i2 }}" data-key = "{{d.index}}-{{i1}}-{{i2}}"{{# if(item2.minWidth){ }}data-minwidth="{{item2.minWidth}}"{{# } }} '+ rowCols +' {{# if(item2.unresize){ }}data-unresize="true"{{# } }} {{# if(item2.hidden){}} class="layui-hide" {{#}}}>'
+            ,'<div   class="layui-table-cell laytable-cell-' //modify by weidy@2020-06-06 鍘婚櫎鍦ㄦ爣棰樹笂璁剧疆瀹藉害锛屽惁鍒欐棤娉曡皟鏁村搴�
+              ,'{{# if(item2.colspan > 1){ }}'
+                ,'group'
+              ,'{{# } else { }}'
+                ,'{{d.index}}-{{item2.field.split(",")[0].replace(\'.\',\'--\') || i2}}'
+                ,'{{# if(item2.type !== "normal"){ }}'
+                  ,' laytable-cell-{{ item2.type }}'
+                ,'{{# } }}'
+              ,'{{# } }}'
+            ,'" {{#if(item2.titleAlign){}}align="{{item2.titleAlign}}"{{#}}}>'//weidy@2018-03-15 澧炲姞鏍囬瀵归綈鍙傛暟
+              ,'{{# if(item2.type === "checkbox"){ }}' //澶嶉�夋
+                ,'<input type="checkbox" name="layTableCheckbox" lay-skin="primary" lay-filter="layTableAllChoose" {{# if(item2[d.data.checkName]){ }}checked{{# }; }}>'
+              ,'{{# } else { }}'
+                ,'<span>{{item2.title||""}}</span>'
+                ,'{{# if(!(item2.colspan > 1) && item2.sort){ }}'
+                  ,'<span class="layui-table-sort layui-inline"><i class="layui-edge layui-table-sort-asc"></i><i class="layui-edge layui-table-sort-desc"></i></span>'
+                ,'{{# } }}'
+              ,'{{# } }}'
+            ,'</div>'
+          ,'</th>'
+          ,(options.fixed ? '{{# }; }}' : '')
+        ,'{{# }); }}'
+        ,'</tr>'
+      ,'{{# }); }}'
+      ,'</thead>'
+    ,'</table>'].join('');
+  }
+  
+  //tbody鍖哄煙妯℃澘
+  ,TPL_BODY = ['<table cellspacing="0" cellpadding="0" border="0" class="layui-table" '
+    ,'{{# if(d.data.skin){ }}lay-skin="{{d.data.skin}}"{{# } }} {{# if(d.data.size){ }}lay-size="{{d.data.size}}"{{# } }} {{# if(d.data.even){ }}lay-even{{# } }}>'
+    ,'<tbody></tbody>'
+  ,'</table>'].join('')
+  
+  //涓绘ā鏉�
+  ,TPL_MAIN = ['<div class="layui-form layui-border-box {{d.VIEW_CLASS}}" lay-filter="LAY-table-{{d.index}}" style="{{# if(d.data.width){ }}width:{{d.data.width}}px;{{# } }} {{# if(d.data.height){ }}height:{{d.data.height}}px;{{# } }}">'
+    
+   /* ,'{{# if(d.data.toolbar){ }}'
+    ,'<div class="layui-table-tool"></div>'
+    ,'{{# } }}'*/
+    ,'<div class="layui-table-tool-temp"></div>'
+
+    ,'<div class="layui-table-box">'
+      ,'{{# var left, right; }}'
+      ,'<div class="layui-table-header">'
+        ,TPL_HEADER()
+      ,'</div>'
+      ,'<div class="layui-table-body layui-table-main">'
+        ,TPL_BODY
+      ,'</div>'
+      
+      ,'{{# if(left){ }}'
+      ,'<div class="layui-table-fixed layui-table-fixed-l">'
+        ,'<div class="layui-table-header">'
+          ,TPL_HEADER({fixed: true}) 
+        ,'</div>'
+        ,'<div class="layui-table-body">'
+          ,TPL_BODY
+        ,'</div>'      
+      ,'</div>'
+      ,'{{# }; }}'
+      
+      ,'{{# if(right){ }}'
+      ,'<div class="layui-table-fixed layui-table-fixed-r">'
+        ,'<div class="layui-table-header">'
+          ,TPL_HEADER({fixed: 'right'})
+          ,'<div class="layui-table-mend"></div>'
+        ,'</div>'
+        ,'<div class="layui-table-body">'
+          ,TPL_BODY
+        ,'</div>'
+      ,'</div>'
+      ,'{{# }; }}'
+    ,'</div>'
+
+    ,'{{# if(d.data.totalRow)}}'
+    ,'<div class="layui-table-total">'
+      ,TPL_BODY
+      ,'</div>'
+
+
+    ,'{{# if(d.data.page){ }}'
+    ,'<div class="layui-table-page">'
+      ,'<div id="layui-table-page{{d.index}}"></div>'
+    ,'<div class="layui-table-tool-self"></div>'
+    ,'</div>'
+    ,'{{# } }}'
+    
+    ,'<style>'
+    ,'{{# layui.each(d.data.cols, function(i1, item1){'
+      ,'layui.each(item1, function(i2, item2){ }}'
+        ,".laytable-cell-{{d.index}}-{{item2.field.split(',')[0].replace(\'.\','--')||i2}}{ "
+        ,'{{# if(item2.width){ }}'
+          ,'width: {{item2.width}}px;'
+        ,'{{# } }}'
+        ,' }'
+      ,'{{# });'
+    ,'}); }}'
+    ,'</style>'
+  ,'</div>'].join('')
+  
+  ,_WIN = $(window)
+  ,_DOC = $(document)
+  
+  //鏋勯�犲櫒
+  ,Class = function(options){
+    var that = this;
+    that.index = ++table.index;
+    that.config = $.extend({}, that.config, table.config, options);
+    that.render();
+  };
+
+  //榛樿閰嶇疆
+  Class.prototype.config = {
+    limit: 10 //姣忛〉鏄剧ず鐨勬暟閲�
+    ,loading: true //璇锋眰鏁版嵁鏃讹紝鏄惁鏄剧ずloading
+    ,cellMinWidth: 60 //鎵�鏈夊崟鍏冩牸榛樿鏈�灏忓搴�
+    ,defaultToolbar:["filter","exports","print"]
+    ,text: {
+      none: '鏃犳暟鎹�'
+    }
+  };
+
+
+
+  //琛ㄦ牸娓叉煋
+  Class.prototype.render = function(){
+    var that = this
+    ,options = that.config;
+
+    options.elem = $(options.elem);
+    options.where = options.where || {};
+    options.id = options.id || options.elem.attr('id');
+
+    //璇锋眰鍙傛暟鐨勮嚜瀹氫箟鏍煎紡
+    options.request = $.extend({
+      pageName: 'page'
+      ,limitName: 'limit',
+      orderName:'order',//weidy@2018-03-05浣跨敤鎺掑簭鐨勭殑绫诲瀷锛� asc ,desc
+      sortName:'sort',//鎺掑簭鐨勫瓧娈碉紝
+    }, options.request)
+    
+    //鍝嶅簲鏁版嵁鐨勮嚜瀹氫箟鏍煎紡
+    options.response = $.extend({
+      statusName: 'code'
+      ,statusCode: 200//weidy@2020/2/24 淇敼姝g‘鐨勭姸鎬佺爜锛屼互鍓�0
+      ,msgName: 'msg'
+      ,dataName: 'data'
+      ,countName: 'total'//weidy@2018-03-05淇敼榛樿鐨勫睘鎬э紝鍘熶负count
+    }, options.response);
+    
+    //濡傛灉 page 浼犲叆 laypage 瀵硅薄
+    if(typeof options.page === 'object'){
+      options.limit = options.page.limit || options.limit;
+      options.limits = options.page.limits || options.limits;
+      that.page = options.page.curr = options.page.curr || 1;
+      delete options.page.elem;
+      delete options.page.jump;
+    }
+
+    if(!options.elem[0]) return that;
+    
+    that.setArea(); //鍔ㄦ�佸垎閰嶅垪瀹介珮
+    
+    //寮�濮嬫彃鍏ユ浛浠e厓绱�
+    var othis = options.elem
+    ,hasRender = othis.next('.' + ELEM_VIEW)
+    
+    //涓诲鍣�
+    ,reElem = that.elem = $(laytpl(TPL_MAIN).render({
+      VIEW_CLASS: ELEM_VIEW
+      ,data: options
+      ,index: that.index //绱㈠紩
+    }));
+    
+    options.index = that.index;
+    
+    //鐢熸垚鏇夸唬鍏冪礌
+    hasRender[0] && hasRender.remove(); //濡傛灉宸茬粡娓叉煋锛屽垯Rerender
+    othis.after(reElem);
+    
+    //鍚勭骇瀹瑰櫒
+    that.layHeader = reElem.find(ELEM_HEADER);
+    that.layMain = reElem.find(ELEM_MAIN);
+    that.layBody = reElem.find(ELEM_BODY);
+    that.layFixed = reElem.find(ELEM_FIXED);
+    that.layFixLeft = reElem.find(ELEM_FIXL);
+    that.layFixRight = reElem.find(ELEM_FIXR);
+    that.layTool = reElem.find(ELEM_TOOL);
+    that.layTools = reElem.find(ELEM_TOOLS);
+    that.layPage = reElem.find(ELEM_PAGE);//ELEM_TOTAL
+    that.layTotal = reElem.find(ELEM_TOTAL);
+    that.layBox = reElem.find(ELEM_BOX);
+    that.renderToolbar();
+    that.layTool.html(
+      laytpl($(options.toolbar).html()||'').render(options)
+    );
+    
+    if(options.height) that.fullSize(); //璁剧疆body鍖哄煙楂樺害
+    
+    //濡傛灉澶氱骇琛ㄥご锛屽垯濉ˉ琛ㄥご楂樺害
+    if(options.cols.length > 1){
+      var th = that.layFixed.find(ELEM_HEADER).find('th');
+      th.height(that.layHeader.height() - 1 - parseFloat(th.css('padding-top')) - parseFloat(th.css('padding-bottom')));
+    }
+    
+    //璇锋眰鏁版嵁
+    that.pullData(that.page);
+    that.events();
+  };
+  //2.4 宸ュ叿鏍�
+  Class.prototype.renderToolbar = function(){
+    var that = this,options = that.config
+        ,inline =['<div class = "layui-inline" lay-event="add"><i class="layui-icon layui-icon-add-1"></i></div>'
+                  ,'<div class = "layui-inline" lay-event="update"><i class="layui-icon layui-icon-edit"></i></div>'
+                  ,'<div class = "layui-inline" lay-event="delete"><i class="layui-icon layui-icon-delete"></i></div>'
+                 ].join("")
+        ,temp = that.layTools.find(".layui-table-tool-self");
+    if(true===options.toolbar)temp.html(inline);
+    else{
+      that.layTools.remove();
+    }
+    var r = {
+      filter:{
+        title:"绛涢�夊垪",
+        layEvent:"LAYTABLE_COLS",
+        icon:"layui-icon-search",
+        text:"绛涢�夊垪"
+      },
+      exports:{
+        title:"瀵煎嚭",
+        layEvent:"LAYTABLE_EXPORT",
+        icon:"layui-icon-share",
+        text:"瀵煎嚭"
+      },
+      print:{
+        title:"鎵撳嵃",
+        layEvent:"LAYTABLE_PRINT",
+        icon:"layui-icon-upload",
+        text:"鎵撳嵃"
+      }
+    },d = []
+    "object" == typeof options.defaultToolbar && layui.each(options.defaultToolbar,function(that,t){
+      var i = r[t];
+      i && d.push('<div class="layui-inline" title="'+ i.title+'" lay-event="'+ i.layEvent+'"><i class="layui-icon '+ i.icon+'"></i></div> ')
+      }),that.layTools.html(d.join(""));
+  };
+  //
+  //
+  Class.prototype.setParentCol = function(e,t){
+    var that = this,options = that.config,
+        targetDom = that.layHeader.find('th[data-key="'+options.index+"-"+t+'"]')
+        ,n = parseInt(targetDom.attr("colspan"))||0;
+    if(targetDom[0]){
+      var o = t.split("-"),
+          r = options.col[o[0]][o[1]];
+      e ? n--:n++,targetDom.attr("colspan",n),targetDom[n<1?"addClass":"removeClass"](HIDE), r.colspan = n, r.hide = n < 1;
+      var parentKey = targetDom.data("parentkey");
+      parentKey && that.setPatentCol(e,d)
+    }
+  };
+  //鏍规嵁鍒楃被鍨嬶紝瀹氬埗鍖栧弬鏁�
+  Class.prototype.initOpts = function(item){
+    var that = this,
+    options = that.config
+    ,initWidth = {
+      checkbox: 48
+      ,space: 15
+      ,numbers: 40
+    };
+    
+    //璁� type 鍙傛暟鍏煎鏃х増鏈�
+    if(item.checkbox) item.type = "checkbox";
+    if(item.space) item.type = "space";
+    if(!item.type) item.type = "normal";
+    
+    if(item.type !== "normal"){
+      item.unresize = true;
+      item.width = item.width || initWidth[item.type];
+    }
+  };
+  
+  //鍔ㄦ�佸垎閰嶅垪瀹介珮
+  Class.prototype.setArea = function(){
+    var that = this,
+    options = that.config
+    ,colNums = 0 //鍒椾釜鏁�
+    ,autoColNums = 0 //鑷姩鍒楀鐨勫垪涓暟
+    ,autoWidth = 0 //鑷姩鍒楀垎閰嶇殑瀹藉害
+    ,countWidth = 0 //鎵�鏈夊垪鎬诲搴﹀拰
+    ,cntrWidth = options.width || function(){ //鑾峰彇瀹瑰櫒瀹藉害
+      //濡傛灉鐖跺厓绱犲搴︿负0锛堜竴鑸负闅愯棌鍏冪礌锛夛紝鍒欑户缁煡鎵句笂灞傚厓绱狅紝鐩村埌鎵惧埌鐪熷疄瀹藉害涓烘
+      var getWidth = function(parent){
+        var width, isNone;
+        parent = parent || options.elem.parent()
+        width = parent.width();
+        try {
+          isNone = parent.css('display') === 'none';
+        } catch(e){}
+        if(parent[0] && (!width || isNone)) return getWidth(parent.parent());
+        return width;
+      };
+      return getWidth();
+    }();
+    
+    //缁熻鍒椾釜鏁�
+    that.eachCols(function(){
+      colNums++;
+    });
+    
+    //鍑忓幓杈规宸�
+    cntrWidth = cntrWidth - function(){
+      return (options.skin === 'line' || options.skin === 'nob') ? 2 : colNums + 1;
+    }();
+
+    //閬嶅巻鎵�鏈夊垪
+    layui.each(options.cols, function(i1, item1){
+      layui.each(item1, function(i2, item2){
+        var width;
+
+        if(!item2){
+          item1.splice(i2, 1);
+          return;
+        }
+        
+        that.initOpts(item2);
+        width = item2.width || 0;
+        
+        if(item2.colspan > 1) return;
+
+        if(/\d+%$/.test(width)){
+          item2.width = width = Math.floor((parseFloat(width) / 100) * cntrWidth);
+        } else if(!width){ //鍒楀鏈~鍐�
+          item2.width = width = 0;
+          autoColNums++;
+        }
+        
+        countWidth = countWidth + width;
+      });
+    });
+    
+    that.autoColNums = autoColNums; //璁板綍鑷姩鍒楁暟
+    
+    //濡傛灉鏈~鍏呮弧锛屽垯灏嗗墿浣欏搴﹀钩鍒嗐�傚惁鍒欙紝缁欐湭璁惧畾瀹藉害鐨勫垪璧嬪�间竴涓粯璁ゅ
+    (cntrWidth > countWidth && autoColNums) && (
+      autoWidth = (cntrWidth - countWidth) / autoColNums
+    );
+    
+    layui.each(options.cols, function(i1, item1){
+      layui.each(item1, function(i2, item2){
+        var minWidth = item2.minWidth || options.cellMinWidth;
+        if(item2.colspan > 1) return;
+        if(item2.width === 0){
+          item2.width = Math.floor(autoWidth >= minWidth ? autoWidth : minWidth); //涓嶈兘浣庝簬璁惧畾鐨勬渶灏忓搴�
+        }
+      });
+    });
+    
+    //楂樺害閾烘弧锛歠ull-宸窛鍊�
+    if(options.height && /^full-\d+$/.test(options.height)){
+      that.fullHeightGap = options.height.split('-')[1];
+      options.height = _WIN.height() - that.fullHeightGap;
+    }
+  };
+  //闅愯棌鍒椾箣鍚庤嚜鍔ㄥ畾瀹�  ---甯﹀畬鍠�  鏆傛椂鐢ㄤ笉鍒�
+  Class.prototype.setColsWidth = function(){
+    var that = this,
+        options = that.config,
+        width = that.setInit("width"),i = 0,l = 0,a = 0,n = 0;
+    that.eachCols(function(e,t){
+      t.hide || i ++
+    });width = width - function(){
+          return "line" === options.skin || "nob" === options.skin ? 2 : i + 1
+        }() - that.getScrollWidth(that.layMain[0]) - 1;
+    var r = function(e){
+      layui.each(that.cols,function(i,r){
+        layui.each(r,function(i,d){
+          var c = 0,s = d.minWidth || options.cellMinWidth;
+          return d ? void(d.colGroup || d.hide || (e ? l && l < s && (a--, c = s) : (c = d.width || 0,/\d+%$/.test(c) ? (c = Math.floor(parseFloat(c) / 100 * width),c < s && (c = s)) : c || (d.width = c = 0 , a++)), d.hide && (c = 0),n +=c)) : void r.splice(i,1)
+        })
+      }),width > n && a && (l = (width - n) / a)
+    };
+    r(),r(!0),that.autoColNums = a,that.eachCols(function(i,a){
+      var n = a.minWidth || options.cellMinWidth;
+      a.colGroup || a.hide || (0 === a.width ? that.getCssRule(options.index + "-" + a.key,function(e){
+        e.style.width = Math.floor(l>=n? l:n) + "px"
+      }) : /\d+%$/.test(a.width) && that.getCssRule(options.index + "-" + a.key,function(e){
+        e.style.width = Math.floor(parseFloat(a.width)/100 * width)+ "px"
+      }))
+    });
+    var d = that.layMain.width() - that.getScrollWidth(that.layMain[0]) - that.layMain.children("table").outerWidth();
+    if(that.autoColNums && d >= -i && d<= i){
+      var c = function(t){
+        var i;
+        return t = t || that.layHeader.eq(0).find("thead th:last-child"),i = t.data("field"),!i && t.prev()[0] ? c(t.prev()) : t
+      },s = c(),u = s.data("key");
+      that.getCssRule(u,function(t){
+        var i = t.style.width || s.outerWidth();
+        t.style.width = parseFloat(i) + d + "px",that.layMain.height() - that.layMain.prop("clientHeight") > 0 && (t.style.width = parseFloat(t.style.width) - 1 + "px")
+      })
+    }
+    //that.loading(!0)
+  };
+  //寰呭畬鍠�
+  Class.prototype.setInit = function(e){
+    var that = this,options = that.config;
+    return options.clientWidth = options.width || function(){
+          var e = function(t){
+            var a,l;
+            t = t || options.elem.parent(),a = t.width();
+            try{
+              l = "none" === t.css("display")
+            }catch(n){}
+            return !t[0] || a && !l ? a : e(t.parent())
+          };return e()
+        }(),"width" === e ? options.clientWidth : void layui.each(options.cols,function(e,a){
+          layui.each(a,function(l,n){
+            if(!n)return void a.splice(l,i);
+            if(n.key = e + "-" + l , n.hide = n.hide || !1 , n.colGroup || n.colspan > 1){
+              var o = 0;
+              layui.each(options.cols[e+1],function(t,i){
+                i.HAS_PARENT || o >1 && o == n.colspan || (i.HAS_PARENT = !0 , i.parentKey = e + "-" +l,o +=parseInt(i.colspan > 1 ? i.colspan :1))
+              }), n.colGroup = !0
+            }
+            that.initOpts(n)
+          })
+    })
+  };
+  //
+  Class.prototype.resize = function(){
+    var that = this;
+    that.fullSize();that.scrollPatch();/*that.setColsWidth();-------寰呭畬鍠�*/
+  };
+  //琛ㄦ牸閲嶈浇
+  Class.prototype.reload = function(options){
+    var that = this;
+    if(that.config.data && that.config.data.constructor === Array) delete that.config.data;
+    that.config = $.extend({}, that.config, options);
+    that.render();
+  };
+  
+  //椤电爜
+  Class.prototype.page = 1;
+  
+  //鑾峰緱鏁版嵁
+  Class.prototype.pullData = function(curr, loadIndex){
+    var that = this
+    ,options = that.config
+    ,request = options.request
+    ,response = options.response
+    ,sort = function(){
+      if(typeof options.initSort === 'object'){
+        that.sort((options.initSort.sortField||options.initSort.field), options.initSort.type);
+      }
+    };
+    
+    that.startTime = new Date().getTime(); //娓叉煋寮�濮嬫椂闂�
+    
+    if(options.url){ //Ajax璇锋眰
+      var params = {};
+      if(options.page){
+          params[request.pageName] = curr;
+          params[request.limitName] = options.limit;
+      }else{
+          params[request.pageName] = 1;
+          params[request.limitName] = -1;
+      }
+      if(options.remoteSort && that.sortKey){
+    	  params[request.orderName] =that.sortKey.sort;//鏂规硶
+    	  params[request.sortName] = that.sortKey.field;//瀛楁
+      }
+      var queryParams={}
+      if(options.sourceDataParams){
+        //璇存槑鏄墿灞曞睘鎬�
+        for (var key in options.sourceDataParams) {
+          if(key && key.constructor === Object) return;
+          queryParams['sourceData["'+key+'"]' ] = options.sourceDataParams[key];//鏂扮殑鏂瑰紡
+        }
+      }
+      $webUtil.ajax(options.method || 'get',options.url,$.extend(params, options.where,options.extraParams,queryParams),function (res) {
+        if(res[response.statusName] != 0 && res[response.statusName] != response.statusCode){
+          that.renderForm();
+          that.layMain.html('<div class="'+ NONE +'">'+ (res[response.msgName] || '杩斿洖鐨勬暟鎹姸鎬佸紓甯�') +'</div>');
+        } else {
+          that.renderData(res, curr, res[response.countName],!options.remoteSort);
+          if(options.remoteSort && that.sortKey){
+            //璇存槑鏄粠鍚庡彴鍘绘帓搴忕殑锛屽氨涓嶉渶瑕佸墠绔帓搴忎簡
+          }else{
+            sort();
+          }
+          options.time = (new Date().getTime() - that.startTime) + ' ms'; //鑰楁椂锛堟帴鍙h姹�+瑙嗗浘娓叉煋锛�
+        }
+        loadIndex && layer.close(loadIndex);
+        typeof options.done === 'function' && options.done(res, curr, res[response.countName]);
+      },function (xhr,error) {
+        that.layMain.html('<div class="'+ NONE +'">鏁版嵁鎺ュ彛璇锋眰寮傚父</div>');
+        that.renderForm();
+        loadIndex && layer.close(loadIndex);
+        $webUtil.showDebugMsg(error);
+      },options.backPath);
+    } else if(options.data && options.data.constructor === Array){ //宸茬煡鏁版嵁
+      var res = {}
+      ,startLimit = curr*options.limit - options.limit
+      if(options.limit > 0){
+        res[response.dataName] = options.data.concat().splice(startLimit, options.limit);
+        res[response.countName] = options.data.length;
+      }else{
+          res[response.dataName] = options.data;
+          res[response.countName] = options.data.length;
+      }
+      that.renderData(res, curr, options.data.length), sort();
+      typeof options.done === 'function' && options.done(res, curr, res[response.countName]);
+    }
+  };
+  //閬嶅巻琛ㄥご
+  Class.prototype.eachCols = function(callback){
+    var cols = $.extend(true, [], this.config.cols)
+    ,arrs = [], index = 0;
+
+    //閲嶆柊鏁寸悊琛ㄥご缁撴瀯
+    layui.each(cols, function(i1, item1){
+      layui.each(item1, function(i2, item2){
+        //濡傛灉鏄粍鍚堝垪锛屽垯鎹曡幏瀵瑰簲鐨勫瓙鍒�
+        if(item2.colspan > 1){
+          var childIndex = 0;
+          index++
+          item2.CHILD_COLS = [];
+          layui.each(cols[i1 + 1], function(i22, item22){
+            if(item22.PARENT_COL || childIndex == item2.colspan) return;
+            item22.PARENT_COL = index;
+            item2.CHILD_COLS.push(item22);
+            childIndex = childIndex + (item22.colspan > 1 ? item22.colspan : 1);
+          });
+        }
+        if(item2.PARENT_COL) return; //濡傛灉鏄瓙鍒楋紝鍒欎笉杩涜杩藉姞锛屽洜涓哄凡缁忓瓨鍌ㄥ湪鐖跺垪涓�
+        arrs.push(item2)
+      });
+    });
+
+    //閲嶆柊閬嶅巻鍒楋紝濡傛灉鏈夊瓙鍒楋紝鍒欒繘鍏ラ�掑綊
+    var eachArrs = function(obj){
+      layui.each(obj || arrs, function(i, item){
+        if(item.CHILD_COLS) return eachArrs(item.CHILD_COLS);
+        callback(i, item);
+      });
+    };
+    
+    eachArrs();
+  };
+  
+  //鏁版嵁娓叉煋
+  Class.prototype.renderData = function(res, curr, count, sort){
+    var that = this
+    ,options = that.config
+    ,data = res[options.response.dataName] || []
+    ,trs = []
+    ,trs_fixed = []
+    ,trs_fixed_r = []
+    
+    //娓叉煋瑙嗗浘
+    ,render = function(){ //鍚庣画鎬ц兘鎻愬崌鐨勯噸鐐�
+      if(!sort && that.sortKey && !that.config.remoteSort){
+        return that.sort((that.sortKey.sortField||that.sortKey.field), that.sortKey.sort, true);
+      }
+      layui.each(data, function(i1, item1){
+        var tds = [], tds_fixed = [], tds_fixed_r = []
+        ,numbers = i1 + options.limit*(curr - 1) + 1; //搴忓彿
+        
+        if(item1.length === 0) return;
+        if(!sort){
+          item1[table.config.indexName] = i1;
+        }
+        
+        that.eachCols(function(i3, item3){
+          var field = item3.field || i3, content = item1[field]
+          ,cell = that.getColElem(that.layHeader, field.split(',')[0]);
+          if(field.indexOf("_")>-1 && field.replace("_",".") in item1){//鍙傜収瀛楁鐨勬樉绀哄��
+        	  content = item1[field.replace("_",".")];
+          }
+          if(field.indexOf(".")>-1 && field.split(".")[0] in item1 && item1[field.split(".")[0]][field.split(".")[1]]){//瀛楁鏄璞★紝鑾峰彇璇ュ璞′腑鐨勫��
+            content = item1[field.split(".")[0]][field.split(".")[1]];
+          }
+          if(field.indexOf(",")>-1){//涓�鍒楁樉绀哄涓瓧娈�,瀛楁涔嬮棿浠�','鍒嗘牸,鍙负瀛楃涓�
+            content = '';
+            layui.each(field.split(','), function(fi,fitem){
+              content += item1[$.trim(fitem)] || ((fitem in item1)?'':fitem);
+            })
+          }
+          if(item3.dateFormate){
+            content = $webUtil.formateDateByFormate(content,item3.dateFormate);
+          }
+          if(content === undefined || content === null) content = '';
+          if(item3.colspan > 1) return;
+          field=field.split(',')[0];
+          /*if(field.indexOf(".")>-1 && field.split(".")[0] in item1){//瀛楁鏄璞★紝鑾峰彇璇ュ璞′腑鐨勫��
+            field = field.replace(/\./g,'--');
+          }*/
+          //td鍐呭
+          var td = ['<td data-field="'+ field +'" data-key="'+options.index+'-0-'+i3+'"'+ function(){
+            var attr = [];
+            if(item3.edit) attr.push('data-edit="'+ item3.edit +'"'); //鏄惁鍏佽鍗曞厓鏍肩紪杈�
+              if(item3.editConfig){
+                //modify by weidy@2020-12-21
+                  //澧炲姞缂栬緫鐨勬椂鍊欑殑寮瑰嚭閰嶇疆
+                  attr.push("data-editConfig='"+ JSON.stringify(item3.editConfig) +"'"); //鏄惁鍏佽鍗曞厓鏍肩紪杈�
+              }
+            if(item3.align) attr.push(' align="'+ item3.align +'"'); //瀵归綈鏂瑰紡
+            if(item3.templet) attr.push(' data-content="'+ content +'"'); //鑷畾涔夋ā鏉�
+            if(item3.toolbar) attr.push(' data-off="true"'); //鑷畾涔夊伐鍏锋爮
+            if(item3.event) attr.push(' lay-event="'+ item3.event +'"'); //鑷畾涔変簨浠�
+            if(item3.style) attr.push(' style="'+ item3.style +'"'); //鑷畾涔夋牱寮�
+            if(item3.minWidth) attr.push(' data-minwidth="'+ item3.minWidth +'"'); //鍗曞厓鏍兼渶灏忓搴�
+            if(item3.hidden) attr.push(' class="layui-hide"');
+            if(item3.colSet) attr.push(' lay-colSet="' + item3.colSet + '"');
+            return attr.join(' ');
+          }() +'>'
+            ,'<div data-attr="'+i1+'" class="layui-table-cell laytable-cell-'+ function(){ //杩斿洖瀵瑰簲鐨凜SS绫绘爣璇�
+              var str = (options.index + '-' + field.replace('.','--'));
+              if(item3.edit) {
+                str += " "+i1;
+              }
+              return item3.type === 'normal' ? str 
+              : (str + ' laytable-cell-' + item3.type);
+            }() +'"  >' + function(){        //modify by weidy@2020-06-06 鍘婚櫎瀹藉害鐨勮缃紝鍦╟ss涓婂凡缁忚缃簡锛岀敤浜庝慨澶嶅湪璁剧疆瀹藉害鍚庢棤娉曞姩鎬佽皟鏁村搴︾殑闂
+              var tplData = $.extend(true, {
+                LAY_INDEX: numbers
+              }, item1);
+              
+              //娓叉煋澶嶉�夋鍒楄鍥�
+              if(item3.type === 'checkbox'){
+                return '<input type="checkbox" name="layTableCheckbox" lay-skin="primary" '+ function(){
+                  var checkName = table.config.checkName;
+                  //濡傛灉鏄叏閫�
+                  if(item3[checkName]){
+                    item1[checkName] = item3[checkName];
+                    return item3[checkName] ? 'checked' : '';
+                  }
+                  return tplData[checkName] ? 'checked' : '';
+                }() +'>';
+              } else if(item3.type === 'numbers'){ //娓叉煋搴忓彿
+                return numbers;
+              }else if(item3.type === 'dateitem'){
+              //  return "<input class='laydate-grid-item' value='"+content+"'>"
+              }
+
+              //that.layDateItem()
+              //瑙f瀽宸ュ叿鍒楁ā鏉�
+              if(item3.toolbar){
+                return laytpl($(item3.toolbar).html()||'').render(tplData);
+              }
+              return item3.templet ? function(){
+                return typeof item3.templet === 'function' 
+                  ? item3.templet(tplData,item3)
+                : laytpl($(item3.templet).html() || String(content)).render(tplData) 
+              }() : content;
+            }()
+          ,'</div></td>'].join('');
+          tds.push(td);
+          if(item3.fixed && item3.fixed !== 'right') tds_fixed.push(td);
+          if(item3.fixed === 'right') tds_fixed_r.push(td);
+        });
+        
+        trs.push('<tr data-index="'+ i1 +'">'+ tds.join('') + '</tr>');
+        trs_fixed.push('<tr data-index="'+ i1 +'">'+ tds_fixed.join('') + '</tr>');
+        trs_fixed_r.push('<tr data-index="'+ i1 +'">'+ tds_fixed_r.join('') + '</tr>');
+      });
+      
+      //if(data.length === 0) return;
+      
+      that.layBody.scrollTop(0);
+      that.layMain.find('.'+ NONE).remove();
+      that.layMain.find('tbody').html(trs.join(''));
+      that.layFixLeft.find('tbody').html(trs_fixed.join(''));
+      that.layFixRight.find('tbody').html(trs_fixed_r.join(''));
+
+      that.renderForm();
+      that.syncCheckAll();
+      that.haveInit ? that.scrollPatch() : setTimeout(function(){
+        that.scrollPatch();
+      }, 50);
+      that.haveInit = true;
+      layer.close(that.tipsIndex);
+    };
+    
+    that.key = options.id || options.index;
+    table.cache[that.key] = data; //璁板綍鏁版嵁
+    
+    //鏄剧ず闅愯棌鍒嗛〉鏍�
+    that.layPage[data.length === 0 && curr == 1 ? 'addClass' : 'removeClass'](HIDE);
+    
+    //鎺掑簭
+    if(sort){
+      return render();
+    }
+    
+    if(data.length === 0){
+      that.renderForm();
+      that.layFixed.remove();
+      that.layMain.find('tbody').html('');
+      that.layMain.find('.'+ NONE).remove();
+      return that.layMain.append('<div class="'+ NONE +'">'+ options.text.none +'</div>');
+    } -
+    that.renderTotal(data)//鍚堣
+
+    render();
+
+    //鍚屾鍒嗛〉鐘舵��
+    if(options.page){
+    	//鏈夊彲鑳芥瘡椤垫樉绀虹殑涓暟涓嶅湪鍒楄〃閲�
+    	var limits = options.limits || [10,30,50,100,200,500,1000];
+    	var isInLimits = false;
+    	layui.each(limits,function(_index,limitRecord){
+    		if(options.limit == limitRecord){
+    			isInLimits = true;
+    			return false;
+    		}
+    	});
+    	if(!isInLimits){
+    		limits.push(options.limit);
+      }
+      options.page = $.extend({
+        elem: 'layui-table-page' + options.index
+        ,count: count
+        ,limit: options.limit
+        ,limits: limits
+        ,groups: 3
+        ,layout: ['prev', 'page', 'next', 'skip', 'count', 'limit','refresh']
+        ,prev: '<i class="layui-icon">&#xe603;</i>'
+        ,next: '<i class="layui-icon">&#xe602;</i>'
+        ,doRefresh:function(obj){
+
+        },jumpBefore:function(obj,first){
+            if(options.beforePageJump){
+                return options.beforePageJump(obj,first);
+            }else{
+                return true;
+            }
+        }
+        ,jump: function(obj, first){
+          if(!first){
+            //鍒嗛〉鏈韩骞堕潪闇�瑕佸仛浠ヤ笅鏇存柊锛屼笅闈㈠弬鏁扮殑鍚屾锛屼富瑕佹槸鍥犱负鍏跺畠澶勭悊缁熶竴鐢ㄥ埌浜嗗畠浠�
+            //鑰屽苟闈炵敤鐨勬槸 options.page 涓殑鍙傛暟锛堜互纭繚鍒嗛〉鏈紑鍚殑鎯呭喌浠嶈兘姝e父浣跨敤锛�
+            that.page = obj.curr; //鏇存柊椤电爜
+            options.limit = obj.limit; //鏇存柊姣忛〉鏉℃暟
+            
+            that.pullData(obj.curr, that.loading());
+          }
+          if(options.pageJump){//weidy@2019-05-15淇敼锛屽鍔犻〉闈㈣烦杞殑鍔熻兘
+             options.pageJump(obj,first);
+          }
+        }
+      }, options.page);
+      options.page.count = count; //鏇存柊鎬绘潯鏁�
+      laypage.render(options.page);
+    };
+    that.layDateItem();
+  };
+  //琛ㄦ牸閫夋嫨浜嬩欢 laydate 鎻掍欢
+  Class.prototype.layDateItem = function(data){
+    var that = this,options = that.config;
+    lay(".laydate-grid-item").each(function(){
+      laydate.render({
+        elem:this,
+        type:'datetime',
+        change:function(){
+          
+        }
+      })
+    });
+  };
+  //鍚堣
+  Class.prototype.renderTotal = function(e){
+    var that = this,options = that.config,totalNum = {};
+    if(options.totalRow){
+      layui.each(e,function(e,i){
+        0 !== i.length && that.eachCols(function(e,t){
+          var l = t.field || e,
+              n = i[l];
+          t.totalRow && (totalNum[l] = (totalNum[l] || 0) + (parseFloat(n) || 0))
+        });
+      });
+      var l = [];
+      that.eachCols(function(e,t){
+        var field = t.field.split(',')[0].replace('.','--') ||  e,index = options.index,
+            o = ['<td data-field = "'+field.replace('--','.')+'" data-key="'+options.index+ "-0-"+ e+'" '+function(){
+              var e = [];
+              return t.align && e.push('align="'+t.align+'"'),t.style && e.push('style="'+t.style+'"'), t.width && e.push('data-width="'+t.width+'"'), e.join(" ")
+            }()+'class="'+function(){
+              var e = [];
+              return t.hide && e.push(HIDE),t.field || e.push("layui-table-col-special"), e.join(" ")
+            }()+'"> ','<div class = "layui-table-cell laytable-cell-' +function(){
+              var e = index+"-"+field.replace('.','--');
+              return "normal" === t.type ? e : e + " laytable-cell-" + t.type
+            }()+'">' + function(){
+              var e = t.totalRowText || '';
+              return t.totalRow ? parseFloat(totalNum[field]).toFixed(2) || e : e
+            }(),"</div></td>"].join("");
+        l.push(o);
+      }),that.layTotal.find("tbody").html("<tr>"+ l.join("")+"</tr>")
+    }
+  };
+  //鎵惧埌瀵瑰簲鐨勫垪鍏冪礌
+  Class.prototype.getColElem = function(parent, field){
+    var that = this
+    ,options = that.config;
+    return parent.eq(0).find('.laytable-cell-'+ (options.index + '-' + field) + ':eq(0)');
+  };
+  
+  //娓叉煋琛ㄥ崟
+  Class.prototype.renderForm = function(type){
+    form.render(type, 'LAY-table-'+ this.index);
+  }
+  //鍕鹃�夎幏鍙栧彇娑堝嬀閫夊閫夋
+  Class.prototype.renderCheckbox = function(checkbox,checkboxDiv,checked){
+    form.showCheckboxCss(checkbox,checkboxDiv,checked);
+  }
+  //鏁版嵁鎺掑簭
+  Class.prototype.sort = function(th, type, pull, formEvent){
+    var that = this
+    ,field
+    ,res = {}
+    ,options = that.config
+    ,filter = options.elem.attr('lay-filter')
+    ,data = table.cache[that.key], thisData;
+    
+    //瀛楁鍖归厤
+    if(typeof th === 'string'){
+      that.layHeader.find('th').each(function(i, item){
+        var othis = $(this)
+        ,_field = othis.data('field');
+        if(_field === th){
+          th = othis;
+          field = _field;
+          return false;
+        }
+      });
+    }
+
+    try {
+      var field = field.split(',')[0].replace(/\./g,'--') || th.data('field').split(',')[0].replace(/\./g,'--');
+      
+      //濡傛灉娆叉墽琛岀殑鎺掑簭宸插湪鐘舵�佷腑锛屽垯涓嶆墽琛屾覆鏌�
+      if(that.sortKey && !pull){
+        if(field === that.sortKey.field && type === that.sortKey.sort){
+          return;
+        }
+      }
+      
+      var elemSort = that.layHeader.find('th .laytable-cell-'+ options.index +'-'+ field).find(ELEM_SORT);
+      that.layHeader.find('th').find(ELEM_SORT).removeAttr('lay-sort'); //娓呴櫎鍏跺畠鏍囬鎺掑簭鐘舵��
+      elemSort.attr('lay-sort', type || null);
+      that.layFixed.find('th')
+    } catch(e){
+      return hint.error('Table modules: Did not match to field');
+    }
+    
+    //璁板綍鎺掑簭绱㈠紩鍜岀被鍨�
+    that.sortKey = {
+      field: field
+      ,sort: type
+    };
+    
+    if(that.config.remoteSort){
+    	/**
+    	 * weidy@2018-03-05 澧炲姞浣跨敤鍚庡彴鏉ヨ繘琛屾帓搴�
+    	 */
+    	if(type != 'asc' && type != 'desc'){
+    		that.sortKey = {};
+    	}
+    	that.pullData(that.page);
+    	if(formEvent){
+    		layui.event.call(th, MOD_NAME, 'sort('+ filter +')', {
+    			field: field
+    			,type: type
+    		});
+    	}
+    	return;
+    }else{
+    	if(type === 'asc'){ //鍗囧簭
+    		thisData = layui.sort(data, field);
+    	} else if(type === 'desc'){ //闄嶅簭
+    		thisData = layui.sort(data, field, true);
+    	} else { //娓呴櫎鎺掑簭
+    		thisData = layui.sort(data, table.config.indexName);
+    		delete that.sortKey;
+    	}
+    	
+    	res[options.response.dataName] = thisData;
+    	that.renderData(res, that.page, that.count, true);
+    	
+    	if(formEvent){
+    		layui.event.call(th, MOD_NAME, 'sort('+ filter +')', {
+    			field: field
+    			,type: type
+    		});
+    	}
+    }
+  };
+  
+  //璇锋眰loading
+  Class.prototype.loading = function(){
+    var that = this
+    ,options = that.config;
+    if(options.loading && options.url){
+      return layer.msg('鏁版嵁璇锋眰涓�', {
+        icon: 16
+        ,offset: [
+          that.elem.offset().top + that.elem.height()/2 - 35 - _WIN.scrollTop() + 'px'
+          ,that.elem.offset().left + that.elem.width()/2 - 90 - _WIN.scrollLeft() + 'px'
+        ]
+        ,time: -1
+        ,anim: -1
+        ,fixed: false
+      });
+    }
+  };
+  
+  //鍚屾閫変腑鍊肩姸鎬�
+  Class.prototype.setCheckData = function(index, checked){
+    var that = this
+    ,options = that.config
+    ,thisData = table.cache[that.key];
+    if(!thisData[index]) return;
+    if(thisData[index].constructor === Array) return;
+    thisData[index][options.checkName] = checked;
+  };
+  
+  //鍚屾鍏ㄩ�夋寜閽姸鎬�
+  Class.prototype.syncCheckAll = function(){
+    var that = this
+    ,options = that.config
+    ,checkAllElem = that.layHeader.find('input[name="layTableCheckbox"]')
+    ,syncColsCheck = function(checked){
+      that.eachCols(function(i, item){
+        if(item.type === 'checkbox'){
+          item[options.checkName] = checked;
+        }
+      });
+      return checked;
+    };
+    
+    if(!checkAllElem[0]) return;
+
+    if(table.checkStatus(that.key).isAll){
+      if(!checkAllElem[0].checked){
+        checkAllElem.prop('checked', true);
+        that.renderForm('checkbox');
+      }
+      syncColsCheck(true);
+    } else {
+      if(checkAllElem[0].checked){
+        checkAllElem.prop('checked', false);
+        that.renderForm('checkbox');
+      }
+      syncColsCheck(false);
+    }
+  };
+  
+  //鑾峰彇cssRule
+  Class.prototype.getCssRule = function(field, callback){
+    var that = this
+    ,style = that.elem.find('style')[0]
+    ,sheet = style.sheet || style.styleSheet || {}
+    ,rules = sheet.cssRules || sheet.rules;
+    layui.each(rules, function(i, item){
+      if(item.selectorText === ('.laytable-cell-'+ that.index +'-'+ field.split(',')[0].replace(/\./g,'--'))){
+        return callback(item), true;
+      }
+    });
+  };
+  
+  //閾烘弧琛ㄦ牸涓讳綋楂樺害
+  Class.prototype.fullSize = function(){
+    var that = this
+    ,options = that.config
+    ,height = options.height, bodyHeight;
+    
+    if(that.fullHeightGap){
+      height = _WIN.height() - that.fullHeightGap;
+      if(height < 135) height = 135;
+      that.elem.css('height', height);
+    }
+
+    //tbody鍖哄煙楂樺害
+    bodyHeight = parseFloat(height) - 26-1;//parseFloat(that.layHeader.height()) - 1;  鏈夌殑琛ㄦ牸鑾峰彇涓嶅埌layHeader.height() 浣嗘槸姣忎釜琛ㄦ牸閮藉簲璇ュ瓨鍦� 鎵�浠ョ敤26浠f浛
+    if(options.toolbar){
+      bodyHeight = bodyHeight - that.layTool.outerHeight();
+    }
+    if(options.page){
+      bodyHeight = bodyHeight - that.layPage.outerHeight() - 1;
+    }
+    if(options.size === 'lg'){
+        bodyHeight = parseFloat(height) - 26-66;
+    }
+    that.layMain.css('height', bodyHeight);
+  };
+  
+  //鑾峰彇婊氬姩鏉″搴�
+  Class.prototype.getScrollWidth = function(elem){
+    var width = 0;
+    if(elem){
+      width = elem.offsetWidth - elem.clientWidth;
+    } else {
+      elem = document.createElement('div');
+      elem.style.width = '100px';
+      elem.style.height = '100px';
+      elem.style.overflowY = 'scroll';
+
+      document.body.appendChild(elem);
+      width = elem.offsetWidth - elem.clientWidth;
+      document.body.removeChild(elem);
+    }
+    return width;
+  };
+  
+  //婊氬姩鏉¤ˉ涓�
+  Class.prototype.scrollPatch = function(){
+    var that = this
+    ,layMainTable = that.layMain.children('table')
+    ,scollWidth = that.layMain.width() - that.layMain.prop('clientWidth') //绾靛悜婊氬姩鏉″搴�
+    ,scollHeight = that.layMain.height() - that.layMain.prop('clientHeight') //妯悜婊氬姩鏉¢珮搴�
+    ,getScrollWidth = that.getScrollWidth(that.layMain[0]) //鑾峰彇涓诲鍣ㄦ粴鍔ㄦ潯瀹藉害锛屽鏋滄湁鐨勮瘽
+    ,outWidth = layMainTable.outerWidth() - that.layMain.width(); //琛ㄦ牸鍐呭鍣ㄧ殑瓒呭嚭瀹藉害
+
+    //濡傛灉瀛樺湪鑷姩鍒楀锛屽垯瑕佷繚璇佺粷瀵瑰~鍏呮弧锛屽苟涓斾笉鑳藉嚭鐜版í鍚戞粴鍔ㄦ潯
+    if(that.autoColNums && outWidth < 5 && !that.scrollPatchWStatus){
+      var th = that.layHeader.eq(0).find('thead th:last-child')
+      ,field = th.data('field').split(',')[0].replace(/\./g,'--');
+      that.getCssRule(field, function(item){
+        var width = item.style.width || th.outerWidth();
+        item.style.width = (parseFloat(width) - getScrollWidth - outWidth) + 'px';
+        
+        //浜屾鏍¢獙锛屽鏋滀粛鐒跺嚭鐜版í鍚戞粴鍔ㄦ潯
+        if(that.layMain.height() - that.layMain.prop('clientHeight') > 0){
+          item.style.width = parseFloat(item.style.width) - 1 + 'px';
+        }
+
+        that.scrollPatchWStatus = true;
+      });
+    }
+    
+    if(scollWidth && scollHeight){
+      if(!that.elem.find('.layui-table-patch')[0]){
+        var patchElem = $('<th class="layui-table-patch"><div class="layui-table-cell"></div></th>'); //琛ヤ竵鍏冪礌
+        patchElem.find('div').css({
+          width: scollWidth
+        });
+        that.layHeader.eq(0).find('thead tr').append(patchElem)
+      }
+    } else {
+      that.layHeader.eq(0).find('.layui-table-patch').remove();
+    }
+    
+    //鍥哄畾鍒楀尯鍩熼珮搴�
+    var mainHeight = that.layMain.height()
+    ,fixHeight = mainHeight - scollHeight;
+    that.layFixed.find(ELEM_BODY).css('height', layMainTable.height() > fixHeight ? fixHeight : 'auto');
+    
+    //琛ㄦ牸瀹藉害灏忎簬瀹瑰櫒瀹藉害鏃讹紝闅愯棌鍥哄畾鍒�
+    that.layFixRight[outWidth > 0 ? 'removeClass' : 'addClass'](HIDE); 
+    
+    //鎿嶄綔鏍�
+    that.layFixRight.css('right', scollWidth - 1); 
+  };
+
+  //浜嬩欢澶勭悊
+  Class.prototype.events = function(){
+    var that = this
+    ,options = that.config
+    ,_BODY = $('body')
+    ,dict = {}
+    ,th = that.layHeader.find('th')
+    ,resizing
+    ,ELEM_CELL = '.layui-table-cell'
+    ,filter = options.elem.attr('lay-filter');
+    //鎷栨嫿璋冩暣瀹藉害    
+    th.on('mousemove', function(e){
+      var othis = $(this)
+      ,oLeft = othis.offset().left
+      ,pLeft = e.clientX - oLeft;
+      if(othis.attr('colspan') > 1 || othis.data('unresize') || dict.resizeStart){
+        return;
+      }
+      dict.allowResize = othis.width() - pLeft <= 10; //鏄惁澶勪簬鎷栨嫿鍏佽鍖哄煙
+      _BODY.css('cursor', (dict.allowResize ? 'col-resize' : ''));
+    }).on('mouseleave', function(){
+      var othis = $(this);
+      if(dict.resizeStart) return;
+      _BODY.css('cursor', '');
+    }).on('mousedown', function(e){
+      var othis = $(this);
+      if(dict.allowResize){
+        var field = othis.data('field');
+        e.preventDefault();
+        dict.resizeStart = true; //寮�濮嬫嫋鎷�
+        dict.offset = [e.clientX, e.clientY]; //璁板綍鍒濆鍧愭爣
+        
+        that.getCssRule(field, function(item){
+          var width = item.style.width || othis.outerWidth();
+          dict.rule = item;
+          dict.ruleWidth = parseFloat(width);
+          dict.minWidth = othis.data('minwidth') || options.cellMinWidth;
+        });
+      }
+    });
+    //鎷栨嫿涓�
+    _DOC.on('mousemove', function(e){
+      if(dict.resizeStart){
+        e.preventDefault();
+        if(dict.rule){
+          var setWidth = dict.ruleWidth + e.clientX - dict.offset[0];
+          if(setWidth < dict.minWidth) setWidth = dict.minWidth;
+          dict.rule.style.width = setWidth + 'px';
+          layer.close(that.tipsIndex);
+        }
+        resizing = 1
+      }
+    }).on('mouseup', function(e){
+      if(dict.resizeStart){
+        dict = {};
+        _BODY.css('cursor', '');
+        that.scrollPatch();
+      }
+      if(resizing === 2){
+        resizing = null;
+      }
+    });
+    
+    //鎺掑簭
+    th.on('click', function(){
+      var othis = $(this)
+      ,elemSort = othis.find(ELEM_SORT)
+      ,nowType = elemSort.attr('lay-sort')
+      ,type;
+
+      if(!elemSort[0] || resizing === 1) return resizing = 2;      
+      
+      if(nowType === 'asc'){
+        type = 'desc';
+      } else if(nowType === 'desc'){
+        type = null;
+      } else {
+        type = 'asc';
+      }
+      that.sort(othis, type, null, true);
+    }).find(ELEM_SORT+' .layui-edge ').on('click', function(e){
+      var othis = $(this)
+      ,index = othis.index()
+      ,field = othis.parents('th').eq(0).data('sortField')||othis.parents('th').eq(0).data('field');
+      layui.stope(e);
+      if(index === 0){
+        that.sort(field, 'asc', null, true);
+      } else {
+        that.sort(field, 'desc', null, true);
+      }
+    });
+    //v2.4 宸ュ叿鏍忎簨浠�
+    that.layTools.on("click","*[lay-event]",function(e){
+      var eventName = $(this).attr("lay-event"),othis = $(this),
+          s = function(e,special){
+            var l = $(e.list),
+                n = special ? $('<ul class="layui-table-tool-panel layui-table-tool-panel-special"></ul>') : $('<ul class="layui-table-tool-panel"></ul>');
+            n.html(l),
+            options.height && n.css("max-height",options.height - (that.layTool.outerHeight() || 50)),
+            othis.find(".layui-table-tool-panel")[0] || othis.append(n),
+                that.renderForm(),
+                n.on("click",function(e){
+              layui.stope(e);
+            }), e.done && e.done(n,l);
+          };
+      switch(layui.stope(e), $(document).trigger("table.tool.panel.remove"),layer.close(that.tipsIndex),eventName){
+        case "LAYTABLE_COLS":
+          s({
+            list:function(){
+              var e = [];
+              return that.eachCols(function(t,i){
+
+                  i.field && "normal" == i.type && e.push('<li><input type="checkbox" name="'+ i.field+'" data-key="0-'+ t +'" data-parentkey="'+(i.parentkey || "")+'" lay-skin="primary" '+(i.hide?"":"checked")+' title="'+(i.title || i.field)+'" lay-filter="LAY_TABLE_TOOL_COLS"></li>');
+              }), e.join("");
+            }(),
+            done:function(){
+              form.on("checkbox(LAY_TABLE_TOOL_COLS)",function(e){
+                var checked = this.checked,i = $(e.elem),
+                    key = i.data("key"),name = i.data("name"),
+                    parentkey = i.data("parentkey");
+                layui.each(options.cols,function(e,t){
+                  layui.each(t,function(t,i){
+                    if(e + "-" + t === key ){
+                      var d = i.hide;
+                      i.hide = !checked,that.elem.find('*[data-key="'+options.index+"-" + key + '"]')[checked ?"removeClass":"addClass"](HIDE),
+                      d != i.hide && that.setParentCol(!checked,parentkey),that.resize()
+                    }
+                  })
+                })
+              })
+            }
+          });
+          break;
+        case "LAYTABLE_EXPORT":
+          /*device.ie ? layer.tips("瀵煎嚭鍔熻兘涓嶆敮鎸両E,璇风敤楂樼骇娴忚鍣ㄥ鍑�",this,{
+            tips:3
+          }):*/s({
+            list:function(){
+              return ['<li data-type="csv">瀵煎嚭CSV鏂囦欢</li>','<li data-type="xls">瀵煎嚭鍒癊xcel鏂囦欢</li>'].join("")
+            }(),
+            done:function(e,i){
+              i.on("click",function(){
+                var type = $(this).data("type"),target = that;
+                table.exportFile(options.id,null,type,target);
+              })
+            }
+          },true);
+          break;
+        case "LAYTABLE_PRINT":
+          var openNew = window.open("鎵撳嵃绐楀彛","_blank"),
+              style = ["<style>","body{font-size:12px;color:#666}","table{width:100%;border-collapse:collapse;border-spacing:0;}","th,td{line-height:20px;padding:9px 15px;border:1px solid #ccc;text-align:left;font-size:12px;color:#666;}","a{color:#666;text-decoration:none;}","*.layui-hide{display:none;}","</style>"].join(""),
+              headerHtml = $(that.layHeader.html());
+          headerHtml.append(that.layMain.find("table").html()),headerHtml.find("th.layui-table-patch").remove(),headerHtml.find("td[data-field='LAY_CHECKED']").remove(),headerHtml.find("th[data-field='LAY_CHECKED']").remove(),headerHtml.find(".layui-table-col-special").remove(),openNew.document.write(style + headerHtml.prop("outerHTML")),openNew.document.close(),openNew.print(),openNew.close()
+      }
+      layui.event.call(this,MOD_NAME,"toolbar("+ELEM_VIEW+")", $.extend({
+        event:eventName,
+        config:options
+      },{}))
+    });
+    table.creatExcelIE = function(columns,rows){
+      var oXL ;
+      //鍒涘缓AX瀵硅薄excel
+      try{
+        oXL = new ActiveXObject("Excel.Application")
+      }catch(e){
+        $webUtil.showMsg("璇峰湪鏈湴瀹夎Excel!" +
+            "骞跺湪Internet瀹夊叏璁剧疆涓皢鈥樺鏈爣璁颁负鍙畨鍏ㄦ墽琛岃剼鏈殑ActiveX鎺т欢鍒濆鍖栧苟鎵ц鑴氭湰鈥欏嬀閫変负鍚敤");
+        return;
+      }
+      if(oXL == null){
+        $webUtil.showMsg("璇峰湪鏈湴瀹夎Excel!" +
+            "骞跺湪Internet瀹夊叏璁剧疆涓皢鈥樺鏈爣璁颁负鍙畨鍏ㄦ墽琛岃剼鏈殑ActiveX鎺т欢鍒濆鍖栧苟鎵ц鑴氭湰鈥欏嬀閫変负鍚敤");
+      }
+      //鑾峰彇workbook瀵硅薄
+      var oWB = oXL.Workbooks.Add();
+      //婵�娲诲綋鍓峴heet
+      var oSheet = oWB.ActiveSheet;
+      //璁剧疆宸ヤ綔钖勫悕绉�
+      oSheet.name = "瀵煎嚭Excel鎶ヨ〃";
+      for (var i = 0; i < columns.length; i++) {
+        oSheet.Cells(1, i + 1).value = columns[i].title;
+      }
+      for (var i = 0; i < rows.length; i++) {
+        for (var j = 0; j < columns.length; j++) {
+          if (rows[i][columns[j].field] != null) {
+            oSheet.Cells(i + 2, j + 1).value = rows[i][columns[j].field].toString();
+          } else {
+            oSheet.Cells(i + 2, j + 1).value = "";
+          }
+        }
+      }
+      //璁剧疆excel鍙灞炴��
+      oXL.Visible = true;
+      oSheet.Columns.AutoFit;
+    }
+    //鏂囦欢瀵煎嚭
+    table.exportFile = function(e,t,i,target){
+      t = t || table.clearCacheKey(table.cache[e]),i = i || "csv";
+      var options = thisTable.config[e] || {},columns = options.cols[0],rows = table.cache[e],
+          l = {
+            csv : "text/csv",
+            xls : "application/vnd.ms-excel"
+          }[i],
+          n = document.createElement("a");
+      return device.ie ? table.creatExcelIE(columns,rows)/*hint.error("IE_NOT_SUPPORT_EXPORTS")*/ : (n.href = "data:" + l +";charset=utf-8,\ufeff" + encodeURIComponent(function(){
+            var i = [],a = [];
+            return layui.each(t,function(t,l){
+              var n = [];
+              "object" == typeof e ? (layui.each(e,function(e,a){
+                0 == t && i.push(a || "")
+              }),layui.each(table.clearCacheKey(l),function(e,t){
+                n.push(t);
+              })) : target.eachCols(function(e,a){
+                a.field && "normal" == a.type && !a.hide && (0 == t && i.push(a.title || ""), n.push(l[a.field]))
+              }), a.push(n.join(","));
+            }), i.join(",") + "\r\n" + a.join("\r\n")
+
+          }()), n.download = (options.title || "table_" + (options.index || "")) + "." + i,document.body.appendChild(n), n.click(),void document.body.removeChild(n))
+    };
+    //澶嶉�夋閫夋嫨
+    that.elem.on('click', 'input[name="layTableCheckbox"]+', function(){
+      var checkbox = $(this).prev()
+      ,childs = that.layBody.find('input[name="layTableCheckbox"]')
+      ,index = checkbox.parents('tr').eq(0).data('index')
+      ,checked = checkbox[0].checked
+      ,isAll = checkbox.attr('lay-filter') === 'layTableAllChoose';
+      
+      //鍏ㄩ��
+      if(isAll){
+        childs.each(function(i, item){
+          item.checked = checked;
+          that.setCheckData(i, checked);
+        });
+        that.syncCheckAll();
+        that.renderForm('checkbox');
+      } else {
+        that.setCheckData(index, checked);
+        that.syncCheckAll();
+      }
+      layui.event.call(this, MOD_NAME, 'checkbox('+ filter +')', {
+        checked: checked
+        ,data: table.cache[that.key] ? (table.cache[that.key][index] || {}) : {}
+        ,type: isAll ? 'all' : 'one'
+      });
+    });
+    
+    //琛屼簨浠�
+    that.layBody.on('mouseenter', 'tr', function(){
+      var othis = $(this)
+      options =that.config ;
+      othis.addClass(ELEM_HOVER)
+      if(!!options.hoverCursor){
+        othis.find('td').css({cursor:options.hoverCursor==true?'pointer':options.hoverCursor})
+      }
+    }).on('mouseleave', 'tr', function() {
+      var othis = $(this)
+      options = that.config;
+      othis.removeClass(ELEM_HOVER)
+      if (!!options.hoverCursor) {
+        othis.find('td').css({cursor: 'default'})
+      }
+    }).on('click','tr',function(e){
+        //weidy@2018-05-07 澧炲姞琛岀偣鍑讳簨浠�
+      var othis = $(this),index = othis.index()
+          ,dataIndex = othis.attr("data-index")
+          ,options =that.config ;//鏁版嵁鎵�鍦ㄨ
+      var data = table.cache[that.key][dataIndex];
+      /*if(options.checkOnSelect && data){
+          var newCheckValue = !data[options.checkName];
+          if(options.selectMode == table.selectMode.single){
+              //鍘婚櫎鍏朵粬鐨勫閫夋
+            that.layBody.find("input[name='layTableCheckbox']").each(function(_index){
+              that.layBody.find('tr:eq('+ _index +')').removeClass("layui-table-click");
+                that.setCheckData($(this).parent().parent().parent().attr("data-index"),false);
+                that.renderCheckbox($(this),$(this).next(),false);
+            });
+            //鍘婚櫎鍏朵粬鐨勯�変腑鏍峰紡
+            that.layBody.find("tr.layui-table-click").each(function(_index){
+              $(this).removeClass("layui-table-click");
+            });
+            that.layBody.find('tr:eq('+ index +')').addClass("layui-table-click")
+          }else{
+            that.layBody.find('tr:eq('+ index +')').toggleClass("layui-table-click")
+          }
+          that.setCheckData(dataIndex,newCheckValue);
+          var checkbox = that.layBody.find('tr:eq('+ index +') input[name="layTableCheckbox"]');
+          that.renderCheckbox(checkbox,checkbox.next(),newCheckValue);
+          that.syncCheckAll();
+      }*/
+      if((e.ctrlKey || e.target.className=='layui-icon' && $(e.target).parent().hasClass('layui-form-checkbox')) && data){
+        //鐐瑰嚮鐨勬槸checkbox妗嗘垨鑰呯偣鍑绘椂ctrl宸叉寜涓�
+        var newCheckValue = !data[options.checkName];
+        that.setCheckData(dataIndex,newCheckValue);
+        var checkbox = that.layBody.find('tr:eq('+ index +') input[name="layTableCheckbox"]');
+        that.renderCheckbox(checkbox,checkbox.next(),newCheckValue);
+        that.syncCheckAll();
+        layui.event.call(this, MOD_NAME, 'checkbox('+ filter +')', {
+          checked: newCheckValue
+          ,data: data
+          ,type: 'one'
+        });
+      }else {
+        //鍘婚櫎鍏朵粬鐨勯�変腑椤�
+        that.layBody.find('tr').removeClass("layui-table-click");
+        that.layBody.find('tr:eq(' + index + ')').addClass("layui-table-click")
+      }
+      if(options.rowClick){
+          options.rowClick(that.key,data,newCheckValue);
+      }
+      layui.stope(e);
+    }).on('dblclick','tr',function(e){
+      //wangting@2021-2-5 澧炲姞鍙屽嚮琛屼簨浠�
+      var othis = $(this),index = othis.index()
+          ,dataIndex = othis.attr("data-index")
+          ,options =that.config ;//鏁版嵁鎵�鍦ㄨ
+      if(options.rowDBLClick){
+        var data = table.cache[that.key][dataIndex];
+        options.rowDBLClick(that.key,data);
+      }
+      layui.stope(e);
+    });
+    
+    //鍗曞厓鏍肩紪杈�
+    that.layBody.on('change', '.'+ELEM_EDIT, function(){
+      var othis = $(this)
+      ,value = this.value
+      ,field = othis.parent().data('field')
+      ,index = othis.parents('tr').eq(0).data('index')
+      ,data = table.cache[that.key][index];
+      
+      //weidy@2019-05-15 澧炲姞鍗曞厓鏍间慨鏀瑰墠鐨勫��
+      if(!table.editCache){
+        table.editCache = {};
+      }
+      if(!(that.key in table.editCache) ){
+        table.editCache[that.key] = {};
+      }
+      var editBeforeData = {};
+      for(var key in data){
+        editBeforeData[key] = data[key];
+      }
+      table.editCache[that.key][index] = editBeforeData;
+      //end weidy锛涙殏鏃朵笉鐩存帴浼犻�掑埌edit閲岋紝鍙互閫氳繃鏂规硶鑾峰彇鍒颁慨鏀瑰墠鐨勫��
+      if(othis.is('select')){
+        var text = othis.find('option:selected').text();
+        data[field] = text;
+        data[$(this).attr('valueField')] = value;
+      }else {
+        data[field] = value; //鏇存柊缂撳瓨涓殑鍊�
+      }
+      $(this).parent().addClass("layui-table-edit_notsubmit");
+      layui.event.call(this, MOD_NAME, 'edit('+ filter +')', {
+        value: value
+        ,data: data
+        ,field: field
+      });
+    }).on('blur', '.'+ELEM_EDIT, function(){
+      var templet
+      ,othis = $(this)
+      ,field = othis.parent().data('field')
+      ,index = othis.parents('tr').eq(0).data('index')
+      ,data = table.cache[that.key][index],
+          specialClass = othis.attr('class').split(' ')[0];
+      if(specialClass ==='laydate-grid-item'){//闃绘laydate 鐐瑰嚮涔嬪悗remove
+
+      }else{
+        var isRemove ; 
+        if(specialClass ==='grid-number-input'){
+          // var reg = new RegExp("^[0-9]+$"),value=this.value;
+          var reg = new RegExp("^(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*))$"),value=this.value;
+          if ((value == null || value == '') || reg.test(value)){
+            isRemove = false;
+          }else {
+            layui.layer.tips("鍙兘濉啓鏁板瓧", othis);
+            //$webUtil.showErrorMsg("鍙兘濉啓鏁板瓧");
+            isRemove  = true;
+            this.value = '';
+          }
+        }
+        var displayValue = this.value;
+        if(specialClass === 'grid-select-input' || othis.is('select')){
+            displayValue = othis.find('option:selected').text();
+        }
+        that.eachCols(function(i, item){
+          if(item.field == field && item.templet){
+            templet = item.templet;
+          }
+        });
+        othis.siblings(ELEM_CELL).html(
+            templet ? laytpl($(templet).html() || displayValue).render(data) : displayValue
+        );
+        othis.parent().data('content', displayValue);
+        isRemove || othis.remove();
+      }
+
+    });
+    
+    //鍗曞厓鏍间簨浠�
+    that.layBody.on('click', 'td', function(){
+      var othis = $(this)
+      ,field = othis.data('field')
+      ,editType = othis.data('edit')
+      ,elemCell = othis.children(ELEM_CELL)
+          ,editConfig=othis.attr("data-editConfig");
+      
+      layer.close(that.tipsIndex);
+      if(othis.data('off')) return;
+      if(!editConfig){
+        editConfig = {};
+      }else{
+        editConfig = eval("(" + editConfig + ")");
+      }
+      //鏄剧ず缂栬緫琛ㄥ崟
+      if(editType){
+        if(editType === 'select') { //閫夋嫨妗�
+          if(!editConfig.comboxKey){
+              $webUtil.showErrorMsg("浠g爜鏈夐敊璇紝缂栬緫鏃朵负涓嬫媺妗嗙殑鏃跺�欙紝璇疯缃甤omboxKey");
+              return false;
+          }
+          editConfig.valueField = editConfig.valueField?editConfig.valueField:field;
+          var select = $('<select class="grid-select-input '+ ELEM_EDIT +'" lay-ignore valueField="' + editConfig.valueField + '"></select>');
+          var content;
+          if(othis.data('content')){
+            content = othis.data('content').split('')[0];
+          }
+          var inputValue = elemCell.text() || content || '';
+          if(inputValue == undefined){
+              inputValue = '';
+          }
+          select.val(inputValue);
+          var displayed = othis.find('.'+ELEM_EDIT)[0];
+          othis.find('.'+ELEM_EDIT)[0] || othis.append(select);
+          //鍔犲唴瀹�
+          if(!displayed) {
+            layui.use('vciWebComboxStore', function () {
+              var comboxConfig = {};
+              for (var key in editConfig.comboxConfig) {
+                comboxConfig[key] = editConfig.comboxConfig[key];
+              }
+              comboxConfig.url = comboxConfig.url ? comboxConfig.url : (!comboxConfig.data?'default':'');
+              comboxConfig.callback = function (comboxKey, map) {
+                var html = [];
+                for (var key in map) {
+                  html.push('<option value="' + key + '">' + map[key] + '</option>');
+                }
+                select.html(html.join(''));
+              };
+              layui.vciWebComboxStore.newCombox(editConfig.comboxKey, comboxConfig, editConfig.reload);
+            });
+          }
+        } else if(editType ==='date'){
+          var input = $('<input class="laydate-grid-item '+ ELEM_EDIT +'">');
+          var content;
+          if(othis.data('content')){
+            content = othis.data('content').split('')[0];
+          }
+          var inputValue = elemCell.text() || content || '';
+          if(inputValue == undefined){
+            inputValue = '';
+          }
+          input[0].value = inputValue;
+          othis.find('.'+ELEM_EDIT)[0] || othis.append(input);
+          lay(".laydate-grid-item").each(function(index,elem){
+            laydate.render({
+              elem:elem,
+              change:function(value){
+                var date = value.split(" ")[0];
+                othis.find('div').html(date)
+              },
+              done:function(value){
+                var date = value.split(" ")[0];
+                othis.find('div').html(date);
+                setTimeout(function(){
+                  othis.find("input").remove();
+                  //var othis = $(elem)
+                  // var field = othis.parent().data('field')
+                  var index = othis.parents('tr').eq(0).data('index')
+                  , data = table.cache[that.key][index];
+                    data[field] = value; //鏇存柊缂撳瓨涓殑鍊�
+                    layui.event.call(this, MOD_NAME, 'edit(' + filter + ')', {
+                        value: value
+                      , data: data
+                      , field: field
+                    });
+                },200)     
+              }
+            })
+          });
+          setTimeout(function(){input.focus()},200);
+        }else if(editType === 'refer'){
+          //璇存槑鏄弬鐓�
+          var input = $('<input  class="grid-refer-input layui-input '+ ELEM_EDIT +'"  >');
+          var inputValue = elemCell.text() || othis.data('content') ;
+          if(inputValue == undefined){
+            inputValue = "";
+          }
+          input[0].value = inputValue;
+          othis.find('.'+ELEM_EDIT)[0] || othis.append(input);
+          input.focus(function(){
+             var options = editConfig.referConfig;
+             if(!options){
+                 $webUtil.showErrorMsg("浠g爜閿欒锛屽湪缂栬緫鐨勭被鍨嬩负鍙傜収鐨勬椂鍊欙紝蹇呴』鏈塺eferConfig");
+                 return false;
+             }
+             layui.vciWebRefer.newRefer(filter,field,input,options);
+             layui.vciWebRefer.addChangeValueListener(filter,field,options.showField,function(thisFilter,thisName,showField,value,rawValue,selectRecords){
+                 var index = othis.parents('tr').eq(0).data('index')
+                   , data = table.cache[that.key][index];
+                 data[field]=rawValue;
+                 if(editConfig.fieldMap && selectRecords&&selectRecords.length>0){
+                     //璇存槑闇�瑕佹槧灏�
+                     for(var key in editConfig.fieldMap){
+                         var mapFields = editConfig.fieldMap[key].split(",");
+                         var value = [];
+                         layui.each(selectRecords,function(_index,_item){
+                             var temp ;
+                             if(mapFields.length == 1) {
+                                 var mapField = mapFields[0];
+                                 if(mapField.indexOf("attribute.")>-1 ){
+                                   temp = _item['attributes'][mapField.subString("attribute.".length)];
+                                 }else {
+                                    temp = _item[mapField];
+                                 }
+                             }else{
+                                //鏈夊涓�
+                                var mutiTemp = [];
+                                layui.each(mapFields,function (_indexField,_itemField){
+                                  if(_itemField.indexOf("attribute.")>-1 ){
+                                    mutiTemp.push(_item['attributes'][_itemField.subString("attribute.".length)]);
+                                  }else {
+                                    mutiTemp.push(_item[_itemField]);
+                                  }
+                                });
+                                temp = mutiTemp.join(editConfig.textSep?editConfig.textSep:' ');
+                             }
+                             if (temp != null && temp != '') {
+                                 value.push(temp);
+                             }
+                         });
+                         data[key] = value.join(',');
+                         var fieldTd = othis.parent().find('td[data-field="' + key + '"]');
+                         if(fieldTd){
+                             fieldTd.find('div').html(data[key]);
+                         }
+                     }
+                 }
+                 othis.find('div').html(rawValue);
+                 var selectValue =  {
+                     value:value,
+                     rawValue:rawValue,
+                     allValues:selectRecords
+                 };
+                 layui.event.call(this, MOD_NAME, 'edit(' + filter + ')', {
+                   value: value
+                   , data: data
+                   , field: field
+                   ,index:index
+                   ,selectEditData:selectValue
+                 });
+                 othis.find('.grid-refer-input').remove();
+             });
+             layui.vciWebRefer.showRefer(filter,field);
+          });
+        } else { //鏂囨湰妗�
+          var input;
+          if(editType === 'number'){
+            input = $('<input  class="grid-number-input layui-input '+ ELEM_EDIT +'"  >');
+          }else{
+            input = $('<input class="layui-input '+ ELEM_EDIT +'">');
+          }
+          input[0].value = othis.data('content') || elemCell.text();
+          othis.find('.'+ELEM_EDIT)[0] || othis.append(input);
+          input.focus();
+        }
+        return;
+      }
+      
+      //濡傛灉鍑虹幇鐪佺暐锛屽垯鍙煡鐪嬫洿澶�
+      if(elemCell.find('.layui-form-switch,.layui-form-checkbox')[0]) return; //闄愬埗涓嶅嚭鐜版洿澶氾紙鏆傛椂锛�
+      
+      if(Math.round(elemCell.prop('scrollWidth')) > Math.round(elemCell.outerWidth())){
+        that.tipsIndex = layer.tips([
+          '<div class="layui-table-tips-main" style="margin-top: -'+ (elemCell.height() + 16) +'px;'+ function(){
+            if(options.size === 'sm'){
+              return 'padding: 4px 15px; font-size: 12px;';
+            }
+            if(options.size === 'lg'){
+              return 'padding: 14px 15px;';
+            }
+            return '';
+          }() +'">'
+            ,elemCell.html()
+          ,'</div>'
+          ,'<i class="layui-icon layui-table-tips-c">&#x1006;</i>'
+        ].join(''), elemCell[0], {
+          tips: [3, '']
+          ,time: -1
+          ,anim: -1
+          ,maxWidth: (device.ios || device.android) ? 300 : 600
+          ,isOutAnim: false
+          ,skin: 'layui-table-tips'
+          ,success: function(layero, index){
+          if(event.stopPropagation){
+            event.stopPropagation()
+          }else{
+            event.cancelBubble = true
+          }
+            
+            document.onclick = function(){
+              layer.close(index)
+            }
+/*             layero.find('.layui-table-tips-c').on('click', function(){
+              layer.close(index);
+            }); */
+          }
+        });
+      }
+    });
+
+    //宸ュ叿鏉℃搷浣滀簨浠�
+    that.layBody.on('click', '*[lay-event]', function(){
+      var othis = $(this)
+      ,index = othis.parents('tr').eq(0).data('index')
+      ,tr = that.layBody.find('tr[data-index="'+ index +'"]')
+      ,ELEM_CLICK = 'layui-table-click'
+      ,data = table.cache[that.key][index];
+
+      layui.event.call(this, MOD_NAME, 'tool('+ filter +')', {
+        data: table.clearCacheKey(data)
+        ,event: othis.attr('lay-event')
+        ,tr: tr
+        ,del: function(){
+          table.cache[that.key][index] = [];
+          tr.remove();
+          that.scrollPatch();
+        }
+        ,update: function(fields){
+          fields = fields || {};
+          layui.each(fields, function(key, value){
+            if(key in data){
+              var templet, td = tr.children('td[data-field="'+ key +'"]');
+              data[key] = value;
+              that.eachCols(function(i, item2){
+                if(item2.field == key && item2.templet){
+                  templet = item2.templet;
+                }
+              });
+              td.children(ELEM_CELL).html(
+                templet ? laytpl($(templet).html() || value).render(data) : value
+              );
+              td.data('content', value);
+            }
+          });
+        },
+        index:index //modify by weidy@2020-5-18 鎶婅鍙蜂篃浼犻�掕繃鍘�
+      });
+      //鍒ゆ柇褰撳墠鐐瑰嚮鏄惁澶勭悊鍥哄畾鍒椾腑
+      /*if($(this).closest('.layui-table-fixed').length>0){
+        var prevTr=$(this).closest('.layui-table-fixed').prev('.layui-table-main').find('table tr').eq(index);
+        prevTr.trigger('click')
+      }*/
+      //tr.addClass(ELEM_CLICK).siblings('tr').removeClass(ELEM_CLICK);
+    });
+    
+    //鍚屾婊氬姩鏉�
+    that.layMain.on('scroll', function(){
+      var othis = $(this)
+      ,scrollLeft = othis.scrollLeft()
+      ,scrollTop = othis.scrollTop();
+      
+      that.layHeader.scrollLeft(scrollLeft);
+      that.layFixed.find(ELEM_BODY).scrollTop(scrollTop);
+      
+      layer.close(that.tipsIndex);
+    });
+    
+    _WIN.on('resize', function(){ //鑷�傚簲
+       that.fullSize();
+       that.scrollPatch();
+    });
+    _DOC.on('click',function(){
+      _DOC.trigger("table.remove.tool.panel")
+    });
+    _DOC.on("table.remove.tool.panel",function(){
+      $(".layui-table-tool-panel").remove();
+    });
+    _WIN.on("resize",function(){
+      that.resize();
+    });
+  };
+  //
+
+  //鍒濆鍖�
+  table.init = function(filter, settings){
+    settings = settings || {};
+    var that = this
+    ,elemTable = filter ? $('table[lay-filter="'+ filter +'"]') : $(ELEM + '[lay-data]')
+    ,errorTips = 'Table element property lay-data configuration item has a syntax error: ';
+    //閬嶅巻鏁版嵁琛ㄦ牸
+    elemTable.each(function(){
+      var othis = $(this), tableData = othis.attr('lay-data');
+      
+      try{
+        tableData = new Function('return '+ tableData)();
+      } catch(e){
+        hint.error(errorTips + tableData)
+      }
+      
+      var cols = [], options = $.extend({
+        elem: this
+        ,cols: []
+        ,data: []
+        ,skin: othis.attr('lay-skin') //椋庢牸
+        ,size: othis.attr('lay-size') //灏哄
+        ,even: typeof othis.attr('lay-even') === 'string' //鍋舵暟琛岃儗鏅�
+      }, table.config, settings, tableData);
+      
+      filter && othis.hide();
+      
+      //鑾峰彇琛ㄥご鏁版嵁
+      othis.find('thead>tr').each(function(i){
+        options.cols[i] = [];
+        $(this).children().each(function(ii){
+          var th = $(this), itemData = th.attr('lay-data');
+          
+          try{
+            itemData = new Function('return '+ itemData)();
+          } catch(e){
+            return hint.error(errorTips + itemData)
+          }
+          
+          var row = $.extend({
+            title: th.text()
+            ,colspan: th.attr('colspan') || 0 //鍒楀崟鍏冩牸
+            ,rowspan: th.attr('rowspan') || 0 //琛屽崟鍏冩牸
+          }, itemData);
+
+          if(row.colspan < 2) cols.push(row);
+          options.cols[i].push(row);
+        });
+      });
+
+      //鑾峰彇琛ㄤ綋鏁版嵁
+      othis.find('tbody>tr').each(function(i1){
+        var tr = $(this), row = {};
+        //濡傛灉瀹氫箟浜嗗瓧娈靛悕
+        tr.children('td').each(function(i2, item2){
+          var td = $(this)
+          ,field = td.data('field');
+          if(field){
+            return row[field] = td.html();
+          }
+        });
+        //濡傛灉鏈畾涔夊瓧娈靛悕
+        layui.each(cols, function(i3, item3){
+          var td = tr.children('td').eq(i3);
+          row[item3.field] = td.html();
+        });
+        options.data[i1] = row;
+      });
+      table.render(options);
+    });
+
+    return that;
+  };
+  table.getConfig = function(id){
+    if(!table.settings){
+      table.settings = {};
+    }
+    return table.settings[id];
+  };
+  table.setConfig = function(options){
+    if(!table.settings){
+      table.settings = {};
+    }
+    table.settings[options.id] = options;
+    thisTable.config[options.id] = options;
+  };
+  //琛ㄦ牸閫変腑鐘舵��
+  table.checkStatus = function(id,hasIndex){
+    var nums = 0
+    ,invalidNum = 0
+    ,arr = []
+    ,data = table.cache[id] || [];
+    //璁$畻鍏ㄩ�変釜鏁�
+    layui.each(data, function(i, item){
+      if(item.constructor === Array){
+        invalidNum++; //鏃犳晥鏁版嵁锛屾垨宸插垹闄ょ殑
+        return;
+      }
+      if(item[table.config.checkName]){
+        nums++;
+        arr.push(table.clearCacheKey(item,hasIndex));
+      }
+    });
+    return {
+      data: arr //閫変腑鐨勬暟鎹�
+      ,isAll: data.length ? (nums === (data.length - invalidNum)) : false //鏄惁鍏ㄩ��
+    };
+  };
+
+  //weidy娣诲姞锛岃嚜鍔ㄩ�夋嫨鏌愪簺琛�
+  table.selectRecord = function(id,selectRecords){
+    var that = this
+        ,options = table.getConfig(id)
+        ,thisData = table.cache[id];
+    if(!$.isArray(selectRecords)){
+        selectRecords = [selectRecords];
+    }
+    layui.each(selectRecords, function (_index, item) {
+      if (item.LAY_TABLE_INDEX*1>=0 || item.index*1>=0) {
+          $(options.elem).next().find('tbody>tr[data-index="' + ((that.config.indexName in item)?item[that.config.indexName]:item.index) + '"]').each(function (i) {
+              $(this).click();
+              //modify by weidy@2020-12-19锛屽湪鏈塼oolbar鐨勬椂鍊欙紝浼氭湁涓や釜锛屾墍浠ョ涓�涓氨杩斿洖
+              return false;
+          });
+       }
+    });
+  };
+
+  //weidy娣诲姞锛岃幏鍙栧綋鍓嶉〉闈㈢殑鏁版嵁
+  table.getData = function(id){
+    return table.cache[id];
+  };
+
+  //weidy娣诲姞锛岃幏鍙栧綋鍓嶉〉闈㈢紪杈戣繃鐨勬暟鎹�
+  table.getModifyData = function(id){
+    var data = [];
+    var thisTableData = table.cache[id];
+    if(thisTableData && table.editCache && table.editCache[id]){
+        var thisTableBeforeData = table.editCache[id];
+        for(var rowIndex in thisTableBeforeData){
+            if(thisTableData[rowIndex]){
+               data.push(thisTableData[rowIndex]);
+            }
+        }
+    }
+    return data;
+  };
+
+  //weidy娣诲姞锛屾坊鍔犳暟鎹埌鍒楄〃涓�
+  table.addData = function(id,data){
+    var cacheData = this.getData(id);
+    if(!data) data = [];
+    if(!cacheData){
+      cacheData = [];
+    }
+    if(!$webUtil.isArray(data)) data = [data];
+    for(var i = 0 ; i < data.length ; i ++){
+      cacheData.push(data[i]);
+    }
+    this.reload(id,{
+      data:cacheData,
+      modifyData:true
+    });
+  };
+  /**
+   * 绉婚櫎鏁版嵁
+   * id 琛ㄦ牸鐨刬d
+   * index,鍙互鏄鍙�-1锛屼篃鍙互鏄暣琛屾暟鎹�傚彲浠ユ槸鏁扮粍锛屼篃鍙互鏄崟涓璞�
+   */
+  table.removeData = function(id,index){//绉婚櫎鏁版嵁
+    if(!$webUtil.isArray(index)) index = [index];
+    var data = this.getData(id);
+    if(!data){
+      return false;
+    }
+    var newData = [];
+    for(var i = 0 ; i < data.length ; i ++){
+      var isNeedDelete = false;
+      var record = data[i];
+      for(var j = 0 ; j < index.length ; j ++){
+        var selectData = index[j];
+        if(!isNaN(selectData)){
+          //鏄鍙风殑鏃跺��
+          if(selectData == record[table.config.indexName] ){
+            isNeedDelete = true;
+            break;
+          }
+        }else if("oid" in selectData && "oid" in record){
+          if(selectData["oid"] == record["oid"] ){
+            isNeedDelete = true;
+            break;
+          }
+        }else{
+          //鍙兘鍏ㄩ儴瀵规瘮鎵�鏈夌殑鏁版嵁
+          var same = true;
+          for(var key in selectData){
+            if(selectData[key] != record[key] ){
+              same = false;
+              break;
+            }
+          }
+          if(same){
+            isNeedDelete = true;
+            break;
+          }
+        }
+      }
+      if(!isNeedDelete){
+        var copyData = record;
+        delete copyData[table.config.indexName];
+        newData.push(copyData);
+      }
+    }
+    this.reload(id,{
+      data:newData,
+      modifyData:true
+    });
+  };
+
+  table.changeRecord = function(id,index,record){
+    //淇敼鏌愪竴琛岀殑鏁版嵁
+    var data = this.getData(id);
+    if(!data){
+      return false;
+    }
+    layui.each(data,function (_index,rowData) {
+      var same = false;
+      if(table.config.indexName in rowData
+          && table.config.indexName in record ){
+        if(rowData[table.config.indexName] == record[table.config.indexName] ){
+          same = true;
+        }
+      }else if("oid" in rowData && "oid" in record){
+        if(rowData["oid"] == record["oid"] ){
+          same = true;
+        }
+      }else{
+        same = true;
+        for(var key in rowData){
+          if(rowData[key] != rowData[key] ){
+            same = false;
+            break;
+          }
+        }
+
+      }
+      if(same){
+        data[_index] = record;
+        return true;
+      }
+    });
+    this.reload(id,{
+      data:data,
+      modifyData:true
+    });
+  };
+
+  //weidy娣诲姞锛屾竻闄ゆ墍鏈夊凡缁忕紪杈戣繃鐨勬暟鎹�
+  table.clearModifyData = function(id,rowIndexs){
+      if(table.editCache && table.editCache[id]){
+        if(rowIndexs){
+          //璇存槑鎸囧畾浜嗗摢浜涜鐨�
+           var thisTableBeforeData = table.editCache[id];
+           if(! $webUtil.isArray(rowIndexs)){
+              rowIndexs = [rowIndexs];
+           }
+           layui.each(rowIndexs,function(_index,_item){
+              delete thisTableBeforeData[rowIndexs];
+           });
+           table.editCache[id] = thisTableBeforeData;
+        }else {
+          table.editCache[id] = {};
+        }
+        try {
+            this.getConfig(id).elem.next().find('.layui-table-edit_notsubmit').removeClass("layui-table-edit_notsubmit");
+        }catch(e){
+
+        }
+      }
+  };
+  
+  //琛ㄦ牸閲嶈浇
+  thisTable.config = {};
+  table.reload = function(id, options){
+    var config = thisTable.config[id];
+    options = options || {};
+    if(!config) return hint.error('The ID option was not found in the table instance');
+    if(options.data && options.data.constructor === Array) delete config.data;
+    return table.render($.extend(true, {}, config, options));
+  };
+  table.getIndexColumn= function(){
+    return {field:table.config.indexName,type:'numbers',title:'搴忓彿',width:40};
+  };
+  table.getCheckColumn = function () {
+    return {field:table.config.checkName,type:'checkbox',width:30};
+  };
+ 
+  //鏍稿績鍏ュ彛
+  table.render = function(options){
+    if(layui.util.isNull(options.id)){
+      if(layui.util.isNotNull(options.elem) &&  $(options.elem)){
+        options.id = $(options.elem).attr("lay-filter");
+      }
+      if(layui.util.isNull(options.id))
+          options.id = layui.util.uuid();
+    }
+    var inst = new Class(options);
+    if(!table.settings){
+      table.settings = {};
+    }
+    table.settings[options.id] = options;
+    return thisTable.call(inst);
+  };
+  
+  //娓呴櫎涓存椂Key
+  table.clearCacheKey = function(data,hasIndex){
+    data = $.extend({}, data);
+    if(!hasIndex) {
+      delete data[table.config.checkName];
+      delete data[table.config.indexName];
+    }
+    return data;
+  };
+  
+  //鑷姩瀹屾垚娓叉煋
+  table.init();
+  
+  exports(MOD_NAME, table);
+});
+
+ 
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/transfer.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/transfer.js
new file mode 100644
index 0000000..c146257
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/transfer.js
@@ -0,0 +1,551 @@
+/**
+ 
+ @Name锛歭ayui.transfer 绌挎妗�
+ @Author锛氳搐蹇�
+ @License锛歁IT
+
+ */
+
+layui.define(['laytpl', 'form'], function(exports){
+  "use strict";
+  
+  var $ = layui.$
+  ,laytpl = layui.laytpl
+  ,form = layui.form
+  
+  //妯″潡鍚�
+  ,MOD_NAME = 'transfer'
+
+  //澶栭儴鎺ュ彛
+  ,transfer = {
+    config: {}
+    ,index: layui[MOD_NAME] ? (layui[MOD_NAME].index + 10000) : 0
+
+    //璁剧疆鍏ㄥ眬椤�
+    ,set: function(options){
+      var that = this;
+      that.config = $.extend({}, that.config, options);
+      return that;
+    }
+    
+    //浜嬩欢鐩戝惉
+    ,on: function(events, callback){
+      return layui.onevent.call(this, MOD_NAME, events, callback);
+    }
+  }
+
+  //鎿嶄綔褰撳墠瀹炰緥
+  ,thisModule = function(){
+    var that = this
+    ,options = that.config
+    ,id = options.id || that.index;
+    
+    thisModule.that[id] = that; //璁板綍褰撳墠瀹炰緥瀵硅薄
+    thisModule.config[id] = options; //璁板綍褰撳墠瀹炰緥閰嶇疆椤�
+    
+    return {
+      config: options
+      //閲嶇疆瀹炰緥
+      ,reload: function(options){
+        that.reload.call(that, options);
+      }
+      //鑾峰彇鍙充晶鏁版嵁
+      ,getData: function(){
+        return that.getData.call(that);
+      }
+    }
+  }
+  
+  //鑾峰彇褰撳墠瀹炰緥閰嶇疆椤�
+  ,getThisModuleConfig = function(id){
+    var config = thisModule.config[id];
+    if(!config) hint.error('The ID option was not found in the '+ MOD_NAME +' instance');
+    return config || null;
+  }
+
+  //瀛楃甯搁噺
+  ,ELEM = 'layui-transfer', HIDE = 'layui-hide', DISABLED = 'layui-btn-disabled', NONE = 'layui-none'
+  ,ELEM_BOX = 'layui-transfer-box', ELEM_HEADER = 'layui-transfer-header', ELEM_SEARCH = 'layui-transfer-search', ELEM_ACTIVE = 'layui-transfer-active', ELEM_DATA = 'layui-transfer-data'
+  
+  //绌挎妗嗘ā鏉�
+  ,TPL_BOX = function(obj){
+    obj = obj || {};
+    return ['<div class="layui-transfer-box" data-index="'+ obj.index +'">'
+      ,'<div class="layui-transfer-header">'
+        ,'<input type="checkbox" name="'+ obj.checkAllName +'" lay-filter="layTransferCheckbox" lay-type="all" lay-skin="primary" title="{{ d.data.title['+ obj.index +'] || \'list'+ (obj.index + 1) +'\' }}">'
+      ,'</div>'
+      ,'{{# if(d.data.showSearch){ }}'
+      ,'<div class="layui-transfer-search">'
+        ,'<i class="layui-icon layui-icon-search"></i>'
+        ,'<input type="input" class="layui-input" placeholder="鍏抽敭璇嶆悳绱�">'
+      ,'</div>'
+      ,'{{# } }}'
+      ,'<ul class="layui-transfer-data"></ul>'
+    ,'</div>'].join('');
+  }
+  
+  //涓绘ā鏉�
+  ,TPL_MAIN = ['<div class="layui-transfer layui-form layui-border-box" lay-filter="LAY-transfer-{{ d.index }}">'
+    ,TPL_BOX({
+      index: 0
+      ,checkAllName: 'layTransferLeftCheckAll'
+    })
+    ,'<div class="layui-transfer-active">'
+      ,'<button type="button" class="layui-btn layui-btn-sm layui-btn-primary layui-btn-disabled" data-index="0">'
+        ,'<i class="layui-icon layui-icon-next"></i>'
+      ,'</button>'
+      ,'<button type="button" class="layui-btn layui-btn-sm layui-btn-primary layui-btn-disabled" data-index="1">'
+        ,'<i class="layui-icon layui-icon-prev"></i>'
+      ,'</button>'
+    ,'</div>'
+    ,TPL_BOX({
+      index: 1
+      ,checkAllName: 'layTransferRightCheckAll'
+    })
+  ,'</div>'].join('')
+
+  //鏋勯�犲櫒
+  ,Class = function(options){
+    var that = this;
+    that.index = ++transfer.index;
+    that.config = $.extend({}, that.config, transfer.config, options);
+    that.render();
+  };
+
+  //榛樿閰嶇疆
+  Class.prototype.config = {
+    title: ['鍒楄〃涓�', '鍒楄〃浜�']
+    ,width: 200
+    ,height: 360
+    ,data: [] //鏁版嵁婧�
+    ,value: [] //閫変腑鐨勬暟鎹�
+    ,showSearch: false //鏄惁寮�鍚悳绱�
+    ,id: '' //鍞竴绱㈠紩锛岄粯璁よ嚜澧� index
+    ,text: {
+      none: '鏃犳暟鎹�'
+      ,searchNone: '鏃犲尮閰嶆暟鎹�'
+    }
+  };
+  
+  //閲嶈浇瀹炰緥
+  Class.prototype.reload = function(options){
+    var that = this;
+    
+    layui.each(options, function(key, item){
+      if(item && item.constructor === Array) delete that.config[key];
+    });
+    
+    that.config = $.extend(true, {}, that.config, options);
+    that.render();
+  };
+
+  //娓叉煋
+  Class.prototype.render = function(){
+    var that = this
+    ,options = that.config;
+    
+    //瑙f瀽妯℃澘
+    var thisElem = that.elem = $(laytpl(TPL_MAIN).render({
+      data: options
+      ,index: that.index //绱㈠紩
+    }));
+    
+    var othis = options.elem = $(options.elem);
+    if(!othis[0]) return;
+    
+    //鍒濆鍖栧睘鎬�
+    options.data = options.data || [];
+    options.value = options.value || [];
+    
+    //绱㈠紩
+    that.key = options.id || that.index;
+    
+    //鎻掑叆缁勪欢缁撴瀯
+    othis.html(that.elem);
+    
+    //鍚勭骇瀹瑰櫒
+    that.layBox = that.elem.find('.'+ ELEM_BOX)
+    that.layHeader = that.elem.find('.'+ ELEM_HEADER)
+    that.laySearch = that.elem.find('.'+ ELEM_SEARCH)
+    that.layData = thisElem.find('.'+ ELEM_DATA);
+    that.layBtn = thisElem.find('.'+ ELEM_ACTIVE + ' .layui-btn');
+    
+    //鍒濆鍖栧昂瀵�
+    that.layBox.css({
+      width: options.width
+      ,height: options.height
+    });
+    that.layData.css({
+      height: function(){
+        return options.height - that.layHeader.outerHeight() - that.laySearch.outerHeight() - 2
+      }()
+    });
+    
+    that.renderData(); //娓叉煋鏁版嵁
+    that.events(); //浜嬩欢
+  };
+  
+  //娓叉煋鏁版嵁
+  Class.prototype.renderData = function(){
+    var that = this
+    ,options = that.config;
+    
+    //宸﹀彸绌挎妗嗗樊寮傛暟鎹�
+    var arr = [{
+      checkName: 'layTransferLeftCheck'
+      ,views: []
+    }, {
+      checkName: 'layTransferRightCheck'
+      ,views: []
+    }];
+
+    if(options.url ){
+      //璇存槑瑕佷粠鍚庡彴鍘绘煡璇�
+      $webUtil.ajax(options.method?options.method:'get',options.url,options.where,function(result){
+        if(result.success){
+          options.data = result.data;
+          var newData = [];
+          layui.each(options.data,function (index,item){
+            item = (typeof options.parseData === 'function'
+                ? options.parseData(item)
+                : item) || item;
+            newData.push(item);
+            var listElem = ['<li>'
+              , '<input type="checkbox" name="' + arr[0].checkName + '" lay-skin="primary" lay-filter="layTransferCheckbox" title="' + item.title + '"' + (item.disabled ? ' disabled' : '') + (item.checked ? ' checked' : '') + ' value="' + item.value + '">'
+              , '</li>'].join('');
+            arr[0].views.push(listElem);
+          });
+          options.data = newData;
+          that.layData.eq(0).html(arr[0].views.join(''));
+          that.renderCheckBtn();
+          //wangting 娣诲姞鍥炶皟
+          typeof options.done === 'function' && options.done(result.data,that.layBox);
+        }else{
+          $webUtil.showErrorMsg(result.msg);
+        }
+      },function (xhr,error){
+        $webUtil.showErrorMsg("鏌ヨ鏁版嵁鐨勬椂鍊欏嚭鐜颁簡閿欒锛屽彲鑳芥槸鏈嶅姟娌℃湁鍚姩");
+      },options.backPath,true);
+
+
+    }else if(layui._typeof(options.data) === 'array'){
+      //瑙f瀽鏍煎紡
+      that.parseData(function (item) {
+        //鏍囨敞涓� selected 鐨勪负鍙宠竟鐨勬暟鎹�
+        var _index = item.selected ? 1 : 0
+            , listElem = ['<li>'
+          , '<input type="checkbox" name="' + arr[_index].checkName + '" lay-skin="primary" lay-filter="layTransferCheckbox" title="' + (item.selected?(item.selectTitle||item.title):item.title) + '"' + (item.disabled ? ' disabled' : '') + (item.checked ? ' checked' : '') + ' value="' + item.value + '">'
+          , '</li>'].join('');
+        arr[_index].views.push(listElem);
+        delete item.selected;
+      });
+
+      that.layData.eq(0).html(arr[0].views.join(''));
+      that.layData.eq(1).html(arr[1].views.join(''));
+
+      that.renderCheckBtn();
+      //wangting 娣诲姞鍥炶皟
+      typeof options.done === 'function' && options.done(options.data,that.layBox);
+    }
+
+    if(options.selectUrl){
+      //鏌ヨ宸茬粡閫夋嫨浜嗙殑鍐呭
+      $webUtil.ajax(options.selectMethod?options.selectMethod:'get',options.selectUrl,options.selectWhere,function(result){
+        if(result.success){
+          options.value = result.data;
+          var newData = [];
+          layui.each(options.value,function (index,item){
+            item = (typeof options.parseData === 'function'
+                ? options.parseData(item)
+                : item) || item;
+            newData.push(item);
+            var listElem = ['<li>'
+              , '<input type="checkbox" name="' + arr[1].checkName + '" lay-skin="primary" lay-filter="layTransferCheckbox" title="' + (item.selectTitle||item.title) + '"' + (item.disabled ? ' disabled' : '') + (item.checked ? ' checked' : '') + ' value="' + item.value + '">'
+              , '</li>'].join('');
+            arr[1].views.push(listElem);
+          });
+          options.value = newData;
+          that.layData.eq(1).html(arr[1].views.join(''));
+          that.renderCheckBtn();
+        }else{
+          $webUtil.showErrorMsg(result.msg);
+        }
+      },function (xhr,error){
+        $webUtil.showErrorMsg("鏌ヨ鏁版嵁鐨勬椂鍊欏嚭鐜颁簡閿欒锛屽彲鑳芥槸鏈嶅姟娌℃湁鍚姩");
+      },options.selectBackPath,true);
+
+    }else if(layui._typeof(options.selectData) === 'array'){
+      //options.value = options.selectData;
+      var newData = [];
+      arr[1].views=[];
+      layui.each(options.selectData,function (index,item){
+        item = (typeof options.parseData === 'function'
+            ? options.parseData(item)
+            : item) || item;
+        newData.push(item);
+        var isInCheck=false;
+        /*if(arr[1].views.length>0){
+          var checks=that.layData.eq(1).find('li input[type="checkbox"]')
+          for (var i=0;i<checks.length;i++){
+            if(item.value==checks[i].value){
+              isInCheck=true;
+            }
+          }
+        }*/
+        if(!isInCheck){
+          var listElem = ['<li>'
+            , '<input type="checkbox" name="' + arr[1].checkName + '" lay-skin="primary" lay-filter="layTransferCheckbox" title="' + (item.selectTitle||item.title) + '"' + (item.disabled ? ' disabled' : '') + (item.checked ? ' checked' : '') + ' value="' + item.value + '">'
+            , '</li>'].join('');
+          arr[1].views.push(listElem);
+        }
+
+      });
+      options.value = newData;
+      that.layData.eq(1).html(arr[1].views.join(''));
+      that.renderCheckBtn();
+    }
+  }
+  
+  //娓叉煋琛ㄥ崟
+  Class.prototype.renderForm = function(type){
+    form.render(type, 'LAY-transfer-'+ this.index);
+  };
+  
+  //鍚屾澶嶉�夋鍜屾寜閽姸鎬�
+  Class.prototype.renderCheckBtn = function(obj){
+    var that = this
+    ,options = that.config;
+    
+    obj = obj || {};
+    
+    that.layBox.each(function(_index){
+      var othis = $(this)
+      ,thisDataElem = othis.find('.'+ ELEM_DATA)
+      ,allElemCheckbox = othis.find('.'+ ELEM_HEADER).find('input[type="checkbox"]')
+      ,listElemCheckbox =  thisDataElem.find('input[type="checkbox"]');
+      
+      //鍚屾澶嶉�夋鍜屾寜閽姸鎬�
+      var nums = 0
+      ,haveChecked = false;
+      listElemCheckbox.each(function(){
+        var isHide = $(this).data('hide');
+        if(this.checked || this.disabled || isHide){
+          nums++;
+        }
+        if(this.checked && !isHide){
+          haveChecked = true;
+        }
+      });
+      
+      allElemCheckbox.prop('checked', haveChecked && nums === listElemCheckbox.length); //鍏ㄩ�夊閫夋鐘舵��
+      that.layBtn.eq(_index)[haveChecked ? 'removeClass' : 'addClass'](DISABLED); //瀵瑰簲鐨勬寜閽姸鎬�
+      
+      //鏃犳暟鎹鍥�
+      if(!obj.stopNone){
+        var isNone = thisDataElem.children('li:not(.'+ HIDE +')').length
+        that.noneView(thisDataElem, isNone ? '' : options.text.none);
+      }
+    });
+    
+    that.renderForm('checkbox');
+  };
+  
+  //鏃犳暟鎹鍥�
+  Class.prototype.noneView = function(thisDataElem, text){
+    var createNoneElem = $('<p class="layui-none">'+ (text || '') +'</p>');
+    if(thisDataElem.find('.'+ NONE)[0]){
+      thisDataElem.find('.'+ NONE).remove();
+    }
+    text.replace(/\s/g, '') && thisDataElem.append(createNoneElem);
+  };
+  
+  //鍚屾 value 灞炴�у��
+  Class.prototype.setValue = function(){
+    var that = this
+    ,options = that.config
+    ,arr = [];
+    that.layBox.eq(1).find('.'+ ELEM_DATA +' input[type="checkbox"]').each(function(){
+      var isHide = $(this).data('hide');
+      isHide || arr.push(this.value);
+    });
+    options.value = arr;
+    
+    return that;
+  };
+
+  //瑙f瀽鏁版嵁
+  Class.prototype.parseData = function(callback){
+    var that = this
+    ,options = that.config
+    ,newData = [];
+    
+    layui.each(options.data, function(index, item){
+      //瑙f瀽鏍煎紡
+      item = (typeof options.parseData === 'function' 
+        ? options.parseData(item) 
+      : item) || item;
+      
+      newData.push(item = $.extend({}, item))
+      
+      layui.each(options.value, function(index2, item2){
+        if(item2 == item.value){
+          item.selected = true;
+        }
+      });
+      callback && callback(item);
+    });
+   
+    options.data = newData;
+    return that;
+  };
+  
+  //鑾峰緱鍙充晶闈㈡澘鏁版嵁
+  Class.prototype.getData = function(value){
+    var that = this
+    ,options = that.config
+    ,selectedData = [];
+    
+    that.setValue();
+
+
+    layui.each(value || options.value, function(index, item){
+      //wangting 鍙充晶闈㈡澘鏀瑰彉榛樿璧嬪�兼柟娉曞悗锛屼笉鑳借幏鍙栧埌榛樿鍊�
+      selectedData.push({value:item});
+      layui.each(options.data, function(index2, item2){
+        delete item2.selected;
+        if(item == item2.value){
+          //selectedData.push(item2);
+          selectedData[selectedData.length-1]=item2
+        };
+      });
+
+    });
+    return selectedData;
+  };
+  //wangting锛岀Щ鍔ㄦ暟鎹埌鎸囧畾浣嶇疆
+  Class.prototype.moveData = function(boxIndex,index,toindex){
+    var that = this
+        ,thisBoxElem = that.layBox.eq(boxIndex)
+        ,thisDataElem = thisBoxElem.find('.'+ ELEM_DATA).children('li');
+    thisDataElem[index]=thisDataElem.splice(toindex,1,thisDataElem[index])[0];
+    thisBoxElem.find('.'+ ELEM_DATA).empty();
+    thisBoxElem.find('.'+ ELEM_DATA).append(thisDataElem)
+    that.setValue();
+  };
+  //浜嬩欢
+  Class.prototype.events = function(){
+    var that = this
+    ,options = that.config;
+    
+    //宸﹀彸澶嶉�夋
+    that.elem.on('click', 'input[lay-filter="layTransferCheckbox"]+', function(){ 
+      var thisElemCheckbox = $(this).prev()
+      ,checked = thisElemCheckbox[0].checked
+      ,thisDataElem = thisElemCheckbox.parents('.'+ ELEM_BOX).eq(0).find('.'+ ELEM_DATA);
+      
+      if(thisElemCheckbox[0].disabled) return;
+      
+      //鍒ゆ柇鏄惁鍏ㄩ��
+      if(thisElemCheckbox.attr('lay-type') === 'all'){
+        thisDataElem.find('input[type="checkbox"]').each(function(){
+          if(this.disabled) return;
+          this.checked = checked;
+        });
+      }
+      
+      that.renderCheckBtn({stopNone: true});
+    });
+    
+    //鎸夐挳浜嬩欢
+    that.layBtn.on('click', function(){
+      var othis = $(this)
+      ,_index = othis.data('index')
+      ,thisBoxElem = that.layBox.eq(_index)
+      ,arr = [];
+      if(othis.hasClass(DISABLED)) return;
+      
+      that.layBox.eq(_index).each(function(_index){
+        var othis = $(this)
+        ,thisDataElem = othis.find('.'+ ELEM_DATA);
+        
+        thisDataElem.children('li').each(function(){
+          var thisList = $(this)
+          ,thisElemCheckbox = thisList.find('input[type="checkbox"]')
+          ,isHide = thisElemCheckbox.data('hide');
+          
+          if(thisElemCheckbox[0].checked && !isHide){
+            thisElemCheckbox[0].checked = false;
+            thisBoxElem.siblings('.'+ ELEM_BOX).find('.'+ ELEM_DATA).append(thisList.clone());
+            thisList.remove();
+            
+            //璁板綍褰撳墠绌挎鐨勬暟鎹�
+            arr.push(thisElemCheckbox[0].value);
+          }
+          
+          that.setValue();
+        });
+      });
+      
+      that.renderCheckBtn();
+      
+      //绌挎鏃讹紝濡傛灉鍙﹀涓�涓姝e湪鎼滅储锛屽垯瑙﹀彂鍖归厤
+      var siblingInput = thisBoxElem.siblings('.'+ ELEM_BOX).find('.'+ ELEM_SEARCH +' input')
+      siblingInput.val() === '' ||  siblingInput.trigger('keyup');
+      
+      //绌挎鏃剁殑鍥炶皟
+      options.onchange && options.onchange(that.getData(arr), _index);
+    });
+    
+    //鎼滅储
+    that.laySearch.find('input').on('keyup', function(){
+      var value = this.value
+      ,thisDataElem = $(this).parents('.'+ ELEM_SEARCH).eq(0).siblings('.'+ ELEM_DATA)
+      ,thisListElem = thisDataElem.children('li');
+
+      thisListElem.each(function(){
+        var thisList = $(this)
+        ,thisElemCheckbox = thisList.find('input[type="checkbox"]')
+        ,isMatch = thisElemCheckbox[0].title.indexOf(value) !== -1;
+
+        thisList[isMatch ? 'removeClass': 'addClass'](HIDE);
+        thisElemCheckbox.data('hide', isMatch ? false : true);
+      });
+
+      that.renderCheckBtn();
+      
+      //鏃犲尮閰嶆暟鎹鍥�
+      var isNone = thisListElem.length === thisDataElem.children('li.'+ HIDE).length;
+      that.noneView(thisDataElem, isNone ? options.text.searchNone : '');
+    });
+  };
+  
+  //璁板綍鎵�鏈夊疄渚�
+  thisModule.that = {}; //璁板綍鎵�鏈夊疄渚嬪璞�
+  thisModule.config = {}; //璁板綍鎵�鏈夊疄渚嬮厤缃」
+  
+  //閲嶈浇瀹炰緥
+  transfer.reload = function(id, options){
+    var that = thisModule.that[id];
+    that.reload(options);
+    
+    return thisModule.call(that);
+  };
+  
+  //鑾峰緱閫変腑鐨勬暟鎹紙鍙充晶闈㈡澘锛�
+  transfer.getData = function(id){
+    var that = thisModule.that[id];
+    return that.getData();
+  };
+//wangting锛岀Щ鍔ㄦ暟鎹埌鎸囧畾浣嶇疆
+  transfer.moveData = function(id,boxIndex,index,toindex){
+    var that = thisModule.that[id];
+    that.moveData(boxIndex,index,toindex);
+  };
+  //鏍稿績鍏ュ彛
+  transfer.render = function(options){
+    var inst = new Class(options);
+    return thisModule.call(inst);
+  };
+
+  exports(MOD_NAME, transfer);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/transferTable.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/transferTable.js
new file mode 100644
index 0000000..ef4ccab
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/transferTable.js
@@ -0,0 +1,261 @@
+layui.define('table', function(exports) {
+    var $ = layui.$
+        , table = layui.table
+        //瀛楃甯搁噺
+        , MOD_NAME = 'transferTable', ELEM = '.layui-transferTable'
+
+        //澶栭儴鎺ュ彛
+        , transferTable = {
+            index: layui.transferTable ? (layui.transferTable.index + 10000) : 0
+            //璁剧疆鍏ㄥ眬椤�
+            , set: function (options) {
+                var that = this;
+                that.config = $.extend({}, that.config, options);
+                return that;
+            }
+            , get: function (id) {
+                if (this.config && this.config[id]) {
+                    return this.config[id].data
+                } else {
+                    return []
+                }
+            }
+            , reload: function (id, options) {
+                table.reload(id, options)
+            }
+
+        }
+        //鎿嶄綔褰撳墠瀹炰緥
+        , transfer = function () {
+            var that = this
+                , options = that.config
+                , id = options.id || options.index;
+            transfer.that[id] = that; //璁板綍褰撳墠瀹炰緥瀵硅薄
+            transfer.config[id] = options; //璁板綍褰撳墠瀹炰緥閰嶇疆椤�
+            return {
+                reload: function (options) {
+                    that.reload.call(that, options);
+                }
+                , config: options
+                //鑾峰彇鍙充晶鏁版嵁
+                , getData: function (haskey) {
+                    return that.getData.call(that,haskey);
+                }
+            }
+        }
+        //鏋勯�犲櫒
+        , Class = function (options) {
+            var that = this;
+            that.index = ++transferTable.index;
+            that.left_table_id = "left_table_" + that.index;
+            that.rigth_table_id = "rigth_table_" + that.index;
+            //琛ㄦ牸閲嶈浇ID 濡傛灉閰嶇疆閲岄潰娌℃湁 鑷姩鍒嗛厤涓�涓狪D
+            that.reload_left = options.leftTable['id'] || that.left_table_id;
+            that.reload_right = options.rightTable['id'] || that.rigth_table_id;
+            //鍙充晶琛ㄦ牸榛樿鍊�
+            if (options.defultValue) {
+                options.defultValueKey = options.defultValueKey || 'id';
+            }
+
+            options.leftTable['elem'] = '#' + that.left_table_id;
+            options.leftTable['callback'] = options.leftTable['done'];
+            options.leftTable['firstLoad'] = true;
+
+            options.rightTable['elem'] = '#' + that.rigth_table_id;
+            options.rightTable['callback'] = options.rightTable['done'];
+            options.rightTable['firstLoad'] = true;
+            options.rightTable['data'] = options.rightTable['data'] || [];
+            that.config = $.extend({}, that.config, transferTable.config, options);
+            that.render();
+        };
+
+
+    Class.prototype.render = function () {
+        //ID閲岄潰鏀捐〃鏍兼牱寮�
+        this.tableHtml()
+        // 閰嶇疆琛ㄦ牸鍙傛暟
+        this.loadTable()
+        // 绉诲姩鏁版嵁
+        this.transferData()
+
+    }
+
+    Class.prototype.tableHtml = function () {
+        var that = this,
+            options = that.config,
+            left_table = '<table class="layui-hide" id="' + that.left_table_id + '" lay-filter="' + that.left_table_id + '"></table>',
+            rigth_table = '<table class="layui-hide" id="' + that.rigth_table_id + '" lay-filter="' + that.rigth_table_id + '"></table>',
+            html = '<div style="width:100%;margin:0 auto;overflow: hidden">' +
+                '<div style="display: inline-block;vertical-align: middle;">' + left_table + '</div>' +
+                '<div class="layui-transfer-active" style="">' +
+                '<button type="button" data-tid="' + that.left_table_id + '" class="' + that.left_table_id + ' layui-btn layui-btn-sm layui-btn-primary layui-btn-disabled" data-index="0" style="height: 30px;line-height: 30px;">' +
+                '<i class="layui-icon layui-icon-next"></i>' +
+                '</button>' +
+                '<button type="button" data-tid="' + that.rigth_table_id + '" class="' + that.rigth_table_id + ' layui-btn layui-btn-sm layui-btn-primary layui-btn-disabled" data-index="1" style="height: 30px;line-height: 30px;">' +
+                '<i class="layui-icon layui-icon-prev"></i>' +
+                '</button>' +
+                '</div>' +
+                '<div style="display: inline-block;vertical-align: middle;">' + rigth_table + '</div>' +
+                '<div>';
+        $(options.elem).append(html)
+    }
+    Class.prototype.loadTable = function () {
+        //浼犻�掔殑鍙傛暟 table.render 琛ㄦ牸
+        var that = this,
+            options = that.config;
+        options.leftTable['done'] = function (res, cur, total) {
+            //鐩戝惉琛ㄦ牸閫変腑
+            table.on('checkbox(' + that.left_table_id + ')', function (obj) {
+                //琛ㄦ牸鐐瑰嚮瑙﹀彂
+                /*var checkStatusData = table.checkStatus(that.reload_left).data;
+                if (checkStatusData.length > 0) {
+                    $('.' + that.left_table_id).removeClass('layui-btn-disabled')
+                } else {
+                    $('.' + that.left_table_id).addClass('layui-btn-disabled')
+                }*/
+                $('.' + that.left_table_id).removeClass('layui-btn-disabled')
+            });
+
+            if (options.leftTable.callback) {
+                options.leftTable.callback(res, cur, total);
+            }
+            var rightData = table.getData(that.reload_right,false)
+            //鍒濆鍖栨椂鍙充晶鏈夋暟鎹紝瑕佸皢宸︿晶瀵瑰簲鏁版嵁鍕鹃�変笂
+            if (rightData.length > 0) {
+                for (var i = 0; i < rightData.length; i++) {
+                    for (var j = 0; j < res.data.length; j++) {
+                        if (rightData[i]['id'] == res.data[j]['id']) {
+                            table.checkRecord(that.reload_left, res.data[j]);
+                            break;
+                        }
+                    }
+                }
+            }
+        }
+        options.rightTable['done'] = function (res, cur, total) {
+            //鐩戝惉琛ㄦ牸閫変腑
+            table.on('checkbox(' + that.rigth_table_id + ')', function (obj) {
+                //鍙充晶琛ㄦ牸鐐瑰嚮瑙﹀彂
+                /*var checkStatusData = table.checkStatus(that.reload_right).data;
+                if (checkStatusData.length > 0) {
+                    $('.' + that.rigth_table_id).removeClass('layui-btn-disabled')
+                } else {
+                    $('.' + that.rigth_table_id).addClass('layui-btn-disabled')
+                }*/
+                $('.' + that.rigth_table_id).removeClass('layui-btn-disabled')
+            });
+            if (options.rightTable.firstLoad) {
+                if (options.rightTable.callback) {
+                    options.rightTable.callback(res, cur, total);
+                }
+                //鍙充晶琛ㄦ牸鍔犺浇瀹屽悗鍐嶅姞杞藉乏渚э紝浠ヤ究灏嗘暟鎹湪宸︿晶鍕鹃�変笂
+                table.render(options.leftTable);
+            }
+            options.rightTable.firstLoad = false
+        };
+
+        if (options.rightTable.url) {
+            $webUtil.ajax(options.rightTable.method || 'get', options.rightTable.url, $.extend({limit: -1}, options.rightTable.where, options.rightTable.extraParams), function (result) {
+                if (result.success) {
+                    options.rightTable['data'] = result.data;
+                    options.rightTable['loadurl'] = options.rightTable['url'];
+                    options.rightTable['url'] = null;
+                    table.render(options.rightTable);
+                } else {
+                    $webUtil.showErrorMsg(result.msg);
+                }
+            }, function (xhr, error) {
+                $webUtil.showDebugMsg(error);
+            }, options.rightTable.backPath);
+        } else {
+            table.render(options.rightTable);
+        }
+
+    }
+    Class.prototype.transferData = function () {
+        //缁戝畾鐐瑰嚮浜嬩欢
+        var that = this,
+            idName = that.config.id_name;
+        $('.' + that.left_table_id).on('click', function () {
+            if (!$(this).hasClass('layui-btn-disabled')) {
+                var leftData = table.getData(that.reload_left,false)
+                var rightData = table.getData(that.reload_right,false)
+
+                layui.each(leftData, function (i, item) {
+                    if (item[table.config.checkName]) {
+                        //璇ユ暟鎹乏渚у凡閫変腑锛岄』鍦ㄥ彸渚т腑娣诲姞
+                        var add = true;
+                        for (var j = 0; j < rightData.length; j++) {
+                            if (item['id'] == rightData[j]['id']) {
+                                add = false
+                                break;
+                            }
+                        }
+                        add && rightData.push(JSON.parse(JSON.stringify(item)));
+                        rightData[rightData.length - 1][table.config.checkName] = false
+                    } else {
+                        //璇ユ暟鎹乏渚ф湭閫変腑锛岄』鍦ㄥ彸渚т腑鍒犻櫎
+                        for (var j = 0; j < rightData.length; j++) {
+                            if (item['id'] == rightData[j]['id']) {
+                                rightData.remove(rightData[j])
+                                break;
+                            }
+                        }
+                    }
+
+                });
+
+                table.reload(that.reload_right, {data: rightData})
+            }
+            $(this).addClass('layui-btn-disabled')
+        })
+        $('.' + that.rigth_table_id).on('click', function () {
+            if (!$(this).hasClass('layui-btn-disabled')) {
+                var checkStatus = table.checkStatus(that.reload_right, true)
+                    , checkStatusData = checkStatus.data;
+                if (checkStatusData && checkStatusData.length) {
+                    var leftData = table.getData(that.reload_left,false)
+
+                    for (var i = 0; i < checkStatusData.length; i++) {
+                        //宸︿晶琛ㄦ牸鍘婚櫎閫変腑鐘舵��
+                        for (var j = 0; j < leftData.length; j++) {
+                            if (checkStatusData[i]['id'] == leftData[j]['id']) {
+                                table.checkRecord(that.reload_left, leftData[j]);
+                                break;
+                            }
+                        }
+                    }
+
+                    table.removeData(that.reload_right, checkStatusData)
+                }
+            }
+            $(this).addClass('layui-btn-disabled')
+        })
+
+    }
+
+    //鑾峰緱鍙充晶闈㈡澘鏁版嵁
+    Class.prototype.getData = function (haskey) {
+        var that = this
+            , options = that.config
+            , selectedData = [];
+
+        var selectedData = table.getData(that.reload_right,!haskey)
+        return selectedData;
+    };
+
+    //璁板綍鎵�鏈夊疄渚�
+    transfer.that = {}; //璁板綍鎵�鏈夊疄渚嬪璞�
+    transfer.config = {}; //璁板綍鎵�鏈夊疄渚嬮厤缃」
+
+    //鑾峰緱閫変腑鐨勬暟鎹紙鍙充晶闈㈡澘锛�
+    transferTable.getData = function (id,haskey) {
+        var that = transfer.that[id];
+        return table.getData(that.reload_right,haskey);
+    };
+    transferTable.render = function (options) {
+        var ins = new Class(options);
+        return transfer.call(ins);
+    };
+    exports('transferTable', transferTable);
+});
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/tree.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/tree.js
new file mode 100644
index 0000000..d246dde
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/tree.js
@@ -0,0 +1,1093 @@
+/**
+
+ @Name锛歭ayui.tree 鏍戠粍浠�
+ @Author锛氳搐蹇�---weidy鍦ㄦ鍩虹涓婇噸鏂拌皟鏁翠簡鍐呭
+ @License锛歁IT
+
+ */
+
+layui.define(['jquery','util'], function(exports){
+    "use strict";
+
+    var $ = layui.$
+    ,hint = layui.hint();
+
+      var enterSkin = 'layui-tree-enter';
+      /**
+       * 鍒濆鍖栨爲鐨勫璞�
+       * @constructor
+       */
+      var Tree = function(){
+          this.icon = {//鍥炬爣
+              arrow: ['&#xe623;', '&#xe625;'] //绠ご
+              ,checkbox: ['', '&#xe605;'] //澶嶉�夋
+              ,radio: ['&#xe62b;', '&#xe62a;'] //鍗曢�夋
+              ,branch: ['&#xe622;', '&#xe624;'] //鐖惰妭鐐�
+              ,leaf: '&#xe621;' //鍙惰妭鐐�
+          },
+          this.loadType = {//鍔犺浇鏂瑰紡
+               all:'all',//涓�娆″睍寮�鍏ㄩ儴
+               node:'node'//涓�娆″睍寮�涓�绾�
+          },
+          this.emptyText = "娌℃湁鏁版嵁"
+    };
+
+      /***
+       * 鍒濆鍖栨煇浜涘璞�
+       */
+      Tree.prototype.privateInitObject = function(){
+          var that = this;
+          if(!that.config) that.config = {};//閰嶇疆
+          if(!that.cacheData) that.cacheData = {};//缂撳瓨鏁版嵁
+          if(!that.allCheck) that.allCheck = {};//鍕鹃�夌殑鏁版嵁
+          if(!that.getAllData) that.getAllData = {};//鍕鹃�夌殑鏁版嵁
+          if(!that.allSelectedData) that.allSelectedData = {};//鍗曞嚮閫変腑鐨勬暟鎹�
+      };
+
+      /**
+       * 鏍戠殑鍒濆鍖栵紝
+       * @param filter 杩囨护鍣�
+       * @param elem 鏍瑰厓绱�
+       * @param options 閰嶇疆淇℃伅
+       */
+    Tree.prototype.init = function(filter,elem,options){
+        var that = this;
+        that.privateInitObject();
+        that.setConfig(filter,elem,options);
+        that.clearCheckData(filter);
+        elem.addClass('layui-box layui-tree'); //娣诲姞tree鏍峰紡
+        if(elem.attr("layui-filter") && elem.attr("layui-filter").indexOf(filter) < 0){
+            var f = elem.attr("layui-filter");
+            elem.attr("layui-filter",filter);
+        }
+        if(options.skin){//鐨偆
+            elem.addClass('layui-tree-skin-'+ options.skin);
+        }
+        if(options.url || options.data){//浣跨敤鍚庡彴鏉ュ姞杞界殑
+            that.load(filter,elem,options.parentValue,false);
+        }else{//鐩存帴鏄剧ず
+            that.showTree(filter,elem);
+            that.on(filter,elem);
+        }
+        if(options.showSearch) {
+            that.syncLayuiTreeFilter(filter,elem);
+        }
+    };
+
+      /**
+       * 璁剧疆閰嶇疆淇℃伅
+       * @param filter 杩囨护鍣�
+       * @param elem //鏍戝睍绀虹殑鏍硅妭鐐�
+       * @param options
+       */
+      Tree.prototype.setConfig = function(filter,elem,options){
+           var that = this;
+           that.config[filter]= {
+               elem:elem,
+               options:options
+           };
+      };
+
+      /***
+       * 鑾峰彇閰嶇疆淇℃伅
+       * @param filter 杩囨护鍣�
+       * @returns {elem:鏍瑰厓绱�,options:閰嶇疆淇℃伅}
+       */
+      Tree.prototype.getConfig = function(filter){//鑾峰彇閰嶇疆鏂囦欢
+          var that = this;
+          return that.config[filter];
+      };
+
+      /**
+       * 鑾峰彇鏍瑰厓绱�
+       * @param filter 杩囨护鍣�
+       * @returns {*} elem鍏冪礌瀵硅薄
+       */
+      Tree.prototype.getRootElem =function(filter){
+          var that = this;
+          var config = that.getConfig(filter);
+          if(config){
+              return config.elem;
+          }else{
+              return false;
+          }
+      };
+
+      /***
+       * 鑾峰彇閰嶇疆淇℃伅
+       * @param filter 杩囨护鍣�
+       * @returns {*}
+       */
+      Tree.prototype.getOptions = function(filter){
+          var that = this;
+          var config = that.getConfig(filter);
+          if(config){
+              return config.options;
+          }else{
+              return false;
+          }
+      };
+      Tree.prototype.setOptions = function(filter,options){
+          var that = this;
+          var config = that.getConfig(filter);
+          if(config){
+             that.setConfig(filter,config.elem,options);
+          }
+      };
+
+      /**
+       * 淇濆瓨缂撳瓨鏁版嵁
+       * @param filter 杩囨护鍣�
+       * @param parenValue 涓婄骇鍊�
+       * @param data 褰撳墠鍊�
+       */
+      Tree.prototype.setCacheData=function(filter,data){
+          var that = this;
+          if( !that.cacheData[filter]){
+              that.cacheData[filter] = {};
+          }
+          that.cacheData[filter][data.oid] = data;
+          //鍏ㄩ儴骞抽摵锛屽鏋滄槸鎯宠幏鍙栫粨鏋勫寲鐨勫唴瀹癸紝鍗曠嫭鐨勬柟娉曢噷鎻愪緵
+      };
+
+      /**
+       * 鏍规嵁涓婚敭鑾峰彇鏁版嵁,涓嶅寘鍚笅绾�
+       * @param filter 杩囨护鍣�
+       * @param oid 涓婚敭
+       */
+      Tree.prototype.getDataByOid=function(filter,oid){
+          var that = this;
+          var cacheData = that.cacheData[filter];
+          if(!cacheData) return false;
+          if(layui.util.isNull(oid)){
+              return cacheData;
+          }else{
+             return cacheData[oid];
+          }
+      };
+
+      /**
+       * 鑾峰彇褰撳墠鑺傜偣鐨勫瓙鑺傜偣
+       * @param filter 杩囨护鍣�
+       * @param oid 褰撳墠鑺傜偣鐨勪富閿�
+       */
+      Tree.prototype.getChildDataByOid=function(filter,oid){
+          var that = this;
+          //TODO 鏈潵娴嬭瘯涓�涓嬩娇鐢╦query鏉ユ煡璇oc蹇紝杩樻槸鐩存帴閬嶅巻鎵�鏈夌殑鏁版嵁蹇� weidy@2018-04-10
+          var elem = that.getRootElem(filter);
+          var data = that.getDataByOid(filter,oid);
+          if(layui.util.isNull(oid) || !data){
+              return data?[data]:false;//鐩存帴杩斿洖鍏ㄩ儴
+          }
+          var nodeCity = elem.find('cite[oid="' + oid + '"]').first();
+          var hasChildrenOid = [];
+          if(nodeCity){
+              var allChildrenElem = nodeCity.parent().parent().children("ul").first().children("li");//浣跨敤children鍙細鎵剧涓�绾�
+              if(allChildrenElem){
+                  layui.each(allChildrenElem,function(_index,record){
+                      try{
+                          var childOid = record.children("a").first().children("<cite>").first().attr("oid");
+                          if(childOid){
+                              hasChildrenOid.push(childOid);
+                          }
+                      }catch(e){
+                          layui.util.showDebugMsg(e);
+                      }
+                  });
+              }
+          }
+          var childData = [];
+          if(hasChildrenOid.length >0){
+              layui.each(hasChildrenOid,function(_index,record){
+                  var tempData =  that.getDataByOid(filter,record);
+                  if(tempData) childData.push(tempData);
+              });
+          }
+          return childData;
+      };
+
+      /***
+       * 鑾峰彇褰撳墠鑺傜偣鐨勪笂绾ц妭鐐�
+       * @param filter 杩囨护鍣�
+       * @param oid 鏈妭鐐圭殑涓婚敭
+       * @return false鎴栬�呬笂绾у璞℃暟鎹�
+       */
+      Tree.prototype.getParentDataByOid = function(filter,oid){
+          var that =this;
+          var elem = that.getElemByItem(filter,oid);
+          if(!elem){
+              var parentElem = elem.parent().parent().children("li").first();
+              if(parentElem){
+                  var data = that.getDataByOid(filter,that.getOidByElem(parentElem));
+                  return data?data:false;
+              }
+          }
+          return false;
+      };
+
+      /**
+       * 閲嶆柊鍔犺浇鏁翠釜鏍�
+       * @param filter 杩囨护鍣�
+       * @param options 鏂板鐨勯厤缃�
+       */
+      Tree.prototype.reload = function(filter,options){
+          var that = this;
+          var rootElem = that.getRootElem(filter);
+          var oldOptions = that.getOptions(filter);
+          if(options) {oldOptions = $.extend(oldOptions,options)};
+          that.setConfig(filter,rootElem,oldOptions);
+          //娓呴櫎鎵�鏈夌殑鏁版嵁鍜宧tml鍏冪礌
+          rootElem.children().remove();
+          delete that.cacheData[filter];
+          that.load(filter,rootElem);
+          that.getAllData = {};
+          that.allCheck = {};
+          that.allSelectedData={};
+          if(oldOptions.showSearch) {
+              that.syncLayuiTreeFilter(filter,rootElem);
+          }
+      };
+
+      /**
+       * 閲嶆柊鍔犺浇鏌愪釜鑺傜偣
+       * @param filter 杩囨护鍣�
+       * @param oid 鑺傜偣涓婚敭
+       * @param callback 鍥炶皟鍑芥暟
+       */
+      Tree.prototype.reloadNode = function(filter,nodeOid,callback,parentBtmType){
+          var that = this;
+          var elem = that.getElemByItem(filter,nodeOid);
+          //娌″姙娉曪紝闇�瑕佸皢鎵�鏈変笅绾ч兘閲嶆柊鍔犺浇锛屽洜涓烘湁鍙兘鐩村睘涓嬬骇閮藉彂鐢熶簡鍙樺寲
+          //鍏堣幏鍙栨墍鏈夌殑涓嬬骇鐨勪富閿�
+          var allChildrenOid = [];
+          elem.children("ul").find("cite").each(function(){
+              var record = $(this);
+              allChildrenOid.push(record.attr("oid"));
+          });
+          layui.each(allChildrenOid,function(_index,record){//鍒犻櫎鏁版嵁
+              if(that.cacheData[filter] && that.cacheData[filter][record])
+                  delete that.cacheData[filter][record];
+          });
+          //var parentElem = elem.parent().parent().first();
+          elem.children("ul").remove();//鍒犻櫎鍏冪礌
+          that.load(filter,elem,nodeOid,true,callback,parentBtmType);
+      };
+
+      /**
+       * 閫氳繃鍚庡彴鏉ュ姞杞�
+       * @param filter 杩囨护鍣�
+       * @param elem 涓婄骇鍏冪礌
+       * @param parentValue 涓婄骇鍊�
+       * @param isAppend 鏄惁杩藉姞
+       */
+      Tree.prototype.load = function(filter,elem,parentValue,isAppend,callback,parentBtmType) {
+          var that = this;
+          var options = that.getOptions(filter);
+          if (options.url) {
+              if (!options.extraParams) {
+                  options.extraParams = {};
+              }
+              var queryParams = {};
+
+              if (!options.loadType) {
+                  options.loadType = that.loadType.node;
+              }
+              queryParams['queryAllLevel'] = options.loadType == that.loadType.node ? false : true;//榛樿閫愮骇灞曞紑
+              queryParams['loadType'] = options.loadType;
+              queryParams['multipleSelect'] = ("true" == options.isMuti || options.isMuti) ? true : false;
+              queryParams['isMuti'] = options.extraParams['multipleSelect'];
+              if (options.where) {
+                  for (var key in options.where) {
+                      queryParams[key] = options.where[key];
+                  }
+              }
+              if (options.extraParams) {
+                  for (var key in options.extraParams) {
+                      queryParams[key] = options.extraParams[key];//鑰佺殑鏂瑰紡
+                      //queryParams['conditionMap["' + key + '"]'] = options.extraParams[key];//鏂扮殑鏂瑰紡
+                  }
+              }
+              if ($webUtil.isNotNull(parentValue)) {
+                  queryParams['parentOid'] = parentValue.indexOf('@vcitreesep@') > -1 ? parentValue.split('@vcitreesep@')[1] : parentValue;
+                  queryParams['parentValue'] = queryParams['parentOid'];
+              }
+              if ($webUtil.isNotNull(parentBtmType)) {
+                  queryParams['parentBtmName'] = parentBtmType;
+                  queryParams['parentBtmType'] = parentBtmType;
+              }
+              if (options.rootParams && !options.rootNodeLoaded) {
+                  for (var key in options.rootParams) {
+                      queryParams[key] = options.rootParams[key];
+                  }
+                  options.rootNodeLoaded = true;
+                  that.setOptions(filter, options);
+              }
+              if (options.conditionParams) {
+                  //璇存槑鏄墿灞曞睘鎬�
+                  for (var key in options.conditionParams) {
+                      queryParams['conditionMap["' + key + '"]'] = options.conditionParams[key];//鏂扮殑鏂瑰紡
+                  }
+              }
+              if (options.treeExtandParams) {
+                  //璇存槑鏄墿灞曞睘鎬�
+                  for (var key in options.treeExtandParams) {
+                      queryParams['extandParamsMap["' + key + '"]'] = options.treeExtandParams[key];//鏂扮殑鏂瑰紡
+                  }
+              }
+              if (options.sourceDataParams) {
+                  //璇存槑鏄墿灞曞睘鎬�
+                  for (var key in options.sourceDataParams) {
+                      if (key && key.constructor === Object) return;
+                      queryParams['sourceData["' + key + '"]'] = options.sourceDataParams[key];//鏂扮殑鏂瑰紡
+                  }
+              }
+              if (options.replaceParams) {
+                  //璇存槑鏄墿灞曞睘鎬�
+                  for (var key in options.replaceParams) {
+                      if (key && key.constructor === Object) return;
+                      queryParams['replaceMap["' + key + '"]'] = options.replaceParams[key];//鏂扮殑鏂瑰紡
+                  }
+              }
+              if (options.remoteSort && options.initSort) {
+                  queryParams['order'] = options.initSort.type;//鏂规硶
+                  queryParams['sort'] = options.initSort.field;//瀛楁
+              }
+              $webUtil.ajax(options.requestType ? options.requestType : 'get', options.url, queryParams, function (result) {
+                  if (result && $webUtil.isNotNull(result.msg)) {//浠ュ墠鐨勬帴鍙e彲鑳芥病鏈塵sg灞炴��
+                      $webUtil.showErrorMsg(result.msg);
+                      return;
+                  }
+                  var tempNode = null;
+                  if (result && result.success && "treeData" in result) {
+                      tempNode = result.treeData;
+                  } else {
+                      //鍏煎浠ュ墠鐨勬柟寮�
+                      tempNode = result;
+                  }
+                  if (!isAppend) {//涓嶆槸杩藉姞锛岃鏄庡緱灏嗗唴瀹规斁杩涘幓
+                      //鎶婃暟鎹紦瀛樿捣鏉ワ紝杩欐牱鍚庨潰鍦ㄨ幏鍙栨墍鏈夌殑鏁版嵁鐨勬椂鍊欏彲浠ヨ幏鍙�
+                      that.showTree(filter, elem, tempNode);
+                      that.on(filter, elem);
+                  } else {
+                      var ul = that.addChildNodeEl(filter, elem, true,tempNode);
+                      that.showTree(filter, ul, tempNode, true);
+                      that.on(filter, ul);
+                  }
+                  if(options.loadCallback && !isAppend){
+                      options.loadCallback(filter,tempNode);
+                  }
+                  if(options.loadAllCallback){
+                      options.loadAllCallback(filter,tempNode);
+                  }
+                  if(callback){
+                      callback(filter,elem,tempNode);
+                  }
+              }, function (xhr, error) {
+                  $webUtil.showErrorMsg("鍔犺浇鏍戠殑鏃跺�欏嚭鐜颁簡閿欒,options=" + JSON.stringify(options));
+              }, options.backPath ? options.backPath : null,options.noProgress);
+              return;
+          } else if (options.data) {
+              that.showTree(filter, elem, options.data);
+              that.on(filter, elem);
+              if (options.loadCallback && !isAppend) {
+                  options.loadCallback(filter, tempNode);
+              }
+              if (options.loadAllCallback) {
+                  options.loadAllCallback(filter, tempNode);
+              }
+              if (callback) {
+                  callback(filter, elem, tempNode);
+              }
+          }
+      };
+
+      /**
+       * 褰撴湁瀛愯妭鐐圭殑鏃跺�欙紝缁欏瓙鑺傜偣娣诲姞蹇呰鐨勫厓绱�
+       * @param elem 褰撳墠鐨勮妭鐐�
+       * @returns {*|HTMLElement}
+       */
+      Tree.prototype.addChildNodeEl = function(filter,elem,isExpand,children){
+          var that = this;
+          var ul = $('<ul class="'+ (isExpand ? "layui-show" : "") +'"></ul>');
+          elem.append(ul);
+          var nodeI =  that.getNodeI(elem);//鎵惧埌鑺傜偣鐨勫厓绱�
+          nodeI.removeClass("layui-tree-leaf");
+          nodeI.addClass("layui-tree-branch");
+          //nodeI.html(that.icon.branch[1]);
+          if(children && children.length>0) {
+              var item = that.getDataByOid(filter, that.getOidByElem(filter, elem));
+              item.leaf = false;
+              that.getAllData[item.oid] = item;
+              that.allCheck[filter] && (that.allCheck[filter][item.oid] = item);
+              that.allSelectedData[filter] = item;
+              that.setCacheData(filter, item)
+          }
+          that.on(filter,ul);
+          return ul;
+      };
+
+      /**
+       * 鏍稿績鏂规硶--鏍戠殑灞曠ず锛屽寘鎷拷鍔犺妭鐐瑰拰鐩存帴鏄剧ず鎵�鏈夎妭鐐�
+       * @param elem
+       * @param children
+       */
+    Tree.prototype.showTree = function(filter,elem, children,isAppend) {
+        var that = this, options = that.getOptions(filter);
+        var nodes = children || options.nodes;
+        if ((!nodes || nodes.length == 0) && !isAppend) {
+            elem.append('<div class="emptyDiv" style="margin: 5px 0">' + that.emptyText + '</div>');
+        } else {
+            $('.emptyDiv', elem).remove()
+        }
+        layui.each(nodes, function (index, item) {
+            //澶勭悊灞炴�ф槧灏� weidy@2018-03-16
+            if (!item.expanded)
+                item.spread = item.expanded;
+            else
+                item.spread = false;
+            if (isAppend) item.spread = true;
+            if (!item.name)
+                item.name = item.text;
+            if (item.checked || options.isMuti) {
+                options.check = 'checkbox';
+            }
+            that.setCacheData(filter, item);
+            var hasChild = item.children && item.children.length > 0;
+            var isLeaf = item.leaf;
+            var li = $(['<li ' + (item.spread ? 'data-spread="' + item.spread + '"' : 'style="overflow-x:auto;overflow-y: hidden;"') + '>'
+                //灞曞紑绠ご
+                , function () {
+                    return isLeaf || hasChild ? '<i class="layui-icon layui-tree-spread">' + (
+                        item.spread ? that.icon.arrow[0] : that.icon.arrow[1]
+                    ) + '</i>' : '';
+                }()
+
+                //澶嶉�夋/鍗曢�夋
+                , function () {
+                    return options.check ? (
+                        '<i class="layui-icon layui-tree-check ' + (item.checked == true ? 'layui-tree-checked' : '') + ' check_' + item.oid + '" oid="' + item.oid + '">' + (
+                            options.check === 'checkbox' ? that.icon.checkbox[0] : (
+                                options.check === 'radio' ? that.icon.radio[0] : ''
+                            )
+                        ) + (item.checked == true ? that.icon.checkbox[1] : '') + '</i>'
+                    ) : '';
+                }()
+
+                //鑺傜偣
+                , function () {
+                    return '<a href="' + (item.href || 'javascript:;') + '" ' + (
+                            options.target && item.href ? 'target=\"' + options.target + '\"' : ''
+                        ) + '>'
+                        + ('<i class="layui-icon layui-tree-' + (hasChild ? "branch" : "leaf") + '">' + (
+                            hasChild ? (
+                                '' //item.spread ? that.icon.branch[1] : that.icon.branch[0]
+                            ) : ''//that.icon.leaf
+                        ) + '</i>') //鑺傜偣鍥炬爣
+                        //2021-6-17  wangting  澧炲姞templet鏄剧ず
+                        + ('<cite oid="' + (item.oid || layui.util.uuid()) + '" style="color:' + (item.icon) + ' !important;">' + (options.templet ? function () {
+                            return typeof options.templet === 'function'
+                                ? options.templet(item)
+                                : layui.laytpl($(options.templet).html() || String(item.name)).render(item)
+                        }() : (item.name || '鏈懡鍚�')) + '</cite></a>');
+                }()
+
+                , '</li>'].join(''));
+
+            //濡傛灉鏈夊瓙鑺傜偣锛屽垯閫掑綊缁х画鐢熸垚鏍�
+            if (hasChild) {
+                var ul = that.addChildNodeEl(filter, li, true);
+                that.showTree(filter, ul, item.children, true);
+            }
+
+            elem.append(li);
+
+            //瑙﹀彂鐐瑰嚮鑺傜偣鍥炶皟
+            typeof options.click === 'function' && that.click(filter, li, options);
+
+            //浼稿睍鑺傜偣--鑷姩灞曞紑鑺傜偣
+            that.spread(filter, li);
+
+            //鎷栨嫿鑺傜偣
+            options.drag && that.drag(filter, li);
+
+            //澶嶉�夋鐐瑰嚮浜嬩欢
+            if (options.check) {
+                that.checkClick(filter, li);
+            }
+            if (item.checked == true) {
+                that.getAllData[item.oid] = item;
+                that.allCheck[filter] = {};
+                that.allCheck[filter][item.oid] = item;
+            }
+        });
+        if (options.done && !isAppend) {
+            options.done(filter, children, elem);
+        }
+    };
+
+      /**
+       * 澶嶉�夋鐐瑰嚮浜嬩欢澶勭悊
+       * @param filter 杩囨护鍣�
+       * @param elem 鐐瑰嚮li
+       * @param item 璇ュ璞�
+       */
+      Tree.prototype.checkClick = function(filter,elem){
+          var that = this, options = that.getOptions(filter);
+          var item = that.getDataByOid(filter,that.getOidByElem(filter,elem));
+          elem.children('.layui-tree-check').first().on('click',function(e){
+              layui.stope(e);
+              if($(this).hasClass("layui-tree-checked")){
+                  $(this).next().next().find('.layui-tree-check').removeClass("layui-tree-checked");
+                  $(this).next().next().find('.layui-tree-check').html(that.icon.checkbox[0]);
+                  // 鐖剁骇
+                  // $(this).parent().parent().prev().prev().removeClass("layui-tree-checked");
+                  // $(this).parent().parent().prev().prev().html(that.icon.checkbox[0]);
+                  $(this).removeClass("layui-tree-checked");
+                  $(this).html(that.icon.checkbox[0]);
+                  delete that.allCheck[filter][item.oid];
+
+                  // 瀛愰泦鏄惁鍏ㄩ儴鍙栨秷閫変腑
+                  var allChildren = $(this).parent().siblings().find('.layui-tree-checked');
+                  var childrenLen = []
+                  if(allChildren.length == 0){
+                      $(this).parent().parent().prev().prev().removeClass("layui-tree-checked");
+                      $(this).parent().parent().prev().prev().html(that.icon.checkbox[0]);
+                      if(item.parentId != null){
+                          delete that.getAllData[item.parentId];
+                          if(that.cacheData[filter][item.parentId].parentId != null) {
+                              if( $(".check_"+that.cacheData[filter][item.parentId].parentId).parent().children('ul').children("li").children(".layui-tree-checked").length == 0) {
+                                $(this).parent().parent().parent().parent().prev().prev().removeClass("layui-tree-checked");
+                                $(this).parent().parent().parent().parent().prev().prev().html(that.icon.checkbox[0]);
+                                delete that.getAllData[that.cacheData[filter][item.parentId].parentId];
+                              }
+                          }
+                      }
+                  }
+
+                  if(item.children && item.children.length>0) {
+                      for(var i = 0;i<item.children.length;i++){
+                          if(item.children[i].children.length >0 ) {
+                              delete that.getAllData[item.children[i].oid];
+                              for(var j = 0;j<item.children[i].children.length;j++) {
+                                  delete that.getAllData[item.children[i].children[j].oid];
+                              }
+                          } else {
+                              delete that.getAllData[item.children[i].oid]
+                          }
+                      }
+                      delete that.getAllData[item.oid];
+                  } else {
+                      delete that.getAllData[item.oid];
+                  }
+
+
+              }else{//console.log( $(this).parent().siblings().find('.layui-tree-check'))
+                  $(this).next().next().find('.layui-tree-check').addClass("layui-tree-checked");
+                  $(this).next().next().find('.layui-tree-check').html(that.icon.checkbox[1]);
+
+                  /*瀛愯妭鐐瑰叏閫�  鐖惰妭鐐硅嚜鍔ㄩ�夋嫨*/
+                  var allChildren = $(this).parent().siblings().find('.layui-tree-check');
+                  var childrenLen = []
+                  for(var i = 0;i<allChildren.length;i++){
+                      if($(allChildren[i]).hasClass("layui-tree-checked")){
+                          childrenLen.push(allChildren[i])
+                      }
+                  }
+                  if(allChildren.length == childrenLen.length){
+                      $(this).parent().parent().prev().prev().addClass("layui-tree-checked");
+                      $(this).parent().parent().prev().prev().html(that.icon.checkbox[1]);
+                  }
+
+                  /*if( $(this).parent().siblings().find('.layui-tree-check').hasClass("layui-tree-checked")){
+
+                  }*/
+                  $(this).addClass("layui-tree-checked");
+                  $(this).html(that.icon.checkbox[1]);
+                  if(!that.allCheck[filter]) that.allCheck[filter] = {};
+                  that.allCheck[filter][item.oid] = item;
+
+
+                  if(item.children && item.children.length >0 ) {
+                      for(var i = 0;i<item.children.length;i++){
+                          if(item.children[i].children.length >0 ) {
+                              that.getAllData[item.children[i].oid] = item.children[i];
+                              for(var j = 0;j<item.children[i].children.length;j++) {
+                                  that.getAllData[item.children[i].children[j].oid] = item.children[i].children[j];
+                              }
+                          }else {
+                              that.getAllData[item.children[i].oid] = item.children[i];
+                          }
+                      }
+                      that.getAllData[item.oid] = item;
+                  } else {
+                      that.getAllData[item.oid] = item;
+                  }
+
+                  if(item.parentId != null){
+                      $(this).parent().parent().prev().prev().addClass("layui-tree-checked");
+                      $(this).parent().parent().prev().prev().html(that.icon.checkbox[1]);
+                      $(this).parent().parent().parent().parent().prev().prev().addClass("layui-tree-checked");
+                      $(this).parent().parent().parent().parent().prev().prev().html(that.icon.checkbox[1]);
+                      that.getAllData[item.parentId] = that.cacheData[filter][item.parentId];
+                      if(that.cacheData[filter][item.parentId].parentId != null) {
+                          that.getAllData[that.cacheData[filter][item.parentId].parentId] = that.cacheData[filter][that.cacheData[filter][item.parentId].parentId];
+                      }
+                  }
+              }
+          });
+      };
+
+      // 鍏ㄩ��
+      Tree.prototype.allSelect = function(filter) {
+          var that = this;
+          $(".layui-tree-check").addClass("layui-tree-checked").html(that.icon.checkbox[1]);
+          that.getAllData = JSON.parse(JSON.stringify(that.cacheData[filter]));
+      };
+
+      // 鍏ㄤ笉閫�
+      Tree.prototype.allUnSelect = function(filter) {
+          var that = this;
+          $(".layui-tree-check").removeClass("layui-tree-checked").html(that.icon.checkbox[0]);
+          that.getAllData = [];
+      };
+
+      // 鍙嶉��
+      Tree.prototype.reverseChecked = function(filter) {
+          var that = this;
+          that.getAllData = JSON.parse(JSON.stringify(that.cacheData[filter]));
+          $.each($("#"+filter+" .layui-tree-checked"),function(k,v) {
+              $(v).removeClass("layui-tree-checked").html(that.icon.checkbox[0]);
+              delete that.getAllData[$(v).attr("oid")];
+          });
+          $.each(that.getAllData,function(k,v){
+              $("#"+filter+" .check_"+k).addClass("layui-tree-checked").html(that.icon.checkbox[1]);
+              $("#"+filter+" .check_"+v.parentId).addClass("layui-tree-checked").html(that.icon.checkbox[1]);
+              if(v.parentId != null) {
+                  that.getAllData[v.parentId] = that.cacheData[filter][v.parentId];
+                  that.getAllData[that.cacheData[filter][v.parentId].parentId] = that.cacheData[filter][that.cacheData[filter][v.parentId].parentId];
+                  $("#"+filter+" .check_"+that.cacheData[filter][v.parentId].parentId).addClass("layui-tree-checked").html(that.icon.checkbox[1]);
+              }
+          })
+      };
+
+      /**
+       * 鏄惁鏈夊閫夋
+       * @param elem 鍏冪礌
+       * @returns {boolean} true==鏈夛紝false == 娌℃湁
+       */
+      Tree.prototype.isHasCheckbox = function(elem){
+          var that = this;
+          if(that.getElemCheckbox(elem)){
+              return true;
+          }else{
+              return false;
+          }
+      };
+
+      /**
+       * 鑾峰彇鑺傜偣鐨勫閫夋
+       * @param elem 鑺傜偣鍏冪礌
+       * @returns {*}
+       */
+      Tree.prototype.getElemCheckbox = function(elem){
+          return elem.children('.layui-tree-check');
+      };
+
+      /**
+       * 鑾峰彇鎵�鏈夌殑鍕鹃�変俊鎭�
+       * @returns {Array}
+       */
+      Tree.prototype.getAllCheckData=function(filter){
+          var that = this;
+          var allCheckData = [];
+          if(that.allCheck && that.allCheck[filter]){
+              var tempData = that.allCheck[filter];
+              for(var key in tempData){
+                  allCheckData.push(tempData[key]);
+              }
+          }
+          return allCheckData;
+      };
+
+      /**
+       * 娓呴櫎閫変腑鐨勫��
+       * @param filter
+       */
+      Tree.prototype.clearCheckData = function(filter){
+          var that = this;
+          if(that.allCheck && that.allCheck[filter]){
+              that.allCheck[filter] = {};
+          }
+      };
+
+      /**
+       * 鑾峰彇鏈�鍚庨�変腑鐨勫��
+       * @param filter
+       * @returns {*}
+       */
+      Tree.prototype.getSelectNode=function(filter){
+          var that = this;
+          return that.allSelectedData[filter];
+      };
+
+      /**
+       * 鏍戣妭鐐圭偣鍑�
+       * @param filter 杩囨护鍣�
+       * @param elem
+       * @param item
+       */
+    Tree.prototype.click = function(filter,elem,options){
+        var that = this, options = that.getOptions(filter);
+        var item = that.getDataByOid(filter,that.getOidByElem(filter,elem));
+        //灞曞紑绠ご鐐瑰嚮浜嬩欢
+        elem.children('i').on('click',function(e){
+            layui.stope(e);
+            //濡傛灉鏄�愮骇灞曞紑鐨勶紝鍦ㄨ繖閲屽氨闇�瑕佸睍寮�涓�涓�
+            var nodeI =  that.getNodeI($(this).parent());
+            if(options.loadType ==that.loadType.node && nodeI.hasClass("layui-tree-leaf")){
+                if(!options.noApi) {
+                  that.load(filter,$(this).parent(),item.oid,true,function(){
+                      if(elem.children('ul').children('li').length==0){
+                          elem.children('i').remove();
+                          return;
+                      }
+                  },item.attributes.btmName||item.attributes.btmname);//璇存槑杩樻病鍔犺浇瀛愯妭鐐�
+                }
+            }else{
+                that.switchNode(elem);
+            }
+            that.allSelectedData[filter] = item;
+            //澶嶉�夋鍗曞嚮鏄惁鑷姩閫夋嫨
+            if(options.autoCheckOnClick && that.isHasCheckbox(elem)){
+                that.getElemCheckbox(elem).click();
+            }
+            //add by weidy@2018-03-29,褰撳墠鐐瑰嚮鐨勮妭鐐圭殑html鍏冪礌鍜屾爲褰㈢殑鏁翠綋閰嶇疆涔熶紶閫�
+           // options.click(item,$(this),options);
+            return false;
+        });
+        elem.children('a').on('click', function(e){
+            layui.stope(e);
+            //缁欑偣鍑荤殑鑺傜偣涓婅壊
+            $("ul[layui-filter = '"+filter+"']").find("a").css({"background":""});
+            $(this).css({"background":"#ccc"});
+              //濡傛灉鏄�愮骇灞曞紑鐨勶紝鍦ㄨ繖閲屽氨闇�瑕佸睍寮�涓�涓�
+            //涔嬪墠杩欓噷琚敞閲婃帀锛屽厛鎴垮牚鐪嬬湅
+            if(!options.referSingleSelect || that.isHasCheckbox(elem)) {
+                var nodeI = that.getNodeI($(this).parent());
+                if (options.loadType == that.loadType.node && nodeI.hasClass("layui-tree-leaf")) {
+                  if(!options.noApi) {
+                      that.load(filter, $(this).parent(), item.oid, true,function(){
+                          if(elem.children('ul').children('li').length==0){
+                              elem.children('i').remove();
+                              return;
+                          }
+                      },item.attributes.btmName||item.attributes.btmname);//璇存槑杩樻病鍔犺浇瀛愯妭鐐�
+                  }
+                } else {
+                    that.switchNode(elem);
+                }
+            }
+              that.allSelectedData[filter] = item;
+              //澶嶉�夋鍗曞嚮鏄惁鑷姩閫夋嫨
+              if(options.autoCheckOnClick && that.isHasCheckbox(elem)){
+                  that.getElemCheckbox(elem).click();
+              }
+              //add by weidy@2018-03-29,褰撳墠鐐瑰嚮鐨勮妭鐐圭殑html鍏冪礌鍜屾爲褰㈢殑鏁翠綋閰嶇疆涔熶紶閫�
+              options.click(item,$(this),options,e);
+              return false;
+        });
+    };
+
+      /***
+       * 鑾峰彇鑺傜偣鐨処鍏冪礌
+       * @param elem 鑺傜偣鍏冪礌
+       * @returns {*}
+       */
+      Tree.prototype.getNodeI = function(elem){
+          var tempEl = elem.children("a").children("i");
+          return tempEl;
+      };
+
+      /**
+       * 鑾峰彇鑺傜偣鍏冪礌鐨勪富閿�
+       * @param filter 杩囨护鍣�
+       * @param elem 鍏冪礌
+       * @returns {*}
+       */
+      Tree.prototype.getOidByElem =function(filter,elem){
+          var that = this;
+          if(elem){
+              try{
+                 return  elem.children("a").first().children("cite").attr("oid");
+              }catch(e){
+                  layui.util.showDebugMsg(e);
+              }
+          }
+          return false;
+      };
+
+      /**
+       * 鏍规嵁涓婚敭锛屾垨鑰呮暟鎹璞℃潵鑾峰彇鑺傜偣鍏冪礌
+       * @param filter 杩囨护鍣�
+       * @param item 涓婚敭鎴栬�呮暟鎹璞★紝鏁版嵁瀵硅薄閲屽繀椤绘湁oid灞炴��
+       * @returns {*}
+       */
+      Tree.prototype.getElemByItem = function(filter,item){
+           //鏍规嵁鏁版嵁鏉ヨ幏鍙杄lem鍏冪礌
+          var that = this;
+          var elem = [];
+          if(!$webUtil.isArray(item)){
+              item = [item];
+          }
+          layui.each(item,function(_index,record){
+              var oid = record;
+              if((record instanceof Object) && "oid" in record ){
+                  oid = record.oid;
+              }
+              var city = that.getRootElem(filter).find("cite[oid='" + oid + "']");
+              if(city){
+                  elem.push(city.parent().parent());
+              }
+          });
+          if(elem.length == 1){
+              return elem[0];
+          }else{
+              return elem;
+          }
+      };
+
+      /***
+       * 浼稿睍鑺傜偣
+       * @param elem
+       * @param item
+       */
+    Tree.prototype.spread = function(filter,elem){
+        var that = this, options = that.getOptions(filter);
+        var item = that.getDataByOid(filter,that.getOidByElem(filter,elem));
+        var arrow = elem.children('.layui-tree-spread');
+        var ul = elem.children('ul'), a = elem.children('a');
+
+      //鎵ц浼稿睍
+        var open = function(){
+            if(elem.data('spread')){
+               that.expand(elem);
+            } else {
+               that.collapse(elem);
+            }
+        };
+
+      //濡傛灉娌℃湁瀛愯妭鐐癸紝鍒欎笉鎵ц
+       if(!ul[0]) {
+           return;
+       }
+
+        arrow.on('click', open);
+        a.on('dblclick', open);
+    };
+
+      /**
+       * 鏀剁缉鍜屽睍寮�鍒囨崲
+       * @param elem 鑺傜偣鍏冪礌
+       */
+    Tree.prototype.switchNode = function(elem){
+      //鍒囨崲鎶樺彔鎴栬�呮敹缂�
+          var that = this;
+          if(elem.data('spread')){//璇存槑鏄睍寮�鐨�
+               that.collapse(elem);
+          }else{
+               that.expand(elem);
+          }
+    };
+
+      /**
+       * 鏀剁缉鍜屽睍寮�鍒囨崲
+       * @param item oid鎴栬�呮暟鎹璞★紝鎴栬�呮暟鎹璞℃暟缁�
+       */
+    Tree.prototype.switchNodeByItem = function(item){//浣跨敤item鏉ユ帶鍒跺睍寮�鍜屾敹缂�
+         var that = this;
+         var elem = that.getElemByItem(item);
+         if(!$webUtil.isArray(elem)){
+             elem = [elem];
+         }
+         layui.each(elem,function(_index,record){
+             if(record.data('spread')){//灞曞紑鐨�
+                 that.expand(record);
+             }else{
+                 that.collapse(record);
+             }
+         });
+    };
+
+      /**
+       * 鎶樺彔鍏冪礌
+       * @param elem 鍏冪礌
+       */
+    Tree.prototype.collapse = function(elem){//鎶樺彔鍏冪礌
+          var that = this;
+          var arrow = elem.children(".layui-tree-spread");
+          var ul = elem.children('ul'),a = elem.children('a');
+          elem.data('spread',null);
+          ul.removeClass('layui-show');
+          arrow.html(that.icon.arrow[0]);
+         // a.find('.layui-icon').html(that.icon.branch[0]);
+    };
+
+      /**
+       * 灞曞紑鍏冪礌
+       * @param elem
+       */
+    Tree.prototype.expand = function(elem){//鏀剁缉鍏冪礌
+        var that = this;
+        var arrow = elem.children(".layui-tree-spread");
+        var ul = elem.children('ul'),a = elem.children('a');
+        elem.data('spread', true);
+        ul.addClass('layui-show');
+        arrow.html(that.icon.arrow[1]);
+       // a.find('.layui-icon').html(that.icon.branch[1]);
+    };
+
+    //閫氱敤浜嬩欢
+    Tree.prototype.on = function(filter,elem){
+      var that = this, options = that.getOptions(filter);
+      var dragStr = 'layui-tree-drag';
+
+      //灞忚斀閫変腑鏂囧瓧
+      elem.find('i').on('selectstart', function(e){
+        return false
+      });
+
+      //鎷栨嫿
+      if(options.drag){
+        $(document).on('mousemove', function(e){
+          var move = that.move;
+          if(move.from){
+            var to = move.to, treeMove = $('<div class="layui-box '+ dragStr +'"></div>');
+            e.preventDefault();
+            $('.' + dragStr)[0] || $('body').append(treeMove);
+            var dragElem = $('.' + dragStr)[0] ? $('.' + dragStr) : treeMove;
+            (dragElem).addClass('layui-show').html(move.from.elem.children('a').html());
+            dragElem.css({
+              left: e.pageX + 10
+              ,top: e.pageY + 10
+            })
+          }
+        }).on('mouseup', function(){
+          var move = that.move;
+          if(move.from){
+            move.from.elem.children('a').removeClass(enterSkin);
+            move.to && move.to.elem.children('a').removeClass(enterSkin);
+            that.move = {};
+            $('.' + dragStr).remove();
+          }
+        });
+      }
+    };
+
+    //鎷栨嫿鑺傜偣
+    Tree.prototype.move = {};
+    Tree.prototype.drag = function(filter,elem){
+      var that = this, options = that.getOptions(filter);
+      var a = elem.children('a'), mouseenter = function(){
+        var othis = $(this), move = that.move;
+        if(move.from){
+          move.to = {
+            item: item
+            ,elem: elem
+          };
+          othis.addClass(enterSkin);
+        }
+      };
+      a.on('mousedown', function(){
+        var move = that.move
+        move.from = {
+          item: item
+          ,elem: elem
+        };
+      });
+      a.on('mouseenter', mouseenter).on('mousemove', mouseenter)
+      .on('mouseleave', function(){
+        var othis = $(this), move = that.move;
+        if(move.from){
+          delete move.to;
+          othis.removeClass(enterSkin);
+        }
+      });
+    };
+
+      /***
+       * 閿�姣�
+       * @param filter
+       */
+      Tree.prototype.destory = function(filter){
+          var that = this;
+          var rootEl = that.getRootElem(filter);
+          that.clearCheckData(filter);
+          rootEl.remove();
+          if(that.allSelectedData && that.allSelectedData[filter])  delete that.allSelectedData[filter];
+          if(that.cacheData && that.cacheData[filter]) delete that.cacheData[filter];
+          if(that.config && that.config[filter]) delete  that.config[filter];
+      };
+      Tree.prototype.syncLayuiTreeFilter = function (treeId,treeElem,callback) {
+          treeElem.prepend('<input style="margin: 5px 0" class="layui-btn layui-btn-sm layui-btn-primary" type="text" name="fast_search_select_value" lay-verify="fast_search_select_value" placeholder="璇疯緭鍏ュ唴瀹规寜鍥炶溅鏌ヨ"/>');
+          var filterElem = treeElem.find("input[name='fast_search_select_value']");
+          if (!filterElem.length || !filterElem.length) {
+              return;
+          }
+          filterElem.keydown(function (event) {
+              if (event && event.keyCode == 13) {
+                  var that = this;
+                  var value = $(that).val().trim();
+                  var HIDE = 'layui-hide';
+                  var hintClass = 'search_hit';
+                  // 鍏堟仮澶嶇幇鍦�
+                  treeElem.find('.' + HIDE).removeClass(HIDE);
+                  treeElem.find('.layui-tree-checked').click();
+                  treeElem.find('.' + hintClass).removeClass(hintClass).each(function (index, item) {
+                      item = $(item);
+                      item.html(item.data('textOld')).data('textOld', null);
+                  });
+                  // 濡傛灉鏈夊�肩瓫閫夊紑濮�
+                  if (value) {
+                      layui.each(treeElem.find('cite'), function (index, elem) {
+                          elem = $(elem);
+                          var textTemp = elem.text();
+                          if (textTemp.indexOf(value) === -1) {
+                              // 涓嶅瓨鍦ㄥ氨闅愯棌
+                              elem.closest('li').addClass(HIDE);
+                          } else {
+                              // 鍛戒腑灏辨坊鍔犱竴涓猚lass
+                              elem.addClass(hintClass)
+                                  .data('textOld', textTemp)
+                                  .html(textTemp.replace(new RegExp(value, 'g'), '<span class="search_hint_text">' + value + '</span>'));
+                              if (textTemp == value) {
+                                  elem.closest("a").prev().click();
+                              }
+
+                          }
+                      });
+                      layui.each(treeElem.find('.' + hintClass), function (index, elem) {
+                          elem = $(elem);
+                          elem.parents('li').removeClass(HIDE);
+                          elem.parents('ul').each(function (i, item) {
+                              if (!$(item).hasClass('layui-show')) {
+                                  $(item).parent('li').find('>i').click();
+                              }
+                          });
+                          elem.parents('ul').parent('li').removeClass(HIDE);
+
+                          if (elem.prev("i").hasClass("layui-tree-branch")) {
+                              elem.parent("a").next("ul").find("li").removeClass(HIDE)
+                          }
+                      });
+                  }
+                  typeof callback === 'function' && callback.call(that, treeElem, filterElem, treeElem.find('.' + hintClass).length);
+                  return false;
+              }
+              layui.stope(event);
+          });
+      };
+
+    //鏆撮湶鎺ュ彛---weidy淇敼涓虹粺涓�鐨勯鏍�
+      var tree = new Tree();
+      exports('tree',tree);
+  });
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/treeGrid.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/treeGrid.js
new file mode 100644
index 0000000..95c6bd6
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/treeGrid.js
@@ -0,0 +1,21 @@
+/**
+
+ @Name锛歵reeGrid鏍戠姸琛ㄦ牸
+ @Author锛歭rd
+ */
+layui.extend({
+    //
+}).define(['laytpl', 'laypage','dltable', 'layer', 'form'], function(exports){
+    "use strict";
+    var $ = layui.jquery;
+    var layer = layui.layer;
+    var dltable = layui.dltable;
+    var MOD_NAME='treeGrid';
+    var treeGrid=$.extend({},dltable);
+    treeGrid._render=treeGrid.render;
+    treeGrid.render=function(param){//閲嶅啓娓叉煋鏂规硶
+        param.isTree=true;//鏄爲琛ㄦ牸
+        treeGrid._render(param);
+    };
+    exports(MOD_NAME, treeGrid);
+});
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/upload.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/upload.js
new file mode 100644
index 0000000..9247f3f
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/upload.js
@@ -0,0 +1,616 @@
+/**
+
+ @Title: layui.upload 鏂囦欢涓婁紶
+ @Author: 璐ゅ績
+ @License锛歁IT
+
+ */
+ 
+layui.define('layer' , function(exports){
+  "use strict";
+  
+  var $ = layui.$
+  ,layer = layui.layer
+  ,hint = layui.hint()
+  ,device = layui.device()
+
+  //澶栭儴鎺ュ彛
+  ,upload = {
+    config: {} //鍏ㄥ眬閰嶇疆椤�
+
+    //璁剧疆鍏ㄥ眬椤�
+    ,set: function(options){
+      var that = this;
+      that.config = $.extend({}, that.config, options);
+      return that;
+    }
+    
+    //浜嬩欢鐩戝惉
+    ,on: function(events, callback){
+      return layui.onevent.call(this, MOD_NAME, events, callback);
+    }
+  }
+  
+  //鎿嶄綔褰撳墠瀹炰緥
+  ,thisUpload = function(){
+    var that = this;
+    return {
+      upload: function(files){
+        that.upload.call(that, files);
+      }
+      ,config: that.config
+    }
+  }
+  
+  //瀛楃甯搁噺
+  ,MOD_NAME = 'upload', ELEM = '.layui-upload', THIS = 'layui-this', SHOW = 'layui-show', HIDE = 'layui-hide', DISABLED = 'layui-disabled'
+  
+  ,ELEM_FILE = 'layui-upload-file', ELEM_FORM = 'layui-upload-form', ELEM_IFRAME = 'layui-upload-iframe', ELEM_CHOOSE = 'layui-upload-choose', ELEM_DRAG = 'layui-upload-drag'
+  
+  
+  //鏋勯�犲櫒
+  ,Class = function(options){
+    var that = this;
+    that.config = $.extend({}, that.config, upload.config, options);
+    that.render();
+  };
+  
+  //榛樿閰嶇疆
+  Class.prototype.config = {
+    accept: 'images' //鍏佽涓婁紶鐨勬枃浠剁被鍨嬶細images/file/video/audio
+    ,exts: '' //鍏佽涓婁紶鐨勬枃浠跺悗缂�鍚�
+    ,auto: true //鏄惁閫夊畬鏂囦欢鍚庤嚜鍔ㄤ笂浼�
+    ,bindAction: '' //鎵嬪姩涓婁紶瑙﹀彂鐨勫厓绱�
+    ,url: '' //涓婁紶鍦板潃
+    ,field: 'file' //鏂囦欢瀛楁鍚�
+    ,method: 'post' //璇锋眰涓婁紶鐨刪ttp绫诲瀷
+    ,data: {} //璇锋眰涓婁紶鐨勯澶栧弬鏁�
+    ,drag: true //鏄惁鍏佽鎷栨嫿涓婁紶
+    ,size: 0 //鏂囦欢闄愬埗澶у皬锛岄粯璁や笉闄愬埗
+    ,number: 0 //鍏佽鍚屾椂涓婁紶鐨勬枃浠舵暟锛岄粯璁や笉闄愬埗
+    ,multiple: false //鏄惁鍏佽澶氭枃浠朵笂浼狅紝涓嶆敮鎸乮e8-9
+  };
+  
+  Class.prototype.setData = function(data){
+	var that = this;  
+	that.config.data = data;
+  };
+  
+  //鍒濆娓叉煋
+  Class.prototype.render = function(options){
+    var that = this
+    ,options = that.config;
+
+    options.elem = $(options.elem);
+    options.bindAction = $(options.bindAction);
+
+    that.file();
+    that.events();
+  };
+  
+  //杩藉姞鏂囦欢鍩�
+  Class.prototype.file = function(){
+    var that = this
+    ,options = that.config
+    ,elemFile = that.elemFile = $([
+      '<input class="'+ ELEM_FILE +'" type="file" name="'+ options.field +'"'
+      ,(options.multiple ? ' multiple' : '') 
+      ,'>'
+    ].join(''))
+    ,next = options.elem.next();
+    
+    if(next.hasClass(ELEM_FILE) || next.hasClass(ELEM_FORM)){
+      next.remove();
+    }
+    
+    //鍖呰9ie8/9瀹瑰櫒
+    if(device.ie && device.ie < 10){
+      that.elemFiles={};
+      options.elem.wrap('<div class="layui-upload-wrap"></div>');
+    }
+    
+    that.isFile() ? (
+      that.elemFile = options.elem
+      ,options.field = options.elem[0].name
+    ) : options.elem.after(elemFile);
+    
+    //鍒濆鍖杋e8/9鐨凢orm鍩�
+    if(device.ie && device.ie < 10){
+      that.initIE();
+    }
+  };
+  
+  //ie8-9鍒濆鍖�
+  Class.prototype.initIE = function(){
+    var that = this
+    ,options = that.config
+    ,iframe = $('<iframe id="'+ ELEM_IFRAME +'" class="'+ ELEM_IFRAME +'" name="'+ ELEM_IFRAME +'" frameborder="0"></iframe>')
+    ,elemForm = $(['<form target="'+ ELEM_IFRAME +'" class="'+ ELEM_FORM +'" method="'+ options.method
+      ,'" key="set-mine" enctype="multipart/form-data" action="'+ options.url +'" _charset="utf-8">'
+    ,'</form>'].join(''));
+    
+    //鎻掑叆iframe    
+    $('#'+ ELEM_IFRAME)[0] || $('body').append(iframe);
+
+    //鍖呰9鏂囦欢鍩�
+    if(!options.elem.next().hasClass(ELEM_IFRAME)){
+      that.elemFile.wrap(elemForm);      
+      
+      //杩藉姞棰濆鐨勫弬鏁�
+      options.elem.next('.'+ ELEM_IFRAME).append(function(){
+        var arr = [];
+        layui.each(options.data, function(key, value){
+          arr.push('<input type="hidden" name="'+ key +'" value="'+ value +'">')
+        });
+        //娣诲姞token鐨勫��
+        arr.push('<input type="hidden" name="' + TOKEN_KEY + '" value="' +  $webUtil.getToken() + '"/>');
+        return arr.join('');
+      }());
+    }
+  };
+  
+  //寮傚父鎻愮ず
+  Class.prototype.msg = function(content){
+    return layer.msg(content, {
+      icon: 2
+      ,shift: 6
+    });
+  };
+  
+  //鍒ゆ柇缁戝畾鍏冪礌鏄惁涓烘枃浠跺煙鏈韩
+  Class.prototype.isFile = function(){
+    var elem = this.config.elem[0];
+    if(!elem) return;
+    return elem.tagName.toLocaleLowerCase() === 'input' && elem.type === 'file'
+  }
+  
+  //棰勮鍥剧墖淇℃伅
+  Class.prototype.preview = function(callback){
+    var that = this;
+    if(window.FileReader){
+      layui.each(that.chooseFiles, function(index, file){
+        var reader = new FileReader();
+        reader.readAsDataURL(file);  
+        reader.onload = function(){
+          callback && callback(index, file, this.result);
+        }
+      });
+    }else{
+      layui.each(that.chooseFiles, function(index, file){
+        file.name=file[0];
+        //file.size=0;
+        callback && callback(index, file, null);
+      });
+    }
+  };
+  
+  //鎵ц涓婁紶
+  Class.prototype.upload = function(files, type){
+    var that = this
+    ,options = that.config
+    ,elemFile = that.elemFile[0];
+
+    var successful = 0, aborted = 0
+
+    //楂樼骇娴忚鍣ㄥ鐞嗘柟寮忥紝鏀寔璺ㄥ煙
+    ,ajaxSend = function(){
+      var items = files || that.files || that.chooseFiles || elemFile.files
+      layui.each(items, function(index, file){
+        var formData = new FormData();
+        
+        formData.append(options.field, file);
+        //杩藉姞棰濆鐨勫弬鏁�
+        layui.each(options.data, function(key, value){
+          formData.append(key, value);
+        });
+        var header = {};
+        header[TOKEN_KEY] =$webUtil.getToken();
+        //鎻愪氦鏂囦欢
+        $.ajax({
+          url: options.url
+          ,type: options.method
+          ,data: formData
+          ,headers:header
+          ,contentType: false 
+          ,processData: false
+          ,dataType: 'json'
+          ,success: function(res){
+            successful++;
+            done(index, res);
+            allDone();
+          },
+          // ,xhrFields: {
+	  		// 	withCredentials: true
+	  		// },
+	  		// crossDomain: true == !(document.all),
+	  	   error: function(){
+            aborted++;
+            that.msg('璇锋眰涓婁紶鎺ュ彛鍑虹幇寮傚父');
+            error(index,'璇锋眰涓婁紶鎺ュ彛鍑虹幇寮傚父');
+            allDone();
+          }
+        });
+      });
+    }
+    
+    //浣庣増鏈琁E澶勭悊鏂瑰紡锛屼笉鏀寔璺ㄥ煙
+    ,iframeSend = function() {
+      if(that.fileLength<1){
+        return;
+      }
+          //weidy@2018-12-17.瑙e喅IE8鍜孖E9涓婃病鏈夊弬鏁扮殑闂
+          //杩藉姞棰濆鐨勫弬鏁�
+          if (options.data) {
+            var arr = [];
+            layui.each(options.data, function (key, value) {
+              arr.push('<input type="hidden" name="' + key + '" value="' + value + '">')
+            });
+            arr.push('<input type="hidden" name="' + TOKEN_KEY + '" value="' + $webUtil.getToken() + '"/>');
+          }
+
+          var iframe = $('#' + ELEM_IFRAME);
+          var form = that.elemFile.parent();
+          //form.html('').append(arr.join('')).append(file).appendTo('body');
+          var oldEleFile=that.elemFile.clone(true);
+          that.elemFile.remove();
+          form.append(arr.join(''));
+          var formSubmit=function (index){
+            $(':file',form).attr('name',function (){
+              return $(this).attr('id')
+            })
+            that.elemFile=$(':file',form).eq(index);
+            that.elemFile[0].name=that.config.field;
+            elemFile = that.elemFile[0];
+            /*if(index>0){
+              var newIframe=iframe.clone(true);
+              newIframe.attr('id',ELEM_IFRAME+'_'+index).attr('name',ELEM_IFRAME+'_'+index).appendTo(iframe.parent());
+              form[0].target=ELEM_IFRAME+'_'+index;
+            }*/
+            form.submit();
+            //鑾峰彇鍝嶅簲淇℃伅
+            clearInterval(Class.timer);
+            Class.timer = setInterval(function () {
+              var res = '', iframeBody;
+              try {
+                iframeBody = iframe.contents().find('body');
+                res = iframeBody.text();
+              } catch (e) {
+                that.msg('鑾峰彇涓婁紶鍚庣殑鍝嶅簲淇℃伅鍑虹幇寮傚父');
+                clearInterval(Class.timer);
+                aborted++;
+                if(aborted+successful<that.fileLength){
+                  index++;
+                  formSubmit(index)
+                }else{
+                  oldEleFile.appendTo(form);
+                  that.elemFile = oldEleFile
+                  allDone();
+                }
+                error(0, '鑾峰彇涓婁紶鍚庣殑鍝嶅簲淇℃伅鍑虹幇寮傚父');
+                return;
+              }
+              if (res) {
+                clearInterval(Class.timer);
+                iframeBody.html('');
+                successful ++;
+                if(aborted+successful<that.fileLength){
+                  index++;
+                  formSubmit(index)
+                }else {
+                  oldEleFile.appendTo(form);
+                  that.elemFile = oldEleFile
+                  allDone();
+                }
+
+                done(0, res);
+
+              }
+            }, 30);
+          }
+          formSubmit(0)
+
+        }
+    
+    //缁熶竴鍥炶皟
+    ,done = function(index, res){
+      that.elemFile.next('.'+ ELEM_CHOOSE).remove();
+      elemFile.value = '';
+      if(typeof res !== 'object'){
+        try {
+          res = JSON.parse(res);
+        } catch(e){
+          that.msg(res)
+          res = {};
+          return that.msg('璇峰涓婁紶鎺ュ彛杩斿洖鏈夋晥JSON');
+        }
+      }
+      typeof options.done === 'function' && options.done(res, index || 0, function(files){
+        that.upload(files);
+      });
+    },
+        //澶氭枃浠跺叏閮ㄤ笂浼犲畬姣曠殑鍥炶皟
+    allDone = function(){
+      if(options.multiple && successful + aborted === that.fileLength){
+        typeof options.allDone === 'function' && options.allDone({
+          total: that.fileLength
+          ,successful: successful
+          ,aborted: aborted
+        });
+      }
+    }
+    //缁熶竴缃戠粶寮傚父鍥炶皟
+    ,error = function(index,msg){
+      if(options.auto){
+        elemFile.value = '';
+      }
+      typeof options.error === 'function' && options.error(index || 0, function(files){
+        that.upload(files);
+      },msg);
+    }
+    
+    ,exts = options.exts
+    ,check ,value = function(){
+      var arr = [];
+      layui.each(files || that.chooseFiles, function(i, item){
+        arr.push(item.name||item[0]||item.input);
+      });
+      return arr;
+    }()
+    
+    //鍥炶皟杩斿洖鐨勫弬鏁�
+    ,args = {
+          preview: function (callback) {
+            that.preview(callback);
+          }
+          , upload: function (index, file) {
+            var thisFile = {};
+            thisFile[index] = file;
+            that.upload(thisFile);
+          }
+          , pushFile: function () {
+            that.files = that.files || {};
+            layui.each(that.chooseFiles, function (index, item) {
+              that.files[index] = item;
+            });
+            return that.files;
+          },
+          getElemFiles: function () {
+            if(device.ie && device.ie < 10) {
+              return that.elemFiles;
+            }else{
+              return {}
+            }
+          },
+          setData: function (data) {
+            that.config.data = data;
+          },
+          setUrl: function (url) {
+            that.config.url = url;
+          }
+        }
+    
+    //鎻愪氦涓婁紶
+    ,send = function() {
+          if (type === 'choose') {
+            return options.choose && options.choose(args);
+          }
+
+          var boforeR = true;
+          //涓婁紶鍓嶇殑鍥炶皟
+          options.before && (boforeR = options.before(args));
+
+          if (boforeR != false) {
+            //IE鍏煎澶勭悊
+            if (device.ie) {
+              return device.ie > 9 ? ajaxSend() : iframeSend();
+            } else {
+              ajaxSend()
+            }
+          }
+        }
+
+    //鏍¢獙鏂囦欢鏍煎紡
+    value = value.length === 0 
+      ? ((elemFile.value.match(/[^\/\\]+\..+/g)||[]) || '')
+    : value;
+    
+    if(value.length === 0) return;
+
+    switch(options.accept){
+      case 'file': //涓�鑸枃浠�
+        if(exts && !RegExp('\\w\\.('+ exts +')$', 'i').test(escape(value))){
+          that.msg('閫夋嫨鐨勬枃浠朵腑鍖呭惈涓嶆敮鎸佺殑鏍煎紡,鏀寔鐨勬牸寮忎负' + exts);
+          return elemFile.value = '';
+        }
+      break;
+      case 'video': //瑙嗛鏂囦欢
+        if(!RegExp('\\w\\.('+ (exts || 'avi|mp4|wma|rmvb|rm|flash|3gp|flv') +')$', 'i').test(escape(value))){
+          that.msg('閫夋嫨鐨勮棰戜腑鍖呭惈涓嶆敮鎸佺殑鏍煎紡');
+          return elemFile.value = '';
+        }
+      break;
+      case 'audio': //闊抽鏂囦欢
+        if(!RegExp('\\w\\.('+ (exts || 'mp3|wav|mid') +')$', 'i').test(escape(value))){
+          that.msg('閫夋嫨鐨勯煶棰戜腑鍖呭惈涓嶆敮鎸佺殑鏍煎紡');
+          return elemFile.value = '';
+        }
+      break;
+      default: //鍥剧墖鏂囦欢
+        layui.each(value, function(i, item){
+          if(!RegExp('\\w\\.('+ (exts || 'jpg|png|gif|bmp|jpeg$') +')', 'i').test(escape(item))){
+            check = true;
+          }
+        });
+        if(check){
+          that.msg('閫夋嫨鐨勫浘鐗囦腑鍖呭惈涓嶆敮鎸佺殑鏍煎紡');
+          return elemFile.value = '';
+        }
+      break;
+    }
+    
+    //妫�楠屾枃浠舵暟閲�
+    that.fileLength = function(){
+      var length = 0
+      ,items = files || that.files || that.chooseFiles || elemFile.files;
+      layui.each(items, function(){
+        length++;
+      });
+      return length;
+    }();
+    if(options.number && that.fileLength > options.number){
+      return that.msg('鍚屾椂鏈�澶氬彧鑳戒笂浼犵殑鏁伴噺涓猴細'+ options.number);
+    }
+    
+    //妫�楠屾枃浠跺ぇ灏�
+    if(options.size > 0 && !(device.ie && device.ie < 10)){
+      var limitSize;
+      
+      layui.each(that.chooseFiles, function(index, file){
+        if(file.size > 1024*options.size){
+          var size = options.size/1024;
+          size = size >= 1 
+            ? (Math.floor(size) + (size%1 > 0 ? size.toFixed(1) : 0)) + 'MB' 
+          : options.size + 'KB'
+          elemFile.value = '';
+          limitSize = size;
+          
+        }
+      });
+      if(limitSize) return that.msg('鏂囦欢涓嶈兘瓒呰繃'+ limitSize);
+    }
+    send();
+  };
+  
+  //浜嬩欢澶勭悊
+  Class.prototype.events = function(){
+    var that = this
+    ,options = that.config
+    
+    //璁剧疆褰撳墠閫夋嫨鐨勬枃浠堕槦鍒�
+    ,setChooseFile = function(files) {
+          that.chooseFiles = {};
+          if (device.ie && device.ie < 10) {
+            var time = new Date().getTime();
+            that.chooseFiles[time + '-0'] = (that.elemFile[0].value.match(/[^\/\\]+\..+/g) || []) || '';
+            var newEleFile = that.elemFile.clone(true);
+            that.elemFile.attr('id', that.config.field+'-' + time + '-0').attr('name', that.config.field+'-' + time + '-0')
+            that.elemFiles[time + '-0'] = that.elemFile;
+            newEleFile.appendTo(that.elemFile.parent());
+            that.elemFile.hide();
+            that.elemFile = newEleFile;
+          } else {
+            layui.each(files, function (i, item) {
+              var time = new Date().getTime();
+              that.chooseFiles[time + '-' + i] = item;
+            })
+          }
+        }
+    
+    //璁剧疆閫夋嫨鐨勬枃鏈�
+    ,setChooseText = function(files, filename){
+      var elemFile = that.elemFile
+      ,value = files.length > 1 
+        ? files.length + '涓枃浠�' 
+      : ((files[0] || {}).name || (elemFile[0].value.match(/[^\/\\]+\..+/g)||[]) || '');
+      
+      if(elemFile.next().hasClass(ELEM_CHOOSE)){
+        elemFile.next().remove();
+      }
+      that.upload(null, 'choose');
+      if(that.isFile() /*|| options.choose*/)return;
+      elemFile.after('<span class="layui-inline '+ ELEM_CHOOSE +'">'+ value +'</span>');
+    };
+
+    //鐐瑰嚮涓婁紶瀹瑰櫒
+    options.elem.off('upload.start').on('upload.start', function(){
+      var othis = $(this), data = othis.attr('lay-data');
+      
+      if(data){
+        try{
+          data = new Function('return '+ data)();
+          that.config = $.extend({}, options, data);
+        } catch(e){
+          hint.error('Upload element property lay-data configuration item has a syntax error: ' + data)
+        }
+      }
+      
+      that.config.item = othis;
+      that.elemFile[0].click();
+    });
+    
+    //鎷栨嫿涓婁紶
+    if(!(device.ie && device.ie < 10)){
+      options.elem.off('upload.over').on('upload.over', function(){
+        var othis = $(this)
+        othis.attr('lay-over', '');
+      })
+      .off('upload.leave').on('upload.leave', function(){
+        var othis = $(this)
+        othis.removeAttr('lay-over');
+      })
+      .off('upload.drop').on('upload.drop', function(e, param){
+        var othis = $(this), files = param.originalEvent.dataTransfer.files || [];
+        
+        othis.removeAttr('lay-over');
+        setChooseFile(files);
+        
+        if(options.auto){
+          that.upload(files);
+        } else {
+          setChooseText(files);
+        }
+      });
+    }
+    
+    //鏂囦欢閫夋嫨
+    that.elemFile.off('upload.change').on('upload.change', function(){
+      var files = this.files || [];
+      setChooseFile(files);
+      options.auto ? that.upload() : setChooseText(files); //鏄惁鑷姩瑙﹀彂涓婁紶
+    });
+    
+    //鎵嬪姩瑙﹀彂涓婁紶
+    options.bindAction.off('upload.action').on('upload.action', function(){
+      that.upload();
+    });
+    
+    //闃叉浜嬩欢閲嶅缁戝畾
+    if(options.elem.data('haveEvents')) return;
+    
+    that.elemFile.on('change', function(){
+      $(this).trigger('upload.change');
+    });
+    
+    options.elem.on('click', function(){
+      if(that.isFile()) return;
+      $(this).trigger('upload.start');
+    });
+    
+    if(options.drag){
+      options.elem.on('dragover', function(e){
+        e.preventDefault();
+        $(this).trigger('upload.over');
+      }).on('dragleave', function(e){
+        $(this).trigger('upload.leave');
+      }).on('drop', function(e){
+        e.preventDefault();
+        $(this).trigger('upload.drop', e);
+      });
+    }
+    
+    options.bindAction.on('click', function(){
+      $(this).trigger('upload.action');
+    });
+    
+    options.elem.data('haveEvents', true);
+  };
+  
+  //鏍稿績鍏ュ彛  
+  upload.render = function(options){
+    var inst = new Class(options);
+    return thisUpload.call(inst);
+  };
+  
+  exports(MOD_NAME, upload);
+});
+
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/util.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/util.js
new file mode 100644
index 0000000..534c5d9
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/modules/util.js
@@ -0,0 +1,216 @@
+/**
+
+ @Name锛歭ayui.util 宸ュ叿闆�
+ @Author锛氳搐蹇�
+ @License锛歁IT
+    
+*/
+
+layui.define('jquery', function(exports){
+  "use strict";
+  
+  var $ = layui.$
+  
+  //澶栭儴鎺ュ彛
+  ,util = {
+    //鍥哄畾鍧�
+    fixbar: function(options){
+      var ELEM = 'layui-fixbar', TOP_BAR = 'layui-fixbar-top'
+      ,dom = $(document), body = $('body')
+      ,is, timer;
+
+      options = $.extend({
+        showHeight: 200 //鍑虹幇TOP鐨勬粴鍔ㄦ潯楂樺害涓寸晫鍊�
+      }, options);
+      
+      options.bar1 = options.bar1 === true ? '&#xe606;' : options.bar1;
+      options.bar2 = options.bar2 === true ? '&#xe607;' : options.bar2;
+      options.bgcolor = options.bgcolor ? ('background-color:' + options.bgcolor) : '';
+      
+      var icon = [options.bar1, options.bar2, '&#xe604;'] //鍥炬爣锛氫俊鎭�侀棶鍙枫�乀OP
+      ,elem = $(['<ul class="'+ ELEM +'">'
+        ,options.bar1 ? '<li class="layui-icon" lay-type="bar1" style="'+ options.bgcolor +'">'+ icon[0] +'</li>' : ''
+        ,options.bar2 ? '<li class="layui-icon" lay-type="bar2" style="'+ options.bgcolor +'">'+ icon[1] +'</li>' : ''
+        ,'<li class="layui-icon '+ TOP_BAR +'" lay-type="top" style="'+ options.bgcolor +'">'+ icon[2] +'</li>'
+      ,'</ul>'].join(''))
+      ,topBar = elem.find('.'+TOP_BAR)
+      ,scroll = function(){
+        var stop = dom.scrollTop();
+        if(stop >= (options.showHeight)){
+          is || (topBar.show(), is = 1);
+        } else {
+          is && (topBar.hide(), is = 0);
+        }
+      };
+      if($('.'+ ELEM)[0]) return;
+      
+      typeof options.css === 'object' && elem.css(options.css);
+      body.append(elem), scroll();
+      
+      //bar鐐瑰嚮浜嬩欢
+      elem.find('li').on('click', function(){
+        var othis = $(this), type = othis.attr('lay-type');
+        if(type === 'top'){
+          $('html,body').animate({
+            scrollTop : 0
+          }, 200);
+        }
+        options.click && options.click.call(this, type);
+      });
+      
+      //Top鏄剧ず鎺у埗
+      dom.on('scroll', function(){
+        clearTimeout(timer);
+        timer = setTimeout(function(){
+          scroll();
+        }, 100);
+      }); 
+    }
+    
+    //鍊掕鏃�
+    ,countdown: function(endTime, serverTime, callback){
+      var that = this
+      ,type = typeof serverTime === 'function'
+      ,end = new Date(endTime).getTime()
+      ,now = new Date((!serverTime || type) ? new Date().getTime() : serverTime).getTime()
+      ,count = end - now
+      ,time = [
+        Math.floor(count/(1000*60*60*24)) //澶�
+        ,Math.floor(count/(1000*60*60)) % 24 //鏃�
+        ,Math.floor(count/(1000*60)) % 60 //鍒�
+        ,Math.floor(count/1000) % 60 //绉�
+      ];
+      
+      if(type) callback = serverTime;
+       
+      var timer = setTimeout(function(){
+        that.countdown(endTime, now + 1000, callback);
+      }, 1000);
+      
+      callback && callback(count > 0 ? time : [0,0,0,0], serverTime, timer);
+      
+      if(count <= 0) clearTimeout(timer);
+      return timer;
+    }
+    
+    //鏌愪釜鏃堕棿鍦ㄥ綋鍓嶆椂闂寸殑澶氫箙鍓�
+    ,timeAgo: function(time, onlyDate){
+      var that = this
+      ,arr = [[], []]
+      ,stamp = new Date().getTime() - new Date(time).getTime();
+      
+      //杩斿洖鍏蜂綋鏃ユ湡
+      if(stamp > 1000*60*60*24*8){
+        stamp =  new Date(time);
+        arr[0][0] = that.digit(stamp.getFullYear(), 4);
+        arr[0][1] = that.digit(stamp.getMonth() + 1);
+        arr[0][2] = that.digit(stamp.getDate());
+        
+        //鏄惁杈撳嚭鏃堕棿
+        if(!onlyDate){
+          arr[1][0] = that.digit(stamp.getHours());
+          arr[1][1] = that.digit(stamp.getMinutes());
+          arr[1][2] = that.digit(stamp.getSeconds());
+        }
+        return arr[0].join('-') + ' ' + arr[1].join(':');
+      }
+      
+      //30澶╀互鍐咃紝杩斿洖鈥滃涔呭墠鈥�
+      if(stamp >= 1000*60*60*24){
+        return ((stamp/1000/60/60/24)|0) + '澶╁墠';
+      } else if(stamp >= 1000*60*60){
+        return ((stamp/1000/60/60)|0) + '灏忔椂鍓�';
+      } else if(stamp >= 1000*60*2){ //2鍒嗛挓浠ュ唴涓猴細鍒氬垰
+        return ((stamp/1000/60)|0) + '鍒嗛挓鍓�';
+      } else if(stamp < 0){
+        return '鏈潵';
+      } else {
+        return '鍒氬垰';
+      }
+    }
+    
+    //鏁板瓧鍓嶇疆琛ラ浂
+    ,digit: function(num, length){
+      var str = '';
+      num = String(num);
+      length = length || 2;
+      for(var i = num.length; i < length; i++){
+        str += '0';
+      }
+      return num < Math.pow(10, length) ? str + (num|0) : num;
+    }
+    
+    //杞寲涓烘棩鏈熸牸寮忓瓧绗�
+    ,toDateString: function(time, format){
+      //濡傛灉鍦↖E涓婏紝time涓簓yyy-mm杩欐牱鐨勬牸寮忔槸涓嶆敮鎸佺殑
+      if(time && ($.browser.msie || $.browser.mozilla)){
+        if(time.indexOf(".")>-1){
+          time = time.substring(0,time.indexOf("."));
+        }
+        time = time.replace(/-/g,"/");
+      }
+      var that = this
+      ,date = new Date(time || new Date())
+      ,ymd = [
+        that.digit(date.getFullYear(), 4)
+        ,that.digit(date.getMonth() + 1)
+        ,that.digit(date.getDate())
+      ]
+      ,hms = [
+        that.digit(date.getHours())
+        ,that.digit(date.getMinutes())
+        ,that.digit(date.getSeconds())
+      ];
+
+      format = format || 'yyyy-MM-dd HH:mm:ss';
+
+      return format.replace(/yyyy/g, ymd[0])
+      .replace(/MM/g, ymd[1])
+      .replace(/dd/g, ymd[2])
+      .replace(/HH/g, hms[0])
+      .replace(/mm/g, hms[1])
+      .replace(/ss/g, hms[2]);
+    },
+    uuid:function(){
+    	//weidy@2018-03-02 澧炲姞鐢熸垚uuid鐨勫姛鑳�
+    	var s = [];
+		var hexDigits = "0123456789ABCDEF";
+		for(var i = 0 ; i < 36; i ++){
+			s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10),1);
+		}
+		s[14] = "4";
+		s[19] = hexDigits.substr(s[19] & 0x3 | 0x8,1);
+		s[8]=s[13]=s[18]=s[23] = "-";
+		return s.join('');
+    },
+    isNull:function(v){
+         //weidy@2018-04-10 娣诲姞涓虹┖鐨勫垽鏂紝layui閲岄潰閮借皟鐢ㄨ繖涓�
+        var me =this;
+         return !me.isNotNull(v);
+    },
+    isNotNull:function(v){
+      if(v!=undefined&&v!=null&&v.length >0)
+        return true;
+      else
+        return false;
+    },
+    showDebugMsg:function(msg){
+      if(layui.isDebug){
+          try{
+            console.log(msg);
+          }catch(e){
+
+          }
+      }
+    },
+    removeComma:function(s){
+      var that = this;
+      if(that.isNotNull(s) && s.substring(s.length - 1) == ","){
+        s = s.substring(0,s.length - 1);
+      }
+      return s;
+    }
+  };
+  
+  exports('util', util);
+});
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseAction.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseAction.js
new file mode 100644
index 0000000..cd0929d
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseAction.js
@@ -0,0 +1,318 @@
+/**
+ * 鎸夐挳鐨勫熀纭�鏈嶅姟
+ * @author weidy
+ * @date 2021-03-22
+ */
+layui.define(['layer','element'],function(exports) {
+    var webUtil = $webUtil;
+    var Class = function () {
+        this.MODELNAME = "BaseAction";
+        this.moduleKey = "BaseAction";
+        this.id = "BaseAction";
+        /**
+         * 鏇挎崲鏂囨湰涓殑${xxx}
+         * @param text 鏂囨湰
+         * @param dataStore 閫夋嫨鐨勬暟鎹�
+         * @param sourceData 鏉ユ簮鏁版嵁
+         * @returns 鏇挎崲鍚庣殑鍊�,瀛楃涓�
+         */
+        this.replaceFreeMarker = function (text,dataStore,sourceData) {
+            return $webUtil.replaceFreeMarker(text,dataStore,sourceData);
+        };
+        /**
+         * 鎵ц鍓嶇疆浜嬩欢
+         * @param options 鎸夐挳鐨勯厤缃俊鎭紝鍓嶇疆浜嬩欢閲岄厤缃殑鍙傛暟浼氭浛鎹㈣繖涓噷鐨勫弬鏁扮殑淇℃伅
+         * @param buttonTarget 鎸夐挳js鎵�鍦ㄧ殑瀵硅薄
+         * @param callback 鍥炶皟锛屽鏋滃瓨鍦ㄥ墠缃簨浠讹紝浼氬湪鎵ц瀹屾垚鍚庢墽琛屽洖璋冿紝鍚﹀垯鐩存帴鍥炶皟
+         */
+        this.callPreEvent = function (options,buttonTarget,callback,preEventName) {
+            var that = this;
+            var params = $webUtil.paramLow(options.paramVOS);
+            options.paramVOS = params;
+            var beforeEvent = params[preEventName || 'beforeevent'];
+            if(beforeEvent) {
+                var buttonParse = that.parseEventByUrl(beforeEvent,options,true);
+                buttonParse.options.callback = callback;
+                if($webUtil.isNull(buttonParse)){
+                    buttonTarget[buttonParse.methodName](buttonParse);
+                }else{
+                    layui.use(buttonParse.jsPath,function () {
+                        layui[buttonParse.jsPath][buttonParse.methodName](options);
+                    });
+                }
+            }else{
+                if(callback){
+                    callback(options);
+                }
+            }
+        };
+        /**
+         * 鎵ц鍚庣疆鏃堕棿
+         * @param options 鎸夐挳鐨勯厤缃俊鎭紝鍚庣疆浜嬩欢閲岄厤缃殑鍙傛暟浼氭浛鎹㈣繖涓噷鐨勫弬鏁扮殑淇℃伅
+         * @param buttonTarget 鎸夐挳Js鎵�鍦ㄧ殑瀵硅薄
+         */
+        this.callPostEvent = function(options,buttonTarget,callback,postEventName){
+            var that = this;
+            var params = $webUtil.paramLow(options.paramVOS);
+            options.paramVOS = params;
+            var afterEvent = params[postEventName || 'afterevent'];
+            if(afterEvent) {
+                var buttonParse = that.parseEventByUrl(afterEvent,options,false);
+                if($webUtil.isNull(buttonParse)){
+                    buttonTarget[buttonParse.methodName](buttonParse);
+                }else{
+                    layui.use(buttonParse.jsPath,function () {
+                        layui[buttonParse.jsPath][buttonParse.methodName](options);
+                    });
+                }
+            }else{
+                if(callback){
+                    callback(options);
+                }
+            }
+        };
+        /**
+         * 浣跨敤url鑾峰彇浜嬩欢鐨勪俊鎭�
+         * @param url 璺緞
+         * @param options 鎸夐挳鐨勯厤缃俊鎭紝浼氳嚜鍔ㄨ鐩栫浉鍚屽睘鎬х殑鍙傛暟
+         * @param isBefore 鏄惁涓哄墠缃簨浠讹紝鍚﹀垯涓哄悗缃�
+         * @returns {{jsPath: js鐨勮矾寰�, options: 鎸夐挳鐨勯厤缃俊鎭�, methodName: (string)鏂规硶鐨勫悕瀛梷}
+         */
+        this.parseEventByUrl = function (url,options,isBefore) {
+            //鏍规嵁閰嶇疆鏍煎紡鍖栦簨浠�
+            var jsPath = url;
+            var methodName = isBefore?"doBefore":"doAfter";
+            var params = {};
+            if (url.indexOf("?")) {
+                var temp = url.substring(0, url.indexOf("?"));
+                if (temp.indexOf("#") > -1) {
+                    var array = temp.split("#");
+                    if(array.length == 1){
+                        jsPath = array[0];
+                    }else{
+                        jsPath = array[0];
+                        methodName = array[1];
+                    }
+                }else{
+                    jsPath = temp;
+                }
+                var paramArray = url.substring(url.indexOf("?") + 1).split("&");
+                layui.each(paramArray, function (_index, _item) {
+                    if (_item.indexOf("=") < 0) {
+                        $webUtil.showErrorMsg(isBefore?"鍓嶇疆浜嬩欢":"鍚庣疆浜嬩欢" + "鐨勫弬鏁伴厤缃敊璇紝闇�瑕佽xxx=yyy&zzz=a鐨勬柟寮�");
+                        return true;
+                    }
+                    params[_item.split("=")[0]] = _item.split("=")[1];
+                });
+            }else{
+                if (url.indexOf("#") > -1) {
+                    var array = url.split("#");
+                    if(array.length == 1){
+                        jsPath = array[0];
+                    }else{
+                        jsPath = array[0];
+                        methodName = array[1];
+                    }
+                }else{
+                    jsPath = url;
+                }
+            }
+            for (var key in params) {
+                options.paramVOS[key.toLowerCase()] = params[key];
+            }
+            return {
+                jsPath:jsPath,
+                methodName:methodName,
+                options:options
+            };
+        };
+
+        
+        this.renderUploadFile=function (filter,paramVOS,extraParams,callback){
+            var extendAttrMap = JSON.parse($(filter ).attr('extendAttrMap'));
+            var data={
+                fileDocClassify: 'filePathField',
+                fileDocClassifyName: '鏂囦欢璺緞瀛楁',
+                updateFileFlag: false,//鏄惁涓轰慨鏀�
+                fileOid: ''//鍙湪鏇存柊鐨勬椂鍊欐墠浼犻��
+            }
+            if(extraParams){
+                $.extend(data, extraParams);
+            }
+            layui.upload.render({
+                elem: filter
+                , url: paramVOS.uploadfilebackpath + paramVOS.uploadfileurl
+                , accept: extendAttrMap && extendAttrMap.accept ? extendAttrMap.accept : ''
+                , exts: extendAttrMap && extendAttrMap.exts ? extendAttrMap.exts : ''
+                , data: data
+                , before: function (res) {
+                    $webUtil.showProgress('鏂囦欢涓婁紶涓�');
+                }
+                , done: function (res, index, upload) {
+                    $webUtil.closeProgress();
+                    if (res.success) {
+                        layer.msg('涓婁紶鎴愬姛');
+                        if(layui.$( filter + ' .uploadDemoView').length>0 && res.obj){
+                            layui.$( filter + ' .uploadDemoView').removeClass('layui-hide').find('img').attr('src', paramVOS.uploadfilebackpath + 'vciFileDownloadController/downloadByFileOid?fileOid=' + res.obj.oid + '&' + TOKEN_KEY + '=' + $webUtil.getToken());
+                            layui.$( filter + ' .uploadDemoView input.uploadFileOid').val(res.obj.filePath);
+                        }
+
+                        if(callback){
+                            callback(res.obj)
+                        }
+                    }else{
+                        $webUtil.showErrorMsg(res.msg||"涓婁紶澶辫触锛�");
+                    }
+                },
+                error: function (index, upload) {
+                    $webUtil.showErrorMsg("涓婁紶澶辫触锛�");
+                }
+            });
+        }
+
+        //闄勪欢涓婁紶
+        this.renderUploadAttach=function (filter,paramVOS,extraParams){
+            var attachHtml=[
+                '<div class="layui-form-item"><div class="layui-upload" style="margin-left: 30px;border-top: 1px solid #eeeeee;padding-top: 15px;margin-bottom: 20px;">',
+                '<button id="',filter,'_selectBtn" type="button" class="layui-btn layui-btn-sm layui-btn-normal">閫夋嫨',paramVOS.uploadAttachmentTitle||'闄勪欢','</button>',
+                '<button id="',filter,'_uploadAction" type="button" class="layui-btn layui-btn-sm" style="margin-left: 15px;">寮�濮嬩笂浼�</button>',
+                '<input type="hidden" name="releaseFileOids">',
+                '<div class="layui-upload-list layui-table-view">',
+                '<table cellspacing="0" cellpadding="0" border="0" class="layui-table" style="width: 100%;">',
+                '<thead>',
+                '<tr><th>鏂囦欢鍚�</th><th>澶у皬</th><th>鐘舵��</th><th>鎿嶄綔</th></tr>'+
+                '</thead>',
+                '<tbody id="',filter,'_uploadList"></tbody>',
+                '</table>',
+                '</div>',
+                '</div></div>'
+            ]
+            $('#' + filter + '').append(attachHtml.join(''))
+            var uploadListView = $('#'+filter+'_uploadList');
+            var data={
+                fileDocClassify: 'attachment',
+                fileDocClassifyName: '闄勪欢',
+                updateFileFlag: false,
+                fileOid: ''
+            }
+            if(extraParams){
+                $.extend(data, extraParams);
+            }
+            var uploadListIns = layui.upload.render({
+                elem: '#'+filter+'_selectBtn'
+                ,url: paramVOS.uploadfilebackpath + paramVOS.uploadfileurl
+                ,accept: 'file'
+                ,multiple: true
+                ,auto: false
+                ,data: data
+                ,bindAction: '#'+filter+'_uploadAction'
+                ,choose: function(obj){
+                    var files = this.files = obj.pushFile(); //灏嗘瘡娆¢�夋嫨鐨勬枃浠惰拷鍔犲埌鏂囦欢闃熷垪
+                    var elemFiles= this.elemFiles = obj.getElemFiles()//閽堝ie
+                    //璇诲彇鏈湴鏂囦欢
+                    obj.preview(function(index, file, result){
+                        var tr = $(['<tr id="upload-'+ index +'">'
+                            ,'<td>'+ file.name +'</td>'
+                            , '<td>' + (file.size ? (file.size / 1024).toFixed(1) + 'kb' : '') + '</td>'
+                            ,'<td>绛夊緟涓婁紶</td>'
+                            ,'<td>'
+                            ,'<a class="layui-btn layui-btn-xs attach-reload layui-hide">閲嶄紶</a>'
+                            ,'<a class="layui-btn layui-btn-xs layui-btn-danger attach-delete">鍒犻櫎</a>'
+                            ,'</td>'
+                            ,'</tr>'].join(''));
+
+                        //鍗曚釜閲嶄紶
+                        tr.find('.attach-reload').on('click', function(){
+                            obj.upload(index, file);
+                        });
+
+                        //鍒犻櫎
+                        tr.find('.attach-delete').on('click', function(){
+                            delete files[index]; //鍒犻櫎瀵瑰簲鐨勬枃浠�
+                            if(layui.device().ie  && layui.device().ie<10){
+                                $('#'+elemFiles[index][0].id).remove()
+                                //elemFiles[index].parent()[0].removeChild(elemFiles[index][0])
+                                delete elemFiles[index];//閽堝ie
+                            }
+                            var oid=tr.attr('oid');
+                            if(oid){
+                                var val=$('#' + filter + ' [name="releaseFileOids"]').val();
+
+                                val =val.replace(oid,'').replace(',,',',')
+                                if(val.indexOf(',')==0){
+                                    val=val.replace(',','')
+                                }
+                                $('#' + filter + ' [name="releaseFileOids"]').val(val)
+                            }
+                            tr.remove();
+                            uploadListIns.config.elem.next()[0].value = ''; //娓呯┖ input file 鍊硷紝浠ュ厤鍒犻櫎鍚庡嚭鐜板悓鍚嶆枃浠朵笉鍙��
+                            $('.layui-upload-choose').remove();
+                        });
+
+                        uploadListView.append(tr);
+                    });
+                }
+                ,done: function(res, index, upload){
+                    if(res.success){ //涓婁紶鎴愬姛
+                        var tr = uploadListView.find('tr#upload-'+ index)
+                            ,tds = tr.children();
+                        tds.eq(2).html('<span style="color: #5FB878;">涓婁紶鎴愬姛</span>');
+                        tr.attr('oid',res.obj.oid);
+                        tds.eq(3).find('.attach-reload').addClass('layui-hide').html(''); //娓呯┖鎿嶄綔
+                        var val=$('#' + filter + ' [name="releaseFileOids"]').val().split(',');
+                        if(val[0]==''){
+                            val[0]=res.obj.oid
+                        }else{
+                            val.push(res.obj.oid)
+                        }
+
+                        $('#' + filter + ' [name="releaseFileOids"]').val(val.join(','))
+                        delete this.files[index]; //鍒犻櫎鏂囦欢闃熷垪宸茬粡涓婁紶鎴愬姛鐨勬枃浠�
+                        if(layui.device().ie  && layui.device().ie<10){
+                            $('#'+this.elemFiles[index][0].id).remove()
+                            delete this.elemFiles[index];
+                        }
+                        return ;
+                    }
+                    this.error(index, upload,res.msg);
+                }
+                ,error: function(index, upload,msg){
+                    var tr = uploadListView.find('tr#upload-'+ index)
+                        ,tds = tr.children();
+                    tds.eq(2).html('<span style="color: #FF5722;">涓婁紶澶辫触</span>');
+                    tds.eq(3).find('.attach-reload').removeClass('layui-hide'); //鏄剧ず閲嶄紶
+                    $webUtil.showErrorMsg(msg);
+                }
+            });
+        }
+
+        //缂栬緫鍣�
+        this.renderEditor=function (editId,initValue,paramVOS,callback){
+            function editorCb(){
+                //KindEditor.ready(function(K) {
+                    window.editor = KindEditor.create('#' + editId, {
+                        allowFileManager : true,
+                        resizeMode : 1, //缂栬緫鍣ㄥ彧鑳借皟鏁撮珮搴�
+                        width:800,
+                        height:260,
+                        afterBlur: function () { this.sync(); },
+                        afterCreate: function () {
+                            if(callback) callback()
+                        }
+                    });
+
+                //});
+            }
+            $webUtil.createScript('jslib/kindeditor-4.1.7/kindeditor-min.js',editorCb)
+        }
+
+        //寮圭獥鍐呭鍔犺浇瀹屽悗閲嶆柊瀹氫綅寮圭獥浣嶇疆
+        this.relocationOpen=function (classP){
+            !(/^\d+%$/.test(classP.config.area[0]) || /^\d+%$/.test(classP.config.area[1])) && classP.auto(classP.index);
+            classP.offset();
+            classP.config.type == 4 && classP.tips();
+        }
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME, cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseAddAction.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseAddAction.js
new file mode 100644
index 0000000..ac7a2cb
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseAddAction.js
@@ -0,0 +1,246 @@
+/**
+ * 鎸夐挳澶勭悊 涓氬姟绫诲瀷鏂板
+ * @author wangting
+ * @date 2021-3-16
+ */
+layui.define(['layer','element','BaseAction'],function(exports){
+    var webUtil = $webUtil;
+    var Class = function() {
+        this.MODELNAME = "BaseAddAction";
+        this.moduleKey = "BaseAddAction";
+
+        this.getContent = function (id) {
+            var that = this;
+            that.id = id;
+            var html = [
+                '<div class="addOrEdit" id="addOrEdit_', id, ' lay-filter="addOrEdit_', id, '" style="display:block; text-align: center"></div>'
+            ].join("");
+            return html;
+        };
+
+        this.doAction = function (options) {
+            var that = this;
+            webUtil.copyConfig(that, that.moduleKey);
+            that.id = options.id;
+            var paramVOS = {
+                url: 'uiDataController/addSave',
+                backPath: configData.compatibility ? path : configData.objectServicePath,
+                method: 'post',
+                uploadFileUrl: 'vciFileUploadController/uploadFile',
+                uploadFileBackPath: configData.compatibility ? path : configData.fileServicePath
+            }
+            $.extend(paramVOS, options.paramVOS);
+            options.paramVOS = paramVOS;
+
+            var baseAction = layui['BaseAction'];
+            baseAction.callPreEvent(options, that, function (options) {
+                that.doAdd(options, function () {
+                    baseAction.callPostEvent(options, that, options.callback);
+                });
+            });
+        };
+
+
+        this.doAdd = function (options,callback) {
+            var that = this;
+            var paramVOS = $webUtil.paramLow(options.paramVOS);
+            if (!paramVOS['form'] && !paramVOS['context']&& !paramVOS['content']) {
+                $webUtil.showErrorMsg("鎸夐挳閰嶇疆涓嶆纭�");
+                return false;
+            }
+            var selectData = options.dataStore;
+
+            var table = layui.table;
+            if (paramVOS.form) {
+                var filter = "addOrEdit_" + options.id;
+                var form = layui.form;
+                var content = ['<form id="', filter, '" lay-filter="', filter, '" class="layui-form" style="margin:15px 30px 50px 0;" ></form>'
+                ].join('');
+                var addSaveIndex = layer.open({
+                    type: 1,
+                    title: $webUtil.replaceFreeMarker(paramVOS.title,options.dataStore,options.sourceData),
+                    btn: ['淇濆瓨', '鍙栨秷'],
+                    //skin: 'layui-layer-lan',
+                    content: content,
+                    //area: ['1860px', '200px'],
+                    maxWidth: $(window).width() - 100,
+                    maxHeight: $(window).height() - 100,
+                    closeBtn: 1,
+                    shade: true,
+                    shadeClose: true,
+                    resize: true,
+                    resizing: function (layero) {
+                        form.doResize(filter);
+                    },
+                    success: function (layero,layerIndex,classP) {
+                        $webUtil.get('webUIController/getFormDefineById', {
+                            btmType: paramVOS.type,
+                            id: paramVOS.form
+                        }, function (result) {
+                            if (result.success) {
+                                var formCallback = function () {
+                                    if (paramVOS.initvalue) {
+                                        var urlobj = $webUtil.getUrlParams('?' + paramVOS.initvalue, {}, '#', ';');
+                                        form.setValues(urlobj.params, filter);
+                                    }
+                                    var baseAction = layui['BaseAction'];
+                                    if ($('#' + filter + ' .layui-upload-drag').length > 0) {
+                                        //鏂囦欢涓婁紶
+                                        baseAction.renderUploadFile('#' + filter + ' .layui-upload-drag',paramVOS)
+                                    }
+
+                                    if(paramVOS.uploadattachment &&paramVOS.uploadattachment == 'true'){
+                                        //鏄剧ず涓婁紶闄勪欢
+                                        baseAction.renderUploadAttach(filter,paramVOS)
+                                    }
+
+                                    if ($('#' + filter + ' .webeditor').length > 0) {
+                                        //缂栬緫鍣�
+                                        var editId='editor_'+$('#' + filter + ' .webeditor').attr('name')
+                                        baseAction.renderEditor(editId,'',paramVOS,function (){
+                                            baseAction.relocationOpen(classP)
+                                        });
+                                    }
+                                    baseAction.relocationOpen(classP)
+
+                                }
+
+                                form.addItems(filter, result.obj.items, formCallback, {}, {
+                                    defaultColumnOneRow: result.obj.columnOneRow
+                                });
+                            } else {
+                                $webUtil.showErrorMsg(result.msg||'鑾峰彇琛ㄥ崟澶辫触');
+                            }
+
+                        }, function (xhr, error) {
+                            $webUtil.showErrorMsg("鑾峰彇琛ㄥ崟鍑虹幇浜嗛敊璇紝鍙兘鏄枃浠舵湇鍔℃病鏈夊惎鍔�");
+                        }, paramVOS.backpath)
+                    },
+                    yes: function (layero) {
+                        if (form.validata(filter)) {
+                            var saveFn=function (){
+                                var formValues = form.getDefaultValues(filter, true);
+                                if(formValues.otherValue.releaseFileOids){
+                                    formValues.otherValue.releaseFileOids=formValues.otherValue.releaseFileOids.split(',');
+                                }
+                                if (!formValues.defaultValues.btmname) {
+                                    formValues.defaultValues.btmname = paramVOS.type;
+                                }
+                                var datas = {
+                                    formDefineId: paramVOS.form,
+                                    preEvent: paramVOS.preevent,
+                                    afterEvent: paramVOS.afterevent,
+                                    beforeServerEvent: paramVOS.beforeserverevent,
+                                    afterServerEvent: paramVOS.afterserverevent,
+                                    releaseFileOids: formValues.otherValue.releaseFileOids||[],
+                                    data: formValues.otherValue
+                                }
+                                $.extend(datas, formValues.defaultValues);
+                                $webUtil.manualAjax(paramVOS.method, paramVOS.url, JSON.stringify(datas), function (result) {
+                                    if (result.success) {
+                                        $webUtil.showMsgFromResult(result, paramVOS.title + '鎴愬姛');
+                                        that.refresh();
+                                        if (options.callback) {
+                                            options.callback()
+                                        }
+                                        if (paramVOS.saveafterevent) {
+                                            var urlobj = $webUtil.getUrlParams(paramVOS.saveafterevent);
+                                            layui.use(urlobj.jsPath, function () {
+                                                var pathAction = layui[urlobj.jsPath];
+                                                var id = 'saveBeforeEvent_' + id;
+                                                pathAction[urlobj.methodName](paramVOS, id, selectData);
+                                            })
+                                        }
+                                        if(callback){
+                                            callback()
+                                        }
+                                        layer.close(addSaveIndex);
+
+                                    } else {
+                                        $webUtil.showErrorMsg(result.msg||paramVOS.title + '澶辫触');
+                                    }
+                                }, function (xhr, error) {
+                                    $webUtil.showErrorMsg("璁块棶鏈嶅姟鍣ㄥ嚭鐜颁簡閿欒锛屽彲鑳芥湇鍔″櫒娌℃湁寮�鍚紝鎴栬�呰繛鎺ュけ璐�");
+                                }, paramVOS.backpath);
+                            }
+                            if (paramVOS.savebeforeevent) {
+                                var urlobj = $webUtil.getUrlParams(paramVOS.savebeforeevent);
+                                layui.use(urlobj.jsPath, function () {
+                                    var pathAction = layui[urlobj.jsPath];
+                                    var id = 'saveBeforeEvent_' + id;
+                                    pathAction[urlobj.methodName]({
+                                        paramVOS: paramVOS,
+                                        id: id,
+                                        dataStore: selectData,
+                                        sourceData:options.sourceData,
+                                        callback: saveFn
+                                    });
+                                })
+                            }else{
+                                saveFn()
+                            }
+
+                        }
+                    },
+                    btn2: function (layero) {
+                        layer.close(addSaveIndex)
+                    }
+                });
+            } else if (paramVOS.context||paramVOS.content) {
+                layui.use('platform/objectService/VciUIContentViewer', function () {
+                    var newTabClass = layui['platform/objectService/VciUIContentViewer'];
+                    newTabClass.id = that.id;
+                    newTabClass.multiCompent = true;
+                    newTabClass.sourceData = {
+                        btmType: paramVOS.type,
+                        content: paramVOS.context,
+                        actionData: {
+                            selectData: options.sourceData,
+                            dataStore:options.dataStore,
+                            isOpen: true,
+                            paramVOS: paramVOS
+                        }
+                    };
+                    var filter = "addOrEdit_" + that.id;
+                    var content = ['<div id="', filter, '" lay-filter="', filter, '" style="margin:5px;" >',newTabClass.getContent(that.id),'</div>']
+                    var addSaveIndex = layer.open({
+                        type: 1,
+                        title: $webUtil.replaceFreeMarker(paramVOS.title,options.dataStore,options.sourceData),
+                        //skin: 'layui-layer-lan',
+                        content: content.join(''),
+                        shade: true,
+                        shadeClose: true,
+                        area: [$(window).width() - 100+'px', $(window).height() - 100+'px'],
+                        resize: true,
+                        resizing: function (layero) {
+                        },
+                        success: function (layero,layerIndex,classP) {
+                            newTabClass.init(that.id, newTabClass.sourceData,function (){
+                                //layui['BaseAction'].relocationOpen(classP)
+                            })
+
+                        },
+                        cancel: function (layero) {
+                            if (options.callback) {
+                                options.callback()
+                            }
+                        }
+                    });
+                });
+            }
+        }
+
+        this.refresh = function () {
+            var that = this;
+
+        };
+
+        this.destory = function () {
+            var that = this;
+            var filter = "addOrEdit_" + that.id;
+            $('#' + filter).remove()
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseDeleteAction.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseDeleteAction.js
new file mode 100644
index 0000000..d70d136
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseDeleteAction.js
@@ -0,0 +1,90 @@
+/**
+ * 涓氬姟绫诲瀷鐨勫垹闄�
+ * @author weidy
+ * @date 2021-3-19
+ */
+layui.define(['layer','element','BaseAction'],function(exports){
+    var webUtil = $webUtil;
+    var Class = function() {
+        this.MODELNAME = "BaseDeleteAction";
+        this.moduleKey = "BaseDeleteAction";
+        this.id = "BaseDeleteAction";
+        this.backPath = configData.compatibility?path:configData.objectServicePath;
+        this.doAction = function (options) {
+            if(!options || !options.dataStore ){
+                $webUtil.showErrorMsg("鎸夐挳鐨勪紶閫掍俊鎭笉姝g‘锛岃寮�鍙戜汉鍛樻鏌�");
+                return false;
+            }
+            var that = this;
+            webUtil.copyConfig(that, that.moduleKey);
+            var finallyCallback = options.callback;
+            var params = $webUtil.paramLow(options.paramVOS);
+            options.paramVOS = params;
+            if(options.dataStore.length<1){
+                $webUtil.showErrorMsg("璇烽�夋嫨闇�瑕佸垹闄ょ殑鏁版嵁");
+                return false;
+            }
+            if(!params.multi && options.dataStore.length > 1){
+                $webUtil.showErrorMsg("浠呰兘閫夋嫨涓�鏉℃暟鎹潵鎿嶄綔");
+                return false;
+            }
+            var baseAction = layui['BaseAction'];
+            baseAction.callPreEvent(options,that,function (options) {
+                $webUtil.showConfirmMsg($webUtil.replaceFreeMarker(params.confirmmsg,options.dataStore,options.sourceData) || ('鏄惁鍒犻櫎' + (options.dataStore.length==1?"杩欐潯":"杩欎簺") + '鏁版嵁' + (params.cascade?",濡傛灉鏈変笅绾ф暟鎹細绾ц仈鍒犻櫎":"")),function (r) {
+                    if(r){
+                        that.doDelete(options,function (){
+                            baseAction.callPostEvent(options,that,finallyCallback);
+                        });
+                    }
+                });
+            });
+        };
+        this.doDelete = function (options,callback) {
+            var that = this;
+            var submitData = {
+                checkLinkedFlag:options.paramVOS.checklinkedflag,
+                cascade:options.paramVOS.cascade,
+                adminCascade:options.paramVOS.admincascade
+            }
+            if(options.paramVOS.checkonback){
+                submitData['checkNotDelete']=options.paramVOS.checknotdelete;
+                submitData['checkNotDeleteMsg']=options.paramVOS.checknotdeletemsg;
+            }else if(options.paramVOS.checknotdelete){
+                var notdelete = options.paramVOS.checknotdelete.split('&');
+                var checknotdelete=false;
+                var msgStore={};
+                layui.each(notdelete, function (i, item) {
+                    for (var j=0;j<options.dataStore.lenght;j++){
+                        if (options.dataStore[j][item.split('=')[0]] == item.split('=')[1]) {
+                            checknotdelete=true;
+                            msgStore=options.dataStore[j]
+                            return false;
+                        }
+                    }
+                })
+                if (checknotdelete) {
+                    $webUtil.showErrorMsg($webUtil.replaceFreeMarker(options.paramVOS.checknotdeletemsg,msgStore,{}) || '褰撳墠鏁版嵁涓嶅厑璁稿垹闄�');
+                    return false;
+                }
+            }
+            submitData.dataList = options.dataStore;
+            $webUtil.manualAjax(options.paramVOS.method||'delete',options.paramVOS.url || 'uiDataController/deleteData',JSON.stringify(submitData),function(result){
+                if(result.success){
+                    $webUtil.showMsgFromResult(result,options.paramVOS.successMsg||'鍒犻櫎鎴愬姛');
+                    if(callback){
+                        callback();
+                    }
+                }else{
+                    $webUtil.showErrorMsg(result.msg);
+                }
+            },function (error,xhr){
+                $webUtil.showErrorMsg("鎵ц鍒犻櫎鍑洪敊锛屽彲鑳芥槸鏈嶅姟娌℃湁鍚姩锛屾偍鍙互绋嶅悗鍐嶈瘯");
+            },options.paramVOS.backpath||that.backPath);
+        };
+        this.destory = function () {
+            var that = this;
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseEditAction.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseEditAction.js
new file mode 100644
index 0000000..2499c6d
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseEditAction.js
@@ -0,0 +1,303 @@
+/**
+ * 鎸夐挳澶勭悊 涓氬姟绫诲瀷淇敼
+ * @author wangting
+ * @date 2021-3-16
+ */
+layui.define(['layer','element','BaseAction'],function(exports){
+    var webUtil = $webUtil;
+    var Class = function() {
+        this.MODELNAME = "BaseEditAction";
+        this.moduleKey = "BaseEditAction";
+        this.getContent = function (id, options) {
+            var that = this;
+            that.id = id;
+            var html = [
+                '<div class="addOrEdit" id="addOrEdit_', id, ' lay-filter="addOrEdit_', id, '" style="display:block; text-align: center"></div>'
+            ].join("");
+            return html;
+        };
+        this.doAction = function (options) {
+            var that = this;
+            webUtil.copyConfig(that, that.moduleKey);
+            that.id = options.id;
+            var paramVOS={
+                getDataUrl:'uiDataController/dataFormQuery',
+                getDataBackPath: configData.compatibility ? path : configData.objectServicePath,
+                getDataMethod:'post',
+                url:'uiDataController/editSave',
+                backPath:configData.compatibility ? path : configData.objectServicePath,
+                method:'put',
+                uploadFileUrl:'vciFileUploadController/uploadFile',
+                uploadFileBackPath: configData.compatibility ? path : configData.fileServicePath
+            }
+            $.extend(paramVOS,options.paramVOS);
+            options.paramVOS=paramVOS;
+
+            var baseAction = layui['BaseAction'];
+            baseAction.callPreEvent(options, that, function (options) {
+                that.doEdit(options, function () {
+                    baseAction.callPostEvent(options, that, options.callback);
+                });
+            });
+        };
+
+        this.doEdit=function (options,callback){
+            var that = this;
+            var paramVOS=$webUtil.paramLow(options.paramVOS);
+            if (!paramVOS['form'] && !paramVOS['context']&& !paramVOS['content']) {
+                $webUtil.showErrorMsg("鎸夐挳閰嶇疆涓嶆纭�");
+                return false;
+            }
+            that.id=options.id;
+            var selectData=options.dataStore;
+            if(selectData.length<1){
+                $webUtil.showErrorMsg("璇烽�夋嫨涓�鏉¢渶瑕佷慨鏀圭殑鏁版嵁");
+                return false;
+            }
+            if(!paramVOS.multi && selectData.length > 1){
+                $webUtil.showErrorMsg("浠呰兘閫夋嫨涓�鏉℃暟鎹潵鎿嶄綔");
+                return false;
+            }
+            if(paramVOS.checknotedit) {
+                var notedit = paramVOS.checknotedit.split('&');
+                var checknotedit=false;
+                layui.each(notedit, function (i, item) {
+                    if (options.dataStore[0][item.split('=')[0]] == item.split('=')[1]) {
+                        checknotedit=true;
+                        return false;
+                    }
+                })
+                if (checknotedit) {
+                    $webUtil.showErrorMsg($webUtil.replaceFreeMarker(paramVOS.checknoteditmsg,options.dataStore,{}) || '褰撳墠鏁版嵁涓嶅厑璁镐慨鏀�');
+                    return false;
+                }
+            }
+            var table = layui.table;
+            if (paramVOS.form) {
+                var filter = "addOrEdit_" + that.id;
+                var form = layui.form;
+                var content = ['<form id="', filter, '" lay-filter="', filter, '" class="layui-form" style="margin:15px 30px 50px 0;" ></form>'
+                ].join('');
+                var addSaveIndex = layer.open({
+                    type: 1,
+                    title: $webUtil.replaceFreeMarker(paramVOS.title,options.dataStore,options.sourceData),
+                    btn: ['淇濆瓨', '鍙栨秷'],
+                    //skin: 'layui-layer-lan',
+                    content: content,
+                    //area: ['1860px', '200px'],
+                    maxWidth: $(window).width() - 100,
+                    maxHeight: $(window).height() - 100,
+                    closeBtn: 1,
+                    shade: true,
+                    shadeClose: true,
+                    resize: true,
+                    resizing: function (layero) {
+                        form.doResize(filter);
+                    },
+                    success: function (layero,layerIndex,classP) {
+                        $webUtil.get('webUIController/getFormDefineById', {
+                            btmType: paramVOS.type,
+                            id: paramVOS.form
+                        }, function (result) {
+                            if (result.success) {
+                                var formCallback = function () {
+                                    var baseAction = layui['BaseAction'];
+                                    if ($('#' + filter + ' .layui-upload-drag').length > 0) {
+                                        baseAction.renderUploadFile('#' + filter + ' .layui-upload-drag', paramVOS)
+                                    }
+                                    if (paramVOS.uploadattachment && paramVOS.uploadattachment == 'true') {
+                                        //鏄剧ず涓婁紶闄勪欢
+                                        baseAction.renderUploadAttach(filter, paramVOS)
+                                    }
+                                    if ($('#' + filter + ' .webeditor').length > 0) {
+                                        //缂栬緫鍣�
+                                        var editId='editor_'+$('#' + filter + ' .webeditor').attr('name')
+                                        baseAction.renderEditor(editId,'',paramVOS,function (){
+                                            baseAction.relocationOpen(classP)
+                                        });
+                                    }
+                                    baseAction.relocationOpen(classP)
+
+
+                                    //鑾峰彇閫変腑鐨勬暟鎹�
+                                    var sourceDataMap = {};
+                                    layui.each(options.sourceData, function (i, item) {
+                                        if(item.constructor === Object) return;
+                                        sourceDataMap['sourceData["' + i + '"]'] = item;
+                                    })
+                                    $webUtil.ajax(paramVOS.getdatamethod, paramVOS.getdataurl, $.extend({
+                                            btmname: paramVOS.type,
+                                            formDefineId: paramVOS.form,
+                                            oid: selectData[0].oid
+                                        }, sourceDataMap),
+                                        function (result) {
+                                            if (result.success) {
+                                                form.setValues(result.obj.data, filter);
+                                                //鏂囦欢
+                                                if (result.obj.filePathFieldMap) {
+                                                    var filepath = layui.$('#' + filter + ' .uploadDemoView input.uploadFileOid').attr('name');
+                                                    layui.$('#' + filter + ' .uploadDemoView').removeClass('layui-hide').find('img').attr('src', paramVOS.uploadfilebackpath + 'vciFileDownloadController/downloadByFileOid?fileOid=' + result.obj.filePathFieldMap[filepath].oid + '&' + TOKEN_KEY + '=' + $webUtil.getToken());
+                                                    layui.$('#' + filter + ' .uploadDemoView input.uploadFileOid').val(result.obj.filePathFieldMap[filepath].filePath);
+                                                }
+                                                //闄勪欢
+                                                if (result.obj.attachmentFileVOs && result.obj.attachmentFileVOs.length > 0) {
+                                                    var val = [];
+                                                    layui.each(result.obj.attachmentFileVOs, function (i, attachmentFile) {
+                                                        val.push(attachmentFile.oid)
+                                                    })
+                                                    $('#' + filter + ' [name="releaseFileOids"]').val(val.join(','))
+                                                }
+                                                if ($('#' + filter + ' .webeditor').length > 0) {
+                                                    //缂栬緫鍣�
+                                                    var initV=result.obj.data[$('#' + filter + ' .webeditor').attr('name')];
+                                                    editor.html(initV);
+                                                    $('#' + filter + ' .webeditor').val(initV);
+                                                }
+
+                                            }
+                                        }, function (xhr, error) {
+                                            $webUtil.showErrorMsg("鑾峰彇鏁版嵁鍑虹幇浜嗛敊璇紝鍙兘鏄枃浠舵湇鍔℃病鏈夊惎鍔�");
+                                        }, paramVOS.getdatabackpath)
+
+                                }
+
+                                form.addItems(filter, result.obj.items, formCallback, {}, {
+                                    defaultColumnOneRow: result.obj.columnOneRow
+                                });
+                            } else {
+                                $webUtil.showErrorMsg(result.msg||'鑾峰彇琛ㄥ崟澶辫触');
+                            }
+
+                        }, function (xhr, error) {
+                            $webUtil.showErrorMsg("鑾峰彇琛ㄥ崟鍑虹幇浜嗛敊璇紝鍙兘鏄枃浠舵湇鍔℃病鏈夊惎鍔�");
+                        }, paramVOS.backpath)
+                    },
+                    yes: function (layero) {
+                        if (form.validata(filter)) {
+
+                            var saveFn = function () {
+                                var formValues = form.getDefaultValues(filter, true);
+                                if (formValues.otherValue.releaseFileOids) {
+                                    formValues.otherValue.releaseFileOids = formValues.otherValue.releaseFileOids.split(',');
+                                }
+                                if (!formValues.defaultValues.btmname) {
+                                    formValues.defaultValues.btmname = paramVOS.type;
+                                }
+                                var datas = {
+                                    formDefineId: paramVOS.form,
+                                    preEvent: paramVOS.prepvent,
+                                    afterEvent: paramVOS.afterevent,
+                                    beforeServerEvent: paramVOS.beforeserverevent,
+                                    afterServerEvent: paramVOS.afterserverevent,
+                                    releaseFileOids: formValues.otherValue.releaseFileOids || [],
+                                    data: formValues.otherValue
+                                }
+                                $.extend(datas, formValues.defaultValues);
+                                $webUtil.manualAjax(paramVOS.method, paramVOS.url, JSON.stringify(datas), function (result) {
+                                    if (result.success) {
+                                        $webUtil.showMsgFromResult(result, paramVOS.title + '鎴愬姛');
+                                        that.refresh();
+                                        if (options.callback) {
+                                            options.callback()
+                                        }
+                                        if (paramVOS.saveafterevent) {
+                                            var urlobj = $webUtil.getUrlParams(paramVOS.saveafterevent);
+                                            layui.use(urlobj.jsPath, function () {
+                                                var pathAction = layui[urlobj.jsPath];
+                                                var id = 'saveBeforeEvent_' + id;
+                                                pathAction[urlobj.methodName](paramVOS, id, selectData);
+                                            })
+                                        }
+                                        if(callback){
+                                            callback()
+                                        }
+                                        layer.close(addSaveIndex);
+                                    } else {
+                                        $webUtil.showErrorMsg(result.msg || paramVOS.title + '澶辫触');
+                                    }
+                                }, function (xhr, error) {
+                                    $webUtil.showErrorMsg("璁块棶鏈嶅姟鍣ㄥ嚭鐜颁簡閿欒锛屽彲鑳芥湇鍔″櫒娌℃湁寮�鍚紝鎴栬�呰繛鎺ュけ璐�");
+                                }, paramVOS.backpath);
+                            }
+
+                            if (paramVOS.savebeforeevent) {
+                                var urlobj = $webUtil.getUrlParams(paramVOS.savebeforeevent);
+                                layui.use(urlobj.jsPath, function () {
+                                    var pathAction = layui[urlobj.jsPath];
+                                    var id = 'saveBeforeEvent_' + id;
+                                    pathAction[urlobj.methodName]({
+                                        paramVOS: paramVOS,
+                                        id: id,
+                                        dataStore: selectData,
+                                        sourceData:options.sourceData,
+                                        callback: saveFn
+                                    });
+                                })
+                            } else {
+                                saveFn()
+                            }
+                        }
+                    },
+                    btn2: function (layero) {
+                        layer.close(addSaveIndex)
+                    }
+                });
+            } else if (paramVOS.context||paramVOS.content) {
+                layui.use('platform/objectService/VciUIContentViewer', function () {
+                    var newTabClass = layui['platform/objectService/VciUIContentViewer'];
+                    newTabClass.id = that.id;
+                    newTabClass.multiCompent = true;
+                    newTabClass.sourceData = {
+                        btmType: paramVOS.type,
+                        content: paramVOS.context,
+                        dataOid:options.dataStore[0].oid,
+                        actionData: {
+                            selectData: options.sourceData,
+                            dataStore:options.dataStore,
+                            isOpen: true,
+                            paramVOS: paramVOS
+                        }
+                    };
+
+                    var filter = "addOrEdit_" + that.id;
+                    var content = ['<div id="', filter, '" lay-filter="', filter, '" style="margin:5px;" >',newTabClass.getContent(that.id),'</div>']
+                    var addSaveIndex = layer.open({
+                        type: 1,
+                        title: $webUtil.replaceFreeMarker(paramVOS.title,options.dataStore,options.sourceData),
+                        //skin: 'layui-layer-lan',
+                        content: content.join(''),
+                        area: [$(window).width() - 100+'px', $(window).height() - 100+'px'],
+                        shade: true,
+                        shadeClose: true,
+                        resize: true,
+                        resizing: function (layero) {
+                        },
+                        success: function (layero,layerIndex,classP) {
+                            newTabClass.init(that.id, newTabClass.sourceData,function (){
+                                //layui['BaseAction'].relocationOpen(classP)
+                            })
+                        },
+                        cancel: function (layero) {
+                            if (options.callback) {
+                                options.callback()
+                            }
+                        }
+                    });
+                });
+            }
+        }
+
+        this.refresh = function () {
+            var that = this;
+
+        };
+
+        this.destory = function () {
+            var that = this;
+            var filter = "addOrEdit_" + that.id;
+            $('#'+filter).remove()
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseFileDownloadAction.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseFileDownloadAction.js
new file mode 100644
index 0000000..fde22e4
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseFileDownloadAction.js
@@ -0,0 +1,176 @@
+/**
+ * 鏂囦欢涓嬭浇
+ * @author wangting
+ * @date 2021-5-11
+ */
+layui.define(['layer','element','BaseAction'],function(exports){
+    var webUtil = $webUtil;
+    var Class = function() {
+        this.MODELNAME = "BaseFileDownloadAction";
+        this.moduleKey = "BaseFileDownloadAction";
+        this.doAction = function (options) {
+            var that = this;
+            webUtil.copyConfig(that, that.moduleKey);
+            that.id = options.id;
+            var paramVOS = {
+                url: 'vciFileDownloadController/downloadByFileOid',//涓嬭浇鐨勫悗鍙版帴鍙�
+                posturl: 'vciFileDownloadController/downloadByFileOidPost',
+                backPath: configData.compatibility ? path : configData.fileServicePath
+            }
+            $.extend(paramVOS, options.paramVOS);
+            options.paramVOS = paramVOS;
+
+            var baseAction = layui['BaseAction'];
+            baseAction.callPreEvent(options, that, function (options) {
+                that.doDOWNLOADFILE(options, function () {
+                    baseAction.callPostEvent(options, that, options.callback);
+                });
+            });
+        };
+
+
+        this.doDOWNLOADFILE = function (options,callback) {
+            var that = this;
+            var paramVOS = $webUtil.paramLow(options.paramVOS);
+            var selectData = options.dataStore;
+            if(selectData.length<1){
+                $webUtil.showErrorMsg("璇烽�夋嫨闇�瑕佷笅杞界殑鏂囦欢");
+                return false;
+            }
+            var data = {}
+            layui.each(paramVOS, function (i, item) {
+                if (item && item.constructor === Object) {
+                    layui.each(item, function (j, jitem) {
+                        data['sourceData["' + i + '"]["' + j + '"]'] = jitem;
+                    })
+                }
+                ;
+                if (i == 'url' || i == 'posturl' || i == 'backpath' || i == 'beforeevent' || i == 'afterevent') return;
+                data['sourceData["' + i + '"]'] = item;
+            });
+            var fileOids = [];
+            layui.each(selectData, function (i, item) {
+                fileOids.push(item.oid)
+            });
+            data['fileOid'] = fileOids.join(',')
+            $webUtil.fileDownloadPost(paramVOS.backpath + paramVOS.posturl, data,callback)
+        }
+
+        this.PREVIEW = function (oid, param, errorCallback) {
+            var that = this;
+            //param:{fileOid:rowData.fileOid}
+            if (!oid) {
+                return false;
+            }
+            that.checkData(oid, 'vciFileQueryController/previewFileOld', param, function (fileUrl, result, oid) {
+                that.preViewDialog(fileUrl, result, oid);
+            }, function () {
+                if (errorCallback) {
+                    errorCallback()
+                }
+            });
+        };
+
+        this.checkData = function (oid, url, param, callback, errorCallback) {
+            var that = this;
+            $webUtil.post(url, param, function (result) {
+                if (result.success) {
+                    result.obj=$webUtil.paramLow(result.obj)
+                    var fileUrl = result.obj.previewsystemurl;
+                    that.viewFileData = {//涓轰簡iframe鑾峰彇鍙傛暟 鍐欎负鍏ㄥ眬鍙橀噺
+                        previewkey: result.obj.previewkey,
+                        invalidtime: result.obj.invalidTime,
+                        systemkey: result.obj.systemkey
+                    };
+                    if ($webUtil.isNull(fileUrl)) {
+                        //$webUtil.showErrorMsg("鏈嶅姟鍣ㄧ杩斿洖鐨勪俊鎭笉姝g‘锛屾病鏈夐瑙堟湇鍔$殑鍦板潃锛岃鑱旂郴绠$悊鍛�");
+                        if (errorCallback) {
+                            errorCallback()
+                        }
+                        return false;
+                    }
+                    if ($webUtil.isNull(result.obj.previewkey)) {
+                        //	$webUtil.showErrorMsg("鏈嶅姟鍣ㄧ杩斿洖鐨勪俊鎭笉姝g‘锛屾病鏈夐瑙堟湇鍔$殑璁稿彲淇℃伅锛岃鑱旂郴绠$悊鍛�");
+                        if (errorCallback) {
+                            errorCallback()
+                        }
+                        return false;
+                    }
+                    if ($webUtil.isNull(result.obj.invalidtime)) {
+                        //	$webUtil.showErrorMsg("鏈嶅姟鍣ㄧ杩斿洖鐨勪俊鎭笉姝g‘锛屾病鏈夐瑙堢殑璁稿彲鏃堕棿锛岃鑱旂郴绠$悊鍛�");
+                        if (errorCallback) {
+                            errorCallback()
+                        }
+                        return false;
+                    }
+                    if ($webUtil.isNull(result.obj.systemkey)) {
+                        //$webUtil.showErrorMsg("鏈嶅姟鍣ㄧ杩斿洖鐨勪俊鎭笉姝g‘锛屾病鏈夐瑙堟湇鍔$殑璁稿彲鐮侊紝璇疯仈绯荤鐞嗗憳");
+                        if (errorCallback) {
+                            errorCallback()
+                        }
+                        return false;
+                    }
+                    if (fileUrl.indexOf("?") > -1) {
+                        fileUrl = fileUrl + "&";
+                    } else {
+                        fileUrl = fileUrl + "?";
+                    }
+                    fileUrl = fileUrl + "fileOids=" + result.obj.fileoids
+                        + "&systemKey=" + result.obj.systemkey
+                        + "&previewKey=" + result.obj.previewkey
+                        + "&invalidTime=" + result.obj.invalidtime
+                        + "&reswitch=true"
+                        + "&currentUserId=" + $webUtil.getSystemVar($webUtil.systemValueKey.userId)
+                        + "&viewType=pdf"
+                    ;
+                    if (callback) {
+                        callback(fileUrl, result, oid);
+                    }
+                } else if (result.code == "notsupportpreview") {
+                    $webUtil.showMsg("鎮ㄩ�夋嫨鐨勬枃浠朵笉鏀寔棰勮");
+                } else {
+                    if (errorCallback) {
+                        errorCallback()
+                    }
+                    $webUtil.showErrorMsg(result.msg);
+                }
+            });
+        };
+        this.preViewDialog = function (fileUrl, result, oid) {
+            var that = this;
+            if ("popup" == result.showType) {
+                window.open(fileUrl, $webUtil.uuid(), "location=no,menubar=no,directories=no,toolbar=no,left=0,top=0,width=" + document.body.clientWidth + "px,height=" + document.body.clientHeight + "px");
+            } else {
+                var windowArea = [];
+                if (window.innerWidth) {
+                    windowArea = [(window.innerWidth - 50) + "px", (window.innerHeight - 50) + "px"];
+                } else {
+                    windowArea = [(document.documentElement.clientWidth - 50) + "px", (document.documentElement.clientHeight - 50) + "px"];
+                }
+                var iframeWidth = windowArea[0].substring(0, windowArea[0].indexOf("px"));
+                var iframeHeight = windowArea[1].substring(0, windowArea[1].indexOf("px")) - 50;
+                var content = '<iframe id="fileIframe_' + that.id + '" scrolling="auto" allowtransparency="true" frameborder="0" src=' + fileUrl + ' style="height: ' + iframeHeight + 'px;width:' + iframeWidth + 'px;"></iframe>';
+                // '<div id="previewinfo_' + that.id + '" class="layui-layout-east" style="display:block;position:absolute;top:0;right:0;margin-top:10px;margin-right:5px;width:450px;max-width:450px;min-width:150px;border:1px solid #e1e1e1"></div>';
+
+                layer.open({
+                    type: 1,
+                    title: '棰勮鏂囦欢-璇蜂笉瑕佸埛鏂板綋鍓嶉〉闈紱濡傛灉鎮ㄦ病鏈夊畨瑁匬DF杞欢锛岃鍏堝畨瑁�;',
+                    content: content,
+                    area: windowArea,
+                    closeBtn: 1,
+                    shade: true,
+                    shadeClose: true,
+                    resize: false,
+                    success: function () {
+                        //that.previewPanelInit(oid);
+                    },
+                    end: function () {
+                        that.viewFileData = {};
+                    }
+                });
+            }
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseFileUploadAction.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseFileUploadAction.js
new file mode 100644
index 0000000..b100393
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseFileUploadAction.js
@@ -0,0 +1,298 @@
+/**
+ * 鏂囦欢涓婁紶鍜屼慨鏀�
+ * @author wangting
+ * @date 2021-5-11
+ */
+layui.define(['layer','element','BaseAction'],function(exports){
+    var webUtil = $webUtil;
+    var Class = function() {
+        this.MODELNAME = "BaseFileUploadAction";
+        this.moduleKey = "BaseFileUploadAction";
+
+        this.getContent = function (id) {
+            var that = this;
+            that.id = id;
+            var html = [
+                '<div class="FileUpload" id="FileUpload_', id, ' lay-filter="FileUpload_', id, '" style="display:block; text-align: center"></div>'
+            ].join("");
+            return html;
+        };
+
+        this.doAction = function (options) {
+            var that = this;
+            webUtil.copyConfig(that, that.moduleKey);
+            that.id = options.id;
+            var paramVOS = {
+                url: 'vciFileUploadController/uploadFile',
+                backPath: configData.compatibility ? path : configData.fileServicePath,
+                method: 'post'
+            }
+            $.extend(paramVOS, options.paramVOS);
+            options.paramVOS = paramVOS;
+
+            var baseAction = layui['BaseAction'];
+            baseAction.callPreEvent(options, that, function (options) {
+                that.doUpload(options, function () {
+                    baseAction.callPostEvent(options, that, options.callback);
+                });
+            });
+        };
+
+
+        this.doUpload = function (options,callback) {
+            var that = this;
+            var paramVOS = $webUtil.paramLow(options.paramVOS);
+            var selectData = options.dataStore;
+
+            if (paramVOS.updatefileflag == true || paramVOS.updatefileflag == "true") {
+                if (selectData.length < 1) {
+                    $webUtil.showErrorMsg("璇烽�夋嫨涓�鏉¢渶瑕佷慨鏀圭殑鏁版嵁");
+                    return false;
+                }
+                if (selectData[0].btmname != 'fileobject') {
+                    $webUtil.showErrorMsg("淇敼鐨勬暟鎹渶鏄枃浠跺璞�");
+                    return false;
+                }
+                if (!paramVOS.multi && selectData.length > 1) {
+                    $webUtil.showErrorMsg("浠呰兘閫夋嫨涓�鏉℃暟鎹潵鎿嶄綔");
+                    return false;
+                }
+            }
+            if (!options.sourceData) {
+                $webUtil.showErrorMsg("璇烽�夋嫨鏉ユ簮鏁版嵁");
+                return false;
+            }
+            var filter = "aFileUpload_" + options.id;
+            var form = layui.form;
+            var content = ['<div id="', filter, '" lay-filter="', filter, '" class="layui-form" style="margin:15px 30px 15px 0;" ></div>'
+            ].join('');
+            var addSaveIndex = layer.open({
+                type: 1,
+                title: paramVOS.title ? $webUtil.replaceFreeMarker(paramVOS.title, selectData, options.sourceData[0]) : '涓婁紶鏂囦欢',
+                btn: ['寮�濮嬩笂浼�', '鍏抽棴'],
+                //skin: 'layui-layer-lan',
+                content: content,
+                area: [paramVOS.width || '800px', paramVOS.height || '500px'],
+                closeBtn: 1,
+                shade: true,
+                shadeClose: true,
+                resize: true,
+                resizing: function (layero) {
+                },
+                success: function (layero, layerIndex, classP) {
+                    var attachHtml = [
+                        '<div class="layui-upload" style="margin-left: 30px;">',
+                        '<form id="form_', filter, '" lay-filter="form_', filter, '" class="layui-form" style="margin:15px 30px 0 -80px;" ></form>',
+                        '<button id="', filter, '_selectBtn" type="button" class="layui-btn layui-btn-sm layui-btn-normal">閫夋嫨鏂囦欢</button>',
+                        //'<button id="',filter,'_uploadAction" type="button" class="layui-btn layui-btn-sm" style="margin-left: 15px;">寮�濮嬩笂浼�</button>',
+                        '<input type="hidden" name="releaseFileOids">',
+                        '<div class="layui-upload-list  layui-table-view">',
+                        '<table cellspacing="0" cellpadding="0" border="0" class="layui-table" style="width: 100%;">',
+                        '<thead>',
+                        '<tr><th>鏂囦欢鍚�</th><th>澶у皬</th><th>鐘舵��</th><th style="width: 90px">鎿嶄綔</th></tr>' +
+                        '</thead>',
+                        '<tbody id="', filter, '_uploadList"></tbody>',
+                        '</table>',
+                        '</div>',
+                        '</div>'
+                    ]
+                    $('#' + filter + '').append(attachHtml.join(''))
+                    if (configData.controlSecret == true || configData.controlSecret == 'true') {
+                        $webUtil.get('webEnumController/getDataEnum', {
+                            oid: $webUtil.replaceFreeMarker(options.sourceData.oid, options.sourceData, {}),
+                            btmname: (options.sourceData.btmname && $webUtil.replaceFreeMarker(options.sourceData.btmname, options.sourceData, {})) || paramVOS.linktype || ''
+                        }, function (result) {
+                            if (result.success) {
+                                layui.form.addItems('form_' + filter, [{
+                                    name: 'secretGrade',
+                                    text: '瀵嗙骇',
+                                    type: 'combox',
+                                    verify: 'number',
+                                    defaultValue: 1,
+                                    data: result.obj,
+                                }], function () {
+                                }, {}, {
+                                    defaultColumnOneRow: 1
+                                });
+                            } else {
+                                $webUtil.showErrorMsg(result.msg || '鑾峰彇琛ㄥ崟澶辫触');
+                            }
+
+                        }, function (xhr, error) {
+                            $webUtil.showErrorMsg("鑾峰彇琛ㄥ崟鍑虹幇浜嗛敊璇紝鍙兘鏄枃浠舵湇鍔℃病鏈夊惎鍔�");
+                        }, paramVOS.backpath)
+
+                    }
+                    var uploadListView = $('#' + filter + '_uploadList');
+                    uploadListIns = layui.upload.render({
+                        elem: '#' + filter + '_selectBtn'
+                        , url: paramVOS.backpath + paramVOS.url
+                        , accept: 'file'
+                        , multiple: true
+                        , auto: false//(layui.device().ie && layui.device().ie < 10)?true:false
+                        , data: {}
+                        , bindAction: '#' + filter + '_uploadAction'
+                        , before: function (obj) {
+                            var uploadData = {
+                                fileDocClassify: paramVOS.filedocclassify,
+                                fileDocClassifyName: paramVOS.filedocclassifyname,
+                                ownbizOid: $webUtil.replaceFreeMarker(options.sourceData.oid, options.sourceData, {}),
+                                ownBtmname: (options.sourceData.btmname && $webUtil.replaceFreeMarker(options.sourceData.btmname, options.sourceData, {})) || paramVOS.linktype || '',
+                                updateFileFlag: paramVOS.updatefileflag || false,
+                                effect: paramVOS.effect || true,
+                                fileOid: paramVOS.updatefileflag == "true" ? selectData[0].oid : '',
+                                name: 'file',
+                                checkSameFile: true,
+                                secretGrade: -1
+                            }
+                            if (configData.controlSecret == true || configData.controlSecret == 'true') {
+                                uploadData.secretGrade = layui.form.getValues('form_' + filter, true).secretGrade;
+                                if (uploadData.secretGrade == '') {
+                                    $webUtil.showErrorMsg("璇烽�夋嫨瀵嗙骇");
+                                    return false;
+                                }
+                                if (options.sourceData.secretgrade || options.sourceData.secretGrade) {
+                                    var selectGrade = options.sourceData.secretgrade || options.sourceData.secretGrade;
+                                    selectGrade = parseInt(selectGrade);
+                                    if (parseInt(uploadData.secretGrade) > selectGrade) {
+                                        $webUtil.showErrorMsg("鏂囦欢瀵嗙骇涓嶈兘澶т簬鎵�閫夋暟鎹殑瀵嗙骇");
+                                        return false;
+                                    }
+                                }
+                            }
+                            obj.setData(uploadData)
+                            $webUtil.showProgress("鏂囦欢涓婁紶涓�︹��");
+                        }
+                        , choose: function (obj) {
+                            var files = this.files = obj.pushFile();//灏嗘瘡娆¢�夋嫨鐨勬枃浠惰拷鍔犲埌鏂囦欢闃熷垪
+                            var elemFiles= this.elemFiles = obj.getElemFiles()//閽堝ie
+                            //璇诲彇鏈湴鏂囦欢
+                            obj.preview(function (index, file, result) {
+                                var tr = $(['<tr id="upload-' + index + '">'
+                                    , '<td>' + file.name + '</td>'
+                                    , '<td>' + (file.size ? (file.size / 1024).toFixed(1) + 'kb' : '') + '</td>'
+                                    , '<td>绛夊緟涓婁紶</td>'
+                                    , '<td>'
+                                    , '<a class="layui-btn layui-btn-xs attach-reload layui-hide">閲嶄紶</a>'
+                                    , '<a class="layui-btn layui-btn-xs layui-btn-danger attach-delete">鍒犻櫎</a>'
+                                    , '</td>'
+                                    , '</tr>'].join(''));
+
+                                //鍗曚釜閲嶄紶
+                                tr.find('.attach-reload').on('click', function () {
+                                    obj.upload(index, file);
+                                });
+
+                                //鍒犻櫎
+                                tr.find('.attach-delete').on('click', function () {
+                                    delete files[index]; //鍒犻櫎瀵瑰簲鐨勬枃浠�
+                                    if(layui.device().ie  && layui.device().ie<10){
+                                        $('#'+elemFiles[index][0].id).remove()
+                                        //elemFiles[index].parent()[0].removeChild(elemFiles[index][0])
+                                        delete elemFiles[index];//閽堝ie
+                                    }
+
+                                    var oid = tr.attr('oid');
+                                    if (oid) {
+                                        var val = $('#' + filter + ' [name="releaseFileOids"]').val();
+
+                                        val = val.replace(oid, '').replace(',,', ',')
+                                        if (val.indexOf(',') == 0) {
+                                            val = val.replace(',', '')
+                                        }
+                                        $('#' + filter + ' [name="releaseFileOids"]').val(val)
+                                    }
+                                    tr.remove();
+                                    uploadListIns.config.elem.next()[0].value = ''; //娓呯┖ input file 鍊硷紝浠ュ厤鍒犻櫎鍚庡嚭鐜板悓鍚嶆枃浠朵笉鍙��
+                                    $('.layui-upload-choose').remove();
+                                });
+
+                                uploadListView.append(tr);
+                            });
+                        }
+                        , done: function (res, index, upload) {
+                            if (res.success) { //涓婁紶鎴愬姛
+                                var tr = uploadListView.find('tr#upload-' + index)
+                                    , tds = tr.children();
+                                tds.eq(2).html('<span style="color: #5FB878;">' + (paramVOS.effect == "false" ? '浼犺緭瀹屾垚' : '宸茬敓鏁�') + '</span>');
+                                tr.attr('oid', res.obj.oid);
+                                tds.eq(0).text(res.obj.id);
+                                tds.eq(3).find('.attach-reload').addClass('layui-hide').html(''); //娓呯┖鎿嶄綔
+                                tds.eq(3).find('.attach-delete').addClass('layui-hide')
+                                var val = $('#' + filter + ' [name="releaseFileOids"]').val().split(',');
+                                if (val[0] == '') {
+                                    val[0] = res.obj.oid
+                                } else {
+                                    val.push(res.obj.oid)
+                                }
+
+                                $('#' + filter + ' [name="releaseFileOids"]').val(val.join(','))
+                                delete this.files[index]; //鍒犻櫎鏂囦欢闃熷垪宸茬粡涓婁紶鎴愬姛鐨勬枃浠�
+                                if(layui.device().ie  && layui.device().ie<10){
+                                    $('#'+this.elemFiles[index][0].id).remove()
+                                    delete this.elemFiles[index];
+                                }
+
+                                return;
+                            }
+                            this.error(index, upload, res.msg);
+                        },
+                        allDone: function (obj) {
+                            if (obj.total == obj.successful) {
+                                if (callback) {
+                                    callback()
+                                }
+                                if (options.callback) {
+                                    options.callback()
+                                }
+                                $webUtil.closeProgress();
+                                layer.close(addSaveIndex)
+                            }
+                        }
+                        , error: function (index, upload, msg) {
+                            var tr = uploadListView.find('tr#upload-' + index)
+                                , tds = tr.children();
+                            tds.eq(2).html('<span style="color: #FF5722;">涓婁紶澶辫触</span>');
+                            tds.eq(3).find('.attach-reload').removeClass('layui-hide'); //鏄剧ず閲嶄紶
+                            $webUtil.showErrorMsg(msg);
+                        }
+                    });
+                },
+                yes: function (layero) {
+                    if (paramVOS.updatefileflag == "true") {
+                        var trs = $('#' + filter + '_uploadList tr');
+                        if (trs.length > 1) {
+                            $webUtil.showErrorMsg("淇敼鏂囦欢鍙兘涓婁紶1涓枃浠�");
+                            return false;
+                        }
+                    }
+                    uploadListIns.upload();
+                },
+                btn2: function (layero) {
+                    if (options.callback) {
+                        options.callback()
+                    }
+                    layer.close(addSaveIndex)
+                },
+                cancel: function (layero) {
+                    if (options.callback) {
+                        options.callback()
+                    }
+                }
+            });
+        }
+
+        this.refresh = function () {
+            var that = this;
+
+        };
+
+        this.destory = function () {
+            var that = this;
+            var filter = "FileUpload_" + that.id;
+            $('#' + filter).remove()
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseLinkAddAction.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseLinkAddAction.js
new file mode 100644
index 0000000..8020952
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseLinkAddAction.js
@@ -0,0 +1,256 @@
+/**
+ * 閾炬帴绫诲瀷鐨勬坊鍔�
+ * @author wangting
+ * @date 2021-3-16
+ */
+layui.define(['layer','element','BaseAction'],function(exports){
+    var webUtil = $webUtil;
+    var Class = function() {
+        this.MODELNAME = "BaseLinkAddAction";
+        this.moduleKey = "BaseLinkAddAction";
+
+        this.getContent = function (id) {
+            var that = this;
+            that.id = id;
+            var html = [
+                '<div class="addOrEdit" id="addOrEdit_', id, ' lay-filter="addOrEdit_', id, '" style="display:block; text-align: center"></div>'
+            ].join("");
+            return html;
+        };
+
+        this.doAction = function (options) {
+            var that = this;
+            webUtil.copyConfig(that, that.moduleKey);
+            that.id = options.id;
+            var paramVOS = {
+                url: 'uiDataController/linkAddSave',
+                backPath: configData.compatibility ? path : configData.objectServicePath,
+                method: 'post',
+                uploadFileUrl: 'vciFileUploadController/uploadFile',
+                uploadFileBackPath: configData.compatibility ? path : configData.fileServicePath,
+                direction:false
+            }
+            $.extend(paramVOS, options.paramVOS);
+            options.paramVOS = paramVOS;
+
+            var baseAction = layui['BaseAction'];
+            baseAction.callPreEvent(options, that, function (options) {
+                that.doAdd(options, function () {
+                    baseAction.callPostEvent(options, that, options.callback);
+                });
+            });
+        };
+
+
+        this.doAdd = function (options,callback) {
+            var that = this;
+            var paramVOS = $webUtil.paramLow(options.paramVOS);
+            if (!paramVOS['form'] && !paramVOS['context']&& !paramVOS['content']) {
+                $webUtil.showErrorMsg("鎸夐挳閰嶇疆涓嶆纭�");
+                return false;
+            }
+            if (!paramVOS['linktype']) {
+                $webUtil.showErrorMsg("鎸夐挳閰嶇疆鏃爈inktype");
+                return false;
+            }
+            var selectData = options.dataStore;
+
+            var table = layui.table;
+            if (paramVOS.form) {
+                var filter = "addOrEdit_" + options.id;
+                var form = layui.form;
+                var content = ['<form id="', filter, '" lay-filter="', filter, '" class="layui-form" style="margin:15px 30px 50px 0;" ></form>'
+                ].join('');
+                var addSaveIndex = layer.open({
+                    type: 1,
+                    title: paramVOS.title,
+                    btn: ['淇濆瓨', '鍙栨秷'],
+                    //skin: 'layui-layer-lan',
+                    content: content,
+                    //area: ['1860px', '200px'],
+                    maxWidth: $(window).width() - 100,
+                    maxHeight: $(window).height() - 100,
+                    closeBtn: 1,
+                    shade: true,
+                    shadeClose: true,
+                    resize: true,
+                    resizing: function (layero) {
+                        form.doResize(filter);
+                    },
+                    success: function (layero,layerIndex,classP) {
+                        $webUtil.get('webUIController/getFormDefineById', {
+                            btmType: paramVOS.linktype,
+                            id: paramVOS.form
+                        }, function (result) {
+                            if (result.success) {
+                                var formCallback = function () {
+                                    var initValues = form.getValues(filter,true);
+                                    if (paramVOS.initvalue) {
+                                        var urlobj = $webUtil.getUrlParams('?' + paramVOS.initvalue, {}, '#', ';');
+                                        initValues = urlobj.params;
+                                    }
+                                    var treeInitKeyMap = {
+                                        "f_oid":(paramVOS.foid||paramVOS.f_oid||options.sourceData.oid),
+                                        "f_btwname":(paramVOS.fbtmname || paramVOS.f_btmname || paramVOS.f_btwname||options.sourceData.btmname),
+                                        "t_oid":(paramVOS.toid || paramVOS.t_oid),
+                                        "t_btwname":(paramVOS.tbtmname || paramVOS.t_btmname),
+                                        "foid":(paramVOS.foid||paramVOS.f_oid||options.sourceData.oid),
+                                        "fbtwname":(paramVOS.fbtmname || paramVOS.f_btmname || paramVOS.f_btwname||options.sourceData.btmname),
+                                        "toid":(paramVOS.toid || paramVOS.t_oid),
+                                        "tbtwname":(paramVOS.tbtmname || paramVOS.t_btmname)
+                                    }
+                                    for(var key in treeInitKeyMap){
+                                        var value = treeInitKeyMap[key];
+                                        if(value && $webUtil.isNotNull(value)){
+                                            initValues[key] = $webUtil.replaceFreeMarker(value,selectData,options.sourceData);
+                                        }
+                                    }
+                                    form.setValues(initValues,filter);
+                                    var baseAction = layui['BaseAction'];
+                                    if ($('#' + filter + ' .layui-upload-drag').length > 0) {
+                                        //鏂囦欢涓婁紶
+                                        baseAction.renderUploadFile('#' + filter + ' .layui-upload-drag',paramVOS)
+                                    }
+
+                                    if(paramVOS.uploadattachment &&paramVOS.uploadattachment == 'true'){
+                                        //鏄剧ず涓婁紶闄勪欢
+                                        baseAction.renderUploadAttach(filter,paramVOS)
+                                    }
+
+                                    if ($('#' + filter + ' .webeditor').length > 0) {
+                                        //缂栬緫鍣�
+                                        var editId='editor_'+$('#' + filter + ' .webeditor').attr('name')
+                                        baseAction.renderEditor(editId,'',paramVOS,function (){
+                                            baseAction.relocationOpen(classP)
+                                        });
+                                    }
+                                    baseAction.relocationOpen(classP)
+
+                                }
+
+                                form.addItems(filter, result.obj.items, formCallback, {}, {
+                                    defaultColumnOneRow: result.obj.columnOneRow
+                                });
+                            } else {
+                                $webUtil.showErrorMsg(result.msg||'鑾峰彇琛ㄥ崟澶辫触');
+                            }
+
+                        }, function (xhr, error) {
+                            $webUtil.showErrorMsg("鑾峰彇琛ㄥ崟鍑虹幇浜嗛敊璇紝鍙兘鏄枃浠舵湇鍔℃病鏈夊惎鍔�");
+                        }, paramVOS.backpath)
+                    },
+                    yes: function (layero) {
+                        if (form.validata(filter)) {
+                            if (paramVOS.savebeforeevent) {
+                                var urlobj = $webUtil.getUrlParams(paramVOS.savebeforeevent);
+                                layui.use(urlobj.jsPath, function () {
+                                    var pathAction = layui[urlobj.jsPath];
+                                    var id = 'saveBeforeEvent_' + id;
+                                    pathAction[urlobj.methodName](paramVOS, id, selectData);
+                                })
+                            }
+                            var formValues = form.getDefaultValues(filter, true,form.linkDefaultKeys);
+                            if(formValues.otherValue.releaseFileOids){
+                                formValues.otherValue.releaseFileOids=formValues.otherValue.releaseFileOids.split(',');
+                            }
+                            if (!formValues.defaultValues.linkType) {
+                                formValues.defaultValues.linkType = paramVOS.linktype||paramVOS.type;
+                            }
+                            var datas = {
+                                formDefineId: paramVOS.form,
+                                preEvent: paramVOS.preevent,
+                                afterEvent: paramVOS.afterevent,
+                                beforeServerEvent: paramVOS.beforeserverevent,
+                                afterServerEvent: paramVOS.afterserverevent,
+                                releaseFileOids: formValues.otherValue.releaseFileOids||[],
+                                data: formValues.otherValue
+                            }
+                            $.extend(datas, formValues.defaultValues,formValues.otherValue);
+                            $webUtil.manualAjax(paramVOS.method, paramVOS.url, JSON.stringify(datas), function (result) {
+                                if (result.success) {
+                                    $webUtil.showMsgFromResult(result, paramVOS.title + '鎴愬姛');
+                                    that.refresh();
+                                    if (options.callback) {
+                                        options.callback()
+                                    }
+                                    if (paramVOS.saveafterevent) {
+                                        var urlobj = $webUtil.getUrlParams(paramVOS.saveafterevent);
+                                        layui.use(urlobj.jsPath, function () {
+                                            var pathAction = layui[urlobj.jsPath];
+                                            var id = 'saveBeforeEvent_' + id;
+                                            pathAction[urlobj.methodName](paramVOS, id, selectData);
+                                        })
+                                    }
+                                    if(callback){
+                                        callback();
+                                    }
+                                    layer.close(addSaveIndex);
+                                } else {
+                                    $webUtil.showErrorMsg(result.msg||paramVOS.title + '澶辫触');
+                                }
+                            }, function (xhr, error) {
+                                $webUtil.showErrorMsg("璁块棶鏈嶅姟鍣ㄥ嚭鐜颁簡閿欒锛屽彲鑳芥湇鍔″櫒娌℃湁寮�鍚紝鎴栬�呰繛鎺ュけ璐�");
+                            }, paramVOS.backpath);
+                        }
+                    },
+                    btn2: function (layero) {
+                        layer.close(addSaveIndex)
+                    }
+                });
+            } else if (paramVOS.context||paramVOS.content) {
+                layui.use('platform/objectService/VciUIContentViewer', function () {
+                    var newTabClass = layui['platform/objectService/VciUIContentViewer'];
+                    newTabClass.id = that.id;
+                    newTabClass.multiCompent = true;
+                    newTabClass.sourceData = {
+                        btmType: paramVOS.type,
+                        content: paramVOS.context,
+                        actionData: {
+                            selectData: options.sourceData,
+                            isOpen: true,
+                            paramVOS: paramVOS
+                        }
+                    };
+                    var filter = "addOrEdit_" + that.id;
+                    var content = ['<div id="', filter, '" lay-filter="', filter, '" style="margin:5px;" >',newTabClass.getContent(that.id),'</div>']
+                    var addSaveIndex = layer.open({
+                        type: 1,
+                        title: paramVOS.title,
+                        //skin: 'layui-layer-lan',
+                        content: content.join(''),
+                        shade: true,
+                        shadeClose: true,
+                        area: [$(window).width() - 100+'px', $(window).height() - 100+'px'],
+                        resize: true,
+                        resizing: function (layero) {
+                        },
+                        success: function (layero,layerIndex,classP) {
+                            newTabClass.init(that.id, newTabClass.sourceData,function (){
+                                //layui['BaseAction'].relocationOpen(classP)
+                            })
+
+                        },
+                        cancel: function (layero) {
+                            if (options.callback) {
+                                options.callback()
+                            }
+                        }
+                    });
+                });
+            }
+        }
+
+        this.refresh = function () {
+            var that = this;
+
+        };
+
+        this.destory = function () {
+            var that = this;
+            var filter = "addOrEdit_" + that.id;
+            $('#' + filter).remove()
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseLinkDeleteAction.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseLinkDeleteAction.js
new file mode 100644
index 0000000..1ba897a
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseLinkDeleteAction.js
@@ -0,0 +1,99 @@
+/**
+ * 閾炬帴绫诲瀷鐨勫垹闄�
+ * @author weidy
+ * @date 2021-3-19
+ */
+layui.define(['layer','element','BaseAction'],function(exports){
+    var webUtil = $webUtil;
+    var Class = function() {
+        this.MODELNAME = "BaseLinkDeleteAction";
+        this.moduleKey = "BaseLinkDeleteAction";
+        this.id = "BaseLinkDeleteAction";
+        this.backPath = configData.compatibility?path:configData.objectServicePath;
+        this.doAction = function (options) {
+            if(!options || !options.dataStore ){
+                $webUtil.showErrorMsg("鎸夐挳鐨勪紶閫掍俊鎭笉姝g‘锛岃寮�鍙戜汉鍛樻鏌�");
+                return false;
+            }
+            var that = this;
+            webUtil.copyConfig(that, that.moduleKey);
+            var finallyCallback = options.callback;
+            var params = $webUtil.paramLow(options.paramVOS);
+            options.paramVOS = params;
+            if(options.dataStore.length<1){
+                $webUtil.showErrorMsg("璇烽�夋嫨闇�瑕佸垹闄ょ殑鏁版嵁");
+                return false;
+            }
+            if(!params.multi && options.dataStore.length > 1){
+                $webUtil.showErrorMsg("浠呰兘閫夋嫨涓�鏉℃暟鎹潵鎿嶄綔");
+                return false;
+            }
+            var baseAction = layui['BaseAction'];
+            baseAction.callPreEvent(options,that,function (options) {
+                $webUtil.showConfirmMsg($webUtil.replaceFreeMarker(params.confirmmsg,options.dataStore,options.sourceData) || ('鏄惁鍒犻櫎' + (options.dataStore.length==1?"杩欐潯":"杩欎簺") + '鏁版嵁' + (params.cascade?",濡傛灉鏈変笅绾ф暟鎹細绾ц仈鍒犻櫎":"")),function (r) {
+                    if(r){
+                        that.doDelete(options,function (){
+                            baseAction.callPostEvent(options,that,finallyCallback);
+                        });
+                    }
+                });
+            });
+        };
+        this.doDelete = function (options,callback) {
+            var that = this;
+            var submitData = {
+                checkLinkedFlag:options.paramVOS.checklinkedflag,
+                cascade:options.paramVOS.cascade,
+                adminCascade:options.paramVOS.admincascade,
+                deleteToData:options.paramVOS.deleteToData,
+                deleteFromData:options.paramVOS.deleteFromData
+            }
+            if(options.paramVOS.checkonback){
+                submitData['checkNotDelete']=options.paramVOS.checknotdelete;
+                submitData['checkNotDeleteMsg']=options.paramVOS.checknotdeletemsg;
+            }else if(options.paramVOS.checknotdelete){
+                var notdelete = options.paramVOS.checknotdelete.split('&');
+                var checknotdelete=false;
+                var msgStore={};
+                layui.each(notdelete, function (i, item) {
+                    for (var j=0;j<options.dataStore.lenght;j++){
+                        if (options.dataStore[j][item.split('=')[0]] == item.split('=')[1]) {
+                            checknotdelete=true;
+                            msgStore=options.dataStore[j]
+                            return false;
+                        }
+                    }
+                })
+                if (checknotdelete) {
+                    $webUtil.showErrorMsg($webUtil.replaceFreeMarker(options.paramVOS.checknotdeletemsg,msgStore,{}) || '褰撳墠鏁版嵁涓嶅厑璁稿垹闄�');
+                    return false;
+                }
+            }
+            submitData.dataList = options.dataStore;
+            if(submitData.dataList && submitData.dataList.length > 0){
+                layui.each(submitData.dataList,function (_index,_item) {
+                    if(!_item.linkType || $webUtil.isNull(_item.linkType)){
+                        _item.linkType =options.paramVOS.linktype;
+                    }
+                })
+            }
+            $webUtil.manualAjax(options.paramVOS.method||'delete',options.paramVOS.url || 'uiDataController/linkDeleteData',JSON.stringify(submitData),function(result){
+                if(result.success){
+                    $webUtil.showMsgFromResult(result,options.paramVOS.successMsg||'鍒犻櫎鎴愬姛');
+                    if(callback){
+                        callback();
+                    }
+                }else{
+                    $webUtil.showErrorMsg(result.msg);
+                }
+            },function (error,xhr){
+                $webUtil.showErrorMsg("鎵ц鍒犻櫎鍑洪敊锛屽彲鑳芥槸鏈嶅姟娌℃湁鍚姩锛屾偍鍙互绋嶅悗鍐嶈瘯");
+            },options.paramVOS.backpath||that.backPath);
+        };
+        this.destory = function () {
+            var that = this;
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseLinkEditAction.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseLinkEditAction.js
new file mode 100644
index 0000000..d647da1
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseLinkEditAction.js
@@ -0,0 +1,294 @@
+/**
+ * 閾炬帴绫诲瀷鐨勪慨鏀�
+ * @author wangting
+ * @date 2021-3-16
+ */
+layui.define(['layer','element','BaseAction'],function(exports){
+    var webUtil = $webUtil;
+    var Class = function() {
+        this.MODELNAME = "BaseLinkEditAction";
+        this.moduleKey = "BaseLinkEditAction";
+        this.getContent = function (id, options) {
+            var that = this;
+            that.id = id;
+            var html = [
+                '<div class="addOrEdit" id="addOrEdit_', id, ' lay-filter="addOrEdit_', id, '" style="display:block; text-align: center"></div>'
+            ].join("");
+            return html;
+        };
+        this.doAction = function (options) {
+            var that = this;
+            webUtil.copyConfig(that, that.moduleKey);
+            that.id = options.id;
+            var paramVOS={
+                getDataUrl:'uiDataController/dataFormQuery',
+                getDataBackPath: configData.compatibility ? path : configData.objectServicePath,
+                getDataMethod:'post',
+                url:'uiDataController/linkEditSave',
+                backPath:configData.compatibility ? path : configData.objectServicePath,
+                method:'put',
+                uploadFileUrl:'vciFileUploadController/uploadFile',
+                uploadFileBackPath: configData.compatibility ? path : configData.fileServicePath
+            }
+            $.extend(paramVOS,options.paramVOS);
+            options.paramVOS=paramVOS;
+
+            var baseAction = layui['BaseAction'];
+            baseAction.callPreEvent(options, that, function (options) {
+                that.doEdit(options, function () {
+                    baseAction.callPostEvent(options, that, options.callback);
+                });
+            });
+        };
+
+        this.doEdit=function (options,callback){
+            var that = this;
+            var paramVOS=$webUtil.paramLow(options.paramVOS);
+            if (!paramVOS['form'] && !paramVOS['context']&& !paramVOS['content']) {
+                $webUtil.showErrorMsg("鎸夐挳閰嶇疆涓嶆纭�");
+                return false;
+            }
+            if (!paramVOS['linktype']) {
+                $webUtil.showErrorMsg("鎸夐挳閰嶇疆鏃爈inktype");
+                return false;
+            }
+            that.id=options.id;
+            var selectData=options.dataStore;
+            if(selectData.length<1){
+                $webUtil.showErrorMsg("璇烽�夋嫨涓�鏉¢渶瑕佷慨鏀圭殑鏁版嵁");
+                return false;
+            }
+            if(!paramVOS.multi && selectData.length > 1){
+                $webUtil.showErrorMsg("浠呰兘閫夋嫨涓�鏉℃暟鎹潵鎿嶄綔");
+                return false;
+            }
+            if(paramVOS.checknotedit) {
+                var notedit = paramVOS.checknotedit.split('&');
+                var checknotedit=false;
+                layui.each(notedit, function (i, item) {
+                    if (options.dataStore[0][item.split('=')[0]] == item.split('=')[1]) {
+                        checknotedit=true;
+                        return false;
+                    }
+                })
+                if (checknotedit) {
+                    $webUtil.showErrorMsg($webUtil.replaceFreeMarker(paramVOS.checknoteditmsg,options.dataStore,{}) || '褰撳墠鏁版嵁涓嶅厑璁镐慨鏀�');
+                    return false;
+                }
+            }
+            var table = layui.table;
+            if (paramVOS.form) {
+                var filter = "addOrEdit_" + that.id;
+                var form = layui.form;
+                var content = ['<form id="', filter, '" lay-filter="', filter, '" class="layui-form" style="margin:15px 30px 50px 0;" ></form>'
+                ].join('');
+                var addSaveIndex = layer.open({
+                    type: 1,
+                    title: paramVOS.title,
+                    btn: ['淇濆瓨', '鍙栨秷'],
+                    //skin: 'layui-layer-lan',
+                    content: content,
+                    //area: ['1860px', '200px'],
+                    maxWidth: $(window).width() - 100,
+                    maxHeight: $(window).height() - 100,
+                    closeBtn: 1,
+                    shade: true,
+                    shadeClose: true,
+                    resize: true,
+                    resizing: function (layero) {
+                        form.doResize(filter);
+                    },
+                    success: function (layero,layerIndex,classP) {
+                        $webUtil.get('webUIController/getFormDefineById', {
+                            btmType: paramVOS.linktype,
+                            id: paramVOS.form
+                        }, function (result) {
+                            if (result.success) {
+                                var formCallback = function () {
+                                    var baseAction = layui['BaseAction'];
+                                    if ($('#' + filter + ' .layui-upload-drag').length > 0) {
+                                        baseAction.renderUploadFile('#' + filter + ' .layui-upload-drag', paramVOS)
+                                    }
+                                    if (paramVOS.uploadattachment && paramVOS.uploadattachment == 'true') {
+                                        //鏄剧ず涓婁紶闄勪欢
+                                        baseAction.renderUploadAttach(filter, paramVOS)
+                                    }
+                                    if ($('#' + filter + ' .webeditor').length > 0) {
+                                        //缂栬緫鍣�
+                                        var editId='editor_'+$('#' + filter + ' .webeditor').attr('name')
+                                        baseAction.renderEditor(editId,'',paramVOS,function (){
+                                            baseAction.relocationOpen(classP)
+                                        });
+                                    }
+                                    baseAction.relocationOpen(classP)
+
+
+                                    //鑾峰彇閫変腑鐨勬暟鎹�
+                                    var sourceDataMap = {};
+                                    layui.each(options.sourceData, function (i, item) {
+                                        if(item.constructor === Object) return;
+                                        sourceDataMap['sourceData["' + i + '"]'] = item;
+                                    })
+                                    $webUtil.ajax(paramVOS.getdatamethod, paramVOS.getdataurl, $.extend({
+                                            btmname: paramVOS.type,
+                                            formDefineId: paramVOS.form,
+                                            oid: selectData[0].oid
+                                        }, sourceDataMap),
+                                        function (result) {
+                                            if (result.success) {
+                                                form.setValues(result.obj.data, filter);
+                                                //鏂囦欢
+                                                if (result.obj.filePathFieldMap) {
+                                                    var filepath = layui.$('#' + filter + ' .uploadDemoView input.uploadFileOid').attr('name');
+                                                    layui.$('#' + filter + ' .uploadDemoView').removeClass('layui-hide').find('img').attr('src', paramVOS.uploadfilebackpath + 'vciFileDownloadController/downloadByFileOid?fileOid=' + result.obj.filePathFieldMap[filepath].oid + '&' + TOKEN_KEY + '=' + $webUtil.getToken());
+                                                    layui.$('#' + filter + ' .uploadDemoView input.uploadFileOid').val(result.obj.filePathFieldMap[filepath].filePath);
+                                                }
+                                                //闄勪欢
+                                                if (result.obj.attachmentFileVOs && result.obj.attachmentFileVOs.length > 0) {
+                                                    var val = [];
+                                                    layui.each(result.obj.attachmentFileVOs, function (i, attachmentFile) {
+                                                        val.push(attachmentFile.oid)
+                                                    })
+                                                    $('#' + filter + ' [name="releaseFileOids"]').val(val.join(','))
+                                                }
+                                                if ($('#' + filter + ' .webeditor').length > 0) {
+                                                    //缂栬緫鍣�
+                                                    var initV=result.obj.data[$('#' + filter + ' .webeditor').attr('name')];
+                                                    editor.html(initV);
+                                                    $('#' + filter + ' .webeditor').val(initV);
+                                                }
+
+                                            }
+                                        }, function (xhr, error) {
+                                            $webUtil.showErrorMsg("鑾峰彇鏁版嵁鍑虹幇浜嗛敊璇紝鍙兘鏄枃浠舵湇鍔℃病鏈夊惎鍔�");
+                                        }, paramVOS.getdatabackpath)
+
+                                }
+
+                                form.addItems(filter, result.obj.items, formCallback, {}, {
+                                    defaultColumnOneRow: result.obj.columnOneRow
+                                });
+                            } else {
+                                $webUtil.showErrorMsg(result.msg||'鑾峰彇琛ㄥ崟澶辫触');
+                            }
+
+                        }, function (xhr, error) {
+                            $webUtil.showErrorMsg("鑾峰彇琛ㄥ崟鍑虹幇浜嗛敊璇紝鍙兘鏄枃浠舵湇鍔℃病鏈夊惎鍔�");
+                        }, paramVOS.backpath)
+                    },
+                    yes: function (layero) {
+                        if (form.validata(filter)) {
+                            if (paramVOS.savebeforeevent) {
+                                var urlobj=$webUtil.getUrlParams(paramVOS.savebeforeevent);
+                                layui.use(urlobj.jsPath, function () {
+                                    var pathAction = layui[urlobj.jsPath];
+                                    var id = 'saveBeforeEvent_' + id;
+                                    pathAction[urlobj.methodName](paramVOS, id, selectData);
+                                })
+                            }
+                            var formValues = form.getDefaultValues(filter, true,form.linkDefaultKeys);
+                            if(formValues.otherValue.releaseFileOids){
+                                formValues.otherValue.releaseFileOids=formValues.otherValue.releaseFileOids.split(',');
+                            }
+                            if (!formValues.defaultValues.linkType) {
+                                formValues.defaultValues.linkType = paramVOS.linktype||paramVOS.type;
+                            }
+                            var datas = {
+                                formDefineId: paramVOS.form,
+                                preEvent: paramVOS.prepvent,
+                                afterEvent: paramVOS.afterevent,
+                                beforeServerEvent: paramVOS.beforeserverevent,
+                                afterServerEvent: paramVOS.afterserverevent,
+                                releaseFileOids: formValues.otherValue.releaseFileOids||[],
+                                data: formValues.otherValue
+                            }
+                            $.extend(datas, formValues.defaultValues,formValues.otherValue);
+                            $webUtil.manualAjax(paramVOS.method, paramVOS.url, JSON.stringify(datas), function (result) {
+                                if (result.success) {
+                                    $webUtil.showMsgFromResult(result, paramVOS.title + '鎴愬姛');
+                                    that.refresh();
+                                    if (options.callback) {
+                                        options.callback()
+                                    }
+                                    if (paramVOS.saveafterevent) {
+                                        var urlobj=$webUtil.getUrlParams(paramVOS.saveafterevent);
+                                        layui.use(urlobj.jsPath, function () {
+                                            var pathAction = layui[urlobj.jsPath];
+                                            var id = 'saveBeforeEvent_' + id;
+                                            pathAction[urlobj.methodName](paramVOS, id, selectData);
+                                        })
+                                    }
+                                    if(callback){
+                                        callback();
+                                    }
+                                    layer.close(addSaveIndex);
+                                } else {
+                                    $webUtil.showErrorMsg(result.msg||paramVOS.title + '澶辫触');
+                                }
+                            }, function (xhr, error) {
+                                $webUtil.showErrorMsg("璁块棶鏈嶅姟鍣ㄥ嚭鐜颁簡閿欒锛屽彲鑳芥湇鍔″櫒娌℃湁寮�鍚紝鎴栬�呰繛鎺ュけ璐�");
+                            }, paramVOS.backpath);
+                        }
+                    },
+                    btn2: function (layero) {
+                        layer.close(addSaveIndex)
+                    }
+                });
+            } else if (paramVOS.context||paramVOS.content) {
+                layui.use('platform/objectService/VciUIContentViewer', function () {
+                    var newTabClass = layui['platform/objectService/VciUIContentViewer'];
+                    newTabClass.id = that.id;
+                    newTabClass.multiCompent = true;
+                    newTabClass.sourceData = {
+                        btmType: paramVOS.type,
+                        content: paramVOS.context,
+                        dataOid:options.dataStore[0].oid,
+                        actionData: {
+                            selectData: options.sourceData,
+                            isOpen: true,
+                            paramVOS: paramVOS
+                        }
+                    };
+
+                    var filter = "addOrEdit_" + that.id;
+                    var content = ['<div id="', filter, '" lay-filter="', filter, '" style="margin:5px;" >',newTabClass.getContent(that.id),'</div>']
+                    var addSaveIndex = layer.open({
+                        type: 1,
+                        title: paramVOS.title,
+                        //skin: 'layui-layer-lan',
+                        content: content.join(''),
+                        area: [$(window).width() - 100+'px', $(window).height() -100+'px'],
+                        shade: true,
+                        shadeClose: true,
+                        resize: true,
+                        resizing: function (layero) {
+                        },
+                        success: function (layero,layerIndex,classP) {
+                            newTabClass.init(that.id, newTabClass.sourceData,function (){
+                                //layui['BaseAction'].relocationOpen(classP)
+                            })
+                        },
+                        cancel: function (layero) {
+                            if (options.callback) {
+                                options.callback()
+                            }
+                        }
+                    });
+                });
+            }
+        }
+
+        this.refresh = function () {
+            var that = this;
+
+        };
+
+        this.destory = function () {
+            var that = this;
+            var filter = "addOrEdit_" + that.id;
+            $('#'+filter).remove()
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseRevisionAction.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseRevisionAction.js
new file mode 100644
index 0000000..b84c84a
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseRevisionAction.js
@@ -0,0 +1,305 @@
+/**
+ * 鎸夐挳澶勭悊 鍗囩増
+ * @author wangting
+ * @date 2021-4-7
+ */
+layui.define(['layer','element','BaseAction'],function(exports){
+    var webUtil = $webUtil;
+    var Class = function() {
+        this.MODELNAME = "BaseRevisionAction";
+        this.moduleKey = "BaseRevisionAction";
+        this.getContent = function (id, options) {
+            var that = this;
+            that.id = id;
+            var html = [
+                '<div class="addOrEdit" id="addOrEdit_', id, ' lay-filter="addOrEdit_', id, '" style="display:block; text-align: center"></div>'
+            ].join("");
+            return html;
+        };
+        this.doAction = function (options) {
+            var that = this;
+            webUtil.copyConfig(that, that.moduleKey);
+            that.id = options.id;
+            var paramVOS={
+                getDataUrl:'uiDataController/dataFormQuery',
+                getDataBackPath: configData.compatibility ? path : configData.objectServicePath,
+                getDataMethod:'post',
+                url:'uiDataController/upRevision',
+                backPath:configData.compatibility ? path : configData.objectServicePath,
+                method:'put',
+                uploadFileUrl:'vciFileUploadController/uploadFile',
+                uploadFileBackPath: configData.compatibility ? path : configData.fileServicePath
+            }
+            $.extend(paramVOS,options.paramVOS);
+            options.paramVOS=paramVOS;
+
+            var baseAction = layui['BaseAction'];
+            baseAction.callPreEvent(options, that, function (options) {
+                that.doEdit(options, function () {
+                    baseAction.callPostEvent(options, that, options.callback);
+                });
+            });
+        };
+
+        this.doEdit=function (options,callback){
+            var that = this;
+            var paramVOS=$webUtil.paramLow(options.paramVOS);
+            if (!paramVOS['form'] && !paramVOS['context']&& !paramVOS['content']) {
+                $webUtil.showErrorMsg("鎸夐挳閰嶇疆涓嶆纭�");
+                return false;
+            }
+            var id=options.id;
+            var selectData=options.dataStore;
+            if(selectData.length<1){
+                $webUtil.showErrorMsg("璇烽�夋嫨涓�鏉¢渶瑕佸崌鐗堢殑鏁版嵁");
+                return false;
+            }
+            if(!paramVOS.multi && selectData.length > 1){
+                $webUtil.showErrorMsg("浠呰兘閫夋嫨涓�鏉℃暟鎹潵鎿嶄綔");
+                return false;
+            }
+            if(paramVOS.checknotedit) {
+                var notedit = paramVOS.checknotedit.split('&');
+                var checknotedit=false;
+                layui.each(notedit, function (i, item) {
+                    if (options.dataStore[0][item.split('=')[0]] == item.split('=')[1]) {
+                        checknotedit=true;
+                        return false;
+                    }
+                })
+                if (checknotedit) {
+                    $webUtil.showErrorMsg($webUtil.replaceFreeMarker(paramVOS.checknoteditmsg,options.dataStore,{}) || '褰撳墠鏁版嵁涓嶅厑璁稿崌鐗�');
+                    return false;
+                }
+            }
+            var table = layui.table;
+            if (paramVOS.form) {
+                var filter = "addOrEdit_" + id;
+                var form = layui.form;
+                var content = ['<form id="', filter, '" lay-filter="', filter, '" class="layui-form" style="margin:15px 30px 50px 0;" ></form>'
+                ].join('');
+                var addSaveIndex = layer.open({
+                    type: 1,
+                    title: paramVOS.title,
+                    btn: ['淇濆瓨', '鍙栨秷'],
+                    //skin: 'layui-layer-lan',
+                    content: content,
+                    //area: ['1860px', '200px'],
+                    maxWidth: $(window).width() - 100,
+                    maxHeight: $(window).height() - 100,
+                    closeBtn: 1,
+                    shade: true,
+                    shadeClose: true,
+                    resize: true,
+                    resizing: function (layero) {
+                        form.doResize(filter);
+                    },
+                    success: function (layero,layerIndex,classP) {
+                        $webUtil.get('webUIController/getFormDefineById', {
+                            btmType: paramVOS.type,
+                            id: paramVOS.form
+                        }, function (result) {
+                            if (result.success) {
+                                var formCallback = function () {
+                                    var baseAction = layui['BaseAction'];
+                                    if ($('#' + filter + ' .layui-upload-drag').length > 0) {
+                                        baseAction.renderUploadFile('#' + filter + ' .layui-upload-drag', paramVOS)
+                                    }
+                                    if (paramVOS.uploadattachment && paramVOS.uploadattachment == 'true') {
+                                        //鏄剧ず涓婁紶闄勪欢
+                                        baseAction.renderUploadAttach(filter, paramVOS)
+                                    }
+                                    if ($('#' + filter + ' .webeditor').length > 0) {
+                                        //缂栬緫鍣�
+                                        var editId='editor_'+$('#' + filter + ' .webeditor').attr('name')
+                                        baseAction.renderEditor(editId,'',paramVOS,function (){
+                                            baseAction.relocationOpen(classP)
+                                        });
+                                    }
+                                    baseAction.relocationOpen(classP)
+
+
+                                    //鑾峰彇閫変腑鐨勬暟鎹�
+                                    var sourceDataMap = {};
+                                    layui.each(options.sourceData, function (i, item) {
+                                        if(item.constructor === Object) return;
+                                        sourceDataMap['sourceDataMap["' + i + '"]'] = item;
+                                    })
+                                    $webUtil.ajax(paramVOS.getdatamethod, paramVOS.getdataurl, $.extend({
+                                            btmname: paramVOS.type,
+                                            formDefineId: paramVOS.form,
+                                            oid: selectData[0].oid
+                                        }, sourceDataMap),
+                                        function (result) {
+                                            if (result.success) {
+                                                form.setValues(result.obj.data, filter);
+                                                //鏂囦欢
+                                                if (result.obj.filePathFieldMap) {
+                                                    var filepath = layui.$('#' + filter + ' .uploadDemoView input.uploadFileOid').attr('name');
+                                                    layui.$('#' + filter + ' .uploadDemoView').removeClass('layui-hide').find('img').attr('src', paramVOS.uploadfilebackpath + 'vciFileDownloadController/downloadByFileOid?fileOid=' + result.obj.filePathFieldMap[filepath].oid + '&' + TOKEN_KEY + '=' + $webUtil.getToken());
+                                                    layui.$('#' + filter + ' .uploadDemoView input.uploadFileOid').val(result.obj.filePathFieldMap[filepath].filePath);
+                                                }
+                                                //闄勪欢
+                                                if (result.obj.attachmentFileVOs && result.obj.attachmentFileVOs.length > 0) {
+                                                    var val = [];
+                                                    layui.each(result.obj.attachmentFileVOs, function (i, attachmentFile) {
+                                                        val.push(attachmentFile.oid)
+                                                    })
+                                                    $('#' + filter + ' [name="releaseFileOids"]').val(val.join(','))
+                                                }
+                                                if ($('#' + filter + ' .webeditor').length > 0) {
+                                                    //缂栬緫鍣�
+                                                    var initV=result.obj.data[$('#' + filter + ' .webeditor').attr('name')];
+                                                    editor.html(initV);
+                                                    $('#' + filter + ' .webeditor').val(initV);
+                                                }
+
+                                            }
+                                        }, function (xhr, error) {
+                                            $webUtil.showErrorMsg("鑾峰彇鏁版嵁鍑虹幇浜嗛敊璇紝鍙兘鏄枃浠舵湇鍔℃病鏈夊惎鍔�");
+                                        }, paramVOS.getdatabackpath)
+
+                                }
+
+                                form.addItems(filter, result.obj.items, formCallback, {}, {
+                                    defaultColumnOneRow: result.obj.columnOneRow
+                                });
+                            } else {
+                                $webUtil.showErrorMsg(result.msg||'鑾峰彇琛ㄥ崟澶辫触');
+                            }
+
+                        }, function (xhr, error) {
+                            $webUtil.showErrorMsg("鑾峰彇琛ㄥ崟鍑虹幇浜嗛敊璇紝鍙兘鏄枃浠舵湇鍔℃病鏈夊惎鍔�");
+                        }, paramVOS.backpath)
+                    },
+                    yes: function (layero) {
+                        if (form.validata(filter)) {
+                            var saveFn=function (){
+                                var formValues = form.getDefaultValues(filter, true);
+                                if(formValues.otherValue.releaseFileOids){
+                                    formValues.otherValue.releaseFileOids=formValues.otherValue.releaseFileOids.split(',');
+                                }
+                                if (!formValues.defaultValues.btmname) {
+                                    formValues.defaultValues.btmname = paramVOS.type;
+                                }
+                                var datas = {
+                                    formDefineId: paramVOS.form,
+                                    upVersion:paramVOS.upversion,
+                                    preEvent: paramVOS.prepvent,
+                                    afterEvent: paramVOS.afterevent,
+                                    beforeServerEvent: paramVOS.beforeserverevent,
+                                    afterServerEvent: paramVOS.afterserverevent,
+                                    releaseFileOids: formValues.otherValue.releaseFileOids||[],
+                                    data: formValues.otherValue
+                                }
+                                $.extend(datas, formValues.defaultValues);
+                                datas['copyfromversion']=formValues.defaultValues.oid;
+                                datas.oid=undefined;
+                                $webUtil.manualAjax(paramVOS.method, paramVOS.url, JSON.stringify(datas), function (result) {
+                                    if (result.success) {
+                                        $webUtil.showMsgFromResult(result, paramVOS.title + '鎴愬姛');
+                                        that.refresh();
+                                        if (options.callback) {
+                                            options.callback()
+                                        }
+                                        if (paramVOS.saveafterevent) {
+                                            var urlobj=$webUtil.getUrlParams(paramVOS.saveafterevent);
+                                            layui.use(urlobj.jsPath, function () {
+                                                var pathAction = layui[urlobj.jsPath];
+                                                var id = 'saveBeforeEvent_' + id;
+                                                pathAction[urlobj.methodName](paramVOS, id, selectData);
+                                            })
+                                        }
+                                        if(callback){
+                                            callback()
+                                        }
+                                        layer.close(addSaveIndex);
+                                    } else {
+                                        $webUtil.showErrorMsg(result.msg||paramVOS.title + '澶辫触');
+                                    }
+                                }, function (xhr, error) {
+                                    $webUtil.showErrorMsg("璁块棶鏈嶅姟鍣ㄥ嚭鐜颁簡閿欒锛屽彲鑳芥湇鍔″櫒娌℃湁寮�鍚紝鎴栬�呰繛鎺ュけ璐�");
+                                }, paramVOS.backpath);
+
+                            }
+                            if (paramVOS.savebeforeevent) {
+                                var urlobj=$webUtil.getUrlParams(paramVOS.savebeforeevent);
+                                layui.use(urlobj.jsPath, function () {
+                                    var pathAction = layui[urlobj.jsPath];
+                                    var id = 'saveBeforeEvent_' + id;
+                                    pathAction[urlobj.methodName]({
+                                        paramVOS: paramVOS,
+                                        id: id,
+                                        dataStore: selectData,
+                                        sourceData:options.sourceData,
+                                        callback: saveFn
+                                    });
+                                })
+                            }else{
+                                saveFn();
+                            }
+                        }
+                    },
+                    btn2: function (layero) {
+                        layer.close(addSaveIndex)
+                    }
+                });
+            } else if (paramVOS.context||paramVOS.content) {
+                layui.use('platform/objectService/VciUIContentViewer', function () {
+                    var newTabClass = layui['platform/objectService/VciUIContentViewer'];
+                    newTabClass.id = id;
+                    newTabClass.multiCompent = true;
+                    newTabClass.sourceData = {
+                        btmType: paramVOS.type,
+                        content: paramVOS.context,
+                        dataOid:options.dataStore[0].oid,
+                        actionData: {
+                            selectData: options.sourceData,
+                            dataStore:options.dataStore,
+                            isOpen: true,
+                            paramVOS: paramVOS
+                        }
+                    };
+
+                    var filter = "addOrEdit_" + id;
+                    var content = ['<div id="', filter, '" lay-filter="', filter, '" style="margin:5px;" >',newTabClass.getContent(id),'</div>']
+                    var addSaveIndex = layer.open({
+                        type: 1,
+                        title: paramVOS.title,
+                        //skin: 'layui-layer-lan',
+                        content: content.join(''),
+                        area: [$(window).width() - 100+'px', $(window).height() - 100+'px'],
+                        shade: true,
+                        shadeClose: true,
+                        resize: true,
+                        resizing: function (layero) {
+                        },
+                        success: function (layero,layerIndex,classP) {
+                            newTabClass.init(id, newTabClass.sourceData,function (){
+                                //layui['BaseAction'].relocationOpen(classP)
+                            })
+                        },
+                        cancel: function (layero) {
+                            if (options.callback) {
+                                options.callback()
+                            }
+                        }
+                    });
+                });
+            }
+        }
+
+        this.refresh = function () {
+            var that = this;
+
+        };
+
+        this.destory = function () {
+            var that = this;
+            var filter = "addOrEdit_" + that.id;
+            $('#'+filter).remove()
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseStartWorkflowAction.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseStartWorkflowAction.js
new file mode 100644
index 0000000..e29ba4e
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseStartWorkflowAction.js
@@ -0,0 +1,137 @@
+/**
+ * 娴佺▼鎸夐挳澶勭悊
+ * @author wangting
+ * @date 2021-4-19
+ */
+layui.define(['layer','element','BaseAction'],function(exports){
+    var webUtil = $webUtil;
+    var Class = function() {
+        this.MODELNAME = "BaseStartWorkflowAction";
+        this.moduleKey = "BaseStartWorkflowAction";
+
+        this.getContent = function (id) {
+            var that = this;
+            that.id = id;
+            var html = [
+                '<div class="Workflow" id="Workflow_', id, ' lay-filter="addOrEdit_', id, '" style="display:block; text-align: center"></div>'
+            ].join("");
+            return html;
+        };
+
+        this.doAction = function (options) {
+            var that = this;
+            webUtil.copyConfig(that, that.moduleKey);
+            that.id = options.id;
+
+            var paramVOS = $webUtil.paramLow(options.paramVOS);
+            options.oldParamVOS=$.extend({},options.paramVOS);
+            options.paramVOS=paramVOS;
+            that.id=options.id;
+            var selectData=options.dataStore;
+            if(selectData.length<1){
+                $webUtil.showErrorMsg("璇烽�夋嫨涓�鏉¢渶瑕佸彂璧锋祦绋嬬殑鏁版嵁");
+                return false;
+            }
+            if(!paramVOS.multiprocess && selectData.length > 1){
+                $webUtil.showErrorMsg("浠呰兘閫夋嫨涓�鏉℃暟鎹彂璧锋祦绋�");
+                return false;
+            }
+            if(paramVOS.checknotprocess) {
+                var notprocess = paramVOS.checknotprocess.split('&');
+                var checknotprocess=false;
+                var msgStore={};
+                layui.each(notprocess, function (i, item) {
+                    for (var j=0;j<options.dataStore.lenght;j++){
+                        if (options.dataStore[j][item.split('=')[0]] == item.split('=')[1]) {
+                            checknotprocess=true;
+                            msgStore=options.dataStore[j]
+                            return false;
+                        }
+                    }
+
+                })
+                if (checknotprocess) {
+                    $webUtil.showErrorMsg($webUtil.replaceFreeMarker(paramVOS.checknotprocessmsg,msgStore,{}) || '褰撳墠鏁版嵁涓嶅厑璁稿彂璧锋祦绋�');
+                    return false;
+                }
+            }
+
+            var baseAction = layui['BaseAction'];
+            baseAction.callPreEvent(options, that, function (options) {
+                that.doAdd(options, function () {
+                    baseAction.callPostEvent(options, that, options.callback);
+                });
+            });
+        };
+
+
+        this.doAdd = function (options,callback) {
+            var that = this;
+            var paramVOS = options.paramVOS;
+            var selectData=options.dataStore;
+
+            var otherparamVOS=$.extend({},options.oldParamVOS);
+            delete otherparamVOS.title;
+            delete otherparamVOS.content;
+            delete otherparamVOS.table;
+            delete otherparamVOS.detailurl;
+            delete otherparamVOS.detailUrl;
+            //$webUtil.showConfirmMsg("鏄惁鍙戣捣娴佺▼锛�",function (r) {
+                //if (r) {
+                    layui.use(["process/vciWebStartProcess"], function () {
+                        var startProcess = layui['process/vciWebStartProcess'];
+                        startProcess.init();
+                        startProcess.showStartWindow(paramVOS.processclassify, selectData, {
+                            title: paramVOS.title,
+                            width:paramVOS.width,
+                            height:paramVOS.height,
+                            checkAllowAttributeValues:'Editing',
+                            allowAttributesMsg:'鍙湁鐘舵�佹槸銆愮紪杈戜腑銆戠殑璁″垝鎵嶅彲浠ュ彂璧锋祦绋�',
+                            startStatus: paramVOS.startstatus||'Auditing',
+                            resetStatus: paramVOS.resetstatus||'Editing',
+                            canUseTemplate:paramVOS.canusetemplate,
+                            isMutiProcess:paramVOS.multiprocess,
+                            autoProcessName:$webUtil.replaceFreeMarker(paramVOS.autoprocessname,options.dataStore,{}),
+                            variablesInfo:paramVOS.variablesinfo,
+                            tableDefineCode:paramVOS.table,
+                            detailUrl:paramVOS.detailurl,
+                            content:paramVOS.content,
+                            alwaysDisplayNext:paramVOS.alwaysdisplaynext,
+                            UIType:paramVOS.uitype,
+                            otherParam:otherparamVOS
+                        }, function (result) {
+                            if (paramVOS.afterevent) {
+                                var urlobj=$webUtil.getUrlParams(paramVOS.afterevent);
+                                layui.use(urlobj.jsPath, function () {
+                                    var pathAction = layui[urlobj.jsPath];
+                                    var id = 'saveBeforeEvent_' + id;
+                                    pathAction[urlobj.methodName](paramVOS, id, selectData);
+                                })
+                            }
+                            if (callback) {
+                                callback()
+                            }
+                            if (options.callback) {
+                                options.callback()
+                            }
+                        });
+                    });
+               // }
+            //});
+
+        }
+
+        this.refresh = function () {
+            var that = this;
+
+        };
+
+        this.destory = function () {
+            var that = this;
+            var filter = "Workflow_" + that.id;
+            $('#' + filter).remove()
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseTabViewAction.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseTabViewAction.js
new file mode 100644
index 0000000..af003b9
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseTabViewAction.js
@@ -0,0 +1,108 @@
+/**
+ * 鎸夐挳澶勭悊 椤甸潰灞曠ず涓簍ab閫夐」鍗�
+ * @author wangting
+ * @date 2021-3-16
+ */
+layui.define(['layer','element','BaseAction'],function(exports){
+    var webUtil = $webUtil;
+    var Class = function() {
+        this.MODELNAME = "BaseTabViewAction";
+        this.moduleKey = "BaseTabViewAction";
+
+        this.getContent = function (id) {
+            var that = this;
+            that.id = id;
+            var html = [
+                '<div class="addOrEdit" id="View_', id, ' lay-filter="View_', id, '" style="display:block; text-align: center"></div>'
+            ].join("");
+            return html;
+        };
+
+        this.doAction = function (options) {
+            var that = this;
+            webUtil.copyConfig(that, that.moduleKey);
+            that.id = options.id;
+            var paramVOS={
+                getDataUrl:'uiDataController/dataFormQuery',
+                getDataBackPath: configData.compatibility ? path : configData.objectServicePath,
+                getDataMethod:'post',
+                url:'uiDataController/editSave',
+                backPath:configData.compatibility ? path : configData.objectServicePath,
+                method:'put',
+                uploadFileUrl:'vciFileUploadController/uploadFile',
+                uploadFileBackPath: configData.compatibility ? path : configData.fileServicePath
+            }
+            $.extend(paramVOS,options.paramVOS);
+            options.paramVOS=paramVOS;
+
+            var baseAction = layui['BaseAction'];
+            baseAction.callPreEvent(options, that, function (options) {
+                that.doView(options, function () {
+                    baseAction.callPostEvent(options, that, options.callback);
+                });
+            });
+        };
+
+        this.doView=function (options) {
+            var that = this;
+            var paramVOS = $webUtil.paramLow(options.paramVOS);
+            var id = options.dataStore[0] ? options.dataStore[0].oid : options.id;
+            var text =paramVOS.title;
+            var url = "USEJS:platform/objectService/VciUIContentViewer";
+            if ($webUtil.isNotNull(paramVOS.customurl)) {
+                //鑷畾涔塲s
+                url = paramVOS.customurl;
+            }
+            /*var selectData = options.dataStore;
+            if(selectData.length<1){
+                $webUtil.showErrorMsg("璇烽�夋嫨涓�鏉¢渶瑕佹祻瑙堢殑鏁版嵁");
+                return false;
+            }
+            if(!paramVOS.multi && selectData.length > 1){
+                $webUtil.showErrorMsg("浠呰兘閫夋嫨涓�鏉℃暟鎹潵娴忚");
+                return false;
+            }*/
+            var menuObject = { //寮瑰嚭閫夐」鍗�
+                id: 'TabView_' + id,
+                url: url,
+                text: text,
+                multiCompent: true,
+                initSourceData: {
+                    btmType: paramVOS.type,
+                    content: paramVOS.context || paramVOS.content,
+                    actionData: {
+                        selectData: options.sourceData,
+                        paramVOS: paramVOS
+                    }
+                }
+            };
+            if (options.dataStore[0]) {
+                menuObject.initSourceData = {
+                    btmType: paramVOS.type,
+                    content: paramVOS.context || paramVOS.content,
+                    dataOid: options.dataStore[0].oid,
+                    readOnly: true,
+                    actionData: {
+                        selectData: options.sourceData,
+                        dataStore:options.dataStore,
+                        paramVOS: paramVOS
+                    }
+                }
+            }
+            portal.showTabByMenu('TabView_' + id, menuObject);
+        }
+
+        this.refresh = function () {
+            var that = this;
+
+        };
+
+        this.destory = function () {
+            var that = this;
+            var filter = "View_" + that.id;
+            $('#' + filter).remove()
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseViewAction.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseViewAction.js
new file mode 100644
index 0000000..51ac2b0
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/BaseViewAction.js
@@ -0,0 +1,216 @@
+/**
+ * 鎸夐挳澶勭悊 寮圭獥灞曠ず鍐呭
+ * @author wangting
+ * @date 2021-3-16
+ */
+layui.define(['layer','element','BaseAction'],function(exports){
+    var webUtil = $webUtil;
+    var Class = function() {
+        this.MODELNAME = "BaseViewAction";
+        this.moduleKey = "BaseViewAction";
+
+        this.getContent = function (id) {
+            var that = this;
+            that.id = id;
+            var html = [
+                '<div class="addOrEdit" id="View_', id, ' lay-filter="View_', id, '" style="display:block; text-align: center"></div>'
+            ].join("");
+            return html;
+        };
+
+        this.doAction = function (options) {
+            var that = this;
+            webUtil.copyConfig(that, that.moduleKey);
+            that.id = options.id;
+            var paramVOS={
+                getDataUrl:'uiDataController/dataFormQuery',
+                getDataBackPath: configData.compatibility ? path : configData.objectServicePath,
+                getDataMethod:'post',
+                url:'uiDataController/editSave',
+                backPath:configData.compatibility ? path : configData.objectServicePath,
+                method:'put',
+                uploadFileUrl:'vciFileUploadController/uploadFile',
+                uploadFileBackPath: configData.compatibility ? path : configData.fileServicePath
+            }
+            $.extend(paramVOS,options.paramVOS);
+            options.paramVOS=paramVOS;
+
+            var baseAction = layui['BaseAction'];
+            baseAction.callPreEvent(options, that, function (options) {
+                that.doView(options, function () {
+                    baseAction.callPostEvent(options, that, options.callback);
+                });
+            });
+        };
+
+        this.doView=function (options){
+            var that = this;
+            var paramVOS=$webUtil.paramLow(options.paramVOS);
+            if (!paramVOS['form'] && !paramVOS['context']&& !paramVOS['content']) {
+                $webUtil.showErrorMsg("鎸夐挳閰嶇疆涓嶆纭�");
+                return false;
+            }
+            var id=options.id;
+            var selectData=options.dataStore;
+            if(selectData.length<1){
+                $webUtil.showErrorMsg("璇烽�夋嫨涓�鏉¢渶瑕佹煡鐪嬬殑鏁版嵁");
+                return false;
+            }
+            if(!paramVOS.multi && selectData.length > 1){
+                $webUtil.showErrorMsg("浠呰兘閫夋嫨涓�鏉℃暟鎹潵鏌ョ湅");
+                return false;
+            }
+            var table = layui.table;
+            if (paramVOS.form) {
+                var filter = "View_" + id;
+                var form = layui.form;
+                var content = ['<form id="', filter, '" lay-filter="', filter, '" class="layui-form" style="margin:15px 30px 15px 0;" ></form>'
+                ].join('');
+                var addSaveIndex = layer.open({
+                    type: 1,
+                    title: paramVOS.title,
+                    //skin: 'layui-layer-lan',
+                    content: content,
+                    //area: ['1860px', '200px'],
+                    maxWidth: $(window).width() - 100,
+                    maxHeight: $(window).height() - 100,
+                    shade: true,
+                    shadeClose: true,
+                    resize: true,
+                    resizing: function (layero) {
+                        form.doResize(filter);
+                    },
+                    success: function (layero,layerIndex,classP) {
+                        $webUtil.get('webUIController/getFormDefineById', {
+                            btmType: paramVOS.type,
+                            id: paramVOS.form
+                        }, function (result) {
+                            if (result.success) {
+                                var formCallback = function () {
+                                    var baseAction = layui['BaseAction'];
+                                    if ($('#' + filter + ' .layui-upload-drag').length > 0) {
+                                        baseAction.renderUploadFile('#' + filter + ' .layui-upload-drag', paramVOS)
+                                    }
+                                    if (paramVOS.uploadattachment && paramVOS.uploadattachment == 'true') {
+                                        //鏄剧ず涓婁紶闄勪欢
+                                        baseAction.renderUploadAttach(filter, paramVOS)
+                                    }
+                                    if ($('#' + filter + ' .webeditor').length > 0) {
+                                        //缂栬緫鍣�
+                                        var editId='editor_'+$('#' + filter + ' .webeditor').attr('name')
+                                        baseAction.renderEditor(editId,'',paramVOS,function (){
+                                            baseAction.relocationOpen(classP)
+                                        });
+                                    }
+                                    baseAction.relocationOpen(classP)
+
+
+                                    //鑾峰彇閫変腑鐨勬暟鎹�
+                                    var sourceDataMap = {};
+                                    layui.each(options.sourceData, function (i, item) {
+                                        if(item.constructor === Object) return;
+                                        sourceDataMap['sourceDataMap["' + i + '"]'] = item;
+                                    })
+                                    $webUtil.ajax(paramVOS.getdatamethod, paramVOS.getdataurl, $.extend({
+                                            btmname: paramVOS.type,
+                                            formDefineId: paramVOS.form,
+                                            oid: selectData[0].oid
+                                        }, sourceDataMap),
+                                        function (result) {
+                                            if (result.success) {
+                                                form.setValues(result.obj.data, filter);
+                                                //鏂囦欢
+                                                if (result.obj.filePathFieldMap) {
+                                                    var filepath = layui.$('#' + filter + ' .uploadDemoView input.uploadFileOid').attr('name');
+                                                    layui.$('#' + filter + ' .uploadDemoView').removeClass('layui-hide').find('img').attr('src', paramVOS.uploadfilebackpath + 'vciFileDownloadController/downloadByFileOid?fileOid=' + result.obj.filePathFieldMap[filepath].oid + '&' + TOKEN_KEY + '=' + $webUtil.getToken());
+                                                    layui.$('#' + filter + ' .uploadDemoView input.uploadFileOid').val(result.obj.filePathFieldMap[filepath].filePath);
+                                                }
+                                                //闄勪欢
+                                                if (result.obj.attachmentFileVOs && result.obj.attachmentFileVOs.length > 0) {
+                                                    var val = [];
+                                                    layui.each(result.obj.attachmentFileVOs, function (i, attachmentFile) {
+                                                        val.push(attachmentFile.oid)
+                                                    })
+                                                    $('#' + filter + ' [name="releaseFileOids"]').val(val.join(','))
+                                                }
+                                                if ($('#' + filter + ' .webeditor').length > 0) {
+                                                    //缂栬緫鍣�
+                                                    var initV=result.obj.data[$('#' + filter + ' .webeditor').attr('name')];
+                                                    editor.html(initV);
+                                                    $('#' + filter + ' .webeditor').val(initV);
+                                                }
+
+                                            }
+                                        }, function (xhr, error) {
+                                            $webUtil.showErrorMsg("鑾峰彇鏁版嵁鍑虹幇浜嗛敊璇紝鍙兘鏄枃浠舵湇鍔℃病鏈夊惎鍔�");
+                                        }, paramVOS.getdatabackpath)
+
+                                }
+
+                                form.addItems(filter, result.obj.items, formCallback, {}, {
+                                    defaultColumnOneRow: result.obj.columnOneRow
+                                });
+                            } else {
+                                $webUtil.showErrorMsg(result.msg||'鑾峰彇琛ㄥ崟澶辫触');
+                            }
+
+                        }, function (xhr, error) {
+                            $webUtil.showErrorMsg("鑾峰彇琛ㄥ崟鍑虹幇浜嗛敊璇紝鍙兘鏄枃浠舵湇鍔℃病鏈夊惎鍔�");
+                        }, paramVOS.backpath)
+                    }
+                });
+            } else if (paramVOS.context||paramVOS.content) {
+                layui.use('platform/objectService/VciUIContentViewer', function () {
+                    var newTabClass = layui['platform/objectService/VciUIContentViewer'];
+                    newTabClass.id = id;
+                    newTabClass.multiCompent = true;
+                    newTabClass.sourceData = {
+                        btmType: paramVOS.type,
+                        content: paramVOS.context,
+                        dataOid:options.dataStore[0].oid,
+                        actionData: {
+                            selectData: options.sourceData,
+                            dataStore:options.dataStore,
+                            isOpen: true,
+                            isShowBtns:false,
+                            paramVOS: paramVOS
+                        }
+                    };
+
+                    var filter = "View_" + id;
+                    var content = ['<div id="', filter, '" lay-filter="', filter, '" style="margin:5px;" >',newTabClass.getContent(id),'</div>']
+                    var addSaveIndex = layer.open({
+                        type: 1,
+                        title: paramVOS.title,
+                        //skin: 'layui-layer-lan',
+                        content: content.join(''),
+                        area: [$(window).width() - 100+'px', $(window).height() - 100+'px'],
+                        shade: true,
+                        shadeClose: true,
+                        resize: true,
+                        resizing: function (layero) {
+                        },
+                        success: function (layero,layerIndex,classP) {
+                            newTabClass.init(id, newTabClass.sourceData,function (){
+                                //layui['BaseAction'].relocationOpen(classP)
+                            })
+                        }
+                    });
+                });
+            }
+        }
+
+        this.refresh = function () {
+            var that = this;
+
+        };
+
+        this.destory = function () {
+            var that = this;
+            var filter = "View_" + that.id;
+            $('#' + filter).remove()
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/RefreshAction.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/RefreshAction.js
new file mode 100644
index 0000000..063b25f
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/actions/RefreshAction.js
@@ -0,0 +1,37 @@
+/**
+ * 鎸夐挳澶勭悊 鍒锋柊
+ * @author wangting
+ * @date 2021-4-6
+ */
+layui.define(['layer','element','BaseAction'],function(exports){
+    var webUtil = $webUtil;
+    var Class = function() {
+        this.MODELNAME = "RefreshAction";
+        this.moduleKey = "RefreshAction";
+        this.id = "RefreshAction";
+
+        this.doAction = function (options) {
+            var that = this;
+            webUtil.copyConfig(that, that.moduleKey);
+            that.id = options.id;
+
+            var baseAction = layui['BaseAction'];
+            baseAction.callPreEvent(options, that, function (options) {
+                that.doAdd(options, function () {
+                    baseAction.callPostEvent(options, that, options.callback);
+                });
+            });
+        };
+
+
+        this.doAdd = function (options,callback) {
+            options.callback()
+            if(callback){
+                callback()
+            }
+        }
+
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdAreaClassify.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdAreaClassify.js
new file mode 100644
index 0000000..1e88498
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdAreaClassify.js
@@ -0,0 +1,353 @@
+/**
+ * 鍦板尯鍒嗙被椤甸潰
+ * @author weidy
+ * @date 2020-10-19
+ */
+layui.define(['layer','element','form','table','dynamicCondition','upload' ,'tree'],function(exports){
+        var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "platform/basedoc/BdAreaClassify";
+        this.moduleKey = "BdAreaClassify";
+        this.backPath =  configData.compatibility?path:configData.frameworkPath;
+        this.url = {
+            controller:'areaClassifyController/',
+            tree:'getAllAreaClassify',
+            dataGrid:'gridBdAreaClassify',
+            addSave:'insert',
+            editSave:'update',
+            deleteUrl:'delete',
+            enableData: 'enable',
+            disableData: 'disable',
+            downloadImportTemplate:'downloadImportTemplate',
+            importData : 'importData',
+            exportData : 'exportData',
+             getObjectByOid:'getAreaClassifyByOid'
+        };
+        this.getContent=function(){
+            var that = this;
+            var html = "";
+            html = [
+                '<div class="layui-layout" style="display:block;overflow-y: hidden">',
+                '<div class="layui-vci-tree" style="width:250px;float: left;background-color:#ffffff;overflow-y: auto;">',
+                '<label class="layui-icon layui-icon-tree" style="line-height: 20px;color:red;font-size:20px;">鍦板尯鍒嗙被</label>',
+                '<ul layui-filter="tree_',that.id,'"><ul>',
+                '</div>',
+                    '<div class="layui-layout-border" style="display:block;margin-top:0px; " id="border_',that.id,'">',
+
+                        '<div class="layui-center" style="overflow-y:auto;">',
+                            that.getToolbarHtml(),
+                            '<form class="layui-form" lay-filter="form_inPanel',that.id,'"></form>',
+                        '</div>',
+                    '</div>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DISABLE"><i class="layui-icon layui-icon-404"></i>鍋滅敤</button>',
+                   // '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_IMPORT"><i class="layui-icon layui-icon-upload-drag"></i>瀵煎叆</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                    //'<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EXPORT"><i class="layui-icon layui-icon-export"></i>瀵煎嚭</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ENABLE"><i class="layui-icon layui-icon-ok-circle"></i>鍚敤</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            //webUtil.createSearchHtml({id:"鍦板尯鍒嗙被缂栧彿",name:"鍚嶇О"} ,$("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+        };
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            that.initTree();
+            that.initForm();
+            that.createSearchHtml();
+        };
+        this.initTree = function () {
+            var that = this,tree=layui.tree;
+            var treeUL = $('[layui-filter="tree_' + that.id + '"]');
+            var scrollHeight =  window.innerHeight;
+            var treeHeight = scrollHeight - 200;
+            treeUL.parent().height(treeHeight);
+            tree.init("tree_" + that.id, treeUL, {
+                url: that.url.controller + that.url.tree,
+                backPath: that.backPath,
+                extraParams: {
+                    isMuti: false,
+                    isQueryAllColumn: true
+                },
+                showSearch:true,
+                click: function (item, elem, options) {
+                    that.currentItemOid = item.oid;
+                    that.currentItemAttributes = item.attributes;
+                    that.setFormValues(item.attributes);
+                },
+                done: function (thisFilter) {
+                    that.initForm();
+                }
+            });
+        };
+        this.setFormValues = function (attributes) {
+            var that = this;
+            if(attributes){
+                try{
+                    var form = layui.form;
+                    form.clear("form_inPanel" + that.id,true);
+                    form.setValues(attributes,"form_inPanel" + that.id);//涓嶉渶瑕佽浆鎹㈠璞★紝鍥犱负attributes宸茬粡鏄璞℃牸寮忎簡
+                }catch (e){
+                    $webUtil.showDebugMsg(e);
+                }
+            }
+        };
+        this.getFormItems = function(onlyShow) {
+            var that = this;
+            return [
+                                {
+                    field: 'id',
+                    title: '缂栧彿',
+                    required: true,
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'name',
+                    title: '鍚嶇О',
+                    required: true,
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'description',
+                    title: '鎻忚堪',
+                    type: 'text',
+                    readOnly:onlyShow
+                }  ,{
+                    field: 'lcStatusText',
+                    title: '鐘舵��',
+                    type: 'text',
+                    hidden:!onlyShow,
+                    readOnly:onlyShow
+                }      ];
+        };
+        this.initForm = function () {
+            var that = this;
+            var form = layui.form;
+            form.addItems("form_inPanel" + that.id, that.getFormItems(true), function () {
+            }, {}, {
+                defaultColumnOneRow: 2,
+                labelWidth: 200
+            });
+        };
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            that.addOrEdit(false,that.currentItemOid);
+        };
+        this.addOrEdit = function(add,oid) {
+            var that = this;
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            if(!add && $webUtil.isNull(that.currentItemOid)){
+                $webUtil.showErrorMsg("璇峰厛閫夋嫨涓�涓湴鍖哄垎绫�");
+                return false;
+            }
+            var addSaveIndex =webUtil.dialog({
+                title:add?'娣诲姞鍦板尯鍒嗙被':'淇敼鍦板尯鍒嗙被',
+                btn:['淇濆瓨','鍙栨秷'],
+                skin:'layui-layer-lan',
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                area:['900px','350px'],
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getFormItems(false),
+                        function () {
+                            if(!add){
+                                form.load(filter,{
+                                    backPath:that.backPath,
+                                    url:that.url.controller + that.url.getObjectByOid,
+                                    method:'get',
+                                    params:{
+                                        oid:oid
+                                    }
+                                });
+                            }else{
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                defaultValues['parentAreaClassify'] = that.currentItemOid;
+                                form.setValues(defaultValues,filter);
+                            }
+                        }, {}, {defaultColumnOneRow: 2});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        var url = that.url.controller + (add?that.url.addSave:that.url.editSave);
+                        webUtil.ajax(add?'post':'put',url,values,function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function(){
+            var that = this;
+            if($webUtil.isNull(that.currentItemOid)){
+                $webUtil.showErrorMsg("璇峰厛閫夋嫨涓�涓湴鍖哄垎绫�");
+                return false;
+            }
+            var ts=  that.currentItemAttributes.ts;
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,{oid:that.currentItemOid,ts:ts},function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+        this.refresh = function (parentNodeOid) {
+            var that = this;
+            var tree = layui.tree;
+            if($webUtil.isNotNull(parentNodeOid)){
+                tree.reloadNode("tree_" + that.id,parentNodeOid);
+            }else {
+                tree.reload("tree_" + that.id);
+            }
+        };
+        this.DISABLE = function () {
+            var that = this;
+            that.disableOrEnable(false);
+        };
+        this.ENABLE = function () {
+            var that = this;
+            that.disableOrEnable(true);
+        };
+        this.disableOrEnable = function (enable) {
+            var that = this;
+            var oid = that.currentItemOid ;
+            var ts ;
+            if($webUtil.isNull(that.currentItemOid)){
+                $webUtil.showErrorMsg("璇峰厛閫夋嫨涓�涓湴鍖哄垎绫�");
+                return false;
+            }
+            ts = that.currentItemAttributes.ts;
+            webUtil.post(that.url.controller + (enable?that.url.enableData:that.url.disableData),{
+                oid:oid,
+                ts:ts
+                },function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,(enable?'鍚敤鎴愬姛':'鍋滅敤鎴愬姛'));
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+        };
+
+        this.EXPORT = function () {
+            var that = this;
+            var iframeId = MD5("export" +webUtil.getSystemVar(webUtil.systemValueKey.currentDateTimeSSS) +webUtil.getSystemVar(webUtil.systemValueKey.userOid));
+            var data = {};
+            data[TOKEN_KEY] = webUtil.getToken();
+            data['downloadUUID'] = iframeId;
+            webUtil.fileDownloadPost(that.backPath + that.url.controller + that.url.exportData,data);
+        };
+        this.IMPORT = function () {
+            var that = this;
+            var filter =that.id + "_upload";
+            var form = layui.form;
+            var uploadIndex = webUtil.dialog({
+                title:'瀵煎叆鍦板尯鍒嗙被',
+                btn:['涓嬭浇瀵煎叆妯℃澘','鍙栨秷'],
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" enctype="multipart/form-data"></form>',
+                area: ['300px', '300px'],
+                resize:false,
+                success:function(layero){
+                    //濡傛灉瀵煎叆鏈夊叾浠栨搷浣滐紝鍦ㄧ浜屼釜鍙傛暟涓坊鍔�
+                    form.addItems(filter,[],function(){
+                        $("#form_" + filter).append('<button type="button" class="layui-btn" id="' + that.id + '_upload_form_file" style="margin-left:100px;margin-top:80px;"><i class="layui-icon">&#xe67c;</i>閫夋嫨鏂囦欢鍚庤嚜鍔ㄥ鍏�</button>&nbsp;&nbsp;&nbsp;&nbsp;');
+                        var upload = layui.upload;
+                        //鎵ц瀹炰緥
+                        var uploadInst = upload.render({
+                            elem: '#' + that.id + '_upload_form_file' //缁戝畾鍏冪礌
+                            ,accept:'file'
+                            ,acceptMime:'file/*'
+                            ,exts:'xls|xlsx'
+                            ,url: that.backPath + that.url.controller + that.url.importData
+                            ,done: function(result){
+                                if(result.success){
+                                    layer.close(uploadIndex);
+                                    webUtil.showMsgFromResult(result,"瀵煎叆鎴愬姛");
+                                    that.refresh();
+                                }else{
+                                    webUtil.showErrorMsg(result.msg);
+                                }
+                            }
+                            ,error: function(){
+                                //璇锋眰寮傚父鍥炶皟
+                                 webUtil.showErrorMsg("涓婁紶寮傚父");
+                            }
+                        });
+                    },{},{
+                        defaultColumnOneRow:1
+                    });
+                },
+                yes:function(){
+                    var iframeId = MD5("downloadImportTemplate" +webUtil.getSystemVar(webUtil.systemValueKey.currentDateTimeSSS)  +webUtil.getSystemVar(webUtil.systemValueKey.userOid));
+                    webUtil.fileDownload(that.backPath + that.url.controller + that.url.downloadImportTemplate+ "?" + TOKEN_KEY + "=" + webUtil.getToken()  + "&downloadUUID=" + iframeId );
+                }
+            });
+        };
+        this.ADVQUERY = function () {
+            var that = this;
+            if(!that.serinorQueryInstance) {
+                var dynamicCondition = layui.dynamicCondition;
+                $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar' + that.id + '" class="layui-inline"></div>');
+                var dataFields = that.columns;
+                that.serinorQueryInstance = dynamicCondition.create({
+                    fields: dataFields//鏌ヨ瀛楁
+                    , tableId: "table_" + that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                    , type: "complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                    //,conditionTextId:"#toolbar"+that.id//楂樼骇鏌ヨ 鎸夐挳鎵�鍦ㄧ殑div
+                    //,popupShowQueryBtn: true//鏄剧ず楂樼骇鏌ヨ鎸夐挳
+                    , queryCallBack: function (requestData) {//鏌ヨ涔嬪悗鐨刢allback
+                        //console.log(JSON.stringify(requestData))
+                    }
+                });
+            }
+            that.serinorQueryInstance.open();
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdCustomer.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdCustomer.js
new file mode 100644
index 0000000..57af8ff
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdCustomer.js
@@ -0,0 +1,268 @@
+/**
+ * 瀹㈡埛鍩烘湰淇℃伅
+ * @author weidy@2019-11-26
+ */
+layui.define(['layer','element','form','table','util'],function(exports){
+    var Class = function(){
+        this.MODELNAME = "platform/basedoc/BdCustomer";
+        this.moduleKey = "BdCustomer";
+        this.id='BdCustomer';
+        this.sourceData={};
+        this.columns = [];
+        this.backPath =  configData.compatibility?path:configData.frameworkPath;
+        this.url={
+            dataGrid:'smButtonController/dataGrid',//鍒楄〃鏁版嵁鍜屾煡璇�
+            add:'smButtonController/addSave',
+            edit:'smButtonController/editSave',
+            deleteUrl:'smButtonController/delete'
+        };
+        this.buttonIconMap = {
+            SEARCH:'layui-icon-refresh-2',
+            SENIORSEARCH:'layui-icon-query',
+            ADD:'layui-icon-add-1',
+            EDIT:'layui-icon-edit',
+            DELETE:'layui-icon-delete'
+        };
+        this.getContent=function(){//杩斿洖杩欎釜缁勪欢鐨勫熀纭�html
+            var that = this;
+            var html = "";
+            html = [
+                    '<div class="layui-layout-border">',
+                        '<div class="layui-center">',
+                            that.getToolbarHtml(),
+                            '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',//涓诲垪琛�
+                        '</div>',
+                    '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_button_',that.id,'" class="layui-btn-container">',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_enable"><i class="layui-icon layui-icon-ok-circle"></i>鍚敤</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_disable"><i class="layui-icon layui-icon-404"></i>鍋滅敤</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>',
+            ].join("");
+            return html;
+        };
+        this.init=function(){//鍩虹鐨刪tml琚坊鍔犲悗锛屽啀鎵ц鍒濆鍖�
+            var that = this;
+            $webUtil.copyConfig(that,that.moduleKey);
+            var table = layui.table;
+            that.checkColumns();//涓诲垪琛ㄤ腑鍒椼��
+            table.render({
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                url: that.backPath + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                done:function(res, cur, count){
+                    that.buttonTotal = count;
+                }
+            });
+            $webUtil.bindDefultButtonLisenter(that, "table_" + that.id);
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){//濡傛灉鍏朵粬鍦版柟鎯充娇鐢ㄨ繖涓粍浠剁殑鏃跺�欙紝鍙互鑷畾涔夊垪
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),{
+                    field:'id',
+                    title:'瀹㈡埛缂栧彿',
+                    width:150
+                },{
+                    field:'name',
+                    title:'瀹㈡埛鍚嶇О',
+                    width:200
+                },{
+                    field:'customerClassifyName',
+                    title:'瀹㈡埛鍩烘湰鍒嗙被',
+                    width:150
+                },{
+                    field:'customerSaleClassifyName',
+                    title:'鍦板尯鍒嗙被',
+                    width:150
+                },{
+                    field:'address',
+                    title:'鍦板潃',
+                    width:200
+                },{
+                    field:'contacts',
+                    title:'鑱旂郴鏂瑰紡',
+                    width:130
+                },{
+                    field:'primaryContactor',
+                    title:'涓昏鑱旂郴浜�',
+                    width:130
+                },{
+                    field:'description',
+                    title:'鎻忚堪',
+                    width:150
+                }];
+            }
+        };
+        this.ADD = function(){//淇濆瓨
+        	var that = this;
+        	layui.use('form',function(){
+				var form = layui.form;
+				var filter ="form_" + that.id;
+				var addSaveIndex = layer.open({
+					type:1,
+					title:'娣诲姞鎸夐挳',
+					btn:['淇濆瓨','鍙栨秷'],
+					skin:'layui-layer-lan',
+					content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+					area:['800px','270px'],
+				    closeBtn:2,
+				    shade:true,
+				    shadeClose:true,
+				    resize:true,
+				    resizing:function(layero){
+				    	form.doResize(filter);
+				    },
+				    success:function(layero) {
+                        form.addItems(filter,that.getFormItems(false),
+                        function () {}, {}, {defaultColumnOneRow: 2});
+                    },
+                    yes:function(layero){
+                        if(form.validata(filter)){
+                            var values = form.getValues(filter);
+                            $webUtil.post(that.url.add,values,function(result){
+                                if(result.success){
+                                    $webUtil.showMsg("娣诲姞鎸夐挳鎴愬姛");
+                                    layer.close(addSaveIndex);
+                                    that.refresh();
+                                }else{
+                                    $webUtil.showErrorMsg(result.msg);
+                                }
+                            },function (xhr,error) {
+
+                            },that.backPath);
+                        }
+                    },
+                    btn2:function(layero){
+                        layer.close(addSaveIndex);
+                        that.refresh();
+                    }
+				});
+			});
+        };
+        this.getFormItems = function(isEdit){
+            return [{
+                type: 'text',
+                name: 'id',
+                text: '鎸夐挳鏍囪瘑',
+                required: true
+            }, {
+                type: 'text',
+                name: 'name',
+                text: '鎸夐挳鍚嶇О',
+                required: true
+            }, {
+                name: 'iconCss',
+                text: '鏄剧ず鍥炬爣'
+            }, {
+                type: 'text',
+                name: 'description',
+                text: '鎻忚堪'
+            }];
+        };
+        this.EDIT = function(){
+        	var that = this;
+        	var oid = $webUtil.getOidFromGrid("table_" + that.id,true,true);
+        	if(!oid){
+        		return false;
+			}
+			var selectRowData = layui.table.checkStatus("table_" + that.id);
+        	layui.use('form',function(){
+				var form = layui.form;
+				var filter ="form_" + that.id;
+				var addSaveIndex = layer.open({
+                    type: 1,
+                    title: '淇敼鎸夐挳',
+                    btn: ['淇濆瓨', '鍙栨秷'],
+                    url: that.backPath + that.url.edit,
+                    skin: 'layui-layer-lan',
+                    content: '<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                    area: ['800px', '270px'],
+                    closeBtn: 2,
+                    shade: true,
+                    shadeClose: true,
+                    resize: true,
+                    resizing: function (layero) {
+                        form.doResize(filter);
+                    },
+                    success: function (layero) {
+                        form.addItems(filter,that.getFormItems(true),
+                            function () {
+								form.setValues(selectRowData.data[0],filter);
+                            }
+                            , {}
+                            , {
+                                defaultColumnOneRow: 2
+                            });
+                    },
+					yes:function(layero){
+                    	if(form.validata(filter)){
+                            var formValues = form.getValues(filter,true);
+                            formValues['oid'] = selectRowData.data[0].oid;
+                            formValues['ts'] = selectRowData.data[0].ts;
+                            $webUtil.put(that.url.edit,formValues,function (result) {
+								if(result.success){
+									$webUtil.showMsg("淇敼鎸夐挳鎴愬姛");
+									that.refresh();
+									layer.close(addSaveIndex);
+								}else{
+									$webUtil.showErrorMsg(result.msg);
+								}
+                            },function (error) {
+
+                            },that.backPath);
+						}
+					},
+					btn2:function(layero){
+                        that.refresh();
+                        layer.close()
+					}
+                });
+			});
+        };
+        
+        this.DEL= function(){
+            var that = this;
+            var oid = $webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts =  $webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            $webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欎釜鎸夐挳锛屽搴旂殑鍔熻兘鑿滃崟涓殑鎸夐挳涓嶄細鑷姩鍒犻櫎",function () {
+                $webUtil.deleteRequest(that.url.deleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        $webUtil.showMsg("鍒犻櫎鎸夐挳鎴愬姛");
+                        that.refresh();
+                    }else{
+                        $webUtil.showErrorMsg(result.msg);
+                    }
+                },function (xhr,error) {
+
+                },that.backPath);
+            });
+        };
+        this.refresh = function(){
+            var that = this;
+            layui.table.reload("table_" + that.id);
+
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdCustomerClassify.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdCustomerClassify.js
new file mode 100644
index 0000000..06c17fa
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdCustomerClassify.js
@@ -0,0 +1,254 @@
+/**
+ * 瀹㈡埛鍩烘湰鍒嗙被
+ * @author weidy@2020/3/13
+ */
+layui.define(['layer','element','form','table','util'],function(exports){
+    var Class = function(){
+        this.MODELNAME = "platform/basedoc/BdCustomerClassify";
+        this.moduleKey = "BdCustomerClassify";
+        this.id = 'BdCustomerClassify';
+        this.sourceData = {};
+        this.columns = [];
+        this.backPath =  configData.compatibility?path:configData.frameworkPath;
+        this.url={
+            dataGrid:'smButtonController/dataGrid',//鍒楄〃鏁版嵁鍜屾煡璇�
+            add:'smButtonController/addSave',
+            edit:'smButtonController/editSave',
+            deleteUrl:'smButtonController/delete'
+        };
+        this.buttonIconMap = {
+            SEARCH:'layui-icon-refresh-2',
+            SENIORSEARCH:'layui-icon-query',
+            ADD:'layui-icon-add-1',
+            EDIT:'layui-icon-edit',
+            DELETE:'layui-icon-delete'
+        };
+        this.getContent=function(){//杩斿洖杩欎釜缁勪欢鐨勫熀纭�html
+            var that = this;
+            var html = "";
+            html = [
+                that.getToolbarHtml(),
+                '<div class="layui-layout" style="display:block;overflow-y: hidden">',
+                '<div class="layui-vci-tree" style="width:250px;float: left;background-color:#ffffff;overflow-y: auto;">',
+                '<label class="layui-icon layui-icon-tree" style="line-height: 20px;color:red;font-size:20px;">瀹㈡埛鍩烘湰鍒嗙被</label>',
+                '<ul layui-filter="tree_',that.id,'"><ul>',
+                '</div>',
+                '<div class="layui-layout-border" style="display:block;margin-top:0px;margin-left:255px;">',
+                '<div class="layui-center" style="overflow-y:auto;">',
+                '<form class="layui-form" lay-filter="form_',that.id,'"></form>',
+                '</div>',
+                '</div>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            return ['<div layui-filter="toolbar_',that.id, '" class="layui-btn-container">',//涓诲垪琛ㄧ殑鎸夐挳
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_enable"><i class="layui-icon layui-icon-ok-circle"></i>鍚敤</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_disable"><i class="layui-icon layui-icon-404"></i>鍋滅敤</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'].join("");
+        };
+        this.init=function(){
+            //鍩虹鐨刪tml琚坊鍔犲悗锛屽啀鎵ц鍒濆鍖�
+            var that = this;
+            $webUtil.copyConfig(that,that.moduleKey);
+            $webUtil.bindDefultButtonLisenter(that, that.id);
+            var tree = layui.tree;
+            var scrollHeight =  window.innerHeight;
+            var treeUL = $('[layui-filter="tree_' + that.id + '"]');
+            var treeHeight = scrollHeight - 200;
+            treeUL.parent().height(treeHeight);
+            tree.init("tree_" + that.id, treeUL, {
+                url: that.url.tree,
+                backPath: that.backPath,
+                extraParams: {
+                    isMuti: false,
+                    isQueryAllColumn: true
+                },
+                showSearch:true,
+                click: function (item, elem, options) {
+                    that.setFormValues(item.attributes);
+                },
+                done: function (thisFilter) {
+                    that.initForm();
+                }
+            });
+        };
+        this.initForm = function(){
+            var that = this;
+            var form = layui.form;
+            form.addItems("form_" + that.id, that.getFormItems(true), function () {
+            }, {}, {
+                defaultColumnOneRow: 2,
+                labelWidth:200
+            });
+        };
+        this.getFormItems = function(onlyShow){
+            var that = this;
+            return [{
+                field: 'id',
+                text: '瀹㈡埛鍩烘湰鍒嗙被缂栧彿',
+                required:true,
+                readOnly: onlyShow
+            }, {
+                field: 'name',
+                text: '瀹㈡埛鍩烘湰鍒嗙被鍚嶇О',
+                required:true,
+                readOnly: onlyShow
+            },{
+                field:'description',
+                text:'鎻忚堪',
+                readOnly: onlyShow
+            },{
+                field: 'lcStatusText',
+                text: '鐘舵��',
+                readOnly: true
+            }];
+        };
+        this.ADD = function(){//淇濆瓨
+            var that = this;
+            layui.use('form',function(){
+                var form = layui.form;
+                var filter ="form_" + that.id;
+                var addSaveIndex = layer.open({
+                    type:1,
+                    title:'娣诲姞鎸夐挳',
+                    btn:['淇濆瓨','鍙栨秷'],
+                    skin:'layui-layer-lan',
+                    content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                    area:['800px','270px'],
+                    closeBtn:2,
+                    shade:true,
+                    shadeClose:true,
+                    resize:true,
+                    resizing:function(layero){
+                        form.doResize(filter);
+                    },
+                    success:function(layero) {
+                        form.addItems(filter,that.getFormItems(false),
+                            function () {}, {}, {defaultColumnOneRow: 2});
+                    },
+                    yes:function(layero){
+                        if(form.validata(filter)){
+                            var values = form.getValues(filter);
+                            $webUtil.post(that.url.add,values,function(result){
+                                if(result.success){
+                                    $webUtil.showMsg("娣诲姞鎸夐挳鎴愬姛");
+                                    layer.close(addSaveIndex);
+                                    that.refresh();
+                                }else{
+                                    $webUtil.showErrorMsg(result.msg);
+                                }
+                            },function (xhr,error) {
+
+                            },that.backPath);
+                        }
+                    },
+                    btn2:function(layero){
+                        layer.close(addSaveIndex);
+                        that.refresh();
+                    }
+                });
+            });
+        };
+        this.EDIT = function(){
+            var that = this;
+            var oid = $webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var selectRowData = layui.table.checkStatus("table_" + that.id);
+            layui.use('form',function(){
+                var form = layui.form;
+                var filter ="form_" + that.id;
+                var addSaveIndex = layer.open({
+                    type: 1,
+                    title: '淇敼鎸夐挳',
+                    btn: ['淇濆瓨', '鍙栨秷'],
+                    url: that.backPath + that.url.edit,
+                    skin: 'layui-layer-lan',
+                    content: '<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                    area: ['800px', '270px'],
+                    closeBtn: 2,
+                    shade: true,
+                    shadeClose: true,
+                    resize: true,
+                    resizing: function (layero) {
+                        form.doResize(filter);
+                    },
+                    success: function (layero) {
+                        form.addItems(filter,that.getFormItems(true),
+                            function () {
+                                form.setValues(selectRowData.data[0],filter);
+                            }
+                            , {}
+                            , {
+                                defaultColumnOneRow: 2
+                            });
+                    },
+                    yes:function(layero){
+                        if(form.validata(filter)){
+                            var formValues = form.getValues(filter,true);
+                            formValues['oid'] = selectRowData.data[0].oid;
+                            formValues['ts'] = selectRowData.data[0].ts;
+                            $webUtil.put(that.url.edit,formValues,function (result) {
+                                if(result.success){
+                                    $webUtil.showMsg("淇敼鎸夐挳鎴愬姛");
+                                    that.refresh();
+                                    layer.close(addSaveIndex);
+                                }else{
+                                    $webUtil.showErrorMsg(result.msg);
+                                }
+                            },function (error) {
+
+                            },that.backPath);
+                        }
+                    },
+                    btn2:function(layero){
+                        that.refresh();
+                        layer.close()
+                    }
+                });
+            });
+        };
+
+        this.DEL= function(){
+            var that = this;
+            var oid = $webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts =  $webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            $webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欎釜鎸夐挳锛屽搴旂殑鍔熻兘鑿滃崟涓殑鎸夐挳涓嶄細鑷姩鍒犻櫎",function () {
+                $webUtil.deleteRequest(that.url.deleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        $webUtil.showMsg("鍒犻櫎鎸夐挳鎴愬姛");
+                        that.refresh();
+                    }else{
+                        $webUtil.showErrorMsg(result.msg);
+                    }
+                },function (xhr,error) {
+
+                },that.backPath);
+            });
+        };
+        this.refresh = function(parentNodeOid){
+            var that = this;
+            var tree = layui.tree;
+            if(parentNodeOid){
+                tree.reloadNode("tree_" + that.id,parentNodeOid);
+            }else {
+                that.selectTreeOid = null;
+                that.selectTreeAttribute = null;
+                tree.reload("tree_" + that.id);
+            }
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdCustomerSaleClassify.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdCustomerSaleClassify.js
new file mode 100644
index 0000000..1a1b628
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdCustomerSaleClassify.js
@@ -0,0 +1,254 @@
+/**
+ * 瀹㈡埛閿�鍞垎绫�
+ * @author weidy@2020/3/13
+ */
+layui.define(['layer','element','form','table','util'],function(exports){
+    var Class = function(){
+        this.MODELNAME = "platform/basedoc/BdCustomerSaleClassify";
+        this.moduleKey = "BdCustomerSaleClassify";
+        this.id = 'BdCustomerSaleClassify';
+        this.sourceData = {};
+        this.columns = [];
+        this.backPath =  configData.compatibility?path:configData.frameworkPath;
+        this.url={
+            dataGrid:'smButtonController/dataGrid',//鍒楄〃鏁版嵁鍜屾煡璇�
+            add:'smButtonController/addSave',
+            edit:'smButtonController/editSave',
+            deleteUrl:'smButtonController/delete'
+        };
+        this.buttonIconMap = {
+            SEARCH:'layui-icon-refresh-2',
+            SENIORSEARCH:'layui-icon-query',
+            ADD:'layui-icon-add-1',
+            EDIT:'layui-icon-edit',
+            DELETE:'layui-icon-delete'
+        };
+        this.getContent=function(){//杩斿洖杩欎釜缁勪欢鐨勫熀纭�html
+            var that = this;
+            var html = "";
+            html = [
+                that.getToolbarHtml(),
+                '<div class="layui-layout" style="display:block;overflow-y: hidden">',
+                '<div class="layui-vci-tree" style="width:250px;float: left;background-color:#ffffff;overflow-y: auto;">',
+                '<label class="layui-icon layui-icon-tree" style="line-height: 20px;color:red;font-size:20px;">瀹㈡埛閿�鍞垎绫�</label>',
+                '<ul layui-filter="tree_',that.id,'"><ul>',
+                '</div>',
+                '<div class="layui-layout-border" style="display:block;margin-top:0px;margin-left:255px;">',
+                '<div class="layui-center" style="overflow-y:auto;">',
+                '<form class="layui-form" lay-filter="form_',that.id,'"></form>',
+                '</div>',
+                '</div>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            return ['<div layui-filter="toolbar_',that.id, '" class="layui-btn-container">',//涓诲垪琛ㄧ殑鎸夐挳
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_add"><i class="layui-icon layui-icon-add-1"></i>澧炲姞</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_edit"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_del"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_del"><i class="layui-icon layui-icon-delete"></i>鍚敤</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_del"><i class="layui-icon layui-icon-delete"></i>鍋滅敤</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'].join("");
+        };
+        this.init=function(){
+            //鍩虹鐨刪tml琚坊鍔犲悗锛屽啀鎵ц鍒濆鍖�
+            var that = this;
+            $webUtil.copyConfig(that,that.moduleKey);
+            $webUtil.bindDefultButtonLisenter(that, that.id);
+            var tree = layui.tree;
+            var scrollHeight =  window.innerHeight;
+            var treeUL = $('[layui-filter="tree_' + that.id + '"]');
+            var treeHeight = scrollHeight - 200;
+            treeUL.parent().height(treeHeight);
+            tree.init("tree_" + that.id, treeUL, {
+                url: that.url.tree,
+                backPath: that.backPath,
+                extraParams: {
+                    isMuti: false,
+                    isQueryAllColumn: true
+                },
+                showSearch:true,
+                click: function (item, elem, options) {
+                    that.setFormValues(item.attributes);
+                },
+                done: function (thisFilter) {
+                    that.initForm();
+                }
+            });
+        };
+        this.initForm = function(){
+            var that = this;
+            var form = layui.form;
+            form.addItems("form_" + that.id, that.getFormItems(true), function () {
+            }, {}, {
+                defaultColumnOneRow: 2,
+                labelWidth:200
+            });
+        };
+        this.getFormItems = function(onlyShow){
+            var that = this;
+            return [{
+                field: 'id',
+                text: '瀹㈡埛閿�鍞垎绫荤紪鍙�',
+                required:true,
+                readOnly: onlyShow
+            }, {
+                field: 'name',
+                text: '瀹㈡埛閿�鍞垎绫诲悕绉�',
+                required:true,
+                readOnly: onlyShow
+            },{
+                field:'description',
+                text:'鎻忚堪',
+                readOnly: onlyShow
+            },{
+                field: 'lcStatusText',
+                text: '鐘舵��',
+                readOnly: true
+            }];
+        };
+        this.ADD = function(){//淇濆瓨
+            var that = this;
+            layui.use('form',function(){
+                var form = layui.form;
+                var filter ="form_" + that.id;
+                var addSaveIndex = layer.open({
+                    type:1,
+                    title:'娣诲姞鎸夐挳',
+                    btn:['淇濆瓨','鍙栨秷'],
+                    skin:'layui-layer-lan',
+                    content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                    area:['800px','270px'],
+                    closeBtn:2,
+                    shade:true,
+                    shadeClose:true,
+                    resize:true,
+                    resizing:function(layero){
+                        form.doResize(filter);
+                    },
+                    success:function(layero) {
+                        form.addItems(filter,that.getFormItems(false),
+                            function () {}, {}, {defaultColumnOneRow: 2});
+                    },
+                    yes:function(layero){
+                        if(form.validata(filter)){
+                            var values = form.getValues(filter);
+                            $webUtil.post(that.url.add,values,function(result){
+                                if(result.success){
+                                    $webUtil.showMsg("娣诲姞鎸夐挳鎴愬姛");
+                                    layer.close(addSaveIndex);
+                                    that.refresh();
+                                }else{
+                                    $webUtil.showErrorMsg(result.msg);
+                                }
+                            },function (xhr,error) {
+
+                            },that.backPath);
+                        }
+                    },
+                    btn2:function(layero){
+                        layer.close(addSaveIndex);
+                        that.refresh();
+                    }
+                });
+            });
+        };
+        this.EDIT = function(){
+            var that = this;
+            var oid = $webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var selectRowData = layui.table.checkStatus("table_" + that.id);
+            layui.use('form',function(){
+                var form = layui.form;
+                var filter ="form_" + that.id;
+                var addSaveIndex = layer.open({
+                    type: 1,
+                    title: '淇敼鎸夐挳',
+                    btn: ['淇濆瓨', '鍙栨秷'],
+                    url: that.backPath + that.url.edit,
+                    skin: 'layui-layer-lan',
+                    content: '<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                    area: ['800px', '270px'],
+                    closeBtn: 2,
+                    shade: true,
+                    shadeClose: true,
+                    resize: true,
+                    resizing: function (layero) {
+                        form.doResize(filter);
+                    },
+                    success: function (layero) {
+                        form.addItems(filter,that.getFormItems(true),
+                            function () {
+                                form.setValues(selectRowData.data[0],filter);
+                            }
+                            , {}
+                            , {
+                                defaultColumnOneRow: 2
+                            });
+                    },
+                    yes:function(layero){
+                        if(form.validata(filter)){
+                            var formValues = form.getValues(filter,true);
+                            formValues['oid'] = selectRowData.data[0].oid;
+                            formValues['ts'] = selectRowData.data[0].ts;
+                            $webUtil.put(that.url.edit,formValues,function (result) {
+                                if(result.success){
+                                    $webUtil.showMsg("淇敼鎸夐挳鎴愬姛");
+                                    that.refresh();
+                                    layer.close(addSaveIndex);
+                                }else{
+                                    $webUtil.showErrorMsg(result.msg);
+                                }
+                            },function (error) {
+
+                            },that.backPath);
+                        }
+                    },
+                    btn2:function(layero){
+                        that.refresh();
+                        layer.close()
+                    }
+                });
+            });
+        };
+
+        this.DEL= function(){
+            var that = this;
+            var oid = $webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts =  $webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            $webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欎釜鎸夐挳锛屽搴旂殑鍔熻兘鑿滃崟涓殑鎸夐挳涓嶄細鑷姩鍒犻櫎",function () {
+                $webUtil.deleteRequest(that.url.deleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        $webUtil.showMsg("鍒犻櫎鎸夐挳鎴愬姛");
+                        that.refresh();
+                    }else{
+                        $webUtil.showErrorMsg(result.msg);
+                    }
+                },function (xhr,error) {
+
+                },that.backPath);
+            });
+        };
+        this.refresh = function(parentNodeOid){
+            var that = this;
+            var tree = layui.tree;
+            if(parentNodeOid){
+                tree.reloadNode("tree_" + that.id,parentNodeOid);
+            }else {
+                that.selectTreeOid = null;
+                that.selectTreeAttribute = null;
+                tree.reload("tree_" + that.id);
+            }
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdGoodsLocation.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdGoodsLocation.js
new file mode 100644
index 0000000..e43d0ab
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdGoodsLocation.js
@@ -0,0 +1,420 @@
+/**
+ * 璐т綅绠$悊
+ * @author weidy@2020/2/24
+ * @constructor
+ */
+layui.define(['layer','element','form','table','tree'],function(exports){
+    var Class = function(){
+        this.MODELNAME = "platform/basedoc/BdGoodsLocation";
+        this.moduleKey = "BdGoodsLocation";
+        this.id='BdGoodsLocation';
+        this.sourceData={};//鏉ユ簮鏁版嵁锛岄渶瑕佽嚦灏戝寘鍚玹ype锛屽鏋滄病鏈夊垯榛樿涓烘壒浜�
+        this.columns = [];
+        this.personColumns = [];
+        this.backPath = configData.compatibility?path:configData.frameworkPath;//榛樿娴佺▼鍜岄」鐩殑璺緞鏄竴鏍风殑
+        this.url={
+            controller:"goodsLocationController/",
+            referWarehouse:'warehouseController/refTree',//鍙傜収搴撴埧
+            dataGrid:'getGoodsLocationByWarehouseOid',//鍒楄〃鏁版嵁鍜屾煡璇�
+            add:'addGoodsLocation',//娣诲姞璐т綅
+            edit:'editGoodsLocation',//缂栬緫璐т綅
+            checkIsDelete:'checkIsCanDelete',//鏄惁鍙互鍒犻櫎
+            deleteUrl:'delGoodsLocation',//鍒犻櫎搴撴埧
+            disable:'disableGoodsLocation',//鍋滅敤
+            enable:'enableGoodsLocation',//鍚敤
+            referUser:'userQueryController/refDataGrid'
+        };
+        this.getContent=function(){//杩斿洖杩欎釜缁勪欢鐨勫熀纭�html
+            var that = this;
+            var html = "";
+            html = [
+                '<div class="layui-layout-border">',
+                '<div style="width:250px;float: left;background-color:#ffffff">',
+                '<label class="layui-icon layui-icon-tree" style="line-height: 20px;color:red;font-size:20px;">搴撴埧</label>',
+                '<ul layui-filter="tree_',that.id,'" style="border:1px solid #6886ff;overflow-x:auto"><ul>',
+                '</div>',
+                '<div class="layui-layout" style="margin-left:255px;">',
+                '<div class="layui-center">',
+                that.getToolbarHtml(),
+                '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',//涓诲垪琛�
+                '</div>',
+                '</div>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id, '" class="layui-btn-container">',//涓诲垪琛ㄧ殑鎸夐挳
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_'+ that.id+ '_ADD"><i class="layui-icon layui-icon-add-1"></i>澧炲姞</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_'+ that.id+ '_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_'+ that.id+ '_DELETE"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_'+ that.id+ '_STAR"><i class="layui-icon layui-icon-ok-circle"></i>鍚敤</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_'+ that.id+ '_STOP"><i class="layui-icon layui-icon-404"></i>鍋滅敤</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_'+ that.id+ '_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.init=function(){//鍩虹鐨刪tml琚坊鍔犲悗锛屽啀鎵ц鍒濆鍖�
+            var that = this;
+            that.firstTreeLoad =false;
+            $webUtil.copyConfig(that,that.moduleKey);
+            $webUtil.bindDefultButtonLisenter(that, that.id);
+            //鍒濆鍖栨爲鐣岄潰
+            var filter= that.id;
+            var scrollHeight =  window.innerHeight;
+            var treeUL = $('[layui-filter="tree_' + filter + '"]');
+            var treeHeight = scrollHeight - 200;
+            treeUL.parent().height(treeHeight);
+            layui.tree.init("tree_" + filter,$('[layui-filter="tree_' + filter + '"]'),{
+                url:that.url.referWarehouse,
+                backPath:that.backPath,
+                showSearch:true,
+                loadType:layui.tree.loadType.all,
+                treeFilter:that.id,
+                treeName:'goodLocations',
+                click:function(item,elem,options){
+                    that.currentItemOid = item.oid;
+                    that.currentItemAttributes = item.attributes;
+                    layui.table.reload("table_" + that.id,{
+                        where:{
+                            warehouseOid:that.currentItemOid
+                        }
+                    });
+                },
+                done:function (thisFilter,result) {
+                    //loadType涓篴ll鐨勬椂鍊欐墠鑳界敤杩欎釜浜嬩欢
+                    that.currentItemOid = "";
+                    if(result && result.length > 0){
+                        that.currentItemOid = result[0].oid;
+                    }
+                    if(!that.firstTreeLoad) {
+                        that.initMainTable();
+                        that.firstTreeLoad = true;
+                    }
+                }
+            });
+        };
+        this.initMainTable = function () {
+            //鍒濆鍖栦富鍒楄〃
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();//涓诲垪琛ㄤ腑鍒椼��
+            table.render({
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                url: that.backPath + that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 30,
+                    page: 1
+                },
+                where:{
+                    warehouseOid:that.currentItemOid
+                },
+                cols: [that.columns],
+                done: function (res, cur, count) {
+                    if(res && res.data && res.data.length>0){
+                        table.selectRecord('table_' + that.id,res.data[0]);
+                    }
+                }
+            });
+            $webUtil.createSearchHtml({
+                id: '璐т綅缂栧彿',
+                name: '璐т綅鍚嶇О'
+            }, $('[layui-filter="toolbar_' + that.id + '"]'), 'table_' + that.id);
+        };
+        this.ADD = function(){//淇濆瓨
+            var that = this;
+            that.dealData(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            var oid = $webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            that.dealData(false);
+        };
+        this.getFormItems = function(isEdit){
+            var that = this;
+            var table = layui.table;
+            return [{
+                type: 'text',
+                name: 'id',
+                text: '璐т綅/璐ф灦缂栧彿',
+                required: true
+            }, {
+                type: 'text',
+                name: 'name',
+                text: '璐т綅/璐ф灦鍚嶇О',
+                required: true
+            }, {
+                type: 'refer',
+                name: 'curators',
+                text: '淇濈鍛�',
+                showField:'curators',
+                referConfig:{
+                    textField:'id,name',
+                    valueField:'id,name',
+                    type:'grid',
+                    url: that.url.referUser,
+                    backPath:that.backPath,
+                    tableConfig:{
+                        page:{
+                            limit:15,
+                            page:1
+                        },
+                        cols:[table.getIndexColumn(),table.getCheckColumn(),{
+                            field:'id',
+                            title:'鐢ㄦ埛鍚�(璐﹀彿)',
+                            width:150
+                        },{
+                            field:'name',
+                            title:'濮撳悕',
+                            width:150
+                        },{
+                            field:'usersecurity',
+                            title:'瀵嗙骇',
+                            width:80,
+                            templet:function (d) {
+                                return $webUtil.formateUserSecret(d.usersecurity);
+                            }
+                        }],
+                        queryColumns:[{
+                            field:'id',
+                            title:'鐢ㄦ埛鍚�(璐﹀彿)'
+                        },{
+                            field:'name',
+                            title:'濮撳悕'
+                        }]
+                    }
+                }
+            },{
+                type: 'text',
+                name: 'outboundpriority',
+                text: '鍑哄簱浼樺厛绾�',
+                verify:'number',
+                minValue:1,
+                maxValue:10,
+                defaultValue:1,
+                required: true
+            }, {
+                type: 'text',
+                name: 'inboundpriority',
+                text: '鍏ュ簱浼樺厛绾�',
+                verify:'number',
+                minValue:1,
+                maxValue:10,
+                defaultValue:1,
+                required: true
+            },{
+                type:'text',
+                name:'volume',
+                text:'瀹圭Н'
+            },{
+                name:'description',
+                text:'鎻忚堪',
+                useAllWidth:true,
+                width:570
+            }];
+        };
+
+        this.dealData = function(add){
+            var that = this;
+            if($webUtil.isNull(that.currentItemOid)){
+                $webUtil.showErrorMsg("璇峰厛閫夋嫨搴撴埧鑺傜偣");
+                return false;
+            }
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var locationOids = $webUtil.getOidFromGrid("table_" + that.id,false,true);
+            if(locationOids){
+                var pkFatherGoodsLocation = $webUtil.getOidFromGrid("table_" + that.id,false,false,'pkFatherGoodsLocation');
+                if(add && $webUtil.isNotNull(pkFatherGoodsLocation)){
+                    $webUtil.showErrorMsg("璐т綅涓婁笉鑳藉啀娣诲姞涓嬬骇璐т綅锛涚涓�绾т负璐ф灦锛岃揣鏋剁殑涓嬬骇涓鸿揣浣�");
+                    return false;
+                }
+            }
+            var title = "璐ф灦";
+            if($webUtil.isNotNull(locationOids)){
+                title = "璐т綅";
+            }
+            var addSaveIndex = layer.open({
+                type:1,
+                title:add?('娣诲姞' + title):('淇敼' + title),
+                btn:['淇濆瓨','鍙栨秷'],
+                skin:'layui-layer-lan',
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                area:['800px','500px'],
+                closeBtn:2,
+                shade:true,
+                shadeClose:true,
+                resize:true,
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getFormItems(),
+                        function () {
+                            if(!add){
+                                //淇敼鏃剁洿鎺ヨ缃��
+                                var selectRowData = layui.table.checkStatus("table_" + that.id);
+                                form.setValues(selectRowData.data[0],filter);
+                            }else{
+                                form.setValues({pkFatherGoodsLocation:locationOids},filter);
+                            }
+                        }, {}, {defaultColumnOneRow: 2});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        values['pkWarehouse'] = that.currentItemOid;
+                        var url = that.url.controller + (add?that.url.add:that.url.edit);
+                        $webUtil.ajax(add?'post':'put',url,values,function(result){
+                            if(result.success){
+                                if($webUtil.isNull(result.msg)){
+                                    result.msg = add?"娣诲姞鎴愬姛":"淇敼鎴愬姛";
+                                }
+                                $webUtil.showMsg(result.msg);
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                $webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,error){},that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                    that.refresh();
+                }
+            });
+        };
+        this.DELETE = function(){
+            var that = this;
+            var oid = $webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts =  $webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            var submitValues = {oid:oid,ts:ts};
+            $webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欎釜璐ф灦/璐т綅",function () {
+                $webUtil.post(that.url.controller + that.url.checkIsDelete,submitValues,function(result){
+                    if(result.success){
+                        if('true' == result.obj || result.obj == true ){
+                            $webUtil.showConfirmMsg("褰撳墠璐ф灦鍖呭惈鏈変笅绾ц揣浣嶏紝灏嗕細鎶婁笅绾ц揣浣嶄竴璧峰垹闄わ紝浣犵‘瀹氳缁х画?",function () {
+                                that.doDelete(submitValues);
+                            });
+                        }else{
+                            that.doDelete(submitValues);
+                        }
+                    }else{
+                        $webUtil.showErrorMsg(result.msg);
+                    }
+                },function (xhr,err) {
+                    $webUtil.showErrorMsg("鏍¢獙鏄惁鍒犻櫎鐨勬椂鍊欏嚭閿欎簡閿欒锛屽彲鑳芥槸鏈嶅姟鍣ㄦ殏鏃舵棤娉曡闂�");
+                },that.backPath);
+            });
+        };
+        this.doDelete = function(submitValues) {
+            var that = this;
+            $webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,submitValues,function(result){
+                if(result.success){
+                    $webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                    that.refresh();
+                }else{
+                    $webUtil.showErrorMsg(result.msg);
+                }
+            },function (xhr,err) {
+                $webUtil.showErrorMsg("鎵ц鍒犻櫎鐨勬椂鍊欏嚭閿欎簡閿欒锛屽彲鑳芥槸鏈嶅姟鍣ㄦ殏鏃舵棤娉曡闂�");
+            },that.backPath);
+        };
+        this.STAR = function(){
+            var that = this;
+            that.operaData(that.url.controller +that.url.enable,'鍚敤鎴愬姛')
+        };
+        this.STOP = function(){
+            var that = this;
+            that.operaData(that.url.controller +that.url.disable,'鍋滅敤鎴愬姛')
+        };
+        this.operaData = function(url,msg){
+            var that = this;
+            var oid = $webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            $webUtil.showConfirmMsg("瀛愯妭鐐规槸鍚︿竴璧锋搷浣滐紵",function(){
+                $webUtil.post(url,{
+                    oid:oid,
+                    children:true
+                },function(result){
+                    if(result.success){
+                        $webUtil.showMsg(msg);
+                        that.refresh();
+                    }else{
+                        $webUtil.showErrorMsg(result.msg);
+                    }
+                },function (xhr,err) {
+                    $webUtil.showErrorMsg("鎵ц鐨勬椂鍊欏嚭閿欎簡閿欒锛屽彲鑳芥槸鏈嶅姟鍣ㄦ殏鏃舵棤娉曡闂�");
+                },that.backPath)
+            },function(){
+                $webUtil.post(url,{
+                    oid:oid,
+                    children:false
+                },function(result){
+                    if(result.success){
+                        $webUtil.showMsg(msg);
+                        that.refresh();
+                    }else{
+                        $webUtil.showErrorMsg(result.msg);
+                    }
+                },function (xhr,err) {
+                    $webUtil.showErrorMsg("鎵ц鐨勬椂鍊欏嚭閿欎簡閿欒锛屽彲鑳芥槸鏈嶅姟鍣ㄦ殏鏃舵棤娉曡闂�");
+                },that.backPath);
+            });
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){//濡傛灉鍏朵粬鍦版柟鎯充娇鐢ㄨ繖涓粍浠剁殑鏃跺�欙紝鍙互鑷畾涔夊垪
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),{
+                    field:'id',
+                    title:'璐т綅/璐ф灦缂栧彿',
+                    width:120
+                },{
+                    field:'name',
+                    title:'璐т綅/璐ф灦鍚嶇О',
+                    width:200
+                },{
+                    field:'curators',
+                    title:'淇濈鍛�',
+                    width:100
+                },{
+                    field:'outboundpriority',
+                    title:'鍑哄簱浼樺厛绾�',
+                    width:100
+                },{
+                    field:'inboundpriority',
+                    title:'鍏ュ簱浼樺厛绾�',
+                    width:100
+                },{
+                    field:'volume',
+                    title:'瀹圭Н',
+                    width:100
+                },{
+                    field:'lcStatusText',
+                    title:"鐘舵��",
+                    width:100
+                }];
+            }
+        };
+        this.refresh = function(){
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+    };
+    var c = new Class();
+    exports(c.MODELNAME,c);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdMaterial.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdMaterial.js
new file mode 100644
index 0000000..69f75dc
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdMaterial.js
@@ -0,0 +1,1343 @@
+/**
+ * Created by weidy on 2020/2/25. from dengbk
+ *
+ * 鐗╂枡鍩烘湰淇℃伅
+ */
+
+layui.define(['layer','element','form','table','upload','platform/basedoc/BdMaterialClassifyExtendAttr'],function(exports){
+    var Class = function(){
+        this.MODULE_NAME = "platform/basedoc/BdMaterial";
+        this.moduleKey = "BdMaterial";
+        this.id='BdMaterial';
+        this.sourceData={};
+        this.columns = [];
+        this.detailcolumns = [];
+        this.backPath = configData.compatibility?path:configData.frameworkPath;//榛樿娴佺▼鍜岄」鐩殑璺緞鏄竴鏍风殑
+        this.accountPath = configData.compatibility?path:configData.invmPath;
+        this.controlSecret = true;//鏄惁鎺у埗瀵嗙骇
+        this.url={
+            classifyTree:'materialClassifyController/referTree',
+            referClassifyTree: 'materialClassifyController/referTree',
+            controller:'materialController/',
+            dataGrid:'gridMaterial',//鍒楄〃鏁版嵁鍜屾煡璇�
+            add:'addMaterial',
+            edit:'editMaterial',
+            del:'delMaterial',
+            upRevision:'upRevisionMaterial',
+            referOldRevision:'referOldRevision',
+            release:'releaseForMaterial',
+            getObjectByOid:'getObjectByOid',
+            accountGrid:'materialAccountController/gridMaterAccountByMaterialOid',
+            referUnit:'unitOfMeasurementController/referGridData',
+            listCheckRule:'bdMaterialCheckController/gridBdMaterialCheck',
+            addSave:'bdMaterialCheckController/addSave',
+            editSave:'bdMaterialCheckController/editSave',
+            deleteData:'bdMaterialCheckController/deleteData',
+            download:'bdMaterialCheckController/downloadImportTemplate', // 瀵煎叆瀹氭瑙勫垯涓嬭浇鏂囦欢
+            importData:'bdMaterialCheckController/importData', // 瀵煎叆瀹氭瑙勫垯涓嬭浇鏂囦欢
+            exportData:'bdMaterialCheckController/exportData' //瀵煎嚭瀹氭瑙勫垯
+        };
+        this.buttonIconMap = {
+            SEARCH:'layui-icon-refresh-2',
+            SENIORSEARCH:'layui-icon-query',
+            ADD:'layui-icon-add-1',
+            EDIT:'layui-icon-edit',
+            DELETE:'layui-icon-delete'
+        };
+        this.checkRuleTypeMap = {
+            CHECK_HOUR:'check_hour',
+            CHECK_COUNT:'check_count',
+            CHECK_STORE_TIME:'check_store_time',
+            CHECK_REACH_COUNT:'check_reach_cunt',
+            CHECK_REACH_TIME:'check_reach_time',
+            CHECK_DAY:'check_day',
+            CHECK_MONTH:'check_month',
+            CHECK_YEAR:'check_year',
+            NONE:'check_none'
+        };
+        this.getContent=function(){
+            //杩斿洖杩欎釜缁勪欢鐨勫熀纭�html
+            var that = this;
+            var html = [
+                '<div class="layui-layout-border" id="border_',that.id,'" style="overflow-x:hidden;">',
+                    '<div class="layui-vci-deptTree" style="width:220px;float: left;background-color:#ffffff;">',
+                        that.getClassifyToolbarHtml(),
+                        '<label class="layui-icon layui-icon-tree" style="color:red;">鐗╂枡/宸ュ叿鍩烘湰鍒嗙被</label>',
+                        '<ul layui-filter="tree_',that.id,'"></ul>',
+                    '</div>',
+                    '<div class="layui-center" style="margin-left:225px;">',
+                         that.getToolbarHtml(),
+                        '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',//涓诲垪琛�
+                        '<div id="toolbar_column_',that.id ,'" style="display:none;"></div>',
+                    '</div>',
+                    '<div class="layui-south" style="margin-left:225px;">',
+                        '<div class="layui-tab">',
+                            '<ul class="layui-tab-title">',
+                                '<li  class="layui-this">瀹氭瑙勫垯</li>',
+                                ($webUtil.isNotNull(that.accountPath)?'<li>鍖呭惈鍙拌处娓呭崟</li>':''),
+                            '</ul>',
+                            '<div class="layui-tab-content">',
+                                '<div class="layui-tab-item layui-show">',
+                                    that.getCheckToolbarHtml(),
+                                    '<table id="table_check_', that.id , '" lay-filter="check_',that.id , '" style="overflow-x:auto;"></table>',
+                                    '<div id="toolbar_column_check_',that.id ,'" style="display:none;"></div>',
+                                '</div>',
+                                ($webUtil.isNotNull(that.accountPath)?('<div class="layui-tab-item"><table id="detail_' + that.id + '" lay-filter="detail_' + that.id + '" style="width:100%"></table><div id="toolbar_column_detail_' + that.id  + '" style="display:none;"></div></div>'):''),
+                            '</div>',
+                        '</div>',
+                    '</div>'];
+            html.push('</div>');
+            return html.join("");
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id, '" class="layui-btn-container ">',//涓诲垪琛ㄧ殑鎸夐挳 IMPORTTEMPLATE
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>鍒涘缓</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-set"></i>淇敼</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_RELEASE"><i class="layui-icon layui-icon-ok-circle"></i>鍙戝竷</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_UPREVISION"><i class="layui-icon layui-icon-templeate-1"></i>鍗囩増</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_IMPORT"><i class="layui-icon layui-icon-upload"></i>瀵煎叆鐗╂枡</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EXPORT"><i class="layui-icon layui-icon-export"></i>瀵煎嚭鐗╂枡</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_IMPORTRULE"><i class="layui-icon layui-icon-upload"></i>瀵煎叆瀹氭瑙勫垯</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EXPORTRULE"><i class="layui-icon layui-icon-export"></i>瀵煎嚭瀹氭瑙勫垯</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                    '<div class="layui-input-inline" style="position: relative; padding-right: 5px;">',
+                        '<div id="selectWrapForIE" style="display:none"></div>',
+                        '<label class="layui-form-label" style="width: 100px;font-size:14px;padding: 5px;">鏄剧ず鎵�鏈夌増鏈�:</label>',
+                        '<div class="layui-unselect layui-form-switch" lay-skin="_switch" style="margin-top:0px" id="switch_',that.id,'"><em>鍚�</em><i></i></div>',
+                    '</div>',
+
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getCheckToolbarHtml = function () {
+            var that = this;
+            var html = [  '<div layui-filter="toolbar_check_',that.id, '" class="layui-btn-container layui-buttons">',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_check_',that.id,'_ADDRULE"><i class="layui-icon layui-icon-add-1"></i>鍒涘缓瀹氭瑙勫垯</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_check_',that.id,'_EDITRULE"><i class="layui-icon layui-icon-set"></i>淇敼瀹氭瑙勫垯</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_check_',that.id,'_DELRULE"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎瀹氭瑙勫垯</button>',
+
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_check_',that.id,'_refreshRule"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getClassifyToolbarHtml = function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_classify_',that.id, '" class="layui-btn-container layui-buttons">',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_classify_',that.id,'_refreshClassify"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.init=function(){//鍩虹鐨刪tml琚坊鍔犲悗锛屽啀鎵ц鍒濆鍖�
+            var that = this;
+            $webUtil.copyConfig(that,that.moduleKey);
+            $webUtil.bindDefultButtonLisenter(that, that.id);
+            $webUtil.bindDefultButtonLisenter(that, "classify_" + that.id);
+            $webUtil.bindDefultButtonLisenter(that, "check_" + that.id);
+            var table = layui.table;
+            that.materialExtendAttr = layui['platform/basedoc/BdMaterialClassifyExtendAttr'];
+            //鍒濆鍖�
+            that.classifyTreeInit(function () {
+                that.initMainTable(
+                    function () {
+                        $webUtil.createSearchHtml({
+                            id: '缂栧彿',
+                            code:'鍥惧彿',
+                            name:'鍚嶇О',
+                            specification:'瑙勬牸',
+                            brand:'鍝佺墝',
+                            material:'鏉愯川',
+                            applyProduct:'閫傜敤浜у搧',
+                            supplier:'甯哥敤鍒堕��/渚涘簲鍟�',
+                            "useDept.name":'浣跨敤閮ㄩ棬鍚嶇О',
+                            revisionValue:'鐗堟湰鍙�'
+                        }, $('[layui-filter="toolbar_' + that.id + '"]'), that.id);
+                        // that.initCheckTable();
+                        if($webUtil.isNotNull(that.accountPath)) {
+                            that.detailTableInit();
+                        }
+                    }
+                );
+            });
+            $("#switch_" + that.id).unbind('click').click(function (e) {
+                var thisObject = $(this);
+                if(thisObject.hasClass("layui-form-onswitch")){
+                    //璇存槑鐜板湪鐐圭殑鏄紝闇�瑕佷慨鏀逛负鍚�
+                    thisObject.removeClass("layui-form-onswitch");
+                    thisObject.find("em").html("鍚�");
+                    table.reload("table_"+that.id,{
+                        where:{
+                            "conditionMap['${queryAllRevision}']":false
+                        }
+                    });
+                }else{
+                    thisObject.addClass("layui-form-onswitch");
+                    thisObject.find("em").html("鏄�");
+                    table.reload("table_"+that.id,{
+                        where:{
+                            "conditionMap['${queryAllRevision}']":true
+                        }
+                    });
+                }
+                layui.stope(e);
+            });
+        };
+        this.classifyTreeInit = function(callback){
+            //鍒濆鍖栧垎绫绘爲
+            var that = this;
+            var tree = layui.tree;
+            that.fristTreeLoad = false;
+            tree.init("tree_" + that.id, $('[layui-filter="tree_' + that.id + '"]'), {
+                url: that.url.classifyTree,
+                backPath: that.backPath,
+                extraParams: {
+                    isMuti: false,
+                    isQueryAllColumn: true
+                },
+                treeFilter: that.id,
+                treeName: 'materialClassify',
+                click: function (item, elem, options) {
+                    that.currentItemOid = item.oid;
+                    that.currentItemAttributes = item.attributes;
+                    that.showMaterialByClassify(item.attributes);
+                },
+                done:function (filter,children) {
+                    if(!that.fristTreeLoad &&callback){
+                        callback();
+                    }
+                    that.fristTreeLoad = true;
+                }
+            });
+        };
+        this.showMaterialByClassify = function (classifyAttributes) {
+            var that =this;
+            var table = layui.table;
+            that.materialExtendAttr.initExtendAttr(classifyAttributes.id,function(){
+                table.reload("table_"+that.id,{
+                    where:{
+                        materialClassify:classifyAttributes.oid
+                    }
+                });
+            });
+        };
+        this.initMainTable = function (callback) {
+            var that = this;
+            that.checkColumns();
+            var table = layui.table;
+            that.fristMainLoad = false;
+            //涓诲垪琛ㄤ腑鍒椼��
+            var tableWidth = $("#border_" + that.id).width()-225;
+            table.render({
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                url: that.backPath + that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                height:400,
+                cols: [that.columns],
+                width:tableWidth,
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        if(callback) {
+                            callback();
+                        }
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'viewInfo'){
+                                that.showMaterialByOid(data.oid);
+                            }
+                        });
+                    }
+                    that.fristMainLoad = true;
+                },
+                rowClick:function(thisTableFilter,record){
+                    that.initCheckTable(record.oid);
+                    that.addRuleOid = record.oid
+                    if($webUtil.isNotNull(that.accountPath)) {
+                        table.reload("detail_" + that.id, {
+                            extraParams: {
+                                pkMaterial: record.oid
+                            }
+                        });
+                    }
+                    table.reload("check_" + that.id, {
+                        extraParams: {
+                            pkMaterial: record.oid
+                        }
+                    });
+                }
+            });
+            document.getElementById("toolbar_column_" + that.id).innerHTML = '<a class="layui-btn layui-btn-intable" lay-event="viewInfo">鏌ョ湅</a>';
+        };
+        this.initCheckTable = function (oid) {
+            //鍒濆鍖栧畾妫�瑙勫垯鐨勮〃鏍�
+            var that = this;
+            that.checkCheckRuleColumns();
+            var table = layui.table;
+            //涓诲垪琛ㄤ腑鍒椼��
+            var tableWidth = $("#border_" + that.id).width()-225;
+            var requestData = {};
+            if(oid != undefined) {
+                requestData["conditionMap['pkMaterial']"] = oid;
+            };
+            table.render({
+                elem: '#table_check_' + that.id,
+                id: 'table_check_' + that.id,
+                url: that.backPath  + that.url.listCheckRule,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                where: requestData,
+                cols: [that.checkRuleColumns],
+                width:tableWidth,
+                done:function(res,cur,total){
+                    // if(!that.fristMainLoadCheck ){
+                    //     if(callback) {
+                    //         callback();
+                    //     }
+                        table.on('tool(check_' + that.id + ')',function(obj){
+                            console.log(obj)
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'viewInfo'){
+                                that.showRuleByOid(data);
+                            }
+                        });
+                    // }
+                    // that.fristMainLoadCheck = true;
+                }
+            });
+            document.getElementById("toolbar_column_check_" + that.id).innerHTML = '<a class="layui-btn layui-btn-intable" lay-event="viewInfo">鏌ョ湅</a>';;
+        };
+        this.detailTableInit = function(){
+            //鍒濆鍖栨槑缁嗙殑鍒楄〃
+            var that = this,table = layui.table;
+            that.detailCheckColumns();
+            var tableWidth = $("#border_" + that.id).width()-225;
+            table.render({
+                elem: '#detail_' + that.id,
+                id: 'detail_' + that.id,
+                height:230,
+                width:tableWidth,
+                url:that.accountPath + that.url.accountGrid,
+                extraParams:{
+                    pkMaterial: ''
+                },
+                page: {
+                    limit: 5,
+                    page: 1
+                },
+                cols: [that.detailcolumns]
+            });
+        };
+        this.checkLength = function(str){
+            var reg = str.replace(/[\u4e00-\u9fa5]/g,'');
+            if((str.length-reg.length)*2+reg.length<=127){
+                return str
+            }else{
+                return str.substring(0,127)
+            }
+        };
+
+        this.advancedQuery = function(){
+            var that = this;
+            var dynamicCondition = layui.dynamicCondition;
+            $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar'+ that.id+'" class="layui-inline"></div>');
+            var dataFields = that.columns;
+            that.serinorQueryInstance = dynamicCondition.create({
+                fields : dataFields//鏌ヨ瀛楁
+                ,tableId:"table_"+that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                ,type:"complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                ,conditionTextId:"#toolbar"+that.id//楂樼骇鏌ヨ 鎸夐挳鎵�鍦ㄧ殑div
+                ,popupShowQueryBtn: true//鏄剧ず楂樼骇鏌ヨ鎸夐挳
+                ,queryCallBack:function(requestData){//鏌ヨ涔嬪悗鐨刢allback
+                    //console.log(JSON.stringify(requestData))
+                }
+            });
+        };
+        this.ADD = function(){
+            var that = this;
+            if(!that.currentItemOid){
+                $webUtil.showErrorMsg("璇峰厛閫夋嫨鍒嗙被鑺傜偣鍚庡啀鎿嶄綔");
+                return false;
+            }
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(oid){
+            var that = this;
+            if(!oid) {
+                oid = $webUtil.getOidFromGrid("table_" + that.id, true, true);
+            }
+            if(!oid){
+                return false;
+            }
+            var lcStatus = $webUtil.getOidFromGrid("table_" + that.id,false,false,'lcStatus');
+            if('Editing' != lcStatus){
+                $webUtil.showErrorMsg("鍙湁鐘舵�佷负銆愮紪杈戜腑銆戞椂鎵嶈兘淇敼");
+                return  false;
+            }
+            that.addOrEdit(false);
+        };
+        this.addOrEdit = function (add) {
+            var that = this;
+            var filter = "addOrEdit_" + that.id;
+            if(!add){
+                var oid = $webUtil.getOidFromGrid("table_" + that.id,true,true);
+                if(!oid){
+                    return false;
+                }
+            }
+            var form = layui.form;
+            var addSaveIndex = layer.open({
+                type:1,
+                title: add?'鏂板鐗╂枡/宸ュ叿鍩烘湰淇℃伅':'淇敼鐗╂枡/宸ュ叿鍩烘湰淇℃伅',
+                btn: ['淇濆瓨', '鍙栨秷'],
+                skin: 'layui-layer-lan',
+                content: '<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                fullScreen:true,
+                resizing: function (layero) {
+                    form.doResize(filter);
+                },
+                success: function (layero) {
+                    form.addItems(filter,that.getFormItems(false),
+                        function () {
+                            if(add){
+                                //娣诲姞鐨勬椂鍊欙紝濡傛灉閫夋嫨鏍戣妭鐐癸紝鍒欒缃负鐗╂枡鍩烘湰鍒嗙被
+                                if($webUtil.isNotNull(that.currentItemOid)){
+                                    form.setValues({
+                                        materialClassify:that.currentItemOid,
+                                        materialClassifyText:(that.currentItemAttributes.id + " " + that.currentItemAttributes.name),
+                                        materialClassifyId:that.currentItemAttributes.id
+                                    },filter);
+                                }else{
+                                    form.setValues({},filter);
+                                }
+                            }else{
+                                var selectRowData = layui.table.checkStatus("table_" + that.id).data[0];
+                                that.materialExtendAttr.loadMaterialForForm(filter,selectRowData.oid,that.currentItemAttributes.id);
+                            }
+                            //鐩戞帶浜嬩欢
+                            form.on("select(" + filter + ")",function(data){
+                                //鎴戜滑闇�瑕佸湪杩欓噷澶勭悊鎵╁睍灞炴��
+                                //鑾峰彇鏂扮殑鍒嗙被鐨勫�硷紝鑾峰彇瀵瑰簲鐨勪笟鍔$被鍨嬬殑瀛楁鍐呭
+                                //鐒跺悗璁剧疆鏂扮殑鍐呭
+                            });
+                        }
+                        , {}
+                        , {
+                            defaultColumnOneRow: 3
+                        });
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var formValues = form.getValues(filter,true);
+                        delete formValues['extendAttrData'];
+                        for(var key in formValues){
+                            if($webUtil.startWith(key,"extendAttrData[")){
+                                delete formValues[key];
+                            }
+                        }
+                        //澶勭悊鎵╁睍灞炴��
+                        for(var key in formValues){
+                            if($webUtil.startWith(key,"ext_")){
+                                var fieldName = key.replace("ext_","");
+                                formValues['extendAttrData[' + fieldName + ']'] = formValues[key];
+                            }
+                        }
+                        $webUtil.ajax(add?'post':'put',that.url.controller + (add?that.url.add:that.url.edit),formValues,function (result) {
+                            if(result.success){
+                                $webUtil.showMsgFromResult(result,add?"鏂板鐗╂枡/宸ュ叿鍩烘湰淇℃伅鎴愬姛":"淇敼鐗╂枡/宸ュ叿鍩烘湰淇℃伅鎴愬姛");
+                                that.refresh();
+                                layer.close(addSaveIndex);
+                            }else{
+                                $webUtil.showErrorMsg(result.msg);
+                            }
+                        },function (xhr,error) {
+                            $webUtil.showErrorMsg("璁块棶鏈嶅姟鍣ㄥ嚭鐜颁簡閿欒锛屽彲鑳芥湇鍔″櫒娌℃湁寮�鍚紝鎴栬�呰繛鎺ュけ璐�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    that.refresh();
+                    layer.close()
+                }
+            });
+        };
+        this.ADDRULE = function () {
+            var that = this;
+            //娣诲姞瑙勫垯
+            var  oid = $webUtil.getOidFromGrid("table_" + that.id, true, true);
+            if(!oid){
+                return false;
+            }
+            var lcStatus = $webUtil.getOidFromGrid("table_" + that.id,false,false,'lcStatus');
+            if('Editing' != lcStatus){
+                $webUtil.showErrorMsg("鍙湁鍩烘湰淇℃伅鐨勭姸鎬佷负銆愮紪杈戜腑銆戞椂鎵嶈兘娣诲姞瀹氭瑙勫垯");
+                return  false;
+            }
+            that.addOrEditRule(true);
+        };
+        this.EDITRULE = function (oid) {
+            var that = this;
+            var  materialOid = $webUtil.getOidFromGrid("table_" + that.id, true, true);
+            if(!materialOid){
+                return false;
+            }
+            var lcStatus = $webUtil.getOidFromGrid("table_" + that.id,false,false,'lcStatus');
+            if('Editing' != lcStatus){
+                $webUtil.showErrorMsg("鍙湁鍩烘湰淇℃伅鐨勭姸鎬佷负銆愮紪杈戜腑銆戞椂鎵嶈兘娣诲姞瀹氭瑙勫垯");
+                return  false;
+            }
+            if(!oid) {
+                oid = $webUtil.getOidFromGrid("table_check_" + that.id, true, true);
+            }
+            if(!oid){
+                return false;
+            }
+            that.addOrEditRule(false,oid);
+        };
+        this.DELRULE = function(){//鍒犻櫎
+            var that = this;
+            var oid = $webUtil.getOidFromGrid("table_check_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts =  $webUtil.getOidFromGrid("table_check_" +that.id,false,false,"ts");
+            $webUtil.showConfirmMsg("鏄惁鍒犻櫎?濡傛灉鐗╂枡/宸ュ叿宸茬粡鏈夊彴璐﹀唴瀹癸紝鍒欎笉鑳藉垹闄�",function () {
+                $webUtil.deleteRequest(that.url.deleteData,{oid:oid,ts:ts},function (result) {
+                    if(result.success){
+                        $webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refreshRule();
+                    }else{
+                        $webUtil.showErrorMsg(result.msg);
+                    }
+                },function (xhr,error) {
+                    $webUtil.showErrorMsg("璁块棶鏈嶅姟鍣ㄥ嚭鐜颁簡閿欒锛屽彲鑳芥湇鍔″櫒娌℃湁寮�鍚紝鎴栬�呰繛鎺ュけ璐�");
+                },that.backPath)
+            });
+        };
+        this.IMPORT = function () {
+            var that = this;
+            var filter =that.id + "_uploadAccount";
+            var uploadIndex = layer.open({
+                type:1,
+                title:'瀵煎叆鐗╂枡鍩烘湰淇℃伅',
+                skin:'layui-layer-lan',
+                btn:['涓嬭浇瀵煎叆妯℃澘','鍙栨秷'],
+                content:'<div id="importAccount_' + that.id + '"><button type="button" class="layui-btn" id="upload_button_\' + filter + \'" style="margin:5px auto;display: block;float:left;"><i class="layui-icon layui-icon-upload"></i>娴忚鏂囦欢</button></div>',
+                closeBtn:2,
+                shade:true,
+                area:['250px','180px'],
+                shadeClose:true,
+                resize:false,
+                success:function(layero){
+
+                },
+                yes:function(){
+                    var iframeId = MD5("downloadImportTemplate" +$webUtil.getSystemVar($webUtil.systemValueKey.currentDateTimeSSS)  +$webUtil.getSystemVar($webUtil.systemValueKey.userOid));
+                    $webUtil.fileDownload(that.backPath + that.url.controller + that.url.downloadImportTemplate+ "?" + TOKEN_KEY + "=" + $webUtil.getToken() + "&downloadUUID=" + iframeId + "&materialClassifyId=" + that.currentItemAttributes.id);
+                }
+            });
+        };
+        this.IMPORTRULE = function () { //瀵煎叆瀹氭瑙勫垯
+            var that = this;
+            var selectData  = layui.table.checkStatus("table_" + that.id).data[0];
+            if(selectData == undefined){
+                $webUtil.showErrorMsg('璇烽�夋嫨涓�鏉℃暟鎹�!');
+                return false;
+            }
+            var form = layui.form;
+            var filter = that.id + "_uploadAccount";
+            var uploadIndex = layer.open({
+                type:1,
+                title:'瀵煎叆瀹氭瑙勫垯',
+                skin:'layui-layer-lan',
+                btn:['涓嬭浇瀵煎叆妯℃澘','鍙栨秷'],
+                content:'<div id="importAccount_' + filter + '"></div>',
+                closeBtn:2,
+                shade:true,
+                area:['500px','300px'],
+                shadeClose:true,
+                resize:false,
+                success:function(layero){
+                    form.addItems(filter,[{
+                        type:'label',
+                        name:'uploadTwoDimensions',
+                        labelWidth:140,
+                    }],function(){
+                        $("#importAccount_" + filter).append('<div style="display:block;width:190px;margin:10px auto 0">閫夋嫨鏂囦欢鍚庤嚜鍔ㄤ笂浼�</div>');
+                        $("#importAccount_" + filter).append('<button type="button" class="layui-btn" id="upload_button_' + filter + '" style="display:block;width:190px;margin:100px auto 0"><i class="layui-icon layui-icon-upload"></i>閫夋嫨鏂囦欢鍚庤嚜鍔ㄤ笂浼�</button>');
+                        var upload = layui.upload;
+                        //鎵ц瀹炰緥
+                        var uploadInst = upload.render({
+                            elem: '#upload_button_' + filter //缁戝畾鍏冪礌
+                            ,accept:'file'
+                            ,acceptMime:'file/*'
+                            ,exts:'xls|xlsx'
+                            ,url: that.backPath+ that.url.importData//涓婁紶鎺ュ彛
+                            ,auto:true
+                            ,before:function(obj){            
+                                obj.setData({pkMaterial:selectData.oid});
+                                return true;
+                            }
+                            ,done: function(result){//涓嶉渶瑕佽緭鍏ュ唴瀹癸紝鍥犳娌℃湁before
+                                if(result.success){
+                                    layer.close(uploadIndex);
+                                    $webUtil.showMsg("涓婁紶瀹氭瑙勫垯鎴愬姛!");
+                                    that.refresh();
+                                    that.refreshRule();
+                                }else{
+                                    $webUtil.showErrorMsg(result.msg);
+                                }
+                            }
+                            ,error: function(){
+                                //璇锋眰寮傚父鍥炶皟
+                                $webUtil.showErrorMsg("涓婁紶寮傚父,鏈嶅姟绔嚭閿欎簡");
+                            }
+                        });
+                    },{},{
+                        defaultColumnOneRow:1,
+                        inDialog:true
+                    });
+                },
+                yes:function(){
+                    // var iframeId = MD5("downloadImportTemplate" +$webUtil.getSystemVar($webUtil.systemValueKey.currentDateTimeSSS)  +$webUtil.getSystemVar($webUtil.systemValueKey.userOid));
+                    // $webUtil.fileDownload(that.backPath + that.url.download+ "?" + TOKEN_KEY + "=" + $webUtil.getToken() + "&downloadUUID=" + iframeId + "&materialClassifyId=" + that.currentItemAttributes.id);
+                    var oid = "&" + "conditionMap['pkMaterial']=" + selectData.oid
+                    var downIframe = $("<iframe>");
+                    var iframeId = MD5("downloadImportTemplate" +$webUtil.getSystemVar($webUtil.systemValueKey.currentDateTimeSSS)  +$webUtil.getSystemVar($webUtil.systemValueKey.userOid));
+                    iframeId.src = that.backPath + that.url.download;
+                    portal.downloadFileUUID.push(iframeId);
+                    downIframe.attr("style","display:none;");
+                    downIframe.attr("id",iframeId);
+                    $("body").append(downIframe);
+                    downIframe.attr("src",that.backPath + that.url.download+ "?" + TOKEN_KEY + "=" + $webUtil.getToken() + "&downloadUUID=" + iframeId + "&materialClassifyId=" + that.currentItemAttributes.id+encodeURI(oid));
+                    downIframe.load(function(){
+                        if(downIframe.contents() && downIframe.contents().length>0) {
+                            $webUtil.showErrorMsg(downIframe.contents().find("pre").html());
+                        }
+                        downIframe.remove();
+                    });
+                }
+            });
+        };
+        this.EXPORTRULE = function () {  // 瀵煎嚭瀹氭瑙勫垯
+            var that = this
+            var selectData  = layui.table.checkStatus("table_" + that.id).data[0];
+            if(selectData != undefined){
+                var query = "";
+                query += "&" + "conditionMap['pkMaterial']=" + selectData.oid
+                // $webUtil.showConfirmMsg("鎮ㄧ‘瀹氳涓嬭浇鏂囦欢鍚楋紵涓嬭浇鍚庤瑙e帇鍘嬬缉鍖呭悗鍐嶈嚜琛屾墦寮�鏂囦欢",function(){
+                var downIframe = $("<iframe>");
+                var iframeId = MD5(that.id + $webUtil.getSystemVar($webUtil.systemValueKey.userOid));
+                iframeId.src = that.backPath + that.url.exportData;
+                portal.downloadFileUUID.push(iframeId);
+                downIframe.attr("style","display:none;");
+                downIframe.attr("id",iframeId);
+                $("body").append(downIframe);
+                downIframe.attr("src",that.backPath + that.url.exportData+"?limit=-1"+ "&AuthorizationToken=" + $webUtil.getToken() + encodeURI(query));
+                downIframe.load(function(){
+                    if(downIframe.contents() && downIframe.contents().length>0) {
+                        $webUtil.showErrorMsg(downIframe.contents().find("pre").html());
+                    }
+                    downIframe.remove();
+                });
+                // });
+            } else {
+                $webUtil.showErrorMsg('璇烽�夋嫨涓�鏉℃暟鎹�!');
+            }
+        };
+        this.addOrEditRule = function (add,oid) {
+            var that = this;
+            var filter = "addOrEditRule_" + that.id;
+            if(!add){
+                if(!oid) {
+                    oid = $webUtil.getOidFromGrid("table_check_" + that.id, true, true);
+                }
+                if(!oid){
+                    return false;
+                }
+            }
+            var form = layui.form;
+            var addSaveIndex = layer.open({
+                type:1,
+                title: add?'鏂板瀹氭瑙勫垯':'淇敼瀹氭瑙勫垯',
+                btn: ['淇濆瓨', '鍙栨秷'],
+                skin: 'layui-layer-lan',
+                content: '<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                fullScreen:true,
+                resizing: function (layero) {
+                    form.doResize(filter);
+                },
+                success: function (layero) {
+                    form.addItems(filter,that.getFormCheckItems(false),
+                        function () {
+                            if(add) {
+
+                            }else {
+                                var selectRowData = layui.table.checkStatus("table_check_" + that.id).data[0];
+                                form.setValues(selectRowData,filter);
+                            }
+                        }
+                        , {}
+                        , {
+                            defaultColumnOneRow: 2
+                        });
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var formValues = form.getValues(filter,true);
+                        formValues.pkMaterial = that.addRuleOid;
+                        $webUtil.ajax(add?'post':'put',(add?that.url.addSave:that.url.editSave),formValues,function (result) {
+                            if(result.success){
+                                $webUtil.showMsgFromResult(result,add?"鏂板瀹氭瑙勫垯鎴愬姛":"淇敼瀹氭瑙勫垯鎴愬姛");
+                                that.refreshRule();
+                                layer.close(addSaveIndex);
+                            }else{
+                                $webUtil.showErrorMsg(result.msg);
+                            }
+                        },function (xhr,error) {
+                            $webUtil.showErrorMsg("璁块棶鏈嶅姟鍣ㄥ嚭鐜颁簡閿欒锛屽彲鑳芥湇鍔″櫒娌℃湁寮�鍚紝鎴栬�呰繛鎺ュけ璐�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    that.refreshRule();
+                    layer.close()
+                }
+            });
+        };
+
+        this.showMaterialByOid =function (oid) { //鐗╂枡鍩烘湰淇℃伅鏌ョ湅
+            var that = this;
+            if(!oid){
+                return false;
+            }
+            var filter = "view_" + that.id;
+            var form = layui.form;
+            var addSaveIndex = layer.open({
+                type:1,
+                title: '鏌ョ湅鐗╂枡/宸ュ叿鍩烘湰淇℃伅',
+                skin: 'layui-layer-lan',
+                content: '<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                fullScreen:true,
+                resizing: function (layero) {
+                    form.doResize(filter);
+                },
+                success: function (layero) {
+                    form.addItems(filter,that.getFormItems(true),function () {
+                            that.materialExtendAttr.loadMaterialForForm(filter,oid,that.currentItemAttributes.id);
+                        }
+                        , {}
+                        , {
+                            defaultColumnOneRow: 3
+                        });
+                }
+            });
+        };
+        this.showRuleByOid =function (data) { //瀹氭瑙勫垯鏌ョ湅
+            var that = this;
+            var filter = "view_" + that.id;
+            var form = layui.form;
+            var addSaveIndex = layer.open({
+                type:1,
+                title: '瀹氭瑙勫垯',
+                skin: 'layui-layer-lan',
+                content: '<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                fullScreen:true,
+                resizing: function (layero) {
+                    form.doResize(filter);
+                },
+                success: function (layero) {
+                    form.addItems(filter,that.getFormCheckItems(true),function () {
+                            form.setValues(data,filter)
+                        }
+                        , {}
+                        , {
+                            defaultColumnOneRow: 3
+                        });
+                }
+            });
+        };
+        this.getFormItems = function(readOnly){
+            var that = this;
+            var items = [{
+                name:'materialClassify',
+                text:'鐗╂枡/宸ュ叿鍒嗙被',
+                type:'refer',
+                showField: 'materialClassifyText',
+                required:true,
+                readOnly:readOnly,
+                referConfig:{
+                    type:'tree',
+                    url: that.url.referClassifyTree,
+                    backPath:that.backPath,
+                    textField:'id,name',
+                    valueField:'oid',
+                    isMuti:false
+                }
+            },{
+                name:'id',
+                text:'鐗╂枡/宸ュ叿缂栧彿',
+                readOnly:readOnly,
+                required:true
+            },{
+                name:'code',
+                readOnly:readOnly,
+                text:'鍥惧彿'
+            },{
+                name:'name',
+                text:'鍚嶇О',
+                readOnly:readOnly,
+                required:true
+            },{
+                name:'revisionValue',
+                readOnly:readOnly,
+                text:'鐗堟湰'
+            },{
+                name:'useDept',
+                text:'浣跨敤閮ㄩ棬',
+                readOnly:readOnly,
+                type:'refer',
+                showField: 'useDeptName',
+                referConfig: {
+                    type:layui.vciAlias.referRegister.departmentRefer
+                }
+            },{
+                name:'specification',
+                readOnly:readOnly,
+                text:'瑙勬牸'
+            },{
+                name:'materialModel',
+                readOnly:readOnly,
+                text:'鐗╂枡鍨嬪彿'
+            },{
+                name:'brand',
+                readOnly:readOnly,
+                text:'鍝佺墝'
+            },{
+                name:'material',
+                readOnly:readOnly,
+                text:'鏉愯川'
+            },{
+                name:'applyProduct',
+                readOnly:readOnly,
+                text:'閫傜敤浜у搧'
+            },{
+                name:'supplier',
+                text:'甯哥敤鍒堕��/渚涘簲鍟�',
+                readOnly:readOnly
+            },{
+                readOnly:readOnly,
+                name:'unitOfMeasurement',
+                text:'璁¢噺鍗曚綅(鍙墜杈�)',
+                type:'refer',
+                showField: 'unitOfMeasurement',
+                referConfig: {
+                    type:'grid',
+                    url: that.url.referUnit,
+                    backPath: configData.frameworkPath,
+                    textField:'id',
+                    valueField:'id',
+                    editable:true,
+                    tableConfig: {
+                        page: {
+                            limit: 15,
+                            page: 1
+                        },
+                        cols: [layui.table.getIndexColumn(), layui.table.getCheckColumn(), {
+                            field: 'id',
+                            title: '鍗曚綅',
+                            sort:true,
+                            width: 150
+                        }, {
+                            field: 'name',
+                            title: '璇存槑',
+                            sort:true,
+                            width: 150
+                        }],
+                        queryColumns: [{
+                            field: 'id',
+                            title: '鍗曚綅'
+                        }, {
+                            field: 'name',
+                            title: '璇存槑'
+                        }]
+                    }
+                }
+            },{
+                name:'priceOfUnit',
+                text:'鍗曚环',
+                readOnly:readOnly,
+                verify:'number'
+            },layui.vciWebComboxStore.getSecretObject(that.controlSecret)];
+            var extendAttrs = that.materialExtendAttr.getFormItemsByClassifyId(that.currentItemAttributes.id);
+            if(extendAttrs && extendAttrs.length > 0){
+                layui.each(extendAttrs,function (_index,_item) {
+                    _item.name = "ext_" + _item.name;
+                    if(readOnly){
+                        _item.readOnly = readOnly;
+                    }
+                });
+                items = items.concat(extendAttrs);
+            }
+            items.push({
+                name:'materialLife',
+                text:'瀵垮懡',
+                readOnly:readOnly
+            },{
+                name:'description',
+                type:'textarea',
+                textWidth:870,
+                readOnly:readOnly,
+                text:'澶囨敞'
+            });
+            return items;
+        };
+        this.getFormCheckItems = function (readOnly) {
+            var that = this;
+            var table = layui.table;
+            var items = [{
+                name: 'name',
+                text: '瑙勫垯鍚嶇О',
+                required:true,
+                readOnly:readOnly
+            },{
+                name:readOnly ? 'checkTypeText' : 'checkType',
+                text:'瀹氭绫诲瀷',
+                type:readOnly ? 'text' : 'combox',
+                comboxKey:'lifeCountType',
+                required:true,
+                readOnly:readOnly
+            },{
+                name:'checkCycle',
+                text:'瀹氭鍛ㄦ湡鏁�',
+                verify:'number',
+                required:true,
+                readOnly:readOnly
+            },{
+                name:'alertCycle',
+                text:'鎻愬墠鎻愰啋鏁�',
+                verify:'number',
+                required:true,
+                readOnly:readOnly
+            },{
+                name:'checkContent',
+                text:'瀹氭鍐呭',
+                isNewRow:true,
+                inputWidth:400,
+                type:'textarea',
+                readOnly:readOnly
+            },{
+                field:'exclusiveRuleName',
+                text:'浜掓枼瀹氭瑙勫垯',
+                type:'refer',
+                showField:'exclusiveRuleName',
+                readOnly:readOnly,
+                referConfig:{
+                    type:'grid',
+                    url: "bdMaterialCheckController/getByMaterialOid",
+                    backPath:that.backPath,
+                    textField:'name',
+                    valueField:'oid',
+                    extraParams:{
+                        materialOid:that.addRuleOid
+                    },
+                    isMuti:false,
+                    tableConfig:{
+                        page:{
+                            limit:15,
+                            page:1
+                        },
+                        cols:[table.getIndexColumn(),table.getCheckColumn(),{
+                            field:'name',
+                            title:'瀹氭鍚嶇О',
+                            width:430
+                        },{
+                            field:'exclusiveRuleName',
+                            title:'浜掓枼瑙勫垯鍚嶇О',
+                        }],
+                        queryColumns:[{
+                            field:'name',
+                            title:'瀹氭鍚嶇О'
+                        }]
+                    }
+                }
+            }];
+            return items;
+        };
+        this.RELEASE = function(){
+            var that = this;
+            //鍙戝竷鐗堟湰
+            var oid = $webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts =  $webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            $webUtil.showConfirmMsg("鏄惁鍙戝竷褰撳墠鐗堟湰锛屽彂甯冨悗鑰佺殑鐗堟湰灏嗘棤娉曡浣跨敤",function () {
+                $webUtil.put(that.url.controller + that.url.release,{oid:oid,ts:ts},function (result) {
+                    if(result.success){
+                        $webUtil.showMsgFromResult(result,"鍙戝竷鎴愬姛");
+                        that.refresh();
+                    }else{
+                        $webUtil.showErrorMsg(result.msg);
+                    }
+                },function (xhr,error) {
+                    $webUtil.showErrorMsg("璁块棶鏈嶅姟鍣ㄥ嚭鐜颁簡閿欒锛屽彲鑳芥湇鍔″櫒娌℃湁寮�鍚紝鎴栬�呰繛鎺ュけ璐�");
+                },that.backPath);
+            });
+        };
+        this.UPREVISION= function () {
+            var that = this;
+            //鍗囩増鏈紝鎶婁箣鍓嶇殑鐗堟湰鐨勪俊鎭紝鍘婚櫎鍩烘湰淇℃伅鍜岀増鏈殑淇℃伅鍚庯紝浣滀负鏂扮増鏈殑鏁版嵁
+            var filter = "uprevision_" + that.id;
+            var form = layui.form;
+            var oid = $webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var lcStatus = $webUtil.getOidFromGrid("table_" + that.id,false,false,'lcStatus');
+            if('Released' != lcStatus){
+                $webUtil.showErrorMsg("鍙湁鐘舵�佷负銆愬凡鍙戝竷銆戞椂鎵嶈兘鍗囩増");
+                return  false;
+            }
+            var selectRowData = layui.table.checkStatus("table_" + that.id);
+            var addSaveIndex = layer.open({
+                type:1,
+                title: '鐗╂枡/宸ュ叿鍩烘湰淇℃伅淇锛堝崌鐗堬級',
+                btn: ['淇濆瓨', '鍙栨秷'],
+                skin: 'layui-layer-lan',
+                content: '<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                fullScreen:true,
+                resizing: function (layero) {
+                    form.doResize(filter);
+                },
+                success: function (layero) {
+                    var formItems = that.getFormItems(false);
+                    //闇�瑕佸湪绗竴涓厓绱犻噷娣诲姞
+                    formItems.unshift({
+                        name:'copyFromVersion',
+                        text:'淇鏉ヨ嚜(婧�)',
+                        type: 'refer',
+                        showField:'copyFromVersionName',
+                        required:true,
+                        textWidth:870,
+                        useAllWidth:true,
+                        referConfig:{
+                            type:'grid',
+                            url: that.url.controller + that.url.referOldRevision,
+                            backPath:that.backPath,
+                            textField:'id,name,revision',
+                            valueField:'oid',
+                            extraParams:{
+                                nameOid:selectRowData.data[0].nameOid
+                            },
+                            isMuti:false,
+                            tableConfig:{
+                                page:{
+                                    limit:15,
+                                    page:1
+                                },
+                                cols:that.getOldRevisionColumns(),
+                                method:'get'
+                            }
+                        }
+                    });
+                    form.addItems(filter,formItems,
+                        function () {
+                            var selectRowData = layui.table.checkStatus("table_" + that.id);
+                            if(selectRowData !=null && selectRowData.data !=null && selectRowData.data.length > 0) {
+                                var selectValues = selectRowData.data[0];
+                                var newRevisionData = {};
+                                for (var key in selectValues) {
+                                    if(key !='revisionValue' && key !='versionValue') {
+                                        newRevisionData[key] = selectValues[key];
+                                    }
+                                }
+                                newRevisionData['copyFromVersion'] = selectValues.oid;
+                                newRevisionData['copyFromVersionName'] = selectValues.id + " " + selectValues.name + "(" + selectValues.revisionValue + ")";
+                                form.setValues(newRevisionData, filter);
+                            }
+
+                            //鐩戞帶浜嬩欢
+                            form.on("select(" + filter + ")",function(data){
+                                if(data.elem.name == 'copyFromVersion'){
+                                    //璇存槑鍙樻洿浜嗙増鏈紝闇�瑕侀噸鏂板姞杞芥暟鎹�
+                                    $webUtil.get(that.url.controller + that.url.getObjectByOid ,{oid:data.value},function (result) {
+                                        if(result.success){
+                                            result.obj['copyFromVersion'] = data.value;
+                                            result.obj['copyFromVersionName']=result.obj[0].oid + " " + result.obj[0].id + " " + result.obj[0].name + "(" + result.obj[0].revisionValue + ")";
+                                            form.setValues(result.obj,filter);
+                                        }else{
+                                            $webUtil.showErrorForResult(result,"鑾峰彇鑰佺増鏈殑鏁版嵁鍑虹幇浜嗛敊璇�");
+                                        }
+                                    },function (xhr,error) {
+                                        $webUtil.showErrorMsg("杩炴帴鏈嶅姟鍣ㄥ嚭鐜颁簡閿欒锛屽彲鑳藉洜涓烘湇鍔″櫒鏈惎鍔�");
+                                    },that.backPath);
+                                }
+                                //鎴戜滑闇�瑕佸湪杩欓噷澶勭悊鎵╁睍灞炴��
+                                //鑾峰彇鏂扮殑鍒嗙被鐨勫�硷紝鑾峰彇瀵瑰簲鐨勪笟鍔$被鍨嬬殑瀛楁鍐呭
+                                //鐒跺悗璁剧疆鏂扮殑鍐呭
+                            });
+                        }
+                        , {}
+                        , {
+                            defaultColumnOneRow: 3
+                        });
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var formValues = form.getValues(filter);
+                        formValues.materialClassifyId = formValues.materialClassify;
+                        $webUtil.post(that.url.controller + that.url.upRevision,formValues,function (result) {
+                            if(result.success){
+                                $webUtil.showMsgFromResult(result,"淇锛堝崌鐗堬級鐗╂枡/宸ュ叿鍩烘湰淇℃伅鎴愬姛");
+                                that.refresh();
+                                layer.close(addSaveIndex);
+                            }else{
+                                $webUtil.showErrorMsg(result.msg);
+                            }
+                        },function (xhr,error) {
+                            $webUtil.showErrorMsg("璁块棶鏈嶅姟鍣ㄥ嚭鐜颁簡閿欒锛屽彲鑳芥湇鍔″櫒娌℃湁寮�鍚紝鎴栬�呰繛鎺ュけ璐�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    that.refresh();
+                    layer.close()
+                }
+            });
+        };
+        this.getOldRevisionColumns = function () {
+            var that = this;
+            var table = layui.table;
+            return [table.getIndexColumn(),table.getCheckColumn(),{
+                    field:'id',
+                    title:'缂栧彿',
+                    width:150
+                },{
+                    field:'name',
+                    title:'鍚嶇О',
+                    width:200
+                },{
+                    field:'revisionValue',
+                    title:'鐗堟湰',
+                    width:80
+                },{
+                    field:'code',
+                    title:'鍥惧彿',
+                    width:120
+                },{
+                    field:'specification',
+                    title:'瑙勬牸',
+                    width:120
+                },{
+                    field:'brand',
+                    title:'鍝佺墝',
+                    width:120
+                },{
+                    field:'lcStatusText',
+                    title:'鐘舵��',
+                    width:80
+                }];
+        };
+        this.DEL = function(){//鍒犻櫎
+            var that = this;
+            var oid = $webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts =  $webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            $webUtil.showConfirmMsg("鏄惁鍒犻櫎?濡傛灉鐗╂枡/宸ュ叿宸茬粡鏈夊彴璐﹀唴瀹癸紝鍒欎笉鑳藉垹闄�",function () {
+                $webUtil.deleteRequest(that.url.controller + that.url.del,{oid:oid,ts:ts},function (result) {
+                    if(result.success){
+                        $webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    }else{
+                        $webUtil.showErrorMsg(result.msg);
+                    }
+                },function (xhr,error) {
+                    $webUtil.showErrorMsg("璁块棶鏈嶅姟鍣ㄥ嚭鐜颁簡閿欒锛屽彲鑳芥湇鍔″櫒娌℃湁寮�鍚紝鎴栬�呰繛鎺ュけ璐�");
+                },that.backPath)
+            }); 
+        };
+
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){//濡傛灉鍏朵粬鍦版柟鎯充娇鐢ㄨ繖涓粍浠剁殑鏃跺�欙紝鍙互鑷畾涔夊垪
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),{
+                    field:'id',
+                    title:'鐗╂枡/宸ュ叿缂栧彿 鍚嶇О (鐗堟湰锛�',
+                    width:350,
+                    templet:function(d){
+                        return  d.id + ' ' + d.name + ' (' + d.revisionValue + ')' ;
+                    }
+                },{
+                    field:'code',
+                    title:'鍥惧彿',
+                    width:120
+                },{
+                    field:'specification',
+                    title:'瑙勬牸',
+                    width:120
+                },{
+                    field:'brand',
+                    title:'鍝佺墝',
+                    width:120
+                },{
+                    field:'lcStatusText',
+                    title:'鐘舵��',
+                    width:80
+                },{
+                    title:'鎿嶄綔',
+                    field:'options',
+                    width:140,
+                    fixed:'right',
+                    toolbar: '#toolbar_column_' + that.id
+                }];
+            }
+        };
+        this.checkCheckRuleColumns = function () {
+            var that = this;
+            var table = layui.table;
+            if(that.checkRuleColumns==null || that.checkRuleColumns.length==0){//濡傛灉鍏朵粬鍦版柟鎯充娇鐢ㄨ繖涓粍浠剁殑鏃跺�欙紝鍙互鑷畾涔夊垪
+                that.checkRuleColumns = [table.getIndexColumn(),table.getCheckColumn(),{
+                    field:'name',
+                    title:'瑙勫垯鍚嶇О',
+                    width:150
+                },{
+                    field:'checkCycle',
+                    title:'瀹氭鍛ㄦ湡鏁�',
+                    width:90
+                },{
+                    field:'checkTypeText',
+                    title:'瀹氭绫诲瀷',
+                    width:200
+                    // templet:function (d) {
+                    //     if(d.checkCycle*1>0 && $webUtil.isNotNull(d.checkCycleType) && 'check_none' != d.checkCycleType){
+                    //         if(that.checkRuleTypeMap.CHECK_REACH_COUNT == d.checkCycleType){
+                    //             return "浣跨敤娆℃暟杈惧埌銆�" + d.checkCycle + "銆戝畾妫�";
+                    //         }else if(that.checkRuleTypeMap.CHECK_REACH_TIME == d.checkCycleType){
+                    //             return "浣跨敤鏃堕棿杈惧埌銆�" + d.checkCycle + "銆戝畾妫�";
+                    //         }else if(that.checkRuleTypeMap.CHECK_COUNT == d.checkCycleType){
+                    //             return "浣跨敤娆℃暟姣忛棿闅斻��" + d.checkCycle + "銆戞瀹氭";
+                    //         }else if(that.checkRuleTypeMap.CHECK_STORE_TIME == d.checkCycleType){
+                    //             return "瀛樻斁鏃堕棿姣忛棿闅斻��" + d.checkCycle + "銆戞瀹氭";
+                    //         }else{
+                    //             return "姣忛棿闅斻��" + d.checkCycle + "銆�" + d.checkCycleType + "瀹氭";
+                    //         }
+                    //     }
+                    //     return '涓嶅畾妫�';
+                    // }
+                },{
+                    field:'alertCycle',
+                    title:'鎻愬墠鎻愰啋鏁�',
+                    width:90
+                },{
+                    field:'checkContent',
+                    title:'瀹氭鍐呭',
+                    width:300
+                },{
+                    field:'exclusiveRuleName',
+                    title:'浜掓枼瑙勫垯鍚嶇О',
+                    width:150
+                },{
+                    title:'鎿嶄綔',
+                    field:'options',
+                    width:140,
+                    fixed:'right',
+                    toolbar: '#toolbar_column_check_' + that.id
+                }];
+            }
+        };
+        this.detailCheckColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.detailcolumns==null || that.detailcolumns.length==0){//濡傛灉鍏朵粬鍦版柟鎯充娇鐢ㄨ繖涓粍浠剁殑鏃跺�欙紝鍙互鑷畾涔夊垪
+                that.detailcolumns = [table.getIndexColumn(),table.getCheckColumn(),{
+                    field:'id',
+                    title:'鍙拌处缂栧彿 鍚嶇О(鐗堟湰)',
+                    width:350,
+                    fixed:'left',
+                    templet:function(d) {
+                        return d.id + ' ' + d.name + ' (' + d.revisionValue + ')';
+                    }
+                },{
+                    field:'code',
+                    title:'鍥惧彿',
+                    width:120
+                },{
+                    field:'specification',
+                    title:'瑙勬牸',
+                    width:120
+                },{
+                    field:'quantity',
+                    title:'鎬绘暟閲�/鍦ㄥ簱/鍙',
+                    width:160,
+                    templet:function(d){
+                        return d.quantity + "/" + d.quantityInStore + "/" + d.canBorrowQuantity + " (" + d.unitOfMeasurement  + ")";
+                    }
+                },{
+                    field:'pkWarehouseName',
+                    title:'鎵�灞炲簱鎴�',
+                    width:120
+                },{
+                    field:'invStatusText',
+                    title:'搴撳瓨鐘舵��',
+                    width:90
+                },{
+                    field:'brand',
+                    title:'鍝佺墝',
+                    width:80
+                },{
+                    field:'material',
+                    title:'鏉愯川',
+                    width:80
+                },{
+                    field:'applyProduct',
+                    title:'閫傜敤浜у搧',
+                    width:120
+                },{
+                    field:'supplier',
+                    title:'鍒堕��/渚涘簲鍟�',
+                    width:120
+                },{
+                    field:'description',
+                    title:'澶囨敞',
+                    width:120
+                }];
+            }
+        };
+        this.refreshClassify = function () {
+            var that = this;
+            layui.tree.reload("tree_" + that.id);
+        };
+        this.refresh = function(){
+            var that = this;
+            layui.table.reload('table_' + that.id,{});
+            if($webUtil.isNotNull(that.accountPath)) {
+                layui.table.reload('detail_' + that.id, {});
+            }
+        };
+        this.refreshRule = function(){
+            var that = this;
+            layui.table.reload('table_check_' + that.id,{});
+            if($webUtil.isNotNull(that.accountPath)) {
+                layui.table.reload('detail_' + that.id, {});
+            }
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODULE_NAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdMaterialClassify.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdMaterialClassify.js
new file mode 100644
index 0000000..e7212be
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdMaterialClassify.js
@@ -0,0 +1,372 @@
+/**
+ * 鐗╂枡/宸ュ叿鍩烘湰鍒嗙被
+ * @author weidy@2020/3/13
+ */
+layui.define(['layer','element','form','table','util'],function(exports){
+    var Class = function(){
+        this.MODELNAME = "platform/basedoc/BdMaterialClassify";
+        this.moduleKey = "BdMaterialClassify";
+        this.id = 'BdMaterialClassify';
+        this.sourceData = {};
+        this.columns = [];
+        this.backPath =  configData.compatibility?path:configData.frameworkPath;//榛樿娴佺▼鍜岄」鐩殑璺緞鏄竴鏍风殑
+        this.url={
+            controller:'materialClassifyController/',
+            classifyTree:'treeMaterialClassify',
+            add:'addMaterialClassify',
+            edit:'editMaterialClassify',
+            checkIsDelete:'checkIsCanDelete',
+            deleteUrl:'delMaterialClassify',
+            disableUrl:'disableMaterialClassify',
+            enableUrl:"enableMaterialClassify",
+            referTree:'referTree',
+            referBtmType:'btmTypeController/referDataGridNotPlatform'
+        };
+        this.buttonIconMap = {
+            SEARCH:'layui-icon-refresh-2',
+            SENIORSEARCH:'layui-icon-query',
+            ADD:'layui-icon-add-1',
+            EDIT:'layui-icon-edit',
+            DELETE:'layui-icon-delete'
+        };
+        this.getContent=function(){
+            var that = this;
+            var html = "";
+            html = [
+                that.getToolbarHtml(),
+                '<div class="layui-layout" style="display:block;overflow-y: hidden">',
+                '<div class="layui-vci-tree" style="width:400px;float: left;background-color:#ffffff;overflow-y: auto;">',
+                '<label class="layui-icon layui-icon-tree" style="line-height: 20px;color:red;font-size:20px;">鐗╂枡/宸ュ叿鍩烘湰鍒嗙被</label>',
+                '<ul layui-filter="tree_',that.id,'" style="overflow-x: auto;"><ul>',
+                '</div>',
+                '<div class="layui-layout-border" style="display:block;margin-top:0px;margin-left:405px;">',
+                '<div class="layui-center" style="overflow-y:auto;">',
+                '<form class="layui-form" lay-filter="form_',that.id,'"></form>',
+                '</div>',
+                '</div>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            return ['<div layui-filter="toolbar_',that.id, '" class="layui-btn-container">',//涓诲垪琛ㄧ殑鎸夐挳
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_STAR"><i class="layui-icon layui-icon-ok-circle"></i>鍚敤</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_STOP"><i class="layui-icon layui-icon-404"></i>鍋滅敤</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'].join("");
+        };
+        this.init=function(){
+            //鍩虹鐨刪tml琚坊鍔犲悗锛屽啀鎵ц鍒濆鍖�
+            var that = this;
+            $webUtil.copyConfig(that,that.moduleKey);
+            $webUtil.bindDefultButtonLisenter(that, that.id);
+            var tree = layui.tree;
+            var scrollHeight =  window.innerHeight;
+            var treeUL = $('[layui-filter="tree_' + that.id + '"]');
+            var treeHeight = scrollHeight - 200;
+            treeUL.parent().height(treeHeight);
+            tree.init("tree_" + that.id, treeUL, {
+                url: that.url.controller + that.url.classifyTree,
+                backPath: that.backPath,
+                extraParams: {
+                    isMuti: false,
+                    isQueryAllColumn: true
+                },
+                showSearch:true,
+                click: function (item, elem, options) {
+                    that.currentItemOid = item.oid;
+                    that.currentItemAttributes = item.attributes;
+                    that.setFormValues(that.currentItemAttributes);
+                },
+                done: function (thisFilter) {
+                    that.initForm();
+                }
+            });
+        };
+        this.initForm = function(){
+            var that = this;
+            var form = layui.form;
+            form.addItems("form_" + that.id, that.getFormItems(true), function () {
+            }, {}, {
+                defaultColumnOneRow: 1,
+                labelWidth: 200
+            });
+        };
+        this.setFormValues = function (attributes) {
+            var that = this;
+            if(attributes){
+                try{
+                    var form = layui.form;
+                    form.clear("form_" + that.id,true);
+                    form.setValues(attributes,"form_" + that.id);//涓嶉渶瑕佽浆鎹㈠璞★紝鍥犱负attributes宸茬粡鏄璞℃牸寮忎簡
+                }catch (e){
+                    $webUtil.showDebugMsg(e);
+                }
+            }
+        };
+        this.getFormItems = function(onlyShow){
+            var that = this;
+            return [{
+                field: 'id',
+                text: '鐗╂枡/宸ュ叿鍒嗙被缂栧彿',
+                required:true,
+                readOnly: onlyShow
+            }, {
+                field: 'name',
+                text: '鐗╂枡/宸ュ叿鍒嗙被鍚嶇О',
+                required:true,
+                readOnly: onlyShow
+            },{
+                name:'extendAttrFlag',
+                text:'鍖呭惈鎵╁睍灞炴��',
+                type:'truefalse'
+            },{
+                name:'extendAttrStoreBtm',
+                text:'鎵╁睍灞炴�т笟鍔$被鍨�',
+                type:'refer',
+                showField:'extendAttrStoreBtmName',
+                referConfig:{
+                    type:'grid',
+                    backPath:configData.objectServicePath,
+                    url:that.url.referBtmType,
+                    textField:'id,name',
+                    valueField:'id',
+                    isMuti:false,
+                    where:{
+                        'id':'material*'
+                    },
+                    tableConfig:{
+                        page:{
+                            limit:15,
+                            page:1
+                        },
+                        cols:that.getBtmTypeReferColumns(),
+                        method:'get',
+                        queryColumns:[{
+                            field:'id',
+                            title:'涓氬姟绫诲瀷鑻辨枃鍚嶇О'
+                        },{
+                            field:'name',
+                            title:'涓氬姟绫诲瀷鍚嶇О'
+                        }]
+                    }
+                }
+            },{
+                name:'parentToolClassify',
+                text:'涓婄骇鍒嗙被',
+                type:'refer',
+                showField: 'parentToolClassifyName',
+                referConfig:{
+                    type:'tree',
+                    url:that.url.controller + that.url.referTree,
+                    backPath:that.backPath,
+                    textField:'id,name',
+                    valueField:'oid',
+                    isMuti:false
+                }
+            },{
+                name:'description',
+                text:'澶囨敞'
+            },{
+                field: 'lcStatusText',
+                text: '鐘舵��',
+                readOnly: true,
+                hidden:!onlyShow
+            }];
+        };
+        this.getBtmTypeReferColumns = function () {
+            var that = this;
+            var table = layui.table;
+            return [table.getIndexColumn(),table.getCheckColumn(),{
+                field:'id',
+                text:'鑻辨枃鍚嶇О'
+            },{
+                field:'name',
+                text:'涓枃鍚嶇О'
+            }]
+        };
+        this.ADD = function(){//淇濆瓨
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            that.addOrEdit(false);
+        };
+        this.addOrEdit = function (add) {
+            var that = this;
+
+            if(!add && $webUtil.isNull(that.currentItemOid)){
+                $webUtil.showErrorMsg("璇峰厛閫夋嫨涓�涓墿鏂�/宸ュ叿鍩烘湰鍒嗙被");
+                return false;
+            }
+            var filter = "addOrEdit_" + that.id;
+            var form = layui.form;
+            var addSaveIndex = layer.open({
+                type: 1,
+                title: add?'鏂板鐗╂枡/宸ュ叿鍩烘湰鍒嗙被':'淇敼鐗╂枡/宸ュ叿鍩烘湰鍒嗙被',
+                btn: ['淇濆瓨', '鍙栨秷'],
+                skin: 'layui-layer-lan',
+                content: '<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                area: ['900px', '500px'],
+                closeBtn: 2,
+                shade: true,
+                shadeClose: true,
+                resize: true,
+                resizing: function (layero) {
+                    form.doResize(filter);
+                },
+                success: function (layero) {
+                    form.addItems(filter,that.getFormItems(false),
+                        function () {
+                            if(add){
+                                //娣诲姞鐨勬椂鍊欙紝濡傛灉閫夋嫨浜嗚妭鐐癸紝閭d箞閫夋嫨鐨勮妭鐐瑰氨鏄綋鍓嶇殑涓婄骇鑺傜偣
+                                if($webUtil.isNotNull(that.currentItemOid)){
+                                    form.setValues({
+                                        parentToolClassify:that.currentItemOid,
+                                        parentToolClassifyName:(that.currentItemAttributes.id + " " + that.currentItemAttributes.name),
+                                        extendAttrStoreBtm:that.currentItemAttributes.extendAttrStoreBtm,
+                                        extendAttrStoreBtmName:that.currentItemAttributes.extendAttrStoreBtmName
+                                    },filter);
+                                }else{
+                                    form.setValues({},filter);
+                                }
+                            }else{
+                                form.setValues(that.currentItemAttributes,filter);
+                            }
+                        }
+                        , {}
+                        , {
+                            defaultColumnOneRow: 2
+                        });
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var formValues = form.getValues(filter,true);
+                        if(!"extendAttrFlag" in formValues || $webUtil.isNull(formValues['extendAttrFlag'])){
+                            formValues['extendAttrFlag'] = false;
+                        }
+                        $webUtil.ajax(add?'post':'put',that.url.controller + (add?that.url.add:that.url.edit),formValues,function (result) {
+                            if(result.success){
+                                $webUtil.showMsgFromResult(result,add?"鏂板鐗╂枡/宸ュ叿鍩烘湰鍒嗙被鎴愬姛":"淇敼鐗╂枡/宸ュ叿鍩烘湰鍒嗙被鎴愬姛");
+                                that.refresh(that.currentItemOid);
+                                layer.close(addSaveIndex);
+                            }else{
+                                $webUtil.showErrorMsg(result.msg);
+                            }
+                        },function (xhr,error) {
+                            $webUtil.showErrorMsg("璁块棶鏈嶅姟鍣ㄥ嚭鐜颁簡閿欒锛屽彲鑳芥湇鍔″櫒娌℃湁寮�鍚紝鎴栬�呰繛鎺ュけ璐�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    that.refresh();
+                    layer.close()
+                }
+            });
+        };
+        this.DEL= function(){
+            var that = this;
+            if($webUtil.isNull(that.currentItemOid)){
+                $webUtil.showErrorMsg("璇峰厛閫夋嫨涓�涓垎绫荤殑鑺傜偣");
+                return false;
+            }
+            var ts =  that.currentItemAttributes.ts;
+            $webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欎釜鐗╂枡/宸ュ叿鍩烘湰鍒嗙被锛熷鏋滆鐗╂枡/宸ュ叿鍩烘湰淇℃伅寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                var submitValue = {oid:that.currentItemOid,ts:ts};
+                $webUtil.post(that.url.controller + that.url.checkIsDelete,submitValue,function(result){
+                    if(result.success){
+                        if('true' == result.obj || true == result.obj){
+                            $webUtil.showConfirmMsg("褰撳墠鍒嗙被鍖呭惈鏈変笅绾у垎绫伙紝瑕佸垹闄ょ殑璇濅細鍜屼笅绾у垎绫讳竴璧峰垹闄わ紝浣犵‘璁ょ户缁�?",function () {
+                                that.doDelete(submitValue);
+                            });
+                        }else{
+                            //璇存槑鍙互鍒犻櫎
+                            that.doDelete(submitValue);
+                        }
+                    }else{
+                        $webUtil.showErrorMsg(result.msg);
+                    }
+                },function (xhr,error) {
+                    $webUtil.showErrorMsg("鏍¢獙鍒犻櫎鍑虹幇浜嗛敊璇紝鍙兘鏄湇鍔″櫒鏈惎鍔�")
+                },that.backPath);
+            });
+        };
+        this.doDelete = function (submitValue) {
+            var that = this;
+            $webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,submitValue,function(result){
+                if(result.success){
+                    $webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                    that.refresh();
+                }else{
+                    $webUtil.showErrorMsg(result.msg);
+                }
+            },function (xhr,err) {
+                $webUtil.showErrorMsg("鎵ц鍒犻櫎鐨勬椂鍊欏嚭閿欎簡閿欒锛屽彲鑳芥槸鏈嶅姟鍣ㄦ殏鏃舵棤娉曡闂�");
+            },that.backPath);
+        };
+
+        this.STAR = function(){
+            var that = this;
+            if($webUtil.isNull(that.currentItemOid)){
+                $webUtil.showErrorMsg("璇峰厛閫夋嫨涓�涓垎绫荤殑鑺傜偣");
+                return false;
+            }
+            that.operaData(that.url.controller +that.url.enableUrl,{oid:that.currentItemOid,ts:that.currentItemAttributes.ts},'鍚敤鎴愬姛')
+        };
+        this.STOP = function(){
+            var that = this;
+            if($webUtil.isNull(that.currentItemOid)){
+                $webUtil.showErrorMsg("璇峰厛閫夋嫨涓�涓垎绫荤殑鑺傜偣");
+                return false;
+            }
+            that.operaData(that.url.controller +that.url.disableUrl,{oid:that.currentItemOid,ts:that.currentItemAttributes.ts},'鍋滅敤鎴愬姛')
+        };
+        this.operaData = function(url,submitValue,msg){
+            var that = this;
+            if($webUtil.isNull(that.currentItemOid)){
+                return false;
+            }
+            $webUtil.showConfirmMsg("瀛愯妭鐐规槸鍚︿竴璧锋搷浣滐紵",function(){
+                submitValue['cascade'] = true;
+                $webUtil.post(url,submitValue,function(result){
+                    if(result.success){
+                        $webUtil.showMsgFromResult(result,msg);
+                        that.refresh();
+                    }else{
+                        $webUtil.showErrorMsg(result.msg);
+                    }
+                },function (xhr,err) {
+                    $webUtil.showErrorMsg("鎵ц鐨勬椂鍊欏嚭閿欎簡閿欒锛屽彲鑳芥槸鏈嶅姟鍣ㄦ殏鏃舵棤娉曡闂�");
+                },that.backPath)
+            },function(){
+                $webUtil.post(url,submitValue,function(result){
+                    if(result.success){
+                        $webUtil.showMsgFromResult(result,msg);
+                        that.refresh();
+                    }else{
+                        $webUtil.showErrorMsg(result.msg);
+                    }
+                },function (xhr,err) {
+                    $webUtil.showErrorMsg("鎵ц鐨勬椂鍊欏嚭閿欎簡閿欒锛屽彲鑳芥槸鏈嶅姟鍣ㄦ殏鏃舵棤娉曡闂�");
+                },that.backPath);
+            });
+        };
+
+        this.refresh = function(parentNodeOid){
+            var that = this;
+            var tree = layui.tree;
+            if($webUtil.isNotNull(parentNodeOid)){
+                tree.reloadNode("tree_" + that.id,parentNodeOid);
+            }else {
+                tree.reload("tree_" + that.id);
+            }
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdMaterialClassifyExtendAttr.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdMaterialClassifyExtendAttr.js
new file mode 100644
index 0000000..8285be4
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdMaterialClassifyExtendAttr.js
@@ -0,0 +1,131 @@
+/**
+ * 鐗╂枡鍒嗙被鐨勬墿灞曞睘鎬х殑淇℃伅
+ * @author weidy
+ **/
+layui.define(['layer','element','form','table','util','platform/objectService/OsAttributeUtil'],function(exports){
+    var Class = function() {
+        this.MODELNAME = "platform/basedoc/BdMaterialClassifyExtendAttr";
+        this.moduleKey = "BdMaterialClassifyExtendAttr";
+        this.id = 'BdMaterialClassifyExtendAttr';
+        this.sourceData = {};
+        this.backPath = configData.compatibility?path:configData.frameworkPath;
+        this.url ={
+            controller:'materialClassifyController/',
+            listExtendAttribute:'listExtendAttribute',
+            refreshAllClassifyExtendAttribute:'listAllClassifyExtendAttribute'
+        };
+        this.initExtendAttr = function (materialClassifyId,callback) {
+            //浠庡悗鍙伴噸鏂拌幏鍙栬繖涓垎绫荤殑灞炴墿灞曚俊鎭�
+            var that = this;
+            if(!that.materialClassifyExtendAttr){
+                that.materialClassifyExtendAttr = [];
+            }
+            if($webUtil.isNotNull(materialClassifyId)){
+                if(that.materialClassifyExtendAttr[materialClassifyId]) {
+                    delete that.materialClassifyExtendAttr[materialClassifyId];
+                }
+                $webUtil.post(that.url.controller + that.url.listExtendAttribute,{materialClassifyId:materialClassifyId},function(result){
+                    if(result.success && result.data && result.data.length > 0){
+                        that.materialClassifyExtendAttr[materialClassifyId] = result.data;
+                        if(callback){
+                            callback(result.data);
+                        }
+                    }else{
+                        if(!result.success){
+                           $webUtil.showErrorMsg(result.msg);
+                        }else{
+                            if(callback){
+                                callback(result.data);
+                            }
+                        }
+                    }
+                },function(xhr,error){
+                    $webUtil.showErrorMsg("鏌ヨ鐗╂枡鍒嗙被鐨勬墿灞曞睘鎬у嚭鐜颁簡閿欒锛屽彲鑳芥槸鍥犱负鏈嶅姟鍣ㄦ晠闅�");
+                },that.backPath);
+            }else{
+                if(callback){
+                    callback({});
+                }
+            }
+        };
+        this.getExtendAttrByClassifyId = function (materialClassifyId) {
+            //浣跨敤鐗╂枡鍩烘湰淇℃伅鍒嗙被锛岃幏鍙栧搴旂殑鎵╁睍灞炴��
+            var that= this;
+            if(!that.materialClassifyExtendAttr){
+                that.materialClassifyExtendAttr = [];
+            }
+            return that.materialClassifyExtendAttr[materialClassifyId];
+        };
+        this.refreshAllClassifyExtendAttribute = function () {
+            //鍒锋柊鎵�鏈夌殑鍒嗙被鐨勬墿灞曞睘鎬�
+            var that = this;
+            that.materialClassifyExtendAttr = [];
+            $webUtil.post(that.url.controller + that.url.refreshAllClassifyExtendAttribute,{},function(result){
+                if(result.success){
+                    //鍑烘潵鐨勬槸涓�涓垪琛紝闇�瑕佽浆鎹竴涓�
+                    layui.each(result.data,function(_index,_item){
+                        var thisBtmHasAttrs = [];
+                        if(_item.btmTypeId in that.materialClassifyExtendAttr){
+                            thisBtmHasAttrs = that.materialClassifyExtendAttr[_item.btmTypeId];
+                        }
+                        thisBtmHasAttrs.push(_item);
+                        that.materialClassifyExtendAttr[_item.btmTypeId] = thisBtmHasAttrs;
+                    });
+                }else{
+                    $webUtil.showErrorMsg(result.msg);
+                }
+            },function(xhr,error){
+                $webUtil.showErrorMsg("鏌ヨ鐗╂枡鍒嗙被鐨勬墿灞曞睘鎬у嚭鐜颁簡閿欒锛屽彲鑳芥槸鍥犱负鏈嶅姟鍣ㄦ晠闅�");
+            },that.backPath);
+        };
+        this.getFormItemsByClassifyId = function (materialClassifyId) {
+            //鑾峰彇琛ㄥ崟鐨勫瓧娈�
+            var that = this;
+            var attributes = that.getExtendAttrByClassifyId(materialClassifyId);
+            var attrUtil = layui['platform/objectService/OsAttributeUtil'];
+            return attrUtil.getFormItemsByAttributes(attributes);
+        };
+        this.setExtendAttrToForm = function (formId,data,materialClassifyId) {
+            //璁剧疆鎵╁睍灞炴�у埌琛ㄥ崟涓�
+            var that = this;
+            var formValueForExtendAttr = data;
+            if(data && data.extendAttrData) {
+                var extendAttrs = that.getFormItemsByClassifyId(materialClassifyId);
+                if (extendAttrs && extendAttrs.length > 0) {
+                    var attributes = {};
+                    layui.each(extendAttrs, function (_index, _item) {
+                        attributes[_item.name.toLowerCase()] = _item.name;
+                    });
+
+                    for (var key in data.extendAttrData) {
+                        if (attributes[key.toLowerCase()]) {
+                            var field = "ext_" + attributes[key.toLowerCase()];
+                            formValueForExtendAttr[field] = data.extendAttrData[key];
+                        }
+                    }
+                }
+            }
+            layui.form.setValues(formValueForExtendAttr, formId);
+        };
+        this.loadMaterialForForm = function (formId,oid,materialClassifyId,url,backPath) {
+            //浣跨敤涓婚敭璁剧疆鍒拌〃鏍间笂
+            var that = this;
+            layui.form.load(formId,{
+                url:(url?url:'materialController/getObjectByOid'),
+                backPath:(backPath?backPath:that.backPath),
+                method:'get',
+                params:{
+                    oid:oid
+                },
+                setValueListener:function(data){
+                    if(data){
+                        that.setExtendAttrToForm(formId,data,materialClassifyId);
+                    }
+                }
+            });
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
+
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdMaterialSelectPanel.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdMaterialSelectPanel.js
new file mode 100644
index 0000000..a8b6886
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdMaterialSelectPanel.js
@@ -0,0 +1,474 @@
+/**
+ * Created by weidy
+ * 鐗╂枡/宸ュ叿鍩烘湰淇℃伅閫夋嫨闈㈡澘
+ */
+
+layui.define(['layer','element','form','table','platform/basedoc/BdMaterialClassifyExtendAttr'],function(exports){
+    var Class = function(){
+        this.MODULE_NAME = "platform/basedoc/BdMaterialSelectPanel";
+        this.moduleKey = "BdMaterialSelectPanel";
+        this.id='BdMaterialSelectPanel';
+        this.sourceData = {};
+        this.columns = [];
+        this.backPath = configData.compatibility?path:configData.frameworkPath;
+        this.controlSecret = true;
+        this.url={
+            classifyTree:'materialClassifyController/referTree',
+            controller:'materialController/',
+            referDataGrid:'referDataGrid',
+            getObjectByOid:'getObjectByOid'
+        };
+        this.config = {};
+        this.getContent=function(filter){
+            //杩斿洖杩欎釜缁勪欢鐨勫熀纭�html
+            var that = this;
+            var html = [
+                '<div class="layui-layout-border" materialSelectFilter ="',filter , '">',
+                    '<div class="layui-vci-deptTree" style="width:200px;float: left;background-color:#ffffff;">',
+                        that.getClassifyToolbarHtml(filter),
+                        '<label class="layui-icon layui-icon-tree" style="color:red;">鐗╂枡/宸ュ叿鍩烘湰鍒嗙被</label>',
+                        '<ul layui-filter="tree_',filter,'"></ul>',
+                    '</div>',
+                    '<div class="layui-center" style="display:block;position:fixed;margin-top:0px;margin-left:205px;">',
+                         that.getToolbarHtml(filter),
+                        '<table id="table_', filter , '" lay-filter="',filter , '" style="overflow-x:auto;"></table>',
+                    '</div>'];
+            html.push('</div>');
+            return html.join("");
+        };
+        this.getToolbarHtml =function(filter){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',filter, '" class="layui-btn-container">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',filter,'_SELECT" style="display:none;"><i class="layui-icon layui-icon-ok-circle"></i>纭閫夋嫨</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',filter,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                    '<div class="layui-input-inline" style="position: relative;"><div id="selectWrapForIE" style="display:none"></div>',
+                        '<label class="layui-form-label" style="width: 100px;font-size:14px;padding: 5px;">鏄剧ず鎵�鏈夌増鏈�:</label>',
+                        '<div class="layui-unselect layui-form-switch" lay-skin="_switch" style="margin-top:0px" id="switch_',filter,'"><em>鍚�</em><i></i></div>',
+                    '</div>',
+                    '<div id="toolbar_column_',filter ,'" style="display:none;"></div>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getClassifyToolbarHtml = function(filter){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_classify_',filter, '" class="layui-btn-container">',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_classify_',filter,'_refreshClassify"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.init=function(filter,options){//鍩虹鐨刪tml琚坊鍔犲悗锛屽啀鎵ц鍒濆鍖�
+            if(!filter){
+                $webUtil.showErrorMsg("鍓嶇绋嬪簭閿欒锛岃繖涓槸閫氱敤缁勪欢锛岃蹇呴』璁剧疆filter");
+                return false;
+            }
+            var that = this;
+            that.config[filter] = options;
+            var table = layui.table;
+            $webUtil.copyConfig(that,that.moduleKey);
+            $webUtil.bindDefultButtonLisenter(that, filter);
+            $webUtil.bindDefultButtonLisenter(that, "classify_" + filter);
+            that.materialExtendAttr = layui['platform/basedoc/BdMaterialClassifyExtendAttr'];
+            if(options.selectMode = table.selectMode.multiple){
+                var selectButton =  $("[layui-filter='toolbar_" + filter + "_SELECT']");
+                selectButton.show();
+                selectButton.unbind('click').click(function(e){
+                    that.SELECTMATERTIAL(filter);
+                    layui.stope(e);
+                });
+            }
+
+            //鍒濆鍖�
+            that.classifyTreeInit(filter,function () {
+                if(options.materialClassifyId){
+                    that.materialExtendAttr.initExtendAttr(options.materialClassifyId,function() {
+                        that.queryExtendAttr(options, false);
+                    });
+                }
+                that.initMainTable(filter,
+                    function () {
+                        $webUtil.createSearchHtml({
+                            id: '缂栧彿',
+                            code:'鍥惧彿',
+                            name:'鍚嶇О',
+                            specification:'瑙勬牸',
+                            brand:'鍝佺墝',
+                            material:'鏉愯川',
+                            applyProduct:'閫傜敤浜у搧',
+                            supplier:'鍒堕��/渚涘簲鍟�',
+                            revisionValue:'鐗堟湰鍙�'
+                        }, $('[layui-filter="toolbar_' + filter + '"]'), filter);
+                    }
+                );
+            });
+            $("#switch_" + filter).unbind('click').click(function () {
+                var thisObject = $(this);
+                if(thisObject.hasClass("layui-form-onswitch")){
+                    //璇存槑鐜板湪鐐圭殑鏄紝闇�瑕佷慨鏀逛负鍚�
+                    thisObject.removeClass("layui-form-onswitch");
+                    thisObject.find("em").html("鍚�");
+                    table.reload("table_"+filter,{
+                        where:{
+                            "conditionMap['${queryAllRevision}']":false
+                        }
+                    })
+                }else{
+                    thisObject.addClass("layui-form-onswitch");
+                    thisObject.find("em").html("鏄�");
+                    table.reload("table_"+filter,{
+                        where:{
+                            "conditionMap['${queryAllRevision}']":true
+                        }
+                    })
+                }
+            });
+        };
+        this.classifyTreeInit = function(filter,callback){
+            //鍒濆鍖栧垎绫绘爲
+            var that = this;
+            var tree = layui.tree;
+            var options = that.config[filter];
+            options.fristTreeLoad = false;
+            tree.init("tree_" + filter, $('[layui-filter="tree_' + filter + '"]'), {
+                url: that.url.classifyTree,
+                backPath: that.backPath,
+                extraParams: {
+                    isMuti: (options.selectMode == layui.table.selectMode.multiple)?true:false,
+                    parentValue:options.materialClassify?options.materialClassify:'',
+                    isQueryAllColumn: true
+                },
+                treeFilter: filter,
+                click: function (item, elem, treeOptions) {
+                    options.currentItemOid = item.oid;
+                    options.currentItemAttributes = item.attributes;
+                    that.config[filter] = options;
+                    that.showMaterialByClassify(filter,item.attributes);
+                },
+                done:function (filter,children) {
+                    if(!options.fristTreeLoad &&callback){
+                        callback();
+                    }
+                    options.fristTreeLoad = true;
+                }
+            });
+        };
+        this.showMaterialByClassify = function (filter,classifyAttributes) {
+            var that =this;
+            var table = layui.table;
+            that.materialExtendAttr.initExtendAttr(classifyAttributes.id,function() {
+                table.reload("table_" + filter, {
+                    where: {
+                        materialClassify: classifyAttributes.oid
+                    }
+                });
+            });
+        };
+        this.initMainTable = function (filter,callback) {
+            var that = this;
+            var columns = that.checkColumns(filter);
+            var table = layui.table;
+            var options = that.config[filter];
+            var limit = 20;
+            if(options.height){
+                if(options.height<399){
+                    limit = 10;
+                }else if(options.height >599 && options.height <799){
+                    limit = 20;
+                }else if(options.height>799){
+                    limit = 30;
+                }
+            }
+            options.fristMainLoad = false;
+            //涓诲垪琛ㄤ腑鍒椼��
+            table.render({
+                elem: '#table_' + filter,
+                id: 'table_' + filter,
+                url: that.backPath + that.url.controller + that.url.referDataGrid,
+                page: {
+                    limit: limit,
+                    page: 1
+                },
+                height:(options.height?options.height:600),
+                cols: [columns],
+                done:function(res,cur,total){
+                    if(!options.fristMainLoad ){
+                        if(callback) {
+                            callback();
+                        }
+                        table.on('tool(' + filter + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'viewInfo'){
+                                that.showMaterialByOid(filter,data.oid,options);
+                            }
+                        });
+                    }
+                    options.fristMainLoad = true;
+                    that.config[filter] = options;
+                },
+                rowClick:function(thisTableFilter,record){
+                    record['materialFlag'] = true;
+                    if(record.materialClassifyId != options.materialClassifyId){
+                        options.materialClassifyId = record.materialClassifyId;
+                        options.extendAtts = null;
+                        that.materialExtendAttr.initExtendAttr( options.materialClassifyId,function () {
+                            //鍏堣幏鍙栦竴涓嬫墿灞曞睘鎬х殑鍐呭锛�
+                            that.queryExtendAttr(options,false);
+                            if(options.selectClick){
+                                options.selectClick(filter,record,that.config[filter]);
+                            }
+                        });
+                    }else {
+                        //鍏堣幏鍙栦竴涓嬫墿灞曞睘鎬х殑鍐呭锛�
+                        that.queryExtendAttr(options, false);
+                        if (options.selectClick) {
+                            options.selectClick(filter, record, that.config[filter]);
+                        }
+                    }
+                }
+            });
+            document.getElementById("toolbar_column_" + filter).innerHTML = '<a class="layui-btn layui-btn-intable" lay-event="viewInfo">鏌ョ湅</a>';
+        };
+
+        this.advancedQuery = function(){
+            var that = this;
+            var dynamicCondition = layui.dynamicCondition;
+            $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar'+ that.id+'" class="layui-inline"></div>');
+            var dataFields = that.columns;
+            that.serinorQueryInstance = dynamicCondition.create({
+                fields : dataFields//鏌ヨ瀛楁
+                ,tableId:"table_"+that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                ,type:"complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                ,conditionTextId:"#toolbar"+that.id//楂樼骇鏌ヨ 鎸夐挳鎵�鍦ㄧ殑div
+                ,popupShowQueryBtn: true//鏄剧ず楂樼骇鏌ヨ鎸夐挳
+                ,queryCallBack:function(requestData){//鏌ヨ涔嬪悗鐨刢allback
+                    //console.log(JSON.stringify(requestData))
+                }
+            });
+        };
+
+        this.showMaterialByOid =function (filter,oid,options) {
+            var that = this;
+            if(!oid){
+                return false;
+            }
+            var formFilter = "view_" + filter;
+            var form = layui.form;
+            var addSaveIndex = layer.open({
+                type:1,
+                title: '鏌ョ湅鐗╂枡/宸ュ叿鍩烘湰淇℃伅',
+                skin: 'layui-layer-lan',
+                content: '<form id="form_' + formFilter + '" lay-filter="' + formFilter + '" class="layui-form" style="margin-top:5px" ></form>',
+                fullScreen:true,
+                resizing: function (layero) {
+                    form.doResize(formFilter);
+                },
+                success: function (layero) {
+                    form.addItems(formFilter,that.getFormItems(true,options),function () {
+                        that.materialExtendAttr.loadMaterialForForm(formFilter,oid,options.currentItemAttributes.id);
+                    }
+                    , {}
+                    , {
+                        defaultColumnOneRow: 3
+                    });
+                }
+            });
+        };
+        this.getFormItems = function(readOnly,options){
+            var that = this;
+            var items = [{
+                name:'materialClassify',
+                text:'鐗╂枡/宸ュ叿鍒嗙被',
+                type:'refer',
+                showField: 'materialClassifyText',
+                required:true,
+                readOnly:readOnly,
+                referConfig:{
+                    type:'tree',
+                    url: that.url.referClassifyTree,
+                    backPath:that.backPath,
+                    textField:'id,name',
+                    valueField:'oid',
+                    isMuti:false
+                }
+            },{
+                name:'id',
+                text:'鐗╂枡/宸ュ叿缂栧彿',
+                readOnly:readOnly,
+                required:true
+            },{
+                name:'code',
+                readOnly:readOnly,
+                text:'鍥惧彿'
+            },{
+                name:'name',
+                text:'鍚嶇О',
+                readOnly:readOnly,
+                required:true
+            },{
+                name:'revisionValue',
+                readOnly:readOnly,
+                text:'鐗堟湰'
+            },{
+                name:'unitOfMeasurement',
+                text:'璁¢噺鍗曚綅',
+                readOnly:readOnly
+            },{
+                name:'specification',
+                readOnly:readOnly,
+                text:'瑙勬牸'
+            },{
+                name:'brand',
+                readOnly:readOnly,
+                text:'鍝佺墝'
+            },{
+                name:'material',
+                readOnly:readOnly,
+                text:'鏉愯川'
+            },{
+                name:'applyProduct',
+                readOnly:readOnly,
+                text:'閫傜敤浜у搧'
+            },{
+                name:'supplier',
+                text:'鍒堕��/渚涘簲鍟�',
+                readOnly:readOnly
+            },layui.vciWebComboxStore.getSecretObject(that.controlSecret)];
+            that.queryExtendAttr(options,readOnly);
+            if(options.extendAtts){
+                items = items.concat(options.extendAtts);
+            }
+            items.push({
+                name:'materialLife',
+                text:'瀵垮懡',
+                readOnly:readOnly
+            },{
+                name:'checkFlag',
+                text:'鏄惁瀹氭',
+                type:'truefalse',
+                readOnly:readOnly,
+                required:true
+            },{
+                name:'checkCycleType',
+                text:'瀹氭鍛ㄦ湡绫诲瀷',
+                type:'combox',
+                comboxKey:'lifeCountType',
+                readOnly:readOnly,
+                defaultValue:'check_day'
+            },{
+                name:'checkCycle',
+                text:'瀹氭鍛ㄦ湡',
+                readOnly:readOnly,
+                verify:'number'
+            },{
+                name:'alertCycle',
+                text:'瀹氭鎻愰啋鏃堕棿/鏁�',
+                readOnly:readOnly,
+                verify:'number'
+            },{
+                name:'checkContent',
+                text:'瀹氭鍐呭',
+                type:'textarea',
+                readOnly:readOnly,
+                textWidth: 870
+            },{
+                name:'description',
+                type:'textarea',
+                textWidth:870,
+                readOnly:readOnly,
+                text:'澶囨敞'
+            });
+            return items;
+        };
+        this.queryExtendAttr = function (options,readOnly) {
+            var that = this;
+            if(!options.extendAtts){
+                var extendAttrs = that.materialExtendAttr.getFormItemsByClassifyId((options.currentItemAttributes && options.currentItemAttributes.id)?options.currentItemAttributes.id:options.materialClassifyId);
+                if(extendAttrs && extendAttrs.length > 0){
+                    layui.each(extendAttrs,function (_index,_item) {
+                        _item.name = "ext_" + _item.name;
+                        if(readOnly){
+                            _item.readOnly = readOnly;
+                        }
+                    });
+                    options.extendAtts = extendAttrs;
+                }
+            }else{
+                //淇敼readOnly
+                if(options.extendAtts){
+                    layui.each(options.extendAtts,function (_index,_item) {
+                        if(readOnly){
+                            _item.readOnly = readOnly;
+                        }else{
+                            delete  _item.readOnly;
+                        }
+                    });
+                }
+            }
+        };
+        this.checkColumns = function(filter){
+            var that = this;
+            var table = layui.table;
+            return [table.getIndexColumn(),table.getCheckColumn(),{
+                    field:'id',
+                    title:'鐗╂枡/宸ュ叿缂栧彿 鍚嶇О (鐗堟湰锛�',
+                    width:330,
+                    templet:function(d){
+                        return  d.id + ' ' + d.name + ' (' + d.revisionValue + ')' ;
+                    }
+                },{
+                    field:'code',
+                    title:'鍥惧彿',
+                    width:120
+                },{
+                    field:'checkFlag',
+                    title:'瀹氭',
+                    templet:function (d) {
+                        if(d.checkFlag == 'true' || d.checkFlag == true){
+                            return d.checkCycle + "(" + d.checkCycleTypeText +")";
+                        }else{
+                            return "";
+                        }
+                    },
+                    width:70
+                },{
+                    title:'鎿嶄綔',
+                    field:'options',
+                    width:50,
+                    fixed:'right',
+                    toolbar: '#toolbar_column_' + filter
+                }];
+        };
+        this.refreshClassify = function (event,thisButton) {
+            var that = this;
+            var filter = $(thisButton).attr("layui-filter");
+            filter = filter.replace("_refreshClassify","").replace("toolbar_classify_","");
+            layui.tree.reload("tree_" + filter);
+        };
+        this.refresh = function(event,thisButton){
+            var that = this;
+            var filter = $(thisButton).attr("layui-filter");
+            filter = filter.replace("_refresh","").replace("toolbar_","");
+            layui.table.reload('table_' + filter,{});
+        };
+        this.SELECTMATERTIAL = function (filter) {
+            var that= this;
+            var selectData = layui.table.checkStatus("table_" + filter).data;
+            var options = that.config[filter];
+            that.queryExtendAttr(options,false);
+            if(selectData && selectData.length>0){
+                layui.each(selectData,function (_index,_item) {
+                    _item['materialFlag'] = true;
+                });
+            }
+            if(options.multipleSelectListener){
+                options.multipleSelectListener(filter,selectData,options);
+            }
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODULE_NAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdSelectInputChar.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdSelectInputChar.js
new file mode 100644
index 0000000..58037a5
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdSelectInputChar.js
@@ -0,0 +1,286 @@
+/**
+ * 鍙緭鍙�夊唴瀹归〉闈�
+ * @author weidy
+ * @date 2022-03-09
+ */
+layui.define(['layer','element','form','table','dynamicCondition' ],function(exports){
+        var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "platform/basedoc/BdSelectInputChar";
+        this.moduleKey = "BdSelectInputChar";
+        this.backPath =  configData.compatibility? path:configData.frameworkPath;
+        this.url = {
+            controller:'bdSelectInputController/',
+            dataGrid:'gridBdSelectInputChar',
+            addSave:'addSave',
+            editSave:'editSave',
+            deleteUrl:'deleteData',
+            getObjectByOid:'getObjectByOid'
+        };
+        this.getContent=function(){
+            var that = this;
+            return '<div id="UIContent_' + that.id + '" style="overflow: auto;padding:0 5px"></div>';
+        };
+        this.showContent=function (){
+            var that = this;
+            var html = "";
+            html = [
+                        '<div class="layui-layout easyui-layout UIContentLayout"  id="easyuiLayout_',that.id,'" data-options="fit:true" style="display:block;overflow-y: hidden;margin:0 5px">',
+                            '<div data-options="region:\'center\'" style="padding-left: 10px;padding-right: 10px;" id="border_',that.id,'">',
+                                '<div class="layui-center" style="overflow-y:auto;">',
+                                    that.getToolbarHtml(),
+                                    '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                                '</div>',
+                            '</div>',
+                        '</div>'
+            ].join("");
+            $("#UIContent_"+that.id).html(html);
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.createSearchHtml({id:"缂栧彿",name:"鍚嶇О"} ,$("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+        };
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            //闇�瑕佸姞鍦ㄥ畾鏃朵腑锛屽惁鍒欐牱寮忎笉鑳芥纭睍绀猴紝涓嶇煡閬撳師鍥� wangting
+            setTimeout(function (){
+                that.showContent();
+                var easyuiLayout= $('#easyuiLayout_'+that.id)
+                easyuiLayout.css({height:$('#portal_body').height()-43,width:$('#portal_body').width()-15})
+                easyuiLayout.layout();
+
+                that.initMainTable();
+                that.createSearchHtml();
+
+            },1)
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var tableWidth = $("#border_" + that.id).width();
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                width:tableWidth,
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                method:'get',
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'EDIT'){
+                                that.addOrEdit(false,data.oid);
+                            }
+                        });
+                    }else{
+                        if(total>0) {
+                            table.selectRecord('table_' + that.id, {index:0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                }
+            };
+            if(parentFieldName){
+                options.treeConfig = {
+                    treepid:parentFieldName,
+                    treeid:'id',
+                    showField:'name'
+                };
+            }
+            table.render(options);
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),
+                    {
+                        title: '杈撳叆鏉ユ簮',
+                        field: 'sourceinputflag',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '鏁版嵁鎵�灞為鍩�',
+                        field: 'sourcenamespace',
+                        sort:true,
+                        width: 150
+                    },{
+                        title: '鍊�',
+                        field: 'id',
+                        sort: true,
+                        width: 200
+                    },
+                    {
+                        field:'options',
+                        title:'鎿嶄綔',
+                        width:150,
+                        templet:function(d){
+                            return '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>';
+                        }
+                    }];
+            }
+        };
+
+        this.getFormItems = function(onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [
+                {
+                    field: 'sourceinputflag',
+                    title: '杈撳叆鏉ユ簮',
+                    type: 'text',
+                    defaultValue:"",
+                    required:true,
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'sourcenamespace',
+                    title: '鏁版嵁鎵�灞為鍩�',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                }  ,{
+                        field: 'id',
+                    title: '鍊�',
+                    required:true,
+                    readOnly: onlyShow
+                }           ];
+        };
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            that.addOrEdit(false,oid);
+        };
+        this.addOrEdit = function(add,oid) {
+            var that = this;
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var addSaveIndex =webUtil.dialog({
+                title:add?'娣诲姞鍙緭鍙�夊唴瀹�':'淇敼鍙緭鍙�夊唴瀹�',
+                btn:['淇濆瓨','鍙栨秷'],
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:15px;margin-right: 30px" ></form>',
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero, layerIndex, classP) {
+                    form.addItems(filter,that.getFormItems(false),
+                        function () {
+                            if(!add){
+                                form.load(filter,{
+                                    backPath:that.backPath,
+                                    url:that.url.controller + that.url.getObjectByOid,
+                                    method:'get',
+                                    params:{
+                                        oid:oid
+                                    }
+                                });
+                            }else{
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+                            webUtil.relocationOpen(classP)
+                        }, {}, {defaultColumnOneRow: 2, labelWidth: 130});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        var url = that.url.controller + (add?that.url.addSave:that.url.editSave);
+                        webUtil.manualAjax(add?'post':'put',url,JSON.stringify(values),function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts= webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+        this.refresh = function () {
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+        this.ADVQUERY = function () {
+            var that = this;
+            if(!that.serinorQueryInstance) {
+                var dynamicCondition = layui.dynamicCondition;
+                $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar' + that.id + '" class="layui-inline"></div>');
+                that.checkColumns();
+                var dataFields = [];
+                for(var i = 0 ; i < that.columns.length ; i ++){
+                    dataFields[i] = that.columns[i];
+                }
+                that.serinorQueryInstance = dynamicCondition.create({
+                    fields: dataFields//鏌ヨ瀛楁
+                    , tableId: "table_" + that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                    , type: "complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                    , queryCallBack: function (requestData) {//鏌ヨ涔嬪悗鐨刢allback
+
+                    }
+                });
+            }
+            that.serinorQueryInstance.open();
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdSupplier.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdSupplier.js
new file mode 100644
index 0000000..1b5f0b6
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdSupplier.js
@@ -0,0 +1,668 @@
+/**
+ * 渚涘簲鍟嗗熀鏈俊鎭〉闈�
+ * @author renky
+ * @date 2020-08-17
+ */
+layui.define(['layer','element','form','table','dynamicCondition','upload' ,'tree'],function(exports){
+        var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "platform/basedoc/BdSupplier";
+        this.moduleKey = "BdSupplier";
+        this.backPath =  configData.compatibility?path:configData.frameworkPath;
+        this.url = {
+            controller:'supplierController/',
+            dataGrid:'getDataGridSupplier',
+            tree:'supplierClassifyController/referTreeSupplierClassify',
+            addSave:'insert',
+            editSave:'update',
+            delSvae:'delete',
+            checkIsCanDelete:'checkIsCanDelete',
+            referTree:'referTree' ,
+            deleteUrl:'delete',
+            enableData: 'enable',
+            disableData: 'disable',
+            downloadImportTemplate:'downloadImportTemplate',
+            importData : 'importData',
+            exportData : 'exportData',
+            getObjectByOid:'getByOid'
+        };
+        this.getContent=function(){
+            var that = this;
+            var html = "";
+            html = [
+                '<div class="layui-layout" style="display:block;overflow-y: hidden">',
+                    that.getWestToolbarHtml(),
+                    '<div class="layui-vci-tree" style="width:250px;float: left;background-color:#ffffff;overflow-y: auto;">',
+                        '<label class="layui-icon layui-icon-tree" style="line-height: 20px;color:red;font-size:20px;">渚涘簲鍟嗗熀鏈俊鎭�</label>',
+                        '<ul layui-filter="tree_',that.id,'"><ul>',
+                    '</div>',
+                    '<div class="layui-layout-border" style="display:block;margin-top:0px; margin-left:255px;" id="border_',that.id,'">',
+                        '<div class="layui-center" style="overflow-y:auto;">',
+                            that.getToolbarHtml(),
+                            '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                            '<div id="toolbar_column_',that.id ,'" style="display:none;"></div>',
+                        '</div>',
+                    '</div>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getWestToolbarHtml = function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_west_',that.id,'" class="layui-btn-container layui-buttons">',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createWestSearchHtml = function () {
+            var that = this;
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ENABLE"><i class="layui-icon layui-icon-ok-circle"></i>鍚敤</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DISABLE"><i class="layui-icon layui-icon-404"></i>鍋滅敤</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.createSearchHtml({id:"缂栧彿",name:"鍚嶇О"} ,$("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+        };
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            that.initTree();
+            that.initMainTable();
+            that.createSearchHtml();
+            that.advancedQuery();
+        };
+        this.initTree = function () {
+            var that = this;
+            var tree = layui.tree;
+            var scrollHeight =  window.innerHeight;
+            var treeUL = $('[layui-filter="tree_' + that.id + '"]');
+            var treeHeight = scrollHeight - 200;
+            treeUL.parent().height(treeHeight);
+            tree.init("tree_" + that.id, treeUL, {
+                url: /*that.url.controller +*/ that.url.tree,
+                backPath: that.backPath,
+                extraParams: {
+                    isMuti: false,
+                    isQueryAllColumn: true
+                },
+                showSearch:true,
+                click: function (item, elem, options) {
+                    that.currentItemOid = item.oid;
+                    that.currentItemAttributes = item.attributes;
+                    layui.table.reload('table_' + that.id,{
+                        extraParams:{parentSupplier:that.currentItemAttributes.oid}
+                    });
+                }
+            });
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var tableWidth = $("#border_" + that.id).width()-225;
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                width:tableWidth,
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'EDIT'){
+                                that.addOrEdit(false,data.oid);
+                            }
+                        });
+                    }else{
+                        if(total>0) {
+                            table.selectRecord('table_' + that.id, {index:0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                }
+            };
+            if(parentFieldName){
+                options.treeConfig = {
+                    treepid:parentFieldName,
+                    treeid:'id',
+                    showField:'name'
+                };
+            }
+            table.render(options);
+            document.getElementById("toolbar_column_" + that.id).innerHTML =
+                '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>';
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),
+                    {
+                        title: '缂栧彿',
+                        field: 'id',
+                        width: 150
+                    },{
+                        title: '鍚嶇О',
+                        field: 'name',
+                        width: 150
+                    },{
+                        title: '渚涘簲鍟嗗熀鏈垎绫�',
+                        field: 'pkSupplierClassifyText',
+                        width: 150
+                    },{
+                        title: '渚涘簲鍟嗙被鍨�',
+                        field: 'supplierTypeText',
+                        width: 150
+                    },{
+                        title: '渚涘簲鍟嗗噯鍏ョ姸鎬�',
+                        field: 'pkSupplierAdmittanceText',
+                        width: 150
+                    },{
+                        title: '鍦板尯鍒嗙被',
+                        field: 'pkAreaClassifyText',
+                        width: 150
+                    },{
+                        title: '鑱旂郴鍦板潃',
+                        field: 'address',
+                        width: 150
+                    },{
+                        title: '涓昏鑱旂郴浜�',
+                        field: 'contactor',
+                        width: 150
+                    },{
+                        title: '涓昏鑱旂郴鏂瑰紡',
+                        field: 'contacts',
+                        width: 150
+                    },{
+                        title: '缃戝潃',
+                        field: 'web',
+                        width: 150
+                    },{
+                        title: '鐢靛瓙淇$',
+                        field: 'email',
+                        width: 150
+                    },{
+                        title: '娉曚汉',
+                        field: 'legal',
+                        width: 60
+                    },{
+                        title: '绋庣被',
+                        field: 'tax',
+                        width: 90
+                    },{
+                        title: '浼犵湡',
+                        field: 'fax',
+                        width: 100
+                    },{
+                        title: '娉ㄥ唽璧勯噾',
+                        field: 'registermoney',
+                        width: 90
+                    },{
+                        title: '绾崇◣浜虹櫥璁板彿',
+                        field: 'taxcode',
+                        width: 100
+                    },{
+                        title: '鏈�鏂拌瘎鍒嗘�诲垎',
+                        field: 'rateInfo',
+                        width: 100
+                    },{
+                        title: '渚涘簲鍟嗗搧淇℃伅',
+                        field: 'supplierMateriel',
+                        width: 150
+                    },{
+                        title: '鎵�灞炶涓�',
+                        field: 'trade',
+                        width: 150
+                    },{
+                        title: '鍔犲伐鑳藉姏鎻忚堪',
+                        field: 'workingAbility',
+                        width: 150
+                    },{
+                        title: '鎻忚堪',
+                        field: 'description',
+                        width: 150
+                    },{
+                        title: '鐘舵��',
+                        field: 'lcStatusText',
+                        width: 70
+                    },{
+                        title: '瀵嗙骇',
+                        field: 'secretGradeText',
+                        width: 60
+                    }];
+            }
+        };
+
+        this.setFormValues = function () {
+            var that = this;
+            layui.form.setValues({parentSupplier:that.currentItemAttributes.oid},"form_" + that.id);
+        };
+        this.getFormItems = function(onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [
+                {
+                    field: 'id',
+                    title: '缂栧彿',
+                    required: true,
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'name',
+                    title: '鍚嶇О',
+                    required: true,
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'pkSupplierClassify',
+                    title: '渚涘簲鍟嗗熀鏈垎绫�',
+                    required: true,
+                    type: 'refer',
+                    showField: 'pkSupplierClassifyText',
+                    referConfig: {
+                        textField: 'name',
+                        valueField: 'oid',
+                        backPath: that.backPath,//娉ㄦ剰杩欓噷闇�瑕佷慨鏀瑰弬鐓х殑瀵瑰簲璺緞
+                        isMuti: false,
+                        type: 'tree',
+                        url: that.url.tree
+                    },
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'supplierType',
+                    title: '渚涘簲鍟嗙被鍨�',
+                    required: true,
+                    type: 'combox',
+                    comboxKey: 'supplierType',
+                    defaultValue:'supplier',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'pkSupplierAdmittance',
+                    title: '渚涘簲鍟嗗噯鍏ョ姸鎬�',
+                    type: 'refer',
+                    showField: 'pkSupplierAdmittanceText',
+                    required: true,
+                    referConfig: {
+                        textField: 'name',
+                        valueField: 'oid',
+                        backPath: that.backPath,//娉ㄦ剰杩欓噷闇�瑕佷慨鏀瑰弬鐓х殑瀵瑰簲璺緞
+                        isMuti: false,
+                        type: 'tree',
+                        url: 'supplierAdmittanceController/referTreeSupplierAdmittance'
+                    },
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'pkSupplierImporttance',
+                    title: '渚涘簲鍟嗛噸瑕佸害',
+                    type: 'refer',
+                    required: true,
+                    showField: 'pkSupplierImporttanceText',
+                    referConfig: {
+                        textField: 'name',
+                        valueField: 'oid',
+                        backPath: that.backPath,//娉ㄦ剰杩欓噷闇�瑕佷慨鏀瑰弬鐓х殑瀵瑰簲璺緞
+                        isMuti: false,
+                        type: 'tree',
+                        url: 'supplierImporttanceController/referTreeImportance'
+                    },
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'pkAreaClassify',
+                    title: '鍦板尯鍒嗙被',
+                    type: 'refer',
+                    showField: 'pkAreaClassifyText',
+                    referConfig: {
+                        textField: 'name',
+                        valueField: 'oid',
+                        backPath: that.backPath,//娉ㄦ剰杩欓噷闇�瑕佷慨鏀瑰弬鐓х殑瀵瑰簲璺緞
+                        isMuti: false,
+                        type: 'tree',
+                        url: 'areaClassifyController/referTreeAreaClassify'
+                    },
+                    readOnly:onlyShow
+                }
+                // ,                {
+                //     field: 'parentSupplier',
+                //     title: '涓婄骇渚涘簲鍟�',
+                //     type: 'refer',
+                //     showField: 'parentSupplierText',
+                //     referConfig: {
+                //         textField: 'name',
+                //         valueField: 'oid',
+                //         backPath: that.backPath,//娉ㄦ剰杩欓噷闇�瑕佷慨鏀瑰弬鐓х殑瀵瑰簲璺緞
+                //         isMuti: false,
+                //         type: 'tree',
+                //         url: ''
+                //     },
+                //     readOnly:onlyShow
+                // }
+                ,                {
+                    field: 'address',
+                    title: '鑱旂郴鍦板潃',
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'contactor',
+                    title: '涓昏鑱旂郴浜�',
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'contacts',
+                    title: '涓昏鑱旂郴鏂瑰紡',
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'web',
+                    title: '缃戝潃',
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'email',
+                    title: '鐢靛瓙淇$',
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'legal',
+                    title: '娉曚汉',
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'tax',
+                    title: '绋庣被',
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'fax',
+                    title: '浼犵湡',
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'registermoney',
+                    title: '娉ㄥ唽璧勯噾',
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'taxcode',
+                    title: '绾崇◣浜虹櫥璁板彿',
+                    type: 'text',
+                    readOnly:onlyShow
+                }  ,                {
+                    field: 'supplierMateriel',
+                    title: '渚涘簲鍟嗗搧淇℃伅',
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'trade',
+                    title: '鎵�灞炶涓�',
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'workingAbility',
+                    title: '鍔犲伐鑳藉姏鎻忚堪',
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'description',
+                    title: '鎻忚堪',
+                    type: 'text',
+                    readOnly:onlyShow
+                }];
+        };
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            var selectData  = layui.table.checkStatus("table_" + that.id).data[0];
+            if(selectData == undefined){
+                webUtil.showErrorMsg("璇峰厛閫夋嫨涓�鏉℃暟鎹�!");
+                return false;
+            }
+            that.addOrEdit(false,selectData);
+        };
+        this.addOrEdit = function(add,selectData) {
+            var that = this;
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var addSaveIndex =webUtil.dialog({
+                title:add?'娣诲姞渚涘簲鍟嗗熀鏈俊鎭�':'淇敼渚涘簲鍟嗗熀鏈俊鎭�',
+                btn:['淇濆瓨','鍙栨秷'],
+                skin:'layui-layer-lan',
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                fullScreen:true,
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getFormItems(false),
+                        function () {
+                            if(!add){
+                                                                form.setValues(selectData,filter);
+
+                            }else{
+                                var defaultValues = {};
+                                defaultValues["parentSupplier"] = that.currentItemOid;
+                                defaultValues["parentSupplier" + "Name"] = that.currentItemAttributes.name;
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+                        }, {}, {defaultColumnOneRow: 3});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        values['secretGrade'] = "10"; // 瀵嗙骇
+                        values.pkSupplierClassifyName = values.pkSupplierClassifyText
+                        values.pkSupplierAdmittanceName = values.pkSupplierAdmittanceText
+                        values.pkSupplierImporttanceName = values.pkSupplierImporttanceText
+                        values.pkAreaClassifyName = values.pkAreaClassifyText
+                        values.parentSupplierName = values.parentSupplierText
+                        // return false
+                        var url = that.url.controller + (add?that.url.addSave:that.url.editSave);
+                        webUtil.ajax(add?'post':'put',url,values,function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function(){
+            var that = this;
+            var selectData  = layui.table.checkStatus("table_" + that.id).data[0];
+            if(selectData == undefined){
+                webUtil.showErrorMsg("璇峰厛閫夋嫨涓�鏉℃暟鎹�!");
+                return false;
+            }
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                var submitValue = {oid:selectData.oid,ts:selectData.ts};
+                webUtil.deleteRequest(that.url.controller + that.url.delSvae,submitValue,function(result){
+                    if(result.success) {
+                        if ('true' == result.obj || true == result.obj) {
+                        webUtil.showConfirmMsg("褰撳墠鏁版嵁鍖呭惈鏈変笅绾ф暟鎹紝瑕佸垹闄ょ殑璇濅細鍜屼笅绾ф暟鎹竴璧峰垹闄わ紝浣犵‘璁ょ户缁�?", function () {
+                                that.doDelete(submitValue);
+                            });
+                        } else {
+                            //璇存槑鍙互鍒犻櫎
+                            that.doDelete(submitValue);
+                        }
+                    }else {
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function (xhr,error) {
+                    webUtil.showErrorMsg("鏍¢獙鍒犻櫎鍑虹幇浜嗛敊璇紝鍙兘鏄湇鍔″櫒鏈惎鍔�")
+                },that.backPath);
+            });
+        };
+        this.doDelete = function (submitValue) {
+            var that = this;
+            webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,submitValue,function(result){
+                if(result.success){
+                    webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                    that.refresh();
+                }else{
+                    webUtil.showErrorMsg(result.msg);
+                }
+            },function (xhr,err) {
+                webUtil.showErrorMsg("鎵ц鍒犻櫎鐨勬椂鍊欏嚭閿欎簡閿欒锛屽彲鑳芥槸鏈嶅姟鍣ㄦ殏鏃舵棤娉曡闂�");
+            },that.backPath);
+        };
+        this.refresh = function (buttonid,parentNodeOid) {
+            var that = this;
+            var tree = layui.tree;
+            if(webUtil.isNotNull(parentNodeOid)){
+                tree.reloadNode("tree_" + that.id,parentNodeOid);
+            }else {
+                tree.reload("tree_" + that.id);
+            }
+        };
+        this.DISABLE = function () {
+            var that = this;
+            that.disableOrEnable(false);
+        };
+        this.ENABLE = function () {
+            var that = this;
+            that.disableOrEnable(true);
+        };
+        this.disableOrEnable = function (enable) {
+            var that = this;
+            var oid ;
+            var ts ;
+            var selectData  = layui.table.checkStatus("table_" + that.id).data[0];
+            if(selectData == undefined){
+                webUtil.showErrorMsg("璇峰厛閫夋嫨涓�鏉℃暟鎹�!");
+                return false;
+            }
+            oid = selectData.oid;
+            ts = selectData.ts;
+            webUtil.post(that.url.controller + (enable?that.url.enableData:that.url.disableData),{
+                oid:oid,
+                ts:ts
+                },function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,(enable?'鍚敤鎴愬姛':'鍋滅敤鎴愬姛'));
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+        };
+
+        this.EXPORT = function () {
+            var that = this;
+            var iframeId = MD5("export" +webUtil.getSystemVar(webUtil.systemValueKey.currentDateTimeSSS) +webUtil.getSystemVar(webUtil.systemValueKey.userOid));
+            var data = {};
+            data[TOKEN_KEY] = webUtil.getToken();
+            data['downloadUUID'] = iframeId;
+            webUtil.fileDownloadPost(that.backPath + that.url.controller + that.url.exportData,data);
+        };
+        this.IMPORT = function () {
+            var that = this;
+            var filter =that.id + "_upload";
+            var form = layui.form;
+            var uploadIndex = webUtil.dialog({
+                title:'瀵煎叆渚涘簲鍟嗗熀鏈俊鎭�',
+                btn:['涓嬭浇瀵煎叆妯℃澘','鍙栨秷'],
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" enctype="multipart/form-data"></form>',
+                area: ['300px', '300px'],
+                resize:false,
+                success:function(layero){
+                    //濡傛灉瀵煎叆鏈夊叾浠栨搷浣滐紝鍦ㄧ浜屼釜鍙傛暟涓坊鍔�
+                    form.addItems(filter,[],function(){
+                        $("#form_" + filter).append('<button type="button" class="layui-btn" id="' + that.id + '_upload_form_file" style="margin-left:100px;margin-top:80px;"><i class="layui-icon">&#xe67c;</i>閫夋嫨鏂囦欢鍚庤嚜鍔ㄥ鍏�</button>&nbsp;&nbsp;&nbsp;&nbsp;');
+                        var upload = layui.upload;
+                        //鎵ц瀹炰緥
+                        var uploadInst = upload.render({
+                            elem: '#' + that.id + '_upload_form_file' //缁戝畾鍏冪礌
+                            ,accept:'file'
+                            ,acceptMime:'file/*'
+                            ,exts:'xls|xlsx'
+                            ,url: that.backPath + that.url.controller + that.url.importData
+                            ,done: function(result){
+                                if(result.success){
+                                    layer.close(uploadIndex);
+                                    webUtil.showMsgFromResult(result,"瀵煎叆鎴愬姛");
+                                    that.refresh();
+                                }else{
+                                    webUtil.showErrorMsg(result.msg);
+                                }
+                            }
+                            ,error: function(){
+                                //璇锋眰寮傚父鍥炶皟
+                                 webUtil.showErrorMsg("涓婁紶寮傚父");
+                            }
+                        });
+                    },{},{
+                        defaultColumnOneRow:1
+                    });
+                },
+                yes:function(){
+                    var iframeId = MD5("downloadImportTemplate" +webUtil.getSystemVar(webUtil.systemValueKey.currentDateTimeSSS)  +webUtil.getSystemVar(webUtil.systemValueKey.userOid));
+                    webUtil.fileDownload(that.backPath + that.url.controller + that.url.downloadImportTemplate+ "?" + TOKEN_KEY + "=" + webUtil.getToken()  + "&downloadUUID=" + iframeId );
+                }
+            });
+        };
+        this.ADVQUERY = function() {
+            var that = this;
+            that.serinorQueryInstance.open();
+        };
+        this.advancedQuery = function () {
+            var that = this;
+            var dynamicCondition = layui.dynamicCondition;
+            $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar'+ that.id+'" class="layui-inline"></div>');
+            var smUserTable = JSON.parse(JSON.stringify(that.columns));
+            that.serinorQueryInstance = dynamicCondition.create({
+                fields : smUserTable//鏌ヨ瀛楁
+                ,tableId:"table_"+that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                ,type:"complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                // ,conditionTextId:"#toolbar"+that.id//楂樼骇鏌ヨ 鎸夐挳鎵�鍦ㄧ殑div
+                // ,popupShowQueryBtn: true//鏄剧ず楂樼骇鏌ヨ鎸夐挳
+                ,queryCallBack:function(requestData){//鏌ヨ涔嬪悗鐨刢allback
+                    //console.log(JSON.stringify(requestData))
+                }
+            });
+        };
+        this.refresh = function(){
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdSupplierAdmittance.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdSupplierAdmittance.js
new file mode 100644
index 0000000..8d74bb0
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdSupplierAdmittance.js
@@ -0,0 +1,366 @@
+/**
+ * 渚涘簲鍟嗗噯鍏ョ姸鎬佸垎绫婚〉闈�
+ * @author renky
+ * @date 2020-08-17
+ */
+layui.define(['layer','element','form','table','dynamicCondition','upload' ],function(exports){
+        var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "platform/basedoc/BdSupplierAdmittance";
+        this.moduleKey = "BdSupplierAdmittanceClassify";
+        this.backPath =  configData.compatibility?path:configData.frameworkPath;
+        this.url = {
+            controller:'supplierAdmittanceController/',
+            dataGrid:'getDataGridAdmittance',
+            addSave:'insert',
+            editSave:'update',
+            deleteUrl:'delete',
+            enableData: 'enable',
+            disableData: 'disable',
+            downloadImportTemplate:'downloadImportTemplate',
+            importData : 'importData',
+            exportData : 'exportData',
+             getObjectByOid:'getAdmittanceByOid'
+        };
+        this.getContent=function(){
+            var that = this;
+            var html = "";
+            html = [
+                '<div class="layui-layout" style="display:block;overflow-y: hidden">',
+                    '<div class="layui-layout-border" style="display:block;margin-top:0px; " id="border_',that.id,'">',
+                        '<div class="layui-center" style="overflow-y:auto;">',
+                            that.getToolbarHtml(),
+                            '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                            '<div id="toolbar_column_',that.id ,'" style="display:none;"></div>',
+                        '</div>',
+                    '</div>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                // '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+                //     '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                //     '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                //     '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                //     '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ENABLE"><i class="layui-icon layui-icon-ok-circle"></i>鍚敤</button>',
+                //     '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DISABLE"><i class="layui-icon layui-icon-404"></i>鍋滅敤</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.createSearchHtml({id:"缂栧彿",name:"鍚嶇О"} ,$("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+        };
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            that.initMainTable();
+            that.createSearchHtml();
+            that.advancedQuery();
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var tableWidth = $("#border_" + that.id).width()-225;
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                width:tableWidth,
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'EDIT'){
+                                that.addOrEdit(false,data.oid);
+                            }
+                        });
+                    }else{
+                        if(total>0) {
+                            table.selectRecord('table_' + that.id, {index:0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                }
+            };
+            if(parentFieldName){
+                options.treeConfig = {
+                    treepid:parentFieldName,
+                    treeid:'id',
+                    showField:'name'
+                };
+            }
+            table.render(options);
+            document.getElementById("toolbar_column_" + that.id).innerHTML =
+                '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>';
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),
+                    {
+                        title: '缂栧彿',
+                        field: 'id',
+                        width: 150
+                    },{
+                        title: '鍚嶇О',
+                        field: 'name',
+                        width: 150
+                    },{
+                        title: '鐢熷懡鍛ㄦ湡鍊�',
+                        field: 'lcStatusText',
+                        width: 150
+                    },{
+                        title: '鎻忚堪',
+                        field: 'description',
+                        width: 150
+                    }];
+            }
+        };
+
+        this.getFormItems = function(onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [
+                {
+                    field: 'lcStatus',
+                    title: '鐢熷懡鍛ㄦ湡鍊�',
+                    type: 'text',
+                    hidden: true,
+                    readOnly:onlyShow
+                } ,{
+                    field: 'id',
+                    title: '缂栧彿',
+                    required: true,
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,{
+                    field: 'name',
+                    title: '鍚嶇О',
+                    required: true,
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,{
+                    field: 'description',
+                    title: '鎻忚堪',
+                    type: 'text',
+                    readOnly:onlyShow
+                }];
+        };
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            that.addOrEdit(false,oid);
+        };
+        this.addOrEdit = function(add,oid) {
+            var that = this;
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var addSaveIndex =webUtil.dialog({
+                title:add?'娣诲姞渚涘簲鍟嗗噯鍏ョ姸鎬佸垎绫�':'淇敼渚涘簲鍟嗗噯鍏ョ姸鎬佸垎绫�',
+                btn:['淇濆瓨','鍙栨秷'],
+                skin:'layui-layer-lan',
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                fullScreen:true,
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getFormItems(false),
+                        function () {
+                            if(!add){
+                                form.load(filter,{
+                                    backPath:that.backPath,
+                                    url:that.url.controller + that.url.getObjectByOid,
+                                    method:'get',
+                                    params:{
+                                        oid:oid
+                                    }
+                                });
+                            }else{
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+                        }, {}, {defaultColumnOneRow: 2});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        var url = that.url.controller + (add?that.url.addSave:that.url.editSave);
+                        webUtil.ajax(add?'post':'put',url,values,function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts= webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+        this.refresh = function () {
+            var that = this;
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+        this.DISABLE = function () {
+            var that = this;
+            that.disableOrEnable(false);
+        };
+        this.ENABLE = function () {
+            var that = this;
+            that.disableOrEnable(true);
+        };
+        this.disableOrEnable = function (enable) {
+            var that = this;
+            var oid ;
+            var ts ;
+            oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            ts = webUtil.getOidFromGrid("table_" + that.id,false,false,'ts');
+            webUtil.post(that.url.controller + (enable?that.url.enableData:that.url.disableData),{
+                oid:oid,
+                ts:ts
+                },function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,(enable?'鍚敤鎴愬姛':'鍋滅敤鎴愬姛'));
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+        };
+
+        this.EXPORT = function () {
+            var that = this;
+            var iframeId = MD5("export" +webUtil.getSystemVar(webUtil.systemValueKey.currentDateTimeSSS) +webUtil.getSystemVar(webUtil.systemValueKey.userOid));
+            var data = {};
+            data[TOKEN_KEY] = webUtil.getToken();
+            data['downloadUUID'] = iframeId;
+            webUtil.fileDownloadPost(that.backPath + that.url.controller + that.url.exportData,data);
+        };
+        this.IMPORT = function () {
+            var that = this;
+            var filter =that.id + "_upload";
+            var form = layui.form;
+            var uploadIndex = webUtil.dialog({
+                title:'瀵煎叆渚涘簲鍟嗗噯鍏ョ姸鎬佸垎绫�',
+                btn:['涓嬭浇瀵煎叆妯℃澘','鍙栨秷'],
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" enctype="multipart/form-data"></form>',
+                area: ['300px', '300px'],
+                resize:false,
+                success:function(layero){
+                    //濡傛灉瀵煎叆鏈夊叾浠栨搷浣滐紝鍦ㄧ浜屼釜鍙傛暟涓坊鍔�
+                    form.addItems(filter,[],function(){
+                        $("#form_" + filter).append('<button type="button" class="layui-btn" id="' + that.id + '_upload_form_file" style="margin-left:100px;margin-top:80px;"><i class="layui-icon">&#xe67c;</i>閫夋嫨鏂囦欢鍚庤嚜鍔ㄥ鍏�</button>&nbsp;&nbsp;&nbsp;&nbsp;');
+                        var upload = layui.upload;
+                        //鎵ц瀹炰緥
+                        var uploadInst = upload.render({
+                            elem: '#' + that.id + '_upload_form_file' //缁戝畾鍏冪礌
+                            ,accept:'file'
+                            ,acceptMime:'file/*'
+                            ,exts:'xls|xlsx'
+                            ,url: that.backPath + that.url.controller + that.url.importData
+                            ,done: function(result){
+                                if(result.success){
+                                    layer.close(uploadIndex);
+                                    webUtil.showMsgFromResult(result,"瀵煎叆鎴愬姛");
+                                    that.refresh();
+                                }else{
+                                    webUtil.showErrorMsg(result.msg);
+                                }
+                            }
+                            ,error: function(){
+                                //璇锋眰寮傚父鍥炶皟
+                                 webUtil.showErrorMsg("涓婁紶寮傚父");
+                            }
+                        });
+                    },{},{
+                        defaultColumnOneRow:1
+                    });
+                },
+                yes:function(){
+                    var iframeId = MD5("downloadImportTemplate" +webUtil.getSystemVar(webUtil.systemValueKey.currentDateTimeSSS)  +webUtil.getSystemVar(webUtil.systemValueKey.userOid));
+                    webUtil.fileDownload(that.backPath + that.url.controller + that.url.downloadImportTemplate+ "?" + TOKEN_KEY + "=" + webUtil.getToken()  + "&downloadUUID=" + iframeId );
+                }
+            });
+        };
+        this.ADVQUERY = function(){//楂樼骇鏌ヨ
+            var that = this;
+            that.serinorQueryInstance.open();
+        };
+        this.advancedQuery = function(){
+            var that = this;
+            var dynamicCondition = layui.dynamicCondition;
+            $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar'+ that.id+'" class="layui-inline"></div>');
+            that.serinorQueryInstance = dynamicCondition.create({
+                fields : that.columns//鏌ヨ瀛楁
+                ,tableId:"table_"+that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                ,type:"complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                // ,conditionTextId:"#toolbar"+that.id//楂樼骇鏌ヨ 鎸夐挳鎵�鍦ㄧ殑div
+                // ,popupShowQueryBtn: true//鏄剧ず楂樼骇鏌ヨ鎸夐挳
+                ,queryCallBack:function(requestData){//鏌ヨ涔嬪悗鐨刢allback
+                    //console.log(JSON.stringify(requestData))
+                }
+            });
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdSupplierClassify.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdSupplierClassify.js
new file mode 100644
index 0000000..f8d873b
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdSupplierClassify.js
@@ -0,0 +1,384 @@
+/**
+ * 渚涘簲鍟嗗垎绫婚〉闈�
+ * @author renky
+ * @date 2020-08-17
+ */
+layui.define(['layer','element','form','table','dynamicCondition','upload' ],function(exports){
+        var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "platform/basedoc/BdSupplierClassify";
+        this.moduleKey = "BdSupplierClassify";
+        this.backPath =  configData.compatibility?path:configData.frameworkPath;
+        this.url = {
+            controller:'supplierClassifyController/',
+            dataGrid:'getDataGridSupplierClassify',
+            treeGrid:'getTreeSupplierClassify',
+            addSave:'insert',
+            editSave:'update',
+            deleteUrl:'delete',
+            enableData: 'enable',
+            disableData: 'disable',
+            downloadImportTemplate:'downloadImportTemplate',
+            importData : 'importData',
+            exportData : 'exportData',
+            getObjectByOid:'getByOid'
+        };
+        this.getContent=function(){
+            var that = this;
+            var html = "";
+            html = [
+                '<div class="layui-layout" style="display:block;overflow-y: hidden">',
+                    '<div class="layui-layout-border" style="display:block;margin-top:0px; " id="border_',that.id,'">',
+                        '<div class="layui-center" style="overflow-y:auto;">',
+                            that.getToolbarHtml(),
+                            '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                            '<div id="toolbar_column_',that.id ,'" style="display:none;"></div>',
+                        '</div>',
+                    '</div>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ENABLE"><i class="layui-icon layui-icon-ok-circle"></i>鍚敤</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DISABLE"><i class="layui-icon layui-icon-404"></i>鍋滅敤</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+         
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.createSearchHtml({id:"鍒嗙被缂栧彿",name:"鍒嗙被鍚嶇О"} ,$("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+        };
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            that.initMainTable();
+            that.createSearchHtml();
+            that.advancedQuery();
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var tableWidth = $("#border_" + that.id).width()-225;
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                width:tableWidth,
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'EDIT'){
+                                that.addOrEdit(false,data.oid);
+                            }
+                        });
+                    }else{
+                        if(total>0) {
+                            table.selectRecord('table_' + that.id, {index:0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                }
+            };
+            if(parentFieldName){
+                options.treeConfig = {
+                    treepid:parentFieldName,
+                    treeid:'id',
+                    showField:'name'
+                };
+            }
+            table.render(options);
+            document.getElementById("toolbar_column_" + that.id).innerHTML =
+                '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>';
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),
+                    {
+                        title: '缂栧彿',
+                        field: 'id',
+                        width: 150
+                    },{
+                        title: '鍚嶇О',
+                        field: 'name',
+                        width: 150
+                    },{
+                        title: '涓婄骇渚涘簲鍟嗗垎绫�',
+                        field: 'parentSupplierType',
+                        width: 150
+                    },{
+                        title: '鐢熷懡鍛ㄦ湡鍊�',
+                        field: 'lcStatusText',
+                        width: 150
+                    },{
+                        title: '鎻忚堪',
+                        field: 'description',
+                        width: 150
+                    }];
+            }
+        };
+
+        this.getFormItems = function(onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [
+                {
+                    field: 'id',
+                    title: '缂栧彿',
+                    required: true,
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,{
+                    field: 'name',
+                    title: '鍚嶇О',
+                    required: true,
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,{
+                    field: 'description',
+                    title: '鎻忚堪',
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,{
+                    name: 'parentSupplierType',
+                    title: '涓婄骇渚涘簲鍟嗗垎绫�',
+                    type:'refer',
+                    readOnly:onlyShow,
+                    showField:'parentSupplierTypeText',
+                    referConfig:{
+                        textField:'name',
+                        type:'tree',
+                        url: that.url.controller + that.url.treeGrid,
+                        backPath: that.backPath,
+                    }
+                } ,{
+                    field: 'lcStatus',
+                    title: '鐢熷懡鍛ㄦ湡鍊�',
+                    type: 'text',
+                    hidden: true,
+                    readOnly:onlyShow
+                }];
+        };
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            that.addOrEdit(false,oid);
+        };
+        this.addOrEdit = function(add,oid) {
+            var that = this;
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var addSaveIndex =webUtil.dialog({
+                title:add?'娣诲姞渚涘簲鍟嗗垎绫�':'淇敼渚涘簲鍟嗗垎绫�',
+                btn:['淇濆瓨','鍙栨秷'],
+                skin:'layui-layer-lan',
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                fullScreen:true,
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getFormItems(false),
+                        function () {
+                            if(!add){
+                                form.load(filter,{
+                                    backPath:that.backPath,
+                                    url:that.url.controller + that.url.getObjectByOid,
+                                    method:'get',
+                                    params:{
+                                        oid:oid
+                                    }
+                                });
+                            }else{
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+                        }, {}, {defaultColumnOneRow: 2});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        var url = that.url.controller + (add?that.url.addSave:that.url.editSave);
+                        webUtil.ajax(add?'post':'put',url,values,function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts= webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+        this.refresh = function () {
+            var that = this;
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+        this.DISABLE = function () {
+            var that = this;
+            that.disableOrEnable(false);
+        };
+        this.ENABLE = function () {
+            var that = this;
+            that.disableOrEnable(true);
+        };
+        this.disableOrEnable = function (enable) {
+            var that = this;
+            var oid ;
+            var ts ;
+            oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            ts = webUtil.getOidFromGrid("table_" + that.id,false,false,'ts');
+            webUtil.post(that.url.controller + (enable?that.url.enableData:that.url.disableData),{
+                oid:oid,
+                ts:ts
+                },function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,(enable?'鍚敤鎴愬姛':'鍋滅敤鎴愬姛'));
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+        };
+
+        this.EXPORT = function () {
+            var that = this;
+            var iframeId = MD5("export" +webUtil.getSystemVar(webUtil.systemValueKey.currentDateTimeSSS) +webUtil.getSystemVar(webUtil.systemValueKey.userOid));
+            var data = {};
+            data[TOKEN_KEY] = webUtil.getToken();
+            data['downloadUUID'] = iframeId;
+            webUtil.fileDownloadPost(that.backPath + that.url.controller + that.url.exportData,data);
+        };
+        this.IMPORT = function () {
+            var that = this;
+            var filter =that.id + "_upload";
+            var form = layui.form;
+            var uploadIndex = webUtil.dialog({
+                title:'瀵煎叆渚涘簲鍟嗗垎绫�',
+                btn:['涓嬭浇瀵煎叆妯℃澘','鍙栨秷'],
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" enctype="multipart/form-data"></form>',
+                area: ['300px', '300px'],
+                resize:false,
+                success:function(layero){
+                    //濡傛灉瀵煎叆鏈夊叾浠栨搷浣滐紝鍦ㄧ浜屼釜鍙傛暟涓坊鍔�
+                    form.addItems(filter,[],function(){
+                        $("#form_" + filter).append('<button type="button" class="layui-btn" id="' + that.id + '_upload_form_file" style="margin-left:100px;margin-top:80px;"><i class="layui-icon">&#xe67c;</i>閫夋嫨鏂囦欢鍚庤嚜鍔ㄥ鍏�</button>&nbsp;&nbsp;&nbsp;&nbsp;');
+                        var upload = layui.upload;
+                        //鎵ц瀹炰緥
+                        var uploadInst = upload.render({
+                            elem: '#' + that.id + '_upload_form_file' //缁戝畾鍏冪礌
+                            ,accept:'file'
+                            ,acceptMime:'file/*'
+                            ,exts:'xls|xlsx'
+                            ,url: that.backPath + that.url.controller + that.url.importData
+                            ,done: function(result){
+                                if(result.success){
+                                    layer.close(uploadIndex);
+                                    webUtil.showMsgFromResult(result,"瀵煎叆鎴愬姛");
+                                    that.refresh();
+                                }else{
+                                    webUtil.showErrorMsg(result.msg);
+                                }
+                            }
+                            ,error: function(){
+                                //璇锋眰寮傚父鍥炶皟
+                                 webUtil.showErrorMsg("涓婁紶寮傚父");
+                            }
+                        });
+                    },{},{
+                        defaultColumnOneRow:1
+                    });
+                },
+                yes:function(){
+                    var iframeId = MD5("downloadImportTemplate" +webUtil.getSystemVar(webUtil.systemValueKey.currentDateTimeSSS)  +webUtil.getSystemVar(webUtil.systemValueKey.userOid));
+                    webUtil.fileDownload(that.backPath + that.url.controller + that.url.downloadImportTemplate+ "?" + TOKEN_KEY + "=" + webUtil.getToken()  + "&downloadUUID=" + iframeId );
+                }
+            });
+        };
+        this.ADVQUERY = function(){//楂樼骇鏌ヨ
+            var that = this;
+            that.serinorQueryInstance.open();
+        };
+        this.advancedQuery = function(){
+            var that = this;
+            var dynamicCondition = layui.dynamicCondition;
+            $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar'+ that.id+'" class="layui-inline"></div>');
+            that.serinorQueryInstance = dynamicCondition.create({
+                fields : that.columns//鏌ヨ瀛楁
+                ,tableId:"table_"+that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                ,type:"complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                // ,conditionTextId:"#toolbar"+that.id//楂樼骇鏌ヨ 鎸夐挳鎵�鍦ㄧ殑div
+                // ,popupShowQueryBtn: true//鏄剧ず楂樼骇鏌ヨ鎸夐挳
+                ,queryCallBack:function(requestData){//鏌ヨ涔嬪悗鐨刢allback
+                    //console.log(JSON.stringify(requestData))
+                }
+            });
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdSupplierImporttance.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdSupplierImporttance.js
new file mode 100644
index 0000000..c007361
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdSupplierImporttance.js
@@ -0,0 +1,367 @@
+/**
+ * 渚涘簲鍟嗛噸瑕佸害鍒嗙被椤甸潰
+ * @author renky
+ * @date 2020-08-17
+ */
+layui.define(['layer','element','form','table','dynamicCondition','upload' ],function(exports){
+        var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "platform/basedoc/BdSupplierImporttance";
+        this.moduleKey = "BdSupplierImporttanceClassify";
+        this.backPath =  configData.compatibility?path:configData.frameworkPath;
+        this.url = {
+            controller:'supplierImporttanceController/',
+            dataGrid:'getDataGridImportance',
+            addSave:'insert',
+            editSave:'update',
+            deleteUrl:'delete',
+            enableData: 'enable',
+            disableData: 'disable',
+            downloadImportTemplate:'downloadImportTemplate',
+            importData : 'importData',
+            exportData : 'exportData',
+             getObjectByOid:'getByOid'
+        };
+        this.getContent=function(){
+            var that = this;
+            var html = "";
+            html = [
+                '<div class="layui-layout" style="display:block;overflow-y: hidden">',
+                    '<div class="layui-layout-border" style="display:block;margin-top:0px; " id="border_',that.id,'">',
+                        '<div class="layui-center" style="overflow-y:auto;">',
+                            that.getToolbarHtml(),
+                            '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                            '<div id="toolbar_column_',that.id ,'" style="display:none;"></div>',
+                        '</div>',
+                    '</div>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ENABLE"><i class="layui-icon layui-icon-ok-circle"></i>鍚敤</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DISABLE"><i class="layui-icon layui-icon-404"></i>鍋滅敤</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.createSearchHtml({id:"缂栧彿",name:"鍚嶇О"} ,$("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+        };
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            that.initMainTable();
+            that.createSearchHtml();
+            that.advancedQuery();
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var tableWidth = $("#border_" + that.id).width()-225;
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                width:tableWidth,
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'EDIT'){
+                                that.addOrEdit(false,data.oid);
+                            } 
+                        });
+                    }else{
+                        if(total>0) {
+                            table.selectRecord('table_' + that.id, {index:0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                }
+            };
+            if(parentFieldName){
+                options.treeConfig = {
+                    treepid:parentFieldName,
+                    treeid:'id',
+                    showField:'name'
+                };
+            }
+            table.render(options);
+            document.getElementById("toolbar_column_" + that.id).innerHTML =
+                '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>';
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),
+                    {
+                        title: '缂栧彿',
+                        field: 'id',
+                        width: 150
+                    },{
+                        title: '鍚嶇О',
+                        field: 'name',
+                        width: 150
+                    },{
+                        title: '鐢熷懡鍛ㄦ湡鍊�',
+                        field: 'lcStatusText',
+                        width: 150
+                    },{
+                        title: '鎻忚堪',
+                        field: 'description',
+                        width: 150
+                    }];
+            }
+        };
+
+        this.getFormItems = function(onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [
+                {
+                    field: 'id',
+                    title: '缂栧彿',
+                    required: true,
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,{
+                    field: 'name',
+                    title: '鍚嶇О',
+                    required: true,
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,{
+                    field: 'description',
+                    title: '鎻忚堪',
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,{
+                    field: 'lcStatus',
+                    title: '鐢熷懡鍛ㄦ湡鍊�',
+                    type: 'text',
+                    hidden:true,
+                    readOnly:onlyShow
+                }];
+        };
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            that.addOrEdit(false,oid);
+        };
+        this.addOrEdit = function(add,oid) {
+            var that = this;
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var addSaveIndex =webUtil.dialog({
+                title:add?'娣诲姞渚涘簲鍟嗛噸瑕佸害鍒嗙被':'淇敼渚涘簲鍟嗛噸瑕佸害鍒嗙被',
+                btn:['淇濆瓨','鍙栨秷'],
+                skin:'layui-layer-lan',
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                fullScreen:true,
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getFormItems(false),
+                        function () {
+                            if(!add){
+                                form.load(filter,{
+                                    backPath:that.backPath,
+                                    url:that.url.controller + that.url.getObjectByOid,
+                                    method:'get',
+                                    params:{
+                                        oid:oid
+                                    }
+                                });
+                            }else{
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+                        }, {}, {defaultColumnOneRow: 2});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        var url = that.url.controller + (add?that.url.addSave:that.url.editSave);
+                        webUtil.ajax(add?'post':'put',url,values,function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts= webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+        this.refresh = function () {
+            var that = this;
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+        this.DISABLE = function () {
+            var that = this;
+            that.disableOrEnable(false);
+        };
+        this.ENABLE = function () {
+            var that = this;
+            that.disableOrEnable(true);
+        };
+        this.disableOrEnable = function (enable) {
+            var that = this;
+            var oid ;
+            var ts ;
+            oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            ts = webUtil.getOidFromGrid("table_" + that.id,false,false,'ts');
+            webUtil.post(that.url.controller + (enable?that.url.enableData:that.url.disableData),{
+                oid:oid,
+                ts:ts
+                },function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,(enable?'鍚敤鎴愬姛':'鍋滅敤鎴愬姛'));
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+        };
+
+        this.EXPORT = function () {
+            var that = this;
+            var iframeId = MD5("export" +webUtil.getSystemVar(webUtil.systemValueKey.currentDateTimeSSS) +webUtil.getSystemVar(webUtil.systemValueKey.userOid));
+            var data = {};
+            data[TOKEN_KEY] = webUtil.getToken();
+            data['downloadUUID'] = iframeId;
+            webUtil.fileDownloadPost(that.backPath + that.url.controller + that.url.exportData,data);
+        };
+        this.IMPORT = function () {
+            var that = this;
+            var filter =that.id + "_upload";
+            var form = layui.form;
+            var uploadIndex = webUtil.dialog({
+                title:'瀵煎叆渚涘簲鍟嗛噸瑕佸害鍒嗙被',
+                btn:['涓嬭浇瀵煎叆妯℃澘','鍙栨秷'],
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" enctype="multipart/form-data"></form>',
+                area: ['300px', '300px'],
+                resize:false,
+                success:function(layero){
+                    //濡傛灉瀵煎叆鏈夊叾浠栨搷浣滐紝鍦ㄧ浜屼釜鍙傛暟涓坊鍔�
+                    form.addItems(filter,[],function(){
+                        $("#form_" + filter).append('<button type="button" class="layui-btn" id="' + that.id + '_upload_form_file" style="margin-left:100px;margin-top:80px;"><i class="layui-icon">&#xe67c;</i>閫夋嫨鏂囦欢鍚庤嚜鍔ㄥ鍏�</button>&nbsp;&nbsp;&nbsp;&nbsp;');
+                        var upload = layui.upload;
+                        //鎵ц瀹炰緥
+                        var uploadInst = upload.render({
+                            elem: '#' + that.id + '_upload_form_file' //缁戝畾鍏冪礌
+                            ,accept:'file'
+                            ,acceptMime:'file/*'
+                            ,exts:'xls|xlsx'
+                            ,url: that.backPath + that.url.controller + that.url.importData
+                            ,done: function(result){
+                                if(result.success){
+                                    layer.close(uploadIndex);
+                                    webUtil.showMsgFromResult(result,"瀵煎叆鎴愬姛");
+                                    that.refresh();
+                                }else{
+                                    webUtil.showErrorMsg(result.msg);
+                                }
+                            }
+                            ,error: function(){
+                                //璇锋眰寮傚父鍥炶皟
+                                 webUtil.showErrorMsg("涓婁紶寮傚父");
+                            }
+                        });
+                    },{},{
+                        defaultColumnOneRow:1
+                    });
+                },
+                yes:function(){
+                    var iframeId = MD5("downloadImportTemplate" +webUtil.getSystemVar(webUtil.systemValueKey.currentDateTimeSSS)  +webUtil.getSystemVar(webUtil.systemValueKey.userOid));
+                    webUtil.fileDownload(that.backPath + that.url.controller + that.url.downloadImportTemplate+ "?" + TOKEN_KEY + "=" + webUtil.getToken()  + "&downloadUUID=" + iframeId );
+                }
+            });
+        };
+        this.ADVQUERY = function(){//楂樼骇鏌ヨ
+            var that = this;
+            that.serinorQueryInstance.open();
+        };
+        this.advancedQuery = function(){
+            var that = this;
+            var dynamicCondition = layui.dynamicCondition;
+            $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar'+ that.id+'" class="layui-inline"></div>');
+            var queryColums = that.columns;
+            that.serinorQueryInstance = dynamicCondition.create({
+                fields : queryColums//鏌ヨ瀛楁
+                ,tableId:"table_"+that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                ,type:"complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                // ,conditionTextId:"#toolbar"+that.id//楂樼骇鏌ヨ 鎸夐挳鎵�鍦ㄧ殑div
+                // ,popupShowQueryBtn: true//鏄剧ず楂樼骇鏌ヨ鎸夐挳
+                ,queryCallBack:function(requestData){//鏌ヨ涔嬪悗鐨刢allback
+                    //console.log(JSON.stringify(requestData))
+                }
+            });
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdSupplierRefer.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdSupplierRefer.js
new file mode 100644
index 0000000..bcaf9f1
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdSupplierRefer.js
@@ -0,0 +1,343 @@
+/**
+ * 渚涘簲鍟嗗弬鐓�
+ * @author weidy
+ * @date 2021-1-10
+ */
+layui.define(['layer','element','vciWebReferGrid'],function(exports){
+	var ReferGrid = function(){
+		this.backPath = (configData.compatibility?path:configData.frameworkPath);
+		this.displayType = {
+			classify:'classify',
+			importtance:'importtance'
+		};
+		this.displayTypeTitle = {
+			classify:{
+				title:'鍩烘湰鍒嗙被',
+				url:'supplierClassifyController/referTreeSupplierClassify',
+				queryField:'conditionMap["pkSupplierClassify"]',
+				queryUserUrl:'supplierController/referDataGrid'
+			},
+			importtance:{
+				title:'閲嶈搴�',
+				url:'supplierImporttanceController/referTreeImportance',
+				queryField:'conditionMap["pkSupplierImporttance"]',
+				queryUserUrl:'supplierController/referDataGrid'
+			}
+		};
+	};
+	ReferGrid.prototype.showReferDialog = function (referConfig){
+		var that = this;
+		var filter = referConfig.filter,
+			name = referConfig.name,
+			title = referConfig.title,
+			target = referConfig.target,
+			value = referConfig.value,
+			text = referConfig.text;
+		var options = referConfig.options;
+		var baseOptions = {};
+		for(var key in options){
+			baseOptions[key] = options[key];
+		}
+		baseOptions.filter = filter;
+		baseOptions.name = name;
+		baseOptions.value = value;
+		baseOptions.text = text;
+		baseOptions.title = title;
+		baseOptions.setValue = function (filter,name,value,rawValue,isClose,selectRecords){
+			target.setValue(filter,name,value,rawValue,isClose,selectRecords);
+		}
+		that.viewSupplierInDialog(baseOptions);
+	};
+
+	ReferGrid.prototype.viewSupplierInDialog = function (options){
+		var that = this;
+		options.supplierUrl = $webUtil.getValueFromObj(options,['url','referUrl'],'supplierController/referDataGrid');
+		options.textField = $webUtil.getValueFromObj(options,['textField'],"name");
+		options.valueField = $webUtil.getValueFromObj(options,['valueField'],"oid");
+		var filter = options.filter;
+		var name = options.name;
+		var valueInfo = ($webUtil.isNotNull(options.text)?("宸茶缃殑鍊间负[" +options.text +"]"):'鏈缃��');
+		var referIndex = $webUtil.dialog({
+			title:(options.title?options.title:'璇烽�夋嫨渚涘簲鍟�'),
+			btn:['纭畾','鍙栨秷'],
+			content:'<div id="referGrid_toolbar_' + filter + '" layui-filter="referGrid_toolbar_' + filter + '" class="layui-table-toolbar layui-form referGrid_toolbar_'+filter+'" style="height:550px;"></div>',
+			area:[(($webUtil.isNotNull(options.width) && options.width*1>1) ?options.width*1 : 1150) +'px',
+				(($webUtil.isNotNull(options.height) && options.height*1>1) ?options.height*1 : 670) + 'px'],
+			btnBefore:valueInfo,
+			yes:function(index,layero){
+				var selectValue = that.getSelectValue(filter,name);
+				if(selectValue){
+					options.setValue(filter,name,selectValue.value,selectValue.rawValue,true,selectValue.allValues);
+					layer.close(referIndex);
+				}
+			},
+			success:function(layero){
+				that.showGrid(filter,name,options);
+			}
+		});
+		return referIndex;
+	};
+	ReferGrid.prototype.setConfig=function(filter,name,options){
+		var that = this;
+		if(!that.referConfig){
+			that.referConfig = {};
+		}
+		that.referConfig[filter + "_" + name] = options;
+	};
+	ReferGrid.prototype.getConfig=function(filter,name){
+		var that = this;
+		if(!that.referConfig){
+			that.referConfig = {};
+		}
+		if((filter + "_" + name) in that.referConfig){
+			return that.referConfig[filter + "_" + name];
+		}
+	};
+	ReferGrid.prototype.showGrid = function (filter,name,options){
+		var that = this;
+		that.setConfig(filter,name,options);
+		var contentFilter = filter + "_" + name;
+		var html=[
+				'<div class="layui-layout-border vciWebReferGridInDojo" style="margin-left:5px;">',
+					'<div style="width:200px;float: left;background-color:#ffffff;display:',options.onlyTable?'none':'block','">',
+						'<div lay-filter="referTree_' + contentFilter + '" class="layui-tab layui-tab-card" lay-allowClose="false">',
+							'<ul class="layui-tab-title" lay-allowClose="false">',
+								'<li class="layui-this" >鍩烘湰鍒嗙被</li>',
+								'<li>閲嶈搴�</li>',
+							'</ul>',
+							'<div class="layui-tab-content">',
+								'<div class="layui-tab-item layui-show">',
+									'<ul layui-filter="classify_',contentFilter,'" style="border:1px solid #6886ff;overflow-x:auto"></ul>',
+								'</div>',
+								'<div class="layui-tab-item">',
+									'<ul layui-filter="importtance_',contentFilter,'" style="border:1px solid #6886ff;overflow-x:auto"></ul>',
+								'</div>',
+							'</div>',
+						'</div>',
+					'</div>',
+					'<div class="layui-layout" style="margin-left:',options.onlyTable?'5':'205','px;">',
+						'<div layui-filter="referGrid_toolbar_',contentFilter, '" class="layui-btn-container">',
+					'</div>',
+					'<div class="layui-center" style="margin-left: 5px;">',
+						'<table class="layui-table layui-referGrid" lay-size="sm" lay-even layui-filter="referGrid_' + contentFilter + '" id="referGrid_' + contentFilter + '" ></table>',//涓诲垪琛�
+					'</div>',
+				'</div>'
+				];
+		$("#referGrid_toolbar_"+ filter ).html(html.join(''));
+		$("#referGrid_toolbar_"+filter+" .layui-layout-border").css({'height':'96%'});
+		that.showTree(that.displayType.classify,filter,name);
+		that.showTree(that.displayType.importtance,filter,name);
+		var tableId = 'referGrid_' + filter + '_' + name;
+		var table = layui.table;
+		var isMuti = options.isMuti;
+		var requestData = {};
+		//鍙互瀹氫箟琛ㄦ牸浜�
+		table.render({
+			elem: '#referGrid_' + filter + '_' + name,
+			id: tableId,
+			url: (options.supplierUrl ? options.supplierUrl : that.url.dataGrid),
+			page: {
+				limit: 15,
+				page: 1
+			},
+			backPath: (options.backPath ? options.backPath : that.backPath),
+			height: '475px',
+			where: requestData,
+			method: 'get',
+			selectMode: (isMuti ? table.selectMode.muti : table.selectMode.single),
+			cols: [[table.getIndexColumn(), table.getCheckColumn(),
+				{
+					field: 'id',
+					title: '渚涘簲鍟嗙紪鍙�',
+					sort:true,
+					width: 120
+				}, {
+					field: 'name',
+					title: '渚涘簲鍟嗗悕绉�',
+					sort:true,
+					width: 150
+				}, {
+					field: 'pkSupplierClassifyText',
+					title: '鍩烘湰鍒嗙被',
+					sort:true,
+					width: 90
+				}, {
+					field: 'pkSupplierAdmittanceText',
+					title: '鍑嗗叆鐘舵��',
+					sort:true,
+					width: 85
+				}, {
+					field: 'pkSupplierImporttanceText',
+					title: '閲嶈搴�',
+					sort:true,
+					width: 85
+				}, {
+					field: 'rateInfo',
+					title: '褰撳墠璇勫垎',
+					sort:true,
+					width: 85
+				}, {
+					field: 'contactor',
+					title:'鑱旂郴浜�',
+					width: 150,
+					templet:function (d){
+						return (d.contactor||'') + " " + d.contacts;
+					}
+				},{
+					field: 'secretGradeText',
+					title: '瀵嗙骇',
+					width: 60,
+					hidden: (!configData.controllerSecret)
+				}
+			]]
+		});
+		var queryColumns = [ {
+			field: 'id',
+			title: '渚涘簲鍟嗙紪鍙�'
+		}, {
+			field: 'name',
+			title: '渚涘簲鍟嗗悕绉�'
+		}];
+		that.showSearchHtml(queryColumns,tableId,filter,name,requestData);
+	};
+	ReferGrid.prototype.showTree = function (displayType,filter,name) {
+		var that = this;
+		var tree = layui.tree;
+		var requestData = {};
+		var options = that.getConfig(filter,name);
+		var url = that.displayTypeTitle[displayType].url;
+		//鏄剧ずtree
+		var treeOptions = {
+			url:url,
+			extraParams:requestData,
+			treeFilter:filter,
+			treeName:name,
+			showSearch:true,
+			backPath:(options.backPath?options.backPath:that.backPath),
+			loadType:tree.loadType.all,
+			click:function(item,elem,treeOptions){
+				that.treeDoClick(item,elem,treeOptions,displayType,filter,name);
+				return false;
+			}
+		};
+		tree.init(displayType + "_" + filter+'_'+name,$('[layui-filter="'+ displayType + "_" + filter+'_'+name + '"]'),treeOptions);
+	};
+	ReferGrid.prototype.treeDoClick = function (item,elem,option,displayType,filter,name) {
+		var that = this;
+		var tableId = 'referGrid_' + filter + '_' + name;
+		var where = {};
+		where[that.displayTypeTitle[displayType].queryField] = item.oid;
+		var tableUrl = that.displayTypeTitle[displayType].queryUserUrl;
+		layui.table.reload(tableId,{
+			url:tableUrl,
+			where:where
+		});
+	};
+	ReferGrid.prototype.showSearchHtml = function (queryColumns,tableId,filter,name,requestData) {
+		var that = this;
+		var table = layui.table;
+		var toolbarElem = $('[layui-filter="referGrid_toolbar_' + filter + '_' + name +'"]');
+		if(queryColumns){
+			var toolbarHtml = '<div class="layui-form-item" style="height:24px;display:inline-block"> '
+				+ '<div class="layui-input-inline" style="height:24px;line-height:24px;width:150px"><select name="referGrid_search_'+ filter + '_' + name +'" style="height:24px;width:120px;padding-right:30px;font-size:15px;">';
+			layui.each(queryColumns,function(_index,queryRecord){
+				toolbarHtml += '<option value="' + queryRecord.field + '" >' + queryRecord.title + '</option>';
+			});
+			toolbarHtml += '</select></div>';
+			toolbarHtml += '<div class="layui-input-inline"><input type="text" style="height:24px;font-size:14px;" name="referGrid_searchvalue_'+ filter + '_' + name +'" placeholder="杈撳叆鍊煎悗鍥炶溅杩涜妯$硦鏌ヨ" class="layui-input" ></div>';
+			toolbarHtml += '<div class="layui-input-inline" ><button class="layui-btn" style="height:24px;line-height:24px" name="referGrid_searchbtn_'+ filter + '_' + name +'" >鏌ヨ</button></div>';
+			toolbarHtml += '</div>';
+			toolbarElem.html(toolbarHtml);
+			layui.form.render('select');
+			$('[name="referGrid_searchvalue_' + filter + "_" + name + '"]').keydown(function (e){
+				if(e.keyCode == 13){
+					var searchField = $(this).parent().parent().find('select').val();
+					var searchValue = $(this).val();
+					searchValue = "*" + searchValue + "*";
+					requestData['conditionMap["' + searchField + '"]'] = searchValue;
+					table.reload(
+						tableId, {
+							where: requestData
+						}
+					);
+				}
+			});
+			$('[name="referGrid_searchbtn_'+ filter + '_' + name +'"]').click(function(){
+				var searchField = $(this).parent().parent().find('select').val();
+				var searchValue = $(this).parent().parent().find('[name="referGrid_searchvalue_' + filter + '_' + name + '"]').val();
+				searchValue = "*" + searchValue + "*";
+				requestData['conditionMap["' + searchField + '"]'] = searchValue;
+				table.reload(
+					tableId, {
+						where: requestData
+					}
+				);
+			});
+		}
+	};
+	ReferGrid.prototype.destory = function (filter,name) {
+		//閿�姣�
+		var that = this;
+		if($('#referGrid_' + filter + '_' + name)){
+			$('#referGrid_' + filter + '_' + name).remove();
+		}
+	};
+	ReferGrid.prototype.getSelectValue = function (filter,name) {
+		var that = this;
+		var table = layui.table;
+		var selectValue = {};
+		var checkStatus = table.checkStatus('referGrid_' + filter + "_" + name);
+		var options = that.getConfig(filter,name);
+		if(checkStatus.data.length>0){
+			if(!options.isMuti && checkStatus.data.length > 1){
+				$webUtil.showErrorMsg("鍙兘閫夋嫨涓�鏉℃暟鎹�");
+				return false;
+			}
+			var value = "";
+			var rawValue = "";
+			options.valueField = options.valueField?options.valueField:that.defaultConfig.valueField;
+			options.textField = options.textField?options.textField:that.defaultConfig.textField;
+			var isMutiValue = (options.valueField.indexOf(",")>-1);
+			var isMutiRaw = (options.textField.indexOf(",")>-1);
+			layui.each(checkStatus.data,function(_index,item){
+				if(isMutiValue){
+					var valueFieldArray = options.valueField.split(",");
+					layui.each(valueFieldArray,function(_indexField,_itemField){
+						value += item[_itemField] + (options.valueSep?options.valueSep:' ');
+					});
+					value+= ",";
+				}else {
+					value += item[options.valueField] + ",";
+				}
+				if(isMutiRaw) {
+					var rawFieldArray = options.textField.split(",");
+					layui.each(rawFieldArray,function(_indexField,_itemField){
+						rawValue += item[_itemField] + (options.textSep?options.textSep:' ');
+					});
+					rawValue+= ",";
+				}else{
+					rawValue += item[options.textField] + ",";
+				}
+			});
+			if($webUtil.endWith(value,",")){
+				value = value.substring(0,value.length - 1);
+			}
+			if($webUtil.endWith(rawValue,",")){
+				rawValue = rawValue.substring(0,rawValue.length -1);
+			}
+			selectValue = {
+				value : value,
+				rawValue : rawValue,
+				allValues: checkStatus.data
+			};
+			return selectValue;
+		}else{
+			return false;
+		}
+	};
+
+
+
+	var rg = new ReferGrid();
+	exports('platform/basedoc/BdSupplierRefer',rg);
+});
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdUnit.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdUnit.js
new file mode 100644
index 0000000..be3db94
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdUnit.js
@@ -0,0 +1,242 @@
+/**
+ * 璁¢噺鍗曚綅
+ * @author weidy@2019-11-26
+ */
+layui.define(['layer','element','form','table','util'],function(exports){
+    var Class = function(){
+        this.MODELNAME = "platform/basedoc/BdUnit";
+        this.moduleKey = "BdUnit";
+        this.id='BdUnit';
+        this.sourceData={};
+        this.columns = [];
+        this.backPath =  configData.compatibility?path:configData.frameworkPath;
+        this.url={
+            controller:'unitOfMeasurementController/',
+            dataGrid:'getAllUnitOfMeasure',//鍒楄〃鏁版嵁鍜屾煡璇�
+            add:'addUnitOfMeasure',
+            edit:'editUnitOfMeasure',
+            deleteUrl:'delUnitOfMeasure',
+            enableUrl:'enableUnitOfMeasure',
+            disableUrl:'disableUnitOfMeasure'
+        };
+        this.buttonIconMap = {
+            SEARCH:'layui-icon-refresh-2',
+            SENIORSEARCH:'layui-icon-query',
+            ADD:'layui-icon-add-1',
+            EDIT:'layui-icon-edit',
+            DELETE:'layui-icon-delete'
+        };
+        this.getContent=function(){//杩斿洖杩欎釜缁勪欢鐨勫熀纭�html
+            var that = this;
+            var html = "";
+            html = [
+                    '<div class="layui-layout-border">',
+                        '<div class="layui-center">',
+                            that.getToolbarHtml(),
+                            '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',//涓诲垪琛�
+                        '</div>',
+                    '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_button_',that.id,'" class="layui-btn-container">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_START"><i class="layui-icon layui-icon-ok-circle"></i>鍚敤</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_STOP"><i class="layui-icon layui-icon-404"></i>鍋滅敤</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>',
+            ].join("");
+            return html;
+        };
+        this.init=function(){//鍩虹鐨刪tml琚坊鍔犲悗锛屽啀鎵ц鍒濆鍖�
+            var that = this;
+            $webUtil.copyConfig(that,that.moduleKey);
+            var table = layui.table;
+            that.checkColumns();//涓诲垪琛ㄤ腑鍒椼��
+            table.render({
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                url: that.backPath + that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                selectMode:table.selectMode.muti,
+                cols: [that.columns]
+            });
+            $webUtil.createSearchHtml({
+                id:'鍗曚綅',
+                name:'鍗曚綅涓枃璇存槑'
+            },$("[layui-filter='toolbar_button_" + that.id + "']"),'table_' + that.id);
+            $webUtil.bindDefultButtonLisenter(that, that.id);
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){//濡傛灉鍏朵粬鍦版柟鎯充娇鐢ㄨ繖涓粍浠剁殑鏃跺�欙紝鍙互鑷畾涔夊垪
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),{
+                    field:'id',
+                    title:'璁¢噺鍗曚綅鑻辨枃',
+                    width:150
+                },{
+                    field:'name',
+                    title:'鍗曚綅涓枃璇存槑',
+                    width:200
+                },{
+                    field:'description',
+                    title:'鎻忚堪',
+                    width:150
+                },{
+                    field:'lcStatusText',
+                    title:'鐘舵��',
+                    width:90
+                }];
+            }
+        };
+        this.ADD = function(){
+            var that = this;
+            that.dealData(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            var oid = $webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            that.dealData(false);
+        };
+        this.getFormItems = function(isEdit){
+            var that = this;
+            return [{
+                type: 'text',
+                name: 'id',
+                text: '璁¢噺鍗曚綅鑻辨枃',
+                required: true
+            }, {
+                type: 'text',
+                name: 'name',
+                text: '鍗曚綅涓枃璇存槑',
+                required: true
+            }, {
+                type: 'text',
+                name: 'description',
+                text: '鎻忚堪'
+            }];
+        };
+
+        this.dealData = function(add){
+            var that = this;
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var addSaveIndex = layer.open({
+                type:1,
+                title:add?'娣诲姞璁¢噺鍗曚綅':'淇敼璁¢噺鍗曚綅',
+                btn:['淇濆瓨','鍙栨秷'],
+                skin:'layui-layer-lan',
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                area:['800px','300px'],
+                closeBtn:2,
+                shade:true,
+                shadeClose:true,
+                resize:true,
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getFormItems(),
+                        function () {
+                            if(!add){
+                                var selectRowData = layui.table.checkStatus("table_" + that.id);
+                                form.setValues(selectRowData.data[0],filter);
+                            }else{
+                                form.setValues({},filter);
+                            }
+                        }, {}, {defaultColumnOneRow: 2});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        var url = that.url.controller + (add?that.url.add:that.url.edit);
+                        $webUtil.ajax(add?'post':'put',url,values,function(result){
+                            if(result.success){
+                                if($webUtil.isNull(result.msg)) {
+                                    result.msg = add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛";
+                                }
+                                $webUtil.showMsg(result.msg);
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                $webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            $webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                    that.refresh();
+                }
+            });
+        };
+        this.DEL = function(){
+            var that = this;
+            var oid = $webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts =  $webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            $webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欎釜璁¢噺鍗曚綅",function () {
+                $webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        $webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    }else{
+                        $webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    $webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+        this.START = function(){
+            var that = this;
+            that.operaData(that.url.controller + that.url.enableUrl,'鍚敤鎴愬姛');
+        };
+        this.STOP = function(){
+            var that = this;
+            that.operaData(that.url.controller + that.url.disableUrl,'鍋滅敤鎴愬姛');
+        };
+        this.operaData = function(url,msg){
+            var that = this;
+            var oid = $webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            $webUtil.post(url,{
+                oid:oid,
+                ts:$webUtil.getOidFromGrid("table_" +that.id,false,false,'ts')
+            },function(result){
+                if(result.success){
+                    $webUtil.showMsgFromResult(result,msg);
+                    that.refresh();
+                }else{
+                    $webUtil.showErrorMsg(result.msg);
+                }
+            },function(xhr,err){
+                $webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+            },that.backPath);
+        };
+        this.refresh = function(){
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdWarehouse.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdWarehouse.js
new file mode 100644
index 0000000..715eb07
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdWarehouse.js
@@ -0,0 +1,611 @@
+/**
+ * 搴撴埧绠$悊/浠撳簱鍩烘湰淇℃伅
+ * @author weidy@2020/2/24
+ * @constructor
+ */
+layui.define(['layer','element','form','table','tree','transfer'],function(exports){
+    var Class = function(){
+        this.MODELNAME = "platform/basedoc/BdWarehouse";
+        this.moduleKey = "BdWarehouse";
+        this.id='BdWarehouse';
+        this.sourceData={};
+        this.backPath = configData.compatibility?path:configData.frameworkPath;
+        this.buttonIconMap = {};
+        this.url={
+            controller: 'warehouseController/',
+            tree:'warehouseClassifyController/treeAllEnabledWarehouseClassify',
+            referClassifyTree:'warehouseClassifyController/referTree',
+            listWarehouseByClass:'gridWarehouseByClassify',
+            listAdmin:'getAdminByWareHouseOid',
+            referWarehouse:'refTree',
+            add:'addWarehouse',
+            edit:'editWarehouse',
+            deleteUrl:'delWarehouse',
+            enabled:'enableWarehouse',
+            disabled:'disableWarehouse',
+            unLinkUser:'userQueryController/refDataGrid',
+            linkUser:'addWarehouseAdmin',
+            removeLinkUser:'delWarehouseAdmin'
+        };
+        this.controllerSecret = configData.controllerSecret;
+        this.columns = [];
+        this.getContent=function(){//杩斿洖杩欎釜缁勪欢鐨勫熀纭�html
+            var that = this;
+            var html = "";
+            html = [
+                    '<div class="layui-layout" style="display:block;overflow-y: hidden">',
+                        '<div class="layui-vci-tree" style="width:250px;float: left;background-color:#ffffff;overflow-y: auto;">',
+                            '<label class="layui-icon layui-icon-tree" style="line-height: 20px;color:red;font-size:20px;">搴撴埧绫诲瀷</label>',
+                            '<ul layui-filter="tree_',that.id,'"><ul>',
+                        '</div>',
+                        '<div class="layui-layout-border" style="display:block;margin-top:0px;margin-left:255px;">',
+                            '<div class="layui-center" style="overflow-y:auto;">',
+                                that.getToolbarHtml(),
+                                '<table id="table_',that.id ,'" lay-filter="', that.id ,'"></table>',
+                            '</div>',
+                            '<div class="layui-south" >',
+                                that.getDetailToolbarHtml(),
+                                '<table id="detail_table_',that.id ,'" lay-filter="detail_table_', that.id ,'"></table>',
+                                '<div id="toolbar_column_',that.id ,'" style="display:none;"></div>',
+                            '</div>',
+                        '</div>',
+                    '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml = function(){
+            var that =this;
+            return ['<div layui-filter="toolbar_button_',that.id,'" class="layui-btn-container">',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ENABLE"><i class="layui-icon layui-icon-ok-circle"></i>鍚敤</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DISABLE"><i class="layui-icon layui-icon-404"></i>鍋滅敤</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'].join("");
+        };
+        this.getDetailToolbarHtml = function () {
+            var that =this;
+            return ['<div layui-filter="toolbar_detail_table_',that.id,'" class="layui-btn-container">',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_detail_table_',that.id,'_LINKUSER"><i class="layui-icon layui-icon-add-1"></i>娣诲姞绠$悊鍛�</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_detail_table_',that.id,'_REMOVEUSER"><i class="layui-icon layui-icon-edit"></i>绉婚櫎绠$悊鍛�</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_detail_table_',that.id,'_refreshUser"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'].join("");
+        };
+        this.init=function(){
+            //鍩虹鐨刪tml琚坊鍔犲悗锛屽啀鎵ц鍒濆鍖�
+            var that = this;
+            that.firstTreeLoad =false;
+            that.firstGridLoad = false;
+            $webUtil.copyConfig(that,that.moduleKey);
+            $webUtil.bindDefultButtonLisenter(that, that.id);
+            var tree = layui.tree;
+            var scrollHeight =  window.innerHeight;
+            var treeUL = $('[layui-filter="tree_' + that.id + '"]');
+            var treeHeight = scrollHeight - 200;
+            treeUL.parent().height(treeHeight);
+            tree.init("tree_" + that.id, treeUL, {
+                url: that.url.tree,
+                backPath: that.backPath,
+                extraParams: {
+                    isMuti: false
+                },
+                loadType:layui.tree.loadType.all,
+                showSearch:true,
+                click: function (item, elem, options) {
+                    that.currentItemOid = item.oid;
+                    that.currentItemAttributes = item.attributes;
+                    that.loadListByClassify();
+                },
+                done: function (thisFilter,result) {
+                    that.currentItemOid = "";
+                    if(result && result.length > 0){
+                        that.currentItemOid = result[0].oid;
+                    }
+                    if(!that.firstTreeLoad) {
+                        that.initMainTable();
+                        that.firstTreeLoad = true;
+                    }
+                }
+            });
+        };
+        this.initMainTable = function(callback){
+            //鍔犺浇涓诲垪琛�
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();//涓诲垪琛ㄤ腑鍒椼��
+            table.render({
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                url: that.backPath + that.url.controller + that.url.listWarehouseByClass,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                where:{
+                    pkWarehouseClassify:that.currentItemOid
+                },
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                rowClick:function(filter,data){
+                    if(data){
+                        that.loadLinkAdmin(data.oid);
+                    }
+                },
+                done:function(res, cur, count){
+                    if(!that.firstGridLoad) {
+                        that.initDetailTable((res && res.data) ? res.data[0] : "");
+                        that.firstGridLoad = true;
+                    }
+                }
+            });
+            $webUtil.createSearchHtml({
+                id:'搴撴埧缂栧彿',
+                name:'搴撴埧鍚嶇О'
+            },$("[layui-filter='toolbar_button_" + that.id + "']"),'table_' + that.id);
+            $webUtil.bindDefultButtonLisenter(that, "table_" + that.id);
+        };
+        this.loadListByClassify = function(){
+            //鍔犺浇鍙充晶鐨勮〃
+            var that = this;
+            if($webUtil.isNull(that.currentItemOid)){
+                return;
+            }
+            layui.table.reload("table_" + that.id,{
+                where:{
+                    pkWarehouseClassify: that.currentItemOid
+                }
+            });
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){//濡傛灉鍏朵粬鍦版柟鎯充娇鐢ㄨ繖涓粍浠剁殑鏃跺�欙紝鍙互鑷畾涔夊垪
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),{
+                    field:'id',
+                    title:'搴撴埧缂栧彿',
+                    width:150
+                },{
+                    field:'name',
+                    title:'搴撴埧鍚嶇О',
+                    width:200
+                },{
+                    field:'address',
+                    title:'搴撴埧鍦板潃',
+                    width:150
+                },{
+                    field:'hearder',
+                    title:'璐熻矗浜�',
+                    width:80
+                },{
+                    field:'tel',
+                    title:'鑱旂郴鐢佃瘽',
+                    width:120
+                },{
+                    field:'parentWarehouseText',
+                    title:'涓婄骇搴撴埧',
+                    width:150
+                },{
+                    field:'pkDepartmentName',
+                    title:'绠$悊閮ㄩ棬',
+                    width:150
+                },{
+                    field:'secretGradeText',
+                    title:'瀵嗙骇',
+                    width:90,
+                    hidden:!that.controllerSecret
+                },{
+                    field:'lcStatusText',
+                    title:'鐘舵��',
+                    width:90
+                }];
+            }
+        };
+        this.checkDetailColumns = function () {
+            var that = this;
+            var table = layui.table;
+            if(that.detailColumns==null || that.detailColumns.length==0){//濡傛灉鍏朵粬鍦版柟鎯充娇鐢ㄨ繖涓粍浠剁殑鏃跺�欙紝鍙互鑷畾涔夊垪
+                that.detailColumns = [table.getIndexColumn(),table.getCheckColumn(),{
+                    field:'userId',
+                    title:'鐢ㄦ埛鍚�',
+                    width:150
+                },{
+                    field:'userName',
+                    title:'绠$悊鍛樺鍚�',
+                    width:200
+                },{
+                    field:'options',
+                    title:'鎿嶄綔',
+                    toolbar: '#toolbar_column_' + that.id
+                }];
+            }
+        };
+        this.initDetailTable = function(wareHouseOid){
+            var that = this;
+            var table = layui.table;
+            that.checkDetailColumns();//涓诲垪琛ㄤ腑鍒椼��
+            table.render({
+                elem: '#detail_table_' + that.id,
+                id: 'detail_table_' + that.id,
+                url: that.backPath + that.url.controller +  that.url.listAdmin,
+                where:{
+                    wareHouseOid:wareHouseOid
+                },
+                width:550,
+                selectMode:table.selectMode.muti,
+                cols: [that.detailColumns],
+                done:function (res,curr,count) {
+                    table.on('tool(detail_table_' + that.id + ')',function(obj){
+                        var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                        var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                        if(layEvent == 'removeLinkPerson'){
+                            that.doRemoveLinkPerson([data]);
+                        }
+                    });
+                }
+            });
+            document.getElementById("toolbar_column_" + that.id).innerHTML = '<a class="layui-btn layui-btn-intable" lay-event="removeLinkPerson">绉婚櫎</a>';
+            $webUtil.bindDefultButtonLisenter(that, "detail_table_" + that.id);
+        };
+        this.loadLinkAdmin = function (warehouseOid) {
+            var that = this;
+            layui.table.reload('detail_table_' + that.id,{
+                where:{
+                    wareHouseOid:warehouseOid
+                }
+            });
+        };
+        this.ADD=function(){
+            var that = this;
+            that.addOrEdit(false);
+        };
+        this.EDIT = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.addOrEdit = function(edit){
+            var that = this;
+            var filter ="addForm_" + that.id;
+            var form = layui.form;
+            var oid;
+            if(edit){
+                //鍏堣幏鍙栨暟鎹�
+                 oid = $webUtil.getOidFromGrid("table_" + that.id,true,true);
+                if(!oid){
+                    return false;
+                }
+            }
+            var selectRowData = layui.table.checkStatus("table_" + that.id);
+            var addSaveIndex = layer.open({
+                type:1,
+                title:edit?'淇敼搴撴埧妗f':'娣诲姞搴撴埧妗f',
+                btn:['淇濆瓨','鍙栨秷'],//,'淇濆瓨鏂板'],
+                skin:'layui-layer-lan',
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                area:['850px','510px'],
+                closeBtn:2,
+                shade:true,
+                shadeClose:true,
+                resize:true,
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero){
+                    form.addItems(filter,that.getFormItems(), function(){
+                        //鏂板鐨勬椂鍊欙紝鎶婂乏渚ч�夋嫨鐨勮妭鐐归渶瑕佹坊鍔犲湪搴撴埧绫诲埆涓�
+                        if(!edit) {
+                            var values = {};
+                            if($webUtil.isNotNull(that.currentItemOid) && that.currentItemAttributes){
+                                values = {
+                                    pkWarehouseClassify:that.currentItemAttributes.oid,
+                                    pkWarehouseClassifyText:that.currentItemAttributes.name,
+                                    warehouseClassifyId:that.currentItemAttributes.id
+                                }
+                            }
+                            values['pkDepartment'] = $webUtil.getSystemVar($webUtil.systemValueKey.deptOid);
+                            values['pkDepartmentName'] = $webUtil.getSystemVar($webUtil.systemValueKey.deptName);
+                            form.setValues(values, filter);
+                        }else{
+                            //淇敼鐨勬椂鍊欏氨闇�瑕佹妸鏁翠釜鏁版嵁娣诲姞杩涘幓
+                            form.setValues(selectRowData.data[0], filter);
+                        }
+                    },{},{defaultColumnOneRow:2,inDialog:true});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        $webUtil.ajax(edit?'put':'post',that.url.controller + (edit?that.url.edit:that.url.add),values,function(result){
+                            if(result.success){
+                                if($webUtil.isNull(result.msg)){
+                                    result.msg = edit?"淇敼搴撴埧鎴愬姛":'娣诲姞搴撴埧鎴愬姛';
+                                }
+                                $webUtil.showMsg(result.msg);
+                                layer.close(addSaveIndex);
+                                that.refresh(that.currentItemOid);
+                            }else{
+                                $webUtil.showErrorMsg(result.msg);
+                            }
+                        },function (xhr,error) {
+                            $webUtil.showErrorMsg("缁存姢搴撴埧鐨勪俊鎭殑鏃跺�欏嚭鐜颁簡閿欒");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                    that.refresh(that.currentItemOid);
+                }
+            });
+        };
+        this.DEL = function(){
+            var that = this;
+            var oid = $webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            $webUtil.showConfirmMsg("鎮ㄧ‘瀹氳鍒犻櫎杩欎釜搴撴埧鍚楋紝濡傛灉搴撴埧涓凡缁忓瓨鍦ㄤ笟鍔℃暟鎹皢涓嶈兘琚垹闄�",function () {
+                that.doOperaData(oid,that.url.controller + that.url.deleteUrl,'鍒犻櫎鎴愬姛',true,true);
+            });
+        };
+        this.ENABLE = function(){
+            var that = this;
+            var oid = $webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            $webUtil.showConfirmMsg("鏄惁鍚屾椂鍚敤涓嬬骇搴撴埧", function () {
+                that.doOperaData(oid,that.url.controller + that.url.enabled,'鍚敤鎴愬姛', false, true);
+            }, function () {
+                that.doOperaData(oid,that.url.controller + that.url.enabled,'鍚敤鎴愬姛', false, false);
+            });
+        };
+        this.DISABLE = function(){
+            var that = this;
+            var oid = $webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            $webUtil.showConfirmMsg("鏄惁鍚屾椂鍋滅敤涓嬬骇搴撴埧", function () {
+                that.doOperaData(oid,that.url.controller + that.url.disabled,'鍋滅敤鎴愬姛', false, true);
+            }, function () {
+                that.doOperaData(oid,that.url.controller + that.url.disabled,'鍋滅敤鎴愬姛', false, false);
+            });
+        };
+        this.doOperaData = function (oid,url,msg,deleteFlag,cascade) {
+            var that = this;
+            $webUtil.ajax(deleteFlag?'delete':'post',url,{
+                oid:oid,
+                cascade:cascade
+            },function(result){
+                if(result.success){
+                    if($webUtil.isNull(result.msg)){
+                        result.msg = msg;
+                    }
+                    $webUtil.showMsg(msg);
+                    that.refresh(that.currentItemOid);
+                }else{
+                    $webUtil.showErrorMsg(result.msg);
+                }
+            },function(xhr,error){
+                $webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏄洜涓烘湇鍔″櫒琚叧闂紝缃戠粶杩炴帴澶辫触鎴栬�呯▼搴忛敊璇�");
+            },that.backPath);
+        };
+        this.refresh = function(classifyOid,warehouseOid){
+            var that = this;
+            if($webUtil.isNull(classifyOid) && $webUtil.isNull(warehouseOid)){
+                layui.tree.reload("tree_" + that.id);
+                that.currentItemOid = null;
+                that.currentItemAttributes = null;
+            }
+            if($webUtil.isNotNull(classifyOid)){
+                layui.table.reload("table_" + that.id);
+            }
+            if($webUtil.isNotNull(warehouseOid)) {
+                layui.table.reload("detail_table_" + that.id);
+            }
+        };
+        this.getFormItems = function(){
+            var that = this;
+            return [{
+                field: 'id',
+                text: '搴撴埧缂栧彿',
+                required:true
+            }, {
+                field: 'name',
+                text: '搴撴埧鍚嶇О',
+                required:true
+            },{
+                field:'pkWarehouseClassify',
+                text:'鎵�灞炲簱鎴跨被鍒�',
+                type:'refer',
+                required:true,
+                showField:'pkWarehouseClassifyText',
+                referConfig:{
+                    type:'tree',
+                    url: that.url.referClassifyTree,
+                    backPath:that.backPath,
+                    textField:'name',
+                    valueField:'oid',
+                    isMuti:false
+                }
+            }, {
+                field: 'address',
+                text: '搴撴埧鍦板潃'
+            },{
+                field:'hearder',
+                text:'搴撴埧璐熻矗浜�'
+            }, {
+                field: 'tel',
+                text: '鑱旂郴鐢佃瘽'
+            },{
+                field: 'parentWarehouse',
+                text: '涓婄骇搴撴埧',
+                type:'refer',
+                showField:'parentWarehouseText',
+                referConfig:{
+                    type:'tree',
+                    url:that.url.controller + that.url.referWarehouse,
+                    backPath:that.backPath,
+                    textField:'id,name',
+                    valueField:'oid',
+                    extraParams: {
+                        pkWarehouseClassify:that.currentItemOid
+                    },
+                    useFormKey:'pkWarehouseClassify',
+                    isMuti:false
+                }
+            }, {
+                field: 'pkDepartment',
+                text: '绠$悊閮ㄩ棬',
+                type:'refer',
+                showField:'pkDepartmentName',
+                referConfig:{
+                    type:layui.vciAlias.referRegister.departmentRefer
+                }
+            },layui.vciWebComboxStore.getSecretObject(that.controlSecret)];
+        };
+        this.LINKUSER = function() {
+            var that = this;
+            //璁剧疆绠$悊鍛�
+            var table = layui.table;
+            var oid = $webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var sendPerIndex = layer.open({
+                type:1,
+                title:'閫夋嫨绠$悊鍛樻坊鍔犲埌搴撴埧',
+                btn:['纭畾','鍙栨秷'],
+                skin:'layui-layer-lan',
+                content:'<div id="inkperson_'+that.id+'" class="demo-transfer"></div>',
+                area:['500px','610px'],
+                closeBtn:2,
+                shade:true,
+                shadeClose:true,
+                resize:false,
+                yes:function(layero){
+                    var getData = layui.transfer.getData('linkuser_'+that.id);
+                    var userOids = [];
+                    if(getData && getData.length > 0){
+                        for(var i = 0 ; i < getData.length ; i ++){
+                            var value = getData[i]["value"];
+                            if(!value || value == "undefined"){
+                                value = "";
+                            }
+                            userOids.push(value);
+                        }
+                    }
+                    if(userOids.length == 0){
+                        $webUtil.showAutoMsg("璇峰厛閫夋嫨绠$悊鍛樺悗鍐嶇偣鍑汇�愮‘瀹氥�戞寜閽�");
+                        return false;
+                    }
+                    var submitValues = {
+                        f_oid:oid
+                    };
+                    for(var i = 0 ; i < userOids.length ; i ++){
+                        submitValues['t_oid[' + i + ']'] = userOids[i];
+                    }
+                    $webUtil.post(that.url.controller + that.url.linkUser,submitValues,function(result){
+                        if(result.success){
+                            if($webUtil.isNull(result.msg)){
+                                result.msg = "娣诲姞绠$悊鍛樻垚鍔�";
+                            }
+                            $webUtil.showMsg("娣诲姞绠$悊鍛樻垚鍔�");
+                            layer.close(sendPerIndex);
+                            that.refresh(null,oid);
+                        }else{
+                            $webUtil.showErrorMsg(result.msg);
+                        }
+                    },function(xhr,err){
+                        $webUtil.showErrorMsg("鎵ц淇濆瓨绠$悊鍛樼殑鏃跺�欏嚭鐜颁簡閿欒");
+                    },that.backPath);
+                },
+                btn2:function(index,layero){
+                    layer.close(sendPerIndex);
+                },
+                success:function(layero){
+                    //浠庡悗鍙拌幏鍙栧埌鐢ㄦ埛鐨勪俊鎭紝鐒跺悗娣诲姞鍒扮┛姊涓�
+                    var linkedUsers = table.checkStatus("detail_table_" + that.id);
+                    var queryMap = {
+                        limit:-1
+                    };
+                    if(linkedUsers && linkedUsers.data && linkedUsers.data.length >0){
+                        var linkedUserOids = [];
+                        layui.each(linkedUsers.data,function(_index,_item){
+                            linkedUserOids.push("'" + _item.toid + "'");
+                        });
+                        queryMap['conditionMap["oid"]'] = "\\NOTIN(" + linkedUserOids.join(",") + ")";
+                    }
+                    $webUtil.get( that.url.unLinkUser,queryMap,function(result){//鑾峰彇绌挎妗嗙殑绠$悊鍛�
+                        if(result.success){
+                            layui.transfer.render({
+                                elem: '#inkperson_'+that.id
+                                ,data: result.data
+                                ,width:200
+                                ,height:500
+                                ,id:'linkuser_'+that.id//绱㈠紩
+                                ,parseData: function(res){
+                                    return {
+                                        "value": res.oid //鏁版嵁鍊�
+                                        ,"title": (res.id + " " + res.name)//鏁版嵁鏍囬
+                                    }
+                                }
+                                ,title: ['鏈�夌鐞嗗憳', '宸查�夌鐞嗗憳']
+                                ,showSearch: true
+                            })
+                        }else{
+                            $webUtil.showErrorMsg(result.msg);
+                        }
+                    },function(xhr,err){
+                        $webUtil.showErrorMsg("鎵ц淇濆瓨绠$悊鍛樼殑鏃跺�欏嚭鐜颁簡閿欒");
+                    },that.backPath,true);
+
+                }
+            });
+        };
+        this.REMOVEUSER = function () {
+            var that = this;
+            var oid = $webUtil.getOidFromGrid("detail_table_" +that.id,true,false);
+            if(!oid){
+                return false;
+            }
+            var selectData = layui.table.checkStatus("detail_table_" +that.id);
+            that.doRemoveLinkPerson(selectData.data);
+        };
+        this.doRemoveLinkPerson = function(records){
+            var that = this;
+            //鎵ц绉婚櫎锛屽拰鏈�鍚庝竴鍒楁樉绀虹殑涓�鏍�
+            if(!records){
+                return false;
+            }
+            if(!$webUtil.isArray(records)){
+                records = [records];
+            }
+            var oids = "";
+            layui.each(records,function(_index,_item){
+                oids += _item.oid + ",";
+            });
+            oids = layui.util.removeComma(oids);
+            $webUtil.showConfirmMsg("鎮ㄦ槸鍚︾‘瀹氱Щ闄よ繖" + records.length + "涓鐞嗗憳锛�",function(){
+                $webUtil.deleteRequest(that.url.controller +that.url.removeLinkUser,{warehouseAdminOids:oids},function(result){
+                    if(result.success){
+                        if($webUtil.isNull(result.msg)){
+                            result.msg = "绉婚櫎鎴愬姛";
+                        }
+                        $webUtil.showMsg(result.msg);
+                        that.refreshUser();
+                    }else{
+                        $webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,error){
+                    $webUtil.showErrorMsg("绉婚櫎绠$悊鍛樺嚭閿欙紝鍙兘鏄湇鍔″櫒鏃犳硶杩炴帴")
+                },that.backPath);
+            });
+        };
+        this.refreshUser = function(){
+            var that = this;
+            layui.table.reload("detail_table_" + that.id);
+        };
+    };
+    var c = new Class();
+    exports(c.MODELNAME,c);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdWarehouseClassify.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdWarehouseClassify.js
new file mode 100644
index 0000000..7685bce
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/basedoc/BdWarehouseClassify.js
@@ -0,0 +1,323 @@
+/**
+ * 搴撴埧绫诲瀷
+ * 鍙互澧炲姞涓婁笅绾�
+ * @author weidy@2019-11-26
+ */
+layui.define(['layer','element','form','table','util'],function(exports){
+    var Class = function(){
+        this.MODELNAME = "platform/basedoc/BdWarehouseClassify";
+        this.moduleKey = "BdWarehouseClassify";
+        this.id='BdWarehouseClassify';
+        this.sourceData={};
+        this.columns = [];
+        this.backPath =  configData.compatibility?path:configData.frameworkPath;//榛樿娴佺▼鍜岄」鐩殑璺緞鏄竴鏍风殑
+        this.url = {
+            controller: '/warehouseClassifyController/',
+            storeType:'getAllWarehouseClassify',
+            add:'addWarehouseClassify',
+            edit:'editWarehouseClassify',
+            del:'delWarehouseClassify',
+            checkIsDelete:'checkIsCanDelete',
+            star:'enableWarehouseClassify',
+            stop:'disableWarehouseClassify',
+            referTree:'referTree'
+        };
+        this.buttonIconMap = {
+            SEARCH:'layui-icon-refresh-2',
+            SENIORSEARCH:'layui-icon-query',
+            ADD:'layui-icon-add-1',
+            EDIT:'layui-icon-edit',
+            DELETE:'layui-icon-delete'
+        };
+        this.getContent=function(){
+            return this.getTableHtml() ;
+        };
+        this.init=function(){
+            var that = this;
+            $webUtil.copyConfig(that,that.moduleKey);
+            var buttonIdPrefix = that.id;
+            $webUtil.createButtonHtmlEx(that.sourceData,that.buttonIconMap,$('[layui-filter="toolbar_' + that.id + '"]'),that.id,[],[],function(buttons,hasViewRight,hasQueryRight) {
+                //鍒濆鍖栨爲鐣岄潰
+                var filter= that.id;
+                var scrollHeight =  window.innerHeight;
+                var treeUL = $('[layui-filter="tree_' + filter + '"]');
+                var treeHeight = scrollHeight - 200;
+                treeUL.parent().height(treeHeight);
+                layui.tree.init("tree_" + filter,$('[layui-filter="tree_' + filter + '"]'),{
+                    url:that.url.controller + that.url.storeType,
+                    backPath:that.backPath,
+                    showSearch:true,
+                    loadType:layui.tree.loadType.all,
+                    treeFilter:that.id,
+                    treeName:'storeType',
+                    click:function(item,elem,options){
+                        that.currentItemOid = item.oid;
+                        that.currentItemAttributes = item.attributes;
+                        that.showItemInfo(item.attributes,filter);
+                    }
+                });
+                //鍒濆鍖杅orm
+
+                layui.form.addItems("form_" +filter,that.getFormItems(true),function(){
+
+                },null,{
+                    defaultColumnOneRow:2,defaultLabelWidth:120
+                });
+                $webUtil.bindDefultButtonLisenter(that,that.id);
+            });
+        };
+        this.getTableHtml = function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id, '" class="layui-btn-container" vci-permission-config="type:button;default-premission:true">',//涓诲垪琛ㄧ殑鎸夐挳
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_'+ that.id+ '_ADD"><i class="layui-icon layui-icon-add-1"></i>澧炲姞</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_'+ that.id+ '_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_'+ that.id+ '_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_'+ that.id+ '_STAR"><i class="layui-icon layui-icon-ok-circle"></i>鍚敤</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_'+ that.id+ '_STOP"><i class="layui-icon layui-icon-404"></i>鍋滅敤</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_'+ that.id+ '_refresh" vci-premisson="false"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>',
+                '<div class="layui-layout" style="display:block;">',
+                '<div style="width:300px;float: left;background-color:#ffffff">',
+                '<label class="layui-icon layui-icon-tree" style="line-height: 20px;color:red;font-size:20px;">搴撴埧绫诲瀷</label>',
+                '<ul layui-filter="tree_',that.id,'" style="border:1px solid #6886ff;overflow-x:auto"><ul>',
+                '</div>',
+                '<div class="layui-layout-border" style="display:block;position:fixed;float:right;margin-top:0px;margin-left:305px;">',
+                '<div class="layui-center">',
+                '<form class="layui-form" lay-filter="form_',that.id,'"></form>',
+                '</div>',
+                '</div>',
+                '</div>'];
+            return html.join("");
+        };
+        this.showItemInfo=function(attributes,filter){
+            var that = this;
+            if(attributes){
+                var values = attributes;
+                try{
+                    var form = layui.form;
+                    form.clear("form_" + filter);
+                    if(values.lcStatus == 'Enabled'){
+                        values.lcStatusText = "鍚敤";
+                    }else{
+                        values.lcStatusText = "鍋滅敤";
+                    }
+                    form.setValues(values,"form_" + filter);//涓嶉渶瑕佽浆鎹㈠璞★紝鍥犱负attributes宸茬粡鏄璞℃牸寮忎簡
+                }catch (e){
+                    $webUtil.showDebugMsg(e);
+                }
+            }
+        };
+        this.getFormItems = function(readOnly){
+            var that = this;
+            var formItems = [{
+                type:'text',
+                name:'id',
+                readOnly:readOnly,
+                required:true,
+                verify:'letter',
+                text:'鍐呴儴鏍囪瘑(鍞竴)'
+            },{
+                type:'text',
+                name:'name',
+                readOnly:readOnly,
+                required:true,
+                text:'鍒嗙被鍚嶇О'
+            },{
+                type:'combox',
+                name:'warehouseType',
+                text:'搴撴埧鐗╁搧绫诲埆',
+                required:true,
+                comboxKey:'invMaterialType'
+                // data:[{key:'1',value:'鐗╂枡/鏉愭枡/鎴愬搧/鏍囧噯浠�'},{key:'2',value:'宸ュ垁鍣ㄩ噺/璁惧/宸ヨ'}]
+            },{
+                type:'text',
+                name:'lcStatusText',
+                readOnly:true,
+                hidden:!readOnly,
+                text:'鐘舵��'
+            },{
+                type:'refer',
+                text:'涓婄骇鍒嗙被',
+                hidden:readOnly,
+                name:'parentWarehouseClassify',
+                showField:'parantWarehouseClassifyName',
+                referConfig:{
+                    type:'tree',
+                    url:that.url.controller + that.url.referTree,
+                    backPath:that.backPath,
+                    textField:'name',
+                    valueField:'oid',
+                    isMuti:false
+                }
+            }];
+            return formItems;
+        };
+        this.ADD  = function(){
+            var that = this;
+            that.dealData(true);
+        };
+        this.EDIT  = function(){
+            var that = this;
+            that.dealData(false)
+        };
+        this.DEL = function(){
+            var that = this;
+            that.operaData(that.url.controller + that.url.del,'鍒犻櫎鎴愬姛',true);
+        };
+        this.STAR = function(){
+            var that = this;
+            that.operaData(that.url.controller + that.url.star,'鍚敤鎴愬姛');
+        };
+        this.STOP = function(){
+            var that = this;
+            that.operaData(that.url.controller + that.url.stop,'鍋滅敤鎴愬姛');
+        };
+        this.operaData = function(url,msg,deleteFlag){
+            var that = this;
+            if($webUtil.isNull(that.currentItemOid)){
+                $webUtil.showErrorMsg("璇蜂粠搴撴埧绫诲瀷鏍戜笂閫夋嫨鑺傜偣");
+                return;
+            }
+            if(deleteFlag){
+                $webUtil.showConfirmMsg("鎮ㄧ‘瀹氳鍒犻櫎杩欎釜搴撴埧鍩烘湰鍒嗙被鍚楋紝濡傛灉搴撴埧涓凡缁忎娇鐢ㄤ簡杩欎釜鍒嗙被灏嗕笉鑳借鍒犻櫎.濡傛灉瀛樺湪涓嬬骇鑺傜偣浼氫竴璧峰垹闄�",function () {
+                    var submitValue= {
+                        oid:that.currentItemOid,
+                        ts:that.currentItemAttributes.ts
+                    };
+                    $webUtil.post(that.url.controller + that.url.checkIsDelete,submitValue,function(result){
+                        if(result.success){
+                            if('true' == result.obj  || result.obj == true){
+                                $webUtil.showConfirmMsg("褰撳墠搴撴埧鍩烘湰鍒嗙被瀛樺湪涓嬬骇鍒嗙被锛屼綘瑕佽繛鍚屼笅绾у垎绫讳竴璧峰垹闄ゅ悧?",function () {
+                                    that.doDelete(submitValue);
+                                });
+                            }else{
+                                that.doDelete(submitValue);
+                            }
+                        }else{
+                            $webUtil.showErrorMsg(result.msg);
+                        }
+                    },function(xhr,error){
+                        $webUtil.showErrorMsg("鍦ㄥ垽鏂槸鍚﹀彲浠ュ垹闄ょ殑鏃跺�欏嚭鐜颁簡閿欒,鍙兘鏄摼鎺ユ湇鍔″嚭鐜颁簡閿欒");
+                    },that.backPath);
+                });
+            }else {
+                $webUtil.showConfirmMsg("鏄惁瀛愯妭鐐逛篃涓�鍚屽鐞�", function () {
+                    that.doOperaData(url, msg, deleteFlag, true);
+                }, function () {
+                    that.doOperaData(url, msg, deleteFlag, false);
+                });
+            }
+        };
+        this.doDelete = function(submitValues){
+            var that = this;
+            $webUtil.deleteRequest(that.url.controller + that.url.del,submitValues,function(result){
+                if(result.success){
+                    $webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                    that.refresh();
+                }else{
+                    $webUtil.showErrorMsg(result.msg);
+                }
+            },function (xhr,err) {
+                $webUtil.showErrorMsg("鎵ц鍒犻櫎鐨勬椂鍊欏嚭閿欎簡閿欒锛屽彲鑳芥槸鏈嶅姟鍣ㄦ殏鏃舵棤娉曡闂�");
+            },that.backPath);
+        };
+        this.doOperaData = function (url,msg,deleteFlag,cascade) {
+            var that = this;
+            $webUtil.ajax(deleteFlag?'delete':'post',url,{
+                oid:that.currentItemOid,
+                cascade:cascade
+            },function(result){
+                if(result.success){
+                    $webUtil.showMsg(msg);
+
+                    that.refresh();
+                }else{
+                    $webUtil.showErrorMsg(result.msg);
+                }
+            },function(xhr,error){
+                $webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏄洜涓烘湇鍔″櫒琚叧闂紝缃戠粶杩炴帴澶辫触鎴栬�呯▼搴忛敊璇�");
+            },that.backPath);
+        };
+        this.dealData = function(add){
+            var that = this;
+            if(!add && $webUtil.isNull(that.currentItemOid)){
+                $webUtil.showErrorMsg("璇蜂粠搴撴埧绫诲瀷(鍒嗙被)鏍戜笂閫夋嫨鑺傜偣");
+                return;
+            }
+            var form = layui.form;
+            var filter ="addform_" + that.id;
+            var addstore = layer.open({
+                type:1,
+                title:add?'娣诲姞搴撴埧鍒嗙被':'淇敼搴撴埧鍒嗙被',
+                btn:['淇濆瓨','鍙栨秷'],
+                skin:'layui-layer-lan',
+                content:'<form id="' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                area:['850px','350px'],
+                closeBtn:2,
+                shade:true,
+                shadeClose:true,
+                resize:true,
+                success:function(layero) {
+                    form.addItems(filter,that.getFormItems(false),
+                        function () {
+                            if(!add){
+                                form.setValues(that.currentItemAttributes,filter);
+                            }else{
+                                if($webUtil.isNotNull(that.currentItemOid)) {
+                                    form.setValues({
+                                        "parentWarehouseClassify": that.currentItemOid,
+                                        "parantWarehouseClassifyName": that.currentItemAttributes.name,
+                                        "warehouseType":that.currentItemAttributes.warehouseType
+                                    }, filter);
+                                }
+                            }
+                        }, {}, {defaultColumnOneRow: 2});
+                },
+                yes:function(layero){
+                    var values = form.getValues(filter);
+                    var reg = new RegExp("^[A-Za-z]+$");
+                    if (!reg.test(values.id)){
+                        $webUtil.showErrorMsg("鍐呭鏍囪瘑搴斾负绾嫳鏂�");
+                        return false;
+                    }
+                    if(!add) {
+                        values.oid = that.currentItemOid;
+                        values.ts = that.currentItemAttributes.ts
+                    }
+                    var url = that.url.controller + (add?that.url.add:that.url.edit);
+                    $webUtil.ajax(add?"post":"put",url,values,function(result){
+                        if(result.success){
+                            var msg = add?"娣诲姞鎴愬姛":'淇敼鎴愬姛';
+                            $webUtil.showMsgFromResult(result,msg);
+                            layer.close(addstore);
+                            that.refresh();
+                        }else{
+                            $webUtil.showErrorMsg(result.msg);
+                        }
+                    },function(xhr,err){
+                        $webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏄洜涓烘湇鍔¤鍏抽棴锛屾垨鑰呯▼搴忕殑闂");
+                    },that.backPath)
+                },
+                btn2:function(layero){
+                    layer.close(addstore);
+                    that.refresh();
+                }
+            });
+        };
+        this.refresh = function(parentNodeOid){
+            //鍒锋柊
+            var that = this;
+            var tree = layui.tree;
+            if(parentNodeOid && parentNodeOid !='refresh'){
+                tree.reloadNode("tree_" + that.id,parentNodeOid);
+            }else {
+                that.selectTreeOid = null;
+                that.selectTreeAttribute = null;
+                tree.reload("tree_" + that.id);
+            }
+        }
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/developer/logs/VciLogMonitor.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/developer/logs/VciLogMonitor.js
new file mode 100644
index 0000000..0a34b46
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/developer/logs/VciLogMonitor.js
@@ -0,0 +1,101 @@
+/**
+ * 鏃ュ織鐩戞帶鐨�
+ * @author weidy
+ * @date 2020-12-06
+ */
+layui.define(['layer','element','form' ],function(exports){
+    var Class = function(){
+        this.MODELNAME = "platform/developer/logs/VciLogMonitor";
+        this.moduleKey = "VciLogMonitor";
+        this.id = "VciLogMonitor";
+        this.backPath =  configData.compatibility?path:configData.adminServicePath;
+        this.getContent=function(){
+            var that = this;
+            var html = "";
+            html = [
+                '<div class="layui-layout" style="display:block;overflow-y: hidden">',
+                    '<div class="layui-layout-border" style="display:block;margin-top:0px; " id="border_',that.id,'">',
+                        '<div class="layui-center" style="overflow-y:auto;">',
+                            '<div class="layui-tab" >',
+                                '<ul class="layui-tab-title" lay-allowClose="false">',
+                                    '<li class="layui-this">鏃ュ織鏂囦欢鏌ョ湅(鏈�澶氫竴涓囪)</li>',
+                                    // '<li>鏃ュ織閾捐矾杩借釜</li>',
+                                '</ul>',
+                                '<ul class="layui-tab-content">',
+                                    '<li class="layui-tab-item layui-show">' ,
+                                        '<form id="form_',that.id, '" lay-filter="' ,that.id,'" class="layui-form" style="margin-top:5px" ></form>',
+                                        '<button class="layui-btn layui-btn-sm" id="',that.id,'_query"><i class="layui-icon layui-icon-search"></i>鏌ョ湅鏃ュ織鍐呭</button>',
+                                        '<button class="layui-btn layui-btn-sm" id="',that.id,'_downloadfile"><i class="layui-icon layui-icon-search"></i>涓嬭浇鏃ュ織鏂囦欢</button>',
+                                        '<div style="display:block;width:100%;background-color:#ffedee" id="logContent_',that.id,'"></div>',
+                                    '</li>',
+                                    '<li class="layui-tab-item">',
+                                        '<input class="layui-btn layui-btn-sm layui-btn-primary" type="text" id="TRACEID',that.id,'" placeholder="璇疯緭鍏ユ棩蹇楅摼璺殑鍊煎悗鏌ヨ" style="width: 260px">',
+                                        '<div style="display:block;margin-top:30px;" id="traceIdContent_',that.id,'"></div>',
+                                    '</li>',
+                                '</ul>',
+                            '</div>',
+                        '</div>',
+                    '</div>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.init = function(){
+            var that = this;
+            $webUtil.copyConfig(that,that.moduleKey);
+            var form = layui.form;
+            //娣诲姞琛ㄥ崟
+            var formItems= [{
+                type:'combox',
+                name:'serviceId',
+                text:'閫夋嫨鏈嶅姟鍚嶇О',
+                url:"/vciServiceController/comboxService",
+                comboxKey:'logService'
+            },{
+                type:'combox',
+                name:'logLevel',
+                text:'鏃ュ織绛夌骇',
+                data:[{
+                    key:"error",
+                    value:"閿欒"
+                },{
+                    key:"info",
+                    value:"淇℃伅"
+                },{
+                    key:"warn",
+                    value:"璀﹀憡"
+                },{
+                    key:"all",
+                    value:"鍏ㄩ儴"
+                }],
+                comboxKey:'logLevel'
+            }];
+            form.addItems(that.id,formItems,
+                function(){
+                },{},{defaultColumnOneRow:2,inputWidth:200});
+            var height = window.innerHeight;
+            var logContent = $("#logContent_" +that.id);
+            logContent.height(height-300);
+            $("#"+that.id+"_query").unbind('click').click(function (e){
+                var values = form.getValues(that.id);
+                $webUtil.get("/vciServiceController/getLogContent",values,function (result){
+                    if(result.success){
+                        logContent.html(result.obj);
+                    }else{
+                        logContent.html(result.msg);
+                    }
+                },function (error,xhr){
+                    $webUtil.showErrorMsg("鏈嶅姟閾炬帴涓嶄笂");
+                },that.backPath);
+                layui.stope(e);
+            });
+            $("#"+that.id+"_downloadfile").unbind('click').click(function (e){
+                var values = form.getValues(that.id);
+                $webUtil.fileDownload(that.backPath + "/vciServiceController/downloadLogFile?serviceId=" + values['serviceId'] + "&logLevel=" + values['logLevel']);
+                layui.stope(e);
+            });
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/fileManage/VciFileDocClassify.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/fileManage/VciFileDocClassify.js
new file mode 100644
index 0000000..72d8e1f
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/fileManage/VciFileDocClassify.js
@@ -0,0 +1,266 @@
+/**
+ * 鏂囨。鐨勭被鍨嬮〉闈�
+ * @author weidy
+ * @date 2020-08-12
+ */
+layui.define(['layer','element','form','table','dynamicCondition' ],function(exports){
+        var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "platform/fileManage/VciFileDocClassify";
+        this.moduleKey = "VciFileDocClassify";
+        this.backPath =  configData.compatibility?path:configData.fileServicePath;
+        this.url = {
+            controller:'vciFileDocClassifyController/',
+            dataGrid:'gridFileDocClassifyGet',
+            addSave:'addSave',
+            editSave:'editSave',
+            deleteUrl:'deleteData',
+            getObjectByOid:'getObjectByOid'
+        };
+        this.getContent=function(){
+            var that = this;
+            var html = "";
+            html = [
+                '<div class="layui-layout" style="display:block;overflow-y: hidden">',
+                    '<div class="layui-layout-border" style="display:block;margin-top:0px; " id="border_',that.id,'">',
+                        '<div class="layui-center" style="overflow-y:auto;">',
+                            that.getToolbarHtml(),
+                            '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                            '<div id="toolbar_column_',that.id ,'" style="display:none;"></div>',
+                        '</div>',
+                    '</div>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.createSearchHtml({id:"缂栧彿",name:"鍚嶇О"} ,$("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+        };
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            that.initMainTable();
+            that.createSearchHtml();
+            that.advancedQuery();
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var tableWidth = $("#border_" + that.id).width();
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                width:tableWidth,
+                // selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'EDIT'){
+                                that.addOrEdit(false,data.oid);
+                            }
+                        });
+                    }else{
+                        if(total>0) {
+                            table.selectRecord('table_' + that.id, {index:0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                }
+            };
+            if(parentFieldName){
+                options.treeConfig = {
+                    treepid:parentFieldName,
+                    treeid:'id',
+                    showField:'name'
+                };
+            }
+            table.render(options);
+            document.getElementById("toolbar_column_" + that.id).innerHTML =
+                '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>';
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),
+                    {
+                        title: '缂栧彿',
+                        field: 'id',
+                        width: 150
+                    },                    {
+                        title: '鍚嶇О',
+                        field: 'name',
+                        width: 150
+                    },                    {
+                        title: '鎻忚堪',
+                        field: 'description',
+                        width: 350
+                    }        ];
+            }
+        };
+
+        this.getFormItems = function(onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [
+                {
+                    field: 'id',
+                    title: '缂栧彿',
+                    required: true,
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'name',
+                    title: '鍚嶇О',
+                    required: true,
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'description',
+                    title: '鎻忚堪',
+                    type: 'text',
+                    readOnly:onlyShow
+                }             ];
+        };
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            that.addOrEdit(false,oid);
+        };
+        this.addOrEdit = function(add,oid) {
+            var that = this;
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var addSaveIndex =webUtil.dialog({
+                title:add?'娣诲姞鏂囨。鐨勭被鍨�':'淇敼鏂囨。鐨勭被鍨�',
+                btn:['淇濆瓨','鍙栨秷'],
+                skin:'layui-layer-lan',
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                area:['900px','360px'],
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getFormItems(false),
+                        function () {
+                            if(!add){
+                                form.load(filter,{
+                                    backPath:that.backPath,
+                                    url:that.url.controller + that.url.getObjectByOid,
+                                    method:'get',
+                                    params:{
+                                        oid:oid
+                                    }
+                                });
+                            }else{
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+                        }, {}, {defaultColumnOneRow: 2});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        var url = that.url.controller + (add?that.url.addSave:that.url.editSave);
+                        webUtil.ajax(add?'post':'put',url,values,function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts= webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+        this.refresh = function () {
+            var that = this;
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+
+        this.ADVQUERY = function(){//楂樼骇鏌ヨ
+            var that = this;
+            that.serinorQueryInstance.open();
+        };
+        this.advancedQuery = function(){
+            var that = this;
+            var dynamicCondition = layui.dynamicCondition;
+
+            var smUserTable = JSON.parse(JSON.stringify(that.columns));
+            $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar'+ that.id+'" class="layui-inline"></div>');
+            that.serinorQueryInstance = dynamicCondition.create({
+                fields : smUserTable//鏌ヨ瀛楁
+                ,tableId:"table_"+that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                ,type:"complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                // ,conditionTextId:"#toolbar"+that.id//楂樼骇鏌ヨ 鎸夐挳鎵�鍦ㄧ殑div
+                // ,popupShowQueryBtn: true//鏄剧ず楂樼骇鏌ヨ鎸夐挳
+                ,queryCallBack:function(requestData){//鏌ヨ涔嬪悗鐨刢allback
+                    //console.log(JSON.stringify(requestData))
+                }
+            });
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/fileManage/VciFileList.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/fileManage/VciFileList.js
new file mode 100644
index 0000000..b7bbabf
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/fileManage/VciFileList.js
@@ -0,0 +1,329 @@
+/**
+ * 鏂囨。鐨勫垪琛�
+ * @author xurc
+ * @date 2020-10-23
+ */
+layui.define(['layer','element','form','table','upload','dynamicCondition' ],function(exports){
+        var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "platform/fileManage/VciFileList";
+        this.moduleKey = "VciFileList";
+        this.backPath =  configData.compatibility?path:configData.fileServicePath;
+        this.url = {
+            // controller:'vciFileDocClassifyController/',
+            controller:'vciFileQueryController/',
+            dataGrid:'gridFiles',
+    		upload:'vciFileUploadController/uploadFile',//涓婁紶鏂囦欢
+    		reviseByFileOid:'vciFileUploadController/uploadFile',//淇敼鏂囦欢
+            deleteUrl:'vciFileDownloadController/deleteFile',
+    		downloadByFileOid:'vciFileDownloadController/downloadByFileOid',//涓嬭浇鏂囦欢
+        };
+        this.getContent=function(){
+            var that = this;
+            var html = "";
+            html = [
+                '<div class="layui-layout" style="display:block;overflow-y: hidden">',
+                    '<div class="layui-layout-border" style="display:block;margin-top:0px; " id="border_',that.id,'">',
+                        '<div class="layui-center" style="overflow-y:auto;">',
+                            that.getToolbarHtml(),
+                            '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                            '<div id="toolbar_column_',that.id ,'" style="display:none;"></div>',
+                        '</div>',
+                    '</div>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_UPLOAD"><i class="layui-icon layui-icon-upload"></i>涓婁紶</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DOWNLOADFILE"><i class="layui-icon layui-icon-export"></i>涓嬭浇</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.createSearchHtml({id:"缂栧彿",name:"鍚嶇О"} ,$("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+        };
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            that.initMainTable();
+            that.createSearchHtml();
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var tableWidth = $("#border_" + that.id).width();
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                extraParams: {
+                    ownbizOid: 'share',
+                    ownbizBtm: 'share'
+                  },
+                width:tableWidth,
+                cols: [that.columns],
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                    }else{
+                        if(total>0) {
+                            table.selectRecord('table_' + that.id, {index:0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                }
+            };
+            if(parentFieldName){
+                options.treeConfig = {
+                    treepid:parentFieldName,
+                    treeid:'id',
+                    showField:'name'
+                };
+            }
+            table.render(options);
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),
+                    {
+                        field:'name',
+                        title:'鏂囦欢鍚嶇О',
+                        width:250
+                    },{
+                        field:'fileSize',
+                        title:'澶у皬',
+                        width:80,
+                        templet:function(d){
+                            if(!d.fileSize || d.fileSize == null || d.fileSize*1 == 0 || isNaN(d.fileSize*1) ){
+                                return "鏈煡澶у皬";
+                            }else{
+                                //鍘熷澶у皬鏄疊
+                                var filesize = d.fileSize*1;
+                                if(filesize>1024*1024*1024*1024){
+                                    return parseInt(filesize/(1024*1024*1024*1024)) + "TB";
+                                }else if(filesize> 1024*1024*1024){
+                                    return parseInt(filesize/(1024*1024*1024)) + "GB";
+                                }else if(filesize> 1024*1024){
+                                    return parseInt(filesize/(1024*1024)) + "MB";
+                                }else if(filesize> 1024){
+                                    return parseInt(filesize/1024) + "KB";
+                                }else {
+                                    return filesize + "B";
+                                }
+                            }
+                        }
+                    },{
+                        field:'secretGradeText',
+                        title:'瀵嗙骇',
+                        width:60
+                    },{
+                        field:'fileDocClassifyName',
+                        title:'鏂囨。绫诲瀷',
+                        width:130
+                    },{
+                        field:'creator',
+                        title:'涓婁紶浜�/鏃堕棿',
+                        width:210,
+                        templet:function(d){
+                            return d.creator + "(" + $webUtil.formateDateTimeNoSecond(d.createTime) + ")";
+                        }
+                    },{
+                        field:'downloadCount',
+                        title:'涓嬭浇鏁伴噺',
+                        width:90
+                    }];
+            }
+        };
+
+        this.getFormItems = function(onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [
+                {
+                    field:'name',
+                    title:'鏂囦欢鍚嶇О',
+                    required: true,
+                    type: 'text',
+                    readOnly:onlyShow
+                },{
+                    field: 'secretGrade',
+                    title: '瀵嗙骇',
+                    required: true,
+                    readOnly:onlyShow,
+                    type:'combox',
+                    data:[{"key":"10","value":"鍐呴儴"},{"key":"20","value":"涓�鑸�"},{"key":"30","value":"閲嶈"}]
+                }];
+        };
+
+        this.UPLOAD = function(){
+            var that = this;
+            that.uploadOrEdit(true);
+        };
+
+        this.EDIT = function(){
+            var that = this;
+            var selectData  = layui.table.checkStatus("table_" + that.id).data[0];
+            if(selectData == undefined) {
+                webUtil.showErrorMsg('璇烽�夋嫨涓�鏉℃暟鎹�!');
+                return false;
+            }
+            that.uploadOrEdit(false,selectData.oid);
+        };
+
+        this.uploadOrEdit = function(add,fileoid){
+            var that = this;
+            var form = layui.form;
+            var filter ='upload_form'+that.id;
+            var uploadIndex = layer.open({
+                type:1,
+                title: add ? '涓婁紶鏂囦欢(鏈�澶�3G)' : '淇敼鏂囦欢(鏈�澶�3G)',
+                skin:'layui-layer-lan',
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:55px" enctype="multipart/form-data"></form>',
+                area:['350px','200px'],
+                closeBtn:2,
+                shade:true,
+                shadeClose:true,
+                resize: false,
+                success:function(layero){
+                    form.addItems(filter,[{
+                        field:'ownBtmname',
+                        title:'ownBtmname',
+                        hidden:true
+                    },{
+                        field:'ownbizOid',
+                        title:'ownbizOid',
+                        hidden:true
+                    },{
+                        field:'fileDocClassify',
+                        title:'鏂囦欢绫诲瀷',
+                        hidden:true
+                    },{
+                        field:'fileDocClassifyName',
+                        title:'鏂囦欢绫诲瀷鍚嶇О',
+                        hidden:true
+                    }],
+                    function(){
+                       form.setValues({
+                            ownBtmname: "share",
+                            ownbizOid: "share",
+                            fileDocClassify: "ADMIN_SHARE",
+                            fileDocClassifyName: "绠$悊鍛樺叡浜枃浠�"
+                        },filter);
+                        if ($("#button_" + filter)) {
+                            $("#button_" + filter).remove();
+                        }
+                        if($("#button_"+filter).length <= 0) {
+                            $("#form_" + filter).append('<button type="button" class="layui-btn" id="button_' + filter + '" style="margin-left:100px"><i class="layui-icon">&#xe67c;</i>閫夋嫨鏂囦欢鍚庤嚜鍔ㄤ笂浼�</button>');
+                        }
+                        var upload = layui.upload;
+                        //鎵ц瀹炰緥
+                        var uploadForm = upload.render({
+                            elem: '#button_' + filter //缁戝畾鍏冪礌
+                            ,accept:'file'
+                            ,auto:true
+                            ,url: that.backPath + that.url.upload//涓婁紶鎺ュ彛
+                            ,before:function(obj){
+                                if(form.validata(filter)){
+                                    var values = form.getValues(filter);
+                                    if(!add) {
+                                        values.fileOid = fileoid;
+                                        values.oid = fileoid;
+                                        values.updateFileFlag = true;
+                                    }
+                                    obj.setData(values);
+                                    $webUtil.showProgress("鏂囦欢涓婁紶涓�︹��");
+                                    return true;
+                                }else{
+                                    $webUtil.showErrorMsg("璇峰厛杈撳叆鍐呭鍚庡啀閫夋嫨鏂囦欢");
+                                    return false;
+                                }
+                            }  
+                            ,done: function(result){
+                                if(result.success){
+                                   layer.close(uploadIndex);
+                                    $webUtil.showMsg(add ? "鏂囦欢涓婁紶鎴愬姛" : "鏂囦欢淇敼鎴愬姛");
+                                    that.refresh();
+                                    $webUtil.closeProgress();
+                                }else{
+                                    $webUtil.showErrorMsg(result.msg);
+                                    $webUtil.closeProgress();
+                                }
+                            }
+                            ,error: function(){
+                              //璇锋眰寮傚父鍥炶皟
+                                $webUtil.showErrorMsg("涓婁紶鏂囦欢鍑虹幇浜嗗紓甯�");
+                            }
+                        });
+                    }
+                    ,{},{
+                        defaultColumnOneRow:1
+                    });
+                }
+            });
+        };
+
+        this.DEL = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts= webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                webUtil.deleteRequest(that.url.deleteUrl,{fileOids:oid,ts:ts},function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+
+        this.DOWNLOADFILE = function(thisButtonPoint){
+        	//涓嬭浇鎸夐挳
+            var that = this;
+            var selectData  = layui.table.checkStatus("table_" + that.id).data[0];
+            if(selectData == undefined) {
+                webUtil.showErrorMsg('璇烽�夋嫨鏁版嵁!');
+                return false;
+            }
+            that.downloadFileByOid(selectData.oid);
+        };
+
+        this.downloadFileByOid =function(oid){
+            var that = this;
+            //涓嬭浇鏂囦欢
+            var iframeId = MD5(oid + $webUtil.getSystemVar($webUtil.systemValueKey.userOid));
+            $webUtil.fileDownload(that.backPath + that.url.downloadByFileOid + "?fileOid=" + oid +"&downloadUUID=" + iframeId);
+        };
+
+        this.refresh = function () {
+            var that = this;
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/fileManage/VciFileStore.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/fileManage/VciFileStore.js
new file mode 100644
index 0000000..603a1f6
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/fileManage/VciFileStore.js
@@ -0,0 +1,495 @@
+/**
+ * 鏂囦粨绠$悊椤甸潰
+ * @author weidy
+ * @date 2020-08-12
+ */
+layui.define(['layer','element','form','table','echarts','dynamicCondition','echarts' ],function(exports){
+        var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "platform/fileManage/VciFileStore";
+        this.moduleKey = "VciFileVolume";
+        this.backPath =  configData.compatibility?path:configData.fileServicePath;
+        this.url = {
+            controller:'vciFileVolumeController/',
+            dataGrid:'gridVciFileVolume',
+            addSave:'addSave',
+            editSave:'editSave',
+            deleteUrl:'deleteData',
+            enableData: 'enableData',
+            disableData: 'disableData',
+            getObjectByOid:'getObjectByOid'
+        };
+        this.getContent=function(){
+            var that = this;
+            var html = "";
+            html = [
+                '<div class="layui-layout" style="display:block;overflow-y: hidden">',
+                    '<div class="layui-layout-border" style="display:block;margin-top:0px; " id="border_',that.id,'">',
+                        '<div class="layui-center" style="overflow-y:auto;">',
+                            that.getToolbarHtml(),
+                            '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                            '<div id="toolbar_column_',that.id ,'" style="display:none;"></div>',
+                        '</div>',
+                    '</div>',
+                    '<div class="layui-card">',
+                        '<div class="layui-card-header"></div>',
+                        '<div class="layui-card-body">',
+                            '<div id="EchartZhu" style="width: 650px;height: 500px;"> </div>',     
+                        '</div>',
+                    '</div>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ENABLE"><i class="layui-icon layui-icon-ok-circle"></i>鍚敤</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DISABLE"><i class="layui-icon layui-icon-404"></i>鍋滅敤</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.createSearchHtml({id:"缂栧彿",name:"鍚嶇О"} ,$("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+        };
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            that.initMainTable();
+            that.createSearchHtml();
+            that.advancedQuery();
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var tableWidth = $("#border_" + that.id).width();
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                width:tableWidth,
+                // selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'EDIT'){
+                                that.addOrEdit(false,data.oid);
+                            }
+                        });
+                    }else{
+                        if(total>0) {
+                            table.selectRecord('table_' + that.id, {index:0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                },
+                rowClick:function(thisTableFilter,record){
+                    var currentVolume = 0;
+                    if(record.currentVolume && record.currentVolume*1 > 0){
+                        //鍘熷澶у皬鏄疊
+                        var filesize = record.currentVolume*1;
+                        if(filesize>1024*1024*1024*1024){
+                            currentVolume = parseInt(filesize/(1024*1024*1024*1024));
+                        }else if(filesize> 1024*1024*1024){
+                            currentVolume = parseInt(filesize/(1024*1024*1024));
+                        }else if(filesize> 1024*1024){
+                            currentVolume = parseInt(filesize/(1024*1024));
+                        }else if(filesize> 1024){
+                            currentVolume = parseInt(filesize/1024);
+                        }else {
+                            currentVolume = filesize;
+                        }
+                    }
+                    that.ECHARTS(record.maxVolume,currentVolume);
+                }
+            };
+            if(parentFieldName){
+                options.treeConfig = {
+                    treepid:parentFieldName,
+                    treeid:'id',
+                    showField:'name'
+                };
+            }
+            table.render(options);
+            document.getElementById("toolbar_column_" + that.id).innerHTML =
+                '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>';
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),
+                    {
+                        title: '缂栧彿',
+                        field: 'id',
+                        width: 100
+                    },                    {
+                        title: '鍚嶇О',
+                        field: 'name',
+                        width: 150
+                    },                    {
+                        title: '鏂囦粨鐨勮矾寰�',
+                        field: 'volumePath',
+                        width: 250
+                    },                    {
+                        title: '瀛樺偍绯荤粺绫诲瀷',
+                        field: 'serviceOsTypeText',
+                        width: 110
+                    },                    {
+                        title: '浼犺緭鍗忚',
+                        field: 'transProtocolText',
+                        width: 110
+                    },
+                    {
+                        title: '杩滅▼鏂囦粨鐨勬湇鍔″湴鍧�',
+                        field: 'serviceUrl',
+                        width: 150
+                    },                    {
+                        title: '杩滅▼鏂囦粨璁よ瘉鐢ㄦ埛',
+                        field: 'transUser',
+                        width: 150
+                    },                    {
+                        title: '杩滅▼鏂囦欢璁よ瘉鐢ㄦ埛瀵嗙爜',
+                        field: 'transUserPwd',
+                        width: 150
+                    }];
+            }
+        };
+
+        this.getFormItems = function(onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [
+                {
+                    field: 'id',
+                    title: '缂栧彿',
+                    required: true,
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'name',
+                    title: '鍚嶇О',
+                    required: true,
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'description',
+                    title: '鎻忚堪',
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'volumePath',
+                    title: '鏂囦粨鐨勮矾寰�',
+                    required: true,
+                    type: 'text',
+                    useAllWidth:true,
+                    inputWidth:800,
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'serviceOsType',
+                    title: '瀛樺偍绯荤粺绫诲瀷',
+                    type: 'combox',
+                    comboxKey: 'fileServiceOsType',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'transProtocol',
+                    title: '浼犺緭鍗忚',
+                    required: true,
+                    type: 'combox',
+                    comboxKey: 'fileTransProtocol',
+                    defaultValue:"local",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'serviceUrl',
+                    title: '杩滅▼鏂囦粨鐨勬湇鍔″湴鍧�',
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'transUser',
+                    title: '杩滅▼鏂囦粨璁よ瘉鐢ㄦ埛',
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'transUserPwd',
+                    title: '杩滅▼鏂囦欢璁よ瘉鐢ㄦ埛瀵嗙爜',
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'maxVolume',
+                    title: '鏈�澶у閲�(MB)',
+                    required: true,
+                    type: 'text',
+                    verify:'number',
+                    readOnly:onlyShow
+                }
+            ];
+        };
+        this.ECHARTS = function(max,current){
+            var that = this;
+            var echarts = layui.echarts;
+            var chartZhu = echarts.init(document.getElementById('EchartZhu'));
+            var num = '';
+            if(current == 0) {
+                num = 100
+            } else {
+                num = ((max-current)/max)*100;
+            }
+            var option = {
+                backgroundColor: "#fff",
+                title: {
+                    text: num+"%",
+                    subtext: '鍙敤瀹归噺鍗犳瘮锛堟瘡灏忔椂鏇存柊锛�',
+                    x: 'center',
+                    y: 'center',
+                    textStyle: {
+                        color: "#000",
+                        fontSize: 30,
+                        fontWeight: 'normal'
+                    },
+                    subtextStyle: {
+                        color: "#000",
+                        fontSize: 14,
+                        fontWeight: 'normal'
+                    }
+                },
+                calculable: true,
+                series: [
+            
+                    {
+                        name: '绌洪棿鍗犵敤鐜�',
+                        type: 'pie',
+                        radius: [100, 130],
+                        center: ['50%', '50%'],
+                        data: [{
+                                value: (current/max)*100,
+                                itemStyle: {
+                                    color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [{
+                                        offset: 0,
+                                        color: '#f6e3a1'
+                                    }, {
+                                        offset: 1,
+                                        color: '#ff4236'
+                                    }])
+                                },
+                                label: {
+                                    color: "#000",
+                                    fontSize: 14,
+                                    formatter: '褰撳墠瀹归噺\n{a|'+current+'}MB',
+                                    rich: {
+                                        a: {
+                                            color: "#000",
+                                            fontSize: 20,
+                                            lineHeight: 30
+                                        },
+                                    }
+                                }
+                            },
+                            {
+                                value: 100-(current/max)*100,
+                                itemStyle: {
+                                    color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [{
+                                        offset: 0,
+                                        color: '#348fe6'
+                                    }, {
+                                        offset: 1,
+                                        color: '#625bef'
+                                    }])
+                                },
+                                label: {
+                                    color: "#000",
+                                    fontSize: 14,
+                                    formatter: '鏈�澶у閲廫n{a|'+max+'}MB',
+                                    rich: {
+                                        a: {
+                                            color: "#000",
+                                            fontSize: 20,
+                                            lineHeight: 30
+                                        },
+                                    }
+                                }
+                            }
+                        ]
+                    }
+                ]
+            };
+            chartZhu.setOption(option, true);
+        };
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            that.addOrEdit(false,oid);
+        };
+        this.addOrEdit = function(add,oid) {
+            var that = this;
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var addSaveIndex =webUtil.dialog({
+                title:add?'娣诲姞鏂囦粨绠$悊':'淇敼鏂囦粨绠$悊',
+                btn:['淇濆瓨','鍙栨秷'],
+                skin:'layui-layer-lan',
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                fullScreen:true,
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getFormItems(false),
+                        function () {
+                            if(!add){
+                                form.load(filter,{
+                                    backPath:that.backPath,
+                                    url:that.url.controller + that.url.getObjectByOid,
+                                    method:'get',
+                                    params:{
+                                        oid:oid
+                                    }
+                                });
+                            }else{
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+                        }, {}, {defaultColumnOneRow: 3,labelWidth:150});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        if(!('currentVolume' in values)){
+                            values['currentVolume'] = 0;
+                        }
+                        var url = that.url.controller + (add?that.url.addSave:that.url.editSave);
+                        webUtil.ajax(add?'post':'put',url,values,function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts= webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+        this.refresh = function () {
+            var that = this;
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+        this.DISABLE = function () {
+            var that = this;
+            var selectData  = layui.table.checkStatus("table_" + that.id).data[0];
+            if(selectData.lcStatus == 'Disabled') {
+                $webUtil.showMsg($webUtil.starORstop(selectData.lcStatus))
+                return false;
+            }
+            that.disableOrEnable(false);
+        };
+        this.ENABLE = function () {
+            var that = this;
+            var selectData  = layui.table.checkStatus("table_" + that.id).data[0];
+            if(selectData.lcStatus == 'Enabled') {
+                $webUtil.showMsg($webUtil.starORstop(selectData.lcStatus))
+                return false;
+            }
+            that.disableOrEnable(true);
+        };
+        this.disableOrEnable = function (enable) {
+            var that = this;
+            var oid ;
+            var ts ;
+            oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            ts = webUtil.getOidFromGrid("table_" + that.id,false,false,'ts');
+            webUtil.post(that.url.controller + (enable?that.url.enableData:that.url.disableData),{
+                oid:oid,
+                ts:ts
+                },function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,(enable?'鍚敤鎴愬姛':'鍋滅敤鎴愬姛'));
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+        };
+
+        this.ADVQUERY = function(){//楂樼骇鏌ヨ
+            var that = this;
+            that.serinorQueryInstance.open();
+        };
+        this.advancedQuery = function(){
+            var that = this;
+            var dynamicCondition = layui.dynamicCondition;
+
+            var smUserTable = JSON.parse(JSON.stringify(that.columns));
+            $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar'+ that.id+'" class="layui-inline"></div>');
+            that.serinorQueryInstance = dynamicCondition.create({
+                fields : smUserTable//鏌ヨ瀛楁
+                ,tableId:"table_"+that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                ,type:"complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                // ,conditionTextId:"#toolbar"+that.id//楂樼骇鏌ヨ 鎸夐挳鎵�鍦ㄧ殑div
+                // ,popupShowQueryBtn: true//鏄剧ず楂樼骇鏌ヨ鎸夐挳
+                ,queryCallBack:function(requestData){//鏌ヨ涔嬪悗鐨刢allback
+                    //console.log(JSON.stringify(requestData))
+                }
+            });
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/home/vciHomeTaskAction.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/home/vciHomeTaskAction.js
new file mode 100644
index 0000000..6fa179a
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/home/vciHomeTaskAction.js
@@ -0,0 +1,257 @@
+/**
+ * 棣栭〉浠诲姟瀹氫箟
+ */
+
+layui.define(['layer','element','form','table'],function(exports){
+    var BatchMakeOrder = function(){
+        this.moduleKey = "vciHomeTaskAction";
+        this.id='vciHomeTaskAction';
+        this.sourceData={};//鏉ユ簮鏁版嵁
+        this.columns = [];
+        this.backPath = configData.compatibility?path:configData.frameworkPath;//榛樿娴佺▼鍜岄」鐩殑璺緞鏄竴鏍风殑
+        this.url={
+            dataGrid:'homeTaskController/dataGrid',
+            add:'homeTaskController/addSave',
+            edit:'homeTaskController/editSave',
+            del:'homeTaskController/delete',
+            referMenu:'smFunctionController/treeAllMenu'
+        };
+        this.buttonIconMap = {
+            SEARCH:'layui-icon-refresh-2',
+            SENIORSEARCH:'layui-icon-senior',
+            ADD:'layui-icon-add-1',
+            EDIT:'layui-icon-edit',
+            DELETE:'layui-icon-delete'
+        };
+        this.getContent=function(){//杩斿洖杩欎釜缁勪欢鐨勫熀纭�html
+            var that = this;
+            var html = "";
+            html = [
+                '<div class="layui-layout" style="display:block;">',
+                    '<div class="layui-layout-border">',
+                        '<div class="layui-center">',
+                            that.getToolbarHtml(),
+                            '<table id="table_', that.id , '" lay-filter="table_',that.id , '" style="overflow:auto;"></table>',//涓诲垪琛�
+                        '</div>',
+                    '</div>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id, '" class="layui-btn-container">',//涓诲垪琛ㄧ殑鎸夐挳
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.init=function(){//鍩虹鐨刪tml琚坊鍔犲悗锛屽啀鎵ц鍒濆鍖�
+            var that = this;
+            $webUtil.copyConfig(that,that.moduleKey);
+            //鑾峰彇鎸夐挳
+            $webUtil.bindDefultButtonLisenter(that, that.id);
+            var table = layui.table;
+            that.checkColumns();//涓诲垪琛ㄤ腑鍒椼��
+            table.render({
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                url: that.backPath + that.url.dataGrid,
+                page: {
+                    limit: 30,
+                    page: 1
+                },
+                width:'100%',
+                cols: [that.columns]
+            });
+        };
+		this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;//鍙湁鑷姞宸ョ殑鎵嶆槸棣栨壒
+            if(that.columns==null || that.columns.length==0){//濡傛灉鍏朵粬鍦版柟鎯充娇鐢ㄨ繖涓粍浠剁殑鏃跺�欙紝鍙互鑷畾涔夊垪
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),{
+                    field:'name',
+                    title:'鎵�灞炶彍鍗�',
+                    width:150
+                },{
+                    field:'serviceName',
+                    title:'鏈嶅姟鍚嶇О',
+                    width:100
+                },{
+                    field:'countUrl',
+                    title:'缁熻鐨勫湴鍧�',
+                    width:350
+                },{
+                    field:'uiUrl',
+                    title:'椤甸潰鍦板潃',
+                    width:350
+                }];
+            }
+        };
+		this.refresh = function () {
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+		this.ADD = function() {
+            var that = this;
+            var form = layui.form;
+            var filter =that.id;
+            var addSaveIndex = $webUtil.dialog({
+                title:'娣诲姞棣栭〉浠诲姟鍔ㄤ綔',
+                btn:['淇濆瓨','鍙栨秷'],
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px"></form>',
+                area:['800px','300px'],
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero){
+                    form.addItems(filter,that.getFormItems(),
+                        function(){},{},{defaultColumnOneRow:2,inDialog:true});
+                    form.on('select('+ filter + ")",function (obj) {
+                        if (obj.name == 'id') {
+                            var selectData = obj.rowData[0];
+                            form.setValues({
+                                name: selectData.name,
+                                uiUrl:selectData.url
+                            },filter);
+                        }
+                    });
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter);
+                        $webUtil.post(that.url.add,values,function(result){
+                            if(result.success){
+                                $webUtil.showMsgFromResult(result,"娣诲姞鎴愬姛");
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                $webUtil.showErrorMsg(result.msg);
+                            }
+                        },function (error) {
+
+                        },that.backPath);
+                    }
+                }
+            });
+        };
+		this.getFormItems = function () {
+            return [{
+                type:'refer',
+                name:'id',
+                text:'鎵�灞炲姛鑳借彍鍗�',
+                required:true,
+                showField:'name',
+                referConfig:{
+                    type:'tree',
+                    url:that.url.referMenu,
+                    extraParams:{
+                        currentUserReferModelKey:that.sourceData['functionId'],
+                        currentUserReferMethodKey:'ADD'//鏄憡璇塽rl褰撳墠浣跨敤鍙傜収鐨勮彍鍗曞拰鎸夐挳
+                    },
+                    loadType:'all',
+                    valueField:'attribute.oid',
+                    textField:'attribute.name'
+                }
+            },{
+                name:'name',
+                text:'鏄剧ず鍚嶇О',
+                required:true
+            },{
+                name:'serviceName',
+                text:'鏈嶅姟鍚嶇О',
+                required:true
+            },{
+                name:'countUrl',
+                text:'缁熻鐨勮矾寰�',
+                useAllWidth:true,
+                required:true
+            },{
+                name:'uiUrl',
+                text:'鏄剧ず璺緞',
+                useAllWidth:true,
+                required:true
+            }];
+        };
+		this.EDIT = function() {
+		    var that = this;
+            var oid = $webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var selectData = layui.table.checkStatus("table_" + that.id);
+            if(selectData && selectData.data &&selectData.data.length>0){
+                    var form = layui.form;
+                    var filter =that.id;
+                    var addSaveIndex = $webUtil.dialog({
+                        title:'淇敼棣栭〉浠诲姟鍔ㄤ綔',
+                        btn:['淇濆瓨','鍙栨秷'],
+                        content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px"></form>',
+                        area:['800px','300px'],
+                        resizing:function(layero){
+                            form.doResize(filter);
+                        },
+                        success:function(layero){
+                            form.addItems(filter,that.getFormItems(),
+                                function(){
+                                    form.setValues(selectData.data[0],filter);
+                                    form.on('select('+ filter + ")",function (obj) {
+                                        if (obj.name == 'id') {
+                                            var selectData = obj.rowData[0];
+                                            form.setValues({
+                                                name: selectData.name,
+                                                uiUrl:selectData.url
+                                            },filter);
+                                        }
+                                    });
+                                },{},{defaultColumnOneRow:2,inDialog:true});
+                        },
+                        yes:function(layero){
+                            if(form.validata(filter)){
+                                var values = form.getValues(filter);
+                                values.oid = selectData.data[0].oid;
+                                values.ts = selectData.data[0].ts;
+                                $webUtil.put(that.url.edit,values,function(result){
+                                    if(result.success){
+                                        $webUtil.showMsgFromResult(result,"淇敼鎴愬姛");
+                                        layer.close(addSaveIndex);
+                                        that.refresh();
+                                    }else{
+                                        $webUtil.showErrorMsg(result.msg);
+                                    }
+                                },function (error) {
+
+                                },that.backPath);
+                            }
+                        }
+                    });
+            }
+        };
+		this.DELETE = function(){
+            var that = this;
+            var oid = $webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var selectData = layui.table.checkStatus("table_" + that.id);
+            if(selectData && selectData.data &&selectData.data.length>0){
+                $webUtil.showConfirmMsg("鎮ㄧ‘瀹氳鍒犻櫎杩欐潯鏁版嵁鍚楋紵",function () {
+                    oid = selectData.data[0].oid;
+                    var ts = selectData.data[0].ts;
+                    $webUtil.deleteRequest(that.url.del,{oid:oid,ts:ts},function(result){
+                        if(result.success){
+                            $webUtil.showMsgFromResult("鍒犻櫎鎴愬姛");
+                            that.refresh();
+                        }else{
+                            $webUtil.showErrorMsg(result.msg);
+                        }
+                    },function(error){
+
+                    },that.backPath);
+                });
+            }
+        };
+    };
+    var pml = new BatchMakeOrder();
+    exports('platform/home/vciHomeTaskAction',pml);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/monitor/VciMonitorMain.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/monitor/VciMonitorMain.js
new file mode 100644
index 0000000..800c952
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/monitor/VciMonitorMain.js
@@ -0,0 +1,73 @@
+/**
+ * 鐩戞帶涓績鐨勪富椤甸潰
+ * @author weidy
+ * @date 2020-12-10
+ */
+layui.define(['layer','element','form','table','dynamicCondition','platform/monitor/VciService','platform/developer/logs/VciLogMonitor','platform/monitor/VciSqlTool' ],function(exports){
+    var Class = function(){
+        this.MODELNAME = "platform/monitor/VciMonitorMain";
+        this.moduleKey = "VciMonitorMain";
+        this.backPath =  configData.compatibility?path:configData.adminServicePath;
+        this.id = "VciMonitorMain";
+        this.url = {
+            controller:'vciServiceController/',
+            dataGrid:'gridVciService',
+            addSave:'addSave',
+            editSave:'editSave',
+            deleteUrl:'deleteData',
+            getObjectByOid:'getObjectByOid'
+        };
+        this.getContent=function(){
+            var that = this;
+            var html = "";
+            html = [
+                '<div class="layui-layout" style="display:block;overflow-y: hidden">',
+                    '<div class="layui-layout-border" style="display:block;margin-top:0px; " id="border_',that.id,'">',
+                        '<div class="layui-center" style="overflow-y:auto;overflow-x: hidden">',
+                            '<div class="layui-tab" >',
+                                '<ul class="layui-tab-title" lay-allowClose="false">',
+                                    '<li class="layui-this">鏈嶅姟缁存姢</li>',
+                                    '<li>鏃ュ織鐩戞帶</li>',
+                                    '<li>鏈嶅姟杩愯鎯呭喌鐩戞帶(鏆傛湭寮�鏀�)</li>',
+                                    '<li>SQL鍜屾暟鎹簱鐩戞帶</li>',
+                                    // '<li>娉ㄥ唽涓績</li>',
+                                '</ul>',
+                                '<ul class="layui-tab-content">',
+                                    '<li class="layui-tab-item layui-show">' ,
+                                        '<div id="service_',that.id,'"></div>',
+                                    '</li>',
+                                    '<li class="layui-tab-item">',
+                                        '<div id="log_',that.id,'"></div>',
+                                    '</li>',
+                                    '<li class="layui-tab-item">',
+                                        '<div id="monitor_',that.id,'"></div>',
+                                    '</li>',
+
+                                    '<li class="layui-tab-item">',
+                                        '<div id="sql_',that.id,'"></div>',
+                                    '</li>',
+                                '</ul>',
+                            '</div>',
+                        '</div>',
+                    '</div>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.init = function(){
+            var that = this;
+            $webUtil.copyConfig(that,that.moduleKey);
+            var servicePanel = layui['platform/monitor/VciService'];
+            $("#service_" + that.id).append(servicePanel.getContent());
+            servicePanel.init();
+            var logPanel = layui['platform/developer/logs/VciLogMonitor'];
+            $("#log_" + that.id).append(logPanel.getContent());
+            logPanel.init();
+            var sqlPanel = layui['platform/monitor/VciSqlTool'];
+            $("#sql_" +that.id).append(sqlPanel.getContent());
+            sqlPanel.init();
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/monitor/VciService.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/monitor/VciService.js
new file mode 100644
index 0000000..e31d966
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/monitor/VciService.js
@@ -0,0 +1,519 @@
+/**
+ * 鏈嶅姟瀵硅薄椤甸潰
+ * @author weidy
+ * @date 2020-12-10
+ */
+layui.define(['layer','element','form','table','dynamicCondition','upload' ],function(exports){
+        var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "platform/monitor/VciService";
+        this.moduleKey = "VciService";
+        this.backPath =  configData.adminServicePath;
+        this.id = "VciService";
+        this.url = {
+            controller:'vciServiceController/',
+            dataGrid:'gridVciService',
+            addSave:'addSave',
+            editSave:'editSave',
+            deleteUrl:'deleteData',
+            getObjectByOid:'getObjectByOid'
+        };
+        this.getContent=function(){
+            var that = this;
+            var html = "";
+            html = [
+                '<div class="layui-layout" style="display:block;overflow-y: hidden">',
+                    '<div class="layui-layout-border" style="display:block;margin-top:0px; " id="border_',that.id,'">',
+                        '<div class="layui-center" style="overflow-y:auto;overflow-x: hidden">',
+                            that.getToolbarHtml(),
+                            '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                            '<div id="toolbar_column_',that.id ,'" style="display:none;"></div>',
+                        '</div>',
+                    '</div>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.createSearchHtml({id:"缂栧彿",name:"鍚嶇О"} ,$("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+        };
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            that.initMainTable();
+            that.createSearchHtml();
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var tableWidth = $("#border_" + that.id).width()-225;
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                width:tableWidth,
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'stop'){
+                                that.stop(data.id);
+                            }else if(layEvent == "start"){
+                                that.start(data.id);
+                            }else if(layEvent == "restart"){
+                                that.restart(data.id);
+                            }else if(layEvent == "update"){
+                                that.update(data.id);
+                            }
+                        });
+                    }else{
+                        if(total>0) {
+                            table.selectRecord('table_' + that.id, {index:0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                }
+            };
+            if(parentFieldName){
+                options.treeConfig = {
+                    treepid:parentFieldName,
+                    treeid:'id',
+                    showField:'name'
+                };
+            }
+            table.render(options);
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){
+                that.columns = [table.getIndexColumn(),table.getCheckColumn()
+                    ,                    {
+                        title: '缂栧彿',
+                        field: 'id',
+                        width: 150
+                    },
+                    {
+                        title: '鍚嶇О',
+                        field: 'name',
+                        width: 150,
+                        templet:function (d){
+                            if(d.uiFlag == 'true'){
+                                return d.name + "(UI)";
+                            }else{
+                                return d.name;
+                            }
+                        }
+                    },
+                    {
+                        title: '褰撳墠鐘舵��',
+                        field: 'currentStatus',
+                        width: 80,
+                        templet:function(d){
+                            if(d.currentStatus == "鏈煡") {
+                                return '<div class="layui-bg-gray" style="text-align: center;">'+d.currentStatus+'</div>' ;
+                            } else if(d.currentStatus == "杩愯涓�") {
+                                return '<p class="layui-bg-green" style="text-align: center;">'+d.currentStatus+'</p>' ;
+                            }else{
+                                return '<p class="layui-bg-red" style="text-align: center;" >'+d.currentStatus+'</p>' ;
+                            }
+                        }
+                    },
+                    {
+                        title: '鎵ц姝ラ',
+                        field: 'processStatus',
+                        width: 80
+                    },                    {
+                        title: '閮ㄧ讲鏂囦欢澶�',
+                        field: 'folder',
+                        width: 150
+                    },                    {
+                        title: '鍒濆鍖栫殑bat',
+                        field: 'initBat',
+                        width: 150
+                    },                    {
+                        title: '鍚姩鐨刡at',
+                        field: 'startBat',
+                        width: 150
+                    },                    {
+                        title: '璇锋眰鐨勫湴鍧�',
+                        field: 'requestPath',
+                        width: 150
+                    },{
+                        field: 'options',
+                        title:'鎿嶄綔',
+                        width: 260,
+                        fixed:'right',
+                        templet: function (d) {
+                            var btns = [];
+                            if(d.uiFlag == 'true'){
+                                btns.push('<a class="layui-btn layui-btn-intable" lay-event="update">鏇存柊</a>');
+                            }else {
+                                btns.push('<a class="layui-btn layui-btn-intable" lay-event="stop">鍋滄湇</a>');
+                                btns.push('<a class="layui-btn layui-btn-intable" lay-event="start">鍚姩</a>');
+                                btns.push('<a class="layui-btn layui-btn-intable" lay-event="restart">閲嶅惎</a>');
+                                btns.push('<a class="layui-btn layui-btn-intable" lay-event="update">鏇存柊jar</a>');
+                            }
+                            return btns.join("");
+                        }
+                    }];
+            }
+        };
+
+        this.getFormItems = function(onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [
+                             {
+                    field: 'id',
+                    title: '缂栧彿',
+                    required: true,
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'name',
+                    title: '鍚嶇О',
+                    required: true,
+                    type: 'text',
+                    readOnly:onlyShow
+                },                {
+                    field: 'folder',
+                    title: '鎵�鍦ㄦ枃浠跺す',
+                    required: true,
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'initBat',
+                    title: '鍒濆鍖栫殑bat',
+                    required: true,
+                    type: 'text',
+                    readOnly:onlyShow
+                },                {
+                    field: 'startBat',
+                    title: '鍚姩鐨刡at',
+                    required: true,
+                    type: 'text',
+                    readOnly:onlyShow
+                }  ,                {
+                    field: 'requestPath',
+                    title: '璇锋眰鐨勫湴鍧�',
+                    required: true,
+                    type: 'text',
+                    readOnly:onlyShow
+                }  ,                {
+                    field: 'privateKey',
+                    title: '绉侀挜(鐢ㄤ簬鍋滄湇)',
+                    type: 'text',
+                    required: true,
+                    readOnly:onlyShow
+                },                {
+                    field: 'pidPath',
+                    title: '杩涚▼鏂囦欢鐨勮矾寰�',
+                    required: true,
+                    type: 'text',
+                    defaultValue:'app.pid',
+                    readOnly:onlyShow
+                },                {
+                    field: 'logsFolder',
+                    title: '鏃ュ織鐨勬枃浠跺す',
+                    type: 'text',
+                    defaultValue: 'logs',
+                    readOnly:onlyShow
+                },                {
+                    field: 'logsAllName',
+                    title: '鍏ㄩ儴淇℃伅鐨勬棩蹇楀悕绉�',
+                    type: 'text',
+                    readOnly:onlyShow
+                }  , {
+                    field: 'description',
+                    title: '鎻忚堪',
+                    type: 'text',
+                    readOnly:onlyShow
+                }
+                // ,                {
+                //     field: 'sameDb',
+                //     title: '鏄惁鐩稿悓鐨勬暟鎹簱',
+                //     type: 'truefalse',
+                //     readOnly:onlyShow
+                // }
+                ,                {
+                    field: 'uiFlag',
+                    title: '鏄惁UI椤圭洰',
+                    type: 'truefalse',
+                    readOnly:onlyShow
+                }             ];
+        };
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            that.addOrEdit(false,oid);
+        };
+        this.addOrEdit = function(add,oid) {
+            var that = this;
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var addSaveIndex =webUtil.dialog({
+                title:add?'娣诲姞鏈嶅姟瀵硅薄':'淇敼鏈嶅姟瀵硅薄',
+                btn:['淇濆瓨','鍙栨秷'],
+                skin:'layui-layer-lan',
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                fullScreen:true,
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getFormItems(false),
+                        function () {
+                            if(!add){
+                                form.load(filter,{
+                                    backPath:that.backPath,
+                                    url:that.url.controller + that.url.getObjectByOid,
+                                    method:'get',
+                                    params:{
+                                        oid:oid
+                                    }
+                                });
+                            }else{
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+                        }, {}, {defaultColumnOneRow: 2});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        var url = that.url.controller + (add?that.url.addSave:that.url.editSave);
+                        webUtil.ajax(add?'post':'put',url,values,function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts= webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+        this.refresh = function () {
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+
+        this.ADVQUERY = function () {
+            var that = this;
+            if(!that.serinorQueryInstance) {
+                var dynamicCondition = layui.dynamicCondition;
+                $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar' + that.id + '" class="layui-inline"></div>');
+                var dataFields = that.columns;
+                that.serinorQueryInstance = dynamicCondition.create({
+                    fields: dataFields//鏌ヨ瀛楁
+                    , tableId: "table_" + that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                    , type: "complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                    //,conditionTextId:"#toolbar"+that.id//楂樼骇鏌ヨ 鎸夐挳鎵�鍦ㄧ殑div
+                    //,popupShowQueryBtn: true//鏄剧ず楂樼骇鏌ヨ鎸夐挳
+                    , queryCallBack: function (requestData) {//鏌ヨ涔嬪悗鐨刢allback
+                        //console.log(JSON.stringify(requestData))
+                    }
+                });
+            }
+            that.serinorQueryInstance.open();
+        };
+        this.stop = function (id){
+            var that = this;
+            if(!id){
+                return false;
+            }
+            $webUtil.showConfirmMsg("鏄惁瑕佸仠姝㈡湇鍔�",function (r){
+                if(r) {
+                    $webUtil.post(that.url.controller + "stopService", {id: id}, function (result) {
+                        if(result.success){
+                            $webUtil.showMsgFromResult(result,"鍙戦�佸仠鏈嶇殑鍛戒护鎴愬姛锛岃鑷鍒锋柊鐘舵��");
+                            that.refresh();
+                        }else{
+                            $webUtil.showErrorMsg(result.msg);
+                        }
+                    },function (xhr,error){},that.backPath);
+                }
+            });
+        };
+        this.start = function (id){
+            var that = this;
+            if(!id){
+                return false;
+            }
+            $webUtil.showConfirmMsg("鏄惁瑕佸惎鍔ㄦ湇鍔�",function (r){
+                if(r) {
+                     $webUtil.showConfirmMsg("鏄惁瑕佸垵濮嬪寲鏁版嵁搴撹〃锛�",function (r){
+                         $webUtil.post(that.url.controller + "startService", {id: id,checkFlag:true}, function (result) {
+                             if(result.success){
+                                 $webUtil.showMsgFromResult(result,"鍙戦�佸惎鍔ㄧ殑鍛戒护鎴愬姛锛岃鑷鍒锋柊鐘舵��");
+                                 that.refresh();
+                             }else{
+                                 $webUtil.showErrorMsg(result.msg);
+                             }
+                         },function (xhr,error){},that.backPath);
+                     },function (){
+                         $webUtil.post(that.url.controller + "startService", {id: id,checkFlag:false}, function (result) {
+                             if(result.success){
+                                 $webUtil.showMsgFromResult(result,"鍙戦�佸惎鍔ㄧ殑鍛戒护鎴愬姛锛岃鑷鍒锋柊鐘舵��");
+                                 that.refresh();
+                             }else{
+                                 $webUtil.showErrorMsg(result.msg);
+                             }
+                         },function (xhr,error){},that.backPath);
+                     });
+                }
+            });
+        };
+        this.restart = function (id){
+            var that = this;
+            if(!id){
+                return false;
+            }
+            $webUtil.showConfirmMsg("鏄惁瑕侀噸鍚湇鍔�",function (r){
+                if(r) {
+                    $webUtil.post(that.url.controller + "restartService", {id: id}, function (result) {
+                        if(result.success){
+                            $webUtil.showMsgFromResult(result,"鍙戦�侀噸鍚殑鍛戒护鎴愬姛锛岃鑷鍒锋柊鐘舵��");
+                            that.refresh();
+                        }else{
+                            $webUtil.showErrorMsg(result.msg);
+                        }
+                    },function (xhr,error){},that.backPath);
+                }
+            });
+        };
+        this.update = function (id){
+            var that = this;
+            if(!id){
+                return false;
+            }
+            var form = layui.form;
+            var filter ="form_" + id;
+            $webUtil.showConfirmMsg("鏄惁瑕佹洿鏂版湇鍔$殑鏂囦欢锛岃繖涓繃绋嬪彲鑳戒細寰堥暱",function (r){
+                if(r){
+                    var addSaveIndex = webUtil.dialog({
+                        title: '涓婁紶鏇存柊鍖咃紝骞朵笖鏇存柊鏈嶅姟锛屽鏋滈亣鍒伴敊璇紝璇峰叧闂悗閲嶈瘯',
+                        content: '<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" enctype="multipart/form-data"></form>',
+                        resizing: function (layero) {
+                            form.doResize(filter);
+                        },
+                        area: ['500px', '300px'],
+                        success: function (layero) {
+                            form.addItems(filter, [{
+                                    field: 'checkFlag',
+                                    title: '鏄惁鍒濆鍖栨暟鎹簱琛�',
+                                    labelWidth:200,
+                                    type: 'truefalse',
+                                    defaultValue: 'false'
+                                }],
+                                function () {
+                                    if ($("#upload_table_template_" + filter)) {
+                                        $("#upload_table_template_" + filter).remove();
+                                    }
+                                    $("#form_" + filter).append('<button type="button" class="layui-btn" id="upload_table_template_' + filter + '" style="margin-left:150px;display: block;float:left;"><i class="layui-icon layui-icon-upload"></i>娴忚妯℃澘鏂囦欢</button>');
+                                    var upload = layui.upload;
+                                    //鎵ц瀹炰緥
+                                    var uploadInst = upload.render({
+                                        elem: '#upload_table_template_' + filter //缁戝畾鍏冪礌
+                                        ,accept:'file'
+                                        ,acceptMime:'file/*'
+                                        ,exts:'jar|zip|rar'
+                                        ,url: (that.backPath+ that.url.controller + 'updateJar')//涓婁紶鎺ュ彛
+                                        ,auto:true
+                                        ,before:function(obj){
+                                            if(form.validata(filter)){
+                                                var formData = form.getValues(filter);
+                                                formData['id'] = id;
+                                                obj.setData(formData);
+                                                $webUtil.showProgress('鏂囦欢涓婁紶涓�');
+                                                return true;
+                                            }else{
+                                                $webUtil.showErrorMsg("璇峰厛杈撳叆鍐呭鍚庡啀閫夋嫨鏂囦欢");
+                                                return false;
+                                            }
+                                        }
+                                        ,done: function(result){
+                                            $webUtil.closeProgress();
+                                            if(result.success){
+                                                $webUtil.showMsgFromResult(result,"鏇存柊鎸囦护鍙戦�佹垚鍔燂紒");
+                                                layui.layer.close(addSaveIndex);
+                                                that.refresh();
+                                            }else{
+                                                $webUtil.showErrorMsg(result.msg);
+                                            }
+                                        }
+                                        ,error: function(){
+                                            //璇锋眰寮傚父鍥炶皟
+                                            $webUtil.showErrorMsg("涓婁紶寮傚父");
+                                        }
+                                    });
+                                }, {}, {defaultColumnOneRow: 1});
+                        }
+                    });
+                }
+            });
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/monitor/VciSqlTool.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/monitor/VciSqlTool.js
new file mode 100644
index 0000000..73a8b4a
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/monitor/VciSqlTool.js
@@ -0,0 +1,130 @@
+/**
+ * 鏈嶅姟瀵硅薄椤甸潰
+ * @author weidy
+ * @date 2020-12-10
+ */
+layui.define(['layer','element','form','table','dynamicCondition','upload' ],function(exports){
+        var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "platform/monitor/VciSqlTool";
+        this.moduleKey = "VciSqlTool";
+        this.backPath =  configData.compatibility?path:configData.adminServicePath;
+        this.id = "VciSqlTool";
+        this.url = {
+            controller:'vciDataBaseConnectController/',
+            executeSql:'executeSql',
+            executeQuerySql:'executeQuerySql'
+        };
+        this.getContent=function(){
+            var that = this;
+            var html = "";
+            html = [
+                '<div class="layui-layout" style="display:block;overflow-y: hidden">',
+                    '<div class="layui-layout-border" style="display:block;margin-top:0px; " id="border_',that.id,'">',
+                        '<div class="layui-center" style="overflow-y:auto;overflow-x: hidden">',
+                            that.getToolbarHtml(),
+                            '<textarea id="sql_',that.id,'" style="width:100%;height:260px;"></textarea>',
+                        '</div>',
+                        '<div class="layui-south" style="height:400px;width:100%;overflow-y:auto;">' ,
+                            '<table id="table_', that.id , '" lay-filter="table_',that.id , '" style="overflow-x:auto;"></table>',
+                        '</div>',
+                    '</div>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+                    '<div layui-filter="toolbar_',that.id,'_select" class="layui-input-inline" style="position: relative;"></div>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_SQLQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_SQLEXECUTE"><i class="layui-icon layui-icon-down"></i>鎵ц</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_RESETSQL"><i class="layui-icon layui-icon-fonts-clear"></i>閲嶇疆</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            $webUtil.createSelectHtml(that.backPath+'vciDataBaseConnectController/comboxDatabase',$("[layui-filter='toolbar_" + that.id + "_select']"),'sql_select');
+            webUtil.bindDefultButtonLisenter(that, that.id);
+        };
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            layui.table.render({
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                data:[],
+                emptyText:'',
+                limit:-1,
+                cols: [[]]
+            });
+            that.createSearchHtml();
+        };
+        this.SQLQUERY = function (){
+            var that = this;
+            var sql = $("#sql_" + that.id).val();
+            if($webUtil.isNull(sql)){
+                sql = $("#sql_" + that.id).text();
+            }
+            if($webUtil.isNotNull(sql)){
+                that.clearTable();
+                $webUtil.post(that.url.controller + that.url.executeQuerySql,{sql:sql,databaseId:$('#sql_select').val()},function (result){
+                    if(result.success){
+                        if(result.data.length > 0) {
+                            var record = result.data[0];
+                            var cols = [layui.table.getIndexColumn()];
+                            for(var key in record){
+                                cols.push({
+                                    field:key,
+                                    title:key
+                                });
+                            }
+                            layui.table.reload('table_' + that.id,{
+                                data: result.data,
+                                cols: [cols]
+                            });
+                        }
+                    }else{
+                        $webUtil.showErrorMsg(result.msg);
+                    }
+                },function (xhr,error){
+                    $webUtil.showErrorMsg("鎵цSQL鏌ヨ鍑洪敊锛屽彲鑳芥槸鏈嶅姟娌℃湁鍚姩");
+                },that.backPath);
+            }
+        };
+        this.SQLEXECUTE = function () {
+            var that = this;
+            var sql = $("#sql_" + that.id).val();
+            if($webUtil.isNull(sql)){
+                sql = $("#sql_" + that.id).text();
+            }
+            if($webUtil.isNotNull(sql)) {
+                that.clearTable();
+                $webUtil.post(that.url.controller + that.url.executeSql, {sql: sql,databaseId:$('#sql_select').val()}, function (result) {
+                    if (result.success) {
+                        $webUtil.showMsgFromResult(result,"鎵ц鎴愬姛銆傚彈褰卞搷琛屾暟" + result.obj);
+                    } else {
+                        $webUtil.showErrorMsg(result.msg);
+                    }
+                }, function (xhr, error) {
+                    $webUtil.showErrorMsg("鎵цSQL鏌ヨ鍑洪敊锛屽彲鑳芥槸鏈嶅姟娌℃湁鍚姩");
+                }, that.backPath);
+            }
+        };
+        this.RESETSQL = function () {
+            var that = this;
+            $("#sql_" + that.id).text("");
+            $("#sql_" + that.id).val("");
+        };
+        this.clearTable = function (){
+            var that = this;
+            layui.table.reload("table_" + that.id, {cols:[[]]});
+        };
+
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/monitor/VciYAML.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/monitor/VciYAML.js
new file mode 100644
index 0000000..d394ffc
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/monitor/VciYAML.js
@@ -0,0 +1,95 @@
+/**
+ * yaml椤甸潰
+ * @author wangting
+ * @date 2021-5-27
+ */
+layui.define(['layer','element' ],function(exports){
+        var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "platform/monitor/VciYAML";
+        this.moduleKey = "VciYAML";
+        this.backPath =  configData.compatibility?path:configData.adminServicePath;
+        this.id = "VciYAML";
+        this.getContent=function(){
+            var that = this;
+            var html = "";
+            html = [
+                '<div class="layui-layout" style="display:block;overflow-y: hidden">',
+                    '<div class="layui-layout-border" style="display:block;margin-top:0px; " id="border_',that.id,'">',
+                        '<div class="layui-center" style="overflow-y:auto;overflow-x: hidden">',
+                            '<link rel=stylesheet href="jslib/yaml/css/codemirror.css">' +
+                            '<style type="text/css">' +
+                            '    .CodeMirror{' +
+                            '        height:600px;' +
+                            '    }' +
+                            '</style>',
+                            '<div id="yamlSource" style="width: 700px;height:600px;float: left;margin-right: 10px;border: 1px solid #ddd"></div>',
+                            '<div id="yamlResult" style="width: 600px;height:600px;float: left;border: 1px solid #ddd"></div>',
+                        '</div>',
+                    '</div>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+
+            webUtil.createScript('jslib/yaml/js/codemirror.js', function () {
+                webUtil.createScript('jslib/yaml/js/yaml.js', function () {
+                    webUtil.createScript('jslib/yaml/js/js-yaml.min.js', function () {
+                        var yamlSourceCodeMirror = CodeMirror(document.getElementById('yamlSource'), {
+                            value: '',
+                            mode: 'yaml',
+                            lineNumbers: true,     // 鏄剧ず琛屾暟
+                            indentUnit: 1,         // 缂╄繘鍗曚綅涓�2
+                            styleActiveLine: true, // 褰撳墠琛岃儗鏅珮浜�
+                            matchBrackets: true,   // 鎷彿鍖归厤
+                            lineWrapping: true,    // 鑷姩鎹㈣
+                            tabSize: 2,
+                        });
+
+                        var yamlResultCodeMirror = CodeMirror(document.getElementById('yamlResult'), {
+                            value: '',
+                            mode: 'yaml',
+                            lineNumbers: true,     // 鏄剧ず琛屾暟
+                            indentUnit: 1,         // 缂╄繘鍗曚綅涓�2
+                            styleActiveLine: true, // 褰撳墠琛岃儗鏅珮浜�
+                            matchBrackets: true,   // 鎷彿鍖归厤
+                            lineWrapping: true,    // 鑷姩鎹㈣
+                            tabSize: 2,
+                        });
+
+                        // 鐩戝惉杈撳叆鍊煎彉鍖�
+                        yamlSourceCodeMirror.on('change', (cm) => {
+                            var parseYaml=parseYamlFn(cm.doc.getValue())
+                            if(!!parseYaml.isYaml){
+                                var json = JSON.stringify(parseYaml.isYaml, null, 2);
+                                yamlResultCodeMirror.setValue(json);
+                            }else {
+                                console.log(parseYaml.errorMessage)
+                                yamlResultCodeMirror.setValue(parseYaml.errorMessage);
+                            }
+                        })
+
+                        const parseYamlFn = (str) => {
+                            let isYaml = false;
+                            let errorMessage = '';
+                            try {
+                                isYaml = jsyaml.load(str)
+                            } catch(e) {
+                                errorMessage = e && e.message;
+                            }
+                            return {
+                                isYaml, errorMessage
+                            };
+                        }
+                    })
+                })
+            })
+
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/HelpDocument.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/HelpDocument.js
new file mode 100644
index 0000000..a2d0464
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/HelpDocument.js
@@ -0,0 +1,364 @@
+/**
+ * 甯姪鏂囨。椤甸潰
+ * @author weidy
+ * @date 2021-11-25
+ */
+layui.define(['layer','element','form','table','dynamicCondition','upload' ],function(exports){
+        var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "platform/objectService/HelpDocument";
+        this.moduleKey = "HelpDocument";
+        this.backPath =  configData.adminServicePath;
+        this.url = {
+            controller:'helpDocumentController/',
+            dataGrid:'gridHelpDocument',
+            addSave:'addSave',
+            editSave:'editSave',
+            deleteUrl:'deleteData',
+             getObjectByOid:'getObjectByOid',
+            importData:'importByFile',
+            downloadFile:'downloadFile'
+        };
+        this.getContent=function(){
+            var that = this;
+            var html = "";
+            html = [
+                '<div class="layui-layout" style="display:block;overflow-y: hidden">',
+                    '<div class="layui-layout-border" style="display:block;margin-top:0px; " id="border_',that.id,'">',
+                        '<div class="layui-center" style="overflow-y:auto;">',
+                            that.getToolbarHtml(),
+                            '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                        '</div>',
+                    '</div>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼鍩烘湰淇℃伅</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.createSearchHtml({id:"鏂囨。缂栧彿",name:"鏂囨。鍚嶇О"} ,$("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+        };
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            that.initMainTable();
+            that.createSearchHtml();
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var tableWidth = $("#border_" + that.id).width()-225;
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                width:tableWidth,
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'EDITCONTENT') {
+                                that.editContent(data.oid,data);
+                            }else if(layEvent =='IMPORT'){
+                                that.IMPORT(data.oid);
+                            }else if(layEvent == 'DOWNLOAD'){
+                                that.DOWNLOAD(data.oid);
+                            }
+                        });
+                    }else{
+                        if(total>0) {
+                            table.selectRecord('table_' + that.id, {index:0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                }
+            };
+            if(parentFieldName){
+                options.treeConfig = {
+                    treepid:parentFieldName,
+                    treeid:'id',
+                    showField:'name'
+                };
+            }
+            table.render(options);
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),{
+                    title: '鏂囨。缂栧彿',
+                    field: 'id',
+                    sort:true,
+                    width: 150
+                },
+                    {
+                        title: '鏂囨。鍚嶇О',
+                        field: 'name',
+                        sort:true,
+                        width: 200
+                    },
+                    {
+                        title: '鎻忚堪',
+                        field: 'description',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '鏂囨。鐢ㄩ��',
+                        field: 'docUsedTypeText',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '鍚庣紑鍚�',
+                        field: 'fileExtension',
+                        width:150
+                    },
+                    {
+                        field:'options',
+                        title:'鎿嶄綔',
+                        width:200,
+                        templet:function(d){
+                            return '<a class="layui-btn layui-btn-intable" lay-event="EDITCONTENT">缂栬緫鍐呭</a>'+
+                            '<a class="layui-btn layui-btn-intable" lay-event="IMPORT">瀵煎叆鏂囦欢</a>'+
+                            '<a class="layui-btn layui-btn-intable" lay-event="DOWNLOAD">涓嬭浇</a>';
+                        }
+                    }];
+            }
+        };
+
+        this.getFormItems = function(onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [ {
+                field: 'id',
+                title: '鏂囨。缂栧彿',
+                required: true,
+                type: 'text',
+                readOnly:onlyShow
+            },                {
+                field: 'name',
+                title: '鏂囨。鍚嶇О',
+                required: true,
+                type: 'text',
+                readOnly:onlyShow
+            } ,
+                {
+                    field: 'description',
+                    title: '鎻忚堪',
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'docUsedType',
+                    title: '鏂囨。鐢ㄩ��',
+                    type: 'combox',
+                    comboxKey:'helpdocusedtype',
+                    showField:'docUsedTypeText',
+                    data:[{key:"dev",value:"浜屾寮�鍙戞墜鍐�"},{key:"deploy",value: "瀹炴柦閮ㄧ讲鏂囨。"},{key:"manual",value:"鐢ㄦ埛鎵嬪唽"},
+                        {key:"ui",value:"鍓嶇璧勬枡"},{key:"spring",value: "鍚庡彴寮�鍙戣祫鏂�"},{key:"ide",value: "缂栬瘧鍣ㄨ祫鏂�"},
+                        {key:"project",value: "椤圭洰绠$悊宸ュ叿璧勬枡"},{key:"design",value: "璁捐鏂规"},{key:"requirement",value: "闇�姹傛柟妗�"},
+                        {key:"acceptance",value: "楠屾敹鏂囨。"},{key:"button",value: "鎸夐挳閰嶇疆璇存槑"},{key:"update",value: "鏇存柊璇存槑"}],
+                    readOnly:onlyShow
+                } ];
+        };
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            that.addOrEdit(false,oid);
+        };
+        this.addOrEdit = function(add,oid) {
+            var that = this;
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var addSaveIndex =webUtil.dialog({
+                title:add?'娣诲姞甯姪鏂囨。':'淇敼甯姪鏂囨。',
+                btn:['淇濆瓨','鍙栨秷'],
+                skin:'layui-layer-lan',
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getFormItems(false),
+                        function () {
+                            if(!add){
+                                form.load(filter,{
+                                    backPath:that.backPath,
+                                    url:that.url.controller + that.url.getObjectByOid,
+                                    method:'get',
+                                    params:{
+                                        oid:oid
+                                    }
+                                });
+                            }else{
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+                        }, {}, {defaultColumnOneRow: 2});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        var url = that.url.controller + (add?that.url.addSave:that.url.editSave);
+                        webUtil.ajax(add?'post':'put',url,values,function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts= webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+        this.refresh = function () {
+            var that = this;
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+        this.IMPORT = function (oid){
+            var that = this;
+            var filter =that.id + "_upload";
+            var form = layui.form;
+            var uploadIndex = webUtil.dialog({
+                title:'瀵煎叆闄勪欢',
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" enctype="multipart/form-data"></form>',
+                area: ['300px', '300px'],
+                resize:false,
+                success:function(layero){
+                    //濡傛灉瀵煎叆鏈夊叾浠栨搷浣滐紝鍦ㄧ浜屼釜鍙傛暟涓坊鍔�
+                    form.addItems(filter,[],function(){
+                        $("#form_" + filter).append('<button type="button" class="layui-btn" id="' + that.id + '_upload_form_file" style="margin-left:100px;margin-top:80px;"><i class="layui-icon">&#xe67c;</i>閫夋嫨鏂囦欢鍚庤嚜鍔ㄥ鍏�</button>&nbsp;&nbsp;&nbsp;&nbsp;');
+                        var upload = layui.upload;
+                        //鎵ц瀹炰緥
+                        var uploadInst = upload.render({
+                            elem: '#' + that.id + '_upload_form_file' //缁戝畾鍏冪礌
+                            ,accept:'file'
+                            ,acceptMime:'file/*'
+                            ,data:{oid:oid}
+                            ,url: that.backPath + that.url.controller + that.url.importData
+                            ,done: function(result){
+                                if(result.success){
+                                    layer.close(uploadIndex);
+                                    webUtil.showMsgFromResult(result,"瀵煎叆鎴愬姛");
+                                    that.refresh();
+                                }else{
+                                    webUtil.showErrorMsg(result.msg);
+                                }
+                            }
+                            ,error: function(){
+                                //璇锋眰寮傚父鍥炶皟
+                                webUtil.showErrorMsg("涓婁紶寮傚父");
+                            }
+                        });
+                    },{},{
+                        defaultColumnOneRow:1
+                    });
+                }
+            });
+        };
+        this.DOWNLOAD = function (oid){
+            var that = this;
+            $webUtil.fileDownload(that.backPath + that.url.controller + that.url.downloadFile + "?oid=" + oid);
+        };
+        this.editContent = function (oid,data){
+            if($webUtil.isNull(data.fileExtension)|| data.fileExtension=='md'){
+                var menuObject = {
+                    id: 'editmarkdown'+oid,
+                    url: "USEJS:platform/objectService/markdown",
+                    text: '['+data.id+']['+data.name+']缂栬緫',
+                    multiCompent:true,
+                    initSourceData:data
+                };
+                portal.showTabByMenu(menuObject.id,menuObject);
+            }else{
+                $webUtil.showErrorMsg('涓嶆槸markdown鐨勬枃浠�,涓嶈兘缂栬緫');
+                return false;
+            }
+
+        };
+        this.ADVQUERY = function () {
+            var that = this;
+            if(!that.serinorQueryInstance) {
+                var dynamicCondition = layui.dynamicCondition;
+                $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar' + that.id + '" class="layui-inline"></div>');
+                that.checkColumns();
+                var dataFields = [];
+                for(var i = 0 ; i < that.columns.length ; i ++){
+                    dataFields[i] = that.columns[i];
+                }
+                that.serinorQueryInstance = dynamicCondition.create({
+                    fields: dataFields//鏌ヨ瀛楁
+                    , tableId: "table_" + that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                    , type: "complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                    , queryCallBack: function (requestData) {//鏌ヨ涔嬪悗鐨刢allback
+
+                    }
+                });
+            }
+            that.serinorQueryInstance.open();
+        };
+
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsAttribute.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsAttribute.js
new file mode 100644
index 0000000..45ffcb2
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsAttribute.js
@@ -0,0 +1,162 @@
+/**
+ * 灞炴�х殑鍊�
+ * @author weidy@2022-03-26
+ */
+layui.define(['layer','element','form','table','util'],function(exports){
+    var Class = function(){
+        this.MODELNAME = "platform/objectService/OsAttribute";
+        this.moduleKey = "OsAttribute";
+        this.id='OsAttribute';
+        this.sourceData={};
+        this.columns = [];
+        this.backPath =  configData.compatibility?path:configData.objectServicePath;
+        this.url={
+            controller:'attributeController/',
+            dataGrid:'gridAttribute',
+            addSave:'addSave',
+            editSave:'editSave',
+            deleteUrl:'delete',
+            getObjectByOid:'getObjectByOid',
+            listUsed:'listUsed'
+        };
+        this.buttonIconMap = {
+            SEARCH:'layui-icon-refresh-2',
+            SENIORSEARCH:'layui-icon-query',
+            ADD:'layui-icon-add-1',
+            EDIT:'layui-icon-edit',
+            DELETE:'layui-icon-delete'
+        };
+        this.vciFieldTypeMap = {
+            VTBoolean:"甯冨皵鍨�",
+            VTClob: "闀挎枃鏈�",
+            VTDate:"鏃ユ湡",
+            VTDateTime:"鏃ユ湡鏃堕棿",
+            VTTime:"鏃堕棿",
+            VTLong:"闀挎暣鍨�",
+            VTDouble:"閲戦/鍙岀簿搴�",
+            VTInteger:"鏁村舰",
+            VTFilePath:"鏂囦欢",
+            VTString:"瀛楃涓�"
+        };
+        this.getContent=function(){//杩斿洖杩欎釜缁勪欢鐨勫熀纭�html
+            var that = this;
+            var html = "";
+            html = [
+                    '<div class="layui-layout-border">',
+                        '<div class="layui-center">',
+                            that.getToolbarHtml(),
+                            '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                        '</div>',
+                    '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>',
+            ].join("");
+            return html;
+        };
+        this.init=function(){//鍩虹鐨刪tml琚坊鍔犲悗锛屽啀鎵ц鍒濆鍖�
+            var that = this;
+            $webUtil.copyConfig(that,that.moduleKey);
+            var table = layui.table;
+            that.checkColumns();//涓诲垪琛ㄤ腑鍒椼��
+            that.firstGridLoad = false;
+            table.render({
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                url:  that.url.controller + that.url.dataGrid,
+                backPath:that.backPath,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                selectMode:table.selectMode.muti,
+                cols: [that.columns]
+            });
+            $webUtil.createSearchHtml({
+                id:'鑻辨枃鍚嶇О',
+                name:'涓枃鍚嶇О'
+            },$("[layui-filter='toolbar_" + that.id + "']"),'table_' + that.id);
+            $webUtil.bindDefultButtonLisenter(that, that.id);
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){//濡傛灉鍏朵粬鍦版柟鎯充娇鐢ㄨ繖涓粍浠剁殑鏃跺�欙紝鍙互鑷畾涔夊垪
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),{
+                    field:'id',
+                    title:'灞炴�ц嫳鏂囧悕绉�',
+                    width:150
+                },{
+                    field:'name',
+                    title:'灞炴�т腑鏂囧悕绉�',
+                    width:200
+                },{
+                    field:'attributeLength',
+                    title:'闀垮害',
+                    width:80,
+                    templet:function (d){
+                        return d.attrLength || d.attributeLength;
+                    }
+                },{
+                    field:'attrDataType',
+                    title:'鏁版嵁绫诲瀷',
+                    width:80,
+                    templet:function(d){
+                        return that.vciFieldTypeMap[d.attrDataType] || that.vciFieldTypeMap[d.attributeDataType];
+                    }
+                },{
+                    field:'nullableFlag',
+                    title:'鏄惁鍙互涓虹┖',
+                    width:120,
+                    templet:function(d){
+                        return $webUtil.formateBoolean(d.nullableFlag);
+                    }
+                },{
+                    field:'defaultValue',
+                    title:'榛樿鍊�',
+                    width:80
+                },{
+                    field:'precisionLength',
+                    title:'灏忔暟绮惧害',
+                    width:80
+                },{
+                    field:'scaleLength',
+                    title:'灏忔暟鍒诲害',
+                    width:80
+                },{
+                    field:'range',
+                    title:'鍙栧�艰寖鍥�',
+                    width:100
+                },{
+                    field:'referFlag',
+                    title:'鏄惁鍙傜収',
+                    width:130,
+                    templet:function(d){
+                        return d.btmTypeId || "鍚�"
+                    }
+                },{
+                    field:'enumFlag',
+                    title:'鏄惁鏋氫妇',
+                    width:130,
+                    templet:function(d){
+                        return d.enumId || '鍚�'
+                    }
+                }];
+            }
+        };
+
+        this.refresh = function(){
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsAttributeForBtmRefer.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsAttributeForBtmRefer.js
new file mode 100644
index 0000000..27cf26d
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsAttributeForBtmRefer.js
@@ -0,0 +1,80 @@
+/**
+ * 涓氬姟绫诲瀷鐨勫睘鎬у弬鐓�
+ * @author weidy
+ * @date 2022-04-05
+ */
+layui.define(['layer','vciWebReferGrid'],function(exports){
+	var ReferGrid = function(){
+		this.backPath = (configData.compatibility?path:configData.objectServicePath);
+	};
+	ReferGrid.prototype.vciFieldTypeMap = {
+		VTBoolean:"甯冨皵鍨�",
+		VTClob: "闀挎枃鏈�",
+		VTDate:"鏃ユ湡",
+		VTDateTime:"鏃ユ湡鏃堕棿",
+		VTTime:"鏃堕棿",
+		VTLong:"闀挎暣鍨�",
+		VTDouble:"閲戦/鍙岀簿搴�",
+		VTInteger:"鏁村舰",
+		VTFilePath:"鏂囦欢",
+		VTString:"瀛楃涓�"
+	};
+	ReferGrid.prototype.showReferDialog = function (referConfig){
+		//鍙渶瑕佽缃粯璁ょ殑鍊硷紝璋冪敤VciWebReferGrid鍗冲彲
+		var that = this;
+		referConfig.options.url = referConfig.options.url?referConfig.options.url:'btmTypeController/gridAttributesByBtmId';
+		referConfig.options.backPath = referConfig.options.backPath?referConfig.options.backPath:that.backPath;
+		if(!("method" in referConfig.options)){
+			referConfig.options.method = 'get';
+		}
+		if(!('valueField' in referConfig.options)){
+			referConfig.options.valueField = 'id';
+		}
+		if(!('where' in referConfig.options)){
+			referConfig.options.where = {
+				btmTypeId:referConfig.options.btmTypeId
+			};
+		}
+		if(!("tableConfig" in referConfig.options)){
+			referConfig.options.tableConfig = {
+				limit:-1,
+				cols: [layui.table.getIndexColumn(), layui.table.getCheckColumn(), {
+					field: 'id',
+					title: '灞炴�ц嫳鏂囩紪鍙�',
+					sort:true,
+					width: 150
+				}, {
+					field: 'name',
+					title: '灞炴�т腑鏂囧悕绉�',
+					sort:true,
+					width: 160
+				},{
+					field: 'attributeLength',
+					title: '灞炴�ч暱搴�',
+					sort: true,
+					width: 90
+				},{
+					field:'attrDataType',
+					title:'灞炴�х被鍨�',
+					sort:true,
+					width:150,
+					templet:function (d){
+						return that.vciFieldTypeMap[d.attrDataType];
+					}
+				}],
+				queryColumns: [
+					{
+						field: 'name',
+						title: '灞炴�ц嫳鏂囩紪鍙�'
+					}, {
+						field: 'label',
+						title: '灞炴�т腑鏂囧悕绉�'
+					}
+					]
+			};
+		}
+		layui.vciWebReferGrid.showReferDialog(referConfig);
+	};
+	var rg = new ReferGrid();
+	exports('platform/objectService/OsAttributeForBtmRefer',rg);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsAttributeUtil.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsAttributeUtil.js
new file mode 100644
index 0000000..878db89
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsAttributeUtil.js
@@ -0,0 +1,111 @@
+/**
+ * 灞炴�х殑宸ュ叿绫伙紝鍙互鑾峰彇琛ㄥ崟鍜岃〃鏍肩殑鏄剧ず淇℃伅
+ * @author weidy
+ */
+layui.define(['layer','element','form','table','util'],function(exports){
+    var Class = function() {
+        this.MODELNAME = "platform/objectService/OsAttributeUtil";
+        this.moduleKey = "OsAttributeUtil";
+        this.id = 'OsAttributeUtil';
+        this.sourceData = {};
+        this.backPath = configData.compatibility?path:configData.objectServicePath;
+        this.url ={
+        };
+        this.vciFieldType = {
+            'VTString':'VTString',
+            'VTInteger':'VTInteger',
+            'VTLong':'VTLong',
+            'VTDobble':'VTDobble',
+            'VTDateTime':'VTDateTime',
+            'VTDate':'VTDate',
+            'VTTime':'VTTime',
+            'VTBoolean':'VTBoolean'
+        };
+        this.getFormItemsByAttributes = function(attributes){
+            var that = this;
+            //浣跨敤灞炴�ц幏鍙栬〃鍗曠殑鍏冪礌
+            if(attributes){
+                //璇存槑鏈夊睘鎬�
+                var formItems = [];
+                layui.each(attributes,function(_index,record) {
+                    var formItem = {};
+                    formItem['name'] = record.id;
+                    formItem['title'] = record.name;
+                    if (!record.nullableFlag) {
+                        formItem['required'] = true;
+                    }
+                    if (!$webUtil.isNotNull(record.defaultValue)) {
+                        formItem['defaultValue'] = record.defaultValue;
+                    }
+                    //濡傛灉鏄弬鐓�
+                    if (that.vciFieldType.VTString == record.attrDataType){
+                        if (record.referFlag) {
+                            formItem['type'] = 'refer';
+                            formItem['referConfig'] = {
+                                type: 'grid',
+                                url: that.url.commondRefer,
+                                backPath: that.backPath,
+                                textField: 'name',
+                                where: {
+                                    "btmTypeId": record.referBtmTypeId
+                                },
+                                valueField: 'oid',
+                                tableConfig: {
+                                    page: {
+                                        limit: 15,
+                                        page: 1
+                                    },
+                                    cols: [layui.table.getIndexColumn(), layui.table.getCheckColumn(), {
+                                        field: 'id',
+                                        title: '缂栧彿',
+                                        sort: true,
+                                        width: 150
+                                    }, {
+                                        field: 'name',
+                                        title: '鍚嶇О',
+                                        sort: true,
+                                        width: 150
+                                    }],
+                                    queryColumns: [{
+                                        field: 'id',
+                                        title: '缂栧彿'
+                                    }, {
+                                        field: 'name',
+                                        title: '鍚嶇О'
+                                    }]
+                                }
+                            };
+                        } else if (record.enumFlag) {
+                            //璇存槑鏄灇涓�
+                            formItem['type'] = 'combox';
+                            formItem['comboxKey'] = record.enumId;
+                        }else {
+                            //灏辨槸鏅�氱殑瀛楃涓诧紝杩欓噷涓嶅啀澶勭悊
+                        }
+                    }else if(that.vciFieldType.VTInteger == record.attrDataType
+                    || that.vciFieldType.VTLong == record.attrDataType
+                    || that.vciFieldType.VTDobble == record.attrDataType){
+                        formItem['verify'] = 'number';
+                    }else if(that.vciFieldType.VTBoolean == record.attrDataType){
+                        formItem['type'] = 'trueorfalse'
+                    }else if(that.vciFieldType.VTDateTime == record.attrDataType){
+                        formItem['type'] = 'datetime';
+                    }else if(that.vciFieldType.VTDate == record.attrDataType){
+                        formItem['type'] = 'date';
+                    }else if(that.vciFieldType.VTTime == record.attrDataType){
+                        formItem['type'] = 'time';
+                    }else{
+
+                    }
+                    formItems.push(formItem);
+                });
+                return formItems;
+            }else{
+                return [];
+            }
+        };
+
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsBtmType.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsBtmType.js
new file mode 100644
index 0000000..9d50167
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsBtmType.js
@@ -0,0 +1,354 @@
+/**
+ * 涓氬姟绫诲瀷
+ * @author weidy@2020-07-27
+ */
+layui.define(['layer','element','form','table','util','platform/objectService/er/erContent'],function(exports){
+    var Class = function(){
+        this.MODELNAME = "platform/objectService/OsBtmType";
+        this.moduleKey = "OsBtmType";
+        this.id='OsBtmType';
+        this.sourceData={};
+        this.columns = [];
+        this.backPath =  configData.compatibility?path:configData.objectServicePath;
+        this.url={
+            controller:'btmTypeController/',
+            dataGrid:'gridBtmType',
+            listAttribute:'gridAttributeByBtmTypeOid',
+            export2word:'exportBtmType2Word',
+            export2excel:'exportBtmType2Excel',
+            getER:'btmTypeController/createERDiagram',
+            getUsedER:'btmTypeController/createERUsed'
+        };
+        this.buttonIconMap = {
+            SEARCH:'layui-icon-refresh-2',
+            SENIORSEARCH:'layui-icon-query',
+            ADD:'layui-icon-add-1',
+            EDIT:'layui-icon-edit',
+            DELETE:'layui-icon-delete'
+        };
+        this.vciFieldTypeMap = {
+            VTBoolean:"甯冨皵鍨�",
+            VTClob: "闀挎枃鏈�",
+            VTDate:"鏃ユ湡",
+            VTDateTime:"鏃ユ湡鏃堕棿",
+            VTTime:"鏃堕棿",
+            VTLong:"闀挎暣鍨�",
+            VTDouble:"閲戦/鍙岀簿搴�",
+            VTInteger:"鏁村舰",
+            VTFilePath:"鏂囦欢",
+            VTString:"瀛楃涓�"
+        };
+        this.getContent=function(){
+            var that = this;
+            var html = "";
+            html = [
+                    '<div class="layui-layout-border">',
+                        '<div class="layui-center">',
+                            that.getToolbarHtml(),
+                            '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                        '</div>',
+                        '<div class="layui-south" >',
+                            '<table id="detail_table_',that.id ,'" lay-filter="detail_table_', that.id ,'"></table>',
+                        '</div>',
+                    '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_button_',that.id,'" class="layui-btn-container">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EXPORTWORD"><i class="layui-icon layui-icon-export"></i>瀵煎嚭鍒皐ord</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_VIEWER"><i class="layui-icon layui-icon-engine"></i>鏌ョ湅E-R鍥�</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_VIEWUSEER"><i class="layui-icon layui-icon-engine"></i>鏌ョ湅E-R鍥�(寮曠敤)</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EXPORTEXCEL"><i class="layui-icon layui-icon-export"></i>瀵煎嚭鍒版暟鎹瓧鍏�</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_CLEARCACHE"><i class="layui-icon layui-icon-export"></i>鍒锋柊鏈嶅姟鍣ㄧ紦瀛�</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>',
+            ].join("");
+            return html;
+        };
+        this.init=function(){//鍩虹鐨刪tml琚坊鍔犲悗锛屽啀鎵ц鍒濆鍖�
+            var that = this;
+            $webUtil.copyConfig(that,that.moduleKey);
+            var table = layui.table;
+            that.checkColumns();//涓诲垪琛ㄤ腑鍒椼��
+            that.firstGridLoad = false;
+            table.render({
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                url:  that.url.controller + that.url.dataGrid,
+                backPath:that.backPath,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                rowClick:function(filter,data){
+                    if(data){
+                        that.gridAttributeByOid(data.oid);
+                    }
+                },
+                done:function(res, cur, count){
+                    if(!that.firstGridLoad) {
+                        that.initDetailTable(((res && res.data) ? res.data[0].oid : ""));
+                        that.firstGridLoad = true;
+                    }else{
+                        if(count>0){
+                            that.gridAttributeByOid(res.data[0].oid);
+                        }
+                    }
+                }
+            });
+            $webUtil.createSearchHtml({
+                id:'鑻辨枃鍚嶇О',
+                name:'涓枃鍚嶇О'
+            },$("[layui-filter='toolbar_button_" + that.id + "']"),'table_' + that.id);
+            $webUtil.bindDefultButtonLisenter(that, that.id);
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){//濡傛灉鍏朵粬鍦版柟鎯充娇鐢ㄨ繖涓粍浠剁殑鏃跺�欙紝鍙互鑷畾涔夊垪
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),{
+                    field:'id',
+                    title:'涓氬姟绫诲瀷鑻辨枃',
+                    width:130
+                },{
+                    field:'name',
+                    title:'涓氬姟绫诲瀷涓枃',
+                    width:150
+                },{
+                    field:'description',
+                    title:'鎻忚堪',
+                    width:150
+                },{
+                    field:'tableName',
+                    title:'鏁版嵁搴撹〃',
+                    width:140
+                },{
+                    field:'revisionRuleId',
+                    title:'鐗堟湰瑙勫垯',
+                    width:130,
+                    templet:function(d){
+                        if(!d.revisionFlag){
+                            return '涓嶆帶鍒剁増鏈�';
+                        }else{
+                            return d.revisionRuleId + ' ' + d.revisionRuleName;
+                        }
+                    }
+                },{
+                    field:'lifeCycleFlag',
+                    title:'鐢熷懡鍛ㄦ湡',
+                    width:200,
+                    templet:function(d){
+                        if(!d.lifeCycleFlag){
+                            return '涓嶆帶鍒剁敓鍛藉懆鏈�';
+                        }else{
+                            return d.lifeCycleId + ' ' + d.lifeCycleName;
+                        }
+                    }
+                },{
+                    field:'secretFlag',
+                    title:'鎺у埗瀵嗙骇',
+                    width:80,
+                    templet:function(d){
+                        return $webUtil.formateBoolean(d.secretFlag);
+                    }
+                },{
+                    field:'viewFlag',
+                    title:'鏄惁涓鸿鍥�',
+                    width:90,
+                    templet:function(d){
+                        return $webUtil.formateBoolean(d.viewFlag);
+                    }
+                },{
+                    field:'versionRule',
+                    title:'鐗堟瑙勫垯',
+                    width:110
+                }];
+            }
+        };
+        this.gridAttributeByOid = function(btmTypeOid){
+            var that = this;
+            if($webUtil.isNull(btmTypeOid)){
+                return;
+            }
+            layui.table.reload("detail_" + that.id,{
+                where:{
+                    btmTypeOid: btmTypeOid
+                }
+            });
+        };
+        this.initDetailTable = function(btmTypeOid){
+            var that = this;
+            var table = layui.table;
+            that.checkDetailColumns();
+            table.render({
+                elem: '#detail_table_' + that.id,
+                id: 'detail_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller +  that.url.listAttribute,
+                where:{
+                    btmTypeOid:btmTypeOid
+                },
+                cols: [that.detailColumns]
+            });
+        };
+        this.checkDetailColumns = function () {
+            var that = this;
+            var table = layui.table;
+            if(that.detailColumns==null || that.detailColumns.length==0){//濡傛灉鍏朵粬鍦版柟鎯充娇鐢ㄨ繖涓粍浠剁殑鏃跺�欙紝鍙互鑷畾涔夊垪
+                that.detailColumns = [table.getIndexColumn(),table.getCheckColumn(),{
+                    field:'id',
+                    title:'灞炴�ц嫳鏂囧悕绉�',
+                    width:150
+                },{
+                    field:'name',
+                    title:'灞炴�т腑鏂囧悕绉�',
+                    width:200
+                },{
+                    field:'attributeLength',
+                    title:'闀垮害',
+                    width:80
+                },{
+                    field:'attrDataType',
+                    title:'鏁版嵁绫诲瀷',
+                    width:80,
+                    templet:function(d){
+                        return that.vciFieldTypeMap[d.attrDataType] || that.vciFieldTypeMap[d.attributeDataType];
+                    }
+                },{
+                    field:'nullableFlag',
+                    title:'鏄惁鍙互涓虹┖',
+                    width:120,
+                    templet:function(d){
+                        return $webUtil.formateBoolean(d.nullableFlag);
+                    }
+                },{
+                    field:'defaultValue',
+                    title:'榛樿鍊�',
+                    width:80
+                },{
+                    field:'precisionLength',
+                    title:'灏忔暟绮惧害',
+                    width:80
+                },{
+                    field:'scaleLength',
+                    title:'灏忔暟鍒诲害',
+                    width:80
+                },{
+                    field:'range',
+                    title:'鍙栧�艰寖鍥�',
+                    width:100
+                },{
+                    field:'referFlag',
+                    title:'鏄惁鍙傜収',
+                    width:130,
+                    templet:function(d){
+                        if(!d.referFlag){
+                            return '鍚�';
+                        }else{
+                            return d.referBtmTypeId
+                        }
+                    }
+                },{
+                    field:'enumFlag',
+                    title:'鏄惁鏋氫妇',
+                    width:130,
+                    templet:function(d){
+                        if(!d.enumFlag){
+                            return '鍚�';
+                        }else{
+                            return d.enumId
+                        }
+                    }
+                }];
+            }
+        };
+        this.refresh = function(){
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+        this.VIEWER = function(){
+            //er鍥�
+            var that = this;
+            var idFromGrid = $webUtil.getOidFromGrid("table_" + that.id,true,true,"id");
+            var nameFromGrid = $webUtil.getOidFromGrid("table_" + that.id,true,true,"name");
+            if(!idFromGrid){
+                return false
+            }
+            var erContent = layui['platform/objectService/er/erContent'];
+            var filter = "er_" + that.id;
+            var erIndex = layer.open({
+                type: 1,
+                title: nameFromGrid+' E-R鍥� (涓嶆敮鎸両E8)',
+                content: '<div id="' + filter + '"  ></div>',
+                fullScreen:true,
+                shade: true,
+                shadeClose: true,
+                resize: false,
+                success: function (layero) {
+                    $("#" + filter).html(erContent.getContent(idFromGrid));
+                    erContent.init(idFromGrid,{
+                        id:idFromGrid,
+                        url:that.url.getER
+                    });
+                }
+            });
+        };
+        this.VIEWUSEER = function (){
+           //浣跨敤褰撳墠涓氬姟绫诲瀷鐨�
+            var that = this;
+            var idFromGrid = $webUtil.getOidFromGrid("table_" + that.id,true,true,"id");
+            var nameFromGrid = $webUtil.getOidFromGrid("table_" + that.id,true,true,"name");
+            if(!idFromGrid){
+                return false;
+            }
+            var erContent = layui['platform/objectService/er/erContent'];
+            var filter = "er_" + that.id;
+            var erIndex = layer.open({
+                type: 1,
+                title: "寮曠敤 " +nameFromGrid+' E-R鍥� (涓嶆敮鎸両E8)',
+                content: '<div id="' + filter + '"  ></div>',
+                fullScreen:true,
+                shade: true,
+                shadeClose: true,
+                resize: false,
+                success: function (layero) {
+                    $("#" + filter).html(erContent.getContent(idFromGrid));
+                    erContent.init(idFromGrid, {
+                        id: idFromGrid,
+                        url: that.url.getUsedER
+                    });
+                }
+            });
+        };
+        this.EXPORTWORD = function(){
+            //瀵煎嚭word
+            var that = this;
+            var oidFromGrid = $webUtil.getOidFromGrid("table_" + that.id,false,false,"id");
+            $webUtil.fileDownloadPost(that.backPath + that.url.controller + that.url.export2word,{btmTypeIds:oidFromGrid});
+        };
+        this.EXPORTEXCEL = function(){
+            var that = this;
+            var oidFromGrid = $webUtil.getOidFromGrid("table_" + that.id,false,false,"id");
+            $webUtil.fileDownloadPost(that.backPath + that.url.controller + that.url.export2excel,{btmTypeIds:oidFromGrid});
+        };
+        this.CLEARCACHE = function (){
+            var that = this;
+            $webUtil.get("/webUIController/clearCache",{},function (result){
+                if(result.success){
+                    $webUtil.showMsgFromResult(result,"鎵ц鎴愬姛");
+                }else{
+                    $webUtil.showErrorMsg(result.msg);
+                }
+            },function (error,xhr){
+                $webUtil.showErrorMsg("娌℃湁閾炬帴涓婂悗鍙版湇鍔�");
+            },that.backPath)
+        }
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsBtmTypeRefer.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsBtmTypeRefer.js
new file mode 100644
index 0000000..00b07dc
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsBtmTypeRefer.js
@@ -0,0 +1,70 @@
+/**
+ * 涓氬姟绫诲瀷鐨勫弬鐓�
+ * @author weidy
+ * @date 2022-04-05
+ */
+layui.define(['layer','vciWebReferGrid'],function(exports){
+	var ReferGrid = function(){
+		this.backPath = (configData.compatibility?path:configData.objectServicePath);
+	};
+	ReferGrid.prototype.vciFieldTypeMap = {
+		VTBoolean: "甯冨皵鍨�",
+		VTClob: "闀挎枃鏈�",
+		VTDate: "鏃ユ湡",
+		VTDateTime: "鏃ユ湡鏃堕棿",
+		VTTime: "鏃堕棿",
+		VTLong: "闀挎暣鍨�",
+		VTDouble: "閲戦/鍙岀簿搴�",
+		VTInteger: "鏁村舰",
+		VTFilePath: "鏂囦欢",
+		VTString: "瀛楃涓�"
+	};
+	ReferGrid.prototype.showReferDialog = function (referConfig){
+		//鍙渶瑕佽缃粯璁ょ殑鍊硷紝璋冪敤VciWebReferGrid鍗冲彲
+		var that = this;
+		referConfig.options.url = referConfig.options.url?referConfig.options.url:'btmTypeController/referDataGrid';
+		referConfig.options.backPath = referConfig.options.backPath?referConfig.options.backPath:that.backPath;
+		if(!("method" in referConfig.options)){
+			referConfig.options.method = 'get';
+		}
+		if(!('valueField' in referConfig.options)){
+			referConfig.options.valueField = 'id';
+		}
+		if(!("tableConfig" in referConfig.options)){
+			referConfig.options.tableConfig = {
+				page: {
+					limit: 15,
+					page: 1
+				},
+				cols: [layui.table.getIndexColumn(), layui.table.getCheckColumn(), {
+					field: 'id',
+					title: '涓氬姟绫诲瀷缂栧彿',
+					sort:true,
+					width: 150
+				}, {
+					field: 'name',
+					title: '涓氬姟绫诲瀷鍚嶇О',
+					sort:true,
+					width: 160
+				}, {
+					field: 'description',
+					title: '鎻忚堪',
+					sort:true,
+					width: 200
+				}],
+				queryColumns: [
+					{
+						field: 'id',
+						title: '涓氬姟绫诲瀷缂栧彿'
+					}, {
+						field: 'name',
+						title: '涓氬姟绫诲瀷鍚嶇О'
+					}
+					]
+			};
+		}
+		layui.vciWebReferGrid.showReferDialog(referConfig);
+	};
+	var rg = new ReferGrid();
+	exports('platform/objectService/OsBtmTypeRefer',rg);
+});
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsCodeGenerator.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsCodeGenerator.js
new file mode 100644
index 0000000..f281859
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsCodeGenerator.js
@@ -0,0 +1,584 @@
+/**
+ * 浠g爜鐢熸垚鍣�
+ * @author weidy@2020-07-30
+ */
+layui.define(['layer','element','form','table','util'],function(exports){
+    var Class = function(){
+        this.MODELNAME = "platform/objectService/OsCodeGenerator";
+        this.moduleKey = "OsCodeGenerator";
+        this.id='OsCodeGenerator';
+        this.sourceData={};
+        this.columns = [];
+        this.backPath =  configData.compatibility?path:configData.objectServicePath;
+        this.url={
+            controller:'codeGenSchemaController/',
+            dataGrid:'gridSchema',
+            referBtmType:'btmTypeController/referDataGrid',
+            add:'addSchema',
+            edit:'editSchema',
+            preview:'previewCodeFile',
+            downloadFile:'downloadCodeFile',
+            productCodeFile:'productCodeFile',
+            getObjectByOid:'getObjectByOid',
+            getBtmTypeByOid:'btmTypeController/getBtmTypeByOid'
+        };
+        this.buttonIconMap = {
+            SEARCH:'layui-icon-refresh-2',
+            SENIORSEARCH:'layui-icon-query',
+            ADD:'layui-icon-add-1',
+            EDIT:'layui-icon-edit',
+            DELETE:'layui-icon-delete'
+        };
+        this.panelTypeCombox = [{
+            "key":"tree",
+            "value":"鏍戝舰"
+        },{
+            "key":"table",
+            "value":"琛ㄦ牸"
+        },{
+            "key":"table_tree",
+            "value":"鏍戣〃"
+        },{
+            "key":"form",
+            "value":"琛ㄥ崟"
+        }];
+        this.getContent=function(){
+            var that = this;
+            var html = "";
+            html = [
+                    '<div class="layui-layout-border">',
+                        '<div class="layui-north" style="height:35px;overflow-x: hidden; background-color: white">',
+                            '<label style="margin-left:50px;width:200px;">鎵弿鍖呯殑璺緞:</label><input type="text" style="width:500px;height:25px;" name="packName" id="',that.id,'_pack" value="" />',
+                        '</div>',
+                        '<div class="layui-center">',
+                            that.getToolbarHtml(),
+                            '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                            '<div id="toolbar_column_',that.id ,'" style="display:none;"></div>',
+                        '</div>',
+                    '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_button_',that.id,'" class="layui-btn-container">',
+                '<a class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_SCAN"><i class="layui-icon layui-icon-search"></i>鎵弿鍖�</a>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADDBYBTMTYPE"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>',
+            ].join("");
+            return html;
+        };
+        this.init=function(){
+            var that = this;
+            $webUtil.copyConfig(that,that.moduleKey);
+            var table = layui.table;
+            that.checkColumns();
+            that.firstGridLoad = false;
+            table.render({
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                url:  that.url.controller + that.url.dataGrid,
+                backPath:that.backPath,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'CONFIG'){
+                                that.editSchema(data.oid,data.id,data.name);
+                            }else if(layEvent == 'PRODUCT'){
+                                that.productCodeFile(data.oid);
+                            }else if(layEvent == 'PREVIEW'){
+                                that.previewCodeFile(data.oid,data.name);
+                            }else{
+                                that.downloadCodeFile(data.oid);
+                            }
+                        });
+                    }
+                    that.fristMainLoad = true;
+                },
+            });
+            $webUtil.createSearchHtml({
+                id:'涓氬姟绫诲瀷鑻辨枃鍚嶇О',
+                name:'涓氬姟绫诲瀷涓枃鍚嶇О'
+            },$("[layui-filter='toolbar_button_" + that.id + "']"),'table_' + that.id);
+            $webUtil.bindDefultButtonLisenter(that, that.id);
+            document.getElementById("toolbar_column_" + that.id).innerHTML =
+                     '<a class="layui-btn layui-btn-intable" lay-event="CONFIG">閰嶇疆</a>' + 
+                     '<a class="layui-btn layui-btn-intable" lay-event="PRODUCT">鐢熸垚</a>' +
+                     '<a class="layui-btn layui-btn-intable" lay-event="PREVIEW">棰勮</a>' +
+                     '<a class="layui-btn layui-btn-intable" lay-event="DOWNLOAD">涓嬭浇</a>' ;
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){
+                that.columns = [table.getIndexColumn(),{
+                    field:'id',
+                    title:'涓氬姟绫诲瀷鑻辨枃',
+                    width:130
+                },{
+                    field:'name',
+                    title:'涓氬姟绫诲瀷涓枃',
+                    width:150
+                },{
+                    field:'description',
+                    title:'鎻忚堪',
+                    width:150
+                },{
+                    field:'author',
+                    title:'浣滆��',
+                    width:100
+                },{
+                    field:'lastProductDate',
+                    title:'鏈�鍚庣敓鎴愭椂闂�',
+                    width:135,
+                    templet:function(d){
+                        return $webUtil.formateDateTimeNoSecond(d.lastProductDate);
+                    }
+                },{
+                    field:'options',
+                    title:'鎿嶄綔',
+                    width:200,
+                    toolbar: '#toolbar_column_' + that.id
+                }];
+            }
+        };
+        this.refresh = function(){
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+        this.SCAN = function () {
+            var that = this;
+
+            var packName = $("#" + that.id + "_pack").val();
+            if($webUtil.isNull(packName)){
+                $webUtil.showErrorMsg("璇锋偍鍏堣緭鍏ュ寘鍚�");
+                return false;
+            }
+            $webUtil.post('scanAnnotationController/scanAnnotation',{packName:packName},function (result) {
+                if(result.success){
+                    $webUtil.showMsgFromResult(result,"鎵弿娉ㄨВ鎴愬姛锛岃绛夊緟涓�浼氭鏌ヤ竴涓嬩笟鍔$被鍨嬬殑鏁版嵁搴撹〃鏄惁鍒涘缓瀹屾垚");
+                }else{
+                    $webUtil.showErrorMsg(result.msg);
+                }
+            },function (err,xhr){
+                $webUtil.showErrorMsg("閾炬帴鏈嶅姟鍑洪敊");
+            },that.backPath);
+        };
+        this.ADDBYBTMTYPE = function(){
+            var that = this;
+            var filter = "btmtype_" + that.id;
+            var auditedHistory =$webUtil.dialog({
+                title: '浠庝笟鍔$被鍨嬩腑閫夋嫨娣诲姞鐨勬柟妗�',
+                btn:['涓嬩竴姝�(閰嶇疆鏂规)','鍙栨秷'],
+                content: '<div layui-filter="toolbar_button_' + filter + '" class="layui-btn-container" style="margin-left:10px;margin-top:10px;"></div><table id="dialog_table' + filter + '" lay-filter="' + filter + '" class="layui-table"></table>',
+                fullScreen:true,
+                resize: false,
+                success: function (layero) {
+                    var table = layui.table;
+                    that.checkBtmTypeColumns();//涓诲垪琛ㄤ腑鍒椼��
+                    table.render({
+                        elem: '#dialog_table' + filter,
+                        id: 'dialog_table' + filter,
+                        backPath:that.backPath,
+                        url:that.url.referBtmType,
+                        selectMode:table.selectMode.single,
+                        cols: [that.btmTypeColumns],
+                        page:{
+                            limit:25,
+                            page:1
+                        }
+                    });
+                    $webUtil.createSearchHtml({
+                        id:'涓氬姟绫诲瀷鑻辨枃鍚嶇О',
+                        name:'涓氬姟绫诲瀷涓枃鍚嶇О'
+                    },$("[layui-filter='toolbar_button_" + filter + "']"),'dialog_table' + filter);
+                },
+                yes:function(){
+                    var table = layui.table;
+                    var oid = $webUtil.getOidFromGrid('dialog_table' + filter,true,true);
+                    if(!oid){
+                        return false;
+                    }
+                    $webUtil.get(that.url.getBtmTypeByOid,{oid:oid},function(result){
+                        if(result.success){
+                            layer.close(auditedHistory);
+                            var btmType = result.obj;
+                            var defaultValueByBtm ={
+                                pkBtmType:btmType.oid,
+                                id:btmType.id,
+                                name:btmType.name
+                            };
+                            if($webUtil.isNotNull(btmType.implClass) && btmType.implClass.indexOf(".") > -1){
+                                //com.vci.xx.model.yyy鐨勬柟寮�
+                                var package = btmType.implClass.substring(0,btmType.implClass.lastIndexOf("."));
+                                defaultValueByBtm['doPackage'] = package;
+                                if($webUtil.endWith(package,".model")){
+                                    defaultValueByBtm['voPackage'] = package.replace(".model",".pagemodel");
+                                    defaultValueByBtm['dtoPackage'] = package.replace(".model",".dto");
+                                    defaultValueByBtm['controllerPackage'] = package.replace(".model",".controller");
+                                    defaultValueByBtm['servicePackage'] = package.replace(".model",".service");
+                                    defaultValueByBtm['mapperPackage'] = package.replace(".model",".mapper");
+                                    var className = btmType.implClass.substring(btmType.implClass.lastIndexOf(".") + 1);
+                                    if($webUtil.endWith(className,"DO")){
+                                        className = className.substring(0,className.length-2);
+                                    }
+                                    defaultValueByBtm['controllerRequestMap'] = "/" + className.substring(0,1).toLowerCase() + className.substring(1) + "Controller";
+                                }
+                            }
+                            //鐪嬬湅鏈夋病鏈夎嚜鍙傜収鐨勭被鍨�
+                            if(btmType.attributes){
+                                layui.each(btmType.attributes,function(_index,attribute){
+                                    if(attribute.referBtmTypeId && attribute.referBtmTypeId.toUpperCase() == btmType.id.toUpperCase()){
+                                        defaultValueByBtm.westLayoutPanelType = 'tree';
+                                        defaultValueByBtm.westNextRegionParam = '{' + attribute.id + ':that.currentItemAttributes.oid}';
+                                        return true;
+                                    }
+                                })
+                            }
+                            //鏄笉鏄钩鍙伴�氱敤鐨勭敓鍛藉懆鏈�
+                            if(btmType.lifeCycleFlag && btmType.lifeCycleId && btmType.lifeCycleId == 'frameworkDataLc'){
+                                defaultValueByBtm.centerButtons = '{ADD:"娣诲姞",EDIT:"淇敼",DEL:"鍒犻櫎",ADVQUERY:"鏌ヨ",refresh:"鍒锋柊",DISABLE:"鍋滅敤",ENABLE:"鍚敤"}';
+                            }
+                            if(("doPackage" in defaultValueByBtm) 
+                                && defaultValueByBtm['doPackage'] == 'com.vci.frameworkcore.model'){
+                                if(defaultValueByBtm.centerButtons){
+                                    defaultValueByBtm.centerButtons = defaultValueByBtm.centerButtons.replace("}",',EXPORT:"瀵煎嚭",IMPORT:"瀵煎叆"}');
+                                }else{
+                                    defaultValueByBtm.centerButtons = '{ADD:"娣诲姞",EDIT:"淇敼",DEL:"鍒犻櫎",ADVQUERY:"鏌ヨ",refresh:"鍒锋柊",EXPORT:"瀵煎嚭",IMPORT:"瀵煎叆"}';
+                                }
+                            }
+                            that.editSchema(null,result.obj.id,result.obj.name,defaultValueByBtm);
+                        }else{
+                            $webUtil.showErrorMsg(result.msg);    
+                        }
+                    },function(xhr,error){
+                        $webUtil.showErrorMsg("鑾峰彇涓氬姟绫诲瀷鐨勫睘鎬т俊鎭嚭閿欎簡锛屽彲鑳芥槸鏈嶅姟娌℃湁鍚姩");
+                    },that.backPath);
+                   
+                },
+                btn2:function(layero){
+                    that.refresh();
+                    layer.close(auditedHistory);
+                }
+            });
+        };
+        this.checkBtmTypeColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.btmTypeColumns==null || that.btmTypeColumns.length==0){//濡傛灉鍏朵粬鍦版柟鎯充娇鐢ㄨ繖涓粍浠剁殑鏃跺�欙紝鍙互鑷畾涔夊垪
+                that.btmTypeColumns = [table.getIndexColumn(),table.getCheckColumn(),{
+                    field:'id',
+                    title:'涓氬姟绫诲瀷鑻辨枃',
+                    width:130
+                },{
+                    field:'name',
+                    title:'涓氬姟绫诲瀷涓枃',
+                    width:150
+                },{
+                    field:'description',
+                    title:'鎻忚堪',
+                    width:150
+                },{
+                    field:'tableName',
+                    title:'鏁版嵁搴撹〃',
+                    width:140
+                },{
+                    field:'revisionRuleId',
+                    title:'鐗堟湰瑙勫垯',
+                    width:130,
+                    templet:function(d){
+                        if(!d.revisionFlag){
+                            return '涓嶆帶鍒剁増鏈�';
+                        }else{
+                            return d.revisionRuleId + ' ' + d.revisionRuleName;
+                        }
+                    }
+                },{
+                    field:'lifeCycleFlag',
+                    title:'鐢熷懡鍛ㄦ湡',
+                    width:200,
+                    templet:function(d){
+                        if(!d.lifeCycleFlag){
+                            return '涓嶆帶鍒剁敓鍛藉懆鏈�';
+                        }else{
+                            return d.lifeCycleId + ' ' + d.lifeCycleName;
+                        }
+                    }    
+                },{
+                    field:'secretFlag',
+                    title:'鎺у埗瀵嗙骇',
+                    width:80,
+                    templet:function(d){
+                        return $webUtil.formateBoolean(d.secretFlag);
+                    }
+                },{
+                    field:'viewFlag',
+                    title:'鏄惁涓鸿鍥�',
+                    width:90,
+                    templet:function(d){
+                        return $webUtil.formateBoolean(d.viewFlag);
+                    }
+                },{
+                    field:'versionRule',
+                    title:'鐗堟瑙勫垯',
+                    width:110
+                }];
+            }
+        };
+        this.editSchema = function(schemaOid,btmTypeId,btmTypeName,defaultValueByBtm){
+            var that = this;
+            var isEdit = true;
+            if(defaultValueByBtm && $webUtil.isNotNull(defaultValueByBtm.pkBtmType)){
+                //璇存槑鏄柊澧�
+                isEdit = false;
+            }
+            var form = layui.form;
+            var filter = that.id + "_addOrSchema" ;
+            var addOrEditIndex = $webUtil.dialog({
+                targetObject:that,
+                title: isEdit?'閰嶇疆鐢熸垚鏂规':'鏂板浠g爜鐢熸垚鏂规',
+                btn: ['淇濆瓨', '鍙栨秷'],
+                content: '<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                resizing: function (layero) {
+                    form.doResize(filter);
+                },
+                fullScreen:true,
+                success: function (layero) {
+                    form.addItems(filter,that.getFormItems(),
+                    function () {
+                        if(!isEdit) {
+                            form.setValues(defaultValueByBtm,filter);
+                        }else {
+                            form.load(filter,{
+                                url: that.url.controller + that.url.getObjectByOid,
+                                backPath:that.backPath,
+                                method:'get',
+                                params:{
+                                    oid:schemaOid
+                                }
+                            });
+                        }
+                    }
+                    , {}
+                    , {
+                        defaultColumnOneRow: 2,
+                        labelWidth:180
+                    });
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var submitValues = form.getValues(filter,true);
+                        if(submitValues['backPath'] == "configData."){
+                            $webUtil.showErrorMsg("鐣岄潰鍚庡彴璺緞娌℃湁杈撳叆鍊�");
+                            return false;
+                        }
+                        var useLayoutRegion = [];
+                        for(var key in submitValues){
+                            if($webUtil.startWith(key,'useLayoutRegion')){
+                                useLayoutRegion.push(key.replace("useLayoutRegion","").replace("[","").replace("]",""));
+                                delete submitValues[key];
+                            }
+                        }
+                        submitValues['useLayoutRegion'] = useLayoutRegion.join((","));
+                        submitValues['genDOFlag'] = 'true';
+                        submitValues['genVOFlag'] = 'true';
+                        submitValues['genDTOFlag'] = 'true';
+                        $webUtil.ajax(isEdit?'PUT':'POST',that.url.controller + (isEdit?that.url.edit:that.url.add),submitValues,function (result) {
+                            if(result.success){
+                                $webUtil.showMsgFromResult(result,(isEdit?"閰嶇疆鏂规鎴愬姛":"娣诲姞鏂规鎴愬姛"));
+                                that.refresh();
+                                layer.close(addOrEditIndex);
+                            }else{
+                                $webUtil.showErrorMsg(result.msg);
+                            }
+                        },function (xhr,error) {
+                            $webUtil.showErrorMsg("淇濆瓨浠g爜鐢熸垚鏂规鍑洪敊锛屽彲鑳芥槸鏈嶅姟娌℃湁鍚姩");
+                        },that.backPath);
+                    }
+                }
+            });
+        };
+        this.getFormItems = function(){ 
+            var that = this;
+            return [{
+                field: 'id',
+                text: '涓氬姟绫诲瀷缂栧彿',
+                required:true,
+                readOnly:true
+            },{   
+                field: 'name',
+                text: '涓氬姟绫诲瀷鍚嶇О',
+                required:true
+            },{
+                field: 'description',
+                text: '鏂规鎻忚堪'
+            },{
+                field:'author',
+                text:'浣滆��',
+                required:true
+            },{
+                field:'fileEncode',
+                text:'鏂囦欢瀛楃闆�',
+                defaultValue:'UTF-8'
+            },{
+                field:'domemo',
+                type:'label',
+                isNewRow:true,
+                text:'鏁版嵁搴撳疄浣撴枃浠跺寘鍚嶏紝涓�鑸笟鍔$被鍨嬬敓鎴愭椂宸茬粡鍖呭惈浜�;鏄剧ず瀵硅薄鏄寚鍚庡彴杩斿洖缁欏墠绔殑瀵硅薄;鏁版嵁浼犺緭瀵硅薄鏄悗鍙扮敤鏉ユ帴鏀跺墠绔紶閫掔殑鏁版嵁鐨勫璞�;蹇呴』鏈変腑蹇冨尯',
+                labelWidth:1000
+            },{
+                field:'doPackage',
+                text:'鏁版嵁搴撳疄浣撳寘',
+                isNewRow:true,
+                inputWidth:860
+            },{
+                field:'voPackage',
+                text:'鏄剧ず瀵硅薄璺緞',
+                required:true,
+                isNewRow:true,
+                inputWidth:860
+            },{
+                field:'dtoPackage',
+                text:'鏁版嵁浼犺緭瀵硅薄璺緞',
+                required:true,
+                isNewRow:true,
+                inputWidth:860
+            },{
+                field:'controllerPackage',
+                text:'controller鐨勫寘鍚�',
+                required:true,
+                isNewRow:true,
+                inputWidth:860
+            },{
+                field:'controllerRequestMap',
+                text:'controller鐨勮姹傚湴鍧�',
+                required:true,
+                useAllWidth:true,
+                inputWidth:860
+            },{
+                field:'servicePackage',
+                text:'鏈嶅姟鍖呭悕',
+                required:true,
+                useAllWidth:true,
+                inputWidth:860
+            },{
+                field:'mapperPackage',
+                text:'鏁版嵁搴撴搷浣滃寘鍚�',
+                required:true,
+                useAllWidth:true,
+                inputWidth:860
+            },{
+                field:'mapperXmlPackage',
+                text:'mybatis鐨剎ml浣嶇疆',
+                required:true,
+                defaultValue:'mybatis'
+            },{
+                field:'jsPackage',
+                text:'鐣岄潰鐨勮矾寰�(鍒癹s鍚�)',
+                required:true,
+                inputWidth:450
+            },{
+                field:'centerLayoutPanelType',
+                type:'combox',
+                comboxKey:'codeGenPanelType1',
+                text:'涓績浣跨敤鐨勯潰鏉�',
+                required:true,
+                defaultValue:'table',
+                data:[{key:'table_tree',value:'鏍戣〃'},{key:'table',value:'琛ㄦ牸'},{key:'form',value:'琛ㄥ崟'}]
+            },{
+                field:'backPath',
+                text:'鐣岄潰涓婄殑backPath',
+                defaultValue:'configData.',
+                inputWidth:450
+            },{
+                field:'centerQueryConfig',
+                text:'涓績鏌ヨ鏉′欢',
+                useAllWidth:true ,
+                defaultValue:'{id:"缂栧彿",name:"鍚嶇О"}',
+                inputWidth:860
+            },{
+                field:'centerButtons',
+                text:'涓績鎸夐挳',
+                useAllWidth:true ,
+                defaultValue:'{ADD:"娣诲姞",EDIT:"淇敼",DEL:"鍒犻櫎",ADVQUERY:"鏌ヨ",refresh:"鍒锋柊"}',
+                inputWidth:860
+            },{
+                field:'westLayoutPanelType',
+                type:'combox',
+                comboxKey:'codeGenPanelType',
+                text:'瑗垮尯浣跨敤鐨勯潰鏉�',
+                isNewRow:true,
+                defaultValue:'tree',
+                data:[{key:"tree",value:'鏍戝舰'}]
+            },{
+                field:'useLayoutRegion',
+                type:'combox',
+                comboxKey:'useLayoutRegion',
+                text:'鏄惁浣跨敤瑗垮尯',
+                data:[{key:"west",value:'瑗垮尯'}],
+                isCheckbox:true,
+                required:true,
+                inputWidth:450
+            },{
+                field:'westQueryConfig',
+                text:'瑗垮尯鏌ヨ鏉′欢',
+                useAllWidth:true ,
+                inputWidth:860
+            },{
+                field:'westNextRegionParam',
+                text:'瑗垮尯浼犻�掑埌涓嬩竴鍖哄煙鍙傛暟',
+                useAllWidth:true ,
+                inputWidth:860
+            },{
+                field:'westButtons',
+                text:'瑗垮尯鎸夐挳',
+                useAllWidth:true,
+                inputWidth:860 
+            }];
+        };
+        this.productCodeFile = function(oid){
+            var that = this;
+            if(!oid){
+                return false;
+            }
+            $webUtil.post(that.url.controller + that.url.productCodeFile,{oid:oid},function(result){
+                if(result.success){
+                    $webUtil.showMsgFromResult(result,"鐢熸垚浠g爜鎴愬姛");
+                    that.refresh();
+                }else{
+                    $webUtil.showErrorMsg(result.msg);
+                }
+            },function(xhr,error){
+                $webUtil.showErrorMsg("鐢熸垚浠g爜澶辫触锛屽彲鑳芥槸鏈嶅姟鍣ㄦ病鏈夊惎鍔�");
+            },that.backPath);
+        };
+        this.previewCodeFile = function(oid,text){
+            var that = this;
+            if(!oid){
+                return false;
+            }
+            portal.showTabByMenu(that.id + oid,{
+                id:that.id + oid,
+                text:'鏌ョ湅浠g爜[' + text + "]",
+                url:'USEJS:platform/objectService/OsCodePreview?oid=' + oid
+            });
+        };
+        this.downloadCodeFile = function(oid){
+            var that = this;
+            var iframeId = MD5(oid + $webUtil.getSystemVar($webUtil.systemValueKey.userOid));
+            $webUtil.fileDownload(that.backPath + that.url.controller + that.url.downloadFile + "?" + TOKEN_KEY + "=" + $webUtil.getToken()  + "&downloadUUID=" + iframeId + "&oid=" + oid);
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsCodeGeneratorComp.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsCodeGeneratorComp.js
new file mode 100644
index 0000000..15856b0
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsCodeGeneratorComp.js
@@ -0,0 +1,532 @@
+/**
+ * 鎵弿鍖呯殑宸ュ叿,浠g爜鐢熸垚鍣�--鍏煎骞冲彴鐨勭増鏈�
+ * @author weidy@2021/08/21
+ */
+layui.define(['layer','element','form','table','upload'],function(exports){
+    'use strict';
+    var Class = function(){
+        this.MODELNAME = "platform/objectService/OsCodeGeneratorComp";
+        this.moduleKey = "OsCodeGeneratorComp";
+        this.backPath =  configData.compatibility? path:configData.objectServicePath;
+        this.url = {
+            controller:'codeGenSchemaController/',
+            dataGrid:'gridSchema',
+            referBtmType:'btmTypeController/referDataGrid',
+            add:'addSchema',
+            edit:'editSchema',
+            preview:'previewCodeFile',
+            downloadFile:'downloadCodeFile',
+            productCodeFile:'productCodeFile',
+            getObjectByOid:'getObjectByOid',
+            getBtmTypeByOid:'btmTypeController/getBtmTypeByOid'
+        };
+        this.getContent=function(){//杩斿洖杩欎釜缁勪欢鐨勫熀纭�html
+            var that = this;
+            var html = "";
+            html = [
+                '<div class="layui-layout" style="display:block;overflow-x: hidden;">',
+                '<div class="layui-layout-border" style="display:block;margin-top:0px;overflow-x: hidden; " id="border_',that.id,'">',
+                '<div class="layui-north" style="height:35px;overflow-x: hidden; background-color: white">',
+                '<label style="margin-left:50px;width:200px;">鎵弿鍖呯殑璺緞:</label><input type="text" style="width:500px;height:25px;" name="packName" id="',that.id,'_pack" value="com.vci." />',
+                '</div>',
+                '<div class="layui-center" style="overflow-y:auto;overflow-x: hidden; ">',
+                that.getToolbarHtml(),
+                '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                '<div id="toolbar_column_',that.id ,'" style="display:none;"></div>',
+                '</div>',
+                '</div>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var head =['<div layui-filter="toolbar_button_',that.id,'" class="layui-btn-container">'];
+            var html = [];
+            html.push([
+                '<a class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_SCAN"><i class="layui-icon layui-icon-search"></i>鎵弿鍖�</a>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADDBYBTMTYPE"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>'
+            ].join(''));
+            html.push('</div>');
+            return head.join("") + html.join("");
+        };
+        this.init = function(){
+            var that = this;
+            $webUtil.copyConfig(that,that.moduleKey);
+            layui.element.init();
+            that.initMainTable();
+            that.createSearchHtml();
+        };
+        this.initMainTable = function () {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            that.firstGridLoad = false;
+            table.render({
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                url:  that.url.controller + that.url.dataGrid,
+                backPath:that.backPath,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'CONFIG'){
+                                that.editSchema(data.oid,data.id,data.name);
+                            }else if(layEvent == 'PRODUCT'){
+                                that.productCodeFile(data.oid);
+                            }else if(layEvent == 'PREVIEW'){
+                                that.previewCodeFile(data.oid,data.name);
+                            }else{
+                                that.downloadCodeFile(data.oid);
+                            }
+                        });
+                    }
+                    that.fristMainLoad = true;
+                },
+            });
+        };
+        this.panelTypeCombox = [{
+            "key":"tree",
+            "value":"鏍戝舰"
+        },{
+            "key":"table",
+            "value":"琛ㄦ牸"
+        },{
+            "key":"table_tree",
+            "value":"鏍戣〃"
+        },{
+            "key":"form",
+            "value":"琛ㄥ崟"
+        }];
+        this.createSearchHtml = function () {
+            var that=this;
+            $webUtil.createSearchHtml({
+                id:'涓氬姟绫诲瀷鑻辨枃鍚嶇О',
+                name:'涓氬姟绫诲瀷涓枃鍚嶇О'
+            },$("[layui-filter='toolbar_button_" + that.id + "']"),'table_' + that.id);
+            $webUtil.bindDefultButtonLisenter(that, that.id);
+            document.getElementById("toolbar_column_" + that.id).innerHTML =
+                '<a class="layui-btn layui-btn-intable" lay-event="CONFIG">閰嶇疆</a>' +
+                '<a class="layui-btn layui-btn-intable" lay-event="PRODUCT">鐢熸垚</a>' +
+                '<a class="layui-btn layui-btn-intable" lay-event="PREVIEW">棰勮</a>' +
+                '<a class="layui-btn layui-btn-intable" lay-event="DOWNLOAD">涓嬭浇</a>' ;
+        };
+        this.SCAN = function () {
+            var that = this;
+
+            var packName = $("#" + that.id + "_pack").val();
+            if($webUtil.isNull(packName)){
+                $webUtil.showErrorMsg("璇锋偍鍏堣緭鍏ュ寘鍚�");
+                return false;
+            }
+            $webUtil.post('scanAnnotationController/scanAnnotation',{packName:packName},function (result) {
+                if(result.success){
+                    $webUtil.showMsgFromResult(result,"鎵弿娉ㄨВ鎴愬姛锛岃绛夊緟涓�浼氭鏌ヤ竴涓嬩笟鍔$被鍨嬬殑鏁版嵁搴撹〃鏄惁鍒涘缓瀹屾垚");
+                }else{
+                    $webUtil.showErrorMsg(result.msg);
+                }
+            });
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){
+                that.columns = [table.getIndexColumn(),{
+                    field:'id',
+                    title:'涓氬姟绫诲瀷鑻辨枃',
+                    width:130
+                },{
+                    field:'name',
+                    title:'涓氬姟绫诲瀷涓枃',
+                    width:150
+                },{
+                    field:'description',
+                    title:'鎻忚堪',
+                    width:150
+                },{
+                    field:'author',
+                    title:'浣滆��',
+                    width:100
+                },{
+                    field:'lastProductDate',
+                    title:'鏈�鍚庣敓鎴愭椂闂�',
+                    width:135,
+                    templet:function(d){
+                        return $webUtil.formateDateTimeNoSecond(d.lastProductDate);
+                    }
+                },{
+                    field:'options',
+                    title:'鎿嶄綔',
+                    width:300,
+                    toolbar: '#toolbar_column_' + that.id
+                }];
+            }
+        };
+        this.refresh = function(){
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+        this.ADDBYBTMTYPE = function(){
+            var that = this;
+            var filter = "btmtype_" + that.id;
+            var auditedHistory =$webUtil.dialog({
+                title: '浠庝笟鍔$被鍨嬩腑閫夋嫨娣诲姞鐨勬柟妗�',
+                btn:['涓嬩竴姝�(閰嶇疆鏂规)','鍙栨秷'],
+                content: '<div layui-filter="toolbar_button_' + filter + '" class="layui-btn-container" style="margin-left:10px;margin-top:10px;"></div><table id="dialog_table' + filter + '" lay-filter="' + filter + '" class="layui-table"></table>',
+                fullScreen:true,
+                resize: false,
+                success: function (layero) {
+                    var table = layui.table;
+                    that.checkBtmTypeColumns();//涓诲垪琛ㄤ腑鍒椼��
+                    table.render({
+                        elem: '#dialog_table' + filter,
+                        id: 'dialog_table' + filter,
+                        backPath:that.backPath,
+                        url:that.url.referBtmType,
+                        selectMode:table.selectMode.single,
+                        cols: [that.btmTypeColumns],
+                        page:{
+                            limit:25,
+                            page:1
+                        }
+                    });
+                    $webUtil.createSearchHtml({
+                        id:'涓氬姟绫诲瀷鑻辨枃鍚嶇О',
+                        name:'涓氬姟绫诲瀷涓枃鍚嶇О'
+                    },$("[layui-filter='toolbar_button_" + filter + "']"),'dialog_table' + filter);
+                },
+                yes:function(){
+                    var table = layui.table;
+                    var oid = $webUtil.getOidFromGrid('dialog_table' + filter,true,true);
+                    if(!oid){
+                        return false;
+                    }
+                    $webUtil.get(that.url.getBtmTypeByOid,{oid:oid},function(result) {
+                        if (result.success) {
+                            layer.close(auditedHistory);
+                            var btmType = result.obj;
+                            var defaultValueByBtm = {
+                                pkBtmType: btmType.oid,
+                                id: btmType.id,
+                                name:  btmType.name,
+                            }
+                            //鍏朵粬鍑犱釜鍙兘鏄緷闈犲彉鏇寸殑浜嬩欢鏉ュ姞
+                            //鏄惁鏈夎嚜鍙傜収鐨勭被鍨�
+                            if(btmType.attributes){
+                                layui.each(btmType.attributes,function(_index,attribute){
+                                    if(attribute.referBtmTypeId && attribute.referBtmTypeId.toUpperCase() == btmType.id.toUpperCase()){
+                                        defaultValueByBtm.westLayoutPanelType = 'tree';
+                                        defaultValueByBtm.westNextRegionParam = '{' + attribute.id + ':that.currentItemAttributes.oid}';
+                                        //瑗垮尯鐨勬寜閽篃娣诲姞涓�
+                                        return true;
+                                    }
+                                })
+                            }
+                            //鏄笉鏄钩鍙伴�氱敤鐨勭敓鍛藉懆鏈�
+                            if(btmType.lifeCycleFlag && btmType.lifeCycleId && btmType.lifeCycleId == 'frameworkDataLc'){
+                                defaultValueByBtm.centerButtons = '{ADD:"娣诲姞",EDIT:"淇敼",DEL:"鍒犻櫎",ADVQUERY:"鏌ヨ",refresh:"鍒锋柊",DISABLE:"鍋滅敤",ENABLE:"鍚敤"}';
+                            }else {
+                                defaultValueByBtm.centerButtons = '{ADD:"娣诲姞",EDIT:"淇敼",DEL:"鍒犻櫎",ADVQUERY:"鏌ヨ",refresh:"鍒锋柊"}';
+                            }
+                            that.editSchema(null, defaultValueByBtm.id, defaultValueByBtm.name, defaultValueByBtm);
+                        }
+                    });
+                },
+                btn2:function(layero){
+                    that.refresh();
+                    layer.close(auditedHistory);
+                }
+            });
+        };
+        this.checkBtmTypeColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.btmTypeColumns==null || that.btmTypeColumns.length==0){//濡傛灉鍏朵粬鍦版柟鎯充娇鐢ㄨ繖涓粍浠剁殑鏃跺�欙紝鍙互鑷畾涔夊垪
+                that.btmTypeColumns = [table.getIndexColumn(),table.getCheckColumn(),{
+                    field:'id',
+                    title:'涓氬姟绫诲瀷鑻辨枃',
+                    width:130
+                },{
+                    field:'name',
+                    title:'涓氬姟绫诲瀷涓枃',
+                    width:150
+                },{
+                    field:'description',
+                    title:'鎻忚堪',
+                    width:150
+                }];
+            }
+        };
+        this.editSchema = function(schemaOid,btmTypeId,btmTypeName,defaultValueByBtm){
+            var that = this;
+            var isEdit = true;
+            if(defaultValueByBtm && $webUtil.isNotNull(defaultValueByBtm.pkBtmType)){
+                //璇存槑鏄柊澧�
+                isEdit = false;
+            }
+            var form = layui.form;
+            var filter = that.id + "_addOrSchema" ;
+            var addOrEditIndex = $webUtil.dialog({
+                targetObject:that,
+                title: isEdit?'閰嶇疆鐢熸垚鏂规':'鏂板浠g爜鐢熸垚鏂规',
+                btn: ['淇濆瓨', '鍙栨秷'],
+                content: '<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                resizing: function (layero) {
+                    form.doResize(filter);
+                },
+                fullScreen:true,
+                success: function (layero) {
+                    form.addItems(filter,that.getFormItems(),
+                        function () {
+                            if(!isEdit) {
+                                form.setValues(defaultValueByBtm,filter);
+                            }else {
+                                form.load(filter,{
+                                    url: that.url.controller + that.url.getObjectByOid,
+                                    backPath:that.backPath,
+                                    method:'get',
+                                    params:{
+                                        oid:schemaOid
+                                    }
+                                });
+                            }
+                        }
+                        , {}
+                        , {
+                            defaultColumnOneRow: 2,
+                            labelWidth:180
+                        });
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var submitValues = form.getValues(filter,true);
+                        if(submitValues['backPath'] == "configData."){
+                            $webUtil.showErrorMsg("鐣岄潰鍚庡彴璺緞娌℃湁杈撳叆鍊�");
+                            return false;
+                        }
+                        submitValues['genDOFlag'] = 'true';
+                        submitValues['genVOFlag'] = 'true';
+                        submitValues['genDTOFlag'] = 'true';
+                        $webUtil.ajax(isEdit?'PUT':'POST',that.url.controller + (isEdit?that.url.edit:that.url.add),submitValues,function (result) {
+                            if(result.success){
+                                $webUtil.showMsgFromResult(result,(isEdit?"閰嶇疆鏂规鎴愬姛":"娣诲姞鏂规鎴愬姛"));
+                                that.refresh();
+                                layer.close(addOrEditIndex);
+                            }else{
+                                $webUtil.showErrorMsg(result.msg);
+                            }
+                        },function (xhr,error) {
+                            $webUtil.showErrorMsg("淇濆瓨浠g爜鐢熸垚鏂规鍑洪敊锛屽彲鑳芥槸鏈嶅姟娌℃湁鍚姩");
+                        },that.backPath);
+                    }
+                }
+            });
+        };
+        this.getFormItems = function(){
+            var that = this;
+            var packageName = "com.vci";
+            if(that.packageName){
+                packageName = that.packageName;
+            }
+            var servicePath = that.servicePath;
+            if(!servicePath){
+                servicePath = "";
+            }
+            var user = $webUtil.getCurrentUserId();
+            if(that.user){
+                user = that.user;
+            }
+            return [{
+                field: 'id',
+                text: '涓氬姟绫诲瀷缂栧彿',
+                required:true,
+                readOnly:true
+            },{
+                field: 'name',
+                text: '涓氬姟绫诲瀷鍚嶇О',
+                required:true
+            },{
+                field: 'description',
+                text: '鏂规鎻忚堪'
+            },{
+                field:'author',
+                text:'浣滆��',
+                required:true,
+                defaultValue: user
+            },{
+                field:'fileEncode',
+                text:'鏂囦欢瀛楃闆�',
+                defaultValue:'UTF-8'
+            },{
+                field:'domemo',
+                type:'label',
+                isNewRow:true,
+                text:'鏁版嵁搴撳疄浣撴枃浠跺寘鍚嶏紝涓�鑸笟鍔$被鍨嬬敓鎴愭椂宸茬粡鍖呭惈浜�;鏄剧ず瀵硅薄鏄寚鍚庡彴杩斿洖缁欏墠绔殑瀵硅薄;鏁版嵁浼犺緭瀵硅薄鏄悗鍙扮敤鏉ユ帴鏀跺墠绔紶閫掔殑鏁版嵁鐨勫璞�;蹇呴』鏈変腑蹇冨尯',
+                labelWidth:1000
+            },{
+                field:'doPackage',
+                text:'鏁版嵁搴撳疄浣撳寘',
+                isNewRow:true,
+                defaultValue: packageName + ".model",
+                inputWidth:560
+            },{
+                field:'className',
+                text:'鏁版嵁瀵硅薄绫诲悕绉�',
+                inputWidth:300
+            },{
+                field:'voPackage',
+                text:'鏄剧ず瀵硅薄璺緞',
+                defaultValue: packageName + ".pagemodel",
+                required:true,
+                isNewRow:true,
+                inputWidth:860
+            },{
+                field:'dtoPackage',
+                text:'鏁版嵁浼犺緭瀵硅薄璺緞',
+                required:true,
+                isNewRow:true,
+                defaultValue: packageName + ".dto",
+                inputWidth:860
+            },{
+                field:'controllerPackage',
+                text:'controller鐨勫寘鍚�',
+                required:true,
+                isNewRow:true,
+                defaultValue: packageName + ".controller",
+                inputWidth:860
+            },{
+                field:'controllerRequestMap',
+                text:'controller鐨勮姹傚湴鍧�',
+                required:true,
+                useAllWidth:true,
+                inputWidth:860
+            },{
+                field:'servicePackage',
+                text:'鏈嶅姟鍖呭悕',
+                required:true,
+                defaultValue: packageName + ".service",
+                useAllWidth:true,
+                inputWidth:860
+            },{
+                field:'mapperPackage',
+                text:'鏁版嵁搴撴搷浣滃寘鍚�',
+                required:true,
+                useAllWidth:true,
+                defaultValue: packageName + ".dao",
+                inputWidth:860
+            },{
+                field:'mapperXmlPackage',
+                text:'鏁版嵁搴撴搷浣滃疄鐜板寘鍚�',
+                required:true,
+                defaultValue: packageName + ".dao.impl",
+            },{
+                field:'jsPackage',
+                text:'鐣岄潰鐨勮矾寰�(鍒癹s鍚�)',
+                required:true,
+                inputWidth:450,
+                defaultValue: (that.jsPrefix || '')
+            },{
+                field:'backPath',
+                text:'鐣岄潰涓婄殑backPath',
+                defaultValue:'configData.compatibility? path:configData.' + servicePath,
+                inputWidth:450
+            },{
+                field:'centerLayoutPanelType',
+                type:'combox',
+                comboxKey:'codeGenPanelType1',
+                text:'涓績浣跨敤鐨勯潰鏉�',
+                required:true,
+                defaultValue:'table',
+                data:[{key:'table_tree',value:'鏍戣〃'},{key:'table',value:'琛ㄦ牸'},{key:'form',value:'琛ㄥ崟'}]
+            },{
+                field:'centerQueryConfig',
+                text:'涓績鏌ヨ鏉′欢',
+                useAllWidth:true ,
+                defaultValue:'{id:"缂栧彿",name:"鍚嶇О"}',
+                inputWidth:860
+            },{
+                field:'centerButtons',
+                text:'涓績鎸夐挳',
+                useAllWidth:true ,
+                defaultValue:'{ADD:"娣诲姞",EDIT:"淇敼",DEL:"鍒犻櫎",ADVQUERY:"鏌ヨ",refresh:"鍒锋柊"}',
+                inputWidth:860
+            },{
+                field:'westLayoutPanelType',
+                type:'combox',
+                comboxKey:'codeGenPanelType',
+                text:'瑗垮尯浣跨敤鐨勯潰鏉�',
+                isNewRow:true,
+                defaultValue:'tree',
+                data:[{key:"tree",value:'鏍戝舰'}]
+            },{
+                field:'useLayoutRegion',
+                type:'switch',
+                //comboxKey:'useLayoutRegion',
+                text:'鏄惁浣跨敤瑗垮尯',
+                defaultValue: "false",
+                //data:[{key:"west",value:'瑗垮尯'}],
+                //isCheckbox:true,
+                required:true
+            },{
+                field:'westQueryConfig',
+                text:'瑗垮尯鏌ヨ鏉′欢',
+                useAllWidth:true ,
+                inputWidth:860
+            },{
+                field:'westNextRegionParam',
+                text:'涓婄骇灞炴��/涓嬩釜鍖哄煙鑱旂郴灞炴��',
+                useAllWidth:true ,
+                inputWidth:860
+            },{
+                field:'westButtons',
+                text:'瑗垮尯鎸夐挳',
+                useAllWidth:true,
+                inputWidth:860
+            }];
+        };
+        this.productCodeFile = function(oid){
+            var that = this;
+            if(!oid){
+                return false;
+            }
+            $webUtil.post(that.url.controller + that.url.productCodeFile,{oid:oid},function(result){
+                if(result.success){
+                    $webUtil.showMsgFromResult(result,"鐢熸垚浠g爜鎴愬姛");
+                    that.refresh();
+                }else{
+                    $webUtil.showErrorMsg(result.msg);
+                }
+            },function(xhr,error){
+                $webUtil.showErrorMsg("鐢熸垚浠g爜澶辫触锛屽彲鑳芥槸鏈嶅姟鍣ㄦ病鏈夊惎鍔�");
+            },that.backPath);
+        };
+        this.previewCodeFile = function(oid,text){
+            var that = this;
+            if(!oid){
+                return false;
+            }
+            portal.showTabByMenu(that.id + oid,{
+                id:that.id + oid,
+                text:'鏌ョ湅浠g爜[' + text + "]",
+                url:'USEJS:platform/objectService/OsCodePreview?oid=' + oid
+            });
+        };
+        this.downloadCodeFile = function(oid){
+            var that = this;
+            var iframeId = MD5(oid + $webUtil.getSystemVar($webUtil.systemValueKey.userOid));
+            $webUtil.fileDownload(that.backPath + that.url.controller + that.url.downloadFile + "?" + TOKEN_KEY + "=" + $webUtil.getToken()  + "&downloadUUID=" + iframeId + "&oid=" + oid);
+        };
+
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsCodePreview.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsCodePreview.js
new file mode 100644
index 0000000..f671809
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsCodePreview.js
@@ -0,0 +1,83 @@
+/**
+ * 浠g爜棰勮
+ * @author weidy
+ * @date 2020/08/3 
+ */
+layui.define(['layer','element','code','util'],function(exports){
+    var Class = function(){
+        this.MODELNAME = "platform/objectService/OsCodePreview";
+        this.moduleKey = "OsCodePreview";
+        this.id='OsCodePreview';
+        this.sourceData={};
+        this.columns = [];
+        this.backPath =  configData.compatibility?path:configData.objectServicePath;
+        this.url={
+            controller:'codeGenSchemaController/',
+            preview:'previewCodeFile'
+        };
+        this.getContent=function(){
+            var that = this;
+            var html = "";
+            html = [
+                    '<div class="layui-layout-border">',
+                        '<div class="layui-center">',
+                            '<div class="layui-tab">',
+                                '<ul class="layui-tab-title">',
+                                    '<li class="layui-this">VO</li>',
+                                    '<li>DTO</li>',
+                                    '<li>Mapper</li>',
+                                    '<li>Mapper.xml</li>',
+                                    '<li>Service</li>',
+                                    '<li>Service.Impl</li>',
+                                    '<li>Controller</li>',
+                                    '<li>UI</li>',
+                                    '<li>PO</li>',
+                                '</ul>',
+                                '<div class="layui-tab-content">',
+                                    '<div class="layui-tab-item layui-show" id="',that.id ,'_VO"> </div>', 
+                                    '<div class="layui-tab-item" id="',that.id ,'_DTO"> </div>', 
+                                    '<div class="layui-tab-item" id="',that.id ,'_Mapper"> </div>',  
+                                    '<div class="layui-tab-item" id="',that.id ,'_Mapperxml"> </div>',  
+                                    '<div class="layui-tab-item" id="',that.id ,'_Service"> </div>',  
+                                    '<div class="layui-tab-item" id="',that.id ,'_ServiceImpl"> </div>',  
+                                    '<div class="layui-tab-item" id="',that.id ,'_Controller"> </div>', 
+                                    '<div class="layui-tab-item" id="',that.id ,'_UI"> </div>',   
+                                    '<div class="layui-tab-item" id="',that.id ,'_PO"> </div>',    
+                                '</div>',
+                            '</div>',      
+                        '</div>',
+                    '</div>'
+            ].join("");
+            return html;
+        };
+        this.init = function(){
+            var that = this;
+            $webUtil.copyConfig(that,that.moduleKey);
+            var schemaOid = "";
+            if(that.sourceData){
+                schemaOid = that.sourceData['oid'];
+            }
+            if($webUtil.isNull(schemaOid)){
+                $webUtil.showErrorMsg("娌℃湁浠g爜鐢熸垚鏂规鐨勪富閿�");
+                return false;
+            }
+            $webUtil.post(that.url.controller + that.url.preview,{oid:schemaOid},function(result){
+                if(result.success){
+                    for(var key in result.obj){
+                        $("#" + that.id + "_" + key).html('<pre class="layui-code" lay-encode="true" lay-skin="notepad">' + result.obj[key] + "</pre>");
+                    }
+                    if(!"PO" in result.obj){
+                        $("#" + that.id + "_PO").html("");
+                    }
+                    layui.element.render();
+                }else{
+                    $webUtil.showErrorMsg(result.msg);
+                }
+            },function(xhr,error){
+                $webUtil.showErrorMsg("鏌ョ湅浠g爜鍐呭澶辫触锛屽彲鑳芥槸鏈嶅姟鍣ㄦ病鏈夊惎鍔�");
+            },that.backPath);
+        }
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsCodeRule.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsCodeRule.js
new file mode 100644
index 0000000..bc29906
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsCodeRule.js
@@ -0,0 +1,1216 @@
+/**
+ * 缂栫爜瑙勫垯
+ * @author wangting@2021-7-16
+ */
+layui.define(['layer','element','form','table','util'],function(exports){
+    var Class = function(){
+        this.MODELNAME = "platform/objectService/OsCodeRule";
+        this.moduleKey = "OsCodeRule";
+        this.id='OsCodeRule';
+        this.sourceData={};
+        this.columns = [];
+        this.backPath =  configData.compatibility?path:configData.objectServicePath;
+        this.url={
+            controller:'codeRuleController/',
+            dataGrid:'dataGrid',
+            dataGridDetail:'dataGridElement',
+            addSave:'addRule',
+            editSave:'editRule',
+            deleteUrl:'deleteRule',
+            getObjectByOid:'getObjectByOid',
+            enableData: 'enableRule',
+            disableData: 'disableRule',
+            getBtmTypeByOid:'btmTypeController/getBtmTypeByOid'
+        };
+        this.buttonIconMap = {
+            SEARCH:'layui-icon-refresh-2',
+            SENIORSEARCH:'layui-icon-query',
+            ADD:'layui-icon-add-1',
+            EDIT:'layui-icon-edit',
+            DELETE:'layui-icon-delete'
+        };
+        this.vciFieldTypeMap = {
+            VTBoolean:"甯冨皵鍨�",
+            VTClob: "闀挎枃鏈�",
+            VTDate:"鏃ユ湡",
+            VTDateTime:"鏃ユ湡鏃堕棿",
+            VTTime:"鏃堕棿",
+            VTLong:"闀挎暣鍨�",
+            VTDouble:"閲戦/鍙岀簿搴�",
+            VTInteger:"鏁村舰",
+            VTFilePath:"鏂囦欢",
+            VTString:"瀛楃涓�"
+        };
+        this.btmTypeOid=null;
+        this.getContent=function(){//杩斿洖杩欎釜缁勪欢鐨勫熀纭�html
+            var that = this;
+            var html = "";
+            html = [
+                '<div class="layui-layout" style="display:block;overflow-y: hidden">',
+                '<div class="layui-layout-border" style="display:block;margin-top:0px; " id="border_', that.id, '">',
+                '<div class="layui-center" style="overflow-y:auto;">',
+                that.getToolbarHtml(),
+                '<table id="table_', that.id, '" lay-filter="', that.id, '" style="overflow-x:auto;"></table>',
+                '</div>',
+                '<div class="layui-south" style="padding-top: 15px">',
+                '<table id="table_detail_', that.id, '" lay-filter="table_detail_', that.id, '" style="overflow-x:auto;"></table>',
+                '</div>',
+                '</div>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml = function () {
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_', that.id, '" class="layui-btn-container layui-buttons">',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_', that.id, '_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_', that.id, '_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_', that.id, '_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_', that.id, '_ENABLE"><i class="layui-icon layui-icon-ok-circle"></i>鍚敤</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_', that.id, '_DISABLE"><i class="layui-icon layui-icon-404"></i>鍋滅敤</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_', that.id, '_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_', that.id, '_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            $webUtil.bindDefultButtonLisenter(that, that.id);
+            $webUtil.createSearchHtml({
+                id: "鏂规缂栧彿",
+                name: "鍚嶇О",
+                btmTypeName: "涓氬姟绫诲瀷鍚嶇О"
+            }, $("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+        };
+        this.init=function(){//鍩虹鐨刪tml琚坊鍔犲悗锛屽啀鎵ц鍒濆鍖�
+            var that = this;
+            $webUtil.copyConfig(that,that.moduleKey);
+            that.initMainTable();
+            that.createSearchHtml();
+            that.initDetailTable('detail_' + that.id);
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var tableWidth = $("#border_" + that.id).width() - 225;
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath: that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                selectMode: table.selectMode.muti,
+                cols: [that.columns],
+                done: function (res, cur, total) {
+                    table.on('tool(' + that.id + ')', function (obj) {
+                        var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                        var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                        if (layEvent == 'EDIT') {
+                            that.addOrEdit(false, data);
+                        }
+                    });
+                    if (total > 0) {
+                        table.selectRecord('table_' + that.id, {index: 0});
+                    }
+                },
+                rowClick: function (thisTableFilter, record) {
+                    table.reload("table_detail_" + that.id, {
+                        extraParams: {
+                            "pkRule": record.oid
+                        }
+                    });
+                }
+            };
+            table.render(options);
+        };
+        this.initDetailTable = function (filter) {
+            var that = this;
+            var table = layui.table;
+            var detailColumns=that.checkDetailColumns()
+            //鍒濆鍖栬〃鏍�
+            var options = {
+                elem: '#table_' + filter,
+                id: 'table_' + filter,
+                backPath: that.backPath,
+                url:that.url.controller+that.url.dataGridDetail,
+                selectMode: layui.table.selectMode.muti,
+                cols: [detailColumns],
+                remoteSort:false,
+                initSort:{sortField:'ruleOrderNumber',type:'asc'}
+            };
+            table.render(options);
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){//濡傛灉鍏朵粬鍦版柟鎯充娇鐢ㄨ繖涓粍浠剁殑鏃跺�欙紝鍙互鑷畾涔夊垪
+                that.columns = [table.getIndexColumn(),table.getRadioColumn(),{
+                    field:'id',
+                    title:'缂栧彿',
+                    sort:true,
+                    width:260
+                },{
+                    field:'name',
+                    title:'鍚嶇О',
+                    sort:true,
+                    width:160
+                },{
+                    field:'totalLength',
+                    title:'鎬婚暱搴�',
+                    width:110
+                },{
+                    field:'codeProductTypeText',
+                    title:'缂栫爜鐢熸垚鏂瑰紡',
+                    width:120
+                },{
+                    field:'codeEditFlag',
+                    title:'鏄惁鍙互缂栬緫',
+                    width:100,
+                    templet:function(d){
+                        return $webUtil.formateBoolean(d.codeEditFlag);
+                    }
+                },{
+                    field:'breakReUseFlag',
+                    title:'鏄惁鏂爜琛ョ爜',
+                    width:100,
+                    templet:function(d){
+                        return $webUtil.formateBoolean(d.breakReUseFlag);
+                    }
+                },{
+                    field:'btmTypeName',
+                    title:'涓氬姟绫诲瀷鍚嶇О',
+                    width:150
+                },{
+                    field:'useRuleFlag',
+                    title:'浣跨敤瑙勫垯鏍囪',
+                    width:150
+                },{
+                    field:'lcStatusText',
+                    title:'鐘舵��',
+                    width:100
+                },{
+                    field:'options',
+                    title:'鎿嶄綔',
+                    width:80,
+                    templet:function(d){
+                        return '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>';
+                    }
+                }];
+            }
+        };
+        this.checkDetailColumns = function(isDialog) {
+            var that = this;
+            var table = layui.table;
+            var detailColumns = [table.getIndexColumn(), table.getCheckColumn(), {
+                title: '鎺掑簭鍙�',
+                field: 'ruleOrderNumber',
+                sort: true,
+                width: 70,
+                hide: isDialog
+            }, {
+                title: '鍏冪礌缂栧彿',
+                field: 'id',
+                sort: true,
+                width: 90
+            }, {
+                title: '鍏冪礌绫诲瀷',
+                field: 'codeElementTypeText',
+                sort: true,
+                width: 120
+            },
+                {
+                    title: '鍏冪礌涓枃鍚嶇О',
+                    field: 'name',
+                    width: 120
+                }, {
+                    title: '鍏冪礌琛ㄨ揪寮�',
+                    field: 'id',
+                    width: 120
+                }, {
+                    title: '鏈�澶ч暱搴�',
+                    field: 'maxLength',
+                    width: 70
+                }, {
+                    title: '鏈�灏忛暱搴�',
+                    field: 'minLength',
+                    width: 70
+                },
+                {
+                    title: '缂栫爜琛ヤ綅鏂瑰紡',
+                    field: 'codeFillTypeText',
+                    width: 95
+                },
+                {
+                    title: '琛ヤ綅瀛楃',
+                    field: 'codeFillSeparator',
+                    width: 70
+                },
+                {
+                    title: '鏍¢獙瑙勫垯',
+                    field: 'validateString',
+                    width: 120
+                },
+                {
+                    title: '鏃堕棿鏍煎紡',
+                    field: 'codeDateFormat',
+                    width: 110
+                },
+                {
+                    title: '鏃堕棿鍙栧�肩被鍨�',
+                    field: 'codeDateValueTypeText',
+                    width: 100
+                },
+                {
+                    title: '鏃堕棿鍙栧�煎睘鎬�',
+                    field: 'codeDateUseFieldName',
+                    width: 110
+                },
+                {
+                    title: '鍊煎搴斿睘鎬�',
+                    field: 'codeUseFieldName',
+                    width: 110
+                },
+                {
+                    title: '鍏紡琛ㄨ揪寮�',
+                    field: 'codeExpression',
+                    width: 120
+                },
+                {
+                    title: '鏄惁娴佹按渚濇嵁',
+                    field: 'serialAccording',
+                    width: 95,
+                    templet: function (d) {
+                        return $webUtil.formateBoolean(d.serialAccording);
+                    }
+                },
+                {
+                    title: '甯搁噺鍊�',
+                    field: 'staticCode',
+                    width: 70
+                },
+                {
+                    title: '娴佹按璧峰鍊�',
+                    field: 'serialStart',
+                    width: 80
+                },
+                {
+                    title: '娴佹按姝ラ暱',
+                    field: 'serialStep',
+                    width: 70
+                },
+                {
+                    title: '娴佹按浼樺厛绾�',
+                    field: 'serialPriority',
+                    width: 80
+                } ];
+            if(isDialog){
+                detailColumns.push({
+                    field: 'options',
+                    title: '鎿嶄綔',
+                    width: 150,
+                    fixed: 'right',
+                    templet: function (d) {
+                        return '<a class="layui-btn layui-btn-intable" lay-event="edit">缂栬緫</a><a class="layui-btn layui-btn-intable" lay-event="up">涓婄Щ</a><a class="layui-btn layui-btn-intable" lay-event="down">涓嬬Щ</a>';
+                    }
+                })
+            }
+            return detailColumns;
+        };
+        this.getFormItems = function(onlyShow,edit) {
+            var that=this;
+            that.checkBtmTypeColumns()
+            return [{
+                field:'btmTypeId',
+                title:'鎵�灞炰笟鍔$被鍨�',
+                type: 'refer',
+                showField: 'btmTypeName',
+                referConfig:{
+                    textField: 'name',
+                    valueField: 'id',
+                    backPath: that.backPath,//娉ㄦ剰杩欓噷闇�瑕佷慨鏀瑰弬鐓х殑瀵瑰簲璺緞
+                    isMuti: false,
+                    width:1280,
+                    height:630,
+                    type:'grid',
+                    url:"/btmTypeController/referDataGrid",
+                    tableConfig: {
+                        page: {
+                            limit: 15,
+                            page: 1
+                        },
+                        cols: that.btmTypeColumns,
+                        queryColumns: [
+                            {field: 'id',title: '涓氬姟绫诲瀷鑻辨枃'},
+                            {field: 'name',title: '涓氬姟绫诲瀷涓枃'}]
+                    }
+                },
+                required: true,
+                readOnly:onlyShow
+            },{
+                field:'id',
+                title:'缂栫爜瑙勫垯缂栧彿',
+                required: true,
+                readOnly:(onlyShow||edit)
+            },{
+                field:'name',
+                title:'鍚嶇О',
+                required: true,
+                readOnly:onlyShow
+            },{
+                field:'totalLength',
+                title:'鎬婚暱搴�',
+                readOnly:true,
+                value: 0
+            },{
+                field:'codeProductType',
+                title:'缂栫爜鐢熸垚鏂瑰紡',
+                type:'combox',
+                comboxKey:'codeProductType',
+                required: true,
+                readOnly:onlyShow
+            },{
+                field:'useRuleFlag',
+                title:'浣跨敤瑙勫垯鏍囪',
+                required: true,
+                readOnly:onlyShow
+            },{
+                field:'codeEditFlag',
+                title:'鏄惁鍙互缂栬緫',
+                type: 'truefalse',
+                value: 'false',
+                readOnly:onlyShow
+            },{
+                field:'breakReUseFlag',
+                title:'鏄惁鏂爜琛ョ爜',
+                type: 'truefalse',
+                value: 'false',
+                readOnly:onlyShow
+            }];
+        };
+        this.getFormDetailItems = function(onlyShow,codeElementTypeText) {
+            var that = this;
+            that.checkBtmTypeAttrColumns();
+            var items = [onlyShow ? {
+                title: '鍏冪礌绫诲瀷',
+                field: 'codeElementTypeText',
+                required: true,
+                readOnly: onlyShow
+            } : {
+                title: '鍏冪礌绫诲瀷',
+                field: 'codeElementType',
+                type: 'combox',
+                comboxKey: 'codeElementType',
+                defaultValue: 'code_element_enum',
+                required: true
+            }, {
+                title: '鍏冪礌缂栧彿',
+                field: 'id',
+                required: true
+            },
+                {
+                    title: '鍏冪礌涓枃鍚嶇О',
+                    field: 'name',
+                    required: true
+                }];
+            if (codeElementTypeText == '甯搁噺') {
+                items.push({
+                    title: '甯搁噺鍊�',
+                    field: 'staticCode',
+                    required: true
+                }, {
+                    title: '鏄惁娴佹按渚濇嵁',
+                    field: 'serialAccording',
+                    defultValue: 'false',
+                    type: 'truefalse'
+                })
+            } else {
+                items.push({
+                        title: '鏈�澶ч暱搴�',
+                        field: 'maxLength',
+                        verify: 'number',
+                        required: true
+                    }, {
+                        title: '鏈�灏忛暱搴�',
+                        field: 'minLength',
+                        verify: 'number',
+                        required: true
+                    },
+                    {
+                        title: '缂栫爜琛ヤ綅鏂瑰紡',
+                        field: 'codeFillType',
+                        type: 'combox',
+                        comboxKey: 'codeFillType',
+                        required: true
+                    },
+                    {
+                        title: '琛ヤ綅瀛楃',
+                        field: 'codeFillSeparator'
+                    })
+            }
+            if (codeElementTypeText == '鎵嬪姩杈撳叆') {
+                items.push({
+                        title: '鏍¢獙瑙勫垯',
+                        field: 'validateString'
+                    },
+                    {
+                        title: '鏄惁娴佹按渚濇嵁',
+                        field: 'serialAccording',
+                        defultValue: 'false',
+                        type: 'truefalse'
+                    })
+            } else if (codeElementTypeText == '鏃ユ湡') {
+                items.push({
+                        title: '鏃堕棿鏍煎紡',
+                        field: 'codeDateFormat',
+                        required: true
+                    },
+                    {
+                        title: '鏃堕棿鍙栧�肩被鍨�',
+                        field: 'codeDateValueType',
+                        type: 'combox',
+                        comboxKey: 'codeDateValueType',
+                        defaultValue: 'code_date_business'
+                    },
+                    {
+                        title: '鏃堕棿鍙栧�煎睘鎬�',
+                        field: 'codeDateUseField',
+                        required: true,
+                        type: 'refer',
+                        showField: 'codeDateUseFieldName',
+                        referConfig: {
+                            textField: 'name,label',
+                            valueField: 'name',
+                            backPath: that.backPath,//娉ㄦ剰杩欓噷闇�瑕佷慨鏀瑰弬鐓х殑瀵瑰簲璺緞
+                            isMuti: false,
+                            width: 580,//1280
+                            height: 630,
+                            type: 'grid',
+                            where: {
+                                btmTypeId: that.btmTypeOid,
+                                codeElementType: that.codeElementType
+                            },
+                            url: "/btmTypeController/gridAttributesByBtmId",
+                            tableConfig: {
+                                cols: that.btmTypeAttrColumns,
+                                queryColumns:that.btmTypeAttrQuerys
+                            }
+                        }
+                    },
+                    {
+                        title: '鏄惁娴佹按渚濇嵁',
+                        field: 'serialAccording',
+                        defultValue: 'false',
+                        type: 'truefalse'
+                    })
+            } else if (codeElementTypeText == '灞炴��') {
+                items.push({
+                        title: '鍊煎搴斿睘鎬�',
+                        field: 'codeUseField',
+                        required: true,
+                        type: 'refer',
+                        showField: 'codeUseFieldName',
+                        referConfig: {
+                            textField: 'name,label',
+                            valueField: 'name',
+                            backPath: that.backPath,//娉ㄦ剰杩欓噷闇�瑕佷慨鏀瑰弬鐓х殑瀵瑰簲璺緞
+                            isMuti: false,
+                            width: 580,
+                            height: 630,
+                            type: 'grid',
+                            where: {
+                                btmTypeId: that.btmTypeOid,
+                                codeElementType: that.codeElementType
+                            },
+                            url: "/btmTypeController/gridAttributesByBtmId",
+                            tableConfig: {
+                                cols: that.btmTypeAttrColumns,
+                                queryColumns:that.btmTypeAttrQuerys
+                            }
+                        }
+                    },
+                    {
+                        title: '鏄惁娴佹按渚濇嵁',
+                        field: 'serialAccording',
+                        defultValue: 'false',
+                        type: 'truefalse'
+                    })
+            } else if (codeElementTypeText == '鏋氫妇灞炴�ф槧灏�') {
+                items.push({
+                        title: '鍊煎搴斿睘鎬�',
+                        field: 'codeUseField',
+                        required: true,
+                        type: 'refer',
+                        showField: 'codeUseFieldName',
+                        referConfig: {
+                            textField: 'name,label',
+                            valueField: 'name',
+                            backPath: that.backPath,//娉ㄦ剰杩欓噷闇�瑕佷慨鏀瑰弬鐓х殑瀵瑰簲璺緞
+                            isMuti: false,
+                            width: 580,
+                            height: 630,
+                            type: 'grid',
+                            where: {
+                                btmTypeId: that.btmTypeOid,
+                                codeElementType: that.codeElementType
+                            },
+                            url: "/btmTypeController/gridAttributesByBtmId",
+                            tableConfig: {
+                                cols: that.btmTypeAttrColumns,
+                                queryColumns:that.btmTypeAttrQuerys
+                            }
+                        }
+                    },
+                    {
+                        title: '鎵�閫夋灇涓�',
+                        field: 'enumId',
+                        readOnly: !onlyShow,
+                        required: onlyShow,
+                        type: 'refer',
+                        showField: 'enumName',
+                        referConfig: {
+                            textField: 'id,name',
+                            valueField: 'id',
+                            backPath: that.backPath,//娉ㄦ剰杩欓噷闇�瑕佷慨鏀瑰弬鐓х殑瀵瑰簲璺緞
+                            isMuti: false,
+                            width: 580,
+                            height: 630,
+                            type: 'grid',
+                            where: {
+                                btmTypeId: that.btmTypeOid
+                            },
+                            url: "/webEnumController/gridEnum",
+                            tableConfig: {
+                                cols: [layui.table.getIndexColumn(), layui.table.getCheckColumn(), {
+                                    field: 'id',
+                                    title: '鏋氫妇缂栧彿',
+                                    width: 200
+                                }, {
+                                    field: 'name',
+                                    title: '鏋氫妇鍚嶇О',
+                                    width: 260
+                                }],
+                                queryColumns:[{
+                                    field:'id',
+                                    title:'鏋氫妇缂栧彿'
+                                }]
+                            }
+                        }
+                    },
+                    {
+                        title: '鏄惁娴佹按渚濇嵁',
+                        field: 'serialAccording',
+                        defultValue: 'false',
+                        type: 'truefalse'
+                    })
+            } else if (codeElementTypeText == '鍏紡') {
+                items.push({
+                    title: '鍏紡琛ㄨ揪寮�',
+                    field: 'codeExpression',
+                    required: true
+                })
+            } else if (codeElementTypeText == '娴佹按鍙�') {
+                items.push({
+                        title: '娴佹按璧峰鍊�',
+                        field: 'serialStart',
+                        verify: 'number',
+                        required: true,
+                        defaultValue: 1
+                    },
+                    {
+                        title: '娴佹按姝ラ暱',
+                        field: 'serialStep',
+                        verify: 'number',
+                        required: true,
+                        defaultValue: 1
+                    },
+                    {
+                        title: '娴佹按浼樺厛绾�',
+                        field: 'serialPriority',
+                        verify: 'number',
+                        defaultValue:1,
+                        required: true
+                    })
+            }
+            return items;
+        };
+        this.checkBtmTypeColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.btmTypeColumns==null || that.btmTypeColumns.length==0){//濡傛灉鍏朵粬鍦版柟鎯充娇鐢ㄨ繖涓粍浠剁殑鏃跺�欙紝鍙互鑷畾涔夊垪
+                that.btmTypeColumns = [table.getIndexColumn(),table.getCheckColumn(),{
+                    field:'id',
+                    title:'涓氬姟绫诲瀷鑻辨枃',
+                    width:130
+                },{
+                    field:'name',
+                    title:'涓氬姟绫诲瀷涓枃',
+                    width:140
+                },{
+                    field:'description',
+                    title:'鎻忚堪',
+                    width:200
+                },{
+                    field:'tableName',
+                    title:'鏁版嵁搴撹〃',
+                    width:140
+                },{
+                    field:'revisionRuleId',
+                    title:'鐗堟湰瑙勫垯',
+                    width:150,
+                    templet:function(d){
+                        if(!d.revisionFlag){
+                            return '涓嶆帶鍒剁増鏈�';
+                        }else{
+                            return d.revisionRuleId + ' ' + d.revisionRuleName;
+                        }
+                    }
+                },{
+                    field:'lifeCycleFlag',
+                    title:'鐢熷懡鍛ㄦ湡',
+                    width:210,
+                    templet:function(d){
+                        if(!d.lifeCycleFlag){
+                            return '涓嶆帶鍒剁敓鍛藉懆鏈�';
+                        }else{
+                            return d.lifeCycleId + ' ' + d.lifeCycleName;
+                        }
+                    }
+                },{
+                    field:'secretFlag',
+                    title:'鎺у埗瀵嗙骇',
+                    width:70,
+                    templet:function(d){
+                        return $webUtil.formateBoolean(d.secretFlag);
+                    }
+                },{
+                    field:'viewFlag',
+                    title:'鏄惁涓鸿鍥�',
+                    width:80,
+                    templet:function(d){
+                        return $webUtil.formateBoolean(d.viewFlag);
+                    }
+                },{
+                    field:'versionRule',
+                    title:'鐗堟瑙勫垯',
+                    width:110
+                }];
+            }
+        };
+        this.btmTypeAttrQuerys = [{
+            field:'id',
+            title:'灞炴�ц嫳鏂囧悕绉�',
+            width:150
+        },{
+            field:'name',
+            title:'灞炴�т腑鏂囧悕绉�',
+            width:200
+        }];
+        this.checkBtmTypeAttrColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.btmTypeAttrColumns==null || that.btmTypeAttrColumns.length==0){//濡傛灉鍏朵粬鍦版柟鎯充娇鐢ㄨ繖涓粍浠剁殑鏃跺�欙紝鍙互鑷畾涔夊垪
+                that.btmTypeAttrColumns = [table.getIndexColumn(),table.getCheckColumn(),{
+                    field:'id',
+                    title:'灞炴�ц嫳鏂囧悕绉�',
+                    width:150
+                },{
+                    field:'name',
+                    title:'灞炴�т腑鏂囧悕绉�',
+                    width:200
+                },{
+                    field:'attributeLength',
+                    title:'闀垮害',
+                    width:80
+                },{
+                    field:'attrDataType',
+                    title:'鏁版嵁绫诲瀷',
+                    width:80,
+                    templet:function(d){
+                        return that.vciFieldTypeMap[d.attrDataType];
+                    }
+                },{
+                    field:'nullableFlag',
+                    title:'鏄惁鍙互涓虹┖',
+                    width:100,
+                    templet:function(d){
+                        return $webUtil.formateBoolean(d.nullableFlag);
+                    }
+                },{
+                    field:'defaultValue',
+                    title:'榛樿鍊�',
+                    width:80
+                },{
+                    field:'precisionLength',
+                    title:'灏忔暟绮惧害',
+                    width:80
+                },{
+                    field:'scaleLength',
+                    title:'灏忔暟鍒诲害',
+                    width:80
+                },{
+                    field:'range',
+                    title:'鍙栧�艰寖鍥�',
+                    width:100
+                },{
+                    field:'referFlag',
+                    title:'鏄惁鍙傜収',
+                    width:130,
+                    templet:function(d){
+                        if(!d.referFlag){
+                            return '鍚�';
+                        }else{
+                            return d.referBtmTypeId
+                        }
+                    }
+                },{
+                    field:'enumFlag',
+                    title:'鏄惁鏋氫妇',
+                    width:110,
+                    templet:function(d){
+                        if(!d.enumFlag){
+                            return '鍚�';
+                        }else{
+                            return d.enumId
+                        }
+                    }
+                }];
+            }
+        };
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            var selectData  = layui.table.checkStatus("table_" + that.id).data;
+            if(!selectData || selectData.length!=1){
+                $webUtil.showErrorMsg("璇蜂粎閫夋嫨涓�鏉$紪鐮佽鍒�");
+                return false;
+            }
+            that.addOrEdit(false,selectData[0]);
+        };
+        this.addOrEdit = function(add,selectData) {
+            var that = this;
+            var form = layui.form;
+            var table = layui.table;
+            var filter ="form_" + that.id;
+            var addSaveIndex =$webUtil.dialog({
+                title:add?'娣诲姞缂栫爜瑙勫垯':'淇敼缂栫爜瑙勫垯',
+                btn:['淇濆瓨','鍙栨秷'],
+                skin:'layui-layer-lan',
+                content:['<form id="form_' , filter ,'" lay-filter="' , filter , '" class="layui-form" style="margin-top:5px" ></form>',
+                    '<div id="dtableFrom_', filter , '" class="dtableFrom_', filter , '" style="text-align:center;">',
+                    '<span>缂栫爜瑙勫垯鏄庣粏 </span>',
+                    '<span class="dtableFromAdd_', filter , ' layui-btn layui-btn-sm" >澧炲姞琛�</span>',
+                    '<span class="dtableFromDel_', filter , ' layui-btn layui-btn-sm" >鍒犻櫎琛�</span>',
+                    '<table id="tableFrom_', filter , '" lay-filter="tableFrom_',filter , '" style="overflow-x:auto;"></table>',
+                    '</div>'].join(''),
+                fullScreen:true,
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getFormItems(false,!add),
+                        function () {
+                            if(!add){
+                                form.setValues(selectData, filter);
+                                that.btmTypeOid=selectData.btmTypeId;
+                            }else{
+                                var defaultValues = {
+                                    codeProductType:'code_product_after'
+                                };
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+                        }, {}, {defaultColumnOneRow: 4,labelWidth:110,textWidth:220});
+                    form.on('select('+filter+')',function (data){
+                        if(data.name=='btmTypeId'){
+                            that.btmTypeOid=data.value;
+                        }
+                    })
+                    var detailColumns=that.checkDetailColumns(true)
+                    table.render({
+                        elem: '#tableFrom_' + filter,
+                        id: 'tableFrom_' + filter,
+                        cols: [detailColumns],
+                        data: [],
+                        remoteSort:false,
+                        initSort:{sortField:'ruleOrderNumber',type:'asc'},
+                        done: function (res, cur, total) {
+                            table.on('tool(tableFrom_' + filter + ')', function (obj) {
+                                var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                                var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                                var index=obj.index;
+                                if (layEvent == 'up') {
+                                    index!=0 && table.moveData( 'tableFrom_' + filter,index,index-1,'ruleOrderNumber')
+                                }
+                                if (layEvent == 'down') {
+                                    index!=total-1 && table.moveData( 'tableFrom_' + filter,index,index+1,'ruleOrderNumber')
+                                }
+                                if (layEvent == 'edit') {
+                                    that.addOrEditDetail(false,filter,data)
+                                }
+                            });
+                        },
+                        rowDBLClick: function (thisTableFilter, record,isChecked) {
+                            that.addOrEditDetail(false,filter,record)
+                        }
+                    });
+                    if(!add){
+                        $webUtil.get(that.backPath+that.url.controller+that.url.dataGridDetail,{pkRule:selectData.oid},function(result){
+                            if(result.success){
+                                layui.table.addData('tableFrom_' + filter, result.data);
+                            }
+                        })
+                    }
+
+                    // 娣诲姞
+                    $(".dtableFromAdd_" + filter + "").on("click", function (e) {
+                        if(form.validata(filter)){
+                            that.addOrEditDetail(true,filter)
+                            layui.stope(e);
+                        }
+                    });
+                    // 鍒犻櫎琛�
+                    $(".dtableFromDel_" + filter + "").on("click", function (e) {
+                        var checkData = layui.table.checkStatus('tableFrom_' + filter).data;
+                        layui.table.removeData('tableFrom_' + filter, checkData);
+                    });
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        values["codeProductTypeText"]=layui.vciWebComboxStore.getComboxText('codeProductType',values.codeProductType)
+                        values.totalLength=0
+                        var tableitems=layui.table.getData('tableFrom_' + filter);
+                        var hasSerial=0
+                        layui.each(tableitems,function (index,item){
+                            item.ruleOrderNumber=index+1;
+                            if(item.codeElementType=='code_element_serial'){
+                                hasSerial++;
+                            }
+                            values.totalLength+=parseInt(item.maxLength)
+                            values.serialAccording=values.serialAccording=='on'?'false':values.serialAccording;
+                        })
+                        if(hasSerial==0){
+                            $webUtil.showErrorMsg("璇锋坊鍔犱竴鏉″厓绱犵被鍨嬩负鈥滄祦姘村彿鈥濈殑鏄庣粏");
+                            return false;
+                        }else if(hasSerial>1){
+                            $webUtil.showErrorMsg("鍏冪礌绫诲瀷涓衡�滄祦姘村彿鈥濈殑鏄庣粏鍙兘鏈変竴鏉�");
+                            return false;
+                        }
+                        if(values.totalLength<=0){
+                            $webUtil.showErrorMsg("璇锋坊鍔犵紪鐮佽鍒欐槑缁�");
+                            return false;
+                        }
+                        values.elements=tableitems;
+                        values.breakReUseFlag=values.breakReUseFlag=='on'?'false':values.breakReUseFlag;
+                        values.codeEditFlag=values.codeEditFlag=='on'?'false':values.codeEditFlag;
+                        var url = that.url.controller + (add?that.url.addSave:that.url.editSave);
+                        $webUtil.manualAjax(add?'post':'put',url,JSON.stringify(values) ,function(result){
+                            if(result.success){
+                                $webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                $webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            $webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function(){
+            var that = this;
+            var oid = $webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts = $webUtil.getOidFromGrid("table_" +that.id,true,true,'ts');
+            $webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                $webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        $webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    }else{
+                        $webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    $webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+
+        this.addOrEditDetail = function(add,filter,selectData) {
+            var that = this;
+            var form = layui.form;
+            var table=layui.table;
+            var detailfilter ="detail_" + filter;
+            var addSaveDetailIndex =$webUtil.dialog({
+                title:add?'娣诲姞缂栫爜瑙勫垯鏄庣粏':'淇敼缂栫爜瑙勫垯鏄庣粏',
+                btn:['淇濆瓨','鍙栨秷'],
+                skin:'layui-layer-lan',
+                content:'<form id="form_' + detailfilter +'" lay-filter="' +detailfilter + '" class="layui-form" style="margin-top:15px" ></form>'+
+                    '<div style="margin: 0 30px 10px"><table id="tableFrom_'+detailfilter +'" lay-filter="tableFrom_'+detailfilter +'" style="overflow-x:auto;"></table></div>',
+                area: ['800px', '540px'],
+                resizing:function(layero){
+                    form.doResize(detailfilter);
+                },
+                success:function(layero) {
+                    that.codeElementType=add?'code_element_enum':selectData.codeElementType;
+                    form.addItems(detailfilter,that.getFormDetailItems(!add,add?'鏋氫妇灞炴�ф槧灏�':selectData.codeElementTypeText),
+                        function () {
+                            table.render({
+                                elem: '#tableFrom_' + detailfilter,
+                                id: 'tableFrom_' + detailfilter,
+                                cols:[[layui.table.getIndexColumn(), layui.table.getCheckColumn(), {
+                                    field: 'enumItemKey',
+                                    title: '鏋氫妇閫夐」鍊�',
+                                    width: 150
+                                }, {
+                                    field: 'enumItemValue',
+                                    title: '鏋氫妇閫夐」鏄剧ず鏂囨湰',
+                                    width: 200
+                                }, {
+                                    field: 'codeMapValue',
+                                    title: '鏄犲皠鐨勭爜鍊�',
+                                    width: 280,
+                                    edit:true
+                                }]],
+                                data: [],
+                                limit:-1,
+                                done: function (res, cur, total) {
+                                }
+                            });
+
+                            function renderEnumTable(data){
+                                table.reload('tableFrom_' + detailfilter,{data:data})
+                            }
+
+                            $('#tableFrom_' + detailfilter).parent().hide()
+                            if(!add) {
+                                form.setValues(selectData, detailfilter);
+                                if (selectData.codeElementType == 'code_element_enum') {
+                                    $('#tableFrom_' + detailfilter).parent().show()
+                                    renderEnumTable(selectData.enumMaps || selectData.enumMapList)
+                                } else if (selectData.codeElementType == 'code_element_date') {
+                                    if (selectData.codeDateValueType == 'code_date_system') {
+                                        //绯荤粺鏃堕棿
+                                        var items=form.getFormItems(detailfilter);
+                                        for (var i=items.length-1;i<items.length;i--){
+                                            if(items[i].field=='codeDateUseField'){
+                                                items[i].readOnly=true;
+                                                items[i].required=false;
+                                                break;
+                                            }
+                                        }
+                                        form.changeItems(detailfilter,items)
+                                    }
+                                }
+                            }else{
+                                form.setValues({},detailfilter);
+                            }
+
+                            form.on('select(codeElementType)',function (data){
+                                that.codeElementType=data.value;
+                                var items=that.getFormDetailItems(!add,data.name);
+                                form.addItems(detailfilter,items,function (){
+                                    form.setValues({codeElementType:that.codeElementType}, detailfilter);
+                                }, {}, {defaultColumnOneRow: 2,labelWidth:110})
+                                $('#tableFrom_' + detailfilter).parent().hide()
+                            })
+
+                            form.on('select(codeDateValueType)',function (data){
+                                var codeDateValueType=data.value;
+                                if(codeDateValueType == 'code_date_business'){
+                                    //涓氬姟鏃堕棿
+                                    var items=form.getFormItems(detailfilter);
+                                    var newItem;
+                                    for (var i=items.length-1;i<items.length;i--){
+                                        if(items[i].field=='codeDateUseField'){
+                                            newItem=items[i];
+                                            newItem.readOnly=false;
+                                            newItem.required=true;
+                                            items[i]=newItem;
+                                            break;
+                                        }
+                                    }
+                                    form.changeItems(detailfilter,items)
+                                }else{
+                                    //绯荤粺鏃堕棿
+                                    var items=form.getFormItems(detailfilter);
+                                    for (var i=items.length-1;i<items.length;i--){
+                                        if(items[i].field=='codeDateUseField'){
+                                            items[i].readOnly=true;
+                                            items[i].required=false;
+                                            items[i].value=''
+                                            break;
+                                        }
+                                    }
+                                    form.changeItems(detailfilter,items)
+                                }
+                            })
+
+                            form.on('select('+detailfilter+')',function (data){
+                                if(data.name=='codeUseField' && that.codeElementType=='code_element_enum'){
+                                    var items=form.getFormItems(detailfilter);
+                                    var newItem;
+                                    for (var i=items.length-1;i<items.length;i--){
+                                        if(items[i].field=='enumId'){
+                                            newItem=items[i];
+                                            newItem.readOnly=false;
+                                            newItem.required=true;
+                                            items[i]=newItem;
+                                            break;
+                                        }
+                                    }
+                                    var formValues = form.getValues(detailfilter,true);
+                                    formValues.enumId='';
+                                    formValues.enumName='';
+                                    form.setValues(formValues,detailfilter);
+                                    form.changeItems(detailfilter,items)
+                                    $('#tableFrom_' + detailfilter).parent().hide()
+                                }else if(data.name=='enumId'){
+                                    var enumData=data.rowData[0].keyValueList
+                                    layui.each(enumData,function (i,enumItem){
+                                        enumData[i].enumItemKey=enumItem.key;
+                                        enumData[i].enumItemValue=enumItem.value;
+                                        enumData[i].codeMapValue='';
+                                    })
+                                    renderEnumTable(enumData)
+                                    $('#tableFrom_' + detailfilter).parent().show()
+                                }
+                            })
+
+                        }, {}, {defaultColumnOneRow: 2,labelWidth:100});
+                },
+                yes:function(layero){
+                    if(form.validata(detailfilter)){
+                        var values = form.getValues(detailfilter,true);
+                        values.maxLength=parseInt(values.maxLength||1);
+                        values.minLength=parseInt(values.minLength||1);
+                        if(values.codeElementType!='code_element_static'){
+                            //涓嶄负甯搁噺
+                            if(values.minLength<=0){
+                                $webUtil.showErrorMsg("鏈�灏忛暱搴﹂渶澶т簬0");
+                                return false;
+                            }
+                            if(values.minLength>=values.maxLength){
+                                $webUtil.showErrorMsg("鏈�灏忛暱搴﹂渶灏忎簬鏈�澶ч暱搴�");
+                                return false;
+                            }
+                        }else{
+                            values.maxLength=values.staticCode.length;
+                            values.minLength=values.maxLength
+                        }
+
+                        if(values.codeFillType=='code_fill_right'||values.codeFillType=='code_fill_left'){
+                            if($webUtil.isNull(values.codeFillSeparator) ){
+                                $webUtil.showErrorMsg("璇疯緭鍏ヨˉ浣嶅瓧绗�");
+                                return false;
+                            }else if(values.codeFillSeparator.length>values.maxLength){
+                                $webUtil.showErrorMsg("琛ヤ綅瀛楃闀垮害涓嶈兘澶т簬鏈�澶ч暱搴�");
+                                return false;
+                            }
+                        }
+                        /*values.staticCode=values.staticCode?parseInt(values.staticCode):values.staticCode
+                        if(values.staticCode>values.maxLength){
+                            $webUtil.showErrorMsg("甯搁噺鍊间笉鑳藉ぇ浜庢渶澶ч暱搴�");
+                            return false;
+                        }*/
+                        try {
+                            values["codeElementTypeText"]=layui.vciWebComboxStore.getComboxText('codeElementType',values.codeElementType)
+                            values["codeFillTypeText"]=layui.vciWebComboxStore.getComboxText('codeFillType',values.codeFillType)
+                            values["codeDateValueTypeText"]=layui.vciWebComboxStore.getComboxText('codeDateValueType',values.codeDateValueType)
+                        }catch (e){
+
+                        }
+
+                        if(values.codeElementType=='code_element_enum'){
+                            var tableenumitems=layui.table.getData('tableFrom_' + detailfilter);
+                            var hasNull=0
+                            layui.each(tableenumitems,function (index,item){
+                                if($webUtil.isNull(item.codeMapValue)){
+                                    hasNull++;
+                                    return false;
+                                }
+                            })
+                            if(hasNull>0){
+                                $webUtil.showErrorMsg("鏄犲皠鐨勭爜鍊间笉鑳戒负绌�");
+                                return false;
+                            }
+                            values.enumMaps=tableenumitems;
+                            values.enumMapList=tableenumitems;
+                            selectData && (selectData.enumMapList=tableenumitems);
+                        }
+
+                        if(add){
+                            layui.table.addData('tableFrom_' + filter, values);
+                        }else{
+                            layui.table.changeRecord('tableFrom_' + filter,-1, values);
+                        }
+
+                        layer.close(addSaveDetailIndex);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveDetailIndex);
+                }
+            });
+        };
+        this.ENABLE=function (){
+            var that = this;
+            that.disableOrEnable(true);
+        }
+        this.DISABLE=function (){
+            var that = this;
+            that.disableOrEnable(false);
+        }
+        this.disableOrEnable = function (enable) {
+            var that = this;
+            var oid;
+            var ts;
+            oid = $webUtil.getOidFromGrid("table_" + that.id, true, true);
+            if (!oid) {
+                return false;
+            }
+            var lcStatusText = $webUtil.getOidFromGrid("table_" + that.id, false, true, 'lcStatusText');
+            if(enable && lcStatusText=='鍚敤'){
+                $webUtil.showErrorMsg('璇ョ姸鎬佷笉鍙互鍚敤');
+                return false
+            }
+            if(!enable && lcStatusText=='鍋滅敤'){
+                $webUtil.showErrorMsg('璇ョ姸鎬佷笉鍙互鍋滅敤');
+                return false
+            }
+            ts = $webUtil.getOidFromGrid("table_" + that.id, false, true, 'ts');
+            $webUtil.post(that.url.controller + (enable ? that.url.enableData : that.url.disableData), {oid: oid,ts: ts}, function (result) {
+                if (result.success) {
+                    $webUtil.showMsgFromResult(result, (enable ? '鍚敤鎴愬姛' : '鍋滅敤鎴愬姛'));
+                    that.refresh();
+                } else {
+                    $webUtil.showErrorMsg(result.msg);
+                }
+            }, function (xhr, err) {
+                $webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+            }, that.backPath);
+        };
+        this.refresh = function(){
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsDLL.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsDLL.js
new file mode 100644
index 0000000..4f426f2
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsDLL.js
@@ -0,0 +1,276 @@
+/**
+ * 鏁版嵁搴撶浉鍏崇殑鎿嶄綔
+ * @author weidy@2020-2-19
+ */
+layui.define(['layer','element','form','table','util'],function(exports){
+    var Class = function(){
+        this.MODELNAME = "platform/objectService/OsDLL";
+        this.moduleKey = "OsDLL";
+        this.id='OsDLL';
+        this.sourceData={};
+        this.columns = [];
+        this.backPath =  configData.compatibility?path:configData.frameworkPath;
+        this.url={
+            dataGrid:'smButtonController/dataGrid',//鍒楄〃鏁版嵁鍜屾煡璇�
+            add:'smButtonController/addSave',
+            edit:'smButtonController/editSave',
+            deleteUrl:'smButtonController/delete'
+        };
+        this.buttonIconMap = {
+            SEARCH:'layui-icon-refresh-2',
+            SENIORSEARCH:'layui-icon-query',
+            ADD:'layui-icon-add-1',
+            EDIT:'layui-icon-edit',
+            DELETE:'layui-icon-delete'
+        };
+        this.getContent=function(){//杩斿洖杩欎釜缁勪欢鐨勫熀纭�html
+            var that = this;
+            var html = "";
+            html = [
+                    '<div class="layui-layout-border">',
+                        '<div class="layui-center">',
+                            that.getToolbarHtml(),
+                            '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',//涓诲垪琛�
+                        '</div>',
+                    '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id, '" class="layui-btn-container">',//涓诲垪琛ㄧ殑鎸夐挳
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getDetailToolbarHtml = function(){
+            var me = this;
+            return '<div layui-filter="detail_toolbar_' + me.id + '" class="layui-btn-container"></div>';
+        };
+        this.init=function(){//鍩虹鐨刪tml琚坊鍔犲悗锛屽啀鎵ц鍒濆鍖�
+            var that = this;
+            $webUtil.copyConfig(that,that.moduleKey);
+            $webUtil.createButtonHtmlEx(that.sourceData,that.buttonIconMap,$('[layui-filter="toolbar_' + that.id + '"]'),that.id,
+                [{uniqueFlag:'ADD',alias:'娣诲姞'},{uniqueFlag:'EDIT',alias:'淇敼'},{uniqueFlag:'DEL',alias:'鍒犻櫎'},{uniqueFlag:'LISTUSED',alias:'鏌ョ湅搴旂敤鑼冨洿'},{uniqueFlag:'CASCADEDEL',alias:'鍏宠仈鍒犻櫎'},{uniqueFlag:'refresh',alias:'鍒锋柊'}],
+                [],function(buttons,hasViewRight,hasQueryRight) {
+                    hasViewRight = true;
+                    hasQueryRight = true;
+                    if (hasViewRight) {
+                        $webUtil.bindDefultButtonLisenter(that, that.id);
+                        var table = layui.table;
+                        that.checkColumns();//涓诲垪琛ㄤ腑鍒椼��
+                        table.render({
+                            elem: '#table_' + that.id,
+                            id: 'table_' + that.id,
+                            url: that.backPath + that.url.dataGrid,
+                            page: {
+                                limit: 30,
+                                page: 1
+                            },
+                            cols: [that.columns],
+                            done: function (res, cur, count) {
+                                if(res && res.data && res.data.length>0){
+                                    table.selectRecord('table_' + that.id,res.data[0]);
+                                }
+                            },
+                            rowClick: function (thisTableFilter, record) {
+                                if(that.hasDetailRight) {
+                                    table.reload("person_" + that.id, {
+                                        where: {
+                                            oid: record.oid
+                                        }
+                                    });
+                                }
+                            }
+                        });
+                        if(hasQueryRight) {
+                            $webUtil.createSearchHtml({
+                                id: '鎸夐挳鏍囪瘑',
+                                name: '鎸夐挳鍚嶇О'
+                            }, $('[layui-filter="toolbar_' + that.id + '"]'), 'table_' + that.id);
+                        }
+                    }else{
+                        $webUtil.showErrorMsg("鎮ㄦ病鏈夋潈闄愭祻瑙堟湰椤甸潰");
+                    }
+            });
+        };
+        this.ADD = function(){//淇濆瓨
+        	var that = this;
+        	layui.use('form',function(){
+				var form = layui.form;
+				var filter ="form_" + that.id;
+				var addSaveIndex = layer.open({
+					type:1,
+					title:'娣诲姞鎸夐挳',
+					btn:['淇濆瓨','鍙栨秷'],
+					skin:'layui-layer-lan',
+					content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+					area:['800px','270px'],
+				    closeBtn:2,
+				    shade:true,
+				    shadeClose:true,
+				    resize:true,
+				    resizing:function(layero){
+				    	form.doResize(filter);
+				    },
+				    success:function(layero) {
+                        form.addItems(filter,that.getFormItems(false),
+                        function () {}, {}, {defaultColumnOneRow: 2});
+                    },
+                    yes:function(layero){
+                        if(form.validata(filter)){
+                            var values = form.getValues(filter);
+                            $webUtil.post(that.url.add,values,function(result){
+                                if(result.success){
+                                    $webUtil.showMsg("娣诲姞鎸夐挳鎴愬姛");
+                                    layer.close(addSaveIndex);
+                                    that.refresh();
+                                }else{
+                                    $webUtil.showErrorMsg(result.msg);
+                                }
+                            },function (xhr,error) {
+
+                            },that.backPath);
+                        }
+                    },
+                    btn2:function(layero){
+                        layer.close(addSaveIndex);
+                        that.refresh();
+                    }
+				});
+			});
+        };
+        this.getFormItems = function(isEdit){
+            return [{
+                type: 'text',
+                name: 'id',
+                text: '鎸夐挳鏍囪瘑',
+                required: true
+            }, {
+                type: 'text',
+                name: 'name',
+                text: '鎸夐挳鍚嶇О',
+                required: true
+            }, {
+                name: 'iconCss',
+                text: '鏄剧ず鍥炬爣'
+            }, {
+                type: 'text',
+                name: 'description',
+                text: '鎻忚堪'
+            }];
+        };
+        this.EDIT = function(){
+        	var that = this;
+        	var oid = $webUtil.getOidFromGrid("table_" + that.id,true,true);
+        	if(!oid){
+        		return false;
+			}
+			var selectRowData = layui.table.checkStatus("table_" + that.id);
+        	layui.use('form',function(){
+				var form = layui.form;
+				var filter ="form_" + that.id;
+				var addSaveIndex = layer.open({
+                    type: 1,
+                    title: '淇敼鎸夐挳',
+                    btn: ['淇濆瓨', '鍙栨秷'],
+                    url: that.backPath + that.url.edit,
+                    skin: 'layui-layer-lan',
+                    content: '<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                    area: ['800px', '270px'],
+                    closeBtn: 2,
+                    shade: true,
+                    shadeClose: true,
+                    resize: true,
+                    resizing: function (layero) {
+                        form.doResize(filter);
+                    },
+                    success: function (layero) {
+                        form.addItems(filter,that.getFormItems(true),
+                            function () {
+								form.setValues(selectRowData.data[0],filter);
+                            }
+                            , {}
+                            , {
+                                defaultColumnOneRow: 2
+                            });
+                    },
+					yes:function(layero){
+                    	if(form.validata(filter)){
+                            var formValues = form.getValues(filter,true);
+                            formValues['oid'] = selectRowData.data[0].oid;
+                            formValues['ts'] = selectRowData.data[0].ts;
+                            $webUtil.put(that.url.edit,formValues,function (result) {
+								if(result.success){
+									$webUtil.showMsg("淇敼鎸夐挳鎴愬姛");
+									that.refresh();
+									layer.close(addSaveIndex);
+								}else{
+									$webUtil.showErrorMsg(result.msg);
+								}
+                            },function (error) {
+
+                            },that.backPath);
+						}
+					},
+					btn2:function(layero){
+                        that.refresh();
+                        layer.close()
+					}
+                });
+			});
+        };
+        
+        this.DEL= function(){
+            var that = this;
+            var oid = $webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts =  $webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            $webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欎釜鎸夐挳锛屽搴旂殑鍔熻兘鑿滃崟涓殑鎸夐挳涓嶄細鑷姩鍒犻櫎",function () {
+                $webUtil.deleteRequest(that.url.deleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        $webUtil.showMsg("鍒犻櫎鎸夐挳鎴愬姛");
+                        that.refresh();
+                    }else{
+                        $webUtil.showErrorMsg(result.msg);
+                    }
+                },function (xhr,error) {
+
+                },that.backPath);
+            });
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){//濡傛灉鍏朵粬鍦版柟鎯充娇鐢ㄨ繖涓粍浠剁殑鏃跺�欙紝鍙互鑷畾涔夊垪
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),{
+                    field:'id',
+                    title:'鎸夐挳鏍囪瘑',
+                    width:150
+                },{
+                    field:'name',
+                    title:'鎸夐挳鍚嶇О',
+                    width:200
+                },{
+                    field:'iconCss',
+                    title:'鏄剧ず鍥炬爣',
+                    width:100
+                },{
+                    field:'description',
+                    title:'鎻忚堪',
+                    width:150
+                }];
+            }
+        };
+        this.refresh = function(){
+            var that = this;
+            layui.table.reload("table_" + that.id);
+
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsEnum.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsEnum.js
new file mode 100644
index 0000000..668d795
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsEnum.js
@@ -0,0 +1,168 @@
+/**
+ * 鏋氫妇绫诲瀷
+ * @author weidy@2020-07-27
+ */
+layui.define(['layer','element','form','table','util'],function(exports){
+    var Class = function(){
+        this.MODELNAME = "platform/objectService/OsEnum";
+        this.moduleKey = "OsEnum";
+        this.id='OsEnum';
+        this.sourceData={};
+        this.columns = [];
+        this.backPath =  configData.compatibility?path:configData.objectServicePath;
+        this.url={
+            controller:(configData.compatibility?"webEnumController/":'enumController/'),
+            dataGrid:'gridEnum',
+            listItems:'gridEnumItemByOid'
+        };
+        this.buttonIconMap = {
+            SEARCH:'layui-icon-refresh-2',
+            SENIORSEARCH:'layui-icon-query',
+            ADD:'layui-icon-add-1',
+            EDIT:'layui-icon-edit',
+            DELETE:'layui-icon-delete'
+        };
+        this.getContent=function(){//杩斿洖杩欎釜缁勪欢鐨勫熀纭�html
+            var that = this;
+            var html = "";
+            html = [
+                    '<div class="layui-layout-border">',
+                        '<div class="layui-center">',
+                            that.getToolbarHtml(),
+                            '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                        '</div>',
+                        '<div class="layui-south" >',
+                            '<table id="detail_table_',that.id ,'" lay-filter="detail_table_', that.id ,'"></table>',
+                        '</div>',
+                    '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_button_',that.id,'" class="layui-btn-container">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-search"></i>鏌ョ湅搴旂敤鑼冨洿</button>',
+                '</div>',
+            ].join("");
+            return html;
+        };
+        this.init=function(){//鍩虹鐨刪tml琚坊鍔犲悗锛屽啀鎵ц鍒濆鍖�
+            var that = this;
+            $webUtil.copyConfig(that,that.moduleKey);
+            var table = layui.table;
+            that.checkColumns();//涓诲垪琛ㄤ腑鍒椼��
+            that.firstGridLoad = false;
+            table.render({
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                url:  that.url.controller + that.url.dataGrid,
+                backPath:that.backPath,
+                page: {
+                    limit: 25,
+                    page: 1
+                },
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                rowClick:function(filter,data){
+                    if(data){
+                        that.gridItemsByOid(data.oid);
+                    }
+                },
+                done:function(res, cur, count){
+                    if(!that.firstGridLoad) {
+                        that.initDetailTable(((res && res.data) ? res.data[0].oid : ""));
+                        that.firstGridLoad = true;
+                    }else{
+                        if(count>0){
+                            that.gridItemsByOid(res.data[0].oid);
+                        }
+                    }
+                }
+            });
+            $webUtil.createSearchHtml({
+                id:'鑻辨枃鍚嶇О',
+                name:'涓枃鍚嶇О'
+            },$("[layui-filter='toolbar_button_" + that.id + "']"),'table_' + that.id);
+            $webUtil.bindDefultButtonLisenter(that, that.id);
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){//濡傛灉鍏朵粬鍦版柟鎯充娇鐢ㄨ繖涓粍浠剁殑鏃跺�欙紝鍙互鑷畾涔夊垪
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),{
+                    field:'id',
+                    title:'鏋氫妇鑻辨枃鍚嶇О',
+                    width:150
+                },{
+                    field:'name',
+                    title:'鏋氫妇涓枃',
+                    width:150
+                },{
+                    field:'description',
+                    title:'鎻忚堪',
+                    width:250
+                },{
+                    field:'enumValueDataTypeText',
+                    title:'鏁版嵁绫诲瀷',
+                    width:80
+                }];
+            }
+        };
+        this.gridItemsByOid = function(pkEnum){
+            var that = this;
+            if($webUtil.isNull(pkEnum)){
+                return;
+            }
+            layui.table.reload("detail_" + that.id,{
+                where:{
+                    pkEnum: pkEnum
+                }
+            });
+        };
+        this.initDetailTable = function(pkEnum){
+            var that = this;
+            var table = layui.table;
+            that.checkDetailColumns();
+            table.render({
+                elem: '#detail_table_' + that.id,
+                id: 'detail_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller +  that.url.listItems,
+                where:{
+                    pkEnum:pkEnum
+                },
+                cols: [that.detailColumns]
+            });
+        };
+        this.checkDetailColumns = function () {
+            var that = this;
+            var table = layui.table;
+            if(that.detailColumns==null || that.detailColumns.length==0){//濡傛灉鍏朵粬鍦版柟鎯充娇鐢ㄨ繖涓粍浠剁殑鏃跺�欙紝鍙互鑷畾涔夊垪
+                that.detailColumns = [table.getIndexColumn(),table.getCheckColumn(),{
+                    field:'id',
+                    title:'鏋氫妇鍊�',
+                    width:150
+                },{
+                    field:'name',
+                    title:'鏋氫妇鍚嶇О',
+                    width:200
+                },{
+                    field:'description',
+                    title:'鎻忚堪',
+                    width:280
+                }];
+            }
+        };
+        this.refresh = function(){
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsLinkType.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsLinkType.js
new file mode 100644
index 0000000..806bac2
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsLinkType.js
@@ -0,0 +1,254 @@
+/**
+ * 閾炬帴绫诲瀷
+ * @author weidy@2023-03-26
+ */
+layui.define(['layer','element','form','table','util','platform/objectService/er/erContent'],function(exports){
+    var Class = function(){
+        this.MODELNAME = "platform/objectService/OsLinkType";
+        this.moduleKey = "OsLinkType";
+        this.id='OsLinkType';
+        this.sourceData={};
+        this.columns = [];
+        this.backPath =  configData.compatibility?path:configData.objectServicePath;
+        this.url={
+            controller:'linkTypeController/',
+            dataGrid:'gridLinkType',
+            listAttribute:'gridAttributeByLinkTypeOid'
+        };
+        this.buttonIconMap = {
+            SEARCH:'layui-icon-refresh-2',
+            SENIORSEARCH:'layui-icon-query',
+            ADD:'layui-icon-add-1',
+            EDIT:'layui-icon-edit',
+            DELETE:'layui-icon-delete'
+        };
+        this.vciFieldTypeMap = {
+            VTBoolean:"甯冨皵鍨�",
+            VTClob: "闀挎枃鏈�",
+            VTDate:"鏃ユ湡",
+            VTDateTime:"鏃ユ湡鏃堕棿",
+            VTTime:"鏃堕棿",
+            VTLong:"闀挎暣鍨�",
+            VTDouble:"閲戦/鍙岀簿搴�",
+            VTInteger:"鏁村舰",
+            VTFilePath:"鏂囦欢",
+            VTString:"瀛楃涓�"
+        };
+        this.getContent=function(){
+            var that = this;
+            var html = "";
+            html = [
+                    '<div class="layui-layout-border">',
+                        '<div class="layui-center">',
+                            that.getToolbarHtml(),
+                            '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                        '</div>',
+                        '<div class="layui-south" >',
+                            '<table id="detail_table_',that.id ,'" lay-filter="detail_table_', that.id ,'"></table>',
+                        '</div>',
+                    '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_button_',that.id,'" class="layui-btn-container">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_checkAttrDiff"><i class="layui-icon layui-icon-chart"></i>妫�鏌ョ被鍨嬩笉鍚岀殑灞炴��</button>',
+                '</div>',
+            ].join("");
+            return html;
+        };
+        this.init=function(){
+            //鍩虹鐨刪tml琚坊鍔犲悗锛屽啀鎵ц鍒濆鍖�
+            var that = this;
+            $webUtil.copyConfig(that,that.moduleKey);
+            var table = layui.table;
+            that.checkColumns();
+            //涓诲垪琛ㄤ腑鍒椼��
+            that.firstGridLoad = false;
+            table.render({
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                url:  that.url.controller + that.url.dataGrid,
+                backPath:that.backPath,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                rowClick:function(filter,data){
+                    if(data){
+                        that.gridAttributeByOid(data.oid);
+                    }
+                },
+                done:function(res, cur, count){
+                    if(!that.firstGridLoad) {
+                        that.initDetailTable(((res && res.data) ? res.data[0].oid : ""));
+                        that.firstGridLoad = true;
+                    }else{
+                        if(count>0){
+                            that.gridAttributeByOid(res.data[0].oid);
+                        }
+                    }
+                }
+            });
+            $webUtil.createSearchHtml({
+                id:'鑻辨枃鍚嶇О',
+                name:'涓枃鍚嶇О'
+            },$("[layui-filter='toolbar_button_" + that.id + "']"),'table_' + that.id);
+            $webUtil.bindDefultButtonLisenter(that, that.id);
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){//濡傛灉鍏朵粬鍦版柟鎯充娇鐢ㄨ繖涓粍浠剁殑鏃跺�欙紝鍙互鑷畾涔夊垪
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),{
+                    field:'id',
+                    title:'鑻辨枃鍚嶇О',
+                    width:130
+                },{
+                    field:'name',
+                    title:'涓枃鍚嶇О',
+                    width:150
+                },{
+                    field:'fromBtmTypeName',
+                    title:'from绔�',
+                    width:300
+                },{
+                    field:'toBtmTypeName',
+                    title:'to绔�',
+                    width:300,
+                }, {
+                    field: 'description',
+                    title: '鎻忚堪',
+                    width: 150
+                }];
+            }
+        };
+        this.gridAttributeByOid = function(linkTypeOid){
+            var that = this;
+            if($webUtil.isNull(linkTypeOid)){
+                return;
+            }
+            layui.table.reload("detail_" + that.id,{
+                where:{
+                    linkTypeOid: linkTypeOid
+                }
+            });
+        };
+        this.initDetailTable = function(linkTypeOid){
+            var that = this;
+            var table = layui.table;
+            that.checkDetailColumns();
+            table.render({
+                elem: '#detail_table_' + that.id,
+                id: 'detail_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller +  that.url.listAttribute,
+                where:{
+                    linkTypeOid:linkTypeOid
+                },
+                cols: [that.detailColumns]
+            });
+        };
+        this.checkDetailColumns = function () {
+            var that = this;
+            var table = layui.table;
+            if(that.detailColumns==null || that.detailColumns.length==0){//濡傛灉鍏朵粬鍦版柟鎯充娇鐢ㄨ繖涓粍浠剁殑鏃跺�欙紝鍙互鑷畾涔夊垪
+                that.detailColumns = [table.getIndexColumn(),table.getCheckColumn(),{
+                    field:'id',
+                    title:'灞炴�ц嫳鏂囧悕绉�',
+                    width:150
+                },{
+                    field:'name',
+                    title:'灞炴�т腑鏂囧悕绉�',
+                    width:200
+                },{
+                    field:'attributeLength',
+                    title:'闀垮害',
+                    width:80,
+                    templet:function (d){
+                        return d.attrLength || d.attributeLength;
+                    }
+                },{
+                    field:'attrDataType',
+                    title:'鏁版嵁绫诲瀷',
+                    width:80,
+                    templet:function(d){
+                        return that.vciFieldTypeMap[d.attrDataType] || that.vciFieldTypeMap[d.attributeDataType];
+                    }
+                },{
+                    field:'nullableFlag',
+                    title:'鏄惁鍙互涓虹┖',
+                    width:120,
+                    templet:function(d){
+                        return $webUtil.formateBoolean(d.nullableFlag);
+                    }
+                },{
+                    field:'defaultValue',
+                    title:'榛樿鍊�',
+                    width:80
+                },{
+                    field:'precisionLength',
+                    title:'灏忔暟绮惧害',
+                    width:80
+                },{
+                    field:'scaleLength',
+                    title:'灏忔暟鍒诲害',
+                    width:80
+                },{
+                    field:'range',
+                    title:'鍙栧�艰寖鍥�',
+                    width:100
+                },{
+                    field:'referFlag',
+                    title:'鏄惁鍙傜収',
+                    width:130,
+                    templet:function(d){
+                        if(!d.referFlag){
+                            return '鍚�';
+                        }else{
+                            return d.referBtmTypeId
+                        }
+                    }
+                },{
+                    field:'enumFlag',
+                    title:'鏄惁鏋氫妇',
+                    width:130,
+                    templet:function(d){
+                        if(!d.enumFlag){
+                            return '鍚�';
+                        }else{
+                            return d.enumId
+                        }
+                    }
+                }];
+            }
+        };
+        this.refresh = function(){
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+        this.checkAttrDiff = function (){
+            var that = this;
+            var oid = $webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            $webUtil.post (that.url.controller + "/checkAttributeTypeDifferent",{linkTypeOid:oid},function (result){
+                if(result.success ){
+                    $webUtil.showMsg("娌℃湁灞炴�ф槸涓嶅悓鐨�");
+                }else{
+                    $webUtil.showErrorMsg(result.data);
+                }
+            },function (err,xhr){
+                $webUtil.showErrorMsg("鏈嶅姟鍙兘娌℃湁鍚姩");
+            },that.backPath);
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsWebApi.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsWebApi.js
new file mode 100644
index 0000000..84e4682
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsWebApi.js
@@ -0,0 +1,116 @@
+/**
+ * web璋冪敤鐨刟pi
+ * @author weidy
+ */
+layui.define(['layer','element','form','table','util'],function(exports){
+    var Class = function(){
+        this.MODELNAME = "platform/objectService/OsWebApi";
+        this.moduleKey = "OsWebApi";
+        this.id='OsWebApi';
+        this.sourceData={};
+        this.columns = [];
+        this.backPath =  configData.compatibility?path:configData.objectServicePath;
+        this.url={
+            controller:'webApiController/',
+            dataGrid:'gridWebApi',
+            listMethods:'gridWebApiMethodByApiOid'
+        };
+        this.buttonIconMap = {
+            SEARCH:'layui-icon-refresh-2',
+            SENIORSEARCH:'layui-icon-query',
+            ADD:'layui-icon-add-1',
+            EDIT:'layui-icon-edit',
+            DELETE:'layui-icon-delete'
+        };
+        this.getContent=function(){//杩斿洖杩欎釜缁勪欢鐨勫熀纭�html
+            var that = this;
+            var html = "";
+            html = [
+                    '<div class="layui-layout-border">',
+                        '<div class="layui-center">',
+                            '<div layui-filter="toolbar_button_',that.id,'" class="layui-btn-container">',
+                            '</div>',
+                            '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                            '<div id="toolbar_column_',that.id ,'" style="display:none;"></div>',
+                        '</div>',
+                    '</div>'
+            ].join("");
+            return html;
+        };
+        this.init=function(){//鍩虹鐨刪tml琚坊鍔犲悗锛屽啀鎵ц鍒濆鍖�
+            var that = this;
+            $webUtil.copyConfig(that,that.moduleKey);
+            var table = layui.table;
+            that.checkColumns();//涓诲垪琛ㄤ腑鍒椼��
+            that.firstGridLoad = false;
+            table.render({
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                url:  that.url.controller + that.url.dataGrid,
+                backPath:that.backPath,
+                page: {
+                    limit: 30,
+                    page: 1
+                },
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'listMethods'){
+                                that.showMethods(data.oid,data.text);
+                            }
+                        });
+                        that.fristMainLoad = true;
+                    }
+                }
+            });
+            $webUtil.createSearchHtml({
+                showtext:'鎺ュ彛涓枃鍚嶇О',
+                name:'鎺ュ彛鍚嶇О'
+            },$("[layui-filter='toolbar_button_" + that.id + "']"),'table_' + that.id);
+            $webUtil.bindDefultButtonLisenter(that, that.id);
+            document.getElementById("toolbar_column_" + that.id).innerHTML =
+                    '<a class="layui-btn layui-btn-intable" lay-event="listMethods">鏌ョ湅鏂规硶</a>';
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){//濡傛灉鍏朵粬鍦版柟鎯充娇鐢ㄨ繖涓粍浠剁殑鏃跺�欙紝鍙互鑷畾涔夊垪
+                that.columns = [table.getIndexColumn(),{
+                    field:'name',
+                    title:'鍚嶇О',
+                    width:600
+                },{
+                    field:'text',
+                    title:'涓枃',
+                    width:250
+                },{
+                    field:'ts',
+                    title:'鏈�鍚庝慨鏀规椂闂�',
+                    width:150,
+                    templet:function(d){
+                        return $webUtil.formateDateTime(d.ts);
+                    }
+                },{
+                    field:'options',
+                    title:'鎿嶄綔',
+                    width:80,
+                    toolbar:'#toolbar_column_' + that.id
+                }];
+            }    
+        };
+        this.showMethods = function(apiOid,text){
+            var that = this;
+            portal.showTabByMenu(that.id + "_methods_" + apiOid,{
+                id:that.id + "_methods_" + apiOid,
+                text:"鏌ョ湅鍚庡彴鎺ュ彛[" + text + "]",
+                bsUrl:'USEJS:platform/objectService/OsWebMethods?apiOid=' + apiOid,
+            });
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsWebMethods.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsWebMethods.js
new file mode 100644
index 0000000..8989ec9
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/OsWebMethods.js
@@ -0,0 +1,256 @@
+/**
+ * web璋冪敤鎺ュ彛鏂规硶
+ * @author weidy
+ */
+layui.define(['layer','element','form','table','util','element'],function(exports){
+    var Class = function(){
+        this.MODELNAME = "platform/objectService/OsWebMethods";
+        this.moduleKey = "OsWebMethods";
+        this.id='OsWebMethods';
+        this.sourceData={};
+        this.columns = [];
+        this.backPath =  configData.compatibility?path:configData.objectServicePath;
+        this.url={
+            controller:'webApiController/',
+            listMethods:'gridWebApiMethodByApiOid'
+        };
+        this.buttonIconMap = {
+            SEARCH:'layui-icon-refresh-2',
+            SENIORSEARCH:'layui-icon-query',
+            ADD:'layui-icon-add-1',
+            EDIT:'layui-icon-edit',
+            DELETE:'layui-icon-delete'
+        };
+        this.prototalColor = {
+            'POST':'GREEN',
+            'GET':'BLUE',
+            'PUT':'GRAY',
+            'DELETE':'RED'
+        };
+        this.javaTypeMap = {
+            'java.lang.String':'瀛楃涓�',
+            'java.lang.Integer' :'鏁板瓧',
+            'int':'鏁板瓧',
+            'java.lang.Long':'闀挎暟瀛�',
+            'long':'闀挎暟瀛�',
+            'java.lang.Double':'楂樼簿搴︽暟瀛�',
+            'double':'楂樼簿搴︽暟瀛�',
+            'short':'鏁板瓧',
+            'java.lang.Short':'鏁板瓧',
+            'float':'娴偣鏁�',
+            'java.lang.Float':'娴偣鏁�',
+            'java.util.Date':'鏃ユ湡/鏃堕棿'
+        };
+        this.getContent=function(){//杩斿洖杩欎釜缁勪欢鐨勫熀纭�html
+            var that = this;
+            var html = "";
+            html = [
+                    '<div class="layui-layout-border">',
+                        '<div class="layui-center">',
+                            '<span>闇�瑕侀獙璇佺殑鎺ュ彛锛岄渶瑕佸湪header閲屾坊鍔燗uthorizationToken</span>',
+                            '<div  class="layui-collapse" id="collapse_',that.id,'"></div>',
+                        '</div>',
+                    '</div>'
+            ].join("");
+            return html;
+        };
+        this.init=function(){//鍩虹鐨刪tml琚坊鍔犲悗锛屽啀鎵ц鍒濆鍖�
+            var that = this;
+            $webUtil.copyConfig(that,that.moduleKey);
+            var table = layui.table;
+            if(!that.sourceData || !("apiOid" in that.sourceData) || $webUtil.isNull(that.sourceData['apiOid'])){
+                $webUtil.showErrorMsg("娌℃湁浼犻�抋pi鐨勫璞�");
+            }
+            var apiOid = that.sourceData['apiOid'];
+            $webUtil.post(that.url.controller + that.url.listMethods,{apiOid:apiOid},function(result){
+                if(result.success){
+                    that.showMethods(result.obj) ;  
+                }else{
+                    $webUtil.showErrorMsg(result.msg);
+                }
+            },function(xhr,error){
+                $webUtil.showErrorMsg("鑾峰彇鎺ュ彛鏂规硶鍑虹幇浜嗛敊璇紝鍙兘鏄湇鍔℃病鏈夊惎鍔�");
+            },that.backPath,false,false);
+        };
+        this.showMethods = function(data){
+            var that = this;
+            $("#collapse_" + that.id).html('');
+            if(data && data.length > 0){
+                var itemHtmls = [];
+                layui.each(data,function(_index,_item){
+                    itemHtmls.push('<div class="layui-colla-item">');
+                    itemHtmls.push('<h2 class="layui-colla-title">');
+                    itemHtmls.push('<span style="font-size: 10px;color:#fff;font-weight: 700;min-width:80px; padding: 6px 15px;text-align: center;border-radius: 3px;background: #000;background-color:' 
+                    + that.getPrototalColor(_item) + ';" >' + _item.supportProtocal + '</span>');
+                    itemHtmls.push('<span style="margin-left:20px">' + _item.text + "</span>");
+                    itemHtmls.push('<span style="margin-left:100px;">' + _item.requestMap + '</span>'); 
+                    if(_item.unControllRightFlag){
+                        itemHtmls.push('<span style="margin-left:50px;">鏃犻渶璁よ瘉</span>'); 
+                    }
+                    itemHtmls.push('</h2>');
+                    itemHtmls.push('<div class="layui-colla-content ' + (_index == 0?'layui-show':'') + '">');
+                    //澶勭悊鍏蜂綋鐨勫唴瀹�
+                    itemHtmls.push('<span>鍙傛暟</span><hr class="layui-bg-red"></hr>');
+                    if(_item.params){
+                        itemHtmls.push('<div class="layui-container"  style=" margin-left: 5px;">');
+                        //鏈夊弬鏁�
+                        var paramHtml = [];
+                        layui.each(_item.params,function(__index,param){
+                            paramHtml.push('<div class="layui-row">');
+                            var requestName = param.requestName;
+                            if($webUtil.isNull(requestName)){
+                                requestName = param.name;
+                            }
+                            if(param.requestBody){
+                                paramHtml.push('<div class="layui-col-md12">');
+                                paramHtml.push('contentType闇�瑕佽缃负"application/json"锛屽苟涓旀彁浜ょ殑鏁版嵁蹇呴』涓簀son鏍煎紡鐨勫瓧绗︿覆<br/>');
+                                paramHtml.push('<pre class="layui-code">');
+                                if('java.lang.List' == param.classType){
+                                    paramHtml.push("[" + JSON.stringify(that.fieldToShowText(param.paramClassFields)) + "]"); 
+                                }else{
+                                    paramHtml.push(JSON.stringify(that.fieldToShowText(param.paramClassFields)) );
+                                }
+                                paramHtml.push('</pre>');
+                                paramHtml.push('</div>');
+                            }else if(param.sessionValue || param.cookieValue ){
+                                paramHtml.push('<div class="layui-col-md12">');
+                                paramHtml.push('鏈弬鏁版棤闇�浼犻�掞紝鏄敱鍚庡彴鑷澶勭悊');
+                                paramHtml.push('</div>');
+                            }else{
+                                if(param.paramBasicType){
+                                    //璇存槑鏄熀纭�绫诲瀷
+                                    paramHtml.push('<div class="layui-col-md3">');
+                                    paramHtml.push(requestName);
+                                    paramHtml.push('</div>');
+                                    paramHtml.push('<div class="layui-col-md4">');
+                                    paramHtml.push(that.javaTypeMap[param.classType]);
+                                    paramHtml.push('</div>');
+                                    paramHtml.push('<div class="layui-col-md5">');
+                                    paramHtml.push(param.text);
+                                    paramHtml.push('</div>');
+                                }else{
+                                    paramHtml.push('<div class="layui-col-md3">');
+                                    paramHtml.push(requestName);
+                                    paramHtml.push('</div>');
+                                    paramHtml.push('<div class="layui-col-md3">');
+                                    paramHtml.push(param.text);
+                                    paramHtml.push('</div>');
+                                    paramHtml.push('<div class="layui-col-md6">');
+                                    paramHtml.push('<pre class="layui-code">');
+                                    if('java.lang.List' == param.classType){
+                                        paramHtml.push("[" + JSON.stringify(that.fieldToShowText(param.paramClassFields,null,4)) + "]"); 
+                                    }else{
+                                        paramHtml.push(JSON.stringify(that.fieldToShowText(param.paramClassFields),null,4) );
+                                    }
+                                    paramHtml.push('</pre>');
+                                    paramHtml.push('</div>');
+                                }
+                            }
+                            paramHtml.push('</div>');   
+                        });
+                        itemHtmls.push(paramHtml.join(''));
+                        itemHtmls.push('</div>');
+                    }
+                    if(_item.returns){
+                        itemHtmls.push('<span>杩斿洖鍊�:' +  _item.returns.text + '</span><hr class="layui-bg-blue"></hr>');
+                        itemHtmls.push('<div class="layui-container" style=" margin-left: 5px;">');
+                        itemHtmls.push('<div class="layui-row">');
+                        itemHtmls.push('<div class="layui-col-md12">');
+                                //鏃犺鏄熀纭�绫诲瀷锛岃繕鏄嚜瀹氫箟绫诲瀷锛岃繑鍥炲�奸兘鏄疊aseResult
+                        itemHtmls.push('<pre class="layui-code">');
+                        var baseResult = _item.returns.returnResult;
+                        if(baseResult.obj){
+                            baseResult.obj = that.fieldToShowText(baseResult.obj);
+                        }else if(baseResult.data){
+                            baseResult.data = that.fieldToShowText(baseResult.data);
+                        }else if(baseResult.treeData){
+                            baseResult.treeData = that.getTreeField();
+                        }
+                        that.switchBaseResult(baseResult);
+                        itemHtmls.push(JSON.stringify(baseResult,null, 4));
+                        itemHtmls.push('</pre>');
+                        itemHtmls.push('</div>');
+                        itemHtmls.push('</div>');
+                        itemHtmls.push('</div>');    
+                    }
+                    itemHtmls.push('</div>');
+                    itemHtmls.push('</div>');
+                });
+                $("#collapse_" + that.id).html(itemHtmls.join(''));
+                layui.element.init();
+            }
+        };
+        this.switchBaseResult = function(result){
+            result.code = "鐘舵�佺爜锛�200琛ㄧず鎴愬姛锛�401琛ㄧず鏈潈闄愶紝403琛ㄧず鏁版嵁鏍煎紡涓嶅锛�404琛ㄧず璺緞涓嶅锛�500鏄悗鍙板嚭鐜颁簡鏈崟鑾风殑寮傚父";
+            result.exceptionClassName = "鍑虹幇寮傚父鐨勭被鐨勫悕绉帮紝鍙湁鍚庡彴璋冪敤鍏朵粬鏈嶅姟鐨勬椂鍊欐墠浣跨敤";
+            result.exceptionCode="寮傚父鐨勭紪鍙凤紝鍙湁鍚庡彴鍦ㄨ繑鍥炲�肩殑涓婅鏄庤浣跨敤杩欎釜灞炴�у垽鏂笟鍔″紓甯哥殑鎯呭喌鏃讹紝鍓嶇鎵嶈鍙�";     
+            result.exceptionObjs="寮傚父鐨勮鍙ヤ娇鐢ㄧ殑瀵硅薄锛屽彧鏈夊悗鍙拌皟鐢ㄥ叾浠栨湇鍔$殑鏄墠浣跨敤";
+            result.finishTime ="鎬ц兘娴嬭瘯浣跨敤锛屽悗鍙板鐞嗗畬鎴愮殑鏃堕棿";
+            result.msg="鎻愮ず淇℃伅锛屽湪涓氬姟閿欒鍜屼笟鍔℃垚鍔熸椂閮藉彲鑳戒娇鐢ㄥ埌锛屾煇浜涙帴鍙d笟鍔℃垚鍔熶笉浼氳繑鍥炴灞炴��";
+            result.msgObjs = "杞崲鎻愮ず娑堟伅鐨勫璇娇鐢ㄧ殑婧愭暟鎹�";
+            result.requestTraceId = "闃叉鎺ュ彛骞傜瓑鎬ф椂鐨勮姹傚敮涓�ID";
+            result.success = "true琛ㄧず鎵ц鎴愬姛锛屽惁鍒欒〃绀烘墽琛屽け璐�";
+            result.total = "鎬绘暟锛屽垪琛ㄦ椂浣跨敤";
+            result.traceId = "鍚庡彴鎵ц鐨勫敮涓�ID";
+            result.description = "杩欎釜灞炴�у悗鍙颁笉杩斿洖锛屾槸鎻忚堪杩斿洖缁撴灉涓殑data,obj鍜宼reeData鐨勭敤閫旂殑銆傚鏋滄槸鍒楄〃鏁版嵁鍒欎竴鑸彇data锛屽鏋滄槸鏍戝舰鏁版嵁鍒欏彇treeData锛屽叾浠栨搷浣滃彇obj";
+            
+        };
+        this.getTreeField = function(){
+            return {
+                oid:'瀛楃涓� 鏍戣妭鐐逛富閿�',
+                text:'瀛楃涓� 鏍戣妭鐐规樉绀烘枃鏈�',
+                leaf:'甯冨皵 鏄惁鍙跺瓙鑺傜偣锛岄粯璁や负false',
+                showCheckbox:'甯冨皵 鏄惁鏄剧ず澶嶉�夋,榛樿涓篺alse',
+                checked:'甯冨皵 鏄惁榛樿閫変腑锛屽湪showCheckbox涓簍rue鏃舵墠鐢熸晥锛岄粯璁や负false',
+                children:'鍒楄〃瀵硅薄 涓嬬骇鏍戣妭鐐�',
+                icon:'瀛楃涓� 鍥炬爣璺緞锛岀洰鍓嶆湭鍚敤',
+                iconCls:'瀛楃涓� 鍥炬爣鏍峰紡',
+                parentId:'瀛楃涓� 涓婄骇鑺傜偣涓婚敭',
+                expanded:'甯冨皵 鏄惁榛樿灞曞紑褰撳墠鑺傜偣锛岄粯璁や负false',
+                href:'瀛楃涓� 鐐瑰嚮鏍戣妭鐐圭殑閾炬帴鍦板潃',
+                index:'瀛楃涓� 鎺掑簭绱㈠紩',
+                attributes:{
+                    xxx:'attributes鏄繖涓爲鑺傜偣鍏宠仈涓氬姟鏁版嵁锛宮ap鐨勫舰寮忥紝xxx鏄睘鎬у悕'
+                }
+            };
+        };
+        this.getPrototalColor = function(_item){
+            var that = this;
+            if(!_item.supportProtocal){
+                _item.supportProtocal = '';
+            }
+            var color = that.prototalColor[_item.supportProtocal.toUpperCase()];
+            if(!color){
+                color = 'orange ';
+            }
+            return color;
+        };
+        this.fieldToShowText = function(fieldVOs,isList){
+            var that = this;
+            var fieldShow = {};
+            layui.each(fieldVOs,function(_index,field){
+                var showType = that.javaTypeMap[field.classType];
+                if(field.customClassType){
+                    //璇存槑涓嶆槸鍩虹鐨勭被鍨�
+                    var fieldShowForThis = that.fieldToShowText(field.customFields,field.fieldIsList);
+                    fieldShow[field.name] = fieldShowForThis;
+                }else{
+                    if(field.fieldIsList){
+                        fieldShow[field.name] = (showType + " " + field.text + ",杩欎釜鏄垪琛ㄦ彁浜�");
+                    }else if(field.fieldIsMap){
+                        fieldShow[field.name] = (field.text + " 杩欎釜鏄痬ap鏍煎紡");
+                    }else{
+                        fieldShow[field.name] = (showType + " " + field.text);
+                    }
+                }
+            });
+            if(isList){
+                return [fieldShow];
+            }else{
+                return fieldShow;
+            }
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/VciDataBaseConnect.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/VciDataBaseConnect.js
new file mode 100644
index 0000000..2182bf2
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/VciDataBaseConnect.js
@@ -0,0 +1,356 @@
+/**
+ * 鏁版嵁搴撻摼鎺ラ〉闈�
+ * @author weidy
+ * @date 2021-11-29
+ */
+layui.define(['layer','element','form','table','dynamicCondition' ],function(exports){
+        var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "platform/objectService/VciDataBaseConnect";
+        this.moduleKey = "VciDataBaseConnect";
+        this.backPath =  configData.compatibility?path:configData.adminServicePath;
+        this.url = {
+            controller:'vciDataBaseConnectController/',
+            dataGrid:'gridVciDataBaseConnect',
+            addSave:'addSave',
+            editSave:'editSave',
+            deleteUrl:'deleteData',
+            getObjectByOid:'getObjectByOid',
+            testConnect:'testConnect'
+        };
+        this.getContent=function(){
+            var that = this;
+            var html = "";
+            html = [
+                '<div class="layui-layout" style="display:block;overflow-y: hidden">',
+                    '<div class="layui-layout-border" style="display:block;margin-top:0px; " id="border_',that.id,'">',
+                        '<div class="layui-center" style="overflow-y:auto;">',
+                            that.getToolbarHtml(),
+                            '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                        '</div>',
+                    '</div>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.createSearchHtml({id:"缂栧彿",name:"鍚嶇О"} ,$("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+        };
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            that.initMainTable();
+            that.createSearchHtml();
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var tableWidth = $("#border_" + that.id).width()-225;
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                width:tableWidth,
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'EDIT'){
+                                that.addOrEdit(false,data.oid);
+                            }
+                            if(layEvent == 'TESTCONNECT'){
+                                that.testConnect(data.oid);
+                            }
+                        });
+                    }else{
+                        if(total>0) {
+                            table.selectRecord('table_' + that.id, {index:0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                }
+            };
+            if(parentFieldName){
+                options.treeConfig = {
+                    treepid:parentFieldName,
+                    treeid:'id',
+                    showField:'name'
+                };
+            }
+            table.render(options);
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(), {
+                    title: '缂栧彿',
+                    field: 'id',
+                    sort:true,
+                    width: 80
+                },
+                    {
+                        title: '鍚嶇О',
+                        field: 'name',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '鏁版嵁搴撶殑绫诲瀷',
+                        field: 'databaseType',
+                        sort:true,
+                        width: 80
+                    },
+                    {
+                        title: '杩炴帴璺緞',
+                        field: 'dbLinkUrl',
+                        sort:true,
+                        width: 350
+                    },
+                    {
+                        title: '瀵嗙爜',
+                        field: 'dbPassword',
+                        sort:true,
+                        width: 80
+                    },
+                    {
+                        title: '鐢ㄦ埛鍚�',
+                        field: 'dbUserName',
+                        sort:true,
+                        width: 90
+                    },
+                    {
+                        title: '鎻忚堪',
+                        field: 'description',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '椹卞姩鐨勭被',
+                        field: 'driverClass',
+                        sort:true,
+                        width: 150
+                    },
+
+                    {
+                        field:'options',
+                        title:'鎿嶄綔',
+                        width:180,
+                        templet:function(d){
+                            return '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>' + '<a class="layui-btn layui-btn-intable" lay-event="TESTCONNECT">娴嬭瘯閾炬帴</a>';
+                        }
+                    }];
+            }
+        };
+
+        this.getFormItems = function(onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [
+                                   {
+                    field: 'id',
+                    title: '缂栧彿',
+                    type: 'text',
+                     required: true,
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'name',
+                    title: '鍚嶇О',
+                    type: 'text',
+                    required: true,
+                    readOnly:onlyShow
+                },
+                {
+                    field: 'databaseType',
+                    title: '鏁版嵁搴撶殑绫诲瀷',
+                    required: true,
+                    type: 'combox',
+                    readOnly:onlyShow,
+                    comboxKey:'databaseType',
+                    defaultValue:'oracle',
+                    data:[{key:"oracle",value:"oracle"},{key:"mysql",value: "mysql"}]
+                } ,          {
+                    field: 'driverClass',
+                    title: '椹卞姩鐨勭被',
+                    required: true,
+                    type: 'text',
+                    inputWidth:500,
+                    useAllWidth:true,
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'dbLinkUrl',
+                    title: '杩炴帴璺緞',
+                    required: true,
+                    type: 'text',
+                    inputWidth:500,
+                    useAllWidth:true,
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'dbUserName',
+                    title: '鐢ㄦ埛鍚�',
+                    type: 'text',
+                    readOnly:onlyShow
+                }  ,                {
+                    field: 'dbPassword',
+                    title: '瀵嗙爜',
+                    type: 'text',
+                    readOnly:onlyShow
+                },                {
+                    field: 'description',
+                    title: '鎻忚堪',
+                    type: 'text',
+                    readOnly:onlyShow
+                }  ];
+        };
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            that.addOrEdit(false,oid);
+        };
+        this.addOrEdit = function(add,oid) {
+            var that = this;
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var addSaveIndex =webUtil.dialog({
+                title:add?'娣诲姞鏁版嵁搴撻摼鎺�':'淇敼鏁版嵁搴撻摼鎺�',
+                btn:['淇濆瓨','鍙栨秷'],
+                skin:'layui-layer-lan',
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getFormItems(false),
+                        function () {
+                            if(!add){
+                                form.load(filter,{
+                                    backPath:that.backPath,
+                                    url:that.url.controller + that.url.getObjectByOid,
+                                    method:'get',
+                                    params:{
+                                        oid:oid
+                                    }
+                                });
+                            }else{
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+                        }, {}, {defaultColumnOneRow: 2});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        var url = that.url.controller + (add?that.url.addSave:that.url.editSave);
+                        webUtil.ajax(add?'post':'put',url,values,function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts= webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+        this.refresh = function () {
+            var that = this;
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+
+        this.ADVQUERY = function () {
+            var that = this;
+            if(!that.serinorQueryInstance) {
+                var dynamicCondition = layui.dynamicCondition;
+                $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar' + that.id + '" class="layui-inline"></div>');
+                that.checkColumns();
+                var dataFields = [];
+                for(var i = 0 ; i < that.columns.length ; i ++){
+                    dataFields[i] = that.columns[i];
+                }
+                that.serinorQueryInstance = dynamicCondition.create({
+                    fields: dataFields//鏌ヨ瀛楁
+                    , tableId: "table_" + that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                    , type: "complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                    , queryCallBack: function (requestData) {//鏌ヨ涔嬪悗鐨刢allback
+
+                    }
+                });
+            }
+            that.serinorQueryInstance.open();
+        };
+        this.testConnect = function (oid){
+            var that = this;
+            $webUtil.post(that.url.controller + that.url.testConnect,{oid:oid},function (result){
+                if(result.success){
+                    $webUtil.showMsgFromResult(result,"閾炬帴鎴愬姛");
+                }else{
+                    $webUtil.showErrorMsg(result.msg);
+                }
+            },function (error,xhr){
+                $webUtil.showErrorMsg("閾炬帴鏈嶅姟鍑虹幇浜嗛敊璇�");
+            },that.backPath);
+        }
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/VciMarkdownViewer.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/VciMarkdownViewer.js
new file mode 100644
index 0000000..85db8d0
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/VciMarkdownViewer.js
@@ -0,0 +1,61 @@
+/**
+ * markdown鏂囦欢棰勮
+ * @author weidy@2021-12-2
+ * @constructor
+ */
+layui.define(['layer','element','form','table','tree'],function(exports){
+    var MD = function(){
+        this.MODELNAME = "platform/objectService/VciMarkdownViewer";
+        this.moduleKey = "VciMarkdownViewer";
+        this.id='VciMarkdownViewer';
+        this.sourceData={};
+        this.backPath = configData.adminServicePath;
+        this.url={
+            controller:'helpDocumentController/',
+            getContent:'createOrGetContentByOid'
+        };
+        this.getContent=function(){
+            var that = this;
+            var html = "";
+            html = [
+                '<div style="display:block;" class="markdownDiv" id="md_',that.id,'">',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.init=function(){//鍩虹鐨刪tml琚坊鍔犲悗锛屽啀鎵ц鍒濆鍖�
+            var that = this;
+            $webUtil.copyConfig(that,that.moduleKey);
+            //鍔犺浇js鍜宑ss
+            var loadCssList ={
+                md:'style/css/markdown.min.css'
+            }
+            var loadJsList = {
+                md:'jslib/markdown/marked.min.js'
+            }
+            for(var cssName in loadCssList){
+                var cssFileName = loadCssList[cssName];
+                $("head").append('<link href="'+ cssFileName + '"  rel="stylesheet" type="text/css" />');//娣诲姞css寮曠敤
+            }
+            //鍔犺浇js鏂囦欢
+            for(var jsName in loadJsList){
+                var jsUrl = loadJsList[jsName];
+                $("head").append('<script src="' +jsUrl + '" type="text/javascript" charset="UTF-8"></script>');
+            }
+            var oid = that.sourceData['mdOid'] || that.sourceData['oid'];
+            if(oid){
+                $webUtil.get(that.url.controller + that.url.getContent,{oid:oid},function (result){
+                    if(result.success){
+                        $("#md_" + that.id).html(marked(result.obj));
+                    }else{
+                        $webUtil.showErrorMsg(result.msg);
+                    }
+                },function (error,xhr){
+                    $webUtil.showErrorMsg("鏈嶅姟閾炬帴寮傚父");
+                },that.backPath);
+            }
+        };
+    };
+    var md = new MD();
+    exports(md.MODELNAME,md);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/VciMd.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/VciMd.js
new file mode 100644
index 0000000..7dcd25b
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/VciMd.js
@@ -0,0 +1,71 @@
+/**
+ * markdown鏂囦欢棰勮
+ * @author weidy@2021-3-16
+ * @constructor
+ */
+layui.define(['layer','element','form','table','tree'],function(exports){
+    var MD = function(){
+        this.MODELNAME = "platform/objectService/VciMd";
+        this.moduleKey = "VciMd";
+        this.id='VciMd';
+        this.sourceData={};
+        this.backPath = configData.compatibility?path:configData.objectServicePath;
+        this.url={
+            controller:'mdController/',
+            tree:'treeAllMD'
+        };
+        this.getContent=function(){
+            var that = this;
+            var html = "";
+            html = [
+                that.getToolbarHtml(),
+                '<div class="layui-layout" style="display:block;overflow-y: hidden">',
+                    '<div class="layui-vci-tree" style="width:200px;float: left;background-color:#ffffff;overflow-y: auto;padding-top: 10px;">',
+                        '<ul layui-filter="tree_',that.id,'" style="overflow-x: auto;"><ul>',
+                    '</div>',
+                    '<div class="layui-layout-border" style="display:block;margin-top:0px;margin-left:205px;">',
+                        '<div class="layui-center" style="overflow-y:auto;" id="md_',that.id,'">',
+                        '</div>',
+                    '</div>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml = function(){
+            var that = this;
+            return ['<div layui-filter="toolbar_',that.id, '" class="layui-btn-container">',//涓诲垪琛ㄧ殑鎸夐挳
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'].join("");
+        };
+        this.init=function(){//鍩虹鐨刪tml琚坊鍔犲悗锛屽啀鎵ц鍒濆鍖�
+            var that = this;
+            $webUtil.copyConfig(that,that.moduleKey);
+            var tree = layui.tree;
+            var scrollHeight =  window.innerHeight;
+            var treeUL = $('[layui-filter="tree_' + that.id + '"]');
+            var treeHeight = scrollHeight - 200;
+            treeUL.parent().height(treeHeight);
+            tree.init("tree_" + that.id, treeUL, {
+                url: that.url.controller + that.url.tree,
+                backPath: that.backPath,
+                showSearch:true,
+                loadType:tree.loadType.all,
+                click: function (item, elem, options) {
+                    that.showMd(item.oid);
+                }
+            });
+            $webUtil.bindDefultButtonLisenter(that, that.id);
+        };
+        this.showMd = function (fileName) {
+            var that = this;
+            $("#md_" + that.id).html('<iframe src="' + projectName +'jslib/layui-2.2.5-debug/lay/platform/objectService/md.html?url=' + (that.backPath + "doc/" + fileName + "?" + TOKEN_KEY + "=" + $webUtil.getToken()) + '" frameborder="none" width="100%" height="' + (window.innerHeight - 250) + '"></iframe>');
+        };
+        this.refresh = function(){
+            var that = this;
+            var tree = layui.tree;
+            tree.reload("tree_" + that.id);
+        };
+    };
+    var md = new MD();
+    exports(md.MODELNAME,md);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/VciOsLifeCycle.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/VciOsLifeCycle.js
new file mode 100644
index 0000000..517bc39
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/VciOsLifeCycle.js
@@ -0,0 +1,462 @@
+/**
+ * 鐢熷懡鍛ㄦ湡
+ * @author weidy@2020-07-27
+ */
+layui.define(['layer','element','form','table','util'],function(exports){
+    var Class = function(){
+        this.MODELNAME = "platform/objectService/VciOsLifeCycle";
+        this.moduleKey = "VciOsLifeCycle";
+        this.id='VciLifeCycle';
+        this.sourceData={};
+        this.columns = [];
+        this.backPath =  configData.compatibility?path:configData.objectServicePath;
+        this.url={
+            controller:'lifeCycleController/',
+            dataGrid:'gridLifeCycle',
+            addSave:'addSave',
+            editSave:'editSave',
+            deleteUrl:'deleteData',
+            getObjectByOid:'getObjectByOid',
+            listUsed:'listUsed',
+            listLines:'listLineByOid',
+            listLinesPic:'listLinesPic',
+            gridEvent:'gridLifeEvents'
+        };
+        this.buttonIconMap = {
+            SEARCH:'layui-icon-refresh-2',
+            SENIORSEARCH:'layui-icon-query',
+            ADD:'layui-icon-add-1',
+            EDIT:'layui-icon-edit',
+            DELETE:'layui-icon-delete'
+        };
+        this.getContent=function(){//杩斿洖杩欎釜缁勪欢鐨勫熀纭�html
+            var that = this;
+            var html = "";
+            html = [
+                    '<div class="layui-layout-border">',
+                        '<div class="layui-center">',
+                            that.getToolbarHtml(),
+                            '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                        '</div>',
+                        '<div class="layui-east" id="pic_',that.id,'" style="float:right;width:200px;height:425px;margin-top:100px;margin-right:13px;">',
+                        '</div>',
+                        '<div class="layui-south" >',
+                            '<table id="detail_table_',that.id ,'" lay-filter="detail_table_', that.id ,'"></table>',
+                        '</div>',
+                    '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container">',
+                !configData.compatibility?
+                    [   '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                        '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                        '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EVENTS"><i class="layui-icon layui-icon-util"></i>鐢熷懡鍛ㄦ湡浜嬩欢绠$悊</button>'
+                    ].join(''):'',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>',
+            ].join("");
+            return html;
+        };
+        this.init=function(){//鍩虹鐨刪tml琚坊鍔犲悗锛屽啀鎵ц鍒濆鍖�
+            var that = this;
+            $webUtil.copyConfig(that,that.moduleKey);
+            var table = layui.table;
+            that.checkColumns();//涓诲垪琛ㄤ腑鍒椼��
+            that.firstGridLoad = false;
+            table.render({
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                url:  that.url.controller + that.url.dataGrid,
+                backPath:that.backPath,
+                page: {
+                    limit: 15,
+                    page: 1
+                },
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                done:function(res, cur, count){
+                    if(!that.firstGridLoad) {
+                        if(!configData.compatibility) {
+                            that.initDetailTable(((res && res.data) ? res.data[0].oid : ""));
+                            $(".layui-south").hide();
+                        }
+                        that.firstGridLoad = true;
+                    }else{
+                        if(count>0){
+                            that.gridItemsByOid(res.data[0].oid);
+                        }
+                    }
+                    table.on('tool(' + that.id + ')',function(obj) {
+                        var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                        var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                        if (layEvent == 'edit') {
+                            that.addOrEdit(false, data.oid);
+                        }else if(layEvent == 'listUsed'){
+                            that.listUsed(data);
+                        }else if(layEvent == 'exportCode'){
+                            that.exportCode(data);
+                        }else if(layEvent == 'viewLine'){
+                            that.viewLinePic(data);
+                        }
+                    });
+                },
+                rowClick:function(filter,data){
+                    if(data && !configData.compatibility){
+                        that.gridItemsByOid(data.oid);
+                    }
+                }
+            });
+            $webUtil.createSearchHtml({
+                id:'鑻辨枃鍚嶇О',
+                name:'涓枃鍚嶇О'
+            },$("[layui-filter='toolbar_" + that.id + "']"),'table_' + that.id);
+            $webUtil.bindDefultButtonLisenter(that, that.id);
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){//濡傛灉鍏朵粬鍦版柟鎯充娇鐢ㄨ繖涓粍浠剁殑鏃跺�欙紝鍙互鑷畾涔夊垪
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),{
+                    field:'id',
+                    title:'鑻辨枃鍚嶇О',
+                    sort:true,
+                    width:150
+                },{
+                    field:'name',
+                    title:'涓枃鍚嶇О',
+                    sort:true,
+                    width:200
+                },{
+                    field: 'startStatusName',
+                    title: '璧峰鐘舵��',
+                    sort:true,
+                    width: 90
+                },{
+                    field:'description',
+                    title:'鎻忚堪',
+                    width:150
+                },{
+                    field: "options",
+                    title:'鎿嶄綔',
+                    width:230,
+                    templet:function (d){
+                        if(configData.compatibility){
+                            return '<a class="layui-btn layui-btn-intable" lay-event="viewLine" >鏌ョ湅杩炴帴绾�</a>';
+                        }else {
+                            return ['<a class="layui-btn layui-btn-intable" lay-event="edit" >缂栬緫</a>',
+                                '<a class="layui-btn layui-btn-intable" lay-event="listUsed" >鏌ョ湅搴旂敤鑼冨洿</a>',
+                                '<a class="layui-btn layui-btn-intable" lay-event="exportCode" >瀵煎嚭浠g爜</a>'].join('');
+                        }
+                    }
+                }];
+            }
+        };
+        this.initDetailTable = function(pkLife){
+            var that = this;
+            var table = layui.table;
+            that.checkDetailColumns();
+            table.render({
+                elem: '#detail_table_' + that.id,
+                id: 'detail_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller +  that.url.listLines,
+                where:{
+                    oid:pkLife
+                },
+                cols: [that.detailColumns],
+                done:function (res, cur, count){
+                    table.on('tool(detail_' + that.id + ')',function(obj) {
+                        var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                        var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                        if (layEvent == 'viewEvent') {
+                            that.viewEvent(data);
+                        }
+                    });
+                }
+            });
+        };
+        this.checkDetailColumns = function () {
+            var that = this;
+            var table = layui.table;
+            if(that.detailColumns==null || that.detailColumns.length==0){//濡傛灉鍏朵粬鍦版柟鎯充娇鐢ㄨ繖涓粍浠剁殑鏃跺�欙紝鍙互鑷畾涔夊垪
+                that.detailColumns = [table.getIndexColumn(),table.getCheckColumn(),{
+                    field:'sourceLifeStatusName',
+                    title:'婧愮姸鎬�',
+                    width:150
+                },{
+                    field:'targetLifeStatusName',
+                    title:'鐩爣鐘舵��',
+                    width:150
+                },{
+                    field:'name',
+                    title:'涓氬姟鎻忚堪',
+                    width:150
+                },{
+                    field:'options',
+                    title: '鎿嶄綔',
+                    width: 100,
+                    templet:function (d){
+                        if(d.events&& d.events.length > 0) {
+                            return '<a class="layui-btn layui-btn-intable" lay-event="viewEvent" >鏌ョ湅浜嬩欢</a>';
+                        }else{
+                            return '';
+                        }
+                    }
+                }];
+            }
+        };
+        this.gridItemsByOid = function(pkLife){
+            var that = this;
+            if($webUtil.isNull(pkLife)){
+                return;
+            }
+            layui.table.reload("detail_" + that.id,{
+                where:{
+                    oid: pkLife
+                }
+            });
+        };
+        this.getFormItems = function(onlyShow,edit) {
+            return [
+                {
+                    field: 'id',
+                    title: '鑻辨枃鍚嶇О(鍞竴)',
+                    required: true,
+                    readOnly:(onlyShow||edit)
+                } ,                {
+                    field: 'name',
+                    title: '涓枃鍚嶇О',
+                    required: true,
+                    readOnly:onlyShow
+                } ,{
+                    field: ''
+                },                {
+                    field: 'description',
+                    title: '鎻忚堪',
+                    type: 'text',
+                    inputWidth:535,
+                    readOnly:onlyShow
+                }  ];
+        };
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            that.addOrEdit(false,oid);
+        };
+        this.addOrEdit = function(add,oid) {
+            var that = this;
+            var form = layui.form;
+            var filter ="form_" + that.id;
+
+            var addSaveIndex =webUtil.dialog({
+                title:add?'娣诲姞鐢熷懡鍛ㄦ湡':'淇敼鐢熷懡鍛ㄦ湡',
+                btn:['淇濆瓨','鍙栨秷'],
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                fullScreen:true,
+                shadeClose:false,
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getFormItems(false,!add),
+                        function () {
+                            if(!add){
+                                form.load(filter,{
+                                    backPath:that.backPath,
+                                    url:that.url.controller + that.url.getObjectByOid,
+                                    method:'get',
+                                    params:{
+                                        oid:oid
+                                    }
+                                });
+                            }else{
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+                        }, {}, {defaultColumnOneRow: 2,labelWidth:130});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        var url = that.url.controller + (add?that.url.addSave:that.url.editSave);
+                        webUtil.ajax(add?'post':'put',url,values,function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" +that.id,true,false);
+            if(!oid){
+                return false;
+            }
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,{oids:oid},function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+
+        this.refresh = function(){
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+        this.listUsed = function (data){
+            var that = this;
+            if(!data){
+                return false;
+            }
+            var filter = data.oid;
+            webUtil.dialog({
+                title: '鏌ョ湅鐢熷懡鍛ㄦ湡[' + data.name + "(" + data.id + ")]鐨勫簲鐢ㄨ寖鍥�",
+                content: '<table id="used_' + filter + '" lay-filter="' + filter + '" style="margin-top:5px;margin-left:5px;" ></table>',
+                area: ['950px', '600px'],
+                success: function (layero) {
+                    layui.table.render({
+                        elem: '#used_' + filter,
+                        id: 'used_' + filter,
+                        url:  that.url.controller + that.url.listUsed,
+                        backPath:that.backPath,
+                        where:{
+                            oid:data.oid
+                        },
+                        cols: [[{
+                            field:'id',
+                            title:'涓氬姟绫诲瀷鑻辨枃鍚嶇О',
+                            width:150
+                        },{
+                            field: 'name',
+                            title: '涓氬姟绫诲瀷鍚嶇О',
+                            width: 250
+                        },{
+                            field: 'description',
+                            title:'鎻忚堪',
+                            width: 200
+                        },{
+                            field: 'implClass',
+                            title: '瀹炵幇绫�',
+                            width: 300
+                        }]]
+                    });
+                }
+            });
+        };
+        this.viewEvent = function (data){
+            var that = this;
+            if(!data){
+                return false;
+            }
+            if(!data.events || data.events.length == 0){
+                $webUtil.showAutoMsg('娌℃湁浜嬩欢');
+                return false;
+            }
+            var filter = data.oid;
+            webUtil.dialog({
+                title: '鏌ョ湅鐢熷懡鍛ㄦ湡浜嬩欢',
+                content: '<table id="events_' + filter + '" lay-filter="' + filter + '" style="margin-top:5px;margin-left:5px;" ></table>',
+                area: ['950px', '500px'],
+                success: function (layero) {
+                    layui.table.render({
+                        elem: '#events_' + filter,
+                        id: 'events_' + filter,
+                        data:data.events,
+                        cols: [[{
+                            field:'eventFullName',
+                            title:'鍏ㄨ矾寰�',
+                            width: 600
+                        },{
+                            field: 'eventShowName',
+                            title: '浜嬩欢鍚嶇О',
+                            width: 250
+                        }]]
+                    });
+                }
+            });
+        };
+        this.EVENTS = function (){
+            var that = this;
+            var filter = "event_" + that.id;
+            webUtil.dialog({
+                title: '鏌ョ湅宸茬粡娉ㄥ唽鐨勭敓鍛藉懆鏈熶簨浠�',
+                content: '<table id="events_' + filter + '" lay-filter="' + filter + '" style="margin-top:5px;margin-left:5px;" ></table>',
+                area: ['950px', '500px'],
+                success: function (layero) {
+                    layui.table.render({
+                        elem: '#events_' + filter,
+                        id: 'events_' + filter,
+                        backPath:that.backPath,
+                        url:that.url.controller + that.url.gridEvent,
+                        cols: [[{
+                            field:'eventFullName',
+                            title:'鍏ㄨ矾寰�',
+                            width: 400
+                        },{
+                            field: 'eventShowName',
+                            title: '浜嬩欢鍚嶇О',
+                            width: 250
+                        },{
+                            field: 'description',
+                            title: '鎻忚堪',
+                            width: 200
+                        }]]
+                    });
+                }
+            });
+        };
+        this.viewLinePic = function (data) {
+            var that = this;
+            layui.use('platform/objectService/er/erContent', function () {
+                var erContent = layui['platform/objectService/er/erContent'];
+                var filter = "er_" + that.id;
+                var erIndex = $webUtil.dialog({
+                    title: "鏌ョ湅鐢熷懡鍛ㄦ湡[" + data.name + "]鐨勫唴瀹�",
+                    content: '<div id="' + filter + '"  ></div>',
+                    fullScreen: true,
+                    success: function (layero) {
+                        var oid = data.id + "_linkType";
+                        $("#" + filter).html(erContent.getContent(oid));
+                        erContent.init(oid, {
+                            id: data.id,
+                            url: that.url.controller + that.url.listLinesPic
+                        });
+                    }
+                });
+            });
+        };
+
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/VciOsStatus.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/VciOsStatus.js
new file mode 100644
index 0000000..d1db4eb
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/VciOsStatus.js
@@ -0,0 +1,278 @@
+/**
+ * 鐘舵�佺殑鍊�
+ * @author weidy@2020-07-27
+ */
+layui.define(['layer','element','form','table','util'],function(exports){
+    var Class = function(){
+        this.MODELNAME = "platform/objectService/VciOsStatus";
+        this.moduleKey = "VciOsStatus";
+        this.id='VciOsStatus';
+        this.sourceData={};
+        this.columns = [];
+        this.backPath =  configData.compatibility?path:configData.objectServicePath;
+        this.url={
+            controller:'statusController/',
+            dataGrid:'gridStatus',
+            addSave:'addSave',
+            editSave:'editSave',
+            deleteUrl:'delete',
+            getObjectByOid:'getObjectByOid',
+            listUsed:'listUsed'
+        };
+        this.buttonIconMap = {
+            SEARCH:'layui-icon-refresh-2',
+            SENIORSEARCH:'layui-icon-query',
+            ADD:'layui-icon-add-1',
+            EDIT:'layui-icon-edit',
+            DELETE:'layui-icon-delete'
+        };
+        this.getContent=function(){//杩斿洖杩欎釜缁勪欢鐨勫熀纭�html
+            var that = this;
+            var html = "";
+            html = [
+                    '<div class="layui-layout-border">',
+                        '<div class="layui-center">',
+                            that.getToolbarHtml(),
+                            '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                        '</div>',
+                    '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                    // '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                    // '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_LISTUSED"><i class="layui-icon layui-icon-search"></i>鏌ョ湅搴旂敤鑼冨洿</button>',
+                '</div>',
+            ].join("");
+            return html;
+        };
+        this.init=function(){//鍩虹鐨刪tml琚坊鍔犲悗锛屽啀鎵ц鍒濆鍖�
+            var that = this;
+            $webUtil.copyConfig(that,that.moduleKey);
+            var table = layui.table;
+            that.checkColumns();//涓诲垪琛ㄤ腑鍒椼��
+            that.firstGridLoad = false;
+            table.render({
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                url:  that.url.controller + that.url.dataGrid,
+                backPath:that.backPath,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                done:function(res, cur, count){
+                    table.on('tool(' + that.id + ')',function(obj) {
+                        var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                        var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                        if (layEvent == 'edit') {
+                            that.addOrEdit(false, data.oid);
+                        }else if(layEvent == 'listUsed'){
+                            that.listUsed(data);
+                        }
+                    });
+                }
+            });
+            $webUtil.createSearchHtml({
+                id:'鑻辨枃鍚嶇О',
+                name:'涓枃鍚嶇О'
+            },$("[layui-filter='toolbar_" + that.id + "']"),'table_' + that.id);
+            $webUtil.bindDefultButtonLisenter(that, that.id);
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){//濡傛灉鍏朵粬鍦版柟鎯充娇鐢ㄨ繖涓粍浠剁殑鏃跺�欙紝鍙互鑷畾涔夊垪
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),{
+                    field:'id',
+                    title:'鑻辨枃鍚嶇О',
+                    sort:true,
+                    width:200
+                },{
+                    field:'name',
+                    title:'鐘舵�佷腑鏂囧悕绉�',
+                    sort:true,
+                    width:200
+                },{
+                    field:'description',
+                    title:'鎻忚堪',
+                    width:250
+                },{
+                    field: "options",
+                    title:'鎿嶄綔',
+                    width:200,
+                    templet:function (d){
+                        return ['<a class="layui-btn layui-btn-intable" lay-event="edit" >缂栬緫</a>',
+                            '<a class="layui-btn layui-btn-intable" lay-event="listUsed" >鏌ョ湅搴旂敤鑼冨洿</a>'].join('');
+                    }
+                }];
+            }
+        };
+        this.getFormItems = function(onlyShow,edit) {
+            return [
+                {
+                    field: 'id',
+                    title: '鐘舵�佽嫳鏂囧悕绉�(鍞竴)',
+                    required: true,
+                    readOnly:(onlyShow||edit)
+                } ,                {
+                    field: 'name',
+                    title: '鐘舵�佷腑鏂囧悕绉�',
+                    required: true,
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'description',
+                    title: '鎻忚堪',
+                    type: 'text',
+                    inputWidth:535,
+                    readOnly:onlyShow
+                }  ];
+        };
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            that.addOrEdit(false,oid);
+        };
+        this.addOrEdit = function(add,oid) {
+            var that = this;
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var addSaveIndex =webUtil.dialog({
+                title:add?'娣诲姞鐘舵��':'淇敼鐘舵��',
+                btn:['淇濆瓨','鍙栨秷'],
+                skin:'layui-layer-lan',
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                //fullScreen:true,
+                area:['920px','300px'],
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getFormItems(false,!add),
+                        function () {
+                            if(!add){
+                                form.load(filter,{
+                                    backPath:that.backPath,
+                                    url:that.url.controller + that.url.getObjectByOid,
+                                    method:'get',
+                                    params:{
+                                        oid:oid
+                                    }
+                                });
+                            }else{
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+                        }, {}, {defaultColumnOneRow: 2,labelWidth:130});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        var url = that.url.controller + (add?that.url.addSave:that.url.editSave);
+                        webUtil.ajax(add?'post':'put',url,values,function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" +that.id,true,false);
+            if(!oid){
+                return false;
+            }
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,{oids:oid},function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+
+        this.refresh = function(){
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+        this.listUsed = function (data){
+            var that = this;
+            if(!data){
+                return false;
+            }
+            var filter = data.oid;
+            webUtil.dialog({
+                title: '鏌ョ湅鐘舵�乕' + data.name + "(" + data.id + ")]鐨勫簲鐢ㄨ寖鍥�",
+                content: '<table id="used_' + filter + '" lay-filter="' + filter + '" style="margin-top:5px;margin-left:5px;" ></table>',
+                area: ['900px', '600px'],
+                success: function (layero) {
+                    layui.table.render({
+                        elem: '#used_' + filter,
+                        id: 'used_' + filter,
+                        url:  that.url.controller + that.url.listUsed,
+                        backPath:that.backPath,
+                        where:{
+                            oid:data.oid
+                        },
+                        cols: [[{
+                            field:'id',
+                            title:'鐢熷懡鍛ㄦ湡鑻辨枃鍚嶇О',
+                            width:150
+                        },{
+                            field: 'name',
+                            title: '鐢熷懡鍛ㄦ湡鍚嶇О',
+                            width: 250
+                        },{
+                            field: 'description',
+                            title:'鎻忚堪',
+                            width: 200
+                        },{
+                            field: 'lastModifier',
+                            title: '鏈�鍚庝慨鏀逛汉',
+                            width: 90
+                        },{
+                            field: 'lastModifyTime',
+                            title: '鏈�鍚庝慨鏀规椂闂�',
+                            dateFormate:$webUtil.dateFormate.dateNoSecond,
+                            width:110
+                        }]]
+                    });
+                }
+            });
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/VciOsStatusRefer.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/VciOsStatusRefer.js
new file mode 100644
index 0000000..2acd8a7
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/VciOsStatusRefer.js
@@ -0,0 +1,60 @@
+/**
+ * 鐘舵�佺殑鍙傜収
+ * @author weidy
+ * @date 2021-1-26
+ */
+layui.define(['layer','vciWebReferGrid'],function(exports){
+	var ReferGrid = function(){
+		this.backPath = (configData.compatibility?path:configData.objectServicePath);
+	};
+	ReferGrid.prototype.showReferDialog = function (referConfig){
+		//鍙渶瑕佽缃粯璁ょ殑鍊硷紝璋冪敤VciWebReferGrid鍗冲彲
+		var that = this;
+		referConfig.options.url = referConfig.options.url?referConfig.options.url:'statusController/refDataGrid';
+		referConfig.options.backPath = referConfig.options.backPath?referConfig.options.backPath:that.backPath;
+		if(!("method" in referConfig.options)){
+			referConfig.options.method = 'get';
+		}
+		if(!("tableConfig" in referConfig.options)){
+			referConfig.options.tableConfig = {
+				page: {
+					limit: 15,
+					page: 1
+				},
+				cols: [layui.table.getIndexColumn(), layui.table.getCheckColumn(), {
+					field: 'id',
+					title: '鐘舵�佽嫳鏂囧悕绉�',
+					sort:true,
+					width: 150
+				}, {
+					field: 'name',
+					title: '鐘舵�佷腑鏂囧悕绉�',
+					sort:true,
+					width: 260
+				}, {
+					field: 'description',
+					title: '鎻忚堪',
+					sort:true,
+					width: 200
+				},{
+					field:'secretGradeText',
+					title:'瀵嗙骇',
+					width: 60,
+					hidden:(!configData.controllerSecret)
+				}],
+				queryColumns: [
+					{
+						field: 'id',
+						title: '鐘舵�佽嫳鏂囧悕绉�'
+					}, {
+						field: 'name',
+						title: '鐘舵�佷腑鏂囧悕绉�'
+					}
+					]
+			};
+		}
+		layui.vciWebReferGrid.showReferDialog(referConfig);
+	};
+	var rg = new ReferGrid();
+	exports('platform/objectService/VciOsStatusRefer',rg);
+});
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/VciUIContentViewer.bak.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/VciUIContentViewer.bak.js
new file mode 100644
index 0000000..08d9a8b
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/VciUIContentViewer.bak.js
@@ -0,0 +1,933 @@
+/**
+ * UI涓婁笅鏂囩殑灞曠ず鍣�
+ * @author weidy
+ * @date 2021-3-1
+ */
+layui.define(['layer','element','form','table','util','tree','treeGrid','dynamicCondition','BaseAction'],function(exports){
+    var Class = function() {
+        this.MODELNAME = "platform/objectService/VciUIContentViewer";
+        this.moduleKey = "VciUIContentViewer";
+        this.id = 'VciUIContentViewer';
+        this.config = {};
+        this.backPath = configData.compatibility?path:configData.objectServicePath;
+        this.controller = 'webUIController/';
+        this.getContent=function(id){
+            return '<div id="UIContent_' + id + '" style="overflow: auto"></div>';
+        };
+
+        this.init = function (id,options,callback) {
+            //ids鏄粍浠讹紝options鏄厤缃殑淇℃伅锛屼篃灏辨槸souceDatas;
+            var that = this;
+            $webUtil.copyConfig(that,that.moduleKey);
+            that.config[id] = options;
+            that.config[id].functionId=id;
+            that.config[id].sourceDataMapList={};
+            if(this.sourceData&&this.sourceData.sourceDataMap){
+                layui.each(this.sourceData.sourceDataMap, function (i, item) {
+                    if(item && item.constructor === Object) return;
+                    if(i=='type'||i=='context'||i=='content') return;
+                    that.config[id].sourceDataMapList['sourceData["'+i+'"]'] = item;//encodeURIComponent(item);
+                });
+            }
+            if(this.sourceData&&this.sourceData.actionData){
+                $.extend(that.config[id],this.sourceData.actionData);
+                /*if(that.config[id].selectData){
+                    //涓婂尯鍩熼�変腑鏁版嵁
+                    layui.each(that.config[id].selectData, function (i, item) {
+                        if(item && item.constructor === Object) return;
+                        that.config[id].sourceDataMapList['sourceData["'+i+'"]'] = item;//encodeURIComponent(item);
+                    });
+                }*/
+                if(that.config[id].dataStore && that.config[id].dataStore.length>0){
+                    //褰撳墠鍖哄煙閫変腑鏁版嵁
+                    layui.each(that.config[id].dataStore[0], function (i, item) {
+                        if(item && item.constructor === Object) return;
+                        that.config[id].sourceDataMapList['sourceData["'+i+'"]'] =item;// encodeURIComponent(item);
+                    });
+                }
+                if(that.config[id].paramVOS){
+                    layui.each(that.config[id].paramVOS, function (i, item) {
+                        if(item && item.constructor === Object) return;
+                        that.config[id].sourceDataMapList['sourceData["'+i+'"]'] = item;//encodeURIComponent(item);
+                    });
+                }
+            }
+            that.config[id].filterList={};
+            that.config[id].areasFilter= {};
+            that.config[id].checkedData={
+                westAreas:[],
+                centerAreas:[],
+                southAreas:[]
+            }
+
+            if($webUtil.isNull(options.btmType) || $webUtil.isNull(options.content)){
+                $webUtil.showErrorMsg("閰嶇疆鐨勪俊鎭敊璇紝璇峰弬鑰僓I:type#content?param=xxx杩欑褰㈠紡銆傚叾涓璽ype鏄笟鍔$被鍨嬶紙鎴栭摼鎺ョ被鍨嬶級锛宑ontent鏄疷I涓婁笅鏂囩殑鍚嶇О");
+                return false;
+            }
+            //1. 鑾峰彇UI涓婁笅鏂囩殑閰嶇疆淇℃伅
+            that.selectUIDefines(id,options,callback);
+        };
+        this.selectUIDefines = function (id,options,callback) {
+            var that = this;
+            $webUtil.get(that.controller + '/getUIContentByBtmTypeAndId',{btmType:options.btmType,id:options.content},function (result) {
+                if(result.success) {
+                    that.config[id].uiDefineVO = result.obj;
+                    that.showContent(id,options.content,callback)
+                }else{
+                    $webUtil.showErrorMsg(result.msg);
+                }
+            },function (xhr,error) {
+                $webUtil.showErrorMsg('鍙兘鏈嶅姟娌℃湁鍚姩锛岄〉闈㈣幏鍙栧け璐ャ�傝绋嶅悗鍐嶈瘯');
+                return false;
+            },that.path);
+        }
+
+        this.showContent=function (id,uiDefineId,callback){
+            var me=this;
+            var that = this.config[id];
+            that.areasFilter= {
+                northAreas: {tree: [], table: [],treeGrid: [], form: [],customView:[]},
+                westAreas: {tree: [], table: [], treeGrid: [], form: [],customView:[]},
+                centerAreas: {tree: [], table: [],treeGrid: [],  form: [],customView:[]},
+                southAreas: {tree: [], table: [], treeGrid: [], form: [],customView:[]}
+            }
+            that.checkedData={
+                westAreas:[],
+                centerAreas:[],
+                southAreas:[]
+            }
+            var northHtml=[],centerHtml=[],westHtml=[],southHtml=[];
+
+            var parentWidth=$("#UIContent_"+that.functionId).width();
+            var html=[
+                '<div class="layui-layout" style="display:block;overflow-y: hidden">',
+                    '<div class="layui-layout-border" style="clear: both">',
+                        that.uiDefineVO.northAreas&& that.uiDefineVO.northAreas.length>0?'<div class="layui-north" style=""></div>':'',
+                        that.uiDefineVO.westAreas&& that.uiDefineVO.westAreas.length>0?'<div class="layui-west"  style="width:300px;float: left;padding: 5px;margin-right: 0;"></div>':'',
+                        '<div class="layui-center" style="display:inline-block;float: left;'+(that.uiDefineVO.westAreas&& that.uiDefineVO.westAreas.length>0?'width:'+(parentWidth-328)+'px;':'')+'margin: 0;overflow: auto">',
+                        that.uiDefineVO.centerAreas&& that.uiDefineVO.centerAreas.length>0?'<div class="layui-layout" style="padding-left: 10px;min-height: 200px;"></div>':'',
+                        that.uiDefineVO.southAreas&& that.uiDefineVO.southAreas.length>0?'<div class="layui-south" style="padding-top: 10px;padding-left:10px;margin-top: 5px;"></div>':'',
+                        '</div>',
+                    '</div>',
+                '</div>'
+            ];
+            $("#UIContent_"+that.functionId).html(html.join(''));
+
+            that.firstLoad=true;
+            if(that.uiDefineVO.northAreas && that.uiDefineVO.northAreas.length>0){
+                northHtml=[]
+            }
+            if(that.uiDefineVO.westAreas && that.uiDefineVO.westAreas.length>0){
+                if(that.uiDefineVO.westAreas.length>1) {
+                    westHtml.push('<div class="layui-tab" >');
+                    westHtml.push('<ul class="layui-tab-title" lay-allowClose="false">');
+                    westHtml.push('</ul>');
+                    westHtml.push('<ul class="layui-tab-content">');
+                    westHtml.push('</ul>');
+                    westHtml.push('</div>');
+
+                    $("#UIContent_" + that.functionId + " .layui-west").append(westHtml.join(''));
+                    var showIndex2=0;
+                    layui.each(that.uiDefineVO.westAreas, function (i, areaItem) {
+                        if(!areaItem.enableStatus){
+                            showIndex2++;
+                            return;
+                        }
+                        $("#UIContent_" + that.functionId + " .layui-west .layui-tab-title").append('<li class="' + (i == showIndex2 ? 'layui-this' : '') + '">' + areaItem.name + '</li>');
+
+                        var itemLi = $('<li class="layui-tab-item ' + (i == showIndex2 ? 'layui-show' : '') + '"></li>');
+                        $("#UIContent_" + that.functionId + " .layui-west .layui-tab-content").append(itemLi);
+                        me.getWestContent(id,areaItem, uiDefineId,itemLi,'westAreas')
+                    })
+
+                }else{
+                    var div=$('<div></div>')
+                    $("#UIContent_" + that.functionId + " .layui-west").append(div);
+                    me.getWestContent(id,that.uiDefineVO.westAreas[0], uiDefineId,div,'westAreas')
+                }
+            }
+            if(that.uiDefineVO.centerAreas && that.uiDefineVO.centerAreas.length>0){
+                if(that.uiDefineVO.centerAreas.length>1){
+                    centerHtml.push('<div class="layui-tab" style="margin-top: 0;">');
+                    centerHtml.push('<ul class="layui-tab-title" lay-allowClose="false">');
+                    centerHtml.push('</ul>');
+
+                    centerHtml.push('<ul class="layui-tab-content">');
+                    centerHtml.push('</ul>');
+                    centerHtml.push('</div>');
+
+                    $("#UIContent_" + that.functionId + " .layui-center .layui-layout").append(centerHtml.join(''));
+                    var showIndex=0;
+                    layui.each(that.uiDefineVO.centerAreas, function (i, areaItem) {
+                        if(!areaItem.enableStatus){
+                            showIndex++;
+                            return;
+                        }
+                        $("#UIContent_" + that.functionId + " .layui-center .layui-layout .layui-tab-title").append('<li class="' + (i == showIndex ? 'layui-this' : '') + '">' + areaItem.name + '</li>');
+
+                        var itemLi = $('<li class="layui-tab-item ' + (i == showIndex ? 'layui-show' : '') + '"></li>');
+                        $("#UIContent_" + that.functionId + " .layui-center .layui-layout .layui-tab-content").append(itemLi);
+                        me.getWestContent(id,areaItem, uiDefineId,itemLi,'centerAreas')
+                    })
+                }else{
+                    var div=$('<div></div>')
+                    $("#UIContent_" + that.functionId + " .layui-center .layui-layout").append(div);
+                    me.getWestContent(id,that.uiDefineVO.centerAreas[0], uiDefineId,div,'centerAreas')
+                }
+            }
+            if(that.uiDefineVO.southAreas && that.uiDefineVO.southAreas.length>0){
+                if(that.uiDefineVO.southAreas.length>1){
+                    southHtml.push('<div class="layui-tab" >');
+                    southHtml.push('<ul class="layui-tab-title" lay-allowClose="false">');
+                    southHtml.push('</ul>');
+
+                    southHtml.push('<ul class="layui-tab-content">');
+                    southHtml.push('</ul>');
+                    southHtml.push('</div>');
+
+                    $("#UIContent_" + that.functionId + " .layui-south").append(southHtml.join(''));
+                    var showIndex1=0;
+                    layui.each(that.uiDefineVO.southAreas, function (i, areaItem) {
+                        if(!areaItem.enableStatus){
+                            showIndex1++;
+                            return;
+                        }
+                        $("#UIContent_" + that.functionId + " .layui-south .layui-tab-title").append('<li class="' + (i == showIndex1 ? 'layui-this' : '') + '">' + areaItem.name + '</li>');
+
+                        var itemLi = $('<li class="layui-tab-item ' + (i == showIndex1 ? 'layui-show' : '') + '"></li>');
+                        $("#UIContent_" + that.functionId + " .layui-south .layui-tab-content").append(itemLi);
+                        me.getWestContent(id,areaItem, uiDefineId,itemLi,'southAreas')
+                    })
+                }else{
+                    var div=$('<div></div>')
+                    $("#UIContent_" + that.functionId + " .layui-south").append(div);
+                    me.getWestContent(id,that.uiDefineVO.southAreas[0], uiDefineId,div,'southAreas')
+                }
+            }
+
+            var key='ui_'+uiDefineId;
+            that.filterList[key]=that.areasFilter;
+
+            $("#UIContent_" + that.functionId + ' .layui-tab-title').on('click', function(title) {
+                var tabcontent=$(title.toElement).parent().next().find('.layui-tab-item:eq('+$(title.toElement).index()+')')
+                layui.each(tabcontent.find('.component'),function (i,component){
+                    var dataFilters=$(this).data('filters');
+                    dataFilters.tableFilter != '' && layui.table.reload(dataFilters.tableFilter,{url:'uiDataController/dataGridQuery'}), that.checkedData[dataFilters.tableFilter.split('_')[0]] = [];
+                    dataFilters.treeFilter != '' && layui.tree.reload(dataFilters.treeFilter,{url:'uiDataController/getDataForTree'}), that.checkedData[dataFilters.treeFilter.split('_')[0]] = [];
+                    dataFilters.treeTableFilter != '' && layui.treeGrid.reload(dataFilters.treeTableFilter,{url:'uiDataController/dataGridQuery'}), that.checkedData[dataFilters.treeTableFilter.split('_')[0]] = [];
+
+                })
+            });
+
+            if(callback) callback();
+        }
+
+        this.getWestContent=function (id,areaItem,uiDefineId,containerDiv,areaName) {
+            var that=this;
+            var table=layui.table;
+            var tree=layui.tree;
+            var form=layui.form;
+            var treeGrid=layui.treeGrid;
+            var html = []
+            if(areaItem.componentVOs.length>1){
+                containerDiv.append('<div class="layui-collapse" lay-filter=""></div>')
+            }
+            layui.each(areaItem.componentVOs, function (i, componentVO) {
+                html = [];
+                html.push('<div class="component" >');
+                //鎸夐挳
+                html.push('<div id="toolbar_button_',componentVO.oid,'" layui-filter="toolbar_button_',componentVO.oid,'" class="layui-btn-container layui-buttons">');
+                var hasRefresh = false;
+                var dataFilters={
+                    treeFilter:componentVO.treeDefineVO?(areaName+'_tree_'+id+'_'+ componentVO.treeDefineVO.btmType+'_'+uiDefineId):'',
+                    tableFilter:componentVO.tableDefineVO?(areaName + '_table_'+id+'_' + componentVO.tableDefineVO.id + '_' + componentVO.tableDefineVO.oid+'_'+uiDefineId):'',
+                    treeTableFilter:componentVO.treeTableDefineVO?(areaName + '_treetable_'+id+'_' + componentVO.treeTableDefineVO.id + '_' + componentVO.treeTableDefineVO.oid+'_'+uiDefineId):'',
+                    formFilter:componentVO.formDefineVO?(areaName+'_form_'+id+'_'+ componentVO.formDefineVO.id+'_'+componentVO.formDefineVO.oid+'_'+uiDefineId):''
+                };
+                if(that.config[id].isShowBtns!=false && componentVO.buttons.length>0) {
+                    var DefineVO = componentVO.treeDefineVO || componentVO.tableDefineVO || componentVO.treeTableDefineVO || componentVO.formDefineVO;
+                    DefineVO && (DefineVO.componentTitle = componentVO.description||componentVO.name)
+                    layui.each(componentVO.buttons, function (i, button) {
+                        if (button.name == '鍒锋柊' || button.id == 'refresh') {
+                            hasRefresh = true;
+                            //html.push('<button class="layui-btn layui-btn-sm" layui-filter="toolbar_' + componentVO.oid + '_refresh" data-configId="'+id+'" data-filters=\'' + JSON.stringify(dataFilters) + '\'><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>');
+                        }
+                        html.push('<button class="layui-btn layui-btn-sm" layui-filter="toolbar_' + componentVO.oid + '_buttonAction" data-configId="'+id+'" data-button=\'' + JSON.stringify(button) + '\' data-filters=\'' + JSON.stringify(dataFilters) + '\' data-componentVOOid=\'' + JSON.stringify(componentVO.oid) + '\' data-DefineVO=\'' + JSON.stringify(DefineVO) + '\'  data-currentArea="' + areaName + '" data-uiDefineId="' + uiDefineId + '"><i class="layui-icon" style=" ' + (button.iconPath ? 'width:16px;height:16px;background-image: url(' + button.iconPath + ')' : '') + '"></i>' + button.name + '</button>');
+
+                    })
+                }
+
+                if(componentVO.tableDefineVO) {
+                    if(componentVO.tableDefineVO.seniorQueryColumns && componentVO.tableDefineVO.seniorQueryColumns.length>0) {
+                        html.push('<button class="layui-btn layui-btn-sm" layui-filter="toolbar_' + componentVO.oid + '_ADVANCEDQUERY" data-configId="' + id + '" data-filter=\'' + dataFilters.tableFilter + '\' data-toolbarId="' + componentVO.oid + '" data-fields=\'' + JSON.stringify(componentVO.tableDefineVO.seniorQueryColumns) + '\'><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>');
+                    }
+                    if (!hasRefresh) {
+                        html.push('<button class="layui-btn layui-btn-sm" layui-filter="toolbar_' + componentVO.oid + '_refresh" data-configId="'+id+'" data-filters=\'' + JSON.stringify(dataFilters) + '\'><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>');
+                    }
+                }else if(componentVO.treeDefineVO||componentVO.treeTableDefineVO){
+                    if (!hasRefresh) {
+                        html.push('<button class="layui-btn layui-btn-sm" layui-filter="toolbar_' + componentVO.oid + '_refresh" data-configId="'+id+'" data-filters=\'' + JSON.stringify(dataFilters) + '\'><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>');
+                    }
+                }
+                html.push('</div>');
+                html.push('</div>');
+
+                if(areaItem.componentVOs.length>1){
+                    $(".layui-collapse",containerDiv).append('<div class="layui-colla-item"><h2 class="layui-colla-title">'+componentVO.name+'</h2><div class="layui-colla-content layui-show">'+html.join('')+'</div></div>')
+                }else{
+                    containerDiv.append(html.join(''));
+                }
+                $('.component',containerDiv).data('filters',dataFilters)
+
+                layui.element.render();
+
+                $webUtil.bindDefultButtonLisenter(that, componentVO.oid);
+
+                //鏍�
+                if(componentVO.treeDefineVO){
+                    var filter=dataFilters.treeFilter;
+                    if(tree.config&&tree.config[filter]){
+                        tree.destory(filter);
+                    }
+                    $(".component", containerDiv).eq(i).append('<ul layui-filter="'+ filter+'"></ul>');
+
+                    that.fristTreeLoad = false;
+                    var parentFieldName = "";
+                    var rootQueryValue = "";
+                    if(componentVO.treeDefineVO.showLinkAbs){
+                        parentFieldName = componentVO.treeDefineVO.showLinkAbs.split(",")[0];
+                        rootQueryValue = componentVO.treeDefineVO.showLinkAbs.split(",")[1];
+                    }
+                    var treeParams={
+                        isMuti: false,
+                        isQueryAllColumn: true,
+                        btmname: componentVO.treeDefineVO.btmType,
+                        componentOid:componentVO.oid,
+                        uiDefineId:uiDefineId,
+                        valueField:componentVO.treeDefineVO.valueField,
+                        parentFieldName:parentFieldName,
+                        //parentOid:result.treeData[0].oid,
+                        //parentBtmName:result.treeData[0].attributes.btmname,
+                        textField:componentVO.treeDefineVO.treeNodeExpression,
+                        queryTemplate: that.config[id].querytemplate,
+                        linkTypeFlag: $webUtil.isNull(that.config[id].queryType)?($webUtil.isNull(that.config[id].linkType)?false:true):(that.config[id].queryType==0?false:true),
+                        //toBtmType:componentVO.treeDefineVO.btmType,
+                        rootExpress:componentVO.treeDefineVO.rootExpress
+                    }
+                    tree.init(filter, $('[layui-filter="' + filter + '"]'), {
+                        url: that.config[id].firstLoad?'uiDataController/getDataForTree':'',
+                        backPath: that.backPath,
+                        requestType:'post',
+                        rootParams:{
+                            queryRoot: true
+                        },
+                        where: treeParams,
+                        extraParams:that.config[id].sourceDataMapList,
+                        showSearch:that.config[id].showSearch||false,
+                        treeFilter: filter,
+                        loadType: componentVO.treeDefineVO.loadType,
+                        treeName: componentVO.treeDefineVO.id,
+                        click: function (thisTreeFilter, elem, options) {
+                            that.config[id].checkedData[areaName]=[thisTreeFilter.attributes];
+                            that.clickRowFn(options.treeFilter, thisTreeFilter.attributes, componentVO.treeDefineVO.btmType, that.config[id].filterList['ui_' + uiDefineId]);
+
+                        },
+                        done:function (thisTreeFilter,children,elem) {
+                            elem.children().eq(0).children('a').trigger('click');
+                            that.config[id].firstLoad=false;
+                        }
+                    });
+
+                    that.config[id].areasFilter[areaName].tree.push(filter);
+                }
+                //琛ㄦ牸
+                if(componentVO.tableDefineVO) {
+                    var filter = dataFilters.tableFilter;
+                    $(".component", containerDiv).eq(i).append('<table id="' + filter + '" lay-filter="' + filter + '" style="overflow-x:auto;"></table>')
+                    var cols = [];
+                    for (var i = 0; i < componentVO.tableDefineVO.cols.length; i++) {
+                        if (componentVO.tableDefineVO.btmType == 'fileobject') {
+                            //鏄枃浠�
+                            $.each(componentVO.tableDefineVO.cols[i],function (ci,citem){
+                                if(citem.field=='name'){
+                                    componentVO.tableDefineVO.cols[i][ci].templet=function (d){
+                                        return '<a class="layui-btn layui-btn-intable"  lay-event="PREVIEW">'+d.name+'</a>'
+                                    }
+                                    return false;
+                                }
+                            })
+
+                        }
+                        if (i == 0) {
+                            componentVO.tableDefineVO.cols[i].unshift({
+                                field: table.config.indexName,
+                                type: 'numbers',
+                                title: '搴忓彿',
+                                rowspan: componentVO.tableDefineVO.cols.length,
+                                width: 40
+                            }, {
+                                field: table.config.checkName,
+                                type: 'checkbox',
+                                rowspan: componentVO.tableDefineVO.cols.length,
+                                width: 30
+                            })
+                        }
+                        cols.push(componentVO.tableDefineVO.cols[i]);
+                    }
+
+                    var tableParams={
+                        btmname: componentVO.tableDefineVO.btmType,
+                        tableDefineId: componentVO.tableDefineVO.id,
+                        componentOid: componentVO.oid,
+                        uiDefineId: uiDefineId,
+                        linkTypeFlag:componentVO.tableDefineVO.linkTypeFlag
+                    }
+                    table.render({
+                        elem: '#' + filter,
+                        id: filter,
+                        url: that.config[id].firstLoad?'uiDataController/dataGridQuery':'',
+                        backPath: that.backPath,
+                        method:'post',
+                        page: {
+                            limit: componentVO.tableDefineVO.pageVO ? componentVO.tableDefineVO.pageVO.limit : 10,
+                            page: componentVO.tableDefineVO.pageVO? componentVO.tableDefineVO.pageVO.page :1
+                        },
+                        limits: componentVO.tableDefineVO.limits,
+                        where: tableParams,
+                        extraParams:that.config[id].sourceDataMapList,
+                        selectMode: table.selectMode.muti,
+                        cols: cols,
+                        done: function (res, cur, total) {
+                            if (total > 0) {
+                                //table.selectRecord(filter, {index: 0});
+                            }
+                            table.on('tool(' + filter + ')',function(obj){
+                                var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                                var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                                if(layEvent == 'PREVIEW'){
+                                    that.PREVIEW(data);
+                                }
+                            });
+                            that.config[id].firstLoad=false;
+                        },
+                        rowClick: function (thisTableFilter, record,isChecked) {
+                            that.config[id].checkedData[areaName]=layui.table.checkStatus(thisTableFilter).data;
+                            that.clickRowFn(thisTableFilter, record, componentVO.tableDefineVO.btmType, that.config[id].filterList['ui_' + uiDefineId]);
+
+                        },
+                        rowDBLClick:function (thisTableFilter, record){
+
+                        }
+                    })
+
+                    that.config[id].areasFilter[areaName].table.push(filter);
+
+                    if (componentVO.tableDefineVO.queryColumns && componentVO.tableDefineVO.queryColumns.length > 0) {
+                        that.createSearchHtml(componentVO.tableDefineVO.queryColumns, componentVO.oid, filter,id)
+                    }
+                }
+                //鏍戣〃
+                if(componentVO.treeTableDefineVO){
+                    var filter=dataFilters.treeTableFilter;
+                    $(".component", containerDiv).eq(i).append('<table id="' + filter + '" lay-filter="' + filter + '" style="overflow-x:auto;"></table>')
+                    var cols = [];
+                    for (var i = 0; i < componentVO.treeTableDefineVO.cols.length; i++) {
+                        if (i == 0) {
+                            componentVO.treeTableDefineVO.cols[i].unshift({
+                                field: table.config.indexName,
+                                type: 'numbers',
+                                title: '搴忓彿',
+                                rowspan: componentVO.treeTableDefineVO.cols.length,
+                                width: 40
+                            }, {
+                                field: table.config.checkName,
+                                type: 'checkbox',
+                                rowspan: componentVO.treeTableDefineVO.cols.length,
+                                width: 30
+                            })
+                        }
+                        cols.push(componentVO.treeTableDefineVO.cols[i]);
+                    }
+                    var treeTableParams={
+                        btmname: componentVO.treeTableDefineVO.btmType,
+                        tableDefineId: componentVO.treeTableDefineVO.id,
+                        componentOid: componentVO.oid,
+                        uiDefineId: uiDefineId,
+                        linkTypeFlag:componentVO.treeTableDefineVO.linkTypeFlag,
+                        treeTableFlag:true
+                    }
+                    treeGrid.render({
+                        elem: '#' + filter,
+                        id: filter,
+                        cols: cols,
+                        url: that.config[id].firstLoad?'uiDataController/dataGridQuery':'',
+                        backPath: that.backPath,
+                        method:'post',
+                        limit: componentVO.treeTableDefineVO.pageVO ? componentVO.treeTableDefineVO.pageVO.limit : 10,
+                        limits: componentVO.treeTableDefineVO.limits,
+                        where: treeTableParams,
+                        extraParams:that.config[id].sourceDataMapList,
+                        selectMode:table.selectMode.muti,
+                        treeId:(componentVO.treeTableDefineVO.treeCurrentField||'oid'),//鏍戝舰id瀛楁鍚嶇О
+                        treeUpId:(componentVO.treeTableDefineVO.treeParentField||'parentOid'),//鏍戝舰鐖秈d瀛楁鍚嶇О
+                        treeShowName:(componentVO.treeTableDefineVO.treeFieldName||'name'),//浠ユ爲褰㈠紡鏄剧ず鐨勫瓧娈�
+                        rowClick: function (thisTableFilter, record,isChecked) {
+                            that.config[id].checkedData[areaName] = layui.treeGrid.checkStatus(thisTableFilter).data;
+                            that.clickRowFn(thisTableFilter, record, componentVO.treeTableDefineVO.btmType, that.config[id].filterList['ui_' + uiDefineId])
+                        },
+                        done:function(res,cur,total){
+                            if (total > 0) {
+                                //treeGrid.selectRecord(filter, {index: 0});
+                            }
+                            that.config[id].firstLoad=false;
+                        }
+                    });
+
+                    that.config[id].areasFilter[areaName].treeGrid.push(filter);
+
+                    if (componentVO.treeTableDefineVO.queryColumns && componentVO.treeTableDefineVO.queryColumns.length > 0) {
+                        that.createSearchHtml(componentVO.treeTableDefineVO.queryColumns, componentVO.oid, filter,id)
+                    }
+                }
+                //琛ㄥ崟
+                if(componentVO.formDefineVO){
+                    var filter=dataFilters.formFilter;
+                    $(".component", containerDiv).eq(i).append('<form id="'+filter +'" lay-filter="'+ filter+ '" class="layui-form" style=""></form>')
+                    form.addItems(filter,componentVO.formDefineVO.items, function (){
+                        that.loadFormData(filter,componentVO.formDefineVO,id,uiDefineId)
+                    }, {}, { defaultColumnOneRow: componentVO.formDefineVO.columnOneRow });
+
+                    that.config[id].areasFilter[areaName].form.push(filter);
+                }
+                //鑷畾涔�
+                if(componentVO.customClass) {
+                    // //1. 鑾峰彇锛熷悗鐨勫弬鏁帮紝浣滀负options鏀捐繘鍘汇�傚悓鏃秓ptions杩樻妸褰撳墠鑷畾涔夌粍浠剁殑淇℃伅鏀捐繘鍘伙紝鍖呮嫭UI涓婁笅鏂囩殑涓婚敭锛屽綋鍓嶇粍浠剁殑涓婚敭绛�
+                    // //2. use杩欎釜缁勪欢锛岀劧鍚庡皢options鏀惧埌璇ョ粍浠堕噷
+                    // //3. 璋冪敤getContent鏂规硶锛屽弬鏁颁负id鍜宱ptions銆傝繖閲岀殑id灏辨槸褰撳墠鑷畾涔夌晫闈㈢殑oid銆傜粍浠跺唴閮ㄨ嚜琛屽瓨鍌╫ptions銆備篃鎴栬�呭湪褰撳墠瀵硅薄涓婂瓨鍦�
+                    // //4. 璋冪敤init,鍙傛暟涔熸槸id鍜宱ptions銆傞〉闈㈤粯璁や笉鍔犺浇鏁版嵁
+                    // //5. 鍔犺浇鏁版嵁鐨勬椂鍊欙紝璋冪敤loadForUI鏂规硶锛屽弬鏁颁负id鍜宻ourceData锛岃繖涓猻ourceData涓哄墠闈㈣繖涓尯鍩熼�夋嫨鐨勬暟鎹紝缁熶竴浣跨敤鏁扮粍鐨勫舰寮忋��
+                     layui.use(componentVO.customClass.split('?')[0], function () {
+                         componentVO.customClass=componentVO.customClass.replace(/USEJS:\/*/,'');
+                         var customView = layui[componentVO.customClass.split('?')[0]];
+                         if(componentVO.customClass.indexOf("?") <0){
+                             componentVO.customClass=componentVO.customClass+'?'
+                             //$webUtil.showErrorMsg("璇疯仈绯荤鐞嗗憳锛岃繖涓嚜瀹氫箟椤甸潰鐨勫湴鍧�鏍煎紡涓嶆纭�傛帹鑽愪娇鐢║I:type#content?param=xxx杩欑褰㈠紡");
+                             //return;
+                         }
+                         var paramsArray = componentVO.customClass.split('?')[1].split("&");
+                         var urlParams={};
+                         for(var i = 0 ; i < paramsArray.length ; i ++){
+                             var preParam =paramsArray[i].split("=");
+                             if(preParam[0]=='btmname'){
+                                 urlParams['btmType']=preParam[1];
+                             }else if(preParam[0]=='imagetype'){
+                                 urlParams['imageType']=preParam[1];
+                                 if(preParam[1]=='fileobject'){
+
+                                 }
+                             }else{
+                                 urlParams[preParam[0]] = preParam[1];
+                             }
+
+                         }
+
+                         var customOptions={
+                             action: componentVO.customClass.split('?')[0],
+                             urlParams: urlParams,
+                             imgHeight: 400
+                         }
+                         var customid='customView_'+componentVO.oid;
+                         $(".component", containerDiv).html(customView.getContent(customid,customOptions));
+                         customView.id=customid;
+                         customView.init(customid, customOptions);
+                         that.config[id].areasFilter[areaName].customView.push(customView);
+                     });
+                }
+
+                //璇ラ〉闈㈡樉绀哄湪寮圭獥涓�
+                if(that.config[id].isOpen && componentVO.formDefineVO){
+                    $("#toolbar_button_"+componentVO.oid).css({'text-align':'right'}).appendTo($("#toolbar_button_"+componentVO.oid).parent('.component'))
+                }
+            })
+        }
+        this.loadFormData=function (filter,DefineVO,id,uiDefineId){
+            var that=this;
+            var params = {
+                btmname: DefineVO.btmType,
+                btmType: DefineVO.btmType,
+                formDefineId: DefineVO.id,
+                oid: DefineVO.oid
+            };
+            if(that.config[id].dataOid){
+                params.oid=that.config[id].dataOid;
+            }
+            if(that.config[id].sourceDataMapList){
+                $.extend(params,that.config[id].sourceDataMapList);
+            }
+            var paramVOS=that.config[id].paramVOS||{
+                uploadFileUrl:'vciFileUploadController/uploadFile',
+                uploadFileBackPath: configData.compatibility ? path : configData.fileServicePath,
+                uploadattachment:false
+            }
+            var baseAction = layui['BaseAction'];
+            if ($('#' + filter + ' .layui-upload-drag').length > 0) {
+                baseAction.renderUploadFile('#' + filter + ' .layui-upload-drag',paramVOS)
+            }
+            if(paramVOS.uploadattachment &&paramVOS.uploadattachment == 'true'){
+                //鏄剧ず涓婁紶闄勪欢
+                baseAction.renderUploadAttach(filter,paramVOS)
+            }
+
+            $webUtil.ajax('post', 'uiDataController/dataFormQuery', params,
+                function (result) {
+                    if (result.success && result.obj){
+                        layui.form.setValues( result.obj.data, filter);
+                        //鏂囦欢
+                        if(result.obj.filePathFieldMap){
+                            var filepath=layui.$('#' + filter + ' .uploadDemoView input.uploadFileOid').attr('name');
+                            layui.$('#' + filter + ' .uploadDemoView').removeClass('layui-hide').find('img').attr('src', paramVOS.uploadfilebackpath + 'vciFileDownloadController/downloadByFileOid?fileOid=' + result.obj.filePathFieldMap[filepath].oid + '&' + TOKEN_KEY + '=' + $webUtil.getToken());
+                            layui.$('#' + filter + ' .uploadDemoView input.uploadFileOid').val(result.obj.filePathFieldMap[filepath].filePath);
+                        }
+                        //闄勪欢
+                        if(result.obj.attachmentFileVOs &&result.obj.attachmentFileVOs.length>0) {
+                            var val=[];
+                            layui.each(result.obj.attachmentFileVOs,function (i,attachmentFile){
+                                val.push(attachmentFile.oid);
+                                var tr = $(['<tr id="upload-'+ i +' oid="'+attachmentFile.oid+'">'
+                                    ,'<td>'+ attachmentFile.name+'.'+attachmentFile.fileExtension +'</td>'
+                                    ,'<td>'+ (attachmentFile.fileSize/1024).toFixed(1) +'kb</td>'
+                                    ,'<td>宸蹭笂浼�</td>'
+                                    ,'<td>'
+                                    ,'<button class="layui-btn layui-btn-xs attach-reload layui-hide">閲嶄紶</button>'
+                                    ,'<button class="layui-btn layui-btn-xs layui-btn-danger attach-delete">鍒犻櫎</button>'
+                                    ,'</td>'
+                                    ,'</tr>'].join(''));
+                                $('#'+filter+'_uploadList').append(tr);
+                            })
+                            $('#' + filter + ' [name="releaseFileOids"]').val(val.join(','))
+                        }
+
+                        $('#'+filter).click(function (){
+                            that.clickRowFn(filter,result.obj.data,DefineVO.btmType, that.config[id].filterList['ui_' + uiDefineId])
+                        })
+
+                        that.clickRowFn(filter,result.obj.data,DefineVO.btmType, that.config[id].filterList['ui_' + uiDefineId])
+                    }
+                }, function (xhr, error) {
+                    $webUtil.showErrorMsg("鑾峰彇鏁版嵁鍑虹幇浜嗛敊璇紝鍙兘鏄枃浠舵湇鍔℃病鏈夊惎鍔�");
+                }, that.backPath)
+        }
+
+        this.clickRowFn=function (thisFilter,record,btmType,filterList){
+            var that=this;
+            if(record.oid.indexOf('@vcitreesep@')>-1){
+                record.oid=record.oid.split('@vcitreesep@')[1];
+            }
+            if (thisFilter.indexOf("westAreas") > -1) {
+                for (var i = 0; i < filterList["centerAreas"].table.length; i++) {
+                    var options = layui.table.getConfig(filterList["centerAreas"].table[i])
+                    options.extraParams = {
+                        sourceBtmName: btmType,
+                        sourceOid: record.oid
+                    };
+                    options.sourceDataParams = record;
+                    options.url='uiDataController/dataGridQuery';
+                    layui.table.setConfig(options)
+                    layui.table.reload(filterList["centerAreas"].table[i]);
+                }
+                for (var i = 0; i < filterList["centerAreas"].treeGrid.length; i++) {
+                    var options = layui.treeGrid.getConfig(filterList["centerAreas"].treeGrid[i])
+                    options.extraParams = {
+                        sourceBtmName: btmType,
+                        sourceOid: record.oid
+                    };
+                    options.sourceDataParams = record;
+                    options.url='uiDataController/dataGridQuery';
+                    layui.treeGrid.reload(filterList["centerAreas"].treeGrid[i],options);
+                }
+                for (var i = 0; i < filterList["centerAreas"].tree.length; i++) {
+                    var options = layui.tree.getOptions(filterList["centerAreas"].tree[i])
+                    options.extraParams = {
+                        sourceBtmName: btmType,
+                        sourceOid: record.oid
+                    };
+                    options.sourceDataParams = record;
+                    options.url='uiDataController/getDataForTree';
+                    layui.tree.setOptions(filterList["centerAreas"].tree[i], options);
+                    layui.tree.reload(filterList["centerAreas"].tree[i]);
+                }
+                for (var i = 0; i < filterList["centerAreas"].form.length; i++) {
+                    layui.form.setValues(record, filterList["centerAreas"].form[i]);
+                    //鏂囦欢
+                    if(record.filePathFieldMap){
+                        var filepath=layui.$('#' + filterList["centerAreas"].form[i] + ' .uploadDemoView input.uploadFileOid').attr('name');
+                        layui.$('#' + filterList["centerAreas"].form[i] + ' .uploadDemoView').removeClass('layui-hide').find('img').attr('src', (configData.compatibility ? path : configData.fileServicePath) + 'vciFileDownloadController/downloadByFileOid?fileOid=' + record.filePathFieldMap[filepath].oid + '&' + TOKEN_KEY + '=' + $webUtil.getToken());
+                        layui.$('#' + filterList["centerAreas"].form[i] + ' .uploadDemoView input.uploadFileOid').val(record.filePathFieldMap[filepath].filePath);
+                    }
+                }
+                for (var i = 0; i < filterList["centerAreas"].customView.length; i++) {
+                    filterList["centerAreas"].customView[i].loadForUI(filterList["centerAreas"].customView[i].id,record)
+                }
+
+            } else if (thisFilter.indexOf("centerAreas") > -1) {
+                for (var i = 0; i < filterList["southAreas"].table.length; i++) {
+                    var options = layui.table.getConfig(filterList["southAreas"].table[i])
+                    options.extraParams = {
+                        sourceBtmName: btmType,
+                        sourceOid: record.oid
+                    };
+                    options.sourceDataParams = record;
+                    options.url='uiDataController/dataGridQuery';
+                    layui.table.setConfig(options)
+                    layui.table.reload(filterList["southAreas"].table[i]);
+                }
+                for (var i = 0; i < filterList["southAreas"].treeGrid.length; i++) {
+                    var options = layui.treeGrid.getConfig(filterList["southAreas"].treeGrid[i])
+                    options.extraParams = {
+                        sourceBtmName: btmType,
+                        sourceOid: record.oid
+                    };
+                    options.sourceDataParams = record;
+                    options.url='uiDataController/dataGridQuery';
+                    layui.treeGrid.reload(filterList["southAreas"].treeGrid[i],options);
+                }
+                for (var i = 0; i < filterList["southAreas"].tree.length; i++) {
+                    var options = layui.tree.getOptions(filterList["southAreas"].tree[i])
+                    options.extraParams = {
+                        sourceBtmName: btmType,
+                        sourceOid: record.oid
+                    };
+                    options.sourceDataParams = record;
+                    options.url='uiDataController/getDataForTree';
+                    layui.tree.setOptions(filterList["southAreas"].tree[i], options);
+                    layui.tree.reload(filterList["southAreas"].tree[i]);
+                }
+                for (var i = 0; i < filterList["southAreas"].form.length; i++) {
+                    layui.form.setValues(record, filterList["southAreas"].form[i]);
+                    //鏂囦欢
+                    if(record.filePathFieldMap){
+                        var filepath=layui.$('#' + filterList["southAreas"].form[i] + ' .uploadDemoView input.uploadFileOid').attr('name');
+                        layui.$('#' + filterList["southAreas"].form[i] + ' .uploadDemoView').removeClass('layui-hide').find('img').attr('src', (configData.compatibility ? path : configData.fileServicePath) + 'vciFileDownloadController/downloadByFileOid?fileOid=' + record.filePathFieldMap[filepath].oid + '&' + TOKEN_KEY + '=' + $webUtil.getToken());
+                        layui.$('#' + filterList["southAreas"].form[i] + ' .uploadDemoView input.uploadFileOid').val(record.filePathFieldMap[filepath].filePath);
+                    }
+                }
+                for (var i = 0; i < filterList["southAreas"].customView.length; i++) {
+                    filterList["southAreas"].customView[i].loadForUI(filterList["southAreas"].customView[i].id,record)
+                }
+            }
+        }
+        this.createSearchHtml = function (queryColumns,componentVOOid,tableFilter,configId) {
+            var queryD={}
+            layui.each(queryColumns,function (i,item){
+                item.edit = item.edit || item.type || "text";
+                if(item.edit == 'text'){
+                    queryD[item.queryField]=item.title
+                }
+            })
+            $webUtil.createSearchHtml(queryD,$("[layui-filter='toolbar_button_" + componentVOOid + "']"),tableFilter);
+        };
+        this.ADVANCEDQUERY = function(action,el){
+            var configId = $(el).attr('data-configId');
+            if(this.config[configId].serinorQueryInstance){
+                this.config[configId].serinorQueryInstance.open();
+                return;
+            }
+            var dynamicCondition = layui.dynamicCondition;
+            $('[layui-filter="toolbar_' + $(el).attr('data-toolbarId') + '"]').append('<div  id="toolbar'+ $(el).attr('data-toolbarId')+'" class="layui-inline"></div>');
+            var dataFields = JSON.parse($(el).attr('data-fields'));
+            this.config[configId].serinorQueryInstance = dynamicCondition.create({
+                fields : dataFields//鏌ヨ瀛楁
+                ,tableId:$(el).attr('data-filter')//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                ,type:"complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                // ,conditionTextId:"#toolbar"+that.id//楂樼骇鏌ヨ 鎸夐挳鎵�鍦ㄧ殑div
+                // ,popupShowQueryBtn: true//鏄剧ず楂樼骇鏌ヨ鎸夐挳
+                ,queryCallBack:function(requestData){//鏌ヨ涔嬪悗鐨刢allback
+                    //console.log(JSON.stringify(requestData))
+                }
+            });
+
+            this.config[configId].serinorQueryInstance.open();
+        };
+
+        this.refresh = function(action,el) {
+            var that = this;
+            var configId = $(el).attr('data-configId');
+            var dataFilters = JSON.parse($(el).attr('data-filters'));
+            dataFilters.tableFilter != '' && layui.table.reload(dataFilters.tableFilter), that.config[configId].checkedData[dataFilters.tableFilter.split('_')[0]] = [];
+
+            if(dataFilters.treeFilter != ''){
+                layui.tree.reload(dataFilters.treeFilter,{
+                    rootParams:{
+                        queryRoot: true
+                    }
+                });
+                that.config[configId].checkedData[dataFilters.treeFilter.split('_')[0]] = [];
+            }
+            dataFilters.treeTableFilter != '' && layui.treeGrid.reload(dataFilters.treeTableFilter), that.config[configId].checkedData[dataFilters.treeTableFilter.split('_')[0]] = [];
+            if (dataFilters.formFilter) {
+                var configId = $(el).attr('data-configId');
+                var DefineVO = JSON.parse($(el).attr('data-DefineVO'));
+                that.loadFormData(dataFilters.formFilter,DefineVO,configId);
+            }
+        };
+
+        this.refreshAll = function() {
+            var that = this;
+            var btns = $('.layui-buttons .layui-btn[layui-filter$="_buttonAction"]');
+            layui.each(btns, function (i, btn) {
+                var button = JSON.parse($(btn).attr('data-button'))
+                if(button.url && button.url.indexOf('RefreshAction')>-1){
+                    that.refresh('buttonAction', btn)
+                }
+            })
+            btns = $('.layui-buttons .layui-btn[layui-filter$="_refresh"]');
+            layui.each(btns, function (i, btn) {
+                that.refresh('refresh', btn)
+            })
+        };
+
+        this.PREVIEW=function (rowData){
+            //鏂囦欢棰勮
+            layui.use('BaseFileDownloadAction', function () {
+                var vciWebFilePreview = layui['BaseFileDownloadAction'];
+                vciWebFilePreview.PREVIEW(rowData.oid,{fileOid:rowData.oid},function (){
+                    $webUtil.showErrorMsg("鏂囦欢棰勮澶辫触锛岃鑱旂郴绠$悊鍛�")
+                })
+            })
+        }
+
+        this.buttonAction=function(action,el) {
+            var that = this;
+            var configId = $(el).attr('data-configId');
+            var button = JSON.parse($(el).attr('data-button'))
+            var paramVOS = button.paramVOS;
+            if(!paramVOS){
+                paramVOS = {};
+            }
+            var componentVOOid = JSON.parse($(el).attr('data-componentVOOid'));
+            var DefineVO = JSON.parse($(el).attr('data-DefineVO')) || {};
+            var currentAreaName = $(el).attr('data-currentArea');
+            var uiDefineId = $(el).attr('data-uiDefineId');
+
+
+            if (!paramVOS['type']) {
+                paramVOS['type'] = DefineVO.btmType;
+            }
+
+            if (!paramVOS['title']) {
+                if (DefineVO.title) {
+                    paramVOS['title'] = button.name + DefineVO.title
+                } else {
+                    paramVOS['title'] = button.name + DefineVO.componentTitle;
+                }
+            }
+            if(!$webUtil.isNull(that.config[configId].linkType)){
+                //鍖哄煙涓洪摼鎺ョ被鍨�
+                paramVOS['linkType']=that.config[configId].linkType;
+            }
+            var dataStore = [];//褰撳墠鎸夐挳鎵�鍦ㄧ殑缁勪欢涓�夋嫨鐨勬暟鎹紝涓斾互鏁扮粍褰㈠紡浼犻��
+            var sourceData = {};
+            var isShow = true;
+
+            if (currentAreaName.indexOf("westAreas") > -1) {
+                for (var i = 0; i < that.config[configId].filterList['ui_' + uiDefineId]["westAreas"].table.length; i++) {
+                    dataStore = layui.table.checkStatus(that.config[configId].filterList['ui_' + uiDefineId]["westAreas"].table[i]).data;
+                }
+                for (var i = 0; i < that.config[configId].filterList['ui_' + uiDefineId]["westAreas"].tree.length; i++) {
+                    if (layui.tree.getSelectNode(that.config[configId].filterList['ui_' + uiDefineId]["westAreas"].tree[i])) {
+                        dataStore.push(layui.tree.getSelectNode(that.config[configId].filterList['ui_' + uiDefineId]["westAreas"].tree[i]).attributes);
+                    }
+                }
+                for (var i = 0; i < that.config[configId].filterList['ui_' + uiDefineId]["westAreas"].treeGrid.length; i++) {
+                    dataStore = layui.treeGrid.checkStatus(that.config[configId].filterList['ui_' + uiDefineId]["westAreas"].treeGrid[i]).data;
+                }
+                sourceData = [that.sourceData];
+            } else if (currentAreaName.indexOf("centerAreas") > -1) {
+                for (var i = 0; i < that.config[configId].filterList['ui_' + uiDefineId]["centerAreas"].table.length; i++) {
+                    dataStore = layui.table.checkStatus(that.config[configId].filterList['ui_' + uiDefineId]["centerAreas"].table[i]).data;
+                }
+                for (var i = 0; i < that.config[configId].filterList['ui_' + uiDefineId]["centerAreas"].tree.length; i++) {
+                    if (layui.tree.getSelectNode(that.config[configId].filterList['ui_' + uiDefineId]["centerAreas"].tree[i])) {
+                        dataStore.push(layui.tree.getSelectNode(that.config[configId].filterList['ui_' + uiDefineId]["centerAreas"].tree[i]).attributes);
+                    }
+                }
+                for (var i = 0; i < that.config[configId].filterList['ui_' + uiDefineId]["centerAreas"].treeGrid.length; i++) {
+                    dataStore = layui.treeGrid.checkStatus(that.config[configId].filterList['ui_' + uiDefineId]["centerAreas"].treeGrid[i]).data;
+                }
+                sourceData = that.config[configId].checkedData['westAreas'];
+            } else if (currentAreaName.indexOf("southAreas") > -1) {
+                for (var i = 0; i < that.config[configId].filterList['ui_' + uiDefineId]["southAreas"].table.length; i++) {
+                    dataStore = layui.table.checkStatus(that.config[configId].filterList['ui_' + uiDefineId]["southAreas"].table[i]).data;
+                }
+                for (var i = 0; i < that.config[configId].filterList['ui_' + uiDefineId]["southAreas"].tree.length; i++) {
+                    if (layui.tree.getSelectNode(that.config[configId].filterList['ui_' + uiDefineId]["southAreas"].tree[i])) {
+                        dataStore.push(layui.tree.getSelectNode(that.config[configId].filterList['ui_' + uiDefineId]["southAreas"].tree[i]).attributes);
+                    }
+                }
+                for (var i = 0; i < that.config[configId].filterList['ui_' + uiDefineId]["southAreas"].treeGrid.length; i++) {
+                    dataStore = layui.treeGrid.checkStatus(that.config[configId].filterList['ui_' + uiDefineId]["southAreas"].treeGrid[i]).data;
+                }
+                sourceData = that.config[configId].checkedData['centerAreas'];
+            }
+            if (paramVOS['initvalue']) {
+                var values = paramVOS['initvalue'].split(';');
+                var initValues = []
+                layui.each(values, function (i, item) {
+                    item=item.replace(':','=');
+                    if (item.indexOf('${') > -1) {
+                        if (item.split('=')[1].indexOf('.') > -1) {
+                            if (sourceData.length<1 || !sourceData[0].oid) {
+                                isShow = false;
+                                $webUtil.showErrorMsg("璇峰厛閫夋嫨涓�鏉℃潵婧愭暟鎹�");
+                                return false;
+                            }
+                            var name = item.split('=')[1].split('.')[1].replace('${', '').replace('}', '');
+                            if (name == 'oid') {
+                                item = item.split('=')[0] + '=' + sourceData[0]['oid']
+                            } else {
+                                item = item.split('=')[0] + '=' + sourceData[0][name]
+                            }
+                        } else {
+                            if (dataStore.length < 1) {
+                                isShow = false;
+                                $webUtil.showErrorMsg("璇峰厛閫夋嫨涓�鏉℃暟鎹�");
+                                return false;
+                            }
+                            var name = item.split('=')[1].replace('${', '').replace('}', '');
+                            item = item.split('=')[0] + '=' + dataStore[0][name];
+
+                        }
+                    }
+                    initValues.push(item)
+                })
+                paramVOS['initvalue'] = initValues.join(';')
+            }
+            paramVOS['title']=$webUtil.replaceFreeMarker(paramVOS.title,dataStore,{})
+            var urlobj = $webUtil.getUrlParams(button.url, {
+                jsPath: 'BaseAddAction',
+                methodName:'doAction'
+            });
+            $.extend(paramVOS, urlobj.params);
+            if (isShow) {
+                layui.use(urlobj.jsPath, function () {
+                    var BaseAction = layui[urlobj.jsPath];
+                    var viewid = 'actionView_' + componentVOOid;
+                    var callback = function () {
+                        /*var refreshBtn = $('.layui-btn[layui-filter="toolbar_' + componentVOOid + '_refresh"]');
+                        refreshBtn.trigger('click')*/
+                        that.refresh(action,el)
+                    }
+                    BaseAction[urlobj.methodName]({
+                        paramVOS: paramVOS,
+                        id: viewid,
+                        dataStore: dataStore,
+                        sourceData: sourceData[0],
+                        callback: callback
+                    });
+                })
+            }
+        }
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/VciUIContentViewer.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/VciUIContentViewer.js
new file mode 100644
index 0000000..9eb37c3
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/VciUIContentViewer.js
@@ -0,0 +1,1019 @@
+/**
+ * UI涓婁笅鏂囩殑灞曠ず鍣�
+ * @author weidy
+ * @date 2021-3-1
+ */
+layui.define(['layer','element','form','table','util','tree','treeGrid','dynamicCondition','BaseAction'],function(exports){
+    var Class = function() {
+        this.MODELNAME = "platform/objectService/VciUIContentViewer";
+        this.moduleKey = "VciUIContentViewer";
+        this.id = 'VciUIContentViewer';
+        this.config = {};
+        this.backPath = configData.compatibility?path:configData.objectServicePath;
+        this.controller = 'webUIController/';
+        this.getContent=function(id){
+            return '<div id="UIContent_' + id + '" style="overflow: auto;padding:0 5px"></div>';
+        };
+
+        this.init = function (id,options,callback) {
+            //ids鏄粍浠讹紝options鏄厤缃殑淇℃伅锛屼篃灏辨槸souceDatas;
+            var that = this;
+            $webUtil.copyConfig(that,that.moduleKey);
+            that.config[id] = options;
+            that.config[id].functionId=id;
+            that.config[id].sourceDataMapList={};
+            if(this.sourceData&&this.sourceData.sourceDataMap){
+                layui.each(this.sourceData.sourceDataMap, function (i, item) {
+                    if(item && item.constructor === Object) return;
+                    if(i=='type'||i=='context'||i=='content') return;
+                    that.config[id].sourceDataMapList['sourceData["'+i+'"]'] = item;//encodeURIComponent(item);
+                });
+            }
+            if(this.sourceData&&this.sourceData.actionData){
+                $.extend(that.config[id],this.sourceData.actionData);
+                /*if(that.config[id].selectData){
+                    //涓婂尯鍩熼�変腑鏁版嵁
+                    layui.each(that.config[id].selectData, function (i, item) {
+                        if(item && item.constructor === Object) return;
+                        that.config[id].sourceDataMapList['sourceData["'+i+'"]'] = item;//encodeURIComponent(item);
+                    });
+                }*/
+                if(that.config[id].dataStore && that.config[id].dataStore.length>0){
+                    //褰撳墠鍖哄煙閫変腑鏁版嵁
+                    layui.each(that.config[id].dataStore[0], function (i, item) {
+                        if(item && item.constructor === Object) return;
+                        that.config[id].sourceDataMapList['sourceData["'+i+'"]'] =item;// encodeURIComponent(item);
+                    });
+                }
+                if(that.config[id].paramVOS){
+                    layui.each(that.config[id].paramVOS, function (i, item) {
+                        if(item && item.constructor === Object) return;
+                        that.config[id].sourceDataMapList['sourceData["'+i+'"]'] = item;//encodeURIComponent(item);
+                    });
+                }
+            }
+            that.config[id].filterList={};
+            that.config[id].areasFilter= {};
+            that.config[id].checkedData={
+                westAreas:[],
+                centerAreas:[],
+                southAreas:[]
+            }
+
+            if($webUtil.isNull(options.btmType) || $webUtil.isNull(options.content)){
+                $webUtil.showErrorMsg("閰嶇疆鐨勪俊鎭敊璇紝璇峰弬鑰僓I:type#content?param=xxx杩欑褰㈠紡銆傚叾涓璽ype鏄笟鍔$被鍨嬶紙鎴栭摼鎺ョ被鍨嬶級锛宑ontent鏄疷I涓婁笅鏂囩殑鍚嶇О");
+                return false;
+            }
+            //1. 鑾峰彇UI涓婁笅鏂囩殑閰嶇疆淇℃伅
+            that.selectUIDefines(id,options,callback);
+        };
+        this.selectUIDefines = function (id,options,callback) {
+            var that = this;
+            $webUtil.get(that.controller + '/getUIContentByBtmTypeAndId',{btmType:options.btmType,id:options.content},function (result) {
+                if(result.success) {
+                    that.config[id].uiDefineVO = result.obj;
+                    that.showContent(id,options.content,callback)
+                }else{
+                    $webUtil.showErrorMsg(result.msg);
+                }
+            },function (xhr,error) {
+                $webUtil.showErrorMsg('鍙兘鏈嶅姟娌℃湁鍚姩锛岄〉闈㈣幏鍙栧け璐ャ�傝绋嶅悗鍐嶈瘯');
+                return false;
+            },that.path);
+        }
+
+        this.checkDisplayExpression=function (id,displayExpressionStr){
+            var me=this;
+            var that = this.config[id];
+            var checknotdisplay=true;
+            var displayExpression;
+            if (displayExpressionStr.indexOf(' or"${') != -1) {
+                displayExpression = displayExpressionStr.split(' or"${')
+            } else if (displayExpressionStr.indexOf(' OR"${') != -1) {
+                displayExpression = displayExpressionStr.split(' OR"${')
+            } else {
+                displayExpression = [displayExpressionStr]
+            }
+            displayExpression[0]=displayExpression[0].split('"${')[1];
+            layui.each(displayExpression, function (i, item) {
+                if (item.indexOf('=') != -1) {
+                    var key = item.split('}"="')[0];
+                    var value = item.split('}"="')[1];
+                    debugger;
+                    value = value && value.substr(0, value.length - 1)
+                    if (that.dataStore[0][key] == value) {
+                        checknotdisplay = false;
+                        return false;
+                    }
+                }
+            })
+            return checknotdisplay;
+        }
+        this.showContent=function (id,uiDefineId,callback){
+            var me=this;
+            var that = this.config[id];
+            that.areasFilter= {
+                northAreas: {tree: [], table: [],treeGrid: [], form: [],customView:[]},
+                westAreas: {tree: [], table: [], treeGrid: [], form: [],customView:[]},
+                centerAreas: {tree: [], table: [],treeGrid: [],  form: [],customView:[]},
+                southAreas: {tree: [], table: [], treeGrid: [], form: [],customView:[]}
+            }
+            that.checkedData={
+                westAreas:[],
+                centerAreas:[],
+                southAreas:[]
+            }
+            var northHtml=[],centerHtml=[],westHtml=[],southHtml=[];
+
+            var parentWidth=$("#UIContent_"+that.functionId).width();
+            var html=[
+                '<div class="layui-layout easyui-layout UIContentLayout" id="easyuiLayout_',id,'" data-options="fit:true" style="display:block;overflow-y: hidden;">',
+                    //'<div class="layui-layout-border" style="clear: both">',
+                        that.uiDefineVO.northAreas&& that.uiDefineVO.northAreas.length>0?'<div class="layui-north" data-options="region:\'north\',split:true" style=""></div>':'',
+                        that.uiDefineVO.westAreas&& that.uiDefineVO.westAreas.length>0?'<div class="layui-west" data-options="region:\'west\',split:true"  style="width:300px;padding: 5px;margin-right: 0;"></div>':'',
+                        '<div class="layui-center" data-options="region:\'center\',split:true"  style="display:inline-block;border:0;'+(that.uiDefineVO.westAreas&& that.uiDefineVO.westAreas.length>0?'width:'+(parentWidth-328)+'px;':'')+'margin: 0;overflow: auto">',
+                            '<div id="easyuiLayoutCenter_',id,'" class="easyui-layout" data-options="fit:true">',
+                                that.uiDefineVO.centerAreas&& that.uiDefineVO.centerAreas.length>0?'<div class="layui-layout" data-options="region:\'center\',minHeight:50" style="padding-left: 10px;padding-right: 10px;"></div>':'',
+                                that.uiDefineVO.southAreas&& that.uiDefineVO.southAreas.length>0?'<div class="layui-south" data-options="region:\'south\',split:true,minHeight:50"  style="padding-left:10px;padding-right:10px;height: 200px;"></div>':'',
+                            '</div>',
+                        '</div>',
+                    //'</div>',
+                '</div>'
+            ];
+            $("#UIContent_"+that.functionId).html(html.join(''));
+
+            that.firstLoad=true;
+            if(that.uiDefineVO.northAreas && that.uiDefineVO.northAreas.length>0){
+                northHtml=[]
+            }
+            if(that.uiDefineVO.westAreas && that.uiDefineVO.westAreas.length>0){
+                if(that.uiDefineVO.westAreas.length>1) {
+                    westHtml.push('<div class="layui-tab" >');
+                    westHtml.push('<ul class="layui-tab-title" lay-allowClose="false">');
+                    westHtml.push('</ul>');
+                    westHtml.push('<ul class="layui-tab-content">');
+                    westHtml.push('</ul>');
+                    westHtml.push('</div>');
+
+                    $("#UIContent_" + that.functionId + " .layui-west").append(westHtml.join(''));
+                    var showIndex2=0;
+                    layui.each(that.uiDefineVO.westAreas, function (i, areaItem) {
+                        if(!areaItem.enableStatus){
+                            showIndex2++;
+                            return;
+                        }
+                        var checknotdisplay=false;
+                        if(webUtil.isNotNull(areaItem.displayExpression)) {
+                            checknotdisplay = me.checkDisplayExpression(id,areaItem.displayExpression);
+                            if (checknotdisplay) {
+                                showIndex2++;
+                                return;
+                            }
+                        }
+                        $("#UIContent_" + that.functionId + " .layui-west .layui-tab-title").append('<li class="' + (i == showIndex2 ? 'layui-this' : '') + '" style="'+(checknotdisplay?'display: none':'')+'">' + areaItem.name + '</li>');
+
+                        var itemLi = $('<li class="layui-tab-item ' + (i == showIndex2 ? 'layui-show' : '') + '" style="'+(checknotdisplay?'display: none':'')+'"></li>');
+                        $("#UIContent_" + that.functionId + " .layui-west .layui-tab-content").append(itemLi);
+                        if(!checknotdisplay){
+                            me.getWestContent(id,areaItem, uiDefineId,itemLi,'westAreas')
+                        }
+                    })
+
+                }else{
+                    var div=$('<div></div>')
+                    $("#UIContent_" + that.functionId + " .layui-west").append(div);
+                    me.getWestContent(id,that.uiDefineVO.westAreas[0], uiDefineId,div,'westAreas')
+                }
+            }
+            if(that.uiDefineVO.centerAreas && that.uiDefineVO.centerAreas.length>0){
+                if(that.uiDefineVO.centerAreas.length>1){
+                    centerHtml.push('<div class="layui-tab" style="margin-top: 0;">');
+                    centerHtml.push('<ul class="layui-tab-title" lay-allowClose="false">');
+                    centerHtml.push('</ul>');
+
+                    centerHtml.push('<ul class="layui-tab-content">');
+                    centerHtml.push('</ul>');
+                    centerHtml.push('</div>');
+
+                    $("#UIContent_" + that.functionId + " .layui-center .layui-layout").append(centerHtml.join(''));
+                    var showIndex=0;
+                    layui.each(that.uiDefineVO.centerAreas, function (i, areaItem) {
+                        if(!areaItem.enableStatus){
+                            showIndex++;
+                            return;
+                        }
+                        var checknotdisplay=false;
+                        if(webUtil.isNotNull(areaItem.displayExpression)) {
+                            checknotdisplay = me.checkDisplayExpression(id,areaItem.displayExpression);
+                            if (checknotdisplay) {
+                                showIndex++;
+                                return;
+                            }
+                        }
+                        $("#UIContent_" + that.functionId + " .layui-center .layui-layout .layui-tab-title").append('<li class="' + (i == showIndex ? 'layui-this' : '') + '" style="'+(checknotdisplay?'display: none':'')+'">' + areaItem.name + '</li>');
+
+                        var itemLi = $('<li class="layui-tab-item ' + (i == showIndex ? 'layui-show' : '') + ' style="'+(checknotdisplay?'display: none':'')+'""></li>');
+                        $("#UIContent_" + that.functionId + " .layui-center .layui-layout .layui-tab-content").append(itemLi);
+                        if(!checknotdisplay){
+                            me.getWestContent(id,areaItem, uiDefineId,itemLi,'centerAreas')
+                        }
+                    })
+                }else{
+                    var div=$('<div></div>')
+                    $("#UIContent_" + that.functionId + " .layui-center .layui-layout").append(div);
+                    me.getWestContent(id,that.uiDefineVO.centerAreas[0], uiDefineId,div,'centerAreas')
+                }
+            }
+            if(that.uiDefineVO.southAreas && that.uiDefineVO.southAreas.length>0){
+                if(that.uiDefineVO.southAreas.length>1){
+                    southHtml.push('<div class="layui-tab" >');
+                    southHtml.push('<ul class="layui-tab-title" lay-allowClose="false">');
+                    southHtml.push('</ul>');
+
+                    southHtml.push('<ul class="layui-tab-content">');
+                    southHtml.push('</ul>');
+                    southHtml.push('</div>');
+
+                    $("#UIContent_" + that.functionId + " .layui-south").append(southHtml.join(''));
+                    var showIndex1=0;
+                    layui.each(that.uiDefineVO.southAreas, function (i, areaItem) {
+                        if(!areaItem.enableStatus){
+                            showIndex1++;
+                            return;
+                        }
+                        var checknotdisplay=false;
+                        if(webUtil.isNotNull(areaItem.displayExpression)) {
+                            checknotdisplay = me.checkDisplayExpression(id,areaItem.displayExpression);
+                            if (checknotdisplay) {
+                                showIndex1++;
+                                return;
+                            }
+                        }
+                        $("#UIContent_" + that.functionId + " .layui-south .layui-tab-title").append('<li class="' + (i == showIndex1 ? 'layui-this' : '') + '" style="'+(checknotdisplay?'display: none':'')+'">' + areaItem.name + '</li>');
+
+                        var itemLi = $('<li class="layui-tab-item ' + (i == showIndex1 ? 'layui-show' : '') + '" style="'+(checknotdisplay?'display: none':'')+'"></li>');
+                        $("#UIContent_" + that.functionId + " .layui-south .layui-tab-content").append(itemLi);
+                        if(!checknotdisplay){
+                            me.getWestContent(id,areaItem, uiDefineId,itemLi,'southAreas')
+                        }
+                    })
+                }else{
+                    var div=$('<div></div>')
+                    $("#UIContent_" + that.functionId + " .layui-south").append(div);
+                    me.getWestContent(id,that.uiDefineVO.southAreas[0], uiDefineId,div,'southAreas')
+                }
+            }
+
+            var key='ui_'+uiDefineId;
+            that.filterList[key]=that.areasFilter;
+
+            $("#UIContent_" + that.functionId + ' .layui-tab-title').on('click', function(title) {
+                var tabcontent=$(title.toElement).parent().next().find('.layui-tab-item:eq('+$(title.toElement).index()+')')
+                layui.each(tabcontent.find('.component'),function (i,component){
+                    var dataFilters=$(this).data('filters');
+                    dataFilters.tableFilter != '' && layui.table.reload(dataFilters.tableFilter,{url:'uiDataController/dataGridQuery'}), that.checkedData[dataFilters.tableFilter.split('_')[0]] = [];
+                    dataFilters.treeFilter != '' && layui.tree.reload(dataFilters.treeFilter,{url:'uiDataController/getDataForTree'}), that.checkedData[dataFilters.treeFilter.split('_')[0]] = [];
+                    dataFilters.treeTableFilter != '' && layui.treeGrid.reload(dataFilters.treeTableFilter,{url:'uiDataController/dataGridQuery'}), that.checkedData[dataFilters.treeTableFilter.split('_')[0]] = [];
+
+                })
+            });
+
+            var h=$('#portal_body').height()-43
+            if(that.isOpen){
+                h=$('#easyuiLayout_'+id).closest('.layui-layer-content').height()-10
+                if($('#easyuiLayout_'+id).closest('.layui-tab').length>0) {
+                    h-=55;
+                }
+            }
+            $('#easyuiLayout_'+id).css({height:h})
+
+            $('#easyuiLayoutCenter_'+id).layout();
+            $('#easyuiLayout_'+id).layout();
+            if(callback) callback();
+        }
+
+
+        this.getWestContent=function (id,areaItem,uiDefineId,containerDiv,areaName) {
+            var that=this;
+            var table=layui.table;
+            var tree=layui.tree;
+            var form=layui.form;
+            var treeGrid=layui.treeGrid;
+            var html = []
+            if(areaItem.componentVOs.length>1){
+                containerDiv.append('<div class="layui-collapse" lay-filter=""></div>')
+            }
+            layui.each(areaItem.componentVOs, function (i, componentVO) {
+                html = [];
+                html.push('<div class="component" >');
+                //鎸夐挳
+                html.push('<div id="toolbar_button_',componentVO.oid,'" layui-filter="toolbar_button_',componentVO.oid,'" class="layui-btn-container layui-buttons">');
+                var hasRefresh = false;
+                var dataFilters={
+                    treeFilter:componentVO.treeDefineVO?(areaName+'_tree_'+id+'_' + componentVO.oid +'_'+ componentVO.treeDefineVO.btmType+'_'+uiDefineId):'',
+                    tableFilter:componentVO.tableDefineVO?(areaName + '_table_'+id+'_' + componentVO.oid + '_' + componentVO.tableDefineVO.oid+'_'+uiDefineId):'',
+                    treeTableFilter:componentVO.treeTableDefineVO?(areaName + '_treetable_'+id+'_' + componentVO.oid + '_' + componentVO.treeTableDefineVO.oid+'_'+uiDefineId):'',
+                    formFilter:componentVO.formDefineVO?(areaName+'_form_'+id+'_'+ componentVO.oid+'_'+componentVO.formDefineVO.oid+'_'+uiDefineId):''
+                };
+                if(that.config[id].isShowBtns!=false && componentVO.buttons.length>0) {
+                    var DefineVO = componentVO.treeDefineVO || componentVO.tableDefineVO || componentVO.treeTableDefineVO || componentVO.formDefineVO;
+                    DefineVO && (DefineVO.componentTitle = componentVO.description||componentVO.name)
+                    layui.each(componentVO.buttons, function (i, button) {
+                        if (button.name == '鍒锋柊' || button.id == 'refresh') {
+                            hasRefresh = true;
+                            //html.push('<button class="layui-btn layui-btn-sm" layui-filter="toolbar_' + componentVO.oid + '_refresh" data-configId="'+id+'" data-filters=\'' + JSON.stringify(dataFilters) + '\'><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>');
+                        }
+                        html.push('<button class="layui-btn layui-btn-sm" type="button" layui-filter="toolbar_' + componentVO.oid + '_buttonAction" data-configId="'+id+'" data-button=\'' + JSON.stringify(button) + '\' data-filters=\'' + JSON.stringify(dataFilters) + '\' data-componentVOOid=\'' + JSON.stringify(componentVO.oid) + '\' data-DefineVO=\'' + JSON.stringify(DefineVO) + '\'  data-currentArea="' + areaName + '" data-uiDefineId="' + uiDefineId + '"><i class="layui-icon" style=" ' + (button.iconPath ? 'width:16px;height:16px;background-image: url(' + button.iconPath + ')' : '') + '"></i>' + button.name + '</button>');
+
+                    })
+                }
+
+                if(componentVO.tableDefineVO) {
+                    if(componentVO.tableDefineVO.seniorQueryColumns && componentVO.tableDefineVO.seniorQueryColumns.length>0) {
+                        html.push('<button class="layui-btn layui-btn-sm" type="button" layui-filter="toolbar_' + componentVO.oid + '_ADVANCEDQUERY" data-configId="' + id + '" data-filter=\'' + dataFilters.tableFilter + '\' data-toolbarId="' + componentVO.oid + '" data-fields=\'' + JSON.stringify(componentVO.tableDefineVO.seniorQueryColumns) + '\'><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>');
+                    }
+                    if (!hasRefresh) {
+                        html.push('<button class="layui-btn layui-btn-sm" type="button" layui-filter="toolbar_' + componentVO.oid + '_refresh" data-configId="'+id+'" data-filters=\'' + JSON.stringify(dataFilters) + '\'><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>');
+                    }
+                }else if(componentVO.treeDefineVO||componentVO.treeTableDefineVO){
+                    if (!hasRefresh) {
+                        html.push('<button class="layui-btn layui-btn-sm" type="button" layui-filter="toolbar_' + componentVO.oid + '_refresh" data-configId="'+id+'" data-filters=\'' + JSON.stringify(dataFilters) + '\'><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>');
+                    }
+                }
+                html.push('</div>');
+                html.push('</div>');
+
+                if(areaItem.componentVOs.length>1){
+                    $(".layui-collapse",containerDiv).append('<div class="layui-colla-item"><h2 class="layui-colla-title">'+componentVO.name+'</h2><div class="layui-colla-content layui-show">'+html.join('')+'</div></div>')
+                }else{
+                    containerDiv.append(html.join(''));
+                }
+                $('.component',containerDiv).data('filters',dataFilters)
+
+                layui.element.render();
+
+                $webUtil.bindDefultButtonLisenter(that, componentVO.oid);
+
+                //鏍�
+                if(componentVO.treeDefineVO){
+                    var filter=dataFilters.treeFilter;
+                    if(tree.config&&tree.config[filter]){
+                        tree.destory(filter);
+                    }
+                    $(".component", containerDiv).eq(i).append('<ul layui-filter="'+ filter+'"></ul>');
+
+                    that.fristTreeLoad = false;
+                    var parentFieldName = "";
+                    var rootQueryValue = "";
+                    if(componentVO.treeDefineVO.showLinkAbs){
+                        parentFieldName = componentVO.treeDefineVO.showLinkAbs.split(",")[0];
+                        rootQueryValue = componentVO.treeDefineVO.showLinkAbs.split(",")[1];
+                    }
+                    var treeParams={
+                        isMuti: false,
+                        isQueryAllColumn: true,
+                        btmname: componentVO.treeDefineVO.btmType,
+                        componentOid:componentVO.oid,
+                        uiDefineId:uiDefineId,
+                        valueField:componentVO.treeDefineVO.valueField,
+                        parentFieldName:parentFieldName,
+                        //parentOid:result.treeData[0].oid,
+                        //parentBtmName:result.treeData[0].attributes.btmname,
+                        textField:componentVO.treeDefineVO.treeNodeExpression,
+                        queryTemplate: that.config[id].querytemplate,
+                        linkTypeFlag: $webUtil.isNull(that.config[id].queryType)?($webUtil.isNull(that.config[id].linkType)?false:true):(that.config[id].queryType==0?false:true),
+                        //toBtmType:componentVO.treeDefineVO.btmType,
+                        rootExpress:componentVO.treeDefineVO.rootExpress
+                    }
+                    tree.init(filter, $('[layui-filter="' + filter + '"]'), {
+                        url: that.config[id].firstLoad?'uiDataController/getDataForTree':'',
+                        backPath: that.backPath,
+                        requestType:'post',
+                        rootParams:{
+                            queryRoot: true
+                        },
+                        where: treeParams,
+                        extraParams:that.config[id].sourceDataMapList,
+                        showSearch:that.config[id].showSearch||false,
+                        treeFilter: filter,
+                        loadType: componentVO.treeDefineVO.loadType,
+                        treeName: componentVO.treeDefineVO.id,
+                        click: function (thisTreeFilter, elem, options) {
+                            that.config[id].checkedData[areaName]=[thisTreeFilter.attributes];
+                            that.clickRowFn(options.treeFilter, thisTreeFilter.attributes, componentVO.treeDefineVO.btmType, that.config[id].filterList['ui_' + uiDefineId]);
+
+                        },
+                        done:function (thisTreeFilter,children,elem) {
+                            elem.children().eq(0).children('a').trigger('click');
+                            that.config[id].firstLoad=false;
+                        }
+                    });
+
+                    that.config[id].areasFilter[areaName].tree.push(filter);
+                }
+                //琛ㄦ牸
+                if(componentVO.tableDefineVO) {
+                    var filter = dataFilters.tableFilter;
+                    $(".component", containerDiv).css({minWidth:'520px'}).eq(i).append('<table id="' + filter + '" lay-filter="' + filter + '" style="overflow-x:auto;"></table>')
+                    var cols = [];
+                    for (var i = 0; i < componentVO.tableDefineVO.cols.length; i++) {
+                        if (componentVO.tableDefineVO.btmType == 'fileobject') {
+                            //鏄枃浠�
+                            $.each(componentVO.tableDefineVO.cols[i],function (ci,citem){
+                                if(citem.field=='name'){
+                                    componentVO.tableDefineVO.cols[i][ci].templet=function (d){
+                                        return '<a class="layui-btn layui-btn-intable"  lay-event="PREVIEW">'+d.name+'</a>'
+                                    }
+                                    return false;
+                                }
+                            })
+
+                        }
+                        if (i == 0) {
+                            componentVO.tableDefineVO.cols[i].unshift({
+                                field: table.config.indexName,
+                                type: 'numbers',
+                                title: '搴忓彿',
+                                rowspan: componentVO.tableDefineVO.cols.length,
+                                width: 40
+                            }, {
+                                field: table.config.checkName,
+                                type: 'checkbox',
+                                rowspan: componentVO.tableDefineVO.cols.length,
+                                width: 30
+                            })
+                        }
+                        cols.push(componentVO.tableDefineVO.cols[i]);
+                    }
+
+                    var tableParams={
+                        btmname: componentVO.tableDefineVO.btmType,
+                        tableDefineId: componentVO.tableDefineVO.id,
+                        componentOid: componentVO.oid,
+                        uiDefineId: uiDefineId,
+                        linkTypeFlag:componentVO.tableDefineVO.linkTypeFlag
+                    }
+                    table.render({
+                        elem: '#' + filter,
+                        id: filter,
+                        url: that.config[id].firstLoad?'uiDataController/dataGridQuery':'',
+                        backPath: that.backPath,
+                        method:'post',
+                        page: {
+                            limit: componentVO.tableDefineVO.pageVO ? componentVO.tableDefineVO.pageVO.limit : 10,
+                            page: componentVO.tableDefineVO.pageVO? componentVO.tableDefineVO.pageVO.page :1
+                        },
+                        limits: componentVO.tableDefineVO.limits,
+                        where: tableParams,
+                        extraParams:that.config[id].sourceDataMapList,
+                        selectMode: table.selectMode.muti,
+                        cols: cols,
+                        done: function (res, cur, total) {
+                            if (total > 0) {
+                                //table.selectRecord(filter, {index: 0});
+                            }
+                            table.on('tool(' + filter + ')',function(obj){
+                                var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                                var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                                if(layEvent == 'PREVIEW'){
+                                    that.PREVIEW(data);
+                                }
+                            });
+                            that.config[id].firstLoad=false;
+                        },
+                        rowClick: function (thisTableFilter, record,isChecked) {
+                            that.config[id].checkedData[areaName]=layui.table.checkStatus(thisTableFilter).data;
+                            that.clickRowFn(thisTableFilter, record, componentVO.tableDefineVO.btmType, that.config[id].filterList['ui_' + uiDefineId]);
+
+                        },
+                        rowDBLClick:function (thisTableFilter, record){
+
+                        }
+                    })
+
+                    that.config[id].areasFilter[areaName].table.push(filter);
+
+                    if (componentVO.tableDefineVO.queryColumns && componentVO.tableDefineVO.queryColumns.length > 0) {
+                        that.createSearchHtml(componentVO.tableDefineVO.queryColumns, componentVO.oid, filter,id)
+                    }
+                }
+                //鏍戣〃
+                if(componentVO.treeTableDefineVO){
+                    var filter=dataFilters.treeTableFilter;
+                    $(".component", containerDiv).eq(i).append('<table id="' + filter + '" lay-filter="' + filter + '" style="overflow-x:auto;"></table>')
+                    var cols = [];
+                    for (var i = 0; i < componentVO.treeTableDefineVO.cols.length; i++) {
+                        if (i == 0) {
+                            componentVO.treeTableDefineVO.cols[i].unshift({
+                                field: table.config.indexName,
+                                type: 'numbers',
+                                title: '搴忓彿',
+                                rowspan: componentVO.treeTableDefineVO.cols.length,
+                                width: 40
+                            }, {
+                                field: table.config.checkName,
+                                type: 'checkbox',
+                                rowspan: componentVO.treeTableDefineVO.cols.length,
+                                width: 30
+                            })
+                        }
+                        cols.push(componentVO.treeTableDefineVO.cols[i]);
+                    }
+                    var treeTableParams={
+                        btmname: componentVO.treeTableDefineVO.btmType,
+                        tableDefineId: componentVO.treeTableDefineVO.id,
+                        componentOid: componentVO.oid,
+                        uiDefineId: uiDefineId,
+                        linkTypeFlag:componentVO.treeTableDefineVO.linkTypeFlag,
+                        treeTableFlag:true
+                    }
+                    treeGrid.render({
+                        elem: '#' + filter,
+                        id: filter,
+                        cols: cols,
+                        url: that.config[id].firstLoad?'uiDataController/dataGridQuery':'',
+                        backPath: that.backPath,
+                        method:'post',
+                        limit: componentVO.treeTableDefineVO.pageVO ? componentVO.treeTableDefineVO.pageVO.limit : 10,
+                        limits: componentVO.treeTableDefineVO.limits,
+                        where: treeTableParams,
+                        extraParams:that.config[id].sourceDataMapList,
+                        selectMode:table.selectMode.muti,
+                        treeId:(componentVO.treeTableDefineVO.treeCurrentField||'oid'),//鏍戝舰id瀛楁鍚嶇О
+                        treeUpId:(componentVO.treeTableDefineVO.treeParentField||'parentOid'),//鏍戝舰鐖秈d瀛楁鍚嶇О
+                        treeShowName:(componentVO.treeTableDefineVO.treeFieldName||'name'),//浠ユ爲褰㈠紡鏄剧ず鐨勫瓧娈�
+                        rowClick: function (thisTableFilter, record,isChecked) {
+                            that.config[id].checkedData[areaName] = layui.treeGrid.checkStatus(thisTableFilter).data;
+                            that.clickRowFn(thisTableFilter, record, componentVO.treeTableDefineVO.btmType, that.config[id].filterList['ui_' + uiDefineId])
+                        },
+                        done:function(res,cur,total){
+                            if (total > 0) {
+                                //treeGrid.selectRecord(filter, {index: 0});
+                            }
+                            that.config[id].firstLoad=false;
+                        }
+                    });
+
+                    that.config[id].areasFilter[areaName].treeGrid.push(filter);
+
+                    if (componentVO.treeTableDefineVO.queryColumns && componentVO.treeTableDefineVO.queryColumns.length > 0) {
+                        that.createSearchHtml(componentVO.treeTableDefineVO.queryColumns, componentVO.oid, filter,id)
+                    }
+                }
+                //琛ㄥ崟
+                if(componentVO.formDefineVO){
+                    var filter=dataFilters.formFilter;
+                    $(".component", containerDiv).eq(i).append('<form id="'+filter +'" lay-filter="'+ filter+ '" class="layui-form" style=""></form>')
+                    form.addItems(filter,componentVO.formDefineVO.items, function (){
+                        that.loadFormData(filter,componentVO.formDefineVO,id,uiDefineId)
+                    }, {}, { defaultColumnOneRow: componentVO.formDefineVO.columnOneRow || 1});
+
+                    that.config[id].areasFilter[areaName].form.push(filter);
+                }
+                //鑷畾涔�
+                if(componentVO.customClass) {
+                    // //1. 鑾峰彇锛熷悗鐨勫弬鏁帮紝浣滀负options鏀捐繘鍘汇�傚悓鏃秓ptions杩樻妸褰撳墠鑷畾涔夌粍浠剁殑淇℃伅鏀捐繘鍘伙紝鍖呮嫭UI涓婁笅鏂囩殑涓婚敭锛屽綋鍓嶇粍浠剁殑涓婚敭绛�
+                    // //2. use杩欎釜缁勪欢锛岀劧鍚庡皢options鏀惧埌璇ョ粍浠堕噷
+                    // //3. 璋冪敤getContent鏂规硶锛屽弬鏁颁负id鍜宱ptions銆傝繖閲岀殑id灏辨槸褰撳墠鑷畾涔夌晫闈㈢殑oid銆傜粍浠跺唴閮ㄨ嚜琛屽瓨鍌╫ptions銆備篃鎴栬�呭湪褰撳墠瀵硅薄涓婂瓨鍦�
+                    // //4. 璋冪敤init,鍙傛暟涔熸槸id鍜宱ptions銆傞〉闈㈤粯璁や笉鍔犺浇鏁版嵁
+                    // //5. 鍔犺浇鏁版嵁鐨勬椂鍊欙紝璋冪敤loadForUI鏂规硶锛屽弬鏁颁负id鍜宻ourceData锛岃繖涓猻ourceData涓哄墠闈㈣繖涓尯鍩熼�夋嫨鐨勬暟鎹紝缁熶竴浣跨敤鏁扮粍鐨勫舰寮忋��
+                     layui.use(componentVO.customClass.split('?')[0], function () {
+                         var customClass=componentVO.customClass.split(':');
+                         if(customClass.length>1){
+                             lowcustom=customClass[0].toLowerCase();
+                             if(lowcustom=='usejs'||lowcustom=='js'){
+                                 var customClassList=[]
+                                 for (var li=1;li<customClass.length;li++){
+                                     customClassList.push(customClass[li]);
+                                 }
+                                 componentVO.customClass=customClassList.join(':');
+                             }
+                         }
+
+                         var customView = layui[componentVO.customClass.split('?')[0]];
+                         if(componentVO.customClass.indexOf("?") <0){
+                             componentVO.customClass=componentVO.customClass+'?'
+                             //$webUtil.showErrorMsg("璇疯仈绯荤鐞嗗憳锛岃繖涓嚜瀹氫箟椤甸潰鐨勫湴鍧�鏍煎紡涓嶆纭�傛帹鑽愪娇鐢║I:type#content?param=xxx杩欑褰㈠紡");
+                             //return;
+                         }
+                         var paramsArray = componentVO.customClass.split('?')[1].split("&");
+                         var urlParams={};
+                         for(var i = 0 ; i < paramsArray.length ; i ++){
+                             var preParam =paramsArray[i].split("=");
+                             if(preParam[0]=='btmname'){
+                                 urlParams['btmType']=preParam[1];
+                             }else if(preParam[0]=='imagetype'){
+                                 urlParams['imageType']=preParam[1];
+                                 if(preParam[1]=='fileobject'){
+
+                                 }
+                             }else{
+                                 urlParams[preParam[0]] = preParam[1];
+                             }
+
+                         }
+
+                         var customOptions={
+                             action: componentVO.customClass.split('?')[0],
+                             urlParams: urlParams,
+                             imgHeight: 400,
+                             uiComponentType: componentVO.uiComponentType,
+                             uiComponentTypeText: componentVO.uiComponentTypeText,
+                             uiParseClass: componentVO.uiParseClass
+                         }
+                         var customid='customView_'+componentVO.oid;
+                         $(".component", containerDiv).html(customView.getContent(customid,customOptions));
+                         customView.id=customid;
+                         customView.init(customid, customOptions);
+                         that.config[id].areasFilter[areaName].customView.push(customView);
+                     });
+                }
+
+                //璇ラ〉闈㈡樉绀哄湪寮圭獥涓�
+                if(that.config[id].isOpen && componentVO.formDefineVO){
+                    $("#toolbar_button_"+componentVO.oid).css({'text-align':'right'}).appendTo($("#toolbar_button_"+componentVO.oid).parent('.component'))
+                }
+            })
+        }
+        this.loadFormData=function (filter,DefineVO,id,uiDefineId){
+            var that=this;
+            var params = {
+                btmname: DefineVO.btmType,
+                btmType: DefineVO.btmType,
+                formDefineId: DefineVO.id,
+                oid: DefineVO.oid
+            };
+            if(that.config[id].dataOid){
+                params.oid=that.config[id].dataOid;
+            }
+            if(that.config[id].sourceDataMapList){
+                $.extend(params,that.config[id].sourceDataMapList);
+            }
+            var paramVOS=that.config[id].paramVOS||{
+                uploadFileUrl:'vciFileUploadController/uploadFile',
+                uploadFileBackPath: configData.compatibility ? path : configData.fileServicePath,
+                uploadattachment:false
+            }
+            var baseAction = layui['BaseAction'];
+            if ($('#' + filter + ' .layui-upload-drag').length > 0) {
+                baseAction.renderUploadFile('#' + filter + ' .layui-upload-drag',paramVOS)
+            }
+            if(paramVOS.uploadattachment &&paramVOS.uploadattachment == 'true'){
+                //鏄剧ず涓婁紶闄勪欢
+                baseAction.renderUploadAttach(filter,paramVOS)
+            }
+
+            $webUtil.ajax('post', 'uiDataController/dataFormQuery', params,
+                function (result) {
+                    if (result.success && result.obj){
+                        layui.form.setValues( result.obj.data, filter);
+                        //鏂囦欢
+                        if(result.obj.filePathFieldMap){
+                            var filepath=layui.$('#' + filter + ' .uploadDemoView input.uploadFileOid').attr('name');
+                            layui.$('#' + filter + ' .uploadDemoView').removeClass('layui-hide').find('img').attr('src', paramVOS.uploadfilebackpath + 'vciFileDownloadController/downloadByFileOid?fileOid=' + result.obj.filePathFieldMap[filepath].oid + '&' + TOKEN_KEY + '=' + $webUtil.getToken());
+                            layui.$('#' + filter + ' .uploadDemoView input.uploadFileOid').val(result.obj.filePathFieldMap[filepath].filePath);
+                        }
+                        //闄勪欢
+                        if(result.obj.attachmentFileVOs &&result.obj.attachmentFileVOs.length>0) {
+                            var val=[];
+                            layui.each(result.obj.attachmentFileVOs,function (i,attachmentFile){
+                                val.push(attachmentFile.oid);
+                                var tr = $(['<tr id="upload-'+ i +' oid="'+attachmentFile.oid+'">'
+                                    ,'<td>'+ attachmentFile.name+'.'+attachmentFile.fileExtension +'</td>'
+                                    ,'<td>'+ (attachmentFile.fileSize/1024).toFixed(1) +'kb</td>'
+                                    ,'<td>宸蹭笂浼�</td>'
+                                    ,'<td>'
+                                    ,'<button class="layui-btn layui-btn-xs attach-reload layui-hide">閲嶄紶</button>'
+                                    ,'<button class="layui-btn layui-btn-xs layui-btn-danger attach-delete">鍒犻櫎</button>'
+                                    ,'</td>'
+                                    ,'</tr>'].join(''));
+                                $('#'+filter+'_uploadList').append(tr);
+                            })
+                            $('#' + filter + ' [name="releaseFileOids"]').val(val.join(','))
+                        }
+
+                        $('#'+filter).click(function (){
+                            that.clickRowFn(filter,result.obj.data,DefineVO.btmType, that.config[id].filterList['ui_' + uiDefineId])
+                        })
+
+                        that.clickRowFn(filter,result.obj.data,DefineVO.btmType, that.config[id].filterList['ui_' + uiDefineId])
+                    }
+                }, function (xhr, error) {
+                    $webUtil.showErrorMsg("鑾峰彇鏁版嵁鍑虹幇浜嗛敊璇紝鍙兘鏄枃浠舵湇鍔℃病鏈夊惎鍔�");
+                }, that.backPath)
+        }
+
+        this.clickRowFn=function (thisFilter,record,btmType,filterList){
+            var that=this;
+            if(record.oid.indexOf('@vcitreesep@')>-1){
+                record.oid=record.oid.split('@vcitreesep@')[1];
+            }
+            if (thisFilter.indexOf("westAreas") > -1) {
+                for (var i = 0; i < filterList["centerAreas"].table.length; i++) {
+                    var options = layui.table.getConfig(filterList["centerAreas"].table[i])
+                    options.extraParams = {
+                        sourceBtmName: btmType,
+                        sourceOid: record.oid
+                    };
+                    options.sourceDataParams = record;
+                    options.url='uiDataController/dataGridQuery';
+                    layui.table.setConfig(options)
+                    layui.table.reload(filterList["centerAreas"].table[i]);
+                }
+                for (var i = 0; i < filterList["centerAreas"].treeGrid.length; i++) {
+                    var options = layui.treeGrid.getConfig(filterList["centerAreas"].treeGrid[i])
+                    options.extraParams = {
+                        sourceBtmName: btmType,
+                        sourceOid: record.oid
+                    };
+                    options.sourceDataParams = record;
+                    options.url='uiDataController/dataGridQuery';
+                    layui.treeGrid.reload(filterList["centerAreas"].treeGrid[i],options);
+                }
+                for (var i = 0; i < filterList["centerAreas"].tree.length; i++) {
+                    var options = layui.tree.getOptions(filterList["centerAreas"].tree[i])
+                    options.extraParams = {
+                        sourceBtmName: btmType,
+                        sourceOid: record.oid
+                    };
+                    options.sourceDataParams = record;
+                    options.url='uiDataController/getDataForTree';
+                    layui.tree.setOptions(filterList["centerAreas"].tree[i], options);
+                    layui.tree.reload(filterList["centerAreas"].tree[i]);
+                }
+                for (var i = 0; i < filterList["centerAreas"].form.length; i++) {
+                    layui.form.setValues(record, filterList["centerAreas"].form[i]);
+                    //鏂囦欢
+                    if(record.filePathFieldMap){
+                        var filepath=layui.$('#' + filterList["centerAreas"].form[i] + ' .uploadDemoView input.uploadFileOid').attr('name');
+                        layui.$('#' + filterList["centerAreas"].form[i] + ' .uploadDemoView').removeClass('layui-hide').find('img').attr('src', (configData.compatibility ? path : configData.fileServicePath) + 'vciFileDownloadController/downloadByFileOid?fileOid=' + record.filePathFieldMap[filepath].oid + '&' + TOKEN_KEY + '=' + $webUtil.getToken());
+                        layui.$('#' + filterList["centerAreas"].form[i] + ' .uploadDemoView input.uploadFileOid').val(record.filePathFieldMap[filepath].filePath);
+                    }
+                }
+                for (var i = 0; i < filterList["centerAreas"].customView.length; i++) {
+                    filterList["centerAreas"].customView[i].loadForUI(filterList["centerAreas"].customView[i].id,record)
+                }
+
+            } else if (thisFilter.indexOf("centerAreas") > -1) {
+                for (var i = 0; i < filterList["southAreas"].table.length; i++) {
+                    var options = layui.table.getConfig(filterList["southAreas"].table[i])
+                    options.extraParams = {
+                        sourceBtmName: btmType,
+                        sourceOid: record.oid
+                    };
+                    options.sourceDataParams = record;
+                    options.url='uiDataController/dataGridQuery';
+                    layui.table.setConfig(options)
+                    layui.table.reload(filterList["southAreas"].table[i]);
+                }
+                for (var i = 0; i < filterList["southAreas"].treeGrid.length; i++) {
+                    var options = layui.treeGrid.getConfig(filterList["southAreas"].treeGrid[i])
+                    options.extraParams = {
+                        sourceBtmName: btmType,
+                        sourceOid: record.oid
+                    };
+                    options.sourceDataParams = record;
+                    options.url='uiDataController/dataGridQuery';
+                    layui.treeGrid.reload(filterList["southAreas"].treeGrid[i],options);
+                }
+                for (var i = 0; i < filterList["southAreas"].tree.length; i++) {
+                    var options = layui.tree.getOptions(filterList["southAreas"].tree[i])
+                    options.extraParams = {
+                        sourceBtmName: btmType,
+                        sourceOid: record.oid
+                    };
+                    options.sourceDataParams = record;
+                    options.url='uiDataController/getDataForTree';
+                    layui.tree.setOptions(filterList["southAreas"].tree[i], options);
+                    layui.tree.reload(filterList["southAreas"].tree[i]);
+                }
+                for (var i = 0; i < filterList["southAreas"].form.length; i++) {
+                    layui.form.setValues(record, filterList["southAreas"].form[i]);
+                    //鏂囦欢
+                    if(record.filePathFieldMap){
+                        var filepath=layui.$('#' + filterList["southAreas"].form[i] + ' .uploadDemoView input.uploadFileOid').attr('name');
+                        layui.$('#' + filterList["southAreas"].form[i] + ' .uploadDemoView').removeClass('layui-hide').find('img').attr('src', (configData.compatibility ? path : configData.fileServicePath) + 'vciFileDownloadController/downloadByFileOid?fileOid=' + record.filePathFieldMap[filepath].oid + '&' + TOKEN_KEY + '=' + $webUtil.getToken());
+                        layui.$('#' + filterList["southAreas"].form[i] + ' .uploadDemoView input.uploadFileOid').val(record.filePathFieldMap[filepath].filePath);
+                    }
+                }
+                for (var i = 0; i < filterList["southAreas"].customView.length; i++) {
+                    filterList["southAreas"].customView[i].loadForUI(filterList["southAreas"].customView[i].id,record)
+                }
+            }
+        }
+        this.createSearchHtml = function (queryColumns,componentVOOid,tableFilter,configId) {
+            var queryD={}
+            layui.each(queryColumns,function (i,item){
+                item.edit = item.edit || item.type || "text";
+                if(item.edit == 'text'){
+                    queryD[item.queryField]=item.title
+                }
+            })
+            $webUtil.createSearchHtml(queryD,$("[layui-filter='toolbar_button_" + componentVOOid + "']"),tableFilter);
+        };
+        this.ADVANCEDQUERY = function(action,el){
+            var configId = $(el).attr('data-configId');
+            if(this.config[configId].serinorQueryInstance){
+                this.config[configId].serinorQueryInstance.open();
+                return;
+            }
+            var dynamicCondition = layui.dynamicCondition;
+            $('[layui-filter="toolbar_' + $(el).attr('data-toolbarId') + '"]').append('<div  id="toolbar'+ $(el).attr('data-toolbarId')+'" class="layui-inline"></div>');
+            var dataFields = JSON.parse($(el).attr('data-fields'));
+            this.config[configId].serinorQueryInstance = dynamicCondition.create({
+                fields : dataFields//鏌ヨ瀛楁
+                ,tableId:$(el).attr('data-filter')//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                ,type:"complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                // ,conditionTextId:"#toolbar"+that.id//楂樼骇鏌ヨ 鎸夐挳鎵�鍦ㄧ殑div
+                // ,popupShowQueryBtn: true//鏄剧ず楂樼骇鏌ヨ鎸夐挳
+                ,queryCallBack:function(requestData){//鏌ヨ涔嬪悗鐨刢allback
+                    //console.log(JSON.stringify(requestData))
+                }
+            });
+
+            this.config[configId].serinorQueryInstance.open();
+        };
+
+        this.refresh = function(action,el) {
+            var that = this;
+            var configId = $(el).attr('data-configId');
+            var dataFilters = JSON.parse($(el).attr('data-filters'));
+            dataFilters.tableFilter != '' && layui.table.reload(dataFilters.tableFilter), that.config[configId].checkedData[dataFilters.tableFilter.split('_')[0]] = [];
+
+            if(dataFilters.treeFilter != ''){
+                layui.tree.reload(dataFilters.treeFilter,{
+                    rootParams:{
+                        queryRoot: true
+                    }
+                });
+                that.config[configId].checkedData[dataFilters.treeFilter.split('_')[0]] = [];
+            }
+            dataFilters.treeTableFilter != '' && layui.treeGrid.reload(dataFilters.treeTableFilter), that.config[configId].checkedData[dataFilters.treeTableFilter.split('_')[0]] = [];
+            if (dataFilters.formFilter) {
+                var configId = $(el).attr('data-configId');
+                var DefineVO = JSON.parse($(el).attr('data-DefineVO'));
+                that.loadFormData(dataFilters.formFilter,DefineVO,configId);
+            }
+        };
+
+        this.refreshAll = function() {
+            var that = this;
+            var btns = $('.layui-buttons .layui-btn[layui-filter$="_buttonAction"]');
+            layui.each(btns, function (i, btn) {
+                var button = JSON.parse($(btn).attr('data-button'))
+                if(button.url && button.url.indexOf('RefreshAction')>-1){
+                    that.refresh('buttonAction', btn)
+                }
+            })
+            btns = $('.layui-buttons .layui-btn[layui-filter$="_refresh"]');
+            layui.each(btns, function (i, btn) {
+                that.refresh('refresh', btn)
+            })
+        };
+
+        this.PREVIEW=function (rowData){
+            //鏂囦欢棰勮
+            layui.use('BaseFileDownloadAction', function () {
+                var vciWebFilePreview = layui['BaseFileDownloadAction'];
+                vciWebFilePreview.PREVIEW(rowData.oid,{fileOid:rowData.oid},function (){
+                    $webUtil.showErrorMsg("鏂囦欢棰勮澶辫触锛岃鑱旂郴绠$悊鍛�")
+                })
+            })
+        }
+
+        this.buttonAction=function(action,el) {
+            var that = this;
+            var configId = $(el).attr('data-configId');
+            var button = JSON.parse($(el).attr('data-button'))
+            var paramVOS = button.paramVOS;
+            if(!paramVOS){
+                paramVOS = {};
+            }
+            var componentVOOid = JSON.parse($(el).attr('data-componentVOOid'));
+            var DefineVO = JSON.parse($(el).attr('data-DefineVO')) || {};
+            var currentAreaName = $(el).attr('data-currentArea');
+            var uiDefineId = $(el).attr('data-uiDefineId');
+
+
+            if (!paramVOS['type']) {
+                paramVOS['type'] = DefineVO.btmType;
+            }
+
+            if (!paramVOS['title']) {
+                if (DefineVO.title) {
+                    paramVOS['title'] = button.name + DefineVO.title
+                } else {
+                    paramVOS['title'] = button.name + DefineVO.componentTitle;
+                }
+            }
+            if(!$webUtil.isNull(that.config[configId].linkType)){
+                //鍖哄煙涓洪摼鎺ョ被鍨�
+                paramVOS['linkType']=that.config[configId].linkType;
+            }
+            var dataStore = [];//褰撳墠鎸夐挳鎵�鍦ㄧ殑缁勪欢涓�夋嫨鐨勬暟鎹紝涓斾互鏁扮粍褰㈠紡浼犻��
+            var sourceData = {};
+            var isShow = true;
+
+            if (currentAreaName.indexOf("westAreas") > -1) {
+                for (var i = 0; i < that.config[configId].filterList['ui_' + uiDefineId]["westAreas"].table.length; i++) {
+                    dataStore = layui.table.checkStatus(that.config[configId].filterList['ui_' + uiDefineId]["westAreas"].table[i]).data;
+                }
+                for (var i = 0; i < that.config[configId].filterList['ui_' + uiDefineId]["westAreas"].tree.length; i++) {
+                    if (layui.tree.getSelectNode(that.config[configId].filterList['ui_' + uiDefineId]["westAreas"].tree[i])) {
+                        dataStore.push(layui.tree.getSelectNode(that.config[configId].filterList['ui_' + uiDefineId]["westAreas"].tree[i]).attributes);
+                    }
+                }
+                for (var i = 0; i < that.config[configId].filterList['ui_' + uiDefineId]["westAreas"].treeGrid.length; i++) {
+                    dataStore = layui.treeGrid.checkStatus(that.config[configId].filterList['ui_' + uiDefineId]["westAreas"].treeGrid[i]).data;
+                }
+                sourceData = [that.sourceData];
+            } else if (currentAreaName.indexOf("centerAreas") > -1) {
+                for (var i = 0; i < that.config[configId].filterList['ui_' + uiDefineId]["centerAreas"].table.length; i++) {
+                    dataStore = layui.table.checkStatus(that.config[configId].filterList['ui_' + uiDefineId]["centerAreas"].table[i]).data;
+                }
+                for (var i = 0; i < that.config[configId].filterList['ui_' + uiDefineId]["centerAreas"].tree.length; i++) {
+                    if (layui.tree.getSelectNode(that.config[configId].filterList['ui_' + uiDefineId]["centerAreas"].tree[i])) {
+                        dataStore.push(layui.tree.getSelectNode(that.config[configId].filterList['ui_' + uiDefineId]["centerAreas"].tree[i]).attributes);
+                    }
+                }
+                for (var i = 0; i < that.config[configId].filterList['ui_' + uiDefineId]["centerAreas"].treeGrid.length; i++) {
+                    dataStore = layui.treeGrid.checkStatus(that.config[configId].filterList['ui_' + uiDefineId]["centerAreas"].treeGrid[i]).data;
+                }
+                sourceData = that.config[configId].checkedData['westAreas'];
+            } else if (currentAreaName.indexOf("southAreas") > -1) {
+                for (var i = 0; i < that.config[configId].filterList['ui_' + uiDefineId]["southAreas"].table.length; i++) {
+                    dataStore = layui.table.checkStatus(that.config[configId].filterList['ui_' + uiDefineId]["southAreas"].table[i]).data;
+                }
+                for (var i = 0; i < that.config[configId].filterList['ui_' + uiDefineId]["southAreas"].tree.length; i++) {
+                    if (layui.tree.getSelectNode(that.config[configId].filterList['ui_' + uiDefineId]["southAreas"].tree[i])) {
+                        dataStore.push(layui.tree.getSelectNode(that.config[configId].filterList['ui_' + uiDefineId]["southAreas"].tree[i]).attributes);
+                    }
+                }
+                for (var i = 0; i < that.config[configId].filterList['ui_' + uiDefineId]["southAreas"].treeGrid.length; i++) {
+                    dataStore = layui.treeGrid.checkStatus(that.config[configId].filterList['ui_' + uiDefineId]["southAreas"].treeGrid[i]).data;
+                }
+                sourceData = that.config[configId].checkedData['centerAreas'];
+            }
+            if (paramVOS['initvalue']) {
+                var values = paramVOS['initvalue'].split(';');
+                var initValues = []
+                layui.each(values, function (i, item) {
+                    item=item.replace(':','=');
+                    if (item.indexOf('${') > -1) {
+                        if (item.split('=')[1].indexOf('.') > -1) {
+                            if (sourceData.length<1 || !sourceData[0].oid) {
+                                isShow = false;
+                                $webUtil.showErrorMsg("璇峰厛閫夋嫨涓�鏉℃潵婧愭暟鎹�");
+                                return false;
+                            }
+                            var name = item.split('=')[1].split('.')[1].replace('${', '').replace('}', '');
+                            if (name == 'oid') {
+                                item = item.split('=')[0] + '=' + sourceData[0]['oid']
+                            } else {
+                                item = item.split('=')[0] + '=' + sourceData[0][name]
+                            }
+                        } else {
+                            if (dataStore.length < 1) {
+                                isShow = false;
+                                $webUtil.showErrorMsg("璇峰厛閫夋嫨涓�鏉℃暟鎹�");
+                                return false;
+                            }
+                            var name = item.split('=')[1].replace('${', '').replace('}', '');
+                            item = item.split('=')[0] + '=' + dataStore[0][name];
+
+                        }
+                    }
+                    initValues.push(item)
+                })
+                paramVOS['initvalue'] = initValues.join(';')
+            }
+            paramVOS['title']=$webUtil.replaceFreeMarker(paramVOS.title,dataStore,{})
+            var urlobj = $webUtil.getUrlParams(button.url, {
+                jsPath: 'BaseAddAction',
+                methodName:'doAction'
+            });
+            $.extend(paramVOS, urlobj.params);
+            if (isShow) {
+                layui.use(urlobj.jsPath, function () {
+                    var BaseAction = layui[urlobj.jsPath];
+                    var viewid = 'actionView_' + componentVOOid;
+                    var callback = function () {
+                        /*var refreshBtn = $('.layui-btn[layui-filter="toolbar_' + componentVOOid + '_refresh"]');
+                        refreshBtn.trigger('click')*/
+                        that.refresh(action,el)
+                    }
+                    BaseAction[urlobj.methodName]({
+                        paramVOS: paramVOS,
+                        id: viewid,
+                        dataStore: dataStore,
+                        sourceData: sourceData[0],
+                        navData:that.navData || that.sourceData,//瀵艰埅鍖哄煙閫変腑鐨勮彍鍗�
+                        callback: callback
+                    });
+                })
+            }
+        }
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/er/css/app.5c53683c.css b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/er/css/app.5c53683c.css
new file mode 100644
index 0000000..8da5c75
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/er/css/app.5c53683c.css
@@ -0,0 +1 @@
+#sample[data-v-c8bff4de]{position:relative;margin:10px 0}#mySearch[data-v-c8bff4de]{width:60%;margin-right:20px}.input_button[data-v-c8bff4de]{margin:10px 0;display: none}#entityRelation[data-v-c8bff4de]{width:100%;height:calc(100vh - 30px);border:1px solid #ccc}.returnShang[data-v-c8bff4de],.returnShang[data-v-c8bff4de]:hover{color:#fff;text-underline:none}#app{font-family:Avenir,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:#2c3e50}
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/er/erContent.html b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/er/erContent.html
new file mode 100644
index 0000000..4de7a98
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/er/erContent.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html><html lang=""><head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width,initial-scale=1">
+    <link rel="icon" href="/favicon.ico"><title>ER鍥�</title>
+    <link href="css/app.5c53683c.css" rel="preload" as="style">
+    <link href="js/app.24d70361.js" rel="preload" as="script">
+    <link href="js/chunk-vendors.80f2064b.js" rel="preload" as="script">
+    <link href="css/app.5c53683c.css" rel="stylesheet">
+</head>
+<body>
+<noscript>浣犵殑娴忚鍣ㄦ病鏈夊惎鐢╦avascript锛屾棤娉曚娇鐢ㄦ湰绯荤粺</noscript>
+<script>
+    window.erData= top.erData;
+</script>
+<div id="erContent"></div>
+<script src="js/chunk-vendors.80f2064b.js"></script>
+<script src="js/app.24d70361.js"></script></body>
+</html>
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/er/erContent.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/er/erContent.js
new file mode 100644
index 0000000..333db3c
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/er/erContent.js
@@ -0,0 +1,50 @@
+/**
+ *
+ * ER鍥�
+ * @author wangting
+ */
+layui.define(['layer','element'],function(exports){
+    var Class = function(){
+        this.MODULENAME = "platform/objectService/er/erContent";
+        this.moduleKey = "erContent";
+        this.id='erContent';
+        this.sourceData={};
+        this.columns = [];
+        this.backPath = configData.compatibility?path:configData.objectServicePath;
+        this.getContent=function(oid){
+            var that = this;
+            var html = "";
+            html = [
+                '<div class="layui-layout-border" id="view_',oid,'">',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.init=function(oid,options){//鍩虹鐨刪tml琚坊鍔犲悗锛屽啀鎵ц鍒濆鍖�
+            var that = this;
+            $webUtil.copyConfig(that,that.moduleKey);
+            $webUtil.ajax('get', options.url, {id: options.id}, function (res) {
+                if (res.success) {
+                    that.tabViewList = res.obj.tabViewList;
+                    that.tabRelViewList = res.obj.tabRelViewList;
+                    top.erData = {
+                        tabViewList: that.tabViewList,
+                        tabRelViewList: that.tabRelViewList
+                    };
+                    $('#view_' + oid  ).html('');
+                    $('#view_' + oid  ).append('<iframe src="jslib/layui-2.2.5-debug/lay/platform/objectService/er/erContent.html" width="'+($(document).width()-60)+'" height="'+($(document).height()-105)+'" frameborder="0"></iframe>');
+                } else {
+                    $webUtil.showErrorMsg(res.msg);
+                }
+            }, function (xhr, error) {
+                $webUtil.showErrorMsg("璇锋眰鍑虹幇浜嗛敊璇紝鍙兘鏄湇鍔℃病鏈夊惎鍔�");
+            }, that.backPath);
+
+        };
+        this.refresh = function () {
+
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODULENAME, cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/er/js/app.24d70361.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/er/js/app.24d70361.js
new file mode 100644
index 0000000..c97adda
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/er/js/app.24d70361.js
@@ -0,0 +1,218 @@
+(function (e) {
+    function t(t) {
+        for (var i, o, l = t[0], s = t[1], c = t[2], d = 0, f = []; d < l.length; d++) o = l[d], Object.prototype.hasOwnProperty.call(r, o) && r[o] && f.push(r[o][0]), r[o] = 0;
+        for (i in s) Object.prototype.hasOwnProperty.call(s, i) && (e[i] = s[i]);
+        u && u(t);
+        while (f.length) f.shift()();
+        return a.push.apply(a, c || []), n()
+    }
+
+    function n() {
+        for (var e, t = 0; t < a.length; t++) {
+            for (var n = a[t], i = !0, l = 1; l < n.length; l++) {
+                var s = n[l];
+                0 !== r[s] && (i = !1)
+            }
+            i && (a.splice(t--, 1), e = o(o.s = n[0]))
+        }
+        return e
+    }
+
+    var i = {}, r = {app: 0}, a = [];
+
+    function o(t) {
+        if (i[t]) return i[t].exports;
+        var n = i[t] = {i: t, l: !1, exports: {}};
+        return e[t].call(n.exports, n, n.exports, o), n.l = !0, n.exports
+    }
+
+    o.m = e, o.c = i, o.d = function (e, t, n) {
+        o.o(e, t) || Object.defineProperty(e, t, {enumerable: !0, get: n})
+    }, o.r = function (e) {
+        "undefined" !== typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, {value: "Module"}), Object.defineProperty(e, "__esModule", {value: !0})
+    }, o.t = function (e, t) {
+        if (1 & t && (e = o(e)), 8 & t) return e;
+        if (4 & t && "object" === typeof e && e && e.__esModule) return e;
+        var n = Object.create(null);
+        if (o.r(n), Object.defineProperty(n, "default", {
+            enumerable: !0,
+            value: e
+        }), 2 & t && "string" != typeof e) for (var i in e) o.d(n, i, function (t) {
+            return e[t]
+        }.bind(null, i));
+        return n
+    }, o.n = function (e) {
+        var t = e && e.__esModule ? function () {
+            return e["default"]
+        } : function () {
+            return e
+        };
+        return o.d(t, "a", t), t
+    }, o.o = function (e, t) {
+        return Object.prototype.hasOwnProperty.call(e, t)
+    }, o.p = "/";
+    var l = window["webpackJsonp"] = window["webpackJsonp"] || [], s = l.push.bind(l);
+    l.push = t, l = l.slice();
+    for (var c = 0; c < l.length; c++) t(l[c]);
+    var u = s;
+    a.push([0, "chunk-vendors"]), n()
+})({
+    0: function (e, t, n) {
+        e.exports = n("56d7")
+    }, "29cf": function (e, t, n) {
+    }, "3c3b": function (e, t, n) {
+        "use strict";
+        n("7ac4")
+    }, "56d7": function (e, t, n) {
+        "use strict";
+        n.r(t);
+        n("e260"), n("e6cf"), n("cca6"), n("a79d");
+        var i = n("2b0e"), r = function () {
+                var e = this, t = e.$createElement, n = e._self._c || t;
+                return n("div", {attrs: {id: "erContent"}}, [n("tablePreview")], 1)
+            }, a = [], o = function () {
+                var e = this, t = e.$createElement, n = e._self._c || t;
+                return n("div", {attrs: {id: "tablePreview"}}, [n("div", {staticClass: "input_button"}, [n("Input", {
+                    attrs: {
+                        placeholder: "璇疯緭鍏ヨ鏌ヨ鐨勮〃鍚�",
+                        id: "mySearch"
+                    }, nativeOn: {
+                        keyup: function (t) {
+                            return !t.type.indexOf("key") && e._k(t.keyCode, "enter", 13, t.key, "Enter") ? null : e.searchDiagram()
+                        }
+                    }, model: {
+                        value: e.searchText, callback: function (t) {
+                            e.searchText = t
+                        }, expression: "searchText"
+                    }
+                }), n("Button", {
+                    attrs: {type: "primary"}, on: {
+                        click: function (t) {
+                            return e.searchDiagram()
+                        }
+                    }
+                }, [e._v("Search")])], 1), e._m(0)])
+            }, l = [function () {
+                var e = this, t = e.$createElement, n = e._self._c || t;
+                return n("div", {attrs: {id: "sample"}}, [n("div", {attrs: {id: "entityRelation"}})])
+            }], s = (n("4d63"), n("c607"), n("ac1f"), n("2c3e"), n("25f0"), {
+                name: "tablePreview", data: function () {
+                    return {myDiagram: "", searchText: "", tabViewList: "", tabRelView: ""}
+                }, mounted: function () {
+                    var e = this;
+                    e.tabViewList = window.erData.tabViewList, e.tabRelView = window.erData.tabRelViewList, e.init()
+                }, methods: {
+                    init: function () {
+                        var e = this.go, t = e.GraphObject.make;
+                        this.myDiagram = t(e.Diagram, "entityRelation", {
+                            initialContentAlignment: e.Spot.Center,
+                            allowDelete: !1,
+                            allowCopy: !1,
+                            layout: t(e.ForceDirectedLayout),
+                            "undoManager.isEnabled": !0
+                        });
+                        t(e.Brush, "Linear", {
+                            0: "rgb(150, 150, 250)",
+                            .5: "rgb(86, 86, 186)",
+                            1: "rgb(86, 86, 186)"
+                        }), t(e.Brush, "Linear", {
+                            0: "rgb(158, 209, 159)",
+                            1: "rgb(67, 101, 56)"
+                        }), t(e.Brush, "Linear", {
+                            0: "rgb(206, 106, 100)",
+                            1: "rgb(180, 56, 50)"
+                        }), t(e.Brush, "Linear", {0: "rgb(254, 221, 50)", 1: "rgb(254, 182, 50)"});
+                        var n = t(e.Brush, "Linear", {1: "#E6E6FA", 0: "#FFFAF0"}),
+                            i = t(e.Panel, "Horizontal", t(e.Shape, {desiredSize: new e.Size(10, 10)}, new e.Binding("figure", "figure"), new e.Binding("fill", "color")), t(e.TextBlock, {
+                                stroke: "#333333",
+                                row: 0,
+                                alignment: e.Spot.Center,
+                                margin: new e.Margin(0, 14, 0, 2),
+                                font: "bold 14px sans-serif"
+                            }, new e.Binding("text", "name")));
+                        this.myDiagram.nodeTemplate = t(e.Node, "Auto", {
+                            selectionAdorned: !0,
+                            resizable: !0,
+                            layoutConditions: e.Part.LayoutStandard & ~e.Part.LayoutNodeSized,
+                            fromSpot: e.Spot.AllSides,
+                            toSpot: e.Spot.AllSides,
+                            isShadowed: !0,
+                            shadowColor: "#CCAA"
+                        }, new e.Binding("location", "location").makeTwoWay(), new e.Binding("desiredSize", "visible", (function () {
+                            return new e.Size(NaN, NaN)
+                        })).ofObject("LIST"), t(e.Shape, "Rectangle", {
+                            fill: n,
+                            stroke: "#756875",
+                            strokeWidth: 1
+                        }, new e.Binding("fill", "isHighlighted", (function (e) {
+                            return e ? "#F44336" : "#A7E7FC"
+                        })).ofObject()), t(e.Panel, "Table", {
+                            margin: 15,
+                            stretch: e.GraphObject.Fill
+                        }, t(e.RowColumnDefinition, {row: 0, sizing: e.RowColumnDefinition.None}), t(e.TextBlock, {
+                            row: 0,
+                            alignment: e.Spot.Center,
+                            margin: new e.Margin(0, 14, 0, 2),
+                            font: "bold 16px sans-serif"
+                        }, new e.Binding("text", "key"),new e.Binding("stroke", "color")), t(e.Panel, "Vertical", {
+                            name: "LIST",
+                            row: 1,
+                            padding: 0,
+                            alignment: e.Spot.TopLeft,
+                            defaultAlignment: e.Spot.Left,
+                            stretch: e.GraphObject.Horizontal,
+                            itemTemplate: i
+                        }, new e.Binding("itemArray", "items")))), this.myDiagram.linkTemplate = t(e.Link, {
+                            selectionAdorned: !0,
+                            layerName: "Background",
+                            reshapable: !0,
+                            routing: e.Link.AvoidsNodes,
+                            corner: 5,
+                            curve: e.Link.JumpOver,
+                            toEndSegmentLength: 100
+                        },  t(e.Shape, { strokeWidth: 2, stroke: "#39b1e4" }),
+                            t(e.Shape, {fill:"#1c446f",stroke:null,toArrow: "Standard",scale:1}),
+                             t(e.TextBlock, {
+                            textAlign: "center",
+                            font: "bold 14px sans-serif",
+                            stroke: "#1967B3",
+                            segmentIndex: 0,
+                            segmentOffset: new e.Point(NaN, NaN),
+                            segmentOrientation: e.Link.OrientUpright
+                        }, new e.Binding("text", "text")), t(e.TextBlock, {
+                            textAlign: "center",
+                            font: "bold 14px sans-serif",
+                            stroke: "#1967B3",
+                            segmentIndex: -1,
+                            segmentOffset: new e.Point(NaN, NaN),
+                            segmentOrientation: e.Link.OrientUpright
+                        }, new e.Binding("text", "toText")));
+                        var r = this.tabViewList, a = this.tabRelView;
+                        this.myDiagram.model = new e.GraphLinksModel(r, a)
+                    }, searchDiagram: function () {
+                        var e = document.getElementById("mySearch");
+                        if (e) {
+                            if (e.focus(), this.myDiagram.startTransaction("highlight search"), this.searchText) {
+                                var t = new RegExp(this.searchText, "i"),
+                                    n = this.myDiagram.findNodesByExample({key: t}, {name: t});
+                                this.myDiagram.highlightCollection(n), n.count > 0 && this.myDiagram.centerRect(n.first().actualBounds)
+                            } else this.myDiagram.clearHighlighteds();
+                            this.myDiagram.commitTransaction("highlight search")
+                        }
+                    }
+                }
+            }), c = s, u = (n("3c3b"), n("2877")), d = Object(u["a"])(c, o, l, !1, null, "c8bff4de", null), f = d.exports,
+            g = {name: "erContent", components: {tablePreview: f}}, h = g,
+            p = (n("eac8"), Object(u["a"])(h, r, a, !1, null, null, null)), m = p.exports, b = n("6f70"), w = n.n(b);
+        i["a"].config.productionTip = !1, i["a"].prototype.go = w.a, new i["a"]({
+            render: function (e) {
+                return e(m)
+            }
+        }).$mount("#erContent")
+    }, "7ac4": function (e, t, n) {
+    }, eac8: function (e, t, n) {
+        "use strict";
+        n("29cf")
+    }
+});
+//# sourceMappingURL=app.24d70361.js.map
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/er/js/app.24d70361.js.map b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/er/js/app.24d70361.js.map
new file mode 100644
index 0000000..fd71e5d
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/er/js/app.24d70361.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/components/tablePreview.vue?661d","webpack:///./src/erContent.vue?1950","webpack:///./src/components/tablePreview.vue?9de6","webpack:///src/components/tablePreview.vue","webpack:///./src/components/tablePreview.vue?600b","webpack:///./src/components/tablePreview.vue","webpack:///src/erContent.vue","webpack:///./src/erContent.vue?aeed","webpack:///./src/erContent.vue","webpack:///./src/main.js","webpack:///./src/erContent.vue?ae3d"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","exports","module","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","window","oldJsonpFunction","slice","_vm","this","_h","$createElement","_c","_self","attrs","staticRenderFns","staticClass","nativeOn","$event","type","indexOf","_k","keyCode","searchDiagram","model","callback","$$v","searchText","expression","on","_v","_m","myDiagram","tabViewList","tabRelView","mounted","_this","erData","tabRelViewList","init","methods","go","a","GraphObject","make","Brush","lightgrad","itemTempl","nodeTemplate","linkTemplate","nodeDataArray","linkDataArray","GraphLinksModel","input","document","getElementById","focus","startTransaction","regex","RegExp","results","findNodesByExample","highlightCollection","count","centerRect","first","actualBounds","clearHighlighteds","commitTransaction","component","components","tablePreview","Vue","config","productionTip","gojs","render","h","erContent","$mount"],"mappings":"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","file":"js/app.24d70361.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t\"app\": 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([0,\"chunk-vendors\"]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./tablePreview.vue?vue&type=style&index=0&id=c8bff4de&scoped=true&lang=css&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"erContent\"}},[_c('tablePreview')],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"tablePreview\"}},[_c('div',{staticClass:\"input_button\"},[_c('Input',{attrs:{\"placeholder\":\"璇疯緭鍏ヨ鏌ヨ鐨勮〃鍚峔",\"id\":\"mySearch\"},nativeOn:{\"keyup\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }return _vm.searchDiagram()}},model:{value:(_vm.searchText),callback:function ($$v) {_vm.searchText=$$v},expression:\"searchText\"}}),_c('Button',{attrs:{\"type\":\"primary\"},on:{\"click\":function($event){return _vm.searchDiagram()}}},[_vm._v(\"Search\")])],1),_vm._m(0)])}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"sample\"}},[_c('div',{attrs:{\"id\":\"entityRelation\"}})])}]\n\nexport { render, staticRenderFns }","<template>\r\n  <div id=\"tablePreview\">\r\n    <div class=\"input_button\">\r\n      <Input placeholder=\"璇疯緭鍏ヨ鏌ヨ鐨勮〃鍚峔" id=\"mySearch\" v-model=\"searchText\" @keyup.enter.native=\"searchDiagram()\"></Input>\r\n      <Button type=\"primary\" @click=\"searchDiagram()\" >Search</Button>\r\n\r\n    </div>\r\n    <div id=\"sample\">\r\n      <div id=\"entityRelation\"></div>\r\n    </div>\r\n  </div>\r\n</template>\r\n<script >\r\nexport default{\r\n  name: 'tablePreview',\r\n  data() {\r\n    return {\r\n      myDiagram: '',\r\n      searchText: '',\r\n      tabViewList: '',\r\n      tabRelView: ''\r\n    }\r\n  },\r\n  mounted() {\r\n    let _this = this\r\n    _this.tabViewList = window.erData.tabViewList\r\n    _this.tabRelView = window.erData.tabRelViewList\r\n    _this.init()\r\n  },\r\n  methods: {\r\n    init() {\r\n      var go = this.go;\r\n      debugger;\r\n      //if (window.goSamples) goSamples(); // init for these samples -- you don't need to call this\r\n      var a = go.GraphObject.make; // 瀹氫箟妯℃澘\r\n\r\n      this.myDiagram =\r\n          a(go.Diagram, 'entityRelation', // 蹇呴』鍛藉悕鎴栧紩鐢╠iv html鍏冪礌\r\n              {\r\n                initialContentAlignment: go.Spot.Center,\r\n                allowDelete: false,\r\n                allowCopy: false,\r\n                layout: a(go.ForceDirectedLayout),\r\n                \"undoManager.isEnabled\": true\r\n              });\r\n\r\n      // define several shared Brushes\r\n      var bluegrad = a(go.Brush, \"Linear\", { 0: \"rgb(150, 150, 250)\", 0.5: \"rgb(86, 86, 186)\", 1: \"rgb(86, 86, 186)\" });\r\n      var greengrad = a(go.Brush, \"Linear\", { 0: \"rgb(158, 209, 159)\", 1: \"rgb(67, 101, 56)\" });\r\n      var redgrad = a(go.Brush, \"Linear\", { 0: \"rgb(206, 106, 100)\", 1: \"rgb(180, 56, 50)\" });\r\n      var yellowgrad = a(go.Brush, \"Linear\", { 0: \"rgb(254, 221, 50)\", 1: \"rgb(254, 182, 50)\" });\r\n      var lightgrad = a(go.Brush, \"Linear\", { 1: \"#E6E6FA\", 0: \"#FFFAF0\" });\r\n\r\n      // the template for each attribute in a node's array of item data\r\n      var itemTempl =\r\n          a(go.Panel, \"Horizontal\",\r\n              a(go.Shape,\r\n                  { desiredSize: new go.Size(10, 10) },\r\n                  new go.Binding(\"figure\", \"figure\"),\r\n                  new go.Binding(\"fill\", \"color\")),\r\n              a(go.TextBlock,//items鏍峰紡\r\n                  { stroke: \"#333333\",\r\n                    row: 0, alignment: go.Spot.Center,\r\n                    margin: new go.Margin(0, 14, 0, 2),\r\n                    font: \"bold 14px sans-serif\" },\r\n                  new go.Binding(\"text\", \"name\"))\r\n          );\r\n\r\n      // define the Node template, representing an entity\r\n      this.myDiagram.nodeTemplate =\r\n          a(go.Node, \"Auto\", // the whole node panel\r\n              { selectionAdorned: true,\r\n                resizable: true,\r\n                layoutConditions: go.Part.LayoutStandard & ~go.Part.LayoutNodeSized,\r\n                fromSpot: go.Spot.AllSides,\r\n                toSpot: go.Spot.AllSides,\r\n                isShadowed: true,\r\n                shadowColor: \"#CCAA\" },\r\n              new go.Binding(\"location\", \"location\").makeTwoWay(),\r\n              // whenever the PanelExpanderButton changes the visible property of the \"LIST\" panel,\r\n              // clear out any desiredSize set by the ResizingTool.\r\n              new go.Binding(\"desiredSize\", \"visible\", function() { return new go.Size(NaN, NaN); }).ofObject(\"LIST\"),\r\n              // define the node's outer shape, which will surround the Table\r\n              a(go.Shape, \"Rectangle\",\r\n                  { fill: lightgrad, stroke: \"#756875\", strokeWidth: 1 },\r\n                  new go.Binding(\"fill\", \"isHighlighted\", function(h) { return h ? \"#F44336\" : \"#A7E7FC\"; }).ofObject()),\r\n              a(go.Panel, \"Table\",\r\n                  { margin: 15, stretch: go.GraphObject.Fill },\r\n                  a(go.RowColumnDefinition, { row: 0, sizing: go.RowColumnDefinition.None }),\r\n                  // the table header\r\n                  a(go.TextBlock,\r\n                      {\r\n                        row: 0, alignment: go.Spot.Center,\r\n                        margin: new go.Margin(0, 14, 0, 2), // leave room for Button\r\n                        font: \"bold 16px sans-serif\"\r\n                      },\r\n                      new go.Binding(\"text\", \"key\")),\r\n                  // 鎶樺彔/灞曞紑鎸夐挳\r\n                  /*a(\"PanelExpanderButton\", \"LIST\", // the name of the element whose visibility this button toggles\r\n                   { row: 0, alignment: go.Spot.TopRight }),*/\r\n                  // the list of Panels, each showing an attribute\r\n                  a(go.Panel, \"Vertical\",\r\n                      {\r\n                        name: \"LIST\",\r\n                        row: 1,\r\n                        padding: 0,//琛ㄥ悕鍒颁笅杈规鐨勮窛绂籠r\n                        alignment: go.Spot.TopLeft,\r\n                        defaultAlignment: go.Spot.Left,\r\n                        stretch: go.GraphObject.Horizontal,\r\n                        itemTemplate: itemTempl\r\n                      },\r\n                      new go.Binding(\"itemArray\", \"items\"))\r\n              ) // end Table Panel\r\n          ); // end Node\r\n\r\n      // define the Link template, representing a relationship\r\n      this.myDiagram.linkTemplate =\r\n          a(go.Link, // the whole link panel\r\n              {\r\n                selectionAdorned: true,\r\n                layerName: \"Foreground\",\r\n                reshapable: true,\r\n                routing: go.Link.AvoidsNodes,\r\n                corner: 5,\r\n                curve: go.Link.JumpOver,\r\n                toEndSegmentLength: 100\r\n              },\r\n              a(go.Shape, // the link shape\r\n                  { stroke: \"#303B45\", strokeWidth: 2.5 }),\r\n              a(go.TextBlock, // the \"from\" label\r\n                  {\r\n                    textAlign: \"center\",\r\n                    font: \"bold 14px sans-serif\",\r\n                    stroke: \"#1967B3\",\r\n                    segmentIndex: 0,\r\n                    segmentOffset: new go.Point(NaN, NaN),\r\n                    segmentOrientation: go.Link.OrientUpright\r\n                  },\r\n                  new go.Binding(\"text\", \"text\")),\r\n              a(go.TextBlock, // the \"to\" label\r\n                  {\r\n                    textAlign: \"center\",\r\n                    font: \"bold 14px sans-serif\",\r\n                    stroke: \"#1967B3\",\r\n                    segmentIndex: -1,\r\n                    segmentOffset: new go.Point(NaN, NaN),\r\n                    segmentOrientation: go.Link.OrientUpright\r\n                  },\r\n                  new go.Binding(\"text\", \"toText\"))\r\n          );\r\n\r\n      // create the model for the E-R diagram\r\n      var nodeDataArray = this.tabViewList;\r\n      var linkDataArray = this.tabRelView;\r\n      /*var nodeDataArray = [\r\n       { key: '瑙掕壊鏉冮檺琛�',\r\n        items: [ { name: \"瑙掕壊鏍囪瘑:BIGINT\", iskey: true, figure: \"Decision\", color: yellowgrad },\r\n         { name: \"妯″潡鏍囪瘑:BIGINT\", iskey: false, figure: \"Cube\", color: bluegrad }] },\r\n       { key: \"瑙掕壊淇℃伅琛╘",\r\n        items: [ { name: \"鏍囪瘑:BIGINT\", iskey: true, figure: \"Decision\", color: yellowgrad },\r\n         { name: \"鍚嶇О:VARCHAR(100)\", iskey: false, figure: \"Cube1\", color: bluegrad },\r\n         { name: \"鎻忚堪:VARCHAR(100)\", iskey: false, figure: \"Cube1\", color: bluegrad },\r\n         { name: \"鎺掑簭:VARCHAR(100)\", iskey: false, figure: \"Cube1\", color: bluegrad } ] },\r\n       { key: \"鐢ㄦ埛鏉冮檺琛╘",\r\n        items: [ { name: \"CategoryID\", iskey: true, figure: \"Decision\", color: yellowgrad },\r\n         { name: \"CategoryName\", iskey: false, figure: \"Cube\", color: bluegrad },\r\n         { name: \"Description\", iskey: false, figure: \"Cube\", color: bluegrad },\r\n         { name: \"Picture\", iskey: false, figure: \"TriangleUp\", color: redgrad } ] },\r\n       { key: \"鐢ㄦ埛淇℃伅琛╘",\r\n        items: [ { name: \"OrderID\", iskey: true, figure: \"Decision\", color: yellowgrad },\r\n         { name: \"ProductID\", iskey: true, figure: \"Decision\", color: yellowgrad },\r\n         { name: \"UnitPrice\", iskey: false, figure: \"MagneticData\", color: greengrad },\r\n         { name: \"Quantity\", iskey: false, figure: \"MagneticData\", color: greengrad },\r\n         { name: \"Discount\", iskey: false, figure: \"MagneticData\", color: greengrad } ] }\r\n      ];\r\n      var linkDataArray = [\r\n       { from: \"瑙掕壊鏉冮檺琛╘", to: \"瑙掕壊淇℃伅琛╘", text: \"N\", toText: \"1\" },\r\n       { from: \"瑙掕壊鏉冮檺琛╘", to: \"鐢ㄦ埛鏉冮檺琛╘", text: \"N\", toText: \"1\" },\r\n       { from: \"鐢ㄦ埛淇℃伅琛╘", to: \"瑙掕壊鏉冮檺琛╘", text: \"N\", toText: \"1\" }\r\n      ];*/\r\n      this.myDiagram.model = new go.GraphLinksModel(nodeDataArray, linkDataArray);\r\n      // Overview\r\n      //var myOverview =  a(go.Overview, \"myOverviewDiv\", { observed: this.myDiagram, contentAlignment: go.Spot.Center });\r\n    },\r\n    searchDiagram() { // called by button\r\n      var input = document.getElementById(\"mySearch\");\r\n      if (!input) return;\r\n      input.focus();\r\n      this.myDiagram.startTransaction(\"highlight search\");\r\n      if (this.searchText) {\r\n        // search four different data properties for the string, any of which may match for success\r\n        // create a case insensitive RegExp from what the user typed\r\n        var regex = new RegExp(this.searchText, \"i\");\r\n        var results = this.myDiagram.findNodesByExample({ key: regex },{name: regex});\r\n        this.myDiagram.highlightCollection(results);\r\n        // try to center the diagram at the first node that was found\r\n        if (results.count > 0) this.myDiagram.centerRect(results.first().actualBounds);\r\n      } else { // empty string only clears highlighteds collection\r\n        this.myDiagram.clearHighlighteds();\r\n      }\r\n\r\n      this.myDiagram.commitTransaction(\"highlight search\");\r\n    }\r\n  }\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n#sample{\r\n  position: relative;\r\n  margin: 20px;\r\n}\r\n#mySearch{\r\n  width: 60%;\r\n  margin-right: 20px;\r\n}\r\n.input_button{\r\n  margin: 20px;\r\n}\r\n#entityRelation{\r\n  width: 100%;\r\n  height: 800px;\r\n  border:1px solid #cccccc;\r\n}\r\n.returnShang{\r\n  color: #fff;\r\n  text-underline: none;\r\n}\r\n.returnShang:hover{\r\n  color: #fff;\r\n  text-underline: none;\r\n}\r\n</style>","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./tablePreview.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./tablePreview.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./tablePreview.vue?vue&type=template&id=c8bff4de&scoped=true&\"\nimport script from \"./tablePreview.vue?vue&type=script&lang=js&\"\nexport * from \"./tablePreview.vue?vue&type=script&lang=js&\"\nimport style0 from \"./tablePreview.vue?vue&type=style&index=0&id=c8bff4de&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"c8bff4de\",\n  null\n  \n)\n\nexport default component.exports","<template>\n  <div id=\"erContent\">\n    <tablePreview />\n  </div>\n</template>\n\n<script>\nimport tablePreview from './components/tablePreview.vue'\n\nexport default {\n  name: 'erContent',\n  components: {\n    tablePreview\n  }\n}\n</script>\n\n<style>\n#app {\n  font-family: Avenir, Helvetica, Arial, sans-serif;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n  color: #2c3e50;\n}\n</style>\n","import mod from \"-!../node_modules/cache-loader/dist/cjs.js??ref--13-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--1-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./erContent.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../node_modules/cache-loader/dist/cjs.js??ref--13-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--1-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./erContent.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./erContent.vue?vue&type=template&id=0c20e328&\"\nimport script from \"./erContent.vue?vue&type=script&lang=js&\"\nexport * from \"./erContent.vue?vue&type=script&lang=js&\"\nimport style0 from \"./erContent.vue?vue&type=style&index=0&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","import Vue from 'vue'\nimport erContent from './erContent.vue'\nimport  gojs from 'gojs'\n\n\nVue.config.productionTip = false\nVue.prototype.go=gojs\n\nnew Vue({\n  render: h => h(erContent),\n}).$mount('#erContent')\n","export * from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../node_modules/cache-loader/dist/cjs.js??ref--1-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./erContent.vue?vue&type=style&index=0&lang=css&\""],"sourceRoot":""}
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/er/js/chunk-vendors.80f2064b.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/er/js/chunk-vendors.80f2064b.js
new file mode 100644
index 0000000..53fe09f
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/er/js/chunk-vendors.80f2064b.js
@@ -0,0 +1,8 @@
+(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-vendors"],{"00ee":function(t,e,i){var n=i("b622"),o=n("toStringTag"),r={};r[o]="z",t.exports="[object z]"===String(r)},"0366":function(t,e,i){var n=i("e330"),o=i("59ed"),r=n(n.bind);t.exports=function(t,e){return o(t),void 0===e?t:r?r(t,e):function(){return t.apply(e,arguments)}}},"06cf":function(t,e,i){var n=i("83ab"),o=i("c65b"),r=i("d1e7"),s=i("5c6c"),a=i("fc6a"),h=i("a04b"),l=i("1a2d"),u=i("0cfb"),c=Object.getOwnPropertyDescriptor;e.f=n?c:function(t,e){if(t=a(t),e=h(e),u)try{return c(t,e)}catch(i){}if(l(t,e))return s(!o(r.f,t,e),t[e])}},"07fa":function(t,e,i){var n=i("50c4");t.exports=function(t){return n(t.length)}},"0cfb":function(t,e,i){var n=i("83ab"),o=i("d039"),r=i("cc12");t.exports=!n&&!o((function(){return 7!=Object.defineProperty(r("div"),"a",{get:function(){return 7}}).a}))},"0d51":function(t,e,i){var n=i("da84"),o=n.String;t.exports=function(t){try{return o(t)}catch(e){return"Object"}}},"107c":function(t,e,i){var n=i("d039"),o=i("da84"),r=o.RegExp;t.exports=n((function(){var t=r("(?<a>b)","g");return"b"!==t.exec("b").groups.a||"bc"!=="b".replace(t,"$<a>c")}))},1626:function(t,e){t.exports=function(t){return"function"==typeof t}},"19aa":function(t,e,i){var n=i("da84"),o=i("3a9b"),r=n.TypeError;t.exports=function(t,e){if(o(e,t))return t;throw r("Incorrect invocation")}},"1a2d":function(t,e,i){var n=i("e330"),o=i("7b0b"),r=n({}.hasOwnProperty);t.exports=Object.hasOwn||function(t,e){return r(o(t),e)}},"1be4":function(t,e,i){var n=i("d066");t.exports=n("document","documentElement")},"1c7e":function(t,e,i){var n=i("b622"),o=n("iterator"),r=!1;try{var s=0,a={next:function(){return{done:!!s++}},return:function(){r=!0}};a[o]=function(){return this},Array.from(a,(function(){throw 2}))}catch(h){}t.exports=function(t,e){if(!e&&!r)return!1;var i=!1;try{var n={};n[o]=function(){return{next:function(){return{done:i=!0}}}},t(n)}catch(h){}return i}},"1cdc":function(t,e,i){var n=i("342f");t.exports=/(?:ipad|iphone|ipod).*applewebkit/i.test(n)},"1d80":function(t,e,i){var n=i("da84"),o=n.TypeError;t.exports=function(t){if(void 0==t)throw o("Can't call method on "+t);return t}},2266:function(t,e,i){var n=i("da84"),o=i("0366"),r=i("c65b"),s=i("825a"),a=i("0d51"),h=i("e95a"),l=i("07fa"),u=i("3a9b"),c=i("9a1f"),f=i("35a1"),d=i("2a62"),p=n.TypeError,g=function(t,e){this.stopped=t,this.result=e},y=g.prototype;t.exports=function(t,e,i){var n,m,v,x,b,w,k,M=i&&i.that,S=!(!i||!i.AS_ENTRIES),P=!(!i||!i.IS_ITERATOR),N=!(!i||!i.INTERRUPTED),C=o(e,M),T=function(t){return n&&d(n,"normal",t),new g(!0,t)},A=function(t){return S?(s(t),N?C(t[0],t[1],T):C(t[0],t[1])):N?C(t,T):C(t)};if(P)n=t;else{if(m=f(t),!m)throw p(a(t)+" is not iterable");if(h(m)){for(v=0,x=l(t);x>v;v++)if(b=A(t[v]),b&&u(y,b))return b;return new g(!1)}n=c(t,m)}w=n.next;while(!(k=r(w,n)).done){try{b=A(k.value)}catch(L){d(n,"throw",L)}if("object"==typeof b&&b&&u(y,b))return b}return new g(!1)}},"23cb":function(t,e,i){var n=i("5926"),o=Math.max,r=Math.min;t.exports=function(t,e){var i=n(t);return i<0?o(i+e,0):r(i,e)}},"23e7":function(t,e,i){var n=i("da84"),o=i("06cf").f,r=i("9112"),s=i("6eeb"),a=i("ce4e"),h=i("e893"),l=i("94ca");t.exports=function(t,e){var i,u,c,f,d,p,g=t.target,y=t.global,m=t.stat;if(u=y?n:m?n[g]||a(g,{}):(n[g]||{}).prototype,u)for(c in e){if(d=e[c],t.noTargetGet?(p=o(u,c),f=p&&p.value):f=u[c],i=l(y?c:g+(m?".":"#")+c,t.forced),!i&&void 0!==f){if(typeof d==typeof f)continue;h(d,f)}(t.sham||f&&f.sham)&&r(d,"sham",!0),s(u,c,d,t)}}},"241c":function(t,e,i){var n=i("ca84"),o=i("7839"),r=o.concat("length","prototype");e.f=Object.getOwnPropertyNames||function(t){return n(t,r)}},"25f0":function(t,e,i){"use strict";var n=i("e330"),o=i("5e77").PROPER,r=i("6eeb"),s=i("825a"),a=i("3a9b"),h=i("577e"),l=i("d039"),u=i("ad6d"),c="toString",f=RegExp.prototype,d=f[c],p=n(u),g=l((function(){return"/a/b"!=d.call({source:"a",flags:"b"})})),y=o&&d.name!=c;(g||y)&&r(RegExp.prototype,c,(function(){var t=s(this),e=h(t.source),i=t.flags,n=h(void 0===i&&a(f,t)&&!("flags"in f)?p(t):i);return"/"+e+"/"+n}),{unsafe:!0})},2626:function(t,e,i){"use strict";var n=i("d066"),o=i("9bf2"),r=i("b622"),s=i("83ab"),a=r("species");t.exports=function(t){var e=n(t),i=o.f;s&&e&&!e[a]&&i(e,a,{configurable:!0,get:function(){return this}})}},2877:function(t,e,i){"use strict";function n(t,e,i,n,o,r,s,a){var h,l="function"===typeof t?t.options:t;if(e&&(l.render=e,l.staticRenderFns=i,l._compiled=!0),n&&(l.functional=!0),r&&(l._scopeId="data-v-"+r),s?(h=function(t){t=t||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext,t||"undefined"===typeof __VUE_SSR_CONTEXT__||(t=__VUE_SSR_CONTEXT__),o&&o.call(this,t),t&&t._registeredComponents&&t._registeredComponents.add(s)},l._ssrRegister=h):o&&(h=a?function(){o.call(this,(l.functional?this.parent:this).$root.$options.shadowRoot)}:o),h)if(l.functional){l._injectStyles=h;var u=l.render;l.render=function(t,e){return h.call(e),u(t,e)}}else{var c=l.beforeCreate;l.beforeCreate=c?[].concat(c,h):[h]}return{exports:t,options:l}}i.d(e,"a",(function(){return n}))},"2a62":function(t,e,i){var n=i("c65b"),o=i("825a"),r=i("dc4a");t.exports=function(t,e,i){var s,a;o(t);try{if(s=r(t,"return"),!s){if("throw"===e)throw i;return i}s=n(s,t)}catch(h){a=!0,s=h}if("throw"===e)throw i;if(a)throw s;return o(s),i}},"2b0e":function(t,e,i){"use strict";(function(t){
+/*!
+ * Vue.js v2.6.14
+ * (c) 2014-2021 Evan You
+ * Released under the MIT License.
+ */
+var i=Object.freeze({});function n(t){return void 0===t||null===t}function o(t){return void 0!==t&&null!==t}function r(t){return!0===t}function s(t){return!1===t}function a(t){return"string"===typeof t||"number"===typeof t||"symbol"===typeof t||"boolean"===typeof t}function h(t){return null!==t&&"object"===typeof t}var l=Object.prototype.toString;function u(t){return"[object Object]"===l.call(t)}function c(t){return"[object RegExp]"===l.call(t)}function f(t){var e=parseFloat(String(t));return e>=0&&Math.floor(e)===e&&isFinite(t)}function d(t){return o(t)&&"function"===typeof t.then&&"function"===typeof t.catch}function p(t){return null==t?"":Array.isArray(t)||u(t)&&t.toString===l?JSON.stringify(t,null,2):String(t)}function g(t){var e=parseFloat(t);return isNaN(e)?t:e}function y(t,e){for(var i=Object.create(null),n=t.split(","),o=0;o<n.length;o++)i[n[o]]=!0;return e?function(t){return i[t.toLowerCase()]}:function(t){return i[t]}}y("slot,component",!0);var m=y("key,ref,slot,slot-scope,is");function v(t,e){if(t.length){var i=t.indexOf(e);if(i>-1)return t.splice(i,1)}}var x=Object.prototype.hasOwnProperty;function b(t,e){return x.call(t,e)}function w(t){var e=Object.create(null);return function(i){var n=e[i];return n||(e[i]=t(i))}}var k=/-(\w)/g,M=w((function(t){return t.replace(k,(function(t,e){return e?e.toUpperCase():""}))})),S=w((function(t){return t.charAt(0).toUpperCase()+t.slice(1)})),P=/\B([A-Z])/g,N=w((function(t){return t.replace(P,"-$1").toLowerCase()}));function C(t,e){function i(i){var n=arguments.length;return n?n>1?t.apply(e,arguments):t.call(e,i):t.call(e)}return i._length=t.length,i}function T(t,e){return t.bind(e)}var A=Function.prototype.bind?T:C;function L(t,e){e=e||0;var i=t.length-e,n=new Array(i);while(i--)n[i]=t[i+e];return n}function j(t,e){for(var i in e)t[i]=e[i];return t}function O(t){for(var e={},i=0;i<t.length;i++)t[i]&&j(e,t[i]);return e}function D(t,e,i){}var F=function(t,e,i){return!1},B=function(t){return t};function I(t,e){if(t===e)return!0;var i=h(t),n=h(e);if(!i||!n)return!i&&!n&&String(t)===String(e);try{var o=Array.isArray(t),r=Array.isArray(e);if(o&&r)return t.length===e.length&&t.every((function(t,i){return I(t,e[i])}));if(t instanceof Date&&e instanceof Date)return t.getTime()===e.getTime();if(o||r)return!1;var s=Object.keys(t),a=Object.keys(e);return s.length===a.length&&s.every((function(i){return I(t[i],e[i])}))}catch(l){return!1}}function E(t,e){for(var i=0;i<t.length;i++)if(I(t[i],e))return i;return-1}function R(t){var e=!1;return function(){e||(e=!0,t.apply(this,arguments))}}var z="data-server-rendered",V=["component","directive","filter"],G=["beforeCreate","created","beforeMount","mounted","beforeUpdate","updated","beforeDestroy","destroyed","activated","deactivated","errorCaptured","serverPrefetch"],Y={optionMergeStrategies:Object.create(null),silent:!1,productionTip:!1,devtools:!1,performance:!1,errorHandler:null,warnHandler:null,ignoredElements:[],keyCodes:Object.create(null),isReservedTag:F,isReservedAttr:F,isUnknownElement:F,getTagNamespace:D,parsePlatformTagName:B,mustUseProp:F,async:!0,_lifecycleHooks:G},X=/a-zA-Z\u00B7\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u037D\u037F-\u1FFF\u200C-\u200D\u203F-\u2040\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD/;function q(t){var e=(t+"").charCodeAt(0);return 36===e||95===e}function U(t,e,i,n){Object.defineProperty(t,e,{value:i,enumerable:!!n,writable:!0,configurable:!0})}var K=new RegExp("[^"+X.source+".$_\\d]");function H(t){if(!K.test(t)){var e=t.split(".");return function(t){for(var i=0;i<e.length;i++){if(!t)return;t=t[e[i]]}return t}}}var _,W="__proto__"in{},$="undefined"!==typeof window,J="undefined"!==typeof WXEnvironment&&!!WXEnvironment.platform,Z=J&&WXEnvironment.platform.toLowerCase(),Q=$&&window.navigator.userAgent.toLowerCase(),tt=Q&&/msie|trident/.test(Q),et=Q&&Q.indexOf("msie 9.0")>0,it=Q&&Q.indexOf("edge/")>0,nt=(Q&&Q.indexOf("android"),Q&&/iphone|ipad|ipod|ios/.test(Q)||"ios"===Z),ot=(Q&&/chrome\/\d+/.test(Q),Q&&/phantomjs/.test(Q),Q&&Q.match(/firefox\/(\d+)/)),rt={}.watch,st=!1;if($)try{var at={};Object.defineProperty(at,"passive",{get:function(){st=!0}}),window.addEventListener("test-passive",null,at)}catch(Ss){}var ht=function(){return void 0===_&&(_=!$&&!J&&"undefined"!==typeof t&&(t["process"]&&"server"===t["process"].env.VUE_ENV)),_},lt=$&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function ut(t){return"function"===typeof t&&/native code/.test(t.toString())}var ct,ft="undefined"!==typeof Symbol&&ut(Symbol)&&"undefined"!==typeof Reflect&&ut(Reflect.ownKeys);ct="undefined"!==typeof Set&&ut(Set)?Set:function(){function t(){this.set=Object.create(null)}return t.prototype.has=function(t){return!0===this.set[t]},t.prototype.add=function(t){this.set[t]=!0},t.prototype.clear=function(){this.set=Object.create(null)},t}();var dt=D,pt=0,gt=function(){this.id=pt++,this.subs=[]};gt.prototype.addSub=function(t){this.subs.push(t)},gt.prototype.removeSub=function(t){v(this.subs,t)},gt.prototype.depend=function(){gt.target&&gt.target.addDep(this)},gt.prototype.notify=function(){var t=this.subs.slice();for(var e=0,i=t.length;e<i;e++)t[e].update()},gt.target=null;var yt=[];function mt(t){yt.push(t),gt.target=t}function vt(){yt.pop(),gt.target=yt[yt.length-1]}var xt=function(t,e,i,n,o,r,s,a){this.tag=t,this.data=e,this.children=i,this.text=n,this.elm=o,this.ns=void 0,this.context=r,this.fnContext=void 0,this.fnOptions=void 0,this.fnScopeId=void 0,this.key=e&&e.key,this.componentOptions=s,this.componentInstance=void 0,this.parent=void 0,this.raw=!1,this.isStatic=!1,this.isRootInsert=!0,this.isComment=!1,this.isCloned=!1,this.isOnce=!1,this.asyncFactory=a,this.asyncMeta=void 0,this.isAsyncPlaceholder=!1},bt={child:{configurable:!0}};bt.child.get=function(){return this.componentInstance},Object.defineProperties(xt.prototype,bt);var wt=function(t){void 0===t&&(t="");var e=new xt;return e.text=t,e.isComment=!0,e};function kt(t){return new xt(void 0,void 0,void 0,String(t))}function Mt(t){var e=new xt(t.tag,t.data,t.children&&t.children.slice(),t.text,t.elm,t.context,t.componentOptions,t.asyncFactory);return e.ns=t.ns,e.isStatic=t.isStatic,e.key=t.key,e.isComment=t.isComment,e.fnContext=t.fnContext,e.fnOptions=t.fnOptions,e.fnScopeId=t.fnScopeId,e.asyncMeta=t.asyncMeta,e.isCloned=!0,e}var St=Array.prototype,Pt=Object.create(St),Nt=["push","pop","shift","unshift","splice","sort","reverse"];Nt.forEach((function(t){var e=St[t];U(Pt,t,(function(){var i=[],n=arguments.length;while(n--)i[n]=arguments[n];var o,r=e.apply(this,i),s=this.__ob__;switch(t){case"push":case"unshift":o=i;break;case"splice":o=i.slice(2);break}return o&&s.observeArray(o),s.dep.notify(),r}))}));var Ct=Object.getOwnPropertyNames(Pt),Tt=!0;function At(t){Tt=t}var Lt=function(t){this.value=t,this.dep=new gt,this.vmCount=0,U(t,"__ob__",this),Array.isArray(t)?(W?jt(t,Pt):Ot(t,Pt,Ct),this.observeArray(t)):this.walk(t)};function jt(t,e){t.__proto__=e}function Ot(t,e,i){for(var n=0,o=i.length;n<o;n++){var r=i[n];U(t,r,e[r])}}function Dt(t,e){var i;if(h(t)&&!(t instanceof xt))return b(t,"__ob__")&&t.__ob__ instanceof Lt?i=t.__ob__:Tt&&!ht()&&(Array.isArray(t)||u(t))&&Object.isExtensible(t)&&!t._isVue&&(i=new Lt(t)),e&&i&&i.vmCount++,i}function Ft(t,e,i,n,o){var r=new gt,s=Object.getOwnPropertyDescriptor(t,e);if(!s||!1!==s.configurable){var a=s&&s.get,h=s&&s.set;a&&!h||2!==arguments.length||(i=t[e]);var l=!o&&Dt(i);Object.defineProperty(t,e,{enumerable:!0,configurable:!0,get:function(){var e=a?a.call(t):i;return gt.target&&(r.depend(),l&&(l.dep.depend(),Array.isArray(e)&&Et(e))),e},set:function(e){var n=a?a.call(t):i;e===n||e!==e&&n!==n||a&&!h||(h?h.call(t,e):i=e,l=!o&&Dt(e),r.notify())}})}}function Bt(t,e,i){if(Array.isArray(t)&&f(e))return t.length=Math.max(t.length,e),t.splice(e,1,i),i;if(e in t&&!(e in Object.prototype))return t[e]=i,i;var n=t.__ob__;return t._isVue||n&&n.vmCount?i:n?(Ft(n.value,e,i),n.dep.notify(),i):(t[e]=i,i)}function It(t,e){if(Array.isArray(t)&&f(e))t.splice(e,1);else{var i=t.__ob__;t._isVue||i&&i.vmCount||b(t,e)&&(delete t[e],i&&i.dep.notify())}}function Et(t){for(var e=void 0,i=0,n=t.length;i<n;i++)e=t[i],e&&e.__ob__&&e.__ob__.dep.depend(),Array.isArray(e)&&Et(e)}Lt.prototype.walk=function(t){for(var e=Object.keys(t),i=0;i<e.length;i++)Ft(t,e[i])},Lt.prototype.observeArray=function(t){for(var e=0,i=t.length;e<i;e++)Dt(t[e])};var Rt=Y.optionMergeStrategies;function zt(t,e){if(!e)return t;for(var i,n,o,r=ft?Reflect.ownKeys(e):Object.keys(e),s=0;s<r.length;s++)i=r[s],"__ob__"!==i&&(n=t[i],o=e[i],b(t,i)?n!==o&&u(n)&&u(o)&&zt(n,o):Bt(t,i,o));return t}function Vt(t,e,i){return i?function(){var n="function"===typeof e?e.call(i,i):e,o="function"===typeof t?t.call(i,i):t;return n?zt(n,o):o}:e?t?function(){return zt("function"===typeof e?e.call(this,this):e,"function"===typeof t?t.call(this,this):t)}:e:t}function Gt(t,e){var i=e?t?t.concat(e):Array.isArray(e)?e:[e]:t;return i?Yt(i):i}function Yt(t){for(var e=[],i=0;i<t.length;i++)-1===e.indexOf(t[i])&&e.push(t[i]);return e}function Xt(t,e,i,n){var o=Object.create(t||null);return e?j(o,e):o}Rt.data=function(t,e,i){return i?Vt(t,e,i):e&&"function"!==typeof e?t:Vt(t,e)},G.forEach((function(t){Rt[t]=Gt})),V.forEach((function(t){Rt[t+"s"]=Xt})),Rt.watch=function(t,e,i,n){if(t===rt&&(t=void 0),e===rt&&(e=void 0),!e)return Object.create(t||null);if(!t)return e;var o={};for(var r in j(o,t),e){var s=o[r],a=e[r];s&&!Array.isArray(s)&&(s=[s]),o[r]=s?s.concat(a):Array.isArray(a)?a:[a]}return o},Rt.props=Rt.methods=Rt.inject=Rt.computed=function(t,e,i,n){if(!t)return e;var o=Object.create(null);return j(o,t),e&&j(o,e),o},Rt.provide=Vt;var qt=function(t,e){return void 0===e?t:e};function Ut(t,e){var i=t.props;if(i){var n,o,r,s={};if(Array.isArray(i)){n=i.length;while(n--)o=i[n],"string"===typeof o&&(r=M(o),s[r]={type:null})}else if(u(i))for(var a in i)o=i[a],r=M(a),s[r]=u(o)?o:{type:o};else 0;t.props=s}}function Kt(t,e){var i=t.inject;if(i){var n=t.inject={};if(Array.isArray(i))for(var o=0;o<i.length;o++)n[i[o]]={from:i[o]};else if(u(i))for(var r in i){var s=i[r];n[r]=u(s)?j({from:r},s):{from:s}}else 0}}function Ht(t){var e=t.directives;if(e)for(var i in e){var n=e[i];"function"===typeof n&&(e[i]={bind:n,update:n})}}function _t(t,e,i){if("function"===typeof e&&(e=e.options),Ut(e,i),Kt(e,i),Ht(e),!e._base&&(e.extends&&(t=_t(t,e.extends,i)),e.mixins))for(var n=0,o=e.mixins.length;n<o;n++)t=_t(t,e.mixins[n],i);var r,s={};for(r in t)a(r);for(r in e)b(t,r)||a(r);function a(n){var o=Rt[n]||qt;s[n]=o(t[n],e[n],i,n)}return s}function Wt(t,e,i,n){if("string"===typeof i){var o=t[e];if(b(o,i))return o[i];var r=M(i);if(b(o,r))return o[r];var s=S(r);if(b(o,s))return o[s];var a=o[i]||o[r]||o[s];return a}}function $t(t,e,i,n){var o=e[t],r=!b(i,t),s=i[t],a=ee(Boolean,o.type);if(a>-1)if(r&&!b(o,"default"))s=!1;else if(""===s||s===N(t)){var h=ee(String,o.type);(h<0||a<h)&&(s=!0)}if(void 0===s){s=Jt(n,o,t);var l=Tt;At(!0),Dt(s),At(l)}return s}function Jt(t,e,i){if(b(e,"default")){var n=e.default;return t&&t.$options.propsData&&void 0===t.$options.propsData[i]&&void 0!==t._props[i]?t._props[i]:"function"===typeof n&&"Function"!==Qt(e.type)?n.call(t):n}}var Zt=/^\s*function (\w+)/;function Qt(t){var e=t&&t.toString().match(Zt);return e?e[1]:""}function te(t,e){return Qt(t)===Qt(e)}function ee(t,e){if(!Array.isArray(e))return te(e,t)?0:-1;for(var i=0,n=e.length;i<n;i++)if(te(e[i],t))return i;return-1}function ie(t,e,i){mt();try{if(e){var n=e;while(n=n.$parent){var o=n.$options.errorCaptured;if(o)for(var r=0;r<o.length;r++)try{var s=!1===o[r].call(n,t,e,i);if(s)return}catch(Ss){oe(Ss,n,"errorCaptured hook")}}}oe(t,e,i)}finally{vt()}}function ne(t,e,i,n,o){var r;try{r=i?t.apply(e,i):t.call(e),r&&!r._isVue&&d(r)&&!r._handled&&(r.catch((function(t){return ie(t,n,o+" (Promise/async)")})),r._handled=!0)}catch(Ss){ie(Ss,n,o)}return r}function oe(t,e,i){if(Y.errorHandler)try{return Y.errorHandler.call(null,t,e,i)}catch(Ss){Ss!==t&&re(Ss,null,"config.errorHandler")}re(t,e,i)}function re(t,e,i){if(!$&&!J||"undefined"===typeof console)throw t;console.error(t)}var se,ae=!1,he=[],le=!1;function ue(){le=!1;var t=he.slice(0);he.length=0;for(var e=0;e<t.length;e++)t[e]()}if("undefined"!==typeof Promise&&ut(Promise)){var ce=Promise.resolve();se=function(){ce.then(ue),nt&&setTimeout(D)},ae=!0}else if(tt||"undefined"===typeof MutationObserver||!ut(MutationObserver)&&"[object MutationObserverConstructor]"!==MutationObserver.toString())se="undefined"!==typeof setImmediate&&ut(setImmediate)?function(){setImmediate(ue)}:function(){setTimeout(ue,0)};else{var fe=1,de=new MutationObserver(ue),pe=document.createTextNode(String(fe));de.observe(pe,{characterData:!0}),se=function(){fe=(fe+1)%2,pe.data=String(fe)},ae=!0}function ge(t,e){var i;if(he.push((function(){if(t)try{t.call(e)}catch(Ss){ie(Ss,e,"nextTick")}else i&&i(e)})),le||(le=!0,se()),!t&&"undefined"!==typeof Promise)return new Promise((function(t){i=t}))}var ye=new ct;function me(t){ve(t,ye),ye.clear()}function ve(t,e){var i,n,o=Array.isArray(t);if(!(!o&&!h(t)||Object.isFrozen(t)||t instanceof xt)){if(t.__ob__){var r=t.__ob__.dep.id;if(e.has(r))return;e.add(r)}if(o){i=t.length;while(i--)ve(t[i],e)}else{n=Object.keys(t),i=n.length;while(i--)ve(t[n[i]],e)}}}var xe=w((function(t){var e="&"===t.charAt(0);t=e?t.slice(1):t;var i="~"===t.charAt(0);t=i?t.slice(1):t;var n="!"===t.charAt(0);return t=n?t.slice(1):t,{name:t,once:i,capture:n,passive:e}}));function be(t,e){function i(){var t=arguments,n=i.fns;if(!Array.isArray(n))return ne(n,null,arguments,e,"v-on handler");for(var o=n.slice(),r=0;r<o.length;r++)ne(o[r],null,t,e,"v-on handler")}return i.fns=t,i}function we(t,e,i,o,s,a){var h,l,u,c;for(h in t)l=t[h],u=e[h],c=xe(h),n(l)||(n(u)?(n(l.fns)&&(l=t[h]=be(l,a)),r(c.once)&&(l=t[h]=s(c.name,l,c.capture)),i(c.name,l,c.capture,c.passive,c.params)):l!==u&&(u.fns=l,t[h]=u));for(h in e)n(t[h])&&(c=xe(h),o(c.name,e[h],c.capture))}function ke(t,e,i){var s;t instanceof xt&&(t=t.data.hook||(t.data.hook={}));var a=t[e];function h(){i.apply(this,arguments),v(s.fns,h)}n(a)?s=be([h]):o(a.fns)&&r(a.merged)?(s=a,s.fns.push(h)):s=be([a,h]),s.merged=!0,t[e]=s}function Me(t,e,i){var r=e.options.props;if(!n(r)){var s={},a=t.attrs,h=t.props;if(o(a)||o(h))for(var l in r){var u=N(l);Se(s,h,l,u,!0)||Se(s,a,l,u,!1)}return s}}function Se(t,e,i,n,r){if(o(e)){if(b(e,i))return t[i]=e[i],r||delete e[i],!0;if(b(e,n))return t[i]=e[n],r||delete e[n],!0}return!1}function Pe(t){for(var e=0;e<t.length;e++)if(Array.isArray(t[e]))return Array.prototype.concat.apply([],t);return t}function Ne(t){return a(t)?[kt(t)]:Array.isArray(t)?Te(t):void 0}function Ce(t){return o(t)&&o(t.text)&&s(t.isComment)}function Te(t,e){var i,s,h,l,u=[];for(i=0;i<t.length;i++)s=t[i],n(s)||"boolean"===typeof s||(h=u.length-1,l=u[h],Array.isArray(s)?s.length>0&&(s=Te(s,(e||"")+"_"+i),Ce(s[0])&&Ce(l)&&(u[h]=kt(l.text+s[0].text),s.shift()),u.push.apply(u,s)):a(s)?Ce(l)?u[h]=kt(l.text+s):""!==s&&u.push(kt(s)):Ce(s)&&Ce(l)?u[h]=kt(l.text+s.text):(r(t._isVList)&&o(s.tag)&&n(s.key)&&o(e)&&(s.key="__vlist"+e+"_"+i+"__"),u.push(s)));return u}function Ae(t){var e=t.$options.provide;e&&(t._provided="function"===typeof e?e.call(t):e)}function Le(t){var e=je(t.$options.inject,t);e&&(At(!1),Object.keys(e).forEach((function(i){Ft(t,i,e[i])})),At(!0))}function je(t,e){if(t){for(var i=Object.create(null),n=ft?Reflect.ownKeys(t):Object.keys(t),o=0;o<n.length;o++){var r=n[o];if("__ob__"!==r){var s=t[r].from,a=e;while(a){if(a._provided&&b(a._provided,s)){i[r]=a._provided[s];break}a=a.$parent}if(!a)if("default"in t[r]){var h=t[r].default;i[r]="function"===typeof h?h.call(e):h}else 0}}return i}}function Oe(t,e){if(!t||!t.length)return{};for(var i={},n=0,o=t.length;n<o;n++){var r=t[n],s=r.data;if(s&&s.attrs&&s.attrs.slot&&delete s.attrs.slot,r.context!==e&&r.fnContext!==e||!s||null==s.slot)(i.default||(i.default=[])).push(r);else{var a=s.slot,h=i[a]||(i[a]=[]);"template"===r.tag?h.push.apply(h,r.children||[]):h.push(r)}}for(var l in i)i[l].every(De)&&delete i[l];return i}function De(t){return t.isComment&&!t.asyncFactory||" "===t.text}function Fe(t){return t.isComment&&t.asyncFactory}function Be(t,e,n){var o,r=Object.keys(e).length>0,s=t?!!t.$stable:!r,a=t&&t.$key;if(t){if(t._normalized)return t._normalized;if(s&&n&&n!==i&&a===n.$key&&!r&&!n.$hasNormal)return n;for(var h in o={},t)t[h]&&"$"!==h[0]&&(o[h]=Ie(e,h,t[h]))}else o={};for(var l in e)l in o||(o[l]=Ee(e,l));return t&&Object.isExtensible(t)&&(t._normalized=o),U(o,"$stable",s),U(o,"$key",a),U(o,"$hasNormal",r),o}function Ie(t,e,i){var n=function(){var t=arguments.length?i.apply(null,arguments):i({});t=t&&"object"===typeof t&&!Array.isArray(t)?[t]:Ne(t);var e=t&&t[0];return t&&(!e||1===t.length&&e.isComment&&!Fe(e))?void 0:t};return i.proxy&&Object.defineProperty(t,e,{get:n,enumerable:!0,configurable:!0}),n}function Ee(t,e){return function(){return t[e]}}function Re(t,e){var i,n,r,s,a;if(Array.isArray(t)||"string"===typeof t)for(i=new Array(t.length),n=0,r=t.length;n<r;n++)i[n]=e(t[n],n);else if("number"===typeof t)for(i=new Array(t),n=0;n<t;n++)i[n]=e(n+1,n);else if(h(t))if(ft&&t[Symbol.iterator]){i=[];var l=t[Symbol.iterator](),u=l.next();while(!u.done)i.push(e(u.value,i.length)),u=l.next()}else for(s=Object.keys(t),i=new Array(s.length),n=0,r=s.length;n<r;n++)a=s[n],i[n]=e(t[a],a,n);return o(i)||(i=[]),i._isVList=!0,i}function ze(t,e,i,n){var o,r=this.$scopedSlots[t];r?(i=i||{},n&&(i=j(j({},n),i)),o=r(i)||("function"===typeof e?e():e)):o=this.$slots[t]||("function"===typeof e?e():e);var s=i&&i.slot;return s?this.$createElement("template",{slot:s},o):o}function Ve(t){return Wt(this.$options,"filters",t,!0)||B}function Ge(t,e){return Array.isArray(t)?-1===t.indexOf(e):t!==e}function Ye(t,e,i,n,o){var r=Y.keyCodes[e]||i;return o&&n&&!Y.keyCodes[e]?Ge(o,n):r?Ge(r,t):n?N(n)!==e:void 0===t}function Xe(t,e,i,n,o){if(i)if(h(i)){var r;Array.isArray(i)&&(i=O(i));var s=function(s){if("class"===s||"style"===s||m(s))r=t;else{var a=t.attrs&&t.attrs.type;r=n||Y.mustUseProp(e,a,s)?t.domProps||(t.domProps={}):t.attrs||(t.attrs={})}var h=M(s),l=N(s);if(!(h in r)&&!(l in r)&&(r[s]=i[s],o)){var u=t.on||(t.on={});u["update:"+s]=function(t){i[s]=t}}};for(var a in i)s(a)}else;return t}function qe(t,e){var i=this._staticTrees||(this._staticTrees=[]),n=i[t];return n&&!e||(n=i[t]=this.$options.staticRenderFns[t].call(this._renderProxy,null,this),Ke(n,"__static__"+t,!1)),n}function Ue(t,e,i){return Ke(t,"__once__"+e+(i?"_"+i:""),!0),t}function Ke(t,e,i){if(Array.isArray(t))for(var n=0;n<t.length;n++)t[n]&&"string"!==typeof t[n]&&He(t[n],e+"_"+n,i);else He(t,e,i)}function He(t,e,i){t.isStatic=!0,t.key=e,t.isOnce=i}function _e(t,e){if(e)if(u(e)){var i=t.on=t.on?j({},t.on):{};for(var n in e){var o=i[n],r=e[n];i[n]=o?[].concat(o,r):r}}else;return t}function We(t,e,i,n){e=e||{$stable:!i};for(var o=0;o<t.length;o++){var r=t[o];Array.isArray(r)?We(r,e,i):r&&(r.proxy&&(r.fn.proxy=!0),e[r.key]=r.fn)}return n&&(e.$key=n),e}function $e(t,e){for(var i=0;i<e.length;i+=2){var n=e[i];"string"===typeof n&&n&&(t[e[i]]=e[i+1])}return t}function Je(t,e){return"string"===typeof t?e+t:t}function Ze(t){t._o=Ue,t._n=g,t._s=p,t._l=Re,t._t=ze,t._q=I,t._i=E,t._m=qe,t._f=Ve,t._k=Ye,t._b=Xe,t._v=kt,t._e=wt,t._u=We,t._g=_e,t._d=$e,t._p=Je}function Qe(t,e,n,o,s){var a,h=this,l=s.options;b(o,"_uid")?(a=Object.create(o),a._original=o):(a=o,o=o._original);var u=r(l._compiled),c=!u;this.data=t,this.props=e,this.children=n,this.parent=o,this.listeners=t.on||i,this.injections=je(l.inject,o),this.slots=function(){return h.$slots||Be(t.scopedSlots,h.$slots=Oe(n,o)),h.$slots},Object.defineProperty(this,"scopedSlots",{enumerable:!0,get:function(){return Be(t.scopedSlots,this.slots())}}),u&&(this.$options=l,this.$slots=this.slots(),this.$scopedSlots=Be(t.scopedSlots,this.$slots)),l._scopeId?this._c=function(t,e,i,n){var r=fi(a,t,e,i,n,c);return r&&!Array.isArray(r)&&(r.fnScopeId=l._scopeId,r.fnContext=o),r}:this._c=function(t,e,i,n){return fi(a,t,e,i,n,c)}}function ti(t,e,n,r,s){var a=t.options,h={},l=a.props;if(o(l))for(var u in l)h[u]=$t(u,l,e||i);else o(n.attrs)&&ii(h,n.attrs),o(n.props)&&ii(h,n.props);var c=new Qe(n,h,s,r,t),f=a.render.call(null,c._c,c);if(f instanceof xt)return ei(f,n,c.parent,a,c);if(Array.isArray(f)){for(var d=Ne(f)||[],p=new Array(d.length),g=0;g<d.length;g++)p[g]=ei(d[g],n,c.parent,a,c);return p}}function ei(t,e,i,n,o){var r=Mt(t);return r.fnContext=i,r.fnOptions=n,e.slot&&((r.data||(r.data={})).slot=e.slot),r}function ii(t,e){for(var i in e)t[M(i)]=e[i]}Ze(Qe.prototype);var ni={init:function(t,e){if(t.componentInstance&&!t.componentInstance._isDestroyed&&t.data.keepAlive){var i=t;ni.prepatch(i,i)}else{var n=t.componentInstance=si(t,Li);n.$mount(e?t.elm:void 0,e)}},prepatch:function(t,e){var i=e.componentOptions,n=e.componentInstance=t.componentInstance;Bi(n,i.propsData,i.listeners,e,i.children)},insert:function(t){var e=t.context,i=t.componentInstance;i._isMounted||(i._isMounted=!0,zi(i,"mounted")),t.data.keepAlive&&(e._isMounted?Zi(i):Ei(i,!0))},destroy:function(t){var e=t.componentInstance;e._isDestroyed||(t.data.keepAlive?Ri(e,!0):e.$destroy())}},oi=Object.keys(ni);function ri(t,e,i,s,a){if(!n(t)){var l=i.$options._base;if(h(t)&&(t=l.extend(t)),"function"===typeof t){var u;if(n(t.cid)&&(u=t,t=ki(u,l),void 0===t))return wi(u,e,i,s,a);e=e||{},kn(t),o(e.model)&&li(t.options,e);var c=Me(e,t,a);if(r(t.options.functional))return ti(t,c,e,i,s);var f=e.on;if(e.on=e.nativeOn,r(t.options.abstract)){var d=e.slot;e={},d&&(e.slot=d)}ai(e);var p=t.options.name||a,g=new xt("vue-component-"+t.cid+(p?"-"+p:""),e,void 0,void 0,void 0,i,{Ctor:t,propsData:c,listeners:f,tag:a,children:s},u);return g}}}function si(t,e){var i={_isComponent:!0,_parentVnode:t,parent:e},n=t.data.inlineTemplate;return o(n)&&(i.render=n.render,i.staticRenderFns=n.staticRenderFns),new t.componentOptions.Ctor(i)}function ai(t){for(var e=t.hook||(t.hook={}),i=0;i<oi.length;i++){var n=oi[i],o=e[n],r=ni[n];o===r||o&&o._merged||(e[n]=o?hi(r,o):r)}}function hi(t,e){var i=function(i,n){t(i,n),e(i,n)};return i._merged=!0,i}function li(t,e){var i=t.model&&t.model.prop||"value",n=t.model&&t.model.event||"input";(e.attrs||(e.attrs={}))[i]=e.model.value;var r=e.on||(e.on={}),s=r[n],a=e.model.callback;o(s)?(Array.isArray(s)?-1===s.indexOf(a):s!==a)&&(r[n]=[a].concat(s)):r[n]=a}var ui=1,ci=2;function fi(t,e,i,n,o,s){return(Array.isArray(i)||a(i))&&(o=n,n=i,i=void 0),r(s)&&(o=ci),di(t,e,i,n,o)}function di(t,e,i,n,r){if(o(i)&&o(i.__ob__))return wt();if(o(i)&&o(i.is)&&(e=i.is),!e)return wt();var s,a,h;(Array.isArray(n)&&"function"===typeof n[0]&&(i=i||{},i.scopedSlots={default:n[0]},n.length=0),r===ci?n=Ne(n):r===ui&&(n=Pe(n)),"string"===typeof e)?(a=t.$vnode&&t.$vnode.ns||Y.getTagNamespace(e),s=Y.isReservedTag(e)?new xt(Y.parsePlatformTagName(e),i,n,void 0,void 0,t):i&&i.pre||!o(h=Wt(t.$options,"components",e))?new xt(e,i,n,void 0,void 0,t):ri(h,i,t,n,e)):s=ri(e,i,t,n);return Array.isArray(s)?s:o(s)?(o(a)&&pi(s,a),o(i)&&gi(i),s):wt()}function pi(t,e,i){if(t.ns=e,"foreignObject"===t.tag&&(e=void 0,i=!0),o(t.children))for(var s=0,a=t.children.length;s<a;s++){var h=t.children[s];o(h.tag)&&(n(h.ns)||r(i)&&"svg"!==h.tag)&&pi(h,e,i)}}function gi(t){h(t.style)&&me(t.style),h(t.class)&&me(t.class)}function yi(t){t._vnode=null,t._staticTrees=null;var e=t.$options,n=t.$vnode=e._parentVnode,o=n&&n.context;t.$slots=Oe(e._renderChildren,o),t.$scopedSlots=i,t._c=function(e,i,n,o){return fi(t,e,i,n,o,!1)},t.$createElement=function(e,i,n,o){return fi(t,e,i,n,o,!0)};var r=n&&n.data;Ft(t,"$attrs",r&&r.attrs||i,null,!0),Ft(t,"$listeners",e._parentListeners||i,null,!0)}var mi,vi=null;function xi(t){Ze(t.prototype),t.prototype.$nextTick=function(t){return ge(t,this)},t.prototype._render=function(){var t,e=this,i=e.$options,n=i.render,o=i._parentVnode;o&&(e.$scopedSlots=Be(o.data.scopedSlots,e.$slots,e.$scopedSlots)),e.$vnode=o;try{vi=e,t=n.call(e._renderProxy,e.$createElement)}catch(Ss){ie(Ss,e,"render"),t=e._vnode}finally{vi=null}return Array.isArray(t)&&1===t.length&&(t=t[0]),t instanceof xt||(t=wt()),t.parent=o,t}}function bi(t,e){return(t.__esModule||ft&&"Module"===t[Symbol.toStringTag])&&(t=t.default),h(t)?e.extend(t):t}function wi(t,e,i,n,o){var r=wt();return r.asyncFactory=t,r.asyncMeta={data:e,context:i,children:n,tag:o},r}function ki(t,e){if(r(t.error)&&o(t.errorComp))return t.errorComp;if(o(t.resolved))return t.resolved;var i=vi;if(i&&o(t.owners)&&-1===t.owners.indexOf(i)&&t.owners.push(i),r(t.loading)&&o(t.loadingComp))return t.loadingComp;if(i&&!o(t.owners)){var s=t.owners=[i],a=!0,l=null,u=null;i.$on("hook:destroyed",(function(){return v(s,i)}));var c=function(t){for(var e=0,i=s.length;e<i;e++)s[e].$forceUpdate();t&&(s.length=0,null!==l&&(clearTimeout(l),l=null),null!==u&&(clearTimeout(u),u=null))},f=R((function(i){t.resolved=bi(i,e),a?s.length=0:c(!0)})),p=R((function(e){o(t.errorComp)&&(t.error=!0,c(!0))})),g=t(f,p);return h(g)&&(d(g)?n(t.resolved)&&g.then(f,p):d(g.component)&&(g.component.then(f,p),o(g.error)&&(t.errorComp=bi(g.error,e)),o(g.loading)&&(t.loadingComp=bi(g.loading,e),0===g.delay?t.loading=!0:l=setTimeout((function(){l=null,n(t.resolved)&&n(t.error)&&(t.loading=!0,c(!1))}),g.delay||200)),o(g.timeout)&&(u=setTimeout((function(){u=null,n(t.resolved)&&p(null)}),g.timeout)))),a=!1,t.loading?t.loadingComp:t.resolved}}function Mi(t){if(Array.isArray(t))for(var e=0;e<t.length;e++){var i=t[e];if(o(i)&&(o(i.componentOptions)||Fe(i)))return i}}function Si(t){t._events=Object.create(null),t._hasHookEvent=!1;var e=t.$options._parentListeners;e&&Ti(t,e)}function Pi(t,e){mi.$on(t,e)}function Ni(t,e){mi.$off(t,e)}function Ci(t,e){var i=mi;return function n(){var o=e.apply(null,arguments);null!==o&&i.$off(t,n)}}function Ti(t,e,i){mi=t,we(e,i||{},Pi,Ni,Ci,t),mi=void 0}function Ai(t){var e=/^hook:/;t.prototype.$on=function(t,i){var n=this;if(Array.isArray(t))for(var o=0,r=t.length;o<r;o++)n.$on(t[o],i);else(n._events[t]||(n._events[t]=[])).push(i),e.test(t)&&(n._hasHookEvent=!0);return n},t.prototype.$once=function(t,e){var i=this;function n(){i.$off(t,n),e.apply(i,arguments)}return n.fn=e,i.$on(t,n),i},t.prototype.$off=function(t,e){var i=this;if(!arguments.length)return i._events=Object.create(null),i;if(Array.isArray(t)){for(var n=0,o=t.length;n<o;n++)i.$off(t[n],e);return i}var r,s=i._events[t];if(!s)return i;if(!e)return i._events[t]=null,i;var a=s.length;while(a--)if(r=s[a],r===e||r.fn===e){s.splice(a,1);break}return i},t.prototype.$emit=function(t){var e=this,i=e._events[t];if(i){i=i.length>1?L(i):i;for(var n=L(arguments,1),o='event handler for "'+t+'"',r=0,s=i.length;r<s;r++)ne(i[r],e,n,e,o)}return e}}var Li=null;function ji(t){var e=Li;return Li=t,function(){Li=e}}function Oi(t){var e=t.$options,i=e.parent;if(i&&!e.abstract){while(i.$options.abstract&&i.$parent)i=i.$parent;i.$children.push(t)}t.$parent=i,t.$root=i?i.$root:t,t.$children=[],t.$refs={},t._watcher=null,t._inactive=null,t._directInactive=!1,t._isMounted=!1,t._isDestroyed=!1,t._isBeingDestroyed=!1}function Di(t){t.prototype._update=function(t,e){var i=this,n=i.$el,o=i._vnode,r=ji(i);i._vnode=t,i.$el=o?i.__patch__(o,t):i.__patch__(i.$el,t,e,!1),r(),n&&(n.__vue__=null),i.$el&&(i.$el.__vue__=i),i.$vnode&&i.$parent&&i.$vnode===i.$parent._vnode&&(i.$parent.$el=i.$el)},t.prototype.$forceUpdate=function(){var t=this;t._watcher&&t._watcher.update()},t.prototype.$destroy=function(){var t=this;if(!t._isBeingDestroyed){zi(t,"beforeDestroy"),t._isBeingDestroyed=!0;var e=t.$parent;!e||e._isBeingDestroyed||t.$options.abstract||v(e.$children,t),t._watcher&&t._watcher.teardown();var i=t._watchers.length;while(i--)t._watchers[i].teardown();t._data.__ob__&&t._data.__ob__.vmCount--,t._isDestroyed=!0,t.__patch__(t._vnode,null),zi(t,"destroyed"),t.$off(),t.$el&&(t.$el.__vue__=null),t.$vnode&&(t.$vnode.parent=null)}}}function Fi(t,e,i){var n;return t.$el=e,t.$options.render||(t.$options.render=wt),zi(t,"beforeMount"),n=function(){t._update(t._render(),i)},new nn(t,n,D,{before:function(){t._isMounted&&!t._isDestroyed&&zi(t,"beforeUpdate")}},!0),i=!1,null==t.$vnode&&(t._isMounted=!0,zi(t,"mounted")),t}function Bi(t,e,n,o,r){var s=o.data.scopedSlots,a=t.$scopedSlots,h=!!(s&&!s.$stable||a!==i&&!a.$stable||s&&t.$scopedSlots.$key!==s.$key||!s&&t.$scopedSlots.$key),l=!!(r||t.$options._renderChildren||h);if(t.$options._parentVnode=o,t.$vnode=o,t._vnode&&(t._vnode.parent=o),t.$options._renderChildren=r,t.$attrs=o.data.attrs||i,t.$listeners=n||i,e&&t.$options.props){At(!1);for(var u=t._props,c=t.$options._propKeys||[],f=0;f<c.length;f++){var d=c[f],p=t.$options.props;u[d]=$t(d,p,e,t)}At(!0),t.$options.propsData=e}n=n||i;var g=t.$options._parentListeners;t.$options._parentListeners=n,Ti(t,n,g),l&&(t.$slots=Oe(r,o.context),t.$forceUpdate())}function Ii(t){while(t&&(t=t.$parent))if(t._inactive)return!0;return!1}function Ei(t,e){if(e){if(t._directInactive=!1,Ii(t))return}else if(t._directInactive)return;if(t._inactive||null===t._inactive){t._inactive=!1;for(var i=0;i<t.$children.length;i++)Ei(t.$children[i]);zi(t,"activated")}}function Ri(t,e){if((!e||(t._directInactive=!0,!Ii(t)))&&!t._inactive){t._inactive=!0;for(var i=0;i<t.$children.length;i++)Ri(t.$children[i]);zi(t,"deactivated")}}function zi(t,e){mt();var i=t.$options[e],n=e+" hook";if(i)for(var o=0,r=i.length;o<r;o++)ne(i[o],t,null,t,n);t._hasHookEvent&&t.$emit("hook:"+e),vt()}var Vi=[],Gi=[],Yi={},Xi=!1,qi=!1,Ui=0;function Ki(){Ui=Vi.length=Gi.length=0,Yi={},Xi=qi=!1}var Hi=0,_i=Date.now;if($&&!tt){var Wi=window.performance;Wi&&"function"===typeof Wi.now&&_i()>document.createEvent("Event").timeStamp&&(_i=function(){return Wi.now()})}function $i(){var t,e;for(Hi=_i(),qi=!0,Vi.sort((function(t,e){return t.id-e.id})),Ui=0;Ui<Vi.length;Ui++)t=Vi[Ui],t.before&&t.before(),e=t.id,Yi[e]=null,t.run();var i=Gi.slice(),n=Vi.slice();Ki(),Qi(i),Ji(n),lt&&Y.devtools&&lt.emit("flush")}function Ji(t){var e=t.length;while(e--){var i=t[e],n=i.vm;n._watcher===i&&n._isMounted&&!n._isDestroyed&&zi(n,"updated")}}function Zi(t){t._inactive=!1,Gi.push(t)}function Qi(t){for(var e=0;e<t.length;e++)t[e]._inactive=!0,Ei(t[e],!0)}function tn(t){var e=t.id;if(null==Yi[e]){if(Yi[e]=!0,qi){var i=Vi.length-1;while(i>Ui&&Vi[i].id>t.id)i--;Vi.splice(i+1,0,t)}else Vi.push(t);Xi||(Xi=!0,ge($i))}}var en=0,nn=function(t,e,i,n,o){this.vm=t,o&&(t._watcher=this),t._watchers.push(this),n?(this.deep=!!n.deep,this.user=!!n.user,this.lazy=!!n.lazy,this.sync=!!n.sync,this.before=n.before):this.deep=this.user=this.lazy=this.sync=!1,this.cb=i,this.id=++en,this.active=!0,this.dirty=this.lazy,this.deps=[],this.newDeps=[],this.depIds=new ct,this.newDepIds=new ct,this.expression="","function"===typeof e?this.getter=e:(this.getter=H(e),this.getter||(this.getter=D)),this.value=this.lazy?void 0:this.get()};nn.prototype.get=function(){var t;mt(this);var e=this.vm;try{t=this.getter.call(e,e)}catch(Ss){if(!this.user)throw Ss;ie(Ss,e,'getter for watcher "'+this.expression+'"')}finally{this.deep&&me(t),vt(),this.cleanupDeps()}return t},nn.prototype.addDep=function(t){var e=t.id;this.newDepIds.has(e)||(this.newDepIds.add(e),this.newDeps.push(t),this.depIds.has(e)||t.addSub(this))},nn.prototype.cleanupDeps=function(){var t=this.deps.length;while(t--){var e=this.deps[t];this.newDepIds.has(e.id)||e.removeSub(this)}var i=this.depIds;this.depIds=this.newDepIds,this.newDepIds=i,this.newDepIds.clear(),i=this.deps,this.deps=this.newDeps,this.newDeps=i,this.newDeps.length=0},nn.prototype.update=function(){this.lazy?this.dirty=!0:this.sync?this.run():tn(this)},nn.prototype.run=function(){if(this.active){var t=this.get();if(t!==this.value||h(t)||this.deep){var e=this.value;if(this.value=t,this.user){var i='callback for watcher "'+this.expression+'"';ne(this.cb,this.vm,[t,e],this.vm,i)}else this.cb.call(this.vm,t,e)}}},nn.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},nn.prototype.depend=function(){var t=this.deps.length;while(t--)this.deps[t].depend()},nn.prototype.teardown=function(){if(this.active){this.vm._isBeingDestroyed||v(this.vm._watchers,this);var t=this.deps.length;while(t--)this.deps[t].removeSub(this);this.active=!1}};var on={enumerable:!0,configurable:!0,get:D,set:D};function rn(t,e,i){on.get=function(){return this[e][i]},on.set=function(t){this[e][i]=t},Object.defineProperty(t,i,on)}function sn(t){t._watchers=[];var e=t.$options;e.props&&an(t,e.props),e.methods&&gn(t,e.methods),e.data?hn(t):Dt(t._data={},!0),e.computed&&cn(t,e.computed),e.watch&&e.watch!==rt&&yn(t,e.watch)}function an(t,e){var i=t.$options.propsData||{},n=t._props={},o=t.$options._propKeys=[],r=!t.$parent;r||At(!1);var s=function(r){o.push(r);var s=$t(r,e,i,t);Ft(n,r,s),r in t||rn(t,"_props",r)};for(var a in e)s(a);At(!0)}function hn(t){var e=t.$options.data;e=t._data="function"===typeof e?ln(e,t):e||{},u(e)||(e={});var i=Object.keys(e),n=t.$options.props,o=(t.$options.methods,i.length);while(o--){var r=i[o];0,n&&b(n,r)||q(r)||rn(t,"_data",r)}Dt(e,!0)}function ln(t,e){mt();try{return t.call(e,e)}catch(Ss){return ie(Ss,e,"data()"),{}}finally{vt()}}var un={lazy:!0};function cn(t,e){var i=t._computedWatchers=Object.create(null),n=ht();for(var o in e){var r=e[o],s="function"===typeof r?r:r.get;0,n||(i[o]=new nn(t,s||D,D,un)),o in t||fn(t,o,r)}}function fn(t,e,i){var n=!ht();"function"===typeof i?(on.get=n?dn(e):pn(i),on.set=D):(on.get=i.get?n&&!1!==i.cache?dn(e):pn(i.get):D,on.set=i.set||D),Object.defineProperty(t,e,on)}function dn(t){return function(){var e=this._computedWatchers&&this._computedWatchers[t];if(e)return e.dirty&&e.evaluate(),gt.target&&e.depend(),e.value}}function pn(t){return function(){return t.call(this,this)}}function gn(t,e){t.$options.props;for(var i in e)t[i]="function"!==typeof e[i]?D:A(e[i],t)}function yn(t,e){for(var i in e){var n=e[i];if(Array.isArray(n))for(var o=0;o<n.length;o++)mn(t,i,n[o]);else mn(t,i,n)}}function mn(t,e,i,n){return u(i)&&(n=i,i=i.handler),"string"===typeof i&&(i=t[i]),t.$watch(e,i,n)}function vn(t){var e={get:function(){return this._data}},i={get:function(){return this._props}};Object.defineProperty(t.prototype,"$data",e),Object.defineProperty(t.prototype,"$props",i),t.prototype.$set=Bt,t.prototype.$delete=It,t.prototype.$watch=function(t,e,i){var n=this;if(u(e))return mn(n,t,e,i);i=i||{},i.user=!0;var o=new nn(n,t,e,i);if(i.immediate){var r='callback for immediate watcher "'+o.expression+'"';mt(),ne(e,n,[o.value],n,r),vt()}return function(){o.teardown()}}}var xn=0;function bn(t){t.prototype._init=function(t){var e=this;e._uid=xn++,e._isVue=!0,t&&t._isComponent?wn(e,t):e.$options=_t(kn(e.constructor),t||{},e),e._renderProxy=e,e._self=e,Oi(e),Si(e),yi(e),zi(e,"beforeCreate"),Le(e),sn(e),Ae(e),zi(e,"created"),e.$options.el&&e.$mount(e.$options.el)}}function wn(t,e){var i=t.$options=Object.create(t.constructor.options),n=e._parentVnode;i.parent=e.parent,i._parentVnode=n;var o=n.componentOptions;i.propsData=o.propsData,i._parentListeners=o.listeners,i._renderChildren=o.children,i._componentTag=o.tag,e.render&&(i.render=e.render,i.staticRenderFns=e.staticRenderFns)}function kn(t){var e=t.options;if(t.super){var i=kn(t.super),n=t.superOptions;if(i!==n){t.superOptions=i;var o=Mn(t);o&&j(t.extendOptions,o),e=t.options=_t(i,t.extendOptions),e.name&&(e.components[e.name]=t)}}return e}function Mn(t){var e,i=t.options,n=t.sealedOptions;for(var o in i)i[o]!==n[o]&&(e||(e={}),e[o]=i[o]);return e}function Sn(t){this._init(t)}function Pn(t){t.use=function(t){var e=this._installedPlugins||(this._installedPlugins=[]);if(e.indexOf(t)>-1)return this;var i=L(arguments,1);return i.unshift(this),"function"===typeof t.install?t.install.apply(t,i):"function"===typeof t&&t.apply(null,i),e.push(t),this}}function Nn(t){t.mixin=function(t){return this.options=_t(this.options,t),this}}function Cn(t){t.cid=0;var e=1;t.extend=function(t){t=t||{};var i=this,n=i.cid,o=t._Ctor||(t._Ctor={});if(o[n])return o[n];var r=t.name||i.options.name;var s=function(t){this._init(t)};return s.prototype=Object.create(i.prototype),s.prototype.constructor=s,s.cid=e++,s.options=_t(i.options,t),s["super"]=i,s.options.props&&Tn(s),s.options.computed&&An(s),s.extend=i.extend,s.mixin=i.mixin,s.use=i.use,V.forEach((function(t){s[t]=i[t]})),r&&(s.options.components[r]=s),s.superOptions=i.options,s.extendOptions=t,s.sealedOptions=j({},s.options),o[n]=s,s}}function Tn(t){var e=t.options.props;for(var i in e)rn(t.prototype,"_props",i)}function An(t){var e=t.options.computed;for(var i in e)fn(t.prototype,i,e[i])}function Ln(t){V.forEach((function(e){t[e]=function(t,i){return i?("component"===e&&u(i)&&(i.name=i.name||t,i=this.options._base.extend(i)),"directive"===e&&"function"===typeof i&&(i={bind:i,update:i}),this.options[e+"s"][t]=i,i):this.options[e+"s"][t]}}))}function jn(t){return t&&(t.Ctor.options.name||t.tag)}function On(t,e){return Array.isArray(t)?t.indexOf(e)>-1:"string"===typeof t?t.split(",").indexOf(e)>-1:!!c(t)&&t.test(e)}function Dn(t,e){var i=t.cache,n=t.keys,o=t._vnode;for(var r in i){var s=i[r];if(s){var a=s.name;a&&!e(a)&&Fn(i,r,n,o)}}}function Fn(t,e,i,n){var o=t[e];!o||n&&o.tag===n.tag||o.componentInstance.$destroy(),t[e]=null,v(i,e)}bn(Sn),vn(Sn),Ai(Sn),Di(Sn),xi(Sn);var Bn=[String,RegExp,Array],In={name:"keep-alive",abstract:!0,props:{include:Bn,exclude:Bn,max:[String,Number]},methods:{cacheVNode:function(){var t=this,e=t.cache,i=t.keys,n=t.vnodeToCache,o=t.keyToCache;if(n){var r=n.tag,s=n.componentInstance,a=n.componentOptions;e[o]={name:jn(a),tag:r,componentInstance:s},i.push(o),this.max&&i.length>parseInt(this.max)&&Fn(e,i[0],i,this._vnode),this.vnodeToCache=null}}},created:function(){this.cache=Object.create(null),this.keys=[]},destroyed:function(){for(var t in this.cache)Fn(this.cache,t,this.keys)},mounted:function(){var t=this;this.cacheVNode(),this.$watch("include",(function(e){Dn(t,(function(t){return On(e,t)}))})),this.$watch("exclude",(function(e){Dn(t,(function(t){return!On(e,t)}))}))},updated:function(){this.cacheVNode()},render:function(){var t=this.$slots.default,e=Mi(t),i=e&&e.componentOptions;if(i){var n=jn(i),o=this,r=o.include,s=o.exclude;if(r&&(!n||!On(r,n))||s&&n&&On(s,n))return e;var a=this,h=a.cache,l=a.keys,u=null==e.key?i.Ctor.cid+(i.tag?"::"+i.tag:""):e.key;h[u]?(e.componentInstance=h[u].componentInstance,v(l,u),l.push(u)):(this.vnodeToCache=e,this.keyToCache=u),e.data.keepAlive=!0}return e||t&&t[0]}},En={KeepAlive:In};function Rn(t){var e={get:function(){return Y}};Object.defineProperty(t,"config",e),t.util={warn:dt,extend:j,mergeOptions:_t,defineReactive:Ft},t.set=Bt,t.delete=It,t.nextTick=ge,t.observable=function(t){return Dt(t),t},t.options=Object.create(null),V.forEach((function(e){t.options[e+"s"]=Object.create(null)})),t.options._base=t,j(t.options.components,En),Pn(t),Nn(t),Cn(t),Ln(t)}Rn(Sn),Object.defineProperty(Sn.prototype,"$isServer",{get:ht}),Object.defineProperty(Sn.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(Sn,"FunctionalRenderContext",{value:Qe}),Sn.version="2.6.14";var zn=y("style,class"),Vn=y("input,textarea,option,select,progress"),Gn=function(t,e,i){return"value"===i&&Vn(t)&&"button"!==e||"selected"===i&&"option"===t||"checked"===i&&"input"===t||"muted"===i&&"video"===t},Yn=y("contenteditable,draggable,spellcheck"),Xn=y("events,caret,typing,plaintext-only"),qn=function(t,e){return Wn(e)||"false"===e?"false":"contenteditable"===t&&Xn(e)?e:"true"},Un=y("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,truespeed,typemustmatch,visible"),Kn="http://www.w3.org/1999/xlink",Hn=function(t){return":"===t.charAt(5)&&"xlink"===t.slice(0,5)},_n=function(t){return Hn(t)?t.slice(6,t.length):""},Wn=function(t){return null==t||!1===t};function $n(t){var e=t.data,i=t,n=t;while(o(n.componentInstance))n=n.componentInstance._vnode,n&&n.data&&(e=Jn(n.data,e));while(o(i=i.parent))i&&i.data&&(e=Jn(e,i.data));return Zn(e.staticClass,e.class)}function Jn(t,e){return{staticClass:Qn(t.staticClass,e.staticClass),class:o(t.class)?[t.class,e.class]:e.class}}function Zn(t,e){return o(t)||o(e)?Qn(t,to(e)):""}function Qn(t,e){return t?e?t+" "+e:t:e||""}function to(t){return Array.isArray(t)?eo(t):h(t)?io(t):"string"===typeof t?t:""}function eo(t){for(var e,i="",n=0,r=t.length;n<r;n++)o(e=to(t[n]))&&""!==e&&(i&&(i+=" "),i+=e);return i}function io(t){var e="";for(var i in t)t[i]&&(e&&(e+=" "),e+=i);return e}var no={svg:"http://www.w3.org/2000/svg",math:"http://www.w3.org/1998/Math/MathML"},oo=y("html,body,base,head,link,meta,style,title,address,article,aside,footer,header,h1,h2,h3,h4,h5,h6,hgroup,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,rtc,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,menuitem,summary,content,element,shadow,template,blockquote,iframe,tfoot"),ro=y("svg,animate,circle,clippath,cursor,defs,desc,ellipse,filter,font-face,foreignobject,g,glyph,image,line,marker,mask,missing-glyph,path,pattern,polygon,polyline,rect,switch,symbol,text,textpath,tspan,use,view",!0),so=function(t){return oo(t)||ro(t)};function ao(t){return ro(t)?"svg":"math"===t?"math":void 0}var ho=Object.create(null);function lo(t){if(!$)return!0;if(so(t))return!1;if(t=t.toLowerCase(),null!=ho[t])return ho[t];var e=document.createElement(t);return t.indexOf("-")>-1?ho[t]=e.constructor===window.HTMLUnknownElement||e.constructor===window.HTMLElement:ho[t]=/HTMLUnknownElement/.test(e.toString())}var uo=y("text,number,password,search,email,tel,url");function co(t){if("string"===typeof t){var e=document.querySelector(t);return e||document.createElement("div")}return t}function fo(t,e){var i=document.createElement(t);return"select"!==t||e.data&&e.data.attrs&&void 0!==e.data.attrs.multiple&&i.setAttribute("multiple","multiple"),i}function po(t,e){return document.createElementNS(no[t],e)}function go(t){return document.createTextNode(t)}function yo(t){return document.createComment(t)}function mo(t,e,i){t.insertBefore(e,i)}function vo(t,e){t.removeChild(e)}function xo(t,e){t.appendChild(e)}function bo(t){return t.parentNode}function wo(t){return t.nextSibling}function ko(t){return t.tagName}function Mo(t,e){t.textContent=e}function So(t,e){t.setAttribute(e,"")}var Po=Object.freeze({createElement:fo,createElementNS:po,createTextNode:go,createComment:yo,insertBefore:mo,removeChild:vo,appendChild:xo,parentNode:bo,nextSibling:wo,tagName:ko,setTextContent:Mo,setStyleScope:So}),No={create:function(t,e){Co(e)},update:function(t,e){t.data.ref!==e.data.ref&&(Co(t,!0),Co(e))},destroy:function(t){Co(t,!0)}};function Co(t,e){var i=t.data.ref;if(o(i)){var n=t.context,r=t.componentInstance||t.elm,s=n.$refs;e?Array.isArray(s[i])?v(s[i],r):s[i]===r&&(s[i]=void 0):t.data.refInFor?Array.isArray(s[i])?s[i].indexOf(r)<0&&s[i].push(r):s[i]=[r]:s[i]=r}}var To=new xt("",{},[]),Ao=["create","activate","update","remove","destroy"];function Lo(t,e){return t.key===e.key&&t.asyncFactory===e.asyncFactory&&(t.tag===e.tag&&t.isComment===e.isComment&&o(t.data)===o(e.data)&&jo(t,e)||r(t.isAsyncPlaceholder)&&n(e.asyncFactory.error))}function jo(t,e){if("input"!==t.tag)return!0;var i,n=o(i=t.data)&&o(i=i.attrs)&&i.type,r=o(i=e.data)&&o(i=i.attrs)&&i.type;return n===r||uo(n)&&uo(r)}function Oo(t,e,i){var n,r,s={};for(n=e;n<=i;++n)r=t[n].key,o(r)&&(s[r]=n);return s}function Do(t){var e,i,s={},h=t.modules,l=t.nodeOps;for(e=0;e<Ao.length;++e)for(s[Ao[e]]=[],i=0;i<h.length;++i)o(h[i][Ao[e]])&&s[Ao[e]].push(h[i][Ao[e]]);function u(t){return new xt(l.tagName(t).toLowerCase(),{},[],void 0,t)}function c(t,e){function i(){0===--i.listeners&&f(t)}return i.listeners=e,i}function f(t){var e=l.parentNode(t);o(e)&&l.removeChild(e,t)}function d(t,e,i,n,s,a,h){if(o(t.elm)&&o(a)&&(t=a[h]=Mt(t)),t.isRootInsert=!s,!p(t,e,i,n)){var u=t.data,c=t.children,f=t.tag;o(f)?(t.elm=t.ns?l.createElementNS(t.ns,f):l.createElement(f,t),k(t),x(t,c,e),o(u)&&w(t,e),v(i,t.elm,n)):r(t.isComment)?(t.elm=l.createComment(t.text),v(i,t.elm,n)):(t.elm=l.createTextNode(t.text),v(i,t.elm,n))}}function p(t,e,i,n){var s=t.data;if(o(s)){var a=o(t.componentInstance)&&s.keepAlive;if(o(s=s.hook)&&o(s=s.init)&&s(t,!1),o(t.componentInstance))return g(t,e),v(i,t.elm,n),r(a)&&m(t,e,i,n),!0}}function g(t,e){o(t.data.pendingInsert)&&(e.push.apply(e,t.data.pendingInsert),t.data.pendingInsert=null),t.elm=t.componentInstance.$el,b(t)?(w(t,e),k(t)):(Co(t),e.push(t))}function m(t,e,i,n){var r,a=t;while(a.componentInstance)if(a=a.componentInstance._vnode,o(r=a.data)&&o(r=r.transition)){for(r=0;r<s.activate.length;++r)s.activate[r](To,a);e.push(a);break}v(i,t.elm,n)}function v(t,e,i){o(t)&&(o(i)?l.parentNode(i)===t&&l.insertBefore(t,e,i):l.appendChild(t,e))}function x(t,e,i){if(Array.isArray(e)){0;for(var n=0;n<e.length;++n)d(e[n],i,t.elm,null,!0,e,n)}else a(t.text)&&l.appendChild(t.elm,l.createTextNode(String(t.text)))}function b(t){while(t.componentInstance)t=t.componentInstance._vnode;return o(t.tag)}function w(t,i){for(var n=0;n<s.create.length;++n)s.create[n](To,t);e=t.data.hook,o(e)&&(o(e.create)&&e.create(To,t),o(e.insert)&&i.push(t))}function k(t){var e;if(o(e=t.fnScopeId))l.setStyleScope(t.elm,e);else{var i=t;while(i)o(e=i.context)&&o(e=e.$options._scopeId)&&l.setStyleScope(t.elm,e),i=i.parent}o(e=Li)&&e!==t.context&&e!==t.fnContext&&o(e=e.$options._scopeId)&&l.setStyleScope(t.elm,e)}function M(t,e,i,n,o,r){for(;n<=o;++n)d(i[n],r,t,e,!1,i,n)}function S(t){var e,i,n=t.data;if(o(n))for(o(e=n.hook)&&o(e=e.destroy)&&e(t),e=0;e<s.destroy.length;++e)s.destroy[e](t);if(o(e=t.children))for(i=0;i<t.children.length;++i)S(t.children[i])}function P(t,e,i){for(;e<=i;++e){var n=t[e];o(n)&&(o(n.tag)?(N(n),S(n)):f(n.elm))}}function N(t,e){if(o(e)||o(t.data)){var i,n=s.remove.length+1;for(o(e)?e.listeners+=n:e=c(t.elm,n),o(i=t.componentInstance)&&o(i=i._vnode)&&o(i.data)&&N(i,e),i=0;i<s.remove.length;++i)s.remove[i](t,e);o(i=t.data.hook)&&o(i=i.remove)?i(t,e):e()}else f(t.elm)}function C(t,e,i,r,s){var a,h,u,c,f=0,p=0,g=e.length-1,y=e[0],m=e[g],v=i.length-1,x=i[0],b=i[v],w=!s;while(f<=g&&p<=v)n(y)?y=e[++f]:n(m)?m=e[--g]:Lo(y,x)?(A(y,x,r,i,p),y=e[++f],x=i[++p]):Lo(m,b)?(A(m,b,r,i,v),m=e[--g],b=i[--v]):Lo(y,b)?(A(y,b,r,i,v),w&&l.insertBefore(t,y.elm,l.nextSibling(m.elm)),y=e[++f],b=i[--v]):Lo(m,x)?(A(m,x,r,i,p),w&&l.insertBefore(t,m.elm,y.elm),m=e[--g],x=i[++p]):(n(a)&&(a=Oo(e,f,g)),h=o(x.key)?a[x.key]:T(x,e,f,g),n(h)?d(x,r,t,y.elm,!1,i,p):(u=e[h],Lo(u,x)?(A(u,x,r,i,p),e[h]=void 0,w&&l.insertBefore(t,u.elm,y.elm)):d(x,r,t,y.elm,!1,i,p)),x=i[++p]);f>g?(c=n(i[v+1])?null:i[v+1].elm,M(t,c,i,p,v,r)):p>v&&P(e,f,g)}function T(t,e,i,n){for(var r=i;r<n;r++){var s=e[r];if(o(s)&&Lo(t,s))return r}}function A(t,e,i,a,h,u){if(t!==e){o(e.elm)&&o(a)&&(e=a[h]=Mt(e));var c=e.elm=t.elm;if(r(t.isAsyncPlaceholder))o(e.asyncFactory.resolved)?O(t.elm,e,i):e.isAsyncPlaceholder=!0;else if(r(e.isStatic)&&r(t.isStatic)&&e.key===t.key&&(r(e.isCloned)||r(e.isOnce)))e.componentInstance=t.componentInstance;else{var f,d=e.data;o(d)&&o(f=d.hook)&&o(f=f.prepatch)&&f(t,e);var p=t.children,g=e.children;if(o(d)&&b(e)){for(f=0;f<s.update.length;++f)s.update[f](t,e);o(f=d.hook)&&o(f=f.update)&&f(t,e)}n(e.text)?o(p)&&o(g)?p!==g&&C(c,p,g,i,u):o(g)?(o(t.text)&&l.setTextContent(c,""),M(c,null,g,0,g.length-1,i)):o(p)?P(p,0,p.length-1):o(t.text)&&l.setTextContent(c,""):t.text!==e.text&&l.setTextContent(c,e.text),o(d)&&o(f=d.hook)&&o(f=f.postpatch)&&f(t,e)}}}function L(t,e,i){if(r(i)&&o(t.parent))t.parent.data.pendingInsert=e;else for(var n=0;n<e.length;++n)e[n].data.hook.insert(e[n])}var j=y("attrs,class,staticClass,staticStyle,key");function O(t,e,i,n){var s,a=e.tag,h=e.data,l=e.children;if(n=n||h&&h.pre,e.elm=t,r(e.isComment)&&o(e.asyncFactory))return e.isAsyncPlaceholder=!0,!0;if(o(h)&&(o(s=h.hook)&&o(s=s.init)&&s(e,!0),o(s=e.componentInstance)))return g(e,i),!0;if(o(a)){if(o(l))if(t.hasChildNodes())if(o(s=h)&&o(s=s.domProps)&&o(s=s.innerHTML)){if(s!==t.innerHTML)return!1}else{for(var u=!0,c=t.firstChild,f=0;f<l.length;f++){if(!c||!O(c,l[f],i,n)){u=!1;break}c=c.nextSibling}if(!u||c)return!1}else x(e,l,i);if(o(h)){var d=!1;for(var p in h)if(!j(p)){d=!0,w(e,i);break}!d&&h["class"]&&me(h["class"])}}else t.data!==e.text&&(t.data=e.text);return!0}return function(t,e,i,a){if(!n(e)){var h=!1,c=[];if(n(t))h=!0,d(e,c);else{var f=o(t.nodeType);if(!f&&Lo(t,e))A(t,e,c,null,null,a);else{if(f){if(1===t.nodeType&&t.hasAttribute(z)&&(t.removeAttribute(z),i=!0),r(i)&&O(t,e,c))return L(e,c,!0),t;t=u(t)}var p=t.elm,g=l.parentNode(p);if(d(e,c,p._leaveCb?null:g,l.nextSibling(p)),o(e.parent)){var y=e.parent,m=b(e);while(y){for(var v=0;v<s.destroy.length;++v)s.destroy[v](y);if(y.elm=e.elm,m){for(var x=0;x<s.create.length;++x)s.create[x](To,y);var w=y.data.hook.insert;if(w.merged)for(var k=1;k<w.fns.length;k++)w.fns[k]()}else Co(y);y=y.parent}}o(g)?P([t],0,0):o(t.tag)&&S(t)}}return L(e,c,h),e.elm}o(t)&&S(t)}}var Fo={create:Bo,update:Bo,destroy:function(t){Bo(t,To)}};function Bo(t,e){(t.data.directives||e.data.directives)&&Io(t,e)}function Io(t,e){var i,n,o,r=t===To,s=e===To,a=Ro(t.data.directives,t.context),h=Ro(e.data.directives,e.context),l=[],u=[];for(i in h)n=a[i],o=h[i],n?(o.oldValue=n.value,o.oldArg=n.arg,Vo(o,"update",e,t),o.def&&o.def.componentUpdated&&u.push(o)):(Vo(o,"bind",e,t),o.def&&o.def.inserted&&l.push(o));if(l.length){var c=function(){for(var i=0;i<l.length;i++)Vo(l[i],"inserted",e,t)};r?ke(e,"insert",c):c()}if(u.length&&ke(e,"postpatch",(function(){for(var i=0;i<u.length;i++)Vo(u[i],"componentUpdated",e,t)})),!r)for(i in a)h[i]||Vo(a[i],"unbind",t,t,s)}var Eo=Object.create(null);function Ro(t,e){var i,n,o=Object.create(null);if(!t)return o;for(i=0;i<t.length;i++)n=t[i],n.modifiers||(n.modifiers=Eo),o[zo(n)]=n,n.def=Wt(e.$options,"directives",n.name,!0);return o}function zo(t){return t.rawName||t.name+"."+Object.keys(t.modifiers||{}).join(".")}function Vo(t,e,i,n,o){var r=t.def&&t.def[e];if(r)try{r(i.elm,t,i,n,o)}catch(Ss){ie(Ss,i.context,"directive "+t.name+" "+e+" hook")}}var Go=[No,Fo];function Yo(t,e){var i=e.componentOptions;if((!o(i)||!1!==i.Ctor.options.inheritAttrs)&&(!n(t.data.attrs)||!n(e.data.attrs))){var r,s,a,h=e.elm,l=t.data.attrs||{},u=e.data.attrs||{};for(r in o(u.__ob__)&&(u=e.data.attrs=j({},u)),u)s=u[r],a=l[r],a!==s&&Xo(h,r,s,e.data.pre);for(r in(tt||it)&&u.value!==l.value&&Xo(h,"value",u.value),l)n(u[r])&&(Hn(r)?h.removeAttributeNS(Kn,_n(r)):Yn(r)||h.removeAttribute(r))}}function Xo(t,e,i,n){n||t.tagName.indexOf("-")>-1?qo(t,e,i):Un(e)?Wn(i)?t.removeAttribute(e):(i="allowfullscreen"===e&&"EMBED"===t.tagName?"true":e,t.setAttribute(e,i)):Yn(e)?t.setAttribute(e,qn(e,i)):Hn(e)?Wn(i)?t.removeAttributeNS(Kn,_n(e)):t.setAttributeNS(Kn,e,i):qo(t,e,i)}function qo(t,e,i){if(Wn(i))t.removeAttribute(e);else{if(tt&&!et&&"TEXTAREA"===t.tagName&&"placeholder"===e&&""!==i&&!t.__ieph){var n=function(e){e.stopImmediatePropagation(),t.removeEventListener("input",n)};t.addEventListener("input",n),t.__ieph=!0}t.setAttribute(e,i)}}var Uo={create:Yo,update:Yo};function Ko(t,e){var i=e.elm,r=e.data,s=t.data;if(!(n(r.staticClass)&&n(r.class)&&(n(s)||n(s.staticClass)&&n(s.class)))){var a=$n(e),h=i._transitionClasses;o(h)&&(a=Qn(a,to(h))),a!==i._prevClass&&(i.setAttribute("class",a),i._prevClass=a)}}var Ho,_o={create:Ko,update:Ko},Wo="__r",$o="__c";function Jo(t){if(o(t[Wo])){var e=tt?"change":"input";t[e]=[].concat(t[Wo],t[e]||[]),delete t[Wo]}o(t[$o])&&(t.change=[].concat(t[$o],t.change||[]),delete t[$o])}function Zo(t,e,i){var n=Ho;return function o(){var r=e.apply(null,arguments);null!==r&&er(t,o,i,n)}}var Qo=ae&&!(ot&&Number(ot[1])<=53);function tr(t,e,i,n){if(Qo){var o=Hi,r=e;e=r._wrapper=function(t){if(t.target===t.currentTarget||t.timeStamp>=o||t.timeStamp<=0||t.target.ownerDocument!==document)return r.apply(this,arguments)}}Ho.addEventListener(t,e,st?{capture:i,passive:n}:i)}function er(t,e,i,n){(n||Ho).removeEventListener(t,e._wrapper||e,i)}function ir(t,e){if(!n(t.data.on)||!n(e.data.on)){var i=e.data.on||{},o=t.data.on||{};Ho=e.elm,Jo(i),we(i,o,tr,er,Zo,e.context),Ho=void 0}}var nr,or={create:ir,update:ir};function rr(t,e){if(!n(t.data.domProps)||!n(e.data.domProps)){var i,r,s=e.elm,a=t.data.domProps||{},h=e.data.domProps||{};for(i in o(h.__ob__)&&(h=e.data.domProps=j({},h)),a)i in h||(s[i]="");for(i in h){if(r=h[i],"textContent"===i||"innerHTML"===i){if(e.children&&(e.children.length=0),r===a[i])continue;1===s.childNodes.length&&s.removeChild(s.childNodes[0])}if("value"===i&&"PROGRESS"!==s.tagName){s._value=r;var l=n(r)?"":String(r);sr(s,l)&&(s.value=l)}else if("innerHTML"===i&&ro(s.tagName)&&n(s.innerHTML)){nr=nr||document.createElement("div"),nr.innerHTML="<svg>"+r+"</svg>";var u=nr.firstChild;while(s.firstChild)s.removeChild(s.firstChild);while(u.firstChild)s.appendChild(u.firstChild)}else if(r!==a[i])try{s[i]=r}catch(Ss){}}}}function sr(t,e){return!t.composing&&("OPTION"===t.tagName||ar(t,e)||hr(t,e))}function ar(t,e){var i=!0;try{i=document.activeElement!==t}catch(Ss){}return i&&t.value!==e}function hr(t,e){var i=t.value,n=t._vModifiers;if(o(n)){if(n.number)return g(i)!==g(e);if(n.trim)return i.trim()!==e.trim()}return i!==e}var lr={create:rr,update:rr},ur=w((function(t){var e={},i=/;(?![^(]*\))/g,n=/:(.+)/;return t.split(i).forEach((function(t){if(t){var i=t.split(n);i.length>1&&(e[i[0].trim()]=i[1].trim())}})),e}));function cr(t){var e=fr(t.style);return t.staticStyle?j(t.staticStyle,e):e}function fr(t){return Array.isArray(t)?O(t):"string"===typeof t?ur(t):t}function dr(t,e){var i,n={};if(e){var o=t;while(o.componentInstance)o=o.componentInstance._vnode,o&&o.data&&(i=cr(o.data))&&j(n,i)}(i=cr(t.data))&&j(n,i);var r=t;while(r=r.parent)r.data&&(i=cr(r.data))&&j(n,i);return n}var pr,gr=/^--/,yr=/\s*!important$/,mr=function(t,e,i){if(gr.test(e))t.style.setProperty(e,i);else if(yr.test(i))t.style.setProperty(N(e),i.replace(yr,""),"important");else{var n=xr(e);if(Array.isArray(i))for(var o=0,r=i.length;o<r;o++)t.style[n]=i[o];else t.style[n]=i}},vr=["Webkit","Moz","ms"],xr=w((function(t){if(pr=pr||document.createElement("div").style,t=M(t),"filter"!==t&&t in pr)return t;for(var e=t.charAt(0).toUpperCase()+t.slice(1),i=0;i<vr.length;i++){var n=vr[i]+e;if(n in pr)return n}}));function br(t,e){var i=e.data,r=t.data;if(!(n(i.staticStyle)&&n(i.style)&&n(r.staticStyle)&&n(r.style))){var s,a,h=e.elm,l=r.staticStyle,u=r.normalizedStyle||r.style||{},c=l||u,f=fr(e.data.style)||{};e.data.normalizedStyle=o(f.__ob__)?j({},f):f;var d=dr(e,!0);for(a in c)n(d[a])&&mr(h,a,"");for(a in d)s=d[a],s!==c[a]&&mr(h,a,null==s?"":s)}}var wr={create:br,update:br},kr=/\s+/;function Mr(t,e){if(e&&(e=e.trim()))if(t.classList)e.indexOf(" ")>-1?e.split(kr).forEach((function(e){return t.classList.add(e)})):t.classList.add(e);else{var i=" "+(t.getAttribute("class")||"")+" ";i.indexOf(" "+e+" ")<0&&t.setAttribute("class",(i+e).trim())}}function Sr(t,e){if(e&&(e=e.trim()))if(t.classList)e.indexOf(" ")>-1?e.split(kr).forEach((function(e){return t.classList.remove(e)})):t.classList.remove(e),t.classList.length||t.removeAttribute("class");else{var i=" "+(t.getAttribute("class")||"")+" ",n=" "+e+" ";while(i.indexOf(n)>=0)i=i.replace(n," ");i=i.trim(),i?t.setAttribute("class",i):t.removeAttribute("class")}}function Pr(t){if(t){if("object"===typeof t){var e={};return!1!==t.css&&j(e,Nr(t.name||"v")),j(e,t),e}return"string"===typeof t?Nr(t):void 0}}var Nr=w((function(t){return{enterClass:t+"-enter",enterToClass:t+"-enter-to",enterActiveClass:t+"-enter-active",leaveClass:t+"-leave",leaveToClass:t+"-leave-to",leaveActiveClass:t+"-leave-active"}})),Cr=$&&!et,Tr="transition",Ar="animation",Lr="transition",jr="transitionend",Or="animation",Dr="animationend";Cr&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(Lr="WebkitTransition",jr="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(Or="WebkitAnimation",Dr="webkitAnimationEnd"));var Fr=$?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(t){return t()};function Br(t){Fr((function(){Fr(t)}))}function Ir(t,e){var i=t._transitionClasses||(t._transitionClasses=[]);i.indexOf(e)<0&&(i.push(e),Mr(t,e))}function Er(t,e){t._transitionClasses&&v(t._transitionClasses,e),Sr(t,e)}function Rr(t,e,i){var n=Vr(t,e),o=n.type,r=n.timeout,s=n.propCount;if(!o)return i();var a=o===Tr?jr:Dr,h=0,l=function(){t.removeEventListener(a,u),i()},u=function(e){e.target===t&&++h>=s&&l()};setTimeout((function(){h<s&&l()}),r+1),t.addEventListener(a,u)}var zr=/\b(transform|all)(,|$)/;function Vr(t,e){var i,n=window.getComputedStyle(t),o=(n[Lr+"Delay"]||"").split(", "),r=(n[Lr+"Duration"]||"").split(", "),s=Gr(o,r),a=(n[Or+"Delay"]||"").split(", "),h=(n[Or+"Duration"]||"").split(", "),l=Gr(a,h),u=0,c=0;e===Tr?s>0&&(i=Tr,u=s,c=r.length):e===Ar?l>0&&(i=Ar,u=l,c=h.length):(u=Math.max(s,l),i=u>0?s>l?Tr:Ar:null,c=i?i===Tr?r.length:h.length:0);var f=i===Tr&&zr.test(n[Lr+"Property"]);return{type:i,timeout:u,propCount:c,hasTransform:f}}function Gr(t,e){while(t.length<e.length)t=t.concat(t);return Math.max.apply(null,e.map((function(e,i){return Yr(e)+Yr(t[i])})))}function Yr(t){return 1e3*Number(t.slice(0,-1).replace(",","."))}function Xr(t,e){var i=t.elm;o(i._leaveCb)&&(i._leaveCb.cancelled=!0,i._leaveCb());var r=Pr(t.data.transition);if(!n(r)&&!o(i._enterCb)&&1===i.nodeType){var s=r.css,a=r.type,l=r.enterClass,u=r.enterToClass,c=r.enterActiveClass,f=r.appearClass,d=r.appearToClass,p=r.appearActiveClass,y=r.beforeEnter,m=r.enter,v=r.afterEnter,x=r.enterCancelled,b=r.beforeAppear,w=r.appear,k=r.afterAppear,M=r.appearCancelled,S=r.duration,P=Li,N=Li.$vnode;while(N&&N.parent)P=N.context,N=N.parent;var C=!P._isMounted||!t.isRootInsert;if(!C||w||""===w){var T=C&&f?f:l,A=C&&p?p:c,L=C&&d?d:u,j=C&&b||y,O=C&&"function"===typeof w?w:m,D=C&&k||v,F=C&&M||x,B=g(h(S)?S.enter:S);0;var I=!1!==s&&!et,E=Kr(O),z=i._enterCb=R((function(){I&&(Er(i,L),Er(i,A)),z.cancelled?(I&&Er(i,T),F&&F(i)):D&&D(i),i._enterCb=null}));t.data.show||ke(t,"insert",(function(){var e=i.parentNode,n=e&&e._pending&&e._pending[t.key];n&&n.tag===t.tag&&n.elm._leaveCb&&n.elm._leaveCb(),O&&O(i,z)})),j&&j(i),I&&(Ir(i,T),Ir(i,A),Br((function(){Er(i,T),z.cancelled||(Ir(i,L),E||(Ur(B)?setTimeout(z,B):Rr(i,a,z)))}))),t.data.show&&(e&&e(),O&&O(i,z)),I||E||z()}}}function qr(t,e){var i=t.elm;o(i._enterCb)&&(i._enterCb.cancelled=!0,i._enterCb());var r=Pr(t.data.transition);if(n(r)||1!==i.nodeType)return e();if(!o(i._leaveCb)){var s=r.css,a=r.type,l=r.leaveClass,u=r.leaveToClass,c=r.leaveActiveClass,f=r.beforeLeave,d=r.leave,p=r.afterLeave,y=r.leaveCancelled,m=r.delayLeave,v=r.duration,x=!1!==s&&!et,b=Kr(d),w=g(h(v)?v.leave:v);0;var k=i._leaveCb=R((function(){i.parentNode&&i.parentNode._pending&&(i.parentNode._pending[t.key]=null),x&&(Er(i,u),Er(i,c)),k.cancelled?(x&&Er(i,l),y&&y(i)):(e(),p&&p(i)),i._leaveCb=null}));m?m(M):M()}function M(){k.cancelled||(!t.data.show&&i.parentNode&&((i.parentNode._pending||(i.parentNode._pending={}))[t.key]=t),f&&f(i),x&&(Ir(i,l),Ir(i,c),Br((function(){Er(i,l),k.cancelled||(Ir(i,u),b||(Ur(w)?setTimeout(k,w):Rr(i,a,k)))}))),d&&d(i,k),x||b||k())}}function Ur(t){return"number"===typeof t&&!isNaN(t)}function Kr(t){if(n(t))return!1;var e=t.fns;return o(e)?Kr(Array.isArray(e)?e[0]:e):(t._length||t.length)>1}function Hr(t,e){!0!==e.data.show&&Xr(e)}var _r=$?{create:Hr,activate:Hr,remove:function(t,e){!0!==t.data.show?qr(t,e):e()}}:{},Wr=[Uo,_o,or,lr,wr,_r],$r=Wr.concat(Go),Jr=Do({nodeOps:Po,modules:$r});et&&document.addEventListener("selectionchange",(function(){var t=document.activeElement;t&&t.vmodel&&rs(t,"input")}));var Zr={inserted:function(t,e,i,n){"select"===i.tag?(n.elm&&!n.elm._vOptions?ke(i,"postpatch",(function(){Zr.componentUpdated(t,e,i)})):Qr(t,e,i.context),t._vOptions=[].map.call(t.options,is)):("textarea"===i.tag||uo(t.type))&&(t._vModifiers=e.modifiers,e.modifiers.lazy||(t.addEventListener("compositionstart",ns),t.addEventListener("compositionend",os),t.addEventListener("change",os),et&&(t.vmodel=!0)))},componentUpdated:function(t,e,i){if("select"===i.tag){Qr(t,e,i.context);var n=t._vOptions,o=t._vOptions=[].map.call(t.options,is);if(o.some((function(t,e){return!I(t,n[e])}))){var r=t.multiple?e.value.some((function(t){return es(t,o)})):e.value!==e.oldValue&&es(e.value,o);r&&rs(t,"change")}}}};function Qr(t,e,i){ts(t,e,i),(tt||it)&&setTimeout((function(){ts(t,e,i)}),0)}function ts(t,e,i){var n=e.value,o=t.multiple;if(!o||Array.isArray(n)){for(var r,s,a=0,h=t.options.length;a<h;a++)if(s=t.options[a],o)r=E(n,is(s))>-1,s.selected!==r&&(s.selected=r);else if(I(is(s),n))return void(t.selectedIndex!==a&&(t.selectedIndex=a));o||(t.selectedIndex=-1)}}function es(t,e){return e.every((function(e){return!I(e,t)}))}function is(t){return"_value"in t?t._value:t.value}function ns(t){t.target.composing=!0}function os(t){t.target.composing&&(t.target.composing=!1,rs(t.target,"input"))}function rs(t,e){var i=document.createEvent("HTMLEvents");i.initEvent(e,!0,!0),t.dispatchEvent(i)}function ss(t){return!t.componentInstance||t.data&&t.data.transition?t:ss(t.componentInstance._vnode)}var as={bind:function(t,e,i){var n=e.value;i=ss(i);var o=i.data&&i.data.transition,r=t.__vOriginalDisplay="none"===t.style.display?"":t.style.display;n&&o?(i.data.show=!0,Xr(i,(function(){t.style.display=r}))):t.style.display=n?r:"none"},update:function(t,e,i){var n=e.value,o=e.oldValue;if(!n!==!o){i=ss(i);var r=i.data&&i.data.transition;r?(i.data.show=!0,n?Xr(i,(function(){t.style.display=t.__vOriginalDisplay})):qr(i,(function(){t.style.display="none"}))):t.style.display=n?t.__vOriginalDisplay:"none"}},unbind:function(t,e,i,n,o){o||(t.style.display=t.__vOriginalDisplay)}},hs={model:Zr,show:as},ls={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function us(t){var e=t&&t.componentOptions;return e&&e.Ctor.options.abstract?us(Mi(e.children)):t}function cs(t){var e={},i=t.$options;for(var n in i.propsData)e[n]=t[n];var o=i._parentListeners;for(var r in o)e[M(r)]=o[r];return e}function fs(t,e){if(/\d-keep-alive$/.test(e.tag))return t("keep-alive",{props:e.componentOptions.propsData})}function ds(t){while(t=t.parent)if(t.data.transition)return!0}function ps(t,e){return e.key===t.key&&e.tag===t.tag}var gs=function(t){return t.tag||Fe(t)},ys=function(t){return"show"===t.name},ms={name:"transition",props:ls,abstract:!0,render:function(t){var e=this,i=this.$slots.default;if(i&&(i=i.filter(gs),i.length)){0;var n=this.mode;0;var o=i[0];if(ds(this.$vnode))return o;var r=us(o);if(!r)return o;if(this._leaving)return fs(t,o);var s="__transition-"+this._uid+"-";r.key=null==r.key?r.isComment?s+"comment":s+r.tag:a(r.key)?0===String(r.key).indexOf(s)?r.key:s+r.key:r.key;var h=(r.data||(r.data={})).transition=cs(this),l=this._vnode,u=us(l);if(r.data.directives&&r.data.directives.some(ys)&&(r.data.show=!0),u&&u.data&&!ps(r,u)&&!Fe(u)&&(!u.componentInstance||!u.componentInstance._vnode.isComment)){var c=u.data.transition=j({},h);if("out-in"===n)return this._leaving=!0,ke(c,"afterLeave",(function(){e._leaving=!1,e.$forceUpdate()})),fs(t,o);if("in-out"===n){if(Fe(r))return l;var f,d=function(){f()};ke(h,"afterEnter",d),ke(h,"enterCancelled",d),ke(c,"delayLeave",(function(t){f=t}))}}return o}}},vs=j({tag:String,moveClass:String},ls);delete vs.mode;var xs={props:vs,beforeMount:function(){var t=this,e=this._update;this._update=function(i,n){var o=ji(t);t.__patch__(t._vnode,t.kept,!1,!0),t._vnode=t.kept,o(),e.call(t,i,n)}},render:function(t){for(var e=this.tag||this.$vnode.data.tag||"span",i=Object.create(null),n=this.prevChildren=this.children,o=this.$slots.default||[],r=this.children=[],s=cs(this),a=0;a<o.length;a++){var h=o[a];if(h.tag)if(null!=h.key&&0!==String(h.key).indexOf("__vlist"))r.push(h),i[h.key]=h,(h.data||(h.data={})).transition=s;else;}if(n){for(var l=[],u=[],c=0;c<n.length;c++){var f=n[c];f.data.transition=s,f.data.pos=f.elm.getBoundingClientRect(),i[f.key]?l.push(f):u.push(f)}this.kept=t(e,null,l),this.removed=u}return t(e,null,r)},updated:function(){var t=this.prevChildren,e=this.moveClass||(this.name||"v")+"-move";t.length&&this.hasMove(t[0].elm,e)&&(t.forEach(bs),t.forEach(ws),t.forEach(ks),this._reflow=document.body.offsetHeight,t.forEach((function(t){if(t.data.moved){var i=t.elm,n=i.style;Ir(i,e),n.transform=n.WebkitTransform=n.transitionDuration="",i.addEventListener(jr,i._moveCb=function t(n){n&&n.target!==i||n&&!/transform$/.test(n.propertyName)||(i.removeEventListener(jr,t),i._moveCb=null,Er(i,e))})}})))},methods:{hasMove:function(t,e){if(!Cr)return!1;if(this._hasMove)return this._hasMove;var i=t.cloneNode();t._transitionClasses&&t._transitionClasses.forEach((function(t){Sr(i,t)})),Mr(i,e),i.style.display="none",this.$el.appendChild(i);var n=Vr(i);return this.$el.removeChild(i),this._hasMove=n.hasTransform}}};function bs(t){t.elm._moveCb&&t.elm._moveCb(),t.elm._enterCb&&t.elm._enterCb()}function ws(t){t.data.newPos=t.elm.getBoundingClientRect()}function ks(t){var e=t.data.pos,i=t.data.newPos,n=e.left-i.left,o=e.top-i.top;if(n||o){t.data.moved=!0;var r=t.elm.style;r.transform=r.WebkitTransform="translate("+n+"px,"+o+"px)",r.transitionDuration="0s"}}var Ms={Transition:ms,TransitionGroup:xs};Sn.config.mustUseProp=Gn,Sn.config.isReservedTag=so,Sn.config.isReservedAttr=zn,Sn.config.getTagNamespace=ao,Sn.config.isUnknownElement=lo,j(Sn.options.directives,hs),j(Sn.options.components,Ms),Sn.prototype.__patch__=$?Jr:D,Sn.prototype.$mount=function(t,e){return t=t&&$?co(t):void 0,Fi(this,t,e)},$&&setTimeout((function(){Y.devtools&&lt&&lt.emit("init",Sn)}),0),e["a"]=Sn}).call(this,i("c8ba"))},"2ba4":function(t,e){var i=Function.prototype,n=i.apply,o=i.bind,r=i.call;t.exports="object"==typeof Reflect&&Reflect.apply||(o?r.bind(n):function(){return r.apply(n,arguments)})},"2c3e":function(t,e,i){var n=i("da84"),o=i("83ab"),r=i("9f7f").UNSUPPORTED_Y,s=i("c6b6"),a=i("9bf2").f,h=i("69f3").get,l=RegExp.prototype,u=n.TypeError;o&&r&&a(l,"sticky",{configurable:!0,get:function(){if(this!==l){if("RegExp"===s(this))return!!h(this).sticky;throw u("Incompatible receiver, RegExp required")}}})},"2cf4":function(t,e,i){var n,o,r,s,a=i("da84"),h=i("2ba4"),l=i("0366"),u=i("1626"),c=i("1a2d"),f=i("d039"),d=i("1be4"),p=i("f36a"),g=i("cc12"),y=i("1cdc"),m=i("605d"),v=a.setImmediate,x=a.clearImmediate,b=a.process,w=a.Dispatch,k=a.Function,M=a.MessageChannel,S=a.String,P=0,N={},C="onreadystatechange";try{n=a.location}catch(O){}var T=function(t){if(c(N,t)){var e=N[t];delete N[t],e()}},A=function(t){return function(){T(t)}},L=function(t){T(t.data)},j=function(t){a.postMessage(S(t),n.protocol+"//"+n.host)};v&&x||(v=function(t){var e=p(arguments,1);return N[++P]=function(){h(u(t)?t:k(t),void 0,e)},o(P),P},x=function(t){delete N[t]},m?o=function(t){b.nextTick(A(t))}:w&&w.now?o=function(t){w.now(A(t))}:M&&!y?(r=new M,s=r.port2,r.port1.onmessage=L,o=l(s.postMessage,s)):a.addEventListener&&u(a.postMessage)&&!a.importScripts&&n&&"file:"!==n.protocol&&!f(j)?(o=j,a.addEventListener("message",L,!1)):o=C in g("script")?function(t){d.appendChild(g("script"))[C]=function(){d.removeChild(this),T(t)}}:function(t){setTimeout(A(t),0)}),t.exports={set:v,clear:x}},"2d00":function(t,e,i){var n,o,r=i("da84"),s=i("342f"),a=r.process,h=r.Deno,l=a&&a.versions||h&&h.version,u=l&&l.v8;u&&(n=u.split("."),o=n[0]>0&&n[0]<4?1:+(n[0]+n[1])),!o&&s&&(n=s.match(/Edge\/(\d+)/),(!n||n[1]>=74)&&(n=s.match(/Chrome\/(\d+)/),n&&(o=+n[1]))),t.exports=o},"342f":function(t,e,i){var n=i("d066");t.exports=n("navigator","userAgent")||""},"35a1":function(t,e,i){var n=i("f5df"),o=i("dc4a"),r=i("3f8c"),s=i("b622"),a=s("iterator");t.exports=function(t){if(void 0!=t)return o(t,a)||o(t,"@@iterator")||r[n(t)]}},"37e8":function(t,e,i){var n=i("83ab"),o=i("9bf2"),r=i("825a"),s=i("fc6a"),a=i("df75");t.exports=n?Object.defineProperties:function(t,e){r(t);var i,n=s(e),h=a(e),l=h.length,u=0;while(l>u)o.f(t,i=h[u++],n[i]);return t}},"3a9b":function(t,e,i){var n=i("e330");t.exports=n({}.isPrototypeOf)},"3bbe":function(t,e,i){var n=i("da84"),o=i("1626"),r=n.String,s=n.TypeError;t.exports=function(t){if("object"==typeof t||o(t))return t;throw s("Can't set "+r(t)+" as a prototype")}},"3f8c":function(t,e){t.exports={}},"44ad":function(t,e,i){var n=i("da84"),o=i("e330"),r=i("d039"),s=i("c6b6"),a=n.Object,h=o("".split);t.exports=r((function(){return!a("z").propertyIsEnumerable(0)}))?function(t){return"String"==s(t)?h(t,""):a(t)}:a},"44d2":function(t,e,i){var n=i("b622"),o=i("7c73"),r=i("9bf2"),s=n("unscopables"),a=Array.prototype;void 0==a[s]&&r.f(a,s,{configurable:!0,value:o(null)}),t.exports=function(t){a[s][t]=!0}},"44de":function(t,e,i){var n=i("da84");t.exports=function(t,e){var i=n.console;i&&i.error&&(1==arguments.length?i.error(t):i.error(t,e))}},"44e7":function(t,e,i){var n=i("861d"),o=i("c6b6"),r=i("b622"),s=r("match");t.exports=function(t){var e;return n(t)&&(void 0!==(e=t[s])?!!e:"RegExp"==o(t))}},4840:function(t,e,i){var n=i("825a"),o=i("5087"),r=i("b622"),s=r("species");t.exports=function(t,e){var i,r=n(t).constructor;return void 0===r||void 0==(i=n(r)[s])?e:o(i)}},"485a":function(t,e,i){var n=i("da84"),o=i("c65b"),r=i("1626"),s=i("861d"),a=n.TypeError;t.exports=function(t,e){var i,n;if("string"===e&&r(i=t.toString)&&!s(n=o(i,t)))return n;if(r(i=t.valueOf)&&!s(n=o(i,t)))return n;if("string"!==e&&r(i=t.toString)&&!s(n=o(i,t)))return n;throw a("Can't convert object to primitive value")}},4930:function(t,e,i){var n=i("2d00"),o=i("d039");t.exports=!!Object.getOwnPropertySymbols&&!o((function(){var t=Symbol();return!String(t)||!(Object(t)instanceof Symbol)||!Symbol.sham&&n&&n<41}))},"4d63":function(t,e,i){var n=i("83ab"),o=i("da84"),r=i("e330"),s=i("94ca"),a=i("7156"),h=i("9112"),l=i("9bf2").f,u=i("241c").f,c=i("3a9b"),f=i("44e7"),d=i("577e"),p=i("ad6d"),g=i("9f7f"),y=i("6eeb"),m=i("d039"),v=i("1a2d"),x=i("69f3").enforce,b=i("2626"),w=i("b622"),k=i("fce3"),M=i("107c"),S=w("match"),P=o.RegExp,N=P.prototype,C=o.SyntaxError,T=r(p),A=r(N.exec),L=r("".charAt),j=r("".replace),O=r("".indexOf),D=r("".slice),F=/^\?<[^\s\d!#%&*+<=>@^][^\s!#%&*+<=>@^]*>/,B=/a/g,I=/a/g,E=new P(B)!==B,R=g.UNSUPPORTED_Y,z=n&&(!E||R||k||M||m((function(){return I[S]=!1,P(B)!=B||P(I)==I||"/a/i"!=P(B,"i")}))),V=function(t){for(var e,i=t.length,n=0,o="",r=!1;n<=i;n++)e=L(t,n),"\\"!==e?r||"."!==e?("["===e?r=!0:"]"===e&&(r=!1),o+=e):o+="[\\s\\S]":o+=e+L(t,++n);return o},G=function(t){for(var e,i=t.length,n=0,o="",r=[],s={},a=!1,h=!1,l=0,u="";n<=i;n++){if(e=L(t,n),"\\"===e)e+=L(t,++n);else if("]"===e)a=!1;else if(!a)switch(!0){case"["===e:a=!0;break;case"("===e:A(F,D(t,n+1))&&(n+=2,h=!0),o+=e,l++;continue;case">"===e&&h:if(""===u||v(s,u))throw new C("Invalid capture group name");s[u]=!0,r[r.length]=[u,l],h=!1,u="";continue}h?u+=e:o+=e}return[o,r]};if(s("RegExp",z)){for(var Y=function(t,e){var i,n,o,r,s,l,u=c(N,this),p=f(t),g=void 0===e,y=[],m=t;if(!u&&p&&g&&t.constructor===Y)return t;if((p||c(N,t))&&(t=t.source,g&&(e="flags"in m?m.flags:T(m))),t=void 0===t?"":d(t),e=void 0===e?"":d(e),m=t,k&&"dotAll"in B&&(n=!!e&&O(e,"s")>-1,n&&(e=j(e,/s/g,""))),i=e,R&&"sticky"in B&&(o=!!e&&O(e,"y")>-1,o&&(e=j(e,/y/g,""))),M&&(r=G(t),t=r[0],y=r[1]),s=a(P(t,e),u?this:N,Y),(n||o||y.length)&&(l=x(s),n&&(l.dotAll=!0,l.raw=Y(V(t),i)),o&&(l.sticky=!0),y.length&&(l.groups=y)),t!==m)try{h(s,"source",""===m?"(?:)":m)}catch(v){}return s},X=function(t){t in Y||l(Y,t,{configurable:!0,get:function(){return P[t]},set:function(e){P[t]=e}})},q=u(P),U=0;q.length>U;)X(q[U++]);N.constructor=Y,Y.prototype=N,y(o,"RegExp",Y)}b("RegExp")},"4d64":function(t,e,i){var n=i("fc6a"),o=i("23cb"),r=i("07fa"),s=function(t){return function(e,i,s){var a,h=n(e),l=r(h),u=o(s,l);if(t&&i!=i){while(l>u)if(a=h[u++],a!=a)return!0}else for(;l>u;u++)if((t||u in h)&&h[u]===i)return t||u||0;return!t&&-1}};t.exports={includes:s(!0),indexOf:s(!1)}},5087:function(t,e,i){var n=i("da84"),o=i("68ee"),r=i("0d51"),s=n.TypeError;t.exports=function(t){if(o(t))return t;throw s(r(t)+" is not a constructor")}},"50c4":function(t,e,i){var n=i("5926"),o=Math.min;t.exports=function(t){return t>0?o(n(t),9007199254740991):0}},5692:function(t,e,i){var n=i("c430"),o=i("c6cd");(t.exports=function(t,e){return o[t]||(o[t]=void 0!==e?e:{})})("versions",[]).push({version:"3.19.1",mode:n?"pure":"global",copyright:"漏 2021 Denis Pushkarev (zloirock.ru)"})},"56ef":function(t,e,i){var n=i("d066"),o=i("e330"),r=i("241c"),s=i("7418"),a=i("825a"),h=o([].concat);t.exports=n("Reflect","ownKeys")||function(t){var e=r.f(a(t)),i=s.f;return i?h(e,i(t)):e}},"577e":function(t,e,i){var n=i("da84"),o=i("f5df"),r=n.String;t.exports=function(t){if("Symbol"===o(t))throw TypeError("Cannot convert a Symbol value to a string");return r(t)}},5926:function(t,e){var i=Math.ceil,n=Math.floor;t.exports=function(t){var e=+t;return e!==e||0===e?0:(e>0?n:i)(e)}},"59ed":function(t,e,i){var n=i("da84"),o=i("1626"),r=i("0d51"),s=n.TypeError;t.exports=function(t){if(o(t))return t;throw s(r(t)+" is not a function")}},"5c6c":function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},"5e77":function(t,e,i){var n=i("83ab"),o=i("1a2d"),r=Function.prototype,s=n&&Object.getOwnPropertyDescriptor,a=o(r,"name"),h=a&&"something"===function(){}.name,l=a&&(!n||n&&s(r,"name").configurable);t.exports={EXISTS:a,PROPER:h,CONFIGURABLE:l}},"605d":function(t,e,i){var n=i("c6b6"),o=i("da84");t.exports="process"==n(o.process)},6069:function(t,e){t.exports="object"==typeof window},"60da":function(t,e,i){"use strict";var n=i("83ab"),o=i("e330"),r=i("c65b"),s=i("d039"),a=i("df75"),h=i("7418"),l=i("d1e7"),u=i("7b0b"),c=i("44ad"),f=Object.assign,d=Object.defineProperty,p=o([].concat);t.exports=!f||s((function(){if(n&&1!==f({b:1},f(d({},"a",{enumerable:!0,get:function(){d(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var t={},e={},i=Symbol(),o="abcdefghijklmnopqrst";return t[i]=7,o.split("").forEach((function(t){e[t]=t})),7!=f({},t)[i]||a(f({},e)).join("")!=o}))?function(t,e){var i=u(t),o=arguments.length,s=1,f=h.f,d=l.f;while(o>s){var g,y=c(arguments[s++]),m=f?p(a(y),f(y)):a(y),v=m.length,x=0;while(v>x)g=m[x++],n&&!r(d,y,g)||(i[g]=y[g])}return i}:f},"68ee":function(t,e,i){var n=i("e330"),o=i("d039"),r=i("1626"),s=i("f5df"),a=i("d066"),h=i("8925"),l=function(){},u=[],c=a("Reflect","construct"),f=/^\s*(?:class|function)\b/,d=n(f.exec),p=!f.exec(l),g=function(t){if(!r(t))return!1;try{return c(l,u,t),!0}catch(e){return!1}},y=function(t){if(!r(t))return!1;switch(s(t)){case"AsyncFunction":case"GeneratorFunction":case"AsyncGeneratorFunction":return!1}return p||!!d(f,h(t))};t.exports=!c||o((function(){var t;return g(g.call)||!g(Object)||!g((function(){t=!0}))||t}))?y:g},"69f3":function(t,e,i){var n,o,r,s=i("7f9a"),a=i("da84"),h=i("e330"),l=i("861d"),u=i("9112"),c=i("1a2d"),f=i("c6cd"),d=i("f772"),p=i("d012"),g="Object already initialized",y=a.TypeError,m=a.WeakMap,v=function(t){return r(t)?o(t):n(t,{})},x=function(t){return function(e){var i;if(!l(e)||(i=o(e)).type!==t)throw y("Incompatible receiver, "+t+" required");return i}};if(s||f.state){var b=f.state||(f.state=new m),w=h(b.get),k=h(b.has),M=h(b.set);n=function(t,e){if(k(b,t))throw new y(g);return e.facade=t,M(b,t,e),e},o=function(t){return w(b,t)||{}},r=function(t){return k(b,t)}}else{var S=d("state");p[S]=!0,n=function(t,e){if(c(t,S))throw new y(g);return e.facade=t,u(t,S,e),e},o=function(t){return c(t,S)?t[S]:{}},r=function(t){return c(t,S)}}t.exports={set:n,get:o,has:r,enforce:v,getterFor:x}},"6eeb":function(t,e,i){var n=i("da84"),o=i("1626"),r=i("1a2d"),s=i("9112"),a=i("ce4e"),h=i("8925"),l=i("69f3"),u=i("5e77").CONFIGURABLE,c=l.get,f=l.enforce,d=String(String).split("String");(t.exports=function(t,e,i,h){var l,c=!!h&&!!h.unsafe,p=!!h&&!!h.enumerable,g=!!h&&!!h.noTargetGet,y=h&&void 0!==h.name?h.name:e;o(i)&&("Symbol("===String(y).slice(0,7)&&(y="["+String(y).replace(/^Symbol\(([^)]*)\)/,"$1")+"]"),(!r(i,"name")||u&&i.name!==y)&&s(i,"name",y),l=f(i),l.source||(l.source=d.join("string"==typeof y?y:""))),t!==n?(c?!g&&t[e]&&(p=!0):delete t[e],p?t[e]=i:s(t,e,i)):p?t[e]=i:a(e,i)})(Function.prototype,"toString",(function(){return o(this)&&c(this).source||h(this)}))},"6f70":function(t,e,i){(function(e){(function(){var i;function n(t){var e=0;return function(){return e<t.length?{done:!1,value:t[e++]}:{done:!0}}}function o(t){var e="undefined"!=typeof Symbol&&Symbol.iterator&&t[Symbol.iterator];return e?e.call(t):{next:n(t)}}function r(t){for(var e,i=[];!(e=t.next()).done;)i.push(e.value);return i}var s,a="function"==typeof Object.create?Object.create:function(t){function e(){}return e.prototype=t,new e};if("function"==typeof Object.setPrototypeOf)s=Object.setPrototypeOf;else{var h;t:{var l={a:!0},u={};try{u.__proto__=l,h=u.a;break t}catch(Tm){}h=!1}s=h?function(t,e){if(t.__proto__=e,t.__proto__!==e)throw new TypeError(t+" is not extensible");return t}:null}var c=s;function f(t,e){if(t.prototype=a(e.prototype),t.prototype.constructor=t,c)c(t,e);else for(var i in e)if("prototype"!=i)if(Object.defineProperties){var n=Object.getOwnPropertyDescriptor(e,i);n&&Object.defineProperty(t,i,n)}else t[i]=e[i];t.BB=e.prototype}var d="undefined"!=typeof window&&window===self?self:"undefined"!=typeof e&&null!=e?e:self,p="function"==typeof Object.defineProperties?Object.defineProperty:function(t,e,i){t!=Array.prototype&&t!=Object.prototype&&(t[e]=i.value)};function g(t){if(t){for(var e=d,i=["Array","prototype","fill"],n=0;n<i.length-1;n++){var o=i[n];o in e||(e[o]={}),e=e[o]}i=i[i.length-1],n=e[i],t=t(n),t!=n&&null!=t&&p(e,i,{writable:!0,value:t})}}g((function(t){return t||function(t,e,i){var n=this.length||0;for(0>e&&(e=Math.max(0,n+e)),(null==i||i>n)&&(i=n),i=Number(i),0>i&&(i=Math.max(0,n+i)),e=Number(e||0);e<i;e++)this[e]=t;return this}}));var y="object"===typeof self&&self.self===self&&self||"object"===typeof e&&e.global===e&&e||"object"===typeof window&&window.window===window&&window||{};function m(){}function v(t,e){var i=-1;return function(){var n=this,o=arguments;-1!==i&&y.clearTimeout(i),i=x((function(){i=-1,t.apply(n,o)}),e)}}function x(t,e){return y.setTimeout(t,e)}function b(t){return y.document.createElement(t)}function w(t){throw Error(t)}function k(t,e){t="The object is frozen, so its properties cannot be set: "+t.toString(),void 0!==e&&(t+="  to value: "+e),w(t)}function M(t,e,i,n){i=null===i?"*":"string"===typeof i?i:"function"===typeof i&&"string"===typeof i.className?i.className:"",void 0!==n&&(i+="."+n),w(i+" is not in the range "+e+": "+t)}function S(t){y.console&&y.console.log(t)}function P(){y.console&&y.console.log("Warning: List/Map/Set constructors no longer take an argument that enforces type.Instead they take an optional collection of Values to add to the collection. See 2.0 changelog for details.")}function N(t){return"object"===typeof t&&null!==t}function C(t){return Array.isArray(t)||y.NodeList&&t instanceof y.NodeList||y.HTMLCollection&&t instanceof y.HTMLCollection}function T(t){return Array.prototype.slice.call(t)}function A(t,e,i){Array.isArray(t)?e>=t.length?t.push(i):t.splice(e,0,i):w("Cannot insert an object into an HTMLCollection or NodeList: "+i+" at "+e)}function L(t,e){Array.isArray(t)?e>=t.length?t.pop():t.splice(e,1):w("Cannot remove an object from an HTMLCollection or NodeList at "+e)}function j(){var t=q.pop();return void 0===t?[]:t}function O(t){t.length=0,q.push(t)}function D(t){if("function"===typeof t){if(t.className)return t.className;if(t.name)return t.name;var e=t.toString();if(e=e.substring(9,e.indexOf("(")).trim(),""!==e)return t._className=e}else if(N(t)&&t.constructor)return D(t.constructor);return typeof t}function F(t){var e=t;return N(t)&&(t.text?e=t.text:t.name?e=t.name:void 0!==t.key?e=t.key:void 0!==t.id?e=t.id:t.constructor===Object&&(t.Text?e=t.Text:t.Name?e=t.Name:void 0!==t.Key?e=t.Key:void 0!==t.Id?e=t.Id:void 0!==t.ID&&(e=t.ID))),void 0===e?"undefined":null===e?"null":e.toString()}function B(t,e){if(t.hasOwnProperty(e))return!0;for(t=Object.getPrototypeOf(t);t&&t!==Function;){if(t.hasOwnProperty(e))return!0;var i=t.nB;if(i&&i[e])return!0;t=Object.getPrototypeOf(t)}return!1}function I(t,e,i){Object.defineProperty(Di.prototype,t,{get:e,set:i})}function E(t){for(var e=[],i=0;256>i;i++)e["0123456789abcdef".charAt(i>>4)+"0123456789abcdef".charAt(15&i)]=String.fromCharCode(i);t.length%2&&(t="0"+t),i=[];for(var n=0,o=0;o<t.length;o+=2)i[n++]=e[t.substr(o,2)];for(t=i.join(""),t=""===t?"0":t,e=[],i=0;256>i;i++)e[i]=i;for(i=n=0;256>i;i++)n=(n+e[i]+119)%256,o=e[i],e[i]=e[n],e[n]=o;n=i=0;for(var r="",s=0;s<t.length;s++)i=(i+1)%256,n=(n+e[i])%256,o=e[i],e[i]=e[n],e[n]=o,r+=String.fromCharCode(t.charCodeAt(s)^e[(e[i]+e[n])%256]);return r}void 0===y.requestAnimationFrame&&(void 0===y.setImmediate?y.requestAnimationFrame=function(t){y.setTimeout(t,0)}:y.requestAnimationFrame=y.setImmediate);var R=void 0!==y.navigator&&0<y.navigator.userAgent.indexOf("MSIE 9.0"),z=void 0!==y.navigator&&0<y.navigator.userAgent.indexOf("MSIE 10.0"),V=void 0!==y.navigator&&0<y.navigator.userAgent.indexOf("Trident/7"),G=void 0!==y.navigator&&0<y.navigator.userAgent.indexOf("Edge/"),Y=void 0!==y.navigator&&void 0!==y.navigator.platform&&0<=y.navigator.platform.toUpperCase().indexOf("MAC"),X=void 0!==y.navigator&&void 0!==y.navigator.platform&&null!==y.navigator.platform.match(/(iPhone|iPod|iPad)/i),q=[];function U(t,e,i){ot(this),this.l=t,this.oa=e,this.u=i}function K(t,e){return void 0===e||null===e||""===e?null:t[e]}function H(){this.qx=[]}function _(){}Object.freeze([]),m.className="Util",m.Dx="32ab5ff3b26f42dc0ed90f21452913b5",m.adym="gojs.net",m.vfo="28e647fdb665",m.className="Util",U.prototype.toString=function(){return"EnumValue."+this.oa},d.Object.defineProperties(U.prototype,{classType:{get:function(){return this.l}},name:{get:function(){return this.oa}},value:{get:function(){return this.u}}}),U.className="EnumValue",H.prototype.toString=function(){return this.qx.join("")},H.prototype.add=function(t){""!==t&&this.qx.push(t)},H.className="StringBuilder",_.className="PropertyCollection";var W={pB:!1,uB:!1,rB:!1,tB:!1,zB:!1,xB:!1,my:!1,qB:null,trace:function(t){y.console&&y.console.log(t)},sB:function(t,e,i,n){t.strokeStyle="red",t.fillStyle="red",t.font="8px sans-serif",t.beginPath(),t.moveTo(-10,0),t.lineTo(10,0),t.moveTo(0,-10),t.lineTo(0,10),t.stroke(),t.setTransform(1,0,0,1,0,0),t.scale(i,i),t.transform(e.m11,e.m12,e.m21,e.m22,e.dx,e.dy),t.lineWidth=2,t.beginPath(),t.moveTo(n.left,n.top+20),t.lineTo(n.left,n.top),t.lineTo(n.left+20,n.top),t.moveTo(n.right,n.bottom-20),t.lineTo(n.right,n.bottom),t.lineTo(n.right-20,n.bottom),t.stroke(),t.fillText("DB: "+Math.round(n.x)+", "+Math.round(n.y)+", "+Math.round(n.width)+", "+Math.round(n.height),n.left,n.top-5)},oB:function(t){var e,i={};for(e in t){if(i.x=e,"licenseKey"!==i.x){var n=t[i.x];if(void 0!==n.prototype){i.Jm=Object.getOwnPropertyNames(n.prototype);for(var o={Ak:0};o.Ak<i.Jm.length;o={Ak:o.Ak},o.Ak++){var r=Object.getOwnPropertyDescriptor(n.prototype,i.Jm[o.Ak]);void 0!==r.get&&void 0===r.set&&Object.defineProperty(n.prototype,i.Jm[o.Ak],{set:function(t,e){return function(){throw Error("Property "+t.Jm[e.Ak]+" of "+t.x+" is read-only.")}}(i,o)})}}}i={Jm:i.Jm,x:i.x}}}};function $(){}$.prototype.reset=function(){},$.prototype.next=function(){return!1},$.prototype.rd=function(){return!1},$.prototype.first=function(){return null},$.prototype.any=function(){return!1},$.prototype.all=function(){return!0},$.prototype.each=function(){return this},$.prototype.map=function(){return this},$.prototype.filter=function(){return this},$.prototype.Sd=function(){},$.prototype.toString=function(){return"EmptyIterator"},d.Object.defineProperties($.prototype,{iterator:{get:function(){return this}},count:{get:function(){return 0}}}),$.prototype.first=$.prototype.first,$.prototype.hasNext=$.prototype.rd,$.prototype.next=$.prototype.next,$.prototype.reset=$.prototype.reset;var J=null;function Z(t){this.key=-1,this.value=t}function Q(t){this.ub=t,this.ff=null,t.Ha=null,this.ia=t.Ba,this.Ra=-1}function tt(t){this.ub=t,t.gh=null,this.ia=t.Ba,this.Ra=t.j.length}function et(t){ot(this),this.v=!1,this.j=[],this.Ba=0,this.gh=this.Ha=null,void 0!==t&&("function"===typeof t||"string"===typeof t?P():this.addAll(t))}function it(t){this.tg=t,t.Ha=null,this.ia=t.Ba,this.ka=null}function nt(t){ot(this),this.v=!1,this.Hb={},this.Fb=0,this.Ha=null,this.Ba=0,this.$e=this.ba=null,void 0!==t&&("function"===typeof t||"string"===typeof t?P():this.addAll(t))}function ot(t){t.__gohashid=at++}function rt(t){var e=t.__gohashid;return void 0===e&&(e=at++,t.__gohashid=e),e}function st(t){return t.__gohashid}$.className="EmptyIterator",J=new $,Z.prototype.reset=function(){this.key=-1},Z.prototype.next=function(){return-1===this.key&&(this.key=0,!0)},Z.prototype.rd=function(){return this.next()},Z.prototype.first=function(){return this.key=0,this.value},Z.prototype.any=function(t){return this.key=-1,t(this.value)},Z.prototype.all=function(t){return this.key=-1,t(this.value)},Z.prototype.each=function(t){return this.key=-1,t(this.value),this},Z.prototype.map=function(t){return new Z(t(this.value))},Z.prototype.filter=function(t){return t(this.value)?new Z(this.value):J},Z.prototype.Sd=function(){this.value=null},Z.prototype.toString=function(){return"SingletonIterator("+this.value+")"},d.Object.defineProperties(Z.prototype,{iterator:{get:function(){return this}},count:{get:function(){return 1}}}),Z.prototype.first=Z.prototype.first,Z.prototype.hasNext=Z.prototype.rd,Z.prototype.next=Z.prototype.next,Z.prototype.reset=Z.prototype.reset,Z.className="SingletonIterator",Q.prototype.reset=function(){var t=this.ub;t.Ha=null,this.ia=t.Ba,this.Ra=-1},Q.prototype.next=function(){var t=this.ub;if(t.Ba!==this.ia&&0>this.key)return!1;t=t.j;var e=t.length,i=++this.Ra,n=this.ff;if(null!==n)for(;i<e;){var o=t[i];if(n(o))return this.key=this.Ra=i,this.value=o,!0;i++}else{if(i<e)return this.key=i,this.value=t[i],!0;this.Sd()}return!1},Q.prototype.rd=function(){return this.next()},Q.prototype.first=function(){var t=this.ub;this.ia=t.Ba,this.Ra=0,t=t.j;var e=t.length,i=this.ff;if(null!==i){for(var n=0;n<e;){var o=t[n];if(i(o))return this.key=this.Ra=n,this.value=o;n++}return null}return 0<e?(t=t[0],this.key=0,this.value=t):null},Q.prototype.any=function(t){var e=this.ub;e.Ha=null,this.Ra=-1,e=e.j;for(var i=e.length,n=this.ff,o=0;o<i;o++){var r=e[o];if((null===n||n(r))&&t(r))return!0}return!1},Q.prototype.all=function(t){var e=this.ub;e.Ha=null,this.Ra=-1,e=e.j;for(var i=e.length,n=this.ff,o=0;o<i;o++){var r=e[o];if((null===n||n(r))&&!t(r))return!1}return!0},Q.prototype.each=function(t){var e=this.ub;e.Ha=null,this.Ra=-1,e=e.j;for(var i=e.length,n=this.ff,o=0;o<i;o++){var r=e[o];(null===n||n(r))&&t(r)}return this},Q.prototype.map=function(t){var e=this.ub;e.Ha=null,this.Ra=-1;var i=[];e=e.j;for(var n=e.length,o=this.ff,r=0;r<n;r++){var s=e[r];(null===o||o(s))&&i.push(t(s))}return t=new et,t.j=i,t.pb(),t.iterator},Q.prototype.filter=function(t){var e=this.ub;e.Ha=null,this.Ra=-1;var i=[];e=e.j;for(var n=e.length,o=this.ff,r=0;r<n;r++){var s=e[r];(null===o||o(s))&&t(s)&&i.push(s)}return t=new et,t.j=i,t.pb(),t.iterator},Q.prototype.Sd=function(){this.key=-1,this.value=null,this.ia=-1,this.ff=null,this.ub.Ha=this},Q.prototype.toString=function(){return"ListIterator@"+this.Ra+"/"+this.ub.count},d.Object.defineProperties(Q.prototype,{iterator:{get:function(){return this}},predicate:{get:function(){return this.ff},set:function(t){this.ff=t}},count:{get:function(){var t=this.ff;if(null!==t){for(var e=0,i=this.ub.j,n=i.length,o=0;o<n;o++)t(i[o])&&e++;return e}return this.ub.j.length}}}),Q.prototype.first=Q.prototype.first,Q.prototype.hasNext=Q.prototype.rd,Q.prototype.next=Q.prototype.next,Q.prototype.reset=Q.prototype.reset,Q.className="ListIterator",tt.prototype.reset=function(){var t=this.ub;t.gh=null,this.ia=t.Ba,this.Ra=t.j.length},tt.prototype.next=function(){var t=this.ub;if(t.Ba!==this.ia&&0>this.key)return!1;var e=--this.Ra;return 0<=e?(this.key=e,this.value=t.j[e],!0):(this.Sd(),!1)},tt.prototype.rd=function(){return this.next()},tt.prototype.first=function(){var t=this.ub;this.ia=t.Ba;var e=t.j;return this.Ra=t=e.length-1,0<=t?(e=e[t],this.key=t,this.value=e):null},tt.prototype.any=function(t){var e=this.ub;e.gh=null,e=e.j;var i=e.length;for(this.Ra=i,--i;0<=i;i--)if(t(e[i]))return!0;return!1},tt.prototype.all=function(t){var e=this.ub;e.gh=null,e=e.j;var i=e.length;for(this.Ra=i,--i;0<=i;i--)if(!t(e[i]))return!1;return!0},tt.prototype.each=function(t){var e=this.ub;e.gh=null,e=e.j;var i=e.length;for(this.Ra=i,--i;0<=i;i--)t(e[i]);return this},tt.prototype.map=function(t){var e=this.ub;e.gh=null;var i=[];e=e.j;var n=e.length;for(this.Ra=n,--n;0<=n;n--)i.push(t(e[n]));return t=new et,t.j=i,t.pb(),t.iterator},tt.prototype.filter=function(t){var e=this.ub;e.gh=null;var i=[];e=e.j;var n=e.length;for(this.Ra=n,--n;0<=n;n--){var o=e[n];t(o)&&i.push(o)}return t=new et,t.j=i,t.pb(),t.iterator},tt.prototype.Sd=function(){this.key=-1,this.value=null,this.ia=-1,this.ub.gh=this},tt.prototype.toString=function(){return"ListIteratorBackwards("+this.Ra+"/"+this.ub.count+")"},d.Object.defineProperties(tt.prototype,{iterator:{get:function(){return this}},count:{get:function(){return this.ub.j.length}}}),tt.prototype.first=tt.prototype.first,tt.prototype.hasNext=tt.prototype.rd,tt.prototype.next=tt.prototype.next,tt.prototype.reset=tt.prototype.reset,tt.className="ListIteratorBackwards",i=et.prototype,i.pb=function(){var t=this.Ba;t++,999999999<t&&(t=0),this.Ba=t},i.freeze=function(){return this.v=!0,this},i.ea=function(){return this.v=!1,this},i.toString=function(){return"List()#"+st(this)},i.add=function(t){return null===t||(this.v&&k(this,t),this.j.push(t),this.pb()),this},i.push=function(t){this.add(t)},i.addAll=function(t){if(null===t)return this;this.v&&k(this);var e=this.j;if(C(t))for(var i=t.length,n=0;n<i;n++)e.push(t[n]);else for(t=t.iterator;t.next();)e.push(t.value);return this.pb(),this},i.clear=function(){this.v&&k(this),this.j.length=0,this.pb()},i.contains=function(t){return null!==t&&-1!==this.j.indexOf(t)},i.has=function(t){return this.contains(t)},i.indexOf=function(t){return null===t?-1:this.j.indexOf(t)},i.J=function(t){var e=this.j;return(0>t||t>=e.length)&&M(t,"0 <= i < length",et,"elt:i"),e[t]},i.get=function(t){return this.J(t)},i.Pc=function(t,e){var i=this.j;(0>t||t>=i.length)&&M(t,"0 <= i < length",et,"setElt:i"),this.v&&k(this,t),i[t]=e},i.set=function(t,e){this.Pc(t,e)},i.first=function(){var t=this.j;return 0===t.length?null:t[0]},i.Xb=function(){var t=this.j,e=t.length;return 0<e?t[e-1]:null},i.pop=function(){this.v&&k(this);var t=this.j;return 0<t.length?t.pop():null},et.prototype.any=function(t){for(var e=this.j,i=e.length,n=0;n<i;n++)if(t(e[n]))return!0;return!1},et.prototype.all=function(t){for(var e=this.j,i=e.length,n=0;n<i;n++)if(!t(e[n]))return!1;return!0},et.prototype.each=function(t){for(var e=this.j,i=e.length,n=0;n<i;n++)t(e[n]);return this},et.prototype.map=function(t){for(var e=new et,i=[],n=this.j,o=n.length,r=0;r<o;r++)i.push(t(n[r]));return e.j=i,e.pb(),e},et.prototype.filter=function(t){for(var e=new et,i=[],n=this.j,o=n.length,r=0;r<o;r++){var s=n[r];t(s)&&i.push(s)}return e.j=i,e.pb(),e},i=et.prototype,i.wb=function(t,e){0>t&&M(t,">= 0",et,"insertAt:i"),this.v&&k(this,t);var i=this.j;t>=i.length?i.push(e):i.splice(t,0,e),this.pb()},i.remove=function(t){if(null===t)return!1;this.v&&k(this,t);var e=this.j;return t=e.indexOf(t),-1!==t&&(t===e.length-1?e.pop():e.splice(t,1),this.pb(),!0)},i.delete=function(t){return this.remove(t)},i.cb=function(t){var e=this.j;(0>t||t>=e.length)&&M(t,"0 <= i < length",et,"removeAt:i"),this.v&&k(this,t),t===e.length-1?e.pop():e.splice(t,1),this.pb()},i.removeRange=function(t,e){var i=this.j,n=i.length;if(0>t)t=0;else if(t>=n)return this;if(0>e)return this;if(e>=n&&(e=n-1),t>e)return this;this.v&&k(this);for(var o=t,r=e+1;r<n;)i[o++]=i[r++];return i.length=n-(e-t+1),this.pb(),this},et.prototype.copy=function(){var t=new et,e=this.j;return 0<e.length&&(t.j=Array.prototype.slice.call(e)),t},i=et.prototype,i.ma=function(){for(var t=this.j,e=this.count,i=Array(e),n=0;n<e;n++)i[n]=t[n];return i},i.Lw=function(){for(var t=new nt,e=this.j,i=this.count,n=0;n<i;n++)t.add(e[n]);return t},i.sort=function(t){return this.v&&k(this),this.j.sort(t),this.pb(),this},i.uj=function(t,e,i){var n=this.j,o=n.length;void 0===e&&(e=0),void 0===i&&(i=o),this.v&&k(this);var r=i-e;if(1>=r)return this;if((0>e||e>=o-1)&&M(e,"0 <= from < length",et,"sortRange:from"),2===r)return i=n[e],o=n[e+1],0<t(i,o)&&(n[e]=o,n[e+1]=i,this.pb()),this;if(0===e)if(i>=o)n.sort(t);else for(e=n.slice(0,i),e.sort(t),t=0;t<i;t++)n[t]=e[t];else if(i>=o)for(i=n.slice(e),i.sort(t),t=e;t<o;t++)n[t]=i[t-e];else for(o=n.slice(e,i),o.sort(t),t=e;t<i;t++)n[t]=o[t-e];return this.pb(),this},i.reverse=function(){return this.v&&k(this),this.j.reverse(),this.pb(),this},d.Object.defineProperties(et.prototype,{_dataArray:{get:function(){return this.j}},count:{get:function(){return this.j.length}},size:{get:function(){return this.j.length}},length:{get:function(){return this.j.length}},iterator:{get:function(){if(0>=this.j.length)return J;var t=this.Ha;return null!==t?(t.reset(),t):new Q(this)}},iteratorBackwards:{get:function(){if(0>=this.j.length)return J;var t=this.gh;return null!==t?(t.reset(),t):new tt(this)}}}),et.prototype.reverse=et.prototype.reverse,et.prototype.sortRange=et.prototype.uj,et.prototype.sort=et.prototype.sort,et.prototype.toSet=et.prototype.Lw,et.prototype.toArray=et.prototype.ma,et.prototype.removeRange=et.prototype.removeRange,et.prototype.removeAt=et.prototype.cb,et.prototype["delete"]=et.prototype.delete,et.prototype.remove=et.prototype.remove,et.prototype.insertAt=et.prototype.wb,et.prototype.pop=et.prototype.pop,et.prototype.last=et.prototype.Xb,et.prototype.first=et.prototype.first,et.prototype.set=et.prototype.set,et.prototype.setElt=et.prototype.Pc,et.prototype.get=et.prototype.get,et.prototype.elt=et.prototype.J,et.prototype.indexOf=et.prototype.indexOf,et.prototype.has=et.prototype.has,et.prototype.contains=et.prototype.contains,et.prototype.clear=et.prototype.clear,et.prototype.addAll=et.prototype.addAll,et.prototype.push=et.prototype.push,et.prototype.add=et.prototype.add,et.prototype.thaw=et.prototype.ea,et.prototype.freeze=et.prototype.freeze,et.className="List",it.prototype.reset=function(){var t=this.tg;t.Ha=null,this.ia=t.Ba,this.ka=null},it.prototype.next=function(){var t=this.tg;if(t.Ba!==this.ia&&null===this.key)return!1;var e=this.ka;return e=null===e?t.ba:e.pa,null!==e?(this.ka=e,this.value=e.value,this.key=e.key,!0):(this.Sd(),!1)},it.prototype.rd=function(){return this.next()},it.prototype.first=function(){var t=this.tg;if(this.ia=t.Ba,t=t.ba,null!==t){this.ka=t;var e=t.value;return this.key=t.key,this.value=e}return null},it.prototype.any=function(t){var e=this.tg;for(this.ka=e.Ha=null,e=e.ba;null!==e;){if(t(e.value))return!0;e=e.pa}return!1},it.prototype.all=function(t){var e=this.tg;for(this.ka=e.Ha=null,e=e.ba;null!==e;){if(!t(e.value))return!1;e=e.pa}return!0},it.prototype.each=function(t){var e=this.tg;for(this.ka=e.Ha=null,e=e.ba;null!==e;)t(e.value),e=e.pa;return this},it.prototype.map=function(t){var e=this.tg;e.Ha=null;var i=new et;for(e=e.ba;null!==e;)i.add(t(e.value)),e=e.pa;return i.iterator},it.prototype.filter=function(t){var e=this.tg;e.Ha=null;var i=new et;for(e=e.ba;null!==e;){var n=e.value;t(n)&&i.add(n),e=e.pa}return i.iterator},it.prototype.Sd=function(){this.value=this.key=null,this.ia=-1,this.tg.Ha=this},it.prototype.toString=function(){return null!==this.ka?"SetIterator@"+this.ka.value:"SetIterator"},d.Object.defineProperties(it.prototype,{iterator:{get:function(){return this}},count:{get:function(){return this.tg.Fb}}}),it.prototype.first=it.prototype.first,it.prototype.hasNext=it.prototype.rd,it.prototype.next=it.prototype.next,it.prototype.reset=it.prototype.reset,it.className="SetIterator",i=nt.prototype,i.pb=function(){var t=this.Ba;t++,999999999<t&&(t=0),this.Ba=t},i.freeze=function(){return this.v=!0,this},i.ea=function(){return this.v=!1,this},i.toString=function(){return"Set()#"+st(this)},i.add=function(t){if(null===t)return this;this.v&&k(this,t);var e=t;return N(t)&&(e=rt(t)),void 0===this.Hb[e]&&(this.Fb++,t=new ct(t,t),this.Hb[e]=t,e=this.$e,null===e?this.ba=t:(t.Xl=e,e.pa=t),this.$e=t,this.pb()),this},i.addAll=function(t){if(null===t)return this;if(this.v&&k(this),C(t))for(var e=t.length,i=0;i<e;i++)this.add(t[i]);else for(t=t.iterator;t.next();)this.add(t.value);return this},i.contains=function(t){if(null===t)return!1;var e=t;return(!N(t)||(e=st(t),void 0!==e))&&void 0!==this.Hb[e]},i.has=function(t){return this.contains(t)},i.Ez=function(t){if(null===t)return!0;for(t=t.iterator;t.next();)if(!this.contains(t.value))return!1;return!0},i.Fz=function(t){if(null===t)return!0;for(t=t.iterator;t.next();)if(this.contains(t.value))return!0;return!1},i.first=function(){var t=this.ba;return null===t?null:t.value},nt.prototype.any=function(t){for(var e=this.ba;null!==e;){if(t(e.value))return!0;e=e.pa}return!1},nt.prototype.all=function(t){for(var e=this.ba;null!==e;){if(!t(e.value))return!1;e=e.pa}return!0},nt.prototype.each=function(t){for(var e=this.ba;null!==e;)t(e.value),e=e.pa;return this},nt.prototype.map=function(t){for(var e=new nt,i=this.ba;null!==i;)e.add(t(i.value)),i=i.pa;return e},nt.prototype.filter=function(t){for(var e=new nt,i=this.ba;null!==i;){var n=i.value;t(n)&&e.add(n),i=i.pa}return e},i=nt.prototype,i.remove=function(t){if(null===t)return!1;this.v&&k(this,t);var e=t;if(N(t)&&(e=st(t),void 0===e))return!1;if(t=this.Hb[e],void 0===t)return!1;var i=t.pa,n=t.Xl;return null!==i&&(i.Xl=n),null!==n&&(n.pa=i),this.ba===t&&(this.ba=i),this.$e===t&&(this.$e=n),delete this.Hb[e],this.Fb--,this.pb(),!0},i.delete=function(t){return this.remove(t)},i.Zq=function(t){if(null===t)return this;if(this.v&&k(this),C(t))for(var e=t.length,i=0;i<e;i++)this.remove(t[i]);else for(t=t.iterator;t.next();)this.remove(t.value);return this},i.YA=function(t){if(null===t||0===this.count)return this;this.v&&k(this);var e=new nt;e.addAll(t),t=[];for(var i=this.iterator;i.next();){var n=i.value;e.contains(n)||t.push(n)}return this.Zq(t),this},i.clear=function(){this.v&&k(this),this.Hb={},this.Fb=0,null!==this.Ha&&this.Ha.reset(),this.$e=this.ba=null,this.pb()},nt.prototype.copy=function(){var t,e=new nt,i=this.Hb;for(t in i)e.add(i[t].value);return e},nt.prototype.ma=function(){var t,e=Array(this.Fb),i=this.Hb,n=0;for(t in i)e[n]=i[t].value,n++;return e},nt.prototype.Kw=function(){var t,e=new et,i=this.Hb;for(t in i)e.add(i[t].value);return e},d.Object.defineProperties(nt.prototype,{count:{get:function(){return this.Fb}},size:{get:function(){return this.Fb}},iterator:{get:function(){if(0>=this.Fb)return J;var t=this.Ha;return null!==t?(t.reset(),t):new it(this)}}}),nt.prototype.toList=nt.prototype.Kw,nt.prototype.toArray=nt.prototype.ma,nt.prototype.clear=nt.prototype.clear,nt.prototype.retainAll=nt.prototype.YA,nt.prototype.removeAll=nt.prototype.Zq,nt.prototype["delete"]=nt.prototype.delete,nt.prototype.remove=nt.prototype.remove,nt.prototype.first=nt.prototype.first,nt.prototype.containsAny=nt.prototype.Fz,nt.prototype.containsAll=nt.prototype.Ez,nt.prototype.has=nt.prototype.has,nt.prototype.contains=nt.prototype.contains,nt.prototype.addAll=nt.prototype.addAll,nt.prototype.add=nt.prototype.add,nt.prototype.thaw=nt.prototype.ea,nt.prototype.freeze=nt.prototype.freeze;var at=1;function ht(t){this.ga=t,this.ia=t.Ba,this.ka=null}function lt(t){nt.call(this),ot(this),this.v=!0,this.ga=t}function ut(t){this.ga=t,t.Ze=null,this.ia=t.Ba,this.ka=null}function ct(t,e){this.key=t,this.value=e,this.Xl=this.pa=null}function ft(t){this.ga=t,t.Ha=null,this.ia=t.Ba,this.ka=null}function dt(t){ot(this),this.v=!1,this.Hb={},this.Fb=0,this.Ze=this.Ha=null,this.Ba=0,this.$e=this.ba=null,void 0!==t&&("function"===typeof t||"string"===typeof t?P():this.addAll(t))}function pt(t,e){void 0===t?this.y=this.x=0:"number"===typeof t&&"number"===typeof e?(this.x=t,this.y=e):w("Invalid arguments to Point constructor: "+t+", "+e),this.v=!1}function gt(t){if("string"===typeof t){t=t.split(" ");for(var e=0,i=0;""===t[e];)e++;var n=t[e++];n&&(i=parseFloat(n));for(var o=0;""===t[e];)e++;return(n=t[e++])&&(o=parseFloat(n)),new pt(i,o)}return new pt}function yt(t){return t.x.toString()+" "+t.y.toString()}function mt(t,e){if(0===t)return 0<e?90:0>e?270:0;if(0===e)return 0<t?0:180;if(isNaN(t)||isNaN(e))return 0;var i=180*Math.atan(Math.abs(e/t))/Math.PI;return 0>t?i=0>e?i+180:180-i:0>e&&(i=360-i),i}function vt(t,e){return e.Jd(t),t}function xt(t,e,i,n,o,r){var s=o-i,a=r-n,h=s*s+a*a;i-=t,n-=e;var l=-i*s-n*a;return 0>=l||l>=h?(s=o-t,a=r-e,Math.min(i*i+n*n,s*s+a*a)):(t=s*n-a*i,t*t/h)}function bt(t,e,i,n){return t=i-t,e=n-e,t*t+e*e}function wt(t,e,i,n){return t=i-t,e=n-e,0===t?0<e?90:0>e?270:0:0===e?0<t?0:180:isNaN(t)||isNaN(e)?0:(n=180*Math.atan(Math.abs(e/t))/Math.PI,0>t?n=0>e?n+180:180-n:0>e&&(n=360-n),n)}nt.className="Set",nt.uniqueHash=ot,nt.hashIdUnique=rt,nt.hashId=st,ht.prototype.reset=function(){this.ia=this.ga.Ba,this.ka=null},ht.prototype.next=function(){var t=this.ga;if(t.Ba!==this.ia&&null===this.key)return!1;var e=this.ka;return e=null===e?t.ba:e.pa,null!==e?(this.ka=e,this.value=this.key=t=e.key,!0):(this.Sd(),!1)},ht.prototype.rd=function(){return this.next()},ht.prototype.first=function(){var t=this.ga;return this.ia=t.Ba,t=t.ba,null!==t?(this.ka=t,this.value=this.key=t=t.key):null},ht.prototype.any=function(t){var e=this.ga;for(this.ka=null,e=e.ba;null!==e;){if(t(e.key))return!0;e=e.pa}return!1},ht.prototype.all=function(t){var e=this.ga;for(this.ka=null,e=e.ba;null!==e;){if(!t(e.key))return!1;e=e.pa}return!0},ht.prototype.each=function(t){var e=this.ga;for(this.ka=null,e=e.ba;null!==e;)t(e.key),e=e.pa;return this},ht.prototype.map=function(t){var e=this.ga;this.ka=null;var i=new et;for(e=e.ba;null!==e;)i.add(t(e.key)),e=e.pa;return i.iterator},ht.prototype.filter=function(t){var e=this.ga;this.ka=null;var i=new et;for(e=e.ba;null!==e;){var n=e.key;t(n)&&i.add(n),e=e.pa}return i.iterator},ht.prototype.Sd=function(){this.value=this.key=null,this.ia=-1},ht.prototype.toString=function(){return null!==this.ka?"MapKeySetIterator@"+this.ka.value:"MapKeySetIterator"},d.Object.defineProperties(ht.prototype,{iterator:{get:function(){return this}},count:{get:function(){return this.ga.Fb}}}),ht.prototype.first=ht.prototype.first,ht.prototype.hasNext=ht.prototype.rd,ht.prototype.next=ht.prototype.next,ht.prototype.reset=ht.prototype.reset,ht.className="MapKeySetIterator",f(lt,nt),i=lt.prototype,i.freeze=function(){return this},i.ea=function(){return this},i.toString=function(){return"MapKeySet("+this.ga.toString()+")"},i.add=function(){return w("This Set is read-only: "+this.toString()),this},i.contains=function(t){return this.ga.contains(t)},i.has=function(t){return this.contains(t)},i.remove=function(){return w("This Set is read-only: "+this.toString()),!1},i.delete=function(t){return this.remove(t)},i.clear=function(){w("This Set is read-only: "+this.toString())},i.first=function(){var t=this.ga.ba;return null!==t?t.key:null},lt.prototype.any=function(t){for(var e=this.ga.ba;null!==e;){if(t(e.key))return!0;e=e.pa}return!1},lt.prototype.all=function(t){for(var e=this.ga.ba;null!==e;){if(!t(e.key))return!1;e=e.pa}return!0},lt.prototype.each=function(t){for(var e=this.ga.ba;null!==e;)t(e.key),e=e.pa;return this},lt.prototype.map=function(t){for(var e=new nt,i=this.ga.ba;null!==i;)e.add(t(i.key)),i=i.pa;return e},lt.prototype.filter=function(t){for(var e=new nt,i=this.ga.ba;null!==i;){var n=i.key;t(n)&&e.add(n),i=i.pa}return e},lt.prototype.copy=function(){return new lt(this.ga)},lt.prototype.Lw=function(){var t,e=new nt,i=this.ga.Hb;for(t in i)e.add(i[t].key);return e},lt.prototype.ma=function(){var t,e=this.ga.Hb,i=Array(this.ga.Fb),n=0;for(t in e)i[n]=e[t].key,n++;return i},lt.prototype.Kw=function(){var t,e=new et,i=this.ga.Hb;for(t in i)e.add(i[t].key);return e},d.Object.defineProperties(lt.prototype,{count:{get:function(){return this.ga.Fb}},size:{get:function(){return this.ga.Fb}},iterator:{get:function(){return 0>=this.ga.Fb?J:new ht(this.ga)}}}),lt.prototype.toList=lt.prototype.Kw,lt.prototype.toArray=lt.prototype.ma,lt.prototype.toSet=lt.prototype.Lw,lt.prototype.first=lt.prototype.first,lt.prototype.clear=lt.prototype.clear,lt.prototype["delete"]=lt.prototype.delete,lt.prototype.remove=lt.prototype.remove,lt.prototype.has=lt.prototype.has,lt.prototype.contains=lt.prototype.contains,lt.prototype.add=lt.prototype.add,lt.prototype.thaw=lt.prototype.ea,lt.prototype.freeze=lt.prototype.freeze,lt.className="MapKeySet",ut.prototype.reset=function(){var t=this.ga;t.Ze=null,this.ia=t.Ba,this.ka=null},ut.prototype.next=function(){var t=this.ga;if(t.Ba!==this.ia&&null===this.key)return!1;var e=this.ka;return e=null===e?t.ba:e.pa,null!==e?(this.ka=e,this.value=e.value,this.key=e.key,!0):(this.Sd(),!1)},ut.prototype.rd=function(){return this.next()},ut.prototype.first=function(){var t=this.ga;if(this.ia=t.Ba,t=t.ba,null!==t){this.ka=t;var e=t.value;return this.key=t.key,this.value=e}return null},ut.prototype.any=function(t){var e=this.ga;for(this.ka=e.Ze=null,e=e.ba;null!==e;){if(t(e.value))return!0;e=e.pa}return!1},ut.prototype.all=function(t){var e=this.ga;for(this.ka=e.Ze=null,e=e.ba;null!==e;){if(!t(e.value))return!1;e=e.pa}return!0},ut.prototype.each=function(t){var e=this.ga;for(this.ka=e.Ze=null,e=e.ba;null!==e;)t(e.value),e=e.pa;return this},ut.prototype.map=function(t){var e=this.ga;this.ka=e.Ze=null;var i=new et;for(e=e.ba;null!==e;)i.add(t(e.value)),e=e.pa;return i.iterator},ut.prototype.filter=function(t){var e=this.ga;this.ka=e.Ze=null;var i=new et;for(e=e.ba;null!==e;){var n=e.value;t(n)&&i.add(n),e=e.pa}return i.iterator},ut.prototype.Sd=function(){this.value=this.key=null,this.ia=-1,this.ga.Ze=this},ut.prototype.toString=function(){return null!==this.ka?"MapValueSetIterator@"+this.ka.value:"MapValueSetIterator"},d.Object.defineProperties(ut.prototype,{iterator:{get:function(){return this}},count:{get:function(){return this.ga.Fb}}}),ut.prototype.first=ut.prototype.first,ut.prototype.hasNext=ut.prototype.rd,ut.prototype.next=ut.prototype.next,ut.prototype.reset=ut.prototype.reset,ut.className="MapValueSetIterator",ct.prototype.toString=function(){return"{"+this.key+":"+this.value+"}"},ct.className="KeyValuePair",ft.prototype.reset=function(){var t=this.ga;t.Ha=null,this.ia=t.Ba,this.ka=null},ft.prototype.next=function(){var t=this.ga;if(t.Ba!==this.ia&&null===this.key)return!1;var e=this.ka;return e=null===e?t.ba:e.pa,null!==e?(this.ka=e,this.key=e.key,this.value=e.value,!0):(this.Sd(),!1)},ft.prototype.rd=function(){return this.next()},ft.prototype.first=function(){var t=this.ga;return this.ia=t.Ba,t=t.ba,null!==t?(this.ka=t,this.key=t.key,this.value=t.value,t):null},ft.prototype.any=function(t){var e=this.ga;for(this.ka=e.Ha=null,e=e.ba;null!==e;){if(t(e))return!0;e=e.pa}return!1},ft.prototype.all=function(t){var e=this.ga;for(this.ka=e.Ha=null,e=e.ba;null!==e;){if(!t(e))return!1;e=e.pa}return!0},ft.prototype.each=function(t){var e=this.ga;for(this.ka=e.Ha=null,e=e.ba;null!==e;)t(e),e=e.pa;return this},ft.prototype.map=function(t){var e=this.ga;this.ka=e.Ha=null;var i=new et;for(e=e.ba;null!==e;)i.add(t(e)),e=e.pa;return i.iterator},ft.prototype.filter=function(t){var e=this.ga;this.ka=e.Ha=null;var i=new et;for(e=e.ba;null!==e;)t(e)&&i.add(e),e=e.pa;return i.iterator},ft.prototype.Sd=function(){this.value=this.key=null,this.ia=-1,this.ga.Ha=this},ft.prototype.toString=function(){return null!==this.ka?"MapIterator@"+this.ka:"MapIterator"},d.Object.defineProperties(ft.prototype,{iterator:{get:function(){return this}},count:{get:function(){return this.ga.Fb}}}),ft.prototype.first=ft.prototype.first,ft.prototype.hasNext=ft.prototype.rd,ft.prototype.next=ft.prototype.next,ft.prototype.reset=ft.prototype.reset,ft.className="MapIterator",i=dt.prototype,i.pb=function(){var t=this.Ba;t++,999999999<t&&(t=0),this.Ba=t},i.freeze=function(){return this.v=!0,this},i.ea=function(){return this.v=!1,this},i.toString=function(){return"Map()#"+st(this)},i.add=function(t,e){this.v&&k(this,t);var i=t;N(t)&&(i=rt(t));var n=this.Hb[i];return void 0===n?(this.Fb++,t=new ct(t,e),this.Hb[i]=t,i=this.$e,null===i?this.ba=t:(t.Xl=i,i.pa=t),this.$e=t,this.pb()):n.value=e,this},i.set=function(t,e){return this.add(t,e)},i.addAll=function(t){if(null===t)return this;if(C(t))for(var e=t.length,i=0;i<e;i++){var n=t[i];this.add(n.key,n.value)}else if(t instanceof dt)for(t=t.iterator;t.next();)this.add(t.key,t.value);else for(t=t.iterator;t.next();)e=t.value,this.add(e.key,e.value);return this},i.first=function(){return this.ba},dt.prototype.any=function(t){for(var e=this.ba;null!==e;){if(t(e))return!0;e=e.pa}return!1},dt.prototype.all=function(t){for(var e=this.ba;null!==e;){if(!t(e))return!1;e=e.pa}return!0},dt.prototype.each=function(t){for(var e=this.ba;null!==e;)t(e),e=e.pa;return this},dt.prototype.map=function(t){for(var e=new dt,i=this.ba;null!==i;)e.add(i.key,t(i)),i=i.pa;return e},dt.prototype.filter=function(t){for(var e=new dt,i=this.ba;null!==i;)t(i)&&e.add(i.key,i.value),i=i.pa;return e},i=dt.prototype,i.contains=function(t){var e=t;return(!N(t)||(e=st(t),void 0!==e))&&void 0!==this.Hb[e]},i.has=function(t){return this.contains(t)},i.G=function(t){var e=t;return N(t)&&(e=st(t),void 0===e)?null:(t=this.Hb[e],void 0===t?null:t.value)},i.get=function(t){return this.G(t)},i.remove=function(t){if(null===t)return!1;this.v&&k(this,t);var e=t;if(N(t)&&(e=st(t),void 0===e))return!1;if(t=this.Hb[e],void 0===t)return!1;var i=t.pa,n=t.Xl;return null!==i&&(i.Xl=n),null!==n&&(n.pa=i),this.ba===t&&(this.ba=i),this.$e===t&&(this.$e=n),delete this.Hb[e],this.Fb--,this.pb(),!0},i.delete=function(t){return this.remove(t)},i.clear=function(){this.v&&k(this),this.Hb={},this.Fb=0,null!==this.Ha&&this.Ha.reset(),null!==this.Ze&&this.Ze.reset(),this.$e=this.ba=null,this.pb()},dt.prototype.copy=function(){var t,e=new dt,i=this.Hb;for(t in i){var n=i[t];e.add(n.key,n.value)}return e},dt.prototype.ma=function(){var t,e=this.Hb,i=Array(this.Fb),n=0;for(t in e){var o=e[t];i[n]=new ct(o.key,o.value),n++}return i},dt.prototype.Kf=function(){return new lt(this)},d.Object.defineProperties(dt.prototype,{count:{get:function(){return this.Fb}},size:{get:function(){return this.Fb}},iterator:{get:function(){if(0>=this.count)return J;var t=this.Ha;return null!==t?(t.reset(),t):new ft(this)}},iteratorKeys:{get:function(){return 0>=this.count?J:new ht(this)}},iteratorValues:{get:function(){if(0>=this.count)return J;var t=this.Ze;return null!==t?(t.reset(),t):new ut(this)}}}),dt.prototype.toKeySet=dt.prototype.Kf,dt.prototype.toArray=dt.prototype.ma,dt.prototype.clear=dt.prototype.clear,dt.prototype["delete"]=dt.prototype.delete,dt.prototype.remove=dt.prototype.remove,dt.prototype.get=dt.prototype.get,dt.prototype.getValue=dt.prototype.G,dt.prototype.has=dt.prototype.has,dt.prototype.contains=dt.prototype.contains,dt.prototype.first=dt.prototype.first,dt.prototype.addAll=dt.prototype.addAll,dt.prototype.set=dt.prototype.set,dt.prototype.add=dt.prototype.add,dt.prototype.thaw=dt.prototype.ea,dt.prototype.freeze=dt.prototype.freeze,dt.className="Map",pt.prototype.assign=function(t){return this.x=t.x,this.y=t.y,this},pt.prototype.h=function(t,e){return this.x=t,this.y=e,this},pt.prototype.Ig=function(t,e){return this.x=t,this.y=e,this},pt.prototype.set=function(t){return this.x=t.x,this.y=t.y,this},pt.prototype.copy=function(){var t=new pt;return t.x=this.x,t.y=this.y,t},i=pt.prototype,i.ca=function(){return this.v=!0,Object.freeze(this),this},i.H=function(){return this.v||Object.isFrozen(this)?this:this.copy().freeze()},i.freeze=function(){return this.v=!0,this},i.ea=function(){return Object.isFrozen(this)&&w("cannot thaw constant: "+this),this.v=!1,this},i.toString=function(){return"Point("+this.x+","+this.y+")"},i.w=function(t){return t instanceof pt&&(this.x===t.x&&this.y===t.y)},i.fj=function(t,e){return this.x===t&&this.y===e},i.Qa=function(t){return _e.A(this.x,t.x)&&_e.A(this.y,t.y)},i.add=function(t){return this.x+=t.x,this.y+=t.y,this},i.ge=function(t){return this.x-=t.x,this.y-=t.y,this},i.offset=function(t,e){return this.x+=t,this.y+=e,this},pt.prototype.rotate=function(t){if(0===t)return this;var e=this.x,i=this.y;if(0===e&&0===i)return this;if(360<=t?t-=360:0>t&&(t+=360),90===t){t=0;var n=1}else 180===t?(t=-1,n=0):270===t?(t=0,n=-1):(n=t*Math.PI/180,t=Math.cos(n),n=Math.sin(n));return this.x=t*e-n*i,this.y=n*e+t*i,this},i=pt.prototype,i.scale=function(t,e){return this.x*=t,this.y*=e,this},i.Ie=function(t){var e=t.x-this.x;return t=t.y-this.y,e*e+t*t},i.qd=function(t,e){return t-=this.x,e-=this.y,t*t+e*e},i.normalize=function(){var t=this.x,e=this.y,i=Math.sqrt(t*t+e*e);return 0<i&&(this.x=t/i,this.y=e/i),this},i.Pa=function(t){return mt(t.x-this.x,t.y-this.y)},i.direction=function(t,e){return mt(t-this.x,e-this.y)},i.OA=function(t,e,i,n){return _e.Qh(t,e,i,n,this.x,this.y,this),this},i.PA=function(t,e){return _e.Qh(t.x,t.y,e.x,e.y,this.x,this.y,this),this},i.cB=function(t,e,i,n){return _e.Gq(this.x,this.y,t,e,i,n,this),this},i.dB=function(t,e){return _e.Gq(this.x,this.y,t.x,t.y,e.width,e.height,this),this},i.tj=function(t,e){return this.x=t.x+e.x*t.width+e.offsetX,this.y=t.y+e.y*t.height+e.offsetY,this},i.Uk=function(t,e,i,n,o){return this.x=t+o.x*i+o.offsetX,this.y=e+o.y*n+o.offsetY,this},i.transform=function(t){return t.ta(this),this},i.s=function(){return isFinite(this.x)&&isFinite(this.y)},pt.alloc=function(){var t=Ft.pop();return void 0===t?new pt:t},pt.allocAt=function(t,e){var i=Ft.pop();return void 0===i?new pt(t,e):(i.x=t,i.y=e,i)},pt.free=function(t){Ft.push(t)},pt.prototype.isReal=pt.prototype.s,pt.prototype.setSpot=pt.prototype.Uk,pt.prototype.setRectSpot=pt.prototype.tj,pt.prototype.snapToGridPoint=pt.prototype.dB,pt.prototype.snapToGrid=pt.prototype.cB,pt.prototype.projectOntoLineSegmentPoint=pt.prototype.PA,pt.prototype.projectOntoLineSegment=pt.prototype.OA,pt.intersectingLineSegments=function(t,e,i,n,o,r,s,a){return _e.Cm(t,e,i,n,o,r,s,a)},pt.prototype.direction=pt.prototype.direction,pt.prototype.directionPoint=pt.prototype.Pa,pt.prototype.normalize=pt.prototype.normalize,pt.prototype.distanceSquared=pt.prototype.qd,pt.prototype.distanceSquaredPoint=pt.prototype.Ie,pt.prototype.scale=pt.prototype.scale,pt.prototype.rotate=pt.prototype.rotate,pt.prototype.offset=pt.prototype.offset,pt.prototype.subtract=pt.prototype.ge,pt.prototype.add=pt.prototype.add,pt.prototype.equalsApprox=pt.prototype.Qa,pt.prototype.equalTo=pt.prototype.fj,pt.prototype.equals=pt.prototype.w,pt.prototype.set=pt.prototype.set,pt.prototype.setTo=pt.prototype.Ig;var kt,Mt,St,Pt,Nt,Ct,Tt,At=null,Lt=null,jt=null,Ot=null,Dt=null,Ft=[];function Bt(t,e){void 0===t?this.height=this.width=0:"number"===typeof t&&(0<=t||isNaN(t))&&"number"===typeof e&&(0<=e||isNaN(e))?(this.width=t,this.height=e):w("Invalid arguments to Size constructor: "+t+", "+e),this.v=!1}function It(t){if("string"===typeof t){t=t.split(" ");for(var e=0,i=0;""===t[e];)e++;var n=t[e++];n&&(i=parseFloat(n));for(var o=0;""===t[e];)e++;return(n=t[e++])&&(o=parseFloat(n)),new Bt(i,o)}return new Bt}function Et(t){return t.width.toString()+" "+t.height.toString()}pt.className="Point",pt.parse=gt,pt.stringify=yt,pt.distanceLineSegmentSquared=xt,pt.distanceSquared=bt,pt.direction=wt,pt.Origin=At=new pt(0,0).ca(),pt.InfiniteTopLeft=Lt=new pt(-1/0,-1/0).ca(),pt.InfiniteBottomRight=jt=new pt(1/0,1/0).ca(),pt.SixPoint=Ot=new pt(6,6).ca(),pt.NoPoint=Dt=new pt(NaN,NaN).ca(),pt.parse=gt,pt.stringify=yt,pt.distanceLineSegmentSquared=xt,pt.distanceSquared=bt,pt.direction=wt,Bt.prototype.assign=function(t){return this.width=t.width,this.height=t.height,this},Bt.prototype.h=function(t,e){return this.width=t,this.height=e,this},Bt.prototype.Ig=function(t,e){return this.width=t,this.height=e,this},Bt.prototype.set=function(t){return this.width=t.width,this.height=t.height,this},Bt.prototype.copy=function(){var t=new Bt;return t.width=this.width,t.height=this.height,t},i=Bt.prototype,i.ca=function(){return this.v=!0,Object.freeze(this),this},i.H=function(){return this.v||Object.isFrozen(this)?this:this.copy().freeze()},i.freeze=function(){return this.v=!0,this},i.ea=function(){return Object.isFrozen(this)&&w("cannot thaw constant: "+this),this.v=!1,this},i.toString=function(){return"Size("+this.width+","+this.height+")"},i.w=function(t){return t instanceof Bt&&(this.width===t.width&&this.height===t.height)},i.fj=function(t,e){return this.width===t&&this.height===e},i.Qa=function(t){return _e.A(this.width,t.width)&&_e.A(this.height,t.height)},i.s=function(){return isFinite(this.width)&&isFinite(this.height)},Bt.alloc=function(){var t=Rt.pop();return void 0===t?new Bt:t},Bt.free=function(t){Rt.push(t)},Bt.prototype.isReal=Bt.prototype.s,Bt.prototype.equalsApprox=Bt.prototype.Qa,Bt.prototype.equalTo=Bt.prototype.fj,Bt.prototype.equals=Bt.prototype.w,Bt.prototype.set=Bt.prototype.set,Bt.prototype.setTo=Bt.prototype.Ig;var Rt=[];function zt(t,e,i,n){void 0===t?this.height=this.width=this.y=this.x=0:t instanceof pt?(i=t.x,t=t.y,e instanceof pt?(n=e.x,e=e.y,this.x=Math.min(i,n),this.y=Math.min(t,e),this.width=Math.abs(i-n),this.height=Math.abs(t-e)):e instanceof Bt?(this.x=i,this.y=t,this.width=e.width,this.height=e.height):w("Incorrect arguments supplied to Rect constructor")):"number"===typeof t&&"number"===typeof e&&"number"===typeof i&&(0<=i||isNaN(i))&&"number"===typeof n&&(0<=n||isNaN(n))?(this.x=t,this.y=e,this.width=i,this.height=n):w("Invalid arguments to Rect constructor: "+t+", "+e+", "+i+", "+n),this.v=!1}function Vt(t,e,i){t.width=e,t.height=i}function Gt(t){if("string"===typeof t){t=t.split(" ");for(var e=0,i=0;""===t[e];)e++;var n=t[e++];n&&(i=parseFloat(n));for(var o=0;""===t[e];)e++;(n=t[e++])&&(o=parseFloat(n));for(var r=0;""===t[e];)e++;(n=t[e++])&&(r=parseFloat(n));for(var s=0;""===t[e];)e++;return(n=t[e++])&&(s=parseFloat(n)),new zt(i,o,r,s)}return new zt}function Yt(t){return t.x.toString()+" "+t.y.toString()+" "+t.width.toString()+" "+t.height.toString()}function Xt(t,e){return _e.aa(t.x,e.x)&&_e.aa(t.y,e.y)&&_e.aa(t.width,e.width)&&_e.aa(t.height,e.height)}function qt(t,e,i,n,o){var r=t.width;return i+o<=-r?(t.x+=r/2,t.width=0):(t.x-=o,t.width+=i+o),i=t.height,e+n<=-i?(t.y+=i/2,t.height=0):(t.y-=e,t.height+=e+n),t}function Ut(t,e,i,n,o){var r=Math.max(t.x,e),s=Math.max(t.y,i);return e=Math.min(t.x+t.width,e+n),i=Math.min(t.y+t.height,i+o),t.x=r,t.y=s,t.width=Math.max(0,e-r),t.height=Math.max(0,i-s),t}function Kt(t,e){var i=t.width,n=t.x,o=e.x-10;return!(n>e.width+10+10+o||o>i+n)&&(i=t.height,t=t.y,n=e.y-10,!(t>e.height+10+10+n||n>i+t))}function Ht(t,e,i,n,o){var r=Math.min(t.x,e),s=Math.min(t.y,i);return e=Math.max(t.x+t.width,e+n),i=Math.max(t.y+t.height,i+o),t.x=r,t.y=s,t.width=e-r,t.height=i-s,t}function _t(t,e,i,n,o,r,s,a){return void 0===s&&(s=0),void 0===a&&(a=0),t<=o&&o+s<=t+i&&e<=r&&r+a<=e+n}function Wt(t,e,i,n,o,r,s,a){return!(t>s+o||o>i+t)&&!(e>a+r||r>n+e)}Bt.className="Size",Bt.parse=It,Bt.stringify=Et,Bt.ZeroSize=kt=new Bt(0,0).ca(),Bt.OneSize=Mt=new Bt(1,1).ca(),Bt.SixSize=St=new Bt(6,6).ca(),Bt.EightSize=Pt=new Bt(8,8).ca(),Bt.TenSize=Nt=new Bt(10,10).ca(),Bt.InfiniteSize=Ct=new Bt(1/0,1/0).ca(),Bt.NoSize=Tt=new Bt(NaN,NaN).ca(),Bt.parse=It,Bt.stringify=Et,i=zt.prototype,i.assign=function(t){return this.x=t.x,this.y=t.y,this.width=t.width,this.height=t.height,this},i.h=function(t,e,i,n){return this.x=t,this.y=e,this.width=i,this.height=n,this},i.Ig=function(t,e,i,n){return this.x=t,this.y=e,this.width=i,this.height=n,this},i.set=function(t){return this.x=t.x,this.y=t.y,this.width=t.width,this.height=t.height,this},i.Qc=function(t){return this.x=t.x,this.y=t.y,this},i.bB=function(t){return this.width=t.width,this.height=t.height,this},zt.prototype.copy=function(){var t=new zt;return t.x=this.x,t.y=this.y,t.width=this.width,t.height=this.height,t},i=zt.prototype,i.ca=function(){return this.v=!0,Object.freeze(this),this},i.H=function(){return this.v||Object.isFrozen(this)?this:this.copy().freeze()},i.freeze=function(){return this.v=!0,this},i.ea=function(){return Object.isFrozen(this)&&w("cannot thaw constant: "+this),this.v=!1,this},i.toString=function(){return"Rect("+this.x+","+this.y+","+this.width+","+this.height+")"},i.w=function(t){return t instanceof zt&&(this.x===t.x&&this.y===t.y&&this.width===t.width&&this.height===t.height)},i.fj=function(t,e,i,n){return this.x===t&&this.y===e&&this.width===i&&this.height===n},i.Qa=function(t){return _e.A(this.x,t.x)&&_e.A(this.y,t.y)&&_e.A(this.width,t.width)&&_e.A(this.height,t.height)},i.$=function(t){return this.x<=t.x&&this.x+this.width>=t.x&&this.y<=t.y&&this.y+this.height>=t.y},i.Ge=function(t){return this.x<=t.x&&t.x+t.width<=this.x+this.width&&this.y<=t.y&&t.y+t.height<=this.y+this.height},i.contains=function(t,e,i,n){return void 0===i&&(i=0),void 0===n&&(n=0),this.x<=t&&t+i<=this.x+this.width&&this.y<=e&&e+n<=this.y+this.height},i.offset=function(t,e){return this.x+=t,this.y+=e,this},i.Jc=function(t,e){return qt(this,e,t,e,t)},i.uq=function(t){return qt(this,t.top,t.right,t.bottom,t.left)},i.Jw=function(t){return qt(this,-t.top,-t.right,-t.bottom,-t.left)},i.sA=function(t,e,i,n){return qt(this,t,e,i,n)},i.Dy=function(t){return Ut(this,t.x,t.y,t.width,t.height)},i.bw=function(t,e,i,n){return Ut(this,t,e,i,n)},i.Mc=function(t){return this.cw(t.x,t.y,t.width,t.height)},i.cw=function(t,e,i,n){var o=this.width,r=this.x;return!(1/0!==o&&1/0!==i&&(o+=r,i+=t,isNaN(i)||isNaN(o)||r>i||t>o))&&(t=this.height,i=this.y,!(1/0!==t&&1/0!==n&&(t+=i,n+=e,isNaN(n)||isNaN(t)||i>n||e>t)))},i.Oe=function(t){return Ht(this,t.x,t.y,0,0)},i.Rc=function(t){return Ht(this,t.x,t.y,t.width,t.height)},i.Rw=function(t,e,i,n){return void 0===i&&(i=0),void 0===n&&(n=0),Ht(this,t,e,i,n)},i.Uk=function(t,e,i){return this.x=t-i.offsetX-i.x*this.width,this.y=e-i.offsetY-i.y*this.height,this},i.s=function(){return isFinite(this.x)&&isFinite(this.y)&&isFinite(this.width)&&isFinite(this.height)},i.yA=function(){return 0===this.width&&0===this.height},zt.alloc=function(){var t=Zt.pop();return void 0===t?new zt:t},zt.allocAt=function(t,e,i,n){var o=Zt.pop();return void 0===o?new zt(t,e,i,n):o.h(t,e,i,n)},zt.free=function(t){Zt.push(t)},d.Object.defineProperties(zt.prototype,{left:{get:function(){return this.x},set:function(t){this.x=t}},top:{get:function(){return this.y},set:function(t){this.y=t}},right:{get:function(){return this.x+this.width},set:function(t){this.x+=t-(this.x+this.width)}},bottom:{get:function(){return this.y+this.height},set:function(t){this.y+=t-(this.y+this.height)}},position:{get:function(){return new pt(this.x,this.y)},set:function(t){this.x=t.x,this.y=t.y}},size:{get:function(){return new Bt(this.width,this.height)},set:function(t){this.width=t.width,this.height=t.height}},center:{get:function(){return new pt(this.x+this.width/2,this.y+this.height/2)},set:function(t){this.x=t.x-this.width/2,this.y=t.y-this.height/2}},centerX:{get:function(){return this.x+this.width/2},set:function(t){this.x=t-this.width/2}},centerY:{get:function(){return this.y+this.height/2},set:function(t){this.y=t-this.height/2}}}),zt.prototype.isEmpty=zt.prototype.yA,zt.prototype.isReal=zt.prototype.s,zt.intersectsLineSegment=function(t,e,i,n,o,r,s,a){return _e.Ey(t,e,i,n,o,r,s,a)},zt.prototype.setSpot=zt.prototype.Uk,zt.prototype.union=zt.prototype.Rw,zt.prototype.unionRect=zt.prototype.Rc,zt.prototype.unionPoint=zt.prototype.Oe,zt.prototype.intersects=zt.prototype.cw,zt.prototype.intersectsRect=zt.prototype.Mc,zt.prototype.intersect=zt.prototype.bw,zt.prototype.intersectRect=zt.prototype.Dy,zt.prototype.grow=zt.prototype.sA,zt.prototype.subtractMargin=zt.prototype.Jw,zt.prototype.addMargin=zt.prototype.uq,zt.prototype.inflate=zt.prototype.Jc,zt.prototype.offset=zt.prototype.offset,zt.prototype.contains=zt.prototype.contains,zt.prototype.containsRect=zt.prototype.Ge,zt.prototype.containsPoint=zt.prototype.$,zt.prototype.equalsApprox=zt.prototype.Qa,zt.prototype.equalTo=zt.prototype.fj,zt.prototype.equals=zt.prototype.w,zt.prototype.setSize=zt.prototype.bB,zt.prototype.setPoint=zt.prototype.Qc,zt.prototype.set=zt.prototype.set,zt.prototype.setTo=zt.prototype.Ig;var $t=null,Jt=null,Zt=[];function Qt(t,e,i,n){void 0===t?this.left=this.bottom=this.right=this.top=0:void 0===e?this.left=this.bottom=this.right=this.top=t:void 0===i?(this.top=t,this.right=e,this.bottom=t,this.left=e):void 0!==n?(this.top=t,this.right=e,this.bottom=i,this.left=n):w("Invalid arguments to Margin constructor: "+t+", "+e+", "+i+", "+n),this.v=!1}function te(t){if("string"===typeof t){t=t.split(" ");for(var e=0,i=NaN;""===t[e];)e++;var n=t[e++];if(n&&(i=parseFloat(n)),isNaN(i))return new Qt;for(var o=NaN;""===t[e];)e++;if((n=t[e++])&&(o=parseFloat(n)),isNaN(o))return new Qt(i);for(var r=NaN;""===t[e];)e++;if((n=t[e++])&&(r=parseFloat(n)),isNaN(r))return new Qt(i,o);for(var s=NaN;""===t[e];)e++;return(n=t[e++])&&(s=parseFloat(n)),isNaN(s)?new Qt(i,o):new Qt(i,o,r,s)}return new Qt}function ee(t){return t.top.toString()+" "+t.right.toString()+" "+t.bottom.toString()+" "+t.left.toString()}zt.className="Rect",zt.parse=Gt,zt.stringify=Yt,zt.contains=_t,zt.intersects=Wt,zt.ZeroRect=$t=new zt(0,0,0,0).ca(),zt.NoRect=Jt=new zt(NaN,NaN,NaN,NaN).ca(),zt.parse=Gt,zt.stringify=Yt,zt.contains=_t,zt.intersects=Wt,Qt.prototype.assign=function(t){return this.top=t.top,this.right=t.right,this.bottom=t.bottom,this.left=t.left,this},Qt.prototype.Ig=function(t,e,i,n){return this.top=t,this.right=e,this.bottom=i,this.left=n,this},Qt.prototype.set=function(t){return this.top=t.top,this.right=t.right,this.bottom=t.bottom,this.left=t.left,this},Qt.prototype.copy=function(){var t=new Qt;return t.top=this.top,t.right=this.right,t.bottom=this.bottom,t.left=this.left,t},i=Qt.prototype,i.ca=function(){return this.v=!0,Object.freeze(this),this},i.H=function(){return this.v||Object.isFrozen(this)?this:this.copy().freeze()},i.freeze=function(){return this.v=!0,this},i.ea=function(){return Object.isFrozen(this)&&w("cannot thaw constant: "+this),this.v=!1,this},i.toString=function(){return"Margin("+this.top+","+this.right+","+this.bottom+","+this.left+")"},i.w=function(t){return t instanceof Qt&&(this.top===t.top&&this.right===t.right&&this.bottom===t.bottom&&this.left===t.left)},i.fj=function(t,e,i,n){return this.top===t&&this.right===e&&this.bottom===i&&this.left===n},i.Qa=function(t){return _e.A(this.top,t.top)&&_e.A(this.right,t.right)&&_e.A(this.bottom,t.bottom)&&_e.A(this.left,t.left)},i.s=function(){return isFinite(this.top)&&isFinite(this.right)&&isFinite(this.bottom)&&isFinite(this.left)},Qt.alloc=function(){var t=Ve.pop();return void 0===t?new Qt:t},Qt.free=function(t){Ve.push(t)},Qt.prototype.isReal=Qt.prototype.s,Qt.prototype.equalsApprox=Qt.prototype.Qa,Qt.prototype.equalTo=Qt.prototype.fj,Qt.prototype.equals=Qt.prototype.w,Qt.prototype.set=Qt.prototype.set,Qt.prototype.setTo=Qt.prototype.Ig;var ie,ne,oe,re,se,ae,he,le,ue,ce,fe,de,pe,ge,ye,me,ve,xe,be,we,ke,Me,Se,Pe,Ne,Ce,Te,Ae,Le,je,Oe,De,Fe,Be,Ie,Ee,Re=null,ze=null,Ve=[];function Ge(t,e,i,n){void 0===t?this.offsetY=this.offsetX=this.y=this.x=0:(void 0===e&&(e=0),void 0===i&&(i=0),void 0===n&&(n=0),this.x=t,this.y=e,this.offsetX=i,this.offsetY=n),this.v=!1}function Ye(t,e){return t.x=NaN,t.y=NaN,t.offsetX=e,t}function Xe(t){if("string"===typeof t){if(t=t.trim(),"None"===t)return ie;if("TopLeft"===t)return ne;if("Top"===t||"TopCenter"===t||"MiddleTop"===t)return oe;if("TopRight"===t)return re;if("Left"===t||"LeftCenter"===t||"MiddleLeft"===t)return se;if("Center"===t)return ae;if("Right"===t||"RightCenter"===t||"MiddleRight"===t)return he;if("BottomLeft"===t)return le;if("Bottom"===t||"BottomCenter"===t||"MiddleBottom"===t)return ue;if("BottomRight"===t)return ce;if("TopSide"===t)return fe;if("LeftSide"===t)return de;if("RightSide"===t)return pe;if("BottomSide"===t)return ge;if("TopBottomSides"===t)return ye;if("LeftRightSides"===t)return me;if("TopLeftSides"===t)return ve;if("TopRightSides"===t)return xe;if("BottomLeftSides"===t)return be;if("BottomRightSides"===t)return we;if("NotTopSide"===t)return ke;if("NotLeftSide"===t)return Me;if("NotRightSide"===t)return Se;if("NotBottomSide"===t)return Pe;if("AllSides"===t)return Ne;if("Default"===t)return Ce;t=t.split(" ");for(var e=0,i=0;""===t[e];)e++;var n=t[e++];void 0!==n&&0<n.length&&(i=parseFloat(n));for(var o=0;""===t[e];)e++;n=t[e++],void 0!==n&&0<n.length&&(o=parseFloat(n));for(var r=0;""===t[e];)e++;n=t[e++],void 0!==n&&0<n.length&&(r=parseFloat(n));for(var s=0;""===t[e];)e++;return n=t[e++],void 0!==n&&0<n.length&&(s=parseFloat(n)),new Ge(i,o,r,s)}return new Ge}function qe(t){return t.kb()?t.x.toString()+" "+t.y.toString()+" "+t.offsetX.toString()+" "+t.offsetY.toString():t.toString()}Qt.className="Margin",Qt.parse=te,Qt.stringify=ee,Qt.ZeroMargin=Re=new Qt(0,0,0,0).ca(),Qt.TwoMargin=ze=new Qt(2,2,2,2).ca(),Qt.parse=te,Qt.stringify=ee,Ge.prototype.assign=function(t){return this.x=t.x,this.y=t.y,this.offsetX=t.offsetX,this.offsetY=t.offsetY,this},Ge.prototype.Ig=function(t,e,i,n){return this.x=t,this.y=e,this.offsetX=i,this.offsetY=n,this},Ge.prototype.set=function(t){return this.x=t.x,this.y=t.y,this.offsetX=t.offsetX,this.offsetY=t.offsetY,this},Ge.prototype.copy=function(){var t=new Ge;return t.x=this.x,t.y=this.y,t.offsetX=this.offsetX,t.offsetY=this.offsetY,t},i=Ge.prototype,i.ca=function(){return this.v=!0,Object.freeze(this),this},i.H=function(){return this.v||Object.isFrozen(this)?this:this.copy().freeze()},i.freeze=function(){return this.v=!0,this},i.ea=function(){return Object.isFrozen(this)&&w("cannot thaw constant: "+this),this.v=!1,this},i.toString=function(){return this.kb()?0===this.offsetX&&0===this.offsetY?"Spot("+this.x+","+this.y+")":"Spot("+this.x+","+this.y+","+this.offsetX+","+this.offsetY+")":this.w(ie)?"None":this.w(ne)?"TopLeft":this.w(oe)?"Top":this.w(re)?"TopRight":this.w(se)?"Left":this.w(ae)?"Center":this.w(he)?"Right":this.w(le)?"BottomLeft":this.w(ue)?"Bottom":this.w(ce)?"BottomRight":this.w(fe)?"TopSide":this.w(de)?"LeftSide":this.w(pe)?"RightSide":this.w(ge)?"BottomSide":this.w(ye)?"TopBottomSides":this.w(me)?"LeftRightSides":this.w(ve)?"TopLeftSides":this.w(xe)?"TopRightSides":this.w(be)?"BottomLeftSides":this.w(we)?"BottomRightSides":this.w(ke)?"NotTopSide":this.w(Me)?"NotLeftSide":this.w(Se)?"NotRightSide":this.w(Pe)?"NotBottomSide":this.w(Ne)?"AllSides":this.w(Ce)?"Default":"None"},i.w=function(t){return t instanceof Ge&&((this.x===t.x||isNaN(this.x)&&isNaN(t.x))&&(this.y===t.y||isNaN(this.y)&&isNaN(t.y))&&this.offsetX===t.offsetX&&this.offsetY===t.offsetY)},i.mw=function(){return new Ge(.5-(this.x-.5),.5-(this.y-.5),-this.offsetX,-this.offsetY)},i.Ef=function(t){if(!this.Oc())return!1;if(!t.Oc())if(t.w(Te))t=de;else if(t.w(Ae))t=pe;else if(t.w(Le))t=fe;else{if(!t.w(je))return!1;t=ge}return t=t.offsetY,(this.offsetY&t)===t},i.kb=function(){return!isNaN(this.x)&&!isNaN(this.y)},i.nc=function(){return isNaN(this.x)||isNaN(this.y)},i.Oc=function(){return isNaN(this.x)&&isNaN(this.y)&&1===this.offsetX&&0!==this.offsetY},i.Vt=function(){return isNaN(this.x)&&isNaN(this.y)&&0===this.offsetX&&0===this.offsetY},i.Mb=function(){return isNaN(this.x)&&isNaN(this.y)&&-1===this.offsetX&&0===this.offsetY},Ge.alloc=function(){var t=Ue.pop();return void 0===t?new Ge:t},Ge.free=function(t){Ue.push(t)},Ge.prototype.isDefault=Ge.prototype.Mb,Ge.prototype.isNone=Ge.prototype.Vt,Ge.prototype.isSide=Ge.prototype.Oc,Ge.prototype.isNoSpot=Ge.prototype.nc,Ge.prototype.isSpot=Ge.prototype.kb,Ge.prototype.includesSide=Ge.prototype.Ef,Ge.prototype.opposite=Ge.prototype.mw,Ge.prototype.equals=Ge.prototype.w,Ge.prototype.set=Ge.prototype.set,Ge.prototype.setTo=Ge.prototype.Ig;var Ue=[];function Ke(){this.m11=1,this.m21=this.m12=0,this.m22=1,this.dy=this.dx=0}Ge.className="Spot",Ge.parse=Xe,Ge.stringify=qe,Ge.None=ie=Ye(new Ge(0,0,0,0),0).ca(),Ge.Default=Ce=Ye(new Ge(0,0,-1,0),-1).ca(),Ge.TopLeft=ne=new Ge(0,0,0,0).ca(),Ge.TopCenter=oe=new Ge(.5,0,0,0).ca(),Ge.TopRight=re=new Ge(1,0,0,0).ca(),Ge.LeftCenter=se=new Ge(0,.5,0,0).ca(),Ge.Center=ae=new Ge(.5,.5,0,0).ca(),Ge.RightCenter=he=new Ge(1,.5,0,0).ca(),Ge.BottomLeft=le=new Ge(0,1,0,0).ca(),Ge.BottomCenter=ue=new Ge(.5,1,0,0).ca(),Ge.BottomRight=ce=new Ge(1,1,0,0).ca(),Ge.MiddleTop=Oe=oe,Ge.MiddleLeft=De=se,Ge.MiddleRight=Fe=he,Ge.MiddleBottom=Be=ue,Ge.Top=Le=oe,Ge.Left=Te=se,Ge.Right=Ae=he,Ge.Bottom=je=ue,Ge.TopSide=fe=Ye(new Ge(0,0,1,1),1).ca(),Ge.LeftSide=de=Ye(new Ge(0,0,1,2),1).ca(),Ge.RightSide=pe=Ye(new Ge(0,0,1,4),1).ca(),Ge.BottomSide=ge=Ye(new Ge(0,0,1,8),1).ca(),Ge.TopBottomSides=ye=Ye(new Ge(0,0,1,9),1).ca(),Ge.LeftRightSides=me=Ye(new Ge(0,0,1,6),1).ca(),Ge.TopLeftSides=ve=Ye(new Ge(0,0,1,3),1).ca(),Ge.TopRightSides=xe=Ye(new Ge(0,0,1,5),1).ca(),Ge.BottomLeftSides=be=Ye(new Ge(0,0,1,10),1).ca(),Ge.BottomRightSides=we=Ye(new Ge(0,0,1,12),1).ca(),Ge.NotTopSide=ke=Ye(new Ge(0,0,1,14),1).ca(),Ge.NotLeftSide=Me=Ye(new Ge(0,0,1,13),1).ca(),Ge.NotRightSide=Se=Ye(new Ge(0,0,1,11),1).ca(),Ge.NotBottomSide=Pe=Ye(new Ge(0,0,1,7),1).ca(),Ge.AllSides=Ne=Ye(new Ge(0,0,1,15),1).ca(),Ie=new Ge(.156,.156).ca(),Ee=new Ge(.844,.844).ca(),Ge.parse=Xe,Ge.stringify=qe,Ke.prototype.set=function(t){return this.m11=t.m11,this.m12=t.m12,this.m21=t.m21,this.m22=t.m22,this.dx=t.dx,this.dy=t.dy,this},Ke.prototype.copy=function(){var t=new Ke;return t.m11=this.m11,t.m12=this.m12,t.m21=this.m21,t.m22=this.m22,t.dx=this.dx,t.dy=this.dy,t},Ke.prototype.toString=function(){return"Transform("+this.m11+","+this.m12+","+this.m21+","+this.m22+","+this.dx+","+this.dy+")"},Ke.prototype.w=function(t){return this.m11===t.m11&&this.m12===t.m12&&this.m21===t.m21&&this.m22===t.m22&&this.dx===t.dx&&this.dy===t.dy},Ke.prototype.Tt=function(){return 0===this.dx&&0===this.dy&&1===this.m11&&0===this.m12&&0===this.m21&&1===this.m22},Ke.prototype.reset=function(){return this.m11=1,this.m21=this.m12=0,this.m22=1,this.dy=this.dx=0,this},Ke.prototype.multiply=function(t){var e=this.m11*t.m11+this.m21*t.m12,i=this.m12*t.m11+this.m22*t.m12,n=this.m11*t.m21+this.m21*t.m22,o=this.m12*t.m21+this.m22*t.m22;return this.dx=this.m11*t.dx+this.m21*t.dy+this.dx,this.dy=this.m12*t.dx+this.m22*t.dy+this.dy,this.m11=e,this.m12=i,this.m21=n,this.m22=o,this},Ke.prototype.jw=function(t){var e=1/(t.m11*t.m22-t.m12*t.m21),i=t.m22*e,n=-t.m12*e,o=-t.m21*e,r=t.m11*e,s=e*(t.m21*t.dy-t.m22*t.dx);return t=e*(t.m12*t.dx-t.m11*t.dy),e=this.m11*i+this.m21*n,i=this.m12*i+this.m22*n,n=this.m11*o+this.m21*r,o=this.m12*o+this.m22*r,this.dx=this.m11*s+this.m21*t+this.dx,this.dy=this.m12*s+this.m22*t+this.dy,this.m11=e,this.m12=i,this.m21=n,this.m22=o,this},Ke.prototype.St=function(){var t=1/(this.m11*this.m22-this.m12*this.m21),e=-this.m12*t,i=-this.m21*t,n=this.m11*t,o=t*(this.m21*this.dy-this.m22*this.dx),r=t*(this.m12*this.dx-this.m11*this.dy);return this.m11=this.m22*t,this.m12=e,this.m21=i,this.m22=n,this.dx=o,this.dy=r,this},Ke.prototype.rotate=function(t,e,i){if(360<=t?t-=360:0>t&&(t+=360),0===t)return this;if(this.translate(e,i),90===t){t=0;var n=1}else 180===t?(t=-1,n=0):270===t?(t=0,n=-1):(n=t*Math.PI/180,t=Math.cos(n),n=Math.sin(n));var o=this.m12*t+this.m22*n,r=this.m11*-n+this.m21*t,s=this.m12*-n+this.m22*t;return this.m11=this.m11*t+this.m21*n,this.m12=o,this.m21=r,this.m22=s,this.translate(-e,-i),this},i=Ke.prototype,i.translate=function(t,e){return this.dx+=this.m11*t+this.m21*e,this.dy+=this.m12*t+this.m22*e,this},i.scale=function(t,e){return void 0===e&&(e=t),this.m11*=t,this.m12*=t,this.m21*=e,this.m22*=e,this},i.ta=function(t){var e=t.x,i=t.y;return t.h(e*this.m11+i*this.m21+this.dx,e*this.m12+i*this.m22+this.dy)},i.Jd=function(t){var e=1/(this.m11*this.m22-this.m12*this.m21),i=t.x,n=t.y;return t.h(i*this.m22*e+n*-this.m21*e+e*(this.m21*this.dy-this.m22*this.dx),i*-this.m12*e+n*this.m11*e+e*(this.m12*this.dx-this.m11*this.dy))},i.Zx=function(t){var e=1/(this.m11*this.m22-this.m12*this.m21),i=1.25*t.x,n=1.2*t.y;return t.h(i*this.m22*e+n*-this.m21*e+e*(this.m21*this.dy-this.m22*this.dx),i*-this.m12*e+n*this.m11*e+e*(this.m12*this.dx-this.m11*this.dy))},i.Pw=function(t){var e=t.x,i=t.y,n=e+t.width,o=i+t.height,r=this.m11,s=this.m12,a=this.m21,h=this.m22,l=this.dx,u=this.dy,c=e*r+i*a+l,f=e*s+i*h+u,d=n*r+i*a+l,p=n*s+i*h+u;return i=e*r+o*a+l,e=e*s+o*h+u,r=n*r+o*a+l,n=n*s+o*h+u,o=Math.min(c,d),c=Math.max(c,d),d=Math.min(f,p),f=Math.max(f,p),o=Math.min(o,i),c=Math.max(c,i),d=Math.min(d,e),f=Math.max(f,e),o=Math.min(o,r),c=Math.max(c,r),d=Math.min(d,n),f=Math.max(f,n),t.h(o,d,c-o,f-d),t},Ke.alloc=function(){var t=He.pop();return void 0===t?new Ke:t},Ke.free=function(t){He.push(t)},Ke.prototype.transformRect=Ke.prototype.Pw,Ke.prototype.transformPoint=Ke.prototype.ta,Ke.prototype.scale=Ke.prototype.scale,Ke.prototype.translate=Ke.prototype.translate,Ke.prototype.rotate=Ke.prototype.rotate,Ke.prototype.invert=Ke.prototype.St,Ke.prototype.multiplyInverted=Ke.prototype.jw,Ke.prototype.multiply=Ke.prototype.multiply,Ke.prototype.reset=Ke.prototype.reset,Ke.prototype.isIdentity=Ke.prototype.Tt,Ke.prototype.equals=Ke.prototype.w,Ke.prototype.set=Ke.prototype.set;var He=[];Ke.className="Transform",Ke.xF="54a702f3e53909c447824c6706603faf4c";var _e={lB:"7da71ca0ad381e90",Kg:(Math.sqrt(2)-1)/3*4,jx:null,sqrt:function(t){if(0>=t)return 0;var e=_e.jx;if(null===e){e=[];for(var i=0;2e3>=i;i++)e[i]=Math.sqrt(i);_e.jx=e}return 1>t?(i=1/t,2e3>=i?1/e[0|i]:Math.sqrt(t)):2e3>=t?e[0|t]:Math.sqrt(t)},A:function(t,e){return t-=e,.5>t&&-.5<t},aa:function(t,e){return t-=e,5e-8>t&&-5e-8<t},Nb:function(t,e,i,n,o,r,s){if(0>=o&&(o=1e-6),t<i)var a=t,h=i;else a=i,h=t;if(e<n)var l=e,u=n;else l=n,u=e;if(t===i)return l<=s&&s<=u&&t-o<=r&&r<=t+o;if(e===n)return a<=r&&r<=h&&e-o<=s&&s<=e+o;if(h+=o,a-=o,a<=r&&r<=h&&(u+=o,l-=o,l<=s&&s<=u))if(h-a>u-l){if(!(t-i>o||i-t>o))return!0;if(r=(n-e)/(i-t)*(r-t)+e,r-o<=s&&s<=r+o)return!0}else{if(!(e-n>o||n-e>o))return!0;if(s=(i-t)/(n-e)*(s-e)+t,s-o<=r&&r<=s+o)return!0}return!1},yt:function(t,e,i,n,o,r,s,a,h,l,u,c){if(_e.Nb(t,e,s,a,c,i,n)&&_e.Nb(t,e,s,a,c,o,r))return _e.Nb(t,e,s,a,c,l,u);var f=(t+i)/2,d=(e+n)/2,p=(i+o)/2,g=(n+r)/2;o=(o+s)/2,r=(r+a)/2,n=(f+p)/2,i=(d+g)/2,p=(p+o)/2,g=(g+r)/2;var y=(n+p)/2,m=(i+g)/2;return _e.yt(t,e,f,d,n,i,y,m,h,l,u,c)||_e.yt(y,m,p,g,o,r,s,a,h,l,u,c)},yz:function(t,e,i,n,o,r,s,a,h){var l=(i+o)/2,u=(n+r)/2;return h.h((((t+i)/2+l)/2+(l+(o+s)/2)/2)/2,(((e+n)/2+u)/2+(u+(r+a)/2)/2)/2),h},xz:function(t,e,i,n,o,r,s,a){var h=(i+o)/2,l=(n+r)/2;return wt(((t+i)/2+h)/2,((e+n)/2+l)/2,(h+(o+s)/2)/2,(l+(r+a)/2)/2)},vm:function(t,e,i,n,o,r,s,a,h,l){if(_e.Nb(t,e,s,a,h,i,n)&&_e.Nb(t,e,s,a,h,o,r))Ht(l,t,e,0,0),Ht(l,s,a,0,0);else{var u=(t+i)/2,c=(e+n)/2,f=(i+o)/2,d=(n+r)/2;o=(o+s)/2,r=(r+a)/2,n=(u+f)/2,i=(c+d)/2,f=(f+o)/2,d=(d+r)/2;var p=(n+f)/2,g=(i+d)/2;_e.vm(t,e,u,c,n,i,p,g,h,l),_e.vm(p,g,f,d,o,r,s,a,h,l)}return l},Fe:function(t,e,i,n,o,r,s,a,h,l){if(_e.Nb(t,e,s,a,h,i,n)&&_e.Nb(t,e,s,a,h,o,r))0===l.length&&(l.push(t),l.push(e)),l.push(s),l.push(a);else{var u=(t+i)/2,c=(e+n)/2,f=(i+o)/2,d=(n+r)/2;o=(o+s)/2,r=(r+a)/2,n=(u+f)/2,i=(c+d)/2,f=(f+o)/2,d=(d+r)/2;var p=(n+f)/2,g=(i+d)/2;_e.Fe(t,e,u,c,n,i,p,g,h,l),_e.Fe(p,g,f,d,o,r,s,a,h,l)}return l},qw:function(t,e,i,n,o,r,s,a,h,l){if(_e.Nb(t,e,o,r,l,i,n))return _e.Nb(t,e,o,r,l,a,h);var u=(t+i)/2,c=(e+n)/2;i=(i+o)/2,n=(n+r)/2;var f=(u+i)/2,d=(c+n)/2;return _e.qw(t,e,u,c,f,d,s,a,h,l)||_e.qw(f,d,i,n,o,r,s,a,h,l)},AB:function(t,e,i,n,o,r,s){return s.h(((t+i)/2+(i+o)/2)/2,((e+n)/2+(n+r)/2)/2),s},pw:function(t,e,i,n,o,r,s,a){if(_e.Nb(t,e,o,r,s,i,n))Ht(a,t,e,0,0),Ht(a,o,r,0,0);else{var h=(t+i)/2,l=(e+n)/2;i=(i+o)/2,n=(n+r)/2;var u=(h+i)/2,c=(l+n)/2;_e.pw(t,e,h,l,u,c,s,a),_e.pw(u,c,i,n,o,r,s,a)}return a},Vq:function(t,e,i,n,o,r,s,a){if(_e.Nb(t,e,o,r,s,i,n))0===a.length&&(a.push(t),a.push(e)),a.push(o),a.push(r);else{var h=(t+i)/2,l=(e+n)/2;i=(i+o)/2,n=(n+r)/2;var u=(h+i)/2,c=(l+n)/2;_e.Vq(t,e,h,l,u,c,s,a),_e.Vq(u,c,i,n,o,r,s,a)}return a},wq:function(t,e,i,n,o,r,s,a,h,l,u,c,f,d){if(_e.Nb(t,e,s,a,f,i,n)&&_e.Nb(t,e,s,a,f,o,r))return!!_e.Cm(t,e,s,a,h,l,u,c)&&(f=(t-s)*(l-c)-(e-a)*(h-u),0!==f&&(d.h(((t*a-e*s)*(h-u)-(t-s)*(h*c-l*u))/f,((t*a-e*s)*(l-c)-(e-a)*(h*c-l*u))/f),!0));var p=(t+i)/2,g=(e+n)/2,y=(i+o)/2,m=(n+r)/2;o=(o+s)/2,r=(r+a)/2,n=(p+y)/2,i=(g+m)/2,y=(y+o)/2,m=(m+r)/2;var v=(n+y)/2,x=(i+m)/2,b=1/0,w=!1,k=0,M=0;return _e.wq(t,e,p,g,n,i,v,x,h,l,u,c,f,d)&&(t=(d.x-h)*(d.x-h)+(d.y-l)*(d.y-l),t<b&&(b=t,w=!0,k=d.x,M=d.y)),_e.wq(v,x,y,m,o,r,s,a,h,l,u,c,f,d)&&(d.x-h)*(d.x-h)+(d.y-l)*(d.y-l)<b&&(w=!0,k=d.x,M=d.y),w&&(d.x=k,d.y=M),w},xq:function(t,e,i,n,o,r,s,a,h,l,u,c,f){var d=0;if(_e.Nb(t,e,s,a,f,i,n)&&_e.Nb(t,e,s,a,f,o,r)){if(f=(t-s)*(l-c)-(e-a)*(h-u),0===f)return d;var p=((t*a-e*s)*(h-u)-(t-s)*(h*c-l*u))/f,g=((t*a-e*s)*(l-c)-(e-a)*(h*c-l*u))/f;if(p>=u)return d;if((h>u?h-u:u-h)<(l>c?l-c:c-l)){if(e<a?(t=e,e=a):t=a,g<t||g>e)return d}else if(t<s?(e=t,t=s):e=s,p<e||p>t)return d;0<f?d++:0>f&&d--}else{p=(t+i)/2,g=(e+n)/2;var y=(i+o)/2,m=(n+r)/2;o=(o+s)/2,r=(r+a)/2,n=(p+y)/2,i=(g+m)/2,y=(y+o)/2,m=(m+r)/2;var v=(n+y)/2,x=(i+m)/2;d+=_e.xq(t,e,p,g,n,i,v,x,h,l,u,c,f),d+=_e.xq(v,x,y,m,o,r,s,a,h,l,u,c,f)}return d},Qh:function(t,e,i,n,o,r,s){return _e.aa(t,i)?(e<n?(i=e,e=n):i=n,r<i?(s.h(t,i),!1):r>e?(s.h(t,e),!1):(s.h(t,r),!0)):_e.aa(e,n)?(t<i?(n=t,t=i):n=i,o<n?(s.h(n,e),!1):o>t?(s.h(t,e),!1):(s.h(o,e),!0)):(o=((t-o)*(t-i)+(e-r)*(e-n))/((i-t)*(i-t)+(n-e)*(n-e)),-5e-6>o?(s.h(t,e),!1):1.000005<o?(s.h(i,n),!1):(s.h(t+o*(i-t),e+o*(n-e)),!0))},Me:function(t,e,i,n,o,r,s,a,h){return _e.A(t,i)&&_e.A(e,n)?(h.h(t,e),!1):_e.aa(o,s)?_e.aa(t,i)?(_e.Qh(t,e,i,n,o,r,h),!1):_e.Qh(t,e,i,n,o,(n-e)/(i-t)*(o-t)+e,h):(a=(a-r)/(s-o),_e.aa(t,i)?(i=a*(t-o)+r,e<n?(o=e,e=n):o=n,i<o?(h.h(t,o),!1):i>e?(h.h(t,e),!1):(h.h(t,i),!0)):(s=(n-e)/(i-t),_e.aa(a,s)?(_e.Qh(t,e,i,n,o,r,h),!1):(o=(s*t-a*o+r-e)/(s-a),_e.aa(s,0)?(t<i?(n=t,t=i):n=i,o<n?(h.h(n,e),!1):o>t?(h.h(t,e),!1):(h.h(o,e),!0)):_e.Qh(t,e,i,n,o,s*(o-t)+e,h))))},yB:function(t,e,i,n,o){return _e.Me(i.x,i.y,n.x,n.y,t.x,t.y,e.x,e.y,o)},wB:function(t,e,i,n,o,r,s,a,h,l){function u(i,n){var o=(i-t)*(i-t)+(n-e)*(n-e);o<c&&(c=o,h.h(i,n))}var c=1/0;u(h.x,h.y);var f=0,d=0,p=0,g=0;if(o<s?(f=o,d=s):(f=s,d=o),r<a?(p=o,g=s):(p=s,g=o),f=(d-f)/2+l,l=(g-p)/2+l,o=(o+s)/2,r=(r+a)/2,0===f||0===l)return h;if(.5>(i>t?i-t:t-i)){if(f=1-(i-o)*(i-o)/(f*f),0>f)return h;f=Math.sqrt(f),n=-l*f+r,u(i,l*f+r),u(i,n)}else{if(i=(n-e)/(i-t),n=1/(f*f)+i*i/(l*l),a=2*i*(e-i*t)/(l*l)-2*i*r/(l*l)-2*o/(f*f),f=a*a-4*n*(2*i*t*r/(l*l)-2*e*r/(l*l)+r*r/(l*l)+o*o/(f*f)-1+(e-i*t)*(e-i*t)/(l*l)),0>f)return h;f=Math.sqrt(f),l=(-a+f)/(2*n),u(l,i*l-i*t+e),f=(-a-f)/(2*n),u(f,i*f-i*t+e)}return h},Cf:function(t,e,i,n,o,r,s,a,h){var l=1e21,u=t,c=e;if(_e.Me(t,e,t,n,o,r,s,a,h)){var f=(h.x-o)*(h.x-o)+(h.y-r)*(h.y-r);f<l&&(l=f,u=h.x,c=h.y)}return _e.Me(i,e,i,n,o,r,s,a,h)&&(f=(h.x-o)*(h.x-o)+(h.y-r)*(h.y-r),f<l&&(l=f,u=h.x,c=h.y)),_e.Me(t,e,i,e,o,r,s,a,h)&&(e=(h.x-o)*(h.x-o)+(h.y-r)*(h.y-r),e<l&&(l=e,u=h.x,c=h.y)),_e.Me(t,n,i,n,o,r,s,a,h)&&(t=(h.x-o)*(h.x-o)+(h.y-r)*(h.y-r),t<l&&(l=t,u=h.x,c=h.y)),h.h(u,c),1e21>l},vB:function(t,e,i,n,o,r,s,a,h){return i=t-i,s=o-s,0===i||0===s?0===i?(e=(r-a)/s,a=t,o=e*a+(r-e*o)):(r=(e-n)/i,a=o,o=r*a+(e-r*t)):(n=(e-n)/i,a=(r-a)/s,t=e-n*t,a=(r-a*o-t)/(n-a),o=n*a+t),h.h(a,o),h},Qt:function(t,e,i){return _e.Ey(t.x,t.y,t.width,t.height,e.x,e.y,i.x,i.y)},Ey:function(t,e,i,n,o,r,s,a){var h=t+i,l=e+n;return o===s?(r<a?(s=r,r=a):s=a,t<=o&&o<=h&&s<=l&&r>=e):r===a?(o<s?(a=o,o=s):a=s,e<=r&&r<=l&&a<=h&&o>=t):!!(_t(t,e,i,n,o,r)||_t(t,e,i,n,s,a)||_e.Cm(t,e,h,e,o,r,s,a)||_e.Cm(h,e,h,l,o,r,s,a)||_e.Cm(h,l,t,l,o,r,s,a)||_e.Cm(t,l,t,e,o,r,s,a))},Cm:function(t,e,i,n,o,r,s,a){return 0>=_e.Bt(t,e,i,n,o,r)*_e.Bt(t,e,i,n,s,a)&&0>=_e.Bt(o,r,s,a,t,e)*_e.Bt(o,r,s,a,i,n)},Bt:function(t,e,i,n,o,r){return i-=t,n-=e,t=o-t,e=r-e,r=t*n-e*i,0===r&&(r=t*i+e*n,0<r&&(r=(t-i)*i+(e-n)*n,0>r&&(r=0))),0>r?-1:0<r?1:0},Tq:function(t){return 0>t&&(t+=360),360<=t&&(t-=360),t},hy:function(t,e,i,n,o,r){var s=Math.PI;r||(n*=s/180,o*=s/180);var a=n>o?-1:1;r=[];var h=s/2,l=n;if(n=Math.min(2*s,Math.abs(o-n)),1e-5>n)return h=l+a*Math.min(n,h),a=t+i*Math.cos(l),l=e+i*Math.sin(l),t+=i*Math.cos(h),e+=i*Math.sin(h),i=(a+t)/2,h=(l+e)/2,r.push([a,l,i,h,i,h,t,e]),r;for(;1e-5<n;)o=l+a*Math.min(n,h),r.push(_e.Hz(i,l,o,t,e)),n-=Math.abs(o-l),l=o;return r},Hz:function(t,e,i,n,o){var r=(i-e)/2,s=t*Math.cos(r),a=t*Math.sin(r),h=-a,l=s*s+h*h,u=l+s*s+h*a;return l=4/3*(Math.sqrt(2*l*u)-u)/(s*a-h*s),a=s-l*h,s=h+l*s,h=-s,l=r+e,r=Math.cos(l),l=Math.sin(l),[n+t*Math.cos(e),o+t*Math.sin(e),n+a*r-s*l,o+a*l+s*r,n+a*r-h*l,o+a*l+h*r,n+t*Math.cos(i),o+t*Math.sin(i)]},Gq:function(t,e,i,n,o,r,s){i=Math.floor((t-i)/o)*o+i,n=Math.floor((e-n)/r)*r+n;var a=i;return i+o-t<o/2&&(a=i+o),t=n,n+r-e<r/2&&(t=n+r),s.h(a,t),s},uy:function(t,e){var i,n=Math.max(t,e);t=Math.min(t,e);do{e=n%t,n=i=t,t=e}while(0<e);return i},Mz:function(t,e,i,n){var o=0>i,r=0>n;if(t<e)var s=1,a=0;else s=0,a=1;var h=0===s?t:e,l=0===s?i:n;return(0===s?o:r)&&(l=-l),s=a,i=0===s?i:n,(0===s?o:r)&&(i=-i),_e.Nz(h,0===s?t:e,l,i,0,0)},Nz:function(t,e,i,n,o,r){if(0<n)if(0<i){o=t*t,r=e*e,t*=i;var s=e*n,a=-r+s,h=-r+Math.sqrt(t*t+s*s);e=a;for(var l=0;9999999999>l;++l){if(e=.5*(a+h),e===a||e===h)break;var u=t/(e+o),c=s/(e+r);if(u=u*u+c*c-1,0<u)a=e;else{if(!(0>u))break;h=e}}i=o*i/(e+o)-i,n=r*n/(e+r)-n,i=Math.sqrt(i*i+n*n)}else i=Math.abs(n-e);else n=t*t-e*e,r=t*i,r<n?(n=r/n,r=e*Math.sqrt(Math.abs(1-n*n)),i=t*n-i,i=Math.sqrt(i*i+r*r)):i=Math.abs(i-t);return i},Qe:new _,dn:new _,Uh:new _,Vh:0};function We(t){ot(this),this.v=!1,void 0===t&&(t=li),this.qa=t,this.oc=this.hc=this.dd=this.cd=0,this.Jj=new et,this.Xr=this.Jj.Ba,this.Fr=(new zt).freeze(),this.ra=!0,this.ln=this.al=null,this.mn=NaN,this.pf=ne,this.qf=ce,this.Cl=this.Dl=NaN,this.Sf=Xs}function $e(t,e){return t.type===si&&e.type===li&&!!(1===e.figures.count&&(e=e.figures.J(0),1===e.segments.count&&_e.A(t.startX,e.startX)&&_e.A(t.startY,e.startY)&&(e=e.segments.J(0),e.type===yi&&_e.A(t.endX,e.endX)&&_e.A(t.endY,e.endY))))}function Je(t){return t.toString()}function Ze(t,e){function i(){return g>=b-1||null!==c[g+1].match(w)}function n(){return g++,c[g]}function o(t){var e=parseFloat(n()),i=parseFloat(n());y===y.toLowerCase()&&(e=x.x+e,i=x.y+i),t.h(e,i)}function r(){return o(x),x}function s(){return o(v),v}function a(){var t=m.toLowerCase();return"c"!==t&&"s"!==t&&"q"!==t&&"t"!==t?x:new pt(2*x.x-v.x,2*x.y-v.y)}void 0===e&&(e=!1);var h=new RegExp("(["+ui+"])(["+ui+"])","gm"),l=new RegExp("(["+ui+"])([^s])","gm"),u=new RegExp("([^s])(["+ui+"])","gm");t=t.replace(/,/gm," "),t=t.replace(h,"$1 $2"),t=t.replace(h,"$1 $2"),t=t.replace(l,"$1 $2"),t=t.replace(u,"$1 $2"),t=t.replace(/([0-9])([+\-])/gm,"$1 $2"),t=t.replace(/[\s\r\t\n]+/gm," "),t=t.replace(/^\s+|\s+$/g,"");var c=t.split(" ");for(t=0;t<c.length;t++)if(l=c[t],null!==l.match(/(\.[0-9]*)(\.)/gm)){h=j(),u="";for(var f=!1,d=0;d<l.length;d++){var p=l[d];"."!==p||f?"."===p?(h.push(u),u="."):u+=p:(f=!0,u+=p)}for(h.push(u),c.splice(t,1),l=0;l<h.length;l++)c.splice(t+l,0,h[l]);t+=h.length-1,O(h)}var g=-1,y="",m="";h=new pt(0,0);var v=new pt(0,0),x=new pt(0,0),b=c.length;t=Cu(null),u=l=!1,f=!0,d=null;for(var w=new RegExp("["+ui+"]");!(g>=b-1);)if(m=y,y=n(),""!==y)switch(y.toUpperCase()){case"X":f=!0,u=l=!1;break;case"M":for(d=r(),null===t.ic||!0===f?(ku(t,d.x,d.y,l,!u),f=!1):t.moveTo(d.x,d.y),h.assign(x);!i();)d=r(),t.lineTo(d.x,d.y);break;case"L":for(;!i();)d=r(),t.lineTo(d.x,d.y);break;case"H":for(;!i();)x=new pt((y===y.toLowerCase()?x.x:0)+parseFloat(n()),x.y),t.lineTo(x.x,x.y);break;case"V":for(;!i();)x=new pt(x.x,(y===y.toLowerCase()?x.y:0)+parseFloat(n())),t.lineTo(x.x,x.y);break;case"C":for(;!i();){d=new pt,o(d),p=s();var k=r();Su(t,d.x,d.y,p.x,p.y,k.x,k.y)}break;case"S":for(;!i();)d=a(),p=s(),k=r(),Su(t,d.x,d.y,p.x,p.y,k.x,k.y);break;case"Q":for(;!i();)d=s(),p=r(),Pu(t,d.x,d.y,p.x,p.y);break;case"T":for(;!i();)v=d=a(),p=r(),Pu(t,d.x,d.y,p.x,p.y);break;case"B":for(;!i();){d=parseFloat(n()),p=parseFloat(n()),k=parseFloat(n());var M=parseFloat(n()),S=parseFloat(n()),P=S,N=!1;i()||(P=parseFloat(n()),i()||(N=0!==parseFloat(n()))),y===y.toLowerCase()&&(k+=x.x,M+=x.y),t.arcTo(d,p,k,M,S,P,N)}break;case"A":for(;!i();)d=Math.abs(parseFloat(n())),p=Math.abs(parseFloat(n())),k=parseFloat(n()),S=M=!1,N=P=0,P=n(),1===P.length?(M=!!parseFloat(P),S=!!parseFloat(n()),P=parseFloat(n())):2===P.length?(M=!!parseFloat(P[0]),S=!!parseFloat(P[1]),P=parseFloat(n())):(M=!!parseFloat(P[0]),S=!!parseFloat(P[1]),P=parseFloat(P.slice(2))),N=parseFloat(n()),y===y.toLowerCase()&&(P=x.x+P,N=x.y+N),x.h(P,N),Nu(t,d,p,k,M,S,P,N);break;case"Z":Mu(t),x.assign(h);break;case"F":for(d="",p=1;c[g+p];)if(null!==c[g+p].match(/[Uu]/))p++;else{if(null!==c[g+p].match(w)){d=c[g+p];break}p++}d.match(/[Mm]/)?l=!0:0<t.ic.segments.length&&(t.ic.isFilled=!0);break;case"U":for(d="",p=1;c[g+p];)if(null!==c[g+p].match(/[Ff]/))p++;else{if(null!==c[g+p].match(w)){d=c[g+p];break}p++}d.match(/[Mm]/)?u=!0:t.Ym(!1)}if(h=t.Kt,Tu=t,e)for(e=h.figures.iterator;e.next();)e.value.isFilled=!0;return h}function Qe(t,e){for(var i=t.length,n=pt.alloc(),o=0;o<i;o++){var r=t[o];n.x=r[0],n.y=r[1],e.ta(n),r[0]=n.x,r[1]=n.y,n.x=r[2],n.y=r[3],e.ta(n),r[2]=n.x,r[3]=n.y,n.x=r[4],n.y=r[5],e.ta(n),r[4]=n.x,r[5]=n.y,n.x=r[6],n.y=r[7],e.ta(n),r[6]=n.x,r[7]=n.y}pt.free(n)}function ti(t,e,i){switch(t.type){case si:case ai:case hi:i?e.h(t.cd,t.dd,0,0):Ht(e,t.cd,t.dd,0,0),Ht(e,t.hc,t.oc,0,0);break;case li:var n=t.figures;t=n.j,n=n.length;for(var o=0;o<n;o++){var r=t[o];i&&0===o?e.h(r.startX,r.startY,0,0):Ht(e,r.startX,r.startY,0,0);for(var s=r.segments.j,a=s.length,h=r.startX,l=r.startY,u=0;u<a;u++){var c=s[u];switch(c.type){case yi:case gi:h=c.endX,l=c.endY,Ht(e,h,l,0,0);break;case mi:_e.vm(h,l,c.point1X,c.point1Y,c.point2X,c.point2Y,c.endX,c.endY,.5,e),h=c.endX,l=c.endY;break;case vi:_e.pw(h,l,c.point1X,c.point1Y,c.endX,c.endY,.5,e),h=c.endX,l=c.endY;break;case xi:case bi:var f=c.type===xi?di(c,r):pi(c,r,h,l),d=f.length;if(0===d){h=c.type===xi?c.centerX:c.endX,l=c.type===xi?c.centerY:c.endY,Ht(e,h,l,0,0);break}c=null;for(var p=0;p<d;p++)c=f[p],_e.vm(c[0],c[1],c[2],c[3],c[4],c[5],c[6],c[7],.5,e);null!==c&&(h=c[6],l=c[7]);break;default:w("Unknown Segment type: "+c.type)}}}break;default:w("Unknown Geometry type: "+t.type)}}function ei(t,e,i,n,o){var r=e.x;e=e.y;for(var s,a,h,l,u=t.bounds.x-20,c=0,f=t.figures.j,d=f.length,p=0;p<d;p++){var g=f[p];if(g.isFilled){if(n&&g.$(r,e,i))return!0;var y=g.segments;s=g.startX,a=g.startY;for(var m=s,v=a,x=y.j,b=0;b<=y.length;b++){var k=void 0;if(b!==y.length){k=x[b];var M=k.type;t=k.endX,l=k.endY}else M=yi,t=m,l=v;switch(M){case gi:if(m=ii(r,e,u,e,s,a,m,v),isNaN(m))return!0;c+=m,m=t,v=l;break;case yi:if(s=ii(r,e,u,e,s,a,t,l),isNaN(s))return!0;c+=s;break;case mi:h=_e.xq(s,a,k.point1X,k.point1Y,k.point2X,k.point2Y,t,l,u,e,r,e,.5),c+=h;break;case vi:h=_e.xq(s,a,(s+2*k.point1X)/3,(a+2*k.point1Y)/3,(2*k.point1X+t)/3,(2*k.point1Y+l)/3,t,l,u,e,r,e,.5),c+=h;break;case xi:case bi:M=k.type===xi?di(k,g):pi(k,g,s,a);var S=M.length;if(0===S){if(s=ii(r,e,u,e,s,a,k.type===xi?k.centerX:k.endX,k.type===xi?k.centerY:k.endY),isNaN(s))return!0;c+=s;break}k=null;for(var P=0;P<S;P++){if(k=M[P],0===P){if(h=ii(r,e,u,e,s,a,k[0],k[1]),isNaN(h))return!0;c+=h}h=_e.xq(k[0],k[1],k[2],k[3],k[4],k[5],k[6],k[7],u,e,r,e,.5),c+=h}null!==k&&(t=k[6],l=k[7]);break;default:w("Unknown Segment type: "+k.type)}s=t,a=l}if(0!==c)return!0;c=0}else if(g.$(r,e,o?i:i+2))return!0}return 0!==c}function ii(t,e,i,n,o,r,s,a){if(_e.Nb(o,r,s,a,.05,t,e))return NaN;var h=(t-i)*(r-a);if(0===h)return 0;var l=((t*n-e*i)*(o-s)-(t-i)*(o*a-r*s))/h;if(e=(t*n-e*i)*(r-a)/h,l>=t)return 0;if((o>s?o-s:s-o)<(r>a?r-a:a-r)){if(r<a){if(e<r||e>a)return 0}else if(e<a||e>r)return 0}else if(o<s){if(l<o||l>s)return 0}else if(l<s||l>o)return 0;return 0<h?1:-1}function ni(t,e,i,n){t=t.figures.j;for(var o=t.length,r=0;r<o;r++)if(t[r].$(e,i,n))return!0;return!1}function oi(t){if(null===t.al){var e=t.al=[],i=t.ln=[],n=[],o=[];if(t.type===si)n.push(t.startX),n.push(t.startY),n.push(t.endX),n.push(t.endY),e.push(n),o.push(Math.sqrt((t.startX-t.endX)*(t.startX-t.endX)+(t.startY-t.endY)*(t.startY-t.endY))),i.push(o);else if(t.type===ai)n.push(t.startX),n.push(t.startY),n.push(t.endX),n.push(t.startY),n.push(t.endX),n.push(t.endY),n.push(t.startX),n.push(t.endY),n.push(t.startX),n.push(t.startY),e.push(n),o.push(Math.abs(t.startX-t.endX)),o.push(Math.abs(t.startY-t.endY)),o.push(Math.abs(t.startX-t.endX)),o.push(Math.abs(t.startY-t.endY)),i.push(o);else if(t.type===hi){var r=new ci;r.startX=t.endX,r.startY=(t.startY+t.endY)/2;var s=new fi(xi);if(s.startAngle=0,s.sweepAngle=360,s.centerX=(t.startX+t.endX)/2,s.centerY=(t.startY+t.endY)/2,s.radiusX=Math.abs(t.startX-t.endX)/2,s.radiusY=Math.abs(t.startY-t.endY)/2,r.add(s),t=di(s,r),o=t.length,0===o)n.push(s.centerX),n.push(s.centerY);else{s=r.startX,r=r.startY;for(var a=0;a<o;a++){var h=t[a];_e.Fe(s,r,h[2],h[3],h[4],h[5],h[6],h[7],.5,n),s=h[6],r=h[7]}}e.push(n),i.push(ri(n))}else for(t=t.figures.iterator;t.next();){o=t.value,n=[],n.push(o.startX),n.push(o.startY),s=o.startX,r=o.startY,a=s,h=r;for(var l=o.segments.j,u=l.length,c=0;c<u;c++){var f=l[c];switch(f.type){case gi:4<=n.length&&(e.push(n),i.push(ri(n))),n=[],n.push(f.endX),n.push(f.endY),s=f.endX,r=f.endY,a=s,h=r;break;case yi:n.push(f.endX),n.push(f.endY),s=f.endX,r=f.endY;break;case mi:_e.Fe(s,r,f.point1X,f.point1Y,f.point2X,f.point2Y,f.endX,f.endY,.5,n),s=f.endX,r=f.endY;break;case vi:_e.Vq(s,r,f.point1X,f.point1Y,f.endX,f.endY,.5,n),s=f.endX,r=f.endY;break;case xi:var d=di(f,o),p=d.length;if(0===p){n.push(f.centerX),n.push(f.centerY),s=f.centerX,r=f.centerY;break}for(var g=0;g<p;g++){var y=d[g];_e.Fe(s,r,y[2],y[3],y[4],y[5],y[6],y[7],.5,n),s=y[6],r=y[7]}break;case bi:if(d=pi(f,o,s,r),p=d.length,g=f.endX,y=f.endY,0===p){n.push(g),n.push(y),s=g,r=y;break}for(g=0;g<p;g++)y=d[g],_e.Fe(s,r,y[2],y[3],y[4],y[5],y[6],y[7],.5,n),s=y[6],r=y[7];break;default:w("Segment not of valid type: "+f.type)}f.isClosed&&(n.push(a),n.push(h))}4<=n.length&&(e.push(n),i.push(ri(n)))}}}function ri(t){for(var e=[],i=0,n=0,o=t.length,r=0;r<o;r+=2){var s=t[r],a=t[r+1];0!==r&&e.push(Math.sqrt(bt(i,n,s,a))),i=s,n=a}return e}_e.za=_e.lB,We.prototype.copy=function(){var t=new We;t.qa=this.qa,t.cd=this.cd,t.dd=this.dd,t.hc=this.hc,t.oc=this.oc;for(var e=this.Jj.j,i=e.length,n=t.Jj,o=0;o<i;o++){var r=e[o].copy();n.add(r)}return t.Xr=this.Xr,t.Fr.assign(this.Fr),t.ra=this.ra,t.al=this.al,t.ln=this.ln,t.mn=this.mn,t.pf=this.pf.H(),t.qf=this.qf.H(),t.Dl=this.Dl,t.Cl=this.Cl,t.Sf=this.Sf,t},i=We.prototype,i.ca=function(){return this.freeze(),Object.freeze(this),this},i.freeze=function(){this.v=!0;var t=this.figures;t.freeze(),t=t.j;for(var e=t.length,i=0;i<e;i++)t[i].freeze();return this},i.ea=function(){Object.isFrozen(this)&&w("cannot thaw constant: "+this),this.v=!1;var t=this.figures;t.ea(),t=t.j;for(var e=t.length,i=0;i<e;i++)t[i].ea();return this},i.Qa=function(t){if(!(t instanceof We))return!1;if(this.type!==t.type)return this.type===si&&t.type===li?$e(this,t):t.type===si&&this.type===li&&$e(t,this);if(this.type===li){var e=this.figures.j;t=t.figures.j;var i=e.length;if(i!==t.length)return!1;for(var n=0;n<i;n++)if(!e[n].Qa(t[n]))return!1;return!0}return _e.A(this.startX,t.startX)&&_e.A(this.startY,t.startY)&&_e.A(this.endX,t.endX)&&_e.A(this.endY,t.endY)},i.jb=function(t){t.classType===We&&(this.type=t)},i.toString=function(t){switch(void 0===t&&(t=-1),this.type){case si:return 0>t?"M"+this.startX.toString()+" "+this.startY.toString()+"L"+this.endX.toString()+" "+this.endY.toString():"M"+this.startX.toFixed(t)+" "+this.startY.toFixed(t)+"L"+this.endX.toFixed(t)+" "+this.endY.toFixed(t);case ai:var e=new zt(this.startX,this.startY,0,0);return e.Rw(this.endX,this.endY,0,0),0>t?"M"+e.x.toString()+" "+e.y.toString()+"H"+e.right.toString()+"V"+e.bottom.toString()+"H"+e.left.toString()+"z":"M"+e.x.toFixed(t)+" "+e.y.toFixed(t)+"H"+e.right.toFixed(t)+"V"+e.bottom.toFixed(t)+"H"+e.left.toFixed(t)+"z";case hi:if(e=new zt(this.startX,this.startY,0,0),e.Rw(this.endX,this.endY,0,0),0>t)return t=e.left.toString()+" "+(e.y+e.height/2).toString(),"M"+t+"A"+(e.width/2).toString()+" "+(e.height/2).toString()+" 0 0 1 "+e.right.toString()+" "+(e.y+e.height/2).toString()+"A"+(e.width/2).toString()+" "+(e.height/2).toString()+" 0 0 1 "+t;var i=e.left.toFixed(t)+" "+(e.y+e.height/2).toFixed(t);return"M"+i+"A"+(e.width/2).toFixed(t)+" "+(e.height/2).toFixed(t)+" 0 0 1 "+e.right.toFixed(t)+" "+(e.y+e.height/2).toFixed(t)+"A"+(e.width/2).toFixed(t)+" "+(e.height/2).toFixed(t)+" 0 0 1 "+i;case li:e="",i=this.figures.j;for(var n=i.length,o=0;o<n;o++){var r=i[o];0<o&&(e+=" x "),r.isFilled&&(e+="F "),e+=r.toString(t)}return e;default:return this.type.toString()}},i.gw=function(){if(this.ra||this.Xr!==this.figures.Ba)return!0;for(var t=this.figures.j,e=t.length,i=0;i<e;i++)if(t[i].gw())return!0;return!1},We.prototype.computeBounds=function(){this.ra=!1,this.ln=this.al=null,this.mn=NaN,this.Xr=this.figures.Ba;for(var t=this.figures.j,e=t.length,i=0;i<e;i++){var n=t[i];n.ra=!1;var o=n.segments;n.bt=o.Ba,n=o.j,o=n.length;for(var r=0;r<o;r++){var s=n[r];s.ra=!1,s.Qd=null}}t=this.Fr,t.ea(),isNaN(this.Dl)||isNaN(this.Cl)?t.h(0,0,0,0):t.h(0,0,this.Dl,this.Cl),ti(this,t,!1),Ht(t,0,0,0,0),t.freeze()},We.prototype.ey=function(){var t=new zt;return ti(this,t,!0),t},We.prototype.normalize=function(){this.v&&k(this);var t=this.ey();return this.offset(-t.x,-t.y),new pt(-t.x,-t.y)},We.prototype.offset=function(t,e){return this.v&&k(this),this.transform(1,0,0,1,t,e),this},We.prototype.scale=function(t,e){return this.v&&k(this),this.transform(t,0,0,e,0,0),this},We.prototype.rotate=function(t,e,i){this.v&&k(this),void 0===e&&(e=0),void 0===i&&(i=0);var n=Ke.alloc();return n.reset(),n.rotate(t,e,i),this.transform(n.m11,n.m12,n.m21,n.m22,n.dx,n.dy),Ke.free(n),this},i=We.prototype,i.transform=function(t,e,i,n,o,r){switch(this.type){case si:case ai:case hi:var s=this.cd,a=this.dd;this.cd=s*t+a*i+o,this.dd=s*e+a*n+r,s=this.hc,a=this.oc,this.hc=s*t+a*i+o,this.oc=s*e+a*n+r;break;case li:for(var h=this.figures.j,l=h.length,u=0;u<l;u++){var c=h[u];s=c.startX,a=c.startY,c.startX=s*t+a*i+o,c.startY=s*e+a*n+r,c=c.segments.j;for(var f=c.length,d=0;d<f;d++){var p=c[d];switch(p.type){case yi:case gi:s=p.endX,a=p.endY,p.endX=s*t+a*i+o,p.endY=s*e+a*n+r;break;case mi:s=p.point1X,a=p.point1Y,p.point1X=s*t+a*i+o,p.point1Y=s*e+a*n+r,s=p.point2X,a=p.point2Y,p.point2X=s*t+a*i+o,p.point2Y=s*e+a*n+r,s=p.endX,a=p.endY,p.endX=s*t+a*i+o,p.endY=s*e+a*n+r;break;case vi:s=p.point1X,a=p.point1Y,p.point1X=s*t+a*i+o,p.point1Y=s*e+a*n+r,s=p.endX,a=p.endY,p.endX=s*t+a*i+o,p.endY=s*e+a*n+r;break;case xi:s=p.centerX,a=p.centerY,p.centerX=s*t+a*i+o,p.centerY=s*e+a*n+r,0!==e&&(s=180*Math.atan2(e,t)/Math.PI,0>s&&(s+=360),p.startAngle+=s),0>t&&(p.startAngle=180-p.startAngle,p.sweepAngle=-p.sweepAngle),0>n&&(p.startAngle=-p.startAngle,p.sweepAngle=-p.sweepAngle),p.radiusX*=Math.sqrt(t*t+i*i),void 0!==p.radiusY&&(p.radiusY*=Math.sqrt(e*e+n*n));break;case bi:if(s=p.endX,a=p.endY,p.endX=s*t+a*i+o,p.endY=s*e+a*n+r,0===p.radiusX||0===p.radiusY)break;0!==e&&(s=180*Math.atan2(e,t)/Math.PI,0>s&&(s+=360),p.xAxisRotation+=s),0>t&&(p.xAxisRotation=180-p.xAxisRotation,p.isClockwiseArc=!p.isClockwiseArc),0>n&&(p.xAxisRotation=-p.xAxisRotation,p.isClockwiseArc=!p.isClockwiseArc),p.radiusX*=Math.sqrt(t*t+i*i),p.radiusY*=Math.sqrt(e*e+n*n);break;default:w("Unknown Segment type: "+p.type)}}}}return this.ra=!0,this},i.$=function(t,e){void 0===e&&(e=0);var i=this.cd,n=this.dd,o=this.hc,r=this.oc;switch(this.type){case si:return _e.Nb(i,n,o,r,e,t.x,t.y);case ai:var s=zt.allocAt(Math.min(i,o)-e,Math.min(n,r)-e,Math.abs(o-i)+2*e,Math.abs(r-n)+2*e);return t=s.$(t),zt.free(s),t;case hi:s=Math.min(i,o)-e;var a=Math.min(n,r)-e;return i=(Math.abs(o-i)+2*e)/2,e=(Math.abs(r-n)+2*e)/2,0>=i||0>=e?!1:(s=t.x-(s+i),a=t.y-(a+e),1>=s*s/(i*i)+a*a/(e*e));case li:return ei(this,t,e,!0,!1);default:return!1}},i.Xv=function(t,e){if(0>t?t=0:1<t&&(t=1),void 0===e&&(e=new pt),this.type===si)return e.h(this.startX+t*(this.endX-this.startX),this.startY+t*(this.endY-this.startY)),e;for(var i=this.flattenedSegments,n=this.flattenedLengths,o=i.length,r=this.flattenedTotalLength*t,s=0,a=0;a<o;a++){var h=n[a],l=h.length;for(t=0;t<l;t++){var u=h[t];if(s+u>=r)return n=r-s,n=0===u?0:n/u,i=i[a],a=i[2*t],o=i[2*t+1],e.h(a+(i[2*t+2]-a)*n,o+(i[2*t+3]-o)*n),e;s+=u}}return e},i.vy=function(t){if(0>t?t=0:1<t&&(t=1),this.type===si)return 180*Math.atan2(this.endY-this.startY,this.endX-this.startX)/Math.PI;for(var e=this.flattenedSegments,i=this.flattenedLengths,n=e.length,o=this.flattenedTotalLength*t,r=0,s=0;s<n;s++){var a=i[s],h=a.length;for(t=0;t<h;t++){var l=a[t];if(r+l>=o)return o=e[s],e=o[2*t],i=o[2*t+1],n=o[2*t+2],t=o[2*t+3],1>Math.abs(n-e)&&1>Math.abs(t-i)?0:1>Math.abs(n-e)?0<=t-i?90:270:1>Math.abs(t-i)?0<=n-e?0:180:180*Math.atan2(t-i,n-e)/Math.PI;r+=l}}return NaN},i.Yv=function(t,e){if(0>t?t=0:1<t&&(t=1),void 0===e&&(e=[]),e.length=3,this.type===si)return e[0]=this.startX+t*(this.endX-this.startX),e[1]=this.startY+t*(this.endY-this.startY),e[2]=180*Math.atan2(this.endY-this.startY,this.endX-this.startX)/Math.PI,e;for(var i=this.flattenedSegments,n=this.flattenedLengths,o=i.length,r=this.flattenedTotalLength*t,s=0,a=0;a<o;a++){var h=n[a],l=h.length;for(t=0;t<l;t++){var u=h[t];if(s+u>=r)return n=r-s,n=0===u?0:n/u,u=i[a],i=u[2*t],a=u[2*t+1],o=u[2*t+2],t=u[2*t+3],e[0]=i+(o-i)*n,e[1]=a+(t-a)*n,e[2]=1>Math.abs(o-i)&&1>Math.abs(t-a)?0:1>Math.abs(o-i)?0<=t-a?90:270:1>Math.abs(t-a)?0<=o-i?0:180:180*Math.atan2(t-a,o-i)/Math.PI,e;s+=u}}return e},i.wy=function(t){if(this.type===si){var e=this.startX,i=this.startY,n=this.endX,o=this.endY;if(e!==n||i!==o){var r=t.x;if(t=t.y,e===n){if(i<o){var s=i;n=o}else s=o,n=i;return t<=s?s===i?0:1:t>=n?n===i?0:1:Math.abs(t-i)/(n-s)}if(i===o)return e<n?s=e:(s=n,n=e),r<=s?s===e?0:1:r>=n?n===e?0:1:Math.abs(r-e)/(n-s);s=(n-e)*(n-e)+(o-i)*(o-i);var a=pt.alloc();return _e.Qh(e,i,n,o,r,t,a),t=a.x,r=a.y,pt.free(a),Math.sqrt(((t-e)*(t-e)+(r-i)*(r-i))/s)}}else{if(this.type!==ai){e=this.flattenedSegments,i=this.flattenedLengths,r=this.flattenedTotalLength,n=pt.alloc(),o=1/0,a=s=0,m=e.length;for(var h=v=0,l=0;l<m;l++)for(var u=e[l],c=i[l],f=u.length,d=0;d<f;d+=2){var p=u[d],g=u[d+1];if(0!==d){_e.Qh(v,h,p,g,t.x,t.y,n);var y=(n.x-t.x)*(n.x-t.x)+(n.y-t.y)*(n.y-t.y);y<o&&(o=y,s=a,s+=Math.sqrt((n.x-v)*(n.x-v)+(n.y-h)*(n.y-h))),a+=c[(d-2)/2]}v=p,h=g}return pt.free(n),t=s/r,0>t?0:1<t?1:t}s=this.startX,a=this.startY;var m=this.endX;if(o=this.endY,s!==m||a!==o){e=m-s,i=o-a,r=2*e+2*i,n=t.x,t=t.y,n=Math.min(Math.max(n,s),m),t=Math.min(Math.max(t,a),o),s=Math.abs(n-s),m=Math.abs(n-m),a=Math.abs(t-a),o=Math.abs(t-o);var v=Math.min(s,m,a,o);if(v===a)return n/r;if(v===m)return(e+t)/r;if(v===o)return(2*e+i-n)/r;if(v===s)return(2*e+2*i-t)/r}}return 0},i.add=function(t){return this.Jj.add(t),this},i.Zm=function(t,e,i,n,o,r,s,a){return this.v&&k(this),this.pf=new Ge(t,e,o,r).freeze(),this.qf=new Ge(i,n,s,a).freeze(),this},d.Object.defineProperties(We.prototype,{flattenedSegments:{get:function(){return oi(this),this.al}},flattenedLengths:{get:function(){return oi(this),this.ln}},flattenedTotalLength:{get:function(){var t=this.mn;if(isNaN(t)){if(this.type===si){t=Math.abs(this.endX-this.startX);var e=Math.abs(this.endY-this.startY);t=Math.sqrt(t*t+e*e)}else if(this.type===ai)t=2*Math.abs(this.endX-this.startX)+2*Math.abs(this.endY-this.startY);else{e=this.flattenedLengths;for(var i=e.length,n=t=0;n<i;n++)for(var o=e[n],r=o.length,s=0;s<r;s++)t+=o[s]}this.mn=t}return t}},type:{get:function(){return this.qa},set:function(t){this.qa!==t&&(this.v&&k(this,t),this.qa=t,this.ra=!0)}},startX:{get:function(){return this.cd},set:function(t){this.cd!==t&&(this.v&&k(this,t),this.cd=t,this.ra=!0)}},startY:{get:function(){return this.dd},set:function(t){this.dd!==t&&(this.v&&k(this,t),this.dd=t,this.ra=!0)}},endX:{get:function(){return this.hc},set:function(t){this.hc!==t&&(this.v&&k(this,t),this.hc=t,this.ra=!0)}},endY:{get:function(){return this.oc},set:function(t){this.oc!==t&&(this.v&&k(this,t),this.oc=t,this.ra=!0)}},figures:{get:function(){return this.Jj},set:function(t){this.Jj!==t&&(this.v&&k(this,t),this.Jj=t,this.ra=!0)}},spot1:{get:function(){return this.pf},set:function(t){this.v&&k(this,t),this.pf=t.H()}},spot2:{get:function(){return this.qf},set:function(t){this.v&&k(this,t),this.qf=t.H()}},defaultStretch:{get:function(){return this.Sf},set:function(t){this.v&&k(this,t),this.Sf=t}},bounds:{get:function(){return this.gw()&&this.computeBounds(),this.Fr}}}),We.prototype.setSpots=We.prototype.Zm,We.prototype.add=We.prototype.add,We.prototype.getFractionForPoint=We.prototype.wy,We.prototype.getPointAndAngleAlongPath=We.prototype.Yv,We.prototype.getAngleAlongPath=We.prototype.vy,We.prototype.getPointAlongPath=We.prototype.Xv,We.prototype.containsPoint=We.prototype.$,We.prototype.transform=We.prototype.transform,We.prototype.rotate=We.prototype.rotate,We.prototype.scale=We.prototype.scale,We.prototype.offset=We.prototype.offset,We.prototype.normalize=We.prototype.normalize,We.prototype.computeBoundsWithoutOrigin=We.prototype.ey,We.prototype.equalsApprox=We.prototype.Qa;var si=new U(We,"Line",0),ai=new U(We,"Rectangle",1),hi=new U(We,"Ellipse",2),li=new U(We,"Path",3),ui="UuBbMmZzLlHhVvCcSsQqTtAaFfXx";function ci(t,e,i,n){ot(this),this.sx=null,this.v=!1,void 0===i&&(i=!0),this.js=i,void 0===n&&(n=!0),this.os=n,this.cd=void 0!==t?t:0,this.dd=void 0!==e?e:0,this.dm=new et,this.bt=this.dm.Ba,this.ra=!0}function fi(t,e,i,n,o,r,s,a){ot(this),this.v=!1,void 0===t&&(t=yi),this.qa=t,this.hc=void 0!==e?e:0,this.oc=void 0!==i?i:0,void 0===n&&(n=0),void 0===o&&(o=0),void 0===r&&(r=0),void 0===s&&(s=0),t===bi?(t=r%360,0>t&&(t+=360),this.Ce=t,this.Qi=0,this.Ri=Math.max(n,0),this.qh=Math.max(o,0),this.Ll="boolean"===typeof s?s:"number"===typeof s&&!!s,this.el=!!a):(this.Ce=n,this.Qi=o,t===xi&&(r=Math.max(r,0)),this.Ri=r,"number"===typeof s?(t===xi&&(s=Math.max(s,0)),this.qh=s):this.qh=0,this.el=this.Ll=!1),this.Oj=!1,this.ra=!0,this.Qd=null}function di(t,e){if(null!==t.Qd&&!1===e.ra)return t.Qd;var i=t.radiusX,n=t.radiusY;if(void 0===n&&(n=i),0===i||0===n)return t.Qd=[],t.Qd;e=t.Ce;var o=t.Qi,r=_e.hy(0,0,i<n?i:n,t.startAngle,t.startAngle+t.sweepAngle,!1);if(i!==n){var s=Ke.alloc();s.reset(),i<n?s.scale(1,n/i):s.scale(i/n,1),Qe(r,s),Ke.free(s)}for(i=r.length,n=0;n<i;n++)s=r[n],s[0]+=e,s[1]+=o,s[2]+=e,s[3]+=o,s[4]+=e,s[5]+=o,s[6]+=e,s[7]+=o;return t.Qd=r,t.Qd}function pi(t,e,i,n){function o(t,e,i,n){return(t*n<e*i?-1:1)*Math.acos((t*i+e*n)/(Math.sqrt(t*t+e*e)*Math.sqrt(i*i+n*n)))}if(null!==t.Qd&&!1===e.ra)return t.Qd;if(0===t.radiusX||0===t.radiusY)return t.Qd=[],t.Qd;e=t.Ri;var r=t.qh;0===e&&(e=1e-4),0===r&&(r=1e-4);var s=Math.PI/180*t.Ce,a=t.Ll,h=t.el,l=t.hc,u=t.oc,c=Math.cos(s),f=Math.sin(s),d=c*(i-l)/2+f*(n-u)/2;s=-f*(i-l)/2+c*(n-u)/2;var p=d*d/(e*e)+s*s/(r*r);return 1<p&&(e*=Math.sqrt(p),r*=Math.sqrt(p)),p=(a===h?-1:1)*Math.sqrt((e*e*r*r-e*e*s*s-r*r*d*d)/(e*e*s*s+r*r*d*d)),isNaN(p)&&(p=0),a=p*e*s/r,p=p*-r*d/e,isNaN(a)&&(a=0),isNaN(p)&&(p=0),i=(i+l)/2+c*a-f*p,n=(n+u)/2+f*a+c*p,u=o(1,0,(d-a)/e,(s-p)/r),c=(d-a)/e,l=(s-p)/r,d=(-d-a)/e,a=(-s-p)/r,s=o(c,l,d,a),d=(c*d+l*a)/(Math.sqrt(c*c+l*l)*Math.sqrt(d*d+a*a)),-1>=d?s=Math.PI:1<=d&&(s=0),!h&&0<s&&(s-=2*Math.PI),h&&0>s&&(s+=2*Math.PI),h=e>r?1:e/r,d=e>r?r/e:1,e=_e.hy(0,0,e>r?e:r,u,u+s,!0),r=Ke.alloc(),r.reset(),r.translate(i,n),r.rotate(t.Ce,0,0),r.scale(h,d),Qe(e,r),Ke.free(r),t.Qd=e,t.Qd}We.className="Geometry",We.stringify=Je,We.fillPath=function(t){t=t.split(/[Xx]/);for(var e=t.length,i="",n=0;n<e;n++){var o=t[n];i=null!==o.match(/[Ff]/)?0===n?i+o:i+"X"+(" "===o[0]?"":" ")+o:i+(0===n?"":"X ")+"F"+(" "===o[0]?"":" ")+o}return i},We.parse=Ze,We.Line=si,We.Rectangle=ai,We.Ellipse=hi,We.Path=li,ci.prototype.copy=function(){var t=new ci;t.js=this.js,t.os=this.os,t.cd=this.cd,t.dd=this.dd;for(var e=this.dm.j,i=e.length,n=t.dm,o=0;o<i;o++){var r=e[o].copy();n.add(r)}return t.bt=this.bt,t.ra=this.ra,t.sx=this.sx,t},i=ci.prototype,i.Qa=function(t){if(!(t instanceof ci&&_e.A(this.startX,t.startX)&&_e.A(this.startY,t.startY)))return!1;var e=this.segments.j;t=t.segments.j;var i=e.length;if(i!==t.length)return!1;for(var n=0;n<i;n++)if(!e[n].Qa(t[n]))return!1;return!0},i.toString=function(t){void 0===t&&(t=-1);for(var e=0>t?"M"+this.startX.toString()+" "+this.startY.toString():"M"+this.startX.toFixed(t)+" "+this.startY.toFixed(t),i=this.segments.j,n=i.length,o=0;o<n;o++)e+=" "+i[o].toString(t);return e},i.freeze=function(){this.v=!0;var t=this.segments;t.freeze();var e=t.j;t=t.length;for(var i=0;i<t;i++)e[i].freeze();return this},i.ea=function(){this.v=!1;var t=this.segments;t.ea(),t=t.j;for(var e=t.length,i=0;i<e;i++)t[i].ea();return this},i.gw=function(){if(this.ra)return!0;var t=this.segments;if(this.bt!==t.Ba)return!0;t=t.j;for(var e=t.length,i=0;i<e;i++)if(t[i].ra)return!0;return!1},i.add=function(t){return this.dm.add(t),this},i.$=function(t,e,i){for(var n=this.startX,o=this.startY,r=n,s=o,a=this.segments.j,h=a.length,l=0;l<h;l++){var u=a[l];switch(u.type){case gi:r=u.endX,s=u.endY,n=u.endX,o=u.endY;break;case yi:if(_e.Nb(n,o,u.endX,u.endY,i,t,e))return!0;n=u.endX,o=u.endY;break;case mi:if(_e.yt(n,o,u.point1X,u.point1Y,u.point2X,u.point2Y,u.endX,u.endY,.5,t,e,i))return!0;n=u.endX,o=u.endY;break;case vi:if(_e.qw(n,o,u.point1X,u.point1Y,u.endX,u.endY,.5,t,e,i))return!0;n=u.endX,o=u.endY;break;case xi:case bi:var c=u.type===xi?di(u,this):pi(u,this,n,o),f=c.length,d=u.type===xi?u.centerX:u.endX,p=u.type===xi?u.centerY:u.endY;if(0===f){if(_e.Nb(n,o,d,p,i,t,e))return!0;n=d,o=p;break}for(d=null,p=0;p<f;p++)if(d=c[p],0===p&&_e.Nb(n,o,d[0],d[1],i,t,e)||_e.yt(d[0],d[1],d[2],d[3],d[4],d[5],d[6],d[7],.5,t,e,i))return!0;null!==d&&(n=d[6],o=d[7]);break;default:w("Unknown Segment type: "+u.type)}if(u.isClosed&&(n!==r||o!==s)&&_e.Nb(n,o,r,s,i,t,e))return!0}return!1},d.Object.defineProperties(ci.prototype,{isFilled:{get:function(){return this.js},set:function(t){this.v&&k(this,t),this.js=t}},isShadowed:{get:function(){return this.os},set:function(t){this.v&&k(this,t),this.os=t}},startX:{get:function(){return this.cd},set:function(t){this.v&&k(this,t),this.cd=t,this.ra=!0}},startY:{get:function(){return this.dd},set:function(t){this.v&&k(this,t),this.dd=t,this.ra=!0}},segments:{get:function(){return this.dm},set:function(t){this.v&&k(this,t),this.dm=t,this.ra=!0}}}),ci.prototype.add=ci.prototype.add,ci.prototype.equalsApprox=ci.prototype.Qa,ci.className="PathFigure",fi.prototype.copy=function(){var t=new fi;return t.qa=this.qa,t.hc=this.hc,t.oc=this.oc,t.Ce=this.Ce,t.Qi=this.Qi,t.Ri=this.Ri,t.qh=this.qh,t.Ll=this.Ll,t.el=this.el,t.Oj=this.Oj,t.ra=this.ra,t},i=fi.prototype,i.Qa=function(t){if(!(t instanceof fi)||this.type!==t.type||this.isClosed!==t.isClosed)return!1;switch(this.type){case gi:case yi:return _e.A(this.endX,t.endX)&&_e.A(this.endY,t.endY);case mi:return _e.A(this.endX,t.endX)&&_e.A(this.endY,t.endY)&&_e.A(this.point1X,t.point1X)&&_e.A(this.point1Y,t.point1Y)&&_e.A(this.point2X,t.point2X)&&_e.A(this.point2Y,t.point2Y);case vi:return _e.A(this.endX,t.endX)&&_e.A(this.endY,t.endY)&&_e.A(this.point1X,t.point1X)&&_e.A(this.point1Y,t.point1Y);case xi:return _e.A(this.startAngle,t.startAngle)&&_e.A(this.sweepAngle,t.sweepAngle)&&_e.A(this.centerX,t.centerX)&&_e.A(this.centerY,t.centerY)&&_e.A(this.radiusX,t.radiusX)&&_e.A(this.radiusY,t.radiusY);case bi:return this.isClockwiseArc===t.isClockwiseArc&&this.isLargeArc===t.isLargeArc&&_e.A(this.xAxisRotation,t.xAxisRotation)&&_e.A(this.endX,t.endX)&&_e.A(this.endY,t.endY)&&_e.A(this.radiusX,t.radiusX)&&_e.A(this.radiusY,t.radiusY);default:return!1}},i.jb=function(t){t.classType===fi&&(this.type=t)},i.toString=function(t){switch(void 0===t&&(t=-1),this.type){case gi:t=0>t?"M"+this.endX.toString()+" "+this.endY.toString():"M"+this.endX.toFixed(t)+" "+this.endY.toFixed(t);break;case yi:t=0>t?"L"+this.endX.toString()+" "+this.endY.toString():"L"+this.endX.toFixed(t)+" "+this.endY.toFixed(t);break;case mi:t=0>t?"C"+this.point1X.toString()+" "+this.point1Y.toString()+" "+this.point2X.toString()+" "+this.point2Y.toString()+" "+this.endX.toString()+" "+this.endY.toString():"C"+this.point1X.toFixed(t)+" "+this.point1Y.toFixed(t)+" "+this.point2X.toFixed(t)+" "+this.point2Y.toFixed(t)+" "+this.endX.toFixed(t)+" "+this.endY.toFixed(t);break;case vi:t=0>t?"Q"+this.point1X.toString()+" "+this.point1Y.toString()+" "+this.endX.toString()+" "+this.endY.toString():"Q"+this.point1X.toFixed(t)+" "+this.point1Y.toFixed(t)+" "+this.endX.toFixed(t)+" "+this.endY.toFixed(t);break;case xi:t=0>t?"B"+this.startAngle.toString()+" "+this.sweepAngle.toString()+" "+this.centerX.toString()+" "+this.centerY.toString()+" "+this.radiusX.toString()+" "+this.radiusY.toString():"B"+this.startAngle.toFixed(t)+" "+this.sweepAngle.toFixed(t)+" "+this.centerX.toFixed(t)+" "+this.centerY.toFixed(t)+" "+this.radiusX.toFixed(t)+" "+this.radiusY.toFixed(t);break;case bi:t=0>t?"A"+this.radiusX.toString()+" "+this.radiusY.toString()+" "+this.xAxisRotation.toString()+" "+(this.isLargeArc?1:0)+" "+(this.isClockwiseArc?1:0)+" "+this.endX.toString()+" "+this.endY.toString():"A"+this.radiusX.toFixed(t)+" "+this.radiusY.toFixed(t)+" "+this.xAxisRotation.toFixed(t)+" "+(this.isLargeArc?1:0)+" "+(this.isClockwiseArc?1:0)+" "+this.endX.toFixed(t)+" "+this.endY.toFixed(t);break;default:t=this.type.toString()}return t+(this.Oj?"z":"")},i.freeze=function(){return this.v=!0,this},i.ea=function(){return this.v=!1,this},i.close=function(){return this.Oj=!0,this},d.Object.defineProperties(fi.prototype,{isClosed:{get:function(){return this.Oj},set:function(t){this.Oj!==t&&(this.Oj=t,this.ra=!0)}},type:{get:function(){return this.qa},set:function(t){this.v&&k(this,t),this.qa=t,this.ra=!0}},endX:{get:function(){return this.hc},set:function(t){this.v&&k(this,t),this.hc=t,this.ra=!0}},endY:{get:function(){return this.oc},set:function(t){this.v&&k(this,t),this.oc=t,this.ra=!0}},point1X:{get:function(){return this.Ce},set:function(t){this.v&&k(this,t),this.Ce=t,this.ra=!0}},point1Y:{get:function(){return this.Qi},set:function(t){this.v&&k(this,t),this.Qi=t,this.ra=!0}},point2X:{get:function(){return this.Ri},set:function(t){this.v&&k(this,t),this.Ri=t,this.ra=!0}},point2Y:{get:function(){return this.qh},set:function(t){this.v&&k(this,t),this.qh=t,this.ra=!0}},centerX:{get:function(){return this.Ce},set:function(t){this.v&&k(this,t),this.Ce=t,this.ra=!0}},centerY:{get:function(){return this.Qi},set:function(t){this.v&&k(this,t),this.Qi=t,this.ra=!0}},radiusX:{get:function(){return this.Ri},set:function(t){0>t&&M(t,">= zero",fi,"radiusX"),this.v&&k(this,t),this.Ri=t,this.ra=!0}},radiusY:{get:function(){return this.qh},set:function(t){0>t&&M(t,">= zero",fi,"radiusY"),this.v&&k(this,t),this.qh=t,this.ra=!0}},startAngle:{get:function(){return this.hc},set:function(t){this.hc!==t&&(this.v&&k(this,t),t%=360,0>t&&(t+=360),this.hc=t,this.ra=!0)}},sweepAngle:{get:function(){return this.oc},set:function(t){this.v&&k(this,t),360<t&&(t=360),-360>t&&(t=-360),this.oc=t,this.ra=!0}},isClockwiseArc:{get:function(){return this.el},set:function(t){this.v&&k(this,t),this.el=t,this.ra=!0}},isLargeArc:{get:function(){return this.Ll},set:function(t){this.v&&k(this,t),this.Ll=t,this.ra=!0}},xAxisRotation:{get:function(){return this.Ce},set:function(t){t%=360,0>t&&(t+=360),this.v&&k(this,t),this.Ce=t,this.ra=!0}}}),fi.prototype.equalsApprox=fi.prototype.Qa;var gi=new U(fi,"Move",0),yi=new U(fi,"Line",1),mi=new U(fi,"Bezier",2),vi=new U(fi,"QuadraticBezier",3),xi=new U(fi,"Arc",4),bi=new U(fi,"SvgArc",4);function wi(){this.C=null,this.yv=new pt(0,0).freeze(),this.Iu=new pt(0,0).freeze(),this.xr=this.zs=0,this.yr=1,this.Di="",this.st=this.Rr=!1,this.Or=this.Ar=0,this.Pg=this.bs=this.ms=!1,this.Wr=null,this.nt=0,this.pd=this.mt=null}function ki(){this.C=null,this.oa="",this.Js=this.kt=null}function Mi(){this.wn=Pi,this.gf=this.ys="",this.hp=this.ip=this.op=this.pp=this.np=this.C=this.cc=null}fi.className="PathSegment",fi.Move=gi,fi.Line=yi,fi.Bezier=mi,fi.QuadraticBezier=vi,fi.Arc=xi,fi.SvgArc=bi,wi.prototype.copy=function(){var t=new wi;return this.clone(t)},wi.prototype.clone=function(t){return t.C=this.C,t.yv.assign(this.viewPoint),t.Iu.assign(this.documentPoint),t.zs=this.zs,t.xr=this.xr,t.yr=this.yr,t.Di=this.Di,t.Rr=this.Rr,t.st=this.st,t.Ar=this.Ar,t.Or=this.Or,t.ms=this.ms,t.bs=this.bs,t.Pg=this.Pg,t.Wr=this.Wr,t.nt=this.nt,t.mt=this.mt,t.pd=this.pd,t},wi.prototype.toString=function(){var t="^";return 0!==this.modifiers&&(t+="M:"+this.modifiers),0!==this.button&&(t+="B:"+this.button),""!==this.key&&(t+="K:"+this.key),0!==this.clickCount&&(t+="C:"+this.clickCount),0!==this.delta&&(t+="D:"+this.delta),this.handled&&(t+="h"),this.bubbles&&(t+="b"),null!==this.documentPoint&&(t+="@"+this.documentPoint.toString()),t},wi.prototype.Jq=function(t,e){var i=this.diagram;return null===i||xr(i,this.event,t,e),e},wi.prototype.mA=function(t,e){var i=this.diagram;return null===i||(xr(i,this.event,t,e),e.assign(i.ou(e))),e},d.Object.defineProperties(wi.prototype,{diagram:{get:function(){return this.C},set:function(t){this.C=t}},viewPoint:{get:function(){return this.yv},set:function(t){this.yv.assign(t)}},documentPoint:{get:function(){return this.Iu},set:function(t){this.Iu.assign(t)}},modifiers:{get:function(){return this.zs},set:function(t){this.zs=t}},button:{get:function(){return this.xr},set:function(t){if(this.xr=t,null===this.event)switch(t){case 0:this.buttons=1;break;case 1:this.buttons=4;break;case 2:this.buttons=2}}},buttons:{get:function(){return this.yr},set:function(t){this.yr=t}},key:{get:function(){return this.Di},set:function(t){this.Di=t}},down:{get:function(){return this.Rr},set:function(t){this.Rr=t}},up:{get:function(){return this.st},set:function(t){this.st=t}},clickCount:{get:function(){return this.Ar},set:function(t){this.Ar=t}},delta:{get:function(){return this.Or},set:function(t){this.Or=t}},isMultiTouch:{get:function(){return this.ms},set:function(t){this.ms=t}},handled:{get:function(){return this.bs},set:function(t){this.bs=t}},bubbles:{get:function(){return this.Pg},set:function(t){this.Pg=t}},event:{get:function(){return this.Wr},set:function(t){this.Wr=t}},isTouchEvent:{get:function(){var t=y.TouchEvent,e=this.event;return!!(t&&e instanceof t)||(t=y.PointerEvent)&&e instanceof t&&("touch"===e.pointerType||"pen"===e.pointerType)}},timestamp:{get:function(){return this.nt},set:function(t){this.nt=t}},targetDiagram:{get:function(){return this.mt},set:function(t){this.mt=t}},targetObject:{get:function(){return this.pd},set:function(t){this.pd=t}},control:{get:function(){return 0!==(1&this.modifiers)},set:function(t){this.modifiers=t?1|this.modifiers:-2&this.modifiers}},shift:{get:function(){return 0!==(4&this.modifiers)},set:function(t){this.modifiers=t?4|this.modifiers:-5&this.modifiers}},alt:{get:function(){return 0!==(2&this.modifiers)},set:function(t){this.modifiers=t?2|this.modifiers:-3&this.modifiers}},meta:{get:function(){return 0!==(8&this.modifiers)},set:function(t){this.modifiers=t?8|this.modifiers:-9&this.modifiers}},left:{get:function(){var t=this.event;return null===t||"mousedown"!==t.type&&"mouseup"!==t.type&&"pointerdown"!==t.type&&"pointerup"!==t.type?0!==(1&this.buttons):0===this.button},set:function(t){this.buttons=t?1|this.buttons:-2&this.buttons}},right:{get:function(){var t=this.event;return null===t||"mousedown"!==t.type&&"mouseup"!==t.type&&"pointerdown"!==t.type&&"pointerup"!==t.type?0!==(2&this.buttons):2===this.button},set:function(t){this.buttons=t?2|this.buttons:-3&this.buttons}},middle:{get:function(){var t=this.event;return null===t||"mousedown"!==t.type&&"mouseup"!==t.type&&"pointerdown"!==t.type&&"pointerup"!==t.type?0!==(4&this.buttons):1===this.button},set:function(t){this.buttons=t?4|this.buttons:-5&this.buttons}}}),wi.prototype.getMultiTouchDocumentPoint=wi.prototype.mA,wi.prototype.getMultiTouchViewPoint=wi.prototype.Jq,wi.className="InputEvent",ki.prototype.copy=function(){var t=new ki;return t.C=this.C,t.oa=this.oa,t.kt=this.kt,t.Js=this.Js,t},ki.prototype.toString=function(){var t="*"+this.name;return null!==this.subject&&(t+=":"+this.subject.toString()),null!==this.parameter&&(t+="("+this.parameter.toString()+")"),t},d.Object.defineProperties(ki.prototype,{diagram:{get:function(){return this.C},set:function(t){this.C=t}},name:{get:function(){return this.oa},set:function(t){this.oa=t}},subject:{get:function(){return this.kt},set:function(t){this.kt=t}},parameter:{get:function(){return this.Js},set:function(t){this.Js=t}}}),ki.className="DiagramEvent",Mi.prototype.clear=function(){this.hp=this.ip=this.op=this.pp=this.np=this.C=this.cc=null},Mi.prototype.copy=function(){var t=new Mi;t.wn=this.wn,t.ys=this.ys,t.gf=this.gf,t.cc=this.cc,t.C=this.C,t.np=this.np;var e=this.pp;return t.pp=N(e)&&"function"===typeof e.H?e.H():e,e=this.op,t.op=N(e)&&"function"===typeof e.H?e.H():e,e=this.ip,t.ip=N(e)&&"function"===typeof e.H?e.H():e,e=this.hp,t.hp=N(e)&&"function"===typeof e.H?e.H():e,t},Mi.prototype.jb=function(t){t.classType===Mi&&(this.change=t)},Mi.prototype.toString=function(){var t="";return t=this.change===Si?t+"* ":this.change===Pi?t+(null!==this.model?"!m":"!d"):t+(null!==this.model?"!m":"!d")+this.change,this.propertyName&&"string"===typeof this.propertyName&&(t+=" "+this.propertyName),this.modelChange&&this.modelChange!==this.propertyName&&(t+=" "+this.modelChange),t+=": ",this.change===Si?null!==this.oldValue&&(t+=" "+this.oldValue):(null!==this.object&&(t+=F(this.object)),null!==this.oldValue&&(t+="  old: "+F(this.oldValue)),null!==this.oldParam&&(t+=" "+this.oldParam),null!==this.newValue&&(t+="  new: "+F(this.newValue)),null!==this.newParam&&(t+=" "+this.newParam)),t},Mi.prototype.G=function(t){return t?this.oldValue:this.newValue},Mi.prototype.oA=function(t){return t?this.oldParam:this.newParam},Mi.prototype.canUndo=function(){return null!==this.model||null!==this.diagram},Mi.prototype.undo=function(){this.canUndo()&&(null!==this.model?this.model.changeState(this,!0):null!==this.diagram&&this.diagram.changeState(this,!0))},Mi.prototype.canRedo=function(){return null!==this.model||null!==this.diagram},Mi.prototype.redo=function(){this.canRedo()&&(null!==this.model?this.model.changeState(this,!1):null!==this.diagram&&this.diagram.changeState(this,!1))},d.Object.defineProperties(Mi.prototype,{model:{get:function(){return this.cc},set:function(t){this.cc=t}},diagram:{get:function(){return this.C},set:function(t){this.C=t}},change:{get:function(){return this.wn},set:function(t){this.wn=t}},modelChange:{get:function(){return this.ys},set:function(t){this.ys=t}},propertyName:{get:function(){return this.gf},set:function(t){this.gf=t}},isTransactionFinished:{get:function(){return this.wn===Si&&("CommittedTransaction"===this.gf||"FinishedUndo"===this.gf||"FinishedRedo"===this.gf)}},object:{get:function(){return this.np},set:function(t){this.np=t}},oldValue:{get:function(){return this.pp},set:function(t){this.pp=t}},oldParam:{get:function(){return this.op},set:function(t){this.op=t}},newValue:{get:function(){return this.ip},set:function(t){this.ip=t}},newParam:{get:function(){return this.hp},set:function(t){this.hp=t}}}),Mi.prototype.redo=Mi.prototype.redo,Mi.prototype.canRedo=Mi.prototype.canRedo,Mi.prototype.undo=Mi.prototype.undo,Mi.prototype.canUndo=Mi.prototype.canUndo,Mi.prototype.getParam=Mi.prototype.oA,Mi.prototype.getValue=Mi.prototype.G,Mi.prototype.clear=Mi.prototype.clear;var Si=new U(Mi,"Transaction",-1),Pi=new U(Mi,"Property",0),Ni=new U(Mi,"Insert",1),Ci=new U(Mi,"Remove",2);function Ti(){this.u=(new et).freeze(),this.oa="",this.l=!1}function Ai(){this.gv=new nt,this.md=!1,this.I=(new et).freeze(),this.Xd=-1,this.u=999,this.se=!1,this.Lr=null,this.Yi=0,this.l=!1,this.ye=(new et).freeze(),this.Tl=new et,this.Qu=!0,this.Wu=this.ks=this.$u=this.Zu=!1}function Li(t,e,i){if(t.isUndoingRedoing)return!1;t.checksTransactionLevel&&1>t.transactionLevel&&S("Ending transaction without having started a transaction: "+i);var n=1===t.transactionLevel,o=t.currentTransaction;n&&e&&(t.isInternalTransaction||t.Bb("CommittingTransaction",i,o));var r=0;if(0<t.transactionLevel&&(t.Yi--,t.isEnabled)){var s=t.ye.count;0<s&&(""===i&&(i=t.ye.J(0)),t.ye.ea(),t.ye.cb(s-1),t.ye.freeze()),s=t.Tl.count,0<s&&(r=t.Tl.J(s-1),t.Tl.cb(s-1))}if(n){if(e){if(t.ks=!1,null===o&&""!==i&&(o=t.currentTransaction),t.isEnabled&&null!==o){for(o.isComplete||(o.isComplete=!0,o.name=i),e=t.history,e.ea(),n=e.count-1;n>t.historyIndex;n--)r=e.J(n),null!==r&&r.clear(),e.cb(n),t.ks=!0;n=t.maxHistoryLength,0<=n&&(0===n?e.clear():e.count>=n&&(r=e.J(0),null!==r&&r.clear(),e.cb(0),t.Xd--)),0===n||0!==e.count&&e.get(e.count-1)===o||(e.add(o),t.Xd++),e.freeze()}t.isInternalTransaction||t.Bb("CommittedTransaction",i,o)}else{t.se=!0;try{t.isEnabled&&null!==o&&(o.isComplete=!0,o.undo())}finally{t.isInternalTransaction||t.Bb("RolledBackTransaction",i,o),t.se=!1}null!==o&&o.clear()}return t.Lr=null,t.isPendingClear&&t.clear(),t.isPendingClear=!1,t.isPendingUnmodified=!1,!0}if(t.isEnabled&&!e&&null!==o){for(t=r,i=o.changes,o=i.count-1;o>=t;o--)e=i.J(o),null!==e&&e.undo(),i.ea(),i.cb(o);i.freeze()}return!1}function ji(){ot(this),this.C=fs,this.oa="",this.md=!0,this.Sc=!1,this.ix=null,this.lz=new wi,this.vt=-1}function Oi(t,e,i){if(e.handled=!1,null===t||t.Hg()){var n=0;e.left?n=1===e.clickCount?1:2===e.clickCount?2:1:e.right&&1===e.clickCount&&(n=3);var o="ObjectSingleClicked";if(null!==t){switch(n){case 1:o="ObjectSingleClicked";break;case 2:o="ObjectDoubleClicked";break;case 3:o="ObjectContextClicked"}0!==n&&i.R(o,t)}else{switch(n){case 1:o="BackgroundSingleClicked";break;case 2:o="BackgroundDoubleClicked";break;case 3:o="BackgroundContextClicked"}0!==n&&i.R(o)}if(null!==t)for(;null!==t;){switch(i=null,n){case 1:i=t.click;break;case 2:i=t.doubleClick?t.doubleClick:t.click;break;case 3:i=t.contextClick}if(null!==i&&(i(e,t),e.handled))break;t=t.panel}else{switch(t=null,n){case 1:t=i.click;break;case 2:t=i.doubleClick?i.doubleClick:i.click;break;case 3:t=i.contextClick}null!==t&&t(e)}}}function Di(){ji.call(this),this.name="ToolManager",this.Cc=new et,this.Tc=new et,this.Od=new et,this.T=this.Ka=850,this.u=new Bt(2,2).ca(),this.eb=5e3,this.La=Bi,this.I=Ri,this.Kr=this.l=null,this.ik=-1}function Fi(t,e){t.standardMouseOver(),t.isBeyondDragSize()&&t.standardWaitAfter(t.isActive?t.holdDelay:t.hoverDelay,e.lastInput)}Mi.className="ChangedEvent",Mi.Transaction=Si,Mi.Property=Pi,Mi.Insert=Ni,Mi.Remove=Ci,Ti.prototype.toString=function(t){var e="Transaction: "+this.name+" "+this.changes.count.toString()+(this.isComplete?"":", incomplete");if(void 0!==t&&0<t){t=this.changes.count;for(var i=0;i<t;i++){var n=this.changes.J(i);null!==n&&(e+="\n  "+n.toString())}}return e},Ti.prototype.clear=function(){var t=this.changes;t.ea();for(var e=t.count-1;0<=e;e--){var i=t.J(e);null!==i&&i.clear()}t.clear(),t.freeze()},Ti.prototype.canUndo=function(){return this.isComplete},Ti.prototype.undo=function(){if(this.canUndo())for(var t=this.changes.count-1;0<=t;t--){var e=this.changes.J(t);null!==e&&e.undo()}},Ti.prototype.canRedo=function(){return this.isComplete},Ti.prototype.redo=function(){if(this.canRedo())for(var t=this.changes.count,e=0;e<t;e++){var i=this.changes.J(e);null!==i&&i.redo()}},Ti.prototype.nw=function(){if(this.isComplete){var t=this.changes;t.ea();for(var e=new dt,i=0;i<t.count;i++){var n=t.J(i);if(null!==n&&n.change===Pi&&n.object){var o=e.get(n.object);o||(o=new dt,e.set(n.object,o));var r=o.get(n.propertyName);null===r?o.set(n.propertyName,-1):(0<r&&t.Pc(r,null),o.set(n.propertyName,i))}}for(i=e=0;i<t.count;i++)n=t.J(i),null!==n&&(i>e&&t.Pc(e,n),e++);for(;t.length>e;)t.pop();t.freeze()}},d.Object.defineProperties(Ti.prototype,{changes:{get:function(){return this.u}},name:{get:function(){return this.oa},set:function(t){this.oa=t}},isComplete:{get:function(){return this.l},set:function(t){this.l=t}}}),Ti.prototype.optimize=Ti.prototype.nw,Ti.prototype.redo=Ti.prototype.redo,Ti.prototype.canRedo=Ti.prototype.canRedo,Ti.prototype.undo=Ti.prototype.undo,Ti.prototype.canUndo=Ti.prototype.canUndo,Ti.prototype.clear=Ti.prototype.clear,Ti.className="Transaction",Ai.prototype.toString=function(t){var e="UndoManager "+this.historyIndex+"<"+this.history.count+"<="+this.maxHistoryLength;e+="[";for(var i=this.nestedTransactionNames.count,n=0;n<i;n++)0<n&&(e+=" "),e+=this.nestedTransactionNames.J(n);if(e+="]",void 0!==t&&0<t)for(i=this.history.count,n=0;n<i;n++)e+="\n "+this.history.J(n).toString(t-1);return e},Ai.prototype.clear=function(){var t=this.history;t.ea();for(var e=t.count-1;0<=e;e--){var i=t.J(e);null!==i&&i.clear()}t.clear(),this.Xd=-1,t.freeze(),this.se=!1,this.Lr=null,this.Yi=0,this.ye.ea(),this.ye.clear(),this.ye.freeze(),this.Tl.clear(),this.Wu=this.ks=this.$u=this.Zu=!1},Ai.prototype.copyProperties=function(t){this.isEnabled=t.isEnabled,this.maxHistoryLength=t.maxHistoryLength,this.checksTransactionLevel=t.checksTransactionLevel},i=Ai.prototype,i.Vx=function(t){this.gv.add(t)},i.Py=function(t){this.gv.remove(t)},i.va=function(t){if(void 0===t&&(t=""),null===t&&(t=""),this.isUndoingRedoing)return!1;!0===this.Qu&&(this.Qu=!1,this.Yi++,this.isInternalTransaction||this.Bb("StartingFirstTransaction",t,this.currentTransaction),0<this.Yi&&this.Yi--),this.isEnabled&&(this.ye.ea(),this.ye.add(t),this.ye.freeze(),null===this.currentTransaction?this.Tl.add(0):this.Tl.add(this.currentTransaction.changes.count)),this.Yi++;var e=1===this.transactionLevel;return e&&(this.isInternalTransaction||this.Bb("StartedTransaction",t,this.currentTransaction)),e},i.Xa=function(t){return void 0===t&&(t=""),Li(this,!0,t)},i.If=function(){return Li(this,!1,"")},Ai.prototype.canUndo=function(){if(!this.isEnabled||0<this.transactionLevel)return!1;var t=this.transactionToUndo;return!(null===t||!t.canUndo())},Ai.prototype.undo=function(){if(this.canUndo()){var t=this.transactionToUndo;try{this.se=!0,this.Bb("StartingUndo","Undo",t),this.Xd--,t.undo()}catch(e){S("undo error: "+e.toString())}finally{this.Bb("FinishedUndo","Undo",t),this.se=!1}}},Ai.prototype.canRedo=function(){if(!this.isEnabled||0<this.transactionLevel)return!1;var t=this.transactionToRedo;return!(null===t||!t.canRedo())},Ai.prototype.redo=function(){if(this.canRedo()){var t=this.transactionToRedo;try{this.se=!0,this.Bb("StartingRedo","Redo",t),this.Xd++,t.redo()}catch(e){S("redo error: "+e.toString())}finally{this.Bb("FinishedRedo","Redo",t),this.se=!1}}},Ai.prototype.Bb=function(t,e,i){void 0===i&&(i=null);var n=new Mi;for(n.change=Si,n.propertyName=t,n.object=i,n.oldValue=e,t=this.models;t.next();)e=t.value,n.model=e,e.zt(n)},Ai.prototype.aw=function(t){if(this.isEnabled&&!this.isUndoingRedoing&&!this.skipsEvent(t)){var e=this.currentTransaction;null===e&&(this.Lr=e=new Ti);var i=t.copy();e=e.changes,e.ea(),e.add(i),e.freeze(),this.checksTransactionLevel&&0>=this.transactionLevel&&!this.Qu&&(t=t.diagram,null!==t&&!1===t.pj||S("Change not within a transaction: "+i.toString()))}},Ai.prototype.skipsEvent=function(t){if(null===t||0>t.change.value)return!0;if(t=t.object,null===t)return!1;if(void 0!==t.layer){if(t=t.layer,null!==t&&t.isTemporary)return!0}else if(t.isTemporary)return!0;return!1},d.Object.defineProperties(Ai.prototype,{models:{get:function(){return this.gv.iterator}},isEnabled:{get:function(){return this.md},set:function(t){this.md=t}},transactionToUndo:{get:function(){return 0<=this.historyIndex&&this.historyIndex<=this.history.count-1?this.history.J(this.historyIndex):null}},transactionToRedo:{get:function(){return this.historyIndex<this.history.count-1?this.history.J(this.historyIndex+1):null}},isUndoingRedoing:{get:function(){return this.se}},history:{get:function(){return this.I}},maxHistoryLength:{get:function(){return this.u},set:function(t){this.u=t}},historyIndex:{get:function(){return this.Xd}},currentTransaction:{get:function(){return this.Lr}},transactionLevel:{get:function(){return this.Yi}},isInTransaction:{get:function(){return 0<this.Yi}},checksTransactionLevel:{get:function(){return this.l},set:function(t){this.l=t}},nestedTransactionNames:{get:function(){return this.ye}},isPendingClear:{get:function(){return this.Zu},set:function(t){this.Zu=t}},isPendingUnmodified:{get:function(){return this.$u},set:function(t){this.$u=t}},isInternalTransaction:{get:function(){return this.Wu},set:function(t){this.Wu=t}},isJustDiscarded:{get:function(){return this.ks}}}),Ai.prototype.handleChanged=Ai.prototype.aw,Ai.prototype.redo=Ai.prototype.redo,Ai.prototype.undo=Ai.prototype.undo,Ai.prototype.canUndo=Ai.prototype.canUndo,Ai.prototype.rollbackTransaction=Ai.prototype.If,Ai.prototype.commitTransaction=Ai.prototype.Xa,Ai.prototype.startTransaction=Ai.prototype.va,Ai.prototype.removeModel=Ai.prototype.Py,Ai.prototype.addModel=Ai.prototype.Vx,Ai.prototype.clear=Ai.prototype.clear,Ai.className="UndoManager",ji.prototype.toString=function(){return""!==this.name?this.name+" Tool":D(this.constructor)},ji.prototype.updateAdornments=function(){},ji.prototype.canStart=function(){return this.isEnabled},ji.prototype.doStart=function(){},ji.prototype.doActivate=function(){this.isActive=!0},ji.prototype.doDeactivate=function(){this.isActive=!1},ji.prototype.doStop=function(){},ji.prototype.doCancel=function(){this.transactionResult=null,this.stopTool()},ji.prototype.stopTool=function(){var t=this.diagram;t.currentTool===this&&(t.currentTool=null,t.currentCursor="")},ji.prototype.doMouseDown=function(){!this.isActive&&this.canStart()&&this.doActivate()},ji.prototype.doMouseMove=function(){},ji.prototype.doMouseUp=function(){this.stopTool()},ji.prototype.doMouseWheel=function(){},ji.prototype.canStartMultiTouch=function(){return!0},ji.prototype.standardPinchZoomStart=function(){var t=this.diagram,e=t.lastInput,i=e.Jq(0,pt.allocAt(NaN,NaN)),n=e.Jq(1,pt.allocAt(NaN,NaN));if(i.s()&&n.s()&&(this.doCancel(),t.Bm("hasGestureZoom"))){t.Vl=t.scale;var o=n.x-i.x,r=n.y-i.y;t.sv=Math.sqrt(o*o+r*r),e.bubbles=!1}pt.free(i),pt.free(n)},ji.prototype.standardPinchZoomMove=function(){var t=this.diagram,e=t.lastInput,i=e.Jq(0,pt.allocAt(NaN,NaN)),n=e.Jq(1,pt.allocAt(NaN,NaN));if(i.s()&&n.s()&&(this.doCancel(),t.Bm("hasGestureZoom"))){var o=n.x-i.x,r=n.y-i.y;r=Math.sqrt(o*o+r*r)/t.sv,o=new pt((Math.min(n.x,i.x)+Math.max(n.x,i.x))/2,(Math.min(n.y,i.y)+Math.max(n.y,i.y))/2),r*=t.Vl;var s=t.commandHandler;if(r!==t.scale&&s.canResetZoom(r)){var a=t.zoomPoint;t.zoomPoint=o,s.resetZoom(r),t.zoomPoint=a}e.bubbles=!1}pt.free(i),pt.free(n)},ji.prototype.doKeyDown=function(){"Esc"===this.diagram.lastInput.key&&this.doCancel()},ji.prototype.doKeyUp=function(){},ji.prototype.va=function(t){return void 0===t&&(t=this.name),this.transactionResult=null,this.diagram.va(t)},ji.prototype.Jg=function(){var t=this.diagram;return null===this.transactionResult?t.If():t.Xa(this.transactionResult)},ji.prototype.standardMouseSelect=function(){var t=this.diagram;if(t.allowSelect){var e=t.lastInput,i=t.zm(e.documentPoint,!1);if(null!==i){if(Y?e.meta:e.control){for(t.R("ChangingSelection",t.selection),e=i;null!==e&&!e.canSelect();)e=e.containingGroup;null!==e&&(e.isSelected=!e.isSelected),t.R("ChangedSelection",t.selection)}else if(e.shift){if(!i.isSelected){for(t.R("ChangingSelection",t.selection),e=i;null!==e&&!e.canSelect();)e=e.containingGroup;null!==e&&(e.isSelected=!0),t.R("ChangedSelection",t.selection)}}else if(!i.isSelected){for(e=i;null!==e&&!e.canSelect();)e=e.containingGroup;null!==e&&t.select(e)}}else!e.left||(Y?e.meta:e.control)||e.shift||t.clearSelection()}},ji.prototype.standardMouseClick=function(t,e){void 0===t&&(t=null),void 0===e&&(e=function(t){return!t.layer.isTemporary});var i=this.diagram,n=i.lastInput;return t=i.Vb(n.documentPoint,t,e),n.targetObject=t,Oi(t,n,i),n.handled},ji.prototype.standardMouseOver=function(){var t=this.diagram,e=t.lastInput;if(!0!==t.animationManager.sc){var i=t.skipsUndoManager;t.skipsUndoManager=!0;var n=t.viewportBounds.$(e.documentPoint)?t.Vb(e.documentPoint,null,null):null;e.targetObject=n;var o=!1;if(n!==t.Ej){var r=t.Ej,s=r;for(t.Ej=n,this.doCurrentObjectChanged(r,n),e.handled=!1;null!==r;){var a=r.mouseLeave;if(null!==a){if(n===r)break;if(null!==n&&n.Gg(r))break;if(a(e,r,n),o=!0,e.handled)break}r=r.panel}for(r=s,e.handled=!1;null!==n;){if(s=n.mouseEnter,null!==s){if(r===n)break;if(null!==r&&r.Gg(n))break;if(s(e,n,r),o=!0,e.handled)break}n=n.panel}n=t.Ej}if(null!==n){for(r=n,s="";null!==r;){if(s=r.cursor,""!==s)break;r=r.panel}for(t.currentCursor=s,e.handled=!1,r=n;null!==r;){if(n=r.mouseOver,null!==n&&(n(e,r),o=!0,e.handled))break;r=r.panel}}else t.currentCursor="",n=t.mouseOver,null!==n&&(n(e),o=!0);o&&t.Db(),t.skipsUndoManager=i}},ji.prototype.doCurrentObjectChanged=function(){},ji.prototype.standardMouseWheel=function(){var t=this.diagram,e=t.lastInput,i=e.delta;if(0!==i&&t.documentBounds.s()){var n=t.commandHandler,o=t.toolManager.mouseWheelBehavior;if(null!==n&&(o===Ii&&!e.shift||o===Bi&&e.control))(0<i?n.canIncreaseZoom():n.canDecreaseZoom())&&(o=t.zoomPoint,t.zoomPoint=e.viewPoint,0<i?n.increaseZoom():n.decreaseZoom(),t.zoomPoint=o),e.bubbles=!1;else if(o===Ii&&e.shift||o===Bi&&!e.control){n=t.position.copy();var r=0<i?i:-i,s=e.event,a=s.deltaMode;if(o=s.deltaX,s=s.deltaY,(z||V||G)&&(a=1,0<o&&(o=3),0>o&&(o=-3),0<s&&(s=3),0>s&&(s=-3)),void 0===a||void 0===o||void 0===s||0===o&&0===s||e.shift)!e.shift&&t.allowVerticalScroll?(r=3*r*t.scrollVerticalLineChange,0<i?t.scroll("pixel","up",r):t.scroll("pixel","down",r)):e.shift&&t.allowHorizontalScroll&&(r=3*r*t.scrollHorizontalLineChange,0<i?t.scroll("pixel","left",r):t.scroll("pixel","right",r));else{switch(a){case 0:i="pixel";break;case 1:i="line";break;case 2:i="page";break;default:i="pixel"}0!==o&&t.allowHorizontalScroll&&(o*=t.scrollHorizontalLineChange/16,0<o?t.scroll(i,"left",-o):t.scroll(i,"right",o)),0!==s&&t.allowVerticalScroll&&(s*=t.scrollVerticalLineChange/16,0<s?t.scroll(i,"up",-s):t.scroll(i,"down",s))}t.position.w(n)||(e.bubbles=!1)}}},ji.prototype.standardWaitAfter=function(t,e){void 0===e&&(e=this.diagram.lastInput),this.cancelWaitAfter();var i=this,n=e.clone(this.lz);this.vt=x((function(){i.doWaitAfter(n)}),t)},ji.prototype.cancelWaitAfter=function(){-1!==this.vt&&y.clearTimeout(this.vt),this.vt=-1},ji.prototype.doWaitAfter=function(){},ji.prototype.findToolHandleAt=function(t,e){return t=this.diagram.Vb(t,(function(t){for(;null!==t&&!(t.panel instanceof Qu);)t=t.panel;return t})),null===t?null:t.part.category===e?t:null},ji.prototype.isBeyondDragSize=function(t,e){var i=this.diagram;void 0===t&&(t=i.firstInput.viewPoint),void 0===e&&(e=i.lastInput.viewPoint);var n=i.toolManager.dragSize,o=n.width;return n=n.height,i.firstInput.isTouchEvent&&(o+=6,n+=6),Math.abs(e.x-t.x)>o||Math.abs(e.y-t.y)>n},d.Object.defineProperties(ji.prototype,{diagram:{get:function(){return this.C},set:function(t){t instanceof Ko&&(this.C=t)}},name:{get:function(){return this.oa},set:function(t){this.oa=t}},isEnabled:{get:function(){return this.md},set:function(t){this.md=t}},isActive:{get:function(){return this.Sc},set:function(t){this.Sc=t}},transactionResult:{get:function(){return this.ix},set:function(t){this.ix=t}}}),ji.prototype.stopTransaction=ji.prototype.Jg,ji.prototype.startTransaction=ji.prototype.va,ji.className="Tool",f(Di,ji),Di.prototype.initializeStandardTools=function(){},Di.prototype.updateAdornments=function(t){var e=this.currentToolTip;if(e instanceof Qu&&this.Kr===t){var i=e.adornedObject;(null!==t?i.part===t:null===i)?this.showToolTip(e,i):this.hideToolTip()}},Di.prototype.doMouseDown=function(){var t=this.diagram,e=t.lastInput;if(e.isTouchEvent&&this.gestureBehavior===zi&&(e.bubbles=!1),e.isMultiTouch){if(this.cancelWaitAfter(),this.gestureBehavior===Vi)return void(e.bubbles=!0);if(this.gestureBehavior===zi)return;if(t.currentTool.canStartMultiTouch())return void t.currentTool.standardPinchZoomStart()}for(var i=this.mouseDownTools.length,n=0;n<i;n++){var o=this.mouseDownTools.J(n);if(o.diagram=this.diagram,o.canStart())return t.doFocus(),t.currentTool=o,void(t.currentTool===o&&(o.isActive||o.doActivate(),o.doMouseDown()))}1===t.lastInput.button&&(this.mouseWheelBehavior===Bi?this.mouseWheelBehavior=Ii:this.mouseWheelBehavior===Ii&&(this.mouseWheelBehavior=Bi)),this.doActivate(),this.standardWaitAfter(this.holdDelay,e)},Di.prototype.doMouseMove=function(){var t=this.diagram,e=t.lastInput;if(e.isMultiTouch){if(this.gestureBehavior===Vi)return void(e.bubbles=!0);if(this.gestureBehavior===zi)return;if(t.currentTool.canStartMultiTouch())return void t.currentTool.standardPinchZoomMove()}if(this.isActive)for(var i=this.mouseMoveTools.length,n=0;n<i;n++){var o=this.mouseMoveTools.J(n);if(o.diagram=this.diagram,o.canStart())return t.doFocus(),t.currentTool=o,void(t.currentTool===o&&(o.isActive||o.doActivate(),o.doMouseMove()))}Fi(this,t),t=e.event,null===t||"mousemove"!==t.type&&"pointermove"!==t.type&&t.cancelable||(e.bubbles=!0)},Di.prototype.doCurrentObjectChanged=function(t,e){t=this.currentToolTip,null===t||null!==e&&t instanceof Qu&&(e===t||e.Gg(t))||this.hideToolTip()},Di.prototype.doWaitAfter=function(t){var e=this.diagram;e.wa&&(this.doMouseHover(),this.isActive||this.doToolTip(),t.isTouchEvent&&!e.lastInput.handled&&(t=t.copy(),t.button=2,t.buttons=2,e.lastInput=t,e.hk=!0,e.doMouseUp()))},Di.prototype.doMouseHover=function(){var t=this.diagram,e=t.lastInput;null===e.targetObject&&(e.targetObject=t.Vb(e.documentPoint,null,null));var i=e.targetObject;if(null!==i)for(e.handled=!1;null!==i;){if(t=this.isActive?i.mouseHold:i.mouseHover,null!==t&&(t(e,i),e.handled))break;i=i.panel}else i=this.isActive?t.mouseHold:t.mouseHover,null!==i&&i(e)},Di.prototype.doToolTip=function(){var t=this.diagram,e=t.lastInput;if(null===e.targetObject&&(e.targetObject=t.Vb(e.documentPoint,null,null)),e=e.targetObject,null!==e){if(t=this.currentToolTip,!(t instanceof Qu)||e!==t&&!e.Gg(t)){for(;null!==e;){if(t=e.toolTip,null!==t)return void this.showToolTip(t,e);e=e.panel}this.hideToolTip()}}else e=t.toolTip,null!==e?this.showToolTip(e,null):this.hideToolTip()},Di.prototype.showToolTip=function(t,e){var i=this.diagram;if(t!==this.currentToolTip&&this.hideToolTip(),t instanceof Qu){t.layerName="Tool",t.selectable=!1,t.scale=1/i.scale,t.category="ToolTip",null!==t.placeholder&&(t.placeholder.scale=i.scale);var n=t.diagram;null!==n&&n!==i&&n.remove(t),i.add(t),null!==e?t.adornedObject=e:t.data=i.model,t.Ta(),this.positionToolTip(t,e)}else t instanceof Fn&&t!==this.currentToolTip&&t.show(e,i,this);if(this.currentToolTip=t,-1!==this.ik&&(y.clearTimeout(this.ik),this.ik=-1),t=this.toolTipDuration,0<t&&1/0!==t){var o=this;this.ik=x((function(){o.hideToolTip()}),t)}},Di.prototype.positionToolTip=function(t){if(null===t.placeholder){var e=this.diagram,i=e.lastInput.documentPoint.copy(),n=t.measuredBounds,o=e.viewportBounds;e.lastInput.isTouchEvent&&(i.x-=n.width),i.x+n.width>o.right&&(i.x-=n.width+5/e.scale),i.x<o.x&&(i.x=o.x),i.y=i.y+20/e.scale+n.height>o.bottom?i.y-(n.height+5/e.scale):i.y+20/e.scale,i.y<o.y&&(i.y=o.y),t.position=i}},Di.prototype.hideToolTip=function(){-1!==this.ik&&(y.clearTimeout(this.ik),this.ik=-1);var t=this.diagram,e=this.currentToolTip;null!==e&&(e instanceof Qu?(t.remove(e),null!==this.Kr&&this.Kr.Hf(e.category),e.data=null,e.adornedObject=null):e instanceof Fn&&null!==e.hide&&e.hide(t,this),this.currentToolTip=null)},Di.prototype.doMouseUp=function(){this.cancelWaitAfter();var t=this.diagram;if(this.isActive)for(var e=this.mouseUpTools.length,i=0;i<e;i++){var n=this.mouseUpTools.J(i);if(n.diagram=this.diagram,n.canStart())return t.doFocus(),t.currentTool=n,void(t.currentTool===n&&(n.isActive||n.doActivate(),n.doMouseUp()))}t.doFocus(),this.doDeactivate()},Di.prototype.doMouseWheel=function(){this.standardMouseWheel()},Di.prototype.doKeyDown=function(){var t=this.diagram;null!==t.commandHandler&&t.commandHandler.doKeyDown()},Di.prototype.doKeyUp=function(){var t=this.diagram;null!==t.commandHandler&&t.commandHandler.doKeyUp()},Di.prototype.findTool=function(t){for(var e=this.mouseDownTools.length,i=0;i<e;i++){var n=this.mouseDownTools.J(i);if(n.name===t)return n}for(e=this.mouseMoveTools.length,i=0;i<e;i++)if(n=this.mouseMoveTools.J(i),n.name===t)return n;for(e=this.mouseUpTools.length,i=0;i<e;i++)if(n=this.mouseUpTools.J(i),n.name===t)return n;return null},Di.prototype.replaceTool=function(t,e){null!==e&&(e.diagram=this.diagram);for(var i=this.mouseDownTools.length,n=0;n<i;n++){var o=this.mouseDownTools.J(n);if(o.name===t)return null!==e?this.mouseDownTools.Pc(n,e):this.mouseDownTools.cb(n),o}for(i=this.mouseMoveTools.length,n=0;n<i;n++)if(o=this.mouseMoveTools.J(n),o.name===t)return null!==e?this.mouseMoveTools.Pc(n,e):this.mouseMoveTools.cb(n),o;for(i=this.mouseUpTools.length,n=0;n<i;n++)if(o=this.mouseUpTools.J(n),o.name===t)return null!==e?this.mouseUpTools.Pc(n,e):this.mouseUpTools.cb(n),o;return null},Di.prototype.Ya=function(t,e,i){null!==e&&(e.name=t,e.diagram=this.diagram),this.findTool(t)?this.replaceTool(t,e):null!==e&&i.add(e)},d.Object.defineProperties(Di.prototype,{mouseWheelBehavior:{get:function(){return this.La},set:function(t){this.La=t}},gestureBehavior:{get:function(){return this.I},set:function(t){this.I=t}},currentToolTip:{get:function(){return this.l},set:function(t){this.l=t,this.Kr=null!==t&&t instanceof Qu?t.adornedPart:null}},mouseDownTools:{get:function(){return this.Cc}},mouseMoveTools:{get:function(){return this.Tc}},mouseUpTools:{get:function(){return this.Od}},hoverDelay:{get:function(){return this.Ka},set:function(t){this.Ka=t}},holdDelay:{get:function(){return this.T},set:function(t){this.T=t}},dragSize:{get:function(){return this.u},set:function(t){this.u=t.H()}},toolTipDuration:{get:function(){return this.eb},set:function(t){this.eb=t}}}),Di.prototype.replaceStandardTool=Di.prototype.Ya;var Bi=new U(Di,"WheelScroll",0),Ii=new U(Di,"WheelZoom",1),Ei=new U(Di,"WheelNone",2),Ri=new U(Di,"GestureZoom",3),zi=new U(Di,"GestureCancel",4),Vi=new U(Di,"GestureNone",5);function Gi(){ji.call(this),this.name="Dragging",this.I=this.Tc=!0,this.u=this.eb=this.Ka=this.qg=null,this.Tn=this.Od=!1,this.jm=new pt(NaN,NaN),this.it=new pt,this.Cc=!0,this.pl=100,this.Xg=[],this.lr=(new nt).freeze(),this.La=new ea,this.Fo=null,this.T="copy",this.Wh="",this.Xh="no-drop"}function Yi(t,e){if(t.dragsLink){var i=t.diagram;i.allowRelink&&(i.model.Ck()&&1===e.count&&e.first()instanceof Nc?(t.draggedLink=e.first(),t.draggedLink.canRelinkFrom()&&t.draggedLink.canRelinkTo()&&t.draggedLink.nk(),t.qg=i.toolManager.findTool("Relinking"),null===t.qg&&(t.qg=new xn,t.qg.diagram=i)):(t.draggedLink=null,t.qg=null))}}function Xi(t){var e=t.diagram,i=e.skipsUndoManager;e.skipsUndoManager=!0,Ji(t,e.lastInput,null),e.skipsUndoManager=i,t.Xg.length=0}function qi(){var t=hn;Ki(t),Wi(t);var e=t.diagram;t.jm.s()&&(e.position=t.jm),e.Jf()}function Ui(t,e){if(null===t.copiedParts){var i=t.diagram;if((!e||!i.isReadOnly&&!i.isModelReadOnly)&&null!==t.draggedParts){var n=i.undoManager;for(n.isEnabled&&n.isInTransaction?null!==n.currentTransaction&&0<n.currentTransaction.changes.count&&(i.undoManager.If(),i.va("Drag")):Wi(t),i.skipsUndoManager=!e,i.partManager.addsToTemporaryLayer=!e,t.startPoint=i.firstInput.documentPoint,e=t.copiesEffectiveCollection?t.draggedParts.Kf():i.selection,e=i.tk(e,i,!0),i=new dt,n=t.draggedParts.iterator;n.next();){var o=n.key;if(o.Nc()&&o.canCopy()){var r=e.G(o);null!==r&&(r.location=o.location,r.Ta(),i.add(r,t.Cd(r.location)))}}for(e=e.iterator;e.next();)n=e.value,n instanceof Nc&&n.canCopy()&&i.add(n,t.Cd());t.copiedParts=i,Yi(t,i.Kf()),null!==t.draggedLink&&(i=t.draggedLink,e=i.routeBounds,Ac(i,t.startPoint.x-(e.x+e.width/2),t.startPoint.y-(e.y+e.height/2)))}}}function Ki(t){var e=t.diagram;if(null!==t.copiedParts&&(e.gu(t.copiedParts.Kf(),!1),t.copiedParts=null,null!==t.draggedParts))for(var i=t.draggedParts.iterator;i.next();)i.key instanceof Nc&&(i.value.point=new pt(0,0));e.skipsUndoManager=!1,e.partManager.addsToTemporaryLayer=!1,t.startPoint=e.firstInput.documentPoint}function Hi(t){if(null!==t.draggedLink){if(t.dragsLink&&null!==t.qg){var e=t.qg;e.diagram.remove(e.temporaryFromNode),e.diagram.remove(e.temporaryToNode)}t.draggedLink=null,t.qg=null}}function _i(t,e,i){var n=t.diagram,o=t.startPoint,r=pt.alloc();r.assign(n.lastInput.documentPoint),t.moveParts(e,r.ge(o),i),pt.free(r),!0===n.Ke("temporaryPixelRatio")&&null===n.yh&&30<n.Yx&&(Jo(n),n.Yq())}function Wi(t){if(null!==t.draggedParts){for(var e=t.diagram,i=t.draggedParts.iterator;i.next();){var n=i.key;n.Nc()&&(n.location=i.value.point)}for(i=t.draggedParts.iterator;i.next();)if(n=i.key,n instanceof Nc&&n.suspendsRouting){var o=i.value.point;t.draggedParts.add(n,t.Cd()),Ac(n,-o.x,-o.y)}e.hd()}}function $i(t,e){var i=t.diagram;t.dragsLink&&(null!==t.draggedLink&&(t.draggedLink.fromNode=null,t.draggedLink.toNode=null),tn(t,!1));var n=t.findDragOverObject(e),o=i.lastInput;o.targetObject=n,t.doUpdateCursor(n);var r=i.skipsUndoManager,s=!1;try{if(i.skipsUndoManager=!0,s=Ji(t,o,n),!t.isActive&&null===hn)return;var a=null!==n?n.part:null;if(null===a||i.handlesDragDropForTopLevelParts&&a.isTopLevel&&!(a instanceof bc)){var h=i.mouseDragOver;null!==h&&(h(o),s=!0)}if(!t.isActive&&null===hn)return;if(t.doDragOver(e,n),!t.isActive&&null===hn)return}finally{i.skipsUndoManager=r,s&&i.hd()}t.Fo=n,i.isReadOnly||!i.allowMove&&!i.allowCopy||!i.allowHorizontalScroll&&!i.allowVerticalScroll||i.Et(o.viewPoint)}function Ji(t,e,i){var n=!1,o=t.Xg.length,r=0<o?t.Xg[0]:null;if(i===r)return!1;e.handled=!1;for(var s=0;s<o;s++){var a=t.Xg[s],h=a.mouseDragLeave;if(null!==h&&(h(e,a,i),n=!0,e.handled))break}if(t.Xg.length=0,!t.isActive&&null===hn||null===i)return n;for(e.handled=!1,o=i;null!==o;)t.Xg.push(o),o=Zi(o);for(o=t.Xg.length,i=0;i<o&&(s=t.Xg[i],a=s.mouseDragEnter,null===a||(a(e,s,r),n=!0,!e.handled));i++);return n}function Zi(t){var e=t.panel;return null!==e?e:t instanceof Lu&&!(t instanceof bc)&&(t=t.containingGroup,null!==t&&t.handlesDragDropForMembers)?t:null}function Qi(t,e,i){var n=t.qg;if(null===n)return null;var o=t.diagram.Eg(e,n.portGravity,(function(t){return n.findValidLinkablePort(t,i)}));t=pt.alloc();var r=1/0,s=null;for(o=o.iterator;o.next();){var a=o.value;if(null!==a.part){var h=a.da(ae,t);h=e.Ie(h),h<r&&(s=a,r=h)}}return pt.free(t),s}function tn(t,e){var i=t.draggedLink;if(null!==i&&!(2>i.pointsCount)){var n=t.diagram;if(!n.isReadOnly){var o=t.qg;if(null!==o){var r=null,s=null;null===i.fromNode&&(r=Qi(t,i.i(0),!1),null!==r&&(s=r.part));var a=null,h=null;null===i.toNode&&(a=Qi(t,i.i(i.pointsCount-1),!0),null!==a&&(h=a.part)),o.isValidLink(s,r,h,a)?e?(i.defaultFromPoint=i.i(0),i.defaultToPoint=i.i(i.pointsCount-1),i.suspendsRouting=!1,i.fromNode=s,null!==r&&(i.fromPortId=r.portId),i.toNode=h,null!==a&&(i.toPortId=a.portId),i.fromPort!==n.Ky&&n.R("LinkRelinked",i,n.Ky),i.toPort!==n.Ly&&n.R("LinkRelinked",i,n.Ly)):bn(o,s,r,h,a):bn(o,null,null,null,null)}}}}function en(t,e){var i=t.diagram;t.dragsLink&&tn(t,!0),Xi(t);var n=t.findDragOverObject(e),o=i.lastInput;if(o.targetObject=n,null!==n){o.handled=!1;for(var r=n;null!==r;){var s=r.mouseDrop;if(null!==s&&(s(o,r),o.handled))break;nn(t,o,r),r=Zi(r)}}else r=i.mouseDrop,null!==r&&r(o);if(t.isActive||null!==hn){for(o=(t.copiedParts||t.draggedParts).iterator;o.next();)r=o.key,r instanceof ec&&r.linksConnected.each((function(t){t.suspendsRouting=!1}));if(t.doDropOnto(e,n),t.isActive||null!==hn){for(t=zt.alloc(),e=i.selection.iterator;e.next();)n=e.value,n instanceof ec&&on(i,n,t);zt.free(t)}}}function nn(t,e,i){t=t.diagram,i=i.part,!t.handlesDragDropForTopLevelParts||!i.isTopLevel||i instanceof bc||(i=t.mouseDrop,null!==i&&i(e))}function on(t,e,i){var n=!1;if(e.getAvoidableRect(i),t.viewportBounds.Ge(i)&&(n=!0),t=t.Vv(i,(function(t){return t.part}),(function(t){return t instanceof Nc}),!0,(function(t){return t instanceof Nc}),n),0!==t.count)for(t=t.iterator;t.next();)i=t.value,!i.Kd(e)&&i.isAvoiding&&i.Ua()}function rn(t){if(null!==t.draggedParts)for(var e=t.draggedParts.iterator;e.next();){var i=e.key;i instanceof ec&&(i=i.containingGroup,null===i||null===i.placeholder||t.draggedParts.contains(i)||i.placeholder.o())}}function sn(t,e,i,n){if(null===t.copiedParts){var o=t.diagram;if(!o.isReadOnly&&!o.isModelReadOnly){o.skipsUndoManager=!i,o.partManager.addsToTemporaryLayer=!i,t.startPoint=n.documentPoint,i=o.tk(e,o,!0);var r=zt.alloc();o=n=1/0;for(var s=-1/0,a=-1/0,h=e.iterator;h.next();){var l=h.value;if(l.isVisible()){var u=l.location;l=u.x,u=u.y,isNaN(l)||isNaN(u)||(l<n&&(n=l),u<o&&(o=u),l>s&&(s=l),u>a&&(a=u))}}for(1/0===n?r.h(0,0,0,0):r.h(n,o,s-n,a-o),n=r.x+r.width/2,o=r.y+r.height/2,zt.free(r),r=t.it,s=new dt,a=pt.alloc(),h=e.iterator;h.next();)l=h.value,l instanceof Nc&&l.canCopy()&&(u=i.G(l),null!==u&&(u.points=l.points,Ac(u,r.x-n,r.y-o),u.suspendsRouting=!0,s.add(u,t.Cd())));for(e=e.iterator;e.next();)l=e.value,l.Nc()&&l.canCopy()&&(h=i.G(l),null!==h&&(l=l.location,a.h(r.x-(n-l.x),r.y-(o-l.y)),h.location=a,h.Ta(),s.add(h,t.Cd(a))));pt.free(a),t.copiedParts=s,Yi(t,s.Kf()),null!==t.draggedLink&&(i=t.draggedLink,e=i.routeBounds,Ac(i,t.startPoint.x-(e.x+e.width/2),t.startPoint.y-(e.y+e.height/2)))}}}Di.className="ToolManager",Di.WheelScroll=Bi,Di.WheelZoom=Ii,Di.WheelNone=Ei,Di.GestureZoom=Ri,Di.GestureCancel=zi,Di.GestureNone=Vi,f(Gi,ji),Gi.prototype.canStart=function(){if(!this.isEnabled)return!1;var t=this.diagram;if(t.isReadOnly&&!t.allowDragOut||!t.allowMove&&!t.allowCopy&&!t.allowDragOut||!t.allowSelect)return!1;var e=t.lastInput;return!(!e.left||t.currentTool!==this&&(!this.isBeyondDragSize()||e.isTouchEvent&&e.timestamp-t.firstInput.timestamp<this.pl))&&null!==this.findDraggablePart()},Gi.prototype.findDraggablePart=function(){var t=this.diagram;if(t=t.zm(t.firstInput.documentPoint,!1),null===t)return null;for(;null!==t&&!t.canSelect();)t=t.containingGroup;return null!==t&&(t.canMove()||t.canCopy())?t:null},Gi.prototype.standardMouseSelect=function(){var t=this.diagram;if(t.allowSelect){var e=t.zm(t.firstInput.documentPoint,!1);if(null!==e){for(;null!==e&&!e.canSelect();)e=e.containingGroup;this.currentPart=e,null===this.currentPart||this.currentPart.isSelected||(t.R("ChangingSelection",t.selection),e=t.lastInput,(Y?e.meta:e.control)||e.shift||t.clearSelection(!0),this.currentPart.isSelected=!0,t.R("ChangedSelection",t.selection))}}},Gi.prototype.doActivate=function(){var t=this.diagram;this.Fo=null,null===this.currentPart&&this.standardMouseSelect();var e=this.currentPart;null!==e&&(e.canMove()||e.canCopy())&&(hn=null,this.isActive=!0,this.jm.set(t.position),Yi(this,t.selection),this.Xg.length=0,t.animationManager.Bc(),this.draggedParts=this.computeEffectiveCollection(t.selection,this.dragOptions),t.mu=!0,!0===t.Ke("temporaryPixelRatio")&&30<t.Yx&&Jo(t),zr(t,this.draggedParts),this.va("Drag"),this.startPoint=t.firstInput.documentPoint,t.isMouseCaptured=!0,t.allowDragOut&&(this.isDragOutStarted=!0,this.Tn=!1,hn=this,ln=this.diagram,this.doSimulatedDragOut()))},Gi.prototype.computeEffectiveCollection=function(t,e){return this.diagram.commandHandler.computeEffectiveCollection(t,e)},Gi.prototype.Cd=function(t){return void 0===t?new Ys(At):this.isGridSnapEnabled?new Ys(new pt(Math.round(1e3*t.x)/1e3,Math.round(1e3*t.y)/1e3)):new Ys(t.copy())},Gi.prototype.doDeactivate=function(){this.isActive=!1;var t=this.diagram;if(t.Jf(),Xi(this),Vr(t,this.draggedParts),this.draggedParts=this.currentPart=this.Fo=null,this.Tn=this.isDragOutStarted=!1,0<an.count){for(var e=an,i=e.length,n=0;n<i;n++){var o=e.J(n);Hi(o),Ki(o),Xi(o),o.diagram.Jf()}e.clear()}Hi(this),this.jm.h(NaN,NaN),hn=ln=null,Ki(this),t.isMouseCaptured=!1,t.currentCursor="",t.mu=!1,this.Jg(),Zo(t,!0)},Gi.prototype.doCancel=function(){Ki(this),Wi(this);var t=this.diagram;this.jm.s()&&(t.position=this.jm),this.stopTool()},Gi.prototype.doKeyDown=function(){var t=this.diagram,e=t.lastInput;this.isActive&&("Esc"===e.key?this.doCancel():e.key!==t.previousInput.key&&this.doMouseMove())},Gi.prototype.doKeyUp=function(){this.isActive&&this.doMouseMove()},Gi.prototype.moveParts=function(t,e,i){void 0===i&&(i=!1);var n=this.diagram;null!==n&&Ir(n,t,e,this.dragOptions,i)},Gi.prototype.findDragOverObject=function(t){var e=this;return hr(this.diagram,t,null,(function(t){return null===t?t=!0:(t=t.part,t=!!(null===t||t instanceof Qu||t.layer.isTemporary||e.draggedParts&&e.draggedParts.contains(t)||e.copiedParts&&e.copiedParts.contains(t))),!t}))},Gi.prototype.doUpdateCursor=function(t){var e=this.diagram;this.Fo!==t&&(!this.diagram.currentTool.isActive||this.mayCopy()?e.currentCursor=this.copyCursor:this.mayMove()?e.currentCursor=this.moveCursor:this.mayDragOut()&&(e.currentCursor=this.nodropCursor))},Gi.prototype.doDragOver=function(){},Gi.prototype.doDropOnto=function(){},Gi.prototype.doMouseMove=function(){if(this.isActive){var t=this.diagram,e=t.lastInput;this.simulatedMouseMove(e.event,e.documentPoint,e.targetDiagram)||null===this.currentPart||null===this.draggedParts||(this.mayCopy()?(Ui(this,!1),zr(t,this.copiedParts),_i(this,this.copiedParts,!1),Vr(t,this.copiedParts)):this.mayMove()?(Ki(this),_i(this,this.draggedParts,!0)):this.mayDragOut()?(Ui(this,!1),_i(this,this.copiedParts,!1)):Ki(this),$i(this,t.lastInput.documentPoint))}},Gi.prototype.doMouseUp=function(){if(this.isActive){var t=this.diagram,e=t.lastInput;if(!this.simulatedMouseUp(e.event,e.documentPoint,e.targetDiagram)){e=!1;var i=this.mayCopy();if(i&&null!==this.copiedParts?(Ki(this),Ui(this,!0),zr(t,this.copiedParts),_i(this,this.copiedParts,!1),Vr(t,this.copiedParts),null!==this.copiedParts&&(t.R("ChangingSelection",t.selection),t.clearSelection(!0),this.copiedParts.iteratorKeys.each((function(t){t.isSelected=!0})))):(e=!0,Ki(this),this.mayMove()&&(_i(this,this.draggedParts,!0),$i(this,t.lastInput.documentPoint))),this.Tn=!0,en(this,t.lastInput.documentPoint),this.isActive){var n=i?this.copiedParts.Kf():this.draggedParts.Kf();this.copiedParts=null,e&&rn(this),t.Na(),Vr(t,this.draggedParts),this.transactionResult=i?"Copy":"Move",t.R(i?"SelectionCopied":"SelectionMoved",n)}this.stopTool(),i&&t.R("ChangedSelection",t.selection)}}},Gi.prototype.simulatedMouseMove=function(t,e,i){if(null===hn)return!1;var n=hn.diagram;i instanceof Ko||(i=null);var o=ln;return i!==o&&(null!==o&&o!==n&&(o.Jf(),hn.isDragOutStarted=!1,o=o.toolManager.findTool("Dragging"),null!==o&&o.doSimulatedDragLeave()),ln=i,null!==i&&i!==n&&(qi(),o=i.toolManager.findTool("Dragging"),null!==o&&(an.contains(o)||an.add(o),o.doSimulatedDragEnter()))),!(null===i||i===n||!i.allowDrop||i.isReadOnly||!i.allowInsert)&&(n=i.toolManager.findTool("Dragging"),null!==n&&(null!==t&&(void 0!==t.targetTouches&&(0<t.targetTouches.length?t=t.targetTouches[0]:0<t.changedTouches.length&&(t=t.changedTouches[0])),e=i.getMouse(t)),i.lastInput.documentPoint=e,i.lastInput.viewPoint=i.gr(e),i.lastInput.down=!1,i.lastInput.up=!1,n.doSimulatedDragOver()),!0)},Gi.prototype.simulatedMouseUp=function(t,e,i){if(null===hn)return!1;var n=ln,o=hn.diagram;if(null===i)return hn.doCancel(),!0;if(i!==n){var r=n.toolManager.findTool("Dragging");if(null!==n&&n!==o&&null!==r)return n.Jf(),hn.isDragOutStarted=!1,r.doSimulatedDragLeave(),!1;ln=i,n=i.toolManager.findTool("Dragging"),null!==n&&(qi(),an.contains(n)||an.add(n),n.doSimulatedDragEnter())}return i!==this.diagram&&(null!==t?(void 0!==t.targetTouches&&(0<t.targetTouches.length?t=t.targetTouches[0]:0<t.changedTouches.length&&(t=t.changedTouches[0])),e=i.getMouse(t)):null===e&&(e=new pt),i.lastInput.documentPoint=e,i.lastInput.viewPoint=i.gr(e),i.lastInput.down=!1,i.lastInput.up=!0,t=i.toolManager.findTool("Dragging"),null!==t&&t.doSimulatedDrop(),t=hn,null!==t&&(i=t.mayCopy(),t.transactionResult=i?"Copy":"Move",t.stopTool()),!0)},Gi.prototype.mayCopy=function(){if(!this.isCopyEnabled)return!1;var t=this.diagram;if(t.isReadOnly||t.isModelReadOnly||!t.allowInsert||!t.allowCopy||(Y?!t.lastInput.alt:!t.lastInput.control))return!1;for(t=t.selection.iterator;t.next();)if(t.value.canCopy())return!0;return!(null===this.draggedLink||!this.dragsLink||!this.draggedLink.canCopy())},Gi.prototype.mayDragOut=function(){if(!this.isCopyEnabled)return!1;var t=this.diagram;if(!t.allowDragOut||!t.allowCopy||t.allowMove)return!1;for(t=t.selection.iterator;t.next();)if(t.value.canCopy())return!0;return!(null===this.draggedLink||!this.dragsLink||!this.draggedLink.canCopy())},Gi.prototype.mayMove=function(){var t=this.diagram;if(t.isReadOnly||!t.allowMove)return!1;for(t=t.selection.iterator;t.next();)if(t.value.canMove())return!0;return!(null===this.draggedLink||!this.dragsLink||!this.draggedLink.canMove())},Gi.prototype.computeBorder=function(t,e,i){return this.Tn||null===this.draggedParts||this.draggedParts.contains(t)?null:i.assign(e)},Gi.prototype.lA=function(){return hn},Gi.prototype.mayDragIn=function(){var t=this.diagram;if(!t.allowDrop||t.isReadOnly||t.isModelReadOnly||!t.allowInsert)return!1;var e=hn;return null!==e&&e.diagram.model.dataFormat===t.model.dataFormat},Gi.prototype.doSimulatedDragEnter=function(){if(this.mayDragIn()){var t=this.diagram;t.animationManager.Bc(),kr(t),t.animationManager.Bc();var e=hn;null!==e&&(e.diagram.mu=!1),this.doUpdateCursor(t.grid)}},Gi.prototype.doSimulatedDragLeave=function(){var t=hn;null!==t&&t.doSimulatedDragOut(),this.doCancel()},Gi.prototype.doSimulatedDragOver=function(){var t=this.diagram;t.animationManager.tn=!0;var e=hn;if(null!==e&&null!==e.draggedParts){if(!this.mayDragIn())return;sn(this,e.draggedParts.Kf(),!1,t.firstInput),_i(this,this.copiedParts,!1),$i(this,t.lastInput.documentPoint)}t.animationManager.tn=!1},Gi.prototype.doSimulatedDrop=function(){var t=this.diagram,e=hn;if(null!==e){var i=e.diagram;if(e.Tn=!0,Ki(this),!this.mayDragIn())return;t.animationManager.tn=!0,t.R("ChangingSelection",t.selection),this.va("Drop"),sn(this,e.draggedParts.Kf(),!0,t.lastInput),_i(this,this.copiedParts,!1),null!==this.copiedParts&&(t.clearSelection(!0),this.copiedParts.iteratorKeys.each((function(t){t.isSelected=!0}))),en(this,t.lastInput.documentPoint),t.Na(),e=t.selection,null!==this.copiedParts?this.transactionResult="ExternalCopy":e=new nt,this.copiedParts=null,t.doFocus(),t.R("ExternalObjectsDropped",e,i),this.Jg(),t.R("ChangedSelection",t.selection)}t.animationManager.tn=!1},Gi.prototype.doSimulatedDragOut=function(){var t=this.diagram;t.mu=!1,this.mayCopy()||this.mayMove()?t.currentCursor="":t.currentCursor=this.nodropCursor,this.Fo=null},Gi.prototype.computeMove=function(t,e,i,n){return i=this.diagram,null!==i?i.computeMove(t,e,this.dragOptions,n):new pt},d.Object.defineProperties(Gi.prototype,{isCopyEnabled:{get:function(){return this.Tc},set:function(t){this.Tc=t}},copiesEffectiveCollection:{get:function(){return this.I},set:function(t){this.I=t}},dragOptions:{get:function(){return this.La},set:function(t){this.La=t}},isGridSnapEnabled:{get:function(){return this.dragOptions.isGridSnapEnabled},set:function(t){this.dragOptions.isGridSnapEnabled=t}},isComplexRoutingRealtime:{get:function(){return this.Cc},set:function(t){this.Cc=t}},isGridSnapRealtime:{get:function(){return this.dragOptions.isGridSnapRealtime},set:function(t){this.dragOptions.isGridSnapRealtime=t}},gridSnapCellSize:{get:function(){return this.dragOptions.gridSnapCellSize},set:function(t){this.dragOptions.gridSnapCellSize.w(t)||(t=t.H(),this.dragOptions.gridSnapCellSize=t)}},gridSnapCellSpot:{get:function(){return this.dragOptions.gridSnapCellSpot},set:function(t){this.dragOptions.gridSnapCellSpot.w(t)||(t=t.H(),this.dragOptions.gridSnapCellSpot=t)}},gridSnapOrigin:{get:function(){return this.dragOptions.gridSnapOrigin},set:function(t){this.dragOptions.gridSnapOrigin.w(t)||(t=t.H(),this.dragOptions.gridSnapOrigin=t)}},dragsLink:{get:function(){return this.dragOptions.dragsLink},set:function(t){this.dragOptions.dragsLink=t}},dragsTree:{get:function(){return this.dragOptions.dragsTree},set:function(t){this.dragOptions.dragsTree=t}},copyCursor:{get:function(){return this.T},set:function(t){this.T=t}},moveCursor:{get:function(){return this.Wh},set:function(t){this.Wh=t}},nodropCursor:{get:function(){return this.Xh},set:function(t){this.Xh=t}},currentPart:{get:function(){return this.Ka},set:function(t){this.Ka=t}},copiedParts:{get:function(){return this.u},set:function(t){this.u=t}},draggedParts:{get:function(){return this.eb},set:function(t){this.eb=t}},draggingParts:{get:function(){return null!==this.copiedParts?this.copiedParts.Kf():null!==this.draggedParts?this.draggedParts.Kf():this.lr}},draggedLink:{get:function(){return this.diagram.draggedLink},set:function(t){this.diagram.draggedLink=t}},isDragOutStarted:{get:function(){return this.Od},set:function(t){this.Od=t}},startPoint:{get:function(){return this.it},set:function(t){this.it.w(t)||this.it.assign(t)}},delay:{get:function(){return this.pl},set:function(t){this.pl=t}}}),Gi.prototype.getDraggingSource=Gi.prototype.lA;var an=null,hn=null,ln=null;function un(){ji.call(this),this.Xh=100,this.La=!1,this.oi="pointer";var t=new Nc,e=new Nl;e.isPanelMain=!0,e.stroke="blue",t.add(e),e=new Nl,e.toArrow="Standard",e.fill="blue",e.stroke="blue",t.add(e),t.layerName="Tool",this.gx=t,t=new ec,e=new Nl,e.portId="",e.figure="Rectangle",e.fill=null,e.stroke="magenta",e.strokeWidth=2,e.desiredSize=Mt,t.add(e),t.selectable=!1,t.layerName="Tool",this.ex=t,this.l=e,t=new ec,e=new Nl,e.portId="",e.figure="Rectangle",e.fill=null,e.stroke="magenta",e.strokeWidth=2,e.desiredSize=Mt,t.add(e),t.selectable=!1,t.layerName="Tool",this.hx=t,this.u=e,this.Wh=this.Od=this.Cc=this.eb=this.Tc=null,this.Ka=!0,this.cz=new dt,this.lr=this.Ii=this.bx=null}function cn(t,e,i,n){if(e===i)return!0;var o=e.fromNode;return!(null===o||!o.isLinkLabel||(n.add(o),!cn(t,o.labeledLink,i,n)))||(e=e.toNode,!(null===e||!e.isLinkLabel||(n.add(e),!cn(t,e.labeledLink,i,n))))}function fn(t,e,i,n,o){if(e===i)return!0;if(null===e||null===i)return!1;for(var r=e.linksConnected;r.next();){var s=r.value;if(s!==n&&(!o||s.isTreeLink)&&s.toNode===e&&(s=s.fromNode,s!==e&&fn(t,s,i,n,o)))return!0}return!1}function dn(t,e,i,n,o){if(i===n)return!0;if(null===i||null===n||e.contains(i))return!1;e.add(i);for(var r=i.linksConnected;r.next();){var s=r.value;if(s!==o&&s.toNode===i&&(s=s.fromNode,s!==i&&dn(t,e,s,n,o)))return!0}return!1}function pn(t,e,i,n,o){if(i===n)return!0;if(null===i||null===n||e.contains(i))return!1;e.add(i);for(var r=i.linksConnected;r.next();){var s=r.value;if(s!==o){var a=s.fromNode;if(s=s.toNode,a=a===i?s:a,a!==i&&pn(t,e,a,n,o))return!0}}return!1}function gn(){un.call(this),this.name="Linking",this.T={},this.I=null,this.K=yn,this.en=null}Gi.className="DraggingTool",an=new et,I("draggingTool",(function(){return this.findTool("Dragging")}),(function(t){this.Ya("Dragging",t,this.mouseMoveTools)})),Di.prototype.doCancel=function(){null!==hn&&hn.doCancel(),ji.prototype.doCancel.call(this)},f(un,ji),un.prototype.doStop=function(){this.diagram.Jf(),this.originalToPort=this.originalToNode=this.originalFromPort=this.originalFromNode=this.originalLink=null,this.validPortsCache.clear(),this.targetPort=null},un.prototype.copyPortProperties=function(t,e,i,n,o){if(null!==t&&null!==e&&null!==i&&null!==n){var r=e.Af(),s=Bt.alloc();s.width=e.naturalBounds.width*r,s.height=e.naturalBounds.height*r,n.desiredSize=s,Bt.free(s),o?(n.toSpot=e.toSpot,n.toEndSegmentLength=e.toEndSegmentLength):(n.fromSpot=e.fromSpot,n.fromEndSegmentLength=e.fromEndSegmentLength),i.locationSpot=ae,r=pt.alloc(),i.location=e.da(ae,r),pt.free(r),n.angle=e.lj(),null!==this.portTargeted&&this.portTargeted(t,e,i,n,o)}},un.prototype.setNoTargetPortProperties=function(t,e,i){null!==e&&(e.desiredSize=Mt,e.fromSpot=ie,e.toSpot=ie),null!==t&&(t.location=this.diagram.lastInput.documentPoint),null!==this.portTargeted&&this.portTargeted(null,null,t,e,i)},un.prototype.doMouseDown=function(){this.isActive&&this.doMouseMove()},un.prototype.doMouseMove=function(){if(this.isActive){var t=this.diagram;if(this.targetPort=this.findTargetPort(this.isForwards),null!==this.targetPort&&this.targetPort.part instanceof ec){var e=this.targetPort.part;this.isForwards?this.copyPortProperties(e,this.targetPort,this.temporaryToNode,this.temporaryToPort,!0):this.copyPortProperties(e,this.targetPort,this.temporaryFromNode,this.temporaryFromPort,!1)}else this.isForwards?this.setNoTargetPortProperties(this.temporaryToNode,this.temporaryToPort,!0):this.setNoTargetPortProperties(this.temporaryFromNode,this.temporaryFromPort,!1);(t.allowHorizontalScroll||t.allowVerticalScroll)&&t.Et(t.lastInput.viewPoint)}},un.prototype.findValidLinkablePort=function(t,e){if(null===t)return null;var i=t.part;if(!(i instanceof ec))return null;for(;null!==t;){var n=e?t.toLinkable:t.fromLinkable;if(!0===n&&(null!==t.portId||t instanceof ec)&&(e?this.isValidTo(i,t):this.isValidFrom(i,t)))return t;if(!1===n)break;t=t.panel}return null},un.prototype.findTargetPort=function(t){var e=this.diagram,i=e.lastInput.documentPoint,n=this.portGravity;0>=n&&(n=.1);var o=this,r=e.Eg(i,n,(function(e){return o.findValidLinkablePort(e,t)}),null,!0);for(n=1/0,e=null,r=r.iterator;r.next();){var s=r.value,a=s.part;if(a instanceof ec){var h=s.da(ae,pt.alloc()),l=i.x-h.x,u=i.y-h.y;pt.free(h),h=l*l+u*u,h<n&&(l=this.validPortsCache.G(s),null!==l?l&&(e=s,n=h):t&&this.isValidLink(this.originalFromNode,this.originalFromPort,a,s)||!t&&this.isValidLink(a,s,this.originalToNode,this.originalToPort)?(this.validPortsCache.add(s,!0),e=s,n=h):this.validPortsCache.add(s,!1))}}return null!==e&&(i=e.part,i instanceof ec&&(null===i.layer||i.layer.allowLink))?e:null},un.prototype.isValidFrom=function(t,e){if(null===t||null===e)return this.isUnconnectedLinkValid;if(this.diagram.currentTool===this&&(null!==t.layer&&!t.layer.allowLink||!0!==e.fromLinkable))return!1;var i=e.fromMaxLinks;if(1/0>i){if(null!==this.originalLink&&t===this.originalFromNode&&e===this.originalFromPort)return!0;if(e=e.portId,null===e&&(e=""),t.Fq(e).count>=i)return!1}return!0},un.prototype.isValidTo=function(t,e){if(null===t||null===e)return this.isUnconnectedLinkValid;if(this.diagram.currentTool===this&&(null!==t.layer&&!t.layer.allowLink||!0!==e.toLinkable))return!1;var i=e.toMaxLinks;if(1/0>i){if(null!==this.originalLink&&t===this.originalToNode&&e===this.originalToPort)return!0;if(e=e.portId,null===e&&(e=""),t.Hd(e).count>=i)return!1}return!0},un.prototype.isInSameNode=function(t,e){return null!==t&&null!==e&&(t===e||(t=t.part,e=e.part,null!==t&&t===e))},un.prototype.isLinked=function(t,e){if(null===t||null===e)return!1;var i=t.part;if(!(i instanceof ec))return!1;t=t.portId,null===t&&(t="");var n=e.part;if(!(n instanceof ec))return!1;for(e=e.portId,null===e&&(e=""),e=n.Hd(e);e.next();)if(n=e.value,n.fromNode===i&&n.fromPortId===t)return!0;return!1},un.prototype.isValidLink=function(t,e,i,n){if(!this.isValidFrom(t,e)||!this.isValidTo(i,n)||!(null===e||null===n||(e.fromLinkableSelfNode&&n.toLinkableSelfNode||!this.isInSameNode(e,n))&&(e.fromLinkableDuplicates&&n.toLinkableDuplicates||!this.isLinked(e,n)))||null!==this.originalLink&&(null!==t&&this.isLabelDependentOnLink(t,this.originalLink)||null!==i&&this.isLabelDependentOnLink(i,this.originalLink))||null!==t&&null!==i&&(null===t.data&&null!==i.data||null!==t.data&&null===i.data)||!this.isValidCycle(t,i,this.originalLink))return!1;if(null!==t){var o=t.linkValidation;if(null!==o&&!o(t,e,i,n,this.originalLink))return!1}return!(null!==i&&(o=i.linkValidation,null!==o&&!o(t,e,i,n,this.originalLink)))&&(o=this.linkValidation,null===o||o(t,e,i,n,this.originalLink))},un.prototype.isLabelDependentOnLink=function(t,e){if(null===t)return!1;var i=t.labeledLink;if(null===i)return!1;if(i===e)return!0;var n=new nt;return n.add(t),cn(this,i,e,n)},un.prototype.isValidCycle=function(t,e,i){if(void 0===i&&(i=null),null===t||null===e)return this.isUnconnectedLinkValid;var n=this.diagram.validCycle;if(n!==ks){if(n===Ns){if(n=i||this.temporaryLink,null!==n&&!n.isTreeLink)return!0;for(n=e.linksConnected;n.next();){var o=n.value;if(o!==i&&o.isTreeLink&&o.toNode===e)return!1}return!fn(this,t,e,i,!0)}if(n===Cs){if(n=i||this.temporaryLink,null!==n&&!n.isTreeLink)return!0;for(n=t.linksConnected;n.next();)if(o=n.value,o!==i&&o.isTreeLink&&o.fromNode===t)return!1;return!fn(this,t,e,i,!0)}if(n===Ms)return t===e?t=!0:(n=new nt,n.add(e),t=dn(this,n,t,e,i)),!t;if(n===Ss)return!fn(this,t,e,i,!1);if(n===Ps)return t===e?t=!0:(n=new nt,n.add(e),t=pn(this,n,t,e,i)),!t}return!0},d.Object.defineProperties(un.prototype,{portGravity:{get:function(){return this.Xh},set:function(t){0<=t&&(this.Xh=t)}},isUnconnectedLinkValid:{get:function(){return this.La},set:function(t){this.La=t}},linkingCursor:{get:function(){return this.oi},set:function(t){this.oi=t}},temporaryLink:{get:function(){return this.gx},set:function(t){this.gx=t}},temporaryFromNode:{get:function(){return this.ex},set:function(t){(this.ex=t)&&(this.l=t.port)}},temporaryFromPort:{get:function(){return this.l},set:function(t){if(null!==this.l){var e=this.l.panel;if(null!==e){var i=e.W.indexOf(this.l);e.cb(i),e.wb(i,t)}}this.l=t}},temporaryToNode:{get:function(){return this.hx},set:function(t){(this.hx=t)&&(this.u=t.port)}},temporaryToPort:{get:function(){return this.u},set:function(t){if(null!==this.u){var e=this.u.panel;if(null!==e){var i=e.W.indexOf(this.u);e.cb(i),e.wb(i,t)}}this.u=t}},originalLink:{get:function(){return this.Tc},set:function(t){this.Tc=t}},originalFromNode:{get:function(){return this.eb},set:function(t){this.eb=t}},originalFromPort:{get:function(){return this.Cc},set:function(t){this.Cc=t}},originalToNode:{get:function(){return this.Od},set:function(t){this.Od=t}},originalToPort:{get:function(){return this.Wh},set:function(t){this.Wh=t}},isForwards:{get:function(){return this.Ka},set:function(t){this.Ka=t}},validPortsCache:{get:function(){return this.cz}},targetPort:{get:function(){return this.bx},set:function(t){this.bx=t}},linkValidation:{get:function(){return this.Ii},set:function(t){this.Ii=t}},portTargeted:{get:function(){return this.lr},set:function(t){this.lr=t}}}),un.className="LinkingBaseTool",f(gn,un),gn.prototype.canStart=function(){if(!this.isEnabled)return!1;var t=this.diagram;return!(t.isReadOnly||t.isModelReadOnly||!t.allowLink||!t.model.Ut()||!t.lastInput.left||t.currentTool!==this&&!this.isBeyondDragSize())&&null!==this.findLinkablePort()},gn.prototype.findLinkablePort=function(){var t=this.diagram,e=this.startObject;if(null===e&&(e=t.Vb(t.firstInput.documentPoint,null,null)),null===e)return null;if(t=e.part,!(t instanceof ec))return null;var i=this.direction;if(i===yn||i===mn){var n=this.findValidLinkablePort(e,!1);if(null!==n||this.startObject===t&&(n=t.port,this.findValidLinkablePort(n,!1)))return this.isForwards=!0,n}return(i===yn||i===vn)&&(e=this.findValidLinkablePort(e,!0),null!==e||this.startObject===t&&(e=t.port,this.findValidLinkablePort(e,!0)))?(this.isForwards=!1,e):null},gn.prototype.doActivate=function(){var t=this.diagram,e=this.findLinkablePort();null===e?this.stopTool():(this.va(this.name),t.isMouseCaptured=!0,t.currentCursor=this.linkingCursor,this.isForwards?(null===this.temporaryToNode||this.temporaryToNode.location.s()||(this.temporaryToNode.location=t.lastInput.documentPoint),this.originalFromPort=e,e=this.originalFromPort.part,e instanceof ec&&(this.originalFromNode=e),this.copyPortProperties(this.originalFromNode,this.originalFromPort,this.temporaryFromNode,this.temporaryFromPort,!1)):(null===this.temporaryFromNode||this.temporaryFromNode.location.s()||(this.temporaryFromNode.location=t.lastInput.documentPoint),this.originalToPort=e,e=this.originalToPort.part,e instanceof ec&&(this.originalToNode=e),this.copyPortProperties(this.originalToNode,this.originalToPort,this.temporaryToNode,this.temporaryToPort,!0)),t.add(this.temporaryFromNode),t.add(this.temporaryToNode),null!==this.temporaryLink&&(null!==this.temporaryFromNode&&(this.temporaryLink.fromNode=this.temporaryFromNode),null!==this.temporaryToNode&&(this.temporaryLink.toNode=this.temporaryToNode),this.temporaryLink.isTreeLink=this.isNewTreeLink(),this.temporaryLink.Ua(),t.add(this.temporaryLink)),this.isActive=!0)},gn.prototype.doDeactivate=function(){this.isActive=!1;var t=this.diagram;t.remove(this.temporaryLink),t.remove(this.temporaryFromNode),t.remove(this.temporaryToNode),t.isMouseCaptured=!1,t.currentCursor="",this.Jg()},gn.prototype.doStop=function(){un.prototype.doStop.call(this),this.startObject=null},gn.prototype.doMouseUp=function(){var t=this.diagram;if(this.isActive){var e=this.transactionResult=null,i=null,n=null,o=null,r=null;try{var s=this.targetPort=this.findTargetPort(this.isForwards);if(null!==s){var a=s.part;a instanceof ec&&(this.isForwards?(null!==this.originalFromNode&&(e=this.originalFromNode,i=this.originalFromPort),n=a,o=s):(e=a,i=s,null!==this.originalToNode&&(n=this.originalToNode,o=this.originalToPort)))}else this.isForwards?null!==this.originalFromNode&&this.isUnconnectedLinkValid&&(e=this.originalFromNode,i=this.originalFromPort):null!==this.originalToNode&&this.isUnconnectedLinkValid&&(n=this.originalToNode,o=this.originalToPort);null!==e||null!==n?(r=this.insertLink(e,i,n,o),null!==r?(null===s&&(this.isForwards?r.defaultToPoint=t.lastInput.documentPoint.copy():r.defaultFromPoint=t.lastInput.documentPoint.copy()),t.allowSelect&&(t.R("ChangingSelection",t.selection),t.clearSelection(!0),r.isSelected=!0),this.transactionResult=this.name,t.R("LinkDrawn",r)):this.doNoLink(e,i,n,o)):this.isForwards?this.doNoLink(this.originalFromNode,this.originalFromPort,null,null):this.doNoLink(null,null,this.originalToNode,this.originalToPort)}finally{this.stopTool(),r&&t.allowSelect&&t.R("ChangedSelection",t.selection)}}},gn.prototype.isNewTreeLink=function(){var t=this.archetypeLinkData;if(null===t)return!0;if(t instanceof Nc)return t.isTreeLink;var e=this.diagram;return null===e||(t=e.partManager.getLinkCategoryForData(t),e=e.partManager.findLinkTemplateForCategory(t),null===e||e.isTreeLink)},gn.prototype.insertLink=function(t,e,i,n){return this.diagram.partManager.insertLink(t,e,i,n)},gn.prototype.doNoLink=function(){},d.Object.defineProperties(gn.prototype,{archetypeLinkData:{get:function(){return this.T},set:function(t){this.T=t}},archetypeLabelNodeData:{get:function(){return this.I},set:function(t){this.I=t}},direction:{get:function(){return this.K},set:function(t){this.K=t}},startObject:{get:function(){return this.en},set:function(t){this.en=t}}});var yn=new U(gn,"Either",0),mn=new U(gn,"ForwardsOnly",0),vn=new U(gn,"BackwardsOnly",0);function xn(){un.call(this),this.name="Relinking";var t=new Nl;t.figure="Diamond",t.desiredSize=Pt,t.fill="lightblue",t.stroke="dodgerblue",t.cursor=this.linkingCursor,t.segmentIndex=0,this.T=t,t=new Nl,t.figure="Diamond",t.desiredSize=Pt,t.fill="lightblue",t.stroke="dodgerblue",t.cursor=this.linkingCursor,t.segmentIndex=-1,this.en=t,this.I=null,this.Hx=new zt}function bn(t,e,i,n,o){null!==e?(t.copyPortProperties(e,i,t.temporaryFromNode,t.temporaryFromPort,!1),t.diagram.add(t.temporaryFromNode)):t.diagram.remove(t.temporaryFromNode),null!==n?(t.copyPortProperties(n,o,t.temporaryToNode,t.temporaryToPort,!0),t.diagram.add(t.temporaryToNode)):t.diagram.remove(t.temporaryToNode)}function wn(){ji.call(this),this.name="LinkReshaping";var t=new Nl;t.figure="Rectangle",t.desiredSize=St,t.fill="lightblue",t.stroke="dodgerblue",this.u=t,t=new Nl,t.figure="Diamond",t.desiredSize=Pt,t.fill="lightblue",t.stroke="dodgerblue",t.cursor="move",this.I=t,this.T=3,this.wu=this.l=null,this.Ix=new pt,this.Is=new et}function kn(t,e,i,n,o,r){return r?Math.abs(e.y-i.y)<t.resegmentingDistance&&Math.abs(i.y-n.y)<t.resegmentingDistance&&Math.abs(n.y-o.y)<t.resegmentingDistance:Math.abs(e.x-i.x)<t.resegmentingDistance&&Math.abs(i.x-n.x)<t.resegmentingDistance&&Math.abs(n.x-o.x)<t.resegmentingDistance}gn.className="LinkingTool",gn.Either=yn,gn.ForwardsOnly=mn,gn.BackwardsOnly=vn,f(xn,un),xn.prototype.updateAdornments=function(t){if(null!==t&&t instanceof Nc){var e="RelinkFrom",i=null;if(t.isSelected&&!this.diagram.isReadOnly){var n=t.selectionObject;null!==n&&t.canRelinkFrom()&&t.actualBounds.s()&&t.isVisible()&&n.actualBounds.s()&&n.Gf()&&(i=t.wk(e),null===i&&(i=this.makeAdornment(n,!1),t.Gh(e,i)))}null===i&&t.Hf(e),e="RelinkTo",i=null,t.isSelected&&!this.diagram.isReadOnly&&(n=t.selectionObject,null!==n&&t.canRelinkTo()&&t.actualBounds.s()&&t.isVisible()&&n.actualBounds.s()&&n.Gf()&&(i=t.wk(e),null===i?(i=this.makeAdornment(n,!0),t.Gh(e,i)):i.o())),null===i&&t.Hf(e)}},xn.prototype.makeAdornment=function(t,e){var i=new Qu;return i.type=Uh.Link,e=e?this.toHandleArchetype:this.fromHandleArchetype,null!==e&&i.add(e.copy()),i.adornedObject=t,i},xn.prototype.canStart=function(){if(!this.isEnabled)return!1;var t=this.diagram;if(t.isReadOnly||t.isModelReadOnly||!t.allowRelink||!t.model.Ut()||!t.lastInput.left)return!1;var e=this.findToolHandleAt(t.firstInput.documentPoint,"RelinkFrom");return null===e&&(e=this.findToolHandleAt(t.firstInput.documentPoint,"RelinkTo")),null!==e},xn.prototype.doActivate=function(){var t=this.diagram;if(null===this.originalLink){var e=this.handle;if(null===e&&(e=this.findToolHandleAt(t.firstInput.documentPoint,"RelinkFrom"),null===e&&(e=this.findToolHandleAt(t.firstInput.documentPoint,"RelinkTo"))),null===e)return;var i=e.part;if(!(i instanceof Qu&&i.adornedPart instanceof Nc))return;this.handle=e,this.isForwards=null===i||"RelinkTo"===i.category,this.originalLink=i.adornedPart}this.va(this.name),t.isMouseCaptured=!0,t.currentCursor=this.linkingCursor,this.originalFromPort=this.originalLink.fromPort,this.originalFromNode=this.originalLink.fromNode,this.originalToPort=this.originalLink.toPort,this.originalToNode=this.originalLink.toNode,this.Hx.set(this.originalLink.actualBounds),null!==this.originalLink&&0<this.originalLink.pointsCount&&(null===this.originalLink.fromNode&&(null!==this.temporaryFromPort&&(this.temporaryFromPort.desiredSize=kt),null!==this.temporaryFromNode&&(this.temporaryFromNode.location=this.originalLink.i(0))),null===this.originalLink.toNode&&(null!==this.temporaryToPort&&(this.temporaryToPort.desiredSize=kt),null!==this.temporaryToNode&&(this.temporaryToNode.location=this.originalLink.i(this.originalLink.pointsCount-1)))),this.copyPortProperties(this.originalFromNode,this.originalFromPort,this.temporaryFromNode,this.temporaryFromPort,!1),this.copyPortProperties(this.originalToNode,this.originalToPort,this.temporaryToNode,this.temporaryToPort,!0),t.add(this.temporaryFromNode),t.add(this.temporaryToNode),null!==this.temporaryLink&&(null!==this.temporaryFromNode&&(this.temporaryLink.fromNode=this.temporaryFromNode),null!==this.temporaryToNode&&(this.temporaryLink.toNode=this.temporaryToNode),this.copyLinkProperties(this.originalLink,this.temporaryLink),this.temporaryLink.Ua(),t.add(this.temporaryLink)),this.isActive=!0},xn.prototype.copyLinkProperties=function(t,e){if(null!==t&&null!==e){e.adjusting=t.adjusting,e.corner=t.corner;var i=t.curve;i!==of&&i!==nf||(i=tf),e.curve=i,e.curviness=t.curviness,e.isTreeLink=t.isTreeLink,e.points=t.points,e.routing=t.routing,e.smoothness=t.smoothness,e.fromSpot=t.fromSpot,e.fromEndSegmentLength=t.fromEndSegmentLength,e.fromShortLength=t.fromShortLength,e.toSpot=t.toSpot,e.toEndSegmentLength=t.toEndSegmentLength,e.toShortLength=t.toShortLength}},xn.prototype.doDeactivate=function(){this.isActive=!1;var t=this.diagram;t.remove(this.temporaryLink),t.remove(this.temporaryFromNode),t.remove(this.temporaryToNode),t.isMouseCaptured=!1,t.currentCursor="",this.Jg()},xn.prototype.doStop=function(){un.prototype.doStop.call(this),this.handle=null},xn.prototype.doMouseUp=function(){if(this.isActive){var t=this.diagram;this.transactionResult=null;var e=this.originalFromNode,i=this.originalFromPort,n=this.originalToNode,o=this.originalToPort,r=this.originalLink;if(this.targetPort=this.findTargetPort(this.isForwards),null!==this.targetPort){var s=this.targetPort.part;s instanceof ec&&(this.isForwards?(n=s,o=this.targetPort):(e=s,i=this.targetPort))}else this.isUnconnectedLinkValid?this.isForwards?o=n=null:i=e=null:r=null;null!==r?(this.reconnectLink(r,this.isForwards?n:e,this.isForwards?o:i,this.isForwards),null===this.targetPort&&(this.isForwards?r.defaultToPoint=t.lastInput.documentPoint.copy():r.defaultFromPoint=t.lastInput.documentPoint.copy(),r.Ua()),t.allowSelect&&(r.isSelected=!0),this.transactionResult=this.name,t.R("LinkRelinked",r,this.isForwards?this.originalToPort:this.originalFromPort)):this.doNoRelink(this.originalLink,this.isForwards),this.originalLink.Oq(this.Hx)}this.stopTool()},xn.prototype.reconnectLink=function(t,e,i,n){return i=null!==i&&null!==i.portId?i.portId:"",n?(t.toNode=e,t.toPortId=i):(t.fromNode=e,t.fromPortId=i),!0},xn.prototype.doNoRelink=function(){},d.Object.defineProperties(xn.prototype,{fromHandleArchetype:{get:function(){return this.T},set:function(t){this.T=t}},toHandleArchetype:{get:function(){return this.en},set:function(t){this.en=t}},handle:{get:function(){return this.I},set:function(t){if(null!==t&&!(t.part instanceof Qu))throw Error("new handle is not in an Adornment: "+t);this.I=t}}}),xn.className="RelinkingTool",I("linkingTool",(function(){return this.findTool("Linking")}),(function(t){this.Ya("Linking",t,this.mouseMoveTools)})),I("relinkingTool",(function(){return this.findTool("Relinking")}),(function(t){this.Ya("Relinking",t,this.mouseDownTools)})),f(wn,ji),wn.prototype.Zv=function(t){return t&&t.Os&&0!==t.Os.value?t.Os:Mn},wn.prototype.Xm=function(t,e){t.Os=e},wn.prototype.updateAdornments=function(t){if(null!==t&&t instanceof Nc){var e=null;if(t.isSelected&&!this.diagram.isReadOnly){var i=t.path;null!==i&&t.canReshape()&&t.actualBounds.s()&&t.isVisible()&&i.actualBounds.s()&&i.Gf()&&(e=t.wk(this.name),null===e||e.Ex!==t.pointsCount||e.Sx!==t.resegmentable)&&(e=this.makeAdornment(i),null!==e&&(e.Ex=t.pointsCount,e.Sx=t.resegmentable,t.Gh(this.name,e)))}null===e&&t.Hf(this.name)}},wn.prototype.makeAdornment=function(t){var e=t.part,i=e.pointsCount,n=e.isOrthogonal,o=null;if(null!==e.points&&1<i){o=new Qu,o.type=Uh.Link,i=e.firstPickIndex;var r=e.lastPickIndex,s=n?1:0;if(e.resegmentable&&e.computeCurve()!==ef)for(var a=i+s;a<r-s;a++){var h=this.makeResegmentHandle(t,a);null!==h&&(h.segmentIndex=a,h.segmentFraction=.5,h.fromMaxLinks=999,o.add(h))}for(s=i+1;s<r;s++)if(a=this.makeHandle(t,s),null!==a){if(a.segmentIndex=s,s!==i)if(s===i+1&&n){h=e.i(i);var l=e.i(i+1);_e.A(h.x,l.x)&&_e.A(h.y,l.y)&&(l=e.i(i-1)),_e.A(h.x,l.x)?(this.Xm(a,Pn),a.cursor="n-resize"):_e.A(h.y,l.y)&&(this.Xm(a,Sn),a.cursor="w-resize")}else s===r-1&&n?(h=e.i(r-1),l=e.i(r),_e.A(h.x,l.x)&&_e.A(h.y,l.y)&&(h=e.i(r+1)),_e.A(h.x,l.x)?(this.Xm(a,Pn),a.cursor="n-resize"):_e.A(h.y,l.y)&&(this.Xm(a,Sn),a.cursor="w-resize")):s!==r&&(this.Xm(a,Nn),a.cursor="move");o.add(a)}o.adornedObject=t}return o},wn.prototype.makeHandle=function(){var t=this.handleArchetype;return null===t?null:t.copy()},wn.prototype.makeResegmentHandle=function(){var t=this.midHandleArchetype;return null===t?null:t.copy()},wn.prototype.canStart=function(){if(!this.isEnabled)return!1;var t=this.diagram;return!(t.isReadOnly||!t.allowReshape||!t.lastInput.left)&&null!==this.findToolHandleAt(t.firstInput.documentPoint,this.name)},wn.prototype.doActivate=function(){var t=this.diagram;if(null===this.handle&&(this.handle=this.findToolHandleAt(t.firstInput.documentPoint,this.name)),null!==this.handle){var e=this.handle.part.adornedPart;if(e instanceof Nc){if(this.wu=e,t.isMouseCaptured=!0,this.va(this.name),e.resegmentable&&999===this.handle.fromMaxLinks){var i=e.points.copy(),n=this.getResegmentingPoint();if(i.wb(this.handle.segmentIndex+1,n),e.isOrthogonal&&i.wb(this.handle.segmentIndex+1,n),e.points=i,e.Lb(),e.updateAdornments(),this.handle=this.findToolHandleAt(t.firstInput.documentPoint,this.name),null===this.handle)return void this.doDeactivate()}this.Ix=e.i(this.handle.segmentIndex),this.Is=e.points.copy(),this.isActive=!0}}},wn.prototype.doDeactivate=function(){this.Jg(),this.wu=this.handle=null,this.isActive=this.diagram.isMouseCaptured=!1},wn.prototype.doCancel=function(){var t=this.adornedLink;null!==t&&(t.points=this.Is),this.stopTool()},wn.prototype.getResegmentingPoint=function(){return this.handle.da(ae)},wn.prototype.doMouseMove=function(){var t=this.diagram;this.isActive&&(t=this.computeReshape(t.lastInput.documentPoint),this.reshape(t))},wn.prototype.doMouseUp=function(){var t=this.diagram;if(this.isActive){var e=this.computeReshape(t.lastInput.documentPoint);if(this.reshape(e),e=this.adornedLink,null!==e&&e.resegmentable){var i=this.handle.segmentIndex,n=e.i(i-1),o=e.i(i),r=e.i(i+1);if(e.isOrthogonal){if(i>e.firstPickIndex+1&&i<e.lastPickIndex-1){var s=e.i(i-2);if(Math.abs(n.x-o.x)<this.resegmentingDistance&&Math.abs(n.y-o.y)<this.resegmentingDistance&&(kn(this,s,n,o,r,!0)||kn(this,s,n,o,r,!1))){var a=e.points.copy();kn(this,s,n,o,r,!0)?(a.Pc(i-2,new pt(s.x,(r.y+s.y)/2)),a.Pc(i+1,new pt(r.x,(r.y+s.y)/2))):(a.Pc(i-2,new pt((r.x+s.x)/2,s.y)),a.Pc(i+1,new pt((r.x+s.x)/2,r.y))),a.cb(i),a.cb(i-1),e.points=a,e.Lb()}else s=e.i(i+2),Math.abs(o.x-r.x)<this.resegmentingDistance&&Math.abs(o.y-r.y)<this.resegmentingDistance&&(kn(this,n,o,r,s,!0)||kn(this,n,o,r,s,!1))&&(a=e.points.copy(),kn(this,n,o,r,s,!0)?(a.Pc(i-1,new pt(n.x,(n.y+s.y)/2)),a.Pc(i+2,new pt(s.x,(n.y+s.y)/2))):(a.Pc(i-1,new pt((n.x+s.x)/2,n.y)),a.Pc(i+2,new pt((n.x+s.x)/2,s.y))),a.cb(i+1),a.cb(i),e.points=a,e.Lb())}}else s=pt.alloc(),_e.Qh(n.x,n.y,r.x,r.y,o.x,o.y,s)&&s.Ie(o)<this.resegmentingDistance*this.resegmentingDistance&&(n=e.points.copy(),n.cb(i),e.points=n,e.Lb()),pt.free(s)}t.Na(),this.transactionResult=this.name,t.R("LinkReshaped",this.adornedLink,this.Is)}this.stopTool()},wn.prototype.reshape=function(t){var e=this.adornedLink;e.Th();var i=this.handle.segmentIndex,n=this.Zv(this.handle);if(e.isOrthogonal)if(i===e.firstPickIndex+1)i=e.firstPickIndex+1,n===Pn?(e.L(i,e.i(i-1).x,t.y),e.L(i+1,e.i(i+2).x,t.y)):n===Sn&&(e.L(i,t.x,e.i(i-1).y),e.L(i+1,t.x,e.i(i+2).y));else if(i===e.lastPickIndex-1)i=e.lastPickIndex-1,n===Pn?(e.L(i-1,e.i(i-2).x,t.y),e.L(i,e.i(i+1).x,t.y)):n===Sn&&(e.L(i-1,t.x,e.i(i-2).y),e.L(i,t.x,e.i(i+1).y));else{n=i;var o=e.i(n),r=e.i(n-1),s=e.i(n+1);_e.A(r.x,o.x)&&_e.A(o.y,s.y)?(_e.A(r.x,e.i(n-2).x)&&!_e.A(r.y,e.i(n-2).y)?(e.m(n,t.x,r.y),i++,n++):e.L(n-1,t.x,r.y),_e.A(s.y,e.i(n+2).y)&&!_e.A(s.x,e.i(n+2).x)?e.m(n+1,s.x,t.y):e.L(n+1,s.x,t.y)):_e.A(r.y,o.y)&&_e.A(o.x,s.x)?(_e.A(r.y,e.i(n-2).y)&&!_e.A(r.x,e.i(n-2).x)?(e.m(n,r.x,t.y),i++,n++):e.L(n-1,r.x,t.y),_e.A(s.x,e.i(n+2).x)&&!_e.A(s.y,e.i(n+2).y)?e.m(n+1,t.x,s.y):e.L(n+1,t.x,s.y)):_e.A(r.x,o.x)&&_e.A(o.x,s.x)?(_e.A(r.x,e.i(n-2).x)&&!_e.A(r.y,e.i(n-2).y)?(e.m(n,t.x,r.y),i++,n++):e.L(n-1,t.x,r.y),_e.A(s.x,e.i(n+2).x)&&!_e.A(s.y,e.i(n+2).y)?e.m(n+1,t.x,s.y):e.L(n+1,t.x,s.y)):_e.A(r.y,o.y)&&_e.A(o.y,s.y)&&(_e.A(r.y,e.i(n-2).y)&&!_e.A(r.x,e.i(n-2).x)?(e.m(n,r.x,t.y),i++,n++):e.L(n-1,r.x,t.y),_e.A(s.y,e.i(n+2).y)&&!_e.A(s.x,e.i(n+2).x)?e.m(n+1,s.x,t.y):e.L(n+1,s.x,t.y)),e.L(i,t.x,t.y)}else e.L(i,t.x,t.y),n=e.fromNode,o=e.fromPort,null!==n&&(r=n.findVisibleNode(),null!==r&&r!==n&&(n=r,o=n.port)),1===i&&e.computeSpot(!0,o).nc()&&(r=o.da(ae,pt.alloc()),n=e.getLinkPointFromPoint(n,o,r,t,!0,pt.alloc()),e.L(0,n.x,n.y),pt.free(r),pt.free(n)),n=e.toNode,o=e.toPort,null!==n&&(r=n.findVisibleNode(),null!==r&&r!==n&&(n=r,o=n.port)),i===e.pointsCount-2&&e.computeSpot(!1,o).nc()&&(i=o.da(ae,pt.alloc()),t=e.getLinkPointFromPoint(n,o,i,t,!1,pt.alloc()),e.L(e.pointsCount-1,t.x,t.y),pt.free(i),pt.free(t));e.xf()},wn.prototype.computeReshape=function(t){var e=this.adornedLink,i=this.handle.segmentIndex;switch(this.Zv(this.handle)){case Nn:return t;case Pn:return new pt(e.i(i).x,t.y);case Sn:return new pt(t.x,e.i(i).y);default:case Mn:return e.i(i)}},d.Object.defineProperties(wn.prototype,{handleArchetype:{get:function(){return this.u},set:function(t){this.u=t}},midHandleArchetype:{get:function(){return this.I},set:function(t){this.I=t}},handle:{get:function(){return this.l},set:function(t){if(null!==t&&!(t.part instanceof Qu))throw Error("new handle is not in an Adornment: "+t);this.l=t}},adornedLink:{get:function(){return this.wu}},resegmentingDistance:{get:function(){return this.T},set:function(t){this.T=t}},originalPoint:{get:function(){return this.Ix}},originalPoints:{get:function(){return this.Is}}}),wn.prototype.setReshapingBehavior=wn.prototype.Xm,wn.prototype.getReshapingBehavior=wn.prototype.Zv;var Mn=new U(wn,"None",0),Sn=new U(wn,"Horizontal",1),Pn=new U(wn,"Vertical",2),Nn=new U(wn,"All",3);function Cn(){ji.call(this),this.name="Resizing",this.fg=new Bt(1,1).freeze(),this.eg=new Bt(9999,9999).freeze(),this.Qg=new Bt(NaN,NaN).freeze(),this.I=!1,this.T=!0,this.ie=null;var t=new Nl;t.alignmentFocus=ae,t.figure="Rectangle",t.desiredSize=St,t.fill="lightblue",t.stroke="dodgerblue",t.strokeWidth=1,t.cursor="pointer",this.u=t,this.l=null,this.Hs=new pt,this.Gx=new Bt,this.qp=new pt,this.Nu=new Bt(0,0),this.Mu=new Bt(1/0,1/0),this.Lu=new Bt(1,1)}function Tn(){ji.call(this),this.name="Rotating",this.La=45,this.Ka=2,this.qp=new pt,this.ie=null;var t=new Nl;t.figure="Ellipse",t.desiredSize=Pt,t.fill="lightblue",t.stroke="dodgerblue",t.strokeWidth=1,t.cursor="pointer",this.u=t,this.l=null,this.Fx=0,this.Ps=new pt(NaN,NaN),this.I=0,this.T=50}function An(){ji.call(this),this.name="ClickSelecting"}function Ln(){ji.call(this),this.name="Action",this.Xk=null}function jn(){ji.call(this),this.name="ClickCreating",this.Aj=null,this.u=!0,this.l=!1,this.xx=new pt(0,0)}function On(){ji.call(this),this.name="DragSelecting",this.pl=175,this.u=!1;var t=new Lu;t.layerName="Tool",t.selectable=!1;var e=new Nl;e.name="SHAPE",e.figure="Rectangle",e.fill=null,e.stroke="magenta",t.add(e),this.l=t}function Dn(){ji.call(this),this.name="Panning",this.kv=new pt,this.kz=new pt,this.Pg=!1;var t=this;this.Lx=function(){var e=t.diagram;null!==e&&e.removeEventListener(y.document,"scroll",t.Lx,!1),t.stopTool()}}function Fn(){this.T=this.I=this.l=this.u=null}function Bn(t,e,i){this.text=t,this.by=e,this.visible=i}function In(){ji.call(this),this.name="ContextMenu",this.u=this.Cu=this.l=null,this.Cx=new pt,this.Du=null,this.Yu=!1;var t=this;this.wv=function(){t.stopTool()}}function En(t){var e=new Fn;e.show=function(t,e,i){i.showDefaultContextMenu()},e.hide=function(t,e){e.hideDefaultContextMenu()},Yn=e,t.wv=function(){t.stopTool()},e=b("div");var i=b("div");e.style.cssText="top: 0px;z-index:10002;position: fixed;display: none;text-align: center;left: 25%;width: 50%;background-color: #F5F5F5;padding: 16px;border: 16px solid #444;border-radius: 10px;margin-top: 10px",i.style.cssText="z-index:10001;position: fixed;display: none;top: 0;left: 0;width: 100%;height: 100%;background-color: black;opacity: 0.8;";var n=b("style");y.document.getElementsByTagName("head")[0].appendChild(n),n.sheet.insertRule(".goCXul { list-style: none; }",0),n.sheet.insertRule(".goCXli {font:700 1.5em Helvetica, Arial, sans-serif;position: relative;min-width: 60px; }",0),n.sheet.insertRule(".goCXa {color: #444;display: inline-block;padding: 4px;text-decoration: none;margin: 2px;border: 1px solid gray;border-radius: 10px; }",0),n=t.diagram,null!==n&&(n.addEventListener(e,"contextmenu",Rn,!1),n.addEventListener(e,"selectstart",Rn,!1),n.addEventListener(i,"contextmenu",Rn,!1)),e.className="goCXforeground",i.className="goCXbackground",y.document.body&&(y.document.body.appendChild(e),y.document.body.appendChild(i)),Un=e,qn=i,Xn=!0}function Rn(t){return t.preventDefault(),!1}function zn(t){var e=t.diagram;if(t.isActive){var i=t.currentContextMenu;if(null!==i){if(!(i instanceof Fn)){var n=e.Vb(e.lastInput.documentPoint,null,null);null!==n&&n.Gg(i)&&t.standardMouseClick(null,null)}t.stopTool(),t.canStart()&&(e.currentTool=t,t.doMouseUp())}}else t.canStart()&&(Vn(t,!0),t.isActive||t.stopTool())}function Vn(t,e,i){if(void 0===i&&(i=null),!t.Yu&&(t.Yu=!0,e&&t.standardMouseSelect(),e=t.standardMouseClick(),t.Yu=!1,!e)){if(t.isActive=!0,e=Yn,null===i&&(i=t.findObjectWithContextMenu()),null!==i){var n=i.contextMenu;null!==n?(t.currentObject=i instanceof ca?i:null,t.showContextMenu(n,t.currentObject)):null!==e&&t.showContextMenu(e,t.currentObject)}else null!==e&&t.showContextMenu(e,null);t.currentContextMenu instanceof Qu&&!t.currentContextMenu.visible&&t.stopTool()}}function Gn(t){var e=new et;return e.add(new Bn("Copy",(function(t){t.commandHandler.copySelection()}),(function(t){return t.commandHandler.canCopySelection()}))),e.add(new Bn("Cut",(function(t){t.commandHandler.cutSelection()}),(function(t){return t.commandHandler.canCutSelection()}))),e.add(new Bn("Delete",(function(t){t.commandHandler.deleteSelection()}),(function(t){return t.commandHandler.canDeleteSelection()}))),e.add(new Bn("Paste",(function(e){e.commandHandler.pasteSelection(t.mouseDownPoint)}),(function(e){return e.commandHandler.canPasteSelection(t.mouseDownPoint)}))),e.add(new Bn("Select All",(function(t){t.commandHandler.selectAll()}),(function(t){return t.commandHandler.canSelectAll()}))),e.add(new Bn("Undo",(function(t){t.commandHandler.undo()}),(function(t){return t.commandHandler.canUndo()}))),e.add(new Bn("Redo",(function(t){t.commandHandler.redo()}),(function(t){return t.commandHandler.canRedo()}))),e.add(new Bn("Scroll To Part",(function(t){t.commandHandler.scrollToPart()}),(function(t){return t.commandHandler.canScrollToPart()}))),e.add(new Bn("Zoom To Fit",(function(t){t.commandHandler.zoomToFit()}),(function(t){return t.commandHandler.canZoomToFit()}))),e.add(new Bn("Reset Zoom",(function(t){t.commandHandler.resetZoom()}),(function(t){return t.commandHandler.canResetZoom()}))),e.add(new Bn("Group Selection",(function(t){t.commandHandler.groupSelection()}),(function(t){return t.commandHandler.canGroupSelection()}))),e.add(new Bn("Ungroup Selection",(function(t){t.commandHandler.ungroupSelection()}),(function(t){return t.commandHandler.canUngroupSelection()}))),e.add(new Bn("Edit Text",(function(t){t.commandHandler.editTextBlock()}),(function(t){return t.commandHandler.canEditTextBlock()}))),e}wn.className="LinkReshapingTool",wn.None=Mn,wn.Horizontal=Sn,wn.Vertical=Pn,wn.All=Nn,I("linkReshapingTool",(function(){return this.findTool("LinkReshaping")}),(function(t){this.Ya("LinkReshaping",t,this.mouseDownTools)})),f(Cn,ji),Cn.prototype.updateAdornments=function(t){if(!(null===t||t instanceof Nc)){if(t.isSelected&&!this.diagram.isReadOnly){var e=t.resizeObject,i=t.wk(this.name);if(null!==e&&t.canResize()&&t.actualBounds.s()&&t.isVisible()&&e.actualBounds.s()&&e.Gf()&&(null!==i&&i.adornedObject===e||(i=this.makeAdornment(e)),null!==i))return e=e.lj(),Uu(t)&&this.updateResizeHandles(i,e),void t.Gh(this.name,i)}t.Hf(this.name)}},Cn.prototype.makeAdornment=function(t){var e=t.part.resizeAdornmentTemplate;if(null===e){e=new Qu,e.type=Uh.Spot,e.locationSpot=ae;var i=new Pc;i.isPanelMain=!0,e.add(i),e.add(this.makeHandle(t,ne)),e.add(this.makeHandle(t,re)),e.add(this.makeHandle(t,ce)),e.add(this.makeHandle(t,le)),e.add(this.makeHandle(t,Oe)),e.add(this.makeHandle(t,Fe)),e.add(this.makeHandle(t,Be)),e.add(this.makeHandle(t,De))}else if(ul(e),e=e.copy(),null===e)return null;return e.adornedObject=t,e},Cn.prototype.makeHandle=function(t,e){return t=this.handleArchetype,null===t?null:(t=t.copy(),t.alignment=e,t)},Cn.prototype.updateResizeHandles=function(t,e){if(null!==t)if(!t.alignment.Mb()&&("pointer"===t.cursor||0<t.cursor.indexOf("resize")))t:{var i=t.alignment;if(i.nc()&&(i=ae),0>=i.x)e=0>=i.y?e+225:1<=i.y?e+135:e+180;else if(1<=i.x)0>=i.y?e+=315:1<=i.y&&(e+=45);else if(0>=i.y)e+=270;else{if(!(1<=i.y))break t;e+=90}0>e?e+=360:360<=e&&(e-=360),t.cursor=22.5>e?"e-resize":67.5>e?"se-resize":112.5>e?"s-resize":157.5>e?"sw-resize":202.5>e?"w-resize":247.5>e?"nw-resize":292.5>e?"n-resize":337.5>e?"ne-resize":"e-resize"}else if(t instanceof Uh)for(t=t.elements;t.next();)this.updateResizeHandles(t.value,e)},Cn.prototype.canStart=function(){if(!this.isEnabled)return!1;var t=this.diagram;return!(t.isReadOnly||!t.allowResize||!t.lastInput.left)&&null!==this.findToolHandleAt(t.firstInput.documentPoint,this.name)},Cn.prototype.doActivate=function(){var t=this.diagram;null===this.handle&&(this.handle=this.findToolHandleAt(t.firstInput.documentPoint,this.name)),null!==this.handle&&(this.adornedObject=this.handle.part.adornedObject,null!==this.adornedObject&&(t.isMouseCaptured=!0,t.animationManager.Bc(),this.va(this.name),this.Hs.set(this.adornedObject.da(this.handle.alignment.mw())),this.qp.set(this.adornedObject.part.location),this.Gx.set(this.adornedObject.desiredSize),this.Lu=this.computeCellSize(),this.Nu=this.computeMinSize(),this.Mu=this.computeMaxSize(),this.isActive=!0))},Cn.prototype.doDeactivate=function(){var t=this.diagram;this.Jg(),this.ie=this.handle=null,this.isActive=t.isMouseCaptured=!1},Cn.prototype.doCancel=function(){null!==this.adornedObject&&(this.adornedObject.desiredSize=this.originalDesiredSize,this.adornedObject.part.location=this.originalLocation),this.stopTool()},Cn.prototype.doMouseMove=function(){var t=this.diagram;if(this.isActive){var e=this.Nu,i=this.Mu,n=this.Lu,o=this.adornedObject.Mt(t.lastInput.documentPoint,pt.alloc()),r=this.computeReshape();e=this.computeResize(o,this.handle.alignment,e,i,n,r),this.resize(e),t.hd(),pt.free(o)}},Cn.prototype.doMouseUp=function(){var t=this.diagram;if(this.isActive){var e=this.Nu,i=this.Mu,n=this.Lu,o=this.adornedObject.Mt(t.lastInput.documentPoint,pt.alloc()),r=this.computeReshape();e=this.computeResize(o,this.handle.alignment,e,i,n,r),this.resize(e),pt.free(o),t.Na(),this.transactionResult=this.name,t.R("PartResized",this.adornedObject,this.originalDesiredSize)}this.stopTool()},Cn.prototype.resize=function(t){var e=this.diagram,i=this.adornedObject;if(null!==i){if(i.desiredSize=t.size,t=i.part,t.Ta(),i=i.da(this.handle.alignment.mw()),t instanceof bc){var n=new et;if(n.add(t),!this.dragsMembers&&null===t.placeholder){var o=new ea;o.dragsMembers=!1}e.moveParts(n,this.oppositePoint.copy().ge(i),!0,o)}else t.location=t.location.copy().ge(i).add(this.oppositePoint);e.hd()}},Cn.prototype.computeResize=function(t,e,i,n,o,r){e.nc()&&(e=ae);var s=this.adornedObject.naturalBounds,a=s.x,h=s.y,l=s.x+s.width,u=s.y+s.height,c=1;if(!r){c=s.width;var f=s.height;0>=c&&(c=1),0>=f&&(f=1),c=f/c}return f=pt.alloc(),_e.Gq(t.x,t.y,a,h,o.width,o.height,f),t=s.copy(),0>=e.x?0>=e.y?(t.x=Math.max(f.x,l-n.width),t.x=Math.min(t.x,l-i.width),t.width=Math.max(l-t.x,i.width),t.y=Math.max(f.y,u-n.height),t.y=Math.min(t.y,u-i.height),t.height=Math.max(u-t.y,i.height),r||(1<=t.height/t.width?(t.height=Math.max(Math.min(c*t.width,n.height),i.height),t.width=t.height/c):(t.width=Math.max(Math.min(t.height/c,n.width),i.width),t.height=c*t.width),t.x=l-t.width,t.y=u-t.height)):1<=e.y?(t.x=Math.max(f.x,l-n.width),t.x=Math.min(t.x,l-i.width),t.width=Math.max(l-t.x,i.width),t.height=Math.max(Math.min(f.y-h,n.height),i.height),r||(1<=t.height/t.width?(t.height=Math.max(Math.min(c*t.width,n.height),i.height),t.width=t.height/c):(t.width=Math.max(Math.min(t.height/c,n.width),i.width),t.height=c*t.width),t.x=l-t.width)):(t.x=Math.max(f.x,l-n.width),t.x=Math.min(t.x,l-i.width),t.width=l-t.x,r||(t.height=Math.max(Math.min(c*t.width,n.height),i.height),t.width=t.height/c,t.y=h+.5*(u-h-t.height))):1<=e.x?0>=e.y?(t.width=Math.max(Math.min(f.x-a,n.width),i.width),t.y=Math.max(f.y,u-n.height),t.y=Math.min(t.y,u-i.height),t.height=Math.max(u-t.y,i.height),r||(1<=t.height/t.width?(t.height=Math.max(Math.min(c*t.width,n.height),i.height),t.width=t.height/c):(t.width=Math.max(Math.min(t.height/c,n.width),i.width),t.height=c*t.width),t.y=u-t.height)):1<=e.y?(t.width=Math.max(Math.min(f.x-a,n.width),i.width),t.height=Math.max(Math.min(f.y-h,n.height),i.height),r||(1<=t.height/t.width?(t.height=Math.max(Math.min(c*t.width,n.height),i.height),t.width=t.height/c):(t.width=Math.max(Math.min(t.height/c,n.width),i.width),t.height=c*t.width))):(t.width=Math.max(Math.min(f.x-a,n.width),i.width),r||(t.height=Math.max(Math.min(c*t.width,n.height),i.height),t.width=t.height/c,t.y=h+.5*(u-h-t.height))):0>=e.y?(t.y=Math.max(f.y,u-n.height),t.y=Math.min(t.y,u-i.height),t.height=u-t.y,r||(t.width=Math.max(Math.min(t.height/c,n.width),i.width),t.height=c*t.width,t.x=a+.5*(l-a-t.width))):1<=e.y&&(t.height=Math.max(Math.min(f.y-h,n.height),i.height),r||(t.width=Math.max(Math.min(t.height/c,n.width),i.width),t.height=c*t.width,t.x=a+.5*(l-a-t.width))),pt.free(f),t},Cn.prototype.computeReshape=function(){var t=qs;return this.adornedObject instanceof Nl&&(t=Tl(this.adornedObject)),!(t===Us||this.diagram.lastInput.shift)},Cn.prototype.computeMinSize=function(){var t=this.adornedObject.minSize.copy(),e=this.minSize;return!isNaN(e.width)&&e.width>t.width&&(t.width=e.width),!isNaN(e.height)&&e.height>t.height&&(t.height=e.height),t},Cn.prototype.computeMaxSize=function(){var t=this.adornedObject.maxSize.copy(),e=this.maxSize;return!isNaN(e.width)&&e.width<t.width&&(t.width=e.width),!isNaN(e.height)&&e.height<t.height&&(t.height=e.height),t},Cn.prototype.computeCellSize=function(){var t=new Bt(NaN,NaN),e=this.adornedObject.part;return null!==e&&(e=e.resizeCellSize,!isNaN(e.width)&&0<e.width&&(t.width=e.width),!isNaN(e.height)&&0<e.height&&(t.height=e.height)),e=this.cellSize,isNaN(t.width)&&!isNaN(e.width)&&0<e.width&&(t.width=e.width),isNaN(t.height)&&!isNaN(e.height)&&0<e.height&&(t.height=e.height),e=this.diagram,(isNaN(t.width)||isNaN(t.height))&&e&&(e=e.grid,null!==e&&e.visible&&this.isGridSnapEnabled&&(e=e.gridCellSize,isNaN(t.width)&&!isNaN(e.width)&&0<e.width&&(t.width=e.width),isNaN(t.height)&&!isNaN(e.height)&&0<e.height&&(t.height=e.height))),(isNaN(t.width)||0===t.width||1/0===t.width)&&(t.width=1),(isNaN(t.height)||0===t.height||1/0===t.height)&&(t.height=1),t},d.Object.defineProperties(Cn.prototype,{handleArchetype:{get:function(){return this.u},set:function(t){this.u=t}},handle:{get:function(){return this.l},set:function(t){if(null!==t&&!(t.part instanceof Qu))throw Error("new handle is not in an Adornment: "+t);this.l=t}},adornedObject:{get:function(){return this.ie},set:function(t){if(null!==t&&t.part instanceof Qu)throw Error("new handle must not be in an Adornment: "+t);this.ie=t}},minSize:{get:function(){return this.fg},set:function(t){if(!this.fg.w(t)){var e=t.width;isNaN(e)&&(e=0),t=t.height,isNaN(t)&&(t=0),this.fg.h(e,t)}}},maxSize:{get:function(){return this.eg},set:function(t){if(!this.eg.w(t)){var e=t.width;isNaN(e)&&(e=1/0),t=t.height,isNaN(t)&&(t=1/0),this.eg.h(e,t)}}},cellSize:{get:function(){return this.Qg},set:function(t){this.Qg.w(t)||this.Qg.assign(t)}},isGridSnapEnabled:{get:function(){return this.I},set:function(t){this.I=t}},dragsMembers:{get:function(){return this.T},set:function(t){this.T=t}},oppositePoint:{get:function(){return this.Hs},set:function(t){this.Hs.w(t)||this.Hs.assign(t)}},originalDesiredSize:{get:function(){return this.Gx}},originalLocation:{get:function(){return this.qp}}}),Cn.className="ResizingTool",I("resizingTool",(function(){return this.findTool("Resizing")}),(function(t){this.Ya("Resizing",t,this.mouseDownTools)})),f(Tn,ji),Tn.prototype.updateAdornments=function(t){if(null!==t){if(t.Ph()){var e=t.rotateObject;if(e===t||e===t.path||e.isPanelMain)return}if(t.isSelected&&!this.diagram.isReadOnly&&(e=t.rotateObject,null!==e&&t.canRotate()&&t.actualBounds.s()&&t.isVisible()&&e.actualBounds.s()&&e.Gf())){var i=t.wk(this.name);if(null!==i&&i.adornedObject===e||(i=this.makeAdornment(e)),null!==i)return i.angle=e.lj(),null===i.placeholder&&(i.location=this.computeAdornmentLocation(e)),void t.Gh(this.name,i)}t.Hf(this.name)}},Tn.prototype.makeAdornment=function(t){var e=t.part.rotateAdornmentTemplate;if(null===e){e=new Qu,e.type=Uh.Position,e.locationSpot=ae;var i=this.handleArchetype;null!==i&&e.add(i.copy())}else if(ul(e),e=e.copy(),null===e)return null;return e.adornedObject=t,e},Tn.prototype.canStart=function(){if(!this.isEnabled)return!1;var t=this.diagram;return!(t.isReadOnly||!t.allowRotate||!t.lastInput.left)&&null!==this.findToolHandleAt(t.firstInput.documentPoint,this.name)},Tn.prototype.doActivate=function(){var t=this.diagram;if(null===this.adornedObject){if(null===this.handle&&(this.handle=this.findToolHandleAt(t.firstInput.documentPoint,this.name)),null===this.handle)return;this.adornedObject=this.handle.part.adornedObject}null!==this.adornedObject&&(t.isMouseCaptured=!0,t.delaysLayout=!0,this.va(this.name),this.Fx=this.adornedObject.angle,this.Ps=this.computeRotationPoint(this.adornedObject),this.qp=this.adornedObject.part.location.copy(),this.isActive=!0)},Tn.prototype.computeRotationPoint=function(t){var e=t.part,i=e.locationObject;return e.rotationSpot.kb()?t.da(e.rotationSpot):t===e||t===i?i.da(e.locationSpot):t.da(ae)},Tn.prototype.computeAdornmentLocation=function(t){var e=this.rotationPoint;e.s()||(e=this.computeRotationPoint(t)),e=t.Mt(e);var i=this.handleAngle;0>i?i+=360:360<=i&&(i-=360),i=Math.round(45*Math.round(i/45));var n=this.handleDistance;return 0===i?e.x=t.naturalBounds.width+n:45===i?(e.x=t.naturalBounds.width+n,e.y=t.naturalBounds.height+n):90===i?e.y=t.naturalBounds.height+n:135===i?(e.x=-n,e.y=t.naturalBounds.height+n):180===i?e.x=-n:225===i?(e.x=-n,e.y=-n):270===i?e.y=-n:315===i&&(e.x=t.naturalBounds.width+n,e.y=-n),t.da(e)},Tn.prototype.doDeactivate=function(){var t=this.diagram;this.Jg(),this.ie=this.handle=null,this.Ps=new pt(NaN,NaN),this.isActive=t.isMouseCaptured=!1},Tn.prototype.doCancel=function(){this.diagram.delaysLayout=!1,this.rotate(this.originalAngle),this.stopTool()},Tn.prototype.doMouseMove=function(){var t=this.diagram;this.isActive&&(t=this.computeRotate(t.lastInput.documentPoint),this.rotate(t))},Tn.prototype.doMouseUp=function(){var t=this.diagram;if(this.isActive){t.delaysLayout=!1;var e=this.computeRotate(t.lastInput.documentPoint);this.rotate(e),t.Na(),this.transactionResult=this.name,t.R("PartRotated",this.adornedObject,this.originalAngle)}this.stopTool()},Tn.prototype.rotate=function(t){var e=this.adornedObject;if(null!==e){e.angle=t,e=e.part,e.Ta();var i=e.locationObject,n=e.rotateObject;(i===n||i.Gg(n))&&(i=this.qp.copy(),e.location=i.ge(this.rotationPoint).rotate(t-this.originalAngle).add(this.rotationPoint)),this.diagram.hd()}},Tn.prototype.computeRotate=function(t){t=this.rotationPoint.Pa(t)-this.handleAngle;var e=this.adornedObject.panel;null!==e&&(t-=e.lj()),360<=t?t-=360:0>t&&(t+=360),e=Math.min(Math.abs(this.snapAngleMultiple),180);var i=Math.min(Math.abs(this.snapAngleEpsilon),e/2);return!this.diagram.lastInput.shift&&0<e&&0<i&&(t%e<i?t=Math.floor(t/e)*e:t%e>e-i&&(t=(Math.floor(t/e)+1)*e)),360<=t?t-=360:0>t&&(t+=360),t},d.Object.defineProperties(Tn.prototype,{handleArchetype:{get:function(){return this.u},set:function(t){this.u=t}},handle:{get:function(){return this.l},set:function(t){if(null!==t&&!(t.part instanceof Qu))throw Error("new handle is not in an Adornment: "+t);this.l=t}},adornedObject:{get:function(){return this.ie},set:function(t){if(null!==t&&t.part instanceof Qu)throw Error("new handle must not be in an Adornment: "+t);this.ie=t}},snapAngleMultiple:{get:function(){return this.La},set:function(t){this.La=t}},snapAngleEpsilon:{get:function(){return this.Ka},set:function(t){this.Ka=t}},originalAngle:{get:function(){return this.Fx}},rotationPoint:{get:function(){return this.Ps},set:function(t){this.Ps=t.copy()}},handleAngle:{get:function(){return this.I},set:function(t){this.I=t}},handleDistance:{get:function(){return this.T},set:function(t){this.T=t}}}),Tn.className="RotatingTool",I("rotatingTool",(function(){return this.findTool("Rotating")}),(function(t){this.Ya("Rotating",t,this.mouseDownTools)})),f(An,ji),An.prototype.canStart=function(){return!(!this.isEnabled||this.isBeyondDragSize())},An.prototype.doMouseUp=function(){this.isActive&&(this.standardMouseSelect(),!this.standardMouseClick()&&this.diagram.lastInput.isTouchEvent&&this.diagram.toolManager.doToolTip()),this.stopTool()},An.className="ClickSelectingTool",f(Ln,ji),Ln.prototype.canStart=function(){if(!this.isEnabled)return!1;var t=this.diagram,e=t.lastInput,i=t.Vb(e.documentPoint,(function(t){for(;null!==t.panel&&!t.isActionable;)t=t.panel;return t}));return null!==i&&(!!i.isActionable&&(this.Xk=i,t.Ej=t.Vb(e.documentPoint,null,null),!0))},Ln.prototype.doMouseDown=function(){if(this.isActive){var t=this.diagram.lastInput,e=this.Xk;null!==e&&(t.targetObject=e,null!==e.actionDown&&e.actionDown(t,e))}else this.canStart()&&this.doActivate()},Ln.prototype.doMouseMove=function(){if(this.isActive){var t=this.diagram.lastInput,e=this.Xk;null!==e&&(t.targetObject=e,null!==e.actionMove&&e.actionMove(t,e))}},Ln.prototype.doMouseUp=function(){if(this.isActive){var t=this.diagram.lastInput,e=this.Xk;if(null===e)return;t.targetObject=e,null!==e.actionUp&&e.actionUp(t,e),this.standardMouseClick((function(t){for(;null!==t.panel&&(!t.isActionable||t!==e);)t=t.panel;return t}),(function(t){return t===e}))}this.stopTool()},Ln.prototype.doCancel=function(){var t=this.diagram.lastInput,e=this.Xk;null!==e&&(t.targetObject=e,null!==e.actionCancel&&e.actionCancel(t,e),this.stopTool())},Ln.prototype.doStop=function(){this.Xk=null},Ln.className="ActionTool",f(jn,ji),jn.prototype.canStart=function(){if(!this.isEnabled||null===this.archetypeNodeData)return!1;var t=this.diagram;if(t.isReadOnly||t.isModelReadOnly||!t.allowInsert||!t.lastInput.left||this.isBeyondDragSize())return!1;if(this.isDoubleClick){if(1===t.lastInput.clickCount&&(this.xx=t.lastInput.viewPoint.copy()),2!==t.lastInput.clickCount||this.isBeyondDragSize(this.xx))return!1}else if(1!==t.lastInput.clickCount)return!1;return t.currentTool===this||null===t.zm(t.lastInput.documentPoint,!0)},jn.prototype.doMouseUp=function(){var t=this.diagram;this.isActive&&this.insertPart(t.lastInput.documentPoint),this.stopTool()},jn.prototype.insertPart=function(t){var e=this.diagram,i=this.archetypeNodeData;if(null===i)return null;var n=null;try{if(e.R("ChangingSelection",e.selection),this.va(this.name),i instanceof Lu)i.Nc()&&(ul(i),n=i.copy(),null!==n&&e.add(n));else if(null!==i){var o=e.model.copyNodeData(i);N(o)&&(e.model.uf(o),n=e.zc(o))}if(null!==n){var r=pt.allocAt(t.x,t.y);this.isGridSnapEnabled&&Rr(this.diagram,n,t,r),n.location=r,e.allowSelect&&(e.clearSelection(!0),n.isSelected=!0),pt.free(r)}e.Na(),this.transactionResult=this.name,e.R("PartCreated",n)}finally{this.Jg(),e.R("ChangedSelection",e.selection)}return n},d.Object.defineProperties(jn.prototype,{archetypeNodeData:{get:function(){return this.Aj},set:function(t){this.Aj=t}},isDoubleClick:{get:function(){return this.u},set:function(t){this.u=t}},isGridSnapEnabled:{get:function(){return this.l},set:function(t){this.l=t}}}),jn.className="ClickCreatingTool",f(On,ji),On.prototype.canStart=function(){if(!this.isEnabled)return!1;var t=this.diagram;if(!t.allowSelect)return!1;var e=t.lastInput;return!(!e.left||t.currentTool!==this&&(!this.isBeyondDragSize()||e.timestamp-t.firstInput.timestamp<this.delay||null!==t.zm(e.documentPoint,!0)))},On.prototype.doActivate=function(){var t=this.diagram;this.isActive=!0,t.isMouseCaptured=!0,t.skipsUndoManager=!0,t.add(this.box),this.doMouseMove()},On.prototype.doDeactivate=function(){var t=this.diagram;t.Jf(),t.remove(this.box),t.skipsUndoManager=!1,this.isActive=t.isMouseCaptured=!1},On.prototype.doMouseMove=function(){var t=this.diagram;if(this.isActive&&null!==this.box){var e=this.computeBoxBounds(),i=this.box.bb("SHAPE");null===i&&(i=this.box.tb());var n=Bt.alloc().h(e.width,e.height);e=pt.allocAt(e.x,e.y),i.desiredSize=n,this.box.position=e,Bt.free(n),pt.free(e),(t.allowHorizontalScroll||t.allowVerticalScroll)&&t.Et(t.lastInput.viewPoint)}},On.prototype.doMouseUp=function(){if(this.isActive){var t=this.diagram;t.remove(this.box);try{t.currentCursor="wait",t.R("ChangingSelection",t.selection),this.selectInRect(this.computeBoxBounds()),t.R("ChangedSelection",t.selection)}finally{t.currentCursor=""}}this.stopTool()},On.prototype.computeBoxBounds=function(){var t=this.diagram;return new zt(t.firstInput.documentPoint,t.lastInput.documentPoint)},On.prototype.selectInRect=function(t){var e=this.diagram,i=e.lastInput;if(t=e.ty(t,this.isPartialInclusion),Y?i.meta:i.control)if(i.shift)for(t=t.iterator;t.next();)e=t.value,e.isSelected&&(e.isSelected=!1);else for(t=t.iterator;t.next();)e=t.value,e.isSelected=!e.isSelected;else if(i.shift)for(t=t.iterator;t.next();)e=t.value,e.isSelected||(e.isSelected=!0);else{for(i=new et,e=e.selection.iterator;e.next();){var n=e.value;t.contains(n)||i.add(n)}for(e=i.iterator;e.next();)e.value.isSelected=!1;for(t=t.iterator;t.next();)e=t.value,e.isSelected||(e.isSelected=!0)}},d.Object.defineProperties(On.prototype,{delay:{get:function(){return this.pl},set:function(t){this.pl=t}},isPartialInclusion:{get:function(){return this.u},set:function(t){this.u=t}},box:{get:function(){return this.l},set:function(t){this.l=t}}}),On.className="DragSelectingTool",f(Dn,ji),Dn.prototype.canStart=function(){if(!this.isEnabled)return!1;var t=this.diagram;return!(!t.allowHorizontalScroll&&!t.allowVerticalScroll||!t.lastInput.left||t.currentTool!==this&&!this.isBeyondDragSize())},Dn.prototype.doActivate=function(){var t=this.diagram;this.Pg?(t.lastInput.bubbles=!0,t.addEventListener(y.document,"scroll",this.Lx,!1)):(t.currentCursor="move",t.isMouseCaptured=!0,this.kv.assign(t.position)),this.isActive=!0},Dn.prototype.doDeactivate=function(){var t=this.diagram;t.currentCursor="",this.isActive=t.isMouseCaptured=!1},Dn.prototype.doCancel=function(){var t=this.diagram;t.position=this.kv,t.isMouseCaptured=!1,this.stopTool()},Dn.prototype.doMouseMove=function(){this.move()},Dn.prototype.doMouseUp=function(){this.move(),this.stopTool()},Dn.prototype.move=function(){var t=this.diagram;if(this.isActive&&t)if(this.Pg)t.lastInput.bubbles=!0;else{var e=t.position,i=t.firstInput.documentPoint,n=t.lastInput.documentPoint,o=e.x+i.x-n.x;i=e.y+i.y-n.y,t.allowHorizontalScroll||(o=e.x),t.allowVerticalScroll||(i=e.y),t.position=this.kz.h(o,i)}},d.Object.defineProperties(Dn.prototype,{bubbles:{get:function(){return this.Pg},set:function(t){this.Pg=t}},originalPosition:{get:function(){return this.kv}}}),Dn.className="PanningTool",I("clickCreatingTool",(function(){return this.findTool("ClickCreating")}),(function(t){this.Ya("ClickCreating",t,this.mouseUpTools)})),I("clickSelectingTool",(function(){return this.findTool("ClickSelecting")}),(function(t){this.Ya("ClickSelecting",t,this.mouseUpTools)})),I("panningTool",(function(){return this.findTool("Panning")}),(function(t){this.Ya("Panning",t,this.mouseMoveTools)})),I("dragSelectingTool",(function(){return this.findTool("DragSelecting")}),(function(t){this.Ya("DragSelecting",t,this.mouseMoveTools)})),I("actionTool",(function(){return this.findTool("Action")}),(function(t){this.Ya("Action",t,this.mouseDownTools)})),d.Object.defineProperties(Fn.prototype,{mainElement:{get:function(){return this.I},set:function(t){this.I=t}},show:{get:function(){return this.u},set:function(t){this.u!==t&&(this.u=t)}},hide:{get:function(){return this.l},set:function(t){this.l!==t&&(this.l=t)}},valueFunction:{get:function(){return this.T},set:function(t){this.T=t}}}),Fn.className="HTMLInfo",Bn.className="ContextMenuButtonInfo",f(In,ji),In.prototype.canStart=function(){if(!this.isEnabled)return!1;var t=this.diagram;return!(this.isBeyondDragSize()||!t.lastInput.right||1<t.lastInput.clickCount)&&!!(t.lastInput.isTouchEvent&&null!==this.defaultTouchContextMenu||null!==this.findObjectWithContextMenu())},In.prototype.doStart=function(){this.Cx.set(this.diagram.firstInput.documentPoint)},In.prototype.doStop=function(){this.hideContextMenu(),this.currentObject=null},In.prototype.findObjectWithContextMenu=function(t){void 0===t&&(t=null);var e=this.diagram,i=e.lastInput,n=null;if(t instanceof Ko||(n=t instanceof ca?t:e.Vb(i.documentPoint,null,(function(t){return!t.layer.isTemporary}))),null!==n){for(t=n;null!==t;){if(null!==t.contextMenu)return t;t=t.panel}if(e.lastInput.isTouchEvent&&this.defaultTouchContextMenu)return n.part}else if(null!==e.contextMenu)return e;return null},In.prototype.doActivate=function(){},In.prototype.doMouseDown=function(){if(ji.prototype.doMouseDown.call(this),this.isActive&&this.currentContextMenu instanceof Qu){var t=this.diagram.toolManager.findTool("Action");null!==t&&t.canStart()&&(t.doActivate(),t.doMouseDown(),t.doDeactivate())}this.diagram.toolManager.mouseDownTools.contains(this)&&zn(this)},In.prototype.doMouseUp=function(){if(this.isActive&&this.currentContextMenu instanceof Qu){var t=this.diagram.toolManager.findTool("Action");null!==t&&t.canStart()&&(t.doActivate(),t.doCancel(),t.doDeactivate())}zn(this)},In.prototype.doMouseMove=function(){var t=this.diagram.toolManager.findTool("Action");null!==t&&t.doMouseMove(),this.isActive&&this.diagram.toolManager.doMouseMove()},In.prototype.showContextMenu=function(t,e){var i=this.diagram;if(t!==this.currentContextMenu&&this.hideContextMenu(),t instanceof Qu){t.layerName="Tool",t.selectable=!1,t.scale=1/i.scale,t.category=this.name,null!==t.placeholder&&(t.placeholder.scale=i.scale);var n=t.diagram;null!==n&&n!==i&&n.remove(t),i.add(t),null!==e?t.adornedObject=e:t.data=i.model,t.Ta(),this.positionContextMenu(t,e)}else t instanceof Fn&&t.show(e,i,this);this.currentContextMenu=t},In.prototype.positionContextMenu=function(t){if(null===t.placeholder){var e=this.diagram,i=e.lastInput.documentPoint.copy(),n=t.measuredBounds,o=e.viewportBounds;e.lastInput.isTouchEvent&&(i.x-=n.width),i.x+n.width>o.right&&(i.x-=n.width+5/e.scale),i.x<o.x&&(i.x=o.x),i.y+n.height>o.bottom&&(i.y-=n.height+5/e.scale),i.y<o.y&&(i.y=o.y),t.position=i}},In.prototype.hideContextMenu=function(){var t=this.diagram,e=this.currentContextMenu;null!==e&&(e instanceof Qu?(t.remove(e),null!==this.Cu&&this.Cu.Hf(e.category),e.data=null,e.adornedObject=null):e instanceof Fn&&(null!==e.hide?e.hide(t,this):null!==e.mainElement&&(e.mainElement.style.display="none")),this.currentContextMenu=null,this.standardMouseOver())},In.prototype.showDefaultContextMenu=function(){var t=this.diagram;null===this.Du&&(this.Du=Gn(this)),Un.innerHTML="",qn.addEventListener("click",this.wv,!1);var e=this,i=b("ul");i.className="goCXul",Un.appendChild(i),i.innerHTML="";for(var n=this.Du.iterator;n.next();){var o=n.value,r=o.visible;if("function"===typeof o.by&&("function"!==typeof r||r(t))){r=b("li"),r.className="goCXli";var s=b("a");s.className="goCXa",s.href="#",s.dz=o.by,s.addEventListener("click",(function(i){return this.dz(t),e.stopTool(),i.preventDefault(),!1}),!1),s.textContent=o.text,r.appendChild(s),i.appendChild(r)}}Un.style.display="block",qn.style.display="block"},In.prototype.hideDefaultContextMenu=function(){if(null!==this.currentContextMenu&&this.currentContextMenu===Yn){Un.style.display="none",qn.style.display="none";var t=this.diagram;null!==t&&t.removeEventListener(qn,"click",this.wv,!1),this.currentContextMenu=null}},d.Object.defineProperties(In.prototype,{currentContextMenu:{get:function(){return this.l},set:function(t){this.l=t,this.Cu=t instanceof Qu?t.adornedPart:null}},defaultTouchContextMenu:{get:function(){return!1===Xn&&null===Yn&&ys&&En(this),Yn},set:function(t){null===t&&(Xn=!0),Yn=t}},currentObject:{get:function(){return this.u},set:function(t){this.u=t}},mouseDownPoint:{get:function(){return this.Cx}}});var Yn=null,Xn=!1,qn=null,Un=null;function Kn(){ji.call(this),this.name="TextEditing",this.zh=new Il,this.La=null,this.Ka=to,this.Wi=null,this.ia=io,this.I=1,this.T=!0,this.u=null,this.l=new Fn,this.Hu=null,Hn(this,this.l)}function Hn(t,e){if(ys){var i=b("textarea");t.Hu=i,i.addEventListener("input",(function(){if(null!==t.textBlock){var e=t.Jy(this.value);this.style.width=20+e.measuredBounds.width*this.eB+"px",this.rows=e.lineCount}}),!1),i.addEventListener("keydown",(function(e){if(null!==t.textBlock){var i=e.key;"Enter"===i?(!1===t.textBlock.isMultiline&&e.preventDefault(),t.acceptText(Zn)):"Tab"===i?(t.acceptText(Jn),e.preventDefault()):"Escape"===i&&(t.doCancel(),null!==t.diagram&&t.diagram.doFocus())}}),!1),i.addEventListener("focus",(function(){if(null!==t.currentTextEditor&&t.state!==io){var e=t.Hu;t.ia===no&&(t.ia=oo),"function"===typeof e.select&&t.selectsTextOnActivate&&(e.select(),e.setSelectionRange(0,9999))}}),!1),i.addEventListener("blur",(function(){if(null!==t.currentTextEditor&&t.state!==io){var e=t.Hu;"function"===typeof e.focus&&e.focus(),"function"===typeof e.select&&t.selectsTextOnActivate&&(e.select(),e.setSelectionRange(0,9999))}}),!1),e.valueFunction=function(){return i.value},e.mainElement=i,e.show=function(t,e,n){if(t instanceof Il&&n instanceof Kn)if(n.state===so)i.style.border="3px solid red",i.focus();else{var o=t.da(ae),r=e.position,s=e.scale,a=t.Af()*s;a<n.minimumEditorScale&&(a=n.minimumEditorScale);var h=t.naturalBounds.width*a+6,l=t.naturalBounds.height*a+2,u=(o.x-r.x)*s;o=(o.y-r.y)*s,i.value=t.text,e.div.style.font=t.font,i.style.position="absolute",i.style.zIndex="100",i.style.font="inherit",i.style.fontSize=100*a+"%",i.style.lineHeight="normal",i.style.width=h+"px",i.style.left=(u-h/2|0)-1+"px",i.style.top=(o-l/2|0)-1+"px",i.style.textAlign=t.textAlign,i.style.margin="0",i.style.padding="1px",i.style.border="0",i.style.outline="none",i.style.whiteSpace="pre-wrap",i.style.overflow="hidden",i.rows=t.lineCount,i.eB=a,i.className="goTXarea",e.div.appendChild(i),i.focus(),n.selectsTextOnActivate&&(i.select(),i.setSelectionRange(0,9999))}},e.hide=function(t){t.div.removeChild(i)}}}function _n(t){var e=t.textBlock,i=t.diagram,n=t.currentTextEditor;if(null!==e&&null!==n){var o=e.text,r="";null!==n.valueFunction&&(r=n.valueFunction()),t.isValidText(e,o,r)?(t.va(t.name),t.ia=ao,t.transactionResult=t.name,e.text=r,t.doSuccess(o,r),null!==i&&i.R("TextEdited",e,o),t.Jg(),t.stopTool(),null!==i&&i.doFocus()):(t.ia=so,t.doError(o,r))}}In.className="ContextMenuTool",I("contextMenuTool",(function(){return this.findTool("ContextMenu")}),(function(t){this.Ya("ContextMenu",t,this.mouseUpTools)})),f(Kn,ji),Kn.prototype.canStart=function(){if(!this.isEnabled)return!1;var t=this.diagram;if(null===t||t.isReadOnly||ho&&ho!==this&&(ho.acceptText($n),ho&&ho!==this)||!t.lastInput.left||this.isBeyondDragSize())return!1;var e=t.Vb(t.lastInput.documentPoint);return!!(null!==e&&e instanceof Il&&e.editable&&e.part.canEdit())&&(e=e.part,!(null===e||this.starting===to&&!e.isSelected||this.starting===eo&&2>t.lastInput.clickCount))},Kn.prototype.doStart=function(){ho=this,null!==this.textBlock&&this.doActivate()},Kn.prototype.doActivate=function(){if(!this.isActive){var t=this.diagram;if(null!==t){var e=this.textBlock;if(null===e&&(e=t.Vb(t.lastInput.documentPoint)),null!==e&&e instanceof Il&&(this.textBlock=e,null!==e.part)){this.isActive=!0,this.ia=no;var i=this.defaultTextEditor;null!==e.textEditor&&(i=e.textEditor),this.zh=this.textBlock.copy();var n=new zt(this.textBlock.da(ne),this.textBlock.da(ce));t.Aw(n),i.show(e,t,this),this.currentTextEditor=i}}}},Kn.prototype.doCancel=function(){this.stopTool()},Kn.prototype.doMouseUp=function(){this.canStart()&&this.doActivate()},Kn.prototype.doMouseDown=function(){this.isActive&&this.acceptText($n)},Kn.prototype.acceptText=function(t){switch(t){case $n:this.ia===ao?this.currentTextEditor instanceof HTMLElement&&this.currentTextEditor.focus():this.ia!==no&&this.ia!==so&&this.ia!==oo||(this.ia=ro,_n(this));break;case Wn:case Zn:case Jn:Zn===t&&!0===this.textBlock.isMultiline||this.ia!==no&&this.ia!==so&&this.ia!==oo||(this.ia=ro,_n(this))}},Kn.prototype.doError=function(t,e){var i=this.textBlock;null!==i.errorFunction&&i.errorFunction(this,t,e),(t=this.currentTextEditor)&&t.show(i,this.diagram,this)},Kn.prototype.doSuccess=function(t,e){var i=this.textBlock;null!==i.textEdited&&i.textEdited(i,t,e)},Kn.prototype.doDeactivate=function(){var t=this.diagram;null!==t&&(this.ia=io,this.textBlock=null,null!==this.currentTextEditor&&this.currentTextEditor.hide(t,this),this.isActive=!1)},Kn.prototype.doStop=function(){ho=null},Kn.prototype.isValidText=function(t,e,i){var n=this.textValidation;return!(null!==n&&!n(t,e,i))&&(n=t.textValidation,!(null!==n&&!n(t,e,i)))},Kn.prototype.Jy=function(t){var e=this.zh;return e.text=t,e.measure(this.textBlock.Ei,1/0),e},d.Object.defineProperties(Kn.prototype,{textBlock:{get:function(){return this.La},set:function(t){this.La=t}},currentTextEditor:{get:function(){return this.u},set:function(t){this.u=t}},defaultTextEditor:{get:function(){return this.l},set:function(t){this.l=t}},starting:{get:function(){return this.Ka},set:function(t){this.Ka=t}},textValidation:{get:function(){return this.Wi},set:function(t){this.Wi=t}},minimumEditorScale:{get:function(){return this.I},set:function(t){this.I=t}},selectsTextOnActivate:{get:function(){return this.T},set:function(t){this.T=t}},state:{get:function(){return this.ia},set:function(t){this.ia!==t&&(this.ia=t)}}}),Kn.prototype.measureTemporaryTextBlock=Kn.prototype.Jy;var Wn=new U(Kn,"LostFocus",0),$n=new U(Kn,"MouseDown",1),Jn=new U(Kn,"Tab",2),Zn=new U(Kn,"Enter",3),Qn=new U(Kn,"SingleClick",0),to=new U(Kn,"SingleClickSelected",1),eo=new U(Kn,"DoubleClick",2),io=new U(Kn,"StateNone",0),no=new U(Kn,"StateActive",1),oo=new U(Kn,"StateEditing",2),ro=new U(Kn,"StateValidating",3),so=new U(Kn,"StateInvalid",4),ao=new U(Kn,"StateValidated",5),ho=null;function lo(){So||(ko(),So=!0),this.C=fs,this.zl=this.ef=this.sc=this.ps=this.jc=!1,this.Qx=!0,this.Al=Po,this.tn=!1,this.zi=this.md=!0,this.Yg=600,this.ox=this.Px=!1,this.Re=new nt,this.Rd=new To,this.Rd.Uc=this,this.yj=new nt,this.tv=new nt,this.ot=new nt,this.$l=new nt}function uo(t,e){co(t,e)&&(t.ef=!0)}function co(t,e){return!(!t.md||!t.canStart(e))&&(t.Re.add(e),t.defaultAnimation.isAnimating&&t.Bc(),t.sc=!0)}function fo(t){if(t.md&&t.sc){var e=t.Rd,i=t.C,n=t.Re.contains("Model");n&&(t.zl=!0,t.Al===Po?(e.isViewportUnconstrained=!0,e.lc.clear(),e.add(i,"position",i.position.copy().offset(0,-200),i.position),e.add(i,"opacity",0,1)):t.Al===Co&&e.lc.clear(),t.Qx=!(t.Al!==No||!i.Ts.w(i.la)),i.R("InitialAnimationStarting",t)),n&&!t.zi||0===e.lc.count?(t.Re.clear(),t.sc=!1,t.ef=!1,e.lc.clear(),Ao(e,i),t.zl=!1,i.M()):(t.Re.clear(),i.Ee=!1,n=e.lc.get(i),i.autoScale!==xs&&null!==n&&(delete n.start.scale,delete n.end.scale),y.requestAnimationFrame((function(){!1===t.sc||e.jc||(i.Ke("temporaryPixelRatio")&&Jo(i),Qo(i),t.sc=!1,t.ef=!1,e.start(),mo(t),i.Na(),Do(e,0),kr(i,!0),vo(t),i.R("AnimationStarting",t))})))}}function po(t,e,i,n){t.isTicking||e instanceof Nc&&(null!==e.fromNode||null!==e.toNode)||t.Rd.add(e,"position",i,n,!1)}function go(t,e){function i(){if(0<o.ot.count&&(n.addAll(o.ot),o.ot.clear(),o.jc=!0),!1!==o.jc&&0!==n.count){o.tv.addAll(n);for(var t=o.tv.iterator;t.next();){var e=t.value;if(!1!==e.jc){t:if(0<e.qm.count)var r=!0;else{for(r=e.lc.iterator;r.next();){var s=r.key;if(s instanceof ca&&null!==s.diagram||s instanceof Ko){r=!0;break t}}r=!1}r?Oo(e,!1):e.Il=!0}}o.tv.clear(),mo(o),kr(o.C),vo(o),y.requestAnimationFrame(i)}}var n=t.yj,o=t;t.jc?t.ot.add(e):(t.jc=!0,n.add(e),y.requestAnimationFrame((function(){i()})))}function yo(t){for(t=t.yj.iterator;t.next();)t.value.Il=!1}function mo(t){if(!t.ps){var e=t.C;t.Px=e.skipsUndoManager,t.ox=e.skipsModelSourceBindings,e.skipsUndoManager=!0,e.skipsModelSourceBindings=!0,t.ps=!0}}function vo(t){var e=t.C;e.skipsUndoManager=t.Px,e.skipsModelSourceBindings=t.ox,t.ps=!1}function xo(t,e,i){t.ef&&!e.w(i)&&(t.C.pj||(e=i.copy()),Lo(t.Rd,t.C,"position",e,i))}function bo(t,e){for(e=e.findLinksConnected();e.next();){var i=e.value;i.jf=i.points.copy(),t.$l.add(i)}}function wo(t,e,i,n,o){null===t&&(t=[0,0,0,0]),null===e&&(e=[0,0,0,0]);var r=t[0],s=t[1],a=t[2];t=t[3];var h=e[0],l=e[1],u=e[2];return e=e[3],0===a||100===a?(r=h,s=l):0!==u&&100!==u||(h=r,l=s),180<Math.abs(h-r)&&(h>r?r+=360:h+=360),r=o(i,r,h-r,n)%360,s=o(i,s,l-s,n),a=o(i,a,u-a,n),i=o(i,t,e-t,n),"hsla("+r+", "+s+"%, "+a+"%, "+i+")"}function ko(){function t(t,e,i,n,o,r){t.position=new pt(n(o,e.x,i.x-e.x,r),n(o,e.y,i.y-e.y,r))}var e=new dt;e.add("position:diagram",t),e.add("position",t),e.add("position:part",(function(t,e,i,n,o,r){o<r?t.er(n(o,e.x,i.x-e.x,r),n(o,e.y,i.y-e.y,r),!1):t.position=new pt(n(o,e.x,i.x-e.x,r),n(o,e.y,i.y-e.y,r))})),e.add("location",(function(t,e,i,n,o,r){o<r?t.er(n(o,e.x,i.x-e.x,r),n(o,e.y,i.y-e.y,r),!0):t.location=new pt(n(o,e.x,i.x-e.x,r),n(o,e.y,i.y-e.y,r))})),e.add("position:placeholder",(function(t,e,i,n,o,r){o<r?t.er(n(o,e.x,i.x-e.x,r),n(o,e.y,i.y-e.y,r),!1):t.position=new pt(n(o,e.x,i.x-e.x,r),n(o,e.y,i.y-e.y,r))})),e.add("position:nodeCollapse",(function(t,e,i,n,o,r){var s=t.actualBounds,a=i.actualBounds;i=a.x+a.width/2-s.width/2,s=a.y+a.height/2-s.height/2,o<r?t.er(n(o,e.x,i-e.x,r),n(o,e.y,s-e.y,r),!1):t.position=new pt(n(o,e.x,i-e.x,r),n(o,e.y,s-e.y,r))})),e.add("desiredSize",(function(t,e,i,n,o,r){t.desiredSize=new zt(n(o,e.width,i.width-e.width,r),n(o,e.height,i.height-e.height,r))})),e.add("width",(function(t,e,i,n,o,r){t.width=n(o,e,i-e,r)})),e.add("height",(function(t,e,i,n,o,r){t.height=n(o,e,i-e,r)})),e.add("fill",(function(t,e,i,n,o,r){t.fill=wo(e,i,o,r,n)})),e.add("stroke",(function(t,e,i,n,o,r){t.stroke=wo(e,i,o,r,n)})),e.add("strokeWidth",(function(t,e,i,n,o,r){t.strokeWidth=n(o,e,i-e,r)})),e.add("strokeDashOffset",(function(t,e,i,n,o,r){t.strokeDashOffset=n(o,e,i-e,r)})),e.add("background",(function(t,e,i,n,o,r){t.background=wo(e,i,o,r,n)})),e.add("areaBackground",(function(t,e,i,n,o,r){t.areaBackground=wo(e,i,o,r,n)})),e.add("opacity",(function(t,e,i,n,o,r){t.opacity=n(o,e,i-e,r)})),e.add("scale",(function(t,e,i,n,o,r){t.scale=n(o,e,i-e,r)})),e.add("angle",(function(t,e,i,n,o,r){t.angle=n(o,e,i-e,r)})),Mo=e}Kn.className="TextEditingTool",Kn.LostFocus=Wn,Kn.MouseDown=$n,Kn.Tab=Jn,Kn.Enter=Zn,Kn.SingleClick=Qn,Kn.SingleClickSelected=to,Kn.DoubleClick=eo,Kn.StateNone=io,Kn.StateActive=no,Kn.StateEditing=oo,Kn.StateValidating=ro,Kn.StateInvalid=so,Kn.StateValidated=ao,I("textEditingTool",(function(){return this.findTool("TextEditing")}),(function(t){this.Ya("TextEditing",t,this.mouseUpTools)})),lo.prototype.ee=function(t){this.C=t},lo.prototype.canStart=function(){return!0},i=lo.prototype,i.cu=function(t){return this.Rd.cu(t)},i.ew=function(t){return this.Rd.ew(t)},i.Bc=function(t){var e=this.Rd;if(!0===this.sc&&(this.zl=this.ef=this.sc=!1,this.Re.clear(),0<e.lc.count&&this.C.Db()),this.jc){if(e.xm(!0),e.lc.clear(),Ao(e,null),!0===t)for(t=this.yj.ma(),e=0;e<t.length;e++)t[e].xm(!0)}else e.lc.clear(),Ao(e,this.C)},i.xm=function(t){t===this.defaultAnimation&&this.defaultAnimation.lc.clear(),this.yj.remove(t),0===this.yj.count&&(this.jc=!1,this.C.Db()),t===this.defaultAnimation&&(this.defaultAnimation.lc.clear(),this.C.R("AnimationFinished",this))},i.lk=function(t,e){this.ef&&(this.Re.contains("Expand Tree")||this.Re.contains("Expand SubGraph"))&&(this.Rd.lk(t,e),bo(this,t))},i.jk=function(t,e){this.ef&&(this.Re.contains("Collapse Tree")||this.Re.contains("Collapse SubGraph"))&&(this.Rd.jk(t,e),Lo(this.Rd,e,"position",e.position,e.position),bo(this,t))},d.Object.defineProperties(lo.prototype,{animationReasons:{get:function(){return this.Re}},isEnabled:{get:function(){return this.md},set:function(t){(this.md=t)&&this.yj.each((function(t){t.isAnimating||1/0!==t.runCount||t.start()}))}},duration:{get:function(){return this.Yg},set:function(t){1>t&&M(t,">= 1",lo,"duration"),this.Yg=t}},isAnimating:{get:function(){return this.jc}},isTicking:{get:function(){return this.ps}},isInitial:{get:function(){return this.zi},set:function(t){this.zi=t}},defaultAnimation:{get:function(){return this.Rd}},activeAnimations:{get:function(){return this.yj}},initialAnimationStyle:{get:function(){return this.Al},set:function(t){this.Al=t}}}),lo.prototype.stopAnimation=lo.prototype.Bc;var Mo=null,So=!1,Po=new U(lo,"Default",1),No=new U(lo,"AnimateLocations",2),Co=new U(lo,"None",3);function To(){this.xv=this.Ox=this.Uc=this.C=null,this.Il=this.jc=this.l=!1,this.Zn=this.Dd=0,this.Ir=this.Ku=Fo,this.Hl=this.Fp=!1,this.nv=1,this.mv=0,this.vd=this.Yg=NaN,this.tx=0,this.$n=null,this.u=At,this.lc=new dt,this.iv=new dt,this.qm=new nt,this.jv=new nt,this.px=Ts}function Ao(t,e){if(t.iv.clear(),t.Hl=!1,t.mv=0,t.vd=NaN,0<t.qm.count&&t.qm.clear(),0<t.jv.count&&t.jv.clear(),null!==e)for(t=e.links;t.next();)t.value.jf=null}function Lo(t,e,i,n,o,r){var s=t.lc;if(e instanceof Ko&&"position"===i&&(i="position:diagram"),"fill"!==i&&"stroke"!==i&&"background"!==i&&"areaBackground"!==i||(ah(n),hh(),n=[Nh.l,Nh.I,Nh.u,Nh.T],ah(o),hh(),o=[Nh.l,Nh.I,Nh.u,Nh.T]),s.contains(e)){var a=s.G(e),h=a.start,l=a.end;void 0===h[i]&&(h[i]=jo(n)),l[i]=jo(o)}else h={},l={},h[i]=jo(n),l[i]=jo(o),a=h.position,e instanceof ca&&a instanceof pt&&!a.s()&&e.diagram.animationManager.Re.contains("Expand SubGraph")&&a.assign(l.position),a=new Io(h,l,r),s.add(e,a);s=h[i],s instanceof pt&&!s.s()&&s.assign(t.u),r&&0===i.indexOf("position:")&&e instanceof Lu?a.Qv.location=jo(e.location):r&&(a.Qv[i]=jo(n))}function jo(t){return t instanceof pt||t instanceof Bt?t.copy():t}function Oo(t,e){if(!t.Il||e){var i=t.Uc;if(!1!==t.jc){var n=+new Date,o=n>t.Zn?t.vd:n-t.Dd;e&&(o=t.tx,o<t.vd?(t.Dd=+new Date-o,t.Zn=t.Dd+t.vd):o=t.vd),mo(i),Do(t,o),kr(t.C,!0),vo(i),n>t.Zn&&(t.Fp&&!t.Hl?(t.Dd=+new Date,t.Zn=t.Dd+t.vd,t.Hl=!0):t.xm(!1))}}}function Do(t,e){for(var i=t.vd,n=t.lc.iterator,o=t.Hl;n.next();){var r=n.key;if(!(r instanceof ca&&null===r.diagram)){var s=n.value,a=o?s.end:s.start;s=o?s.start:s.end;var h,l=Mo;for(h in s)"position"===h&&(s["position:placeholder"]||s["position:nodeCollapse"])||null===l.get(h)||l.get(h)(r,a[h],s[h],t.Ir,e,i,t)}}}function Fo(t,e,i,n){return t/=n/2,1>t?i/2*t*t+e:-i/2*(--t*(t-2)-1)+e}function Bo(t,e,i,n){return t===n?e+i:i*(1-Math.pow(2,-10*t/n))+e}function Io(t,e,i){this.start=t,this.end=e,this.Qv={},this.Kv=i,this.sw=!1}function Eo(t,e,i){this.pd=null,this.gf=t,this.cq=i||zo,this.bl=null,void 0!==e&&(this.bl=e,void 0===i&&(this.cq=Vo))}function Ro(t,e){t=t.bl,null!==t&&(t.duration&&(e.duration=t.duration),t.finished&&(e.finished=t.finished),t.easing&&(e.easing=t.easing))}lo.className="AnimationManager",lo.defineAnimationEffect=function(t,e){So||(ko(),So=!0),Mo.add(t,e)},lo.Default=Po,lo.AnimateLocations=No,lo.None=Co,To.prototype.suspend=function(){this.Il=!0},To.prototype.advanceTo=function(t,e){e&&(this.Il=!1),this.Fp&&t>=this.vd&&(this.Hl=!0,t-=this.vd),this.tx=t,Oo(this,!0),mo(this.Uc),kr(this.C),vo(this.Uc),this.C.redraw()},i=To.prototype,i.start=function(){if(0!==this.lc.count&&!this.jc){for(var t=this.C,e=this.lc.iterator;e.next();){var i=e.value.end,n=e.key;if(i["position:placeholder"]){var o=n.findVisibleNode();if(o instanceof bc&&null!==o.placeholder){var r=o.placeholder;o=r.da(ne),r=r.padding,o.x+=r.left,o.y+=r.top,i["position:placeholder"]=o}}null===t&&(n instanceof Ko?t=n:n instanceof ca&&(t=n.diagram))}null!==t&&(this.C=t,e=this.Uc=t.animationManager,!1!==e.isEnabled&&(this.vd=isNaN(this.Yg)?e.duration:this.Yg,this.Ir=this.Ku,e.zl&&e.Al===Po&&this===e.defaultAnimation&&(this.Ir=Bo,this.vd=isNaN(this.Yg)?600===e.duration?900:e.duration:this.Yg),this.px=t.scrollMode,this.isViewportUnconstrained&&(t.Ti=As),mo(e),this.qm.each((function(e){e.data=null,t.add(e)})),vo(e),this.jc=!0,this.Dd=+new Date,this.Zn=this.Dd+this.vd,go(e,this)))}},i.sz=function(t,e){t.Nc()&&(this.qm.add(t),this.C=e)},i.add=function(t,e,i,n,o){if("position"!==e||!i.w(n)){if(null===this.C&&(t instanceof Ko?this.C=t:t instanceof ca&&null!==t.diagram&&(this.C=t.diagram)),t instanceof Lu){if(!t.isAnimated)return;"position"===e&&(e="position:part")}Lo(this,t,e,i,n,o)}},i.cu=function(t){return!!this.jc&&(t=this.lc.G(t),null!==t&&t.sw)},i.ew=function(t){return!!this.jc&&(t=this.lc.G(t),null!==t&&(t.start.position||t.start.location))},i.stop=function(){this.jc&&this.xm(!0)},i.xm=function(t){if(null!==this.xv&&this.xv.Mp.remove(this.Ox),this.jc){var e=this.C,i=this.Uc;this.Il=this.jc=i.zl=!1,mo(i);for(var n=this.lc,o=this.qm.iterator;o.next();)e.remove(o.value);for(o=this.jv.iterator;o.next();)o.value.o();o=this.Fp,n=n.iterator;for(var r=Mo;n.next();){var s,a=n.key,h=n.value,l=o?h.end:h.start,u=o?h.start:h.end,c=h.Qv;for(s in u)if(null!==r.get(s)){var f=s;!h.Kv||"position:nodeCollapse"!==f&&"position:placeholder"!==f||(f="position"),r.get(f)(a,l[s],void 0!==c[s]?c[s]:h.Kv?l[s]:u[s],this.Ir,this.vd,this.vd,this)}h.Kv&&void 0!==c.location&&a instanceof Lu&&(a.location=c.location),h.sw&&a instanceof Lu&&a.Ob(!1)}if(e.Yt.clear(),Zo(e,!1),e.Na(),e.M(),kr(e,!0),i.defaultAnimation===this){for(s=i.$l.iterator;s.next();)o=s.value,null!==o.jf&&(o.points=o.jf,o.jf=null);i.$l.clear()}this.isViewportUnconstrained&&(e.scrollMode=this.px),vo(i),this.mv++,!t&&this.nv>this.mv?(this.Hl=!1,this.start()):(this.$n&&this.$n(this),Ao(this,null),i.xm(this),e.Db())}},i.lk=function(t,e){var i=e.actualBounds,n=null;if(e instanceof bc&&(n=e.placeholder),null!==n?(i=n.da(ne),n=n.padding,i.x+=n.left,i.y+=n.top,this.add(t,"position",i,t.position,!1)):this.add(t,"position",new pt(i.x+i.width/2,i.y+i.height/2),t.position,!1),this.add(t,"scale",.01,t.scale,!1),t instanceof bc)for(t=t.memberParts;t.next();)n=t.value,n instanceof ec&&this.lk(n,e)},i.jk=function(t,e){if(t.isVisible()){var i=null;if(e instanceof bc&&(i=e.placeholder),null!==i?this.add(t,"position:placeholder",t.position,i,!0):this.add(t,"position:nodeCollapse",t.position,e,!0),this.add(t,"scale",t.scale,.01,!0),i=this.lc,i.contains(t)&&(i.G(t).sw=!0),t instanceof bc)for(t=t.memberParts;t.next();)i=t.value,i instanceof ec&&this.jk(i,e)}},i.pA=function(t){var e=this.iv.get(t);return null===e&&(e={},this.iv.add(t,e)),e},d.Object.defineProperties(To.prototype,{duration:{get:function(){return this.Yg},set:function(t){1>t&&M(t,">= 1",To,"duration"),this.Yg=t}},reversible:{get:function(){return this.Fp},set:function(t){this.Fp=t}},runCount:{get:function(){return this.nv},set:function(t){0<t?this.nv=t:w("Animation.runCount value must be a positive integer.")}},finished:{get:function(){return this.$n},set:function(t){this.$n!==t&&(this.$n=t)}},easing:{get:function(){return this.Ku},set:function(t){this.Ku=t}},isViewportUnconstrained:{get:function(){return this.l},set:function(t){this.l=t}},isAnimating:{get:function(){return this.jc}}}),To.prototype.getTemporaryState=To.prototype.pA,To.prototype.stop=To.prototype.stop,To.prototype.add=To.prototype.add,To.prototype.addTemporaryPart=To.prototype.sz,To.className="Animation",To.EaseLinear=function(t,e,i,n){return i*t/n+e},To.EaseInOutQuad=Fo,To.EaseInQuad=function(t,e,i,n){return i*(t/=n)*t+e},To.EaseOutQuad=function(t,e,i,n){return-i*(t/=n)*(t-2)+e},To.EaseInExpo=function(t,e,i,n){return 0===t?e:i*Math.pow(2,10*(t/n-1))+e},To.EaseOutExpo=Bo,Io.className="AnimationState",Eo.prototype.copy=function(){var t=new Eo(this.gf);t.cq=this.cq;var e=this.bl;if(null!==e){var i={};void 0!==e.duration&&(i.ny=e.duration),void 0!==e.finished&&(i.ny=e.finished),void 0!==e.easing&&(i.ny=e.easing),t.bl=i}return t},d.Object.defineProperties(Eo.prototype,{propertyName:{get:function(){return this.gf},set:function(t){this.gf=t}},animationSettings:{get:function(){return this.bl},set:function(t){this.bl=t}},startCondition:{get:function(){return this.cq},set:function(t){this.cq=t}}});var zo=new U(Eo,"Default",1),Vo=new U(Eo,"Immediate",2),Go=new U(Eo,"Bundled",3);function Yo(){ot(this),this.C=null,this.Ea=new et,this.oa="",this.hb=1,this.u=!1,this.l=this.Pi=this.I=this.ii=this.hi=this.gi=this.fi=this.di=this.ei=this.ci=this.ki=this.bi=this.ji=this.ai=this.$h=!0,this.rp=[]}function Xo(t,e){var i=1;return 1!==t.hb&&(i=e.globalAlpha,e.globalAlpha=i*t.hb),i}function qo(t,e,i){if(e=Uo(t,e,i),i instanceof bc&&null!==i&&isNaN(i.zOrder)){if(0!==i.memberParts.count){for(var n=-1,o=t.Ea.j,r=o.length,s=0;s<r;s++){var a=o[s];if(a===i&&(e=s,0<=n))break;if(0>n&&a.containingGroup===i&&(n=s,0<=e))break}!(0>n)&&n<e&&(o=t.Ea,o.cb(e),o.wb(n,i))}i=i.containingGroup,null!==i&&qo(t,-1,i)}}function Uo(t,e,i){var n=i.zOrder;if(isNaN(n))return e;t=t.Ea;var o=t.count;if(1>=o)return e;if(0>e&&(e=t.indexOf(i)),0>e)return-1;for(var r=e-1,s=NaN;0<=r;){if(s=t.J(r).zOrder,!isNaN(s))break;r--}for(var a=e+1,h=NaN;a<o;){if(h=t.J(a).zOrder,!isNaN(h))break;a++}if(!isNaN(s)&&s>n)for(;;){if(-1===r||s<=n){if(r++,r===e)break;return t.cb(e),t.wb(r,i),r}for(s=NaN;0<=--r&&(s=t.J(r).zOrder,isNaN(s)););}else if(!isNaN(h)&&h<n)for(;;){if(a===o||h>=n){if(a--,a===e)break;return t.cb(e),t.wb(a,i),a}for(h=NaN;++a<o&&(h=t.J(a).zOrder,isNaN(h)););}return e}function Ko(t){if(1<arguments.length&&w("Diagram constructor can only take one optional argument, the DIV HTML element or its id."),Es||(Rs(),Es=!0),ot(this),fs=this,this.Sb=!0,this.Uc=new lo,this.Uc.ee(this),this.rb=17,this.Gl=this.pv=!1,this.Ss="default",this.Fa=null,ys){var e=this,i=function(){e.removeEventListener(y.document,"DOMContentLoaded",i,!1),e.setRTL()};null!==y.document.body?this.setRTL():e.addEventListener(y.document,"DOMContentLoaded",i,!1)}this.Ma=new et,this.xa=this.ya=0,this.Zl=this.wa=null,this.Kx=new dt,this.hf=this.Gb=null,this.xw(),this.Nj=null,this.ww(),this.hb=1,this.la=new pt(NaN,NaN).freeze(),this.Ts=new pt(NaN,NaN),this.Qn=this.Aa=1,this.es=new pt(NaN,NaN).freeze(),this.fs=NaN,this.xs=1e-4,this.vs=100,this.sb=new Ke,this.xt=new pt(NaN,NaN).freeze(),this.Zr=new zt(NaN,NaN,NaN,NaN).freeze(),this.Si=new Qt(0,0,0,0).freeze(),this.Ti=Ts,this.at=!1,this.Us=this.Ns=null,this.Og=xs,this.Dj=Ce,this.Yf=xs,this.to=Ce,this.gs=this.ds=ne,this.Dc=!0,this.El=!1,this.wd=new nt,this.Vg=new dt,this.rl=!0,this.qn=250,this.Bj=-1,this.sn=new Qt(16,16,16,16).freeze(),this.Hj=this.Ee=!1,this.Kj=!0,this.Wf=new wi,this.Wf.diagram=this,this.od=new wi,this.od.diagram=this,this.hh=new wi,this.hh.diagram=this,this.we=this.Of=null,this.hk=!1,this.Pr=this.Qr=null,this.zj=y.PointerEvent&&(z||V||G)&&y.navigator&&!1!==y.navigator.msPointerEnabled,es(this),this.Dh=new nt,this.qs=!0,this.rt=Ls,this.Uu=!1,this.tt=ks,this.La=null,ds.add("Model",vd),this.Jr=this.Mr=this.pt=null,this.Pn=this.Hr="auto",this.gg=this.As=this.ig=this.jg=this.lg=this.Qf=this.Uf=this.Pf=null,this.cs=!1,this.Rf=this.wg=this.kg=this.hg=null,this.Bs=!1,this.Ls={},this.bk=[null,null],this.Br=null,this.Nr=this.gt=this.rv=this.vg=!1,this.av=!0,this.yi=this.ac=!1,this.cc=null;var n=this;this.Cc=function(t){var e=n.partManager;if(t.model===e.diagram.model&&e.diagram.Z){e.diagram.Z=!1;try{var i=t.change;""===t.modelChange&&i===Pi&&e.updateDataBindings(t.object,t.propertyName)}finally{e.diagram.Z=!0}}},this.Tc=function(t){n.partManager.doModelChanged(t)},this.zv=!0,this.Xd=-2,this.pg=new dt,this.Wl=new et,this.$f=!1,this.ai=this.$h=this.nr=this.md=!0,this.pr=!1,this.vr=this.tr=this.ii=this.hi=this.gi=this.fi=this.di=this.ei=this.ci=this.sr=this.ki=this.bi=this.ji=this.qr=!0,this.Zf=this.Xu=!1,this.ur=this.rr=this.wl=this.vl=!0,this.$s=this.Ws=16,this.Vs=this.Op=!1,this.Pp=this.Ys=null,this.Xs=this.Zs=0,this.ib=new Qt(5).freeze(),this.qv=(new nt).freeze(),this.ws=999999999,this.Su=(new nt).freeze(),this.xi=this.wi=this.vi=!0,this.Ye=this.pe=!1,this.kc=null,this.Ng=!0,this.qe=!1,this.Ax=new nt,this.Tu=new nt,this.Gc=null,this.Vl=1,this.sv=0,this.Ic={scale:1,position:new pt,bounds:new zt,Gv:new Bt,kw:new Bt,hw:!1},this.Rx=new zt(NaN,NaN,NaN,NaN).freeze(),this.sm=new Bt(NaN,NaN).freeze(),this.Rn=new zt(NaN,NaN,NaN,NaN).freeze(),this.rs=!1,this.Lo=this.qo=this.kp=this.Fu=this.Eu=this.Gu=this.bg=this.fh=this.df=this.Tr=null,Wo(this),this.Ib=null,this.po=!1,this.Ej=null,this.partManager=new vd,this.toolManager=new Di,this.toolManager.initializeStandardTools(),this.currentTool=this.defaultTool=this.toolManager,this.Sr=null,this.kl=new ea,this.Gs=this.Fs=null,this.fq=!1,this.commandHandler=_o(),this.model=op(),this.vg=!0,tr(this),this.layout=new zf,this.vg=!1,this.ux=this.Ju=null,this.Tb=1,this.yh=null,this.Xo=1,this.cp=0,this.hv=[0,0,0,0,0],this.ep=0,this.xd=1,this.Sj=0,this.Go=new pt,this.qt=500,this.rn=new pt,this.re=!1,this.Qk=this.Rk=this.Pk=this.Ok=this.Jk=this.Lk=this.Kk=this.Hk=this.Ik=this.Ww=this.Mw=this.Nw=this.Ow=null,this.Yq=function(){},this.preventDefault=null,this.wo=!1,this.ui=new zs,this.gq=!1,void 0!==t&&Gs(this,t),this.ao=null,this.bo=Dt,this.Sb=!1}function Ho(t,e){t.animationManager.Bc(!0),t.qv=(new nt).freeze(),t.Su=(new nt).freeze();var i=t.skipsUndoManager;null!==t.model&&(t.skipsUndoManager=!0);var n=null;null!==t.Ib&&(n=t.Ib.part,null!==n&&t.remove(n));var o=[],r=t.Ma.length;if(e){for(e=0;e<r;e++)for(var s=t.Ma.j[e].parts;s.next();){var a=s.value;a!==n&&null===a.data&&o.push(a)}for(e=0;e<o.length;e++)t.remove(o[e])}for(e=0;e<r;e++)t.Ma.j[e].clear();return t.partManager.clear(),t.wd.clear(),t.Vg.clear(),t.Dh.clear(),t.Ej=null,t.Wl.clear(),fu(),t.pg.clear(),q=[],null!==n&&(t.add(n),t.partManager.parts.remove(n)),null!==t.model&&(t.skipsUndoManager=i),o}function _o(){return null}function Wo(t){t.df=new dt;var e=new ec,i=new Il;i.bind(new cp("text","",F)),e.add(i),t.Gu=e,t.df.add("",e),e=new ec,i=new Il,i.stroke="brown",i.bind(new cp("text","",F)),e.add(i),t.df.add("Comment",e),e=new ec,e.selectable=!1,e.avoidable=!1,i=new Nl,i.figure="Ellipse",i.fill="black",i.stroke=null,i.desiredSize=new Bt(3,3).ca(),e.add(i),t.df.add("LinkLabel",e),t.fh=new dt,e=new bc,e.selectionObjectName="GROUPPANEL",e.type=Uh.Vertical,i=new Il,i.font="bold 12pt sans-serif",i.bind(new cp("text","",F)),e.add(i),i=new Uh(Uh.Auto),i.name="GROUPPANEL";var n=new Nl;n.figure="Rectangle",n.fill="rgba(128,128,128,0.2)",n.stroke="black",i.add(n),n=new Pc,n.padding=new Qt(5,5,5,5).ca(),i.add(n),e.add(i),t.Eu=e,t.fh.add("",e),t.bg=new dt,e=new Nc,i=new Nl,i.isPanelMain=!0,e.add(i),i=new Nl,i.toArrow="Standard",i.fill="black",i.stroke=null,i.strokeWidth=0,e.add(i),t.Fu=e,t.bg.add("",e),e=new Nc,i=new Nl,i.isPanelMain=!0,i.stroke="brown",e.add(i),t.bg.add("Comment",e),e=new Qu,e.type=Uh.Auto,i=new Nl,i.fill=null,i.stroke="dodgerblue",i.strokeWidth=3,e.add(i),i=new Pc,i.margin=new Qt(1.5,1.5,1.5,1.5).ca(),e.add(i),t.kp=e,t.qo=e,e=new Qu,e.type=Uh.Link,i=new Nl,i.isPanelMain=!0,i.fill=null,i.stroke="dodgerblue",i.strokeWidth=3,e.add(i),t.Lo=e}function $o(t){var e=t.wa.Ja;e instanceof HTMLCanvasElement&&(t.zj?(t.addEventListener(e,"pointerdown",t.Ok,!1),t.addEventListener(e,"pointermove",t.Pk,!1),t.addEventListener(e,"pointerup",t.Rk,!1),t.addEventListener(e,"pointerout",t.Qk,!1)):(t.addEventListener(e,"touchstart",t.Ow,!1),t.addEventListener(e,"touchmove",t.Nw,!1),t.addEventListener(e,"touchend",t.Mw,!1),t.addEventListener(e,"mousemove",t.Ik,!1),t.addEventListener(e,"mousedown",t.Hk,!1),t.addEventListener(e,"mouseup",t.Kk,!1),t.addEventListener(e,"mouseout",t.Jk,!1)),t.addEventListener(e,"mouseenter",t.Oz,!1),t.addEventListener(e,"mouseleave",t.Pz,!1),t.addEventListener(e,"wheel",t.Lk,!1),t.addEventListener(e,"keydown",t.BA,!1),t.addEventListener(e,"keyup",t.CA,!1),t.addEventListener(e,"blur",t.Az,!1),t.addEventListener(e,"focus",t.Bz,!1),t.addEventListener(e,"selectstart",(function(t){return t.preventDefault(),!1}),!1),t.addEventListener(e,"contextmenu",(function(t){return t.preventDefault(),!1}),!1),t.addEventListener(e,"gesturestart",(function(e){t.toolManager.gestureBehavior!==Vi&&(t.toolManager.gestureBehavior===zi?e.preventDefault():t.re&&t.lastInput.handled||(e.preventDefault(),t.Vl=t.scale,t.currentTool.doCancel()))}),!1),t.addEventListener(e,"gesturechange",(function(e){if(t.toolManager.gestureBehavior!==Vi)if(t.toolManager.gestureBehavior===zi)e.preventDefault();else if(!t.re||!t.lastInput.handled){e.preventDefault();var i=e.scale;if(null!==t.Vl){var n=t.wa.getBoundingClientRect();if(e=new pt(e.pageX-y.scrollX-t.ya/n.width*n.left,e.pageY-y.scrollY-t.xa/n.height*n.top),i=t.Vl*i,n=t.commandHandler,i!==t.scale&&n.canResetZoom(i)){var o=t.zoomPoint;t.zoomPoint=e,n.resetZoom(i),t.zoomPoint=o}}}}),!1),t.addEventListener(y,"resize",t.Ww,!1))}function Jo(t){30<t.cp&&(t.yh=1)}function Zo(t,e){null!==t.yh&&(t.yh=null,e&&t.Yq(),W&&W.my||(t.cp=0,t.hv=[0,0,0,0,0],t.ep=0))}function Qo(t){if(null!==t.wa){var e=t.Fa;if(0!==e.clientWidth&&0!==e.clientHeight){t.pv||t.setScrollWidth();var i=t.Ye?t.rb:0,n=t.pe?t.rb:0,o=t.Tb;t.Tb=t.computePixelRatio(),t.Tb!==o&&(t.El=!0,t.Db()),e.clientWidth===t.ya+i&&e.clientHeight===t.xa+n||(t.wi=!0,t.Dc=!0,e=t.layout,null!==e&&e.isViewportSized&&t.autoScale===xs&&(t.Hj=!0,e.B()),t.ac||t.Db())}}}function tr(t){var e=new Yo;e.name="Background",t.um(e),e=new Yo,e.name="",t.um(e),e=new Yo,e.name="Foreground",t.um(e),e=new Yo,e.name="Adornment",e.isTemporary=!0,e.isInDocumentBounds=!1,t.um(e),e=new Yo,e.name="Tool",e.isTemporary=!0,e.isInDocumentBounds=!0,t.um(e),e=new Yo,e.name="Grid",e.allowSelect=!1,e.pickable=!1,e.isTemporary=!0,e.isInDocumentBounds=!1,t.Ux(e,t.xk("Background"))}function er(t){t.Ib=new Uh(Uh.Grid),t.Ib.name="GRID";var e=new Nl;e.figure="LineH",e.stroke="lightgray",e.strokeWidth=.5,e.interval=1,t.Ib.add(e),e=new Nl,e.figure="LineH",e.stroke="gray",e.strokeWidth=.5,e.interval=5,t.Ib.add(e),e=new Nl,e.figure="LineH",e.stroke="gray",e.strokeWidth=1,e.interval=10,t.Ib.add(e),e=new Nl,e.figure="LineV",e.stroke="lightgray",e.strokeWidth=.5,e.interval=1,t.Ib.add(e),e=new Nl,e.figure="LineV",e.stroke="gray",e.strokeWidth=.5,e.interval=5,t.Ib.add(e),e=new Nl,e.figure="LineV",e.stroke="gray",e.strokeWidth=1,e.interval=10,t.Ib.add(e),e=new Lu,e.add(t.Ib),e.layerName="Grid",e.zOrder=0,e.isInDocumentBounds=!1,e.isAnimated=!1,e.pickable=!1,e.locationObjectName="GRID",t.add(e),t.partManager.parts.remove(e),t.Ib.visible=!1}function ir(){this.C.Vs?this.C.Vs=!1:this.C.isEnabled?this.C.iy(this):Dr(this.C)}function nr(t){this.C.isEnabled?(this.C.Zs=t.target.scrollTop,this.C.Xs=t.target.scrollLeft):Dr(this.C)}function or(t){if(t.fixedBounds.s()){var e=t.fixedBounds.copy();return e.uq(t.ib),e}for(var i=!0,n=t.Ma.j,o=n.length,r=0;r<o;r++){var s=n[r];if(s.visible&&s.isInDocumentBounds){s=s.Ea.j;for(var a=s.length,h=0;h<a;h++){var l=s[h];l.isInDocumentBounds&&l.isVisible()&&(l=l.actualBounds,l.s()&&(i?(i=!1,e=l.copy()):e.Rc(l)))}}}return i&&(e=new zt(0,0,0,0)),e.uq(t.ib),e}function rr(t,e){if((e||t.qe)&&!t.Sb&&null!==t.wa&&t.documentBounds.s()){if(e){var i=t.initialPosition;if(i.s())return void(t.position=i);i=pt.alloc(),i.tj(t.documentBounds,t.initialDocumentSpot);var n=t.viewportBounds;n=zt.allocAt(0,0,n.width,n.height);var o=pt.alloc();o.tj(n,t.initialViewportSpot),o.h(i.x-o.x,i.y-o.y),t.position=o,zt.free(n),pt.free(o),pt.free(i)}t.Sb=!0,i=t.Og,e&&t.Yf!==xs&&(i=t.Yf),n=i!==xs?sr(t,i):t.scale,i=t.viewportBounds.copy(),o=t.ya/n;var r=t.xa/n,s=t.Dj,a=t.to;e&&!s.kb()&&(a.kb()||a.Mb())&&(s=a.Mb()?ae:a),ar(t,t.documentBounds,o,r,s,e),e=t.scale,t.scale=n,t.Sb=!1,n=t.viewportBounds,n.Qa(i)||t.onViewportBoundsChanged(i,n,e,!1),Ar(t),wr(t,!0,!1)}}function sr(t,e){var i=t.Qn;if(null===t.wa)return i;t.Ta();var n=t.documentBounds;if(!n.s())return i;var o=n.width;n=n.height;var r=t.ya+(t.Ye?t.rb:0),s=t.xa+(t.pe?t.rb:0),a=r/o,h=s/n;return e===bs?(e=Math.min(h,a),e>i&&(e=i),e<t.minScale&&(e=t.minScale),e>t.maxScale&&(e=t.maxScale),e):e===ws?(e=h>a?(s-t.rb)/n:(r-t.rb)/o,e>i&&(e=i),e<t.minScale&&(e=t.minScale),e>t.maxScale&&(e=t.maxScale),e):t.scale}function ar(t,e,i,n,o,r){var s=pt.allocAt(t.la.x,t.la.y),a=s.x,h=s.y;if(null!==t.ao){var l=pt.alloc();l=t.ao.da(ne,l),a=l.x-t.bo.x/t.scale,h=l.y-t.bo.y/t.scale,o=ie,pt.free(l)}(r||t.scrollMode===Ts)&&(o.kb()&&(i>e.width&&(a=e.x+(o.x*e.width+o.offsetX)-(o.x*i-o.offsetX)),n>e.height&&(h=e.y+(o.y*e.height+o.offsetY)-(o.y*n-o.offsetY))),o=t.Si,r=i-e.width,i<e.width+o.left+o.right?(a=Math.min(a+i/2,e.right+Math.max(r,o.right)-i/2),a=Math.max(a,e.left-Math.max(r,o.left)+i/2),a-=i/2):a>e.left?a=e.left:a<e.right-i&&(a=e.right-i),i=n-e.height,n<e.height+o.top+o.bottom?(h=Math.min(h+n/2,e.bottom+Math.max(i,o.bottom)-n/2),h=Math.max(h,e.top-Math.max(i,o.top)+n/2),h-=n/2):h>e.top?h=e.top:h<e.bottom-n&&(h=e.bottom-n)),s.x=isFinite(a)?a:-t.ib.left,s.y=isFinite(h)?h:-t.ib.top,null!==t.positionComputation&&(e=t.positionComputation(t,s),s.x=e.x,s.y=e.y),t.Uc.sc&&xo(t.Uc,t.la,s),t.la.h(s.x,s.y),pt.free(s)}function hr(t,e,i,n){for(void 0===i&&(i=null),void 0===n&&(n=null),Sr(t),t=t.Ma.iteratorBackwards;t.next();){var o=t.value;if(o.visible&&!o.isTemporary&&(o=o.Vb(e,i,n),null!==o))return o}return null}function lr(t,e,i,n,o){for(void 0===i&&(i=null),void 0===n&&(n=null),o instanceof et||o instanceof nt||(o=new nt),Sr(t),t=t.Ma.iteratorBackwards;t.next();){var r=t.value;r.visible&&!r.isTemporary&&r.hj(e,i,n,o)}return o}function ur(t,e,i,n,o){var r=null;for(void 0===r&&(r=null),void 0===i&&(i=null),void 0===n&&(n=!1),o instanceof et||o instanceof nt||(o=new nt),Sr(t),t=t.Ma.iteratorBackwards;t.next();){var s=t.value;s.visible&&!s.isTemporary&&s.zf(e,r,i,n,o)}return o}function cr(t,e,i,n,o,r){var s=null;for(void 0===s&&(s=null),void 0===n&&(n=null),void 0===o&&(o=!0),!1!==o&&!0!==o&&((o instanceof et||o instanceof nt)&&(r=o),o=!0),r instanceof et||r instanceof nt||(r=new nt),Sr(t),t=t.Ma.iteratorBackwards;t.next();){var a=t.value;a.visible&&!a.isTemporary&&a.Eg(e,i,s,n,o,r)}return r}function fr(t,e,i){var n=t.od;return t.od=t.hh,t.hh=n,n.diagram=t,n.event=e,i?vr(t,e,n):(n.viewPoint=t.od.viewPoint,n.documentPoint=t.od.documentPoint),t=0,e.ctrlKey&&(t+=1),e.altKey&&(t+=2),e.shiftKey&&(t+=4),e.metaKey&&(t+=8),n.modifiers=t,n.button=e.button,void 0===e.buttons||R||(n.buttons=e.buttons),Y&&0===e.button&&e.ctrlKey&&(n.button=2),n.down=!1,n.up=!1,n.clickCount=1,n.delta=0,n.handled=!1,n.bubbles=!1,n.timestamp=e.timeStamp,n.isMultiTouch=!1,n.targetDiagram=dr(e),n.targetObject=null,n}function dr(t){var e=t.target.C;if(!e){var i=t.path;i||"function"!==typeof t.composedPath||(i=t.composedPath()),i&&i[0]&&(e=i[0].C)}return e||null}function pr(t,e,i,n){var o=yr(t,e,!0,!1,!0,n);return vr(t,i,o),o.targetDiagram=dr(e),o.targetObject=null,n||o.clone(t.Wf),o}function gr(t,e,i,n){if(n=yr(t,e,!1,!1,!1,n),null!==i){var o=y.document.elementFromPoint(i.clientX,i.clientY);null!==o&&void 0!==o.shadowRoot&&null!==o.shadowRoot&&(o=o.shadowRoot.elementFromPoint(i.clientX,i.clientY)),o&&o.C?(e=i,i=o.C):(e=void 0!==e.targetTouches?e.targetTouches[0]:e,i=t),n.targetDiagram=i,vr(t,e,n)}else null!==t.od?(n.documentPoint=t.od.documentPoint,n.viewPoint=t.od.viewPoint,n.targetDiagram=t.od.targetDiagram):null!==t.Wf&&(n.documentPoint=t.Wf.documentPoint,n.viewPoint=t.Wf.viewPoint,n.targetDiagram=t.Wf.targetDiagram);return n.targetObject=null,n}function yr(t,e,i,n,o,r){var s=t.od;t.od=t.hh,t.hh=s,s.diagram=t,s.clickCount=1;var a=s.delta=0;return e.ctrlKey&&(a+=1),e.altKey&&(a+=2),e.shiftKey&&(a+=4),e.metaKey&&(a+=8),s.modifiers=a,s.button=0,s.buttons=1,s.event=e,s.timestamp=e.timeStamp,t.zj&&e instanceof y.PointerEvent&&"touch"!==e.pointerType&&(s.button=e.button,void 0===e.buttons||R||(s.buttons=e.buttons),Y&&0===e.button&&e.ctrlKey&&(s.button=2)),s.down=i,s.up=n,s.handled=!1,s.bubbles=o,s.isMultiTouch=r,s}function mr(t,e){return!!t.bubbles||(void 0!==e.stopPropagation&&e.stopPropagation(),!1!==e.cancelable&&e.preventDefault(),e.cancelBubble=!0,!1)}function vr(t,e,i){var n=t.wa,o=t.ya,r=t.xa,s=0,a=0;null!==n&&(n=n.getBoundingClientRect(),s=e.clientX-o/n.width*n.left,a=e.clientY-r/n.height*n.top),i.viewPoint.h(s,a),null!==t.sb?(e=pt.allocAt(s,a),t.sb.Jd(e),i.documentPoint.assign(e),pt.free(e)):i.documentPoint.h(s,a)}function xr(t,e,i,n){if(void 0!==e.targetTouches){if(2>e.targetTouches.length)return;e=e.targetTouches[i]}else{if(null===t.bk[0])return;e=t.bk[i]}i=t.wa,null!==i&&(i=i.getBoundingClientRect(),n.h(e.clientX-t.ya/i.width*i.left,e.clientY-t.xa/i.height*i.top))}function br(t){t.ac||Sr(t),t.Ta()}function wr(t,e,i){t.animationManager.defaultAnimation.isAnimating||t.Sb||!t.wi||Dr(t)||(e&&Sr(t),i&&rr(t,!1))}function kr(t,e){if(!t.ac&&(t.Ee=!1,null!==t.Fa||t.sm.s())){t.ac=!0;var i=t.animationManager,n=t.Wl;if(!i.isAnimating&&0!==n.length){for(var o=n.j,r=o.length,s=0;s<r;s++){var a=o[s];ja(a,!1),a.o()}n.clear()}n=t.Tu,0<n.count&&(n.each((function(t){t.Vw()})),n.clear()),o=n=!1,i.defaultAnimation.isAnimating&&(o=!0,n=t.skipsUndoManager,t.skipsUndoManager=!0),i.sc||Qo(t),wr(t,!1,!0),null!==t.Ib&&(t.Ib.visible&&!t.po&&(qr(t),t.po=!0),!t.Ib.visible&&t.po&&(t.po=!1)),Sr(t),r=!1,t.qe&&!t.Ng||(t.qe?Qr(t,!t.Hj):(t.va("Initial Layout"),!1===i.isEnabled&&i.Bc(),Qr(t,!1)),r=!0),t.Hj=!1,Sr(t),t.gt||br(t),wr(t,!0,!1),s=!1,r?(i=zt.alloc(),i.assign(t.viewportBounds),t.qe||(s=t.qe=!0,t.skipsUndoManager||(t.undoManager.isPendingClear=!0),t.undoManager.isPendingUnmodified=!0,Mr(t)),t.R("LayoutCompleted"),i.w(t.viewportBounds)||wr(t,!0,!1),zt.free(i)):i.zl&&i.Qx&&(t.Yf!==xs?t.scale=sr(t,t.Yf):t.Og!==xs?t.scale=sr(t,t.Og):(i=t.initialScale,isFinite(i)&&0<i&&(t.scale=i)),rr(t,!0)),Sr(t),r&&s&&t.Xa("Initial Layout"),t.Hv(),e||t.mc(t.Gb),o&&(t.skipsUndoManager=n),t.ac=!1}}function Mr(t){var e=t.Aa;if(t.Yf!==xs)t.scale=sr(t,t.Yf);else if(t.Og!==xs)t.scale=sr(t,t.Og);else{var i=t.initialScale;isFinite(i)&&0<i&&(t.scale=i)}t.Aa!==e&&(Ar(t),wr(t,!0,!1)),rr(t,!0),e=t.Ma.j,t.Nd(e,e.length,t),t.R("InitialLayoutCompleted"),t.Ts.assign(t.la),qr(t)}function Sr(t){if((t.ac||!t.animationManager.isTicking)&&0!==t.wd.count){for(var e=0;23>e;e++){var i=t.wd.iterator;if(null===i||0===t.wd.count)break;t.wd=new nt,t.Vw(i,t.wd)}t.nodes.each((function(t){t instanceof bc&&0!==(65536&t.P)!==!1&&(t.P=65536^t.P)}))}}function Pr(t,e){for(var i=j(),n=j(),o=e.memberParts;o.next();){var r=o.value;r.isVisible()&&(r instanceof bc?(La(r)||Oa(r)||Yu(r))&&Pr(t,r):r instanceof Nc?r.fromNode===e||r.toNode===e?n.push(r):i.push(r):(r.measure(1/0,1/0),r.arrange()))}for(t=i.length,o=0;o<t;o++)r=i[o],r.measure(1/0,1/0),r.arrange();for(O(i),e.measure(1/0,1/0),e.arrange(),t=n.length,e=0;e<t;e++)i=n[e],i.measure(1/0,1/0),i.arrange();O(n)}function Nr(t,e,i,n,o,r,s,a,h,l){if(null!==t.Fa){null===t.wa&&w("No canvas specified"),void 0===s&&(s=null),void 0===a&&(a=null),void 0===h&&(h=!1),void 0===l&&(l=!1),jr(t),t.Gb.uc(!0),Lr(t),t.yi=!0;var u=t.Aa;t.Aa=o;var c=t.Ma.j,f=c.length;try{var d=new zt(r.x,r.y,n.width/o,n.height/o),p=d.copy();p.uq(i),qr(t,p),Sr(t),t.Nd(c,f,t,d),e.setTransform(1,0,0,1,0,0),e.clearRect(0,0,n.width,n.height),null!==a&&""!==a&&(e.fillStyle=a,e.fillRect(0,0,n.width,n.height));var g=t.Tb;e.scale(g,g);var y=Ke.alloc();y.reset(),y.translate(i.left,i.top),y.scale(o),0===r.x&&0===r.y||y.translate(-r.x,-r.y),e.setTransform(y.m11,y.m12,y.m21,y.m22,y.dx,y.dy),Ke.free(y),Cr(t,e),e.globalAlpha=t.hb;var m=t.xk("Grid");if(s){var v=new nt,x=s.iterator;for(x.reset();x.next();){var b=x.value;b instanceof Lu&&(l||b.layer!==m)&&v.add(b)}for(l=0;l<f;l++){var k=c[l];m=e;var M=t;if(k.visible&&0!==k.hb&&(h||!k.isTemporary)){var S=k.Ea.j,P=S.length;if(0!==P){var N=Xo(k,m),C=k.rp;C.length=0;var T=M.scale,A=zt.alloc();for(i=0;i<P;i++){var L=S[i];v.contains(L)&&k.dj(m,L,M,C,T,A,!1)}zt.free(A),m.globalAlpha=N}}}}else for(v=0;v<f;v++)M=c[v],M===m?l&&M.mc(e,t,!0):M.mc(e,t,h);t.yi=!1,t.ui&&Vs(t.ui,t)&&t.Tr()}finally{t.Aa=u,t.Gb.uc(!0),Lr(t),t.Nd(c,f,t),qr(t)}}}function Cr(t,e){t=t.hf,null!==t&&(void 0!==t.imageSmoothingEnabled&&e.Sy(!!t.imageSmoothingEnabled),t=t.defaultFont,void 0!==t&&null!==t&&(e.font=t))}function Tr(t,e){var i,n=t instanceof Uh,o=t instanceof Ko;for(i in e){""===i&&w("Setting properties requires non-empty property names");var r=t,s=i;if(n||o){var a=i.indexOf(".");if(0<a){var h=i.substring(0,a);n?r=t.bb(h):(r=t[h],(void 0===r||null===r)&&(r=t.toolManager[h])),N(r)?s=i.substr(a+1):w("Unable to find object named: "+h+" in "+t.toString()+" when trying to set property: "+i)}}if("_"!==s[0]&&!B(r,s)){if(o&&"ModelChanged"===s){t.Wx(e[s]);continue}if(o&&"Changed"===s){t.Hh(e[s]);continue}if(o&&B(t.toolManager,s))r=t.toolManager;else{if(o&&is(t,s)){t.kk(s,e[s]);continue}if(t instanceof Bd&&"Changed"===s){t.Hh(e[s]);continue}w('Trying to set undefined property "'+s+'" on object: '+r.toString())}}r[s]=e[i],"_"===s[0]&&r instanceof ca&&r.Tx(s)}}function Ar(t){!1===t.wi&&(t.wi=!0)}function Lr(t){!1===t.xi&&(t.xi=!0)}function jr(t){!1!==t.El&&(t.El=!1,Or(t,t.ya,t.xa))}function Or(t,e,i){var n=t.Tb;t.wa.resize(e*n,i*n,e,i)&&(t.Dc=!0,t.Gb.uc(!0))}function Dr(t){var e=t.wa;if(null===e||t.sm.s())return!0;var i=t.Fa,n=t.ya,o=t.xa,r=t.viewportBounds.copy();if(!r.s())return!0;var s=!1,a=t.Ye?t.rb:0,h=t.pe?t.rb:0,l=i.clientWidth||n+a,u=i.clientHeight||o+h;if(l===n+a&&u===o+h||(t.Ye=!1,t.pe=!1,h=a=0,t.ya=l,t.xa=u,s=t.El=!0),!(s||t.Ye||t.pe||t.vl||t.wl))return!0;t.wi=!1;var c=t.viewportBounds,f=t.documentBounds,d=0,p=0,g=0,y=0;i=c.width;var m=c.height,v=t.Si;t.contentAlignment.kb()?(f.width>i&&(d=v.left,p=v.right),f.height>m&&(g=v.top,y=v.bottom)):(d=v.left,p=v.right,g=v.top,y=v.bottom),v=f.width+d+p;var x=f.height+g+y;d=f.x-d;var b=c.x;p=f.right+p;var w=c.right+a;g=f.y-g;var k=c.y;f=f.bottom+y,c=c.bottom+h;var M="1px",S="1px";if(y=t.scale,l=v>l/y,u=x>u/y,t.scrollMode===Ts&&(l||u)&&(l&&t.hasHorizontalScrollbar&&t.allowHorizontalScroll&&(l=1,d+1<b&&(l=Math.max((b-d)*y+t.ya,l)),p>w+1&&(l=Math.max((p-w)*y+t.ya,l)),i+a+1<v&&(l=Math.max((v-i)*y+t.ya,l)),M=l.toString()+"px"),u&&t.hasVerticalScrollbar&&t.allowVerticalScroll&&(l=1,g+1<k&&(l=Math.max((k-g)*y+t.xa,l)),f>c+1&&(l=Math.max((f-c)*y+t.xa,l)),m+h+1<x&&(l=Math.max((x-m)*y+t.xa,l)),S=l.toString()+"px")),l="1px"!==M,u="1px"!==S,l&&u||!l&&!u||(u&&(w-=t.rb),l&&(c-=t.rb),v<i+a||!t.hasHorizontalScrollbar||!t.allowHorizontalScroll||(a=1,d+1<b&&(a=Math.max((b-d)*y+t.ya,a)),p>w+1&&(a=Math.max((p-w)*y+t.ya,a)),i+1<v&&(a=Math.max((v-i)*y+t.ya,a)),M=a.toString()+"px"),l="1px"!==M,a=t.xa,l!==t.pe&&(a=l?t.xa-t.rb:t.xa+t.rb),x<m+h||!t.hasVerticalScrollbar||!t.allowVerticalScroll||(h=1,g+1<k&&(h=Math.max((k-g)*y+a,h)),f>c+1&&(h=Math.max((f-c)*y+a,h)),m+1<x&&(h=Math.max((x-m)*y+a,h)),S=h.toString()+"px"),u="1px"!==S),t.Op&&l===t.pe&&u===t.Ye)return n===t.ya&&o===t.xa||t.hd(),!1;if(l!==t.pe&&(t.xa="1px"===M?t.xa+t.rb:Math.max(t.xa-t.rb,1),s=!0),t.pe=l,t.Pp.style.width=M,u!==t.Ye&&(t.ya="1px"===S?t.ya+t.rb:Math.max(t.ya-t.rb,1),s=!0,t.Gl&&(h=pt.alloc(),u?(e.style.left=t.rb+"px",t.position=h.h(t.la.x+t.rb/t.scale,t.la.y)):(e.style.left="0px",t.position=h.h(t.la.x-t.rb/t.scale,t.la.y)),pt.free(h))),t.Ye=u,t.Pp.style.height=S,t.Vs=!0,s&&(t.El=!0),e=t.Ys,h=e.scrollLeft,t.hasHorizontalScrollbar&&t.allowHorizontalScroll&&(i+1<v?h=(t.position.x-d)*y:d+1<b?h=e.scrollWidth-e.clientWidth:p>w+1&&(h=t.position.x*y)),t.Gl)switch(t.Ss){case"negative":h=-(e.scrollWidth-h-e.clientWidth);break;case"reverse":h=e.scrollWidth-h-e.clientWidth}return e.scrollLeft=h,t.hasVerticalScrollbar&&t.allowVerticalScroll&&(m+1<x?e.scrollTop=(t.position.y-g)*y:g+1<k?e.scrollTop=e.scrollHeight-e.clientHeight:f>c+1&&(e.scrollTop=t.position.y*y)),l=t.ya,u=t.xa,e.style.width=l+(t.Ye?t.rb:0)+"px",e.style.height=u+(t.pe?t.rb:0)+"px",n===l&&o===u&&!t.animationManager.sc||(t.onViewportBoundsChanged(r,t.viewportBounds,y,s),!1)}function Fr(t,e,i){var n=e.layer;null!==n&&n.diagram===t&&(e.isSelected=!1,e.isHighlighted=!1,e.B(2),i&&e.uk(),i=n.Lc(-1,e,!1),0<=i&&t.Va(Ci,"parts",n,e,null,i,null),t=e.layerChanged,null!==t&&t(e,n,null))}function Br(t,e,i,n,o,r){if(!e.contains(i)&&(void 0===r&&(r=!1),!n||r||i.canMove()||i.canCopy()))if(void 0===o&&(o=Er(t)),i instanceof ec){if(e.add(i,t.Cd(o,i,i.location)),i instanceof bc&&(null!==i.placeholder||o.dragsMembers))for(r=i.memberParts;r.next();)Br(t,e,r.value,n,o,o.groupsAlwaysMove);for(r=i.linksConnected;r.next();){var s=r.value;if(!e.contains(s)){var a=s.fromNode,h=s.toNode;null!==a&&e.contains(a)&&null!==h&&e.contains(h)&&Br(t,e,s,n,o)}}if(o.dragsTree)for(i=i.Wv();i.next();)Br(t,e,i.value,n,o)}else if(i instanceof Nc)for(e.add(i,t.Cd(o,i)),i=i.labelNodes;i.next();)Br(t,e,i.value,n,o);else i instanceof Qu||e.add(i,t.Cd(o,i,i.location))}function Ir(t,e,i,n,o){if(null!==e&&0!==e.count){var r=pt.alloc(),s=pt.alloc();s.assign(i),isNaN(s.x)&&(s.x=0),isNaN(s.y)&&(s.y=0),(i=t.fq)||zr(t,e);for(var a=j(),h=j(),l=e.iterator,u=pt.alloc();l.next();){var c=l.key,f=l.value;if(c.Nc()){var d=Gr(t,c,e);null!==d?a.push(new ta(c,f,d)):o&&!c.canMove()||(d=f.point,r.assign(d),t.computeMove(c,r.add(s),n,u),c.location=u,void 0===f.shifted&&(f.shifted=new pt),f.shifted.assign(u.ge(d)))}else l.key instanceof Nc&&h.push(l.ka)}for(pt.free(u),o=a.length,l=0;l<o;l++)c=a[l],r.assign(c.info.point),void 0===c.$v.shifted&&(c.$v.shifted=new pt),c.node.location=r.add(c.$v.shifted);for(o=pt.alloc(),l=pt.alloc(),c=h.length,f=0;f<c;f++){var p=h[f];if(d=p.key,d instanceof Nc)if(d.suspendsRouting){d.jf=null,u=d.fromNode;var g=d.toNode;if(null!==t.draggedLink&&n.dragsLink)if(g=p.value.point,null===d.dragComputation)e.add(d,t.Cd(n,d,s)),Ac(d,s.x-g.x,s.y-g.y);else{p=pt.allocAt(0,0),(u=d.i(0))&&u.s()&&p.assign(u);var y=u=pt.alloc().assign(p).add(s);n.isGridSnapEnabled&&(n.isGridSnapRealtime||t.lastInput.up)&&(y=pt.alloc(),Rr(t,d,u,y,n)),u.assign(d.dragComputation(d,u,y)).ge(p),e.add(d,t.Cd(n,d,u)),Ac(d,u.x-g.x,u.y-g.y),pt.free(p),pt.free(u),y!==u&&pt.free(y)}else null!==u&&(o.assign(u.location),y=e.G(u),null!==y&&o.ge(y.point)),null!==g&&(l.assign(g.location),y=e.G(g),null!==y&&l.ge(y.point)),null!==u&&null!==g?o.Qa(l)?(u=p.value.point,g=r,g.assign(o),g.ge(u),e.add(d,t.Cd(n,d,o)),Ac(d,g.x,g.y)):(d.suspendsRouting=!1,d.Ua()):(p=p.value.point,u=null!==u?o:null!==g?l:s,e.add(d,t.Cd(n,d,u)),Ac(d,u.x-p.x,u.y-p.y))}else null!==d.fromNode&&null!==d.toNode||(u=p.value.point,e.add(d,t.Cd(n,d,s)),Ac(d,s.x-u.x,s.y-u.y))}pt.free(r),pt.free(s),pt.free(o),pt.free(l),O(a),O(h),i||(Sr(t),Vr(t,e))}}function Er(t){var e=t.toolManager.findTool("Dragging");return null!==e?e.dragOptions:t.kl}function Rr(t,e,i,n,o){if(void 0===o&&(o=Er(t)),n.assign(i),null!==e){var r=t.grid;e=o.gridSnapCellSize,t=e.width,e=e.height;var s=o.gridSnapOrigin,a=s.x;if(s=s.y,o=o.gridSnapCellSpot,null!==r){var h=r.gridCellSize;isNaN(t)&&(t=h.width),isNaN(e)&&(e=h.height),r=r.gridOrigin,isNaN(a)&&(a=r.x),isNaN(s)&&(s=r.y)}r=pt.allocAt(0,0),r.Uk(0,0,t,e,o),_e.Gq(i.x,i.y,a+r.x,s+r.y,t,e,n),pt.free(r)}}function zr(t,e){if(null!==e)for(t.fq=!0,t=e.iterator;t.next();)e=t.key,e instanceof Nc&&(e.suspendsRouting=!0)}function Vr(t,e){if(null!==e){for(e=e.iterator;e.next();){var i=e.key;i instanceof Nc&&(i.suspendsRouting=!1,Bc(i)&&i.Ua())}t.fq=!1}}function Gr(t,e,i){if(e=e.containingGroup,null!==e){if(t=Gr(t,e,i),null!==t)return t;if(t=i.G(e),null!==t)return t}return null}function Yr(t,e,i){if(null!==e.diagram&&e.diagram!==t&&w("Cannot share a Layer with another Diagram: "+e+" of "+e.diagram),null===i?null!==e.diagram&&w("Cannot add an existing Layer to this Diagram again: "+e):(i.diagram!==t&&w("Existing Layer must be in this Diagram: "+i+" not in "+i.diagram),e===i&&w("Cannot move a Layer before or after itself: "+e)),e.diagram!==t){e=e.name,t=t.Ma,i=t.count;for(var n=0;n<i;n++)t.J(n).name===e&&w("Cannot add Layer with the name '"+e+"'; a Layer with the same name is already present in this Diagram.")}}function Xr(t,e,i){var n=t.animationManager;if(t.Sb||t.ac)t.Aa=i,n.ef&&n.Rd.add(n.C,"scale",e,t.Aa);else if(null===t.wa)t.Aa=i;else{t.Sb=!0;var o=t.viewportBounds.copy(),r=t.ya,s=t.xa;o.width=t.ya/e,o.height=t.xa/e;var a=t.zoomPoint.x,h=t.zoomPoint.y,l=t.contentAlignment;isNaN(a)&&(l.Oc()?l.Ef(de)?a=0:l.Ef(pe)&&(a=r-1):a=l.kb()?l.x*(r-1):r/2),isNaN(h)&&(l.Oc()?l.Ef(fe)?h=0:l.Ef(ge)&&(h=s-1):h=l.kb()?l.y*(s-1):s/2),null===t.scaleComputation||t.animationManager.defaultAnimation.isAnimating||(i=t.scaleComputation(t,i)),i<t.minScale&&(i=t.minScale),i>t.maxScale&&(i=t.maxScale),r=pt.allocAt(t.la.x+a/e-a/i,t.la.y+h/e-h/i),t.position=r,pt.free(r),t.Aa=i,t.onViewportBoundsChanged(o,t.viewportBounds,e,!1),t.Sb=!1,rr(t,!1),n.ef&&n.Rd.add(n.C,"scale",e,t.Aa),t.M(),Ar(t)}}function qr(t,e){void 0===e&&(e=null);var i=t.Ib;if(null!==i&&i.visible){for(var n=Bt.alloc(),o=1,r=1,s=i.W.j,a=s.length,h=0;h<a;h++){var l=s[h],u=Math.abs(l.interval);2>u||(Wh(l.figure)?r=r*u/_e.uy(r,u):o=o*u/_e.uy(o,u))}if(s=i.gridCellSize,n.h(r*s.width,o*s.height),null!==e)o=e.width,r=e.height,t=e.x,s=e.y;else{if(e=zt.alloc(),t=t.viewportBounds,e.h(t.x,t.y,t.width,t.height),!e.s())return void zt.free(e);o=e.width,r=e.height,t=e.x,s=e.y,zt.free(e)}i.width=o+2*n.width,i.height=r+2*n.height,e=pt.alloc(),_e.Gq(t,s,0,0,n.width,n.height,e),e.offset(-n.width,-n.height),Bt.free(n),i.part.location=e,pt.free(e)}}function Ur(t){var e=t.isModified;t.zv!==e&&(t.zv=e,t.R("Modified"))}function Kr(t){return t=ds.get(t),null!==t?new t:new vd}function Hr(t,e){e=e.W.j;for(var i=e.length,n=0;n<i;n++)_r(t,e[n])}function _r(t,e){if(e instanceof cu){var i=e.element;if(null!==i&&i instanceof HTMLImageElement){i.Wg instanceof nt&&i.Wg.add(t);var n=e.Zg;if(null!==n&&!0===n.ls&&null!==e.diagram&&e.diagram.Wl.add(e),i.io)if(i=i.getAttribute("src"),n=t.pg.G(i),null===n)n=[],n.push(e),t.pg.add(i,n);else{for(t=0;t<n.length;t++)if(n[t]===e)return;n.push(e)}}}}function Wr(t,e){if(e instanceof cu){var i=e.element;if(null!==i&&i instanceof HTMLImageElement&&(i.Wg instanceof nt&&i.Wg.remove(t),pu(i),i.io)){i=i.getAttribute("src");var n=t.pg.G(i);if(null!==n)for(var o=0;o<n.length;o++)if(n[o]===e){n.splice(o,1),0===n.length&&(t.pg.remove(i),fu(i));break}}}}function $r(t,e){t.vi=!1;var i=t.Rn;i.w(e)||(e=e.H(),t.Rn=e,rr(t,!1),t.R("DocumentBoundsChanged",null,i.copy()),Ar(t))}function Jr(t,e){for(var i=t.Dh.iterator;i.next();)Zr(t,i.value,e);null!==t.layout&&(e?t.layout.isValidLayout=!1:t.layout.B())}function Zr(t,e,i){if(null!==e){for(var n=e.Sl.iterator;n.next();)Zr(t,n.value,i);null!==e.layout&&(i?e.layout.isValidLayout=!1:e.layout.B())}}function Qr(t,e){if(t.Ng&&!t.Nr){var i=t.Z;t.Z=!0;var n=t.undoManager.transactionLevel,o=t.layout,r=t.animationManager;try{0===n&&(t.undoManager.isInternalTransaction=!0,t.va("Layout")),1>=n&&!r.defaultAnimation.isAnimating&&!r.sc&&(e||uo(r,"Layout")),t.Ng=!1;for(var s=t.Dh.iterator;s.next();)ts(t,s.value,e,n);o.isValidLayout||(!e||o.isRealtime||null===o.isRealtime||0===n?(o.doLayout(t),Sr(t),o.isValidLayout=!0):t.Ng=!0)}finally{e=t.undoManager.isInternalTransaction,0===n&&(t.Xa("Layout"),t.undoManager.isInternalTransaction=!1),!e||0!==n&&1!==n||fo(r),t.Z=i}}}function ts(t,e,i,n){if(null!==e){for(var o=e.Sl.iterator;o.next();)ts(t,o.value,i,n);o=e.layout,null===o||o.isValidLayout||(!i||o.isRealtime||0===n?(e.Rh=!e.location.s(),o.doLayout(e),e.B(32),Pr(t,e),o.isValidLayout=!0):t.Ng=!0)}}function es(t){function e(t){var e=t.toLowerCase(),o=new et;i.add(t,o),i.add(e,o),n.add(t,t),n.add(e,t)}var i=new dt,n=new dt;e("InitialAnimationStarting"),e("AnimationStarting"),e("AnimationFinished"),e("BackgroundSingleClicked"),e("BackgroundDoubleClicked"),e("BackgroundContextClicked"),e("ClipboardChanged"),e("ClipboardPasted"),e("DocumentBoundsChanged"),e("ExternalObjectsDropped"),e("GainedFocus"),e("InitialLayoutCompleted"),e("LayoutCompleted"),e("LinkDrawn"),e("LinkRelinked"),e("LinkReshaped"),e("LostFocus"),e("Modified"),e("ObjectSingleClicked"),e("ObjectDoubleClicked"),e("ObjectContextClicked"),e("PartCreated"),e("PartResized"),e("PartRotated"),e("SelectionMoved"),e("SelectionCopied"),e("SelectionDeleting"),e("SelectionDeleted"),e("SelectionGrouped"),e("SelectionUngrouped"),e("ChangingSelection"),e("ChangedSelection"),e("SubGraphCollapsed"),e("SubGraphExpanded"),e("TextEdited"),e("TreeCollapsed"),e("TreeExpanded"),e("ViewportBoundsChanged"),e("InvalidateDraw"),t.Qr=i,t.Pr=n}function is(t,e){var i=t.Pr.G(e);return null!==i?i:t.Pr.G(e.toLowerCase())}function ns(t,e){var i=t.Qr.G(e);return null!==i?i:(i=t.Qr.G(e.toLowerCase()),null!==i?i:void w("Unknown DiagramEvent name: "+e))}function os(t){if(t.animationManager.isTicking)return!1;var e=t.currentTool;return e!==t.toolManager.findTool("Dragging")||(!t.fq||e.isComplexRoutingRealtime)}function rs(t,e,i,n){if(null===t.Gc&&(t.Gc=new bf),t.Gc.Rt||t.Gc.group!==i||t.Gc.Vy!==n){if(null!==i&&(i=ss(t,i)),null===i){e=t.computeOccupiedArea(),e.Jc(100,100),t.Gc.initialize(e),e=zt.alloc();for(var o=t.nodes;o.next();){var r=o.value,s=r.layer;null!==s&&s.visible&&!s.isTemporary&&as(t,r,n,e)}zt.free(e)}else{for(0<i.memberParts.count&&(e=t.computePartsBounds(i.memberParts,!1),e.Jc(20,20),t.Gc.initialize(e)),e=zt.alloc(),o=i.memberParts;o.next();)r=o.value,r instanceof ec&&as(t,r,n,e);zt.free(e)}t.Gc.group=i,t.Gc.Vy=n,t.Gc.Rt=!1}else e&&Mf(t.Gc);return t.Gc}function ss(t,e){return e.avoidable&&!e.isLinkLabel?e:null!==e.containingGroup?ss(t,e.containingGroup):null}function as(t,e,i,n){if(e!==i&&e.isVisible())if(e.avoidable&&!e.isLinkLabel){e=e.getAvoidableRect(n),t=t.Gc;var o=e.x,r=e.y;if(wf(t,o,r))for(i=(r-t.Bd)/t.gc|0,n=Math.min((o+e.width-t.Ad)/t.fc|0,t.Zi),e=Math.min((r+e.height-t.Bd)/t.gc|0,t.$i),o=(o-t.Ad)/t.fc|0;o<=n;o++)if(r=t.Rb[o],r.fill)r.fill(Af,i,e+1);else for(var s=i;s<=e;s++)r[s]=Af}else if(e instanceof bc)for(e=e.memberParts;e.next();)o=e.value,o instanceof ec&&as(t,o,i,n)}function hs(t,e){null!==t.Gc&&!t.Gc.Rt&&(void 0===e&&(e=null),null===e||e.avoidable&&!e.isLinkLabel)&&(t.Gc.Rt=!0)}function ls(t){-1===t.Bj&&(t.Bj=x((function(){if(-1!==t.Bj&&(t.Jf(),null!==t.lastInput.event)){var e=t.computeAutoScrollPosition(t.rn);e.Qa(t.position)||(t.position=e,t.lastInput.documentPoint=t.ou(t.rn),t.doMouseMove(),t.vi=!0,$r(t,t.documentBounds.copy().Rc(t.computeBounds())),t.Dc=!0,t.hd(),ls(t))}}),t.qn))}function us(t,e,i){function n(){var t=+new Date;for(r=!0,s.reset();s.next();)if(!s.value[0].Ol){r=!1;break}r||t-l>h?e(i,o,a):y.requestAnimationFrame(n)}for(var o=i.callback,r=!0,s=t.pg.iterator;s.next();)if(!s.value[0].Ol){r=!1;break}if("function"!==typeof o||r)return e(i,o,t);var a=t,h=i.callbackTimeout||300,l=+new Date;return y.requestAnimationFrame((function(){n()})),null}function cs(t,e,i,n){if(t.animationManager.Bc(),t.hd(),null===t.wa)return null;"object"!==typeof e&&w("properties argument must be an Object.");var o=e.size||null,r=e.scale||null;void 0!==e.scale&&isNaN(e.scale)&&(r="NaN");var s=e.maxSize;void 0===e.maxSize&&(s="SVG"===i?new Bt(1/0,1/0):new Bt(2e3,2e3));var a=e.position||null,h=e.parts||null,l=void 0===e.padding?1:e.padding,u=e.background||null,c=e.omitTemporary;void 0===c&&(c=!0);var f=e.document||document,d=e.elementFinished||null,p=e.showTemporary;void 0===p&&(p=!c),e=e.showGrid,void 0===e&&(e=p),null!==o&&isNaN(o.width)&&isNaN(o.height)&&(o=null),"number"===typeof l?l=new Qt(l):l instanceof Qt||w("MakeImage padding must be a Margin or a number."),l.left=Math.max(l.left,0),l.right=Math.max(l.right,0),l.top=Math.max(l.top,0),l.bottom=Math.max(l.bottom,0),t.Gb.uc(!0),c=new Ja(null,f);var g=c.context;if(!(o||r||h||a))return c.width=t.ya+Math.ceil(l.left+l.right),c.height=t.xa+Math.ceil(l.top+l.bottom),"SVG"===i?null===n?null:(n.resize(c.width,c.height,c.width,c.height),n.ownerDocument=f,n.Dq=d,Nr(t,n.context,l,new Bt(c.width,c.height),t.Aa,t.la,h,u,p,e),n.context):(t.rl=!1,Nr(t,g,l,new Bt(c.width,c.height),t.Aa,t.la,h,u,p,e),t.rl=!0,c.context);var y=t.Qn,m=t.documentBounds.copy();if(m.Jw(t.ib),p)for(var v=t.Ma.j,x=v.length,b=0;b<x;b++){var k=v[b];if(k.visible&&k.isTemporary){k=k.Ea.j;for(var M=k.length,S=0;S<M;S++){var P=k[S];P.isInDocumentBounds&&P.isVisible()&&(P=P.actualBounds,P.s()&&m.Rc(P))}}}if(v=new pt(m.x,m.y),null!==h){for(x=!0,b=h.iterator,b.reset();b.next();)if(k=b.value,k instanceof Lu&&(M=k.layer,(null===M||M.visible)&&(null===M||p||!M.isTemporary)&&k.isVisible()&&(k=k.actualBounds,k.s())))if(x){x=!1;var N=k.copy()}else N.Rc(k);x&&(N=new zt(0,0,0,0)),m.width=N.width,m.height=N.height,v.x=N.x,v.y=N.y}return null!==a&&a.s()&&(v=a,r||(r=y)),N=a=0,null!==l&&(a=l.left+l.right,N=l.top+l.bottom),x=b=0,null!==o&&(b=o.width,x=o.height,isFinite(b)&&(b=Math.max(0,b-a)),isFinite(x)&&(x=Math.max(0,x-N))),null!==o&&null!==r?("NaN"===r&&(r=y),o.s()?(o=b,m=x):isNaN(x)?(o=b,m=m.height*r):(o=m.width*r,m=x)):null!==o?o.s()?(r=Math.min(b/m.width,x/m.height),o=b,m=x):isNaN(x)?(r=b/m.width,o=b,m=m.height*r):(r=x/m.height,o=m.width*r,m=x):null!==r?"NaN"===r&&s.s()?(r=Math.min((s.width-a)/m.width,(s.height-N)/m.height),r>y?(r=y,o=m.width,m=m.height):(o=s.width,m=s.height)):(o=m.width*r,m=m.height*r):(r=y,o=m.width,m=m.height),null!==l?(o+=a,m+=N):l=new Qt(0),null!==s&&(y=s.width,s=s.height,isNaN(y)&&(y=2e3),isNaN(s)&&(s=2e3),isFinite(y)&&(o=Math.min(o,y)),isFinite(s)&&(m=Math.min(m,s))),c.width=Math.ceil(o),c.height=Math.ceil(m),"SVG"===i?null===n?null:(n.resize(c.width,c.height,c.width,c.height),n.ownerDocument=f,n.Dq=d,Nr(t,n.context,l,new Bt(Math.ceil(o),Math.ceil(m)),r,v,h,u,p,e),n.context):(t.rl=!1,Nr(t,g,l,new Bt(Math.ceil(o),Math.ceil(m)),r,v,h,u,p,e),t.rl=!0,c.context)}Eo.className="AnimationTrigger",Eo.Default=zo,Eo.Immediate=Vo,Eo.Bundled=Go,i=Yo.prototype,i.clear=function(){this.Ea.clear(),this.rp.length=0},i.ee=function(t){this.C=t},i.toString=function(t){void 0===t&&(t=0);var e='Layer "'+this.name+'"';if(0>=t)return e;for(var i=0,n=0,o=0,r=0,s=0,a=this.Ea.iterator;a.next();){var h=a.value;h instanceof bc?o++:h instanceof ec?n++:h instanceof Nc?r++:h instanceof Qu?s++:i++}if(a="",0<i&&(a+=i+" Parts "),0<n&&(a+=n+" Nodes "),0<o&&(a+=o+" Groups "),0<r&&(a+=r+" Links "),0<s&&(a+=s+" Adornments "),1<t)for(t=this.Ea.iterator;t.next();)i=t.value,a+="\n    "+i.toString(),n=i.data,null!==n&&st(n)&&(a+=" #"+st(n)),i instanceof ec?a+=" "+F(n):i instanceof Nc&&(a+=" "+F(i.fromNode)+" "+F(i.toNode));return e+" "+this.Ea.count+": "+a},i.Vb=function(t,e,i){if(void 0===e&&(e=null),void 0===i&&(i=null),!1===this.Pi)return null;var n=!1;null!==this.diagram&&this.diagram.viewportBounds.$(t)&&(n=!0);for(var o=pt.alloc(),r=this.Ea.j,s=r.length;s--;){var a=r[s];if((!0!==n||!1!==Uu(a))&&a.isVisible()&&(o.assign(t),vt(o,a.Fd),a=a.Vb(o,e,i),null!==a&&(null!==e&&(a=e(a)),null!==a&&(null===i||i(a)))))return pt.free(o),a}return pt.free(o),null},i.hj=function(t,e,i,n){if(void 0===e&&(e=null),void 0===i&&(i=null),n instanceof et||n instanceof nt||(n=new nt),!1===this.Pi)return n;var o=!1;null!==this.diagram&&this.diagram.viewportBounds.$(t)&&(o=!0);for(var r=pt.alloc(),s=this.Ea.j,a=s.length;a--;){var h=s[a];if((!0!==o||!1!==Uu(h))&&h.isVisible()){r.assign(t),vt(r,h.Fd);var l=h;h.hj(r,e,i,n)&&(null!==e&&(l=e(l)),null===l||null!==i&&!i(l)||n.add(l))}}return pt.free(r),n},i.zf=function(t,e,i,n,o){if(void 0===e&&(e=null),void 0===i&&(i=null),void 0===n&&(n=!1),o instanceof et||o instanceof nt||(o=new nt),!1===this.Pi)return o;var r=!1;null!==this.diagram&&this.diagram.viewportBounds.Ge(t)&&(r=!0);for(var s=this.Ea.j,a=s.length;a--;){var h=s[a];if((!0!==r||!1!==Uu(h))&&h.isVisible()){var l=h;h.zf(t,e,i,n,o)&&(null!==e&&(l=e(l)),null===l||null!==i&&!i(l)||o.add(l))}}return o},i.Vv=function(t,e,i,n,o,r,s){if(!1===this.Pi)return o;for(var a=this.Ea.j,h=a.length;h--;){var l=a[h];if((!0!==s||!1!==Uu(l))&&r(l)&&l.isVisible()){var u=l;l.zf(t,e,i,n,o)&&(null!==e&&(u=e(u)),null===u||null!==i&&!i(u)||o.add(u))}}return o},i.Eg=function(t,e,i,n,o,r){if(void 0===i&&(i=null),void 0===n&&(n=null),void 0===o&&(o=!0),!1!==o&&!0!==o&&((o instanceof et||o instanceof nt)&&(r=o),o=!0),r instanceof et||r instanceof nt||(r=new nt),!1===this.Pi)return r;var s=!1;null!==this.diagram&&this.diagram.viewportBounds.$(t)&&(s=!0);for(var a=pt.alloc(),h=pt.alloc(),l=this.Ea.j,u=l.length;u--;){var c=l[u];if((!0!==s||!1!==Uu(c))&&c.isVisible()){a.assign(t),vt(a,c.Fd),h.h(t.x+e,t.y),vt(h,c.Fd);var f=c;c.Eg(a,h,i,n,o,r)&&(null!==i&&(f=i(f)),null===f||null!==n&&!n(f)||r.add(f))}}return pt.free(a),pt.free(h),r},i.Nd=function(t,e){if(this.visible){var i=this.Ea.j,n=i.length;if(0!==n){t=j();for(var o=j(),r=0;r<n;r++){var s=i[r];if(s.zx=r,s instanceof Nc){if(!1===s.ud)continue}else if(s instanceof Qu&&null!==s.adornedPart)continue;Kt(s.actualBounds,e)?(s.Nd(!0),t.push(s)):(s.Nd(!1),null!==s.adornments&&0<s.adornments.count&&o.push(s))}for(e=0;e<t.length;e++)for(i=t[e],ju(i),i=i.adornments;i.next();)n=i.value,n.measure(1/0,1/0),n.arrange(),n.Nd(!0);for(e=0;e<o.length;e++)ju(o[e]);O(t),O(o)}}},i.mc=function(t,e,i){if(this.visible&&0!==this.hb&&(void 0===i&&(i=!0),i||!this.isTemporary)){i=this.Ea.j;var n=i.length;if(0!==n){var o=Xo(this,t),r=this.rp;r.length=0;for(var s=e.scale,a=zt.alloc(),h=0;h<n;h++)this.dj(t,i[h],e,r,s,a,!0);zt.free(a),t.globalAlpha=o}}},i.dj=function(t,e,i,n,o,r,s){if(!s||Uu(e)){if(null!==n&&e instanceof Nc&&(e.isOrthogonal&&n.push(e),!1===e.ud))return;for(s=!1,n=e.containingGroup;null!==n;)s?null!==n.Za&&r.Dy(n.Za):null!==n.Za&&(s=!0,r.assign(n.Za)),n=n.containingGroup;var a=e.actualBounds;if(n=!1,s&&e.isVisible()){if(!r.Mc(a))return;n=!r.Ge(a)}n&&(t.save(),t.beginPath(),t.rect(r.x,r.y,r.width,r.height),t.clip()),a.width*o>i.Xo||a.height*o>i.Xo?e.mc(t,i):(o=e.actualBounds,r=e.naturalBounds,0===o.width||0===o.height||isNaN(o.x)||isNaN(o.y)||!e.isVisible()||(i=e.transform,null!==e.areaBackground&&(va(e,t,e.areaBackground,!0,!0,r,o),t.fillRect(o.x,o.y,o.width,o.height)),null===e.areaBackground&&null===e.background&&(va(e,t,"rgba(0,0,0,0.3)",!0,!1,r,o),t.fillRect(o.x,o.y,o.width,o.height)),null!==e.background&&(t.transform(i.m11,i.m12,i.m21,i.m22,i.dx,i.dy),va(e,t,e.background,!0,!1,r,o),t.fillRect(0,0,r.width/2,r.height/2),i.Tt()||(e=1/(i.m11*i.m22-i.m12*i.m21),t.transform(i.m22*e,-i.m12*e,-i.m21*e,i.m11*e,e*(i.m21*i.dy-i.m22*i.dx),e*(i.m12*i.dx-i.m11*i.dy)))))),n&&(t.restore(),t.uc(!0))}},i.g=function(t,e,i,n,o){var r=this.diagram;null!==r&&r.Va(Pi,t,this,e,i,n,o)},i.oj=function(t,e,i){var n=this.Ea;if(e.Fi=this,t>=n.count)t=n.count;else if(n.J(t)===e)return-1;return n.wb(t,e),e.Mq(i),n=this.diagram,null!==n&&(i?n.M():n.oj(e)),qo(this,t,e),t},i.Lc=function(t,e,i){if(!i&&e.layer!==this&&null!==e.layer)return e.layer.Lc(t,e,i);var n=this.Ea;if(0>t||t>=n.length){if(t=n.indexOf(e),0>t)return-1}else if(n.J(t)!==e&&(t=n.indexOf(e),0>t))return-1;return e.Nq(i),n.cb(t),n=this.diagram,null!==n&&(i?n.M():n.Lc(e)),e.Fi=null,t},d.Object.defineProperties(Yo.prototype,{parts:{get:function(){return this.Ea.iterator}},partsBackwards:{get:function(){return this.Ea.iteratorBackwards}},diagram:{get:function(){return this.C}},name:{get:function(){return this.oa},set:function(t){var e=this.oa;if(e!==t){var i=this.diagram;if(null!==i)for(""===e&&w("Cannot rename default Layer to: "+t),i=i.layers;i.next();)i.value.name===t&&w("Layer.name is already present in this diagram: "+t);for(this.oa=t,this.g("name",e,t),t=this.Ea.iterator;t.next();)t.value.layerName=this.oa}}},opacity:{get:function(){return this.hb},set:function(t){var e=this.hb;e!==t&&((0>t||1<t)&&M(t,"0 <= value <= 1",Yo,"opacity"),this.hb=t,this.g("opacity",e,t),t=this.diagram,null!==t&&t.M())}},isTemporary:{get:function(){return this.u},set:function(t){var e=this.u;e!==t&&(this.u=t,this.isInDocumentBounds=!1,this.g("isTemporary",e,t))}},visible:{get:function(){return this.I},set:function(t){var e=this.I;if(e!==t){for(this.I=t,this.g("visible",e,t),e=this.Ea.iterator;e.next();)e.value.Ob(t);t=this.diagram,null!==t&&t.M()}}},pickable:{get:function(){return this.Pi},set:function(t){var e=this.Pi;e!==t&&(this.Pi=t,this.g("pickable",e,t))}},isInDocumentBounds:{get:function(){return this.l},set:function(t){this.l!==t&&(this.l=t,null!==this.diagram&&this.diagram.Na())}},allowCopy:{get:function(){return this.$h},set:function(t){var e=this.$h;e!==t&&(this.$h=t,this.g("allowCopy",e,t))}},allowDelete:{get:function(){return this.ai},set:function(t){var e=this.ai;e!==t&&(this.ai=t,this.g("allowDelete",e,t))}},allowTextEdit:{get:function(){return this.ji},set:function(t){var e=this.ji;e!==t&&(this.ji=t,this.g("allowTextEdit",e,t))}},allowGroup:{get:function(){return this.bi},set:function(t){var e=this.bi;e!==t&&(this.bi=t,this.g("allowGroup",e,t))}},allowUngroup:{get:function(){return this.ki},set:function(t){var e=this.ki;e!==t&&(this.ki=t,this.g("allowUngroup",e,t))}},allowLink:{get:function(){return this.ci},set:function(t){var e=this.ci;e!==t&&(this.ci=t,this.g("allowLink",e,t))}},allowRelink:{get:function(){return this.ei},set:function(t){var e=this.ei;e!==t&&(this.ei=t,this.g("allowRelink",e,t))}},allowMove:{get:function(){return this.di},set:function(t){var e=this.di;e!==t&&(this.di=t,this.g("allowMove",e,t))}},allowReshape:{get:function(){return this.fi},set:function(t){var e=this.fi;e!==t&&(this.fi=t,this.g("allowReshape",e,t))}},allowResize:{get:function(){return this.gi},set:function(t){var e=this.gi;e!==t&&(this.gi=t,this.g("allowResize",e,t))}},allowRotate:{get:function(){return this.hi},set:function(t){var e=this.hi;e!==t&&(this.hi=t,this.g("allowRotate",e,t))}},allowSelect:{get:function(){return this.ii},set:function(t){var e=this.ii;e!==t&&(this.ii=t,this.g("allowSelect",e,t))}}}),Yo.prototype.findObjectsNear=Yo.prototype.Eg,Yo.prototype.findObjectsIn=Yo.prototype.zf,Yo.prototype.findObjectsAt=Yo.prototype.hj,Yo.prototype.findObjectAt=Yo.prototype.Vb,Yo.className="Layer",Ko.prototype.clear=function(){this.animationManager.Bc(),this.model.clear(),ms=null,vs="",Ho(this,!1),this.Wl.clear(),fu(),this.pg.clear(),this.Na(),this.Ta(),this.M()},Ko.prototype.reset=function(){this.clear(),this.Sb=!0,this.Uc=new lo,this.Uc.ee(this),this.rb=17,this.Gl=this.pv=!1,this.Ss="default",this.Ma=new et,this.Kx=new dt,this.hf=null,this.xw(),this.Nj=null,this.ww(),this.hb=1,this.la=new pt(NaN,NaN).freeze(),this.Ts=new pt(NaN,NaN),this.Qn=this.Aa=1,this.es=new pt(NaN,NaN).freeze(),this.fs=NaN,this.xs=1e-4,this.vs=100,this.sb=new Ke,this.xt=new pt(NaN,NaN).freeze(),this.Zr=new zt(NaN,NaN,NaN,NaN).freeze(),this.Si=new Qt(0,0,0,0).freeze(),this.Ti=Ts,this.at=!1,this.Us=this.Ns=null,this.Og=xs,this.Dj=Ce,this.Yf=xs,this.to=Ce,this.gs=this.ds=ne,this.Dc=!0,this.El=!1,this.wd=new nt,this.Vg=new dt,this.rl=!0,this.qn=250,this.Bj=-1,this.sn=new Qt(16,16,16,16).freeze(),this.Hj=this.Ee=!1,this.Kj=!0,this.Wf=new wi,this.Wf.diagram=this,this.od=new wi,this.od.diagram=this,this.hh=new wi,this.hh.diagram=this,this.we=this.Of=null,this.hk=!1,this.Pr=this.Qr=null,this.zj=y.PointerEvent&&(z||V||G)&&y.navigator&&!1!==y.navigator.msPointerEnabled,es(this),this.Dh=new nt,this.qs=!0,this.rt=Ls,this.Uu=!1,this.tt=ks,this.Jr=this.Mr=this.pt=null,this.Pn=this.Hr="auto",this.gg=this.As=this.ig=this.jg=this.lg=this.Qf=this.Uf=this.Pf=null,this.cs=!1,this.Rf=this.wg=this.kg=this.hg=null,this.Bs=!1,this.Ls={},this.bk=[null,null],this.Br=null,this.Nr=this.gt=this.rv=this.vg=!1,this.av=!0,this.yi=this.ac=!1,this.zv=!0,this.Xd=-2,this.pg=new dt,this.Wl=new et,this.$f=!1,this.ai=this.$h=this.nr=this.md=!0,this.pr=!1,this.vr=this.tr=this.ii=this.hi=this.gi=this.fi=this.di=this.ei=this.ci=this.sr=this.ki=this.bi=this.ji=this.qr=!0,this.Zf=this.Xu=!1,this.ur=this.rr=this.wl=this.vl=!0,this.$s=this.Ws=16,this.Vs=this.Op=!1,this.Xs=this.Zs=0,this.ib=new Qt(5).freeze(),this.qv=(new nt).freeze(),this.ws=999999999,this.Su=(new nt).freeze(),this.xi=this.wi=this.vi=!0,this.Ye=this.pe=!1,this.kc=null,this.Ng=!0,this.qe=!1,this.Ax=new nt,this.Tu=new nt,this.Gc=null,this.Vl=1,this.sv=0,this.Ic={scale:1,position:new pt,bounds:new zt,Gv:new Bt,kw:new Bt,hw:!1},this.Rx=new zt(NaN,NaN,NaN,NaN).freeze(),this.sm=new Bt(NaN,NaN).freeze(),this.Rn=new zt(NaN,NaN,NaN,NaN).freeze(),this.rs=!1,this.Lo=this.qo=this.kp=this.Fu=this.Eu=this.Gu=this.bg=this.fh=this.df=null,Wo(this),this.Ib=null,this.po=!1,this.Ej=null,this.partManager=new vd,this.toolManager=new Di,this.toolManager.initializeStandardTools(),this.currentTool=this.defaultTool=this.toolManager,this.Sr=null,this.kl=new ea,this.Gs=this.Fs=null,this.fq=!1,this.commandHandler=_o(),this.vg=!0,tr(this),this.layout=new zf,this.vg=!1,this.model=op(),this.model.undoManager=new Ai,this.qe=!1,this.Kj=!0,this.Ee=!1,this.Tb=1,this.yh=null,this.Xo=1,this.cp=0,this.hv=[0,0,0,0,0],this.ep=0,this.xd=1,this.Sj=0,this.Go=new pt,this.qt=500,this.rn=new pt,this.gq=this.wo=this.re=!1,this.ao=null,this.bo=Dt,this.Sb=!1,this.M()},Ko.prototype.setRTL=function(t){t=void 0===t?this.div:t,null===t&&(t=y.document.body);var e=b("div");e.dir="rtl",e.style.cssText="font-size: 14px; width: 1px; height: 1px; position: absolute; top: -1000px; overflow: scroll;",e.textContent="A",t.appendChild(e);var i="reverse";0<e.scrollLeft?i="default":(e.scrollLeft=1,0===e.scrollLeft&&(i="negative")),t.removeChild(e),this.Ss=i},Ko.prototype.setScrollWidth=function(t){t=void 0===t?this.div:t,null===t&&(t=y.document.body);var e=0;if(ys){var i=gs;e=ps,null===i&&(i=gs=b("p"),i.style.width="100%",i.style.height="200px",i.style.boxSizing="content-box",e=ps=b("div"),e.style.position="absolute",e.style.visibility="hidden",e.style.width="200px",e.style.height="150px",e.style.boxSizing="content-box",e.appendChild(i)),e.style.overflow="hidden",t.appendChild(e);var n=i.offsetWidth;e.style.overflow="scroll",i=i.offsetWidth,n===i&&(i=e.clientWidth),t.removeChild(e),e=n-i,0!==e||X||(e=11)}this.rb=e,this.pv=!0},Ko.prototype.jb=function(t){t.classType===Ko&&(this.autoScale=t)},Ko.prototype.toString=function(t){void 0===t&&(t=0);var e="";if(this.div&&this.div.id&&(e=this.div.id),e='Diagram "'+e+'"',0>=t)return e;for(var i=this.Ma.iterator;i.next();)e+="\n  "+i.value.toString(t-1);return e},Ko.prototype.addEventListener=function(t,e,i,n){t.addEventListener(e,i,{capture:n,passive:!1})},Ko.prototype.removeEventListener=function(t,e,i,n){t.removeEventListener(e,i,{capture:n})},Ko.prototype.computePixelRatio=function(){return null!==this.yh?this.yh:y.devicePixelRatio||1},Ko.prototype.doMouseMove=function(){this.currentTool.doMouseMove()},Ko.prototype.doMouseDown=function(){this.currentTool.doMouseDown()},Ko.prototype.doMouseUp=function(){this.currentTool.doMouseUp()},Ko.prototype.doMouseWheel=function(){this.currentTool.doMouseWheel()},Ko.prototype.doKeyDown=function(){this.currentTool.doKeyDown()},Ko.prototype.doKeyUp=function(){this.currentTool.doKeyUp()},Ko.prototype.doFocus=function(){this.focus()},Ko.prototype.focus=function(){if(this.wa)if(this.scrollsPageOnFocus)this.wa.focus();else{var t=y.scrollX||y.pageXOffset,e=y.scrollY||y.pageYOffset;this.wa.focus(),y.scrollTo(t,e)}},Ko.prototype.Bz=function(){this.C.R("GainedFocus")},Ko.prototype.Az=function(){this.C.R("LostFocus")},Ko.prototype.iy=function(t){if(null!==this.wa){this.Op=!0;var e=this.documentBounds,i=this.viewportBounds,n=this.Si,o=e.x-n.left,r=e.y-n.top,s=e.width+n.left+n.right,a=e.height+n.top+n.bottom,h=e.right+n.right;n=e.bottom+n.bottom;var l=i.x;e=i.y;var u=i.width,c=i.height,f=i.right,d=i.bottom;i=this.scale;var p=t.scrollLeft;if(this.Gl)switch(this.Ss){case"negative":p=p+t.scrollWidth-t.clientWidth;break;case"reverse":p=t.scrollWidth-p-t.clientWidth}var g=p;u<s||c<a?(p=pt.allocAt(this.position.x,this.position.y),this.allowHorizontalScroll&&this.Xs!==g&&(p.x=g/i+o,this.Xs=g),this.allowVerticalScroll&&this.Zs!==t.scrollTop&&(p.y=t.scrollTop/i+r,this.Zs=t.scrollTop),this.position=p,pt.free(p),this.wi=this.Op=!1):(p=pt.alloc(),t.hz&&this.allowHorizontalScroll&&(o<l&&(this.position=p.h(g+o,this.position.y)),h>f&&(this.position=p.h(-(this.Ys.scrollWidth-this.ya)+g-this.ya/i+h,this.position.y))),t.iz&&this.allowVerticalScroll&&(r<e&&(this.position=p.h(this.position.x,t.scrollTop+r)),n>d&&(this.position=p.h(this.position.x,-(this.Ys.scrollHeight-this.xa)+t.scrollTop-this.xa/i+n))),pt.free(p),Lr(this),this.wi=this.Op=!1,e=this.documentBounds,i=this.viewportBounds,h=e.right,f=i.right,n=e.bottom,d=i.bottom,o=e.x,l=i.x,r=e.y,e=i.y,u>=s&&o>=l&&h<=f&&(this.Pp.style.width="1px"),c>=a&&r>=e&&n<=d&&(this.Pp.style.height="1px"))}},Ko.prototype.computeBounds=function(){return 0<this.wd.count&&Sr(this),or(this)},Ko.prototype.computePartsBounds=function(t,e){void 0===e&&(e=!1);var i=null;if(C(t))for(var n=0;n<t.length;n++){var o=t[n];!e&&o instanceof Nc||(o.Ta(),null===i?i=o.actualBounds.copy():i.Rc(o.actualBounds))}else for(t=t.iterator;t.next();)n=t.value,!e&&n instanceof Nc||(n.Ta(),null===i?i=n.actualBounds.copy():i.Rc(n.actualBounds));return null===i?new zt(NaN,NaN,0,0):i},Ko.prototype.zoomToFit=function(){var t=this.Ti;this.Ti=Ts,this.scale=sr(this,bs),t!==Ts&&(rr(this,!1),ar(this,this.documentBounds,this.ya/this.Aa,this.xa/this.Aa,this.Dj,!1)),this.Ti=t},i=Ko.prototype,i.mB=function(t,e){void 0===e&&(e=bs);var i=t.width,n=t.height;if(!(0===i||0===n||isNaN(i)&&isNaN(n))){var o=1;if(e===bs||e===ws)if(isNaN(i))o=this.viewportBounds.height*this.scale/n;else if(isNaN(n))o=this.viewportBounds.width*this.scale/i;else{o=this.ya;var r=this.xa;o=e===ws?r/n>o/i?(r-(this.pe?this.rb:0))/n:(o-(this.Ye?this.rb:0))/i:Math.min(r/n,o/i)}this.scale=o,this.position=new pt(t.x,t.y)}},i.uz=function(t,e){this.Ta();var i=this.documentBounds,n=this.viewportBounds;this.position=new pt(i.x+(t.x*i.width+t.offsetX)-(e.x*n.width-e.offsetX),i.y+(t.y*i.height+t.offsetY)-(e.y*n.height-e.offsetY))},i.kA=function(t){if(t instanceof ca){this.ao=t;var e=pt.alloc();this.bo=this.gr(t.da(ne,e)),pt.free(e)}else this.ao=null,this.bo=Dt},i.zm=function(t,e){if(void 0===e&&(e=!0),e){if(t=hr(this,t,(function(t){return t.part}),(function(t){return t.canSelect()})),t instanceof Lu)return t}else if(t=hr(this,t,(function(t){return t.part})),t instanceof Lu)return t;return null},i.Vb=function(t,e,i){void 0===e&&(e=null),void 0===i&&(i=null),Sr(this);for(var n=this.Ma.iteratorBackwards;n.next();){var o=n.value;if(o.visible&&(o=o.Vb(t,e,i),null!==o))return o}return null},i.Zz=function(t,e,i){return void 0===e&&(e=!0),lr(this,t,(function(t){return t.part}),e?function(t){return t instanceof Lu&&t.canSelect()}:null,i)},i.hj=function(t,e,i,n){void 0===e&&(e=null),void 0===i&&(i=null),n instanceof et||n instanceof nt||(n=new nt),Sr(this);for(var o=this.Ma.iteratorBackwards;o.next();){var r=o.value;r.visible&&r.hj(t,e,i,n)}return n},i.ty=function(t,e,i,n){return void 0===e&&(e=!1),void 0===i&&(i=!0),ur(this,t,(function(t){return t instanceof Lu&&(!i||t.canSelect())}),e,n)},i.zf=function(t,e,i,n,o){void 0===e&&(e=null),void 0===i&&(i=null),void 0===n&&(n=!1),o instanceof et||o instanceof nt||(o=new nt),Sr(this);for(var r=this.Ma.iteratorBackwards;r.next();){var s=r.value;s.visible&&s.zf(t,e,i,n,o)}return o},i.Vv=function(t,e,i,n,o,r){var s=new nt;Sr(this);for(var a=this.Ma.iteratorBackwards;a.next();){var h=a.value;h.visible&&h.Vv(t,e,i,n,s,o,r)}return s},i.$z=function(t,e,i,n,o){return void 0===i&&(i=!0),void 0===n&&(n=!0),cr(this,t,e,(function(t){return t instanceof Lu&&(!n||t.canSelect())}),i,o)},i.Eg=function(t,e,i,n,o,r){void 0===i&&(i=null),void 0===n&&(n=null),void 0===o&&(o=!0),!1!==o&&!0!==o&&((o instanceof et||o instanceof nt)&&(r=o),o=!0),r instanceof et||r instanceof nt||(r=new nt),Sr(this);for(var s=this.Ma.iteratorBackwards;s.next();){var a=s.value;a.visible&&a.Eg(t,e,i,n,o,r)}return r},Ko.prototype.acceptEvent=function(t){return fr(this,t,t instanceof MouseEvent)},Ko.prototype.BA=function(t){var e=this.C;if(!this.C.isEnabled)return!1;var i=fr(e,t,!1);switch(i.key=String.fromCharCode(t.which),i.down=!0,t.which){case 8:i.key="Backspace";break;case 33:i.key="PageUp";break;case 34:i.key="PageDown";break;case 35:i.key="End";break;case 36:i.key="Home";break;case 37:i.key="Left";break;case 38:i.key="Up";break;case 39:i.key="Right";break;case 40:i.key="Down";break;case 45:i.key="Insert";break;case 46:i.key="Del";break;case 48:i.key="0";break;case 187:case 61:case 107:i.key="Add";break;case 189:case 173:case 109:i.key="Subtract";break;case 27:i.key="Esc"}return e.doKeyDown(),mr(i,t)},Ko.prototype.CA=function(t){var e=this.C;if(!e.isEnabled)return!1;var i=fr(e,t,!1);switch(i.key=String.fromCharCode(t.which),i.up=!0,t.which){case 8:i.key="Backspace";break;case 33:i.key="PageUp";break;case 34:i.key="PageDown";break;case 35:i.key="End";break;case 36:i.key="Home";break;case 37:i.key="Left";break;case 38:i.key="Up";break;case 39:i.key="Right";break;case 40:i.key="Down";break;case 45:i.key="Insert";break;case 46:i.key="Del"}return e.doKeyUp(),mr(i,t)},Ko.prototype.Oz=function(t){var e=this.C;if(!e.isEnabled)return!1;var i=fr(e,t,!0);return null!==e.mouseEnter&&e.mouseEnter(i),mr(i,t)},Ko.prototype.Pz=function(t){var e=this.C;if(!e.isEnabled)return!1;var i=fr(e,t,!0);return null!==e.mouseLeave&&e.mouseLeave(i),mr(i,t)},Ko.prototype.getMouse=function(t){var e=this.wa;if(null===e)return new pt(0,0);var i=e.getBoundingClientRect();return e=t.clientX-this.ya/i.width*i.left,t=t.clientY-this.xa/i.height*i.top,null!==this.sb?vt(new pt(e,t),this.sb):new pt(e,t)},Ko.prototype.Na=function(){this.vi||(this.vi=!0,this.Db(!0))},Ko.prototype.redraw=function(){this.Sb||this.ac||(this.M(),Ar(this),Lr(this),this.Na(),this.hd())},i=Ko.prototype,i.AA=function(){return this.Ee},i.Jz=function(t){void 0===t&&(t=null);var e=this.animationManager,i=e.isEnabled;e.Bc(),e.isEnabled=!1,kr(this),this.qe=!1,this.Ts=new pt(NaN,NaN),e.isEnabled=i,this.ac=!0;var n=this;null!==t&&x((function(){n.ac=!1,uo(e,"Model"),t(n)}),1)},i.Db=function(t){if(void 0===t&&(t=!1),!0!==this.Ee&&!(this.Sb||!1===t&&this.ac)){this.Ee=!0;var e=this;y.requestAnimationFrame((function(){e.Ee&&e.hd()}))}},i.hd=function(){this.Kj&&!this.Ee||(this.Kj&&(this.Kj=!1),kr(this))},i.Vw=function(t,e){for(t.reset();t.next();){var i=t.value;!i.Nc()||i instanceof bc||(i.rj()?(i.measure(1/0,1/0),i.arrange()):e.add(i))}for(t.reset();t.next();)i=t.value,i instanceof bc&&i.isVisible()&&Pr(this,i);for(t.reset();t.next();)i=t.value,i instanceof Nc&&i.isVisible()&&(i.rj()?(i.measure(1/0,1/0),i.arrange()):e.add(i));for(t.reset();t.next();)i=t.value,i instanceof Qu&&i.isVisible()&&(i.rj()?(i.measure(1/0,1/0),i.arrange()):e.add(i))},i.Nd=function(t,e,i,n){if(this.xi||this.animationManager.isAnimating){void 0===n&&(n=i.viewportBounds);for(var o=0;o<e;o++)t[o].Nd(i,n)}},i.mc=function(t,e){if(void 0===e&&(e=null),null!==this.Fa){null===this.wa&&w("No canvas specified");var i=this.animationManager;if(!i.sc&&(!i.isAnimating||i.isTicking)){var n=new Date;if(jr(this),"0"!==this.Fa.style.opacity){var o=t!==this.Gb,r=this.Ma.j,s=r.length,a=this;if(this.Nd(r,s,a),o)t.uc(!0),Lr(this);else if(!this.Dc&&null===e&&!i.isAnimating)return;s=this.la;var h=this.Aa,l=Math.round(s.x*h)/h,u=Math.round(s.y*h)/h;for(i=this.sb,i.reset(),1!==h&&i.scale(h),0===s.x&&0===s.y||i.translate(-l,-u),h=this.Tb,t.setTransform(1,0,0,1,0,0),t.scale(h,h),t.clearRect(0,0,this.ya,this.xa),1!==this.hb&&(t.globalAlpha=this.hb),Cr(this,t),l=null!==e?function(i){var n=e;if(i.visible&&0!==i.hb){var o=i.Ea.j,r=o.length;if(0!==r){var s=Xo(i,t),h=i.rp;h.length=0;for(var l=a.scale,u=zt.alloc(),c=0;c<r;c++){var f=o[c];n.contains(f)||i.dj(t,f,a,h,l,u,!0)}zt.free(u),t.globalAlpha=s}}}:function(e){e.mc(t,a)},s=r.length,u=0;u<s;u++)t.setTransform(1,0,0,1,0,0),t.scale(h,h),t.transform(i.m11,i.m12,i.m21,i.m22,i.dx,i.dy),l(r[u]);if(r=!1,this.ui?Vs(this.ui,this)&&(r=this.Tr()):r=!0,r&&(Ke.prototype.Jd=Ke.prototype.Zx),o?(this.Gb.uc(!0),Lr(this)):this.Dc=this.xi=!1,r=+new Date-+n,o=W&&W.my,n=this.hv,o||null===this.yh){for(n[this.ep]=r,this.ep=(this.ep+1)%n.length,i=r=0;i<n.length;i++)r+=n[i];this.cp=r/n.length}if(1!==this.hb&&(t.globalAlpha=1),o)for(t.setTransform(1,0,0,1,0,0),o=0;o<n.length;o++)t.fillText(n[o].toString(),20,150+20*o)}}}},i.Ke=function(t){return this.hf[t]},i.Ty=function(t,e){"minDrawingLength"===t&&(this.Xo=e),this.hf[t]=e,this.redraw()},i.xw=function(){this.hf=new _,this.hf.drawShadows=!0,this.hf.textGreeking=!0,this.hf.viewportOptimizations=!(X||z||V),this.hf.temporaryPixelRatio=!0,this.hf.pictureRatioOptimization=!0,this.Xo=this.hf.minDrawingLength=1},i.Bm=function(t){return this.Nj[t]},i.aB=function(t,e){this.Nj[t]=e},i.ww=function(){this.Nj=new _,this.Nj.extraTouchArea=10,this.Nj.extraTouchThreshold=10,this.Nj.hasGestureZoom=!0},i.Fw=function(t){Tr(this,t)},i.Hv=function(){if(0===this.undoManager.transactionLevel&&0!==this.Vg.count){for(;0<this.Vg.count;){var t=this.Vg;for(this.Vg=new dt,t=t.iterator;t.next();){var e=t.key;e.Oq(t.value),e.dc()}}this.M()}},i.M=function(t){if(void 0===t&&(t=null),null===t)this.Dc=!0,this.Db();else{var e=this.viewportBounds;null!==t&&t.s()&&e.Mc(t)&&(this.Dc=!0,this.Db())}this.R("InvalidateDraw")},Ko.prototype.invalidateViewport=function(t,e){if(!0!==this.Dc){this.Dc=!0;var i=!0===this.Ke("temporaryPixelRatio");if(!0===this.Ke("viewportOptimizations")&&this.scrollMode!==As&&this.Si.fj(0,0,0,0)&&e.width===t.width&&e.height===t.height){var n=this.scale,o=Math.max(t.x,e.x),r=Math.max(t.y,e.y);if(n=zt.allocAt(o,r,Math.max(0,Math.min(t.x+t.width,e.x+e.width)-o)*n,Math.max(0,Math.min(t.y+t.height,e.y+e.height)-r)*n),!this.gq&&0<n.width&&0<n.height){if(!(this.ac||(this.Ee=!1,null===this.Fa||(this.ac=!0,this.Hv(),this.documentBounds.s()||$r(this,this.computeBounds()),o=this.wa,null===o||o instanceof qa)))){var s=this.Tb;r=this.ya*s;var a=this.xa*s,h=this.scale*s,l=Math.round(Math.round(e.x*h)-Math.round(t.x*h));e=Math.round(Math.round(e.y*h)-Math.round(t.y*h)),h=this.Ju,t=this.ux,h.width!==r&&(h.width=r),h.height!==a&&(h.height=a),t.clearRect(0,0,r,a),h=190*s;var u=70*s,c=Math.max(l,0),f=Math.max(e,0),d=Math.floor(r-c),p=Math.floor(a-f);t.drawImage(o.Ja,c,f,d,p,0,0,d,p),Vs(this.ui,this)&&t.clearRect(0,0,h,u),o=j(),t=j(),p=Math.abs(l),d=Math.abs(e);var g=0===c?0:r-p;c=pt.allocAt(g,0),p=pt.allocAt(p+g,a),t.push(new zt(Math.min(c.x,p.x),Math.min(c.y,p.y),Math.abs(c.x-p.x),Math.abs(c.y-p.y)));var y=this.sb;if(y.reset(),y.scale(s,s),1!==this.Aa&&y.scale(this.Aa),s=this.la,(0!==s.x||0!==s.y)&&isFinite(s.x)&&isFinite(s.y)&&y.translate(-s.x,-s.y),vt(c,y),vt(p,y),o.push(new zt(Math.min(c.x,p.x),Math.min(c.y,p.y),Math.abs(c.x-p.x),Math.abs(c.y-p.y))),g=0===f?0:a-d,c.h(0,g),p.h(r,d+g),t.push(new zt(Math.min(c.x,p.x),Math.min(c.y,p.y),Math.abs(c.x-p.x),Math.abs(c.y-p.y))),vt(c,y),vt(p,y),o.push(new zt(Math.min(c.x,p.x),Math.min(c.y,p.y),Math.abs(c.x-p.x),Math.abs(c.y-p.y))),Vs(this.ui,this)&&(r=0<l?0:-l,a=0<e?0:-e,c.h(r,a),p.h(h+r,u+a),t.push(new zt(Math.min(c.x,p.x),Math.min(c.y,p.y),Math.abs(c.x-p.x),Math.abs(c.y-p.y))),vt(c,y),vt(p,y),o.push(new zt(Math.min(c.x,p.x),Math.min(c.y,p.y),Math.abs(c.x-p.x),Math.abs(c.y-p.y)))),pt.free(c),pt.free(p),wr(this,!1,!0),null===this.Fa&&w("No div specified"),null===this.wa&&w("No canvas specified"),!this.animationManager.sc&&(r=this.Gb,this.Dc)){for(jr(this),a=this.Tb,r.setTransform(1,0,0,1,0,0),r.clearRect(0,0,this.ya*a,this.xa*a),r.drawImage(this.Ju.Ja,0<l?0:Math.round(-l),0<e?0:Math.round(-e)),l=this.la,s=this.Aa,h=Math.round(l.x*s)/s,u=Math.round(l.y*s)/s,e=this.sb,e.reset(),1!==s&&e.scale(s),0===l.x&&0===l.y||e.translate(-h,-u),r.save(),r.beginPath(),l=t.length,s=0;s<l;s++)h=t[s],0!==h.width&&0!==h.height&&r.rect(Math.floor(h.x),Math.floor(h.y),Math.ceil(h.width),Math.ceil(h.height));for(r.clip(),r.setTransform(1,0,0,1,0,0),r.scale(a,a),r.transform(e.m11,e.m12,e.m21,e.m22,e.dx,e.dy),e=this.Ma.j,l=e.length,this.Nd(e,l,this),Cr(this,r),r.globalAlpha=this.hb,a=0;a<l;a++)if(s=e[a],h=o,s.visible&&0!==s.hb){u=Xo(s,r),f=s.rp,f.length=0,c=this.scale,d=zt.alloc(),p=s.Ea.j,y=p.length,g=h.length;for(var m=0;m<y;m++){var v=p[m],x=Bu(v,v.actualBounds);t:{for(var b=2/c,k=4/c,M=0;M<g;M++){var S=h[M];if(0!==S.width&&0!==S.height&&x.cw(S.x-b,S.y-b,S.width+k,S.height+k)){x=!0;break t}}x=!1}x&&s.dj(r,v,this,f,c,d,!0)}zt.free(d),r.globalAlpha=u}r.restore(),r.uc(!0),this.ui&&Vs(this.ui,this)&&this.Tr(),this.Dc=this.xi=!1,this.Yq()}O(o),O(t),this.ac=!1}}else this.hd();zt.free(n),i&&(Jo(this),this.hd(),Zo(this,!0))}else i?(Jo(this),this.hd(),Zo(this,!0)):this.hd()}},i=Ko.prototype,i.add=function(t){var e=t.diagram;if(e!==this&&(null!==e&&w("Cannot add part "+t.toString()+" to "+this.toString()+". It is already a part of "+e.toString()),e=this.xk(t.layerName),null===e&&(e=this.xk("")),null===e&&w('Cannot add a Part when unable find a Layer named "'+t.layerName+'" and there is no default Layer'),t.layer!==e)){var i=e.oj(99999999,t,t.diagram===this);0<=i&&this.Va(Ni,"parts",e,null,t,null,i),e.isTemporary||this.Na(),t.B(1),i=t.layerChanged,null!==i&&i(t,null,e)}},i.oj=function(t){this.partManager.oj(t);var e=this;Jh(t,(function(t){Hr(e,t)})),(t instanceof Qu||t instanceof bc&&null!==t.placeholder)&&t.o(),null!==t.data&&Jh(t,(function(t){Md(e.partManager,t)})),!0!==Oa(t)&&!0!==Yu(t)||this.wd.add(t),Vu(t,!0,this),$u(t)?(t.actualBounds.s()&&this.M(Bu(t,t.actualBounds)),this.Na()):t.isVisible()&&t.actualBounds.s()&&this.M(Bu(t,t.actualBounds)),this.Db()},i.Lc=function(t){t.nk(),this.partManager.Lc(t);var e=this;null!==t.data&&Jh(t,(function(t){Sd(e.partManager,t,e)})),this.wd.remove(t),$u(t)?(t.actualBounds.s()&&this.M(Bu(t,t.actualBounds)),this.Na()):t.isVisible()&&t.actualBounds.s()&&this.M(Bu(t,t.actualBounds)),this.Db()},i.remove=function(t){Fr(this,t,!0)},i.gu=function(t,e){if(void 0===e&&(e=!1),C(t))for(var i=t.length,n=0;n<i;n++){var o=t[n];e&&!o.canDelete()||this.remove(o)}else for(i=new nt,i.addAll(t),t=i.iterator;t.next();)i=t.value,e&&!i.canDelete()||this.remove(i)},i.tk=function(t,e,i){return void 0===i&&(i=!1),this.partManager.tk(t,e,i)},Ko.prototype.moveParts=function(t,e,i,n){if(void 0===i&&(i=!1),void 0===n&&(n=Er(this)),null!==this.toolManager){var o=new dt;if(null!==t)if(C(t))for(var r=0;r<t.length;r++)Br(this,o,t[r],i,n);else for(t=t.iterator;t.next();)Br(this,o,t.value,i,n);else{for(t=this.parts;t.next();)Br(this,o,t.value,i,n);for(t=this.nodes;t.next();)Br(this,o,t.value,i,n);for(t=this.links;t.next();)Br(this,o,t.value,i,n)}Ir(this,o,e,n,i)}},Ko.prototype.computeMove=function(t,e,i,n){if(void 0===n&&(n=new pt),n.assign(e),null===t)return n;var o=e,r=i.isGridSnapEnabled;r&&(i.isGridSnapRealtime||this.lastInput.up)&&(o=pt.alloc(),Rr(this,t,e,o,i)),i=null!==t.dragComputation?t.dragComputation(t,e,o):o;var s=t.minLocation,a=s.x;isNaN(a)&&(a=r?Math.round(1e3*t.location.x)/1e3:t.location.x),s=s.y,isNaN(s)&&(s=r?Math.round(1e3*t.location.y)/1e3:t.location.y);var h=t.maxLocation,l=h.x;return isNaN(l)&&(l=r?Math.round(1e3*t.location.x)/1e3:t.location.x),h=h.y,isNaN(h)&&(h=r?Math.round(1e3*t.location.y)/1e3:t.location.y),n.h(Math.max(a,Math.min(i.x,l)),Math.max(s,Math.min(i.y,h))),o!==e&&pt.free(o),n},i=Ko.prototype,i.Cd=function(t,e,i){if(void 0===i)return new Ys(At);var n=t.isGridSnapEnabled;return t.groupsSnapMembers||null===e.containingGroup||(n=!1),new Ys(n?new pt(Math.round(1e3*i.x)/1e3,Math.round(1e3*i.y)/1e3):i.copy())},i.um=function(t){Yr(this,t,null),t.ee(this);var e=this.Ma,i=e.count-1;if(!t.isTemporary)for(;0<=i&&e.J(i).isTemporary;)i--;e.wb(i+1,t),null!==this.cc&&this.Va(Ni,"layers",this,null,t,null,i+1),this.M(),this.Na()},i.Ux=function(t,e){Yr(this,t,e),t.ee(this);var i=this.Ma,n=i.indexOf(t);0<=n&&(i.remove(t),null!==this.cc&&this.Va(Ci,"layers",this,t,null,n,null));var o,r=i.count;for(o=0;o<r;o++)if(i.J(o)===e){i.wb(o,t);break}null!==this.cc&&this.Va(Ni,"layers",this,null,t,null,o),this.M(),0>n&&this.Na()},i.nz=function(t,e){Yr(this,t,e),t.ee(this);var i=this.Ma,n=i.indexOf(t);0<=n&&(i.remove(t),null!==this.cc&&this.Va(Ci,"layers",this,t,null,n,null));var o,r=i.count;for(o=0;o<r;o++)if(i.J(o)===e){i.wb(o+1,t);break}null!==this.cc&&this.Va(Ni,"layers",this,null,t,null,o+1),this.M(),0>n&&this.Na()},i.TA=function(t){if(t.diagram!==this&&w("Cannot remove a Layer from another Diagram: "+t+" of "+t.diagram),""!==t.name){var e=this.Ma,i=e.indexOf(t);if(e.remove(t)){for(e=t.Ea.copy().iterator;e.next();){var n=e.value,o=n.layerName;o!==t.name?n.layerName=o:n.layerName=""}null!==this.cc&&this.Va(Ci,"layers",this,t,null,i,null),this.M(),this.Na()}}},i.xk=function(t){for(var e=this.layers;e.next();){var i=e.value;if(i.name===t)return i}return null},i.Wx=function(t){null===this.we&&(this.we=new et),this.we.add(t),this.model.Hh(t)},i.VA=function(t){null!==this.we&&(this.we.remove(t),0===this.we.count&&(this.we=null)),this.model.Tk(t)},i.Hh=function(t){null===this.Of&&(this.Of=new et),this.Of.add(t)},i.Tk=function(t){null!==this.Of&&(this.Of.remove(t),0===this.Of.count&&(this.Of=null))},i.zt=function(t){if(this.skipsUndoManager||this.model.skipsUndoManager||this.model.undoManager.aw(t),t.change!==Si&&(this.isModified=!0),null!==this.Of)for(var e=this.Of,i=e.length,n=0;n<i;n++)e.J(n)(t)},i.Va=function(t,e,i,n,o,r,s){void 0===r&&(r=null),void 0===s&&(s=null);var a=new Mi;a.diagram=this,a.change=t,a.propertyName=e,a.object=i,a.oldValue=n,a.oldParam=r,a.newValue=o,a.newParam=s,this.zt(a)},i.g=function(t,e,i,n,o){this.Va(Pi,t,this,e,i,n,o)},Ko.prototype.changeState=function(t,e){if(null!==t&&t.diagram===this){var i=this.skipsModelSourceBindings;try{this.skipsModelSourceBindings=!0;var n=t.change;if(n===Pi){var o=t.object;if(hp(o,t.propertyName,t.G(e)),o instanceof ca){var r=o.part;null!==r&&r.Lb()}this.isModified=!0}else if(n===Ni){var s=t.object,a=t.newParam,h=t.newValue;if(s instanceof Uh)if("number"===typeof a&&h instanceof ca){e?s.Lc(a):s.wb(a,h);var l=s.part;null!==l&&l.Lb()}else"number"===typeof a&&h instanceof wl&&(h.isRow?al(s,a,e?void 0:h):hl(s,a,e?void 0:h));else if(s instanceof Yo){var u=!0===t.oldParam;"number"===typeof a&&h instanceof Lu&&(e?(h.isSelected=!1,h.isHighlighted=!1,h.Lb(),s.Lc(u?a:-1,h,u)):s.oj(a,h,u))}else s instanceof Ko?"number"===typeof a&&h instanceof Yo&&(e?this.Ma.cb(a):(h.ee(this),this.Ma.wb(a,h))):w("unknown ChangedEvent.Insert object: "+t.toString());this.isModified=!0}else if(n===Ci){var c=t.object,f=t.oldParam,d=t.oldValue;if(c instanceof Uh)"number"===typeof f&&d instanceof ca?e?c.wb(f,d):c.Lc(f):"number"===typeof f&&d instanceof wl&&(d.isRow?al(c,f,e?d:void 0):hl(c,f,e?d:void 0));else if(c instanceof Yo){var p=!0===t.newParam;"number"===typeof f&&d instanceof Lu&&(e?0>c.Ea.indexOf(d)&&c.oj(f,d,p):(d.isSelected=!1,d.isHighlighted=!1,d.Lb(),c.Lc(p?f:-1,d,p)))}else c instanceof Ko?"number"===typeof f&&d instanceof Yo&&(e?(d.ee(this),this.Ma.wb(f,d)):this.Ma.cb(f)):w("unknown ChangedEvent.Remove object: "+t.toString());this.isModified=!0}else n!==Si&&w("unknown ChangedEvent: "+t.toString())}finally{this.skipsModelSourceBindings=i}}},Ko.prototype.va=function(t){return this.undoManager.va(t)},Ko.prototype.Xa=function(t){return this.undoManager.Xa(t)},Ko.prototype.If=function(){return this.undoManager.If()},Ko.prototype.commit=function(t,e){void 0===e&&(e="");var i=this.skipsUndoManager;null===e&&(this.skipsUndoManager=!0,e=""),this.undoManager.va(e);var n=!1;try{t(this),n=!0}finally{n?this.undoManager.Xa(e):this.undoManager.If(),this.skipsUndoManager=i}},Ko.prototype.updateAllTargetBindings=function(t){this.partManager.updateAllTargetBindings(t)},Ko.prototype.ir=function(){this.partManager.ir()},Ko.prototype.onViewportBoundsChanged=function(t,e,i,n){if(!t.w(e)){void 0===n&&(n=!1),n||Ar(this),Lr(this);var o=this.layout;null===o||!o.isViewportSized||this.autoScale!==xs||n||t.width===e.width&&t.height===e.height||o.B(),o=this.currentTool,!0===this.Zf&&o instanceof Di&&(this.lastInput.documentPoint=this.ou(this.lastInput.viewPoint),Fi(o,this)),this.Sb||this.invalidateViewport(t,e),qr(this),this.Ic.scale=i,this.Ic.position.x=t.x,this.Ic.position.y=t.y,this.Ic.bounds.assign(t),this.Ic.Gv.width=Math.round(t.width*i),this.Ic.Gv.height=Math.round(t.height*i),this.Ic.kw.width=this.ya,this.Ic.kw.height=this.xa,this.Ic.hw=n,this.R("ViewportBoundsChanged",this.Ic,t),this.isVirtualized&&this.links.each((function(t){t.isAvoiding&&t.actualBounds.Mc(e)&&t.Ua()}))}},Ko.prototype.clearSelection=function(t){void 0===t&&(t=!1);var e=this.selection;if(0!==e.count){t||this.R("ChangingSelection",e);for(var i=e.ma(),n=i.length,o=0;o<n;o++)i[o].isSelected=!1;e.ea(),e.clear(),e.freeze(),t||this.R("ChangedSelection",e)}},Ko.prototype.select=function(t){null!==t&&t.layer.diagram===this&&(!t.isSelected||1<this.selection.count)&&(this.R("ChangingSelection",this.selection),this.clearSelection(!0),t.isSelected=!0,this.R("ChangedSelection",this.selection))},Ko.prototype.$A=function(t){if(this.R("ChangingSelection",this.selection),this.clearSelection(!0),C(t))for(var e=t.length,i=0;i<e;i++){var n=t[i];n instanceof Lu||w("Diagram.selectCollection given something that is not a Part: "+n),n.isSelected=!0}else for(t=t.iterator;t.next();)e=t.value,e instanceof Lu||w("Diagram.selectCollection given something that is not a Part: "+e),e.isSelected=!0;this.R("ChangedSelection",this.selection)},Ko.prototype.clearHighlighteds=function(){var t=this.highlighteds;if(0<t.count){for(var e=t.ma(),i=e.length,n=0;n<i;n++)e[n].isHighlighted=!1;t.ea(),t.clear(),t.freeze()}},i=Ko.prototype,i.uA=function(t){null!==t&&t.layer.diagram===this&&(!t.isHighlighted||1<this.highlighteds.count)&&(this.clearHighlighteds(),t.isHighlighted=!0)},i.vA=function(t){t=(new nt).addAll(t);for(var e=this.highlighteds.copy().Zq(t).iterator;e.next();)e.value.isHighlighted=!1;for(t=t.iterator;t.next();)e=t.value,e instanceof Lu||w("Diagram.highlightCollection given something that is not a Part: "+e),e.isHighlighted=!0},i.scroll=function(t,e,i){void 0===i&&(i=1);var n="up"===e||"down"===e,o=0;if("pixel"===t)o=i;else if("line"===t)o=i*(n?this.scrollVerticalLineChange:this.scrollHorizontalLineChange);else if("page"===t)t=n?this.viewportBounds.height:this.viewportBounds.width,t*=this.scale,0!==t&&(o=i*Math.max(t-(n?this.scrollVerticalLineChange:this.scrollHorizontalLineChange),0));else{if("document"===t)return o=this.documentBounds,i=this.viewportBounds,n=pt.alloc(),"up"===e?this.position=n.h(i.x,o.y):"left"===e?this.position=n.h(o.x,i.y):"down"===e?this.position=n.h(i.x,o.bottom-i.height):"right"===e&&(this.position=n.h(o.right-i.width,i.y)),void pt.free(n);w("scrolling unit must be 'pixel', 'line', 'page', or 'document', not: "+t)}o/=this.scale,i=this.position.copy(),"up"===e?i.y=this.position.y-o:"down"===e?i.y=this.position.y+o:"left"===e?i.x=this.position.x-o:"right"===e?i.x=this.position.x+o:w("scrolling direction must be 'up', 'down', 'left', or 'right', not: "+e),this.position=i},i.Aw=function(t){var e=this.viewportBounds;e.Ge(t)||(t=t.center,t.x-=e.width/2,t.y-=e.height/2,this.position=t)},i.At=function(t){var e=this.viewportBounds;t=t.center,t.x-=e.width/2,t.y-=e.height/2,this.position=t},i.gr=function(t){var e=this.sb;e.reset(),1!==this.Aa&&e.scale(this.Aa);var i=this.la;return(0!==i.x||0!==i.y)&&isFinite(i.x)&&isFinite(i.y)&&e.translate(-i.x,-i.y),t.copy().transform(this.sb)},i.iB=function(t){var e=this.sb,i=t.x,n=t.y,o=i+t.width,r=n+t.height,s=e.m11,a=e.m12,h=e.m21,l=e.m22,u=e.dx,c=e.dy,f=i*s+n*h+u;e=i*a+n*l+c;var d=o*s+n*h+u;return t=o*a+n*l+c,n=i*s+r*h+u,i=i*a+r*l+c,s=o*s+r*h+u,o=o*a+r*l+c,r=Math.min(f,d),f=Math.max(f,d),d=Math.min(e,t),e=Math.max(e,t),r=Math.min(r,n),f=Math.max(f,n),d=Math.min(d,i),e=Math.max(e,i),r=Math.min(r,s),f=Math.max(f,s),d=Math.min(d,o),e=Math.max(e,o),new zt(r,d,f-r,e-d)},i.ou=function(t){var e=this.sb;e.reset(),1!==this.Aa&&e.scale(this.Aa);var i=this.la;return(0!==i.x||0!==i.y)&&isFinite(i.x)&&isFinite(i.y)&&e.translate(-i.x,-i.y),vt(t.copy(),this.sb)},Ko.prototype.doModelChanged=function(t){var e=this;if(t.model===this.model){var i=t.change,n=t.propertyName;if(i===Si&&"S"===n[0])if("StartingFirstTransaction"===n){var o=this;t=this.toolManager,t.mouseDownTools.each((function(t){t.diagram=o})),t.mouseMoveTools.each((function(t){t.diagram=o})),t.mouseUpTools.each((function(t){t.diagram=o})),this.ac||this.qe||(this.Hj=!0,this.Kj&&(this.Ee=!0))}else"StartingUndo"===n||"StartingRedo"===n?(t=this.animationManager,t.defaultAnimation.isAnimating&&!this.skipsUndoManager&&t.Bc(),this.R("ChangingSelection",this.selection)):"StartedTransaction"===n&&(t=this.animationManager,t.defaultAnimation.isAnimating&&!this.skipsUndoManager&&t.Bc());else if(this.Z){this.Z=!1;try{if(""===t.modelChange&&i===Si){"FinishedUndo"!==n&&"FinishedRedo"!==n||(this.R("ChangedSelection",this.selection),Sr(this));var r=this.animationManager;"RolledBackTransaction"===n&&r.Bc(),this.Hj=!0,this.hd(),0!==this.undoManager.transactionLevel&&1!==this.undoManager.transactionLevel||fo(r),"CommittedTransaction"===n&&this.undoManager.isJustDiscarded&&(this.Xd=Math.min(this.Xd,this.undoManager.historyIndex-1)),"CommittedTransaction"!==n&&"RolledBackTransaction"!==n||!this.undoManager.isPendingUnmodified||setTimeout((function(){e.isModified=!1}),1);var s=t.isTransactionFinished;if(s&&(Ur(this),this.Yt.clear(),yo(this.animationManager)),!this.Bs&&s&&this.lastInput.targetDiagram){this.Bs=!0;var a=this;x((function(){a.currentTool.standardMouseOver(),a.Bs=!1}),10)}}}finally{this.Z=!0}}}},Ko.prototype.Md=function(){this.partManager.Md()},Ko.prototype.jk=function(t,e){this.Uc.jk(t,e)},Ko.prototype.lk=function(t,e){this.Uc.lk(t,e)},Ko.prototype.findPartForKey=function(t){return this.partManager.findPartForKey(t)},Ko.prototype.Cb=function(t){return this.partManager.Cb(t)},Ko.prototype.findLinkForKey=function(t){return this.partManager.findLinkForKey(t)},i=Ko.prototype,i.zc=function(t){return this.partManager.zc(t)},i.gj=function(t){return this.partManager.gj(t)},i.yc=function(t){return this.partManager.yc(t)},i.It=function(t){for(var e=[],i=0;i<arguments.length;++i)e[i]=arguments[i];return this.partManager.It.apply(this.partManager,e instanceof Array?e:r(o(e)))},i.Ht=function(t){for(var e=[],i=0;i<arguments.length;++i)e[i]=arguments[i];return this.partManager.Ht.apply(this.partManager,e instanceof Array?e:r(o(e)))},i.Ta=function(){this.vi&&$r(this,this.computeBounds())},i.dA=function(){for(var t=new nt,e=this.nodes;e.next();){var i=e.value;i.isTopLevel&&t.add(i)}for(e=this.links;e.next();)i=e.value,i.isTopLevel&&t.add(i);return t.iterator},i.cA=function(){return this.Dh.iterator},i.EA=function(t){Sr(this),t&&Jr(this,!0),this.ac?Qr(this,!1):(this.Hj=!0,kr(this))},i.jA=function(){for(var t=new et,e=this.nodes;e.next();){var i=e.value;i.isTopLevel&&null===i.jj()&&t.add(i)}return t.iterator},i.kk=function(t,e){t=ns(this,t),null!==t&&t.add(e)},i.Lm=function(t,e){t=ns(this,t),null!==t&&t.remove(e)},i.R=function(t,e,i){var n=ns(this,t),o=new ki;if(o.diagram=this,t=is(this,t),null!==t&&(o.name=t),void 0!==e&&(o.subject=e),void 0!==i&&(o.parameter=i),e=n.length,1===e)n.J(0)(o);else if(0!==e)for(n=n.ma(),i=0;i<e;i++)(0,n[i])(o)},i.Ek=function(t,e){return void 0===e&&(e=null),rs(this,!1,null,e).Ek(t.x,t.y,t.width,t.height)},Ko.prototype.computeOccupiedArea=function(){return this.isVirtualized?this.viewportBounds.copy():this.vi?or(this):this.documentBounds.copy()},Ko.prototype.Et=function(t){this.rn.assign(t),this.computeAutoScrollPosition(this.rn).Qa(this.position)?this.Jf():ls(this)},Ko.prototype.Jf=function(){-1!==this.Bj&&(y.clearTimeout(this.Bj),this.Bj=-1)},Ko.prototype.computeAutoScrollPosition=function(t){var e=this.position,i=this.sn;if(0>=i.top&&0>=i.left&&0>=i.right&&0>=i.bottom)return e;var n=this.viewportBounds,o=this.scale;n=zt.allocAt(0,0,n.width*o,n.height*o);var r=pt.allocAt(0,0);if(t.x>=n.x&&t.x<n.x+i.left&&this.allowHorizontalScroll){var s=Math.max(this.scrollHorizontalLineChange,1);s|=0,r.x-=s,t.x<n.x+i.left/2&&(r.x-=s),t.x<n.x+i.left/4&&(r.x-=4*s)}else t.x<=n.x+n.width&&t.x>n.x+n.width-i.right&&this.allowHorizontalScroll&&(s=Math.max(this.scrollHorizontalLineChange,1),s|=0,r.x+=s,t.x>n.x+n.width-i.right/2&&(r.x+=s),t.x>n.x+n.width-i.right/4&&(r.x+=4*s));return t.y>=n.y&&t.y<n.y+i.top&&this.allowVerticalScroll?(s=Math.max(this.scrollVerticalLineChange,1),s|=0,r.y-=s,t.y<n.y+i.top/2&&(r.y-=s),t.y<n.y+i.top/4&&(r.y-=4*s)):t.y<=n.y+n.height&&t.y>n.y+n.height-i.bottom&&this.allowVerticalScroll&&(s=Math.max(this.scrollVerticalLineChange,1),s|=0,r.y+=s,t.y>n.y+n.height-i.bottom/2&&(r.y+=s),t.y>n.y+n.height-i.bottom/4&&(r.y+=4*s)),r.Qa(At)||(e=new pt(e.x+r.x/o,e.y+r.y/o)),zt.free(n),pt.free(r),e},i=Ko.prototype,i.$t=function(){return null},i.iw=function(){return null},i.rz=function(t,e){this.Kx.add(t,e)},i.GA=function(t){return ys?(void 0===t&&(t=new _),t.returnType="Image",this.Hy(t)):null},i.Hy=function(t){return void 0===t&&(t=new _),us(this,this.HA,t)},i.HA=function(t,e,i){var n=cs(i,t,"canvas",null);if(null===n)return null;i=n.Y.canvas;var o=null;if(null!==i)switch(o=t.returnType,o=void 0===o?"string":o.toLowerCase(),o){case Bs+"data":o=n.getImageData(0,0,i.width,i.height);break;case Bs:n=(t.document||document).createElement("img"),n.src=i.toDataURL(t.type,t.details),o=n;break;case"blob":return"function"!==typeof e&&w('Error: Diagram.makeImageData called with "returnType: toBlob", but no required "callback" function property defined.'),"function"===typeof i.toBlob?(i.toBlob(e,t.type,t.details),"toBlob"):"function"===typeof i.msToBlob?(e(i.msToBlob()),"msToBlob"):(e(null),null);default:o=i.toDataURL(t.type,t.details)}return"function"===typeof e?(e(o),null):o},d.Object.defineProperties(Ko.prototype,{div:{get:function(){return this.Fa},set:function(t){if(this.Fa!==t){var e=this.Fa;null!==e?(e.C=void 0,e.goDiagram=void 0,e.innerHTML="",null!==this.wa&&(e=this.wa.Ja,this.zj?(this.removeEventListener(e,"pointermove",this.Pk,!1),this.removeEventListener(e,"pointerdown",this.Ok,!1),this.removeEventListener(e,"pointerup",this.Rk,!1),this.removeEventListener(e,"pointerout",this.Qk,!1)):(this.removeEventListener(e,"touchstart",this.Ow,!1),this.removeEventListener(e,"touchmove",this.Nw,!1),this.removeEventListener(e,"touchend",this.Mw,!1)),this.wa.ky()),this.Zl&&(this.Zl.disconnect(),this.Zl=null),e=this.toolManager,null!==e&&(e.mouseDownTools.each((function(t){t.cancelWaitAfter()})),e.mouseMoveTools.each((function(t){t.cancelWaitAfter()})),e.mouseUpTools.each((function(t){t.cancelWaitAfter()}))),e.cancelWaitAfter(),this.currentTool.doCancel(),this.Gb=this.wa=null,this.removeEventListener(y,"resize",this.Ww,!1),this.zj||(this.removeEventListener(y,"mousemove",this.Ik,!0),this.removeEventListener(y,"mousedown",this.Hk,!0),this.removeEventListener(y,"mouseup",this.Kk,!0),this.removeEventListener(y,"mouseout",this.Jk,!0)),this.removeEventListener(y,"wheel",this.Lk,!0),fs===this&&(fs=null)):this.qe=!1,this.Fa=null,null!==t&&((e=t.C)&&(e.div=null),Gs(this,t),this.redraw())}}},Yx:{get:function(){return this.cp}},pj:{get:function(){return this.qe}},draggedLink:{get:function(){return this.Sr},set:function(t){this.Sr!==t&&(this.Sr=t,null!==t&&(this.Fs=t.fromPort,this.Gs=t.toPort))}},Ky:{get:function(){return this.Fs},set:function(t){this.Fs=t}},Ly:{get:function(){return this.Gs},set:function(t){this.Gs=t}},animationManager:{get:function(){return this.Uc}},undoManager:{get:function(){return this.cc.undoManager}},skipsUndoManager:{get:function(){return this.vg},set:function(t){this.vg=t,this.cc.skipsUndoManager=t}},delaysLayout:{get:function(){return this.Nr},set:function(t){this.Nr=t}},opacity:{get:function(){return this.hb},set:function(t){var e=this.hb;e!==t&&((0>t||1<t)&&M(t,"0 <= value <= 1",Ko,"opacity"),this.hb=t,this.g("opacity",e,t),this.M())}},validCycle:{get:function(){return this.tt},set:function(t){var e=this.tt;e!==t&&(this.tt=t,this.g("validCycle",e,t))}},layers:{get:function(){return this.Ma.iterator}},isModelReadOnly:{get:function(){var t=this.cc;return null!==t&&t.isReadOnly},set:function(t){var e=this.cc;null!==e&&(e.isReadOnly=t)}},isReadOnly:{get:function(){return this.$f},set:function(t){var e=this.$f;e!==t&&(this.$f=t,this.g("isReadOnly",e,t))}},isEnabled:{get:function(){return this.md},set:function(t){var e=this.md;e!==t&&(this.md=t,this.g("isEnabled",e,t))}},allowClipboard:{get:function(){return this.nr},set:function(t){var e=this.nr;e!==t&&(this.nr=t,this.g("allowClipboard",e,t))}},allowCopy:{get:function(){return this.$h},set:function(t){var e=this.$h;e!==t&&(this.$h=t,this.g("allowCopy",e,t))}},allowDelete:{get:function(){return this.ai},set:function(t){var e=this.ai;e!==t&&(this.ai=t,this.g("allowDelete",e,t))}},allowDragOut:{get:function(){return this.pr},set:function(t){var e=this.pr;e!==t&&(this.pr=t,this.g("allowDragOut",e,t))}},allowDrop:{get:function(){return this.qr},set:function(t){var e=this.qr;e!==t&&(this.qr=t,this.g("allowDrop",e,t))}},allowTextEdit:{get:function(){return this.ji},set:function(t){var e=this.ji;e!==t&&(this.ji=t,this.g("allowTextEdit",e,t))}},allowGroup:{get:function(){return this.bi},set:function(t){var e=this.bi;e!==t&&(this.bi=t,this.g("allowGroup",e,t))}},allowUngroup:{get:function(){return this.ki},set:function(t){var e=this.ki;e!==t&&(this.ki=t,this.g("allowUngroup",e,t))}},allowInsert:{get:function(){return this.sr},set:function(t){var e=this.sr;e!==t&&(this.sr=t,this.g("allowInsert",e,t))}},allowLink:{get:function(){return this.ci},set:function(t){var e=this.ci;e!==t&&(this.ci=t,this.g("allowLink",e,t))}},allowRelink:{get:function(){return this.ei},set:function(t){var e=this.ei;e!==t&&(this.ei=t,this.g("allowRelink",e,t))}},allowMove:{get:function(){return this.di},set:function(t){var e=this.di;e!==t&&(this.di=t,this.g("allowMove",e,t))}},allowReshape:{get:function(){return this.fi},set:function(t){var e=this.fi;e!==t&&(this.fi=t,this.g("allowReshape",e,t))}},allowResize:{get:function(){return this.gi},set:function(t){var e=this.gi;e!==t&&(this.gi=t,this.g("allowResize",e,t))}},allowRotate:{get:function(){return this.hi},set:function(t){var e=this.hi;e!==t&&(this.hi=t,this.g("allowRotate",e,t))}},allowSelect:{get:function(){return this.ii},set:function(t){var e=this.ii;e!==t&&(this.ii=t,this.g("allowSelect",e,t))}},allowUndo:{get:function(){return this.tr},set:function(t){var e=this.tr;e!==t&&(this.tr=t,this.g("allowUndo",e,t))}},allowZoom:{get:function(){return this.vr},set:function(t){var e=this.vr;e!==t&&(this.vr=t,this.g("allowZoom",e,t))}},hasVerticalScrollbar:{get:function(){return this.wl},set:function(t){var e=this.wl;e!==t&&(this.wl=t,Ar(this),this.M(),this.g("hasVerticalScrollbar",e,t),rr(this,!1))}},hasHorizontalScrollbar:{get:function(){return this.vl},set:function(t){var e=this.vl;e!==t&&(this.vl=t,Ar(this),this.M(),this.g("hasHorizontalScrollbar",e,t),rr(this,!1))}},allowHorizontalScroll:{get:function(){return this.rr},set:function(t){var e=this.rr;e!==t&&(this.rr=t,this.g("allowHorizontalScroll",e,t),rr(this,!1))}},allowVerticalScroll:{get:function(){return this.ur},set:function(t){var e=this.ur;e!==t&&(this.ur=t,this.g("allowVerticalScroll",e,t),rr(this,!1))}},scrollHorizontalLineChange:{get:function(){return this.Ws},set:function(t){var e=this.Ws;e!==t&&(0>t&&M(t,">= 0",Ko,"scrollHorizontalLineChange"),this.Ws=t,this.g("scrollHorizontalLineChange",e,t))}},scrollVerticalLineChange:{get:function(){return this.$s},set:function(t){var e=this.$s;e!==t&&(0>t&&M(t,">= 0",Ko,"scrollVerticalLineChange"),this.$s=t,this.g("scrollVerticalLineChange",e,t))}},lastInput:{get:function(){return this.hh},set:function(t){this.hh=t}},previousInput:{get:function(){return this.od},set:function(t){this.od=t}},firstInput:{get:function(){return this.Wf},set:function(t){this.Wf=t}},currentCursor:{get:function(){return this.Hr},set:function(t){if(""===t&&(t=this.Pn),this.Hr!==t){var e=this.wa,i=this.Fa;if(null!==e){this.Hr=t;var n=e.style.cursor;e.style.cursor=t,i.style.cursor=t,e.style.cursor===n&&(e.style.cursor="-webkit-"+t,i.style.cursor="-webkit-"+t,e.style.cursor===n&&(e.style.cursor="-moz-"+t,i.style.cursor="-moz-"+t,e.style.cursor===n&&(e.style.cursor=t,i.style.cursor=t)))}}}},defaultCursor:{get:function(){return this.Pn},set:function(t){""===t&&(t="auto");var e=this.Pn;e!==t&&(this.Pn=t,this.g("defaultCursor",e,t))}},click:{get:function(){return this.Pf},set:function(t){var e=this.Pf;e!==t&&(this.Pf=t,this.g("click",e,t))}},doubleClick:{get:function(){return this.Uf},set:function(t){var e=this.Uf;e!==t&&(this.Uf=t,this.g("doubleClick",e,t))}},contextClick:{get:function(){return this.Qf},set:function(t){var e=this.Qf;e!==t&&(this.Qf=t,this.g("contextClick",e,t))}},mouseOver:{get:function(){return this.lg},set:function(t){var e=this.lg;e!==t&&(this.lg=t,this.g("mouseOver",e,t))}},mouseHover:{get:function(){return this.jg},set:function(t){var e=this.jg;e!==t&&(this.jg=t,this.g("mouseHover",e,t))}},mouseHold:{get:function(){return this.ig},set:function(t){var e=this.ig;e!==t&&(this.ig=t,this.g("mouseHold",e,t))}},mouseDragOver:{get:function(){return this.As},set:function(t){var e=this.As;e!==t&&(this.As=t,this.g("mouseDragOver",e,t))}},mouseDrop:{get:function(){return this.gg},set:function(t){var e=this.gg;e!==t&&(this.gg=t,this.g("mouseDrop",e,t))}},handlesDragDropForTopLevelParts:{get:function(){return this.cs},set:function(t){var e=this.cs;e!==t&&(this.cs=t,this.g("handlesDragDropForTopLevelParts",e,t))}},mouseEnter:{get:function(){return this.hg},set:function(t){var e=this.hg;e!==t&&(this.hg=t,this.g("mouseEnter",e,t))}},mouseLeave:{get:function(){return this.kg},set:function(t){var e=this.kg;e!==t&&(this.kg=t,this.g("mouseLeave",e,t))}},toolTip:{get:function(){return this.wg},set:function(t){var e=this.wg;e!==t&&(this.wg=t,this.g("toolTip",e,t))}},contextMenu:{get:function(){return this.Rf},set:function(t){var e=this.Rf;e!==t&&(this.Rf=t,this.g("contextMenu",e,t))}},commandHandler:{get:function(){return this.Br},set:function(t){this.Br!==t&&(this.Br=t,t.ee(this))}},toolManager:{get:function(){return this.pt},set:function(t){this.pt!==t&&(this.pt=t,t.diagram=this)}},defaultTool:{get:function(){return this.Mr},set:function(t){var e=this.Mr;e!==t&&(this.Mr=t,t.diagram=this,this.currentTool===e&&(this.currentTool=t))}},currentTool:{get:function(){return this.Jr},set:function(t){var e=this.Jr;null!==e&&(e.isActive&&e.doDeactivate(),e.cancelWaitAfter(),e.doStop()),null===t&&(t=this.defaultTool),null!==t&&(this.Jr=t,t.diagram=this,t.doStart())}},selection:{get:function(){return this.qv}},maxSelectionCount:{get:function(){return this.ws},set:function(t){var e=this.ws;if(e!==t)if(0<=t&&!isNaN(t)){if(this.ws=t,this.g("maxSelectionCount",e,t),!this.undoManager.isUndoingRedoing&&(t=this.selection.count-t,0<t)){this.R("ChangingSelection",this.selection),e=this.selection.ma();for(var i=0;i<t;i++)e[i].isSelected=!1;this.R("ChangedSelection",this.selection)}}else M(t,">= 0",Ko,"maxSelectionCount")}},nodeSelectionAdornmentTemplate:{get:function(){return this.kp},set:function(t){var e=this.kp;e!==t&&(this.kp=t,this.g("nodeSelectionAdornmentTemplate",e,t))}},groupSelectionAdornmentTemplate:{get:function(){return this.qo},set:function(t){var e=this.qo;e!==t&&(this.qo=t,this.g("groupSelectionAdornmentTemplate",e,t))}},linkSelectionAdornmentTemplate:{get:function(){return this.Lo},set:function(t){var e=this.Lo;e!==t&&(this.Lo=t,this.g("linkSelectionAdornmentTemplate",e,t))}},highlighteds:{get:function(){return this.Su}},isModified:{get:function(){var t=this.undoManager;return t.isEnabled?null!==t.currentTransaction||this.wo&&this.Xd!==t.historyIndex:this.wo},set:function(t){if(this.wo!==t){this.wo=t;var e=this.undoManager;!t&&e.isEnabled&&(this.Xd=e.historyIndex),t||Ur(this)}}},model:{get:function(){return this.cc},set:function(t){var e=this.cc;if(e!==t){this.currentTool.doCancel(),null!==e&&e.undoManager!==t.undoManager&&e.undoManager.isInTransaction&&w("Do not replace a Diagram.model while a transaction is in progress."),this.animationManager.Bc(!0);var i=Ho(this,!0);this.qe=!1,this.Kj=!0,this.Xd=-2,this.Ee=!1;var n=this.ac;this.ac=!0,uo(this.animationManager,"Model"),null!==e&&(null!==this.we&&this.we.each((function(t){e.Tk(t)})),e.Tk(this.Tc)),this.cc=t,this.partManager=Kr(this.cc.type);for(var o=0;o<i.length;o++)this.add(i[o]);t.Hh(this.Cc),this.partManager.addAllModeledParts(),t.Tk(this.Cc),t.Hh(this.Tc),null!==this.we&&this.we.each((function(e){t.Hh(e)})),this.ac=n,this.Na(),this.Sb||this.M(),null!==e&&t.undoManager.copyProperties(e.undoManager)}}},Z:{get:function(){return this.av},set:function(t){this.av=t}},Yt:{get:function(){return this.Ax}},skipsModelSourceBindings:{get:function(){return this.rv},set:function(t){this.rv=t}},mu:{get:function(){return this.gt},set:function(t){this.gt=t}},nodeTemplate:{get:function(){return this.df.G("")},set:function(t){var e=this.df.G("");e!==t&&(this.df.add("",t),this.g("nodeTemplate",e,t),this.undoManager.isUndoingRedoing||this.Md())}},nodeTemplateMap:{get:function(){return this.df},set:function(t){var e=this.df;e!==t&&(this.df=t,this.g("nodeTemplateMap",e,t),this.undoManager.isUndoingRedoing||this.Md())}},groupTemplate:{get:function(){return this.fh.G("")},set:function(t){var e=this.fh.G("");e!==t&&(this.fh.add("",t),this.g("groupTemplate",e,t),this.undoManager.isUndoingRedoing||this.Md())}},groupTemplateMap:{get:function(){return this.fh},set:function(t){var e=this.fh;e!==t&&(this.fh=t,this.g("groupTemplateMap",e,t),this.undoManager.isUndoingRedoing||this.Md())}},linkTemplate:{get:function(){return this.bg.G("")},set:function(t){var e=this.bg.G("");e!==t&&(this.bg.add("",t),this.g("linkTemplate",e,t),this.undoManager.isUndoingRedoing||this.Md())}},linkTemplateMap:{get:function(){return this.bg},set:function(t){var e=this.bg;e!==t&&(this.bg=t,this.g("linkTemplateMap",e,t),this.undoManager.isUndoingRedoing||this.Md())}},isMouseCaptured:{get:function(){return this.Xu},set:function(t){var e=this.wa;null!==e&&(e=e.Ja,e instanceof SVGElement||(t?(this.lastInput.bubbles=!1,this.zj?(this.removeEventListener(e,"pointermove",this.Pk,!1),this.removeEventListener(e,"pointerdown",this.Ok,!1),this.removeEventListener(e,"pointerup",this.Rk,!1),this.removeEventListener(e,"pointerout",this.Qk,!1),this.addEventListener(y,"pointermove",this.Pk,!0),this.addEventListener(y,"pointerdown",this.Ok,!0),this.addEventListener(y,"pointerup",this.Rk,!0),this.addEventListener(y,"pointerout",this.Qk,!0)):(this.removeEventListener(e,"mousemove",this.Ik,!1),this.removeEventListener(e,"mousedown",this.Hk,!1),this.removeEventListener(e,"mouseup",this.Kk,!1),this.removeEventListener(e,"mouseout",this.Jk,!1),this.addEventListener(y,"mousemove",this.Ik,!0),this.addEventListener(y,"mousedown",this.Hk,!0),this.addEventListener(y,"mouseup",this.Kk,!0),this.addEventListener(y,"mouseout",this.Jk,!0)),this.removeEventListener(e,"wheel",this.Lk,!1),this.addEventListener(y,"wheel",this.Lk,!0),this.addEventListener(y,"selectstart",this.preventDefault,!1)):(this.zj?(this.removeEventListener(y,"pointermove",this.Pk,!0),this.removeEventListener(y,"pointerdown",this.Ok,!0),this.removeEventListener(y,"pointerup",this.Rk,!0),this.removeEventListener(y,"pointerout",this.Qk,!0),this.addEventListener(e,"pointermove",this.Pk,!1),this.addEventListener(e,"pointerdown",this.Ok,!1),this.addEventListener(e,"pointerup",this.Rk,!1),this.addEventListener(e,"pointerout",this.Qk,!1)):(this.removeEventListener(y,"mousemove",this.Ik,!0),this.removeEventListener(y,"mousedown",this.Hk,!0),this.removeEventListener(y,"mouseup",this.Kk,!0),this.removeEventListener(y,"mouseout",this.Jk,!0),this.addEventListener(e,"mousemove",this.Ik,!1),this.addEventListener(e,"mousedown",this.Hk,!1),this.addEventListener(e,"mouseup",this.Kk,!1),this.addEventListener(e,"mouseout",this.Jk,!1)),this.removeEventListener(y,"wheel",this.Lk,!0),this.removeEventListener(y,"selectstart",this.preventDefault,!1),this.addEventListener(e,"wheel",this.Lk,!1)),this.Xu=t))}},position:{get:function(){return this.la},set:function(t){var e=pt.alloc().assign(this.la);if(!e.w(t)){var i=this.viewportBounds.copy();this.la.assign(t),xo(this.animationManager,e,this.la),this.Sb||null===this.wa&&!this.sm.s()||(this.Sb=!0,t=this.scale,ar(this,this.Rn,this.ya/t,this.xa/t,this.Dj,!1),this.Sb=!1),this.Sb||this.onViewportBoundsChanged(i,this.viewportBounds,this.Aa,!1)}pt.free(e)}},initialPosition:{get:function(){return this.es},set:function(t){this.es.w(t)||(this.es=t.H())}},initialScale:{get:function(){return this.fs},set:function(t){this.fs!==t&&(this.fs=t)}},grid:{get:function(){return null===this.Ib&&er(this),this.Ib},set:function(t){var e=this.Ib;if(e!==t){null===e&&(er(this),e=this.Ib),t.type!==Uh.Grid&&w("Diagram.grid must be a Panel of type Panel.Grid");var i=e.panel;null!==i&&i.remove(e),this.Ib=t,t.name="GRID",null!==i&&i.add(t),qr(this),this.M(),this.g("grid",e,t)}}},viewportBounds:{get:function(){var t=this.Rx,e=this.la,i=this.Aa;return t.h(e.x,e.y,Math.max(this.ya,0)/i,Math.max(this.xa,0)/i),t}},viewSize:{get:function(){return this.sm},set:function(t){var e=this.viewSize;e.w(t)||(this.sm=t=t.H(),this.ya=t.width,this.xa=t.height,this.Na(),this.g("viewSize",e,t))}},fixedBounds:{get:function(){return this.Zr},set:function(t){var e=this.Zr;e.w(t)||(-1/0!==t.width&&1/0!==t.height&&-1/0!==t.height||w("fixedBounds width/height must not be Infinity"),this.Zr=t=t.H(),this.Na(),this.g("fixedBounds",e,t))}},scrollMargin:{get:function(){return this.Si},set:function(t){"number"===typeof t&&(t=new Qt(t));var e=this.Si;e.w(t)||(this.Si=t=t.H(),this.g("scrollMargin",e,t),this.Yq())}},scrollMode:{get:function(){return this.Ti},set:function(t){var e=this.Ti;e!==t&&(this.Ti=t,t===Ts&&rr(this,!1),this.g("scrollMode",e,t),this.M())}},scrollsPageOnFocus:{get:function(){return this.at},set:function(t){var e=this.at;e!==t&&(this.at=t,this.g("scrollsPageOnFocus",e,t))}},positionComputation:{get:function(){return this.Ns},set:function(t){var e=this.Ns;e!==t&&(this.Ns=t,rr(this,!1),this.g("positionComputation",e,t))}},scaleComputation:{get:function(){return this.Us},set:function(t){var e=this.Us;e!==t&&(this.Us=t,Xr(this,this.scale,this.scale),this.g("scaleComputation",e,t))}},documentBounds:{get:function(){return this.Rn}},isVirtualized:{get:function(){return this.rs},set:function(t){var e=this.rs;e!==t&&(this.rs=t,this.g("isVirtualized",e,t))}},scale:{get:function(){return this.Aa},set:function(t){var e=this.Aa;e!==t&&Xr(this,e,t)}},defaultScale:{get:function(){return this.Qn},set:function(t){this.Qn=t}},autoScale:{get:function(){return this.Og},set:function(t){var e=this.Og;e!==t&&(this.Og=t,this.g("autoScale",e,t),t!==xs&&rr(this,!1))}},initialAutoScale:{get:function(){return this.Yf},set:function(t){var e=this.Yf;e!==t&&(this.Yf=t,this.g("initialAutoScale",e,t))}},initialViewportSpot:{get:function(){return this.gs},set:function(t){var e=this.gs;e!==t&&(t.kb()||w("initialViewportSpot must be a specific Spot: "+t),this.gs=t,this.g("initialViewportSpot",e,t))}},initialDocumentSpot:{get:function(){return this.ds},set:function(t){var e=this.ds;e!==t&&(t.kb()||w("initialViewportSpot must be a specific Spot: "+t),this.ds=t,this.g("initialDocumentSpot",e,t))}},minScale:{get:function(){return this.xs},set:function(t){var e=this.xs;e!==t&&(0<t?(this.xs=t,this.g("minScale",e,t),t>this.scale&&(this.scale=t)):M(t,"> 0",Ko,"minScale"))}},maxScale:{get:function(){return this.vs},set:function(t){var e=this.vs;e!==t&&(0<t?(this.vs=t,this.g("maxScale",e,t),t<this.scale&&(this.scale=t)):M(t,"> 0",Ko,"maxScale"))}},zoomPoint:{get:function(){return this.xt},set:function(t){this.xt.w(t)||(this.xt=t=t.H())}},contentAlignment:{get:function(){return this.Dj},set:function(t){var e=this.Dj;e.w(t)||(this.Dj=t=t.H(),this.g("contentAlignment",e,t),rr(this,!1))}},initialContentAlignment:{get:function(){return this.to},set:function(t){var e=this.to;e.w(t)||(this.to=t=t.H(),this.g("initialContentAlignment",e,t))}},padding:{get:function(){return this.ib},set:function(t){"number"===typeof t&&(t=new Qt(t));var e=this.ib;e.w(t)||(this.ib=t=t.H(),this.Na(),this.g("padding",e,t))}},partManager:{get:function(){return this.La},set:function(t){var e=this.La;e!==t&&(null!==t.diagram&&w("Cannot share PartManagers between Diagrams: "+t.toString()),null!==e&&e.ee(null),this.La=t,t.ee(this))}},nodes:{get:function(){return this.partManager.nodes.iterator}},links:{get:function(){return this.partManager.links.iterator}},parts:{get:function(){return this.partManager.parts.iterator}},layout:{get:function(){return this.kc},set:function(t){var e=this.kc;e!==t&&(this.kc=t,t.diagram=this,t.group=null,this.Ng=!0,this.g("layout",e,t),this.Db())}},isTreePathToChildren:{get:function(){return this.qs},set:function(t){var e=this.qs;if(e!==t&&(this.qs=t,this.g("isTreePathToChildren",e,t),!this.undoManager.isUndoingRedoing))for(t=this.nodes;t.next();)lc(t.value)}},treeCollapsePolicy:{get:function(){return this.rt},set:function(t){var e=this.rt;e!==t&&(t!==Ls&&t!==js&&t!==Os&&w("Unknown Diagram.treeCollapsePolicy: "+t),this.rt=t,this.g("treeCollapsePolicy",e,t))}},Le:{get:function(){return this.Uu},set:function(t){this.Uu=t}},autoScrollInterval:{get:function(){return this.qn},set:function(t){var e=this.qn;e!==t&&(this.qn=t,this.g("autoScrollInterval",e,t))}},autoScrollRegion:{get:function(){return this.sn},set:function(t){"number"===typeof t&&(t=new Qt(t));var e=this.sn;e.w(t)||(this.sn=t=t.H(),this.Na(),this.g("autoScrollRegion",e,t))}}}),d.Object.defineProperties(Ko,{licenseKey:{get:function(){return Ds.Xb()},set:function(t){Ds.add(t)}},version:{get:function(){return Fs}}}),Ko.prototype.makeImageData=Ko.prototype.Hy,Ko.prototype.makeImage=Ko.prototype.GA,Ko.prototype.addRenderer=Ko.prototype.rz,Ko.prototype.makeSVG=Ko.prototype.iw,Ko.prototype.makeSvg=Ko.prototype.$t,Ko.prototype.stopAutoScroll=Ko.prototype.Jf,Ko.prototype.doAutoScroll=Ko.prototype.Et,Ko.prototype.isUnoccupied=Ko.prototype.Ek,Ko.prototype.raiseDiagramEvent=Ko.prototype.R,Ko.prototype.removeDiagramListener=Ko.prototype.Lm,Ko.prototype.addDiagramListener=Ko.prototype.kk,Ko.prototype.findTreeRoots=Ko.prototype.jA,Ko.prototype.layoutDiagram=Ko.prototype.EA,Ko.prototype.findTopLevelGroups=Ko.prototype.cA,Ko.prototype.findTopLevelNodesAndLinks=Ko.prototype.dA,Ko.prototype.ensureBounds=Ko.prototype.Ta,Ko.prototype.findLinksByExample=Ko.prototype.Ht,Ko.prototype.findNodesByExample=Ko.prototype.It,Ko.prototype.findLinkForData=Ko.prototype.yc,Ko.prototype.findNodeForData=Ko.prototype.gj,Ko.prototype.findPartForData=Ko.prototype.zc,Ko.prototype.findLinkForKey=Ko.prototype.findLinkForKey,Ko.prototype.findNodeForKey=Ko.prototype.Cb,Ko.prototype.findPartForKey=Ko.prototype.findPartForKey,Ko.prototype.rebuildParts=Ko.prototype.Md,Ko.prototype.transformViewToDoc=Ko.prototype.ou,Ko.prototype.transformRectDocToView=Ko.prototype.iB,Ko.prototype.transformDocToView=Ko.prototype.gr,Ko.prototype.centerRect=Ko.prototype.At,Ko.prototype.scrollToRect=Ko.prototype.Aw,Ko.prototype.scroll=Ko.prototype.scroll,Ko.prototype.highlightCollection=Ko.prototype.vA,Ko.prototype.highlight=Ko.prototype.uA,Ko.prototype.selectCollection=Ko.prototype.$A,Ko.prototype.select=Ko.prototype.select,Ko.prototype.updateAllRelationshipsFromData=Ko.prototype.ir,Ko.prototype.updateAllTargetBindings=Ko.prototype.updateAllTargetBindings,Ko.prototype.commit=Ko.prototype.commit,Ko.prototype.rollbackTransaction=Ko.prototype.If,Ko.prototype.commitTransaction=Ko.prototype.Xa,Ko.prototype.startTransaction=Ko.prototype.va,Ko.prototype.raiseChanged=Ko.prototype.g,Ko.prototype.raiseChangedEvent=Ko.prototype.Va,Ko.prototype.removeChangedListener=Ko.prototype.Tk,Ko.prototype.addChangedListener=Ko.prototype.Hh,Ko.prototype.removeModelChangedListener=Ko.prototype.VA,Ko.prototype.addModelChangedListener=Ko.prototype.Wx,Ko.prototype.findLayer=Ko.prototype.xk,Ko.prototype.removeLayer=Ko.prototype.TA,Ko.prototype.addLayerAfter=Ko.prototype.nz,Ko.prototype.addLayerBefore=Ko.prototype.Ux,Ko.prototype.addLayer=Ko.prototype.um,Ko.prototype.moveParts=Ko.prototype.moveParts,Ko.prototype.copyParts=Ko.prototype.tk,Ko.prototype.removeParts=Ko.prototype.gu,Ko.prototype.remove=Ko.prototype.remove,Ko.prototype.add=Ko.prototype.add,Ko.prototype.clearDelayedGeometries=Ko.prototype.Hv,Ko.prototype.setProperties=Ko.prototype.Fw,Ko.prototype.resetInputOptions=Ko.prototype.ww,Ko.prototype.setInputOption=Ko.prototype.aB,Ko.prototype.getInputOption=Ko.prototype.Bm,Ko.prototype.resetRenderingHints=Ko.prototype.xw,Ko.prototype.setRenderingHint=Ko.prototype.Ty,Ko.prototype.getRenderingHint=Ko.prototype.Ke,Ko.prototype.maybeUpdate=Ko.prototype.hd,Ko.prototype.requestUpdate=Ko.prototype.Db,Ko.prototype.delayInitialization=Ko.prototype.Jz,Ko.prototype.isUpdateRequested=Ko.prototype.AA,Ko.prototype.invalidateDocumentBounds=Ko.prototype.Na,Ko.prototype.findObjectsNear=Ko.prototype.Eg,Ko.prototype.findPartsNear=Ko.prototype.$z,Ko.prototype.findObjectsIn=Ko.prototype.zf,Ko.prototype.findPartsIn=Ko.prototype.ty,Ko.prototype.findObjectsAt=Ko.prototype.hj,Ko.prototype.findPartsAt=Ko.prototype.Zz,Ko.prototype.findObjectAt=Ko.prototype.Vb,Ko.prototype.findPartAt=Ko.prototype.zm,Ko.prototype.focusObject=Ko.prototype.kA,Ko.prototype.alignDocument=Ko.prototype.uz,Ko.prototype.zoomToRect=Ko.prototype.mB,Ko.prototype.zoomToFit=Ko.prototype.zoomToFit,Ko.prototype.diagramScroll=Ko.prototype.iy,Ko.prototype.focus=Ko.prototype.focus,Ko.useDOM=function(t){ys=!!t&&void 0!==y.document},Ko.isUsingDOM=function(){return ys};var fs=null,ds=new dt,ps=null,gs=null,ys=void 0!==y.document,ms=null,vs="",xs=new U(Ko,"None",0),bs=new U(Ko,"Uniform",1),ws=new U(Ko,"UniformToFill",2),ks=new U(Ko,"CycleAll",10),Ms=new U(Ko,"CycleNotDirected",11),Ss=new U(Ko,"CycleNotDirectedFast",12),Ps=new U(Ko,"CycleNotUndirected",13),Ns=new U(Ko,"CycleDestinationTree",14),Cs=new U(Ko,"CycleSourceTree",15),Ts=new U(Ko,"DocumentScroll",1),As=new U(Ko,"InfiniteScroll",2),Ls=new U(Ko,"TreeParentCollapsed",21),js=new U(Ko,"AllParentsCollapsed",22),Os=new U(Ko,"AnyParentsCollapsed",23),Ds=new et,Fs="2.1.53",Bs="image",Is=null,Es=!1;function Rs(){if(ys){var t=y.document.createElement("canvas"),e=t.getContext("2d"),i=E("7ca11abfd022028846");e[i]=E("398c3597c01238");for(var n=["5da73c80a36455d5038e4972187c3cae51fd22",m.Dx+"4ae6247590da4bb21c324ba3a84e385776",Ke.xF+"fb236cdfda5de14c134ba1a95a2d4c7cc6f93c1387",_e.za],o=1;5>o;o++)e[E("7ca11abfd7330390")](E(n[o-1]),10,15*o);for(e[i]=E("39f046ebb36e4b"),i=1;5>i;i++)e[E("7ca11abfd7330390")](E(n[i-1]),10,15*i);4===n.length&&"5"===n[0][0]&&"7"===n[3][0]||(Ke.prototype.Jd=Ke.prototype.Zx),Is=t}}function zs(){this.jz=null,this.l="zz@orderNum","63ad05bbe23a1786468a4c741b6d2"===this._tk?this.Ve=this.l=!0:this.Ve=null}function Vs(t,e){if(e.Gb.setTransform(e.Tb,0,0,e.Tb,0,0),null===t.Ve)t:{e="f";var i=y[E("76a715b2f73f148a")][E("72ba13b5")];if(t.Ve=!0,ys){var n=Ko[E("76a115b6ed251eaf4692")];if(n)for(var o=Ds.iterator;o.next();){if(n=o.value,n=E(n).split(E("39e9")),6>n.length)break;var r=E(n[1]).split(".");if("7da71ca0"!==n[4])break;var s=E(m[E("6cae19")]).split(".");if(r[0]>s[0]||r[0]===s[0]&&r[1]>=s[1]){for(r=i[E("76ad18b4f73e")],s=i[E("73a612b6fb191d")](E("35e7"))+2;s<r;s++)e+=i[s];if(r=e[E("73a612b6fb191d")](E(n[2])),0>r&&E(n[2])!==E("7da71ca0ad381e90")&&(r=e[E("73a612b6fb191d")](E("76a715b2ef3e149757"))),0>r&&(r=e[E("73a612b6fb191d")](E("76a715b2ef3e149757"))),0>r&&(r=i[E("73a612b6fb191d")](E("7baa19a6f76c1988428554"))),t.Ve=!(0<=r&&r<e[E("73a612b6fb191d")](E("35"))||-1===e[E("73a612b6fb191d")](E("35"))),!t.Ve)break;if(r=E(n[2]),"#"===r[0]){s=y.document.createElement("div");for(var a=n[0].replace(/[A-Za-z]/g,"");4>a.length;)a+="9";if(a=a.substr(a.length-4),n="",n+=["gsh","gsf"][parseInt(a.substr(0,1),10)%2],n+=["Header","Background","Display","Feedback"][parseInt(a.substr(0,1),10)%4],s[E("79a417a0f0181a8946")]=n,y.document[E("78a712aa")]){if(y.document[E("78a712aa")][E("7bb806b6ed32388c4a875b")](s),a=y.getComputedStyle(s).getPropertyValue(E("78a704b7e62456904c9b12701b6532a8")),y.document[E("78a712aa")][E("68ad1bbcf533388c4a875b")](s),a){if(-1!==a.indexOf(parseInt(r[1]+r[2],16))&&-1!==a.indexOf(parseInt(r[3]+r[4],16))){t.Ve=!1;break}if(R||z||V||G)for(n="."+n,r=0;r<document.styleSheets.length;r++)for(var h in s=document.styleSheets[r].rules||document.styleSheets[r].cssRules,s)if(n===s[h].selectorText){t.Ve=!1;break t}}}else t.Ve=null,t.Ve=!1}}}else{for(h=i[E("76ad18b4f73e")],o=i[E("73a612b6fb191d")](E("35e7"))+2;o<h;o++)e+=i[o];i=e[E("73a612b6fb191d")](E("7da71ca0ad381e90")),t.Ve=!(0<=i&&i<e[E("73a612b6fb191d")](E("35")))}}}return 0<t.Ve&&t!==t.jz}function Gs(t,e){if(ys){if(void 0!==e&&null!==e||w("Diagram setup requires an argument DIV."),null!==t.Fa&&w("Diagram has already completed setup."),"string"===typeof e?t.Fa=y.document.getElementById(e):e instanceof HTMLDivElement?t.Fa=e:w("No DIV or DIV id supplied: "+e),null===t.Fa&&w("Invalid DIV id; could not get element with id: "+e),void 0!==t.Fa.C&&w("Invalid div id; div already has a Diagram associated with it."),!t.Zl&&y.ResizeObserver){var i=v((function(){t.Db()}),250);t.Zl=new y.ResizeObserver((function(){i()})),t.Zl.observe(t.Fa)}"static"===y.getComputedStyle(t.Fa,null).position&&(t.Fa.style.position="relative"),e=5;var n="rgba(2"+e+"5, 255, 255, 0)";e--,t.Fa.style["-webkit-tap-highlight-color"]=n,t.Fa.style["-ms-touch-action"]="none",t.Fa.innerHTML="",t.Fa.C=t,t.Fa.goDiagram=t,t.Fa.go=y.go;var o=t.gq?new qa(t):new Ja(t);if(void 0!==o.style&&(o.style.position="absolute",o.style.top="0px",o.style.left="0px","rtl"===y.getComputedStyle(t.Fa,null).getPropertyValue("direction")&&(t.Gl=!0),o.style.zIndex="2",o.style.userSelect="none",o.style.MozUserSelect="none"),t.wa=o,t.Gb=o.context,n=t.Gb,t.Tb=t.computePixelRatio(),t.viewSize.s()||(t.ya=t.Fa.clientWidth||1,t.xa=t.Fa.clientHeight||1),Or(t,t.ya,t.xa),t.Fa.insertBefore(o.Ja,t.Fa.firstChild),o=new Ja(null),o.width=1,o.height=1,t.Ju=o,t.ux=o.context,ys){o=b("div");var r=b("div");o.style.position="absolute",o.style.overflow="auto",o.style.width=t.ya+"px",o.style.height=t.xa+"px",o.style.zIndex="1",r.style.position="absolute",r.style.width="1px",r.style.height="1px",t.Fa.appendChild(o),o.appendChild(r),o.onscroll=ir,o.addEventListener("mousedown",nr),o.addEventListener("touchstart",nr,{passive:!0}),o.C=t,o.hz=!0,o.iz=!0,t.Ys=o,t.Pp=r}t.Yq=v((function(){t.yh=null,t.M()}),300),t.Ww=v((function(){Qo(t)}),250),t.preventDefault=function(t){return t.preventDefault(),!1},t.Ik=function(e){if(t.isEnabled){t.Zf=!0;var i=fr(t,e,!0);t.doMouseMove(),t.currentTool.isBeyondDragSize()&&(t.xd=0),mr(i,e)}},t.Hk=function(e){if(t.isEnabled)if(t.Zf=!0,t.re)e.preventDefault();else{var i=fr(t,e,!0);i.down=!0,i.clickCount=e.detail,(z||V)&&(e.timeStamp-t.Sj<t.qt&&!t.currentTool.isBeyondDragSize()?t.xd++:t.xd=1,t.Sj=e.timeStamp,i.clickCount=t.xd),i.clone(t.firstInput),t.doMouseDown(),1===e.button?e.preventDefault():mr(i,e)}},t.Kk=function(e){if(t.isEnabled)if(t.re&&2===e.button)e.preventDefault();else if(t.re&&0===e.button&&(t.re=!1),t.hk)e.preventDefault();else{t.Zf=!0;var i=fr(t,e,!0);i.up=!0,i.clickCount=e.detail,(z||V)&&(i.clickCount=t.xd),i.bubbles=e.bubbles,i.targetDiagram=dr(e),t.doMouseUp(),t.Jf(),mr(i,e)}},t.Lk=function(e){if(t.isEnabled){var i=fr(t,e,!0);i.bubbles=!0;var n=0,o=0;i.delta=0,void 0!==e.deltaX?(0!==e.deltaX&&(n=0<e.deltaX?1:-1),0!==e.deltaY&&(o=0<e.deltaY?1:-1),i.delta=Math.abs(e.deltaX)>Math.abs(e.deltaY)?-n:-o):void 0!==e.wheelDeltaX?(0!==e.wheelDeltaX&&(n=0<e.wheelDeltaX?-1:1),0!==e.wheelDeltaY&&(o=0<e.wheelDeltaY?-1:1),i.delta=Math.abs(e.wheelDeltaX)>Math.abs(e.wheelDeltaY)?-n:-o):void 0!==e.wheelDelta&&0!==e.wheelDelta&&(i.delta=0<e.wheelDelta?1:-1),t.doMouseWheel(),mr(i,e)}},t.Jk=function(e){t.isEnabled&&(t.Zf=!1,fr(t,e,!0),e=t.currentTool,e.cancelWaitAfter(),e.standardMouseOver())},t.Ow=function(e){if(t.isEnabled){t.hk=!1,t.re=!0;var i=pr(t,e,e.targetTouches[0],1<e.touches.length),n=null;if(0<e.targetTouches.length?n=e.targetTouches[0]:0<e.changedTouches.length&&(n=e.changedTouches[0]),null!==n){var o=n.screenX;n=n.screenY;var r=t.Go;e.timeStamp-t.Sj<t.qt&&!(25<Math.abs(r.x-o)||25<Math.abs(r.y-n))?t.xd++:t.xd=1,i.clickCount=t.xd,t.Sj=e.timeStamp,t.Go.h(o,n)}t.doMouseDown(),mr(i,e)}},t.Nw=function(e){if(t.isEnabled){var i=null;0<e.targetTouches.length?i=e.targetTouches[0]:0<e.changedTouches.length&&(i=e.changedTouches[0]),i=gr(t,e,i,1<e.touches.length),t.doMouseMove(),mr(i,e)}},t.Mw=function(e){if(t.isEnabled)if(t.hk)e.preventDefault();else if(!(1<e.touches.length)){var i=null,n=null;0<e.targetTouches.length?n=e.targetTouches[0]:0<e.changedTouches.length&&(n=e.changedTouches[0]);var o=yr(t,e,!1,!0,!1,!1);null!==n&&(i=y.document.elementFromPoint(n.clientX,n.clientY),null!==i&&void 0!==i.shadowRoot&&null!==i&&null!==i.shadowRoot&&(i=i.shadowRoot.elementFromPoint(n.clientX,n.clientY)),null!==i&&i.C instanceof Ko&&i.C!==t&&vr(i.C,n,o),vr(t,n,o),o.clickCount=t.xd),null===i?o.targetDiagram=dr(e):i.C?o.targetDiagram=i.C:o.targetDiagram=null,o.targetObject=null,t.doMouseUp(),mr(o,e),t.re=!1}},t.Ok=function(e){if(t.isEnabled){t.Zf=!0;var i=t.Ls;void 0===i[e.pointerId]&&(i[e.pointerId]=e),i=t.bk;var n=!1;if(null!==i[0]&&i[0].pointerId===e.pointerId)i[0]=e;else if(null!==i[1]&&i[1].pointerId===e.pointerId)i[1]=e,n=!0;else if(null===i[0])i[0]=e;else{if(null!==i[1])return void e.preventDefault();i[1]=e,n=!0}"touch"!==e.pointerType&&"pen"!==e.pointerType||(t.hk=!1,t.re=!0),i=pr(t,e,e,n),n=t.Go;var o="touch"===e.pointerType||"pen"===e.pointerType?25:10;e.timeStamp-t.Sj<t.qt&&!(Math.abs(n.x-e.screenX)>o||Math.abs(n.y-e.screenY)>o)?t.xd++:t.xd=1,i.clickCount=t.xd,t.Sj=e.timeStamp,t.Go.Ig(e.screenX,e.screenY),t.doMouseDown(),1===e.button?e.preventDefault():mr(i,e)}},t.Pk=function(e){if(t.isEnabled){t.Zf=!0;var i=t.bk;if(null!==i[0]&&i[0].pointerId===e.pointerId)i[0]=e;else{if(null!==i[1]&&i[1].pointerId===e.pointerId)return void(i[1]=e);if(null!==i[0])return;i[0]=e}i[0].pointerId===e.pointerId&&(i=gr(t,e,e,null!==i[1]),i.targetDiagram=dr(e),t.doMouseMove(),mr(i,e))}},t.Rk=function(e){if(t.isEnabled){t.Zf=!0;var i="touch"===e.pointerType||"pen"===e.pointerType,n=t.Ls;if(i&&t.hk)delete n[e.pointerId],e.preventDefault();else if(n=t.bk,null!==n[0]&&n[0].pointerId===e.pointerId){n[0]=null,n=yr(t,e,!1,!0,!0,!1);var o=y.document.elementFromPoint(e.clientX,e.clientY);null!==o&&o.C instanceof Ko&&o.C!==t&&vr(o.C,e,n),vr(t,e,n),n.clickCount=t.xd,null===o?n.targetDiagram=dr(e):o.C?n.targetDiagram=o.C:n.targetDiagram=null,n.targetObject=null,t.doMouseUp(),mr(n,e),i&&(t.re=!1)}else null!==n[1]&&n[1].pointerId===e.pointerId&&(n[1]=null)}},t.Qk=function(e){if(t.isEnabled){t.Zf=!1;var i=t.Ls;i[e.pointerId]&&delete i[e.pointerId],i=t.bk,null!==i[0]&&i[0].pointerId===e.pointerId&&(i[0]=null),null!==i[1]&&i[1].pointerId===e.pointerId&&(i[1]=null),"touch"!==e.pointerType&&"pen"!==e.pointerType&&(e=t.currentTool,e.cancelWaitAfter(),e.standardMouseOver())}},t.Tr=n.Y["d"+Qs[1]+Qs[2]+"wI"+Bs.slice(1,5)]["b"+dp.slice(1,e)](n.Y,Is,e,e),n.uc(!0),$o(t)}}function Ys(t){this.l=void 0===t?new pt:t,this.u=new pt}Ko.className="Diagram",Ko.fromDiv=function(t){var e=t;return"string"===typeof t&&(e=y.document.getElementById(t)),e instanceof HTMLDivElement&&e.C instanceof Ko?e.C:null},Ko.inherit=function(t,e){function i(){}if(Object.getPrototypeOf(t).prototype)throw Error("Used go.Diagram.inherit defining already defined class \n"+t);i.prototype=e.prototype,t.prototype=new i,t.prototype.constructor=t},Ko.None=xs,Ko.Uniform=bs,Ko.UniformToFill=ws,Ko.CycleAll=ks,Ko.CycleNotDirected=Ms,Ko.CycleNotDirectedFast=Ss,Ko.CycleNotUndirected=Ps,Ko.CycleDestinationTree=Ns,Ko.CycleSourceTree=Cs,Ko.DocumentScroll=Ts,Ko.InfiniteScroll=As,Ko.TreeParentCollapsed=Ls,Ko.AllParentsCollapsed=js,Ko.AnyParentsCollapsed=Os,zs.className="DiagramHelper",d.Object.defineProperties(Ys.prototype,{point:{get:function(){return this.l},set:function(t){this.l=t}},shifted:{get:function(){return this.u},set:function(t){this.u=t}}});var Xs,qs,Us,Ks,Hs,_s,Ws,$s,Js,Zs,Qs="DraggingInfo";function ta(t,e,i){this.node=t,this.info=e,this.$v=i}function ea(){this.reset()}function ia(t){1<arguments.length&&w("Palette constructor can only take one optional argument, the DIV HTML element or its id."),Ko.call(this,t),na(this)}function na(t){t.allowDragOut=!0,t.allowMove=!1,t.isReadOnly=!0,t.contentAlignment=oe,t.layout=new hd}function oa(t){1<arguments.length&&w("Overview constructor can only take one optional argument, the DIV HTML element or its id."),Ko.call(this,t);var e=this;this.animationManager.isEnabled=!1,this.Sb=!0,this.Ka=null,this.wl=this.vl=!1,this.I=this.T=!0,this.eb=0,this.u=!1,this.fm=null,this.Ty("drawShadows",!1);var i=new Lu,n=new Nl;n.stroke="magenta",n.strokeWidth=2,n.fill="transparent",n.name="BOXSHAPE",i.selectable=!0,i.selectionAdorned=!1,i.selectionObjectName="BOXSHAPE",i.locationObjectName="BOXSHAPE",i.resizeObjectName="BOXSHAPE",i.cursor="move",i.add(n),this.l=i,this.allowDelete=this.allowCopy=!1,this.allowSelect=!0,this.autoScrollRegion=new Qt(0,0,0,0),this.la.h(0,0),this.toolManager.Ya("Dragging",new aa,this.toolManager.mouseMoveTools),this.click=function(){var t=e.observed;if(null!==t){var i=t.viewportBounds,n=e.lastInput.documentPoint;t.position=new pt(n.x-i.width/2,n.y-i.height/2)}},this.Xh=function(){e.Na(),sa(e)},this.Wh=function(){null!==e.observed&&(e.Na(),e.M())},this.Sc=function(){1>e.updateDelay?e.M():e.u||(e.u=!0,setTimeout((function(){return e.redraw()}),e.updateDelay))},this.Od=function(){null!==e.observed&&sa(e)},this.autoScale=bs,this.Sb=!1}function ra(t){var e=t.observed;if(null!==e){var i=t.drawsTemporaryLayers,n=t.drawsGrid&&i,o=e.grid;n&&null!==o&&o.visible&&!isNaN(o.width)&&!isNaN(o.height)&&(o=zt.alloc().assign(t.viewportBounds).Rc(e.viewportBounds),qr(e,o),zt.free(o),Sr(e));var r=t.sb;r.reset(),1!==t.scale&&r.scale(t.scale),0===t.position.x&&0===t.position.y||r.translate(-t.position.x,-t.position.y),o=t.Gb,o.scale(t.Tb,t.Tb),o.transform(r.m11,r.m12,r.m21,r.m22,r.dx,r.dy),e=e.Ma.j,r=e.length;for(var s=0;s<r;s++){var a=e[s],h=t;if(a.visible&&0!==a.opacity){var l=a.diagram.grid.part;if(!i&&a.isTemporary)n&&l.layer===a&&(a=Xo(a,o),l.mc(o,h),o.globalAlpha=a);else{for(var u=Xo(a,o),c=h.scale,f=zt.alloc(),d=a.Ea.j,p=d.length,g=0;g<p;g++){var y=d[g];(n||y!==l)&&a.dj(o,y,h,null,c,f,!1)}zt.free(f),o.globalAlpha=u}}}}}function sa(t){var e=t.box;if(null!==e){var i=t.observed;if(null!==i){t.Dc=!0,i=i.viewportBounds;var n=e.selectionObject,o=Bt.alloc();o.h(i.width,i.height),n.desiredSize=o,Bt.free(o),t=2/t.scale,n instanceof Nl&&(n.strokeWidth=t),e.location=new pt(i.x-t/2,i.y-t/2),e.isSelected=!0}}}function aa(){Gi.call(this),this.l=null}function ha(){ot(this),this.C=fs,this.eb=this.I=this.u=!0,this.T=this.Ka=this.Sc=this.La=!1,this.Ki=this.l=null,this.Od=1.05,this.bv=NaN,this.yx=null,this.Bv=NaN,this.Av=$t,this.Cc=!0,this.rg=null,this.Tc=200}function la(t,e,i){if(e.isVisible())return i;if(e instanceof Qu)la(t,e.adornedPart,i);else if(e instanceof Nc){var n=e.fromNode;null!==n&&la(t,n,i),e=e.toNode,null!==e&&la(t,e,i)}else e instanceof ec&&(n=e.labeledLink,null!==n&&la(t,n,i),n=e.Fg(),null!==n&&(n.isTreeExpanded||n.wasTreeExpanded||i.push(n),la(t,n,i))),e=e.containingGroup,null!==e&&(e.isSubGraphExpanded||e.wasSubGraphExpanded||i.push(e),la(t,e,i));return i}function ua(t){var e=j();for(t=t.iterator;t.next();){var i=t.value;i instanceof Nc||e.push(i)}t=new nt,i=e.length;for(var n=0;n<i;n++){for(var o=e[n],r=!0,s=0;s<i;s++)if(o.Kd(e[s])){r=!1;break}r&&t.add(o)}return O(e),t}function ca(){ot(this),this.F=4225027,this.hb=1,this.og=null,this.oa="",this.ec=this.mb=null,this.la=new pt(NaN,NaN).freeze(),this.Xc=Tt,this.fg=kt,this.eg=Ct,this.sb=new Ke,this.Zh=new Ke,this.cg=new Ke,this.Aa=this.ql=1,this.Yb=0,this.De=Ks,this.jh=Re,this.qc=new zt(NaN,NaN,NaN,NaN).freeze(),this.xb=new zt(NaN,NaN,NaN,NaN).freeze(),this.rc=new zt(0,0,NaN,NaN).freeze(),this.O=this.xp=this.yp=null,this.$k=this.yb=Ce,this.Jp=0,this.Kp=1,this.Rg=0,this.zn=1,this.aq=null,this.Qp=-1/0,this.am=0,this.bm=At,this.cm=tf,this.oi="",this.fb=this.N=null,this.dl=-1,this.em=this.Za=this.ni=this.im=null,this.Os=qs,this.Mp=this.Mg=this.ak=null}function fa(t){null===t.N&&(t.N=new Ga)}function da(t,e,i){var n=t.ij();if(null!==n)for(var o=t.fb.iterator;o.next();){var r=o.value,s=null;if(null!==r.sourceName){if(s=fp(r,n,t),null===s)continue;r.jr(t,s,i,null)}else if(r.isToModel){var a=e.diagram;null===a||a.skipsModelSourceBindings||r.jr(t,a.model.modelData,i,n)}else{if(a=n.data,null===a)continue;var h=e.diagram;null===h||h.skipsModelSourceBindings||r.jr(t,a,i,n)}s===t&&(a=n.Gt(r.wj),null!==a&&r.Tw(a,s,i))}}function pa(t,e,i,n,o){var r=t.qc,s=t.cg;s.reset(),ba(t,s,e,i,n,o),t.cg=s,r.h(e,i,n,o),s.Tt()||s.Pw(r)}function ga(t,e,i,n){return!1!==t.pickable&&(n.multiply(t.transform),i?t.Mc(e,n):t.Jh(e,n))}function ya(t,e,i,n,o){if(t.xb.h(e,i,n,o),!t.desiredSize.s()){var r=t.qc;i=t.jh,e=i.right+i.left;var s=i.top+i.bottom;switch(i=r.width+e,r=r.height+s,n+=e,o+=s,e=ka(t,!0),i===n&&r===o&&(e=qs),e){case qs:(i>n||r>o)&&(ja(t,!0),t.measure(i>n?n:i,r>o?o:r,0,0));break;case Xs:ja(t,!0),t.measure(n,o,0,0);break;case Hs:ja(t,!0),t.measure(n,r,0,0);break;case _s:ja(t,!0),t.measure(i,o,0,0)}}}function ma(t,e,i){var n=t.xb,o=t.rc;null!==t.ec&&(va(t,e,t.ec,!0,!0,o,n),t.ec instanceof eh&&t.ec.type===mh?(e.beginPath(),e.rect(n.x,n.y,n.width,n.height),e.Je(t.ec)):e.fillRect(n.x,n.y,n.width,n.height)),null!==t.mb&&(va(t,e,t.mb,!0,!1,o,n),t.mb instanceof eh&&t.mb.type===mh?(e.beginPath(),e.rect(n.x,n.y,n.width,n.height),e.Je(t.mb)):e.fillRect(n.x,n.y,n.width,n.height)),t.ej(e,i)}function va(t,e,i,n,o,r,s){if(null!==i){var a=1,h=1;if("string"===typeof i)n?e.fillStyle=i:e.strokeStyle=i;else if(i.type===gh)n?e.fillStyle=i.color:e.strokeStyle=i.color;else{var l=0;if(t instanceof Nl&&(l=t.strokeWidth),a=r.width,h=r.height,o?(a=s.width,h=s.height):n||(a+=l,h+=l),(r=e instanceof Za)&&i.ke&&(i.type===vh||i.gl===a&&i.Au===h))var u=i.ke;else{var c=0,f=0,d=0,p=0,g=0,y=0;if(y=g=0,o?(g=s.x,y=s.y):n||(g-=l/2,y-=l/2),c=i.start.x*a+i.start.offsetX,f=i.start.y*h+i.start.offsetY,d=i.end.x*a+i.end.offsetX,p=i.end.y*h+i.end.offsetY,c+=g,d+=g,f+=y,p+=y,i.type===yh)u=e.createLinearGradient(c,f,d,p);else if(i.type===mh)y=isNaN(i.endRadius)?Math.max(a,h)/2:i.endRadius,isNaN(i.startRadius)?(g=0,y=Math.max(a,h)/2):g=i.startRadius,u=e.createRadialGradient(c,f,g,d,p,y);else if(i.type===vh)try{u=e.createPattern(i.pattern,"repeat")}catch(v){u=null}if(i.type!==vh&&(o=i.colorStops,null!==o))for(o=o.iterator;o.next();)u.addColorStop(o.key,o.value);if(r&&(i.ke=u,null!==u&&(i.gl=a,i.Au=h),null===u&&i.type===vh&&-1!==i.gl)){i.gl=-1;var m=t.diagram;null!==m&&-1===i.gl&&x((function(){m.redraw()}),600)}}n?e.fillStyle=u:e.strokeStyle=u}}}function xa(t){if(0!==(2048&t.F)===!0){var e=t.sb;if(e.reset(),!t.xb.s()||!t.qc.s())return void Ta(t,!1);if(e.translate(t.xb.x-t.qc.x,t.xb.y-t.qc.y),1!==t.scale||0!==t.angle){var i=t.naturalBounds;ba(t,e,i.x,i.y,i.width,i.height)}Ta(t,!1),Aa(t,!0)}0!==(4096&t.F)===!0&&(e=t.panel,null===e?(t.Zh.set(t.sb),t.ql=t.scale,Aa(t,!1)):null!==e.Fd&&(i=t.Zh,i.reset(),e.he()?i.multiply(e.Zh):null!==e.panel&&i.multiply(e.panel.Zh),i.multiply(t.sb),t.ql=t.scale*e.ql,Aa(t,!1)))}function ba(t,e,i,n,o,r){if(1!==t.scale&&e.scale(t.scale),0!==t.Yb){var s=ae;t.Ff()&&t.locationSpot.kb()&&(s=t.locationSpot);var a=pt.alloc();if(t instanceof Lu&&t.locationObject!==t)for(i=t.locationObject,n=i.naturalBounds,a.Uk(n.x,n.y,n.width,n.height,s),i.cg.ta(a),a.offset(-i.measuredBounds.x,-i.measuredBounds.y),s=i.panel;null!==s&&s!==t;)s.cg.ta(a),a.offset(-s.measuredBounds.x,-s.measuredBounds.y),s=s.panel;else a.Uk(i,n,o,r,s);e.rotate(t.Yb,a.x,a.y),pt.free(a)}}function wa(t){if(!Oa(t)){var e=t.panel;null!==e?e.o():t.Ff()&&(e=t.diagram,null!==e&&(e.wd.add(t),t instanceof ec&&t.sd(),e.Db())),Da(t,!0)}}function ka(t,e){var i=t.stretch,n=t.panel;return null!==n&&n.type===Uh.Table?Ma(t,n.getRowDefinition(t.row),n.getColumnDefinition(t.column),e):null!==n&&n.type===Uh.Auto&&n.tb()===t?Sa(t,Xs,e):i===Ks?null!==n?n.type===Uh.Spot&&n.tb()===t?Sa(t,Xs,e):(i=n.defaultStretch,Sa(t,i===Ks?qs:i,e)):Sa(t,qs,e):Sa(t,i,e)}function Ma(t,e,i,n){var o=t.stretch;if(o!==Ks)return Sa(t,o,n);var r=o=null;switch(e.stretch){case _s:r=!0;break;case Xs:r=!0}switch(i.stretch){case Hs:o=!0;break;case Xs:o=!0}return e=t.panel.defaultStretch,null===o&&(o=e===Hs||e===Xs),null===r&&(r=e===_s||e===Xs),Sa(t,!0===o&&!0===r?Xs:!0===o?Hs:!0===r?_s:qs,n)}function Sa(t,e,i){if(i)return e;if(e===qs)return qs;if(i=t.desiredSize,i.s())return qs;if(t=t.angle,!isNaN(i.width))if(90!==t&&270!==t){if(e===Hs)return qs;if(e===Xs)return _s}else{if(e===_s)return qs;if(e===Xs)return Hs}if(!isNaN(i.height))if(90!==t&&270!==t){if(e===_s)return qs;if(e===Xs)return Hs}else{if(e===Hs)return qs;if(e===Xs)return _s}return e}function Pa(t,e){t.F=e?512|t.F:-513&t.F}function Na(t){return 0!==(1024&t.F)}function Ca(t,e){t.F=e?1024|t.F:-1025&t.F}function Ta(t,e){t.F=e?2048|t.F:-2049&t.F}function Aa(t,e){t.F=e?4096|t.F:-4097&t.F}function La(t){return 0!==(8192&t.F)}function ja(t,e){t.F=e?8192|t.F:-8193&t.F}function Oa(t){return 0!==(16384&t.F)}function Da(t,e){t.F=e?16384|t.F:-16385&t.F}function Fa(t){var e=t.part;if(e instanceof ec&&(null!==t.portId||t===e.port)){var i=e.diagram;null===i||i.undoManager.isUndoingRedoing||oc(e,t)}}function Ba(t){var e=t.diagram;null===e||e.undoManager.isUndoingRedoing||(t instanceof Uh?t instanceof ec?t.sd():t.an(t,(function(t){Fa(t)})):Fa(t))}function Ia(t,e){for(var i=1;i<arguments.length;++i);i=arguments;var n=null,o=null;if("function"===typeof t)o=t;else if("string"===typeof t){var r=Va.G(t);"function"===typeof r?(i=T(arguments),n=r(i),N(n)||w('GraphObject.make invoked object builder "'+t+'", but it did not return an Object')):o=y.go[t]}if(null===n&&(void 0!==o&&null!==o&&o.constructor||w("GraphObject.make requires a class function or GoJS class name or name of an object builder, not: "+t),n=new o),o=1,n instanceof Ko&&1<i.length){r=n;var s=i[1];("string"===typeof s||s instanceof HTMLDivElement)&&(Gs(r,s),o++)}for(;o<i.length;o++)r=i[o],void 0===r?w("Undefined value at argument "+o+" for object being constructed by GraphObject.make: "+n):Ea(n,r);return n}function Ea(t,e){if("string"===typeof e)if(t instanceof Il)t.text=e;else if(t instanceof Nl)t.figure=e;else if(t instanceof cu)t.source=e;else if(t instanceof Uh)e=bl.G(e),null!==e&&(t.type=e);else if(t instanceof eh){var i=K(eh,e);null!==i?t.type=i:w("Unknown Brush type as an argument to GraphObject.make: "+e)}else t instanceof We?(e=K(We,e),null!==e&&(t.type=e)):t instanceof fi&&(e=K(fi,e),null!==e&&(t.type=e));else if(e instanceof ca)t instanceof Uh||w("A GraphObject can only be added to a Panel, not to: "+t),t.add(e);else if(e instanceof wl){var n;e.isRow&&"function"===typeof t.getRowDefinition?n=t.getRowDefinition(e.index):e.isRow||"function"!==typeof t.getColumnDefinition||(n=t.getColumnDefinition(e.index)),n instanceof wl?n.gy(e):w("A RowColumnDefinition can only be added to an object that implements getRowDefinition/getColumnDefinition, not to: "+t)}else if(e instanceof U)"function"===typeof t.jb&&t.jb(e);else if(e instanceof Lh)t.type=e;else if(e instanceof cp)t instanceof ca||t instanceof wl?t.bind(e):w("A Binding can only be applied to a GraphObject or RowColumnDefinition, not to: "+t);else if(e instanceof Eo)t instanceof ca?t.Qw(e):w("An AnimationTrigger can only be applied to a GraphObject, not to: "+t);else if(e instanceof ci)t instanceof We?t.figures.add(e):w("A PathFigure can only be added to a Geometry, not to: "+t);else if(e instanceof fi)t instanceof ci?t.segments.add(e):w("A PathSegment can only be added to a PathFigure, not to: "+t);else if(e instanceof zf)t instanceof Ko||t instanceof bc?t.layout=e:w("A Layout can only be assigned to a Diagram or a Group, not to: "+t);else if(Array.isArray(e))for(i=0;i<e.length;i++)Ea(t,e[i]);else if("object"===typeof e&&null!==e)if(t instanceof eh){for(var o in i=new _,e)n=parseFloat(o),isNaN(n)?i[o]=e[o]:t.addColorStop(n,e[o]);Tr(t,i)}else if(t instanceof wl){for(i in void 0!==e.row?(o=e.row,(void 0===o||null===o||1/0===o||isNaN(o)||0>o)&&w("Must specify non-negative integer row for RowColumnDefinition "+e+", not: "+o),t.isRow=!0,t.index=o):void 0!==e.column&&(o=e.column,(void 0===o||null===o||1/0===o||isNaN(o)||0>o)&&w("Must specify non-negative integer column for RowColumnDefinition "+e+", not: "+o),t.isRow=!1,t.index=o),o=new _,e)"row"!==i&&"column"!==i&&(o[i]=e[i]);Tr(t,o)}else Tr(t,e);else w('Unknown initializer "'+e+'" for object being constructed by GraphObject.make: '+t)}function Ra(t,e){Va.add(t,e)}function za(t,e,i){void 0===i&&(i=null);var n=t[1];if("function"===typeof i?i(n):"string"===typeof n)return t.splice(1,1),n;if(void 0===e)throw Error("no "+("function"===typeof i?"satisfactory":"string")+" argument for GraphObject builder "+t[0]);return e}Ys.className="DraggingInfo",ta.className="DraggingNodeInfoPair",ea.prototype.reset=function(){this.isGridSnapEnabled=!1,this.isGridSnapRealtime=!0,this.gridSnapCellSize=new Bt(NaN,NaN).freeze(),this.gridSnapCellSpot=ne,this.gridSnapOrigin=new pt(NaN,NaN).freeze(),this.groupsSnapMembers=this.dragsTree=this.dragsLink=!1,this.dragsMembers=this.groupsAlwaysMove=!0},ea.className="DraggingOptions",f(ia,Ko),ia.prototype.reset=function(){Ko.prototype.reset.call(this),na(this)},ia.className="Palette",f(oa,Ko),oa.prototype.computePixelRatio=function(){return 1},oa.prototype.redraw=function(){if(this.u&&1<=this.updateDelay){this.u=!1;var t=this.wa,e=this.Gb;if(null!==t&&null!==e){if(jr(this),null===this.fm){var i=new Ja(null);i.width=t.width,i.height=t.height,this.fm=i}try{this.wa=this.fm,this.Gb=this.wa.context,this.Gb.uc(!0),this.Gb.setTransform(1,0,0,1,0,0),this.Gb.clearRect(0,0,this.wa.width,this.wa.height),ra(this)}finally{this.wa=t,this.Gb=e}}}Ko.prototype.redraw.call(this)},oa.prototype.mc=function(){if(null===this.Fa&&w("No div specified"),null===this.wa&&w("No canvas specified"),!(this.wa instanceof qa)&&(ju(this.box),this.Dc)){var t=this.observed;if(null!==t&&!t.animationManager.defaultAnimation.isAnimating&&t.pj){jr(this);var e=this.wa;t=this.Gb,t.uc(!0),t.setTransform(1,0,0,1,0,0),t.clearRect(0,0,e.width,e.height),1>this.updateDelay?ra(this):null!==this.fm&&(t.drawImage(this.fm.Ja,0,0),e=this.sb,e.reset(),1!==this.scale&&e.scale(this.scale),0===this.position.x&&0===this.position.y||e.translate(-this.position.x,-this.position.y),t.scale(this.Tb,this.Tb),t.transform(e.m11,e.m12,e.m21,e.m22,e.dx,e.dy)),e=this.Ma.j;for(var i=e.length,n=0;n<i;n++)e[n].mc(t,this);this.Dc=this.xi=!1}}},oa.prototype.computeBounds=function(){var t=this.observed;if(null===t)return $t;var e=t.documentBounds.copy();return e.Rc(t.viewportBounds),e},oa.prototype.invalidateViewport=function(){!0!==this.Dc&&(this.Dc=!0,this.Db())},oa.prototype.onViewportBoundsChanged=function(t,e,i,n){this.Sb||(Lr(this),this.M(),Ar(this),this.Na(),sa(this),this.Ic.scale=i,this.Ic.position.x=t.x,this.Ic.position.y=t.y,this.Ic.bounds.assign(t),this.Ic.hw=n,this.R("ViewportBoundsChanged",this.Ic,t))},d.Object.defineProperties(oa.prototype,{observed:{get:function(){return this.Ka},set:function(t){var e=this.Ka;if(t instanceof oa&&w("Overview.observed Diagram may not be an Overview itself: "+t),e!==t){if(null!==e&&(this.remove(this.box),e.Lm("ViewportBoundsChanged",this.Xh),e.Lm("DocumentBoundsChanged",this.Wh),e.Lm("InvalidateDraw",this.Sc),e.Lm("AnimationFinished",this.Od)),this.Ka=t,null!==t&&(t.kk("ViewportBoundsChanged",this.Xh),t.kk("DocumentBoundsChanged",this.Wh),t.kk("InvalidateDraw",this.Sc),t.kk("AnimationFinished",this.Od),this.add(this.box)),this.Na(),null===t){this.fm=null;var i=this.wa,n=this.Gb;i&&n&&(n.setTransform(1,0,0,1,0,0),n.clearRect(0,0,i.width,i.height))}else this.Sc(null),sa(this),this.M();this.g("observed",e,t)}}},box:{get:function(){return this.l},set:function(t){var e=this.l;e!==t&&(this.l=t,this.remove(e),this.add(this.l),sa(this),this.g("box",e,t))}},drawsTemporaryLayers:{get:function(){return this.T},set:function(t){this.T!==t&&(this.T=t,this.redraw())}},drawsGrid:{get:function(){return this.I},set:function(t){this.I!==t&&(this.I=t,this.redraw())}},updateDelay:{get:function(){return this.eb},set:function(t){0>t&&(t=0),this.eb!==t&&(this.eb=t)}}}),oa.className="Overview",f(aa,Gi),aa.prototype.canStart=function(){if(!this.isEnabled)return!1;var t=this.diagram;if(null===t||!t.allowMove||!t.allowSelect)return!1;var e=t.observed;if(null===e)return!1;var i=t.lastInput;return!(!i.left||t.currentTool!==this&&(!this.isBeyondDragSize()||i.isTouchEvent&&i.timestamp-t.firstInput.timestamp<this.delay))&&(null===this.findDraggablePart()&&(i=e.viewportBounds,this.l=new pt(i.width/2,i.height/2),t=t.firstInput.documentPoint,e.position=new pt(t.x-this.l.x,t.y-this.l.y)),!0)},aa.prototype.doActivate=function(){this.l=null,Gi.prototype.doActivate.call(this)},aa.prototype.doUpdateCursor=function(){var t=this.diagram,e=t.box;null!==e&&e.cursor&&(t.currentCursor=e.cursor)},aa.prototype.moveParts=function(){var t=this.diagram,e=t.observed;if(null!==e){var i=t.box;if(null!==i){if(null===this.l){var n=t.firstInput.documentPoint;i=i.location,this.l=new pt(n.x-i.x,n.y-i.y)}t=t.lastInput.documentPoint,e.position=new pt(t.x-this.l.x,t.y-this.l.y)}}},aa.className="OverviewDraggingTool",ha.prototype.toString=function(){return"CommandHandler"},ha.prototype.ee=function(t){this.C=t},ha.prototype.doKeyDown=function(){var t=this.diagram,e=t.lastInput,i=Y?e.meta:e.control,n=e.shift,o=e.alt,r=e.key;!i||"C"!==r&&"Insert"!==r?i&&"X"===r||n&&"Del"===r?this.canCutSelection()&&this.cutSelection():i&&"V"===r||n&&"Insert"===r?this.canPasteSelection()&&this.pasteSelection():i&&"Y"===r||o&&n&&"Backspace"===r?this.canRedo()&&this.redo():i&&"Z"===r||o&&"Backspace"===r?this.canUndo()&&this.undo():"Del"===r||"Backspace"===r?this.canDeleteSelection()&&this.deleteSelection():i&&"A"===r?this.canSelectAll()&&this.selectAll():"Esc"===r?this.canStopCommand()&&this.stopCommand():"Up"===r?t.allowVerticalScroll&&(i?t.scroll("pixel","up"):t.scroll("line","up")):"Down"===r?t.allowVerticalScroll&&(i?t.scroll("pixel","down"):t.scroll("line","down")):"Left"===r?t.allowHorizontalScroll&&(i?t.scroll("pixel","left"):t.scroll("line","left")):"Right"===r?t.allowHorizontalScroll&&(i?t.scroll("pixel","right"):t.scroll("line","right")):"PageUp"===r?n&&t.allowHorizontalScroll?t.scroll("page","left"):t.allowVerticalScroll&&t.scroll("page","up"):"PageDown"===r?n&&t.allowHorizontalScroll?t.scroll("page","right"):t.allowVerticalScroll&&t.scroll("page","down"):"Home"===r?i&&t.allowVerticalScroll?t.scroll("document","up"):!i&&t.allowHorizontalScroll&&t.scroll("document","left"):"End"===r?i&&t.allowVerticalScroll?t.scroll("document","down"):!i&&t.allowHorizontalScroll&&t.scroll("document","right"):" "===r?this.canScrollToPart()&&this.scrollToPart():"Subtract"===r?this.canDecreaseZoom()&&this.decreaseZoom():"Add"===r?this.canIncreaseZoom()&&this.increaseZoom():i&&"0"===r?this.canResetZoom()&&this.resetZoom():n&&"Z"===r?this.canZoomToFit()&&this.zoomToFit():i&&!n&&"G"===r?this.canGroupSelection()&&this.groupSelection():i&&n&&"G"===r?this.canUngroupSelection()&&this.ungroupSelection():"F2"===r||e.event&&"F2"===e.event.key?this.canEditTextBlock()&&this.editTextBlock():"ContextMenu"===r||e.event&&"ContextMenu"===e.event.key?this.canShowContextMenu()&&this.showContextMenu():e.bubbles=!0:this.canCopySelection()&&this.copySelection()},ha.prototype.doKeyUp=function(){this.diagram.lastInput.bubbles=!0},ha.prototype.stopCommand=function(){var t=this.diagram,e=t.currentTool;e instanceof Di&&t.allowSelect&&t.clearSelection(),null!==e&&e.doCancel()},ha.prototype.canStopCommand=function(){return!0},ha.prototype.selectAll=function(){var t=this.diagram;t.M();try{t.currentCursor="wait",t.R("ChangingSelection",t.selection);for(var e=t.parts;e.next();)e.value.isSelected=!0;for(var i=t.nodes;i.next();)i.value.isSelected=!0;for(var n=t.links;n.next();)n.value.isSelected=!0}finally{t.R("ChangedSelection",t.selection),t.currentCursor=""}},ha.prototype.canSelectAll=function(){return this.diagram.allowSelect},ha.prototype.deleteSelection=function(){var t=this.diagram;try{t.currentCursor="wait",t.R("ChangingSelection",t.selection),t.va("Delete"),t.R("SelectionDeleting",t.selection);for(var e=new nt,i=t.selection.iterator;i.next();)Ju(e,i.value,!0,this.deletesTree?1/0:0,!!this.deletesConnectedLinks&&null,(function(t){return t.canDelete()}));t.gu(e,!0),t.R("SelectionDeleted",e)}finally{t.Xa("Delete"),t.R("ChangedSelection",t.selection),t.currentCursor=""}},ha.prototype.canDeleteSelection=function(){var t=this.diagram;return!(t.isReadOnly||t.isModelReadOnly||!t.allowDelete||0===t.selection.count)},ha.prototype.copySelection=function(){var t=this.diagram,e=new nt;for(t=t.selection.iterator;t.next();)Ju(e,t.value,!0,this.copiesTree?1/0:0,this.copiesConnectedLinks,(function(t){return t.canCopy()}));this.copyToClipboard(e)},ha.prototype.canCopySelection=function(){var t=this.diagram;return!(!t.allowCopy||!t.allowClipboard||0===t.selection.count)},ha.prototype.cutSelection=function(){this.copySelection(),this.deleteSelection()},ha.prototype.canCutSelection=function(){var t=this.diagram;return!(t.isReadOnly||t.isModelReadOnly||!t.allowCopy||!t.allowDelete||!t.allowClipboard||0===t.selection.count)},ha.prototype.copyToClipboard=function(t){var e=this.diagram,i=null;if(null===t)ms=null,vs="";else{i=e.model;var n=!1,o=!1,r=null;try{i.Em()&&(n=i.sk,i.sk=this.copiesParentKey),i.Ck()&&(o=i.rk,i.rk=this.copiesGroupKey),r=e.tk(t,null,!0)}finally{i.Em()&&(i.sk=n),i.Ck()&&(i.rk=o),i=new et,i.addAll(r),ms=i,vs=e.model.dataFormat}}e.R("ClipboardChanged",i)},ha.prototype.pasteFromClipboard=function(){var t=new nt,e=ms;if(null===e)return t;var i=this.diagram;if(vs!==i.model.dataFormat)return t;var n=i.model,o=!1,r=!1,s=null;try{n.Em()&&(o=n.sk,n.sk=this.copiesParentKey),n.Ck()&&(r=n.rk,n.rk=this.copiesGroupKey),s=i.tk(e,i,!1)}finally{for(n.Em()&&(n.sk=o),n.Ck()&&(n.rk=r),e=s.iterator;e.next();)i=e.value,n=e.key,i.location.s()||(n.location.s()?i.location=n.location:!i.position.s()&&n.position.s()&&(i.position=n.position)),t.add(i)}return t},ha.prototype.pasteSelection=function(t){void 0===t&&(t=null);var e=this.diagram;try{e.currentCursor="wait",e.R("ChangingSelection",e.selection),e.va("Paste");var i=this.pasteFromClipboard();0<i.count&&e.clearSelection(!0);for(var n=i.iterator;n.next();)n.value.isSelected=!0;if(null!==t){var o=e.computePartsBounds(e.selection);if(o.s()){var r=this.computeEffectiveCollection(e.selection,e.kl);Ir(e,r,new pt(t.x-o.centerX,t.y-o.centerY),e.kl,!1)}}e.R("ClipboardPasted",i)}finally{e.Xa("Paste"),e.R("ChangedSelection",e.selection),e.currentCursor=""}},ha.prototype.canPasteSelection=function(){var t=this.diagram;return!(t.isReadOnly||t.isModelReadOnly||!t.allowInsert||!t.allowClipboard||null===ms||0===ms.count||vs!==t.model.dataFormat)},ha.prototype.undo=function(){this.diagram.undoManager.undo()},ha.prototype.canUndo=function(){var t=this.diagram;return!t.isReadOnly&&!t.isModelReadOnly&&(t.allowUndo&&t.undoManager.canUndo())},ha.prototype.redo=function(){this.diagram.undoManager.redo()},ha.prototype.canRedo=function(){var t=this.diagram;return!t.isReadOnly&&!t.isModelReadOnly&&(t.allowUndo&&t.undoManager.canRedo())},ha.prototype.decreaseZoom=function(t){void 0===t&&(t=1/this.zoomFactor);var e=this.diagram;e.autoScale===xs&&(t=e.scale*t,t<e.minScale||t>e.maxScale||(e.scale=t))},ha.prototype.canDecreaseZoom=function(t){void 0===t&&(t=1/this.zoomFactor);var e=this.diagram;return e.autoScale===xs&&(t=e.scale*t,!(t<e.minScale||t>e.maxScale)&&e.allowZoom)},ha.prototype.increaseZoom=function(t){void 0===t&&(t=this.zoomFactor);var e=this.diagram;e.autoScale===xs&&(t=e.scale*t,t<e.minScale||t>e.maxScale||(e.scale=t))},ha.prototype.canIncreaseZoom=function(t){void 0===t&&(t=this.zoomFactor);var e=this.diagram;return e.autoScale===xs&&(t=e.scale*t,!(t<e.minScale||t>e.maxScale)&&e.allowZoom)},ha.prototype.resetZoom=function(t){void 0===t&&(t=this.defaultScale);var e=this.diagram;t<e.minScale||t>e.maxScale||(e.scale=t)},ha.prototype.canResetZoom=function(t){void 0===t&&(t=this.defaultScale);var e=this.diagram;return!(t<e.minScale||t>e.maxScale)&&e.allowZoom},ha.prototype.zoomToFit=function(){var t=this.diagram,e=t.animationManager;e.Bc(),t.redraw();var i=t.position,n=t.scale;uo(e,"Zoom To Fit"),this.isZoomToFitRestoreEnabled&&n===this.Bv&&!isNaN(this.bv)&&t.documentBounds.w(this.Av)?(t.scale=this.bv,t.position=this.yx,this.Bv=NaN,this.Av=$t):(this.bv=n,this.yx=i.copy(),t.zoomToFit(),this.Bv=t.scale,this.Av=t.documentBounds.copy()),fo(e)},ha.prototype.canZoomToFit=function(){return this.diagram.allowZoom},ha.prototype.scrollToPart=function(t){void 0===t&&(t=null);var e=this.diagram;if(e.Ta(),null===t){try{null!==this.rg&&(this.rg.next()?t=this.rg.value:this.rg=null)}catch(h){this.rg=null}null===t&&(0<e.highlighteds.count?this.rg=e.highlighteds.iterator:0<e.selection.count&&(this.rg=e.selection.iterator),null!==this.rg&&this.rg.next()&&(t=this.rg.value))}if(null!==t){var i=e.animationManager;uo(i,"Scroll To Part");var n=this.scrollToPartPause;if(0<n){var o=la(this,t,[t]);if(1===o.length)e.va(),e.At(t.actualBounds),e.Xa("Scroll To Part");else{var r=function(){e.va();for(var t=o.pop();0<o.length&&t instanceof ec&&t.isTreeExpanded&&(!(t instanceof bc)||t.isSubGraphExpanded);)t=o.pop();0<o.length?(t instanceof Lu&&e.Aw(t.actualBounds),t instanceof ec&&!t.isTreeExpanded&&(t.isTreeExpanded=!0),t instanceof bc&&!t.isSubGraphExpanded&&(t.isSubGraphExpanded=!0)):(t instanceof Lu&&e.At(t.actualBounds),e.Lm("LayoutCompleted",s)),e.Xa("Scroll To Part")},s=function(){x(r,(i.isEnabled?i.duration:0)+n)};e.kk("LayoutCompleted",s),r()}}else{var a=e.position.copy();e.At(t.actualBounds),a.Qa(e.position)&&i.Bc()}}},ha.prototype.canScrollToPart=function(t){return void 0===t&&(t=null),(null===t||t instanceof Lu)&&(t=this.diagram,(0!==t.selection.count||0!==t.highlighteds.count)&&(t.allowHorizontalScroll&&t.allowVerticalScroll))},ha.prototype.collapseTree=function(t){void 0===t&&(t=null);var e=this.diagram;try{e.va("Collapse Tree"),uo(e.animationManager,"Collapse Tree");var i=new et;if(null!==t&&t.isTreeExpanded)t.collapseTree(),i.add(t);else if(null===t)for(var n=e.selection.iterator;n.next();){var o=n.value;o instanceof ec&&o.isTreeExpanded&&(o.collapseTree(),i.add(o))}e.R("TreeCollapsed",i)}finally{e.Xa("Collapse Tree")}},ha.prototype.canCollapseTree=function(t){void 0===t&&(t=null);var e=this.diagram;if(e.isReadOnly)return!1;if(null!==t){if(!(t instanceof ec&&t.isTreeExpanded))return!1;if(0<t.Hq().count)return!0}else for(t=e.selection.iterator;t.next();)if(e=t.value,e instanceof ec&&e.isTreeExpanded&&0<e.Hq().count)return!0;return!1},ha.prototype.expandTree=function(t){void 0===t&&(t=null);var e=this.diagram;try{e.va("Expand Tree"),uo(e.animationManager,"Expand Tree");var i=new et;if(null===t||t.isTreeExpanded){if(null===t)for(var n=e.selection.iterator;n.next();){var o=n.value;o instanceof ec&&!o.isTreeExpanded&&(o.expandTree(),i.add(o))}}else t.expandTree(),i.add(t);e.R("TreeExpanded",i)}finally{e.Xa("Expand Tree")}},ha.prototype.canExpandTree=function(t){void 0===t&&(t=null);var e=this.diagram;if(e.isReadOnly)return!1;if(null!==t){if(!(t instanceof ec)||t.isTreeExpanded)return!1;if(0<t.Hq().count)return!0}else for(t=e.selection.iterator;t.next();)if(e=t.value,e instanceof ec&&!e.isTreeExpanded&&0<e.Hq().count)return!0;return!1},ha.prototype.groupSelection=function(){var t=this.diagram,e=t.model;if(e.Dk()){var i=this.archetypeGroupData;if(null!==i){var n=null;try{t.currentCursor="wait",t.R("ChangingSelection",t.selection),t.va("Group");for(var o=new et,r=t.selection.iterator;r.next();){var s=r.value;s.Nc()&&s.canGroup()&&o.add(s)}for(var a=new et,h=o.iterator;h.next();){var l=h.value;r=!1;for(var u=o.iterator;u.next();)if(l.Kd(u.value)){r=!0;break}r||a.add(l)}if(0<a.count){var c=a.first().containingGroup;if(null!==c)for(;null!==c;){o=!1;for(var f=a.iterator;f.next();)if(!f.value.Kd(c)){o=!0;break}if(!o)break;c=c.containingGroup}if(i instanceof bc)ul(i),n=i.copy(),null!==n&&t.add(n);else if(e.fw(i)){var d=e.copyNodeData(i);N(d)&&(e.uf(d),n=t.gj(d))}if(null!==n){null!==c&&this.isValidMember(c,n)&&(n.containingGroup=c);for(var p=a.iterator;p.next();){var g=p.value;this.isValidMember(n,g)&&(g.containingGroup=n)}t.clearSelection(!0),n.isSelected=!0}}t.R("SelectionGrouped",n)}finally{t.Xa("Group"),t.R("ChangedSelection",t.selection),t.currentCursor=""}}}},ha.prototype.canGroupSelection=function(){var t=this.diagram;if(t.isReadOnly||t.isModelReadOnly||!t.allowInsert||!t.allowGroup||!t.model.Dk()||null===this.archetypeGroupData)return!1;for(t=t.selection.iterator;t.next();){var e=t.value;if(e.Nc()&&e.canGroup())return!0}return!1},ha.prototype.isValidMember=function(t,e){if(null===e||t===e||e instanceof Nc)return!1;if(null!==t){if(t===e||t.Kd(e))return!1;var i=t.memberValidation;if(null!==i&&!i(t,e)||null===t.data&&null!==e.data||null!==t.data&&null===e.data)return!1}return i=this.memberValidation,null===i||i(t,e)},ha.prototype.ungroupSelection=function(t){void 0===t&&(t=null);var e=this.diagram,i=e.model;if(i.Dk())try{e.currentCursor="wait",e.R("ChangingSelection",e.selection),e.va("Ungroup");var n=new et;if(null!==t)n.add(t);else for(var o=e.selection.iterator;o.next();){var r=o.value;r instanceof bc&&r.canUngroup()&&n.add(r)}var s=new et;if(0<n.count){e.clearSelection(!0);for(var a=n.iterator;a.next();){var h=a.value;h.expandSubGraph();var l=h.containingGroup,u=null!==l&&null!==l.data?i.ja(l.data):void 0;s.addAll(h.memberParts);for(var c=s.iterator;c.next();){var f=c.value;if(f.isSelected=!0,!(f instanceof Nc)){var d=f.data;null!==d?i.dr(d,u):f.containingGroup=l}}e.remove(h)}}e.R("SelectionUngrouped",n,s)}finally{e.Xa("Ungroup"),e.R("ChangedSelection",e.selection),e.currentCursor=""}},ha.prototype.canUngroupSelection=function(t){void 0===t&&(t=null);var e=this.diagram;if(e.isReadOnly||e.isModelReadOnly||!e.allowDelete||!e.allowUngroup||!e.model.Dk())return!1;if(null!==t){if(!(t instanceof bc))return!1;if(t.canUngroup())return!0}else for(t=e.selection.iterator;t.next();)if(e=t.value,e instanceof bc&&e.canUngroup())return!0;return!1},ha.prototype.addTopLevelParts=function(t,e){var i=!0;for(t=ua(t).iterator;t.next();){var n=t.value;null!==n.containingGroup&&(!e||this.isValidMember(null,n)?n.containingGroup=null:i=!1)}return i},ha.prototype.collapseSubGraph=function(t){void 0===t&&(t=null);var e=this.diagram;try{e.va("Collapse SubGraph"),uo(e.animationManager,"Collapse SubGraph");var i=new et;if(null!==t&&t.isSubGraphExpanded)t.collapseSubGraph(),i.add(t);else if(null===t)for(var n=e.selection.iterator;n.next();){var o=n.value;o instanceof bc&&o.isSubGraphExpanded&&(o.collapseSubGraph(),i.add(o))}e.R("SubGraphCollapsed",i)}finally{e.Xa("Collapse SubGraph")}},ha.prototype.canCollapseSubGraph=function(t){void 0===t&&(t=null);var e=this.diagram;if(e.isReadOnly)return!1;if(null!==t)return!!(t instanceof bc&&t.isSubGraphExpanded);for(t=e.selection.iterator;t.next();)if(e=t.value,e instanceof bc&&e.isSubGraphExpanded)return!0;return!1},ha.prototype.expandSubGraph=function(t){void 0===t&&(t=null);var e=this.diagram;try{e.va("Expand SubGraph"),uo(e.animationManager,"Expand SubGraph");var i=new et;if(null===t||t.isSubGraphExpanded){if(null===t)for(var n=e.selection.iterator;n.next();){var o=n.value;o instanceof bc&&!o.isSubGraphExpanded&&(o.expandSubGraph(),i.add(o))}}else t.expandSubGraph(),i.add(t);e.R("SubGraphExpanded",i)}finally{e.Xa("Expand SubGraph")}},ha.prototype.canExpandSubGraph=function(t){void 0===t&&(t=null);var e=this.diagram;if(e.isReadOnly)return!1;if(null!==t)return t instanceof bc&&!t.isSubGraphExpanded;for(t=e.selection.iterator;t.next();)if(e=t.value,e instanceof bc&&!e.isSubGraphExpanded)return!0;return!1},ha.prototype.editTextBlock=function(t){void 0===t&&(t=null);var e=this.diagram,i=e.toolManager.findTool("TextEditing");if(null!==i){if(null===t){t=null;for(var n=e.selection.iterator;n.next();){var o=n.value;if(o.canEdit()){t=o;break}}if(null===t)return;t=t.ym((function(t){return t instanceof Il&&t.editable}))}null!==t&&(e.currentTool=null,i.textBlock=t,e.currentTool=i)}},ha.prototype.canEditTextBlock=function(t){void 0===t&&(t=null);var e=this.diagram;if(e.isReadOnly||e.isModelReadOnly||!e.allowTextEdit||null===e.toolManager.findTool("TextEditing"))return!1;if(null!==t){if(!(t instanceof Il))return!1;if(t=t.part,null!==t&&t.canEdit())return!0}else for(e=e.selection.iterator;e.next();)if(t=e.value,t.canEdit()&&(t=t.ym((function(t){return t instanceof Il&&t.editable})),null!==t))return!0;return!1},ha.prototype.showContextMenu=function(t){var e=this.diagram,i=e.toolManager.findTool("ContextMenu");if(null!==i&&(void 0===t&&(t=0<e.selection.count?e.selection.first():e),t=i.findObjectWithContextMenu(t),null!==t)){var n=e.lastInput,o=null;t instanceof ca?o=t.da(ae):e.viewportBounds.$(n.documentPoint)||(o=e.viewportBounds,o=new pt(o.x+o.width/2,o.y+o.height/2)),null!==o&&(n.viewPoint=e.gr(o),n.documentPoint=o,n.left=!1,n.right=!0,n.up=!0),e.currentTool=i,Vn(i,!1,t)}},ha.prototype.canShowContextMenu=function(t){var e=this.diagram,i=e.toolManager.findTool("ContextMenu");return null!==i&&(void 0===t&&(t=0<e.selection.count?e.selection.first():e),null!==i.findObjectWithContextMenu(t))},ha.prototype.computeEffectiveCollection=function(t,e){var i=this.diagram,n=i.toolManager.findTool("Dragging"),o=i.currentTool===n;if(void 0===e&&(e=o?n.dragOptions:i.kl),n=new dt,null===t)return n;for(var r=t.iterator;r.next();)Br(i,n,r.value,o,e);if(null!==i.draggedLink&&e.dragsLink)return n;for(r=t.iterator;r.next();)t=r.value,t instanceof Nc&&(e=t.fromNode,null===e||n.contains(e)?(e=t.toNode,null===e||n.contains(e)||n.remove(t)):n.remove(t));return n},d.Object.defineProperties(ha.prototype,{diagram:{get:function(){return this.C}},copiesClipboardData:{get:function(){return this.u},set:function(t){this.u=t}},copiesConnectedLinks:{get:function(){return this.I},set:function(t){this.I=t}},deletesConnectedLinks:{get:function(){return this.eb},set:function(t){this.eb=t}},copiesTree:{get:function(){return this.La},set:function(t){this.La=t}},deletesTree:{get:function(){return this.Sc},set:function(t){this.Sc=t}},copiesParentKey:{get:function(){return this.Ka},set:function(t){this.Ka=t}},copiesGroupKey:{get:function(){return this.T},set:function(t){this.T=t}},archetypeGroupData:{get:function(){return this.l},set:function(t){this.l=t}},memberValidation:{get:function(){return this.Ki},set:function(t){this.Ki=t}},defaultScale:{get:function(){return this.diagram.defaultScale},set:function(t){this.diagram.defaultScale=t}},zoomFactor:{get:function(){return this.Od},set:function(t){1<t||w("zoomFactor must be larger than 1.0, not: "+t),this.Od=t}},isZoomToFitRestoreEnabled:{get:function(){return this.Cc},set:function(t){this.Cc=t}},scrollToPartPause:{get:function(){return this.Tc},set:function(t){this.Tc=t}}}),ha.className="CommandHandler",_o=function(){return new ha},ca.prototype.cloneProtected=function(t){t.F=6144|this.F,t.hb=this.hb,t.oa=this.oa,t.mb=this.mb,t.ec=this.ec,t.Mg=this.Mg,t.la.assign(this.la),t.Xc=this.Xc.H(),t.fg=this.fg.H(),t.eg=this.eg.H(),t.cg=this.cg.copy(),t.Aa=this.Aa,t.Yb=this.Yb,t.De=this.De,t.jh=this.jh.H(),t.qc.assign(this.qc),t.xb.assign(this.xb),t.rc.assign(this.rc),t.xp=this.xp,null!==this.O&&(t.O=this.O.copy()),t.yb=this.yb.H(),t.$k=this.$k.H(),t.Jp=this.Jp,t.Kp=this.Kp,t.Rg=this.Rg,t.zn=this.zn,t.aq=this.aq,t.Qp=this.Qp,t.am=this.am,t.bm=this.bm.H(),t.cm=this.cm,t.oi=this.oi,null!==this.N&&(t.N=this.N.copy()),t.fb=this.fb,t.dl=this.dl,null!==this.ni&&(t.ni=T(this.ni)),null!==this.Za&&(t.Za=this.Za.copy()),t.em=this.em},ca.prototype.Tx=function(t){var e=this.ni;if(C(e)){for(var i=0;i<e.length;i++)if(e[i]===t)return}else this.ni=e=[];e.push(t)},ca.prototype.yf=function(t){t.yp=null,t.ak=null,t.o()},ca.prototype.clone=function(){var t=new this.constructor;if(this.cloneProtected(t),null!==this.ni)for(var e=0;e<this.ni.length;e++){var i=this.ni[e];t[i]=this[i]}return t},ca.prototype.copy=function(){return this.clone()},i=ca.prototype,i.jb=function(t){t.classType===Nc?0===t.name.indexOf("Orient")?this.segmentOrientation=t:w("Unknown Link enum value for GraphObject.segmentOrientation property: "+t):t.classType===ca&&(this.stretch=t)},i.toString=function(){return D(this.constructor)+"#"+st(this)},i.Kc=function(){if(null===this.O){var t=new Rf;t.bh=ie,t.Ch=ie,t.$g=10,t.Ah=10,t.ah=0,t.Bh=0,this.O=t}},i.Va=function(t,e,i,n,o,r,s){var a=this.part;if(null!==a&&(a.Sk(t,e,i,n,o,r,s),i===this&&t===Pi&&Na(this)&&da(this,a,e),r=this.diagram,null===this.Mg||null===r||!r.pj||r.undoManager.isUndoingRedoing||r.currentTool!==r.toolManager||r.animationManager.tn||(t=this.Mg.get(e),null!==t&&r.animationManager.isEnabled&&!r.animationManager.isTicking&&(null===this.Mp&&(this.Mp=new dt),s=0===r.undoManager.transactionLevel,t.startCondition===Vo?s=!0:t.startCondition===Go&&(s=!1),s?(r=new To,Ro(t,r),s=this.Mp.get(t),null!==s&&s.stop(),this.Mp.add(t,r),r.xv=this,r.Ox=t,r.add(this,e,n,o),r.start()):(co(r.animationManager,"Trigger"),r.animationManager.defaultAnimation.add(this,e,n,o)))),this instanceof Uh&&i===a&&0!==(16777216&a.F)&&null!==a.data))for(i=this.W.j,n=i.length,o=0;o<n;o++)a=i[o],a instanceof Uh&&Jh(a,(function(t){null!==t.data&&0!==(16777216&t.F)&&t.Da(e)}))},i.Gt=function(t){return this.dl===t?this:null},i.g=function(t,e,i){this.Va(Pi,t,this,e,i)},i.sy=function(t,e,i){if(!1===this.pickable)return!1;var n=this.naturalBounds;return e=t.Ie(e),i?xt(t.x,t.y,0,0,0,n.height)<=e||xt(t.x,t.y,0,n.height,n.width,n.height)<=e||xt(t.x,t.y,n.width,n.height,n.width,0)<=e||xt(t.x,t.y,n.width,0,0,0)<=e:t.qd(0,0)<=e&&t.qd(0,n.height)<=e&&t.qd(n.width,0)<=e&&t.qd(n.width,n.height)<=e},i.he=function(){return!0},i.$=function(t){var e=pt.alloc();e.assign(t),this.transform.ta(e);var i=this.actualBounds;if(!i.s())return pt.free(e),!1;var n=this.diagram;if(null!==n&&n.re){var o=n.Bm("extraTouchThreshold"),r=n.Bm("extraTouchArea"),s=r/2,a=this.naturalBounds;n=this.Af()*n.scale;var h=1/n;if(a.width*n<o&&a.height*n<o)return t=_t(i.x-s*h,i.y-s*h,i.width+r*h,i.height+r*h,e.x,e.y),pt.free(e),t}return o=!1,(this instanceof Qu||this instanceof Nl?_t(i.x-5,i.y-5,i.width+10,i.height+10,e.x,e.y):i.$(e))&&(o=!(this.Za&&!this.Za.$(e))&&(!(null===this.ec||!i.$(e))||(!(null===this.mb||!this.rc.$(t))||this.Kh(t)))),pt.free(e),o},i.Kh=function(t){var e=this.naturalBounds;return _t(0,0,e.width,e.height,t.x,t.y)},i.Ge=function(t){if(0===this.angle)return this.actualBounds.Ge(t);var e=this.naturalBounds;e=zt.allocAt(0,0,e.width,e.height);var i=this.transform,n=!1,o=pt.allocAt(t.x,t.y);return e.$(i.Jd(o))&&(o.h(t.x,t.bottom),e.$(i.Jd(o))&&(o.h(t.right,t.bottom),e.$(i.Jd(o))&&(o.h(t.right,t.y),e.$(i.Jd(o))&&(n=!0)))),pt.free(o),zt.free(e),n},i.Jh=function(t,e){if(void 0===e)return t.Ge(this.actualBounds);var i=this.naturalBounds,n=!1,o=pt.allocAt(0,0);return t.$(e.ta(o))&&(o.h(0,i.height),t.$(e.ta(o))&&(o.h(i.width,i.height),t.$(e.ta(o))&&(o.h(i.width,0),t.$(e.ta(o))&&(n=!0)))),pt.free(o),n},i.Mc=function(t,e){if(void 0===e&&(e=this.transform,0===this.angle))return t.Mc(this.actualBounds);var i=this.naturalBounds,n=pt.allocAt(0,0),o=pt.allocAt(0,i.height),r=pt.allocAt(i.width,i.height),s=pt.allocAt(i.width,0),a=!1;if(t.$(e.ta(n))||t.$(e.ta(o))||t.$(e.ta(r))||t.$(e.ta(s)))a=!0;else{i=zt.allocAt(0,0,i.width,i.height);var h=pt.allocAt(t.x,t.y);i.$(e.Jd(h))?a=!0:(h.h(t.x,t.bottom),i.$(e.Jd(h))?a=!0:(h.h(t.right,t.bottom),i.$(e.Jd(h))?a=!0:(h.h(t.right,t.y),i.$(e.Jd(h))&&(a=!0)))),pt.free(h),zt.free(i),!a&&(_e.Qt(t,n,o)||_e.Qt(t,o,r)||_e.Qt(t,r,s)||_e.Qt(t,s,n))&&(a=!0)}return pt.free(n),pt.free(o),pt.free(r),pt.free(s),a},i.da=function(t,e){if(void 0===e&&(e=new pt),t instanceof Ge){var i=this.naturalBounds;e.h(t.x*i.width+t.offsetX,t.y*i.height+t.offsetY)}else e.set(t);return this.Fd.ta(e),e},i.mj=function(t){void 0===t&&(t=new zt);var e=this.naturalBounds,i=this.Fd,n=pt.allocAt(0,0).transform(i);return t.h(n.x,n.y,0,0),n.h(e.width,0).transform(i),Ht(t,n.x,n.y,0,0),n.h(e.width,e.height).transform(i),Ht(t,n.x,n.y,0,0),n.h(0,e.height).transform(i),Ht(t,n.x,n.y,0,0),pt.free(n),t},i.lj=function(){var t=this.Fd;return 1===t.m11&&0===t.m12?t=0:(t=180*Math.atan2(t.m12,t.m11)/Math.PI,0>t&&(t+=360)),t},i.Af=function(){if(0!==(4096&this.F)===!1)return this.ql;var t=this.Aa;return null!==this.panel?t*this.panel.Af():t},i.Mt=function(t,e){return void 0===e&&(e=new pt),e.assign(t),this.Fd.Jd(e),e},i.Nt=function(t,e,i){return this.zk(t.x,t.y,e.x,e.y,i)},i.zk=function(t,e,i,n,o){var r=this.transform,s=1/(r.m11*r.m22-r.m12*r.m21),a=r.m22*s,h=-r.m12*s,l=-r.m21*s,u=r.m11*s,c=s*(r.m21*r.dy-r.m22*r.dx),f=s*(r.m12*r.dx-r.m11*r.dy);return null!==this.areaBackground?(r=this.actualBounds,_e.Cf(r.left,r.top,r.right,r.bottom,t,e,i,n,o)):(s=t*a+e*l+c,t=t*h+e*u+f,e=i*a+n*l+c,i=i*h+n*u+f,o.h(0,0),n=this.naturalBounds,i=_e.Cf(0,0,n.width,n.height,s,t,e,i,o),o.transform(r),i)},ca.prototype.measure=function(t,e,i,n){if(!1!==La(this)){var o=this.jh,r=o.right+o.left;o=o.top+o.bottom,t=Math.max(t-r,0),e=Math.max(e-o,0),i=Math.max((i||0)-r,0),n=Math.max((n||0)-o,0),r=this.angle,o=this.desiredSize;var s=0;this instanceof Nl&&(s=this.strokeWidth),90===r||270===r?(t=isFinite(o.height)?o.height+s:t,e=isFinite(o.width)?o.width+s:e):(t=isFinite(o.width)?o.width+s:t,e=isFinite(o.height)?o.height+s:e),o=i||0,s=n||0;var a=this instanceof Uh;switch(ka(this,!0)){case qs:s=o=0,a&&(e=t=1/0);break;case Xs:isFinite(t)&&t>i&&(o=t),isFinite(e)&&e>n&&(s=e);break;case Hs:isFinite(t)&&t>i&&(o=t),s=0,a&&(e=1/0);break;case _s:isFinite(e)&&e>n&&(s=e),o=0,a&&(t=1/0)}a=this.maxSize;var h=this.minSize;o>a.width&&h.width<a.width&&(o=a.width),s>a.height&&h.height<a.height&&(s=a.height),i=Math.max(o/this.scale,h.width),n=Math.max(s/this.scale,h.height),a.width<i&&(i=Math.min(h.width,i)),a.height<n&&(n=Math.min(h.height,n)),t=Math.min(a.width,t),e=Math.min(a.height,e),t=Math.max(i,t),e=Math.max(n,e),90!==r&&270!==r||(r=t,t=e,e=r,r=i,i=n,n=r),this.qc.ea(),this.Hm(t,e,i,n),this.qc.freeze(),this.qc.s()||w("Non-real measuredBounds has been set. Object "+this+", measuredBounds: "+this.qc.toString()),ja(this,!1)}},ca.prototype.Hm=function(){},ca.prototype.Ff=function(){return!1},ca.prototype.arrange=function(t,e,i,n,o){this.Fl();var r=zt.alloc();r.assign(this.xb),this.xb.ea(),!1===Oa(this)?this.xb.h(t,e,i,n):this.Ih(t,e,i,n),this.xb.freeze(),this.Za=void 0===o?null:o,i=!1,void 0!==o?i=!0:(o=this.panel,null===o||o.type!==Uh.TableRow&&o.type!==Uh.TableColumn||(o=o.panel),null!==o&&(o=o.rc,n=this.measuredBounds,null!==this.areaBackground&&(n=this.xb),i=e+n.height,n=t+n.width,i=!(0<=t+.05&&n<=o.width+.05&&0<=e+.05&&i<=o.height+.05),this instanceof Il&&(t=this.naturalBounds,this.us>t.height||this.vb>t.width))&&(i=!0)),this.F=i?256|this.F:-257&this.F,this.xb.s()||w("Non-real actualBounds has been set. Object "+this+", actualBounds: "+this.xb.toString()),this.Im(r,this.xb),Da(this,!1),zt.free(r)},i=ca.prototype,i.Ih=function(){},i.Im=function(t,e){var i=this.part;null!==i&&null!==i.diagram&&(i.selectionObject!==this&&i.resizeObject!==this&&i.rotateObject!==this||qu(i,!0),this.M(),Xt(t,e)||(i.Oh(),this.mp(i)))},i.mp=function(t){null!==this.portId&&(qu(t,!0),t instanceof ec&&oc(t,this))},i.mc=function(t,e){if(this.visible){var i=this instanceof Uh&&(this.type===Uh.TableRow||this.type===Uh.TableColumn),n=this.xb;if(i||0!==n.width&&0!==n.height&&!isNaN(n.x)&&!isNaN(n.y)){var o=this.opacity;if(0!==o){var r=1;if(1!==o&&(r=t.globalAlpha,t.globalAlpha=r*o),!this.ly(t,e))if(i)ma(this,t,e);else{this instanceof Nc&&this.Gk(!1),i=this.transform;var s=this.panel;0!==(4096&this.F)===!0&&xa(this);var a=this.part,h=!1,l=0;if(a&&e.Ke("drawShadows")&&(h=a.isShadowed)){var u=a.shadowOffset;l=Math.max(u.y,u.x)*e.scale*e.Tb}if(!(u=e.yi||!this.Ff())){var c=this.naturalBounds;u=this.Zh;var f,d=u.m11,p=u.m21,g=u.dx,y=u.m12,m=u.m22,v=u.dy,x=f=0;u=f*d+x*p+g;var b=f*y+x*m+v;f=c.width+l,x=0;var w=f*d+x*p+g;f=f*y+x*m+v,x=Math.min(u,w);var k=Math.min(b,f),M=Math.max(u+0,w)-x,S=Math.max(b+0,f)-k;u=x,b=k,f=c.width+l,x=c.height+l,w=f*d+x*p+g,f=f*y+x*m+v,x=Math.min(u,w),k=Math.min(b,f),M=Math.max(u+M,w)-x,S=Math.max(b+S,f)-k,u=x,b=k,f=0,x=c.height+l,w=f*d+x*p+g,f=f*y+x*m+v,x=Math.min(u,w),k=Math.min(b,f),M=Math.max(u+M,w)-x,S=Math.max(b+S,f)-k,u=x,b=k,l=e.viewportBounds,c=l.x,d=l.y,u=!(u>l.width+c||c>M+u||b>l.height+d||d>S+b)}if(u){if(u=0!==(256&this.F),t.clipInsteadOfFill&&(u=!1),this instanceof Il&&(t.font=this.font),u){if(b=s.he()?s.naturalBounds:s.actualBounds,null!==this.Za?(c=this.Za,M=c.x,S=c.y,l=c.width,c=c.height):(M=Math.max(n.x,b.x),S=Math.max(n.y,b.y),l=Math.min(n.right,b.right)-M,c=Math.min(n.bottom,b.bottom)-S),M>n.width+n.x||n.x>b.width+b.x)return void(1!==o&&(t.globalAlpha=r));t.save(),t.beginPath(),t.rect(M,S,l,c),t.clip()}if(this.Ff()){if(!a.isVisible())return void(1!==o&&(t.globalAlpha=r));h&&(b=a.shadowOffset,t.Iw(b.x*e.scale*e.Tb,b.y*e.scale*e.Tb,a.shadowBlur),$a(t),t.shadowColor=a.shadowColor)}h&&!0===this.shadowVisible?$a(t):h&&!1===this.shadowVisible&&Wa(t),a=this.naturalBounds,null!==this.ec&&(va(this,t,this.ec,!0,!0,a,n),this.ec instanceof eh&&this.ec.type===mh?(t.beginPath(),t.rect(n.x,n.y,n.width,n.height),t.Je(this.ec)):t.fillRect(n.x,n.y,n.width,n.height)),t.transform(i.m11,i.m12,i.m21,i.m22,i.dx,i.dy),h&&(null!==s&&0!==(512&s.F)||null!==s&&(s.type===Uh.Auto||s.type===Uh.Spot)&&s.tb()!==this)&&null===this.shadowVisible&&Wa(t),null!==this.mb&&(l=this.naturalBounds,M=b=0,S=l.width,l=l.height,c=0,this instanceof Nl&&(l=this.na.bounds,b=l.x,M=l.y,S=l.width,l=l.height,c=this.strokeWidth),va(this,t,this.mb,!0,!1,a,n),this.mb instanceof eh&&this.mb.type===mh?(t.beginPath(),t.rect(b-c/2,M-c/2,S+c,l+c),t.Je(this.mb)):t.fillRect(b-c/2,M-c/2,S+c,l+c)),h&&(null!==this.mb||null!==this.ec||null!==s&&0!==(512&s.F)||null!==s&&(s.type===Uh.Auto||s.type===Uh.Spot)&&s.tb()!==this)?(Pa(this,!0),null===this.shadowVisible&&Wa(t)):Pa(this,!1),this.ej(t,e),h&&0!==(512&this.F)===!0&&$a(t),this.Ff()&&h&&Wa(t),u?(t.restore(),this instanceof Uh?t.uc(!0):t.uc(!1)):i.Tt()||(e=1/(i.m11*i.m22-i.m12*i.m21),t.transform(i.m22*e,-i.m12*e,-i.m21*e,i.m11*e,e*(i.m21*i.dy-i.m22*i.dx),e*(i.m12*i.dx-i.m11*i.dy)))}}1!==o&&(t.globalAlpha=r)}}}},i.ly=function(){return!1},i.ej=function(){},i.Gg=function(t){if(t instanceof Uh)t:{if(this!==t&&null!==t)for(var e=this.panel;null!==e;){if(e===t){t=!0;break t}e=e.panel}t=!1}else t=!1;return t},i.Gf=function(){if(!this.visible)return!1;var t=this.panel;return null===t||t.Gf()},i.Hg=function(){for(var t=this instanceof Uh?this:this.panel;null!==t&&t.isEnabled;)t=t.panel;return null===t},i.o=function(t){if(!La(this)){void 0===t&&(t=!1),ja(this,!0),Da(this,!0);var e=this.panel;null===e||t||e.o()}},i.Bk=function(){La(this)||(ja(this,!0),Da(this,!0))},i.Fl=function(){0!==(2048&this.F)===!1&&(Ta(this,!0),Aa(this,!0))},i.dw=function(){Aa(this,!0)},i.M=function(){var t=this.part;null!==t&&t.M()},i.sj=function(t){this.og=t},i.lu=function(){},i.Ew=function(t){return this.la.assign(t),wa(this),!0},i.er=function(t,e){this.la.x===t&&this.la.y===e||(this.la.h(t,e),this.Fl())},i.bind=function(t){t.pd=this;var e=this.ij();null!==e&&ll(e)&&w("Cannot add a Binding to a template that has already been copied: "+t),null===this.fb&&(this.fb=new et),this.fb.add(t)},i.ij=function(){for(var t=this instanceof Uh?this:this.panel;null!==t;){if(null!==t.li)return t;t=t.panel}return null},i.Fw=function(t){Tr(this,t)},i.Qw=function(t){t.pd=this,null===this.Mg&&(this.Mg=new dt),this.Mg.add(t.propertyName,t)},d.Object.defineProperties(ca.prototype,{shadowVisible:{get:function(){return this.em},set:function(t){var e=this.em;e!==t&&(this.em=t,this.M(),this.g("shadowVisible",e,t))}},enabledChanged:{get:function(){return null!==this.N?this.N.Wn:null},set:function(t){fa(this);var e=this.N.Wn;e!==t&&(this.N.Wn=t,this.g("enabledChanged",e,t))}},segmentOrientation:{get:function(){return this.cm},set:function(t){var e=this.cm;e!==t&&(this.cm=t,this.o(),this.g("segmentOrientation",e,t),t===tf&&(this.angle=0))}},segmentIndex:{get:function(){return this.Qp},set:function(t){t=Math.round(t);var e=this.Qp;e!==t&&(this.Qp=t,this.o(),this.g("segmentIndex",e,t))}},segmentFraction:{get:function(){return this.am},set:function(t){isNaN(t)||0>t?t=0:1<t&&(t=1);var e=this.am;e!==t&&(this.am=t,this.o(),this.g("segmentFraction",e,t))}},segmentOffset:{get:function(){return this.bm},set:function(t){var e=this.bm;e.w(t)||(this.bm=t=t.H(),this.o(),this.g("segmentOffset",e,t))}},stretch:{get:function(){return this.De},set:function(t){var e=this.De;e!==t&&(this.De=t,this.o(),this.g("stretch",e,t))}},name:{get:function(){return this.oa},set:function(t){var e=this.oa;e!==t&&(this.oa=t,null!==this.part&&(this.part.Xj=null),this.g("name",e,t))}},opacity:{get:function(){return this.hb},set:function(t){var e=this.hb;e!==t&&((0>t||1<t)&&M(t,"0 <= value <= 1",ca,"opacity"),this.hb=t,this.g("opacity",e,t),t=this.diagram,e=this.part,null!==t&&null!==e&&t.M(Bu(e,e.actualBounds)))}},visible:{get:function(){return 0!==(1&this.F)},set:function(t){var e=0!==(1&this.F);e!==t&&(this.F^=1,this.g("visible",e,t),e=this.panel,null!==e?e.o():this.Ff()&&this.Ob(t),this.M(),Ba(this))}},pickable:{get:function(){return 0!==(2&this.F)},set:function(t){var e=0!==(2&this.F);e!==t&&(this.F^=2,this.g("pickable",e,t))}},fromLinkableDuplicates:{get:function(){return 0!==(4&this.F)},set:function(t){var e=0!==(4&this.F);e!==t&&(this.F^=4,this.g("fromLinkableDuplicates",e,t))}},fromLinkableSelfNode:{get:function(){return 0!==(8&this.F)},set:function(t){var e=0!==(8&this.F);e!==t&&(this.F^=8,this.g("fromLinkableSelfNode",e,t))}},toLinkableDuplicates:{get:function(){return 0!==(16&this.F)},set:function(t){var e=0!==(16&this.F);e!==t&&(this.F^=16,this.g("toLinkableDuplicates",e,t))}},toLinkableSelfNode:{get:function(){return 0!==(32&this.F)},set:function(t){var e=0!==(32&this.F);e!==t&&(this.F^=32,this.g("toLinkableSelfNode",e,t))}},isPanelMain:{get:function(){return 0!==(64&this.F)},set:function(t){var e=0!==(64&this.F);e!==t&&(this.F^=64,this.o(),this.g("isPanelMain",e,t))}},isActionable:{get:function(){return 0!==(128&this.F)},set:function(t){var e=0!==(128&this.F);e!==t&&(this.F^=128,this.g("isActionable",e,t))}},areaBackground:{get:function(){return this.ec},set:function(t){var e=this.ec;e!==t&&(null!==t&&dh(t,"GraphObject.areaBackground"),t instanceof eh&&t.freeze(),this.ec=t,this.M(),this.g("areaBackground",e,t))}},background:{get:function(){return this.mb},set:function(t){var e=this.mb;e!==t&&(null!==t&&dh(t,"GraphObject.background"),t instanceof eh&&t.freeze(),this.mb=t,this.M(),this.g("background",e,t))}},part:{get:function(){if(this.Ff())return this;if(null!==this.ak)return this.ak;var t;for(t=this.panel;t;){if(t instanceof Lu)return this.ak=t;t=t.panel}return null}},svg:{get:function(){return this.gq},set:function(t){this.gq=t}},panel:{get:function(){return this.og}},layer:{get:function(){var t=this.part;return null!==t?t.layer:null}},diagram:{get:function(){var t=this.part;return null!==t?t.diagram:null}},position:{get:function(){return this.la},set:function(t){var e=t.x,i=t.y,n=this.la,o=n.x,r=n.y;(o===e||isNaN(o)&&isNaN(e))&&(r===i||isNaN(r)&&isNaN(i))?this.lu():(t=t.copy(),this.Ew(t,n)&&this.g("position",n.copy(),t.copy()))}},actualBounds:{get:function(){return this.xb}},scale:{get:function(){return this.Aa},set:function(t){var e=this.Aa;e!==t&&(0>=t&&w("GraphObject.scale for "+this+" must be greater than zero, not: "+t),this.Aa=t,this.o(),this.g("scale",e,t))}},angle:{get:function(){return this.Yb},set:function(t){var e=this.Yb;e!==t&&(t%=360,0>t&&(t+=360),e!==t&&(this.Yb=t,Ba(this),this.o(),this.g("angle",e,t)))}},desiredSize:{get:function(){return this.Xc},set:function(t){var e=t.width,i=t.height,n=this.Xc,o=n.width,r=n.height;(o===e||isNaN(o)&&isNaN(e))&&(r===i||isNaN(r)&&isNaN(i))||(this.Xc=t=t.H(),this.o(),this instanceof Nl&&this.dc(),this.g("desiredSize",n,t),Na(this)&&(t=this.part,null!==t&&(da(this,t,"width"),da(this,t,"height"))))}},width:{get:function(){return this.Xc.width},set:function(t){var e=this.Xc.width;e===t||isNaN(e)&&isNaN(t)||(e=this.Xc,this.Xc=t=new Bt(t,this.Xc.height).freeze(),this.o(),this instanceof Nl&&this.dc(),this.g("desiredSize",e,t),Na(this)&&(t=this.part,null!==t&&da(this,t,"width")))}},height:{get:function(){return this.Xc.height},set:function(t){var e=this.Xc.height;e===t||isNaN(e)&&isNaN(t)||(e=this.Xc,this.Xc=t=new Bt(this.Xc.width,t).freeze(),this.o(),this instanceof Nl&&this.dc(),this.g("desiredSize",e,t),Na(this)&&(t=this.part,null!==t&&da(this,t,"height")))}},minSize:{get:function(){return this.fg},set:function(t){var e=this.fg;e.w(t)||(t=t.copy(),isNaN(t.width)&&(t.width=0),isNaN(t.height)&&(t.height=0),t.freeze(),this.fg=t,this.o(),this.g("minSize",e,t))}},maxSize:{get:function(){return this.eg},set:function(t){var e=this.eg;e.w(t)||(t=t.copy(),isNaN(t.width)&&(t.width=1/0),isNaN(t.height)&&(t.height=1/0),t.freeze(),this.eg=t,this.o(),this.g("maxSize",e,t))}},measuredBounds:{get:function(){return this.qc}},naturalBounds:{get:function(){return this.rc}},margin:{get:function(){return this.jh},set:function(t){"number"===typeof t&&(t=new Qt(t));var e=this.jh;e.w(t)||(this.jh=t=t.H(),this.o(),this.g("margin",e,t))}},transform:{get:function(){return 0!==(2048&this.F)===!0&&xa(this),this.sb}},Fd:{get:function(){return 0!==(4096&this.F)===!0&&xa(this),this.Zh}},alignment:{get:function(){return this.yb},set:function(t){var e=this.yb;e.w(t)||(t.nc()&&!t.Mb()&&w("GraphObject.alignment for "+this+" must be a real Spot or Spot.Default, not: "+t),this.yb=t=t.H(),wa(this),this.g("alignment",e,t))}},column:{get:function(){return this.Rg},set:function(t){t=Math.round(t);var e=this.Rg;e!==t&&(0>t&&M(t,">= 0",ca,"column"),this.Rg=t,this.o(),this.g("column",e,t))}},columnSpan:{get:function(){return this.zn},set:function(t){t=Math.round(t);var e=this.zn;e!==t&&(1>t&&M(t,">= 1",ca,"columnSpan"),this.zn=t,this.o(),this.g("columnSpan",e,t))}},row:{get:function(){return this.Jp},set:function(t){t=Math.round(t);var e=this.Jp;e!==t&&(0>t&&M(t,">= 0",ca,"row"),this.Jp=t,this.o(),this.g("row",e,t))}},rowSpan:{get:function(){return this.Kp},set:function(t){t=Math.round(t);var e=this.Kp;e!==t&&(1>t&&M(t,">= 1",ca,"rowSpan"),this.Kp=t,this.o(),this.g("rowSpan",e,t))}},spanAllocation:{get:function(){return this.aq},set:function(t){var e=this.aq;e!==t&&(this.aq=t,this.o(),this.g("spanAllocation",e,t))}},alignmentFocus:{get:function(){return this.$k},set:function(t){var e=this.$k;e.w(t)||(this.$k=t=t.H(),this.o(),this.g("alignmentFocus",e,t))}},portId:{get:function(){return this.xp},set:function(t){var e=this.xp;if(e!==t){var i=this.part;null===i||i instanceof ec||(w("Cannot set portID on a Link: "+t),i=null),null!==e&&null!==i&&fc(i,this),this.xp=t,null!==t&&null!==i&&(i.Nh=!0,cc(i,this)),this.g("portId",e,t)}}},toSpot:{get:function(){return null!==this.O?this.O.Ch:ie},set:function(t){this.Kc();var e=this.O.Ch;e.w(t)||(t=t.H(),this.O.Ch=t,this.g("toSpot",e,t),Fa(this))}},toEndSegmentLength:{get:function(){return null!==this.O?this.O.Ah:10},set:function(t){this.Kc();var e=this.O.Ah;e!==t&&(0>t&&M(t,">= 0",ca,"toEndSegmentLength"),this.O.Ah=t,this.g("toEndSegmentLength",e,t),Fa(this))}},toShortLength:{get:function(){return null!==this.O?this.O.Bh:0},set:function(t){this.Kc();var e=this.O.Bh;e!==t&&(this.O.Bh=t,this.g("toShortLength",e,t),Fa(this))}},toLinkable:{get:function(){return null!==this.O?this.O.kq:null},set:function(t){this.Kc();var e=this.O.kq;e!==t&&(this.O.kq=t,this.g("toLinkable",e,t))}},toMaxLinks:{get:function(){return null!==this.O?this.O.lq:1/0},set:function(t){this.Kc();var e=this.O.lq;e!==t&&(0>t&&M(t,">= 0",ca,"toMaxLinks"),this.O.lq=t,this.g("toMaxLinks",e,t))}},fromSpot:{get:function(){return null!==this.O?this.O.bh:ie},set:function(t){this.Kc();var e=this.O.bh;e.w(t)||(t=t.H(),this.O.bh=t,this.g("fromSpot",e,t),Fa(this))}},fromEndSegmentLength:{get:function(){return null!==this.O?this.O.$g:10},set:function(t){this.Kc();var e=this.O.$g;e!==t&&(0>t&&M(t,">= 0",ca,"fromEndSegmentLength"),this.O.$g=t,this.g("fromEndSegmentLength",e,t),Fa(this))}},fromShortLength:{get:function(){return null!==this.O?this.O.ah:0},set:function(t){this.Kc();var e=this.O.ah;e!==t&&(this.O.ah=t,this.g("fromShortLength",e,t),Fa(this))}},fromLinkable:{get:function(){return null!==this.O?this.O.co:null},set:function(t){this.Kc();var e=this.O.co;e!==t&&(this.O.co=t,this.g("fromLinkable",e,t))}},fromMaxLinks:{get:function(){return null!==this.O?this.O.eo:1/0},set:function(t){this.Kc();var e=this.O.eo;e!==t&&(0>t&&M(t,">= 0",ca,"fromMaxLinks"),this.O.eo=t,this.g("fromMaxLinks",e,t))}},cursor:{get:function(){return this.oi},set:function(t){var e=this.oi;e!==t&&(this.oi=t,this.g("cursor",e,t))}},click:{get:function(){return null!==this.N?this.N.Pf:null},set:function(t){fa(this);var e=this.N.Pf;e!==t&&(this.N.Pf=t,this.g("click",e,t))}},doubleClick:{get:function(){return null!==this.N?this.N.Uf:null},set:function(t){fa(this);var e=this.N.Uf;e!==t&&(this.N.Uf=t,this.g("doubleClick",e,t))}},contextClick:{get:function(){return null!==this.N?this.N.Qf:null},set:function(t){fa(this);var e=this.N.Qf;e!==t&&(this.N.Qf=t,this.g("contextClick",e,t))}},mouseEnter:{get:function(){return null!==this.N?this.N.hg:null},set:function(t){fa(this);var e=this.N.hg;e!==t&&(this.N.hg=t,this.g("mouseEnter",e,t))}},mouseLeave:{get:function(){return null!==this.N?this.N.kg:null},set:function(t){fa(this);var e=this.N.kg;e!==t&&(this.N.kg=t,this.g("mouseLeave",e,t))}},mouseOver:{get:function(){return null!==this.N?this.N.lg:null},set:function(t){fa(this);var e=this.N.lg;e!==t&&(this.N.lg=t,this.g("mouseOver",e,t))}},mouseHover:{get:function(){return null!==this.N?this.N.jg:null},set:function(t){fa(this);var e=this.N.jg;e!==t&&(this.N.jg=t,this.g("mouseHover",e,t))}},mouseHold:{get:function(){return null!==this.N?this.N.ig:null},set:function(t){fa(this);var e=this.N.ig;e!==t&&(this.N.ig=t,this.g("mouseHold",e,t))}},mouseDragEnter:{get:function(){return null!==this.N?this.N.$o:null},set:function(t){fa(this);var e=this.N.$o;e!==t&&(this.N.$o=t,this.g("mouseDragEnter",e,t))}},mouseDragLeave:{get:function(){return null!==this.N?this.N.ap:null},set:function(t){fa(this);var e=this.N.ap;e!==t&&(this.N.ap=t,this.g("mouseDragLeave",e,t))}},mouseDrop:{get:function(){return null!==this.N?this.N.gg:null},set:function(t){fa(this);var e=this.N.gg;e!==t&&(this.N.gg=t,this.g("mouseDrop",e,t))}},actionDown:{get:function(){return null!==this.N?this.N.gn:null},set:function(t){fa(this);var e=this.N.gn;e!==t&&(this.N.gn=t,this.g("actionDown",e,t))}},actionMove:{get:function(){return null!==this.N?this.N.hn:null},set:function(t){fa(this);var e=this.N.hn;e!==t&&(this.N.hn=t,this.g("actionMove",e,t))}},actionUp:{get:function(){return null!==this.N?this.N.jn:null},set:function(t){fa(this);var e=this.N.jn;e!==t&&(this.N.jn=t,this.g("actionUp",e,t))}},actionCancel:{get:function(){return null!==this.N?this.N.fn:null},set:function(t){fa(this);var e=this.N.fn;e!==t&&(this.N.fn=t,this.g("actionCancel",e,t))}},toolTip:{get:function(){return null!==this.N?this.N.wg:null},set:function(t){fa(this);var e=this.N.wg;e!==t&&(this.N.wg=t,this.g("toolTip",e,t))}},contextMenu:{get:function(){return null!==this.N?this.N.Rf:null},set:function(t){fa(this);var e=this.N.Rf;e!==t&&(this.N.Rf=t,this.g("contextMenu",e,t))}}}),ca.prototype.trigger=ca.prototype.Qw,ca.prototype.setProperties=ca.prototype.Fw,ca.prototype.findTemplateBinder=ca.prototype.ij,ca.prototype.bind=ca.prototype.bind,ca.prototype.isEnabledObject=ca.prototype.Hg,ca.prototype.isVisibleObject=ca.prototype.Gf,ca.prototype.isContainedBy=ca.prototype.Gg,ca.prototype.getNearestIntersectionPoint=ca.prototype.Nt,ca.prototype.getLocalPoint=ca.prototype.Mt,ca.prototype.getDocumentScale=ca.prototype.Af,ca.prototype.getDocumentAngle=ca.prototype.lj,ca.prototype.getDocumentBounds=ca.prototype.mj,ca.prototype.getDocumentPoint=ca.prototype.da,ca.prototype.intersectsRect=ca.prototype.Mc,ca.prototype.containedInRect=ca.prototype.Jh,ca.prototype.containsRect=ca.prototype.Ge,ca.prototype.containsPoint=ca.prototype.$,ca.prototype.raiseChanged=ca.prototype.g,ca.prototype.raiseChangedEvent=ca.prototype.Va,ca.prototype.addCopyProperty=ca.prototype.Tx;var Va=null;function Ga(){this.Wn=this.Rf=this.wg=this.fn=this.jn=this.hn=this.gn=this.gg=this.ap=this.$o=this.ig=this.jg=this.lg=this.kg=this.hg=this.Qf=this.Uf=this.Pf=null}function Ya(){this.Oa=[1,0,0,1,0,0]}function Xa(t){this.type=t,this.r2=this.y2=this.x2=this.r1=this.y1=this.x1=0,this.ay=[],this.pattern=null}function qa(t,e){this.ownerDocument=t=void 0===e?y.document:e,this.LA="http://www.w3.org/2000/svg",void 0!==t&&(this.Ja=this.Pb("svg",{width:"1px",height:"1px",viewBox:"0 0 1 1"}),this.Ja.setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns","http://www.w3.org/2000/svg"),this.Ja.setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns:xlink","http://www.w3.org/1999/xlink")),this.Dq=null,this.context=new Ua(this)}function Ua(t){this.nu=t,this.svg=t.Ja,this.stack=[],this.gd=[],this.fillStyle="#000000",this.font="10px sans-serif",this.globalAlpha=1,this.lineCap="butt",this.lineDashOffset=0,this.lineJoin="miter",this.lineWidth=1,this.miterLimit=10,this.shadowBlur=0,this.shadowColor="rgba(0, 0, 0, 0)",this.shadowOffsetY=this.shadowOffsetX=0,this.strokeStyle="#000000",this.textAlign="start",this.clipInsteadOfFill=!1,this.ug=this.ft=this.et=0,this.Wt=null,this.path=[],this.Vu=!1,this.uh=null,this.vh=0,this.He=new Ya,_a(this,1,0,0,1,0,0);var e=at++,i=this.Pb("clipPath",{id:"mainClip"+e});i.appendChild(this.Pb("rect",{x:0,y:0,width:t.width,height:t.height})),this.Bx=i,this.nu.Ja.appendChild(i),this.gd[0].setAttributeNS(null,"clip-path","url(#mainClip"+e+")"),this.NA={}}function Ka(t,e,i,n,o){1!==t.globalAlpha&&(i.opacity=t.globalAlpha),"fill"===e?(t.fillStyle instanceof Xa?i.fill=Ha(t,t.fillStyle):/^rgba\(/.test(t.fillStyle)?(t=/^\s*rgba\s*\(([^,\s]+)\s*,\s*([^,\s]+)\s*,\s*([^,\s]+)\s*,\s*([^,\s]+)\)\s*$/i.exec(t.fillStyle),i.fill="rgb("+t[1]+","+t[2]+","+t[3]+")",i["fill-opacity"]=t[4]):i.fill=t.fillStyle,i.stroke="none"):"stroke"===e&&(i.fill="none",t.strokeStyle instanceof Xa?i.stroke=Ha(t,t.strokeStyle):/^rgba\(/.test(t.strokeStyle)?(e=/^\s*rgba\s*\(([^,\s]+)\s*,\s*([^,\s]+)\s*,\s*([^,\s]+)\s*,\s*([^,\s]+)\)\s*$/i.exec(t.strokeStyle),i.stroke="rgb("+e[1]+","+e[2]+","+e[3]+")",i["stroke-opacity"]=e[4]):i.stroke=t.strokeStyle,i["stroke-width"]=t.lineWidth,i["stroke-linecap"]=t.lineCap,i["stroke-linejoin"]=t.lineJoin,i["stroke-miterlimit"]=t.miterLimit),n=n.Oa,n="matrix("+n[0]+", "+n[1]+", "+n[2]+", "+n[3]+", "+n[4]+", "+n[5]+")",void 0!==o&&(n+=o),i.transform=n}function Ha(t,e){var i="GRAD"+at++;if("linear"===e.type)var n=t.Pb("linearGradient",{x1:e.x1,x2:e.x2,y1:e.y1,y2:e.y2,id:i,gradientUnits:"userSpaceOnUse"});else{if("radial"!==e.type)throw Error("invalid gradient");n=t.Pb("radialGradient",{x1:e.x1,x2:e.x2,y1:e.y1,y2:e.y2,r1:e.r1,r2:e.r2,id:i})}var o=e.ay;e=o.length;for(var r=[],s=0;s<e;s++){var a=o[s],h=a.color;a={offset:a.offset,"stop-color":h},/^rgba\(/.test(h)&&(h=/^\s*rgba\s*\(([^,\s]+)\s*,\s*([^,\s]+)\s*,\s*([^,\s]+)\s*,\s*([^,\s]+)\)\s*$/i.exec(h),a["stop-color"]="rgb("+h[1]+","+h[2]+","+h[3]+")",a["stop-opacity"]=h[4]),r.push(a)}for(r.sort((function(t,e){return t.offset>e.offset?1:-1})),o=0;o<e;o++)n.appendChild(t.Pb("stop",r[o]));return t.svg.appendChild(n),"url(#"+i+")"}function _a(t,e,i,n,o,r,s){var a=new Ya;a.Oa=[e,i,n,o,r,s],e={},Ka(t,"g",e,a),a=t.addElement("g",e),t.gd.push(a)}function Wa(t){t.shadowOffsetX=0,t.shadowOffsetY=0,t.shadowBlur=0}function $a(t){t.shadowOffsetX=t.et,t.shadowOffsetY=t.ft,t.shadowBlur=t.ug}function Ja(t,e){this.ownerDocument=e=void 0===e?y.document:e,this.Dq=null,e=e.createElement("canvas"),e.tabIndex=0,this.Ja=e,this.Ja.innerHTML="This text is displayed if your browser does not support the Canvas HTML element.",this.context=new Za(e),e.C=t}function Za(t){t.getContext&&t.getContext("2d")||w("Browser does not support HTML Canvas Element"),this.Y=t.getContext("2d"),this.xu=this.zu=this.yu="",this.yn=!1,this.ug=this.ft=this.et=0}ca.className="GraphObject",Va=new dt,Ra("Button",(function(){function t(t,e){return null!==t.diagram.Vb(t.documentPoint,(function(t){for(;null!==t.panel&&!t.isActionable;)t=t.panel;return t}),(function(t){return t===e}))}var e=Ia(Uh,Uh.Auto,{isActionable:!0,enabledChanged:function(t,e){if(t instanceof Uh){var i=t.bb("ButtonBorder");null!==i&&(i.fill=e?t._buttonFillNormal:t._buttonFillDisabled)}},cursor:"pointer",_buttonFillNormal:"#F5F5F5",_buttonStrokeNormal:"#BDBDBD",_buttonFillOver:"#E0E0E0",_buttonStrokeOver:"#9E9E9E",_buttonFillPressed:"#BDBDBD",_buttonStrokePressed:"#9E9E9E",_buttonFillDisabled:"#E5E5E5"},Ia(Nl,{name:"ButtonBorder",figure:"RoundedRectangle",spot1:new Ge(0,0,2.76142374915397,2.761423749153969),spot2:new Ge(1,1,-2.76142374915397,-2.761423749153969),parameter1:2,parameter2:2,fill:"#F5F5F5",stroke:"#BDBDBD"}));return e.mouseEnter=function(t,e){if(e.Hg()&&e instanceof Uh&&(t=e.bb("ButtonBorder"),t instanceof Nl)){var i=e._buttonFillOver;e._buttonFillNormal=t.fill,t.fill=i,i=e._buttonStrokeOver,e._buttonStrokeNormal=t.stroke,t.stroke=i}},e.mouseLeave=function(t,e){e.Hg()&&e instanceof Uh&&(t=e.bb("ButtonBorder"),t instanceof Nl&&(t.fill=e._buttonFillNormal,t.stroke=e._buttonStrokeNormal))},e.actionDown=function(t,e){if(e.Hg()&&e instanceof Uh&&null!==e._buttonFillPressed&&0===t.button){var i=e.bb("ButtonBorder");if(i instanceof Nl){t=t.diagram;var n=t.skipsUndoManager;t.skipsUndoManager=!0;var o=e._buttonFillPressed;e._buttonFillOver=i.fill,i.fill=o,o=e._buttonStrokePressed,e._buttonStrokeOver=i.stroke,i.stroke=o,t.skipsUndoManager=n}}},e.actionUp=function(e,i){if(i.Hg()&&i instanceof Uh&&null!==i._buttonFillPressed&&0===e.button){var n=i.bb("ButtonBorder");if(n instanceof Nl){var o=e.diagram,r=o.skipsUndoManager;o.skipsUndoManager=!0,t(e,i)?(n.fill=i._buttonFillOver,n.stroke=i._buttonStrokeOver):(n.fill=i._buttonFillNormal,n.stroke=i._buttonStrokeNormal),o.skipsUndoManager=r}}},e.actionCancel=function(e,i){if(i.Hg()&&i instanceof Uh&&null!==i._buttonFillPressed){var n=i.bb("ButtonBorder");if(n instanceof Nl){var o=e.diagram,r=o.skipsUndoManager;o.skipsUndoManager=!0,t(e,i)?(n.fill=i._buttonFillOver,n.stroke=i._buttonStrokeOver):(n.fill=i._buttonFillNormal,n.stroke=i._buttonStrokeNormal),o.skipsUndoManager=r}}},e.actionMove=function(e,i){if(i.Hg()&&i instanceof Uh&&null!==i._buttonFillPressed){var n=e.diagram;if(0===n.firstInput.button&&(n.currentTool.standardMouseOver(),t(e,i)&&(e=i.bb("ButtonBorder"),e instanceof Nl))){var o=n.skipsUndoManager;n.skipsUndoManager=!0;var r=i._buttonFillPressed;e.fill!==r&&(e.fill=r),r=i._buttonStrokePressed,e.stroke!==r&&(e.stroke=r),n.skipsUndoManager=o}}},e})),Ra("TreeExpanderButton",(function(){var t=Ia("Button",{_treeExpandedFigure:"MinusLine",_treeCollapsedFigure:"PlusLine"},Ia(Nl,{name:"ButtonIcon",figure:"MinusLine",stroke:"#424242",strokeWidth:2,desiredSize:Pt},new cp("figure","isTreeExpanded",(function(t,e){return e=e.panel,t?e._treeExpandedFigure:e._treeCollapsedFigure})).Uq()),{visible:!1},new cp("visible","isTreeLeaf",(function(t){return!t})).Uq());return t.click=function(t,e){if(e=e.part,e instanceof Qu&&(e=e.adornedPart),e instanceof ec){var i=e.diagram;if(null!==i){if(i=i.commandHandler,e.isTreeExpanded){if(!i.canCollapseTree(e))return}else if(!i.canExpandTree(e))return;t.handled=!0,e.isTreeExpanded?i.collapseTree(e):i.expandTree(e)}}},t})),Ra("SubGraphExpanderButton",(function(){var t=Ia("Button",{_subGraphExpandedFigure:"MinusLine",_subGraphCollapsedFigure:"PlusLine"},Ia(Nl,{name:"ButtonIcon",figure:"MinusLine",stroke:"#424242",strokeWidth:2,desiredSize:Pt},new cp("figure","isSubGraphExpanded",(function(t,e){return e=e.panel,t?e._subGraphExpandedFigure:e._subGraphCollapsedFigure})).Uq()));return t.click=function(t,e){if(e=e.part,e instanceof Qu&&(e=e.adornedPart),e instanceof bc){var i=e.diagram;if(null!==i){if(i=i.commandHandler,e.isSubGraphExpanded){if(!i.canCollapseSubGraph(e))return}else if(!i.canExpandSubGraph(e))return;t.handled=!0,e.isSubGraphExpanded?i.collapseSubGraph(e):i.expandSubGraph(e)}}},t})),Ra("ToolTip",(function(){return Ia(Qu,Uh.Auto,{isShadowed:!0,shadowColor:"rgba(0, 0, 0, .4)",shadowOffset:new pt(0,3),shadowBlur:5},Ia(Nl,{name:"Border",figure:"RoundedRectangle",parameter1:1,parameter2:1,fill:"#F5F5F5",stroke:"#F0F0F0",spot1:new Ge(0,0,4,6),spot2:new Ge(1,1,-4,-4)}))})),Ra("ContextMenu",(function(){return Ia(Qu,Uh.Vertical,{background:"#F5F5F5",isShadowed:!0,shadowColor:"rgba(0, 0, 0, .4)",shadowOffset:new pt(0,3),shadowBlur:5},new cp("background","",(function(t){return null!==t.adornedPart&&null!==t.placeholder?null:"#F5F5F5"})))})),Ra("ContextMenuButton",(function(){var t=Ia("Button");t.stretch=Hs;var e=t.bb("ButtonBorder");return e instanceof Nl&&(e.figure="Rectangle",e.strokeWidth=0,e.spot1=new Ge(0,0,2,3),e.spot2=new Ge(1,1,-2,-2)),t})),Ra("PanelExpanderButton",(function(t){var e=za(t,"COLLAPSIBLE"),i=Ia("Button",{_buttonExpandedFigure:"M0 0 M0 6 L4 2 8 6 M8 8",_buttonCollapsedFigure:"M0 0 M0 2 L4 6 8 2 M8 8",_buttonFillNormal:"rgba(0, 0, 0, 0)",_buttonStrokeNormal:null,_buttonFillOver:"rgba(0, 0, 0, .2)",_buttonStrokeOver:null,_buttonFillPressed:"rgba(0, 0, 0, .4)",_buttonStrokePressed:null},Ia(Nl,{name:"ButtonIcon",strokeWidth:2},new cp("geometryString","visible",(function(t){return t?i._buttonExpandedFigure:i._buttonCollapsedFigure})).Uq(e)));return t=i.bb("ButtonBorder"),t instanceof Nl&&(t.stroke=null,t.fill="rgba(0, 0, 0, 0)"),i.click=function(t,i){var n=i.diagram;if(null!==n&&!n.isReadOnly){var o=i.ij();null===o&&(o=i.part),null!==o&&(i=o.bb(e),null!==i&&(t.handled=!0,n.va("Collapse/Expand Panel"),i.visible=!i.visible,n.Xa("Collapse/Expand Panel")))}},i})),Ra("CheckBoxButton",(function(t){var e=za(t);return t=Ia("Button",{desiredSize:new Bt(14,14)},Ia(Nl,{name:"ButtonIcon",geometryString:"M0 0 M0 8.85 L4.9 13.75 16.2 2.45 M16.2 16.2",strokeWidth:2,stretch:Xs,geometryStretch:Us,visible:!1},""!==e?new cp("visible",e).Iy():[])),t.click=function(t,i){if(i instanceof Uh){var n=t.diagram;if(!(null===n||n.isReadOnly||""!==e&&n.model.isReadOnly)){t.handled=!0;var o=i.bb("ButtonIcon");n.va("checkbox"),o.visible=!o.visible,"function"===typeof i._doClick&&i._doClick(t,i),n.Xa("checkbox")}}},t})),Ra("CheckBox",(function(t){t=za(t),t=Ia("CheckBoxButton",t,{name:"Button",isActionable:!1,margin:new Qt(0,1,0,0)});var e=Ia(Uh,"Horizontal",t,{isActionable:!0,cursor:t.cursor,margin:1,_buttonFillNormal:t._buttonFillNormal,_buttonStrokeNormal:t._buttonStrokeNormal,_buttonFillOver:t._buttonFillOver,_buttonStrokeOver:t._buttonStrokeOver,_buttonFillPressed:t._buttonFillPressed,_buttonStrokePressed:t._buttonStrokePressed,_buttonFillDisabled:t._buttonFillDisabled,mouseEnter:t.mouseEnter,mouseLeave:t.mouseLeave,actionDown:t.actionDown,actionUp:t.actionUp,actionCancel:t.actionCancel,actionMove:t.actionMove,click:t.click,_buttonClick:t.click});return t.mouseEnter=null,t.mouseLeave=null,t.actionDown=null,t.actionUp=null,t.actionCancel=null,t.actionMove=null,t.click=null,e})),ca.None=qs=new U(ca,"None",0),ca.Default=Ks=new U(ca,"Default",0),ca.Vertical=_s=new U(ca,"Vertical",4),ca.Horizontal=Hs=new U(ca,"Horizontal",5),ca.Fill=Xs=new U(ca,"Fill",3),ca.Uniform=Us=new U(ca,"Uniform",1),ca.UniformToFill=Ws=new U(ca,"UniformToFill",2),ca.FlipVertical=$s=new U(ca,"FlipVertical",1),ca.FlipHorizontal=Js=new U(ca,"FlipHorizontal",2),ca.FlipBoth=Zs=new U(ca,"FlipBoth",3),ca.make=Ia,ca.getBuilders=function(){var t,e=new dt;for(t in Va)if(t!==t.toLowerCase()){var i=Va.G(t);"function"===typeof i&&e.add(t,i)}return e.freeze(),e},ca.defineBuilder=Ra,ca.takeBuilderArgument=za,Ga.prototype.copy=function(){var t=new Ga;return t.Pf=this.Pf,t.Uf=this.Uf,t.Qf=this.Qf,t.hg=this.hg,t.kg=this.kg,t.lg=this.lg,t.jg=this.jg,t.ig=this.ig,t.$o=this.$o,t.ap=this.ap,t.gg=this.gg,t.gn=this.gn,t.hn=this.hn,t.jn=this.jn,t.fn=this.fn,t.wg=this.wg,t.Rf=this.Rf,t.Wn=this.Wn,t},Ga.className="GraphObjectEventHandlers",Ya.prototype.copy=function(){var t=new Ya;return t.Oa[0]=this.Oa[0],t.Oa[1]=this.Oa[1],t.Oa[2]=this.Oa[2],t.Oa[3]=this.Oa[3],t.Oa[4]=this.Oa[4],t.Oa[5]=this.Oa[5],t},Ya.prototype.translate=function(t,e){this.Oa[4]+=this.Oa[0]*t+this.Oa[2]*e,this.Oa[5]+=this.Oa[1]*t+this.Oa[3]*e},Ya.prototype.scale=function(t,e){this.Oa[0]*=t,this.Oa[1]*=t,this.Oa[2]*=e,this.Oa[3]*=e},Ya.className="STransform",Xa.prototype.addColorStop=function(t,e){this.ay.push({offset:t,color:e})},Xa.className="SGradient",qa.prototype.resize=function(t,e,i,n){return(this.width!==t||this.height!==e)&&(this.style.width=i+"px",this.style.height=n+"px",this.Ja.setAttributeNS(null,"width",i+"px"),this.Ja.setAttributeNS(null,"height",n+"px"),this.Ja.setAttributeNS(null,"viewBox","0 0 "+i+" "+n),this.context.Bx.firstElementChild.setAttributeNS(null,"width",i+"px"),this.context.Bx.firstElementChild.setAttributeNS(null,"height",n+"px"),!0)},qa.prototype.Pb=function(t,e,i){if(t=this.ownerDocument.createElementNS(this.LA,t),N(e))for(var n in e)t.setAttributeNS("href"===n?"http://www.w3.org/1999/xlink":"",n,e[n]);return void 0!==i&&(t.textContent=i),t},qa.prototype.getBoundingClientRect=function(){return this.Ja.getBoundingClientRect()},qa.prototype.focus=function(){this.Ja.focus()},qa.prototype.ky=function(){this.ownerDocument=null},d.Object.defineProperties(qa.prototype,{width:{get:function(){return this.Ja.width.baseVal.value},set:function(t){this.Ja.width=t}},height:{get:function(){return this.Ja.height.baseVal.value},set:function(t){this.Ja.height=t}},style:{get:function(){return this.Ja.style}}}),qa.className="SVGSurface",i=Ua.prototype,i.arc=function(t,e,i,n,o,r,s,a){var h=2*Math.PI,l=h-1e-6,u=i*Math.cos(n),c=i*Math.sin(n),f=t+u,d=e+c,p=r?0:1;n=r?n-o:o-n,(1e-6<Math.abs(s-f)||1e-6<Math.abs(a-d))&&this.path.push(["L",f,+d]),0>n&&(n=n%h+h),n>l?(this.path.push(["A",i,i,0,1,p,t-u,e-c]),this.path.push(["A",i,i,0,1,p,f,d])):1e-6<n&&this.path.push(["A",i,i,0,+(n>=Math.PI),p,t+i*Math.cos(o),e+i*Math.sin(o)])},i.beginPath=function(){this.path=[]},i.bezierCurveTo=function(t,e,i,n,o,r){this.path.push(["C",t,e,i,n,o,r])},i.clearRect=function(){},i.clip=function(){this.addPath("clipPath",this.path,this.He)},i.closePath=function(){this.path.push(["z"])},i.createLinearGradient=function(t,e,i,n){var o=new Xa("linear");return o.x1=t,o.y1=e,o.x2=i,o.y2=n,o},i.createPattern=function(t){var e="";t instanceof HTMLCanvasElement&&(e=t.toDataURL()),t instanceof HTMLImageElement&&(e=t.getAttribute("src"));var i=this.NA;if(i[e])return"url(#"+i[e]+")";var n="PATTERN"+at++,o={x:0,y:0,width:t.width,height:t.height,href:e};return t=this.Pb("pattern",{width:t.width,height:t.height,id:n,patternUnits:"userSpaceOnUse"}),t.appendChild(this.Pb(Bs,o)),this.svg.appendChild(t),i[e]=n,"url(#"+n+")"},i.createRadialGradient=function(t,e,i,n,o,r){var s=new Xa("radial");return s.x1=t,s.y1=e,s.r1=i,s.x2=n,s.y2=o,s.r2=r,s},i.drawImage=function(t,e,i,n,o,r,s,a,h){var l="";t instanceof HTMLCanvasElement&&(l=t.toDataURL()),t instanceof HTMLImageElement&&(l=t.getAttribute("src"));var u=t instanceof HTMLImageElement?t.naturalWidth:t.width,c=t instanceof HTMLImageElement?t.naturalHeight:t.height;void 0===n&&(r=e,s=i,a=n=u,h=o=c),n=n||0,o=o||0,r=r||0,s=s||0,a=a||0,h=h||0,t={x:0,y:0,width:u||n,height:c||o,href:l},_e.aa(n,a)&&_e.aa(o,h)?-1===l.toLowerCase().indexOf(".svg")&&-1===l.toLowerCase().indexOf("data:image/svg")&&(t.preserveAspectRatio="xMidYMid slice"):t.preserveAspectRatio="none",l="",a/=n,h/=o,0===r&&0===s||(l+=" translate("+r+", "+s+")"),1===a&&1===h||(l+=" scale("+a+", "+h+")"),0===e&&0===i||(l+=" translate("+-e+", "+-i+")"),0===e&&0===i&&n===u&&o===c||(r="CLIP"+at++,s=this.Pb("clipPath",{id:r}),s.appendChild(this.Pb("rect",{x:e,y:i,width:n,height:o})),this.svg.appendChild(s),t["clip-path"]="url(#"+r+")"),Ka(this,Bs,t,this.He,l),this.addElement(Bs,t)},i.fill=function(){this.addPath("fill",this.path,this.He)},i.Je=function(){this.clipInsteadOfFill?this.clip():this.fill()},i.fillRect=function(t,e,i,n){t=[t,e,i,n],t={x:t[0],y:t[1],width:t[2],height:t[3]},Ka(this,"fill",t,this.He),this.addElement("rect",t)},i.fillText=function(t,e,i){t=[t,e,i],e=this.textAlign,"left"===e?e="start":"right"===e?e="end":"center"===e&&(e="middle"),e={x:t[1],y:t[2],style:"font: "+this.font,"text-anchor":e},Ka(this,"fill",e,this.He),this.addElement("text",e,t[0])},i.lineTo=function(t,e){this.path.push(["L",t,e])},i.moveTo=function(t,e){this.path.push(["M",t,e])},i.quadraticCurveTo=function(t,e,i,n){this.path.push(["Q",t,e,i,n])},i.rect=function(t,e,i,n){this.path.push(["M",t,e],["L",t+i,e],["L",t+i,e+n],["L",t,e+n],["z"])},i.restore=function(){this.He=this.stack.pop(),this.path=this.stack.pop();var t=this.stack.pop();this.fillStyle=t.fillStyle,this.font=t.font,this.globalAlpha=t.globalAlpha,this.lineCap=t.lineCap,this.lineDashOffset=t.lineDashOffset,this.lineJoin=t.lineJoin,this.lineWidth=t.lineWidth,this.miterLimit=t.miterLimit,this.shadowBlur=t.shadowBlur,this.shadowColor=t.shadowColor,this.shadowOffsetX=t.shadowOffsetX,this.shadowOffsetY=t.shadowOffsetY,this.strokeStyle=t.strokeStyle,this.textAlign=t.textAlign},i.save=function(){this.stack.push({fillStyle:this.fillStyle,font:this.font,globalAlpha:this.globalAlpha,lineCap:this.lineCap,lineDashOffset:this.lineDashOffset,lineJoin:this.lineJoin,lineWidth:this.lineWidth,miterLimit:this.miterLimit,shadowBlur:this.shadowBlur,shadowColor:this.shadowColor,shadowOffsetX:this.shadowOffsetX,shadowOffsetY:this.shadowOffsetY,strokeStyle:this.strokeStyle,textAlign:this.textAlign});for(var t=[],e=0;e<this.path.length;e++)t.push(this.path[e]);this.stack.push(t),this.stack.push(this.He.copy())},i.setTransform=function(t,e,i,n,o,r){1===t&&0===e&&0===i&&1===n&&0===o&&0===r||_a(this,t,e,i,n,o,r)},i.scale=function(t,e){this.He.scale(t,e)},i.translate=function(t,e){this.He.translate(t,e)},i.transform=function(){},i.stroke=function(){this.addPath("stroke",this.path,this.He)},i.vj=function(){this.clipInsteadOfFill||this.stroke()},i.Pb=function(t,e,i){return this.nu.Pb(t,e,i)},i.addElement=function(t,e,i){return t=this.Pb(t,e,i),0<this.gd.length?this.gd[this.gd.length-1].appendChild(t):this.svg.appendChild(t),this.Wt=t},i.addPath=function(t,e,i){for(var n=[],o=0;o<e.length;o++){var r=T(e[o]),s=[r.shift()];if("A"===s[0])s.push(r.shift()+","+r.shift(),r.shift(),r.shift()+","+r.shift(),r.shift()+","+r.shift());else for(;r.length;)s.push(r.shift()+","+r.shift());n.push(s.join(" "))}e={d:n.join(" ")},"stroke"===t&&this.Vu&&(e["stroke-dasharray"]=this.uh.toString(),e["stroke-dashoffset"]=this.vh),Ka(this,t,e,i),"clipPath"===t?(t="CLIP"+at++,i=this.Pb("clipPath",{id:t}),i.appendChild(this.Pb("path",e)),this.svg.appendChild(i),0<this.gd.length&&this.gd[this.gd.length-1].setAttributeNS(null,"clip-path","url(#"+t+")")):this.addElement("path",e)},i.Ym=function(t){if(0!==this.shadowOffsetX||0!==this.shadowOffsetY||0!==this.shadowBlur){var e="SHADOW"+at++,i=this.addElement("filter",{id:e,x:"-100%",y:"-100%",width:"300%",height:"300%"},null),n=t.computePixelRatio();t=this.Pb("feGaussianBlur",{in:"SourceAlpha",result:"blur",stdDeviation:this.shadowBlur/2/n});var o=this.Pb("feFlood",{in:"blur",result:"flood","flood-color":this.shadowColor}),r=this.Pb("feComposite",{in:"flood",in2:"blur",operator:"in",result:"comp"});n=this.Pb("feOffset",{in:"comp",result:"offsetBlur",dx:this.shadowOffsetX/n,dy:this.shadowOffsetY/n});var s=this.Pb("feMerge",{});s.appendChild(this.Pb("feMergeNode",{in:"offsetBlur"})),s.appendChild(this.Pb("feMergeNode",{in:"SourceGraphic"})),i.appendChild(t),i.appendChild(o),i.appendChild(r),i.appendChild(n),i.appendChild(s),0<this.gd.length&&this.gd[this.gd.length-1].setAttributeNS(null,"filter","url(#"+e+")")}},i.Iw=function(t,e,i){this.et=t,this.ft=e,this.ug=i},i.Ft=function(t,e){this.Vu=!0,this.uh=t,this.vh=e},i.Dt=function(){this.Vu=!1},i.uc=function(){},i.Sy=function(){},Ua.prototype.rotate=function(){},Ua.prototype.getImageData=function(){return null},Ua.prototype.measureText=function(){return null},Ua.className="SVGContext",Ko.prototype.$t=function(t){var e=new qa(this,y.document);void 0===t&&(t=new _);var i=this;return us(this,(function(t,n){return t=cs(i,t,"SVG",e),t=null!==t?t.svg:null,"function"===typeof n?(n(t),null):t}),t)},Ko.prototype.makeSvg=Ko.prototype.$t,Ko.prototype.iw=function(t){return this.$t(t)},Ko.prototype.makeSVG=Ko.prototype.iw,ca.prototype.ly=function(t,e){if(!(t instanceof Ua))return!1;if(!this.visible)return!0;var i=null,n=t.Wt;if(this instanceof Uh&&(this.type===Uh.TableRow||this.type===Uh.TableColumn))return ma(this,t,e),!0;var o=this.xb;if(0===o.width||0===o.height||isNaN(o.x)||isNaN(o.y))return!0;var r=this.transform,s=this.panel;0!==(4096&this.F)===!0&&xa(this);var a=0!==(256&this.F);t.clipInsteadOfFill&&(a=!1);var h=!1;if(this instanceof Il&&(t.font=this.font),a){if(h=s.he()?s.naturalBounds:s.actualBounds,null!==this.Za){var l=this.Za,u=l.x,c=l.y,f=l.width;l=l.height}else u=Math.max(o.x,h.x),c=Math.max(o.y,h.y),f=Math.min(o.right,h.right)-u,l=Math.min(o.bottom,h.bottom)-c;if(u>o.width+o.x||o.x>h.width+h.x||c>o.height+o.y||o.y>h.height+h.y)return!0;h=!0,_a(t,1,0,0,1,0,0),t.save(),t.beginPath(),t.rect(u,c,f,l),t.clip()}if(this.Ff()&&!this.isVisible())return!0;if(t.He.Oa=[1,0,0,1,0,0],(this instanceof Il&&1<this.lineCount||this instanceof Nl&&1<this.geometry.figures.length)&&_a(t,1,0,0,1,0,0),u=!1,this.Ff()&&this.isShadowed&&e.Ke("drawShadows")&&(c=this.shadowOffset,t.Iw(c.x*e.scale*e.Tb,c.y*e.scale*e.Tb,this.shadowBlur),$a(t),t.shadowColor=this.shadowColor),c=!1,this.part&&e.Ke("drawShadows")&&(c=this.part.isShadowed),t.clipInsteadOfFill&&(c=!1),!0===this.shadowVisible?($a(t),!1===u&&c&&(_a(t,1,0,0,1,0,0),t.Ym(e),u=!0)):!1===this.shadowVisible&&Wa(t),f=this.naturalBounds,null!==this.areaBackground&&(va(this,t,this.areaBackground,!0,!0,f,o),!1===u&&c&&(_a(t,1,0,0,1,0,0),t.Ym(e),u=!0),this.areaBackground instanceof eh&&this.areaBackground.type===mh?(t.beginPath(),t.rect(o.x,o.y,o.width,o.height),t.Je(this.areaBackground)):t.fillRect(o.x,o.y,o.width,o.height)),this instanceof Uh?_a(t,r.m11,r.m12,r.m21,r.m22,r.dx,r.dy):(t.He.Oa=[r.m11,r.m12,r.m21,r.m22,r.dx,r.dy],!1===u&&c&&(_a(t,1,0,0,1,0,0),t.Ym(e),u=!0)),null!==this.background){!1===u&&c&&(_a(t,1,0,0,1,0,0),t.Ym(e),u=!0);var d=this.naturalBounds;l=r=0;var p=d.width;d=d.height;var g=0;this instanceof Nl&&(d=this.geometry.bounds,r=d.x,l=d.y,p=d.width,d=d.height,g=this.strokeWidth),va(this,t,this.background,!0,!1,f,o),this.background instanceof eh&&this.background.type===mh?(t.beginPath(),t.rect(r-g/2,l-g/2,p+g,d+g),t.Je(this.background)):t.fillRect(r-g/2,l-g/2,p+g,d+g)}return c&&(null!==this.background||null!==this.areaBackground||null!==s&&0!==(512&s.F)||null!==s&&(s.type===Uh.Auto||s.type===Uh.Spot)&&s.tb()!==this)?(Pa(this,!0),null===this.shadowVisible&&Wa(t)):Pa(this,!1),this.ej(t,e),c&&0!==(512&this.F)===!0&&$a(t),this.Ff()&&c&&Wa(t),a&&(t.restore(),h&&t.gd.pop()),this instanceof Uh&&(i=t.gd.pop()),!0===u&&t.gd.pop(),(this instanceof Il&&1<this.lineCount||this instanceof Nl&&1<this.geometry.figures.length)&&(i=t.gd.pop()),null!==t.nu.Dq&&(null===i&&(n===t.Wt?(_a(t,1,0,0,1,0,0),i=t.gd.pop()):i=t.Wt),t.nu.Dq(this,i)),this.svg=i,!0},Ja.prototype.resize=function(t,e,i,n){return(this.width!==t||this.height!==e)&&(this.width=t,this.height=e,this.style.width=i+"px",this.style.height=n+"px",!0)},Ja.prototype.toDataURL=function(t,e){return this.Ja.toDataURL(t,e)},Ja.prototype.getBoundingClientRect=function(){return this.Ja.getBoundingClientRect()},Ja.prototype.focus=function(){this.Ja.focus()},Ja.prototype.ky=function(){this.ownerDocument=this.Ja.C=null},d.Object.defineProperties(Ja.prototype,{width:{get:function(){return this.Ja.width},set:function(t){this.Ja.width=t}},height:{get:function(){return this.Ja.height},set:function(t){this.Ja.height=t}},style:{get:function(){return this.Ja.style}}}),Ja.className="CanvasSurface",i=Za.prototype,i.Sy=function(t){this.Y.imageSmoothingEnabled=t},i.arc=function(t,e,i,n,o,r){this.Y.arc(t,e,i,n,o,r)},i.beginPath=function(){this.Y.beginPath()},i.bezierCurveTo=function(t,e,i,n,o,r){this.Y.bezierCurveTo(t,e,i,n,o,r)},i.clearRect=function(t,e,i,n){this.Y.clearRect(t,e,i,n)},i.clip=function(){this.Y.clip()},i.closePath=function(){this.Y.closePath()},i.createLinearGradient=function(t,e,i,n){return this.Y.createLinearGradient(t,e,i,n)},i.createPattern=function(t,e){return this.Y.createPattern(t,e)},i.createRadialGradient=function(t,e,i,n,o,r){return this.Y.createRadialGradient(t,e,i,n,o,r)},i.drawImage=function(t,e,i,n,o,r,s,a,h){void 0===n?this.Y.drawImage(t,e,i):this.Y.drawImage(t,e,i,n,o,r,s,a,h)},i.fill=function(){this.Y.fill()},i.fillRect=function(t,e,i,n){this.Y.fillRect(t,e,i,n)},i.fillText=function(t,e,i){this.Y.fillText(t,e,i)},i.getImageData=function(t,e,i,n){return this.Y.getImageData(t,e,i,n)},i.lineTo=function(t,e){this.Y.lineTo(t,e)},i.measureText=function(t){return this.Y.measureText(t)},i.moveTo=function(t,e){this.Y.moveTo(t,e)},i.quadraticCurveTo=function(t,e,i,n){this.Y.quadraticCurveTo(t,e,i,n)},i.rect=function(t,e,i,n){this.Y.rect(t,e,i,n)},i.restore=function(){this.Y.restore()},Za.prototype.rotate=function(t){this.Y.rotate(t)},i=Za.prototype,i.save=function(){this.Y.save()},i.setTransform=function(t,e,i,n,o,r){this.Y.setTransform(t,e,i,n,o,r)},i.scale=function(t,e){this.Y.scale(t,e)},i.stroke=function(){this.Y.stroke()},i.transform=function(t,e,i,n,o,r){1===t&&0===e&&0===i&&1===n&&0===o&&0===r||this.Y.transform(t,e,i,n,o,r)},i.translate=function(t,e){this.Y.translate(t,e)},i.Je=function(t){if(t instanceof eh&&t.type===mh){var e=t.gl;t=t.Au,t>e?(this.scale(e/t,1),this.translate((t-e)/2,0)):e>t&&(this.scale(1,t/e),this.translate(0,(e-t)/2)),this.yn?this.clip():this.fill(),t>e?(this.translate(-(t-e)/2,0),this.scale(1/(e/t),1)):e>t&&(this.translate(0,-(e-t)/2),this.scale(1,1/(t/e)))}else this.yn?this.clip():this.fill()},i.vj=function(){this.yn||this.stroke()},i.Iw=function(t,e,i){this.et=t,this.ft=e,this.ug=i},i.Ft=function(t,e){var i=this.Y;void 0!==i.setLineDash&&(i.setLineDash(t),i.lineDashOffset=e)},i.Dt=function(){var t=this.Y;void 0!==t.setLineDash&&(t.setLineDash(Qa),t.lineDashOffset=0)},i.uc=function(t){t&&(this.yu=""),this.xu=this.zu=""},d.Object.defineProperties(Za.prototype,{fillStyle:{get:function(){return this.Y.fillStyle},set:function(t){this.xu!==t&&(this.xu=this.Y.fillStyle=t)}},font:{get:function(){return this.Y.font},set:function(t){this.yu!==t&&(this.yu=this.Y.font=t)}},globalAlpha:{get:function(){return this.Y.globalAlpha},set:function(t){this.Y.globalAlpha=t}},lineCap:{get:function(){return this.Y.lineCap},set:function(t){this.Y.lineCap=t}},lineDashOffset:{get:function(){return this.Y.lineDashOffset},set:function(t){this.Y.lineDashOffset=t}},lineJoin:{get:function(){return this.Y.lineJoin},set:function(t){this.Y.lineJoin=t}},lineWidth:{get:function(){return this.Y.lineWidth},set:function(t){this.Y.lineWidth=t}},miterLimit:{get:function(){return this.Y.miterLimit},set:function(t){this.Y.miterLimit=t}},shadowBlur:{get:function(){return this.Y.shadowBlur},set:function(t){this.Y.shadowBlur=t}},shadowColor:{get:function(){return this.Y.shadowColor},set:function(t){this.Y.shadowColor=t}},shadowOffsetX:{get:function(){return this.Y.shadowOffsetX},set:function(t){this.Y.shadowOffsetX=t}},shadowOffsetY:{get:function(){return this.Y.shadowOffsetY},set:function(t){this.Y.shadowOffsetY=t}},strokeStyle:{get:function(){return this.Y.strokeStyle},set:function(t){this.zu!==t&&(this.zu=this.Y.strokeStyle=t)}},textAlign:{get:function(){return this.Y.textAlign},set:function(t){this.Y.textAlign=t}},imageSmoothingEnabled:{get:function(){return this.Y.imageSmoothingEnabled},set:function(t){this.Y.imageSmoothingEnabled=t}},clipInsteadOfFill:{get:function(){return this.yn},set:function(t){this.yn=t}}});var Qa=Object.freeze([]);function th(){this.T=this.u=this.I=this.l=0}function eh(t){Ah||(ph(),Ah=!0),ot(this),this.v=!1,void 0===t?(this.qa=gh,this.fl="black"):"string"===typeof t?(this.qa=gh,this.fl=t):(this.qa=t,this.fl="black"),t=this.qa,t===yh?(this.Dd=oe,this.sl=ue):this.sl=this.Dd=t===mh?ae:ie,this.jt=0,this.Vr=NaN,this.ke=this.Ks=this.je=null,this.Au=this.gl=0}function ih(t,e,i){return e=void 0===e||"number"!==typeof e?.2:e,i=void 0===i?xh:i,ah(t),sh(e,i)}function nh(t,e,i){return e=void 0===e||"number"!==typeof e?.2:e,i=void 0===i?xh:i,ah(t),sh(-e,i)}function oh(t,e,i){ah(t),t=Ph.l;var n=Ph.I,o=Ph.u,r=Ph.T;return ah(e),void 0===i&&(i=.5),"rgba("+Math.round((Ph.l-t)*i+t)+", "+Math.round((Ph.I-n)*i+n)+", "+Math.round((Ph.u-o)*i+o)+", "+Math.round((Ph.T-r)*i+r)+")"}function rh(t){return!!t&&(t instanceof eh?t.Fy():(ah(t),128>(299*Ph.l+587*Ph.I+114*Ph.u)/1e3))}function sh(t,e){switch(e){case xh:e=100*lh(Ph.l);var i=100*lh(Ph.I),n=100*lh(Ph.u);return Ch.l=.4124564*e+.3575761*i+.1804375*n,Ch.I=.2126729*e+.7151522*i+.072175*n,Ch.u=.0193339*e+.119192*i+.9503041*n,Ch.T=Ph.T,e=ch(Ch.l/Mh[0]),i=ch(Ch.I/Mh[1]),n=ch(Ch.u/Mh[2]),Th.l=116*i-16,Th.I=500*(e-i),Th.u=200*(i-n),Th.T=Ch.T,Th.l=Math.min(100,Math.max(0,Th.l+100*t)),t=(Th.l+16)/116,e=t-Th.u/200,Ch.l=Mh[0]*fh(Th.I/500+t),Ch.I=Mh[1]*(Th.l>kh*wh?Math.pow(t,3):Th.l/kh),Ch.u=Mh[2]*fh(e),Ch.T=Th.T,t=-.969266*Ch.l+1.8760108*Ch.I+.041556*Ch.u,e=.0556434*Ch.l+-.2040259*Ch.I+1.0572252*Ch.u,Ph.l=255*uh((3.2404542*Ch.l+-1.5371385*Ch.I+-.4985314*Ch.u)/100),Ph.I=255*uh(t/100),Ph.u=255*uh(e/100),Ph.T=Ch.T,Ph.l=Math.round(Ph.l),255<Ph.l?Ph.l=255:0>Ph.l&&(Ph.l=0),Ph.I=Math.round(Ph.I),255<Ph.I?Ph.I=255:0>Ph.I&&(Ph.I=0),Ph.u=Math.round(Ph.u),255<Ph.u?Ph.u=255:0>Ph.u&&(Ph.u=0),"rgba("+Ph.l+", "+Ph.I+", "+Ph.u+", "+Ph.T+")";case bh:return hh(),Nh.u=Math.min(100,Math.max(0,Nh.u+100*t)),"hsla("+Nh.l+", "+Nh.I+"%, "+Nh.u+"%, "+Nh.T+")";default:return w("Unknown color space: "+e),"rgba(0, 0, 0, 1)"}}function ah(t){Ah||(ph(),Ah=!0);var e=Sh;if(null!==e){e.clearRect(0,0,1,1),e.fillStyle="#000000";var i=e.fillStyle;e.fillStyle=t,e.fillStyle!==i?(e.fillRect(0,0,1,1),t=e.getImageData(0,0,1,1).data,Ph.l=t[0],Ph.I=t[1],Ph.u=t[2],Ph.T=t[3]/255):(e.fillStyle="#FFFFFF",e.fillStyle=t,Ph.l=0,Ph.I=0,Ph.u=0,Ph.T=1)}}function hh(){var t=Ph.l/255,e=Ph.I/255,i=Ph.u/255,n=Math.max(t,e,i),o=Math.min(t,e,i),r=n-o;if(o=(n+o)/2,0===r)var s=t=0;else{switch(n){case t:s=(e-i)/r%6;break;case e:s=(i-t)/r+2;break;case i:s=(t-e)/r+4}s*=60,0>s&&(s+=360),t=r/(1-Math.abs(2*o-1))}Nh.l=Math.round(s),Nh.I=Math.round(100*t),Nh.u=Math.round(100*o),Nh.T=Ph.T}function lh(t){return t/=255,.04045>=t?t/12.92:Math.pow((t+.055)/1.055,2.4)}function uh(t){return.0031308>=t?12.92*t:1.055*Math.pow(t,1/2.4)-.055}function ch(t){return t>wh?Math.pow(t,1/3):(kh*t+16)/116}function fh(t){var e=t*t*t;return e>wh?e:(116*t-16)/kh}function dh(t,e){"string"!==typeof t&&(t instanceof eh||w("Value for "+e+" must be a color string or a Brush, not "+t))}function ph(){Sh=ys?new Ja(null).context:null}Za.className="CanvasSurfaceContext",th.className="ColorNumbers",eh.prototype.copy=function(){var t=new eh;return t.qa=this.qa,t.fl=this.fl,t.Dd=this.Dd.H(),t.sl=this.sl.H(),t.jt=this.jt,t.Vr=this.Vr,null!==this.je&&(t.je=this.je.copy()),t.Ks=this.Ks,t},i=eh.prototype,i.freeze=function(){return this.v=!0,null!==this.je&&this.je.freeze(),this},i.ea=function(){return Object.isFrozen(this)&&w("cannot thaw constant: "+this),this.v=!1,null!==this.je&&this.je.ea(),this},i.jb=function(t){t.classType===eh&&(this.type=t)},i.toString=function(){var t="Brush(";if(this.type===gh)t+=this.color;else if(t=this.type===yh?t+"Linear ":this.type===mh?t+"Radial ":this.type===vh?t+"Pattern ":t+"(unknown) ",t+=this.start+" "+this.end,null!==this.colorStops)for(var e=this.colorStops.iterator;e.next();)t+=" "+e.key+":"+e.value;return t+")"},i.addColorStop=function(t,e){return this.v&&k(this),("number"!==typeof t||!isFinite(t)||1<t||0>t)&&M(t,"0 <= loc <= 1",eh,"addColorStop:loc"),null===this.je&&(this.je=new dt),this.je.add(t,e),this.qa===gh&&(this.type=yh),this.ke=null,this},i.FA=function(t,e){if(this.v&&k(this),t=void 0===t||"number"!==typeof t?.2:t,e=void 0===e?xh:e,this.type===gh)ah(this.color),this.color=sh(t,e);else if((this.type===yh||this.type===mh)&&null!==this.colorStops)for(var i=this.colorStops.iterator;i.next();)ah(i.value),this.addColorStop(i.key,sh(t,e));return this},i.Iz=function(t,e){if(this.v&&k(this),t=void 0===t||"number"!==typeof t?.2:t,e=void 0===e?xh:e,this.type===gh)ah(this.color),this.color=sh(-t,e);else if((this.type===yh||this.type===mh)&&null!==this.colorStops)for(var i=this.colorStops.iterator;i.next();)ah(i.value),this.addColorStop(i.key,sh(-t,e));return this},i.Fy=function(){if(this.type===gh)return rh(this.color);if((this.type===yh||this.type===mh)&&null!==this.colorStops){var t=this.colorStops;if(this.type===mh)return rh(t.first().value);if(null!==t.get(.5))return rh(t.get(.5));if(2===t.count)return t=t.ma(),rh(oh(t[0].value,t[1].value));for(var e=t.iterator,i=-1,n=-1,o=1,r=1;e.next();){var s=e.key,a=Math.abs(.5-e.key);o>r&&a<o?(i=s,o=a):r>=o&&a<r&&(n=s,r=a)}return i>n&&(r=i,i=n,n=r,r=o),o=n-i,rh(oh(t.get(i),t.get(n),1-r/o))}return!1},d.Object.defineProperties(eh.prototype,{type:{get:function(){return this.qa},set:function(t){this.v&&k(this,t),this.qa=t,this.start.nc()&&(t===yh?this.start=oe:t===mh&&(this.start=ae)),this.end.nc()&&(t===yh?this.end=ue:t===mh&&(this.end=ae)),this.ke=null}},color:{get:function(){return this.fl},set:function(t){this.v&&k(this,t),this.fl=t,this.ke=null}},start:{get:function(){return this.Dd},set:function(t){this.v&&k(this,t),this.Dd=t.H(),this.ke=null}},end:{get:function(){return this.sl},set:function(t){this.v&&k(this,t),this.sl=t.H(),this.ke=null}},startRadius:{get:function(){return this.jt},set:function(t){this.v&&k(this,t),0>t&&M(t,">= zero",eh,"startRadius"),this.jt=t,this.ke=null}},endRadius:{get:function(){return this.Vr},set:function(t){this.v&&k(this,t),0>t&&M(t,">= zero",eh,"endRadius"),this.Vr=t,this.ke=null}},colorStops:{get:function(){return this.je},set:function(t){this.v&&k(this,t),this.je=t,this.ke=null}},pattern:{get:function(){return this.Ks},set:function(t){this.v&&k(this,t),this.Ks=t,this.ke=null}}}),eh.prototype.isDark=eh.prototype.Fy,eh.prototype.darkenBy=eh.prototype.Iz,eh.prototype.lightenBy=eh.prototype.FA,eh.prototype.addColorStop=eh.prototype.addColorStop;var gh,yh,mh,vh,xh,bh,wh=216/24389,kh=24389/27,Mh=[95.047,100,108.883],Sh=null,Ph=new th,Nh=new th,Ch=new th,Th=new th,Ah=!1;function Lh(){this.oa="Base"}function jh(){this.oa="Base"}function Oh(){this.oa="Base"}function Dh(){this.oa="Base"}function Fh(){this.oa="Base"}function Bh(){this.oa="Base"}function Ih(){this.oa="Base",this.name="Table"}function Eh(){this.oa="Base"}function Rh(){this.oa="Base"}function zh(){this.oa="Base"}function Vh(){this.oa="Base"}function Gh(t,e,i,n){if(0>e)return t%e===i;if(t%e!==i)return!1;e=n.length;for(var o=0;o<e;o++)if(t%n[o]===i)return!1;return!0}function Yh(){this.oa="Base"}function Xh(t,e,i,n){if(!1!==La(n)){var o=n.strokeWidth;0===o&&t instanceof Qu&&t.type===Uh.Link&&t.adornedObject instanceof Nl&&(o=t.adornedObject.strokeWidth),o*=n.Aa,t instanceof Nc&&null!==t.na?(t=t.na.bounds,pa(n,t.x-o/2,t.y-o/2,t.width+o,t.height+o)):t instanceof Qu&&null!==t.adornedPart.na?(t=t.adornedPart.na.bounds,pa(n,t.x-o/2,t.y-o/2,t.width+o,t.height+o)):pa(n,-o/2,-o/2,e+o,i+o),ja(n,!1)}}function qh(){this.oa="Base"}function Uh(t){ca.call(this),this.qa=void 0===t?Uh.Position:t,null===this.qa&&w("Panel type not specified or PanelLayout not loaded: "+t),this.W=new et,this.ib=Re,this.qa===Uh.Grid&&(this.isAtomic=!0),this.Mn=Ce,this.Sf=Ks,this.qa===Uh.Table&&Kh(this),this.pq=Us,this.no=Nt,this.oo=At,this.ko=0,this.jo=100,this.mo=10,this.lo=0,this.li=this.ob=this.eh=this.dh=this.Mj=null,this.Do=NaN,this.te=this.Ci=null,this.Jl="category",this.Zd=null,this.xg=new zt(NaN,NaN,NaN,NaN),this.zh=this.Lp=this.Ui=null,this.Lg=""}function Kh(t){t.Fj=Re,t.Ug=1,t.si=null,t.ri=null,t.Tg=1,t.Sg=null,t.pi=null,t.qb=[],t.nb=[],t.dk=Pl,t.Cj=Pl,t.Xi=0,t.Gi=0}function Hh(t,e,i,n){for(var o=n.length,r=t.actualBounds,s=t.naturalBounds,a=!0,h=0;h<o;h++){var l=n[h];if(void 0!==l)if(a)a=!1;else if(0!==l.actual){if(i){if(l.position>r.height)continue}else if(l.position>r.width)continue;var u=l.separatorStrokeWidth;isNaN(u)&&(u=i?t.Ug:t.Tg);var c=l.separatorStroke;if(null===c&&(c=i?t.si:t.Sg),0!==u&&null!==c){va(t,e,c,!1,!1,s,r),c=!1;var f=l.separatorDashArray;null===f&&(f=i?t.ri:t.pi),null!==f&&(c=!0,e.Ft(f,0)),e.beginPath(),f=l.position+u,i?f>r.height&&(u-=f-r.height):f>r.width&&(u-=f-r.width),l=l.position+u/2,e.lineWidth=u,u=t.ib,i?(l+=u.top,f=r.width-u.right,e.moveTo(u.left,l),e.lineTo(f,l)):(l+=u.left,f=r.height-u.bottom,e.moveTo(l,u.top),e.lineTo(l,f)),e.stroke(),c&&e.Dt()}}}}function _h(t,e,i,n,o){for(var r=n.length,s=t.actualBounds,a=t.naturalBounds,h=0;h<r;h++){var l=n[h];if(void 0!==l&&null!==l.background&&l.coversSeparators!==o&&0!==l.actual){var u=i?s.height:s.width;if(!(l.position>u)){var c=l.wc(),f=l.separatorStrokeWidth;isNaN(f)&&(f=i?t.Ug:t.Tg);var d=l.separatorStroke;null===d&&(d=i?t.si:t.Sg),null===d&&(f=0),c-=f,f=l.position+f,c+=l.actual,f+c>u&&(c=u-f),0>=c||(u=t.ib,va(t,e,l.background,!0,!1,a,s),i?e.fillRect(u.left,f+u.top,s.width-(u.left+u.right),c):e.fillRect(f+u.left,u.top,c,s.height-(u.top+u.bottom)))}}}}function Wh(t){return"LineV"===t||"BarV"===t}function $h(t){return null!==t.part?t.part.locationObject:null}function Jh(t,e){Zh(t,t,e)}function Zh(t,e,i){i(e),e=e.W.j;for(var n=e.length,o=0;o<n;o++){var r=e[o];r instanceof Uh&&Zh(t,r,i)}}function Qh(t,e){tl(t,t,e)}function tl(t,e,i){if(i(e),e instanceof Uh){e=e.W.j;for(var n=e.length,o=0;o<n;o++)tl(t,e[o],i)}}function el(t,e,i){if(i(e))return e;if(e instanceof Uh){e=e.W.j;for(var n=e.length,o=0;o<n;o++){var r=el(t,e[o],i);if(null!==r)return r}}return null}function il(t){t=t.W.j;for(var e=t.length,i=0,n=0;n<e;n++){var o=t[n];o instanceof Uh?i=Math.max(i,il(o)):o instanceof Nl&&(i=Math.max(i,o.wh/2*o.gk*o.Af()))}return i}function nl(t,e,i,n){for(var o=t.W.j,r=o.length;r--;){var s=o[r];if(s.visible){var a=s.actualBounds,h=t.naturalBounds;a.x>h.width||a.y>h.height||0>a.x+a.width||0>a.y+a.height||(s instanceof Uh&&nl(s,e,i,n),null!==e&&(s=e(s)),null===s||null!==i&&!i(s)||n.add(s))}}}function ol(t){var e=null;return t instanceof Nl&&(e=t.spot1,e===Ce&&(e=null),t=t.geometry,null!==t&&null===e&&(e=t.spot1)),null===e&&(e=ne),e}function rl(t){var e=null;return t instanceof Nl&&(e=t.spot2,e===Ce&&(e=null),t=t.geometry,null!==t&&null===e&&(e=t.spot2)),null===e&&(e=ce),e}function sl(t,e){t.F=e?16777216|t.F:-16777217&t.F}function al(t,e,i){var n=t.qb;if(n&&!(0>e)){if(n[e]=i instanceof wl?i:void 0,!i)for(e=n.length-1;0<=e&&void 0===n[e--];)n.length--;t.o()}}function hl(t,e,i){var n=t.nb;if(n&&!(0>e)){if(n[e]=i instanceof wl?i:void 0,!i)for(e=n.length-1;0<=e&&void 0===n[e--];)n.length--;t.o()}}function ll(t){return t=t.li,null!==t&&t.v}function ul(t){var e=t.li;if(null===e)null!==t.data&&w("Template cannot have .data be non-null: "+t),t.li=e=new et;else if(e.v)return;var i=new et;sl(t,!1),t.an(t,(function(t,n){var o=n.fb;if(null!==o)for(Ca(n,!1),o=o.iterator;o.next();){var r=o.value;r.mode===gp&&Ca(n,!0);var s=r.sourceName;null!==s&&("/"===s&&sl(t,!0),s=fp(r,t,n),null!==s&&(i.add(s),null===s.im&&(s.im=new et),s.im.add(r))),e.add(r)}if(n instanceof Uh&&n.type===Uh.Table){if(0<n.qb.length)for(t=n.qb,o=t.length,r=0;r<o;r++)if(s=t[r],void 0!==s&&null!==s.fb)for(var a=s.fb.iterator;a.next();){var h=a.value;h.pd=s,h.hq=2,h.om=s.index,e.add(h)}if(0<n.nb.length)for(n=n.nb,t=n.length,o=0;o<t;o++)if(r=n[o],void 0!==r&&null!==r.fb)for(s=r.fb.iterator;s.next();)a=s.value,a.pd=r,a.hq=1,a.om=r.index,e.add(a)}}));for(var n=i.iterator;n.next();){var o=n.value;if(null!==o.im){Ca(o,!0);for(var r=o.im.iterator;r.next();){var s=r.value;null===o.fb&&(o.fb=new et),o.fb.add(s)}}o.im=null}for(n=e.iterator;n.next();)if(o=n.value,r=o.pd,null!==r){o.pd=null;var a=o.targetProperty,h=a.indexOf(".");0<h&&r instanceof Uh&&(s=a.substring(0,h),a=a.substr(h+1),h=r.bb(s),null!==h?(r=h,o.targetProperty=a):S('Warning: unable to find GraphObject named "'+s+'" for Binding: '+o.toString())),r instanceof wl?(s=st(r.panel),o.wj=void 0===s?-1:s,r.panel.dl=o.wj):r instanceof ca?(s=st(r),o.wj=void 0===s?-1:s,r.dl=o.wj):w("Unknown type of binding target: "+r)}e.freeze(),t instanceof Lu&&t.Nc()&&t.Ta()}function cl(t,e){t=t.W.j;for(var i=t.length,n=e.length,o=0,r=null;o<i&&(r=t[o],!(r instanceof Uh&&null!==r.data));)o++,r=t[o];if(i-o!==n)return!0;if(null===r)return 0<n;for(var s=0;o<i&&s<n;){if(r=t[o],!(r instanceof Uh)||r.data!==e[s])return!0;o++,s++}return!1}function fl(t){if(t.type===Uh.Spot||t.type===Uh.Auto)return Math.min(t.W.length,1);if(t.type===Uh.Link){t=t.W;for(var e=t.length,i=0;i<e;i++){var n=t.J(i);if(!(n instanceof Nl&&n.isPanelMain))break}return i}return t.type===Uh.Table&&0<t.W.length&&(t=t.W.J(0),t.isPanelMain&&t instanceof Uh&&(t.type===Uh.TableRow||t.type===Uh.TableColumn))?1:0}function dl(t,e,i){if(!(void 0===e||null===e||0>i)){var n=gl(t,e),o=t.itemTemplateMap,r=null;null!==o&&(r=o.G(n)),null===r&&(null!==o&&(r=o.G("")),null===r&&(vl||(vl=!0,S('No item template Panel found for category "'+n+'" on '+t),S("  Using default item template."),n=new Uh,o=new Il,o.bind(new cp("text","",F)),n.add(o),xl=n),r=xl)),n=r,null!==n&&(ul(n),n=n.copy(),0!==(16777216&n.F)&&(o=t.ij(),null!==o&&sl(o,!0)),"object"===typeof e&&(null===t.Zd&&(t.Zd=new dt),t.Zd.add(e,n)),o=i+fl(t),t.wb(o,n),n.ob=e,pl(t,o,i),n.ob=null,n.data=e)}}function pl(t,e,i){for(t=t.W;e<t.length;){var n=t.J(e);if(n instanceof Uh){var o=e,r=i;n.type===Uh.TableRow?n.row=o:n.type===Uh.TableColumn&&(n.column=o),n.itemIndex=r}e++,i++}}function gl(t,e){if(null===e)return"";if(t=t.Jl,"function"===typeof t)t=t(e);else{if("string"!==typeof t||"object"!==typeof e)return"";if(""===t)return"";t=ap(e,t)}return void 0===t?"":"string"===typeof t?t:(w("Panel.getCategoryForItemData found a non-string category for "+e+": "+t),"")}function yl(t,e,i){var n=e.enabledChanged;if(null!==n&&n(e,i),e instanceof Uh){e=e.W.j,n=e.length;for(var o=0;o<n;o++){var r=e[o];i&&r instanceof Uh&&!r.isEnabled||yl(t,r,i)}}}function ml(t,e){e.name=t,bl.add(t,e)}eh.className="Brush",eh.Solid=gh=new U(eh,"Solid",0),eh.Linear=yh=new U(eh,"Linear",1),eh.Radial=mh=new U(eh,"Radial",2),eh.Pattern=vh=new U(eh,"Pattern",4),eh.Lab=xh=new U(eh,"Lab",5),eh.HSL=bh=new U(eh,"HSL",6),eh.randomColor=function(t,e){void 0===t&&(t=128),void 0===e&&(e=Math.max(t,255));var i=Math.abs(e-t);e=Math.floor(t+Math.random()*i).toString(16);var n=Math.floor(t+Math.random()*i).toString(16);return t=Math.floor(t+Math.random()*i).toString(16),2>e.length&&(e="0"+e),2>n.length&&(n="0"+n),2>t.length&&(t="0"+t),"#"+e+n+t},eh.isValidColor=function(t){if("black"===t)return!0;if(""===t)return!1;Ah||(ph(),Ah=!0);var e=Sh;if(null===e)return!0;e.fillStyle="#000000";var i=e.fillStyle;return e.fillStyle=t,e.fillStyle!==i||(e.fillStyle="#FFFFFF",i=e.fillStyle,e.fillStyle=t,e.fillStyle!==i)},eh.lighten=function(t){return ih(t)},eh.lightenBy=ih,eh.darken=function(t){return nh(t)},eh.darkenBy=nh,eh.mix=oh,eh.isDark=rh,Lh.prototype.measure=function(){},Lh.prototype.IA=function(t,e,i,n,o){t.measure(e,i,n,o)},Lh.prototype.arrange=function(){},Lh.prototype.wz=function(t,e,i,n,o,r){t.arrange(e,i,n,o,r)},Lh.prototype.RA=function(t){t.Bk()},Lh.prototype.mc=function(){},d.Object.defineProperties(Lh.prototype,{name:{get:function(){return this.oa},set:function(t){this.oa=t}},classType:{get:function(){return Uh}}}),Lh.prototype.remeasureObject=Lh.prototype.RA,Lh.prototype.arrangeElement=Lh.prototype.wz,Lh.prototype.measureElement=Lh.prototype.IA,Lh.className="PanelLayout",f(jh,Lh),jh.prototype.measure=function(t,e,i,n,o,r,s){var a=n.length;t=$h(t);for(var h=0;h<a;h++){var l=n[h];if(l.visible||l===t){var u=l.margin,c=u.right+u.left;u=u.top+u.bottom,l.measure(e,i,r,s);var f=l.measuredBounds;c=Math.max(f.width+c,0),u=Math.max(f.height+u,0),f=l.position.x;var d=l.position.y;isFinite(f)||(f=0),isFinite(d)||(d=0),l instanceof Nl&&l.isGeometryPositioned&&(l=l.strokeWidth/2,f-=l,d-=l),Ht(o,f,d,c,u)}}},jh.prototype.arrange=function(t,e,i){var n=e.length,o=t.padding;for(t=i.x-o.left,i=i.y-o.top,o=0;o<n;o++){var r=e[o],s=r.measuredBounds,a=r.margin,h=r.position.x,l=r.position.y;if(h=isNaN(h)?-t:h-t,l=isNaN(l)?-i:l-i,r instanceof Nl&&r.isGeometryPositioned){var u=r.strokeWidth/2;h-=u,l-=u}r.visible&&r.arrange(h+a.left,l+a.top,s.width,s.height)}},f(Oh,Lh),Oh.prototype.measure=function(t,e,i,n,o,r,s){var a=n.length;e=j(),r=$h(t);for(var h=0;h<a;h++){var l=n[h];if(l.visible||l===r){var u=ka(l,!1);if(u!==qs&&u!==Hs)e.push(l);else{l.measure(1/0,i,0,s),u=l.margin,l=l.measuredBounds;var c=Math.max(l.height+u.top+u.bottom,0);o.width+=Math.max(l.width+u.right+u.left,0),o.height=Math.max(o.height,c)}}}for(n=e.length,t.desiredSize.height?i=Math.min(t.desiredSize.height,t.maxSize.height):0!==o.height&&(i=Math.min(o.height,t.maxSize.height)),t=0;t<n;t++)h=e[t],(h.visible||h===r)&&(u=h.margin,a=u.right+u.left,u=u.top+u.bottom,h.measure(1/0,i,0,s),h=h.measuredBounds,u=Math.max(h.height+u,0),o.width+=Math.max(h.width+a,0),o.height=Math.max(o.height,u));O(e)},Oh.prototype.arrange=function(t,e,i){for(var n=e.length,o=t.padding,r=o.top,s=t.isOpposite,a=s?i.width:o.left,h=0;h<n;h++){var l=r,u=e[h];if(u.visible){var c=u.measuredBounds,f=u.margin,d=f.top+f.bottom,p=r+o.bottom,g=c.height,y=ka(u,!1);(isNaN(u.desiredSize.height)&&y===Xs||y===_s)&&(g=Math.max(i.height-d-p,0)),d=g+d+p,p=u.alignment,p.Mb()&&(p=t.defaultAlignment),p.kb()||(p=ae),s&&(a-=c.width+f.left+f.right),u.arrange(a+p.offsetX+f.left,l+p.offsetY+f.top+(i.height*p.y-d*p.y),c.width,g),s||(a+=c.width+f.left+f.right)}}},f(Dh,Lh),Dh.prototype.measure=function(t,e,i,n,o,r){var s=n.length;i=j();for(var a=$h(t),h=0;h<s;h++){var l=n[h];if(l.visible||l===a){var u=ka(l,!1);if(u!==qs&&u!==_s)i.push(l);else{var c=l.margin;u=c.right+c.left,c=c.top+c.bottom,l.measure(e,1/0,r,0),l=l.measuredBounds,Vt(o,Math.max(o.width,Math.max(l.width+u,0)),o.height+Math.max(l.height+c,0))}}}if(n=i.length,0!==n){for(t.desiredSize.width?e=Math.min(t.desiredSize.width,t.maxSize.width):0!==o.width&&(e=Math.min(o.width,t.maxSize.width)),t=0;t<n;t++)h=i[t],(h.visible||h===a)&&(l=h.margin,s=l.right+l.left,l=l.top+l.bottom,h.measure(e,1/0,r,0),h=h.measuredBounds,l=Math.max(h.height+l,0),o.width=Math.max(o.width,Math.max(h.width+s,0)),o.height+=l);O(i)}},Dh.prototype.arrange=function(t,e,i){for(var n=e.length,o=t.padding,r=o.left,s=t.isOpposite,a=s?i.height:o.top,h=0;h<n;h++){var l=r,u=e[h];if(u.visible){var c=u.measuredBounds,f=u.margin,d=f.left+f.right,p=r+o.right,g=c.width,y=ka(u,!1);(isNaN(u.desiredSize.width)&&y===Xs||y===Hs)&&(g=Math.max(i.width-d-p,0)),d=g+d+p,p=u.alignment,p.Mb()&&(p=t.defaultAlignment),p.kb()||(p=ae),s&&(a-=c.height+f.bottom+f.top),u.arrange(l+p.offsetX+f.left+(i.width*p.x-d*p.x),a+p.offsetY+f.top,g,c.height),s||(a+=c.height+f.bottom+f.top)}}},f(Fh,Lh),Fh.prototype.measure=function(t,e,i,n,o,r,s){var a=n.length,h=t.tb(),l=h.margin,u=l.right+l.left,c=l.top+l.bottom;h.measure(e,i,r,s);var f=h.measuredBounds;r=f.width,s=f.height;for(var d=Math.max(r+u,0),p=Math.max(s+c,0),g=t.isClipping,y=zt.allocAt(-l.left,-l.top,d,p),m=!0,v=$h(t),x=0;x<a;x++){var b=n[x];if(b!==h&&(b.visible||b===v)){switch(l=b.margin,d=l.right+l.left,p=l.top+l.bottom,f=ka(b,!1),f){case Xs:e=r,i=s;break;case Hs:e=r;break;case _s:i=s}b.measure(e,i,0,0),f=b.measuredBounds,d=Math.max(f.width+d,0),p=Math.max(f.height+p,0);var w=b.alignment;w.Mb()&&(w=t.defaultAlignment),w.kb()||(w=ae);var k=b.alignmentFocus;k.Mb()&&(k=ae);var M=null;if(b instanceof Uh&&""!==b.Lg&&(b.arrange(0,0,f.width,f.height),M=b.bb(b.Lg),M===b&&(M=null)),null!==M){for(l=M.naturalBounds,f=M.margin,l=pt.allocAt(k.x*l.width-k.offsetX-f.left,k.y*l.height-k.offsetY-f.top);M!==b;)M.transform.ta(l),M=M.panel;b=w.x*r+w.offsetX-l.x,f=w.y*s+w.offsetY-l.y,pt.free(l)}else b=w.x*r+w.offsetX-(k.x*f.width+k.offsetX)-l.left,f=w.y*s+w.offsetY-(k.y*f.height+k.offsetY)-l.top;m?(m=!1,o.h(b,f,d,p)):Ht(o,b,f,d,p)}}switch(m?o.assign(y):g?o.bw(y.x,y.y,y.width,y.height):Ht(o,y.x,y.y,y.width,y.height),zt.free(y),f=h.stretch,f===Ks&&(f=ka(h,!1)),f){case qs:return;case Xs:if(!isFinite(e)&&!isFinite(i))return;break;case Hs:if(!isFinite(e))return;break;case _s:if(!isFinite(i))return}for(f=h.measuredBounds,r=f.width,s=f.height,d=Math.max(r+u,0),p=Math.max(s+c,0),l=h.margin,y=zt.allocAt(-l.left,-l.top,d,p),e=0;e<a;e++)i=n[e],i===h||!i.visible&&i!==v||(l=i.margin,d=l.right+l.left,p=l.top+l.bottom,f=i.measuredBounds,d=Math.max(f.width+d,0),p=Math.max(f.height+p,0),u=i.alignment,u.Mb()&&(u=t.defaultAlignment),u.kb()||(u=ae),i=i.alignmentFocus,i.Mb()&&(i=ae),m?(m=!1,o.h(u.x*r+u.offsetX-(i.x*f.width+i.offsetX)-l.left,u.y*s+u.offsetY-(i.y*f.height+i.offsetY)-l.top,d,p)):Ht(o,u.x*r+u.offsetX-(i.x*f.width+i.offsetX)-l.left,u.y*s+u.offsetY-(i.y*f.height+i.offsetY)-l.top,d,p));m?o.assign(y):g?o.bw(y.x,y.y,y.width,y.height):Ht(o,y.x,y.y,y.width,y.height),zt.free(y)},Fh.prototype.arrange=function(t,e,i){var n=e.length,o=t.tb(),r=o.measuredBounds,s=r.width;r=r.height;var a=t.padding,h=a.left;a=a.top;var l=h-i.x,u=a-i.y;o.arrange(l,u,s,r);for(var c=0;c<n;c++){var f=e[c];if(f!==o){var d=f.measuredBounds,p=d.width;d=d.height,u=f.alignment,u.Mb()&&(u=t.defaultAlignment),u.kb()||(u=ae);var g=f.alignmentFocus;if(g.Mb()&&(g=ae),l=null,f instanceof Uh&&""!==f.Lg&&(l=f.bb(f.Lg),l===f&&(l=null)),null!==l){var y=l.naturalBounds;for(g=pt.allocAt(g.x*y.width-g.offsetX,g.y*y.height-g.offsetY);l!==f;)l.transform.ta(g),l=l.panel;l=u.x*s+u.offsetX-g.x,u=u.y*r+u.offsetY-g.y,pt.free(g)}else l=u.x*s+u.offsetX-(g.x*p+g.offsetX),u=u.y*r+u.offsetY-(g.y*d+g.offsetY);l-=i.x,u-=i.y,f.visible&&f.arrange(h+l,a+u,p,d)}}},f(Bh,Lh),Bh.prototype.measure=function(t,e,i,n,o,r,s){var a=n.length,h=t.tb(),l=h.margin,u=e,c=i,f=l.right+l.left,d=l.top+l.bottom;h.measure(e,i,r,s),l=h.measuredBounds;var p=0,g=null;h instanceof Nl&&(g=h,p=g.strokeWidth*g.scale);var y=Math.max(l.width+f,0);l=Math.max(l.height+d,0);var m=ol(h),v=m.x*y+m.offsetX;m=m.y*l+m.offsetY;var x=rl(h),b=x.x*y+x.offsetX;for(x=x.y*l+x.offsetY,isFinite(e)&&(u=Math.max(Math.abs(v-b)-p,0)),isFinite(i)&&(c=Math.max(Math.abs(m-x)-p,0)),p=Bt.alloc(),p.h(0,0),t=$h(t),x=0;x<a;x++)m=n[x],m===h||!m.visible&&m!==t||(l=m.margin,y=l.right+l.left,v=l.top+l.bottom,m.measure(u,c,0,0),l=m.measuredBounds,y=Math.max(l.width+y,0),l=Math.max(l.height+v,0),p.h(Math.max(y,p.width),Math.max(l,p.height)));if(1===a)o.width=y,o.height=l,Bt.free(p);else{switch(m=ol(h),x=rl(h),a=n=0,x.x!==m.x&&x.y!==m.y&&(n=p.width/Math.abs(x.x-m.x),a=p.height/Math.abs(x.y-m.y)),Bt.free(p),p=0,null!==g&&(p=g.strokeWidth*g.scale,Tl(g)===Us&&(n=a=Math.max(n,a))),n+=Math.abs(m.offsetX)+Math.abs(x.offsetX)+p,a+=Math.abs(m.offsetY)+Math.abs(x.offsetY)+p,g=h.stretch,g===Ks&&(g=ka(h,!1)),g){case qs:s=r=0;break;case Xs:isFinite(e)&&(n=e),isFinite(i)&&(a=i);break;case Hs:isFinite(e)&&(n=e),s=0;break;case _s:r=0,isFinite(i)&&(a=i)}h.Bk(),h.measure(n,a,r,s),o.width=h.measuredBounds.width+f,o.height=h.measuredBounds.height+d}},Bh.prototype.arrange=function(t,e){var i=e.length,n=t.tb(),o=n.measuredBounds,r=zt.alloc();r.h(0,0,1,1);var s=n.margin,a=s.left;s=s.top;var h=t.padding,l=h.left;h=h.top,n.arrange(l+a,h+s,o.width,o.height);var u=ol(n),c=rl(n),f=u.y*o.height+u.offsetY,d=c.x*o.width+c.offsetX;for(c=c.y*o.height+c.offsetY,r.x=u.x*o.width+u.offsetX,r.y=f,Ht(r,d,c,0,0),r.x+=a+l,r.y+=s+h,o=0;o<i;o++)a=e[o],a!==n&&(l=a.measuredBounds,s=a.margin,h=Math.max(l.width+s.right+s.left,0),u=Math.max(l.height+s.top+s.bottom,0),f=a.alignment,f.Mb()&&(f=t.defaultAlignment),f.kb()||(f=ae),h=r.width*f.x+f.offsetX-h*f.x+s.left+r.x,s=r.height*f.y+f.offsetY-u*f.y+s.top+r.y,a.visible&&(_t(r.x,r.y,r.width,r.height,h,s,l.width,l.height)?a.arrange(h,s,l.width,l.height):a.arrange(h,s,l.width,l.height,new zt(r.x,r.y,r.width,r.height))));zt.free(r)},f(Ih,Lh),Ih.prototype.measure=function(t,e,i,n,o){for(var r=n.length,s=j(),a=j(),h=0;h<r;h++){var l=n[h],u=l instanceof Uh?l:null;if(null===u||u.type!==Uh.TableRow&&u.type!==Uh.TableColumn||!l.visible)s.push(l);else{a.push(u);for(var c=u.W.j,f=c.length,d=0;d<f;d++){var p=c[d];u.type===Uh.TableRow?p.row=l.row:u.type===Uh.TableColumn&&(p.column=l.column),s.push(p)}}}r=s.length,0===r&&(t.getRowDefinition(0),t.getColumnDefinition(0));for(var g=[],y=0;y<r;y++){var m=s[y];ja(m,!0),Da(m,!0),g[m.row]||(g[m.row]=[]),g[m.row][m.column]||(g[m.row][m.column]=[]),g[m.row][m.column].push(m)}O(s);var v=j(),x=j(),b=j(),w={count:0},k={count:0},M=e,S=i,P=t.qb;r=P.length;for(var N=0;N<r;N++){var C=P[N];void 0!==C&&(C.actual=0)}P=t.nb,r=P.length;for(var T=0;T<r;T++)C=P[T],void 0!==C&&(C.actual=0);for(var A=g.length,L=0,D=0;D<A;D++)g[D]&&(L=Math.max(L,g[D].length));var F=Math.min(t.topIndex,A-1),B=Math.min(t.leftIndex,L-1),I=0;A=g.length;for(var E=$h(t),R=0;R<A;R++)if(g[R]){L=g[R].length;var z=t.getRowDefinition(R);z.actual=0;for(var V=z.bc=0;V<L;V++)if(g[R][V]){var G=t.getColumnDefinition(V);void 0===v[V]&&(G.actual=0,G.bc=0,v[V]=!0);for(var Y=g[R][V],X=Y.length,q=0;q<X;q++){var U=Y[q];if(U.visible||U===E){var K=1<U.rowSpan||1<U.columnSpan;K&&(R<F||V<B||x.push(U));var H=U.margin,_=H.right+H.left,W=H.top+H.bottom,$=Ma(U,z,G,!1),J=U.desiredSize,Z=!isNaN(J.height),Q=!isNaN(J.width)&&Z;if(K||$===qs||Q||R<F||V<B||(void 0!==w[V]||$!==Xs&&$!==Hs||(w[V]=-1,w.count++),void 0!==k[R]||$!==Xs&&$!==_s||(k[R]=-1,k.count++),b.push(U)),U.measure(1/0,1/0,0,0),!(R<F||V<B)){var tt=U.measuredBounds,et=Math.max(tt.width+_,0),it=Math.max(tt.height+W,0);if(1===U.rowSpan&&($===qs||$===Hs)){C=t.getRowDefinition(R);var nt=C.wc();I=Math.max(it-C.actual,0),I+nt>S&&(I=Math.max(S-nt,0));var ot=0===C.ha;C.bc=C.bc+I,C.actual=C.ha+I,S=Math.max(S-(I+(ot?nt:0)),0)}if(1===U.columnSpan&&($===qs||$===_s)){C=t.getColumnDefinition(V);var rt=C.wc();I=Math.max(et-C.actual,0),I+rt>M&&(I=Math.max(M-rt,0));var st=0===C.ha;C.bc=C.bc+I,C.actual=C.ha+I,M=Math.max(M-(I+(st?rt:0)),0)}K&&U.Bk()}}}}}O(v);var at=0,ht=0;r=t.columnCount;for(var lt=0;lt<r;lt++){var ut=t.nb[lt];void 0!==ut&&(at+=ut.bc,0!==ut.bc&&(at+=ut.wc()))}r=t.rowCount;for(var ct=0;ct<r;ct++){var ft=t.qb[ct];void 0!==ft&&(ht+=ft.bc,0!==ft.bc&&(ht+=ft.wc()))}M=Math.max(e-at,0);var dt=S=Math.max(i-ht,0),pt=M;r=b.length;for(var gt=0;gt<r;gt++){var yt=b[gt],mt=t.getRowDefinition(yt.row),vt=t.getColumnDefinition(yt.column),xt=yt.measuredBounds,bt=yt.margin,wt=bt.right+bt.left,kt=bt.top+bt.bottom;w[yt.column]=0===vt.bc&&void 0!==w[yt.column]?Math.max(xt.width+wt,w[yt.column]):null,k[yt.row]=0===mt.bc&&void 0!==k[yt.row]?Math.max(xt.height+kt,k[yt.row]):null}var Mt,St=0,Pt=0;for(Mt in k)"count"!==Mt&&(St+=k[Mt]);for(Mt in w)"count"!==Mt&&(Pt+=w[Mt]);for(var Nt=Bt.alloc(),Ct=0;Ct<r;Ct++){var Tt=b[Ct];if(Tt.visible||Tt===E){var At=t.getRowDefinition(Tt.row),Lt=t.getColumnDefinition(Tt.column),jt=0;isFinite(Lt.width)?jt=Lt.width:(jt=isFinite(M)&&null!==w[Tt.column]?0===Pt?Lt.actual+M:w[Tt.column]/Pt*pt:null!==w[Tt.column]?M:Lt.actual||M,jt=Math.max(0,jt-Lt.wc()));var Ot=0;switch(isFinite(At.height)?Ot=At.height:(Ot=isFinite(S)&&null!==k[Tt.row]?0===St?At.actual+S:k[Tt.row]/St*dt:null!==k[Tt.row]?S:At.actual||S,Ot=Math.max(0,Ot-At.wc())),Nt.h(Math.max(Lt.minimum,Math.min(jt,Lt.maximum)),Math.max(At.minimum,Math.min(Ot,At.maximum))),$=Ma(Tt,At,Lt,!1),$){case Hs:Nt.height=Math.max(Nt.height,At.actual+S);break;case _s:Nt.width=Math.max(Nt.width,Lt.actual+M)}var Dt=Tt.margin,Ft=Dt.right+Dt.left,It=Dt.top+Dt.bottom;Tt.Bk(),Tt.measure(Nt.width,Nt.height,Lt.minimum,At.minimum);var Et=Tt.measuredBounds,Rt=Math.max(Et.width+Ft,0),zt=Math.max(Et.height+It,0);isFinite(M)&&(Rt=Math.min(Rt,Nt.width)),isFinite(S)&&(zt=Math.min(zt,Nt.height));var Vt=0;Vt=At.actual,At.actual=Math.max(At.actual,zt),At.bc=Math.max(At.bc,zt),I=At.actual-Vt,S=Math.max(S-I,0),null===k[Tt.row]&&(dt=Math.max(dt-I,0)),Vt=Lt.actual,Lt.actual=Math.max(Lt.actual,Rt),Lt.bc=Math.max(Lt.bc,Rt),I=Lt.actual-Vt,M=Math.max(M-I,0),null===w[Tt.column]&&(pt=Math.max(pt-I,0))}}O(b);var Gt=Bt.alloc(),Yt=j(),Xt=j();if(r=x.length,0!==r)for(var qt=0;qt<A;qt++)if(g[qt]){L=g[qt].length;var Ut=t.getRowDefinition(qt);Yt[qt]=Ut.actual;for(var Kt=0;Kt<L;Kt++)if(g[qt][Kt]){var Ht=t.getColumnDefinition(Kt);Xt[Kt]=Ht.actual}}for(var _t=0;_t<r;_t++){var Wt=x[_t];if(Wt.visible||Wt===E){var $t=t.getRowDefinition(Wt.row),Jt=t.getColumnDefinition(Wt.column);switch(Nt.h(Math.max(Jt.minimum,Math.min(e,Jt.maximum)),Math.max($t.minimum,Math.min(i,$t.maximum))),$=Ma(Wt,$t,Jt,!1),$){case Xs:0!==Xt[Jt.index]&&(Nt.width=Math.min(Nt.width,Xt[Jt.index])),0!==Yt[$t.index]&&(Nt.height=Math.min(Nt.height,Yt[$t.index]));break;case Hs:0!==Xt[Jt.index]&&(Nt.width=Math.min(Nt.width,Xt[Jt.index]));break;case _s:0!==Yt[$t.index]&&(Nt.height=Math.min(Nt.height,Yt[$t.index]))}isFinite(Jt.width)&&(Nt.width=Jt.width),isFinite($t.height)&&(Nt.height=$t.height),Gt.h(0,0);for(var Zt=Jt.minimum,Qt=$t.minimum,te=1;te<Wt.rowSpan&&!(Wt.row+te>=t.rowCount);te++)C=t.getRowDefinition(Wt.row+te),I=0,I=$===Xs||$===_s?Math.max(C.minimum,0===Yt[Wt.row+te]?C.maximum:Math.min(Yt[Wt.row+te],C.maximum)):Math.max(C.minimum,isNaN(C.ad)?C.maximum:Math.min(C.ad,C.maximum)),Gt.height+=I,Qt+=C.minimum;for(var ee=1;ee<Wt.columnSpan&&!(Wt.column+ee>=t.columnCount);ee++)C=t.getColumnDefinition(Wt.column+ee),I=0,I=$===Xs||$===Hs?Math.max(C.minimum,0===Xt[Wt.column+ee]?C.maximum:Math.min(Xt[Wt.column+ee],C.maximum)):Math.max(C.minimum,isNaN(C.ad)?C.maximum:Math.min(C.ad,C.maximum)),Gt.width+=I,Zt+=C.minimum;Nt.width+=Gt.width,Nt.height+=Gt.height;var ie=Wt.margin,ne=ie.right+ie.left,oe=ie.top+ie.bottom;Wt.measure(Nt.width,Nt.height,Zt,Qt);for(var re=Wt.measuredBounds,se=Math.max(re.width+ne,0),ae=Math.max(re.height+oe,0),he=0,le=0;le<Wt.rowSpan&&!(Wt.row+le>=t.rowCount);le++)C=t.getRowDefinition(Wt.row+le),he+=C.total||0;if(he<ae){var ue=ae-he,ce=ae-he;if(null!==Wt.spanAllocation)for(var fe=Wt.spanAllocation,de=0;de<Wt.rowSpan&&!(0>=ue)&&!(Wt.row+de>=t.rowCount);de++){C=t.getRowDefinition(Wt.row+de);var pe=C.ha||0,ge=fe(Wt,C,ce);C.actual=Math.min(C.maximum,pe+ge),C.ha!==pe&&(ue-=C.ha-pe)}for(;0<ue;){var ye=C.ha||0;if(isNaN(C.height)&&C.maximum>ye&&(C.actual=Math.min(C.maximum,ye+ue),C.ha!==ye&&(ue-=C.ha-ye)),0===C.index)break;C=t.getRowDefinition(C.index-1)}}for(var me=0,ve=0;ve<Wt.columnSpan&&!(Wt.column+ve>=t.columnCount);ve++)C=t.getColumnDefinition(Wt.column+ve),me+=C.total||0;if(me<se){var xe=se-me,be=se-me;if(null!==Wt.spanAllocation)for(var we=Wt.spanAllocation,ke=0;ke<Wt.columnSpan&&!(0>=xe)&&!(Wt.column+ke>=t.columnCount);ke++){C=t.getColumnDefinition(Wt.column+ke);var Me=C.ha||0,Se=we(Wt,C,be);C.actual=Math.min(C.maximum,Me+Se),C.ha!==Me&&(xe-=C.ha-Me)}for(;0<xe;){var Pe=C.ha||0;if(isNaN(C.width)&&C.maximum>Pe&&(C.actual=Math.min(C.maximum,Pe+xe),C.ha!==Pe&&(xe-=C.ha-Pe)),0===C.index)break;C=t.getColumnDefinition(C.index-1)}}}}O(x),Bt.free(Gt),Bt.free(Nt),void 0!==Yt&&O(Yt),void 0!==Xt&&O(Xt);var Ne=0,Ce=0,Te=t.desiredSize,Ae=t.maxSize;$=ka(t,!0);var Le=ht=at=0,je=0;r=t.columnCount;for(var Oe=0;Oe<r;Oe++)void 0!==t.nb[Oe]&&(C=t.getColumnDefinition(Oe),isFinite(C.width)?(Le+=C.width,Le+=C.wc()):kl(C)===Sl?(Le+=C.ha,Le+=C.wc()):0!==C.ha&&(at+=C.ha,at+=C.wc()));Ne=isFinite(Te.width)?Math.min(Te.width,Ae.width):$!==qs&&isFinite(e)?e:at,Ne=Math.max(Ne,t.minSize.width),Ne=Math.max(Ne-Le,0);for(var De=0===at?1:Math.max(Ne/at,1),Fe=0;Fe<r;Fe++)void 0!==t.nb[Fe]&&(C=t.getColumnDefinition(Fe),isFinite(C.width)||kl(C)===Sl||(C.actual=C.ha*De),C.position=o.width,0!==C.ha&&(o.width+=C.ha,o.width+=C.wc()));r=t.rowCount;for(var Be=0;Be<r;Be++)void 0!==t.qb[Be]&&(C=t.getRowDefinition(Be),isFinite(C.height)?(je+=C.height,je+=C.wc()):kl(C)===Sl?(je+=C.ha,je+=C.wc()):0!==C.ha&&(ht+=C.ha,0!==C.ha&&(ht+=C.wc())));Ce=isFinite(Te.height)?Math.min(Te.height,Ae.height):$!==qs&&isFinite(i)?i:ht,Ce=Math.max(Ce,t.minSize.height),Ce=Math.max(Ce-je,0);for(var Ie=0===ht?1:Math.max(Ce/ht,1),Ee=0;Ee<r;Ee++)void 0!==t.qb[Ee]&&(C=t.getRowDefinition(Ee),isFinite(C.height)||kl(C)===Sl||(C.actual=C.ha*Ie),C.position=o.height,0!==C.ha&&(o.height+=C.ha,0!==C.ha&&(o.height+=C.wc())));r=a.length;for(var Re=0;Re<r;Re++){var ze=a[Re],Ve=0,Ge=0;ze.type===Uh.TableRow?(Ve=o.width,C=t.getRowDefinition(ze.row),Ge=C.actual):(C=t.getColumnDefinition(ze.column),Ve=C.actual,Ge=o.height),ze.measuredBounds.h(0,0,Ve,Ge),ja(ze,!1),g[ze.row]||(g[ze.row]=[]),g[ze.row][ze.column]||(g[ze.row][ze.column]=[]),g[ze.row][ze.column].push(ze)}O(a),t.Lp=g},Ih.prototype.arrange=function(t,e,i){var n=e.length,o=t.padding,r=o.left;o=o.top;for(var s,a,h=t.Lp,l=h.length,u=0,c=0;c<l;c++)h[c]&&(u=Math.max(u,h[c].length));for(c=Math.min(t.topIndex,l-1);c!==l&&(void 0===t.qb[c]||0===t.qb[c].ha);)c++;for(c=Math.min(c,l-1),c=-t.qb[c].position,s=Math.min(t.leftIndex,u-1);s!==u&&(void 0===t.nb[s]||0===t.nb[s].ha);)s++;s=Math.min(s,u-1);for(var f=-t.nb[s].position,d=Bt.alloc(),p=0;p<l;p++)if(h[p]){u=h[p].length;var g=t.getRowDefinition(p);a=g.position+c+o,0!==g.ha&&(a+=g.Jv());for(var y=0;y<u;y++)if(h[p][y]){var m=t.getColumnDefinition(y);s=m.position+f+r,0!==m.ha&&(s+=m.Jv());for(var v=h[p][y],x=v.length,b=0;b<x;b++){var w=v[b],k=w.measuredBounds,M=w instanceof Uh?w:null;if(null===M||M.type!==Uh.TableRow&&M.type!==Uh.TableColumn){d.h(0,0);for(var S=1;S<w.rowSpan&&!(p+S>=t.rowCount);S++)M=t.getRowDefinition(p+S),d.height+=M.total;for(S=1;S<w.columnSpan&&!(y+S>=t.columnCount);S++)M=t.getColumnDefinition(y+S),d.width+=M.total;var P=m.ha+d.width,N=g.ha+d.height;S=s,M=a;var C=P,T=N,A=s,L=a,j=P,O=N;s+P>i.width&&(j=Math.max(i.width-s,0)),a+N>i.height&&(O=Math.max(i.height-a,0));var D=w.alignment;if(D.Mb()){D=t.defaultAlignment,D.kb()||(D=ae);var F=D.x,B=D.y,I=D.offsetX;D=D.offsetY;var E=m.alignment,R=g.alignment;E.kb()&&(F=E.x,I=E.offsetX),R.kb()&&(B=R.y,D=R.offsetY)}else F=D.x,B=D.y,I=D.offsetX,D=D.offsetY;(isNaN(F)||isNaN(B))&&(B=F=.5,D=I=0),E=k.width,R=k.height;var z=w.margin,V=z.left+z.right,G=z.top+z.bottom,Y=Ma(w,g,m,!1);!isNaN(w.desiredSize.width)||Y!==Xs&&Y!==Hs||(E=Math.max(P-V,0)),!isNaN(w.desiredSize.height)||Y!==Xs&&Y!==_s||(R=Math.max(N-G,0)),P=w.maxSize,N=w.minSize,E=Math.min(P.width,E),R=Math.min(P.height,R),E=Math.max(N.width,E),R=Math.max(N.height,R),P=R+G,S+=C*F-(E+V)*F+I+z.left,M+=T*B-P*B+D+z.top,w.visible&&(_t(A,L,j,O,S,M,k.width,k.height)?w.arrange(S,M,E,R):w.arrange(S,M,E,R,new zt(A,L,j,O)))}else w.Fl(),w.actualBounds.ea(),C=w.actualBounds,S=zt.allocAt(C.x,C.y,C.width,C.height),C.x=M.type===Uh.TableRow?r:s,C.y=M.type===Uh.TableColumn?o:a,C.width=k.width,C.height=k.height,w.actualBounds.freeze(),Da(w,!1),Xt(S,C)||(k=w.part,null!==k&&(k.Oh(),w.mp(k))),zt.free(S)}}}for(Bt.free(d),t=0;t<n;t++)i=e[t],r=i instanceof Uh?i:null,null===r||r.type!==Uh.TableRow&&r.type!==Uh.TableColumn||(r=i.actualBounds,i.naturalBounds.ea(),i.naturalBounds.h(0,0,r.width,r.height),i.naturalBounds.freeze())},f(Eh,Lh),Eh.prototype.measure=function(){},Eh.prototype.arrange=function(){},f(Rh,Lh),Rh.prototype.measure=function(){},Rh.prototype.arrange=function(){},f(zh,Lh),zh.prototype.measure=function(t,e,i,n,o,r,s){1<n.length&&w("Viewbox Panel cannot contain more than one GraphObject."),n=n[0],n.Aa=1,n.Bk(),n.measure(1/0,1/0,r,s);var a=n.measuredBounds,h=n.margin,l=h.right+h.left;if(h=h.top+h.bottom,isFinite(e)||isFinite(i)){var u=n.scale,c=a.width;a=a.height;var f=Math.max(e-l,0),d=Math.max(i-h,0),p=1;t.viewboxStretch===Us?0!==c&&0!==a&&(p=Math.min(f/c,d/a)):0!==c&&0!==a&&(p=Math.max(f/c,d/a)),0===p&&(p=1e-4),n.Aa*=p,u!==n.scale&&(ja(n,!0),n.measure(1/0,1/0,r,s))}a=n.measuredBounds,o.width=isFinite(e)?e:Math.max(a.width+l,0),o.height=isFinite(i)?i:Math.max(a.height+h,0)},zh.prototype.arrange=function(t,e,i){e=e[0];var n=e.measuredBounds,o=e.margin,r=Math.max(n.width+(o.right+o.left),0);o=Math.max(n.height+(o.top+o.bottom),0);var s=e.alignment;s.Mb()&&(s=t.defaultAlignment),s.kb()||(s=ae),e.arrange(i.width*s.x-r*s.x+s.offsetX,i.height*s.y-o*s.y+s.offsetY,n.width,n.height)},f(Vh,Lh),Vh.prototype.measure=function(){},Vh.prototype.arrange=function(){},Vh.prototype.mc=function(t,e,i){i=t.Af()*i.scale,0>=i&&(i=1);var n=t.gridCellSize,o=n.width;n=n.height;var r=t.naturalBounds,s=t.actualBounds,a=r.width,h=r.height,l=Math.ceil(a/o),u=Math.ceil(h/n),c=t.gridOrigin,f=c.x;c=c.y,e.save(),e.beginPath(),e.rect(0,0,a,h),e.clip();for(var d=[],p=t.W.j,g=p.length,y=0;y<g;y++){var m=p[y],v=[];if(d.push(v),m.visible){var x=m.interval;if(!(0>x)){m=Wh(m.figure);for(var b=0;b<g;b++)if(b!==y){var w=p[b];w.visible&&Wh(w.figure)===m&&(w=w.interval,w>x&&v.push(w))}}}}for(p=t.W.j,g=p.length,y=0;y<g;y++){var k=p[y];if(k.visible&&(v=k.interval||1,m=Math.abs(v),!(2>o*m*i))){if(x=k.segmentIndex,isFinite(x)&&!isNaN(x)||(x=0),0>x&&(x=m-Math.min(-x,m)),x=Math.round(x%m),m=k.opacity,b=1,1!==m){if(0===m)continue;b=e.globalAlpha,e.globalAlpha=b*m}w=d[y];var M=!1,S=k.strokeDashArray;if(null!==S&&(M=!0,e.Ft(S,k.strokeDashOffset)),"LineV"===k.figure&&null!==k.stroke&&0<k.strokeWidth){for(e.lineWidth=k.strokeWidth,va(t,e,k.stroke,!1,!1,r,s),e.beginPath(),S=k=Math.floor((f-o)/o);S<=k+l;S++){var P=S*o+f;0<=P&&P<=a&&Gh(S,v,x,w)&&(e.moveTo(P,0),e.lineTo(P,h))}e.stroke()}else if("LineH"===k.figure&&null!==k.stroke&&0<k.strokeWidth){for(e.lineWidth=k.strokeWidth,va(t,e,k.stroke,!1,!1,r,s),e.beginPath(),S=k=Math.floor((c-n)/n);S<=k+u;S++)P=S*n+c,0<=P&&P<=h&&Gh(S,v,x,w)&&(e.moveTo(0,P),e.lineTo(a,P));e.stroke()}else if("BarV"===k.figure&&null!==k.fill)for(va(t,e,k.fill,!0,!1,r,s),k=k.width,isNaN(k)&&(k=o),P=S=Math.floor((f-o)/o);P<=S+l;P++){var N=P*o+f;0<=N+k&&N<=a&&Gh(P,v,x,w)&&e.fillRect(N,0,k,h)}else if("BarH"===k.figure&&null!==k.fill)for(va(t,e,k.fill,!0,!1,r,s),k=k.height,isNaN(k)&&(k=n),P=S=Math.floor((c-n)/n);P<=S+u;P++)N=P*n+c,0<=N+k&&N<=h&&Gh(P,v,x,w)&&e.fillRect(0,N,a,k);M&&e.Dt(),1!==m&&(e.globalAlpha=b)}}e.restore(),e.uc(!1)},f(Yh,Lh),Yh.prototype.measure=function(t,e,i,n,o){if(i=n.length,t instanceof Qu||t instanceof Nc){var r=null,s=null,a=null;if(t instanceof Nc&&(s=r=t),t instanceof Qu&&(a=t,r=a.adornedPart),r instanceof Nc){var h=r;if(0===i)Vt(t.naturalBounds,0,0),t.measuredBounds.h(0,0,0,0);else{var l=t instanceof Qu?null:r.path,u=r.routeBounds;e=t.xg,e.h(0,0,u.width,u.height);var c=h.points;r=r.pointsCount,null!==a?a.Gk(!1):null!==s&&s.Gk(!1);var f=u.width,d=u.height;t.location.h(u.x,u.y),t.l.length=0,null!==l&&(Xh(t,f,d,l),a=l.measuredBounds,e.Rc(a),t.l.push(a)),a=Ke.alloc();for(var p=pt.alloc(),g=pt.alloc(),y=0;y<i;y++){var m=n[y];if(m!==l)if(m.isPanelMain&&m instanceof Nl){Xh(t,f,d,m);var v=m.measuredBounds;e.Rc(v),t.l.push(v)}else if(2>r)m.measure(1/0,1/0,0,0),v=m.measuredBounds,e.Rc(v),t.l.push(v);else{var x=m.segmentIndex,b=m.segmentFraction,w=m.alignmentFocus;w.nc()&&(w=ae);var k=m.segmentOrientation,M=m.segmentOffset;if(isNaN(x)){var S=h.na;v=j(),S.Yv(b,v);var P=pt.allocAt(v[0],v[1]);if(P.add(h.i(0)),S.type===si||(S=S.figures.first()),P.offset(-S.startX,-S.startY),S=v[2],k!==tf){var N=h.computeAngle(m,k,S);m.Yb=N}N=P.x-u.x;var C=P.y-u.y;pt.free(P),O(v)}else if(x<-r||x>=r)C=h.midPoint,S=h.midAngle,k!==tf&&(N=h.computeAngle(m,k,S),m.Yb=N),N=C.x-u.x,C=C.y-u.y;else{if(N=0,0<=x?(C=c.J(x),v=x<r-1?c.J(x+1):C):(N=r+x,C=c.J(N),v=0<N?c.J(N-1):C),C.Qa(v)){0<=x?(S=0<x?c.J(x-1):C,N=x<r-2?c.J(x+2):v):(S=N<r-1?c.J(N+1):C,N=1<N?c.J(N-2):v),P=S.Ie(C);var T=v.Ie(N);S=P>T+10?0<=x?S.Pa(C):C.Pa(S):T>P+10?0<=x?v.Pa(N):N.Pa(v):0<=x?S.Pa(N):N.Pa(S)}else S=0<=x?C.Pa(v):v.Pa(C);k!==tf&&(N=h.computeAngle(m,k,S),m.Yb=N),N=C.x+(v.x-C.x)*b-u.x,C=C.y+(v.y-C.y)*b-u.y}m.measure(1/0,1/0,0,0),v=m.measuredBounds,P=m.naturalBounds;var A=0;m instanceof Nl&&(A=m.strokeWidth),T=P.width+A;var L=P.height+A;a.reset(),a.translate(-v.x,-v.y),a.scale(m.scale,m.scale),a.rotate(k===tf?m.angle:S,T/2,L/2),k!==lf&&k!==df||a.rotate(90,T/2,L/2),k!==uf&&k!==pf||a.rotate(-90,T/2,L/2),k===gf&&(45<S&&135>S||225<S&&315>S)&&a.rotate(-S,T/2,L/2),P=new zt(0,0,T,L),p.tj(P,w),a.ta(p),w=-p.x+A/2*m.scale,m=-p.y+A/2*m.scale,g.assign(M),A=isNaN(M.x);var D=isNaN(M.y);if(A||D){T=T/2+3,L=L/2+3;var F=45<=S&&135>=S,B=225<=S&&315>=S;k===tf&&(F||B)?(g.x=D?T:M.y,g.y=A?L:M.x,F?0<=x||isNaN(x)&&.5>b||!A||(g.y=-L):B&&((0<=x||isNaN(x)&&.5>b)&&A&&(g.y=-L),D&&(g.x=-T))):(A&&(g.x=0<=x||isNaN(x)&&.5>b?T:-T),D&&(g.y=-L),g.rotate(S))}else g.rotate(S);N+=g.x,C+=g.y,P.set(v),P.h(N+w,C+m,v.width,v.height),t.l.push(P),e.Rc(P)}}if(null!==s)for(n=s.labelNodes;n.next();)n.value.measure(1/0,1/0);t.xg=e,t=t.location,t.h(t.x+e.x,t.y+e.y),Vt(o,e.width||0,e.height||0),Ke.free(a),pt.free(p),pt.free(g)}}}},Yh.prototype.arrange=function(t,e){var i=e.length;if(t instanceof Qu||t instanceof Nc){var n=null,o=null,r=null;t instanceof Nc&&(o=n=t),t instanceof Qu&&(r=t,n=r.adornedPart);var s=t instanceof Qu?null:n.path;if(0!==t.l.length){var a=t.l,h=0;if(null!==s&&h<t.l.length){var l=a[h];h++,s.arrange(l.x-t.xg.x,l.y-t.xg.y,l.width,l.height)}for(l=0;l<i;l++){var u=e[l];if(u!==s&&h<t.l.length){var c=a[h];h++,u.arrange(c.x-t.xg.x,c.y-t.xg.y,c.width,c.height)}}}if(e=n.points,i=e.count,2<=i&&t instanceof Nc)for(n=t.labelNodes;n.next();){var f=t;s=n.value,a=s.segmentIndex,h=s.segmentFraction;var d=s.alignmentFocus;if(l=s.segmentOrientation,u=s.segmentOffset,isNaN(a)){c=f.na;var p=j();c.Yv(h,p);var g=pt.allocAt(p[0],p[1]);g.add(f.i(0)),c.type===si||(c=c.figures.first()),g.offset(-c.startX,-c.startY),c=p[2],l!==tf&&(f=f.computeAngle(s,l,c),s.angle=f),f=g.x;var y=g.y;pt.free(g),O(p)}else if(a<-i||a>=i)y=f.midPoint,c=f.midAngle,l!==tf&&(f=f.computeAngle(s,l,c),s.angle=f),f=y.x,y=y.y;else{if(g=0,0<=a?(p=e.j[a],y=a<i-1?e.j[a+1]:p):(g=i+a,p=e.j[g],y=0<g?e.j[g-1]:p),p.Qa(y)){0<=a?(c=0<a?e.j[a-1]:p,g=a<i-2?e.j[a+2]:y):(c=g<i-1?e.j[g+1]:p,g=1<g?e.j[g-2]:y);var m=c.Ie(p),v=y.Ie(g);c=m>v+10?0<=a?c.Pa(p):p.Pa(c):v>m+10?0<=a?y.Pa(g):g.Pa(y):0<=a?c.Pa(g):g.Pa(c)}else c=0<=a?p.Pa(y):y.Pa(p);l!==tf&&(f=f.computeAngle(s,l,c),s.angle=f),f=p.x+(y.x-p.x)*h,y=p.y+(y.y-p.y)*h}if(d.Vt())s.location=new pt(f,y);else{d.nc()&&(d=ae),p=Ke.alloc(),p.reset(),p.scale(s.scale,s.scale),p.rotate(s.angle,0,0);var x=s.naturalBounds;g=zt.allocAt(0,0,x.width,x.height),m=pt.alloc(),m.tj(g,d),p.ta(m),d=-m.x,v=-m.y;var b=x.width,w=x.height;x=pt.alloc(),x.assign(u);var k=isNaN(u.x),M=isNaN(u.y);if(k||M){b=b/2+3,w=w/2+3;var S=45<=c&&135>=c,P=225<=c&&315>=c;l===tf&&(S||P)?(x.x=M?b:u.y,x.y=k?w:u.x,S?0<=a||isNaN(a)&&.5>h||!k||(x.y=-w):P&&((0<=a||isNaN(a)&&.5>h)&&k&&(x.y=-w),M&&(x.x=-b))):(k&&(x.x=0<=a||isNaN(a)&&.5>h?b:-b),M&&(x.y=-w),x.rotate(c))}else x.rotate(c);f+=x.x,y+=x.y,p.Pw(g),d+=g.x,v+=g.y,a=pt.allocAt(f+d,y+v),s.move(a),pt.free(a),pt.free(x),pt.free(m),zt.free(g),Ke.free(p)}}null!==r?r.Gk(!1):null!==o&&o.Gk(!1)}},f(qh,Lh),qh.prototype.measure=function(t,e,i,n,o,r,s){var a=t.tb();t.dh=[];var h=a.margin,l=h.right+h.left,u=h.top+h.bottom;a.measure(e,i,r,s);var c=a.measuredBounds,f=new zt(-h.left,-h.top,Math.max(c.width+l,0),Math.max(c.height+u,0));t.dh.push(f),o.assign(f);for(var d=a.geometry,p=a.strokeWidth,g=d.flattenedSegments,y=d.flattenedLengths,m=d.flattenedTotalLength,v=g.length,x=0,b=0,w=j(),k=0;k<v;k++){var M=g[k],S=[];b=x=0;for(var P=M.length,N=0;N<P;N+=2){var C=M[N],T=M[N+1];if(0!==N){var A=180*Math.atan2(T-b,C-x)/Math.PI;0>A&&(A+=360),S.push(A)}x=C,b=T}w.push(S)}if(null===t.eh){for(var L=[],D=t.W.j,F=D.length,B=0;B<F;B++){var I=D[B],E=[];if(L.push(E),I.visible){var R=I.interval;if(!(0>R))for(var z=0;z<F;z++)if(z!==B){var V=D[z];if(V.visible&&I.constructor===V.constructor){var G=V.interval;G>R&&E.push(G)}}}}t.eh=L}var Y=t.eh,X=t.W.j,q=X.length,U=0,K=0,H=m;t.Mj=[];for(var _,W=0;W<q;W++){var $=X[W];if(_=[],$.visible&&$!==a){var J=Math.abs($.interval),Z=t.graduatedTickUnit;if(!(2>Z*J*m/t.graduatedRange)){var Q=y[0][0],tt=0,et=0;K=m*$.graduatedStart-1e-4,H=m*$.graduatedEnd+1e-4;var it=Z*J,nt=t.graduatedTickBase;if(nt<t.graduatedMin){var ot=(t.graduatedMin-nt)/it;ot=0===ot%1?ot:Math.floor(ot+1),nt+=ot*it}else nt>t.graduatedMin+it&&(nt-=Math.floor((nt-t.graduatedMin)/it)*it);for(var rt=Y[W],st=nt,at=1;nt<t.graduatedMax+5e-8;at++){t:{for(var ht=rt.length,lt=0;lt<ht;lt++)if(_e.aa((nt-t.graduatedTickBase)%(rt[lt]*t.graduatedTickUnit),0)){var ut=!1;break t}ut=!0}if(ut&&(null===$.graduatedSkip||!$.graduatedSkip(nt))&&(U=(nt-t.graduatedMin)*m/t.graduatedRange,U>m&&(U=m),K<=U&&U<=H)){for(var ct=w[tt][et],ft=y[tt][et];tt<y.length;){for(;U>Q&&et<y[tt].length-1;)et++,ct=w[tt][et],ft=y[tt][et],Q+=ft;if(U<=Q)break;tt++,et=0,ct=w[tt][et],ft=y[tt][et],Q+=ft}var dt=g[tt],gt=dt[2*et],yt=dt[2*et+1],mt=(U-(Q-ft))/ft,vt=new pt(gt+(dt[2*et+2]-gt)*mt+p/2-d.bounds.x,yt+(dt[2*et+3]-yt)*mt+p/2-d.bounds.y);vt.scale(a.scale,a.scale);var xt=ct,bt=w[tt];if(1e-4>mt?0<et?xt=bt[et-1]:_e.aa(dt[0],dt[dt.length-2])&&_e.aa(dt[1],dt[dt.length-1])&&(xt=bt[bt.length-1]):.9999<mt&&(et+1<bt.length?xt=bt[et+1]:_e.aa(dt[0],dt[dt.length-2])&&_e.aa(dt[1],dt[dt.length-1])&&(xt=bt[0])),ct!==xt&&(180<Math.abs(ct-xt)&&(ct<xt?ct+=360:xt+=360),ct=(ct+xt)/2%360),$ instanceof Il){var wt="";null!==$.graduatedFunction?(wt=$.graduatedFunction(nt),wt=null!==wt&&void 0!==wt?wt.toString():""):wt=(+nt.toFixed(2)).toString(),""!==wt&&_.push({Km:vt,angle:ct,text:wt})}else _.push({Km:vt,angle:ct})}nt=st+at*it}}}t.Mj.push(_)}O(w);var kt=t.Mj;if(null!==kt)for(var Mt=n.length,St=0;St<Mt;St++){var Pt=n[St],Nt=kt[St];if(Pt.visible&&Pt!==a&&0!==Nt.length){if(Pt instanceof Nl){var Ct=t,Tt=o,At=Pt.alignmentFocus;At.nc()&&(At=oe);var Lt=Pt.angle;Pt.Yb=0,Pt.measure(1/0,1/0,0,0),Pt.Yb=Lt;var jt=Pt.measuredBounds,Ot=jt.width,Dt=jt.height,Ft=zt.allocAt(0,0,Ot,Dt),Bt=pt.alloc();Bt.tj(Ft,At),zt.free(Ft);for(var It=-Bt.x,Et=-Bt.y,Rt=new zt,Vt=Nt.length,Gt=0;Gt<Vt;Gt++)for(var Yt=Nt[Gt],Xt=Yt.Km.x,qt=Yt.Km.y,Ut=Yt.angle,Kt=0;4>Kt;Kt++){switch(Kt){case 0:Bt.h(It,Et);break;case 1:Bt.h(It+Ot,Et);break;case 2:Bt.h(It,Et+Dt);break;case 3:Bt.h(It+Ot,Et+Dt)}Bt.rotate(Ut+Pt.angle),Bt.offset(Xt,qt),0===Gt&&0===Kt?Rt.h(Bt.x,Bt.y,0,0):Rt.Oe(Bt),Bt.offset(-Xt,-qt),Bt.rotate(-Ut-Pt.angle)}pt.free(Bt),null!==Ct.dh&&Ct.dh.push(Rt),Ht(Tt,Rt.x,Rt.y,Rt.width,Rt.height)}else if(Pt instanceof Il){var _t=t,Wt=o;null===_t.zh&&(_t.zh=new Il);var $t=_t.zh;El($t,Pt);var Jt=Pt.alignmentFocus;Jt.nc()&&(Jt=oe);for(var Zt=Pt.segmentOrientation,Qt=Pt.segmentOffset,te=new zt,ee=0,ie=0,ne=0,re=0,se=0,ae=Nt.length,he=0;he<ae;he++){var le=Nt[he];ee=le.Km.x,ie=le.Km.y,ne=le.angle,se=re=Pt.angle,Zt!==tf&&(se=Zt===hf||Zt===ff?ne+Pt.angle:ne,re=Nc.computeAngle(Zt,se)),$t.Yb=re,$t.text=le.text||"",$t.measure(1/0,1/0,0,0);var ue=$t.measuredBounds,ce=$t.naturalBounds,fe=ce.width,de=ce.height,pe=Ke.alloc();pe.reset(),pe.translate(-ue.x,-ue.y),pe.scale($t.scale,$t.scale),pe.rotate(se,fe/2,de/2),Zt!==lf&&Zt!==df||pe.rotate(90,fe/2,de/2),Zt!==uf&&Zt!==pf||pe.rotate(-90,fe/2,de/2),Zt===gf&&(45<ne&&135>ne||225<ne&&315>ne)&&pe.rotate(-ne,fe/2,de/2);var ge=zt.allocAt(0,0,fe,de),ye=pt.alloc();ye.tj(ge,Jt),pe.ta(ye);var me=-ye.x,ve=-ye.y,xe=pt.alloc();xe.assign(Qt),isNaN(xe.x)&&(xe.x=fe/2+3),isNaN(xe.y)&&(xe.y=-(de/2+3)),xe.rotate(ne),ee+=xe.x+me,ie+=xe.y+ve;var be=new zt(ee,ie,ue.width,ue.height),we=new zt(ue.x,ue.y,ue.width,ue.height),ke=new zt(ce.x,ce.y,ce.width,ce.height);le.DA=re,le.lineCount=$t.lineCount,le.lines=[$t.vb,$t.Ei,$t.oe,$t.Be,$t.Qb,$t.lb,$t.me],le.actualBounds=be,le.measuredBounds=we,le.naturalBounds=ke,0===he?te.assign(be):te.Rc(be),pt.free(xe),pt.free(ye),zt.free(ge),Ke.free(pe)}null!==_t.dh&&_t.dh.push(te),Ht(Wt,te.x,te.y,te.width,te.height)}ja(Pt,!1)}}},qh.prototype.arrange=function(t,e,i){if(null!==t.dh){var n=t.tb(),o=t.Mj;if(null!==o){var r=t.dh,s=0,a=r[s];s++,null!==n&&n.arrange(a.x-i.x,a.y-i.y,a.width,a.height);for(var h=e.length,l=0;l<h;l++){var u=e[l];a=o[l],u.visible&&u!==n&&0!==a.length&&(a=r[s],s++,u.arrange(a.x-i.x,a.y-i.y,a.width,a.height))}t.dh=null}}},qh.prototype.mc=function(t,e,i){var n=i.yi;i.yi=!0;var o=t.naturalBounds,r=o.width;o=o.height,e.save(),e.beginPath(),e.rect(-1,-1,r+1,o+1),e.clip(),r=t.tb(),r.mc(e,i),o=t.Af()*i.scale,0>=o&&(o=1);for(var s=r.actualBounds,a=t.W.j,h=t.Mj,l=a.length,u=0;u<l;u++){var c=a[u],f=h[u],d=f.length;if(c.visible&&c!==r&&0!==f.length)if(c instanceof Nl){if(!(2>t.graduatedTickUnit*c.interval*r.geometry.flattenedTotalLength/t.graduatedRange*o)){var p=c.measuredBounds,g=c.strokeWidth*c.scale,y=c.alignmentFocus;y.nc()&&(y=oe);for(var m=0;m<d;m++){var v=f[m].Km,x=f[m].angle,b=y,w=c.sb;w.reset(),w.translate(v.x+s.x,v.y+s.y),w.rotate(x+c.angle,0,0),w.translate(-p.width*b.x+b.offsetX+g/2,-p.height*b.y+b.offsetY+g/2),w.scale(c.scale,c.scale),Ta(c,!1),c.Zh.set(c.sb),c.ql=c.scale,Aa(c,!1),c.mc(e,i),c.sb.reset()}}}else if(c instanceof Il)for(null===t.zh&&(t.zh=new Il),p=t.zh,El(p,c),c=0;c<d;c++)g=f[c],g.actualBounds&&g.measuredBounds&&g.naturalBounds&&(p.Ub=g.text||"",p.Yb=g.DA||0,p.Zc=g.lineCount||0,y=g.lines,void 0!==y&&(p.vb=y[0],p.Ei=y[1],p.oe=y[2],p.Be=y[3],p.Qb=y[4],p.lb=y[5],p.me=y[6]),g.naturalBounds&&(p.rc=g.naturalBounds),g.actualBounds&&(y=g.actualBounds,p.arrange(y.x,y.y,y.width,y.height)),y=g.actualBounds,p.arrange(y.x,y.y,y.width,y.height),m=g.measuredBounds,g=g.naturalBounds,v=p.sb,v.reset(),v.translate(y.x+s.x,y.y+s.y),v.translate(-m.x,-m.y),ba(p,v,g.x,g.y,g.width,g.height),Ta(p,!1),p.Zh.set(p.sb),p.ql=p.scale,Aa(p,!1),p.mc(e,i))}i.yi=n,e.restore(),e.uc(!0)},f(Uh,ca),Uh.prototype.cloneProtected=function(t){if(ca.prototype.cloneProtected.call(this,t),t.qa=this.qa,t.ib=this.ib.H(),t.Mn=this.Mn.H(),t.Sf=this.Sf,t.qa===Uh.Table){t.Fj=this.Fj.H(),t.Ug=this.Ug,t.si=this.si,t.ri=this.ri,t.Tg=this.Tg,t.Sg=this.Sg,t.pi=this.pi;var e=[];if(0<this.qb.length)for(var i=this.qb,n=i.length,o=0;o<n;o++)if(void 0!==i[o]){var r=i[o].copy();r.sj(t),e[o]=r}if(t.qb=e,e=[],0<this.nb.length)for(i=this.nb,n=i.length,o=0;o<n;o++)void 0!==i[o]&&(r=i[o].copy(),r.sj(t),e[o]=r);t.nb=e,t.dk=this.dk,t.Cj=this.Cj,t.Xi=this.Xi,t.Gi=this.Gi}t.pq=this.pq,t.no=this.no.H(),t.oo=this.oo.H(),t.ko=this.ko,t.jo=this.jo,t.mo=this.mo,t.lo=this.lo,t.Mj=this.Mj,t.eh=this.eh,t.ob=this.ob,t.li=this.li,t.Do=this.Do,t.Ci=this.Ci,t.te=this.te,t.Jl=this.Jl,t.xg.assign(this.xg),t.Lg=this.Lg,null!==this.Lp&&(t.Lp=this.Lp)},Uh.prototype.yf=function(t){ca.prototype.yf.call(this,t),t.W=this.W;for(var e=t.W.j,i=e.length,n=0;n<i;n++)e[n].og=t;t.Ui=null},Uh.prototype.copy=function(){var t=ca.prototype.copy.call(this);if(null!==t){for(var e=this.W.j,i=e.length,n=0;n<i;n++){var o=e[n].copy();o.sj(t),o.ak=null;var r=t.W,s=r.count;if(r.wb(s,o),r=t.part,null!==r){r.Xj=null,null!==o.portId&&r instanceof ec&&(r.Nh=!0);var a=t.diagram;null!==a&&a.undoManager.isUndoingRedoing||r.Va(Ni,"elements",t,null,o,null,s)}}return t}return null},i=Uh.prototype,i.toString=function(){return"Panel("+this.type.name+")#"+st(this)},i.mp=function(t){ca.prototype.mp.call(this,t);for(var e=this.W.j,i=e.length,n=0;n<i;n++)e[n].mp(t)},i.ej=function(t,e){if(this.qa===Uh.Grid)this.qa.mc(this,t,e);else if(this.qa===Uh.Graduated)this.qa.mc(this,t,e);else{this.qa===Uh.Table&&(t.lineCap="butt",_h(this,t,!0,this.qb,!0),_h(this,t,!1,this.nb,!0),Hh(this,t,!0,this.qb),Hh(this,t,!1,this.nb),_h(this,t,!0,this.qb,!1),_h(this,t,!1,this.nb,!1));var i=this.isClipping&&this.qa===Uh.Spot;i&&t.save();for(var n=this.tb(),o=this.W.j,r=o.length,s=0;s<r;s++){var a=o[s];i&&a===n&&(t.clipInsteadOfFill=!0),a.mc(t,e),i&&a===n&&(t.clipInsteadOfFill=!1)}i&&(t.restore(),t.uc(!0))}},i.zk=function(t,e,i,n,o){var r=this.he(),s=this.transform,a=1/(s.m11*s.m22-s.m12*s.m21),h=s.m22*a,l=-s.m12*a,u=-s.m21*a,c=s.m11*a,f=a*(s.m21*s.dy-s.m22*s.dx),d=a*(s.m12*s.dx-s.m11*s.dy);if(null!==this.areaBackground)return s=this.actualBounds,_e.Cf(s.left,s.top,s.right,s.bottom,t,e,i,n,o);if(null!==this.background)return r=t*h+e*u+f,a=t*l+e*c+d,t=i*h+n*u+f,h=i*l+n*c+d,o.h(0,0),i=this.naturalBounds,r=_e.Cf(0,0,i.width,i.height,r,a,t,h,o),o.transform(s),r;r||(h=1,u=l=0,c=1,d=f=0),a=t*h+e*u+f,t=t*l+e*c+d,h=i*h+n*u+f,i=i*l+n*c+d,o.h(h,i),n=(h-a)*(h-a)+(i-t)*(i-t),l=!1,c=this.W.j,d=c.length,u=pt.alloc(),f=null,e=1/0;var p=null,g=this.isClipping&&this.qa===Uh.Spot;g&&(p=pt.alloc(),f=this.tb(),(l=f.zk(a,t,h,i,p))&&(e=(a-p.x)*(a-p.x)+(t-p.y)*(t-p.y)));for(var y=0;y<d;y++){var m=c[y];m.visible&&m!==f&&m.zk(a,t,h,i,u)&&(l=!0,m=(a-u.x)*(a-u.x)+(t-u.y)*(t-u.y),m<n&&(n=m,o.set(u)))}return g&&(e>n&&o.set(p),pt.free(p)),pt.free(u),r&&o.transform(s),l},i.o=function(t){if(!La(this)){ca.prototype.o.call(this,t),t=null,this.qa!==Uh.Auto&&this.qa!==Uh.Link||(t=this.tb());for(var e=this.W.j,i=e.length,n=0;n<i;n++){var o=e[n];if((o===t||o.isPanelMain)&&o.o(!0),!o.desiredSize.s()){var r=ka(o,!1);(o instanceof Pc||o instanceof Uh||o instanceof Il||r!==qs)&&o.o(!0)}}}},i.Bk=function(){if(!La(this)){ja(this,!0),Da(this,!0);for(var t=this.W.j,e=t.length,i=0;i<e;i++)t[i].Bk()}},i.Fl=function(){if(0!==(2048&this.F)===!1){Ta(this,!0),Aa(this,!0);for(var t=this.W.j,e=t.length,i=0;i<e;i++)t[i].dw()}},i.dw=function(){Aa(this,!0);for(var t=this.W.j,e=t.length,i=0;i<e;i++)t[i].dw()},i.Hm=function(t,e,i,n){var o=this.xg;o.h(0,0,0,0);var r=this.desiredSize,s=this.minSize;void 0===i&&(i=s.width,n=s.height),i=Math.max(i,s.width),n=Math.max(n,s.height);var a=this.maxSize;isNaN(r.width)||(t=Math.min(r.width,a.width)),isNaN(r.height)||(e=Math.min(r.height,a.height)),t=Math.max(i,t),e=Math.max(n,e);var h=this.ib;t=Math.max(t-h.left-h.right,0),e=Math.max(e-h.top-h.bottom,0);var l=this.W.j;0!==l.length&&this.qa.measure(this,t,e,l,o,i,n),t=o.width+h.left+h.right,h=o.height+h.top+h.bottom,isFinite(r.width)&&(t=r.width),isFinite(r.height)&&(h=r.height),t=Math.min(a.width,t),h=Math.min(a.height,h),t=Math.max(s.width,t),h=Math.max(s.height,h),t=Math.max(i,t),h=Math.max(n,h),Vt(o,t,h),Vt(this.naturalBounds,t,h),pa(this,0,0,t,h)},i.tb=function(){if(null===this.Ui){var t=this.W.j,e=t.length;if(0===e)return null;for(var i=0;i<e;i++){var n=t[i];if(!0===n.isPanelMain)return this.Ui=n}this.Ui=t[0]}return this.Ui},i.Ih=function(t,e,i,n){var o=this.W.j;if(this.actualBounds.h(t,e,i,n),0!==o.length){if(!this.desiredSize.s()){t=ka(this,!0);var r=this.measuredBounds;e=r.width,r=r.height;var s=this.jh,a=s.left+s.right;switch(s=s.top+s.bottom,e===i&&r===n&&(t=qs),t){case qs:(e>i||r>n)&&(this.o(),this.measure(e>i?i:e,r>n?n:r,0,0));break;case Xs:this.o(!0),this.measure(i+a,n+s,0,0);break;case Hs:this.o(!0),this.measure(i+a,r+s,0,0);break;case _s:this.o(!0),this.measure(e+a,n+s,0,0)}}this.qa.arrange(this,o,this.xg)}},i.Kh=function(t){var e=this.naturalBounds,i=$h(this);if(_t(0,0,e.width,e.height,t.x,t.y)){e=this.W.j;for(var n=e.length,o=pt.allocAt(0,0);n--;){var r=e[n];if((r.visible||r===i)&&(vt(o.set(t),r.transform),r.$(o)))return pt.free(o),!0}return pt.free(o),null!==this.mb||null!==this.ec}return!1},i.Gt=function(t){if(this.dl===t)return this;for(var e=this.W.j,i=e.length,n=0;n<i;n++){var o=e[n].Gt(t);if(null!==o)return o}return null},i.an=function(t,e){if(e(this,t),t instanceof Uh){t=t.W.j;for(var i=t.length,n=0;n<i;n++)this.an(t[n],e)}},i.ym=function(t){return el(this,this,t)},i.bb=function(t){if(this.name===t)return this;var e=this.W.j,i=e.length;null===this.Ci&&null===this.te||(i=fl(this));for(var n=0;n<i;n++){var o=e[n];if(o instanceof Uh){var r=o.bb(t);if(null!==r)return r}if(o.name===t)return o}return null},i.he=function(){return!(this.type===Uh.TableRow||this.type===Uh.TableColumn)},i.Vb=function(t,e,i){if(!1===this.pickable)return null;if(void 0===e&&(e=null),void 0===i&&(i=null),Oa(this))return null;var n=this.naturalBounds,o=1/this.Af(),r=this.he(),s=r?t:vt(pt.allocAt(t.x,t.y),this.transform),a=this.diagram,h=10,l=5;if(null!==a&&(h=a.Bm("extraTouchArea"),l=h/2),_t(-l*o,-l*o,n.width+h*o,n.height+h*o,s.x,s.y)){if(!this.isAtomic){o=this.W.j;var u=o.length;if(a=pt.alloc(),l=(h=this.isClipping&&this.qa===Uh.Spot)?this.tb():null,h&&(l.he()?vt(a.set(t),l.transform):a.set(t),!l.$(a)))return pt.free(a),r||pt.free(s),null;for(var c=$h(this);u--;){var f=o[u];if((f.visible||f===c)&&(f.he()?vt(a.set(t),f.transform):a.set(t),!h||f!==l)){var d=null;if(f instanceof Uh?d=f.Vb(a,e,i):!0===f.pickable&&f.$(a)&&(d=f),null!==d&&(null!==e&&(d=e(d)),null!==d&&(null===i||i(d))))return pt.free(a),r||pt.free(s),d}}pt.free(a)}return null===this.background&&null===this.areaBackground?(r||pt.free(s),null):(t=_t(0,0,n.width,n.height,s.x,s.y)?this:null,r||pt.free(s),t)}return r||pt.free(s),null},i.hj=function(t,e,i,n){if(!1===this.pickable)return!1;void 0===e&&(e=null),void 0===i&&(i=null);var o=this.naturalBounds,r=this.he(),s=r?t:vt(pt.allocAt(t.x,t.y),this.transform);if(o=_t(0,0,o.width,o.height,s.x,s.y),this.type===Uh.TableRow||this.type===Uh.TableColumn||o){if(!this.isAtomic){for(var a=this.W.j,h=a.length,l=pt.alloc(),u=$h(this);h--;){var c=a[h];if(c.visible||c===u){c.he()?vt(l.set(t),c.transform):l.set(t);var f=c;c=c instanceof Uh?c:null,(null!==c?c.hj(l,e,i,n):f.$(l))&&!1!==f.pickable&&(null!==e&&(f=e(f)),null===f||null!==i&&!i(f)||n.add(f))}}pt.free(l)}return r||pt.free(s),o&&(null!==this.background||null!==this.areaBackground)}return r||pt.free(s),!1},i.zf=function(t,e,i,n,o,r){if(!1===this.pickable)return!1;void 0===e&&(e=null),void 0===i&&(i=null);var s=r;if(void 0===r&&(s=Ke.alloc(),s.reset()),s.multiply(this.transform),this.Jh(t,s))return nl(this,e,i,o),void 0===r&&Ke.free(s),!0;if(this.Mc(t,s)){if(!this.isAtomic)for(var a=$h(this),h=this.W.j,l=h.length;l--;){var u=h[l];if(u.visible||u===a){var c=u.actualBounds,f=this.naturalBounds;c.x>f.width||c.y>f.height||0>c.x+c.width||0>c.y+c.height||(c=u,u=u instanceof Uh?u:null,f=Ke.alloc(),f.set(s),(null!==u?u.zf(t,e,i,n,o,f):ga(c,t,n,f))&&(null!==e&&(c=e(c)),null===c||null!==i&&!i(c)||o.add(c)),Ke.free(f))}}return void 0===r&&Ke.free(s),n}return void 0===r&&Ke.free(s),!1},i.Eg=function(t,e,i,n,o,r){if(!1===this.pickable)return!1;void 0===i&&(i=null),void 0===n&&(n=null);var s=this.naturalBounds,a=this.he(),h=a?t:vt(pt.allocAt(t.x,t.y),this.transform),l=a?e:vt(pt.allocAt(e.x,e.y),this.transform),u=h.Ie(l),c=0<h.x&&h.x<s.width&&0<h.y&&h.y<s.height||xt(h.x,h.y,0,0,0,s.height)<=u||xt(h.x,h.y,0,s.height,s.width,s.height)<=u||xt(h.x,h.y,s.width,s.height,s.width,0)<=u||xt(h.x,h.y,s.width,0,0,0)<=u;if(s=h.qd(0,0)<=u&&h.qd(0,s.height)<=u&&h.qd(s.width,0)<=u&&h.qd(s.width,s.height)<=u,a||(pt.free(h),pt.free(l)),c){if(!this.isAtomic){h=pt.alloc(),l=pt.alloc(),u=$h(this);for(var f=this.W.j,d=f.length;d--;){var p=f[d];if(p.visible||p===u){var g=p.actualBounds,y=this.naturalBounds;a&&(g.x>y.width||g.y>y.height||0>g.x+g.width||0>g.y+g.height)||(p.he()?(g=p.transform,vt(h.set(t),g),vt(l.set(e),g)):(h.set(t),l.set(e)),g=p,p=p instanceof Uh?p:null,(null!==p?p.Eg(h,l,i,n,o,r):g.sy(h,l,o))&&(null!==i&&(g=i(g)),null===g||null!==n&&!n(g)||r.add(g)))}}pt.free(h),pt.free(l)}return o?c:s}return!1},i.add=function(t){this.wb(this.W.count,t)},i.J=function(t){return this.W.J(t)},i.wb=function(t,e){e instanceof Lu&&w("Cannot add a Part to a Panel: "+e+"; use a Panel instead"),(this===e||this.Gg(e))&&(this===e&&w("Cannot make a Panel contain itself: "+this.toString()),w("Cannot make a Panel indirectly contain itself: "+this.toString()+" already contains "+e.toString()));var i=e.panel;if(null!==i&&i!==this&&w("Cannot add a GraphObject that already belongs to another Panel to this Panel: "+e.toString()+", already contained by "+i.toString()+", cannot be shared by this Panel: "+this.toString()),this.qa!==Uh.Grid||e instanceof Nl||w("Can only add Shapes to a Grid Panel, not: "+e),this.qa!==Uh.Graduated||e instanceof Nl||e instanceof Il||w("Can only add Shapes or TextBlocks to a Graduated Panel, not: "+e),e.sj(this),e.ak=null,null!==this.itemArray){var n=e.data;null!==n&&"object"===typeof n&&(null===this.Zd&&(this.Zd=new dt),this.Zd.add(n,e))}var o=this.W;if(n=-1,i===this){for(var r=-1,s=this.W.j,a=s.length,h=0;h<a;h++)if(s[h]===e){r=h;break}if(-1!==r){if(r===t||r+1>=o.count&&t>=o.count)return;o.cb(r),n=r}else w("element "+e.toString()+" has panel "+i.toString()+" but is not contained by it.")}(0>t||t>o.count)&&(t=o.count),o.wb(t,e),(0===t||e.isPanelMain)&&(this.Ui=null),La(this)||this.o(),e.o(!1),(null!==e.portId||e instanceof Uh&&!0===e.Nh)&&(this.Nh=!0),this.eh=null,i=this.part,null!==i&&(i.Xj=null,i.kh=NaN,this.Nh&&i instanceof ec&&(i.Nh=!0),i.Nh&&i instanceof ec&&(i.tc=null),o=this.diagram,null!==o&&o.undoManager.isUndoingRedoing||(-1!==n&&i.Va(Ci,"elements",this,e,null,n,null),i.Va(Ni,"elements",this,null,e,null,t),this.Hg()||yl(this,e,!1)))},i.remove=function(t){for(var e=this.W.j,i=e.length,n=-1,o=0;o<i;o++)if(e[o]===t){n=o;break}-1!==n&&this.Lc(n,!0)},i.cb=function(t){0<=t&&this.Lc(t,!0)},i.Lc=function(t,e){var i=this.W,n=i.J(t);if(n.ak=null,n.sj(null),null!==this.Zd){var o=n.data;"object"===typeof o&&this.Zd.remove(o)}i.cb(t),ja(this,!1),this.o(),this.Ui===n&&(this.Ui=null),this.eh=null;var r=this.part;null!==r&&(r.Xj=null,r.kh=NaN,r.Lb(),r instanceof ec&&(n instanceof Uh?n.an(n,(function(t,i){fc(r,i,e)})):fc(r,n,e)),i=this.diagram,null!==i&&i.undoManager.isUndoingRedoing||r.Va(Ci,"elements",this,n,null,t,null))},Uh.prototype.getRowDefinition=function(t){0>t&&M(t,">= 0",Uh,"getRowDefinition:idx"),t=Math.round(t);var e=this.qb;if(void 0===e)return null;if(void 0===e[t]){var i=new wl;i.sj(this),i.isRow=!0,i.index=t,e[t]=i,this.Va(Ni,"rowdefs",this,null,i,null,t)}return e[t]},Uh.prototype.XA=function(t){0>t&&M(t,">= 0",Uh,"removeRowDefinition:idx"),t=Math.round(t);var e=this.qb;if(void 0!==e){var i=e[t];if(i){e[t]=void 0;for(var n=e.length-1;0<=n&&void 0===e[n--];)e.length--;this.Va(Ci,"rowdefs",this,i,null,t,null),this.o()}}},Uh.prototype.getColumnDefinition=function(t){0>t&&M(t,">= 0",Uh,"getColumnDefinition:idx"),t=Math.round(t);var e=this.nb;if(void 0===e)return null;if(void 0===e[t]){var i=new wl;i.sj(this),i.isRow=!1,i.index=t,e[t]=i,this.Va(Ni,"coldefs",this,null,i,null,t)}return e[t]},i=Uh.prototype,i.SA=function(t){0>t&&M(t,">= 0",Uh,"removeColumnDefinition:idx"),t=Math.round(t);var e=this.nb;if(void 0!==e){var i=e[t];if(i){e[t]=void 0;for(var n=e.length-1;0<=n&&void 0===e[n--];)e.length--;this.Va(Ci,"coldefs",this,i,null,t,null),this.o()}}},i.aA=function(t){if(0>t||this.type!==Uh.Table)return-1;for(var e=0,i=this.qb,n=i.length,o=this.Xi;o<n;o++){var r=i[o];if(void 0!==r&&(e+=r.total,t<e))break}return o},i.Tz=function(t){if(0>t||this.type!==Uh.Table)return-1;for(var e=0,i=this.nb,n=i.length,o=this.Gi;o<n;o++){var r=i[o];if(void 0!==r&&(e+=r.total,t<e))break}return o},i.qA=function(t,e){if(void 0===e&&(e=new pt(NaN,NaN)),this.type!==Uh.Graduated)return e.h(NaN,NaN),e;t=Math.min(Math.max(t,this.graduatedMin),this.graduatedMax);var i=this.tb();return i.geometry.Xv((t-this.graduatedMin)/this.graduatedRange,e),i.transform.ta(e)},i.rA=function(t){if(this.type!==Uh.Graduated)return NaN;var e=this.tb();return e.transform.Jd(t),e.geometry.wy(t)*this.graduatedRange+this.graduatedMin},i.Gz=function(t){void 0===t&&(t=!1);var e=this.copy();return Qh(e,(function(t){t instanceof Uh&&(t.li=null,t.ob=null);var e=t.fb;null!==e&&(t.fb=null,e.each((function(e){t.bind(e.copy())}))),e=t.Mg,null!==e&&(t.Mg=null,e.each((function(e){t.Qw(e.value.copy())})))})),t&&ul(e),e},i.Da=function(t){var e=this.li;if(null!==e)for(void 0===t&&(t=""),e=e.iterator;e.next();){var i=e.value,n=i.sourceProperty;if((""===t||""===n||n===t)&&(n=i.targetProperty,null!==i.converter||""!==n)){n=this.data;var o=i.sourceName;if(null!==o){if(""===o)n=this;else if("/"===o)n=this;else if("."===o)n=this;else if(".."===o)n=this;else if(n=this.bb(o),null===n)continue}else if(i.isToModel){if(n=this.diagram,null===n)continue;n=n.model.modelData}var r=this,s=i.wj;if(-1!==s){if(r=this.Gt(s),null===r)continue}else null!==i.pd&&(r=i.pd);if("/"===o?n=r.part:"."===o?n=r:".."===o&&(n=r.panel),o=i.hq,0!==o){if(!(r instanceof Uh))continue;1===o?r=r.getColumnDefinition(i.om):2===o&&(r=r.getRowDefinition(i.om))}void 0!==r&&i.Tw(r,n)}}},i.eu=function(){for(var t=fl(this);this.W.length>t;)this.Lc(this.W.length-1,!1);if(t=this.itemArray,null!==t)for(var e=t.length,i=0;i<e;i++)dl(this,t[i],i)},i.qy=function(t){return void 0===t||null===t||null===this.Zd?null:this.Zd.G(t)},d.Object.defineProperties(Uh.prototype,{type:{get:function(){return this.qa},set:function(t){var e=this.qa;e!==t&&(this.qa=t,this.qa===Uh.Grid?this.isAtomic=!0:this.qa===Uh.Table&&Kh(this),this.o(),this.g("type",e,t))}},elements:{get:function(){return this.W.iterator}},naturalBounds:{get:function(){return this.rc}},padding:{get:function(){return this.ib},set:function(t){"number"===typeof t?(0>t&&M(t,">= 0",Uh,"padding"),t=new Qt(t)):(0>t.left&&M(t.left,">= 0",Uh,"padding:value.left"),0>t.right&&M(t.right,">= 0",Uh,"padding:value.right"),0>t.top&&M(t.top,">= 0",Uh,"padding:value.top"),0>t.bottom&&M(t.bottom,">= 0",Uh,"padding:value.bottom"));var e=this.ib;e.w(t)||(this.ib=t=t.H(),this.o(),this.g("padding",e,t))}},defaultAlignment:{get:function(){return this.Mn},set:function(t){var e=this.Mn;e.w(t)||(this.Mn=t=t.H(),this.o(),this.g("defaultAlignment",e,t))}},defaultStretch:{get:function(){return this.Sf},set:function(t){var e=this.Sf;e!==t&&(this.Sf=t,this.o(),this.g("defaultStretch",e,t))}},defaultSeparatorPadding:{get:function(){return void 0===this.Fj?Re:this.Fj},set:function(t){if(void 0!==this.Fj){"number"===typeof t&&(t=new Qt(t));var e=this.Fj;e.w(t)||(this.Fj=t=t.H(),this.o(),this.g("defaultSeparatorPadding",e,t))}}},defaultRowSeparatorStroke:{get:function(){return void 0===this.si?null:this.si},set:function(t){var e=this.si;e!==t&&(null===t||"string"===typeof t||t instanceof eh)&&(t instanceof eh&&t.freeze(),this.si=t,this.M(),this.g("defaultRowSeparatorStroke",e,t))}},defaultRowSeparatorStrokeWidth:{get:function(){return void 0===this.Ug?1:this.Ug},set:function(t){if(void 0!==this.Ug){var e=this.Ug;e!==t&&isFinite(t)&&0<=t&&(this.Ug=t,this.o(),this.g("defaultRowSeparatorStrokeWidth",e,t))}}},defaultRowSeparatorDashArray:{get:function(){return void 0===this.ri?null:this.ri},set:function(t){if(void 0!==this.ri){var e=this.ri;if(e!==t){if(null!==t){for(var i=t.length,n=0,o=0;o<i;o++){var r=t[o];"number"===typeof r&&0<=r&&isFinite(r)||w("defaultRowSeparatorDashArray value "+r+" at index "+o+" must be a positive number or zero."),n+=r}if(0===n){if(null===e)return;t=null}}this.ri=t,this.M(),this.g("defaultRowSeparatorDashArray",e,t)}}}},defaultColumnSeparatorStroke:{get:function(){return void 0===this.Sg?null:this.Sg},set:function(t){if(void 0!==this.Sg){var e=this.Sg;e!==t&&(null===t||"string"===typeof t||t instanceof eh)&&(t instanceof eh&&t.freeze(),this.Sg=t,this.M(),this.g("defaultColumnSeparatorStroke",e,t))}}},defaultColumnSeparatorStrokeWidth:{get:function(){return void 0===this.Tg?1:this.Tg},set:function(t){if(void 0!==this.Tg){var e=this.Tg;e!==t&&isFinite(t)&&0<=t&&(this.Tg=t,this.o(),this.g("defaultColumnSeparatorStrokeWidth",e,t))}}},defaultColumnSeparatorDashArray:{get:function(){return void 0===this.pi?null:this.pi},set:function(t){if(void 0!==this.pi){var e=this.pi;if(e!==t){if(null!==t){for(var i=t.length,n=0,o=0;o<i;o++){var r=t[o];"number"===typeof r&&0<=r&&isFinite(r)||w("defaultColumnSeparatorDashArray value "+r+" at index "+o+" must be a positive number or zero."),n+=r}if(0===n){if(null===e)return;t=null}}this.pi=t,this.M(),this.g("defaultColumnSeparatorDashArray",e,t)}}}},viewboxStretch:{get:function(){return this.pq},set:function(t){var e=this.pq;e!==t&&(this.pq=t,this.o(),this.g("viewboxStretch",e,t))}},gridCellSize:{get:function(){return this.no},set:function(t){var e=this.no;if(!e.w(t)){t.s()&&0!==t.width&&0!==t.height||w("Invalid Panel.gridCellSize: "+t),this.no=t.H();var i=this.diagram;null!==i&&this===i.grid&&qr(i),this.M(),this.g("gridCellSize",e,t)}}},gridOrigin:{get:function(){return this.oo},set:function(t){var e=this.oo;if(!e.w(t)){t.s()||w("Invalid Panel.gridOrigin: "+t),this.oo=t.H();var i=this.diagram;null!==i&&this===i.grid&&qr(i),this.M(),this.g("gridOrigin",e,t)}}},graduatedMin:{get:function(){return this.ko},set:function(t){var e=this.ko;e!==t&&(this.ko=t,this.o(),this.g("graduatedMin",e,t),Na(this)&&(t=this.part,null!==t&&da(this,t,"graduatedRange")))}},graduatedMax:{get:function(){return this.jo},set:function(t){var e=this.jo;e!==t&&(this.jo=t,this.o(),this.g("graduatedMax",e,t),Na(this)&&(t=this.part,null!==t&&da(this,t,"graduatedRange")))}},graduatedRange:{get:function(){return this.graduatedMax-this.graduatedMin}},graduatedTickUnit:{get:function(){return this.mo},set:function(t){var e=this.mo;e!==t&&0<t&&(this.mo=t,this.o(),this.g("graduatedTickUnit",e,t))}},graduatedTickBase:{get:function(){return this.lo},set:function(t){var e=this.lo;e!==t&&(this.lo=t,this.o(),this.g("graduatedTickBase",e,t))}},Nh:{get:function(){return 0!==(8388608&this.F)},set:function(t){0!==(8388608&this.F)!==t&&(this.F^=8388608)}},rowCount:{get:function(){return void 0===this.qb?0:this.qb.length}},columnCount:{get:function(){return void 0===this.nb?0:this.nb.length}},rowSizing:{get:function(){return void 0===this.dk?Pl:this.dk},set:function(t){if(void 0!==this.dk){var e=this.dk;e!==t&&(this.dk=t,this.o(),this.g("rowSizing",e,t))}}},columnSizing:{get:function(){return void 0===this.Cj?Pl:this.Cj},set:function(t){if(void 0!==this.Cj){var e=this.Cj;e!==t&&(this.Cj=t,this.o(),this.g("columnSizing",e,t))}}},topIndex:{get:function(){return void 0===this.Xi?0:this.Xi},set:function(t){if(void 0!==this.Xi){var e=this.Xi;e!==t&&((!isFinite(t)||0>t)&&w("Panel.topIndex must be greater than zero and a real number, not: "+t),this.Xi=t,this.o(),this.g("topIndex",e,t))}}},leftIndex:{get:function(){return void 0===this.Gi?0:this.Gi},set:function(t){if(void 0!==this.Gi){var e=this.Gi;e!==t&&((!isFinite(t)||0>t)&&w("Panel.leftIndex must be greater than zero and a real number, not: "+t),this.Gi=t,this.o(),this.g("leftIndex",e,t))}}},data:{get:function(){return this.ob},set:function(t){var e=this.ob;if(e!==t){var i=this instanceof Lu&&!(this instanceof Qu);ul(this),this.ob=t;var n=this.diagram;null!==n&&(i?(i=n.partManager,this instanceof Nc?(null!==e&&i.Te.remove(e),null!==t&&i.Te.add(t,this)):this instanceof Lu&&(null!==e&&i.Ue.remove(e),null!==t&&i.Ue.add(t,this))):(i=this.panel,null!==i&&null!==i.Zd&&(null!==e&&i.Zd.remove(e),null!==t&&i.Zd.add(t,this)))),this.g("data",e,t),null!==n&&n.undoManager.isUndoingRedoing||null!==t&&this.Da()}}},itemIndex:{get:function(){return this.Do},set:function(t){var e=this.Do;e!==t&&(this.Do=t,this.g("itemIndex",e,t))}},itemArray:{get:function(){return this.Ci},set:function(t){var e=this.Ci;if(e!==t||null!==t&&cl(this,t)){var i=this.diagram;e!==t&&(null!==i&&null!==e&&Sd(i.partManager,this,i),this.Ci=t,null!==i&&null!==t&&Md(i.partManager,this)),this.g("itemArray",e,t),null!==i&&i.undoManager.isUndoingRedoing||this.eu()}}},itemTemplate:{get:function(){return null===this.te?null:this.te.G("")},set:function(t){if(null===this.te){if(null===t)return;this.te=new dt}var e=this.te.G("");e!==t&&((t instanceof Lu||t.isPanelMain)&&w("Panel.itemTemplate must not be a Part or be Panel.isPanelMain: "+t),this.te.add("",t),this.g("itemTemplate",e,t),t=this.diagram,null!==t&&t.undoManager.isUndoingRedoing||this.eu())}},itemTemplateMap:{get:function(){return this.te},set:function(t){var e=this.te;if(e!==t){for(var i=t.iterator;i.next(););this.te=t,this.g("itemTemplateMap",e,t),t=this.diagram,null!==t&&t.undoManager.isUndoingRedoing||this.eu()}}},itemCategoryProperty:{get:function(){return this.Jl},set:function(t){var e=this.Jl;e!==t&&(this.Jl=t,this.g("itemCategoryProperty",e,t))}},isAtomic:{get:function(){return 0!==(1048576&this.F)},set:function(t){var e=0!==(1048576&this.F);e!==t&&(this.F^=1048576,this.g("isAtomic",e,t))}},isClipping:{get:function(){return 0!==(2097152&this.F)},set:function(t){var e=0!==(2097152&this.F);e!==t&&(!t||this.type===Uh.Spot||this instanceof bc||S("Warning: Panel.isClipping set on non-Spot Panel: "+this.toString()),this.F^=2097152,this instanceof bc&&(this.Za=null),this.o(),this.g("isClipping",e,t))}},isOpposite:{get:function(){return 0!==(33554432&this.F)},set:function(t){var e=0!==(33554432&this.F);e!==t&&(this.F^=33554432,this.o(),this.g("isOpposite",e,t))}},isEnabled:{get:function(){return 0!==(4194304&this.F)},set:function(t){var e=0!==(4194304&this.F);if(e!==t){var i=null===this.panel||this.panel.Hg();this.F^=4194304,this.g("isEnabled",e,t),e=this.diagram,null!==e&&e.undoManager.isUndoingRedoing||i&&yl(this,this,t)}}},alignmentFocusName:{get:function(){return this.Lg},set:function(t){var e=this.Lg;e!==t&&(this.Lg=t,this.o(),this.g("alignmentFocusName",e,t))}}}),d.Object.defineProperties(Uh,{Position:{get:function(){return bl.G("Position")}},Horizontal:{get:function(){return bl.G("Horizontal")}},Vertical:{get:function(){return bl.G("Vertical")}},Spot:{get:function(){return bl.G("Spot")}},Auto:{get:function(){return bl.G("Auto")}},Table:{get:function(){return bl.G("Table")}},Viewbox:{get:function(){return bl.G("Viewbox")}},TableRow:{get:function(){return bl.G("TableRow")}},TableColumn:{get:function(){return bl.G("TableColumn")}},Link:{get:function(){return bl.G("Link")}},Grid:{get:function(){return bl.G("Grid")}},Graduated:{get:function(){return bl.G("Graduated")}}}),Uh.prototype.findItemPanelForData=Uh.prototype.qy,Uh.prototype.rebuildItemElements=Uh.prototype.eu,Uh.prototype.updateTargetBindings=Uh.prototype.Da,Uh.prototype.copyTemplate=Uh.prototype.Gz,Uh.prototype.graduatedValueForPoint=Uh.prototype.rA,Uh.prototype.graduatedPointForValue=Uh.prototype.qA,Uh.prototype.findColumnForLocalX=Uh.prototype.Tz,Uh.prototype.findRowForLocalY=Uh.prototype.aA,Uh.prototype.removeColumnDefinition=Uh.prototype.SA,Uh.prototype.removeRowDefinition=Uh.prototype.XA,Uh.prototype.removeAt=Uh.prototype.cb,Uh.prototype.remove=Uh.prototype.remove,Uh.prototype.insertAt=Uh.prototype.wb,Uh.prototype.elt=Uh.prototype.J,Uh.prototype.add=Uh.prototype.add,Uh.prototype.findObject=Uh.prototype.bb,Uh.prototype.findInVisualTree=Uh.prototype.ym,Uh.prototype.walkVisualTreeFrom=Uh.prototype.an,Uh.prototype.findMainElement=Uh.prototype.tb;var vl=!1,xl=null,bl=new dt;function wl(){ot(this),this.og=null,this.ns=!0,this.Ra=0,this.ad=NaN,this.nh=0,this.lh=1/0,this.yb=Ce,this.la=this.bc=this.ha=0,this.fb=null,this.Yp=Ml,this.De=Ks,this.Up=this.sg=null,this.Vp=NaN,this.mb=this.fk=null,this.In=!1}function kl(t){if(t.sizing===Ml){var e=t.og;return t.isRow?e.rowSizing:e.columnSizing}return t.sizing}Uh.className="Panel",Uh.definePanelLayout=ml,ml("Position",new jh),ml("Vertical",new Dh),ml("Auto",new Bh),ml("Link",new Yh),wl.prototype.copy=function(){var t=new wl;return t.ns=this.ns,t.Ra=this.Ra,t.ad=this.ad,t.nh=this.nh,t.lh=this.lh,t.yb=this.yb,t.ha=this.ha,t.bc=this.bc,t.la=this.la,t.De=this.De,t.Yp=this.Yp,null===this.sg?t.sg=null:t.sg=this.sg.H(),t.Up=this.Up,t.Vp=this.Vp,t.fk=null,null!==this.fk&&(t.separatorDashArray=T(this.separatorDashArray)),t.mb=this.mb,t.In=this.In,t.fb=this.fb,t},i=wl.prototype,i.gy=function(t){t.isRow?this.height=t.height:this.width=t.width,this.minimum=t.minimum,this.maximum=t.maximum,this.alignment=t.alignment,this.stretch=t.stretch,this.sizing=t.sizing,this.sg=null===t.separatorPadding?null:t.separatorPadding.H(),this.separatorStroke=t.separatorStroke,this.separatorStrokeWidth=t.separatorStrokeWidth,this.fk=null,t.separatorDashArray&&(this.fk=T(t.separatorDashArray)),this.background=t.background,this.coversSeparators=t.coversSeparators,this.fb=t.fb},i.jb=function(t){t.classType===wl&&(this.sizing=t)},i.toString=function(){return"RowColumnDefinition "+(this.isRow?"(Row ":"(Column ")+this.index+") #"+st(this)},i.sj=function(t){this.og=t},i.Jv=function(){var t=0,e=0,i=this.og,n=this.isRow;if(null!==i&&i.type===Uh.Table)for(var o=n?i.qb.length:i.nb.length,r=0;r<o;r++){var s=n?i.qb[r]:i.nb[r];if(void 0!==s){e=s.index;break}}if(this.index!==e&&(e=this.separatorStroke,null===e&&null!==i&&(e=this.isRow?i.defaultRowSeparatorStroke:i.defaultColumnSeparatorStroke),null!==e&&(t=this.separatorStrokeWidth,isNaN(t)&&(t=null!==i?this.isRow?i.defaultRowSeparatorStrokeWidth:i.defaultColumnSeparatorStrokeWidth:0))),e=this.sg,null===e){if(null===i)return t;e=i.defaultSeparatorPadding}return t+(this.isRow?e.top:e.left)},i.wc=function(){var t=0,e=this.og,i=0,n=this.isRow;if(null!==e&&e.type===Uh.Table)for(var o=n?e.qb.length:e.nb.length,r=0;r<o;r++){var s=n?e.qb[r]:e.nb[r];if(void 0!==s){i=s.index;break}}if(this.index!==i&&(i=this.separatorStroke,null===i&&null!==e&&(i=n?e.defaultRowSeparatorStroke:e.defaultColumnSeparatorStroke),null!==i&&(t=this.separatorStrokeWidth,isNaN(t)&&(t=null!==e?n?e.defaultRowSeparatorStrokeWidth:e.defaultColumnSeparatorStrokeWidth:0))),n=this.sg,null===n){if(null===e)return t;n=e.defaultSeparatorPadding}return t+(this.isRow?n.top+n.bottom:n.left+n.right)},i.Bb=function(t,e,i){var n=this.og;if(null!==n&&(n.Va(Pi,t,this,e,i,void 0,void 0),null!==this.fb&&(e=n.diagram,null!==e&&!e.skipsModelSourceBindings&&(n=n.ij(),null!==n&&(e=n.data,null!==e)))))for(i=this.fb.iterator;i.next();)i.value.jr(this,e,t,n)},i.bind=function(t){t.pd=this;var e=this.panel;if(null!==e){var i=e.ij();null!==i&&ll(i)&&w("Cannot add a Binding to a RowColumnDefinition that is already frozen: "+t+" on "+e)}null===this.fb&&(this.fb=new et),this.fb.add(t)},d.Object.defineProperties(wl.prototype,{panel:{get:function(){return this.og}},isRow:{get:function(){return this.ns},set:function(t){this.ns=t}},index:{get:function(){return this.Ra},set:function(t){this.Ra=t}},height:{get:function(){return this.ad},set:function(t){var e=this.ad;e!==t&&(0>t&&M(t,">= 0",wl,"height"),this.ad=t,this.actual=this.ha,null!==this.panel&&this.panel.o(),this.Bb("height",e,t))}},width:{get:function(){return this.ad},set:function(t){var e=this.ad;e!==t&&(0>t&&M(t,">= 0",wl,"width"),this.ad=t,this.actual=this.ha,null!==this.panel&&this.panel.o(),this.Bb("width",e,t))}},minimum:{get:function(){return this.nh},set:function(t){var e=this.nh;e!==t&&((0>t||!isFinite(t))&&M(t,">= 0",wl,"minimum"),this.nh=t,this.actual=this.ha,null!==this.panel&&this.panel.o(),this.Bb("minimum",e,t))}},maximum:{get:function(){return this.lh},set:function(t){var e=this.lh;e!==t&&(0>t&&M(t,">= 0",wl,"maximum"),this.lh=t,this.actual=this.ha,null!==this.panel&&this.panel.o(),this.Bb("maximum",e,t))}},alignment:{get:function(){return this.yb},set:function(t){var e=this.yb;e.w(t)||(this.yb=t.H(),null!==this.panel&&this.panel.o(),this.Bb("alignment",e,t))}},stretch:{get:function(){return this.De},set:function(t){var e=this.De;e!==t&&(this.De=t,null!==this.panel&&this.panel.o(),this.Bb("stretch",e,t))}},separatorPadding:{get:function(){return this.sg},set:function(t){"number"===typeof t&&(t=new Qt(t));var e=this.sg;null!==t&&null!==e&&e.w(t)||(null!==t&&(t=t.H()),this.sg=t,null!==this.panel&&this.panel.o(),this.Bb("separatorPadding",e,t))}},separatorStroke:{get:function(){return this.Up},set:function(t){var e=this.Up;e!==t&&(null!==t&&dh(t,"RowColumnDefinition.separatorStroke"),t instanceof eh&&t.freeze(),this.Up=t,null!==this.panel&&this.panel.o(),this.Bb("separatorStroke",e,t))}},separatorStrokeWidth:{get:function(){return this.Vp},set:function(t){var e=this.Vp;e!==t&&(this.Vp=t,null!==this.panel&&this.panel.o(),this.Bb("separatorStrokeWidth",e,t))}},separatorDashArray:{get:function(){return this.fk},set:function(t){var e=this.fk;if(e!==t){if(null!==t){for(var i=t.length,n=0,o=0;o<i;o++){var r=t[o];"number"===typeof r&&0<=r&&isFinite(r)||w("separatorDashArray value "+r+" at index "+o+" must be a positive number or zero."),n+=r}if(0===n){if(null===e)return;t=null}}this.fk=t,null!==this.panel&&this.panel.M(),this.Bb("separatorDashArray",e,t)}}},background:{get:function(){return this.mb},set:function(t){var e=this.mb;e!==t&&(null!==t&&dh(t,"RowColumnDefinition.background"),t instanceof eh&&t.freeze(),this.mb=t,null!==this.panel&&this.panel.M(),this.Bb("background",e,t))}},coversSeparators:{get:function(){return this.In},set:function(t){var e=this.In;e!==t&&(this.In=t,null!==this.panel&&this.panel.M(),this.Bb("coversSeparators",e,t))}},sizing:{get:function(){return this.Yp},set:function(t){var e=this.Yp;e!==t&&(this.Yp=t,null!==this.panel&&this.panel.o(),this.Bb("sizing",e,t))}},actual:{get:function(){return this.ha},set:function(t){this.ha=isNaN(this.ad)?Math.max(Math.min(this.lh,t),this.nh):Math.max(Math.min(this.lh,this.ad),this.nh)}},measured:{get:function(){return this.bc},set:function(t){this.bc=t}},total:{get:function(){return this.ha+this.wc()},set:function(t){this.ha=isNaN(this.ad)?Math.max(Math.min(this.lh,t),this.nh):Math.max(Math.min(this.lh,this.ad),this.nh),this.ha=Math.max(0,this.ha-this.wc())}},position:{get:function(){return this.la},set:function(t){this.la=t}}}),wl.prototype.bind=wl.prototype.bind,wl.prototype.computeEffectiveSpacing=wl.prototype.wc,wl.prototype.computeEffectiveSpacingTop=wl.prototype.Jv;var Ml=new U(wl,"Default",0),Sl=new U(wl,"None",1),Pl=new U(wl,"ProportionalExtra",2);function Nl(){ca.call(this),this.Ed=this.na=null,this.Yn="None",this.ho=Ks,this.Hc=this.tl="black",this.wh=1,this.km="butt",this.lm="miter",this.gk=10,this.uh=null,this.vh=0,this.qf=this.pf=Ce,this.tp=this.sp=NaN,this.vo=!1,this.wp=null,this.ul=this.rm="None",this.Yd=1,this.Wd=0,this.Ud=1,this.Vd=null}function Cl(t,e,i,n){var o=i.length;if(!(4>o)){var r=n.measuredBounds,s=Math.max(1,r.width);r=r.height;for(var a,h,l,u,c,f,d=i[0],p=i[1],g=0,y=j(),m=2;m<o;m+=2)a=i[m],h=i[m+1],l=a-d,d=h-p,0===l&&(l=.001),u=d/l,c=Math.atan2(d,l),f=Math.sqrt(l*l+d*d),y.push([l,c,u,f]),g+=f,d=a,p=h;d=i[0],p=i[1],l=n.measuredBounds.width,n instanceof Nl&&(l-=n.strokeWidth),1>l&&(l=1),o=i=l,a=s/2,h=0!==a,m=0,f=y[m],l=f[0],c=f[1],u=f[2],f=f[3];for(var v=0;.1<=g;){if(0===v&&(h?(o=i,o-=a,g-=a,h=!1):o=i,0===o&&(o=1)),o>g)return void O(y);o>f?(v=o-f,o=f):v=0;var x=Math.sqrt(o*o/(1+u*u));if(0>l&&(x=-x),d+=x,p+=u*x,t.translate(d,p),t.rotate(c),t.translate(-s/2,-r/2),0===v&&n.ej(t,e),t.translate(s/2,r/2),t.rotate(-c),t.translate(-d,-p),g-=o,f-=o,0!==v){if(m++,m===y.length)return void O(y);f=y[m],l=f[0],c=f[1],u=f[2],f=f[3],o=v}}O(y)}}function Tl(t){var e=t.geometryStretch;return null!==t.Ed?e===Ks?Xs:e:e===Ks?Bl[t.figure].defaultStretch:e}function Al(t,e,i,n,o){return t=i.x-t,e=i.y-e,e=t*t+e*e,e<n?(o.x=i.x,o.y=i.y,e):n}function Ll(t,e,i,n,o,r,s,a,h){var l=!1,u=(o-s)*(e-n)-(r-a)*(t-i);return 0!==u&&(h.x=((o*a-r*s)*(t-i)-(o-s)*(t*n-e*i))/u,h.y=((o*a-r*s)*(e-n)-(r-a)*(t*n-e*i))/u,(t>i?t-i:i-t)<(e>n?e-n:n-e)?(t=e<n?e:n,e=e<n?n:e,(h.y>t||_e.aa(h.y,t))&&(h.y<e||_e.aa(h.y,e))&&(l=!0)):(e=t<i?t:i,t=t<i?i:t,(h.x>e||_e.aa(h.x,e))&&(h.x<t||_e.aa(h.x,t))&&(l=!0)),l)}function jl(t,e,i,n){if(!t.Nt(e,i,n))return!1;t=e.x,e=e.y;var o=i.x,r=i.y;return i=n.x,n=n.y,t===o?(e<r?(t=e,e=r):t=r,n>=t&&n<=e):(t<o?(n=t,t=o):n=o,i>=n&&i<=t)}function Ol(t){var e=t.diagram;null!==e&&e.undoManager.isUndoingRedoing||(t.segmentOrientation=hf,"None"!==t.rm?(t.segmentIndex=-1,t.alignmentFocus=Fe):"None"!==t.ul&&(t.segmentIndex=0,t.alignmentFocus=new Ge(1-Fe.x,Fe.y)))}function Dl(t){var e=Fl[t];if(void 0===e){var i=t.toLowerCase();if("none"===i)return"None";if(e=Fl[i],void 0===e){var n,o=null;for(n in _e.dn)if(n.toLowerCase()===i){o=n;break}if(null!==o)return t=Ze(_e.dn[o],!1),Fl[o]=t,i!==o&&(Fl[i]=o),o}}return"string"===typeof e?e:e instanceof We?t:null}wl.className="RowColumnDefinition",wl.Default=Ml,wl.None=Sl,wl.ProportionalExtra=Pl,f(Nl,ca),Nl.prototype.cloneProtected=function(t){ca.prototype.cloneProtected.call(this,t),t.na=this.na,t.Yn=this.Yn,t.ho=this.ho,t.Ed=this.Ed,t.tl=this.tl,t.Hc=this.Hc,t.wh=this.wh,t.km=this.km,t.lm=this.lm,t.gk=this.gk,null!==this.uh&&(t.uh=T(this.uh)),t.vh=this.vh,t.pf=this.pf.H(),t.qf=this.qf.H(),t.sp=this.sp,t.tp=this.tp,t.vo=this.vo,t.wp=this.wp,t.rm=this.rm,t.ul=this.ul,t.Yd=this.Yd,t.Wd=this.Wd,t.Ud=this.Ud,t.Vd=this.Vd},i=Nl.prototype,i.jb=function(t){t===qs||t===Us||t===Ws||t===Ks?this.geometryStretch=t:ca.prototype.jb.call(this,t)},i.toString=function(){return"Shape("+("None"!==this.figure?this.figure:"None"!==this.toArrow?this.toArrow:this.fromArrow)+")#"+st(this)},i.ej=function(t,e){var i=this.Hc,n=this.tl;if(null!==i||null!==n){var o=this.actualBounds,r=this.naturalBounds;null!==n&&va(this,t,n,!0,!1,r,o);var s=this.part,a=this.wh;null===i||0!==a||null===s||!this.isPanelMain&&s.tb()!==this||(a=s.type===Uh.Link&&s instanceof Qu&&"Selection"===s.category&&s.adornedObject instanceof Nl&&s.adornedPart.tb()===s.adornedObject?s.adornedObject.strokeWidth:0),0===a&&(i=null),null!==i&&0!==a&&(va(this,t,i,!1,!1,r,o),t.lineWidth=a,t.lineJoin=this.lm,t.lineCap=this.km,t.miterLimit=this.gk),o=!1,s&&e.Ke("drawShadows")&&(o=s.isShadowed),s=!0,null===i||null!==n&&"transparent"!==n||(s=!1),r=!1,a=this.strokeDashArray,null!==a&&(r=!0,t.Ft(a,this.vh));var h=this.na;if(null!==h){if(h.type===si)t.beginPath(),t.moveTo(h.startX,h.startY),t.lineTo(h.endX,h.endY),null!==i&&t.vj();else if(h.type===ai){var l=h.startX;a=h.startY;var u=h.endX,c=h.endY;h=Math.min(l,u);var f=Math.min(a,c);l=Math.abs(u-l),a=Math.abs(c-a),t.beginPath(),t.rect(h,f,l,a),null!==n&&t.Je(n),null!==i&&(s&&o&&Wa(t),0!==l&&0!==a||(t.beginPath(),t.rect(h,f,Math.max(l,.1),Math.max(a,.1))),t.vj(),s&&o&&$a(t))}else if(h.type===hi)l=h.startX,a=h.startY,u=h.endX,c=h.endY,h=Math.abs(u-l)/2,f=Math.abs(c-a)/2,l=Math.min(l,u)+h,a=Math.min(a,c)+f,t.beginPath(),t.moveTo(l,a-f),t.bezierCurveTo(l+_e.Kg*h,a-f,l+h,a-_e.Kg*f,l+h,a),t.bezierCurveTo(l+h,a+_e.Kg*f,l+_e.Kg*h,a+f,l,a+f),t.bezierCurveTo(l-_e.Kg*h,a+f,l-h,a+_e.Kg*f,l-h,a),t.bezierCurveTo(l-h,a-_e.Kg*f,l-_e.Kg*h,a-f,l,a-f),t.closePath(),null!==n&&t.Je(n),null!==i&&(s&&o?(Wa(t),t.vj(),$a(t)):t.vj());else if(h.type===li)for(a=h.figures,h=a.length,f=0;f<h;f++){l=a.j[f],t.beginPath(),t.moveTo(l.startX,l.startY),u=l.segments.j,c=u.length;for(var d=null,p=0;p<c;p++){var g=u[p];switch(g.type){case gi:t.moveTo(g.endX,g.endY);break;case yi:t.lineTo(g.endX,g.endY);break;case mi:t.bezierCurveTo(g.point1X,g.point1Y,g.point2X,g.point2Y,g.endX,g.endY);break;case vi:t.quadraticCurveTo(g.point1X,g.point1Y,g.endX,g.endY);break;case xi:if(g.radiusX===g.radiusY){var y=Math.PI/180;t.arc(g.point1X,g.point1Y,g.radiusX,g.startAngle*y,(g.startAngle+g.sweepAngle)*y,0>g.sweepAngle,null!==d?d.endX:l.startX,null!==d?d.endY:l.startY)}else if(d=di(g,l),y=d.length,0===y)t.lineTo(g.centerX,g.centerY);else for(var m=0;m<y;m++){var v=d[m];0===m&&t.lineTo(v[0],v[1]),t.bezierCurveTo(v[2],v[3],v[4],v[5],v[6],v[7])}break;case bi:if(m=y=0,null!==d&&d.type===xi){if(d=di(d,l),v=d.length,0===v){t.lineTo(g.endX,g.endY);break}d=d[v-1]||null,null!==d&&(y=d[6],m=d[7])}else y=null!==d?d.endX:l.startX,m=null!==d?d.endY:l.startY;if(d=pi(g,l,y,m),y=d.length,0===y){t.lineTo(g.endX,g.endY);break}for(m=0;m<y;m++)v=d[m],t.bezierCurveTo(v[2],v[3],v[4],v[5],v[6],v[7]);break;default:w("Segment not of valid type: "+g.type)}g.isClosed&&t.closePath(),d=g}u=l.isFilled,o?l.isShadowed?(!0===u&&"transparent"!==n&&null!==n&&t.Je(n),null!==i&&(u&&s&&Wa(t),t.vj(),u&&s&&$a(t))):(Wa(t),u&&"transparent"!==n&&null!==n&&t.Je(n),null!==i&&t.vj(),$a(t)):(u&&null!==n&&t.Je(n),null!==i&&t.vj())}if(r&&t.Dt(),null!==this.pathPattern){if(i=this.pathPattern,i.measure(1/0,1/0),n=i.measuredBounds,i.arrange(0,0,n.width,n.height),o=this.geometry,t.save(),t.beginPath(),n=j(),o.type===si)n.push(o.startX),n.push(o.startY),n.push(o.endX),n.push(o.endY),Cl(t,e,n,i);else if(o.type===li)for(o=o.figures.iterator;o.next();){for(s=o.value,n.length=0,n.push(s.startX),n.push(s.startY),r=s.startX,a=s.startY,h=r,f=a,l=s.segments.j,u=l.length,c=0;c<u;c++){switch(p=l[c],p.type){case gi:Cl(t,e,n,i),n.length=0,n.push(p.endX),n.push(p.endY),r=p.endX,a=p.endY,h=r,f=a;break;case yi:n.push(p.endX),n.push(p.endY),r=p.endX,a=p.endY;break;case mi:_e.Fe(r,a,p.point1X,p.point1Y,p.point2X,p.point2Y,p.endX,p.endY,.5,n),r=p.endX,a=p.endY;break;case vi:_e.Vq(r,a,p.point1X,p.point1Y,p.endX,p.endY,.5,n),r=p.endX,a=p.endY;break;case xi:if(g=di(p,s),d=g.length,0===d){n.push(p.centerX),n.push(p.centerY),r=p.centerX,a=p.centerY;break}for(y=0;y<d;y++)m=g[y],_e.Fe(r,a,m[2],m[3],m[4],m[5],m[6],m[7],.5,n),r=m[6],a=m[7];break;case bi:if(g=pi(p,s,r,a),d=g.length,0===d){n.push(p.endX),n.push(p.endY),r=p.endX,a=p.endY;break}for(y=0;y<d;y++)m=g[y],_e.Fe(r,a,m[2],m[3],m[4],m[5],m[6],m[7],.5,n),r=m[6],a=m[7];break;default:w("Segment not of valid type: "+p.type)}p.isClosed&&(n.push(h),n.push(f),Cl(t,e,n,i))}Cl(t,e,n,i)}else if(o.type===ai)n.push(o.startX),n.push(o.startY),n.push(o.endX),n.push(o.startY),n.push(o.endX),n.push(o.endY),n.push(o.startX),n.push(o.endY),n.push(o.startX),n.push(o.startY),Cl(t,e,n,i);else if(o.type===hi){if(a=new ci,a.startX=o.endX,a.startY=(o.startY+o.endY)/2,r=new fi(xi),r.startAngle=0,r.sweepAngle=360,r.centerX=(o.startX+o.endX)/2,r.centerY=(o.startY+o.endY)/2,r.radiusX=Math.abs(o.startX-o.endX)/2,r.radiusY=Math.abs(o.startY-o.endY)/2,a.add(r),o=di(r,a),s=o.length,0===s)n.push(r.centerX),n.push(r.centerY);else for(r=a.startX,a=a.startY,h=0;h<s;h++)f=o[h],_e.Fe(r,a,f[2],f[3],f[4],f[5],f[6],f[7],.5,n),r=f[6],a=f[7];Cl(t,e,n,i)}O(n),t.restore(),t.uc(!1)}}}},i.da=function(t,e){if(void 0===e&&(e=new pt),t instanceof Ge){t.nc()&&w("getDocumentPoint Spot must be a real, specific Spot, not: "+t.toString());var i=this.naturalBounds,n=this.strokeWidth;e.h(t.x*(i.width+n)-n/2+i.x+t.offsetX,t.y*(i.height+n)-n/2+i.y+t.offsetY)}else e.set(t);return this.Fd.ta(e),e},i.mj=function(t){void 0===t&&(t=new zt);var e=this.naturalBounds,i=this.Fd;e=zt.allocAt(e.x,e.y,e.width,e.height);var n=this.strokeWidth;return e.Jc(n/2,n/2),n=pt.allocAt(e.x,e.y).transform(i),t.h(n.x,n.y,0,0),n.h(e.right,e.y).transform(i),Ht(t,n.x,n.y,0,0),n.h(e.right,e.bottom).transform(i),Ht(t,n.x,n.y,0,0),n.h(e.x,e.bottom).transform(i),Ht(t,n.x,n.y,0,0),zt.free(e),pt.free(n),t},i.Kh=function(t,e){var i=this.geometry;if(null===i||null===this.fill&&null===this.stroke)return!1;var n=i.bounds,o=this.strokeWidth/2;i.type!==si||e||(o+=2);var r=zt.alloc();if(r.assign(n),r.Jc(o+2,o+2),!r.$(t))return zt.free(r),!1;if(n=o+1e-4,i.type===si)return null!==this.stroke&&(n=(i.endX-i.startX)*(t.x-i.startX)+(i.endY-i.startY)*(t.y-i.startY),!(0>(i.startX-i.endX)*(t.x-i.endX)+(i.startY-i.endY)*(t.y-i.endY)||0>n)&&(zt.free(r),_e.Nb(i.startX,i.startY,i.endX,i.endY,o,t.x,t.y)));if(i.type===ai){e=i.startX;var s=i.startY,a=i.endX;if(i=i.endY,r.x=Math.min(e,a),r.y=Math.min(s,i),r.width=Math.abs(a-e),r.height=Math.abs(i-s),null===this.fill){if(r.Jc(-n,-n),r.$(t))return zt.free(r),!1;r.Jc(n,n)}return null!==this.stroke&&r.Jc(o,o),t=r.$(t),zt.free(r),t}if(i.type===hi){s=i.startX,o=i.startY,a=i.endX;var h=i.endY;if(i=Math.min(s,a),e=Math.min(o,h),s=Math.abs(a-s)/2,o=Math.abs(h-o)/2,i=t.x-(i+s),e=t.y-(e+o),null===this.fill){if(s-=n,o-=n,0>=s||0>=o||1>=i*i/(s*s)+e*e/(o*o))return zt.free(r),!1;s+=n,o+=n}return null!==this.stroke&&(s+=n,o+=n),zt.free(r),!(0>=s||0>=o)&&1>=i*i/(s*s)+e*e/(o*o)}return i.type===li?(zt.free(r),null===this.fill?ni(i,t.x,t.y,o):ei(i,t,o,1<this.strokeWidth,e)):(w("Unknown Geometry type: "+i.type),!1)},i.Hm=function(t,e,i,n){var o=this.desiredSize,r=this.wh;if(t=Math.max(t,0),e=Math.max(e,0),null!==this.Ed)var s=this.geometry.bounds;else{var a=this.figure,h=Bl[a];if(void 0===h){var l=_e.Qe[a];"string"===typeof l&&(l=_e.Qe[l]),"function"===typeof l?(h=l(null,100,100),Bl[a]=h):w("Unsupported Figure: "+a)}s=h.bounds}a=s.width,h=s.height,l=s.width;var u=s.height;switch(ka(this,!0)){case qs:n=i=0;break;case Xs:l=Math.max(t-r,0),u=Math.max(e-r,0);break;case Hs:l=Math.max(t-r,0),n=0;break;case _s:i=0,u=Math.max(e-r,0)}switch(isFinite(o.width)&&(l=o.width),isFinite(o.height)&&(u=o.height),o=this.maxSize,s=this.minSize,i=Math.max(i-r,s.width),n=Math.max(n-r,s.height),l=Math.min(o.width,l),u=Math.min(o.height,u),l=isFinite(l)?Math.max(i,l):Math.max(a,i),u=isFinite(u)?Math.max(n,u):Math.max(h,n),i=Tl(this),i){case qs:break;case Xs:a=l,h=u;break;case Us:i=Math.min(l/a,u/h),isFinite(i)||(i=1),a*=i,h*=i;break;default:w(i+" is not a valid geometryStretch.")}null!==this.Ed?(0===a&&(a=.001),0===h&&(h=.001),i=null!==this.Ed?this.Ed:this.na,o=i.bounds,n=a/o.width,o=h/o.height,isFinite(n)||(n=1),isFinite(o)||(o=1),this.na=1===n&&1===o?i:i.copy().scale(n,o)):null!==this.na&&_e.aa(this.na.Dl,t-r)&&_e.aa(this.na.Cl,e-r)||(this.na=Nl.makeGeometry(this,a,h)),s=this.na.bounds,1/0===t||1/0===e?pa(this,s.x-r/2,s.y-r/2,0===t&&0===a?0:s.width+r,0===e&&0===h?0:s.height+r):pa(this,-r/2,-r/2,l+r,u+r)},i.Ih=function(t,e,i,n){ya(this,t,e,i,n)},i.Nt=function(t,e,i){return this.zk(t.x,t.y,e.x,e.y,i)},i.zk=function(t,e,i,n,o){var r=this.transform,s=1/(r.m11*r.m22-r.m12*r.m21),a=r.m22*s,h=-r.m12*s,l=-r.m21*s,u=r.m11*s,c=s*(r.m21*r.dy-r.m22*r.dx),f=s*(r.m12*r.dx-r.m11*r.dy);r=t*a+e*l+c,s=t*h+e*u+f,a=i*a+n*l+c,h=i*h+n*u+f,c=this.wh/2,l=this.na,null===l&&(this.measure(1/0,1/0),l=this.na);var d=l.bounds;if(u=!1,l.type===si)if(1.5>=this.strokeWidth)u=_e.Me(l.startX,l.startY,l.endX,l.endY,r,s,a,h,o);else{if(l.startX===l.endX?(n=c,u=0):(e=(l.endY-l.startY)/(l.endX-l.startX),u=c/Math.sqrt(1+e*e),n=u*e),e=j(),t=new pt,_e.Me(l.startX+n,l.startY+u,l.endX+n,l.endY+u,r,s,a,h,t)&&e.push(t),t=new pt,_e.Me(l.startX-n,l.startY-u,l.endX-n,l.endY-u,r,s,a,h,t)&&e.push(t),t=new pt,_e.Me(l.startX+n,l.startY+u,l.startX-n,l.startY-u,r,s,a,h,t)&&e.push(t),t=new pt,_e.Me(l.endX+n,l.endY+u,l.endX-n,l.endY-u,r,s,a,h,t)&&e.push(t),a=e.length,0===a)return O(e),!1;for(u=!0,h=1/0,n=0;n<a;n++)t=e[n],i=(t.x-r)*(t.x-r)+(t.y-s)*(t.y-s),i<h&&(h=i,o.x=t.x,o.y=t.y);O(e)}else if(l.type===ai)u=_e.Cf(d.x-c,d.y-c,d.x+d.width+c,d.y+d.height+c,r,s,a,h,o);else if(l.type===hi){e=zt.allocAt(d.x,d.y,d.width,d.height).Jc(c,c);t:if(0===e.width)u=_e.Me(e.x,e.y,e.x,e.y+e.height,r,s,a,h,o);else if(0===e.height)u=_e.Me(e.x,e.y,e.x+e.width,e.y,r,s,a,h,o);else{if(t=e.width/2,l=e.height/2,n=e.x+t,u=e.y+l,i=9999,r!==a&&(i=(s-h)/(r-a)),9999>Math.abs(i)){if(h=s-u-i*(r-n),0>t*t*i*i+l*l-h*h){o.x=NaN,o.y=NaN,u=!1;break t}c=Math.sqrt(t*t*i*i+l*l-h*h),a=(-t*t*i*h+t*l*c)/(l*l+t*t*i*i)+n,t=(-t*t*i*h-t*l*c)/(l*l+t*t*i*i)+n,l=i*(a-n)+h+u,h=i*(t-n)+h+u,Math.abs((r-a)*(r-a))+Math.abs((s-l)*(s-l))<Math.abs((r-t)*(r-t))+Math.abs((s-h)*(s-h))?(o.x=a,o.y=l):(o.x=t,o.y=h)}else{if(a=l*l,h=r-n,a-=a/(t*t)*h*h,0>a){o.x=NaN,o.y=NaN,u=!1;break t}h=Math.sqrt(a),a=u+h,h=u-h,Math.abs(a-s)<Math.abs(h-s)?(o.x=r,o.y=a):(o.x=r,o.y=h)}u=!0}zt.free(e)}else if(l.type===li){f=pt.alloc();var p=a-r,g=h-s,y=p*p+g*g,m=r,v=s;if(0<y&&d.contains(m,v)&&(f.x=m,f.y=v,this.$(f)))for(0!==p&&.5>Math.abs(p)?(g*=.5/p,p=.5):0!==g&&.5>Math.abs(g)&&(p*=.5/g,g=.5),m-=p,v-=g;d.contains(m,v);)m-=p,v-=g;for(o.x=a,o.y=h,g=0;g<l.figures.count;g++){var x=l.figures.j[g],b=x.isFilled?m:r,k=x.isFilled?v:s,M=x.segments;d=x.startX,p=x.startY;for(var S=d,P=p,N=0;N<M.count;N++){var C=M.j[N],T=C.type,A=C.endX,L=C.endY,D=!1;switch(T){case gi:S=A,P=L;break;case yi:D=Ll(d,p,A,L,b,k,a,h,f);break;case mi:D=_e.wq(d,p,C.point1X,C.point1Y,C.point2X,C.point2Y,A,L,b,k,a,h,.6,f);break;case vi:D=_e.wq(d,p,d+2/3*(C.point1X-d),p+2/3*(C.point1Y-p),A+2/3*(C.point1X-A),L+2/3*(C.point1Y-L),A,L,b,k,a,h,.6,f);break;case xi:case bi:T=C.type===xi?di(C,x):pi(C,x,d,p);var F=T.length;if(0===F){D=Ll(d,p,C.type===xi?C.centerX:C.endX,C.type===xi?C.centerY:C.endY,b,k,a,h,f);break}for(L=null,A=0;A<F;A++){if(L=T[A],0===A&&Ll(d,p,L[0],L[1],b,k,a,h,f)){var B=Al(b,k,f,y,o);B<y&&(y=B,u=!0)}_e.wq(L[0],L[1],L[2],L[3],L[4],L[5],L[6],L[7],b,k,a,h,.6,f)&&(B=Al(b,k,f,y,o),B<y&&(y=B,u=!0))}A=L[6],L=L[7];break;default:w("Unknown Segment type: "+T)}d=A,p=L,D&&(D=Al(b,k,f,y,o),D<y&&(y=D,u=!0)),C.isClosed&&(A=S,L=P,Ll(d,p,A,L,b,k,a,h,f)&&(C=Al(b,k,f,y,o),C<y&&(y=C,u=!0)))}}r=i-t,s=n-e,a=Math.sqrt(r*r+s*s),0!==a&&(r/=a,s/=a),o.x-=r*c,o.y-=s*c,pt.free(f)}else w("Unknown Geometry type: "+l.type);return!!u&&(this.transform.ta(o),!0)},i.Jh=function(t,e){if(void 0===e)return t.Ge(this.actualBounds);var i=this.na;null===i&&(this.measure(1/0,1/0),i=this.na),i=i.bounds;var n=this.strokeWidth/2,o=!1,r=pt.alloc();return r.h(i.x-n,i.y-n),t.$(e.ta(r))&&(r.h(i.x-n,i.bottom+n),t.$(e.ta(r))&&(r.h(i.right+n,i.bottom+n),t.$(e.ta(r))&&(r.h(i.right+n,i.y-n),t.$(e.ta(r))&&(o=!0)))),pt.free(r),o},i.Mc=function(t,e){if(this.Jh(t,e)||void 0===e&&(e=this.transform,t.Ge(this.actualBounds)))return!0;var i=Ke.alloc();i.set(e),i.St();var n=t.left,o=t.right,r=t.top;t=t.bottom;var s=pt.alloc();if(s.h(n,r),i.ta(s),this.Kh(s,!0))return pt.free(s),!0;if(s.h(o,r),i.ta(s),this.Kh(s,!0))return pt.free(s),!0;if(s.h(n,t),i.ta(s),this.Kh(s,!0))return pt.free(s),!0;if(s.h(o,t),i.ta(s),this.Kh(s,!0))return pt.free(s),!0;var a=pt.alloc(),h=pt.alloc();return i.set(e),i.jw(this.transform),i.St(),a.x=o,a.y=r,a.transform(i),s.x=n,s.y=r,s.transform(i),e=!1,jl(this,s,a,h)?e=!0:(s.x=o,s.y=t,s.transform(i),jl(this,s,a,h)?e=!0:(a.x=n,a.y=t,a.transform(i),jl(this,s,a,h)?e=!0:(s.x=n,s.y=r,s.transform(i),jl(this,s,a,h)&&(e=!0)))),pt.free(s),Ke.free(i),pt.free(a),pt.free(h),e},i.sy=function(t,e,i){function n(t,e){for(var i=t.length,n=0;n<i;n+=2)if(e.qd(t[n],t[n+1])>o)return!0;return!1}if(i&&null!==this.fill&&this.Kh(t,!0))return!0;var o=t.Ie(e),r=o;if(1.5<this.strokeWidth&&(o=this.strokeWidth/2+Math.sqrt(o),o*=o),e=this.na,null===e&&(this.measure(1/0,1/0),e=this.na,null===e))return!1;if(!i){var s=e.bounds,a=s.x,h=s.y,l=s.x+s.width;if(s=s.y+s.height,bt(t.x,t.y,a,h)<=o&&bt(t.x,t.y,l,h)<=o&&bt(t.x,t.y,a,s)<=o&&bt(t.x,t.y,l,s)<=o)return!0}if(a=e.startX,h=e.startY,l=e.endX,s=e.endY,e.type===si){if(i=(a-l)*(t.x-l)+(h-s)*(t.y-s),xt(t.x,t.y,a,h,l,s)<=(0<=(l-a)*(t.x-a)+(s-h)*(t.y-h)&&0<=i?o:r))return!0}else{if(e.type===ai)return e=!1,i&&(e=xt(t.x,t.y,a,h,a,s)<=o||xt(t.x,t.y,a,h,l,h)<=o||xt(t.x,t.y,l,h,l,s)<=o||xt(t.x,t.y,a,s,l,s)<=o),e;if(e.type===hi){e=t.x-(a+l)/2,r=t.y-(h+s)/2;var u=Math.abs(l-a)/2,c=Math.abs(s-h)/2;if(0===u||0===c)return xt(t.x,t.y,a,h,l,s)<=o;if(!i)return!(bt(e,r,-u,0)>=o||bt(e,r,0,-c)>=o||bt(e,r,0,c)>=o||bt(e,r,u,0)>=o);if(t=_e.Mz(u,c,e,r),t*t<=o)return!0}else if(e.type===li){if(l=e.bounds,r=l.x,a=l.y,h=l.x+l.width,l=l.y+l.height,t.x>h&&t.x<r&&t.y>l&&t.y<a&&xt(t.x,t.y,r,a,r,l)>o&&xt(t.x,t.y,r,a,h,a)>o&&xt(t.x,t.y,h,l,r,l)>o&&xt(t.x,t.y,h,l,h,a)>o)return!1;if(r=Math.sqrt(o),!i){for(i=e.figures,e=0;e<i.count;e++){if(r=i.j[e],s=r.startX,u=r.startY,t.qd(s,u)>o)return!1;for(a=r.segments.j,h=a.length,l=0;l<h;l++)switch(c=a[l],c.type){case gi:case yi:if(s=c.endX,u=c.endY,t.qd(s,u)>o)return!1;break;case mi:var f=j();if(_e.Fe(s,u,c.point1X,c.point1Y,c.point2X,c.point2Y,c.endX,c.endY,.8,f),s=n(f,t),O(f),s)return!1;if(s=c.endX,u=c.endY,t.qd(s,u)>o)return!1;break;case vi:if(f=j(),_e.Vq(s,u,c.point1X,c.point1Y,c.endX,c.endY,.8,f),s=n(f,t),O(f),s)return!1;if(s=c.endX,u=c.endY,t.qd(s,u)>o)return!1;break;case xi:case bi:f=c.type===xi?di(c,r):pi(c,r,s,u);var d=f.length;if(0===d){if(s=c.type===xi?c.centerX:c.endX,u=c.type===xi?c.centerY:c.endY,t.qd(s,u)>o)return!1;break}c=null;for(var p=j(),g=0;g<d;g++)if(c=f[g],p.length=0,_e.Fe(c[0],c[1],c[2],c[3],c[4],c[5],c[6],c[7],.8,p),n(p,t))return O(p),!1;O(p),null!==c&&(s=c[6],u=c[7]);break;default:w("Unknown Segment type: "+c.type)}}return!0}if(null===this.fill?ni(e,t.x,t.y,r):ei(e,t,r,!0,!1))return!0}}return!1},i.dc=function(){this.na=null},Nl.makeGeometry=function(t,e,i){if("None"!==t.toArrow)var n=Fl[t.toArrow];else"None"!==t.fromArrow?n=Fl[t.fromArrow]:(n=_e.Qe[t.figure],"string"===typeof n&&(n=_e.Qe[n]),void 0===n&&w("Unknown Shape.figure: "+t.figure),n=n(t,e,i),n.Dl=e,n.Cl=i);if(null===n){var o=_e.Qe.Rectangle;"function"===typeof o&&(n=o(t,e,i))}return n},d.Object.defineProperties(Nl.prototype,{geometry:{get:function(){return null!==this.na?this.na:this.Ed},set:function(t){var e=this.na,i=this.Ed;if(e!==t){this.Ed=this.na=null!==t?t.freeze():null;var n=this.part;null!==n&&(n.kh=NaN),this.o(),this.g("geometry",e||i,t),Na(this)&&(t=this.part,null!==t&&da(this,t,"geometryString"))}}},geometryString:{get:function(){return null===this.geometry?"":this.geometry.toString()},set:function(t){t=Ze(t);var e=t.normalize();this.geometry=t,this.position=t=pt.allocAt(-e.x,-e.y),pt.free(t)}},isGeometryPositioned:{get:function(){return this.vo},set:function(t){var e=this.vo;e!==t&&(this.vo=t,this.o(),this.g("isGeometryPositioned",e,t))}},fill:{get:function(){return this.tl},set:function(t){var e=this.tl;e!==t&&(null!==t&&dh(t,"Shape.fill"),t instanceof eh&&t.freeze(),this.tl=t,this.M(),this.g("fill",e,t))}},stroke:{get:function(){return this.Hc},set:function(t){var e=this.Hc;e!==t&&(null!==t&&dh(t,"Shape.stroke"),t instanceof eh&&t.freeze(),this.Hc=t,this.M(),this.g("stroke",e,t))}},strokeWidth:{get:function(){return this.wh},set:function(t){var e=this.wh;if(e!==t)if(0<=t){this.wh=t,this.o();var i=this.part;null!==i&&(i.kh=NaN),this.g("strokeWidth",e,t)}else M(t,"value >= 0",Nl,"strokeWidth:value")}},strokeCap:{get:function(){return this.km},set:function(t){var e=this.km;e!==t&&("string"!==typeof t||"butt"!==t&&"round"!==t&&"square"!==t?M(t,'"butt", "round", or "square"',Nl,"strokeCap"):(this.km=t,this.M(),this.g("strokeCap",e,t)))}},strokeJoin:{get:function(){return this.lm},set:function(t){var e=this.lm;e!==t&&("string"!==typeof t||"miter"!==t&&"bevel"!==t&&"round"!==t?M(t,'"miter", "bevel", or "round"',Nl,"strokeJoin"):(this.lm=t,this.M(),this.g("strokeJoin",e,t)))}},strokeMiterLimit:{get:function(){return this.gk},set:function(t){var e=this.gk;if(e!==t&&1<=t){this.gk=t,this.M();var i=this.part;null!==i&&(i.kh=NaN),this.g("strokeMiterLimit",e,t)}}},strokeDashArray:{get:function(){return this.uh},set:function(t){var e=this.uh;if(e!==t){if(null!==t){for(var i=t.length,n=0,o=0;o<i;o++){var r=t[o];0<=r&&isFinite(r)||w("strokeDashArray:value "+r+" at index "+o+" must be a positive number or zero."),n+=r}if(0===n){if(null===e)return;t=null}}this.uh=t,this.M(),this.g("strokeDashArray",e,t)}}},strokeDashOffset:{get:function(){return this.vh},set:function(t){var e=this.vh;e!==t&&0<=t&&(this.vh=t,this.M(),this.g("strokeDashOffset",e,t))}},figure:{get:function(){return this.Yn},set:function(t){var e=this.Yn;if(e!==t){var i=_e.Qe[t];"function"===typeof i?i=t:(i=_e.Qe[t.toLowerCase()])||w("Unknown Shape.figure: "+t),e!==i&&(t=this.part,null!==t&&(t.kh=NaN),this.Yn=i,this.Ed=null,this.dc(),this.o(),this.g("figure",e,i))}}},toArrow:{get:function(){return this.rm},set:function(t){var e=this.rm;if(!0===t?t="Standard":!1===t&&(t=""),e!==t){var i=Dl(t);null===i?w("Unknown Shape.toArrow: "+t):e!==i&&(this.rm=i,this.Ed=null,this.dc(),this.o(),Ol(this),this.g("toArrow",e,i))}}},fromArrow:{get:function(){return this.ul},set:function(t){var e=this.ul;if(!0===t?t="Standard":!1===t&&(t=""),e!==t){var i=Dl(t);null===i?w("Unknown Shape.fromArrow: "+t):e!==i&&(this.ul=i,this.Ed=null,this.dc(),this.o(),Ol(this),this.g("fromArrow",e,i))}}},spot1:{get:function(){return this.pf},set:function(t){var e=this.pf;e.w(t)||(this.pf=t=t.H(),this.o(),this.g("spot1",e,t))}},spot2:{get:function(){return this.qf},set:function(t){var e=this.qf;e.w(t)||(this.qf=t=t.H(),this.o(),this.g("spot2",e,t))}},parameter1:{get:function(){return this.sp},set:function(t){var e=this.sp;e!==t&&(this.sp=t,this.dc(),this.o(),this.g("parameter1",e,t))}},parameter2:{get:function(){return this.tp},set:function(t){var e=this.tp;e!==t&&(this.tp=t,this.dc(),this.o(),this.g("parameter2",e,t))}},naturalBounds:{get:function(){var t=this.desiredSize;return t.s()||null===this.na?new zt(0,0,t.width,t.height):(this.rc.assign(this.na.bounds),this.rc)}},pathPattern:{get:function(){return this.wp},set:function(t){var e=this.wp;e!==t&&(this.wp=t,this.M(),this.g("pathPattern",e,t))}},geometryStretch:{get:function(){return this.ho},set:function(t){var e=this.ho;e!==t&&(this.ho=t,this.o(),this.g("geometryStretch",e,t))}},interval:{get:function(){return this.Yd},set:function(t){var e=this.Yd;if(t=Math.round(t),e!==t&&0!==t&&isFinite(t)){this.Yd=t;var i=this.diagram;null!==i&&this.panel===i.grid&&qr(i),this.o(),i=this.panel,null!==i&&(i.eh=null),this.g("interval",e,t)}}},graduatedStart:{get:function(){return this.Wd},set:function(t){var e=this.Wd;e!==t&&(0>t?t=0:1<t&&(t=1),this.Wd=t,this.o(),this.g("graduatedStart",e,t))}},graduatedEnd:{get:function(){return this.Ud},set:function(t){var e=this.Ud;e!==t&&(0>t?t=0:1<t&&(t=1),this.Ud=t,this.o(),this.g("graduatedEnd",e,t))}},graduatedSkip:{get:function(){return this.Vd},set:function(t){var e=this.Vd;e!==t&&(this.Vd=t,this.o(),this.g("graduatedSkip",e,t))}}}),Nl.prototype.intersectsRect=Nl.prototype.Mc,Nl.prototype.containedInRect=Nl.prototype.Jh,Nl.prototype.getNearestIntersectionPoint=Nl.prototype.Nt,Nl.prototype.getDocumentBounds=Nl.prototype.mj,Nl.prototype.getDocumentPoint=Nl.prototype.da;var Fl=new _,Bl=new _;function Il(){ca.call(this),lu||(hu=ys?new Ja(null).context:null,lu=!0),this.Jx=this.Ub="",this.Hc="black",this.ne="13px sans-serif",this.Vi="start",this.Td=qs,this.aj=Le,this.Pj=!0,this.Ai=this.Bi=!1,this.mg=Jl,this.zg=Wl,this.us=this.vb=this.Zc=0,this.ev=this.fv=null,this.Vn=!1,this.ld=this.xn=this.iq=this.Wi=this.jq=null,this.nf=this.mf=0,this.ti=Ql,this.ve=1/0,this.Ei=0,this.oe=null,this.Be=0,this.me=this.lb=this.Qb=null,this.Yd=1,this.Wd=0,this.Ud=1,this.Vd=this.Lj=null}function El(t,e){t.F=6144|e.F,t.hb=e.opacity,t.mb=e.background,t.ec=e.areaBackground,t.Xc=e.desiredSize.H(),t.fg=e.minSize.H(),t.eg=e.maxSize.H(),t.cg=e.cg.copy(),t.Aa=e.scale,t.Yb=e.angle,t.De=e.stretch,t.jh=e.margin.H(),t.yb=e.alignment.H(),t.$k=e.alignmentFocus.H(),t.am=e.segmentFraction,t.bm=e.segmentOffset.H(),t.cm=e.segmentOrientation,null!==e.Za&&(t.Za=e.Za.copy()),t.em=e.shadowVisible,e instanceof Il&&(t.Ub=e.Ub,t.Hc=e.Hc,t.ne=e.ne,t.Vi=e.Vi,t.Td=e.Td,t.aj=e.aj,t.Pj=e.Pj,t.Bi=e.Bi,t.Ai=e.Ai,t.mg=e.mg,t.zg=e.zg,t.oe=null,t.mf=e.mf,t.nf=e.nf,t.ve=e.ve,t.Ei=e.Ei,t.Yd=e.Yd,t.Wd=e.Wd,t.Ud=e.Ud,t.Lj=e.Lj,t.Vd=e.Vd)}function Rl(t,e,i){null===t.me?(t.me=e,t.vb=i):(null!==t.lb&&null!==t.Qb||(t.lb=[],t.Qb=[],t.lb.push(t.me),t.Qb.push(t.vb)),t.lb.push(e),t.Qb.push(i))}function zl(t,e,i,n){var o=t.ti===Ql;o&&(e=e.trim());var r=0,s=t.ne,a=t.mf+t.nf;a=Math.max(0,Yl(t)+a);var h=t.mg===Zl?Xl(s):0;if(t.Zc>=t.ve)null!==n&&n.h(0,a);else if(s=e,t.zg===Hl){t.Be=1;var l=Gl(e);if(0===h||l<=i)t.vb=Math.max(t.vb,l),Rl(t,e,t.vb),null!==n&&n.h(l,a);else{for(r=Vl(t,s),s=s.substr(r.length),e=Vl(t,s),l=Gl(r+e);0<e.length&&l<=i;)r+=e,s=s.substr(e.length),e=Vl(t,s),l=r+e,o&&(l=l.trim()),l=Gl(l);for(o&&(e=e.trim()),r+=e,i=Math.max(1,i-h);Gl(r)>i&&1<r.length;)r=r.substr(0,r.length-1);r+=su;var u=Gl(r);t.vb=u,Rl(t,r,u),null!==n&&n.h(u,a)}}else{for(h=0,0===s.length&&(h=1,Rl(t,s,0));0<s.length;){for(e=Vl(t,s),s=s.substr(e.length);Gl(e)>i;){var c=1;for(l=Gl(e.substr(0,c)),u=0;l<=i;)c++,u=l,l=Gl(e.substr(0,c));if(1===c){var f=l;r=Math.max(r,l)}else f=u,r=Math.max(r,u);if(c--,1>c&&(c=1),Rl(t,e.substr(0,c),f),h++,e=e.substr(c),t.Zc+h>t.ve)break}for(u=Vl(t,s),l=Gl(e+u);0<u.length&&l<=i;)e+=u,s=s.substr(u.length),u=Vl(t,s),l=e+u,o&&(l=l.trim()),l=Gl(l);if(o&&(e=e.trim()),""!==e&&("颅"===e[e.length-1]&&(e=e.substring(0,e.length-1)+"鈥�"),0===u.length?(c=l,r=Math.max(r,l)):(c=u=Gl(e),r=Math.max(r,u)),Rl(t,e,c),h++,t.Zc+h>t.ve))break}t.Be=Math.min(t.ve,h),t.vb=Math.max(t.vb,r),null!==n&&n.h(t.vb,a*t.Be)}}function Vl(t,e){if(t.zg===$l)return e.substr(0,1);for(var i=e.length,n=0,o=eu;n<i&&!o.test(e.charAt(n));)n++;for(t.ti===tu&&(i=Math.min(i,n+1));n<i&&o.test(e.charAt(n));)n++;return n>=e.length?e:e.substr(0,n)}function Gl(t){return null===hu?8*t.length:hu.measureText(t).width}function Yl(t){if(null!==t.oe)return t.oe;var e=t.ne;if(null===hu){var i=16;return t.oe=i}return void 0!==iu[e]&&5e3>nu?i=iu[e]:(i=1.3*hu.measureText("M").width,iu[e]=i,nu++),t.oe=i}function Xl(t){if(null===hu)return 6;if(void 0!==ou[t]&&5e3>ru)var e=ou[t];else e=hu.measureText(su).width,ou[t]=e,ru++;return e}function ql(t,e){var i=t.Ub.replace(/\r\n/g,"\n").replace(/\r/g,"\n"),n=t.mf+t.nf;if(n=Math.max(0,Yl(t)+n),0===i.length)return t.vb=0,t.Zc=1,n;if(!t.isMultiline){var o=i.indexOf("\n",0);0<=o&&(i=i.substr(0,o))}o=0;for(var r,s=t.Zc=0,a=!1;!a;){if(r=i.indexOf("\n",s),-1===r&&(r=i.length,a=!0),s<=r){if(s=i.substr(s,r-s),t.zg!==Hl){t.Be=0;var h=Bt.alloc();zl(t,s,e,h),o+=h.height,Bt.free(h),t.Zc+=t.Be}else zl(t,s,e,null),o+=n,t.Zc++;t.Zc===t.ve&&(a=!0)}s=r+1}return t.us=o}Nl.className="Shape",Nl.getFigureGenerators=function(){var t,e=new dt;for(t in _e.Qe)t!==t.toLowerCase()&&e.add(t,_e.Qe[t]);return e.freeze(),e},Nl.defineFigureGenerator=function(t,e){var i=t.toLowerCase(),n=_e.Qe;n[t]=e,n[i]=t},Nl.getArrowheadGeometries=function(){var t=new dt;for(n in _e.dn)if(void 0===Fl[n]){var e=Ze(_e.dn[n],!1);Fl[n]=e,e=n.toLowerCase(),e!==n&&(Fl[e]=n)}for(var i in Fl)if(i!==i.toLowerCase()){var n=Fl[i];n instanceof We&&t.add(i,n)}return t.freeze(),t},Nl.defineArrowheadGeometry=function(t,e){var i=null;i="string"===typeof e?Ze(e,!1):e,e=t.toLowerCase(),"none"!==e&&t!==e||w("Shape.defineArrowheadGeometry name must not be empty or None or all-lower-case: "+t);var n=Fl;n[t]=i,n[e]=t},f(Il,ca),Il.prototype.cloneProtected=function(t){ca.prototype.cloneProtected.call(this,t),t.Ub=this.Ub,t.Jx=this.Jx,t.Hc=this.Hc,t.ne=this.ne,t.Vi=this.Vi,t.Td=this.Td,t.aj=this.aj,t.Pj=this.Pj,t.Bi=this.Bi,t.Ai=this.Ai,t.mg=this.mg,t.zg=this.zg,t.Zc=this.Zc,t.us=this.us,t.vb=this.vb,t.fv=this.fv,t.ev=this.ev,t.Vn=this.Vn,t.jq=this.jq,t.Wi=this.Wi,t.iq=this.iq,t.xn=this.xn,t.ld=this.ld,t.mf=this.mf,t.nf=this.nf,t.ti=this.ti,t.ve=this.ve,t.oe=this.oe,t.Be=this.Be,t.Qb=this.Qb,t.lb=this.lb,t.me=this.me,t.Ei=this.Ei,t.Yd=this.Yd,t.Wd=this.Wd,t.Ud=this.Ud,t.Lj=this.Lj,t.Vd=this.Vd},i=Il.prototype,i.jb=function(t){t.classType===Il?this.wrap=t:ca.prototype.jb.call(this,t)},i.toString=function(){return 22<this.Ub.length?'TextBlock("'+this.Ub.substring(0,20)+'"...)':'TextBlock("'+this.Ub+'")'},i.o=function(){ca.prototype.o.call(this),this.ev=this.fv=null},i.ej=function(t,e){if(null!==this.Hc&&0!==this.Ub.length&&null!==this.ne){var i=this.naturalBounds,n=this.actualBounds,o=i.width,r=i.height,s=Yl(this),a=t.textAlign=this.Vi,h=e.Gl;"start"===a?a=h?"right":"left":"end"===a&&(a=h?"left":"right"),h=this.Bi;var l=this.Ai;va(this,t,this.Hc,!0,!1,i,n),(h||l)&&va(this,t,this.Hc,!1,!1,i,n),n=0,i=!1;var u=pt.allocAt(0,0);this.Fd.ta(u);var c=pt.allocAt(0,s);this.Fd.ta(c);var f=u.Ie(c);switch(pt.free(u),pt.free(c),u=e.scale,8>f*u*u&&(i=!0),e.Gb!==t&&(i=!1),!1===e.Ke("textGreeking")&&(i=!1),e=this.mf,f=this.nf,this.flip){case Js:t.translate(o,0),t.scale(-1,1);break;case $s:t.translate(0,r),t.scale(1,-1);break;case Zs:t.translate(o,r),t.scale(-1,-1)}if(u=this.Zc,c=(e+s+f)*u,r>c&&(n=this.aj,n=n.y*r-n.y*c+n.offsetY),1===u&&null!==this.me)f=this.vb,f>o&&(f=o),this.dj(this.me,t,0,n+e,o,s,f,i,a,h,l);else if(null!==this.Qb&&null!==this.lb)for(c=0;c<u;c++){var d=this.Qb[c];d>o&&(d=o),n+=e,this.dj(this.lb[c],t,0,n,o,s,d,i,a,h,l),n+=s+f}switch(this.flip){case Js:t.scale(-1,1),t.translate(-o,0);break;case $s:t.scale(1,-1),t.translate(0,-r);break;case Zs:t.scale(-1,-1),t.translate(-o,-r)}}},i.dj=function(t,e,i,n,o,r,s,a,h,l,u){var c=0;a?("left"===h?c=0:"right"===h?c=o-s:"center"===h&&(c=(o-s)/2),e.fillRect(i+c,n+.25*r,s,1)):("left"===h?c=0:"right"===h?c=o:"center"===h&&(c=o/2),o=null!==Ul?Ul(this,r):.75*r,e.fillText(t,i+c,n+o),t=r/20|0,0===t&&(t=1),"right"===h?c-=s:"center"===h&&(c-=s/2),l&&(h=null!==Kl?Kl(this,r):.8*r,e.beginPath(),e.lineWidth=t,e.moveTo(i+c,n+h),e.lineTo(i+c+s,n+h),e.stroke()),u&&(e.beginPath(),e.lineWidth=t,n=n+r-r/2.2|0,0!==t%2&&(n+=.5),e.moveTo(i+c,n),e.lineTo(i+c+s,n),e.stroke()))},i.Hm=function(t,e,i,n){this.Ei=t;var o,r=this.ne;if(null!==hu&&au!==r&&(au=hu.font=r),this.vb=this.Be=0,this.me=this.lb=this.Qb=this.oe=null,isNaN(this.desiredSize.width)){if(r=this.Ub.replace(/\r\n/g,"\n").replace(/\r/g,"\n"),0===r.length)r=0;else if(this.isMultiline){for(var s=o=0,a=!1;!a;){var h=r.indexOf("\n",s);-1===h&&(h=r.length,a=!0),s=r.substr(s,h-s),this.ti===Ql&&(s=s.trim()),o=Math.max(o,Gl(s)),s=h+1}r=o}else o=r.indexOf("\n",0),0<=o&&(r=r.substr(0,o)),r=Gl(r);r=Math.min(r,t/this.scale),r=Math.max(8,r)}else r=this.desiredSize.width;if(null!==this.panel&&(r=Math.min(r,this.panel.maxSize.width)),o=ql(this,r),o=isNaN(this.desiredSize.height)?Math.min(o,e/this.scale):this.desiredSize.height,a=o,0!==this.vb&&null!==this.Qb&&null!==this.lb&&this.mg===Zl&&(e=this.ne,e=this.mg===Zl?Xl(e):0,h=this.mf+this.nf,h=Math.max(0,Yl(this)+h),a=Math.min(this.maxLines-1,Math.max(Math.floor(a/h+.01)-1,0)),!(a+1>=this.lb.length))){for(h=this.lb[a],e=Math.max(1,t-e);Gl(h)>e&&1<h.length;)h=h.substr(0,h.length-1);h+=su,e=Gl(h),this.lb[a]=h,this.lb=this.lb.slice(0,a+1),this.Qb[a]=e,this.Qb=this.Qb.slice(0,a+1),this.Be=this.lb.length,this.vb=Math.max(this.vb,e),this.Zc=this.Be,1===this.Zc&&(this.me=this.lb[0])}(this.wrap===_l||isNaN(this.desiredSize.width))&&(r=isNaN(t)?this.vb:Math.min(t,this.vb),isNaN(this.desiredSize.width)&&(r=Math.max(8,r))),r=Math.max(i,r),o=Math.max(n,o),Vt(this.rc,r,o),pa(this,0,0,r,o)},i.Ih=function(t,e,i,n){ya(this,t,e,i,n)},d.Object.defineProperties(Il.prototype,{font:{get:function(){return this.ne},set:function(t){var e=this.ne;e!==t&&(this.ne=t,this.oe=null,this.o(),this.g("font",e,t))}},text:{get:function(){return this.Ub},set:function(t){var e=this.Ub;t=null!==t&&void 0!==t?t.toString():"",e!==t&&(this.Ub=t,this.o(),this.g("text",e,t))}},textAlign:{get:function(){return this.Vi},set:function(t){var e=this.Vi;e===t||"start"!==t&&"end"!==t&&"left"!==t&&"right"!==t&&"center"!==t||(this.Vi=t,this.M(),this.g("textAlign",e,t))}},flip:{get:function(){return this.Td},set:function(t){var e=this.Td;e!==t&&(this.Td=t,this.M(),this.g("flip",e,t))}},verticalAlignment:{get:function(){return this.aj},set:function(t){var e=this.aj;e.w(t)||(this.aj=t=t.H(),wa(this),this.g("verticalAlignment",e,t))}},naturalBounds:{get:function(){if(!this.rc.s()){var t=Bt.alloc();zl(this,this.Ub,999999,t);var e=t.width;Bt.free(t),t=ql(this,e);var i=this.desiredSize;isNaN(i.width)||(e=i.width),isNaN(i.height)||(t=i.height),Vt(this.rc,e,t)}return this.rc}},isMultiline:{get:function(){return this.Pj},set:function(t){var e=this.Pj;e!==t&&(this.Pj=t,this.o(),this.g("isMultiline",e,t))}},isUnderline:{get:function(){return this.Bi},set:function(t){var e=this.Bi;e!==t&&(this.Bi=t,this.M(),this.g("isUnderline",e,t))}},isStrikethrough:{get:function(){return this.Ai},set:function(t){var e=this.Ai;e!==t&&(this.Ai=t,this.M(),this.g("isStrikethrough",e,t))}},wrap:{get:function(){return this.zg},set:function(t){var e=this.zg;e!==t&&(this.zg=t,this.o(),this.g("wrap",e,t))}},overflow:{get:function(){return this.mg},set:function(t){var e=this.mg;e!==t&&(this.mg=t,this.o(),this.g("overflow",e,t))}},stroke:{get:function(){return this.Hc},set:function(t){var e=this.Hc;e!==t&&(null!==t&&dh(t,"TextBlock.stroke"),t instanceof eh&&t.freeze(),this.Hc=t,this.M(),this.g("stroke",e,t))}},lineCount:{get:function(){return this.Zc}},editable:{get:function(){return this.Vn},set:function(t){var e=this.Vn;e!==t&&(this.Vn=t,this.g("editable",e,t))}},textEditor:{get:function(){return this.jq},set:function(t){var e=this.jq;e!==t&&(this.jq=t,this.g("textEditor",e,t))}},errorFunction:{get:function(){return this.ld},set:function(t){var e=this.ld;e!==t&&(this.ld=t,this.g("errorFunction",e,t))}},interval:{get:function(){return this.Yd},set:function(t){var e=this.Yd;if(t=Math.round(t),e!==t&&0!==t&&isFinite(t)){this.Yd=t,this.o();var i=this.panel;null!==i&&(i.eh=null),this.g("interval",e,t)}}},graduatedStart:{get:function(){return this.Wd},set:function(t){var e=this.Wd;e!==t&&(0>t?t=0:1<t&&(t=1),this.Wd=t,this.o(),this.g("graduatedStart",e,t))}},graduatedEnd:{get:function(){return this.Ud},set:function(t){var e=this.Ud;e!==t&&(0>t?t=0:1<t&&(t=1),this.Ud=t,this.o(),this.g("graduatedEnd",e,t))}},graduatedFunction:{get:function(){return this.Lj},set:function(t){var e=this.Lj;e!==t&&(this.Lj=t,this.o(),this.g("graduatedFunction",e,t))}},graduatedSkip:{get:function(){return this.Vd},set:function(t){var e=this.Vd;e!==t&&(this.Vd=t,this.o(),this.g("graduatedSkip",e,t))}},textValidation:{get:function(){return this.Wi},set:function(t){var e=this.Wi;e!==t&&(this.Wi=t,this.g("textValidation",e,t))}},textEdited:{get:function(){return this.iq},set:function(t){var e=this.iq;e!==t&&(this.iq=t,this.g("textEdited",e,t))}},spacingAbove:{get:function(){return this.mf},set:function(t){var e=this.mf;e!==t&&(this.mf=t,this.o(),this.g("spacingAbove",e,t))}},spacingBelow:{get:function(){return this.nf},set:function(t){var e=this.nf;e!==t&&(this.nf=t,this.o(),this.g("spacingBelow",e,t))}},formatting:{get:function(){return this.ti},set:function(t){var e=this.ti;e!==t&&(this.ti=t,this.o(),this.g("formatting",e,t))}},maxLines:{get:function(){return this.ve},set:function(t){var e=this.ve;e!==t&&(t=Math.floor(t),0>=t&&M(t,"> 0",Il,"maxLines"),this.ve=t,this.o(),this.g("maxLines",e,t))}},metrics:{get:function(){return{arrSize:null!==this.Qb?this.Qb:[this.vb],arrText:null!==this.lb?this.lb:[this.me],maxLineWidth:this.vb,fontHeight:this.oe}}},choices:{get:function(){return this.xn},set:function(t){var e=this.xn;e!==t&&(this.xn=t,this.g("choices",e,t))}}});var Ul=null,Kl=null,Hl=new U(Il,"None",0),_l=new U(Il,"WrapFit",1),Wl=new U(Il,"WrapDesiredSize",2),$l=new U(Il,"WrapBreakAll",3),Jl=new U(Il,"OverflowClip",0),Zl=new U(Il,"OverflowEllipsis",1),Ql=new U(Il,"FormatTrim",0),tu=new U(Il,"FormatNone",0),eu=/[ \u200b\u00ad]/,iu=new _,nu=0,ou=new _,ru=0,su="...",au="",hu=null,lu=!1;function uu(){this.Qb=[],this.lb=[]}function cu(){ca.call(this),this.Zg=null,this.$p="",this.th=Jt,this.yl=Xs,this.xh=this.ld=null,this.xl=ae,this.Td=qs,this.nm=null,this.uo=!1,this.Yr=!0,this.Ol=!1,this.gm=null}function fu(t){void 0===t&&(t=""),""!==t?gu[t]&&(delete gu[t],yu--):(gu=new _,yu=0)}function du(t,e){e.fz||(e.dv=function(i){e.ls=!0,e.ro=!1;var n=e.Wg.copy();if(null!==n&&void 0!==n){for(n=n.iterator;n.next();){var o=n.value,r=e.getAttribute("src"),s=o.pg.G(r);if(null!==s)for(var a=s.length,h=0;h<a;h++)r=s[h],o.Wl.add(r),o.Db(),e.io&&(void 0===e.ov&&(e.ov=i),null!==r.xh&&r.xh(r,i))}e.Wg=null}t.desiredSize.s()||(ja(t,!1),t.o())},e.Pu=function(t){e.ro=t;var i=e.Wg.copy();if(null!==i&&void 0!==i){for(i=i.iterator;i.next();){var n=i.value,o=e.getAttribute("src"),r=n.pg.G(o);if(null!==r){n=r.length,o=j();for(var s=0;s<n;s++)o.push(r[s]);if(e.io)for(s=0;s<n;s++)r=o[s],null!==r.ld&&r.ld(r,t);O(o)}}e.Wg=null}},e.addEventListener("load",e.dv),e.addEventListener("error",e.Pu),e.fz=!0)}function pu(t){t.removeEventListener("load",t.dv),t.removeEventListener("error",t.Pu),delete t.dv,delete t.Pu}Il.className="TextBlock",Il.getEllipsis=function(){return su},Il.setEllipsis=function(t){su=t,ou=new _,ru=0},Il.getBaseline=function(){return Ul},Il.setBaseline=function(t){Ul=t},Il.getUnderline=function(){return Kl},Il.setUnderline=function(t){Kl=t},Il.isValidFont=function(t){if(lu||(hu=ys?new Ja(null).context:null,lu=!0),null===hu)return!0;var e=hu.font;if(t===e||"10px sans-serif"===t)return!0;hu.font="10px sans-serif",hu.font=t;var i=hu.font;if("10px sans-serif"!==i)return hu.font=e,!0;hu.font="19px serif";var n=hu.font;return hu.font=t,i=hu.font,hu.font=e,i!==n},Il.None=Hl,Il.WrapFit=_l,Il.WrapDesiredSize=Wl,Il.WrapBreakAll=$l,Il.OverflowClip=Jl,Il.OverflowEllipsis=Zl,uu.prototype.reset=function(){this.Qb=[],this.lb=[]},uu.prototype.gy=function(t){this.Qb=T(t.Qb),this.lb=T(t.lb)},uu.className="TextBlockMetrics",f(cu,ca),cu.prototype.cloneProtected=function(t){ca.prototype.cloneProtected.call(this,t),t.element=this.Zg,t.$p=this.$p,t.th=this.th.H(),t.yl=this.yl,t.Td=this.Td,t.ld=this.ld,t.xh=this.xh,t.xl=this.xl.H(),t.Yr=this.Yr,t.gm=this.gm},cu.prototype.jb=function(t){t===qs||t===Us||t===Ws?this.imageStretch=t:ca.prototype.jb.call(this,t)},cu.prototype.toString=function(){return"Picture("+this.source+")#"+st(this)},cu.prototype.QA=function(){if(""!==this.source){fu(this.source);var t=this.source;this.source="",this.source=t}},cu.prototype.redraw=function(){this.M()},cu.prototype.ej=function(t,e){var i=this.Zg;if(null!==i){var n=i.getAttribute("src");if(!(i instanceof HTMLImageElement&&(null===n||""===n)||i.ro instanceof Event&&t instanceof Za)){n=this.naturalBounds;var o=0,r=0,s=this.uo,a=s?+i.width:i.naturalWidth;if(s=s?+i.height:i.naturalHeight,void 0===a&&i.videoWidth&&(a=i.videoWidth),void 0===s&&i.videoHeight&&(s=i.videoHeight),a=a||n.width,s=s||n.height,0!==a&&0!==s){var h=a,l=s;this.sourceRect.s()&&(o=this.th.x,r=this.th.y,a=this.th.width,s=this.th.height);var u=a,c=s,f=this.yl,d=this.xl;switch(f){case qs:if(this.sourceRect.s())break;u>=n.width&&(o=o+d.offsetX+(u*d.x-n.width*d.x)),c>=n.height&&(r=r+d.offsetY+(c*d.y-n.height*d.y)),a=Math.min(n.width,u),s=Math.min(n.height,c);break;case Xs:u=n.width,c=n.height;break;case Us:case Ws:f===Us?(f=Math.min(n.height/c,n.width/u),u*=f,c*=f):f===Ws&&(f=Math.max(n.height/c,n.width/u),u*=f,c*=f,u>=n.width&&(o=(o+d.offsetX+(u*d.x-n.width*d.x)/u)*a),c>=n.height&&(r=(r+d.offsetY+(c*d.y-n.height*d.y)/c)*s),a*=1/(u/n.width),s*=1/(c/n.height),u=n.width,c=n.height)}f=this.Af()*e.scale;var p=u*f*c*f,g=a*s/p,y=i.__goCache;f=null;var m=mu;if(i.ls&&void 0!==y&&4<p&&g>m*m)for(null===y.cj&&(xu(y,4,h,l,i),xu(y,16,h,l,i)),h=y.cj,l=h.length,p=0;p<l;p++){if(!(h[p].ratio*h[p].ratio<g))break;f=h[p]}if(!e.rl){if(null===this.nm)if(null===this.Zg)this.nm=!1;else{h=new Ja(null).context,h.drawImage(this.Zg,0,0);try{h.getImageData(0,0,1,1).data[3]&&(this.nm=!1),this.nm=!1}catch(v){this.nm=!0}}if(this.nm)return}switch(h=0,u<n.width&&(h=d.offsetX+(n.width*d.x-u*d.x)),l=0,c<n.height&&(l=d.offsetY+(n.height*d.y-c*d.y)),this.flip){case Js:t.translate(Math.min(n.width,u),0),t.scale(-1,1);break;case $s:t.translate(0,Math.min(n.height,c)),t.scale(1,-1);break;case Zs:t.translate(Math.min(n.width,u),Math.min(n.height,c)),t.scale(-1,-1)}if(e.Ke("pictureRatioOptimization")&&!e.yi&&void 0!==y&&null!==f&&1!==f.ratio){t.save(),e=f.ratio;try{t.drawImage(f.source,o/e,r/e,Math.min(f.source.width,a/e),Math.min(f.source.height,s/e),h,l,Math.min(n.width,u),Math.min(n.height,c))}catch(v){this.Yr=!1}t.restore()}else try{t.drawImage(i,o,r,a,s,h,l,Math.min(n.width,u),Math.min(n.height,c))}catch(v){this.Yr=!1}switch(this.flip){case Js:t.scale(-1,1),t.translate(-Math.min(n.width,u),0);break;case $s:t.scale(1,-1),t.translate(0,-Math.min(n.height,c));break;case Zs:t.scale(-1,-1),t.translate(-Math.min(n.width,u),-Math.min(n.height,c))}}}}},cu.prototype.Hm=function(t,e,i,n){var o=this.desiredSize,r=ka(this,!0),s=this.Zg,a=this.uo;(a||!this.Ol&&s&&s.complete)&&(this.Ol=!0),null===s&&(isFinite(o.width)||(t=0),isFinite(o.height)||(e=0)),isFinite(o.width)||r===Xs||r===Hs?(isFinite(t)||(t=this.sourceRect.s()?this.sourceRect.width:a?+s.width:s.naturalWidth),i=0):null!==s&&!1!==this.Ol&&(t=this.sourceRect.s()?this.sourceRect.width:a?+s.width:s.naturalWidth),isFinite(o.height)||r===Xs||r===_s?(isFinite(e)||(e=this.sourceRect.s()?this.sourceRect.height:a?+s.height:s.naturalHeight),n=0):null!==s&&!1!==this.Ol&&(e=this.sourceRect.s()?this.sourceRect.height:a?+s.height:s.naturalHeight),isFinite(o.width)&&(t=o.width),isFinite(o.height)&&(e=o.height),o=this.maxSize,r=this.minSize,i=Math.max(i,r.width),n=Math.max(n,r.height),t=Math.min(o.width,t),e=Math.min(o.height,e),t=Math.max(i,t),e=Math.max(n,e),null===s||s.complete||(isFinite(t)||(t=0),isFinite(e)||(e=0)),Vt(this.rc,t,e),pa(this,0,0,t,e)},cu.prototype.Ih=function(t,e,i,n){ya(this,t,e,i,n)},d.Object.defineProperties(cu.prototype,{element:{get:function(){return this.Zg},set:function(t){var e=this.Zg;if(e!==t){this.uo=t instanceof HTMLCanvasElement;var i=t instanceof HTMLImageElement;e instanceof HTMLImageElement&&pu(e),null===t||i||t instanceof HTMLVideoElement||this.uo||w("Picture.element must be an instance of Image, Canvas, or Video, not: "+t);var n=this.diagram;null!==n&&Wr(n,this),this.Zg=t,null!==t&&i&&void 0===t.Wg&&(t.Wg=new nt),null!==n&&i&&_r(n,this),null!==t&&(this.uo||!0===t.complete?(t.io&&(t.ro instanceof Event&&null!==this.ld?this.ld(this,t.ro):!0===t.ls&&!t.ro&&null!==this.xh&&t.ov&&this.xh(this,t.ov)),t.ls=!0,this.desiredSize.s()||(ja(this,!1),this.o())):i&&du(this,t)),this.g("element",e,t),this.M()}}},source:{get:function(){return this.$p},set:function(t){var e=this.$p;if(e!==t){this.$p=t;var i=gu;if(ys){var n=null;if(void 0!==i[t])n=i[t];else if(""!==t){30<yu&&(fu(),i=gu),n=b("img"),n.io=!0,du(this,n);var o=this.gm;null!==o&&(n.crossOrigin=o(this)),n.src=t,i[t]=n,yu++}this.element=n,null!==n&&void 0===n.__goCache&&(n.__goCache=new vu),this.o(),this.M()}this.g("source",e,t)}}},sourceCrossOrigin:{get:function(){return this.gm},set:function(t){if(this.gm!==t&&(this.gm=t,null!==this.element)){var e=this.element.getAttribute("src");null===t&&"string"===typeof e?this.element.crossOrigin=null:null!==t&&(this.element.crossOrigin=t(this)),this.element.src=e}}},sourceRect:{get:function(){return this.th},set:function(t){var e=this.th;e.w(t)||(this.th=t=t.H(),this.M(),this.g("sourceRect",e,t))}},imageStretch:{get:function(){return this.yl},set:function(t){var e=this.yl;e!==t&&(this.yl=t,this.M(),this.g("imageStretch",e,t))}},flip:{get:function(){return this.Td},set:function(t){var e=this.Td;e!==t&&(this.Td=t,this.M(),this.g("flip",e,t))}},imageAlignment:{get:function(){return this.xl},set:function(t){var e=this.xl;e.w(t)||(this.xl=t=t.H(),this.M(),this.g("imageAlignment",e,t))}},errorFunction:{get:function(){return this.ld},set:function(t){var e=this.ld;e!==t&&(this.ld=t,this.g("errorFunction",e,t))}},successFunction:{get:function(){return this.xh},set:function(t){var e=this.xh;e!==t&&(this.xh=t,this.g("successFunction",e,t))}},naturalBounds:{get:function(){return this.rc}}}),cu.prototype.redraw=cu.prototype.redraw,cu.prototype.reloadSource=cu.prototype.QA;var gu=null,yu=0,mu=4;function vu(){this.cj=null}function xu(t,e,i,n,o){null===t.cj&&(t.cj=[]);var r=new Ja(null),s=r.context,a=1/e;r.width=i/e,r.height=n/e,0!==r.width&&0!==r.height&&(e=new bu(r.Ja,e),i=1,0<t.cj.length&&(i=t.cj[t.cj.length-1],o=i.source,i=i.ratio),s.setTransform(a*i,0,0,a*i,0,0),s.drawImage(o,0,0),t.cj.push(e))}function bu(t,e){this.source=t,this.ratio=e}function wu(){this.Kt=new We,this.ic=null}function ku(t,e,i,n,o){t.ic=new ci,t.ic.startX=e,t.ic.startY=i,t.ic.isFilled=n,t.Kt.figures.add(t.ic),void 0!==o&&(t.ic.isShadowed=o)}function Mu(t){var e=t.ic.segments.length;0<e&&t.ic.segments.J(e-1).close()}function Su(t,e,i,n,o,r,s){var a;void 0===a&&(a=!1);var h=new fi(mi);h.point1X=e,h.point1Y=i,h.point2X=n,h.point2Y=o,h.endX=r,h.endY=s,a&&h.close(),t.ic.segments.add(h)}function Pu(t,e,i,n,o){var r;void 0===r&&(r=!1);var s=new fi(vi);s.point1X=e,s.point1Y=i,s.endX=n,s.endY=o,r&&s.close(),t.ic.segments.add(s)}function Nu(t,e,i,n,o,r,s,a){var h;void 0===h&&(h=!1),e=new fi(bi,s,a,e,i,n,o,r),h&&e.close(),t.ic.segments.add(e)}function Cu(t){var e=Tu;return null!==e?(Tu=null,e.reset(t),e):(e=new wu,e.reset(t),e)}cu.className="Picture",gu=new _,cu.clearCache=fu,vu.className="PictureCacheArray",bu.className="PictureCacheInstance",wu.prototype.reset=function(t){null!==t?(t.ea(),this.Kt=t,t.figures.clear()):this.Kt=new We,this.ic=null},wu.prototype.Ym=function(t){this.ic.isShadowed=t},wu.prototype.moveTo=function(t,e,i){void 0===i&&(i=!1);var n=new fi(gi);n.endX=t,n.endY=e,i&&n.close(),this.ic.segments.add(n)},wu.prototype.lineTo=function(t,e,i){void 0===i&&(i=!1);var n=new fi(yi);n.endX=t,n.endY=e,i&&n.close(),this.ic.segments.add(n)},wu.prototype.arcTo=function(t,e,i,n,o,r,s){void 0===r&&(r=0),void 0===s&&(s=!1);var a=new fi(xi);a.startAngle=t,a.sweepAngle=e,a.centerX=i,a.centerY=n,a.radiusX=o,a.radiusY=0!==r?r:o,s&&a.close(),this.ic.segments.add(a)};var Tu=null;function Au(t,e){var i=t.toLowerCase(),n=_e.Qe;n[t]=e,n[i]=t}function Lu(t){Uh.call(this,t),this.D=2408959,this.ih=this.Nf="",this.Gp=this.Cp=this.Rp=this.Ho=null,this.Tp="",this.Lf=this.so=this.Sp=this.sh=null,this.Ep="",this.Dp=Tt,this.Ub=this.Hp="",this.Fi=this.An=this.mi=null,this.dg=new pt(NaN,NaN).freeze(),this.Oo="",this.cf=null,this.Po=ne,this.Ip=Ce,this.Yo=Lt,this.Qo=jt,this.Sn=null,this.Io=127,this.Xp=Ot,this.Wp="gray",this.ug=4,this.zx=-1,this.tq=NaN,this.ez=new zt,this.Xj=null,this.kh=NaN}function ju(t){0!==(16384&t.D)!==!1&&(t.updateAdornments(),t.D&=-16385)}function Ou(t,e){e.toolManager.mouseDownTools.each((function(e){e.isEnabled&&e.updateAdornments(t)})),e.toolManager.updateAdornments(t)}function Du(t){if(!1===Yu(t)){Xu(t,!0),t.Fl();var e=t.diagram;null!==e&&(e.wd.add(t),e.Db())}}function Fu(t){if(t.D|=2097152,!1!==Yu(t)){var e=t.position,i=t.location;i.s()&&e.s()||Eu(t,e,i),i=t.xb;var n=zt.alloc().assign(i);i.ea(),i.x=e.x,i.y=e.y,i.freeze(),t.Im(n,i),zt.free(n),Xu(t,!1)}}function Bu(t,e){var i=t.ez;isNaN(t.kh)&&(t.kh=il(t));var n=t.kh,o=2*n;if(!t.isShadowed)return i.h(e.x-1-n,e.y-1-n,e.width+2+o,e.height+2+o),i;n=e.x,o=e.y;var r=e.width;e=e.height;var s=t.shadowBlur;return t=t.shadowOffset,r+=s,e+=s,n-=s/2,o-=s/2,0<t.x?r+=t.x:(n+=t.x,r-=t.x),0<t.y?e+=t.y:(o+=t.y,e-=t.y),i.h(n-1,o-1,r+2,e+2),i}function Iu(t,e,i,n){null===e||t instanceof Qu||(e=e.animationManager,e.ef&&po(e,t,n.copy(),i.copy()))}function Eu(t,e,i){var n=pt.alloc(),o=t.locationSpot,r=t.locationObject;o.nc()&&w("determineOffset: Part's locationSpot must be real: "+o.toString());var s=r.naturalBounds,a=r instanceof Nl?r.strokeWidth:0;if(n.Uk(0,0,s.width+a,s.height+a,o),r!==t)for(n.offset(-a/2,-a/2),r.transform.ta(n),o=r.panel;null!==o&&o!==t;)o.transform.ta(n),o=o.panel;t.cg.ta(n),n.offset(-t.qc.x,-t.qc.y),o=t.diagram,r=i.s(),s=e.s(),r&&s?0!==(2097152&t.D)?Ru(t,e,i,o,n):zu(t,e,i,o,n):r?Ru(t,e,i,o,n):s&&zu(t,e,i,o,n),t.D|=2097152,pt.free(n),t.Fl()}function Ru(t,e,i,n,o){var r=e.x,s=e.y;e.h(i.x-o.x,i.y-o.y),null!==n&&(i=n.animationManager,(n=i.defaultAnimation.isAnimating)||!i.ef||t instanceof Qu||po(i,t,new pt(r,s),e),n||e.x===r&&e.y===s||t.g("position",new pt(r,s),e.copy()))}function zu(t,e,i,n,o){var r=i.copy();i.h(e.x+o.x,e.y+o.y),i.w(r)||null===n||t.g("location",r,i.copy())}function Vu(t,e,i){qu(t,!1),t instanceof ec&&hs(i,t),t.layer.isTemporary||e||i.Na(),e=t.xb;var n=i.viewportBounds;n.s()?Uu(t)?(Kt(e,n)||t.Nd(!1),t.updateAdornments()):e.Mc(n)?(t.Nd(!0),t.updateAdornments()):t.Lb():i.xi=!0}function Gu(t,e,i,n){e.constructor===t.constructor||Zu||(Zu=!0,S('Should not change the class of the Part when changing category from "'+i+'" to "'+n+'"'),S("  Old class: "+D(t.constructor)+", new class: "+D(e.constructor)+", part: "+t.toString())),t.nk();var o=t.data;i=t.layerName;var r=t.isSelected,s=t.isHighlighted,a=!0,h=!0,l=!1;t instanceof ec&&(a=t.isTreeLeaf,h=t.isTreeExpanded,l=t.wasTreeExpanded),e.yf(t),e.cloneProtected(t),t.Nf=n,t.o(),t.M(),e=t.diagram,n=!0,null!==e&&(n=e.skipsUndoManager,e.skipsUndoManager=!0),t.ob=o,t.D=r?4096|t.D:-4097&t.D,t.D=s?524288|t.D:-524289&t.D,t instanceof ec&&(t.P=a?4|t.P:-5&t.P,t.P=h?1|t.P:-2&t.P,t.P=l?2|t.P:-3&t.P),null!==o&&t.Da(),o=t.layerName,o!==i&&(t.ih=i,t.layerName=o),null!==e&&(e.skipsUndoManager=n),t.Nc()&&t.B(64)}function Yu(t){return 0!==(32768&t.D)}function Xu(t,e){t.D=e?32768|t.D:-32769&t.D}function qu(t,e){t.D=e?65536|t.D:-65537&t.D}function Uu(t){return 0!==(131072&t.D)}function Ku(t,e){t.D=e?1048576|t.D:-1048577&t.D}function Hu(t,e){var i=e.containingGroup;return null!==i?1+Hu(t,i):e instanceof ec&&(e=e.labeledLink,null!==e)?Hu(t,e):0}function _u(t,e){var i=e.containingGroup;return null!==i||e instanceof ec&&(i=e.labeledLink,null!==i)?_u(t,i):e}function Wu(t,e,i){if(e===i||null===i)return!1;var n=e.containingGroup;return!(null===n||n!==i&&!Wu(t,n,i))||e instanceof ec&&(e=e.labeledLink,null!==e)&&Wu(t,e,i)}function $u(t){return!!t.isVisible()&&(t=t.layer,null===t||!t.isTemporary)}function Ju(t,e,i,n,o,r){if(void 0===r&&(r=null),!(t.contains(e)||null!==r&&!r(e)||e instanceof Qu))if(t.add(e),e instanceof ec){if(i&&e instanceof bc)for(var s=e.memberParts;s.next();)Ju(t,s.value,i,n,o,r);if(!1!==o)for(s=e.linksConnected;s.next();){var a=s.value;if(!t.contains(a)){var h=a.fromNode,l=a.toNode;h=null===h||t.contains(h),l=null===l||t.contains(l),(o?h&&l:h||l)&&Ju(t,a,i,n,o,r)}}if(1<n)for(e=e.Wv();e.next();)Ju(t,e.value,i,n-1,o,r)}else if(e instanceof Nc)for(e=e.labelNodes;e.next();)Ju(t,e.value,i,n,o,r)}wu.className="StreamGeometryContext",Au("Rectangle",(function(t,e,i){t="r"+e+","+i;var n=_e.Uh[t];return void 0!==n||(n=new We(ai),n.endX=e,n.endY=i,50>_e.Vh&&(_e.Uh[t]=n,_e.Vh++)),n})),Au("Square",(function(t,e,i){t="s"+e+","+i;var n=_e.Uh[t];return void 0!==n||(n=new We(ai),n.endX=e,n.endY=i,n.defaultStretch=Us,50>_e.Vh&&(_e.Uh[t]=n,_e.Vh++)),n})),Au("RoundedRectangle",(function(t,e,i){var n=t?t.parameter1:NaN;return(isNaN(n)||0>n)&&(n=5),n=Math.min(n,e/3),n=Math.min(n,i/3),t=n*_e.Kg,e=(new We).add(new ci(n,0,!0).add(new fi(yi,e-n,0)).add(new fi(mi,e,n,e-t,0,e,t)).add(new fi(yi,e,i-n)).add(new fi(mi,e-n,i,e,i-t,e-t,i)).add(new fi(yi,n,i)).add(new fi(mi,0,i-n,t,i,0,i-t)).add(new fi(yi,0,n)).add(new fi(mi,n,0,0,t,t,0).close())),1<t&&(e.spot1=new Ge(0,0,t,t),e.spot2=new Ge(1,1,-t,-t)),e})),Au("Border","RoundedRectangle"),Au("Ellipse",(function(t,e,i){t="e"+e+","+i;var n=_e.Uh[t];return void 0!==n||(n=new We(hi),n.endX=e,n.endY=i,n.spot1=Ie,n.spot2=Ee,50>_e.Vh&&(_e.Uh[t]=n,_e.Vh++)),n})),Au("Circle",(function(t,e,i){t="c"+e+","+i;var n=_e.Uh[t];return void 0!==n||(n=new We(hi),n.endX=e,n.endY=i,n.spot1=Ie,n.spot2=Ee,n.defaultStretch=Us,50>_e.Vh&&(_e.Uh[t]=n,_e.Vh++)),n})),Au("TriangleRight",(function(t,e,i){return(new We).add(new ci(0,0).add(new fi(yi,e,.5*i)).add(new fi(yi,0,i).close())).Zm(0,.25,.5,.75)})),Au("TriangleDown",(function(t,e,i){return(new We).add(new ci(0,0).add(new fi(yi,e,0)).add(new fi(yi,.5*e,i).close())).Zm(.25,0,.75,.5)})),Au("TriangleLeft",(function(t,e,i){return(new We).add(new ci(e,i).add(new fi(yi,0,.5*i)).add(new fi(yi,e,0).close())).Zm(.5,.25,1,.75)})),Au("TriangleUp",(function(t,e,i){return(new We).add(new ci(e,i).add(new fi(yi,0,i)).add(new fi(yi,.5*e,0).close())).Zm(.25,.5,.75,1)})),Au("Triangle","TriangleUp"),Au("Diamond",(function(t,e,i){return(new We).add(new ci(.5*e,0).add(new fi(yi,0,.5*i)).add(new fi(yi,.5*e,i)).add(new fi(yi,e,.5*i).close())).Zm(.25,.25,.75,.75)})),Au("LineH",(function(t,e,i){return t=new We(si),t.startX=0,t.startY=i/2,t.endX=e,t.endY=i/2,t})),Au("LineV",(function(t,e,i){return t=new We(si),t.startX=e/2,t.startY=0,t.endX=e/2,t.endY=i,t})),Au("None","Rectangle"),Au("BarH","Rectangle"),Au("BarV","Rectangle"),Au("MinusLine","LineH"),Au("PlusLine",(function(t,e,i){return(new We).add(new ci(0,i/2,!1).add(new fi(yi,e,i/2)).add(new fi(gi,e/2,0)).add(new fi(yi,e/2,i)))})),Au("XLine",(function(t,e,i){return(new We).add(new ci(0,i,!1).add(new fi(yi,e,0)).add(new fi(gi,0,0)).add(new fi(yi,e,i)))})),_e.dn={"":"",Standard:"F1 m 0,0 l 8,4 -8,4 2,-4 z",Backward:"F1 m 8,0 l -2,4 2,4 -8,-4 z",Triangle:"F1 m 0,0 l 8,4.62 -8,4.62 z",BackwardTriangle:"F1 m 8,4 l 0,4 -8,-4 8,-4 0,4 z",Boomerang:"F1 m 0,0 l 8,4 -8,4 4,-4 -4,-4 z",BackwardBoomerang:"F1 m 8,0 l -8,4 8,4 -4,-4 4,-4 z",SidewaysV:"m 0,0 l 8,4 -8,4 0,-1 6,-3 -6,-3 0,-1 z",BackwardV:"m 8,0 l -8,4 8,4 0,-1 -6,-3 6,-3 0,-1 z",OpenTriangle:"m 0,0 l 8,4 -8,4",BackwardOpenTriangle:"m 8,0 l -8,4 8,4",OpenTriangleLine:"m 0,0 l 8,4 -8,4 m 8.5,0 l 0,-8",BackwardOpenTriangleLine:"m 8,0 l  -8,4 8,4 m -8.5,0 l 0,-8",OpenTriangleTop:"m 0,0 l 8,4 m 0,4",BackwardOpenTriangleTop:"m 8,0 l -8,4 m 0,4",OpenTriangleBottom:"m 0,8 l 8,-4",BackwardOpenTriangleBottom:"m 0,4 l 8,4",HalfTriangleTop:"F1 m 0,0 l 0,4 8,0 z m 0,8",BackwardHalfTriangleTop:"F1 m 8,0 l 0,4 -8,0 z m 0,8",HalfTriangleBottom:"F1 m 0,4 l 0,4 8,-4 z",BackwardHalfTriangleBottom:"F1 m 8,4 l 0,4 -8,-4 z",ForwardSemiCircle:"m 4,0 b 270 180 0 4 4",BackwardSemiCircle:"m 4,8 b 90 180 0 -4 4",Feather:"m 0,0 l 3,4 -3,4",BackwardFeather:"m 3,0 l -3,4 3,4",DoubleFeathers:"m 0,0 l 3,4 -3,4 m 3,-8 l 3,4 -3,4",BackwardDoubleFeathers:"m 3,0 l -3,4 3,4 m 3,-8 l -3,4 3,4",TripleFeathers:"m 0,0 l 3,4 -3,4 m 3,-8 l 3,4 -3,4 m 3,-8 l 3,4 -3,4",BackwardTripleFeathers:"m 3,0 l -3,4 3,4 m 3,-8 l -3,4 3,4 m 3,-8 l -3,4 3,4",ForwardSlash:"m 0,8 l 5,-8",BackSlash:"m 0,0 l 5,8",DoubleForwardSlash:"m 0,8 l 4,-8 m -2,8 l 4,-8",DoubleBackSlash:"m 0,0 l 4,8 m -2,-8 l 4,8",TripleForwardSlash:"m 0,8 l 4,-8 m -2,8 l 4,-8 m -2,8 l 4,-8",TripleBackSlash:"m 0,0 l 4,8 m -2,-8 l 4,8 m -2,-8 l 4,8",Fork:"m 0,4 l 8,0 m -8,0 l 8,-4 m -8,4 l 8,4",BackwardFork:"m 8,4 l -8,0 m 8,0 l -8,-4 m 8,4 l -8,4",LineFork:"m 0,0 l 0,8 m 0,-4 l 8,0 m -8,0 l 8,-4 m -8,4 l 8,4",BackwardLineFork:"m 8,4 l -8,0 m 8,0 l -8,-4 m 8,4 l -8,4 m 8,-8 l 0,8",CircleFork:"F1 m 6,4 b 0 360 -3 0 3 z m 0,0 l 6,0 m -6,0 l 6,-4 m -6,4 l 6,4",BackwardCircleFork:"F1 m 0,4 l 6,0 m -6,-4 l 6,4 m -6,4 l 6,-4 m 6,0 b 0 360 -3 0 3",CircleLineFork:"F1 m 6,4 b 0 360 -3 0 3 z m 1,-4 l 0,8 m 0,-4 l 6,0 m -6,0 l 6,-4 m -6,4 l 6,4",BackwardCircleLineFork:"F1 m 0,4 l 6,0 m -6,-4 l 6,4 m -6,4 l 6,-4 m 0,-4 l 0,8 m 7,-4 b 0 360 -3 0 3",Circle:"F1 m 8,4 b 0 360 -4 0 4 z",Block:"F1 m 0,0 l 0,8 8,0 0,-8 z",StretchedDiamond:"F1 m 0,3 l 5,-3 5,3 -5,3 -5,-3 z",Diamond:"F1 m 0,4 l 4,-4 4,4 -4,4 -4,-4 z",Chevron:"F1 m 0,0 l 5,0 3,4 -3,4 -5,0 3,-4 -3,-4 z",StretchedChevron:"F1 m 0,0 l 8,0 3,4 -3,4 -8,0 3,-4 -3,-4 z",NormalArrow:"F1 m 0,2 l 4,0 0,-2 4,4 -4,4 0,-2 -4,0 z",X:"m 0,0 l 8,8 m 0,-8 l -8,8",TailedNormalArrow:"F1 m 0,0 l 2,0 1,2 3,0 0,-2 2,4 -2,4 0,-2 -3,0 -1,2 -2,0 1,-4 -1,-4 z",DoubleTriangle:"F1 m 0,0 l 4,4 -4,4 0,-8 z  m 4,0 l 4,4 -4,4 0,-8 z",BigEndArrow:"F1 m 0,0 l 5,2 0,-2 3,4 -3,4 0,-2 -5,2 0,-8 z",ConcaveTailArrow:"F1 m 0,2 h 4 v -2 l 4,4 -4,4 v -2 h -4 l 2,-2 -2,-2 z",RoundedTriangle:"F1 m 0,1 a 1,1 0 0 1 1,-1 l 7,3 a 0.5,1 0 0 1 0,2 l -7,3 a 1,1 0 0 1 -1,-1 l 0,-6 z",SimpleArrow:"F1 m 1,2 l -1,-2 2,0 1,2 -1,2 -2,0 1,-2 5,0 0,-2 2,2 -2,2 0,-2 z",AccelerationArrow:"F1 m 0,0 l 0,8 0.2,0 0,-8 -0.2,0 z m 2,0 l 0,8 1,0 0,-8 -1,0 z m 3,0 l 2,0 2,4 -2,4 -2,0 0,-8 z",BoxArrow:"F1 m 0,0 l 4,0 0,2 2,0 0,-2 2,4 -2,4 0,-2 -2,0 0,2 -4,0 0,-8 z",TriangleLine:"F1 m 8,4 l -8,-4 0,8 8,-4 z m 0.5,4 l 0,-8",CircleEndedArrow:"F1 m 10,4 l -2,-3 0,2 -2,0 0,2 2,0 0,2 2,-3 z m -4,0 b 0 360 -3 0 3 z",DynamicWidthArrow:"F1 m 0,3 l 2,0 2,-1 2,-2 2,4 -2,4 -2,-2 -2,-1 -2,0 0,-2 z",EquilibriumArrow:"m 0,3 l 8,0 -3,-3 m 3,5 l -8,0 3,3",FastForward:"F1 m 0,0 l 3.5,4 0,-4 3.5,4 0,-4 1,0 0,8 -1,0 0,-4 -3.5,4 0,-4 -3.5,4 0,-8 z",Kite:"F1 m 0,4 l 2,-4 6,4 -6,4 -2,-4 z",HalfArrowTop:"F1 m 0,0 l 4,4 4,0 -8,-4 z m 0,8",HalfArrowBottom:"F1 m 0,8 l 4,-4 4,0 -8,4 z",OpposingDirectionDoubleArrow:"F1 m 0,4 l 2,-4 0,2 4,0 0,-2 2,4 -2,4 0,-2 -4,0 0,2 -2,-4 z",PartialDoubleTriangle:"F1 m 0,0 4,3 0,-3 4,4 -4,4 0,-3 -4,3 0,-8 z",LineCircle:"F1 m 0,0 l 0,8 m 7 -4 b 0 360 -3 0 3 z",DoubleLineCircle:"F1 m 0,0 l 0,8 m 2,-8 l 0,8 m 7 -4 b 0 360 -3 0 3 z",TripleLineCircle:"F1 m 0,0 l 0,8 m 2,-8 l 0,8 m 2,-8 l 0,8 m 7 -4 b 0 360 -3 0 3 z",CircleLine:"F1 m 6 4 b 0 360 -3 0 3 z m 1,-4 l 0,8",DiamondCircle:"F1 m 8,4 l -4,4 -4,-4 4,-4 4,4 m 8,0 b 0 360 -4 0 4 z",PlusCircle:"F1 m 8,4 b 0 360 -4 0 4 l -8 0 z m -4 -4 l 0 8",OpenRightTriangleTop:"m 8,0 l 0,4 -8,0 m 0,4",OpenRightTriangleBottom:"m 8,8 l 0,-4 -8,0",Line:"m 0,0 l 0,8",DoubleLine:"m 0,0 l 0,8 m 2,0 l 0,-8",TripleLine:"m 0,0 l 0,8 m 2,0 l 0,-8 m 2,0 l 0,8",PentagonArrow:"F1 m 8,4 l -4,-4 -4,0 0,8 4,0 4,-4 z"},f(Lu,Uh),Lu.prototype.cloneProtected=function(t){Uh.prototype.cloneProtected.call(this,t),t.D=-4097&this.D|49152,t.Nf=this.Nf,t.ih=this.ih,t.Ho=this.Ho,t.Rp=this.Rp,t.Cp=this.Cp,t.Gp=this.Gp,t.Tp=this.Tp,t.Sp=this.Sp,t.so=this.so,t.Lf=null,t.Ep=this.Ep,t.Dp=this.Dp.H(),t.Hp=this.Hp,t.Ip=this.Ip.H(),t.Ub=this.Ub,t.An=this.An,t.dg.assign(this.dg),t.Oo=this.Oo,t.Po=this.Po.H(),t.Yo=this.Yo.H(),t.Qo=this.Qo.H(),t.Sn=this.Sn,t.Io=this.Io,t.Xp=this.Xp.H(),t.Wp=this.Wp,t.ug=this.ug,t.tq=this.tq},Lu.prototype.yf=function(t){Uh.prototype.yf.call(this,t),t.Oh(),t.sh=null,t.cf=null,t.Xj=null},Lu.prototype.toString=function(){var t=D(this.constructor)+"#"+st(this);return null!==this.data&&(t+="("+F(this.data)+")"),t},Lu.prototype.Sk=function(t,e,i,n,o,r,s){var a=this.diagram;null!==a&&(t===Ni&&"elements"===e?o instanceof Uh?Jh(o,(function(t){Md(a.partManager,t),Hr(a,t)})):_r(a,o):t===Ci&&"elements"===e&&(o instanceof Uh?Jh(o,(function(t){Sd(a.partManager,t,a)})):Wr(a,o)),a.Va(t,e,i,n,o,r,s))},Lu.prototype.Da=function(t){if(Uh.prototype.Da.call(this,t),null!==this.data){for(var e=this.W.j,i=e.length,n=0;n<i;n++){var o=e[n];o instanceof Uh&&Jh(o,(function(t){null!==t.data&&t.Da()}))}for(e=this.adornments;e.next();)e.value.Da(t)}},Lu.prototype.updateRelationshipsFromData=function(){null!==this.data&&this.diagram.partManager.updateRelationshipsFromData(this)},Lu.prototype.wk=function(t){var e=this.Lf;return null===e?null:e.G(t)},Lu.prototype.Gh=function(t,e){if(null!==e){var i=null,n=this.Lf;if(null!==n&&(i=n.G(t)),i!==e){if(null!==i){var o=i.diagram;null!==o&&o.remove(i)}null===n&&(this.Lf=n=new dt),e.Nf!==t&&(e.category=t),n.add(t,e),t=this.diagram,null!==t&&(t.add(e),t=e.adornedObject,null!==t&&(t=t.ij(),null!==t&&(e.data=t.data)))}}},Lu.prototype.Hf=function(t){var e=this.Lf;if(null!==e){var i=e.G(t);if(null!==i){var n=i.diagram;null!==n&&n.remove(i)}e.remove(t),0===e.count&&(this.Lf=null)}},Lu.prototype.nk=function(){var t=this.Lf;if(null!==t){var e=j();for(t=t.iterator;t.next();)e.push(t.key);t=e.length;for(var i=0;i<t;i++)this.Hf(e[i]);O(e)}},Lu.prototype.updateAdornments=function(){var t=this.diagram;if(null!==t){for(var e=this.adornments;e.next();){var i=e.value;i.o(),i.placeholder&&i.placeholder.o()}t:{if(this.isSelected&&this.selectionAdorned&&(e=this.selectionObject,null!==e&&this.actualBounds.s()&&this.isVisible()&&e.Gf()&&e.actualBounds.s())){if(i=this.wk("Selection"),null===i){if(i=this.selectionAdornmentTemplate,null===i&&(i=this.Ph()?t.linkSelectionAdornmentTemplate:this instanceof bc?t.groupSelectionAdornmentTemplate:t.nodeSelectionAdornmentTemplate),!(i instanceof Qu))break t;ul(i),i=i.copy(),null!==i&&(this.Ph()&&this.selectionObject===this.path&&(i.type=Uh.Link),i.adornedObject=e)}if(null!==i){i.type===Uh.Link&&i.o(),this.Gh("Selection",i);break t}}this.Hf("Selection")}for(Ou(this,t),e=this.adornments;e.next();)e.value.Da()}},Lu.prototype.Lb=function(){var t=this.diagram;null!==t&&(Lr(t),0!==(16384&this.D)!==!0&&(this.D|=16384,t.Db()))},Lu.prototype.move=function(t,e){!0===e?this.location=t:this.position=t},Lu.prototype.moveTo=function(t,e,i){t=pt.allocAt(t,e),this.move(t,i),pt.free(t)},Lu.prototype.isVisible=function(){if(!this.visible)return!1;var t=this.layer;if(null!==t){if(!t.visible)return!1;if(t=t.diagram,null!==t&&t.animationManager.cu(this))return!0}return t=this.containingGroup,!!(null===t||t.isSubGraphExpanded&&t.isVisible())},i=Lu.prototype,i.Ob=function(t){var e=this.diagram;t?(this.B(4),this.Lb(),null!==e&&e.wd.add(this)):(this.B(8),this.nk()),this.Oh(),null!==e&&(e.Na(),e.M())},i.bb=function(t){if(this.name===t)return this;var e=this.Xj;if(null===e&&(this.Xj=e=new dt),null!==e.G(t))return e.G(t);var i=Uh.prototype.bb.call(this,t);return null!==i?(e.set(t,i),i):(e.set(t,null),null)},i.Df=function(t,e,i){void 0===i&&(i=new pt),e=e.nc()?ae:e;var n=t.naturalBounds;if(i.h(n.width*e.x+e.offsetX,n.height*e.y+e.offsetY),null===t||t===this)return i;for(t.transform.ta(i),t=t.panel;null!==t&&t!==this;)t.transform.ta(i),t=t.panel;return this.cg.ta(i),i.offset(-this.qc.x,-this.qc.y),i},i.mj=function(t){return void 0===t&&(t=new zt),t.assign(this.actualBounds)},i.Ta=function(){!0===La(this)&&this.measure(1/0,1/0),this.arrange()},Lu.prototype.arrange=function(){if(!1===Oa(this))Fu(this);else{Da(this,!1);var t=this.xb,e=zt.alloc();e.assign(t);var i=Uu(this);this.Ih(0,0,this.qc.width,this.qc.height);var n=this.position;Eu(this,n,this.location),t.ea(),t.x=n.x,t.y=n.y,t.freeze(),this.Im(e,t),e.w(t)?this.Nd(i):!this.Nc()||_e.A(e.width,t.width)&&_e.A(e.height,t.height)||0<=this.zx&&this.B(16),zt.free(e),Xu(this,!1)}},i=Lu.prototype,i.Im=function(t,e){var i=this.diagram;if(null!==i){var n=!1;if(!1===i.vi&&t.s()){var o=zt.alloc();o.assign(i.documentBounds),o.Jw(i.padding),t.x>o.x&&t.y>o.y&&t.right<o.right&&t.bottom<o.bottom&&e.x>o.x&&e.y>o.y&&e.right<o.right&&e.bottom<o.bottom&&(n=!0),zt.free(o)}0!==(65536&this.D)!==!0&&t.w(e)||Vu(this,n,i),i.M(),!t.s()&&!e.s()||Xt(t,e)||(this instanceof ec&&!i.undoManager.isUndoingRedoing&&this.sd(),this.Oh())}},i.Ew=function(t,e){if(this.Ph()||!t.s())return!1;var i=this.diagram;null!==i&&Iu(this,i,t,e),this.la=t,this.D&=-2097153;var n=this.dg;return!n.s()||null!==i&&!i.animationManager.isTicking&&i.undoManager.isUndoingRedoing||(i=n.copy(),n.h(n.x+(t.x-e.x),n.y+(t.y-e.y)),this.g("location",i,n.copy())),!1===Yu(this)&&!1===Oa(this)&&(Du(this),Fu(this)),!0},i.er=function(t,e,i){var n=this.dg,o=this.la;if(i){if(n.x===t&&n.y===e)return;Yu(this)||Oa(this)?o.h(NaN,NaN):o.h(o.x+t-n.x,o.y+e-n.y),n.h(t,e)}else{if(o.x===t&&o.y===e)return;Yu(this)||Oa(this)?this.lu():n.h(n.x+t-o.x,n.y+e-o.y),o.h(t,e)}Du(this)},i.lu=function(){this.D&=-2097153,Du(this)},i.rj=function(){return!0},i.Nc=function(){return!0},i.Ph=function(){return!1},i.Ff=function(){return!0},Lu.prototype.canCopy=function(){if(!this.copyable)return!1;var t=this.layer;return null===t||!!t.allowCopy&&(t=t.diagram,null===t||!!t.allowCopy)},Lu.prototype.canDelete=function(){if(!this.deletable)return!1;var t=this.layer;return null===t||!!t.allowDelete&&(t=t.diagram,null===t||!!t.allowDelete)},Lu.prototype.canEdit=function(){if(!this.textEditable)return!1;var t=this.layer;return null===t||!!t.allowTextEdit&&(t=t.diagram,null===t||!!t.allowTextEdit)},Lu.prototype.canGroup=function(){if(!this.groupable)return!1;var t=this.layer;return null===t||!!t.allowGroup&&(t=t.diagram,null===t||!!t.allowGroup)},Lu.prototype.canMove=function(){if(!this.movable)return!1;var t=this.layer;return null===t||!!t.allowMove&&(t=t.diagram,null===t||!!t.allowMove)},Lu.prototype.canReshape=function(){if(!this.reshapable)return!1;var t=this.layer;return null===t||!!t.allowReshape&&(t=t.diagram,null===t||!!t.allowReshape)},Lu.prototype.canResize=function(){if(!this.resizable)return!1;var t=this.layer;return null===t||!!t.allowResize&&(t=t.diagram,null===t||!!t.allowResize)},Lu.prototype.canRotate=function(){if(!this.rotatable)return!1;var t=this.layer;return null===t||!!t.allowRotate&&(t=t.diagram,null===t||!!t.allowRotate)},Lu.prototype.canSelect=function(){if(!this.selectable)return!1;var t=this.layer;return null===t||!!t.allowSelect&&(t=t.diagram,null===t||!!t.allowSelect)},i=Lu.prototype,i.Nd=function(t){this.D=t?131072|this.D:-131073&this.D},i.Oh=function(){var t=this.containingGroup;null!==t&&(t.o(),null!==t.placeholder&&t.placeholder.o(),t.sd())},i.M=function(){var t=this.diagram;null!==t&&!Oa(this)&&!Yu(this)&&this.isVisible()&&this.xb.s()&&t.M(Bu(this,this.xb))},i.o=function(){Uh.prototype.o.call(this);var t=this.diagram;null!==t&&(t.wd.add(this),this instanceof ec&&null!==this.labeledLink&&wa(this.labeledLink),t.Db(!0))},i.Mq=function(t){t||(t=this.mi,null!==t&&wc(t,this))},i.Nq=function(t){t||(t=this.mi,null!==t&&kc(t,this))},i.uk=function(){var t=this.data;if(null!==t){var e=this.diagram;null!==e&&(e=e.model,null!==e&&e.Nm(t))}},i.bA=function(){return Hu(this,this)},i.eA=function(){return _u(this,this)},i.Kd=function(t){return t instanceof bc&&Wu(this,this,t)},i.oy=function(t){if(null===t)return null;if(this===t)return this.containingGroup;for(var e=this;null!==e;){if(e instanceof bc&&Ku(e,!0),e instanceof ec){var i=e.labeledLink;null!==i&&(e=i)}e=e.containingGroup}for(i=null,e=t;null!==e;){if(0!==(1048576&e.D)){i=e;break}e instanceof ec&&(t=e.labeledLink,null!==t&&(e=t)),e=e.containingGroup}for(e=this;null!==e;)e instanceof bc&&Ku(e,!1),e instanceof ec&&(t=e.labeledLink,null!==t&&(e=t)),e=e.containingGroup;return i},Lu.prototype.canLayout=function(){if(!this.isLayoutPositioned||!this.isVisible())return!1;var t=this.layer;return!(null!==t&&t.isTemporary||this instanceof ec&&this.isLinkLabel)},Lu.prototype.B=function(t){if(void 0===t&&(t=16777215),this.isLayoutPositioned&&0!==(t&this.layoutConditions)){var e=this.layer;null!==e&&e.isTemporary||this instanceof ec&&this.isLinkLabel?e=!1:(e=this.diagram,e=null===e||!e.undoManager.isUndoingRedoing)}else e=!1;if(e)if(e=this.mi,null!==e){var i=e.layout;null!==i?i.B():e.B(t)}else t=this.diagram,null!==t&&(t=t.layout,null!==t&&t.B())},d.Object.defineProperties(Lu.prototype,{key:{get:function(){var t=this.diagram;if(null!==t)return t.model.ja(this.data)}},adornments:{get:function(){return null===this.Lf?J:this.Lf.iteratorValues}},layer:{get:function(){return this.Fi}},diagram:{get:function(){var t=this.Fi;return null!==t?t.diagram:null}},layerName:{get:function(){return this.ih},set:function(t){var e=this.ih;if(e!==t){var i=this.diagram;if((null===i||null!==i.xk(t)&&!i.partManager.addsToTemporaryLayer)&&(this.ih=t,null!==i&&i.Na(),this.g("layerName",e,t),e=this.layer,null!==e&&e.name!==t&&(i=e.diagram,null!==i&&(t=i.xk(t),null!==t&&t!==e)))){var n=e.Lc(-1,this,!0);if(0<=n&&i.Va(Ci,"parts",e,this,null,n,!0),n=t.oj(99999999,this,!0),e.visible!==t.visible&&this.Ob(t.visible),0<=n&&i.Va(Ni,"parts",t,null,this,!0,n),n=this.layerChanged,null!==n){var o=i.Z;i.Z=!0,n(this,e,t),i.Z=o}}}}},layerChanged:{get:function(){return this.Ho},set:function(t){var e=this.Ho;e!==t&&(this.Ho=t,this.g("layerChanged",e,t))}},zOrder:{get:function(){return this.tq},set:function(t){var e=this.tq;if(e!==t){this.tq=t;var i=this.layer;null!==i&&qo(i,-1,this),this.g("zOrder",e,t),t=this.diagram,null!==t&&t.M()}}},locationObject:{get:function(){if(null===this.cf){var t=this.locationObjectName;""!==t?(t=this.bb(t),this.cf=null!==t?t:this):this instanceof Qu&&this.type!==Uh.Link&&null!==this.placeholder?this.cf=this.placeholder:this.cf=this}return this.cf.visible?this.cf:this}},minLocation:{get:function(){return this.Yo},set:function(t){var e=this.Yo;e.w(t)||(this.Yo=t=t.H(),this.g("minLocation",e,t))}},maxLocation:{get:function(){return this.Qo},set:function(t){var e=this.Qo;e.w(t)||(this.Qo=t=t.H(),this.g("maxLocation",e,t))}},locationObjectName:{get:function(){return this.Oo},set:function(t){var e=this.Oo;e!==t&&(this.Oo=t,this.cf=null,this.o(),this.g("locationObjectName",e,t))}},locationSpot:{get:function(){return this.Po},set:function(t){var e=this.Po;e.w(t)||(this.Po=t=t.H(),this.o(),this.g("locationSpot",e,t))}},location:{get:function(){return this.dg},set:function(t){var e=t.x,i=t.y,n=this.dg,o=n.x,r=n.y;(o===e||isNaN(o)&&isNaN(e))&&(r===i||isNaN(r)&&isNaN(i))||(t=t.copy(),e=t,this.Ph()?e=!1:(this.dg=e,this.D|=2097152,!1===Oa(this)&&(Du(this),i=this.la,i.s()&&(o=this.diagram,null===o||o.animationManager.isTicking||!o.undoManager.isUndoingRedoing))&&(r=i.copy(),i.h(i.x+(e.x-n.x),i.y+(e.y-n.y)),Iu(this,o,i,r),this.g("position",r,i.copy())),e=!0),e&&this.g("location",n.copy(),t.copy()))}},category:{get:function(){return this.Nf},set:function(t){var e=this.Nf;if(e!==t){var i=this.diagram,n=this.data,o=null;if(null!==i&&null!==n&&!(this instanceof Qu)){var r=i.model.undoManager;r.isEnabled&&!r.isUndoingRedoing&&(o=this.clone(),o.W.addAll(this.W))}this.Nf=t,this.g("category",e,t),null===i||null===n||this instanceof Qu?this instanceof Qu&&(o=this.adornedPart,null!==o&&(t=o.Lf,null!==t&&t.remove(e),o.Gh(this.category,this))):(r=i.model,r.undoManager.isUndoingRedoing||(this.Ph()?(i.partManager.setLinkCategoryForData(n,t),i=i.partManager.findLinkTemplateForCategory(t),null!==i&&(ul(i),i=i.copy(),null!==i&&Gu(this,i,e,t))):(null!==r&&r.Um(n,t),i=bd(i.partManager,n,t),null!==i&&(ul(i),i=i.copy(),null===i||i instanceof Nc||(n=this.location.copy(),Gu(this,i,e,t),this.location.s()||(this.location=n)))),null!==o&&(e=this.clone(),e.W.addAll(this.W),this.g("self",o,e))))}}},self:{get:function(){return this},set:function(t){Gu(this,t,this.category,t.category)}},copyable:{get:function(){return 0!==(1&this.D)},set:function(t){var e=0!==(1&this.D);e!==t&&(this.D^=1,this.g("copyable",e,t))}},deletable:{get:function(){return 0!==(2&this.D)},set:function(t){var e=0!==(2&this.D);e!==t&&(this.D^=2,this.g("deletable",e,t))}},textEditable:{get:function(){return 0!==(4&this.D)},set:function(t){var e=0!==(4&this.D);e!==t&&(this.D^=4,this.g("textEditable",e,t),this.Lb())}},groupable:{get:function(){return 0!==(8&this.D)},set:function(t){var e=0!==(8&this.D);e!==t&&(this.D^=8,this.g("groupable",e,t))}},movable:{get:function(){return 0!==(16&this.D)},set:function(t){var e=0!==(16&this.D);e!==t&&(this.D^=16,this.g("movable",e,t))}},selectionAdorned:{get:function(){return 0!==(32&this.D)},set:function(t){var e=0!==(32&this.D);e!==t&&(this.D^=32,this.g("selectionAdorned",e,t),this.Lb())}},isInDocumentBounds:{get:function(){return 0!==(64&this.D)},set:function(t){var e=0!==(64&this.D);if(e!==t){this.D^=64;var i=this.diagram;null!==i&&i.Na(),this.g("isInDocumentBounds",e,t)}}},isLayoutPositioned:{get:function(){return 0!==(128&this.D)},set:function(t){var e=0!==(128&this.D);e!==t&&(this.D^=128,this.g("isLayoutPositioned",e,t),this.B(t?4:8))}},selectable:{get:function(){return 0!==(256&this.D)},set:function(t){var e=0!==(256&this.D);e!==t&&(this.D^=256,this.g("selectable",e,t),this.Lb())}},reshapable:{get:function(){return 0!==(512&this.D)},set:function(t){var e=0!==(512&this.D);e!==t&&(this.D^=512,this.g("reshapable",e,t),this.Lb())}},resizable:{get:function(){return 0!==(1024&this.D)},set:function(t){var e=0!==(1024&this.D);e!==t&&(this.D^=1024,this.g("resizable",e,t),this.Lb())}},rotatable:{get:function(){return 0!==(2048&this.D)},set:function(t){var e=0!==(2048&this.D);e!==t&&(this.D^=2048,this.g("rotatable",e,t),this.Lb())}},isSelected:{get:function(){return 0!==(4096&this.D)},set:function(t){var e=0!==(4096&this.D);if(e!==t){var i=this.diagram;if(!t||this.canSelect()&&!(null!==i&&i.selection.count>=i.maxSelectionCount)){this.D^=4096;var n=!1;if(null!==i){n=i.skipsUndoManager,i.skipsUndoManager=!0;var o=i.selection;o.ea(),t?o.add(this):o.remove(this),o.freeze()}this.g("isSelected",e,t),this.Lb(),t=this.selectionChanged,null!==t&&t(this),null!==i&&(i.Db(),i.skipsUndoManager=n)}}}},isHighlighted:{get:function(){return 0!==(524288&this.D)},set:function(t){var e=0!==(524288&this.D);if(e!==t){this.D^=524288;var i=this.diagram;null!==i&&(i=i.highlighteds,i.ea(),t?i.add(this):i.remove(this),i.freeze()),this.g("isHighlighted",e,t),this.M(),t=this.highlightedChanged,null!==t&&t(this)}}},isShadowed:{get:function(){return 0!==(8192&this.D)},set:function(t){var e=0!==(8192&this.D);e!==t&&(this.D^=8192,this.g("isShadowed",e,t),this.M())}},isAnimated:{get:function(){return 0!==(262144&this.D)},set:function(t){var e=0!==(262144&this.D);e!==t&&(this.D^=262144,this.g("isAnimated",e,t))}},highlightedChanged:{get:function(){return this.so},set:function(t){var e=this.so;e!==t&&(this.so=t,this.g("highlightedChanged",e,t))}},selectionObjectName:{get:function(){return this.Tp},set:function(t){var e=this.Tp;e!==t&&(this.Tp=t,this.sh=null,this.g("selectionObjectName",e,t))}},selectionAdornmentTemplate:{get:function(){return this.Rp},set:function(t){var e=this.Rp;e!==t&&(this.Rp=t,this.g("selectionAdornmentTemplate",e,t))}},selectionObject:{get:function(){if(null===this.sh){var t=this.selectionObjectName;null!==t&&""!==t?(t=this.bb(t),this.sh=null!==t?t:this):this instanceof Nc?(t=this.path,this.sh=null!==t?t:this):this.sh=this}return this.sh}},selectionChanged:{get:function(){return this.Sp},set:function(t){var e=this.Sp;e!==t&&(this.Sp=t,this.g("selectionChanged",e,t))}},resizeAdornmentTemplate:{get:function(){return this.Cp},set:function(t){var e=this.Cp;e!==t&&(this.Cp=t,this.g("resizeAdornmentTemplate",e,t))}},resizeObjectName:{get:function(){return this.Ep},set:function(t){var e=this.Ep;e!==t&&(this.Ep=t,this.g("resizeObjectName",e,t))}},resizeObject:{get:function(){var t=this.resizeObjectName;return""!==t&&(t=this.bb(t),null!==t)?t:this}},resizeCellSize:{get:function(){return this.Dp},set:function(t){var e=this.Dp;e.w(t)||(this.Dp=t=t.H(),this.g("resizeCellSize",e,t))}},rotateAdornmentTemplate:{get:function(){return this.Gp},set:function(t){var e=this.Gp;e!==t&&(this.Gp=t,this.g("rotateAdornmentTemplate",e,t))}},rotateObjectName:{get:function(){return this.Hp},set:function(t){var e=this.Hp;e!==t&&(this.Hp=t,this.g("rotateObjectName",e,t))}},rotateObject:{get:function(){var t=this.rotateObjectName;return""!==t&&(t=this.bb(t),null!==t)?t:this}},rotationSpot:{get:function(){return this.Ip},set:function(t){var e=this.Ip;e.w(t)||(this.Ip=t=t.H(),this.g("rotationSpot",e,t))}},text:{get:function(){return this.Ub},set:function(t){var e=this.Ub;e!==t&&(this.Ub=t,this.g("text",e,t))}},containingGroup:{get:function(){return this.mi},set:function(t){if(this.Nc()){var e=this.mi;if(e!==t){null===t||this!==t&&!t.Kd(this)||(this===t&&w("Cannot make a Group a member of itself: "+this.toString()),w("Cannot make a Group indirectly contain itself: "+this.toString()+" already contains "+t.toString())),this.B(2);var i=this.diagram;if(null!==e?kc(e,this):this instanceof bc&&null!==i&&i.Dh.remove(this),this.mi=t,null!==t?wc(t,this):this instanceof bc&&null!==i&&i.Dh.add(this),this.B(1),null!==i&&i.Z){var n=this.data,o=i.model;if(null!==n&&o.Dk()){var r=o.ja(null!==t?t.data:null);o.dr(n,r)}}if(n=this.containingGroupChanged,null!==n&&(o=!0,null!==i&&(o=i.Z,i.Z=!0),n(this,e,t),null!==i&&(i.Z=o)),this instanceof bc)for(i=new nt,Ju(i,this,!0,0,!0),i=i.iterator;i.next();)if(n=i.value,n instanceof ec)for(n=n.linksConnected;n.next();)Cc(n.value);if(this instanceof ec){for(i=this.linksConnected;i.next();)Cc(i.value);i=this.labeledLink,null!==i&&Cc(i)}this.g("containingGroup",e,t),null!==t&&(e=t.layer,null!==e&&qo(e,-1,t))}}else w("cannot set the Part.containingGroup of a Link or Adornment")}},containingGroupChanged:{get:function(){return this.An},set:function(t){var e=this.An;e!==t&&(this.An=t,this.g("containingGroupChanged",e,t))}},isTopLevel:{get:function(){return!(null!==this.containingGroup||this instanceof ec&&null!==this.labeledLink)}},layoutConditions:{get:function(){return this.Io},set:function(t){var e=this.Io;e!==t&&(this.Io=t,this.g("layoutConditions",e,t))}},dragComputation:{get:function(){return this.Sn},set:function(t){var e=this.Sn;e!==t&&(this.Sn=t,this.g("dragComputation",e,t))}},shadowOffset:{get:function(){return this.Xp},set:function(t){var e=this.Xp;e.w(t)||(this.Xp=t=t.H(),this.M(),this.g("shadowOffset",e,t))}},shadowColor:{get:function(){return this.Wp},set:function(t){var e=this.Wp;e!==t&&(this.Wp=t,this.M(),this.g("shadowColor",e,t))}},shadowBlur:{get:function(){return this.ug},set:function(t){var e=this.ug;e!==t&&(this.ug=t,this.M(),this.g("shadowBlur",e,t))}}}),Lu.prototype.invalidateLayout=Lu.prototype.B,Lu.prototype.findCommonContainingGroup=Lu.prototype.oy,Lu.prototype.isMemberOf=Lu.prototype.Kd,Lu.prototype.findTopLevelPart=Lu.prototype.eA,Lu.prototype.findSubGraphLevel=Lu.prototype.bA,Lu.prototype.ensureBounds=Lu.prototype.Ta,Lu.prototype.getDocumentBounds=Lu.prototype.mj,Lu.prototype.getRelativePoint=Lu.prototype.Df,Lu.prototype.findObject=Lu.prototype.bb,Lu.prototype.moveTo=Lu.prototype.moveTo,Lu.prototype.invalidateAdornments=Lu.prototype.Lb,Lu.prototype.clearAdornments=Lu.prototype.nk,Lu.prototype.removeAdornment=Lu.prototype.Hf,Lu.prototype.addAdornment=Lu.prototype.Gh,Lu.prototype.findAdornment=Lu.prototype.wk,Lu.prototype.updateTargetBindings=Lu.prototype.Da;var Zu=!1;function Qu(t){Lu.call(this,t),this.D&=-257,this.ih="Adornment",this.ie=null,this.Ex=0,this.Sx=!1,this.l=t instanceof Yh?[]:tc,this.Sa=null}Lu.className="Part",Lu.LayoutNone=0,Lu.LayoutAdded=1,Lu.LayoutRemoved=2,Lu.LayoutShown=4,Lu.LayoutHidden=8,Lu.LayoutNodeSized=16,Lu.LayoutGroupLayout=32,Lu.LayoutNodeReplaced=64,Lu.LayoutStandard=127,Lu.LayoutAll=16777215,f(Qu,Lu),Qu.prototype.toString=function(){var t=this.adornedPart;return"Adornment("+this.category+")"+(null!==t?t.toString():"")},Qu.prototype.updateRelationshipsFromData=function(){},Qu.prototype.Gk=function(t){var e=this.adornedObject.part;if(e instanceof Nc&&this.adornedObject instanceof Nl){var i=e.path;e.Gk(t),t=i.geometry,e=this.W.j,i=e.length;for(var n=0;n<i;n++){var o=e[n];o.isPanelMain&&o instanceof Nl&&(o.na=t)}}},Qu.prototype.rj=function(){var t=this.ie;return null===t||(t=t.part,null===t||!Oa(t))},Qu.prototype.Nc=function(){return!1},Qu.prototype.Sk=function(t,e,i,n,o,r,s){if(t===Ni&&"elements"===e){if(o instanceof Pc)null===this.Sa&&(this.Sa=o);else if(o instanceof Uh){var a=o.ym((function(t){return t instanceof Pc}));a instanceof Pc&&null===this.Sa&&(this.Sa=a)}}else t===Ci&&"elements"===e&&null!==this.Sa&&(n===this.Sa||n instanceof Uh&&this.Sa.Gg(n))&&(this.Sa=null);Lu.prototype.Sk.call(this,t,e,i,n,o,r,s)},Qu.prototype.updateAdornments=function(){},Qu.prototype.uk=function(){},d.Object.defineProperties(Qu.prototype,{placeholder:{get:function(){return this.Sa}},adornedObject:{get:function(){return this.ie},set:function(t){var e=this.adornedPart,i=null;null!==t&&(i=t.part),null===e||null!==t&&e===i||e.Hf(this.category),this.ie=t,null!==i&&i.Gh(this.category,this)}},adornedPart:{get:function(){var t=this.ie;return null!==t?t.part:null}},containingGroup:{get:function(){return null}}});var tc=[];function ec(t){Lu.call(this,t),this.P=13,this.$a=new et,this.nq=this.Kl=this.Ii=this.Ko=this.Jo=null,this.cl=ze,this.tc=this.Se=null,this.zp=vc,this.Eh=!1}function ic(t,e){null!==e&&(null===t.Se&&(t.Se=new nt),t.Se.add(e))}function nc(t,e,i,n){if(null===e||null===t.Se)return null;for(var o=t.Se.iterator;o.next();){var r=o.value;if(r.au===t&&r.lw===e&&r.My===i&&r.Ny===n||r.au===e&&r.lw===t&&r.My===n&&r.Ny===i)return r}return null}function oc(t,e){for(t=t.linksConnected;t.next();){var i=t.value;i.fromPort!==e&&i.toPort!==e||(rc(i.fromPort),rc(i.toPort),i.Ua())}}function rc(t){if(null!==t){var e=t.yp;null!==e&&e.Dm(),t=t.part,e=t.containingGroup,null===e||t.isVisible()||rc(e.port)}}function sc(t,e,i,n){if(null!==e&&!i.has(e)){i.add(e);var o=!0,r=t.diagram;null!==r&&(o=r.isTreePathToChildren),e.linksConnected.each((function(r){r.isTreeLink?(o?r.fromNode===e:r.toNode===e)&&sc(t,o?r.toNode:r.fromNode,i,n):n.add(r)}))}}function ac(t,e,i){rc(i);var n=t.$a.contains(e);if(n||t.$a.add(e),!n||e.fromNode===e.toNode){var o=t.linkConnected;if(null!==o){var r=!0,s=t.diagram;null!==s&&(r=s.Z,s.Z=!0),o(t,e,i),null!==s&&(s.Z=r)}}!n&&e.isTreeLink&&(i=e.fromNode,e=e.toNode,null!==i&&null!==e&&i!==e&&(n=!0,t=t.diagram,null!==t&&(n=t.isTreePathToChildren),o=n?e:i,r=n?i:e,o.Eh||(o.Eh=r),!r.isTreeLeaf||null!==t&&t.undoManager.isUndoingRedoing||(n?i===r&&(r.isTreeLeaf=!1):e===r&&(r.isTreeLeaf=!1))))}function hc(t,e,i){rc(i);var n=t.$a.remove(e),o=null;if(n||e.toNode===e.fromNode){var r=t.linkDisconnected;if(o=t.diagram,null!==r){var s=!0;null!==o&&(s=o.Z,o.Z=!0),r(t,e,i),null!==o&&(o.Z=s)}}n&&e.isTreeLink&&(i=!0,null!==o&&(i=o.isTreePathToChildren),t=i?e.toNode:e.fromNode,e=i?e.fromNode:e.toNode,null!==t&&(t.Eh=!1),null===e||e.isTreeLeaf||(0===e.$a.count?(e.Eh=null,null!==o&&o.undoManager.isUndoingRedoing||(e.isTreeLeaf=!0)):lc(e)))}function lc(t){if(t.Eh=!1,0!==t.$a.count){var e=!0,i=t.diagram;if(null===i||!i.undoManager.isUndoingRedoing){for(null!==i&&(e=i.isTreePathToChildren),i=t.$a.iterator;i.next();){var n=i.value;if(n.isTreeLink)if(e){if(n.fromNode===t)return void(t.isTreeLeaf=!1)}else if(n.toNode===t)return void(t.isTreeLeaf=!1)}t.isTreeLeaf=!0}}}function uc(t){null===t.tc?t.tc=new dt:t.tc.clear(),t.an(t,(function(t,e){cc(t,e)})),0===t.tc.count&&t.tc.add("",t)}function cc(t,e){var i=e.portId;null!==i&&null!==t.tc&&t.tc.add(i,e)}function fc(t,e,i){var n=e.portId;if(null!==n&&(null!==t.tc&&t.tc.remove(n),e=t.diagram,null!==e&&i)){for(i=null,t=t.findLinksConnected(n);t.next();)n=t.value,null===i&&(i=j()),i.push(n);if(null!==i){for(t=0;t<i.length;t++)e.remove(i[t]);O(i)}}}function dc(t,e){return e=e.Fg(),null===e?0:1+dc(t,e)}function pc(t,e,i,n,o,r,s){if(1<n)for(var a=i?t.Fq():t.Hd();a.next();){var h=a.value;h.isTreeLink&&(h=h.Kq(t),null===h||h===t||e.contains(h)||(e.add(h),pc(h,e,i,n-1,o,r,s)))}else gc(t,e,i,o,r,s)}function gc(t,e,i,n,o,r){for(var s=o===t||t.isTreeExpanded,a=i?t.Fq():t.Hd();a.next();){var h=a.value;if(h.isTreeLink&&(h=h.Kq(t),null!==h&&h!==t)){var l=e.contains(h);l||e.add(h),s&&(r&&n.jk(h,o),h.Oh(),h.Ob(!1)),h.isTreeExpanded&&(h.wasTreeExpanded=h.isTreeExpanded,l||gc(h,e,i,n,o,r))}}t.isTreeExpanded=!1}function yc(t,e,i,n,o,r,s){for(var a=r!==t&&t.isTreeExpanded,h=i?t.Fq():t.Hd();h.next();){var l=h.value;l.isTreeLink&&(a||l.ud||l.Ua(),l=l.Kq(t),null!==l&&l!==t&&!e.contains(l)&&(e.add(l),a||(l.Ob(!0),l.Oh(),s&&o.lk(l,r)),2<n||l.wasTreeExpanded))&&(l.wasTreeExpanded=!1,yc(l,e,i,n-1,o,r,s))}t.isTreeExpanded=!0}Qu.className="Adornment",f(ec,Lu),ec.prototype.cloneProtected=function(t){Lu.prototype.cloneProtected.call(this,t),t.P=this.P,t.P=-17&this.P,t.Jo=this.Jo,t.Ko=this.Ko,t.Ii=this.Ii,t.nq=this.nq,t.cl=this.cl.H(),t.zp=this.zp},i=ec.prototype,i.yf=function(t){Lu.prototype.yf.call(this,t),t.sd(),t.Se=this.Se,t.tc=null},i.xA=function(t,e,i){void 0!==e&&null!==e||(e=""),void 0!==i&&null!==i||(i=""),t=nc(this,t,e,i),null!==t&&t.Dm()},i.Sk=function(t,e,i,n,o,r,s){(t===Ni&&"elements"===e||t===Ci&&"elements"===e)&&(this.tc=null),Lu.prototype.Sk.call(this,t,e,i,n,o,r,s)},i.sd=function(t){void 0===t&&(t=null);for(var e=this.linksConnected;e.next();){var i=e.value;null!==t&&t.contains(i)||(rc(i.fromPort),rc(i.toPort),i.Ua())}},i.rj=function(){return!0},ec.prototype.getAvoidableRect=function(t){return t.set(this.actualBounds),t.uq(this.cl),t},ec.prototype.findVisibleNode=function(){for(var t=this;null!==t&&!t.isVisible();)t=t.containingGroup;return t},ec.prototype.isVisible=function(){if(!Lu.prototype.isVisible.call(this))return!1;var t=!0,e=Ls,i=this.diagram;if(null!==i){if(i.animationManager.cu(this))return!0;t=i.isTreePathToChildren,e=i.treeCollapsePolicy}if(e===Ls){if(t=this.Fg(),null!==t&&!t.isTreeExpanded)return!1}else if(e===js){if(t=t?this.Tv():this.Uv(),0<t.count&&t.all((function(t){return!t.isTreeExpanded})))return!1}else if(e===Os&&(t=t?this.Tv():this.Uv(),0<t.count&&t.any((function(t){return!t.isTreeExpanded}))))return!1;return t=this.labeledLink,null===t||t.isVisible()},ec.prototype.Ob=function(t){Lu.prototype.Ob.call(this,t);for(var e=this.linksConnected;e.next();){var i=e.value;if(t&&null!==this.containingGroup){var n=i.Kq(this);null===n||n.Kd(this.containingGroup)||i.Ua()}i.Ob(t)}},ec.prototype.py=function(){var t=new nt,e=new nt;return sc(this,this,t,e),e.iterator},ec.prototype.findLinksConnected=function(t){if(void 0===t&&(t=null),null===t)return this.$a.iterator;var e=new Q(this.$a),i=this;return e.predicate=function(e){return e.fromNode===i&&e.fromPortId===t||e.toNode===i&&e.toPortId===t},e},i=ec.prototype,i.Fq=function(t){void 0===t&&(t=null);var e=new Q(this.$a),i=this;return e.predicate=function(e){return e.fromNode===i&&(null===t||e.fromPortId===t)},e},i.Hd=function(t){void 0===t&&(t=null);var e=new Q(this.$a),i=this;return e.predicate=function(e){return e.toNode===i&&(null===t||e.toPortId===t)},e},i.Sv=function(t){void 0===t&&(t=null);for(var e=null,i=null,n=this.$a.iterator;n.next();){var o=n.value;o.fromNode===this?null!==t&&o.fromPortId!==t||(o=o.toNode,null!==e?e.add(o):null!==i&&i!==o?(e=new nt,e.add(i),e.add(o)):i=o):o.toNode!==this||null!==t&&o.toPortId!==t||(o=o.fromNode,null!==e?e.add(o):null!==i&&i!==o?(e=new nt,e.add(i),e.add(o)):i=o)}return null!==e?e.iterator:null!==i?new Z(i):J},i.Uv=function(t){void 0===t&&(t=null);for(var e=null,i=null,n=this.$a.iterator;n.next();){var o=n.value;o.fromNode!==this||null!==t&&o.fromPortId!==t||(o=o.toNode,null!==e?e.add(o):null!==i&&i!==o?(e=new nt,e.add(i),e.add(o)):i=o)}return null!==e?e.iterator:null!==i?new Z(i):J},i.Tv=function(t){void 0===t&&(t=null);for(var e=null,i=null,n=this.$a.iterator;n.next();){var o=n.value;o.toNode!==this||null!==t&&o.toPortId!==t||(o=o.fromNode,null!==e?e.add(o):null!==i&&i!==o?(e=new nt,e.add(i),e.add(o)):i=o)}return null!==e?e.iterator:null!==i?new Z(i):J},i.Xz=function(t,e,i){void 0===e&&(e=null),void 0===i&&(i=null);var n=new Q(this.$a),o=this;return n.predicate=function(n){return!(n.fromNode!==o||n.toNode!==t||null!==e&&n.fromPortId!==e||null!==i&&n.toPortId!==i)||!(n.fromNode!==t||n.toNode!==o||null!==i&&n.fromPortId!==i||null!==e&&n.toPortId!==e)},n},i.Yz=function(t,e,i){void 0===e&&(e=null),void 0===i&&(i=null);var n=new Q(this.$a),o=this;return n.predicate=function(n){return!(n.fromNode!==o||n.toNode!==t||null!==e&&n.fromPortId!==e||null!==i&&n.toPortId!==i)},n},ec.prototype.updateRelationshipsFromData=function(){var t=this.diagram;null!==t&&t.partManager.updateRelationshipsFromData(this)},i=ec.prototype,i.Mq=function(t){Lu.prototype.Mq.call(this,t),t||(lc(this),t=this.Kl,null!==t&&Tc(t,this))},i.Nq=function(t){Lu.prototype.Nq.call(this,t),t||(t=this.Kl,null!==t&&null!==t.nd&&(t.nd.remove(this),t.o()))},i.uk=function(){if(0<this.$a.count){var t=this.diagram;if(null!==t)for(var e=null===t.commandHandler||t.commandHandler.deletesConnectedLinks,i=this.$a.copy().iterator;i.next();){var n=i.value;e?t.remove(n):(n.fromNode===this&&(n.fromNode=null),n.toNode===this&&(n.toNode=null))}}this.labeledLink=null,Lu.prototype.uk.call(this)},i.Jt=function(t){if(null===this.tc){if(""===t&&!1===this.Nh)return this;uc(this)}var e=this.tc.G(t);return null!==e||""!==t&&(e=this.tc.G(""),null!==e)?e:this},i.zA=function(t){if(null===t||t===this)return!1;var e=!0,i=this.diagram;if(null!==i&&(e=i.isTreePathToChildren),i=this,e)for(;i!==t;){e=null;for(var n=i.$a.iterator;n.next();){var o=n.value;if(o.isTreeLink&&(e=o.fromNode,e!==i&&e!==this))break}if(e===this||null===e||e===i)return!1;i=e}else for(;i!==t;){for(e=null,n=i.$a.iterator;n.next()&&(o=n.value,!o.isTreeLink||(e=o.toNode,e===i||e===this)););if(e===this||null===e||e===i)return!1;i=e}return!0},i.iA=function(){var t=!0,e=this.diagram;if(null!==e&&(t=e.isTreePathToChildren),e=this,t)for(;;){t=null;for(var i=e.$a.iterator;i.next();){var n=i.value;if(n.isTreeLink&&(t=n.fromNode,t!==e&&t!==this))break}if(t===this)return this;if(null===t||t===e)return e;e=t}else for(;;){for(t=null,i=e.$a.iterator;i.next()&&(n=i.value,!n.isTreeLink||(t=n.toNode,t===e||t===this)););if(t===this)return this;if(null===t||t===e)return e;e=t}},i.Uz=function(t){if(null===t)return null;if(this===t)return this;for(var e=this;null!==e;)Ku(e,!0),e=e.Fg();var i=null;for(e=t;null!==e;){if(0!==(1048576&e.D)){i=e;break}e=e.Fg()}for(e=this;null!==e;)Ku(e,!1),e=e.Fg();return i},i.jj=function(){var t=!0,e=this.diagram;if(null!==e&&(t=e.isTreePathToChildren),e=this.$a.iterator,t){for(;e.next();)if(t=e.value,t.isTreeLink&&t.fromNode!==this)return t}else for(;e.next();)if(t=e.value,t.isTreeLink&&t.toNode!==this)return t;return null},i.Fg=function(){var t=this.Eh;if(null===t)return null;if(t instanceof ec)return t;var e=!0;if(t=this.diagram,null!==t&&(e=t.isTreePathToChildren),t=this.$a.iterator,e){for(;t.next();)if(e=t.value,e.isTreeLink&&(e=e.fromNode,e!==this))return this.Eh=e}else for(;t.next();)if(e=t.value,e.isTreeLink&&(e=e.toNode,e!==this))return this.Eh=e;return this.Eh=null},i.gA=function(){function t(e,i){if(null!==e){i.add(e);var n=e.jj();null!==n&&(i.add(n),t(e.Fg(),i))}}var e=new nt;return t(this,e),e},i.fA=function(){return dc(this,this)},i.Hq=function(){var t=!0,e=this.diagram;null!==e&&(t=e.isTreePathToChildren),e=new Q(this.$a);var i=this;return e.predicate=t?function(t){return!(!t.isTreeLink||t.fromNode!==i)}:function(t){return!(!t.isTreeLink||t.toNode!==i)},e},i.Wv=function(){var t=!0,e=this.diagram;null!==e&&(t=e.isTreePathToChildren);var i=e=null,n=this.$a.iterator;if(t)for(;n.next();)t=n.value,t.isTreeLink&&t.fromNode===this&&(t=t.toNode,null!==e?e.add(t):null!==i&&i!==t?(e=new et,e.add(i),e.add(t)):i=t);else for(;n.next();)t=n.value,t.isTreeLink&&t.toNode===this&&(t=t.fromNode,null!==e?e.add(t):null!==i&&i!==t?(e=new et,e.add(i),e.add(t)):i=t);return null!==e?e.iterator:null!==i?new Z(i):J},i.hA=function(t){void 0===t&&(t=1/0);var e=new nt;return Ju(e,this,!1,t,!0),e},ec.prototype.collapseTree=function(t){void 0===t&&(t=1),1>t&&(t=1);var e=this.diagram;if(null!==e&&!e.Le){e.Le=!0;var i=new nt;i.add(this),pc(this,i,e.isTreePathToChildren,t,e,this,e.treeCollapsePolicy===Ls),e.Le=!1}},ec.prototype.expandTree=function(t){void 0===t&&(t=2),2>t&&(t=2);var e=this.diagram;if(null!==e&&!e.Le){e.Le=!0;var i=new nt;i.add(this),yc(this,i,e.isTreePathToChildren,t,e,this,e.treeCollapsePolicy===Ls),e.Le=!1}},d.Object.defineProperties(ec.prototype,{portSpreading:{get:function(){return this.zp},set:function(t){var e=this.zp;e!==t&&(this.zp=t,this.g("portSpreading",e,t),t=this.diagram,null!==t&&t.undoManager.isUndoingRedoing||this.sd())}},avoidable:{get:function(){return 0!==(8&this.P)},set:function(t){var e=0!==(8&this.P);if(e!==t){this.P^=8;var i=this.diagram;null!==i&&hs(i,this),this.g("avoidable",e,t)}}},avoidableMargin:{get:function(){return this.cl},set:function(t){"number"===typeof t&&(t=new Qt(t));var e=this.cl;if(!e.w(t)){this.cl=t=t.H();var i=this.diagram;null!==i&&hs(i,this),this.g("avoidableMargin",e,t)}}},linksConnected:{get:function(){return this.$a.iterator}},linkConnected:{get:function(){return this.Jo},set:function(t){var e=this.Jo;e!==t&&(this.Jo=t,this.g("linkConnected",e,t))}},linkDisconnected:{get:function(){return this.Ko},set:function(t){var e=this.Ko;e!==t&&(this.Ko=t,this.g("linkDisconnected",e,t))}},linkValidation:{get:function(){return this.Ii},set:function(t){var e=this.Ii;e!==t&&(this.Ii=t,this.g("linkValidation",e,t))}},isLinkLabel:{get:function(){return null!==this.Kl}},labeledLink:{get:function(){return this.Kl},set:function(t){var e=this.Kl;if(e!==t){var i=this.diagram,n=this.data;if(null!==e){if(null!==e.nd&&(e.nd.remove(this),e.o()),null!==i&&null!==n&&!i.undoManager.isUndoingRedoing){var o=e.data,r=i.model;if(null!==o&&r.qj()){var s=r.ja(n);void 0!==s&&r.Oy(o,s)}}this.containingGroup=null}this.Kl=t,null!==t&&(Tc(t,this),null===i||null===n||i.undoManager.isUndoingRedoing||(o=t.data,i=i.model,null!==o&&i.qj()&&(n=i.ja(n),void 0!==n&&i.Dv(o,n))),this.containingGroup=t.containingGroup),wa(this),this.g("labeledLink",e,t)}}},port:{get:function(){return this.Jt("")}},ports:{get:function(){return null===this.tc&&uc(this),this.tc.iteratorValues}},isTreeExpanded:{get:function(){return 0!==(1&this.P)},set:function(t){var e=0!==(1&this.P);if(e!==t){this.P^=1;var i=this.diagram;if(this.g("isTreeExpanded",e,t),e=this.treeExpandedChanged,null!==e){var n=!0;null!==i&&(n=i.Z,i.Z=!0),e(this),null!==i&&(i.Z=n)}null!==i&&i.undoManager.isUndoingRedoing?this.Ob(t):t?this.expandTree():this.collapseTree()}}},wasTreeExpanded:{get:function(){return 0!==(2&this.P)},set:function(t){var e=0!==(2&this.P);e!==t&&(this.P^=2,this.g("wasTreeExpanded",e,t))}},treeExpandedChanged:{get:function(){return this.nq},set:function(t){var e=this.nq;e!==t&&(this.nq=t,this.g("treeExpandedChanged",e,t))}},isTreeLeaf:{get:function(){return 0!==(4&this.P)},set:function(t){var e=0!==(4&this.P);e!==t&&(this.P^=4,this.g("isTreeLeaf",e,t))}}}),ec.prototype.expandTree=ec.prototype.expandTree,ec.prototype.collapseTree=ec.prototype.collapseTree,ec.prototype.findTreeParts=ec.prototype.hA,ec.prototype.findTreeChildrenNodes=ec.prototype.Wv,ec.prototype.findTreeChildrenLinks=ec.prototype.Hq,ec.prototype.findTreeLevel=ec.prototype.fA,ec.prototype.findTreeParentChain=ec.prototype.gA,ec.prototype.findTreeParentNode=ec.prototype.Fg,ec.prototype.findTreeParentLink=ec.prototype.jj,ec.prototype.findCommonTreeParent=ec.prototype.Uz,ec.prototype.findTreeRoot=ec.prototype.iA,ec.prototype.isInTreeOf=ec.prototype.zA,ec.prototype.findPort=ec.prototype.Jt,ec.prototype.findLinksTo=ec.prototype.Yz,ec.prototype.findLinksBetween=ec.prototype.Xz,ec.prototype.findNodesInto=ec.prototype.Tv,ec.prototype.findNodesOutOf=ec.prototype.Uv,ec.prototype.findNodesConnected=ec.prototype.Sv,ec.prototype.findLinksInto=ec.prototype.Hd,ec.prototype.findLinksOutOf=ec.prototype.Fq,ec.prototype.findExternalTreeLinksConnected=ec.prototype.py,ec.prototype.invalidateConnectedLinks=ec.prototype.sd,ec.prototype.invalidateLinkBundle=ec.prototype.xA;var mc=new U(ec,"SpreadingNone",10),vc=new U(ec,"SpreadingEvenly",11),xc=new U(ec,"SpreadingPacked",12);function bc(t){ec.call(this,t),this.P|=4608,this.Vo=new nt,this.Sl=new nt,this.Sa=this.eq=this.Ki=this.Wo=this.Uo=this.Za=null,this.kc=new zf,this.kc.group=this}function wc(t,e){if(t.Vo.add(e)){e instanceof bc&&t.Sl.add(e);var i=t.memberAdded;if(null!==i){var n=!0,o=t.diagram;null!==o&&(n=o.Z,o.Z=!0),i(t,e),null!==o&&(o.Z=n)}t.isVisible()&&t.isSubGraphExpanded||e.Ob(!1)}e instanceof Nc&&!t.computesBoundsIncludingLinks||(e=t.Sa,null===e&&(e=t),e.o())}function kc(t,e){if(t.Vo.remove(e)){e instanceof bc&&t.Sl.remove(e);var i=t.memberRemoved;if(null!==i){var n=!0,o=t.diagram;null!==o&&(n=o.Z,o.Z=!0),i(t,e),null!==o&&(o.Z=n)}t.isVisible()&&t.isSubGraphExpanded||e.Ob(!0)}e instanceof Nc&&!t.computesBoundsIncludingLinks||(e=t.Sa,null===e&&(e=t),e.o())}function Mc(t,e,i,n){for(var o=t.memberParts;o.next();){var r=o.value;if(r.Ob(!1),r instanceof bc&&r.isSubGraphExpanded&&(r.wasSubGraphExpanded=r.isSubGraphExpanded,Mc(r,e,i,n)),r instanceof ec)r.sd(e),i.jk(r,n);else if(r instanceof Nc)for(r=r.labelNodes;r.next();)r.value.sd(e)}t.isSubGraphExpanded=!1}function Sc(t,e,i,n){for(var o=t.memberParts;o.next();){var r=o.value;if(r.Ob(!0),r instanceof bc&&r.wasSubGraphExpanded&&(r.wasSubGraphExpanded=!1,Sc(r,e,i,n)),r instanceof ec)r.sd(e),i.lk(r,n);else if(r instanceof Nc)for(r=r.labelNodes;r.next();)r.value.sd(e)}t.isSubGraphExpanded=!0}function Pc(){ca.call(this),this.ib=Re,this.Np=new zt(NaN,NaN,NaN,NaN)}function Nc(){Lu.call(this,Uh.Link),this.Ga=8,this.We=null,this.Xe="",this.rf=this.fo=null,this.sf="",this.mq=null,this.Yk=tf,this.Hn=0,this.Jn=tf,this.Kn=NaN,this.ck=$c,this.Zp=.5,this.nd=null,this.Ab=(new et).freeze(),this.jf=this.ph=null,this.Yl=new zt,this.na=new We,this.I=this.u=this.Mf=this.Vf=null,this.l=[],this.vv=new pt,this.$r=this.Nx=this.Mx=null,this.Ru=NaN,this.O=null}function Cc(t){var e=t.fromNode,i=t.toNode,n=null;if(n=null!==e?null!==i?e.oy(i):e.containingGroup:null!==i?i.containingGroup:null,e=n,i=t.mi,i!==e){null!==i&&kc(i,t),t.mi=e,null!==e&&wc(e,t);var o=t.containingGroupChanged;if(null!==o){var r=!0,s=t.diagram;null!==s&&(r=s.Z,s.Z=!0),o(t,i,e),null!==s&&(s.Z=r)}!t.ud||t.Mx!==i&&t.Nx!==i||t.Ua()}if(t.isLabeledLink)for(t=t.labelNodes;t.next();)t.value.containingGroup=n}function Tc(t,e){null===t.nd&&(t.nd=new nt),t.nd.add(e),t.o()}function Ac(t,e,i){if(0!==e||0!==i)if(0===t.pointsCount)t.defaultFromPoint&&t.defaultFromPoint.copy().offset(e,i),t.defaultToPoint&&t.defaultToPoint.copy().offset(e,i);else{for(var n=t.ud,o=new et,r=t.Ab.iterator;r.next();){var s=r.value;o.add(new pt(s.x+e,s.y+i).freeze())}o.freeze(),r=t.Ab,t.Ab=o,s=t.diagram,isNaN(e)||isNaN(i)||null!==s&&s.animationManager.sc?t.o():(t.dg.h(t.dg.x+e,t.dg.y+i),t.la.h(t.la.x+e,t.la.y+i),wa(t)),n?Lc(t):(t.defaultFromPoint&&(t.defaultFromPoint=t.i(0)),t.defaultToPoint&&(t.defaultToPoint=t.i(t.pointsCount-1))),null!==s&&s.animationManager.sc&&(e=s.animationManager,t.jf=o,e.$l.add(t)),t.g("points",r,o)}}function Lc(t){0===t.Ab.count?t.ud=!1:(t.ud=!0,t.$r=null,t.Ru=NaN,t.defaultFromPoint=t.i(0),t.defaultToPoint=t.i(t.pointsCount-1),qc(t,!1))}function jc(t,e){return Math.abs(e.x-t.x)>Math.abs(e.y-t.y)?(e.x>=t.x?e.x=t.x+9e9:e.x=t.x-9e9,e.y=t.y):(e.y>=t.y?e.y=t.y+9e9:e.y=t.y-9e9,e.x=t.x),e}function Oc(t,e){var i=e.yp;return null===i&&(i=new Ff,i.port=e,i.node=e.part,e.yp=i),If(i,t)}function Dc(t){return t===ie||.5===t.x&&.5===t.y}function Fc(t){return.5===t.x&&.5===t.y?t:ae}function Bc(t){if(null===t.diagram||!t.isAvoiding||!os(t.diagram))return!1;var e=t.points.j,i=e.length;if(4>i)return!1;t=rs(t.diagram,!0,t.containingGroup,null);for(var n=1;n<i-2;n++){var o=e[n],r=e[n+1];if(!t.Ek(Math.min(o.x,r.x),Math.min(o.y,r.y),Math.abs(o.x-r.x),Math.abs(o.y-r.y)))return!0}return!1}function Ic(t,e,i,n,o,r,s){var a=e.zq,h=e.yq,l=kf(e,i,n),u=i,c=n;for(0===o?u+=a:90===o?c+=h:180===o?u-=a:c-=h,o!==s&&l>Lf&&kf(e,u,c)!==l-1&&(kf(e,i-a,n)===l-1?(o=180,u=i-a,c=n):kf(e,i+a,n)===l-1?(o=0,u=i+a,c=n):kf(e,i,n-h)===l-1?(o=270,u=i,c=n-h):kf(e,i,n+h)===l-1&&(o=90,u=i,c=n+h));l>Lf&&kf(e,u,c)===l-1;)i=u,n=c,0===o?u+=a:90===o?c+=h:180===o?u-=a:c-=h,--l;r?l>Lf&&(180===o||0===o?i=Math.floor(i/a)*a+a/2:90!==o&&270!==o||(n=Math.floor(n/h)*h+h/2)):(i=Math.floor(i/a)*a+a/2,n=Math.floor(n/h)*h+h/2),l>Lf&&(r=o,s=i,u=n,0===o?(r=90,u+=h):90===o?(r=180,s-=a):180===o?(r=270,u-=h):270===o&&(r=0,s+=a),kf(e,s,u)===l-1?Ic(t,e,s,u,r,!1,r):(s=i,u=n,0===o?(r=270,u-=h):90===o?(r=0,s+=a):180===o?(r=90,u+=h):270===o&&(r=180,s-=a),kf(e,s,u)===l-1&&Ic(t,e,s,u,r,!1,r))),t.vf(i,n)}function Ec(t,e,i,n){return t=i-t,isNaN(t)||1/0===t||-1/0===t?NaN:(0>t&&(t=-t),e=n-e,isNaN(e)||1/0===e||-1/0===e?NaN:(0>e&&(e=-e),_e.aa(t,0)?e:_e.aa(e,0)?t:Math.sqrt(t*t+e*e)))}function Rc(t,e,i,n){var o=t.pointsCount;if(2>o)return e;if(i){var r=t.i(1);if(i=r.x-n.x,r=r.y-n.y,n=Ec(e.x,e.y,i,r),0===n)return e;o=2===o?.5*n:n,t=t.computeShortLength(!0),t>o&&(t=o),o=t*(r-e.y)/n,e.x+=t*(i-e.x)/n,e.y+=o}else{if(r=t.i(o-2),i=r.x-n.x,r=r.y-n.y,n=Ec(e.x,e.y,i,r),0===n)return e;o=2===o?.5*n:n,t=t.computeShortLength(!1),t>o&&(t=o),o=t*(e.y-r)/n,e.x-=t*(e.x-i)/n,e.y-=o}return e}function zc(t,e,i,n){for(var o=t.pointsCount,r=e;_e.aa(e.x,r.x)&&_e.aa(e.y,r.y);){if(i>=o)return o-1;r=t.i(i++)}if(!_e.aa(e.x,r.x)&&!_e.aa(e.y,r.y))return i-1;for(var s=r;_e.aa(e.x,r.x)&&_e.aa(r.x,s.x)&&(!n||(e.y>=r.y?r.y>=s.y:r.y<=s.y))||_e.aa(e.y,r.y)&&_e.aa(r.y,s.y)&&(!n||(e.x>=r.x?r.x>=s.x:r.x<=s.x));){if(i>=o)return o-1;s=t.i(i++)}return i-2}function Vc(t,e,i,n,o,r,s){if(!s&&Xc(t)){s=t.computeJumpLength();var a=s/2,h=[],l=0;if(t.isVisible()&&(l=Gc(t,o,r,h)),0<l)if(_e.A(o.y,r.y))if(o.x<r.x)for(var u=0;u<l;){var c=Math.max(o.x,Math.min(h[u++]-a,r.x-s));e.lineTo(c+i,r.y+n);for(var f=c+i,d=Math.min(c+s,r.x);u<l;){if(c=h[u],!(c<d+s))break;u++,d=Math.min(c+a,r.x)}c=r.y-s+n,d+=i;var p=r.y+n;t.curve===nf?ku(e,d,p,!1):Su(e,f,c,d,c,d,p)}else for(--l;0<=l;){for(u=Math.min(o.x,Math.max(h[l--]+a,r.x+s)),e.lineTo(u+i,r.y+n),f=u+i,c=Math.max(u-s,r.x);0<=l;){if(u=h[l],!(u>c-s))break;l--,c=Math.max(u-a,r.x)}u=r.y-s+n,c+=i,d=r.y+n,t.curve===nf?ku(e,c,d,!1):Su(e,f,u,c,u,c,d)}else if(_e.A(o.x,r.x))if(o.y<r.y)for(u=0;u<l;){for(c=Math.max(o.y,Math.min(h[u++]-a,r.y-s)),e.lineTo(r.x+i,c+n),f=c+n,c=Math.min(c+s,r.y);u<l;){if(d=h[u],!(d<c+s))break;u++,c=Math.min(d+a,r.y)}d=r.x-s+i,p=r.x+i,c+=n,t.curve===nf?ku(e,p,c,!1):Su(e,d,f,d,c,p,c)}else for(--l;0<=l;){for(u=Math.min(o.y,Math.max(h[l--]+a,r.y+s)),e.lineTo(r.x+i,u+n),f=u+n,u=Math.max(u-s,r.y);0<=l;){if(c=h[l],!(c>u-s))break;l--,u=Math.max(c-a,r.y)}c=r.x-s+i,d=r.x+i,u+=n,t.curve===nf?ku(e,d,u,!1):Su(e,c,f,c,u,d,u)}}e.lineTo(r.x+i,r.y+n)}function Gc(t,e,i,n){var o=t.diagram;if(null===o||e.w(i))return 0;for(o=o.layers;o.next();){var r=o.value;if(null!==r&&r.visible){r=r.Ea.j;for(var s=r.length,a=0;a<s;a++){var h=r[a];if(h instanceof Nc){if(h===t)return 0<n.length&&n.sort((function(t,e){return t-e})),n.length;if(h.isVisible()&&Xc(h)){var l=h.routeBounds;l.s()&&t.routeBounds.Mc(l)&&!t.usesSamePort(h)&&(l=h.path,null!==l&&l.Gf()&&Yc(e,i,n,h))}}}}}return 0<n.length&&n.sort((function(t,e){return t-e})),n.length}function Yc(t,e,i,n){for(var o=_e.A(t.y,e.y),r=n.pointsCount,s=n.i(0),a=pt.alloc(),h=1;h<r;h++){var l=n.i(h);if(h<r-1){var u=n.i(h+1);if(s.y===l.y&&l.y===u.y){if(l.x>s.x&&u.x>=l.x||l.x<s.x&&u.x<=l.x)continue}else if(s.x===l.x&&l.x===u.x&&(l.y>s.y&&u.y>=l.y||l.y<s.y&&u.y<=l.y))continue}t:{u=t.x;var c=t.y,f=e.x,d=e.y,p=s.x;s=s.y;var g=l.x,y=l.y;if(_e.A(u,f)){if(!_e.A(c,d)&&_e.A(s,y)&&Math.min(c,d)<s&&Math.max(c,d)>s&&Math.min(p,g)<u&&Math.max(p,g)>u&&!_e.A(p,g)){a.x=u,a.y=s,u=!0;break t}}else if(_e.A(c,d)&&_e.A(p,g)&&Math.min(u,f)<p&&Math.max(u,f)>p&&Math.min(s,y)<c&&Math.max(s,y)>c&&!_e.A(s,y)){a.x=p,a.y=c,u=!0;break t}a.x=0,a.y=0,u=!1}u&&(o?i.push(a.x):i.push(a.y)),s=l}pt.free(a)}function Xc(t){return t=t.curve,t===of||t===nf}function qc(t,e){(e||Xc(t))&&(e=t.diagram,null===e||e.animationManager.isTicking||e.Vg.contains(t)||0===t.Yl.width&&0===t.Yl.height||e.Vg.add(t,t.Yl.copy()))}function Uc(t,e,i){if(null!==e&&e.$m&&e.ud&&Xc(e)){var n=e.routeBounds;n.s()&&(t.routeBounds.Mc(n)||i.Mc(n))&&(t.usesSamePort(e)||e.dc())}}function Kc(t){var e=t.We;if(null!==e){var i=t.rf;if(null!==i&&isNaN(t.curviness)){for(var n=t.Xe,o=t.sf,r=t=null,s=e.$a.j,a=s.length,h=0;h<a;h++){var l=s[h];(l.We===e&&l.Xe===n&&l.rf===i&&l.sf===o||l.We===i&&l.Xe===o&&l.rf===e&&l.sf===n)&&(null===r?r=l:(null===t&&(t=[],t.push(r)),t.push(l)))}if(null!==t){for(r=nc(e,i,n,o),null===r&&(r=new xf(e,n,i,o),ic(e,r),ic(i,r)),r.links=t,e=0;e<t.length;e++)t[e].Mf=r;r.Dm()}}}}function Hc(t){var e=t.Mf;null!==e&&isNaN(t.curviness)&&(t.Mf=null,t=e.links.indexOf(t),0<=t&&(L(e.links,t),e.Dm()))}ec.className="Node",ec.SpreadingNone=mc,ec.SpreadingEvenly=vc,ec.SpreadingPacked=xc,f(bc,ec),bc.prototype.cloneProtected=function(t){ec.prototype.cloneProtected.call(this,t),this.P=-32769&this.P,null!==this.Za&&(t.Za=this.Za.copy()),t.Uo=this.Uo,t.Wo=this.Wo,t.Ki=this.Ki,t.eq=this.eq;var e=t.ym((function(t){return t instanceof Pc}));t.Sa=e instanceof Pc?e:null,null!==this.kc?(t.kc=this.kc.copy(),t.kc.group=t):(null!==t.kc&&(t.kc.group=null),t.kc=null)},i=bc.prototype,i.yf=function(t){ec.prototype.yf.call(this,t);var e=t.yk();for(t=t.memberParts;t.next();){var i=t.value;if(i.o(),i.B(8),i.nk(),i instanceof ec)i.sd(e);else if(i instanceof Nc)for(i=i.labelNodes;i.next();)i.value.sd(e)}},i.Sk=function(t,e,i,n,o,r,s){if(t===Ni&&"elements"===e){if(o instanceof Pc)null===this.Sa?this.Sa=o:this.Sa!==o&&w("Cannot insert a second Placeholder into the visual tree of a Group.");else if(o instanceof Uh){var a=o.ym((function(t){return t instanceof Pc}));a instanceof Pc&&(null===this.Sa?this.Sa=a:this.Sa!==a&&w("Cannot insert a second Placeholder into the visual tree of a Group."))}}else t===Ci&&"elements"===e&&null!==this.Sa&&(n===this.Sa||n instanceof Uh&&this.Sa.Gg(n))&&(this.Sa=null);ec.prototype.Sk.call(this,t,e,i,n,o,r,s)},i.Im=function(t,e){ec.prototype.Im.call(this,t,e),this.isClipping&&this.type!==Uh.Spot&&(t=this.resizeObject,t instanceof Uh&&(t=t.tb()),null===this.Za&&(this.Za=new zt),t.mj(this.Za),t instanceof Nl&&this.Za.Jc(-t.strokeWidth,-t.strokeWidth))},i.Ih=function(t,e,i,n){this.cf=this.Sa,ec.prototype.Ih.call(this,t,e,i,n)},i.Ta=function(){var t=this;t.isSubGraphExpanded&&this.memberParts.each((function(e){!t.computesBoundsIncludingLinks&&e instanceof Nc||e.Ta()})),ec.prototype.Ta.call(this)},i.rj=function(){if(!ec.prototype.rj.call(this))return!1;for(var t=this.memberParts;t.next();){var e=t.value;if(e instanceof ec){if(e.isVisible()&&Oa(e))return!1}else if(e instanceof Nc&&e.isVisible()&&Oa(e)&&e.fromNode!==this&&e.toNode!==this)return!1}return!0},i.uk=function(){if(0<this.Vo.count){var t=this.diagram;if(null!==t)for(var e=this.Vo.copy().iterator;e.next();)t.remove(e.value)}ec.prototype.uk.call(this)},bc.prototype.canAddMembers=function(t){var e=this.diagram;if(null===e)return!1;for(e=e.commandHandler,t=ua(t).iterator;t.next();)if(!e.isValidMember(this,t.value))return!1;return!0},bc.prototype.addMembers=function(t,e){var i=this.diagram;if(null===i)return!1;i=i.commandHandler;var n=!0;for(t=ua(t).iterator;t.next();){var o=t.value;!e||i.isValidMember(this,o)?o.containingGroup=this:n=!1}return n},bc.prototype.canUngroup=function(){if(!this.ungroupable)return!1;var t=this.layer;return!(null!==t&&!t.allowUngroup)&&(t=t.diagram,!(null!==t&&!t.allowUngroup))},i=bc.prototype,i.sd=function(t){void 0===t&&(t=null);var e=0!==(65536&this.P);if(ec.prototype.sd.call(this,t),!e)for(0!==(65536&this.P)!==!0&&(this.P=65536^this.P),e=this.Rv();e.next();){var i=e.value;if(null===t||!t.contains(i)){var n=i.fromNode;null!==n&&n!==this&&n.Kd(this)&&!n.isVisible()?(rc(i.fromPort),rc(i.toPort),i.Ua()):(n=i.toNode,null!==n&&n!==this&&n.Kd(this)&&!n.isVisible()&&(rc(i.fromPort),rc(i.toPort),i.Ua()))}}},i.Rv=function(){var t=this.yk();t.add(this);for(var e=new nt,i=t.iterator;i.next();){var n=i.value;if(n instanceof ec)for(n=n.linksConnected;n.next();){var o=n.value;t.contains(o)||e.add(o)}}return e.iterator},i.Wz=function(){var t=this.yk();t.add(this);for(var e=new nt,i=t.iterator;i.next();){var n=i.value;if(n instanceof ec)for(n=n.linksConnected;n.next();){var o=n.value,r=o.fromNode;null===r||t.contains(r)&&r!==this||e.add(r),o=o.toNode,null===o||t.contains(o)&&o!==this||e.add(o)}}return e.iterator},i.Vz=function(){function t(e,i){null!==e&&(i.add(e),t(e.containingGroup,i))}var e=new nt;return t(this,e),e},i.yk=function(){var t=new nt;return Ju(t,this,!0,0,!0),t.remove(this),t},i.Ob=function(t){ec.prototype.Ob.call(this,t);for(var e=this.memberParts;e.next();)e.value.Ob(t)},bc.prototype.collapseSubGraph=function(){var t=this.diagram;if(null!==t&&!t.Le){t.Le=!0;var e=this.yk();Mc(this,e,t,this),t.Le=!1}},bc.prototype.expandSubGraph=function(){var t=this.diagram;if(null!==t&&!t.Le){t.Le=!0;var e=this.yk();Sc(this,e,t,this),t.Le=!1}},bc.prototype.move=function(t,e){void 0===e&&(e=!1);var i=e?this.location:this.position,n=i.x;i=i.y;var o=t.x,r=t.y;if(!(n===o||isNaN(n)&&isNaN(o))||!(i===r||isNaN(i)&&isNaN(r))){for(n=o-(isNaN(n)?0:n),i=r-(isNaN(i)?0:i),r=pt.alloc(),ec.prototype.move.call(this,t,e),t=new nt,e=this.yk().iterator;e.next();)o=e.value,o instanceof Nc&&(o.suspendsRouting&&t.add(o),o.ud||o.fromNode!==this&&o.toNode!==this)&&(o.suspendsRouting=!0);for(e.reset();e.next();)if(o=e.value,!(o.Ph()||o instanceof ec&&o.isLinkLabel)){var s=o.position,a=o.location;s.s()?(r.x=s.x+n,r.y=s.y+i,o.position=r):a.s()&&(r.x=a.x+n,r.y=a.y+i,o.location=r)}for(e.reset();e.next();)o=e.value,o instanceof Nc&&(o.suspendsRouting=t.contains(o),o.ud||o.fromNode!==this&&o.toNode!==this)&&(s=o.position,r.x=s.x+n,r.y=s.y+i,r.s()?o.move(r):o.Ua(),Bc(o)&&o.Ua());pt.free(r)}},d.Object.defineProperties(bc.prototype,{placeholder:{get:function(){return this.Sa}},computesBoundsAfterDrag:{get:function(){return 0!==(2048&this.P)},set:function(t){var e=0!==(2048&this.P);e!==t&&(this.P^=2048,this.g("computesBoundsAfterDrag",e,t))}},computesBoundsIncludingLinks:{get:function(){return 0!==(4096&this.P)},set:function(t){var e=0!==(4096&this.P);e!==t&&(this.P^=4096,this.g("computesBoundsIncludingLinks",e,t))}},computesBoundsIncludingLocation:{get:function(){return 0!==(8192&this.P)},set:function(t){var e=0!==(8192&this.P);e!==t&&(this.P^=8192,this.g("computesBoundsIncludingLocation",e,t))}},handlesDragDropForMembers:{get:function(){return 0!==(16384&this.P)},set:function(t){var e=0!==(16384&this.P);e!==t&&(this.P^=16384,this.g("handlesDragDropForMembers",e,t))}},memberParts:{get:function(){return this.Vo.iterator}},layout:{get:function(){return this.kc},set:function(t){var e=this.kc;if(e!==t){null!==e&&(e.diagram=null,e.group=null),this.kc=t;var i=this.diagram;null!==t&&(t.diagram=i,t.group=this),null!==i&&(i.Ng=!0),this.g("layout",e,t),null!==i&&i.Db()}}},memberAdded:{get:function(){return this.Uo},set:function(t){var e=this.Uo;e!==t&&(this.Uo=t,this.g("memberAdded",e,t))}},memberRemoved:{get:function(){return this.Wo},set:function(t){var e=this.Wo;e!==t&&(this.Wo=t,this.g("memberRemoved",e,t))}},memberValidation:{get:function(){return this.Ki},set:function(t){var e=this.Ki;e!==t&&(this.Ki=t,this.g("memberValidation",e,t))}},ungroupable:{get:function(){return 0!==(256&this.P)},set:function(t){var e=0!==(256&this.P);e!==t&&(this.P^=256,this.g("ungroupable",e,t))}},isSubGraphExpanded:{get:function(){return 0!==(512&this.P)},set:function(t){var e=0!==(512&this.P);if(e!==t){this.P^=512;var i=this.diagram;if(this.g("isSubGraphExpanded",e,t),e=this.subGraphExpandedChanged,null!==e){var n=!0;null!==i&&(n=i.Z,i.Z=!0),e(this),null!==i&&(i.Z=n)}null!==i&&i.undoManager.isUndoingRedoing?(null!==this.Sa&&this.Sa.o(),this.memberParts.each((function(t){t.updateAdornments()}))):t?this.expandSubGraph():this.collapseSubGraph()}}},wasSubGraphExpanded:{get:function(){return 0!==(1024&this.P)},set:function(t){var e=0!==(1024&this.P);e!==t&&(this.P^=1024,this.g("wasSubGraphExpanded",e,t))}},subGraphExpandedChanged:{get:function(){return this.eq},set:function(t){var e=this.eq;e!==t&&(this.eq=t,this.g("subGraphExpandedChanged",e,t))}},Rh:{get:function(){return 0!==(32768&this.P)},set:function(t){0!==(32768&this.P)!==t&&(this.P^=32768)}}}),bc.prototype.expandSubGraph=bc.prototype.expandSubGraph,bc.prototype.collapseSubGraph=bc.prototype.collapseSubGraph,bc.prototype.findSubGraphParts=bc.prototype.yk,bc.prototype.findContainingGroupChain=bc.prototype.Vz,bc.prototype.findExternalNodesConnected=bc.prototype.Wz,bc.prototype.findExternalLinksConnected=bc.prototype.Rv,bc.prototype.ensureBounds=bc.prototype.Ta,bc.className="Group",f(Pc,ca),Pc.prototype.cloneProtected=function(t){ca.prototype.cloneProtected.call(this,t),t.ib=this.ib.H(),t.Np=this.Np.copy()},Pc.prototype.Kh=function(t){if(null===this.background&&null===this.areaBackground)return!1;var e=this.naturalBounds;return _t(0,0,e.width,e.height,t.x,t.y)},Pc.prototype.Hm=function(){var t=this.part;if(null!==t&&(t instanceof bc||t instanceof Qu)||w("Placeholder is not inside a Group or Adornment."),t instanceof bc){var e=this.computeBorder(this.Np),i=this.minSize,n=this.rc;for(Vt(n,(isFinite(i.width)?Math.max(i.width,e.width):e.width)||0,(isFinite(i.height)?Math.max(i.height,e.height):e.height)||0),pa(this,0,0,n.width,n.height),n=t.memberParts,i=!1;n.next();)if(n.value.isVisible()){i=!0;break}n=t.diagram,!i||null===n||n.animationManager.ew(t)||isNaN(e.x)||isNaN(e.y)||(i=pt.alloc(),i.tj(e,t.locationSpot),i.w(t.location)||(t.location=new pt(i.x,i.y)),pt.free(i))}else{e=this.rc,i=this.ib,n=i.left+i.right;var o=i.top+i.bottom,r=t.adornedObject;t.angle=r.lj();var s=0;r instanceof Nl&&(s=r.strokeWidth);var a=r.Af(),h=r.naturalBounds,l=(h.width+s)*a;s=(h.height+s)*a,t.type!==Uh.Link&&(r=r.da("Selection"===t.category?ne:t.locationSpot,pt.alloc()),t.location=r,pt.free(r)),isNaN(l)||isNaN(s)?(t=t.adornedObject,l=t.da(ne,pt.alloc()),r=zt.allocAt(l.x,l.y,0,0),r.Oe(t.da(ce,l)),r.Oe(t.da(re,l)),r.Oe(t.da(le,l)),Vt(e,r.width+n||0,r.height+o||0),pa(this,-i.left,-i.top,e.width,e.height),pt.free(l),zt.free(r)):(Vt(e,l+n||0,s+o||0),pa(this,-i.left,-i.top,e.width,e.height))}},Pc.prototype.Ih=function(t,e,i,n){this.actualBounds.h(t,e,i,n)},Pc.prototype.computeBorder=function(t){var e=this.part,i=e.diagram;if(null!==i&&e instanceof bc&&!e.layer.isTemporary&&e.computesBoundsAfterDrag&&this.Np.s()){var n=i.toolManager.findTool("Dragging");if(n===i.currentTool&&(i=n.computeBorder(e,this.Np,t),null!==i))return i}i=zt.alloc(),n=this.computeMemberBounds(i);var o=this.ib;return e instanceof bc&&!e.isSubGraphExpanded?t.h(n.x-o.left,n.y-o.top,0,0):t.h(n.x-o.left,n.y-o.top,Math.max(n.width+o.left+o.right,0),Math.max(n.height+o.top+o.bottom,0)),zt.free(i),e instanceof bc&&e.computesBoundsIncludingLocation&&e.location.s()&&t.Oe(e.location),t},Pc.prototype.computeMemberBounds=function(t){if(!(this.part instanceof bc))return t.h(0,0,0,0),t;for(var e=this.part,i=1/0,n=1/0,o=-1/0,r=-1/0,s=e.memberParts;s.next();){var a=s.value;if(a.isVisible()){if(a instanceof Nc){if(!e.computesBoundsIncludingLinks)continue;if(La(a))continue;if(a.fromNode===e||a.toNode===e)continue}a=a.actualBounds,a.left<i&&(i=a.left),a.top<n&&(n=a.top),a.right>o&&(o=a.right),a.bottom>r&&(r=a.bottom)}}return isFinite(i)&&isFinite(n)?t.h(i,n,o-i,r-n):(e=e.location,t.h(e.x,e.y,0,0)),t},d.Object.defineProperties(Pc.prototype,{padding:{get:function(){return this.ib},set:function(t){"number"===typeof t&&(t=new Qt(t));var e=this.ib;e.w(t)||(this.ib=t=t.H(),this.g("padding",e,t),this.o())}}}),Pc.className="Placeholder",f(Nc,Lu),Nc.prototype.cloneProtected=function(t){Lu.prototype.cloneProtected.call(this,t),t.Ga=-113&this.Ga,t.Xe=this.Xe,t.fo=this.fo,t.sf=this.sf,t.mq=this.mq,t.Yk=this.Yk,t.Hn=this.Hn,t.Jn=this.Jn,t.Kn=this.Kn,t.ck=this.ck,t.Zp=this.Zp,null!==this.O&&(t.O=this.O.copy())},i=Nc.prototype,i.yf=function(t){Lu.prototype.yf.call(this,t),this.Xe=t.Xe,this.sf=t.sf,t.ph=null,t.Ua(),t.Mf=this.Mf;var e=t.fromPort;null!==e&&rc(e),t=t.toPort,null!==t&&rc(t)},i.jb=function(t){t.classType===Nc?2===(2&t.value)?this.routing=t:t===ef||t===nf||t===of?this.curve=t:t===rf||t===sf||t===af?this.adjusting=t:t!==$c&&t!==tf&&w("Unknown Link enum value for a Link property: "+t):Lu.prototype.jb.call(this,t)},i.Kc=function(){null===this.O&&(this.O=new Rf)},i.rj=function(){var t=this.fromNode;if(null!==t){var e=t.findVisibleNode();if(null!==e&&(t=e),Oa(t)||Yu(t))return!1}return t=this.toNode,null===t||(e=t.findVisibleNode(),null!==e&&(t=e),!Oa(t)&&!Yu(t))},i.Ew=function(){return!1},i.lu=function(){},i.Nc=function(){return!1},Nc.prototype.computeAngle=function(t,e,i){return Nc.computeAngle(e,i)},Nc.computeAngle=function(t,e){switch(t){default:case tf:t=0;break;case hf:t=e;break;case lf:t=e+90;break;case uf:t=e-90;break;case cf:t=e+180;break;case ff:t=_e.Tq(e),90<t&&270>t&&(t-=180);break;case df:t=_e.Tq(e+90),90<t&&270>t&&(t-=180);break;case pf:t=_e.Tq(e-90),90<t&&270>t&&(t-=180);break;case gf:if(t=_e.Tq(e),45<t&&135>t||225<t&&315>t)return 0;90<t&&270>t&&(t-=180)}return _e.Tq(t)},i=Nc.prototype,i.Oh=function(){var t=this.containingGroup;null!==t&&this.fromNode!==t&&this.toNode!==t&&t.computesBoundsIncludingLinks&&Lu.prototype.Oh.call(this)},i.Kq=function(t){var e=this.fromNode;return t===e?this.toNode:e},i.nA=function(t){var e=this.fromPort;return t===e?this.toPort:e},i.Mq=function(t){if(Lu.prototype.Mq.call(this,t),Xc(this)&&this.Oq(this.actualBounds),!t){t=this.We;var e=null;null!==t&&(e=this.fromPort,ac(t,this,e));var i=this.rf;if(null!==i){var n=this.toPort;i===t&&n===e||ac(i,this,n)}Kc(this)}},i.Nq=function(t){if(Lu.prototype.Nq.call(this,t),Xc(this)&&this.Oq(this.actualBounds),!t){t=this.We;var e=null;null!==t&&(e=this.fromPort,hc(t,this,e));var i=this.rf;if(null!==i){var n=this.toPort;i===t&&n===e||hc(i,this,n)}Hc(this)}},i.uk=function(){if(this.ud=!0,null!==this.nd){var t=this.diagram;if(null!==t)for(var e=this.nd.copy().iterator;e.next();)t.remove(e.value)}null!==this.data&&(t=this.diagram,null!==t&&t.partManager.removeDataForLink(this))},Nc.prototype.updateRelationshipsFromData=function(){if(null!==this.data){var t=this.diagram;null!==t&&t.partManager.updateRelationshipsFromData(this)}},Nc.prototype.move=function(t,e){var i=e?this.location:this.position,n=i.x;isNaN(n)&&(n=0);var o=i.y;for(isNaN(o)&&(o=0),n=t.x-n,o=t.y-o,!0===e?Lu.prototype.move.call(this,t,!1):(t=pt.allocAt(i.x+n,i.y+o),Lu.prototype.move.call(this,t,!1),pt.free(t)),Ac(this,n,o),t=this.labelNodes;t.next();)e=t.value,i=e.position,e.moveTo(i.x+n,i.y+o)},Nc.prototype.canRelinkFrom=function(){if(!this.relinkableFrom)return!1;var t=this.layer;return null===t||!!t.allowRelink&&(t=t.diagram,!(null!==t&&!t.allowRelink))},Nc.prototype.canRelinkTo=function(){if(!this.relinkableTo)return!1;var t=this.layer;return null===t||!!t.allowRelink&&(t=t.diagram,!(null!==t&&!t.allowRelink))},Nc.prototype.computeMidPoint=function(t){var e=this.pointsCount;if(0===e)return t.assign(Dt),t;if(1===e)return t.assign(this.i(0)),t;if(2===e){var i=this.i(0),n=this.i(1);return t.h((i.x+n.x)/2,(i.y+n.y)/2),t}if(this.isOrthogonal&&(15<=this.computeCorner()||this.computeCurve()===ef))return this.na.Xv(.5,t),t.add(this.i(0)),i=this.na.figures.first(),t.offset(-i.startX,-i.startY),t;if(this.computeCurve()===ef){if(3===e)return this.i(1);if(n=(e-1)/3|0,i=3*(n/2|0),1===n%2){n=this.i(i);var o=this.i(i+1),r=this.i(i+2);i=this.i(i+3),_e.yz(n.x,n.y,o.x,o.y,r.x,r.y,i.x,i.y,t)}else t.assign(this.i(i));return t}var s=this.flattenedLengths;for(i=this.flattenedTotalLength,o=r=n=0;n<i/2&&r<e;){if(o=s[r],n+o>i/2)break;n+=o,r++}return e=this.i(r),r=this.i(r+1),1>Math.abs(e.x-r.x)?e.y>r.y?t.h(e.x,e.y-(i/2-n)):t.h(e.x,e.y+(i/2-n)):1>Math.abs(e.y-r.y)?e.x>r.x?t.h(e.x-(i/2-n),e.y):t.h(e.x+(i/2-n),e.y):(i=(i/2-n)/o,t.h(e.x+i*(r.x-e.x),e.y+i*(r.y-e.y))),t},Nc.prototype.computeMidAngle=function(){var t=this.pointsCount;if(2>t)return NaN;if(2===t)return this.i(0).Pa(this.i(1));if(this.isOrthogonal&&(15<=this.computeCorner()||this.computeCurve()===ef))return this.na.vy(.5);if(this.computeCurve()===ef&&4<=t){var e=(t-1)/3|0,i=3*(e/2|0);if(1===e%2){i=Math.floor(i),t=this.i(i),e=this.i(i+1);var n=this.i(i+2);return i=this.i(i+3),_e.xz(t.x,t.y,e.x,e.y,n.x,n.y,i.x,i.y)}if(0<i&&i+1<t)return this.i(i-1).Pa(this.i(i+1))}e=this.flattenedLengths,n=this.flattenedTotalLength;var o,r=0;for(i=0;r<n/2&&i<t;){if(o=e[i],r+o>n/2)break;r+=o,i++}if(e=this.i(i),n=this.i(i+1),1>Math.abs(e.x-n.x)&&1>Math.abs(e.y-n.y)){if(0<i&&i+2<t)return this.i(i-1).Pa(this.i(i+2))}else{if(1>Math.abs(e.x-n.x))return e.y>n.y?270:90;if(1>Math.abs(e.y-n.y))return e.x>n.x?180:0}return e.Pa(n)},i=Nc.prototype,i.i=function(t){return this.Ab.j[t]},i.Qc=function(t,e){this.Ab.Pc(t,e)},i.L=function(t,e,i){this.Ab.Pc(t,new pt(e,i))},i.wA=function(t,e){this.Ab.wb(t,e)},i.m=function(t,e,i){this.Ab.wb(t,new pt(e,i))},i.ce=function(t){this.Ab.add(t)},i.vf=function(t,e){this.Ab.add(new pt(t,e))},i.uw=function(t){this.Ab.cb(t)},i.pk=function(){this.Ab.clear()},i.Th=function(){null===this.ph&&(this.ph=this.Ab,this.Ab=this.Ab.copy())},i.xf=function(){if(null!==this.ph){for(var t=this.ph,e=this.Ab,i=1/0,n=1/0,o=t.j,r=o.length,s=0;s<r;s++){var a=o[s];i=Math.min(a.x,i),n=Math.min(a.y,n)}a=s=1/0;for(var h=e.j,l=h.length,u=0;u<l;u++){var c=h[u];s=Math.min(c.x,s),a=Math.min(c.y,a),c.freeze()}if(e.freeze(),l===r){for(r=0;r<l;r++)if(u=o[r],c=h[r],u.x-i!==c.x-s||u.y-n!==c.y-a){this.dc();break}}else this.dc();this.ph=null,i=this.diagram,null!==i&&i.animationManager.sc&&(i=i.animationManager,this.jf=e,i.$l.add(this)),Lc(this),this.g("points",t,e)}},i.yw=function(){null!==this.ph&&(this.Ab=this.ph,this.ph=null)},i.Ua=function(){if(!this.suspendsRouting){var t=this.diagram;if(t){if(t.Yt.contains(this)||t.undoManager.isUndoingRedoing)return;if(t=t.animationManager,t.isTicking&&!t.isAnimating)return;null!==this.jf&&!t.isTicking&&t.isAnimating&&(this.jf=null)}t=this.path,null!==t&&(this.ud=!1,this.o(),t.o())}},i.xj=function(){if(!this.ud&&!this.Ct){var t=!0;try{this.Ct=!0,this.Th(),t=this.computePoints()}catch(e){this.Ct=!1,this.yw()}finally{this.Ct=!1,t?this.xf():this.yw()}}},Nc.prototype.computePoints=function(){if(null===this.diagram)return!1;var t=this.fromNode,e=null;if(null===t?(_c||(_c=new ec,_c.desiredSize=kt,_c.Ta()),this.defaultFromPoint&&(_c.location=this.defaultFromPoint,_c.Ta(),e=t=_c)):e=this.fromPort,null!==e&&!t.isVisible()){var i=t.findVisibleNode();null!==i&&i!==t?(t=i,e=i.port):t=i}if(this.Mx=t,null===t||!t.location.s())return!1;for(;!(null===e||e.actualBounds.s()&&e.Gf());)e=e.panel;if(null===e)return!1;var n=this.toNode,o=null;if(null===n?(Wc||(Wc=new ec,Wc.desiredSize=kt,Wc.Ta()),this.defaultToPoint&&(Wc.location=this.defaultToPoint,Wc.Ta(),o=n=Wc)):o=this.toPort,null===o||n.isVisible()||(i=n.findVisibleNode(),null!==i&&i!==n?(n=i,o=i.port):n=i),this.Nx=n,null===n||!n.location.s())return!1;for(;!(null===o||o.actualBounds.s()&&o.Gf());)o=o.panel;if(null===o)return!1;var r=this.pointsCount,s=this.computeSpot(!0,e);i=this.computeSpot(!1,o);var a=Dc(s),h=Dc(i),l=e===o&&null!==e,u=this.isOrthogonal,c=this.curve===ef;this.Vf=!(!l||u)&&(c=!0);var f=this.computeAdjusting()===tf||l;if(!u&&!l&&a&&h){if(a=!1,!f&&3<=r&&(f=this.getLinkPoint(t,e,s,!0,!1,n,o),h=this.getLinkPoint(n,o,i,!1,!1,t,e),a=this.adjustPoints(0,f,r-1,h))&&(f=this.getLinkPoint(t,e,s,!0,!1,n,o),h=this.getLinkPoint(n,o,i,!1,!1,t,e),this.adjustPoints(0,f,r-1,h)),!a)if(this.pk(),c){r=this.getLinkPoint(t,e,s,!0,!1,n,o),f=this.getLinkPoint(n,o,i,!1,!1,t,e),a=f.x-r.x,h=f.y-r.y,l=this.computeCurviness(),c=u=0;var d=r.x+a/3,p=r.y+h/3,g=d,y=p;_e.A(h,0)?y=0<a?y-l:y+l:(u=-a/h,c=Math.sqrt(l*l/(u*u+1)),0>l&&(c=-c),g=(0>h?-1:1)*c+d,y=u*(g-d)+p),d=r.x+2*a/3,p=r.y+2*h/3;var m=d,v=p;_e.A(h,0)?v=0<a?v-l:v+l:(m=(0>h?-1:1)*c+d,v=u*(m-d)+p),this.pk(),this.ce(r),this.vf(g,y),this.vf(m,v),this.ce(f),this.Qc(0,this.getLinkPoint(t,e,s,!0,!1,n,o)),this.Qc(3,this.getLinkPoint(n,o,i,!1,!1,t,e))}else r=n,f=o,n=this.getLinkPoint(t,e,s,!0,!1,r,f),o=this.getLinkPoint(r,f,i,!1,!1,t,e),this.hasCurviness()?(f=o.x-n.x,i=o.y-n.y,s=this.computeCurviness(),t=n.x+f/2,e=n.y+i/2,r=t,a=e,_e.A(i,0)?a=0<f?a-s:a+s:(f=-f/i,r=Math.sqrt(s*s/(f*f+1)),0>s&&(r=-r),r=(0>i?-1:1)*r+t,a=f*(r-t)+e),this.ce(n),this.vf(r,a),this.ce(o)):(this.ce(n),this.ce(o),a=zt.alloc(),e.mj(a),h=a.$(o),f.mj(a),l=a.$(n),(h||l)&&(s=e.da(Fc(s),new pt),this.Qc(0,this.getLinkPointFromPoint(t,e,s,o,!0,s)),i=f.da(Fc(i),new pt),this.Qc(1,this.getLinkPointFromPoint(r,f,i,n,!1,i))),zt.free(a))}else{c=this.isAvoiding,f&&(u&&c||l)&&this.pk();var x=l?this.computeCurviness():0;c=this.getLinkPoint(t,e,s,!0,u,n,o),d=g=p=0,(u||!a||l)&&(y=this.computeEndSegmentLength(t,e,s,!0),d=this.getLinkDirection(t,e,c,s,!0,u,n,o),l&&(a||s.w(i)||!u&&1===s.x+i.x&&1===s.y+i.y)&&(d-=u?90:30,0>x&&(d-=180)),0>d?d+=360:360<=d&&(d-=360),l&&(y+=Math.abs(x)*(u?1:2)),0===d?p=y:90===d?g=y:180===d?p=-y:270===d?g=-y:(p=y*Math.cos(d*Math.PI/180),g=y*Math.sin(d*Math.PI/180)),s.nc()&&l&&(y=e.da(ae,pt.alloc()),m=pt.allocAt(y.x+1e3*p,y.y+1e3*g),this.getLinkPointFromPoint(t,e,y,m,!0,c),pt.free(y),pt.free(m))),y=this.getLinkPoint(n,o,i,!1,u,t,e);var b=v=m=0;if(u||!h||l){var w=this.computeEndSegmentLength(n,o,i,!1);b=this.getLinkDirection(n,o,y,i,!1,u,t,e),l&&(h||s.w(i)||!u&&1===s.x+i.x&&1===s.y+i.y)&&(b+=u?0:30,0>x&&(b+=180)),0>b?b+=360:360<=b&&(b-=360),l&&(w+=Math.abs(x)*(u?1:2)),0===b?m=w:90===b?v=w:180===b?m=-w:270===b?v=-w:(m=w*Math.cos(b*Math.PI/180),v=w*Math.sin(b*Math.PI/180)),i.nc()&&l&&(i=o.da(ae,pt.alloc()),s=pt.allocAt(i.x+1e3*m,i.y+1e3*v),this.getLinkPointFromPoint(n,o,i,s,!1,y),pt.free(i),pt.free(s))}i=c,(u||!a||l)&&(i=new pt(c.x+p,c.y+g)),s=y,(u||!h||l)&&(s=new pt(y.x+m,y.y+v)),!f&&!u&&a&&3<r&&this.adjustPoints(0,c,r-2,s)?this.Qc(r-1,y):!f&&!u&&h&&3<r&&this.adjustPoints(1,i,r-1,y)?this.Qc(0,c):!f&&(u?6<=r:4<r)&&this.adjustPoints(1,i,r-2,s)?(this.Qc(0,c),this.Qc(r-1,y)):(this.pk(),this.ce(c),(u||!a||l)&&this.ce(i),u&&this.addOrthoPoints(i,d,s,b,t,n),(u||!h||l)&&this.ce(s),this.ce(y))}return!0},Nc.prototype.getLinkPointFromPoint=function(t,e,i,n,o,r){if(void 0===r&&(r=new pt),null===t||null===e)return r.assign(i),r;if(t.isVisible()||(o=t.findVisibleNode(),null!==o&&o!==t&&(e=o.port)),t=null,o=e.panel,null===o||o.he()||(o=o.panel),null===o){o=n.x,n=n.y;var s=i.x;i=i.y}else{t=o.Fd,o=1/(t.m11*t.m22-t.m12*t.m21),s=t.m22*o;var a=-t.m12*o,h=-t.m21*o,l=t.m11*o,u=o*(t.m21*t.dy-t.m22*t.dx),c=o*(t.m12*t.dx-t.m11*t.dy);o=n.x*s+n.y*h+u,n=n.x*a+n.y*l+c,s=i.x*s+i.y*h+u,i=i.x*a+i.y*l+c}return e.zk(o,n,s,i,r),null!==t&&r.transform(t),r},Nc.prototype.getLinkPoint=function(t,e,i,n,o,r,s,a){if(void 0===a&&(a=new pt),i.kb()&&!Dc(i))return e.da(i,a),a;if(i.Oc()){var h=Oc(this,e);if(null!==h){if(a.assign(h.Qq),o&&this.routing===Qc){var l=Oc(this,s);if(null!==l&&h.wm<l.wm){h=pt.alloc(),l=pt.alloc();var u=new zt(e.da(ne,h),e.da(ce,l)),c=this.computeSpot(!n,s);t=this.getLinkPoint(r,s,c,!n,o,t,e,l),(i.Ef(de)||i.Ef(pe))&&t.y>=u.y&&t.y<=u.y+u.height?a.y=t.y:(i.Ef(fe)||i.Ef(ge))&&t.x>=u.x&&t.x<=u.x+u.width&&(a.x=t.x),pt.free(h),pt.free(l)}}return a}}return i=e.da(Fc(i),pt.alloc()),this.pointsCount>(o?6:2)?(s=n?this.i(1):this.i(this.pointsCount-2),o&&(s=jc(i,s.copy()))):(h=this.computeSpot(!n,s),r=pt.alloc(),s=s.da(Fc(h),r),o&&(s=jc(i,s)),pt.free(r)),this.getLinkPointFromPoint(t,e,i,s,n,a),pt.free(i),a},Nc.prototype.getLinkDirection=function(t,e,i,n,o,r,s,a){t:if(n.kb())var h=n.x>n.y?n.x>1-n.y?0:n.x<1-n.y?270:315:n.x<n.y?n.x>1-n.y?90:n.x<1-n.y?180:135:.5>n.x?225:.5<n.x?45:0;else{if(n.Oc()&&(h=Oc(this,e),null!==h))switch(h.Ac){case 1:h=270;break t;case 2:h=180;break t;default:case 4:h=0;break t;case 8:h=90;break t}h=e.da(ae,pt.alloc()),this.pointsCount>(r?6:2)?(a=o?this.i(1):this.i(this.pointsCount-2),a=r?jc(h,a.copy()):i):(i=pt.alloc(),a=a.da(ae,i),pt.free(i)),i=Math.abs(a.x-h.x)>Math.abs(a.y-h.y)?a.x>=h.x?0:180:a.y>=h.y?90:270,pt.free(h),h=i}return n.nc()&&s.Kd(t)&&(h+=180,360<=h&&(h-=360)),Dc(n)?h:(t=e.lj(),0===t||(45<=t&&135>t?h+=90:135<=t&&225>t?h+=180:225<=t&&315>t&&(h+=270),360<=h&&(h-=360)),h)},Nc.prototype.computeEndSegmentLength=function(t,e,i,n){return null!==e&&i.Oc()&&(t=Oc(this,e),null!==t)?t.Pv:(t=n?this.fromEndSegmentLength:this.toEndSegmentLength,null!==e&&isNaN(t)&&(t=n?e.fromEndSegmentLength:e.toEndSegmentLength),isNaN(t)&&(t=10),t)},Nc.prototype.computeSpot=function(t,e){return void 0===e&&(e=null),t?(t=e||this.fromPort,null===t?t=ae:(e=this.fromSpot,e.Mb()&&(e=t.fromSpot),t=e===Ce?ie:e)):(t=e||this.toPort,null===t?t=ae:(e=this.toSpot,e.Mb()&&(e=t.toSpot),t=e===Ce?ie:e)),t},Nc.prototype.computeOtherPoint=function(t,e){return this.computeAdjusting()!==tf&&4<this.pointsCount?this.computeMidPoint(new pt):(t=e.yp,t=null!==t?If(t,this):null,null!==t?t.Qq:e.da(ae))},Nc.prototype.computeShortLength=function(t){if(t){if(t=this.fromShortLength,isNaN(t)){var e=this.fromPort;null!==e&&(t=e.fromShortLength)}return isNaN(t)?0:t}return t=this.toShortLength,isNaN(t)&&(e=this.toPort,null!==e&&(t=e.toShortLength)),isNaN(t)?0:t},Nc.prototype.zf=function(t,e,i,n,o,r){if(!1===this.pickable)return!1;void 0===e&&(e=null),void 0===i&&(i=null);var s=r;if(void 0===r&&(s=Ke.alloc(),s.reset()),s.multiply(this.transform),this.Jh(t,s))return nl(this,e,i,o),void 0===r&&Ke.free(s),!0;if(this.Mc(t,s)){var a=!1;if(!this.isAtomic)for(var h=this.W.j,l=h.length;l--;){var u=h[l];if(u.visible||u===this.locationObject){var c=u.actualBounds,f=this.naturalBounds;if(!(c.x>f.width||c.y>f.height||0>c.x+c.width||0>c.y+c.height)){if(c=Ke.alloc(),c.set(s),u instanceof Uh)a=u.zf(t,e,i,n,o,c);else if(this.path===u){if(u instanceof Nl)if(a=t,f=n,!1===u.pickable)a=!1;else if(c.multiply(u.transform),f)t:{var d=a,p=c;if(u.Jh(d,p))a=!0;else{if(void 0===p&&(p=u.transform,d.Ge(u.actualBounds))){a=!0;break t}a=d.left,f=d.right;var g=d.top;d=d.bottom;var y=pt.alloc(),m=pt.alloc(),v=pt.alloc(),x=Ke.alloc();x.set(p),x.jw(u.transform),x.St(),m.x=f,m.y=g,m.transform(x),y.x=a,y.y=g,y.transform(x),p=!1,jl(u,y,m,v)?p=!0:(y.x=f,y.y=d,y.transform(x),jl(u,y,m,v)?p=!0:(m.x=a,m.y=d,m.transform(x),jl(u,y,m,v)?p=!0:(y.x=a,y.y=g,y.transform(x),jl(u,y,m,v)&&(p=!0)))),Ke.free(x),pt.free(y),pt.free(m),pt.free(v),a=p}}else a=u.Jh(a,c)}else a=ga(u,t,n,c);a&&(f=u,null!==e&&(f=e(u)),f&&(null===i||i(f))&&o.add(f)),Ke.free(c)}}}return void 0===r&&Ke.free(s),a||null!==this.background||null!==this.areaBackground}return void 0===r&&Ke.free(s),!1},Nc.prototype.computeCurve=function(){if(null===this.Vf){var t=this.fromPort,e=this.isOrthogonal;this.Vf=null!==t&&t===this.toPort&&!e}return this.Vf?ef:this.curve},Nc.prototype.computeCorner=function(){if(this.curve===ef)return 0;var t=this.corner;return(isNaN(t)||0>t)&&(t=10),t},Nc.prototype.findMidLabel=function(){for(var t=this.path,e=this.W.j,i=e.length,n=0;n<i;n++){var o=e[n];if(o!==t&&!o.isPanelMain&&(-1/0===o.segmentIndex||isNaN(o.segmentIndex)))return o}for(t=this.labelNodes;t.next();)if(e=t.value,-1/0===e.segmentIndex||isNaN(e.segmentIndex))return e;return null},Nc.prototype.computeSpacing=function(){if(!this.isVisible())return 0;var t=mf;t=Math.max(t,this.computeThickness());var e=this.fromPort,i=this.toPort;if(null!==e&&null!==i){var n=this.findMidLabel();if(null!==n){var o=n.naturalBounds,r=n.margin,s=isNaN(o.width)?30:o.width*n.scale+r.left+r.right;o=isNaN(o.height)?14:o.height*n.scale+r.top+r.bottom,n=n.segmentOrientation,n===hf||n===ff||n===cf?t=Math.max(t,o):n===uf||n===pf||n===lf||n===df?t=Math.max(t,s):(e=e.da(ae).Pa(i.da(ae))/180*Math.PI,t=Math.max(t,Math.abs(Math.sin(e)*s)+Math.abs(Math.cos(e)*o)+1)),this.curve===ef&&(t*=1.333)}}return t},Nc.prototype.arrangeBundledLinks=function(t,e){if(e)for(e=0;e<t.length;e++){var i=t[e];i.computeAdjusting()===tf&&i.Ua()}},Nc.prototype.computeCurviness=function(){var t=this.curviness;if(isNaN(t)){t=yf;var e=this.Mf;if(null!==e){for(var i=j(),n=0,o=e.links,r=0;r<o.length;r++){var s=o[r].computeSpacing();i.push(s),n+=s}for(n=-n/2,r=0;r<o.length;r++){if(o[r]===this){t=n+i[r]/2;break}n+=i[r]}e.au===this.fromNode&&(t=-t),O(i)}}return t},Nc.prototype.computeThickness=function(){if(!this.isVisible())return 0;var t=this.path;return null!==t?Math.max(t.strokeWidth,1):1},Nc.prototype.hasCurviness=function(){return!isNaN(this.curviness)||null!==this.Mf},Nc.prototype.adjustPoints=function(t,e,i,n){var o=this.computeAdjusting();if(this.isOrthogonal){if(o===sf)return!1;o===af&&(o=rf)}switch(o){case sf:var r=this.i(t),s=this.i(i);if(!r.Qa(e)||!s.Qa(n)){o=r.x,r=r.y;var a=s.x-o,h=s.y-r,l=Math.sqrt(a*a+h*h);if(!_e.aa(l,0)){if(_e.aa(a,0))var u=0>h?-Math.PI/2:Math.PI/2;else u=Math.atan(h/Math.abs(a)),0>a&&(u=Math.PI-u);s=e.x;var c=e.y;a=n.x-s;var f=n.y-c;for(h=Math.sqrt(a*a+f*f),_e.aa(a,0)?f=0>f?-Math.PI/2:Math.PI/2:(f=Math.atan(f/Math.abs(a)),0>a&&(f=Math.PI-f)),l=h/l,u=f-u,this.Qc(t,e),t+=1;t<i;t++)e=this.i(t),a=e.x-o,h=e.y-r,e=Math.sqrt(a*a+h*h),_e.aa(e,0)||(_e.aa(a,0)?h=0>h?-Math.PI/2:Math.PI/2:(h=Math.atan(h/Math.abs(a)),0>a&&(h=Math.PI-h)),a=h+u,e*=l,this.L(t,s+e*Math.cos(a),c+e*Math.sin(a)));this.Qc(i,n)}}return!0;case af:if(r=this.i(t),c=this.i(i),!r.Qa(e)||!c.Qa(n)){o=r.x,r=r.y,s=c.x,c=c.y,l=(s-o)*(s-o)+(c-r)*(c-r),a=e.x,u=e.y,h=n.x,f=n.y;var d=1;if(0!==h-a){var p=(f-u)/(h-a);d=Math.sqrt(1+1/(p*p))}else p=9e9;for(this.Qc(t,e),t+=1;t<i;t++){e=this.i(t);var g=e.x,y=e.y,m=.5;0!==l&&(m=((o-g)*(o-s)+(r-y)*(r-c))/l);var v=o+m*(s-o),x=r+m*(c-r);e=Math.sqrt((g-v)*(g-v)+(y-x)*(y-x)),y<p*(g-v)+x&&(e=-e),0<p&&(e=-e),g=a+m*(h-a),m=u+m*(f-u),0!==p?(e=g+e/d,this.L(t,e,m-(e-g)/p)):this.L(t,g,m+e)}this.Qc(i,n)}return!0;case rf:return this.isOrthogonal&&(o=this.i(t),r=this.i(t+1),s=this.i(t+2),a=r.x,u=r.y,c=a,l=u,_e.A(o.y,r.y)?_e.A(r.x,s.x)?u=e.y:_e.A(r.y,s.y)&&(a=e.x):_e.A(o.x,r.x)&&(_e.A(r.y,s.y)?a=e.x:_e.A(r.x,s.x)&&(u=e.y)),this.L(t+1,a,u),o=this.i(i),r=this.i(i-1),s=this.i(i-2),a=r.x,u=r.y,h=a,f=u,_e.A(o.y,r.y)?_e.A(r.x,s.x)?u=n.y:_e.A(r.y,s.y)&&(a=n.x):_e.A(o.x,r.x)&&(_e.A(r.y,s.y)?a=n.x:_e.A(r.x,s.x)&&(u=n.y)),this.L(i-1,a,u),Bc(this))?(this.L(t+1,c,l),this.L(i-1,h,f),i=!1):(this.Qc(t,e),this.Qc(i,n),i=!0),i;default:return!1}},Nc.prototype.addOrthoPoints=function(t,e,i,n,o,r){0>e?e+=360:360<=e&&(e-=360),0>n?n+=360:360<=n&&(n-=360);var s=n;e=315<=e||45>e?0:45<=e&&135>e?90:135<=e&&225>e?180:270,n=315<=n||45>n?0:45<=n&&135>n?90:135<=n&&225>n?180:270;var a=o.actualBounds.copy(),h=r.actualBounds.copy();if(a.s()&&h.s()){if(a.Jc(vf,vf),h.Jc(vf,vf),a.Oe(t),h.Oe(i),0===e)if(i.x>t.x||270===n&&i.y<t.y&&h.right>t.x||90===n&&i.y>t.y&&h.right>t.x){var l=new pt(i.x,t.y),u=new pt(i.x,(t.y+i.y)/2);180===n?(l.x=this.computeMidOrthoPosition(t.x,t.y,i.x,i.y,!1),u.x=l.x,u.y=i.y):270===n&&i.y<t.y||90===n&&i.y>t.y?(l.x=t.x<h.left?this.computeMidOrthoPosition(t.x,t.y,h.left,i.y,!1):t.x<h.right&&(270===n&&t.y<h.top||90===n&&t.y>h.bottom)?this.computeMidOrthoPosition(t.x,t.y,i.x,i.y,!1):h.right,u.x=l.x,u.y=i.y):0===n&&t.x<h.left&&t.y>h.top&&t.y<h.bottom&&(l.x=t.x,l.y=t.y<i.y?Math.min(i.y,h.top):Math.max(i.y,h.bottom),u.y=l.y)}else l=new pt(t.x,i.y),u=new pt((t.x+i.x)/2,i.y),(180===n||90===n&&i.y<a.top||270===n&&i.y>a.bottom)&&(180===n&&(h.$(t)||a.$(i))?l.y=this.computeMidOrthoPosition(t.x,t.y,i.x,i.y,!0):i.y<t.y&&(180===n||90===n)?l.y=this.computeMidOrthoPosition(t.x,a.top,i.x,Math.max(i.y,h.bottom),!0):i.y>t.y&&(180===n||270===n)&&(l.y=this.computeMidOrthoPosition(t.x,a.bottom,i.x,Math.min(i.y,h.top),!0)),u.x=i.x,u.y=l.y),l.y>a.top&&l.y<a.bottom&&(i.x>=a.left&&i.x<=t.x||t.x<=h.right&&t.x>=i.x?90!==n&&270!==n||(l=new pt(Math.max((t.x+i.x)/2,t.x),t.y),u=new pt(l.x,i.y)):(l.y=270===n||(0===n||180===n)&&i.y<t.y?Math.min(i.y,0===n?a.top:Math.min(a.top,h.top)):Math.max(i.y,0===n?a.bottom:Math.max(a.bottom,h.bottom)),u.x=i.x,u.y=l.y));else 180===e?i.x<t.x||270===n&&i.y<t.y&&h.left<t.x||90===n&&i.y>t.y&&h.left<t.x?(l=new pt(i.x,t.y),u=new pt(i.x,(t.y+i.y)/2),0===n?(l.x=this.computeMidOrthoPosition(t.x,t.y,i.x,i.y,!1),u.x=l.x,u.y=i.y):270===n&&i.y<t.y||90===n&&i.y>t.y?(l.x=t.x>h.right?this.computeMidOrthoPosition(t.x,t.y,h.right,i.y,!1):t.x>h.left&&(270===n&&t.y<h.top||90===n&&t.y>h.bottom)?this.computeMidOrthoPosition(t.x,t.y,i.x,i.y,!1):h.left,u.x=l.x,u.y=i.y):180===n&&t.x>h.right&&t.y>h.top&&t.y<h.bottom&&(l.x=t.x,l.y=t.y<i.y?Math.min(i.y,h.top):Math.max(i.y,h.bottom),u.y=l.y)):(l=new pt(t.x,i.y),u=new pt((t.x+i.x)/2,i.y),(0===n||90===n&&i.y<a.top||270===n&&i.y>a.bottom)&&(0===n&&(h.$(t)||a.$(i))?l.y=this.computeMidOrthoPosition(t.x,t.y,i.x,i.y,!0):i.y<t.y&&(0===n||90===n)?l.y=this.computeMidOrthoPosition(t.x,a.top,i.x,Math.max(i.y,h.bottom),!0):i.y>t.y&&(0===n||270===n)&&(l.y=this.computeMidOrthoPosition(t.x,a.bottom,i.x,Math.min(i.y,h.top),!0)),u.x=i.x,u.y=l.y),l.y>a.top&&l.y<a.bottom&&(i.x<=a.right&&i.x>=t.x||t.x>=h.left&&t.x<=i.x?90!==n&&270!==n||(l=new pt(Math.min((t.x+i.x)/2,t.x),t.y),u=new pt(l.x,i.y)):(l.y=270===n||(0===n||180===n)&&i.y<t.y?Math.min(i.y,180===n?a.top:Math.min(a.top,h.top)):Math.max(i.y,180===n?a.bottom:Math.max(a.bottom,h.bottom)),u.x=i.x,u.y=l.y))):90===e?i.y>t.y||180===n&&i.x<t.x&&h.bottom>t.y||0===n&&i.x>t.x&&h.bottom>t.y?(l=new pt(t.x,i.y),u=new pt((t.x+i.x)/2,i.y),270===n?(l.y=this.computeMidOrthoPosition(t.x,t.y,i.x,i.y,!0),u.x=i.x,u.y=l.y):180===n&&i.x<t.x||0===n&&i.x>t.x?(l.y=t.y<h.top?this.computeMidOrthoPosition(t.x,t.y,i.x,h.top,!0):t.y<h.bottom&&(180===n&&t.x<h.left||0===n&&t.x>h.right)?this.computeMidOrthoPosition(t.x,t.y,i.x,i.y,!0):h.bottom,u.x=i.x,u.y=l.y):90===n&&t.y<h.top&&t.x>h.left&&t.x<h.right&&(l.x=t.x<i.x?Math.min(i.x,h.left):Math.max(i.x,h.right),l.y=t.y,u.x=l.x)):(l=new pt(i.x,t.y),u=new pt(i.x,(t.y+i.y)/2),(270===n||0===n&&i.x<a.left||180===n&&i.x>a.right)&&(270===n&&(h.$(t)||a.$(i))?l.x=this.computeMidOrthoPosition(t.x,t.y,i.x,i.y,!1):i.x<t.x&&(270===n||0===n)?l.x=this.computeMidOrthoPosition(a.left,t.y,Math.max(i.x,h.right),i.y,!1):i.x>t.x&&(270===n||180===n)&&(l.x=this.computeMidOrthoPosition(a.right,t.y,Math.min(i.x,h.left),i.y,!1)),u.x=l.x,u.y=i.y),l.x>a.left&&l.x<a.right&&(i.y>=a.top&&i.y<=t.y||t.y<=h.bottom&&t.y>=i.y?0!==n&&180!==n||(l=new pt(t.x,Math.max((t.y+i.y)/2,t.y)),u=new pt(i.x,l.y)):(l.x=180===n||(90===n||270===n)&&i.x<t.x?Math.min(i.x,90===n?a.left:Math.min(a.left,h.left)):Math.max(i.x,90===n?a.right:Math.max(a.right,h.right)),u.x=l.x,u.y=i.y))):i.y<t.y||180===n&&i.x<t.x&&h.top<t.y||0===n&&i.x>t.x&&h.top<t.y?(l=new pt(t.x,i.y),u=new pt((t.x+i.x)/2,i.y),90===n?(l.y=this.computeMidOrthoPosition(t.x,t.y,i.x,i.y,!0),u.x=i.x,u.y=l.y):180===n&&i.x<t.x||0===n&&i.x>=t.x?(l.y=t.y>h.bottom?this.computeMidOrthoPosition(t.x,t.y,i.x,h.bottom,!0):t.y>h.top&&(180===n&&t.x<h.left||0===n&&t.x>h.right)?this.computeMidOrthoPosition(t.x,t.y,i.x,i.y,!0):h.top,u.x=i.x,u.y=l.y):270===n&&t.y>h.bottom&&t.x>h.left&&t.x<h.right&&(l.x=t.x<i.x?Math.min(i.x,h.left):Math.max(i.x,h.right),l.y=t.y,u.x=l.x)):(l=new pt(i.x,t.y),u=new pt(i.x,(t.y+i.y)/2),(90===n||0===n&&i.x<a.left||180===n&&i.x>a.right)&&(90===n&&(h.$(t)||a.$(i))?l.x=this.computeMidOrthoPosition(t.x,t.y,i.x,i.y,!1):i.x<t.x&&(90===n||0===n)?l.x=this.computeMidOrthoPosition(a.left,t.y,Math.max(i.x,h.right),i.y,!1):i.x>t.x&&(90===n||180===n)&&(l.x=this.computeMidOrthoPosition(a.right,t.y,Math.min(i.x,h.left),i.y,!1)),u.x=l.x,u.y=i.y),l.x>a.left&&l.x<a.right&&(i.y<=a.bottom&&i.y>=t.y||t.y>=h.top&&t.y<=i.y?0!==n&&180!==n||(l=new pt(t.x,Math.min((t.y+i.y)/2,t.y)),u=new pt(i.x,l.y)):(l.x=180===n||(90===n||270===n)&&i.x<t.x?Math.min(i.x,270===n?a.left:Math.min(a.left,h.left)):Math.max(i.x,270===n?a.right:Math.max(a.right,h.right)),u.x=l.x,u.y=i.y)));var c=l,f=u,d=i;if(this.isAvoiding){var p=this.diagram;if(null===p||o===r||this.layer.isTemporary||!os(p)||a.$(d)&&!r.Kd(o)||h.$(t)&&!o.Kd(r))e=!1;else{var g=rs(p,!0,this.containingGroup,null);if(17!==this.segmentIndex&&g.Ek(Math.min(t.x,c.x),Math.min(t.y,c.y),Math.abs(t.x-c.x),Math.abs(t.y-c.y))&&g.Ek(Math.min(c.x,f.x),Math.min(c.y,f.y),Math.abs(c.x-f.x),Math.abs(c.y-f.y))&&g.Ek(Math.min(f.x,d.x),Math.min(f.y,d.y),Math.abs(f.x-d.x),Math.abs(f.y-d.y)))e=!1;else{o=t,r=d;var y=i=null;if(p.isVirtualized){p=g.bounds.copy(),p.Jc(-g.zq,-g.yq);var m=pt.alloc();wf(g,t.x,t.y)||(_e.Cf(p.x,p.y,p.x+p.width,p.y+p.height,t.x,t.y,c.x,c.y,m)?(i=t=m.copy(),e=m.Pa(c)):_e.Cf(p.x,p.y,p.x+p.width,p.y+p.height,c.x,c.y,f.x,f.y,m)?(i=t=m.copy(),e=m.Pa(f)):_e.Cf(p.x,p.y,p.x+p.width,p.y+p.height,f.x,f.y,d.x,d.y,m)&&(i=t=m.copy(),e=m.Pa(d))),wf(g,d.x,d.y)||(_e.Cf(p.x,p.y,p.x+p.width,p.y+p.height,d.x,d.y,f.x,f.y,m)?(y=d=m.copy(),n=f.Pa(m)):_e.Cf(p.x,p.y,p.x+p.width,p.y+p.height,f.x,f.y,c.x,c.y,m)?(y=d=m.copy(),n=c.Pa(m)):_e.Cf(p.x,p.y,p.x+p.width,p.y+p.height,c.x,c.y,t.x,t.y,m)&&(y=d=m.copy(),n=t.Pa(m))),pt.free(m)}a=a.copy().Rc(h),a.Jc(g.zq*g.Wy,g.yq*g.Wy),Cf(g,t,e,d,n,a,!0),h=kf(g,d.x,d.y),!g.abort&&h>=jf&&(Mf(g),a.Jc(g.zq*g.Gy,g.yq*g.Gy),Cf(g,t,e,d,n,a,!1),h=kf(g,d.x,d.y)),!g.abort&&h<jf&&kf(g,d.x,d.y)!==Af?(Ic(this,g,d.x,d.y,n,!0,s),a=this.i(2),4>this.pointsCount?(0===e||180===e?(a.x=t.x,a.y=d.y):(a.x=d.x,a.y=t.y),this.L(2,a.x,a.y),this.m(3,a.x,a.y)):(s=this.i(3),0===e||180===e?_e.A(a.x,s.x)?(a=0===e?Math.max(a.x,t.x):Math.min(a.x,t.x),this.L(2,a,t.y),this.L(3,a,s.y)):_e.A(a.y,s.y)?(Math.abs(t.y-a.y)<=g.yq/2&&(this.L(2,a.x,t.y),this.L(3,s.x,t.y)),this.m(2,a.x,t.y)):this.L(2,t.x,a.y):90!==e&&270!==e||(_e.A(a.y,s.y)?(a=90===e?Math.max(a.y,t.y):Math.min(a.y,t.y),this.L(2,t.x,a),this.L(3,s.x,a)):_e.A(a.x,s.x)?(Math.abs(t.x-a.x)<=g.zq/2&&(this.L(2,t.x,a.y),this.L(3,t.x,s.y)),this.m(2,t.x,a.y)):this.L(2,a.x,t.y))),null!==i&&(t=this.i(1),s=this.i(2),t.x!==s.x&&t.y!==s.y?0===e||180===e?this.m(2,t.x,s.y):this.m(2,s.x,t.y):0===e||180===e?this.m(2,o.x,i.y):this.m(2,i.x,o.y)),null!==y&&(0===n||180===n?this.vf(r.x,y.y):this.vf(y.x,r.y)),e=!0):e=!1}}}else e=!1;e||(this.ce(l),this.ce(u))}},Nc.prototype.computeMidOrthoPosition=function(t,e,i,n,o){var r=0;return!this.hasCurviness()||this.computeSpot(!0,this.fromPort).Oc()||this.computeSpot(!1,this.toPort).Oc()||(r=this.computeCurviness()),o?(e+n)/2+r:(t+i)/2+r},Nc.prototype.Sz=function(t){var e=t.x;t=t.y;for(var i=this.i(0),n=this.i(1),o=xt(e,t,i.x,i.y,n.x,n.y),r=0,s=1;s<this.pointsCount-1;s++){i=this.i(s+1);var a=xt(e,t,n.x,n.y,i.x,i.y);n=i,a<o&&(r=s,o=a)}return r},Nc.prototype.dc=function(){this.$m=!1,this.o()},Nc.prototype.Gk=function(t){if(!t){if(!1===this.ud)return;if(t=this.tb(),this.$m&&(null===t||null!==t.geometry))return}if(this.na=this.makeGeometry(),t=this.path,null!==t){t.na=this.na;for(var e=this.W.j,i=e.length,n=0;n<i;n++){var o=e[n];o!==t&&o.isPanelMain&&o instanceof Nl&&(o.na=this.na)}}},Nc.prototype.makeGeometry=function(){var t=this.na,e=this.pointsCount;if(2>e)return t.type=si,this.$m=!0,t;var i=!1,n=this.diagram;null!==n&&Xc(this)&&n.Vg.contains(this)&&(0!==this.Yl.width||0!==this.Yl.height)&&(i=!0);var o=this.i(0).copy(),r=o.copy();n=this.Ab.j;var s=this.computeCurve();if(s===ef&&3<=e&&!_e.aa(this.smoothness,0))if(3===e){var a=this.i(1);n=Math.min(o.x,a.x);var h=Math.min(o.y,a.y);a=this.i(2),n=Math.min(n,a.x),h=Math.min(h,a.y)}else{if(this.isOrthogonal)for(h=0;h<e;h++)a=n[h],r.x=Math.min(a.x,r.x),r.y=Math.min(a.y,r.y);else for(n=3;n<e;n+=3)n+3>=e&&(n=e-1),h=this.i(n),r.x=Math.min(h.x,r.x),r.y=Math.min(h.y,r.y);n=r.x,h=r.y}else{for(h=0;h<e;h++)a=n[h],r.x=Math.min(a.x,r.x),r.y=Math.min(a.y,r.y);n=r.x,h=r.y}if(n-=this.vv.x,h-=this.vv.y,o.x-=n,o.y-=h,2!==e||Xc(this)){if(t.type=li,a=Cu(t),0!==this.computeShortLength(!0)&&(o=Rc(this,o,!0,r)),ku(a,o.x,o.y,!1),s===ef&&3<=e&&!_e.aa(this.smoothness,0))if(3===e)i=this.i(1),e=i.x-n,i=i.y-h,o=this.i(2).copy(),o.x-=n,o.y-=h,0!==this.computeShortLength(!1)&&(o=Rc(this,o,!1,r)),Su(a,e,i,e,i,o.x,o.y);else if(this.isOrthogonal){r=new pt(n,h),o=this.i(1).copy(),s=new pt(n,h),e=new pt(n,h),i=this.i(0);for(var l,u=this.smoothness/3,c=1;c<this.pointsCount-1;c++){l=this.i(c);var f=i,d=l,p=this.i(zc(this,l,c,!1));if((!_e.aa(f.x,d.x)||!_e.aa(d.x,p.x))&&(!_e.aa(f.y,d.y)||!_e.aa(d.y,p.y))){var g=u;isNaN(g)&&(g=this.smoothness/3);var y=f.x;f=f.y;var m=d.x;d=d.y;var v=p.x;p=p.y;var x=g*Ec(y,f,m,d);g*=Ec(m,d,v,p),_e.aa(f,d)&&_e.aa(m,v)&&(m>y?p>d?(s.x=m-x,s.y=d-x,e.x=m+g,e.y=d+g):(s.x=m-x,s.y=d+x,e.x=m+g,e.y=d-g):p>d?(s.x=m+x,s.y=d-x,e.x=m-g,e.y=d+g):(s.x=m+x,s.y=d+x,e.x=m-g,e.y=d-g)),_e.aa(y,m)&&_e.aa(d,p)&&(d>f?(v>m?(s.x=m-x,s.y=d-x,e.x=m+g):(s.x=m+x,s.y=d-x,e.x=m-g),e.y=d+g):(v>m?(s.x=m-x,s.y=d+x,e.x=m+g):(s.x=m+x,s.y=d+x,e.x=m-g),e.y=d-g)),(_e.aa(y,m)&&_e.aa(m,v)||_e.aa(f,d)&&_e.aa(d,p))&&(y=.5*(y+v),f=.5*(f+p),s.x=y,s.y=f,e.x=y,e.y=f),(1===c||2===c&&_e.aa(i.x,this.i(0).x)&&_e.aa(i.y,this.i(0).y))&&(o.x=.5*(i.x+l.x),o.y=.5*(i.y+l.y)),Su(a,o.x-n,o.y-h,s.x-n,s.y-h,l.x-n,l.y-h),r.set(s),o.set(e),i=l}}r=i.x,i=i.y,o=this.i(this.pointsCount-1),0!==this.computeShortLength(!1)&&(o=Rc(this,o.copy(),!1,At)),r=.5*(r+o.x),i=.5*(i+o.y),Su(a,e.x-n,e.y-h,r-n,i-h,o.x-n,o.y-h)}else for(i=3;i<e;i+=3)r=this.i(i-2),i+3>=e&&(i=e-1),o=this.i(i-1),s=this.i(i),i===e-1&&0!==this.computeShortLength(!1)&&(s=Rc(this,s.copy(),!1,At)),Su(a,r.x-n,r.y-h,o.x-n,o.y-h,s.x-n,s.y-h);else{for(r=pt.alloc(),r.assign(this.i(0)),o=pt.alloc(),o.assign(r),s=this.computeCorner(),c=1,l=0;c<e;){if(c=zc(this,r,c,1<c),u=this.i(c),c>=e-1){if(r.w(u)){if(0===l)for(c=1;c<e;)o.assign(r),u=this.i(c++),Vc(this,a,-n,-h,r,u,i),r.assign(u)}else 0!==this.computeShortLength(!1)&&(u=Rc(this,u.copy(),!1,At)),Vc(this,a,-n,-h,r,u,i);break}if(l=zc(this,u,c+1,c<e-3),c=-n,y=-h,f=u,g=this.i(l),m=i,_e.A(r.y,f.y)&&_e.A(f.x,g.x))if(d=Math.min(s,Math.abs(f.x-o.x)/2),d=v=Math.min(d,Math.abs(g.y-f.y)/2),_e.A(d,0))Vc(this,a,c,y,r,f,m),r.assign(f);else{p=f.x,x=f.y;var b=p,w=x;p=f.x>r.x?f.x-d:f.x+d,w=g.y>f.y?f.y+v:f.y-v,Vc(this,a,c,y,r,new pt(p,x),m),Pu(a,f.x+c,f.y+y,b+c,w+y),r.h(b,w)}else _e.A(r.x,f.x)&&_e.A(f.y,g.y)?(d=Math.min(s,Math.abs(f.y-o.y)/2),d=v=Math.min(d,Math.abs(g.x-f.x)/2),_e.A(v,0)?(Vc(this,a,c,y,r,f,m),r.assign(f)):(p=f.x,x=f.y,b=p,w=x,x=f.y>r.y?f.y-d:f.y+d,b=g.x>f.x?f.x+v:f.x-v,Vc(this,a,c,y,r,new pt(p,x),m),Pu(a,f.x+c,f.y+y,b+c,w+y),r.h(b,w))):(Vc(this,a,c,y,r,f,m),r.assign(f));o.assign(u),c=l}pt.free(r)}Tu=a}else a=this.i(1).copy(),a.x-=n,a.y-=h,0!==this.computeShortLength(!0)&&(o=Rc(this,o,!0,r)),0!==this.computeShortLength(!1)&&(a=Rc(this,a,!1,r)),t.type=si,t.startX=o.x,t.startY=o.y,t.endX=a.x,t.endY=a.y;return this.$m=!0,t},Nc.prototype.computeJumpLength=function(){return 10},Nc.prototype.Oq=function(t){var e=this.layer;if(null!==e&&e.visible&&!e.isTemporary){var i=e.diagram;if(null!==i&&!i.animationManager.isTicking){var n=!1;for(i=i.layers;i.next();){var o=i.value;if(o.visible)if(o===e){n=!0;var r=!1;o=o.Ea.j;for(var s=o.length,a=0;a<s;a++){var h=o[a];h instanceof Nc&&(h===this?r=!0:r&&Uc(this,h,t))}}else if(n)for(r=o.Ea.j,o=r.length,s=0;s<o;s++)a=r[s],a instanceof Nc&&Uc(this,a,t)}}}},Nc.prototype.usesSamePort=function(t){var e=this.pointsCount,i=t.pointsCount;if(0<e&&0<i){var n=this.i(0),o=t.i(0);if(n.Qa(o))return!0;if(e=this.i(e-1),t=t.i(i-1),e.Qa(t)||n.Qa(t)||e.Qa(o))return!0}else if(this.fromNode===t.fromNode||this.toNode===t.toNode||this.fromNode===t.toNode||this.toNode===t.fromNode)return!0;return!1},Nc.prototype.isVisible=function(){if(!Lu.prototype.isVisible.call(this))return!1;var t=this.containingGroup,e=!0,i=this.diagram;if(null!==i&&(e=i.isTreePathToChildren),i=this.fromNode,null!==i){if(this.isTreeLink&&e&&!i.isTreeExpanded)return!1;if(i===t)return!0;for(var n=i;null!==n;){if(n.labeledLink===this)return!0;n=n.containingGroup}if(i=i.findVisibleNode(),null===i||i===t)return!1}if(i=this.toNode,null!==i){if(this.isTreeLink&&!e&&!i.isTreeExpanded)return!1;if(i===t)return!0;for(e=i;null!==e;){if(e.labeledLink===this)return!0;e=e.containingGroup}if(e=i.findVisibleNode(),null===e||e===t)return!1}return!0},Nc.prototype.Ob=function(t){if(Lu.prototype.Ob.call(this,t),null!==this.Mf&&this.Mf.Dm(),null!==this.nd)for(var e=this.nd.iterator;e.next();)e.value.Ob(t)},Nc.prototype.computeAdjusting=function(){return this.isAvoiding&&null!==this.diagram&&this.diagram.animationManager.defaultAnimation.isAnimating?rf:this.Yk},Nc.prototype.Ph=function(){return!0},d.Object.defineProperties(Nc.prototype,{fromNode:{get:function(){return this.We},set:function(t){var e=this.We;if(e!==t){var i=this.fromPort;null!==e&&(this.rf!==e&&hc(e,this,i),Hc(this),this.B(2)),this.We=t,null!==t&&this.Ob(t.isVisible()),this.Vf=null,this.Ua();var n=this.diagram;null!==n&&n.Z&&n.partManager.setFromNodeForLink(this,t,e);var o=this.fromPort,r=this.fromPortChanged;if(null!==r){var s=!0;null!==n&&(s=n.Z,n.Z=!0),r(this,i,o),null!==n&&(n.Z=s)}null!==t&&(this.rf!==t&&ac(t,this,o),Kc(this),this.B(1)),this.g("fromNode",e,t),Cc(this)}}},fromPortId:{get:function(){return this.Xe},set:function(t){var e=this.Xe;if(e!==t){var i=this.fromPort;null!==i&&rc(i),Hc(this),this.Xe=t;var n=this.fromPort;null!==n&&rc(n);var o=this.diagram;if(null!==o){var r=this.data,s=o.model;null!==r&&s.qj()&&s.Cw(r,t)}i!==n&&(this.Vf=null,this.Ua(),r=this.fromPortChanged,null!==r&&(s=!0,null!==o&&(s=o.Z,o.Z=!0),r(this,i,n),null!==o&&(o.Z=s))),Kc(this),this.g("fromPortId",e,t)}}},fromPort:{get:function(){var t=this.We;return null===t?null:t.Jt(this.Xe)}},fromPortChanged:{get:function(){return this.fo},set:function(t){var e=this.fo;e!==t&&(this.fo=t,this.g("fromPortChanged",e,t))}},toNode:{get:function(){return this.rf},set:function(t){var e=this.rf;if(e!==t){var i=this.toPort;null!==e&&(this.We!==e&&hc(e,this,i),Hc(this),this.B(2)),this.rf=t,null!==t&&this.Ob(t.isVisible()),this.Vf=null,this.Ua();var n=this.diagram;null!==n&&n.Z&&n.partManager.setToNodeForLink(this,t,e);var o=this.toPort,r=this.toPortChanged;if(null!==r){var s=!0;null!==n&&(s=n.Z,n.Z=!0),r(this,i,o),null!==n&&(n.Z=s)}null!==t&&(this.We!==t&&ac(t,this,o),Kc(this),this.B(1)),this.g("toNode",e,t),Cc(this)}}},toPortId:{get:function(){return this.sf},set:function(t){var e=this.sf;if(e!==t){var i=this.toPort;null!==i&&rc(i),Hc(this),this.sf=t;var n=this.toPort;null!==n&&rc(n);var o=this.diagram;if(null!==o){var r=this.data,s=o.model;null!==r&&s.qj()&&s.Hw(r,t)}i!==n&&(this.Vf=null,this.Ua(),r=this.toPortChanged,null!==r&&(s=!0,null!==o&&(s=o.Z,o.Z=!0),r(this,i,n),null!==o&&(o.Z=s))),Kc(this),this.g("toPortId",e,t)}}},toPort:{get:function(){var t=this.rf;return null===t?null:t.Jt(this.sf)}},toPortChanged:{get:function(){return this.mq},set:function(t){var e=this.mq;e!==t&&(this.mq=t,this.g("toPortChanged",e,t))}},fromSpot:{get:function(){return null!==this.O?this.O.bh:Ce},set:function(t){this.Kc();var e=this.O.bh;e.w(t)||(t=t.H(),this.O.bh=t,this.g("fromSpot",e,t),(e.Oc()||t.Oc())&&null!==this.fromNode&&rc(this.fromPort),this.Ua())}},fromEndSegmentLength:{get:function(){return null!==this.O?this.O.$g:NaN},set:function(t){this.Kc();var e=this.O.$g;e!==t&&(0>t&&M(t,">= 0",Nc,"fromEndSegmentLength"),this.O.$g=t,this.g("fromEndSegmentLength",e,t),this.Ua())}},fromShortLength:{get:function(){return null!==this.O?this.O.ah:NaN},set:function(t){this.Kc();var e=this.O.ah;e!==t&&(this.O.ah=t,this.dc(),this.g("fromShortLength",e,t))}},toSpot:{get:function(){return null!==this.O?this.O.Ch:Ce},set:function(t){this.Kc();var e=this.O.Ch;e.w(t)||(t=t.H(),this.O.Ch=t,this.g("toSpot",e,t),(e.Oc()||t.Oc())&&null!==this.toNode&&rc(this.toPort),this.Ua())}},toEndSegmentLength:{get:function(){return null!==this.O?this.O.Ah:NaN},set:function(t){this.Kc();var e=this.O.Ah;e!==t&&(0>t&&M(t,">= 0",Nc,"toEndSegmentLength"),this.O.Ah=t,this.g("toEndSegmentLength",e,t),this.Ua())}},toShortLength:{get:function(){return null!==this.O?this.O.Bh:NaN},set:function(t){this.Kc();var e=this.O.Bh;e!==t&&(this.O.Bh=t,this.dc(),this.g("toShortLength",e,t))}},isLabeledLink:{get:function(){return null!==this.nd&&0<this.nd.count}},labelNodes:{get:function(){return null===this.nd?J:this.nd.iterator}},relinkableFrom:{get:function(){return 0!==(1&this.Ga)},set:function(t){var e=0!==(1&this.Ga);e!==t&&(this.Ga^=1,this.g("relinkableFrom",e,t),this.Lb())}},relinkableTo:{get:function(){return 0!==(2&this.Ga)},set:function(t){var e=0!==(2&this.Ga);e!==t&&(this.Ga^=2,this.g("relinkableTo",e,t),this.Lb())}},resegmentable:{get:function(){return 0!==(4&this.Ga)},set:function(t){var e=0!==(4&this.Ga);e!==t&&(this.Ga^=4,this.g("resegmentable",e,t),this.Lb())}},isTreeLink:{get:function(){return 0!==(8&this.Ga)},set:function(t){var e=0!==(8&this.Ga);e!==t&&(this.Ga^=8,this.g("isTreeLink",e,t),null!==this.fromNode&&lc(this.fromNode),null!==this.toNode&&lc(this.toNode))}},path:{get:function(){var t=this.tb();return t instanceof Nl?t:null}},routeBounds:{get:function(){this.xj();var t=this.Yl,e=1/0,i=1/0,n=this.pointsCount;if(0===n)t.h(NaN,NaN,0,0);else{if(1===n)n=this.i(0),e=Math.min(n.x,e),i=Math.min(n.y,i),t.h(n.x,n.y,0,0);else if(2===n){n=this.i(0);var o=this.i(1);e=Math.min(n.x,o.x),i=Math.min(n.y,o.y),t.h(n.x,n.y,0,0),t.Oe(o)}else if(this.computeCurve()===ef&&3<=n&&!this.isOrthogonal)if(o=this.i(0),e=o.x,i=o.y,t.h(e,i,0,0),3===n){n=this.i(1),e=Math.min(n.x,e),i=Math.min(n.y,i);var r=this.i(2);e=Math.min(r.x,e),i=Math.min(r.y,i),_e.vm(o.x,o.y,n.x,n.y,n.x,n.y,r.x,r.y,.5,t)}else for(r=3;r<n;r+=3){var s=this.i(r-2);r+3>=n&&(r=n-1);var a=this.i(r-1),h=this.i(r);_e.vm(o.x,o.y,s.x,s.y,a.x,a.y,h.x,h.y,.5,t),e=Math.min(h.x,e),i=Math.min(h.y,i),o=h}else for(o=this.i(0),r=this.i(1),e=Math.min(o.x,r.x),i=Math.min(o.y,r.y),t.h(o.x,o.y,0,0),t.Oe(r),o=2;o<n;o++)r=this.i(o),e=Math.min(r.x,e),i=Math.min(r.y,i),t.Oe(r);this.vv.h(e-t.x,i-t.y)}return t}},midPoint:{get:function(){return this.xj(),this.computeMidPoint(new pt)}},midAngle:{get:function(){return this.xj(),this.computeMidAngle()}},flattenedLengths:{get:function(){if(null===this.$r){this.ud||Lc(this);for(var t=this.$r=[],e=this.pointsCount,i=0;i<e-1;i++){var n=this.i(i),o=this.i(i+1);_e.aa(n.x,o.x)?(n=o.y-n.y,0>n&&(n=-n)):_e.aa(n.y,o.y)?(n=o.x-n.x,0>n&&(n=-n)):n=Math.sqrt(n.Ie(o)),t.push(n)}}return this.$r}},flattenedTotalLength:{get:function(){var t=this.Ru;if(isNaN(t)){for(var e=this.flattenedLengths,i=e.length,n=t=0;n<i;n++)t+=e[n];this.Ru=t}return t}},points:{get:function(){return this.Ab},set:function(t){var e=this.Ab;if(e!==t){var i=null;if(Array.isArray(t)){var n=0===t.length%2;if(n)for(var o=0;o<t.length;o++)if("number"!==typeof t[o]||isNaN(t[o])){n=!1;break}if(n)for(i=new et,n=0;n<t.length/2;n++)o=new pt(t[2*n],t[2*n+1]).freeze(),i.add(o);else{for(n=!0,o=0;o<t.length;o++){var r=t[o];if(!N(r)||"number"!==typeof r.x||isNaN(r.x)||"number"!==typeof r.y||isNaN(r.y)){n=!1;break}}if(n)for(i=new et,n=0;n<t.length;n++)o=t[n],i.add(new pt(o.x,o.y).freeze())}}else if(t instanceof et)for(i=t.copy(),t=i.iterator;t.next();)t.value.freeze();else w("Link.points value is not an instance of List or Array: "+t);i.freeze(),this.Ab=i,this.dc(),Lc(this),t=this.diagram,null!==t&&(t.pj||t.undoManager.isUndoingRedoing||t.Yt.add(this),t.animationManager.sc&&(t=t.animationManager,this.jf=i,t.$l.add(this))),this.g("points",e,i)}}},pointsCount:{get:function(){return this.Ab.count}},ud:{get:function(){return 0!==(16&this.Ga)},set:function(t){0!==(16&this.Ga)!==t&&(this.Ga^=16)}},suspendsRouting:{get:function(){return 0!==(32&this.Ga)},set:function(t){0!==(32&this.Ga)!==t&&(this.Ga^=32)}},Ct:{get:function(){return 0!==(64&this.Ga)},set:function(t){0!==(64&this.Ga)!==t&&(this.Ga^=64)}},defaultFromPoint:{get:function(){return this.u},set:function(t){this.u=t.copy()}},defaultToPoint:{get:function(){return this.I},set:function(t){this.I=t.copy()}},isOrthogonal:{get:function(){return 2===(2&this.ck.value)}},isAvoiding:{get:function(){return 4===(4&this.ck.value)}},$m:{get:function(){return 0!==(128&this.Ga)},set:function(t){0!==(128&this.Ga)!==t&&(this.Ga^=128)}},geometry:{get:function(){return this.$m||(this.xj(),this.na=this.makeGeometry()),this.na}},firstPickIndex:{get:function(){return 2>=this.pointsCount?0:this.isOrthogonal||!Dc(this.computeSpot(!0))?1:0}},lastPickIndex:{get:function(){var t=this.pointsCount;return 0===t?0:2>=t?t-1:this.isOrthogonal||!Dc(this.computeSpot(!1))?t-2:t-1}},adjusting:{get:function(){return this.Yk},set:function(t){var e=this.Yk;e!==t&&(this.Yk=t,this.g("adjusting",e,t))}},corner:{get:function(){return this.Hn},set:function(t){var e=this.Hn;e!==t&&(this.Hn=t,this.dc(),this.g("corner",e,t))}},curve:{get:function(){return this.Jn},set:function(t){var e=this.Jn;e!==t&&(this.Jn=t,this.Ua(),this.dc(),qc(this,e===nf||e===of||t===nf||t===of),this.g("curve",e,t))}},curviness:{get:function(){return this.Kn},set:function(t){var e=this.Kn;e!==t&&(this.Kn=t,this.Ua(),this.dc(),this.g("curviness",e,t))}},routing:{get:function(){return this.ck},set:function(t){var e=this.ck;e!==t&&(this.ck=t,this.Vf=null,this.Ua(),qc(this,2===(2&e.value)||2===(2&t.value)),this.g("routing",e,t))}},smoothness:{get:function(){return this.Zp},set:function(t){var e=this.Zp;e!==t&&(this.Zp=t,this.dc(),this.g("smoothness",e,t))}},key:{get:function(){var t=this.diagram;if(null!==t&&t.model.qj())return t.model.Wb(this.data)}}}),Nc.prototype.invalidateOtherJumpOvers=Nc.prototype.Oq,Nc.prototype.findClosestSegment=Nc.prototype.Sz,Nc.prototype.updateRoute=Nc.prototype.xj,Nc.prototype.invalidateRoute=Nc.prototype.Ua,Nc.prototype.rollbackRoute=Nc.prototype.yw,Nc.prototype.commitRoute=Nc.prototype.xf,Nc.prototype.startRoute=Nc.prototype.Th,Nc.prototype.clearPoints=Nc.prototype.pk,Nc.prototype.removePoint=Nc.prototype.uw,Nc.prototype.addPointAt=Nc.prototype.vf,Nc.prototype.addPoint=Nc.prototype.ce,Nc.prototype.insertPointAt=Nc.prototype.m,Nc.prototype.insertPoint=Nc.prototype.wA,Nc.prototype.setPointAt=Nc.prototype.L,Nc.prototype.setPoint=Nc.prototype.Qc,Nc.prototype.getPoint=Nc.prototype.i,Nc.prototype.getOtherPort=Nc.prototype.nA,Nc.prototype.getOtherNode=Nc.prototype.Kq;var _c=null,Wc=null,$c=new U(Nc,"Normal",1),Jc=new U(Nc,"Orthogonal",2),Zc=new U(Nc,"AvoidsNodes",6),Qc=new U(Nc,"AvoidsNodesStraight",7),tf=new U(Nc,"None",0),ef=new U(Nc,"Bezier",9),nf=new U(Nc,"JumpGap",10),of=new U(Nc,"JumpOver",11),rf=new U(Nc,"End",17),sf=new U(Nc,"Scale",18),af=new U(Nc,"Stretch",19),hf=new U(Nc,"OrientAlong",21),lf=new U(Nc,"OrientPlus90",22),uf=new U(Nc,"OrientMinus90",23),cf=new U(Nc,"OrientOpposite",24),ff=new U(Nc,"OrientUpright",25),df=new U(Nc,"OrientPlus90Upright",26),pf=new U(Nc,"OrientMinus90Upright",27),gf=new U(Nc,"OrientUpright45",28),yf=16,mf=14,vf=8;function xf(t,e,i,n){ot(this),this.se=this.hs=!1,this.au=t,this.My=e,this.lw=i,this.Ny=n,this.links=[]}function bf(){ot(this),this.Vy=this.group=null,this.Rt=!0,this.abort=!1,this.Bd=this.Ad=1,this.So=this.Ro=-1,this.gc=this.fc=8,this.Rb=null,this.$i=this.Zi=0,this.Wy=11,this.Gy=124}function wf(t,e,i){return t.Ad<=e&&e<=t.Ro&&t.Bd<=i&&i<=t.So}function kf(t,e,i){return wf(t,e,i)?(e-=t.Ad,e/=t.fc,i-=t.Bd,i/=t.gc,t.Rb[0|e][0|i]):Of}function Mf(t){if(null!==t.Rb)for(var e=0;e<=t.Zi;e++)for(var i=t.Rb[e],n=0;n<=t.$i;n++)i[n]>=Lf&&(i[n]=Of)}function Sf(t,e,i,n,o,r,s,a,h){if(!(e<r||e>s||i<a||i>h)){var l=0|e,u=0|i,c=t.Rb[l][u];if(c>=Lf&&c<jf)for(o?u+=n:l+=n,c+=1;r<=l&&l<=s&&a<=u&&u<=h&&!(c>=t.Rb[l][u]);)t.Rb[l][u]=c,c+=1,o?u+=n:l+=n;if(l=o?u:l,o)if(0<n)for(i+=n;i<l;i+=n)Sf(t,e,i,1,!o,r,s,a,h),Sf(t,e,i,-1,!o,r,s,a,h);else for(i+=n;i>l;i+=n)Sf(t,e,i,1,!o,r,s,a,h),Sf(t,e,i,-1,!o,r,s,a,h);else if(0<n)for(e+=n;e<l;e+=n)Sf(t,e,i,1,!o,r,s,a,h),Sf(t,e,i,-1,!o,r,s,a,h);else for(e+=n;e>l;e+=n)Sf(t,e,i,1,!o,r,s,a,h),Sf(t,e,i,-1,!o,r,s,a,h)}}function Pf(t,e,i,n,o,r,s,a,h){e|=0,i|=0;var l=Af,u=Lf;for(t.Rb[e][i]=u;l===Af&&e>r&&e<s&&i>a&&i<h;)u+=1,t.Rb[e][i]=u,o?i+=n:e+=n,l=t.Rb[e][i]}function Nf(t,e,i,n,o,r,s,a,h){e|=0,i|=0;var l=Af,u=jf;for(t.Rb[e][i]=u;l===Af&&e>r&&e<s&&i>a&&i<h;)t.Rb[e][i]=u,o?i+=n:e+=n,l=t.Rb[e][i]}function Cf(t,e,i,n,o,r,s){if(null!==t.Rb){t.abort=!1;var a=e.x,h=e.y;if(wf(t,a,h)){a-=t.Ad,a/=t.fc,h-=t.Bd,h/=t.gc;var l=n.x,u=n.y;if(wf(t,l,u))if(l-=t.Ad,l/=t.fc,u-=t.Bd,u/=t.gc,1>=Math.abs(a-l)&&1>=Math.abs(h-u))t.abort=!0;else{var c=r.x;n=r.y,e=r.x+r.width;var f=r.y+r.height;c-=t.Ad,c/=t.fc,n-=t.Bd,n/=t.gc,e-=t.Ad,e/=t.fc,f-=t.Bd,f/=t.gc,r=Math.max(0,Math.min(t.Zi,0|c)),e=Math.min(t.Zi,Math.max(0,0|e)),c=Math.max(0,Math.min(t.$i,0|n)),f=Math.min(t.$i,Math.max(0,0|f)),n=t.Rb,a|=0,h|=0,l|=0,u|=0;var d=0===i||90===i?1:-1;if(i=90===i||270===i,n[a][h]===Af?(Pf(t,a,h,d,i,r,e,c,f),Pf(t,a,h,1,!i,r,e,c,f),Pf(t,a,h,-1,!i,r,e,c,f)):Pf(t,a,h,d,i,a,h,a,h),n[l][u]===Af?(Nf(t,l,u,0===o||90===o?1:-1,90===o||270===o,r,e,c,f),Nf(t,l,u,1,!(90===o||270===o),r,e,c,f),Nf(t,l,u,-1,!(90===o||270===o),r,e,c,f)):Nf(t,l,u,d,i,l,u,l,u),i=j(),s&&Tf(t,l,u,o,a,h,i))for(i[0]===l&&i[1]===u||(i.unshift(u),i.unshift(l)),i[i.length-2]===a&&i[i.length-1]===h||(i.push(a),i.push(h)),t=Lf,o=i[i.length-2],s=i[i.length-1],n[o][s]=t++,r=i.length-4;0<=r;r-=2)for(o=i[r+2],s=i[r+3],e=i[r],l=i[r+1];e>o?o++:e<o?o--:l>s?s++:l<s&&s--,n[o][s]=t++,o!==e||s!==l;);else Sf(t,a,h,1,!1,r,e,c,f),Sf(t,a,h,-1,!1,r,e,c,f),Sf(t,a,h,1,!0,r,e,c,f),Sf(t,a,h,-1,!0,r,e,c,f);O(i)}}}}function Tf(t,e,i,n,o,r,s){for(var a=t.Rb,h=e,l=i;;){if(h===o&&l===r)return!0;var u=h,c=l;if(0===n){if(!(u<o))break;u++}else if(90===n){if(!(c<r))break;c++}else if(180===n){if(!(u>o))break;u--}else{if(!(c>r))break;c--}var f=a[u][c];if(0===f||f===Df)break;h=u,l=c}for(;;){if(u=n,c=h,f=l,0===n?f<r?(u=90,f++):f>r&&(u=270,f--):90===n?c<o?(u=0,c++):c>o&&(u=180,c--):180===n?f<r?(u=90,f++):f>r&&(u=270,f--):c<o?(u=0,c++):c>o&&(u=180,c--),c=a[c][f],u!==n&&0!==c&&c!==Df){if(s.push(h),s.push(l),Tf(t,h,l,u,o,r,s))return!0;s.pop(),s.pop()}if(a[h][l]=Df,0===n){if(h===e)return!1;h--}else if(90===n){if(l===i)return!1;l--}else if(180===n){if(h===e)return!1;h++}else{if(l===i)return!1;l++}}}Nc.className="Link",Nc.Normal=$c,Nc.Orthogonal=Jc,Nc.AvoidsNodes=Zc,Nc.AvoidsNodesStraight=Qc,Nc.None=tf,Nc.Bezier=ef,Nc.JumpGap=nf,Nc.JumpOver=of,Nc.End=rf,Nc.Scale=sf,Nc.Stretch=af,Nc.OrientAlong=hf,Nc.OrientPlus90=lf,Nc.OrientMinus90=uf,Nc.OrientOpposite=cf,Nc.OrientUpright=ff,Nc.OrientPlus90Upright=df,Nc.OrientMinus90Upright=pf,Nc.OrientUpright45=gf,Nc.EndSegmentStep=8,Nc.CurvinessStart=yf,Nc.SpacingMin=mf,Nc.OrthoShortCut=vf,Nc.AvoidanceCell=8,Nc.AvoidanceLimit=999,xf.prototype.Dm=function(){if(!this.hs){var t=this.links;0<t.length&&(t=t[0].diagram,null!==t&&(t.Tu.add(this),this.se=t.undoManager.isUndoingRedoing))}this.hs=!0},xf.prototype.Vw=function(){if(this.hs){this.hs=!1;var t=this.links;if(0<t.length){var e=t[0],i=e.diagram;i=null===i||i.pj&&!this.se,this.se=!1,e.arrangeBundledLinks(t,i),1===t.length&&(e.Mf=null,t.length=0)}0===t.length&&(t=this.au,null!==this&&null!==t.Se&&t.Se.remove(this),t=this.lw,null!==this&&null!==t.Se&&t.Se.remove(this))}},xf.className="LinkBundle",bf.prototype.initialize=function(t){if(!(0>=t.width||0>=t.height)){var e=t.y,i=t.x+t.width,n=t.y+t.height;if(this.Ad=Math.floor((t.x-this.fc)/this.fc)*this.fc,this.Bd=Math.floor((e-this.gc)/this.gc)*this.gc,this.Ro=Math.ceil((i+2*this.fc)/this.fc)*this.fc,this.So=Math.ceil((n+2*this.gc)/this.gc)*this.gc,t=1+(0|Math.ceil((this.Ro-this.Ad)/this.fc)),e=1+(0|Math.ceil((this.So-this.Bd)/this.gc)),null===this.Rb||this.Zi<t-1||this.$i<e-1){for(i=[],n=0;n<=t;n++)i[n]=new Uint32Array(e);this.Rb=i,this.Zi=t-1,this.$i=e-1}if(t=Of,null!==this.Rb)for(e=0;e<=this.Zi;e++)if(i=this.Rb[e],i.fill)i.fill(t);else for(n=0;n<=this.$i;n++)i[n]=t}},bf.prototype.Ek=function(t,e,i,n){if(t>this.Ro||t+i<this.Ad||e>this.So||e+n<this.Bd)return!0;t=(t-this.Ad)/this.fc|0,e=(e-this.Bd)/this.gc|0,i=Math.max(0,i)/this.fc+1|0;var o=Math.max(0,n)/this.gc+1|0;if(0>t&&(i+=t,t=0),0>e&&(o+=e,e=0),0>i||0>o)return!0;for(n=0|Math.min(t+i-1,this.Zi),i=0|Math.min(e+o-1,this.$i);t<=n;t++){o=this.Rb[t];for(var r=e;r<=i;r++)if(o[r]===Af)return!1}return!0},d.Object.defineProperties(bf.prototype,{bounds:{get:function(){return new zt(this.Ad,this.Bd,this.Ro-this.Ad,this.So-this.Bd)}},zq:{get:function(){return this.fc},set:function(t){0<t&&t!==this.fc&&(this.fc=t,this.initialize(this.bounds))}},yq:{get:function(){return this.gc},set:function(t){0<t&&t!==this.gc&&(this.gc=t,this.initialize(this.bounds))}}});var Af=0,Lf=1,jf=999999,Of=jf+1,Df=jf+2;function Ff(){ot(this),this.port=this.node=null,this.de=[],this.Sq=!1}function Bf(t,e,i,n){switch(e=e.offsetY,e){case 8:return 90;case 2:return 180;case 1:return 270;case 4:return 0}switch(e){case 9:return 180<i?270:90;case 6:return 90<i&&270>=i?180:0}switch(t=180*Math.atan2(t.height,t.width)/Math.PI,e){case 3:return i>t&&i<=180+t?180:270;case 5:return i>180-t&&i<=360-t?270:0;case 12:return i>t&&i<=180+t?90:0;case 10:return i>180-t&&i<=360-t?180:90;case 7:return 90<i&&i<=180+t?180:i>180+t&&i<=360-t?270:0;case 13:return 180<i&&i<=360-t?270:i>t&&180>=i?90:0;case 14:return i>t&&i<=180-t?90:i>180-t&&270>=i?180:0;case 11:return i>180-t&&i<=180+t?180:i>180+t?270:90}return n&&15!==e&&(i-=15,0>i&&(i+=360)),i>t&&i<180-t?90:i>=180-t&&i<=180+t?180:i>180+t&&i<360-t?270:0}function If(t,e){var i=t.de;if(0===i.length){t:if(!t.Sq){i=t.Sq,t.Sq=!0;var n=null,o=t.node,r=o instanceof bc?o:null;if(null===r||r.isSubGraphExpanded)var s=o.isTreeExpanded?o.findLinksConnected(t.port.portId):o.py();else{if(!r.actualBounds.s()){t.Sq=i;break t}n=r,s=n.Rv()}r=t.de.length=0;var a=t.port.da(ne,pt.alloc()),h=t.port.da(ce,pt.alloc());for(o=zt.allocAt(a.x,a.y,0,0),o.Oe(h),pt.free(a),pt.free(h),a=pt.allocAt(o.x+o.width/2,o.y+o.height/2),h=t.port.lj(),s=s.iterator;s.next();){var l=s.value;if(l.isVisible()&&l.fromPort!==l.toPort){var u=l.fromPort===t.port||null!==l.fromNode&&l.fromNode.Kd(n),c=l.computeSpot(u,t.port);if(c.Oc()){var f=u?l.toPort:l.fromPort;if(null!==f&&(u=f.part,null!==u)){var d=u.findVisibleNode();null!==d&&d!==u&&(u=d,f=u.port),u=l.computeOtherPoint(u,f),f=a.Pa(f.da(ae)),f+=(a.Pa(u)-f)/360,f-=h,0>f?f+=360:360<=f&&(f-=360),c=Bf(o,c,f,l.isOrthogonal),0===c?(c=4,180<f&&(f-=360)):90===c?(c=8,270<f&&(f-=360)):180===c?c=2:(c=1,90>f&&(f+=360)),d=t.de[r],void 0===d?(d=new Ef(l,f,c),t.de[r]=d):(d.link=l,d.angle=f,d.Ac=c),d.ow.set(u),r++}}}}for(pt.free(a),t.de.sort(Ff.prototype.l),h=t.de.length,n=-1,r=a=0;r<h;r++)s=t.de[r],void 0!==s&&(s.Ac!==n&&(n=s.Ac,a=0),s.Lq=a,a++);for(n=-1,a=0,r=h-1;0<=r;r--)h=t.de[r],void 0!==h&&(h.Ac!==n&&(n=h.Ac,a=h.Lq+1),h.wm=a);if(r=t.de,c=t.port,n=t.node.portSpreading,a=pt.alloc(),h=pt.alloc(),s=pt.alloc(),l=pt.alloc(),c.da(ne,a),c.da(re,h),c.da(ce,s),c.da(le,l),d=f=u=c=0,n===xc)for(var p=0;p<r.length;p++){var g=r[p];if(null!==g){var y=g.link.computeThickness();switch(g.Ac){case 8:f+=y;break;case 2:d+=y;break;case 1:c+=y;break;default:case 4:u+=y}}}var m=p=0,v=1,x=g=0;for(y=0;y<r.length;y++){var b=r[y];if(null!==b){if(p!==b.Ac){switch(p=b.Ac,p){case 8:var w=s;m=l;break;case 2:w=l,m=a;break;case 1:w=a,m=h;break;default:case 4:w=h,m=s}switch(g=m.x-w.x,x=m.y-w.y,p){case 8:f>Math.abs(g)?(v=Math.abs(g)/f,f=Math.abs(g)):v=1;break;case 2:d>Math.abs(x)?(v=Math.abs(x)/d,d=Math.abs(x)):v=1;break;case 1:c>Math.abs(g)?(v=Math.abs(g)/c,c=Math.abs(g)):v=1;break;default:case 4:u>Math.abs(x)?(v=Math.abs(x)/u,u=Math.abs(x)):v=1}m=0}var k=b.Qq;if(n===xc){switch(b=b.link.computeThickness(),b*=v,k.set(w),p){case 8:k.x=w.x+g/2+f/2-m-b/2;break;case 2:k.y=w.y+x/2+d/2-m-b/2;break;case 1:k.x=w.x+g/2-c/2+m+b/2;break;default:case 4:k.y=w.y+x/2-u/2+m+b/2}m+=b}else{var M=.5;n===vc&&(M=(b.Lq+1)/(b.wm+1)),k.x=w.x+g*M,k.y=w.y+x*M}}}for(pt.free(a),pt.free(h),pt.free(s),pt.free(l),w=t.de,r=0;r<w.length;r++)n=w[r],null!==n&&(n.Pv=t.computeEndSegmentLength(n));t.Sq=i,zt.free(o)}i=t.de}for(t=0;t<i.length;t++)if(o=i[t],null!==o&&o.link===e)return o;return null}function Ef(t,e,i){this.link=t,this.angle=e,this.Ac=i,this.ow=new pt,this.wm=this.Lq=0,this.Qq=new pt,this.Pv=0}function Rf(){this.Ch=this.bh=Ce,this.Bh=this.ah=this.Ah=this.$g=NaN,this.kq=this.co=null,this.lq=this.eo=1/0}function zf(){ot(this),this.u=this.C=null,this.zi=this.xo=!0,this.Co=!1,this.nn=new pt(0,0).freeze(),this.zo=!0,this.vn=this.yo=null,this.Bo=!1,this.l=null,this.I=0,this.To=this.qq=null,this.wt=!1,this.yg=this.ek=null,this.lt=!1}function Vf(t,e,i,n,o,r,s,a){for(i=i.iterator;i.next();){var h=i.value;n&&!h.isTopLevel||null!==o&&!o(h)||!h.canLayout()||(r&&h instanceof ec?h.isLinkLabel||(h instanceof bc&&null===h.layout?Vf(t,e,h.memberParts,!1,o,r,s,a):(Gf(h),e.add(h))):s&&h instanceof Nc?e.add(h):!a||!h.Nc()||h instanceof ec||(Gf(h),e.add(h)))}}function Gf(t){var e=t.actualBounds;(0===e.width||0===e.height||isNaN(e.width)||isNaN(e.height))&&t.Ta()}function Yf(t,e){if(null!==t.workerStateChanged){var i={key:t.group?t.group.key:null};void 0!==e&&(i.time=e),null!==t.ek&&(i.running=Xf(t.ek)),null!==t.yg&&(i.waiting=Xf(t.yg)),t.workerStateChanged(i,t)}}function Xf(t){return{vertexes:t.vertexes.count,edges:t.edges.count}}function qf(t,e){var i=Uf(t);if(!i)throw Error("Unknown Layout class: "+t);if(e)for(var n in e)i[n]=e[n]}function Uf(t){var e=null;if("function"===typeof t){if(e=Wf.get(t),!e){var i=D(t);e=Wf.get(i),e||(e=new Zf,e.Lv=t,e.name=i,e.l=t.name,e.Cy=$f,Wf.set(i,e),Wf.set(t,e),Wf.set(t.name,e))}}else"string"===typeof t&&(e=Wf.get(t));return e}function Kf(t,e){t.wt=!0;var i=Uf(t.constructor),n=Hf(t,e,!0);n._GoJS="_GoJS",i.Pe.postMessage(n),i.Fm.set(st(t),t),t.ek=e}function Hf(t,e,i){t.onNetworkSerialization(1,i,e,null);var n={};t.serializeLayoutProperties(n,i);var o=[];e.vertexes.each((function(t){var e={};t.serializeVertexProperties(e,i),o.push(e)}));var r=[];return e.edges.each((function(t){var e={};t.serializeEdgeProperties(e,i),r.push(e)})),n={id:i?st(t):t.id,layout:D(t.constructor),p:n,jB:o,Qz:r},t.onNetworkSerialization(2,i,e,n),n}function _f(t,e,i){i&&(t.id=e.id);var n=t.diagram,o=t.createNetwork();t.onNetworkSerialization(3,i,o,e);var r=e.jB,s=new dt;r&&r.forEach((function(t){var e=null;null===t.key||null===n||i||(e=n.Cb(t.key)),null!==e?e=o.mk(e):(e=o.createVertex(),o.Bg(e)),i&&null!==t.key&&(e.data={Di:t.key}),s.set(t.id,e)}));var a=e.Qz,h=new dt;return a&&a.forEach((function(t){var e=null;null===t.key||null===n||i||(e=n.findLinkForKey(t.key));var r=o.createEdge();o.tm(r),r.link=e,i&&null!==t.key&&(r.data={Di:t.key}),h.set(t.id,r)})),r&&r.forEach((function(t){var e=s.get(t.id);e&&e.Cq(t,s,h,i)})),a&&a.forEach((function(t){var e=h.get(t.id);e&&e.deserializeEdgeProperties(t,s,h,i)})),t.deserializeLayoutProperties(e.p,s,h,i,o),t.onNetworkSerialization(4,i,o,e),o}bf.className="PositionArray",Ff.prototype.toString=function(){for(var t=this.de,e=this.node.toString()+" "+t.length.toString()+":",i=0;i<t.length;i++){var n=t[i];null!==n&&(e+="\n  "+n.toString())}return e},Ff.prototype.Dm=function(){this.de.length=0},Ff.prototype.l=function(t,e){return t===e?0:null===t?-1:null===e?1:t.Ac<e.Ac?-1:t.Ac>e.Ac?1:t.angle<e.angle?-1:t.angle>e.angle?1:0},Ff.prototype.computeEndSegmentLength=function(t){var e=t.link,i=e.computeEndSegmentLength(this.node,this.port,ie,e.fromPort===this.port),n=t.Lq;if(0>n)return i;var o=t.wm;if(1>=o||!e.isOrthogonal)return i;e=t.ow;var r=t.Qq;return 2!==t.Ac&&8!==t.Ac||(n=o-1-n),((t=2===t.Ac||4===t.Ac)?e.y<r.y:e.x<r.x)?i+8*n:(t?e.y===r.y:e.x===r.x)?i:i+8*(o-1-n)},Ff.className="Knot",Ef.prototype.toString=function(){return this.link.toString()+" "+this.angle.toString()+" "+this.Ac.toString()+":"+this.Lq.toString()+"/"+this.wm.toString()+" "+this.Qq.toString()+" "+this.Pv.toString()+" "+this.ow.toString()},Ef.className="LinkInfo",Rf.prototype.copy=function(){var t=new Rf;return t.bh=this.bh.H(),t.Ch=this.Ch.H(),t.$g=this.$g,t.Ah=this.Ah,t.ah=this.ah,t.Bh=this.Bh,t.co=this.co,t.kq=this.kq,t.eo=this.eo,t.lq=this.lq,t},Rf.className="LinkSettings",zf.prototype.cloneProtected=function(t){t.xo=this.xo,t.zi=this.zi,t.Co=this.Co,t.nn.assign(this.nn),t.zo=this.zo,t.yo=this.yo,t.vn=this.vn,t.Bo=!0,t.To=this.To,t.qq=this.qq},zf.prototype.copy=function(){var t=new this.constructor;return this.cloneProtected(t),t},zf.prototype.serializeLayoutProperties=function(t){t.arrangementOrigin={x:this.arrangementOrigin.x,y:this.arrangementOrigin.y},t.isRouting=this.isRouting},zf.prototype.deserializeLayoutProperties=function(t){null!==t&&(this.arrangementOrigin=new pt(t.arrangementOrigin.x,t.arrangementOrigin.y),this.isRouting=t.isRouting)},zf.prototype.jb=function(){},zf.prototype.toString=function(){var t=D(this.constructor);return t+="(",null!==this.group&&(t+=" in "+this.group),null!==this.diagram&&(t+=" for "+this.diagram),t+")"},zf.prototype.B=function(){if(this.isValidLayout){var t=this.diagram;if(null!==t&&!t.undoManager.isUndoingRedoing){var e=t.animationManager;!e.isTicking&&(e.defaultAnimation.isAnimating&&e.Bc(),this.isOngoing&&t.pj||this.isInitial&&!t.pj)&&(this.isValidLayout=!1,t.Db())}}},zf.prototype.createNetwork=function(){return new Qf(this)},zf.prototype.makeNetwork=function(t){var e=this.createNetwork();return t instanceof Ko?(e.Ag(t.nodes,!0),e.Ag(t.links,!0)):t instanceof bc?e.Ag(t.memberParts):e.Ag(t.iterator),e},zf.prototype.updateParts=function(){if(this.isValidLayout=!0,!this.workerLayout()){var t=this.diagram;if(null===t&&null!==this.network)for(var e=this.network.vertexes.iterator;e.next();){var i=e.value.node;if(null!==i&&(t=i.diagram,null!==t))break}try{null!==t&&t.va("Layout"),this.commitLayout()}finally{null!==t&&t.Xa("Layout")}}},zf.prototype.commitLayout=function(){if(null!==this.network){for(var t=this.network.vertexes.iterator;t.next();)t.value.commit();if(this.isRouting)for(t=this.network.edges.iterator;t.next();)t.value.commit()}},zf.prototype.doLayout=function(t){var e=new nt;t instanceof Ko?(Vf(this,e,t.nodes,!0,this.Rh,!0,!1,!0),Vf(this,e,t.parts,!0,this.Rh,!0,!1,!0)):t instanceof bc?Vf(this,e,t.memberParts,!1,this.Rh,!0,!1,!0):e.addAll(t.iterator),0<e.count&&(t=this.diagram,null!==t&&t.va("Layout"),this.doMinimalNoNetworkLayout(e),null!==t&&t.Xa("Layout")),this.isValidLayout=!0},zf.prototype.doMinimalNoNetworkLayout=function(t){var e=Math.ceil(Math.sqrt(t.count));this.arrangementOrigin=this.initialOrigin(this.arrangementOrigin);var i=this.arrangementOrigin.x,n=i,o=this.arrangementOrigin.y,r=0,s=0;for(t=t.iterator;t.next();){var a=t.value;Gf(a);var h=a.measuredBounds,l=h.width;h=h.height,a.moveTo(n,o),a instanceof bc&&(a.Rh=!1),n+=Math.max(l,50)+20,s=Math.max(s,Math.max(h,50)),r>=e-1?(r=0,n=i,o+=s+20,s=0):r++}},zf.prototype.doMinimalNetworkLayout=function(){var t=Math.ceil(Math.sqrt(this.network.vertexes.count));this.arrangementOrigin=this.initialOrigin(this.arrangementOrigin);for(var e=this.arrangementOrigin.x,i=e,n=this.arrangementOrigin.y,o=0,r=0,s=this.network.vertexes.iterator;s.next();){var a=s.value.node;if(!(null===a||a instanceof Nc)&&(Gf(a),this.Rh(a))){var h=a.measuredBounds,l=h.width;h=h.height,a.moveTo(i,n),a instanceof bc&&(a.Rh=!1),i+=Math.max(l,50)+20,r=Math.max(r,Math.max(h,50)),o>=t-1?(o=0,i=e,n+=r+20,r=0):o++}}},zf.prototype.Rh=function(t){return!(t.location.s()&&!(t instanceof bc&&t.Rh))},zf.prototype.nj=function(t,e){var i=this.boundsComputation;return null!==i?(e||(e=new zt),i(t,this,e)):e?(e.set(t.actualBounds),e):t.actualBounds},zf.prototype.$x=function(t){var e=new nt;return t instanceof Ko?(Vf(this,e,t.nodes,!0,null,!0,!0,!0),Vf(this,e,t.links,!0,null,!0,!0,!0),Vf(this,e,t.parts,!0,null,!0,!0,!0)):Vf(this,e,t instanceof bc?t.memberParts:t.iterator,!1,null,!0,!0,!0),e},zf.prototype.initialOrigin=function(t){var e=this.group;if(null!==e){var i=e.position.copy();return(isNaN(i.x)||isNaN(i.y))&&i.set(t),e=e.placeholder,null!==e&&(i=e.da(ne),(isNaN(i.x)||isNaN(i.y))&&i.set(t),t=e.padding,i.x+=t.left,i.y+=t.top),i}return t},zf.prototype.mayUseWorker=function(){return!!this.mayUseWorkerFunction&&this.mayUseWorkerFunction(this)},zf.prototype.workerLayout=function(){return!1},zf.prototype.zz=function(){var t=Uf(this.constructor);t&&(null!==t.Pe&&t.Pe.terminate(),t.Pe=null,t.Fm.iteratorValues.each((function(t){t.wt=!1,t.ek=null,t.yg=null,t.lt=!1,Yf(t)})),t.Fm.clear())},zf.prototype.Uw=function(){if("undefined"===typeof Worker||!Jf||"undefined"===typeof self||"undefined"!==typeof self.DedicatedWorkerGlobalScope)return!1;if(!this.mayUseWorker())return this.wt&&(this.lt=!0,this.yg=this.ek=null,Yf(this)),!1;var t=Uf(this.constructor);return null!==t&&(null===t.Pe&&(t.Pe=new Worker(Jf),t.Pe.onerror=function(t){t.preventDefault(),S("Worker Error at: "+t.filename+" "+t.lineno+" "+t.colno+"\n  "+t.message)},t.Pe.l=function(t){S("Worker serialization error: "+t)},t.Pe.onmessage=function(e){var i=e.data;if("_GoJS"===i._GoJS)if(i.version&&Ko.version&&i.version!==Ko.version)S("Failure: GoJS v"+Ko.version+"  Worker v"+i.version);else if(e=t.Fm.get(i.id)){if(t.Fm.remove(i.id),e.wt=!1,e.ek=null,e.lt)e.lt=!1,e.yg=null;else{var n=_f(e,i,!1);e.network=n,e.updateParts(),e.network=null,e.isValidLayout=!0}if(Yf(e,i.time),i=e.yg,null!==i)e.yg=null;else for(n=t.Fm.iteratorValues;n.next();){var o=n.value;if(i=o.yg,null!==i){o.yg=null;break}}null!==i&&Kf(e,i)}},t.Pe.postMessage({_GoJS:"_GoJS",url:t.Cy}),Array.isArray(t.scripts)&&t.scripts.forEach((function(e){t.Pe.postMessage({_GoJS:"_GoJS",url:e})})),t.Pe.postMessage({_GoJS:"_GoJS",version:-1})),null!==this.ek?this.yg=this.network:Kf(this,this.network),Yf(this),this.doMinimalNetworkLayout(),this.network=null,this.isValidLayout=!0)},zf.prototype.onNetworkSerialization=function(){},d.Object.defineProperties(zf.prototype,{diagram:{get:function(){return this.C},set:function(t){this.C=t}},group:{get:function(){return this.u},set:function(t){this.u!==t&&(this.u=t,null!==t&&(this.C=t.diagram))}},isOngoing:{get:function(){return this.xo},set:function(t){this.xo!==t&&(this.xo=t)}},isInitial:{get:function(){return this.zi},set:function(t){this.zi=t,t||(this.Bo=!0)}},isViewportSized:{get:function(){return this.Co},set:function(t){this.Co!==t&&(this.Co=t)&&this.B()}},isRouting:{get:function(){return this.zo},set:function(t){this.zo!==t&&(this.zo=t)}},isRealtime:{get:function(){return this.yo},set:function(t){this.yo!==t&&(this.yo=t)}},isValidLayout:{get:function(){return this.Bo},set:function(t){this.Bo!==t&&(this.Bo=t,t||(t=this.diagram,null!==t&&(t.Ng=!0)))}},network:{get:function(){return this.l},set:function(t){this.l!==t&&(this.l=t,null!==t&&(t.layout=this))}},boundsComputation:{get:function(){return this.vn},set:function(t){this.vn!==t&&(this.vn=t,this.B())}},arrangementOrigin:{get:function(){return this.nn},set:function(t){this.nn.w(t)||(this.nn.assign(t),this.B())}},id:{get:function(){return this.I},set:function(t){this.I=t}},mayUseWorkerFunction:{get:function(){return this.To},set:function(t){this.To!==t&&(this.To=t)}},workerStateChanged:{get:function(){return this.qq},set:function(t){this.qq!==t&&(this.qq=t)}}}),zf.prototype.useWorker=zf.prototype.Uw,zf.declareWorkerLayout=qf,zf.prototype.cancelWorker=zf.prototype.zz,zf.prototype.collectParts=zf.prototype.$x,zf.prototype.getLayoutBounds=zf.prototype.nj,zf.prototype.invalidateLayout=zf.prototype.B;var Wf=new dt,$f="object"===typeof y.document&&y.document.currentScript?y.document.currentScript.src:"",Jf="undefined"!==typeof URL&&"function"===typeof URL.createObjectURL&&"function"===typeof Blob?URL.createObjectURL(new Blob(["self.onmessage=function(e){if(e.data.url){\nimportScripts(e.data.url);}}"],{type:"text/javascript"})):"";function Zf(){this.Lv=null,this.Cy=this.l=this.name="",this.scripts=[],this.Pe=null,this.Fm=new dt}function Qf(t){ot(this),this.kc=t,this.tf=new nt,this.le=new nt,this.bu=new dt,this.Xt=new dt}function td(t,e){if(null===e)return!1;var i=t.tf.remove(e);return i&&(e=e.node,null!==e&&t.bu.remove(e)),i}function ed(t,e){if(null!==e){t.le.add(e);var i=e.link;null!==i&&null===t.Eq(i)&&t.Xt.add(i,e),e.network=t}}function id(t,e){null!==e&&t.le.remove(e)&&(e=e.link,null!==e&&t.Xt.remove(e))}function nd(t){for(var e=j(),i=t.le.iterator;i.next();){var n=i.value;null!==n.fromVertex&&null!==n.toVertex||e.push(n)}for(i=e.length,n=0;n<i;n++)t.vk(e[n]);O(e)}function od(t,e,i){if(null!==i&&i.network!==e){td(t,i),e.Bg(i);for(var n=i.sourceEdges;n.next();){var o=n.value;o.network!==e&&(id(t,o),ed(e,o),od(t,e,o.fromVertex))}for(n=i.destinationEdges;n.next();)i=n.value,i.network!==e&&(id(t,i),ed(e,i),od(t,e,i.toVertex))}}function rd(t){ot(this),this.Tc=t,this.l=new zt(0,0,10,10).freeze(),this.u=new pt(5,5).freeze(),this.Mi=this.ob=null,this.td=new et,this.Gd=new et}function sd(t,e){return t=t.Mi,e=e.Mi,t?e?(t=t.text,e=e.text,t<e?-1:t>e?1:0):1:null!==e?-1:0}function ad(t){ot(this),this.Sc=t,this.ed=this.Yc=this.Nl=this.ob=null}function hd(){zf.call(this),this.isViewportSized=!0,this.rq=this.sq=NaN,this.Qg=new Bt(NaN,NaN).freeze(),this.lf=new Bt(10,10).freeze(),this.yb=cd,this.Eb=fd,this.bd=yd,this.Wc=ld}function ld(t,e){return t=t.text,e=e.text,t<e?-1:t>e?1:0}zf.className="Layout",zf.GoJSScriptURL=$f,zf.declareWorkerLayout=qf,"undefined"!==typeof self&&"undefined"!==typeof self.DedicatedWorkerGlobalScope&&"undefined"!==typeof self&&"undefined"!==typeof self.DedicatedWorkerGlobalScope&&(self.onmessage=function(t){if(t=t.data,"_GoJS"===t._GoJS)if(t.url)importScripts(t.url);else if(t.version)self.postMessage({_GoJS:"_GoJS",version:Ko.version},void 0);else{var e=performance.now(),i=null;t.layout&&(i=Uf(t.layout));var n=null;if(i&&i.Lv&&(n=new i.Lv),!n)throw Error("no registered Worker Layout: "+t.layout);n.network=_f(n,t,!0),n.workerLayout=function(){var t=Hf(n,n.network,!1);return t._GoJS="_GoJS",t.time=performance.now()-e,self.postMessage(t,void 0),!0},n.doLayout(new et)}}),Qf.prototype.clear=function(){if(this.tf)for(var t=this.tf.iterator;t.next();)t.value.clear();if(this.le)for(t=this.le.iterator;t.next();)t.value.clear();this.tf=new nt,this.le=new nt,this.bu=new dt,this.Xt=new dt},Qf.prototype.toString=function(t){void 0===t&&(t=0);var e="LayoutNetwork"+(null!==this.layout?"("+this.layout.toString()+")":"");if(0>=t)return e;if(e+=" vertexes: "+this.tf.count+" edges: "+this.le.count,1<t){for(var i=this.tf.iterator;i.next();)e+="\n    "+i.value.toString(t-1);for(i=this.le.iterator;i.next();)e+="\n    "+i.value.toString(t-1)}return e},Qf.prototype.createVertex=function(){return new rd(this)},Qf.prototype.createEdge=function(){return new ad(this)},Qf.prototype.Ag=function(t,e,i){if(null!==t){for(void 0===e&&(e=!1),void 0===i&&(i=null),null===i&&(i=function(t){if(t instanceof ec)return!t.isLinkLabel;if(t instanceof Nc){var e=t.fromNode;return null!==e&&!e.isLinkLabel&&(t=t.toNode,null!==t&&!t.isLinkLabel)}return!1}),t=t.iterator;t.next();){var n=t.value;if(n instanceof ec&&(!e||n.isTopLevel)&&n.canLayout()&&i(n))if(n instanceof bc&&null===n.layout)this.Ag(n.memberParts,!1);else if(null===this.kj(n)){var o=this.createVertex();o.node=n,this.Bg(o)}}for(t.reset();t.next();)if(n=t.value,n instanceof Nc&&(!e||n.isTopLevel)&&n.canLayout()&&i(n)&&null===this.Eq(n)){var r=n.fromNode;o=n.toNode,null!==r&&null!==o&&r!==o&&(r=this.findGroupVertex(r),o=this.findGroupVertex(o),null!==r&&null!==o&&this.Fk(r,o,n))}}},Qf.prototype.findGroupVertex=function(t){if(null===t)return null;var e=t.findVisibleNode();if(null===e)return null;if(t=this.kj(e),null!==t)return t;for(e=e.containingGroup;null!==e;){if(t=this.kj(e),null!==t)return t;e=e.containingGroup}return null},i=Qf.prototype,i.Bg=function(t){if(null!==t){this.tf.add(t);var e=t.node;null!==e&&this.bu.add(e,t),t.network=this}},i.mk=function(t){if(null===t)return null;var e=this.kj(t);return null===e&&(e=this.createVertex(),e.node=t,this.Bg(e)),e},i.Ov=function(t){if(null!==t&&td(this,t)){for(var e=t.td,i=e.count-1;0<=i;i--){var n=e.J(i);this.vk(n)}for(e=t.Gd,t=e.count-1;0<=t;t--)i=e.J(t),this.vk(i)}},i.Lz=function(t){null!==t&&(t=this.kj(t),null!==t&&this.Ov(t))},i.kj=function(t){return null===t?null:this.bu.G(t)},i.tm=function(t){if(null!==t){ed(this,t);var e=t.toVertex;null!==e&&e.Ev(t),e=t.fromVertex,null!==e&&e.Cv(t)}},i.oz=function(t){if(null===t)return null;var e=t.fromNode,i=t.toNode,n=this.Eq(t);return null===n?(n=this.createEdge(),n.link=t,null!==e&&(n.fromVertex=this.mk(e)),null!==i&&(n.toVertex=this.mk(i)),this.tm(n)):(n.fromVertex=null!==e?this.mk(e):null,n.toVertex=null!==i?this.mk(i):null),n},i.vk=function(t){if(null!==t){var e=t.toVertex;null!==e&&e.Nv(t),e=t.fromVertex,null!==e&&e.Mv(t),id(this,t)}},i.Kz=function(t){null!==t&&(t=this.Eq(t),null!==t&&this.vk(t))},i.Eq=function(t){return null===t?null:this.Xt.G(t)},i.Fk=function(t,e,i){if(null===t||null===e)return null;if(t.network===this&&e.network===this){var n=this.createEdge();return n.link=i,n.fromVertex=t,n.toVertex=e,this.tm(n),n}return null},i.Rm=function(t){if(null!==t){var e=t.fromVertex,i=t.toVertex;null!==e&&null!==i&&(e.Mv(t),i.Nv(t),t.Rm(),e.Ev(t),i.Cv(t))}},i.Bq=function(){for(var t=j(),e=this.le.iterator;e.next();){var i=e.value;i.fromVertex===i.toVertex&&t.push(i)}for(e=t.length,i=0;i<e;i++)this.vk(t[i]);O(t)},Qf.prototype.deleteArtificialVertexes=function(){for(var t=j(),e=this.tf.iterator;e.next();){var i=e.value;null===i.node&&null===i.data&&t.push(i)}for(i=t.length,e=0;e<i;e++)this.Ov(t[e]);for(e=j(),i=this.le.iterator;i.next();){var n=i.value;null===n.link&&null===n.data&&e.push(n)}for(i=e.length,n=0;n<i;n++)this.vk(e[n]);O(t),O(e)},Qf.prototype.Xy=function(t){void 0===t&&(t=!0),t&&(this.deleteArtificialVertexes(),nd(this),this.Bq()),t=new et;for(var e=!0;e;){e=!1;for(var i=this.tf.iterator;i.next();){var n=i.value;if(0<n.td.count||0<n.Gd.count){e=this.layout.createNetwork(),t.add(e),od(this,e,n),e=!0;break}}}return t.sort((function(t,e){return null===t||null===e||t===e?0:e.vertexes.count-t.vertexes.count})),t},Qf.prototype.Rz=function(){for(var t=new nt,e=this.tf.iterator;e.next();)t.add(e.value.node);for(e=this.le.iterator;e.next();)t.add(e.value.link);return t},d.Object.defineProperties(Qf.prototype,{layout:{get:function(){return this.kc},set:function(t){null!==t&&(this.kc=t)}},vertexes:{get:function(){return this.tf}},edges:{get:function(){return this.le}}}),Qf.prototype.findAllParts=Qf.prototype.Rz,Qf.prototype.splitIntoSubNetworks=Qf.prototype.Xy,Qf.prototype.deleteSelfEdges=Qf.prototype.Bq,Qf.prototype.reverseEdge=Qf.prototype.Rm,Qf.prototype.linkVertexes=Qf.prototype.Fk,Qf.prototype.findEdge=Qf.prototype.Eq,Qf.prototype.deleteLink=Qf.prototype.Kz,Qf.prototype.deleteEdge=Qf.prototype.vk,Qf.prototype.addLink=Qf.prototype.oz,Qf.prototype.addEdge=Qf.prototype.tm,Qf.prototype.findVertex=Qf.prototype.kj,Qf.prototype.deleteNode=Qf.prototype.Lz,Qf.prototype.deleteVertex=Qf.prototype.Ov,Qf.prototype.addNode=Qf.prototype.mk,Qf.prototype.addVertex=Qf.prototype.Bg,Qf.prototype.addParts=Qf.prototype.Ag,Qf.className="LayoutNetwork",rd.prototype.serializeVertexProperties=function(t){t.id=st(this),t.key=this.node?this.node.key:this.data?this.data.Di:void 0,void 0===t.key&&(t.key=null),t.x=this.bounds.x,t.y=this.bounds.y,t.kB=this.bounds.width,t.tA=this.bounds.height,t.fx=this.focus.x,t.fy=this.focus.y;var e=[];this.td.each((function(t){e.push(st(t))})),t.Uy=e;var i=[];this.Gd.each((function(t){i.push(st(t))})),t.jy=i},rd.prototype.Cq=function(t,e,i){if(null!==t){this.x=t.x,this.y=t.y,this.width=t.kB,this.height=t.tA,this.focusX=t.fx,this.focusY=t.fy;var n=this;t.Uy&&t.Uy.forEach((function(t){(t=i.get(t))&&n.td.add(t)})),t.jy&&t.jy.forEach((function(t){(t=i.get(t))&&n.Gd.add(t)}))}},rd.prototype.clear=function(){this.Mi=this.ob=null,this.td=new et,this.Gd=new et},rd.prototype.toString=function(t){void 0===t&&(t=0);var e="LayoutVertex#"+st(this);if(0<t&&(e+=null!==this.node?"("+this.node.toString()+")":"",1<t)){t="";for(var i=!0,n=this.td.iterator;n.next();){var o=n.value;i?i=!1:t+=",",t+=o.toString(0)}for(o="",i=!0,n=this.Gd.iterator;n.next();){var r=n.value;i?i=!1:o+=",",o+=r.toString(0)}e+=" sources: "+t+" destinations: "+o}return e},rd.prototype.commit=function(){var t=this.ob;if(null!==t){var e=this.bounds,i=t.bounds;N(i)?(i.x=e.x,i.y=e.y,i.width=e.width,i.height=e.height):t.bounds=e.copy()}else if(t=this.node,null!==t){if(e=this.bounds,!(t instanceof bc)){i=zt.alloc();var n=this.network.layout.nj(t,i),o=t.locationObject.da(ae);if(n.s()&&o.s())return t.moveTo(e.x+this.focusX-(o.x-n.x),e.y+this.focusY-(o.y-n.y)),void zt.free(i);zt.free(i)}t.moveTo(e.x,e.y)}},rd.prototype.Ev=function(t){null!==t&&(this.td.contains(t)||this.td.add(t))},rd.prototype.Nv=function(t){null!==t&&this.td.remove(t)},rd.prototype.Cv=function(t){null!==t&&(this.Gd.contains(t)||this.Gd.add(t))},rd.prototype.Mv=function(t){null!==t&&this.Gd.remove(t)},d.Object.defineProperties(rd.prototype,{sourceEdgesArrayAccess:{get:function(){return this.td._dataArray}},destinationEdgesArrayAccess:{get:function(){return this.Gd._dataArray}},data:{get:function(){return this.ob},set:function(t){if(this.ob=t,null!==t&&t.bounds){var e=t.bounds;t=e.x;var i=e.y,n=e.width;e=e.height,this.u.h(n/2,e/2),this.l.h(t,i,n,e)}}},node:{get:function(){return this.Mi},set:function(t){if(this.Mi!==t){this.Mi=t,t.Ta();var e=this.network.layout,i=zt.alloc(),n=e.nj(t,i);e=n.x;var o=n.y,r=n.width;if(n=n.height,isNaN(e)&&(e=0),isNaN(o)&&(o=0),this.l.h(e,o,r,n),zt.free(i),!(t instanceof bc)&&(t=t.locationObject.da(ae),t.s()))return void this.u.h(t.x-e,t.y-o);this.u.h(r/2,n/2)}}},bounds:{get:function(){return this.l},set:function(t){this.l.w(t)||this.l.assign(t)}},focus:{get:function(){return this.u},set:function(t){this.u.w(t)||this.u.assign(t)}},centerX:{get:function(){return this.l.x+this.u.x},set:function(t){var e=this.l;e.x+this.u.x!==t&&(e.ea(),e.x=t-this.u.x,e.freeze())}},centerY:{get:function(){return this.l.y+this.u.y},set:function(t){var e=this.l;e.y+this.u.y!==t&&(e.ea(),e.y=t-this.u.y,e.freeze())}},focusX:{get:function(){return this.u.x},set:function(t){var e=this.u;e.x!==t&&(e.ea(),e.x=t,e.freeze())}},focusY:{get:function(){return this.u.y},set:function(t){var e=this.u;e.y!==t&&(e.ea(),e.y=t,e.freeze())}},x:{get:function(){return this.l.x},set:function(t){var e=this.l;e.x!==t&&(e.ea(),e.x=t,e.freeze())}},y:{get:function(){return this.l.y},set:function(t){var e=this.l;e.y!==t&&(e.ea(),e.y=t,e.freeze())}},width:{get:function(){return this.l.width},set:function(t){var e=this.l;e.width!==t&&(e.ea(),e.width=t,e.freeze())}},height:{get:function(){return this.l.height},set:function(t){var e=this.l;e.height!==t&&(e.ea(),e.height=t,e.freeze())}},network:{get:function(){return this.Tc},set:function(t){this.Tc=t}},sourceVertexes:{get:function(){for(var t=new nt,e=this.sourceEdges;e.next();)t.add(e.value.fromVertex);return t.iterator}},destinationVertexes:{get:function(){for(var t=new nt,e=this.destinationEdges;e.next();)t.add(e.value.toVertex);return t.iterator}},vertexes:{get:function(){for(var t=new nt,e=this.sourceEdges;e.next();)t.add(e.value.fromVertex);for(e=this.destinationEdges;e.next();)t.add(e.value.toVertex);return t.iterator}},sourceEdges:{get:function(){return this.td.iterator}},destinationEdges:{get:function(){return this.Gd.iterator}},edges:{get:function(){for(var t=new et,e=this.sourceEdges;e.next();)t.add(e.value);for(e=this.destinationEdges;e.next();)t.add(e.value);return t.iterator}},edgesCount:{get:function(){return this.td.count+this.Gd.count}}}),rd.prototype.deleteDestinationEdge=rd.prototype.Mv,rd.prototype.addDestinationEdge=rd.prototype.Cv,rd.prototype.deleteSourceEdge=rd.prototype.Nv,rd.prototype.addSourceEdge=rd.prototype.Ev,rd.className="LayoutVertex",rd.standardComparer=sd,rd.smartComparer=function(t,e){if(null!==t){if(null!==e){t=t.Mi;var i=e.Mi;if(null!==t){if(null!==i){for(e=t.text.toLocaleLowerCase().split(/([+\-]?[\.]?\d+(?:\.\d*)?(?:e[+\-]?\d+)?)/),t=i.text.toLocaleLowerCase().split(/([+\-]?[\.]?\d+(?:\.\d*)?(?:e[+\-]?\d+)?)/),i=0;i<e.length;i++)if(""!==t[i]&&void 0!==t[i]){var n=parseFloat(e[i]),o=parseFloat(t[i]);if(isNaN(n)){if(!isNaN(o))return 1;if(0!==e[i].localeCompare(t[i]))return e[i].localeCompare(t[i])}else{if(isNaN(o))return-1;if(0!==n-o)return n-o}}else if(""!==e[i])return 1;return""!==t[i]&&void 0!==t[i]?-1:0}return 1}return null!==i?-1:0}return 1}return null!==e?-1:0},ad.prototype.clear=function(){this.ed=this.Yc=this.Nl=this.ob=null},ad.prototype.serializeEdgeProperties=function(t){t.id=st(this),t.key=this.link?this.link.key:this.data?this.data.Di:void 0,void 0===t.key&&(t.key=null),t.from=this.fromVertex?st(this.fromVertex):null,t.fB=this.toVertex?st(this.toVertex):null},ad.prototype.deserializeEdgeProperties=function(t,e){if(null!==t){var i=e.get(t.from);i&&(this.fromVertex=i),(t=e.get(t.fB))&&(this.toVertex=t)}},ad.prototype.toString=function(t){void 0===t&&(t=0);var e="LayoutEdge#"+st(this);return 0<t&&(e+=null!==this.Nl?"("+this.Nl.toString()+")":"",1<t&&(e+=" "+(this.Yc?this.Yc.toString():"null")+" --\x3e "+(this.ed?this.ed.toString():"null"))),e},ad.prototype.Rm=function(){var t=this.Yc;this.Yc=this.ed,this.ed=t},ad.prototype.commit=function(){},ad.prototype.zy=function(t){return this.ed===t?this.Yc:this.Yc===t?this.ed:null},d.Object.defineProperties(ad.prototype,{network:{get:function(){return this.Sc},set:function(t){this.Sc=t}},data:{get:function(){return this.ob},set:function(t){this.ob!==t&&(this.ob=t)}},link:{get:function(){return this.Nl},set:function(t){this.Nl!==t&&(this.Nl=t)}},fromVertex:{get:function(){return this.Yc},set:function(t){this.Yc!==t&&(this.Yc=t)}},toVertex:{get:function(){return this.ed},set:function(t){this.ed!==t&&(this.ed=t)}}}),ad.prototype.getOtherVertex=ad.prototype.zy,ad.className="LayoutEdge",f(hd,zf),hd.prototype.cloneProtected=function(t){zf.prototype.cloneProtected.call(this,t),t.sq=this.sq,t.rq=this.rq,t.Qg.assign(this.Qg),t.lf.assign(this.lf),t.yb=this.yb,t.Eb=this.Eb,t.bd=this.bd,t.Wc=this.Wc},hd.prototype.jb=function(t){t.classType===hd?t===yd||t===md||t===pd||t===gd?this.sorting=t:t===fd||t===dd?this.arrangement=t:t===cd||t===ud?this.alignment=t:w("Unknown enum value: "+t):zf.prototype.jb.call(this,t)},hd.prototype.doLayout=function(t){this.arrangementOrigin=this.initialOrigin(this.arrangementOrigin);var e=this.$x(t);t=this.diagram;for(var i=e.copy().iterator;i.next();){var n=i.value;if(!n.Ph()||null===n.fromNode&&null===n.toNode){if(n.Ta(),n instanceof bc)for(n=n.memberParts;n.next();)e.remove(n.value)}else e.remove(n)}var o=e.ma();if(0!==o.length){switch(this.sorting){case gd:o.reverse();break;case yd:o.sort(this.comparer);break;case md:o.sort(this.comparer),o.reverse()}var r=this.wrappingColumn;isNaN(r)&&(r=0);var s=this.wrappingWidth;switch(isNaN(s)&&null!==t?(e=t.padding,s=Math.max(t.viewportBounds.width-e.left-e.right,0)):s=Math.max(this.wrappingWidth,0),0>=r&&0>=s&&(r=1),e=this.spacing.width,isFinite(e)||(e=0),i=this.spacing.height,isFinite(i)||(i=0),null!==t&&t.va("Layout"),n=[],this.alignment){case ud:var a=e,h=i,l=zt.alloc(),u=Math.max(this.cellSize.width,1);if(!isFinite(u))for(var c=u=0;c<o.length;c++){var f=this.nj(o[c],l);u=Math.max(u,f.width)}if(u=Math.max(u+a,1),c=Math.max(this.cellSize.height,1),!isFinite(c))for(f=c=0;f<o.length;f++){var d=this.nj(o[f],l);c=Math.max(c,d.height)}c=Math.max(c+h,1),f=this.arrangement;for(var p=d=this.arrangementOrigin.x,g=this.arrangementOrigin.y,y=0,m=0,v=0;v<o.length;v++){var x=o[v],b=this.nj(x,l),w=Math.ceil((b.width+a)/u)*u,k=Math.ceil((b.height+h)/c)*c;switch(f){case dd:var M=Math.abs(p-b.width);break;default:M=p+b.width}switch((0<r&&y>r-1||0<s&&0<y&&M-d>s)&&(n.push(new zt(0,g,s+a,m)),y=0,p=d,g+=m,m=0),m=Math.max(m,k),f){case dd:b=-b.width;break;default:b=0}switch(x.moveTo(p+b,g),f){case dd:p-=w;break;default:p+=w}y++}n.push(new zt(0,g,s+a,m)),zt.free(l);break;case cd:for(h=s,u=r,c=e,f=i,s=zt.alloc(),d=Math.max(this.cellSize.width,1),r=g=l=0,a=pt.alloc(),p=0;p<o.length;p++)m=o[p],y=this.nj(m,s),m=m.Df(m.locationObject,m.locationSpot,a),l=Math.max(l,m.x),g=Math.max(g,y.width-m.x),r=Math.max(r,m.y);switch(p=this.arrangement,p){case dd:l+=c;break;default:g+=c}d=isFinite(d)?Math.max(d+c,1):Math.max(l+g,1);var S=m=this.arrangementOrigin.x;for(v=this.arrangementOrigin.y,g=0,h>=l&&(h-=l),l=x=0,w=Math.max(this.cellSize.height,1),b=r=0,k=!0,y=pt.alloc(),M=0;M<o.length;M++){var P=o[M],N=this.nj(P,s),C=P.Df(P.locationObject,P.locationSpot,a);if(0<g)switch(p){case dd:S=(S-m-(N.width-C.x))/d,S=_e.aa(Math.round(S),S)?Math.round(S):Math.floor(S),S=S*d+m;break;default:S=(S-m+C.x)/d,S=_e.aa(Math.round(S),S)?Math.round(S):Math.ceil(S),S=S*d+m}else switch(p){case dd:x=S+C.x+N.width;break;default:x=S-C.x}switch(p){case dd:var T=-(S+C.x)+x;break;default:T=S+N.width-C.x-x}if(0<u&&g>u-1||0<h&&0<g&&T>h){for(n.push(new zt(0,k?v-r:v,h+c,b+r+f)),S=0;S<g&&M!==g;S++){T=o[M-g+S];var A=T.Df(T.locationObject,T.locationSpot,y);T.moveTo(T.position.x,T.position.y+r-A.y)}b+=f,v=k?v+b:v+(b+r),g=b=r=0,S=m,k=!1}switch(S===m&&(l=p===dd?Math.max(l,N.width-C.x):Math.min(l,-C.x)),r=Math.max(r,C.y),b=Math.max(b,N.height-C.y),isFinite(w)&&(b=Math.max(b,Math.max(N.height,w)-C.y)),k?P.moveTo(S-C.x,v-C.y):P.moveTo(S-C.x,v),p){case dd:S-=C.x+c;break;default:S+=N.width-C.x+c}g++}if(n.push(new zt(0,v,h+c,(k?b:b+r)+f)),o.length!==g)for(h=0;h<g;h++)u=o[o.length-g+h],c=u.Df(u.locationObject,u.locationSpot,a),u.moveTo(u.position.x,u.position.y+r-c.y);if(pt.free(a),pt.free(y),p===dd)for(o=0;o<n.length;o++)r=n[o],r.width+=l,r.x-=l;else for(o=0;o<n.length;o++)r=n[o],r.x>l&&(r.width+=r.x-l,r.x=l);zt.free(s)}for(a=r=s=o=0;a<n.length;a++)h=n[a],o=Math.min(o,h.x),s=Math.min(s,h.y),r=Math.max(r,h.x+h.width);this.arrangement===dd?this.commitLayers(n,new pt(o+e/2-(r+o),s-i/2)):this.commitLayers(n,new pt(o-e/2,s-i/2)),null!==t&&t.Xa("Layout"),this.isValidLayout=!0}},hd.prototype.commitLayers=function(){},d.Object.defineProperties(hd.prototype,{wrappingWidth:{get:function(){return this.sq},set:function(t){this.sq!==t&&(0<t||isNaN(t))&&(this.sq=t,this.isViewportSized=isNaN(t),this.B())}},wrappingColumn:{get:function(){return this.rq},set:function(t){this.rq!==t&&(0<t||isNaN(t))&&(this.rq=t,this.B())}},cellSize:{get:function(){return this.Qg},set:function(t){this.Qg.w(t)||(this.Qg.assign(t),this.B())}},spacing:{get:function(){return this.lf},set:function(t){this.lf.w(t)||(this.lf.assign(t),this.B())}},alignment:{get:function(){return this.yb},set:function(t){this.yb===t||t!==cd&&t!==ud||(this.yb=t,this.B())}},arrangement:{get:function(){return this.Eb},set:function(t){this.Eb===t||t!==fd&&t!==dd||(this.Eb=t,this.B())}},sorting:{get:function(){return this.bd},set:function(t){this.bd===t||t!==pd&&t!==gd&&t!==yd&&t!==md||(this.bd=t,this.B())}},comparer:{get:function(){return this.Wc},set:function(t){this.Wc!==t&&(this.Wc=t,this.B())}}});var ud=new U(hd,"Position",0),cd=new U(hd,"Location",1),fd=new U(hd,"LeftToRight",2),dd=new U(hd,"RightToLeft",3),pd=new U(hd,"Forward",4),gd=new U(hd,"Reverse",5),yd=new U(hd,"Ascending",6),md=new U(hd,"Descending",7);function vd(){this.lp=new nt,this.No=new nt,this.Ea=new nt,this.Ue=new dt,this.Te=new dt,this.Qj=new dt,this.C=null,this.mr=!1}function xd(t,e,i){if(void 0!==e&&null!==e&&!t.diagram.undoManager.isUndoingRedoing&&!t.Ue.contains(e)){void 0===i&&(i=!0);t:{if(void 0!==e&&null!==e&&!t.C.undoManager.isUndoingRedoing&&!t.Ue.contains(e)){var n=t.Iq(e),o=bd(t,e,n);if(null!==o&&(ul(o),o=o.copy(),null!==o)){var r=t.diagram.skipsModelSourceBindings;t.diagram.skipsModelSourceBindings=!0,o.Nf=n,o.ob=e,t.mr&&(o.ih="Tool"),t.diagram.add(o),o.ob=null,o.data=e,t.diagram.skipsModelSourceBindings=r,n=o;break t}}n=null}null!==n&&i&&t.resolveReferencesForData(e)}}function bd(t,e,i){t=t.C;var n=t.model;return n.Dk()&&n.fw(e)?(e=t.groupTemplateMap.G(i),null===e&&(e=t.groupTemplateMap.G(""),null===e&&(Cd||(Cd=!0,S('No Group template found for category "'+i+'"'),S("  Using default group template")),e=t.Eu))):(e=t.nodeTemplateMap.G(i),null===e&&(e=t.nodeTemplateMap.G(""),null===e&&(Nd||(Nd=!0,S('No Node template found for category "'+i+'"'),S("  Using default node template")),e=t.Gu))),e}function wd(t,e,i){for(var n in i){var o=e[n],r=i[n];if(C(r)){if(!C(o)||o.length<r.length)return!1;for(var s=0;s<o.length;s++){var a=r[s];if(void 0!==a&&!kd(t,o[s],a))return!1}}else if(!kd(t,o,r))return!1}return!0}function kd(t,e,i){if("function"===typeof i){if(!i(e))return!1}else if(i instanceof RegExp){if(!e||!i.test(e.toString()))return!1}else if(N(e)&&N(i)){if(!wd(t,e,i))return!1}else if(e!==i)return!1;return!0}function Md(t,e){var i=e.Ci;if(C(i)){var n=t.Qj.G(i);if(null===n)n=[],n.push(e),t.Qj.add(i,n);else{for(t=0;t<n.length;t++)if(n[t]===e)return;n.push(e)}}}function Sd(t,e,i){Jh(e,(function(t){t=t.W.j;for(var e=t.length,n=0;n<e;n++)Wr(i,t[n])}));var n=e.Ci;if(C(n)){var o=t.Qj.G(n);if(null!==o)for(var r=0;r<o.length;r++)if(o[r]===e){o.splice(r,1),0===o.length&&t.Qj.remove(n);break}}}function Pd(t,e,i,n,o){if(null===e||o&&!e.canCopy())return null;if(n.contains(e))return n.G(e);var r=t.copyPartData(e,i);if(!(r instanceof Lu))return null;if(r.isSelected=!1,r.isHighlighted=!1,n.add(e,r),e instanceof ec){for(var s=e.linksConnected;s.next();){var a=s.value;if(a.fromNode===e){var h=n.G(a);null!==h&&(h.fromNode=r)}a.toNode===e&&(a=n.G(a),null!==a&&(a.toNode=r))}if(e instanceof bc&&r instanceof bc)for(e=e.memberParts;e.next();)s=Pd(t,e.value,i,n,o),s instanceof Nc||null===s||(s.containingGroup=r)}else if(e instanceof Nc&&r instanceof Nc)for(s=e.fromNode,null!==s&&(s=n.G(s),null!==s&&(r.fromNode=s)),s=e.toNode,null!==s&&(s=n.G(s),null!==s&&(r.toNode=s)),e=e.labelNodes;e.next();)s=Pd(t,e.value,i,n,o),null!==s&&s instanceof ec&&(s.labeledLink=r);return r}hd.className="GridLayout",hd.standardComparer=ld,hd.smartComparer=function(t,e){if(null!==t){if(null!==e){t=t.text.toLocaleLowerCase().split(/([+\-]?[\.]?\d+(?:\.\d*)?(?:e[+\-]?\d+)?)/),e=e.text.toLocaleLowerCase().split(/([+\-]?[\.]?\d+(?:\.\d*)?(?:e[+\-]?\d+)?)/);for(var i=0;i<t.length;i++)if(""!==e[i]&&void 0!==e[i]){var n=parseFloat(t[i]),o=parseFloat(e[i]);if(isNaN(n)){if(!isNaN(o))return 1;if(0!==t[i].localeCompare(e[i]))return t[i].localeCompare(e[i])}else{if(isNaN(o))return-1;if(0!==n-o)return n-o}}else if(""!==t[i])return 1;return""!==e[i]&&void 0!==e[i]?-1:0}return 1}return null!==e?-1:0},hd.Position=ud,hd.Location=cd,hd.LeftToRight=fd,hd.RightToLeft=dd,hd.Forward=pd,hd.Reverse=gd,hd.Ascending=yd,hd.Descending=md,i=vd.prototype,i.clear=function(){this.lp.clear(),this.No.clear(),this.Ea.clear(),this.Ue.clear(),this.Te.clear(),this.Qj.clear()},i.ee=function(t){this.C=t},i.oj=function(t){if(t instanceof ec){if(this.lp.add(t),t instanceof bc){var e=t.containingGroup;null===e?this.C.Dh.add(t):e.Sl.add(t),e=t.layout,null!==e&&(e.diagram=this.C)}}else t instanceof Nc?this.No.add(t):t instanceof Qu||this.Ea.add(t);e=t.data,null===e||t instanceof Qu||(t instanceof Nc?this.Te.add(e,t):this.Ue.add(e,t))},i.Lc=function(t){if(t.nk(),t instanceof ec){if(this.lp.remove(t),t instanceof bc){var e=t.containingGroup;null===e?this.C.Dh.remove(t):e.Sl.remove(t),e=t.layout,null!==e&&(e.diagram=null)}}else t instanceof Nc?this.No.remove(t):t instanceof Qu||this.Ea.remove(t);e=t.data,null===e||t instanceof Qu||(t instanceof Nc?this.Te.remove(e):this.Ue.remove(e))},i.Md=function(){for(var t=this.C.nodeTemplateMap.iterator;t.next();){var e=t.value,i=t.key;(!e.Nc()||e instanceof bc)&&w('Invalid node template in Diagram.nodeTemplateMap: template for "'+i+'" must be a Node or a simple Part, not a Group or Link: '+e)}for(t=this.C.groupTemplateMap.iterator;t.next();)e=t.value,i=t.key,e instanceof bc||w('Invalid group template in Diagram.groupTemplateMap: template for "'+i+'" must be a Group, not a normal Node or Link: '+e);for(t=this.C.linkTemplateMap.iterator;t.next();)e=t.value,i=t.key,e instanceof Nc||w('Invalid link template in Diagram.linkTemplateMap: template for "'+i+'" must be a Link, not a normal Node or simple Part: '+e);for(t=j(),e=this.C.selection.iterator;e.next();)(i=e.value.data)&&t.push(i);for(e=j(),i=this.C.highlighteds.iterator;i.next();){var n=i.value.data;n&&e.push(n)}for(i=j(),n=this.nodes.iterator;n.next();){var o=n.value;null!==o.data&&(i.push(o.data),i.push(o.location))}for(n=this.links.iterator;n.next();)o=n.value,null!==o.data&&(i.push(o.data),i.push(o.location));for(n=this.parts.iterator;n.next();)o=n.value,null!==o.data&&(i.push(o.data),i.push(o.location));for(this.removeAllModeledParts(),this.addAllModeledParts(),n=0;n<t.length;n++)o=this.zc(t[n]),null!==o&&(o.isSelected=!0);for(n=0;n<e.length;n++)o=this.zc(e[n]),null!==o&&(o.isHighlighted=!0);for(n=0;n<i.length;n+=2)o=this.zc(i[n]),null!==o&&(o.location=i[n+1]);O(t),O(e),O(i)},vd.prototype.addAllModeledParts=function(){this.addModeledParts(this.diagram.model.nodeDataArray)},vd.prototype.addModeledParts=function(t,e){var i=this,n=this.diagram.model;t.forEach((function(t){n.ab(t)&&xd(i,t,!1)})),t.forEach((function(t){n.ab(t)&&i.resolveReferencesForData(t)})),!1!==e&&Jr(this.diagram,!1)},vd.prototype.insertLink=function(){return null},vd.prototype.resolveReferencesForData=function(){},vd.prototype.Iq=function(t){return this.C.model.Iq(t)},vd.prototype.getLinkCategoryForData=function(){return""},vd.prototype.setLinkCategoryForData=function(){},vd.prototype.setFromNodeForLink=function(){},vd.prototype.setToNodeForLink=function(){},vd.prototype.findLinkTemplateForCategory=function(t){var e=this.C.linkTemplateMap.G(t);return null===e&&(e=this.C.linkTemplateMap.G(""),null===e&&(Td||(Td=!0,S('No Link template found for category "'+t+'"'),S("  Using default link template")),e=this.C.Fu)),e},vd.prototype.removeAllModeledParts=function(){this.fu(this.diagram.model.nodeDataArray)},vd.prototype.fu=function(t){var e=this;t.forEach((function(t){e.$q(t)}))},vd.prototype.$q=function(t){t=this.zc(t),null!==t&&(Fr(this.diagram,t,!1),this.unresolveReferencesForPart(t))},vd.prototype.unresolveReferencesForPart=function(){},vd.prototype.removeDataForLink=function(){},vd.prototype.findPartForKey=function(t){return null===t||void 0===t?null:(t=this.C.model.Kb(t),null!==t?this.Ue.G(t):null)},vd.prototype.Cb=function(t){return null===t||void 0===t?null:(t=this.C.model.Kb(t),null===t?null:(t=this.Ue.G(t),t instanceof ec?t:null))},vd.prototype.findLinkForKey=function(){return null},i=vd.prototype,i.zc=function(t){if(null===t)return null;var e=this.Ue.G(t);return null!==e?e:e=this.Te.G(t)},i.gj=function(t){return null===t?null:(t=this.Ue.G(t),t instanceof ec?t:null)},i.yc=function(t){return null===t?null:this.Te.G(t)},i.It=function(t){for(var e=0;e<arguments.length;++e);e=new nt;for(var i=this.lp.iterator;i.next();){var n=i.value,o=n.data;if(null!==o)for(var r=0;r<arguments.length;r++){var s=arguments[r];if(N(s)&&wd(this,o,s)){e.add(n);break}}}return e.iterator},i.Ht=function(t){for(var e=0;e<arguments.length;++e);e=new nt;for(var i=this.No.iterator;i.next();){var n=i.value,o=n.data;if(null!==o)for(var r=0;r<arguments.length;r++){var s=arguments[r];if(N(s)&&wd(this,o,s)){e.add(n);break}}}return e.iterator},vd.prototype.doModelChanged=function(t){if(this.C){var e=this.C;if(t.model===e.model){var i=t.change;if(e.doModelChanged(t),e.Z){e.Z=!1;try{var n=t.modelChange;if(""!==n)if(i===Pi){if("nodeCategory"===n){var o=this.zc(t.object),r=t.newValue;null!==o&&"string"===typeof r&&(o.category=r)}else"nodeDataArray"===n&&(this.fu(t.oldValue),this.addModeledParts(t.newValue));e.isModified=!0}else if(i===Ni){var s=t.newValue;"nodeDataArray"===n&&N(s)&&xd(this,s),e.isModified=!0}else if(i===Ci){var a=t.oldValue;"nodeDataArray"===n&&N(a)&&this.$q(a),e.isModified=!0}else i===Si&&("SourceChanged"===n?null!==t.object?this.updateDataBindings(t.object,t.propertyName):(this.ir(),this.updateAllTargetBindings()):"ModelDisplaced"===n&&this.Md());else if(i===Pi){var h=t.propertyName,l=t.object;l===e.model?"nodeKeyProperty"!==h&&"nodeCategoryProperty"!==h||e.undoManager.isUndoingRedoing||this.Md():this.updateDataBindings(l,h),e.isModified=!0}else if(i===Ni||i===Ci){var u=t.change===Ni,c=u?t.newParam:t.oldParam,f=u?t.newValue:t.oldValue,d=this.Qj.G(t.object);if(Array.isArray(d))for(t=0;t<d.length;t++){var p=d[t];if(u)dl(p,f,c);else if(!(0>c)){var g=c+fl(p);p.Lc(g,!0),pl(p,g,c)}}e.isModified=!0}}finally{e.Z=!0}}}}},vd.prototype.updateAllTargetBindings=function(t){void 0===t&&(t="");for(var e=this.parts.iterator;e.next();)e.value.Da(t);for(e=this.nodes.iterator;e.next();)e.value.Da(t);for(e=this.links.iterator;e.next();)e.value.Da(t)},vd.prototype.ir=function(){for(var t=this.C.model,e=new nt,i=t.nodeDataArray,n=0;n<i.length;n++)e.add(i[n]);var o=[];for(this.nodes.each((function(t){null===t.data||e.contains(t.data)||o.push(t.data)})),this.parts.each((function(t){null===t.data||e.contains(t.data)||o.push(t.data)})),o.forEach((function(e){Qd(t,e,!1)})),n=0;n<i.length;n++){var r=i[n];null===this.zc(r)&&Zd(t,r,!1)}for(this.refreshDataBoundLinks(),i=this.parts.iterator;i.next();)i.value.updateRelationshipsFromData();for(i=this.nodes.iterator;i.next();)i.value.updateRelationshipsFromData();for(i=this.links.iterator;i.next();)i.value.updateRelationshipsFromData()},vd.prototype.refreshDataBoundLinks=function(){},vd.prototype.updateRelationshipsFromData=function(){},vd.prototype.updateDataBindings=function(t,e){if("string"===typeof e){var i=this.zc(t);if(null!==i)i.Da(e);else{i=null;for(var n=this.Qj.iterator;n.next();){for(var o=n.value,r=0;r<o.length;r++){var s=o[r].qy(t);null!==s&&(null===i&&(i=j()),i.push(s))}if(null!==i)break}if(null!==i){for(n=0;n<i.length;n++)i[n].Da(e);O(i)}}t===this.diagram.model.modelData&&this.updateAllTargetBindings(e)}},vd.prototype.tk=function(t,e,i){void 0===i&&(i=!1);var n=new dt;if(C(t))for(var o=0;o<t.length;o++)Pd(this,t[o],e,n,i);else for(t=t.iterator;t.next();)Pd(this,t.value,e,n,i);if(null!==e){i=e.model,t=e.toolManager.findTool("Dragging"),t=null!==t?t.dragOptions.dragsLink:e.kl.dragsLink,o=new nt;for(var r=new dt,s=n.iterator;s.next();){var a=s.value;if(a instanceof Nc)t||null!==a.fromNode&&null!==a.toNode||o.add(a);else if(a instanceof ec&&null!==a.data&&i.Em()){var h=a;a=s.key;var l=a.Fg();null!==l&&(l=n.G(l),null!==l?(i.fe(h.data,i.ja(l.data)),h=e.yc(h.data),a=a.jj(),null!==a&&null!==h&&r.add(a,h)):i.fe(h.data,void 0))}}if(0<o.count&&e.gu(o,!1),0<r.count)for(i=r.iterator;i.next();)n.add(i.key,i.value)}if(null!==e&&null!==this.C&&(e=e.model,i=e.afterCopyFunction,null!==i)){var u=new dt;n.each((function(t){null!==t.key.data&&u.add(t.key.data,t.value.data)})),i(u,e,this.C.model)}for(e=n.iterator;e.next();)e.value.Da();return n},vd.prototype.copyPartData=function(t,e){var i=null,n=t.data;if(null!==n&&null!==e){var o=e.model;t instanceof Nc||(n=o.copyNodeData(n),N(n)&&(o.uf(n),i=e.zc(n)))}else ul(t),i=t.copy(),null!==i&&(o=this.C,null!==e?e.add(i):null!==n&&null!==o&&null!==o.commandHandler&&o.commandHandler.copiesClipboardData&&(e=o.model,o=null,i instanceof Nc||(o=e.copyNodeData(n)),N(o)&&(i.data=o)));return i},d.Object.defineProperties(vd.prototype,{nodes:{get:function(){return this.lp}},links:{get:function(){return this.No}},parts:{get:function(){return this.Ea}},diagram:{get:function(){return this.C}},addsToTemporaryLayer:{get:function(){return this.mr},set:function(t){this.mr=t}}}),vd.prototype.updateAllRelationshipsFromData=vd.prototype.ir,vd.prototype.findLinksByExample=vd.prototype.Ht,vd.prototype.findNodesByExample=vd.prototype.It,vd.prototype.findLinkForData=vd.prototype.yc,vd.prototype.findNodeForData=vd.prototype.gj,vd.prototype.findPartForData=vd.prototype.zc,vd.prototype.findNodeForKey=vd.prototype.Cb,vd.prototype.removeModeledPart=vd.prototype.$q,vd.prototype.removeModeledParts=vd.prototype.fu,vd.prototype.rebuildParts=vd.prototype.Md;var Nd=!1,Cd=!1,Td=!1;function Ad(t){vd.apply(this,arguments)}function Ld(t,e){e.forEach((function(e){jd(t,e)})),Jr(t.diagram,!1)}function jd(t,e){if(void 0!==e&&null!==e&&!t.diagram.undoManager.isUndoingRedoing&&!t.Te.contains(e)){var i=t.getLinkCategoryForData(e),n=t.findLinkTemplateForCategory(i);if(null!==n){ul(n);var o=n.copy();if(null!==o){n=t.diagram.skipsModelSourceBindings,t.diagram.skipsModelSourceBindings=!0,o.Nf=i,o.ob=e,i=t.diagram.model;var r=bp(i,e,!0);""!==r&&(o.fromPortId=r),r=vp(i,e,!0),void 0!==r&&(r=t.Cb(r),r instanceof ec&&(o.fromNode=r)),r=bp(i,e,!1),""!==r&&(o.toPortId=r),r=vp(i,e,!1),void 0!==r&&(r=t.Cb(r),r instanceof ec&&(o.toNode=r)),i=i.Bf(e),Array.isArray(i)&&i.forEach((function(e){e=t.Cb(e),null!==e&&(e.labeledLink=o)})),t.mr&&(o.ih="Tool"),t.diagram.add(o),o.ob=null,o.data=e,t.diagram.skipsModelSourceBindings=n}}}}function Od(t,e){e.forEach((function(e){t.$q(e)}))}function Dd(){vd.apply(this,arguments),this.rh=null}function Fd(t,e,i){if(null!==e&&null!==i){var n=t.diagram.toolManager.findTool("Linking"),o=e,r=i;if(t.diagram.isTreePathToChildren){for(e=r.linksConnected;e.next();)if(e.value.toNode===r)return}else for(o=i,r=e,e=o.linksConnected;e.next();)if(e.value.fromNode===o)return;if((null===n||!fn(n,o,r,null,!0))&&(n=t.getLinkCategoryForData(i.data),e=t.findLinkTemplateForCategory(n),null!==e&&(ul(e),e=e.copy(),null!==e))){var s=t.diagram.skipsModelSourceBindings;t.diagram.skipsModelSourceBindings=!0,e.Nf=n,e.ob=i.data,e.fromNode=o,e.toNode=r,t.diagram.add(e),e.ob=null,e.data=i.data,t.diagram.skipsModelSourceBindings=s}}}function Bd(t){this.Oi=new nt,this.Li=new nt,this.tu=',\n  "insertedNodeKeys": ',this.lx=',\n  "modifiedNodeData": ',this.vu=',\n  "removedNodeKeys": ',this.Yh=null,ot(this),this.Ln=this.oa="",this.$f=!1,this.l={},this.Fc=[],this.Wa=new dt,this.Ni="key",this.il=this.Pl=null,this.Cn=this.Dn=!1,this.Fn=!0,this.kn=null,this.Yj="category",this.Tf=new dt,this.cv=new et,this.vg=!1,this.u=null,this.undoManager=new Ai,void 0!==t&&(this.nodeDataArray=t)}function Id(t,e,i,n,o,r){function s(t,i){a?(void 0===t.__gohashid&&r.push(t),n.set(t,i)):(t=at++,n.set(t,i),o.set(t,e))}if(!N(e))return e;r||(r=[]);var a=Object.isExtensible(e);if(n||(n=new dt),a){var h=n.get(e);if(h)return h}else for(o||(o=new dt),h=o.iterator;h.next();){var l=h.key;if(h.value===e&&(l=n.get(l)))return l}if(Array.isArray(e)){h=[],s(e,h);for(var u=0;u<e.length;u++)h.push(Id(t,e[u],!1,n,o,r))}else if(e instanceof pt||e instanceof Bt||e instanceof zt||e instanceof Qt||e instanceof Ge)h=e.copy(),s(e,h);else{if(e instanceof eh||e instanceof We||e instanceof U)return e;if(e instanceof et)h=(new et).addAll(Id(t,e.ma(),!1,n,o,r)),s(e,h);else if(e instanceof nt)h=(new nt).addAll(Id(t,e.ma(),!1,n,o,r)),s(e,h);else if(e instanceof dt)h=(new dt).addAll(Id(t,e.ma(),!1,n,o,r)),s(e,h);else if(e instanceof Date)h=new Date(e.getTime()),s(e,h);else if(e instanceof RegExp)h=new RegExp(e),s(e,h),h.lastIndex=e.lastIndex;else if("function"===typeof e.copy)h=e.copy(),s(e,h);else for(u in h={},s(e,h),e)"__gohashid"!==u&&(h[u]=Id(t,e[u],!1,n,o,r))}return i&&r.forEach((function(t){delete t.__gohashid})),h}function Ed(t){return',\n  "modelData": '+Hd(t,t.modelData)}function Rd(t,e){e=e.modelData,N(e)&&(t.Om(e),t.modelData=e)}function zd(t,e,i,n){if(e===i)return!0;if(typeof e!==typeof i||"function"===typeof e||"function"===typeof i)return!1;if(Array.isArray(e)&&Array.isArray(i)){if(n.G(e)===i)return!0;if(n.add(e,i),e.length!==i.length)return!1;for(var o=0;o<e.length;o++)if(!zd(t,e[o],i[o],n))return!1;return!0}if(N(e)&&N(i)){if(n.G(e)===i)return!0;for(var r in n.add(e,i),e){var s=e[r];if(!Ud(r,s)){var a=i[r];if(void 0===a||!zd(t,s,a,n))return!1}}for(o in i)if(r=i[o],!Ud(o,r)&&(s=e[o],void 0===s||!zd(t,s,r,n)))return!1;return!0}return!1}function Vd(t,e,i){t[i]!==e[i]&&w("Model.computeJsonDifference: Model."+i+' is not the same in both models: "'+t[i]+'" and "'+e[i]+'"')}function Gd(t,e){function i(t,e){if((e=e.part)&&(e=e.data,t!==e)){var i=n.get(t);null===i?(i=new nt,i.add(e),n.add(t,i)):i.add(e)}}var n=t.Yh;null===n&&(n=new dt,e.changes.each((function(t){if(null!==t.diagram){var e=t.change;e===Pi?(t=t.object.panel)&&(e=t.data)&&i(e,t):e!==Ni&&e!==Ci||(t=t.object,(e=t.itemArray)&&i(e,t))}})),t.Yh=n)}function Yd(t,e){for(var i=new nt,n=0;n<t.nodeDataArray.length;n++){var o=t.nodeDataArray[n];Xd(t,e,o,o,i)}return i}function Xd(t,e,i,n,o){if(Array.isArray(i))for(var r=0;r<i.length;r++){var s=i[r];if(s===e)return o.add(n),!0;if(Xd(t,e,s,n,o))return!0}else if(N(i)&&Object.getPrototypeOf(i)===Object.prototype)for(r in i){if(s=i[r],s===e)return o.add(n),!0;if(Xd(t,e,s,n,o))return!0}return!1}function qd(t,e,i){void 0===i&&(i=!1);var n=e.length;if(0>=n)return"[]";var o=new H;o.add("["),i&&1<n&&o.add("\n");for(var r=0;r<n;r++){var s=e[r];void 0!==s&&(0<r&&(o.add(","),i&&o.add("\n")),o.add(t.bn(s)))}return i&&1<n&&o.add("\n"),o.add("]"),o.toString()}function Ud(t,e){return void 0===e||"__gohashid"===t||"_"===t[0]||"function"===typeof e}function Kd(t){return isNaN(t)?"NaN":1/0===t?"9e9999":-1/0===t?"-9e9999":t}function Hd(t,e){var i=e;if(i instanceof pt)e={class:"go.Point",x:Kd(i.x),y:Kd(i.y)};else if(i instanceof Bt)e={class:"go.Size",width:Kd(i.width),height:Kd(i.height)};else if(i instanceof zt)e={class:"go.Rect",x:Kd(i.x),y:Kd(i.y),width:Kd(i.width),height:Kd(i.height)};else if(i instanceof Qt)e={class:"go.Margin",top:Kd(i.top),right:Kd(i.right),bottom:Kd(i.bottom),left:Kd(i.left)};else if(i instanceof Ge)e=i.kb()?{class:"go.Spot",x:Kd(i.x),y:Kd(i.y),offsetX:Kd(i.offsetX),offsetY:Kd(i.offsetY)}:{class:"go.Spot",enum:i.toString()};else if(i instanceof eh){if(e={class:"go.Brush",type:i.type.name},i.type===gh?e.color=i.color:i.type!==yh&&i.type!==mh||(e.start=i.start,e.end=i.end,i.type===mh&&(0!==i.startRadius&&(e.startRadius=Kd(i.startRadius)),isNaN(i.endRadius)||(e.endRadius=Kd(i.endRadius)))),null!==i.colorStops){var n={};for(i=i.colorStops.iterator;i.next();)n[i.key]=i.value;e.colorStops=n}}else i instanceof We?(e={class:"go.Geometry",type:i.type.name},0!==i.startX&&(e.startX=Kd(i.startX)),0!==i.startY&&(e.startY=Kd(i.startY)),0!==i.endX&&(e.endX=Kd(i.endX)),0!==i.endY&&(e.endY=Kd(i.endY)),i.spot1.w(ne)||(e.spot1=i.spot1),i.spot2.w(ce)||(e.spot2=i.spot2),i.type===li&&(e.path=Je(i))):i instanceof U&&(e={class:"go.EnumValue",classType:rp(t,i.classType),name:i.name});for(var o in n="{",i=!0,e){var r=ap(e,o);if(!Ud(o,r))if(i?i=!1:n+=",",n+=JSON.stringify(o)+":","points"===o&&r instanceof et){var s="[";for(r=r.iterator;r.next();){var a=r.value;1<s.length&&(s+=","),s+=t.bn(a.x),s+=",",s+=t.bn(a.y)}s+="]",n+=s}else n+=t.bn(r)}return n+"}"}function _d(t){return"number"===typeof t?t:"NaN"===t?NaN:"9e9999"===t?1/0:"-9e9999"===t?-1/0:parseFloat(t)}function Wd(t){if("object"!==typeof t)return t;var e=t["class"]||"";if("NaN"===e)return NaN;if("Date"===e)return new Date(t.value);if(0!==e.indexOf("go."))return t;e=e.substr(3);var i=t;if("Point"===e)i=new pt(_d(t.x),_d(t.y));else if("Size"===e)i=new Bt(_d(t.width),_d(t.height));else if("Rect"===e)i=new zt(_d(t.x),_d(t.y),_d(t.width),_d(t.height));else if("Margin"===e)i=new Qt(_d(t.top),_d(t.right),_d(t.bottom),_d(t.left));else if("Spot"===e)i="string"===typeof t["enum"]?Xe(t["enum"]):new Ge(_d(t.x),_d(t.y),_d(t.offsetX),_d(t.offsetY));else if("Brush"===e){if(i=new eh,i.type=K(eh,t.type),"string"===typeof t.color&&(i.color=t.color),t.start instanceof Ge&&(i.start=t.start),t.end instanceof Ge&&(i.end=t.end),"number"===typeof t.startRadius&&(i.startRadius=_d(t.startRadius)),"number"===typeof t.endRadius&&(i.endRadius=_d(t.endRadius)),t=t.colorStops,N(t))for(var n in t)i.addColorStop(parseFloat(n),t[n])}else"Geometry"===e?(i=null,i="string"===typeof t.path?Ze(t.path):new We,i.type=K(We,t.type),"number"===typeof t.startX&&(i.startX=_d(t.startX)),"number"===typeof t.startY&&(i.startY=_d(t.startY)),"number"===typeof t.endX&&(i.endX=_d(t.endX)),"number"===typeof t.endY&&(i.endY=_d(t.endY)),t.spot1 instanceof Ge&&(i.spot1=t.spot1),t.spot2 instanceof Ge&&(i.spot2=t.spot2)):"EnumValue"===e&&(n=t.classType,0===n.indexOf("go.")&&(n=n.substr(3)),n=sp(n),"function"===typeof n&&(i=K(n,t.name)));return i}function $d(t,e,i,n,o,r,s,a,h){void 0===a&&(a=null),void 0===h&&(h=null);var l=new Mi;l.model=t,l.change=i,l.modelChange=e,l.propertyName=n,l.object=o,l.oldValue=r,l.oldParam=a,l.newValue=s,l.newParam=h,t.zt(l)}function Jd(t){return"number"===typeof t||"string"===typeof t}function Zd(t,e,i){var n=t.ja(e);void 0!==n&&t.Wa.G(n)===e||(t.Zt(e),n=t.ja(e),void 0===n?w("Model.makeNodeDataKeyUnique failed on "+e+".  Data not added to Model."):(t.Wa.add(n,e),n=null,i&&(n=t.Fc.length,A(t.Fc,n,e)),$d(t,"nodeDataArray",Ni,"nodeDataArray",t,null,e,null,n),t.Qm(e),t.Pm(e)))}function Qd(t,e,i){var n=t.ja(e);if(void 0!==n&&t.Wa.remove(n),n=null,i){t:if(i=t.Fc,Array.isArray(i))n=i.indexOf(e);else{n=i.length;for(var o=0;o<n;o++)if(i[o]===e){n=o;break t}n=-1}if(0>n)return;L(t.Fc,n)}$d(t,"nodeDataArray",Ci,"nodeDataArray",t,e,null,n,null),t.hr(e)}function tp(t,e,i){if(void 0!==e){var n=t.Tf.G(e);null===n&&(n=new nt,t.Tf.add(e,n)),n.add(i)}}function ep(t,e,i){if(void 0!==e){var n=t.Tf.G(e);n instanceof nt&&(void 0===i||null===i?t.Tf.remove(e):(n.remove(i),0===n.count&&t.Tf.remove(e)))}}function ip(t,e){return void 0===e?null:(t=t.Tf.G(e),t instanceof nt?t:null)}function np(t,e,i){if(t.copiesArrays&&Array.isArray(e)){var n=[];for(i=0;i<e.length;i++){var o=np(t,e[i],t.copiesArrayObjects);n.push(o)}return ot(n),n}if(i&&N(e)){for(n in i=(i=e.constructor)?new i:{},o=t.copiesKey||"string"!==typeof t.nodeKeyProperty?null:t.nodeKeyProperty,e)if("__gohashid"===n)i.__gohashid=void 0;else if(n===o)i[o]=void 0;else{var r=ap(e,n),s=rp(t,r);"GraphObject"===s||"Diagram"===s||"Layer"===s||"RowColumnDefinition"===s||"AnimationManager"===s||"Tool"===s||"CommandHandler"===s||"Layout"===s||"InputEvent"===s||"DiagramEvent"===s||r instanceof Bd||r instanceof Ai||r instanceof Ti||r instanceof Mi||(r=np(t,r,!1)),hp(i,n,r)}return ot(i),i}return e instanceof pt||e instanceof Bt||e instanceof zt||e instanceof Ge||e instanceof Qt?e.copy():e}function op(){return new Bd}function rp(t,e){if("function"===typeof e){if(e.className)return e.className;if(e.name)return e.name}else if("object"===typeof e&&null!==e&&e.constructor)return rp(t,e.constructor);return typeof e}function sp(t){return up[t]?up[t]:void 0!==y.go&&y.go[t]?y.go[t]:null}function ap(t,e){if(!t||!e)return null;try{if("function"===typeof e)var i=e(t);else"function"===typeof t.getAttribute?(i=t.getAttribute(e),null===i&&(i=void 0)):i=t[e]}catch(n){}return i}function hp(t,e,i){if(t&&e)try{"function"===typeof e?e(t,i):"function"===typeof t.setAttribute?t.setAttribute(e,i):t[e]=i}catch(n){}}vd.className="PartManager",f(Ad,vd),Ad.prototype.addAllModeledParts=function(){var t=this.diagram.model;this.addModeledParts(t.nodeDataArray),Ld(this,t.linkDataArray)},Ad.prototype.addModeledParts=function(t){for(vd.prototype.addModeledParts.call(this,t,!1),t=this.links.iterator;t.next();)Cc(t.value);Jr(this.diagram,!1)},Ad.prototype.removeAllModeledParts=function(){var t=this.diagram.model;Od(this,t.linkDataArray),this.fu(t.nodeDataArray)},Ad.prototype.getLinkCategoryForData=function(t){return this.diagram.model.Lt(t)},Ad.prototype.setLinkCategoryForData=function(t,e){return this.diagram.model.cr(t,e)},Ad.prototype.setFromNodeForLink=function(t,e){var i=this.diagram.model;i.Bw(t.data,i.ja(null!==e?e.data:null))},Ad.prototype.setToNodeForLink=function(t,e){var i=this.diagram.model;i.Gw(t.data,i.ja(null!==e?e.data:null))},Ad.prototype.removeDataForLink=function(t){this.diagram.model.Mm(t.data)},Ad.prototype.findPartForKey=function(t){var e=vd.prototype.findPartForKey.call(this,t);return null===e&&(t=this.diagram.model.Dg(t),null!==t)?this.Te.G(t):e},Ad.prototype.findLinkForKey=function(t){return null===t||void 0===t?null:(t=this.diagram.model.Dg(t),null!==t?this.Te.G(t):null)},Ad.prototype.doModelChanged=function(t){var e=this;if(vd.prototype.doModelChanged.call(this,t),this.diagram){var i=this.diagram;if(t.model===i.model){var n=t.change;if(i.Z){i.Z=!1;try{var o=t.modelChange;if(""!==o){if(n===Pi){if("linkFromKey"===o){var r=this.yc(t.object);if(null!==r){var s=this.Cb(t.newValue);r.fromNode=s}}else if("linkToKey"===o){var a=this.yc(t.object);if(null!==a){var h=this.Cb(t.newValue);a.toNode=h}}else if("linkFromPortId"===o){var l=this.yc(t.object);if(null!==l){var u=t.newValue;"string"===typeof u&&(l.fromPortId=u)}}else if("linkToPortId"===o){var c=this.yc(t.object);if(null!==c){var f=t.newValue;"string"===typeof f&&(c.toPortId=f)}}else if("nodeGroupKey"===o){var d=this.zc(t.object);if(null!==d){var p=t.newValue;if(void 0!==p){var g=this.Cb(p);d.containingGroup=g instanceof bc?g:null}else d.containingGroup=null}}else if("linkLabelKeys"===o){var y=this.yc(t.object);if(null!==y){var m=t.oldValue,v=t.newValue;Array.isArray(m)&&m.forEach((function(t){0<=v.indexOf(t)||(t=e.Cb(t),null!==t&&(t.labeledLink=null))})),Array.isArray(v)&&v.forEach((function(t){t=e.Cb(t),null!==t&&(t.labeledLink=y)}))}}else if("linkCategory"===o){var x=this.yc(t.object),b=t.newValue;null!==x&&"string"===typeof b&&(x.category=b)}else"linkDataArray"===o&&(Od(this,t.oldValue),Ld(this,t.newValue));i.isModified=!0}else if(n===Ni){var w=t.newValue;if("linkDataArray"===o&&"object"===typeof w&&null!==w)jd(this,w);else if("linkLabelKeys"===o&&Jd(w)){var k=this.yc(t.object),M=this.Cb(w);null!==k&&null!==M&&(M.labeledLink=k)}i.isModified=!0}else if(n===Ci){var S=t.oldValue;if("linkDataArray"===o&&"object"===typeof S&&null!==S)this.$q(S);else if("linkLabelKeys"===o&&Jd(S)){var P=this.Cb(S);null!==P&&(P.labeledLink=null)}i.isModified=!0}}else if(n===Pi){var N=t.propertyName;t.object!==i.model||"linkFromKeyProperty"!==N&&"linkToKeyProperty"!==N&&"linkFromPortIdProperty"!==N&&"linkToPortIdProperty"!==N&&"linkLabelKeysProperty"!==N&&"nodeIsGroupProperty"!==N&&"nodeGroupKeyProperty"!==N&&"linkCategoryProperty"!==N||i.undoManager.isUndoingRedoing||this.Md(),i.isModified=!0}}finally{i.Z=!0}}}}},Ad.prototype.refreshDataBoundLinks=function(){var t=this,e=this.diagram.model,i=new nt,n=e.linkDataArray;n.forEach((function(t){i.add(t)}));var o=[];this.links.each((function(t){null===t.data||i.contains(t.data)||o.push(t.data)})),o.forEach((function(t){Mp(e,t,!1)})),n.forEach((function(i){null===t.yc(i)&&kp(e,i,!1)}))},Ad.prototype.updateRelationshipsFromData=function(t){var e=t.data;if(null!==e){var i=t.diagram;if(null!==i){var n=i.model;if(t instanceof Nc){var o=vp(n,e,!0);if(o=i.Cb(o),t.fromNode=o,o=vp(n,e,!1),o=i.Cb(o),t.toNode=o,e=n.Bf(e),0<e.length||0<t.labelNodes.count){if(1===e.length&&1===t.labelNodes.count){o=e[0];var r=t.labelNodes.first();if(n.ja(r.data)===o)return}o=(new nt).addAll(e);var s=new nt;t.labelNodes.each((function(t){null!==t.data&&(t=n.ja(t.data),void 0!==t&&s.add(t))})),e=s.copy(),e.Zq(o),o=o.copy(),o.Zq(s),(0<e.count||0<o.count)&&(e.each((function(e){e=i.Cb(e),null!==e&&e.labeledLink===t&&(e.labeledLink=null)})),o.each((function(e){e=i.Cb(e),null!==e&&e.labeledLink!==t&&(e.labeledLink=t)})))}}else!(t instanceof Qu)&&(e=n.Lh(e),e=i.findPartForKey(e),null===e||e instanceof bc)&&(t.containingGroup=e)}}},Ad.prototype.resolveReferencesForData=function(t){var e=this.diagram.model,i=e.ja(t);if(void 0!==i){var n=ip(e,i),o=this.zc(t);if(null!==n&&null!==o){n=n.iterator;for(var r={};n.next();){var s=n.value;e.ab(s)?o instanceof bc&&e.Lh(s)===i&&(s=this.zc(s),null!==s&&(s.containingGroup=o)):(r.link=this.yc(s),null!==r.link&&o instanceof ec&&(vp(e,s,!0)===i&&(r.link.fromNode=o),vp(e,s,!1)===i&&(r.link.toNode=o),s=e.Bf(s),Array.isArray(s)&&s.some(function(t){return function(e){return e===i&&(o.labeledLink=t.link,!0)}}(r)))),r={link:r.link}}ep(e,i)}t=e.Lh(t),void 0!==t&&(t=this.Cb(t),t instanceof bc&&(o.containingGroup=t))}},Ad.prototype.unresolveReferencesForPart=function(t){var e=this.diagram.model;if(t instanceof ec){var i=e.ja(t.data);if(void 0!==i){for(var n=t.linksConnected;n.next();)tp(e,i,n.value.data);if(t.isLinkLabel&&(n=t.labeledLink,null!==n&&tp(e,i,n.data)),t instanceof bc)for(t=t.memberParts;t.next();)n=t.value.data,e.ab(n)&&tp(e,i,n)}}},Ad.prototype.copyPartData=function(t,e){var i=vd.prototype.copyPartData.call(this,t,e);if(t instanceof Nc)if(t=t.data,null!==t&&null!==e){var n=e.model;t=n.Aq(t),"object"===typeof t&&null!==t&&(n.bj(t),i=e.yc(t))}else null!==i&&(e=this.diagram,null!==t&&null!==e&&null!==e.commandHandler&&e.commandHandler.copiesClipboardData&&(e=e.model.Aq(t),"object"===typeof e&&null!==e&&(i.data=e)));return i},Ad.prototype.insertLink=function(t,e,i,n){var o=this.diagram,r=o.model,s=o.toolManager.findTool("Linking"),a="";if(null!==t&&(null===e&&(e=t),a=e.portId,null===a&&(a="")),e="",null!==i&&(null===n&&(n=i),e=n.portId,null===e&&(e="")),n=s.archetypeLinkData,n instanceof Nc){if(ul(n),r=n.copy(),null!==r)return r.fromNode=t,r.fromPortId=a,r.toNode=i,r.toPortId=e,o.add(r),t=s.archetypeLabelNodeData,t instanceof ec&&(ul(t),t=t.copy(),null!==t&&(t.labeledLink=r,o.add(t))),r}else if(null!==n&&(n=r.Aq(n),"object"===typeof n&&null!==n))return null!==t&&xp(r,n,r.ja(t.data),!0),wp(r,n,a,!0),null!==i&&xp(r,n,r.ja(i.data),!1),wp(r,n,e,!1),r.bj(n),t=s.archetypeLabelNodeData,null===t||t instanceof ec||(t=r.copyNodeData(t),"object"===typeof t&&null!==t&&(r.uf(t),t=r.ja(t),void 0!==t&&r.Dv(n,t))),o.yc(n);return null},Ad.prototype.findLinkForKey=Ad.prototype.findLinkForKey,Ad.prototype.findPartForKey=Ad.prototype.findPartForKey,Ad.prototype.removeAllModeledParts=Ad.prototype.removeAllModeledParts,Ad.prototype.addModeledParts=Ad.prototype.addModeledParts,Ad.prototype.addAllModeledParts=Ad.prototype.addAllModeledParts,Ad.className="GraphLinksPartManager",f(Dd,vd),Dd.prototype.getLinkCategoryForData=function(t){return this.diagram.model.Ot(t)},Dd.prototype.setLinkCategoryForData=function(t,e){this.diagram.model.ku(t,e)},Dd.prototype.setFromNodeForLink=function(t,e,i){var n=this.diagram.model;if(void 0===i&&(i=null),e=null!==e?e.data:null,this.diagram.isTreePathToChildren)n.fe(t.data,n.ja(e));else{var o=this.rh;this.rh=t,null!==i&&n.fe(i.data,void 0),n.fe(e,n.ja(null!==t.toNode?t.toNode.data:null)),this.rh=o}},Dd.prototype.setToNodeForLink=function(t,e,i){var n=this.diagram.model;if(void 0===i&&(i=null),e=null!==e?e.data:null,this.diagram.isTreePathToChildren){var o=this.rh;this.rh=t,null!==i&&n.fe(i.data,void 0),n.fe(e,n.ja(null!==t.fromNode?t.fromNode.data:null)),this.rh=o}else n.fe(t.data,n.ja(e))},Dd.prototype.removeDataForLink=function(t){this.diagram.model.fe(t.data,void 0)},Dd.prototype.findLinkForKey=function(t){return null===t||void 0===t?null:(t=this.diagram.model.Kb(t),null!==t?this.Te.G(t):null)},Dd.prototype.doModelChanged=function(t){if(vd.prototype.doModelChanged.call(this,t),this.diagram){var e=this.diagram;if(t.model===e.model){var i=t.change;if(e.Z){e.Z=!1;try{var n=t.modelChange;if(""!==n){if(i===Pi){if("nodeParentKey"===n){var o=t.object,r=this.Cb(t.newValue),s=this.gj(o);if(null!==this.rh)null!==r&&(this.rh.data=o,this.rh.category=this.getLinkCategoryForData(o));else if(null!==s){var a=s.jj();null!==a?null===r?e.remove(a):e.isTreePathToChildren?a.fromNode=r:a.toNode=r:Fd(this,r,s)}}else if("parentLinkCategory"===n){var h=this.gj(t.object),l=t.newValue;if(null!==h&&"string"===typeof l){var u=h.jj();null!==u&&(u.category=l)}}e.isModified=!0}}else if(i===Pi){var c=t.propertyName;t.object===e.model&&"nodeParentKeyProperty"===c&&(e.undoManager.isUndoingRedoing||this.Md()),e.isModified=!0}}finally{e.Z=!0}}}}},Dd.prototype.updateRelationshipsFromData=function(t){var e=t.data;if(null!==e){var i=t.diagram;if(null!==i){var n=i.model;t instanceof ec&&(e=n.Mh(e),e=i.Cb(e),n=t.Fg(),e!==n&&(n=t.jj(),null!==e?null!==n?i.isTreePathToChildren?n.fromNode=e:n.toNode=e:Fd(this,e,t):null!==n&&Fr(i,n,!1)))}}},Dd.prototype.updateDataBindings=function(t,e){vd.prototype.updateDataBindings.call(this,t,e),"string"===typeof e&&null!==this.zc(t)&&(t=this.yc(t),null!==t&&t.Da(e))},Dd.prototype.resolveReferencesForData=function(t){var e=this.diagram.model,i=e.ja(t);if(void 0!==i){var n=ip(e,i),o=this.zc(t);if(null!==n&&null!==o){for(n=n.iterator;n.next();){var r=n.value;e.ab(r)&&o instanceof ec&&e.Mh(r)===i&&Fd(this,o,this.gj(r))}ep(e,i)}t=e.Mh(t),void 0!==t&&o instanceof ec&&(t=this.Cb(t),Fd(this,t,o))}},Dd.prototype.unresolveReferencesForPart=function(t){var e=this.diagram.model;if(t instanceof ec){var i=e.ja(t.data),n=this.yc(t.data);if(null!==n){n.isSelected=!1,n.isHighlighted=!1;var o=n.layer;if(null!==o){var r=o.Lc(-1,n,!1);0<=r&&this.diagram.Va(Ci,"parts",o,n,null,r,null),r=n.layerChanged,null!==r&&r(n,o,null)}}for(n=this.diagram.isTreePathToChildren,t=t.linksConnected;t.next();)o=t.value,o=(n?o.toNode:o.fromNode).data,e.ab(o)&&tp(e,i,o)}},Dd.prototype.insertLink=function(t,e,i){e=this.diagram.model;var n=t,o=i;return this.diagram.isTreePathToChildren||(n=i,o=t),null!==n&&null!==o?(e.fe(o.data,e.ja(n.data)),o.jj()):null},Dd.prototype.findLinkForKey=Dd.prototype.findLinkForKey,Dd.className="TreePartManager",Bd.prototype.cloneProtected=function(t){t.oa=this.oa,t.Ln=this.Ln,t.$f=this.$f,t.Ni=this.Ni,t.Pl=this.Pl,t.il=this.il,t.Dn=this.Dn,t.Cn=this.Cn,t.Fn=this.Fn,t.kn=this.kn,t.Yj=this.Yj},Bd.prototype.copy=function(){var t=new this.constructor;return this.cloneProtected(t),t},Bd.prototype.clear=function(){this.Fc=[],this.Wa.clear(),this.Tf.clear(),this.undoManager.clear()},Bd.prototype.toString=function(t){if(void 0===t&&(t=0),1<t)return this.fr();var e=(""!==this.name?this.name:"")+" Model";if(0<t){e+="\n node data:",t=this.nodeDataArray;for(var i=t.length,n=0;n<i;n++){var o=t[n];e+=" "+this.ja(o)+":"+F(o)}}return e},Bd.prototype.gB=function(t){t.change!==Si&&w("Model.toIncrementalData argument is not a Transaction ChangedEvent:"+t.toString());var e=t.object;return t.isTransactionFinished&&e instanceof Ti?(Gd(this,e),t=this.Yw(e,"FinishedUndo"===t.propertyName),this.Yh=null,t):null},Bd.prototype.Yw=function(t,e){var i=this,n=!1,o=new nt,r=new nt,s=new nt,a=this.Yh;t.changes.each((function(t){t.model===i&&("nodeDataArray"===t.modelChange?t.change===Ni?o.add(t.newValue):t.change===Ci&&s.add(t.oldValue):i.ab(t.object)?r.add(t.object):t.change!==Pi||i.modelData!==t.object&&"modelData"!==t.propertyName?null!==t.object&&(a&&a.contains(t.object)?a.get(t.object).each((function(t){i.ab(t)&&r.add(t)})):t.object instanceof Bd||i.qj()&&i.xc(t.object)||Yd(i,t.object).each((function(t){r.add(t)}))):n=!0)}));var h=this.Li;h.clear(),o.each((function(t){h.add(i.ja(t)),e||r.add(t)}));var l=this.Oi;l.clear(),s.each((function(t){l.add(i.ja(t)),e&&r.add(t)})),t=i.cloneDeep(r.ma());var u=null;return n&&(null===u&&(u={}),u.modelData=this.cloneDeep(this.modelData)),0<h.count&&(null===u&&(u={}),e?u.removedNodeKeys=h.ma():u.insertedNodeKeys=h.ma()),0<t.length&&(null===u&&(u={}),u.modifiedNodeData=t),0<l.count&&(null===u&&(u={}),e?u.insertedNodeKeys=l.ma():u.removedNodeKeys=l.ma()),l.clear(),h.clear(),u},Bd.prototype.cloneDeep=function(t){return Id(this,t,!0)},i=Bd.prototype,i.Vk=function(){var t="";return""!==this.name&&(t+=',\n  "name": '+this.quote(this.name)),""!==this.dataFormat&&(t+=',\n  "dataFormat": '+this.quote(this.dataFormat)),this.isReadOnly&&(t+=',\n  "isReadOnly": '+this.isReadOnly),"key"!==this.nodeKeyProperty&&"string"===typeof this.nodeKeyProperty&&(t+=',\n  "nodeKeyProperty": '+this.quote(this.nodeKeyProperty)),this.copiesArrays&&(t+=',\n  "copiesArrays": true'),this.copiesArrayObjects&&(t+=',\n  "copiesArrayObjects": true'),this.copiesKey||(t+=',\n  "copiesKey": false'),"category"!==this.nodeCategoryProperty&&"string"===typeof this.nodeCategoryProperty&&(t+=',\n  "nodeCategoryProperty": '+this.quote(this.nodeCategoryProperty)),t},i.Xq=function(t){t.name&&(this.name=t.name),t.dataFormat&&(this.dataFormat=t.dataFormat),t.isReadOnly&&(this.isReadOnly=!0),t.nodeKeyProperty&&(this.nodeKeyProperty=t.nodeKeyProperty),t.copiesArrays&&(this.copiesArrays=!0),t.copiesArrayObjects&&(this.copiesArrayObjects=!0),!1===t.copiesKey&&(this.copiesKey=!1),t.nodeCategoryProperty&&(this.nodeCategoryProperty=t.nodeCategoryProperty)},i.Zw=function(){var t,e=this.modelData,i=!1;for(t in e)if(!Ud(t,e[t])){i=!0;break}return e="",i&&(e=Ed(this)),e+',\n  "nodeDataArray": '+qd(this,this.nodeDataArray,!0)},i.rw=function(t){Rd(this,t),t=t.nodeDataArray,C(t)&&(this.Om(t),this.nodeDataArray=t)},i.kr=function(t){Vd(this,t,"nodeKeyProperty");var e=this.Li;e.clear();var i=new nt,n=this.Oi;n.clear(),n.addAll(this.Wa.iteratorKeys);for(var o=new dt,r=t.nodeDataArray,s=r.length,a=0;a<s;a++){var h=r[a],l=t.ja(h);if(void 0!==l){n.remove(l);var u=this.Kb(l);null===u?(e.add(l),i.add(h)):zd(this,u,h,o)||i.add(h)}else this.Zt(h),l=this.ja(h),e.add(l),i.add(h)}return r="",zd(this,this.modelData,t.modelData,o)||(r+=Ed(this)),0<e.count&&(r+=this.tu+qd(this,e.ma(),!0)),0<i.count&&(r+=this.lx+qd(this,i.ma(),!0)),0<n.count&&(r+=this.vu+qd(this,n.ma(),!0)),n.clear(),e.clear(),r},i.Dz=function(t,e){return void 0===e&&(e=rp(this,this)),'{ "class": '+this.quote(e)+', "incremental": 1'+this.Vk()+this.kr(t)+"}"},i.Xw=function(t,e){var i=this,n=!1,o=new nt,r=new nt,s=new nt,a=this.Yh;t.changes.each((function(t){t.model===i&&("nodeDataArray"===t.modelChange?t.change===Ni?o.add(t.newValue):t.change===Ci&&s.add(t.oldValue):i.ab(t.object)?r.add(t.object):t.change!==Pi||i.modelData!==t.object&&"modelData"!==t.propertyName?null!==t.object&&(a&&a.contains(t.object)?a.get(t.object).each((function(t){i.ab(t)&&r.add(t)})):t.object instanceof Bd||i.qj()&&i.xc(t.object)||Yd(i,t.object).each((function(t){r.add(t)}))):n=!0)}));var h=this.Li;h.clear(),o.each((function(t){h.add(i.ja(t)),e||r.add(t)}));var l=this.Oi;return l.clear(),s.each((function(t){l.add(i.ja(t)),e&&r.add(t)})),t="",n&&(t+=Ed(this)),0<h.count&&(t+=(e?this.vu:this.tu)+qd(this,h.ma(),!0)),0<r.count&&(t+=this.lx+qd(this,r.ma(),!0)),0<l.count&&(t+=(e?this.tu:this.vu)+qd(this,l.ma(),!0)),l.clear(),h.clear(),t},i.Wq=function(t){(void 0!==t.name&&t.name!==this.name||void 0!==t.dataFormat&&t.dataFormat!==this.dataFormat||void 0!==t.isReadOnly&&t.isReadOnly!==this.isReadOnly||void 0!==t.nodeKeyProperty&&t.nodeKeyProperty!==this.nodeKeyProperty||void 0!==t.copiesArrays&&t.copiesArrays!==this.copiesArrays||void 0!==t.copiesArrayObjects&&t.copiesArrayObjects!==this.copiesArrayObjects||void 0!==t.copiesKey&&t.copiesKey!==this.copiesKey||void 0!==t.nodeCategoryProperty&&t.nodeCategoryProperty!==this.nodeCategoryProperty)&&w("applyIncrementalJson cannot change Model properties"),Rd(this,t);var e=t.insertedNodeKeys,i=t.modifiedNodeData,n=new dt;if(Array.isArray(i))for(var o=0;o<i.length;o++){var r=i[o],s=this.ja(r);void 0!==s&&null!==s&&n.set(s,r)}if(Array.isArray(e))for(o=e.length,r=0;r<o;r++){s=e[r];var a=this.Kb(s);null===a&&(a=(a=n.get(s))?a:this.copyNodeData({}),this.Vm(a,s),this.uf(a))}if(Array.isArray(i))for(e=i.length,n=0;n<e;n++)if(o=i[n],r=this.ja(o),r=this.Kb(r),null!==r){for(var h in o)"__gohashid"===h||h===this.nodeKeyProperty||this.Ck()&&h===this.nodeIsGroupProperty||this.setDataProperty(r,h,o[h]);this.Wm(o,r)}if(t=t.removedNodeKeys,Array.isArray(t))for(i=t.length,h=0;h<i;h++)e=this.Kb(t[h]),null!==e&&this.Nm(e)},i.Yy=function(t,e){t.change!==Si&&w("Model.toIncrementalJson argument is not a Transaction ChangedEvent:"+t.toString());var i=t.object;return t.isTransactionFinished&&i instanceof Ti?(void 0===e&&(e=rp(this,this)),Gd(this,i),t=this.Xw(i,"FinishedUndo"===t.propertyName),this.Yh=null,"2"===e?'{ "incremental": 2'+t+"}":'{ "class": '+this.quote(e)+', "incremental": 1'+this.Vk()+t+"}"):'{ "incremental": 0 }'},i.hB=function(t,e){return this.Yy(t,e)},i.fr=function(t){return void 0===t&&(t=rp(this,this)),'{ "class": '+this.quote(t)+this.Vk()+this.Zw()+"}"},i.toJSON=function(t){return this.fr(t)},i.Xx=function(t){var e=null;if("string"===typeof t)try{e=y.JSON.parse(t)}catch(n){}else"object"===typeof t?e=t:w("Unable to modify a Model from: "+t);var i=e.incremental;"number"!==typeof i&&w("Unable to apply non-incremental changes to Model: "+t),0!==i&&(this.va("applyIncrementalJson"),this.Wq(e),this.Xa("applyIncrementalJson"))},i.vz=function(t){return this.Xx(t)},Bd.constructGraphLinksModel=function(){return new Bd},i=Bd.prototype,i.Om=function(t){if(C(t))for(var e=t.length,i=0;i<e;i++){var n=t[i];if(N(n)){var o=i;n=this.Om(n),Array.isArray(t)?t[o]=n:w("Cannot replace an object in an HTMLCollection or NodeList at "+o)}}else if(N(t)){for(e in t)if(i=t[e],N(i)&&(i=this.Om(i),t[e]=i,"points"===e&&Array.isArray(i))){for(o=0===i.length%2,n=0;n<i.length;n++)if("number"!==typeof i[n]){o=!1;break}if(o){for(o=new et,n=0;n<i.length/2;n++)o.add(new pt(i[2*n],i[2*n+1]));o.freeze(),t[e]=o}}return Wd(t)}return t},i.quote=function(t){for(var e="",i=t.length,n=0;n<i;n++){var o=t[n];if('"'===o||"\\"===o)e+="\\"+o;else if("\b"===o)e+="\\b";else if("\f"===o)e+="\\f";else if("\n"===o)e+="\\n";else if("\r"===o)e+="\\r";else if("\t"===o)e+="\\t";else{var r=t.charCodeAt(n);e=16>r?e+"\\u000"+t.charCodeAt(n).toString(16):32>r?e+"\\u00"+t.charCodeAt(n).toString(16):8232===r?e+"\\u2028":8233===r?e+"\\u2029":e+o}}return'"'+e+'"'},i.bn=function(t){return void 0===t?"undefined":null===t?"null":!0===t?"true":!1===t?"false":"string"===typeof t?this.quote(t):"number"===typeof t?1/0===t?"9e9999":-1/0===t?"-9e9999":isNaN(t)?'{"class":"NaN"}':t.toString():t instanceof Date?'{"class":"Date", "value":"'+t.toJSON()+'"}':t instanceof Number?this.bn(t.valueOf()):C(t)?qd(this,t):N(t)?Hd(this,t):"function"===typeof t?"null":t.toString()},i.Hh=function(t){this.cv.add(t)},i.Tk=function(t){this.cv.remove(t)},i.zt=function(t){this.skipsUndoManager||this.undoManager.aw(t);for(var e=this.cv,i=e.length,n=0;n<i;n++)e.J(n)(t)},i.Va=function(t,e,i,n,o,r,s){$d(this,"",t,e,i,n,o,r,s)},i.g=function(t,e,i,n,o){$d(this,"",Pi,t,this,e,i,n,o)},i.du=function(t,e,i,n,o,r){$d(this,"",Pi,e,t,i,n,o,r)},Bd.prototype.changeState=function(t,e){if(null!==t&&t.model===this)if(t.change===Pi){var i=t.object,n=t.propertyName,o=t.G(e);n===this.nodeKeyProperty&&this.ab(i)&&(e=t.G(!e),void 0!==e&&this.Wa.remove(e),void 0!==o&&this.Wa.add(o,i)),hp(i,n,o)}else t.change===Ni?(i=t.newParam,"nodeDataArray"===t.modelChange?(t=t.newValue,N(t)&&"number"===typeof i&&(n=this.ja(t),e?(this.Fc[i]===t&&L(this.Fc,i),void 0!==n&&this.Wa.remove(n)):(this.Fc[i]!==t&&A(this.Fc,i,t),void 0!==n&&this.Wa.add(n,t)))):""===t.modelChange?((n=t.object)&&!C(n)&&t.propertyName&&(n=ap(t.object,t.propertyName)),C(n)&&"number"===typeof i&&(t=t.newValue,e?L(n,i):A(n,i,t))):w("unknown ChangedEvent.Insert modelChange: "+t.toString())):t.change===Ci?(i=t.oldParam,"nodeDataArray"===t.modelChange?(t=t.oldValue,N(t)&&"number"===typeof i&&(n=this.ja(t),e?(this.Fc[i]!==t&&A(this.Fc,i,t),void 0!==n&&this.Wa.add(n,t)):(this.Fc[i]===t&&L(this.Fc,i),void 0!==n&&this.Wa.remove(n)))):""===t.modelChange?((n=t.object)&&!C(n)&&t.propertyName&&(n=ap(t.object,t.propertyName)),C(n)&&"number"===typeof i&&(t=t.oldValue,e?A(n,i,t):L(n,i))):w("unknown ChangedEvent.Remove modelChange: "+t.toString())):t.change!==Si&&w("unknown ChangedEvent: "+t.toString())},Bd.prototype.va=function(t){return this.undoManager.va(t)},Bd.prototype.Xa=function(t){return this.undoManager.Xa(t)},Bd.prototype.If=function(){return this.undoManager.If()},Bd.prototype.commit=function(t,e){void 0===e&&(e="");var i=this.skipsUndoManager;null===e&&(this.skipsUndoManager=!0,e=""),this.undoManager.va(e);var n=!1;try{t(this),n=!0}finally{n?this.undoManager.Xa(e):this.undoManager.If(),this.skipsUndoManager=i}},i=Bd.prototype,i.Da=function(t,e){void 0===e&&(e=""),$d(this,"SourceChanged",Si,e,t,null,null)},i.ja=function(t){if(null!==t){var e=this.Ni;if(""!==e&&(e=ap(t,e),void 0!==e)){if(Jd(e))return e;w("Key value for node data "+t+" is not a number or a string: "+e)}}},i.Vm=function(t,e){if(null!==t){var i=this.Ni;if(""!==i)if(this.ab(t)){var n=ap(t,i);n!==e&&null===this.Kb(e)&&(hp(t,i,e),void 0!==n&&this.Wa.remove(n),this.Wa.add(e,t),$d(this,"nodeKey",Pi,i,t,n,e),"string"===typeof i&&this.Da(t,i),this.ar(n,e))}else hp(t,i,e)}},i.ab=function(t){var e=this.ja(t);return void 0!==e&&this.Wa.G(e)===t},i.Kb=function(t){return null===t&&w("Model.findNodeDataForKey:key must not be null"),void 0!==t&&Jd(t)?this.Wa.G(t):null},i.Zt=function(t){if(null!==t){var e=this.Ni;if(""!==e){var i=this.ja(t);if(void 0===i||this.Wa.contains(i)){var n=this.Pl;if(null!==n&&(i=n(this,t),void 0!==i&&null!==i&&!this.Wa.contains(i)))return void hp(t,e,i);if("string"===typeof i){for(n=2;this.Wa.contains(i+n);)n++;hp(t,e,i+n)}else if(void 0===i||"number"===typeof i){for(i=-this.Wa.count-1;this.Wa.contains(i);)i--;hp(t,e,i)}}}}},i.uf=function(t){null!==t&&(rt(t),this.ab(t)||Zd(this,t,!0))},i.qz=function(t){if(C(t))for(var e=t.length,i=0;i<e;i++)this.uf(t[i]);else for(t=t.iterator;t.next();)this.uf(t.value)},i.Nm=function(t){null!==t&&Qd(this,t,!0)},i.WA=function(t){if(C(t))for(var e=t.length,i=0;i<e;i++)this.Nm(t[i]);else for(t=t.iterator;t.next();)this.Nm(t.value)},i.KA=function(t){if(t!==this.nodeDataArray&&C(t)){var e=this.Oi;e.clear(),e.addAll(this.Wa.iteratorKeys);var i=this.Li;i.clear();for(var n=t.length,o=0;o<n;o++){var r=t[o],s=this.ja(r);if(void 0!==s){i.add(s);var a=this.Kb(s);a!==r&&(null!==a?(this.vq(a,r),this.Wm(r,a)):(r=this.cloneDeep(r),this.Vm(r,s),this.uf(r)))}else s=this.cloneDeep(r),this.uf(s),i.add(this.ja(s))}for(t=e.iterator;t.next();)n=t.value,i.contains(n)||(n=this.Kb(n))&&this.Nm(n);e.clear(),i.clear()}},i.ar=function(t,e){void 0!==e&&(t=ip(this,t),t instanceof nt&&this.Tf.add(e,t))},i.Sw=function(){},i.Qm=function(){},i.Pm=function(){},i.hr=function(){},i.Cz=function(t){void 0===t?this.Tf.clear():this.Tf.remove(t)},Bd.prototype.copyNodeData=function(t){if(null===t)return null;var e=this.il;return t=null!==e?e(t,this):np(this,t,!0),N(t)&&ot(t),t},Bd.prototype.setDataProperty=function(t,e,i){if(this.ab(t)){if(e===this.nodeKeyProperty)return void this.Vm(t,i);if(e===this.nodeCategoryProperty)return void this.Um(t,i)}else!lp&&t instanceof ca&&(lp=!0,S('Model.setDataProperty is modifying a GraphObject, "'+t.toString()+'"'),S("  Is that really your intent?"));var n=ap(t,e);n!==i&&(hp(t,e,i),this.du(t,e,n,i))},i=Bd.prototype,i.set=function(t,e,i){this.setDataProperty(t,e,i)},i.vq=function(t,e){if(e){var i,n=this.ab(t);for(i in e)"__gohashid"===i||n&&i===this.nodeKeyProperty||this.setDataProperty(t,i,e[i])}},i.mz=function(t,e){this.Pt(t,-1,e)},i.Pt=function(t,e,i){0>e&&(e=t.length),A(t,e,i),$d(this,"",Ni,"",t,null,i,null,e)},i.tw=function(t,e){void 0===e&&(e=-1),t===this.Fc&&w("Model.removeArrayItem should not be called on the Model.nodeDataArray"),-1===e&&(e=t.length-1);var i=t[e];L(t,e),$d(this,"",Ci,"",t,i,null,e,null)},i.Iq=function(t){if(null===t)return"";var e=this.Yj;return""===e?"":(e=ap(t,e),void 0===e?"":"string"===typeof e?e:(w("getCategoryForNodeData found a non-string category for "+t+": "+e),""))},i.Um=function(t,e){if(null!==t){var i=this.Yj;if(""!==i)if(this.ab(t)){var n=ap(t,i);void 0===n&&(n=""),n!==e&&(hp(t,i,e),$d(this,"nodeCategory",Pi,i,t,n,e))}else hp(t,i,e)}},i.Wm=function(t,e){this.Um(e,this.Iq(t))},i.Em=function(){return!1},i.Ck=function(){return!1},i.qj=function(){return!1},i.Ut=function(){return!1},i.Dk=function(){return!1},d.Object.defineProperties(Bd.prototype,{name:{get:function(){return this.oa},set:function(t){var e=this.oa;e!==t&&(this.oa=t,this.g("name",e,t))}},dataFormat:{get:function(){return this.Ln},set:function(t){var e=this.Ln;e!==t&&(this.Ln=t,this.g("dataFormat",e,t))}},isReadOnly:{get:function(){return this.$f},set:function(t){var e=this.$f;e!==t&&(this.$f=t,this.g("isReadOnly",e,t))}},modelData:{get:function(){return this.l},set:function(t){var e=this.l;e!==t&&(this.l=t,this.g("modelData",e,t),this.Da(t))}},undoManager:{get:function(){return this.u},set:function(t){var e=this.u;e!==t&&(null!==e&&e.Py(this),this.u=t,null!==t&&t.Vx(this))}},skipsUndoManager:{get:function(){return this.vg},set:function(t){this.vg=t}},nodeKeyProperty:{get:function(){return this.Ni},set:function(t){var e=this.Ni;e!==t&&(""===t&&w("Model.nodeKeyProperty may not be the empty string"),0<this.Wa.count&&w("Cannot set Model.nodeKeyProperty when there is existing node data"),this.Ni=t,this.g("nodeKeyProperty",e,t))}},makeUniqueKeyFunction:{get:function(){return this.Pl},set:function(t){var e=this.Pl;e!==t&&(this.Pl=t,this.g("makeUniqueKeyFunction",e,t))}},nodeDataArray:{get:function(){return this.Fc},set:function(t){var e=this.Fc;if(e!==t){this.Wa.clear(),this.Sw();for(var i=t.length,n=0;n<i;n++){var o=t[n];if(!N(o))return void w("Model.nodeDataArray must only contain Objects, not: "+o);rt(o)}for(this.Fc=t,n=new et,o=0;o<i;o++){var r=t[o],s=this.ja(r);void 0===s||null!==this.Wa.G(s)?n.add(r):this.Wa.add(s,r)}for(n=n.iterator;n.next();)o=n.value,this.Zt(o),r=this.ja(o),void 0!==r&&this.Wa.add(r,o);for($d(this,"nodeDataArray",Pi,"nodeDataArray",this,e,t),e=0;e<i;e++)n=t[e],this.Qm(n),this.Pm(n);Array.isArray(t)||(this.isReadOnly=!0)}}},copyNodeDataFunction:{get:function(){return this.il},set:function(t){var e=this.il;e!==t&&(this.il=t,this.g("copyNodeDataFunction",e,t))}},copiesArrays:{get:function(){return this.Dn},set:function(t){var e=this.Dn;e!==t&&(this.Dn=t,this.g("copiesArrays",e,t))}},copiesArrayObjects:{get:function(){return this.Cn},set:function(t){var e=this.Cn;e!==t&&(this.Cn=t,this.g("copiesArrayObjects",e,t))}},copiesKey:{get:function(){return this.Fn},set:function(t){var e=this.Fn;e!==t&&(this.Fn=t,this.g("copiesKey",e,t))}},afterCopyFunction:{get:function(){return this.kn},set:function(t){var e=this.kn;e!==t&&(this.kn=t,this.g("afterCopyFunction",e,t))}},nodeCategoryProperty:{get:function(){return this.Yj},set:function(t){var e=this.Yj;e!==t&&(this.Yj=t,this.g("nodeCategoryProperty",e,t))}},type:{get:function(){return"Model"}}}),Bd.prototype.setCategoryForNodeData=Bd.prototype.Um,Bd.prototype.getCategoryForNodeData=Bd.prototype.Iq,Bd.prototype.removeArrayItem=Bd.prototype.tw,Bd.prototype.insertArrayItem=Bd.prototype.Pt,Bd.prototype.addArrayItem=Bd.prototype.mz,Bd.prototype.assignAllDataProperties=Bd.prototype.vq,Bd.prototype.set=Bd.prototype.set,Bd.prototype.clearUnresolvedReferences=Bd.prototype.Cz,Bd.prototype.mergeNodeDataArray=Bd.prototype.KA,Bd.prototype.removeNodeDataCollection=Bd.prototype.WA,Bd.prototype.removeNodeData=Bd.prototype.Nm,Bd.prototype.addNodeDataCollection=Bd.prototype.qz,Bd.prototype.addNodeData=Bd.prototype.uf,Bd.prototype.makeNodeDataKeyUnique=Bd.prototype.Zt,Bd.prototype.findNodeDataForKey=Bd.prototype.Kb,Bd.prototype.containsNodeData=Bd.prototype.ab,Bd.prototype.setKeyForNodeData=Bd.prototype.Vm,Bd.prototype.getKeyForNodeData=Bd.prototype.ja,Bd.prototype.updateTargetBindings=Bd.prototype.Da,Bd.prototype.commit=Bd.prototype.commit,Bd.prototype.rollbackTransaction=Bd.prototype.If,Bd.prototype.commitTransaction=Bd.prototype.Xa,Bd.prototype.startTransaction=Bd.prototype.va,Bd.prototype.raiseDataChanged=Bd.prototype.du,Bd.prototype.raiseChanged=Bd.prototype.g,Bd.prototype.raiseChangedEvent=Bd.prototype.Va,Bd.prototype.removeChangedListener=Bd.prototype.Tk,Bd.prototype.addChangedListener=Bd.prototype.Hh,Bd.prototype.writeJsonValue=Bd.prototype.bn,Bd.prototype.replaceJsonObjects=Bd.prototype.Om,Bd.prototype.applyIncrementalJSON=Bd.prototype.vz,Bd.prototype.applyIncrementalJson=Bd.prototype.Xx,Bd.prototype.toJSON=Bd.prototype.toJSON,Bd.prototype.toJson=Bd.prototype.fr,Bd.prototype.toIncrementalJSON=Bd.prototype.hB,Bd.prototype.toIncrementalJson=Bd.prototype.Yy,Bd.prototype.computeJsonDifference=Bd.prototype.Dz,Bd.prototype.toIncrementalData=Bd.prototype.gB,Bd.prototype.clear=Bd.prototype.clear;var lp=!1,up={};function cp(t,e,i){ot(this),this.v=!1,void 0===t&&(t=""),void 0===e&&(e=t),void 0===i&&(i=null),this.l=-1,this.pd=null,this.pm=t,this.om=this.hq=0,this.ht=null,this.Ao=!1,this.hm=e,this.Bn=i,this.Zo=pp,this.un=null,this.Ou=new nt}function fp(t,e,i){return t=t.sourceName,null===t||""===t?e:"/"===t?i.part:"."===t?i:".."===t?i.panel:e.bb(t)}Bd.className="Model",Bd.fromJSON=Bd.fromJson=function(t,e){void 0===e&&(e=null);var i=null;if("string"===typeof t)try{i=y.JSON.parse(t)}catch(r){}else"object"===typeof t?i=t:w("Unable to construct a Model from: "+t);if(null===e){t=null;var n=i["class"];if("string"===typeof n)try{var o=null;0===n.indexOf("go.")?(n=n.substr(3),o=sp(n)):(o=sp(n),null===o&&(o=y[n])),"function"===typeof o&&(t=new o)}catch(r){}null===t||t instanceof Bd?e=t:w("Unable to construct a Model of declared class: "+i["class"])}return null===e&&(e=Bd.constructGraphLinksModel()),e.Xq(i),e.rw(i),e},Bd.safePropertyValue=ap,Bd.safePropertySet=hp,up.Brush=eh,up.ChangedEvent=Mi,up.Geometry=We,up.Margin=Qt,up.Panel=Uh,up.Point=pt,up.Rect=zt,up.Size=Bt,up.Spot=Ge,up.Transaction=Ti,up.UndoManager=Ai,cp.prototype.copy=function(){var t=new cp;return t.pm=this.pm,t.hq=this.hq,t.om=this.om,t.ht=this.ht,t.Ao=this.Ao,t.hm=this.hm,t.Bn=this.Bn,t.Zo=this.Zo,t.un=this.un,t},i=cp.prototype,i.jb=function(t){t.classType===cp&&(this.mode=t)},i.toString=function(){return"Binding("+this.targetProperty+":"+this.sourceProperty+(-1!==this.wj?" "+this.wj:"")+" "+this.mode.name+")"},i.freeze=function(){return this.v=!0,this},i.ea=function(){return this.v=!1,this},i.Iy=function(t){return void 0===t&&(t=null),this.mode=gp,this.backConverter=t,this},i.Uq=function(t){return void 0===t&&(t=""),this.sourceName=t,this.isToModel=!1,this},i.MA=function(){return this.sourceName=null,this.isToModel=!0,this},i.Tw=function(t,e,i){var n=this.hm;if(void 0===i||""===n||n===i){i=this.pm;var o=this.Bn;if(null===o&&""===i)S("Binding error: target property is the empty string: "+this.toString());else{var r=e;if(""!==n&&(r=ap(e,n)),void 0!==r)if(null===o)""!==i&&hp(t,i,r);else try{if(""!==i){var s=o(r,t);hp(t,i,s)}else o(r,t)}catch(a){}}}},i.jr=function(t,e,i,n){if(this.Zo===gp){var o=this.pm;if(void 0===i||o===i){i=this.hm;var r=this.un,s=t;if(""!==o&&(s=ap(t,o)),void 0!==s&&!this.Ou.contains(t))try{this.Ou.add(t);var a=null!==n?n.diagram:null,h=null!==a?a.model:null;if(null===r){if(""!==i)null!==h?h.setDataProperty(e,i,s):hp(e,i,s);else if(null!==h&&null!==n&&0<=n.itemIndex&&null!==n.panel&&Array.isArray(n.panel.itemArray)){var l=n.itemIndex,u=n.panel.itemArray;h.tw(u,l),h.Pt(u,l,s)}}else try{if(""!==i){var c=r(s,e,h);null!==h?h.setDataProperty(e,i,c):hp(e,i,c)}else{var f=r(s,e,h);if(void 0!==f&&null!==h&&null!==n&&0<=n.itemIndex&&null!==n.panel&&Array.isArray(n.panel.itemArray)){var d=n.itemIndex,p=n.panel.itemArray;h.tw(p,d),h.Pt(p,d,f)}}}catch(g){}}finally{this.Ou.remove(t)}}}},d.Object.defineProperties(cp.prototype,{wj:{get:function(){return this.l},set:function(t){this.v&&k(this),this.l=t}},targetProperty:{get:function(){return this.pm},set:function(t){this.v&&k(this),this.pm=t}},sourceName:{get:function(){return this.ht},set:function(t){this.v&&k(this),this.ht=t,null!==t&&(this.Ao=!1)}},isToModel:{get:function(){return this.Ao},set:function(t){this.v&&k(this),this.Ao=t}},sourceProperty:{get:function(){return this.hm},set:function(t){this.v&&k(this),this.hm=t}},converter:{get:function(){return this.Bn},set:function(t){this.v&&k(this),this.Bn=t}},backConverter:{get:function(){return this.un},set:function(t){this.v&&k(this),this.un=t}},mode:{get:function(){return this.Zo},set:function(t){this.v&&k(this),this.Zo=t}}}),cp.prototype.updateSource=cp.prototype.jr,cp.prototype.updateTarget=cp.prototype.Tw,cp.prototype.ofModel=cp.prototype.MA,cp.prototype.ofObject=cp.prototype.Uq,cp.prototype.makeTwoWay=cp.prototype.Iy;var dp="Binding",pp=new U(cp,"OneWay",1),gp=new U(cp,"TwoWay",2);function yp(t,e){Bd.call(this),this.su=',\n  "insertedLinkKeys": ',this.kx=',\n  "modifiedLinkData": ',this.uu=',\n  "removedLinkKeys": ',this.$c=[],this.ag=new nt,this.gb=new dt,this.Hi="",this.Aj=this.hl=this.Ql=null,this.af="from",this.bf="to",this.Vj=this.Uj="",this.Tj="category",this.ae="",this.Ul="isGroup",this.ze="group",this.En=!1,void 0!==t&&(this.nodeDataArray=t),void 0!==e&&(this.linkDataArray=e)}function mp(t,e){for(var i=new nt,n=0;n<t.linkDataArray.length;n++){var o=t.linkDataArray[n];Xd(t,e,o,o,i)}return i}function vp(t,e,i){if(null!==e&&(t=i?t.af:t.bf,""!==t&&(t=ap(e,t),void 0!==t))){if(Jd(t))return t;w((i?"FromKey":"ToKey")+" value for link data "+e+" is not a number or a string: "+t)}}function xp(t,e,i,n){if(null===i&&(i=void 0),null!==e){var o=n?t.af:t.bf;if(""!==o)if(i=t.Gm(i),t.xc(e)){var r=ap(e,o);r!==i&&(ep(t,r,e),hp(e,o,i),null===t.Kb(i)&&tp(t,i,e),$d(t,n?"linkFromKey":"linkToKey",Pi,o,e,r,i),"string"===typeof o&&t.Da(e,o))}else hp(e,o,i)}}function bp(t,e,i){return null===e?"":(t=i?t.Uj:t.Vj,""===t?"":(e=ap(e,t),void 0===e?"":e))}function wp(t,e,i,n){if(null!==e){var o=n?t.Uj:t.Vj;if(""!==o)if(t.xc(e)){var r=ap(e,o);void 0===r&&(r=""),r!==i&&(hp(e,o,i),$d(t,n?"linkFromPortId":"linkToPortId",Pi,o,e,r,i),"string"===typeof o&&t.Da(e,o))}else hp(e,o,i)}}function kp(t,e,i){if(""!==t.linkKeyProperty){var n=t.Wb(e);if(void 0!==n&&t.gb.G(n)===e)return;if(t.Rq(e),n=t.Wb(e),void 0===n)return void w("GraphLinksModel.makeLinkDataKeyUnique failed on "+e+". Data not added to model.");t.gb.add(n,e)}t.ag.add(e),n=null,i&&(n=t.$c.length,t.$c.splice(n,0,e)),$d(t,"linkDataArray",Ni,"linkDataArray",t,null,e,null,n),Sp(t,e)}function Mp(t,e,i){t.ag.remove(e);var n=t.Wb(e);if(void 0!==n&&t.gb.remove(n),n=null,i){if(n=t.$c.indexOf(e),0>n)return;t.$c.splice(n,1)}if($d(t,"linkDataArray",Ci,"linkDataArray",t,e,null,n,null),i=vp(t,e,!0),ep(t,i,e),i=vp(t,e,!1),ep(t,i,e),n=t.Bf(e),Array.isArray(n))for(var o=n.length,r=0;r<o;r++)i=n[r],ep(t,i,e)}function Sp(t,e){var i=vp(t,e,!0);i=t.Gm(i),null===t.Kb(i)&&tp(t,i,e),i=vp(t,e,!1),i=t.Gm(i),null===t.Kb(i)&&tp(t,i,e);var n=t.Bf(e);if(Array.isArray(n))for(var o=n.length,r=0;r<o;r++)i=n[r],null===t.Kb(i)&&tp(t,i,e)}function Pp(t,e,i){t.cr(i,t.Lt(e)),t.Bw(i,t.xy(e)),t.Gw(i,t.Ay(e)),t.ju(i,t.Bf(e)),t.Cw(i,t.yy(e)),t.Hw(i,t.By(e))}cp.className="Binding",cp.parseEnum=function(t,e){return function(i){return i=K(t,i),null===i?e:i}},cp.toString=F,cp.OneWay=pp,cp.TwoWay=gp,f(yp,Bd),yp.constructGraphLinksModel=Bd.constructGraphLinksModel,yp.prototype.cloneProtected=function(t){Bd.prototype.cloneProtected.call(this,t),t.Hi=this.Hi,t.Ql=this.Ql,t.hl=this.hl,t.af=this.af,t.bf=this.bf,t.Uj=this.Uj,t.Vj=this.Vj,t.Tj=this.Tj,t.ae=this.ae,t.Ul=this.Ul,t.ze=this.ze,t.En=this.En},i=yp.prototype,i.clear=function(){Bd.prototype.clear.call(this),this.$c=[],this.gb.clear(),this.ag.clear()},i.toString=function(t){if(void 0===t&&(t=0),2<=t)return this.fr();var e=(""!==this.name?this.name:"")+" GraphLinksModel";if(0<t){e+="\n node data:",t=this.nodeDataArray;var i,n=t.length;for(i=0;i<n;i++){var o=t[i];e+=" "+this.ja(o)+":"+F(o)}for(e+="\n link data:",t=this.linkDataArray,n=t.length,i=0;i<n;i++)o=t[i],e+=" "+vp(this,o,!0)+"--\x3e"+vp(this,o,!1)}return e},i.Yw=function(t,e){""===this.linkKeyProperty&&w("GraphLinksModel.linkKeyProperty must not be an empty string for .toIncrementalData() to succeed.");var i=Bd.prototype.Yw.call(this,t,e),n=this,o=new nt,r=new nt,s=new nt,a=this.Yh;t.changes.each((function(t){t.model===n&&("linkDataArray"===t.modelChange?t.change===Ni?o.add(t.newValue):t.change===Ci&&s.add(t.oldValue):n.xc(t.object)?r.add(t.object):null!==t.object&&(null!==t.object&&a&&a.contains(t.object)?a.get(t.object).each((function(t){n.xc(t)&&r.add(t)})):t.object instanceof Bd||n.ab(t.object)||mp(n,t.object).each((function(t){r.add(t)}))))}));var h=this.Li;h.clear(),o.each((function(t){h.add(n.Wb(t)),e||r.add(t)}));var l=this.Oi;return l.clear(),s.each((function(t){l.add(n.Wb(t)),e&&r.add(t)})),t=n.cloneDeep(r.ma()),0<h.count&&(null===i&&(i={}),e?i.removedLinkKeys=h.ma():i.insertedLinkKeys=h.ma()),0<t.length&&(null===i&&(i={}),i.modifiedLinkData=t),0<l.count&&(null===i&&(i={}),e?i.insertedLinkKeys=l.ma():i.removedLinkKeys=l.ma()),l.clear(),h.clear(),i},i.Vk=function(){var t=Bd.prototype.Vk.call(this),e="";return"category"!==this.linkCategoryProperty&&"string"===typeof this.linkCategoryProperty&&(e+=',\n  "linkCategoryProperty": '+this.quote(this.linkCategoryProperty)),""!==this.linkKeyProperty&&"string"===typeof this.linkKeyProperty&&(e+=',\n  "linkKeyProperty": '+this.quote(this.linkKeyProperty)),"from"!==this.linkFromKeyProperty&&"string"===typeof this.linkFromKeyProperty&&(e+=',\n  "linkFromKeyProperty": '+this.quote(this.linkFromKeyProperty)),"to"!==this.linkToKeyProperty&&"string"===typeof this.linkToKeyProperty&&(e+=',\n  "linkToKeyProperty": '+this.quote(this.linkToKeyProperty)),""!==this.linkFromPortIdProperty&&"string"===typeof this.linkFromPortIdProperty&&(e+=',\n  "linkFromPortIdProperty": '+this.quote(this.linkFromPortIdProperty)),""!==this.linkToPortIdProperty&&"string"===typeof this.linkToPortIdProperty&&(e+=',\n  "linkToPortIdProperty": '+this.quote(this.linkToPortIdProperty)),""!==this.linkLabelKeysProperty&&"string"===typeof this.linkLabelKeysProperty&&(e+=',\n  "linkLabelKeysProperty": '+this.quote(this.linkLabelKeysProperty)),"isGroup"!==this.nodeIsGroupProperty&&"string"===typeof this.nodeIsGroupProperty&&(e+=',\n  "nodeIsGroupProperty": '+this.quote(this.nodeIsGroupProperty)),"group"!==this.nodeGroupKeyProperty&&"string"===typeof this.nodeGroupKeyProperty&&(e+=',\n  "nodeGroupKeyProperty": '+this.quote(this.nodeGroupKeyProperty)),t+e},i.Xq=function(t){Bd.prototype.Xq.call(this,t),t.linkKeyProperty&&(this.linkKeyProperty=t.linkKeyProperty),t.linkFromKeyProperty&&(this.linkFromKeyProperty=t.linkFromKeyProperty),t.linkToKeyProperty&&(this.linkToKeyProperty=t.linkToKeyProperty),t.linkFromPortIdProperty&&(this.linkFromPortIdProperty=t.linkFromPortIdProperty),t.linkToPortIdProperty&&(this.linkToPortIdProperty=t.linkToPortIdProperty),t.linkCategoryProperty&&(this.linkCategoryProperty=t.linkCategoryProperty),t.linkLabelKeysProperty&&(this.linkLabelKeysProperty=t.linkLabelKeysProperty),t.nodeIsGroupProperty&&(this.nodeIsGroupProperty=t.nodeIsGroupProperty),t.nodeGroupKeyProperty&&(this.nodeGroupKeyProperty=t.nodeGroupKeyProperty)},i.Zw=function(){var t=Bd.prototype.Zw.call(this),e=',\n  "linkDataArray": '+qd(this,this.linkDataArray,!0);return t+e},i.rw=function(t){Bd.prototype.rw.call(this,t),t=t.linkDataArray,Array.isArray(t)&&(this.Om(t),this.linkDataArray=t)},i.kr=function(t){if(!(t instanceof yp))return w("Model.computeJsonDifference: newmodel must be a GraphLinksModel"),"";""===this.linkKeyProperty&&w("GraphLinksModel.linkKeyProperty must not be an empty string for .computeJsonDifference() to succeed.");var e=Bd.prototype.kr.call(this,t);Vd(this,t,"linkKeyProperty"),Vd(this,t,"linkFromKeyProperty"),Vd(this,t,"linkToKeyProperty"),Vd(this,t,"linkLabelKeysProperty"),Vd(this,t,"nodeIsGroupProperty"),Vd(this,t,"nodeGroupKeyProperty");var i=this.Li;i.clear();var n=new nt,o=this.Oi;o.clear(),o.addAll(this.gb.iteratorKeys);for(var r=new dt,s=t.linkDataArray,a=s.length,h=0;h<a;h++){var l=s[h],u=t.Wb(l);if(void 0!==u){o.remove(u);var c=this.Dg(u);null===c?(i.add(u),n.add(l)):zd(this,c,l,r)||n.add(l)}else this.Rq(l),u=this.Wb(l),i.add(u),n.add(l)}return t=e,0<i.count&&(t+=this.su+qd(this,i.ma(),!0)),0<n.count&&(t+=this.kx+qd(this,n.ma(),!0)),0<o.count&&(t+=this.uu+qd(this,o.ma(),!0)),o.clear(),i.clear(),t},i.Xw=function(t,e){""===this.linkKeyProperty&&w("GraphLinksModel.linkKeyProperty must not be an empty string for .toIncrementalJson() to succeed.");var i=Bd.prototype.Xw.call(this,t,e),n=this,o=new nt,r=new nt,s=new nt,a=this.Yh;t.changes.each((function(t){t.model===n&&("linkDataArray"===t.modelChange?t.change===Ni?o.add(t.newValue):t.change===Ci&&s.add(t.oldValue):n.xc(t.object)?r.add(t.object):null!==t.object&&(null!==t.object&&a&&a.contains(t.object)?a.get(t.object).each((function(t){n.xc(t)&&r.add(t)})):t.object instanceof Bd||n.ab(t.object)||mp(n,t.object).each((function(t){r.add(t)}))))}));var h=this.Li;h.clear(),o.each((function(t){h.add(n.Wb(t)),e||r.add(t)}));var l=this.Oi;return l.clear(),s.each((function(t){l.add(n.Wb(t)),e&&r.add(t)})),t=i,0<h.count&&(t+=(e?this.uu:this.su)+qd(this,h.ma(),!0)),0<r.count&&(t+=this.kx+qd(this,r.ma(),!0)),0<l.count&&(t+=(e?this.su:this.uu)+qd(this,l.ma(),!0)),l.clear(),h.clear(),t},i.Wq=function(t){(void 0!==t.linkCategoryProperty&&t.linkCategoryProperty!==this.linkCategoryProperty||void 0!==t.linkKeyProperty&&t.linkKeyProperty!==this.linkKeyProperty||void 0!==t.linkFromKeyProperty&&t.linkFromKeyProperty!==this.linkFromKeyProperty||void 0!==t.linkToKeyProperty&&t.linkToKeyProperty!==this.linkToKeyProperty||void 0!==t.linkFromPortIdProperty&&t.linkFromPortIdProperty!==this.linkFromPortIdProperty||void 0!==t.linkToPortIdProperty&&t.linkToPortIdProperty!==this.linkToPortIdProperty||void 0!==t.linkLabelKeysProperty&&t.linkLabelKeysProperty!==this.linkLabelKeysProperty||void 0!==t.nodeIsGroupProperty&&t.nodeIsGroupProperty!==this.nodeIsGroupProperty||void 0!==t.nodeGroupKeyProperty&&t.nodeGroupKeyProperty!==this.nodeGroupKeyProperty)&&w("applyIncrementalJson cannot change Model properties"),Bd.prototype.Wq.call(this,t);var e=t.insertedLinkKeys;if(Array.isArray(e))for(var i=e.length,n=0;n<i;n++){var o=e[n],r=this.Dg(o);null===r&&(r=this.Aq({}),this.iu(r,o),this.bj(r))}if(e=t.modifiedLinkData,Array.isArray(e))for(i=e.length,n=0;n<i;n++)if(o=e[n],r=this.Wb(o),r=this.Dg(r),null!==r){for(var s in o)"__gohashid"!==s&&s!==this.linkKeyProperty&&this.setDataProperty(r,s,o[s]);Pp(this,o,r)}if(t=t.removedLinkKeys,Array.isArray(t))for(s=t.length,e=0;e<s;e++)i=this.Dg(t[e]),null!==i&&this.Mm(i)},yp.prototype.changeState=function(t,e){if(null!==t&&t.model===this){if(t.change===Pi){var i=t.object,n=t.propertyName;if(n===this.linkKeyProperty&&this.xc(i)){var o=t.G(e);return e=t.G(!e),void 0!==e&&this.gb.remove(e),void 0!==o&&this.gb.add(o,i),void hp(i,n,o)}}else if(t.change===Ni){if(i=t.newParam,"linkDataArray"===t.modelChange)return t=t.newValue,void(N(t)&&"number"===typeof i&&(n=this.Wb(t),e?(this.ag.remove(t),this.$c[i]===t&&this.$c.splice(i,1),void 0!==n&&this.gb.remove(n)):(this.ag.add(t),this.$c[i]!==t&&this.$c.splice(i,0,t),void 0!==n&&this.gb.add(n,t))));if("linkLabelKeys"===t.modelChange)return n=this.Bf(t.object),void(Array.isArray(n)&&"number"===typeof i&&(e?(i=n.indexOf(t.newValue),0<=i&&n.splice(i,1)):0>n.indexOf(t.newValue)&&n.splice(i,0,t.newValue)))}else if(t.change===Ci){if(i=t.oldParam,"linkDataArray"===t.modelChange)return t=t.oldValue,void(N(t)&&"number"===typeof i&&(n=this.Wb(t),e?(this.ag.add(t),this.$c[i]!==t&&this.$c.splice(i,0,t),void 0!==n&&this.gb.add(n,t)):(this.ag.remove(t),this.$c[i]===t&&this.$c.splice(i,1),void 0!==n&&this.gb.remove(n))));if("linkLabelKeys"===t.modelChange)return n=this.Bf(t.object),void(Array.isArray(n)&&"number"===typeof i&&(e?0>n.indexOf(t.newValue)&&n.splice(i,0,t.newValue):(i=n.indexOf(t.newValue),0<=i&&n.splice(i,1))))}Bd.prototype.changeState.call(this,t,e)}},i=yp.prototype,i.Gm=function(t){if(void 0!==t){var e=this.Aj;if(null!==e){var i=this.Kb(t);null===i&&(i=this.copyNodeData(e),hp(i,this.nodeKeyProperty,t),this.uf(i))}return t}},i.xy=function(t){return vp(this,t,!0)},i.Bw=function(t,e){xp(this,t,e,!0)},i.Ay=function(t){return vp(this,t,!1)},i.Gw=function(t,e){xp(this,t,e,!1)},i.yy=function(t){return bp(this,t,!0)},i.Cw=function(t,e){wp(this,t,e,!0)},i.By=function(t){return bp(this,t,!1)},i.Hw=function(t,e){wp(this,t,e,!1)},i.Bf=function(t){if(null===t)return Np;var e=this.ae;return""===e?Np:(t=ap(t,e),void 0===t?Np:t)},i.ju=function(t,e){if(null!==t){var i=this.ae;if(""!==i)if(this.xc(t)){var n=ap(t,i);if(void 0===n&&(n=Np),n!==e){if(Array.isArray(n))for(var o=n.length,r=0;r<o;r++)ep(this,n[r],t);for(hp(t,i,e),o=e.length,r=0;r<o;r++){var s=e[r];null===this.Kb(s)&&tp(this,s,t)}$d(this,"linkLabelKeys",Pi,i,t,n,e),"string"===typeof i&&this.Da(t,i)}}else hp(t,i,e)}},i.Dv=function(t,e){if(null!==e&&void 0!==e&&null!==t){var i=this.ae;if(""!==i){var n=ap(t,i);if(void 0===n)i=[],i.push(e),this.ju(t,i);else if(Array.isArray(n)){var o=n.indexOf(e);0<=o||(o=n.length,n.push(e),this.xc(t)&&(null===this.Kb(e)&&tp(this,e,t),$d(this,"linkLabelKeys",Ni,i,t,null,e,null,o)))}else w(i+" property is not an Array; cannot addLabelKeyForLinkData: "+t)}}},i.Oy=function(t,e){if(null!==e&&void 0!==e&&null!==t){var i=this.ae;if(""!==i){var n=ap(t,i);if(Array.isArray(n)){var o=n.indexOf(e);0>o||(n.splice(o,1),this.xc(t)&&(ep(this,e,t),$d(this,"linkLabelKeys",Ci,i,t,e,null,o,null)))}else void 0!==n&&w(i+" property is not an Array; cannot removeLabelKeyforLinkData: "+t)}}},i.Wb=function(t){if(null!==t){var e=this.Hi;if(""!==e&&(e=ap(t,e),void 0!==e)){if(Jd(e))return e;w("Key value for link data "+t+" is not a number or a string: "+e)}}},i.iu=function(t,e){if(null!==t){var i=this.Hi;if(""!==i)if(this.xc(t)){var n=ap(t,i);n!==e&&null===this.Dg(e)&&(hp(t,i,e),void 0!==n&&this.gb.remove(n),this.gb.add(e,t),$d(this,"linkKey",Pi,i,t,n,e),"string"===typeof i&&this.Da(t,i))}else hp(t,i,e)}},i.Dg=function(t){return null===t&&w("GraphLinksModel.findLinkDataForKey:key must not be null"),void 0!==t&&Jd(t)?this.gb.G(t):null},i.Rq=function(t){if(null!==t){var e=this.Hi;if(""!==e){var i=this.Wb(t);if(void 0===i||this.gb.contains(i)){var n=this.Ql;if(null!==n&&(i=n(this,t),void 0!==i&&null!==i&&!this.gb.contains(i)))return void hp(t,e,i);if("string"===typeof i){for(n=2;this.gb.contains(i+n);)n++;hp(t,e,i+n)}else if(void 0===i||"number"===typeof i){for(i=-this.gb.count-1;this.gb.contains(i);)i--;hp(t,e,i)}}}}},i.xc=function(t){return null!==t&&this.ag.contains(t)},i.bj=function(t){null!==t&&(rt(t),this.xc(t)||kp(this,t,!0))},i.pz=function(t){if(Array.isArray(t))for(var e=t.length,i=0;i<e;i++)this.bj(t[i]);else for(t=t.iterator;t.next();)this.bj(t.value)},i.Mm=function(t){null!==t&&Mp(this,t,!0)},i.UA=function(t){if(Array.isArray(t))for(var e=t.length,i=0;i<e;i++)this.Mm(t[i]);else for(t=t.iterator;t.next();)this.Mm(t.value)},i.JA=function(t){if(""===this.linkKeyProperty&&w("GraphLinksModel.linkKeyProperty must not be an empty string for .mergeLinkDataArray() to succeed."),t!==this.linkDataArray&&C(t)){var e=this.Oi;e.clear(),e.addAll(this.gb.iteratorKeys);var i=this.Li;i.clear();for(var n=t.length,o=0;o<n;o++){var r=t[o],s=this.Wb(r);if(void 0!==s){i.add(s);var a=this.Dg(s);a!==r&&(null!==a?(this.vq(a,r),Pp(this,r,a)):(r=this.cloneDeep(r),this.iu(r,s),this.bj(r)))}else s=this.cloneDeep(r),this.bj(s),i.add(this.Wb(s))}for(t=e.iterator;t.next();)n=t.value,i.contains(n)||(n=this.Dg(n))&&this.Mm(n);e.clear(),i.clear()}},i.Aq=function(t){if(null===t)return null;var e=this.hl;return t=null!==e?e(t,this):np(this,t,!0),N(t)&&(ot(t),""!==this.af&&hp(t,this.af,void 0),""!==this.bf&&hp(t,this.bf,void 0),""!==this.ae&&hp(t,this.ae,[])),t},i.fw=function(t){if(null===t)return!1;var e=this.Ul;return""!==e&&!!ap(t,e)},i.Lh=function(t){if(null!==t){var e=this.ze;if(""!==e&&(e=ap(t,e),void 0!==e)){if(Jd(e))return e;w("GroupKey value for node data "+t+" is not a number or a string: "+e)}}},i.dr=function(t,e){if(null===e&&(e=void 0),null!==t){var i=this.ze;if(""!==i)if(this.ab(t)){var n=ap(t,i);n!==e&&(ep(this,n,t),hp(t,i,e),null===this.Kb(e)&&tp(this,e,t),$d(this,"nodeGroupKey",Pi,i,t,n,e),"string"===typeof i&&this.Da(t,i))}else hp(t,i,e)}},yp.prototype.copyNodeData=function(t){return null===t?null:(t=Bd.prototype.copyNodeData.call(this,t),this.rk||""===this.ze||void 0===ap(t,this.ze)||hp(t,this.ze,void 0),t)},yp.prototype.setDataProperty=function(t,e,i){if(this.ab(t)){if(e===this.nodeKeyProperty)return void this.Vm(t,i);if(e===this.nodeCategoryProperty)return void this.Um(t,i);if(e===this.nodeGroupKeyProperty)return void this.dr(t,i)}else if(this.xc(t)){if(e===this.linkFromKeyProperty)return void xp(this,t,i,!0);if(e===this.linkToKeyProperty)return void xp(this,t,i,!1);if(e===this.linkFromPortIdProperty)return void wp(this,t,i,!0);if(e===this.linkToPortIdProperty)return void wp(this,t,i,!1);if(e===this.linkKeyProperty)return void this.iu(t,i);if(e===this.linkCategoryProperty)return void this.cr(t,i);if(e===this.linkLabelKeysProperty)return void this.ju(t,i)}var n=ap(t,e);n!==i&&(hp(t,e,i),this.du(t,e,n,i))},i=yp.prototype,i.vq=function(t,e){if(e){var i,n=this.ab(t),o=this.xc(t);for(i in e)"__gohashid"===i||n&&i===this.nodeKeyProperty||n&&i===this.nodeIsGroupProperty&&ap(t,i)===e[i]||o&&i===this.linkKeyProperty||this.setDataProperty(t,i,e[i])}},i.ar=function(t,e){Bd.prototype.ar.call(this,t,e);for(var i=this.Wa.iterator;i.next();)this.vw(i.value,t,e);for(i=this.ag.iterator;i.next();){var n=i.value,o=t,r=e;if(vp(this,n,!0)===o){var s=this.af;hp(n,s,r),$d(this,"linkFromKey",Pi,s,n,o,r),"string"===typeof s&&this.Da(n,s)}if(vp(this,n,!1)===o&&(s=this.bf,hp(n,s,r),$d(this,"linkToKey",Pi,s,n,o,r),"string"===typeof s&&this.Da(n,s)),s=this.Bf(n),Array.isArray(s))for(var a=s.length,h=this.ae,l=0;l<a;l++)s[l]===o&&(s[l]=r,$d(this,"linkLabelKeys",Ni,h,n,o,r,l,l))}},i.vw=function(t,e,i){if(this.Lh(t)===e){var n=this.ze;hp(t,n,i),$d(this,"nodeGroupKey",Pi,n,t,e,i),"string"===typeof n&&this.Da(t,n)}},i.Sw=function(){Bd.prototype.Sw.call(this);for(var t=this.linkDataArray,e=t.length,i=0;i<e;i++)Sp(this,t[i])},i.Qm=function(t){Bd.prototype.Qm.call(this,t),t=this.ja(t);var e=ip(this,t);if(null!==e){var i=j();for(e=e.iterator;e.next();){var n=e.value;if(this.ab(n)){if(this.Lh(n)===t){var o=this.ze;$d(this,"nodeGroupKey",Pi,o,n,t,t),"string"===typeof o&&this.Da(n,o),i.push(n)}}else if(vp(this,n,!0)===t&&(o=this.af,$d(this,"linkFromKey",Pi,o,n,t,t),"string"===typeof o&&this.Da(n,o),i.push(n)),vp(this,n,!1)===t&&(o=this.bf,$d(this,"linkToKey",Pi,o,n,t,t),"string"===typeof o&&this.Da(n,o),i.push(n)),o=this.Bf(n),Array.isArray(o))for(var r=o.length,s=this.ae,a=0;a<r;a++)o[a]===t&&($d(this,"linkLabelKeys",Ni,s,n,t,t,a,a),i.push(n))}for(e=0;e<i.length;e++)ep(this,t,i[e]);O(i)}},i.Pm=function(t){Bd.prototype.Pm.call(this,t);var e=this.Lh(t);null===this.Kb(e)&&tp(this,e,t)},i.hr=function(t){Bd.prototype.hr.call(this,t);var e=this.Lh(t);ep(this,e,t)},i.Lt=function(t){if(null===t)return"";var e=this.Tj;return""===e?"":(e=ap(t,e),void 0===e?"":"string"===typeof e?e:(w("getCategoryForLinkData found a non-string category for "+t+": "+e),""))},yp.prototype.getLinkCategoryForData=function(t){return this.Lt(t)},yp.prototype.cr=function(t,e){if(null!==t){var i=this.Tj;if(""!==i)if(this.xc(t)){var n=ap(t,i);void 0===n&&(n=""),n!==e&&(hp(t,i,e),$d(this,"linkCategory",Pi,i,t,n,e),"string"===typeof i&&this.Da(t,i))}else hp(t,i,e)}},yp.prototype.setLinkCategoryForData=function(t,e){this.cr(t,e)},i=yp.prototype,i.Wm=function(t,e){Bd.prototype.Wm.call(this,t,e),this.dr(e,this.Lh(t))},i.Ck=function(){return!0},i.qj=function(){return!0},i.Ut=function(){return!0},i.Dk=function(){return!0},d.Object.defineProperties(yp.prototype,{archetypeNodeData:{get:function(){return this.Aj},set:function(t){var e=this.Aj;e!==t&&(this.Aj=t,this.g("archetypeNodeData",e,t))}},linkFromKeyProperty:{get:function(){return this.af},set:function(t){var e=this.af;e!==t&&(this.af=t,this.g("linkFromKeyProperty",e,t))}},linkToKeyProperty:{get:function(){return this.bf},set:function(t){var e=this.bf;e!==t&&(this.bf=t,this.g("linkToKeyProperty",e,t))}},linkFromPortIdProperty:{get:function(){return this.Uj},set:function(t){var e=this.Uj;e!==t&&(this.Uj=t,this.g("linkFromPortIdProperty",e,t))}},linkToPortIdProperty:{get:function(){return this.Vj},set:function(t){var e=this.Vj;e!==t&&(this.Vj=t,this.g("linkToPortIdProperty",e,t))}},linkLabelKeysProperty:{get:function(){return this.ae},set:function(t){var e=this.ae;e!==t&&(this.ae=t,this.g("linkLabelKeysProperty",e,t))}},linkDataArray:{get:function(){return this.$c},set:function(t){var e=this.$c;if(e!==t){this.gb.clear();for(var i=t.length,n=0;n<i;n++){var o=t[n];if(!N(o))return void w("GraphLinksModel.linkDataArray must only contain Objects, not: "+o);rt(o)}if(this.$c=t,""!==this.linkKeyProperty){for(n=new et,o=0;o<i;o++){var r=t[o],s=this.Wb(r);void 0===s||null!==this.gb.G(s)?n.add(r):this.gb.add(s,r)}for(n=n.iterator;n.next();)o=n.value,this.Rq(o),r=this.Wb(o),void 0!==r&&this.gb.add(r,o)}for(n=new nt,o=0;o<i;o++)n.add(t[o]);for(this.ag=n,$d(this,"linkDataArray",Pi,"linkDataArray",this,e,t),e=0;e<i;e++)Sp(this,t[e])}}},linkKeyProperty:{get:function(){return this.Hi},set:function(t){var e=this.Hi;if(e!==t){this.Hi=t,this.gb.clear();for(var i=this.linkDataArray.length,n=0;n<i;n++){var o=this.linkDataArray[n],r=this.Wb(o);void 0===r&&(this.Rq(o),r=this.Wb(o)),void 0!==r&&this.gb.add(r,o)}this.g("linkKeyProperty",e,t)}}},makeUniqueLinkKeyFunction:{get:function(){return this.Ql},set:function(t){var e=this.Ql;e!==t&&(this.Ql=t,this.g("makeUniqueLinkKeyFunction",e,t))}},copyLinkDataFunction:{get:function(){return this.hl},set:function(t){var e=this.hl;e!==t&&(this.hl=t,this.g("copyLinkDataFunction",e,t))}},nodeIsGroupProperty:{get:function(){return this.Ul},set:function(t){var e=this.Ul;e!==t&&(this.Ul=t,this.g("nodeIsGroupProperty",e,t))}},nodeGroupKeyProperty:{get:function(){return this.ze},set:function(t){var e=this.ze;e!==t&&(this.ze=t,this.g("nodeGroupKeyProperty",e,t))}},rk:{get:function(){return this.En},set:function(t){this.En!==t&&(this.En=t)}},linkCategoryProperty:{get:function(){return this.Tj},set:function(t){var e=this.Tj;e!==t&&(this.Tj=t,this.g("linkCategoryProperty",e,t))}},type:{get:function(){return"GraphLinksModel"}}}),yp.prototype.setCategoryForLinkData=yp.prototype.cr,yp.prototype.getCategoryForLinkData=yp.prototype.Lt,yp.prototype.assignAllDataProperties=yp.prototype.vq,yp.prototype.setGroupKeyForNodeData=yp.prototype.dr,yp.prototype.getGroupKeyForNodeData=yp.prototype.Lh,yp.prototype.isGroupForNodeData=yp.prototype.fw,yp.prototype.copyLinkData=yp.prototype.Aq,yp.prototype.mergeLinkDataArray=yp.prototype.JA,yp.prototype.removeLinkDataCollection=yp.prototype.UA,yp.prototype.removeLinkData=yp.prototype.Mm,yp.prototype.addLinkDataCollection=yp.prototype.pz,yp.prototype.addLinkData=yp.prototype.bj,yp.prototype.containsLinkData=yp.prototype.xc,yp.prototype.makeLinkDataKeyUnique=yp.prototype.Rq,yp.prototype.findLinkDataForKey=yp.prototype.Dg,yp.prototype.setKeyForLinkData=yp.prototype.iu,yp.prototype.getKeyForLinkData=yp.prototype.Wb,yp.prototype.removeLabelKeyForLinkData=yp.prototype.Oy,yp.prototype.addLabelKeyForLinkData=yp.prototype.Dv,yp.prototype.setLabelKeysForLinkData=yp.prototype.ju,yp.prototype.getLabelKeysForLinkData=yp.prototype.Bf,yp.prototype.setToPortIdForLinkData=yp.prototype.Hw,yp.prototype.getToPortIdForLinkData=yp.prototype.By,yp.prototype.setFromPortIdForLinkData=yp.prototype.Cw,yp.prototype.getFromPortIdForLinkData=yp.prototype.yy,yp.prototype.setToKeyForLinkData=yp.prototype.Gw,yp.prototype.getToKeyForLinkData=yp.prototype.Ay,yp.prototype.setFromKeyForLinkData=yp.prototype.Bw,yp.prototype.getFromKeyForLinkData=yp.prototype.xy,yp.prototype.clear=yp.prototype.clear;var Np=Object.freeze([]);function Cp(t){Bd.call(this),this.Ae="parent",this.Gn=!1,this.$j="parentLinkCategory",void 0!==t&&(this.nodeDataArray=t)}function Tp(){zf.call(this),this.wx=this.Un=this.$b=0,this.Ur=360,this.vx=Gp,this.Ij=0,this.mx=new pt,this.Gr=this.be=0,this.ut=new ig,this.Bu=this.Zj=0,this.gz=600,this.Ap=NaN,this.pn=1,this.bq=0,this.mm=360,this.Eb=Gp,this.K=Up,this.bd=Qp,this.Wc=sd,this.lf=6,this.jp=tg}function Ap(t,e,i,n,o){var r=t.Ur,s=t.$b;t=t.be,n=n*Math.PI/180,i=i*Math.PI/180;for(var a=e.length,h=0;h<a;h++){var l=n+(o===Up?h*i/(360<=r?a:a-1):-h*i/a),u=e.J(h),c=s*Math.tan(l)/t;c=Math.sqrt((s*s+t*t*c*c)/(1+c*c)),u.centerX=c*Math.cos(l),u.centerY=c*Math.sin(l),u.actualAngle=180*l/Math.PI}}function Lp(t,e,i,n){var o=t.$b,r=t.be,s=t.Ij;i=i*Math.PI/180;for(var a=e.length,h=0;h<a;h++){var l=e.J(h),u=e.J(h===a-1?0:h+1),c=r*Math.sin(i);l.centerX=o*Math.cos(i),l.centerY=c,l.actualAngle=180*i/Math.PI,isNaN(l.diameter)&&rg(l,0),isNaN(u.diameter)&&rg(u,0),l=zp(t,o,r,n===Up?i:-i,(l.diameter+u.diameter)/2+s),i+=n===Up?l:-l}}function jp(t,e,i,n){var o=t.$b,r=t.be,s=t.Gr;i=i*Math.PI/180;for(var a=e.length,h=0;h<a;h++){var l=e.J(h);l.centerX=o*Math.cos(i),l.centerY=r*Math.sin(i),l.actualAngle=180*i/Math.PI,l=zp(t,o,r,n===Up?i:-i,s),i+=n===Up?l:-l}}function Op(t,e,i,n,o){var r=t.Ur;if(t.Zj=0,t.ut=new ig,360>i){for(r=n+(o===Up?r:-r);0>r;)r+=360;r%=360,180<r&&(r-=360),r*=Math.PI/180,t.Bu=r,Fp(t,e,i,n,o)}else Dp(t,e,i,n,o);t.ut.commit(e)}function Dp(t,e,i,n,o){var r=t.$b,s=t.Ij,a=t.Un,h=r*Math.cos(n*Math.PI/180),l=t.be*Math.sin(n*Math.PI/180),u=e.ma();if(3===u.length)u[0].centerX=r,u[0].centerY=0,u[1].centerX=u[0].centerX-u[0].width/2-u[1].width/2-s,u[1].y=u[0].y,u[2].centerX=(u[0].centerX+u[1].centerX)/2,u[2].y=u[0].y-u[2].height-s;else if(4===u.length)u[0].centerX=r,u[0].centerY=0,u[2].centerX=-u[0].centerX,u[2].centerY=u[0].centerY,u[1].centerX=0,u[1].y=Math.min(u[0].y,u[2].y)-u[1].height-s,u[3].centerX=0,u[3].y=Math.max(u[0].y+u[0].height+s,u[2].y+u[2].height+s);else{r=pt.alloc();for(var c=0;c<u.length;c++){if(u[c].centerX=h,u[c].centerY=l,c>=u.length-1)break;Bp(t,h,l,u,c,o,r)||Ip(t,h,l,u,c,o,r),h=r.x,l=r.y}if(pt.free(r),t.Zj++,!(23<t.Zj)){h=u[0].centerX,l=u[0].centerY,r=u[u.length-1].centerX,c=u[u.length-1].centerY;var f=Math.abs(h-r)-((u[0].width+u[u.length-1].width)/2+s),d=Math.abs(l-c)-((u[0].height+u[u.length-1].height)/2+s);s=0,1>Math.abs(d)?Math.abs(h-r)<(u[0].width+u[u.length-1].width)/2&&(s=0):s=0<d?d:1>Math.abs(f)?0:f,h=Math.abs(r)>Math.abs(c)?0<r!==l>c:0<c!==h<r,(h=o===Up?h:!h)&&(s=-Math.abs(s),s=Math.min(s,-u[u.length-1].width),s=Math.min(s,-u[u.length-1].height)),t.ut.compare(s,u),1<Math.abs(s)&&(t.$b=8>t.Zj?t.$b-s/(2*Math.PI):5>u.length&&10<s?t.$b/2:t.$b-(0<s?1.7:-2.3),t.be=t.$b*a,Dp(t,e,i,n,o))}}}function Fp(t,e,i,n,o){for(var r=t.$b,s=t.be,a=t.Un,h=r*Math.cos(n*Math.PI/180),l=s*Math.sin(n*Math.PI/180),u=pt.alloc(),c=e.ma(),f=0;f<c.length;f++){if(c[f].centerX=h,c[f].centerY=l,f>=c.length-1)break;Bp(t,h,l,c,f,o,u)||Ip(t,h,l,c,f,o,u),h=u.x,l=u.y}if(pt.free(u),t.Zj++,!(23<t.Zj)){if(h=Math.atan2(l,h),h=o===Up?t.Bu-h:h-t.Bu,h=Math.abs(h)<Math.abs(h-2*Math.PI)?h:h-2*Math.PI,r=h*(r+s)/2,s=t.ut,Math.abs(r)<Math.abs(s.Am))for(s.Am=r,s.Wk=[],s.cn=[],h=0;h<c.length;h++)s.Wk[h]=c[h].bounds.x,s.cn[h]=c[h].bounds.y;1<Math.abs(r)&&(t.$b=8>t.Zj?t.$b-r/(2*Math.PI):t.$b-(0<r?1.7:-2.3),t.be=t.$b*a,Fp(t,e,i,n,o))}}function Bp(t,e,i,n,o,r,s){var a=t.$b,h=t.be,l=0;t=(n[o].width+n[o+1].width)/2+t.Ij;var u=!1;if(0<=i!==(r===Up)){if(r=e+t,r>a){if(r=e-t,r<-a)return s.x=r,s.y=l,!1;u=!0}}else if(r=e-t,r<-a){if(r=e+t,r>a)return s.x=r,s.y=l,!1;u=!0}return l=Math.sqrt(1-Math.min(1,r*r/(a*a)))*h,0>i!==u&&(l=-l),Math.abs(i-l)>(n[o].height+n[o+1].height)/2?(s.x=r,s.y=l,!1):(s.x=r,s.y=l,!0)}function Ip(t,e,i,n,o,r,s){var a=t.$b,h=t.be,l=0;if(t=(n[o].height+n[o+1].height)/2+t.Ij,n=!1,0<=e!==(r===Up)){if(r=i-t,r<-h){if(r=i+t,r>h)return s.x=l,void(s.y=r);n=!0}}else if(r=i+t,r>h){if(r=i-t,r<-h)return s.x=l,void(s.y=r);n=!0}l=Math.sqrt(1-Math.min(1,r*r/(h*h)))*a,0>e!==n&&(l=-l),s.x=l,s.y=r}function Ep(t,e,i,n,o){var r=t.gz;if(.001>Math.abs(t.Un-1))return void 0!==n&&void 0!==o?o*e:2*Math.PI*e;t=e>i?Math.sqrt(e*e-i*i)/e:Math.sqrt(i*i-e*e)/i;for(var s=0,a=void 0!==n&&void 0!==o?o/(r+1):Math.PI/(2*(r+1)),h=0,l=0;l<=r;l++){h=void 0!==n&&void 0!==o?n+l*o/r:l*Math.PI/(2*r);var u=Math.sin(h);s+=Math.sqrt(1-t*t*u*u)*a}return void 0!==n&&void 0!==o?(e>i?e:i)*s:4*(e>i?e:i)*s}function Rp(t,e,i,n,o){return e/(void 0!==n&&void 0!==o?Ep(t,1,i,n,o):Ep(t,1,i))}function zp(t,e,i,n,o){if(.001>Math.abs(t.Un-1))return o/e;var r=e>i?Math.sqrt(e*e-i*i)/e:Math.sqrt(i*i-e*e)/i,s=0;t=2*Math.PI/(700*t.network.vertexes.count),e>i&&(n+=Math.PI/2);for(var a=0;;a++){var h=Math.sin(n+a*t);if(s+=(e>i?e:i)*Math.sqrt(1-r*r*h*h)*t,s>=o)return a*t}}function Vp(t){for(var e=[],i=0;i<t.length;i++)e.push(0);i=new et;for(var n=0;n<t.length;n++){var o=-1,r=-1;if(0===n)for(var s=0;s<t.length;s++){var a=t.J(s).edgesCount;a>o&&(o=a,r=s)}else for(s=0;s<t.length;s++)a=e[s],a>o&&(o=a,r=s);for(i.add(t.J(r)),e[r]=-1,r=t.J(r),s=r.sourceEdges;s.next();)o=t.indexOf(s.value.fromVertex),0>o||0<=e[o]&&e[o]++;for(r=r.destinationEdges;r.next();)o=t.indexOf(r.value.toVertex),0>o||0<=e[o]&&e[o]++}return i}yp.className="GraphLinksModel",up.GraphLinksModel=yp,Bd.constructGraphLinksModel=Bd.constructGraphLinksModel=function(){return new yp},Bd.initDiagramModel=op=function(){return new yp},f(Cp,Bd),Cp.constructGraphLinksModel=Bd.constructGraphLinksModel,Cp.prototype.cloneProtected=function(t){Bd.prototype.cloneProtected.call(this,t),t.Ae=this.Ae,t.Gn=this.Gn,t.$j=this.$j},i=Cp.prototype,i.toString=function(t){if(void 0===t&&(t=0),2<=t)return this.fr();var e=(""!==this.name?this.name:"")+" TreeModel";if(0<t){e+="\n node data:",t=this.nodeDataArray;for(var i=t.length,n=0;n<i;n++){var o=t[n];e+=" "+this.ja(o)+":"+F(o)}}return e},i.Vk=function(){var t=Bd.prototype.Vk.call(this),e="";return"parent"!==this.nodeParentKeyProperty&&"string"===typeof this.nodeParentKeyProperty&&(e+=',\n  "nodeParentKeyProperty": '+this.quote(this.nodeParentKeyProperty)),t+e},i.Xq=function(t){Bd.prototype.Xq.call(this,t),t.nodeParentKeyProperty&&(this.nodeParentKeyProperty=t.nodeParentKeyProperty)},i.kr=function(t){return Vd(this,t,"nodeParentKeyProperty"),Bd.prototype.kr.call(this,t)},i.Wq=function(t){void 0!==t.nodeParentKeyProperty&&t.nodeParentKeyProperty!==this.nodeParentKeyProperty&&w("applyIncrementalJson cannot change Model properties"),Bd.prototype.Wq.call(this,t)},i.Gm=function(t){return t},i.Mh=function(t){if(null!==t){var e=this.Ae;if(""!==e&&(e=ap(t,e),void 0!==e)){if(Jd(e))return e;w("ParentKey value for node data "+t+" is not a number or a string: "+e)}}},i.fe=function(t,e){if(null===e&&(e=void 0),null!==t){var i=this.Ae;if(""!==i)if(e=this.Gm(e),this.ab(t)){var n=ap(t,i);n!==e&&(ep(this,n,t),hp(t,i,e),null===this.Kb(e)&&tp(this,e,t),$d(this,"nodeParentKey",Pi,i,t,n,e),"string"===typeof i&&this.Da(t,i))}else hp(t,i,e)}},i.Ot=function(t){if(null===t)return"";var e=this.$j;return""===e?"":(e=ap(t,e),void 0===e?"":"string"===typeof e?e:(w("getParentLinkCategoryForNodeData found a non-string category for "+t+": "+e),""))},Cp.prototype.getLinkCategoryForData=function(t){return this.Ot(t)},Cp.prototype.ku=function(t,e){if(null!==t){var i=this.$j;if(""!==i)if(this.ab(t)){var n=ap(t,i);void 0===n&&(n=""),n!==e&&(hp(t,i,e),$d(this,"parentLinkCategory",Pi,i,t,n,e),"string"===typeof i&&this.Da(t,i))}else hp(t,i,e)}},Cp.prototype.setLinkCategoryForData=function(t,e){this.ku(t,e)},Cp.prototype.copyNodeData=function(t){return null===t?null:(t=Bd.prototype.copyNodeData.call(this,t),this.sk||""===this.Ae||void 0===ap(t,this.Ae)||hp(t,this.Ae,void 0),t)},Cp.prototype.setDataProperty=function(t,e,i){if(this.ab(t)){if(e===this.nodeKeyProperty)return void this.Vm(t,i);if(e===this.nodeCategoryProperty)return void this.Um(t,i);if(e===this.nodeParentKeyProperty)return void this.fe(t,i)}var n=ap(t,e);n!==i&&(hp(t,e,i),this.du(t,e,n,i))},i=Cp.prototype,i.ar=function(t,e){Bd.prototype.ar.call(this,t,e);for(var i=this.Wa.iterator;i.next();)this.vw(i.value,t,e)},i.vw=function(t,e,i){if(this.Mh(t)===e){var n=this.Ae;hp(t,n,i),$d(this,"nodeParentKey",Pi,n,t,e,i),"string"===typeof n&&this.Da(t,n)}},i.Qm=function(t){Bd.prototype.Qm.call(this,t),t=this.ja(t);var e=ip(this,t);if(null!==e){var i=j();for(e=e.iterator;e.next();){var n=e.value;if(this.ab(n)&&this.Mh(n)===t){var o=this.Ae;$d(this,"nodeParentKey",Pi,o,n,t,t),"string"===typeof o&&this.Da(n,o),i.push(n)}}for(e=0;e<i.length;e++)ep(this,t,i[e]);O(i)}},i.Pm=function(t){Bd.prototype.Pm.call(this,t);var e=this.Mh(t);e=this.Gm(e),null===this.Kb(e)&&tp(this,e,t)},i.hr=function(t){Bd.prototype.hr.call(this,t);var e=this.Mh(t);ep(this,e,t)},i.Wm=function(t,e){Bd.prototype.Wm.call(this,t,e),this.ku(e,this.Ot(t)),this.fe(e,this.Mh(t))},i.Em=function(){return!0},i.Ut=function(){return!0},d.Object.defineProperties(Cp.prototype,{nodeParentKeyProperty:{get:function(){return this.Ae},set:function(t){var e=this.Ae;e!==t&&(this.Ae=t,this.g("nodeParentKeyProperty",e,t))}},sk:{get:function(){return this.Gn},set:function(t){this.Gn!==t&&(this.Gn=t)}},parentLinkCategoryProperty:{get:function(){return this.$j},set:function(t){var e=this.$j;e!==t&&(this.$j=t,this.g("parentLinkCategoryProperty",e,t))}},linkCategoryProperty:{get:function(){return this.parentLinkCategoryProperty},set:function(t){this.parentLinkCategoryProperty=t}},type:{get:function(){return"TreeModel"}}}),Cp.prototype.setParentLinkCategoryForNodeData=Cp.prototype.ku,Cp.prototype.getParentLinkCategoryForNodeData=Cp.prototype.Ot,Cp.prototype.setParentKeyForNodeData=Cp.prototype.fe,Cp.prototype.getParentKeyForNodeData=Cp.prototype.Mh,Cp.className="TreeModel",up.TreeModel=Cp,f(Tp,zf),Tp.prototype.cloneProtected=function(t){zf.prototype.cloneProtected.call(this,t),t.Ap=this.Ap,t.pn=this.pn,t.bq=this.bq,t.mm=this.mm,t.Eb=this.Eb,t.K=this.K,t.bd=this.bd,t.Wc=this.Wc,t.lf=this.lf,t.jp=this.jp},Tp.prototype.jb=function(t){t.classType===Tp?t===Jp||t===Zp||t===Wp||t===$p||t===Qp?this.sorting=t:t===Hp||t===_p||t===Up||t===Kp?this.direction=t:t===Xp||t===Yp||t===Gp||t===qp?this.arrangement=t:t!==eg&&t!==tg||(this.nodeDiameterFormula=t):zf.prototype.jb.call(this,t)},Tp.prototype.createNetwork=function(){return new ng(this)},Tp.prototype.doLayout=function(t){if(null===this.network&&(this.network=this.makeNetwork(t)),this.arrangementOrigin=this.initialOrigin(this.arrangementOrigin),t=this.network.vertexes,1>=t.count)1===t.count&&(t=t.first(),t.centerX=0,t.centerY=0);else{var e=new et;e.addAll(t.iterator),t=new et;var i,n,o=new et,r=this.sort(e),s=this.Gr,a=this.arrangement,h=this.nodeDiameterFormula,l=this.radius;(!isFinite(l)||0>=l)&&(l=NaN);var u=this.aspectRatio;(!isFinite(u)||0>=u)&&(u=1);var c=this.startAngle;isFinite(c)||(c=0);var f=this.sweepAngle;if((!isFinite(f)||360<f||1>f)&&(f=360),e=this.spacing,isFinite(e)||(e=NaN),a===qp&&h===eg?a=Gp:a===qp&&h!==eg&&(a=this.arrangement),(this.direction===Hp||this.direction===_p)&&this.sorting!==Qp){for(h=0;!(h>=r.length);h+=2){if(t.add(r.J(h)),h+1>=r.length)break;o.add(r.J(h+1))}this.direction===Hp?(this.arrangement===qp&&t.reverse(),r=new et,r.addAll(t),r.addAll(o)):(this.arrangement===qp&&o.reverse(),r=new et,r.addAll(o),r.addAll(t))}h=r.length;for(var d=n=i=0;d<r.length;d++){var p=c+f*n*(this.direction===Up?1:-1)/h,g=r.J(d).diameter;isNaN(g)&&(g=rg(r.J(d),p)),360>f&&(0===d||d===r.length-1)&&(g/=2),i+=g,n++}if(isNaN(l)||a===qp){if(isNaN(e)&&(e=6),a!==Gp&&a!==qp){for(n=-1/0,s=0;s<h;s++)d=r.J(s),i=r.J(s===h-1?0:s+1),isNaN(d.diameter)&&rg(d,0),isNaN(i.diameter)&&rg(i,0),n=Math.max(n,(d.diameter+i.diameter)/2);s=n+e,l=a===Xp?(n+e)/(2*Math.PI/h):Rp(this,s*(360<=f?h:h-1),u,c*Math.PI/180,f*Math.PI/180)}else l=Rp(this,i+(360<=f?h:h-1)*(a!==qp?e:1.6*e),u,c*Math.PI/180,f*Math.PI/180);n=l*u}else if(n=l*u,d=Ep(this,l,n,c*Math.PI/180,f*Math.PI/180),isNaN(e))a!==Gp&&a!==qp||(e=(d-i)/(360<=f?h:h-1));else if(a===Gp||a===qp)d=(d-i)/(360<=f?h:h-1),d<e?(l=Rp(this,i+e*(360<=f?h:h-1),u,c*Math.PI/180,f*Math.PI/180),n=l*u):e=d;else{for(s=-1/0,i=0;i<h;i++)p=r.J(i),g=r.J(i===h-1?0:i+1),isNaN(p.diameter)&&rg(p,0),isNaN(g.diameter)&&rg(g,0),s=Math.max(s,(p.diameter+g.diameter)/2);s+=e,i=Rp(this,s*(360<=f?h:h-1),u,c*Math.PI/180,f*Math.PI/180),i>l?(l=i,n=l*u):s=d/(360<=f?h:h-1)}if(this.vx=a,this.$b=l,this.Un=u,this.wx=c,this.Ur=f,this.Ij=e,this.be=n,this.Gr=s,e=r,r=this.vx,a=this.$b,l=this.wx,u=this.Ur,c=this.Ij,f=this.be,h=this.Gr,this.direction!==Hp&&this.direction!==_p||r!==qp)if(this.direction===Hp||this.direction===_p){switch(s=0,r){case Yp:s=180*zp(this,a,f,l,h)/Math.PI;break;case Gp:h=e=0,s=t.first(),null!==s&&(e=rg(s,Math.PI/2)),s=o.first(),null!==s&&(h=rg(s,Math.PI/2)),s=180*zp(this,a,f,l,c+(e+h)/2)/Math.PI;break;case Xp:s=u/e.length}if(this.direction===Hp){switch(r){case Yp:jp(this,t,l,Kp);break;case Gp:Lp(this,t,l,Kp);break;case Xp:Ap(this,t,u/2,l,Kp)}switch(r){case Yp:jp(this,o,l+s,Up);break;case Gp:Lp(this,o,l+s,Up);break;case Xp:Ap(this,o,u/2,l+s,Up)}}else{switch(r){case Yp:jp(this,o,l,Kp);break;case Gp:Lp(this,o,l,Kp);break;case Xp:Ap(this,o,u/2,l,Kp)}switch(r){case Yp:jp(this,t,l+s,Up);break;case Gp:Lp(this,t,l+s,Up);break;case Xp:Ap(this,t,u/2,l+s,Up)}}}else switch(r){case Yp:jp(this,e,l,this.direction);break;case Gp:Lp(this,e,l,this.direction);break;case Xp:Ap(this,e,u,l,this.direction);break;case qp:Op(this,e,u,l,this.direction)}else Op(this,e,u,l-u/2,Up)}this.updateParts(),this.network=null,this.isValidLayout=!0},Tp.prototype.commitLayout=function(){this.commitNodes(),this.isRouting&&this.commitLinks()},Tp.prototype.commitNodes=function(){var t=null!==this.group&&null!==this.group.placeholder&&this.group.isSubGraphExpanded,e=t?this.group.location.copy():null,i=this.actualCenter;t?i=new pt(0,0):(i.x=this.arrangementOrigin.x+this.$b,i.y=this.arrangementOrigin.y+this.be);for(var n=this.network.vertexes.iterator;n.next();){var o=n.value;o.x+=i.x,o.y+=i.y,o.commit()}t&&(this.group.Ta(),t=this.group.position.copy(),i=this.group.location.copy(),e=e.ge(i.ge(t)),this.group.move(e),this.mx=e.ge(t))},Tp.prototype.commitLinks=function(){for(var t=this.network.edges.iterator;t.next();)t.value.commit()},Tp.prototype.sort=function(t){switch(this.sorting){case Wp:break;case $p:t.reverse();break;case Jp:t.sort(this.comparer);break;case Zp:t.sort(this.comparer),t.reverse();break;case Qp:return this.nw(Vp(t));default:w("Invalid sorting type.")}return t},Tp.prototype.nw=function(t){for(var e=[],i=0;i<t.length;i++){var n=t.J(i);e[i]=[];for(var o,r=n.destinationEdges;r.next();)o=t.indexOf(r.value.toVertex),o!==i&&0>e[i].indexOf(o)&&e[i].push(o);for(n=n.sourceEdges;n.next();)o=t.indexOf(n.value.fromVertex),o!==i&&0>e[i].indexOf(o)&&e[i].push(o)}for(r=[],i=0;i<e.length;i++)r[i]=0;i=[];var s=[],a=[];n=[],o=new et;for(var h=0,l=0;l<e.length;l++){var u=e[l].length;if(1===u)n.push(l);else if(0===u)o.add(t.J(l));else{if(0===h)i.push(l);else{for(var c=u=1/0,f=-1,d=[],p=0;p<i.length;p++)0>e[i[p]].indexOf(i[p===i.length-1?0:p+1])&&d.push(p===i.length-1?0:p+1);if(0===d.length)for(p=0;p<i.length;p++)d.push(p);for(p=0;p<d.length;p++){for(var g=d[p],y=e[l],m=0,v=0;v<s.length;v++){var x=r[s[v]],b=r[a[v]];if(x<b){var w=x;x=b}else w=b;if(w<g&&g<=x)for(b=0;b<y.length;b++){var k=y[b];0>i.indexOf(k)||w<r[k]&&r[k]<x||w===r[k]||x===r[k]||m++}else for(b=0;b<y.length;b++)k=y[b],0>i.indexOf(k)||w<r[k]&&r[k]<x&&w!==r[k]&&x!==r[k]&&m++}for(y=m,v=m=0;v<e[l].length;v++)w=i.indexOf(e[l][v]),0<=w&&(w=Math.abs(g-(w>=g?w+1:w)),m+=w<i.length+1-w?w:i.length+1-w);for(v=0;v<s.length;v++)w=r[s[v]],x=r[a[v]],w>=g&&w++,x>=g&&x++,w>x&&(b=x,x=w,w=b),x-w<(i.length+2)/2===(w<g&&g<=x)&&m++;(y<u||y===u&&m<c)&&(u=y,c=m,f=g)}for(i.splice(f,0,l),u=0;u<i.length;u++)r[i[u]]=u;for(u=0;u<e[l].length;u++)c=e[l][u],0<=i.indexOf(c)&&(s.push(l),a.push(c))}h++}}for(s=i.length;;){for(r=!0,a=0;a<n.length;a++)if(h=n[a],l=e[h][0],u=i.indexOf(l),0<=u){for(f=c=0;f<e[l].length;f++)d=i.indexOf(e[l][f]),0>d||d===u||(p=d>u?d-u:u-d,c+=d<u!==p>s-p?1:-1);i.splice(0>c?u:u+1,0,h),n.splice(a,1),a--}else r=!1;if(r)break;i.push(n[0]),n.splice(0,1)}for(e=0;e<i.length;e++)o.add(t.J(i[e]));return o},d.Object.defineProperties(Tp.prototype,{radius:{get:function(){return this.Ap},set:function(t){this.Ap!==t&&(0<t||isNaN(t))&&(this.Ap=t,this.B())}},aspectRatio:{get:function(){return this.pn},set:function(t){this.pn!==t&&0<t&&(this.pn=t,this.B())}},startAngle:{get:function(){return this.bq},set:function(t){this.bq!==t&&(this.bq=t,this.B())}},sweepAngle:{get:function(){return this.mm},set:function(t){this.mm!==t&&(this.mm=0<t&&360>=t?t:360,this.B())}},arrangement:{get:function(){return this.Eb},set:function(t){this.Eb===t||t!==qp&&t!==Gp&&t!==Yp&&t!==Xp||(this.Eb=t,this.B())}},direction:{get:function(){return this.K},set:function(t){this.K===t||t!==Up&&t!==Kp&&t!==Hp&&t!==_p||(this.K=t,this.B())}},sorting:{get:function(){return this.bd},set:function(t){this.bd===t||t!==Wp&&t!==$p&&t!==Jp&&!Zp&&t!==Qp||(this.bd=t,this.B())}},comparer:{get:function(){return this.Wc},set:function(t){this.Wc!==t&&(this.Wc=t,this.B())}},spacing:{get:function(){return this.lf},set:function(t){this.lf!==t&&(this.lf=t,this.B())}},nodeDiameterFormula:{get:function(){return this.jp},set:function(t){this.jp===t||t!==tg&&t!==eg||(this.jp=t,this.B())}},actualXRadius:{get:function(){return this.$b}},actualYRadius:{get:function(){return this.be}},actualSpacing:{get:function(){return this.Ij}},actualCenter:{get:function(){return this.mx}}});var Gp=new U(Tp,"ConstantSpacing",0),Yp=new U(Tp,"ConstantDistance",1),Xp=new U(Tp,"ConstantAngle",2),qp=new U(Tp,"Packed",3),Up=new U(Tp,"Clockwise",4),Kp=new U(Tp,"Counterclockwise",5),Hp=new U(Tp,"BidirectionalLeft",6),_p=new U(Tp,"BidirectionalRight",7),Wp=new U(Tp,"Forwards",8),$p=new U(Tp,"Reverse",9),Jp=new U(Tp,"Ascending",10),Zp=new U(Tp,"Descending",11),Qp=new U(Tp,"Optimized",12),tg=new U(Tp,"Pythagorean",13),eg=new U(Tp,"Circular",14);function ig(){this.Am=-1/0,this.cn=this.Wk=null}function ng(t){Qf.call(this,t)}function og(t){rd.call(this,t),this.I=this.Gj=NaN}function rg(t,e){var i=t.network;if(null===i)return NaN;if(i=i.layout,null===i)return NaN;if(i.arrangement===qp)if(i.nodeDiameterFormula===eg)t.Gj=Math.max(t.width,t.height);else{if(i=Math.abs(Math.sin(e)),e=Math.abs(Math.cos(e)),0===i)return t.width;if(0===e)return t.height;t.Gj=Math.min(t.height/i,t.width/e)}else t.Gj=i.nodeDiameterFormula===eg?Math.max(t.width,t.height):Math.sqrt(t.width*t.width+t.height*t.height);return t.Gj}function sg(t){ad.call(this,t)}function ag(){zf.call(this),this.Fh=null,this.Eo=0,this.Pd=new Bt(100,100).freeze(),this.on=!1,this.kf=!0,this.jd=!1,this.Rl=100,this.Xn=1,this.Xf=1e3,this.bp=10,this.Bp=Math,this.ol=.05,this.nl=50,this.ll=150,this.ml=0,this.On=10,this.Nn=5}function hg(t,e,i){if(lg(t,e)){var n=t.Xf;t.Xf*=1+1/(e+1);var o=ug(t,e),r=Math.max(0,Math.max(Math.min(t.network.vertexes.count,i*(e+1)/11),10));for(t.maxIterations+=r,hg(t,e+1,i),gg(t,r),cg(t,o),e=o.vertexes.ma(),e.sort((function(t,e){return null===t||null===e||t===e?0:e.Ld-t.Ld})),i=0;i<e.length;i++)fg(t,e[i]);t.Xf=n}}function lg(t,e){if(10<e||3>t.network.vertexes.count)return!1;for(t.Fh=t.network.vertexes.ma(),t=t.Fh,t.sort((function(t,e){return null===t||null===e||t===e?0:e.Ld-t.Ld})),e=t.length-1;0<=e&&1>=t[e].Ld;)e--;return 1<t.length-e}function ug(t,e){for(var i=t.network,n=new vg(t),o=0;o<t.Fh.length;o++){var r=t.Fh[o];if(!(1<r.Ld))break;n.Bg(r);var s=new mg;s.qu=r.Ld,s.ru=r.width,s.pu=r.height,s.$w=r.focus.x,s.ax=r.focus.y,null===r.Ne&&(r.Ne=new et),r.Ne.add(s),r.zw=r.Ne.count-1}for(r=i.edges.iterator;r.next();){var a=r.value;o=a.fromVertex,s=a.toVertex,o.network===n&&s.network===n?n.tm(a):o.network===n?(a=o.qk,null===a&&(a=new et,o.qk=a),a.add(s),o.Ld--,o.Sh+=s.Sh):s.network===n&&(a=s.qk,null===a&&(a=new et,s.qk=a),a.add(o),s.Ld--,s.Sh+=o.Sh)}for(o=n.edges.iterator;o.next();)r=o.value,r.length*=Math.max(1,_e.sqrt((r.fromVertex.Sh+r.toVertex.Sh)/(4*e+1)));for(e=n.vertexes.iterator;e.next();){o=e.value;var h=o.qk;if(null!==h&&0<h.count&&(s=o.Ne.J(o.Ne.count-1).qu-o.Ld,!(0>=s))){for(var l=a=0,u=h.count-s;u<h.count;u++){var c=h.J(u),f=null;for(r=c.edges.iterator;r.next();){var d=r.value;if(d.zy(c)===o){f=d;break}}null!==f&&(l+=f.length,a+=c.width*c.height)}r=o.centerX,h=o.centerY,u=o.width,c=o.height,f=o.focus,d=u*c,1>d&&(d=1),a=_e.sqrt((a+d+l*l*4/(s*s))/d),s=(a-1)*u/2,a=(a-1)*c/2,o.bounds=new zt(r-f.x-s,h-f.y-a,u+2*s,c+2*a),o.focus=new pt(f.x+s,f.y+a)}}return t.network=n,i}function cg(t,e){for(var i=t.network.vertexes.iterator;i.next();){var n=i.value;if(n.network=e,null!==n.Ne){var o=n.Ne.J(n.zw);n.Ld=o.qu;var r=o.$w,s=o.ax;n.bounds=new zt(n.centerX-r,n.centerY-s,o.ru,o.pu),n.focus=new pt(r,s),n.zw--}}for(i=t.network.edges.iterator;i.next();)i.value.network=e;t.network=e}function fg(t,e){var i=e.qk;if(null!==i&&0!==i.count){var n=e.centerX,o=e.centerY,r=e.width,s=e.height;null!==e.Ne&&0<e.Ne.count&&(s=e.Ne.J(0),r=s.ru,s=s.pu),r=_e.sqrt(r*r+s*s)/2;for(var a=!1,h=s=0,l=0,u=e.vertexes.iterator;u.next();){var c=u.value;1>=c.Ld?h++:(a=!0,l++,s+=Math.atan2(e.centerY-c.centerY,e.centerX-c.centerX))}if(0!==h)for(0<l&&(s/=l),l=e=0,e=a?2*Math.PI/(h+1):2*Math.PI/h,0===h%2&&(l=e/2),1<i.count&&i.sort((function(t,e){return null===t||null===e||t===e?0:e.width*e.height-t.width*t.height})),a=0===h%2?0:1,i=i.iterator;i.next();)if(h=i.value,!(1<h.Ld||t.isFixed(h))){for(u=null,c=h.edges.iterator;c.next();){u=c.value;break}c=h.width;var f=h.height;c=_e.sqrt(c*c+f*f)/2,u=r+u.length+c,c=s+(e*(a/2>>1)+l)*(0===a%2?1:-1),h.centerX=n+u*Math.cos(c),h.centerY=o+u*Math.sin(c),a++}}}function dg(t,e,i,n,o,r,s){var a=9e19,h=-1,l=0;t:for(;l<e;l++){var u=t[l],c=u.x-i,f=u.y-n;if(c=c*c+f*f,c<a){for(f=l-1;0<=f;f--)if(t[f].y>u.y&&t[f].x-u.x<o+s.width)continue t;for(f=l+1;f<e;f++)if(t[f].x>u.x&&t[f].y-u.y<r+s.height)continue t;h=l,a=c}}return h}function pg(t,e){var i=t.bounds,n=i.x;t=i.y;var o=i.width;i=i.height;var r=e.bounds,s=r.x;e=r.y;var a=r.width;return r=r.height,n+o<s?t>e+r?(i=n+o-s,t=t-e-r,_e.sqrt(i*i+t*t)):t+i<e?(n=n+o-s,t=t+i-e,_e.sqrt(n*n+t*t)):s-(n+o):n>s+a?t>e+r?(i=n-s-a,t=t-e-r,_e.sqrt(i*i+t*t)):t+i<e?(n=n-s-a,t=t+i-e,_e.sqrt(n*n+t*t)):n-(s+a):t>e+r?t-(e+r):t+i<e?e-(t+i):.1}function gg(t,e){for(t.Fh=null,e=t.Eo+e;t.Eo<e&&(t.Eo++,yg(t)););t.Fh=null}function yg(t){null===t.Fh&&(t.Fh=t.network.vertexes.ma());var e=t.Fh;if(0>=e.length)return!1;var i=e[0];i.forceX=0,i.forceY=0;for(var n=i.centerX,o=n,r=i=i.centerY,s=1;s<e.length;s++){var a=e[s];a.forceX=0,a.forceY=0;var h=a.centerX;a=a.centerY,n=Math.min(n,h),o=Math.max(o,h),i=Math.min(i,a),r=Math.max(r,a)}(o=o-n>r-i)?e.sort((function(t,e){return null===t||null===e||t===e?0:t.centerX-e.centerX})):e.sort((function(t,e){return null===t||null===e||t===e?0:t.centerY-e.centerY})),i=t.Xf;var l=n=a=0;for(r=0;r<e.length;r++){s=e[r],n=s.bounds,a=s.focus,h=n.x+a.x;var u=n.y+a.y;n=s.charge*t.electricalFieldX(h,u),l=s.charge*t.electricalFieldY(h,u),n+=s.mass*t.gravitationalFieldX(h,u),l+=s.mass*t.gravitationalFieldY(h,u),s.forceX+=n,s.forceY+=l;for(var c=r+1;c<e.length;c++){var f=e[c];if(f!==s){n=f.bounds,a=f.focus,l=n.x+a.x;var d=n.y+a.y;if(h-l>i||l-h>i){if(o)break}else if(u-d>i||d-u>i){if(!o)break}else{var p=pg(s,f);1>p?(n=t.randomNumberGenerator,null===n&&(t.randomNumberGenerator=n=new wg),p=n.random(),a=n.random(),h>l?(n=Math.abs(f.bounds.right-s.bounds.x),n=(1+n)*p):h<l?(n=Math.abs(f.bounds.x-s.bounds.right),n=-(1+n)*p):(n=Math.max(f.width,s.width),n=(1+n)*p-n/2),u>d?(l=Math.abs(f.bounds.bottom-s.bounds.y),l=(1+l)*a):h<l?(l=Math.abs(f.bounds.y-s.bounds.bottom),l=-(1+l)*a):(l=Math.max(f.height,s.height),l=(1+l)*a-l/2)):(a=-s.charge*f.charge/(p*p),n=(l-h)/p*a,l=(d-u)/p*a),s.forceX+=n,s.forceY+=l,f.forceX-=n,f.forceY-=l}}}}for(o=t.network.edges.iterator;o.next();)a=o.value,i=a.fromVertex,r=a.toVertex,s=i.bounds,h=i.focus,n=s.x+h.x,s=s.y+h.y,u=r.bounds,c=r.focus,h=u.x+c.x,u=u.y+c.y,c=pg(i,r),1>c?(c=t.randomNumberGenerator,null===c&&(t.randomNumberGenerator=c=new wg),a=c.random(),c=c.random(),n=(n>h?1:-1)*(1+(r.width>i.width?r.width:i.width))*a,l=(s>u?1:-1)*(1+(r.height>i.height?r.height:i.height))*c):(a=a.stiffness*(c-a.length),n=(h-n)/c*a,l=(u-s)/c*a),i.forceX+=n,i.forceY+=l,r.forceX-=n,r.forceY-=l;for(o=n=0;o<e.length;o++)i=e[o],t.isFixed(i)?t.moveFixedVertex(i):n=Math.max(n,t.moveVertex(i)||0);return n>t.epsilonDistance*t.epsilonDistance}function mg(){this.ax=this.$w=this.pu=this.ru=this.qu=0}function vg(t){Qf.call(this,t)}function xg(t){rd.call(this,t),this.La=!1,this.eb=this.I=NaN,this.Sh=this.Ld=this.Ka=this.T=0,this.Ne=this.qk=null,this.zw=0}function bg(t){ad.call(this,t),this.l=this.u=NaN}function wg(){var t=0;void 0===t&&(t=42),this.seed=t,this.Zy=48271,this.az=2147483647,this.Q=44488.07041494893,this.bz=3399,this.$y=1/2147483647,this.random()}function kg(){zf.call(this),this.Zb=this.ue=25,this.K=0,this.jl=ey,this.Ml=oy,this.Bl=ay,this.Rj=4,this.Zk=cy,this.ng=15,this.kf=!0,this.Mo=4,this.Ca=this.Ji=this.sa=-1,this.pc=this.mh=0,this.Ia=this.yd=this.zd=this.$d=this.zb=null,this.oh=0,this.fp=this.Wj=null,this.Ec=0,this.gp=null,this.Vc=new pt,this.xe=[],this.xe.length=100}function Mg(t){var e=t.fromVertex.node||t.fromVertex.data;return t=t.toVertex.node||t.toVertex.data,null===e&&null===t?8:null===e||null===t?4:1}function Sg(t){null===t.Wj&&(t.Wj=[]);for(var e=0,i=t.network.vertexes.iterator;i.next();){var n=i.value;t.Wj[e]=n.layer,e++,t.Wj[e]=n.column,e++,t.Wj[e]=n.index,e++}return t.Wj}function Pg(t,e){var i=0;for(t=t.network.vertexes.iterator;t.next();){var n=t.value;n.layer=e[i],i++,n.column=e[i],i++,n.index=e[i],i++}}function Ng(t,e,i){var n=Qg(t,e),o=t.zb[e];(null===t.fp||t.fp.length<o*o)&&(t.fp=[]);for(var r=t.fp,s=0;s<o;s++){var a,h=0,l=n[s],u=l.near;if(null!==u&&u.layer===l.layer)if(l=u.index,l>s)for(var c=s+1;c<l;c++){var f=n[c];f.near===u&&f.wf===u.wf||h++}else for(c=s-1;c>l;c--)f=n[c],f.near===u&&f.wf===u.wf||h++;if(0<=i)for(l=n[s].sourceEdgesArrayAccess,u=0;u<l.length;u++){var d=l[u];if(d.valid&&d.fromVertex.layer!==e)for(f=d.fromVertex.index,c=d.portToPos,d=d.portFromPos,a=u+1;a<l.length;a++){var p=l[a];if(p.valid&&p.fromVertex.layer!==e){var g=p.fromVertex.index,y=p.portToPos;p=p.portFromPos,c<y&&(f>g||f===g&&d>p)&&h++,y<c&&(g>f||g===f&&p>d)&&h++}}}if(0>=i)for(l=n[s].destinationEdgesArrayAccess,u=0;u<l.length;u++)if(d=l[u],d.valid&&d.toVertex.layer!==e)for(f=d.toVertex.index,c=d.portToPos,d=d.portFromPos,a=u+1;a<l.length;a++)p=l[a],p.valid&&p.toVertex.layer!==e&&(g=p.toVertex.index,y=p.portToPos,p=p.portFromPos,d<p&&(f>g||f===g&&c>y)&&h++,p<d&&(g>f||g===f&&y>c)&&h++);for(r[s*o+s]=h,l=s+1;l<o;l++){var m=0,v=0;if(0<=i){h=n[s].sourceEdgesArrayAccess;var x=n[l].sourceEdgesArrayAccess;for(u=0;u<h.length;u++)if(d=h[u],d.valid&&d.fromVertex.layer!==e)for(f=d.fromVertex.index,d=d.portFromPos,a=0;a<x.length;a++)p=x[a],p.valid&&p.fromVertex.layer!==e&&(g=p.fromVertex.index,p=p.portFromPos,(f<g||f===g&&d<p)&&v++,(g<f||g===f&&p<d)&&m++)}if(0>=i)for(h=n[s].destinationEdgesArrayAccess,x=n[l].destinationEdgesArrayAccess,u=0;u<h.length;u++)if(d=h[u],d.valid&&d.toVertex.layer!==e)for(f=d.toVertex.index,c=d.portToPos,a=0;a<x.length;a++)p=x[a],p.valid&&p.toVertex.layer!==e&&(g=p.toVertex.index,y=p.portToPos,(f<g||f===g&&c<y)&&v++,(g<f||g===f&&y<c)&&m++);r[s*o+l]=m,r[l*o+s]=v}}return ty(t,e,n),r}function Cg(t){for(var e=0,i=0;i<=t.sa;i++){for(var n=t,o=i,r=Qg(n,o),s=n.zb[o],a=0,h=0;h<s;h++){var l=r[h].destinationEdgesArrayAccess;if(null!==l)for(var u=0;u<l.length;u++){var c=l[u];if(c.valid&&c.toVertex.layer!==o){var f=c.fromVertex.column+c.portFromColOffset,d=c.toVertex.column+c.portToColOffset;a+=(Math.abs(f-d)+1)*Mg(c)}}}ty(n,o,r),e+=a}return e}function Tg(t,e,i){for(var n=Qg(t,e),o=t.zb[e],r=[],s=0;s<o;s++){var a=n[s],h=null;0>=i&&(h=a.sourceEdgesArrayAccess);var l=null;0<=i&&(l=a.destinationEdgesArrayAccess);var u=0,c=0,f=a.near;if(null!==f&&f.layer===a.layer&&(u+=f.column-1,c++),null!==h)for(f=0;f<h.length;f++){a=h[f];var d=a.fromVertex;a.valid&&!a.rev&&d.layer!==e&&(u+=d.column,c++)}if(null!==l)for(h=0;h<l.length;h++)a=l[h],f=a.toVertex,a.valid&&!a.rev&&f.layer!==e&&(u+=f.column,c++);r[s]=0===c?-1:u/c}return ty(t,e,n),r}function Ag(t,e,i){for(var n=Qg(t,e),o=t.zb[e],r=[],s=0;s<o;s++){var a=n[s],h=null;0>=i&&(h=a.sourceEdgesArrayAccess);var l=null;0<=i&&(l=a.destinationEdgesArrayAccess);var u=0,c=[],f=a.near;if(null!==f&&f.layer===a.layer&&(c[u]=f.column-1,u++),a=void 0,null!==h)for(f=0;f<h.length;f++){a=h[f];var d=a.fromVertex;a.valid&&!a.rev&&d.layer!==e&&(c[u]=d.column+a.portFromColOffset,u++)}if(null!==l)for(h=0;h<l.length;h++)a=l[h],f=a.toVertex,a.valid&&!a.rev&&f.layer!==e&&(c[u]=f.column+a.portToColOffset,u++);0===u?r[s]=-1:(c.sort((function(t,e){return t-e})),l=u>>1,r[s]=0!==(1&u)?c[l]:c[l-1]+c[l]>>1)}return ty(t,e,n),r}function Lg(t,e,i,n,o,r){if(e.component===n){if(e.component=i,o)for(var s=e.destinationEdges;s.next();){var a=s.value,h=a.toVertex,l=e.layer-h.layer;a=t.linkMinLength(a),l===a&&Lg(t,h,i,n,o,r)}if(r)for(s=e.sourceEdges;s.next();)a=s.value,h=a.fromVertex,l=h.layer-e.layer,a=t.linkMinLength(a),l===a&&Lg(t,h,i,n,o,r)}}function jg(t,e,i,n,o,r){if(e.component===n){if(e.component=i,o)for(var s=e.destinationEdges;s.next();)jg(t,s.value.toVertex,i,n,o,r);if(r)for(e=e.sourceEdges;e.next();)jg(t,e.value.fromVertex,i,n,o,r)}}function Og(t){for(t=t.vertexes.iterator;t.next();){var e=t.value;if(e.valid)return e}return null}function Dg(t){for(t=t.vertexes.iterator;t.next();){var e=t.value;if(e.valid){for(var i=!0,n=e.destinationEdges;n.next();)if(n.value.toVertex.valid){i=!1;break}if(i)return e}}return null}function Fg(t){for(t=t.vertexes.iterator;t.next();){var e=t.value;if(e.valid){for(var i=!0,n=e.sourceEdges;n.next();)if(n.value.fromVertex.valid){i=!1;break}if(i)return e}}return null}function Bg(t,e){e.Cg=t.oh,t.oh++;for(var i=e.destinationEdges;i.next();){var n=i.value,o=n.toVertex;-1===o.Cg&&(n.forest=!0,Bg(t,o))}e.finish=t.oh,t.oh++}function Ig(t){for(var e=t.network.vertexes.iterator;e.next();){var i=Eg(t,e.value);t.sa=Math.max(i,t.sa)}}function Eg(t,e){var i=0;if(-1===e.layer){for(var n=e.destinationEdges;n.next();){var o=n.value,r=o.toVertex;o=t.linkMinLength(o),i=Math.max(i,Eg(t,r)+o)}e.layer=i}else i=e.layer;return i}function Rg(t,e){var i=0;if(-1===e.layer){for(var n=e.sourceEdges;n.next();){var o=n.value,r=o.fromVertex;o=t.linkMinLength(o),i=Math.max(i,Rg(t,r)+o)}e.layer=i}else i=e.layer;return i}function zg(t,e){if(!e.valid){e.valid=!0;for(var i=e.destinationEdges;i.next();)zg(t,i.value.toVertex);for(i=t.network.vertexes.iterator;i.next();)i.value.component=-1;for(var n=e.sourceEdgesArrayAccess,o=n.length,r=0;r<o;r++){var s=n[r],a=s.fromVertex,h=s.toVertex;s=t.linkMinLength(s),a.layer-h.layer>s&&Lg(t,a,0,-1,!0,!1)}for(Lg(t,e,1,-1,!0,!0);0!==e.component;){for(r=0,n=1/0,a=0,h=null,s=t.network.vertexes.iterator;s.next();){var l=s.value;if(1===l.component){var u=0,c=!1,f=l.sourceEdgesArrayAccess;o=f.length;for(var d=0;d<o;d++){var p=f[d],g=p.fromVertex;u+=1,1!==g.component&&(r+=1,g=g.layer-l.layer,p=t.linkMinLength(p),n=Math.min(n,g-p))}for(f=l.destinationEdgesArrayAccess,o=f.length,d=0;d<o;d++)p=f[d].toVertex,--u,1!==p.component?--r:c=!0;(null===h||u<a)&&!c&&(h=l,a=u)}}if(0<r){for(i.reset();i.next();)o=i.value,1===o.component&&(o.layer+=n);e.component=0}else h.component=0}for(i=t.network.vertexes.iterator;i.next();)i.value.component=-1;for(Lg(t,e,1,-1,!0,!1);0!==e.component;){for(n=0,o=1/0,r=0,a=null,h=t.network.vertexes.iterator;h.next();)if(s=h.value,1===s.component){for(l=0,u=!1,f=s.sourceEdgesArrayAccess,c=f.length,d=0;d<c;d++)p=f[d].fromVertex,l+=1,1!==p.component?n+=1:u=!0;for(f=s.destinationEdgesArrayAccess,c=f.length,d=0;d<c;d++)p=f[d],g=p.toVertex,--l,1!==g.component&&(--n,g=s.layer-g.layer,p=t.linkMinLength(p),o=Math.min(o,g-p));(null===a||l>r)&&!u&&(a=s,r=l)}if(0>n){for(i.reset();i.next();)n=i.value,1===n.component&&(n.layer-=o);e.component=0}else a.component=0}}}function Vg(t,e,i){return 90===t.K?i&&!e.rev||!i&&e.rev?270:90:180===t.K?i&&!e.rev||!i&&e.rev?0:180:270===t.K?i&&!e.rev||!i&&e.rev?90:270:i&&!e.rev||!i&&e.rev?180:0}function Gg(t,e){var i=e.layer;for(e.index=t.zb[i],t.zb[i]++,e=e.destinationEdgesArrayAccess,i=!0;i;){i=!1;for(var n=0;n<e.length-1;n++){var o=e[n],r=e[n+1];o.portFromColOffset>r.portFromColOffset&&(i=!0,e[n]=r,e[n+1]=o)}}for(i=0;i<e.length;i++)n=e[i],n.valid&&(n=n.toVertex,-1===n.index&&Gg(t,n))}function Yg(t,e){var i=e.layer;e.index=t.zb[i],t.zb[i]++,e=e.sourceEdgesArrayAccess;for(var n=!0;n;)for(n=!1,i=0;i<e.length-1;i++){var o=e[i],r=e[i+1];o.portToColOffset>r.portToColOffset&&(n=!0,e[i]=r,e[i+1]=o)}for(i=0;i<e.length;i++)n=e[i],n.valid&&(n=n.fromVertex,-1===n.index&&Yg(t,n))}function Xg(t,e,i){var n=Qg(t,e),o=t.zb[e],r=Ag(t,e,i),s=Tg(t,e,i);for(i=0;i<o;i++)-1===s[i]&&(s[i]=n[i].column),-1===r[i]&&(r[i]=n[i].column);for(var a,h=!0;h;)for(h=!1,i=0;i<o-1;i++)(r[i+1]<r[i]||r[i+1]===r[i]&&s[i+1]<s[i])&&(h=!0,a=r[i],r[i]=r[i+1],r[i+1]=a,a=s[i],s[i]=s[i+1],s[i+1]=a,a=n[i],n[i]=n[i+1],n[i+1]=a);for(i=r=0;i<o;i++)a=n[i],a.index=i,r+=t.nodeMinColumnSpace(a,!0),a.column=r,r+=1,r+=t.nodeMinColumnSpace(a,!1);ty(t,e,n)}function qg(t,e,i){var n,o=Qg(t,e),r=t.zb[e];i=Ng(t,e,i);var s=[];for(n=0;n<r;n++)s[n]=-1;var a=[];for(n=0;n<r;n++)a[n]=-1;for(var h=!1,l=!0;l;)for(l=!1,n=0;n<r-1;n++){var u=i[o[n].index*r+o[n+1].index],c=i[o[n+1].index*r+o[n].index],f=0,d=0,p=o[n].column,g=o[n+1].column,y=t.nodeMinColumnSpace(o[n],!0),m=t.nodeMinColumnSpace(o[n],!1),v=t.nodeMinColumnSpace(o[n+1],!0),x=t.nodeMinColumnSpace(o[n+1],!1);y=p-y+v,m=g-m+x;var b=o[n].sourceEdges.iterator;for(b.reset();b.next();)if(v=b.value,x=v.fromVertex,v.valid&&x.layer===e){for(v=0;o[v]!==x;)v++;v<n&&(f+=2*(n-v),d+=2*(n+1-v)),v===n+1&&(f+=1),v>n+1&&(f+=4*(v-n),d+=4*(v-(n+1)))}for(b=o[n].destinationEdges.iterator,b.reset();b.next();)if(v=b.value,x=v.toVertex,v.valid&&x.layer===e){for(v=0;o[v]!==x;)v++;v===n+1&&(d+=1)}for(b=o[n+1].sourceEdges.iterator,b.reset();b.next();)if(v=b.value,x=v.fromVertex,v.valid&&x.layer===e){for(v=0;o[v]!==x;)v++;v<n&&(f+=2*(n+1-v),d+=2*(n-v)),v===n&&(d+=1),v>n+1&&(f+=4*(v-(n+1)),d+=4*(v-n))}for(b=o[n+1].destinationEdges.iterator,b.reset();b.next();)if(v=b.value,x=v.toVertex,v.valid&&x.layer===e){for(v=0;o[v]!==x;)v++;v===n&&(f+=1)}v=x=0,b=s[o[n].index];var w=a[o[n].index],k=s[o[n+1].index],M=a[o[n+1].index];-1!==b&&(x+=Math.abs(b-p),v+=Math.abs(b-m)),-1!==w&&(x+=Math.abs(w-p),v+=Math.abs(w-m)),-1!==k&&(x+=Math.abs(k-g),v+=Math.abs(k-y)),-1!==M&&(x+=Math.abs(M-g),v+=Math.abs(M-y)),(d<f-.5||d===f&&c<u-.5||d===f&&c===u&&v<x-.5)&&(l=h=!0,o[n].column=m,o[n+1].column=y,u=o[n],o[n]=o[n+1],o[n+1]=u)}for(n=0;n<r;n++)o[n].index=n;return ty(t,e,o),h}function Ug(t,e,i){for(var n=!1;Kg(t,e,i);)n=!0;return n}function Kg(t,e,i){var n,o=Qg(t,e),r=t.zb[e],s=Tg(t,e,-1);if(0<i)for(n=0;n<r;n++)s[n]=-1;var a=Tg(t,e,1);if(0>i)for(n=0;n<r;n++)a[n]=-1;for(var h=!1,l=!0;l;)for(l=!1,n=0;n<r;n++){var u=o[n].column,c=t.nodeMinColumnSpace(o[n],!0),f=t.nodeMinColumnSpace(o[n],!1),d=0;d=0>n-1||u-o[n-1].column-1>c+t.nodeMinColumnSpace(o[n-1],!1)?u-1:u,c=n+1>=r||o[n+1].column-u-1>f+t.nodeMinColumnSpace(o[n+1],!0)?u+1:u;var p=f=0,g=0;if(0>=i)for(var y=o[n].sourceEdges.iterator;y.next();){var m=y.value,v=m.fromVertex;if(m.valid&&v.layer!==e){var x=Mg(m),b=m.portFromColOffset;m=m.portToColOffset,v=v.column,f+=(Math.abs(u+m-(v+b))+1)*x,p+=(Math.abs(d+m-(v+b))+1)*x,g+=(Math.abs(c+m-(v+b))+1)*x}}if(0<=i)for(y=o[n].destinationEdges.iterator;y.next();)m=y.value,v=m.toVertex,m.valid&&v.layer!==e&&(x=Mg(m),b=m.portFromColOffset,m=m.portToColOffset,v=v.column,f+=(Math.abs(u+b-(v+m))+1)*x,p+=(Math.abs(d+b-(v+m))+1)*x,g+=(Math.abs(c+b-(v+m))+1)*x);m=b=x=0,y=s[o[n].index],v=a[o[n].index],-1!==y&&(x+=Math.abs(y-u),b+=Math.abs(y-d),m+=Math.abs(y-c)),-1!==v&&(x+=Math.abs(v-u),b+=Math.abs(v-d),m+=Math.abs(v-c)),p<f||p===f&&b<x?(l=h=!0,o[n].column=d):(g<f||g===f&&m<x)&&(l=h=!0,o[n].column=c)}return ty(t,e,o),t.normalize(),h}function Hg(t,e,i){var n=Qg(t,e),o=t.zb[e],r=Ag(t,e,i),s=[];for(i=0;i<o;i++)s[i]=r[i];for(r=!0;r;)for(r=!1,i=0;i<o;i++){var a=n[i].column,h=t.nodeMinColumnSpace(n[i],!0),l=t.nodeMinColumnSpace(n[i],!1),u=0;if(-1===s[i])if(0===i&&i===o-1)u=a;else if(0===i){var c=n[i+1].column;u=c-a===l+t.nodeMinColumnSpace(n[i+1],!0)?a-1:a}else i===o-1?(c=n[i-1].column,u=a-c===h+t.nodeMinColumnSpace(n[i-1],!1)?a+1:a):(c=n[i-1].column,h=c+t.nodeMinColumnSpace(n[i-1],!1)+h+1,c=n[i+1].column,l=c-t.nodeMinColumnSpace(n[i+1],!0)-l-1,u=(h+l)/2|0);else 0===i&&i===o-1?u=s[i]:0===i?(c=n[i+1].column,l=c-t.nodeMinColumnSpace(n[i+1],!0)-l-1,u=Math.min(s[i],l)):i===o-1?(c=n[i-1].column,h=c+t.nodeMinColumnSpace(n[i-1],!1)+h+1,u=Math.max(s[i],h)):(c=n[i-1].column,h=c+t.nodeMinColumnSpace(n[i-1],!1)+h+1,c=n[i+1].column,l=c-t.nodeMinColumnSpace(n[i+1],!0)-l-1,h<s[i]&&s[i]<l?u=s[i]:h>=s[i]?u=h:l<=s[i]&&(u=l));u!==a&&(r=!0,n[i].column=u)}ty(t,e,n),t.normalize()}function _g(t,e){for(var i=!0,n=t.network.vertexes.iterator;n.next();){var o=n.value,r=t.nodeMinColumnSpace(o,!0),s=t.nodeMinColumnSpace(o,!1);if(o.column-r<=e&&o.column+s>=e){i=!1;break}}if(t=!1,i)for(n.reset();n.next();)i=n.value,i.column>e&&(--i.column,t=!0);return t}function Wg(t,e){var i,n=e+1,o=[],r=[];for(i=0;i<=t.sa;i++)o[i]=!1,r[i]=!1;for(var s=t.network.vertexes.iterator;s.next();){i=s.value;var a=i.column-t.nodeMinColumnSpace(i,!0),h=i.column+t.nodeMinColumnSpace(i,!1);a<=e&&h>=e&&(o[i.layer]=!0),a<=n&&h>=n&&(r[i.layer]=!0)}for(a=!0,n=!1,i=0;i<=t.sa;i++)a=a&&!(o[i]&&r[i]);if(a)for(s.reset();s.next();)t=s.value,t.column>e&&(--t.column,n=!0);return n}function $g(t,e){for(var i=0;i<=t.Ca;i++)for(;_g(t,i););for(t.normalize(),i=0;i<t.Ca;i++)for(;Wg(t,i););var n;if(t.normalize(),0<e)for(i=0;i<=t.Ca;i++){var o=Sg(t),r=Cg(t);for(n=r+1;r<n;){n=r,Jg(t,i,1);var s=Cg(t);s>r?Pg(t,o):s<r&&(r=s,o=Sg(t))}}if(0>e)for(i=t.Ca;0<=i;i--)for(o=Sg(t),r=Cg(t),n=r+1;r<n;)n=r,Jg(t,i,-1),s=Cg(t),s>r?Pg(t,o):s<r&&(r=s,o=Sg(t));t.normalize()}function Jg(t,e,i){t.Ec=0;for(var n=t.network.vertexes.iterator;n.next();)n.value.component=-1;if(0<i)for(n.reset();n.next();){var o=n.value;o.column-t.nodeMinColumnSpace(o,!0)<=e&&(o.component=t.Ec)}if(0>i)for(n.reset();n.next();)o=n.value,o.column+t.nodeMinColumnSpace(o,!1)>=e&&(o.component=t.Ec);for(t.Ec++,n.reset();n.next();)e=n.value,-1===e.component&&(jg(t,e,t.Ec,-1,!0,!0),t.Ec++);var r;for(e=[],r=0;r<t.Ec*t.Ec;r++)e[r]=!1;for(o=[],r=0;r<(t.sa+1)*(t.Ca+1);r++)o[r]=-1;for(n.reset();n.next();){r=n.value;for(var s=r.layer,a=Math.max(0,r.column-t.nodeMinColumnSpace(r,!0)),h=Math.min(t.Ca,r.column+t.nodeMinColumnSpace(r,!1));a<=h;a++)o[s*(t.Ca+1)+a]=r.component}for(r=0;r<=t.sa;r++){if(0<i)for(s=0;s<t.Ca;s++)-1!==o[r*(t.Ca+1)+s]&&-1!==o[r*(t.Ca+1)+s+1]&&o[r*(t.Ca+1)+s]!==o[r*(t.Ca+1)+s+1]&&(e[o[r*(t.Ca+1)+s]*t.Ec+o[r*(t.Ca+1)+s+1]]=!0);if(0>i)for(s=t.Ca;0<s;s--)-1!==o[r*(t.Ca+1)+s]&&-1!==o[r*(t.Ca+1)+s-1]&&o[r*(t.Ca+1)+s]!==o[r*(t.Ca+1)+s-1]&&(e[o[r*(t.Ca+1)+s]*t.Ec+o[r*(t.Ca+1)+s-1]]=!0)}for(o=[],r=0;r<t.Ec;r++)o[r]=!0;for(s=[],s.push(0);0!==s.length;)if(h=s[s.length-1],s.pop(),o[h])for(o[h]=!1,r=0;r<t.Ec;r++)e[h*t.Ec+r]&&s.splice(0,0,r);if(0<i)for(n.reset();n.next();)t=n.value,o[t.component]&&--t.column;if(0>i)for(n.reset();n.next();)i=n.value,o[i.component]&&(i.column+=1)}function Zg(t,e){return 270===t.K?e?Oe:Be:90===t.K?e?Be:Oe:180===t.K?e?De:Fe:e?Fe:De}function Qg(t,e){var i=t.zb[e];if(i>=t.xe.length){for(var n=[],o=0;o<t.xe.length;o++)n[o]=t.xe[o];t.xe=n}for(void 0===t.xe[i]||null===t.xe[i]?n=[]:(n=t.xe[i],t.xe[i]=null),t=t.gp[e],e=0;e<t.length;e++)i=t[e],n[i.index]=i;return n}function ty(t,e,i){t.xe[t.zb[e]]=i}Tp.className="CircularLayout",Tp.ConstantSpacing=Gp,Tp.ConstantDistance=Yp,Tp.ConstantAngle=Xp,Tp.Packed=qp,Tp.Clockwise=Up,Tp.Counterclockwise=Kp,Tp.BidirectionalLeft=Hp,Tp.BidirectionalRight=_p,Tp.Forwards=Wp,Tp.Reverse=$p,Tp.Ascending=Jp,Tp.Descending=Zp,Tp.Optimized=Qp,Tp.Pythagorean=tg,Tp.Circular=eg,ig.prototype.compare=function(t,e){if(0<t&&0>this.Am||Math.abs(t)<Math.abs(this.Am)&&!(0>t&&0<this.Am))for(this.Am=t,this.Wk=[],this.cn=[],t=0;t<e.length;t++)this.Wk[t]=e[t].bounds.x,this.cn[t]=e[t].bounds.y},ig.prototype.commit=function(t){if(null!==this.Wk&&null!==this.cn)for(var e=0;e<this.Wk.length;e++){var i=t.J(e);i.x=this.Wk[e],i.y=this.cn[e]}},ig.className="VertexArrangement",f(ng,Qf),ng.prototype.createVertex=function(){return new og(this)},ng.prototype.createEdge=function(){return new sg(this)},ng.className="CircularNetwork",f(og,rd),d.Object.defineProperties(og.prototype,{diameter:{get:function(){return this.Gj},set:function(t){this.Gj!==t&&(this.Gj=t)}},actualAngle:{get:function(){return this.I},set:function(t){this.I!==t&&(this.I=t)}}}),og.className="CircularVertex",f(sg,ad),sg.className="CircularEdge",f(ag,zf),ag.prototype.cloneProtected=function(t){zf.prototype.cloneProtected.call(this,t),t.Pd.assign(this.Pd),t.on=this.on,t.kf=this.kf,t.jd=this.jd,t.Rl=this.Rl,t.Xn=this.Xn,t.Xf=this.Xf,t.bp=this.bp,t.Bp=this.Bp,t.ol=this.ol,t.nl=this.nl,t.ll=this.ll,t.ml=this.ml,t.On=this.On,t.Nn=this.Nn},ag.prototype.serializeLayoutProperties=function(t,e){zf.prototype.serializeLayoutProperties.call(this,t,e),t.arrangementSpacing={width:this.arrangementSpacing.width,height:this.arrangementSpacing.height},t.arrangesToOrigin=this.arrangesToOrigin,t.setsPortSpots=this.setsPortSpots,t.comments=this.comments,t.maxIterations=this.maxIterations,t.epsilonDistance=this.epsilonDistance,t.infinityDistance=this.infinityDistance,t.moveLimit=this.moveLimit,t.defaultSpringStiffness=this.defaultSpringStiffness,t.defaultSpringLength=this.defaultSpringLength,t.defaultElectricalCharge=this.defaultElectricalCharge,t.defaultGravitationalMass=this.defaultGravitationalMass,t.defaultCommentSpringLength=this.defaultCommentSpringLength,t.defaultCommentElectricalCharge=this.defaultCommentElectricalCharge},ag.prototype.deserializeLayoutProperties=function(t,e,i,n,o){zf.prototype.deserializeLayoutProperties.call(this,t,e,i,n,o),this.arrangementSpacing=new Bt(t.arrangementSpacing.width,t.arrangementSpacing.height),this.arrangesToOrigin=t.arrangesToOrigin,this.setsPortSpots=t.setsPortSpots,this.comments=t.comments,this.maxIterations=t.maxIterations,this.epsilonDistance=t.epsilonDistance,this.infinityDistance=t.infinityDistance,this.moveLimit=t.moveLimit,this.defaultSpringStiffness=t.defaultSpringStiffness,this.defaultSpringLength=t.defaultSpringLength,this.defaultElectricalCharge=t.defaultElectricalCharge,this.defaultGravitationalMass=t.defaultGravitationalMass,this.defaultCommentSpringLength=t.defaultCommentSpringLength,this.defaultCommentElectricalCharge=t.defaultCommentElectricalCharge},ag.prototype.createNetwork=function(){return new vg(this)},ag.prototype.doLayout=function(t){if(null===this.network&&(this.network=this.makeNetwork(t)),!this.Uw()){if(t=this.maxIterations,0<this.network.vertexes.count){this.network.Bq();for(var e=this.network.vertexes.iterator;e.next();){var i=e.value;i.charge=this.electricalCharge(i),i.mass=this.gravitationalMass(i)}for(e=this.network.edges.iterator;e.next();)i=e.value,i.stiffness=this.springStiffness(i),i.length=this.springLength(i);if(this.Fv(),this.Eo=0,this.needsClusterLayout()){e=this.network,i=e.Xy();for(var n=i.iterator;n.next();){this.network=n.value;for(var o=this.network.vertexes.iterator;o.next();){var r=o.value;r.Ld=r.vertexes.count,r.Sh=1,r.qk=null,r.Ne=null}hg(this,0,t)}this.network=e;var s=n=i.iterator;n=this.arrangementSpacing;var a=s.count,h=!0;r=o=0;for(var l=j(),u=0;u<a+e.vertexes.count+2;u++)l[u]=null;a=0,s.reset();for(var c=zt.alloc();s.next();)if(u=s.value,this.computeBounds(u,c),h)h=!1,o=c.x+c.width/2,r=c.y+c.height/2,l[0]=new pt(c.x+c.width+n.width,c.y),l[1]=new pt(c.x,c.y+c.height+n.height),a=2;else{var f=dg(l,a,o,r,c.width,c.height,n),d=l[f],p=new pt(d.x+c.width+n.width,d.y),g=new pt(d.x,d.y+c.height+n.height);for(f+1<a&&l.splice(f+1,0,null),l[f]=p,l[f+1]=g,a++,f=d.x-c.x,d=d.y-c.y,u=u.vertexes.iterator;u.next();)p=u.value,p.centerX+=f,p.centerY+=d}for(zt.free(c),u=e.vertexes.iterator;u.next();)s=u.value,f=s.bounds,2>a?(o=f.x+f.width/2,r=f.y+f.height/2,l[0]=new pt(f.x+f.width+n.width,f.y),l[1]=new pt(f.x,f.y+f.height+n.height),a=2):(h=dg(l,a,o,r,f.width,f.height,n),c=l[h],d=new pt(c.x+f.width+n.width,c.y),f=new pt(c.x,c.y+f.height+n.height),h+1<a&&l.splice(h+1,0,null),l[h]=d,l[h+1]=f,a++,s.centerX=c.x+s.width/2,s.centerY=c.y+s.height/2);for(O(l),n=i.iterator;n.next();){for(i=n.value,o=i.vertexes.iterator;o.next();)e.Bg(o.value);for(i=i.edges.iterator;i.next();)e.tm(i.value)}}gg(this,t),this.updateParts()}this.Rl=t,this.network=null,this.isValidLayout=!0}},ag.prototype.needsClusterLayout=function(){if(3>this.network.vertexes.count)return!1;for(var t=0,e=0,i=this.network.vertexes.first().bounds,n=this.network.vertexes.iterator;n.next();){if(n.value.bounds.Mc(i)&&(t++,2<t))return!0;if(10<e)break;e++}return!1},ag.prototype.computeBounds=function(t,e){var i=!0;for(t=t.vertexes.iterator;t.next();){var n=t.value;i?(i=!1,e.set(n.bounds)):e.Rc(n.bounds)}return e},ag.prototype.Fv=function(){if(this.comments)for(var t=this.network.vertexes.iterator;t.next();)this.addComments(t.value)},ag.prototype.addComments=function(t){var e=t.node;if(null!==e)for(e=e.Sv();e.next();){var i=e.value;if("Comment"===i.category&&i.isVisible()){var n=this.network.kj(i);null===n&&(n=this.network.mk(i)),n.charge=this.defaultCommentElectricalCharge,i=null;for(var o=n.destinationEdges;o.next();){var r=o.value;if(r.toVertex===t){i=r;break}}if(null===i)for(o=n.sourceEdges;o.next();)if(r=o.value,r.fromVertex===t){i=r;break}null===i&&(i=this.network.Fk(t,n,null)),i.length=this.defaultCommentSpringLength}}},ag.prototype.moveVertex=function(t){var e=t.forceX,i=t.forceY,n=this.moveLimit;return e<-n?e=-n:e>n&&(e=n),i<-n?i=-n:i>n&&(i=n),t.centerX+=e,t.centerY+=i,e*e+i*i},ag.prototype.moveFixedVertex=function(){},ag.prototype.commitLayout=function(){this.Dw(),this.commitNodes(),this.isRouting&&this.commitLinks()},ag.prototype.Dw=function(){if(this.setsPortSpots)for(var t=this.network.edges.iterator;t.next();){var e=t.value.link;null!==e&&(e.fromSpot=Ce,e.toSpot=Ce)}},ag.prototype.commitNodes=function(){var t=0,e=0;if(this.arrangesToOrigin){var i=zt.alloc();this.computeBounds(this.network,i),e=this.arrangementOrigin,t=e.x-i.x,e=e.y-i.y,zt.free(i)}i=zt.alloc();for(var n=this.network.vertexes.iterator;n.next();){var o=n.value;0===t&&0===e||(i.assign(o.bounds),i.x+=t,i.y+=e,o.bounds=i),o.commit()}zt.free(i)},ag.prototype.commitLinks=function(){for(var t=this.network.edges.iterator;t.next();)t.value.commit()},ag.prototype.springStiffness=function(t){return t=t.stiffness,isNaN(t)?this.ol:t},ag.prototype.springLength=function(t){return t=t.length,isNaN(t)?this.nl:t},ag.prototype.electricalCharge=function(t){return t=t.charge,isNaN(t)?this.ll:t},ag.prototype.electricalFieldX=function(){return 0},ag.prototype.electricalFieldY=function(){return 0},ag.prototype.gravitationalMass=function(t){return t=t.mass,isNaN(t)?this.ml:t},ag.prototype.gravitationalFieldX=function(){return 0},ag.prototype.gravitationalFieldY=function(){return 0},ag.prototype.isFixed=function(t){return t.isFixed},d.Object.defineProperties(ag.prototype,{currentIteration:{get:function(){return this.Eo}},arrangementSpacing:{get:function(){return this.Pd},set:function(t){this.Pd.w(t)||(this.Pd.assign(t),this.B())}},arrangesToOrigin:{get:function(){return this.on},set:function(t){this.on!==t&&(this.on=t,this.B())}},setsPortSpots:{get:function(){return this.kf},set:function(t){this.kf!==t&&(this.kf=t,this.B())}},comments:{get:function(){return this.jd},set:function(t){this.jd!==t&&(this.jd=t,this.B())}},maxIterations:{get:function(){return this.Rl},set:function(t){this.Rl!==t&&0<=t&&(this.Rl=t,this.B())}},epsilonDistance:{get:function(){return this.Xn},set:function(t){this.Xn!==t&&0<t&&(this.Xn=t,this.B())}},infinityDistance:{get:function(){return this.Xf},set:function(t){this.Xf!==t&&1<t&&(this.Xf=t,this.B())}},moveLimit:{get:function(){return this.bp},set:function(t){this.bp!==t&&1<t&&(this.bp=t,this.B())}},randomNumberGenerator:{get:function(){return this.Bp},set:function(t){this.Bp!==t&&(null!==t&&"function"!==typeof t.random&&w('ForceDirectedLayout.randomNumberGenerator must have a "random()" function on it: '+t),this.Bp=t)}},defaultSpringStiffness:{get:function(){return this.ol},set:function(t){this.ol!==t&&(this.ol=t,this.B())}},defaultSpringLength:{get:function(){return this.nl},set:function(t){this.nl!==t&&(this.nl=t,this.B())}},defaultElectricalCharge:{get:function(){return this.ll},set:function(t){this.ll!==t&&(this.ll=t,this.B())}},defaultGravitationalMass:{get:function(){return this.ml},set:function(t){this.ml!==t&&(this.ml=t,this.B())}},defaultCommentSpringLength:{get:function(){return this.On},set:function(t){this.On!==t&&(this.On=t,this.B())}},defaultCommentElectricalCharge:{get:function(){return this.Nn},set:function(t){this.Nn!==t&&(this.Nn=t,this.B())}}}),ag.className="ForceDirectedLayout",mg.className="ForceDirectedSubnet",f(vg,Qf),vg.prototype.createVertex=function(){return new xg(this)},vg.prototype.createEdge=function(){return new bg(this)},vg.className="ForceDirectedNetwork",f(xg,rd),xg.prototype.serializeVertexProperties=function(t,e){rd.prototype.serializeVertexProperties.call(this,t,e),t.isFixed=this.isFixed,t.charge=this.charge,t.mass=this.mass},xg.prototype.Cq=function(t,e,i,n){rd.prototype.Cq.call(this,t,e,i,n),this.isFixed=t.isFixed,this.charge=t.charge,this.mass=t.mass},d.Object.defineProperties(xg.prototype,{isFixed:{get:function(){return this.La},set:function(t){this.La!==t&&(this.La=t)}},charge:{get:function(){return this.I},set:function(t){this.I!==t&&(this.I=t)}},mass:{get:function(){return this.eb},set:function(t){this.eb!==t&&(this.eb=t)}},forceX:{get:function(){return this.T},set:function(t){this.T!==t&&(this.T=t)}},forceY:{get:function(){return this.Ka},set:function(t){this.Ka!==t&&(this.Ka=t)}}}),xg.className="ForceDirectedVertex",f(bg,ad),bg.prototype.serializeEdgeProperties=function(t,e){ad.prototype.serializeEdgeProperties.call(this,t,e),t.stiffness=this.stiffness,t.length=this.length},bg.prototype.deserializeEdgeProperties=function(t,e,i,n){ad.prototype.deserializeEdgeProperties.call(this,t,e,i,n),this.stiffness=t.stiffness,this.length=t.length},d.Object.defineProperties(bg.prototype,{stiffness:{get:function(){return this.u},set:function(t){this.u!==t&&(this.u=t)}},length:{get:function(){return this.l},set:function(t){this.l!==t&&(this.l=t)}}}),bg.className="ForceDirectedEdge",wg.prototype.random=function(){var t=this.seed%this.Q*this.Zy-this.seed/this.Q*this.bz;return this.seed=0<t?t:t+this.az,this.seed*this.$y},wg.className="RandomNumberGenerator",f(kg,zf),kg.prototype.cloneProtected=function(t){zf.prototype.cloneProtected.call(this,t),t.ue=this.ue,t.Zb=this.Zb,t.K=this.K,t.jl=this.jl,t.Ml=this.Ml,t.Bl=this.Bl,t.Rj=this.Rj,t.Zk=this.Zk,t.ng=this.ng,t.kf=this.kf,t.Mo=this.Mo},kg.prototype.serializeLayoutProperties=function(t,e){zf.prototype.serializeLayoutProperties.call(this,t,e),t.layerSpacing=this.layerSpacing,t.columnSpacing=this.columnSpacing,t.direction=this.direction,t.cycleRemoveOption=this.cycleRemoveOption.name,t.layeringOption=this.layeringOption.name,t.initializeOption=this.initializeOption.name,t.iterations=this.iterations,t.aggressiveOption=this.aggressiveOption.name,t.packOption=this.packOption,t.setsPortSpots=this.setsPortSpots,t.linkSpacing=this.linkSpacing,t.sa=this.sa,t.Ji=this.Ji,t.Ca=this.Ca,t.mh=this.mh,t.pc=this.pc,t.zb=this.zb,t.oh=this.oh,t.Ec=this.Ec,t.Vc={x:this.Vc.x,y:this.Vc.y}},kg.prototype.deserializeLayoutProperties=function(t,e,i,n,o){zf.prototype.deserializeLayoutProperties.call(this,t,e,i,n,o),this.layerSpacing=t.layerSpacing,this.columnSpacing=t.columnSpacing,this.direction=t.direction,this.cycleRemoveOption=K(kg,t.cycleRemoveOption),this.layeringOption=K(kg,t.layeringOption),this.initializeOption=K(kg,t.initializeOption),this.iterations=t.iterations,this.aggressiveOption=K(kg,t.aggressiveOption),this.packOption=t.packOption,this.setsPortSpots=t.setsPortSpots,this.linkSpacing=t.linkSpacing,this.sa=t.sa,this.Ji=t.Ji,this.Ca=t.Ca,this.mh=t.mh,this.pc=t.pc,this.zb=t.zb,this.oh=t.oh,this.Ec=t.Ec,this.Vc=new pt(this.Vc.x,this.Vc.y),o&&!n&&o.edges.each((function(t){if(!t.link&&t.fromVertex&&t.toVertex&&(null===t.fromVertex.node||null===t.toVertex.node)){for(var e=t.fromVertex;null!==e&&null===e.node&&0<e.td.count;){var i=e.td.J(0);if(i.link){t.link=i.link;break}e=i.fromVertex}if(!t.link){for(i=t.toVertex;null!==i&&null===i.node&&0<i.Gd.count;){var n=i.Gd.J(0);if(n.link){t.link=n.link;break}i=n.toVertex}if(!t.link)for(i=i.td.iterator;i.next();)if(n=i.value,n.link&&n.fromVertex===e){t.link=n.link;break}}}}))},kg.prototype.jb=function(t){t.classType===kg?0===t.name.indexOf("Aggressive")?this.aggressiveOption=t:0===t.name.indexOf("Cycle")?this.cycleRemoveOption=t:0===t.name.indexOf("Init")?this.initializeOption=t:0===t.name.indexOf("Layer")?this.layeringOption=t:w("Unknown enum value: "+t):zf.prototype.jb.call(this,t)},kg.prototype.createNetwork=function(){return new gy(this)},kg.prototype.doLayout=function(t){for(null===this.network&&(this.network=this.makeNetwork(t)),this.arrangementOrigin=this.initialOrigin(this.arrangementOrigin),this.Ji=-1,this.pc=this.mh=0,this.gp=this.fp=this.Wj=null,t=0;t<this.xe.length;t++)this.xe[t]=null;if(0<this.network.vertexes.count){if(this.network.Bq(),this.Uw())return;for(this.cycleRemoveOption!==ny&&this.removeCycles(),t=this.network.vertexes.iterator;t.next();)t.value.layer=-1;for(this.sa=-1,this.assignLayers(),t.reset();t.next();)this.sa=Math.max(this.sa,t.value.layer);this.cycleRemoveOption===ny&&this.removeCycles(),t=this.network;for(var e=[],i=t.edges.iterator;i.next();){var n=i.value;n.valid=!1,e.push(n)}for(i=0;i<e.length;i++){n=e[i];var o=n.fromVertex,r=n.toVertex;if(!(n.valid||(null===o.node&&null===o.data||null===r.node&&null===r.data)&&o.layer===r.layer)){var s=0,a=0,h=0,l=0;if(null!==n.link){if(a=n.link,null===a)continue;var u=o.node;if(s=r.node,null===u||null===s)continue;var c=a.fromNode;h=a.toNode;var f=a.fromPort;if(a=a.toPort,n.rev){l=c;var d=f;c=h,f=a,h=l,a=d}var p=o.focus;l=r.focus;var g=n.rev?r.bounds:o.bounds;d=pt.alloc(),u!==c?g.s()&&c.isVisible()?c.actualBounds.s()?(c.Df(f,ae,d),d.x+=c.actualBounds.x-g.x,d.y+=c.actualBounds.y-g.y):(c.Df(f,ae,d),d.s()||d.assign(p)):d.assign(p):g.s()?(c.Df(f,ae,d),d.s()||d.assign(p)):d.assign(p),c=n.rev?o.bounds:r.bounds,u=pt.alloc(),s!==h?c.s()&&h.isVisible()?h.actualBounds.s()?(h.Df(a,ae,u),u.x+=h.actualBounds.x-c.x,u.y+=h.actualBounds.y-c.y):(h.Df(a,ae,u),u.s()||u.assign(l)):u.assign(l):c.s()?(h.Df(a,ae,u),u.s()||u.assign(l)):u.assign(l),90===this.K||270===this.K?(s=Math.round((d.x-p.x)/this.Zb),h=d.x,a=Math.round((u.x-l.x)/this.Zb),l=u.x):(s=Math.round((d.y-p.y)/this.Zb),h=d.y,a=Math.round((u.y-l.y)/this.Zb),l=u.y),pt.free(d),pt.free(u),n.portFromColOffset=s,n.portFromPos=h,n.portToColOffset=a,n.portToPos=l}else n.portFromColOffset=0,n.portFromPos=0,n.portToColOffset=0,n.portToPos=0;if(d=o.layer,u=r.layer,c=0,g=n.link,null!==g){var y=g.fromPort,m=g.toPort;if(null!==y&&null!==m){var v=g.fromNode;if(f=g.toNode,null!==v&&null!==f){var x=Zg(this,!0),b=Zg(this,!1),w=this.setsPortSpots?x:g.computeSpot(!0,y);p=this.setsPortSpots?b:g.computeSpot(!1,m);var k=g.isOrthogonal;w.Oc()&&w.Ef(b)&&p.Oc()&&p.Ef(x)?c=0:(x=g.getLinkPoint(v,y,w,!0,k,f,m,pt.alloc()),b=g.getLinkDirection(v,y,x,w,!0,k,f,m),pt.free(x),w.Vt()||b!==Vg(this,n,!0)?this.setsPortSpots&&null!==v&&1===v.ports.count&&n.rev&&(c+=1):c+=1,w=g.getLinkPoint(f,m,p,!1,k,v,y,pt.alloc()),g=g.getLinkDirection(f,m,w,p,!1,k,v,y),pt.free(w),p.Vt()||g!==Vg(this,n,!1)?this.setsPortSpots&&null!==f&&1===f.ports.count&&n.rev&&(c+=2):c+=2)}}}if(f=c,c=1===f||3===f,(f=2===f||3===f)&&(p=t.createVertex(),p.node=null,p.wf=1,p.layer=d,p.near=o,t.Bg(p),o=t.Fk(o,p,n.link),o.valid=!1,o.rev=n.rev,o.portFromColOffset=s,o.portToColOffset=0,o.portFromPos=h,o.portToPos=0,o=p),g=1,c&&g--,d-u>g&&0<d){for(n.valid=!1,p=t.createVertex(),p.node=null,p.wf=2,p.layer=d-1,t.Bg(p),o=t.Fk(o,p,n.link),o.valid=!0,o.rev=n.rev,o.portFromColOffset=f?0:s,o.portToColOffset=0,o.portFromPos=f?0:h,o.portToPos=0,o=p,d--;d-u>g&&0<d;)p=t.createVertex(),p.node=null,p.wf=3,p.layer=d-1,t.Bg(p),o=t.Fk(o,p,n.link),o.valid=!0,o.rev=n.rev,o.portFromColOffset=0,o.portToColOffset=0,o.portFromPos=0,o.portToPos=0,o=p,d--;o=t.Fk(p,r,n.link),o.valid=!c,c&&(p.near=r),o.rev=n.rev,o.portFromColOffset=0,o.portToColOffset=a,o.portFromPos=0,o.portToPos=l}else n.valid=!0}}for(t=this.zb=[],e=0;e<=this.sa;e++)t[e]=0;for(e=this.network.vertexes.iterator;e.next();)e.value.index=-1;for(this.initializeIndices(),this.Ji=-1,i=this.pc=this.mh=0;i<=this.sa;i++)t[i]>t[this.pc]&&(this.Ji=t[i]-1,this.pc=i),t[i]<t[this.mh]&&(this.mh=i);for(this.gp=[],i=0;i<t.length;i++)this.gp[i]=[];for(e.reset();e.next();)t=e.value,this.gp[t.layer][t.index]=t;for(this.Ca=-1,t=0;t<=this.sa;t++){for(e=Qg(this,t),i=0,n=this.zb[t],r=0;r<n;r++)o=e[r],i+=this.nodeMinColumnSpace(o,!0),o.column=i,i+=1,i+=this.nodeMinColumnSpace(o,!1);this.Ca=Math.max(this.Ca,i-1),ty(this,t,e)}this.reduceCrossings(),this.straightenAndPack(),this.updateParts()}this.network=null,this.isValidLayout=!0},kg.prototype.linkMinLength=function(){return 1},kg.prototype.nodeMinLayerSpace=function(t,e){return null===t.node&&null===t.data?0:90===this.K||270===this.K?e?t.focus.y+10:t.bounds.height-t.focus.y+10:e?t.focus.x+10:t.bounds.width-t.focus.x+10},kg.prototype.nodeMinColumnSpace=function(t,e){if(null===t.node&&null===t.data)return 0;var i=e?t.Nk:t.Mk;return null!==i?i:(i=this.K,90===i||270===i?e?t.Nk=t.focus.x/this.Zb+1|0:t.Mk=(t.bounds.width-t.focus.x)/this.Zb+1|0:e?t.Nk=t.focus.y/this.Zb+1|0:t.Mk=(t.bounds.height-t.focus.y)/this.Zb+1|0)},kg.prototype.countCrossings=function(){for(var t=0,e=0;e<=this.sa;e++)for(var i=Ng(this,e,1),n=this.zb[e],o=0;o<n;o++)for(var r=o;r<n;r++)t+=i[o*n+r];return t},kg.prototype.normalize=function(){var t=1/0;this.Ca=-1;for(var e=this.network.vertexes.iterator;e.next();){var i=e.value;t=Math.min(t,i.column-this.nodeMinColumnSpace(i,!0)),this.Ca=Math.max(this.Ca,i.column+this.nodeMinColumnSpace(i,!1))}for(e.reset();e.next();)e.value.column-=t;this.Ca-=t},kg.prototype.removeCycles=function(){for(var t=this.network.edges.iterator;t.next();)t.value.rev=!1;switch(this.jl){default:case iy:t=this.network;var e=0,i=t.vertexes.count-1,n=[];n.length=i+1;for(var o=t.vertexes.iterator;o.next();)o.value.valid=!0;for(;null!==Og(t);){for(o=Dg(t);null!==o;)n[i]=o,i--,o.valid=!1,o=Dg(t);for(o=Fg(t);null!==o;)n[e]=o,e++,o.valid=!1,o=Fg(t);o=null;for(var r=0,s=this.network.vertexes.iterator;s.next();){var a=s.value;if(a.valid){for(var h=0,l=a.destinationEdges;l.next();)l.value.toVertex.valid&&h++;l=0;for(var u=a.sourceEdges;u.next();)u.value.fromVertex.valid&&l++;(null===o||r<h-l)&&(o=a,r=h-l)}}null!==o&&(n[e]=o,e++,o.valid=!1)}for(e=0;e<t.vertexes.count;e++)n[e].index=e;for(n=t.edges.iterator;n.next();)e=n.value,e.fromVertex.index>e.toVertex.index&&(t.Rm(e),e.rev=!0);break;case ey:for(n=this.network.vertexes.iterator;n.next();)t=n.value,t.Cg=-1,t.finish=-1;for(t=this.network.edges.iterator;t.next();)t.value.forest=!1;for(this.oh=0,n.reset();n.next();)e=n.value,0===e.sourceEdges.count&&Bg(this,e);for(n.reset();n.next();)e=n.value,-1===e.Cg&&Bg(this,e);for(t.reset();t.next();)n=t.value,n.forest||(e=n.fromVertex,i=e.finish,o=n.toVertex,r=o.finish,o.Cg<e.Cg&&i<r&&(this.network.Rm(n),n.rev=!0));break;case ny:for(t=this.network,e=t.vertexes.iterator,n=1/0;e.next();)n=Math.min(n,e.value.layer);if(1/0>n){if(0>n)for(e.reset();e.next();)e.value.layer-=n;for(n=[],e.reset();e.next();)i=e.value,o=n[i.layer],void 0===o?n[i.layer]=[i]:o.push(i);for(i=e=0;i<n.length;i++)if(o=n[i],o&&0!==o.length){if(0<i)for(r=0;r<o.length;r++)o[r].layer-=e}else e++;for(n=t.edges.iterator;n.next();)e=n.value,e.fromVertex.layer<e.toVertex.layer&&(t.Rm(e),e.rev=!0)}}},kg.prototype.assignLayers=function(){switch(this.Ml){case ry:Ig(this);break;case sy:for(var t,e=this.network.vertexes.iterator;e.next();)t=Rg(this,e.value),this.sa=Math.max(t,this.sa);for(e.reset();e.next();)t=e.value,t.layer=this.sa-t.layer;break;default:case oy:for(Ig(this),e=this.network.vertexes.iterator;e.next();)e.value.valid=!1;for(e.reset();e.next();)t=e.value,0===t.sourceEdges.count&&zg(this,t);for(t=1/0,e.reset();e.next();)t=Math.min(t,e.value.layer);for(this.sa=-1,e.reset();e.next();){var i=e.value;i.layer-=t,this.sa=Math.max(this.sa,i.layer)}}},kg.prototype.initializeIndices=function(){switch(this.Bl){default:case ly:for(var t=this.network.vertexes.iterator;t.next();){var e=t.value,i=e.layer;e.index=this.zb[i],this.zb[i]++}break;case ay:for(t=this.network.vertexes.iterator,e=this.sa;0<=e;e--)for(t.reset();t.next();)i=t.value,i.layer===e&&-1===i.index&&Gg(this,i);break;case hy:for(t=this.network.vertexes.iterator,e=0;e<=this.sa;e++)for(t.reset();t.next();)i=t.value,i.layer===e&&-1===i.index&&Yg(this,i)}},kg.prototype.reduceCrossings=function(){var t,e,i,n,o,r=this.countCrossings(),s=Sg(this);for(t=0;t<this.Rj;t++){for(e=0;e<=this.sa;e++)Xg(this,e,1),qg(this,e,1);var a=this.countCrossings();for(a<r&&(r=a,s=Sg(this)),e=this.sa;0<=e;e--)Xg(this,e,-1),qg(this,e,-1);a=this.countCrossings(),a<r&&(r=a,s=Sg(this))}for(Pg(this,s),t=0;t<this.Rj;t++){for(e=0;e<=this.sa;e++)Xg(this,e,0),qg(this,e,0);for(a=this.countCrossings(),a<r&&(r=a,s=Sg(this)),e=this.sa;0<=e;e--)Xg(this,e,0),qg(this,e,0);a=this.countCrossings(),a<r&&(r=a,s=Sg(this))}switch(Pg(this,s),this.Zk){case uy:break;case fy:for(o=r+1;(e=this.countCrossings())<o;)for(o=e,t=this.sa;0<=t;t--)for(n=0;n<=t;n++){for(i=!0;i;)for(i=!1,e=t;e>=n;e--)i=qg(this,e,-1)||i;for(a=this.countCrossings(),a>=r?Pg(this,s):(r=a,s=Sg(this)),i=!0;i;)for(i=!1,e=t;e>=n;e--)i=qg(this,e,1)||i;for(a=this.countCrossings(),a>=r?Pg(this,s):(r=a,s=Sg(this)),i=!0;i;)for(i=!1,e=n;e<=t;e++)i=qg(this,e,1)||i;for(a>=r?Pg(this,s):(r=a,s=Sg(this)),i=!0;i;)for(i=!1,e=n;e<=t;e++)i=qg(this,e,-1)||i;for(a>=r?Pg(this,s):(r=a,s=Sg(this)),i=!0;i;)for(i=!1,e=t;e>=n;e--)i=qg(this,e,0)||i;for(a>=r?Pg(this,s):(r=a,s=Sg(this)),i=!0;i;)for(i=!1,e=n;e<=t;e++)i=qg(this,e,0)||i;a>=r?Pg(this,s):(r=a,s=Sg(this))}break;default:case cy:for(t=this.sa,n=0,o=r+1;(e=this.countCrossings())<o;){for(o=e,i=!0;i;)for(i=!1,e=t;e>=n;e--)i=qg(this,e,-1)||i;for(a=this.countCrossings(),a>=r?Pg(this,s):(r=a,s=Sg(this)),i=!0;i;)for(i=!1,e=t;e>=n;e--)i=qg(this,e,1)||i;for(a=this.countCrossings(),a>=r?Pg(this,s):(r=a,s=Sg(this)),i=!0;i;)for(i=!1,e=n;e<=t;e++)i=qg(this,e,1)||i;for(a>=r?Pg(this,s):(r=a,s=Sg(this)),i=!0;i;)for(i=!1,e=n;e<=t;e++)i=qg(this,e,-1)||i;for(a>=r?Pg(this,s):(r=a,s=Sg(this)),i=!0;i;)for(i=!1,e=t;e>=n;e--)i=qg(this,e,0)||i;for(a>=r?Pg(this,s):(r=a,s=Sg(this)),i=!0;i;)for(i=!1,e=n;e<=t;e++)i=qg(this,e,0)||i;a>=r?Pg(this,s):(r=a,s=Sg(this))}}Pg(this,s)},kg.prototype.straightenAndPack=function(){var t=0!==(1&this.ng),e=0!==(this.ng&dy);if(1e3<this.network.edges.count&&e&&(t=!1),t){var i=[];for(e=0;e<=this.sa;e++)i[e]=0;for(var n,o=this.network.vertexes.iterator;o.next();){var r=o.value;e=r.layer,n=r.column,r=this.nodeMinColumnSpace(r,!1),i[e]=Math.max(i[e],n+r)}for(o.reset();o.next();)r=o.value,e=r.layer,n=r.column,r.column=(8*(this.Ca-i[e])>>1)+8*n;this.Ca*=8}if(0!==(2&this.ng))for(i=!0;i;){for(i=!1,e=this.pc+1;e<=this.sa;e++)i=Ug(this,e,1)||i;for(e=this.pc-1;0<=e;e--)i=Ug(this,e,-1)||i;i=Ug(this,this.pc,0)||i}if(0!==(4&this.ng)){for(e=this.pc+1;e<=this.sa;e++)Hg(this,e,1);for(e=this.pc-1;0<=e;e--)Hg(this,e,-1);Hg(this,this.pc,0)}if(t&&($g(this,-1),$g(this,1)),0!==(2&this.ng))for(i=!0;i;){for(i=!1,i=Ug(this,this.pc,0)||i,e=this.pc+1;e<=this.sa;e++)i=Ug(this,e,0)||i;for(e=this.pc-1;0<=e;e--)i=Ug(this,e,0)||i}},kg.prototype.commitLayout=function(){if(this.setsPortSpots)for(var t=Zg(this,!0),e=Zg(this,!1),i=this.network.edges.iterator;i.next();){var n=i.value.link;null!==n&&(n.fromSpot=t,n.toSpot=e)}this.commitNodes(),this.Iv(),this.isRouting&&this.commitLinks()},kg.prototype.commitNodes=function(){this.$d=[],this.zd=[],this.yd=[],this.Ia=[];for(var t=0;t<=this.sa;t++)this.$d[t]=0,this.zd[t]=0,this.yd[t]=0,this.Ia[t]=0;for(t=this.network.vertexes.iterator;t.next();){var e=t.value,i=e.layer;this.$d[i]=Math.max(this.$d[i],this.nodeMinLayerSpace(e,!0)),this.zd[i]=Math.max(this.zd[i],this.nodeMinLayerSpace(e,!1))}e=0,i=this.ue;for(var n=0;n<=this.sa;n++){var o=i;0>=this.$d[n]+this.zd[n]&&(o=0),0<n&&(e+=o/2),90===this.K||0===this.K?(e+=this.zd[n],this.yd[n]=e,e+=this.$d[n]):(e+=this.$d[n],this.yd[n]=e,e+=this.zd[n]),n<this.sa&&(e+=o/2),this.Ia[n]=e}for(i=e,e=this.arrangementOrigin,n=0;n<=this.sa;n++)270===this.K?this.yd[n]=e.y+this.yd[n]:90===this.K?(this.yd[n]=e.y+i-this.yd[n],this.Ia[n]=i-this.Ia[n]):180===this.K?this.yd[n]=e.x+this.yd[n]:(this.yd[n]=e.x+i-this.yd[n],this.Ia[n]=i-this.Ia[n]);for(t.reset(),i=n=1/0;t.next();){o=t.value;var r=o.layer,s=0|o.column;if(270===this.K||90===this.K){var a=e.x+this.Zb*s;r=this.yd[r]}else a=this.yd[r],r=e.y+this.Zb*s;o.centerX=a,o.centerY=r,n=Math.min(o.x,n),i=Math.min(o.y,i)}for(n=e.x-n,e=e.y-i,this.Vc=new pt(n,e),t.reset();t.next();)i=t.value,i.x+=n,i.y+=e,i.commit()},kg.prototype.Iv=function(){for(var t=0,e=this.ue,i=0;i<=this.sa;i++)t+=this.$d[i],t+=this.zd[i];t+=this.sa*e,e=[],i=this.Zb*this.Ca;for(var n=this.maxLayer;0<=n;n--)270===this.K?0===n?e.push(new zt(0,0,i,Math.abs(this.Ia[0]))):e.push(new zt(0,this.Ia[n-1],i,Math.abs(this.Ia[n-1]-this.Ia[n]))):90===this.K?0===n?e.push(new zt(0,this.Ia[0],i,Math.abs(this.Ia[0]-t))):e.push(new zt(0,this.Ia[n],i,Math.abs(this.Ia[n-1]-this.Ia[n]))):180===this.K?0===n?e.push(new zt(0,0,Math.abs(this.Ia[0]),i)):e.push(new zt(this.Ia[n-1],0,Math.abs(this.Ia[n-1]-this.Ia[n]),i)):0===n?e.push(new zt(this.Ia[0],0,Math.abs(this.Ia[0]-t),i)):e.push(new zt(this.Ia[n],0,Math.abs(this.Ia[n-1]-this.Ia[n]),i));this.commitLayers(e,this.Vc)},kg.prototype.commitLayers=function(){},kg.prototype.commitLinks=function(){for(var t,e=this.network.edges.iterator;e.next();)t=e.value.link,null!==t&&(t.Th(),t.pk(),t.xf());for(e.reset();e.next();)t=e.value.link,null!==t&&t.xj();for(e.reset();e.next();){var i=e.value;if(t=i.link,null!==t){t.Th();var n=t,o=n.fromNode,r=n.toNode,s=n.fromPort,a=n.toPort;if(null!==o){var h=o.findVisibleNode();null!==h&&h!==o&&(o=h,s=h.port)}null!==r&&(h=r.findVisibleNode(),null!==h&&h!==r&&(r=h,a=h.port));var l=t.computeSpot(!0,s);h=t.computeSpot(!1,a);var u=i.fromVertex,c=i.toVertex;if(i.valid){if(t.curve===ef&&4===t.pointsCount)if(u.column===c.column)i=t.getLinkPoint(o,s,l,!0,!1,r,a),s=t.getLinkPoint(r,a,h,!1,!1,o,s),i.s()||i.set(o.actualBounds.center),s.s()||s.set(r.actualBounds.center),t.pk(),t.vf(i.x,i.y),t.vf((2*i.x+s.x)/3,(2*i.y+s.y)/3),t.vf((i.x+2*s.x)/3,(i.y+2*s.y)/3),t.vf(s.x,s.y);else{var f=!1,d=!1;if(null!==s&&l===ie&&(f=!0),null!==a&&h===ie&&(d=!0),f||d){var p=t.i(0).x;i=t.i(0).y,u=t.i(3).x,n=t.i(3).y,f&&(90===this.K||270===this.K?(f=p,c=(i+n)/2):(f=(p+u)/2,c=i),t.L(1,f,c),l=t.getLinkPoint(o,s,l,!0,!1,r,a),l.s()||l.set(o.actualBounds.center),t.L(0,l.x,l.y)),d&&(90===this.K||270===this.K?(l=u,i=(i+n)/2):(l=(p+u)/2,i=n),t.L(2,l,i),o=t.getLinkPoint(r,a,h,!1,!1,o,s),o.s()||o.set(r.actualBounds.center),t.L(3,o.x,o.y))}}t.xf()}else if(u.layer===c.layer)t.xf();else{if(f=d=!1,p=t.firstPickIndex+1,t.isOrthogonal){f=!0;var g=t.pointsCount;4<g&&t.points.removeRange(2,g-3)}else if(t.curve===ef)d=!0,g=t.pointsCount,4<g&&t.points.removeRange(2,g-3),4===g&&(p=2);else{g=t.pointsCount;var y=l===ie,m=h===ie;2<g&&y&&m?t.points.removeRange(1,g-2):3<g&&y&&!m?t.points.removeRange(1,g-3):3<g&&!y&&m?t.points.removeRange(2,g-2):4<g&&!y&&!m&&t.points.removeRange(2,g-3)}if(i.rev){for(;null!==c&&u!==c;){var v=g=null;for(y=c.sourceEdges.iterator;y.next()&&(m=y.value,m.link!==i.link||(g=m.fromVertex,v=m.toVertex,null!==g.node)););if(g!==u){y=t.i(p-1).x,m=t.i(p-1).y;var x=g.centerX,b=g.centerY;if(f)180===this.K||0===this.K?p===t.firstPickIndex+1?(t.m(p++,y,m),t.m(p++,y,b)):(null!==v?v.centerY:m)!==b&&(v=this.Ia[g.layer-1]+this.Vc.x,t.m(p++,v,m),t.m(p++,v,b)):p===t.firstPickIndex+1?(t.m(p++,y,m),t.m(p++,x,m)):(null!==v?v.centerX:y)!==x&&(v=this.Ia[g.layer-1]+this.Vc.y,t.m(p++,y,v),t.m(p++,x,v));else if(p===t.firstPickIndex+1){v=Math.max(10,this.$d[c.layer]);var w=Math.max(10,this.zd[c.layer]);if(d)180===this.K?x<=c.bounds.x?(c=c.bounds.x,t.m(p++,c-v,b),t.m(p++,c,b),t.m(p++,c+w,b)):(t.m(p++,x-v,b),t.m(p++,x,b),t.m(p++,x+w,b)):90===this.K?b>=c.bounds.bottom?(c=c.bounds.y+c.bounds.height,t.m(p++,x,c+w),t.m(p++,x,c),t.m(p++,x,c-v)):(t.m(p++,x,b+w),t.m(p++,x,b),t.m(p++,x,b-v)):270===this.K?b<=c.bounds.y?(c=c.bounds.y,t.m(p++,x,c-v),t.m(p++,x,c),t.m(p++,x,c+w)):(t.m(p++,x,b-v),t.m(p++,x,b),t.m(p++,x,b+w)):0===this.K&&(x>=c.bounds.right?(c=c.bounds.x+c.bounds.width,t.m(p++,c+w,b),t.m(p++,c,b),t.m(p++,c-v,b)):(t.m(p++,x+w,b),t.m(p++,x,b),t.m(p++,x-v,b)));else{t.m(p++,y,m);var k=0;180===this.K||0===this.K?((180===this.K?x>=c.bounds.right:x<=c.bounds.x)&&(k=(0===this.K?-v:w)/2),t.m(p++,y+k,b)):((270===this.K?b>=c.bounds.bottom:b<=c.bounds.y)&&(k=(90===this.K?-v:w)/2),t.m(p++,x,m+k)),t.m(p++,x,b)}}else v=Math.max(10,this.$d[g.layer]),w=Math.max(10,this.zd[g.layer]),180===this.K?(d&&t.m(p++,x-v,b),t.m(p++,x,b),d&&t.m(p++,x+w,b)):90===this.K?(d&&t.m(p++,x,b+w),t.m(p++,x,b),d&&t.m(p++,x,b-v)):270===this.K?(d&&t.m(p++,x,b-v),t.m(p++,x,b),d&&t.m(p++,x,b+w)):(d&&t.m(p++,x+w,b),t.m(p++,x,b),d&&t.m(p++,x-v,b))}c=g}(null===a||l!==ie||f)&&(y=t.i(p-1).x,m=t.i(p-1).y,x=t.i(p).x,b=t.i(p).y,f?(c=this.zd[u.layer],180===this.K||0===this.K?(f=m,f>=u.bounds.y&&f<=u.bounds.bottom&&(180===this.K?x>=u.bounds.x:x<=u.bounds.right)&&(c=u.centerX+(180===this.K?-c:c),f=f<u.bounds.y+u.bounds.height/2?u.bounds.y-this.Zb/2:u.bounds.bottom+this.Zb/2,t.m(p++,c,m),t.m(p++,c,f)),t.m(p++,x,f)):(f=y,f>=u.bounds.x&&f<=u.bounds.right&&(270===this.K?b>=u.bounds.y:b<=u.bounds.bottom)&&(c=u.centerY+(270===this.K?-c:c),f=f<u.bounds.x+u.bounds.width/2?u.bounds.x-this.Zb/2:u.bounds.right+this.Zb/2,t.m(p++,y,c),t.m(p++,f,c)),t.m(p++,f,b)),t.m(p++,x,b)):d?(v=Math.max(10,this.$d[u.layer]),w=Math.max(10,this.zd[u.layer]),180===this.K&&x>=u.bounds.x?(c=u.bounds.x+u.bounds.width,t.L(p-2,c,m),t.L(p-1,c+w,m)):90===this.K&&b<=u.bounds.bottom?(c=u.bounds.y,t.L(p-2,y,c),t.L(p-1,y,c-v)):270===this.K&&b>=u.bounds.y?(c=u.bounds.y+u.bounds.height,t.L(p-2,y,c),t.L(p-1,y,c+w)):0===this.K&&x<=u.bounds.right&&(c=u.bounds.x,t.L(p-2,c,m),t.L(p-1,c-v,m))):(v=Math.max(10,this.$d[u.layer]),w=Math.max(10,this.zd[u.layer]),f=0,180===this.K||0===this.K?((180===this.K?x<=u.bounds.x:x>=u.bounds.right)&&(f=(0===this.K?w:-v)/2),t.m(p++,x+f,m)):((270===this.K?b<=u.bounds.y:b>=u.bounds.bottom)&&(f=(90===this.K?w:-v)/2),t.m(p++,y,b+f)),t.m(p++,x,b)))}else{for(;null!==u&&u!==c;){for(v=g=null,u=u.destinationEdges.iterator;u.next()&&(y=u.value,y.link!==i.link||(g=y.toVertex,v=y.fromVertex,null!==v.node&&(v=null),null!==g.node)););g!==c&&(y=t.i(p-1).x,m=t.i(p-1).y,x=g.centerX,b=g.centerY,f?180===this.K||0===this.K?(null!==v?v.centerY:m)!==b&&(v=this.Ia[g.layer]+this.Vc.x,p===t.firstPickIndex+1&&(v=0===this.K?Math.max(v,y):Math.min(v,y)),t.m(p++,v,m),t.m(p++,v,b)):(null!==v?v.centerX:y)!==x&&(v=this.Ia[g.layer]+this.Vc.y,p===t.firstPickIndex+1&&(v=90===this.K?Math.max(v,m):Math.min(v,m)),t.m(p++,y,v),t.m(p++,x,v)):(v=Math.max(10,this.$d[g.layer]),w=Math.max(10,this.zd[g.layer]),180===this.K?(t.m(p++,x+w,b),d&&t.m(p++,x,b),t.m(p++,x-v,b)):90===this.K?(t.m(p++,x,b-v),d&&t.m(p++,x,b),t.m(p++,x,b+w)):270===this.K?(t.m(p++,x,b+w),d&&t.m(p++,x,b),t.m(p++,x,b-v)):(t.m(p++,x-v,b),d&&t.m(p++,x,b),t.m(p++,x+w,b)))),u=g}f&&(y=t.i(p-1).x,m=t.i(p-1).y,x=t.i(p).x,b=t.i(p).y,180===this.K||0===this.K?m!==b&&(v=0===this.K?Math.min(Math.max((x+y)/2,this.Ia[c.layer]+this.Vc.x),x):Math.max(Math.min((x+y)/2,this.Ia[c.layer]+this.Vc.x),x),t.m(p++,v,m),t.m(p++,v,b)):y!==x&&(v=90===this.K?Math.min(Math.max((b+m)/2,this.Ia[c.layer]+this.Vc.y),b):Math.max(Math.min((b+m)/2,this.Ia[c.layer]+this.Vc.y),b),t.m(p++,y,v),t.m(p++,x,v)))}null!==n&&d&&(null!==s&&(l===ie&&(l=t.i(0),n=t.i(2),l.w(n)||t.L(1,(l.x+n.x)/2,(l.y+n.y)/2)),l=t.getLinkPoint(o,s,ie,!0,!1,r,a),l.s()||l.set(o.actualBounds.center),t.L(0,l.x,l.y)),null!==a&&(h===ie&&(h=t.i(t.pointsCount-1),l=t.i(t.pointsCount-3),h.w(l)||t.L(t.pointsCount-2,(h.x+l.x)/2,(h.y+l.y)/2)),o=t.getLinkPoint(r,a,ie,!1,!1,o,s),o.s()||o.set(r.actualBounds.center),t.L(t.pointsCount-1,o.x,o.y))),t.xf(),i.commit()}}}this.avoidOrthogonalOverlaps()},kg.prototype.avoidOrthogonalOverlaps=function(){if(!(0>=this.linkSpacing)){for(var t=new et,e=this.network.edges.iterator;e.next();){var i=e.value.link;null!==i&&i.isOrthogonal&&!t.contains(i)&&t.add(i)}if(0<t.count)if(90===this.K||270===this.K){for(e=0,i=[],t=t.iterator;t.next();){var n=t.value;if(null!==n&&n.isOrthogonal)for(var o=2;o<n.pointsCount-3;o++){var r=n.i(o),s=n.i(o+1);if(this.A(r.y,s.y)&&!this.A(r.x,s.x)){var a=new py;a.layer=Math.floor(r.y/2);var h=n.i(0),l=n.i(n.pointsCount-1);if(a.first=h.x*h.x+h.y,a.Xb=l.x*l.x+l.y,a.fd=Math.min(r.x,s.x),a.vc=Math.max(r.x,s.x),a.index=o,a.link=n,o+2<n.pointsCount){h=n.i(o-1),l=n.i(o+2);var u=0;h.y<r.y?u=l.y<r.y?3:r.x<s.x?2:1:h.y>r.y&&(u=l.y>r.y?0:s.x<r.x?2:1),a.l=u}i.push(a)}}}if(1<i.length)for(i.sort(this.Ry),t=0;t<i.length;){for(r=i[t].layer,n=t+1;n<i.length&&i[n].layer===r;)n++;if(1<n-t)for(r=t;r<n;){for(s=i[r].vc,o=t+1;o<n&&i[o].fd<s;)s=Math.max(s,i[o].vc),o++;if(s=o-r,1<s){for(this.uj(i,this.hu,r,r+s),u=1,a=i[r].Xb,h=r;h<o;h++)l=i[h],l.Xb!==a&&(u++,a=l.Xb);this.uj(i,this.Qy,r,r+s);var c=1;for(a=i[r].first,h=r;h<o;h++)l=i[h],l.first!==a&&(c++,a=l.first);for(h=!0,l=c,u<c?(h=!1,l=u,a=i[r].Xb,this.uj(i,this.hu,r,r+s)):a=i[r].first,u=0,c=r;c<o;c++){var f=i[c];(h?f.first:f.Xb)!==a&&(u++,a=h?f.first:f.Xb);var d=f.link;r=d.i(f.index),s=d.i(f.index+1);var p=this.linkSpacing*(u-(l-1)/2);e++,d.Th(),d.L(f.index,r.x,r.y+p),d.L(f.index+1,s.x,s.y+p),d.xf()}}r=o}t=n}}else{for(e=0,i=[],t=t.iterator;t.next();)if(n=t.value,null!==n&&n.isOrthogonal)for(o=2;o<n.pointsCount-3;o++)r=n.i(o),s=n.i(o+1),this.A(r.x,s.x)&&!this.A(r.y,s.y)&&(a=new py,a.layer=Math.floor(r.x/2),h=n.i(0),l=n.i(n.pointsCount-1),a.first=h.x+h.y*h.y,a.Xb=l.x+l.y*l.y,a.fd=Math.min(r.y,s.y),a.vc=Math.max(r.y,s.y),a.index=o,a.link=n,o+2<n.pointsCount&&(h=n.i(o-1),l=n.i(o+2),u=0,h.x<r.x?u=l.x<r.x?3:r.y<s.y?2:1:h.x>r.x&&(u=l.x>r.x?0:s.y<r.y?2:1),a.l=u),i.push(a));if(1<i.length)for(i.sort(this.Ry),t=0;t<i.length;){for(r=i[t].layer,n=t+1;n<i.length&&i[n].layer===r;)n++;if(1<n-t)for(r=t;r<n;){for(s=i[r].vc,o=t+1;o<n&&i[o].fd<s;)s=Math.max(s,i[o].vc),o++;if(s=o-r,1<s){for(this.uj(i,this.hu,r,r+s),u=1,a=i[r].Xb,h=r;h<o;h++)l=i[h],l.Xb!==a&&(u++,a=l.Xb);for(this.uj(i,this.Qy,r,r+s),c=1,a=i[r].first,h=r;h<o;h++)l=i[h],l.first!==a&&(c++,a=l.first);for(h=!0,l=c,u<c?(h=!1,l=u,a=i[r].Xb,this.uj(i,this.hu,r,r+s)):a=i[r].first,u=0,c=r;c<o;c++)f=i[c],(h?f.first:f.Xb)!==a&&(u++,a=h?f.first:f.Xb),d=f.link,r=d.i(f.index),s=d.i(f.index+1),p=this.linkSpacing*(u-(l-1)/2),e++,d.Th(),d.L(f.index,r.x+p,r.y),d.L(f.index+1,s.x+p,s.y),d.xf()}r=o}t=n}}}},i=kg.prototype,i.Ry=function(t,e){return t instanceof py&&e instanceof py&&t!==e?t.layer<e.layer?-1:t.layer>e.layer?1:t.fd<e.fd?-1:t.fd>e.fd?1:t.vc<e.vc?-1:t.vc>e.vc?1:0:0},i.Qy=function(t,e){return t instanceof py&&e instanceof py&&t!==e?t.first<e.first?-1:t.first>e.first||t.l<e.l?1:t.l>e.l||t.fd<e.fd?-1:t.fd>e.fd?1:t.vc<e.vc?-1:t.vc>e.vc?1:0:0},i.hu=function(t,e){return t instanceof py&&e instanceof py&&t!==e?t.Xb<e.Xb?-1:t.Xb>e.Xb||t.l<e.l?1:t.l>e.l||t.fd<e.fd?-1:t.fd>e.fd?1:t.vc<e.vc?-1:t.vc>e.vc?1:0:0},i.A=function(t,e){return t-=e,-1<t&&1>t},i.uj=function(t,e,i,n){var o=t.length,r=n-i;if(!(1>=r))if((0>i||i>=o-1)&&w("not in range 0 <= from < length: "+i),2===r)n=t[i],o=t[i+1],0<e(n,o)&&(t[i]=o,t[i+1]=n);else if(0===i)if(n>=o)t.sort(e);else for(i=t.slice(0,n),i.sort(e),e=0;e<n;e++)t[e]=i[e];else if(n>=o)for(n=t.slice(i),n.sort(e),e=i;e<o;e++)t[e]=n[e-i];else for(o=t.slice(i,n),o.sort(e),e=i;e<n;e++)t[e]=o[e-i]},d.Object.defineProperties(kg.prototype,{layerSpacing:{get:function(){return this.ue},set:function(t){this.ue!==t&&0<=t&&(this.ue=t,this.B())}},columnSpacing:{get:function(){return this.Zb},set:function(t){this.Zb!==t&&0<t&&(this.Zb=t,this.B())}},direction:{get:function(){return this.K},set:function(t){this.K!==t&&(0===t||90===t||180===t||270===t?(this.K=t,this.B()):w("LayeredDigraphLayout.direction must be 0, 90, 180, or 270"))}},cycleRemoveOption:{get:function(){return this.jl},set:function(t){this.jl===t||t!==iy&&t!==ey&&t!==ny||(this.jl=t,this.B())}},layeringOption:{get:function(){return this.Ml},set:function(t){this.Ml===t||t!==oy&&t!==ry&&t!==sy||(this.Ml=t,this.B())}},initializeOption:{get:function(){return this.Bl},set:function(t){this.Bl===t||t!==ay&&t!==hy&&t!==ly||(this.Bl=t,this.B())}},iterations:{get:function(){return this.Rj},set:function(t){this.Rj!==t&&0<=t&&(this.Rj=t,this.B())}},aggressiveOption:{get:function(){return this.Zk},set:function(t){this.Zk===t||t!==uy&&t!==cy&&t!==fy||(this.Zk=t,this.B())}},packOption:{get:function(){return this.ng},set:function(t){this.ng!==t&&0<=t&&8>t&&(this.ng=t,this.B())}},setsPortSpots:{get:function(){return this.kf},set:function(t){this.kf!==t&&(this.kf=t,this.B())}},linkSpacing:{get:function(){return this.Mo},set:function(t){this.Mo!==t&&0<=t&&(this.Mo=t,this.B())}},maxLayer:{get:function(){return this.sa}},maxIndex:{get:function(){return this.Ji}},maxColumn:{get:function(){return this.Ca}},minIndexLayer:{get:function(){return this.mh}},maxIndexLayer:{get:function(){return this.pc}}});var ey=new U(kg,"CycleDepthFirst",0),iy=new U(kg,"CycleGreedy",1),ny=new U(kg,"CycleFromLayers",2),oy=new U(kg,"LayerOptimalLinkLength",0),ry=new U(kg,"LayerLongestPathSink",1),sy=new U(kg,"LayerLongestPathSource",2),ay=new U(kg,"InitDepthFirstOut",0),hy=new U(kg,"InitDepthFirstIn",1),ly=new U(kg,"InitNaive",2),uy=new U(kg,"AggressiveNone",0),cy=new U(kg,"AggressiveLess",1),fy=new U(kg,"AggressiveMore",2),dy=8;function py(){this.index=this.vc=this.fd=this.Xb=this.first=this.layer=0,this.link=null,this.l=0}function gy(t){Qf.call(this,t)}function yy(t){rd.call(this,t),this.Ra=this.Rg=this.Fi=-1,this.I=NaN,this.T=null,this.valid=!1,this.finish=this.Cg=NaN,this.wf=0,this.Mk=this.Nk=null}function my(t){ad.call(this,t),this.l=this.La=this.eb=!1,this.Ka=this.I=NaN,this.T=this.u=0}function vy(){zf.call(this),this.Jb=new nt,this.vp=$y,this.kd=Jy,this.oq=dm,this.ts=bm,this.nx=[],this.jd=!0,this.Eb=mm,this.Pd=new Bt(10,10).freeze();var t=new Mm(this);this.U=new Sm(t),this.V=new Sm(t),this.uv=[]}function xy(t){var e=new nt;for(t=t.iterator;t.next();){var i=t.value;i.initialized||e.add(i)}return e}function by(t,e){var i=999999,n=null;for(e=e.iterator;e.next();){var o=e.value;switch(t.kd){case Jy:o.sourceEdges.count<i&&(i=o.sourceEdges.count,n=o);break;case Zy:o.destinationEdges.count<i&&(i=o.destinationEdges.count,n=o);break;default:w("Unhandled path value "+t.kd.toString())}}return n}function wy(t,e){if(null!==e){switch(t.kd){case Jy:if(0<e.destinationEdges.count){for(var i=new et,n=e.destinationVertexes;n.next();){var o=n.value;ky(t,e,o)&&i.add(o)}0<i.count&&(e.children=i.ma())}break;case Zy:if(0<e.sourceEdges.count){for(i=new et,n=e.sourceVertexes;n.next();)o=n.value,ky(t,e,o)&&i.add(o);0<i.count&&(e.children=i.ma())}break;default:w("Unhandled path value"+t.kd.toString())}for(i=e.children,n=i.length,o=0;o<n;o++){var r=i[o];r.initialized=!0,r.level=e.level+1,r.parent=e,t.Jb.remove(r)}for(e=0;e<n;e++)wy(t,i[e])}}function ky(t,e,i){if(i.initialized){if(null===e)var n=!1;else{for(n=e.parent;null!==n&&n!==i;)n=n.parent;n=n===i}if(n||i.level>e.level)return!1;t.removeChild(i.parent,i)}return!0}function My(t,e){if(null!==e){t.initializeTreeVertexValues(e),e.alignment===hm&&t.sortTreeVertexChildren(e);for(var i=0,n=e.childrenCount,o=0,r=e.children,s=r.length,a=0;a<s;a++){var h=r[a];My(t,h),i+=h.descendantCount+1,n=Math.max(n,h.maxChildrenCount),o=Math.max(o,h.maxGenerationCount)}e.descendantCount=i,e.maxChildrenCount=n,e.maxGenerationCount=0<n?o+1:0}}function Sy(t,e){switch(t.oq){default:case dm:return null!==e.parent?e.parent:t.U;case ym:return null===e.parent?t.U:null===e.parent.parent?t.V:e.parent;case gm:return null!==e.parent?null!==e.parent.parent?e.parent.parent:t.V:t.U;case pm:var i=!0;if(0===e.childrenCount)i=!1;else for(var n=e.children,o=n.length,r=0;r<o;r++)if(0<n[r].childrenCount){i=!1;break}return i&&null!==e.parent?t.V:null!==e.parent?e.parent:t.U}}function Py(t,e){if(null!==e){t.assignTreeVertexValues(e),e=e.children;for(var i=e.length,n=0;n<i;n++)Py(t,e[n])}}function Ny(t,e){if(null!==e){e.alignment!==hm&&t.sortTreeVertexChildren(e),e=e.children;for(var i=e.length,n=0;n<i;n++)Ny(t,e[n])}}function Cy(t){return t===am||t===hm||t===lm||t===um}function Ty(t){return t===am||t===hm}function Ay(t){var e=t.parent;if(null!==e){var i=e.alignment;if(Cy(i)){if(Ty(i)){for(e=e.children,i=0;i<e.length&&t!==e[i];)i++;return 0===i%2}if(i===lm)return!0}}return!1}function Ly(t,e){if(0===e.childrenCount){var i=!1,n=0;null!==e.parent&&(n=e.parent.angle,i=e.parent.alignment,i=Cy(i));var o=Ay(e);e.S.h(0,0),e.ua.h(e.width,e.height),null===e.parent||null===e.comments||(180!==n&&270!==n||i)&&!o?e.fa.h(0,0):180===n&&!i||(90===n||270===n)&&o?e.fa.h(e.width-2*e.focus.x,0):e.fa.h(0,e.height-2*e.focus.y)}else{n=Hy(e),i=90===n||270===n;var r=0;o=e.children;for(var s=o.length,a=0;a<s;a++){var h=o[a];r=Math.max(r,i?h.ua.width:h.ua.height)}var l=e.alignment,u=l===rm,c=l===sm;a=Cy(l);var f=Math.max(0,e.breadthLimit);h=_y(e);var d=e.nodeSpacing,p=Wy(e),g=u||c?0:p/2,y=e.rowSpacing,m=0;(u||c||e.Sm||e.Tm&&1===e.maxGenerationCount)&&(m=Math.max(0,e.rowIndent)),u=e.width;var v=e.height,x=0,b=0,k=0,M=0,S=0,P=0,N=0,C=0,T=0;if(a&&!Ty(l)&&135<n&&o.reverse(),Ty(l))if(1<s)for(var A=0;A<s;A++){var L=o[A],j=L.ua;0===A%2&&A!==s-1&&(T=Math.max(T,(i?j.width:j.height)+Dy(L)-d))}else 1===s&&(T=i?o[0].ua.width:o[0].ua.height);if(a)switch(l){case am:case hm:b=135>n?jy(e,o,T,x,b):Oy(e,o,T,x,b),T=b.x,x=b.width,b=b.height;break;case lm:for(t=0;t<s;t++)f=o[t],g=f.ua,k=0===N?0:y,i?(f.S.h(r-g.width,S+k),x=Math.max(x,g.width),b=Math.max(b,S+k+g.height),S+=k+g.height):(f.S.h(M+k,r-g.height),x=Math.max(x,M+k+g.width),b=Math.max(b,g.height),M+=k+g.width),N++;break;case um:for(r=0;r<s;r++)t=o[r],f=t.ua,g=0===N?0:y,i?(t.S.h(d/2+e.focus.x,S+g),x=Math.max(x,f.width),b=Math.max(b,S+g+f.height),S+=g+f.height):(t.S.h(M+g,d/2+e.focus.y),x=Math.max(x,M+g+f.width),b=Math.max(b,f.height),M+=g+f.width),N++}else for(A=0;A<s;A++){if(L=o[A],j=L.ua,i){0<f&&0<N&&M+d+j.width>f&&(M<r&&Ry(e,l,r-M,0,C,A-1),P++,N=0,C=A,k=b,M=0,S=135<n?-b-y:b+y);var O=0===N?g:d;Vy(t,L,0,S),L.S.h(M+O,S),x=Math.max(x,M+O+j.width),b=Math.max(b,k+(0===P?0:y)+j.height),M+=O+j.width}else 0<f&&0<N&&S+d+j.height>f&&(S<r&&Ry(e,l,0,r-S,C,A-1),P++,N=0,C=A,k=x,S=0,M=135<n?-x-y:x+y),O=0===N?g:d,Vy(t,L,M,0),L.S.h(M,S+O),b=Math.max(b,S+O+j.height),x=Math.max(x,k+(0===P?0:y)+j.width),S+=O+j.height;N++}switch(0<P&&(i?(b+=Math.max(0,h),M<x&&Ry(e,l,x-M,0,C,s-1),0<m&&(c||zy(e,m,0,0,s-1),x+=m)):(x+=Math.max(0,h),S<b&&Ry(e,l,0,b-S,C,s-1),0<m&&(c||zy(e,0,m,0,s-1),b+=m))),m=c=0,l){case nm:i?c+=x/2-e.focus.x-p/2:m+=b/2-e.focus.y-p/2;break;case om:0<P?i?c+=x/2-e.focus.x-p/2:m+=b/2-e.focus.y-p/2:i?(l=o[0].S.x+o[0].fa.x,c+=l+(o[s-1].S.x+o[s-1].fa.x+2*o[s-1].focus.x-l)/2-e.focus.x-p/2):(l=o[0].S.y+o[0].fa.y,m+=l+(o[s-1].S.y+o[s-1].fa.y+2*o[s-1].focus.y-l)/2-e.focus.y-p/2);break;case rm:i?(c-=p,x+=p):(m-=p,b+=p);break;case sm:i?(c+=x-e.width+p,x+=p):(m+=b-e.height+p,b+=p);break;case am:case hm:i?c+=1<s?T+d/2-e.focus.x:o[0].focus.x-e.focus.x+o[0].fa.x:m+=1<s?T+d/2-e.focus.y:o[0].focus.y-e.focus.y+o[0].fa.y;break;case lm:i?c+=x+d/2-e.focus.x:m+=b+d/2-e.focus.y;break;case um:break;default:w("Unhandled alignment value "+l.toString())}for(p=0;p<s;p++)l=o[p],i?l.S.h(l.S.x+l.fa.x-c,l.S.y+(135<n?(a?-b:-l.ua.height)+l.fa.y-h:v+h+l.fa.y)):l.S.h(l.S.x+(135<n?(a?-x:-l.ua.width)+l.fa.x-h:u+h+l.fa.x),l.S.y+l.fa.y-m);i?(x=By(e,x,c),0>c&&(c=0),135<n&&(m+=b+h),b=Math.max(Math.max(b,v),b+v+h)):(135<n&&(c+=x+h),x=Math.max(Math.max(x,u),x+u+h),b=Iy(e,b,m),0>m&&(m=0)),e.fa.h(c,m),e.ua.h(x,b)}}function jy(t,e,i,n,o){var r=e.length;if(0===r)return new zt(i,0,n,o);if(1===r)return t=e[0],n=t.ua.width,o=t.ua.height,new zt(i,0,n,o);for(var s=t.nodeSpacing,a=t.rowSpacing,h=90===Hy(t),l=0,u=0,c=0,f=0;f<r;f++)if(!(0!==f%2||1<r&&f===r-1)){var d=e[f],p=d.ua,g=0===l?0:a;if(h){var y=Dy(d)-s;d.S.h(i-(p.width+y),c+g),n=Math.max(n,p.width+y),o=Math.max(o,c+g+p.height),c+=g+p.height}else y=Dy(d)-s,d.S.h(u+g,i-(p.height+y)),o=Math.max(o,p.height+y),n=Math.max(n,u+g+p.width),u+=g+p.width;l++}for(l=0,d=u,f=c,h?(u=i+s,c=0):(u=0,c=i+s),p=0;p<r;p++)if(0!==p%2){g=e[p],y=g.ua;var m=0===l?0:a;if(h){var v=Dy(g)-s;g.S.h(u+v,c+m),n=Math.max(n,u+y.width+v),o=Math.max(o,c+m+y.height),c+=m+y.height}else v=Dy(g)-s,g.S.h(u+m,c+v),n=Math.max(n,u+m+y.width),o=Math.max(o,c+y.height+v),u+=m+y.width;l++}return 1<r&&1===r%2&&(e=e[r-1],r=e.ua,a=null===e.parent?0:e.parent.rowSpacing,h?(e.S.h(i+s/2-e.focus.x-e.fa.x,o+a),h=i+s/2-e.focus.x-e.fa.x,n=Math.max(n,h+r.width),0>h&&(n-=h),o=Math.max(o,Math.max(f,c)+a+r.height),0>e.S.x&&(i=Fy(t,e.S.x,!1,i,s))):(e.S.h(n+a,i+s/2-e.focus.y-e.fa.y),n=Math.max(n,Math.max(d,u)+a+r.width),c=i+s/2-e.focus.y-e.fa.y,o=Math.max(o,c+r.height),0>c&&(o-=c),0>e.S.y&&(i=Fy(t,e.S.y,!0,i,s)))),new zt(i,0,n,o)}function Oy(t,e,i,n,o){var r=e.length;if(0===r)return new zt(i,0,n,o);if(1===r)return e=e[0],n=e.ua.width,o=e.ua.height,new zt(i,0,n,o);for(var s=t.nodeSpacing,a=t.rowSpacing,h=270===Hy(t),l=0,u=0,c=0,f=0;f<r;f++)if(!(0!==f%2||1<r&&f===r-1)){var d=e[f],p=d.ua,g=0===l?0:a;if(h){var y=Dy(d)-s;c-=g+p.height,d.S.h(i-(p.width+y),c),n=Math.max(n,p.width+y),o=Math.max(o,Math.abs(c))}else y=Dy(d)-s,u-=g+p.width,d.S.h(u,i-(p.height+y)),o=Math.max(o,p.height+y),n=Math.max(n,Math.abs(u));l++}for(l=0,d=u,f=c,h?(u=i+s,c=0):(u=0,c=i+s),p=0;p<r;p++)if(0!==p%2){g=e[p],y=g.ua;var m=0===l?0:a;if(h){var v=Dy(g)-s;c-=m+y.height,g.S.h(u+v,c),n=Math.max(n,u+y.width+v),o=Math.max(o,Math.abs(c))}else v=Dy(g)-s,u-=m+y.width,g.S.h(u,c+v),o=Math.max(o,c+y.height+v),n=Math.max(n,Math.abs(u));l++}for(1<r&&1===r%2&&(a=e[r-1],l=a.ua,p=null===a.parent?0:a.parent.rowSpacing,h?(a.S.h(i+s/2-a.focus.x-a.fa.x,-o-l.height-p),u=i+s/2-a.focus.x-a.fa.x,n=Math.max(n,u+l.width),0>u&&(n-=u),o=Math.max(o,Math.abs(Math.min(f,c))+p+l.height),0>a.S.x&&(i=Fy(t,a.S.x,!1,i,s))):(a.S.h(-n-l.width-p,i+s/2-a.focus.y-a.fa.y),n=Math.max(n,Math.abs(Math.min(d,u))+p+l.width),c=i+s/2-a.focus.y-a.fa.y,o=Math.max(o,c+l.height),0>c&&(o-=c),0>a.S.y&&(i=Fy(t,a.S.y,!0,i,s)))),t=0;t<r;t++)s=e[t],h?s.S.h(s.S.x,s.S.y+o):s.S.h(s.S.x+n,s.S.y);return new zt(i,0,n,o)}function Dy(t){return null===t.parent?0:t.parent.nodeSpacing}function Fy(t,e,i,n,o){t=t.children;for(var r=t.length,s=0;s<r;s++)i?t[s].S.h(t[s].S.x,t[s].S.y-e):t[s].S.h(t[s].S.x-e,t[s].S.y);return e=t[r-1],Math.max(n,i?e.fa.y+e.focus.y-o/2:e.fa.x+e.focus.x-o/2)}function By(t,e,i){switch(t.alignment){case om:case nm:return i+t.width>e&&(e=i+t.width),0>i&&(e-=i),e;case rm:return t.width>e?t.width:e;case sm:return 2*t.focus.x>e?t.width:e+t.width-2*t.focus.x;case am:case hm:return Math.max(t.width,Math.max(e,i+t.width)-Math.min(0,i));case lm:return t.width-t.focus.x+t.nodeSpacing/2+e;case um:return Math.max(t.width,t.focus.x+t.nodeSpacing/2+e);default:return e}}function Iy(t,e,i){switch(t.alignment){case om:case nm:return i+t.height>e&&(e=i+t.height),0>i&&(e-=i),e;case rm:return t.height>e?t.height:e;case sm:return 2*t.focus.y>e?t.height:e+t.height-2*t.focus.y;case am:case hm:return Math.max(t.height,Math.max(e,i+t.height)-Math.min(0,i));case lm:return t.height-t.focus.y+t.nodeSpacing/2+e;case um:return Math.max(t.height,t.focus.y+t.nodeSpacing/2+e);default:return e}}function Ey(t,e,i){switch(t){case nm:e/=2,i/=2;break;case om:e/=2,i/=2;break;case rm:i=e=0;break;case sm:break;default:w("Unhandled alignment value "+t.toString())}return new pt(e,i)}function Ry(t,e,i,n,o,r){e=Ey(e,i,n),zy(t,e.x,e.y,o,r)}function zy(t,e,i,n,o){if(0!==e||0!==i)for(t=t.children;n<=o;n++){var r=t[n].S;r.x+=e,r.y+=i}}function Vy(t,e,i,n){var o=e.parent;switch(t.kd){case Jy:for(t=e.sourceEdges;t.next();)e=t.value,e.fromVertex===o&&e.relativePoint.h(i,n);break;case Zy:for(t=e.destinationEdges;t.next();)e=t.value,e.toVertex===o&&e.relativePoint.h(i,n);break;default:w("Unhandled path value "+t.kd.toString())}}function Gy(t,e,i){for(var n=0;n<t.length;n++){var o=t[n];o.x+=e,o.y+=i}}function Yy(t,e,i,n,o,r,s,a){var h=Hy(e),l=90===h||270===h,u=e.nodeSpacing;e=n;var c=o;n=r;var f=s,d=i.Pq,p=i.br;s=i.ua;var g=l?Math.max(f,s.height):Math.max(n,s.width);if(null!==d&&h===Hy(i)||(d=Xy(t,2),p=Xy(t,2),l?(d[0].h(0,0),d[1].h(0,s.height),p[0].h(s.width,0),p[1].h(p[0].x,d[1].y)):(d[0].h(0,0),d[1].h(s.width,0),p[0].h(0,s.height),p[1].h(d[1].x,p[0].y))),l){if(f=9999999,!(null===c||2>c.length||null===d||2>d.length))for(o=i=0;i<c.length&&o<d.length;){r=c[i];var y=d[o];h=y.x,l=y.y,h+=n;var m=r;i+1<c.length&&(m=c[i+1]);var v=y;y=v.x,v=v.y,o+1<d.length&&(v=d[o+1],y=v.x,v=v.y,y+=n);var x=f;r.y===l?x=h-r.x:r.y>l&&r.y<v?x=h+(r.y-l)/(v-l)*(y-h)-r.x:l>r.y&&l<m.y&&(x=h-(r.x+(l-r.y)/(m.y-r.y)*(m.x-r.x))),x<f&&(f=x),m.y<=r.y?i++:v<=l?o++:(m.y<=v&&i++,v<=m.y&&o++)}if(f=n-f,f+=u,i=d,o=f,null===e||2>e.length||null===i||2>i.length)n=null;else{for(u=Xy(t,e.length+i.length),n=r=h=0;r<i.length&&i[r].y<e[0].y;)l=i[r++],u[n++].h(l.x+o,l.y);for(;h<e.length;)l=e[h++],u[n++].h(l.x,l.y);for(h=e[e.length-1].y;r<i.length&&i[r].y<=h;)r++;for(;r<i.length&&i[r].y>h;)l=i[r++],u[n++].h(l.x+o,l.y);for(i=Xy(t,n),h=0;h<n;h++)i[h].assign(u[h]);qy(t,u),n=i}if(r=p,h=f,null===c||2>c.length||null===r||2>r.length)o=null;else{for(u=Xy(t,c.length+r.length),o=l=i=0;i<c.length&&c[i].y<r[0].y;)m=c[i++],u[o++].h(m.x,m.y);for(;l<r.length;)m=r[l++],u[o++].h(m.x+h,m.y);for(r=r[r.length-1].y;i<c.length&&c[i].y<=r;)i++;for(;i<c.length&&c[i].y>r;)h=c[i++],u[o++].h(h.x,h.y);for(r=Xy(t,o),i=0;i<o;i++)r[i].assign(u[i]);qy(t,u),o=r}return r=Math.max(0,f)+s.width,s=g,qy(t,e),qy(t,d),qy(t,c),qy(t,p),a[0]=n,a[1]=o,new zt(f,0,r,s)}if(n=9999999,!(null===c||2>c.length||null===d||2>d.length))for(o=i=0;i<c.length&&o<d.length;)r=c[i],y=d[o],h=y.x,l=y.y,l+=f,m=r,i+1<c.length&&(m=c[i+1]),v=y,y=v.x,v=v.y,o+1<d.length&&(v=d[o+1],y=v.x,v=v.y,v+=f),x=n,r.x===h?x=l-r.y:r.x>h&&r.x<y?x=l+(r.x-h)/(y-h)*(v-l)-r.y:h>r.x&&h<m.x&&(x=l-(r.y+(h-r.x)/(m.x-r.x)*(m.y-r.y))),x<n&&(n=x),m.x<=r.x?i++:y<=h?o++:(m.x<=y&&i++,y<=m.x&&o++);if(f-=n,f+=u,i=d,o=f,null===e||2>e.length||null===i||2>i.length)n=null;else{for(u=Xy(t,e.length+i.length),n=r=h=0;r<i.length&&i[r].x<e[0].x;)l=i[r++],u[n++].h(l.x,l.y+o);for(;h<e.length;)l=e[h++],u[n++].h(l.x,l.y);for(h=e[e.length-1].x;r<i.length&&i[r].x<=h;)r++;for(;r<i.length&&i[r].x>h;)l=i[r++],u[n++].h(l.x,l.y+o);for(i=Xy(t,n),h=0;h<n;h++)i[h].assign(u[h]);qy(t,u),n=i}if(r=p,h=f,null===c||2>c.length||null===r||2>r.length)o=null;else{for(u=Xy(t,c.length+r.length),o=l=i=0;i<c.length&&c[i].x<r[0].x;)m=c[i++],u[o++].h(m.x,m.y);for(;l<r.length;)m=r[l++],u[o++].h(m.x,m.y+h);for(r=r[r.length-1].x;i<c.length&&c[i].x<=r;)i++;for(;i<c.length&&c[i].x>r;)h=c[i++],u[o++].h(h.x,h.y);for(r=Xy(t,o),i=0;i<o;i++)r[i].assign(u[i]);qy(t,u),o=r}return r=g,s=Math.max(0,f)+s.height,qy(t,e),qy(t,d),qy(t,c),qy(t,p),a[0]=n,a[1]=o,new zt(f,0,r,s)}function Xy(t,e){if(t=t.uv[e],void 0!==t&&(t=t.pop(),void 0!==t))return t;t=[];for(var i=0;i<e;i++)t[i]=new pt;return t}function qy(t,e){var i=e.length,n=t.uv[i];void 0===n&&(n=[],t.uv[i]=n),n.push(e)}function Uy(t,e,i,n){if(null!==e){e.x=i,e.y=n,e=e.children;for(var o=e.length,r=0;r<o;r++){var s=e[r];Uy(t,s,i+s.S.x,n+s.S.y)}}}function Ky(t,e){if(null!==e){t.setPortSpots(e),e=e.children;for(var i=e.length,n=0;n<i;n++)Ky(t,e[n])}}function Hy(t){return t=t.angle,45>=t?0:135>=t?90:225>=t?180:315>=t?270:0}function _y(t){var e=Hy(t);e=90===e||270===e;var i=t.layerSpacing;if(0<t.layerSpacingParentOverlap){var n=Math.min(1,t.layerSpacingParentOverlap);i-=e?t.height*n:t.width*n}return i<(e?-t.height:-t.width)&&(i=e?-t.height:-t.width),i}function Wy(t){var e=Hy(t),i=t.nodeIndent;if(0<t.nodeIndentPastParent){var n=Math.min(1,t.nodeIndentPastParent);i+=90===e||270===e?t.width*n:t.height*n}return Math.max(0,i)}kg.className="LayeredDigraphLayout",kg.CycleDepthFirst=ey,kg.CycleGreedy=iy,kg.CycleFromLayers=ny,kg.LayerOptimalLinkLength=oy,kg.LayerLongestPathSink=ry,kg.LayerLongestPathSource=sy,kg.InitDepthFirstOut=ay,kg.InitDepthFirstIn=hy,kg.InitNaive=ly,kg.AggressiveNone=uy,kg.AggressiveLess=cy,kg.AggressiveMore=fy,kg.PackNone=0,kg.PackExpand=1,kg.PackStraighten=2,kg.PackMedian=4,kg.PackAll=15,py.className="SegInfo",f(gy,Qf),gy.prototype.createVertex=function(){return new yy(this)},gy.prototype.createEdge=function(){return new my(this)},gy.className="LayeredDigraphNetwork",f(yy,rd),yy.prototype.serializeVertexProperties=function(t,e){rd.prototype.serializeVertexProperties.call(this,t,e),t.layer=this.layer,t.column=this.column,t.index=this.index,t.component=this.component,t.near=this.near?st(this.near):null,t.valid=this.valid,t.Cg=this.Cg,t.finish=this.finish,t.wf=this.wf,t.Nk=this.Nk,t.Mk=this.Mk},yy.prototype.Cq=function(t,e,i,n){rd.prototype.Cq.call(this,t,e,i,n),this.layer=t.layer,this.column=t.column,this.index=t.index,this.component=t.component,(e=e.get(t.near))&&(this.near=e),this.valid=t.valid,this.Cg=t.Cg,this.finish=t.finish,this.wf=t.wf,this.Nk=t.Nk,this.Mk=t.Mk},d.Object.defineProperties(yy.prototype,{layer:{get:function(){return this.Fi},set:function(t){this.Fi!==t&&(this.Fi=t)}},column:{get:function(){return this.Rg},set:function(t){this.Rg!==t&&(this.Rg=t)}},index:{get:function(){return this.Ra},set:function(t){this.Ra!==t&&(this.Ra=t)}},component:{get:function(){return this.I},set:function(t){this.I!==t&&(this.I=t)}},near:{get:function(){return this.T},set:function(t){this.T!==t&&(this.T=t)}}}),yy.className="LayeredDigraphVertex",f(my,ad),my.prototype.serializeEdgeProperties=function(t,e){ad.prototype.serializeEdgeProperties.call(this,t,e),t.valid=this.valid,t.rev=this.rev,t.forest=this.forest,t.portFromPos=this.portFromPos,t.portToPos=this.portToPos,t.portFromColOffset=this.portFromColOffset,t.portToColOffset=this.portToColOffset},my.prototype.deserializeEdgeProperties=function(t,e,i,n){ad.prototype.deserializeEdgeProperties.call(this,t,e,i,n),this.valid=t.valid,this.rev=t.rev,this.forest=t.forest,this.portFromPos=t.portFromPos,this.portToPos=t.portToPos,this.portFromColOffset=t.portFromColOffset,this.portToColOffset=t.portToColOffset},d.Object.defineProperties(my.prototype,{fromVertex:{get:function(){return this.Yc},set:function(t){this.Yc!==t&&(this.Yc=t)}},toVertex:{get:function(){return this.ed},set:function(t){this.ed!==t&&(this.ed=t)}},valid:{get:function(){return this.eb},set:function(t){this.eb!==t&&(this.eb=t)}},rev:{get:function(){return this.La},set:function(t){this.La!==t&&(this.La=t)}},forest:{get:function(){return this.l},set:function(t){this.l!==t&&(this.l=t)}},portFromPos:{get:function(){return this.I},set:function(t){this.I!==t&&(this.I=t)}},portToPos:{get:function(){return this.Ka},set:function(t){this.Ka!==t&&(this.Ka=t)}},portFromColOffset:{get:function(){return this.u},set:function(t){this.u!==t&&(this.u=t)}},portToColOffset:{get:function(){return this.T},set:function(t){this.T!==t&&(this.T=t)}}}),my.className="LayeredDigraphEdge",f(vy,zf),vy.prototype.cloneProtected=function(t){zf.prototype.cloneProtected.call(this,t),t.vp=this.vp,t.oq=this.oq,t.ts=this.ts,t.jd=this.jd,t.Eb=this.Eb,t.Pd.assign(this.Pd),t.U.copyInheritedPropertiesFrom(this.U),t.V.copyInheritedPropertiesFrom(this.V)},vy.prototype.jb=function(t){t.classType===vy?0===t.name.indexOf("Alignment")?this.alignment=t:0===t.name.indexOf("Arrangement")?this.arrangement=t:0===t.name.indexOf("Compaction")?this.compaction=t:0===t.name.indexOf("Path")?this.path=t:0===t.name.indexOf("Sorting")?this.sorting=t:0===t.name.indexOf("Style")?this.treeStyle=t:w("Unknown enum value: "+t):zf.prototype.jb.call(this,t)},vy.prototype.createNetwork=function(){return new Mm(this)},vy.prototype.makeNetwork=function(t){function e(t){if(t instanceof ec)return!t.isLinkLabel&&"Comment"!==t.category;if(t instanceof Nc){var e=t.fromNode;return null!==e&&!e.isLinkLabel&&"Comment"!==e.category&&(t=t.toNode,null!==t&&!t.isLinkLabel&&"Comment"!==t.category)}return!1}var i=this.createNetwork();return t instanceof Ko?(i.Ag(t.nodes,!0,e),i.Ag(t.links,!0,e)):t instanceof bc?i.Ag(t.memberParts,!1,e):i.Ag(t.iterator,!1,e),i},vy.prototype.doLayout=function(t){null===this.network&&(this.network=this.makeNetwork(t)),this.arrangement!==xm&&(this.arrangementOrigin=this.initialOrigin(this.arrangementOrigin));var e=this.diagram;if(null===e&&t instanceof Ko&&(e=t),this.path===$y&&null!==e?this.kd=e.isTreePathToChildren?Jy:Zy:this.kd=this.path===$y?Jy:this.path,0<this.network.vertexes.count){for(this.network.Bq(),t=this.network.vertexes.iterator;t.next();)e=t.value,e.initialized=!1,e.level=0,e.parent=null,e.children=[];if(0<this.Jb.count){for(t=new nt,e=this.Jb.iterator;e.next();){var i=e.value;i instanceof ec?(i=this.network.kj(i),null!==i&&t.add(i)):i instanceof Sm&&t.add(i)}this.Jb=t}for(0===this.Jb.count&&this.findRoots(),t=this.Jb.copy().iterator;t.next();)e=t.value,e.initialized||(e.initialized=!0,wy(this,e));for(e=this.network.vertexes,t=null;t=xy(e),0<t.count;)e=by(this,t),null!==e&&this.Jb.add(e),e.initialized=!0,wy(this,e),e=t;for(t=this.Jb.iterator;t.next();)e=t.value,e instanceof Sm&&My(this,e);for(t=this.Jb.iterator;t.next();)e=t.value,e instanceof Sm&&Py(this,e);for(t=this.Jb.iterator;t.next();)e=t.value,e instanceof Sm&&Ny(this,e);if(this.Fv(),this.layerStyle===km){for(t=[],e=this.network.vertexes.iterator;e.next();){i=e.value;var n=i.parent;null===n&&(n=i),n=0===n.angle||180===n.angle;var o=t[i.level];void 0===o&&(o=0),t[i.level]=Math.max(o,n?i.width:i.height)}for(e=0;e<t.length;e++)void 0===t[e]&&(t[e]=0);for(this.nx=t,e=this.network.vertexes.iterator;e.next();)i=e.value,n=i.parent,null===n&&(n=i),0===n.angle||180===n.angle?(180===n.angle&&(i.focusX+=t[i.level]-i.width),i.width=t[i.level]):(270===n.angle&&(i.focusY+=t[i.level]-i.height),i.height=t[i.level])}else if(this.layerStyle===wm)for(t=this.network.vertexes.iterator;t.next();){for(e=t.value,i=0===e.angle||180===e.angle,n=-1,o=0;o<e.children.length;o++){var r=e.children[o];n=Math.max(n,i?r.width:r.height)}if(0<=n)for(o=0;o<e.children.length;o++)r=e.children[o],i?(180===e.angle&&(r.focusX+=n-r.width),r.width=n):(270===e.angle&&(r.focusY+=n-r.height),r.height=n)}for(t=this.Jb.iterator;t.next();)e=t.value,e instanceof Sm&&this.layoutTree(e);this.arrangeTrees(),this.updateParts()}this.network=null,this.Jb=new nt,this.isValidLayout=!0},vy.prototype.findRoots=function(){for(var t=this.network.vertexes,e=t.iterator;e.next();){var i=e.value;switch(this.kd){case Jy:0===i.sourceEdges.count&&this.Jb.add(i);break;case Zy:0===i.destinationEdges.count&&this.Jb.add(i);break;default:w("Unhandled path value "+this.kd.toString())}}0===this.Jb.count&&(t=by(this,t),null!==t&&this.Jb.add(t))},vy.prototype.removeChild=function(t,e){if(null!==t&&null!==e){for(var i=t.children,n=0,o=0;o<i.length;o++)i[o]===e&&n++;if(0<n){n=Array(i.length-n);for(var r=o=0;r<i.length;r++)i[r]!==e&&(n[o++]=i[r]);t.children=n}}},vy.prototype.initializeTreeVertexValues=function(t){if(t.copyInheritedPropertiesFrom(Sy(this,t)),null!==t.parent&&t.parent.alignment===hm){for(var e=t.angle,i=t.parent.children,n=0;n<i.length&&t!==i[n];)n++;0===n%2?n!==i.length-1&&(e=90===e?180:180===e?270:270===e?180:270):e=90===e?0:180===e?90:270===e?0:90,t.angle=e}t.initialized=!0},vy.prototype.assignTreeVertexValues=function(){},vy.prototype.sortTreeVertexChildren=function(t){switch(t.sorting){case Qy:break;case tm:t.children.reverse();break;case em:t.children.sort(t.comparer);break;case im:t.children.sort(t.comparer),t.children.reverse();break;default:w("Unhandled sorting value "+t.sorting.toString())}},vy.prototype.Fv=function(){if(this.comments)for(var t=this.network.vertexes.iterator;t.next();)this.addComments(t.value)},vy.prototype.addComments=function(t){var e=t.angle,i=t.parent,n=0,o=!1;null!==i&&(n=i.angle,o=i.alignment,o=Cy(o)),e=90===e||270===e,n=90===n||270===n,i=0===t.childrenCount;var r=0,s=0,a=0,h=t.commentSpacing;if(null!==t.node)for(var l=t.node.Sv();l.next();){var u=l.value;"Comment"===u.category&&u.canLayout()&&(null===t.comments&&(t.comments=[]),t.comments.push(u),u.Ta(),u=u.measuredBounds,e&&!i||!o&&!n&&i||o&&n&&i?(r=Math.max(r,u.width),s+=u.height+Math.abs(a)):(r+=u.width+Math.abs(a),s=Math.max(s,u.height)),a=h)}null!==t.comments&&(e&&!i||!o&&!n&&i||o&&n&&i?(r+=Math.abs(t.commentMargin),s=Math.max(0,s-t.height)):(s+=Math.abs(t.commentMargin),r=Math.max(0,r-t.width)),o=zt.allocAt(0,0,t.bounds.width+r,t.bounds.height+s),t.bounds=o,zt.free(o))},vy.prototype.layoutComments=function(t){if(null!==t.comments){var e=t.node.measuredBounds,i=t.parent,n=t.angle,o=0,r=!1;null!==i&&(o=i.angle,r=i.alignment,r=Cy(r)),n=90===n||270===n,i=90===o||270===o;for(var s=0===t.childrenCount,a=Ay(t),h=0,l=t.comments,u=l.length,c=pt.alloc(),f=0;f<u;f++){var d=l[f],p=d.measuredBounds;if(n&&!s||!r&&!i&&s||r&&i&&s){if(135<o&&!r||i&&a)if(0<=t.commentMargin)for(c.h(t.bounds.x-t.commentMargin-p.width,t.bounds.y+h),d.move(c),d=d.Hd();d.next();){var g=d.value;g.fromSpot=De,g.toSpot=Fe}else for(c.h(t.bounds.x+2*t.focus.x-t.commentMargin,t.bounds.y+h),d.move(c),d=d.Hd();d.next();)g=d.value,g.fromSpot=Fe,g.toSpot=De;else if(0<=t.commentMargin)for(c.h(t.bounds.x+2*t.focus.x+t.commentMargin,t.bounds.y+h),d.move(c),d=d.Hd();d.next();)g=d.value,g.fromSpot=Fe,g.toSpot=De;else for(c.h(t.bounds.x+t.commentMargin-p.width,t.bounds.y+h),d.move(c),d=d.Hd();d.next();)g=d.value,g.fromSpot=De,g.toSpot=Fe;h=0<=t.commentSpacing?h+(p.height+t.commentSpacing):h+(t.commentSpacing-p.height)}else{if(135<o&&!r||!i&&a)if(0<=t.commentMargin)for(c.h(t.bounds.x+h,t.bounds.y-t.commentMargin-p.height),d.move(c),d=d.Hd();d.next();)g=d.value,g.fromSpot=Oe,g.toSpot=Be;else for(c.h(t.bounds.x+h,t.bounds.y+2*t.focus.y-t.commentMargin),d.move(c),d=d.Hd();d.next();)g=d.value,g.fromSpot=Be,g.toSpot=Oe;else if(0<=t.commentMargin)for(c.h(t.bounds.x+h,t.bounds.y+2*t.focus.y+t.commentMargin),d.move(c),d=d.Hd();d.next();)g=d.value,g.fromSpot=Be,g.toSpot=Oe;else for(c.h(t.bounds.x+h,t.bounds.y+t.commentMargin-p.height),d.move(c),d=d.Hd();d.next();)g=d.value,g.fromSpot=Oe,g.toSpot=Be;h=0<=t.commentSpacing?h+(p.width+t.commentSpacing):h+(t.commentSpacing-p.width)}}if(pt.free(c),e=h-t.commentSpacing-(n?e.height:e.width),this.kd===Jy)for(t=t.destinationEdges;t.next();)o=t.value.link,null===o||o.isAvoiding||(o.fromEndSegmentLength=0<e?e:NaN);else for(t=t.sourceEdges;t.next();)o=t.value.link,null===o||o.isAvoiding||(o.toEndSegmentLength=0<e?e:NaN)}},vy.prototype.layoutTree=function(t){if(null!==t){for(var e=t.children,i=e.length,n=0;n<i;n++)this.layoutTree(e[n]);switch(t.compaction){case cm:Ly(this,t);break;case fm:if(t.alignment===hm)Ly(this,t);else if(0===t.childrenCount)n=t.parent,i=!1,e=0,null!==n&&(e=n.angle,i=n.alignment,i=Cy(i)),n=Ay(t),t.S.h(0,0),t.ua.h(t.width,t.height),null===t.parent||null===t.comments||(180!==e&&270!==e||i)&&!n?t.fa.h(0,0):180===e&&!i||(90===e||270===e)&&n?t.fa.h(t.width-2*t.focus.x,0):t.fa.h(0,t.height-2*t.focus.y),t.Pq=null,t.br=null;else{var o=Hy(t);e=90===o||270===o;var r=0,s=t.children,a=s.length;for(i=0;i<a;i++)n=s[i],r=Math.max(r,e?n.ua.width:n.ua.height);var h=t.alignment,l=h===sm,u=Cy(h),c=Math.max(0,t.breadthLimit);i=_y(t);var f=t.nodeSpacing,d=Wy(t),p=t.rowSpacing,g=0;(h===rm||l||t.Sm||t.Tm&&1===t.maxGenerationCount)&&(g=Math.max(0,t.rowIndent)),n=t.width;var y=t.height,m=0,v=0,x=0,b=null,k=null,M=0,S=0,P=0,N=0,C=0,T=0,A=0,L=0;if(u&&!Ty(h)&&135<o&&s.reverse(),Ty(h))if(1<a)for(var D=0;D<a;D++)0===D%2&&D!==a-1&&(L=Math.max(L,e?s[D].ua.width:s[D].ua.height));else 1===a&&(L=e?s[0].ua.width:s[0].ua.height);if(u){switch(h){case am:v=135>o?jy(t,s,L,m,v):Oy(t,s,L,m,v),L=v.x,m=v.width,v=v.height;break;case lm:for(b=0;b<a;b++)k=s[b],c=k.ua,x=0===T?0:p,e?(k.S.h(r-c.width,N+x),m=Math.max(m,c.width),v=Math.max(v,N+x+c.height),N+=x+c.height):(k.S.h(P+x,r-c.height),m=Math.max(m,P+x+c.width),v=Math.max(v,c.height),P+=x+c.width),T++;break;case um:for(b=0;b<a;b++)k=s[b],r=k.ua,c=0===T?0:p,e?(k.S.h(f/2+t.focus.x,N+c),m=Math.max(m,r.width),v=Math.max(v,N+c+r.height),N+=c+r.height):(k.S.h(P+c,f/2+t.focus.y),m=Math.max(m,P+c+r.width),v=Math.max(v,r.height),P+=c+r.width),T++}b=Xy(this,2),k=Xy(this,2),e?(b[0].h(0,0),b[1].h(0,v),k[0].h(m,0)):(b[0].h(0,0),b[1].h(m,0),k[0].h(0,v)),k[1].h(m,v)}else for(D=0;D<a;D++){var F=s[D],B=F.ua;if(e){0<c&&0<T&&P+f+B.width>c&&(P<r&&Ry(t,h,r-P,0,A,D-1),C++,T=0,A=D,x=v,P=0,N=135<o?-v-p:v+p),Vy(this,F,0,N);var I=0;if(0===T)b=F.Pq,k=F.br,M=B.width,S=B.height,(null===b||null===k||o!==Hy(F))&&(b=Xy(this,2),k=Xy(this,2),b[0].h(0,0),b[1].h(0,S),k[0].h(M,0),k[1].h(M,S));else{var E=j();S=Yy(this,t,F,b,k,M,S,E),I=S.x,b=E[0],k=E[1],M=S.width,S=S.height,O(E),P<B.width&&0>I&&(zy(t,-I,0,A,D-1),Gy(b,-I,0),Gy(k,-I,0),I=0)}F.S.h(I,N),m=Math.max(m,M),v=Math.max(v,x+(0===C?0:p)+B.height),P=M}else 0<c&&0<T&&N+f+B.height>c&&(N<r&&Ry(t,h,0,r-N,A,D-1),C++,T=0,A=D,x=m,N=0,P=135<o?-m-p:m+p),Vy(this,F,P,0),I=0,0===T?(b=F.Pq,k=F.br,M=B.width,S=B.height,(null===b||null===k||o!==Hy(F))&&(b=Xy(this,2),k=Xy(this,2),b[0].h(0,0),b[1].h(M,0),k[0].h(0,S),k[1].h(M,S))):(E=j(),S=Yy(this,t,F,b,k,M,S,E),I=S.x,b=E[0],k=E[1],M=S.width,S=S.height,O(E),N<B.height&&0>I&&(zy(t,0,-I,A,D-1),Gy(b,0,-I),Gy(k,0,-I),I=0)),F.S.h(P,I),v=Math.max(v,S),m=Math.max(m,x+(0===C?0:p)+B.width),N=S;T++}switch(0<C&&(e?(v+=Math.max(0,i),P<m&&Ry(t,h,m-P,0,A,a-1),0<g&&(l||zy(t,g,0,0,a-1),m+=g)):(m+=Math.max(0,i),N<v&&Ry(t,h,0,v-N,A,a-1),0<g&&(l||zy(t,0,g,0,a-1),v+=g))),g=l=0,h){case nm:e?l+=m/2-t.focus.x-d/2:g+=v/2-t.focus.y-d/2;break;case om:0<C?e?l+=m/2-t.focus.x-d/2:g+=v/2-t.focus.y-d/2:e?(L=s[0].S.x+s[0].fa.x,l+=L+(s[a-1].S.x+s[a-1].fa.x+2*s[a-1].focus.x-L)/2-t.focus.x-d/2):(L=s[0].S.y+s[0].fa.y,g+=L+(s[a-1].S.y+s[a-1].fa.y+2*s[a-1].focus.y-L)/2-t.focus.y-d/2);break;case rm:e?(l-=d,m+=d):(g-=d,v+=d);break;case sm:e?(l+=m-t.width+d,m+=d):(g+=v-t.height+d,v+=d);break;case am:e?l+=1<a?L+f/2-t.focus.x:s[0].focus.x-t.focus.x+s[0].fa.x:g+=1<a?L+f/2-t.focus.y:s[0].focus.y-t.focus.y+s[0].fa.y;break;case lm:e?l+=m+f/2-t.focus.x:g+=v+f/2-t.focus.y;break;case um:break;default:w("Unhandled alignment value "+h.toString())}for(d=0;d<a;d++)L=s[d],e?L.S.h(L.S.x+L.fa.x-l,L.S.y+(135<o?(u?-v:-L.ua.height)+L.fa.y-i:y+i+L.fa.y)):L.S.h(L.S.x+(135<o?(u?-m:-L.ua.width)+L.fa.x-i:n+i+L.fa.x),L.S.y+L.fa.y-g);if(a=s=0,u?e?(m=By(t,m,l),0>l&&(l=0),135<o&&(g+=v+i),v+=y+i,h===um&&(s+=f/2+t.focus.x),a+=y+i):(135<o&&(l+=m+i),m+=n+i,v=Iy(t,v,g),0>g&&(g=0),h===um&&(a+=f/2+t.focus.y),s+=n+i):e?(null===t.comments?n>m&&(m=Ey(h,n-m,0),s=m.x,a=m.y,m=n,l=0):m=By(t,m,l),0>l&&(s-=l,l=0),135<o&&(g+=v+i),v=Math.max(Math.max(v,y),v+y+i),a+=y+i):(135<o&&(l+=m+i),m=Math.max(Math.max(m,n),m+n+i),null===t.comments?y>v&&(v=Ey(h,0,y-v),s=v.x,a=v.y,v=y,g=0):v=Iy(t,v,g),0>g&&(a-=g,g=0),s+=n+i),0<C)o=Xy(this,4),C=Xy(this,4),e?(o[2].h(0,y+i),o[3].h(o[2].x,v),C[2].h(m,o[2].y),C[3].h(C[2].x,o[3].y)):(o[2].h(n+i,0),o[3].h(m,o[2].y),C[2].h(o[2].x,v),C[3].h(o[3].x,C[2].y));else{for(o=Xy(this,b.length+2),C=Xy(this,k.length+2),h=0;h<b.length;h++)u=b[h],o[h+2].h(u.x+s,u.y+a);for(h=0;h<k.length;h++)u=k[h],C[h+2].h(u.x+s,u.y+a)}e?(o[0].h(l,0),o[1].h(o[0].x,y),o[2].y<o[1].y&&(o[2].x>o[0].x?o[2].assign(o[1]):o[1].assign(o[2])),o[3].y<o[2].y&&(o[3].x>o[0].x?o[3].assign(o[2]):o[2].assign(o[3])),C[0].h(l+n,0),C[1].h(C[0].x,y),C[2].y<C[1].y&&(C[2].x<C[0].x?C[2].assign(C[1]):C[1].assign(C[2])),C[3].y<C[2].y&&(C[3].x<C[0].x?C[3].assign(C[2]):C[2].assign(C[3])),o[2].y-=i/2,C[2].y-=i/2):(o[0].h(0,g),o[1].h(n,o[0].y),o[2].x<o[1].x&&(o[2].y>o[0].y?o[2].assign(o[1]):o[1].assign(o[2])),o[3].x<o[2].x&&(o[3].y>o[0].y?o[3].assign(o[2]):o[2].assign(o[3])),C[0].h(0,g+y),C[1].h(n,C[0].y),C[2].x<C[1].x&&(C[2].y<C[0].y?C[2].assign(C[1]):C[1].assign(C[2])),C[3].x<C[2].x&&(C[3].y<C[0].y?C[3].assign(C[2]):C[2].assign(C[3])),o[2].x-=i/2,C[2].x-=i/2),qy(this,b),qy(this,k),t.Pq=o,t.br=C,t.fa.h(l,g),t.ua.h(m,v)}break;default:w("Unhandled compaction value "+t.compaction.toString())}}},vy.prototype.arrangeTrees=function(){if(this.Eb===xm)for(var t=this.Jb.iterator;t.next();){var e=t.value;if(e instanceof Sm){var i=e.node;if(null!==i){var n=i.position;i=n.x,n=n.y,isFinite(i)||(i=0),isFinite(n)||(n=0),Uy(this,e,i,n)}}}else{for(t=[],e=this.Jb.iterator;e.next();)i=e.value,i instanceof Sm&&t.push(i);switch(this.sorting){case Qy:break;case tm:t.reverse();break;case em:t.sort(this.comparer);break;case im:t.sort(this.comparer),t.reverse();break;default:w("Unhandled sorting value "+this.sorting.toString())}for(i=this.arrangementOrigin,e=i.x,i=i.y,n=0;n<t.length;n++){var o=t[n];switch(Uy(this,o,e+o.fa.x,i+o.fa.y),this.Eb){case mm:i+=o.ua.height+this.Pd.height;break;case vm:e+=o.ua.width+this.Pd.width;break;default:w("Unhandled arrangement value "+this.Eb.toString())}}}},vy.prototype.commitLayout=function(){this.Dw(),this.commitNodes(),this.Iv(),this.isRouting&&this.commitLinks()},vy.prototype.commitNodes=function(){for(var t=this.network.vertexes.iterator;t.next();)t.value.commit();for(t.reset();t.next();)this.layoutComments(t.value)},vy.prototype.Iv=function(){if(this.layerStyle===km){for(var t=this.nx,e=[],i=null,n=this.network.vertexes.iterator;n.next();){var o=n.value;null===i?i=o.bounds.copy():i.Rc(o.bounds);var r=e[o.level];r=void 0===r?_y(o):Math.max(r,_y(o)),e[o.level]=r}for(n=0;n<e.length;n++)void 0===e[n]&&(e[n]=0);if(90===this.angle||270===this.angle?(i.Jc(this.nodeSpacing/2,this.layerSpacing),n=new pt(-this.nodeSpacing/2,-this.layerSpacing/2)):(i.Jc(this.layerSpacing,this.nodeSpacing/2),n=new pt(-this.layerSpacing/2,-this.nodeSpacing/2)),o=[],i=90===this.angle||270===this.angle?i.width:i.height,r=0,180===this.angle||270===this.angle)for(var s=0;s<t.length;s++)r+=t[s]+e[s];for(s=0;s<t.length;s++){var a=t[s]+e[s];270===this.angle?(r-=a,o.push(new zt(0,r,i,a))):90===this.angle?(o.push(new zt(0,r,i,a)),r+=a):180===this.angle?(r-=a,o.push(new zt(r,0,a,i))):(o.push(new zt(r,0,a,i)),r+=a)}this.commitLayers(o,n)}},vy.prototype.commitLayers=function(){},vy.prototype.commitLinks=function(){for(var t=this.network.edges.iterator;t.next();)t.value.commit()},vy.prototype.Dw=function(){for(var t=this.Jb.iterator;t.next();){var e=t.value;e instanceof Sm&&Ky(this,e)}},vy.prototype.setPortSpots=function(t){var e=t.alignment;if(Cy(e)){var i=this.kd===Jy,n=Hy(t);switch(n){case 0:var o=Fe;break;case 90:o=Be;break;case 180:o=De;break;default:o=Oe}var r=t.children,s=r.length;switch(e){case am:case hm:for(e=0;e<s;e++){var a=r[e];if(a=(i?a.sourceEdges:a.destinationEdges).first(),null!==a&&(a=a.link,null!==a)){var h=90===n||270===n?De:Oe;if(1===s||e===s-1&&1===s%2)switch(n){case 0:h=De;break;case 90:h=Oe;break;case 180:h=Fe;break;default:h=Be}else 0===e%2&&(h=90===n||270===n?Fe:Be);i?(t.setsPortSpot&&(a.fromSpot=o),t.setsChildPortSpot&&(a.toSpot=h)):(t.setsPortSpot&&(a.fromSpot=h),t.setsChildPortSpot&&(a.toSpot=o))}}break;case lm:for(n=90===n||270===n?Fe:Be,r=i?t.destinationEdges:t.sourceEdges;r.next();)s=r.value.link,null!==s&&(i?(t.setsPortSpot&&(s.fromSpot=o),t.setsChildPortSpot&&(s.toSpot=n)):(t.setsPortSpot&&(s.fromSpot=n),t.setsChildPortSpot&&(s.toSpot=o)));break;case um:for(n=90===n||270===n?De:Oe,r=i?t.destinationEdges:t.sourceEdges;r.next();)s=r.value.link,null!==s&&(i?(t.setsPortSpot&&(s.fromSpot=o),t.setsChildPortSpot&&(s.toSpot=n)):(t.setsPortSpot&&(s.fromSpot=n),t.setsChildPortSpot&&(s.toSpot=o)))}}else if(i=Hy(t),this.kd===Jy){for(o=t.destinationEdges;o.next();)if(n=o.value.link,null!==n){if(t.setsPortSpot)if(t.portSpot.Mb())switch(i){case 0:n.fromSpot=Fe;break;case 90:n.fromSpot=Be;break;case 180:n.fromSpot=De;break;default:n.fromSpot=Oe}else n.fromSpot=t.portSpot;if(t.setsChildPortSpot)if(t.childPortSpot.Mb())switch(i){case 0:n.toSpot=De;break;case 90:n.toSpot=Oe;break;case 180:n.toSpot=Fe;break;default:n.toSpot=Be}else n.toSpot=t.childPortSpot}}else for(o=t.sourceEdges;o.next();)if(n=o.value.link,null!==n){if(t.setsPortSpot)if(t.portSpot.Mb())switch(i){case 0:n.toSpot=Fe;break;case 90:n.toSpot=Be;break;case 180:n.toSpot=De;break;default:n.toSpot=Oe}else n.toSpot=t.portSpot;if(t.setsChildPortSpot)if(t.childPortSpot.Mb())switch(i){case 0:n.fromSpot=De;break;case 90:n.fromSpot=Oe;break;case 180:n.fromSpot=Fe;break;default:n.fromSpot=Be}else n.fromSpot=t.childPortSpot}},d.Object.defineProperties(vy.prototype,{roots:{get:function(){return this.Jb},set:function(t){this.Jb!==t&&(this.Jb=t,this.B())}},path:{get:function(){return this.vp},set:function(t){this.vp!==t&&(this.vp=t,this.B())}},treeStyle:{get:function(){return this.oq},set:function(t){this.Eb===t||t!==dm&&t!==gm&&t!==pm&&t!==ym||(this.oq=t,this.B())}},layerStyle:{get:function(){return this.ts},set:function(t){this.Eb===t||t!==bm&&t!==wm&&t!==km||(this.ts=t,this.B())}},comments:{get:function(){return this.jd},set:function(t){this.jd!==t&&(this.jd=t,this.B())}},arrangement:{get:function(){return this.Eb},set:function(t){this.Eb===t||t!==mm&&t!==vm&&t!==xm||(this.Eb=t,this.B())}},arrangementSpacing:{get:function(){return this.Pd},set:function(t){this.Pd.w(t)||(this.Pd.assign(t),this.B())}},rootDefaults:{get:function(){return this.U},set:function(t){this.U!==t&&(this.U=t,this.B())}},alternateDefaults:{get:function(){return this.V},set:function(t){this.V!==t&&(this.V=t,this.B())}},sorting:{get:function(){return this.U.sorting},set:function(t){this.U.sorting===t||t!==Qy&&t!==tm&&t!==em&&!im||(this.U.sorting=t,this.B())}},comparer:{get:function(){return this.U.comparer},set:function(t){this.U.comparer!==t&&(this.U.comparer=t,this.B())}},angle:{get:function(){return this.U.angle},set:function(t){this.U.angle!==t&&(0===t||90===t||180===t||270===t?(this.U.angle=t,this.B()):w("TreeLayout.angle must be 0, 90, 180, or 270"))}},alignment:{get:function(){return this.U.alignment},set:function(t){this.U.alignment!==t&&(this.U.alignment=t,this.B())}},nodeIndent:{get:function(){return this.U.nodeIndent},set:function(t){this.U.nodeIndent!==t&&0<=t&&(this.U.nodeIndent=t,this.B())}},nodeIndentPastParent:{get:function(){return this.U.nodeIndentPastParent},set:function(t){this.U.nodeIndentPastParent!==t&&0<=t&&1>=t&&(this.U.nodeIndentPastParent=t,this.B())}},nodeSpacing:{get:function(){return this.U.nodeSpacing},set:function(t){this.U.nodeSpacing!==t&&(this.U.nodeSpacing=t,this.B())}},layerSpacing:{get:function(){return this.U.layerSpacing},set:function(t){this.U.layerSpacing!==t&&(this.U.layerSpacing=t,this.B())}},layerSpacingParentOverlap:{get:function(){return this.U.layerSpacingParentOverlap},set:function(t){this.U.layerSpacingParentOverlap!==t&&0<=t&&1>=t&&(this.U.layerSpacingParentOverlap=t,this.B())}},compaction:{get:function(){return this.U.compaction},set:function(t){this.U.compaction===t||t!==cm&&t!==fm||(this.U.compaction=t,this.B())}},breadthLimit:{get:function(){return this.U.breadthLimit},set:function(t){this.U.breadthLimit!==t&&0<=t&&(this.U.breadthLimit=t,this.B())}},rowSpacing:{get:function(){return this.U.rowSpacing},set:function(t){this.U.rowSpacing!==t&&(this.U.rowSpacing=t,this.B())}},rowIndent:{get:function(){return this.U.rowIndent},set:function(t){this.U.rowIndent!==t&&0<=t&&(this.U.rowIndent=t,this.B())}},commentSpacing:{get:function(){return this.U.commentSpacing},set:function(t){this.U.commentSpacing!==t&&(this.U.commentSpacing=t,this.B())}},commentMargin:{get:function(){return this.U.commentMargin},set:function(t){this.U.commentMargin!==t&&(this.U.commentMargin=t,this.B())}},setsPortSpot:{get:function(){return this.U.setsPortSpot},set:function(t){this.U.setsPortSpot!==t&&(this.U.setsPortSpot=t,this.B())}},portSpot:{get:function(){return this.U.portSpot},set:function(t){this.U.portSpot.w(t)||(this.U.portSpot=t,this.B())}},setsChildPortSpot:{get:function(){return this.U.setsChildPortSpot},set:function(t){this.U.setsChildPortSpot!==t&&(this.U.setsChildPortSpot=t,this.B())}},childPortSpot:{get:function(){return this.U.childPortSpot},set:function(t){this.U.childPortSpot.w(t)||(this.U.childPortSpot=t,this.B())}},alternateSorting:{get:function(){return this.V.sorting},set:function(t){this.V.sorting===t||t!==Qy&&t!==tm&&t!==em&&!im||(this.V.sorting=t,this.B())}},alternateComparer:{get:function(){return this.V.comparer},set:function(t){this.V.comparer!==t&&(this.V.comparer=t,this.B())}},alternateAngle:{get:function(){return this.V.angle},set:function(t){this.V.angle===t||0!==t&&90!==t&&180!==t&&270!==t||(this.V.angle=t,this.B())}},alternateAlignment:{get:function(){return this.V.alignment},set:function(t){this.V.alignment!==t&&(this.V.alignment=t,this.B())}},alternateNodeIndent:{get:function(){return this.V.nodeIndent},set:function(t){this.V.nodeIndent!==t&&0<=t&&(this.V.nodeIndent=t,this.B())}},alternateNodeIndentPastParent:{get:function(){return this.V.nodeIndentPastParent},set:function(t){this.V.nodeIndentPastParent!==t&&0<=t&&1>=t&&(this.V.nodeIndentPastParent=t,this.B())}},alternateNodeSpacing:{get:function(){return this.V.nodeSpacing},set:function(t){this.V.nodeSpacing!==t&&(this.V.nodeSpacing=t,this.B())}},alternateLayerSpacing:{get:function(){return this.V.layerSpacing},set:function(t){this.V.layerSpacing!==t&&(this.V.layerSpacing=t,this.B())}},alternateLayerSpacingParentOverlap:{get:function(){return this.V.layerSpacingParentOverlap},set:function(t){this.V.layerSpacingParentOverlap!==t&&0<=t&&1>=t&&(this.V.layerSpacingParentOverlap=t,this.B())}},alternateCompaction:{get:function(){return this.V.compaction},set:function(t){this.V.compaction===t||t!==cm&&t!==fm||(this.V.compaction=t,this.B())}},alternateBreadthLimit:{get:function(){return this.V.breadthLimit},set:function(t){this.V.breadthLimit!==t&&0<=t&&(this.V.breadthLimit=t,this.B())}},alternateRowSpacing:{get:function(){return this.V.rowSpacing},set:function(t){this.V.rowSpacing!==t&&(this.V.rowSpacing=t,this.B())}},alternateRowIndent:{get:function(){return this.V.rowIndent},set:function(t){this.V.rowIndent!==t&&0<=t&&(this.V.rowIndent=t,this.B())}},alternateCommentSpacing:{get:function(){return this.V.commentSpacing},set:function(t){this.V.commentSpacing!==t&&(this.V.commentSpacing=t,this.B())}},alternateCommentMargin:{get:function(){return this.V.commentMargin},set:function(t){this.V.commentMargin!==t&&(this.V.commentMargin=t,this.B())}},alternateSetsPortSpot:{get:function(){return this.V.setsPortSpot},set:function(t){this.V.setsPortSpot!==t&&(this.V.setsPortSpot=t,this.B())}},alternatePortSpot:{get:function(){return this.V.portSpot},set:function(t){this.V.portSpot.w(t)||(this.V.portSpot=t,this.B())}},alternateSetsChildPortSpot:{get:function(){return this.V.setsChildPortSpot},set:function(t){this.V.setsChildPortSpot!==t&&(this.V.setsChildPortSpot=t,this.B())}},alternateChildPortSpot:{get:function(){return this.V.childPortSpot},set:function(t){this.V.childPortSpot.w(t)||(this.V.childPortSpot=t,this.B())}}});var $y=new U(vy,"PathDefault",-1),Jy=new U(vy,"PathDestination",0),Zy=new U(vy,"PathSource",1),Qy=new U(vy,"SortingForwards",10),tm=new U(vy,"SortingReverse",11),em=new U(vy,"SortingAscending",12),im=new U(vy,"SortingDescending",13),nm=new U(vy,"AlignmentCenterSubtrees",20),om=new U(vy,"AlignmentCenterChildren",21),rm=new U(vy,"AlignmentStart",22),sm=new U(vy,"AlignmentEnd",23),am=new U(vy,"AlignmentBus",24),hm=new U(vy,"AlignmentBusBranching",25),lm=new U(vy,"AlignmentTopLeftBus",26),um=new U(vy,"AlignmentBottomRightBus",27),cm=new U(vy,"CompactionNone",30),fm=new U(vy,"CompactionBlock",31),dm=new U(vy,"StyleLayered",40),pm=new U(vy,"StyleLastParents",41),gm=new U(vy,"StyleAlternating",42),ym=new U(vy,"StyleRootOnly",43),mm=new U(vy,"ArrangementVertical",50),vm=new U(vy,"ArrangementHorizontal",51),xm=new U(vy,"ArrangementFixedRoots",52),bm=new U(vy,"LayerIndividual",60),wm=new U(vy,"LayerSiblings",61),km=new U(vy,"LayerUniform",62);function Mm(t){Qf.call(this,t)}function Sm(t){rd.call(this,t),this.Ka=!1,this.Cc=null,this.I=[],this.Sc=this.eb=this.T=this.La=0,this.jd=null,this.S=new pt(0,0),this.ua=new Bt(0,0),this.fa=new pt(0,0),this.Tm=this.Sm=this.ZA=!1,this.br=this.Pq=null,this.bd=Qy,this.Wc=sd,this.Yb=0,this.yb=om,this.Ds=this.Cs=0,this.Es=20,this.ue=50,this.ss=0,this.Er=fm,this.wr=0,this.Rs=25,this.Dr=this.Qs=10,this.Cr=20,this.dt=!0,this.Ms=Ce,this.ct=!0,this.zr=Ce}function Pm(t){ad.call(this,t),this.lv=new pt(0,0)}vy.className="TreeLayout",vy.PathDefault=$y,vy.PathDestination=Jy,vy.PathSource=Zy,vy.SortingForwards=Qy,vy.SortingReverse=tm,vy.SortingAscending=em,vy.SortingDescending=im,vy.AlignmentCenterSubtrees=nm,vy.AlignmentCenterChildren=om,vy.AlignmentStart=rm,vy.AlignmentEnd=sm,vy.AlignmentBus=am,vy.AlignmentBusBranching=hm,vy.AlignmentTopLeftBus=lm,vy.AlignmentBottomRightBus=um,vy.CompactionNone=cm,vy.CompactionBlock=fm,vy.StyleLayered=dm,vy.StyleLastParents=pm,vy.StyleAlternating=gm,vy.StyleRootOnly=ym,vy.ArrangementVertical=mm,vy.ArrangementHorizontal=vm,vy.ArrangementFixedRoots=xm,vy.LayerIndividual=bm,vy.LayerSiblings=wm,vy.LayerUniform=km,f(Mm,Qf),Mm.prototype.createVertex=function(){return new Sm(this)},Mm.prototype.createEdge=function(){return new Pm(this)},Mm.className="TreeNetwork",f(Sm,rd),Sm.prototype.copyInheritedPropertiesFrom=function(t){null!==t&&(this.bd=t.sorting,this.Wc=t.comparer,this.Yb=t.angle,this.yb=t.alignment,this.Cs=t.nodeIndent,this.Ds=t.nodeIndentPastParent,this.Es=t.nodeSpacing,this.ue=t.layerSpacing,this.ss=t.layerSpacingParentOverlap,this.Er=t.compaction,this.wr=t.breadthLimit,this.Rs=t.rowSpacing,this.Qs=t.rowIndent,this.Dr=t.commentSpacing,this.Cr=t.commentMargin,this.dt=t.setsPortSpot,this.Ms=t.portSpot,this.ct=t.setsChildPortSpot,this.zr=t.childPortSpot)},d.Object.defineProperties(Sm.prototype,{initialized:{get:function(){return this.Ka},set:function(t){this.Ka!==t&&(this.Ka=t)}},parent:{get:function(){return this.Cc},set:function(t){this.Cc!==t&&(this.Cc=t)}},children:{get:function(){return this.I},set:function(t){if(this.I!==t){if(null!==t)for(var e=t.length,i=0;i<e;i++);this.I=t}}},level:{get:function(){return this.La},set:function(t){this.La!==t&&(this.La=t)}},descendantCount:{get:function(){return this.T},set:function(t){this.T!==t&&(this.T=t)}},maxChildrenCount:{get:function(){return this.eb},set:function(t){this.eb!==t&&(this.eb=t)}},maxGenerationCount:{get:function(){return this.Sc},set:function(t){this.Sc!==t&&(this.Sc=t)}},comments:{get:function(){return this.jd},set:function(t){if(this.jd!==t){if(null!==t)for(var e=t.length,i=0;i<e;i++);this.jd=t}}},sorting:{get:function(){return this.bd},set:function(t){this.bd!==t&&(this.bd=t)}},comparer:{get:function(){return this.Wc},set:function(t){this.Wc!==t&&(this.Wc=t)}},angle:{get:function(){return this.Yb},set:function(t){this.Yb!==t&&(this.Yb=t)}},alignment:{get:function(){return this.yb},set:function(t){this.yb!==t&&(this.yb=t)}},nodeIndent:{get:function(){return this.Cs},set:function(t){this.Cs!==t&&(this.Cs=t)}},nodeIndentPastParent:{get:function(){return this.Ds},set:function(t){this.Ds!==t&&(this.Ds=t)}},nodeSpacing:{get:function(){return this.Es},set:function(t){this.Es!==t&&(this.Es=t)}},layerSpacing:{get:function(){return this.ue},set:function(t){this.ue!==t&&(this.ue=t)}},layerSpacingParentOverlap:{get:function(){return this.ss},set:function(t){this.ss!==t&&(this.ss=t)}},compaction:{get:function(){return this.Er},set:function(t){this.Er!==t&&(this.Er=t)}},breadthLimit:{get:function(){return this.wr},set:function(t){this.wr!==t&&(this.wr=t)}},rowSpacing:{get:function(){return this.Rs},set:function(t){this.Rs!==t&&(this.Rs=t)}},rowIndent:{get:function(){return this.Qs},set:function(t){this.Qs!==t&&(this.Qs=t)}},commentSpacing:{get:function(){return this.Dr},set:function(t){this.Dr!==t&&(this.Dr=t)}},commentMargin:{get:function(){return this.Cr},set:function(t){this.Cr!==t&&(this.Cr=t)}},setsPortSpot:{get:function(){return this.dt},set:function(t){this.dt!==t&&(this.dt=t)}},portSpot:{get:function(){return this.Ms},set:function(t){this.Ms.w(t)||(this.Ms=t)}},setsChildPortSpot:{get:function(){return this.ct},set:function(t){this.ct!==t&&(this.ct=t)}},childPortSpot:{get:function(){return this.zr},set:function(t){this.zr.w(t)||(this.zr=t)}},childrenCount:{get:function(){return this.children.length}},relativePosition:{get:function(){return this.S},set:function(t){this.S.set(t)}},subtreeSize:{get:function(){return this.ua},set:function(t){this.ua.set(t)}},subtreeOffset:{get:function(){return this.fa},set:function(t){this.fa.set(t)}}}),Sm.className="TreeVertex",f(Pm,ad),Pm.prototype.commit=function(){var t=this.link;if(null!==t&&!t.isAvoiding){var e=this.network.layout,i=null,n=null;switch(e.kd){case Jy:i=this.fromVertex,n=this.toVertex;break;case Zy:i=this.toVertex,n=this.fromVertex;break;default:w("Unhandled path value "+e.kd.toString())}if(null!==i&&null!==n)if(e=this.lv,0!==e.x||0!==e.y||i.ZA){n=i.bounds;var o=Hy(i),r=_y(i),s=i.rowSpacing;t.xj();var a,h=t.curve===ef,l=t.isOrthogonal;if(t.Th(),l||h){for(a=2;4<t.pointsCount;)t.uw(2);var u=t.i(1),c=t.i(2)}else{for(a=1;3<t.pointsCount;)t.uw(1);u=t.i(0),c=t.i(t.pointsCount-1)}var f=t.i(t.pointsCount-1);0===o?(i.alignment===sm?(o=n.bottom+e.y,0===e.y&&u.y>f.y+i.rowIndent&&(o=Math.min(o,Math.max(u.y,o-Wy(i))))):i.alignment===rm?(o=n.top+e.y,0===e.y&&u.y<f.y-i.rowIndent&&(o=Math.max(o,Math.min(u.y,o+Wy(i))))):o=i.Sm||i.Tm&&1===i.maxGenerationCount?n.top-i.fa.y+e.y:n.y+n.height/2+e.y,h?(t.m(a,u.x,o),a++,t.m(a,n.right+r,o),a++,t.m(a,n.right+r+(e.x-s)/3,o),a++,t.m(a,n.right+r+2*(e.x-s)/3,o),a++,t.m(a,n.right+r+(e.x-s),o),a++,t.m(a,c.x,o)):(l&&(t.m(a,n.right+r/2,u.y),a++),t.m(a,n.right+r/2,o),a++,t.m(a,n.right+r+e.x-(l?s/2:s),o),a++,l&&t.m(a,t.i(a-1).x,c.y))):90===o?(i.alignment===sm?(o=n.right+e.x,0===e.x&&u.x>f.x+i.rowIndent&&(o=Math.min(o,Math.max(u.x,o-Wy(i))))):i.alignment===rm?(o=n.left+e.x,0===e.x&&u.x<f.x-i.rowIndent&&(o=Math.max(o,Math.min(u.x,o+Wy(i))))):o=i.Sm||i.Tm&&1===i.maxGenerationCount?n.left-i.fa.x+e.x:n.x+n.width/2+e.x,h?(t.m(a,o,u.y),a++,t.m(a,o,n.bottom+r),a++,t.m(a,o,n.bottom+r+(e.y-s)/3),a++,t.m(a,o,n.bottom+r+2*(e.y-s)/3),a++,t.m(a,o,n.bottom+r+(e.y-s)),a++,t.m(a,o,c.y)):(l&&(t.m(a,u.x,n.bottom+r/2),a++),t.m(a,o,n.bottom+r/2),a++,t.m(a,o,n.bottom+r+e.y-(l?s/2:s)),a++,l&&t.m(a,c.x,t.i(a-1).y))):180===o?(i.alignment===sm?(o=n.bottom+e.y,0===e.y&&u.y>f.y+i.rowIndent&&(o=Math.min(o,Math.max(u.y,o-Wy(i))))):i.alignment===rm?(o=n.top+e.y,0===e.y&&u.y<f.y-i.rowIndent&&(o=Math.max(o,Math.min(u.y,o+Wy(i))))):o=i.Sm||i.Tm&&1===i.maxGenerationCount?n.top-i.fa.y+e.y:n.y+n.height/2+e.y,h?(t.m(a,u.x,o),a++,t.m(a,n.left-r,o),a++,t.m(a,n.left-r+(e.x+s)/3,o),a++,t.m(a,n.left-r+2*(e.x+s)/3,o),a++,t.m(a,n.left-r+(e.x+s),o),a++,t.m(a,c.x,o)):(l&&(t.m(a,n.left-r/2,u.y),a++),t.m(a,n.left-r/2,o),a++,t.m(a,n.left-r+e.x+(l?s/2:s),o),a++,l&&t.m(a,t.i(a-1).x,c.y))):270===o?(i.alignment===sm?(o=n.right+e.x,0===e.x&&u.x>f.x+i.rowIndent&&(o=Math.min(o,Math.max(u.x,o-Wy(i))))):i.alignment===rm?(o=n.left+e.x,0===e.x&&u.x<f.x-i.rowIndent&&(o=Math.max(o,Math.min(u.x,o+Wy(i))))):o=i.Sm||i.Tm&&1===i.maxGenerationCount?n.left-i.fa.x+e.x:n.x+n.width/2+e.x,h?(t.m(a,o,u.y),a++,t.m(a,o,n.top-r),a++,t.m(a,o,n.top-r+(e.y+s)/3),a++,t.m(a,o,n.top-r+2*(e.y+s)/3),a++,t.m(a,o,n.top-r+(e.y+s)),a++,t.m(a,o,c.y)):(l&&(t.m(a,u.x,n.top-r/2),a++),t.m(a,o,n.top-r/2),a++,t.m(a,o,n.top-r+e.y+(l?s/2:s)),a++,l&&t.m(a,c.x,t.i(a-1).y))):w("Invalid angle "+o),t.xf()}else t=this.link,r=Hy(i),r!==Hy(n)&&(s=_y(i),h=i.bounds,i=n.bounds,0===r&&i.left-h.right<s+1||90===r&&i.top-h.bottom<s+1||180===r&&h.left-i.right<s+1||270===r&&h.top-i.bottom<s+1||(t.xj(),i=t.curve===ef,e=t.isOrthogonal,n=Cy(this.fromVertex.alignment),t.Th(),0===r?(r=h.right+s/2,i?4===t.pointsCount&&(i=t.i(3).y,t.L(1,r-20,t.i(1).y),t.m(2,r-20,i),t.m(3,r,i),t.m(4,r+20,i),t.L(5,t.i(5).x,i)):e?n?t.L(3,t.i(2).x,t.i(4).y):6===t.pointsCount&&(t.L(2,r,t.i(2).y),t.L(3,r,t.i(3).y)):4===t.pointsCount?t.m(2,r,t.i(2).y):3===t.pointsCount?t.L(1,r,t.i(2).y):2===t.pointsCount&&t.m(1,r,t.i(1).y)):90===r?(r=h.bottom+s/2,i?4===t.pointsCount&&(i=t.i(3).x,t.L(1,t.i(1).x,r-20),t.m(2,i,r-20),t.m(3,i,r),t.m(4,i,r+20),t.L(5,i,t.i(5).y)):e?n?t.L(3,t.i(2).x,t.i(4).y):6===t.pointsCount&&(t.L(2,t.i(2).x,r),t.L(3,t.i(3).x,r)):4===t.pointsCount?t.m(2,t.i(2).x,r):3===t.pointsCount?t.L(1,t.i(2).x,r):2===t.pointsCount&&t.m(1,t.i(1).x,r)):180===r?(r=h.left-s/2,i?4===t.pointsCount&&(i=t.i(3).y,t.L(1,r+20,t.i(1).y),t.m(2,r+20,i),t.m(3,r,i),t.m(4,r-20,i),t.L(5,t.i(5).x,i)):e?n?t.L(3,t.i(2).x,t.i(4).y):6===t.pointsCount&&(t.L(2,r,t.i(2).y),t.L(3,r,t.i(3).y)):4===t.pointsCount?t.m(2,r,t.i(2).y):3===t.pointsCount?t.L(1,r,t.i(2).y):2===t.pointsCount&&t.m(1,r,t.i(1).y)):270===r&&(r=h.top-s/2,i?4===t.pointsCount&&(i=t.i(3).x,t.L(1,t.i(1).x,r+20),t.m(2,i,r+20),t.m(3,i,r),t.m(4,i,r-20),t.L(5,i,t.i(5).y)):e?n?t.L(3,t.i(2).x,t.i(4).y):6===t.pointsCount&&(t.L(2,t.i(2).x,r),t.L(3,t.i(3).x,r)):4===t.pointsCount?t.m(2,t.i(2).x,r):3===t.pointsCount?t.L(1,t.i(2).x,r):2===t.pointsCount&&t.m(1,t.i(1).x,r)),t.xf()))}},d.Object.defineProperties(Pm.prototype,{fromVertex:{get:function(){return this.Yc},set:function(t){this.Yc!==t&&(this.Yc=t)}},toVertex:{get:function(){return this.ed},set:function(t){this.ed!==t&&(this.ed=t)}},relativePoint:{get:function(){return this.lv},set:function(t){this.lv.set(t)}}}),Pm.className="TreeEdge",Di.prototype.initializeStandardTools=function(){this.Ya("Action",new Ln,this.mouseDownTools),this.Ya("Relinking",new xn,this.mouseDownTools),this.Ya("LinkReshaping",new wn,this.mouseDownTools),this.Ya("Rotating",new Tn,this.mouseDownTools),this.Ya("Resizing",new Cn,this.mouseDownTools),this.Ya("Linking",new gn,this.mouseMoveTools),this.Ya("Dragging",new Gi,this.mouseMoveTools),this.Ya("DragSelecting",new On,this.mouseMoveTools),this.Ya("Panning",new Dn,this.mouseMoveTools),this.Ya("ContextMenu",new In,this.mouseUpTools),this.Ya("TextEditing",new Kn,this.mouseUpTools),this.Ya("ClickCreating",new jn,this.mouseUpTools),this.Ya("ClickSelecting",new An,this.mouseUpTools)},ml("Horizontal",new Oh),ml("Spot",new Fh),ml("Table",new Ih),ml("Viewbox",new zh),ml("TableRow",new Eh),ml("TableColumn",new Rh),ml("Graduated",new qh),ml("Grid",new Vh),ds.add("GraphLinksModel",Ad),ds.add("TreeModel",Dd),qf(ag,null),qf(kg,null);var Nm=y.go,Cm={get licenseKey(){return Ko.licenseKey},set licenseKey(t){Ko.licenseKey=t},get version(){return Ko.version},Group:bc,EnumValue:U,List:et,Set:nt,Map:dt,Point:pt,Size:Bt,Rect:zt,Margin:Qt,Spot:Ge,Geometry:We,PathFigure:ci,PathSegment:fi,InputEvent:wi,DiagramEvent:ki,ChangedEvent:Mi,Model:Bd,GraphLinksModel:yp,TreeModel:Cp,Binding:cp,Transaction:Ti,UndoManager:Ai,CommandHandler:ha,Tool:ji,DraggingTool:Gi,DraggingInfo:Ys,DraggingOptions:ea,LinkingBaseTool:un,LinkingTool:gn,RelinkingTool:xn,LinkReshapingTool:wn,ResizingTool:Cn,RotatingTool:Tn,ClickSelectingTool:An,ActionTool:Ln,ClickCreatingTool:jn,HTMLInfo:Fn,ContextMenuTool:In,DragSelectingTool:On,PanningTool:Dn,TextEditingTool:Kn,ToolManager:Di,Animation:To,AnimationManager:lo,AnimationTrigger:Eo,Layer:Yo,Diagram:Ko,Palette:ia,Overview:oa,Brush:eh,GraphObject:ca,Panel:Uh,RowColumnDefinition:wl,Shape:Nl,TextBlock:Il,TextBlockMetrics:uu,Picture:cu,Part:Lu,Adornment:Qu,Node:ec,Link:Nc,Placeholder:Pc,Layout:zf,LayoutNetwork:Qf,LayoutVertex:rd,LayoutEdge:ad,GridLayout:hd,PanelLayout:Lh,CircularLayout:Tp,CircularNetwork:ng,CircularVertex:og,CircularEdge:sg,ForceDirectedLayout:ag,ForceDirectedNetwork:vg,ForceDirectedVertex:xg,ForceDirectedEdge:bg,LayeredDigraphLayout:kg,LayeredDigraphNetwork:gy,LayeredDigraphVertex:yy,LayeredDigraphEdge:my,TreeLayout:vy,TreeNetwork:Mm,TreeVertex:Sm,TreeEdge:Pm};"object"===typeof Nm&&Nm.version&&w("WARNING: a `go` object on the root object is already defined.  "+("Debug"in Nm?"debug ":"")+"version: "+Nm.version+", replaced with version: "+Cm.version),Ko.prototype.go=Cm,y.go=Cm,("undefined"===typeof y||"undefined"===typeof y.module||"object"!==typeof y.module.exports)&&y.define&&"function"===typeof y.define&&y.define.amd&&y.define(Cm),"object"===typeof t.exports&&(t.exports="undefined"!==typeof e?e.go:self.go)})()}).call(this,i("c8ba"))},7156:function(t,e,i){var n=i("1626"),o=i("861d"),r=i("d2bb");t.exports=function(t,e,i){var s,a;return r&&n(s=e.constructor)&&s!==i&&o(a=s.prototype)&&a!==i.prototype&&r(t,a),t}},7418:function(t,e){e.f=Object.getOwnPropertySymbols},7839:function(t,e){t.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},"7b0b":function(t,e,i){var n=i("da84"),o=i("1d80"),r=n.Object;t.exports=function(t){return r(o(t))}},"7c73":function(t,e,i){var n,o=i("825a"),r=i("37e8"),s=i("7839"),a=i("d012"),h=i("1be4"),l=i("cc12"),u=i("f772"),c=">",f="<",d="prototype",p="script",g=u("IE_PROTO"),y=function(){},m=function(t){return f+p+c+t+f+"/"+p+c},v=function(t){t.write(m("")),t.close();var e=t.parentWindow.Object;return t=null,e},x=function(){var t,e=l("iframe"),i="java"+p+":";return e.style.display="none",h.appendChild(e),e.src=String(i),t=e.contentWindow.document,t.open(),t.write(m("document.F=Object")),t.close(),t.F},b=function(){try{n=new ActiveXObject("htmlfile")}catch(e){}b="undefined"!=typeof document?document.domain&&n?v(n):x():v(n);var t=s.length;while(t--)delete b[d][s[t]];return b()};a[g]=!0,t.exports=Object.create||function(t,e){var i;return null!==t?(y[d]=o(t),i=new y,y[d]=null,i[g]=t):i=b(),void 0===e?i:r(i,e)}},"7dd0":function(t,e,i){"use strict";var n=i("23e7"),o=i("c65b"),r=i("c430"),s=i("5e77"),a=i("1626"),h=i("9ed3"),l=i("e163"),u=i("d2bb"),c=i("d44e"),f=i("9112"),d=i("6eeb"),p=i("b622"),g=i("3f8c"),y=i("ae93"),m=s.PROPER,v=s.CONFIGURABLE,x=y.IteratorPrototype,b=y.BUGGY_SAFARI_ITERATORS,w=p("iterator"),k="keys",M="values",S="entries",P=function(){return this};t.exports=function(t,e,i,s,p,y,N){h(i,e,s);var C,T,A,L=function(t){if(t===p&&B)return B;if(!b&&t in D)return D[t];switch(t){case k:return function(){return new i(this,t)};case M:return function(){return new i(this,t)};case S:return function(){return new i(this,t)}}return function(){return new i(this)}},j=e+" Iterator",O=!1,D=t.prototype,F=D[w]||D["@@iterator"]||p&&D[p],B=!b&&F||L(p),I="Array"==e&&D.entries||F;if(I&&(C=l(I.call(new t)),C!==Object.prototype&&C.next&&(r||l(C)===x||(u?u(C,x):a(C[w])||d(C,w,P)),c(C,j,!0,!0),r&&(g[j]=P))),m&&p==M&&F&&F.name!==M&&(!r&&v?f(D,"name",M):(O=!0,B=function(){return o(F,this)})),p)if(T={values:L(M),keys:y?B:L(k),entries:L(S)},N)for(A in T)(b||O||!(A in D))&&d(D,A,T[A]);else n({target:e,proto:!0,forced:b||O},T);return r&&!N||D[w]===B||d(D,w,B,{name:p}),g[e]=B,T}},"7f9a":function(t,e,i){var n=i("da84"),o=i("1626"),r=i("8925"),s=n.WeakMap;t.exports=o(s)&&/native code/.test(r(s))},"825a":function(t,e,i){var n=i("da84"),o=i("861d"),r=n.String,s=n.TypeError;t.exports=function(t){if(o(t))return t;throw s(r(t)+" is not an object")}},"83ab":function(t,e,i){var n=i("d039");t.exports=!n((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},"861d":function(t,e,i){var n=i("1626");t.exports=function(t){return"object"==typeof t?null!==t:n(t)}},8925:function(t,e,i){var n=i("e330"),o=i("1626"),r=i("c6cd"),s=n(Function.toString);o(r.inspectSource)||(r.inspectSource=function(t){return s(t)}),t.exports=r.inspectSource},"90e3":function(t,e,i){var n=i("e330"),o=0,r=Math.random(),s=n(1..toString);t.exports=function(t){return"Symbol("+(void 0===t?"":t)+")_"+s(++o+r,36)}},9112:function(t,e,i){var n=i("83ab"),o=i("9bf2"),r=i("5c6c");t.exports=n?function(t,e,i){return o.f(t,e,r(1,i))}:function(t,e,i){return t[e]=i,t}},9263:function(t,e,i){"use strict";var n=i("c65b"),o=i("e330"),r=i("577e"),s=i("ad6d"),a=i("9f7f"),h=i("5692"),l=i("7c73"),u=i("69f3").get,c=i("fce3"),f=i("107c"),d=h("native-string-replace",String.prototype.replace),p=RegExp.prototype.exec,g=p,y=o("".charAt),m=o("".indexOf),v=o("".replace),x=o("".slice),b=function(){var t=/a/,e=/b*/g;return n(p,t,"a"),n(p,e,"a"),0!==t.lastIndex||0!==e.lastIndex}(),w=a.UNSUPPORTED_Y||a.BROKEN_CARET,k=void 0!==/()??/.exec("")[1],M=b||k||w||c||f;M&&(g=function(t){var e,i,o,a,h,c,f,M=this,S=u(M),P=r(t),N=S.raw;if(N)return N.lastIndex=M.lastIndex,e=n(g,N,P),M.lastIndex=N.lastIndex,e;var C=S.groups,T=w&&M.sticky,A=n(s,M),L=M.source,j=0,O=P;if(T&&(A=v(A,"y",""),-1===m(A,"g")&&(A+="g"),O=x(P,M.lastIndex),M.lastIndex>0&&(!M.multiline||M.multiline&&"\n"!==y(P,M.lastIndex-1))&&(L="(?: "+L+")",O=" "+O,j++),i=new RegExp("^(?:"+L+")",A)),k&&(i=new RegExp("^"+L+"$(?!\\s)",A)),b&&(o=M.lastIndex),a=n(p,T?i:M,O),T?a?(a.input=x(a.input,j),a[0]=x(a[0],j),a.index=M.lastIndex,M.lastIndex+=a[0].length):M.lastIndex=0:b&&a&&(M.lastIndex=M.global?a.index+a[0].length:o),k&&a&&a.length>1&&n(d,a[0],i,(function(){for(h=1;h<arguments.length-2;h++)void 0===arguments[h]&&(a[h]=void 0)})),a&&C)for(a.groups=c=l(null),h=0;h<C.length;h++)f=C[h],c[f[0]]=a[f[1]];return a}),t.exports=g},"94ca":function(t,e,i){var n=i("d039"),o=i("1626"),r=/#|\.prototype\./,s=function(t,e){var i=h[a(t)];return i==u||i!=l&&(o(e)?n(e):!!e)},a=s.normalize=function(t){return String(t).replace(r,".").toLowerCase()},h=s.data={},l=s.NATIVE="N",u=s.POLYFILL="P";t.exports=s},"9a1f":function(t,e,i){var n=i("da84"),o=i("c65b"),r=i("59ed"),s=i("825a"),a=i("0d51"),h=i("35a1"),l=n.TypeError;t.exports=function(t,e){var i=arguments.length<2?h(t):e;if(r(i))return s(o(i,t));throw l(a(t)+" is not iterable")}},"9bf2":function(t,e,i){var n=i("da84"),o=i("83ab"),r=i("0cfb"),s=i("825a"),a=i("a04b"),h=n.TypeError,l=Object.defineProperty;e.f=o?l:function(t,e,i){if(s(t),e=a(e),s(i),r)try{return l(t,e,i)}catch(n){}if("get"in i||"set"in i)throw h("Accessors not supported");return"value"in i&&(t[e]=i.value),t}},"9ed3":function(t,e,i){"use strict";var n=i("ae93").IteratorPrototype,o=i("7c73"),r=i("5c6c"),s=i("d44e"),a=i("3f8c"),h=function(){return this};t.exports=function(t,e,i){var l=e+" Iterator";return t.prototype=o(n,{next:r(1,i)}),s(t,l,!1,!0),a[l]=h,t}},"9f7f":function(t,e,i){var n=i("d039"),o=i("da84"),r=o.RegExp;e.UNSUPPORTED_Y=n((function(){var t=r("a","y");return t.lastIndex=2,null!=t.exec("abcd")})),e.BROKEN_CARET=n((function(){var t=r("^r","gy");return t.lastIndex=2,null!=t.exec("str")}))},a04b:function(t,e,i){var n=i("c04e"),o=i("d9b5");t.exports=function(t){var e=n(t,"string");return o(e)?e:e+""}},a4b4:function(t,e,i){var n=i("342f");t.exports=/web0s(?!.*chrome)/i.test(n)},a79d:function(t,e,i){"use strict";var n=i("23e7"),o=i("c430"),r=i("fea9"),s=i("d039"),a=i("d066"),h=i("1626"),l=i("4840"),u=i("cdf9"),c=i("6eeb"),f=!!r&&s((function(){r.prototype["finally"].call({then:function(){}},(function(){}))}));if(n({target:"Promise",proto:!0,real:!0,forced:f},{finally:function(t){var e=l(this,a("Promise")),i=h(t);return this.then(i?function(i){return u(e,t()).then((function(){return i}))}:t,i?function(i){return u(e,t()).then((function(){throw i}))}:t)}}),!o&&h(r)){var d=a("Promise").prototype["finally"];r.prototype["finally"]!==d&&c(r.prototype,"finally",d,{unsafe:!0})}},ac1f:function(t,e,i){"use strict";var n=i("23e7"),o=i("9263");n({target:"RegExp",proto:!0,forced:/./.exec!==o},{exec:o})},ad6d:function(t,e,i){"use strict";var n=i("825a");t.exports=function(){var t=n(this),e="";return t.global&&(e+="g"),t.ignoreCase&&(e+="i"),t.multiline&&(e+="m"),t.dotAll&&(e+="s"),t.unicode&&(e+="u"),t.sticky&&(e+="y"),e}},ae93:function(t,e,i){"use strict";var n,o,r,s=i("d039"),a=i("1626"),h=i("7c73"),l=i("e163"),u=i("6eeb"),c=i("b622"),f=i("c430"),d=c("iterator"),p=!1;[].keys&&(r=[].keys(),"next"in r?(o=l(l(r)),o!==Object.prototype&&(n=o)):p=!0);var g=void 0==n||s((function(){var t={};return n[d].call(t)!==t}));g?n={}:f&&(n=h(n)),a(n[d])||u(n,d,(function(){return this})),t.exports={IteratorPrototype:n,BUGGY_SAFARI_ITERATORS:p}},b575:function(t,e,i){var n,o,r,s,a,h,l,u,c=i("da84"),f=i("0366"),d=i("06cf").f,p=i("2cf4").set,g=i("1cdc"),y=i("d4c3"),m=i("a4b4"),v=i("605d"),x=c.MutationObserver||c.WebKitMutationObserver,b=c.document,w=c.process,k=c.Promise,M=d(c,"queueMicrotask"),S=M&&M.value;S||(n=function(){var t,e;v&&(t=w.domain)&&t.exit();while(o){e=o.fn,o=o.next;try{e()}catch(i){throw o?s():r=void 0,i}}r=void 0,t&&t.enter()},g||v||m||!x||!b?!y&&k&&k.resolve?(l=k.resolve(void 0),l.constructor=k,u=f(l.then,l),s=function(){u(n)}):v?s=function(){w.nextTick(n)}:(p=f(p,c),s=function(){p(n)}):(a=!0,h=b.createTextNode(""),new x(n).observe(h,{characterData:!0}),s=function(){h.data=a=!a})),t.exports=S||function(t){var e={fn:t,next:void 0};r&&(r.next=e),o||(o=e,s()),r=e}},b622:function(t,e,i){var n=i("da84"),o=i("5692"),r=i("1a2d"),s=i("90e3"),a=i("4930"),h=i("fdbf"),l=o("wks"),u=n.Symbol,c=u&&u["for"],f=h?u:u&&u.withoutSetter||s;t.exports=function(t){if(!r(l,t)||!a&&"string"!=typeof l[t]){var e="Symbol."+t;a&&r(u,t)?l[t]=u[t]:l[t]=h&&c?c(e):f(e)}return l[t]}},c04e:function(t,e,i){var n=i("da84"),o=i("c65b"),r=i("861d"),s=i("d9b5"),a=i("dc4a"),h=i("485a"),l=i("b622"),u=n.TypeError,c=l("toPrimitive");t.exports=function(t,e){if(!r(t)||s(t))return t;var i,n=a(t,c);if(n){if(void 0===e&&(e="default"),i=o(n,t,e),!r(i)||s(i))return i;throw u("Can't convert object to primitive value")}return void 0===e&&(e="number"),h(t,e)}},c430:function(t,e){t.exports=!1},c607:function(t,e,i){var n=i("da84"),o=i("83ab"),r=i("fce3"),s=i("c6b6"),a=i("9bf2").f,h=i("69f3").get,l=RegExp.prototype,u=n.TypeError;o&&r&&a(l,"dotAll",{configurable:!0,get:function(){if(this!==l){if("RegExp"===s(this))return!!h(this).dotAll;throw u("Incompatible receiver, RegExp required")}}})},c65b:function(t,e){var i=Function.prototype.call;t.exports=i.bind?i.bind(i):function(){return i.apply(i,arguments)}},c6b6:function(t,e,i){var n=i("e330"),o=n({}.toString),r=n("".slice);t.exports=function(t){return r(o(t),8,-1)}},c6cd:function(t,e,i){var n=i("da84"),o=i("ce4e"),r="__core-js_shared__",s=n[r]||o(r,{});t.exports=s},c8ba:function(t,e){var i;i=function(){return this}();try{i=i||new Function("return this")()}catch(n){"object"===typeof window&&(i=window)}t.exports=i},ca84:function(t,e,i){var n=i("e330"),o=i("1a2d"),r=i("fc6a"),s=i("4d64").indexOf,a=i("d012"),h=n([].push);t.exports=function(t,e){var i,n=r(t),l=0,u=[];for(i in n)!o(a,i)&&o(n,i)&&h(u,i);while(e.length>l)o(n,i=e[l++])&&(~s(u,i)||h(u,i));return u}},cc12:function(t,e,i){var n=i("da84"),o=i("861d"),r=n.document,s=o(r)&&o(r.createElement);t.exports=function(t){return s?r.createElement(t):{}}},cca6:function(t,e,i){var n=i("23e7"),o=i("60da");n({target:"Object",stat:!0,forced:Object.assign!==o},{assign:o})},cdf9:function(t,e,i){var n=i("825a"),o=i("861d"),r=i("f069");t.exports=function(t,e){if(n(t),o(e)&&e.constructor===t)return e;var i=r.f(t),s=i.resolve;return s(e),i.promise}},ce4e:function(t,e,i){var n=i("da84"),o=Object.defineProperty;t.exports=function(t,e){try{o(n,t,{value:e,configurable:!0,writable:!0})}catch(i){n[t]=e}return e}},d012:function(t,e){t.exports={}},d039:function(t,e){t.exports=function(t){try{return!!t()}catch(e){return!0}}},d066:function(t,e,i){var n=i("da84"),o=i("1626"),r=function(t){return o(t)?t:void 0};t.exports=function(t,e){return arguments.length<2?r(n[t]):n[t]&&n[t][e]}},d1e7:function(t,e,i){"use strict";var n={}.propertyIsEnumerable,o=Object.getOwnPropertyDescriptor,r=o&&!n.call({1:2},1);e.f=r?function(t){var e=o(this,t);return!!e&&e.enumerable}:n},d2bb:function(t,e,i){var n=i("e330"),o=i("825a"),r=i("3bbe");t.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var t,e=!1,i={};try{t=n(Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set),t(i,[]),e=i instanceof Array}catch(s){}return function(i,n){return o(i),r(n),e?t(i,n):i.__proto__=n,i}}():void 0)},d44e:function(t,e,i){var n=i("9bf2").f,o=i("1a2d"),r=i("b622"),s=r("toStringTag");t.exports=function(t,e,i){t&&!o(t=i?t:t.prototype,s)&&n(t,s,{configurable:!0,value:e})}},d4c3:function(t,e,i){var n=i("342f"),o=i("da84");t.exports=/ipad|iphone|ipod/i.test(n)&&void 0!==o.Pebble},d9b5:function(t,e,i){var n=i("da84"),o=i("d066"),r=i("1626"),s=i("3a9b"),a=i("fdbf"),h=n.Object;t.exports=a?function(t){return"symbol"==typeof t}:function(t){var e=o("Symbol");return r(e)&&s(e.prototype,h(t))}},da84:function(t,e,i){(function(e){var i=function(t){return t&&t.Math==Math&&t};t.exports=i("object"==typeof globalThis&&globalThis)||i("object"==typeof window&&window)||i("object"==typeof self&&self)||i("object"==typeof e&&e)||function(){return this}()||Function("return this")()}).call(this,i("c8ba"))},dc4a:function(t,e,i){var n=i("59ed");t.exports=function(t,e){var i=t[e];return null==i?void 0:n(i)}},df75:function(t,e,i){var n=i("ca84"),o=i("7839");t.exports=Object.keys||function(t){return n(t,o)}},e163:function(t,e,i){var n=i("da84"),o=i("1a2d"),r=i("1626"),s=i("7b0b"),a=i("f772"),h=i("e177"),l=a("IE_PROTO"),u=n.Object,c=u.prototype;t.exports=h?u.getPrototypeOf:function(t){var e=s(t);if(o(e,l))return e[l];var i=e.constructor;return r(i)&&e instanceof i?i.prototype:e instanceof u?c:null}},e177:function(t,e,i){var n=i("d039");t.exports=!n((function(){function t(){}return t.prototype.constructor=null,Object.getPrototypeOf(new t)!==t.prototype}))},e260:function(t,e,i){"use strict";var n=i("fc6a"),o=i("44d2"),r=i("3f8c"),s=i("69f3"),a=i("7dd0"),h="Array Iterator",l=s.set,u=s.getterFor(h);t.exports=a(Array,"Array",(function(t,e){l(this,{type:h,target:n(t),index:0,kind:e})}),(function(){var t=u(this),e=t.target,i=t.kind,n=t.index++;return!e||n>=e.length?(t.target=void 0,{value:void 0,done:!0}):"keys"==i?{value:n,done:!1}:"values"==i?{value:e[n],done:!1}:{value:[n,e[n]],done:!1}}),"values"),r.Arguments=r.Array,o("keys"),o("values"),o("entries")},e2cc:function(t,e,i){var n=i("6eeb");t.exports=function(t,e,i){for(var o in e)n(t,o,e[o],i);return t}},e330:function(t,e){var i=Function.prototype,n=i.bind,o=i.call,r=n&&n.bind(o);t.exports=n?function(t){return t&&r(o,t)}:function(t){return t&&function(){return o.apply(t,arguments)}}},e667:function(t,e){t.exports=function(t){try{return{error:!1,value:t()}}catch(e){return{error:!0,value:e}}}},e6cf:function(t,e,i){"use strict";var n,o,r,s,a=i("23e7"),h=i("c430"),l=i("da84"),u=i("d066"),c=i("c65b"),f=i("fea9"),d=i("6eeb"),p=i("e2cc"),g=i("d2bb"),y=i("d44e"),m=i("2626"),v=i("59ed"),x=i("1626"),b=i("861d"),w=i("19aa"),k=i("8925"),M=i("2266"),S=i("1c7e"),P=i("4840"),N=i("2cf4").set,C=i("b575"),T=i("cdf9"),A=i("44de"),L=i("f069"),j=i("e667"),O=i("69f3"),D=i("94ca"),F=i("b622"),B=i("6069"),I=i("605d"),E=i("2d00"),R=F("species"),z="Promise",V=O.get,G=O.set,Y=O.getterFor(z),X=f&&f.prototype,q=f,U=X,K=l.TypeError,H=l.document,_=l.process,W=L.f,$=W,J=!!(H&&H.createEvent&&l.dispatchEvent),Z=x(l.PromiseRejectionEvent),Q="unhandledrejection",tt="rejectionhandled",et=0,it=1,nt=2,ot=1,rt=2,st=!1,at=D(z,(function(){var t=k(q),e=t!==String(q);if(!e&&66===E)return!0;if(h&&!U["finally"])return!0;if(E>=51&&/native code/.test(t))return!1;var i=new q((function(t){t(1)})),n=function(t){t((function(){}),(function(){}))},o=i.constructor={};return o[R]=n,st=i.then((function(){}))instanceof n,!st||!e&&B&&!Z})),ht=at||!S((function(t){q.all(t)["catch"]((function(){}))})),lt=function(t){var e;return!(!b(t)||!x(e=t.then))&&e},ut=function(t,e){if(!t.notified){t.notified=!0;var i=t.reactions;C((function(){var n=t.value,o=t.state==it,r=0;while(i.length>r){var s,a,h,l=i[r++],u=o?l.ok:l.fail,f=l.resolve,d=l.reject,p=l.domain;try{u?(o||(t.rejection===rt&&pt(t),t.rejection=ot),!0===u?s=n:(p&&p.enter(),s=u(n),p&&(p.exit(),h=!0)),s===l.promise?d(K("Promise-chain cycle")):(a=lt(s))?c(a,s,f,d):f(s)):d(n)}catch(g){p&&!h&&p.exit(),d(g)}}t.reactions=[],t.notified=!1,e&&!t.rejection&&ft(t)}))}},ct=function(t,e,i){var n,o;J?(n=H.createEvent("Event"),n.promise=e,n.reason=i,n.initEvent(t,!1,!0),l.dispatchEvent(n)):n={promise:e,reason:i},!Z&&(o=l["on"+t])?o(n):t===Q&&A("Unhandled promise rejection",i)},ft=function(t){c(N,l,(function(){var e,i=t.facade,n=t.value,o=dt(t);if(o&&(e=j((function(){I?_.emit("unhandledRejection",n,i):ct(Q,i,n)})),t.rejection=I||dt(t)?rt:ot,e.error))throw e.value}))},dt=function(t){return t.rejection!==ot&&!t.parent},pt=function(t){c(N,l,(function(){var e=t.facade;I?_.emit("rejectionHandled",e):ct(tt,e,t.value)}))},gt=function(t,e,i){return function(n){t(e,n,i)}},yt=function(t,e,i){t.done||(t.done=!0,i&&(t=i),t.value=e,t.state=nt,ut(t,!0))},mt=function(t,e,i){if(!t.done){t.done=!0,i&&(t=i);try{if(t.facade===e)throw K("Promise can't be resolved itself");var n=lt(e);n?C((function(){var i={done:!1};try{c(n,e,gt(mt,i,t),gt(yt,i,t))}catch(o){yt(i,o,t)}})):(t.value=e,t.state=it,ut(t,!1))}catch(o){yt({done:!1},o,t)}}};if(at&&(q=function(t){w(this,U),v(t),c(n,this);var e=V(this);try{t(gt(mt,e),gt(yt,e))}catch(i){yt(e,i)}},U=q.prototype,n=function(t){G(this,{type:z,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:et,value:void 0})},n.prototype=p(U,{then:function(t,e){var i=Y(this),n=i.reactions,o=W(P(this,q));return o.ok=!x(t)||t,o.fail=x(e)&&e,o.domain=I?_.domain:void 0,i.parent=!0,n[n.length]=o,i.state!=et&&ut(i,!1),o.promise},catch:function(t){return this.then(void 0,t)}}),o=function(){var t=new n,e=V(t);this.promise=t,this.resolve=gt(mt,e),this.reject=gt(yt,e)},L.f=W=function(t){return t===q||t===r?new o(t):$(t)},!h&&x(f)&&X!==Object.prototype)){s=X.then,st||(d(X,"then",(function(t,e){var i=this;return new q((function(t,e){c(s,i,t,e)})).then(t,e)}),{unsafe:!0}),d(X,"catch",U["catch"],{unsafe:!0}));try{delete X.constructor}catch(vt){}g&&g(X,U)}a({global:!0,wrap:!0,forced:at},{Promise:q}),y(q,z,!1,!0),m(z),r=u(z),a({target:z,stat:!0,forced:at},{reject:function(t){var e=W(this);return c(e.reject,void 0,t),e.promise}}),a({target:z,stat:!0,forced:h||at},{resolve:function(t){return T(h&&this===r?q:this,t)}}),a({target:z,stat:!0,forced:ht},{all:function(t){var e=this,i=W(e),n=i.resolve,o=i.reject,r=j((function(){var i=v(e.resolve),r=[],s=0,a=1;M(t,(function(t){var h=s++,l=!1;a++,c(i,e,t).then((function(t){l||(l=!0,r[h]=t,--a||n(r))}),o)})),--a||n(r)}));return r.error&&o(r.value),i.promise},race:function(t){var e=this,i=W(e),n=i.reject,o=j((function(){var o=v(e.resolve);M(t,(function(t){c(o,e,t).then(i.resolve,n)}))}));return o.error&&n(o.value),i.promise}})},e893:function(t,e,i){var n=i("1a2d"),o=i("56ef"),r=i("06cf"),s=i("9bf2");t.exports=function(t,e){for(var i=o(e),a=s.f,h=r.f,l=0;l<i.length;l++){var u=i[l];n(t,u)||a(t,u,h(e,u))}}},e95a:function(t,e,i){var n=i("b622"),o=i("3f8c"),r=n("iterator"),s=Array.prototype;t.exports=function(t){return void 0!==t&&(o.Array===t||s[r]===t)}},f069:function(t,e,i){"use strict";var n=i("59ed"),o=function(t){var e,i;this.promise=new t((function(t,n){if(void 0!==e||void 0!==i)throw TypeError("Bad Promise constructor");e=t,i=n})),this.resolve=n(e),this.reject=n(i)};t.exports.f=function(t){return new o(t)}},f36a:function(t,e,i){var n=i("e330");t.exports=n([].slice)},f5df:function(t,e,i){var n=i("da84"),o=i("00ee"),r=i("1626"),s=i("c6b6"),a=i("b622"),h=a("toStringTag"),l=n.Object,u="Arguments"==s(function(){return arguments}()),c=function(t,e){try{return t[e]}catch(i){}};t.exports=o?s:function(t){var e,i,n;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(i=c(e=l(t),h))?i:u?s(e):"Object"==(n=s(e))&&r(e.callee)?"Arguments":n}},f772:function(t,e,i){var n=i("5692"),o=i("90e3"),r=n("keys");t.exports=function(t){return r[t]||(r[t]=o(t))}},fc6a:function(t,e,i){var n=i("44ad"),o=i("1d80");t.exports=function(t){return n(o(t))}},fce3:function(t,e,i){var n=i("d039"),o=i("da84"),r=o.RegExp;t.exports=n((function(){var t=r(".","s");return!(t.dotAll&&t.exec("\n")&&"s"===t.flags)}))},fdbf:function(t,e,i){var n=i("4930");t.exports=n&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},fea9:function(t,e,i){var n=i("da84");t.exports=n.Promise}}]);
+//# sourceMappingURL=chunk-vendors.80f2064b.js.map
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/er/js/chunk-vendors.80f2064b.js.map b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/er/js/chunk-vendors.80f2064b.js.map
new file mode 100644
index 0000000..8107cd0
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/er/js/chunk-vendors.80f2064b.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack:///./node_modules/core-js/internals/to-string-tag-support.js","webpack:///./node_modules/core-js/internals/function-bind-context.js","webpack:///./node_modules/core-js/internals/object-get-own-property-descriptor.js","webpack:///./node_modules/core-js/internals/length-of-array-like.js","webpack:///./node_modules/core-js/internals/ie8-dom-define.js","webpack:///./node_modules/core-js/internals/try-to-string.js","webpack:///./node_modules/core-js/internals/regexp-unsupported-ncg.js","webpack:///./node_modules/core-js/internals/is-callable.js","webpack:///./node_modules/core-js/internals/an-instance.js","webpack:///./node_modules/core-js/internals/has-own-property.js","webpack:///./node_modules/core-js/internals/html.js","webpack:///./node_modules/core-js/internals/check-correctness-of-iteration.js","webpack:///./node_modules/core-js/internals/engine-is-ios.js","webpack:///./node_modules/core-js/internals/require-object-coercible.js","webpack:///./node_modules/core-js/internals/iterate.js","webpack:///./node_modules/core-js/internals/to-absolute-index.js","webpack:///./node_modules/core-js/internals/export.js","webpack:///./node_modules/core-js/internals/object-get-own-property-names.js","webpack:///./node_modules/core-js/modules/es.regexp.to-string.js","webpack:///./node_modules/core-js/internals/set-species.js","webpack:///./node_modules/vue-loader/lib/runtime/componentNormalizer.js","webpack:///./node_modules/core-js/internals/iterator-close.js","webpack:///./node_modules/vue/dist/vue.runtime.esm.js","webpack:///./node_modules/core-js/internals/function-apply.js","webpack:///./node_modules/core-js/modules/es.regexp.sticky.js","webpack:///./node_modules/core-js/internals/task.js","webpack:///./node_modules/core-js/internals/engine-v8-version.js","webpack:///./node_modules/core-js/internals/engine-user-agent.js","webpack:///./node_modules/core-js/internals/get-iterator-method.js","webpack:///./node_modules/core-js/internals/object-define-properties.js","webpack:///./node_modules/core-js/internals/object-is-prototype-of.js","webpack:///./node_modules/core-js/internals/a-possible-prototype.js","webpack:///./node_modules/core-js/internals/iterators.js","webpack:///./node_modules/core-js/internals/indexed-object.js","webpack:///./node_modules/core-js/internals/add-to-unscopables.js","webpack:///./node_modules/core-js/internals/host-report-errors.js","webpack:///./node_modules/core-js/internals/is-regexp.js","webpack:///./node_modules/core-js/internals/species-constructor.js","webpack:///./node_modules/core-js/internals/ordinary-to-primitive.js","webpack:///./node_modules/core-js/internals/native-symbol.js","webpack:///./node_modules/core-js/modules/es.regexp.constructor.js","webpack:///./node_modules/core-js/internals/array-includes.js","webpack:///./node_modules/core-js/internals/a-constructor.js","webpack:///./node_modules/core-js/internals/to-length.js","webpack:///./node_modules/core-js/internals/shared.js","webpack:///./node_modules/core-js/internals/own-keys.js","webpack:///./node_modules/core-js/internals/to-string.js","webpack:///./node_modules/core-js/internals/to-integer-or-infinity.js","webpack:///./node_modules/core-js/internals/a-callable.js","webpack:///./node_modules/core-js/internals/create-property-descriptor.js","webpack:///./node_modules/core-js/internals/function-name.js","webpack:///./node_modules/core-js/internals/engine-is-node.js","webpack:///./node_modules/core-js/internals/engine-is-browser.js","webpack:///./node_modules/core-js/internals/object-assign.js","webpack:///./node_modules/core-js/internals/is-constructor.js","webpack:///./node_modules/core-js/internals/internal-state.js","webpack:///./node_modules/core-js/internals/redefine.js","webpack:///./node_modules/gojs/release/go.js","webpack:///./node_modules/core-js/internals/inherit-if-required.js","webpack:///./node_modules/core-js/internals/object-get-own-property-symbols.js","webpack:///./node_modules/core-js/internals/enum-bug-keys.js","webpack:///./node_modules/core-js/internals/to-object.js","webpack:///./node_modules/core-js/internals/object-create.js","webpack:///./node_modules/core-js/internals/define-iterator.js","webpack:///./node_modules/core-js/internals/native-weak-map.js","webpack:///./node_modules/core-js/internals/an-object.js","webpack:///./node_modules/core-js/internals/descriptors.js","webpack:///./node_modules/core-js/internals/is-object.js","webpack:///./node_modules/core-js/internals/inspect-source.js","webpack:///./node_modules/core-js/internals/uid.js","webpack:///./node_modules/core-js/internals/create-non-enumerable-property.js","webpack:///./node_modules/core-js/internals/regexp-exec.js","webpack:///./node_modules/core-js/internals/is-forced.js","webpack:///./node_modules/core-js/internals/get-iterator.js","webpack:///./node_modules/core-js/internals/object-define-property.js","webpack:///./node_modules/core-js/internals/create-iterator-constructor.js","webpack:///./node_modules/core-js/internals/regexp-sticky-helpers.js","webpack:///./node_modules/core-js/internals/to-property-key.js","webpack:///./node_modules/core-js/internals/engine-is-webos-webkit.js","webpack:///./node_modules/core-js/modules/es.promise.finally.js","webpack:///./node_modules/core-js/modules/es.regexp.exec.js","webpack:///./node_modules/core-js/internals/regexp-flags.js","webpack:///./node_modules/core-js/internals/iterators-core.js","webpack:///./node_modules/core-js/internals/microtask.js","webpack:///./node_modules/core-js/internals/well-known-symbol.js","webpack:///./node_modules/core-js/internals/to-primitive.js","webpack:///./node_modules/core-js/internals/is-pure.js","webpack:///./node_modules/core-js/modules/es.regexp.dot-all.js","webpack:///./node_modules/core-js/internals/function-call.js","webpack:///./node_modules/core-js/internals/classof-raw.js","webpack:///./node_modules/core-js/internals/shared-store.js","webpack:///(webpack)/buildin/global.js","webpack:///./node_modules/core-js/internals/object-keys-internal.js","webpack:///./node_modules/core-js/internals/document-create-element.js","webpack:///./node_modules/core-js/modules/es.object.assign.js","webpack:///./node_modules/core-js/internals/promise-resolve.js","webpack:///./node_modules/core-js/internals/set-global.js","webpack:///./node_modules/core-js/internals/hidden-keys.js","webpack:///./node_modules/core-js/internals/fails.js","webpack:///./node_modules/core-js/internals/get-built-in.js","webpack:///./node_modules/core-js/internals/object-property-is-enumerable.js","webpack:///./node_modules/core-js/internals/object-set-prototype-of.js","webpack:///./node_modules/core-js/internals/set-to-string-tag.js","webpack:///./node_modules/core-js/internals/engine-is-ios-pebble.js","webpack:///./node_modules/core-js/internals/is-symbol.js","webpack:///./node_modules/core-js/internals/global.js","webpack:///./node_modules/core-js/internals/get-method.js","webpack:///./node_modules/core-js/internals/object-keys.js","webpack:///./node_modules/core-js/internals/object-get-prototype-of.js","webpack:///./node_modules/core-js/internals/correct-prototype-getter.js","webpack:///./node_modules/core-js/modules/es.array.iterator.js","webpack:///./node_modules/core-js/internals/redefine-all.js","webpack:///./node_modules/core-js/internals/function-uncurry-this.js","webpack:///./node_modules/core-js/internals/perform.js","webpack:///./node_modules/core-js/modules/es.promise.js","webpack:///./node_modules/core-js/internals/copy-constructor-properties.js","webpack:///./node_modules/core-js/internals/is-array-iterator-method.js","webpack:///./node_modules/core-js/internals/new-promise-capability.js","webpack:///./node_modules/core-js/internals/array-slice.js","webpack:///./node_modules/core-js/internals/classof.js","webpack:///./node_modules/core-js/internals/shared-key.js","webpack:///./node_modules/core-js/internals/to-indexed-object.js","webpack:///./node_modules/core-js/internals/regexp-unsupported-dot-all.js","webpack:///./node_modules/core-js/internals/use-symbol-as-uid.js","webpack:///./node_modules/core-js/internals/native-promise-constructor.js"],"names":["wellKnownSymbol","TO_STRING_TAG","test","module","exports","String","uncurryThis","aCallable","bind","fn","that","undefined","apply","arguments","DESCRIPTORS","call","propertyIsEnumerableModule","createPropertyDescriptor","toIndexedObject","toPropertyKey","hasOwn","IE8_DOM_DEFINE","$getOwnPropertyDescriptor","Object","getOwnPropertyDescriptor","f","O","P","error","toLength","obj","length","fails","createElement","defineProperty","get","a","global","argument","$RegExp","RegExp","re","exec","groups","replace","isPrototypeOf","TypeError","it","Prototype","toObject","hasOwnProperty","key","getBuiltIn","ITERATOR","SAFE_CLOSING","called","iteratorWithReturn","next","done","this","Array","from","SKIP_CLOSING","ITERATION_SUPPORT","object","userAgent","anObject","tryToString","isArrayIteratorMethod","lengthOfArrayLike","getIterator","getIteratorMethod","iteratorClose","Result","stopped","result","ResultPrototype","prototype","iterable","unboundFunction","options","iterator","iterFn","index","step","AS_ENTRIES","IS_ITERATOR","INTERRUPTED","stop","condition","callFn","value","toIntegerOrInfinity","max","Math","min","integer","createNonEnumerableProperty","redefine","setGlobal","copyConstructorProperties","isForced","source","FORCED","target","targetProperty","sourceProperty","descriptor","TARGET","GLOBAL","STATIC","stat","noTargetGet","forced","sham","internalObjectKeys","enumBugKeys","hiddenKeys","concat","getOwnPropertyNames","PROPER_FUNCTION_NAME","PROPER","$toString","regExpFlags","TO_STRING","RegExpPrototype","n$ToString","getFlags","NOT_GENERIC","flags","INCORRECT_NAME","name","R","p","rf","unsafe","definePropertyModule","SPECIES","CONSTRUCTOR_NAME","Constructor","configurable","normalizeComponent","scriptExports","render","staticRenderFns","functionalTemplate","injectStyles","scopeId","moduleIdentifier","shadowMode","hook","_compiled","functional","_scopeId","context","$vnode","ssrContext","parent","__VUE_SSR_CONTEXT__","_registeredComponents","add","_ssrRegister","$root","$options","shadowRoot","_injectStyles","originalRender","h","existing","beforeCreate","getMethod","kind","innerResult","innerError","emptyObject","freeze","isUndef","v","isDef","isTrue","isFalse","isPrimitive","isObject","_toString","toString","isPlainObject","isRegExp","isValidArrayIndex","val","n","parseFloat","floor","isFinite","isPromise","then","catch","isArray","JSON","stringify","toNumber","isNaN","makeMap","str","expectsLowerCase","map","create","list","split","i","toLowerCase","isReservedAttribute","remove","arr","item","indexOf","splice","cached","cache","hit","camelizeRE","camelize","_","c","toUpperCase","capitalize","charAt","slice","hyphenateRE","hyphenate","polyfillBind","ctx","boundFn","l","_length","nativeBind","Function","toArray","start","ret","extend","to","_from","res","noop","b","no","identity","looseEqual","isObjectA","isObjectB","isArrayA","isArrayB","every","e","Date","getTime","keysA","keys","keysB","looseIndexOf","once","SSR_ATTR","ASSET_TYPES","LIFECYCLE_HOOKS","config","optionMergeStrategies","silent","productionTip","devtools","performance","errorHandler","warnHandler","ignoredElements","keyCodes","isReservedTag","isReservedAttr","isUnknownElement","getTagNamespace","parsePlatformTagName","mustUseProp","async","_lifecycleHooks","unicodeRegExp","isReserved","charCodeAt","def","enumerable","writable","bailRE","parsePath","path","segments","_isServer","hasProto","inBrowser","window","inWeex","WXEnvironment","platform","weexPlatform","UA","navigator","isIE","isIE9","isEdge","isIOS","isFF","match","nativeWatch","watch","supportsPassive","opts","addEventListener","isServerRendering","env","VUE_ENV","__VUE_DEVTOOLS_GLOBAL_HOOK__","isNative","Ctor","_Set","hasSymbol","Symbol","Reflect","ownKeys","Set","set","has","clear","warn","uid","Dep","id","subs","addSub","sub","push","removeSub","depend","addDep","notify","update","targetStack","pushTarget","popTarget","pop","VNode","tag","data","children","text","elm","componentOptions","asyncFactory","ns","fnContext","fnOptions","fnScopeId","componentInstance","raw","isStatic","isRootInsert","isComment","isCloned","isOnce","asyncMeta","isAsyncPlaceholder","prototypeAccessors","child","defineProperties","createEmptyVNode","node","createTextVNode","cloneVNode","vnode","cloned","arrayProto","arrayMethods","methodsToPatch","forEach","method","original","args","len","inserted","ob","__ob__","observeArray","dep","arrayKeys","shouldObserve","toggleObserving","Observer","vmCount","protoAugment","copyAugment","walk","src","__proto__","observe","asRootData","isExtensible","_isVue","defineReactive$$1","customSetter","shallow","property","getter","setter","childOb","dependArray","newVal","del","items","strats","mergeData","toVal","fromVal","mergeDataOrFn","parentVal","childVal","vm","instanceData","defaultData","mergeHook","dedupeHooks","hooks","mergeAssets","type","key$1","props","methods","inject","computed","provide","defaultStrat","normalizeProps","normalizeInject","normalized","normalizeDirectives","dirs","directives","def$$1","mergeOptions","_base","extends","mixins","mergeField","strat","resolveAsset","warnMissing","assets","camelizedId","PascalCaseId","validateProp","propOptions","propsData","prop","absent","booleanIndex","getTypeIndex","Boolean","stringIndex","getPropDefaultValue","prevShouldObserve","default","_props","getType","functionTypeCheckRE","isSameType","expectedTypes","handleError","err","info","cur","$parent","errorCaptured","capture","globalHandleError","invokeWithErrorHandling","handler","_handled","logError","console","timerFunc","isUsingMicroTask","callbacks","pending","flushCallbacks","copies","Promise","resolve","setTimeout","MutationObserver","setImmediate","counter","observer","textNode","document","createTextNode","characterData","nextTick","cb","_resolve","seenObjects","traverse","_traverse","seen","isA","isFrozen","depId","normalizeEvent","passive","once$$1","createFnInvoker","fns","invoker","arguments$1","updateListeners","on","oldOn","remove$$1","createOnceHandler","old","event","params","mergeVNodeHook","hookKey","oldHook","wrappedHook","merged","extractPropsFromVNodeData","attrs","altKey","checkProp","hash","preserve","simpleNormalizeChildren","normalizeChildren","normalizeArrayChildren","isTextNode","nestedIndex","lastIndex","last","shift","_isVList","initProvide","_provided","initInjections","resolveInject","provideKey","provideDefault","resolveSlots","slots","slot","name$1","isWhitespace","normalizeScopedSlots","normalSlots","prevSlots","hasNormalSlots","isStable","$stable","$key","_normalized","$hasNormal","normalizeScopedSlot","key$2","proxyNormalSlot","proxy","renderList","renderSlot","fallbackRender","bindObject","nodes","scopedSlotFn","$scopedSlots","$slots","$createElement","resolveFilter","isKeyNotMatch","expect","actual","checkKeyCodes","eventKeyCode","builtInKeyCode","eventKeyName","builtInKeyName","mappedKeyCode","bindObjectProps","asProp","isSync","loop","domProps","camelizedKey","hyphenatedKey","$event","renderStatic","isInFor","_staticTrees","tree","_renderProxy","markStatic","markOnce","markStaticNode","bindObjectListeners","ours","resolveScopedSlots","hasDynamicKeys","contentHashKey","bindDynamicKeys","baseObj","values","prependModifier","symbol","installRenderHelpers","_o","_n","_s","_l","_t","_q","_i","_m","_f","_k","_b","_v","_e","_u","_g","_d","_p","FunctionalRenderContext","contextVm","this$1","_original","isCompiled","needNormalization","listeners","injections","scopedSlots","_c","d","createFunctionalComponent","mergeProps","renderContext","cloneAndMarkFunctionalResult","vnodes","clone","componentVNodeHooks","init","hydrating","_isDestroyed","keepAlive","mountedNode","prepatch","createComponentInstanceForVnode","activeInstance","$mount","oldVnode","updateChildComponent","insert","_isMounted","callHook","queueActivatedComponent","activateChildComponent","destroy","deactivateChildComponent","$destroy","hooksToMerge","createComponent","baseCtor","cid","resolveAsyncComponent","createAsyncPlaceholder","resolveConstructorOptions","model","transformModel","nativeOn","abstract","installComponentHooks","_isComponent","_parentVnode","inlineTemplate","toMerge","_merged","mergeHook$1","f1","f2","callback","SIMPLE_NORMALIZE","ALWAYS_NORMALIZE","normalizationType","alwaysNormalize","_createElement","is","pre","applyNS","registerDeepBindings","force","style","class","initRender","_vnode","parentVnode","_renderChildren","parentData","_parentListeners","currentRenderingInstance","renderMixin","Vue","$nextTick","_render","ref","ensureCtor","comp","base","__esModule","toStringTag","factory","errorComp","resolved","owner","owners","loading","loadingComp","sync","timerLoading","timerTimeout","$on","forceRender","renderCompleted","$forceUpdate","clearTimeout","reject","reason","component","delay","timeout","getFirstComponentChild","initEvents","_events","_hasHookEvent","updateComponentListeners","remove$1","$off","_target","onceHandler","oldListeners","eventsMixin","hookRE","$once","i$1","cbs","$emit","setActiveInstance","prevActiveInstance","initLifecycle","$children","$refs","_watcher","_inactive","_directInactive","_isBeingDestroyed","lifecycleMixin","_update","prevEl","$el","prevVnode","restoreActiveInstance","__patch__","__vue__","teardown","_watchers","_data","mountComponent","el","updateComponent","Watcher","before","renderChildren","newScopedSlots","oldScopedSlots","hasDynamicScopedSlot","needsForceUpdate","$attrs","$listeners","propKeys","_propKeys","isInInactiveTree","direct","handlers","j","queue","activatedChildren","waiting","flushing","resetSchedulerState","currentFlushTimestamp","getNow","now","createEvent","timeStamp","flushSchedulerQueue","watcher","sort","run","activatedQueue","updatedQueue","callActivatedHooks","callUpdatedHooks","emit","queueWatcher","uid$2","expOrFn","isRenderWatcher","deep","user","lazy","active","dirty","deps","newDeps","depIds","newDepIds","expression","cleanupDeps","tmp","oldValue","evaluate","sharedPropertyDefinition","sourceKey","initState","initProps","initMethods","initData","initComputed","initWatch","propsOptions","isRoot","getData","computedWatcherOptions","watchers","_computedWatchers","isSSR","userDef","defineComputed","shouldCache","createComputedGetter","createGetterInvoker","createWatcher","$watch","stateMixin","dataDef","propsDef","$set","$delete","immediate","uid$3","initMixin","_init","_uid","initInternalComponent","constructor","_self","vnodeComponentOptions","_componentTag","super","superOptions","cachedSuperOptions","modifiedOptions","resolveModifiedOptions","extendOptions","components","modified","latest","sealed","sealedOptions","initUse","use","plugin","installedPlugins","_installedPlugins","unshift","install","initMixin$1","mixin","initExtend","Super","SuperId","cachedCtors","_Ctor","Sub","initProps$1","initComputed$1","Comp","initAssetRegisters","definition","getComponentName","matches","pattern","pruneCache","keepAliveInstance","filter","entry","pruneCacheEntry","current","patternTypes","KeepAlive","include","exclude","Number","cacheVNode","vnodeToCache","keyToCache","parseInt","created","destroyed","mounted","updated","ref$1","builtInComponents","initGlobalAPI","configDef","util","defineReactive","delete","observable","version","acceptValue","attr","isEnumeratedAttr","isValidContentEditableValue","convertEnumeratedValue","isFalsyAttrValue","isBooleanAttr","xlinkNS","isXlink","getXlinkProp","genClassForVnode","parentNode","childNode","mergeClassData","renderClass","staticClass","dynamicClass","stringifyClass","stringifyArray","stringifyObject","stringified","namespaceMap","svg","math","isHTMLTag","isSVG","unknownElementCache","HTMLUnknownElement","HTMLElement","isTextInputType","query","selected","querySelector","createElement$1","tagName","multiple","setAttribute","createElementNS","namespace","createComment","insertBefore","newNode","referenceNode","removeChild","appendChild","nextSibling","setTextContent","textContent","setStyleScope","nodeOps","registerRef","isRemoval","refs","refInFor","emptyNode","sameVnode","sameInputType","typeA","typeB","createKeyToOldIdx","beginIdx","endIdx","createPatchFunction","backend","modules","emptyNodeAt","createRmCb","childElm","removeNode","createElm","insertedVnodeQueue","parentElm","refElm","nested","ownerArray","setScope","createChildren","invokeCreateHooks","isReactivated","initComponent","reactivateComponent","pendingInsert","isPatchable","innerNode","transition","activate","ref$$1","ancestor","addVnodes","startIdx","invokeDestroyHook","removeVnodes","ch","removeAndInvokeRemoveHook","rm","updateChildren","oldCh","newCh","removeOnly","oldKeyToIdx","idxInOld","vnodeToMove","oldStartIdx","newStartIdx","oldEndIdx","oldStartVnode","oldEndVnode","newEndIdx","newStartVnode","newEndVnode","canMove","patchVnode","findIdxInOld","end","hydrate","postpatch","invokeInsertHook","initial","isRenderedModule","inVPre","hasChildNodes","innerHTML","childrenMatch","firstChild","fullInvoke","isInitialPatch","isRealElement","nodeType","hasAttribute","removeAttribute","oldElm","_leaveCb","patchable","i$2","updateDirectives","oldDir","dir","isCreate","isDestroy","oldDirs","normalizeDirectives$1","newDirs","dirsWithInsert","dirsWithPostpatch","oldArg","arg","callHook$1","componentUpdated","callInsert","emptyModifiers","modifiers","getRawDirName","rawName","join","baseModules","updateAttrs","inheritAttrs","oldAttrs","setAttr","removeAttributeNS","isInPre","baseSetAttr","setAttributeNS","__ieph","blocker","stopImmediatePropagation","removeEventListener","updateClass","oldData","cls","transitionClass","_transitionClasses","_prevClass","target$1","klass","RANGE_TOKEN","CHECKBOX_RADIO_TOKEN","normalizeEvents","change","createOnceHandler$1","remove$2","useMicrotaskFix","add$1","attachedTimestamp","_wrapper","currentTarget","ownerDocument","updateDOMListeners","svgContainer","events","updateDOMProps","oldProps","childNodes","_value","strCur","shouldUpdateValue","checkVal","composing","isNotInFocusAndDirty","isDirtyWithModifiers","notInFocus","activeElement","_vModifiers","number","trim","parseStyleText","cssText","listDelimiter","propertyDelimiter","normalizeStyleData","normalizeStyleBinding","staticStyle","bindingStyle","getStyle","checkChild","styleData","emptyStyle","cssVarRE","importantRE","setProp","setProperty","normalizedName","normalize","vendorNames","capName","updateStyle","oldStaticStyle","oldStyleBinding","normalizedStyle","oldStyle","newStyle","whitespaceRE","addClass","classList","getAttribute","removeClass","tar","resolveTransition","css","autoCssTransition","enterClass","enterToClass","enterActiveClass","leaveClass","leaveToClass","leaveActiveClass","hasTransition","TRANSITION","ANIMATION","transitionProp","transitionEndEvent","animationProp","animationEndEvent","ontransitionend","onwebkittransitionend","onanimationend","onwebkitanimationend","raf","requestAnimationFrame","nextFrame","addTransitionClass","transitionClasses","removeTransitionClass","whenTransitionEnds","expectedType","getTransitionInfo","propCount","ended","onEnd","transformRE","styles","getComputedStyle","transitionDelays","transitionDurations","transitionTimeout","getTimeout","animationDelays","animationDurations","animationTimeout","hasTransform","delays","durations","toMs","s","enter","toggleDisplay","cancelled","_enterCb","appearClass","appearToClass","appearActiveClass","beforeEnter","afterEnter","enterCancelled","beforeAppear","appear","afterAppear","appearCancelled","duration","transitionNode","isAppear","startClass","activeClass","toClass","beforeEnterHook","enterHook","afterEnterHook","enterCancelledHook","explicitEnterDuration","expectsCSS","userWantsControl","getHookArgumentsLength","show","pendingNode","_pending","isValidDuration","leave","beforeLeave","afterLeave","leaveCancelled","delayLeave","explicitLeaveDuration","performLeave","invokerFns","_enter","platformModules","patch","vmodel","trigger","directive","binding","_vOptions","setSelected","getValue","onCompositionStart","onCompositionEnd","prevOptions","curOptions","some","o","needReset","hasNoMatchingOption","actuallySetSelected","isMultiple","option","selectedIndex","initEvent","dispatchEvent","locateNode","transition$$1","originalDisplay","__vOriginalDisplay","display","unbind","platformDirectives","transitionProps","mode","getRealChild","compOptions","extractTransitionData","placeholder","rawChild","hasParentTransition","isSameChild","oldChild","isNotTextNode","isVShowDirective","Transition","_leaving","oldRawChild","delayedLeave","moveClass","TransitionGroup","beforeMount","kept","prevChildren","rawChildren","transitionData","removed","c$1","pos","getBoundingClientRect","hasMove","callPendingCbs","recordPosition","applyTranslation","_reflow","body","offsetHeight","moved","transform","WebkitTransform","transitionDuration","_moveCb","propertyName","_hasMove","cloneNode","newPos","oldPos","dx","left","dy","top","platformComponents","FunctionPrototype","UNSUPPORTED_Y","classof","getInternalState","sticky","location","defer","channel","port","isCallable","html","arraySlice","IS_IOS","IS_NODE","clearImmediate","process","Dispatch","MessageChannel","ONREADYSTATECHANGE","runner","listener","post","postMessage","protocol","host","port2","port1","onmessage","importScripts","Deno","versions","v8","Iterators","objectKeys","Properties","propertyIsEnumerable","UNSCOPABLES","ArrayPrototype","MATCH","aConstructor","defaultConstructor","S","C","input","pref","valueOf","V8_VERSION","getOwnPropertySymbols","inheritIfRequired","stickyHelpers","enforceInternalState","enforce","setSpecies","UNSUPPORTED_DOT_ALL","UNSUPPORTED_NCG","NativeRegExp","SyntaxError","stringIndexOf","stringSlice","IS_NCG","re1","re2","CORRECT_NEW","BASE_FORCED","handleDotAll","string","chr","brackets","handleNCG","named","names","ncg","groupid","groupname","RegExpWrapper","rawFlags","dotAll","handled","state","thisIsRegExp","patternIsRegExp","flagsAreUndefined","rawPattern","toAbsoluteIndex","createMethod","IS_INCLUDES","$this","fromIndex","includes","isConstructor","IS_PURE","store","copyright","getOwnPropertyNamesModule","getOwnPropertySymbolsModule","ceil","bitmap","getDescriptor","EXISTS","CONFIGURABLE","IndexedObject","$assign","assign","A","B","alphabet","T","argumentsLength","inspectSource","empty","construct","constructorRegExp","INCORRECT_TO_STRING","isConstructorModern","isConstructorLegacy","NATIVE_WEAK_MAP","shared","sharedKey","OBJECT_ALREADY_INITIALIZED","WeakMap","getterFor","TYPE","wmget","wmhas","wmset","metadata","facade","STATE","InternalStateModule","CONFIGURABLE_FUNCTION_NAME","TEMPLATE","simple","t","aa","ca","da","fa","ea","setPrototypeOf","ha","ia","ka","la","ma","BB","na","self","oa","pa","x","ra","sa","ta","ua","Error","va","wa","className","xa","log","ya","za","Aa","NodeList","HTMLCollection","Ba","Ca","Da","Ea","Fa","Ia","Ja","substring","_className","Ka","Text","Name","Key","Id","ID","La","getPrototypeOf","nB","Na","Pa","Qa","fromCharCode","substr","g","Ra","Sa","Ta","Ua","Va","Wa","D","Xa","u","Ya","Za","qx","$a","Dx","adym","vfo","classType","ab","pB","uB","rB","tB","zB","xB","my","qB","trace","sB","strokeStyle","fillStyle","font","beginPath","moveTo","lineTo","stroke","setTransform","scale","m11","m12","m21","m22","lineWidth","right","bottom","fillText","round","y","width","height","oB","Jm","Ak","reset","rd","first","any","all","each","Sd","count","hasNext","db","hb","ib","ub","ff","Ha","jb","gh","E","addAll","lb","tg","G","Hb","Fb","$e","ba","__gohashid","mb","kb","pb","predicate","contains","J","Pc","Xb","wb","removeRange","copy","Lw","uj","reverse","_dataArray","size","iteratorBackwards","sortRange","toSet","removeAt","insertAt","setElt","elt","thaw","nb","Xl","Ez","Fz","Zq","YA","Kw","toList","retainAll","removeAll","containsAny","containsAll","ga","qb","rb","Ze","sb","H","tb","vb","atan","abs","PI","Jd","xb","k","yb","zb","uniqueHash","hashIdUnique","hashId","Kf","iteratorKeys","iteratorValues","toKeySet","Ig","w","fj","L","ge","offset","rotate","cos","sin","Ie","qd","sqrt","direction","OA","Qh","PA","cB","Gq","dB","tj","offsetX","offsetY","Uk","alloc","Ab","allocAt","free","isReal","setSpot","setRectSpot","snapToGridPoint","snapToGrid","projectOntoLineSegmentPoint","projectOntoLineSegment","intersectingLineSegments","Cm","directionPoint","distanceSquared","distanceSquaredPoint","subtract","equalsApprox","equalTo","equals","setTo","Ib","Jb","Kb","Lb","Mb","Nb","Ob","Bb","Cb","Gb","M","Pb","Qb","parse","distanceLineSegmentSquared","Origin","InfiniteTopLeft","Infinity","InfiniteBottomRight","SixPoint","NoPoint","NaN","Rb","N","Sb","Tb","Ub","Vb","Wb","$b","ac","bc","cc","dc","ZeroSize","OneSize","SixSize","EightSize","TenSize","InfiniteSize","NoSize","Qc","bB","$","Ge","Jc","uq","Jw","sA","Dy","bw","Mc","cw","Oe","Rc","Rw","yA","hc","position","center","centerX","centerY","isEmpty","intersectsLineSegment","Ey","union","unionRect","unionPoint","intersects","intersectsRect","intersect","intersectRect","grow","subtractMargin","addMargin","inflate","containsRect","containsPoint","setSize","setPoint","ic","jc","kc","lc","mc","ZeroRect","NoRect","pc","sc","tc","uc","vc","yc","zc","Ac","Bc","Cc","Dc","Ec","Gc","Hc","Ic","Kc","Lc","Nc","Oc","Sc","Tc","Uc","Vc","Wc","Zc","$c","ad","bd","cd","dd","ed","fd","gd","qc","rc","hd","jd","ZeroMargin","TwoMargin","mw","Ef","nc","Vt","kd","isDefault","isNone","isSide","isNoSpot","isSpot","includesSide","opposite","ld","None","Default","TopLeft","TopCenter","TopRight","LeftCenter","Center","RightCenter","BottomLeft","BottomCenter","BottomRight","MiddleTop","MiddleLeft","MiddleRight","MiddleBottom","Top","Left","Right","Bottom","TopSide","LeftSide","RightSide","BottomSide","TopBottomSides","LeftRightSides","TopLeftSides","TopRightSides","BottomLeftSides","BottomRightSides","NotTopSide","NotLeftSide","NotRightSide","NotBottomSide","AllSides","Tt","multiply","jw","St","translate","Zx","Pw","m","r","q","transformRect","transformPoint","invert","multiplyInverted","isIdentity","xF","lB","Kg","jx","yt","yz","xz","Fe","qw","AB","pw","Vq","wq","z","F","Q","xq","Me","yB","wB","Cf","vB","Qt","Bt","Tq","hy","Hz","uy","Mz","Nz","Qe","dn","Uh","Vh","sd","qa","oc","Jj","Xr","Fr","ln","al","mn","pf","qf","Cl","Dl","Sf","td","vd","ud","figures","startX","startY","wd","endX","endY","xd","Dd","Ed","Fd","Gd","Hd","K","arcTo","Ud","Vd","isFilled","Ym","Kt","Wd","Xd","Yd","yd","zd","Zd","$d","point1X","point1Y","point2X","point2Y","ae","be","ce","de","ee","fe","bounds","he","ie","je","ke","startAngle","sweepAngle","radiusX","radiusY","le","isClosed","toFixed","gw","computeBounds","bt","Qd","ey","atan2","xAxisRotation","isClockwiseArc","Xv","flattenedSegments","flattenedLengths","flattenedTotalLength","vy","Yv","wy","Zm","spot1","spot2","defaultStretch","setSpots","getFractionForPoint","getPointAndAngleAlongPath","getAngleAlongPath","getPointAlongPath","computeBoundsWithoutOrigin","sx","js","os","dm","Ce","Qi","Ri","qh","Ll","Oj","acos","fillPath","Line","Rectangle","Ellipse","Path","isShadowed","isLargeArc","close","me","yv","Iu","xr","zs","yr","Di","st","Rr","Or","Ar","Pg","bs","ms","Wr","nt","pd","mt","ve","Js","kt","we","wn","xe","gf","ys","hp","ip","op","pp","np","Move","Bezier","QuadraticBezier","Arc","SvgArc","viewPoint","documentPoint","button","clickCount","delta","bubbles","Jq","diagram","ue","mA","ou","buttons","down","up","isMultiTouch","isTouchEvent","TouchEvent","PointerEvent","pointerType","timestamp","targetDiagram","targetObject","control","alt","meta","middle","getMultiTouchDocumentPoint","getMultiTouchViewPoint","subject","parameter","ye","modelChange","oldParam","newValue","newParam","oA","canUndo","undo","changeState","canRedo","redo","isTransactionFinished","getParam","ze","Ae","Be","gv","md","I","se","Lr","Yi","Tl","Qu","Wu","ks","$u","Zu","De","isUndoingRedoing","checksTransactionLevel","transactionLevel","currentTransaction","isInternalTransaction","isEnabled","isComplete","history","historyIndex","maxHistoryLength","isPendingClear","isPendingUnmodified","changes","Ee","ix","lz","vt","Hg","click","doubleClick","contextClick","panel","Od","eb","Ke","Kr","ik","Se","standardMouseOver","isBeyondDragSize","standardWaitAfter","isActive","holdDelay","hoverDelay","lastInput","Transaction","Property","Insert","Remove","nw","optimize","nestedTransactionNames","copyProperties","Vx","Py","If","transactionToUndo","transactionToRedo","models","zt","aw","skipsEvent","pj","layer","isTemporary","isInTransaction","isJustDiscarded","handleChanged","rollbackTransaction","commitTransaction","startTransaction","removeModel","addModel","updateAdornments","canStart","doStart","doActivate","doDeactivate","doStop","doCancel","transactionResult","stopTool","currentTool","currentCursor","doMouseDown","doMouseMove","doMouseUp","doMouseWheel","canStartMultiTouch","standardPinchZoomStart","Bm","Vl","sv","standardPinchZoomMove","commandHandler","canResetZoom","zoomPoint","resetZoom","doKeyDown","doKeyUp","Jg","standardMouseSelect","allowSelect","zm","selection","canSelect","containingGroup","isSelected","select","clearSelection","standardMouseClick","animationManager","skipsUndoManager","viewportBounds","Ej","doCurrentObjectChanged","mouseLeave","Gg","mouseEnter","cursor","mouseOver","Db","standardMouseWheel","documentBounds","toolManager","mouseWheelBehavior","He","canIncreaseZoom","canDecreaseZoom","increaseZoom","decreaseZoom","deltaMode","deltaX","deltaY","allowVerticalScroll","scrollVerticalLineChange","scroll","allowHorizontalScroll","scrollHorizontalLineChange","cancelWaitAfter","doWaitAfter","findToolHandleAt","Je","part","category","firstInput","dragSize","stopTransaction","initializeStandardTools","currentToolTip","adornedObject","showToolTip","hideToolTip","gestureBehavior","Re","mouseDownTools","doFocus","mouseMoveTools","cancelable","doMouseHover","doToolTip","hk","mouseHold","mouseHover","toolTip","layerName","selectable","positionToolTip","Te","toolTipDuration","measuredBounds","Hf","hide","mouseUpTools","findTool","replaceTool","adornedPart","replaceStandardTool","Ue","Ve","qg","Tn","jm","pl","Xg","lr","We","Fo","Wh","Xh","Ye","dragsLink","allowRelink","Ck","draggedLink","canRelinkFrom","canRelinkTo","nk","bf","df","nf","of","Xe","lf","Jf","copiedParts","isReadOnly","isModelReadOnly","draggedParts","undoManager","partManager","addsToTemporaryLayer","startPoint","copiesEffectiveCollection","tk","canCopy","Cd","routeBounds","gu","point","kf","temporaryFromNode","temporaryToNode","sf","moveParts","yh","Yx","Yq","suspendsRouting","uf","fromNode","toNode","vf","findDragOverObject","doUpdateCursor","handlesDragDropForTopLevelParts","isTopLevel","U","mouseDragOver","doDragOver","allowMove","allowCopy","Et","mouseDragLeave","xf","mouseDragEnter","V","handlesDragDropForMembers","yf","Eg","portGravity","findValidLinkablePort","pointsCount","isValidLink","defaultFromPoint","defaultToPoint","fromPortId","portId","toPortId","fromPort","Ky","toPort","Ly","zf","Af","mouseDrop","Bf","W","linksConnected","doDropOnto","getAvoidableRect","Vv","Kd","isAvoiding","Df","isVisible","points","WheelScroll","WheelZoom","WheelNone","GestureZoom","GestureCancel","GestureNone","allowDragOut","findDraggablePart","currentPart","computeEffectiveCollection","dragOptions","mu","isMouseCaptured","isDragOutStarted","af","doSimulatedDragOut","cf","isGridSnapEnabled","ef","jf","mf","previousInput","tf","wf","mayCopy","copyCursor","mayMove","moveCursor","mayDragOut","nodropCursor","simulatedMouseMove","simulatedMouseUp","doSimulatedDragLeave","doSimulatedDragEnter","allowDrop","allowInsert","targetTouches","changedTouches","getMouse","gr","doSimulatedDragOver","doSimulatedDrop","isCopyEnabled","computeBorder","lA","mayDragIn","dataFormat","grid","tn","computeMove","isComplexRoutingRealtime","isGridSnapRealtime","gridSnapCellSize","gridSnapCellSpot","gridSnapOrigin","dragsTree","draggingParts","getDraggingSource","oi","isPanelMain","toArrow","fill","gx","figure","strokeWidth","desiredSize","ex","hx","cz","Ii","bx","Lf","isLinkLabel","labeledLink","Of","isTreeLink","Rf","Uf","Vf","Wf","en","originalToPort","originalToNode","originalFromPort","originalFromNode","originalLink","validPortsCache","targetPort","copyPortProperties","naturalBounds","toSpot","toEndSegmentLength","fromSpot","fromEndSegmentLength","locationSpot","angle","lj","portTargeted","setNoTargetPortProperties","findTargetPort","isForwards","temporaryToPort","temporaryFromPort","toLinkable","fromLinkable","isValidTo","isValidFrom","allowLink","isUnconnectedLinkValid","fromMaxLinks","Fq","toMaxLinks","isInSameNode","isLinked","fromLinkableSelfNode","toLinkableSelfNode","fromLinkableDuplicates","toLinkableDuplicates","isLabelDependentOnLink","isValidCycle","linkValidation","validCycle","Mf","Nf","temporaryLink","Pf","Qf","Tf","linkingCursor","Ut","findLinkablePort","startObject","Xf","Yf","isNewTreeLink","insertLink","doNoLink","archetypeLinkData","getLinkCategoryForData","findLinkTemplateForCategory","archetypeLabelNodeData","segmentIndex","Hx","bg","wu","Ix","Is","ug","resegmentingDistance","Either","ForwardsOnly","BackwardsOnly","selectionObject","actualBounds","Gf","wk","makeAdornment","Gh","X","Link","toHandleArchetype","fromHandleArchetype","handle","copyLinkProperties","adjusting","corner","curve","Zf","$f","ag","curviness","routing","smoothness","fromShortLength","toShortLength","reconnectLink","doNoRelink","Oq","Zv","Os","cg","Xm","canReshape","Ex","Sx","resegmentable","isOrthogonal","firstPickIndex","lastPickIndex","computeCurve","dg","makeResegmentHandle","segmentFraction","makeHandle","eg","fg","handleArchetype","midHandleArchetype","allowReshape","getResegmentingPoint","adornedLink","computeReshape","reshape","Th","findVisibleNode","computeSpot","getLinkPointFromPoint","originalPoint","originalPoints","setReshapingBehavior","getReshapingBehavior","vg","Qg","alignmentFocus","Hs","Gx","qp","Nu","Mu","Lu","Cg","Fx","Ps","Dg","Xk","Fg","Aj","xx","kv","kz","Lx","by","visible","Cu","Cx","Du","Yu","wv","Lg","showDefaultContextMenu","hideDefaultContextMenu","Mg","getElementsByTagName","sheet","insertRule","Ng","Og","preventDefault","Rg","currentContextMenu","Sg","findObjectWithContextMenu","contextMenu","currentObject","Y","showContextMenu","Tg","copySelection","canCopySelection","cutSelection","canCutSelection","deleteSelection","canDeleteSelection","pasteSelection","mouseDownPoint","canPasteSelection","selectAll","canSelectAll","scrollToPart","canScrollToPart","zoomToFit","canZoomToFit","groupSelection","canGroupSelection","ungroupSelection","canUngroupSelection","editTextBlock","canEditTextBlock","Horizontal","Vertical","All","resizeObject","canResize","wg","updateResizeHandles","resizeAdornmentTemplate","Spot","xg","yg","alignment","elements","allowResize","computeCellSize","computeMinSize","computeMaxSize","originalDesiredSize","originalLocation","Mt","computeResize","resize","dragsMembers","oppositePoint","zg","Ag","Bg","minSize","maxSize","resizeCellSize","cellSize","gridCellSize","Ph","rotateObject","canRotate","computeAdornmentLocation","rotateAdornmentTemplate","Position","allowRotate","delaysLayout","computeRotationPoint","locationObject","rotationSpot","rotationPoint","handleAngle","handleDistance","originalAngle","computeRotate","snapAngleMultiple","snapAngleEpsilon","isActionable","actionDown","actionMove","actionUp","actionCancel","archetypeNodeData","isDoubleClick","insertPart","copyNodeData","box","computeBoxBounds","bb","selectInRect","ty","isPartialInclusion","move","originalPosition","mainElement","valueFunction","defaultTouchContextMenu","hideContextMenu","positionContextMenu","href","dz","Ug","Vg","zh","Wg","Wi","Yg","Hu","Zg","textBlock","Jy","eB","rows","lineCount","isMultiline","acceptText","$g","ah","currentTextEditor","bh","selectsTextOnActivate","setSelectionRange","focus","dh","border","minimumEditorScale","div","zIndex","fontSize","lineHeight","textAlign","margin","padding","outline","whiteSpace","overflow","jh","isValidText","hh","doSuccess","doError","eh","fh","editable","canEdit","starting","defaultTextEditor","textEditor","Aw","ih","kh","errorFunction","textEdited","textValidation","measure","Ei","measureTemporaryTextBlock","lh","mh","nh","oh","zl","ps","Qx","Al","ph","zi","ox","Px","Rd","yj","tv","ot","$l","rh","sh","defaultAnimation","isAnimating","th","isViewportUnconstrained","uh","vh","Ts","wh","autoScale","xh","Kh","Lh","Mh","Nh","Oh","isTicking","qm","Il","Rh","skipsModelSourceBindings","Sh","findLinksConnected","er","strokeDashOffset","background","areaBackground","opacity","LostFocus","MouseDown","Tab","Enter","SingleClick","SingleClickSelected","DoubleClick","StateNone","StateActive","StateEditing","StateValidating","StateInvalid","StateValidated","cu","ew","xm","lk","jk","animationReasons","runCount","isInitial","activeAnimations","initialAnimationStyle","stopAnimation","xv","Ox","Zn","Ir","Ku","Hl","Fp","nv","mv","tx","$n","iv","jv","px","Yh","links","ai","bi","ci","di","ei","Qv","Zh","pow","Kv","sw","fi","cq","gi","bl","hi","ii","finished","easing","defineAnimationEffect","AnimateLocations","suspend","advanceTo","redraw","scrollMode","Ti","$h","sz","isAnimated","Mp","Yt","memberParts","pA","reversible","getTemporaryState","addTemporaryPart","EaseLinear","EaseInOutQuad","EaseInQuad","EaseOutQuad","EaseInExpo","EaseOutExpo","ny","animationSettings","startCondition","ji","ki","Pi","rp","mi","globalAlpha","pi","zOrder","qi","ri","Gl","pv","Ss","setRTL","Ma","Zl","Kx","hf","xw","Nj","ww","Qn","es","fs","xs","vs","xt","Zr","Si","at","Us","Ns","Dj","gs","ds","El","rl","qn","Bj","sn","Hj","Kj","od","Pr","Qr","zj","msPointerEnabled","si","Dh","qs","rt","ti","Uu","tt","ui","vi","Jr","Mr","pt","Pn","Hr","gg","As","ig","jg","lg","cs","kg","hg","Bs","Ls","bk","Br","Nr","gt","rv","av","yi","Z","updateDataBindings","doModelChanged","zv","pg","Wl","nr","pr","vr","tr","sr","qr","Xu","ur","rr","wl","vl","$s","Ws","Vs","Op","Pp","Ys","Xs","Zs","qv","ws","Su","xi","wi","pe","qe","Ax","Tu","Gv","kw","hw","Rx","sm","Rn","rs","Lo","qo","kp","Fu","Eu","Gu","Tr","po","defaultTool","Sr","kl","Gs","Fs","fq","layout","Ai","ux","Ju","Xo","cp","hv","ep","Sj","Go","qt","rn","Qk","Rk","Pk","Ok","Jk","Lk","Kk","Hk","Ik","Ww","Mw","Nw","Ow","wo","Bi","gq","Ci","ao","bo","Fi","parts","Gi","Hi","avoidable","selectionObjectName","Auto","HTMLCanvasElement","Oz","Pz","BA","CA","Az","Bz","pageX","scrollX","pageY","scrollY","clientWidth","clientHeight","setScrollWidth","computePixelRatio","isViewportSized","um","isInDocumentBounds","pickable","Ux","xk","Grid","interval","locationObjectName","iy","Ui","scrollTop","scrollLeft","Xi","fixedBounds","initialPosition","initialDocumentSpot","initialViewportSpot","Zi","$i","onViewportBoundsChanged","aj","bj","cj","minScale","maxScale","dj","positionComputation","ej","hj","gj","ij","ctrlKey","shiftKey","metaKey","jj","composedPath","kj","mj","elementFromPoint","clientX","clientY","nj","stopPropagation","cancelBubble","oj","Vw","qj","rj","sj","initialScale","Hv","Nd","vj","wj","arrange","xj","Vi","clearRect","fillRect","ja","imageSmoothingEnabled","Sy","defaultFont","Wx","Hh","Cj","kk","Tx","Gj","contentAlignment","hasHorizontalScrollbar","hasVerticalScrollbar","scrollWidth","scrollHeight","isHighlighted","uk","layerChanged","Pj","groupsAlwaysMove","Wv","labelNodes","Qj","Rj","shifted","$v","dragComputation","gridOrigin","Tj","Yj","scaleComputation","Zj","ak","isModified","Ij","ck","dk","element","HTMLImageElement","ls","io","ek","fk","gk","isValidLayout","Sl","pk","isRealtime","doLayout","vk","Rt","group","Vy","computeOccupiedArea","initialize","yk","computePartsBounds","zk","Bd","gc","Ad","fc","Bk","Dk","computeAutoScrollPosition","Ek","Ol","callbackTimeout","Fk","omitTemporary","elementFinished","showTemporary","showGrid","Dq","Immediate","Bundled","zx","adornments","li","save","rect","clip","ni","restore","Mq","Nq","partsBackwards","layers","allowDelete","allowTextEdit","allowGroup","allowUngroup","findObjectsNear","findObjectsIn","findObjectsAt","findObjectAt","boxSizing","visibility","offsetWidth","devicePixelRatio","scrollsPageOnFocus","pageXOffset","pageYOffset","scrollTo","hz","iz","mB","uz","kA","Zz","$z","acceptEvent","MouseEvent","which","AA","Jz","Ty","drawShadows","textGreeking","viewportOptimizations","temporaryPixelRatio","pictureRatioOptimization","minDrawingLength","aB","extraTouchArea","extraTouchThreshold","hasGestureZoom","Fw","invalidateViewport","drawImage","Fj","Lj","Mj","canDelete","minLocation","maxLocation","groupsSnapMembers","nz","TA","VA","Tk","Uj","Vj","isRow","Wj","Xj","commit","updateAllTargetBindings","ir","isVirtualized","$A","clearHighlighteds","highlighteds","uA","vA","At","iB","Md","findPartForKey","findLinkForKey","It","Ht","dA","cA","EA","jA","Lm","$t","iw","rz","GA","returnType","Hy","HA","canvas","Gk","getImageData","toDataURL","details","toBlob","msToBlob","goDiagram","ky","disconnect","allowClipboard","allowUndo","allowZoom","defaultCursor","maxSelectionCount","nodeSelectionAdornmentTemplate","groupSelectionAdornmentTemplate","linkSelectionAdornmentTemplate","addAllModeledParts","nodeTemplate","nodeTemplateMap","groupTemplate","groupTemplateMap","linkTemplate","linkTemplateMap","SVGElement","viewSize","scrollMargin","defaultScale","initialAutoScale","initialContentAlignment","isTreePathToChildren","treeCollapsePolicy","Le","autoScrollInterval","autoScrollRegion","licenseKey","Mk","makeImageData","makeImage","addRenderer","makeSVG","makeSvg","stopAutoScroll","doAutoScroll","isUnoccupied","raiseDiagramEvent","removeDiagramListener","addDiagramListener","findTreeRoots","layoutDiagram","findTopLevelGroups","findTopLevelNodesAndLinks","ensureBounds","findLinksByExample","findNodesByExample","findLinkForData","findNodeForData","findPartForData","findNodeForKey","rebuildParts","transformViewToDoc","transformRectDocToView","transformDocToView","centerRect","scrollToRect","highlightCollection","highlight","selectCollection","updateAllRelationshipsFromData","raiseChanged","raiseChangedEvent","removeChangedListener","addChangedListener","removeModelChangedListener","addModelChangedListener","findLayer","removeLayer","addLayerAfter","addLayerBefore","addLayer","copyParts","removeParts","clearDelayedGeometries","setProperties","resetInputOptions","setInputOption","getInputOption","resetRenderingHints","setRenderingHint","getRenderingHint","maybeUpdate","requestUpdate","delayInitialization","isUpdateRequested","invalidateDocumentBounds","findPartsNear","findPartsIn","findPartsAt","findPartAt","focusObject","alignDocument","zoomToRect","diagramScroll","useDOM","isUsingDOM","Nk","getContext","jz","_tk","getPropertyValue","styleSheets","rules","cssRules","selectorText","getElementById","HTMLDivElement","ResizeObserver","go","userSelect","MozUserSelect","onscroll","detail","wheelDeltaX","wheelDeltaY","wheelDelta","touches","screenX","screenY","pointerId","fromDiv","inherit","Uniform","UniformToFill","CycleAll","CycleNotDirected","CycleNotDirectedFast","CycleNotUndirected","CycleDestinationTree","CycleSourceTree","DocumentScroll","InfiniteScroll","TreeParentCollapsed","AllParentsCollapsed","AnyParentsCollapsed","cl","dl","fl","gl","Sk","fm","selectionAdorned","resizeObjectName","observed","Vk","updateDelay","Wk","drawsTemporaryLayers","drawsGrid","Ki","bv","yx","Bv","Av","rg","Zk","isTreeExpanded","wasTreeExpanded","isSubGraphExpanded","wasSubGraphExpanded","$k","og","ec","Xc","ql","Yb","xp","yp","Jp","Kp","zn","aq","Qp","am","bm","cm","fb","em","im","hl","il","ll","sourceName","ml","jr","isToModel","modelData","Gt","Tw","nl","ol","Jh","sl","color","Au","Fl","createLinearGradient","endRadius","startRadius","createRadialGradient","createPattern","colorStops","addColorStop","Ff","stretch","Table","Jl","getRowDefinition","row","getColumnDefinition","column","Kl","Bl","Ml","ul","Nl","an","Pl","Ql","Rl","gy","Qw","Ul","canStopCommand","stopCommand","canShowContextMenu","Yk","deletesTree","deletesConnectedLinks","copiesTree","copiesConnectedLinks","copyToClipboard","Em","sk","copiesParentKey","rk","copiesGroupKey","pasteFromClipboard","zoomFactor","isZoomToFitRestoreEnabled","scrollToPartPause","collapseTree","canCollapseTree","Hq","expandTree","canExpandTree","archetypeGroupData","canGroup","fw","isValidMember","memberValidation","canUngroup","expandSubGraph","dr","addTopLevelParts","collapseSubGraph","canCollapseSubGraph","canExpandSubGraph","ym","copiesClipboardData","cloneProtected","segmentOrientation","jl","Ch","Ah","Bh","sy","Nt","Hm","Ih","TableRow","TableColumn","us","Im","tl","mp","ly","shadowOffset","clipInsteadOfFill","Iw","shadowBlur","xl","shadowColor","shadowVisible","yl","dw","lu","Ew","enabledChanged","Wn","segmentOffset","columnSpan","rowSpan","spanAllocation","Yl","kq","lq","co","eo","$o","ap","gn","hn","jn","findTemplateBinder","isEnabledObject","isVisibleObject","isContainedBy","getNearestIntersectionPoint","getLocalPoint","getDocumentScale","getDocumentAngle","getDocumentBounds","getDocumentPoint","containedInRect","addCopyProperty","Oa","r2","y2","x2","r1","y1","x1","ay","LA","viewBox","nu","stack","lineCap","lineDashOffset","lineJoin","miterLimit","shadowOffsetY","shadowOffsetX","ft","et","Wt","Vu","Bx","NA","gradientUnits","addElement","tabIndex","xu","zu","yu","yn","_buttonFillNormal","_buttonFillDisabled","_buttonStrokeNormal","_buttonFillOver","_buttonStrokeOver","_buttonFillPressed","_buttonStrokePressed","parameter1","parameter2","_treeExpandedFigure","_treeCollapsedFigure","Uq","_subGraphExpandedFigure","_subGraphCollapsedFigure","_buttonExpandedFigure","_buttonCollapsedFigure","geometryString","geometryStretch","Iy","_doClick","_buttonClick","Fill","FlipVertical","FlipHorizontal","FlipBoth","make","getBuilders","defineBuilder","takeBuilderArgument","firstElementChild","baseVal","arc","bezierCurveTo","addPath","closePath","patternUnits","naturalWidth","naturalHeight","preserveAspectRatio","quadraticCurveTo","stdDeviation","in2","operator","Ft","Dt","measureText","geometry","setLineDash","gm","hm","jt","Vr","Ks","km","lm","mm","nm","om","Fy","pm","tm","wm","FA","Iz","isDark","darkenBy","lightenBy","Am","Dm","Fm","Mm","Nm","Om","Pm","Qm","Rm","isAtomic","Mn","pq","oo","ko","jo","mo","lo","Do","te","Lp","bn","separatorStrokeWidth","separatorStroke","separatorDashArray","cn","coversSeparators","wc","kn","Gm","nn","hq","pn","itemTemplateMap","un","itemIndex","vn","Solid","Linear","Radial","Pattern","Lab","HSL","randomColor","random","isValidColor","lighten","darken","mix","IA","wz","RA","remeasureObject","arrangeElement","measureElement","isGeometryPositioned","isOpposite","defaultAlignment","isClipping","topIndex","Ga","leftIndex","Ji","Bn","ne","columnCount","mg","rowCount","oe","Yc","Cn","Eb","gb","Li","Zb","xc","Ld","minimum","maximum","ng","Fc","Eh","Fh","Pd","Dn","Ne","En","nd","total","Td","Pe","Mi","Fn","eu","fu","Gn","mk","sg","Ni","Oi","ok","Km","hu","qk","iu","Hn","In","Jn","Jv","viewboxStretch","strokeDashArray","computeAngle","midPoint","midAngle","Sm","Tm","Um","Vm","Wm","graduatedTickUnit","graduatedRange","graduatedStart","graduatedEnd","graduatedTickBase","graduatedMin","graduatedMax","graduatedSkip","graduatedFunction","$m","DA","lines","Graduated","itemArray","XA","SA","aA","Tz","qA","rA","Gz","converter","qy","defaultSeparatorPadding","defaultRowSeparatorStroke","defaultRowSeparatorStrokeWidth","defaultRowSeparatorDashArray","defaultColumnSeparatorStroke","defaultColumnSeparatorStrokeWidth","defaultColumnSeparatorDashArray","rowSizing","columnSizing","itemTemplate","itemCategoryProperty","alignmentFocusName","Viewbox","findItemPanelForData","rebuildItemElements","updateTargetBindings","copyTemplate","graduatedValueForPoint","graduatedPointForValue","findColumnForLocalX","findRowForLocalY","removeColumnDefinition","removeRowDefinition","findObject","findInVisualTree","walkVisualTreeFrom","findMainElement","Yp","xn","Up","Vp","sizing","definePanelLayout","separatorPadding","measured","computeEffectiveSpacing","computeEffectiveSpacingTop","Yn","ho","tp","sp","vo","wp","Kn","An","Ln","On","Nn","ProportionalExtra","fromArrow","pathPattern","makeGeometry","strokeCap","strokeJoin","strokeMiterLimit","Jx","Sn","ev","fv","Vn","iq","jq","fo","Un","getFigureGenerators","defineFigureGenerator","getArrowheadGeometries","defineArrowheadGeometry","wrap","flip","Xn","maxLines","verticalAlignment","isUnderline","isStrikethrough","spacingAbove","spacingBelow","formatting","metrics","arrSize","arrText","maxLineWidth","fontHeight","choices","$p","uo","Yr","ro","so","fz","dv","ov","Pu","getEllipsis","setEllipsis","getBaseline","setBaseline","getUnderline","setUnderline","isValidFont","WrapFit","WrapDesiredSize","WrapBreakAll","OverflowClip","OverflowEllipsis","imageStretch","QA","Event","videoWidth","videoHeight","sourceRect","__goCache","ratio","complete","HTMLVideoElement","crossOrigin","sourceCrossOrigin","imageAlignment","successFunction","reloadSource","xo","clearCache","yo","Gp","Cp","Rp","Ho","Tp","Sp","Ep","Dp","Hp","Oo","Po","Ip","Yo","Qo","Io","Xp","Wp","tq","ez","zo","Ao","Bo","Co","Eo","isTreeLeaf","Jo","Mo","No","Standard","Backward","Triangle","BackwardTriangle","Boomerang","BackwardBoomerang","SidewaysV","BackwardV","OpenTriangle","BackwardOpenTriangle","OpenTriangleLine","BackwardOpenTriangleLine","OpenTriangleTop","BackwardOpenTriangleTop","OpenTriangleBottom","BackwardOpenTriangleBottom","HalfTriangleTop","BackwardHalfTriangleTop","HalfTriangleBottom","BackwardHalfTriangleBottom","ForwardSemiCircle","BackwardSemiCircle","Feather","BackwardFeather","DoubleFeathers","BackwardDoubleFeathers","TripleFeathers","BackwardTripleFeathers","ForwardSlash","BackSlash","DoubleForwardSlash","DoubleBackSlash","TripleForwardSlash","TripleBackSlash","Fork","BackwardFork","LineFork","BackwardLineFork","CircleFork","BackwardCircleFork","CircleLineFork","BackwardCircleLineFork","Circle","Block","StretchedDiamond","Diamond","Chevron","StretchedChevron","NormalArrow","TailedNormalArrow","DoubleTriangle","BigEndArrow","ConcaveTailArrow","RoundedTriangle","SimpleArrow","AccelerationArrow","BoxArrow","TriangleLine","CircleEndedArrow","DynamicWidthArrow","EquilibriumArrow","FastForward","Kite","HalfArrowTop","HalfArrowBottom","OpposingDirectionDoubleArrow","PartialDoubleTriangle","LineCircle","DoubleLineCircle","TripleLineCircle","CircleLine","DiamondCircle","PlusCircle","OpenRightTriangleTop","OpenRightTriangleBottom","DoubleLine","TripleLine","PentagonArrow","updateRelationshipsFromData","selectionAdornmentTemplate","copyable","deletable","textEditable","groupable","movable","reshapable","resizable","rotatable","Ko","bA","eA","oy","canLayout","isLayoutPositioned","layoutConditions","setLinkCategoryForData","selectionChanged","highlightedChanged","rotateObjectName","containingGroupChanged","invalidateLayout","findCommonContainingGroup","isMemberOf","findTopLevelPart","findSubGraphLevel","getRelativePoint","invalidateAdornments","clearAdornments","removeAdornment","addAdornment","findAdornment","Ro","LayoutNone","LayoutAdded","LayoutRemoved","LayoutShown","LayoutHidden","LayoutNodeSized","LayoutGroupLayout","LayoutNodeReplaced","LayoutStandard","LayoutAll","nq","zp","So","To","Uo","au","lw","My","Ny","Vo","Wo","linkConnected","linkDisconnected","bp","Kq","dp","xA","Tv","Uv","py","Sv","Xz","Yz","Zo","Jt","zA","iA","Uz","gA","fA","hA","portSpreading","avoidableMargin","Oy","Dv","ports","treeExpandedChanged","findTreeParts","findTreeChildrenNodes","findTreeChildrenLinks","findTreeLevel","findTreeParentChain","findTreeParentNode","findTreeParentLink","findCommonTreeParent","findTreeRoot","isInTreeOf","findPort","findLinksTo","findLinksBetween","findNodesInto","findNodesOutOf","findNodesConnected","findLinksInto","findLinksOutOf","findExternalTreeLinksConnected","invalidateConnectedLinks","invalidateLinkBundle","fp","eq","memberAdded","computesBoundsIncludingLinks","memberRemoved","gp","Np","mq","Zp","vv","$r","Nx","Mx","Ru","isLabeledLink","vp","zq","yq","computeShortLength","computeJumpLength","usesSamePort","SpreadingNone","SpreadingEvenly","SpreadingPacked","canAddMembers","addMembers","ungroupable","Rv","Wz","Vz","computesBoundsAfterDrag","computesBoundsIncludingLocation","subGraphExpandedChanged","findSubGraphParts","findContainingGroupChain","findExternalNodesConnected","findExternalLinksConnected","computeMemberBounds","jp","lp","nA","removeDataForLink","relinkableFrom","relinkableTo","computeMidPoint","computeCorner","computeMidAngle","wA","uw","yw","Ct","computePoints","computeAdjusting","getLinkPoint","adjustPoints","computeCurviness","hasCurviness","computeEndSegmentLength","getLinkDirection","addOrthoPoints","Qq","Ap","Pv","computeOtherPoint","findMidLabel","computeSpacing","Bp","computeThickness","arrangeBundledLinks","computeMidOrthoPosition","Wy","abort","Gy","Sz","setFromNodeForLink","fromPortChanged","Cw","setToNodeForLink","toPortChanged","Hw","invalidateOtherJumpOvers","findClosestSegment","updateRoute","invalidateRoute","rollbackRoute","commitRoute","startRoute","clearPoints","removePoint","addPointAt","addPoint","insertPointAt","insertPoint","setPointAt","getPoint","getOtherPort","getOtherNode","hs","Normal","Orthogonal","AvoidsNodes","AvoidsNodesStraight","JumpGap","JumpOver","End","Scale","Stretch","OrientAlong","OrientPlus90","OrientMinus90","OrientOpposite","OrientUpright","OrientPlus90Upright","OrientMinus90Upright","OrientUpright45","EndSegmentStep","CurvinessStart","SpacingMin","OrthoShortCut","AvoidanceCell","AvoidanceLimit","Uint32Array","Sq","link","ow","Lq","qq","wt","lt","bq","dq","workerStateChanged","time","running","vertexes","edges","Lv","Cy","_GoJS","onNetworkSerialization","serializeLayoutProperties","serializeVertexProperties","serializeEdgeProperties","jB","Qz","createNetwork","createVertex","createEdge","Cq","deserializeEdgeProperties","deserializeLayoutProperties","arrangementOrigin","isRouting","isOngoing","makeNetwork","updateParts","workerLayout","network","commitLayout","doMinimalNoNetworkLayout","initialOrigin","doMinimalNetworkLayout","boundsComputation","$x","mayUseWorker","mayUseWorkerFunction","zz","terminate","Uw","Worker","DedicatedWorkerGlobalScope","onerror","filename","lineno","colno","message","url","scripts","useWorker","declareWorkerLayout","cancelWorker","collectParts","getLayoutBounds","currentScript","URL","createObjectURL","Blob","bu","Xt","rq","Eq","sq","fromVertex","toVertex","sourceEdges","destinationEdges","oq","vq","GoJSScriptURL","findGroupVertex","Ov","Lz","Ev","Cv","oz","Nv","Mv","Kz","Bq","deleteArtificialVertexes","Xy","Rz","findAllParts","splitIntoSubNetworks","deleteSelfEdges","reverseEdge","linkVertexes","findEdge","deleteLink","deleteEdge","addLink","addEdge","findVertex","deleteNode","deleteVertex","addNode","addVertex","addParts","kB","tA","fx","fy","Uy","jy","focusX","focusY","sourceEdgesArrayAccess","destinationEdgesArrayAccess","sourceVertexes","destinationVertexes","edgesCount","deleteDestinationEdge","addDestinationEdge","deleteSourceEdge","addSourceEdge","standardComparer","smartComparer","toLocaleLowerCase","localeCompare","fB","zy","getOtherVertex","Aq","sorting","arrangement","comparer","wrappingColumn","wrappingWidth","spacing","commitLayers","mr","Iq","resolveReferencesForData","copyPartData","Location","LeftToRight","RightToLeft","Forward","Reverse","Ascending","Descending","removeAllModeledParts","addModeledParts","nodeDataArray","$q","unresolveReferencesForPart","refreshDataBoundLinks","afterCopyFunction","removeModeledPart","removeModeledParts","Pq","Rq","br","cr","tu","lx","vu","cv","fr","hr","or","kr","Zt","Xq","copiesArrays","copiesArrayObjects","copiesKey","nodeKeyProperty","linkDataArray","Lt","Bw","Gw","Wq","ar","Ot","ku","gB","Yw","cloneDeep","removedNodeKeys","insertedNodeKeys","modifiedNodeData","quote","nodeCategoryProperty","Zw","rw","Dz","Xw","nodeIsGroupProperty","setDataProperty","Yy","hB","toJSON","Xx","incremental","vz","constructGraphLinksModel","du","qz","WA","KA","Sw","Cz","wr","mz","Pt","tw","makeUniqueKeyFunction","copyNodeDataFunction","setCategoryForNodeData","getCategoryForNodeData","removeArrayItem","insertArrayItem","addArrayItem","assignAllDataProperties","clearUnresolvedReferences","mergeNodeDataArray","removeNodeDataCollection","removeNodeData","addNodeDataCollection","addNodeData","makeNodeDataKeyUnique","findNodeDataForKey","containsNodeData","setKeyForNodeData","getKeyForNodeData","raiseDataChanged","writeJsonValue","replaceJsonObjects","applyIncrementalJSON","applyIncrementalJson","toJson","toIncrementalJSON","toIncrementalJson","computeJsonDifference","toIncrementalData","ht","Ou","fromJSON","fromJson","safePropertyValue","safePropertySet","Brush","ChangedEvent","Geometry","Margin","Panel","Point","Rect","Size","UndoManager","backConverter","MA","updateSource","updateTarget","ofModel","ofObject","makeTwoWay","zr","su","kx","uu","linkKeyProperty","Dr","xy","Ay","ju","yy","By","parseEnum","OneWay","TwoWay","removedLinkKeys","insertedLinkKeys","modifiedLinkData","linkCategoryProperty","linkFromKeyProperty","linkToKeyProperty","linkFromPortIdProperty","linkToPortIdProperty","linkLabelKeysProperty","nodeGroupKeyProperty","Cr","pz","JA","vw","makeUniqueLinkKeyFunction","copyLinkDataFunction","setCategoryForLinkData","getCategoryForLinkData","setGroupKeyForNodeData","getGroupKeyForNodeData","isGroupForNodeData","copyLinkData","mergeLinkDataArray","removeLinkDataCollection","removeLinkData","addLinkDataCollection","addLinkData","containsLinkData","makeLinkDataKeyUnique","findLinkDataForKey","setKeyForLinkData","getKeyForLinkData","removeLabelKeyForLinkData","addLabelKeyForLinkData","setLabelKeysForLinkData","getLabelKeysForLinkData","setToPortIdForLinkData","getToPortIdForLinkData","setFromPortIdForLinkData","getFromPortIdForLinkData","setToKeyForLinkData","getToKeyForLinkData","setFromKeyForLinkData","getFromKeyForLinkData","Er","$j","wx","Ur","vx","Gr","mx","ut","Bu","gz","tan","actualAngle","diameter","as","compare","GraphLinksModel","initDiagramModel","nodeParentKeyProperty","parentLinkCategoryProperty","setParentLinkCategoryForNodeData","getParentLinkCategoryForNodeData","setParentKeyForNodeData","getParentKeyForNodeData","TreeModel","nodeDiameterFormula","radius","aspectRatio","commitNodes","commitLinks","actualCenter","actualXRadius","actualYRadius","actualSpacing","maxIterations","ss","ts","qu","ru","pu","$w","ax","zw","isFixed","forceX","forceY","charge","electricalFieldX","electricalFieldY","mass","gravitationalFieldX","gravitationalFieldY","randomNumberGenerator","stiffness","moveFixedVertex","moveVertex","epsilonDistance","seed","Zy","az","bz","$y","Cs","Ds","Es","Ms","near","valid","portToPos","portFromPos","portFromColOffset","portToColOffset","Qs","rev","Rs","linkMinLength","forest","finish","dt","ct","nodeMinColumnSpace","ConstantSpacing","ConstantDistance","ConstantAngle","Packed","Clockwise","Counterclockwise","BidirectionalLeft","BidirectionalRight","Forwards","Optimized","Pythagorean","Circular","arrangementSpacing","arrangesToOrigin","setsPortSpots","comments","infinityDistance","moveLimit","defaultSpringStiffness","defaultSpringLength","defaultElectricalCharge","defaultGravitationalMass","defaultCommentSpringLength","defaultCommentElectricalCharge","electricalCharge","gravitationalMass","springStiffness","springLength","Fv","needsClusterLayout","addComments","Dw","currentIteration","layerSpacing","columnSpacing","cycleRemoveOption","layeringOption","initializeOption","iterations","aggressiveOption","packOption","linkSpacing","removeCycles","assignLayers","initializeIndices","reduceCrossings","straightenAndPack","nodeMinLayerSpace","countCrossings","Iv","maxLayer","avoidOrthogonalOverlaps","Ry","Qy","maxIndex","maxColumn","minIndexLayer","maxIndexLayer","nx","uv","initialized","level","initializeTreeVertexValues","sortTreeVertexChildren","childrenCount","descendantCount","maxChildrenCount","maxGenerationCount","assignTreeVertexValues","breadthLimit","nodeSpacing","rowSpacing","rowIndent","relativePoint","setPortSpots","layerSpacingParentOverlap","nodeIndent","nodeIndentPastParent","CycleDepthFirst","CycleGreedy","CycleFromLayers","LayerOptimalLinkLength","LayerLongestPathSink","LayerLongestPathSource","InitDepthFirstOut","InitDepthFirstIn","InitNaive","AggressiveNone","AggressiveLess","AggressiveMore","PackNone","PackExpand","PackStraighten","PackMedian","PackAll","copyInheritedPropertiesFrom","compaction","treeStyle","findRoots","layerStyle","layoutTree","arrangeTrees","commentSpacing","commentMargin","layoutComments","setsPortSpot","setsChildPortSpot","portSpot","childPortSpot","roots","rootDefaults","alternateDefaults","alternateSorting","alternateComparer","alternateAngle","alternateAlignment","alternateNodeIndent","alternateNodeIndentPastParent","alternateNodeSpacing","alternateLayerSpacing","alternateLayerSpacingParentOverlap","alternateCompaction","alternateBreadthLimit","alternateRowSpacing","alternateRowIndent","alternateCommentSpacing","alternateCommentMargin","alternateSetsPortSpot","alternatePortSpot","alternateSetsChildPortSpot","alternateChildPortSpot","ZA","lv","PathDefault","PathDestination","PathSource","SortingForwards","SortingReverse","SortingAscending","SortingDescending","AlignmentCenterSubtrees","AlignmentCenterChildren","AlignmentStart","AlignmentEnd","AlignmentBus","AlignmentBusBranching","AlignmentTopLeftBus","AlignmentBottomRightBus","CompactionNone","CompactionBlock","StyleLayered","StyleLastParents","StyleAlternating","StyleRootOnly","ArrangementVertical","ArrangementHorizontal","ArrangementFixedRoots","LayerIndividual","LayerSiblings","LayerUniform","relativePosition","subtreeSize","subtreeOffset","Group","EnumValue","List","Map","PathFigure","PathSegment","InputEvent","DiagramEvent","Model","Binding","CommandHandler","Tool","DraggingTool","DraggingInfo","DraggingOptions","LinkingBaseTool","LinkingTool","RelinkingTool","LinkReshapingTool","ResizingTool","RotatingTool","ClickSelectingTool","ActionTool","ClickCreatingTool","HTMLInfo","ContextMenuTool","DragSelectingTool","PanningTool","TextEditingTool","ToolManager","Animation","AnimationManager","AnimationTrigger","Layer","Diagram","Palette","Overview","GraphObject","RowColumnDefinition","Shape","TextBlock","TextBlockMetrics","Picture","Part","Adornment","Node","Placeholder","Layout","LayoutNetwork","LayoutVertex","LayoutEdge","GridLayout","PanelLayout","CircularLayout","CircularNetwork","CircularVertex","CircularEdge","ForceDirectedLayout","ForceDirectedNetwork","ForceDirectedVertex","ForceDirectedEdge","LayeredDigraphLayout","LayeredDigraphNetwork","LayeredDigraphVertex","LayeredDigraphEdge","TreeLayout","TreeNetwork","TreeVertex","TreeEdge","define","amd","dummy","Wrapper","NewTarget","NewTargetPrototype","requireObjectCoercible","activeXDocument","documentCreateElement","GT","LT","PROTOTYPE","SCRIPT","IE_PROTO","EmptyConstructor","scriptTag","content","NullProtoObjectViaActiveX","write","temp","parentWindow","NullProtoObjectViaIFrame","iframeDocument","iframe","JS","contentWindow","open","NullProtoObject","ActiveXObject","domain","FunctionName","createIteratorConstructor","setToStringTag","IteratorsCore","IteratorPrototype","BUGGY_SAFARI_ITERATORS","KEYS","VALUES","ENTRIES","returnThis","Iterable","NAME","IteratorConstructor","DEFAULT","IS_SET","CurrentIteratorPrototype","KEY","getIterationMethod","KIND","defaultIterator","IterablePrototype","INCORRECT_VALUES_NAME","nativeIterator","anyNativeIterator","entries","proto","functionToString","postfix","regexpFlags","nativeReplace","nativeExec","patchedExec","UPDATES_LAST_INDEX_WRONG","BROKEN_CARET","NPCG_INCLUDED","PATCH","reCopy","charsAdded","strCopy","multiline","replacement","feature","detection","POLYFILL","NATIVE","usingIterator","iteratorMethod","$defineProperty","Attributes","toPrimitive","isSymbol","NativePromise","speciesConstructor","promiseResolve","NON_GENERIC","real","onFinally","isFunction","ignoreCase","unicode","PrototypeOfArrayIteratorPrototype","arrayIterator","NEW_ITERATOR_PROTOTYPE","flush","head","toggle","promise","macrotask","IS_IOS_PEBBLE","IS_WEBOS_WEBKIT","WebKitMutationObserver","queueMicrotaskDescriptor","queueMicrotask","exit","task","NATIVE_SYMBOL","USE_SYMBOL_AS_UID","WellKnownSymbolsStore","symbolFor","createWellKnownSymbol","withoutSetter","description","ordinaryToPrimitive","TO_PRIMITIVE","exoticToPrim","SHARED","newPromiseCapability","promiseCapability","aFunction","$propertyIsEnumerable","NASHORN_BUG","1","aPossiblePrototype","CORRECT_SETTER","TAG","Pebble","$Symbol","check","globalThis","func","CORRECT_PROTOTYPE_GETTER","ObjectPrototype","addToUnscopables","defineIterator","ARRAY_ITERATOR","setInternalState","iterated","Arguments","callBind","Internal","OwnPromiseCapability","PromiseWrapper","nativeThen","redefineAll","anInstance","iterate","checkCorrectnessOfIteration","microtask","hostReportErrors","newPromiseCapabilityModule","perform","IS_BROWSER","PROMISE","getInternalPromiseState","NativePromisePrototype","PromiseConstructor","PromisePrototype","newGenericPromiseCapability","DISPATCH_EVENT","NATIVE_REJECTION_EVENT","PromiseRejectionEvent","UNHANDLED_REJECTION","REJECTION_HANDLED","PENDING","FULFILLED","REJECTED","HANDLED","UNHANDLED","SUBCLASSING","PROMISE_CONSTRUCTOR_SOURCE","GLOBAL_CORE_JS_PROMISE","FakePromise","INCORRECT_ITERATION","isThenable","isReject","notified","chain","reactions","exited","reaction","fail","rejection","onHandleUnhandled","onUnhandled","IS_UNHANDLED","isUnhandled","unwrap","internalReject","internalResolve","wrapper","executor","onFulfilled","onRejected","capability","$promiseResolve","remaining","alreadyCalled","race","getOwnPropertyDescriptorModule","PromiseCapability","$$resolve","$$reject","TO_STRING_TAG_SUPPORT","classofRaw","CORRECT_ARGUMENTS","tryGet","callee"],"mappings":"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","file":"js/chunk-vendors.80f2064b.js","sourcesContent":["var wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar test = {};\n\ntest[TO_STRING_TAG] = 'z';\n\nmodule.exports = String(test) === '[object z]';\n","var uncurryThis = require('../internals/function-uncurry-this');\nvar aCallable = require('../internals/a-callable');\n\nvar bind = uncurryThis(uncurryThis.bind);\n\n// optional / simple context binding\nmodule.exports = function (fn, that) {\n  aCallable(fn);\n  return that === undefined ? fn : bind ? bind(fn, that) : function (/* ...args */) {\n    return fn.apply(that, arguments);\n  };\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar call = require('../internals/function-call');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toPropertyKey = require('../internals/to-property-key');\nvar hasOwn = require('../internals/has-own-property');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\n\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.es/ecma262/#sec-object.getownpropertydescriptor\nexports.f = DESCRIPTORS ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n  O = toIndexedObject(O);\n  P = toPropertyKey(P);\n  if (IE8_DOM_DEFINE) try {\n    return $getOwnPropertyDescriptor(O, P);\n  } catch (error) { /* empty */ }\n  if (hasOwn(O, P)) return createPropertyDescriptor(!call(propertyIsEnumerableModule.f, O, P), O[P]);\n};\n","var toLength = require('../internals/to-length');\n\n// `LengthOfArrayLike` abstract operation\n// https://tc39.es/ecma262/#sec-lengthofarraylike\nmodule.exports = function (obj) {\n  return toLength(obj.length);\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar createElement = require('../internals/document-create-element');\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !DESCRIPTORS && !fails(function () {\n  // eslint-disable-next-line es/no-object-defineproperty -- requied for testing\n  return Object.defineProperty(createElement('div'), 'a', {\n    get: function () { return 7; }\n  }).a != 7;\n});\n","var global = require('../internals/global');\n\nvar String = global.String;\n\nmodule.exports = function (argument) {\n  try {\n    return String(argument);\n  } catch (error) {\n    return 'Object';\n  }\n};\n","var fails = require('../internals/fails');\nvar global = require('../internals/global');\n\n// babel-minify and Closure Compiler transpiles RegExp('(?<a>b)', 'g') -> /(?<a>b)/g and it causes SyntaxError\nvar $RegExp = global.RegExp;\n\nmodule.exports = fails(function () {\n  var re = $RegExp('(?<a>b)', 'g');\n  return re.exec('b').groups.a !== 'b' ||\n    'b'.replace(re, '$<a>c') !== 'bc';\n});\n","// `IsCallable` abstract operation\n// https://tc39.es/ecma262/#sec-iscallable\nmodule.exports = function (argument) {\n  return typeof argument == 'function';\n};\n","var global = require('../internals/global');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\n\nvar TypeError = global.TypeError;\n\nmodule.exports = function (it, Prototype) {\n  if (isPrototypeOf(Prototype, it)) return it;\n  throw TypeError('Incorrect invocation');\n};\n","var uncurryThis = require('../internals/function-uncurry-this');\nvar toObject = require('../internals/to-object');\n\nvar hasOwnProperty = uncurryThis({}.hasOwnProperty);\n\n// `HasOwnProperty` abstract operation\n// https://tc39.es/ecma262/#sec-hasownproperty\nmodule.exports = Object.hasOwn || function hasOwn(it, key) {\n  return hasOwnProperty(toObject(it), key);\n};\n","var getBuiltIn = require('../internals/get-built-in');\n\nmodule.exports = getBuiltIn('document', 'documentElement');\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n  var called = 0;\n  var iteratorWithReturn = {\n    next: function () {\n      return { done: !!called++ };\n    },\n    'return': function () {\n      SAFE_CLOSING = true;\n    }\n  };\n  iteratorWithReturn[ITERATOR] = function () {\n    return this;\n  };\n  // eslint-disable-next-line es/no-array-from, no-throw-literal -- required for testing\n  Array.from(iteratorWithReturn, function () { throw 2; });\n} catch (error) { /* empty */ }\n\nmodule.exports = function (exec, SKIP_CLOSING) {\n  if (!SKIP_CLOSING && !SAFE_CLOSING) return false;\n  var ITERATION_SUPPORT = false;\n  try {\n    var object = {};\n    object[ITERATOR] = function () {\n      return {\n        next: function () {\n          return { done: ITERATION_SUPPORT = true };\n        }\n      };\n    };\n    exec(object);\n  } catch (error) { /* empty */ }\n  return ITERATION_SUPPORT;\n};\n","var userAgent = require('../internals/engine-user-agent');\n\nmodule.exports = /(?:ipad|iphone|ipod).*applewebkit/i.test(userAgent);\n","var global = require('../internals/global');\n\nvar TypeError = global.TypeError;\n\n// `RequireObjectCoercible` abstract operation\n// https://tc39.es/ecma262/#sec-requireobjectcoercible\nmodule.exports = function (it) {\n  if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n  return it;\n};\n","var global = require('../internals/global');\nvar bind = require('../internals/function-bind-context');\nvar call = require('../internals/function-call');\nvar anObject = require('../internals/an-object');\nvar tryToString = require('../internals/try-to-string');\nvar isArrayIteratorMethod = require('../internals/is-array-iterator-method');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar getIterator = require('../internals/get-iterator');\nvar getIteratorMethod = require('../internals/get-iterator-method');\nvar iteratorClose = require('../internals/iterator-close');\n\nvar TypeError = global.TypeError;\n\nvar Result = function (stopped, result) {\n  this.stopped = stopped;\n  this.result = result;\n};\n\nvar ResultPrototype = Result.prototype;\n\nmodule.exports = function (iterable, unboundFunction, options) {\n  var that = options && options.that;\n  var AS_ENTRIES = !!(options && options.AS_ENTRIES);\n  var IS_ITERATOR = !!(options && options.IS_ITERATOR);\n  var INTERRUPTED = !!(options && options.INTERRUPTED);\n  var fn = bind(unboundFunction, that);\n  var iterator, iterFn, index, length, result, next, step;\n\n  var stop = function (condition) {\n    if (iterator) iteratorClose(iterator, 'normal', condition);\n    return new Result(true, condition);\n  };\n\n  var callFn = function (value) {\n    if (AS_ENTRIES) {\n      anObject(value);\n      return INTERRUPTED ? fn(value[0], value[1], stop) : fn(value[0], value[1]);\n    } return INTERRUPTED ? fn(value, stop) : fn(value);\n  };\n\n  if (IS_ITERATOR) {\n    iterator = iterable;\n  } else {\n    iterFn = getIteratorMethod(iterable);\n    if (!iterFn) throw TypeError(tryToString(iterable) + ' is not iterable');\n    // optimisation for array iterators\n    if (isArrayIteratorMethod(iterFn)) {\n      for (index = 0, length = lengthOfArrayLike(iterable); length > index; index++) {\n        result = callFn(iterable[index]);\n        if (result && isPrototypeOf(ResultPrototype, result)) return result;\n      } return new Result(false);\n    }\n    iterator = getIterator(iterable, iterFn);\n  }\n\n  next = iterator.next;\n  while (!(step = call(next, iterator)).done) {\n    try {\n      result = callFn(step.value);\n    } catch (error) {\n      iteratorClose(iterator, 'throw', error);\n    }\n    if (typeof result == 'object' && result && isPrototypeOf(ResultPrototype, result)) return result;\n  } return new Result(false);\n};\n","var toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\n\nvar max = Math.max;\nvar min = Math.min;\n\n// Helper for a popular repeating case of the spec:\n// Let integer be ? ToInteger(index).\n// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).\nmodule.exports = function (index, length) {\n  var integer = toIntegerOrInfinity(index);\n  return integer < 0 ? max(integer + length, 0) : min(integer, length);\n};\n","var global = require('../internals/global');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar redefine = require('../internals/redefine');\nvar setGlobal = require('../internals/set-global');\nvar copyConstructorProperties = require('../internals/copy-constructor-properties');\nvar isForced = require('../internals/is-forced');\n\n/*\n  options.target      - name of the target object\n  options.global      - target is the global object\n  options.stat        - export as static methods of target\n  options.proto       - export as prototype methods of target\n  options.real        - real prototype method for the `pure` version\n  options.forced      - export even if the native feature is available\n  options.bind        - bind methods to the target, required for the `pure` version\n  options.wrap        - wrap constructors to preventing global pollution, required for the `pure` version\n  options.unsafe      - use the simple assignment of property instead of delete + defineProperty\n  options.sham        - add a flag to not completely full polyfills\n  options.enumerable  - export as enumerable property\n  options.noTargetGet - prevent calling a getter on target\n  options.name        - the .name of the function if it does not match the key\n*/\nmodule.exports = function (options, source) {\n  var TARGET = options.target;\n  var GLOBAL = options.global;\n  var STATIC = options.stat;\n  var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n  if (GLOBAL) {\n    target = global;\n  } else if (STATIC) {\n    target = global[TARGET] || setGlobal(TARGET, {});\n  } else {\n    target = (global[TARGET] || {}).prototype;\n  }\n  if (target) for (key in source) {\n    sourceProperty = source[key];\n    if (options.noTargetGet) {\n      descriptor = getOwnPropertyDescriptor(target, key);\n      targetProperty = descriptor && descriptor.value;\n    } else targetProperty = target[key];\n    FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n    // contained in target\n    if (!FORCED && targetProperty !== undefined) {\n      if (typeof sourceProperty == typeof targetProperty) continue;\n      copyConstructorProperties(sourceProperty, targetProperty);\n    }\n    // add a flag to not completely full polyfills\n    if (options.sham || (targetProperty && targetProperty.sham)) {\n      createNonEnumerableProperty(sourceProperty, 'sham', true);\n    }\n    // extend global\n    redefine(target, key, sourceProperty, options);\n  }\n};\n","var internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\nvar hiddenKeys = enumBugKeys.concat('length', 'prototype');\n\n// `Object.getOwnPropertyNames` method\n// https://tc39.es/ecma262/#sec-object.getownpropertynames\n// eslint-disable-next-line es/no-object-getownpropertynames -- safe\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n  return internalObjectKeys(O, hiddenKeys);\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar PROPER_FUNCTION_NAME = require('../internals/function-name').PROPER;\nvar redefine = require('../internals/redefine');\nvar anObject = require('../internals/an-object');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar $toString = require('../internals/to-string');\nvar fails = require('../internals/fails');\nvar regExpFlags = require('../internals/regexp-flags');\n\nvar TO_STRING = 'toString';\nvar RegExpPrototype = RegExp.prototype;\nvar n$ToString = RegExpPrototype[TO_STRING];\nvar getFlags = uncurryThis(regExpFlags);\n\nvar NOT_GENERIC = fails(function () { return n$ToString.call({ source: 'a', flags: 'b' }) != '/a/b'; });\n// FF44- RegExp#toString has a wrong name\nvar INCORRECT_NAME = PROPER_FUNCTION_NAME && n$ToString.name != TO_STRING;\n\n// `RegExp.prototype.toString` method\n// https://tc39.es/ecma262/#sec-regexp.prototype.tostring\nif (NOT_GENERIC || INCORRECT_NAME) {\n  redefine(RegExp.prototype, TO_STRING, function toString() {\n    var R = anObject(this);\n    var p = $toString(R.source);\n    var rf = R.flags;\n    var f = $toString(rf === undefined && isPrototypeOf(RegExpPrototype, R) && !('flags' in RegExpPrototype) ? getFlags(R) : rf);\n    return '/' + p + '/' + f;\n  }, { unsafe: true });\n}\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar definePropertyModule = require('../internals/object-define-property');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar DESCRIPTORS = require('../internals/descriptors');\n\nvar SPECIES = wellKnownSymbol('species');\n\nmodule.exports = function (CONSTRUCTOR_NAME) {\n  var Constructor = getBuiltIn(CONSTRUCTOR_NAME);\n  var defineProperty = definePropertyModule.f;\n\n  if (DESCRIPTORS && Constructor && !Constructor[SPECIES]) {\n    defineProperty(Constructor, SPECIES, {\n      configurable: true,\n      get: function () { return this; }\n    });\n  }\n};\n","/* globals __VUE_SSR_CONTEXT__ */\n\n// IMPORTANT: Do NOT use ES2015 features in this file (except for modules).\n// This module is a runtime utility for cleaner component module output and will\n// be included in the final webpack user bundle.\n\nexport default function normalizeComponent (\n  scriptExports,\n  render,\n  staticRenderFns,\n  functionalTemplate,\n  injectStyles,\n  scopeId,\n  moduleIdentifier, /* server only */\n  shadowMode /* vue-cli only */\n) {\n  // Vue.extend constructor export interop\n  var options = typeof scriptExports === 'function'\n    ? scriptExports.options\n    : scriptExports\n\n  // render functions\n  if (render) {\n    options.render = render\n    options.staticRenderFns = staticRenderFns\n    options._compiled = true\n  }\n\n  // functional template\n  if (functionalTemplate) {\n    options.functional = true\n  }\n\n  // scopedId\n  if (scopeId) {\n    options._scopeId = 'data-v-' + scopeId\n  }\n\n  var hook\n  if (moduleIdentifier) { // server build\n    hook = function (context) {\n      // 2.3 injection\n      context =\n        context || // cached call\n        (this.$vnode && this.$vnode.ssrContext) || // stateful\n        (this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext) // functional\n      // 2.2 with runInNewContext: true\n      if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') {\n        context = __VUE_SSR_CONTEXT__\n      }\n      // inject component styles\n      if (injectStyles) {\n        injectStyles.call(this, context)\n      }\n      // register component module identifier for async chunk inferrence\n      if (context && context._registeredComponents) {\n        context._registeredComponents.add(moduleIdentifier)\n      }\n    }\n    // used by ssr in case component is cached and beforeCreate\n    // never gets called\n    options._ssrRegister = hook\n  } else if (injectStyles) {\n    hook = shadowMode\n      ? function () {\n        injectStyles.call(\n          this,\n          (options.functional ? this.parent : this).$root.$options.shadowRoot\n        )\n      }\n      : injectStyles\n  }\n\n  if (hook) {\n    if (options.functional) {\n      // for template-only hot-reload because in that case the render fn doesn't\n      // go through the normalizer\n      options._injectStyles = hook\n      // register for functional component in vue file\n      var originalRender = options.render\n      options.render = function renderWithStyleInjection (h, context) {\n        hook.call(context)\n        return originalRender(h, context)\n      }\n    } else {\n      // inject component registration as beforeCreate hook\n      var existing = options.beforeCreate\n      options.beforeCreate = existing\n        ? [].concat(existing, hook)\n        : [hook]\n    }\n  }\n\n  return {\n    exports: scriptExports,\n    options: options\n  }\n}\n","var call = require('../internals/function-call');\nvar anObject = require('../internals/an-object');\nvar getMethod = require('../internals/get-method');\n\nmodule.exports = function (iterator, kind, value) {\n  var innerResult, innerError;\n  anObject(iterator);\n  try {\n    innerResult = getMethod(iterator, 'return');\n    if (!innerResult) {\n      if (kind === 'throw') throw value;\n      return value;\n    }\n    innerResult = call(innerResult, iterator);\n  } catch (error) {\n    innerError = true;\n    innerResult = error;\n  }\n  if (kind === 'throw') throw value;\n  if (innerError) throw innerResult;\n  anObject(innerResult);\n  return value;\n};\n","/*!\n * Vue.js v2.6.14\n * (c) 2014-2021 Evan You\n * Released under the MIT License.\n */\n/*  */\n\nvar emptyObject = Object.freeze({});\n\n// These helpers produce better VM code in JS engines due to their\n// explicitness and function inlining.\nfunction isUndef (v) {\n  return v === undefined || v === null\n}\n\nfunction isDef (v) {\n  return v !== undefined && v !== null\n}\n\nfunction isTrue (v) {\n  return v === true\n}\n\nfunction isFalse (v) {\n  return v === false\n}\n\n/**\n * Check if value is primitive.\n */\nfunction isPrimitive (value) {\n  return (\n    typeof value === 'string' ||\n    typeof value === 'number' ||\n    // $flow-disable-line\n    typeof value === 'symbol' ||\n    typeof value === 'boolean'\n  )\n}\n\n/**\n * Quick object check - this is primarily used to tell\n * Objects from primitive values when we know the value\n * is a JSON-compliant type.\n */\nfunction isObject (obj) {\n  return obj !== null && typeof obj === 'object'\n}\n\n/**\n * Get the raw type string of a value, e.g., [object Object].\n */\nvar _toString = Object.prototype.toString;\n\nfunction toRawType (value) {\n  return _toString.call(value).slice(8, -1)\n}\n\n/**\n * Strict object type check. Only returns true\n * for plain JavaScript objects.\n */\nfunction isPlainObject (obj) {\n  return _toString.call(obj) === '[object Object]'\n}\n\nfunction isRegExp (v) {\n  return _toString.call(v) === '[object RegExp]'\n}\n\n/**\n * Check if val is a valid array index.\n */\nfunction isValidArrayIndex (val) {\n  var n = parseFloat(String(val));\n  return n >= 0 && Math.floor(n) === n && isFinite(val)\n}\n\nfunction isPromise (val) {\n  return (\n    isDef(val) &&\n    typeof val.then === 'function' &&\n    typeof val.catch === 'function'\n  )\n}\n\n/**\n * Convert a value to a string that is actually rendered.\n */\nfunction toString (val) {\n  return val == null\n    ? ''\n    : Array.isArray(val) || (isPlainObject(val) && val.toString === _toString)\n      ? JSON.stringify(val, null, 2)\n      : String(val)\n}\n\n/**\n * Convert an input value to a number for persistence.\n * If the conversion fails, return original string.\n */\nfunction toNumber (val) {\n  var n = parseFloat(val);\n  return isNaN(n) ? val : n\n}\n\n/**\n * Make a map and return a function for checking if a key\n * is in that map.\n */\nfunction makeMap (\n  str,\n  expectsLowerCase\n) {\n  var map = Object.create(null);\n  var list = str.split(',');\n  for (var i = 0; i < list.length; i++) {\n    map[list[i]] = true;\n  }\n  return expectsLowerCase\n    ? function (val) { return map[val.toLowerCase()]; }\n    : function (val) { return map[val]; }\n}\n\n/**\n * Check if a tag is a built-in tag.\n */\nvar isBuiltInTag = makeMap('slot,component', true);\n\n/**\n * Check if an attribute is a reserved attribute.\n */\nvar isReservedAttribute = makeMap('key,ref,slot,slot-scope,is');\n\n/**\n * Remove an item from an array.\n */\nfunction remove (arr, item) {\n  if (arr.length) {\n    var index = arr.indexOf(item);\n    if (index > -1) {\n      return arr.splice(index, 1)\n    }\n  }\n}\n\n/**\n * Check whether an object has the property.\n */\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nfunction hasOwn (obj, key) {\n  return hasOwnProperty.call(obj, key)\n}\n\n/**\n * Create a cached version of a pure function.\n */\nfunction cached (fn) {\n  var cache = Object.create(null);\n  return (function cachedFn (str) {\n    var hit = cache[str];\n    return hit || (cache[str] = fn(str))\n  })\n}\n\n/**\n * Camelize a hyphen-delimited string.\n */\nvar camelizeRE = /-(\\w)/g;\nvar camelize = cached(function (str) {\n  return str.replace(camelizeRE, function (_, c) { return c ? c.toUpperCase() : ''; })\n});\n\n/**\n * Capitalize a string.\n */\nvar capitalize = cached(function (str) {\n  return str.charAt(0).toUpperCase() + str.slice(1)\n});\n\n/**\n * Hyphenate a camelCase string.\n */\nvar hyphenateRE = /\\B([A-Z])/g;\nvar hyphenate = cached(function (str) {\n  return str.replace(hyphenateRE, '-$1').toLowerCase()\n});\n\n/**\n * Simple bind polyfill for environments that do not support it,\n * e.g., PhantomJS 1.x. Technically, we don't need this anymore\n * since native bind is now performant enough in most browsers.\n * But removing it would mean breaking code that was able to run in\n * PhantomJS 1.x, so this must be kept for backward compatibility.\n */\n\n/* istanbul ignore next */\nfunction polyfillBind (fn, ctx) {\n  function boundFn (a) {\n    var l = arguments.length;\n    return l\n      ? l > 1\n        ? fn.apply(ctx, arguments)\n        : fn.call(ctx, a)\n      : fn.call(ctx)\n  }\n\n  boundFn._length = fn.length;\n  return boundFn\n}\n\nfunction nativeBind (fn, ctx) {\n  return fn.bind(ctx)\n}\n\nvar bind = Function.prototype.bind\n  ? nativeBind\n  : polyfillBind;\n\n/**\n * Convert an Array-like object to a real Array.\n */\nfunction toArray (list, start) {\n  start = start || 0;\n  var i = list.length - start;\n  var ret = new Array(i);\n  while (i--) {\n    ret[i] = list[i + start];\n  }\n  return ret\n}\n\n/**\n * Mix properties into target object.\n */\nfunction extend (to, _from) {\n  for (var key in _from) {\n    to[key] = _from[key];\n  }\n  return to\n}\n\n/**\n * Merge an Array of Objects into a single Object.\n */\nfunction toObject (arr) {\n  var res = {};\n  for (var i = 0; i < arr.length; i++) {\n    if (arr[i]) {\n      extend(res, arr[i]);\n    }\n  }\n  return res\n}\n\n/* eslint-disable no-unused-vars */\n\n/**\n * Perform no operation.\n * Stubbing args to make Flow happy without leaving useless transpiled code\n * with ...rest (https://flow.org/blog/2017/05/07/Strict-Function-Call-Arity/).\n */\nfunction noop (a, b, c) {}\n\n/**\n * Always return false.\n */\nvar no = function (a, b, c) { return false; };\n\n/* eslint-enable no-unused-vars */\n\n/**\n * Return the same value.\n */\nvar identity = function (_) { return _; };\n\n/**\n * Check if two values are loosely equal - that is,\n * if they are plain objects, do they have the same shape?\n */\nfunction looseEqual (a, b) {\n  if (a === b) { return true }\n  var isObjectA = isObject(a);\n  var isObjectB = isObject(b);\n  if (isObjectA && isObjectB) {\n    try {\n      var isArrayA = Array.isArray(a);\n      var isArrayB = Array.isArray(b);\n      if (isArrayA && isArrayB) {\n        return a.length === b.length && a.every(function (e, i) {\n          return looseEqual(e, b[i])\n        })\n      } else if (a instanceof Date && b instanceof Date) {\n        return a.getTime() === b.getTime()\n      } else if (!isArrayA && !isArrayB) {\n        var keysA = Object.keys(a);\n        var keysB = Object.keys(b);\n        return keysA.length === keysB.length && keysA.every(function (key) {\n          return looseEqual(a[key], b[key])\n        })\n      } else {\n        /* istanbul ignore next */\n        return false\n      }\n    } catch (e) {\n      /* istanbul ignore next */\n      return false\n    }\n  } else if (!isObjectA && !isObjectB) {\n    return String(a) === String(b)\n  } else {\n    return false\n  }\n}\n\n/**\n * Return the first index at which a loosely equal value can be\n * found in the array (if value is a plain object, the array must\n * contain an object of the same shape), or -1 if it is not present.\n */\nfunction looseIndexOf (arr, val) {\n  for (var i = 0; i < arr.length; i++) {\n    if (looseEqual(arr[i], val)) { return i }\n  }\n  return -1\n}\n\n/**\n * Ensure a function is called only once.\n */\nfunction once (fn) {\n  var called = false;\n  return function () {\n    if (!called) {\n      called = true;\n      fn.apply(this, arguments);\n    }\n  }\n}\n\nvar SSR_ATTR = 'data-server-rendered';\n\nvar ASSET_TYPES = [\n  'component',\n  'directive',\n  'filter'\n];\n\nvar LIFECYCLE_HOOKS = [\n  'beforeCreate',\n  'created',\n  'beforeMount',\n  'mounted',\n  'beforeUpdate',\n  'updated',\n  'beforeDestroy',\n  'destroyed',\n  'activated',\n  'deactivated',\n  'errorCaptured',\n  'serverPrefetch'\n];\n\n/*  */\n\n\n\nvar config = ({\n  /**\n   * Option merge strategies (used in core/util/options)\n   */\n  // $flow-disable-line\n  optionMergeStrategies: Object.create(null),\n\n  /**\n   * Whether to suppress warnings.\n   */\n  silent: false,\n\n  /**\n   * Show production mode tip message on boot?\n   */\n  productionTip: process.env.NODE_ENV !== 'production',\n\n  /**\n   * Whether to enable devtools\n   */\n  devtools: process.env.NODE_ENV !== 'production',\n\n  /**\n   * Whether to record perf\n   */\n  performance: false,\n\n  /**\n   * Error handler for watcher errors\n   */\n  errorHandler: null,\n\n  /**\n   * Warn handler for watcher warns\n   */\n  warnHandler: null,\n\n  /**\n   * Ignore certain custom elements\n   */\n  ignoredElements: [],\n\n  /**\n   * Custom user key aliases for v-on\n   */\n  // $flow-disable-line\n  keyCodes: Object.create(null),\n\n  /**\n   * Check if a tag is reserved so that it cannot be registered as a\n   * component. This is platform-dependent and may be overwritten.\n   */\n  isReservedTag: no,\n\n  /**\n   * Check if an attribute is reserved so that it cannot be used as a component\n   * prop. This is platform-dependent and may be overwritten.\n   */\n  isReservedAttr: no,\n\n  /**\n   * Check if a tag is an unknown element.\n   * Platform-dependent.\n   */\n  isUnknownElement: no,\n\n  /**\n   * Get the namespace of an element\n   */\n  getTagNamespace: noop,\n\n  /**\n   * Parse the real tag name for the specific platform.\n   */\n  parsePlatformTagName: identity,\n\n  /**\n   * Check if an attribute must be bound using property, e.g. value\n   * Platform-dependent.\n   */\n  mustUseProp: no,\n\n  /**\n   * Perform updates asynchronously. Intended to be used by Vue Test Utils\n   * This will significantly reduce performance if set to false.\n   */\n  async: true,\n\n  /**\n   * Exposed for legacy reasons\n   */\n  _lifecycleHooks: LIFECYCLE_HOOKS\n});\n\n/*  */\n\n/**\n * unicode letters used for parsing html tags, component names and property paths.\n * using https://www.w3.org/TR/html53/semantics-scripting.html#potentialcustomelementname\n * skipping \\u10000-\\uEFFFF due to it freezing up PhantomJS\n */\nvar unicodeRegExp = /a-zA-Z\\u00B7\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u203F-\\u2040\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD/;\n\n/**\n * Check if a string starts with $ or _\n */\nfunction isReserved (str) {\n  var c = (str + '').charCodeAt(0);\n  return c === 0x24 || c === 0x5F\n}\n\n/**\n * Define a property.\n */\nfunction def (obj, key, val, enumerable) {\n  Object.defineProperty(obj, key, {\n    value: val,\n    enumerable: !!enumerable,\n    writable: true,\n    configurable: true\n  });\n}\n\n/**\n * Parse simple path.\n */\nvar bailRE = new RegExp((\"[^\" + (unicodeRegExp.source) + \".$_\\\\d]\"));\nfunction parsePath (path) {\n  if (bailRE.test(path)) {\n    return\n  }\n  var segments = path.split('.');\n  return function (obj) {\n    for (var i = 0; i < segments.length; i++) {\n      if (!obj) { return }\n      obj = obj[segments[i]];\n    }\n    return obj\n  }\n}\n\n/*  */\n\n// can we use __proto__?\nvar hasProto = '__proto__' in {};\n\n// Browser environment sniffing\nvar inBrowser = typeof window !== 'undefined';\nvar inWeex = typeof WXEnvironment !== 'undefined' && !!WXEnvironment.platform;\nvar weexPlatform = inWeex && WXEnvironment.platform.toLowerCase();\nvar UA = inBrowser && window.navigator.userAgent.toLowerCase();\nvar isIE = UA && /msie|trident/.test(UA);\nvar isIE9 = UA && UA.indexOf('msie 9.0') > 0;\nvar isEdge = UA && UA.indexOf('edge/') > 0;\nvar isAndroid = (UA && UA.indexOf('android') > 0) || (weexPlatform === 'android');\nvar isIOS = (UA && /iphone|ipad|ipod|ios/.test(UA)) || (weexPlatform === 'ios');\nvar isChrome = UA && /chrome\\/\\d+/.test(UA) && !isEdge;\nvar isPhantomJS = UA && /phantomjs/.test(UA);\nvar isFF = UA && UA.match(/firefox\\/(\\d+)/);\n\n// Firefox has a \"watch\" function on Object.prototype...\nvar nativeWatch = ({}).watch;\n\nvar supportsPassive = false;\nif (inBrowser) {\n  try {\n    var opts = {};\n    Object.defineProperty(opts, 'passive', ({\n      get: function get () {\n        /* istanbul ignore next */\n        supportsPassive = true;\n      }\n    })); // https://github.com/facebook/flow/issues/285\n    window.addEventListener('test-passive', null, opts);\n  } catch (e) {}\n}\n\n// this needs to be lazy-evaled because vue may be required before\n// vue-server-renderer can set VUE_ENV\nvar _isServer;\nvar isServerRendering = function () {\n  if (_isServer === undefined) {\n    /* istanbul ignore if */\n    if (!inBrowser && !inWeex && typeof global !== 'undefined') {\n      // detect presence of vue-server-renderer and avoid\n      // Webpack shimming the process\n      _isServer = global['process'] && global['process'].env.VUE_ENV === 'server';\n    } else {\n      _isServer = false;\n    }\n  }\n  return _isServer\n};\n\n// detect devtools\nvar devtools = inBrowser && window.__VUE_DEVTOOLS_GLOBAL_HOOK__;\n\n/* istanbul ignore next */\nfunction isNative (Ctor) {\n  return typeof Ctor === 'function' && /native code/.test(Ctor.toString())\n}\n\nvar hasSymbol =\n  typeof Symbol !== 'undefined' && isNative(Symbol) &&\n  typeof Reflect !== 'undefined' && isNative(Reflect.ownKeys);\n\nvar _Set;\n/* istanbul ignore if */ // $flow-disable-line\nif (typeof Set !== 'undefined' && isNative(Set)) {\n  // use native Set when available.\n  _Set = Set;\n} else {\n  // a non-standard Set polyfill that only works with primitive keys.\n  _Set = /*@__PURE__*/(function () {\n    function Set () {\n      this.set = Object.create(null);\n    }\n    Set.prototype.has = function has (key) {\n      return this.set[key] === true\n    };\n    Set.prototype.add = function add (key) {\n      this.set[key] = true;\n    };\n    Set.prototype.clear = function clear () {\n      this.set = Object.create(null);\n    };\n\n    return Set;\n  }());\n}\n\n/*  */\n\nvar warn = noop;\nvar tip = noop;\nvar generateComponentTrace = (noop); // work around flow check\nvar formatComponentName = (noop);\n\nif (process.env.NODE_ENV !== 'production') {\n  var hasConsole = typeof console !== 'undefined';\n  var classifyRE = /(?:^|[-_])(\\w)/g;\n  var classify = function (str) { return str\n    .replace(classifyRE, function (c) { return c.toUpperCase(); })\n    .replace(/[-_]/g, ''); };\n\n  warn = function (msg, vm) {\n    var trace = vm ? generateComponentTrace(vm) : '';\n\n    if (config.warnHandler) {\n      config.warnHandler.call(null, msg, vm, trace);\n    } else if (hasConsole && (!config.silent)) {\n      console.error((\"[Vue warn]: \" + msg + trace));\n    }\n  };\n\n  tip = function (msg, vm) {\n    if (hasConsole && (!config.silent)) {\n      console.warn(\"[Vue tip]: \" + msg + (\n        vm ? generateComponentTrace(vm) : ''\n      ));\n    }\n  };\n\n  formatComponentName = function (vm, includeFile) {\n    if (vm.$root === vm) {\n      return '<Root>'\n    }\n    var options = typeof vm === 'function' && vm.cid != null\n      ? vm.options\n      : vm._isVue\n        ? vm.$options || vm.constructor.options\n        : vm;\n    var name = options.name || options._componentTag;\n    var file = options.__file;\n    if (!name && file) {\n      var match = file.match(/([^/\\\\]+)\\.vue$/);\n      name = match && match[1];\n    }\n\n    return (\n      (name ? (\"<\" + (classify(name)) + \">\") : \"<Anonymous>\") +\n      (file && includeFile !== false ? (\" at \" + file) : '')\n    )\n  };\n\n  var repeat = function (str, n) {\n    var res = '';\n    while (n) {\n      if (n % 2 === 1) { res += str; }\n      if (n > 1) { str += str; }\n      n >>= 1;\n    }\n    return res\n  };\n\n  generateComponentTrace = function (vm) {\n    if (vm._isVue && vm.$parent) {\n      var tree = [];\n      var currentRecursiveSequence = 0;\n      while (vm) {\n        if (tree.length > 0) {\n          var last = tree[tree.length - 1];\n          if (last.constructor === vm.constructor) {\n            currentRecursiveSequence++;\n            vm = vm.$parent;\n            continue\n          } else if (currentRecursiveSequence > 0) {\n            tree[tree.length - 1] = [last, currentRecursiveSequence];\n            currentRecursiveSequence = 0;\n          }\n        }\n        tree.push(vm);\n        vm = vm.$parent;\n      }\n      return '\\n\\nfound in\\n\\n' + tree\n        .map(function (vm, i) { return (\"\" + (i === 0 ? '---> ' : repeat(' ', 5 + i * 2)) + (Array.isArray(vm)\n            ? ((formatComponentName(vm[0])) + \"... (\" + (vm[1]) + \" recursive calls)\")\n            : formatComponentName(vm))); })\n        .join('\\n')\n    } else {\n      return (\"\\n\\n(found in \" + (formatComponentName(vm)) + \")\")\n    }\n  };\n}\n\n/*  */\n\nvar uid = 0;\n\n/**\n * A dep is an observable that can have multiple\n * directives subscribing to it.\n */\nvar Dep = function Dep () {\n  this.id = uid++;\n  this.subs = [];\n};\n\nDep.prototype.addSub = function addSub (sub) {\n  this.subs.push(sub);\n};\n\nDep.prototype.removeSub = function removeSub (sub) {\n  remove(this.subs, sub);\n};\n\nDep.prototype.depend = function depend () {\n  if (Dep.target) {\n    Dep.target.addDep(this);\n  }\n};\n\nDep.prototype.notify = function notify () {\n  // stabilize the subscriber list first\n  var subs = this.subs.slice();\n  if (process.env.NODE_ENV !== 'production' && !config.async) {\n    // subs aren't sorted in scheduler if not running async\n    // we need to sort them now to make sure they fire in correct\n    // order\n    subs.sort(function (a, b) { return a.id - b.id; });\n  }\n  for (var i = 0, l = subs.length; i < l; i++) {\n    subs[i].update();\n  }\n};\n\n// The current target watcher being evaluated.\n// This is globally unique because only one watcher\n// can be evaluated at a time.\nDep.target = null;\nvar targetStack = [];\n\nfunction pushTarget (target) {\n  targetStack.push(target);\n  Dep.target = target;\n}\n\nfunction popTarget () {\n  targetStack.pop();\n  Dep.target = targetStack[targetStack.length - 1];\n}\n\n/*  */\n\nvar VNode = function VNode (\n  tag,\n  data,\n  children,\n  text,\n  elm,\n  context,\n  componentOptions,\n  asyncFactory\n) {\n  this.tag = tag;\n  this.data = data;\n  this.children = children;\n  this.text = text;\n  this.elm = elm;\n  this.ns = undefined;\n  this.context = context;\n  this.fnContext = undefined;\n  this.fnOptions = undefined;\n  this.fnScopeId = undefined;\n  this.key = data && data.key;\n  this.componentOptions = componentOptions;\n  this.componentInstance = undefined;\n  this.parent = undefined;\n  this.raw = false;\n  this.isStatic = false;\n  this.isRootInsert = true;\n  this.isComment = false;\n  this.isCloned = false;\n  this.isOnce = false;\n  this.asyncFactory = asyncFactory;\n  this.asyncMeta = undefined;\n  this.isAsyncPlaceholder = false;\n};\n\nvar prototypeAccessors = { child: { configurable: true } };\n\n// DEPRECATED: alias for componentInstance for backwards compat.\n/* istanbul ignore next */\nprototypeAccessors.child.get = function () {\n  return this.componentInstance\n};\n\nObject.defineProperties( VNode.prototype, prototypeAccessors );\n\nvar createEmptyVNode = function (text) {\n  if ( text === void 0 ) text = '';\n\n  var node = new VNode();\n  node.text = text;\n  node.isComment = true;\n  return node\n};\n\nfunction createTextVNode (val) {\n  return new VNode(undefined, undefined, undefined, String(val))\n}\n\n// optimized shallow clone\n// used for static nodes and slot nodes because they may be reused across\n// multiple renders, cloning them avoids errors when DOM manipulations rely\n// on their elm reference.\nfunction cloneVNode (vnode) {\n  var cloned = new VNode(\n    vnode.tag,\n    vnode.data,\n    // #7975\n    // clone children array to avoid mutating original in case of cloning\n    // a child.\n    vnode.children && vnode.children.slice(),\n    vnode.text,\n    vnode.elm,\n    vnode.context,\n    vnode.componentOptions,\n    vnode.asyncFactory\n  );\n  cloned.ns = vnode.ns;\n  cloned.isStatic = vnode.isStatic;\n  cloned.key = vnode.key;\n  cloned.isComment = vnode.isComment;\n  cloned.fnContext = vnode.fnContext;\n  cloned.fnOptions = vnode.fnOptions;\n  cloned.fnScopeId = vnode.fnScopeId;\n  cloned.asyncMeta = vnode.asyncMeta;\n  cloned.isCloned = true;\n  return cloned\n}\n\n/*\n * not type checking this file because flow doesn't play well with\n * dynamically accessing methods on Array prototype\n */\n\nvar arrayProto = Array.prototype;\nvar arrayMethods = Object.create(arrayProto);\n\nvar methodsToPatch = [\n  'push',\n  'pop',\n  'shift',\n  'unshift',\n  'splice',\n  'sort',\n  'reverse'\n];\n\n/**\n * Intercept mutating methods and emit events\n */\nmethodsToPatch.forEach(function (method) {\n  // cache original method\n  var original = arrayProto[method];\n  def(arrayMethods, method, function mutator () {\n    var args = [], len = arguments.length;\n    while ( len-- ) args[ len ] = arguments[ len ];\n\n    var result = original.apply(this, args);\n    var ob = this.__ob__;\n    var inserted;\n    switch (method) {\n      case 'push':\n      case 'unshift':\n        inserted = args;\n        break\n      case 'splice':\n        inserted = args.slice(2);\n        break\n    }\n    if (inserted) { ob.observeArray(inserted); }\n    // notify change\n    ob.dep.notify();\n    return result\n  });\n});\n\n/*  */\n\nvar arrayKeys = Object.getOwnPropertyNames(arrayMethods);\n\n/**\n * In some cases we may want to disable observation inside a component's\n * update computation.\n */\nvar shouldObserve = true;\n\nfunction toggleObserving (value) {\n  shouldObserve = value;\n}\n\n/**\n * Observer class that is attached to each observed\n * object. Once attached, the observer converts the target\n * object's property keys into getter/setters that\n * collect dependencies and dispatch updates.\n */\nvar Observer = function Observer (value) {\n  this.value = value;\n  this.dep = new Dep();\n  this.vmCount = 0;\n  def(value, '__ob__', this);\n  if (Array.isArray(value)) {\n    if (hasProto) {\n      protoAugment(value, arrayMethods);\n    } else {\n      copyAugment(value, arrayMethods, arrayKeys);\n    }\n    this.observeArray(value);\n  } else {\n    this.walk(value);\n  }\n};\n\n/**\n * Walk through all properties and convert them into\n * getter/setters. This method should only be called when\n * value type is Object.\n */\nObserver.prototype.walk = function walk (obj) {\n  var keys = Object.keys(obj);\n  for (var i = 0; i < keys.length; i++) {\n    defineReactive$$1(obj, keys[i]);\n  }\n};\n\n/**\n * Observe a list of Array items.\n */\nObserver.prototype.observeArray = function observeArray (items) {\n  for (var i = 0, l = items.length; i < l; i++) {\n    observe(items[i]);\n  }\n};\n\n// helpers\n\n/**\n * Augment a target Object or Array by intercepting\n * the prototype chain using __proto__\n */\nfunction protoAugment (target, src) {\n  /* eslint-disable no-proto */\n  target.__proto__ = src;\n  /* eslint-enable no-proto */\n}\n\n/**\n * Augment a target Object or Array by defining\n * hidden properties.\n */\n/* istanbul ignore next */\nfunction copyAugment (target, src, keys) {\n  for (var i = 0, l = keys.length; i < l; i++) {\n    var key = keys[i];\n    def(target, key, src[key]);\n  }\n}\n\n/**\n * Attempt to create an observer instance for a value,\n * returns the new observer if successfully observed,\n * or the existing observer if the value already has one.\n */\nfunction observe (value, asRootData) {\n  if (!isObject(value) || value instanceof VNode) {\n    return\n  }\n  var ob;\n  if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) {\n    ob = value.__ob__;\n  } else if (\n    shouldObserve &&\n    !isServerRendering() &&\n    (Array.isArray(value) || isPlainObject(value)) &&\n    Object.isExtensible(value) &&\n    !value._isVue\n  ) {\n    ob = new Observer(value);\n  }\n  if (asRootData && ob) {\n    ob.vmCount++;\n  }\n  return ob\n}\n\n/**\n * Define a reactive property on an Object.\n */\nfunction defineReactive$$1 (\n  obj,\n  key,\n  val,\n  customSetter,\n  shallow\n) {\n  var dep = new Dep();\n\n  var property = Object.getOwnPropertyDescriptor(obj, key);\n  if (property && property.configurable === false) {\n    return\n  }\n\n  // cater for pre-defined getter/setters\n  var getter = property && property.get;\n  var setter = property && property.set;\n  if ((!getter || setter) && arguments.length === 2) {\n    val = obj[key];\n  }\n\n  var childOb = !shallow && observe(val);\n  Object.defineProperty(obj, key, {\n    enumerable: true,\n    configurable: true,\n    get: function reactiveGetter () {\n      var value = getter ? getter.call(obj) : val;\n      if (Dep.target) {\n        dep.depend();\n        if (childOb) {\n          childOb.dep.depend();\n          if (Array.isArray(value)) {\n            dependArray(value);\n          }\n        }\n      }\n      return value\n    },\n    set: function reactiveSetter (newVal) {\n      var value = getter ? getter.call(obj) : val;\n      /* eslint-disable no-self-compare */\n      if (newVal === value || (newVal !== newVal && value !== value)) {\n        return\n      }\n      /* eslint-enable no-self-compare */\n      if (process.env.NODE_ENV !== 'production' && customSetter) {\n        customSetter();\n      }\n      // #7981: for accessor properties without setter\n      if (getter && !setter) { return }\n      if (setter) {\n        setter.call(obj, newVal);\n      } else {\n        val = newVal;\n      }\n      childOb = !shallow && observe(newVal);\n      dep.notify();\n    }\n  });\n}\n\n/**\n * Set a property on an object. Adds the new property and\n * triggers change notification if the property doesn't\n * already exist.\n */\nfunction set (target, key, val) {\n  if (process.env.NODE_ENV !== 'production' &&\n    (isUndef(target) || isPrimitive(target))\n  ) {\n    warn((\"Cannot set reactive property on undefined, null, or primitive value: \" + ((target))));\n  }\n  if (Array.isArray(target) && isValidArrayIndex(key)) {\n    target.length = Math.max(target.length, key);\n    target.splice(key, 1, val);\n    return val\n  }\n  if (key in target && !(key in Object.prototype)) {\n    target[key] = val;\n    return val\n  }\n  var ob = (target).__ob__;\n  if (target._isVue || (ob && ob.vmCount)) {\n    process.env.NODE_ENV !== 'production' && warn(\n      'Avoid adding reactive properties to a Vue instance or its root $data ' +\n      'at runtime - declare it upfront in the data option.'\n    );\n    return val\n  }\n  if (!ob) {\n    target[key] = val;\n    return val\n  }\n  defineReactive$$1(ob.value, key, val);\n  ob.dep.notify();\n  return val\n}\n\n/**\n * Delete a property and trigger change if necessary.\n */\nfunction del (target, key) {\n  if (process.env.NODE_ENV !== 'production' &&\n    (isUndef(target) || isPrimitive(target))\n  ) {\n    warn((\"Cannot delete reactive property on undefined, null, or primitive value: \" + ((target))));\n  }\n  if (Array.isArray(target) && isValidArrayIndex(key)) {\n    target.splice(key, 1);\n    return\n  }\n  var ob = (target).__ob__;\n  if (target._isVue || (ob && ob.vmCount)) {\n    process.env.NODE_ENV !== 'production' && warn(\n      'Avoid deleting properties on a Vue instance or its root $data ' +\n      '- just set it to null.'\n    );\n    return\n  }\n  if (!hasOwn(target, key)) {\n    return\n  }\n  delete target[key];\n  if (!ob) {\n    return\n  }\n  ob.dep.notify();\n}\n\n/**\n * Collect dependencies on array elements when the array is touched, since\n * we cannot intercept array element access like property getters.\n */\nfunction dependArray (value) {\n  for (var e = (void 0), i = 0, l = value.length; i < l; i++) {\n    e = value[i];\n    e && e.__ob__ && e.__ob__.dep.depend();\n    if (Array.isArray(e)) {\n      dependArray(e);\n    }\n  }\n}\n\n/*  */\n\n/**\n * Option overwriting strategies are functions that handle\n * how to merge a parent option value and a child option\n * value into the final value.\n */\nvar strats = config.optionMergeStrategies;\n\n/**\n * Options with restrictions\n */\nif (process.env.NODE_ENV !== 'production') {\n  strats.el = strats.propsData = function (parent, child, vm, key) {\n    if (!vm) {\n      warn(\n        \"option \\\"\" + key + \"\\\" can only be used during instance \" +\n        'creation with the `new` keyword.'\n      );\n    }\n    return defaultStrat(parent, child)\n  };\n}\n\n/**\n * Helper that recursively merges two data objects together.\n */\nfunction mergeData (to, from) {\n  if (!from) { return to }\n  var key, toVal, fromVal;\n\n  var keys = hasSymbol\n    ? Reflect.ownKeys(from)\n    : Object.keys(from);\n\n  for (var i = 0; i < keys.length; i++) {\n    key = keys[i];\n    // in case the object is already observed...\n    if (key === '__ob__') { continue }\n    toVal = to[key];\n    fromVal = from[key];\n    if (!hasOwn(to, key)) {\n      set(to, key, fromVal);\n    } else if (\n      toVal !== fromVal &&\n      isPlainObject(toVal) &&\n      isPlainObject(fromVal)\n    ) {\n      mergeData(toVal, fromVal);\n    }\n  }\n  return to\n}\n\n/**\n * Data\n */\nfunction mergeDataOrFn (\n  parentVal,\n  childVal,\n  vm\n) {\n  if (!vm) {\n    // in a Vue.extend merge, both should be functions\n    if (!childVal) {\n      return parentVal\n    }\n    if (!parentVal) {\n      return childVal\n    }\n    // when parentVal & childVal are both present,\n    // we need to return a function that returns the\n    // merged result of both functions... no need to\n    // check if parentVal is a function here because\n    // it has to be a function to pass previous merges.\n    return function mergedDataFn () {\n      return mergeData(\n        typeof childVal === 'function' ? childVal.call(this, this) : childVal,\n        typeof parentVal === 'function' ? parentVal.call(this, this) : parentVal\n      )\n    }\n  } else {\n    return function mergedInstanceDataFn () {\n      // instance merge\n      var instanceData = typeof childVal === 'function'\n        ? childVal.call(vm, vm)\n        : childVal;\n      var defaultData = typeof parentVal === 'function'\n        ? parentVal.call(vm, vm)\n        : parentVal;\n      if (instanceData) {\n        return mergeData(instanceData, defaultData)\n      } else {\n        return defaultData\n      }\n    }\n  }\n}\n\nstrats.data = function (\n  parentVal,\n  childVal,\n  vm\n) {\n  if (!vm) {\n    if (childVal && typeof childVal !== 'function') {\n      process.env.NODE_ENV !== 'production' && warn(\n        'The \"data\" option should be a function ' +\n        'that returns a per-instance value in component ' +\n        'definitions.',\n        vm\n      );\n\n      return parentVal\n    }\n    return mergeDataOrFn(parentVal, childVal)\n  }\n\n  return mergeDataOrFn(parentVal, childVal, vm)\n};\n\n/**\n * Hooks and props are merged as arrays.\n */\nfunction mergeHook (\n  parentVal,\n  childVal\n) {\n  var res = childVal\n    ? parentVal\n      ? parentVal.concat(childVal)\n      : Array.isArray(childVal)\n        ? childVal\n        : [childVal]\n    : parentVal;\n  return res\n    ? dedupeHooks(res)\n    : res\n}\n\nfunction dedupeHooks (hooks) {\n  var res = [];\n  for (var i = 0; i < hooks.length; i++) {\n    if (res.indexOf(hooks[i]) === -1) {\n      res.push(hooks[i]);\n    }\n  }\n  return res\n}\n\nLIFECYCLE_HOOKS.forEach(function (hook) {\n  strats[hook] = mergeHook;\n});\n\n/**\n * Assets\n *\n * When a vm is present (instance creation), we need to do\n * a three-way merge between constructor options, instance\n * options and parent options.\n */\nfunction mergeAssets (\n  parentVal,\n  childVal,\n  vm,\n  key\n) {\n  var res = Object.create(parentVal || null);\n  if (childVal) {\n    process.env.NODE_ENV !== 'production' && assertObjectType(key, childVal, vm);\n    return extend(res, childVal)\n  } else {\n    return res\n  }\n}\n\nASSET_TYPES.forEach(function (type) {\n  strats[type + 's'] = mergeAssets;\n});\n\n/**\n * Watchers.\n *\n * Watchers hashes should not overwrite one\n * another, so we merge them as arrays.\n */\nstrats.watch = function (\n  parentVal,\n  childVal,\n  vm,\n  key\n) {\n  // work around Firefox's Object.prototype.watch...\n  if (parentVal === nativeWatch) { parentVal = undefined; }\n  if (childVal === nativeWatch) { childVal = undefined; }\n  /* istanbul ignore if */\n  if (!childVal) { return Object.create(parentVal || null) }\n  if (process.env.NODE_ENV !== 'production') {\n    assertObjectType(key, childVal, vm);\n  }\n  if (!parentVal) { return childVal }\n  var ret = {};\n  extend(ret, parentVal);\n  for (var key$1 in childVal) {\n    var parent = ret[key$1];\n    var child = childVal[key$1];\n    if (parent && !Array.isArray(parent)) {\n      parent = [parent];\n    }\n    ret[key$1] = parent\n      ? parent.concat(child)\n      : Array.isArray(child) ? child : [child];\n  }\n  return ret\n};\n\n/**\n * Other object hashes.\n */\nstrats.props =\nstrats.methods =\nstrats.inject =\nstrats.computed = function (\n  parentVal,\n  childVal,\n  vm,\n  key\n) {\n  if (childVal && process.env.NODE_ENV !== 'production') {\n    assertObjectType(key, childVal, vm);\n  }\n  if (!parentVal) { return childVal }\n  var ret = Object.create(null);\n  extend(ret, parentVal);\n  if (childVal) { extend(ret, childVal); }\n  return ret\n};\nstrats.provide = mergeDataOrFn;\n\n/**\n * Default strategy.\n */\nvar defaultStrat = function (parentVal, childVal) {\n  return childVal === undefined\n    ? parentVal\n    : childVal\n};\n\n/**\n * Validate component names\n */\nfunction checkComponents (options) {\n  for (var key in options.components) {\n    validateComponentName(key);\n  }\n}\n\nfunction validateComponentName (name) {\n  if (!new RegExp((\"^[a-zA-Z][\\\\-\\\\.0-9_\" + (unicodeRegExp.source) + \"]*$\")).test(name)) {\n    warn(\n      'Invalid component name: \"' + name + '\". Component names ' +\n      'should conform to valid custom element name in html5 specification.'\n    );\n  }\n  if (isBuiltInTag(name) || config.isReservedTag(name)) {\n    warn(\n      'Do not use built-in or reserved HTML elements as component ' +\n      'id: ' + name\n    );\n  }\n}\n\n/**\n * Ensure all props option syntax are normalized into the\n * Object-based format.\n */\nfunction normalizeProps (options, vm) {\n  var props = options.props;\n  if (!props) { return }\n  var res = {};\n  var i, val, name;\n  if (Array.isArray(props)) {\n    i = props.length;\n    while (i--) {\n      val = props[i];\n      if (typeof val === 'string') {\n        name = camelize(val);\n        res[name] = { type: null };\n      } else if (process.env.NODE_ENV !== 'production') {\n        warn('props must be strings when using array syntax.');\n      }\n    }\n  } else if (isPlainObject(props)) {\n    for (var key in props) {\n      val = props[key];\n      name = camelize(key);\n      res[name] = isPlainObject(val)\n        ? val\n        : { type: val };\n    }\n  } else if (process.env.NODE_ENV !== 'production') {\n    warn(\n      \"Invalid value for option \\\"props\\\": expected an Array or an Object, \" +\n      \"but got \" + (toRawType(props)) + \".\",\n      vm\n    );\n  }\n  options.props = res;\n}\n\n/**\n * Normalize all injections into Object-based format\n */\nfunction normalizeInject (options, vm) {\n  var inject = options.inject;\n  if (!inject) { return }\n  var normalized = options.inject = {};\n  if (Array.isArray(inject)) {\n    for (var i = 0; i < inject.length; i++) {\n      normalized[inject[i]] = { from: inject[i] };\n    }\n  } else if (isPlainObject(inject)) {\n    for (var key in inject) {\n      var val = inject[key];\n      normalized[key] = isPlainObject(val)\n        ? extend({ from: key }, val)\n        : { from: val };\n    }\n  } else if (process.env.NODE_ENV !== 'production') {\n    warn(\n      \"Invalid value for option \\\"inject\\\": expected an Array or an Object, \" +\n      \"but got \" + (toRawType(inject)) + \".\",\n      vm\n    );\n  }\n}\n\n/**\n * Normalize raw function directives into object format.\n */\nfunction normalizeDirectives (options) {\n  var dirs = options.directives;\n  if (dirs) {\n    for (var key in dirs) {\n      var def$$1 = dirs[key];\n      if (typeof def$$1 === 'function') {\n        dirs[key] = { bind: def$$1, update: def$$1 };\n      }\n    }\n  }\n}\n\nfunction assertObjectType (name, value, vm) {\n  if (!isPlainObject(value)) {\n    warn(\n      \"Invalid value for option \\\"\" + name + \"\\\": expected an Object, \" +\n      \"but got \" + (toRawType(value)) + \".\",\n      vm\n    );\n  }\n}\n\n/**\n * Merge two option objects into a new one.\n * Core utility used in both instantiation and inheritance.\n */\nfunction mergeOptions (\n  parent,\n  child,\n  vm\n) {\n  if (process.env.NODE_ENV !== 'production') {\n    checkComponents(child);\n  }\n\n  if (typeof child === 'function') {\n    child = child.options;\n  }\n\n  normalizeProps(child, vm);\n  normalizeInject(child, vm);\n  normalizeDirectives(child);\n\n  // Apply extends and mixins on the child options,\n  // but only if it is a raw options object that isn't\n  // the result of another mergeOptions call.\n  // Only merged options has the _base property.\n  if (!child._base) {\n    if (child.extends) {\n      parent = mergeOptions(parent, child.extends, vm);\n    }\n    if (child.mixins) {\n      for (var i = 0, l = child.mixins.length; i < l; i++) {\n        parent = mergeOptions(parent, child.mixins[i], vm);\n      }\n    }\n  }\n\n  var options = {};\n  var key;\n  for (key in parent) {\n    mergeField(key);\n  }\n  for (key in child) {\n    if (!hasOwn(parent, key)) {\n      mergeField(key);\n    }\n  }\n  function mergeField (key) {\n    var strat = strats[key] || defaultStrat;\n    options[key] = strat(parent[key], child[key], vm, key);\n  }\n  return options\n}\n\n/**\n * Resolve an asset.\n * This function is used because child instances need access\n * to assets defined in its ancestor chain.\n */\nfunction resolveAsset (\n  options,\n  type,\n  id,\n  warnMissing\n) {\n  /* istanbul ignore if */\n  if (typeof id !== 'string') {\n    return\n  }\n  var assets = options[type];\n  // check local registration variations first\n  if (hasOwn(assets, id)) { return assets[id] }\n  var camelizedId = camelize(id);\n  if (hasOwn(assets, camelizedId)) { return assets[camelizedId] }\n  var PascalCaseId = capitalize(camelizedId);\n  if (hasOwn(assets, PascalCaseId)) { return assets[PascalCaseId] }\n  // fallback to prototype chain\n  var res = assets[id] || assets[camelizedId] || assets[PascalCaseId];\n  if (process.env.NODE_ENV !== 'production' && warnMissing && !res) {\n    warn(\n      'Failed to resolve ' + type.slice(0, -1) + ': ' + id,\n      options\n    );\n  }\n  return res\n}\n\n/*  */\n\n\n\nfunction validateProp (\n  key,\n  propOptions,\n  propsData,\n  vm\n) {\n  var prop = propOptions[key];\n  var absent = !hasOwn(propsData, key);\n  var value = propsData[key];\n  // boolean casting\n  var booleanIndex = getTypeIndex(Boolean, prop.type);\n  if (booleanIndex > -1) {\n    if (absent && !hasOwn(prop, 'default')) {\n      value = false;\n    } else if (value === '' || value === hyphenate(key)) {\n      // only cast empty string / same name to boolean if\n      // boolean has higher priority\n      var stringIndex = getTypeIndex(String, prop.type);\n      if (stringIndex < 0 || booleanIndex < stringIndex) {\n        value = true;\n      }\n    }\n  }\n  // check default value\n  if (value === undefined) {\n    value = getPropDefaultValue(vm, prop, key);\n    // since the default value is a fresh copy,\n    // make sure to observe it.\n    var prevShouldObserve = shouldObserve;\n    toggleObserving(true);\n    observe(value);\n    toggleObserving(prevShouldObserve);\n  }\n  if (\n    process.env.NODE_ENV !== 'production' &&\n    // skip validation for weex recycle-list child component props\n    !(false)\n  ) {\n    assertProp(prop, key, value, vm, absent);\n  }\n  return value\n}\n\n/**\n * Get the default value of a prop.\n */\nfunction getPropDefaultValue (vm, prop, key) {\n  // no default, return undefined\n  if (!hasOwn(prop, 'default')) {\n    return undefined\n  }\n  var def = prop.default;\n  // warn against non-factory defaults for Object & Array\n  if (process.env.NODE_ENV !== 'production' && isObject(def)) {\n    warn(\n      'Invalid default value for prop \"' + key + '\": ' +\n      'Props with type Object/Array must use a factory function ' +\n      'to return the default value.',\n      vm\n    );\n  }\n  // the raw prop value was also undefined from previous render,\n  // return previous default value to avoid unnecessary watcher trigger\n  if (vm && vm.$options.propsData &&\n    vm.$options.propsData[key] === undefined &&\n    vm._props[key] !== undefined\n  ) {\n    return vm._props[key]\n  }\n  // call factory function for non-Function types\n  // a value is Function if its prototype is function even across different execution context\n  return typeof def === 'function' && getType(prop.type) !== 'Function'\n    ? def.call(vm)\n    : def\n}\n\n/**\n * Assert whether a prop is valid.\n */\nfunction assertProp (\n  prop,\n  name,\n  value,\n  vm,\n  absent\n) {\n  if (prop.required && absent) {\n    warn(\n      'Missing required prop: \"' + name + '\"',\n      vm\n    );\n    return\n  }\n  if (value == null && !prop.required) {\n    return\n  }\n  var type = prop.type;\n  var valid = !type || type === true;\n  var expectedTypes = [];\n  if (type) {\n    if (!Array.isArray(type)) {\n      type = [type];\n    }\n    for (var i = 0; i < type.length && !valid; i++) {\n      var assertedType = assertType(value, type[i], vm);\n      expectedTypes.push(assertedType.expectedType || '');\n      valid = assertedType.valid;\n    }\n  }\n\n  var haveExpectedTypes = expectedTypes.some(function (t) { return t; });\n  if (!valid && haveExpectedTypes) {\n    warn(\n      getInvalidTypeMessage(name, value, expectedTypes),\n      vm\n    );\n    return\n  }\n  var validator = prop.validator;\n  if (validator) {\n    if (!validator(value)) {\n      warn(\n        'Invalid prop: custom validator check failed for prop \"' + name + '\".',\n        vm\n      );\n    }\n  }\n}\n\nvar simpleCheckRE = /^(String|Number|Boolean|Function|Symbol|BigInt)$/;\n\nfunction assertType (value, type, vm) {\n  var valid;\n  var expectedType = getType(type);\n  if (simpleCheckRE.test(expectedType)) {\n    var t = typeof value;\n    valid = t === expectedType.toLowerCase();\n    // for primitive wrapper objects\n    if (!valid && t === 'object') {\n      valid = value instanceof type;\n    }\n  } else if (expectedType === 'Object') {\n    valid = isPlainObject(value);\n  } else if (expectedType === 'Array') {\n    valid = Array.isArray(value);\n  } else {\n    try {\n      valid = value instanceof type;\n    } catch (e) {\n      warn('Invalid prop type: \"' + String(type) + '\" is not a constructor', vm);\n      valid = false;\n    }\n  }\n  return {\n    valid: valid,\n    expectedType: expectedType\n  }\n}\n\nvar functionTypeCheckRE = /^\\s*function (\\w+)/;\n\n/**\n * Use function string name to check built-in types,\n * because a simple equality check will fail when running\n * across different vms / iframes.\n */\nfunction getType (fn) {\n  var match = fn && fn.toString().match(functionTypeCheckRE);\n  return match ? match[1] : ''\n}\n\nfunction isSameType (a, b) {\n  return getType(a) === getType(b)\n}\n\nfunction getTypeIndex (type, expectedTypes) {\n  if (!Array.isArray(expectedTypes)) {\n    return isSameType(expectedTypes, type) ? 0 : -1\n  }\n  for (var i = 0, len = expectedTypes.length; i < len; i++) {\n    if (isSameType(expectedTypes[i], type)) {\n      return i\n    }\n  }\n  return -1\n}\n\nfunction getInvalidTypeMessage (name, value, expectedTypes) {\n  var message = \"Invalid prop: type check failed for prop \\\"\" + name + \"\\\".\" +\n    \" Expected \" + (expectedTypes.map(capitalize).join(', '));\n  var expectedType = expectedTypes[0];\n  var receivedType = toRawType(value);\n  // check if we need to specify expected value\n  if (\n    expectedTypes.length === 1 &&\n    isExplicable(expectedType) &&\n    isExplicable(typeof value) &&\n    !isBoolean(expectedType, receivedType)\n  ) {\n    message += \" with value \" + (styleValue(value, expectedType));\n  }\n  message += \", got \" + receivedType + \" \";\n  // check if we need to specify received value\n  if (isExplicable(receivedType)) {\n    message += \"with value \" + (styleValue(value, receivedType)) + \".\";\n  }\n  return message\n}\n\nfunction styleValue (value, type) {\n  if (type === 'String') {\n    return (\"\\\"\" + value + \"\\\"\")\n  } else if (type === 'Number') {\n    return (\"\" + (Number(value)))\n  } else {\n    return (\"\" + value)\n  }\n}\n\nvar EXPLICABLE_TYPES = ['string', 'number', 'boolean'];\nfunction isExplicable (value) {\n  return EXPLICABLE_TYPES.some(function (elem) { return value.toLowerCase() === elem; })\n}\n\nfunction isBoolean () {\n  var args = [], len = arguments.length;\n  while ( len-- ) args[ len ] = arguments[ len ];\n\n  return args.some(function (elem) { return elem.toLowerCase() === 'boolean'; })\n}\n\n/*  */\n\nfunction handleError (err, vm, info) {\n  // Deactivate deps tracking while processing error handler to avoid possible infinite rendering.\n  // See: https://github.com/vuejs/vuex/issues/1505\n  pushTarget();\n  try {\n    if (vm) {\n      var cur = vm;\n      while ((cur = cur.$parent)) {\n        var hooks = cur.$options.errorCaptured;\n        if (hooks) {\n          for (var i = 0; i < hooks.length; i++) {\n            try {\n              var capture = hooks[i].call(cur, err, vm, info) === false;\n              if (capture) { return }\n            } catch (e) {\n              globalHandleError(e, cur, 'errorCaptured hook');\n            }\n          }\n        }\n      }\n    }\n    globalHandleError(err, vm, info);\n  } finally {\n    popTarget();\n  }\n}\n\nfunction invokeWithErrorHandling (\n  handler,\n  context,\n  args,\n  vm,\n  info\n) {\n  var res;\n  try {\n    res = args ? handler.apply(context, args) : handler.call(context);\n    if (res && !res._isVue && isPromise(res) && !res._handled) {\n      res.catch(function (e) { return handleError(e, vm, info + \" (Promise/async)\"); });\n      // issue #9511\n      // avoid catch triggering multiple times when nested calls\n      res._handled = true;\n    }\n  } catch (e) {\n    handleError(e, vm, info);\n  }\n  return res\n}\n\nfunction globalHandleError (err, vm, info) {\n  if (config.errorHandler) {\n    try {\n      return config.errorHandler.call(null, err, vm, info)\n    } catch (e) {\n      // if the user intentionally throws the original error in the handler,\n      // do not log it twice\n      if (e !== err) {\n        logError(e, null, 'config.errorHandler');\n      }\n    }\n  }\n  logError(err, vm, info);\n}\n\nfunction logError (err, vm, info) {\n  if (process.env.NODE_ENV !== 'production') {\n    warn((\"Error in \" + info + \": \\\"\" + (err.toString()) + \"\\\"\"), vm);\n  }\n  /* istanbul ignore else */\n  if ((inBrowser || inWeex) && typeof console !== 'undefined') {\n    console.error(err);\n  } else {\n    throw err\n  }\n}\n\n/*  */\n\nvar isUsingMicroTask = false;\n\nvar callbacks = [];\nvar pending = false;\n\nfunction flushCallbacks () {\n  pending = false;\n  var copies = callbacks.slice(0);\n  callbacks.length = 0;\n  for (var i = 0; i < copies.length; i++) {\n    copies[i]();\n  }\n}\n\n// Here we have async deferring wrappers using microtasks.\n// In 2.5 we used (macro) tasks (in combination with microtasks).\n// However, it has subtle problems when state is changed right before repaint\n// (e.g. #6813, out-in transitions).\n// Also, using (macro) tasks in event handler would cause some weird behaviors\n// that cannot be circumvented (e.g. #7109, #7153, #7546, #7834, #8109).\n// So we now use microtasks everywhere, again.\n// A major drawback of this tradeoff is that there are some scenarios\n// where microtasks have too high a priority and fire in between supposedly\n// sequential events (e.g. #4521, #6690, which have workarounds)\n// or even between bubbling of the same event (#6566).\nvar timerFunc;\n\n// The nextTick behavior leverages the microtask queue, which can be accessed\n// via either native Promise.then or MutationObserver.\n// MutationObserver has wider support, however it is seriously bugged in\n// UIWebView in iOS >= 9.3.3 when triggered in touch event handlers. It\n// completely stops working after triggering a few times... so, if native\n// Promise is available, we will use it:\n/* istanbul ignore next, $flow-disable-line */\nif (typeof Promise !== 'undefined' && isNative(Promise)) {\n  var p = Promise.resolve();\n  timerFunc = function () {\n    p.then(flushCallbacks);\n    // In problematic UIWebViews, Promise.then doesn't completely break, but\n    // it can get stuck in a weird state where callbacks are pushed into the\n    // microtask queue but the queue isn't being flushed, until the browser\n    // needs to do some other work, e.g. handle a timer. Therefore we can\n    // \"force\" the microtask queue to be flushed by adding an empty timer.\n    if (isIOS) { setTimeout(noop); }\n  };\n  isUsingMicroTask = true;\n} else if (!isIE && typeof MutationObserver !== 'undefined' && (\n  isNative(MutationObserver) ||\n  // PhantomJS and iOS 7.x\n  MutationObserver.toString() === '[object MutationObserverConstructor]'\n)) {\n  // Use MutationObserver where native Promise is not available,\n  // e.g. PhantomJS, iOS7, Android 4.4\n  // (#6466 MutationObserver is unreliable in IE11)\n  var counter = 1;\n  var observer = new MutationObserver(flushCallbacks);\n  var textNode = document.createTextNode(String(counter));\n  observer.observe(textNode, {\n    characterData: true\n  });\n  timerFunc = function () {\n    counter = (counter + 1) % 2;\n    textNode.data = String(counter);\n  };\n  isUsingMicroTask = true;\n} else if (typeof setImmediate !== 'undefined' && isNative(setImmediate)) {\n  // Fallback to setImmediate.\n  // Technically it leverages the (macro) task queue,\n  // but it is still a better choice than setTimeout.\n  timerFunc = function () {\n    setImmediate(flushCallbacks);\n  };\n} else {\n  // Fallback to setTimeout.\n  timerFunc = function () {\n    setTimeout(flushCallbacks, 0);\n  };\n}\n\nfunction nextTick (cb, ctx) {\n  var _resolve;\n  callbacks.push(function () {\n    if (cb) {\n      try {\n        cb.call(ctx);\n      } catch (e) {\n        handleError(e, ctx, 'nextTick');\n      }\n    } else if (_resolve) {\n      _resolve(ctx);\n    }\n  });\n  if (!pending) {\n    pending = true;\n    timerFunc();\n  }\n  // $flow-disable-line\n  if (!cb && typeof Promise !== 'undefined') {\n    return new Promise(function (resolve) {\n      _resolve = resolve;\n    })\n  }\n}\n\n/*  */\n\n/* not type checking this file because flow doesn't play well with Proxy */\n\nvar initProxy;\n\nif (process.env.NODE_ENV !== 'production') {\n  var allowedGlobals = makeMap(\n    'Infinity,undefined,NaN,isFinite,isNaN,' +\n    'parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,' +\n    'Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,' +\n    'require' // for Webpack/Browserify\n  );\n\n  var warnNonPresent = function (target, key) {\n    warn(\n      \"Property or method \\\"\" + key + \"\\\" is not defined on the instance but \" +\n      'referenced during render. Make sure that this property is reactive, ' +\n      'either in the data option, or for class-based components, by ' +\n      'initializing the property. ' +\n      'See: https://vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties.',\n      target\n    );\n  };\n\n  var warnReservedPrefix = function (target, key) {\n    warn(\n      \"Property \\\"\" + key + \"\\\" must be accessed with \\\"$data.\" + key + \"\\\" because \" +\n      'properties starting with \"$\" or \"_\" are not proxied in the Vue instance to ' +\n      'prevent conflicts with Vue internals. ' +\n      'See: https://vuejs.org/v2/api/#data',\n      target\n    );\n  };\n\n  var hasProxy =\n    typeof Proxy !== 'undefined' && isNative(Proxy);\n\n  if (hasProxy) {\n    var isBuiltInModifier = makeMap('stop,prevent,self,ctrl,shift,alt,meta,exact');\n    config.keyCodes = new Proxy(config.keyCodes, {\n      set: function set (target, key, value) {\n        if (isBuiltInModifier(key)) {\n          warn((\"Avoid overwriting built-in modifier in config.keyCodes: .\" + key));\n          return false\n        } else {\n          target[key] = value;\n          return true\n        }\n      }\n    });\n  }\n\n  var hasHandler = {\n    has: function has (target, key) {\n      var has = key in target;\n      var isAllowed = allowedGlobals(key) ||\n        (typeof key === 'string' && key.charAt(0) === '_' && !(key in target.$data));\n      if (!has && !isAllowed) {\n        if (key in target.$data) { warnReservedPrefix(target, key); }\n        else { warnNonPresent(target, key); }\n      }\n      return has || !isAllowed\n    }\n  };\n\n  var getHandler = {\n    get: function get (target, key) {\n      if (typeof key === 'string' && !(key in target)) {\n        if (key in target.$data) { warnReservedPrefix(target, key); }\n        else { warnNonPresent(target, key); }\n      }\n      return target[key]\n    }\n  };\n\n  initProxy = function initProxy (vm) {\n    if (hasProxy) {\n      // determine which proxy handler to use\n      var options = vm.$options;\n      var handlers = options.render && options.render._withStripped\n        ? getHandler\n        : hasHandler;\n      vm._renderProxy = new Proxy(vm, handlers);\n    } else {\n      vm._renderProxy = vm;\n    }\n  };\n}\n\n/*  */\n\nvar seenObjects = new _Set();\n\n/**\n * Recursively traverse an object to evoke all converted\n * getters, so that every nested property inside the object\n * is collected as a \"deep\" dependency.\n */\nfunction traverse (val) {\n  _traverse(val, seenObjects);\n  seenObjects.clear();\n}\n\nfunction _traverse (val, seen) {\n  var i, keys;\n  var isA = Array.isArray(val);\n  if ((!isA && !isObject(val)) || Object.isFrozen(val) || val instanceof VNode) {\n    return\n  }\n  if (val.__ob__) {\n    var depId = val.__ob__.dep.id;\n    if (seen.has(depId)) {\n      return\n    }\n    seen.add(depId);\n  }\n  if (isA) {\n    i = val.length;\n    while (i--) { _traverse(val[i], seen); }\n  } else {\n    keys = Object.keys(val);\n    i = keys.length;\n    while (i--) { _traverse(val[keys[i]], seen); }\n  }\n}\n\nvar mark;\nvar measure;\n\nif (process.env.NODE_ENV !== 'production') {\n  var perf = inBrowser && window.performance;\n  /* istanbul ignore if */\n  if (\n    perf &&\n    perf.mark &&\n    perf.measure &&\n    perf.clearMarks &&\n    perf.clearMeasures\n  ) {\n    mark = function (tag) { return perf.mark(tag); };\n    measure = function (name, startTag, endTag) {\n      perf.measure(name, startTag, endTag);\n      perf.clearMarks(startTag);\n      perf.clearMarks(endTag);\n      // perf.clearMeasures(name)\n    };\n  }\n}\n\n/*  */\n\nvar normalizeEvent = cached(function (name) {\n  var passive = name.charAt(0) === '&';\n  name = passive ? name.slice(1) : name;\n  var once$$1 = name.charAt(0) === '~'; // Prefixed last, checked first\n  name = once$$1 ? name.slice(1) : name;\n  var capture = name.charAt(0) === '!';\n  name = capture ? name.slice(1) : name;\n  return {\n    name: name,\n    once: once$$1,\n    capture: capture,\n    passive: passive\n  }\n});\n\nfunction createFnInvoker (fns, vm) {\n  function invoker () {\n    var arguments$1 = arguments;\n\n    var fns = invoker.fns;\n    if (Array.isArray(fns)) {\n      var cloned = fns.slice();\n      for (var i = 0; i < cloned.length; i++) {\n        invokeWithErrorHandling(cloned[i], null, arguments$1, vm, \"v-on handler\");\n      }\n    } else {\n      // return handler return value for single handlers\n      return invokeWithErrorHandling(fns, null, arguments, vm, \"v-on handler\")\n    }\n  }\n  invoker.fns = fns;\n  return invoker\n}\n\nfunction updateListeners (\n  on,\n  oldOn,\n  add,\n  remove$$1,\n  createOnceHandler,\n  vm\n) {\n  var name, def$$1, cur, old, event;\n  for (name in on) {\n    def$$1 = cur = on[name];\n    old = oldOn[name];\n    event = normalizeEvent(name);\n    if (isUndef(cur)) {\n      process.env.NODE_ENV !== 'production' && warn(\n        \"Invalid handler for event \\\"\" + (event.name) + \"\\\": got \" + String(cur),\n        vm\n      );\n    } else if (isUndef(old)) {\n      if (isUndef(cur.fns)) {\n        cur = on[name] = createFnInvoker(cur, vm);\n      }\n      if (isTrue(event.once)) {\n        cur = on[name] = createOnceHandler(event.name, cur, event.capture);\n      }\n      add(event.name, cur, event.capture, event.passive, event.params);\n    } else if (cur !== old) {\n      old.fns = cur;\n      on[name] = old;\n    }\n  }\n  for (name in oldOn) {\n    if (isUndef(on[name])) {\n      event = normalizeEvent(name);\n      remove$$1(event.name, oldOn[name], event.capture);\n    }\n  }\n}\n\n/*  */\n\nfunction mergeVNodeHook (def, hookKey, hook) {\n  if (def instanceof VNode) {\n    def = def.data.hook || (def.data.hook = {});\n  }\n  var invoker;\n  var oldHook = def[hookKey];\n\n  function wrappedHook () {\n    hook.apply(this, arguments);\n    // important: remove merged hook to ensure it's called only once\n    // and prevent memory leak\n    remove(invoker.fns, wrappedHook);\n  }\n\n  if (isUndef(oldHook)) {\n    // no existing hook\n    invoker = createFnInvoker([wrappedHook]);\n  } else {\n    /* istanbul ignore if */\n    if (isDef(oldHook.fns) && isTrue(oldHook.merged)) {\n      // already a merged invoker\n      invoker = oldHook;\n      invoker.fns.push(wrappedHook);\n    } else {\n      // existing plain hook\n      invoker = createFnInvoker([oldHook, wrappedHook]);\n    }\n  }\n\n  invoker.merged = true;\n  def[hookKey] = invoker;\n}\n\n/*  */\n\nfunction extractPropsFromVNodeData (\n  data,\n  Ctor,\n  tag\n) {\n  // we are only extracting raw values here.\n  // validation and default values are handled in the child\n  // component itself.\n  var propOptions = Ctor.options.props;\n  if (isUndef(propOptions)) {\n    return\n  }\n  var res = {};\n  var attrs = data.attrs;\n  var props = data.props;\n  if (isDef(attrs) || isDef(props)) {\n    for (var key in propOptions) {\n      var altKey = hyphenate(key);\n      if (process.env.NODE_ENV !== 'production') {\n        var keyInLowerCase = key.toLowerCase();\n        if (\n          key !== keyInLowerCase &&\n          attrs && hasOwn(attrs, keyInLowerCase)\n        ) {\n          tip(\n            \"Prop \\\"\" + keyInLowerCase + \"\\\" is passed to component \" +\n            (formatComponentName(tag || Ctor)) + \", but the declared prop name is\" +\n            \" \\\"\" + key + \"\\\". \" +\n            \"Note that HTML attributes are case-insensitive and camelCased \" +\n            \"props need to use their kebab-case equivalents when using in-DOM \" +\n            \"templates. You should probably use \\\"\" + altKey + \"\\\" instead of \\\"\" + key + \"\\\".\"\n          );\n        }\n      }\n      checkProp(res, props, key, altKey, true) ||\n      checkProp(res, attrs, key, altKey, false);\n    }\n  }\n  return res\n}\n\nfunction checkProp (\n  res,\n  hash,\n  key,\n  altKey,\n  preserve\n) {\n  if (isDef(hash)) {\n    if (hasOwn(hash, key)) {\n      res[key] = hash[key];\n      if (!preserve) {\n        delete hash[key];\n      }\n      return true\n    } else if (hasOwn(hash, altKey)) {\n      res[key] = hash[altKey];\n      if (!preserve) {\n        delete hash[altKey];\n      }\n      return true\n    }\n  }\n  return false\n}\n\n/*  */\n\n// The template compiler attempts to minimize the need for normalization by\n// statically analyzing the template at compile time.\n//\n// For plain HTML markup, normalization can be completely skipped because the\n// generated render function is guaranteed to return Array<VNode>. There are\n// two cases where extra normalization is needed:\n\n// 1. When the children contains components - because a functional component\n// may return an Array instead of a single root. In this case, just a simple\n// normalization is needed - if any child is an Array, we flatten the whole\n// thing with Array.prototype.concat. It is guaranteed to be only 1-level deep\n// because functional components already normalize their own children.\nfunction simpleNormalizeChildren (children) {\n  for (var i = 0; i < children.length; i++) {\n    if (Array.isArray(children[i])) {\n      return Array.prototype.concat.apply([], children)\n    }\n  }\n  return children\n}\n\n// 2. When the children contains constructs that always generated nested Arrays,\n// e.g. <template>, <slot>, v-for, or when the children is provided by user\n// with hand-written render functions / JSX. In such cases a full normalization\n// is needed to cater to all possible types of children values.\nfunction normalizeChildren (children) {\n  return isPrimitive(children)\n    ? [createTextVNode(children)]\n    : Array.isArray(children)\n      ? normalizeArrayChildren(children)\n      : undefined\n}\n\nfunction isTextNode (node) {\n  return isDef(node) && isDef(node.text) && isFalse(node.isComment)\n}\n\nfunction normalizeArrayChildren (children, nestedIndex) {\n  var res = [];\n  var i, c, lastIndex, last;\n  for (i = 0; i < children.length; i++) {\n    c = children[i];\n    if (isUndef(c) || typeof c === 'boolean') { continue }\n    lastIndex = res.length - 1;\n    last = res[lastIndex];\n    //  nested\n    if (Array.isArray(c)) {\n      if (c.length > 0) {\n        c = normalizeArrayChildren(c, ((nestedIndex || '') + \"_\" + i));\n        // merge adjacent text nodes\n        if (isTextNode(c[0]) && isTextNode(last)) {\n          res[lastIndex] = createTextVNode(last.text + (c[0]).text);\n          c.shift();\n        }\n        res.push.apply(res, c);\n      }\n    } else if (isPrimitive(c)) {\n      if (isTextNode(last)) {\n        // merge adjacent text nodes\n        // this is necessary for SSR hydration because text nodes are\n        // essentially merged when rendered to HTML strings\n        res[lastIndex] = createTextVNode(last.text + c);\n      } else if (c !== '') {\n        // convert primitive to vnode\n        res.push(createTextVNode(c));\n      }\n    } else {\n      if (isTextNode(c) && isTextNode(last)) {\n        // merge adjacent text nodes\n        res[lastIndex] = createTextVNode(last.text + c.text);\n      } else {\n        // default key for nested array children (likely generated by v-for)\n        if (isTrue(children._isVList) &&\n          isDef(c.tag) &&\n          isUndef(c.key) &&\n          isDef(nestedIndex)) {\n          c.key = \"__vlist\" + nestedIndex + \"_\" + i + \"__\";\n        }\n        res.push(c);\n      }\n    }\n  }\n  return res\n}\n\n/*  */\n\nfunction initProvide (vm) {\n  var provide = vm.$options.provide;\n  if (provide) {\n    vm._provided = typeof provide === 'function'\n      ? provide.call(vm)\n      : provide;\n  }\n}\n\nfunction initInjections (vm) {\n  var result = resolveInject(vm.$options.inject, vm);\n  if (result) {\n    toggleObserving(false);\n    Object.keys(result).forEach(function (key) {\n      /* istanbul ignore else */\n      if (process.env.NODE_ENV !== 'production') {\n        defineReactive$$1(vm, key, result[key], function () {\n          warn(\n            \"Avoid mutating an injected value directly since the changes will be \" +\n            \"overwritten whenever the provided component re-renders. \" +\n            \"injection being mutated: \\\"\" + key + \"\\\"\",\n            vm\n          );\n        });\n      } else {\n        defineReactive$$1(vm, key, result[key]);\n      }\n    });\n    toggleObserving(true);\n  }\n}\n\nfunction resolveInject (inject, vm) {\n  if (inject) {\n    // inject is :any because flow is not smart enough to figure out cached\n    var result = Object.create(null);\n    var keys = hasSymbol\n      ? Reflect.ownKeys(inject)\n      : Object.keys(inject);\n\n    for (var i = 0; i < keys.length; i++) {\n      var key = keys[i];\n      // #6574 in case the inject object is observed...\n      if (key === '__ob__') { continue }\n      var provideKey = inject[key].from;\n      var source = vm;\n      while (source) {\n        if (source._provided && hasOwn(source._provided, provideKey)) {\n          result[key] = source._provided[provideKey];\n          break\n        }\n        source = source.$parent;\n      }\n      if (!source) {\n        if ('default' in inject[key]) {\n          var provideDefault = inject[key].default;\n          result[key] = typeof provideDefault === 'function'\n            ? provideDefault.call(vm)\n            : provideDefault;\n        } else if (process.env.NODE_ENV !== 'production') {\n          warn((\"Injection \\\"\" + key + \"\\\" not found\"), vm);\n        }\n      }\n    }\n    return result\n  }\n}\n\n/*  */\n\n\n\n/**\n * Runtime helper for resolving raw children VNodes into a slot object.\n */\nfunction resolveSlots (\n  children,\n  context\n) {\n  if (!children || !children.length) {\n    return {}\n  }\n  var slots = {};\n  for (var i = 0, l = children.length; i < l; i++) {\n    var child = children[i];\n    var data = child.data;\n    // remove slot attribute if the node is resolved as a Vue slot node\n    if (data && data.attrs && data.attrs.slot) {\n      delete data.attrs.slot;\n    }\n    // named slots should only be respected if the vnode was rendered in the\n    // same context.\n    if ((child.context === context || child.fnContext === context) &&\n      data && data.slot != null\n    ) {\n      var name = data.slot;\n      var slot = (slots[name] || (slots[name] = []));\n      if (child.tag === 'template') {\n        slot.push.apply(slot, child.children || []);\n      } else {\n        slot.push(child);\n      }\n    } else {\n      (slots.default || (slots.default = [])).push(child);\n    }\n  }\n  // ignore slots that contains only whitespace\n  for (var name$1 in slots) {\n    if (slots[name$1].every(isWhitespace)) {\n      delete slots[name$1];\n    }\n  }\n  return slots\n}\n\nfunction isWhitespace (node) {\n  return (node.isComment && !node.asyncFactory) || node.text === ' '\n}\n\n/*  */\n\nfunction isAsyncPlaceholder (node) {\n  return node.isComment && node.asyncFactory\n}\n\n/*  */\n\nfunction normalizeScopedSlots (\n  slots,\n  normalSlots,\n  prevSlots\n) {\n  var res;\n  var hasNormalSlots = Object.keys(normalSlots).length > 0;\n  var isStable = slots ? !!slots.$stable : !hasNormalSlots;\n  var key = slots && slots.$key;\n  if (!slots) {\n    res = {};\n  } else if (slots._normalized) {\n    // fast path 1: child component re-render only, parent did not change\n    return slots._normalized\n  } else if (\n    isStable &&\n    prevSlots &&\n    prevSlots !== emptyObject &&\n    key === prevSlots.$key &&\n    !hasNormalSlots &&\n    !prevSlots.$hasNormal\n  ) {\n    // fast path 2: stable scoped slots w/ no normal slots to proxy,\n    // only need to normalize once\n    return prevSlots\n  } else {\n    res = {};\n    for (var key$1 in slots) {\n      if (slots[key$1] && key$1[0] !== '$') {\n        res[key$1] = normalizeScopedSlot(normalSlots, key$1, slots[key$1]);\n      }\n    }\n  }\n  // expose normal slots on scopedSlots\n  for (var key$2 in normalSlots) {\n    if (!(key$2 in res)) {\n      res[key$2] = proxyNormalSlot(normalSlots, key$2);\n    }\n  }\n  // avoriaz seems to mock a non-extensible $scopedSlots object\n  // and when that is passed down this would cause an error\n  if (slots && Object.isExtensible(slots)) {\n    (slots)._normalized = res;\n  }\n  def(res, '$stable', isStable);\n  def(res, '$key', key);\n  def(res, '$hasNormal', hasNormalSlots);\n  return res\n}\n\nfunction normalizeScopedSlot(normalSlots, key, fn) {\n  var normalized = function () {\n    var res = arguments.length ? fn.apply(null, arguments) : fn({});\n    res = res && typeof res === 'object' && !Array.isArray(res)\n      ? [res] // single vnode\n      : normalizeChildren(res);\n    var vnode = res && res[0];\n    return res && (\n      !vnode ||\n      (res.length === 1 && vnode.isComment && !isAsyncPlaceholder(vnode)) // #9658, #10391\n    ) ? undefined\n      : res\n  };\n  // this is a slot using the new v-slot syntax without scope. although it is\n  // compiled as a scoped slot, render fn users would expect it to be present\n  // on this.$slots because the usage is semantically a normal slot.\n  if (fn.proxy) {\n    Object.defineProperty(normalSlots, key, {\n      get: normalized,\n      enumerable: true,\n      configurable: true\n    });\n  }\n  return normalized\n}\n\nfunction proxyNormalSlot(slots, key) {\n  return function () { return slots[key]; }\n}\n\n/*  */\n\n/**\n * Runtime helper for rendering v-for lists.\n */\nfunction renderList (\n  val,\n  render\n) {\n  var ret, i, l, keys, key;\n  if (Array.isArray(val) || typeof val === 'string') {\n    ret = new Array(val.length);\n    for (i = 0, l = val.length; i < l; i++) {\n      ret[i] = render(val[i], i);\n    }\n  } else if (typeof val === 'number') {\n    ret = new Array(val);\n    for (i = 0; i < val; i++) {\n      ret[i] = render(i + 1, i);\n    }\n  } else if (isObject(val)) {\n    if (hasSymbol && val[Symbol.iterator]) {\n      ret = [];\n      var iterator = val[Symbol.iterator]();\n      var result = iterator.next();\n      while (!result.done) {\n        ret.push(render(result.value, ret.length));\n        result = iterator.next();\n      }\n    } else {\n      keys = Object.keys(val);\n      ret = new Array(keys.length);\n      for (i = 0, l = keys.length; i < l; i++) {\n        key = keys[i];\n        ret[i] = render(val[key], key, i);\n      }\n    }\n  }\n  if (!isDef(ret)) {\n    ret = [];\n  }\n  (ret)._isVList = true;\n  return ret\n}\n\n/*  */\n\n/**\n * Runtime helper for rendering <slot>\n */\nfunction renderSlot (\n  name,\n  fallbackRender,\n  props,\n  bindObject\n) {\n  var scopedSlotFn = this.$scopedSlots[name];\n  var nodes;\n  if (scopedSlotFn) {\n    // scoped slot\n    props = props || {};\n    if (bindObject) {\n      if (process.env.NODE_ENV !== 'production' && !isObject(bindObject)) {\n        warn('slot v-bind without argument expects an Object', this);\n      }\n      props = extend(extend({}, bindObject), props);\n    }\n    nodes =\n      scopedSlotFn(props) ||\n      (typeof fallbackRender === 'function' ? fallbackRender() : fallbackRender);\n  } else {\n    nodes =\n      this.$slots[name] ||\n      (typeof fallbackRender === 'function' ? fallbackRender() : fallbackRender);\n  }\n\n  var target = props && props.slot;\n  if (target) {\n    return this.$createElement('template', { slot: target }, nodes)\n  } else {\n    return nodes\n  }\n}\n\n/*  */\n\n/**\n * Runtime helper for resolving filters\n */\nfunction resolveFilter (id) {\n  return resolveAsset(this.$options, 'filters', id, true) || identity\n}\n\n/*  */\n\nfunction isKeyNotMatch (expect, actual) {\n  if (Array.isArray(expect)) {\n    return expect.indexOf(actual) === -1\n  } else {\n    return expect !== actual\n  }\n}\n\n/**\n * Runtime helper for checking keyCodes from config.\n * exposed as Vue.prototype._k\n * passing in eventKeyName as last argument separately for backwards compat\n */\nfunction checkKeyCodes (\n  eventKeyCode,\n  key,\n  builtInKeyCode,\n  eventKeyName,\n  builtInKeyName\n) {\n  var mappedKeyCode = config.keyCodes[key] || builtInKeyCode;\n  if (builtInKeyName && eventKeyName && !config.keyCodes[key]) {\n    return isKeyNotMatch(builtInKeyName, eventKeyName)\n  } else if (mappedKeyCode) {\n    return isKeyNotMatch(mappedKeyCode, eventKeyCode)\n  } else if (eventKeyName) {\n    return hyphenate(eventKeyName) !== key\n  }\n  return eventKeyCode === undefined\n}\n\n/*  */\n\n/**\n * Runtime helper for merging v-bind=\"object\" into a VNode's data.\n */\nfunction bindObjectProps (\n  data,\n  tag,\n  value,\n  asProp,\n  isSync\n) {\n  if (value) {\n    if (!isObject(value)) {\n      process.env.NODE_ENV !== 'production' && warn(\n        'v-bind without argument expects an Object or Array value',\n        this\n      );\n    } else {\n      if (Array.isArray(value)) {\n        value = toObject(value);\n      }\n      var hash;\n      var loop = function ( key ) {\n        if (\n          key === 'class' ||\n          key === 'style' ||\n          isReservedAttribute(key)\n        ) {\n          hash = data;\n        } else {\n          var type = data.attrs && data.attrs.type;\n          hash = asProp || config.mustUseProp(tag, type, key)\n            ? data.domProps || (data.domProps = {})\n            : data.attrs || (data.attrs = {});\n        }\n        var camelizedKey = camelize(key);\n        var hyphenatedKey = hyphenate(key);\n        if (!(camelizedKey in hash) && !(hyphenatedKey in hash)) {\n          hash[key] = value[key];\n\n          if (isSync) {\n            var on = data.on || (data.on = {});\n            on[(\"update:\" + key)] = function ($event) {\n              value[key] = $event;\n            };\n          }\n        }\n      };\n\n      for (var key in value) loop( key );\n    }\n  }\n  return data\n}\n\n/*  */\n\n/**\n * Runtime helper for rendering static trees.\n */\nfunction renderStatic (\n  index,\n  isInFor\n) {\n  var cached = this._staticTrees || (this._staticTrees = []);\n  var tree = cached[index];\n  // if has already-rendered static tree and not inside v-for,\n  // we can reuse the same tree.\n  if (tree && !isInFor) {\n    return tree\n  }\n  // otherwise, render a fresh tree.\n  tree = cached[index] = this.$options.staticRenderFns[index].call(\n    this._renderProxy,\n    null,\n    this // for render fns generated for functional component templates\n  );\n  markStatic(tree, (\"__static__\" + index), false);\n  return tree\n}\n\n/**\n * Runtime helper for v-once.\n * Effectively it means marking the node as static with a unique key.\n */\nfunction markOnce (\n  tree,\n  index,\n  key\n) {\n  markStatic(tree, (\"__once__\" + index + (key ? (\"_\" + key) : \"\")), true);\n  return tree\n}\n\nfunction markStatic (\n  tree,\n  key,\n  isOnce\n) {\n  if (Array.isArray(tree)) {\n    for (var i = 0; i < tree.length; i++) {\n      if (tree[i] && typeof tree[i] !== 'string') {\n        markStaticNode(tree[i], (key + \"_\" + i), isOnce);\n      }\n    }\n  } else {\n    markStaticNode(tree, key, isOnce);\n  }\n}\n\nfunction markStaticNode (node, key, isOnce) {\n  node.isStatic = true;\n  node.key = key;\n  node.isOnce = isOnce;\n}\n\n/*  */\n\nfunction bindObjectListeners (data, value) {\n  if (value) {\n    if (!isPlainObject(value)) {\n      process.env.NODE_ENV !== 'production' && warn(\n        'v-on without argument expects an Object value',\n        this\n      );\n    } else {\n      var on = data.on = data.on ? extend({}, data.on) : {};\n      for (var key in value) {\n        var existing = on[key];\n        var ours = value[key];\n        on[key] = existing ? [].concat(existing, ours) : ours;\n      }\n    }\n  }\n  return data\n}\n\n/*  */\n\nfunction resolveScopedSlots (\n  fns, // see flow/vnode\n  res,\n  // the following are added in 2.6\n  hasDynamicKeys,\n  contentHashKey\n) {\n  res = res || { $stable: !hasDynamicKeys };\n  for (var i = 0; i < fns.length; i++) {\n    var slot = fns[i];\n    if (Array.isArray(slot)) {\n      resolveScopedSlots(slot, res, hasDynamicKeys);\n    } else if (slot) {\n      // marker for reverse proxying v-slot without scope on this.$slots\n      if (slot.proxy) {\n        slot.fn.proxy = true;\n      }\n      res[slot.key] = slot.fn;\n    }\n  }\n  if (contentHashKey) {\n    (res).$key = contentHashKey;\n  }\n  return res\n}\n\n/*  */\n\nfunction bindDynamicKeys (baseObj, values) {\n  for (var i = 0; i < values.length; i += 2) {\n    var key = values[i];\n    if (typeof key === 'string' && key) {\n      baseObj[values[i]] = values[i + 1];\n    } else if (process.env.NODE_ENV !== 'production' && key !== '' && key !== null) {\n      // null is a special value for explicitly removing a binding\n      warn(\n        (\"Invalid value for dynamic directive argument (expected string or null): \" + key),\n        this\n      );\n    }\n  }\n  return baseObj\n}\n\n// helper to dynamically append modifier runtime markers to event names.\n// ensure only append when value is already string, otherwise it will be cast\n// to string and cause the type check to miss.\nfunction prependModifier (value, symbol) {\n  return typeof value === 'string' ? symbol + value : value\n}\n\n/*  */\n\nfunction installRenderHelpers (target) {\n  target._o = markOnce;\n  target._n = toNumber;\n  target._s = toString;\n  target._l = renderList;\n  target._t = renderSlot;\n  target._q = looseEqual;\n  target._i = looseIndexOf;\n  target._m = renderStatic;\n  target._f = resolveFilter;\n  target._k = checkKeyCodes;\n  target._b = bindObjectProps;\n  target._v = createTextVNode;\n  target._e = createEmptyVNode;\n  target._u = resolveScopedSlots;\n  target._g = bindObjectListeners;\n  target._d = bindDynamicKeys;\n  target._p = prependModifier;\n}\n\n/*  */\n\nfunction FunctionalRenderContext (\n  data,\n  props,\n  children,\n  parent,\n  Ctor\n) {\n  var this$1 = this;\n\n  var options = Ctor.options;\n  // ensure the createElement function in functional components\n  // gets a unique context - this is necessary for correct named slot check\n  var contextVm;\n  if (hasOwn(parent, '_uid')) {\n    contextVm = Object.create(parent);\n    // $flow-disable-line\n    contextVm._original = parent;\n  } else {\n    // the context vm passed in is a functional context as well.\n    // in this case we want to make sure we are able to get a hold to the\n    // real context instance.\n    contextVm = parent;\n    // $flow-disable-line\n    parent = parent._original;\n  }\n  var isCompiled = isTrue(options._compiled);\n  var needNormalization = !isCompiled;\n\n  this.data = data;\n  this.props = props;\n  this.children = children;\n  this.parent = parent;\n  this.listeners = data.on || emptyObject;\n  this.injections = resolveInject(options.inject, parent);\n  this.slots = function () {\n    if (!this$1.$slots) {\n      normalizeScopedSlots(\n        data.scopedSlots,\n        this$1.$slots = resolveSlots(children, parent)\n      );\n    }\n    return this$1.$slots\n  };\n\n  Object.defineProperty(this, 'scopedSlots', ({\n    enumerable: true,\n    get: function get () {\n      return normalizeScopedSlots(data.scopedSlots, this.slots())\n    }\n  }));\n\n  // support for compiled functional template\n  if (isCompiled) {\n    // exposing $options for renderStatic()\n    this.$options = options;\n    // pre-resolve slots for renderSlot()\n    this.$slots = this.slots();\n    this.$scopedSlots = normalizeScopedSlots(data.scopedSlots, this.$slots);\n  }\n\n  if (options._scopeId) {\n    this._c = function (a, b, c, d) {\n      var vnode = createElement(contextVm, a, b, c, d, needNormalization);\n      if (vnode && !Array.isArray(vnode)) {\n        vnode.fnScopeId = options._scopeId;\n        vnode.fnContext = parent;\n      }\n      return vnode\n    };\n  } else {\n    this._c = function (a, b, c, d) { return createElement(contextVm, a, b, c, d, needNormalization); };\n  }\n}\n\ninstallRenderHelpers(FunctionalRenderContext.prototype);\n\nfunction createFunctionalComponent (\n  Ctor,\n  propsData,\n  data,\n  contextVm,\n  children\n) {\n  var options = Ctor.options;\n  var props = {};\n  var propOptions = options.props;\n  if (isDef(propOptions)) {\n    for (var key in propOptions) {\n      props[key] = validateProp(key, propOptions, propsData || emptyObject);\n    }\n  } else {\n    if (isDef(data.attrs)) { mergeProps(props, data.attrs); }\n    if (isDef(data.props)) { mergeProps(props, data.props); }\n  }\n\n  var renderContext = new FunctionalRenderContext(\n    data,\n    props,\n    children,\n    contextVm,\n    Ctor\n  );\n\n  var vnode = options.render.call(null, renderContext._c, renderContext);\n\n  if (vnode instanceof VNode) {\n    return cloneAndMarkFunctionalResult(vnode, data, renderContext.parent, options, renderContext)\n  } else if (Array.isArray(vnode)) {\n    var vnodes = normalizeChildren(vnode) || [];\n    var res = new Array(vnodes.length);\n    for (var i = 0; i < vnodes.length; i++) {\n      res[i] = cloneAndMarkFunctionalResult(vnodes[i], data, renderContext.parent, options, renderContext);\n    }\n    return res\n  }\n}\n\nfunction cloneAndMarkFunctionalResult (vnode, data, contextVm, options, renderContext) {\n  // #7817 clone node before setting fnContext, otherwise if the node is reused\n  // (e.g. it was from a cached normal slot) the fnContext causes named slots\n  // that should not be matched to match.\n  var clone = cloneVNode(vnode);\n  clone.fnContext = contextVm;\n  clone.fnOptions = options;\n  if (process.env.NODE_ENV !== 'production') {\n    (clone.devtoolsMeta = clone.devtoolsMeta || {}).renderContext = renderContext;\n  }\n  if (data.slot) {\n    (clone.data || (clone.data = {})).slot = data.slot;\n  }\n  return clone\n}\n\nfunction mergeProps (to, from) {\n  for (var key in from) {\n    to[camelize(key)] = from[key];\n  }\n}\n\n/*  */\n\n/*  */\n\n/*  */\n\n/*  */\n\n// inline hooks to be invoked on component VNodes during patch\nvar componentVNodeHooks = {\n  init: function init (vnode, hydrating) {\n    if (\n      vnode.componentInstance &&\n      !vnode.componentInstance._isDestroyed &&\n      vnode.data.keepAlive\n    ) {\n      // kept-alive components, treat as a patch\n      var mountedNode = vnode; // work around flow\n      componentVNodeHooks.prepatch(mountedNode, mountedNode);\n    } else {\n      var child = vnode.componentInstance = createComponentInstanceForVnode(\n        vnode,\n        activeInstance\n      );\n      child.$mount(hydrating ? vnode.elm : undefined, hydrating);\n    }\n  },\n\n  prepatch: function prepatch (oldVnode, vnode) {\n    var options = vnode.componentOptions;\n    var child = vnode.componentInstance = oldVnode.componentInstance;\n    updateChildComponent(\n      child,\n      options.propsData, // updated props\n      options.listeners, // updated listeners\n      vnode, // new parent vnode\n      options.children // new children\n    );\n  },\n\n  insert: function insert (vnode) {\n    var context = vnode.context;\n    var componentInstance = vnode.componentInstance;\n    if (!componentInstance._isMounted) {\n      componentInstance._isMounted = true;\n      callHook(componentInstance, 'mounted');\n    }\n    if (vnode.data.keepAlive) {\n      if (context._isMounted) {\n        // vue-router#1212\n        // During updates, a kept-alive component's child components may\n        // change, so directly walking the tree here may call activated hooks\n        // on incorrect children. Instead we push them into a queue which will\n        // be processed after the whole patch process ended.\n        queueActivatedComponent(componentInstance);\n      } else {\n        activateChildComponent(componentInstance, true /* direct */);\n      }\n    }\n  },\n\n  destroy: function destroy (vnode) {\n    var componentInstance = vnode.componentInstance;\n    if (!componentInstance._isDestroyed) {\n      if (!vnode.data.keepAlive) {\n        componentInstance.$destroy();\n      } else {\n        deactivateChildComponent(componentInstance, true /* direct */);\n      }\n    }\n  }\n};\n\nvar hooksToMerge = Object.keys(componentVNodeHooks);\n\nfunction createComponent (\n  Ctor,\n  data,\n  context,\n  children,\n  tag\n) {\n  if (isUndef(Ctor)) {\n    return\n  }\n\n  var baseCtor = context.$options._base;\n\n  // plain options object: turn it into a constructor\n  if (isObject(Ctor)) {\n    Ctor = baseCtor.extend(Ctor);\n  }\n\n  // if at this stage it's not a constructor or an async component factory,\n  // reject.\n  if (typeof Ctor !== 'function') {\n    if (process.env.NODE_ENV !== 'production') {\n      warn((\"Invalid Component definition: \" + (String(Ctor))), context);\n    }\n    return\n  }\n\n  // async component\n  var asyncFactory;\n  if (isUndef(Ctor.cid)) {\n    asyncFactory = Ctor;\n    Ctor = resolveAsyncComponent(asyncFactory, baseCtor);\n    if (Ctor === undefined) {\n      // return a placeholder node for async component, which is rendered\n      // as a comment node but preserves all the raw information for the node.\n      // the information will be used for async server-rendering and hydration.\n      return createAsyncPlaceholder(\n        asyncFactory,\n        data,\n        context,\n        children,\n        tag\n      )\n    }\n  }\n\n  data = data || {};\n\n  // resolve constructor options in case global mixins are applied after\n  // component constructor creation\n  resolveConstructorOptions(Ctor);\n\n  // transform component v-model data into props & events\n  if (isDef(data.model)) {\n    transformModel(Ctor.options, data);\n  }\n\n  // extract props\n  var propsData = extractPropsFromVNodeData(data, Ctor, tag);\n\n  // functional component\n  if (isTrue(Ctor.options.functional)) {\n    return createFunctionalComponent(Ctor, propsData, data, context, children)\n  }\n\n  // extract listeners, since these needs to be treated as\n  // child component listeners instead of DOM listeners\n  var listeners = data.on;\n  // replace with listeners with .native modifier\n  // so it gets processed during parent component patch.\n  data.on = data.nativeOn;\n\n  if (isTrue(Ctor.options.abstract)) {\n    // abstract components do not keep anything\n    // other than props & listeners & slot\n\n    // work around flow\n    var slot = data.slot;\n    data = {};\n    if (slot) {\n      data.slot = slot;\n    }\n  }\n\n  // install component management hooks onto the placeholder node\n  installComponentHooks(data);\n\n  // return a placeholder vnode\n  var name = Ctor.options.name || tag;\n  var vnode = new VNode(\n    (\"vue-component-\" + (Ctor.cid) + (name ? (\"-\" + name) : '')),\n    data, undefined, undefined, undefined, context,\n    { Ctor: Ctor, propsData: propsData, listeners: listeners, tag: tag, children: children },\n    asyncFactory\n  );\n\n  return vnode\n}\n\nfunction createComponentInstanceForVnode (\n  // we know it's MountedComponentVNode but flow doesn't\n  vnode,\n  // activeInstance in lifecycle state\n  parent\n) {\n  var options = {\n    _isComponent: true,\n    _parentVnode: vnode,\n    parent: parent\n  };\n  // check inline-template render functions\n  var inlineTemplate = vnode.data.inlineTemplate;\n  if (isDef(inlineTemplate)) {\n    options.render = inlineTemplate.render;\n    options.staticRenderFns = inlineTemplate.staticRenderFns;\n  }\n  return new vnode.componentOptions.Ctor(options)\n}\n\nfunction installComponentHooks (data) {\n  var hooks = data.hook || (data.hook = {});\n  for (var i = 0; i < hooksToMerge.length; i++) {\n    var key = hooksToMerge[i];\n    var existing = hooks[key];\n    var toMerge = componentVNodeHooks[key];\n    if (existing !== toMerge && !(existing && existing._merged)) {\n      hooks[key] = existing ? mergeHook$1(toMerge, existing) : toMerge;\n    }\n  }\n}\n\nfunction mergeHook$1 (f1, f2) {\n  var merged = function (a, b) {\n    // flow complains about extra args which is why we use any\n    f1(a, b);\n    f2(a, b);\n  };\n  merged._merged = true;\n  return merged\n}\n\n// transform component v-model info (value and callback) into\n// prop and event handler respectively.\nfunction transformModel (options, data) {\n  var prop = (options.model && options.model.prop) || 'value';\n  var event = (options.model && options.model.event) || 'input'\n  ;(data.attrs || (data.attrs = {}))[prop] = data.model.value;\n  var on = data.on || (data.on = {});\n  var existing = on[event];\n  var callback = data.model.callback;\n  if (isDef(existing)) {\n    if (\n      Array.isArray(existing)\n        ? existing.indexOf(callback) === -1\n        : existing !== callback\n    ) {\n      on[event] = [callback].concat(existing);\n    }\n  } else {\n    on[event] = callback;\n  }\n}\n\n/*  */\n\nvar SIMPLE_NORMALIZE = 1;\nvar ALWAYS_NORMALIZE = 2;\n\n// wrapper function for providing a more flexible interface\n// without getting yelled at by flow\nfunction createElement (\n  context,\n  tag,\n  data,\n  children,\n  normalizationType,\n  alwaysNormalize\n) {\n  if (Array.isArray(data) || isPrimitive(data)) {\n    normalizationType = children;\n    children = data;\n    data = undefined;\n  }\n  if (isTrue(alwaysNormalize)) {\n    normalizationType = ALWAYS_NORMALIZE;\n  }\n  return _createElement(context, tag, data, children, normalizationType)\n}\n\nfunction _createElement (\n  context,\n  tag,\n  data,\n  children,\n  normalizationType\n) {\n  if (isDef(data) && isDef((data).__ob__)) {\n    process.env.NODE_ENV !== 'production' && warn(\n      \"Avoid using observed data object as vnode data: \" + (JSON.stringify(data)) + \"\\n\" +\n      'Always create fresh vnode data objects in each render!',\n      context\n    );\n    return createEmptyVNode()\n  }\n  // object syntax in v-bind\n  if (isDef(data) && isDef(data.is)) {\n    tag = data.is;\n  }\n  if (!tag) {\n    // in case of component :is set to falsy value\n    return createEmptyVNode()\n  }\n  // warn against non-primitive key\n  if (process.env.NODE_ENV !== 'production' &&\n    isDef(data) && isDef(data.key) && !isPrimitive(data.key)\n  ) {\n    {\n      warn(\n        'Avoid using non-primitive value as key, ' +\n        'use string/number value instead.',\n        context\n      );\n    }\n  }\n  // support single function children as default scoped slot\n  if (Array.isArray(children) &&\n    typeof children[0] === 'function'\n  ) {\n    data = data || {};\n    data.scopedSlots = { default: children[0] };\n    children.length = 0;\n  }\n  if (normalizationType === ALWAYS_NORMALIZE) {\n    children = normalizeChildren(children);\n  } else if (normalizationType === SIMPLE_NORMALIZE) {\n    children = simpleNormalizeChildren(children);\n  }\n  var vnode, ns;\n  if (typeof tag === 'string') {\n    var Ctor;\n    ns = (context.$vnode && context.$vnode.ns) || config.getTagNamespace(tag);\n    if (config.isReservedTag(tag)) {\n      // platform built-in elements\n      if (process.env.NODE_ENV !== 'production' && isDef(data) && isDef(data.nativeOn) && data.tag !== 'component') {\n        warn(\n          (\"The .native modifier for v-on is only valid on components but it was used on <\" + tag + \">.\"),\n          context\n        );\n      }\n      vnode = new VNode(\n        config.parsePlatformTagName(tag), data, children,\n        undefined, undefined, context\n      );\n    } else if ((!data || !data.pre) && isDef(Ctor = resolveAsset(context.$options, 'components', tag))) {\n      // component\n      vnode = createComponent(Ctor, data, context, children, tag);\n    } else {\n      // unknown or unlisted namespaced elements\n      // check at runtime because it may get assigned a namespace when its\n      // parent normalizes children\n      vnode = new VNode(\n        tag, data, children,\n        undefined, undefined, context\n      );\n    }\n  } else {\n    // direct component options / constructor\n    vnode = createComponent(tag, data, context, children);\n  }\n  if (Array.isArray(vnode)) {\n    return vnode\n  } else if (isDef(vnode)) {\n    if (isDef(ns)) { applyNS(vnode, ns); }\n    if (isDef(data)) { registerDeepBindings(data); }\n    return vnode\n  } else {\n    return createEmptyVNode()\n  }\n}\n\nfunction applyNS (vnode, ns, force) {\n  vnode.ns = ns;\n  if (vnode.tag === 'foreignObject') {\n    // use default namespace inside foreignObject\n    ns = undefined;\n    force = true;\n  }\n  if (isDef(vnode.children)) {\n    for (var i = 0, l = vnode.children.length; i < l; i++) {\n      var child = vnode.children[i];\n      if (isDef(child.tag) && (\n        isUndef(child.ns) || (isTrue(force) && child.tag !== 'svg'))) {\n        applyNS(child, ns, force);\n      }\n    }\n  }\n}\n\n// ref #5318\n// necessary to ensure parent re-render when deep bindings like :style and\n// :class are used on slot nodes\nfunction registerDeepBindings (data) {\n  if (isObject(data.style)) {\n    traverse(data.style);\n  }\n  if (isObject(data.class)) {\n    traverse(data.class);\n  }\n}\n\n/*  */\n\nfunction initRender (vm) {\n  vm._vnode = null; // the root of the child tree\n  vm._staticTrees = null; // v-once cached trees\n  var options = vm.$options;\n  var parentVnode = vm.$vnode = options._parentVnode; // the placeholder node in parent tree\n  var renderContext = parentVnode && parentVnode.context;\n  vm.$slots = resolveSlots(options._renderChildren, renderContext);\n  vm.$scopedSlots = emptyObject;\n  // bind the createElement fn to this instance\n  // so that we get proper render context inside it.\n  // args order: tag, data, children, normalizationType, alwaysNormalize\n  // internal version is used by render functions compiled from templates\n  vm._c = function (a, b, c, d) { return createElement(vm, a, b, c, d, false); };\n  // normalization is always applied for the public version, used in\n  // user-written render functions.\n  vm.$createElement = function (a, b, c, d) { return createElement(vm, a, b, c, d, true); };\n\n  // $attrs & $listeners are exposed for easier HOC creation.\n  // they need to be reactive so that HOCs using them are always updated\n  var parentData = parentVnode && parentVnode.data;\n\n  /* istanbul ignore else */\n  if (process.env.NODE_ENV !== 'production') {\n    defineReactive$$1(vm, '$attrs', parentData && parentData.attrs || emptyObject, function () {\n      !isUpdatingChildComponent && warn(\"$attrs is readonly.\", vm);\n    }, true);\n    defineReactive$$1(vm, '$listeners', options._parentListeners || emptyObject, function () {\n      !isUpdatingChildComponent && warn(\"$listeners is readonly.\", vm);\n    }, true);\n  } else {\n    defineReactive$$1(vm, '$attrs', parentData && parentData.attrs || emptyObject, null, true);\n    defineReactive$$1(vm, '$listeners', options._parentListeners || emptyObject, null, true);\n  }\n}\n\nvar currentRenderingInstance = null;\n\nfunction renderMixin (Vue) {\n  // install runtime convenience helpers\n  installRenderHelpers(Vue.prototype);\n\n  Vue.prototype.$nextTick = function (fn) {\n    return nextTick(fn, this)\n  };\n\n  Vue.prototype._render = function () {\n    var vm = this;\n    var ref = vm.$options;\n    var render = ref.render;\n    var _parentVnode = ref._parentVnode;\n\n    if (_parentVnode) {\n      vm.$scopedSlots = normalizeScopedSlots(\n        _parentVnode.data.scopedSlots,\n        vm.$slots,\n        vm.$scopedSlots\n      );\n    }\n\n    // set parent vnode. this allows render functions to have access\n    // to the data on the placeholder node.\n    vm.$vnode = _parentVnode;\n    // render self\n    var vnode;\n    try {\n      // There's no need to maintain a stack because all render fns are called\n      // separately from one another. Nested component's render fns are called\n      // when parent component is patched.\n      currentRenderingInstance = vm;\n      vnode = render.call(vm._renderProxy, vm.$createElement);\n    } catch (e) {\n      handleError(e, vm, \"render\");\n      // return error render result,\n      // or previous vnode to prevent render error causing blank component\n      /* istanbul ignore else */\n      if (process.env.NODE_ENV !== 'production' && vm.$options.renderError) {\n        try {\n          vnode = vm.$options.renderError.call(vm._renderProxy, vm.$createElement, e);\n        } catch (e) {\n          handleError(e, vm, \"renderError\");\n          vnode = vm._vnode;\n        }\n      } else {\n        vnode = vm._vnode;\n      }\n    } finally {\n      currentRenderingInstance = null;\n    }\n    // if the returned array contains only a single node, allow it\n    if (Array.isArray(vnode) && vnode.length === 1) {\n      vnode = vnode[0];\n    }\n    // return empty vnode in case the render function errored out\n    if (!(vnode instanceof VNode)) {\n      if (process.env.NODE_ENV !== 'production' && Array.isArray(vnode)) {\n        warn(\n          'Multiple root nodes returned from render function. Render function ' +\n          'should return a single root node.',\n          vm\n        );\n      }\n      vnode = createEmptyVNode();\n    }\n    // set parent\n    vnode.parent = _parentVnode;\n    return vnode\n  };\n}\n\n/*  */\n\nfunction ensureCtor (comp, base) {\n  if (\n    comp.__esModule ||\n    (hasSymbol && comp[Symbol.toStringTag] === 'Module')\n  ) {\n    comp = comp.default;\n  }\n  return isObject(comp)\n    ? base.extend(comp)\n    : comp\n}\n\nfunction createAsyncPlaceholder (\n  factory,\n  data,\n  context,\n  children,\n  tag\n) {\n  var node = createEmptyVNode();\n  node.asyncFactory = factory;\n  node.asyncMeta = { data: data, context: context, children: children, tag: tag };\n  return node\n}\n\nfunction resolveAsyncComponent (\n  factory,\n  baseCtor\n) {\n  if (isTrue(factory.error) && isDef(factory.errorComp)) {\n    return factory.errorComp\n  }\n\n  if (isDef(factory.resolved)) {\n    return factory.resolved\n  }\n\n  var owner = currentRenderingInstance;\n  if (owner && isDef(factory.owners) && factory.owners.indexOf(owner) === -1) {\n    // already pending\n    factory.owners.push(owner);\n  }\n\n  if (isTrue(factory.loading) && isDef(factory.loadingComp)) {\n    return factory.loadingComp\n  }\n\n  if (owner && !isDef(factory.owners)) {\n    var owners = factory.owners = [owner];\n    var sync = true;\n    var timerLoading = null;\n    var timerTimeout = null\n\n    ;(owner).$on('hook:destroyed', function () { return remove(owners, owner); });\n\n    var forceRender = function (renderCompleted) {\n      for (var i = 0, l = owners.length; i < l; i++) {\n        (owners[i]).$forceUpdate();\n      }\n\n      if (renderCompleted) {\n        owners.length = 0;\n        if (timerLoading !== null) {\n          clearTimeout(timerLoading);\n          timerLoading = null;\n        }\n        if (timerTimeout !== null) {\n          clearTimeout(timerTimeout);\n          timerTimeout = null;\n        }\n      }\n    };\n\n    var resolve = once(function (res) {\n      // cache resolved\n      factory.resolved = ensureCtor(res, baseCtor);\n      // invoke callbacks only if this is not a synchronous resolve\n      // (async resolves are shimmed as synchronous during SSR)\n      if (!sync) {\n        forceRender(true);\n      } else {\n        owners.length = 0;\n      }\n    });\n\n    var reject = once(function (reason) {\n      process.env.NODE_ENV !== 'production' && warn(\n        \"Failed to resolve async component: \" + (String(factory)) +\n        (reason ? (\"\\nReason: \" + reason) : '')\n      );\n      if (isDef(factory.errorComp)) {\n        factory.error = true;\n        forceRender(true);\n      }\n    });\n\n    var res = factory(resolve, reject);\n\n    if (isObject(res)) {\n      if (isPromise(res)) {\n        // () => Promise\n        if (isUndef(factory.resolved)) {\n          res.then(resolve, reject);\n        }\n      } else if (isPromise(res.component)) {\n        res.component.then(resolve, reject);\n\n        if (isDef(res.error)) {\n          factory.errorComp = ensureCtor(res.error, baseCtor);\n        }\n\n        if (isDef(res.loading)) {\n          factory.loadingComp = ensureCtor(res.loading, baseCtor);\n          if (res.delay === 0) {\n            factory.loading = true;\n          } else {\n            timerLoading = setTimeout(function () {\n              timerLoading = null;\n              if (isUndef(factory.resolved) && isUndef(factory.error)) {\n                factory.loading = true;\n                forceRender(false);\n              }\n            }, res.delay || 200);\n          }\n        }\n\n        if (isDef(res.timeout)) {\n          timerTimeout = setTimeout(function () {\n            timerTimeout = null;\n            if (isUndef(factory.resolved)) {\n              reject(\n                process.env.NODE_ENV !== 'production'\n                  ? (\"timeout (\" + (res.timeout) + \"ms)\")\n                  : null\n              );\n            }\n          }, res.timeout);\n        }\n      }\n    }\n\n    sync = false;\n    // return in case resolved synchronously\n    return factory.loading\n      ? factory.loadingComp\n      : factory.resolved\n  }\n}\n\n/*  */\n\nfunction getFirstComponentChild (children) {\n  if (Array.isArray(children)) {\n    for (var i = 0; i < children.length; i++) {\n      var c = children[i];\n      if (isDef(c) && (isDef(c.componentOptions) || isAsyncPlaceholder(c))) {\n        return c\n      }\n    }\n  }\n}\n\n/*  */\n\n/*  */\n\nfunction initEvents (vm) {\n  vm._events = Object.create(null);\n  vm._hasHookEvent = false;\n  // init parent attached events\n  var listeners = vm.$options._parentListeners;\n  if (listeners) {\n    updateComponentListeners(vm, listeners);\n  }\n}\n\nvar target;\n\nfunction add (event, fn) {\n  target.$on(event, fn);\n}\n\nfunction remove$1 (event, fn) {\n  target.$off(event, fn);\n}\n\nfunction createOnceHandler (event, fn) {\n  var _target = target;\n  return function onceHandler () {\n    var res = fn.apply(null, arguments);\n    if (res !== null) {\n      _target.$off(event, onceHandler);\n    }\n  }\n}\n\nfunction updateComponentListeners (\n  vm,\n  listeners,\n  oldListeners\n) {\n  target = vm;\n  updateListeners(listeners, oldListeners || {}, add, remove$1, createOnceHandler, vm);\n  target = undefined;\n}\n\nfunction eventsMixin (Vue) {\n  var hookRE = /^hook:/;\n  Vue.prototype.$on = function (event, fn) {\n    var vm = this;\n    if (Array.isArray(event)) {\n      for (var i = 0, l = event.length; i < l; i++) {\n        vm.$on(event[i], fn);\n      }\n    } else {\n      (vm._events[event] || (vm._events[event] = [])).push(fn);\n      // optimize hook:event cost by using a boolean flag marked at registration\n      // instead of a hash lookup\n      if (hookRE.test(event)) {\n        vm._hasHookEvent = true;\n      }\n    }\n    return vm\n  };\n\n  Vue.prototype.$once = function (event, fn) {\n    var vm = this;\n    function on () {\n      vm.$off(event, on);\n      fn.apply(vm, arguments);\n    }\n    on.fn = fn;\n    vm.$on(event, on);\n    return vm\n  };\n\n  Vue.prototype.$off = function (event, fn) {\n    var vm = this;\n    // all\n    if (!arguments.length) {\n      vm._events = Object.create(null);\n      return vm\n    }\n    // array of events\n    if (Array.isArray(event)) {\n      for (var i$1 = 0, l = event.length; i$1 < l; i$1++) {\n        vm.$off(event[i$1], fn);\n      }\n      return vm\n    }\n    // specific event\n    var cbs = vm._events[event];\n    if (!cbs) {\n      return vm\n    }\n    if (!fn) {\n      vm._events[event] = null;\n      return vm\n    }\n    // specific handler\n    var cb;\n    var i = cbs.length;\n    while (i--) {\n      cb = cbs[i];\n      if (cb === fn || cb.fn === fn) {\n        cbs.splice(i, 1);\n        break\n      }\n    }\n    return vm\n  };\n\n  Vue.prototype.$emit = function (event) {\n    var vm = this;\n    if (process.env.NODE_ENV !== 'production') {\n      var lowerCaseEvent = event.toLowerCase();\n      if (lowerCaseEvent !== event && vm._events[lowerCaseEvent]) {\n        tip(\n          \"Event \\\"\" + lowerCaseEvent + \"\\\" is emitted in component \" +\n          (formatComponentName(vm)) + \" but the handler is registered for \\\"\" + event + \"\\\". \" +\n          \"Note that HTML attributes are case-insensitive and you cannot use \" +\n          \"v-on to listen to camelCase events when using in-DOM templates. \" +\n          \"You should probably use \\\"\" + (hyphenate(event)) + \"\\\" instead of \\\"\" + event + \"\\\".\"\n        );\n      }\n    }\n    var cbs = vm._events[event];\n    if (cbs) {\n      cbs = cbs.length > 1 ? toArray(cbs) : cbs;\n      var args = toArray(arguments, 1);\n      var info = \"event handler for \\\"\" + event + \"\\\"\";\n      for (var i = 0, l = cbs.length; i < l; i++) {\n        invokeWithErrorHandling(cbs[i], vm, args, vm, info);\n      }\n    }\n    return vm\n  };\n}\n\n/*  */\n\nvar activeInstance = null;\nvar isUpdatingChildComponent = false;\n\nfunction setActiveInstance(vm) {\n  var prevActiveInstance = activeInstance;\n  activeInstance = vm;\n  return function () {\n    activeInstance = prevActiveInstance;\n  }\n}\n\nfunction initLifecycle (vm) {\n  var options = vm.$options;\n\n  // locate first non-abstract parent\n  var parent = options.parent;\n  if (parent && !options.abstract) {\n    while (parent.$options.abstract && parent.$parent) {\n      parent = parent.$parent;\n    }\n    parent.$children.push(vm);\n  }\n\n  vm.$parent = parent;\n  vm.$root = parent ? parent.$root : vm;\n\n  vm.$children = [];\n  vm.$refs = {};\n\n  vm._watcher = null;\n  vm._inactive = null;\n  vm._directInactive = false;\n  vm._isMounted = false;\n  vm._isDestroyed = false;\n  vm._isBeingDestroyed = false;\n}\n\nfunction lifecycleMixin (Vue) {\n  Vue.prototype._update = function (vnode, hydrating) {\n    var vm = this;\n    var prevEl = vm.$el;\n    var prevVnode = vm._vnode;\n    var restoreActiveInstance = setActiveInstance(vm);\n    vm._vnode = vnode;\n    // Vue.prototype.__patch__ is injected in entry points\n    // based on the rendering backend used.\n    if (!prevVnode) {\n      // initial render\n      vm.$el = vm.__patch__(vm.$el, vnode, hydrating, false /* removeOnly */);\n    } else {\n      // updates\n      vm.$el = vm.__patch__(prevVnode, vnode);\n    }\n    restoreActiveInstance();\n    // update __vue__ reference\n    if (prevEl) {\n      prevEl.__vue__ = null;\n    }\n    if (vm.$el) {\n      vm.$el.__vue__ = vm;\n    }\n    // if parent is an HOC, update its $el as well\n    if (vm.$vnode && vm.$parent && vm.$vnode === vm.$parent._vnode) {\n      vm.$parent.$el = vm.$el;\n    }\n    // updated hook is called by the scheduler to ensure that children are\n    // updated in a parent's updated hook.\n  };\n\n  Vue.prototype.$forceUpdate = function () {\n    var vm = this;\n    if (vm._watcher) {\n      vm._watcher.update();\n    }\n  };\n\n  Vue.prototype.$destroy = function () {\n    var vm = this;\n    if (vm._isBeingDestroyed) {\n      return\n    }\n    callHook(vm, 'beforeDestroy');\n    vm._isBeingDestroyed = true;\n    // remove self from parent\n    var parent = vm.$parent;\n    if (parent && !parent._isBeingDestroyed && !vm.$options.abstract) {\n      remove(parent.$children, vm);\n    }\n    // teardown watchers\n    if (vm._watcher) {\n      vm._watcher.teardown();\n    }\n    var i = vm._watchers.length;\n    while (i--) {\n      vm._watchers[i].teardown();\n    }\n    // remove reference from data ob\n    // frozen object may not have observer.\n    if (vm._data.__ob__) {\n      vm._data.__ob__.vmCount--;\n    }\n    // call the last hook...\n    vm._isDestroyed = true;\n    // invoke destroy hooks on current rendered tree\n    vm.__patch__(vm._vnode, null);\n    // fire destroyed hook\n    callHook(vm, 'destroyed');\n    // turn off all instance listeners.\n    vm.$off();\n    // remove __vue__ reference\n    if (vm.$el) {\n      vm.$el.__vue__ = null;\n    }\n    // release circular reference (#6759)\n    if (vm.$vnode) {\n      vm.$vnode.parent = null;\n    }\n  };\n}\n\nfunction mountComponent (\n  vm,\n  el,\n  hydrating\n) {\n  vm.$el = el;\n  if (!vm.$options.render) {\n    vm.$options.render = createEmptyVNode;\n    if (process.env.NODE_ENV !== 'production') {\n      /* istanbul ignore if */\n      if ((vm.$options.template && vm.$options.template.charAt(0) !== '#') ||\n        vm.$options.el || el) {\n        warn(\n          'You are using the runtime-only build of Vue where the template ' +\n          'compiler is not available. Either pre-compile the templates into ' +\n          'render functions, or use the compiler-included build.',\n          vm\n        );\n      } else {\n        warn(\n          'Failed to mount component: template or render function not defined.',\n          vm\n        );\n      }\n    }\n  }\n  callHook(vm, 'beforeMount');\n\n  var updateComponent;\n  /* istanbul ignore if */\n  if (process.env.NODE_ENV !== 'production' && config.performance && mark) {\n    updateComponent = function () {\n      var name = vm._name;\n      var id = vm._uid;\n      var startTag = \"vue-perf-start:\" + id;\n      var endTag = \"vue-perf-end:\" + id;\n\n      mark(startTag);\n      var vnode = vm._render();\n      mark(endTag);\n      measure((\"vue \" + name + \" render\"), startTag, endTag);\n\n      mark(startTag);\n      vm._update(vnode, hydrating);\n      mark(endTag);\n      measure((\"vue \" + name + \" patch\"), startTag, endTag);\n    };\n  } else {\n    updateComponent = function () {\n      vm._update(vm._render(), hydrating);\n    };\n  }\n\n  // we set this to vm._watcher inside the watcher's constructor\n  // since the watcher's initial patch may call $forceUpdate (e.g. inside child\n  // component's mounted hook), which relies on vm._watcher being already defined\n  new Watcher(vm, updateComponent, noop, {\n    before: function before () {\n      if (vm._isMounted && !vm._isDestroyed) {\n        callHook(vm, 'beforeUpdate');\n      }\n    }\n  }, true /* isRenderWatcher */);\n  hydrating = false;\n\n  // manually mounted instance, call mounted on self\n  // mounted is called for render-created child components in its inserted hook\n  if (vm.$vnode == null) {\n    vm._isMounted = true;\n    callHook(vm, 'mounted');\n  }\n  return vm\n}\n\nfunction updateChildComponent (\n  vm,\n  propsData,\n  listeners,\n  parentVnode,\n  renderChildren\n) {\n  if (process.env.NODE_ENV !== 'production') {\n    isUpdatingChildComponent = true;\n  }\n\n  // determine whether component has slot children\n  // we need to do this before overwriting $options._renderChildren.\n\n  // check if there are dynamic scopedSlots (hand-written or compiled but with\n  // dynamic slot names). Static scoped slots compiled from template has the\n  // \"$stable\" marker.\n  var newScopedSlots = parentVnode.data.scopedSlots;\n  var oldScopedSlots = vm.$scopedSlots;\n  var hasDynamicScopedSlot = !!(\n    (newScopedSlots && !newScopedSlots.$stable) ||\n    (oldScopedSlots !== emptyObject && !oldScopedSlots.$stable) ||\n    (newScopedSlots && vm.$scopedSlots.$key !== newScopedSlots.$key) ||\n    (!newScopedSlots && vm.$scopedSlots.$key)\n  );\n\n  // Any static slot children from the parent may have changed during parent's\n  // update. Dynamic scoped slots may also have changed. In such cases, a forced\n  // update is necessary to ensure correctness.\n  var needsForceUpdate = !!(\n    renderChildren ||               // has new static slots\n    vm.$options._renderChildren ||  // has old static slots\n    hasDynamicScopedSlot\n  );\n\n  vm.$options._parentVnode = parentVnode;\n  vm.$vnode = parentVnode; // update vm's placeholder node without re-render\n\n  if (vm._vnode) { // update child tree's parent\n    vm._vnode.parent = parentVnode;\n  }\n  vm.$options._renderChildren = renderChildren;\n\n  // update $attrs and $listeners hash\n  // these are also reactive so they may trigger child update if the child\n  // used them during render\n  vm.$attrs = parentVnode.data.attrs || emptyObject;\n  vm.$listeners = listeners || emptyObject;\n\n  // update props\n  if (propsData && vm.$options.props) {\n    toggleObserving(false);\n    var props = vm._props;\n    var propKeys = vm.$options._propKeys || [];\n    for (var i = 0; i < propKeys.length; i++) {\n      var key = propKeys[i];\n      var propOptions = vm.$options.props; // wtf flow?\n      props[key] = validateProp(key, propOptions, propsData, vm);\n    }\n    toggleObserving(true);\n    // keep a copy of raw propsData\n    vm.$options.propsData = propsData;\n  }\n\n  // update listeners\n  listeners = listeners || emptyObject;\n  var oldListeners = vm.$options._parentListeners;\n  vm.$options._parentListeners = listeners;\n  updateComponentListeners(vm, listeners, oldListeners);\n\n  // resolve slots + force update if has children\n  if (needsForceUpdate) {\n    vm.$slots = resolveSlots(renderChildren, parentVnode.context);\n    vm.$forceUpdate();\n  }\n\n  if (process.env.NODE_ENV !== 'production') {\n    isUpdatingChildComponent = false;\n  }\n}\n\nfunction isInInactiveTree (vm) {\n  while (vm && (vm = vm.$parent)) {\n    if (vm._inactive) { return true }\n  }\n  return false\n}\n\nfunction activateChildComponent (vm, direct) {\n  if (direct) {\n    vm._directInactive = false;\n    if (isInInactiveTree(vm)) {\n      return\n    }\n  } else if (vm._directInactive) {\n    return\n  }\n  if (vm._inactive || vm._inactive === null) {\n    vm._inactive = false;\n    for (var i = 0; i < vm.$children.length; i++) {\n      activateChildComponent(vm.$children[i]);\n    }\n    callHook(vm, 'activated');\n  }\n}\n\nfunction deactivateChildComponent (vm, direct) {\n  if (direct) {\n    vm._directInactive = true;\n    if (isInInactiveTree(vm)) {\n      return\n    }\n  }\n  if (!vm._inactive) {\n    vm._inactive = true;\n    for (var i = 0; i < vm.$children.length; i++) {\n      deactivateChildComponent(vm.$children[i]);\n    }\n    callHook(vm, 'deactivated');\n  }\n}\n\nfunction callHook (vm, hook) {\n  // #7573 disable dep collection when invoking lifecycle hooks\n  pushTarget();\n  var handlers = vm.$options[hook];\n  var info = hook + \" hook\";\n  if (handlers) {\n    for (var i = 0, j = handlers.length; i < j; i++) {\n      invokeWithErrorHandling(handlers[i], vm, null, vm, info);\n    }\n  }\n  if (vm._hasHookEvent) {\n    vm.$emit('hook:' + hook);\n  }\n  popTarget();\n}\n\n/*  */\n\nvar MAX_UPDATE_COUNT = 100;\n\nvar queue = [];\nvar activatedChildren = [];\nvar has = {};\nvar circular = {};\nvar waiting = false;\nvar flushing = false;\nvar index = 0;\n\n/**\n * Reset the scheduler's state.\n */\nfunction resetSchedulerState () {\n  index = queue.length = activatedChildren.length = 0;\n  has = {};\n  if (process.env.NODE_ENV !== 'production') {\n    circular = {};\n  }\n  waiting = flushing = false;\n}\n\n// Async edge case #6566 requires saving the timestamp when event listeners are\n// attached. However, calling performance.now() has a perf overhead especially\n// if the page has thousands of event listeners. Instead, we take a timestamp\n// every time the scheduler flushes and use that for all event listeners\n// attached during that flush.\nvar currentFlushTimestamp = 0;\n\n// Async edge case fix requires storing an event listener's attach timestamp.\nvar getNow = Date.now;\n\n// Determine what event timestamp the browser is using. Annoyingly, the\n// timestamp can either be hi-res (relative to page load) or low-res\n// (relative to UNIX epoch), so in order to compare time we have to use the\n// same timestamp type when saving the flush timestamp.\n// All IE versions use low-res event timestamps, and have problematic clock\n// implementations (#9632)\nif (inBrowser && !isIE) {\n  var performance = window.performance;\n  if (\n    performance &&\n    typeof performance.now === 'function' &&\n    getNow() > document.createEvent('Event').timeStamp\n  ) {\n    // if the event timestamp, although evaluated AFTER the Date.now(), is\n    // smaller than it, it means the event is using a hi-res timestamp,\n    // and we need to use the hi-res version for event listener timestamps as\n    // well.\n    getNow = function () { return performance.now(); };\n  }\n}\n\n/**\n * Flush both queues and run the watchers.\n */\nfunction flushSchedulerQueue () {\n  currentFlushTimestamp = getNow();\n  flushing = true;\n  var watcher, id;\n\n  // Sort queue before flush.\n  // This ensures that:\n  // 1. Components are updated from parent to child. (because parent is always\n  //    created before the child)\n  // 2. A component's user watchers are run before its render watcher (because\n  //    user watchers are created before the render watcher)\n  // 3. If a component is destroyed during a parent component's watcher run,\n  //    its watchers can be skipped.\n  queue.sort(function (a, b) { return a.id - b.id; });\n\n  // do not cache length because more watchers might be pushed\n  // as we run existing watchers\n  for (index = 0; index < queue.length; index++) {\n    watcher = queue[index];\n    if (watcher.before) {\n      watcher.before();\n    }\n    id = watcher.id;\n    has[id] = null;\n    watcher.run();\n    // in dev build, check and stop circular updates.\n    if (process.env.NODE_ENV !== 'production' && has[id] != null) {\n      circular[id] = (circular[id] || 0) + 1;\n      if (circular[id] > MAX_UPDATE_COUNT) {\n        warn(\n          'You may have an infinite update loop ' + (\n            watcher.user\n              ? (\"in watcher with expression \\\"\" + (watcher.expression) + \"\\\"\")\n              : \"in a component render function.\"\n          ),\n          watcher.vm\n        );\n        break\n      }\n    }\n  }\n\n  // keep copies of post queues before resetting state\n  var activatedQueue = activatedChildren.slice();\n  var updatedQueue = queue.slice();\n\n  resetSchedulerState();\n\n  // call component updated and activated hooks\n  callActivatedHooks(activatedQueue);\n  callUpdatedHooks(updatedQueue);\n\n  // devtool hook\n  /* istanbul ignore if */\n  if (devtools && config.devtools) {\n    devtools.emit('flush');\n  }\n}\n\nfunction callUpdatedHooks (queue) {\n  var i = queue.length;\n  while (i--) {\n    var watcher = queue[i];\n    var vm = watcher.vm;\n    if (vm._watcher === watcher && vm._isMounted && !vm._isDestroyed) {\n      callHook(vm, 'updated');\n    }\n  }\n}\n\n/**\n * Queue a kept-alive component that was activated during patch.\n * The queue will be processed after the entire tree has been patched.\n */\nfunction queueActivatedComponent (vm) {\n  // setting _inactive to false here so that a render function can\n  // rely on checking whether it's in an inactive tree (e.g. router-view)\n  vm._inactive = false;\n  activatedChildren.push(vm);\n}\n\nfunction callActivatedHooks (queue) {\n  for (var i = 0; i < queue.length; i++) {\n    queue[i]._inactive = true;\n    activateChildComponent(queue[i], true /* true */);\n  }\n}\n\n/**\n * Push a watcher into the watcher queue.\n * Jobs with duplicate IDs will be skipped unless it's\n * pushed when the queue is being flushed.\n */\nfunction queueWatcher (watcher) {\n  var id = watcher.id;\n  if (has[id] == null) {\n    has[id] = true;\n    if (!flushing) {\n      queue.push(watcher);\n    } else {\n      // if already flushing, splice the watcher based on its id\n      // if already past its id, it will be run next immediately.\n      var i = queue.length - 1;\n      while (i > index && queue[i].id > watcher.id) {\n        i--;\n      }\n      queue.splice(i + 1, 0, watcher);\n    }\n    // queue the flush\n    if (!waiting) {\n      waiting = true;\n\n      if (process.env.NODE_ENV !== 'production' && !config.async) {\n        flushSchedulerQueue();\n        return\n      }\n      nextTick(flushSchedulerQueue);\n    }\n  }\n}\n\n/*  */\n\n\n\nvar uid$2 = 0;\n\n/**\n * A watcher parses an expression, collects dependencies,\n * and fires callback when the expression value changes.\n * This is used for both the $watch() api and directives.\n */\nvar Watcher = function Watcher (\n  vm,\n  expOrFn,\n  cb,\n  options,\n  isRenderWatcher\n) {\n  this.vm = vm;\n  if (isRenderWatcher) {\n    vm._watcher = this;\n  }\n  vm._watchers.push(this);\n  // options\n  if (options) {\n    this.deep = !!options.deep;\n    this.user = !!options.user;\n    this.lazy = !!options.lazy;\n    this.sync = !!options.sync;\n    this.before = options.before;\n  } else {\n    this.deep = this.user = this.lazy = this.sync = false;\n  }\n  this.cb = cb;\n  this.id = ++uid$2; // uid for batching\n  this.active = true;\n  this.dirty = this.lazy; // for lazy watchers\n  this.deps = [];\n  this.newDeps = [];\n  this.depIds = new _Set();\n  this.newDepIds = new _Set();\n  this.expression = process.env.NODE_ENV !== 'production'\n    ? expOrFn.toString()\n    : '';\n  // parse expression for getter\n  if (typeof expOrFn === 'function') {\n    this.getter = expOrFn;\n  } else {\n    this.getter = parsePath(expOrFn);\n    if (!this.getter) {\n      this.getter = noop;\n      process.env.NODE_ENV !== 'production' && warn(\n        \"Failed watching path: \\\"\" + expOrFn + \"\\\" \" +\n        'Watcher only accepts simple dot-delimited paths. ' +\n        'For full control, use a function instead.',\n        vm\n      );\n    }\n  }\n  this.value = this.lazy\n    ? undefined\n    : this.get();\n};\n\n/**\n * Evaluate the getter, and re-collect dependencies.\n */\nWatcher.prototype.get = function get () {\n  pushTarget(this);\n  var value;\n  var vm = this.vm;\n  try {\n    value = this.getter.call(vm, vm);\n  } catch (e) {\n    if (this.user) {\n      handleError(e, vm, (\"getter for watcher \\\"\" + (this.expression) + \"\\\"\"));\n    } else {\n      throw e\n    }\n  } finally {\n    // \"touch\" every property so they are all tracked as\n    // dependencies for deep watching\n    if (this.deep) {\n      traverse(value);\n    }\n    popTarget();\n    this.cleanupDeps();\n  }\n  return value\n};\n\n/**\n * Add a dependency to this directive.\n */\nWatcher.prototype.addDep = function addDep (dep) {\n  var id = dep.id;\n  if (!this.newDepIds.has(id)) {\n    this.newDepIds.add(id);\n    this.newDeps.push(dep);\n    if (!this.depIds.has(id)) {\n      dep.addSub(this);\n    }\n  }\n};\n\n/**\n * Clean up for dependency collection.\n */\nWatcher.prototype.cleanupDeps = function cleanupDeps () {\n  var i = this.deps.length;\n  while (i--) {\n    var dep = this.deps[i];\n    if (!this.newDepIds.has(dep.id)) {\n      dep.removeSub(this);\n    }\n  }\n  var tmp = this.depIds;\n  this.depIds = this.newDepIds;\n  this.newDepIds = tmp;\n  this.newDepIds.clear();\n  tmp = this.deps;\n  this.deps = this.newDeps;\n  this.newDeps = tmp;\n  this.newDeps.length = 0;\n};\n\n/**\n * Subscriber interface.\n * Will be called when a dependency changes.\n */\nWatcher.prototype.update = function update () {\n  /* istanbul ignore else */\n  if (this.lazy) {\n    this.dirty = true;\n  } else if (this.sync) {\n    this.run();\n  } else {\n    queueWatcher(this);\n  }\n};\n\n/**\n * Scheduler job interface.\n * Will be called by the scheduler.\n */\nWatcher.prototype.run = function run () {\n  if (this.active) {\n    var value = this.get();\n    if (\n      value !== this.value ||\n      // Deep watchers and watchers on Object/Arrays should fire even\n      // when the value is the same, because the value may\n      // have mutated.\n      isObject(value) ||\n      this.deep\n    ) {\n      // set new value\n      var oldValue = this.value;\n      this.value = value;\n      if (this.user) {\n        var info = \"callback for watcher \\\"\" + (this.expression) + \"\\\"\";\n        invokeWithErrorHandling(this.cb, this.vm, [value, oldValue], this.vm, info);\n      } else {\n        this.cb.call(this.vm, value, oldValue);\n      }\n    }\n  }\n};\n\n/**\n * Evaluate the value of the watcher.\n * This only gets called for lazy watchers.\n */\nWatcher.prototype.evaluate = function evaluate () {\n  this.value = this.get();\n  this.dirty = false;\n};\n\n/**\n * Depend on all deps collected by this watcher.\n */\nWatcher.prototype.depend = function depend () {\n  var i = this.deps.length;\n  while (i--) {\n    this.deps[i].depend();\n  }\n};\n\n/**\n * Remove self from all dependencies' subscriber list.\n */\nWatcher.prototype.teardown = function teardown () {\n  if (this.active) {\n    // remove self from vm's watcher list\n    // this is a somewhat expensive operation so we skip it\n    // if the vm is being destroyed.\n    if (!this.vm._isBeingDestroyed) {\n      remove(this.vm._watchers, this);\n    }\n    var i = this.deps.length;\n    while (i--) {\n      this.deps[i].removeSub(this);\n    }\n    this.active = false;\n  }\n};\n\n/*  */\n\nvar sharedPropertyDefinition = {\n  enumerable: true,\n  configurable: true,\n  get: noop,\n  set: noop\n};\n\nfunction proxy (target, sourceKey, key) {\n  sharedPropertyDefinition.get = function proxyGetter () {\n    return this[sourceKey][key]\n  };\n  sharedPropertyDefinition.set = function proxySetter (val) {\n    this[sourceKey][key] = val;\n  };\n  Object.defineProperty(target, key, sharedPropertyDefinition);\n}\n\nfunction initState (vm) {\n  vm._watchers = [];\n  var opts = vm.$options;\n  if (opts.props) { initProps(vm, opts.props); }\n  if (opts.methods) { initMethods(vm, opts.methods); }\n  if (opts.data) {\n    initData(vm);\n  } else {\n    observe(vm._data = {}, true /* asRootData */);\n  }\n  if (opts.computed) { initComputed(vm, opts.computed); }\n  if (opts.watch && opts.watch !== nativeWatch) {\n    initWatch(vm, opts.watch);\n  }\n}\n\nfunction initProps (vm, propsOptions) {\n  var propsData = vm.$options.propsData || {};\n  var props = vm._props = {};\n  // cache prop keys so that future props updates can iterate using Array\n  // instead of dynamic object key enumeration.\n  var keys = vm.$options._propKeys = [];\n  var isRoot = !vm.$parent;\n  // root instance props should be converted\n  if (!isRoot) {\n    toggleObserving(false);\n  }\n  var loop = function ( key ) {\n    keys.push(key);\n    var value = validateProp(key, propsOptions, propsData, vm);\n    /* istanbul ignore else */\n    if (process.env.NODE_ENV !== 'production') {\n      var hyphenatedKey = hyphenate(key);\n      if (isReservedAttribute(hyphenatedKey) ||\n          config.isReservedAttr(hyphenatedKey)) {\n        warn(\n          (\"\\\"\" + hyphenatedKey + \"\\\" is a reserved attribute and cannot be used as component prop.\"),\n          vm\n        );\n      }\n      defineReactive$$1(props, key, value, function () {\n        if (!isRoot && !isUpdatingChildComponent) {\n          warn(\n            \"Avoid mutating a prop directly since the value will be \" +\n            \"overwritten whenever the parent component re-renders. \" +\n            \"Instead, use a data or computed property based on the prop's \" +\n            \"value. Prop being mutated: \\\"\" + key + \"\\\"\",\n            vm\n          );\n        }\n      });\n    } else {\n      defineReactive$$1(props, key, value);\n    }\n    // static props are already proxied on the component's prototype\n    // during Vue.extend(). We only need to proxy props defined at\n    // instantiation here.\n    if (!(key in vm)) {\n      proxy(vm, \"_props\", key);\n    }\n  };\n\n  for (var key in propsOptions) loop( key );\n  toggleObserving(true);\n}\n\nfunction initData (vm) {\n  var data = vm.$options.data;\n  data = vm._data = typeof data === 'function'\n    ? getData(data, vm)\n    : data || {};\n  if (!isPlainObject(data)) {\n    data = {};\n    process.env.NODE_ENV !== 'production' && warn(\n      'data functions should return an object:\\n' +\n      'https://vuejs.org/v2/guide/components.html#data-Must-Be-a-Function',\n      vm\n    );\n  }\n  // proxy data on instance\n  var keys = Object.keys(data);\n  var props = vm.$options.props;\n  var methods = vm.$options.methods;\n  var i = keys.length;\n  while (i--) {\n    var key = keys[i];\n    if (process.env.NODE_ENV !== 'production') {\n      if (methods && hasOwn(methods, key)) {\n        warn(\n          (\"Method \\\"\" + key + \"\\\" has already been defined as a data property.\"),\n          vm\n        );\n      }\n    }\n    if (props && hasOwn(props, key)) {\n      process.env.NODE_ENV !== 'production' && warn(\n        \"The data property \\\"\" + key + \"\\\" is already declared as a prop. \" +\n        \"Use prop default value instead.\",\n        vm\n      );\n    } else if (!isReserved(key)) {\n      proxy(vm, \"_data\", key);\n    }\n  }\n  // observe data\n  observe(data, true /* asRootData */);\n}\n\nfunction getData (data, vm) {\n  // #7573 disable dep collection when invoking data getters\n  pushTarget();\n  try {\n    return data.call(vm, vm)\n  } catch (e) {\n    handleError(e, vm, \"data()\");\n    return {}\n  } finally {\n    popTarget();\n  }\n}\n\nvar computedWatcherOptions = { lazy: true };\n\nfunction initComputed (vm, computed) {\n  // $flow-disable-line\n  var watchers = vm._computedWatchers = Object.create(null);\n  // computed properties are just getters during SSR\n  var isSSR = isServerRendering();\n\n  for (var key in computed) {\n    var userDef = computed[key];\n    var getter = typeof userDef === 'function' ? userDef : userDef.get;\n    if (process.env.NODE_ENV !== 'production' && getter == null) {\n      warn(\n        (\"Getter is missing for computed property \\\"\" + key + \"\\\".\"),\n        vm\n      );\n    }\n\n    if (!isSSR) {\n      // create internal watcher for the computed property.\n      watchers[key] = new Watcher(\n        vm,\n        getter || noop,\n        noop,\n        computedWatcherOptions\n      );\n    }\n\n    // component-defined computed properties are already defined on the\n    // component prototype. We only need to define computed properties defined\n    // at instantiation here.\n    if (!(key in vm)) {\n      defineComputed(vm, key, userDef);\n    } else if (process.env.NODE_ENV !== 'production') {\n      if (key in vm.$data) {\n        warn((\"The computed property \\\"\" + key + \"\\\" is already defined in data.\"), vm);\n      } else if (vm.$options.props && key in vm.$options.props) {\n        warn((\"The computed property \\\"\" + key + \"\\\" is already defined as a prop.\"), vm);\n      } else if (vm.$options.methods && key in vm.$options.methods) {\n        warn((\"The computed property \\\"\" + key + \"\\\" is already defined as a method.\"), vm);\n      }\n    }\n  }\n}\n\nfunction defineComputed (\n  target,\n  key,\n  userDef\n) {\n  var shouldCache = !isServerRendering();\n  if (typeof userDef === 'function') {\n    sharedPropertyDefinition.get = shouldCache\n      ? createComputedGetter(key)\n      : createGetterInvoker(userDef);\n    sharedPropertyDefinition.set = noop;\n  } else {\n    sharedPropertyDefinition.get = userDef.get\n      ? shouldCache && userDef.cache !== false\n        ? createComputedGetter(key)\n        : createGetterInvoker(userDef.get)\n      : noop;\n    sharedPropertyDefinition.set = userDef.set || noop;\n  }\n  if (process.env.NODE_ENV !== 'production' &&\n      sharedPropertyDefinition.set === noop) {\n    sharedPropertyDefinition.set = function () {\n      warn(\n        (\"Computed property \\\"\" + key + \"\\\" was assigned to but it has no setter.\"),\n        this\n      );\n    };\n  }\n  Object.defineProperty(target, key, sharedPropertyDefinition);\n}\n\nfunction createComputedGetter (key) {\n  return function computedGetter () {\n    var watcher = this._computedWatchers && this._computedWatchers[key];\n    if (watcher) {\n      if (watcher.dirty) {\n        watcher.evaluate();\n      }\n      if (Dep.target) {\n        watcher.depend();\n      }\n      return watcher.value\n    }\n  }\n}\n\nfunction createGetterInvoker(fn) {\n  return function computedGetter () {\n    return fn.call(this, this)\n  }\n}\n\nfunction initMethods (vm, methods) {\n  var props = vm.$options.props;\n  for (var key in methods) {\n    if (process.env.NODE_ENV !== 'production') {\n      if (typeof methods[key] !== 'function') {\n        warn(\n          \"Method \\\"\" + key + \"\\\" has type \\\"\" + (typeof methods[key]) + \"\\\" in the component definition. \" +\n          \"Did you reference the function correctly?\",\n          vm\n        );\n      }\n      if (props && hasOwn(props, key)) {\n        warn(\n          (\"Method \\\"\" + key + \"\\\" has already been defined as a prop.\"),\n          vm\n        );\n      }\n      if ((key in vm) && isReserved(key)) {\n        warn(\n          \"Method \\\"\" + key + \"\\\" conflicts with an existing Vue instance method. \" +\n          \"Avoid defining component methods that start with _ or $.\"\n        );\n      }\n    }\n    vm[key] = typeof methods[key] !== 'function' ? noop : bind(methods[key], vm);\n  }\n}\n\nfunction initWatch (vm, watch) {\n  for (var key in watch) {\n    var handler = watch[key];\n    if (Array.isArray(handler)) {\n      for (var i = 0; i < handler.length; i++) {\n        createWatcher(vm, key, handler[i]);\n      }\n    } else {\n      createWatcher(vm, key, handler);\n    }\n  }\n}\n\nfunction createWatcher (\n  vm,\n  expOrFn,\n  handler,\n  options\n) {\n  if (isPlainObject(handler)) {\n    options = handler;\n    handler = handler.handler;\n  }\n  if (typeof handler === 'string') {\n    handler = vm[handler];\n  }\n  return vm.$watch(expOrFn, handler, options)\n}\n\nfunction stateMixin (Vue) {\n  // flow somehow has problems with directly declared definition object\n  // when using Object.defineProperty, so we have to procedurally build up\n  // the object here.\n  var dataDef = {};\n  dataDef.get = function () { return this._data };\n  var propsDef = {};\n  propsDef.get = function () { return this._props };\n  if (process.env.NODE_ENV !== 'production') {\n    dataDef.set = function () {\n      warn(\n        'Avoid replacing instance root $data. ' +\n        'Use nested data properties instead.',\n        this\n      );\n    };\n    propsDef.set = function () {\n      warn(\"$props is readonly.\", this);\n    };\n  }\n  Object.defineProperty(Vue.prototype, '$data', dataDef);\n  Object.defineProperty(Vue.prototype, '$props', propsDef);\n\n  Vue.prototype.$set = set;\n  Vue.prototype.$delete = del;\n\n  Vue.prototype.$watch = function (\n    expOrFn,\n    cb,\n    options\n  ) {\n    var vm = this;\n    if (isPlainObject(cb)) {\n      return createWatcher(vm, expOrFn, cb, options)\n    }\n    options = options || {};\n    options.user = true;\n    var watcher = new Watcher(vm, expOrFn, cb, options);\n    if (options.immediate) {\n      var info = \"callback for immediate watcher \\\"\" + (watcher.expression) + \"\\\"\";\n      pushTarget();\n      invokeWithErrorHandling(cb, vm, [watcher.value], vm, info);\n      popTarget();\n    }\n    return function unwatchFn () {\n      watcher.teardown();\n    }\n  };\n}\n\n/*  */\n\nvar uid$3 = 0;\n\nfunction initMixin (Vue) {\n  Vue.prototype._init = function (options) {\n    var vm = this;\n    // a uid\n    vm._uid = uid$3++;\n\n    var startTag, endTag;\n    /* istanbul ignore if */\n    if (process.env.NODE_ENV !== 'production' && config.performance && mark) {\n      startTag = \"vue-perf-start:\" + (vm._uid);\n      endTag = \"vue-perf-end:\" + (vm._uid);\n      mark(startTag);\n    }\n\n    // a flag to avoid this being observed\n    vm._isVue = true;\n    // merge options\n    if (options && options._isComponent) {\n      // optimize internal component instantiation\n      // since dynamic options merging is pretty slow, and none of the\n      // internal component options needs special treatment.\n      initInternalComponent(vm, options);\n    } else {\n      vm.$options = mergeOptions(\n        resolveConstructorOptions(vm.constructor),\n        options || {},\n        vm\n      );\n    }\n    /* istanbul ignore else */\n    if (process.env.NODE_ENV !== 'production') {\n      initProxy(vm);\n    } else {\n      vm._renderProxy = vm;\n    }\n    // expose real self\n    vm._self = vm;\n    initLifecycle(vm);\n    initEvents(vm);\n    initRender(vm);\n    callHook(vm, 'beforeCreate');\n    initInjections(vm); // resolve injections before data/props\n    initState(vm);\n    initProvide(vm); // resolve provide after data/props\n    callHook(vm, 'created');\n\n    /* istanbul ignore if */\n    if (process.env.NODE_ENV !== 'production' && config.performance && mark) {\n      vm._name = formatComponentName(vm, false);\n      mark(endTag);\n      measure((\"vue \" + (vm._name) + \" init\"), startTag, endTag);\n    }\n\n    if (vm.$options.el) {\n      vm.$mount(vm.$options.el);\n    }\n  };\n}\n\nfunction initInternalComponent (vm, options) {\n  var opts = vm.$options = Object.create(vm.constructor.options);\n  // doing this because it's faster than dynamic enumeration.\n  var parentVnode = options._parentVnode;\n  opts.parent = options.parent;\n  opts._parentVnode = parentVnode;\n\n  var vnodeComponentOptions = parentVnode.componentOptions;\n  opts.propsData = vnodeComponentOptions.propsData;\n  opts._parentListeners = vnodeComponentOptions.listeners;\n  opts._renderChildren = vnodeComponentOptions.children;\n  opts._componentTag = vnodeComponentOptions.tag;\n\n  if (options.render) {\n    opts.render = options.render;\n    opts.staticRenderFns = options.staticRenderFns;\n  }\n}\n\nfunction resolveConstructorOptions (Ctor) {\n  var options = Ctor.options;\n  if (Ctor.super) {\n    var superOptions = resolveConstructorOptions(Ctor.super);\n    var cachedSuperOptions = Ctor.superOptions;\n    if (superOptions !== cachedSuperOptions) {\n      // super option changed,\n      // need to resolve new options.\n      Ctor.superOptions = superOptions;\n      // check if there are any late-modified/attached options (#4976)\n      var modifiedOptions = resolveModifiedOptions(Ctor);\n      // update base extend options\n      if (modifiedOptions) {\n        extend(Ctor.extendOptions, modifiedOptions);\n      }\n      options = Ctor.options = mergeOptions(superOptions, Ctor.extendOptions);\n      if (options.name) {\n        options.components[options.name] = Ctor;\n      }\n    }\n  }\n  return options\n}\n\nfunction resolveModifiedOptions (Ctor) {\n  var modified;\n  var latest = Ctor.options;\n  var sealed = Ctor.sealedOptions;\n  for (var key in latest) {\n    if (latest[key] !== sealed[key]) {\n      if (!modified) { modified = {}; }\n      modified[key] = latest[key];\n    }\n  }\n  return modified\n}\n\nfunction Vue (options) {\n  if (process.env.NODE_ENV !== 'production' &&\n    !(this instanceof Vue)\n  ) {\n    warn('Vue is a constructor and should be called with the `new` keyword');\n  }\n  this._init(options);\n}\n\ninitMixin(Vue);\nstateMixin(Vue);\neventsMixin(Vue);\nlifecycleMixin(Vue);\nrenderMixin(Vue);\n\n/*  */\n\nfunction initUse (Vue) {\n  Vue.use = function (plugin) {\n    var installedPlugins = (this._installedPlugins || (this._installedPlugins = []));\n    if (installedPlugins.indexOf(plugin) > -1) {\n      return this\n    }\n\n    // additional parameters\n    var args = toArray(arguments, 1);\n    args.unshift(this);\n    if (typeof plugin.install === 'function') {\n      plugin.install.apply(plugin, args);\n    } else if (typeof plugin === 'function') {\n      plugin.apply(null, args);\n    }\n    installedPlugins.push(plugin);\n    return this\n  };\n}\n\n/*  */\n\nfunction initMixin$1 (Vue) {\n  Vue.mixin = function (mixin) {\n    this.options = mergeOptions(this.options, mixin);\n    return this\n  };\n}\n\n/*  */\n\nfunction initExtend (Vue) {\n  /**\n   * Each instance constructor, including Vue, has a unique\n   * cid. This enables us to create wrapped \"child\n   * constructors\" for prototypal inheritance and cache them.\n   */\n  Vue.cid = 0;\n  var cid = 1;\n\n  /**\n   * Class inheritance\n   */\n  Vue.extend = function (extendOptions) {\n    extendOptions = extendOptions || {};\n    var Super = this;\n    var SuperId = Super.cid;\n    var cachedCtors = extendOptions._Ctor || (extendOptions._Ctor = {});\n    if (cachedCtors[SuperId]) {\n      return cachedCtors[SuperId]\n    }\n\n    var name = extendOptions.name || Super.options.name;\n    if (process.env.NODE_ENV !== 'production' && name) {\n      validateComponentName(name);\n    }\n\n    var Sub = function VueComponent (options) {\n      this._init(options);\n    };\n    Sub.prototype = Object.create(Super.prototype);\n    Sub.prototype.constructor = Sub;\n    Sub.cid = cid++;\n    Sub.options = mergeOptions(\n      Super.options,\n      extendOptions\n    );\n    Sub['super'] = Super;\n\n    // For props and computed properties, we define the proxy getters on\n    // the Vue instances at extension time, on the extended prototype. This\n    // avoids Object.defineProperty calls for each instance created.\n    if (Sub.options.props) {\n      initProps$1(Sub);\n    }\n    if (Sub.options.computed) {\n      initComputed$1(Sub);\n    }\n\n    // allow further extension/mixin/plugin usage\n    Sub.extend = Super.extend;\n    Sub.mixin = Super.mixin;\n    Sub.use = Super.use;\n\n    // create asset registers, so extended classes\n    // can have their private assets too.\n    ASSET_TYPES.forEach(function (type) {\n      Sub[type] = Super[type];\n    });\n    // enable recursive self-lookup\n    if (name) {\n      Sub.options.components[name] = Sub;\n    }\n\n    // keep a reference to the super options at extension time.\n    // later at instantiation we can check if Super's options have\n    // been updated.\n    Sub.superOptions = Super.options;\n    Sub.extendOptions = extendOptions;\n    Sub.sealedOptions = extend({}, Sub.options);\n\n    // cache constructor\n    cachedCtors[SuperId] = Sub;\n    return Sub\n  };\n}\n\nfunction initProps$1 (Comp) {\n  var props = Comp.options.props;\n  for (var key in props) {\n    proxy(Comp.prototype, \"_props\", key);\n  }\n}\n\nfunction initComputed$1 (Comp) {\n  var computed = Comp.options.computed;\n  for (var key in computed) {\n    defineComputed(Comp.prototype, key, computed[key]);\n  }\n}\n\n/*  */\n\nfunction initAssetRegisters (Vue) {\n  /**\n   * Create asset registration methods.\n   */\n  ASSET_TYPES.forEach(function (type) {\n    Vue[type] = function (\n      id,\n      definition\n    ) {\n      if (!definition) {\n        return this.options[type + 's'][id]\n      } else {\n        /* istanbul ignore if */\n        if (process.env.NODE_ENV !== 'production' && type === 'component') {\n          validateComponentName(id);\n        }\n        if (type === 'component' && isPlainObject(definition)) {\n          definition.name = definition.name || id;\n          definition = this.options._base.extend(definition);\n        }\n        if (type === 'directive' && typeof definition === 'function') {\n          definition = { bind: definition, update: definition };\n        }\n        this.options[type + 's'][id] = definition;\n        return definition\n      }\n    };\n  });\n}\n\n/*  */\n\n\n\n\n\nfunction getComponentName (opts) {\n  return opts && (opts.Ctor.options.name || opts.tag)\n}\n\nfunction matches (pattern, name) {\n  if (Array.isArray(pattern)) {\n    return pattern.indexOf(name) > -1\n  } else if (typeof pattern === 'string') {\n    return pattern.split(',').indexOf(name) > -1\n  } else if (isRegExp(pattern)) {\n    return pattern.test(name)\n  }\n  /* istanbul ignore next */\n  return false\n}\n\nfunction pruneCache (keepAliveInstance, filter) {\n  var cache = keepAliveInstance.cache;\n  var keys = keepAliveInstance.keys;\n  var _vnode = keepAliveInstance._vnode;\n  for (var key in cache) {\n    var entry = cache[key];\n    if (entry) {\n      var name = entry.name;\n      if (name && !filter(name)) {\n        pruneCacheEntry(cache, key, keys, _vnode);\n      }\n    }\n  }\n}\n\nfunction pruneCacheEntry (\n  cache,\n  key,\n  keys,\n  current\n) {\n  var entry = cache[key];\n  if (entry && (!current || entry.tag !== current.tag)) {\n    entry.componentInstance.$destroy();\n  }\n  cache[key] = null;\n  remove(keys, key);\n}\n\nvar patternTypes = [String, RegExp, Array];\n\nvar KeepAlive = {\n  name: 'keep-alive',\n  abstract: true,\n\n  props: {\n    include: patternTypes,\n    exclude: patternTypes,\n    max: [String, Number]\n  },\n\n  methods: {\n    cacheVNode: function cacheVNode() {\n      var ref = this;\n      var cache = ref.cache;\n      var keys = ref.keys;\n      var vnodeToCache = ref.vnodeToCache;\n      var keyToCache = ref.keyToCache;\n      if (vnodeToCache) {\n        var tag = vnodeToCache.tag;\n        var componentInstance = vnodeToCache.componentInstance;\n        var componentOptions = vnodeToCache.componentOptions;\n        cache[keyToCache] = {\n          name: getComponentName(componentOptions),\n          tag: tag,\n          componentInstance: componentInstance,\n        };\n        keys.push(keyToCache);\n        // prune oldest entry\n        if (this.max && keys.length > parseInt(this.max)) {\n          pruneCacheEntry(cache, keys[0], keys, this._vnode);\n        }\n        this.vnodeToCache = null;\n      }\n    }\n  },\n\n  created: function created () {\n    this.cache = Object.create(null);\n    this.keys = [];\n  },\n\n  destroyed: function destroyed () {\n    for (var key in this.cache) {\n      pruneCacheEntry(this.cache, key, this.keys);\n    }\n  },\n\n  mounted: function mounted () {\n    var this$1 = this;\n\n    this.cacheVNode();\n    this.$watch('include', function (val) {\n      pruneCache(this$1, function (name) { return matches(val, name); });\n    });\n    this.$watch('exclude', function (val) {\n      pruneCache(this$1, function (name) { return !matches(val, name); });\n    });\n  },\n\n  updated: function updated () {\n    this.cacheVNode();\n  },\n\n  render: function render () {\n    var slot = this.$slots.default;\n    var vnode = getFirstComponentChild(slot);\n    var componentOptions = vnode && vnode.componentOptions;\n    if (componentOptions) {\n      // check pattern\n      var name = getComponentName(componentOptions);\n      var ref = this;\n      var include = ref.include;\n      var exclude = ref.exclude;\n      if (\n        // not included\n        (include && (!name || !matches(include, name))) ||\n        // excluded\n        (exclude && name && matches(exclude, name))\n      ) {\n        return vnode\n      }\n\n      var ref$1 = this;\n      var cache = ref$1.cache;\n      var keys = ref$1.keys;\n      var key = vnode.key == null\n        // same constructor may get registered as different local components\n        // so cid alone is not enough (#3269)\n        ? componentOptions.Ctor.cid + (componentOptions.tag ? (\"::\" + (componentOptions.tag)) : '')\n        : vnode.key;\n      if (cache[key]) {\n        vnode.componentInstance = cache[key].componentInstance;\n        // make current key freshest\n        remove(keys, key);\n        keys.push(key);\n      } else {\n        // delay setting the cache until update\n        this.vnodeToCache = vnode;\n        this.keyToCache = key;\n      }\n\n      vnode.data.keepAlive = true;\n    }\n    return vnode || (slot && slot[0])\n  }\n};\n\nvar builtInComponents = {\n  KeepAlive: KeepAlive\n};\n\n/*  */\n\nfunction initGlobalAPI (Vue) {\n  // config\n  var configDef = {};\n  configDef.get = function () { return config; };\n  if (process.env.NODE_ENV !== 'production') {\n    configDef.set = function () {\n      warn(\n        'Do not replace the Vue.config object, set individual fields instead.'\n      );\n    };\n  }\n  Object.defineProperty(Vue, 'config', configDef);\n\n  // exposed util methods.\n  // NOTE: these are not considered part of the public API - avoid relying on\n  // them unless you are aware of the risk.\n  Vue.util = {\n    warn: warn,\n    extend: extend,\n    mergeOptions: mergeOptions,\n    defineReactive: defineReactive$$1\n  };\n\n  Vue.set = set;\n  Vue.delete = del;\n  Vue.nextTick = nextTick;\n\n  // 2.6 explicit observable API\n  Vue.observable = function (obj) {\n    observe(obj);\n    return obj\n  };\n\n  Vue.options = Object.create(null);\n  ASSET_TYPES.forEach(function (type) {\n    Vue.options[type + 's'] = Object.create(null);\n  });\n\n  // this is used to identify the \"base\" constructor to extend all plain-object\n  // components with in Weex's multi-instance scenarios.\n  Vue.options._base = Vue;\n\n  extend(Vue.options.components, builtInComponents);\n\n  initUse(Vue);\n  initMixin$1(Vue);\n  initExtend(Vue);\n  initAssetRegisters(Vue);\n}\n\ninitGlobalAPI(Vue);\n\nObject.defineProperty(Vue.prototype, '$isServer', {\n  get: isServerRendering\n});\n\nObject.defineProperty(Vue.prototype, '$ssrContext', {\n  get: function get () {\n    /* istanbul ignore next */\n    return this.$vnode && this.$vnode.ssrContext\n  }\n});\n\n// expose FunctionalRenderContext for ssr runtime helper installation\nObject.defineProperty(Vue, 'FunctionalRenderContext', {\n  value: FunctionalRenderContext\n});\n\nVue.version = '2.6.14';\n\n/*  */\n\n// these are reserved for web because they are directly compiled away\n// during template compilation\nvar isReservedAttr = makeMap('style,class');\n\n// attributes that should be using props for binding\nvar acceptValue = makeMap('input,textarea,option,select,progress');\nvar mustUseProp = function (tag, type, attr) {\n  return (\n    (attr === 'value' && acceptValue(tag)) && type !== 'button' ||\n    (attr === 'selected' && tag === 'option') ||\n    (attr === 'checked' && tag === 'input') ||\n    (attr === 'muted' && tag === 'video')\n  )\n};\n\nvar isEnumeratedAttr = makeMap('contenteditable,draggable,spellcheck');\n\nvar isValidContentEditableValue = makeMap('events,caret,typing,plaintext-only');\n\nvar convertEnumeratedValue = function (key, value) {\n  return isFalsyAttrValue(value) || value === 'false'\n    ? 'false'\n    // allow arbitrary string value for contenteditable\n    : key === 'contenteditable' && isValidContentEditableValue(value)\n      ? value\n      : 'true'\n};\n\nvar isBooleanAttr = makeMap(\n  'allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,' +\n  'default,defaultchecked,defaultmuted,defaultselected,defer,disabled,' +\n  'enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,' +\n  'muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,' +\n  'required,reversed,scoped,seamless,selected,sortable,' +\n  'truespeed,typemustmatch,visible'\n);\n\nvar xlinkNS = 'http://www.w3.org/1999/xlink';\n\nvar isXlink = function (name) {\n  return name.charAt(5) === ':' && name.slice(0, 5) === 'xlink'\n};\n\nvar getXlinkProp = function (name) {\n  return isXlink(name) ? name.slice(6, name.length) : ''\n};\n\nvar isFalsyAttrValue = function (val) {\n  return val == null || val === false\n};\n\n/*  */\n\nfunction genClassForVnode (vnode) {\n  var data = vnode.data;\n  var parentNode = vnode;\n  var childNode = vnode;\n  while (isDef(childNode.componentInstance)) {\n    childNode = childNode.componentInstance._vnode;\n    if (childNode && childNode.data) {\n      data = mergeClassData(childNode.data, data);\n    }\n  }\n  while (isDef(parentNode = parentNode.parent)) {\n    if (parentNode && parentNode.data) {\n      data = mergeClassData(data, parentNode.data);\n    }\n  }\n  return renderClass(data.staticClass, data.class)\n}\n\nfunction mergeClassData (child, parent) {\n  return {\n    staticClass: concat(child.staticClass, parent.staticClass),\n    class: isDef(child.class)\n      ? [child.class, parent.class]\n      : parent.class\n  }\n}\n\nfunction renderClass (\n  staticClass,\n  dynamicClass\n) {\n  if (isDef(staticClass) || isDef(dynamicClass)) {\n    return concat(staticClass, stringifyClass(dynamicClass))\n  }\n  /* istanbul ignore next */\n  return ''\n}\n\nfunction concat (a, b) {\n  return a ? b ? (a + ' ' + b) : a : (b || '')\n}\n\nfunction stringifyClass (value) {\n  if (Array.isArray(value)) {\n    return stringifyArray(value)\n  }\n  if (isObject(value)) {\n    return stringifyObject(value)\n  }\n  if (typeof value === 'string') {\n    return value\n  }\n  /* istanbul ignore next */\n  return ''\n}\n\nfunction stringifyArray (value) {\n  var res = '';\n  var stringified;\n  for (var i = 0, l = value.length; i < l; i++) {\n    if (isDef(stringified = stringifyClass(value[i])) && stringified !== '') {\n      if (res) { res += ' '; }\n      res += stringified;\n    }\n  }\n  return res\n}\n\nfunction stringifyObject (value) {\n  var res = '';\n  for (var key in value) {\n    if (value[key]) {\n      if (res) { res += ' '; }\n      res += key;\n    }\n  }\n  return res\n}\n\n/*  */\n\nvar namespaceMap = {\n  svg: 'http://www.w3.org/2000/svg',\n  math: 'http://www.w3.org/1998/Math/MathML'\n};\n\nvar isHTMLTag = makeMap(\n  'html,body,base,head,link,meta,style,title,' +\n  'address,article,aside,footer,header,h1,h2,h3,h4,h5,h6,hgroup,nav,section,' +\n  'div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,' +\n  'a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,rtc,ruby,' +\n  's,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,' +\n  'embed,object,param,source,canvas,script,noscript,del,ins,' +\n  'caption,col,colgroup,table,thead,tbody,td,th,tr,' +\n  'button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,' +\n  'output,progress,select,textarea,' +\n  'details,dialog,menu,menuitem,summary,' +\n  'content,element,shadow,template,blockquote,iframe,tfoot'\n);\n\n// this map is intentionally selective, only covering SVG elements that may\n// contain child elements.\nvar isSVG = makeMap(\n  'svg,animate,circle,clippath,cursor,defs,desc,ellipse,filter,font-face,' +\n  'foreignobject,g,glyph,image,line,marker,mask,missing-glyph,path,pattern,' +\n  'polygon,polyline,rect,switch,symbol,text,textpath,tspan,use,view',\n  true\n);\n\nvar isReservedTag = function (tag) {\n  return isHTMLTag(tag) || isSVG(tag)\n};\n\nfunction getTagNamespace (tag) {\n  if (isSVG(tag)) {\n    return 'svg'\n  }\n  // basic support for MathML\n  // note it doesn't support other MathML elements being component roots\n  if (tag === 'math') {\n    return 'math'\n  }\n}\n\nvar unknownElementCache = Object.create(null);\nfunction isUnknownElement (tag) {\n  /* istanbul ignore if */\n  if (!inBrowser) {\n    return true\n  }\n  if (isReservedTag(tag)) {\n    return false\n  }\n  tag = tag.toLowerCase();\n  /* istanbul ignore if */\n  if (unknownElementCache[tag] != null) {\n    return unknownElementCache[tag]\n  }\n  var el = document.createElement(tag);\n  if (tag.indexOf('-') > -1) {\n    // http://stackoverflow.com/a/28210364/1070244\n    return (unknownElementCache[tag] = (\n      el.constructor === window.HTMLUnknownElement ||\n      el.constructor === window.HTMLElement\n    ))\n  } else {\n    return (unknownElementCache[tag] = /HTMLUnknownElement/.test(el.toString()))\n  }\n}\n\nvar isTextInputType = makeMap('text,number,password,search,email,tel,url');\n\n/*  */\n\n/**\n * Query an element selector if it's not an element already.\n */\nfunction query (el) {\n  if (typeof el === 'string') {\n    var selected = document.querySelector(el);\n    if (!selected) {\n      process.env.NODE_ENV !== 'production' && warn(\n        'Cannot find element: ' + el\n      );\n      return document.createElement('div')\n    }\n    return selected\n  } else {\n    return el\n  }\n}\n\n/*  */\n\nfunction createElement$1 (tagName, vnode) {\n  var elm = document.createElement(tagName);\n  if (tagName !== 'select') {\n    return elm\n  }\n  // false or null will remove the attribute but undefined will not\n  if (vnode.data && vnode.data.attrs && vnode.data.attrs.multiple !== undefined) {\n    elm.setAttribute('multiple', 'multiple');\n  }\n  return elm\n}\n\nfunction createElementNS (namespace, tagName) {\n  return document.createElementNS(namespaceMap[namespace], tagName)\n}\n\nfunction createTextNode (text) {\n  return document.createTextNode(text)\n}\n\nfunction createComment (text) {\n  return document.createComment(text)\n}\n\nfunction insertBefore (parentNode, newNode, referenceNode) {\n  parentNode.insertBefore(newNode, referenceNode);\n}\n\nfunction removeChild (node, child) {\n  node.removeChild(child);\n}\n\nfunction appendChild (node, child) {\n  node.appendChild(child);\n}\n\nfunction parentNode (node) {\n  return node.parentNode\n}\n\nfunction nextSibling (node) {\n  return node.nextSibling\n}\n\nfunction tagName (node) {\n  return node.tagName\n}\n\nfunction setTextContent (node, text) {\n  node.textContent = text;\n}\n\nfunction setStyleScope (node, scopeId) {\n  node.setAttribute(scopeId, '');\n}\n\nvar nodeOps = /*#__PURE__*/Object.freeze({\n  createElement: createElement$1,\n  createElementNS: createElementNS,\n  createTextNode: createTextNode,\n  createComment: createComment,\n  insertBefore: insertBefore,\n  removeChild: removeChild,\n  appendChild: appendChild,\n  parentNode: parentNode,\n  nextSibling: nextSibling,\n  tagName: tagName,\n  setTextContent: setTextContent,\n  setStyleScope: setStyleScope\n});\n\n/*  */\n\nvar ref = {\n  create: function create (_, vnode) {\n    registerRef(vnode);\n  },\n  update: function update (oldVnode, vnode) {\n    if (oldVnode.data.ref !== vnode.data.ref) {\n      registerRef(oldVnode, true);\n      registerRef(vnode);\n    }\n  },\n  destroy: function destroy (vnode) {\n    registerRef(vnode, true);\n  }\n};\n\nfunction registerRef (vnode, isRemoval) {\n  var key = vnode.data.ref;\n  if (!isDef(key)) { return }\n\n  var vm = vnode.context;\n  var ref = vnode.componentInstance || vnode.elm;\n  var refs = vm.$refs;\n  if (isRemoval) {\n    if (Array.isArray(refs[key])) {\n      remove(refs[key], ref);\n    } else if (refs[key] === ref) {\n      refs[key] = undefined;\n    }\n  } else {\n    if (vnode.data.refInFor) {\n      if (!Array.isArray(refs[key])) {\n        refs[key] = [ref];\n      } else if (refs[key].indexOf(ref) < 0) {\n        // $flow-disable-line\n        refs[key].push(ref);\n      }\n    } else {\n      refs[key] = ref;\n    }\n  }\n}\n\n/**\n * Virtual DOM patching algorithm based on Snabbdom by\n * Simon Friis Vindum (@paldepind)\n * Licensed under the MIT License\n * https://github.com/paldepind/snabbdom/blob/master/LICENSE\n *\n * modified by Evan You (@yyx990803)\n *\n * Not type-checking this because this file is perf-critical and the cost\n * of making flow understand it is not worth it.\n */\n\nvar emptyNode = new VNode('', {}, []);\n\nvar hooks = ['create', 'activate', 'update', 'remove', 'destroy'];\n\nfunction sameVnode (a, b) {\n  return (\n    a.key === b.key &&\n    a.asyncFactory === b.asyncFactory && (\n      (\n        a.tag === b.tag &&\n        a.isComment === b.isComment &&\n        isDef(a.data) === isDef(b.data) &&\n        sameInputType(a, b)\n      ) || (\n        isTrue(a.isAsyncPlaceholder) &&\n        isUndef(b.asyncFactory.error)\n      )\n    )\n  )\n}\n\nfunction sameInputType (a, b) {\n  if (a.tag !== 'input') { return true }\n  var i;\n  var typeA = isDef(i = a.data) && isDef(i = i.attrs) && i.type;\n  var typeB = isDef(i = b.data) && isDef(i = i.attrs) && i.type;\n  return typeA === typeB || isTextInputType(typeA) && isTextInputType(typeB)\n}\n\nfunction createKeyToOldIdx (children, beginIdx, endIdx) {\n  var i, key;\n  var map = {};\n  for (i = beginIdx; i <= endIdx; ++i) {\n    key = children[i].key;\n    if (isDef(key)) { map[key] = i; }\n  }\n  return map\n}\n\nfunction createPatchFunction (backend) {\n  var i, j;\n  var cbs = {};\n\n  var modules = backend.modules;\n  var nodeOps = backend.nodeOps;\n\n  for (i = 0; i < hooks.length; ++i) {\n    cbs[hooks[i]] = [];\n    for (j = 0; j < modules.length; ++j) {\n      if (isDef(modules[j][hooks[i]])) {\n        cbs[hooks[i]].push(modules[j][hooks[i]]);\n      }\n    }\n  }\n\n  function emptyNodeAt (elm) {\n    return new VNode(nodeOps.tagName(elm).toLowerCase(), {}, [], undefined, elm)\n  }\n\n  function createRmCb (childElm, listeners) {\n    function remove$$1 () {\n      if (--remove$$1.listeners === 0) {\n        removeNode(childElm);\n      }\n    }\n    remove$$1.listeners = listeners;\n    return remove$$1\n  }\n\n  function removeNode (el) {\n    var parent = nodeOps.parentNode(el);\n    // element may have already been removed due to v-html / v-text\n    if (isDef(parent)) {\n      nodeOps.removeChild(parent, el);\n    }\n  }\n\n  function isUnknownElement$$1 (vnode, inVPre) {\n    return (\n      !inVPre &&\n      !vnode.ns &&\n      !(\n        config.ignoredElements.length &&\n        config.ignoredElements.some(function (ignore) {\n          return isRegExp(ignore)\n            ? ignore.test(vnode.tag)\n            : ignore === vnode.tag\n        })\n      ) &&\n      config.isUnknownElement(vnode.tag)\n    )\n  }\n\n  var creatingElmInVPre = 0;\n\n  function createElm (\n    vnode,\n    insertedVnodeQueue,\n    parentElm,\n    refElm,\n    nested,\n    ownerArray,\n    index\n  ) {\n    if (isDef(vnode.elm) && isDef(ownerArray)) {\n      // This vnode was used in a previous render!\n      // now it's used as a new node, overwriting its elm would cause\n      // potential patch errors down the road when it's used as an insertion\n      // reference node. Instead, we clone the node on-demand before creating\n      // associated DOM element for it.\n      vnode = ownerArray[index] = cloneVNode(vnode);\n    }\n\n    vnode.isRootInsert = !nested; // for transition enter check\n    if (createComponent(vnode, insertedVnodeQueue, parentElm, refElm)) {\n      return\n    }\n\n    var data = vnode.data;\n    var children = vnode.children;\n    var tag = vnode.tag;\n    if (isDef(tag)) {\n      if (process.env.NODE_ENV !== 'production') {\n        if (data && data.pre) {\n          creatingElmInVPre++;\n        }\n        if (isUnknownElement$$1(vnode, creatingElmInVPre)) {\n          warn(\n            'Unknown custom element: <' + tag + '> - did you ' +\n            'register the component correctly? For recursive components, ' +\n            'make sure to provide the \"name\" option.',\n            vnode.context\n          );\n        }\n      }\n\n      vnode.elm = vnode.ns\n        ? nodeOps.createElementNS(vnode.ns, tag)\n        : nodeOps.createElement(tag, vnode);\n      setScope(vnode);\n\n      /* istanbul ignore if */\n      {\n        createChildren(vnode, children, insertedVnodeQueue);\n        if (isDef(data)) {\n          invokeCreateHooks(vnode, insertedVnodeQueue);\n        }\n        insert(parentElm, vnode.elm, refElm);\n      }\n\n      if (process.env.NODE_ENV !== 'production' && data && data.pre) {\n        creatingElmInVPre--;\n      }\n    } else if (isTrue(vnode.isComment)) {\n      vnode.elm = nodeOps.createComment(vnode.text);\n      insert(parentElm, vnode.elm, refElm);\n    } else {\n      vnode.elm = nodeOps.createTextNode(vnode.text);\n      insert(parentElm, vnode.elm, refElm);\n    }\n  }\n\n  function createComponent (vnode, insertedVnodeQueue, parentElm, refElm) {\n    var i = vnode.data;\n    if (isDef(i)) {\n      var isReactivated = isDef(vnode.componentInstance) && i.keepAlive;\n      if (isDef(i = i.hook) && isDef(i = i.init)) {\n        i(vnode, false /* hydrating */);\n      }\n      // after calling the init hook, if the vnode is a child component\n      // it should've created a child instance and mounted it. the child\n      // component also has set the placeholder vnode's elm.\n      // in that case we can just return the element and be done.\n      if (isDef(vnode.componentInstance)) {\n        initComponent(vnode, insertedVnodeQueue);\n        insert(parentElm, vnode.elm, refElm);\n        if (isTrue(isReactivated)) {\n          reactivateComponent(vnode, insertedVnodeQueue, parentElm, refElm);\n        }\n        return true\n      }\n    }\n  }\n\n  function initComponent (vnode, insertedVnodeQueue) {\n    if (isDef(vnode.data.pendingInsert)) {\n      insertedVnodeQueue.push.apply(insertedVnodeQueue, vnode.data.pendingInsert);\n      vnode.data.pendingInsert = null;\n    }\n    vnode.elm = vnode.componentInstance.$el;\n    if (isPatchable(vnode)) {\n      invokeCreateHooks(vnode, insertedVnodeQueue);\n      setScope(vnode);\n    } else {\n      // empty component root.\n      // skip all element-related modules except for ref (#3455)\n      registerRef(vnode);\n      // make sure to invoke the insert hook\n      insertedVnodeQueue.push(vnode);\n    }\n  }\n\n  function reactivateComponent (vnode, insertedVnodeQueue, parentElm, refElm) {\n    var i;\n    // hack for #4339: a reactivated component with inner transition\n    // does not trigger because the inner node's created hooks are not called\n    // again. It's not ideal to involve module-specific logic in here but\n    // there doesn't seem to be a better way to do it.\n    var innerNode = vnode;\n    while (innerNode.componentInstance) {\n      innerNode = innerNode.componentInstance._vnode;\n      if (isDef(i = innerNode.data) && isDef(i = i.transition)) {\n        for (i = 0; i < cbs.activate.length; ++i) {\n          cbs.activate[i](emptyNode, innerNode);\n        }\n        insertedVnodeQueue.push(innerNode);\n        break\n      }\n    }\n    // unlike a newly created component,\n    // a reactivated keep-alive component doesn't insert itself\n    insert(parentElm, vnode.elm, refElm);\n  }\n\n  function insert (parent, elm, ref$$1) {\n    if (isDef(parent)) {\n      if (isDef(ref$$1)) {\n        if (nodeOps.parentNode(ref$$1) === parent) {\n          nodeOps.insertBefore(parent, elm, ref$$1);\n        }\n      } else {\n        nodeOps.appendChild(parent, elm);\n      }\n    }\n  }\n\n  function createChildren (vnode, children, insertedVnodeQueue) {\n    if (Array.isArray(children)) {\n      if (process.env.NODE_ENV !== 'production') {\n        checkDuplicateKeys(children);\n      }\n      for (var i = 0; i < children.length; ++i) {\n        createElm(children[i], insertedVnodeQueue, vnode.elm, null, true, children, i);\n      }\n    } else if (isPrimitive(vnode.text)) {\n      nodeOps.appendChild(vnode.elm, nodeOps.createTextNode(String(vnode.text)));\n    }\n  }\n\n  function isPatchable (vnode) {\n    while (vnode.componentInstance) {\n      vnode = vnode.componentInstance._vnode;\n    }\n    return isDef(vnode.tag)\n  }\n\n  function invokeCreateHooks (vnode, insertedVnodeQueue) {\n    for (var i$1 = 0; i$1 < cbs.create.length; ++i$1) {\n      cbs.create[i$1](emptyNode, vnode);\n    }\n    i = vnode.data.hook; // Reuse variable\n    if (isDef(i)) {\n      if (isDef(i.create)) { i.create(emptyNode, vnode); }\n      if (isDef(i.insert)) { insertedVnodeQueue.push(vnode); }\n    }\n  }\n\n  // set scope id attribute for scoped CSS.\n  // this is implemented as a special case to avoid the overhead\n  // of going through the normal attribute patching process.\n  function setScope (vnode) {\n    var i;\n    if (isDef(i = vnode.fnScopeId)) {\n      nodeOps.setStyleScope(vnode.elm, i);\n    } else {\n      var ancestor = vnode;\n      while (ancestor) {\n        if (isDef(i = ancestor.context) && isDef(i = i.$options._scopeId)) {\n          nodeOps.setStyleScope(vnode.elm, i);\n        }\n        ancestor = ancestor.parent;\n      }\n    }\n    // for slot content they should also get the scopeId from the host instance.\n    if (isDef(i = activeInstance) &&\n      i !== vnode.context &&\n      i !== vnode.fnContext &&\n      isDef(i = i.$options._scopeId)\n    ) {\n      nodeOps.setStyleScope(vnode.elm, i);\n    }\n  }\n\n  function addVnodes (parentElm, refElm, vnodes, startIdx, endIdx, insertedVnodeQueue) {\n    for (; startIdx <= endIdx; ++startIdx) {\n      createElm(vnodes[startIdx], insertedVnodeQueue, parentElm, refElm, false, vnodes, startIdx);\n    }\n  }\n\n  function invokeDestroyHook (vnode) {\n    var i, j;\n    var data = vnode.data;\n    if (isDef(data)) {\n      if (isDef(i = data.hook) && isDef(i = i.destroy)) { i(vnode); }\n      for (i = 0; i < cbs.destroy.length; ++i) { cbs.destroy[i](vnode); }\n    }\n    if (isDef(i = vnode.children)) {\n      for (j = 0; j < vnode.children.length; ++j) {\n        invokeDestroyHook(vnode.children[j]);\n      }\n    }\n  }\n\n  function removeVnodes (vnodes, startIdx, endIdx) {\n    for (; startIdx <= endIdx; ++startIdx) {\n      var ch = vnodes[startIdx];\n      if (isDef(ch)) {\n        if (isDef(ch.tag)) {\n          removeAndInvokeRemoveHook(ch);\n          invokeDestroyHook(ch);\n        } else { // Text node\n          removeNode(ch.elm);\n        }\n      }\n    }\n  }\n\n  function removeAndInvokeRemoveHook (vnode, rm) {\n    if (isDef(rm) || isDef(vnode.data)) {\n      var i;\n      var listeners = cbs.remove.length + 1;\n      if (isDef(rm)) {\n        // we have a recursively passed down rm callback\n        // increase the listeners count\n        rm.listeners += listeners;\n      } else {\n        // directly removing\n        rm = createRmCb(vnode.elm, listeners);\n      }\n      // recursively invoke hooks on child component root node\n      if (isDef(i = vnode.componentInstance) && isDef(i = i._vnode) && isDef(i.data)) {\n        removeAndInvokeRemoveHook(i, rm);\n      }\n      for (i = 0; i < cbs.remove.length; ++i) {\n        cbs.remove[i](vnode, rm);\n      }\n      if (isDef(i = vnode.data.hook) && isDef(i = i.remove)) {\n        i(vnode, rm);\n      } else {\n        rm();\n      }\n    } else {\n      removeNode(vnode.elm);\n    }\n  }\n\n  function updateChildren (parentElm, oldCh, newCh, insertedVnodeQueue, removeOnly) {\n    var oldStartIdx = 0;\n    var newStartIdx = 0;\n    var oldEndIdx = oldCh.length - 1;\n    var oldStartVnode = oldCh[0];\n    var oldEndVnode = oldCh[oldEndIdx];\n    var newEndIdx = newCh.length - 1;\n    var newStartVnode = newCh[0];\n    var newEndVnode = newCh[newEndIdx];\n    var oldKeyToIdx, idxInOld, vnodeToMove, refElm;\n\n    // removeOnly is a special flag used only by <transition-group>\n    // to ensure removed elements stay in correct relative positions\n    // during leaving transitions\n    var canMove = !removeOnly;\n\n    if (process.env.NODE_ENV !== 'production') {\n      checkDuplicateKeys(newCh);\n    }\n\n    while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) {\n      if (isUndef(oldStartVnode)) {\n        oldStartVnode = oldCh[++oldStartIdx]; // Vnode has been moved left\n      } else if (isUndef(oldEndVnode)) {\n        oldEndVnode = oldCh[--oldEndIdx];\n      } else if (sameVnode(oldStartVnode, newStartVnode)) {\n        patchVnode(oldStartVnode, newStartVnode, insertedVnodeQueue, newCh, newStartIdx);\n        oldStartVnode = oldCh[++oldStartIdx];\n        newStartVnode = newCh[++newStartIdx];\n      } else if (sameVnode(oldEndVnode, newEndVnode)) {\n        patchVnode(oldEndVnode, newEndVnode, insertedVnodeQueue, newCh, newEndIdx);\n        oldEndVnode = oldCh[--oldEndIdx];\n        newEndVnode = newCh[--newEndIdx];\n      } else if (sameVnode(oldStartVnode, newEndVnode)) { // Vnode moved right\n        patchVnode(oldStartVnode, newEndVnode, insertedVnodeQueue, newCh, newEndIdx);\n        canMove && nodeOps.insertBefore(parentElm, oldStartVnode.elm, nodeOps.nextSibling(oldEndVnode.elm));\n        oldStartVnode = oldCh[++oldStartIdx];\n        newEndVnode = newCh[--newEndIdx];\n      } else if (sameVnode(oldEndVnode, newStartVnode)) { // Vnode moved left\n        patchVnode(oldEndVnode, newStartVnode, insertedVnodeQueue, newCh, newStartIdx);\n        canMove && nodeOps.insertBefore(parentElm, oldEndVnode.elm, oldStartVnode.elm);\n        oldEndVnode = oldCh[--oldEndIdx];\n        newStartVnode = newCh[++newStartIdx];\n      } else {\n        if (isUndef(oldKeyToIdx)) { oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx); }\n        idxInOld = isDef(newStartVnode.key)\n          ? oldKeyToIdx[newStartVnode.key]\n          : findIdxInOld(newStartVnode, oldCh, oldStartIdx, oldEndIdx);\n        if (isUndef(idxInOld)) { // New element\n          createElm(newStartVnode, insertedVnodeQueue, parentElm, oldStartVnode.elm, false, newCh, newStartIdx);\n        } else {\n          vnodeToMove = oldCh[idxInOld];\n          if (sameVnode(vnodeToMove, newStartVnode)) {\n            patchVnode(vnodeToMove, newStartVnode, insertedVnodeQueue, newCh, newStartIdx);\n            oldCh[idxInOld] = undefined;\n            canMove && nodeOps.insertBefore(parentElm, vnodeToMove.elm, oldStartVnode.elm);\n          } else {\n            // same key but different element. treat as new element\n            createElm(newStartVnode, insertedVnodeQueue, parentElm, oldStartVnode.elm, false, newCh, newStartIdx);\n          }\n        }\n        newStartVnode = newCh[++newStartIdx];\n      }\n    }\n    if (oldStartIdx > oldEndIdx) {\n      refElm = isUndef(newCh[newEndIdx + 1]) ? null : newCh[newEndIdx + 1].elm;\n      addVnodes(parentElm, refElm, newCh, newStartIdx, newEndIdx, insertedVnodeQueue);\n    } else if (newStartIdx > newEndIdx) {\n      removeVnodes(oldCh, oldStartIdx, oldEndIdx);\n    }\n  }\n\n  function checkDuplicateKeys (children) {\n    var seenKeys = {};\n    for (var i = 0; i < children.length; i++) {\n      var vnode = children[i];\n      var key = vnode.key;\n      if (isDef(key)) {\n        if (seenKeys[key]) {\n          warn(\n            (\"Duplicate keys detected: '\" + key + \"'. This may cause an update error.\"),\n            vnode.context\n          );\n        } else {\n          seenKeys[key] = true;\n        }\n      }\n    }\n  }\n\n  function findIdxInOld (node, oldCh, start, end) {\n    for (var i = start; i < end; i++) {\n      var c = oldCh[i];\n      if (isDef(c) && sameVnode(node, c)) { return i }\n    }\n  }\n\n  function patchVnode (\n    oldVnode,\n    vnode,\n    insertedVnodeQueue,\n    ownerArray,\n    index,\n    removeOnly\n  ) {\n    if (oldVnode === vnode) {\n      return\n    }\n\n    if (isDef(vnode.elm) && isDef(ownerArray)) {\n      // clone reused vnode\n      vnode = ownerArray[index] = cloneVNode(vnode);\n    }\n\n    var elm = vnode.elm = oldVnode.elm;\n\n    if (isTrue(oldVnode.isAsyncPlaceholder)) {\n      if (isDef(vnode.asyncFactory.resolved)) {\n        hydrate(oldVnode.elm, vnode, insertedVnodeQueue);\n      } else {\n        vnode.isAsyncPlaceholder = true;\n      }\n      return\n    }\n\n    // reuse element for static trees.\n    // note we only do this if the vnode is cloned -\n    // if the new node is not cloned it means the render functions have been\n    // reset by the hot-reload-api and we need to do a proper re-render.\n    if (isTrue(vnode.isStatic) &&\n      isTrue(oldVnode.isStatic) &&\n      vnode.key === oldVnode.key &&\n      (isTrue(vnode.isCloned) || isTrue(vnode.isOnce))\n    ) {\n      vnode.componentInstance = oldVnode.componentInstance;\n      return\n    }\n\n    var i;\n    var data = vnode.data;\n    if (isDef(data) && isDef(i = data.hook) && isDef(i = i.prepatch)) {\n      i(oldVnode, vnode);\n    }\n\n    var oldCh = oldVnode.children;\n    var ch = vnode.children;\n    if (isDef(data) && isPatchable(vnode)) {\n      for (i = 0; i < cbs.update.length; ++i) { cbs.update[i](oldVnode, vnode); }\n      if (isDef(i = data.hook) && isDef(i = i.update)) { i(oldVnode, vnode); }\n    }\n    if (isUndef(vnode.text)) {\n      if (isDef(oldCh) && isDef(ch)) {\n        if (oldCh !== ch) { updateChildren(elm, oldCh, ch, insertedVnodeQueue, removeOnly); }\n      } else if (isDef(ch)) {\n        if (process.env.NODE_ENV !== 'production') {\n          checkDuplicateKeys(ch);\n        }\n        if (isDef(oldVnode.text)) { nodeOps.setTextContent(elm, ''); }\n        addVnodes(elm, null, ch, 0, ch.length - 1, insertedVnodeQueue);\n      } else if (isDef(oldCh)) {\n        removeVnodes(oldCh, 0, oldCh.length - 1);\n      } else if (isDef(oldVnode.text)) {\n        nodeOps.setTextContent(elm, '');\n      }\n    } else if (oldVnode.text !== vnode.text) {\n      nodeOps.setTextContent(elm, vnode.text);\n    }\n    if (isDef(data)) {\n      if (isDef(i = data.hook) && isDef(i = i.postpatch)) { i(oldVnode, vnode); }\n    }\n  }\n\n  function invokeInsertHook (vnode, queue, initial) {\n    // delay insert hooks for component root nodes, invoke them after the\n    // element is really inserted\n    if (isTrue(initial) && isDef(vnode.parent)) {\n      vnode.parent.data.pendingInsert = queue;\n    } else {\n      for (var i = 0; i < queue.length; ++i) {\n        queue[i].data.hook.insert(queue[i]);\n      }\n    }\n  }\n\n  var hydrationBailed = false;\n  // list of modules that can skip create hook during hydration because they\n  // are already rendered on the client or has no need for initialization\n  // Note: style is excluded because it relies on initial clone for future\n  // deep updates (#7063).\n  var isRenderedModule = makeMap('attrs,class,staticClass,staticStyle,key');\n\n  // Note: this is a browser-only function so we can assume elms are DOM nodes.\n  function hydrate (elm, vnode, insertedVnodeQueue, inVPre) {\n    var i;\n    var tag = vnode.tag;\n    var data = vnode.data;\n    var children = vnode.children;\n    inVPre = inVPre || (data && data.pre);\n    vnode.elm = elm;\n\n    if (isTrue(vnode.isComment) && isDef(vnode.asyncFactory)) {\n      vnode.isAsyncPlaceholder = true;\n      return true\n    }\n    // assert node match\n    if (process.env.NODE_ENV !== 'production') {\n      if (!assertNodeMatch(elm, vnode, inVPre)) {\n        return false\n      }\n    }\n    if (isDef(data)) {\n      if (isDef(i = data.hook) && isDef(i = i.init)) { i(vnode, true /* hydrating */); }\n      if (isDef(i = vnode.componentInstance)) {\n        // child component. it should have hydrated its own tree.\n        initComponent(vnode, insertedVnodeQueue);\n        return true\n      }\n    }\n    if (isDef(tag)) {\n      if (isDef(children)) {\n        // empty element, allow client to pick up and populate children\n        if (!elm.hasChildNodes()) {\n          createChildren(vnode, children, insertedVnodeQueue);\n        } else {\n          // v-html and domProps: innerHTML\n          if (isDef(i = data) && isDef(i = i.domProps) && isDef(i = i.innerHTML)) {\n            if (i !== elm.innerHTML) {\n              /* istanbul ignore if */\n              if (process.env.NODE_ENV !== 'production' &&\n                typeof console !== 'undefined' &&\n                !hydrationBailed\n              ) {\n                hydrationBailed = true;\n                console.warn('Parent: ', elm);\n                console.warn('server innerHTML: ', i);\n                console.warn('client innerHTML: ', elm.innerHTML);\n              }\n              return false\n            }\n          } else {\n            // iterate and compare children lists\n            var childrenMatch = true;\n            var childNode = elm.firstChild;\n            for (var i$1 = 0; i$1 < children.length; i$1++) {\n              if (!childNode || !hydrate(childNode, children[i$1], insertedVnodeQueue, inVPre)) {\n                childrenMatch = false;\n                break\n              }\n              childNode = childNode.nextSibling;\n            }\n            // if childNode is not null, it means the actual childNodes list is\n            // longer than the virtual children list.\n            if (!childrenMatch || childNode) {\n              /* istanbul ignore if */\n              if (process.env.NODE_ENV !== 'production' &&\n                typeof console !== 'undefined' &&\n                !hydrationBailed\n              ) {\n                hydrationBailed = true;\n                console.warn('Parent: ', elm);\n                console.warn('Mismatching childNodes vs. VNodes: ', elm.childNodes, children);\n              }\n              return false\n            }\n          }\n        }\n      }\n      if (isDef(data)) {\n        var fullInvoke = false;\n        for (var key in data) {\n          if (!isRenderedModule(key)) {\n            fullInvoke = true;\n            invokeCreateHooks(vnode, insertedVnodeQueue);\n            break\n          }\n        }\n        if (!fullInvoke && data['class']) {\n          // ensure collecting deps for deep class bindings for future updates\n          traverse(data['class']);\n        }\n      }\n    } else if (elm.data !== vnode.text) {\n      elm.data = vnode.text;\n    }\n    return true\n  }\n\n  function assertNodeMatch (node, vnode, inVPre) {\n    if (isDef(vnode.tag)) {\n      return vnode.tag.indexOf('vue-component') === 0 || (\n        !isUnknownElement$$1(vnode, inVPre) &&\n        vnode.tag.toLowerCase() === (node.tagName && node.tagName.toLowerCase())\n      )\n    } else {\n      return node.nodeType === (vnode.isComment ? 8 : 3)\n    }\n  }\n\n  return function patch (oldVnode, vnode, hydrating, removeOnly) {\n    if (isUndef(vnode)) {\n      if (isDef(oldVnode)) { invokeDestroyHook(oldVnode); }\n      return\n    }\n\n    var isInitialPatch = false;\n    var insertedVnodeQueue = [];\n\n    if (isUndef(oldVnode)) {\n      // empty mount (likely as component), create new root element\n      isInitialPatch = true;\n      createElm(vnode, insertedVnodeQueue);\n    } else {\n      var isRealElement = isDef(oldVnode.nodeType);\n      if (!isRealElement && sameVnode(oldVnode, vnode)) {\n        // patch existing root node\n        patchVnode(oldVnode, vnode, insertedVnodeQueue, null, null, removeOnly);\n      } else {\n        if (isRealElement) {\n          // mounting to a real element\n          // check if this is server-rendered content and if we can perform\n          // a successful hydration.\n          if (oldVnode.nodeType === 1 && oldVnode.hasAttribute(SSR_ATTR)) {\n            oldVnode.removeAttribute(SSR_ATTR);\n            hydrating = true;\n          }\n          if (isTrue(hydrating)) {\n            if (hydrate(oldVnode, vnode, insertedVnodeQueue)) {\n              invokeInsertHook(vnode, insertedVnodeQueue, true);\n              return oldVnode\n            } else if (process.env.NODE_ENV !== 'production') {\n              warn(\n                'The client-side rendered virtual DOM tree is not matching ' +\n                'server-rendered content. This is likely caused by incorrect ' +\n                'HTML markup, for example nesting block-level elements inside ' +\n                '<p>, or missing <tbody>. Bailing hydration and performing ' +\n                'full client-side render.'\n              );\n            }\n          }\n          // either not server-rendered, or hydration failed.\n          // create an empty node and replace it\n          oldVnode = emptyNodeAt(oldVnode);\n        }\n\n        // replacing existing element\n        var oldElm = oldVnode.elm;\n        var parentElm = nodeOps.parentNode(oldElm);\n\n        // create new node\n        createElm(\n          vnode,\n          insertedVnodeQueue,\n          // extremely rare edge case: do not insert if old element is in a\n          // leaving transition. Only happens when combining transition +\n          // keep-alive + HOCs. (#4590)\n          oldElm._leaveCb ? null : parentElm,\n          nodeOps.nextSibling(oldElm)\n        );\n\n        // update parent placeholder node element, recursively\n        if (isDef(vnode.parent)) {\n          var ancestor = vnode.parent;\n          var patchable = isPatchable(vnode);\n          while (ancestor) {\n            for (var i = 0; i < cbs.destroy.length; ++i) {\n              cbs.destroy[i](ancestor);\n            }\n            ancestor.elm = vnode.elm;\n            if (patchable) {\n              for (var i$1 = 0; i$1 < cbs.create.length; ++i$1) {\n                cbs.create[i$1](emptyNode, ancestor);\n              }\n              // #6513\n              // invoke insert hooks that may have been merged by create hooks.\n              // e.g. for directives that uses the \"inserted\" hook.\n              var insert = ancestor.data.hook.insert;\n              if (insert.merged) {\n                // start at index 1 to avoid re-invoking component mounted hook\n                for (var i$2 = 1; i$2 < insert.fns.length; i$2++) {\n                  insert.fns[i$2]();\n                }\n              }\n            } else {\n              registerRef(ancestor);\n            }\n            ancestor = ancestor.parent;\n          }\n        }\n\n        // destroy old node\n        if (isDef(parentElm)) {\n          removeVnodes([oldVnode], 0, 0);\n        } else if (isDef(oldVnode.tag)) {\n          invokeDestroyHook(oldVnode);\n        }\n      }\n    }\n\n    invokeInsertHook(vnode, insertedVnodeQueue, isInitialPatch);\n    return vnode.elm\n  }\n}\n\n/*  */\n\nvar directives = {\n  create: updateDirectives,\n  update: updateDirectives,\n  destroy: function unbindDirectives (vnode) {\n    updateDirectives(vnode, emptyNode);\n  }\n};\n\nfunction updateDirectives (oldVnode, vnode) {\n  if (oldVnode.data.directives || vnode.data.directives) {\n    _update(oldVnode, vnode);\n  }\n}\n\nfunction _update (oldVnode, vnode) {\n  var isCreate = oldVnode === emptyNode;\n  var isDestroy = vnode === emptyNode;\n  var oldDirs = normalizeDirectives$1(oldVnode.data.directives, oldVnode.context);\n  var newDirs = normalizeDirectives$1(vnode.data.directives, vnode.context);\n\n  var dirsWithInsert = [];\n  var dirsWithPostpatch = [];\n\n  var key, oldDir, dir;\n  for (key in newDirs) {\n    oldDir = oldDirs[key];\n    dir = newDirs[key];\n    if (!oldDir) {\n      // new directive, bind\n      callHook$1(dir, 'bind', vnode, oldVnode);\n      if (dir.def && dir.def.inserted) {\n        dirsWithInsert.push(dir);\n      }\n    } else {\n      // existing directive, update\n      dir.oldValue = oldDir.value;\n      dir.oldArg = oldDir.arg;\n      callHook$1(dir, 'update', vnode, oldVnode);\n      if (dir.def && dir.def.componentUpdated) {\n        dirsWithPostpatch.push(dir);\n      }\n    }\n  }\n\n  if (dirsWithInsert.length) {\n    var callInsert = function () {\n      for (var i = 0; i < dirsWithInsert.length; i++) {\n        callHook$1(dirsWithInsert[i], 'inserted', vnode, oldVnode);\n      }\n    };\n    if (isCreate) {\n      mergeVNodeHook(vnode, 'insert', callInsert);\n    } else {\n      callInsert();\n    }\n  }\n\n  if (dirsWithPostpatch.length) {\n    mergeVNodeHook(vnode, 'postpatch', function () {\n      for (var i = 0; i < dirsWithPostpatch.length; i++) {\n        callHook$1(dirsWithPostpatch[i], 'componentUpdated', vnode, oldVnode);\n      }\n    });\n  }\n\n  if (!isCreate) {\n    for (key in oldDirs) {\n      if (!newDirs[key]) {\n        // no longer present, unbind\n        callHook$1(oldDirs[key], 'unbind', oldVnode, oldVnode, isDestroy);\n      }\n    }\n  }\n}\n\nvar emptyModifiers = Object.create(null);\n\nfunction normalizeDirectives$1 (\n  dirs,\n  vm\n) {\n  var res = Object.create(null);\n  if (!dirs) {\n    // $flow-disable-line\n    return res\n  }\n  var i, dir;\n  for (i = 0; i < dirs.length; i++) {\n    dir = dirs[i];\n    if (!dir.modifiers) {\n      // $flow-disable-line\n      dir.modifiers = emptyModifiers;\n    }\n    res[getRawDirName(dir)] = dir;\n    dir.def = resolveAsset(vm.$options, 'directives', dir.name, true);\n  }\n  // $flow-disable-line\n  return res\n}\n\nfunction getRawDirName (dir) {\n  return dir.rawName || ((dir.name) + \".\" + (Object.keys(dir.modifiers || {}).join('.')))\n}\n\nfunction callHook$1 (dir, hook, vnode, oldVnode, isDestroy) {\n  var fn = dir.def && dir.def[hook];\n  if (fn) {\n    try {\n      fn(vnode.elm, dir, vnode, oldVnode, isDestroy);\n    } catch (e) {\n      handleError(e, vnode.context, (\"directive \" + (dir.name) + \" \" + hook + \" hook\"));\n    }\n  }\n}\n\nvar baseModules = [\n  ref,\n  directives\n];\n\n/*  */\n\nfunction updateAttrs (oldVnode, vnode) {\n  var opts = vnode.componentOptions;\n  if (isDef(opts) && opts.Ctor.options.inheritAttrs === false) {\n    return\n  }\n  if (isUndef(oldVnode.data.attrs) && isUndef(vnode.data.attrs)) {\n    return\n  }\n  var key, cur, old;\n  var elm = vnode.elm;\n  var oldAttrs = oldVnode.data.attrs || {};\n  var attrs = vnode.data.attrs || {};\n  // clone observed objects, as the user probably wants to mutate it\n  if (isDef(attrs.__ob__)) {\n    attrs = vnode.data.attrs = extend({}, attrs);\n  }\n\n  for (key in attrs) {\n    cur = attrs[key];\n    old = oldAttrs[key];\n    if (old !== cur) {\n      setAttr(elm, key, cur, vnode.data.pre);\n    }\n  }\n  // #4391: in IE9, setting type can reset value for input[type=radio]\n  // #6666: IE/Edge forces progress value down to 1 before setting a max\n  /* istanbul ignore if */\n  if ((isIE || isEdge) && attrs.value !== oldAttrs.value) {\n    setAttr(elm, 'value', attrs.value);\n  }\n  for (key in oldAttrs) {\n    if (isUndef(attrs[key])) {\n      if (isXlink(key)) {\n        elm.removeAttributeNS(xlinkNS, getXlinkProp(key));\n      } else if (!isEnumeratedAttr(key)) {\n        elm.removeAttribute(key);\n      }\n    }\n  }\n}\n\nfunction setAttr (el, key, value, isInPre) {\n  if (isInPre || el.tagName.indexOf('-') > -1) {\n    baseSetAttr(el, key, value);\n  } else if (isBooleanAttr(key)) {\n    // set attribute for blank value\n    // e.g. <option disabled>Select one</option>\n    if (isFalsyAttrValue(value)) {\n      el.removeAttribute(key);\n    } else {\n      // technically allowfullscreen is a boolean attribute for <iframe>,\n      // but Flash expects a value of \"true\" when used on <embed> tag\n      value = key === 'allowfullscreen' && el.tagName === 'EMBED'\n        ? 'true'\n        : key;\n      el.setAttribute(key, value);\n    }\n  } else if (isEnumeratedAttr(key)) {\n    el.setAttribute(key, convertEnumeratedValue(key, value));\n  } else if (isXlink(key)) {\n    if (isFalsyAttrValue(value)) {\n      el.removeAttributeNS(xlinkNS, getXlinkProp(key));\n    } else {\n      el.setAttributeNS(xlinkNS, key, value);\n    }\n  } else {\n    baseSetAttr(el, key, value);\n  }\n}\n\nfunction baseSetAttr (el, key, value) {\n  if (isFalsyAttrValue(value)) {\n    el.removeAttribute(key);\n  } else {\n    // #7138: IE10 & 11 fires input event when setting placeholder on\n    // <textarea>... block the first input event and remove the blocker\n    // immediately.\n    /* istanbul ignore if */\n    if (\n      isIE && !isIE9 &&\n      el.tagName === 'TEXTAREA' &&\n      key === 'placeholder' && value !== '' && !el.__ieph\n    ) {\n      var blocker = function (e) {\n        e.stopImmediatePropagation();\n        el.removeEventListener('input', blocker);\n      };\n      el.addEventListener('input', blocker);\n      // $flow-disable-line\n      el.__ieph = true; /* IE placeholder patched */\n    }\n    el.setAttribute(key, value);\n  }\n}\n\nvar attrs = {\n  create: updateAttrs,\n  update: updateAttrs\n};\n\n/*  */\n\nfunction updateClass (oldVnode, vnode) {\n  var el = vnode.elm;\n  var data = vnode.data;\n  var oldData = oldVnode.data;\n  if (\n    isUndef(data.staticClass) &&\n    isUndef(data.class) && (\n      isUndef(oldData) || (\n        isUndef(oldData.staticClass) &&\n        isUndef(oldData.class)\n      )\n    )\n  ) {\n    return\n  }\n\n  var cls = genClassForVnode(vnode);\n\n  // handle transition classes\n  var transitionClass = el._transitionClasses;\n  if (isDef(transitionClass)) {\n    cls = concat(cls, stringifyClass(transitionClass));\n  }\n\n  // set the class\n  if (cls !== el._prevClass) {\n    el.setAttribute('class', cls);\n    el._prevClass = cls;\n  }\n}\n\nvar klass = {\n  create: updateClass,\n  update: updateClass\n};\n\n/*  */\n\n/*  */\n\n/*  */\n\n/*  */\n\n// in some cases, the event used has to be determined at runtime\n// so we used some reserved tokens during compile.\nvar RANGE_TOKEN = '__r';\nvar CHECKBOX_RADIO_TOKEN = '__c';\n\n/*  */\n\n// normalize v-model event tokens that can only be determined at runtime.\n// it's important to place the event as the first in the array because\n// the whole point is ensuring the v-model callback gets called before\n// user-attached handlers.\nfunction normalizeEvents (on) {\n  /* istanbul ignore if */\n  if (isDef(on[RANGE_TOKEN])) {\n    // IE input[type=range] only supports `change` event\n    var event = isIE ? 'change' : 'input';\n    on[event] = [].concat(on[RANGE_TOKEN], on[event] || []);\n    delete on[RANGE_TOKEN];\n  }\n  // This was originally intended to fix #4521 but no longer necessary\n  // after 2.5. Keeping it for backwards compat with generated code from < 2.4\n  /* istanbul ignore if */\n  if (isDef(on[CHECKBOX_RADIO_TOKEN])) {\n    on.change = [].concat(on[CHECKBOX_RADIO_TOKEN], on.change || []);\n    delete on[CHECKBOX_RADIO_TOKEN];\n  }\n}\n\nvar target$1;\n\nfunction createOnceHandler$1 (event, handler, capture) {\n  var _target = target$1; // save current target element in closure\n  return function onceHandler () {\n    var res = handler.apply(null, arguments);\n    if (res !== null) {\n      remove$2(event, onceHandler, capture, _target);\n    }\n  }\n}\n\n// #9446: Firefox <= 53 (in particular, ESR 52) has incorrect Event.timeStamp\n// implementation and does not fire microtasks in between event propagation, so\n// safe to exclude.\nvar useMicrotaskFix = isUsingMicroTask && !(isFF && Number(isFF[1]) <= 53);\n\nfunction add$1 (\n  name,\n  handler,\n  capture,\n  passive\n) {\n  // async edge case #6566: inner click event triggers patch, event handler\n  // attached to outer element during patch, and triggered again. This\n  // happens because browsers fire microtask ticks between event propagation.\n  // the solution is simple: we save the timestamp when a handler is attached,\n  // and the handler would only fire if the event passed to it was fired\n  // AFTER it was attached.\n  if (useMicrotaskFix) {\n    var attachedTimestamp = currentFlushTimestamp;\n    var original = handler;\n    handler = original._wrapper = function (e) {\n      if (\n        // no bubbling, should always fire.\n        // this is just a safety net in case event.timeStamp is unreliable in\n        // certain weird environments...\n        e.target === e.currentTarget ||\n        // event is fired after handler attachment\n        e.timeStamp >= attachedTimestamp ||\n        // bail for environments that have buggy event.timeStamp implementations\n        // #9462 iOS 9 bug: event.timeStamp is 0 after history.pushState\n        // #9681 QtWebEngine event.timeStamp is negative value\n        e.timeStamp <= 0 ||\n        // #9448 bail if event is fired in another document in a multi-page\n        // electron/nw.js app, since event.timeStamp will be using a different\n        // starting reference\n        e.target.ownerDocument !== document\n      ) {\n        return original.apply(this, arguments)\n      }\n    };\n  }\n  target$1.addEventListener(\n    name,\n    handler,\n    supportsPassive\n      ? { capture: capture, passive: passive }\n      : capture\n  );\n}\n\nfunction remove$2 (\n  name,\n  handler,\n  capture,\n  _target\n) {\n  (_target || target$1).removeEventListener(\n    name,\n    handler._wrapper || handler,\n    capture\n  );\n}\n\nfunction updateDOMListeners (oldVnode, vnode) {\n  if (isUndef(oldVnode.data.on) && isUndef(vnode.data.on)) {\n    return\n  }\n  var on = vnode.data.on || {};\n  var oldOn = oldVnode.data.on || {};\n  target$1 = vnode.elm;\n  normalizeEvents(on);\n  updateListeners(on, oldOn, add$1, remove$2, createOnceHandler$1, vnode.context);\n  target$1 = undefined;\n}\n\nvar events = {\n  create: updateDOMListeners,\n  update: updateDOMListeners\n};\n\n/*  */\n\nvar svgContainer;\n\nfunction updateDOMProps (oldVnode, vnode) {\n  if (isUndef(oldVnode.data.domProps) && isUndef(vnode.data.domProps)) {\n    return\n  }\n  var key, cur;\n  var elm = vnode.elm;\n  var oldProps = oldVnode.data.domProps || {};\n  var props = vnode.data.domProps || {};\n  // clone observed objects, as the user probably wants to mutate it\n  if (isDef(props.__ob__)) {\n    props = vnode.data.domProps = extend({}, props);\n  }\n\n  for (key in oldProps) {\n    if (!(key in props)) {\n      elm[key] = '';\n    }\n  }\n\n  for (key in props) {\n    cur = props[key];\n    // ignore children if the node has textContent or innerHTML,\n    // as these will throw away existing DOM nodes and cause removal errors\n    // on subsequent patches (#3360)\n    if (key === 'textContent' || key === 'innerHTML') {\n      if (vnode.children) { vnode.children.length = 0; }\n      if (cur === oldProps[key]) { continue }\n      // #6601 work around Chrome version <= 55 bug where single textNode\n      // replaced by innerHTML/textContent retains its parentNode property\n      if (elm.childNodes.length === 1) {\n        elm.removeChild(elm.childNodes[0]);\n      }\n    }\n\n    if (key === 'value' && elm.tagName !== 'PROGRESS') {\n      // store value as _value as well since\n      // non-string values will be stringified\n      elm._value = cur;\n      // avoid resetting cursor position when value is the same\n      var strCur = isUndef(cur) ? '' : String(cur);\n      if (shouldUpdateValue(elm, strCur)) {\n        elm.value = strCur;\n      }\n    } else if (key === 'innerHTML' && isSVG(elm.tagName) && isUndef(elm.innerHTML)) {\n      // IE doesn't support innerHTML for SVG elements\n      svgContainer = svgContainer || document.createElement('div');\n      svgContainer.innerHTML = \"<svg>\" + cur + \"</svg>\";\n      var svg = svgContainer.firstChild;\n      while (elm.firstChild) {\n        elm.removeChild(elm.firstChild);\n      }\n      while (svg.firstChild) {\n        elm.appendChild(svg.firstChild);\n      }\n    } else if (\n      // skip the update if old and new VDOM state is the same.\n      // `value` is handled separately because the DOM value may be temporarily\n      // out of sync with VDOM state due to focus, composition and modifiers.\n      // This  #4521 by skipping the unnecessary `checked` update.\n      cur !== oldProps[key]\n    ) {\n      // some property updates can throw\n      // e.g. `value` on <progress> w/ non-finite value\n      try {\n        elm[key] = cur;\n      } catch (e) {}\n    }\n  }\n}\n\n// check platforms/web/util/attrs.js acceptValue\n\n\nfunction shouldUpdateValue (elm, checkVal) {\n  return (!elm.composing && (\n    elm.tagName === 'OPTION' ||\n    isNotInFocusAndDirty(elm, checkVal) ||\n    isDirtyWithModifiers(elm, checkVal)\n  ))\n}\n\nfunction isNotInFocusAndDirty (elm, checkVal) {\n  // return true when textbox (.number and .trim) loses focus and its value is\n  // not equal to the updated value\n  var notInFocus = true;\n  // #6157\n  // work around IE bug when accessing document.activeElement in an iframe\n  try { notInFocus = document.activeElement !== elm; } catch (e) {}\n  return notInFocus && elm.value !== checkVal\n}\n\nfunction isDirtyWithModifiers (elm, newVal) {\n  var value = elm.value;\n  var modifiers = elm._vModifiers; // injected by v-model runtime\n  if (isDef(modifiers)) {\n    if (modifiers.number) {\n      return toNumber(value) !== toNumber(newVal)\n    }\n    if (modifiers.trim) {\n      return value.trim() !== newVal.trim()\n    }\n  }\n  return value !== newVal\n}\n\nvar domProps = {\n  create: updateDOMProps,\n  update: updateDOMProps\n};\n\n/*  */\n\nvar parseStyleText = cached(function (cssText) {\n  var res = {};\n  var listDelimiter = /;(?![^(]*\\))/g;\n  var propertyDelimiter = /:(.+)/;\n  cssText.split(listDelimiter).forEach(function (item) {\n    if (item) {\n      var tmp = item.split(propertyDelimiter);\n      tmp.length > 1 && (res[tmp[0].trim()] = tmp[1].trim());\n    }\n  });\n  return res\n});\n\n// merge static and dynamic style data on the same vnode\nfunction normalizeStyleData (data) {\n  var style = normalizeStyleBinding(data.style);\n  // static style is pre-processed into an object during compilation\n  // and is always a fresh object, so it's safe to merge into it\n  return data.staticStyle\n    ? extend(data.staticStyle, style)\n    : style\n}\n\n// normalize possible array / string values into Object\nfunction normalizeStyleBinding (bindingStyle) {\n  if (Array.isArray(bindingStyle)) {\n    return toObject(bindingStyle)\n  }\n  if (typeof bindingStyle === 'string') {\n    return parseStyleText(bindingStyle)\n  }\n  return bindingStyle\n}\n\n/**\n * parent component style should be after child's\n * so that parent component's style could override it\n */\nfunction getStyle (vnode, checkChild) {\n  var res = {};\n  var styleData;\n\n  if (checkChild) {\n    var childNode = vnode;\n    while (childNode.componentInstance) {\n      childNode = childNode.componentInstance._vnode;\n      if (\n        childNode && childNode.data &&\n        (styleData = normalizeStyleData(childNode.data))\n      ) {\n        extend(res, styleData);\n      }\n    }\n  }\n\n  if ((styleData = normalizeStyleData(vnode.data))) {\n    extend(res, styleData);\n  }\n\n  var parentNode = vnode;\n  while ((parentNode = parentNode.parent)) {\n    if (parentNode.data && (styleData = normalizeStyleData(parentNode.data))) {\n      extend(res, styleData);\n    }\n  }\n  return res\n}\n\n/*  */\n\nvar cssVarRE = /^--/;\nvar importantRE = /\\s*!important$/;\nvar setProp = function (el, name, val) {\n  /* istanbul ignore if */\n  if (cssVarRE.test(name)) {\n    el.style.setProperty(name, val);\n  } else if (importantRE.test(val)) {\n    el.style.setProperty(hyphenate(name), val.replace(importantRE, ''), 'important');\n  } else {\n    var normalizedName = normalize(name);\n    if (Array.isArray(val)) {\n      // Support values array created by autoprefixer, e.g.\n      // {display: [\"-webkit-box\", \"-ms-flexbox\", \"flex\"]}\n      // Set them one by one, and the browser will only set those it can recognize\n      for (var i = 0, len = val.length; i < len; i++) {\n        el.style[normalizedName] = val[i];\n      }\n    } else {\n      el.style[normalizedName] = val;\n    }\n  }\n};\n\nvar vendorNames = ['Webkit', 'Moz', 'ms'];\n\nvar emptyStyle;\nvar normalize = cached(function (prop) {\n  emptyStyle = emptyStyle || document.createElement('div').style;\n  prop = camelize(prop);\n  if (prop !== 'filter' && (prop in emptyStyle)) {\n    return prop\n  }\n  var capName = prop.charAt(0).toUpperCase() + prop.slice(1);\n  for (var i = 0; i < vendorNames.length; i++) {\n    var name = vendorNames[i] + capName;\n    if (name in emptyStyle) {\n      return name\n    }\n  }\n});\n\nfunction updateStyle (oldVnode, vnode) {\n  var data = vnode.data;\n  var oldData = oldVnode.data;\n\n  if (isUndef(data.staticStyle) && isUndef(data.style) &&\n    isUndef(oldData.staticStyle) && isUndef(oldData.style)\n  ) {\n    return\n  }\n\n  var cur, name;\n  var el = vnode.elm;\n  var oldStaticStyle = oldData.staticStyle;\n  var oldStyleBinding = oldData.normalizedStyle || oldData.style || {};\n\n  // if static style exists, stylebinding already merged into it when doing normalizeStyleData\n  var oldStyle = oldStaticStyle || oldStyleBinding;\n\n  var style = normalizeStyleBinding(vnode.data.style) || {};\n\n  // store normalized style under a different key for next diff\n  // make sure to clone it if it's reactive, since the user likely wants\n  // to mutate it.\n  vnode.data.normalizedStyle = isDef(style.__ob__)\n    ? extend({}, style)\n    : style;\n\n  var newStyle = getStyle(vnode, true);\n\n  for (name in oldStyle) {\n    if (isUndef(newStyle[name])) {\n      setProp(el, name, '');\n    }\n  }\n  for (name in newStyle) {\n    cur = newStyle[name];\n    if (cur !== oldStyle[name]) {\n      // ie9 setting to null has no effect, must use empty string\n      setProp(el, name, cur == null ? '' : cur);\n    }\n  }\n}\n\nvar style = {\n  create: updateStyle,\n  update: updateStyle\n};\n\n/*  */\n\nvar whitespaceRE = /\\s+/;\n\n/**\n * Add class with compatibility for SVG since classList is not supported on\n * SVG elements in IE\n */\nfunction addClass (el, cls) {\n  /* istanbul ignore if */\n  if (!cls || !(cls = cls.trim())) {\n    return\n  }\n\n  /* istanbul ignore else */\n  if (el.classList) {\n    if (cls.indexOf(' ') > -1) {\n      cls.split(whitespaceRE).forEach(function (c) { return el.classList.add(c); });\n    } else {\n      el.classList.add(cls);\n    }\n  } else {\n    var cur = \" \" + (el.getAttribute('class') || '') + \" \";\n    if (cur.indexOf(' ' + cls + ' ') < 0) {\n      el.setAttribute('class', (cur + cls).trim());\n    }\n  }\n}\n\n/**\n * Remove class with compatibility for SVG since classList is not supported on\n * SVG elements in IE\n */\nfunction removeClass (el, cls) {\n  /* istanbul ignore if */\n  if (!cls || !(cls = cls.trim())) {\n    return\n  }\n\n  /* istanbul ignore else */\n  if (el.classList) {\n    if (cls.indexOf(' ') > -1) {\n      cls.split(whitespaceRE).forEach(function (c) { return el.classList.remove(c); });\n    } else {\n      el.classList.remove(cls);\n    }\n    if (!el.classList.length) {\n      el.removeAttribute('class');\n    }\n  } else {\n    var cur = \" \" + (el.getAttribute('class') || '') + \" \";\n    var tar = ' ' + cls + ' ';\n    while (cur.indexOf(tar) >= 0) {\n      cur = cur.replace(tar, ' ');\n    }\n    cur = cur.trim();\n    if (cur) {\n      el.setAttribute('class', cur);\n    } else {\n      el.removeAttribute('class');\n    }\n  }\n}\n\n/*  */\n\nfunction resolveTransition (def$$1) {\n  if (!def$$1) {\n    return\n  }\n  /* istanbul ignore else */\n  if (typeof def$$1 === 'object') {\n    var res = {};\n    if (def$$1.css !== false) {\n      extend(res, autoCssTransition(def$$1.name || 'v'));\n    }\n    extend(res, def$$1);\n    return res\n  } else if (typeof def$$1 === 'string') {\n    return autoCssTransition(def$$1)\n  }\n}\n\nvar autoCssTransition = cached(function (name) {\n  return {\n    enterClass: (name + \"-enter\"),\n    enterToClass: (name + \"-enter-to\"),\n    enterActiveClass: (name + \"-enter-active\"),\n    leaveClass: (name + \"-leave\"),\n    leaveToClass: (name + \"-leave-to\"),\n    leaveActiveClass: (name + \"-leave-active\")\n  }\n});\n\nvar hasTransition = inBrowser && !isIE9;\nvar TRANSITION = 'transition';\nvar ANIMATION = 'animation';\n\n// Transition property/event sniffing\nvar transitionProp = 'transition';\nvar transitionEndEvent = 'transitionend';\nvar animationProp = 'animation';\nvar animationEndEvent = 'animationend';\nif (hasTransition) {\n  /* istanbul ignore if */\n  if (window.ontransitionend === undefined &&\n    window.onwebkittransitionend !== undefined\n  ) {\n    transitionProp = 'WebkitTransition';\n    transitionEndEvent = 'webkitTransitionEnd';\n  }\n  if (window.onanimationend === undefined &&\n    window.onwebkitanimationend !== undefined\n  ) {\n    animationProp = 'WebkitAnimation';\n    animationEndEvent = 'webkitAnimationEnd';\n  }\n}\n\n// binding to window is necessary to make hot reload work in IE in strict mode\nvar raf = inBrowser\n  ? window.requestAnimationFrame\n    ? window.requestAnimationFrame.bind(window)\n    : setTimeout\n  : /* istanbul ignore next */ function (fn) { return fn(); };\n\nfunction nextFrame (fn) {\n  raf(function () {\n    raf(fn);\n  });\n}\n\nfunction addTransitionClass (el, cls) {\n  var transitionClasses = el._transitionClasses || (el._transitionClasses = []);\n  if (transitionClasses.indexOf(cls) < 0) {\n    transitionClasses.push(cls);\n    addClass(el, cls);\n  }\n}\n\nfunction removeTransitionClass (el, cls) {\n  if (el._transitionClasses) {\n    remove(el._transitionClasses, cls);\n  }\n  removeClass(el, cls);\n}\n\nfunction whenTransitionEnds (\n  el,\n  expectedType,\n  cb\n) {\n  var ref = getTransitionInfo(el, expectedType);\n  var type = ref.type;\n  var timeout = ref.timeout;\n  var propCount = ref.propCount;\n  if (!type) { return cb() }\n  var event = type === TRANSITION ? transitionEndEvent : animationEndEvent;\n  var ended = 0;\n  var end = function () {\n    el.removeEventListener(event, onEnd);\n    cb();\n  };\n  var onEnd = function (e) {\n    if (e.target === el) {\n      if (++ended >= propCount) {\n        end();\n      }\n    }\n  };\n  setTimeout(function () {\n    if (ended < propCount) {\n      end();\n    }\n  }, timeout + 1);\n  el.addEventListener(event, onEnd);\n}\n\nvar transformRE = /\\b(transform|all)(,|$)/;\n\nfunction getTransitionInfo (el, expectedType) {\n  var styles = window.getComputedStyle(el);\n  // JSDOM may return undefined for transition properties\n  var transitionDelays = (styles[transitionProp + 'Delay'] || '').split(', ');\n  var transitionDurations = (styles[transitionProp + 'Duration'] || '').split(', ');\n  var transitionTimeout = getTimeout(transitionDelays, transitionDurations);\n  var animationDelays = (styles[animationProp + 'Delay'] || '').split(', ');\n  var animationDurations = (styles[animationProp + 'Duration'] || '').split(', ');\n  var animationTimeout = getTimeout(animationDelays, animationDurations);\n\n  var type;\n  var timeout = 0;\n  var propCount = 0;\n  /* istanbul ignore if */\n  if (expectedType === TRANSITION) {\n    if (transitionTimeout > 0) {\n      type = TRANSITION;\n      timeout = transitionTimeout;\n      propCount = transitionDurations.length;\n    }\n  } else if (expectedType === ANIMATION) {\n    if (animationTimeout > 0) {\n      type = ANIMATION;\n      timeout = animationTimeout;\n      propCount = animationDurations.length;\n    }\n  } else {\n    timeout = Math.max(transitionTimeout, animationTimeout);\n    type = timeout > 0\n      ? transitionTimeout > animationTimeout\n        ? TRANSITION\n        : ANIMATION\n      : null;\n    propCount = type\n      ? type === TRANSITION\n        ? transitionDurations.length\n        : animationDurations.length\n      : 0;\n  }\n  var hasTransform =\n    type === TRANSITION &&\n    transformRE.test(styles[transitionProp + 'Property']);\n  return {\n    type: type,\n    timeout: timeout,\n    propCount: propCount,\n    hasTransform: hasTransform\n  }\n}\n\nfunction getTimeout (delays, durations) {\n  /* istanbul ignore next */\n  while (delays.length < durations.length) {\n    delays = delays.concat(delays);\n  }\n\n  return Math.max.apply(null, durations.map(function (d, i) {\n    return toMs(d) + toMs(delays[i])\n  }))\n}\n\n// Old versions of Chromium (below 61.0.3163.100) formats floating pointer numbers\n// in a locale-dependent way, using a comma instead of a dot.\n// If comma is not replaced with a dot, the input will be rounded down (i.e. acting\n// as a floor function) causing unexpected behaviors\nfunction toMs (s) {\n  return Number(s.slice(0, -1).replace(',', '.')) * 1000\n}\n\n/*  */\n\nfunction enter (vnode, toggleDisplay) {\n  var el = vnode.elm;\n\n  // call leave callback now\n  if (isDef(el._leaveCb)) {\n    el._leaveCb.cancelled = true;\n    el._leaveCb();\n  }\n\n  var data = resolveTransition(vnode.data.transition);\n  if (isUndef(data)) {\n    return\n  }\n\n  /* istanbul ignore if */\n  if (isDef(el._enterCb) || el.nodeType !== 1) {\n    return\n  }\n\n  var css = data.css;\n  var type = data.type;\n  var enterClass = data.enterClass;\n  var enterToClass = data.enterToClass;\n  var enterActiveClass = data.enterActiveClass;\n  var appearClass = data.appearClass;\n  var appearToClass = data.appearToClass;\n  var appearActiveClass = data.appearActiveClass;\n  var beforeEnter = data.beforeEnter;\n  var enter = data.enter;\n  var afterEnter = data.afterEnter;\n  var enterCancelled = data.enterCancelled;\n  var beforeAppear = data.beforeAppear;\n  var appear = data.appear;\n  var afterAppear = data.afterAppear;\n  var appearCancelled = data.appearCancelled;\n  var duration = data.duration;\n\n  // activeInstance will always be the <transition> component managing this\n  // transition. One edge case to check is when the <transition> is placed\n  // as the root node of a child component. In that case we need to check\n  // <transition>'s parent for appear check.\n  var context = activeInstance;\n  var transitionNode = activeInstance.$vnode;\n  while (transitionNode && transitionNode.parent) {\n    context = transitionNode.context;\n    transitionNode = transitionNode.parent;\n  }\n\n  var isAppear = !context._isMounted || !vnode.isRootInsert;\n\n  if (isAppear && !appear && appear !== '') {\n    return\n  }\n\n  var startClass = isAppear && appearClass\n    ? appearClass\n    : enterClass;\n  var activeClass = isAppear && appearActiveClass\n    ? appearActiveClass\n    : enterActiveClass;\n  var toClass = isAppear && appearToClass\n    ? appearToClass\n    : enterToClass;\n\n  var beforeEnterHook = isAppear\n    ? (beforeAppear || beforeEnter)\n    : beforeEnter;\n  var enterHook = isAppear\n    ? (typeof appear === 'function' ? appear : enter)\n    : enter;\n  var afterEnterHook = isAppear\n    ? (afterAppear || afterEnter)\n    : afterEnter;\n  var enterCancelledHook = isAppear\n    ? (appearCancelled || enterCancelled)\n    : enterCancelled;\n\n  var explicitEnterDuration = toNumber(\n    isObject(duration)\n      ? duration.enter\n      : duration\n  );\n\n  if (process.env.NODE_ENV !== 'production' && explicitEnterDuration != null) {\n    checkDuration(explicitEnterDuration, 'enter', vnode);\n  }\n\n  var expectsCSS = css !== false && !isIE9;\n  var userWantsControl = getHookArgumentsLength(enterHook);\n\n  var cb = el._enterCb = once(function () {\n    if (expectsCSS) {\n      removeTransitionClass(el, toClass);\n      removeTransitionClass(el, activeClass);\n    }\n    if (cb.cancelled) {\n      if (expectsCSS) {\n        removeTransitionClass(el, startClass);\n      }\n      enterCancelledHook && enterCancelledHook(el);\n    } else {\n      afterEnterHook && afterEnterHook(el);\n    }\n    el._enterCb = null;\n  });\n\n  if (!vnode.data.show) {\n    // remove pending leave element on enter by injecting an insert hook\n    mergeVNodeHook(vnode, 'insert', function () {\n      var parent = el.parentNode;\n      var pendingNode = parent && parent._pending && parent._pending[vnode.key];\n      if (pendingNode &&\n        pendingNode.tag === vnode.tag &&\n        pendingNode.elm._leaveCb\n      ) {\n        pendingNode.elm._leaveCb();\n      }\n      enterHook && enterHook(el, cb);\n    });\n  }\n\n  // start enter transition\n  beforeEnterHook && beforeEnterHook(el);\n  if (expectsCSS) {\n    addTransitionClass(el, startClass);\n    addTransitionClass(el, activeClass);\n    nextFrame(function () {\n      removeTransitionClass(el, startClass);\n      if (!cb.cancelled) {\n        addTransitionClass(el, toClass);\n        if (!userWantsControl) {\n          if (isValidDuration(explicitEnterDuration)) {\n            setTimeout(cb, explicitEnterDuration);\n          } else {\n            whenTransitionEnds(el, type, cb);\n          }\n        }\n      }\n    });\n  }\n\n  if (vnode.data.show) {\n    toggleDisplay && toggleDisplay();\n    enterHook && enterHook(el, cb);\n  }\n\n  if (!expectsCSS && !userWantsControl) {\n    cb();\n  }\n}\n\nfunction leave (vnode, rm) {\n  var el = vnode.elm;\n\n  // call enter callback now\n  if (isDef(el._enterCb)) {\n    el._enterCb.cancelled = true;\n    el._enterCb();\n  }\n\n  var data = resolveTransition(vnode.data.transition);\n  if (isUndef(data) || el.nodeType !== 1) {\n    return rm()\n  }\n\n  /* istanbul ignore if */\n  if (isDef(el._leaveCb)) {\n    return\n  }\n\n  var css = data.css;\n  var type = data.type;\n  var leaveClass = data.leaveClass;\n  var leaveToClass = data.leaveToClass;\n  var leaveActiveClass = data.leaveActiveClass;\n  var beforeLeave = data.beforeLeave;\n  var leave = data.leave;\n  var afterLeave = data.afterLeave;\n  var leaveCancelled = data.leaveCancelled;\n  var delayLeave = data.delayLeave;\n  var duration = data.duration;\n\n  var expectsCSS = css !== false && !isIE9;\n  var userWantsControl = getHookArgumentsLength(leave);\n\n  var explicitLeaveDuration = toNumber(\n    isObject(duration)\n      ? duration.leave\n      : duration\n  );\n\n  if (process.env.NODE_ENV !== 'production' && isDef(explicitLeaveDuration)) {\n    checkDuration(explicitLeaveDuration, 'leave', vnode);\n  }\n\n  var cb = el._leaveCb = once(function () {\n    if (el.parentNode && el.parentNode._pending) {\n      el.parentNode._pending[vnode.key] = null;\n    }\n    if (expectsCSS) {\n      removeTransitionClass(el, leaveToClass);\n      removeTransitionClass(el, leaveActiveClass);\n    }\n    if (cb.cancelled) {\n      if (expectsCSS) {\n        removeTransitionClass(el, leaveClass);\n      }\n      leaveCancelled && leaveCancelled(el);\n    } else {\n      rm();\n      afterLeave && afterLeave(el);\n    }\n    el._leaveCb = null;\n  });\n\n  if (delayLeave) {\n    delayLeave(performLeave);\n  } else {\n    performLeave();\n  }\n\n  function performLeave () {\n    // the delayed leave may have already been cancelled\n    if (cb.cancelled) {\n      return\n    }\n    // record leaving element\n    if (!vnode.data.show && el.parentNode) {\n      (el.parentNode._pending || (el.parentNode._pending = {}))[(vnode.key)] = vnode;\n    }\n    beforeLeave && beforeLeave(el);\n    if (expectsCSS) {\n      addTransitionClass(el, leaveClass);\n      addTransitionClass(el, leaveActiveClass);\n      nextFrame(function () {\n        removeTransitionClass(el, leaveClass);\n        if (!cb.cancelled) {\n          addTransitionClass(el, leaveToClass);\n          if (!userWantsControl) {\n            if (isValidDuration(explicitLeaveDuration)) {\n              setTimeout(cb, explicitLeaveDuration);\n            } else {\n              whenTransitionEnds(el, type, cb);\n            }\n          }\n        }\n      });\n    }\n    leave && leave(el, cb);\n    if (!expectsCSS && !userWantsControl) {\n      cb();\n    }\n  }\n}\n\n// only used in dev mode\nfunction checkDuration (val, name, vnode) {\n  if (typeof val !== 'number') {\n    warn(\n      \"<transition> explicit \" + name + \" duration is not a valid number - \" +\n      \"got \" + (JSON.stringify(val)) + \".\",\n      vnode.context\n    );\n  } else if (isNaN(val)) {\n    warn(\n      \"<transition> explicit \" + name + \" duration is NaN - \" +\n      'the duration expression might be incorrect.',\n      vnode.context\n    );\n  }\n}\n\nfunction isValidDuration (val) {\n  return typeof val === 'number' && !isNaN(val)\n}\n\n/**\n * Normalize a transition hook's argument length. The hook may be:\n * - a merged hook (invoker) with the original in .fns\n * - a wrapped component method (check ._length)\n * - a plain function (.length)\n */\nfunction getHookArgumentsLength (fn) {\n  if (isUndef(fn)) {\n    return false\n  }\n  var invokerFns = fn.fns;\n  if (isDef(invokerFns)) {\n    // invoker\n    return getHookArgumentsLength(\n      Array.isArray(invokerFns)\n        ? invokerFns[0]\n        : invokerFns\n    )\n  } else {\n    return (fn._length || fn.length) > 1\n  }\n}\n\nfunction _enter (_, vnode) {\n  if (vnode.data.show !== true) {\n    enter(vnode);\n  }\n}\n\nvar transition = inBrowser ? {\n  create: _enter,\n  activate: _enter,\n  remove: function remove$$1 (vnode, rm) {\n    /* istanbul ignore else */\n    if (vnode.data.show !== true) {\n      leave(vnode, rm);\n    } else {\n      rm();\n    }\n  }\n} : {};\n\nvar platformModules = [\n  attrs,\n  klass,\n  events,\n  domProps,\n  style,\n  transition\n];\n\n/*  */\n\n// the directive module should be applied last, after all\n// built-in modules have been applied.\nvar modules = platformModules.concat(baseModules);\n\nvar patch = createPatchFunction({ nodeOps: nodeOps, modules: modules });\n\n/**\n * Not type checking this file because flow doesn't like attaching\n * properties to Elements.\n */\n\n/* istanbul ignore if */\nif (isIE9) {\n  // http://www.matts411.com/post/internet-explorer-9-oninput/\n  document.addEventListener('selectionchange', function () {\n    var el = document.activeElement;\n    if (el && el.vmodel) {\n      trigger(el, 'input');\n    }\n  });\n}\n\nvar directive = {\n  inserted: function inserted (el, binding, vnode, oldVnode) {\n    if (vnode.tag === 'select') {\n      // #6903\n      if (oldVnode.elm && !oldVnode.elm._vOptions) {\n        mergeVNodeHook(vnode, 'postpatch', function () {\n          directive.componentUpdated(el, binding, vnode);\n        });\n      } else {\n        setSelected(el, binding, vnode.context);\n      }\n      el._vOptions = [].map.call(el.options, getValue);\n    } else if (vnode.tag === 'textarea' || isTextInputType(el.type)) {\n      el._vModifiers = binding.modifiers;\n      if (!binding.modifiers.lazy) {\n        el.addEventListener('compositionstart', onCompositionStart);\n        el.addEventListener('compositionend', onCompositionEnd);\n        // Safari < 10.2 & UIWebView doesn't fire compositionend when\n        // switching focus before confirming composition choice\n        // this also fixes the issue where some browsers e.g. iOS Chrome\n        // fires \"change\" instead of \"input\" on autocomplete.\n        el.addEventListener('change', onCompositionEnd);\n        /* istanbul ignore if */\n        if (isIE9) {\n          el.vmodel = true;\n        }\n      }\n    }\n  },\n\n  componentUpdated: function componentUpdated (el, binding, vnode) {\n    if (vnode.tag === 'select') {\n      setSelected(el, binding, vnode.context);\n      // in case the options rendered by v-for have changed,\n      // it's possible that the value is out-of-sync with the rendered options.\n      // detect such cases and filter out values that no longer has a matching\n      // option in the DOM.\n      var prevOptions = el._vOptions;\n      var curOptions = el._vOptions = [].map.call(el.options, getValue);\n      if (curOptions.some(function (o, i) { return !looseEqual(o, prevOptions[i]); })) {\n        // trigger change event if\n        // no matching option found for at least one value\n        var needReset = el.multiple\n          ? binding.value.some(function (v) { return hasNoMatchingOption(v, curOptions); })\n          : binding.value !== binding.oldValue && hasNoMatchingOption(binding.value, curOptions);\n        if (needReset) {\n          trigger(el, 'change');\n        }\n      }\n    }\n  }\n};\n\nfunction setSelected (el, binding, vm) {\n  actuallySetSelected(el, binding, vm);\n  /* istanbul ignore if */\n  if (isIE || isEdge) {\n    setTimeout(function () {\n      actuallySetSelected(el, binding, vm);\n    }, 0);\n  }\n}\n\nfunction actuallySetSelected (el, binding, vm) {\n  var value = binding.value;\n  var isMultiple = el.multiple;\n  if (isMultiple && !Array.isArray(value)) {\n    process.env.NODE_ENV !== 'production' && warn(\n      \"<select multiple v-model=\\\"\" + (binding.expression) + \"\\\"> \" +\n      \"expects an Array value for its binding, but got \" + (Object.prototype.toString.call(value).slice(8, -1)),\n      vm\n    );\n    return\n  }\n  var selected, option;\n  for (var i = 0, l = el.options.length; i < l; i++) {\n    option = el.options[i];\n    if (isMultiple) {\n      selected = looseIndexOf(value, getValue(option)) > -1;\n      if (option.selected !== selected) {\n        option.selected = selected;\n      }\n    } else {\n      if (looseEqual(getValue(option), value)) {\n        if (el.selectedIndex !== i) {\n          el.selectedIndex = i;\n        }\n        return\n      }\n    }\n  }\n  if (!isMultiple) {\n    el.selectedIndex = -1;\n  }\n}\n\nfunction hasNoMatchingOption (value, options) {\n  return options.every(function (o) { return !looseEqual(o, value); })\n}\n\nfunction getValue (option) {\n  return '_value' in option\n    ? option._value\n    : option.value\n}\n\nfunction onCompositionStart (e) {\n  e.target.composing = true;\n}\n\nfunction onCompositionEnd (e) {\n  // prevent triggering an input event for no reason\n  if (!e.target.composing) { return }\n  e.target.composing = false;\n  trigger(e.target, 'input');\n}\n\nfunction trigger (el, type) {\n  var e = document.createEvent('HTMLEvents');\n  e.initEvent(type, true, true);\n  el.dispatchEvent(e);\n}\n\n/*  */\n\n// recursively search for possible transition defined inside the component root\nfunction locateNode (vnode) {\n  return vnode.componentInstance && (!vnode.data || !vnode.data.transition)\n    ? locateNode(vnode.componentInstance._vnode)\n    : vnode\n}\n\nvar show = {\n  bind: function bind (el, ref, vnode) {\n    var value = ref.value;\n\n    vnode = locateNode(vnode);\n    var transition$$1 = vnode.data && vnode.data.transition;\n    var originalDisplay = el.__vOriginalDisplay =\n      el.style.display === 'none' ? '' : el.style.display;\n    if (value && transition$$1) {\n      vnode.data.show = true;\n      enter(vnode, function () {\n        el.style.display = originalDisplay;\n      });\n    } else {\n      el.style.display = value ? originalDisplay : 'none';\n    }\n  },\n\n  update: function update (el, ref, vnode) {\n    var value = ref.value;\n    var oldValue = ref.oldValue;\n\n    /* istanbul ignore if */\n    if (!value === !oldValue) { return }\n    vnode = locateNode(vnode);\n    var transition$$1 = vnode.data && vnode.data.transition;\n    if (transition$$1) {\n      vnode.data.show = true;\n      if (value) {\n        enter(vnode, function () {\n          el.style.display = el.__vOriginalDisplay;\n        });\n      } else {\n        leave(vnode, function () {\n          el.style.display = 'none';\n        });\n      }\n    } else {\n      el.style.display = value ? el.__vOriginalDisplay : 'none';\n    }\n  },\n\n  unbind: function unbind (\n    el,\n    binding,\n    vnode,\n    oldVnode,\n    isDestroy\n  ) {\n    if (!isDestroy) {\n      el.style.display = el.__vOriginalDisplay;\n    }\n  }\n};\n\nvar platformDirectives = {\n  model: directive,\n  show: show\n};\n\n/*  */\n\nvar transitionProps = {\n  name: String,\n  appear: Boolean,\n  css: Boolean,\n  mode: String,\n  type: String,\n  enterClass: String,\n  leaveClass: String,\n  enterToClass: String,\n  leaveToClass: String,\n  enterActiveClass: String,\n  leaveActiveClass: String,\n  appearClass: String,\n  appearActiveClass: String,\n  appearToClass: String,\n  duration: [Number, String, Object]\n};\n\n// in case the child is also an abstract component, e.g. <keep-alive>\n// we want to recursively retrieve the real component to be rendered\nfunction getRealChild (vnode) {\n  var compOptions = vnode && vnode.componentOptions;\n  if (compOptions && compOptions.Ctor.options.abstract) {\n    return getRealChild(getFirstComponentChild(compOptions.children))\n  } else {\n    return vnode\n  }\n}\n\nfunction extractTransitionData (comp) {\n  var data = {};\n  var options = comp.$options;\n  // props\n  for (var key in options.propsData) {\n    data[key] = comp[key];\n  }\n  // events.\n  // extract listeners and pass them directly to the transition methods\n  var listeners = options._parentListeners;\n  for (var key$1 in listeners) {\n    data[camelize(key$1)] = listeners[key$1];\n  }\n  return data\n}\n\nfunction placeholder (h, rawChild) {\n  if (/\\d-keep-alive$/.test(rawChild.tag)) {\n    return h('keep-alive', {\n      props: rawChild.componentOptions.propsData\n    })\n  }\n}\n\nfunction hasParentTransition (vnode) {\n  while ((vnode = vnode.parent)) {\n    if (vnode.data.transition) {\n      return true\n    }\n  }\n}\n\nfunction isSameChild (child, oldChild) {\n  return oldChild.key === child.key && oldChild.tag === child.tag\n}\n\nvar isNotTextNode = function (c) { return c.tag || isAsyncPlaceholder(c); };\n\nvar isVShowDirective = function (d) { return d.name === 'show'; };\n\nvar Transition = {\n  name: 'transition',\n  props: transitionProps,\n  abstract: true,\n\n  render: function render (h) {\n    var this$1 = this;\n\n    var children = this.$slots.default;\n    if (!children) {\n      return\n    }\n\n    // filter out text nodes (possible whitespaces)\n    children = children.filter(isNotTextNode);\n    /* istanbul ignore if */\n    if (!children.length) {\n      return\n    }\n\n    // warn multiple elements\n    if (process.env.NODE_ENV !== 'production' && children.length > 1) {\n      warn(\n        '<transition> can only be used on a single element. Use ' +\n        '<transition-group> for lists.',\n        this.$parent\n      );\n    }\n\n    var mode = this.mode;\n\n    // warn invalid mode\n    if (process.env.NODE_ENV !== 'production' &&\n      mode && mode !== 'in-out' && mode !== 'out-in'\n    ) {\n      warn(\n        'invalid <transition> mode: ' + mode,\n        this.$parent\n      );\n    }\n\n    var rawChild = children[0];\n\n    // if this is a component root node and the component's\n    // parent container node also has transition, skip.\n    if (hasParentTransition(this.$vnode)) {\n      return rawChild\n    }\n\n    // apply transition data to child\n    // use getRealChild() to ignore abstract components e.g. keep-alive\n    var child = getRealChild(rawChild);\n    /* istanbul ignore if */\n    if (!child) {\n      return rawChild\n    }\n\n    if (this._leaving) {\n      return placeholder(h, rawChild)\n    }\n\n    // ensure a key that is unique to the vnode type and to this transition\n    // component instance. This key will be used to remove pending leaving nodes\n    // during entering.\n    var id = \"__transition-\" + (this._uid) + \"-\";\n    child.key = child.key == null\n      ? child.isComment\n        ? id + 'comment'\n        : id + child.tag\n      : isPrimitive(child.key)\n        ? (String(child.key).indexOf(id) === 0 ? child.key : id + child.key)\n        : child.key;\n\n    var data = (child.data || (child.data = {})).transition = extractTransitionData(this);\n    var oldRawChild = this._vnode;\n    var oldChild = getRealChild(oldRawChild);\n\n    // mark v-show\n    // so that the transition module can hand over the control to the directive\n    if (child.data.directives && child.data.directives.some(isVShowDirective)) {\n      child.data.show = true;\n    }\n\n    if (\n      oldChild &&\n      oldChild.data &&\n      !isSameChild(child, oldChild) &&\n      !isAsyncPlaceholder(oldChild) &&\n      // #6687 component root is a comment node\n      !(oldChild.componentInstance && oldChild.componentInstance._vnode.isComment)\n    ) {\n      // replace old child transition data with fresh one\n      // important for dynamic transitions!\n      var oldData = oldChild.data.transition = extend({}, data);\n      // handle transition mode\n      if (mode === 'out-in') {\n        // return placeholder node and queue update when leave finishes\n        this._leaving = true;\n        mergeVNodeHook(oldData, 'afterLeave', function () {\n          this$1._leaving = false;\n          this$1.$forceUpdate();\n        });\n        return placeholder(h, rawChild)\n      } else if (mode === 'in-out') {\n        if (isAsyncPlaceholder(child)) {\n          return oldRawChild\n        }\n        var delayedLeave;\n        var performLeave = function () { delayedLeave(); };\n        mergeVNodeHook(data, 'afterEnter', performLeave);\n        mergeVNodeHook(data, 'enterCancelled', performLeave);\n        mergeVNodeHook(oldData, 'delayLeave', function (leave) { delayedLeave = leave; });\n      }\n    }\n\n    return rawChild\n  }\n};\n\n/*  */\n\nvar props = extend({\n  tag: String,\n  moveClass: String\n}, transitionProps);\n\ndelete props.mode;\n\nvar TransitionGroup = {\n  props: props,\n\n  beforeMount: function beforeMount () {\n    var this$1 = this;\n\n    var update = this._update;\n    this._update = function (vnode, hydrating) {\n      var restoreActiveInstance = setActiveInstance(this$1);\n      // force removing pass\n      this$1.__patch__(\n        this$1._vnode,\n        this$1.kept,\n        false, // hydrating\n        true // removeOnly (!important, avoids unnecessary moves)\n      );\n      this$1._vnode = this$1.kept;\n      restoreActiveInstance();\n      update.call(this$1, vnode, hydrating);\n    };\n  },\n\n  render: function render (h) {\n    var tag = this.tag || this.$vnode.data.tag || 'span';\n    var map = Object.create(null);\n    var prevChildren = this.prevChildren = this.children;\n    var rawChildren = this.$slots.default || [];\n    var children = this.children = [];\n    var transitionData = extractTransitionData(this);\n\n    for (var i = 0; i < rawChildren.length; i++) {\n      var c = rawChildren[i];\n      if (c.tag) {\n        if (c.key != null && String(c.key).indexOf('__vlist') !== 0) {\n          children.push(c);\n          map[c.key] = c\n          ;(c.data || (c.data = {})).transition = transitionData;\n        } else if (process.env.NODE_ENV !== 'production') {\n          var opts = c.componentOptions;\n          var name = opts ? (opts.Ctor.options.name || opts.tag || '') : c.tag;\n          warn((\"<transition-group> children must be keyed: <\" + name + \">\"));\n        }\n      }\n    }\n\n    if (prevChildren) {\n      var kept = [];\n      var removed = [];\n      for (var i$1 = 0; i$1 < prevChildren.length; i$1++) {\n        var c$1 = prevChildren[i$1];\n        c$1.data.transition = transitionData;\n        c$1.data.pos = c$1.elm.getBoundingClientRect();\n        if (map[c$1.key]) {\n          kept.push(c$1);\n        } else {\n          removed.push(c$1);\n        }\n      }\n      this.kept = h(tag, null, kept);\n      this.removed = removed;\n    }\n\n    return h(tag, null, children)\n  },\n\n  updated: function updated () {\n    var children = this.prevChildren;\n    var moveClass = this.moveClass || ((this.name || 'v') + '-move');\n    if (!children.length || !this.hasMove(children[0].elm, moveClass)) {\n      return\n    }\n\n    // we divide the work into three loops to avoid mixing DOM reads and writes\n    // in each iteration - which helps prevent layout thrashing.\n    children.forEach(callPendingCbs);\n    children.forEach(recordPosition);\n    children.forEach(applyTranslation);\n\n    // force reflow to put everything in position\n    // assign to this to avoid being removed in tree-shaking\n    // $flow-disable-line\n    this._reflow = document.body.offsetHeight;\n\n    children.forEach(function (c) {\n      if (c.data.moved) {\n        var el = c.elm;\n        var s = el.style;\n        addTransitionClass(el, moveClass);\n        s.transform = s.WebkitTransform = s.transitionDuration = '';\n        el.addEventListener(transitionEndEvent, el._moveCb = function cb (e) {\n          if (e && e.target !== el) {\n            return\n          }\n          if (!e || /transform$/.test(e.propertyName)) {\n            el.removeEventListener(transitionEndEvent, cb);\n            el._moveCb = null;\n            removeTransitionClass(el, moveClass);\n          }\n        });\n      }\n    });\n  },\n\n  methods: {\n    hasMove: function hasMove (el, moveClass) {\n      /* istanbul ignore if */\n      if (!hasTransition) {\n        return false\n      }\n      /* istanbul ignore if */\n      if (this._hasMove) {\n        return this._hasMove\n      }\n      // Detect whether an element with the move class applied has\n      // CSS transitions. Since the element may be inside an entering\n      // transition at this very moment, we make a clone of it and remove\n      // all other transition classes applied to ensure only the move class\n      // is applied.\n      var clone = el.cloneNode();\n      if (el._transitionClasses) {\n        el._transitionClasses.forEach(function (cls) { removeClass(clone, cls); });\n      }\n      addClass(clone, moveClass);\n      clone.style.display = 'none';\n      this.$el.appendChild(clone);\n      var info = getTransitionInfo(clone);\n      this.$el.removeChild(clone);\n      return (this._hasMove = info.hasTransform)\n    }\n  }\n};\n\nfunction callPendingCbs (c) {\n  /* istanbul ignore if */\n  if (c.elm._moveCb) {\n    c.elm._moveCb();\n  }\n  /* istanbul ignore if */\n  if (c.elm._enterCb) {\n    c.elm._enterCb();\n  }\n}\n\nfunction recordPosition (c) {\n  c.data.newPos = c.elm.getBoundingClientRect();\n}\n\nfunction applyTranslation (c) {\n  var oldPos = c.data.pos;\n  var newPos = c.data.newPos;\n  var dx = oldPos.left - newPos.left;\n  var dy = oldPos.top - newPos.top;\n  if (dx || dy) {\n    c.data.moved = true;\n    var s = c.elm.style;\n    s.transform = s.WebkitTransform = \"translate(\" + dx + \"px,\" + dy + \"px)\";\n    s.transitionDuration = '0s';\n  }\n}\n\nvar platformComponents = {\n  Transition: Transition,\n  TransitionGroup: TransitionGroup\n};\n\n/*  */\n\n// install platform specific utils\nVue.config.mustUseProp = mustUseProp;\nVue.config.isReservedTag = isReservedTag;\nVue.config.isReservedAttr = isReservedAttr;\nVue.config.getTagNamespace = getTagNamespace;\nVue.config.isUnknownElement = isUnknownElement;\n\n// install platform runtime directives & components\nextend(Vue.options.directives, platformDirectives);\nextend(Vue.options.components, platformComponents);\n\n// install platform patch function\nVue.prototype.__patch__ = inBrowser ? patch : noop;\n\n// public mount method\nVue.prototype.$mount = function (\n  el,\n  hydrating\n) {\n  el = el && inBrowser ? query(el) : undefined;\n  return mountComponent(this, el, hydrating)\n};\n\n// devtools global hook\n/* istanbul ignore next */\nif (inBrowser) {\n  setTimeout(function () {\n    if (config.devtools) {\n      if (devtools) {\n        devtools.emit('init', Vue);\n      } else if (\n        process.env.NODE_ENV !== 'production' &&\n        process.env.NODE_ENV !== 'test'\n      ) {\n        console[console.info ? 'info' : 'log'](\n          'Download the Vue Devtools extension for a better development experience:\\n' +\n          'https://github.com/vuejs/vue-devtools'\n        );\n      }\n    }\n    if (process.env.NODE_ENV !== 'production' &&\n      process.env.NODE_ENV !== 'test' &&\n      config.productionTip !== false &&\n      typeof console !== 'undefined'\n    ) {\n      console[console.info ? 'info' : 'log'](\n        \"You are running Vue in development mode.\\n\" +\n        \"Make sure to turn on production mode when deploying for production.\\n\" +\n        \"See more tips at https://vuejs.org/guide/deployment.html\"\n      );\n    }\n  }, 0);\n}\n\n/*  */\n\nexport default Vue;\n","var FunctionPrototype = Function.prototype;\nvar apply = FunctionPrototype.apply;\nvar bind = FunctionPrototype.bind;\nvar call = FunctionPrototype.call;\n\n// eslint-disable-next-line es/no-reflect -- safe\nmodule.exports = typeof Reflect == 'object' && Reflect.apply || (bind ? call.bind(apply) : function () {\n  return call.apply(apply, arguments);\n});\n","var global = require('../internals/global');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar UNSUPPORTED_Y = require('../internals/regexp-sticky-helpers').UNSUPPORTED_Y;\nvar classof = require('../internals/classof-raw');\nvar defineProperty = require('../internals/object-define-property').f;\nvar getInternalState = require('../internals/internal-state').get;\n\nvar RegExpPrototype = RegExp.prototype;\nvar TypeError = global.TypeError;\n\n// `RegExp.prototype.sticky` getter\n// https://tc39.es/ecma262/#sec-get-regexp.prototype.sticky\nif (DESCRIPTORS && UNSUPPORTED_Y) {\n  defineProperty(RegExpPrototype, 'sticky', {\n    configurable: true,\n    get: function () {\n      if (this === RegExpPrototype) return undefined;\n      // We can't use InternalStateModule.getterFor because\n      // we don't add metadata for regexps created by a literal.\n      if (classof(this) === 'RegExp') {\n        return !!getInternalState(this).sticky;\n      }\n      throw TypeError('Incompatible receiver, RegExp required');\n    }\n  });\n}\n","var global = require('../internals/global');\nvar apply = require('../internals/function-apply');\nvar bind = require('../internals/function-bind-context');\nvar isCallable = require('../internals/is-callable');\nvar hasOwn = require('../internals/has-own-property');\nvar fails = require('../internals/fails');\nvar html = require('../internals/html');\nvar arraySlice = require('../internals/array-slice');\nvar createElement = require('../internals/document-create-element');\nvar IS_IOS = require('../internals/engine-is-ios');\nvar IS_NODE = require('../internals/engine-is-node');\n\nvar set = global.setImmediate;\nvar clear = global.clearImmediate;\nvar process = global.process;\nvar Dispatch = global.Dispatch;\nvar Function = global.Function;\nvar MessageChannel = global.MessageChannel;\nvar String = global.String;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar location, defer, channel, port;\n\ntry {\n  // Deno throws a ReferenceError on `location` access without `--location` flag\n  location = global.location;\n} catch (error) { /* empty */ }\n\nvar run = function (id) {\n  if (hasOwn(queue, id)) {\n    var fn = queue[id];\n    delete queue[id];\n    fn();\n  }\n};\n\nvar runner = function (id) {\n  return function () {\n    run(id);\n  };\n};\n\nvar listener = function (event) {\n  run(event.data);\n};\n\nvar post = function (id) {\n  // old engines have not location.origin\n  global.postMessage(String(id), location.protocol + '//' + location.host);\n};\n\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!set || !clear) {\n  set = function setImmediate(fn) {\n    var args = arraySlice(arguments, 1);\n    queue[++counter] = function () {\n      apply(isCallable(fn) ? fn : Function(fn), undefined, args);\n    };\n    defer(counter);\n    return counter;\n  };\n  clear = function clearImmediate(id) {\n    delete queue[id];\n  };\n  // Node.js 0.8-\n  if (IS_NODE) {\n    defer = function (id) {\n      process.nextTick(runner(id));\n    };\n  // Sphere (JS game engine) Dispatch API\n  } else if (Dispatch && Dispatch.now) {\n    defer = function (id) {\n      Dispatch.now(runner(id));\n    };\n  // Browsers with MessageChannel, includes WebWorkers\n  // except iOS - https://github.com/zloirock/core-js/issues/624\n  } else if (MessageChannel && !IS_IOS) {\n    channel = new MessageChannel();\n    port = channel.port2;\n    channel.port1.onmessage = listener;\n    defer = bind(port.postMessage, port);\n  // Browsers with postMessage, skip WebWorkers\n  // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n  } else if (\n    global.addEventListener &&\n    isCallable(global.postMessage) &&\n    !global.importScripts &&\n    location && location.protocol !== 'file:' &&\n    !fails(post)\n  ) {\n    defer = post;\n    global.addEventListener('message', listener, false);\n  // IE8-\n  } else if (ONREADYSTATECHANGE in createElement('script')) {\n    defer = function (id) {\n      html.appendChild(createElement('script'))[ONREADYSTATECHANGE] = function () {\n        html.removeChild(this);\n        run(id);\n      };\n    };\n  // Rest old browsers\n  } else {\n    defer = function (id) {\n      setTimeout(runner(id), 0);\n    };\n  }\n}\n\nmodule.exports = {\n  set: set,\n  clear: clear\n};\n","var global = require('../internals/global');\nvar userAgent = require('../internals/engine-user-agent');\n\nvar process = global.process;\nvar Deno = global.Deno;\nvar versions = process && process.versions || Deno && Deno.version;\nvar v8 = versions && versions.v8;\nvar match, version;\n\nif (v8) {\n  match = v8.split('.');\n  // in old Chrome, versions of V8 isn't V8 = Chrome / 10\n  // but their correct versions are not interesting for us\n  version = match[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1]);\n}\n\n// BrowserFS NodeJS `process` polyfill incorrectly set `.v8` to `0.0`\n// so check `userAgent` even if `.v8` exists, but 0\nif (!version && userAgent) {\n  match = userAgent.match(/Edge\\/(\\d+)/);\n  if (!match || match[1] >= 74) {\n    match = userAgent.match(/Chrome\\/(\\d+)/);\n    if (match) version = +match[1];\n  }\n}\n\nmodule.exports = version;\n","var getBuiltIn = require('../internals/get-built-in');\n\nmodule.exports = getBuiltIn('navigator', 'userAgent') || '';\n","var classof = require('../internals/classof');\nvar getMethod = require('../internals/get-method');\nvar Iterators = require('../internals/iterators');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = function (it) {\n  if (it != undefined) return getMethod(it, ITERATOR)\n    || getMethod(it, '@@iterator')\n    || Iterators[classof(it)];\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar definePropertyModule = require('../internals/object-define-property');\nvar anObject = require('../internals/an-object');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar objectKeys = require('../internals/object-keys');\n\n// `Object.defineProperties` method\n// https://tc39.es/ecma262/#sec-object.defineproperties\n// eslint-disable-next-line es/no-object-defineproperties -- safe\nmodule.exports = DESCRIPTORS ? Object.defineProperties : function defineProperties(O, Properties) {\n  anObject(O);\n  var props = toIndexedObject(Properties);\n  var keys = objectKeys(Properties);\n  var length = keys.length;\n  var index = 0;\n  var key;\n  while (length > index) definePropertyModule.f(O, key = keys[index++], props[key]);\n  return O;\n};\n","var uncurryThis = require('../internals/function-uncurry-this');\n\nmodule.exports = uncurryThis({}.isPrototypeOf);\n","var global = require('../internals/global');\nvar isCallable = require('../internals/is-callable');\n\nvar String = global.String;\nvar TypeError = global.TypeError;\n\nmodule.exports = function (argument) {\n  if (typeof argument == 'object' || isCallable(argument)) return argument;\n  throw TypeError(\"Can't set \" + String(argument) + ' as a prototype');\n};\n","module.exports = {};\n","var global = require('../internals/global');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar fails = require('../internals/fails');\nvar classof = require('../internals/classof-raw');\n\nvar Object = global.Object;\nvar split = uncurryThis(''.split);\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nmodule.exports = fails(function () {\n  // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n  // eslint-disable-next-line no-prototype-builtins -- safe\n  return !Object('z').propertyIsEnumerable(0);\n}) ? function (it) {\n  return classof(it) == 'String' ? split(it, '') : Object(it);\n} : Object;\n","var wellKnownSymbol = require('../internals/well-known-symbol');\nvar create = require('../internals/object-create');\nvar definePropertyModule = require('../internals/object-define-property');\n\nvar UNSCOPABLES = wellKnownSymbol('unscopables');\nvar ArrayPrototype = Array.prototype;\n\n// Array.prototype[@@unscopables]\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\nif (ArrayPrototype[UNSCOPABLES] == undefined) {\n  definePropertyModule.f(ArrayPrototype, UNSCOPABLES, {\n    configurable: true,\n    value: create(null)\n  });\n}\n\n// add a key to Array.prototype[@@unscopables]\nmodule.exports = function (key) {\n  ArrayPrototype[UNSCOPABLES][key] = true;\n};\n","var global = require('../internals/global');\n\nmodule.exports = function (a, b) {\n  var console = global.console;\n  if (console && console.error) {\n    arguments.length == 1 ? console.error(a) : console.error(a, b);\n  }\n};\n","var isObject = require('../internals/is-object');\nvar classof = require('../internals/classof-raw');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar MATCH = wellKnownSymbol('match');\n\n// `IsRegExp` abstract operation\n// https://tc39.es/ecma262/#sec-isregexp\nmodule.exports = function (it) {\n  var isRegExp;\n  return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : classof(it) == 'RegExp');\n};\n","var anObject = require('../internals/an-object');\nvar aConstructor = require('../internals/a-constructor');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar SPECIES = wellKnownSymbol('species');\n\n// `SpeciesConstructor` abstract operation\n// https://tc39.es/ecma262/#sec-speciesconstructor\nmodule.exports = function (O, defaultConstructor) {\n  var C = anObject(O).constructor;\n  var S;\n  return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? defaultConstructor : aConstructor(S);\n};\n","var global = require('../internals/global');\nvar call = require('../internals/function-call');\nvar isCallable = require('../internals/is-callable');\nvar isObject = require('../internals/is-object');\n\nvar TypeError = global.TypeError;\n\n// `OrdinaryToPrimitive` abstract operation\n// https://tc39.es/ecma262/#sec-ordinarytoprimitive\nmodule.exports = function (input, pref) {\n  var fn, val;\n  if (pref === 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val;\n  if (isCallable(fn = input.valueOf) && !isObject(val = call(fn, input))) return val;\n  if (pref !== 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val;\n  throw TypeError(\"Can't convert object to primitive value\");\n};\n","/* eslint-disable es/no-symbol -- required for testing */\nvar V8_VERSION = require('../internals/engine-v8-version');\nvar fails = require('../internals/fails');\n\n// eslint-disable-next-line es/no-object-getownpropertysymbols -- required for testing\nmodule.exports = !!Object.getOwnPropertySymbols && !fails(function () {\n  var symbol = Symbol();\n  // Chrome 38 Symbol has incorrect toString conversion\n  // `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances\n  return !String(symbol) || !(Object(symbol) instanceof Symbol) ||\n    // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances\n    !Symbol.sham && V8_VERSION && V8_VERSION < 41;\n});\n","var DESCRIPTORS = require('../internals/descriptors');\nvar global = require('../internals/global');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar isForced = require('../internals/is-forced');\nvar inheritIfRequired = require('../internals/inherit-if-required');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar defineProperty = require('../internals/object-define-property').f;\nvar getOwnPropertyNames = require('../internals/object-get-own-property-names').f;\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar isRegExp = require('../internals/is-regexp');\nvar toString = require('../internals/to-string');\nvar regExpFlags = require('../internals/regexp-flags');\nvar stickyHelpers = require('../internals/regexp-sticky-helpers');\nvar redefine = require('../internals/redefine');\nvar fails = require('../internals/fails');\nvar hasOwn = require('../internals/has-own-property');\nvar enforceInternalState = require('../internals/internal-state').enforce;\nvar setSpecies = require('../internals/set-species');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar UNSUPPORTED_DOT_ALL = require('../internals/regexp-unsupported-dot-all');\nvar UNSUPPORTED_NCG = require('../internals/regexp-unsupported-ncg');\n\nvar MATCH = wellKnownSymbol('match');\nvar NativeRegExp = global.RegExp;\nvar RegExpPrototype = NativeRegExp.prototype;\nvar SyntaxError = global.SyntaxError;\nvar getFlags = uncurryThis(regExpFlags);\nvar exec = uncurryThis(RegExpPrototype.exec);\nvar charAt = uncurryThis(''.charAt);\nvar replace = uncurryThis(''.replace);\nvar stringIndexOf = uncurryThis(''.indexOf);\nvar stringSlice = uncurryThis(''.slice);\n// TODO: Use only propper RegExpIdentifierName\nvar IS_NCG = /^\\?<[^\\s\\d!#%&*+<=>@^][^\\s!#%&*+<=>@^]*>/;\nvar re1 = /a/g;\nvar re2 = /a/g;\n\n// \"new\" should create a new object, old webkit bug\nvar CORRECT_NEW = new NativeRegExp(re1) !== re1;\n\nvar UNSUPPORTED_Y = stickyHelpers.UNSUPPORTED_Y;\n\nvar BASE_FORCED = DESCRIPTORS &&\n  (!CORRECT_NEW || UNSUPPORTED_Y || UNSUPPORTED_DOT_ALL || UNSUPPORTED_NCG || fails(function () {\n    re2[MATCH] = false;\n    // RegExp constructor can alter flags and IsRegExp works correct with @@match\n    return NativeRegExp(re1) != re1 || NativeRegExp(re2) == re2 || NativeRegExp(re1, 'i') != '/a/i';\n  }));\n\nvar handleDotAll = function (string) {\n  var length = string.length;\n  var index = 0;\n  var result = '';\n  var brackets = false;\n  var chr;\n  for (; index <= length; index++) {\n    chr = charAt(string, index);\n    if (chr === '\\\\') {\n      result += chr + charAt(string, ++index);\n      continue;\n    }\n    if (!brackets && chr === '.') {\n      result += '[\\\\s\\\\S]';\n    } else {\n      if (chr === '[') {\n        brackets = true;\n      } else if (chr === ']') {\n        brackets = false;\n      } result += chr;\n    }\n  } return result;\n};\n\nvar handleNCG = function (string) {\n  var length = string.length;\n  var index = 0;\n  var result = '';\n  var named = [];\n  var names = {};\n  var brackets = false;\n  var ncg = false;\n  var groupid = 0;\n  var groupname = '';\n  var chr;\n  for (; index <= length; index++) {\n    chr = charAt(string, index);\n    if (chr === '\\\\') {\n      chr = chr + charAt(string, ++index);\n    } else if (chr === ']') {\n      brackets = false;\n    } else if (!brackets) switch (true) {\n      case chr === '[':\n        brackets = true;\n        break;\n      case chr === '(':\n        if (exec(IS_NCG, stringSlice(string, index + 1))) {\n          index += 2;\n          ncg = true;\n        }\n        result += chr;\n        groupid++;\n        continue;\n      case chr === '>' && ncg:\n        if (groupname === '' || hasOwn(names, groupname)) {\n          throw new SyntaxError('Invalid capture group name');\n        }\n        names[groupname] = true;\n        named[named.length] = [groupname, groupid];\n        ncg = false;\n        groupname = '';\n        continue;\n    }\n    if (ncg) groupname += chr;\n    else result += chr;\n  } return [result, named];\n};\n\n// `RegExp` constructor\n// https://tc39.es/ecma262/#sec-regexp-constructor\nif (isForced('RegExp', BASE_FORCED)) {\n  var RegExpWrapper = function RegExp(pattern, flags) {\n    var thisIsRegExp = isPrototypeOf(RegExpPrototype, this);\n    var patternIsRegExp = isRegExp(pattern);\n    var flagsAreUndefined = flags === undefined;\n    var groups = [];\n    var rawPattern = pattern;\n    var rawFlags, dotAll, sticky, handled, result, state;\n\n    if (!thisIsRegExp && patternIsRegExp && flagsAreUndefined && pattern.constructor === RegExpWrapper) {\n      return pattern;\n    }\n\n    if (patternIsRegExp || isPrototypeOf(RegExpPrototype, pattern)) {\n      pattern = pattern.source;\n      if (flagsAreUndefined) flags = 'flags' in rawPattern ? rawPattern.flags : getFlags(rawPattern);\n    }\n\n    pattern = pattern === undefined ? '' : toString(pattern);\n    flags = flags === undefined ? '' : toString(flags);\n    rawPattern = pattern;\n\n    if (UNSUPPORTED_DOT_ALL && 'dotAll' in re1) {\n      dotAll = !!flags && stringIndexOf(flags, 's') > -1;\n      if (dotAll) flags = replace(flags, /s/g, '');\n    }\n\n    rawFlags = flags;\n\n    if (UNSUPPORTED_Y && 'sticky' in re1) {\n      sticky = !!flags && stringIndexOf(flags, 'y') > -1;\n      if (sticky) flags = replace(flags, /y/g, '');\n    }\n\n    if (UNSUPPORTED_NCG) {\n      handled = handleNCG(pattern);\n      pattern = handled[0];\n      groups = handled[1];\n    }\n\n    result = inheritIfRequired(NativeRegExp(pattern, flags), thisIsRegExp ? this : RegExpPrototype, RegExpWrapper);\n\n    if (dotAll || sticky || groups.length) {\n      state = enforceInternalState(result);\n      if (dotAll) {\n        state.dotAll = true;\n        state.raw = RegExpWrapper(handleDotAll(pattern), rawFlags);\n      }\n      if (sticky) state.sticky = true;\n      if (groups.length) state.groups = groups;\n    }\n\n    if (pattern !== rawPattern) try {\n      // fails in old engines, but we have no alternatives for unsupported regex syntax\n      createNonEnumerableProperty(result, 'source', rawPattern === '' ? '(?:)' : rawPattern);\n    } catch (error) { /* empty */ }\n\n    return result;\n  };\n\n  var proxy = function (key) {\n    key in RegExpWrapper || defineProperty(RegExpWrapper, key, {\n      configurable: true,\n      get: function () { return NativeRegExp[key]; },\n      set: function (it) { NativeRegExp[key] = it; }\n    });\n  };\n\n  for (var keys = getOwnPropertyNames(NativeRegExp), index = 0; keys.length > index;) {\n    proxy(keys[index++]);\n  }\n\n  RegExpPrototype.constructor = RegExpWrapper;\n  RegExpWrapper.prototype = RegExpPrototype;\n  redefine(global, 'RegExp', RegExpWrapper);\n}\n\n// https://tc39.es/ecma262/#sec-get-regexp-@@species\nsetSpecies('RegExp');\n","var toIndexedObject = require('../internals/to-indexed-object');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\n\n// `Array.prototype.{ indexOf, includes }` methods implementation\nvar createMethod = function (IS_INCLUDES) {\n  return function ($this, el, fromIndex) {\n    var O = toIndexedObject($this);\n    var length = lengthOfArrayLike(O);\n    var index = toAbsoluteIndex(fromIndex, length);\n    var value;\n    // Array#includes uses SameValueZero equality algorithm\n    // eslint-disable-next-line no-self-compare -- NaN check\n    if (IS_INCLUDES && el != el) while (length > index) {\n      value = O[index++];\n      // eslint-disable-next-line no-self-compare -- NaN check\n      if (value != value) return true;\n    // Array#indexOf ignores holes, Array#includes - not\n    } else for (;length > index; index++) {\n      if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\n    } return !IS_INCLUDES && -1;\n  };\n};\n\nmodule.exports = {\n  // `Array.prototype.includes` method\n  // https://tc39.es/ecma262/#sec-array.prototype.includes\n  includes: createMethod(true),\n  // `Array.prototype.indexOf` method\n  // https://tc39.es/ecma262/#sec-array.prototype.indexof\n  indexOf: createMethod(false)\n};\n","var global = require('../internals/global');\nvar isConstructor = require('../internals/is-constructor');\nvar tryToString = require('../internals/try-to-string');\n\nvar TypeError = global.TypeError;\n\n// `Assert: IsConstructor(argument) is true`\nmodule.exports = function (argument) {\n  if (isConstructor(argument)) return argument;\n  throw TypeError(tryToString(argument) + ' is not a constructor');\n};\n","var toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\n\nvar min = Math.min;\n\n// `ToLength` abstract operation\n// https://tc39.es/ecma262/#sec-tolength\nmodule.exports = function (argument) {\n  return argument > 0 ? min(toIntegerOrInfinity(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n};\n","var IS_PURE = require('../internals/is-pure');\nvar store = require('../internals/shared-store');\n\n(module.exports = function (key, value) {\n  return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n  version: '3.19.1',\n  mode: IS_PURE ? 'pure' : 'global',\n  copyright: '漏 2021 Denis Pushkarev (zloirock.ru)'\n});\n","var getBuiltIn = require('../internals/get-built-in');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar anObject = require('../internals/an-object');\n\nvar concat = uncurryThis([].concat);\n\n// all object keys, includes non-enumerable and symbols\nmodule.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {\n  var keys = getOwnPropertyNamesModule.f(anObject(it));\n  var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n  return getOwnPropertySymbols ? concat(keys, getOwnPropertySymbols(it)) : keys;\n};\n","var global = require('../internals/global');\nvar classof = require('../internals/classof');\n\nvar String = global.String;\n\nmodule.exports = function (argument) {\n  if (classof(argument) === 'Symbol') throw TypeError('Cannot convert a Symbol value to a string');\n  return String(argument);\n};\n","var ceil = Math.ceil;\nvar floor = Math.floor;\n\n// `ToIntegerOrInfinity` abstract operation\n// https://tc39.es/ecma262/#sec-tointegerorinfinity\nmodule.exports = function (argument) {\n  var number = +argument;\n  // eslint-disable-next-line no-self-compare -- safe\n  return number !== number || number === 0 ? 0 : (number > 0 ? floor : ceil)(number);\n};\n","var global = require('../internals/global');\nvar isCallable = require('../internals/is-callable');\nvar tryToString = require('../internals/try-to-string');\n\nvar TypeError = global.TypeError;\n\n// `Assert: IsCallable(argument) is true`\nmodule.exports = function (argument) {\n  if (isCallable(argument)) return argument;\n  throw TypeError(tryToString(argument) + ' is not a function');\n};\n","module.exports = function (bitmap, value) {\n  return {\n    enumerable: !(bitmap & 1),\n    configurable: !(bitmap & 2),\n    writable: !(bitmap & 4),\n    value: value\n  };\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar hasOwn = require('../internals/has-own-property');\n\nvar FunctionPrototype = Function.prototype;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar getDescriptor = DESCRIPTORS && Object.getOwnPropertyDescriptor;\n\nvar EXISTS = hasOwn(FunctionPrototype, 'name');\n// additional protection from minified / mangled / dropped function names\nvar PROPER = EXISTS && (function something() { /* empty */ }).name === 'something';\nvar CONFIGURABLE = EXISTS && (!DESCRIPTORS || (DESCRIPTORS && getDescriptor(FunctionPrototype, 'name').configurable));\n\nmodule.exports = {\n  EXISTS: EXISTS,\n  PROPER: PROPER,\n  CONFIGURABLE: CONFIGURABLE\n};\n","var classof = require('../internals/classof-raw');\nvar global = require('../internals/global');\n\nmodule.exports = classof(global.process) == 'process';\n","module.exports = typeof window == 'object';\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar call = require('../internals/function-call');\nvar fails = require('../internals/fails');\nvar objectKeys = require('../internals/object-keys');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar toObject = require('../internals/to-object');\nvar IndexedObject = require('../internals/indexed-object');\n\n// eslint-disable-next-line es/no-object-assign -- safe\nvar $assign = Object.assign;\n// eslint-disable-next-line es/no-object-defineproperty -- required for testing\nvar defineProperty = Object.defineProperty;\nvar concat = uncurryThis([].concat);\n\n// `Object.assign` method\n// https://tc39.es/ecma262/#sec-object.assign\nmodule.exports = !$assign || fails(function () {\n  // should have correct order of operations (Edge bug)\n  if (DESCRIPTORS && $assign({ b: 1 }, $assign(defineProperty({}, 'a', {\n    enumerable: true,\n    get: function () {\n      defineProperty(this, 'b', {\n        value: 3,\n        enumerable: false\n      });\n    }\n  }), { b: 2 })).b !== 1) return true;\n  // should work with symbols and should have deterministic property order (V8 bug)\n  var A = {};\n  var B = {};\n  // eslint-disable-next-line es/no-symbol -- safe\n  var symbol = Symbol();\n  var alphabet = 'abcdefghijklmnopqrst';\n  A[symbol] = 7;\n  alphabet.split('').forEach(function (chr) { B[chr] = chr; });\n  return $assign({}, A)[symbol] != 7 || objectKeys($assign({}, B)).join('') != alphabet;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars -- required for `.length`\n  var T = toObject(target);\n  var argumentsLength = arguments.length;\n  var index = 1;\n  var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n  var propertyIsEnumerable = propertyIsEnumerableModule.f;\n  while (argumentsLength > index) {\n    var S = IndexedObject(arguments[index++]);\n    var keys = getOwnPropertySymbols ? concat(objectKeys(S), getOwnPropertySymbols(S)) : objectKeys(S);\n    var length = keys.length;\n    var j = 0;\n    var key;\n    while (length > j) {\n      key = keys[j++];\n      if (!DESCRIPTORS || call(propertyIsEnumerable, S, key)) T[key] = S[key];\n    }\n  } return T;\n} : $assign;\n","var uncurryThis = require('../internals/function-uncurry-this');\nvar fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\nvar classof = require('../internals/classof');\nvar getBuiltIn = require('../internals/get-built-in');\nvar inspectSource = require('../internals/inspect-source');\n\nvar noop = function () { /* empty */ };\nvar empty = [];\nvar construct = getBuiltIn('Reflect', 'construct');\nvar constructorRegExp = /^\\s*(?:class|function)\\b/;\nvar exec = uncurryThis(constructorRegExp.exec);\nvar INCORRECT_TO_STRING = !constructorRegExp.exec(noop);\n\nvar isConstructorModern = function (argument) {\n  if (!isCallable(argument)) return false;\n  try {\n    construct(noop, empty, argument);\n    return true;\n  } catch (error) {\n    return false;\n  }\n};\n\nvar isConstructorLegacy = function (argument) {\n  if (!isCallable(argument)) return false;\n  switch (classof(argument)) {\n    case 'AsyncFunction':\n    case 'GeneratorFunction':\n    case 'AsyncGeneratorFunction': return false;\n    // we can't check .prototype since constructors produced by .bind haven't it\n  } return INCORRECT_TO_STRING || !!exec(constructorRegExp, inspectSource(argument));\n};\n\n// `IsConstructor` abstract operation\n// https://tc39.es/ecma262/#sec-isconstructor\nmodule.exports = !construct || fails(function () {\n  var called;\n  return isConstructorModern(isConstructorModern.call)\n    || !isConstructorModern(Object)\n    || !isConstructorModern(function () { called = true; })\n    || called;\n}) ? isConstructorLegacy : isConstructorModern;\n","var NATIVE_WEAK_MAP = require('../internals/native-weak-map');\nvar global = require('../internals/global');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar isObject = require('../internals/is-object');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar hasOwn = require('../internals/has-own-property');\nvar shared = require('../internals/shared-store');\nvar sharedKey = require('../internals/shared-key');\nvar hiddenKeys = require('../internals/hidden-keys');\n\nvar OBJECT_ALREADY_INITIALIZED = 'Object already initialized';\nvar TypeError = global.TypeError;\nvar WeakMap = global.WeakMap;\nvar set, get, has;\n\nvar enforce = function (it) {\n  return has(it) ? get(it) : set(it, {});\n};\n\nvar getterFor = function (TYPE) {\n  return function (it) {\n    var state;\n    if (!isObject(it) || (state = get(it)).type !== TYPE) {\n      throw TypeError('Incompatible receiver, ' + TYPE + ' required');\n    } return state;\n  };\n};\n\nif (NATIVE_WEAK_MAP || shared.state) {\n  var store = shared.state || (shared.state = new WeakMap());\n  var wmget = uncurryThis(store.get);\n  var wmhas = uncurryThis(store.has);\n  var wmset = uncurryThis(store.set);\n  set = function (it, metadata) {\n    if (wmhas(store, it)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);\n    metadata.facade = it;\n    wmset(store, it, metadata);\n    return metadata;\n  };\n  get = function (it) {\n    return wmget(store, it) || {};\n  };\n  has = function (it) {\n    return wmhas(store, it);\n  };\n} else {\n  var STATE = sharedKey('state');\n  hiddenKeys[STATE] = true;\n  set = function (it, metadata) {\n    if (hasOwn(it, STATE)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);\n    metadata.facade = it;\n    createNonEnumerableProperty(it, STATE, metadata);\n    return metadata;\n  };\n  get = function (it) {\n    return hasOwn(it, STATE) ? it[STATE] : {};\n  };\n  has = function (it) {\n    return hasOwn(it, STATE);\n  };\n}\n\nmodule.exports = {\n  set: set,\n  get: get,\n  has: has,\n  enforce: enforce,\n  getterFor: getterFor\n};\n","var global = require('../internals/global');\nvar isCallable = require('../internals/is-callable');\nvar hasOwn = require('../internals/has-own-property');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar setGlobal = require('../internals/set-global');\nvar inspectSource = require('../internals/inspect-source');\nvar InternalStateModule = require('../internals/internal-state');\nvar CONFIGURABLE_FUNCTION_NAME = require('../internals/function-name').CONFIGURABLE;\n\nvar getInternalState = InternalStateModule.get;\nvar enforceInternalState = InternalStateModule.enforce;\nvar TEMPLATE = String(String).split('String');\n\n(module.exports = function (O, key, value, options) {\n  var unsafe = options ? !!options.unsafe : false;\n  var simple = options ? !!options.enumerable : false;\n  var noTargetGet = options ? !!options.noTargetGet : false;\n  var name = options && options.name !== undefined ? options.name : key;\n  var state;\n  if (isCallable(value)) {\n    if (String(name).slice(0, 7) === 'Symbol(') {\n      name = '[' + String(name).replace(/^Symbol\\(([^)]*)\\)/, '$1') + ']';\n    }\n    if (!hasOwn(value, 'name') || (CONFIGURABLE_FUNCTION_NAME && value.name !== name)) {\n      createNonEnumerableProperty(value, 'name', name);\n    }\n    state = enforceInternalState(value);\n    if (!state.source) {\n      state.source = TEMPLATE.join(typeof name == 'string' ? name : '');\n    }\n  }\n  if (O === global) {\n    if (simple) O[key] = value;\n    else setGlobal(key, value);\n    return;\n  } else if (!unsafe) {\n    delete O[key];\n  } else if (!noTargetGet && O[key]) {\n    simple = true;\n  }\n  if (simple) O[key] = value;\n  else createNonEnumerableProperty(O, key, value);\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, 'toString', function toString() {\n  return isCallable(this) && getInternalState(this).source || inspectSource(this);\n});\n","/*\n * GoJS v2.1.53 JavaScript Library for HTML Diagrams, https://gojs.net\n * GoJS and Northwoods Software are registered trademarks of Northwoods Software Corporation, https://www.nwoods.com.\n * Copyright (C) 1998-2021 by Northwoods Software Corporation.  All Rights Reserved.\n * THIS SOFTWARE IS LICENSED.  THE LICENSE AGREEMENT IS AT: https://gojs.net/2.1.53/license.html.\n * DO NOT MODIFY THIS FILE.  DO NOT DISTRIBUTE A MODIFIED COPY OF THE CONTENTS OF THIS FILE.\n */\n(function() { var t;function aa(a){var b=0;return function(){return b<a.length?{done:!1,value:a[b++]}:{done:!0}}}function ca(a){var b=\"undefined\"!=typeof Symbol&&Symbol.iterator&&a[Symbol.iterator];return b?b.call(a):{next:aa(a)}}function da(a){for(var b,c=[];!(b=a.next()).done;)c.push(b.value);return c}var ea=\"function\"==typeof Object.create?Object.create:function(a){function b(){}b.prototype=a;return new b},fa;\nif(\"function\"==typeof Object.setPrototypeOf)fa=Object.setPrototypeOf;else{var ha;a:{var ia={a:!0},ka={};try{ka.__proto__=ia;ha=ka.a;break a}catch(a){}ha=!1}fa=ha?function(a,b){a.__proto__=b;if(a.__proto__!==b)throw new TypeError(a+\" is not extensible\");return a}:null}var la=fa;\nfunction ma(a,b){a.prototype=ea(b.prototype);a.prototype.constructor=a;if(la)la(a,b);else for(var c in b)if(\"prototype\"!=c)if(Object.defineProperties){var d=Object.getOwnPropertyDescriptor(b,c);d&&Object.defineProperty(a,c,d)}else a[c]=b[c];a.BB=b.prototype}var na=\"undefined\"!=typeof window&&window===self?self:\"undefined\"!=typeof global&&null!=global?global:self,oa=\"function\"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){a!=Array.prototype&&a!=Object.prototype&&(a[b]=c.value)};\nfunction pa(a){if(a){for(var b=na,c=[\"Array\",\"prototype\",\"fill\"],d=0;d<c.length-1;d++){var e=c[d];e in b||(b[e]={});b=b[e]}c=c[c.length-1];d=b[c];a=a(d);a!=d&&null!=a&&oa(b,c,{writable:!0,value:a})}}pa(function(a){return a?a:function(a,c,d){var b=this.length||0;0>c&&(c=Math.max(0,b+c));if(null==d||d>b)d=b;d=Number(d);0>d&&(d=Math.max(0,b+d));for(c=Number(c||0);c<d;c++)this[c]=a;return this}});var x=\"object\"===typeof self&&self.self===self&&self||\"object\"===typeof global&&global.global===global&&global||\"object\"===typeof window&&window.window===window&&window||{};void 0===x.requestAnimationFrame&&(void 0===x.setImmediate?x.requestAnimationFrame=function(a){x.setTimeout(a,0)}:x.requestAnimationFrame=x.setImmediate);function ra(){}function sa(a,b){var c=-1;return function(){var d=this,e=arguments;-1!==c&&x.clearTimeout(c);c=ta(function(){c=-1;a.apply(d,e)},b)}}\nfunction ta(a,b){return x.setTimeout(a,b)}function ua(a){return x.document.createElement(a)}function B(a){throw Error(a);}function va(a,b){a=\"The object is frozen, so its properties cannot be set: \"+a.toString();void 0!==b&&(a+=\"  to value: \"+b);B(a)}function wa(a,b,c,d){c=null===c?\"*\":\"string\"===typeof c?c:\"function\"===typeof c&&\"string\"===typeof c.className?c.className:\"\";void 0!==d&&(c+=\".\"+d);B(c+\" is not in the range \"+b+\": \"+a)}function xa(a){x.console&&x.console.log(a)}\nfunction ya(){x.console&&x.console.log(\"Warning: List/Map/Set constructors no longer take an argument that enforces type.Instead they take an optional collection of Values to add to the collection. See 2.0 changelog for details.\")}function za(a){return\"object\"===typeof a&&null!==a}function Aa(a){return Array.isArray(a)||x.NodeList&&a instanceof x.NodeList||x.HTMLCollection&&a instanceof x.HTMLCollection}function Ba(a){return Array.prototype.slice.call(a)}\nfunction Ca(a,b,c){Array.isArray(a)?b>=a.length?a.push(c):a.splice(b,0,c):B(\"Cannot insert an object into an HTMLCollection or NodeList: \"+c+\" at \"+b)}function Da(a,b){Array.isArray(a)?b>=a.length?a.pop():a.splice(b,1):B(\"Cannot remove an object from an HTMLCollection or NodeList at \"+b)}function Ea(){var a=Fa.pop();return void 0===a?[]:a}function Ia(a){a.length=0;Fa.push(a)}\nfunction Ja(a){if(\"function\"===typeof a){if(a.className)return a.className;if(a.name)return a.name;var b=a.toString();b=b.substring(9,b.indexOf(\"(\")).trim();if(\"\"!==b)return a._className=b}else if(za(a)&&a.constructor)return Ja(a.constructor);return typeof a}\nfunction Ka(a){var b=a;za(a)&&(a.text?b=a.text:a.name?b=a.name:void 0!==a.key?b=a.key:void 0!==a.id?b=a.id:a.constructor===Object&&(a.Text?b=a.Text:a.Name?b=a.Name:void 0!==a.Key?b=a.Key:void 0!==a.Id?b=a.Id:void 0!==a.ID&&(b=a.ID)));return void 0===b?\"undefined\":null===b?\"null\":b.toString()}function La(a,b){if(a.hasOwnProperty(b))return!0;for(a=Object.getPrototypeOf(a);a&&a!==Function;){if(a.hasOwnProperty(b))return!0;var c=a.nB;if(c&&c[b])return!0;a=Object.getPrototypeOf(a)}return!1}\nfunction Na(a,b,c){Object.defineProperty(Pa.prototype,a,{get:b,set:c})}\nfunction Qa(a){for(var b=[],c=0;256>c;c++)b[\"0123456789abcdef\".charAt(c>>4)+\"0123456789abcdef\".charAt(c&15)]=String.fromCharCode(c);a.length%2&&(a=\"0\"+a);c=[];for(var d=0,e=0;e<a.length;e+=2)c[d++]=b[a.substr(e,2)];a=c.join(\"\");a=\"\"===a?\"0\":a;b=[];for(c=0;256>c;c++)b[c]=c;for(c=d=0;256>c;c++)d=(d+b[c]+119)%256,e=b[c],b[c]=b[d],b[d]=e;d=c=0;for(var f=\"\",g=0;g<a.length;g++)c=(c+1)%256,d=(d+b[c])%256,e=b[c],b[c]=b[d],b[d]=e,f+=String.fromCharCode(a.charCodeAt(g)^b[(b[c]+b[d])%256]);return f}\nvar Ra=void 0!==x.navigator&&0<x.navigator.userAgent.indexOf(\"MSIE 9.0\"),Sa=void 0!==x.navigator&&0<x.navigator.userAgent.indexOf(\"MSIE 10.0\"),Ta=void 0!==x.navigator&&0<x.navigator.userAgent.indexOf(\"Trident/7\"),Ua=void 0!==x.navigator&&0<x.navigator.userAgent.indexOf(\"Edge/\"),Va=void 0!==x.navigator&&void 0!==x.navigator.platform&&0<=x.navigator.platform.toUpperCase().indexOf(\"MAC\"),Wa=void 0!==x.navigator&&void 0!==x.navigator.platform&&null!==x.navigator.platform.match(/(iPhone|iPod|iPad)/i),\nFa=[];Object.freeze([]);ra.className=\"Util\";ra.Dx=\"32ab5ff3b26f42dc0ed90f21452913b5\";ra.adym=\"gojs.net\";ra.vfo=\"28e647fdb665\";ra.className=\"Util\";function D(a,b,c){Xa(this);this.l=a;this.oa=b;this.u=c}D.prototype.toString=function(){return\"EnumValue.\"+this.oa};function Ya(a,b){return void 0===b||null===b||\"\"===b?null:a[b]}\nna.Object.defineProperties(D.prototype,{classType:{get:function(){return this.l}},name:{get:function(){return this.oa}},value:{get:function(){return this.u}}});D.className=\"EnumValue\";function Za(){this.qx=[]}Za.prototype.toString=function(){return this.qx.join(\"\")};Za.prototype.add=function(a){\"\"!==a&&this.qx.push(a)};Za.className=\"StringBuilder\";function $a(){}$a.className=\"PropertyCollection\";\nvar ab={pB:!1,uB:!1,rB:!1,tB:!1,zB:!1,xB:!1,my:!1,qB:null,trace:function(a){x.console&&x.console.log(a)},sB:function(a,b,c,d){a.strokeStyle=\"red\";a.fillStyle=\"red\";a.font=\"8px sans-serif\";a.beginPath();a.moveTo(-10,0);a.lineTo(10,0);a.moveTo(0,-10);a.lineTo(0,10);a.stroke();a.setTransform(1,0,0,1,0,0);a.scale(c,c);a.transform(b.m11,b.m12,b.m21,b.m22,b.dx,b.dy);a.lineWidth=2;a.beginPath();a.moveTo(d.left,d.top+20);a.lineTo(d.left,d.top);a.lineTo(d.left+20,d.top);a.moveTo(d.right,d.bottom-20);a.lineTo(d.right,\nd.bottom);a.lineTo(d.right-20,d.bottom);a.stroke();a.fillText(\"DB: \"+Math.round(d.x)+\", \"+Math.round(d.y)+\", \"+Math.round(d.width)+\", \"+Math.round(d.height),d.left,d.top-5)},oB:function(a){var b={},c;for(c in a){b.x=c;if(\"licenseKey\"!==b.x){var d=a[b.x];if(void 0!==d.prototype){b.Jm=Object.getOwnPropertyNames(d.prototype);for(var e={Ak:0};e.Ak<b.Jm.length;e={Ak:e.Ak},e.Ak++){var f=Object.getOwnPropertyDescriptor(d.prototype,b.Jm[e.Ak]);void 0!==f.get&&void 0===f.set&&Object.defineProperty(d.prototype,\nb.Jm[e.Ak],{set:function(a,b){return function(){throw Error(\"Property \"+a.Jm[b.Ak]+\" of \"+a.x+\" is read-only.\");}}(b,e)})}}}b={Jm:b.Jm,x:b.x}}}};function cb(){}cb.prototype.reset=function(){};cb.prototype.next=function(){return!1};cb.prototype.rd=function(){return!1};cb.prototype.first=function(){return null};cb.prototype.any=function(){return!1};cb.prototype.all=function(){return!0};cb.prototype.each=function(){return this};cb.prototype.map=function(){return this};cb.prototype.filter=function(){return this};\ncb.prototype.Sd=function(){};cb.prototype.toString=function(){return\"EmptyIterator\"};na.Object.defineProperties(cb.prototype,{iterator:{get:function(){return this}},count:{get:function(){return 0}}});cb.prototype.first=cb.prototype.first;cb.prototype.hasNext=cb.prototype.rd;cb.prototype.next=cb.prototype.next;cb.prototype.reset=cb.prototype.reset;var db=null;cb.className=\"EmptyIterator\";db=new cb;function hb(a){this.key=-1;this.value=a}\nhb.prototype.reset=function(){this.key=-1};hb.prototype.next=function(){return-1===this.key?(this.key=0,!0):!1};hb.prototype.rd=function(){return this.next()};hb.prototype.first=function(){this.key=0;return this.value};hb.prototype.any=function(a){this.key=-1;return a(this.value)};hb.prototype.all=function(a){this.key=-1;return a(this.value)};hb.prototype.each=function(a){this.key=-1;a(this.value);return this};hb.prototype.map=function(a){return new hb(a(this.value))};\nhb.prototype.filter=function(a){return a(this.value)?new hb(this.value):db};hb.prototype.Sd=function(){this.value=null};hb.prototype.toString=function(){return\"SingletonIterator(\"+this.value+\")\"};na.Object.defineProperties(hb.prototype,{iterator:{get:function(){return this}},count:{get:function(){return 1}}});hb.prototype.first=hb.prototype.first;hb.prototype.hasNext=hb.prototype.rd;hb.prototype.next=hb.prototype.next;\nhb.prototype.reset=hb.prototype.reset;hb.className=\"SingletonIterator\";function ib(a){this.ub=a;this.ff=null;a.Ha=null;this.ia=a.Ba;this.Ra=-1}ib.prototype.reset=function(){var a=this.ub;a.Ha=null;this.ia=a.Ba;this.Ra=-1};ib.prototype.next=function(){var a=this.ub;if(a.Ba!==this.ia&&0>this.key)return!1;a=a.j;var b=a.length,c=++this.Ra,d=this.ff;if(null!==d)for(;c<b;){var e=a[c];if(d(e))return this.key=this.Ra=c,this.value=e,!0;c++}else{if(c<b)return this.key=c,this.value=a[c],!0;this.Sd()}return!1};\nib.prototype.rd=function(){return this.next()};ib.prototype.first=function(){var a=this.ub;this.ia=a.Ba;this.Ra=0;a=a.j;var b=a.length,c=this.ff;if(null!==c){for(var d=0;d<b;){var e=a[d];if(c(e))return this.key=this.Ra=d,this.value=e;d++}return null}return 0<b?(a=a[0],this.key=0,this.value=a):null};ib.prototype.any=function(a){var b=this.ub;b.Ha=null;this.Ra=-1;b=b.j;for(var c=b.length,d=this.ff,e=0;e<c;e++){var f=b[e];if((null===d||d(f))&&a(f))return!0}return!1};\nib.prototype.all=function(a){var b=this.ub;b.Ha=null;this.Ra=-1;b=b.j;for(var c=b.length,d=this.ff,e=0;e<c;e++){var f=b[e];if((null===d||d(f))&&!a(f))return!1}return!0};ib.prototype.each=function(a){var b=this.ub;b.Ha=null;this.Ra=-1;b=b.j;for(var c=b.length,d=this.ff,e=0;e<c;e++){var f=b[e];(null===d||d(f))&&a(f)}return this};\nib.prototype.map=function(a){var b=this.ub;b.Ha=null;this.Ra=-1;var c=[];b=b.j;for(var d=b.length,e=this.ff,f=0;f<d;f++){var g=b[f];(null===e||e(g))&&c.push(a(g))}a=new E;a.j=c;a.pb();return a.iterator};ib.prototype.filter=function(a){var b=this.ub;b.Ha=null;this.Ra=-1;var c=[];b=b.j;for(var d=b.length,e=this.ff,f=0;f<d;f++){var g=b[f];(null===e||e(g))&&a(g)&&c.push(g)}a=new E;a.j=c;a.pb();return a.iterator};\nib.prototype.Sd=function(){this.key=-1;this.value=null;this.ia=-1;this.ff=null;this.ub.Ha=this};ib.prototype.toString=function(){return\"ListIterator@\"+this.Ra+\"/\"+this.ub.count};\nna.Object.defineProperties(ib.prototype,{iterator:{get:function(){return this}},predicate:{get:function(){return this.ff},set:function(a){this.ff=a}},count:{get:function(){var a=this.ff;if(null!==a){for(var b=0,c=this.ub.j,d=c.length,e=0;e<d;e++)a(c[e])&&b++;return b}return this.ub.j.length}}});ib.prototype.first=ib.prototype.first;ib.prototype.hasNext=ib.prototype.rd;ib.prototype.next=ib.prototype.next;\nib.prototype.reset=ib.prototype.reset;ib.className=\"ListIterator\";function jb(a){this.ub=a;a.gh=null;this.ia=a.Ba;this.Ra=a.j.length}jb.prototype.reset=function(){var a=this.ub;a.gh=null;this.ia=a.Ba;this.Ra=a.j.length};jb.prototype.next=function(){var a=this.ub;if(a.Ba!==this.ia&&0>this.key)return!1;var b=--this.Ra;if(0<=b)return this.key=b,this.value=a.j[b],!0;this.Sd();return!1};jb.prototype.rd=function(){return this.next()};\njb.prototype.first=function(){var a=this.ub;this.ia=a.Ba;var b=a.j;this.Ra=a=b.length-1;return 0<=a?(b=b[a],this.key=a,this.value=b):null};jb.prototype.any=function(a){var b=this.ub;b.gh=null;b=b.j;var c=b.length;this.Ra=c;for(--c;0<=c;c--)if(a(b[c]))return!0;return!1};jb.prototype.all=function(a){var b=this.ub;b.gh=null;b=b.j;var c=b.length;this.Ra=c;for(--c;0<=c;c--)if(!a(b[c]))return!1;return!0};\njb.prototype.each=function(a){var b=this.ub;b.gh=null;b=b.j;var c=b.length;this.Ra=c;for(--c;0<=c;c--)a(b[c]);return this};jb.prototype.map=function(a){var b=this.ub;b.gh=null;var c=[];b=b.j;var d=b.length;this.Ra=d;for(--d;0<=d;d--)c.push(a(b[d]));a=new E;a.j=c;a.pb();return a.iterator};jb.prototype.filter=function(a){var b=this.ub;b.gh=null;var c=[];b=b.j;var d=b.length;this.Ra=d;for(--d;0<=d;d--){var e=b[d];a(e)&&c.push(e)}a=new E;a.j=c;a.pb();return a.iterator};\njb.prototype.Sd=function(){this.key=-1;this.value=null;this.ia=-1;this.ub.gh=this};jb.prototype.toString=function(){return\"ListIteratorBackwards(\"+this.Ra+\"/\"+this.ub.count+\")\"};na.Object.defineProperties(jb.prototype,{iterator:{get:function(){return this}},count:{get:function(){return this.ub.j.length}}});jb.prototype.first=jb.prototype.first;jb.prototype.hasNext=jb.prototype.rd;jb.prototype.next=jb.prototype.next;jb.prototype.reset=jb.prototype.reset;\njb.className=\"ListIteratorBackwards\";function E(a){Xa(this);this.v=!1;this.j=[];this.Ba=0;this.gh=this.Ha=null;void 0!==a&&(\"function\"===typeof a||\"string\"===typeof a?ya():this.addAll(a))}t=E.prototype;t.pb=function(){var a=this.Ba;a++;999999999<a&&(a=0);this.Ba=a};t.freeze=function(){this.v=!0;return this};t.ea=function(){this.v=!1;return this};t.toString=function(){return\"List()#\"+kb(this)};t.add=function(a){if(null===a)return this;this.v&&va(this,a);this.j.push(a);this.pb();return this};\nt.push=function(a){this.add(a)};t.addAll=function(a){if(null===a)return this;this.v&&va(this);var b=this.j;if(Aa(a))for(var c=a.length,d=0;d<c;d++)b.push(a[d]);else for(a=a.iterator;a.next();)b.push(a.value);this.pb();return this};t.clear=function(){this.v&&va(this);this.j.length=0;this.pb()};t.contains=function(a){return null===a?!1:-1!==this.j.indexOf(a)};t.has=function(a){return this.contains(a)};t.indexOf=function(a){return null===a?-1:this.j.indexOf(a)};\nt.J=function(a){var b=this.j;(0>a||a>=b.length)&&wa(a,\"0 <= i < length\",E,\"elt:i\");return b[a]};t.get=function(a){return this.J(a)};t.Pc=function(a,b){var c=this.j;(0>a||a>=c.length)&&wa(a,\"0 <= i < length\",E,\"setElt:i\");this.v&&va(this,a);c[a]=b};t.set=function(a,b){this.Pc(a,b)};t.first=function(){var a=this.j;return 0===a.length?null:a[0]};t.Xb=function(){var a=this.j,b=a.length;return 0<b?a[b-1]:null};t.pop=function(){this.v&&va(this);var a=this.j;return 0<a.length?a.pop():null};\nE.prototype.any=function(a){for(var b=this.j,c=b.length,d=0;d<c;d++)if(a(b[d]))return!0;return!1};E.prototype.all=function(a){for(var b=this.j,c=b.length,d=0;d<c;d++)if(!a(b[d]))return!1;return!0};E.prototype.each=function(a){for(var b=this.j,c=b.length,d=0;d<c;d++)a(b[d]);return this};E.prototype.map=function(a){for(var b=new E,c=[],d=this.j,e=d.length,f=0;f<e;f++)c.push(a(d[f]));b.j=c;b.pb();return b};\nE.prototype.filter=function(a){for(var b=new E,c=[],d=this.j,e=d.length,f=0;f<e;f++){var g=d[f];a(g)&&c.push(g)}b.j=c;b.pb();return b};t=E.prototype;t.wb=function(a,b){0>a&&wa(a,\">= 0\",E,\"insertAt:i\");this.v&&va(this,a);var c=this.j;a>=c.length?c.push(b):c.splice(a,0,b);this.pb()};t.remove=function(a){if(null===a)return!1;this.v&&va(this,a);var b=this.j;a=b.indexOf(a);if(-1===a)return!1;a===b.length-1?b.pop():b.splice(a,1);this.pb();return!0};t.delete=function(a){return this.remove(a)};\nt.cb=function(a){var b=this.j;(0>a||a>=b.length)&&wa(a,\"0 <= i < length\",E,\"removeAt:i\");this.v&&va(this,a);a===b.length-1?b.pop():b.splice(a,1);this.pb()};t.removeRange=function(a,b){var c=this.j,d=c.length;if(0>a)a=0;else if(a>=d)return this;if(0>b)return this;b>=d&&(b=d-1);if(a>b)return this;this.v&&va(this);for(var e=a,f=b+1;f<d;)c[e++]=c[f++];c.length=d-(b-a+1);this.pb();return this};E.prototype.copy=function(){var a=new E,b=this.j;0<b.length&&(a.j=Array.prototype.slice.call(b));return a};\nt=E.prototype;t.ma=function(){for(var a=this.j,b=this.count,c=Array(b),d=0;d<b;d++)c[d]=a[d];return c};t.Lw=function(){for(var a=new G,b=this.j,c=this.count,d=0;d<c;d++)a.add(b[d]);return a};t.sort=function(a){this.v&&va(this);this.j.sort(a);this.pb();return this};\nt.uj=function(a,b,c){var d=this.j,e=d.length;void 0===b&&(b=0);void 0===c&&(c=e);this.v&&va(this);var f=c-b;if(1>=f)return this;(0>b||b>=e-1)&&wa(b,\"0 <= from < length\",E,\"sortRange:from\");if(2===f)return c=d[b],e=d[b+1],0<a(c,e)&&(d[b]=e,d[b+1]=c,this.pb()),this;if(0===b)if(c>=e)d.sort(a);else for(b=d.slice(0,c),b.sort(a),a=0;a<c;a++)d[a]=b[a];else if(c>=e)for(c=d.slice(b),c.sort(a),a=b;a<e;a++)d[a]=c[a-b];else for(e=d.slice(b,c),e.sort(a),a=b;a<c;a++)d[a]=e[a-b];this.pb();return this};\nt.reverse=function(){this.v&&va(this);this.j.reverse();this.pb();return this};\nna.Object.defineProperties(E.prototype,{_dataArray:{get:function(){return this.j}},count:{get:function(){return this.j.length}},size:{get:function(){return this.j.length}},length:{get:function(){return this.j.length}},iterator:{get:function(){if(0>=this.j.length)return db;var a=this.Ha;return null!==a?(a.reset(),a):new ib(this)}},iteratorBackwards:{\nget:function(){if(0>=this.j.length)return db;var a=this.gh;return null!==a?(a.reset(),a):new jb(this)}}});E.prototype.reverse=E.prototype.reverse;E.prototype.sortRange=E.prototype.uj;E.prototype.sort=E.prototype.sort;E.prototype.toSet=E.prototype.Lw;E.prototype.toArray=E.prototype.ma;E.prototype.removeRange=E.prototype.removeRange;E.prototype.removeAt=E.prototype.cb;E.prototype[\"delete\"]=E.prototype.delete;E.prototype.remove=E.prototype.remove;E.prototype.insertAt=E.prototype.wb;\nE.prototype.pop=E.prototype.pop;E.prototype.last=E.prototype.Xb;E.prototype.first=E.prototype.first;E.prototype.set=E.prototype.set;E.prototype.setElt=E.prototype.Pc;E.prototype.get=E.prototype.get;E.prototype.elt=E.prototype.J;E.prototype.indexOf=E.prototype.indexOf;E.prototype.has=E.prototype.has;E.prototype.contains=E.prototype.contains;E.prototype.clear=E.prototype.clear;E.prototype.addAll=E.prototype.addAll;E.prototype.push=E.prototype.push;E.prototype.add=E.prototype.add;E.prototype.thaw=E.prototype.ea;\nE.prototype.freeze=E.prototype.freeze;E.className=\"List\";function lb(a){this.tg=a;a.Ha=null;this.ia=a.Ba;this.ka=null}lb.prototype.reset=function(){var a=this.tg;a.Ha=null;this.ia=a.Ba;this.ka=null};lb.prototype.next=function(){var a=this.tg;if(a.Ba!==this.ia&&null===this.key)return!1;var b=this.ka;b=null===b?a.ba:b.pa;if(null!==b)return this.ka=b,this.value=b.value,this.key=b.key,!0;this.Sd();return!1};lb.prototype.rd=function(){return this.next()};\nlb.prototype.first=function(){var a=this.tg;this.ia=a.Ba;a=a.ba;if(null!==a){this.ka=a;var b=a.value;this.key=a.key;return this.value=b}return null};lb.prototype.any=function(a){var b=this.tg;this.ka=b.Ha=null;for(b=b.ba;null!==b;){if(a(b.value))return!0;b=b.pa}return!1};lb.prototype.all=function(a){var b=this.tg;this.ka=b.Ha=null;for(b=b.ba;null!==b;){if(!a(b.value))return!1;b=b.pa}return!0};lb.prototype.each=function(a){var b=this.tg;this.ka=b.Ha=null;for(b=b.ba;null!==b;)a(b.value),b=b.pa;return this};\nlb.prototype.map=function(a){var b=this.tg;b.Ha=null;var c=new E;for(b=b.ba;null!==b;)c.add(a(b.value)),b=b.pa;return c.iterator};lb.prototype.filter=function(a){var b=this.tg;b.Ha=null;var c=new E;for(b=b.ba;null!==b;){var d=b.value;a(d)&&c.add(d);b=b.pa}return c.iterator};lb.prototype.Sd=function(){this.value=this.key=null;this.ia=-1;this.tg.Ha=this};lb.prototype.toString=function(){return null!==this.ka?\"SetIterator@\"+this.ka.value:\"SetIterator\"};\nna.Object.defineProperties(lb.prototype,{iterator:{get:function(){return this}},count:{get:function(){return this.tg.Fb}}});lb.prototype.first=lb.prototype.first;lb.prototype.hasNext=lb.prototype.rd;lb.prototype.next=lb.prototype.next;lb.prototype.reset=lb.prototype.reset;lb.className=\"SetIterator\";\nfunction G(a){Xa(this);this.v=!1;this.Hb={};this.Fb=0;this.Ha=null;this.Ba=0;this.$e=this.ba=null;void 0!==a&&(\"function\"===typeof a||\"string\"===typeof a?ya():this.addAll(a))}t=G.prototype;t.pb=function(){var a=this.Ba;a++;999999999<a&&(a=0);this.Ba=a};t.freeze=function(){this.v=!0;return this};t.ea=function(){this.v=!1;return this};t.toString=function(){return\"Set()#\"+kb(this)};\nt.add=function(a){if(null===a)return this;this.v&&va(this,a);var b=a;za(a)&&(b=mb(a));void 0===this.Hb[b]&&(this.Fb++,a=new nb(a,a),this.Hb[b]=a,b=this.$e,null===b?this.ba=a:(a.Xl=b,b.pa=a),this.$e=a,this.pb());return this};t.addAll=function(a){if(null===a)return this;this.v&&va(this);if(Aa(a))for(var b=a.length,c=0;c<b;c++)this.add(a[c]);else for(a=a.iterator;a.next();)this.add(a.value);return this};\nt.contains=function(a){if(null===a)return!1;var b=a;return za(a)&&(b=kb(a),void 0===b)?!1:void 0!==this.Hb[b]};t.has=function(a){return this.contains(a)};t.Ez=function(a){if(null===a)return!0;for(a=a.iterator;a.next();)if(!this.contains(a.value))return!1;return!0};t.Fz=function(a){if(null===a)return!0;for(a=a.iterator;a.next();)if(this.contains(a.value))return!0;return!1};t.first=function(){var a=this.ba;return null===a?null:a.value};\nG.prototype.any=function(a){for(var b=this.ba;null!==b;){if(a(b.value))return!0;b=b.pa}return!1};G.prototype.all=function(a){for(var b=this.ba;null!==b;){if(!a(b.value))return!1;b=b.pa}return!0};G.prototype.each=function(a){for(var b=this.ba;null!==b;)a(b.value),b=b.pa;return this};G.prototype.map=function(a){for(var b=new G,c=this.ba;null!==c;)b.add(a(c.value)),c=c.pa;return b};G.prototype.filter=function(a){for(var b=new G,c=this.ba;null!==c;){var d=c.value;a(d)&&b.add(d);c=c.pa}return b};t=G.prototype;\nt.remove=function(a){if(null===a)return!1;this.v&&va(this,a);var b=a;if(za(a)&&(b=kb(a),void 0===b))return!1;a=this.Hb[b];if(void 0===a)return!1;var c=a.pa,d=a.Xl;null!==c&&(c.Xl=d);null!==d&&(d.pa=c);this.ba===a&&(this.ba=c);this.$e===a&&(this.$e=d);delete this.Hb[b];this.Fb--;this.pb();return!0};t.delete=function(a){return this.remove(a)};\nt.Zq=function(a){if(null===a)return this;this.v&&va(this);if(Aa(a))for(var b=a.length,c=0;c<b;c++)this.remove(a[c]);else for(a=a.iterator;a.next();)this.remove(a.value);return this};t.YA=function(a){if(null===a||0===this.count)return this;this.v&&va(this);var b=new G;b.addAll(a);a=[];for(var c=this.iterator;c.next();){var d=c.value;b.contains(d)||a.push(d)}this.Zq(a);return this};t.clear=function(){this.v&&va(this);this.Hb={};this.Fb=0;null!==this.Ha&&this.Ha.reset();this.$e=this.ba=null;this.pb()};\nG.prototype.copy=function(){var a=new G,b=this.Hb,c;for(c in b)a.add(b[c].value);return a};G.prototype.ma=function(){var a=Array(this.Fb),b=this.Hb,c=0,d;for(d in b)a[c]=b[d].value,c++;return a};G.prototype.Kw=function(){var a=new E,b=this.Hb,c;for(c in b)a.add(b[c].value);return a};function Xa(a){a.__gohashid=ob++}function mb(a){var b=a.__gohashid;void 0===b&&(b=ob++,a.__gohashid=b);return b}function kb(a){return a.__gohashid}\nna.Object.defineProperties(G.prototype,{count:{get:function(){return this.Fb}},size:{get:function(){return this.Fb}},iterator:{get:function(){if(0>=this.Fb)return db;var a=this.Ha;return null!==a?(a.reset(),a):new lb(this)}}});G.prototype.toList=G.prototype.Kw;G.prototype.toArray=G.prototype.ma;G.prototype.clear=G.prototype.clear;G.prototype.retainAll=G.prototype.YA;G.prototype.removeAll=G.prototype.Zq;\nG.prototype[\"delete\"]=G.prototype.delete;G.prototype.remove=G.prototype.remove;G.prototype.first=G.prototype.first;G.prototype.containsAny=G.prototype.Fz;G.prototype.containsAll=G.prototype.Ez;G.prototype.has=G.prototype.has;G.prototype.contains=G.prototype.contains;G.prototype.addAll=G.prototype.addAll;G.prototype.add=G.prototype.add;G.prototype.thaw=G.prototype.ea;G.prototype.freeze=G.prototype.freeze;var ob=1;G.className=\"Set\";G.uniqueHash=Xa;G.hashIdUnique=mb;G.hashId=kb;\nfunction pb(a){this.ga=a;this.ia=a.Ba;this.ka=null}pb.prototype.reset=function(){this.ia=this.ga.Ba;this.ka=null};pb.prototype.next=function(){var a=this.ga;if(a.Ba!==this.ia&&null===this.key)return!1;var b=this.ka;b=null===b?a.ba:b.pa;if(null!==b)return this.ka=b,this.value=this.key=a=b.key,!0;this.Sd();return!1};pb.prototype.rd=function(){return this.next()};pb.prototype.first=function(){var a=this.ga;this.ia=a.Ba;a=a.ba;return null!==a?(this.ka=a,this.value=this.key=a=a.key):null};\npb.prototype.any=function(a){var b=this.ga;this.ka=null;for(b=b.ba;null!==b;){if(a(b.key))return!0;b=b.pa}return!1};pb.prototype.all=function(a){var b=this.ga;this.ka=null;for(b=b.ba;null!==b;){if(!a(b.key))return!1;b=b.pa}return!0};pb.prototype.each=function(a){var b=this.ga;this.ka=null;for(b=b.ba;null!==b;)a(b.key),b=b.pa;return this};pb.prototype.map=function(a){var b=this.ga;this.ka=null;var c=new E;for(b=b.ba;null!==b;)c.add(a(b.key)),b=b.pa;return c.iterator};\npb.prototype.filter=function(a){var b=this.ga;this.ka=null;var c=new E;for(b=b.ba;null!==b;){var d=b.key;a(d)&&c.add(d);b=b.pa}return c.iterator};pb.prototype.Sd=function(){this.value=this.key=null;this.ia=-1};pb.prototype.toString=function(){return null!==this.ka?\"MapKeySetIterator@\"+this.ka.value:\"MapKeySetIterator\"};na.Object.defineProperties(pb.prototype,{iterator:{get:function(){return this}},count:{get:function(){return this.ga.Fb}}});\npb.prototype.first=pb.prototype.first;pb.prototype.hasNext=pb.prototype.rd;pb.prototype.next=pb.prototype.next;pb.prototype.reset=pb.prototype.reset;pb.className=\"MapKeySetIterator\";function qb(a){G.call(this);Xa(this);this.v=!0;this.ga=a}ma(qb,G);t=qb.prototype;t.freeze=function(){return this};t.ea=function(){return this};t.toString=function(){return\"MapKeySet(\"+this.ga.toString()+\")\"};t.add=function(){B(\"This Set is read-only: \"+this.toString());return this};t.contains=function(a){return this.ga.contains(a)};\nt.has=function(a){return this.contains(a)};t.remove=function(){B(\"This Set is read-only: \"+this.toString());return!1};t.delete=function(a){return this.remove(a)};t.clear=function(){B(\"This Set is read-only: \"+this.toString())};t.first=function(){var a=this.ga.ba;return null!==a?a.key:null};qb.prototype.any=function(a){for(var b=this.ga.ba;null!==b;){if(a(b.key))return!0;b=b.pa}return!1};qb.prototype.all=function(a){for(var b=this.ga.ba;null!==b;){if(!a(b.key))return!1;b=b.pa}return!0};\nqb.prototype.each=function(a){for(var b=this.ga.ba;null!==b;)a(b.key),b=b.pa;return this};qb.prototype.map=function(a){for(var b=new G,c=this.ga.ba;null!==c;)b.add(a(c.key)),c=c.pa;return b};qb.prototype.filter=function(a){for(var b=new G,c=this.ga.ba;null!==c;){var d=c.key;a(d)&&b.add(d);c=c.pa}return b};qb.prototype.copy=function(){return new qb(this.ga)};qb.prototype.Lw=function(){var a=new G,b=this.ga.Hb,c;for(c in b)a.add(b[c].key);return a};\nqb.prototype.ma=function(){var a=this.ga.Hb,b=Array(this.ga.Fb),c=0,d;for(d in a)b[c]=a[d].key,c++;return b};qb.prototype.Kw=function(){var a=new E,b=this.ga.Hb,c;for(c in b)a.add(b[c].key);return a};na.Object.defineProperties(qb.prototype,{count:{get:function(){return this.ga.Fb}},size:{get:function(){return this.ga.Fb}},iterator:{get:function(){return 0>=this.ga.Fb?db:new pb(this.ga)}}});\nqb.prototype.toList=qb.prototype.Kw;qb.prototype.toArray=qb.prototype.ma;qb.prototype.toSet=qb.prototype.Lw;qb.prototype.first=qb.prototype.first;qb.prototype.clear=qb.prototype.clear;qb.prototype[\"delete\"]=qb.prototype.delete;qb.prototype.remove=qb.prototype.remove;qb.prototype.has=qb.prototype.has;qb.prototype.contains=qb.prototype.contains;qb.prototype.add=qb.prototype.add;qb.prototype.thaw=qb.prototype.ea;qb.prototype.freeze=qb.prototype.freeze;qb.className=\"MapKeySet\";\nfunction rb(a){this.ga=a;a.Ze=null;this.ia=a.Ba;this.ka=null}rb.prototype.reset=function(){var a=this.ga;a.Ze=null;this.ia=a.Ba;this.ka=null};rb.prototype.next=function(){var a=this.ga;if(a.Ba!==this.ia&&null===this.key)return!1;var b=this.ka;b=null===b?a.ba:b.pa;if(null!==b)return this.ka=b,this.value=b.value,this.key=b.key,!0;this.Sd();return!1};rb.prototype.rd=function(){return this.next()};\nrb.prototype.first=function(){var a=this.ga;this.ia=a.Ba;a=a.ba;if(null!==a){this.ka=a;var b=a.value;this.key=a.key;return this.value=b}return null};rb.prototype.any=function(a){var b=this.ga;this.ka=b.Ze=null;for(b=b.ba;null!==b;){if(a(b.value))return!0;b=b.pa}return!1};rb.prototype.all=function(a){var b=this.ga;this.ka=b.Ze=null;for(b=b.ba;null!==b;){if(!a(b.value))return!1;b=b.pa}return!0};rb.prototype.each=function(a){var b=this.ga;this.ka=b.Ze=null;for(b=b.ba;null!==b;)a(b.value),b=b.pa;return this};\nrb.prototype.map=function(a){var b=this.ga;this.ka=b.Ze=null;var c=new E;for(b=b.ba;null!==b;)c.add(a(b.value)),b=b.pa;return c.iterator};rb.prototype.filter=function(a){var b=this.ga;this.ka=b.Ze=null;var c=new E;for(b=b.ba;null!==b;){var d=b.value;a(d)&&c.add(d);b=b.pa}return c.iterator};rb.prototype.Sd=function(){this.value=this.key=null;this.ia=-1;this.ga.Ze=this};rb.prototype.toString=function(){return null!==this.ka?\"MapValueSetIterator@\"+this.ka.value:\"MapValueSetIterator\"};\nna.Object.defineProperties(rb.prototype,{iterator:{get:function(){return this}},count:{get:function(){return this.ga.Fb}}});rb.prototype.first=rb.prototype.first;rb.prototype.hasNext=rb.prototype.rd;rb.prototype.next=rb.prototype.next;rb.prototype.reset=rb.prototype.reset;rb.className=\"MapValueSetIterator\";function nb(a,b){this.key=a;this.value=b;this.Xl=this.pa=null}nb.prototype.toString=function(){return\"{\"+this.key+\":\"+this.value+\"}\"};\nnb.className=\"KeyValuePair\";function sb(a){this.ga=a;a.Ha=null;this.ia=a.Ba;this.ka=null}sb.prototype.reset=function(){var a=this.ga;a.Ha=null;this.ia=a.Ba;this.ka=null};sb.prototype.next=function(){var a=this.ga;if(a.Ba!==this.ia&&null===this.key)return!1;var b=this.ka;b=null===b?a.ba:b.pa;if(null!==b)return this.ka=b,this.key=b.key,this.value=b.value,!0;this.Sd();return!1};sb.prototype.rd=function(){return this.next()};\nsb.prototype.first=function(){var a=this.ga;this.ia=a.Ba;a=a.ba;return null!==a?(this.ka=a,this.key=a.key,this.value=a.value,a):null};sb.prototype.any=function(a){var b=this.ga;this.ka=b.Ha=null;for(b=b.ba;null!==b;){if(a(b))return!0;b=b.pa}return!1};sb.prototype.all=function(a){var b=this.ga;this.ka=b.Ha=null;for(b=b.ba;null!==b;){if(!a(b))return!1;b=b.pa}return!0};sb.prototype.each=function(a){var b=this.ga;this.ka=b.Ha=null;for(b=b.ba;null!==b;)a(b),b=b.pa;return this};\nsb.prototype.map=function(a){var b=this.ga;this.ka=b.Ha=null;var c=new E;for(b=b.ba;null!==b;)c.add(a(b)),b=b.pa;return c.iterator};sb.prototype.filter=function(a){var b=this.ga;this.ka=b.Ha=null;var c=new E;for(b=b.ba;null!==b;)a(b)&&c.add(b),b=b.pa;return c.iterator};sb.prototype.Sd=function(){this.value=this.key=null;this.ia=-1;this.ga.Ha=this};sb.prototype.toString=function(){return null!==this.ka?\"MapIterator@\"+this.ka:\"MapIterator\"};\nna.Object.defineProperties(sb.prototype,{iterator:{get:function(){return this}},count:{get:function(){return this.ga.Fb}}});sb.prototype.first=sb.prototype.first;sb.prototype.hasNext=sb.prototype.rd;sb.prototype.next=sb.prototype.next;sb.prototype.reset=sb.prototype.reset;sb.className=\"MapIterator\";\nfunction H(a){Xa(this);this.v=!1;this.Hb={};this.Fb=0;this.Ze=this.Ha=null;this.Ba=0;this.$e=this.ba=null;void 0!==a&&(\"function\"===typeof a||\"string\"===typeof a?ya():this.addAll(a))}t=H.prototype;t.pb=function(){var a=this.Ba;a++;999999999<a&&(a=0);this.Ba=a};t.freeze=function(){this.v=!0;return this};t.ea=function(){this.v=!1;return this};t.toString=function(){return\"Map()#\"+kb(this)};\nt.add=function(a,b){this.v&&va(this,a);var c=a;za(a)&&(c=mb(a));var d=this.Hb[c];void 0===d?(this.Fb++,a=new nb(a,b),this.Hb[c]=a,c=this.$e,null===c?this.ba=a:(a.Xl=c,c.pa=a),this.$e=a,this.pb()):d.value=b;return this};t.set=function(a,b){return this.add(a,b)};\nt.addAll=function(a){if(null===a)return this;if(Aa(a))for(var b=a.length,c=0;c<b;c++){var d=a[c];this.add(d.key,d.value)}else if(a instanceof H)for(a=a.iterator;a.next();)this.add(a.key,a.value);else for(a=a.iterator;a.next();)b=a.value,this.add(b.key,b.value);return this};t.first=function(){return this.ba};H.prototype.any=function(a){for(var b=this.ba;null!==b;){if(a(b))return!0;b=b.pa}return!1};H.prototype.all=function(a){for(var b=this.ba;null!==b;){if(!a(b))return!1;b=b.pa}return!0};\nH.prototype.each=function(a){for(var b=this.ba;null!==b;)a(b),b=b.pa;return this};H.prototype.map=function(a){for(var b=new H,c=this.ba;null!==c;)b.add(c.key,a(c)),c=c.pa;return b};H.prototype.filter=function(a){for(var b=new H,c=this.ba;null!==c;)a(c)&&b.add(c.key,c.value),c=c.pa;return b};t=H.prototype;t.contains=function(a){var b=a;return za(a)&&(b=kb(a),void 0===b)?!1:void 0!==this.Hb[b]};t.has=function(a){return this.contains(a)};\nt.G=function(a){var b=a;if(za(a)&&(b=kb(a),void 0===b))return null;a=this.Hb[b];return void 0===a?null:a.value};t.get=function(a){return this.G(a)};t.remove=function(a){if(null===a)return!1;this.v&&va(this,a);var b=a;if(za(a)&&(b=kb(a),void 0===b))return!1;a=this.Hb[b];if(void 0===a)return!1;var c=a.pa,d=a.Xl;null!==c&&(c.Xl=d);null!==d&&(d.pa=c);this.ba===a&&(this.ba=c);this.$e===a&&(this.$e=d);delete this.Hb[b];this.Fb--;this.pb();return!0};t.delete=function(a){return this.remove(a)};\nt.clear=function(){this.v&&va(this);this.Hb={};this.Fb=0;null!==this.Ha&&this.Ha.reset();null!==this.Ze&&this.Ze.reset();this.$e=this.ba=null;this.pb()};H.prototype.copy=function(){var a=new H,b=this.Hb,c;for(c in b){var d=b[c];a.add(d.key,d.value)}return a};H.prototype.ma=function(){var a=this.Hb,b=Array(this.Fb),c=0,d;for(d in a){var e=a[d];b[c]=new nb(e.key,e.value);c++}return b};H.prototype.Kf=function(){return new qb(this)};\nna.Object.defineProperties(H.prototype,{count:{get:function(){return this.Fb}},size:{get:function(){return this.Fb}},iterator:{get:function(){if(0>=this.count)return db;var a=this.Ha;return null!==a?(a.reset(),a):new sb(this)}},iteratorKeys:{get:function(){return 0>=this.count?db:new pb(this)}},iteratorValues:{get:function(){if(0>=this.count)return db;\nvar a=this.Ze;return null!==a?(a.reset(),a):new rb(this)}}});H.prototype.toKeySet=H.prototype.Kf;H.prototype.toArray=H.prototype.ma;H.prototype.clear=H.prototype.clear;H.prototype[\"delete\"]=H.prototype.delete;H.prototype.remove=H.prototype.remove;H.prototype.get=H.prototype.get;H.prototype.getValue=H.prototype.G;H.prototype.has=H.prototype.has;H.prototype.contains=H.prototype.contains;H.prototype.first=H.prototype.first;H.prototype.addAll=H.prototype.addAll;H.prototype.set=H.prototype.set;\nH.prototype.add=H.prototype.add;H.prototype.thaw=H.prototype.ea;H.prototype.freeze=H.prototype.freeze;H.className=\"Map\";function J(a,b){void 0===a?this.y=this.x=0:\"number\"===typeof a&&\"number\"===typeof b?(this.x=a,this.y=b):B(\"Invalid arguments to Point constructor: \"+a+\", \"+b);this.v=!1}J.prototype.assign=function(a){this.x=a.x;this.y=a.y;return this};J.prototype.h=function(a,b){this.x=a;this.y=b;return this};J.prototype.Ig=function(a,b){this.x=a;this.y=b;return this};\nJ.prototype.set=function(a){this.x=a.x;this.y=a.y;return this};J.prototype.copy=function(){var a=new J;a.x=this.x;a.y=this.y;return a};t=J.prototype;t.ca=function(){this.v=!0;Object.freeze(this);return this};t.H=function(){return this.v||Object.isFrozen(this)?this:this.copy().freeze()};t.freeze=function(){this.v=!0;return this};t.ea=function(){Object.isFrozen(this)&&B(\"cannot thaw constant: \"+this);this.v=!1;return this};\nfunction tb(a){if(\"string\"===typeof a){a=a.split(\" \");for(var b=0,c=0;\"\"===a[b];)b++;var d=a[b++];d&&(c=parseFloat(d));for(var e=0;\"\"===a[b];)b++;(d=a[b++])&&(e=parseFloat(d));return new J(c,e)}return new J}function ub(a){return a.x.toString()+\" \"+a.y.toString()}t.toString=function(){return\"Point(\"+this.x+\",\"+this.y+\")\"};t.w=function(a){return a instanceof J?this.x===a.x&&this.y===a.y:!1};t.fj=function(a,b){return this.x===a&&this.y===b};t.Qa=function(a){return L.A(this.x,a.x)&&L.A(this.y,a.y)};\nt.add=function(a){this.x+=a.x;this.y+=a.y;return this};t.ge=function(a){this.x-=a.x;this.y-=a.y;return this};t.offset=function(a,b){this.x+=a;this.y+=b;return this};J.prototype.rotate=function(a){if(0===a)return this;var b=this.x,c=this.y;if(0===b&&0===c)return this;360<=a?a-=360:0>a&&(a+=360);if(90===a){a=0;var d=1}else 180===a?(a=-1,d=0):270===a?(a=0,d=-1):(d=a*Math.PI/180,a=Math.cos(d),d=Math.sin(d));this.x=a*b-d*c;this.y=d*b+a*c;return this};t=J.prototype;\nt.scale=function(a,b){this.x*=a;this.y*=b;return this};t.Ie=function(a){var b=a.x-this.x;a=a.y-this.y;return b*b+a*a};t.qd=function(a,b){a-=this.x;b-=this.y;return a*a+b*b};t.normalize=function(){var a=this.x,b=this.y,c=Math.sqrt(a*a+b*b);0<c&&(this.x=a/c,this.y=b/c);return this};t.Pa=function(a){return vb(a.x-this.x,a.y-this.y)};t.direction=function(a,b){return vb(a-this.x,b-this.y)};\nfunction vb(a,b){if(0===a)return 0<b?90:0>b?270:0;if(0===b)return 0<a?0:180;if(isNaN(a)||isNaN(b))return 0;var c=180*Math.atan(Math.abs(b/a))/Math.PI;0>a?c=0>b?c+180:180-c:0>b&&(c=360-c);return c}t.OA=function(a,b,c,d){L.Qh(a,b,c,d,this.x,this.y,this);return this};t.PA=function(a,b){L.Qh(a.x,a.y,b.x,b.y,this.x,this.y,this);return this};t.cB=function(a,b,c,d){L.Gq(this.x,this.y,a,b,c,d,this);return this};t.dB=function(a,b){L.Gq(this.x,this.y,a.x,a.y,b.width,b.height,this);return this};\nt.tj=function(a,b){this.x=a.x+b.x*a.width+b.offsetX;this.y=a.y+b.y*a.height+b.offsetY;return this};t.Uk=function(a,b,c,d,e){this.x=a+e.x*c+e.offsetX;this.y=b+e.y*d+e.offsetY;return this};t.transform=function(a){a.ta(this);return this};function wb(a,b){b.Jd(a);return a}function xb(a,b,c,d,e,f){var g=e-c,h=f-d,k=g*g+h*h;c-=a;d-=b;var l=-c*g-d*h;if(0>=l||l>=k)return g=e-a,h=f-b,Math.min(c*c+d*d,g*g+h*h);a=g*d-h*c;return a*a/k}function yb(a,b,c,d){a=c-a;b=d-b;return a*a+b*b}\nfunction zb(a,b,c,d){a=c-a;b=d-b;if(0===a)return 0<b?90:0>b?270:0;if(0===b)return 0<a?0:180;if(isNaN(a)||isNaN(b))return 0;d=180*Math.atan(Math.abs(b/a))/Math.PI;0>a?d=0>b?d+180:180-d:0>b&&(d=360-d);return d}t.s=function(){return isFinite(this.x)&&isFinite(this.y)};J.alloc=function(){var a=Ab.pop();return void 0===a?new J:a};J.allocAt=function(a,b){var c=Ab.pop();if(void 0===c)return new J(a,b);c.x=a;c.y=b;return c};J.free=function(a){Ab.push(a)};J.prototype.isReal=J.prototype.s;\nJ.prototype.setSpot=J.prototype.Uk;J.prototype.setRectSpot=J.prototype.tj;J.prototype.snapToGridPoint=J.prototype.dB;J.prototype.snapToGrid=J.prototype.cB;J.prototype.projectOntoLineSegmentPoint=J.prototype.PA;J.prototype.projectOntoLineSegment=J.prototype.OA;J.intersectingLineSegments=function(a,b,c,d,e,f,g,h){return L.Cm(a,b,c,d,e,f,g,h)};J.prototype.direction=J.prototype.direction;J.prototype.directionPoint=J.prototype.Pa;J.prototype.normalize=J.prototype.normalize;\nJ.prototype.distanceSquared=J.prototype.qd;J.prototype.distanceSquaredPoint=J.prototype.Ie;J.prototype.scale=J.prototype.scale;J.prototype.rotate=J.prototype.rotate;J.prototype.offset=J.prototype.offset;J.prototype.subtract=J.prototype.ge;J.prototype.add=J.prototype.add;J.prototype.equalsApprox=J.prototype.Qa;J.prototype.equalTo=J.prototype.fj;J.prototype.equals=J.prototype.w;J.prototype.set=J.prototype.set;J.prototype.setTo=J.prototype.Ig;var Bb=null,Cb=null,Fb=null,Gb=null,Hb=null,Ab=[];\nJ.className=\"Point\";J.parse=tb;J.stringify=ub;J.distanceLineSegmentSquared=xb;J.distanceSquared=yb;J.direction=zb;J.Origin=Bb=(new J(0,0)).ca();J.InfiniteTopLeft=Cb=(new J(-Infinity,-Infinity)).ca();J.InfiniteBottomRight=Fb=(new J(Infinity,Infinity)).ca();J.SixPoint=Gb=(new J(6,6)).ca();J.NoPoint=Hb=(new J(NaN,NaN)).ca();J.parse=tb;J.stringify=ub;J.distanceLineSegmentSquared=xb;J.distanceSquared=yb;J.direction=zb;\nfunction M(a,b){void 0===a?this.height=this.width=0:\"number\"===typeof a&&(0<=a||isNaN(a))&&\"number\"===typeof b&&(0<=b||isNaN(b))?(this.width=a,this.height=b):B(\"Invalid arguments to Size constructor: \"+a+\", \"+b);this.v=!1}var Ib,Jb,Kb,Lb,Mb,Nb,Ob;M.prototype.assign=function(a){this.width=a.width;this.height=a.height;return this};M.prototype.h=function(a,b){this.width=a;this.height=b;return this};M.prototype.Ig=function(a,b){this.width=a;this.height=b;return this};\nM.prototype.set=function(a){this.width=a.width;this.height=a.height;return this};M.prototype.copy=function(){var a=new M;a.width=this.width;a.height=this.height;return a};t=M.prototype;t.ca=function(){this.v=!0;Object.freeze(this);return this};t.H=function(){return this.v||Object.isFrozen(this)?this:this.copy().freeze()};t.freeze=function(){this.v=!0;return this};t.ea=function(){Object.isFrozen(this)&&B(\"cannot thaw constant: \"+this);this.v=!1;return this};\nfunction Pb(a){if(\"string\"===typeof a){a=a.split(\" \");for(var b=0,c=0;\"\"===a[b];)b++;var d=a[b++];d&&(c=parseFloat(d));for(var e=0;\"\"===a[b];)b++;(d=a[b++])&&(e=parseFloat(d));return new M(c,e)}return new M}function Qb(a){return a.width.toString()+\" \"+a.height.toString()}t.toString=function(){return\"Size(\"+this.width+\",\"+this.height+\")\"};t.w=function(a){return a instanceof M?this.width===a.width&&this.height===a.height:!1};t.fj=function(a,b){return this.width===a&&this.height===b};\nt.Qa=function(a){return L.A(this.width,a.width)&&L.A(this.height,a.height)};t.s=function(){return isFinite(this.width)&&isFinite(this.height)};M.alloc=function(){var a=Rb.pop();return void 0===a?new M:a};M.free=function(a){Rb.push(a)};M.prototype.isReal=M.prototype.s;M.prototype.equalsApprox=M.prototype.Qa;M.prototype.equalTo=M.prototype.fj;M.prototype.equals=M.prototype.w;M.prototype.set=M.prototype.set;M.prototype.setTo=M.prototype.Ig;var Rb=[];M.className=\"Size\";M.parse=Pb;M.stringify=Qb;\nM.ZeroSize=Ib=(new M(0,0)).ca();M.OneSize=Jb=(new M(1,1)).ca();M.SixSize=Kb=(new M(6,6)).ca();M.EightSize=Lb=(new M(8,8)).ca();M.TenSize=Mb=(new M(10,10)).ca();M.InfiniteSize=Nb=(new M(Infinity,Infinity)).ca();M.NoSize=Ob=(new M(NaN,NaN)).ca();M.parse=Pb;M.stringify=Qb;\nfunction N(a,b,c,d){void 0===a?this.height=this.width=this.y=this.x=0:a instanceof J?(c=a.x,a=a.y,b instanceof J?(d=b.x,b=b.y,this.x=Math.min(c,d),this.y=Math.min(a,b),this.width=Math.abs(c-d),this.height=Math.abs(a-b)):b instanceof M?(this.x=c,this.y=a,this.width=b.width,this.height=b.height):B(\"Incorrect arguments supplied to Rect constructor\")):\"number\"===typeof a&&\"number\"===typeof b&&\"number\"===typeof c&&(0<=c||isNaN(c))&&\"number\"===typeof d&&(0<=d||isNaN(d))?(this.x=a,this.y=b,this.width=c,\nthis.height=d):B(\"Invalid arguments to Rect constructor: \"+a+\", \"+b+\", \"+c+\", \"+d);this.v=!1}t=N.prototype;t.assign=function(a){this.x=a.x;this.y=a.y;this.width=a.width;this.height=a.height;return this};t.h=function(a,b,c,d){this.x=a;this.y=b;this.width=c;this.height=d;return this};function Sb(a,b,c){a.width=b;a.height=c}t.Ig=function(a,b,c,d){this.x=a;this.y=b;this.width=c;this.height=d;return this};t.set=function(a){this.x=a.x;this.y=a.y;this.width=a.width;this.height=a.height;return this};\nt.Qc=function(a){this.x=a.x;this.y=a.y;return this};t.bB=function(a){this.width=a.width;this.height=a.height;return this};N.prototype.copy=function(){var a=new N;a.x=this.x;a.y=this.y;a.width=this.width;a.height=this.height;return a};t=N.prototype;t.ca=function(){this.v=!0;Object.freeze(this);return this};t.H=function(){return this.v||Object.isFrozen(this)?this:this.copy().freeze()};t.freeze=function(){this.v=!0;return this};\nt.ea=function(){Object.isFrozen(this)&&B(\"cannot thaw constant: \"+this);this.v=!1;return this};function Tb(a){if(\"string\"===typeof a){a=a.split(\" \");for(var b=0,c=0;\"\"===a[b];)b++;var d=a[b++];d&&(c=parseFloat(d));for(var e=0;\"\"===a[b];)b++;(d=a[b++])&&(e=parseFloat(d));for(var f=0;\"\"===a[b];)b++;(d=a[b++])&&(f=parseFloat(d));for(var g=0;\"\"===a[b];)b++;(d=a[b++])&&(g=parseFloat(d));return new N(c,e,f,g)}return new N}\nfunction Ub(a){return a.x.toString()+\" \"+a.y.toString()+\" \"+a.width.toString()+\" \"+a.height.toString()}t.toString=function(){return\"Rect(\"+this.x+\",\"+this.y+\",\"+this.width+\",\"+this.height+\")\"};t.w=function(a){return a instanceof N?this.x===a.x&&this.y===a.y&&this.width===a.width&&this.height===a.height:!1};t.fj=function(a,b,c,d){return this.x===a&&this.y===b&&this.width===c&&this.height===d};t.Qa=function(a){return L.A(this.x,a.x)&&L.A(this.y,a.y)&&L.A(this.width,a.width)&&L.A(this.height,a.height)};\nfunction Vb(a,b){return L.aa(a.x,b.x)&&L.aa(a.y,b.y)&&L.aa(a.width,b.width)&&L.aa(a.height,b.height)}t.$=function(a){return this.x<=a.x&&this.x+this.width>=a.x&&this.y<=a.y&&this.y+this.height>=a.y};t.Ge=function(a){return this.x<=a.x&&a.x+a.width<=this.x+this.width&&this.y<=a.y&&a.y+a.height<=this.y+this.height};t.contains=function(a,b,c,d){void 0===c&&(c=0);void 0===d&&(d=0);return this.x<=a&&a+c<=this.x+this.width&&this.y<=b&&b+d<=this.y+this.height};\nt.offset=function(a,b){this.x+=a;this.y+=b;return this};t.Jc=function(a,b){return Wb(this,b,a,b,a)};t.uq=function(a){return Wb(this,a.top,a.right,a.bottom,a.left)};t.Jw=function(a){return Wb(this,-a.top,-a.right,-a.bottom,-a.left)};t.sA=function(a,b,c,d){return Wb(this,a,b,c,d)};function Wb(a,b,c,d,e){var f=a.width;c+e<=-f?(a.x+=f/2,a.width=0):(a.x-=e,a.width+=c+e);c=a.height;b+d<=-c?(a.y+=c/2,a.height=0):(a.y-=b,a.height+=b+d);return a}t.Dy=function(a){return $b(this,a.x,a.y,a.width,a.height)};\nt.bw=function(a,b,c,d){return $b(this,a,b,c,d)};function $b(a,b,c,d,e){var f=Math.max(a.x,b),g=Math.max(a.y,c);b=Math.min(a.x+a.width,b+d);c=Math.min(a.y+a.height,c+e);a.x=f;a.y=g;a.width=Math.max(0,b-f);a.height=Math.max(0,c-g);return a}t.Mc=function(a){return this.cw(a.x,a.y,a.width,a.height)};\nt.cw=function(a,b,c,d){var e=this.width,f=this.x;if(Infinity!==e&&Infinity!==c&&(e+=f,c+=a,isNaN(c)||isNaN(e)||f>c||a>e))return!1;a=this.height;c=this.y;return Infinity!==a&&Infinity!==d&&(a+=c,d+=b,isNaN(d)||isNaN(a)||c>d||b>a)?!1:!0};function ac(a,b){var c=a.width,d=a.x,e=b.x-10;if(d>b.width+10+10+e||e>c+d)return!1;c=a.height;a=a.y;d=b.y-10;return a>b.height+10+10+d||d>c+a?!1:!0}t.Oe=function(a){return bc(this,a.x,a.y,0,0)};t.Rc=function(a){return bc(this,a.x,a.y,a.width,a.height)};\nt.Rw=function(a,b,c,d){void 0===c&&(c=0);void 0===d&&(d=0);return bc(this,a,b,c,d)};function bc(a,b,c,d,e){var f=Math.min(a.x,b),g=Math.min(a.y,c);b=Math.max(a.x+a.width,b+d);c=Math.max(a.y+a.height,c+e);a.x=f;a.y=g;a.width=b-f;a.height=c-g;return a}t.Uk=function(a,b,c){this.x=a-c.offsetX-c.x*this.width;this.y=b-c.offsetY-c.y*this.height;return this};function cc(a,b,c,d,e,f,g,h){void 0===g&&(g=0);void 0===h&&(h=0);return a<=e&&e+g<=a+c&&b<=f&&f+h<=b+d}\nfunction dc(a,b,c,d,e,f,g,h){return a>g+e||e>c+a?!1:b>h+f||f>d+b?!1:!0}t.s=function(){return isFinite(this.x)&&isFinite(this.y)&&isFinite(this.width)&&isFinite(this.height)};t.yA=function(){return 0===this.width&&0===this.height};N.alloc=function(){var a=hc.pop();return void 0===a?new N:a};N.allocAt=function(a,b,c,d){var e=hc.pop();return void 0===e?new N(a,b,c,d):e.h(a,b,c,d)};N.free=function(a){hc.push(a)};\nna.Object.defineProperties(N.prototype,{left:{get:function(){return this.x},set:function(a){this.x=a}},top:{get:function(){return this.y},set:function(a){this.y=a}},right:{get:function(){return this.x+this.width},set:function(a){this.x+=a-(this.x+this.width)}},bottom:{get:function(){return this.y+this.height},set:function(a){this.y+=a-(this.y+this.height)}},position:{\nget:function(){return new J(this.x,this.y)},set:function(a){this.x=a.x;this.y=a.y}},size:{get:function(){return new M(this.width,this.height)},set:function(a){this.width=a.width;this.height=a.height}},center:{get:function(){return new J(this.x+this.width/2,this.y+this.height/2)},set:function(a){this.x=a.x-this.width/2;this.y=a.y-this.height/2}},centerX:{get:function(){return this.x+this.width/2},\nset:function(a){this.x=a-this.width/2}},centerY:{get:function(){return this.y+this.height/2},set:function(a){this.y=a-this.height/2}}});N.prototype.isEmpty=N.prototype.yA;N.prototype.isReal=N.prototype.s;N.intersectsLineSegment=function(a,b,c,d,e,f,g,h){return L.Ey(a,b,c,d,e,f,g,h)};N.prototype.setSpot=N.prototype.Uk;N.prototype.union=N.prototype.Rw;N.prototype.unionRect=N.prototype.Rc;N.prototype.unionPoint=N.prototype.Oe;N.prototype.intersects=N.prototype.cw;\nN.prototype.intersectsRect=N.prototype.Mc;N.prototype.intersect=N.prototype.bw;N.prototype.intersectRect=N.prototype.Dy;N.prototype.grow=N.prototype.sA;N.prototype.subtractMargin=N.prototype.Jw;N.prototype.addMargin=N.prototype.uq;N.prototype.inflate=N.prototype.Jc;N.prototype.offset=N.prototype.offset;N.prototype.contains=N.prototype.contains;N.prototype.containsRect=N.prototype.Ge;N.prototype.containsPoint=N.prototype.$;N.prototype.equalsApprox=N.prototype.Qa;N.prototype.equalTo=N.prototype.fj;\nN.prototype.equals=N.prototype.w;N.prototype.setSize=N.prototype.bB;N.prototype.setPoint=N.prototype.Qc;N.prototype.set=N.prototype.set;N.prototype.setTo=N.prototype.Ig;var ic=null,jc=null,hc=[];N.className=\"Rect\";N.parse=Tb;N.stringify=Ub;N.contains=cc;N.intersects=dc;N.ZeroRect=ic=(new N(0,0,0,0)).ca();N.NoRect=jc=(new N(NaN,NaN,NaN,NaN)).ca();N.parse=Tb;N.stringify=Ub;N.contains=cc;N.intersects=dc;\nfunction kc(a,b,c,d){void 0===a?this.left=this.bottom=this.right=this.top=0:void 0===b?this.left=this.bottom=this.right=this.top=a:void 0===c?(this.top=a,this.right=b,this.bottom=a,this.left=b):void 0!==d?(this.top=a,this.right=b,this.bottom=c,this.left=d):B(\"Invalid arguments to Margin constructor: \"+a+\", \"+b+\", \"+c+\", \"+d);this.v=!1}kc.prototype.assign=function(a){this.top=a.top;this.right=a.right;this.bottom=a.bottom;this.left=a.left;return this};\nkc.prototype.Ig=function(a,b,c,d){this.top=a;this.right=b;this.bottom=c;this.left=d;return this};kc.prototype.set=function(a){this.top=a.top;this.right=a.right;this.bottom=a.bottom;this.left=a.left;return this};kc.prototype.copy=function(){var a=new kc;a.top=this.top;a.right=this.right;a.bottom=this.bottom;a.left=this.left;return a};t=kc.prototype;t.ca=function(){this.v=!0;Object.freeze(this);return this};t.H=function(){return this.v||Object.isFrozen(this)?this:this.copy().freeze()};\nt.freeze=function(){this.v=!0;return this};t.ea=function(){Object.isFrozen(this)&&B(\"cannot thaw constant: \"+this);this.v=!1;return this};\nfunction lc(a){if(\"string\"===typeof a){a=a.split(\" \");for(var b=0,c=NaN;\"\"===a[b];)b++;var d=a[b++];d&&(c=parseFloat(d));if(isNaN(c))return new kc;for(var e=NaN;\"\"===a[b];)b++;(d=a[b++])&&(e=parseFloat(d));if(isNaN(e))return new kc(c);for(var f=NaN;\"\"===a[b];)b++;(d=a[b++])&&(f=parseFloat(d));if(isNaN(f))return new kc(c,e);for(var g=NaN;\"\"===a[b];)b++;(d=a[b++])&&(g=parseFloat(d));return isNaN(g)?new kc(c,e):new kc(c,e,f,g)}return new kc}\nfunction mc(a){return a.top.toString()+\" \"+a.right.toString()+\" \"+a.bottom.toString()+\" \"+a.left.toString()}t.toString=function(){return\"Margin(\"+this.top+\",\"+this.right+\",\"+this.bottom+\",\"+this.left+\")\"};t.w=function(a){return a instanceof kc?this.top===a.top&&this.right===a.right&&this.bottom===a.bottom&&this.left===a.left:!1};t.fj=function(a,b,c,d){return this.top===a&&this.right===b&&this.bottom===c&&this.left===d};\nt.Qa=function(a){return L.A(this.top,a.top)&&L.A(this.right,a.right)&&L.A(this.bottom,a.bottom)&&L.A(this.left,a.left)};t.s=function(){return isFinite(this.top)&&isFinite(this.right)&&isFinite(this.bottom)&&isFinite(this.left)};kc.alloc=function(){var a=pc.pop();return void 0===a?new kc:a};kc.free=function(a){pc.push(a)};kc.prototype.isReal=kc.prototype.s;kc.prototype.equalsApprox=kc.prototype.Qa;kc.prototype.equalTo=kc.prototype.fj;kc.prototype.equals=kc.prototype.w;kc.prototype.set=kc.prototype.set;\nkc.prototype.setTo=kc.prototype.Ig;var qc=null,rc=null,pc=[];kc.className=\"Margin\";kc.parse=lc;kc.stringify=mc;kc.ZeroMargin=qc=(new kc(0,0,0,0)).ca();kc.TwoMargin=rc=(new kc(2,2,2,2)).ca();kc.parse=lc;kc.stringify=mc;function O(a,b,c,d){void 0===a?this.offsetY=this.offsetX=this.y=this.x=0:(void 0===b&&(b=0),void 0===c&&(c=0),void 0===d&&(d=0),this.x=a,this.y=b,this.offsetX=c,this.offsetY=d);this.v=!1}\nvar sc,tc,uc,vc,yc,zc,Ac,Bc,Cc,Dc,Ec,Gc,Hc,Ic,Jc,Kc,Lc,Mc,Nc,Oc,Qc,Rc,Sc,Tc,Uc,Vc,Wc,Zc,$c,ad,bd,cd,dd,ed,fd,gd;O.prototype.assign=function(a){this.x=a.x;this.y=a.y;this.offsetX=a.offsetX;this.offsetY=a.offsetY;return this};O.prototype.Ig=function(a,b,c,d){this.x=a;this.y=b;this.offsetX=c;this.offsetY=d;return this};O.prototype.set=function(a){this.x=a.x;this.y=a.y;this.offsetX=a.offsetX;this.offsetY=a.offsetY;return this};\nO.prototype.copy=function(){var a=new O;a.x=this.x;a.y=this.y;a.offsetX=this.offsetX;a.offsetY=this.offsetY;return a};t=O.prototype;t.ca=function(){this.v=!0;Object.freeze(this);return this};t.H=function(){return this.v||Object.isFrozen(this)?this:this.copy().freeze()};t.freeze=function(){this.v=!0;return this};t.ea=function(){Object.isFrozen(this)&&B(\"cannot thaw constant: \"+this);this.v=!1;return this};function hd(a,b){a.x=NaN;a.y=NaN;a.offsetX=b;return a}\nfunction id(a){if(\"string\"===typeof a){a=a.trim();if(\"None\"===a)return sc;if(\"TopLeft\"===a)return tc;if(\"Top\"===a||\"TopCenter\"===a||\"MiddleTop\"===a)return uc;if(\"TopRight\"===a)return vc;if(\"Left\"===a||\"LeftCenter\"===a||\"MiddleLeft\"===a)return yc;if(\"Center\"===a)return zc;if(\"Right\"===a||\"RightCenter\"===a||\"MiddleRight\"===a)return Ac;if(\"BottomLeft\"===a)return Bc;if(\"Bottom\"===a||\"BottomCenter\"===a||\"MiddleBottom\"===a)return Cc;if(\"BottomRight\"===a)return Dc;if(\"TopSide\"===a)return Ec;if(\"LeftSide\"===\na)return Gc;if(\"RightSide\"===a)return Hc;if(\"BottomSide\"===a)return Ic;if(\"TopBottomSides\"===a)return Jc;if(\"LeftRightSides\"===a)return Kc;if(\"TopLeftSides\"===a)return Lc;if(\"TopRightSides\"===a)return Mc;if(\"BottomLeftSides\"===a)return Nc;if(\"BottomRightSides\"===a)return Oc;if(\"NotTopSide\"===a)return Qc;if(\"NotLeftSide\"===a)return Rc;if(\"NotRightSide\"===a)return Sc;if(\"NotBottomSide\"===a)return Tc;if(\"AllSides\"===a)return Uc;if(\"Default\"===a)return Vc;a=a.split(\" \");for(var b=0,c=0;\"\"===a[b];)b++;\nvar d=a[b++];void 0!==d&&0<d.length&&(c=parseFloat(d));for(var e=0;\"\"===a[b];)b++;d=a[b++];void 0!==d&&0<d.length&&(e=parseFloat(d));for(var f=0;\"\"===a[b];)b++;d=a[b++];void 0!==d&&0<d.length&&(f=parseFloat(d));for(var g=0;\"\"===a[b];)b++;d=a[b++];void 0!==d&&0<d.length&&(g=parseFloat(d));return new O(c,e,f,g)}return new O}function jd(a){return a.kb()?a.x.toString()+\" \"+a.y.toString()+\" \"+a.offsetX.toString()+\" \"+a.offsetY.toString():a.toString()}\nt.toString=function(){return this.kb()?0===this.offsetX&&0===this.offsetY?\"Spot(\"+this.x+\",\"+this.y+\")\":\"Spot(\"+this.x+\",\"+this.y+\",\"+this.offsetX+\",\"+this.offsetY+\")\":this.w(sc)?\"None\":this.w(tc)?\"TopLeft\":this.w(uc)?\"Top\":this.w(vc)?\"TopRight\":this.w(yc)?\"Left\":this.w(zc)?\"Center\":this.w(Ac)?\"Right\":this.w(Bc)?\"BottomLeft\":this.w(Cc)?\"Bottom\":this.w(Dc)?\"BottomRight\":this.w(Ec)?\"TopSide\":this.w(Gc)?\"LeftSide\":this.w(Hc)?\"RightSide\":this.w(Ic)?\"BottomSide\":this.w(Jc)?\"TopBottomSides\":this.w(Kc)?\n\"LeftRightSides\":this.w(Lc)?\"TopLeftSides\":this.w(Mc)?\"TopRightSides\":this.w(Nc)?\"BottomLeftSides\":this.w(Oc)?\"BottomRightSides\":this.w(Qc)?\"NotTopSide\":this.w(Rc)?\"NotLeftSide\":this.w(Sc)?\"NotRightSide\":this.w(Tc)?\"NotBottomSide\":this.w(Uc)?\"AllSides\":this.w(Vc)?\"Default\":\"None\"};t.w=function(a){return a instanceof O?(this.x===a.x||isNaN(this.x)&&isNaN(a.x))&&(this.y===a.y||isNaN(this.y)&&isNaN(a.y))&&this.offsetX===a.offsetX&&this.offsetY===a.offsetY:!1};\nt.mw=function(){return new O(.5-(this.x-.5),.5-(this.y-.5),-this.offsetX,-this.offsetY)};t.Ef=function(a){if(!this.Oc())return!1;if(!a.Oc())if(a.w(Wc))a=Gc;else if(a.w(Zc))a=Hc;else if(a.w($c))a=Ec;else if(a.w(ad))a=Ic;else return!1;a=a.offsetY;return(this.offsetY&a)===a};t.kb=function(){return!isNaN(this.x)&&!isNaN(this.y)};t.nc=function(){return isNaN(this.x)||isNaN(this.y)};t.Oc=function(){return isNaN(this.x)&&isNaN(this.y)&&1===this.offsetX&&0!==this.offsetY};\nt.Vt=function(){return isNaN(this.x)&&isNaN(this.y)&&0===this.offsetX&&0===this.offsetY};t.Mb=function(){return isNaN(this.x)&&isNaN(this.y)&&-1===this.offsetX&&0===this.offsetY};O.alloc=function(){var a=kd.pop();return void 0===a?new O:a};O.free=function(a){kd.push(a)};O.prototype.isDefault=O.prototype.Mb;O.prototype.isNone=O.prototype.Vt;O.prototype.isSide=O.prototype.Oc;O.prototype.isNoSpot=O.prototype.nc;O.prototype.isSpot=O.prototype.kb;O.prototype.includesSide=O.prototype.Ef;\nO.prototype.opposite=O.prototype.mw;O.prototype.equals=O.prototype.w;O.prototype.set=O.prototype.set;O.prototype.setTo=O.prototype.Ig;var kd=[];O.className=\"Spot\";O.parse=id;O.stringify=jd;O.None=sc=hd(new O(0,0,0,0),0).ca();O.Default=Vc=hd(new O(0,0,-1,0),-1).ca();O.TopLeft=tc=(new O(0,0,0,0)).ca();O.TopCenter=uc=(new O(.5,0,0,0)).ca();O.TopRight=vc=(new O(1,0,0,0)).ca();O.LeftCenter=yc=(new O(0,.5,0,0)).ca();O.Center=zc=(new O(.5,.5,0,0)).ca();O.RightCenter=Ac=(new O(1,.5,0,0)).ca();\nO.BottomLeft=Bc=(new O(0,1,0,0)).ca();O.BottomCenter=Cc=(new O(.5,1,0,0)).ca();O.BottomRight=Dc=(new O(1,1,0,0)).ca();O.MiddleTop=bd=uc;O.MiddleLeft=cd=yc;O.MiddleRight=dd=Ac;O.MiddleBottom=ed=Cc;O.Top=$c=uc;O.Left=Wc=yc;O.Right=Zc=Ac;O.Bottom=ad=Cc;O.TopSide=Ec=hd(new O(0,0,1,1),1).ca();O.LeftSide=Gc=hd(new O(0,0,1,2),1).ca();O.RightSide=Hc=hd(new O(0,0,1,4),1).ca();O.BottomSide=Ic=hd(new O(0,0,1,8),1).ca();O.TopBottomSides=Jc=hd(new O(0,0,1,9),1).ca();O.LeftRightSides=Kc=hd(new O(0,0,1,6),1).ca();\nO.TopLeftSides=Lc=hd(new O(0,0,1,3),1).ca();O.TopRightSides=Mc=hd(new O(0,0,1,5),1).ca();O.BottomLeftSides=Nc=hd(new O(0,0,1,10),1).ca();O.BottomRightSides=Oc=hd(new O(0,0,1,12),1).ca();O.NotTopSide=Qc=hd(new O(0,0,1,14),1).ca();O.NotLeftSide=Rc=hd(new O(0,0,1,13),1).ca();O.NotRightSide=Sc=hd(new O(0,0,1,11),1).ca();O.NotBottomSide=Tc=hd(new O(0,0,1,7),1).ca();O.AllSides=Uc=hd(new O(0,0,1,15),1).ca();fd=(new O(.156,.156)).ca();gd=(new O(.844,.844)).ca();O.parse=id;O.stringify=jd;\nfunction ld(){this.m11=1;this.m21=this.m12=0;this.m22=1;this.dy=this.dx=0}ld.prototype.set=function(a){this.m11=a.m11;this.m12=a.m12;this.m21=a.m21;this.m22=a.m22;this.dx=a.dx;this.dy=a.dy;return this};ld.prototype.copy=function(){var a=new ld;a.m11=this.m11;a.m12=this.m12;a.m21=this.m21;a.m22=this.m22;a.dx=this.dx;a.dy=this.dy;return a};ld.prototype.toString=function(){return\"Transform(\"+this.m11+\",\"+this.m12+\",\"+this.m21+\",\"+this.m22+\",\"+this.dx+\",\"+this.dy+\")\"};\nld.prototype.w=function(a){return this.m11===a.m11&&this.m12===a.m12&&this.m21===a.m21&&this.m22===a.m22&&this.dx===a.dx&&this.dy===a.dy};ld.prototype.Tt=function(){return 0===this.dx&&0===this.dy&&1===this.m11&&0===this.m12&&0===this.m21&&1===this.m22};ld.prototype.reset=function(){this.m11=1;this.m21=this.m12=0;this.m22=1;this.dy=this.dx=0;return this};\nld.prototype.multiply=function(a){var b=this.m11*a.m11+this.m21*a.m12,c=this.m12*a.m11+this.m22*a.m12,d=this.m11*a.m21+this.m21*a.m22,e=this.m12*a.m21+this.m22*a.m22;this.dx=this.m11*a.dx+this.m21*a.dy+this.dx;this.dy=this.m12*a.dx+this.m22*a.dy+this.dy;this.m11=b;this.m12=c;this.m21=d;this.m22=e;return this};\nld.prototype.jw=function(a){var b=1/(a.m11*a.m22-a.m12*a.m21),c=a.m22*b,d=-a.m12*b,e=-a.m21*b,f=a.m11*b,g=b*(a.m21*a.dy-a.m22*a.dx);a=b*(a.m12*a.dx-a.m11*a.dy);b=this.m11*c+this.m21*d;c=this.m12*c+this.m22*d;d=this.m11*e+this.m21*f;e=this.m12*e+this.m22*f;this.dx=this.m11*g+this.m21*a+this.dx;this.dy=this.m12*g+this.m22*a+this.dy;this.m11=b;this.m12=c;this.m21=d;this.m22=e;return this};\nld.prototype.St=function(){var a=1/(this.m11*this.m22-this.m12*this.m21),b=-this.m12*a,c=-this.m21*a,d=this.m11*a,e=a*(this.m21*this.dy-this.m22*this.dx),f=a*(this.m12*this.dx-this.m11*this.dy);this.m11=this.m22*a;this.m12=b;this.m21=c;this.m22=d;this.dx=e;this.dy=f;return this};\nld.prototype.rotate=function(a,b,c){360<=a?a-=360:0>a&&(a+=360);if(0===a)return this;this.translate(b,c);if(90===a){a=0;var d=1}else 180===a?(a=-1,d=0):270===a?(a=0,d=-1):(d=a*Math.PI/180,a=Math.cos(d),d=Math.sin(d));var e=this.m12*a+this.m22*d,f=this.m11*-d+this.m21*a,g=this.m12*-d+this.m22*a;this.m11=this.m11*a+this.m21*d;this.m12=e;this.m21=f;this.m22=g;this.translate(-b,-c);return this};t=ld.prototype;t.translate=function(a,b){this.dx+=this.m11*a+this.m21*b;this.dy+=this.m12*a+this.m22*b;return this};\nt.scale=function(a,b){void 0===b&&(b=a);this.m11*=a;this.m12*=a;this.m21*=b;this.m22*=b;return this};t.ta=function(a){var b=a.x,c=a.y;return a.h(b*this.m11+c*this.m21+this.dx,b*this.m12+c*this.m22+this.dy)};t.Jd=function(a){var b=1/(this.m11*this.m22-this.m12*this.m21),c=a.x,d=a.y;return a.h(c*this.m22*b+d*-this.m21*b+b*(this.m21*this.dy-this.m22*this.dx),c*-this.m12*b+d*this.m11*b+b*(this.m12*this.dx-this.m11*this.dy))};\nt.Zx=function(a){var b=1/(this.m11*this.m22-this.m12*this.m21),c=1.25*a.x,d=1.2*a.y;return a.h(c*this.m22*b+d*-this.m21*b+b*(this.m21*this.dy-this.m22*this.dx),c*-this.m12*b+d*this.m11*b+b*(this.m12*this.dx-this.m11*this.dy))};\nt.Pw=function(a){var b=a.x,c=a.y,d=b+a.width,e=c+a.height,f=this.m11,g=this.m12,h=this.m21,k=this.m22,l=this.dx,m=this.dy,n=b*f+c*h+l,p=b*g+c*k+m,r=d*f+c*h+l,q=d*g+c*k+m;c=b*f+e*h+l;b=b*g+e*k+m;f=d*f+e*h+l;d=d*g+e*k+m;e=Math.min(n,r);n=Math.max(n,r);r=Math.min(p,q);p=Math.max(p,q);e=Math.min(e,c);n=Math.max(n,c);r=Math.min(r,b);p=Math.max(p,b);e=Math.min(e,f);n=Math.max(n,f);r=Math.min(r,d);p=Math.max(p,d);a.h(e,r,n-e,p-r);return a};ld.alloc=function(){var a=qd.pop();return void 0===a?new ld:a};\nld.free=function(a){qd.push(a)};ld.prototype.transformRect=ld.prototype.Pw;ld.prototype.transformPoint=ld.prototype.ta;ld.prototype.scale=ld.prototype.scale;ld.prototype.translate=ld.prototype.translate;ld.prototype.rotate=ld.prototype.rotate;ld.prototype.invert=ld.prototype.St;ld.prototype.multiplyInverted=ld.prototype.jw;ld.prototype.multiply=ld.prototype.multiply;ld.prototype.reset=ld.prototype.reset;ld.prototype.isIdentity=ld.prototype.Tt;ld.prototype.equals=ld.prototype.w;ld.prototype.set=ld.prototype.set;\nvar qd=[];ld.className=\"Transform\";ld.xF=\"54a702f3e53909c447824c6706603faf4c\";\nvar L={lB:\"7da71ca0ad381e90\",Kg:(Math.sqrt(2)-1)/3*4,jx:null,sqrt:function(a){if(0>=a)return 0;var b=L.jx;if(null===b){b=[];for(var c=0;2E3>=c;c++)b[c]=Math.sqrt(c);L.jx=b}return 1>a?(c=1/a,2E3>=c?1/b[c|0]:Math.sqrt(a)):2E3>=a?b[a|0]:Math.sqrt(a)},A:function(a,b){a-=b;return.5>a&&-.5<a},aa:function(a,b){a-=b;return 5E-8>a&&-5E-8<a},Nb:function(a,b,c,d,e,f,g){0>=e&&(e=1E-6);if(a<c){var h=a;var k=c}else h=c,k=a;if(b<d){var l=b;var m=d}else l=d,m=b;if(a===c)return l<=g&&g<=m&&a-e<=f&&f<=a+e;if(b===d)return h<=\nf&&f<=k&&b-e<=g&&g<=b+e;k+=e;h-=e;if(h<=f&&f<=k&&(m+=e,l-=e,l<=g&&g<=m))if(k-h>m-l)if(a-c>e||c-a>e){if(f=(d-b)/(c-a)*(f-a)+b,f-e<=g&&g<=f+e)return!0}else return!0;else if(b-d>e||d-b>e){if(g=(c-a)/(d-b)*(g-b)+a,g-e<=f&&f<=g+e)return!0}else return!0;return!1},yt:function(a,b,c,d,e,f,g,h,k,l,m,n){if(L.Nb(a,b,g,h,n,c,d)&&L.Nb(a,b,g,h,n,e,f))return L.Nb(a,b,g,h,n,l,m);var p=(a+c)/2,r=(b+d)/2,q=(c+e)/2,u=(d+f)/2;e=(e+g)/2;f=(f+h)/2;d=(p+q)/2;c=(r+u)/2;q=(q+e)/2;u=(u+f)/2;var w=(d+q)/2,v=(c+u)/2;return L.yt(a,\nb,p,r,d,c,w,v,k,l,m,n)||L.yt(w,v,q,u,e,f,g,h,k,l,m,n)},yz:function(a,b,c,d,e,f,g,h,k){var l=(c+e)/2,m=(d+f)/2;k.h((((a+c)/2+l)/2+(l+(e+g)/2)/2)/2,(((b+d)/2+m)/2+(m+(f+h)/2)/2)/2);return k},xz:function(a,b,c,d,e,f,g,h){var k=(c+e)/2,l=(d+f)/2;return zb(((a+c)/2+k)/2,((b+d)/2+l)/2,(k+(e+g)/2)/2,(l+(f+h)/2)/2)},vm:function(a,b,c,d,e,f,g,h,k,l){if(L.Nb(a,b,g,h,k,c,d)&&L.Nb(a,b,g,h,k,e,f))bc(l,a,b,0,0),bc(l,g,h,0,0);else{var m=(a+c)/2,n=(b+d)/2,p=(c+e)/2,r=(d+f)/2;e=(e+g)/2;f=(f+h)/2;d=(m+p)/2;c=(n+r)/\n2;p=(p+e)/2;r=(r+f)/2;var q=(d+p)/2,u=(c+r)/2;L.vm(a,b,m,n,d,c,q,u,k,l);L.vm(q,u,p,r,e,f,g,h,k,l)}return l},Fe:function(a,b,c,d,e,f,g,h,k,l){if(L.Nb(a,b,g,h,k,c,d)&&L.Nb(a,b,g,h,k,e,f))0===l.length&&(l.push(a),l.push(b)),l.push(g),l.push(h);else{var m=(a+c)/2,n=(b+d)/2,p=(c+e)/2,r=(d+f)/2;e=(e+g)/2;f=(f+h)/2;d=(m+p)/2;c=(n+r)/2;p=(p+e)/2;r=(r+f)/2;var q=(d+p)/2,u=(c+r)/2;L.Fe(a,b,m,n,d,c,q,u,k,l);L.Fe(q,u,p,r,e,f,g,h,k,l)}return l},qw:function(a,b,c,d,e,f,g,h,k,l){if(L.Nb(a,b,e,f,l,c,d))return L.Nb(a,\nb,e,f,l,h,k);var m=(a+c)/2,n=(b+d)/2;c=(c+e)/2;d=(d+f)/2;var p=(m+c)/2,r=(n+d)/2;return L.qw(a,b,m,n,p,r,g,h,k,l)||L.qw(p,r,c,d,e,f,g,h,k,l)},AB:function(a,b,c,d,e,f,g){g.h(((a+c)/2+(c+e)/2)/2,((b+d)/2+(d+f)/2)/2);return g},pw:function(a,b,c,d,e,f,g,h){if(L.Nb(a,b,e,f,g,c,d))bc(h,a,b,0,0),bc(h,e,f,0,0);else{var k=(a+c)/2,l=(b+d)/2;c=(c+e)/2;d=(d+f)/2;var m=(k+c)/2,n=(l+d)/2;L.pw(a,b,k,l,m,n,g,h);L.pw(m,n,c,d,e,f,g,h)}return h},Vq:function(a,b,c,d,e,f,g,h){if(L.Nb(a,b,e,f,g,c,d))0===h.length&&(h.push(a),\nh.push(b)),h.push(e),h.push(f);else{var k=(a+c)/2,l=(b+d)/2;c=(c+e)/2;d=(d+f)/2;var m=(k+c)/2,n=(l+d)/2;L.Vq(a,b,k,l,m,n,g,h);L.Vq(m,n,c,d,e,f,g,h)}return h},wq:function(a,b,c,d,e,f,g,h,k,l,m,n,p,r){if(L.Nb(a,b,g,h,p,c,d)&&L.Nb(a,b,g,h,p,e,f)){if(!L.Cm(a,b,g,h,k,l,m,n))return!1;p=(a-g)*(l-n)-(b-h)*(k-m);if(0===p)return!1;r.h(((a*h-b*g)*(k-m)-(a-g)*(k*n-l*m))/p,((a*h-b*g)*(l-n)-(b-h)*(k*n-l*m))/p);return!0}var q=(a+c)/2,u=(b+d)/2,w=(c+e)/2,v=(d+f)/2;e=(e+g)/2;f=(f+h)/2;d=(q+w)/2;c=(u+v)/2;w=(w+e)/\n2;v=(v+f)/2;var y=(d+w)/2,z=(c+v)/2,A=Infinity,C=!1,F=0,Q=0;L.wq(a,b,q,u,d,c,y,z,k,l,m,n,p,r)&&(a=(r.x-k)*(r.x-k)+(r.y-l)*(r.y-l),a<A&&(A=a,C=!0,F=r.x,Q=r.y));L.wq(y,z,w,v,e,f,g,h,k,l,m,n,p,r)&&(r.x-k)*(r.x-k)+(r.y-l)*(r.y-l)<A&&(C=!0,F=r.x,Q=r.y);C&&(r.x=F,r.y=Q);return C},xq:function(a,b,c,d,e,f,g,h,k,l,m,n,p){var r=0;if(L.Nb(a,b,g,h,p,c,d)&&L.Nb(a,b,g,h,p,e,f)){p=(a-g)*(l-n)-(b-h)*(k-m);if(0===p)return r;var q=((a*h-b*g)*(k-m)-(a-g)*(k*n-l*m))/p,u=((a*h-b*g)*(l-n)-(b-h)*(k*n-l*m))/p;if(q>=m)return r;\nif((k>m?k-m:m-k)<(l>n?l-n:n-l)){if(b<h?(a=b,b=h):a=h,u<a||u>b)return r}else if(a<g?(b=a,a=g):b=g,q<b||q>a)return r;0<p?r++:0>p&&r--}else{q=(a+c)/2;u=(b+d)/2;var w=(c+e)/2,v=(d+f)/2;e=(e+g)/2;f=(f+h)/2;d=(q+w)/2;c=(u+v)/2;w=(w+e)/2;v=(v+f)/2;var y=(d+w)/2,z=(c+v)/2;r+=L.xq(a,b,q,u,d,c,y,z,k,l,m,n,p);r+=L.xq(y,z,w,v,e,f,g,h,k,l,m,n,p)}return r},Qh:function(a,b,c,d,e,f,g){if(L.aa(a,c)){b<d?(c=b,b=d):c=d;if(f<c)return g.h(a,c),!1;if(f>b)return g.h(a,b),!1;g.h(a,f);return!0}if(L.aa(b,d)){a<c?(d=a,a=c):\nd=c;if(e<d)return g.h(d,b),!1;if(e>a)return g.h(a,b),!1;g.h(e,b);return!0}e=((a-e)*(a-c)+(b-f)*(b-d))/((c-a)*(c-a)+(d-b)*(d-b));if(-5E-6>e)return g.h(a,b),!1;if(1.000005<e)return g.h(c,d),!1;g.h(a+e*(c-a),b+e*(d-b));return!0},Me:function(a,b,c,d,e,f,g,h,k){if(L.A(a,c)&&L.A(b,d))return k.h(a,b),!1;if(L.aa(e,g))return L.aa(a,c)?(L.Qh(a,b,c,d,e,f,k),!1):L.Qh(a,b,c,d,e,(d-b)/(c-a)*(e-a)+b,k);h=(h-f)/(g-e);if(L.aa(a,c)){c=h*(a-e)+f;b<d?(e=b,b=d):e=d;if(c<e)return k.h(a,e),!1;if(c>b)return k.h(a,b),!1;\nk.h(a,c);return!0}g=(d-b)/(c-a);if(L.aa(h,g))return L.Qh(a,b,c,d,e,f,k),!1;e=(g*a-h*e+f-b)/(g-h);if(L.aa(g,0)){a<c?(d=a,a=c):d=c;if(e<d)return k.h(d,b),!1;if(e>a)return k.h(a,b),!1;k.h(e,b);return!0}return L.Qh(a,b,c,d,e,g*(e-a)+b,k)},yB:function(a,b,c,d,e){return L.Me(c.x,c.y,d.x,d.y,a.x,a.y,b.x,b.y,e)},wB:function(a,b,c,d,e,f,g,h,k,l){function m(c,d){var e=(c-a)*(c-a)+(d-b)*(d-b);e<n&&(n=e,k.h(c,d))}var n=Infinity;m(k.x,k.y);var p=0,r=0,q=0,u=0;e<g?(p=e,r=g):(p=g,r=e);f<h?(q=e,u=g):(q=g,u=e);p=\n(r-p)/2+l;l=(u-q)/2+l;e=(e+g)/2;f=(f+h)/2;if(0===p||0===l)return k;if(.5>(c>a?c-a:a-c)){p=1-(c-e)*(c-e)/(p*p);if(0>p)return k;p=Math.sqrt(p);d=-l*p+f;m(c,l*p+f);m(c,d)}else{c=(d-b)/(c-a);d=1/(p*p)+c*c/(l*l);h=2*c*(b-c*a)/(l*l)-2*c*f/(l*l)-2*e/(p*p);p=h*h-4*d*(2*c*a*f/(l*l)-2*b*f/(l*l)+f*f/(l*l)+e*e/(p*p)-1+(b-c*a)*(b-c*a)/(l*l));if(0>p)return k;p=Math.sqrt(p);l=(-h+p)/(2*d);m(l,c*l-c*a+b);p=(-h-p)/(2*d);m(p,c*p-c*a+b)}return k},Cf:function(a,b,c,d,e,f,g,h,k){var l=1E21,m=a,n=b;if(L.Me(a,b,a,d,e,f,\ng,h,k)){var p=(k.x-e)*(k.x-e)+(k.y-f)*(k.y-f);p<l&&(l=p,m=k.x,n=k.y)}L.Me(c,b,c,d,e,f,g,h,k)&&(p=(k.x-e)*(k.x-e)+(k.y-f)*(k.y-f),p<l&&(l=p,m=k.x,n=k.y));L.Me(a,b,c,b,e,f,g,h,k)&&(b=(k.x-e)*(k.x-e)+(k.y-f)*(k.y-f),b<l&&(l=b,m=k.x,n=k.y));L.Me(a,d,c,d,e,f,g,h,k)&&(a=(k.x-e)*(k.x-e)+(k.y-f)*(k.y-f),a<l&&(l=a,m=k.x,n=k.y));k.h(m,n);return 1E21>l},vB:function(a,b,c,d,e,f,g,h,k){c=a-c;g=e-g;0===c||0===g?0===c?(b=(f-h)/g,h=a,e=b*h+(f-b*e)):(f=(b-d)/c,h=e,e=f*h+(b-f*a)):(d=(b-d)/c,h=(f-h)/g,a=b-d*a,h=(f-\nh*e-a)/(d-h),e=d*h+a);k.h(h,e);return k},Qt:function(a,b,c){return L.Ey(a.x,a.y,a.width,a.height,b.x,b.y,c.x,c.y)},Ey:function(a,b,c,d,e,f,g,h){var k=a+c,l=b+d;return e===g?(f<h?(g=f,f=h):g=h,a<=e&&e<=k&&g<=l&&f>=b):f===h?(e<g?(h=e,e=g):h=g,b<=f&&f<=l&&h<=k&&e>=a):cc(a,b,c,d,e,f)||cc(a,b,c,d,g,h)||L.Cm(a,b,k,b,e,f,g,h)||L.Cm(k,b,k,l,e,f,g,h)||L.Cm(k,l,a,l,e,f,g,h)||L.Cm(a,l,a,b,e,f,g,h)?!0:!1},Cm:function(a,b,c,d,e,f,g,h){return 0>=L.Bt(a,b,c,d,e,f)*L.Bt(a,b,c,d,g,h)&&0>=L.Bt(e,f,g,h,a,b)*L.Bt(e,\nf,g,h,c,d)},Bt:function(a,b,c,d,e,f){c-=a;d-=b;a=e-a;b=f-b;f=a*d-b*c;0===f&&(f=a*c+b*d,0<f&&(f=(a-c)*c+(b-d)*d,0>f&&(f=0)));return 0>f?-1:0<f?1:0},Tq:function(a){0>a&&(a+=360);360<=a&&(a-=360);return a},hy:function(a,b,c,d,e,f){var g=Math.PI;f||(d*=g/180,e*=g/180);var h=d>e?-1:1;f=[];var k=g/2,l=d;d=Math.min(2*g,Math.abs(e-d));if(1E-5>d)return k=l+h*Math.min(d,k),h=a+c*Math.cos(l),l=b+c*Math.sin(l),a+=c*Math.cos(k),b+=c*Math.sin(k),c=(h+a)/2,k=(l+b)/2,f.push([h,l,c,k,c,k,a,b]),f;for(;1E-5<d;)e=l+\nh*Math.min(d,k),f.push(L.Hz(c,l,e,a,b)),d-=Math.abs(e-l),l=e;return f},Hz:function(a,b,c,d,e){var f=(c-b)/2,g=a*Math.cos(f),h=a*Math.sin(f),k=-h,l=g*g+k*k,m=l+g*g+k*h;l=4/3*(Math.sqrt(2*l*m)-m)/(g*h-k*g);h=g-l*k;g=k+l*g;k=-g;l=f+b;f=Math.cos(l);l=Math.sin(l);return[d+a*Math.cos(b),e+a*Math.sin(b),d+h*f-g*l,e+h*l+g*f,d+h*f-k*l,e+h*l+k*f,d+a*Math.cos(c),e+a*Math.sin(c)]},Gq:function(a,b,c,d,e,f,g){c=Math.floor((a-c)/e)*e+c;d=Math.floor((b-d)/f)*f+d;var h=c;c+e-a<e/2&&(h=c+e);a=d;d+f-b<f/2&&(a=d+f);\ng.h(h,a);return g},uy:function(a,b){var c=Math.max(a,b);a=Math.min(a,b);var d;do b=c%a,c=d=a,a=b;while(0<b);return d},Mz:function(a,b,c,d){var e=0>c,f=0>d;if(a<b){var g=1;var h=0}else g=0,h=1;var k=0===g?a:b;var l=0===g?c:d;if(0===g?e:f)l=-l;g=h;c=0===g?c:d;if(0===g?e:f)c=-c;return L.Nz(k,0===g?a:b,l,c,0,0)},Nz:function(a,b,c,d,e,f){if(0<d)if(0<c){e=a*a;f=b*b;a*=c;var g=b*d,h=-f+g,k=-f+Math.sqrt(a*a+g*g);b=h;for(var l=0;9999999999>l;++l){b=.5*(h+k);if(b===h||b===k)break;var m=a/(b+e),n=g/(b+f);m=\nm*m+n*n-1;if(0<m)h=b;else if(0>m)k=b;else break}c=e*c/(b+e)-c;d=f*d/(b+f)-d;c=Math.sqrt(c*c+d*d)}else c=Math.abs(d-b);else d=a*a-b*b,f=a*c,f<d?(d=f/d,f=b*Math.sqrt(Math.abs(1-d*d)),c=a*d-c,c=Math.sqrt(c*c+f*f)):c=Math.abs(c-a);return c},Qe:new $a,dn:new $a,Uh:new $a,Vh:0};L.za=L.lB;\nfunction rd(a){Xa(this);this.v=!1;void 0===a&&(a=sd);this.qa=a;this.oc=this.hc=this.dd=this.cd=0;this.Jj=new E;this.Xr=this.Jj.Ba;this.Fr=(new N).freeze();this.ra=!0;this.ln=this.al=null;this.mn=NaN;this.pf=tc;this.qf=Dc;this.Cl=this.Dl=NaN;this.Sf=td}\nrd.prototype.copy=function(){var a=new rd;a.qa=this.qa;a.cd=this.cd;a.dd=this.dd;a.hc=this.hc;a.oc=this.oc;for(var b=this.Jj.j,c=b.length,d=a.Jj,e=0;e<c;e++){var f=b[e].copy();d.add(f)}a.Xr=this.Xr;a.Fr.assign(this.Fr);a.ra=this.ra;a.al=this.al;a.ln=this.ln;a.mn=this.mn;a.pf=this.pf.H();a.qf=this.qf.H();a.Dl=this.Dl;a.Cl=this.Cl;a.Sf=this.Sf;return a};t=rd.prototype;t.ca=function(){this.freeze();Object.freeze(this);return this};\nt.freeze=function(){this.v=!0;var a=this.figures;a.freeze();a=a.j;for(var b=a.length,c=0;c<b;c++)a[c].freeze();return this};t.ea=function(){Object.isFrozen(this)&&B(\"cannot thaw constant: \"+this);this.v=!1;var a=this.figures;a.ea();a=a.j;for(var b=a.length,c=0;c<b;c++)a[c].ea();return this};\nt.Qa=function(a){if(!(a instanceof rd))return!1;if(this.type!==a.type)return this.type===ud&&a.type===sd?vd(this,a):a.type===ud&&this.type===sd?vd(a,this):!1;if(this.type===sd){var b=this.figures.j;a=a.figures.j;var c=b.length;if(c!==a.length)return!1;for(var d=0;d<c;d++)if(!b[d].Qa(a[d]))return!1;return!0}return L.A(this.startX,a.startX)&&L.A(this.startY,a.startY)&&L.A(this.endX,a.endX)&&L.A(this.endY,a.endY)};\nfunction vd(a,b){return a.type!==ud||b.type!==sd?!1:1===b.figures.count&&(b=b.figures.J(0),1===b.segments.count&&L.A(a.startX,b.startX)&&L.A(a.startY,b.startY)&&(b=b.segments.J(0),b.type===wd&&L.A(a.endX,b.endX)&&L.A(a.endY,b.endY)))?!0:!1}function xd(a){return a.toString()}t.jb=function(a){a.classType===rd&&(this.type=a)};\nt.toString=function(a){void 0===a&&(a=-1);switch(this.type){case ud:return 0>a?\"M\"+this.startX.toString()+\" \"+this.startY.toString()+\"L\"+this.endX.toString()+\" \"+this.endY.toString():\"M\"+this.startX.toFixed(a)+\" \"+this.startY.toFixed(a)+\"L\"+this.endX.toFixed(a)+\" \"+this.endY.toFixed(a);case yd:var b=new N(this.startX,this.startY,0,0);b.Rw(this.endX,this.endY,0,0);return 0>a?\"M\"+b.x.toString()+\" \"+b.y.toString()+\"H\"+b.right.toString()+\"V\"+b.bottom.toString()+\"H\"+b.left.toString()+\"z\":\"M\"+b.x.toFixed(a)+\n\" \"+b.y.toFixed(a)+\"H\"+b.right.toFixed(a)+\"V\"+b.bottom.toFixed(a)+\"H\"+b.left.toFixed(a)+\"z\";case zd:b=new N(this.startX,this.startY,0,0);b.Rw(this.endX,this.endY,0,0);if(0>a)return a=b.left.toString()+\" \"+(b.y+b.height/2).toString(),\"M\"+a+\"A\"+(b.width/2).toString()+\" \"+(b.height/2).toString()+\" 0 0 1 \"+(b.right.toString()+\" \"+(b.y+b.height/2).toString())+\"A\"+(b.width/2).toString()+\" \"+(b.height/2).toString()+\" 0 0 1 \"+a;var c=b.left.toFixed(a)+\" \"+(b.y+b.height/2).toFixed(a);return\"M\"+c+\"A\"+(b.width/\n2).toFixed(a)+\" \"+(b.height/2).toFixed(a)+\" 0 0 1 \"+(b.right.toFixed(a)+\" \"+(b.y+b.height/2).toFixed(a))+\"A\"+(b.width/2).toFixed(a)+\" \"+(b.height/2).toFixed(a)+\" 0 0 1 \"+c;case sd:b=\"\";c=this.figures.j;for(var d=c.length,e=0;e<d;e++){var f=c[e];0<e&&(b+=\" x \");f.isFilled&&(b+=\"F \");b+=f.toString(a)}return b;default:return this.type.toString()}};\nfunction Dd(a,b){function c(){return u>=A-1?!0:null!==n[u+1].match(C)}function d(){u++;return n[u]}function e(a){var b=parseFloat(d()),c=parseFloat(d());w===w.toLowerCase()&&(b=z.x+b,c=z.y+c);a.h(b,c)}function f(){e(z);return z}function g(){e(y);return y}function h(){var a=v.toLowerCase();return\"c\"!==a&&\"s\"!==a&&\"q\"!==a&&\"t\"!==a?z:new J(2*z.x-y.x,2*z.y-y.y)}void 0===b&&(b=!1);var k=new RegExp(\"([\"+Ed+\"])([\"+Ed+\"])\",\"gm\"),l=new RegExp(\"([\"+Ed+\"])([^s])\",\"gm\"),m=new RegExp(\"([^s])([\"+Ed+\"])\",\"gm\");\na=a.replace(/,/gm,\" \");a=a.replace(k,\"$1 $2\");a=a.replace(k,\"$1 $2\");a=a.replace(l,\"$1 $2\");a=a.replace(m,\"$1 $2\");a=a.replace(/([0-9])([+\\-])/gm,\"$1 $2\");a=a.replace(/[\\s\\r\\t\\n]+/gm,\" \");a=a.replace(/^\\s+|\\s+$/g,\"\");var n=a.split(\" \");for(a=0;a<n.length;a++)if(l=n[a],null!==l.match(/(\\.[0-9]*)(\\.)/gm)){k=Ea();m=\"\";for(var p=!1,r=0;r<l.length;r++){var q=l[r];\".\"!==q||p?\".\"===q?(k.push(m),m=\".\"):m+=q:(p=!0,m+=q)}k.push(m);n.splice(a,1);for(l=0;l<k.length;l++)n.splice(a+l,0,k[l]);a+=k.length-1;Ia(k)}var u=\n-1,w=\"\",v=\"\";k=new J(0,0);var y=new J(0,0),z=new J(0,0),A=n.length;a=Fd(null);m=l=!1;p=!0;r=null;for(var C=new RegExp(\"[\"+Ed+\"]\");!(u>=A-1);)if(v=w,w=d(),\"\"!==w)switch(w.toUpperCase()){case \"X\":p=!0;m=l=!1;break;case \"M\":r=f();null===a.ic||!0===p?(Gd(a,r.x,r.y,l,!m),p=!1):a.moveTo(r.x,r.y);for(k.assign(z);!c();)r=f(),a.lineTo(r.x,r.y);break;case \"L\":for(;!c();)r=f(),a.lineTo(r.x,r.y);break;case \"H\":for(;!c();)z=new J((w===w.toLowerCase()?z.x:0)+parseFloat(d()),z.y),a.lineTo(z.x,z.y);break;case \"V\":for(;!c();)z=\nnew J(z.x,(w===w.toLowerCase()?z.y:0)+parseFloat(d())),a.lineTo(z.x,z.y);break;case \"C\":for(;!c();){r=new J;e(r);q=g();var F=f();Hd(a,r.x,r.y,q.x,q.y,F.x,F.y)}break;case \"S\":for(;!c();)r=h(),q=g(),F=f(),Hd(a,r.x,r.y,q.x,q.y,F.x,F.y);break;case \"Q\":for(;!c();)r=g(),q=f(),Id(a,r.x,r.y,q.x,q.y);break;case \"T\":for(;!c();)y=r=h(),q=f(),Id(a,r.x,r.y,q.x,q.y);break;case \"B\":for(;!c();){r=parseFloat(d());q=parseFloat(d());F=parseFloat(d());var Q=parseFloat(d()),K=parseFloat(d()),T=K,P=!1;c()||(T=parseFloat(d()),\nc()||(P=0!==parseFloat(d())));w===w.toLowerCase()&&(F+=z.x,Q+=z.y);a.arcTo(r,q,F,Q,K,T,P)}break;case \"A\":for(;!c();)r=Math.abs(parseFloat(d())),q=Math.abs(parseFloat(d())),F=parseFloat(d()),K=Q=!1,P=T=0,T=d(),1===T.length?(Q=!!parseFloat(T),K=!!parseFloat(d()),T=parseFloat(d())):2===T.length?(Q=!!parseFloat(T[0]),K=!!parseFloat(T[1]),T=parseFloat(d())):(Q=!!parseFloat(T[0]),K=!!parseFloat(T[1]),T=parseFloat(T.slice(2))),P=parseFloat(d()),w===w.toLowerCase()&&(T=z.x+T,P=z.y+P),z.h(T,P),Ud(a,r,q,F,\nQ,K,T,P);break;case \"Z\":Vd(a);z.assign(k);break;case \"F\":r=\"\";for(q=1;n[u+q];)if(null!==n[u+q].match(/[Uu]/))q++;else if(null===n[u+q].match(C))q++;else{r=n[u+q];break}r.match(/[Mm]/)?l=!0:0<a.ic.segments.length&&(a.ic.isFilled=!0);break;case \"U\":r=\"\";for(q=1;n[u+q];)if(null!==n[u+q].match(/[Ff]/))q++;else if(null===n[u+q].match(C))q++;else{r=n[u+q];break}r.match(/[Mm]/)?m=!0:a.Ym(!1)}k=a.Kt;Wd=a;if(b)for(b=k.figures.iterator;b.next();)b.value.isFilled=!0;return k}\nfunction Xd(a,b){for(var c=a.length,d=J.alloc(),e=0;e<c;e++){var f=a[e];d.x=f[0];d.y=f[1];b.ta(d);f[0]=d.x;f[1]=d.y;d.x=f[2];d.y=f[3];b.ta(d);f[2]=d.x;f[3]=d.y;d.x=f[4];d.y=f[5];b.ta(d);f[4]=d.x;f[5]=d.y;d.x=f[6];d.y=f[7];b.ta(d);f[6]=d.x;f[7]=d.y}J.free(d)}t.gw=function(){if(this.ra||this.Xr!==this.figures.Ba)return!0;for(var a=this.figures.j,b=a.length,c=0;c<b;c++)if(a[c].gw())return!0;return!1};\nrd.prototype.computeBounds=function(){this.ra=!1;this.ln=this.al=null;this.mn=NaN;this.Xr=this.figures.Ba;for(var a=this.figures.j,b=a.length,c=0;c<b;c++){var d=a[c];d.ra=!1;var e=d.segments;d.bt=e.Ba;d=e.j;e=d.length;for(var f=0;f<e;f++){var g=d[f];g.ra=!1;g.Qd=null}}a=this.Fr;a.ea();isNaN(this.Dl)||isNaN(this.Cl)?a.h(0,0,0,0):a.h(0,0,this.Dl,this.Cl);Yd(this,a,!1);bc(a,0,0,0,0);a.freeze()};rd.prototype.ey=function(){var a=new N;Yd(this,a,!0);return a};\nfunction Yd(a,b,c){switch(a.type){case ud:case yd:case zd:c?b.h(a.cd,a.dd,0,0):bc(b,a.cd,a.dd,0,0);bc(b,a.hc,a.oc,0,0);break;case sd:var d=a.figures;a=d.j;d=d.length;for(var e=0;e<d;e++){var f=a[e];c&&0===e?b.h(f.startX,f.startY,0,0):bc(b,f.startX,f.startY,0,0);for(var g=f.segments.j,h=g.length,k=f.startX,l=f.startY,m=0;m<h;m++){var n=g[m];switch(n.type){case wd:case Zd:k=n.endX;l=n.endY;bc(b,k,l,0,0);break;case $d:L.vm(k,l,n.point1X,n.point1Y,n.point2X,n.point2Y,n.endX,n.endY,.5,b);k=n.endX;l=n.endY;\nbreak;case ae:L.pw(k,l,n.point1X,n.point1Y,n.endX,n.endY,.5,b);k=n.endX;l=n.endY;break;case be:case ce:var p=n.type===be?de(n,f):ee(n,f,k,l),r=p.length;if(0===r){k=n.type===be?n.centerX:n.endX;l=n.type===be?n.centerY:n.endY;bc(b,k,l,0,0);break}n=null;for(var q=0;q<r;q++)n=p[q],L.vm(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],.5,b);null!==n&&(k=n[6],l=n[7]);break;default:B(\"Unknown Segment type: \"+n.type)}}}break;default:B(\"Unknown Geometry type: \"+a.type)}}\nrd.prototype.normalize=function(){this.v&&va(this);var a=this.ey();this.offset(-a.x,-a.y);return new J(-a.x,-a.y)};rd.prototype.offset=function(a,b){this.v&&va(this);this.transform(1,0,0,1,a,b);return this};rd.prototype.scale=function(a,b){this.v&&va(this);this.transform(a,0,0,b,0,0);return this};rd.prototype.rotate=function(a,b,c){this.v&&va(this);void 0===b&&(b=0);void 0===c&&(c=0);var d=ld.alloc();d.reset();d.rotate(a,b,c);this.transform(d.m11,d.m12,d.m21,d.m22,d.dx,d.dy);ld.free(d);return this};\nt=rd.prototype;\nt.transform=function(a,b,c,d,e,f){switch(this.type){case ud:case yd:case zd:var g=this.cd;var h=this.dd;this.cd=g*a+h*c+e;this.dd=g*b+h*d+f;g=this.hc;h=this.oc;this.hc=g*a+h*c+e;this.oc=g*b+h*d+f;break;case sd:for(var k=this.figures.j,l=k.length,m=0;m<l;m++){var n=k[m];g=n.startX;h=n.startY;n.startX=g*a+h*c+e;n.startY=g*b+h*d+f;n=n.segments.j;for(var p=n.length,r=0;r<p;r++){var q=n[r];switch(q.type){case wd:case Zd:g=q.endX;h=q.endY;q.endX=g*a+h*c+e;q.endY=g*b+h*d+f;break;case $d:g=q.point1X;h=q.point1Y;\nq.point1X=g*a+h*c+e;q.point1Y=g*b+h*d+f;g=q.point2X;h=q.point2Y;q.point2X=g*a+h*c+e;q.point2Y=g*b+h*d+f;g=q.endX;h=q.endY;q.endX=g*a+h*c+e;q.endY=g*b+h*d+f;break;case ae:g=q.point1X;h=q.point1Y;q.point1X=g*a+h*c+e;q.point1Y=g*b+h*d+f;g=q.endX;h=q.endY;q.endX=g*a+h*c+e;q.endY=g*b+h*d+f;break;case be:g=q.centerX;h=q.centerY;q.centerX=g*a+h*c+e;q.centerY=g*b+h*d+f;0!==b&&(g=180*Math.atan2(b,a)/Math.PI,0>g&&(g+=360),q.startAngle+=g);0>a&&(q.startAngle=180-q.startAngle,q.sweepAngle=-q.sweepAngle);0>d&&\n(q.startAngle=-q.startAngle,q.sweepAngle=-q.sweepAngle);q.radiusX*=Math.sqrt(a*a+c*c);void 0!==q.radiusY&&(q.radiusY*=Math.sqrt(b*b+d*d));break;case ce:g=q.endX;h=q.endY;q.endX=g*a+h*c+e;q.endY=g*b+h*d+f;if(0===q.radiusX||0===q.radiusY)break;0!==b&&(g=180*Math.atan2(b,a)/Math.PI,0>g&&(g+=360),q.xAxisRotation+=g);0>a&&(q.xAxisRotation=180-q.xAxisRotation,q.isClockwiseArc=!q.isClockwiseArc);0>d&&(q.xAxisRotation=-q.xAxisRotation,q.isClockwiseArc=!q.isClockwiseArc);q.radiusX*=Math.sqrt(a*a+c*c);q.radiusY*=\nMath.sqrt(b*b+d*d);break;default:B(\"Unknown Segment type: \"+q.type)}}}}this.ra=!0;return this};\nt.$=function(a,b){void 0===b&&(b=0);var c=this.cd,d=this.dd,e=this.hc,f=this.oc;switch(this.type){case ud:return L.Nb(c,d,e,f,b,a.x,a.y);case yd:var g=N.allocAt(Math.min(c,e)-b,Math.min(d,f)-b,Math.abs(e-c)+2*b,Math.abs(f-d)+2*b);a=g.$(a);N.free(g);return a;case zd:g=Math.min(c,e)-b;var h=Math.min(d,f)-b;c=(Math.abs(e-c)+2*b)/2;b=(Math.abs(f-d)+2*b)/2;if(0>=c||0>=b)return!1;g=a.x-(g+c);h=a.y-(h+b);return 1>=g*g/(c*c)+h*h/(b*b);case sd:return fe(this,a,b,!0,!1);default:return!1}};\nfunction fe(a,b,c,d,e){var f=b.x;b=b.y;for(var g=a.bounds.x-20,h=0,k,l,m,n,p=a.figures.j,r=p.length,q=0;q<r;q++){var u=p[q];if(u.isFilled){if(d&&u.$(f,b,c))return!0;var w=u.segments;k=u.startX;l=u.startY;for(var v=k,y=l,z=w.j,A=0;A<=w.length;A++){var C=void 0;if(A!==w.length){C=z[A];var F=C.type;a=C.endX;n=C.endY}else F=wd,a=v,n=y;switch(F){case Zd:v=ge(f,b,g,b,k,l,v,y);if(isNaN(v))return!0;h+=v;v=a;y=n;break;case wd:k=ge(f,b,g,b,k,l,a,n);if(isNaN(k))return!0;h+=k;break;case $d:m=L.xq(k,l,C.point1X,\nC.point1Y,C.point2X,C.point2Y,a,n,g,b,f,b,.5);h+=m;break;case ae:m=L.xq(k,l,(k+2*C.point1X)/3,(l+2*C.point1Y)/3,(2*C.point1X+a)/3,(2*C.point1Y+n)/3,a,n,g,b,f,b,.5);h+=m;break;case be:case ce:F=C.type===be?de(C,u):ee(C,u,k,l);var Q=F.length;if(0===Q){k=ge(f,b,g,b,k,l,C.type===be?C.centerX:C.endX,C.type===be?C.centerY:C.endY);if(isNaN(k))return!0;h+=k;break}C=null;for(var K=0;K<Q;K++){C=F[K];if(0===K){m=ge(f,b,g,b,k,l,C[0],C[1]);if(isNaN(m))return!0;h+=m}m=L.xq(C[0],C[1],C[2],C[3],C[4],C[5],C[6],C[7],\ng,b,f,b,.5);h+=m}null!==C&&(a=C[6],n=C[7]);break;default:B(\"Unknown Segment type: \"+C.type)}k=a;l=n}if(0!==h)return!0;h=0}else if(u.$(f,b,e?c:c+2))return!0}return 0!==h}\nfunction ge(a,b,c,d,e,f,g,h){if(L.Nb(e,f,g,h,.05,a,b))return NaN;var k=(a-c)*(f-h);if(0===k)return 0;var l=((a*d-b*c)*(e-g)-(a-c)*(e*h-f*g))/k;b=(a*d-b*c)*(f-h)/k;if(l>=a)return 0;if((e>g?e-g:g-e)<(f>h?f-h:h-f))if(f<h){if(b<f||b>h)return 0}else{if(b<h||b>f)return 0}else if(e<g){if(l<e||l>g)return 0}else if(l<g||l>e)return 0;return 0<k?1:-1}function he(a,b,c,d){a=a.figures.j;for(var e=a.length,f=0;f<e;f++)if(a[f].$(b,c,d))return!0;return!1}\nt.Xv=function(a,b){0>a?a=0:1<a&&(a=1);void 0===b&&(b=new J);if(this.type===ud)return b.h(this.startX+a*(this.endX-this.startX),this.startY+a*(this.endY-this.startY)),b;for(var c=this.flattenedSegments,d=this.flattenedLengths,e=c.length,f=this.flattenedTotalLength*a,g=0,h=0;h<e;h++){var k=d[h],l=k.length;for(a=0;a<l;a++){var m=k[a];if(g+m>=f)return d=f-g,d=0===m?0:d/m,c=c[h],h=c[2*a],e=c[2*a+1],b.h(h+(c[2*a+2]-h)*d,e+(c[2*a+3]-e)*d),b;g+=m}}return b};\nt.vy=function(a){0>a?a=0:1<a&&(a=1);if(this.type===ud)return 180*Math.atan2(this.endY-this.startY,this.endX-this.startX)/Math.PI;for(var b=this.flattenedSegments,c=this.flattenedLengths,d=b.length,e=this.flattenedTotalLength*a,f=0,g=0;g<d;g++){var h=c[g],k=h.length;for(a=0;a<k;a++){var l=h[a];if(f+l>=e)return e=b[g],b=e[2*a],c=e[2*a+1],d=e[2*a+2],a=e[2*a+3],1>Math.abs(d-b)&&1>Math.abs(a-c)?0:1>Math.abs(d-b)?0<=a-c?90:270:1>Math.abs(a-c)?0<=d-b?0:180:180*Math.atan2(a-c,d-b)/Math.PI;f+=l}}return NaN};\nt.Yv=function(a,b){0>a?a=0:1<a&&(a=1);void 0===b&&(b=[]);b.length=3;if(this.type===ud)return b[0]=this.startX+a*(this.endX-this.startX),b[1]=this.startY+a*(this.endY-this.startY),b[2]=180*Math.atan2(this.endY-this.startY,this.endX-this.startX)/Math.PI,b;for(var c=this.flattenedSegments,d=this.flattenedLengths,e=c.length,f=this.flattenedTotalLength*a,g=0,h=0;h<e;h++){var k=d[h],l=k.length;for(a=0;a<l;a++){var m=k[a];if(g+m>=f)return d=f-g,d=0===m?0:d/m,m=c[h],c=m[2*a],h=m[2*a+1],e=m[2*a+2],a=m[2*a+\n3],b[0]=c+(e-c)*d,b[1]=h+(a-h)*d,b[2]=1>Math.abs(e-c)&&1>Math.abs(a-h)?0:1>Math.abs(e-c)?0<=a-h?90:270:1>Math.abs(a-h)?0<=e-c?0:180:180*Math.atan2(a-h,e-c)/Math.PI,b;g+=m}}return b};\nt.wy=function(a){if(this.type===ud){var b=this.startX,c=this.startY,d=this.endX,e=this.endY;if(b!==d||c!==e){var f=a.x;a=a.y;if(b===d){if(c<e){var g=c;d=e}else g=e,d=c;return a<=g?g===c?0:1:a>=d?d===c?0:1:Math.abs(a-c)/(d-g)}if(c===e)return b<d?g=b:(g=d,d=b),f<=g?g===b?0:1:f>=d?d===b?0:1:Math.abs(f-b)/(d-g);g=(d-b)*(d-b)+(e-c)*(e-c);var h=J.alloc();L.Qh(b,c,d,e,f,a,h);a=h.x;f=h.y;J.free(h);return Math.sqrt(((a-b)*(a-b)+(f-c)*(f-c))/g)}}else if(this.type===yd){g=this.startX;h=this.startY;var k=this.endX;\ne=this.endY;if(g!==k||h!==e){b=k-g;c=e-h;f=2*b+2*c;d=a.x;a=a.y;d=Math.min(Math.max(d,g),k);a=Math.min(Math.max(a,h),e);g=Math.abs(d-g);k=Math.abs(d-k);h=Math.abs(a-h);e=Math.abs(a-e);var l=Math.min(g,k,h,e);if(l===h)return d/f;if(l===k)return(b+a)/f;if(l===e)return(2*b+c-d)/f;if(l===g)return(2*b+2*c-a)/f}}else{b=this.flattenedSegments;c=this.flattenedLengths;f=this.flattenedTotalLength;d=J.alloc();e=Infinity;h=g=0;k=b.length;for(var m=l=0,n=0;n<k;n++)for(var p=b[n],r=c[n],q=p.length,u=0;u<q;u+=2){var w=\np[u],v=p[u+1];if(0!==u){L.Qh(l,m,w,v,a.x,a.y,d);var y=(d.x-a.x)*(d.x-a.x)+(d.y-a.y)*(d.y-a.y);y<e&&(e=y,g=h,g+=Math.sqrt((d.x-l)*(d.x-l)+(d.y-m)*(d.y-m)));h+=r[(u-2)/2]}l=w;m=v}J.free(d);a=g/f;return 0>a?0:1<a?1:a}return 0};\nfunction ie(a){if(null===a.al){var b=a.al=[],c=a.ln=[],d=[],e=[];if(a.type===ud)d.push(a.startX),d.push(a.startY),d.push(a.endX),d.push(a.endY),b.push(d),e.push(Math.sqrt((a.startX-a.endX)*(a.startX-a.endX)+(a.startY-a.endY)*(a.startY-a.endY))),c.push(e);else if(a.type===yd)d.push(a.startX),d.push(a.startY),d.push(a.endX),d.push(a.startY),d.push(a.endX),d.push(a.endY),d.push(a.startX),d.push(a.endY),d.push(a.startX),d.push(a.startY),b.push(d),e.push(Math.abs(a.startX-a.endX)),e.push(Math.abs(a.startY-\na.endY)),e.push(Math.abs(a.startX-a.endX)),e.push(Math.abs(a.startY-a.endY)),c.push(e);else if(a.type===zd){var f=new je;f.startX=a.endX;f.startY=(a.startY+a.endY)/2;var g=new ke(be);g.startAngle=0;g.sweepAngle=360;g.centerX=(a.startX+a.endX)/2;g.centerY=(a.startY+a.endY)/2;g.radiusX=Math.abs(a.startX-a.endX)/2;g.radiusY=Math.abs(a.startY-a.endY)/2;f.add(g);a=de(g,f);e=a.length;if(0===e)d.push(g.centerX),d.push(g.centerY);else{g=f.startX;f=f.startY;for(var h=0;h<e;h++){var k=a[h];L.Fe(g,f,k[2],k[3],\nk[4],k[5],k[6],k[7],.5,d);g=k[6];f=k[7]}}b.push(d);c.push(le(d))}else for(a=a.figures.iterator;a.next();){e=a.value;d=[];d.push(e.startX);d.push(e.startY);g=e.startX;f=e.startY;h=g;k=f;for(var l=e.segments.j,m=l.length,n=0;n<m;n++){var p=l[n];switch(p.type){case Zd:4<=d.length&&(b.push(d),c.push(le(d)));d=[];d.push(p.endX);d.push(p.endY);g=p.endX;f=p.endY;h=g;k=f;break;case wd:d.push(p.endX);d.push(p.endY);g=p.endX;f=p.endY;break;case $d:L.Fe(g,f,p.point1X,p.point1Y,p.point2X,p.point2Y,p.endX,p.endY,\n.5,d);g=p.endX;f=p.endY;break;case ae:L.Vq(g,f,p.point1X,p.point1Y,p.endX,p.endY,.5,d);g=p.endX;f=p.endY;break;case be:var r=de(p,e),q=r.length;if(0===q){d.push(p.centerX);d.push(p.centerY);g=p.centerX;f=p.centerY;break}for(var u=0;u<q;u++){var w=r[u];L.Fe(g,f,w[2],w[3],w[4],w[5],w[6],w[7],.5,d);g=w[6];f=w[7]}break;case ce:r=ee(p,e,g,f);q=r.length;u=p.endX;w=p.endY;if(0===q){d.push(u);d.push(w);g=u;f=w;break}for(u=0;u<q;u++)w=r[u],L.Fe(g,f,w[2],w[3],w[4],w[5],w[6],w[7],.5,d),g=w[6],f=w[7];break;default:B(\"Segment not of valid type: \"+\np.type)}p.isClosed&&(d.push(h),d.push(k))}4<=d.length&&(b.push(d),c.push(le(d)))}}}function le(a){for(var b=[],c=0,d=0,e=a.length,f=0;f<e;f+=2){var g=a[f],h=a[f+1];0!==f&&b.push(Math.sqrt(yb(c,d,g,h)));c=g;d=h}return b}t.add=function(a){this.Jj.add(a);return this};t.Zm=function(a,b,c,d,e,f,g,h){this.v&&va(this);this.pf=(new O(a,b,e,f)).freeze();this.qf=(new O(c,d,g,h)).freeze();return this};\nna.Object.defineProperties(rd.prototype,{flattenedSegments:{get:function(){ie(this);return this.al}},flattenedLengths:{get:function(){ie(this);return this.ln}},flattenedTotalLength:{get:function(){var a=this.mn;if(isNaN(a)){if(this.type===ud){a=Math.abs(this.endX-this.startX);var b=Math.abs(this.endY-this.startY);a=Math.sqrt(a*a+b*b)}else if(this.type===yd)a=2*Math.abs(this.endX-this.startX)+2*Math.abs(this.endY-\nthis.startY);else{b=this.flattenedLengths;for(var c=b.length,d=a=0;d<c;d++)for(var e=b[d],f=e.length,g=0;g<f;g++)a+=e[g]}this.mn=a}return a}},type:{get:function(){return this.qa},set:function(a){this.qa!==a&&(this.v&&va(this,a),this.qa=a,this.ra=!0)}},startX:{get:function(){return this.cd},set:function(a){this.cd!==a&&(this.v&&va(this,a),this.cd=a,this.ra=!0)}},startY:{get:function(){return this.dd},set:function(a){this.dd!==\na&&(this.v&&va(this,a),this.dd=a,this.ra=!0)}},endX:{get:function(){return this.hc},set:function(a){this.hc!==a&&(this.v&&va(this,a),this.hc=a,this.ra=!0)}},endY:{get:function(){return this.oc},set:function(a){this.oc!==a&&(this.v&&va(this,a),this.oc=a,this.ra=!0)}},figures:{get:function(){return this.Jj},set:function(a){this.Jj!==a&&(this.v&&va(this,a),this.Jj=a,this.ra=!0)}},spot1:{\nget:function(){return this.pf},set:function(a){this.v&&va(this,a);this.pf=a.H()}},spot2:{get:function(){return this.qf},set:function(a){this.v&&va(this,a);this.qf=a.H()}},defaultStretch:{get:function(){return this.Sf},set:function(a){this.v&&va(this,a);this.Sf=a}},bounds:{get:function(){this.gw()&&this.computeBounds();return this.Fr}}});rd.prototype.setSpots=rd.prototype.Zm;rd.prototype.add=rd.prototype.add;\nrd.prototype.getFractionForPoint=rd.prototype.wy;rd.prototype.getPointAndAngleAlongPath=rd.prototype.Yv;rd.prototype.getAngleAlongPath=rd.prototype.vy;rd.prototype.getPointAlongPath=rd.prototype.Xv;rd.prototype.containsPoint=rd.prototype.$;rd.prototype.transform=rd.prototype.transform;rd.prototype.rotate=rd.prototype.rotate;rd.prototype.scale=rd.prototype.scale;rd.prototype.offset=rd.prototype.offset;rd.prototype.normalize=rd.prototype.normalize;rd.prototype.computeBoundsWithoutOrigin=rd.prototype.ey;\nrd.prototype.equalsApprox=rd.prototype.Qa;var ud=new D(rd,\"Line\",0),yd=new D(rd,\"Rectangle\",1),zd=new D(rd,\"Ellipse\",2),sd=new D(rd,\"Path\",3),Ed=\"UuBbMmZzLlHhVvCcSsQqTtAaFfXx\";rd.className=\"Geometry\";rd.stringify=xd;rd.fillPath=function(a){a=a.split(/[Xx]/);for(var b=a.length,c=\"\",d=0;d<b;d++){var e=a[d];c=null!==e.match(/[Ff]/)?0===d?c+e:c+(\"X\"+(\" \"===e[0]?\"\":\" \")+e):c+((0===d?\"\":\"X \")+\"F\"+(\" \"===e[0]?\"\":\" \")+e)}return c};rd.parse=Dd;rd.Line=ud;rd.Rectangle=yd;rd.Ellipse=zd;rd.Path=sd;\nfunction je(a,b,c,d){Xa(this);this.sx=null;this.v=!1;void 0===c&&(c=!0);this.js=c;void 0===d&&(d=!0);this.os=d;void 0!==a?this.cd=a:this.cd=0;void 0!==b?this.dd=b:this.dd=0;this.dm=new E;this.bt=this.dm.Ba;this.ra=!0}je.prototype.copy=function(){var a=new je;a.js=this.js;a.os=this.os;a.cd=this.cd;a.dd=this.dd;for(var b=this.dm.j,c=b.length,d=a.dm,e=0;e<c;e++){var f=b[e].copy();d.add(f)}a.bt=this.bt;a.ra=this.ra;a.sx=this.sx;return a};t=je.prototype;\nt.Qa=function(a){if(!(a instanceof je&&L.A(this.startX,a.startX)&&L.A(this.startY,a.startY)))return!1;var b=this.segments.j;a=a.segments.j;var c=b.length;if(c!==a.length)return!1;for(var d=0;d<c;d++)if(!b[d].Qa(a[d]))return!1;return!0};t.toString=function(a){void 0===a&&(a=-1);var b=0>a?\"M\"+this.startX.toString()+\" \"+this.startY.toString():\"M\"+this.startX.toFixed(a)+\" \"+this.startY.toFixed(a);for(var c=this.segments.j,d=c.length,e=0;e<d;e++)b+=\" \"+c[e].toString(a);return b};\nt.freeze=function(){this.v=!0;var a=this.segments;a.freeze();var b=a.j;a=a.length;for(var c=0;c<a;c++)b[c].freeze();return this};t.ea=function(){this.v=!1;var a=this.segments;a.ea();a=a.j;for(var b=a.length,c=0;c<b;c++)a[c].ea();return this};t.gw=function(){if(this.ra)return!0;var a=this.segments;if(this.bt!==a.Ba)return!0;a=a.j;for(var b=a.length,c=0;c<b;c++)if(a[c].ra)return!0;return!1};t.add=function(a){this.dm.add(a);return this};\nt.$=function(a,b,c){for(var d=this.startX,e=this.startY,f=d,g=e,h=this.segments.j,k=h.length,l=0;l<k;l++){var m=h[l];switch(m.type){case Zd:f=m.endX;g=m.endY;d=m.endX;e=m.endY;break;case wd:if(L.Nb(d,e,m.endX,m.endY,c,a,b))return!0;d=m.endX;e=m.endY;break;case $d:if(L.yt(d,e,m.point1X,m.point1Y,m.point2X,m.point2Y,m.endX,m.endY,.5,a,b,c))return!0;d=m.endX;e=m.endY;break;case ae:if(L.qw(d,e,m.point1X,m.point1Y,m.endX,m.endY,.5,a,b,c))return!0;d=m.endX;e=m.endY;break;case be:case ce:var n=m.type===\nbe?de(m,this):ee(m,this,d,e),p=n.length,r=m.type===be?m.centerX:m.endX,q=m.type===be?m.centerY:m.endY;if(0===p){if(L.Nb(d,e,r,q,c,a,b))return!0;d=r;e=q;break}r=null;for(q=0;q<p;q++)if(r=n[q],0===q&&L.Nb(d,e,r[0],r[1],c,a,b)||L.yt(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],.5,a,b,c))return!0;null!==r&&(d=r[6],e=r[7]);break;default:B(\"Unknown Segment type: \"+m.type)}if(m.isClosed&&(d!==f||e!==g)&&L.Nb(d,e,f,g,c,a,b))return!0}return!1};\nna.Object.defineProperties(je.prototype,{isFilled:{get:function(){return this.js},set:function(a){this.v&&va(this,a);this.js=a}},isShadowed:{get:function(){return this.os},set:function(a){this.v&&va(this,a);this.os=a}},startX:{get:function(){return this.cd},set:function(a){this.v&&va(this,a);this.cd=a;this.ra=!0}},startY:{get:function(){return this.dd},set:function(a){this.v&&va(this,\na);this.dd=a;this.ra=!0}},segments:{get:function(){return this.dm},set:function(a){this.v&&va(this,a);this.dm=a;this.ra=!0}}});je.prototype.add=je.prototype.add;je.prototype.equalsApprox=je.prototype.Qa;je.className=\"PathFigure\";\nfunction ke(a,b,c,d,e,f,g,h){Xa(this);this.v=!1;void 0===a&&(a=wd);this.qa=a;void 0!==b?this.hc=b:this.hc=0;void 0!==c?this.oc=c:this.oc=0;void 0===d&&(d=0);void 0===e&&(e=0);void 0===f&&(f=0);void 0===g&&(g=0);a===ce?(a=f%360,0>a&&(a+=360),this.Ce=a,this.Qi=0,this.Ri=Math.max(d,0),this.qh=Math.max(e,0),this.Ll=\"boolean\"===typeof g?g:\"number\"===typeof g?!!g:!1,this.el=!!h):(this.Ce=d,this.Qi=e,a===be&&(f=Math.max(f,0)),this.Ri=f,\"number\"===typeof g?(a===be&&(g=Math.max(g,0)),this.qh=g):this.qh=0,\nthis.el=this.Ll=!1);this.Oj=!1;this.ra=!0;this.Qd=null}ke.prototype.copy=function(){var a=new ke;a.qa=this.qa;a.hc=this.hc;a.oc=this.oc;a.Ce=this.Ce;a.Qi=this.Qi;a.Ri=this.Ri;a.qh=this.qh;a.Ll=this.Ll;a.el=this.el;a.Oj=this.Oj;a.ra=this.ra;return a};t=ke.prototype;\nt.Qa=function(a){if(!(a instanceof ke)||this.type!==a.type||this.isClosed!==a.isClosed)return!1;switch(this.type){case Zd:case wd:return L.A(this.endX,a.endX)&&L.A(this.endY,a.endY);case $d:return L.A(this.endX,a.endX)&&L.A(this.endY,a.endY)&&L.A(this.point1X,a.point1X)&&L.A(this.point1Y,a.point1Y)&&L.A(this.point2X,a.point2X)&&L.A(this.point2Y,a.point2Y);case ae:return L.A(this.endX,a.endX)&&L.A(this.endY,a.endY)&&L.A(this.point1X,a.point1X)&&L.A(this.point1Y,a.point1Y);case be:return L.A(this.startAngle,\na.startAngle)&&L.A(this.sweepAngle,a.sweepAngle)&&L.A(this.centerX,a.centerX)&&L.A(this.centerY,a.centerY)&&L.A(this.radiusX,a.radiusX)&&L.A(this.radiusY,a.radiusY);case ce:return this.isClockwiseArc===a.isClockwiseArc&&this.isLargeArc===a.isLargeArc&&L.A(this.xAxisRotation,a.xAxisRotation)&&L.A(this.endX,a.endX)&&L.A(this.endY,a.endY)&&L.A(this.radiusX,a.radiusX)&&L.A(this.radiusY,a.radiusY);default:return!1}};t.jb=function(a){a.classType===ke&&(this.type=a)};\nt.toString=function(a){void 0===a&&(a=-1);switch(this.type){case Zd:a=0>a?\"M\"+this.endX.toString()+\" \"+this.endY.toString():\"M\"+this.endX.toFixed(a)+\" \"+this.endY.toFixed(a);break;case wd:a=0>a?\"L\"+this.endX.toString()+\" \"+this.endY.toString():\"L\"+this.endX.toFixed(a)+\" \"+this.endY.toFixed(a);break;case $d:a=0>a?\"C\"+this.point1X.toString()+\" \"+this.point1Y.toString()+\" \"+this.point2X.toString()+\" \"+this.point2Y.toString()+\" \"+this.endX.toString()+\" \"+this.endY.toString():\"C\"+this.point1X.toFixed(a)+\n\" \"+this.point1Y.toFixed(a)+\" \"+this.point2X.toFixed(a)+\" \"+this.point2Y.toFixed(a)+\" \"+this.endX.toFixed(a)+\" \"+this.endY.toFixed(a);break;case ae:a=0>a?\"Q\"+this.point1X.toString()+\" \"+this.point1Y.toString()+\" \"+this.endX.toString()+\" \"+this.endY.toString():\"Q\"+this.point1X.toFixed(a)+\" \"+this.point1Y.toFixed(a)+\" \"+this.endX.toFixed(a)+\" \"+this.endY.toFixed(a);break;case be:a=0>a?\"B\"+this.startAngle.toString()+\" \"+this.sweepAngle.toString()+\" \"+this.centerX.toString()+\" \"+this.centerY.toString()+\n\" \"+this.radiusX.toString()+\" \"+this.radiusY.toString():\"B\"+this.startAngle.toFixed(a)+\" \"+this.sweepAngle.toFixed(a)+\" \"+this.centerX.toFixed(a)+\" \"+this.centerY.toFixed(a)+\" \"+this.radiusX.toFixed(a)+\" \"+this.radiusY.toFixed(a);break;case ce:a=0>a?\"A\"+this.radiusX.toString()+\" \"+this.radiusY.toString()+\" \"+this.xAxisRotation.toString()+\" \"+(this.isLargeArc?1:0)+\" \"+(this.isClockwiseArc?1:0)+\" \"+this.endX.toString()+\" \"+this.endY.toString():\"A\"+this.radiusX.toFixed(a)+\" \"+this.radiusY.toFixed(a)+\n\" \"+this.xAxisRotation.toFixed(a)+\" \"+(this.isLargeArc?1:0)+\" \"+(this.isClockwiseArc?1:0)+\" \"+this.endX.toFixed(a)+\" \"+this.endY.toFixed(a);break;default:a=this.type.toString()}return a+(this.Oj?\"z\":\"\")};t.freeze=function(){this.v=!0;return this};t.ea=function(){this.v=!1;return this};t.close=function(){this.Oj=!0;return this};\nfunction de(a,b){if(null!==a.Qd&&!1===b.ra)return a.Qd;var c=a.radiusX,d=a.radiusY;void 0===d&&(d=c);if(0===c||0===d)return a.Qd=[],a.Qd;b=a.Ce;var e=a.Qi,f=L.hy(0,0,c<d?c:d,a.startAngle,a.startAngle+a.sweepAngle,!1);if(c!==d){var g=ld.alloc();g.reset();c<d?g.scale(1,d/c):g.scale(c/d,1);Xd(f,g);ld.free(g)}c=f.length;for(d=0;d<c;d++)g=f[d],g[0]+=b,g[1]+=e,g[2]+=b,g[3]+=e,g[4]+=b,g[5]+=e,g[6]+=b,g[7]+=e;a.Qd=f;return a.Qd}\nfunction ee(a,b,c,d){function e(a,b,c,d){return(a*d<b*c?-1:1)*Math.acos((a*c+b*d)/(Math.sqrt(a*a+b*b)*Math.sqrt(c*c+d*d)))}if(null!==a.Qd&&!1===b.ra)return a.Qd;if(0===a.radiusX||0===a.radiusY)return a.Qd=[],a.Qd;b=a.Ri;var f=a.qh;0===b&&(b=1E-4);0===f&&(f=1E-4);var g=Math.PI/180*a.Ce,h=a.Ll,k=a.el,l=a.hc,m=a.oc,n=Math.cos(g),p=Math.sin(g),r=n*(c-l)/2+p*(d-m)/2;g=-p*(c-l)/2+n*(d-m)/2;var q=r*r/(b*b)+g*g/(f*f);1<q&&(b*=Math.sqrt(q),f*=Math.sqrt(q));q=(h===k?-1:1)*Math.sqrt((b*b*f*f-b*b*g*g-f*f*r*r)/\n(b*b*g*g+f*f*r*r));isNaN(q)&&(q=0);h=q*b*g/f;q=q*-f*r/b;isNaN(h)&&(h=0);isNaN(q)&&(q=0);c=(c+l)/2+n*h-p*q;d=(d+m)/2+p*h+n*q;m=e(1,0,(r-h)/b,(g-q)/f);n=(r-h)/b;l=(g-q)/f;r=(-r-h)/b;h=(-g-q)/f;g=e(n,l,r,h);r=(n*r+l*h)/(Math.sqrt(n*n+l*l)*Math.sqrt(r*r+h*h));-1>=r?g=Math.PI:1<=r&&(g=0);!k&&0<g&&(g-=2*Math.PI);k&&0>g&&(g+=2*Math.PI);k=b>f?1:b/f;r=b>f?f/b:1;b=L.hy(0,0,b>f?b:f,m,m+g,!0);f=ld.alloc();f.reset();f.translate(c,d);f.rotate(a.Ce,0,0);f.scale(k,r);Xd(b,f);ld.free(f);a.Qd=b;return a.Qd}\nna.Object.defineProperties(ke.prototype,{isClosed:{get:function(){return this.Oj},set:function(a){this.Oj!==a&&(this.Oj=a,this.ra=!0)}},type:{get:function(){return this.qa},set:function(a){this.v&&va(this,a);this.qa=a;this.ra=!0}},endX:{get:function(){return this.hc},set:function(a){this.v&&va(this,a);this.hc=a;this.ra=!0}},endY:{get:function(){return this.oc},set:function(a){this.v&&\nva(this,a);this.oc=a;this.ra=!0}},point1X:{get:function(){return this.Ce},set:function(a){this.v&&va(this,a);this.Ce=a;this.ra=!0}},point1Y:{get:function(){return this.Qi},set:function(a){this.v&&va(this,a);this.Qi=a;this.ra=!0}},point2X:{get:function(){return this.Ri},set:function(a){this.v&&va(this,a);this.Ri=a;this.ra=!0}},point2Y:{get:function(){return this.qh},set:function(a){this.v&&\nva(this,a);this.qh=a;this.ra=!0}},centerX:{get:function(){return this.Ce},set:function(a){this.v&&va(this,a);this.Ce=a;this.ra=!0}},centerY:{get:function(){return this.Qi},set:function(a){this.v&&va(this,a);this.Qi=a;this.ra=!0}},radiusX:{get:function(){return this.Ri},set:function(a){0>a&&wa(a,\">= zero\",ke,\"radiusX\");this.v&&va(this,a);this.Ri=a;this.ra=!0}},radiusY:{get:function(){return this.qh},\nset:function(a){0>a&&wa(a,\">= zero\",ke,\"radiusY\");this.v&&va(this,a);this.qh=a;this.ra=!0}},startAngle:{get:function(){return this.hc},set:function(a){this.hc!==a&&(this.v&&va(this,a),a%=360,0>a&&(a+=360),this.hc=a,this.ra=!0)}},sweepAngle:{get:function(){return this.oc},set:function(a){this.v&&va(this,a);360<a&&(a=360);-360>a&&(a=-360);this.oc=a;this.ra=!0}},isClockwiseArc:{get:function(){return this.el},set:function(a){this.v&&\nva(this,a);this.el=a;this.ra=!0}},isLargeArc:{get:function(){return this.Ll},set:function(a){this.v&&va(this,a);this.Ll=a;this.ra=!0}},xAxisRotation:{get:function(){return this.Ce},set:function(a){a%=360;0>a&&(a+=360);this.v&&va(this,a);this.Ce=a;this.ra=!0}}});ke.prototype.equalsApprox=ke.prototype.Qa;\nvar Zd=new D(ke,\"Move\",0),wd=new D(ke,\"Line\",1),$d=new D(ke,\"Bezier\",2),ae=new D(ke,\"QuadraticBezier\",3),be=new D(ke,\"Arc\",4),ce=new D(ke,\"SvgArc\",4);ke.className=\"PathSegment\";ke.Move=Zd;ke.Line=wd;ke.Bezier=$d;ke.QuadraticBezier=ae;ke.Arc=be;ke.SvgArc=ce;function me(){this.C=null;this.yv=(new J(0,0)).freeze();this.Iu=(new J(0,0)).freeze();this.xr=this.zs=0;this.yr=1;this.Di=\"\";this.st=this.Rr=!1;this.Or=this.Ar=0;this.Pg=this.bs=this.ms=!1;this.Wr=null;this.nt=0;this.pd=this.mt=null}\nme.prototype.copy=function(){var a=new me;return this.clone(a)};me.prototype.clone=function(a){a.C=this.C;a.yv.assign(this.viewPoint);a.Iu.assign(this.documentPoint);a.zs=this.zs;a.xr=this.xr;a.yr=this.yr;a.Di=this.Di;a.Rr=this.Rr;a.st=this.st;a.Ar=this.Ar;a.Or=this.Or;a.ms=this.ms;a.bs=this.bs;a.Pg=this.Pg;a.Wr=this.Wr;a.nt=this.nt;a.mt=this.mt;a.pd=this.pd;return a};\nme.prototype.toString=function(){var a=\"^\";0!==this.modifiers&&(a+=\"M:\"+this.modifiers);0!==this.button&&(a+=\"B:\"+this.button);\"\"!==this.key&&(a+=\"K:\"+this.key);0!==this.clickCount&&(a+=\"C:\"+this.clickCount);0!==this.delta&&(a+=\"D:\"+this.delta);this.handled&&(a+=\"h\");this.bubbles&&(a+=\"b\");null!==this.documentPoint&&(a+=\"@\"+this.documentPoint.toString());return a};me.prototype.Jq=function(a,b){var c=this.diagram;if(null===c)return b;ue(c,this.event,a,b);return b};\nme.prototype.mA=function(a,b){var c=this.diagram;if(null===c)return b;ue(c,this.event,a,b);b.assign(c.ou(b));return b};\nna.Object.defineProperties(me.prototype,{diagram:{get:function(){return this.C},set:function(a){this.C=a}},viewPoint:{get:function(){return this.yv},set:function(a){this.yv.assign(a)}},documentPoint:{get:function(){return this.Iu},set:function(a){this.Iu.assign(a)}},modifiers:{get:function(){return this.zs},set:function(a){this.zs=a}},button:{get:function(){return this.xr},\nset:function(a){this.xr=a;if(null===this.event)switch(a){case 0:this.buttons=1;break;case 1:this.buttons=4;break;case 2:this.buttons=2}}},buttons:{get:function(){return this.yr},set:function(a){this.yr=a}},key:{get:function(){return this.Di},set:function(a){this.Di=a}},down:{get:function(){return this.Rr},set:function(a){this.Rr=a}},up:{get:function(){return this.st},set:function(a){this.st=\na}},clickCount:{get:function(){return this.Ar},set:function(a){this.Ar=a}},delta:{get:function(){return this.Or},set:function(a){this.Or=a}},isMultiTouch:{get:function(){return this.ms},set:function(a){this.ms=a}},handled:{get:function(){return this.bs},set:function(a){this.bs=a}},bubbles:{get:function(){return this.Pg},set:function(a){this.Pg=a}},event:{\nget:function(){return this.Wr},set:function(a){this.Wr=a}},isTouchEvent:{get:function(){var a=x.TouchEvent,b=this.event;return a&&b instanceof a?!0:(a=x.PointerEvent)&&b instanceof a&&(\"touch\"===b.pointerType||\"pen\"===b.pointerType)}},timestamp:{get:function(){return this.nt},set:function(a){this.nt=a}},targetDiagram:{get:function(){return this.mt},set:function(a){this.mt=a}},targetObject:{\nget:function(){return this.pd},set:function(a){this.pd=a}},control:{get:function(){return 0!==(this.modifiers&1)},set:function(a){this.modifiers=a?this.modifiers|1:this.modifiers&-2}},shift:{get:function(){return 0!==(this.modifiers&4)},set:function(a){this.modifiers=a?this.modifiers|4:this.modifiers&-5}},alt:{get:function(){return 0!==(this.modifiers&2)},set:function(a){this.modifiers=a?this.modifiers|\n2:this.modifiers&-3}},meta:{get:function(){return 0!==(this.modifiers&8)},set:function(a){this.modifiers=a?this.modifiers|8:this.modifiers&-9}},left:{get:function(){var a=this.event;return null===a||\"mousedown\"!==a.type&&\"mouseup\"!==a.type&&\"pointerdown\"!==a.type&&\"pointerup\"!==a.type?0!==(this.buttons&1):0===this.button},set:function(a){this.buttons=a?this.buttons|1:this.buttons&-2}},right:{get:function(){var a=\nthis.event;return null===a||\"mousedown\"!==a.type&&\"mouseup\"!==a.type&&\"pointerdown\"!==a.type&&\"pointerup\"!==a.type?0!==(this.buttons&2):2===this.button},set:function(a){this.buttons=a?this.buttons|2:this.buttons&-3}},middle:{get:function(){var a=this.event;return null===a||\"mousedown\"!==a.type&&\"mouseup\"!==a.type&&\"pointerdown\"!==a.type&&\"pointerup\"!==a.type?0!==(this.buttons&4):1===this.button},set:function(a){this.buttons=a?this.buttons|4:this.buttons&-5}}});\nme.prototype.getMultiTouchDocumentPoint=me.prototype.mA;me.prototype.getMultiTouchViewPoint=me.prototype.Jq;me.className=\"InputEvent\";function ve(){this.C=null;this.oa=\"\";this.Js=this.kt=null}ve.prototype.copy=function(){var a=new ve;a.C=this.C;a.oa=this.oa;a.kt=this.kt;a.Js=this.Js;return a};ve.prototype.toString=function(){var a=\"*\"+this.name;null!==this.subject&&(a+=\":\"+this.subject.toString());null!==this.parameter&&(a+=\"(\"+this.parameter.toString()+\")\");return a};\nna.Object.defineProperties(ve.prototype,{diagram:{get:function(){return this.C},set:function(a){this.C=a}},name:{get:function(){return this.oa},set:function(a){this.oa=a}},subject:{get:function(){return this.kt},set:function(a){this.kt=a}},parameter:{get:function(){return this.Js},set:function(a){this.Js=a}}});ve.className=\"DiagramEvent\";\nfunction we(){this.wn=xe;this.gf=this.ys=\"\";this.hp=this.ip=this.op=this.pp=this.np=this.C=this.cc=null}we.prototype.clear=function(){this.hp=this.ip=this.op=this.pp=this.np=this.C=this.cc=null};\nwe.prototype.copy=function(){var a=new we;a.wn=this.wn;a.ys=this.ys;a.gf=this.gf;a.cc=this.cc;a.C=this.C;a.np=this.np;var b=this.pp;a.pp=za(b)&&\"function\"===typeof b.H?b.H():b;b=this.op;a.op=za(b)&&\"function\"===typeof b.H?b.H():b;b=this.ip;a.ip=za(b)&&\"function\"===typeof b.H?b.H():b;b=this.hp;a.hp=za(b)&&\"function\"===typeof b.H?b.H():b;return a};we.prototype.jb=function(a){a.classType===we&&(this.change=a)};\nwe.prototype.toString=function(){var a=\"\";a=this.change===ye?a+\"* \":this.change===xe?a+(null!==this.model?\"!m\":\"!d\"):a+((null!==this.model?\"!m\":\"!d\")+this.change);this.propertyName&&\"string\"===typeof this.propertyName&&(a+=\" \"+this.propertyName);this.modelChange&&this.modelChange!==this.propertyName&&(a+=\" \"+this.modelChange);a+=\": \";this.change===ye?null!==this.oldValue&&(a+=\" \"+this.oldValue):(null!==this.object&&(a+=Ka(this.object)),null!==this.oldValue&&(a+=\"  old: \"+Ka(this.oldValue)),null!==\nthis.oldParam&&(a+=\" \"+this.oldParam),null!==this.newValue&&(a+=\"  new: \"+Ka(this.newValue)),null!==this.newParam&&(a+=\" \"+this.newParam));return a};we.prototype.G=function(a){return a?this.oldValue:this.newValue};we.prototype.oA=function(a){return a?this.oldParam:this.newParam};we.prototype.canUndo=function(){return null!==this.model||null!==this.diagram?!0:!1};\nwe.prototype.undo=function(){this.canUndo()&&(null!==this.model?this.model.changeState(this,!0):null!==this.diagram&&this.diagram.changeState(this,!0))};we.prototype.canRedo=function(){return null!==this.model||null!==this.diagram?!0:!1};we.prototype.redo=function(){this.canRedo()&&(null!==this.model?this.model.changeState(this,!1):null!==this.diagram&&this.diagram.changeState(this,!1))};\nna.Object.defineProperties(we.prototype,{model:{get:function(){return this.cc},set:function(a){this.cc=a}},diagram:{get:function(){return this.C},set:function(a){this.C=a}},change:{get:function(){return this.wn},set:function(a){this.wn=a}},modelChange:{get:function(){return this.ys},set:function(a){this.ys=a}},propertyName:{get:function(){return this.gf},\nset:function(a){this.gf=a}},isTransactionFinished:{get:function(){return this.wn===ye&&(\"CommittedTransaction\"===this.gf||\"FinishedUndo\"===this.gf||\"FinishedRedo\"===this.gf)}},object:{get:function(){return this.np},set:function(a){this.np=a}},oldValue:{get:function(){return this.pp},set:function(a){this.pp=a}},oldParam:{get:function(){return this.op},set:function(a){this.op=a}},\nnewValue:{get:function(){return this.ip},set:function(a){this.ip=a}},newParam:{get:function(){return this.hp},set:function(a){this.hp=a}}});we.prototype.redo=we.prototype.redo;we.prototype.canRedo=we.prototype.canRedo;we.prototype.undo=we.prototype.undo;we.prototype.canUndo=we.prototype.canUndo;we.prototype.getParam=we.prototype.oA;we.prototype.getValue=we.prototype.G;we.prototype.clear=we.prototype.clear;\nvar ye=new D(we,\"Transaction\",-1),xe=new D(we,\"Property\",0),ze=new D(we,\"Insert\",1),Ae=new D(we,\"Remove\",2);we.className=\"ChangedEvent\";we.Transaction=ye;we.Property=xe;we.Insert=ze;we.Remove=Ae;function Be(){this.u=(new E).freeze();this.oa=\"\";this.l=!1}Be.prototype.toString=function(a){var b=\"Transaction: \"+this.name+\" \"+this.changes.count.toString()+(this.isComplete?\"\":\", incomplete\");if(void 0!==a&&0<a){a=this.changes.count;for(var c=0;c<a;c++){var d=this.changes.J(c);null!==d&&(b+=\"\\n  \"+d.toString())}}return b};\nBe.prototype.clear=function(){var a=this.changes;a.ea();for(var b=a.count-1;0<=b;b--){var c=a.J(b);null!==c&&c.clear()}a.clear();a.freeze()};Be.prototype.canUndo=function(){return this.isComplete};Be.prototype.undo=function(){if(this.canUndo())for(var a=this.changes.count-1;0<=a;a--){var b=this.changes.J(a);null!==b&&b.undo()}};Be.prototype.canRedo=function(){return this.isComplete};\nBe.prototype.redo=function(){if(this.canRedo())for(var a=this.changes.count,b=0;b<a;b++){var c=this.changes.J(b);null!==c&&c.redo()}};\nBe.prototype.nw=function(){if(this.isComplete){var a=this.changes;a.ea();for(var b=new H,c=0;c<a.count;c++){var d=a.J(c);if(null!==d&&d.change===xe&&d.object){var e=b.get(d.object);e||(e=new H,b.set(d.object,e));var f=e.get(d.propertyName);null===f?e.set(d.propertyName,-1):(0<f&&a.Pc(f,null),e.set(d.propertyName,c))}}for(c=b=0;c<a.count;c++)d=a.J(c),null!==d&&(c>b&&a.Pc(b,d),b++);for(;a.length>b;)a.pop();a.freeze()}};\nna.Object.defineProperties(Be.prototype,{changes:{get:function(){return this.u}},name:{get:function(){return this.oa},set:function(a){this.oa=a}},isComplete:{get:function(){return this.l},set:function(a){this.l=a}}});Be.prototype.optimize=Be.prototype.nw;Be.prototype.redo=Be.prototype.redo;Be.prototype.canRedo=Be.prototype.canRedo;Be.prototype.undo=Be.prototype.undo;Be.prototype.canUndo=Be.prototype.canUndo;\nBe.prototype.clear=Be.prototype.clear;Be.className=\"Transaction\";function Ce(){this.gv=new G;this.md=!1;this.I=(new E).freeze();this.Xd=-1;this.u=999;this.se=!1;this.Lr=null;this.Yi=0;this.l=!1;this.ye=(new E).freeze();this.Tl=new E;this.Qu=!0;this.Wu=this.ks=this.$u=this.Zu=!1}\nCe.prototype.toString=function(a){var b=\"UndoManager \"+this.historyIndex+\"<\"+this.history.count+\"<=\"+this.maxHistoryLength;b+=\"[\";for(var c=this.nestedTransactionNames.count,d=0;d<c;d++)0<d&&(b+=\" \"),b+=this.nestedTransactionNames.J(d);b+=\"]\";if(void 0!==a&&0<a)for(c=this.history.count,d=0;d<c;d++)b+=\"\\n \"+this.history.J(d).toString(a-1);return b};\nCe.prototype.clear=function(){var a=this.history;a.ea();for(var b=a.count-1;0<=b;b--){var c=a.J(b);null!==c&&c.clear()}a.clear();this.Xd=-1;a.freeze();this.se=!1;this.Lr=null;this.Yi=0;this.ye.ea();this.ye.clear();this.ye.freeze();this.Tl.clear();this.Wu=this.ks=this.$u=this.Zu=!1};Ce.prototype.copyProperties=function(a){this.isEnabled=a.isEnabled;this.maxHistoryLength=a.maxHistoryLength;this.checksTransactionLevel=a.checksTransactionLevel};t=Ce.prototype;t.Vx=function(a){this.gv.add(a)};t.Py=function(a){this.gv.remove(a)};\nt.va=function(a){void 0===a&&(a=\"\");null===a&&(a=\"\");if(this.isUndoingRedoing)return!1;!0===this.Qu&&(this.Qu=!1,this.Yi++,this.isInternalTransaction||this.Bb(\"StartingFirstTransaction\",a,this.currentTransaction),0<this.Yi&&this.Yi--);this.isEnabled&&(this.ye.ea(),this.ye.add(a),this.ye.freeze(),null===this.currentTransaction?this.Tl.add(0):this.Tl.add(this.currentTransaction.changes.count));this.Yi++;var b=1===this.transactionLevel;b&&(this.isInternalTransaction||this.Bb(\"StartedTransaction\",a,this.currentTransaction));\nreturn b};t.Xa=function(a){void 0===a&&(a=\"\");return De(this,!0,a)};t.If=function(){return De(this,!1,\"\")};\nfunction De(a,b,c){if(a.isUndoingRedoing)return!1;a.checksTransactionLevel&&1>a.transactionLevel&&xa(\"Ending transaction without having started a transaction: \"+c);var d=1===a.transactionLevel,e=a.currentTransaction;d&&b&&(a.isInternalTransaction||a.Bb(\"CommittingTransaction\",c,e));var f=0;if(0<a.transactionLevel&&(a.Yi--,a.isEnabled)){var g=a.ye.count;0<g&&(\"\"===c&&(c=a.ye.J(0)),a.ye.ea(),a.ye.cb(g-1),a.ye.freeze());g=a.Tl.count;0<g&&(f=a.Tl.J(g-1),a.Tl.cb(g-1))}if(d){if(b){a.ks=!1;null===e&&\"\"!==\nc&&(e=a.currentTransaction);if(a.isEnabled&&null!==e){e.isComplete||(e.isComplete=!0,e.name=c);b=a.history;b.ea();for(d=b.count-1;d>a.historyIndex;d--)f=b.J(d),null!==f&&f.clear(),b.cb(d),a.ks=!0;d=a.maxHistoryLength;0<=d&&(0===d?b.clear():b.count>=d&&(f=b.J(0),null!==f&&f.clear(),b.cb(0),a.Xd--));0===d||0!==b.count&&b.get(b.count-1)===e||(b.add(e),a.Xd++);b.freeze()}a.isInternalTransaction||a.Bb(\"CommittedTransaction\",c,e)}else{a.se=!0;try{a.isEnabled&&null!==e&&(e.isComplete=!0,e.undo())}finally{a.isInternalTransaction||\na.Bb(\"RolledBackTransaction\",c,e),a.se=!1}null!==e&&e.clear()}a.Lr=null;a.isPendingClear&&a.clear();a.isPendingClear=!1;a.isPendingUnmodified=!1;return!0}if(a.isEnabled&&!b&&null!==e){a=f;c=e.changes;for(e=c.count-1;e>=a;e--)b=c.J(e),null!==b&&b.undo(),c.ea(),c.cb(e);c.freeze()}return!1}Ce.prototype.canUndo=function(){if(!this.isEnabled||0<this.transactionLevel)return!1;var a=this.transactionToUndo;return null!==a&&a.canUndo()?!0:!1};\nCe.prototype.undo=function(){if(this.canUndo()){var a=this.transactionToUndo;try{this.se=!0,this.Bb(\"StartingUndo\",\"Undo\",a),this.Xd--,a.undo()}catch(b){xa(\"undo error: \"+b.toString())}finally{this.Bb(\"FinishedUndo\",\"Undo\",a),this.se=!1}}};Ce.prototype.canRedo=function(){if(!this.isEnabled||0<this.transactionLevel)return!1;var a=this.transactionToRedo;return null!==a&&a.canRedo()?!0:!1};\nCe.prototype.redo=function(){if(this.canRedo()){var a=this.transactionToRedo;try{this.se=!0,this.Bb(\"StartingRedo\",\"Redo\",a),this.Xd++,a.redo()}catch(b){xa(\"redo error: \"+b.toString())}finally{this.Bb(\"FinishedRedo\",\"Redo\",a),this.se=!1}}};Ce.prototype.Bb=function(a,b,c){void 0===c&&(c=null);var d=new we;d.change=ye;d.propertyName=a;d.object=c;d.oldValue=b;for(a=this.models;a.next();)b=a.value,d.model=b,b.zt(d)};\nCe.prototype.aw=function(a){if(this.isEnabled&&!this.isUndoingRedoing&&!this.skipsEvent(a)){var b=this.currentTransaction;null===b&&(this.Lr=b=new Be);var c=a.copy();b=b.changes;b.ea();b.add(c);b.freeze();this.checksTransactionLevel&&0>=this.transactionLevel&&!this.Qu&&(a=a.diagram,null!==a&&!1===a.pj||xa(\"Change not within a transaction: \"+c.toString()))}};\nCe.prototype.skipsEvent=function(a){if(null===a||0>a.change.value)return!0;a=a.object;if(null===a)return!1;if(void 0!==a.layer){if(a=a.layer,null!==a&&a.isTemporary)return!0}else if(a.isTemporary)return!0;return!1};\nna.Object.defineProperties(Ce.prototype,{models:{get:function(){return this.gv.iterator}},isEnabled:{get:function(){return this.md},set:function(a){this.md=a}},transactionToUndo:{get:function(){return 0<=this.historyIndex&&this.historyIndex<=this.history.count-1?this.history.J(this.historyIndex):null}},transactionToRedo:{get:function(){return this.historyIndex<this.history.count-\n1?this.history.J(this.historyIndex+1):null}},isUndoingRedoing:{get:function(){return this.se}},history:{get:function(){return this.I}},maxHistoryLength:{get:function(){return this.u},set:function(a){this.u=a}},historyIndex:{get:function(){return this.Xd}},currentTransaction:{get:function(){return this.Lr}},transactionLevel:{\nget:function(){return this.Yi}},isInTransaction:{get:function(){return 0<this.Yi}},checksTransactionLevel:{get:function(){return this.l},set:function(a){this.l=a}},nestedTransactionNames:{get:function(){return this.ye}},isPendingClear:{get:function(){return this.Zu},set:function(a){this.Zu=a}},isPendingUnmodified:{get:function(){return this.$u},set:function(a){this.$u=\na}},isInternalTransaction:{get:function(){return this.Wu},set:function(a){this.Wu=a}},isJustDiscarded:{get:function(){return this.ks}}});Ce.prototype.handleChanged=Ce.prototype.aw;Ce.prototype.redo=Ce.prototype.redo;Ce.prototype.undo=Ce.prototype.undo;Ce.prototype.canUndo=Ce.prototype.canUndo;Ce.prototype.rollbackTransaction=Ce.prototype.If;Ce.prototype.commitTransaction=Ce.prototype.Xa;Ce.prototype.startTransaction=Ce.prototype.va;\nCe.prototype.removeModel=Ce.prototype.Py;Ce.prototype.addModel=Ce.prototype.Vx;Ce.prototype.clear=Ce.prototype.clear;Ce.className=\"UndoManager\";function Ee(){Xa(this);this.C=Fe;this.oa=\"\";this.md=!0;this.Sc=!1;this.ix=null;this.lz=new me;this.vt=-1}Ee.prototype.toString=function(){return\"\"!==this.name?this.name+\" Tool\":Ja(this.constructor)};Ee.prototype.updateAdornments=function(){};Ee.prototype.canStart=function(){return this.isEnabled};Ee.prototype.doStart=function(){};\nEe.prototype.doActivate=function(){this.isActive=!0};Ee.prototype.doDeactivate=function(){this.isActive=!1};Ee.prototype.doStop=function(){};Ee.prototype.doCancel=function(){this.transactionResult=null;this.stopTool()};Ee.prototype.stopTool=function(){var a=this.diagram;a.currentTool===this&&(a.currentTool=null,a.currentCursor=\"\")};Ee.prototype.doMouseDown=function(){!this.isActive&&this.canStart()&&this.doActivate()};Ee.prototype.doMouseMove=function(){};Ee.prototype.doMouseUp=function(){this.stopTool()};\nEe.prototype.doMouseWheel=function(){};Ee.prototype.canStartMultiTouch=function(){return!0};Ee.prototype.standardPinchZoomStart=function(){var a=this.diagram,b=a.lastInput,c=b.Jq(0,J.allocAt(NaN,NaN)),d=b.Jq(1,J.allocAt(NaN,NaN));if(c.s()&&d.s()&&(this.doCancel(),a.Bm(\"hasGestureZoom\"))){a.Vl=a.scale;var e=d.x-c.x,f=d.y-c.y;a.sv=Math.sqrt(e*e+f*f);b.bubbles=!1}J.free(c);J.free(d)};\nEe.prototype.standardPinchZoomMove=function(){var a=this.diagram,b=a.lastInput,c=b.Jq(0,J.allocAt(NaN,NaN)),d=b.Jq(1,J.allocAt(NaN,NaN));if(c.s()&&d.s()&&(this.doCancel(),a.Bm(\"hasGestureZoom\"))){var e=d.x-c.x,f=d.y-c.y;f=Math.sqrt(e*e+f*f)/a.sv;e=new J((Math.min(d.x,c.x)+Math.max(d.x,c.x))/2,(Math.min(d.y,c.y)+Math.max(d.y,c.y))/2);f*=a.Vl;var g=a.commandHandler;if(f!==a.scale&&g.canResetZoom(f)){var h=a.zoomPoint;a.zoomPoint=e;g.resetZoom(f);a.zoomPoint=h}b.bubbles=!1}J.free(c);J.free(d)};\nEe.prototype.doKeyDown=function(){\"Esc\"===this.diagram.lastInput.key&&this.doCancel()};Ee.prototype.doKeyUp=function(){};Ee.prototype.va=function(a){void 0===a&&(a=this.name);this.transactionResult=null;return this.diagram.va(a)};Ee.prototype.Jg=function(){var a=this.diagram;return null===this.transactionResult?a.If():a.Xa(this.transactionResult)};\nEe.prototype.standardMouseSelect=function(){var a=this.diagram;if(a.allowSelect){var b=a.lastInput,c=a.zm(b.documentPoint,!1);if(null!==c)if(Va?b.meta:b.control){a.R(\"ChangingSelection\",a.selection);for(b=c;null!==b&&!b.canSelect();)b=b.containingGroup;null!==b&&(b.isSelected=!b.isSelected);a.R(\"ChangedSelection\",a.selection)}else if(b.shift){if(!c.isSelected){a.R(\"ChangingSelection\",a.selection);for(b=c;null!==b&&!b.canSelect();)b=b.containingGroup;null!==b&&(b.isSelected=!0);a.R(\"ChangedSelection\",\na.selection)}}else{if(!c.isSelected){for(b=c;null!==b&&!b.canSelect();)b=b.containingGroup;null!==b&&a.select(b)}}else!b.left||(Va?b.meta:b.control)||b.shift||a.clearSelection()}};Ee.prototype.standardMouseClick=function(a,b){void 0===a&&(a=null);void 0===b&&(b=function(a){return!a.layer.isTemporary});var c=this.diagram,d=c.lastInput;a=c.Vb(d.documentPoint,a,b);d.targetObject=a;Ge(a,d,c);return d.handled};\nfunction Ge(a,b,c){b.handled=!1;if(null===a||a.Hg()){var d=0;b.left?d=1===b.clickCount?1:2===b.clickCount?2:1:b.right&&1===b.clickCount&&(d=3);var e=\"ObjectSingleClicked\";if(null!==a){switch(d){case 1:e=\"ObjectSingleClicked\";break;case 2:e=\"ObjectDoubleClicked\";break;case 3:e=\"ObjectContextClicked\"}0!==d&&c.R(e,a)}else{switch(d){case 1:e=\"BackgroundSingleClicked\";break;case 2:e=\"BackgroundDoubleClicked\";break;case 3:e=\"BackgroundContextClicked\"}0!==d&&c.R(e)}if(null!==a)for(;null!==a;){c=null;switch(d){case 1:c=\na.click;break;case 2:c=a.doubleClick?a.doubleClick:a.click;break;case 3:c=a.contextClick}if(null!==c&&(c(b,a),b.handled))break;a=a.panel}else{a=null;switch(d){case 1:a=c.click;break;case 2:a=c.doubleClick?c.doubleClick:c.click;break;case 3:a=c.contextClick}null!==a&&a(b)}}}\nEe.prototype.standardMouseOver=function(){var a=this.diagram,b=a.lastInput;if(!0!==a.animationManager.sc){var c=a.skipsUndoManager;a.skipsUndoManager=!0;var d=a.viewportBounds.$(b.documentPoint)?a.Vb(b.documentPoint,null,null):null;b.targetObject=d;var e=!1;if(d!==a.Ej){var f=a.Ej,g=f;a.Ej=d;this.doCurrentObjectChanged(f,d);for(b.handled=!1;null!==f;){var h=f.mouseLeave;if(null!==h){if(d===f)break;if(null!==d&&d.Gg(f))break;h(b,f,d);e=!0;if(b.handled)break}f=f.panel}f=g;for(b.handled=!1;null!==d;){g=\nd.mouseEnter;if(null!==g){if(f===d)break;if(null!==f&&f.Gg(d))break;g(b,d,f);e=!0;if(b.handled)break}d=d.panel}d=a.Ej}if(null!==d){f=d;for(g=\"\";null!==f;){g=f.cursor;if(\"\"!==g)break;f=f.panel}a.currentCursor=g;b.handled=!1;for(f=d;null!==f;){d=f.mouseOver;if(null!==d&&(d(b,f),e=!0,b.handled))break;f=f.panel}}else a.currentCursor=\"\",d=a.mouseOver,null!==d&&(d(b),e=!0);e&&a.Db();a.skipsUndoManager=c}};Ee.prototype.doCurrentObjectChanged=function(){};\nEe.prototype.standardMouseWheel=function(){var a=this.diagram,b=a.lastInput,c=b.delta;if(0!==c&&a.documentBounds.s()){var d=a.commandHandler,e=a.toolManager.mouseWheelBehavior;if(null!==d&&(e===He&&!b.shift||e===Ie&&b.control)){if(0<c?d.canIncreaseZoom():d.canDecreaseZoom())e=a.zoomPoint,a.zoomPoint=b.viewPoint,0<c?d.increaseZoom():d.decreaseZoom(),a.zoomPoint=e;b.bubbles=!1}else if(e===He&&b.shift||e===Ie&&!b.control){d=a.position.copy();var f=0<c?c:-c,g=b.event,h=g.deltaMode;e=g.deltaX;g=g.deltaY;\nif(Sa||Ta||Ua)h=1,0<e&&(e=3),0>e&&(e=-3),0<g&&(g=3),0>g&&(g=-3);if(void 0===h||void 0===e||void 0===g||0===e&&0===g||b.shift)!b.shift&&a.allowVerticalScroll?(f=3*f*a.scrollVerticalLineChange,0<c?a.scroll(\"pixel\",\"up\",f):a.scroll(\"pixel\",\"down\",f)):b.shift&&a.allowHorizontalScroll&&(f=3*f*a.scrollHorizontalLineChange,0<c?a.scroll(\"pixel\",\"left\",f):a.scroll(\"pixel\",\"right\",f));else{switch(h){case 0:c=\"pixel\";break;case 1:c=\"line\";break;case 2:c=\"page\";break;default:c=\"pixel\"}0!==e&&a.allowHorizontalScroll&&\n(e*=a.scrollHorizontalLineChange/16,0<e?a.scroll(c,\"left\",-e):a.scroll(c,\"right\",e));0!==g&&a.allowVerticalScroll&&(g*=a.scrollVerticalLineChange/16,0<g?a.scroll(c,\"up\",-g):a.scroll(c,\"down\",g))}a.position.w(d)||(b.bubbles=!1)}}};Ee.prototype.standardWaitAfter=function(a,b){void 0===b&&(b=this.diagram.lastInput);this.cancelWaitAfter();var c=this,d=b.clone(this.lz);this.vt=ta(function(){c.doWaitAfter(d)},a)};Ee.prototype.cancelWaitAfter=function(){-1!==this.vt&&x.clearTimeout(this.vt);this.vt=-1};\nEe.prototype.doWaitAfter=function(){};Ee.prototype.findToolHandleAt=function(a,b){a=this.diagram.Vb(a,function(a){for(;null!==a&&!(a.panel instanceof Je);)a=a.panel;return a});return null===a?null:a.part.category===b?a:null};Ee.prototype.isBeyondDragSize=function(a,b){var c=this.diagram;void 0===a&&(a=c.firstInput.viewPoint);void 0===b&&(b=c.lastInput.viewPoint);var d=c.toolManager.dragSize,e=d.width;d=d.height;c.firstInput.isTouchEvent&&(e+=6,d+=6);return Math.abs(b.x-a.x)>e||Math.abs(b.y-a.y)>d};\nna.Object.defineProperties(Ee.prototype,{diagram:{get:function(){return this.C},set:function(a){a instanceof R&&(this.C=a)}},name:{get:function(){return this.oa},set:function(a){this.oa=a}},isEnabled:{get:function(){return this.md},set:function(a){this.md=a}},isActive:{get:function(){return this.Sc},set:function(a){this.Sc=a}},transactionResult:{get:function(){return this.ix},\nset:function(a){this.ix=a}}});Ee.prototype.stopTransaction=Ee.prototype.Jg;Ee.prototype.startTransaction=Ee.prototype.va;Ee.className=\"Tool\";function Pa(){Ee.call(this);this.name=\"ToolManager\";this.Cc=new E;this.Tc=new E;this.Od=new E;this.T=this.Ka=850;this.u=(new M(2,2)).ca();this.eb=5E3;this.La=Ie;this.I=Ke;this.Kr=this.l=null;this.ik=-1}ma(Pa,Ee);Pa.prototype.initializeStandardTools=function(){};\nPa.prototype.updateAdornments=function(a){var b=this.currentToolTip;if(b instanceof Je&&this.Kr===a){var c=b.adornedObject;(null!==a?c.part===a:null===c)?this.showToolTip(b,c):this.hideToolTip()}};\nPa.prototype.doMouseDown=function(){var a=this.diagram,b=a.lastInput;b.isTouchEvent&&this.gestureBehavior===Qe&&(b.bubbles=!1);if(b.isMultiTouch){this.cancelWaitAfter();if(this.gestureBehavior===Re){b.bubbles=!0;return}if(this.gestureBehavior===Qe)return;if(a.currentTool.canStartMultiTouch()){a.currentTool.standardPinchZoomStart();return}}for(var c=this.mouseDownTools.length,d=0;d<c;d++){var e=this.mouseDownTools.J(d);e.diagram=this.diagram;if(e.canStart()){a.doFocus();a.currentTool=e;a.currentTool===\ne&&(e.isActive||e.doActivate(),e.doMouseDown());return}}1===a.lastInput.button&&(this.mouseWheelBehavior===Ie?this.mouseWheelBehavior=He:this.mouseWheelBehavior===He&&(this.mouseWheelBehavior=Ie));this.doActivate();this.standardWaitAfter(this.holdDelay,b)};\nPa.prototype.doMouseMove=function(){var a=this.diagram,b=a.lastInput;if(b.isMultiTouch){if(this.gestureBehavior===Re){b.bubbles=!0;return}if(this.gestureBehavior===Qe)return;if(a.currentTool.canStartMultiTouch()){a.currentTool.standardPinchZoomMove();return}}if(this.isActive)for(var c=this.mouseMoveTools.length,d=0;d<c;d++){var e=this.mouseMoveTools.J(d);e.diagram=this.diagram;if(e.canStart()){a.doFocus();a.currentTool=e;a.currentTool===e&&(e.isActive||e.doActivate(),e.doMouseMove());return}}Se(this,\na);a=b.event;null===a||\"mousemove\"!==a.type&&\"pointermove\"!==a.type&&a.cancelable||(b.bubbles=!0)};function Se(a,b){a.standardMouseOver();a.isBeyondDragSize()&&a.standardWaitAfter(a.isActive?a.holdDelay:a.hoverDelay,b.lastInput)}Pa.prototype.doCurrentObjectChanged=function(a,b){a=this.currentToolTip;null===a||null!==b&&a instanceof Je&&(b===a||b.Gg(a))||this.hideToolTip()};\nPa.prototype.doWaitAfter=function(a){var b=this.diagram;b.wa&&(this.doMouseHover(),this.isActive||this.doToolTip(),a.isTouchEvent&&!b.lastInput.handled&&(a=a.copy(),a.button=2,a.buttons=2,b.lastInput=a,b.hk=!0,b.doMouseUp()))};\nPa.prototype.doMouseHover=function(){var a=this.diagram,b=a.lastInput;null===b.targetObject&&(b.targetObject=a.Vb(b.documentPoint,null,null));var c=b.targetObject;if(null!==c)for(b.handled=!1;null!==c;){a=this.isActive?c.mouseHold:c.mouseHover;if(null!==a&&(a(b,c),b.handled))break;c=c.panel}else c=this.isActive?a.mouseHold:a.mouseHover,null!==c&&c(b)};\nPa.prototype.doToolTip=function(){var a=this.diagram,b=a.lastInput;null===b.targetObject&&(b.targetObject=a.Vb(b.documentPoint,null,null));b=b.targetObject;if(null!==b){if(a=this.currentToolTip,!(a instanceof Je)||b!==a&&!b.Gg(a)){for(;null!==b;){a=b.toolTip;if(null!==a){this.showToolTip(a,b);return}b=b.panel}this.hideToolTip()}}else b=a.toolTip,null!==b?this.showToolTip(b,null):this.hideToolTip()};\nPa.prototype.showToolTip=function(a,b){var c=this.diagram;a!==this.currentToolTip&&this.hideToolTip();if(a instanceof Je){a.layerName=\"Tool\";a.selectable=!1;a.scale=1/c.scale;a.category=\"ToolTip\";null!==a.placeholder&&(a.placeholder.scale=c.scale);var d=a.diagram;null!==d&&d!==c&&d.remove(a);c.add(a);null!==b?a.adornedObject=b:a.data=c.model;a.Ta();this.positionToolTip(a,b)}else a instanceof Te&&a!==this.currentToolTip&&a.show(b,c,this);this.currentToolTip=a;-1!==this.ik&&(x.clearTimeout(this.ik),\nthis.ik=-1);a=this.toolTipDuration;if(0<a&&Infinity!==a){var e=this;this.ik=ta(function(){e.hideToolTip()},a)}};Pa.prototype.positionToolTip=function(a){if(null===a.placeholder){var b=this.diagram,c=b.lastInput.documentPoint.copy(),d=a.measuredBounds,e=b.viewportBounds;b.lastInput.isTouchEvent&&(c.x-=d.width);c.x+d.width>e.right&&(c.x-=d.width+5/b.scale);c.x<e.x&&(c.x=e.x);c.y=c.y+20/b.scale+d.height>e.bottom?c.y-(d.height+5/b.scale):c.y+20/b.scale;c.y<e.y&&(c.y=e.y);a.position=c}};\nPa.prototype.hideToolTip=function(){-1!==this.ik&&(x.clearTimeout(this.ik),this.ik=-1);var a=this.diagram,b=this.currentToolTip;null!==b&&(b instanceof Je?(a.remove(b),null!==this.Kr&&this.Kr.Hf(b.category),b.data=null,b.adornedObject=null):b instanceof Te&&null!==b.hide&&b.hide(a,this),this.currentToolTip=null)};\nPa.prototype.doMouseUp=function(){this.cancelWaitAfter();var a=this.diagram;if(this.isActive)for(var b=this.mouseUpTools.length,c=0;c<b;c++){var d=this.mouseUpTools.J(c);d.diagram=this.diagram;if(d.canStart()){a.doFocus();a.currentTool=d;a.currentTool===d&&(d.isActive||d.doActivate(),d.doMouseUp());return}}a.doFocus();this.doDeactivate()};Pa.prototype.doMouseWheel=function(){this.standardMouseWheel()};Pa.prototype.doKeyDown=function(){var a=this.diagram;null!==a.commandHandler&&a.commandHandler.doKeyDown()};\nPa.prototype.doKeyUp=function(){var a=this.diagram;null!==a.commandHandler&&a.commandHandler.doKeyUp()};Pa.prototype.findTool=function(a){for(var b=this.mouseDownTools.length,c=0;c<b;c++){var d=this.mouseDownTools.J(c);if(d.name===a)return d}b=this.mouseMoveTools.length;for(c=0;c<b;c++)if(d=this.mouseMoveTools.J(c),d.name===a)return d;b=this.mouseUpTools.length;for(c=0;c<b;c++)if(d=this.mouseUpTools.J(c),d.name===a)return d;return null};\nPa.prototype.replaceTool=function(a,b){null!==b&&(b.diagram=this.diagram);for(var c=this.mouseDownTools.length,d=0;d<c;d++){var e=this.mouseDownTools.J(d);if(e.name===a)return null!==b?this.mouseDownTools.Pc(d,b):this.mouseDownTools.cb(d),e}c=this.mouseMoveTools.length;for(d=0;d<c;d++)if(e=this.mouseMoveTools.J(d),e.name===a)return null!==b?this.mouseMoveTools.Pc(d,b):this.mouseMoveTools.cb(d),e;c=this.mouseUpTools.length;for(d=0;d<c;d++)if(e=this.mouseUpTools.J(d),e.name===a)return null!==b?this.mouseUpTools.Pc(d,\nb):this.mouseUpTools.cb(d),e;return null};Pa.prototype.Ya=function(a,b,c){null!==b&&(b.name=a,b.diagram=this.diagram);this.findTool(a)?this.replaceTool(a,b):null!==b&&c.add(b)};\nna.Object.defineProperties(Pa.prototype,{mouseWheelBehavior:{get:function(){return this.La},set:function(a){this.La=a}},gestureBehavior:{get:function(){return this.I},set:function(a){this.I=a}},currentToolTip:{get:function(){return this.l},set:function(a){this.l=a;this.Kr=null!==a&&a instanceof Je?a.adornedPart:null}},mouseDownTools:{get:function(){return this.Cc}},mouseMoveTools:{\nget:function(){return this.Tc}},mouseUpTools:{get:function(){return this.Od}},hoverDelay:{get:function(){return this.Ka},set:function(a){this.Ka=a}},holdDelay:{get:function(){return this.T},set:function(a){this.T=a}},dragSize:{get:function(){return this.u},set:function(a){this.u=a.H()}},toolTipDuration:{get:function(){return this.eb},set:function(a){this.eb=\na}}});Pa.prototype.replaceStandardTool=Pa.prototype.Ya;var Ie=new D(Pa,\"WheelScroll\",0),He=new D(Pa,\"WheelZoom\",1),Ue=new D(Pa,\"WheelNone\",2),Ke=new D(Pa,\"GestureZoom\",3),Qe=new D(Pa,\"GestureCancel\",4),Re=new D(Pa,\"GestureNone\",5);Pa.className=\"ToolManager\";Pa.WheelScroll=Ie;Pa.WheelZoom=He;Pa.WheelNone=Ue;Pa.GestureZoom=Ke;Pa.GestureCancel=Qe;Pa.GestureNone=Re;\nfunction Ve(){Ee.call(this);this.name=\"Dragging\";this.I=this.Tc=!0;this.u=this.eb=this.Ka=this.qg=null;this.Tn=this.Od=!1;this.jm=new J(NaN,NaN);this.it=new J;this.Cc=!0;this.pl=100;this.Xg=[];this.lr=(new G).freeze();this.La=new We;this.Fo=null;this.T=\"copy\";this.Wh=\"\";this.Xh=\"no-drop\"}ma(Ve,Ee);\nVe.prototype.canStart=function(){if(!this.isEnabled)return!1;var a=this.diagram;if(a.isReadOnly&&!a.allowDragOut||!a.allowMove&&!a.allowCopy&&!a.allowDragOut||!a.allowSelect)return!1;var b=a.lastInput;return!b.left||a.currentTool!==this&&(!this.isBeyondDragSize()||b.isTouchEvent&&b.timestamp-a.firstInput.timestamp<this.pl)?!1:null!==this.findDraggablePart()};\nVe.prototype.findDraggablePart=function(){var a=this.diagram;a=a.zm(a.firstInput.documentPoint,!1);if(null===a)return null;for(;null!==a&&!a.canSelect();)a=a.containingGroup;return null!==a&&(a.canMove()||a.canCopy())?a:null};\nVe.prototype.standardMouseSelect=function(){var a=this.diagram;if(a.allowSelect){var b=a.zm(a.firstInput.documentPoint,!1);if(null!==b){for(;null!==b&&!b.canSelect();)b=b.containingGroup;this.currentPart=b;null===this.currentPart||this.currentPart.isSelected||(a.R(\"ChangingSelection\",a.selection),b=a.lastInput,(Va?b.meta:b.control)||b.shift||a.clearSelection(!0),this.currentPart.isSelected=!0,a.R(\"ChangedSelection\",a.selection))}}};\nVe.prototype.doActivate=function(){var a=this.diagram;this.Fo=null;null===this.currentPart&&this.standardMouseSelect();var b=this.currentPart;null!==b&&(b.canMove()||b.canCopy())&&(Xe=null,this.isActive=!0,this.jm.set(a.position),Ye(this,a.selection),this.Xg.length=0,a.animationManager.Bc(),this.draggedParts=this.computeEffectiveCollection(a.selection,this.dragOptions),a.mu=!0,!0===a.Ke(\"temporaryPixelRatio\")&&30<a.Yx&&Ze(a),$e(a,this.draggedParts),this.va(\"Drag\"),this.startPoint=a.firstInput.documentPoint,\na.isMouseCaptured=!0,a.allowDragOut&&(this.isDragOutStarted=!0,this.Tn=!1,Xe=this,af=this.diagram,this.doSimulatedDragOut()))};function Ye(a,b){if(a.dragsLink){var c=a.diagram;c.allowRelink&&(c.model.Ck()&&1===b.count&&b.first()instanceof S?(a.draggedLink=b.first(),a.draggedLink.canRelinkFrom()&&a.draggedLink.canRelinkTo()&&a.draggedLink.nk(),a.qg=c.toolManager.findTool(\"Relinking\"),null===a.qg&&(a.qg=new bf,a.qg.diagram=c)):(a.draggedLink=null,a.qg=null))}}\nVe.prototype.computeEffectiveCollection=function(a,b){return this.diagram.commandHandler.computeEffectiveCollection(a,b)};Ve.prototype.Cd=function(a){return void 0===a?new cf(Bb):this.isGridSnapEnabled?new cf(new J(Math.round(1E3*a.x)/1E3,Math.round(1E3*a.y)/1E3)):new cf(a.copy())};\nVe.prototype.doDeactivate=function(){this.isActive=!1;var a=this.diagram;a.Jf();df(this);ef(a,this.draggedParts);this.draggedParts=this.currentPart=this.Fo=null;this.Tn=this.isDragOutStarted=!1;if(0<jf.count){for(var b=jf,c=b.length,d=0;d<c;d++){var e=b.J(d);kf(e);lf(e);df(e);e.diagram.Jf()}b.clear()}kf(this);this.jm.h(NaN,NaN);Xe=af=null;lf(this);a.isMouseCaptured=!1;a.currentCursor=\"\";a.mu=!1;this.Jg();mf(a,!0)};\nfunction df(a){var b=a.diagram,c=b.skipsUndoManager;b.skipsUndoManager=!0;nf(a,b.lastInput,null);b.skipsUndoManager=c;a.Xg.length=0}function of(){var a=Xe;lf(a);pf(a);var b=a.diagram;a.jm.s()&&(b.position=a.jm);b.Jf()}Ve.prototype.doCancel=function(){lf(this);pf(this);var a=this.diagram;this.jm.s()&&(a.position=this.jm);this.stopTool()};Ve.prototype.doKeyDown=function(){var a=this.diagram,b=a.lastInput;this.isActive&&(\"Esc\"===b.key?this.doCancel():b.key!==a.previousInput.key&&this.doMouseMove())};\nVe.prototype.doKeyUp=function(){this.isActive&&this.doMouseMove()};\nfunction qf(a,b){if(null===a.copiedParts){var c=a.diagram;if((!b||!c.isReadOnly&&!c.isModelReadOnly)&&null!==a.draggedParts){var d=c.undoManager;d.isEnabled&&d.isInTransaction?null!==d.currentTransaction&&0<d.currentTransaction.changes.count&&(c.undoManager.If(),c.va(\"Drag\")):pf(a);c.skipsUndoManager=!b;c.partManager.addsToTemporaryLayer=!b;a.startPoint=c.firstInput.documentPoint;b=a.copiesEffectiveCollection?a.draggedParts.Kf():c.selection;b=c.tk(b,c,!0);c=new H;for(d=a.draggedParts.iterator;d.next();){var e=\nd.key;if(e.Nc()&&e.canCopy()){var f=b.G(e);null!==f&&(f.location=e.location,f.Ta(),c.add(f,a.Cd(f.location)))}}for(b=b.iterator;b.next();)d=b.value,d instanceof S&&d.canCopy()&&c.add(d,a.Cd());a.copiedParts=c;Ye(a,c.Kf());null!==a.draggedLink&&(c=a.draggedLink,b=c.routeBounds,rf(c,a.startPoint.x-(b.x+b.width/2),a.startPoint.y-(b.y+b.height/2)))}}}\nfunction lf(a){var b=a.diagram;if(null!==a.copiedParts&&(b.gu(a.copiedParts.Kf(),!1),a.copiedParts=null,null!==a.draggedParts))for(var c=a.draggedParts.iterator;c.next();)c.key instanceof S&&(c.value.point=new J(0,0));b.skipsUndoManager=!1;b.partManager.addsToTemporaryLayer=!1;a.startPoint=b.firstInput.documentPoint}\nfunction kf(a){if(null!==a.draggedLink){if(a.dragsLink&&null!==a.qg){var b=a.qg;b.diagram.remove(b.temporaryFromNode);b.diagram.remove(b.temporaryToNode)}a.draggedLink=null;a.qg=null}}function sf(a,b,c){var d=a.diagram,e=a.startPoint,f=J.alloc();f.assign(d.lastInput.documentPoint);a.moveParts(b,f.ge(e),c);J.free(f);!0===d.Ke(\"temporaryPixelRatio\")&&null===d.yh&&30<d.Yx&&(Ze(d),d.Yq())}\nVe.prototype.moveParts=function(a,b,c){void 0===c&&(c=!1);var d=this.diagram;null!==d&&tf(d,a,b,this.dragOptions,c)};function pf(a){if(null!==a.draggedParts){for(var b=a.diagram,c=a.draggedParts.iterator;c.next();){var d=c.key;d.Nc()&&(d.location=c.value.point)}for(c=a.draggedParts.iterator;c.next();)if(d=c.key,d instanceof S&&d.suspendsRouting){var e=c.value.point;a.draggedParts.add(d,a.Cd());rf(d,-e.x,-e.y)}b.hd()}}\nfunction uf(a,b){var c=a.diagram;a.dragsLink&&(null!==a.draggedLink&&(a.draggedLink.fromNode=null,a.draggedLink.toNode=null),vf(a,!1));var d=a.findDragOverObject(b),e=c.lastInput;e.targetObject=d;a.doUpdateCursor(d);var f=c.skipsUndoManager,g=!1;try{c.skipsUndoManager=!0;g=nf(a,e,d);if(!a.isActive&&null===Xe)return;var h=null!==d?d.part:null;if(null===h||c.handlesDragDropForTopLevelParts&&h.isTopLevel&&!(h instanceof U)){var k=c.mouseDragOver;null!==k&&(k(e),g=!0)}if(!a.isActive&&null===Xe)return;\na.doDragOver(b,d);if(!a.isActive&&null===Xe)return}finally{c.skipsUndoManager=f,g&&c.hd()}a.Fo=d;c.isReadOnly||!c.allowMove&&!c.allowCopy||!c.allowHorizontalScroll&&!c.allowVerticalScroll||c.Et(e.viewPoint)}Ve.prototype.findDragOverObject=function(a){var b=this;return wf(this.diagram,a,null,function(a){null===a?a=!0:(a=a.part,a=null===a||a instanceof Je||a.layer.isTemporary||b.draggedParts&&b.draggedParts.contains(a)||b.copiedParts&&b.copiedParts.contains(a)?!0:!1);return!a})};\nVe.prototype.doUpdateCursor=function(a){var b=this.diagram;this.Fo!==a&&(!this.diagram.currentTool.isActive||this.mayCopy()?b.currentCursor=this.copyCursor:this.mayMove()?b.currentCursor=this.moveCursor:this.mayDragOut()&&(b.currentCursor=this.nodropCursor))};\nfunction nf(a,b,c){var d=!1,e=a.Xg.length,f=0<e?a.Xg[0]:null;if(c===f)return!1;b.handled=!1;for(var g=0;g<e;g++){var h=a.Xg[g],k=h.mouseDragLeave;if(null!==k&&(k(b,h,c),d=!0,b.handled))break}a.Xg.length=0;if(!a.isActive&&null===Xe||null===c)return d;b.handled=!1;for(e=c;null!==e;)a.Xg.push(e),e=xf(e);e=a.Xg.length;for(c=0;c<e&&(g=a.Xg[c],h=g.mouseDragEnter,null===h||(h(b,g,f),d=!0,!b.handled));c++);return d}\nfunction xf(a){var b=a.panel;return null!==b?b:a instanceof V&&!(a instanceof U)&&(a=a.containingGroup,null!==a&&a.handlesDragDropForMembers)?a:null}function yf(a,b,c){var d=a.qg;if(null===d)return null;var e=a.diagram.Eg(b,d.portGravity,function(a){return d.findValidLinkablePort(a,c)});a=J.alloc();var f=Infinity,g=null;for(e=e.iterator;e.next();){var h=e.value;if(null!==h.part){var k=h.da(zc,a);k=b.Ie(k);k<f&&(g=h,f=k)}}J.free(a);return g}\nfunction vf(a,b){var c=a.draggedLink;if(null!==c&&!(2>c.pointsCount)){var d=a.diagram;if(!d.isReadOnly){var e=a.qg;if(null!==e){var f=null,g=null;null===c.fromNode&&(f=yf(a,c.i(0),!1),null!==f&&(g=f.part));var h=null,k=null;null===c.toNode&&(h=yf(a,c.i(c.pointsCount-1),!0),null!==h&&(k=h.part));e.isValidLink(g,f,k,h)?b?(c.defaultFromPoint=c.i(0),c.defaultToPoint=c.i(c.pointsCount-1),c.suspendsRouting=!1,c.fromNode=g,null!==f&&(c.fromPortId=f.portId),c.toNode=k,null!==h&&(c.toPortId=h.portId),c.fromPort!==\nd.Ky&&d.R(\"LinkRelinked\",c,d.Ky),c.toPort!==d.Ly&&d.R(\"LinkRelinked\",c,d.Ly)):zf(e,g,f,k,h):zf(e,null,null,null,null)}}}}Ve.prototype.doDragOver=function(){};\nfunction Af(a,b){var c=a.diagram;a.dragsLink&&vf(a,!0);df(a);var d=a.findDragOverObject(b),e=c.lastInput;e.targetObject=d;if(null!==d){e.handled=!1;for(var f=d;null!==f;){var g=f.mouseDrop;if(null!==g&&(g(e,f),e.handled))break;Bf(a,e,f);f=xf(f)}}else f=c.mouseDrop,null!==f&&f(e);if(a.isActive||null!==Xe){for(e=(a.copiedParts||a.draggedParts).iterator;e.next();)f=e.key,f instanceof W&&f.linksConnected.each(function(a){a.suspendsRouting=!1});a.doDropOnto(b,d);if(a.isActive||null!==Xe){a=N.alloc();for(b=\nc.selection.iterator;b.next();)d=b.value,d instanceof W&&Cf(c,d,a);N.free(a)}}}function Bf(a,b,c){a=a.diagram;c=c.part;!a.handlesDragDropForTopLevelParts||!c.isTopLevel||c instanceof U||(c=a.mouseDrop,null!==c&&c(b))}function Cf(a,b,c){var d=!1;b.getAvoidableRect(c);a.viewportBounds.Ge(c)&&(d=!0);a=a.Vv(c,function(a){return a.part},function(a){return a instanceof S},!0,function(a){return a instanceof S},d);if(0!==a.count)for(a=a.iterator;a.next();)c=a.value,!c.Kd(b)&&c.isAvoiding&&c.Ua()}\nVe.prototype.doDropOnto=function(){};Ve.prototype.doMouseMove=function(){if(this.isActive){var a=this.diagram,b=a.lastInput;this.simulatedMouseMove(b.event,b.documentPoint,b.targetDiagram)||null===this.currentPart||null===this.draggedParts||(this.mayCopy()?(qf(this,!1),$e(a,this.copiedParts),sf(this,this.copiedParts,!1),ef(a,this.copiedParts)):this.mayMove()?(lf(this),sf(this,this.draggedParts,!0)):this.mayDragOut()?(qf(this,!1),sf(this,this.copiedParts,!1)):lf(this),uf(this,a.lastInput.documentPoint))}};\nVe.prototype.doMouseUp=function(){if(this.isActive){var a=this.diagram,b=a.lastInput;if(!this.simulatedMouseUp(b.event,b.documentPoint,b.targetDiagram)){b=!1;var c=this.mayCopy();c&&null!==this.copiedParts?(lf(this),qf(this,!0),$e(a,this.copiedParts),sf(this,this.copiedParts,!1),ef(a,this.copiedParts),null!==this.copiedParts&&(a.R(\"ChangingSelection\",a.selection),a.clearSelection(!0),this.copiedParts.iteratorKeys.each(function(a){a.isSelected=!0}))):(b=!0,lf(this),this.mayMove()&&(sf(this,this.draggedParts,\n!0),uf(this,a.lastInput.documentPoint)));this.Tn=!0;Af(this,a.lastInput.documentPoint);if(this.isActive){var d=c?this.copiedParts.Kf():this.draggedParts.Kf();this.copiedParts=null;b&&Df(this);a.Na();ef(a,this.draggedParts);this.transactionResult=c?\"Copy\":\"Move\";a.R(c?\"SelectionCopied\":\"SelectionMoved\",d)}this.stopTool();c&&a.R(\"ChangedSelection\",a.selection)}}};\nVe.prototype.simulatedMouseMove=function(a,b,c){if(null===Xe)return!1;var d=Xe.diagram;c instanceof R||(c=null);var e=af;c!==e&&(null!==e&&e!==d&&(e.Jf(),Xe.isDragOutStarted=!1,e=e.toolManager.findTool(\"Dragging\"),null!==e&&e.doSimulatedDragLeave()),af=c,null!==c&&c!==d&&(of(),e=c.toolManager.findTool(\"Dragging\"),null!==e&&(jf.contains(e)||jf.add(e),e.doSimulatedDragEnter())));if(null===c||c===d||!c.allowDrop||c.isReadOnly||!c.allowInsert)return!1;d=c.toolManager.findTool(\"Dragging\");null!==d&&(null!==\na&&(void 0!==a.targetTouches&&(0<a.targetTouches.length?a=a.targetTouches[0]:0<a.changedTouches.length&&(a=a.changedTouches[0])),b=c.getMouse(a)),c.lastInput.documentPoint=b,c.lastInput.viewPoint=c.gr(b),c.lastInput.down=!1,c.lastInput.up=!1,d.doSimulatedDragOver());return!0};\nVe.prototype.simulatedMouseUp=function(a,b,c){if(null===Xe)return!1;var d=af,e=Xe.diagram;if(null===c)return Xe.doCancel(),!0;if(c!==d){var f=d.toolManager.findTool(\"Dragging\");if(null!==d&&d!==e&&null!==f)return d.Jf(),Xe.isDragOutStarted=!1,f.doSimulatedDragLeave(),!1;af=c;d=c.toolManager.findTool(\"Dragging\");null!==d&&(of(),jf.contains(d)||jf.add(d),d.doSimulatedDragEnter())}return c!==this.diagram?(null!==a?(void 0!==a.targetTouches&&(0<a.targetTouches.length?a=a.targetTouches[0]:0<a.changedTouches.length&&\n(a=a.changedTouches[0])),b=c.getMouse(a)):null===b&&(b=new J),c.lastInput.documentPoint=b,c.lastInput.viewPoint=c.gr(b),c.lastInput.down=!1,c.lastInput.up=!0,a=c.toolManager.findTool(\"Dragging\"),null!==a&&a.doSimulatedDrop(),a=Xe,null!==a&&(c=a.mayCopy(),a.transactionResult=c?\"Copy\":\"Move\",a.stopTool()),!0):!1};\nfunction Df(a){if(null!==a.draggedParts)for(var b=a.draggedParts.iterator;b.next();){var c=b.key;c instanceof W&&(c=c.containingGroup,null===c||null===c.placeholder||a.draggedParts.contains(c)||c.placeholder.o())}}\nVe.prototype.mayCopy=function(){if(!this.isCopyEnabled)return!1;var a=this.diagram;if(a.isReadOnly||a.isModelReadOnly||!a.allowInsert||!a.allowCopy||(Va?!a.lastInput.alt:!a.lastInput.control))return!1;for(a=a.selection.iterator;a.next();)if(a.value.canCopy())return!0;return null!==this.draggedLink&&this.dragsLink&&this.draggedLink.canCopy()?!0:!1};\nVe.prototype.mayDragOut=function(){if(!this.isCopyEnabled)return!1;var a=this.diagram;if(!a.allowDragOut||!a.allowCopy||a.allowMove)return!1;for(a=a.selection.iterator;a.next();)if(a.value.canCopy())return!0;return null!==this.draggedLink&&this.dragsLink&&this.draggedLink.canCopy()?!0:!1};\nVe.prototype.mayMove=function(){var a=this.diagram;if(a.isReadOnly||!a.allowMove)return!1;for(a=a.selection.iterator;a.next();)if(a.value.canMove())return!0;return null!==this.draggedLink&&this.dragsLink&&this.draggedLink.canMove()?!0:!1};Ve.prototype.computeBorder=function(a,b,c){return this.Tn||null===this.draggedParts||this.draggedParts.contains(a)?null:c.assign(b)};Ve.prototype.lA=function(){return Xe};\nVe.prototype.mayDragIn=function(){var a=this.diagram;if(!a.allowDrop||a.isReadOnly||a.isModelReadOnly||!a.allowInsert)return!1;var b=Xe;return null===b||b.diagram.model.dataFormat!==a.model.dataFormat?!1:!0};Ve.prototype.doSimulatedDragEnter=function(){if(this.mayDragIn()){var a=this.diagram;a.animationManager.Bc();Hf(a);a.animationManager.Bc();var b=Xe;null!==b&&(b.diagram.mu=!1);this.doUpdateCursor(a.grid)}};\nVe.prototype.doSimulatedDragLeave=function(){var a=Xe;null!==a&&a.doSimulatedDragOut();this.doCancel()};Ve.prototype.doSimulatedDragOver=function(){var a=this.diagram;a.animationManager.tn=!0;var b=Xe;if(null!==b&&null!==b.draggedParts){if(!this.mayDragIn())return;If(this,b.draggedParts.Kf(),!1,a.firstInput);sf(this,this.copiedParts,!1);uf(this,a.lastInput.documentPoint)}a.animationManager.tn=!1};\nVe.prototype.doSimulatedDrop=function(){var a=this.diagram,b=Xe;if(null!==b){var c=b.diagram;b.Tn=!0;lf(this);if(!this.mayDragIn())return;a.animationManager.tn=!0;a.R(\"ChangingSelection\",a.selection);this.va(\"Drop\");If(this,b.draggedParts.Kf(),!0,a.lastInput);sf(this,this.copiedParts,!1);null!==this.copiedParts&&(a.clearSelection(!0),this.copiedParts.iteratorKeys.each(function(a){a.isSelected=!0}));Af(this,a.lastInput.documentPoint);a.Na();b=a.selection;null!==this.copiedParts?this.transactionResult=\n\"ExternalCopy\":b=new G;this.copiedParts=null;a.doFocus();a.R(\"ExternalObjectsDropped\",b,c);this.Jg();a.R(\"ChangedSelection\",a.selection)}a.animationManager.tn=!1};\nfunction If(a,b,c,d){if(null===a.copiedParts){var e=a.diagram;if(!e.isReadOnly&&!e.isModelReadOnly){e.skipsUndoManager=!c;e.partManager.addsToTemporaryLayer=!c;a.startPoint=d.documentPoint;c=e.tk(b,e,!0);var f=N.alloc();e=d=Infinity;for(var g=-Infinity,h=-Infinity,k=b.iterator;k.next();){var l=k.value;if(l.isVisible()){var m=l.location;l=m.x;m=m.y;isNaN(l)||isNaN(m)||(l<d&&(d=l),m<e&&(e=m),l>g&&(g=l),m>h&&(h=m))}}Infinity===d?f.h(0,0,0,0):f.h(d,e,g-d,h-e);d=f.x+f.width/2;e=f.y+f.height/2;N.free(f);\nf=a.it;g=new H;h=J.alloc();for(k=b.iterator;k.next();)l=k.value,l instanceof S&&l.canCopy()&&(m=c.G(l),null!==m&&(m.points=l.points,rf(m,f.x-d,f.y-e),m.suspendsRouting=!0,g.add(m,a.Cd())));for(b=b.iterator;b.next();)l=b.value,l.Nc()&&l.canCopy()&&(k=c.G(l),null!==k&&(l=l.location,h.h(f.x-(d-l.x),f.y-(e-l.y)),k.location=h,k.Ta(),g.add(k,a.Cd(h))));J.free(h);a.copiedParts=g;Ye(a,g.Kf());null!==a.draggedLink&&(c=a.draggedLink,b=c.routeBounds,rf(c,a.startPoint.x-(b.x+b.width/2),a.startPoint.y-(b.y+b.height/\n2)))}}}Ve.prototype.doSimulatedDragOut=function(){var a=this.diagram;a.mu=!1;this.mayCopy()||this.mayMove()?a.currentCursor=\"\":a.currentCursor=this.nodropCursor;this.Fo=null};Ve.prototype.computeMove=function(a,b,c,d){c=this.diagram;return null!==c?c.computeMove(a,b,this.dragOptions,d):new J};\nna.Object.defineProperties(Ve.prototype,{isCopyEnabled:{get:function(){return this.Tc},set:function(a){this.Tc=a}},copiesEffectiveCollection:{get:function(){return this.I},set:function(a){this.I=a}},dragOptions:{get:function(){return this.La},set:function(a){this.La=a}},isGridSnapEnabled:{get:function(){return this.dragOptions.isGridSnapEnabled},set:function(a){this.dragOptions.isGridSnapEnabled=\na}},isComplexRoutingRealtime:{get:function(){return this.Cc},set:function(a){this.Cc=a}},isGridSnapRealtime:{get:function(){return this.dragOptions.isGridSnapRealtime},set:function(a){this.dragOptions.isGridSnapRealtime=a}},gridSnapCellSize:{get:function(){return this.dragOptions.gridSnapCellSize},set:function(a){this.dragOptions.gridSnapCellSize.w(a)||(a=a.H(),this.dragOptions.gridSnapCellSize=a)}},gridSnapCellSpot:{\nget:function(){return this.dragOptions.gridSnapCellSpot},set:function(a){this.dragOptions.gridSnapCellSpot.w(a)||(a=a.H(),this.dragOptions.gridSnapCellSpot=a)}},gridSnapOrigin:{get:function(){return this.dragOptions.gridSnapOrigin},set:function(a){this.dragOptions.gridSnapOrigin.w(a)||(a=a.H(),this.dragOptions.gridSnapOrigin=a)}},dragsLink:{get:function(){return this.dragOptions.dragsLink},set:function(a){this.dragOptions.dragsLink=\na}},dragsTree:{get:function(){return this.dragOptions.dragsTree},set:function(a){this.dragOptions.dragsTree=a}},copyCursor:{get:function(){return this.T},set:function(a){this.T=a}},moveCursor:{get:function(){return this.Wh},set:function(a){this.Wh=a}},nodropCursor:{get:function(){return this.Xh},set:function(a){this.Xh=a}},currentPart:{get:function(){return this.Ka},\nset:function(a){this.Ka=a}},copiedParts:{get:function(){return this.u},set:function(a){this.u=a}},draggedParts:{get:function(){return this.eb},set:function(a){this.eb=a}},draggingParts:{get:function(){return null!==this.copiedParts?this.copiedParts.Kf():null!==this.draggedParts?this.draggedParts.Kf():this.lr}},draggedLink:{get:function(){return this.diagram.draggedLink},set:function(a){this.diagram.draggedLink=\na}},isDragOutStarted:{get:function(){return this.Od},set:function(a){this.Od=a}},startPoint:{get:function(){return this.it},set:function(a){this.it.w(a)||this.it.assign(a)}},delay:{get:function(){return this.pl},set:function(a){this.pl=a}}});Ve.prototype.getDraggingSource=Ve.prototype.lA;var jf=null,Xe=null,af=null;Ve.className=\"DraggingTool\";jf=new E;\nNa(\"draggingTool\",function(){return this.findTool(\"Dragging\")},function(a){this.Ya(\"Dragging\",a,this.mouseMoveTools)});Pa.prototype.doCancel=function(){null!==Xe&&Xe.doCancel();Ee.prototype.doCancel.call(this)};\nfunction Jf(){Ee.call(this);this.Xh=100;this.La=!1;this.oi=\"pointer\";var a=new S,b=new Kf;b.isPanelMain=!0;b.stroke=\"blue\";a.add(b);b=new Kf;b.toArrow=\"Standard\";b.fill=\"blue\";b.stroke=\"blue\";a.add(b);a.layerName=\"Tool\";this.gx=a;a=new W;b=new Kf;b.portId=\"\";b.figure=\"Rectangle\";b.fill=null;b.stroke=\"magenta\";b.strokeWidth=2;b.desiredSize=Jb;a.add(b);a.selectable=!1;a.layerName=\"Tool\";this.ex=a;this.l=b;a=new W;b=new Kf;b.portId=\"\";b.figure=\"Rectangle\";b.fill=null;b.stroke=\"magenta\";b.strokeWidth=\n2;b.desiredSize=Jb;a.add(b);a.selectable=!1;a.layerName=\"Tool\";this.hx=a;this.u=b;this.Wh=this.Od=this.Cc=this.eb=this.Tc=null;this.Ka=!0;this.cz=new H;this.lr=this.Ii=this.bx=null}ma(Jf,Ee);Jf.prototype.doStop=function(){this.diagram.Jf();this.originalToPort=this.originalToNode=this.originalFromPort=this.originalFromNode=this.originalLink=null;this.validPortsCache.clear();this.targetPort=null};\nJf.prototype.copyPortProperties=function(a,b,c,d,e){if(null!==a&&null!==b&&null!==c&&null!==d){var f=b.Af(),g=M.alloc();g.width=b.naturalBounds.width*f;g.height=b.naturalBounds.height*f;d.desiredSize=g;M.free(g);e?(d.toSpot=b.toSpot,d.toEndSegmentLength=b.toEndSegmentLength):(d.fromSpot=b.fromSpot,d.fromEndSegmentLength=b.fromEndSegmentLength);c.locationSpot=zc;f=J.alloc();c.location=b.da(zc,f);J.free(f);d.angle=b.lj();null!==this.portTargeted&&this.portTargeted(a,b,c,d,e)}};\nJf.prototype.setNoTargetPortProperties=function(a,b,c){null!==b&&(b.desiredSize=Jb,b.fromSpot=sc,b.toSpot=sc);null!==a&&(a.location=this.diagram.lastInput.documentPoint);null!==this.portTargeted&&this.portTargeted(null,null,a,b,c)};Jf.prototype.doMouseDown=function(){this.isActive&&this.doMouseMove()};\nJf.prototype.doMouseMove=function(){if(this.isActive){var a=this.diagram;this.targetPort=this.findTargetPort(this.isForwards);if(null!==this.targetPort&&this.targetPort.part instanceof W){var b=this.targetPort.part;this.isForwards?this.copyPortProperties(b,this.targetPort,this.temporaryToNode,this.temporaryToPort,!0):this.copyPortProperties(b,this.targetPort,this.temporaryFromNode,this.temporaryFromPort,!1)}else this.isForwards?this.setNoTargetPortProperties(this.temporaryToNode,this.temporaryToPort,\n!0):this.setNoTargetPortProperties(this.temporaryFromNode,this.temporaryFromPort,!1);(a.allowHorizontalScroll||a.allowVerticalScroll)&&a.Et(a.lastInput.viewPoint)}};Jf.prototype.findValidLinkablePort=function(a,b){if(null===a)return null;var c=a.part;if(!(c instanceof W))return null;for(;null!==a;){var d=b?a.toLinkable:a.fromLinkable;if(!0===d&&(null!==a.portId||a instanceof W)&&(b?this.isValidTo(c,a):this.isValidFrom(c,a)))return a;if(!1===d)break;a=a.panel}return null};\nJf.prototype.findTargetPort=function(a){var b=this.diagram,c=b.lastInput.documentPoint,d=this.portGravity;0>=d&&(d=.1);var e=this,f=b.Eg(c,d,function(b){return e.findValidLinkablePort(b,a)},null,!0);d=Infinity;b=null;for(f=f.iterator;f.next();){var g=f.value,h=g.part;if(h instanceof W){var k=g.da(zc,J.alloc()),l=c.x-k.x,m=c.y-k.y;J.free(k);k=l*l+m*m;k<d&&(l=this.validPortsCache.G(g),null!==l?l&&(b=g,d=k):a&&this.isValidLink(this.originalFromNode,this.originalFromPort,h,g)||!a&&this.isValidLink(h,\ng,this.originalToNode,this.originalToPort)?(this.validPortsCache.add(g,!0),b=g,d=k):this.validPortsCache.add(g,!1))}}return null!==b&&(c=b.part,c instanceof W&&(null===c.layer||c.layer.allowLink))?b:null};\nJf.prototype.isValidFrom=function(a,b){if(null===a||null===b)return this.isUnconnectedLinkValid;if(this.diagram.currentTool===this&&(null!==a.layer&&!a.layer.allowLink||!0!==b.fromLinkable))return!1;var c=b.fromMaxLinks;if(Infinity>c){if(null!==this.originalLink&&a===this.originalFromNode&&b===this.originalFromPort)return!0;b=b.portId;null===b&&(b=\"\");if(a.Fq(b).count>=c)return!1}return!0};\nJf.prototype.isValidTo=function(a,b){if(null===a||null===b)return this.isUnconnectedLinkValid;if(this.diagram.currentTool===this&&(null!==a.layer&&!a.layer.allowLink||!0!==b.toLinkable))return!1;var c=b.toMaxLinks;if(Infinity>c){if(null!==this.originalLink&&a===this.originalToNode&&b===this.originalToPort)return!0;b=b.portId;null===b&&(b=\"\");if(a.Hd(b).count>=c)return!1}return!0};\nJf.prototype.isInSameNode=function(a,b){if(null===a||null===b)return!1;if(a===b)return!0;a=a.part;b=b.part;return null!==a&&a===b};Jf.prototype.isLinked=function(a,b){if(null===a||null===b)return!1;var c=a.part;if(!(c instanceof W))return!1;a=a.portId;null===a&&(a=\"\");var d=b.part;if(!(d instanceof W))return!1;b=b.portId;null===b&&(b=\"\");for(b=d.Hd(b);b.next();)if(d=b.value,d.fromNode===c&&d.fromPortId===a)return!0;return!1};\nJf.prototype.isValidLink=function(a,b,c,d){if(!this.isValidFrom(a,b)||!this.isValidTo(c,d)||!(null===b||null===d||(b.fromLinkableSelfNode&&d.toLinkableSelfNode||!this.isInSameNode(b,d))&&(b.fromLinkableDuplicates&&d.toLinkableDuplicates||!this.isLinked(b,d)))||null!==this.originalLink&&(null!==a&&this.isLabelDependentOnLink(a,this.originalLink)||null!==c&&this.isLabelDependentOnLink(c,this.originalLink))||null!==a&&null!==c&&(null===a.data&&null!==c.data||null!==a.data&&null===c.data)||!this.isValidCycle(a,\nc,this.originalLink))return!1;if(null!==a){var e=a.linkValidation;if(null!==e&&!e(a,b,c,d,this.originalLink))return!1}if(null!==c&&(e=c.linkValidation,null!==e&&!e(a,b,c,d,this.originalLink)))return!1;e=this.linkValidation;return null!==e?e(a,b,c,d,this.originalLink):!0};Jf.prototype.isLabelDependentOnLink=function(a,b){if(null===a)return!1;var c=a.labeledLink;if(null===c)return!1;if(c===b)return!0;var d=new G;d.add(a);return Lf(this,c,b,d)};\nfunction Lf(a,b,c,d){if(b===c)return!0;var e=b.fromNode;if(null!==e&&e.isLinkLabel&&(d.add(e),Lf(a,e.labeledLink,c,d)))return!0;b=b.toNode;return null!==b&&b.isLinkLabel&&(d.add(b),Lf(a,b.labeledLink,c,d))?!0:!1}\nJf.prototype.isValidCycle=function(a,b,c){void 0===c&&(c=null);if(null===a||null===b)return this.isUnconnectedLinkValid;var d=this.diagram.validCycle;if(d!==Mf){if(d===Nf){d=c||this.temporaryLink;if(null!==d&&!d.isTreeLink)return!0;for(d=b.linksConnected;d.next();){var e=d.value;if(e!==c&&e.isTreeLink&&e.toNode===b)return!1}return!Of(this,a,b,c,!0)}if(d===Pf){d=c||this.temporaryLink;if(null!==d&&!d.isTreeLink)return!0;for(d=a.linksConnected;d.next();)if(e=d.value,e!==c&&e.isTreeLink&&e.fromNode===\na)return!1;return!Of(this,a,b,c,!0)}if(d===Qf)return a===b?a=!0:(d=new G,d.add(b),a=Rf(this,d,a,b,c)),!a;if(d===Sf)return!Of(this,a,b,c,!1);if(d===Tf)return a===b?a=!0:(d=new G,d.add(b),a=Uf(this,d,a,b,c)),!a}return!0};function Of(a,b,c,d,e){if(b===c)return!0;if(null===b||null===c)return!1;for(var f=b.linksConnected;f.next();){var g=f.value;if(g!==d&&(!e||g.isTreeLink)&&g.toNode===b&&(g=g.fromNode,g!==b&&Of(a,g,c,d,e)))return!0}return!1}\nfunction Rf(a,b,c,d,e){if(c===d)return!0;if(null===c||null===d||b.contains(c))return!1;b.add(c);for(var f=c.linksConnected;f.next();){var g=f.value;if(g!==e&&g.toNode===c&&(g=g.fromNode,g!==c&&Rf(a,b,g,d,e)))return!0}return!1}function Uf(a,b,c,d,e){if(c===d)return!0;if(null===c||null===d||b.contains(c))return!1;b.add(c);for(var f=c.linksConnected;f.next();){var g=f.value;if(g!==e){var h=g.fromNode;g=g.toNode;h=h===c?g:h;if(h!==c&&Uf(a,b,h,d,e))return!0}}return!1}\nna.Object.defineProperties(Jf.prototype,{portGravity:{get:function(){return this.Xh},set:function(a){0<=a&&(this.Xh=a)}},isUnconnectedLinkValid:{get:function(){return this.La},set:function(a){this.La=a}},linkingCursor:{get:function(){return this.oi},set:function(a){this.oi=a}},temporaryLink:{get:function(){return this.gx},set:function(a){this.gx=a}},temporaryFromNode:{\nget:function(){return this.ex},set:function(a){if(this.ex=a)this.l=a.port}},temporaryFromPort:{get:function(){return this.l},set:function(a){if(null!==this.l){var b=this.l.panel;if(null!==b){var c=b.W.indexOf(this.l);b.cb(c);b.wb(c,a)}}this.l=a}},temporaryToNode:{get:function(){return this.hx},set:function(a){if(this.hx=a)this.u=a.port}},temporaryToPort:{get:function(){return this.u},set:function(a){if(null!==\nthis.u){var b=this.u.panel;if(null!==b){var c=b.W.indexOf(this.u);b.cb(c);b.wb(c,a)}}this.u=a}},originalLink:{get:function(){return this.Tc},set:function(a){this.Tc=a}},originalFromNode:{get:function(){return this.eb},set:function(a){this.eb=a}},originalFromPort:{get:function(){return this.Cc},set:function(a){this.Cc=a}},originalToNode:{get:function(){return this.Od},set:function(a){this.Od=\na}},originalToPort:{get:function(){return this.Wh},set:function(a){this.Wh=a}},isForwards:{get:function(){return this.Ka},set:function(a){this.Ka=a}},validPortsCache:{get:function(){return this.cz}},targetPort:{get:function(){return this.bx},set:function(a){this.bx=a}},linkValidation:{get:function(){return this.Ii},set:function(a){this.Ii=a}},portTargeted:{\nget:function(){return this.lr},set:function(a){this.lr=a}}});Jf.className=\"LinkingBaseTool\";function Vf(){Jf.call(this);this.name=\"Linking\";this.T={};this.I=null;this.K=Wf;this.en=null}ma(Vf,Jf);Vf.prototype.canStart=function(){if(!this.isEnabled)return!1;var a=this.diagram;return a.isReadOnly||a.isModelReadOnly||!a.allowLink||!a.model.Ut()||!a.lastInput.left||a.currentTool!==this&&!this.isBeyondDragSize()?!1:null!==this.findLinkablePort()};\nVf.prototype.findLinkablePort=function(){var a=this.diagram,b=this.startObject;null===b&&(b=a.Vb(a.firstInput.documentPoint,null,null));if(null===b)return null;a=b.part;if(!(a instanceof W))return null;var c=this.direction;if(c===Wf||c===Xf){var d=this.findValidLinkablePort(b,!1);if(null!==d||this.startObject===a&&(d=a.port,this.findValidLinkablePort(d,!1)))return this.isForwards=!0,d}if(c===Wf||c===Yf)if(b=this.findValidLinkablePort(b,!0),null!==b||this.startObject===a&&(b=a.port,this.findValidLinkablePort(b,\n!0)))return this.isForwards=!1,b;return null};\nVf.prototype.doActivate=function(){var a=this.diagram,b=this.findLinkablePort();null===b?this.stopTool():(this.va(this.name),a.isMouseCaptured=!0,a.currentCursor=this.linkingCursor,this.isForwards?(null===this.temporaryToNode||this.temporaryToNode.location.s()||(this.temporaryToNode.location=a.lastInput.documentPoint),this.originalFromPort=b,b=this.originalFromPort.part,b instanceof W&&(this.originalFromNode=b),this.copyPortProperties(this.originalFromNode,this.originalFromPort,this.temporaryFromNode,\nthis.temporaryFromPort,!1)):(null===this.temporaryFromNode||this.temporaryFromNode.location.s()||(this.temporaryFromNode.location=a.lastInput.documentPoint),this.originalToPort=b,b=this.originalToPort.part,b instanceof W&&(this.originalToNode=b),this.copyPortProperties(this.originalToNode,this.originalToPort,this.temporaryToNode,this.temporaryToPort,!0)),a.add(this.temporaryFromNode),a.add(this.temporaryToNode),null!==this.temporaryLink&&(null!==this.temporaryFromNode&&(this.temporaryLink.fromNode=\nthis.temporaryFromNode),null!==this.temporaryToNode&&(this.temporaryLink.toNode=this.temporaryToNode),this.temporaryLink.isTreeLink=this.isNewTreeLink(),this.temporaryLink.Ua(),a.add(this.temporaryLink)),this.isActive=!0)};Vf.prototype.doDeactivate=function(){this.isActive=!1;var a=this.diagram;a.remove(this.temporaryLink);a.remove(this.temporaryFromNode);a.remove(this.temporaryToNode);a.isMouseCaptured=!1;a.currentCursor=\"\";this.Jg()};\nVf.prototype.doStop=function(){Jf.prototype.doStop.call(this);this.startObject=null};\nVf.prototype.doMouseUp=function(){var a=this.diagram;if(this.isActive){var b=this.transactionResult=null,c=null,d=null,e=null,f=null;try{var g=this.targetPort=this.findTargetPort(this.isForwards);if(null!==g){var h=g.part;h instanceof W&&(this.isForwards?(null!==this.originalFromNode&&(b=this.originalFromNode,c=this.originalFromPort),d=h,e=g):(b=h,c=g,null!==this.originalToNode&&(d=this.originalToNode,e=this.originalToPort)))}else this.isForwards?null!==this.originalFromNode&&this.isUnconnectedLinkValid&&\n(b=this.originalFromNode,c=this.originalFromPort):null!==this.originalToNode&&this.isUnconnectedLinkValid&&(d=this.originalToNode,e=this.originalToPort);null!==b||null!==d?(f=this.insertLink(b,c,d,e),null!==f?(null===g&&(this.isForwards?f.defaultToPoint=a.lastInput.documentPoint.copy():f.defaultFromPoint=a.lastInput.documentPoint.copy()),a.allowSelect&&(a.R(\"ChangingSelection\",a.selection),a.clearSelection(!0),f.isSelected=!0),this.transactionResult=this.name,a.R(\"LinkDrawn\",f)):this.doNoLink(b,c,\nd,e)):this.isForwards?this.doNoLink(this.originalFromNode,this.originalFromPort,null,null):this.doNoLink(null,null,this.originalToNode,this.originalToPort)}finally{this.stopTool(),f&&a.allowSelect&&a.R(\"ChangedSelection\",a.selection)}}};\nVf.prototype.isNewTreeLink=function(){var a=this.archetypeLinkData;if(null===a)return!0;if(a instanceof S)return a.isTreeLink;var b=this.diagram;if(null===b)return!0;a=b.partManager.getLinkCategoryForData(a);b=b.partManager.findLinkTemplateForCategory(a);return null!==b?b.isTreeLink:!0};Vf.prototype.insertLink=function(a,b,c,d){return this.diagram.partManager.insertLink(a,b,c,d)};Vf.prototype.doNoLink=function(){};\nna.Object.defineProperties(Vf.prototype,{archetypeLinkData:{get:function(){return this.T},set:function(a){this.T=a}},archetypeLabelNodeData:{get:function(){return this.I},set:function(a){this.I=a}},direction:{get:function(){return this.K},set:function(a){this.K=a}},startObject:{get:function(){return this.en},set:function(a){this.en=a}}});\nvar Wf=new D(Vf,\"Either\",0),Xf=new D(Vf,\"ForwardsOnly\",0),Yf=new D(Vf,\"BackwardsOnly\",0);Vf.className=\"LinkingTool\";Vf.Either=Wf;Vf.ForwardsOnly=Xf;Vf.BackwardsOnly=Yf;\nfunction bf(){Jf.call(this);this.name=\"Relinking\";var a=new Kf;a.figure=\"Diamond\";a.desiredSize=Lb;a.fill=\"lightblue\";a.stroke=\"dodgerblue\";a.cursor=this.linkingCursor;a.segmentIndex=0;this.T=a;a=new Kf;a.figure=\"Diamond\";a.desiredSize=Lb;a.fill=\"lightblue\";a.stroke=\"dodgerblue\";a.cursor=this.linkingCursor;a.segmentIndex=-1;this.en=a;this.I=null;this.Hx=new N}ma(bf,Jf);\nbf.prototype.updateAdornments=function(a){if(null!==a&&a instanceof S){var b=\"RelinkFrom\",c=null;if(a.isSelected&&!this.diagram.isReadOnly){var d=a.selectionObject;null!==d&&a.canRelinkFrom()&&a.actualBounds.s()&&a.isVisible()&&d.actualBounds.s()&&d.Gf()&&(c=a.wk(b),null===c&&(c=this.makeAdornment(d,!1),a.Gh(b,c)))}null===c&&a.Hf(b);b=\"RelinkTo\";c=null;a.isSelected&&!this.diagram.isReadOnly&&(d=a.selectionObject,null!==d&&a.canRelinkTo()&&a.actualBounds.s()&&a.isVisible()&&d.actualBounds.s()&&d.Gf()&&\n(c=a.wk(b),null===c?(c=this.makeAdornment(d,!0),a.Gh(b,c)):c.o()));null===c&&a.Hf(b)}};bf.prototype.makeAdornment=function(a,b){var c=new Je;c.type=X.Link;b=b?this.toHandleArchetype:this.fromHandleArchetype;null!==b&&c.add(b.copy());c.adornedObject=a;return c};\nbf.prototype.canStart=function(){if(!this.isEnabled)return!1;var a=this.diagram;if(a.isReadOnly||a.isModelReadOnly||!a.allowRelink||!a.model.Ut()||!a.lastInput.left)return!1;var b=this.findToolHandleAt(a.firstInput.documentPoint,\"RelinkFrom\");null===b&&(b=this.findToolHandleAt(a.firstInput.documentPoint,\"RelinkTo\"));return null!==b};\nbf.prototype.doActivate=function(){var a=this.diagram;if(null===this.originalLink){var b=this.handle;null===b&&(b=this.findToolHandleAt(a.firstInput.documentPoint,\"RelinkFrom\"),null===b&&(b=this.findToolHandleAt(a.firstInput.documentPoint,\"RelinkTo\")));if(null===b)return;var c=b.part;if(!(c instanceof Je&&c.adornedPart instanceof S))return;this.handle=b;this.isForwards=null===c||\"RelinkTo\"===c.category;this.originalLink=c.adornedPart}this.va(this.name);a.isMouseCaptured=!0;a.currentCursor=this.linkingCursor;\nthis.originalFromPort=this.originalLink.fromPort;this.originalFromNode=this.originalLink.fromNode;this.originalToPort=this.originalLink.toPort;this.originalToNode=this.originalLink.toNode;this.Hx.set(this.originalLink.actualBounds);null!==this.originalLink&&0<this.originalLink.pointsCount&&(null===this.originalLink.fromNode&&(null!==this.temporaryFromPort&&(this.temporaryFromPort.desiredSize=Ib),null!==this.temporaryFromNode&&(this.temporaryFromNode.location=this.originalLink.i(0))),null===this.originalLink.toNode&&\n(null!==this.temporaryToPort&&(this.temporaryToPort.desiredSize=Ib),null!==this.temporaryToNode&&(this.temporaryToNode.location=this.originalLink.i(this.originalLink.pointsCount-1))));this.copyPortProperties(this.originalFromNode,this.originalFromPort,this.temporaryFromNode,this.temporaryFromPort,!1);this.copyPortProperties(this.originalToNode,this.originalToPort,this.temporaryToNode,this.temporaryToPort,!0);a.add(this.temporaryFromNode);a.add(this.temporaryToNode);null!==this.temporaryLink&&(null!==\nthis.temporaryFromNode&&(this.temporaryLink.fromNode=this.temporaryFromNode),null!==this.temporaryToNode&&(this.temporaryLink.toNode=this.temporaryToNode),this.copyLinkProperties(this.originalLink,this.temporaryLink),this.temporaryLink.Ua(),a.add(this.temporaryLink));this.isActive=!0};\nbf.prototype.copyLinkProperties=function(a,b){if(null!==a&&null!==b){b.adjusting=a.adjusting;b.corner=a.corner;var c=a.curve;if(c===Zf||c===$f)c=ag;b.curve=c;b.curviness=a.curviness;b.isTreeLink=a.isTreeLink;b.points=a.points;b.routing=a.routing;b.smoothness=a.smoothness;b.fromSpot=a.fromSpot;b.fromEndSegmentLength=a.fromEndSegmentLength;b.fromShortLength=a.fromShortLength;b.toSpot=a.toSpot;b.toEndSegmentLength=a.toEndSegmentLength;b.toShortLength=a.toShortLength}};\nbf.prototype.doDeactivate=function(){this.isActive=!1;var a=this.diagram;a.remove(this.temporaryLink);a.remove(this.temporaryFromNode);a.remove(this.temporaryToNode);a.isMouseCaptured=!1;a.currentCursor=\"\";this.Jg()};bf.prototype.doStop=function(){Jf.prototype.doStop.call(this);this.handle=null};\nbf.prototype.doMouseUp=function(){if(this.isActive){var a=this.diagram;this.transactionResult=null;var b=this.originalFromNode,c=this.originalFromPort,d=this.originalToNode,e=this.originalToPort,f=this.originalLink;this.targetPort=this.findTargetPort(this.isForwards);if(null!==this.targetPort){var g=this.targetPort.part;g instanceof W&&(this.isForwards?(d=g,e=this.targetPort):(b=g,c=this.targetPort))}else this.isUnconnectedLinkValid?this.isForwards?e=d=null:c=b=null:f=null;null!==f?(this.reconnectLink(f,\nthis.isForwards?d:b,this.isForwards?e:c,this.isForwards),null===this.targetPort&&(this.isForwards?f.defaultToPoint=a.lastInput.documentPoint.copy():f.defaultFromPoint=a.lastInput.documentPoint.copy(),f.Ua()),a.allowSelect&&(f.isSelected=!0),this.transactionResult=this.name,a.R(\"LinkRelinked\",f,this.isForwards?this.originalToPort:this.originalFromPort)):this.doNoRelink(this.originalLink,this.isForwards);this.originalLink.Oq(this.Hx)}this.stopTool()};\nbf.prototype.reconnectLink=function(a,b,c,d){c=null!==c&&null!==c.portId?c.portId:\"\";d?(a.toNode=b,a.toPortId=c):(a.fromNode=b,a.fromPortId=c);return!0};bf.prototype.doNoRelink=function(){};\nfunction zf(a,b,c,d,e){null!==b?(a.copyPortProperties(b,c,a.temporaryFromNode,a.temporaryFromPort,!1),a.diagram.add(a.temporaryFromNode)):a.diagram.remove(a.temporaryFromNode);null!==d?(a.copyPortProperties(d,e,a.temporaryToNode,a.temporaryToPort,!0),a.diagram.add(a.temporaryToNode)):a.diagram.remove(a.temporaryToNode)}\nna.Object.defineProperties(bf.prototype,{fromHandleArchetype:{get:function(){return this.T},set:function(a){this.T=a}},toHandleArchetype:{get:function(){return this.en},set:function(a){this.en=a}},handle:{get:function(){return this.I},set:function(a){if(null!==a&&!(a.part instanceof Je))throw Error(\"new handle is not in an Adornment: \"+a);this.I=a}}});bf.className=\"RelinkingTool\";\nNa(\"linkingTool\",function(){return this.findTool(\"Linking\")},function(a){this.Ya(\"Linking\",a,this.mouseMoveTools)});Na(\"relinkingTool\",function(){return this.findTool(\"Relinking\")},function(a){this.Ya(\"Relinking\",a,this.mouseDownTools)});\nfunction bg(){Ee.call(this);this.name=\"LinkReshaping\";var a=new Kf;a.figure=\"Rectangle\";a.desiredSize=Kb;a.fill=\"lightblue\";a.stroke=\"dodgerblue\";this.u=a;a=new Kf;a.figure=\"Diamond\";a.desiredSize=Lb;a.fill=\"lightblue\";a.stroke=\"dodgerblue\";a.cursor=\"move\";this.I=a;this.T=3;this.wu=this.l=null;this.Ix=new J;this.Is=new E}ma(bg,Ee);bg.prototype.Zv=function(a){return a&&a.Os&&0!==a.Os.value?a.Os:cg};bg.prototype.Xm=function(a,b){a.Os=b};\nbg.prototype.updateAdornments=function(a){if(null!==a&&a instanceof S){var b=null;if(a.isSelected&&!this.diagram.isReadOnly){var c=a.path;null!==c&&a.canReshape()&&a.actualBounds.s()&&a.isVisible()&&c.actualBounds.s()&&c.Gf()&&(b=a.wk(this.name),null===b||b.Ex!==a.pointsCount||b.Sx!==a.resegmentable)&&(b=this.makeAdornment(c),null!==b&&(b.Ex=a.pointsCount,b.Sx=a.resegmentable,a.Gh(this.name,b)))}null===b&&a.Hf(this.name)}};\nbg.prototype.makeAdornment=function(a){var b=a.part,c=b.pointsCount,d=b.isOrthogonal,e=null;if(null!==b.points&&1<c){e=new Je;e.type=X.Link;c=b.firstPickIndex;var f=b.lastPickIndex,g=d?1:0;if(b.resegmentable&&b.computeCurve()!==dg)for(var h=c+g;h<f-g;h++){var k=this.makeResegmentHandle(a,h);null!==k&&(k.segmentIndex=h,k.segmentFraction=.5,k.fromMaxLinks=999,e.add(k))}for(g=c+1;g<f;g++)if(h=this.makeHandle(a,g),null!==h){h.segmentIndex=g;if(g!==c)if(g===c+1&&d){k=b.i(c);var l=b.i(c+1);L.A(k.x,l.x)&&\nL.A(k.y,l.y)&&(l=b.i(c-1));L.A(k.x,l.x)?(this.Xm(h,eg),h.cursor=\"n-resize\"):L.A(k.y,l.y)&&(this.Xm(h,fg),h.cursor=\"w-resize\")}else g===f-1&&d?(k=b.i(f-1),l=b.i(f),L.A(k.x,l.x)&&L.A(k.y,l.y)&&(k=b.i(f+1)),L.A(k.x,l.x)?(this.Xm(h,eg),h.cursor=\"n-resize\"):L.A(k.y,l.y)&&(this.Xm(h,fg),h.cursor=\"w-resize\")):g!==f&&(this.Xm(h,tg),h.cursor=\"move\");e.add(h)}e.adornedObject=a}return e};bg.prototype.makeHandle=function(){var a=this.handleArchetype;return null===a?null:a.copy()};\nbg.prototype.makeResegmentHandle=function(){var a=this.midHandleArchetype;return null===a?null:a.copy()};bg.prototype.canStart=function(){if(!this.isEnabled)return!1;var a=this.diagram;return!a.isReadOnly&&a.allowReshape&&a.lastInput.left?null!==this.findToolHandleAt(a.firstInput.documentPoint,this.name):!1};\nbg.prototype.doActivate=function(){var a=this.diagram;null===this.handle&&(this.handle=this.findToolHandleAt(a.firstInput.documentPoint,this.name));if(null!==this.handle){var b=this.handle.part.adornedPart;if(b instanceof S){this.wu=b;a.isMouseCaptured=!0;this.va(this.name);if(b.resegmentable&&999===this.handle.fromMaxLinks){var c=b.points.copy(),d=this.getResegmentingPoint();c.wb(this.handle.segmentIndex+1,d);b.isOrthogonal&&c.wb(this.handle.segmentIndex+1,d);b.points=c;b.Lb();b.updateAdornments();\nthis.handle=this.findToolHandleAt(a.firstInput.documentPoint,this.name);if(null===this.handle){this.doDeactivate();return}}this.Ix=b.i(this.handle.segmentIndex);this.Is=b.points.copy();this.isActive=!0}}};bg.prototype.doDeactivate=function(){this.Jg();this.wu=this.handle=null;this.isActive=this.diagram.isMouseCaptured=!1};bg.prototype.doCancel=function(){var a=this.adornedLink;null!==a&&(a.points=this.Is);this.stopTool()};bg.prototype.getResegmentingPoint=function(){return this.handle.da(zc)};\nbg.prototype.doMouseMove=function(){var a=this.diagram;this.isActive&&(a=this.computeReshape(a.lastInput.documentPoint),this.reshape(a))};\nbg.prototype.doMouseUp=function(){var a=this.diagram;if(this.isActive){var b=this.computeReshape(a.lastInput.documentPoint);this.reshape(b);b=this.adornedLink;if(null!==b&&b.resegmentable){var c=this.handle.segmentIndex,d=b.i(c-1),e=b.i(c),f=b.i(c+1);if(b.isOrthogonal){if(c>b.firstPickIndex+1&&c<b.lastPickIndex-1){var g=b.i(c-2);if(Math.abs(d.x-e.x)<this.resegmentingDistance&&Math.abs(d.y-e.y)<this.resegmentingDistance&&(ug(this,g,d,e,f,!0)||ug(this,g,d,e,f,!1))){var h=b.points.copy();ug(this,g,d,\ne,f,!0)?(h.Pc(c-2,new J(g.x,(f.y+g.y)/2)),h.Pc(c+1,new J(f.x,(f.y+g.y)/2))):(h.Pc(c-2,new J((f.x+g.x)/2,g.y)),h.Pc(c+1,new J((f.x+g.x)/2,f.y)));h.cb(c);h.cb(c-1);b.points=h;b.Lb()}else g=b.i(c+2),Math.abs(e.x-f.x)<this.resegmentingDistance&&Math.abs(e.y-f.y)<this.resegmentingDistance&&(ug(this,d,e,f,g,!0)||ug(this,d,e,f,g,!1))&&(h=b.points.copy(),ug(this,d,e,f,g,!0)?(h.Pc(c-1,new J(d.x,(d.y+g.y)/2)),h.Pc(c+2,new J(g.x,(d.y+g.y)/2))):(h.Pc(c-1,new J((d.x+g.x)/2,d.y)),h.Pc(c+2,new J((d.x+g.x)/2,g.y))),\nh.cb(c+1),h.cb(c),b.points=h,b.Lb())}}else g=J.alloc(),L.Qh(d.x,d.y,f.x,f.y,e.x,e.y,g)&&g.Ie(e)<this.resegmentingDistance*this.resegmentingDistance&&(d=b.points.copy(),d.cb(c),b.points=d,b.Lb()),J.free(g)}a.Na();this.transactionResult=this.name;a.R(\"LinkReshaped\",this.adornedLink,this.Is)}this.stopTool()};\nfunction ug(a,b,c,d,e,f){return f?Math.abs(b.y-c.y)<a.resegmentingDistance&&Math.abs(c.y-d.y)<a.resegmentingDistance&&Math.abs(d.y-e.y)<a.resegmentingDistance:Math.abs(b.x-c.x)<a.resegmentingDistance&&Math.abs(c.x-d.x)<a.resegmentingDistance&&Math.abs(d.x-e.x)<a.resegmentingDistance}\nbg.prototype.reshape=function(a){var b=this.adornedLink;b.Th();var c=this.handle.segmentIndex,d=this.Zv(this.handle);if(b.isOrthogonal)if(c===b.firstPickIndex+1)c=b.firstPickIndex+1,d===eg?(b.L(c,b.i(c-1).x,a.y),b.L(c+1,b.i(c+2).x,a.y)):d===fg&&(b.L(c,a.x,b.i(c-1).y),b.L(c+1,a.x,b.i(c+2).y));else if(c===b.lastPickIndex-1)c=b.lastPickIndex-1,d===eg?(b.L(c-1,b.i(c-2).x,a.y),b.L(c,b.i(c+1).x,a.y)):d===fg&&(b.L(c-1,a.x,b.i(c-2).y),b.L(c,a.x,b.i(c+1).y));else{d=c;var e=b.i(d),f=b.i(d-1),g=b.i(d+1);L.A(f.x,\ne.x)&&L.A(e.y,g.y)?(L.A(f.x,b.i(d-2).x)&&!L.A(f.y,b.i(d-2).y)?(b.m(d,a.x,f.y),c++,d++):b.L(d-1,a.x,f.y),L.A(g.y,b.i(d+2).y)&&!L.A(g.x,b.i(d+2).x)?b.m(d+1,g.x,a.y):b.L(d+1,g.x,a.y)):L.A(f.y,e.y)&&L.A(e.x,g.x)?(L.A(f.y,b.i(d-2).y)&&!L.A(f.x,b.i(d-2).x)?(b.m(d,f.x,a.y),c++,d++):b.L(d-1,f.x,a.y),L.A(g.x,b.i(d+2).x)&&!L.A(g.y,b.i(d+2).y)?b.m(d+1,a.x,g.y):b.L(d+1,a.x,g.y)):L.A(f.x,e.x)&&L.A(e.x,g.x)?(L.A(f.x,b.i(d-2).x)&&!L.A(f.y,b.i(d-2).y)?(b.m(d,a.x,f.y),c++,d++):b.L(d-1,a.x,f.y),L.A(g.x,b.i(d+2).x)&&\n!L.A(g.y,b.i(d+2).y)?b.m(d+1,a.x,g.y):b.L(d+1,a.x,g.y)):L.A(f.y,e.y)&&L.A(e.y,g.y)&&(L.A(f.y,b.i(d-2).y)&&!L.A(f.x,b.i(d-2).x)?(b.m(d,f.x,a.y),c++,d++):b.L(d-1,f.x,a.y),L.A(g.y,b.i(d+2).y)&&!L.A(g.x,b.i(d+2).x)?b.m(d+1,g.x,a.y):b.L(d+1,g.x,a.y));b.L(c,a.x,a.y)}else b.L(c,a.x,a.y),d=b.fromNode,e=b.fromPort,null!==d&&(f=d.findVisibleNode(),null!==f&&f!==d&&(d=f,e=d.port)),1===c&&b.computeSpot(!0,e).nc()&&(f=e.da(zc,J.alloc()),d=b.getLinkPointFromPoint(d,e,f,a,!0,J.alloc()),b.L(0,d.x,d.y),J.free(f),\nJ.free(d)),d=b.toNode,e=b.toPort,null!==d&&(f=d.findVisibleNode(),null!==f&&f!==d&&(d=f,e=d.port)),c===b.pointsCount-2&&b.computeSpot(!1,e).nc()&&(c=e.da(zc,J.alloc()),a=b.getLinkPointFromPoint(d,e,c,a,!1,J.alloc()),b.L(b.pointsCount-1,a.x,a.y),J.free(c),J.free(a));b.xf()};bg.prototype.computeReshape=function(a){var b=this.adornedLink,c=this.handle.segmentIndex;switch(this.Zv(this.handle)){case tg:return a;case eg:return new J(b.i(c).x,a.y);case fg:return new J(a.x,b.i(c).y);default:case cg:return b.i(c)}};\nna.Object.defineProperties(bg.prototype,{handleArchetype:{get:function(){return this.u},set:function(a){this.u=a}},midHandleArchetype:{get:function(){return this.I},set:function(a){this.I=a}},handle:{get:function(){return this.l},set:function(a){if(null!==a&&!(a.part instanceof Je))throw Error(\"new handle is not in an Adornment: \"+a);this.l=a}},adornedLink:{get:function(){return this.wu}},\nresegmentingDistance:{get:function(){return this.T},set:function(a){this.T=a}},originalPoint:{get:function(){return this.Ix}},originalPoints:{get:function(){return this.Is}}});bg.prototype.setReshapingBehavior=bg.prototype.Xm;bg.prototype.getReshapingBehavior=bg.prototype.Zv;var cg=new D(bg,\"None\",0),fg=new D(bg,\"Horizontal\",1),eg=new D(bg,\"Vertical\",2),tg=new D(bg,\"All\",3);bg.className=\"LinkReshapingTool\";\nbg.None=cg;bg.Horizontal=fg;bg.Vertical=eg;bg.All=tg;Na(\"linkReshapingTool\",function(){return this.findTool(\"LinkReshaping\")},function(a){this.Ya(\"LinkReshaping\",a,this.mouseDownTools)});\nfunction vg(){Ee.call(this);this.name=\"Resizing\";this.fg=(new M(1,1)).freeze();this.eg=(new M(9999,9999)).freeze();this.Qg=(new M(NaN,NaN)).freeze();this.I=!1;this.T=!0;this.ie=null;var a=new Kf;a.alignmentFocus=zc;a.figure=\"Rectangle\";a.desiredSize=Kb;a.fill=\"lightblue\";a.stroke=\"dodgerblue\";a.strokeWidth=1;a.cursor=\"pointer\";this.u=a;this.l=null;this.Hs=new J;this.Gx=new M;this.qp=new J;this.Nu=new M(0,0);this.Mu=new M(Infinity,Infinity);this.Lu=new M(1,1)}ma(vg,Ee);\nvg.prototype.updateAdornments=function(a){if(!(null===a||a instanceof S)){if(a.isSelected&&!this.diagram.isReadOnly){var b=a.resizeObject,c=a.wk(this.name);if(null!==b&&a.canResize()&&a.actualBounds.s()&&a.isVisible()&&b.actualBounds.s()&&b.Gf()){if(null===c||c.adornedObject!==b)c=this.makeAdornment(b);if(null!==c){b=b.lj();wg(a)&&this.updateResizeHandles(c,b);a.Gh(this.name,c);return}}}a.Hf(this.name)}};\nvg.prototype.makeAdornment=function(a){var b=a.part.resizeAdornmentTemplate;if(null===b){b=new Je;b.type=X.Spot;b.locationSpot=zc;var c=new xg;c.isPanelMain=!0;b.add(c);b.add(this.makeHandle(a,tc));b.add(this.makeHandle(a,vc));b.add(this.makeHandle(a,Dc));b.add(this.makeHandle(a,Bc));b.add(this.makeHandle(a,bd));b.add(this.makeHandle(a,dd));b.add(this.makeHandle(a,ed));b.add(this.makeHandle(a,cd))}else if(yg(b),b=b.copy(),null===b)return null;b.adornedObject=a;return b};\nvg.prototype.makeHandle=function(a,b){a=this.handleArchetype;if(null===a)return null;a=a.copy();a.alignment=b;return a};\nvg.prototype.updateResizeHandles=function(a,b){if(null!==a)if(!a.alignment.Mb()&&(\"pointer\"===a.cursor||0<a.cursor.indexOf(\"resize\")))a:{var c=a.alignment;c.nc()&&(c=zc);if(0>=c.x)b=0>=c.y?b+225:1<=c.y?b+135:b+180;else if(1<=c.x)0>=c.y?b+=315:1<=c.y&&(b+=45);else if(0>=c.y)b+=270;else if(1<=c.y)b+=90;else break a;0>b?b+=360:360<=b&&(b-=360);a.cursor=22.5>b?\"e-resize\":67.5>b?\"se-resize\":112.5>b?\"s-resize\":157.5>b?\"sw-resize\":202.5>b?\"w-resize\":247.5>b?\"nw-resize\":292.5>b?\"n-resize\":337.5>b?\"ne-resize\":\n\"e-resize\"}else if(a instanceof X)for(a=a.elements;a.next();)this.updateResizeHandles(a.value,b)};vg.prototype.canStart=function(){if(!this.isEnabled)return!1;var a=this.diagram;return!a.isReadOnly&&a.allowResize&&a.lastInput.left?null!==this.findToolHandleAt(a.firstInput.documentPoint,this.name):!1};\nvg.prototype.doActivate=function(){var a=this.diagram;null===this.handle&&(this.handle=this.findToolHandleAt(a.firstInput.documentPoint,this.name));null!==this.handle&&(this.adornedObject=this.handle.part.adornedObject,null!==this.adornedObject&&(a.isMouseCaptured=!0,a.animationManager.Bc(),this.va(this.name),this.Hs.set(this.adornedObject.da(this.handle.alignment.mw())),this.qp.set(this.adornedObject.part.location),this.Gx.set(this.adornedObject.desiredSize),this.Lu=this.computeCellSize(),this.Nu=\nthis.computeMinSize(),this.Mu=this.computeMaxSize(),this.isActive=!0))};vg.prototype.doDeactivate=function(){var a=this.diagram;this.Jg();this.ie=this.handle=null;this.isActive=a.isMouseCaptured=!1};vg.prototype.doCancel=function(){null!==this.adornedObject&&(this.adornedObject.desiredSize=this.originalDesiredSize,this.adornedObject.part.location=this.originalLocation);this.stopTool()};\nvg.prototype.doMouseMove=function(){var a=this.diagram;if(this.isActive){var b=this.Nu,c=this.Mu,d=this.Lu,e=this.adornedObject.Mt(a.lastInput.documentPoint,J.alloc()),f=this.computeReshape();b=this.computeResize(e,this.handle.alignment,b,c,d,f);this.resize(b);a.hd();J.free(e)}};\nvg.prototype.doMouseUp=function(){var a=this.diagram;if(this.isActive){var b=this.Nu,c=this.Mu,d=this.Lu,e=this.adornedObject.Mt(a.lastInput.documentPoint,J.alloc()),f=this.computeReshape();b=this.computeResize(e,this.handle.alignment,b,c,d,f);this.resize(b);J.free(e);a.Na();this.transactionResult=this.name;a.R(\"PartResized\",this.adornedObject,this.originalDesiredSize)}this.stopTool()};\nvg.prototype.resize=function(a){var b=this.diagram,c=this.adornedObject;if(null!==c){c.desiredSize=a.size;a=c.part;a.Ta();c=c.da(this.handle.alignment.mw());if(a instanceof U){var d=new E;d.add(a);if(!this.dragsMembers&&null===a.placeholder){var e=new We;e.dragsMembers=!1}b.moveParts(d,this.oppositePoint.copy().ge(c),!0,e)}else a.location=a.location.copy().ge(c).add(this.oppositePoint);b.hd()}};\nvg.prototype.computeResize=function(a,b,c,d,e,f){b.nc()&&(b=zc);var g=this.adornedObject.naturalBounds,h=g.x,k=g.y,l=g.x+g.width,m=g.y+g.height,n=1;if(!f){n=g.width;var p=g.height;0>=n&&(n=1);0>=p&&(p=1);n=p/n}p=J.alloc();L.Gq(a.x,a.y,h,k,e.width,e.height,p);a=g.copy();0>=b.x?0>=b.y?(a.x=Math.max(p.x,l-d.width),a.x=Math.min(a.x,l-c.width),a.width=Math.max(l-a.x,c.width),a.y=Math.max(p.y,m-d.height),a.y=Math.min(a.y,m-c.height),a.height=Math.max(m-a.y,c.height),f||(1<=a.height/a.width?(a.height=Math.max(Math.min(n*\na.width,d.height),c.height),a.width=a.height/n):(a.width=Math.max(Math.min(a.height/n,d.width),c.width),a.height=n*a.width),a.x=l-a.width,a.y=m-a.height)):1<=b.y?(a.x=Math.max(p.x,l-d.width),a.x=Math.min(a.x,l-c.width),a.width=Math.max(l-a.x,c.width),a.height=Math.max(Math.min(p.y-k,d.height),c.height),f||(1<=a.height/a.width?(a.height=Math.max(Math.min(n*a.width,d.height),c.height),a.width=a.height/n):(a.width=Math.max(Math.min(a.height/n,d.width),c.width),a.height=n*a.width),a.x=l-a.width)):(a.x=\nMath.max(p.x,l-d.width),a.x=Math.min(a.x,l-c.width),a.width=l-a.x,f||(a.height=Math.max(Math.min(n*a.width,d.height),c.height),a.width=a.height/n,a.y=k+.5*(m-k-a.height))):1<=b.x?0>=b.y?(a.width=Math.max(Math.min(p.x-h,d.width),c.width),a.y=Math.max(p.y,m-d.height),a.y=Math.min(a.y,m-c.height),a.height=Math.max(m-a.y,c.height),f||(1<=a.height/a.width?(a.height=Math.max(Math.min(n*a.width,d.height),c.height),a.width=a.height/n):(a.width=Math.max(Math.min(a.height/n,d.width),c.width),a.height=n*a.width),\na.y=m-a.height)):1<=b.y?(a.width=Math.max(Math.min(p.x-h,d.width),c.width),a.height=Math.max(Math.min(p.y-k,d.height),c.height),f||(1<=a.height/a.width?(a.height=Math.max(Math.min(n*a.width,d.height),c.height),a.width=a.height/n):(a.width=Math.max(Math.min(a.height/n,d.width),c.width),a.height=n*a.width))):(a.width=Math.max(Math.min(p.x-h,d.width),c.width),f||(a.height=Math.max(Math.min(n*a.width,d.height),c.height),a.width=a.height/n,a.y=k+.5*(m-k-a.height))):0>=b.y?(a.y=Math.max(p.y,m-d.height),\na.y=Math.min(a.y,m-c.height),a.height=m-a.y,f||(a.width=Math.max(Math.min(a.height/n,d.width),c.width),a.height=n*a.width,a.x=h+.5*(l-h-a.width))):1<=b.y&&(a.height=Math.max(Math.min(p.y-k,d.height),c.height),f||(a.width=Math.max(Math.min(a.height/n,d.width),c.width),a.height=n*a.width,a.x=h+.5*(l-h-a.width)));J.free(p);return a};vg.prototype.computeReshape=function(){var a=zg;this.adornedObject instanceof Kf&&(a=Ag(this.adornedObject));return!(a===Bg||this.diagram.lastInput.shift)};\nvg.prototype.computeMinSize=function(){var a=this.adornedObject.minSize.copy(),b=this.minSize;!isNaN(b.width)&&b.width>a.width&&(a.width=b.width);!isNaN(b.height)&&b.height>a.height&&(a.height=b.height);return a};vg.prototype.computeMaxSize=function(){var a=this.adornedObject.maxSize.copy(),b=this.maxSize;!isNaN(b.width)&&b.width<a.width&&(a.width=b.width);!isNaN(b.height)&&b.height<a.height&&(a.height=b.height);return a};\nvg.prototype.computeCellSize=function(){var a=new M(NaN,NaN),b=this.adornedObject.part;null!==b&&(b=b.resizeCellSize,!isNaN(b.width)&&0<b.width&&(a.width=b.width),!isNaN(b.height)&&0<b.height&&(a.height=b.height));b=this.cellSize;isNaN(a.width)&&!isNaN(b.width)&&0<b.width&&(a.width=b.width);isNaN(a.height)&&!isNaN(b.height)&&0<b.height&&(a.height=b.height);b=this.diagram;(isNaN(a.width)||isNaN(a.height))&&b&&(b=b.grid,null!==b&&b.visible&&this.isGridSnapEnabled&&(b=b.gridCellSize,isNaN(a.width)&&\n!isNaN(b.width)&&0<b.width&&(a.width=b.width),isNaN(a.height)&&!isNaN(b.height)&&0<b.height&&(a.height=b.height)));if(isNaN(a.width)||0===a.width||Infinity===a.width)a.width=1;if(isNaN(a.height)||0===a.height||Infinity===a.height)a.height=1;return a};\nna.Object.defineProperties(vg.prototype,{handleArchetype:{get:function(){return this.u},set:function(a){this.u=a}},handle:{get:function(){return this.l},set:function(a){if(null!==a&&!(a.part instanceof Je))throw Error(\"new handle is not in an Adornment: \"+a);this.l=a}},adornedObject:{get:function(){return this.ie},set:function(a){if(null!==a&&a.part instanceof Je)throw Error(\"new handle must not be in an Adornment: \"+\na);this.ie=a}},minSize:{get:function(){return this.fg},set:function(a){if(!this.fg.w(a)){var b=a.width;isNaN(b)&&(b=0);a=a.height;isNaN(a)&&(a=0);this.fg.h(b,a)}}},maxSize:{get:function(){return this.eg},set:function(a){if(!this.eg.w(a)){var b=a.width;isNaN(b)&&(b=Infinity);a=a.height;isNaN(a)&&(a=Infinity);this.eg.h(b,a)}}},cellSize:{get:function(){return this.Qg},set:function(a){this.Qg.w(a)||this.Qg.assign(a)}},\nisGridSnapEnabled:{get:function(){return this.I},set:function(a){this.I=a}},dragsMembers:{get:function(){return this.T},set:function(a){this.T=a}},oppositePoint:{get:function(){return this.Hs},set:function(a){this.Hs.w(a)||this.Hs.assign(a)}},originalDesiredSize:{get:function(){return this.Gx}},originalLocation:{get:function(){return this.qp}}});\nvg.className=\"ResizingTool\";Na(\"resizingTool\",function(){return this.findTool(\"Resizing\")},function(a){this.Ya(\"Resizing\",a,this.mouseDownTools)});function Cg(){Ee.call(this);this.name=\"Rotating\";this.La=45;this.Ka=2;this.qp=new J;this.ie=null;var a=new Kf;a.figure=\"Ellipse\";a.desiredSize=Lb;a.fill=\"lightblue\";a.stroke=\"dodgerblue\";a.strokeWidth=1;a.cursor=\"pointer\";this.u=a;this.l=null;this.Fx=0;this.Ps=new J(NaN,NaN);this.I=0;this.T=50}ma(Cg,Ee);\nCg.prototype.updateAdornments=function(a){if(null!==a){if(a.Ph()){var b=a.rotateObject;if(b===a||b===a.path||b.isPanelMain)return}if(a.isSelected&&!this.diagram.isReadOnly&&(b=a.rotateObject,null!==b&&a.canRotate()&&a.actualBounds.s()&&a.isVisible()&&b.actualBounds.s()&&b.Gf())){var c=a.wk(this.name);if(null===c||c.adornedObject!==b)c=this.makeAdornment(b);if(null!==c){c.angle=b.lj();null===c.placeholder&&(c.location=this.computeAdornmentLocation(b));a.Gh(this.name,c);return}}a.Hf(this.name)}};\nCg.prototype.makeAdornment=function(a){var b=a.part.rotateAdornmentTemplate;if(null===b){b=new Je;b.type=X.Position;b.locationSpot=zc;var c=this.handleArchetype;null!==c&&b.add(c.copy())}else if(yg(b),b=b.copy(),null===b)return null;b.adornedObject=a;return b};Cg.prototype.canStart=function(){if(!this.isEnabled)return!1;var a=this.diagram;return!a.isReadOnly&&a.allowRotate&&a.lastInput.left?null!==this.findToolHandleAt(a.firstInput.documentPoint,this.name):!1};\nCg.prototype.doActivate=function(){var a=this.diagram;if(null===this.adornedObject){null===this.handle&&(this.handle=this.findToolHandleAt(a.firstInput.documentPoint,this.name));if(null===this.handle)return;this.adornedObject=this.handle.part.adornedObject}null!==this.adornedObject&&(a.isMouseCaptured=!0,a.delaysLayout=!0,this.va(this.name),this.Fx=this.adornedObject.angle,this.Ps=this.computeRotationPoint(this.adornedObject),this.qp=this.adornedObject.part.location.copy(),this.isActive=!0)};\nCg.prototype.computeRotationPoint=function(a){var b=a.part,c=b.locationObject;return b.rotationSpot.kb()?a.da(b.rotationSpot):a===b||a===c?c.da(b.locationSpot):a.da(zc)};\nCg.prototype.computeAdornmentLocation=function(a){var b=this.rotationPoint;b.s()||(b=this.computeRotationPoint(a));b=a.Mt(b);var c=this.handleAngle;0>c?c+=360:360<=c&&(c-=360);c=Math.round(45*Math.round(c/45));var d=this.handleDistance;0===c?b.x=a.naturalBounds.width+d:45===c?(b.x=a.naturalBounds.width+d,b.y=a.naturalBounds.height+d):90===c?b.y=a.naturalBounds.height+d:135===c?(b.x=-d,b.y=a.naturalBounds.height+d):180===c?b.x=-d:225===c?(b.x=-d,b.y=-d):270===c?b.y=-d:315===c&&(b.x=a.naturalBounds.width+\nd,b.y=-d);return a.da(b)};Cg.prototype.doDeactivate=function(){var a=this.diagram;this.Jg();this.ie=this.handle=null;this.Ps=new J(NaN,NaN);this.isActive=a.isMouseCaptured=!1};Cg.prototype.doCancel=function(){this.diagram.delaysLayout=!1;this.rotate(this.originalAngle);this.stopTool()};Cg.prototype.doMouseMove=function(){var a=this.diagram;this.isActive&&(a=this.computeRotate(a.lastInput.documentPoint),this.rotate(a))};\nCg.prototype.doMouseUp=function(){var a=this.diagram;if(this.isActive){a.delaysLayout=!1;var b=this.computeRotate(a.lastInput.documentPoint);this.rotate(b);a.Na();this.transactionResult=this.name;a.R(\"PartRotated\",this.adornedObject,this.originalAngle)}this.stopTool()};\nCg.prototype.rotate=function(a){var b=this.adornedObject;if(null!==b){b.angle=a;b=b.part;b.Ta();var c=b.locationObject,d=b.rotateObject;if(c===d||c.Gg(d))c=this.qp.copy(),b.location=c.ge(this.rotationPoint).rotate(a-this.originalAngle).add(this.rotationPoint);this.diagram.hd()}};\nCg.prototype.computeRotate=function(a){a=this.rotationPoint.Pa(a)-this.handleAngle;var b=this.adornedObject.panel;null!==b&&(a-=b.lj());360<=a?a-=360:0>a&&(a+=360);b=Math.min(Math.abs(this.snapAngleMultiple),180);var c=Math.min(Math.abs(this.snapAngleEpsilon),b/2);!this.diagram.lastInput.shift&&0<b&&0<c&&(a%b<c?a=Math.floor(a/b)*b:a%b>b-c&&(a=(Math.floor(a/b)+1)*b));360<=a?a-=360:0>a&&(a+=360);return a};\nna.Object.defineProperties(Cg.prototype,{handleArchetype:{get:function(){return this.u},set:function(a){this.u=a}},handle:{get:function(){return this.l},set:function(a){if(null!==a&&!(a.part instanceof Je))throw Error(\"new handle is not in an Adornment: \"+a);this.l=a}},adornedObject:{get:function(){return this.ie},set:function(a){if(null!==a&&a.part instanceof Je)throw Error(\"new handle must not be in an Adornment: \"+\na);this.ie=a}},snapAngleMultiple:{get:function(){return this.La},set:function(a){this.La=a}},snapAngleEpsilon:{get:function(){return this.Ka},set:function(a){this.Ka=a}},originalAngle:{get:function(){return this.Fx}},rotationPoint:{get:function(){return this.Ps},set:function(a){this.Ps=a.copy()}},handleAngle:{get:function(){return this.I},set:function(a){this.I=\na}},handleDistance:{get:function(){return this.T},set:function(a){this.T=a}}});Cg.className=\"RotatingTool\";Na(\"rotatingTool\",function(){return this.findTool(\"Rotating\")},function(a){this.Ya(\"Rotating\",a,this.mouseDownTools)});function Dg(){Ee.call(this);this.name=\"ClickSelecting\"}ma(Dg,Ee);Dg.prototype.canStart=function(){return!this.isEnabled||this.isBeyondDragSize()?!1:!0};\nDg.prototype.doMouseUp=function(){this.isActive&&(this.standardMouseSelect(),!this.standardMouseClick()&&this.diagram.lastInput.isTouchEvent&&this.diagram.toolManager.doToolTip());this.stopTool()};Dg.className=\"ClickSelectingTool\";function Eg(){Ee.call(this);this.name=\"Action\";this.Xk=null}ma(Eg,Ee);\nEg.prototype.canStart=function(){if(!this.isEnabled)return!1;var a=this.diagram,b=a.lastInput,c=a.Vb(b.documentPoint,function(a){for(;null!==a.panel&&!a.isActionable;)a=a.panel;return a});if(null!==c){if(!c.isActionable)return!1;this.Xk=c;a.Ej=a.Vb(b.documentPoint,null,null);return!0}return!1};Eg.prototype.doMouseDown=function(){if(this.isActive){var a=this.diagram.lastInput,b=this.Xk;null!==b&&(a.targetObject=b,null!==b.actionDown&&b.actionDown(a,b))}else this.canStart()&&this.doActivate()};\nEg.prototype.doMouseMove=function(){if(this.isActive){var a=this.diagram.lastInput,b=this.Xk;null!==b&&(a.targetObject=b,null!==b.actionMove&&b.actionMove(a,b))}};Eg.prototype.doMouseUp=function(){if(this.isActive){var a=this.diagram.lastInput,b=this.Xk;if(null===b)return;a.targetObject=b;null!==b.actionUp&&b.actionUp(a,b);this.standardMouseClick(function(a){for(;null!==a.panel&&(!a.isActionable||a!==b);)a=a.panel;return a},function(a){return a===b})}this.stopTool()};\nEg.prototype.doCancel=function(){var a=this.diagram.lastInput,b=this.Xk;null!==b&&(a.targetObject=b,null!==b.actionCancel&&b.actionCancel(a,b),this.stopTool())};Eg.prototype.doStop=function(){this.Xk=null};Eg.className=\"ActionTool\";function Fg(){Ee.call(this);this.name=\"ClickCreating\";this.Aj=null;this.u=!0;this.l=!1;this.xx=new J(0,0)}ma(Fg,Ee);\nFg.prototype.canStart=function(){if(!this.isEnabled||null===this.archetypeNodeData)return!1;var a=this.diagram;if(a.isReadOnly||a.isModelReadOnly||!a.allowInsert||!a.lastInput.left||this.isBeyondDragSize())return!1;if(this.isDoubleClick){if(1===a.lastInput.clickCount&&(this.xx=a.lastInput.viewPoint.copy()),2!==a.lastInput.clickCount||this.isBeyondDragSize(this.xx))return!1}else if(1!==a.lastInput.clickCount)return!1;return a.currentTool!==this&&null!==a.zm(a.lastInput.documentPoint,!0)?!1:!0};\nFg.prototype.doMouseUp=function(){var a=this.diagram;this.isActive&&this.insertPart(a.lastInput.documentPoint);this.stopTool()};\nFg.prototype.insertPart=function(a){var b=this.diagram,c=this.archetypeNodeData;if(null===c)return null;var d=null;try{b.R(\"ChangingSelection\",b.selection);this.va(this.name);if(c instanceof V)c.Nc()&&(yg(c),d=c.copy(),null!==d&&b.add(d));else if(null!==c){var e=b.model.copyNodeData(c);za(e)&&(b.model.uf(e),d=b.zc(e))}if(null!==d){var f=J.allocAt(a.x,a.y);this.isGridSnapEnabled&&Gg(this.diagram,d,a,f);d.location=f;b.allowSelect&&(b.clearSelection(!0),d.isSelected=!0);J.free(f)}b.Na();this.transactionResult=\nthis.name;b.R(\"PartCreated\",d)}finally{this.Jg(),b.R(\"ChangedSelection\",b.selection)}return d};na.Object.defineProperties(Fg.prototype,{archetypeNodeData:{get:function(){return this.Aj},set:function(a){this.Aj=a}},isDoubleClick:{get:function(){return this.u},set:function(a){this.u=a}},isGridSnapEnabled:{get:function(){return this.l},set:function(a){this.l=a}}});Fg.className=\"ClickCreatingTool\";\nfunction Hg(){Ee.call(this);this.name=\"DragSelecting\";this.pl=175;this.u=!1;var a=new V;a.layerName=\"Tool\";a.selectable=!1;var b=new Kf;b.name=\"SHAPE\";b.figure=\"Rectangle\";b.fill=null;b.stroke=\"magenta\";a.add(b);this.l=a}ma(Hg,Ee);\nHg.prototype.canStart=function(){if(!this.isEnabled)return!1;var a=this.diagram;if(!a.allowSelect)return!1;var b=a.lastInput;return!b.left||a.currentTool!==this&&(!this.isBeyondDragSize()||b.timestamp-a.firstInput.timestamp<this.delay||null!==a.zm(b.documentPoint,!0))?!1:!0};Hg.prototype.doActivate=function(){var a=this.diagram;this.isActive=!0;a.isMouseCaptured=!0;a.skipsUndoManager=!0;a.add(this.box);this.doMouseMove()};\nHg.prototype.doDeactivate=function(){var a=this.diagram;a.Jf();a.remove(this.box);a.skipsUndoManager=!1;this.isActive=a.isMouseCaptured=!1};Hg.prototype.doMouseMove=function(){var a=this.diagram;if(this.isActive&&null!==this.box){var b=this.computeBoxBounds(),c=this.box.bb(\"SHAPE\");null===c&&(c=this.box.tb());var d=M.alloc().h(b.width,b.height);b=J.allocAt(b.x,b.y);c.desiredSize=d;this.box.position=b;M.free(d);J.free(b);(a.allowHorizontalScroll||a.allowVerticalScroll)&&a.Et(a.lastInput.viewPoint)}};\nHg.prototype.doMouseUp=function(){if(this.isActive){var a=this.diagram;a.remove(this.box);try{a.currentCursor=\"wait\",a.R(\"ChangingSelection\",a.selection),this.selectInRect(this.computeBoxBounds()),a.R(\"ChangedSelection\",a.selection)}finally{a.currentCursor=\"\"}}this.stopTool()};Hg.prototype.computeBoxBounds=function(){var a=this.diagram;return new N(a.firstInput.documentPoint,a.lastInput.documentPoint)};\nHg.prototype.selectInRect=function(a){var b=this.diagram,c=b.lastInput;a=b.ty(a,this.isPartialInclusion);if(Va?c.meta:c.control)if(c.shift)for(a=a.iterator;a.next();)b=a.value,b.isSelected&&(b.isSelected=!1);else for(a=a.iterator;a.next();)b=a.value,b.isSelected=!b.isSelected;else if(c.shift)for(a=a.iterator;a.next();)b=a.value,b.isSelected||(b.isSelected=!0);else{c=new E;for(b=b.selection.iterator;b.next();){var d=b.value;a.contains(d)||c.add(d)}for(b=c.iterator;b.next();)b.value.isSelected=!1;for(a=\na.iterator;a.next();)b=a.value,b.isSelected||(b.isSelected=!0)}};na.Object.defineProperties(Hg.prototype,{delay:{get:function(){return this.pl},set:function(a){this.pl=a}},isPartialInclusion:{get:function(){return this.u},set:function(a){this.u=a}},box:{get:function(){return this.l},set:function(a){this.l=a}}});Hg.className=\"DragSelectingTool\";\nfunction Ig(){Ee.call(this);this.name=\"Panning\";this.kv=new J;this.kz=new J;this.Pg=!1;var a=this;this.Lx=function(){var b=a.diagram;null!==b&&b.removeEventListener(x.document,\"scroll\",a.Lx,!1);a.stopTool()}}ma(Ig,Ee);Ig.prototype.canStart=function(){if(!this.isEnabled)return!1;var a=this.diagram;return!a.allowHorizontalScroll&&!a.allowVerticalScroll||!a.lastInput.left||a.currentTool!==this&&!this.isBeyondDragSize()?!1:!0};\nIg.prototype.doActivate=function(){var a=this.diagram;this.Pg?(a.lastInput.bubbles=!0,a.addEventListener(x.document,\"scroll\",this.Lx,!1)):(a.currentCursor=\"move\",a.isMouseCaptured=!0,this.kv.assign(a.position));this.isActive=!0};Ig.prototype.doDeactivate=function(){var a=this.diagram;a.currentCursor=\"\";this.isActive=a.isMouseCaptured=!1};Ig.prototype.doCancel=function(){var a=this.diagram;a.position=this.kv;a.isMouseCaptured=!1;this.stopTool()};Ig.prototype.doMouseMove=function(){this.move()};\nIg.prototype.doMouseUp=function(){this.move();this.stopTool()};Ig.prototype.move=function(){var a=this.diagram;if(this.isActive&&a)if(this.Pg)a.lastInput.bubbles=!0;else{var b=a.position,c=a.firstInput.documentPoint,d=a.lastInput.documentPoint,e=b.x+c.x-d.x;c=b.y+c.y-d.y;a.allowHorizontalScroll||(e=b.x);a.allowVerticalScroll||(c=b.y);a.position=this.kz.h(e,c)}};\nna.Object.defineProperties(Ig.prototype,{bubbles:{get:function(){return this.Pg},set:function(a){this.Pg=a}},originalPosition:{get:function(){return this.kv}}});Ig.className=\"PanningTool\";Na(\"clickCreatingTool\",function(){return this.findTool(\"ClickCreating\")},function(a){this.Ya(\"ClickCreating\",a,this.mouseUpTools)});Na(\"clickSelectingTool\",function(){return this.findTool(\"ClickSelecting\")},function(a){this.Ya(\"ClickSelecting\",a,this.mouseUpTools)});\nNa(\"panningTool\",function(){return this.findTool(\"Panning\")},function(a){this.Ya(\"Panning\",a,this.mouseMoveTools)});Na(\"dragSelectingTool\",function(){return this.findTool(\"DragSelecting\")},function(a){this.Ya(\"DragSelecting\",a,this.mouseMoveTools)});Na(\"actionTool\",function(){return this.findTool(\"Action\")},function(a){this.Ya(\"Action\",a,this.mouseDownTools)});function Te(){this.T=this.I=this.l=this.u=null}\nna.Object.defineProperties(Te.prototype,{mainElement:{get:function(){return this.I},set:function(a){this.I=a}},show:{get:function(){return this.u},set:function(a){this.u!==a&&(this.u=a)}},hide:{get:function(){return this.l},set:function(a){this.l!==a&&(this.l=a)}},valueFunction:{get:function(){return this.T},set:function(a){this.T=a}}});Te.className=\"HTMLInfo\";\nfunction Jg(a,b,c){this.text=a;this.by=b;this.visible=c}Jg.className=\"ContextMenuButtonInfo\";function Kg(){Ee.call(this);this.name=\"ContextMenu\";this.u=this.Cu=this.l=null;this.Cx=new J;this.Du=null;this.Yu=!1;var a=this;this.wv=function(){a.stopTool()}}ma(Kg,Ee);\nfunction Lg(a){var b=new Te;b.show=function(a,b,c){c.showDefaultContextMenu()};b.hide=function(a,b){b.hideDefaultContextMenu()};Mg=b;a.wv=function(){a.stopTool()};b=ua(\"div\");var c=ua(\"div\");b.style.cssText=\"top: 0px;z-index:10002;position: fixed;display: none;text-align: center;left: 25%;width: 50%;background-color: #F5F5F5;padding: 16px;border: 16px solid #444;border-radius: 10px;margin-top: 10px\";c.style.cssText=\"z-index:10001;position: fixed;display: none;top: 0;left: 0;width: 100%;height: 100%;background-color: black;opacity: 0.8;\";\nvar d=ua(\"style\");x.document.getElementsByTagName(\"head\")[0].appendChild(d);d.sheet.insertRule(\".goCXul { list-style: none; }\",0);d.sheet.insertRule(\".goCXli {font:700 1.5em Helvetica, Arial, sans-serif;position: relative;min-width: 60px; }\",0);d.sheet.insertRule(\".goCXa {color: #444;display: inline-block;padding: 4px;text-decoration: none;margin: 2px;border: 1px solid gray;border-radius: 10px; }\",0);d=a.diagram;null!==d&&(d.addEventListener(b,\"contextmenu\",Ng,!1),d.addEventListener(b,\"selectstart\",\nNg,!1),d.addEventListener(c,\"contextmenu\",Ng,!1));b.className=\"goCXforeground\";c.className=\"goCXbackground\";x.document.body&&(x.document.body.appendChild(b),x.document.body.appendChild(c));Og=b;Pg=c;Qg=!0}function Ng(a){a.preventDefault();return!1}\nKg.prototype.canStart=function(){if(!this.isEnabled)return!1;var a=this.diagram;return this.isBeyondDragSize()||!a.lastInput.right||1<a.lastInput.clickCount?!1:a.lastInput.isTouchEvent&&null!==this.defaultTouchContextMenu||null!==this.findObjectWithContextMenu()?!0:!1};Kg.prototype.doStart=function(){this.Cx.set(this.diagram.firstInput.documentPoint)};Kg.prototype.doStop=function(){this.hideContextMenu();this.currentObject=null};\nKg.prototype.findObjectWithContextMenu=function(a){void 0===a&&(a=null);var b=this.diagram,c=b.lastInput,d=null;a instanceof R||(a instanceof Y?d=a:d=b.Vb(c.documentPoint,null,function(a){return!a.layer.isTemporary}));if(null!==d){for(a=d;null!==a;){if(null!==a.contextMenu)return a;a=a.panel}if(b.lastInput.isTouchEvent&&this.defaultTouchContextMenu)return d.part}else if(null!==b.contextMenu)return b;return null};Kg.prototype.doActivate=function(){};\nKg.prototype.doMouseDown=function(){Ee.prototype.doMouseDown.call(this);if(this.isActive&&this.currentContextMenu instanceof Je){var a=this.diagram.toolManager.findTool(\"Action\");null!==a&&a.canStart()&&(a.doActivate(),a.doMouseDown(),a.doDeactivate())}this.diagram.toolManager.mouseDownTools.contains(this)&&Rg(this)};\nKg.prototype.doMouseUp=function(){if(this.isActive&&this.currentContextMenu instanceof Je){var a=this.diagram.toolManager.findTool(\"Action\");null!==a&&a.canStart()&&(a.doActivate(),a.doCancel(),a.doDeactivate())}Rg(this)};\nfunction Rg(a){var b=a.diagram;if(a.isActive){var c=a.currentContextMenu;if(null!==c){if(!(c instanceof Te)){var d=b.Vb(b.lastInput.documentPoint,null,null);null!==d&&d.Gg(c)&&a.standardMouseClick(null,null)}a.stopTool();a.canStart()&&(b.currentTool=a,a.doMouseUp())}}else a.canStart()&&(Sg(a,!0),a.isActive||a.stopTool())}\nfunction Sg(a,b,c){void 0===c&&(c=null);if(!a.Yu&&(a.Yu=!0,b&&a.standardMouseSelect(),b=a.standardMouseClick(),a.Yu=!1,!b)){a.isActive=!0;b=Mg;null===c&&(c=a.findObjectWithContextMenu());if(null!==c){var d=c.contextMenu;null!==d?(a.currentObject=c instanceof Y?c:null,a.showContextMenu(d,a.currentObject)):null!==b&&a.showContextMenu(b,a.currentObject)}else null!==b&&a.showContextMenu(b,null);a.currentContextMenu instanceof Je&&!a.currentContextMenu.visible&&a.stopTool()}}\nKg.prototype.doMouseMove=function(){var a=this.diagram.toolManager.findTool(\"Action\");null!==a&&a.doMouseMove();this.isActive&&this.diagram.toolManager.doMouseMove()};\nKg.prototype.showContextMenu=function(a,b){var c=this.diagram;a!==this.currentContextMenu&&this.hideContextMenu();if(a instanceof Je){a.layerName=\"Tool\";a.selectable=!1;a.scale=1/c.scale;a.category=this.name;null!==a.placeholder&&(a.placeholder.scale=c.scale);var d=a.diagram;null!==d&&d!==c&&d.remove(a);c.add(a);null!==b?a.adornedObject=b:a.data=c.model;a.Ta();this.positionContextMenu(a,b)}else a instanceof Te&&a.show(b,c,this);this.currentContextMenu=a};\nKg.prototype.positionContextMenu=function(a){if(null===a.placeholder){var b=this.diagram,c=b.lastInput.documentPoint.copy(),d=a.measuredBounds,e=b.viewportBounds;b.lastInput.isTouchEvent&&(c.x-=d.width);c.x+d.width>e.right&&(c.x-=d.width+5/b.scale);c.x<e.x&&(c.x=e.x);c.y+d.height>e.bottom&&(c.y-=d.height+5/b.scale);c.y<e.y&&(c.y=e.y);a.position=c}};\nKg.prototype.hideContextMenu=function(){var a=this.diagram,b=this.currentContextMenu;null!==b&&(b instanceof Je?(a.remove(b),null!==this.Cu&&this.Cu.Hf(b.category),b.data=null,b.adornedObject=null):b instanceof Te&&(null!==b.hide?b.hide(a,this):null!==b.mainElement&&(b.mainElement.style.display=\"none\")),this.currentContextMenu=null,this.standardMouseOver())};\nfunction Tg(a){var b=new E;b.add(new Jg(\"Copy\",function(a){a.commandHandler.copySelection()},function(a){return a.commandHandler.canCopySelection()}));b.add(new Jg(\"Cut\",function(a){a.commandHandler.cutSelection()},function(a){return a.commandHandler.canCutSelection()}));b.add(new Jg(\"Delete\",function(a){a.commandHandler.deleteSelection()},function(a){return a.commandHandler.canDeleteSelection()}));b.add(new Jg(\"Paste\",function(b){b.commandHandler.pasteSelection(a.mouseDownPoint)},function(b){return b.commandHandler.canPasteSelection(a.mouseDownPoint)}));\nb.add(new Jg(\"Select All\",function(a){a.commandHandler.selectAll()},function(a){return a.commandHandler.canSelectAll()}));b.add(new Jg(\"Undo\",function(a){a.commandHandler.undo()},function(a){return a.commandHandler.canUndo()}));b.add(new Jg(\"Redo\",function(a){a.commandHandler.redo()},function(a){return a.commandHandler.canRedo()}));b.add(new Jg(\"Scroll To Part\",function(a){a.commandHandler.scrollToPart()},function(a){return a.commandHandler.canScrollToPart()}));b.add(new Jg(\"Zoom To Fit\",function(a){a.commandHandler.zoomToFit()},\nfunction(a){return a.commandHandler.canZoomToFit()}));b.add(new Jg(\"Reset Zoom\",function(a){a.commandHandler.resetZoom()},function(a){return a.commandHandler.canResetZoom()}));b.add(new Jg(\"Group Selection\",function(a){a.commandHandler.groupSelection()},function(a){return a.commandHandler.canGroupSelection()}));b.add(new Jg(\"Ungroup Selection\",function(a){a.commandHandler.ungroupSelection()},function(a){return a.commandHandler.canUngroupSelection()}));b.add(new Jg(\"Edit Text\",function(a){a.commandHandler.editTextBlock()},\nfunction(a){return a.commandHandler.canEditTextBlock()}));return b}\nKg.prototype.showDefaultContextMenu=function(){var a=this.diagram;null===this.Du&&(this.Du=Tg(this));Og.innerHTML=\"\";Pg.addEventListener(\"click\",this.wv,!1);var b=this,c=ua(\"ul\");c.className=\"goCXul\";Og.appendChild(c);c.innerHTML=\"\";for(var d=this.Du.iterator;d.next();){var e=d.value,f=e.visible;if(\"function\"===typeof e.by&&(\"function\"!==typeof f||f(a))){f=ua(\"li\");f.className=\"goCXli\";var g=ua(\"a\");g.className=\"goCXa\";g.href=\"#\";g.dz=e.by;g.addEventListener(\"click\",function(c){this.dz(a);b.stopTool();\nc.preventDefault();return!1},!1);g.textContent=e.text;f.appendChild(g);c.appendChild(f)}}Og.style.display=\"block\";Pg.style.display=\"block\"};Kg.prototype.hideDefaultContextMenu=function(){if(null!==this.currentContextMenu&&this.currentContextMenu===Mg){Og.style.display=\"none\";Pg.style.display=\"none\";var a=this.diagram;null!==a&&a.removeEventListener(Pg,\"click\",this.wv,!1);this.currentContextMenu=null}};\nna.Object.defineProperties(Kg.prototype,{currentContextMenu:{get:function(){return this.l},set:function(a){this.l=a;this.Cu=a instanceof Je?a.adornedPart:null}},defaultTouchContextMenu:{get:function(){!1===Qg&&null===Mg&&Ug&&Lg(this);return Mg},set:function(a){null===a&&(Qg=!0);Mg=a}},currentObject:{get:function(){return this.u},set:function(a){this.u=a}},mouseDownPoint:{get:function(){return this.Cx}}});\nvar Mg=null,Qg=!1,Pg=null,Og=null;Kg.className=\"ContextMenuTool\";Na(\"contextMenuTool\",function(){return this.findTool(\"ContextMenu\")},function(a){this.Ya(\"ContextMenu\",a,this.mouseUpTools)});function Vg(){Ee.call(this);this.name=\"TextEditing\";this.zh=new Wg;this.La=null;this.Ka=Xg;this.Wi=null;this.ia=Yg;this.I=1;this.T=!0;this.u=null;this.l=new Te;this.Hu=null;Zg(this,this.l)}ma(Vg,Ee);\nfunction Zg(a,b){if(Ug){var c=ua(\"textarea\");a.Hu=c;c.addEventListener(\"input\",function(){if(null!==a.textBlock){var b=a.Jy(this.value);this.style.width=20+b.measuredBounds.width*this.eB+\"px\";this.rows=b.lineCount}},!1);c.addEventListener(\"keydown\",function(b){if(null!==a.textBlock){var c=b.key;\"Enter\"===c?(!1===a.textBlock.isMultiline&&b.preventDefault(),a.acceptText($g)):\"Tab\"===c?(a.acceptText(ah),b.preventDefault()):\"Escape\"===c&&(a.doCancel(),null!==a.diagram&&a.diagram.doFocus())}},!1);c.addEventListener(\"focus\",\nfunction(){if(null!==a.currentTextEditor&&a.state!==Yg){var b=a.Hu;a.ia===bh&&(a.ia=ch);\"function\"===typeof b.select&&a.selectsTextOnActivate&&(b.select(),b.setSelectionRange(0,9999))}},!1);c.addEventListener(\"blur\",function(){if(null!==a.currentTextEditor&&a.state!==Yg){var b=a.Hu;\"function\"===typeof b.focus&&b.focus();\"function\"===typeof b.select&&a.selectsTextOnActivate&&(b.select(),b.setSelectionRange(0,9999))}},!1);b.valueFunction=function(){return c.value};b.mainElement=c;b.show=function(a,\nb,f){if(a instanceof Wg&&f instanceof Vg)if(f.state===dh)c.style.border=\"3px solid red\",c.focus();else{var d=a.da(zc),e=b.position,k=b.scale,l=a.Af()*k;l<f.minimumEditorScale&&(l=f.minimumEditorScale);var m=a.naturalBounds.width*l+6,n=a.naturalBounds.height*l+2,p=(d.x-e.x)*k;d=(d.y-e.y)*k;c.value=a.text;b.div.style.font=a.font;c.style.position=\"absolute\";c.style.zIndex=\"100\";c.style.font=\"inherit\";c.style.fontSize=100*l+\"%\";c.style.lineHeight=\"normal\";c.style.width=m+\"px\";c.style.left=(p-m/2|0)-1+\n\"px\";c.style.top=(d-n/2|0)-1+\"px\";c.style.textAlign=a.textAlign;c.style.margin=\"0\";c.style.padding=\"1px\";c.style.border=\"0\";c.style.outline=\"none\";c.style.whiteSpace=\"pre-wrap\";c.style.overflow=\"hidden\";c.rows=a.lineCount;c.eB=l;c.className=\"goTXarea\";b.div.appendChild(c);c.focus();f.selectsTextOnActivate&&(c.select(),c.setSelectionRange(0,9999))}};b.hide=function(a){a.div.removeChild(c)}}}\nVg.prototype.canStart=function(){if(!this.isEnabled)return!1;var a=this.diagram;if(null===a||a.isReadOnly||eh&&eh!==this&&(eh.acceptText(fh),eh&&eh!==this)||!a.lastInput.left||this.isBeyondDragSize())return!1;var b=a.Vb(a.lastInput.documentPoint);if(!(null!==b&&b instanceof Wg&&b.editable&&b.part.canEdit()))return!1;b=b.part;return null===b||this.starting===Xg&&!b.isSelected||this.starting===gh&&2>a.lastInput.clickCount?!1:!0};Vg.prototype.doStart=function(){eh=this;null!==this.textBlock&&this.doActivate()};\nVg.prototype.doActivate=function(){if(!this.isActive){var a=this.diagram;if(null!==a){var b=this.textBlock;null===b&&(b=a.Vb(a.lastInput.documentPoint));if(null!==b&&b instanceof Wg&&(this.textBlock=b,null!==b.part)){this.isActive=!0;this.ia=bh;var c=this.defaultTextEditor;null!==b.textEditor&&(c=b.textEditor);this.zh=this.textBlock.copy();var d=new N(this.textBlock.da(tc),this.textBlock.da(Dc));a.Aw(d);c.show(b,a,this);this.currentTextEditor=c}}}};Vg.prototype.doCancel=function(){this.stopTool()};\nVg.prototype.doMouseUp=function(){this.canStart()&&this.doActivate()};Vg.prototype.doMouseDown=function(){this.isActive&&this.acceptText(fh)};Vg.prototype.acceptText=function(a){switch(a){case fh:if(this.ia===hh)this.currentTextEditor instanceof HTMLElement&&this.currentTextEditor.focus();else if(this.ia===bh||this.ia===dh||this.ia===ch)this.ia=ih,jh(this);break;case kh:case $g:case ah:if($g!==a||!0!==this.textBlock.isMultiline)if(this.ia===bh||this.ia===dh||this.ia===ch)this.ia=ih,jh(this)}};\nfunction jh(a){var b=a.textBlock,c=a.diagram,d=a.currentTextEditor;if(null!==b&&null!==d){var e=b.text,f=\"\";null!==d.valueFunction&&(f=d.valueFunction());a.isValidText(b,e,f)?(a.va(a.name),a.ia=hh,a.transactionResult=a.name,b.text=f,a.doSuccess(e,f),null!==c&&c.R(\"TextEdited\",b,e),a.Jg(),a.stopTool(),null!==c&&c.doFocus()):(a.ia=dh,a.doError(e,f))}}\nVg.prototype.doError=function(a,b){var c=this.textBlock;null!==c.errorFunction&&c.errorFunction(this,a,b);(a=this.currentTextEditor)&&a.show(c,this.diagram,this)};Vg.prototype.doSuccess=function(a,b){var c=this.textBlock;null!==c.textEdited&&c.textEdited(c,a,b)};Vg.prototype.doDeactivate=function(){var a=this.diagram;null!==a&&(this.ia=Yg,this.textBlock=null,null!==this.currentTextEditor&&this.currentTextEditor.hide(a,this),this.isActive=!1)};Vg.prototype.doStop=function(){eh=null};\nVg.prototype.isValidText=function(a,b,c){var d=this.textValidation;if(null!==d&&!d(a,b,c))return!1;d=a.textValidation;return null===d||d(a,b,c)?!0:!1};Vg.prototype.Jy=function(a){var b=this.zh;b.text=a;b.measure(this.textBlock.Ei,Infinity);return b};\nna.Object.defineProperties(Vg.prototype,{textBlock:{get:function(){return this.La},set:function(a){this.La=a}},currentTextEditor:{get:function(){return this.u},set:function(a){this.u=a}},defaultTextEditor:{get:function(){return this.l},set:function(a){this.l=a}},starting:{get:function(){return this.Ka},set:function(a){this.Ka=a}},textValidation:{get:function(){return this.Wi},\nset:function(a){this.Wi=a}},minimumEditorScale:{get:function(){return this.I},set:function(a){this.I=a}},selectsTextOnActivate:{get:function(){return this.T},set:function(a){this.T=a}},state:{get:function(){return this.ia},set:function(a){this.ia!==a&&(this.ia=a)}}});Vg.prototype.measureTemporaryTextBlock=Vg.prototype.Jy;\nvar kh=new D(Vg,\"LostFocus\",0),fh=new D(Vg,\"MouseDown\",1),ah=new D(Vg,\"Tab\",2),$g=new D(Vg,\"Enter\",3),lh=new D(Vg,\"SingleClick\",0),Xg=new D(Vg,\"SingleClickSelected\",1),gh=new D(Vg,\"DoubleClick\",2),Yg=new D(Vg,\"StateNone\",0),bh=new D(Vg,\"StateActive\",1),ch=new D(Vg,\"StateEditing\",2),ih=new D(Vg,\"StateValidating\",3),dh=new D(Vg,\"StateInvalid\",4),hh=new D(Vg,\"StateValidated\",5),eh=null;Vg.className=\"TextEditingTool\";Vg.LostFocus=kh;Vg.MouseDown=fh;Vg.Tab=ah;Vg.Enter=$g;Vg.SingleClick=lh;\nVg.SingleClickSelected=Xg;Vg.DoubleClick=gh;Vg.StateNone=Yg;Vg.StateActive=bh;Vg.StateEditing=ch;Vg.StateValidating=ih;Vg.StateInvalid=dh;Vg.StateValidated=hh;Na(\"textEditingTool\",function(){return this.findTool(\"TextEditing\")},function(a){this.Ya(\"TextEditing\",a,this.mouseUpTools)});\nfunction mh(){nh||(oh(),nh=!0);this.C=Fe;this.zl=this.ef=this.sc=this.ps=this.jc=!1;this.Qx=!0;this.Al=ph;this.tn=!1;this.zi=this.md=!0;this.Yg=600;this.ox=this.Px=!1;this.Re=new G;this.Rd=new qh;this.Rd.Uc=this;this.yj=new G;this.tv=new G;this.ot=new G;this.$l=new G}mh.prototype.ee=function(a){this.C=a};mh.prototype.canStart=function(){return!0};function rh(a,b){sh(a,b)&&(a.ef=!0)}\nfunction sh(a,b){if(!a.md||!a.canStart(b))return!1;a.Re.add(b);a.defaultAnimation.isAnimating&&a.Bc();return a.sc=!0}\nfunction th(a){if(a.md&&a.sc){var b=a.Rd,c=a.C,d=a.Re.contains(\"Model\");d&&(a.zl=!0,a.Al===ph?(b.isViewportUnconstrained=!0,b.lc.clear(),b.add(c,\"position\",c.position.copy().offset(0,-200),c.position),b.add(c,\"opacity\",0,1)):a.Al===uh&&b.lc.clear(),a.Qx=a.Al===vh&&c.Ts.w(c.la)?!0:!1,c.R(\"InitialAnimationStarting\",a));d&&!a.zi||0===b.lc.count?(a.Re.clear(),a.sc=!1,a.ef=!1,b.lc.clear(),wh(b,c),a.zl=!1,c.M()):(a.Re.clear(),c.Ee=!1,d=b.lc.get(c),c.autoScale!==xh&&null!==d&&(delete d.start.scale,delete d.end.scale),\nx.requestAnimationFrame(function(){!1===a.sc||b.jc||(c.Ke(\"temporaryPixelRatio\")&&Ze(c),Kh(c),a.sc=!1,a.ef=!1,b.start(),Lh(a),c.Na(),Mh(b,0),Hf(c,!0),Nh(a),c.R(\"AnimationStarting\",a))}))}}function Oh(a,b,c,d){a.isTicking||b instanceof S&&(null!==b.fromNode||null!==b.toNode)||a.Rd.add(b,\"position\",c,d,!1)}t=mh.prototype;t.cu=function(a){return this.Rd.cu(a)};t.ew=function(a){return this.Rd.ew(a)};\nfunction Ph(a,b){function c(){0<e.ot.count&&(d.addAll(e.ot),e.ot.clear(),e.jc=!0);if(!1!==e.jc&&0!==d.count){e.tv.addAll(d);for(var a=e.tv.iterator;a.next();){var b=a.value;if(!1!==b.jc){a:if(0<b.qm.count)var h=!0;else{for(h=b.lc.iterator;h.next();){var k=h.key;if(k instanceof Y&&null!==k.diagram||k instanceof R){h=!0;break a}}h=!1}h?Qh(b,!1):b.Il=!0}}e.tv.clear();Lh(e);Hf(e.C);Nh(e);x.requestAnimationFrame(c)}}var d=a.yj,e=a;a.jc?a.ot.add(b):(a.jc=!0,d.add(b),x.requestAnimationFrame(function(){c()}))}\nfunction Rh(a){for(a=a.yj.iterator;a.next();)a.value.Il=!1}function Lh(a){if(!a.ps){var b=a.C;a.Px=b.skipsUndoManager;a.ox=b.skipsModelSourceBindings;b.skipsUndoManager=!0;b.skipsModelSourceBindings=!0;a.ps=!0}}function Nh(a){var b=a.C;b.skipsUndoManager=a.Px;b.skipsModelSourceBindings=a.ox;a.ps=!1}\nt.Bc=function(a){var b=this.Rd;!0===this.sc&&(this.zl=this.ef=this.sc=!1,this.Re.clear(),0<b.lc.count&&this.C.Db());if(this.jc){if(b.xm(!0),b.lc.clear(),wh(b,null),!0===a)for(a=this.yj.ma(),b=0;b<a.length;b++)a[b].xm(!0)}else b.lc.clear(),wh(b,this.C)};t.xm=function(a){a===this.defaultAnimation&&this.defaultAnimation.lc.clear();this.yj.remove(a);0===this.yj.count&&(this.jc=!1,this.C.Db());a===this.defaultAnimation&&(this.defaultAnimation.lc.clear(),this.C.R(\"AnimationFinished\",this))};\nt.lk=function(a,b){this.ef&&(this.Re.contains(\"Expand Tree\")||this.Re.contains(\"Expand SubGraph\"))&&(this.Rd.lk(a,b),Sh(this,a))};t.jk=function(a,b){this.ef&&(this.Re.contains(\"Collapse Tree\")||this.Re.contains(\"Collapse SubGraph\"))&&(this.Rd.jk(a,b),Th(this.Rd,b,\"position\",b.position,b.position),Sh(this,a))};function Uh(a,b,c){a.ef&&!b.w(c)&&(a.C.pj||(b=c.copy()),Th(a.Rd,a.C,\"position\",b,c))}\nfunction Sh(a,b){for(b=b.findLinksConnected();b.next();){var c=b.value;c.jf=c.points.copy();a.$l.add(c)}}function Vh(a,b,c,d,e){null===a&&(a=[0,0,0,0]);null===b&&(b=[0,0,0,0]);var f=a[0],g=a[1],h=a[2];a=a[3];var k=b[0],l=b[1],m=b[2];b=b[3];if(0===h||100===h)f=k,g=l;else if(0===m||100===m)k=f,l=g;180<Math.abs(k-f)&&(k>f?f+=360:k+=360);f=e(c,f,k-f,d)%360;g=e(c,g,l-g,d);h=e(c,h,m-h,d);c=e(c,a,b-a,d);return\"hsla(\"+f+\", \"+g+\"%, \"+h+\"%, \"+c+\")\"}\nfunction oh(){function a(a,b,e,f,g,h){a.position=new J(f(g,b.x,e.x-b.x,h),f(g,b.y,e.y-b.y,h))}var b=new H;b.add(\"position:diagram\",a);b.add(\"position\",a);b.add(\"position:part\",function(a,b,e,f,g,h){g<h?a.er(f(g,b.x,e.x-b.x,h),f(g,b.y,e.y-b.y,h),!1):a.position=new J(f(g,b.x,e.x-b.x,h),f(g,b.y,e.y-b.y,h))});b.add(\"location\",function(a,b,e,f,g,h){g<h?a.er(f(g,b.x,e.x-b.x,h),f(g,b.y,e.y-b.y,h),!0):a.location=new J(f(g,b.x,e.x-b.x,h),f(g,b.y,e.y-b.y,h))});b.add(\"position:placeholder\",function(a,b,e,f,\ng,h){g<h?a.er(f(g,b.x,e.x-b.x,h),f(g,b.y,e.y-b.y,h),!1):a.position=new J(f(g,b.x,e.x-b.x,h),f(g,b.y,e.y-b.y,h))});b.add(\"position:nodeCollapse\",function(a,b,e,f,g,h){var c=a.actualBounds,d=e.actualBounds;e=d.x+d.width/2-c.width/2;c=d.y+d.height/2-c.height/2;g<h?a.er(f(g,b.x,e-b.x,h),f(g,b.y,c-b.y,h),!1):a.position=new J(f(g,b.x,e-b.x,h),f(g,b.y,c-b.y,h))});b.add(\"desiredSize\",function(a,b,e,f,g,h){a.desiredSize=new N(f(g,b.width,e.width-b.width,h),f(g,b.height,e.height-b.height,h))});b.add(\"width\",\nfunction(a,b,e,f,g,h){a.width=f(g,b,e-b,h)});b.add(\"height\",function(a,b,e,f,g,h){a.height=f(g,b,e-b,h)});b.add(\"fill\",function(a,b,e,f,g,h){a.fill=Vh(b,e,g,h,f)});b.add(\"stroke\",function(a,b,e,f,g,h){a.stroke=Vh(b,e,g,h,f)});b.add(\"strokeWidth\",function(a,b,e,f,g,h){a.strokeWidth=f(g,b,e-b,h)});b.add(\"strokeDashOffset\",function(a,b,e,f,g,h){a.strokeDashOffset=f(g,b,e-b,h)});b.add(\"background\",function(a,b,e,f,g,h){a.background=Vh(b,e,g,h,f)});b.add(\"areaBackground\",function(a,b,e,f,g,h){a.areaBackground=\nVh(b,e,g,h,f)});b.add(\"opacity\",function(a,b,e,f,g,h){a.opacity=f(g,b,e-b,h)});b.add(\"scale\",function(a,b,e,f,g,h){a.scale=f(g,b,e-b,h)});b.add(\"angle\",function(a,b,e,f,g,h){a.angle=f(g,b,e-b,h)});Wh=b}\nna.Object.defineProperties(mh.prototype,{animationReasons:{get:function(){return this.Re}},isEnabled:{get:function(){return this.md},set:function(a){(this.md=a)&&this.yj.each(function(a){a.isAnimating||Infinity!==a.runCount||a.start()})}},duration:{get:function(){return this.Yg},set:function(a){1>a&&wa(a,\">= 1\",mh,\"duration\");this.Yg=a}},isAnimating:{get:function(){return this.jc}},\nisTicking:{get:function(){return this.ps}},isInitial:{get:function(){return this.zi},set:function(a){this.zi=a}},defaultAnimation:{get:function(){return this.Rd}},activeAnimations:{get:function(){return this.yj}},initialAnimationStyle:{get:function(){return this.Al},set:function(a){this.Al=a}}});mh.prototype.stopAnimation=mh.prototype.Bc;\nvar Wh=null,nh=!1,ph=new D(mh,\"Default\",1),vh=new D(mh,\"AnimateLocations\",2),uh=new D(mh,\"None\",3);mh.className=\"AnimationManager\";mh.defineAnimationEffect=function(a,b){nh||(oh(),nh=!0);Wh.add(a,b)};mh.Default=ph;mh.AnimateLocations=vh;mh.None=uh;\nfunction qh(){this.xv=this.Ox=this.Uc=this.C=null;this.Il=this.jc=this.l=!1;this.Zn=this.Dd=0;this.Ir=this.Ku=Xh;this.Hl=this.Fp=!1;this.nv=1;this.mv=0;this.vd=this.Yg=NaN;this.tx=0;this.$n=null;this.u=Bb;this.lc=new H;this.iv=new H;this.qm=new G;this.jv=new G;this.px=Yh}qh.prototype.suspend=function(){this.Il=!0};qh.prototype.advanceTo=function(a,b){b&&(this.Il=!1);this.Fp&&a>=this.vd&&(this.Hl=!0,a-=this.vd);this.tx=a;Qh(this,!0);Lh(this.Uc);Hf(this.C);Nh(this.Uc);this.C.redraw()};\nfunction wh(a,b){a.iv.clear();a.Hl=!1;a.mv=0;a.vd=NaN;0<a.qm.count&&a.qm.clear();0<a.jv.count&&a.jv.clear();if(null!==b)for(a=b.links;a.next();)a.value.jf=null}t=qh.prototype;\nt.start=function(){if(0!==this.lc.count&&!this.jc){for(var a=this.C,b=this.lc.iterator;b.next();){var c=b.value.end,d=b.key;if(c[\"position:placeholder\"]){var e=d.findVisibleNode();if(e instanceof U&&null!==e.placeholder){var f=e.placeholder;e=f.da(tc);f=f.padding;e.x+=f.left;e.y+=f.top;c[\"position:placeholder\"]=e}}null===a&&(d instanceof R?a=d:d instanceof Y&&(a=d.diagram))}null!==a&&(this.C=a,b=this.Uc=a.animationManager,!1!==b.isEnabled&&(this.vd=isNaN(this.Yg)?b.duration:this.Yg,this.Ir=this.Ku,\nb.zl&&b.Al===ph&&this===b.defaultAnimation&&(this.Ir=Zh,this.vd=isNaN(this.Yg)?600===b.duration?900:b.duration:this.Yg),this.px=a.scrollMode,this.isViewportUnconstrained&&(a.Ti=$h),Lh(b),this.qm.each(function(b){b.data=null;a.add(b)}),Nh(b),this.jc=!0,this.Dd=+new Date,this.Zn=this.Dd+this.vd,Ph(b,this)))}};t.sz=function(a,b){a.Nc()&&(this.qm.add(a),this.C=b)};\nt.add=function(a,b,c,d,e){if(\"position\"!==b||!c.w(d)){null===this.C&&(a instanceof R?this.C=a:a instanceof Y&&null!==a.diagram&&(this.C=a.diagram));if(a instanceof V){if(!a.isAnimated)return;\"position\"===b&&(b=\"position:part\")}Th(this,a,b,c,d,e)}};\nfunction Th(a,b,c,d,e,f){var g=a.lc;b instanceof R&&\"position\"===c&&(c=\"position:diagram\");if(\"fill\"===c||\"stroke\"===c||\"background\"===c||\"areaBackground\"===c)ai(d),bi(),d=[ci.l,ci.I,ci.u,ci.T],ai(e),bi(),e=[ci.l,ci.I,ci.u,ci.T];if(g.contains(b)){var h=g.G(b);var k=h.start;var l=h.end;void 0===k[c]&&(k[c]=di(d));l[c]=di(e)}else k={},l={},k[c]=di(d),l[c]=di(e),h=k.position,b instanceof Y&&h instanceof J&&!h.s()&&b.diagram.animationManager.Re.contains(\"Expand SubGraph\")&&h.assign(l.position),h=new ei(k,\nl,f),g.add(b,h);g=k[c];g instanceof J&&!g.s()&&g.assign(a.u);f&&0===c.indexOf(\"position:\")&&b instanceof V?h.Qv.location=di(b.location):f&&(h.Qv[c]=di(d))}function di(a){return a instanceof J?a.copy():a instanceof M?a.copy():a}t.cu=function(a){if(!this.jc)return!1;a=this.lc.G(a);return null!==a&&a.sw};t.ew=function(a){if(!this.jc)return!1;a=this.lc.G(a);return null!==a&&(a.start.position||a.start.location)};\nfunction Qh(a,b){if(!a.Il||b){var c=a.Uc;if(!1!==a.jc){var d=+new Date,e=d>a.Zn?a.vd:d-a.Dd;b&&(e=a.tx,e<a.vd?(a.Dd=+new Date-e,a.Zn=a.Dd+a.vd):e=a.vd);Lh(c);Mh(a,e);Hf(a.C,!0);Nh(c);d>a.Zn&&(a.Fp&&!a.Hl?(a.Dd=+new Date,a.Zn=a.Dd+a.vd,a.Hl=!0):a.xm(!1))}}}\nfunction Mh(a,b){for(var c=a.vd,d=a.lc.iterator,e=a.Hl;d.next();){var f=d.key;if(!(f instanceof Y&&null===f.diagram)){var g=d.value,h=e?g.end:g.start;g=e?g.start:g.end;var k=Wh,l;for(l in g)\"position\"===l&&(g[\"position:placeholder\"]||g[\"position:nodeCollapse\"])||null===k.get(l)||k.get(l)(f,h[l],g[l],a.Ir,b,c,a)}}}t.stop=function(){this.jc&&this.xm(!0)};\nt.xm=function(a){null!==this.xv&&this.xv.Mp.remove(this.Ox);if(this.jc){var b=this.C,c=this.Uc;this.Il=this.jc=c.zl=!1;Lh(c);for(var d=this.lc,e=this.qm.iterator;e.next();)b.remove(e.value);for(e=this.jv.iterator;e.next();)e.value.o();e=this.Fp;d=d.iterator;for(var f=Wh;d.next();){var g=d.key,h=d.value,k=e?h.end:h.start,l=e?h.start:h.end,m=h.Qv,n;for(n in l)if(null!==f.get(n)){var p=n;!h.Kv||\"position:nodeCollapse\"!==p&&\"position:placeholder\"!==p||(p=\"position\");f.get(p)(g,k[n],void 0!==m[n]?m[n]:\nh.Kv?k[n]:l[n],this.Ir,this.vd,this.vd,this)}h.Kv&&void 0!==m.location&&g instanceof V&&(g.location=m.location);h.sw&&g instanceof V&&g.Ob(!1)}b.Yt.clear();mf(b,!1);b.Na();b.M();Hf(b,!0);if(c.defaultAnimation===this){for(n=c.$l.iterator;n.next();)e=n.value,null!==e.jf&&(e.points=e.jf,e.jf=null);c.$l.clear()}this.isViewportUnconstrained&&(b.scrollMode=this.px);Nh(c);this.mv++;!a&&this.nv>this.mv?(this.Hl=!1,this.start()):(this.$n&&this.$n(this),wh(this,null),c.xm(this),b.Db())}};\nt.lk=function(a,b){var c=b.actualBounds,d=null;b instanceof U&&(d=b.placeholder);null!==d?(c=d.da(tc),d=d.padding,c.x+=d.left,c.y+=d.top,this.add(a,\"position\",c,a.position,!1)):this.add(a,\"position\",new J(c.x+c.width/2,c.y+c.height/2),a.position,!1);this.add(a,\"scale\",.01,a.scale,!1);if(a instanceof U)for(a=a.memberParts;a.next();)d=a.value,d instanceof W&&this.lk(d,b)};\nt.jk=function(a,b){if(a.isVisible()){var c=null;b instanceof U&&(c=b.placeholder);null!==c?this.add(a,\"position:placeholder\",a.position,c,!0):this.add(a,\"position:nodeCollapse\",a.position,b,!0);this.add(a,\"scale\",a.scale,.01,!0);c=this.lc;c.contains(a)&&(c.G(a).sw=!0);if(a instanceof U)for(a=a.memberParts;a.next();)c=a.value,c instanceof W&&this.jk(c,b)}};t.pA=function(a){var b=this.iv.get(a);null===b&&(b={},this.iv.add(a,b));return b};\nna.Object.defineProperties(qh.prototype,{duration:{get:function(){return this.Yg},set:function(a){1>a&&wa(a,\">= 1\",qh,\"duration\");this.Yg=a}},reversible:{get:function(){return this.Fp},set:function(a){this.Fp=a}},runCount:{get:function(){return this.nv},set:function(a){0<a?this.nv=a:B(\"Animation.runCount value must be a positive integer.\")}},finished:{get:function(){return this.$n},\nset:function(a){this.$n!==a&&(this.$n=a)}},easing:{get:function(){return this.Ku},set:function(a){this.Ku=a}},isViewportUnconstrained:{get:function(){return this.l},set:function(a){this.l=a}},isAnimating:{get:function(){return this.jc}}});qh.prototype.getTemporaryState=qh.prototype.pA;qh.prototype.stop=qh.prototype.stop;qh.prototype.add=qh.prototype.add;qh.prototype.addTemporaryPart=qh.prototype.sz;\nfunction Xh(a,b,c,d){a/=d/2;return 1>a?c/2*a*a+b:-c/2*(--a*(a-2)-1)+b}function Zh(a,b,c,d){return a===d?b+c:c*(-Math.pow(2,-10*a/d)+1)+b}qh.className=\"Animation\";qh.EaseLinear=function(a,b,c,d){return c*a/d+b};qh.EaseInOutQuad=Xh;qh.EaseInQuad=function(a,b,c,d){return c*(a/=d)*a+b};qh.EaseOutQuad=function(a,b,c,d){return-c*(a/=d)*(a-2)+b};qh.EaseInExpo=function(a,b,c,d){return 0===a?b:c*Math.pow(2,10*(a/d-1))+b};qh.EaseOutExpo=Zh;\nfunction ei(a,b,c){this.start=a;this.end=b;this.Qv={};this.Kv=c;this.sw=!1}ei.className=\"AnimationState\";function fi(a,b,c){this.pd=null;this.gf=a;this.cq=c||gi;this.bl=null;void 0!==b&&(this.bl=b,void 0===c&&(this.cq=hi))}fi.prototype.copy=function(){var a=new fi(this.gf);a.cq=this.cq;var b=this.bl;if(null!==b){var c={};void 0!==b.duration&&(c.ny=b.duration);void 0!==b.finished&&(c.ny=b.finished);void 0!==b.easing&&(c.ny=b.easing);a.bl=c}return a};\nfunction ii(a,b){a=a.bl;null!==a&&(a.duration&&(b.duration=a.duration),a.finished&&(b.finished=a.finished),a.easing&&(b.easing=a.easing))}na.Object.defineProperties(fi.prototype,{propertyName:{get:function(){return this.gf},set:function(a){this.gf=a}},animationSettings:{get:function(){return this.bl},set:function(a){this.bl=a}},startCondition:{get:function(){return this.cq},set:function(a){this.cq=a}}});\nvar gi=new D(fi,\"Default\",1),hi=new D(fi,\"Immediate\",2),ji=new D(fi,\"Bundled\",3);fi.className=\"AnimationTrigger\";fi.Default=gi;fi.Immediate=hi;fi.Bundled=ji;function ki(){Xa(this);this.C=null;this.Ea=new E;this.oa=\"\";this.hb=1;this.u=!1;this.l=this.Pi=this.I=this.ii=this.hi=this.gi=this.fi=this.di=this.ei=this.ci=this.ki=this.bi=this.ji=this.ai=this.$h=!0;this.rp=[]}t=ki.prototype;t.clear=function(){this.Ea.clear();this.rp.length=0};t.ee=function(a){this.C=a};\nt.toString=function(a){void 0===a&&(a=0);var b='Layer \"'+this.name+'\"';if(0>=a)return b;for(var c=0,d=0,e=0,f=0,g=0,h=this.Ea.iterator;h.next();){var k=h.value;k instanceof U?e++:k instanceof W?d++:k instanceof S?f++:k instanceof Je?g++:c++}h=\"\";0<c&&(h+=c+\" Parts \");0<d&&(h+=d+\" Nodes \");0<e&&(h+=e+\" Groups \");0<f&&(h+=f+\" Links \");0<g&&(h+=g+\" Adornments \");if(1<a)for(a=this.Ea.iterator;a.next();)c=a.value,h+=\"\\n    \"+c.toString(),d=c.data,null!==d&&kb(d)&&(h+=\" #\"+kb(d)),c instanceof W?h+=\" \"+\nKa(d):c instanceof S&&(h+=\" \"+Ka(c.fromNode)+\" \"+Ka(c.toNode));return b+\" \"+this.Ea.count+\": \"+h};t.Vb=function(a,b,c){void 0===b&&(b=null);void 0===c&&(c=null);if(!1===this.Pi)return null;var d=!1;null!==this.diagram&&this.diagram.viewportBounds.$(a)&&(d=!0);for(var e=J.alloc(),f=this.Ea.j,g=f.length;g--;){var h=f[g];if((!0!==d||!1!==wg(h))&&h.isVisible()&&(e.assign(a),wb(e,h.Fd),h=h.Vb(e,b,c),null!==h&&(null!==b&&(h=b(h)),null!==h&&(null===c||c(h)))))return J.free(e),h}J.free(e);return null};\nt.hj=function(a,b,c,d){void 0===b&&(b=null);void 0===c&&(c=null);d instanceof E||d instanceof G||(d=new G);if(!1===this.Pi)return d;var e=!1;null!==this.diagram&&this.diagram.viewportBounds.$(a)&&(e=!0);for(var f=J.alloc(),g=this.Ea.j,h=g.length;h--;){var k=g[h];if((!0!==e||!1!==wg(k))&&k.isVisible()){f.assign(a);wb(f,k.Fd);var l=k;k.hj(f,b,c,d)&&(null!==b&&(l=b(l)),null===l||null!==c&&!c(l)||d.add(l))}}J.free(f);return d};\nt.zf=function(a,b,c,d,e){void 0===b&&(b=null);void 0===c&&(c=null);void 0===d&&(d=!1);e instanceof E||e instanceof G||(e=new G);if(!1===this.Pi)return e;var f=!1;null!==this.diagram&&this.diagram.viewportBounds.Ge(a)&&(f=!0);for(var g=this.Ea.j,h=g.length;h--;){var k=g[h];if((!0!==f||!1!==wg(k))&&k.isVisible()){var l=k;k.zf(a,b,c,d,e)&&(null!==b&&(l=b(l)),null===l||null!==c&&!c(l)||e.add(l))}}return e};\nt.Vv=function(a,b,c,d,e,f,g){if(!1===this.Pi)return e;for(var h=this.Ea.j,k=h.length;k--;){var l=h[k];if((!0!==g||!1!==wg(l))&&f(l)&&l.isVisible()){var m=l;l.zf(a,b,c,d,e)&&(null!==b&&(m=b(m)),null===m||null!==c&&!c(m)||e.add(m))}}return e};\nt.Eg=function(a,b,c,d,e,f){void 0===c&&(c=null);void 0===d&&(d=null);void 0===e&&(e=!0);if(!1!==e&&!0!==e){if(e instanceof E||e instanceof G)f=e;e=!0}f instanceof E||f instanceof G||(f=new G);if(!1===this.Pi)return f;var g=!1;null!==this.diagram&&this.diagram.viewportBounds.$(a)&&(g=!0);for(var h=J.alloc(),k=J.alloc(),l=this.Ea.j,m=l.length;m--;){var n=l[m];if((!0!==g||!1!==wg(n))&&n.isVisible()){h.assign(a);wb(h,n.Fd);k.h(a.x+b,a.y);wb(k,n.Fd);var p=n;n.Eg(h,k,c,d,e,f)&&(null!==c&&(p=c(p)),null===\np||null!==d&&!d(p)||f.add(p))}}J.free(h);J.free(k);return f};\nt.Nd=function(a,b){if(this.visible){var c=this.Ea.j,d=c.length;if(0!==d){a=Ea();for(var e=Ea(),f=0;f<d;f++){var g=c[f];g.zx=f;if(g instanceof S){if(!1===g.ud)continue}else if(g instanceof Je&&null!==g.adornedPart)continue;ac(g.actualBounds,b)?(g.Nd(!0),a.push(g)):(g.Nd(!1),null!==g.adornments&&0<g.adornments.count&&e.push(g))}for(b=0;b<a.length;b++)for(c=a[b],li(c),c=c.adornments;c.next();)d=c.value,d.measure(Infinity,Infinity),d.arrange(),d.Nd(!0);for(b=0;b<e.length;b++)li(e[b]);Ia(a);Ia(e)}}};\nfunction mi(a,b){var c=1;1!==a.hb&&(c=b.globalAlpha,b.globalAlpha=c*a.hb);return c}t.mc=function(a,b,c){if(this.visible&&0!==this.hb&&(void 0===c&&(c=!0),c||!this.isTemporary)){c=this.Ea.j;var d=c.length;if(0!==d){var e=mi(this,a),f=this.rp;f.length=0;for(var g=b.scale,h=N.alloc(),k=0;k<d;k++)this.dj(a,c[k],b,f,g,h,!0);N.free(h);a.globalAlpha=e}}};\nt.dj=function(a,b,c,d,e,f,g){if(!g||wg(b)){if(null!==d&&b instanceof S&&(b.isOrthogonal&&d.push(b),!1===b.ud))return;g=!1;for(d=b.containingGroup;null!==d;)g?null!==d.Za&&f.Dy(d.Za):null!==d.Za&&(g=!0,f.assign(d.Za)),d=d.containingGroup;var h=b.actualBounds;d=!1;if(g&&b.isVisible()){if(!f.Mc(h))return;d=!f.Ge(h)}d&&(a.save(),a.beginPath(),a.rect(f.x,f.y,f.width,f.height),a.clip());h.width*e>c.Xo||h.height*e>c.Xo?b.mc(a,c):(e=b.actualBounds,f=b.naturalBounds,0===e.width||0===e.height||isNaN(e.x)||\nisNaN(e.y)||!b.isVisible()||(c=b.transform,null!==b.areaBackground&&(ni(b,a,b.areaBackground,!0,!0,f,e),a.fillRect(e.x,e.y,e.width,e.height)),null===b.areaBackground&&null===b.background&&(ni(b,a,\"rgba(0,0,0,0.3)\",!0,!1,f,e),a.fillRect(e.x,e.y,e.width,e.height)),null!==b.background&&(a.transform(c.m11,c.m12,c.m21,c.m22,c.dx,c.dy),ni(b,a,b.background,!0,!1,f,e),a.fillRect(0,0,f.width/2,f.height/2),c.Tt()||(b=1/(c.m11*c.m22-c.m12*c.m21),a.transform(c.m22*b,-c.m12*b,-c.m21*b,c.m11*b,b*(c.m21*c.dy-c.m22*\nc.dx),b*(c.m12*c.dx-c.m11*c.dy))))));d&&(a.restore(),a.uc(!0))}};t.g=function(a,b,c,d,e){var f=this.diagram;null!==f&&f.Va(xe,a,this,b,c,d,e)};t.oj=function(a,b,c){var d=this.Ea;b.Fi=this;if(a>=d.count)a=d.count;else if(d.J(a)===b)return-1;d.wb(a,b);b.Mq(c);d=this.diagram;null!==d&&(c?d.M():d.oj(b));oi(this,a,b);return a};\nt.Lc=function(a,b,c){if(!c&&b.layer!==this&&null!==b.layer)return b.layer.Lc(a,b,c);var d=this.Ea;if(0>a||a>=d.length){if(a=d.indexOf(b),0>a)return-1}else if(d.J(a)!==b&&(a=d.indexOf(b),0>a))return-1;b.Nq(c);d.cb(a);d=this.diagram;null!==d&&(c?d.M():d.Lc(b));b.Fi=null;return a};\nfunction oi(a,b,c){b=pi(a,b,c);if(c instanceof U&&null!==c&&isNaN(c.zOrder)){if(0!==c.memberParts.count){for(var d=-1,e=a.Ea.j,f=e.length,g=0;g<f;g++){var h=e[g];if(h===c&&(b=g,0<=d))break;if(0>d&&h.containingGroup===c&&(d=g,0<=b))break}!(0>d)&&d<b&&(e=a.Ea,e.cb(b),e.wb(d,c))}c=c.containingGroup;null!==c&&oi(a,-1,c)}}\nfunction pi(a,b,c){var d=c.zOrder;if(isNaN(d))return b;a=a.Ea;var e=a.count;if(1>=e)return b;0>b&&(b=a.indexOf(c));if(0>b)return-1;for(var f=b-1,g=NaN;0<=f;){g=a.J(f).zOrder;if(!isNaN(g))break;f--}for(var h=b+1,k=NaN;h<e;){k=a.J(h).zOrder;if(!isNaN(k))break;h++}if(!isNaN(g)&&g>d)for(;;){if(-1===f||g<=d){f++;if(f===b)break;a.cb(b);a.wb(f,c);return f}for(g=NaN;0<=--f&&(g=a.J(f).zOrder,isNaN(g)););}else if(!isNaN(k)&&k<d)for(;;){if(h===e||k>=d){h--;if(h===b)break;a.cb(b);a.wb(h,c);return h}for(k=NaN;++h<\ne&&(k=a.J(h).zOrder,isNaN(k)););}return b}\nna.Object.defineProperties(ki.prototype,{parts:{get:function(){return this.Ea.iterator}},partsBackwards:{get:function(){return this.Ea.iteratorBackwards}},diagram:{get:function(){return this.C}},name:{get:function(){return this.oa},set:function(a){var b=this.oa;if(b!==a){var c=this.diagram;if(null!==c)for(\"\"===b&&B(\"Cannot rename default Layer to: \"+a),c=c.layers;c.next();)c.value.name===\na&&B(\"Layer.name is already present in this diagram: \"+a);this.oa=a;this.g(\"name\",b,a);for(a=this.Ea.iterator;a.next();)a.value.layerName=this.oa}}},opacity:{get:function(){return this.hb},set:function(a){var b=this.hb;b!==a&&((0>a||1<a)&&wa(a,\"0 <= value <= 1\",ki,\"opacity\"),this.hb=a,this.g(\"opacity\",b,a),a=this.diagram,null!==a&&a.M())}},isTemporary:{get:function(){return this.u},set:function(a){var b=this.u;b!==a&&(this.u=a,this.isInDocumentBounds=\n!1,this.g(\"isTemporary\",b,a))}},visible:{get:function(){return this.I},set:function(a){var b=this.I;if(b!==a){this.I=a;this.g(\"visible\",b,a);for(b=this.Ea.iterator;b.next();)b.value.Ob(a);a=this.diagram;null!==a&&a.M()}}},pickable:{get:function(){return this.Pi},set:function(a){var b=this.Pi;b!==a&&(this.Pi=a,this.g(\"pickable\",b,a))}},isInDocumentBounds:{get:function(){return this.l},set:function(a){this.l!==\na&&(this.l=a,null!==this.diagram&&this.diagram.Na())}},allowCopy:{get:function(){return this.$h},set:function(a){var b=this.$h;b!==a&&(this.$h=a,this.g(\"allowCopy\",b,a))}},allowDelete:{get:function(){return this.ai},set:function(a){var b=this.ai;b!==a&&(this.ai=a,this.g(\"allowDelete\",b,a))}},allowTextEdit:{get:function(){return this.ji},set:function(a){var b=this.ji;b!==a&&(this.ji=a,this.g(\"allowTextEdit\",b,\na))}},allowGroup:{get:function(){return this.bi},set:function(a){var b=this.bi;b!==a&&(this.bi=a,this.g(\"allowGroup\",b,a))}},allowUngroup:{get:function(){return this.ki},set:function(a){var b=this.ki;b!==a&&(this.ki=a,this.g(\"allowUngroup\",b,a))}},allowLink:{get:function(){return this.ci},set:function(a){var b=this.ci;b!==a&&(this.ci=a,this.g(\"allowLink\",b,a))}},allowRelink:{get:function(){return this.ei},\nset:function(a){var b=this.ei;b!==a&&(this.ei=a,this.g(\"allowRelink\",b,a))}},allowMove:{get:function(){return this.di},set:function(a){var b=this.di;b!==a&&(this.di=a,this.g(\"allowMove\",b,a))}},allowReshape:{get:function(){return this.fi},set:function(a){var b=this.fi;b!==a&&(this.fi=a,this.g(\"allowReshape\",b,a))}},allowResize:{get:function(){return this.gi},set:function(a){var b=this.gi;b!==a&&(this.gi=a,this.g(\"allowResize\",\nb,a))}},allowRotate:{get:function(){return this.hi},set:function(a){var b=this.hi;b!==a&&(this.hi=a,this.g(\"allowRotate\",b,a))}},allowSelect:{get:function(){return this.ii},set:function(a){var b=this.ii;b!==a&&(this.ii=a,this.g(\"allowSelect\",b,a))}}});ki.prototype.findObjectsNear=ki.prototype.Eg;ki.prototype.findObjectsIn=ki.prototype.zf;ki.prototype.findObjectsAt=ki.prototype.hj;ki.prototype.findObjectAt=ki.prototype.Vb;ki.className=\"Layer\";\nfunction R(a){1<arguments.length&&B(\"Diagram constructor can only take one optional argument, the DIV HTML element or its id.\");qi||(ri(),qi=!0);Xa(this);Fe=this;this.Sb=!0;this.Uc=new mh;this.Uc.ee(this);this.rb=17;this.Gl=this.pv=!1;this.Ss=\"default\";this.Fa=null;if(Ug){var b=this,c=function(){b.removeEventListener(x.document,\"DOMContentLoaded\",c,!1);b.setRTL()};null!==x.document.body?this.setRTL():b.addEventListener(x.document,\"DOMContentLoaded\",c,!1)}this.Ma=new E;this.xa=this.ya=0;this.Zl=this.wa=\nnull;this.Kx=new H;this.hf=this.Gb=null;this.xw();this.Nj=null;this.ww();this.hb=1;this.la=(new J(NaN,NaN)).freeze();this.Ts=new J(NaN,NaN);this.Qn=this.Aa=1;this.es=(new J(NaN,NaN)).freeze();this.fs=NaN;this.xs=1E-4;this.vs=100;this.sb=new ld;this.xt=(new J(NaN,NaN)).freeze();this.Zr=(new N(NaN,NaN,NaN,NaN)).freeze();this.Si=(new kc(0,0,0,0)).freeze();this.Ti=Yh;this.at=!1;this.Us=this.Ns=null;this.Og=xh;this.Dj=Vc;this.Yf=xh;this.to=Vc;this.gs=this.ds=tc;this.Dc=!0;this.El=!1;this.wd=new G;this.Vg=\nnew H;this.rl=!0;this.qn=250;this.Bj=-1;this.sn=(new kc(16,16,16,16)).freeze();this.Hj=this.Ee=!1;this.Kj=!0;this.Wf=new me;this.Wf.diagram=this;this.od=new me;this.od.diagram=this;this.hh=new me;this.hh.diagram=this;this.we=this.Of=null;this.hk=!1;this.Pr=this.Qr=null;this.zj=x.PointerEvent&&(Sa||Ta||Ua)&&x.navigator&&!1!==x.navigator.msPointerEnabled;si(this);this.Dh=new G;this.qs=!0;this.rt=ti;this.Uu=!1;this.tt=Mf;this.La=null;ui.add(\"Model\",vi);this.Jr=this.Mr=this.pt=null;this.Pn=this.Hr=\"auto\";\nthis.gg=this.As=this.ig=this.jg=this.lg=this.Qf=this.Uf=this.Pf=null;this.cs=!1;this.Rf=this.wg=this.kg=this.hg=null;this.Bs=!1;this.Ls={};this.bk=[null,null];this.Br=null;this.Nr=this.gt=this.rv=this.vg=!1;this.av=!0;this.yi=this.ac=!1;this.cc=null;var d=this;this.Cc=function(a){var b=d.partManager;if(a.model===b.diagram.model&&b.diagram.Z){b.diagram.Z=!1;try{var c=a.change;\"\"===a.modelChange&&c===xe&&b.updateDataBindings(a.object,a.propertyName)}finally{b.diagram.Z=!0}}};this.Tc=function(a){d.partManager.doModelChanged(a)};\nthis.zv=!0;this.Xd=-2;this.pg=new H;this.Wl=new E;this.$f=!1;this.ai=this.$h=this.nr=this.md=!0;this.pr=!1;this.vr=this.tr=this.ii=this.hi=this.gi=this.fi=this.di=this.ei=this.ci=this.sr=this.ki=this.bi=this.ji=this.qr=!0;this.Zf=this.Xu=!1;this.ur=this.rr=this.wl=this.vl=!0;this.$s=this.Ws=16;this.Vs=this.Op=!1;this.Pp=this.Ys=null;this.Xs=this.Zs=0;this.ib=(new kc(5)).freeze();this.qv=(new G).freeze();this.ws=999999999;this.Su=(new G).freeze();this.xi=this.wi=this.vi=!0;this.Ye=this.pe=!1;this.kc=\nnull;this.Ng=!0;this.qe=!1;this.Ax=new G;this.Tu=new G;this.Gc=null;this.Vl=1;this.sv=0;this.Ic={scale:1,position:new J,bounds:new N,Gv:new M,kw:new M,hw:!1};this.Rx=(new N(NaN,NaN,NaN,NaN)).freeze();this.sm=(new M(NaN,NaN)).freeze();this.Rn=(new N(NaN,NaN,NaN,NaN)).freeze();this.rs=!1;this.Lo=this.qo=this.kp=this.Fu=this.Eu=this.Gu=this.bg=this.fh=this.df=this.Tr=null;wi(this);this.Ib=null;this.po=!1;this.Ej=null;this.partManager=new vi;this.toolManager=new Pa;this.toolManager.initializeStandardTools();\nthis.currentTool=this.defaultTool=this.toolManager;this.Sr=null;this.kl=new We;this.Gs=this.Fs=null;this.fq=!1;this.commandHandler=xi();this.model=yi();this.vg=!0;zi(this);this.layout=new Ai;this.vg=!1;this.ux=this.Ju=null;this.Tb=1;this.yh=null;this.Xo=1;this.cp=0;this.hv=[0,0,0,0,0];this.ep=0;this.xd=1;this.Sj=0;this.Go=new J;this.qt=500;this.rn=new J;this.re=!1;this.Qk=this.Rk=this.Pk=this.Ok=this.Jk=this.Lk=this.Kk=this.Hk=this.Ik=this.Ww=this.Mw=this.Nw=this.Ow=null;this.Yq=function(){};this.preventDefault=\nnull;this.wo=!1;this.ui=new Bi;this.gq=!1;void 0!==a&&Ci(this,a);this.ao=null;this.bo=Hb;this.Sb=!1}R.prototype.clear=function(){this.animationManager.Bc();this.model.clear();Di=null;Ei=\"\";Fi(this,!1);this.Wl.clear();Gi();this.pg.clear();this.Na();this.Ta();this.M()};\nfunction Fi(a,b){a.animationManager.Bc(!0);a.qv=(new G).freeze();a.Su=(new G).freeze();var c=a.skipsUndoManager;null!==a.model&&(a.skipsUndoManager=!0);var d=null;null!==a.Ib&&(d=a.Ib.part,null!==d&&a.remove(d));var e=[],f=a.Ma.length;if(b){for(b=0;b<f;b++)for(var g=a.Ma.j[b].parts;g.next();){var h=g.value;h!==d&&null===h.data&&e.push(h)}for(b=0;b<e.length;b++)a.remove(e[b])}for(b=0;b<f;b++)a.Ma.j[b].clear();a.partManager.clear();a.wd.clear();a.Vg.clear();a.Dh.clear();a.Ej=null;a.Wl.clear();Gi();\na.pg.clear();Fa=[];null!==d&&(a.add(d),a.partManager.parts.remove(d));null!==a.model&&(a.skipsUndoManager=c);return e}function xi(){return null}\nR.prototype.reset=function(){this.clear();this.Sb=!0;this.Uc=new mh;this.Uc.ee(this);this.rb=17;this.Gl=this.pv=!1;this.Ss=\"default\";this.Ma=new E;this.Kx=new H;this.hf=null;this.xw();this.Nj=null;this.ww();this.hb=1;this.la=(new J(NaN,NaN)).freeze();this.Ts=new J(NaN,NaN);this.Qn=this.Aa=1;this.es=(new J(NaN,NaN)).freeze();this.fs=NaN;this.xs=1E-4;this.vs=100;this.sb=new ld;this.xt=(new J(NaN,NaN)).freeze();this.Zr=(new N(NaN,NaN,NaN,NaN)).freeze();this.Si=(new kc(0,0,0,0)).freeze();this.Ti=Yh;this.at=\n!1;this.Us=this.Ns=null;this.Og=xh;this.Dj=Vc;this.Yf=xh;this.to=Vc;this.gs=this.ds=tc;this.Dc=!0;this.El=!1;this.wd=new G;this.Vg=new H;this.rl=!0;this.qn=250;this.Bj=-1;this.sn=(new kc(16,16,16,16)).freeze();this.Hj=this.Ee=!1;this.Kj=!0;this.Wf=new me;this.Wf.diagram=this;this.od=new me;this.od.diagram=this;this.hh=new me;this.hh.diagram=this;this.we=this.Of=null;this.hk=!1;this.Pr=this.Qr=null;this.zj=x.PointerEvent&&(Sa||Ta||Ua)&&x.navigator&&!1!==x.navigator.msPointerEnabled;si(this);this.Dh=\nnew G;this.qs=!0;this.rt=ti;this.Uu=!1;this.tt=Mf;this.Jr=this.Mr=this.pt=null;this.Pn=this.Hr=\"auto\";this.gg=this.As=this.ig=this.jg=this.lg=this.Qf=this.Uf=this.Pf=null;this.cs=!1;this.Rf=this.wg=this.kg=this.hg=null;this.Bs=!1;this.Ls={};this.bk=[null,null];this.Br=null;this.Nr=this.gt=this.rv=this.vg=!1;this.av=!0;this.yi=this.ac=!1;this.zv=!0;this.Xd=-2;this.pg=new H;this.Wl=new E;this.$f=!1;this.ai=this.$h=this.nr=this.md=!0;this.pr=!1;this.vr=this.tr=this.ii=this.hi=this.gi=this.fi=this.di=\nthis.ei=this.ci=this.sr=this.ki=this.bi=this.ji=this.qr=!0;this.Zf=this.Xu=!1;this.ur=this.rr=this.wl=this.vl=!0;this.$s=this.Ws=16;this.Vs=this.Op=!1;this.Xs=this.Zs=0;this.ib=(new kc(5)).freeze();this.qv=(new G).freeze();this.ws=999999999;this.Su=(new G).freeze();this.xi=this.wi=this.vi=!0;this.Ye=this.pe=!1;this.kc=null;this.Ng=!0;this.qe=!1;this.Ax=new G;this.Tu=new G;this.Gc=null;this.Vl=1;this.sv=0;this.Ic={scale:1,position:new J,bounds:new N,Gv:new M,kw:new M,hw:!1};this.Rx=(new N(NaN,NaN,\nNaN,NaN)).freeze();this.sm=(new M(NaN,NaN)).freeze();this.Rn=(new N(NaN,NaN,NaN,NaN)).freeze();this.rs=!1;this.Lo=this.qo=this.kp=this.Fu=this.Eu=this.Gu=this.bg=this.fh=this.df=null;wi(this);this.Ib=null;this.po=!1;this.Ej=null;this.partManager=new vi;this.toolManager=new Pa;this.toolManager.initializeStandardTools();this.currentTool=this.defaultTool=this.toolManager;this.Sr=null;this.kl=new We;this.Gs=this.Fs=null;this.fq=!1;this.commandHandler=xi();this.vg=!0;zi(this);this.layout=new Ai;this.vg=\n!1;this.model=yi();this.model.undoManager=new Ce;this.qe=!1;this.Kj=!0;this.Ee=!1;this.Tb=1;this.yh=null;this.Xo=1;this.cp=0;this.hv=[0,0,0,0,0];this.ep=0;this.xd=1;this.Sj=0;this.Go=new J;this.qt=500;this.rn=new J;this.gq=this.wo=this.re=!1;this.ao=null;this.bo=Hb;this.Sb=!1;this.M()};\nfunction wi(a){a.df=new H;var b=new W,c=new Wg;c.bind(new Hi(\"text\",\"\",Ka));b.add(c);a.Gu=b;a.df.add(\"\",b);b=new W;c=new Wg;c.stroke=\"brown\";c.bind(new Hi(\"text\",\"\",Ka));b.add(c);a.df.add(\"Comment\",b);b=new W;b.selectable=!1;b.avoidable=!1;c=new Kf;c.figure=\"Ellipse\";c.fill=\"black\";c.stroke=null;c.desiredSize=(new M(3,3)).ca();b.add(c);a.df.add(\"LinkLabel\",b);a.fh=new H;b=new U;b.selectionObjectName=\"GROUPPANEL\";b.type=X.Vertical;c=new Wg;c.font=\"bold 12pt sans-serif\";c.bind(new Hi(\"text\",\"\",Ka));\nb.add(c);c=new X(X.Auto);c.name=\"GROUPPANEL\";var d=new Kf;d.figure=\"Rectangle\";d.fill=\"rgba(128,128,128,0.2)\";d.stroke=\"black\";c.add(d);d=new xg;d.padding=(new kc(5,5,5,5)).ca();c.add(d);b.add(c);a.Eu=b;a.fh.add(\"\",b);a.bg=new H;b=new S;c=new Kf;c.isPanelMain=!0;b.add(c);c=new Kf;c.toArrow=\"Standard\";c.fill=\"black\";c.stroke=null;c.strokeWidth=0;b.add(c);a.Fu=b;a.bg.add(\"\",b);b=new S;c=new Kf;c.isPanelMain=!0;c.stroke=\"brown\";b.add(c);a.bg.add(\"Comment\",b);b=new Je;b.type=X.Auto;c=new Kf;c.fill=null;\nc.stroke=\"dodgerblue\";c.strokeWidth=3;b.add(c);c=new xg;c.margin=(new kc(1.5,1.5,1.5,1.5)).ca();b.add(c);a.kp=b;a.qo=b;b=new Je;b.type=X.Link;c=new Kf;c.isPanelMain=!0;c.fill=null;c.stroke=\"dodgerblue\";c.strokeWidth=3;b.add(c);a.Lo=b}\nR.prototype.setRTL=function(a){a=void 0===a?this.div:a;null===a&&(a=x.document.body);var b=ua(\"div\");b.dir=\"rtl\";b.style.cssText=\"font-size: 14px; width: 1px; height: 1px; position: absolute; top: -1000px; overflow: scroll;\";b.textContent=\"A\";a.appendChild(b);var c=\"reverse\";0<b.scrollLeft?c=\"default\":(b.scrollLeft=1,0===b.scrollLeft&&(c=\"negative\"));a.removeChild(b);this.Ss=c};\nR.prototype.setScrollWidth=function(a){a=void 0===a?this.div:a;null===a&&(a=x.document.body);var b=0;if(Ug){var c=Ii;b=Pi;null===c&&(c=Ii=ua(\"p\"),c.style.width=\"100%\",c.style.height=\"200px\",c.style.boxSizing=\"content-box\",b=Pi=ua(\"div\"),b.style.position=\"absolute\",b.style.visibility=\"hidden\",b.style.width=\"200px\",b.style.height=\"150px\",b.style.boxSizing=\"content-box\",b.appendChild(c));b.style.overflow=\"hidden\";a.appendChild(b);var d=c.offsetWidth;b.style.overflow=\"scroll\";c=c.offsetWidth;d===c&&(c=\nb.clientWidth);a.removeChild(b);b=d-c;0!==b||Wa||(b=11)}this.rb=b;this.pv=!0};R.prototype.jb=function(a){a.classType===R&&(this.autoScale=a)};R.prototype.toString=function(a){void 0===a&&(a=0);var b=\"\";this.div&&this.div.id&&(b=this.div.id);b='Diagram \"'+b+'\"';if(0>=a)return b;for(var c=this.Ma.iterator;c.next();)b+=\"\\n  \"+c.value.toString(a-1);return b};R.prototype.addEventListener=function(a,b,c,d){a.addEventListener(b,c,{capture:d,passive:!1})};\nR.prototype.removeEventListener=function(a,b,c,d){a.removeEventListener(b,c,{capture:d})};\nfunction Qi(a){var b=a.wa.Ja;b instanceof HTMLCanvasElement&&(a.zj?(a.addEventListener(b,\"pointerdown\",a.Ok,!1),a.addEventListener(b,\"pointermove\",a.Pk,!1),a.addEventListener(b,\"pointerup\",a.Rk,!1),a.addEventListener(b,\"pointerout\",a.Qk,!1)):(a.addEventListener(b,\"touchstart\",a.Ow,!1),a.addEventListener(b,\"touchmove\",a.Nw,!1),a.addEventListener(b,\"touchend\",a.Mw,!1),a.addEventListener(b,\"mousemove\",a.Ik,!1),a.addEventListener(b,\"mousedown\",a.Hk,!1),a.addEventListener(b,\"mouseup\",a.Kk,!1),a.addEventListener(b,\n\"mouseout\",a.Jk,!1)),a.addEventListener(b,\"mouseenter\",a.Oz,!1),a.addEventListener(b,\"mouseleave\",a.Pz,!1),a.addEventListener(b,\"wheel\",a.Lk,!1),a.addEventListener(b,\"keydown\",a.BA,!1),a.addEventListener(b,\"keyup\",a.CA,!1),a.addEventListener(b,\"blur\",a.Az,!1),a.addEventListener(b,\"focus\",a.Bz,!1),a.addEventListener(b,\"selectstart\",function(a){a.preventDefault();return!1},!1),a.addEventListener(b,\"contextmenu\",function(a){a.preventDefault();return!1},!1),a.addEventListener(b,\"gesturestart\",function(b){a.toolManager.gestureBehavior!==\nRe&&(a.toolManager.gestureBehavior===Qe?b.preventDefault():a.re&&a.lastInput.handled||(b.preventDefault(),a.Vl=a.scale,a.currentTool.doCancel()))},!1),a.addEventListener(b,\"gesturechange\",function(b){if(a.toolManager.gestureBehavior!==Re)if(a.toolManager.gestureBehavior===Qe)b.preventDefault();else if(!a.re||!a.lastInput.handled){b.preventDefault();var c=b.scale;if(null!==a.Vl){var e=a.wa.getBoundingClientRect();b=new J(b.pageX-x.scrollX-a.ya/e.width*e.left,b.pageY-x.scrollY-a.xa/e.height*e.top);\nc=a.Vl*c;e=a.commandHandler;if(c!==a.scale&&e.canResetZoom(c)){var f=a.zoomPoint;a.zoomPoint=b;e.resetZoom(c);a.zoomPoint=f}}}},!1),a.addEventListener(x,\"resize\",a.Ww,!1))}function Ze(a){30<a.cp&&(a.yh=1)}function mf(a,b){null!==a.yh&&(a.yh=null,b&&a.Yq(),ab&&ab.my||(a.cp=0,a.hv=[0,0,0,0,0],a.ep=0))}R.prototype.computePixelRatio=function(){return null!==this.yh?this.yh:x.devicePixelRatio||1};R.prototype.doMouseMove=function(){this.currentTool.doMouseMove()};R.prototype.doMouseDown=function(){this.currentTool.doMouseDown()};\nR.prototype.doMouseUp=function(){this.currentTool.doMouseUp()};R.prototype.doMouseWheel=function(){this.currentTool.doMouseWheel()};R.prototype.doKeyDown=function(){this.currentTool.doKeyDown()};R.prototype.doKeyUp=function(){this.currentTool.doKeyUp()};R.prototype.doFocus=function(){this.focus()};R.prototype.focus=function(){if(this.wa)if(this.scrollsPageOnFocus)this.wa.focus();else{var a=x.scrollX||x.pageXOffset,b=x.scrollY||x.pageYOffset;this.wa.focus();x.scrollTo(a,b)}};R.prototype.Bz=function(){this.C.R(\"GainedFocus\")};\nR.prototype.Az=function(){this.C.R(\"LostFocus\")};function Kh(a){if(null!==a.wa){var b=a.Fa;if(0!==b.clientWidth&&0!==b.clientHeight){a.pv||a.setScrollWidth();var c=a.Ye?a.rb:0,d=a.pe?a.rb:0,e=a.Tb;a.Tb=a.computePixelRatio();a.Tb!==e&&(a.El=!0,a.Db());if(b.clientWidth!==a.ya+c||b.clientHeight!==a.xa+d)a.wi=!0,a.Dc=!0,b=a.layout,null!==b&&b.isViewportSized&&a.autoScale===xh&&(a.Hj=!0,b.B()),a.ac||a.Db()}}}\nfunction zi(a){var b=new ki;b.name=\"Background\";a.um(b);b=new ki;b.name=\"\";a.um(b);b=new ki;b.name=\"Foreground\";a.um(b);b=new ki;b.name=\"Adornment\";b.isTemporary=!0;b.isInDocumentBounds=!1;a.um(b);b=new ki;b.name=\"Tool\";b.isTemporary=!0;b.isInDocumentBounds=!0;a.um(b);b=new ki;b.name=\"Grid\";b.allowSelect=!1;b.pickable=!1;b.isTemporary=!0;b.isInDocumentBounds=!1;a.Ux(b,a.xk(\"Background\"))}\nfunction Ri(a){a.Ib=new X(X.Grid);a.Ib.name=\"GRID\";var b=new Kf;b.figure=\"LineH\";b.stroke=\"lightgray\";b.strokeWidth=.5;b.interval=1;a.Ib.add(b);b=new Kf;b.figure=\"LineH\";b.stroke=\"gray\";b.strokeWidth=.5;b.interval=5;a.Ib.add(b);b=new Kf;b.figure=\"LineH\";b.stroke=\"gray\";b.strokeWidth=1;b.interval=10;a.Ib.add(b);b=new Kf;b.figure=\"LineV\";b.stroke=\"lightgray\";b.strokeWidth=.5;b.interval=1;a.Ib.add(b);b=new Kf;b.figure=\"LineV\";b.stroke=\"gray\";b.strokeWidth=.5;b.interval=5;a.Ib.add(b);b=new Kf;b.figure=\n\"LineV\";b.stroke=\"gray\";b.strokeWidth=1;b.interval=10;a.Ib.add(b);b=new V;b.add(a.Ib);b.layerName=\"Grid\";b.zOrder=0;b.isInDocumentBounds=!1;b.isAnimated=!1;b.pickable=!1;b.locationObjectName=\"GRID\";a.add(b);a.partManager.parts.remove(b);a.Ib.visible=!1}function Si(){this.C.Vs?this.C.Vs=!1:this.C.isEnabled?this.C.iy(this):Ti(this.C)}function Ui(a){this.C.isEnabled?(this.C.Zs=a.target.scrollTop,this.C.Xs=a.target.scrollLeft):Ti(this.C)}\nR.prototype.iy=function(a){if(null!==this.wa){this.Op=!0;var b=this.documentBounds,c=this.viewportBounds,d=this.Si,e=b.x-d.left,f=b.y-d.top,g=b.width+d.left+d.right,h=b.height+d.top+d.bottom,k=b.right+d.right;d=b.bottom+d.bottom;var l=c.x;b=c.y;var m=c.width,n=c.height,p=c.right,r=c.bottom;c=this.scale;var q=a.scrollLeft;if(this.Gl)switch(this.Ss){case \"negative\":q=q+a.scrollWidth-a.clientWidth;break;case \"reverse\":q=a.scrollWidth-q-a.clientWidth}var u=q;m<g||n<h?(q=J.allocAt(this.position.x,this.position.y),\nthis.allowHorizontalScroll&&this.Xs!==u&&(q.x=u/c+e,this.Xs=u),this.allowVerticalScroll&&this.Zs!==a.scrollTop&&(q.y=a.scrollTop/c+f,this.Zs=a.scrollTop),this.position=q,J.free(q),this.wi=this.Op=!1):(q=J.alloc(),a.hz&&this.allowHorizontalScroll&&(e<l&&(this.position=q.h(u+e,this.position.y)),k>p&&(this.position=q.h(-(this.Ys.scrollWidth-this.ya)+u-this.ya/c+k,this.position.y))),a.iz&&this.allowVerticalScroll&&(f<b&&(this.position=q.h(this.position.x,a.scrollTop+f)),d>r&&(this.position=q.h(this.position.x,\n-(this.Ys.scrollHeight-this.xa)+a.scrollTop-this.xa/c+d))),J.free(q),Vi(this),this.wi=this.Op=!1,b=this.documentBounds,c=this.viewportBounds,k=b.right,p=c.right,d=b.bottom,r=c.bottom,e=b.x,l=c.x,f=b.y,b=c.y,m>=g&&e>=l&&k<=p&&(this.Pp.style.width=\"1px\"),n>=h&&f>=b&&d<=r&&(this.Pp.style.height=\"1px\"))}};R.prototype.computeBounds=function(){0<this.wd.count&&Wi(this);return Xi(this)};\nfunction Xi(a){if(a.fixedBounds.s()){var b=a.fixedBounds.copy();b.uq(a.ib);return b}for(var c=!0,d=a.Ma.j,e=d.length,f=0;f<e;f++){var g=d[f];if(g.visible&&g.isInDocumentBounds){g=g.Ea.j;for(var h=g.length,k=0;k<h;k++){var l=g[k];l.isInDocumentBounds&&l.isVisible()&&(l=l.actualBounds,l.s()&&(c?(c=!1,b=l.copy()):b.Rc(l)))}}}c&&(b=new N(0,0,0,0));b.uq(a.ib);return b}\nR.prototype.computePartsBounds=function(a,b){void 0===b&&(b=!1);var c=null;if(Aa(a))for(var d=0;d<a.length;d++){var e=a[d];!b&&e instanceof S||(e.Ta(),null===c?c=e.actualBounds.copy():c.Rc(e.actualBounds))}else for(a=a.iterator;a.next();)d=a.value,!b&&d instanceof S||(d.Ta(),null===c?c=d.actualBounds.copy():c.Rc(d.actualBounds));return null===c?new N(NaN,NaN,0,0):c};\nfunction Yi(a,b){if((b||a.qe)&&!a.Sb&&null!==a.wa&&a.documentBounds.s()){if(b){var c=a.initialPosition;if(c.s()){a.position=c;return}c=J.alloc();c.tj(a.documentBounds,a.initialDocumentSpot);var d=a.viewportBounds;d=N.allocAt(0,0,d.width,d.height);var e=J.alloc();e.tj(d,a.initialViewportSpot);e.h(c.x-e.x,c.y-e.y);a.position=e;N.free(d);J.free(e);J.free(c)}a.Sb=!0;c=a.Og;b&&a.Yf!==xh&&(c=a.Yf);d=c!==xh?Zi(a,c):a.scale;c=a.viewportBounds.copy();e=a.ya/d;var f=a.xa/d,g=a.Dj,h=a.to;b&&!g.kb()&&(h.kb()||\nh.Mb())&&(g=h.Mb()?zc:h);$i(a,a.documentBounds,e,f,g,b);b=a.scale;a.scale=d;a.Sb=!1;d=a.viewportBounds;if(!d.Qa(c))a.onViewportBoundsChanged(c,d,b,!1);aj(a);bj(a,!0,!1)}}\nfunction Zi(a,b){var c=a.Qn;if(null===a.wa)return c;a.Ta();var d=a.documentBounds;if(!d.s())return c;var e=d.width;d=d.height;var f=a.ya+(a.Ye?a.rb:0),g=a.xa+(a.pe?a.rb:0),h=f/e,k=g/d;return b===cj?(b=Math.min(k,h),b>c&&(b=c),b<a.minScale&&(b=a.minScale),b>a.maxScale&&(b=a.maxScale),b):b===dj?(b=k>h?(g-a.rb)/d:(f-a.rb)/e,b>c&&(b=c),b<a.minScale&&(b=a.minScale),b>a.maxScale&&(b=a.maxScale),b):a.scale}\nR.prototype.zoomToFit=function(){var a=this.Ti;this.Ti=Yh;this.scale=Zi(this,cj);a!==Yh&&(Yi(this,!1),$i(this,this.documentBounds,this.ya/this.Aa,this.xa/this.Aa,this.Dj,!1));this.Ti=a};t=R.prototype;\nt.mB=function(a,b){void 0===b&&(b=cj);var c=a.width,d=a.height;if(!(0===c||0===d||isNaN(c)&&isNaN(d))){var e=1;if(b===cj||b===dj)if(isNaN(c))e=this.viewportBounds.height*this.scale/d;else if(isNaN(d))e=this.viewportBounds.width*this.scale/c;else{e=this.ya;var f=this.xa;e=b===dj?f/d>e/c?(f-(this.pe?this.rb:0))/d:(e-(this.Ye?this.rb:0))/c:Math.min(f/d,e/c)}this.scale=e;this.position=new J(a.x,a.y)}};\nt.uz=function(a,b){this.Ta();var c=this.documentBounds,d=this.viewportBounds;this.position=new J(c.x+(a.x*c.width+a.offsetX)-(b.x*d.width-b.offsetX),c.y+(a.y*c.height+a.offsetY)-(b.y*d.height-b.offsetY))};t.kA=function(a){if(a instanceof Y){this.ao=a;var b=J.alloc();this.bo=this.gr(a.da(tc,b));J.free(b)}else this.ao=null,this.bo=Hb};\nfunction $i(a,b,c,d,e,f){var g=J.allocAt(a.la.x,a.la.y),h=g.x,k=g.y;if(null!==a.ao){var l=J.alloc();l=a.ao.da(tc,l);h=l.x-a.bo.x/a.scale;k=l.y-a.bo.y/a.scale;e=sc;J.free(l)}if(f||a.scrollMode===Yh)e.kb()&&(c>b.width&&(h=b.x+(e.x*b.width+e.offsetX)-(e.x*c-e.offsetX)),d>b.height&&(k=b.y+(e.y*b.height+e.offsetY)-(e.y*d-e.offsetY))),e=a.Si,f=c-b.width,c<b.width+e.left+e.right?(h=Math.min(h+c/2,b.right+Math.max(f,e.right)-c/2),h=Math.max(h,b.left-Math.max(f,e.left)+c/2),h-=c/2):h>b.left?h=b.left:h<b.right-\nc&&(h=b.right-c),c=d-b.height,d<b.height+e.top+e.bottom?(k=Math.min(k+d/2,b.bottom+Math.max(c,e.bottom)-d/2),k=Math.max(k,b.top-Math.max(c,e.top)+d/2),k-=d/2):k>b.top?k=b.top:k<b.bottom-d&&(k=b.bottom-d);g.x=isFinite(h)?h:-a.ib.left;g.y=isFinite(k)?k:-a.ib.top;null!==a.positionComputation&&(b=a.positionComputation(a,g),g.x=b.x,g.y=b.y);a.Uc.sc&&Uh(a.Uc,a.la,g);a.la.h(g.x,g.y);J.free(g)}\nt.zm=function(a,b){void 0===b&&(b=!0);if(b){if(a=wf(this,a,function(a){return a.part},function(a){return a.canSelect()}),a instanceof V)return a}else if(a=wf(this,a,function(a){return a.part}),a instanceof V)return a;return null};t.Vb=function(a,b,c){void 0===b&&(b=null);void 0===c&&(c=null);Wi(this);for(var d=this.Ma.iteratorBackwards;d.next();){var e=d.value;if(e.visible&&(e=e.Vb(a,b,c),null!==e))return e}return null};\nfunction wf(a,b,c,d){void 0===c&&(c=null);void 0===d&&(d=null);Wi(a);for(a=a.Ma.iteratorBackwards;a.next();){var e=a.value;if(e.visible&&!e.isTemporary&&(e=e.Vb(b,c,d),null!==e))return e}return null}t.Zz=function(a,b,c){void 0===b&&(b=!0);return ej(this,a,function(a){return a.part},b?function(a){return a instanceof V&&a.canSelect()}:null,c)};\nfunction ej(a,b,c,d,e){void 0===c&&(c=null);void 0===d&&(d=null);e instanceof E||e instanceof G||(e=new G);Wi(a);for(a=a.Ma.iteratorBackwards;a.next();){var f=a.value;f.visible&&!f.isTemporary&&f.hj(b,c,d,e)}return e}t.hj=function(a,b,c,d){void 0===b&&(b=null);void 0===c&&(c=null);d instanceof E||d instanceof G||(d=new G);Wi(this);for(var e=this.Ma.iteratorBackwards;e.next();){var f=e.value;f.visible&&f.hj(a,b,c,d)}return d};\nt.ty=function(a,b,c,d){void 0===b&&(b=!1);void 0===c&&(c=!0);return fj(this,a,function(a){return a instanceof V&&(!c||a.canSelect())},b,d)};t.zf=function(a,b,c,d,e){void 0===b&&(b=null);void 0===c&&(c=null);void 0===d&&(d=!1);e instanceof E||e instanceof G||(e=new G);Wi(this);for(var f=this.Ma.iteratorBackwards;f.next();){var g=f.value;g.visible&&g.zf(a,b,c,d,e)}return e};\nt.Vv=function(a,b,c,d,e,f){var g=new G;Wi(this);for(var h=this.Ma.iteratorBackwards;h.next();){var k=h.value;k.visible&&k.Vv(a,b,c,d,g,e,f)}return g};function fj(a,b,c,d,e){var f=null;void 0===f&&(f=null);void 0===c&&(c=null);void 0===d&&(d=!1);e instanceof E||e instanceof G||(e=new G);Wi(a);for(a=a.Ma.iteratorBackwards;a.next();){var g=a.value;g.visible&&!g.isTemporary&&g.zf(b,f,c,d,e)}return e}\nt.$z=function(a,b,c,d,e){void 0===c&&(c=!0);void 0===d&&(d=!0);return gj(this,a,b,function(a){return a instanceof V&&(!d||a.canSelect())},c,e)};t.Eg=function(a,b,c,d,e,f){void 0===c&&(c=null);void 0===d&&(d=null);void 0===e&&(e=!0);if(!1!==e&&!0!==e){if(e instanceof E||e instanceof G)f=e;e=!0}f instanceof E||f instanceof G||(f=new G);Wi(this);for(var g=this.Ma.iteratorBackwards;g.next();){var h=g.value;h.visible&&h.Eg(a,b,c,d,e,f)}return f};\nfunction gj(a,b,c,d,e,f){var g=null;void 0===g&&(g=null);void 0===d&&(d=null);void 0===e&&(e=!0);if(!1!==e&&!0!==e){if(e instanceof E||e instanceof G)f=e;e=!0}f instanceof E||f instanceof G||(f=new G);Wi(a);for(a=a.Ma.iteratorBackwards;a.next();){var h=a.value;h.visible&&!h.isTemporary&&h.Eg(b,c,g,d,e,f)}return f}R.prototype.acceptEvent=function(a){return hj(this,a,a instanceof MouseEvent)};\nfunction hj(a,b,c){var d=a.od;a.od=a.hh;a.hh=d;d.diagram=a;d.event=b;c?ij(a,b,d):(d.viewPoint=a.od.viewPoint,d.documentPoint=a.od.documentPoint);a=0;b.ctrlKey&&(a+=1);b.altKey&&(a+=2);b.shiftKey&&(a+=4);b.metaKey&&(a+=8);d.modifiers=a;d.button=b.button;void 0===b.buttons||Ra||(d.buttons=b.buttons);Va&&0===b.button&&b.ctrlKey&&(d.button=2);d.down=!1;d.up=!1;d.clickCount=1;d.delta=0;d.handled=!1;d.bubbles=!1;d.timestamp=b.timeStamp;d.isMultiTouch=!1;d.targetDiagram=jj(b);d.targetObject=null;return d}\nfunction jj(a){var b=a.target.C;if(!b){var c=a.path;c||\"function\"!==typeof a.composedPath||(c=a.composedPath());c&&c[0]&&(b=c[0].C)}return b?b:null}function kj(a,b,c,d){var e=lj(a,b,!0,!1,!0,d);ij(a,c,e);e.targetDiagram=jj(b);e.targetObject=null;d||e.clone(a.Wf);return e}\nfunction mj(a,b,c,d){d=lj(a,b,!1,!1,!1,d);if(null!==c){var e=x.document.elementFromPoint(c.clientX,c.clientY);null!==e&&void 0!==e.shadowRoot&&null!==e.shadowRoot&&(e=e.shadowRoot.elementFromPoint(c.clientX,c.clientY));e&&e.C?(b=c,c=e.C):(b=void 0!==b.targetTouches?b.targetTouches[0]:b,c=a);d.targetDiagram=c;ij(a,b,d)}else null!==a.od?(d.documentPoint=a.od.documentPoint,d.viewPoint=a.od.viewPoint,d.targetDiagram=a.od.targetDiagram):null!==a.Wf&&(d.documentPoint=a.Wf.documentPoint,d.viewPoint=a.Wf.viewPoint,\nd.targetDiagram=a.Wf.targetDiagram);d.targetObject=null;return d}\nfunction lj(a,b,c,d,e,f){var g=a.od;a.od=a.hh;a.hh=g;g.diagram=a;g.clickCount=1;var h=g.delta=0;b.ctrlKey&&(h+=1);b.altKey&&(h+=2);b.shiftKey&&(h+=4);b.metaKey&&(h+=8);g.modifiers=h;g.button=0;g.buttons=1;g.event=b;g.timestamp=b.timeStamp;a.zj&&b instanceof x.PointerEvent&&\"touch\"!==b.pointerType&&(g.button=b.button,void 0===b.buttons||Ra||(g.buttons=b.buttons),Va&&0===b.button&&b.ctrlKey&&(g.button=2));g.down=c;g.up=d;g.handled=!1;g.bubbles=e;g.isMultiTouch=f;return g}\nfunction nj(a,b){if(a.bubbles)return!0;void 0!==b.stopPropagation&&b.stopPropagation();!1!==b.cancelable&&b.preventDefault();b.cancelBubble=!0;return!1}\nR.prototype.BA=function(a){var b=this.C;if(!this.C.isEnabled)return!1;var c=hj(b,a,!1);c.key=String.fromCharCode(a.which);c.down=!0;switch(a.which){case 8:c.key=\"Backspace\";break;case 33:c.key=\"PageUp\";break;case 34:c.key=\"PageDown\";break;case 35:c.key=\"End\";break;case 36:c.key=\"Home\";break;case 37:c.key=\"Left\";break;case 38:c.key=\"Up\";break;case 39:c.key=\"Right\";break;case 40:c.key=\"Down\";break;case 45:c.key=\"Insert\";break;case 46:c.key=\"Del\";break;case 48:c.key=\"0\";break;case 187:case 61:case 107:c.key=\n\"Add\";break;case 189:case 173:case 109:c.key=\"Subtract\";break;case 27:c.key=\"Esc\"}b.doKeyDown();return nj(c,a)};\nR.prototype.CA=function(a){var b=this.C;if(!b.isEnabled)return!1;var c=hj(b,a,!1);c.key=String.fromCharCode(a.which);c.up=!0;switch(a.which){case 8:c.key=\"Backspace\";break;case 33:c.key=\"PageUp\";break;case 34:c.key=\"PageDown\";break;case 35:c.key=\"End\";break;case 36:c.key=\"Home\";break;case 37:c.key=\"Left\";break;case 38:c.key=\"Up\";break;case 39:c.key=\"Right\";break;case 40:c.key=\"Down\";break;case 45:c.key=\"Insert\";break;case 46:c.key=\"Del\"}b.doKeyUp();return nj(c,a)};\nR.prototype.Oz=function(a){var b=this.C;if(!b.isEnabled)return!1;var c=hj(b,a,!0);null!==b.mouseEnter&&b.mouseEnter(c);return nj(c,a)};R.prototype.Pz=function(a){var b=this.C;if(!b.isEnabled)return!1;var c=hj(b,a,!0);null!==b.mouseLeave&&b.mouseLeave(c);return nj(c,a)};\nR.prototype.getMouse=function(a){var b=this.wa;if(null===b)return new J(0,0);var c=b.getBoundingClientRect();b=a.clientX-this.ya/c.width*c.left;a=a.clientY-this.xa/c.height*c.top;return null!==this.sb?wb(new J(b,a),this.sb):new J(b,a)};\nfunction ij(a,b,c){var d=a.wa,e=a.ya,f=a.xa,g=0,h=0;null!==d&&(d=d.getBoundingClientRect(),g=b.clientX-e/d.width*d.left,h=b.clientY-f/d.height*d.top);c.viewPoint.h(g,h);null!==a.sb?(b=J.allocAt(g,h),a.sb.Jd(b),c.documentPoint.assign(b),J.free(b)):c.documentPoint.h(g,h)}\nfunction ue(a,b,c,d){if(void 0!==b.targetTouches){if(2>b.targetTouches.length)return;b=b.targetTouches[c]}else if(null!==a.bk[0])b=a.bk[c];else return;c=a.wa;null!==c&&(c=c.getBoundingClientRect(),d.h(b.clientX-a.ya/c.width*c.left,b.clientY-a.xa/c.height*c.top))}R.prototype.Na=function(){this.vi||(this.vi=!0,this.Db(!0))};function oj(a){a.ac||Wi(a);a.Ta()}R.prototype.redraw=function(){this.Sb||this.ac||(this.M(),aj(this),Vi(this),this.Na(),this.hd())};t=R.prototype;t.AA=function(){return this.Ee};\nt.Jz=function(a){void 0===a&&(a=null);var b=this.animationManager,c=b.isEnabled;b.Bc();b.isEnabled=!1;Hf(this);this.qe=!1;this.Ts=new J(NaN,NaN);b.isEnabled=c;this.ac=!0;var d=this;null!==a&&ta(function(){d.ac=!1;rh(b,\"Model\");a(d)},1)};t.Db=function(a){void 0===a&&(a=!1);if(!0!==this.Ee&&!(this.Sb||!1===a&&this.ac)){this.Ee=!0;var b=this;x.requestAnimationFrame(function(){b.Ee&&b.hd()})}};t.hd=function(){if(!this.Kj||this.Ee)this.Kj&&(this.Kj=!1),Hf(this)};\nfunction bj(a,b,c){a.animationManager.defaultAnimation.isAnimating||a.Sb||!a.wi||Ti(a)||(b&&Wi(a),c&&Yi(a,!1))}\nfunction Hf(a,b){if(!a.ac&&(a.Ee=!1,null!==a.Fa||a.sm.s())){a.ac=!0;var c=a.animationManager,d=a.Wl;if(!c.isAnimating&&0!==d.length){for(var e=d.j,f=e.length,g=0;g<f;g++){var h=e[g];pj(h,!1);h.o()}d.clear()}d=a.Tu;0<d.count&&(d.each(function(a){a.Vw()}),d.clear());e=d=!1;c.defaultAnimation.isAnimating&&(e=!0,d=a.skipsUndoManager,a.skipsUndoManager=!0);c.sc||Kh(a);bj(a,!1,!0);null!==a.Ib&&(a.Ib.visible&&!a.po&&(qj(a),a.po=!0),!a.Ib.visible&&a.po&&(a.po=!1));Wi(a);f=!1;if(!a.qe||a.Ng)a.qe?rj(a,!a.Hj):\n(a.va(\"Initial Layout\"),!1===c.isEnabled&&c.Bc(),rj(a,!1)),f=!0;a.Hj=!1;Wi(a);a.gt||oj(a);bj(a,!0,!1);g=!1;f?(c=N.alloc(),c.assign(a.viewportBounds),a.qe||(g=a.qe=!0,a.skipsUndoManager||(a.undoManager.isPendingClear=!0),a.undoManager.isPendingUnmodified=!0,sj(a)),a.R(\"LayoutCompleted\"),c.w(a.viewportBounds)||bj(a,!0,!1),N.free(c)):c.zl&&c.Qx&&(a.Yf!==xh?a.scale=Zi(a,a.Yf):a.Og!==xh?a.scale=Zi(a,a.Og):(c=a.initialScale,isFinite(c)&&0<c&&(a.scale=c)),Yi(a,!0));Wi(a);f&&g&&a.Xa(\"Initial Layout\");a.Hv();\nb||a.mc(a.Gb);e&&(a.skipsUndoManager=d);a.ac=!1}}function sj(a){var b=a.Aa;if(a.Yf!==xh)a.scale=Zi(a,a.Yf);else if(a.Og!==xh)a.scale=Zi(a,a.Og);else{var c=a.initialScale;isFinite(c)&&0<c&&(a.scale=c)}a.Aa!==b&&(aj(a),bj(a,!0,!1));Yi(a,!0);b=a.Ma.j;a.Nd(b,b.length,a);a.R(\"InitialLayoutCompleted\");a.Ts.assign(a.la);qj(a)}\nfunction Wi(a){if((a.ac||!a.animationManager.isTicking)&&0!==a.wd.count){for(var b=0;23>b;b++){var c=a.wd.iterator;if(null===c||0===a.wd.count)break;a.wd=new G;a.Vw(c,a.wd)}a.nodes.each(function(a){a instanceof U&&0!==(a.P&65536)!==!1&&(a.P=a.P^65536)})}}\nt.Vw=function(a,b){for(a.reset();a.next();){var c=a.value;!c.Nc()||c instanceof U||(c.rj()?(c.measure(Infinity,Infinity),c.arrange()):b.add(c))}for(a.reset();a.next();)c=a.value,c instanceof U&&c.isVisible()&&tj(this,c);for(a.reset();a.next();)c=a.value,c instanceof S&&c.isVisible()&&(c.rj()?(c.measure(Infinity,Infinity),c.arrange()):b.add(c));for(a.reset();a.next();)c=a.value,c instanceof Je&&c.isVisible()&&(c.rj()?(c.measure(Infinity,Infinity),c.arrange()):b.add(c))};\nfunction tj(a,b){for(var c=Ea(),d=Ea(),e=b.memberParts;e.next();){var f=e.value;f.isVisible()&&(f instanceof U?(uj(f)||vj(f)||wj(f))&&tj(a,f):f instanceof S?f.fromNode===b||f.toNode===b?d.push(f):c.push(f):(f.measure(Infinity,Infinity),f.arrange()))}a=c.length;for(e=0;e<a;e++)f=c[e],f.measure(Infinity,Infinity),f.arrange();Ia(c);b.measure(Infinity,Infinity);b.arrange();a=d.length;for(b=0;b<a;b++)c=d[b],c.measure(Infinity,Infinity),c.arrange();Ia(d)}\nt.Nd=function(a,b,c,d){if(this.xi||this.animationManager.isAnimating){void 0===d&&(d=c.viewportBounds);for(var e=0;e<b;e++)a[e].Nd(c,d)}};\nt.mc=function(a,b){void 0===b&&(b=null);if(null!==this.Fa){null===this.wa&&B(\"No canvas specified\");var c=this.animationManager;if(!c.sc&&(!c.isAnimating||c.isTicking)){var d=new Date;xj(this);if(\"0\"!==this.Fa.style.opacity){var e=a!==this.Gb,f=this.Ma.j,g=f.length,h=this;this.Nd(f,g,h);if(e)a.uc(!0),Vi(this);else if(!this.Dc&&null===b&&!c.isAnimating)return;g=this.la;var k=this.Aa,l=Math.round(g.x*k)/k,m=Math.round(g.y*k)/k;c=this.sb;c.reset();1!==k&&c.scale(k);0===g.x&&0===g.y||c.translate(-l,-m);\nk=this.Tb;a.setTransform(1,0,0,1,0,0);a.scale(k,k);a.clearRect(0,0,this.ya,this.xa);1!==this.hb&&(a.globalAlpha=this.hb);yj(this,a);l=null!==b?function(c){var d=b;if(c.visible&&0!==c.hb){var e=c.Ea.j,f=e.length;if(0!==f){var g=mi(c,a),k=c.rp;k.length=0;for(var l=h.scale,m=N.alloc(),n=0;n<f;n++){var A=e[n];d.contains(A)||c.dj(a,A,h,k,l,m,!0)}N.free(m);a.globalAlpha=g}}}:function(b){b.mc(a,h)};g=f.length;for(m=0;m<g;m++)a.setTransform(1,0,0,1,0,0),a.scale(k,k),a.transform(c.m11,c.m12,c.m21,c.m22,c.dx,\nc.dy),l(f[m]);f=!1;this.ui?zj(this.ui,this)&&(f=this.Tr()):f=!0;f&&(ld.prototype.Jd=ld.prototype.Zx);e?(this.Gb.uc(!0),Vi(this)):this.Dc=this.xi=!1;f=+new Date-+d;e=ab&&ab.my;d=this.hv;if(e||null===this.yh){d[this.ep]=f;this.ep=(this.ep+1)%d.length;for(c=f=0;c<d.length;c++)f+=d[c];this.cp=f/d.length}1!==this.hb&&(a.globalAlpha=1);if(e)for(a.setTransform(1,0,0,1,0,0),e=0;e<d.length;e++)a.fillText(d[e].toString(),20,150+ +(20*e))}}}};\nfunction Aj(a,b,c,d,e,f,g,h,k,l){if(null!==a.Fa){null===a.wa&&B(\"No canvas specified\");void 0===g&&(g=null);void 0===h&&(h=null);void 0===k&&(k=!1);void 0===l&&(l=!1);xj(a);a.Gb.uc(!0);Vi(a);a.yi=!0;var m=a.Aa;a.Aa=e;var n=a.Ma.j,p=n.length;try{var r=new N(f.x,f.y,d.width/e,d.height/e),q=r.copy();q.uq(c);qj(a,q);Wi(a);a.Nd(n,p,a,r);b.setTransform(1,0,0,1,0,0);b.clearRect(0,0,d.width,d.height);null!==h&&\"\"!==h&&(b.fillStyle=h,b.fillRect(0,0,d.width,d.height));var u=a.Tb;b.scale(u,u);var w=ld.alloc();\nw.reset();w.translate(c.left,c.top);w.scale(e);0===f.x&&0===f.y||w.translate(-f.x,-f.y);b.setTransform(w.m11,w.m12,w.m21,w.m22,w.dx,w.dy);ld.free(w);yj(a,b);b.globalAlpha=a.hb;var v=a.xk(\"Grid\");if(g){var y=new G,z=g.iterator;for(z.reset();z.next();){var A=z.value;A instanceof V&&(l||A.layer!==v)&&y.add(A)}for(l=0;l<p;l++){var C=n[l];v=b;var F=a;if(C.visible&&0!==C.hb&&(k||!C.isTemporary)){var Q=C.Ea.j,K=Q.length;if(0!==K){var T=mi(C,v),P=C.rp;P.length=0;var I=F.scale,ja=N.alloc();for(c=0;c<K;c++){var ba=\nQ[c];y.contains(ba)&&C.dj(v,ba,F,P,I,ja,!1)}N.free(ja);v.globalAlpha=T}}}}else for(y=0;y<p;y++)F=n[y],F===v?l&&F.mc(b,a,!0):F.mc(b,a,k);a.yi=!1;a.ui&&zj(a.ui,a)&&a.Tr()}finally{a.Aa=m,a.Gb.uc(!0),Vi(a),a.Nd(n,p,a),qj(a)}}}t.Ke=function(a){return this.hf[a]};t.Ty=function(a,b){\"minDrawingLength\"===a&&(this.Xo=b);this.hf[a]=b;this.redraw()};\nt.xw=function(){this.hf=new $a;this.hf.drawShadows=!0;this.hf.textGreeking=!0;this.hf.viewportOptimizations=Wa||Sa||Ta?!1:!0;this.hf.temporaryPixelRatio=!0;this.hf.pictureRatioOptimization=!0;this.Xo=this.hf.minDrawingLength=1};function yj(a,b){a=a.hf;null!==a&&(void 0!==a.imageSmoothingEnabled&&b.Sy(!!a.imageSmoothingEnabled),a=a.defaultFont,void 0!==a&&null!==a&&(b.font=a))}t.Bm=function(a){return this.Nj[a]};t.aB=function(a,b){this.Nj[a]=b};\nt.ww=function(){this.Nj=new $a;this.Nj.extraTouchArea=10;this.Nj.extraTouchThreshold=10;this.Nj.hasGestureZoom=!0};t.Fw=function(a){Bj(this,a)};\nfunction Bj(a,b){var c=a instanceof X,d=a instanceof R,e;for(e in b){\"\"===e&&B(\"Setting properties requires non-empty property names\");var f=a,g=e;if(c||d){var h=e.indexOf(\".\");if(0<h){var k=e.substring(0,h);if(c)f=a.bb(k);else if(f=a[k],void 0===f||null===f)f=a.toolManager[k];za(f)?g=e.substr(h+1):B(\"Unable to find object named: \"+k+\" in \"+a.toString()+\" when trying to set property: \"+e)}}if(\"_\"!==g[0]&&!La(f,g))if(d&&\"ModelChanged\"===g){a.Wx(b[g]);continue}else if(d&&\"Changed\"===g){a.Hh(b[g]);continue}else if(d&&\nLa(a.toolManager,g))f=a.toolManager;else if(d&&Cj(a,g)){a.kk(g,b[g]);continue}else if(a instanceof Z&&\"Changed\"===g){a.Hh(b[g]);continue}else B('Trying to set undefined property \"'+g+'\" on object: '+f.toString());f[g]=b[e];\"_\"===g[0]&&f instanceof Y&&f.Tx(g)}}t.Hv=function(){if(0===this.undoManager.transactionLevel&&0!==this.Vg.count){for(;0<this.Vg.count;){var a=this.Vg;this.Vg=new H;for(a=a.iterator;a.next();){var b=a.key;b.Oq(a.value);b.dc()}}this.M()}};\nt.M=function(a){void 0===a&&(a=null);if(null===a)this.Dc=!0,this.Db();else{var b=this.viewportBounds;null!==a&&a.s()&&b.Mc(a)&&(this.Dc=!0,this.Db())}this.R(\"InvalidateDraw\")};\nR.prototype.invalidateViewport=function(a,b){if(!0!==this.Dc){this.Dc=!0;var c=!0===this.Ke(\"temporaryPixelRatio\");if(!0===this.Ke(\"viewportOptimizations\")&&this.scrollMode!==$h&&this.Si.fj(0,0,0,0)&&b.width===a.width&&b.height===a.height){var d=this.scale,e=Math.max(a.x,b.x),f=Math.max(a.y,b.y);d=N.allocAt(e,f,Math.max(0,Math.min(a.x+a.width,b.x+b.width)-e)*d,Math.max(0,Math.min(a.y+a.height,b.y+b.height)-f)*d);if(!this.gq&&0<d.width&&0<d.height){if(!(this.ac||(this.Ee=!1,null===this.Fa||(this.ac=\n!0,this.Hv(),this.documentBounds.s()||Dj(this,this.computeBounds()),e=this.wa,null===e||e instanceof Ej)))){var g=this.Tb;f=this.ya*g;var h=this.xa*g,k=this.scale*g,l=Math.round(Math.round(b.x*k)-Math.round(a.x*k));b=Math.round(Math.round(b.y*k)-Math.round(a.y*k));k=this.Ju;a=this.ux;k.width!==f&&(k.width=f);k.height!==h&&(k.height=h);a.clearRect(0,0,f,h);k=190*g;var m=70*g,n=Math.max(l,0),p=Math.max(b,0),r=Math.floor(f-n),q=Math.floor(h-p);a.drawImage(e.Ja,n,p,r,q,0,0,r,q);zj(this.ui,this)&&a.clearRect(0,\n0,k,m);e=Ea();a=Ea();q=Math.abs(l);r=Math.abs(b);var u=0===n?0:f-q;n=J.allocAt(u,0);q=J.allocAt(q+u,h);a.push(new N(Math.min(n.x,q.x),Math.min(n.y,q.y),Math.abs(n.x-q.x),Math.abs(n.y-q.y)));var w=this.sb;w.reset();w.scale(g,g);1!==this.Aa&&w.scale(this.Aa);g=this.la;(0!==g.x||0!==g.y)&&isFinite(g.x)&&isFinite(g.y)&&w.translate(-g.x,-g.y);wb(n,w);wb(q,w);e.push(new N(Math.min(n.x,q.x),Math.min(n.y,q.y),Math.abs(n.x-q.x),Math.abs(n.y-q.y)));u=0===p?0:h-r;n.h(0,u);q.h(f,r+u);a.push(new N(Math.min(n.x,\nq.x),Math.min(n.y,q.y),Math.abs(n.x-q.x),Math.abs(n.y-q.y)));wb(n,w);wb(q,w);e.push(new N(Math.min(n.x,q.x),Math.min(n.y,q.y),Math.abs(n.x-q.x),Math.abs(n.y-q.y)));zj(this.ui,this)&&(f=0<l?0:-l,h=0<b?0:-b,n.h(f,h),q.h(k+f,m+h),a.push(new N(Math.min(n.x,q.x),Math.min(n.y,q.y),Math.abs(n.x-q.x),Math.abs(n.y-q.y))),wb(n,w),wb(q,w),e.push(new N(Math.min(n.x,q.x),Math.min(n.y,q.y),Math.abs(n.x-q.x),Math.abs(n.y-q.y))));J.free(n);J.free(q);bj(this,!1,!0);null===this.Fa&&B(\"No div specified\");null===this.wa&&\nB(\"No canvas specified\");if(!this.animationManager.sc&&(f=this.Gb,this.Dc)){xj(this);h=this.Tb;f.setTransform(1,0,0,1,0,0);f.clearRect(0,0,this.ya*h,this.xa*h);f.drawImage(this.Ju.Ja,0<l?0:Math.round(-l),0<b?0:Math.round(-b));l=this.la;g=this.Aa;k=Math.round(l.x*g)/g;m=Math.round(l.y*g)/g;b=this.sb;b.reset();1!==g&&b.scale(g);0===l.x&&0===l.y||b.translate(-k,-m);f.save();f.beginPath();l=a.length;for(g=0;g<l;g++)k=a[g],0!==k.width&&0!==k.height&&f.rect(Math.floor(k.x),Math.floor(k.y),Math.ceil(k.width),\nMath.ceil(k.height));f.clip();f.setTransform(1,0,0,1,0,0);f.scale(h,h);f.transform(b.m11,b.m12,b.m21,b.m22,b.dx,b.dy);b=this.Ma.j;l=b.length;this.Nd(b,l,this);yj(this,f);f.globalAlpha=this.hb;for(h=0;h<l;h++)if(g=b[h],k=e,g.visible&&0!==g.hb){m=mi(g,f);p=g.rp;p.length=0;n=this.scale;r=N.alloc();q=g.Ea.j;w=q.length;u=k.length;for(var v=0;v<w;v++){var y=q[v],z=Fj(y,y.actualBounds);a:{for(var A=2/n,C=4/n,F=0;F<u;F++){var Q=k[F];if(0!==Q.width&&0!==Q.height&&z.cw(Q.x-A,Q.y-A,Q.width+C,Q.height+C)){z=\n!0;break a}}z=!1}z&&g.dj(f,y,this,p,n,r,!0)}N.free(r);f.globalAlpha=m}f.restore();f.uc(!0);this.ui&&zj(this.ui,this)&&this.Tr();this.Dc=this.xi=!1;this.Yq()}Ia(e);Ia(a);this.ac=!1}}else this.hd();N.free(d);c&&(Ze(this),this.hd(),mf(this,!0))}else c?(Ze(this),this.hd(),mf(this,!0)):this.hd()}};function aj(a){!1===a.wi&&(a.wi=!0)}function Vi(a){!1===a.xi&&(a.xi=!0)}function xj(a){!1!==a.El&&(a.El=!1,Gj(a,a.ya,a.xa))}function Gj(a,b,c){var d=a.Tb;a.wa.resize(b*d,c*d,b,c)&&(a.Dc=!0,a.Gb.uc(!0))}\nfunction Ti(a){var b=a.wa;if(null===b||a.sm.s())return!0;var c=a.Fa,d=a.ya,e=a.xa,f=a.viewportBounds.copy();if(!f.s())return!0;var g=!1,h=a.Ye?a.rb:0,k=a.pe?a.rb:0,l=c.clientWidth||d+h,m=c.clientHeight||e+k;if(l!==d+h||m!==e+k)a.Ye=!1,a.pe=!1,k=h=0,a.ya=l,a.xa=m,g=a.El=!0;if(!(g||a.Ye||a.pe||a.vl||a.wl))return!0;a.wi=!1;var n=a.viewportBounds,p=a.documentBounds,r=0,q=0,u=0,w=0;c=n.width;var v=n.height,y=a.Si;a.contentAlignment.kb()?(p.width>c&&(r=y.left,q=y.right),p.height>v&&(u=y.top,w=y.bottom)):\n(r=y.left,q=y.right,u=y.top,w=y.bottom);y=p.width+r+q;var z=p.height+u+w;r=p.x-r;var A=n.x;q=p.right+q;var C=n.right+h;u=p.y-u;var F=n.y;p=p.bottom+w;n=n.bottom+k;var Q=\"1px\",K=\"1px\";w=a.scale;l=y>l/w;m=z>m/w;a.scrollMode===Yh&&(l||m)&&(l&&a.hasHorizontalScrollbar&&a.allowHorizontalScroll&&(l=1,r+1<A&&(l=Math.max((A-r)*w+a.ya,l)),q>C+1&&(l=Math.max((q-C)*w+a.ya,l)),c+h+1<y&&(l=Math.max((y-c)*w+a.ya,l)),Q=l.toString()+\"px\"),m&&a.hasVerticalScrollbar&&a.allowVerticalScroll&&(l=1,u+1<F&&(l=Math.max((F-\nu)*w+a.xa,l)),p>n+1&&(l=Math.max((p-n)*w+a.xa,l)),v+k+1<z&&(l=Math.max((z-v)*w+a.xa,l)),K=l.toString()+\"px\"));l=\"1px\"!==Q;m=\"1px\"!==K;l&&m||!l&&!m||(m&&(C-=a.rb),l&&(n-=a.rb),y<c+h||!a.hasHorizontalScrollbar||!a.allowHorizontalScroll||(h=1,r+1<A&&(h=Math.max((A-r)*w+a.ya,h)),q>C+1&&(h=Math.max((q-C)*w+a.ya,h)),c+1<y&&(h=Math.max((y-c)*w+a.ya,h)),Q=h.toString()+\"px\"),l=\"1px\"!==Q,h=a.xa,l!==a.pe&&(h=l?a.xa-a.rb:a.xa+a.rb),z<v+k||!a.hasVerticalScrollbar||!a.allowVerticalScroll||(k=1,u+1<F&&(k=Math.max((F-\nu)*w+h,k)),p>n+1&&(k=Math.max((p-n)*w+h,k)),v+1<z&&(k=Math.max((z-v)*w+h,k)),K=k.toString()+\"px\"),m=\"1px\"!==K);if(a.Op&&l===a.pe&&m===a.Ye)return d===a.ya&&e===a.xa||a.hd(),!1;l!==a.pe&&(\"1px\"===Q?a.xa=a.xa+a.rb:a.xa=Math.max(a.xa-a.rb,1),g=!0);a.pe=l;a.Pp.style.width=Q;m!==a.Ye&&(\"1px\"===K?a.ya=a.ya+a.rb:a.ya=Math.max(a.ya-a.rb,1),g=!0,a.Gl&&(k=J.alloc(),m?(b.style.left=a.rb+\"px\",a.position=k.h(a.la.x+a.rb/a.scale,a.la.y)):(b.style.left=\"0px\",a.position=k.h(a.la.x-a.rb/a.scale,a.la.y)),J.free(k)));\na.Ye=m;a.Pp.style.height=K;a.Vs=!0;g&&(a.El=!0);b=a.Ys;k=b.scrollLeft;a.hasHorizontalScrollbar&&a.allowHorizontalScroll&&(c+1<y?k=(a.position.x-r)*w:r+1<A?k=b.scrollWidth-b.clientWidth:q>C+1&&(k=a.position.x*w));if(a.Gl)switch(a.Ss){case \"negative\":k=-(b.scrollWidth-k-b.clientWidth);break;case \"reverse\":k=b.scrollWidth-k-b.clientWidth}b.scrollLeft=k;a.hasVerticalScrollbar&&a.allowVerticalScroll&&(v+1<z?b.scrollTop=(a.position.y-u)*w:u+1<F?b.scrollTop=b.scrollHeight-b.clientHeight:p>n+1&&(b.scrollTop=\na.position.y*w));l=a.ya;m=a.xa;b.style.width=l+(a.Ye?a.rb:0)+\"px\";b.style.height=m+(a.pe?a.rb:0)+\"px\";return d!==l||e!==m||a.animationManager.sc?(a.onViewportBoundsChanged(f,a.viewportBounds,w,g),!1):!0}t=R.prototype;\nt.add=function(a){var b=a.diagram;if(b!==this&&(null!==b&&B(\"Cannot add part \"+a.toString()+\" to \"+this.toString()+\". It is already a part of \"+b.toString()),b=this.xk(a.layerName),null===b&&(b=this.xk(\"\")),null===b&&B('Cannot add a Part when unable find a Layer named \"'+a.layerName+'\" and there is no default Layer'),a.layer!==b)){var c=b.oj(99999999,a,a.diagram===this);0<=c&&this.Va(ze,\"parts\",b,null,a,null,c);b.isTemporary||this.Na();a.B(1);c=a.layerChanged;null!==c&&c(a,null,b)}};\nt.oj=function(a){this.partManager.oj(a);var b=this;Hj(a,function(a){Ij(b,a)});(a instanceof Je||a instanceof U&&null!==a.placeholder)&&a.o();null!==a.data&&Hj(a,function(a){Jj(b.partManager,a)});!0!==vj(a)&&!0!==wj(a)||this.wd.add(a);Kj(a,!0,this);Lj(a)?(a.actualBounds.s()&&this.M(Fj(a,a.actualBounds)),this.Na()):a.isVisible()&&a.actualBounds.s()&&this.M(Fj(a,a.actualBounds));this.Db()};\nt.Lc=function(a){a.nk();this.partManager.Lc(a);var b=this;null!==a.data&&Hj(a,function(a){Mj(b.partManager,a,b)});this.wd.remove(a);Lj(a)?(a.actualBounds.s()&&this.M(Fj(a,a.actualBounds)),this.Na()):a.isVisible()&&a.actualBounds.s()&&this.M(Fj(a,a.actualBounds));this.Db()};t.remove=function(a){Nj(this,a,!0)};\nfunction Nj(a,b,c){var d=b.layer;null!==d&&d.diagram===a&&(b.isSelected=!1,b.isHighlighted=!1,b.B(2),c&&b.uk(),c=d.Lc(-1,b,!1),0<=c&&a.Va(Ae,\"parts\",d,b,null,c,null),a=b.layerChanged,null!==a&&a(b,d,null))}t.gu=function(a,b){void 0===b&&(b=!1);if(Aa(a))for(var c=a.length,d=0;d<c;d++){var e=a[d];b&&!e.canDelete()||this.remove(e)}else for(c=new G,c.addAll(a),a=c.iterator;a.next();)c=a.value,b&&!c.canDelete()||this.remove(c)};t.tk=function(a,b,c){void 0===c&&(c=!1);return this.partManager.tk(a,b,c)};\nR.prototype.moveParts=function(a,b,c,d){void 0===c&&(c=!1);void 0===d&&(d=Oj(this));if(null!==this.toolManager){var e=new H;if(null!==a)if(Aa(a))for(var f=0;f<a.length;f++)Pj(this,e,a[f],c,d);else for(a=a.iterator;a.next();)Pj(this,e,a.value,c,d);else{for(a=this.parts;a.next();)Pj(this,e,a.value,c,d);for(a=this.nodes;a.next();)Pj(this,e,a.value,c,d);for(a=this.links;a.next();)Pj(this,e,a.value,c,d)}tf(this,e,b,d,c)}};\nfunction Pj(a,b,c,d,e,f){if(!b.contains(c)&&(void 0===f&&(f=!1),!d||f||c.canMove()||c.canCopy()))if(void 0===e&&(e=Oj(a)),c instanceof W){b.add(c,a.Cd(e,c,c.location));if(c instanceof U&&(null!==c.placeholder||e.dragsMembers))for(f=c.memberParts;f.next();)Pj(a,b,f.value,d,e,e.groupsAlwaysMove);for(f=c.linksConnected;f.next();){var g=f.value;if(!b.contains(g)){var h=g.fromNode,k=g.toNode;null!==h&&b.contains(h)&&null!==k&&b.contains(k)&&Pj(a,b,g,d,e)}}if(e.dragsTree)for(c=c.Wv();c.next();)Pj(a,b,c.value,\nd,e)}else if(c instanceof S)for(b.add(c,a.Cd(e,c)),c=c.labelNodes;c.next();)Pj(a,b,c.value,d,e);else c instanceof Je||b.add(c,a.Cd(e,c,c.location))}\nfunction tf(a,b,c,d,e){if(null!==b&&0!==b.count){var f=J.alloc(),g=J.alloc();g.assign(c);isNaN(g.x)&&(g.x=0);isNaN(g.y)&&(g.y=0);(c=a.fq)||$e(a,b);for(var h=Ea(),k=Ea(),l=b.iterator,m=J.alloc();l.next();){var n=l.key,p=l.value;if(n.Nc()){var r=Qj(a,n,b);if(null!==r)h.push(new Rj(n,p,r));else if(!e||n.canMove())r=p.point,f.assign(r),a.computeMove(n,f.add(g),d,m),n.location=m,void 0===p.shifted&&(p.shifted=new J),p.shifted.assign(m.ge(r))}else l.key instanceof S&&k.push(l.ka)}J.free(m);e=h.length;for(l=\n0;l<e;l++)n=h[l],f.assign(n.info.point),void 0===n.$v.shifted&&(n.$v.shifted=new J),n.node.location=f.add(n.$v.shifted);e=J.alloc();l=J.alloc();n=k.length;for(p=0;p<n;p++){var q=k[p];r=q.key;if(r instanceof S)if(r.suspendsRouting){r.jf=null;m=r.fromNode;var u=r.toNode;if(null!==a.draggedLink&&d.dragsLink)if(u=q.value.point,null===r.dragComputation)b.add(r,a.Cd(d,r,g)),rf(r,g.x-u.x,g.y-u.y);else{q=J.allocAt(0,0);(m=r.i(0))&&m.s()&&q.assign(m);var w=m=J.alloc().assign(q).add(g);d.isGridSnapEnabled&&\n(d.isGridSnapRealtime||a.lastInput.up)&&(w=J.alloc(),Gg(a,r,m,w,d));m.assign(r.dragComputation(r,m,w)).ge(q);b.add(r,a.Cd(d,r,m));rf(r,m.x-u.x,m.y-u.y);J.free(q);J.free(m);w!==m&&J.free(w)}else null!==m&&(e.assign(m.location),w=b.G(m),null!==w&&e.ge(w.point)),null!==u&&(l.assign(u.location),w=b.G(u),null!==w&&l.ge(w.point)),null!==m&&null!==u?e.Qa(l)?(m=q.value.point,u=f,u.assign(e),u.ge(m),b.add(r,a.Cd(d,r,e)),rf(r,u.x,u.y)):(r.suspendsRouting=!1,r.Ua()):(q=q.value.point,m=null!==m?e:null!==u?l:\ng,b.add(r,a.Cd(d,r,m)),rf(r,m.x-q.x,m.y-q.y))}else if(null===r.fromNode||null===r.toNode)m=q.value.point,b.add(r,a.Cd(d,r,g)),rf(r,g.x-m.x,g.y-m.y)}J.free(f);J.free(g);J.free(e);J.free(l);Ia(h);Ia(k);c||(Wi(a),ef(a,b))}}\nR.prototype.computeMove=function(a,b,c,d){void 0===d&&(d=new J);d.assign(b);if(null===a)return d;var e=b,f=c.isGridSnapEnabled;f&&(c.isGridSnapRealtime||this.lastInput.up)&&(e=J.alloc(),Gg(this,a,b,e,c));c=null!==a.dragComputation?a.dragComputation(a,b,e):e;var g=a.minLocation,h=g.x;isNaN(h)&&(h=f?Math.round(1E3*a.location.x)/1E3:a.location.x);g=g.y;isNaN(g)&&(g=f?Math.round(1E3*a.location.y)/1E3:a.location.y);var k=a.maxLocation,l=k.x;isNaN(l)&&(l=f?Math.round(1E3*a.location.x)/1E3:a.location.x);\nk=k.y;isNaN(k)&&(k=f?Math.round(1E3*a.location.y)/1E3:a.location.y);d.h(Math.max(h,Math.min(c.x,l)),Math.max(g,Math.min(c.y,k)));e!==b&&J.free(e);return d};function Oj(a){var b=a.toolManager.findTool(\"Dragging\");return null!==b?b.dragOptions:a.kl}\nfunction Gg(a,b,c,d,e){void 0===e&&(e=Oj(a));d.assign(c);if(null!==b){var f=a.grid;b=e.gridSnapCellSize;a=b.width;b=b.height;var g=e.gridSnapOrigin,h=g.x;g=g.y;e=e.gridSnapCellSpot;if(null!==f){var k=f.gridCellSize;isNaN(a)&&(a=k.width);isNaN(b)&&(b=k.height);f=f.gridOrigin;isNaN(h)&&(h=f.x);isNaN(g)&&(g=f.y)}f=J.allocAt(0,0);f.Uk(0,0,a,b,e);L.Gq(c.x,c.y,h+f.x,g+f.y,a,b,d);J.free(f)}}function $e(a,b){if(null!==b)for(a.fq=!0,a=b.iterator;a.next();)b=a.key,b instanceof S&&(b.suspendsRouting=!0)}\nfunction ef(a,b){if(null!==b){for(b=b.iterator;b.next();){var c=b.key;c instanceof S&&(c.suspendsRouting=!1,Sj(c)&&c.Ua())}a.fq=!1}}function Qj(a,b,c){b=b.containingGroup;if(null!==b){a=Qj(a,b,c);if(null!==a)return a;a=c.G(b);if(null!==a)return a}return null}t=R.prototype;t.Cd=function(a,b,c){if(void 0===c)return new cf(Bb);var d=a.isGridSnapEnabled;a.groupsSnapMembers||null===b.containingGroup||(d=!1);return d?new cf(new J(Math.round(1E3*c.x)/1E3,Math.round(1E3*c.y)/1E3)):new cf(c.copy())};\nfunction Tj(a,b,c){null!==b.diagram&&b.diagram!==a&&B(\"Cannot share a Layer with another Diagram: \"+b+\" of \"+b.diagram);null===c?null!==b.diagram&&B(\"Cannot add an existing Layer to this Diagram again: \"+b):(c.diagram!==a&&B(\"Existing Layer must be in this Diagram: \"+c+\" not in \"+c.diagram),b===c&&B(\"Cannot move a Layer before or after itself: \"+b));if(b.diagram!==a){b=b.name;a=a.Ma;c=a.count;for(var d=0;d<c;d++)a.J(d).name===b&&B(\"Cannot add Layer with the name '\"+b+\"'; a Layer with the same name is already present in this Diagram.\")}}\nt.um=function(a){Tj(this,a,null);a.ee(this);var b=this.Ma,c=b.count-1;if(!a.isTemporary)for(;0<=c&&b.J(c).isTemporary;)c--;b.wb(c+1,a);null!==this.cc&&this.Va(ze,\"layers\",this,null,a,null,c+1);this.M();this.Na()};t.Ux=function(a,b){Tj(this,a,b);a.ee(this);var c=this.Ma,d=c.indexOf(a);0<=d&&(c.remove(a),null!==this.cc&&this.Va(Ae,\"layers\",this,a,null,d,null));var e=c.count,f;for(f=0;f<e;f++)if(c.J(f)===b){c.wb(f,a);break}null!==this.cc&&this.Va(ze,\"layers\",this,null,a,null,f);this.M();0>d&&this.Na()};\nt.nz=function(a,b){Tj(this,a,b);a.ee(this);var c=this.Ma,d=c.indexOf(a);0<=d&&(c.remove(a),null!==this.cc&&this.Va(Ae,\"layers\",this,a,null,d,null));var e=c.count,f;for(f=0;f<e;f++)if(c.J(f)===b){c.wb(f+1,a);break}null!==this.cc&&this.Va(ze,\"layers\",this,null,a,null,f+1);this.M();0>d&&this.Na()};\nt.TA=function(a){a.diagram!==this&&B(\"Cannot remove a Layer from another Diagram: \"+a+\" of \"+a.diagram);if(\"\"!==a.name){var b=this.Ma,c=b.indexOf(a);if(b.remove(a)){for(b=a.Ea.copy().iterator;b.next();){var d=b.value,e=d.layerName;e!==a.name?d.layerName=e:d.layerName=\"\"}null!==this.cc&&this.Va(Ae,\"layers\",this,a,null,c,null);this.M();this.Na()}}};t.xk=function(a){for(var b=this.layers;b.next();){var c=b.value;if(c.name===a)return c}return null};\nt.Wx=function(a){null===this.we&&(this.we=new E);this.we.add(a);this.model.Hh(a)};t.VA=function(a){null!==this.we&&(this.we.remove(a),0===this.we.count&&(this.we=null));this.model.Tk(a)};t.Hh=function(a){null===this.Of&&(this.Of=new E);this.Of.add(a)};t.Tk=function(a){null!==this.Of&&(this.Of.remove(a),0===this.Of.count&&(this.Of=null))};\nt.zt=function(a){this.skipsUndoManager||this.model.skipsUndoManager||this.model.undoManager.aw(a);a.change!==ye&&(this.isModified=!0);if(null!==this.Of)for(var b=this.Of,c=b.length,d=0;d<c;d++)b.J(d)(a)};t.Va=function(a,b,c,d,e,f,g){void 0===f&&(f=null);void 0===g&&(g=null);var h=new we;h.diagram=this;h.change=a;h.propertyName=b;h.object=c;h.oldValue=d;h.oldParam=f;h.newValue=e;h.newParam=g;this.zt(h)};t.g=function(a,b,c,d,e){this.Va(xe,a,this,b,c,d,e)};\nR.prototype.changeState=function(a,b){if(null!==a&&a.diagram===this){var c=this.skipsModelSourceBindings;try{this.skipsModelSourceBindings=!0;var d=a.change;if(d===xe){var e=a.object;Uj(e,a.propertyName,a.G(b));if(e instanceof Y){var f=e.part;null!==f&&f.Lb()}this.isModified=!0}else if(d===ze){var g=a.object,h=a.newParam,k=a.newValue;if(g instanceof X)if(\"number\"===typeof h&&k instanceof Y){b?g.Lc(h):g.wb(h,k);var l=g.part;null!==l&&l.Lb()}else\"number\"===typeof h&&k instanceof Vj&&(k.isRow?Wj(g,h,\nb?void 0:k):Xj(g,h,b?void 0:k));else if(g instanceof ki){var m=!0===a.oldParam;\"number\"===typeof h&&k instanceof V&&(b?(k.isSelected=!1,k.isHighlighted=!1,k.Lb(),g.Lc(m?h:-1,k,m)):g.oj(h,k,m))}else g instanceof R?\"number\"===typeof h&&k instanceof ki&&(b?this.Ma.cb(h):(k.ee(this),this.Ma.wb(h,k))):B(\"unknown ChangedEvent.Insert object: \"+a.toString());this.isModified=!0}else if(d===Ae){var n=a.object,p=a.oldParam,r=a.oldValue;if(n instanceof X)\"number\"===typeof p&&r instanceof Y?b?n.wb(p,r):n.Lc(p):\n\"number\"===typeof p&&r instanceof Vj&&(r.isRow?Wj(n,p,b?r:void 0):Xj(n,p,b?r:void 0));else if(n instanceof ki){var q=!0===a.newParam;\"number\"===typeof p&&r instanceof V&&(b?0>n.Ea.indexOf(r)&&n.oj(p,r,q):(r.isSelected=!1,r.isHighlighted=!1,r.Lb(),n.Lc(q?p:-1,r,q)))}else n instanceof R?\"number\"===typeof p&&r instanceof ki&&(b?(r.ee(this),this.Ma.wb(p,r)):this.Ma.cb(p)):B(\"unknown ChangedEvent.Remove object: \"+a.toString());this.isModified=!0}else d!==ye&&B(\"unknown ChangedEvent: \"+a.toString())}finally{this.skipsModelSourceBindings=\nc}}};R.prototype.va=function(a){return this.undoManager.va(a)};R.prototype.Xa=function(a){return this.undoManager.Xa(a)};R.prototype.If=function(){return this.undoManager.If()};R.prototype.commit=function(a,b){void 0===b&&(b=\"\");var c=this.skipsUndoManager;null===b&&(this.skipsUndoManager=!0,b=\"\");this.undoManager.va(b);var d=!1;try{a(this),d=!0}finally{d?this.undoManager.Xa(b):this.undoManager.If(),this.skipsUndoManager=c}};R.prototype.updateAllTargetBindings=function(a){this.partManager.updateAllTargetBindings(a)};\nR.prototype.ir=function(){this.partManager.ir()};\nfunction Yj(a,b,c){var d=a.animationManager;if(a.Sb||a.ac)a.Aa=c,d.ef&&d.Rd.add(d.C,\"scale\",b,a.Aa);else if(null===a.wa)a.Aa=c;else{a.Sb=!0;var e=a.viewportBounds.copy(),f=a.ya,g=a.xa;e.width=a.ya/b;e.height=a.xa/b;var h=a.zoomPoint.x,k=a.zoomPoint.y,l=a.contentAlignment;isNaN(h)&&(l.Oc()?l.Ef(Gc)?h=0:l.Ef(Hc)&&(h=f-1):h=l.kb()?l.x*(f-1):f/2);isNaN(k)&&(l.Oc()?l.Ef(Ec)?k=0:l.Ef(Ic)&&(k=g-1):k=l.kb()?l.y*(g-1):g/2);null===a.scaleComputation||a.animationManager.defaultAnimation.isAnimating||(c=a.scaleComputation(a,\nc));c<a.minScale&&(c=a.minScale);c>a.maxScale&&(c=a.maxScale);f=J.allocAt(a.la.x+h/b-h/c,a.la.y+k/b-k/c);a.position=f;J.free(f);a.Aa=c;a.onViewportBoundsChanged(e,a.viewportBounds,b,!1);a.Sb=!1;Yi(a,!1);d.ef&&d.Rd.add(d.C,\"scale\",b,a.Aa);a.M();aj(a)}}\nR.prototype.onViewportBoundsChanged=function(a,b,c,d){if(!a.w(b)){void 0===d&&(d=!1);d||aj(this);Vi(this);var e=this.layout;null===e||!e.isViewportSized||this.autoScale!==xh||d||a.width===b.width&&a.height===b.height||e.B();e=this.currentTool;!0===this.Zf&&e instanceof Pa&&(this.lastInput.documentPoint=this.ou(this.lastInput.viewPoint),Se(e,this));this.Sb||this.invalidateViewport(a,b);qj(this);this.Ic.scale=c;this.Ic.position.x=a.x;this.Ic.position.y=a.y;this.Ic.bounds.assign(a);this.Ic.Gv.width=\nMath.round(a.width*c);this.Ic.Gv.height=Math.round(a.height*c);this.Ic.kw.width=this.ya;this.Ic.kw.height=this.xa;this.Ic.hw=d;this.R(\"ViewportBoundsChanged\",this.Ic,a);this.isVirtualized&&this.links.each(function(a){a.isAvoiding&&a.actualBounds.Mc(b)&&a.Ua()})}};\nfunction qj(a,b){void 0===b&&(b=null);var c=a.Ib;if(null!==c&&c.visible){for(var d=M.alloc(),e=1,f=1,g=c.W.j,h=g.length,k=0;k<h;k++){var l=g[k],m=Math.abs(l.interval);2>m||(Zj(l.figure)?f=f*m/L.uy(f,m):e=e*m/L.uy(e,m))}g=c.gridCellSize;d.h(f*g.width,e*g.height);if(null!==b)e=b.width,f=b.height,a=b.x,g=b.y;else{b=N.alloc();a=a.viewportBounds;b.h(a.x,a.y,a.width,a.height);if(!b.s()){N.free(b);return}e=b.width;f=b.height;a=b.x;g=b.y;N.free(b)}c.width=e+2*d.width;c.height=f+2*d.height;b=J.alloc();L.Gq(a,\ng,0,0,d.width,d.height,b);b.offset(-d.width,-d.height);M.free(d);c.part.location=b;J.free(b)}}R.prototype.clearSelection=function(a){void 0===a&&(a=!1);var b=this.selection;if(0!==b.count){a||this.R(\"ChangingSelection\",b);for(var c=b.ma(),d=c.length,e=0;e<d;e++)c[e].isSelected=!1;b.ea();b.clear();b.freeze();a||this.R(\"ChangedSelection\",b)}};\nR.prototype.select=function(a){null!==a&&a.layer.diagram===this&&(!a.isSelected||1<this.selection.count)&&(this.R(\"ChangingSelection\",this.selection),this.clearSelection(!0),a.isSelected=!0,this.R(\"ChangedSelection\",this.selection))};\nR.prototype.$A=function(a){this.R(\"ChangingSelection\",this.selection);this.clearSelection(!0);if(Aa(a))for(var b=a.length,c=0;c<b;c++){var d=a[c];d instanceof V||B(\"Diagram.selectCollection given something that is not a Part: \"+d);d.isSelected=!0}else for(a=a.iterator;a.next();)b=a.value,b instanceof V||B(\"Diagram.selectCollection given something that is not a Part: \"+b),b.isSelected=!0;this.R(\"ChangedSelection\",this.selection)};\nR.prototype.clearHighlighteds=function(){var a=this.highlighteds;if(0<a.count){for(var b=a.ma(),c=b.length,d=0;d<c;d++)b[d].isHighlighted=!1;a.ea();a.clear();a.freeze()}};t=R.prototype;t.uA=function(a){null!==a&&a.layer.diagram===this&&(!a.isHighlighted||1<this.highlighteds.count)&&(this.clearHighlighteds(),a.isHighlighted=!0)};\nt.vA=function(a){a=(new G).addAll(a);for(var b=this.highlighteds.copy().Zq(a).iterator;b.next();)b.value.isHighlighted=!1;for(a=a.iterator;a.next();)b=a.value,b instanceof V||B(\"Diagram.highlightCollection given something that is not a Part: \"+b),b.isHighlighted=!0};\nt.scroll=function(a,b,c){void 0===c&&(c=1);var d=\"up\"===b||\"down\"===b,e=0;if(\"pixel\"===a)e=c;else if(\"line\"===a)e=c*(d?this.scrollVerticalLineChange:this.scrollHorizontalLineChange);else if(\"page\"===a)a=d?this.viewportBounds.height:this.viewportBounds.width,a*=this.scale,0!==a&&(e=c*Math.max(a-(d?this.scrollVerticalLineChange:this.scrollHorizontalLineChange),0));else{if(\"document\"===a){e=this.documentBounds;c=this.viewportBounds;d=J.alloc();\"up\"===b?this.position=d.h(c.x,e.y):\"left\"===b?this.position=\nd.h(e.x,c.y):\"down\"===b?this.position=d.h(c.x,e.bottom-c.height):\"right\"===b&&(this.position=d.h(e.right-c.width,c.y));J.free(d);return}B(\"scrolling unit must be 'pixel', 'line', 'page', or 'document', not: \"+a)}e/=this.scale;c=this.position.copy();\"up\"===b?c.y=this.position.y-e:\"down\"===b?c.y=this.position.y+e:\"left\"===b?c.x=this.position.x-e:\"right\"===b?c.x=this.position.x+e:B(\"scrolling direction must be 'up', 'down', 'left', or 'right', not: \"+b);this.position=c};\nt.Aw=function(a){var b=this.viewportBounds;b.Ge(a)||(a=a.center,a.x-=b.width/2,a.y-=b.height/2,this.position=a)};t.At=function(a){var b=this.viewportBounds;a=a.center;a.x-=b.width/2;a.y-=b.height/2;this.position=a};t.gr=function(a){var b=this.sb;b.reset();1!==this.Aa&&b.scale(this.Aa);var c=this.la;(0!==c.x||0!==c.y)&&isFinite(c.x)&&isFinite(c.y)&&b.translate(-c.x,-c.y);return a.copy().transform(this.sb)};\nt.iB=function(a){var b=this.sb,c=a.x,d=a.y,e=c+a.width,f=d+a.height,g=b.m11,h=b.m12,k=b.m21,l=b.m22,m=b.dx,n=b.dy,p=c*g+d*k+m;b=c*h+d*l+n;var r=e*g+d*k+m;a=e*h+d*l+n;d=c*g+f*k+m;c=c*h+f*l+n;g=e*g+f*k+m;e=e*h+f*l+n;f=Math.min(p,r);p=Math.max(p,r);r=Math.min(b,a);b=Math.max(b,a);f=Math.min(f,d);p=Math.max(p,d);r=Math.min(r,c);b=Math.max(b,c);f=Math.min(f,g);p=Math.max(p,g);r=Math.min(r,e);b=Math.max(b,e);return new N(f,r,p-f,b-r)};\nt.ou=function(a){var b=this.sb;b.reset();1!==this.Aa&&b.scale(this.Aa);var c=this.la;(0!==c.x||0!==c.y)&&isFinite(c.x)&&isFinite(c.y)&&b.translate(-c.x,-c.y);return wb(a.copy(),this.sb)};function ak(a){var b=a.isModified;a.zv!==b&&(a.zv=b,a.R(\"Modified\"))}function bk(a){a=ui.get(a);return null!==a?new a:new vi}\nR.prototype.doModelChanged=function(a){var b=this;if(a.model===this.model){var c=a.change,d=a.propertyName;if(c===ye&&\"S\"===d[0])if(\"StartingFirstTransaction\"===d){var e=this;a=this.toolManager;a.mouseDownTools.each(function(a){a.diagram=e});a.mouseMoveTools.each(function(a){a.diagram=e});a.mouseUpTools.each(function(a){a.diagram=e});this.ac||this.qe||(this.Hj=!0,this.Kj&&(this.Ee=!0))}else\"StartingUndo\"===d||\"StartingRedo\"===d?(a=this.animationManager,a.defaultAnimation.isAnimating&&!this.skipsUndoManager&&\na.Bc(),this.R(\"ChangingSelection\",this.selection)):\"StartedTransaction\"===d&&(a=this.animationManager,a.defaultAnimation.isAnimating&&!this.skipsUndoManager&&a.Bc());else if(this.Z){this.Z=!1;try{if(\"\"===a.modelChange&&c===ye){if(\"FinishedUndo\"===d||\"FinishedRedo\"===d)this.R(\"ChangedSelection\",this.selection),Wi(this);var f=this.animationManager;\"RolledBackTransaction\"===d&&f.Bc();this.Hj=!0;this.hd();0!==this.undoManager.transactionLevel&&1!==this.undoManager.transactionLevel||th(f);\"CommittedTransaction\"===\nd&&this.undoManager.isJustDiscarded&&(this.Xd=Math.min(this.Xd,this.undoManager.historyIndex-1));\"CommittedTransaction\"!==d&&\"RolledBackTransaction\"!==d||!this.undoManager.isPendingUnmodified||setTimeout(function(){b.isModified=!1},1);var g=a.isTransactionFinished;g&&(ak(this),this.Yt.clear(),Rh(this.animationManager));if(!this.Bs&&g&&this.lastInput.targetDiagram){this.Bs=!0;var h=this;ta(function(){h.currentTool.standardMouseOver();h.Bs=!1},10)}}}finally{this.Z=!0}}}};\nfunction Ij(a,b){b=b.W.j;for(var c=b.length,d=0;d<c;d++)ck(a,b[d])}function ck(a,b){if(b instanceof dk){var c=b.element;if(null!==c&&c instanceof HTMLImageElement){c.Wg instanceof G&&c.Wg.add(a);var d=b.Zg;null!==d&&!0===d.ls&&null!==b.diagram&&b.diagram.Wl.add(b);if(c.io)if(c=c.getAttribute(\"src\"),d=a.pg.G(c),null===d)d=[],d.push(b),a.pg.add(c,d);else{for(a=0;a<d.length;a++)if(d[a]===b)return;d.push(b)}}}}\nfunction ek(a,b){if(b instanceof dk){var c=b.element;if(null!==c&&c instanceof HTMLImageElement&&(c.Wg instanceof G&&c.Wg.remove(a),fk(c),c.io)){c=c.getAttribute(\"src\");var d=a.pg.G(c);if(null!==d)for(var e=0;e<d.length;e++)if(d[e]===b){d.splice(e,1);0===d.length&&(a.pg.remove(c),Gi(c));break}}}}R.prototype.Md=function(){this.partManager.Md()};R.prototype.jk=function(a,b){this.Uc.jk(a,b)};R.prototype.lk=function(a,b){this.Uc.lk(a,b)};R.prototype.findPartForKey=function(a){return this.partManager.findPartForKey(a)};\nR.prototype.Cb=function(a){return this.partManager.Cb(a)};R.prototype.findLinkForKey=function(a){return this.partManager.findLinkForKey(a)};t=R.prototype;t.zc=function(a){return this.partManager.zc(a)};t.gj=function(a){return this.partManager.gj(a)};t.yc=function(a){return this.partManager.yc(a)};t.It=function(a){for(var b=[],c=0;c<arguments.length;++c)b[c]=arguments[c];return this.partManager.It.apply(this.partManager,b instanceof Array?b:da(ca(b)))};\nt.Ht=function(a){for(var b=[],c=0;c<arguments.length;++c)b[c]=arguments[c];return this.partManager.Ht.apply(this.partManager,b instanceof Array?b:da(ca(b)))};function Dj(a,b){a.vi=!1;var c=a.Rn;c.w(b)||(b=b.H(),a.Rn=b,Yi(a,!1),a.R(\"DocumentBoundsChanged\",null,c.copy()),aj(a))}t.Ta=function(){this.vi&&Dj(this,this.computeBounds())};t.dA=function(){for(var a=new G,b=this.nodes;b.next();){var c=b.value;c.isTopLevel&&a.add(c)}for(b=this.links;b.next();)c=b.value,c.isTopLevel&&a.add(c);return a.iterator};\nt.cA=function(){return this.Dh.iterator};t.EA=function(a){Wi(this);a&&gk(this,!0);this.ac?rj(this,!1):(this.Hj=!0,Hf(this))};function gk(a,b){for(var c=a.Dh.iterator;c.next();)hk(a,c.value,b);null!==a.layout&&(b?a.layout.isValidLayout=!1:a.layout.B())}function hk(a,b,c){if(null!==b){for(var d=b.Sl.iterator;d.next();)hk(a,d.value,c);null!==b.layout&&(c?b.layout.isValidLayout=!1:b.layout.B())}}\nfunction rj(a,b){if(a.Ng&&!a.Nr){var c=a.Z;a.Z=!0;var d=a.undoManager.transactionLevel,e=a.layout,f=a.animationManager;try{0===d&&(a.undoManager.isInternalTransaction=!0,a.va(\"Layout\"));1>=d&&!f.defaultAnimation.isAnimating&&!f.sc&&(b||rh(f,\"Layout\"));a.Ng=!1;for(var g=a.Dh.iterator;g.next();)pk(a,g.value,b,d);e.isValidLayout||(!b||e.isRealtime||null===e.isRealtime||0===d?(e.doLayout(a),Wi(a),e.isValidLayout=!0):a.Ng=!0)}finally{b=a.undoManager.isInternalTransaction,0===d&&(a.Xa(\"Layout\"),a.undoManager.isInternalTransaction=\n!1),!b||0!==d&&1!==d||th(f),a.Z=c}}}function pk(a,b,c,d){if(null!==b){for(var e=b.Sl.iterator;e.next();)pk(a,e.value,c,d);e=b.layout;null===e||e.isValidLayout||(!c||e.isRealtime||0===d?(b.Rh=!b.location.s(),e.doLayout(b),b.B(32),tj(a,b),e.isValidLayout=!0):a.Ng=!0)}}t.jA=function(){for(var a=new E,b=this.nodes;b.next();){var c=b.value;c.isTopLevel&&null===c.jj()&&a.add(c)}return a.iterator};\nfunction si(a){function b(a){var b=a.toLowerCase(),e=new E;c.add(a,e);c.add(b,e);d.add(a,a);d.add(b,a)}var c=new H,d=new H;b(\"InitialAnimationStarting\");b(\"AnimationStarting\");b(\"AnimationFinished\");b(\"BackgroundSingleClicked\");b(\"BackgroundDoubleClicked\");b(\"BackgroundContextClicked\");b(\"ClipboardChanged\");b(\"ClipboardPasted\");b(\"DocumentBoundsChanged\");b(\"ExternalObjectsDropped\");b(\"GainedFocus\");b(\"InitialLayoutCompleted\");b(\"LayoutCompleted\");b(\"LinkDrawn\");b(\"LinkRelinked\");b(\"LinkReshaped\");\nb(\"LostFocus\");b(\"Modified\");b(\"ObjectSingleClicked\");b(\"ObjectDoubleClicked\");b(\"ObjectContextClicked\");b(\"PartCreated\");b(\"PartResized\");b(\"PartRotated\");b(\"SelectionMoved\");b(\"SelectionCopied\");b(\"SelectionDeleting\");b(\"SelectionDeleted\");b(\"SelectionGrouped\");b(\"SelectionUngrouped\");b(\"ChangingSelection\");b(\"ChangedSelection\");b(\"SubGraphCollapsed\");b(\"SubGraphExpanded\");b(\"TextEdited\");b(\"TreeCollapsed\");b(\"TreeExpanded\");b(\"ViewportBoundsChanged\");b(\"InvalidateDraw\");a.Qr=c;a.Pr=d}\nfunction Cj(a,b){var c=a.Pr.G(b);return null!==c?c:a.Pr.G(b.toLowerCase())}function tk(a,b){var c=a.Qr.G(b);if(null!==c)return c;c=a.Qr.G(b.toLowerCase());if(null!==c)return c;B(\"Unknown DiagramEvent name: \"+b)}t.kk=function(a,b){a=tk(this,a);null!==a&&a.add(b)};t.Lm=function(a,b){a=tk(this,a);null!==a&&a.remove(b)};\nt.R=function(a,b,c){var d=tk(this,a),e=new ve;e.diagram=this;a=Cj(this,a);null!==a&&(e.name=a);void 0!==b&&(e.subject=b);void 0!==c&&(e.parameter=c);b=d.length;if(1===b)d.J(0)(e);else if(0!==b)for(d=d.ma(),c=0;c<b;c++)(0,d[c])(e)};function uk(a){if(a.animationManager.isTicking)return!1;var b=a.currentTool;return b===a.toolManager.findTool(\"Dragging\")?!a.fq||b.isComplexRoutingRealtime:!0}t.Ek=function(a,b){void 0===b&&(b=null);return vk(this,!1,null,b).Ek(a.x,a.y,a.width,a.height)};\nR.prototype.computeOccupiedArea=function(){return this.isVirtualized?this.viewportBounds.copy():this.vi?Xi(this):this.documentBounds.copy()};\nfunction vk(a,b,c,d){null===a.Gc&&(a.Gc=new wk);if(a.Gc.Rt||a.Gc.group!==c||a.Gc.Vy!==d){null!==c&&(c=xk(a,c));if(null===c){b=a.computeOccupiedArea();b.Jc(100,100);a.Gc.initialize(b);b=N.alloc();for(var e=a.nodes;e.next();){var f=e.value,g=f.layer;null!==g&&g.visible&&!g.isTemporary&&yk(a,f,d,b)}N.free(b)}else{0<c.memberParts.count&&(b=a.computePartsBounds(c.memberParts,!1),b.Jc(20,20),a.Gc.initialize(b));b=N.alloc();for(e=c.memberParts;e.next();)f=e.value,f instanceof W&&yk(a,f,d,b);N.free(b)}a.Gc.group=\nc;a.Gc.Vy=d;a.Gc.Rt=!1}else b&&zk(a.Gc);return a.Gc}function xk(a,b){return b.avoidable&&!b.isLinkLabel?b:null!==b.containingGroup?xk(a,b.containingGroup):null}\nfunction yk(a,b,c,d){if(b!==c&&b.isVisible())if(b.avoidable&&!b.isLinkLabel){b=b.getAvoidableRect(d);a=a.Gc;var e=b.x,f=b.y;if(Ak(a,e,f))for(c=(f-a.Bd)/a.gc|0,d=Math.min((e+b.width-a.Ad)/a.fc|0,a.Zi),b=Math.min((f+b.height-a.Bd)/a.gc|0,a.$i),e=(e-a.Ad)/a.fc|0;e<=d;e++)if(f=a.Rb[e],f.fill)f.fill(Bk,c,b+1);else for(var g=c;g<=b;g++)f[g]=Bk}else if(b instanceof U)for(b=b.memberParts;b.next();)e=b.value,e instanceof W&&yk(a,e,c,d)}\nfunction Ck(a,b){null!==a.Gc&&!a.Gc.Rt&&(void 0===b&&(b=null),null===b||b.avoidable&&!b.isLinkLabel)&&(a.Gc.Rt=!0)}R.prototype.Et=function(a){this.rn.assign(a);this.computeAutoScrollPosition(this.rn).Qa(this.position)?this.Jf():Dk(this)};\nfunction Dk(a){-1===a.Bj&&(a.Bj=ta(function(){if(-1!==a.Bj&&(a.Jf(),null!==a.lastInput.event)){var b=a.computeAutoScrollPosition(a.rn);b.Qa(a.position)||(a.position=b,a.lastInput.documentPoint=a.ou(a.rn),a.doMouseMove(),a.vi=!0,Dj(a,a.documentBounds.copy().Rc(a.computeBounds())),a.Dc=!0,a.hd(),Dk(a))}},a.qn))}R.prototype.Jf=function(){-1!==this.Bj&&(x.clearTimeout(this.Bj),this.Bj=-1)};\nR.prototype.computeAutoScrollPosition=function(a){var b=this.position,c=this.sn;if(0>=c.top&&0>=c.left&&0>=c.right&&0>=c.bottom)return b;var d=this.viewportBounds,e=this.scale;d=N.allocAt(0,0,d.width*e,d.height*e);var f=J.allocAt(0,0);if(a.x>=d.x&&a.x<d.x+c.left&&this.allowHorizontalScroll){var g=Math.max(this.scrollHorizontalLineChange,1);g|=0;f.x-=g;a.x<d.x+c.left/2&&(f.x-=g);a.x<d.x+c.left/4&&(f.x-=4*g)}else a.x<=d.x+d.width&&a.x>d.x+d.width-c.right&&this.allowHorizontalScroll&&(g=Math.max(this.scrollHorizontalLineChange,\n1),g|=0,f.x+=g,a.x>d.x+d.width-c.right/2&&(f.x+=g),a.x>d.x+d.width-c.right/4&&(f.x+=4*g));a.y>=d.y&&a.y<d.y+c.top&&this.allowVerticalScroll?(g=Math.max(this.scrollVerticalLineChange,1),g|=0,f.y-=g,a.y<d.y+c.top/2&&(f.y-=g),a.y<d.y+c.top/4&&(f.y-=4*g)):a.y<=d.y+d.height&&a.y>d.y+d.height-c.bottom&&this.allowVerticalScroll&&(g=Math.max(this.scrollVerticalLineChange,1),g|=0,f.y+=g,a.y>d.y+d.height-c.bottom/2&&(f.y+=g),a.y>d.y+d.height-c.bottom/4&&(f.y+=4*g));f.Qa(Bb)||(b=new J(b.x+f.x/e,b.y+f.y/e));\nN.free(d);J.free(f);return b};t=R.prototype;t.$t=function(){return null};t.iw=function(){return null};t.rz=function(a,b){this.Kx.add(a,b)};\nfunction Ek(a,b,c){function d(){var a=+new Date;f=!0;for(g.reset();g.next();)if(!g.value[0].Ol){f=!1;break}f||a-l>k?b(c,e,h):x.requestAnimationFrame(d)}for(var e=c.callback,f=!0,g=a.pg.iterator;g.next();)if(!g.value[0].Ol){f=!1;break}if(\"function\"!==typeof e||f)return b(c,e,a);var h=a,k=c.callbackTimeout||300,l=+new Date;x.requestAnimationFrame(function(){d()});return null}t.GA=function(a){if(!Ug)return null;void 0===a&&(a=new $a);a.returnType=\"Image\";return this.Hy(a)};\nt.Hy=function(a){void 0===a&&(a=new $a);return Ek(this,this.HA,a)};\nt.HA=function(a,b,c){var d=Fk(c,a,\"canvas\",null);if(null===d)return null;c=d.Y.canvas;var e=null;if(null!==c)switch(e=a.returnType,void 0===e?e=\"string\":e=e.toLowerCase(),e){case Gk+\"data\":e=d.getImageData(0,0,c.width,c.height);break;case Gk:d=(a.document||document).createElement(\"img\");d.src=c.toDataURL(a.type,a.details);e=d;break;case \"blob\":\"function\"!==typeof b&&B('Error: Diagram.makeImageData called with \"returnType: toBlob\", but no required \"callback\" function property defined.');if(\"function\"===\ntypeof c.toBlob)return c.toBlob(b,a.type,a.details),\"toBlob\";if(\"function\"===typeof c.msToBlob)return b(c.msToBlob()),\"msToBlob\";b(null);return null;default:e=c.toDataURL(a.type,a.details)}return\"function\"===typeof b?(b(e),null):e};\nfunction Fk(a,b,c,d){a.animationManager.Bc();a.hd();if(null===a.wa)return null;\"object\"!==typeof b&&B(\"properties argument must be an Object.\");var e=b.size||null,f=b.scale||null;void 0!==b.scale&&isNaN(b.scale)&&(f=\"NaN\");var g=b.maxSize;void 0===b.maxSize&&(g=\"SVG\"===c?new M(Infinity,Infinity):new M(2E3,2E3));var h=b.position||null,k=b.parts||null,l=void 0===b.padding?1:b.padding,m=b.background||null,n=b.omitTemporary;void 0===n&&(n=!0);var p=b.document||document,r=b.elementFinished||null,q=b.showTemporary;\nvoid 0===q&&(q=!n);b=b.showGrid;void 0===b&&(b=q);null!==e&&isNaN(e.width)&&isNaN(e.height)&&(e=null);\"number\"===typeof l?l=new kc(l):l instanceof kc||B(\"MakeImage padding must be a Margin or a number.\");l.left=Math.max(l.left,0);l.right=Math.max(l.right,0);l.top=Math.max(l.top,0);l.bottom=Math.max(l.bottom,0);a.Gb.uc(!0);n=new Hk(null,p);var u=n.context;if(!(e||f||k||h)){n.width=a.ya+Math.ceil(l.left+l.right);n.height=a.xa+Math.ceil(l.top+l.bottom);if(\"SVG\"===c){if(null===d)return null;d.resize(n.width,\nn.height,n.width,n.height);d.ownerDocument=p;d.Dq=r;Aj(a,d.context,l,new M(n.width,n.height),a.Aa,a.la,k,m,q,b);return d.context}a.rl=!1;Aj(a,u,l,new M(n.width,n.height),a.Aa,a.la,k,m,q,b);a.rl=!0;return n.context}var w=a.Qn,v=a.documentBounds.copy();v.Jw(a.ib);if(q)for(var y=a.Ma.j,z=y.length,A=0;A<z;A++){var C=y[A];if(C.visible&&C.isTemporary){C=C.Ea.j;for(var F=C.length,Q=0;Q<F;Q++){var K=C[Q];K.isInDocumentBounds&&K.isVisible()&&(K=K.actualBounds,K.s()&&v.Rc(K))}}}y=new J(v.x,v.y);if(null!==k){z=\n!0;A=k.iterator;for(A.reset();A.next();)if(C=A.value,C instanceof V&&(F=C.layer,(null===F||F.visible)&&(null===F||q||!F.isTemporary)&&C.isVisible()&&(C=C.actualBounds,C.s())))if(z){z=!1;var T=C.copy()}else T.Rc(C);z&&(T=new N(0,0,0,0));v.width=T.width;v.height=T.height;y.x=T.x;y.y=T.y}null!==h&&h.s()&&(y=h,f||(f=w));T=h=0;null!==l&&(h=l.left+l.right,T=l.top+l.bottom);z=A=0;null!==e&&(A=e.width,z=e.height,isFinite(A)&&(A=Math.max(0,A-h)),isFinite(z)&&(z=Math.max(0,z-T)));null!==e&&null!==f?(\"NaN\"===\nf&&(f=w),e.s()?(e=A,v=z):isNaN(z)?(e=A,v=v.height*f):(e=v.width*f,v=z)):null!==e?e.s()?(f=Math.min(A/v.width,z/v.height),e=A,v=z):isNaN(z)?(f=A/v.width,e=A,v=v.height*f):(f=z/v.height,e=v.width*f,v=z):null!==f?\"NaN\"===f&&g.s()?(f=Math.min((g.width-h)/v.width,(g.height-T)/v.height),f>w?(f=w,e=v.width,v=v.height):(e=g.width,v=g.height)):(e=v.width*f,v=v.height*f):(f=w,e=v.width,v=v.height);null!==l?(e+=h,v+=T):l=new kc(0);null!==g&&(w=g.width,g=g.height,isNaN(w)&&(w=2E3),isNaN(g)&&(g=2E3),isFinite(w)&&\n(e=Math.min(e,w)),isFinite(g)&&(v=Math.min(v,g)));n.width=Math.ceil(e);n.height=Math.ceil(v);if(\"SVG\"===c){if(null===d)return null;d.resize(n.width,n.height,n.width,n.height);d.ownerDocument=p;d.Dq=r;Aj(a,d.context,l,new M(Math.ceil(e),Math.ceil(v)),f,y,k,m,q,b);return d.context}a.rl=!1;Aj(a,u,l,new M(Math.ceil(e),Math.ceil(v)),f,y,k,m,q,b);a.rl=!0;return n.context}\nna.Object.defineProperties(R.prototype,{div:{get:function(){return this.Fa},set:function(a){if(this.Fa!==a){var b=this.Fa;null!==b?(b.C=void 0,b.goDiagram=void 0,b.innerHTML=\"\",null!==this.wa&&(b=this.wa.Ja,this.zj?(this.removeEventListener(b,\"pointermove\",this.Pk,!1),this.removeEventListener(b,\"pointerdown\",this.Ok,!1),this.removeEventListener(b,\"pointerup\",this.Rk,!1),this.removeEventListener(b,\"pointerout\",this.Qk,!1)):(this.removeEventListener(b,\"touchstart\",this.Ow,\n!1),this.removeEventListener(b,\"touchmove\",this.Nw,!1),this.removeEventListener(b,\"touchend\",this.Mw,!1)),this.wa.ky()),this.Zl&&(this.Zl.disconnect(),this.Zl=null),b=this.toolManager,null!==b&&(b.mouseDownTools.each(function(a){a.cancelWaitAfter()}),b.mouseMoveTools.each(function(a){a.cancelWaitAfter()}),b.mouseUpTools.each(function(a){a.cancelWaitAfter()})),b.cancelWaitAfter(),this.currentTool.doCancel(),this.Gb=this.wa=null,this.removeEventListener(x,\"resize\",this.Ww,!1),this.zj||(this.removeEventListener(x,\n\"mousemove\",this.Ik,!0),this.removeEventListener(x,\"mousedown\",this.Hk,!0),this.removeEventListener(x,\"mouseup\",this.Kk,!0),this.removeEventListener(x,\"mouseout\",this.Jk,!0)),this.removeEventListener(x,\"wheel\",this.Lk,!0),Fe===this&&(Fe=null)):this.qe=!1;this.Fa=null;if(null!==a){if(b=a.C)b.div=null;Ci(this,a);this.redraw()}}}},Yx:{get:function(){return this.cp}},pj:{get:function(){return this.qe}},draggedLink:{\nget:function(){return this.Sr},set:function(a){this.Sr!==a&&(this.Sr=a,null!==a&&(this.Fs=a.fromPort,this.Gs=a.toPort))}},Ky:{get:function(){return this.Fs},set:function(a){this.Fs=a}},Ly:{get:function(){return this.Gs},set:function(a){this.Gs=a}},animationManager:{get:function(){return this.Uc}},undoManager:{get:function(){return this.cc.undoManager}},skipsUndoManager:{\nget:function(){return this.vg},set:function(a){this.vg=a;this.cc.skipsUndoManager=a}},delaysLayout:{get:function(){return this.Nr},set:function(a){this.Nr=a}},opacity:{get:function(){return this.hb},set:function(a){var b=this.hb;b!==a&&((0>a||1<a)&&wa(a,\"0 <= value <= 1\",R,\"opacity\"),this.hb=a,this.g(\"opacity\",b,a),this.M())}},validCycle:{get:function(){return this.tt},set:function(a){var b=this.tt;\nb!==a&&(this.tt=a,this.g(\"validCycle\",b,a))}},layers:{get:function(){return this.Ma.iterator}},isModelReadOnly:{get:function(){var a=this.cc;return null===a?!1:a.isReadOnly},set:function(a){var b=this.cc;null!==b&&(b.isReadOnly=a)}},isReadOnly:{get:function(){return this.$f},set:function(a){var b=this.$f;b!==a&&(this.$f=a,this.g(\"isReadOnly\",b,a))}},isEnabled:{get:function(){return this.md},\nset:function(a){var b=this.md;b!==a&&(this.md=a,this.g(\"isEnabled\",b,a))}},allowClipboard:{get:function(){return this.nr},set:function(a){var b=this.nr;b!==a&&(this.nr=a,this.g(\"allowClipboard\",b,a))}},allowCopy:{get:function(){return this.$h},set:function(a){var b=this.$h;b!==a&&(this.$h=a,this.g(\"allowCopy\",b,a))}},allowDelete:{get:function(){return this.ai},set:function(a){var b=this.ai;b!==a&&(this.ai=a,\nthis.g(\"allowDelete\",b,a))}},allowDragOut:{get:function(){return this.pr},set:function(a){var b=this.pr;b!==a&&(this.pr=a,this.g(\"allowDragOut\",b,a))}},allowDrop:{get:function(){return this.qr},set:function(a){var b=this.qr;b!==a&&(this.qr=a,this.g(\"allowDrop\",b,a))}},allowTextEdit:{get:function(){return this.ji},set:function(a){var b=this.ji;b!==a&&(this.ji=a,this.g(\"allowTextEdit\",b,a))}},allowGroup:{\nget:function(){return this.bi},set:function(a){var b=this.bi;b!==a&&(this.bi=a,this.g(\"allowGroup\",b,a))}},allowUngroup:{get:function(){return this.ki},set:function(a){var b=this.ki;b!==a&&(this.ki=a,this.g(\"allowUngroup\",b,a))}},allowInsert:{get:function(){return this.sr},set:function(a){var b=this.sr;b!==a&&(this.sr=a,this.g(\"allowInsert\",b,a))}},allowLink:{get:function(){return this.ci},set:function(a){var b=\nthis.ci;b!==a&&(this.ci=a,this.g(\"allowLink\",b,a))}},allowRelink:{get:function(){return this.ei},set:function(a){var b=this.ei;b!==a&&(this.ei=a,this.g(\"allowRelink\",b,a))}},allowMove:{get:function(){return this.di},set:function(a){var b=this.di;b!==a&&(this.di=a,this.g(\"allowMove\",b,a))}},allowReshape:{get:function(){return this.fi},set:function(a){var b=this.fi;b!==a&&(this.fi=a,this.g(\"allowReshape\",b,a))}},\nallowResize:{get:function(){return this.gi},set:function(a){var b=this.gi;b!==a&&(this.gi=a,this.g(\"allowResize\",b,a))}},allowRotate:{get:function(){return this.hi},set:function(a){var b=this.hi;b!==a&&(this.hi=a,this.g(\"allowRotate\",b,a))}},allowSelect:{get:function(){return this.ii},set:function(a){var b=this.ii;b!==a&&(this.ii=a,this.g(\"allowSelect\",b,a))}},allowUndo:{get:function(){return this.tr},\nset:function(a){var b=this.tr;b!==a&&(this.tr=a,this.g(\"allowUndo\",b,a))}},allowZoom:{get:function(){return this.vr},set:function(a){var b=this.vr;b!==a&&(this.vr=a,this.g(\"allowZoom\",b,a))}},hasVerticalScrollbar:{get:function(){return this.wl},set:function(a){var b=this.wl;b!==a&&(this.wl=a,aj(this),this.M(),this.g(\"hasVerticalScrollbar\",b,a),Yi(this,!1))}},hasHorizontalScrollbar:{get:function(){return this.vl},\nset:function(a){var b=this.vl;b!==a&&(this.vl=a,aj(this),this.M(),this.g(\"hasHorizontalScrollbar\",b,a),Yi(this,!1))}},allowHorizontalScroll:{get:function(){return this.rr},set:function(a){var b=this.rr;b!==a&&(this.rr=a,this.g(\"allowHorizontalScroll\",b,a),Yi(this,!1))}},allowVerticalScroll:{get:function(){return this.ur},set:function(a){var b=this.ur;b!==a&&(this.ur=a,this.g(\"allowVerticalScroll\",b,a),Yi(this,!1))}},scrollHorizontalLineChange:{\nget:function(){return this.Ws},set:function(a){var b=this.Ws;b!==a&&(0>a&&wa(a,\">= 0\",R,\"scrollHorizontalLineChange\"),this.Ws=a,this.g(\"scrollHorizontalLineChange\",b,a))}},scrollVerticalLineChange:{get:function(){return this.$s},set:function(a){var b=this.$s;b!==a&&(0>a&&wa(a,\">= 0\",R,\"scrollVerticalLineChange\"),this.$s=a,this.g(\"scrollVerticalLineChange\",b,a))}},lastInput:{get:function(){return this.hh},set:function(a){this.hh=\na}},previousInput:{get:function(){return this.od},set:function(a){this.od=a}},firstInput:{get:function(){return this.Wf},set:function(a){this.Wf=a}},currentCursor:{get:function(){return this.Hr},set:function(a){\"\"===a&&(a=this.Pn);if(this.Hr!==a){var b=this.wa,c=this.Fa;if(null!==b){this.Hr=a;var d=b.style.cursor;b.style.cursor=a;c.style.cursor=a;b.style.cursor===d&&(b.style.cursor=\"-webkit-\"+a,c.style.cursor=\n\"-webkit-\"+a,b.style.cursor===d&&(b.style.cursor=\"-moz-\"+a,c.style.cursor=\"-moz-\"+a,b.style.cursor===d&&(b.style.cursor=a,c.style.cursor=a)))}}}},defaultCursor:{get:function(){return this.Pn},set:function(a){\"\"===a&&(a=\"auto\");var b=this.Pn;b!==a&&(this.Pn=a,this.g(\"defaultCursor\",b,a))}},click:{get:function(){return this.Pf},set:function(a){var b=this.Pf;b!==a&&(this.Pf=a,this.g(\"click\",b,a))}},doubleClick:{\nget:function(){return this.Uf},set:function(a){var b=this.Uf;b!==a&&(this.Uf=a,this.g(\"doubleClick\",b,a))}},contextClick:{get:function(){return this.Qf},set:function(a){var b=this.Qf;b!==a&&(this.Qf=a,this.g(\"contextClick\",b,a))}},mouseOver:{get:function(){return this.lg},set:function(a){var b=this.lg;b!==a&&(this.lg=a,this.g(\"mouseOver\",b,a))}},mouseHover:{get:function(){return this.jg},set:function(a){var b=\nthis.jg;b!==a&&(this.jg=a,this.g(\"mouseHover\",b,a))}},mouseHold:{get:function(){return this.ig},set:function(a){var b=this.ig;b!==a&&(this.ig=a,this.g(\"mouseHold\",b,a))}},mouseDragOver:{get:function(){return this.As},set:function(a){var b=this.As;b!==a&&(this.As=a,this.g(\"mouseDragOver\",b,a))}},mouseDrop:{get:function(){return this.gg},set:function(a){var b=this.gg;b!==a&&(this.gg=a,this.g(\"mouseDrop\",b,a))}},\nhandlesDragDropForTopLevelParts:{get:function(){return this.cs},set:function(a){var b=this.cs;b!==a&&(this.cs=a,this.g(\"handlesDragDropForTopLevelParts\",b,a))}},mouseEnter:{get:function(){return this.hg},set:function(a){var b=this.hg;b!==a&&(this.hg=a,this.g(\"mouseEnter\",b,a))}},mouseLeave:{get:function(){return this.kg},set:function(a){var b=this.kg;b!==a&&(this.kg=a,this.g(\"mouseLeave\",b,a))}},toolTip:{\nget:function(){return this.wg},set:function(a){var b=this.wg;b!==a&&(this.wg=a,this.g(\"toolTip\",b,a))}},contextMenu:{get:function(){return this.Rf},set:function(a){var b=this.Rf;b!==a&&(this.Rf=a,this.g(\"contextMenu\",b,a))}},commandHandler:{get:function(){return this.Br},set:function(a){this.Br!==a&&(this.Br=a,a.ee(this))}},toolManager:{get:function(){return this.pt},set:function(a){this.pt!==a&&\n(this.pt=a,a.diagram=this)}},defaultTool:{get:function(){return this.Mr},set:function(a){var b=this.Mr;b!==a&&(this.Mr=a,a.diagram=this,this.currentTool===b&&(this.currentTool=a))}},currentTool:{get:function(){return this.Jr},set:function(a){var b=this.Jr;null!==b&&(b.isActive&&b.doDeactivate(),b.cancelWaitAfter(),b.doStop());null===a&&(a=this.defaultTool);null!==a&&(this.Jr=a,a.diagram=this,a.doStart())}},selection:{\nget:function(){return this.qv}},maxSelectionCount:{get:function(){return this.ws},set:function(a){var b=this.ws;if(b!==a)if(0<=a&&!isNaN(a)){if(this.ws=a,this.g(\"maxSelectionCount\",b,a),!this.undoManager.isUndoingRedoing&&(a=this.selection.count-a,0<a)){this.R(\"ChangingSelection\",this.selection);b=this.selection.ma();for(var c=0;c<a;c++)b[c].isSelected=!1;this.R(\"ChangedSelection\",this.selection)}}else wa(a,\">= 0\",R,\"maxSelectionCount\")}},nodeSelectionAdornmentTemplate:{\nget:function(){return this.kp},set:function(a){var b=this.kp;b!==a&&(this.kp=a,this.g(\"nodeSelectionAdornmentTemplate\",b,a))}},groupSelectionAdornmentTemplate:{get:function(){return this.qo},set:function(a){var b=this.qo;b!==a&&(this.qo=a,this.g(\"groupSelectionAdornmentTemplate\",b,a))}},linkSelectionAdornmentTemplate:{get:function(){return this.Lo},set:function(a){var b=this.Lo;b!==a&&(this.Lo=a,this.g(\"linkSelectionAdornmentTemplate\",\nb,a))}},highlighteds:{get:function(){return this.Su}},isModified:{get:function(){var a=this.undoManager;return a.isEnabled?null!==a.currentTransaction?!0:this.wo&&this.Xd!==a.historyIndex:this.wo},set:function(a){if(this.wo!==a){this.wo=a;var b=this.undoManager;!a&&b.isEnabled&&(this.Xd=b.historyIndex);a||ak(this)}}},model:{get:function(){return this.cc},set:function(a){var b=this.cc;if(b!==a){this.currentTool.doCancel();\nnull!==b&&b.undoManager!==a.undoManager&&b.undoManager.isInTransaction&&B(\"Do not replace a Diagram.model while a transaction is in progress.\");this.animationManager.Bc(!0);var c=Fi(this,!0);this.qe=!1;this.Kj=!0;this.Xd=-2;this.Ee=!1;var d=this.ac;this.ac=!0;rh(this.animationManager,\"Model\");null!==b&&(null!==this.we&&this.we.each(function(a){b.Tk(a)}),b.Tk(this.Tc));this.cc=a;this.partManager=bk(this.cc.type);for(var e=0;e<c.length;e++)this.add(c[e]);a.Hh(this.Cc);this.partManager.addAllModeledParts();\na.Tk(this.Cc);a.Hh(this.Tc);null!==this.we&&this.we.each(function(b){a.Hh(b)});this.ac=d;this.Na();this.Sb||this.M();null!==b&&a.undoManager.copyProperties(b.undoManager)}}},Z:{get:function(){return this.av},set:function(a){this.av=a}},Yt:{get:function(){return this.Ax}},skipsModelSourceBindings:{get:function(){return this.rv},set:function(a){this.rv=a}},mu:{get:function(){return this.gt},\nset:function(a){this.gt=a}},nodeTemplate:{get:function(){return this.df.G(\"\")},set:function(a){var b=this.df.G(\"\");b!==a&&(this.df.add(\"\",a),this.g(\"nodeTemplate\",b,a),this.undoManager.isUndoingRedoing||this.Md())}},nodeTemplateMap:{get:function(){return this.df},set:function(a){var b=this.df;b!==a&&(this.df=a,this.g(\"nodeTemplateMap\",b,a),this.undoManager.isUndoingRedoing||this.Md())}},groupTemplate:{get:function(){return this.fh.G(\"\")},\nset:function(a){var b=this.fh.G(\"\");b!==a&&(this.fh.add(\"\",a),this.g(\"groupTemplate\",b,a),this.undoManager.isUndoingRedoing||this.Md())}},groupTemplateMap:{get:function(){return this.fh},set:function(a){var b=this.fh;b!==a&&(this.fh=a,this.g(\"groupTemplateMap\",b,a),this.undoManager.isUndoingRedoing||this.Md())}},linkTemplate:{get:function(){return this.bg.G(\"\")},set:function(a){var b=this.bg.G(\"\");b!==a&&(this.bg.add(\"\",a),this.g(\"linkTemplate\",\nb,a),this.undoManager.isUndoingRedoing||this.Md())}},linkTemplateMap:{get:function(){return this.bg},set:function(a){var b=this.bg;b!==a&&(this.bg=a,this.g(\"linkTemplateMap\",b,a),this.undoManager.isUndoingRedoing||this.Md())}},isMouseCaptured:{get:function(){return this.Xu},set:function(a){var b=this.wa;null!==b&&(b=b.Ja,b instanceof SVGElement||(a?(this.lastInput.bubbles=!1,this.zj?(this.removeEventListener(b,\"pointermove\",this.Pk,!1),this.removeEventListener(b,\n\"pointerdown\",this.Ok,!1),this.removeEventListener(b,\"pointerup\",this.Rk,!1),this.removeEventListener(b,\"pointerout\",this.Qk,!1),this.addEventListener(x,\"pointermove\",this.Pk,!0),this.addEventListener(x,\"pointerdown\",this.Ok,!0),this.addEventListener(x,\"pointerup\",this.Rk,!0),this.addEventListener(x,\"pointerout\",this.Qk,!0)):(this.removeEventListener(b,\"mousemove\",this.Ik,!1),this.removeEventListener(b,\"mousedown\",this.Hk,!1),this.removeEventListener(b,\"mouseup\",this.Kk,!1),this.removeEventListener(b,\n\"mouseout\",this.Jk,!1),this.addEventListener(x,\"mousemove\",this.Ik,!0),this.addEventListener(x,\"mousedown\",this.Hk,!0),this.addEventListener(x,\"mouseup\",this.Kk,!0),this.addEventListener(x,\"mouseout\",this.Jk,!0)),this.removeEventListener(b,\"wheel\",this.Lk,!1),this.addEventListener(x,\"wheel\",this.Lk,!0),this.addEventListener(x,\"selectstart\",this.preventDefault,!1)):(this.zj?(this.removeEventListener(x,\"pointermove\",this.Pk,!0),this.removeEventListener(x,\"pointerdown\",this.Ok,!0),this.removeEventListener(x,\n\"pointerup\",this.Rk,!0),this.removeEventListener(x,\"pointerout\",this.Qk,!0),this.addEventListener(b,\"pointermove\",this.Pk,!1),this.addEventListener(b,\"pointerdown\",this.Ok,!1),this.addEventListener(b,\"pointerup\",this.Rk,!1),this.addEventListener(b,\"pointerout\",this.Qk,!1)):(this.removeEventListener(x,\"mousemove\",this.Ik,!0),this.removeEventListener(x,\"mousedown\",this.Hk,!0),this.removeEventListener(x,\"mouseup\",this.Kk,!0),this.removeEventListener(x,\"mouseout\",this.Jk,!0),this.addEventListener(b,\"mousemove\",\nthis.Ik,!1),this.addEventListener(b,\"mousedown\",this.Hk,!1),this.addEventListener(b,\"mouseup\",this.Kk,!1),this.addEventListener(b,\"mouseout\",this.Jk,!1)),this.removeEventListener(x,\"wheel\",this.Lk,!0),this.removeEventListener(x,\"selectstart\",this.preventDefault,!1),this.addEventListener(b,\"wheel\",this.Lk,!1)),this.Xu=a))}},position:{get:function(){return this.la},set:function(a){var b=J.alloc().assign(this.la);if(!b.w(a)){var c=this.viewportBounds.copy();this.la.assign(a);\nUh(this.animationManager,b,this.la);this.Sb||null===this.wa&&!this.sm.s()||(this.Sb=!0,a=this.scale,$i(this,this.Rn,this.ya/a,this.xa/a,this.Dj,!1),this.Sb=!1);if(!this.Sb)this.onViewportBoundsChanged(c,this.viewportBounds,this.Aa,!1)}J.free(b)}},initialPosition:{get:function(){return this.es},set:function(a){this.es.w(a)||(this.es=a.H())}},initialScale:{get:function(){return this.fs},set:function(a){this.fs!==a&&(this.fs=a)}},grid:{\nget:function(){null===this.Ib&&Ri(this);return this.Ib},set:function(a){var b=this.Ib;if(b!==a){null===b&&(Ri(this),b=this.Ib);a.type!==X.Grid&&B(\"Diagram.grid must be a Panel of type Panel.Grid\");var c=b.panel;null!==c&&c.remove(b);this.Ib=a;a.name=\"GRID\";null!==c&&c.add(a);qj(this);this.M();this.g(\"grid\",b,a)}}},viewportBounds:{get:function(){var a=this.Rx,b=this.la,c=this.Aa;a.h(b.x,b.y,Math.max(this.ya,0)/c,Math.max(this.xa,0)/c);return a}},viewSize:{\nget:function(){return this.sm},set:function(a){var b=this.viewSize;b.w(a)||(this.sm=a=a.H(),this.ya=a.width,this.xa=a.height,this.Na(),this.g(\"viewSize\",b,a))}},fixedBounds:{get:function(){return this.Zr},set:function(a){var b=this.Zr;b.w(a)||(-Infinity!==a.width&&Infinity!==a.height&&-Infinity!==a.height||B(\"fixedBounds width/height must not be Infinity\"),this.Zr=a=a.H(),this.Na(),this.g(\"fixedBounds\",b,a))}},scrollMargin:{\nget:function(){return this.Si},set:function(a){\"number\"===typeof a&&(a=new kc(a));var b=this.Si;b.w(a)||(this.Si=a=a.H(),this.g(\"scrollMargin\",b,a),this.Yq())}},scrollMode:{get:function(){return this.Ti},set:function(a){var b=this.Ti;b!==a&&(this.Ti=a,a===Yh&&Yi(this,!1),this.g(\"scrollMode\",b,a),this.M())}},scrollsPageOnFocus:{get:function(){return this.at},set:function(a){var b=this.at;b!==a&&(this.at=a,this.g(\"scrollsPageOnFocus\",b,a))}},\npositionComputation:{get:function(){return this.Ns},set:function(a){var b=this.Ns;b!==a&&(this.Ns=a,Yi(this,!1),this.g(\"positionComputation\",b,a))}},scaleComputation:{get:function(){return this.Us},set:function(a){var b=this.Us;b!==a&&(this.Us=a,Yj(this,this.scale,this.scale),this.g(\"scaleComputation\",b,a))}},documentBounds:{get:function(){return this.Rn}},isVirtualized:{get:function(){return this.rs},\nset:function(a){var b=this.rs;b!==a&&(this.rs=a,this.g(\"isVirtualized\",b,a))}},scale:{get:function(){return this.Aa},set:function(a){var b=this.Aa;b!==a&&Yj(this,b,a)}},defaultScale:{get:function(){return this.Qn},set:function(a){this.Qn=a}},autoScale:{get:function(){return this.Og},set:function(a){var b=this.Og;b!==a&&(this.Og=a,this.g(\"autoScale\",b,a),a!==xh&&Yi(this,!1))}},initialAutoScale:{\nget:function(){return this.Yf},set:function(a){var b=this.Yf;b!==a&&(this.Yf=a,this.g(\"initialAutoScale\",b,a))}},initialViewportSpot:{get:function(){return this.gs},set:function(a){var b=this.gs;b!==a&&(a.kb()||B(\"initialViewportSpot must be a specific Spot: \"+a),this.gs=a,this.g(\"initialViewportSpot\",b,a))}},initialDocumentSpot:{get:function(){return this.ds},set:function(a){var b=this.ds;b!==a&&(a.kb()||B(\"initialViewportSpot must be a specific Spot: \"+\na),this.ds=a,this.g(\"initialDocumentSpot\",b,a))}},minScale:{get:function(){return this.xs},set:function(a){var b=this.xs;b!==a&&(0<a?(this.xs=a,this.g(\"minScale\",b,a),a>this.scale&&(this.scale=a)):wa(a,\"> 0\",R,\"minScale\"))}},maxScale:{get:function(){return this.vs},set:function(a){var b=this.vs;b!==a&&(0<a?(this.vs=a,this.g(\"maxScale\",b,a),a<this.scale&&(this.scale=a)):wa(a,\"> 0\",R,\"maxScale\"))}},zoomPoint:{\nget:function(){return this.xt},set:function(a){this.xt.w(a)||(this.xt=a=a.H())}},contentAlignment:{get:function(){return this.Dj},set:function(a){var b=this.Dj;b.w(a)||(this.Dj=a=a.H(),this.g(\"contentAlignment\",b,a),Yi(this,!1))}},initialContentAlignment:{get:function(){return this.to},set:function(a){var b=this.to;b.w(a)||(this.to=a=a.H(),this.g(\"initialContentAlignment\",b,a))}},padding:{get:function(){return this.ib},\nset:function(a){\"number\"===typeof a&&(a=new kc(a));var b=this.ib;b.w(a)||(this.ib=a=a.H(),this.Na(),this.g(\"padding\",b,a))}},partManager:{get:function(){return this.La},set:function(a){var b=this.La;b!==a&&(null!==a.diagram&&B(\"Cannot share PartManagers between Diagrams: \"+a.toString()),null!==b&&b.ee(null),this.La=a,a.ee(this))}},nodes:{get:function(){return this.partManager.nodes.iterator}},links:{get:function(){return this.partManager.links.iterator}},\nparts:{get:function(){return this.partManager.parts.iterator}},layout:{get:function(){return this.kc},set:function(a){var b=this.kc;b!==a&&(this.kc=a,a.diagram=this,a.group=null,this.Ng=!0,this.g(\"layout\",b,a),this.Db())}},isTreePathToChildren:{get:function(){return this.qs},set:function(a){var b=this.qs;if(b!==a&&(this.qs=a,this.g(\"isTreePathToChildren\",b,a),!this.undoManager.isUndoingRedoing))for(a=this.nodes;a.next();)Ik(a.value)}},\ntreeCollapsePolicy:{get:function(){return this.rt},set:function(a){var b=this.rt;b!==a&&(a!==ti&&a!==Jk&&a!==Kk&&B(\"Unknown Diagram.treeCollapsePolicy: \"+a),this.rt=a,this.g(\"treeCollapsePolicy\",b,a))}},Le:{get:function(){return this.Uu},set:function(a){this.Uu=a}},autoScrollInterval:{get:function(){return this.qn},set:function(a){var b=this.qn;b!==a&&(this.qn=a,this.g(\"autoScrollInterval\",b,a))}},autoScrollRegion:{\nget:function(){return this.sn},set:function(a){\"number\"===typeof a&&(a=new kc(a));var b=this.sn;b.w(a)||(this.sn=a=a.H(),this.Na(),this.g(\"autoScrollRegion\",b,a))}}});na.Object.defineProperties(R,{licenseKey:{get:function(){return Lk.Xb()},set:function(a){Lk.add(a)}},version:{get:function(){return Mk}}});R.prototype.makeImageData=R.prototype.Hy;R.prototype.makeImage=R.prototype.GA;R.prototype.addRenderer=R.prototype.rz;\nR.prototype.makeSVG=R.prototype.iw;R.prototype.makeSvg=R.prototype.$t;R.prototype.stopAutoScroll=R.prototype.Jf;R.prototype.doAutoScroll=R.prototype.Et;R.prototype.isUnoccupied=R.prototype.Ek;R.prototype.raiseDiagramEvent=R.prototype.R;R.prototype.removeDiagramListener=R.prototype.Lm;R.prototype.addDiagramListener=R.prototype.kk;R.prototype.findTreeRoots=R.prototype.jA;R.prototype.layoutDiagram=R.prototype.EA;R.prototype.findTopLevelGroups=R.prototype.cA;R.prototype.findTopLevelNodesAndLinks=R.prototype.dA;\nR.prototype.ensureBounds=R.prototype.Ta;R.prototype.findLinksByExample=R.prototype.Ht;R.prototype.findNodesByExample=R.prototype.It;R.prototype.findLinkForData=R.prototype.yc;R.prototype.findNodeForData=R.prototype.gj;R.prototype.findPartForData=R.prototype.zc;R.prototype.findLinkForKey=R.prototype.findLinkForKey;R.prototype.findNodeForKey=R.prototype.Cb;R.prototype.findPartForKey=R.prototype.findPartForKey;R.prototype.rebuildParts=R.prototype.Md;R.prototype.transformViewToDoc=R.prototype.ou;\nR.prototype.transformRectDocToView=R.prototype.iB;R.prototype.transformDocToView=R.prototype.gr;R.prototype.centerRect=R.prototype.At;R.prototype.scrollToRect=R.prototype.Aw;R.prototype.scroll=R.prototype.scroll;R.prototype.highlightCollection=R.prototype.vA;R.prototype.highlight=R.prototype.uA;R.prototype.selectCollection=R.prototype.$A;R.prototype.select=R.prototype.select;R.prototype.updateAllRelationshipsFromData=R.prototype.ir;R.prototype.updateAllTargetBindings=R.prototype.updateAllTargetBindings;\nR.prototype.commit=R.prototype.commit;R.prototype.rollbackTransaction=R.prototype.If;R.prototype.commitTransaction=R.prototype.Xa;R.prototype.startTransaction=R.prototype.va;R.prototype.raiseChanged=R.prototype.g;R.prototype.raiseChangedEvent=R.prototype.Va;R.prototype.removeChangedListener=R.prototype.Tk;R.prototype.addChangedListener=R.prototype.Hh;R.prototype.removeModelChangedListener=R.prototype.VA;R.prototype.addModelChangedListener=R.prototype.Wx;R.prototype.findLayer=R.prototype.xk;\nR.prototype.removeLayer=R.prototype.TA;R.prototype.addLayerAfter=R.prototype.nz;R.prototype.addLayerBefore=R.prototype.Ux;R.prototype.addLayer=R.prototype.um;R.prototype.moveParts=R.prototype.moveParts;R.prototype.copyParts=R.prototype.tk;R.prototype.removeParts=R.prototype.gu;R.prototype.remove=R.prototype.remove;R.prototype.add=R.prototype.add;R.prototype.clearDelayedGeometries=R.prototype.Hv;R.prototype.setProperties=R.prototype.Fw;R.prototype.resetInputOptions=R.prototype.ww;\nR.prototype.setInputOption=R.prototype.aB;R.prototype.getInputOption=R.prototype.Bm;R.prototype.resetRenderingHints=R.prototype.xw;R.prototype.setRenderingHint=R.prototype.Ty;R.prototype.getRenderingHint=R.prototype.Ke;R.prototype.maybeUpdate=R.prototype.hd;R.prototype.requestUpdate=R.prototype.Db;R.prototype.delayInitialization=R.prototype.Jz;R.prototype.isUpdateRequested=R.prototype.AA;R.prototype.invalidateDocumentBounds=R.prototype.Na;R.prototype.findObjectsNear=R.prototype.Eg;\nR.prototype.findPartsNear=R.prototype.$z;R.prototype.findObjectsIn=R.prototype.zf;R.prototype.findPartsIn=R.prototype.ty;R.prototype.findObjectsAt=R.prototype.hj;R.prototype.findPartsAt=R.prototype.Zz;R.prototype.findObjectAt=R.prototype.Vb;R.prototype.findPartAt=R.prototype.zm;R.prototype.focusObject=R.prototype.kA;R.prototype.alignDocument=R.prototype.uz;R.prototype.zoomToRect=R.prototype.mB;R.prototype.zoomToFit=R.prototype.zoomToFit;R.prototype.diagramScroll=R.prototype.iy;R.prototype.focus=R.prototype.focus;\nR.useDOM=function(a){Ug=a?void 0!==x.document:!1};R.isUsingDOM=function(){return Ug};\nvar Fe=null,ui=new H,Pi=null,Ii=null,Ug=void 0!==x.document,Di=null,Ei=\"\",xh=new D(R,\"None\",0),cj=new D(R,\"Uniform\",1),dj=new D(R,\"UniformToFill\",2),Mf=new D(R,\"CycleAll\",10),Qf=new D(R,\"CycleNotDirected\",11),Sf=new D(R,\"CycleNotDirectedFast\",12),Tf=new D(R,\"CycleNotUndirected\",13),Nf=new D(R,\"CycleDestinationTree\",14),Pf=new D(R,\"CycleSourceTree\",15),Yh=new D(R,\"DocumentScroll\",1),$h=new D(R,\"InfiniteScroll\",2),ti=new D(R,\"TreeParentCollapsed\",21),Jk=new D(R,\"AllParentsCollapsed\",22),Kk=new D(R,\n\"AnyParentsCollapsed\",23),Lk=new E,Mk=\"2.1.53\",Gk=\"image\",Nk=null,qi=!1;\nfunction ri(){if(Ug){var a=x.document.createElement(\"canvas\"),b=a.getContext(\"2d\"),c=Qa(\"7ca11abfd022028846\");b[c]=Qa(\"398c3597c01238\");for(var d=[\"5da73c80a36455d5038e4972187c3cae51fd22\",ra.Dx+\"4ae6247590da4bb21c324ba3a84e385776\",ld.xF+\"fb236cdfda5de14c134ba1a95a2d4c7cc6f93c1387\",L.za],e=1;5>e;e++)b[Qa(\"7ca11abfd7330390\")](Qa(d[e-1]),10,15*e);b[c]=Qa(\"39f046ebb36e4b\");for(c=1;5>c;c++)b[Qa(\"7ca11abfd7330390\")](Qa(d[c-1]),10,15*c);if(4!==d.length||\"5\"!==d[0][0]||\"7\"!==d[3][0])ld.prototype.Jd=ld.prototype.Zx;\nNk=a}}R.className=\"Diagram\";R.fromDiv=function(a){var b=a;\"string\"===typeof a&&(b=x.document.getElementById(a));return b instanceof HTMLDivElement&&b.C instanceof R?b.C:null};R.inherit=function(a,b){function c(){}if(Object.getPrototypeOf(a).prototype)throw Error(\"Used go.Diagram.inherit defining already defined class \\n\"+a);c.prototype=b.prototype;a.prototype=new c;a.prototype.constructor=a};R.None=xh;R.Uniform=cj;R.UniformToFill=dj;R.CycleAll=Mf;R.CycleNotDirected=Qf;R.CycleNotDirectedFast=Sf;\nR.CycleNotUndirected=Tf;R.CycleDestinationTree=Nf;R.CycleSourceTree=Pf;R.DocumentScroll=Yh;R.InfiniteScroll=$h;R.TreeParentCollapsed=ti;R.AllParentsCollapsed=Jk;R.AnyParentsCollapsed=Kk;function Bi(){this.jz=null;this.l=\"zz@orderNum\";\"63ad05bbe23a1786468a4c741b6d2\"===this._tk?this.Ve=this.l=!0:this.Ve=null}\nfunction zj(a,b){b.Gb.setTransform(b.Tb,0,0,b.Tb,0,0);if(null===a.Ve)a:{b=\"f\";var c=x[Qa(\"76a715b2f73f148a\")][Qa(\"72ba13b5\")];a.Ve=!0;if(Ug){var d=R[Qa(\"76a115b6ed251eaf4692\")];if(d)for(var e=Lk.iterator;e.next();){d=e.value;d=Qa(d).split(Qa(\"39e9\"));if(6>d.length)break;var f=Qa(d[1]).split(\".\");if(\"7da71ca0\"!==d[4])break;var g=Qa(ra[Qa(\"6cae19\")]).split(\".\");if(f[0]>g[0]||f[0]===g[0]&&f[1]>=g[1]){f=c[Qa(\"76ad18b4f73e\")];for(g=c[Qa(\"73a612b6fb191d\")](Qa(\"35e7\"))+2;g<f;g++)b+=c[g];f=b[Qa(\"73a612b6fb191d\")](Qa(d[2]));\n0>f&&Qa(d[2])!==Qa(\"7da71ca0ad381e90\")&&(f=b[Qa(\"73a612b6fb191d\")](Qa(\"76a715b2ef3e149757\")));0>f&&(f=b[Qa(\"73a612b6fb191d\")](Qa(\"76a715b2ef3e149757\")));0>f&&(f=c[Qa(\"73a612b6fb191d\")](Qa(\"7baa19a6f76c1988428554\")));a.Ve=!(0<=f&&f<b[Qa(\"73a612b6fb191d\")](Qa(\"35\"))||-1===b[Qa(\"73a612b6fb191d\")](Qa(\"35\")));if(!a.Ve)break;f=Qa(d[2]);if(\"#\"===f[0]){g=x.document.createElement(\"div\");for(var h=d[0].replace(/[A-Za-z]/g,\"\");4>h.length;)h+=\"9\";h=h.substr(h.length-4);d=\"\";d+=[\"gsh\",\"gsf\"][parseInt(h.substr(0,\n1),10)%2];d+=[\"Header\",\"Background\",\"Display\",\"Feedback\"][parseInt(h.substr(0,1),10)%4];g[Qa(\"79a417a0f0181a8946\")]=d;if(x.document[Qa(\"78a712aa\")]){if(x.document[Qa(\"78a712aa\")][Qa(\"7bb806b6ed32388c4a875b\")](g),h=x.getComputedStyle(g).getPropertyValue(Qa(\"78a704b7e62456904c9b12701b6532a8\")),x.document[Qa(\"78a712aa\")][Qa(\"68ad1bbcf533388c4a875b\")](g),h)if(-1!==h.indexOf(parseInt(f[1]+f[2],16))&&-1!==h.indexOf(parseInt(f[3]+f[4],16))){a.Ve=!1;break}else if(Ra||Sa||Ta||Ua)for(d=\".\"+d,f=0;f<document.styleSheets.length;f++){g=\ndocument.styleSheets[f].rules||document.styleSheets[f].cssRules;for(var k in g)if(d===g[k].selectorText){a.Ve=!1;break a}}}else a.Ve=null,a.Ve=!1}}}else{k=c[Qa(\"76ad18b4f73e\")];for(e=c[Qa(\"73a612b6fb191d\")](Qa(\"35e7\"))+2;e<k;e++)b+=c[e];c=b[Qa(\"73a612b6fb191d\")](Qa(\"7da71ca0ad381e90\"));a.Ve=!(0<=c&&c<b[Qa(\"73a612b6fb191d\")](Qa(\"35\")))}}}return 0<a.Ve&&a!==a.jz?!0:!1}\nfunction Ci(a,b){if(Ug){void 0!==b&&null!==b||B(\"Diagram setup requires an argument DIV.\");null!==a.Fa&&B(\"Diagram has already completed setup.\");\"string\"===typeof b?a.Fa=x.document.getElementById(b):b instanceof HTMLDivElement?a.Fa=b:B(\"No DIV or DIV id supplied: \"+b);null===a.Fa&&B(\"Invalid DIV id; could not get element with id: \"+b);void 0!==a.Fa.C&&B(\"Invalid div id; div already has a Diagram associated with it.\");if(!a.Zl&&x.ResizeObserver){var c=sa(function(){a.Db()},250);a.Zl=new x.ResizeObserver(function(){c()});\na.Zl.observe(a.Fa)}\"static\"===x.getComputedStyle(a.Fa,null).position&&(a.Fa.style.position=\"relative\");b=5;var d=\"rgba(2\"+b+\"5, 255, 255, 0)\";b--;a.Fa.style[\"-webkit-tap-highlight-color\"]=d;a.Fa.style[\"-ms-touch-action\"]=\"none\";a.Fa.innerHTML=\"\";a.Fa.C=a;a.Fa.goDiagram=a;a.Fa.go=x.go;var e=a.gq?new Ej(a):new Hk(a);void 0!==e.style&&(e.style.position=\"absolute\",e.style.top=\"0px\",e.style.left=\"0px\",\"rtl\"===x.getComputedStyle(a.Fa,null).getPropertyValue(\"direction\")&&(a.Gl=!0),e.style.zIndex=\"2\",e.style.userSelect=\n\"none\",e.style.MozUserSelect=\"none\");a.wa=e;a.Gb=e.context;d=a.Gb;a.Tb=a.computePixelRatio();a.viewSize.s()||(a.ya=a.Fa.clientWidth||1,a.xa=a.Fa.clientHeight||1);Gj(a,a.ya,a.xa);a.Fa.insertBefore(e.Ja,a.Fa.firstChild);e=new Hk(null);e.width=1;e.height=1;a.Ju=e;a.ux=e.context;if(Ug){e=ua(\"div\");var f=ua(\"div\");e.style.position=\"absolute\";e.style.overflow=\"auto\";e.style.width=a.ya+\"px\";e.style.height=a.xa+\"px\";e.style.zIndex=\"1\";f.style.position=\"absolute\";f.style.width=\"1px\";f.style.height=\"1px\";a.Fa.appendChild(e);\ne.appendChild(f);e.onscroll=Si;e.addEventListener(\"mousedown\",Ui);e.addEventListener(\"touchstart\",Ui,{passive:!0});e.C=a;e.hz=!0;e.iz=!0;a.Ys=e;a.Pp=f}a.Yq=sa(function(){a.yh=null;a.M()},300);a.Ww=sa(function(){Kh(a)},250);a.preventDefault=function(a){a.preventDefault();return!1};a.Ik=function(b){if(a.isEnabled){a.Zf=!0;var c=hj(a,b,!0);a.doMouseMove();a.currentTool.isBeyondDragSize()&&(a.xd=0);nj(c,b)}};a.Hk=function(b){if(a.isEnabled)if(a.Zf=!0,a.re)b.preventDefault();else{var c=hj(a,b,!0);c.down=\n!0;c.clickCount=b.detail;if(Sa||Ta)b.timeStamp-a.Sj<a.qt&&!a.currentTool.isBeyondDragSize()?a.xd++:a.xd=1,a.Sj=b.timeStamp,c.clickCount=a.xd;c.clone(a.firstInput);a.doMouseDown();1===b.button?b.preventDefault():nj(c,b)}};a.Kk=function(b){if(a.isEnabled)if(a.re&&2===b.button)b.preventDefault();else if(a.re&&0===b.button&&(a.re=!1),a.hk)b.preventDefault();else{a.Zf=!0;var c=hj(a,b,!0);c.up=!0;c.clickCount=b.detail;if(Sa||Ta)c.clickCount=a.xd;c.bubbles=b.bubbles;c.targetDiagram=jj(b);a.doMouseUp();a.Jf();\nnj(c,b)}};a.Lk=function(b){if(a.isEnabled){var c=hj(a,b,!0);c.bubbles=!0;var d=0,e=0;c.delta=0;void 0!==b.deltaX?(0!==b.deltaX&&(d=0<b.deltaX?1:-1),0!==b.deltaY&&(e=0<b.deltaY?1:-1),c.delta=Math.abs(b.deltaX)>Math.abs(b.deltaY)?-d:-e):void 0!==b.wheelDeltaX?(0!==b.wheelDeltaX&&(d=0<b.wheelDeltaX?-1:1),0!==b.wheelDeltaY&&(e=0<b.wheelDeltaY?-1:1),c.delta=Math.abs(b.wheelDeltaX)>Math.abs(b.wheelDeltaY)?-d:-e):void 0!==b.wheelDelta&&0!==b.wheelDelta&&(c.delta=0<b.wheelDelta?1:-1);a.doMouseWheel();nj(c,\nb)}};a.Jk=function(b){a.isEnabled&&(a.Zf=!1,hj(a,b,!0),b=a.currentTool,b.cancelWaitAfter(),b.standardMouseOver())};a.Ow=function(b){if(a.isEnabled){a.hk=!1;a.re=!0;var c=kj(a,b,b.targetTouches[0],1<b.touches.length),d=null;0<b.targetTouches.length?d=b.targetTouches[0]:0<b.changedTouches.length&&(d=b.changedTouches[0]);if(null!==d){var e=d.screenX;d=d.screenY;var f=a.Go;b.timeStamp-a.Sj<a.qt&&!(25<Math.abs(f.x-e)||25<Math.abs(f.y-d))?a.xd++:a.xd=1;c.clickCount=a.xd;a.Sj=b.timeStamp;a.Go.h(e,d)}a.doMouseDown();\nnj(c,b)}};a.Nw=function(b){if(a.isEnabled){var c=null;0<b.targetTouches.length?c=b.targetTouches[0]:0<b.changedTouches.length&&(c=b.changedTouches[0]);c=mj(a,b,c,1<b.touches.length);a.doMouseMove();nj(c,b)}};a.Mw=function(b){if(a.isEnabled)if(a.hk)b.preventDefault();else if(!(1<b.touches.length)){var c=null,d=null;0<b.targetTouches.length?d=b.targetTouches[0]:0<b.changedTouches.length&&(d=b.changedTouches[0]);var e=lj(a,b,!1,!0,!1,!1);null!==d&&(c=x.document.elementFromPoint(d.clientX,d.clientY),\nnull!==c&&void 0!==c.shadowRoot&&null!==c&&null!==c.shadowRoot&&(c=c.shadowRoot.elementFromPoint(d.clientX,d.clientY)),null!==c&&c.C instanceof R&&c.C!==a&&ij(c.C,d,e),ij(a,d,e),e.clickCount=a.xd);null===c?e.targetDiagram=jj(b):c.C?e.targetDiagram=c.C:e.targetDiagram=null;e.targetObject=null;a.doMouseUp();nj(e,b);a.re=!1}};a.Ok=function(b){if(a.isEnabled){a.Zf=!0;var c=a.Ls;void 0===c[b.pointerId]&&(c[b.pointerId]=b);c=a.bk;var d=!1;if(null!==c[0]&&c[0].pointerId===b.pointerId)c[0]=b;else if(null!==\nc[1]&&c[1].pointerId===b.pointerId)c[1]=b,d=!0;else if(null===c[0])c[0]=b;else if(null===c[1])c[1]=b,d=!0;else{b.preventDefault();return}if(\"touch\"===b.pointerType||\"pen\"===b.pointerType)a.hk=!1,a.re=!0;c=kj(a,b,b,d);d=a.Go;var e=\"touch\"===b.pointerType||\"pen\"===b.pointerType?25:10;b.timeStamp-a.Sj<a.qt&&!(Math.abs(d.x-b.screenX)>e||Math.abs(d.y-b.screenY)>e)?a.xd++:a.xd=1;c.clickCount=a.xd;a.Sj=b.timeStamp;a.Go.Ig(b.screenX,b.screenY);a.doMouseDown();1===b.button?b.preventDefault():nj(c,b)}};a.Pk=\nfunction(b){if(a.isEnabled){a.Zf=!0;var c=a.bk;if(null!==c[0]&&c[0].pointerId===b.pointerId)c[0]=b;else{if(null!==c[1]&&c[1].pointerId===b.pointerId){c[1]=b;return}if(null===c[0])c[0]=b;else return}c[0].pointerId===b.pointerId&&(c=mj(a,b,b,null!==c[1]),c.targetDiagram=jj(b),a.doMouseMove(),nj(c,b))}};a.Rk=function(b){if(a.isEnabled){a.Zf=!0;var c=\"touch\"===b.pointerType||\"pen\"===b.pointerType,d=a.Ls;if(c&&a.hk)delete d[b.pointerId],b.preventDefault();else if(d=a.bk,null!==d[0]&&d[0].pointerId===b.pointerId){d[0]=\nnull;d=lj(a,b,!1,!0,!0,!1);var e=x.document.elementFromPoint(b.clientX,b.clientY);null!==e&&e.C instanceof R&&e.C!==a&&ij(e.C,b,d);ij(a,b,d);d.clickCount=a.xd;null===e?d.targetDiagram=jj(b):e.C?d.targetDiagram=e.C:d.targetDiagram=null;d.targetObject=null;a.doMouseUp();nj(d,b);c&&(a.re=!1)}else null!==d[1]&&d[1].pointerId===b.pointerId&&(d[1]=null)}};a.Qk=function(b){if(a.isEnabled){a.Zf=!1;var c=a.Ls;c[b.pointerId]&&delete c[b.pointerId];c=a.bk;null!==c[0]&&c[0].pointerId===b.pointerId&&(c[0]=null);\nnull!==c[1]&&c[1].pointerId===b.pointerId&&(c[1]=null);\"touch\"!==b.pointerType&&\"pen\"!==b.pointerType&&(b=a.currentTool,b.cancelWaitAfter(),b.standardMouseOver())}};a.Tr=d.Y[\"d\"+Ok[1]+Ok[2]+\"wI\"+Gk.slice(1,5)][\"b\"+Pk.slice(1,b)](d.Y,Nk,b,b);d.uc(!0);Qi(a)}}Bi.className=\"DiagramHelper\";function cf(a){this.l=void 0===a?new J:a;this.u=new J}\nna.Object.defineProperties(cf.prototype,{point:{get:function(){return this.l},set:function(a){this.l=a}},shifted:{get:function(){return this.u},set:function(a){this.u=a}}});var Ok=\"DraggingInfo\";cf.className=\"DraggingInfo\";function Rj(a,b,c){this.node=a;this.info=b;this.$v=c}Rj.className=\"DraggingNodeInfoPair\";function We(){this.reset()}\nWe.prototype.reset=function(){this.isGridSnapEnabled=!1;this.isGridSnapRealtime=!0;this.gridSnapCellSize=(new M(NaN,NaN)).freeze();this.gridSnapCellSpot=tc;this.gridSnapOrigin=(new J(NaN,NaN)).freeze();this.groupsSnapMembers=this.dragsTree=this.dragsLink=!1;this.dragsMembers=this.groupsAlwaysMove=!0};We.className=\"DraggingOptions\";function Qk(a){1<arguments.length&&B(\"Palette constructor can only take one optional argument, the DIV HTML element or its id.\");R.call(this,a);Rk(this)}ma(Qk,R);\nfunction Rk(a){a.allowDragOut=!0;a.allowMove=!1;a.isReadOnly=!0;a.contentAlignment=uc;a.layout=new Sk}Qk.prototype.reset=function(){R.prototype.reset.call(this);Rk(this)};Qk.className=\"Palette\";\nfunction Tk(a){1<arguments.length&&B(\"Overview constructor can only take one optional argument, the DIV HTML element or its id.\");R.call(this,a);var b=this;this.animationManager.isEnabled=!1;this.Sb=!0;this.Ka=null;this.wl=this.vl=!1;this.I=this.T=!0;this.eb=0;this.u=!1;this.fm=null;this.Ty(\"drawShadows\",!1);var c=new V,d=new Kf;d.stroke=\"magenta\";d.strokeWidth=2;d.fill=\"transparent\";d.name=\"BOXSHAPE\";c.selectable=!0;c.selectionAdorned=!1;c.selectionObjectName=\"BOXSHAPE\";c.locationObjectName=\"BOXSHAPE\";\nc.resizeObjectName=\"BOXSHAPE\";c.cursor=\"move\";c.add(d);this.l=c;this.allowDelete=this.allowCopy=!1;this.allowSelect=!0;this.autoScrollRegion=new kc(0,0,0,0);this.la.h(0,0);this.toolManager.Ya(\"Dragging\",new Uk,this.toolManager.mouseMoveTools);this.click=function(){var a=b.observed;if(null!==a){var c=a.viewportBounds,d=b.lastInput.documentPoint;a.position=new J(d.x-c.width/2,d.y-c.height/2)}};this.Xh=function(){b.Na();Vk(b)};this.Wh=function(){null!==b.observed&&(b.Na(),b.M())};this.Sc=function(){1>\nb.updateDelay?b.M():b.u||(b.u=!0,setTimeout(function(){return b.redraw()},b.updateDelay))};this.Od=function(){null!==b.observed&&Vk(b)};this.autoScale=cj;this.Sb=!1}ma(Tk,R);Tk.prototype.computePixelRatio=function(){return 1};\nTk.prototype.redraw=function(){if(this.u&&1<=this.updateDelay){this.u=!1;var a=this.wa,b=this.Gb;if(null!==a&&null!==b){xj(this);if(null===this.fm){var c=new Hk(null);c.width=a.width;c.height=a.height;this.fm=c}try{this.wa=this.fm,this.Gb=this.wa.context,this.Gb.uc(!0),this.Gb.setTransform(1,0,0,1,0,0),this.Gb.clearRect(0,0,this.wa.width,this.wa.height),Wk(this)}finally{this.wa=a,this.Gb=b}}}R.prototype.redraw.call(this)};\nTk.prototype.mc=function(){null===this.Fa&&B(\"No div specified\");null===this.wa&&B(\"No canvas specified\");if(!(this.wa instanceof Ej)&&(li(this.box),this.Dc)){var a=this.observed;if(null!==a&&!a.animationManager.defaultAnimation.isAnimating&&a.pj){xj(this);var b=this.wa;a=this.Gb;a.uc(!0);a.setTransform(1,0,0,1,0,0);a.clearRect(0,0,b.width,b.height);1>this.updateDelay?Wk(this):null!==this.fm&&(a.drawImage(this.fm.Ja,0,0),b=this.sb,b.reset(),1!==this.scale&&b.scale(this.scale),0===this.position.x&&\n0===this.position.y||b.translate(-this.position.x,-this.position.y),a.scale(this.Tb,this.Tb),a.transform(b.m11,b.m12,b.m21,b.m22,b.dx,b.dy));b=this.Ma.j;for(var c=b.length,d=0;d<c;d++)b[d].mc(a,this);this.Dc=this.xi=!1}}};\nfunction Wk(a){var b=a.observed;if(null!==b){var c=a.drawsTemporaryLayers,d=a.drawsGrid&&c,e=b.grid;d&&null!==e&&e.visible&&!isNaN(e.width)&&!isNaN(e.height)&&(e=N.alloc().assign(a.viewportBounds).Rc(b.viewportBounds),qj(b,e),N.free(e),Wi(b));var f=a.sb;f.reset();1!==a.scale&&f.scale(a.scale);0===a.position.x&&0===a.position.y||f.translate(-a.position.x,-a.position.y);e=a.Gb;e.scale(a.Tb,a.Tb);e.transform(f.m11,f.m12,f.m21,f.m22,f.dx,f.dy);b=b.Ma.j;f=b.length;for(var g=0;g<f;g++){var h=b[g],k=a;if(h.visible&&\n0!==h.opacity){var l=h.diagram.grid.part;if(!c&&h.isTemporary)d&&l.layer===h&&(h=mi(h,e),l.mc(e,k),e.globalAlpha=h);else{for(var m=mi(h,e),n=k.scale,p=N.alloc(),r=h.Ea.j,q=r.length,u=0;u<q;u++){var w=r[u];(d||w!==l)&&h.dj(e,w,k,null,n,p,!1)}N.free(p);e.globalAlpha=m}}}}}\nfunction Vk(a){var b=a.box;if(null!==b){var c=a.observed;if(null!==c){a.Dc=!0;c=c.viewportBounds;var d=b.selectionObject,e=M.alloc();e.h(c.width,c.height);d.desiredSize=e;M.free(e);a=2/a.scale;d instanceof Kf&&(d.strokeWidth=a);b.location=new J(c.x-a/2,c.y-a/2);b.isSelected=!0}}}Tk.prototype.computeBounds=function(){var a=this.observed;if(null===a)return ic;var b=a.documentBounds.copy();b.Rc(a.viewportBounds);return b};Tk.prototype.invalidateViewport=function(){!0!==this.Dc&&(this.Dc=!0,this.Db())};\nTk.prototype.onViewportBoundsChanged=function(a,b,c,d){this.Sb||(Vi(this),this.M(),aj(this),this.Na(),Vk(this),this.Ic.scale=c,this.Ic.position.x=a.x,this.Ic.position.y=a.y,this.Ic.bounds.assign(a),this.Ic.hw=d,this.R(\"ViewportBoundsChanged\",this.Ic,a))};\nna.Object.defineProperties(Tk.prototype,{observed:{get:function(){return this.Ka},set:function(a){var b=this.Ka;a instanceof Tk&&B(\"Overview.observed Diagram may not be an Overview itself: \"+a);if(b!==a){null!==b&&(this.remove(this.box),b.Lm(\"ViewportBoundsChanged\",this.Xh),b.Lm(\"DocumentBoundsChanged\",this.Wh),b.Lm(\"InvalidateDraw\",this.Sc),b.Lm(\"AnimationFinished\",this.Od));this.Ka=a;null!==a&&(a.kk(\"ViewportBoundsChanged\",this.Xh),a.kk(\"DocumentBoundsChanged\",this.Wh),\na.kk(\"InvalidateDraw\",this.Sc),a.kk(\"AnimationFinished\",this.Od),this.add(this.box));this.Na();if(null===a){this.fm=null;var c=this.wa,d=this.Gb;c&&d&&(d.setTransform(1,0,0,1,0,0),d.clearRect(0,0,c.width,c.height))}else this.Sc(null),Vk(this),this.M();this.g(\"observed\",b,a)}}},box:{get:function(){return this.l},set:function(a){var b=this.l;b!==a&&(this.l=a,this.remove(b),this.add(this.l),Vk(this),this.g(\"box\",b,a))}},drawsTemporaryLayers:{\nget:function(){return this.T},set:function(a){this.T!==a&&(this.T=a,this.redraw())}},drawsGrid:{get:function(){return this.I},set:function(a){this.I!==a&&(this.I=a,this.redraw())}},updateDelay:{get:function(){return this.eb},set:function(a){0>a&&(a=0);this.eb!==a&&(this.eb=a)}}});Tk.className=\"Overview\";function Uk(){Ve.call(this);this.l=null}ma(Uk,Ve);\nUk.prototype.canStart=function(){if(!this.isEnabled)return!1;var a=this.diagram;if(null===a||!a.allowMove||!a.allowSelect)return!1;var b=a.observed;if(null===b)return!1;var c=a.lastInput;if(!c.left||a.currentTool!==this&&(!this.isBeyondDragSize()||c.isTouchEvent&&c.timestamp-a.firstInput.timestamp<this.delay))return!1;null===this.findDraggablePart()&&(c=b.viewportBounds,this.l=new J(c.width/2,c.height/2),a=a.firstInput.documentPoint,b.position=new J(a.x-this.l.x,a.y-this.l.y));return!0};\nUk.prototype.doActivate=function(){this.l=null;Ve.prototype.doActivate.call(this)};Uk.prototype.doUpdateCursor=function(){var a=this.diagram,b=a.box;null!==b&&b.cursor&&(a.currentCursor=b.cursor)};Uk.prototype.moveParts=function(){var a=this.diagram,b=a.observed;if(null!==b){var c=a.box;if(null!==c){if(null===this.l){var d=a.firstInput.documentPoint;c=c.location;this.l=new J(d.x-c.x,d.y-c.y)}a=a.lastInput.documentPoint;b.position=new J(a.x-this.l.x,a.y-this.l.y)}}};Uk.className=\"OverviewDraggingTool\";\nfunction Xk(){Xa(this);this.C=Fe;this.eb=this.I=this.u=!0;this.T=this.Ka=this.Sc=this.La=!1;this.Ki=this.l=null;this.Od=1.05;this.bv=NaN;this.yx=null;this.Bv=NaN;this.Av=ic;this.Cc=!0;this.rg=null;this.Tc=200}Xk.prototype.toString=function(){return\"CommandHandler\"};Xk.prototype.ee=function(a){this.C=a};\nXk.prototype.doKeyDown=function(){var a=this.diagram,b=a.lastInput,c=Va?b.meta:b.control,d=b.shift,e=b.alt,f=b.key;!c||\"C\"!==f&&\"Insert\"!==f?c&&\"X\"===f||d&&\"Del\"===f?this.canCutSelection()&&this.cutSelection():c&&\"V\"===f||d&&\"Insert\"===f?this.canPasteSelection()&&this.pasteSelection():c&&\"Y\"===f||e&&d&&\"Backspace\"===f?this.canRedo()&&this.redo():c&&\"Z\"===f||e&&\"Backspace\"===f?this.canUndo()&&this.undo():\"Del\"===f||\"Backspace\"===f?this.canDeleteSelection()&&this.deleteSelection():c&&\"A\"===f?this.canSelectAll()&&\nthis.selectAll():\"Esc\"===f?this.canStopCommand()&&this.stopCommand():\"Up\"===f?a.allowVerticalScroll&&(c?a.scroll(\"pixel\",\"up\"):a.scroll(\"line\",\"up\")):\"Down\"===f?a.allowVerticalScroll&&(c?a.scroll(\"pixel\",\"down\"):a.scroll(\"line\",\"down\")):\"Left\"===f?a.allowHorizontalScroll&&(c?a.scroll(\"pixel\",\"left\"):a.scroll(\"line\",\"left\")):\"Right\"===f?a.allowHorizontalScroll&&(c?a.scroll(\"pixel\",\"right\"):a.scroll(\"line\",\"right\")):\"PageUp\"===f?d&&a.allowHorizontalScroll?a.scroll(\"page\",\"left\"):a.allowVerticalScroll&&\na.scroll(\"page\",\"up\"):\"PageDown\"===f?d&&a.allowHorizontalScroll?a.scroll(\"page\",\"right\"):a.allowVerticalScroll&&a.scroll(\"page\",\"down\"):\"Home\"===f?c&&a.allowVerticalScroll?a.scroll(\"document\",\"up\"):!c&&a.allowHorizontalScroll&&a.scroll(\"document\",\"left\"):\"End\"===f?c&&a.allowVerticalScroll?a.scroll(\"document\",\"down\"):!c&&a.allowHorizontalScroll&&a.scroll(\"document\",\"right\"):\" \"===f?this.canScrollToPart()&&this.scrollToPart():\"Subtract\"===f?this.canDecreaseZoom()&&this.decreaseZoom():\"Add\"===f?this.canIncreaseZoom()&&\nthis.increaseZoom():c&&\"0\"===f?this.canResetZoom()&&this.resetZoom():d&&\"Z\"===f?this.canZoomToFit()&&this.zoomToFit():c&&!d&&\"G\"===f?this.canGroupSelection()&&this.groupSelection():c&&d&&\"G\"===f?this.canUngroupSelection()&&this.ungroupSelection():\"F2\"===f||b.event&&\"F2\"===b.event.key?this.canEditTextBlock()&&this.editTextBlock():\"ContextMenu\"===f||b.event&&\"ContextMenu\"===b.event.key?this.canShowContextMenu()&&this.showContextMenu():b.bubbles=!0:this.canCopySelection()&&this.copySelection()};\nXk.prototype.doKeyUp=function(){this.diagram.lastInput.bubbles=!0};Xk.prototype.stopCommand=function(){var a=this.diagram,b=a.currentTool;b instanceof Pa&&a.allowSelect&&a.clearSelection();null!==b&&b.doCancel()};Xk.prototype.canStopCommand=function(){return!0};\nXk.prototype.selectAll=function(){var a=this.diagram;a.M();try{a.currentCursor=\"wait\";a.R(\"ChangingSelection\",a.selection);for(var b=a.parts;b.next();)b.value.isSelected=!0;for(var c=a.nodes;c.next();)c.value.isSelected=!0;for(var d=a.links;d.next();)d.value.isSelected=!0}finally{a.R(\"ChangedSelection\",a.selection),a.currentCursor=\"\"}};Xk.prototype.canSelectAll=function(){return this.diagram.allowSelect};\nXk.prototype.deleteSelection=function(){var a=this.diagram;try{a.currentCursor=\"wait\";a.R(\"ChangingSelection\",a.selection);a.va(\"Delete\");a.R(\"SelectionDeleting\",a.selection);for(var b=new G,c=a.selection.iterator;c.next();)Yk(b,c.value,!0,this.deletesTree?Infinity:0,this.deletesConnectedLinks?null:!1,function(a){return a.canDelete()});a.gu(b,!0);a.R(\"SelectionDeleted\",b)}finally{a.Xa(\"Delete\"),a.R(\"ChangedSelection\",a.selection),a.currentCursor=\"\"}};\nXk.prototype.canDeleteSelection=function(){var a=this.diagram;return a.isReadOnly||a.isModelReadOnly||!a.allowDelete||0===a.selection.count?!1:!0};Xk.prototype.copySelection=function(){var a=this.diagram,b=new G;for(a=a.selection.iterator;a.next();)Yk(b,a.value,!0,this.copiesTree?Infinity:0,this.copiesConnectedLinks,function(a){return a.canCopy()});this.copyToClipboard(b)};Xk.prototype.canCopySelection=function(){var a=this.diagram;return a.allowCopy&&a.allowClipboard&&0!==a.selection.count?!0:!1};\nXk.prototype.cutSelection=function(){this.copySelection();this.deleteSelection()};Xk.prototype.canCutSelection=function(){var a=this.diagram;return!a.isReadOnly&&!a.isModelReadOnly&&a.allowCopy&&a.allowDelete&&a.allowClipboard&&0!==a.selection.count?!0:!1};\nXk.prototype.copyToClipboard=function(a){var b=this.diagram,c=null;if(null===a)Di=null,Ei=\"\";else{c=b.model;var d=!1,e=!1,f=null;try{c.Em()&&(d=c.sk,c.sk=this.copiesParentKey),c.Ck()&&(e=c.rk,c.rk=this.copiesGroupKey),f=b.tk(a,null,!0)}finally{c.Em()&&(c.sk=d),c.Ck()&&(c.rk=e),c=new E,c.addAll(f),Di=c,Ei=b.model.dataFormat}}b.R(\"ClipboardChanged\",c)};\nXk.prototype.pasteFromClipboard=function(){var a=new G,b=Di;if(null===b)return a;var c=this.diagram;if(Ei!==c.model.dataFormat)return a;var d=c.model,e=!1,f=!1,g=null;try{d.Em()&&(e=d.sk,d.sk=this.copiesParentKey),d.Ck()&&(f=d.rk,d.rk=this.copiesGroupKey),g=c.tk(b,c,!1)}finally{for(d.Em()&&(d.sk=e),d.Ck()&&(d.rk=f),b=g.iterator;b.next();)c=b.value,d=b.key,c.location.s()||(d.location.s()?c.location=d.location:!c.position.s()&&d.position.s()&&(c.position=d.position)),a.add(c)}return a};\nXk.prototype.pasteSelection=function(a){void 0===a&&(a=null);var b=this.diagram;try{b.currentCursor=\"wait\";b.R(\"ChangingSelection\",b.selection);b.va(\"Paste\");var c=this.pasteFromClipboard();0<c.count&&b.clearSelection(!0);for(var d=c.iterator;d.next();)d.value.isSelected=!0;if(null!==a){var e=b.computePartsBounds(b.selection);if(e.s()){var f=this.computeEffectiveCollection(b.selection,b.kl);tf(b,f,new J(a.x-e.centerX,a.y-e.centerY),b.kl,!1)}}b.R(\"ClipboardPasted\",c)}finally{b.Xa(\"Paste\"),b.R(\"ChangedSelection\",\nb.selection),b.currentCursor=\"\"}};Xk.prototype.canPasteSelection=function(){var a=this.diagram;return a.isReadOnly||a.isModelReadOnly||!a.allowInsert||!a.allowClipboard||null===Di||0===Di.count||Ei!==a.model.dataFormat?!1:!0};Xk.prototype.undo=function(){this.diagram.undoManager.undo()};Xk.prototype.canUndo=function(){var a=this.diagram;return a.isReadOnly||a.isModelReadOnly?!1:a.allowUndo&&a.undoManager.canUndo()};Xk.prototype.redo=function(){this.diagram.undoManager.redo()};\nXk.prototype.canRedo=function(){var a=this.diagram;return a.isReadOnly||a.isModelReadOnly?!1:a.allowUndo&&a.undoManager.canRedo()};Xk.prototype.decreaseZoom=function(a){void 0===a&&(a=1/this.zoomFactor);var b=this.diagram;b.autoScale===xh&&(a=b.scale*a,a<b.minScale||a>b.maxScale||(b.scale=a))};Xk.prototype.canDecreaseZoom=function(a){void 0===a&&(a=1/this.zoomFactor);var b=this.diagram;if(b.autoScale!==xh)return!1;a=b.scale*a;return a<b.minScale||a>b.maxScale?!1:b.allowZoom};\nXk.prototype.increaseZoom=function(a){void 0===a&&(a=this.zoomFactor);var b=this.diagram;b.autoScale===xh&&(a=b.scale*a,a<b.minScale||a>b.maxScale||(b.scale=a))};Xk.prototype.canIncreaseZoom=function(a){void 0===a&&(a=this.zoomFactor);var b=this.diagram;if(b.autoScale!==xh)return!1;a=b.scale*a;return a<b.minScale||a>b.maxScale?!1:b.allowZoom};Xk.prototype.resetZoom=function(a){void 0===a&&(a=this.defaultScale);var b=this.diagram;a<b.minScale||a>b.maxScale||(b.scale=a)};\nXk.prototype.canResetZoom=function(a){void 0===a&&(a=this.defaultScale);var b=this.diagram;return a<b.minScale||a>b.maxScale?!1:b.allowZoom};\nXk.prototype.zoomToFit=function(){var a=this.diagram,b=a.animationManager;b.Bc();a.redraw();var c=a.position,d=a.scale;rh(b,\"Zoom To Fit\");this.isZoomToFitRestoreEnabled&&d===this.Bv&&!isNaN(this.bv)&&a.documentBounds.w(this.Av)?(a.scale=this.bv,a.position=this.yx,this.Bv=NaN,this.Av=ic):(this.bv=d,this.yx=c.copy(),a.zoomToFit(),this.Bv=a.scale,this.Av=a.documentBounds.copy());th(b)};Xk.prototype.canZoomToFit=function(){return this.diagram.allowZoom};\nXk.prototype.scrollToPart=function(a){void 0===a&&(a=null);var b=this.diagram;b.Ta();if(null===a){try{null!==this.rg&&(this.rg.next()?a=this.rg.value:this.rg=null)}catch(k){this.rg=null}null===a&&(0<b.highlighteds.count?this.rg=b.highlighteds.iterator:0<b.selection.count&&(this.rg=b.selection.iterator),null!==this.rg&&this.rg.next()&&(a=this.rg.value))}if(null!==a){var c=b.animationManager;rh(c,\"Scroll To Part\");var d=this.scrollToPartPause;if(0<d){var e=Zk(this,a,[a]);if(1===e.length)b.va(),b.At(a.actualBounds),\nb.Xa(\"Scroll To Part\");else{var f=function(){b.va();for(var a=e.pop();0<e.length&&a instanceof W&&a.isTreeExpanded&&(!(a instanceof U)||a.isSubGraphExpanded);)a=e.pop();0<e.length?(a instanceof V&&b.Aw(a.actualBounds),a instanceof W&&!a.isTreeExpanded&&(a.isTreeExpanded=!0),a instanceof U&&!a.isSubGraphExpanded&&(a.isSubGraphExpanded=!0)):(a instanceof V&&b.At(a.actualBounds),b.Lm(\"LayoutCompleted\",g));b.Xa(\"Scroll To Part\")},g=function(){ta(f,(c.isEnabled?c.duration:0)+d)};b.kk(\"LayoutCompleted\",\ng);f()}}else{var h=b.position.copy();b.At(a.actualBounds);h.Qa(b.position)&&c.Bc()}}};\nfunction Zk(a,b,c){if(b.isVisible())return c;if(b instanceof Je)Zk(a,b.adornedPart,c);else if(b instanceof S){var d=b.fromNode;null!==d&&Zk(a,d,c);b=b.toNode;null!==b&&Zk(a,b,c)}else b instanceof W&&(d=b.labeledLink,null!==d&&Zk(a,d,c),d=b.Fg(),null!==d&&(d.isTreeExpanded||d.wasTreeExpanded||c.push(d),Zk(a,d,c))),b=b.containingGroup,null!==b&&(b.isSubGraphExpanded||b.wasSubGraphExpanded||c.push(b),Zk(a,b,c));return c}\nXk.prototype.canScrollToPart=function(a){void 0===a&&(a=null);if(null!==a&&!(a instanceof V))return!1;a=this.diagram;return 0===a.selection.count&&0===a.highlighteds.count?!1:a.allowHorizontalScroll&&a.allowVerticalScroll};\nXk.prototype.collapseTree=function(a){void 0===a&&(a=null);var b=this.diagram;try{b.va(\"Collapse Tree\");rh(b.animationManager,\"Collapse Tree\");var c=new E;if(null!==a&&a.isTreeExpanded)a.collapseTree(),c.add(a);else if(null===a)for(var d=b.selection.iterator;d.next();){var e=d.value;e instanceof W&&e.isTreeExpanded&&(e.collapseTree(),c.add(e))}b.R(\"TreeCollapsed\",c)}finally{b.Xa(\"Collapse Tree\")}};\nXk.prototype.canCollapseTree=function(a){void 0===a&&(a=null);var b=this.diagram;if(b.isReadOnly)return!1;if(null!==a){if(!(a instanceof W&&a.isTreeExpanded))return!1;if(0<a.Hq().count)return!0}else for(a=b.selection.iterator;a.next();)if(b=a.value,b instanceof W&&b.isTreeExpanded&&0<b.Hq().count)return!0;return!1};\nXk.prototype.expandTree=function(a){void 0===a&&(a=null);var b=this.diagram;try{b.va(\"Expand Tree\");rh(b.animationManager,\"Expand Tree\");var c=new E;if(null!==a&&!a.isTreeExpanded)a.expandTree(),c.add(a);else if(null===a)for(var d=b.selection.iterator;d.next();){var e=d.value;e instanceof W&&!e.isTreeExpanded&&(e.expandTree(),c.add(e))}b.R(\"TreeExpanded\",c)}finally{b.Xa(\"Expand Tree\")}};\nXk.prototype.canExpandTree=function(a){void 0===a&&(a=null);var b=this.diagram;if(b.isReadOnly)return!1;if(null!==a){if(!(a instanceof W)||a.isTreeExpanded)return!1;if(0<a.Hq().count)return!0}else for(a=b.selection.iterator;a.next();)if(b=a.value,b instanceof W&&!b.isTreeExpanded&&0<b.Hq().count)return!0;return!1};\nXk.prototype.groupSelection=function(){var a=this.diagram,b=a.model;if(b.Dk()){var c=this.archetypeGroupData;if(null!==c){var d=null;try{a.currentCursor=\"wait\";a.R(\"ChangingSelection\",a.selection);a.va(\"Group\");for(var e=new E,f=a.selection.iterator;f.next();){var g=f.value;g.Nc()&&g.canGroup()&&e.add(g)}for(var h=new E,k=e.iterator;k.next();){var l=k.value;f=!1;for(var m=e.iterator;m.next();)if(l.Kd(m.value)){f=!0;break}f||h.add(l)}if(0<h.count){var n=h.first().containingGroup;if(null!==n)for(;null!==\nn;){e=!1;for(var p=h.iterator;p.next();)if(!p.value.Kd(n)){e=!0;break}if(e)n=n.containingGroup;else break}if(c instanceof U)yg(c),d=c.copy(),null!==d&&a.add(d);else if(b.fw(c)){var r=b.copyNodeData(c);za(r)&&(b.uf(r),d=a.gj(r))}if(null!==d){null!==n&&this.isValidMember(n,d)&&(d.containingGroup=n);for(var q=h.iterator;q.next();){var u=q.value;this.isValidMember(d,u)&&(u.containingGroup=d)}a.clearSelection(!0);d.isSelected=!0}}a.R(\"SelectionGrouped\",d)}finally{a.Xa(\"Group\"),a.R(\"ChangedSelection\",a.selection),\na.currentCursor=\"\"}}}};Xk.prototype.canGroupSelection=function(){var a=this.diagram;if(a.isReadOnly||a.isModelReadOnly||!a.allowInsert||!a.allowGroup||!a.model.Dk()||null===this.archetypeGroupData)return!1;for(a=a.selection.iterator;a.next();){var b=a.value;if(b.Nc()&&b.canGroup())return!0}return!1};\nfunction $k(a){var b=Ea();for(a=a.iterator;a.next();){var c=a.value;c instanceof S||b.push(c)}a=new G;c=b.length;for(var d=0;d<c;d++){for(var e=b[d],f=!0,g=0;g<c;g++)if(e.Kd(b[g])){f=!1;break}f&&a.add(e)}Ia(b);return a}\nXk.prototype.isValidMember=function(a,b){if(null===b||a===b||b instanceof S)return!1;if(null!==a){if(a===b||a.Kd(b))return!1;var c=a.memberValidation;if(null!==c&&!c(a,b)||null===a.data&&null!==b.data||null!==a.data&&null===b.data)return!1}c=this.memberValidation;return null!==c?c(a,b):!0};\nXk.prototype.ungroupSelection=function(a){void 0===a&&(a=null);var b=this.diagram,c=b.model;if(c.Dk())try{b.currentCursor=\"wait\";b.R(\"ChangingSelection\",b.selection);b.va(\"Ungroup\");var d=new E;if(null!==a)d.add(a);else for(var e=b.selection.iterator;e.next();){var f=e.value;f instanceof U&&f.canUngroup()&&d.add(f)}var g=new E;if(0<d.count){b.clearSelection(!0);for(var h=d.iterator;h.next();){var k=h.value;k.expandSubGraph();var l=k.containingGroup,m=null!==l&&null!==l.data?c.ja(l.data):void 0;g.addAll(k.memberParts);\nfor(var n=g.iterator;n.next();){var p=n.value;p.isSelected=!0;if(!(p instanceof S)){var r=p.data;null!==r?c.dr(r,m):p.containingGroup=l}}b.remove(k)}}b.R(\"SelectionUngrouped\",d,g)}finally{b.Xa(\"Ungroup\"),b.R(\"ChangedSelection\",b.selection),b.currentCursor=\"\"}};\nXk.prototype.canUngroupSelection=function(a){void 0===a&&(a=null);var b=this.diagram;if(b.isReadOnly||b.isModelReadOnly||!b.allowDelete||!b.allowUngroup||!b.model.Dk())return!1;if(null!==a){if(!(a instanceof U))return!1;if(a.canUngroup())return!0}else for(a=b.selection.iterator;a.next();)if(b=a.value,b instanceof U&&b.canUngroup())return!0;return!1};\nXk.prototype.addTopLevelParts=function(a,b){var c=!0;for(a=$k(a).iterator;a.next();){var d=a.value;null!==d.containingGroup&&(!b||this.isValidMember(null,d)?d.containingGroup=null:c=!1)}return c};\nXk.prototype.collapseSubGraph=function(a){void 0===a&&(a=null);var b=this.diagram;try{b.va(\"Collapse SubGraph\");rh(b.animationManager,\"Collapse SubGraph\");var c=new E;if(null!==a&&a.isSubGraphExpanded)a.collapseSubGraph(),c.add(a);else if(null===a)for(var d=b.selection.iterator;d.next();){var e=d.value;e instanceof U&&e.isSubGraphExpanded&&(e.collapseSubGraph(),c.add(e))}b.R(\"SubGraphCollapsed\",c)}finally{b.Xa(\"Collapse SubGraph\")}};\nXk.prototype.canCollapseSubGraph=function(a){void 0===a&&(a=null);var b=this.diagram;if(b.isReadOnly)return!1;if(null!==a)return a instanceof U&&a.isSubGraphExpanded?!0:!1;for(a=b.selection.iterator;a.next();)if(b=a.value,b instanceof U&&b.isSubGraphExpanded)return!0;return!1};\nXk.prototype.expandSubGraph=function(a){void 0===a&&(a=null);var b=this.diagram;try{b.va(\"Expand SubGraph\");rh(b.animationManager,\"Expand SubGraph\");var c=new E;if(null!==a&&!a.isSubGraphExpanded)a.expandSubGraph(),c.add(a);else if(null===a)for(var d=b.selection.iterator;d.next();){var e=d.value;e instanceof U&&!e.isSubGraphExpanded&&(e.expandSubGraph(),c.add(e))}b.R(\"SubGraphExpanded\",c)}finally{b.Xa(\"Expand SubGraph\")}};\nXk.prototype.canExpandSubGraph=function(a){void 0===a&&(a=null);var b=this.diagram;if(b.isReadOnly)return!1;if(null!==a)return a instanceof U&&!a.isSubGraphExpanded?!0:!1;for(a=b.selection.iterator;a.next();)if(b=a.value,b instanceof U&&!b.isSubGraphExpanded)return!0;return!1};\nXk.prototype.editTextBlock=function(a){void 0===a&&(a=null);var b=this.diagram,c=b.toolManager.findTool(\"TextEditing\");if(null!==c){if(null===a){a=null;for(var d=b.selection.iterator;d.next();){var e=d.value;if(e.canEdit()){a=e;break}}if(null===a)return;a=a.ym(function(a){return a instanceof Wg&&a.editable})}null!==a&&(b.currentTool=null,c.textBlock=a,b.currentTool=c)}};\nXk.prototype.canEditTextBlock=function(a){void 0===a&&(a=null);var b=this.diagram;if(b.isReadOnly||b.isModelReadOnly||!b.allowTextEdit||null===b.toolManager.findTool(\"TextEditing\"))return!1;if(null!==a){if(!(a instanceof Wg))return!1;a=a.part;if(null!==a&&a.canEdit())return!0}else for(b=b.selection.iterator;b.next();)if(a=b.value,a.canEdit()&&(a=a.ym(function(a){return a instanceof Wg&&a.editable}),null!==a))return!0;return!1};\nXk.prototype.showContextMenu=function(a){var b=this.diagram,c=b.toolManager.findTool(\"ContextMenu\");if(null!==c&&(void 0===a&&(a=0<b.selection.count?b.selection.first():b),a=c.findObjectWithContextMenu(a),null!==a)){var d=b.lastInput,e=null;a instanceof Y?e=a.da(zc):b.viewportBounds.$(d.documentPoint)||(e=b.viewportBounds,e=new J(e.x+e.width/2,e.y+e.height/2));null!==e&&(d.viewPoint=b.gr(e),d.documentPoint=e,d.left=!1,d.right=!0,d.up=!0);b.currentTool=c;Sg(c,!1,a)}};\nXk.prototype.canShowContextMenu=function(a){var b=this.diagram,c=b.toolManager.findTool(\"ContextMenu\");if(null===c)return!1;void 0===a&&(a=0<b.selection.count?b.selection.first():b);return null===c.findObjectWithContextMenu(a)?!1:!0};\nXk.prototype.computeEffectiveCollection=function(a,b){var c=this.diagram,d=c.toolManager.findTool(\"Dragging\"),e=c.currentTool===d;void 0===b&&(b=e?d.dragOptions:c.kl);d=new H;if(null===a)return d;for(var f=a.iterator;f.next();)Pj(c,d,f.value,e,b);if(null!==c.draggedLink&&b.dragsLink)return d;for(f=a.iterator;f.next();)a=f.value,a instanceof S&&(b=a.fromNode,null===b||d.contains(b)?(b=a.toNode,null===b||d.contains(b)||d.remove(a)):d.remove(a));return d};\nna.Object.defineProperties(Xk.prototype,{diagram:{get:function(){return this.C}},copiesClipboardData:{get:function(){return this.u},set:function(a){this.u=a}},copiesConnectedLinks:{get:function(){return this.I},set:function(a){this.I=a}},deletesConnectedLinks:{get:function(){return this.eb},set:function(a){this.eb=a}},copiesTree:{get:function(){return this.La},\nset:function(a){this.La=a}},deletesTree:{get:function(){return this.Sc},set:function(a){this.Sc=a}},copiesParentKey:{get:function(){return this.Ka},set:function(a){this.Ka=a}},copiesGroupKey:{get:function(){return this.T},set:function(a){this.T=a}},archetypeGroupData:{get:function(){return this.l},set:function(a){this.l=a}},memberValidation:{get:function(){return this.Ki},\nset:function(a){this.Ki=a}},defaultScale:{get:function(){return this.diagram.defaultScale},set:function(a){this.diagram.defaultScale=a}},zoomFactor:{get:function(){return this.Od},set:function(a){1<a||B(\"zoomFactor must be larger than 1.0, not: \"+a);this.Od=a}},isZoomToFitRestoreEnabled:{get:function(){return this.Cc},set:function(a){this.Cc=a}},scrollToPartPause:{get:function(){return this.Tc},\nset:function(a){this.Tc=a}}});Xk.className=\"CommandHandler\";xi=function(){return new Xk};\nfunction Y(){Xa(this);this.F=4225027;this.hb=1;this.og=null;this.oa=\"\";this.ec=this.mb=null;this.la=(new J(NaN,NaN)).freeze();this.Xc=Ob;this.fg=Ib;this.eg=Nb;this.sb=new ld;this.Zh=new ld;this.cg=new ld;this.Aa=this.ql=1;this.Yb=0;this.De=al;this.jh=qc;this.qc=(new N(NaN,NaN,NaN,NaN)).freeze();this.xb=(new N(NaN,NaN,NaN,NaN)).freeze();this.rc=(new N(0,0,NaN,NaN)).freeze();this.O=this.xp=this.yp=null;this.$k=this.yb=Vc;this.Jp=0;this.Kp=1;this.Rg=0;this.zn=1;this.aq=null;this.Qp=-Infinity;this.am=\n0;this.bm=Bb;this.cm=ag;this.oi=\"\";this.fb=this.N=null;this.dl=-1;this.em=this.Za=this.ni=this.im=null;this.Os=zg;this.Mp=this.Mg=this.ak=null}var td,zg,Bg,al,bl,cl,dl,el,fl,gl;\nY.prototype.cloneProtected=function(a){a.F=this.F|6144;a.hb=this.hb;a.oa=this.oa;a.mb=this.mb;a.ec=this.ec;a.Mg=this.Mg;a.la.assign(this.la);a.Xc=this.Xc.H();a.fg=this.fg.H();a.eg=this.eg.H();a.cg=this.cg.copy();a.Aa=this.Aa;a.Yb=this.Yb;a.De=this.De;a.jh=this.jh.H();a.qc.assign(this.qc);a.xb.assign(this.xb);a.rc.assign(this.rc);a.xp=this.xp;null!==this.O&&(a.O=this.O.copy());a.yb=this.yb.H();a.$k=this.$k.H();a.Jp=this.Jp;a.Kp=this.Kp;a.Rg=this.Rg;a.zn=this.zn;a.aq=this.aq;a.Qp=this.Qp;a.am=this.am;\na.bm=this.bm.H();a.cm=this.cm;a.oi=this.oi;null!==this.N&&(a.N=this.N.copy());a.fb=this.fb;a.dl=this.dl;null!==this.ni&&(a.ni=Ba(this.ni));null!==this.Za&&(a.Za=this.Za.copy());a.em=this.em};Y.prototype.Tx=function(a){var b=this.ni;if(Aa(b))for(var c=0;c<b.length;c++){if(b[c]===a)return}else this.ni=b=[];b.push(a)};Y.prototype.yf=function(a){a.yp=null;a.ak=null;a.o()};\nY.prototype.clone=function(){var a=new this.constructor;this.cloneProtected(a);if(null!==this.ni)for(var b=0;b<this.ni.length;b++){var c=this.ni[b];a[c]=this[c]}return a};Y.prototype.copy=function(){return this.clone()};t=Y.prototype;t.jb=function(a){a.classType===S?0===a.name.indexOf(\"Orient\")?this.segmentOrientation=a:B(\"Unknown Link enum value for GraphObject.segmentOrientation property: \"+a):a.classType===Y&&(this.stretch=a)};t.toString=function(){return Ja(this.constructor)+\"#\"+kb(this)};\nfunction hl(a){null===a.N&&(a.N=new il)}t.Kc=function(){if(null===this.O){var a=new jl;a.bh=sc;a.Ch=sc;a.$g=10;a.Ah=10;a.ah=0;a.Bh=0;this.O=a}};\nt.Va=function(a,b,c,d,e,f,g){var h=this.part;if(null!==h&&(h.Sk(a,b,c,d,e,f,g),c===this&&a===xe&&kl(this)&&ll(this,h,b),f=this.diagram,null===this.Mg||null===f||!f.pj||f.undoManager.isUndoingRedoing||f.currentTool!==f.toolManager||f.animationManager.tn||(a=this.Mg.get(b),null!==a&&f.animationManager.isEnabled&&!f.animationManager.isTicking&&(null===this.Mp&&(this.Mp=new H),g=0===f.undoManager.transactionLevel,a.startCondition===hi?g=!0:a.startCondition===ji&&(g=!1),g?(f=new qh,ii(a,f),g=this.Mp.get(a),\nnull!==g&&g.stop(),this.Mp.add(a,f),f.xv=this,f.Ox=a,f.add(this,b,d,e),f.start()):(sh(f.animationManager,\"Trigger\"),f.animationManager.defaultAnimation.add(this,b,d,e)))),this instanceof X&&c===h&&0!==(h.F&16777216)&&null!==h.data))for(c=this.W.j,d=c.length,e=0;e<d;e++)h=c[e],h instanceof X&&Hj(h,function(a){null!==a.data&&0!==(a.F&16777216)&&a.Da(b)})};\nfunction ll(a,b,c){var d=a.ij();if(null!==d)for(var e=a.fb.iterator;e.next();){var f=e.value,g=null;if(null!==f.sourceName){g=ml(f,d,a);if(null===g)continue;f.jr(a,g,c,null)}else if(f.isToModel){var h=b.diagram;null===h||h.skipsModelSourceBindings||f.jr(a,h.model.modelData,c,d)}else{h=d.data;if(null===h)continue;var k=b.diagram;null===k||k.skipsModelSourceBindings||f.jr(a,h,c,d)}g===a&&(h=d.Gt(f.wj),null!==h&&f.Tw(h,g,c))}}t.Gt=function(a){return this.dl===a?this:null};\nt.g=function(a,b,c){this.Va(xe,a,this,b,c)};function nl(a,b,c,d,e){var f=a.qc,g=a.cg;g.reset();ol(a,g,b,c,d,e);a.cg=g;f.h(b,c,d,e);g.Tt()||g.Pw(f)}function pl(a,b,c,d){if(!1===a.pickable)return!1;d.multiply(a.transform);return c?a.Mc(b,d):a.Jh(b,d)}\nt.sy=function(a,b,c){if(!1===this.pickable)return!1;var d=this.naturalBounds;b=a.Ie(b);return c?xb(a.x,a.y,0,0,0,d.height)<=b||xb(a.x,a.y,0,d.height,d.width,d.height)<=b||xb(a.x,a.y,d.width,d.height,d.width,0)<=b||xb(a.x,a.y,d.width,0,0,0)<=b:a.qd(0,0)<=b&&a.qd(0,d.height)<=b&&a.qd(d.width,0)<=b&&a.qd(d.width,d.height)<=b};t.he=function(){return!0};\nt.$=function(a){var b=J.alloc();b.assign(a);this.transform.ta(b);var c=this.actualBounds;if(!c.s())return J.free(b),!1;var d=this.diagram;if(null!==d&&d.re){var e=d.Bm(\"extraTouchThreshold\"),f=d.Bm(\"extraTouchArea\"),g=f/2,h=this.naturalBounds;d=this.Af()*d.scale;var k=1/d;if(h.width*d<e&&h.height*d<e)return a=cc(c.x-g*k,c.y-g*k,c.width+f*k,c.height+f*k,b.x,b.y),J.free(b),a}e=!1;if(this instanceof Je||this instanceof Kf?cc(c.x-5,c.y-5,c.width+10,c.height+10,b.x,b.y):c.$(b))this.Za&&!this.Za.$(b)?e=\n!1:null!==this.ec&&c.$(b)?e=!0:null!==this.mb&&this.rc.$(a)?e=!0:e=this.Kh(a);J.free(b);return e};t.Kh=function(a){var b=this.naturalBounds;return cc(0,0,b.width,b.height,a.x,a.y)};t.Ge=function(a){if(0===this.angle)return this.actualBounds.Ge(a);var b=this.naturalBounds;b=N.allocAt(0,0,b.width,b.height);var c=this.transform,d=!1,e=J.allocAt(a.x,a.y);b.$(c.Jd(e))&&(e.h(a.x,a.bottom),b.$(c.Jd(e))&&(e.h(a.right,a.bottom),b.$(c.Jd(e))&&(e.h(a.right,a.y),b.$(c.Jd(e))&&(d=!0))));J.free(e);N.free(b);return d};\nt.Jh=function(a,b){if(void 0===b)return a.Ge(this.actualBounds);var c=this.naturalBounds,d=!1,e=J.allocAt(0,0);a.$(b.ta(e))&&(e.h(0,c.height),a.$(b.ta(e))&&(e.h(c.width,c.height),a.$(b.ta(e))&&(e.h(c.width,0),a.$(b.ta(e))&&(d=!0))));J.free(e);return d};\nt.Mc=function(a,b){if(void 0===b&&(b=this.transform,0===this.angle))return a.Mc(this.actualBounds);var c=this.naturalBounds,d=J.allocAt(0,0),e=J.allocAt(0,c.height),f=J.allocAt(c.width,c.height),g=J.allocAt(c.width,0),h=!1;if(a.$(b.ta(d))||a.$(b.ta(e))||a.$(b.ta(f))||a.$(b.ta(g)))h=!0;else{c=N.allocAt(0,0,c.width,c.height);var k=J.allocAt(a.x,a.y);c.$(b.Jd(k))?h=!0:(k.h(a.x,a.bottom),c.$(b.Jd(k))?h=!0:(k.h(a.right,a.bottom),c.$(b.Jd(k))?h=!0:(k.h(a.right,a.y),c.$(b.Jd(k))&&(h=!0))));J.free(k);N.free(c);\n!h&&(L.Qt(a,d,e)||L.Qt(a,e,f)||L.Qt(a,f,g)||L.Qt(a,g,d))&&(h=!0)}J.free(d);J.free(e);J.free(f);J.free(g);return h};t.da=function(a,b){void 0===b&&(b=new J);if(a instanceof O){var c=this.naturalBounds;b.h(a.x*c.width+a.offsetX,a.y*c.height+a.offsetY)}else b.set(a);this.Fd.ta(b);return b};\nt.mj=function(a){void 0===a&&(a=new N);var b=this.naturalBounds,c=this.Fd,d=J.allocAt(0,0).transform(c);a.h(d.x,d.y,0,0);d.h(b.width,0).transform(c);bc(a,d.x,d.y,0,0);d.h(b.width,b.height).transform(c);bc(a,d.x,d.y,0,0);d.h(0,b.height).transform(c);bc(a,d.x,d.y,0,0);J.free(d);return a};t.lj=function(){var a=this.Fd;1===a.m11&&0===a.m12?a=0:(a=180*Math.atan2(a.m12,a.m11)/Math.PI,0>a&&(a+=360));return a};\nt.Af=function(){if(0!==(this.F&4096)===!1)return this.ql;var a=this.Aa;return null!==this.panel?a*this.panel.Af():a};t.Mt=function(a,b){void 0===b&&(b=new J);b.assign(a);this.Fd.Jd(b);return b};t.Nt=function(a,b,c){return this.zk(a.x,a.y,b.x,b.y,c)};\nt.zk=function(a,b,c,d,e){var f=this.transform,g=1/(f.m11*f.m22-f.m12*f.m21),h=f.m22*g,k=-f.m12*g,l=-f.m21*g,m=f.m11*g,n=g*(f.m21*f.dy-f.m22*f.dx),p=g*(f.m12*f.dx-f.m11*f.dy);if(null!==this.areaBackground)return f=this.actualBounds,L.Cf(f.left,f.top,f.right,f.bottom,a,b,c,d,e);g=a*h+b*l+n;a=a*k+b*m+p;b=c*h+d*l+n;c=c*k+d*m+p;e.h(0,0);d=this.naturalBounds;c=L.Cf(0,0,d.width,d.height,g,a,b,c,e);e.transform(f);return c};\nY.prototype.measure=function(a,b,c,d){if(!1!==uj(this)){var e=this.jh,f=e.right+e.left;e=e.top+e.bottom;a=Math.max(a-f,0);b=Math.max(b-e,0);c=Math.max((c||0)-f,0);d=Math.max((d||0)-e,0);f=this.angle;e=this.desiredSize;var g=0;this instanceof Kf&&(g=this.strokeWidth);90===f||270===f?(a=isFinite(e.height)?e.height+g:a,b=isFinite(e.width)?e.width+g:b):(a=isFinite(e.width)?e.width+g:a,b=isFinite(e.height)?e.height+g:b);e=c||0;g=d||0;var h=this instanceof X;switch(ql(this,!0)){case zg:g=e=0;h&&(b=a=Infinity);\nbreak;case td:isFinite(a)&&a>c&&(e=a);isFinite(b)&&b>d&&(g=b);break;case bl:isFinite(a)&&a>c&&(e=a);g=0;h&&(b=Infinity);break;case cl:isFinite(b)&&b>d&&(g=b),e=0,h&&(a=Infinity)}h=this.maxSize;var k=this.minSize;e>h.width&&k.width<h.width&&(e=h.width);g>h.height&&k.height<h.height&&(g=h.height);c=Math.max(e/this.scale,k.width);d=Math.max(g/this.scale,k.height);h.width<c&&(c=Math.min(k.width,c));h.height<d&&(d=Math.min(k.height,d));a=Math.min(h.width,a);b=Math.min(h.height,b);a=Math.max(c,a);b=Math.max(d,\nb);if(90===f||270===f)f=a,a=b,b=f,f=c,c=d,d=f;this.qc.ea();this.Hm(a,b,c,d);this.qc.freeze();this.qc.s()||B(\"Non-real measuredBounds has been set. Object \"+this+\", measuredBounds: \"+this.qc.toString());pj(this,!1)}};Y.prototype.Hm=function(){};Y.prototype.Ff=function(){return!1};\nY.prototype.arrange=function(a,b,c,d,e){this.Fl();var f=N.alloc();f.assign(this.xb);this.xb.ea();!1===vj(this)?this.xb.h(a,b,c,d):this.Ih(a,b,c,d);this.xb.freeze();void 0===e?this.Za=null:this.Za=e;c=!1;if(void 0!==e)c=!0;else if(e=this.panel,null===e||e.type!==X.TableRow&&e.type!==X.TableColumn||(e=e.panel),null!==e&&(e=e.rc,d=this.measuredBounds,null!==this.areaBackground&&(d=this.xb),c=b+d.height,d=a+d.width,c=!(0<=a+.05&&d<=e.width+.05&&0<=b+.05&&c<=e.height+.05),this instanceof Wg&&(a=this.naturalBounds,\nthis.us>a.height||this.vb>a.width)))c=!0;this.F=c?this.F|256:this.F&-257;this.xb.s()||B(\"Non-real actualBounds has been set. Object \"+this+\", actualBounds: \"+this.xb.toString());this.Im(f,this.xb);rl(this,!1);N.free(f)};t=Y.prototype;t.Ih=function(){};\nfunction sl(a,b,c,d,e){a.xb.h(b,c,d,e);if(!a.desiredSize.s()){var f=a.qc;c=a.jh;b=c.right+c.left;var g=c.top+c.bottom;c=f.width+b;f=f.height+g;d+=b;e+=g;b=ql(a,!0);c===d&&f===e&&(b=zg);switch(b){case zg:if(c>d||f>e)pj(a,!0),a.measure(c>d?d:c,f>e?e:f,0,0);break;case td:pj(a,!0);a.measure(d,e,0,0);break;case bl:pj(a,!0);a.measure(d,f,0,0);break;case cl:pj(a,!0),a.measure(c,e,0,0)}}}\nt.Im=function(a,b){var c=this.part;null!==c&&null!==c.diagram&&(c.selectionObject!==this&&c.resizeObject!==this&&c.rotateObject!==this||tl(c,!0),this.M(),Vb(a,b)||(c.Oh(),this.mp(c)))};t.mp=function(a){null!==this.portId&&(tl(a,!0),a instanceof W&&ul(a,this))};\nt.mc=function(a,b){if(this.visible){var c=this instanceof X&&(this.type===X.TableRow||this.type===X.TableColumn),d=this.xb;if(c||0!==d.width&&0!==d.height&&!isNaN(d.x)&&!isNaN(d.y)){var e=this.opacity;if(0!==e){var f=1;1!==e&&(f=a.globalAlpha,a.globalAlpha=f*e);if(!this.ly(a,b))if(c)vl(this,a,b);else{this instanceof S&&this.Gk(!1);c=this.transform;var g=this.panel;0!==(this.F&4096)===!0&&wl(this);var h=this.part,k=!1,l=0;if(h&&b.Ke(\"drawShadows\")&&(k=h.isShadowed)){var m=h.shadowOffset;l=Math.max(m.y,\nm.x)*b.scale*b.Tb}if(!(m=b.yi||!this.Ff())){var n=this.naturalBounds;m=this.Zh;var p=m.m11,r=m.m21,q=m.dx,u=m.m12,w=m.m22,v=m.dy,y,z=y=0;m=y*p+z*r+q;var A=y*u+z*w+v;y=n.width+l;z=0;var C=y*p+z*r+q;y=y*u+z*w+v;z=Math.min(m,C);var F=Math.min(A,y);var Q=Math.max(m+0,C)-z;var K=Math.max(A+0,y)-F;m=z;A=F;y=n.width+l;z=n.height+l;C=y*p+z*r+q;y=y*u+z*w+v;z=Math.min(m,C);F=Math.min(A,y);Q=Math.max(m+Q,C)-z;K=Math.max(A+K,y)-F;m=z;A=F;y=0;z=n.height+l;C=y*p+z*r+q;y=y*u+z*w+v;z=Math.min(m,C);F=Math.min(A,y);\nQ=Math.max(m+Q,C)-z;K=Math.max(A+K,y)-F;m=z;A=F;l=b.viewportBounds;n=l.x;p=l.y;m=!(m>l.width+n||n>Q+m||A>l.height+p||p>K+A)}if(m){m=0!==(this.F&256);a.clipInsteadOfFill&&(m=!1);this instanceof Wg&&(a.font=this.font);if(m){A=g.he()?g.naturalBounds:g.actualBounds;null!==this.Za?(n=this.Za,Q=n.x,K=n.y,l=n.width,n=n.height):(Q=Math.max(d.x,A.x),K=Math.max(d.y,A.y),l=Math.min(d.right,A.right)-Q,n=Math.min(d.bottom,A.bottom)-K);if(Q>d.width+d.x||d.x>A.width+A.x){1!==e&&(a.globalAlpha=f);return}a.save();\na.beginPath();a.rect(Q,K,l,n);a.clip()}if(this.Ff()){if(!h.isVisible()){1!==e&&(a.globalAlpha=f);return}k&&(A=h.shadowOffset,a.Iw(A.x*b.scale*b.Tb,A.y*b.scale*b.Tb,h.shadowBlur),xl(a),a.shadowColor=h.shadowColor)}k&&!0===this.shadowVisible?xl(a):k&&!1===this.shadowVisible&&yl(a);h=this.naturalBounds;null!==this.ec&&(ni(this,a,this.ec,!0,!0,h,d),this.ec instanceof zl&&this.ec.type===Al?(a.beginPath(),a.rect(d.x,d.y,d.width,d.height),a.Je(this.ec)):a.fillRect(d.x,d.y,d.width,d.height));a.transform(c.m11,\nc.m12,c.m21,c.m22,c.dx,c.dy);k&&(null!==g&&0!==(g.F&512)||null!==g&&(g.type===X.Auto||g.type===X.Spot)&&g.tb()!==this)&&null===this.shadowVisible&&yl(a);null!==this.mb&&(l=this.naturalBounds,Q=A=0,K=l.width,l=l.height,n=0,this instanceof Kf&&(l=this.na.bounds,A=l.x,Q=l.y,K=l.width,l=l.height,n=this.strokeWidth),ni(this,a,this.mb,!0,!1,h,d),this.mb instanceof zl&&this.mb.type===Al?(a.beginPath(),a.rect(A-n/2,Q-n/2,K+n,l+n),a.Je(this.mb)):a.fillRect(A-n/2,Q-n/2,K+n,l+n));k&&(null!==this.mb||null!==\nthis.ec||null!==g&&0!==(g.F&512)||null!==g&&(g.type===X.Auto||g.type===X.Spot)&&g.tb()!==this)?(Bl(this,!0),null===this.shadowVisible&&yl(a)):Bl(this,!1);this.ej(a,b);k&&0!==(this.F&512)===!0&&xl(a);this.Ff()&&k&&yl(a);m?(a.restore(),this instanceof X?a.uc(!0):a.uc(!1)):c.Tt()||(b=1/(c.m11*c.m22-c.m12*c.m21),a.transform(c.m22*b,-c.m12*b,-c.m21*b,c.m11*b,b*(c.m21*c.dy-c.m22*c.dx),b*(c.m12*c.dx-c.m11*c.dy)))}}1!==e&&(a.globalAlpha=f)}}}};t.ly=function(){return!1};\nfunction vl(a,b,c){var d=a.xb,e=a.rc;null!==a.ec&&(ni(a,b,a.ec,!0,!0,e,d),a.ec instanceof zl&&a.ec.type===Al?(b.beginPath(),b.rect(d.x,d.y,d.width,d.height),b.Je(a.ec)):b.fillRect(d.x,d.y,d.width,d.height));null!==a.mb&&(ni(a,b,a.mb,!0,!1,e,d),a.mb instanceof zl&&a.mb.type===Al?(b.beginPath(),b.rect(d.x,d.y,d.width,d.height),b.Je(a.mb)):b.fillRect(d.x,d.y,d.width,d.height));a.ej(b,c)}t.ej=function(){};\nfunction ni(a,b,c,d,e,f,g){if(null!==c){var h=1,k=1;if(\"string\"===typeof c)d?b.fillStyle=c:b.strokeStyle=c;else if(c.type===Cl)d?b.fillStyle=c.color:b.strokeStyle=c.color;else{var l=0;a instanceof Kf&&(l=a.strokeWidth);h=f.width;k=f.height;e?(h=g.width,k=g.height):d||(h+=l,k+=l);if((f=b instanceof Dl)&&c.ke&&(c.type===El||c.gl===h&&c.Au===k))var m=c.ke;else{var n=0,p=0,r=0,q=0,u=0,w=0;w=u=0;e?(u=g.x,w=g.y):d||(u-=l/2,w-=l/2);n=c.start.x*h+c.start.offsetX;p=c.start.y*k+c.start.offsetY;r=c.end.x*h+\nc.end.offsetX;q=c.end.y*k+c.end.offsetY;n+=u;r+=u;p+=w;q+=w;if(c.type===Fl)m=b.createLinearGradient(n,p,r,q);else if(c.type===Al)w=isNaN(c.endRadius)?Math.max(h,k)/2:c.endRadius,isNaN(c.startRadius)?(u=0,w=Math.max(h,k)/2):u=c.startRadius,m=b.createRadialGradient(n,p,u,r,q,w);else if(c.type===El)try{m=b.createPattern(c.pattern,\"repeat\")}catch(y){m=null}if(c.type!==El&&(e=c.colorStops,null!==e))for(e=e.iterator;e.next();)m.addColorStop(e.key,e.value);if(f&&(c.ke=m,null!==m&&(c.gl=h,c.Au=k),null===\nm&&c.type===El&&-1!==c.gl)){c.gl=-1;var v=a.diagram;null!==v&&-1===c.gl&&ta(function(){v.redraw()},600)}}d?b.fillStyle=m:b.strokeStyle=m}}}t.Gg=function(a){if(a instanceof X)a:{if(this!==a&&null!==a)for(var b=this.panel;null!==b;){if(b===a){a=!0;break a}b=b.panel}a=!1}else a=!1;return a};t.Gf=function(){if(!this.visible)return!1;var a=this.panel;return null!==a?a.Gf():!0};t.Hg=function(){for(var a=this instanceof X?this:this.panel;null!==a&&a.isEnabled;)a=a.panel;return null===a};\nfunction wl(a){if(0!==(a.F&2048)===!0){var b=a.sb;b.reset();if(!a.xb.s()||!a.qc.s()){Gl(a,!1);return}b.translate(a.xb.x-a.qc.x,a.xb.y-a.qc.y);if(1!==a.scale||0!==a.angle){var c=a.naturalBounds;ol(a,b,c.x,c.y,c.width,c.height)}Gl(a,!1);Hl(a,!0)}0!==(a.F&4096)===!0&&(b=a.panel,null===b?(a.Zh.set(a.sb),a.ql=a.scale,Hl(a,!1)):null!==b.Fd&&(c=a.Zh,c.reset(),b.he()?c.multiply(b.Zh):null!==b.panel&&c.multiply(b.panel.Zh),c.multiply(a.sb),a.ql=a.scale*b.ql,Hl(a,!1)))}\nfunction ol(a,b,c,d,e,f){1!==a.scale&&b.scale(a.scale);if(0!==a.Yb){var g=zc;a.Ff()&&a.locationSpot.kb()&&(g=a.locationSpot);var h=J.alloc();if(a instanceof V&&a.locationObject!==a)for(c=a.locationObject,d=c.naturalBounds,h.Uk(d.x,d.y,d.width,d.height,g),c.cg.ta(h),h.offset(-c.measuredBounds.x,-c.measuredBounds.y),g=c.panel;null!==g&&g!==a;)g.cg.ta(h),h.offset(-g.measuredBounds.x,-g.measuredBounds.y),g=g.panel;else h.Uk(c,d,e,f,g);b.rotate(a.Yb,h.x,h.y);J.free(h)}}\nt.o=function(a){if(!uj(this)){void 0===a&&(a=!1);pj(this,!0);rl(this,!0);var b=this.panel;null===b||a||b.o()}};t.Bk=function(){uj(this)||(pj(this,!0),rl(this,!0))};function Il(a){if(!vj(a)){var b=a.panel;null!==b?b.o():a.Ff()&&(b=a.diagram,null!==b&&(b.wd.add(a),a instanceof W&&a.sd(),b.Db()));rl(a,!0)}}t.Fl=function(){0!==(this.F&2048)===!1&&(Gl(this,!0),Hl(this,!0))};t.dw=function(){Hl(this,!0)};t.M=function(){var a=this.part;null!==a&&a.M()};\nfunction ql(a,b){var c=a.stretch,d=a.panel;if(null!==d&&d.type===X.Table)return Jl(a,d.getRowDefinition(a.row),d.getColumnDefinition(a.column),b);if(null!==d&&d.type===X.Auto&&d.tb()===a)return Kl(a,td,b);if(c===al){if(null!==d){if(d.type===X.Spot&&d.tb()===a)return Kl(a,td,b);c=d.defaultStretch;return c===al?Kl(a,zg,b):Kl(a,c,b)}return Kl(a,zg,b)}return Kl(a,c,b)}\nfunction Jl(a,b,c,d){var e=a.stretch;if(e!==al)return Kl(a,e,d);var f=e=null;switch(b.stretch){case cl:f=!0;break;case td:f=!0}switch(c.stretch){case bl:e=!0;break;case td:e=!0}b=a.panel.defaultStretch;null===e&&(e=b===bl||b===td);null===f&&(f=b===cl||b===td);return!0===e&&!0===f?Kl(a,td,d):!0===e?Kl(a,bl,d):!0===f?Kl(a,cl,d):Kl(a,zg,d)}\nfunction Kl(a,b,c){if(c)return b;if(b===zg)return zg;c=a.desiredSize;if(c.s())return zg;a=a.angle;if(!isNaN(c.width))if(90!==a&&270!==a){if(b===bl)return zg;if(b===td)return cl}else{if(b===cl)return zg;if(b===td)return bl}if(!isNaN(c.height))if(90!==a&&270!==a){if(b===cl)return zg;if(b===td)return bl}else{if(b===bl)return zg;if(b===td)return cl}return b}function Bl(a,b){a.F=b?a.F|512:a.F&-513}function kl(a){return 0!==(a.F&1024)}function Ll(a,b){a.F=b?a.F|1024:a.F&-1025}\nfunction Gl(a,b){a.F=b?a.F|2048:a.F&-2049}function Hl(a,b){a.F=b?a.F|4096:a.F&-4097}function uj(a){return 0!==(a.F&8192)}function pj(a,b){a.F=b?a.F|8192:a.F&-8193}function vj(a){return 0!==(a.F&16384)}function rl(a,b){a.F=b?a.F|16384:a.F&-16385}t.sj=function(a){this.og=a};t.lu=function(){};t.Ew=function(a){this.la.assign(a);Il(this);return!0};t.er=function(a,b){if(this.la.x!==a||this.la.y!==b)this.la.h(a,b),this.Fl()};\nfunction Ml(a){var b=a.part;if(b instanceof W&&(null!==a.portId||a===b.port)){var c=b.diagram;null===c||c.undoManager.isUndoingRedoing||ul(b,a)}}function Nl(a){var b=a.diagram;null===b||b.undoManager.isUndoingRedoing||(a instanceof X?a instanceof W?a.sd():a.an(a,function(a){Ml(a)}):Ml(a))}t.bind=function(a){a.pd=this;var b=this.ij();null!==b&&Ol(b)&&B(\"Cannot add a Binding to a template that has already been copied: \"+a);null===this.fb&&(this.fb=new E);this.fb.add(a)};\nt.ij=function(){for(var a=this instanceof X?this:this.panel;null!==a;){if(null!==a.li)return a;a=a.panel}return null};t.Fw=function(a){Bj(this,a)};t.Qw=function(a){a.pd=this;null===this.Mg&&(this.Mg=new H);this.Mg.add(a.propertyName,a)};\nfunction Pl(a,b){for(var c=1;c<arguments.length;++c);c=arguments;var d=null,e=null;if(\"function\"===typeof a)e=a;else if(\"string\"===typeof a){var f=Ql.G(a);\"function\"===typeof f?(c=Ba(arguments),d=f(c),za(d)||B('GraphObject.make invoked object builder \"'+a+'\", but it did not return an Object')):e=x.go[a]}null===d&&(void 0!==e&&null!==e&&e.constructor||B(\"GraphObject.make requires a class function or GoJS class name or name of an object builder, not: \"+a),d=new e);e=1;if(d instanceof R&&1<c.length){f=\nd;var g=c[1];if(\"string\"===typeof g||g instanceof HTMLDivElement)Ci(f,g),e++}for(;e<c.length;e++)f=c[e],void 0===f?B(\"Undefined value at argument \"+e+\" for object being constructed by GraphObject.make: \"+d):Rl(d,f);return d}\nfunction Rl(a,b){if(\"string\"===typeof b)if(a instanceof Wg)a.text=b;else if(a instanceof Kf)a.figure=b;else if(a instanceof dk)a.source=b;else if(a instanceof X)b=Sl.G(b),null!==b&&(a.type=b);else if(a instanceof zl){var c=Ya(zl,b);null!==c?a.type=c:B(\"Unknown Brush type as an argument to GraphObject.make: \"+b)}else a instanceof rd?(b=Ya(rd,b),null!==b&&(a.type=b)):a instanceof ke&&(b=Ya(ke,b),null!==b&&(a.type=b));else if(b instanceof Y)a instanceof X||B(\"A GraphObject can only be added to a Panel, not to: \"+\na),a.add(b);else if(b instanceof Vj){var d;b.isRow&&\"function\"===typeof a.getRowDefinition?d=a.getRowDefinition(b.index):b.isRow||\"function\"!==typeof a.getColumnDefinition||(d=a.getColumnDefinition(b.index));d instanceof Vj?d.gy(b):B(\"A RowColumnDefinition can only be added to an object that implements getRowDefinition/getColumnDefinition, not to: \"+a)}else if(b instanceof D)\"function\"===typeof a.jb&&a.jb(b);else if(b instanceof Tl)a.type=b;else if(b instanceof Hi)a instanceof Y?a.bind(b):a instanceof\nVj?a.bind(b):B(\"A Binding can only be applied to a GraphObject or RowColumnDefinition, not to: \"+a);else if(b instanceof fi)a instanceof Y?a.Qw(b):B(\"An AnimationTrigger can only be applied to a GraphObject, not to: \"+a);else if(b instanceof je)a instanceof rd?a.figures.add(b):B(\"A PathFigure can only be added to a Geometry, not to: \"+a);else if(b instanceof ke)a instanceof je?a.segments.add(b):B(\"A PathSegment can only be added to a PathFigure, not to: \"+a);else if(b instanceof Ai)a instanceof R?\na.layout=b:a instanceof U?a.layout=b:B(\"A Layout can only be assigned to a Diagram or a Group, not to: \"+a);else if(Array.isArray(b))for(c=0;c<b.length;c++)Rl(a,b[c]);else if(\"object\"===typeof b&&null!==b)if(a instanceof zl){c=new $a;for(var e in b)d=parseFloat(e),isNaN(d)?c[e]=b[e]:a.addColorStop(d,b[e]);Bj(a,c)}else if(a instanceof Vj){void 0!==b.row?(e=b.row,(void 0===e||null===e||Infinity===e||isNaN(e)||0>e)&&B(\"Must specify non-negative integer row for RowColumnDefinition \"+b+\", not: \"+e),a.isRow=\n!0,a.index=e):void 0!==b.column&&(e=b.column,(void 0===e||null===e||Infinity===e||isNaN(e)||0>e)&&B(\"Must specify non-negative integer column for RowColumnDefinition \"+b+\", not: \"+e),a.isRow=!1,a.index=e);e=new $a;for(c in b)\"row\"!==c&&\"column\"!==c&&(e[c]=b[c]);Bj(a,e)}else Bj(a,b);else B('Unknown initializer \"'+b+'\" for object being constructed by GraphObject.make: '+a)}function Ul(a,b){Ql.add(a,b)}\nfunction Vl(a,b,c){void 0===c&&(c=null);var d=a[1];if(\"function\"===typeof c?c(d):\"string\"===typeof d)return a.splice(1,1),d;if(void 0===b)throw Error(\"no \"+(\"function\"===typeof c?\"satisfactory\":\"string\")+\" argument for GraphObject builder \"+a[0]);return b}\nna.Object.defineProperties(Y.prototype,{shadowVisible:{get:function(){return this.em},set:function(a){var b=this.em;b!==a&&(this.em=a,this.M(),this.g(\"shadowVisible\",b,a))}},enabledChanged:{get:function(){return null!==this.N?this.N.Wn:null},set:function(a){hl(this);var b=this.N.Wn;b!==a&&(this.N.Wn=a,this.g(\"enabledChanged\",b,a))}},segmentOrientation:{get:function(){return this.cm},set:function(a){var b=this.cm;\nb!==a&&(this.cm=a,this.o(),this.g(\"segmentOrientation\",b,a),a===ag&&(this.angle=0))}},segmentIndex:{get:function(){return this.Qp},set:function(a){a=Math.round(a);var b=this.Qp;b!==a&&(this.Qp=a,this.o(),this.g(\"segmentIndex\",b,a))}},segmentFraction:{get:function(){return this.am},set:function(a){isNaN(a)?a=0:0>a?a=0:1<a&&(a=1);var b=this.am;b!==a&&(this.am=a,this.o(),this.g(\"segmentFraction\",b,a))}},segmentOffset:{\nget:function(){return this.bm},set:function(a){var b=this.bm;b.w(a)||(this.bm=a=a.H(),this.o(),this.g(\"segmentOffset\",b,a))}},stretch:{get:function(){return this.De},set:function(a){var b=this.De;b!==a&&(this.De=a,this.o(),this.g(\"stretch\",b,a))}},name:{get:function(){return this.oa},set:function(a){var b=this.oa;b!==a&&(this.oa=a,null!==this.part&&(this.part.Xj=null),this.g(\"name\",b,a))}},opacity:{get:function(){return this.hb},\nset:function(a){var b=this.hb;b!==a&&((0>a||1<a)&&wa(a,\"0 <= value <= 1\",Y,\"opacity\"),this.hb=a,this.g(\"opacity\",b,a),a=this.diagram,b=this.part,null!==a&&null!==b&&a.M(Fj(b,b.actualBounds)))}},visible:{get:function(){return 0!==(this.F&1)},set:function(a){var b=0!==(this.F&1);b!==a&&(this.F^=1,this.g(\"visible\",b,a),b=this.panel,null!==b?b.o():this.Ff()&&this.Ob(a),this.M(),Nl(this))}},pickable:{get:function(){return 0!==(this.F&2)},set:function(a){var b=\n0!==(this.F&2);b!==a&&(this.F^=2,this.g(\"pickable\",b,a))}},fromLinkableDuplicates:{get:function(){return 0!==(this.F&4)},set:function(a){var b=0!==(this.F&4);b!==a&&(this.F^=4,this.g(\"fromLinkableDuplicates\",b,a))}},fromLinkableSelfNode:{get:function(){return 0!==(this.F&8)},set:function(a){var b=0!==(this.F&8);b!==a&&(this.F^=8,this.g(\"fromLinkableSelfNode\",b,a))}},toLinkableDuplicates:{get:function(){return 0!==\n(this.F&16)},set:function(a){var b=0!==(this.F&16);b!==a&&(this.F^=16,this.g(\"toLinkableDuplicates\",b,a))}},toLinkableSelfNode:{get:function(){return 0!==(this.F&32)},set:function(a){var b=0!==(this.F&32);b!==a&&(this.F^=32,this.g(\"toLinkableSelfNode\",b,a))}},isPanelMain:{get:function(){return 0!==(this.F&64)},set:function(a){var b=0!==(this.F&64);b!==a&&(this.F^=64,this.o(),this.g(\"isPanelMain\",b,a))}},isActionable:{\nget:function(){return 0!==(this.F&128)},set:function(a){var b=0!==(this.F&128);b!==a&&(this.F^=128,this.g(\"isActionable\",b,a))}},areaBackground:{get:function(){return this.ec},set:function(a){var b=this.ec;b!==a&&(null!==a&&Wl(a,\"GraphObject.areaBackground\"),a instanceof zl&&a.freeze(),this.ec=a,this.M(),this.g(\"areaBackground\",b,a))}},background:{get:function(){return this.mb},set:function(a){var b=this.mb;b!==a&&(null!==a&&Wl(a,\"GraphObject.background\"),\na instanceof zl&&a.freeze(),this.mb=a,this.M(),this.g(\"background\",b,a))}},part:{get:function(){if(this.Ff())return this;if(null!==this.ak)return this.ak;var a;for(a=this.panel;a;){if(a instanceof V)return this.ak=a;a=a.panel}return null}},svg:{get:function(){return this.gq},set:function(a){this.gq=a}},panel:{get:function(){return this.og}},layer:{get:function(){var a=this.part;\nreturn null!==a?a.layer:null}},diagram:{get:function(){var a=this.part;return null!==a?a.diagram:null}},position:{get:function(){return this.la},set:function(a){var b=a.x,c=a.y,d=this.la,e=d.x,f=d.y;(e===b||isNaN(e)&&isNaN(b))&&(f===c||isNaN(f)&&isNaN(c))?this.lu():(a=a.copy(),this.Ew(a,d)&&this.g(\"position\",d.copy(),a.copy()))}},actualBounds:{get:function(){return this.xb}},scale:{\nget:function(){return this.Aa},set:function(a){var b=this.Aa;b!==a&&(0>=a&&B(\"GraphObject.scale for \"+this+\" must be greater than zero, not: \"+a),this.Aa=a,this.o(),this.g(\"scale\",b,a))}},angle:{get:function(){return this.Yb},set:function(a){var b=this.Yb;b!==a&&(a%=360,0>a&&(a+=360),b!==a&&(this.Yb=a,Nl(this),this.o(),this.g(\"angle\",b,a)))}},desiredSize:{get:function(){return this.Xc},set:function(a){var b=a.width,c=a.height,d=this.Xc,e=\nd.width,f=d.height;(e===b||isNaN(e)&&isNaN(b))&&(f===c||isNaN(f)&&isNaN(c))||(this.Xc=a=a.H(),this.o(),this instanceof Kf&&this.dc(),this.g(\"desiredSize\",d,a),kl(this)&&(a=this.part,null!==a&&(ll(this,a,\"width\"),ll(this,a,\"height\"))))}},width:{get:function(){return this.Xc.width},set:function(a){var b=this.Xc.width;b===a||isNaN(b)&&isNaN(a)||(b=this.Xc,this.Xc=a=(new M(a,this.Xc.height)).freeze(),this.o(),this instanceof Kf&&this.dc(),this.g(\"desiredSize\",b,a),kl(this)&&\n(a=this.part,null!==a&&ll(this,a,\"width\")))}},height:{get:function(){return this.Xc.height},set:function(a){var b=this.Xc.height;b===a||isNaN(b)&&isNaN(a)||(b=this.Xc,this.Xc=a=(new M(this.Xc.width,a)).freeze(),this.o(),this instanceof Kf&&this.dc(),this.g(\"desiredSize\",b,a),kl(this)&&(a=this.part,null!==a&&ll(this,a,\"height\")))}},minSize:{get:function(){return this.fg},set:function(a){var b=this.fg;b.w(a)||(a=a.copy(),isNaN(a.width)&&(a.width=\n0),isNaN(a.height)&&(a.height=0),a.freeze(),this.fg=a,this.o(),this.g(\"minSize\",b,a))}},maxSize:{get:function(){return this.eg},set:function(a){var b=this.eg;b.w(a)||(a=a.copy(),isNaN(a.width)&&(a.width=Infinity),isNaN(a.height)&&(a.height=Infinity),a.freeze(),this.eg=a,this.o(),this.g(\"maxSize\",b,a))}},measuredBounds:{get:function(){return this.qc}},naturalBounds:{get:function(){return this.rc}},margin:{\nget:function(){return this.jh},set:function(a){\"number\"===typeof a&&(a=new kc(a));var b=this.jh;b.w(a)||(this.jh=a=a.H(),this.o(),this.g(\"margin\",b,a))}},transform:{get:function(){0!==(this.F&2048)===!0&&wl(this);return this.sb}},Fd:{get:function(){0!==(this.F&4096)===!0&&wl(this);return this.Zh}},alignment:{get:function(){return this.yb},set:function(a){var b=this.yb;b.w(a)||(a.nc()&&!a.Mb()&&\nB(\"GraphObject.alignment for \"+this+\" must be a real Spot or Spot.Default, not: \"+a),this.yb=a=a.H(),Il(this),this.g(\"alignment\",b,a))}},column:{get:function(){return this.Rg},set:function(a){a=Math.round(a);var b=this.Rg;b!==a&&(0>a&&wa(a,\">= 0\",Y,\"column\"),this.Rg=a,this.o(),this.g(\"column\",b,a))}},columnSpan:{get:function(){return this.zn},set:function(a){a=Math.round(a);var b=this.zn;b!==a&&(1>a&&wa(a,\">= 1\",Y,\"columnSpan\"),this.zn=a,\nthis.o(),this.g(\"columnSpan\",b,a))}},row:{get:function(){return this.Jp},set:function(a){a=Math.round(a);var b=this.Jp;b!==a&&(0>a&&wa(a,\">= 0\",Y,\"row\"),this.Jp=a,this.o(),this.g(\"row\",b,a))}},rowSpan:{get:function(){return this.Kp},set:function(a){a=Math.round(a);var b=this.Kp;b!==a&&(1>a&&wa(a,\">= 1\",Y,\"rowSpan\"),this.Kp=a,this.o(),this.g(\"rowSpan\",b,a))}},spanAllocation:{get:function(){return this.aq},set:function(a){var b=\nthis.aq;b!==a&&(this.aq=a,this.o(),this.g(\"spanAllocation\",b,a))}},alignmentFocus:{get:function(){return this.$k},set:function(a){var b=this.$k;b.w(a)||(this.$k=a=a.H(),this.o(),this.g(\"alignmentFocus\",b,a))}},portId:{get:function(){return this.xp},set:function(a){var b=this.xp;if(b!==a){var c=this.part;null===c||c instanceof W||(B(\"Cannot set portID on a Link: \"+a),c=null);null!==b&&null!==c&&Xl(c,this);this.xp=a;null!==a&&null!==c&&(c.Nh=\n!0,Yl(c,this));this.g(\"portId\",b,a)}}},toSpot:{get:function(){return null!==this.O?this.O.Ch:sc},set:function(a){this.Kc();var b=this.O.Ch;b.w(a)||(a=a.H(),this.O.Ch=a,this.g(\"toSpot\",b,a),Ml(this))}},toEndSegmentLength:{get:function(){return null!==this.O?this.O.Ah:10},set:function(a){this.Kc();var b=this.O.Ah;b!==a&&(0>a&&wa(a,\">= 0\",Y,\"toEndSegmentLength\"),this.O.Ah=a,this.g(\"toEndSegmentLength\",b,a),Ml(this))}},toShortLength:{\nget:function(){return null!==this.O?this.O.Bh:0},set:function(a){this.Kc();var b=this.O.Bh;b!==a&&(this.O.Bh=a,this.g(\"toShortLength\",b,a),Ml(this))}},toLinkable:{get:function(){return null!==this.O?this.O.kq:null},set:function(a){this.Kc();var b=this.O.kq;b!==a&&(this.O.kq=a,this.g(\"toLinkable\",b,a))}},toMaxLinks:{get:function(){return null!==this.O?this.O.lq:Infinity},set:function(a){this.Kc();var b=this.O.lq;b!==a&&(0>a&&\nwa(a,\">= 0\",Y,\"toMaxLinks\"),this.O.lq=a,this.g(\"toMaxLinks\",b,a))}},fromSpot:{get:function(){return null!==this.O?this.O.bh:sc},set:function(a){this.Kc();var b=this.O.bh;b.w(a)||(a=a.H(),this.O.bh=a,this.g(\"fromSpot\",b,a),Ml(this))}},fromEndSegmentLength:{get:function(){return null!==this.O?this.O.$g:10},set:function(a){this.Kc();var b=this.O.$g;b!==a&&(0>a&&wa(a,\">= 0\",Y,\"fromEndSegmentLength\"),this.O.$g=a,this.g(\"fromEndSegmentLength\",\nb,a),Ml(this))}},fromShortLength:{get:function(){return null!==this.O?this.O.ah:0},set:function(a){this.Kc();var b=this.O.ah;b!==a&&(this.O.ah=a,this.g(\"fromShortLength\",b,a),Ml(this))}},fromLinkable:{get:function(){return null!==this.O?this.O.co:null},set:function(a){this.Kc();var b=this.O.co;b!==a&&(this.O.co=a,this.g(\"fromLinkable\",b,a))}},fromMaxLinks:{get:function(){return null!==this.O?this.O.eo:Infinity},\nset:function(a){this.Kc();var b=this.O.eo;b!==a&&(0>a&&wa(a,\">= 0\",Y,\"fromMaxLinks\"),this.O.eo=a,this.g(\"fromMaxLinks\",b,a))}},cursor:{get:function(){return this.oi},set:function(a){var b=this.oi;b!==a&&(this.oi=a,this.g(\"cursor\",b,a))}},click:{get:function(){return null!==this.N?this.N.Pf:null},set:function(a){hl(this);var b=this.N.Pf;b!==a&&(this.N.Pf=a,this.g(\"click\",b,a))}},doubleClick:{get:function(){return null!==\nthis.N?this.N.Uf:null},set:function(a){hl(this);var b=this.N.Uf;b!==a&&(this.N.Uf=a,this.g(\"doubleClick\",b,a))}},contextClick:{get:function(){return null!==this.N?this.N.Qf:null},set:function(a){hl(this);var b=this.N.Qf;b!==a&&(this.N.Qf=a,this.g(\"contextClick\",b,a))}},mouseEnter:{get:function(){return null!==this.N?this.N.hg:null},set:function(a){hl(this);var b=this.N.hg;b!==a&&(this.N.hg=a,this.g(\"mouseEnter\",b,a))}},mouseLeave:{\nget:function(){return null!==this.N?this.N.kg:null},set:function(a){hl(this);var b=this.N.kg;b!==a&&(this.N.kg=a,this.g(\"mouseLeave\",b,a))}},mouseOver:{get:function(){return null!==this.N?this.N.lg:null},set:function(a){hl(this);var b=this.N.lg;b!==a&&(this.N.lg=a,this.g(\"mouseOver\",b,a))}},mouseHover:{get:function(){return null!==this.N?this.N.jg:null},set:function(a){hl(this);var b=this.N.jg;b!==a&&(this.N.jg=a,this.g(\"mouseHover\",\nb,a))}},mouseHold:{get:function(){return null!==this.N?this.N.ig:null},set:function(a){hl(this);var b=this.N.ig;b!==a&&(this.N.ig=a,this.g(\"mouseHold\",b,a))}},mouseDragEnter:{get:function(){return null!==this.N?this.N.$o:null},set:function(a){hl(this);var b=this.N.$o;b!==a&&(this.N.$o=a,this.g(\"mouseDragEnter\",b,a))}},mouseDragLeave:{get:function(){return null!==this.N?this.N.ap:null},set:function(a){hl(this);\nvar b=this.N.ap;b!==a&&(this.N.ap=a,this.g(\"mouseDragLeave\",b,a))}},mouseDrop:{get:function(){return null!==this.N?this.N.gg:null},set:function(a){hl(this);var b=this.N.gg;b!==a&&(this.N.gg=a,this.g(\"mouseDrop\",b,a))}},actionDown:{get:function(){return null!==this.N?this.N.gn:null},set:function(a){hl(this);var b=this.N.gn;b!==a&&(this.N.gn=a,this.g(\"actionDown\",b,a))}},actionMove:{get:function(){return null!==\nthis.N?this.N.hn:null},set:function(a){hl(this);var b=this.N.hn;b!==a&&(this.N.hn=a,this.g(\"actionMove\",b,a))}},actionUp:{get:function(){return null!==this.N?this.N.jn:null},set:function(a){hl(this);var b=this.N.jn;b!==a&&(this.N.jn=a,this.g(\"actionUp\",b,a))}},actionCancel:{get:function(){return null!==this.N?this.N.fn:null},set:function(a){hl(this);var b=this.N.fn;b!==a&&(this.N.fn=a,this.g(\"actionCancel\",b,a))}},toolTip:{\nget:function(){return null!==this.N?this.N.wg:null},set:function(a){hl(this);var b=this.N.wg;b!==a&&(this.N.wg=a,this.g(\"toolTip\",b,a))}},contextMenu:{get:function(){return null!==this.N?this.N.Rf:null},set:function(a){hl(this);var b=this.N.Rf;b!==a&&(this.N.Rf=a,this.g(\"contextMenu\",b,a))}}});Y.prototype.trigger=Y.prototype.Qw;Y.prototype.setProperties=Y.prototype.Fw;Y.prototype.findTemplateBinder=Y.prototype.ij;Y.prototype.bind=Y.prototype.bind;\nY.prototype.isEnabledObject=Y.prototype.Hg;Y.prototype.isVisibleObject=Y.prototype.Gf;Y.prototype.isContainedBy=Y.prototype.Gg;Y.prototype.getNearestIntersectionPoint=Y.prototype.Nt;Y.prototype.getLocalPoint=Y.prototype.Mt;Y.prototype.getDocumentScale=Y.prototype.Af;Y.prototype.getDocumentAngle=Y.prototype.lj;Y.prototype.getDocumentBounds=Y.prototype.mj;Y.prototype.getDocumentPoint=Y.prototype.da;Y.prototype.intersectsRect=Y.prototype.Mc;Y.prototype.containedInRect=Y.prototype.Jh;\nY.prototype.containsRect=Y.prototype.Ge;Y.prototype.containsPoint=Y.prototype.$;Y.prototype.raiseChanged=Y.prototype.g;Y.prototype.raiseChangedEvent=Y.prototype.Va;Y.prototype.addCopyProperty=Y.prototype.Tx;var Ql=null;Y.className=\"GraphObject\";Ql=new H;\nUl(\"Button\",function(){function a(a,b){return null!==a.diagram.Vb(a.documentPoint,function(a){for(;null!==a.panel&&!a.isActionable;)a=a.panel;return a},function(a){return a===b})}var b=Pl(X,X.Auto,{isActionable:!0,enabledChanged:function(a,b){if(a instanceof X){var c=a.bb(\"ButtonBorder\");null!==c&&(c.fill=b?a._buttonFillNormal:a._buttonFillDisabled)}},cursor:\"pointer\",_buttonFillNormal:\"#F5F5F5\",_buttonStrokeNormal:\"#BDBDBD\",_buttonFillOver:\"#E0E0E0\",_buttonStrokeOver:\"#9E9E9E\",_buttonFillPressed:\"#BDBDBD\",\n_buttonStrokePressed:\"#9E9E9E\",_buttonFillDisabled:\"#E5E5E5\"},Pl(Kf,{name:\"ButtonBorder\",figure:\"RoundedRectangle\",spot1:new O(0,0,2.76142374915397,2.761423749153969),spot2:new O(1,1,-2.76142374915397,-2.761423749153969),parameter1:2,parameter2:2,fill:\"#F5F5F5\",stroke:\"#BDBDBD\"}));b.mouseEnter=function(a,b){if(b.Hg()&&b instanceof X&&(a=b.bb(\"ButtonBorder\"),a instanceof Kf)){var c=b._buttonFillOver;b._buttonFillNormal=a.fill;a.fill=c;c=b._buttonStrokeOver;b._buttonStrokeNormal=a.stroke;a.stroke=c}};\nb.mouseLeave=function(a,b){b.Hg()&&b instanceof X&&(a=b.bb(\"ButtonBorder\"),a instanceof Kf&&(a.fill=b._buttonFillNormal,a.stroke=b._buttonStrokeNormal))};b.actionDown=function(a,b){if(b.Hg()&&b instanceof X&&null!==b._buttonFillPressed&&0===a.button){var c=b.bb(\"ButtonBorder\");if(c instanceof Kf){a=a.diagram;var d=a.skipsUndoManager;a.skipsUndoManager=!0;var g=b._buttonFillPressed;b._buttonFillOver=c.fill;c.fill=g;g=b._buttonStrokePressed;b._buttonStrokeOver=c.stroke;c.stroke=g;a.skipsUndoManager=\nd}}};b.actionUp=function(b,d){if(d.Hg()&&d instanceof X&&null!==d._buttonFillPressed&&0===b.button){var c=d.bb(\"ButtonBorder\");if(c instanceof Kf){var f=b.diagram,g=f.skipsUndoManager;f.skipsUndoManager=!0;a(b,d)?(c.fill=d._buttonFillOver,c.stroke=d._buttonStrokeOver):(c.fill=d._buttonFillNormal,c.stroke=d._buttonStrokeNormal);f.skipsUndoManager=g}}};b.actionCancel=function(b,d){if(d.Hg()&&d instanceof X&&null!==d._buttonFillPressed){var c=d.bb(\"ButtonBorder\");if(c instanceof Kf){var f=b.diagram,\ng=f.skipsUndoManager;f.skipsUndoManager=!0;a(b,d)?(c.fill=d._buttonFillOver,c.stroke=d._buttonStrokeOver):(c.fill=d._buttonFillNormal,c.stroke=d._buttonStrokeNormal);f.skipsUndoManager=g}}};b.actionMove=function(b,d){if(d.Hg()&&d instanceof X&&null!==d._buttonFillPressed){var c=b.diagram;if(0===c.firstInput.button&&(c.currentTool.standardMouseOver(),a(b,d)&&(b=d.bb(\"ButtonBorder\"),b instanceof Kf))){var f=c.skipsUndoManager;c.skipsUndoManager=!0;var g=d._buttonFillPressed;b.fill!==g&&(b.fill=g);g=\nd._buttonStrokePressed;b.stroke!==g&&(b.stroke=g);c.skipsUndoManager=f}}};return b});\nUl(\"TreeExpanderButton\",function(){var a=Pl(\"Button\",{_treeExpandedFigure:\"MinusLine\",_treeCollapsedFigure:\"PlusLine\"},Pl(Kf,{name:\"ButtonIcon\",figure:\"MinusLine\",stroke:\"#424242\",strokeWidth:2,desiredSize:Lb},(new Hi(\"figure\",\"isTreeExpanded\",function(a,c){c=c.panel;return a?c._treeExpandedFigure:c._treeCollapsedFigure})).Uq()),{visible:!1},(new Hi(\"visible\",\"isTreeLeaf\",function(a){return!a})).Uq());a.click=function(a,c){c=c.part;c instanceof Je&&(c=c.adornedPart);if(c instanceof W){var b=c.diagram;\nif(null!==b){b=b.commandHandler;if(c.isTreeExpanded){if(!b.canCollapseTree(c))return}else if(!b.canExpandTree(c))return;a.handled=!0;c.isTreeExpanded?b.collapseTree(c):b.expandTree(c)}}};return a});\nUl(\"SubGraphExpanderButton\",function(){var a=Pl(\"Button\",{_subGraphExpandedFigure:\"MinusLine\",_subGraphCollapsedFigure:\"PlusLine\"},Pl(Kf,{name:\"ButtonIcon\",figure:\"MinusLine\",stroke:\"#424242\",strokeWidth:2,desiredSize:Lb},(new Hi(\"figure\",\"isSubGraphExpanded\",function(a,c){c=c.panel;return a?c._subGraphExpandedFigure:c._subGraphCollapsedFigure})).Uq()));a.click=function(a,c){c=c.part;c instanceof Je&&(c=c.adornedPart);if(c instanceof U){var b=c.diagram;if(null!==b){b=b.commandHandler;if(c.isSubGraphExpanded){if(!b.canCollapseSubGraph(c))return}else if(!b.canExpandSubGraph(c))return;\na.handled=!0;c.isSubGraphExpanded?b.collapseSubGraph(c):b.expandSubGraph(c)}}};return a});Ul(\"ToolTip\",function(){return Pl(Je,X.Auto,{isShadowed:!0,shadowColor:\"rgba(0, 0, 0, .4)\",shadowOffset:new J(0,3),shadowBlur:5},Pl(Kf,{name:\"Border\",figure:\"RoundedRectangle\",parameter1:1,parameter2:1,fill:\"#F5F5F5\",stroke:\"#F0F0F0\",spot1:new O(0,0,4,6),spot2:new O(1,1,-4,-4)}))});\nUl(\"ContextMenu\",function(){return Pl(Je,X.Vertical,{background:\"#F5F5F5\",isShadowed:!0,shadowColor:\"rgba(0, 0, 0, .4)\",shadowOffset:new J(0,3),shadowBlur:5},new Hi(\"background\",\"\",function(a){return null!==a.adornedPart&&null!==a.placeholder?null:\"#F5F5F5\"}))});Ul(\"ContextMenuButton\",function(){var a=Pl(\"Button\");a.stretch=bl;var b=a.bb(\"ButtonBorder\");b instanceof Kf&&(b.figure=\"Rectangle\",b.strokeWidth=0,b.spot1=new O(0,0,2,3),b.spot2=new O(1,1,-2,-2));return a});\nUl(\"PanelExpanderButton\",function(a){var b=Vl(a,\"COLLAPSIBLE\"),c=Pl(\"Button\",{_buttonExpandedFigure:\"M0 0 M0 6 L4 2 8 6 M8 8\",_buttonCollapsedFigure:\"M0 0 M0 2 L4 6 8 2 M8 8\",_buttonFillNormal:\"rgba(0, 0, 0, 0)\",_buttonStrokeNormal:null,_buttonFillOver:\"rgba(0, 0, 0, .2)\",_buttonStrokeOver:null,_buttonFillPressed:\"rgba(0, 0, 0, .4)\",_buttonStrokePressed:null},Pl(Kf,{name:\"ButtonIcon\",strokeWidth:2},(new Hi(\"geometryString\",\"visible\",function(a){return a?c._buttonExpandedFigure:c._buttonCollapsedFigure})).Uq(b)));\na=c.bb(\"ButtonBorder\");a instanceof Kf&&(a.stroke=null,a.fill=\"rgba(0, 0, 0, 0)\");c.click=function(a,c){var d=c.diagram;if(null!==d&&!d.isReadOnly){var e=c.ij();null===e&&(e=c.part);null!==e&&(c=e.bb(b),null!==c&&(a.handled=!0,d.va(\"Collapse/Expand Panel\"),c.visible=!c.visible,d.Xa(\"Collapse/Expand Panel\")))}};return c});\nUl(\"CheckBoxButton\",function(a){var b=Vl(a);a=Pl(\"Button\",{desiredSize:new M(14,14)},Pl(Kf,{name:\"ButtonIcon\",geometryString:\"M0 0 M0 8.85 L4.9 13.75 16.2 2.45 M16.2 16.2\",strokeWidth:2,stretch:td,geometryStretch:Bg,visible:!1},\"\"!==b?(new Hi(\"visible\",b)).Iy():[]));a.click=function(a,d){if(d instanceof X){var c=a.diagram;if(!(null===c||c.isReadOnly||\"\"!==b&&c.model.isReadOnly)){a.handled=!0;var f=d.bb(\"ButtonIcon\");c.va(\"checkbox\");f.visible=!f.visible;\"function\"===typeof d._doClick&&d._doClick(a,\nd);c.Xa(\"checkbox\")}}};return a});\nUl(\"CheckBox\",function(a){a=Vl(a);a=Pl(\"CheckBoxButton\",a,{name:\"Button\",isActionable:!1,margin:new kc(0,1,0,0)});var b=Pl(X,\"Horizontal\",a,{isActionable:!0,cursor:a.cursor,margin:1,_buttonFillNormal:a._buttonFillNormal,_buttonStrokeNormal:a._buttonStrokeNormal,_buttonFillOver:a._buttonFillOver,_buttonStrokeOver:a._buttonStrokeOver,_buttonFillPressed:a._buttonFillPressed,_buttonStrokePressed:a._buttonStrokePressed,_buttonFillDisabled:a._buttonFillDisabled,mouseEnter:a.mouseEnter,mouseLeave:a.mouseLeave,\nactionDown:a.actionDown,actionUp:a.actionUp,actionCancel:a.actionCancel,actionMove:a.actionMove,click:a.click,_buttonClick:a.click});a.mouseEnter=null;a.mouseLeave=null;a.actionDown=null;a.actionUp=null;a.actionCancel=null;a.actionMove=null;a.click=null;return b});Y.None=zg=new D(Y,\"None\",0);Y.Default=al=new D(Y,\"Default\",0);Y.Vertical=cl=new D(Y,\"Vertical\",4);Y.Horizontal=bl=new D(Y,\"Horizontal\",5);Y.Fill=td=new D(Y,\"Fill\",3);Y.Uniform=Bg=new D(Y,\"Uniform\",1);\nY.UniformToFill=dl=new D(Y,\"UniformToFill\",2);Y.FlipVertical=el=new D(Y,\"FlipVertical\",1);Y.FlipHorizontal=fl=new D(Y,\"FlipHorizontal\",2);Y.FlipBoth=gl=new D(Y,\"FlipBoth\",3);Y.make=Pl;Y.getBuilders=function(){var a=new H,b;for(b in Ql)if(b!==b.toLowerCase()){var c=Ql.G(b);\"function\"===typeof c&&a.add(b,c)}a.freeze();return a};Y.defineBuilder=Ul;Y.takeBuilderArgument=Vl;\nfunction il(){this.Wn=this.Rf=this.wg=this.fn=this.jn=this.hn=this.gn=this.gg=this.ap=this.$o=this.ig=this.jg=this.lg=this.kg=this.hg=this.Qf=this.Uf=this.Pf=null}il.prototype.copy=function(){var a=new il;a.Pf=this.Pf;a.Uf=this.Uf;a.Qf=this.Qf;a.hg=this.hg;a.kg=this.kg;a.lg=this.lg;a.jg=this.jg;a.ig=this.ig;a.$o=this.$o;a.ap=this.ap;a.gg=this.gg;a.gn=this.gn;a.hn=this.hn;a.jn=this.jn;a.fn=this.fn;a.wg=this.wg;a.Rf=this.Rf;a.Wn=this.Wn;return a};il.className=\"GraphObjectEventHandlers\";\nfunction Zl(){this.Oa=[1,0,0,1,0,0]}Zl.prototype.copy=function(){var a=new Zl;a.Oa[0]=this.Oa[0];a.Oa[1]=this.Oa[1];a.Oa[2]=this.Oa[2];a.Oa[3]=this.Oa[3];a.Oa[4]=this.Oa[4];a.Oa[5]=this.Oa[5];return a};Zl.prototype.translate=function(a,b){this.Oa[4]+=this.Oa[0]*a+this.Oa[2]*b;this.Oa[5]+=this.Oa[1]*a+this.Oa[3]*b};Zl.prototype.scale=function(a,b){this.Oa[0]*=a;this.Oa[1]*=a;this.Oa[2]*=b;this.Oa[3]*=b};Zl.className=\"STransform\";\nfunction $l(a){this.type=a;this.r2=this.y2=this.x2=this.r1=this.y1=this.x1=0;this.ay=[];this.pattern=null}$l.prototype.addColorStop=function(a,b){this.ay.push({offset:a,color:b})};$l.className=\"SGradient\";\nfunction Ej(a,b){this.ownerDocument=a=void 0===b?x.document:b;this.LA=\"http://www.w3.org/2000/svg\";void 0!==a&&(this.Ja=this.Pb(\"svg\",{width:\"1px\",height:\"1px\",viewBox:\"0 0 1 1\"}),this.Ja.setAttributeNS(\"http://www.w3.org/2000/xmlns/\",\"xmlns\",\"http://www.w3.org/2000/svg\"),this.Ja.setAttributeNS(\"http://www.w3.org/2000/xmlns/\",\"xmlns:xlink\",\"http://www.w3.org/1999/xlink\"));this.Dq=null;this.context=new am(this)}\nEj.prototype.resize=function(a,b,c,d){return this.width!==a||this.height!==b?(this.style.width=c+\"px\",this.style.height=d+\"px\",this.Ja.setAttributeNS(null,\"width\",c+\"px\"),this.Ja.setAttributeNS(null,\"height\",d+\"px\"),this.Ja.setAttributeNS(null,\"viewBox\",\"0 0 \"+c+\" \"+d),this.context.Bx.firstElementChild.setAttributeNS(null,\"width\",c+\"px\"),this.context.Bx.firstElementChild.setAttributeNS(null,\"height\",d+\"px\"),!0):!1};\nEj.prototype.Pb=function(a,b,c){a=this.ownerDocument.createElementNS(this.LA,a);if(za(b))for(var d in b)a.setAttributeNS(\"href\"===d?\"http://www.w3.org/1999/xlink\":\"\",d,b[d]);void 0!==c&&(a.textContent=c);return a};Ej.prototype.getBoundingClientRect=function(){return this.Ja.getBoundingClientRect()};Ej.prototype.focus=function(){this.Ja.focus()};Ej.prototype.ky=function(){this.ownerDocument=null};\nna.Object.defineProperties(Ej.prototype,{width:{get:function(){return this.Ja.width.baseVal.value},set:function(a){this.Ja.width=a}},height:{get:function(){return this.Ja.height.baseVal.value},set:function(a){this.Ja.height=a}},style:{get:function(){return this.Ja.style}}});Ej.className=\"SVGSurface\";\nfunction am(a){this.nu=a;this.svg=a.Ja;this.stack=[];this.gd=[];this.fillStyle=\"#000000\";this.font=\"10px sans-serif\";this.globalAlpha=1;this.lineCap=\"butt\";this.lineDashOffset=0;this.lineJoin=\"miter\";this.lineWidth=1;this.miterLimit=10;this.shadowBlur=0;this.shadowColor=\"rgba(0, 0, 0, 0)\";this.shadowOffsetY=this.shadowOffsetX=0;this.strokeStyle=\"#000000\";this.textAlign=\"start\";this.clipInsteadOfFill=!1;this.ug=this.ft=this.et=0;this.Wt=null;this.path=[];this.Vu=!1;this.uh=null;this.vh=0;this.He=new Zl;\nbm(this,1,0,0,1,0,0);var b=ob++,c=this.Pb(\"clipPath\",{id:\"mainClip\"+b});c.appendChild(this.Pb(\"rect\",{x:0,y:0,width:a.width,height:a.height}));this.Bx=c;this.nu.Ja.appendChild(c);this.gd[0].setAttributeNS(null,\"clip-path\",\"url(#mainClip\"+b+\")\");this.NA={}}t=am.prototype;\nt.arc=function(a,b,c,d,e,f,g,h){var k=2*Math.PI,l=k-1E-6,m=c*Math.cos(d),n=c*Math.sin(d),p=a+m,r=b+n,q=f?0:1;d=f?d-e:e-d;(1E-6<Math.abs(g-p)||1E-6<Math.abs(h-r))&&this.path.push([\"L\",p,+r]);0>d&&(d=d%k+k);d>l?(this.path.push([\"A\",c,c,0,1,q,a-m,b-n]),this.path.push([\"A\",c,c,0,1,q,p,r])):1E-6<d&&this.path.push([\"A\",c,c,0,+(d>=Math.PI),q,a+c*Math.cos(e),b+c*Math.sin(e)])};t.beginPath=function(){this.path=[]};t.bezierCurveTo=function(a,b,c,d,e,f){this.path.push([\"C\",a,b,c,d,e,f])};t.clearRect=function(){};\nt.clip=function(){this.addPath(\"clipPath\",this.path,this.He)};t.closePath=function(){this.path.push([\"z\"])};t.createLinearGradient=function(a,b,c,d){var e=new $l(\"linear\");e.x1=a;e.y1=b;e.x2=c;e.y2=d;return e};\nt.createPattern=function(a){var b=\"\";a instanceof HTMLCanvasElement&&(b=a.toDataURL());a instanceof HTMLImageElement&&(b=a.getAttribute(\"src\"));var c=this.NA;if(c[b])return\"url(#\"+c[b]+\")\";var d=\"PATTERN\"+ob++,e={x:0,y:0,width:a.width,height:a.height,href:b};a=this.Pb(\"pattern\",{width:a.width,height:a.height,id:d,patternUnits:\"userSpaceOnUse\"});a.appendChild(this.Pb(Gk,e));this.svg.appendChild(a);c[b]=d;return\"url(#\"+d+\")\"};\nt.createRadialGradient=function(a,b,c,d,e,f){var g=new $l(\"radial\");g.x1=a;g.y1=b;g.r1=c;g.x2=d;g.y2=e;g.r2=f;return g};\nt.drawImage=function(a,b,c,d,e,f,g,h,k){var l=\"\";a instanceof HTMLCanvasElement&&(l=a.toDataURL());a instanceof HTMLImageElement&&(l=a.getAttribute(\"src\"));var m=a instanceof HTMLImageElement?a.naturalWidth:a.width,n=a instanceof HTMLImageElement?a.naturalHeight:a.height;void 0===d&&(f=b,g=c,h=d=m,k=e=n);d=d||0;e=e||0;f=f||0;g=g||0;h=h||0;k=k||0;a={x:0,y:0,width:m||d,height:n||e,href:l};L.aa(d,h)&&L.aa(e,k)?-1===l.toLowerCase().indexOf(\".svg\")&&-1===l.toLowerCase().indexOf(\"data:image/svg\")&&(a.preserveAspectRatio=\n\"xMidYMid slice\"):a.preserveAspectRatio=\"none\";l=\"\";h/=d;k/=e;if(0!==f||0!==g)l+=\" translate(\"+f+\", \"+g+\")\";if(1!==h||1!==k)l+=\" scale(\"+h+\", \"+k+\")\";if(0!==b||0!==c)l+=\" translate(\"+-b+\", \"+-c+\")\";if(0!==b||0!==c||d!==m||e!==n)f=\"CLIP\"+ob++,g=this.Pb(\"clipPath\",{id:f}),g.appendChild(this.Pb(\"rect\",{x:b,y:c,width:d,height:e})),this.svg.appendChild(g),a[\"clip-path\"]=\"url(#\"+f+\")\";cm(this,Gk,a,this.He,l);this.addElement(Gk,a)};t.fill=function(){this.addPath(\"fill\",this.path,this.He)};\nt.Je=function(){this.clipInsteadOfFill?this.clip():this.fill()};t.fillRect=function(a,b,c,d){a=[a,b,c,d];a={x:a[0],y:a[1],width:a[2],height:a[3]};cm(this,\"fill\",a,this.He);this.addElement(\"rect\",a)};t.fillText=function(a,b,c){a=[a,b,c];b=this.textAlign;\"left\"===b?b=\"start\":\"right\"===b?b=\"end\":\"center\"===b&&(b=\"middle\");b={x:a[1],y:a[2],style:\"font: \"+this.font,\"text-anchor\":b};cm(this,\"fill\",b,this.He);this.addElement(\"text\",b,a[0])};t.lineTo=function(a,b){this.path.push([\"L\",a,b])};\nt.moveTo=function(a,b){this.path.push([\"M\",a,b])};t.quadraticCurveTo=function(a,b,c,d){this.path.push([\"Q\",a,b,c,d])};t.rect=function(a,b,c,d){this.path.push([\"M\",a,b],[\"L\",a+c,b],[\"L\",a+c,b+d],[\"L\",a,b+d],[\"z\"])};\nt.restore=function(){this.He=this.stack.pop();this.path=this.stack.pop();var a=this.stack.pop();this.fillStyle=a.fillStyle;this.font=a.font;this.globalAlpha=a.globalAlpha;this.lineCap=a.lineCap;this.lineDashOffset=a.lineDashOffset;this.lineJoin=a.lineJoin;this.lineWidth=a.lineWidth;this.miterLimit=a.miterLimit;this.shadowBlur=a.shadowBlur;this.shadowColor=a.shadowColor;this.shadowOffsetX=a.shadowOffsetX;this.shadowOffsetY=a.shadowOffsetY;this.strokeStyle=a.strokeStyle;this.textAlign=a.textAlign};\nt.save=function(){this.stack.push({fillStyle:this.fillStyle,font:this.font,globalAlpha:this.globalAlpha,lineCap:this.lineCap,lineDashOffset:this.lineDashOffset,lineJoin:this.lineJoin,lineWidth:this.lineWidth,miterLimit:this.miterLimit,shadowBlur:this.shadowBlur,shadowColor:this.shadowColor,shadowOffsetX:this.shadowOffsetX,shadowOffsetY:this.shadowOffsetY,strokeStyle:this.strokeStyle,textAlign:this.textAlign});for(var a=[],b=0;b<this.path.length;b++)a.push(this.path[b]);this.stack.push(a);this.stack.push(this.He.copy())};\nt.setTransform=function(a,b,c,d,e,f){1===a&&0===b&&0===c&&1===d&&0===e&&0===f||bm(this,a,b,c,d,e,f)};t.scale=function(a,b){this.He.scale(a,b)};t.translate=function(a,b){this.He.translate(a,b)};t.transform=function(){};t.stroke=function(){this.addPath(\"stroke\",this.path,this.He)};t.vj=function(){this.clipInsteadOfFill||this.stroke()};t.Pb=function(a,b,c){return this.nu.Pb(a,b,c)};\nt.addElement=function(a,b,c){a=this.Pb(a,b,c);0<this.gd.length?this.gd[this.gd.length-1].appendChild(a):this.svg.appendChild(a);return this.Wt=a};\nfunction cm(a,b,c,d,e){1!==a.globalAlpha&&(c.opacity=a.globalAlpha);\"fill\"===b?(a.fillStyle instanceof $l?c.fill=dm(a,a.fillStyle):/^rgba\\(/.test(a.fillStyle)?(a=/^\\s*rgba\\s*\\(([^,\\s]+)\\s*,\\s*([^,\\s]+)\\s*,\\s*([^,\\s]+)\\s*,\\s*([^,\\s]+)\\)\\s*$/i.exec(a.fillStyle),c.fill=\"rgb(\"+a[1]+\",\"+a[2]+\",\"+a[3]+\")\",c[\"fill-opacity\"]=a[4]):c.fill=a.fillStyle,c.stroke=\"none\"):\"stroke\"===b&&(c.fill=\"none\",a.strokeStyle instanceof $l?c.stroke=dm(a,a.strokeStyle):/^rgba\\(/.test(a.strokeStyle)?(b=/^\\s*rgba\\s*\\(([^,\\s]+)\\s*,\\s*([^,\\s]+)\\s*,\\s*([^,\\s]+)\\s*,\\s*([^,\\s]+)\\)\\s*$/i.exec(a.strokeStyle),\nc.stroke=\"rgb(\"+b[1]+\",\"+b[2]+\",\"+b[3]+\")\",c[\"stroke-opacity\"]=b[4]):c.stroke=a.strokeStyle,c[\"stroke-width\"]=a.lineWidth,c[\"stroke-linecap\"]=a.lineCap,c[\"stroke-linejoin\"]=a.lineJoin,c[\"stroke-miterlimit\"]=a.miterLimit);d=d.Oa;d=\"matrix(\"+d[0]+\", \"+d[1]+\", \"+d[2]+\", \"+d[3]+\", \"+d[4]+\", \"+d[5]+\")\";void 0!==e&&(d+=e);c.transform=d}\nfunction dm(a,b){var c=\"GRAD\"+ob++;if(\"linear\"===b.type)var d=a.Pb(\"linearGradient\",{x1:b.x1,x2:b.x2,y1:b.y1,y2:b.y2,id:c,gradientUnits:\"userSpaceOnUse\"});else if(\"radial\"===b.type)d=a.Pb(\"radialGradient\",{x1:b.x1,x2:b.x2,y1:b.y1,y2:b.y2,r1:b.r1,r2:b.r2,id:c});else throw Error(\"invalid gradient\");var e=b.ay;b=e.length;for(var f=[],g=0;g<b;g++){var h=e[g],k=h.color;h={offset:h.offset,\"stop-color\":k};/^rgba\\(/.test(k)&&(k=/^\\s*rgba\\s*\\(([^,\\s]+)\\s*,\\s*([^,\\s]+)\\s*,\\s*([^,\\s]+)\\s*,\\s*([^,\\s]+)\\)\\s*$/i.exec(k),\nh[\"stop-color\"]=\"rgb(\"+k[1]+\",\"+k[2]+\",\"+k[3]+\")\",h[\"stop-opacity\"]=k[4]);f.push(h)}f.sort(function(a,b){return a.offset>b.offset?1:-1});for(e=0;e<b;e++)d.appendChild(a.Pb(\"stop\",f[e]));a.svg.appendChild(d);return\"url(#\"+c+\")\"}\nt.addPath=function(a,b,c){for(var d=[],e=0;e<b.length;e++){var f=Ba(b[e]),g=[f.shift()];if(\"A\"===g[0])g.push(f.shift()+\",\"+f.shift(),f.shift(),f.shift()+\",\"+f.shift(),f.shift()+\",\"+f.shift());else for(;f.length;)g.push(f.shift()+\",\"+f.shift());d.push(g.join(\" \"))}b={d:d.join(\" \")};\"stroke\"===a&&this.Vu&&(b[\"stroke-dasharray\"]=this.uh.toString(),b[\"stroke-dashoffset\"]=this.vh);cm(this,a,b,c);\"clipPath\"===a?(a=\"CLIP\"+ob++,c=this.Pb(\"clipPath\",{id:a}),c.appendChild(this.Pb(\"path\",b)),this.svg.appendChild(c),\n0<this.gd.length&&this.gd[this.gd.length-1].setAttributeNS(null,\"clip-path\",\"url(#\"+a+\")\")):this.addElement(\"path\",b)};function bm(a,b,c,d,e,f,g){var h=new Zl;h.Oa=[b,c,d,e,f,g];b={};cm(a,\"g\",b,h);h=a.addElement(\"g\",b);a.gd.push(h)}\nt.Ym=function(a){if(0!==this.shadowOffsetX||0!==this.shadowOffsetY||0!==this.shadowBlur){var b=\"SHADOW\"+ob++,c=this.addElement(\"filter\",{id:b,x:\"-100%\",y:\"-100%\",width:\"300%\",height:\"300%\"},null);var d=a.computePixelRatio();a=this.Pb(\"feGaussianBlur\",{\"in\":\"SourceAlpha\",result:\"blur\",stdDeviation:this.shadowBlur/2/d});var e=this.Pb(\"feFlood\",{\"in\":\"blur\",result:\"flood\",\"flood-color\":this.shadowColor});var f=this.Pb(\"feComposite\",{\"in\":\"flood\",in2:\"blur\",operator:\"in\",result:\"comp\"});d=this.Pb(\"feOffset\",\n{\"in\":\"comp\",result:\"offsetBlur\",dx:this.shadowOffsetX/d,dy:this.shadowOffsetY/d});var g=this.Pb(\"feMerge\",{});g.appendChild(this.Pb(\"feMergeNode\",{\"in\":\"offsetBlur\"}));g.appendChild(this.Pb(\"feMergeNode\",{\"in\":\"SourceGraphic\"}));c.appendChild(a);c.appendChild(e);c.appendChild(f);c.appendChild(d);c.appendChild(g);0<this.gd.length&&this.gd[this.gd.length-1].setAttributeNS(null,\"filter\",\"url(#\"+b+\")\")}};t.Iw=function(a,b,c){this.et=a;this.ft=b;this.ug=c};\nfunction yl(a){a.shadowOffsetX=0;a.shadowOffsetY=0;a.shadowBlur=0}function xl(a){a.shadowOffsetX=a.et;a.shadowOffsetY=a.ft;a.shadowBlur=a.ug}t.Ft=function(a,b){this.Vu=!0;this.uh=a;this.vh=b};t.Dt=function(){this.Vu=!1};t.uc=function(){};t.Sy=function(){};am.prototype.rotate=function(){};am.prototype.getImageData=function(){return null};am.prototype.measureText=function(){return null};am.className=\"SVGContext\";\nR.prototype.$t=function(a){var b=new Ej(this,x.document);void 0===a&&(a=new $a);var c=this;return Ek(this,function(a,e){a=Fk(c,a,\"SVG\",b);a=null!==a?a.svg:null;return\"function\"===typeof e?(e(a),null):a},a)};R.prototype.makeSvg=R.prototype.$t;R.prototype.iw=function(a){return this.$t(a)};R.prototype.makeSVG=R.prototype.iw;\nY.prototype.ly=function(a,b){if(!(a instanceof am))return!1;if(!this.visible)return!0;var c=null,d=a.Wt;if(this instanceof X&&(this.type===X.TableRow||this.type===X.TableColumn))return vl(this,a,b),!0;var e=this.xb;if(0===e.width||0===e.height||isNaN(e.x)||isNaN(e.y))return!0;var f=this.transform,g=this.panel;0!==(this.F&4096)===!0&&wl(this);var h=0!==(this.F&256);a.clipInsteadOfFill&&(h=!1);var k=!1;this instanceof Wg&&(a.font=this.font);if(h){k=g.he()?g.naturalBounds:g.actualBounds;if(null!==this.Za){var l=\nthis.Za;var m=l.x;var n=l.y;var p=l.width;l=l.height}else m=Math.max(e.x,k.x),n=Math.max(e.y,k.y),p=Math.min(e.right,k.right)-m,l=Math.min(e.bottom,k.bottom)-n;if(m>e.width+e.x||e.x>k.width+k.x||n>e.height+e.y||e.y>k.height+k.y)return!0;k=!0;bm(a,1,0,0,1,0,0);a.save();a.beginPath();a.rect(m,n,p,l);a.clip()}if(this.Ff()&&!this.isVisible())return!0;a.He.Oa=[1,0,0,1,0,0];(this instanceof Wg&&1<this.lineCount||this instanceof Kf&&1<this.geometry.figures.length)&&bm(a,1,0,0,1,0,0);m=!1;this.Ff()&&this.isShadowed&&\nb.Ke(\"drawShadows\")&&(n=this.shadowOffset,a.Iw(n.x*b.scale*b.Tb,n.y*b.scale*b.Tb,this.shadowBlur),xl(a),a.shadowColor=this.shadowColor);n=!1;this.part&&b.Ke(\"drawShadows\")&&(n=this.part.isShadowed);a.clipInsteadOfFill&&(n=!1);!0===this.shadowVisible?(xl(a),!1===m&&n&&(bm(a,1,0,0,1,0,0),a.Ym(b),m=!0)):!1===this.shadowVisible&&yl(a);p=this.naturalBounds;null!==this.areaBackground&&(ni(this,a,this.areaBackground,!0,!0,p,e),!1===m&&n&&(bm(a,1,0,0,1,0,0),a.Ym(b),m=!0),this.areaBackground instanceof zl&&\nthis.areaBackground.type===Al?(a.beginPath(),a.rect(e.x,e.y,e.width,e.height),a.Je(this.areaBackground)):a.fillRect(e.x,e.y,e.width,e.height));this instanceof X?bm(a,f.m11,f.m12,f.m21,f.m22,f.dx,f.dy):(a.He.Oa=[f.m11,f.m12,f.m21,f.m22,f.dx,f.dy],!1===m&&n&&(bm(a,1,0,0,1,0,0),a.Ym(b),m=!0));if(null!==this.background){!1===m&&n&&(bm(a,1,0,0,1,0,0),a.Ym(b),m=!0);var r=this.naturalBounds;l=f=0;var q=r.width;r=r.height;var u=0;this instanceof Kf&&(r=this.geometry.bounds,f=r.x,l=r.y,q=r.width,r=r.height,\nu=this.strokeWidth);ni(this,a,this.background,!0,!1,p,e);this.background instanceof zl&&this.background.type===Al?(a.beginPath(),a.rect(f-u/2,l-u/2,q+u,r+u),a.Je(this.background)):a.fillRect(f-u/2,l-u/2,q+u,r+u)}n&&(null!==this.background||null!==this.areaBackground||null!==g&&0!==(g.F&512)||null!==g&&(g.type===X.Auto||g.type===X.Spot)&&g.tb()!==this)?(Bl(this,!0),null===this.shadowVisible&&yl(a)):Bl(this,!1);this.ej(a,b);n&&0!==(this.F&512)===!0&&xl(a);this.Ff()&&n&&yl(a);h&&(a.restore(),k&&a.gd.pop());\nthis instanceof X&&(c=a.gd.pop());!0===m&&a.gd.pop();if(this instanceof Wg&&1<this.lineCount||this instanceof Kf&&1<this.geometry.figures.length)c=a.gd.pop();null!==a.nu.Dq&&(null===c&&(d===a.Wt?(bm(a,1,0,0,1,0,0),c=a.gd.pop()):c=a.Wt),a.nu.Dq(this,c));this.svg=c;return!0};\nfunction Hk(a,b){this.ownerDocument=b=void 0===b?x.document:b;this.Dq=null;b=b.createElement(\"canvas\");b.tabIndex=0;this.Ja=b;this.Ja.innerHTML=\"This text is displayed if your browser does not support the Canvas HTML element.\";this.context=new Dl(b);b.C=a}Hk.prototype.resize=function(a,b,c,d){return this.width!==a||this.height!==b?(this.width=a,this.height=b,this.style.width=c+\"px\",this.style.height=d+\"px\",!0):!1};Hk.prototype.toDataURL=function(a,b){return this.Ja.toDataURL(a,b)};\nHk.prototype.getBoundingClientRect=function(){return this.Ja.getBoundingClientRect()};Hk.prototype.focus=function(){this.Ja.focus()};Hk.prototype.ky=function(){this.ownerDocument=this.Ja.C=null};na.Object.defineProperties(Hk.prototype,{width:{get:function(){return this.Ja.width},set:function(a){this.Ja.width=a}},height:{get:function(){return this.Ja.height},set:function(a){this.Ja.height=a}},style:{get:function(){return this.Ja.style}}});\nHk.className=\"CanvasSurface\";function Dl(a){a.getContext&&a.getContext(\"2d\")||B(\"Browser does not support HTML Canvas Element\");this.Y=a.getContext(\"2d\");this.xu=this.zu=this.yu=\"\";this.yn=!1;this.ug=this.ft=this.et=0}t=Dl.prototype;t.Sy=function(a){this.Y.imageSmoothingEnabled=a};t.arc=function(a,b,c,d,e,f){this.Y.arc(a,b,c,d,e,f)};t.beginPath=function(){this.Y.beginPath()};t.bezierCurveTo=function(a,b,c,d,e,f){this.Y.bezierCurveTo(a,b,c,d,e,f)};\nt.clearRect=function(a,b,c,d){this.Y.clearRect(a,b,c,d)};t.clip=function(){this.Y.clip()};t.closePath=function(){this.Y.closePath()};t.createLinearGradient=function(a,b,c,d){return this.Y.createLinearGradient(a,b,c,d)};t.createPattern=function(a,b){return this.Y.createPattern(a,b)};t.createRadialGradient=function(a,b,c,d,e,f){return this.Y.createRadialGradient(a,b,c,d,e,f)};t.drawImage=function(a,b,c,d,e,f,g,h,k){void 0===d?this.Y.drawImage(a,b,c):this.Y.drawImage(a,b,c,d,e,f,g,h,k)};t.fill=function(){this.Y.fill()};\nt.fillRect=function(a,b,c,d){this.Y.fillRect(a,b,c,d)};t.fillText=function(a,b,c){this.Y.fillText(a,b,c)};t.getImageData=function(a,b,c,d){return this.Y.getImageData(a,b,c,d)};t.lineTo=function(a,b){this.Y.lineTo(a,b)};t.measureText=function(a){return this.Y.measureText(a)};t.moveTo=function(a,b){this.Y.moveTo(a,b)};t.quadraticCurveTo=function(a,b,c,d){this.Y.quadraticCurveTo(a,b,c,d)};t.rect=function(a,b,c,d){this.Y.rect(a,b,c,d)};t.restore=function(){this.Y.restore()};Dl.prototype.rotate=function(a){this.Y.rotate(a)};\nt=Dl.prototype;t.save=function(){this.Y.save()};t.setTransform=function(a,b,c,d,e,f){this.Y.setTransform(a,b,c,d,e,f)};t.scale=function(a,b){this.Y.scale(a,b)};t.stroke=function(){this.Y.stroke()};t.transform=function(a,b,c,d,e,f){1===a&&0===b&&0===c&&1===d&&0===e&&0===f||this.Y.transform(a,b,c,d,e,f)};t.translate=function(a,b){this.Y.translate(a,b)};\nt.Je=function(a){if(a instanceof zl&&a.type===Al){var b=a.gl;a=a.Au;a>b?(this.scale(b/a,1),this.translate((a-b)/2,0)):b>a&&(this.scale(1,a/b),this.translate(0,(b-a)/2));this.yn?this.clip():this.fill();a>b?(this.translate(-(a-b)/2,0),this.scale(1/(b/a),1)):b>a&&(this.translate(0,-(b-a)/2),this.scale(1,1/(a/b)))}else this.yn?this.clip():this.fill()};t.vj=function(){this.yn||this.stroke()};t.Iw=function(a,b,c){this.et=a;this.ft=b;this.ug=c};\nt.Ft=function(a,b){var c=this.Y;void 0!==c.setLineDash&&(c.setLineDash(a),c.lineDashOffset=b)};t.Dt=function(){var a=this.Y;void 0!==a.setLineDash&&(a.setLineDash(em),a.lineDashOffset=0)};t.uc=function(a){a&&(this.yu=\"\");this.xu=this.zu=\"\"};\nna.Object.defineProperties(Dl.prototype,{fillStyle:{get:function(){return this.Y.fillStyle},set:function(a){this.xu!==a&&(this.xu=this.Y.fillStyle=a)}},font:{get:function(){return this.Y.font},set:function(a){this.yu!==a&&(this.yu=this.Y.font=a)}},globalAlpha:{get:function(){return this.Y.globalAlpha},set:function(a){this.Y.globalAlpha=a}},lineCap:{get:function(){return this.Y.lineCap},\nset:function(a){this.Y.lineCap=a}},lineDashOffset:{get:function(){return this.Y.lineDashOffset},set:function(a){this.Y.lineDashOffset=a}},lineJoin:{get:function(){return this.Y.lineJoin},set:function(a){this.Y.lineJoin=a}},lineWidth:{get:function(){return this.Y.lineWidth},set:function(a){this.Y.lineWidth=a}},miterLimit:{get:function(){return this.Y.miterLimit},set:function(a){this.Y.miterLimit=\na}},shadowBlur:{get:function(){return this.Y.shadowBlur},set:function(a){this.Y.shadowBlur=a}},shadowColor:{get:function(){return this.Y.shadowColor},set:function(a){this.Y.shadowColor=a}},shadowOffsetX:{get:function(){return this.Y.shadowOffsetX},set:function(a){this.Y.shadowOffsetX=a}},shadowOffsetY:{get:function(){return this.Y.shadowOffsetY},set:function(a){this.Y.shadowOffsetY=\na}},strokeStyle:{get:function(){return this.Y.strokeStyle},set:function(a){this.zu!==a&&(this.zu=this.Y.strokeStyle=a)}},textAlign:{get:function(){return this.Y.textAlign},set:function(a){this.Y.textAlign=a}},imageSmoothingEnabled:{get:function(){return this.Y.imageSmoothingEnabled},set:function(a){this.Y.imageSmoothingEnabled=a}},clipInsteadOfFill:{get:function(){return this.yn},\nset:function(a){this.yn=a}}});var em=Object.freeze([]);Dl.className=\"CanvasSurfaceContext\";function fm(){this.T=this.u=this.I=this.l=0}fm.className=\"ColorNumbers\";function zl(a){gm||(hm(),gm=!0);Xa(this);this.v=!1;void 0===a?(this.qa=Cl,this.fl=\"black\"):\"string\"===typeof a?(this.qa=Cl,this.fl=a):(this.qa=a,this.fl=\"black\");a=this.qa;a===Fl?(this.Dd=uc,this.sl=Cc):this.sl=a===Al?this.Dd=zc:this.Dd=sc;this.jt=0;this.Vr=NaN;this.ke=this.Ks=this.je=null;this.Au=this.gl=0}\nzl.prototype.copy=function(){var a=new zl;a.qa=this.qa;a.fl=this.fl;a.Dd=this.Dd.H();a.sl=this.sl.H();a.jt=this.jt;a.Vr=this.Vr;null!==this.je&&(a.je=this.je.copy());a.Ks=this.Ks;return a};t=zl.prototype;t.freeze=function(){this.v=!0;null!==this.je&&this.je.freeze();return this};t.ea=function(){Object.isFrozen(this)&&B(\"cannot thaw constant: \"+this);this.v=!1;null!==this.je&&this.je.ea();return this};t.jb=function(a){a.classType===zl&&(this.type=a)};\nt.toString=function(){var a=\"Brush(\";if(this.type===Cl)a+=this.color;else if(a=this.type===Fl?a+\"Linear \":this.type===Al?a+\"Radial \":this.type===El?a+\"Pattern \":a+\"(unknown) \",a+=this.start+\" \"+this.end,null!==this.colorStops)for(var b=this.colorStops.iterator;b.next();)a+=\" \"+b.key+\":\"+b.value;return a+\")\"};\nt.addColorStop=function(a,b){this.v&&va(this);(\"number\"!==typeof a||!isFinite(a)||1<a||0>a)&&wa(a,\"0 <= loc <= 1\",zl,\"addColorStop:loc\");null===this.je&&(this.je=new H);this.je.add(a,b);this.qa===Cl&&(this.type=Fl);this.ke=null;return this};\nt.FA=function(a,b){this.v&&va(this);a=void 0===a||\"number\"!==typeof a?.2:a;b=void 0===b?im:b;if(this.type===Cl)ai(this.color),this.color=jm(a,b);else if((this.type===Fl||this.type===Al)&&null!==this.colorStops)for(var c=this.colorStops.iterator;c.next();)ai(c.value),this.addColorStop(c.key,jm(a,b));return this};function km(a,b,c){b=void 0===b||\"number\"!==typeof b?.2:b;c=void 0===c?im:c;ai(a);return jm(b,c)}\nt.Iz=function(a,b){this.v&&va(this);a=void 0===a||\"number\"!==typeof a?.2:a;b=void 0===b?im:b;if(this.type===Cl)ai(this.color),this.color=jm(-a,b);else if((this.type===Fl||this.type===Al)&&null!==this.colorStops)for(var c=this.colorStops.iterator;c.next();)ai(c.value),this.addColorStop(c.key,jm(-a,b));return this};function lm(a,b,c){b=void 0===b||\"number\"!==typeof b?.2:b;c=void 0===c?im:c;ai(a);return jm(-b,c)}\nfunction mm(a,b,c){ai(a);a=nm.l;var d=nm.I,e=nm.u,f=nm.T;ai(b);void 0===c&&(c=.5);return\"rgba(\"+Math.round((nm.l-a)*c+a)+\", \"+Math.round((nm.I-d)*c+d)+\", \"+Math.round((nm.u-e)*c+e)+\", \"+Math.round((nm.T-f)*c+f)+\")\"}\nt.Fy=function(){if(this.type===Cl)return om(this.color);if((this.type===Fl||this.type===Al)&&null!==this.colorStops){var a=this.colorStops;if(this.type===Al)return om(a.first().value);if(null!==a.get(.5))return om(a.get(.5));if(2===a.count)return a=a.ma(),om(mm(a[0].value,a[1].value));for(var b=a.iterator,c=-1,d=-1,e=1,f=1;b.next();){var g=b.key,h=Math.abs(.5-b.key);e>f&&h<e?(c=g,e=h):f>=e&&h<f&&(d=g,f=h)}c>d&&(f=c,c=d,d=f,f=e);e=d-c;return om(mm(a.get(c),a.get(d),1-f/e))}return!1};\nfunction om(a){if(!a)return!1;if(a instanceof zl)return a.Fy();ai(a);return 128>(299*nm.l+587*nm.I+114*nm.u)/1E3}\nfunction jm(a,b){switch(b){case im:b=100*pm(nm.l);var c=100*pm(nm.I),d=100*pm(nm.u);qm.l=.4124564*b+.3575761*c+.1804375*d;qm.I=.2126729*b+.7151522*c+.072175*d;qm.u=.0193339*b+.119192*c+.9503041*d;qm.T=nm.T;b=rm(qm.l/sm[0]);c=rm(qm.I/sm[1]);d=rm(qm.u/sm[2]);tm.l=116*c-16;tm.I=500*(b-c);tm.u=200*(c-d);tm.T=qm.T;tm.l=Math.min(100,Math.max(0,tm.l+100*a));a=(tm.l+16)/116;b=a-tm.u/200;qm.l=sm[0]*um(tm.I/500+a);qm.I=sm[1]*(tm.l>vm*wm?Math.pow(a,3):tm.l/vm);qm.u=sm[2]*um(b);qm.T=tm.T;a=-.969266*qm.l+1.8760108*\nqm.I+.041556*qm.u;b=.0556434*qm.l+-.2040259*qm.I+1.0572252*qm.u;nm.l=255*xm((3.2404542*qm.l+-1.5371385*qm.I+-.4985314*qm.u)/100);nm.I=255*xm(a/100);nm.u=255*xm(b/100);nm.T=qm.T;nm.l=Math.round(nm.l);255<nm.l?nm.l=255:0>nm.l&&(nm.l=0);nm.I=Math.round(nm.I);255<nm.I?nm.I=255:0>nm.I&&(nm.I=0);nm.u=Math.round(nm.u);255<nm.u?nm.u=255:0>nm.u&&(nm.u=0);return\"rgba(\"+nm.l+\", \"+nm.I+\", \"+nm.u+\", \"+nm.T+\")\";case ym:return bi(),ci.u=Math.min(100,Math.max(0,ci.u+100*a)),\"hsla(\"+ci.l+\", \"+ci.I+\"%, \"+ci.u+\"%, \"+\nci.T+\")\";default:return B(\"Unknown color space: \"+b),\"rgba(0, 0, 0, 1)\"}}function ai(a){gm||(hm(),gm=!0);var b=zm;if(null!==b){b.clearRect(0,0,1,1);b.fillStyle=\"#000000\";var c=b.fillStyle;b.fillStyle=a;b.fillStyle!==c?(b.fillRect(0,0,1,1),a=b.getImageData(0,0,1,1).data,nm.l=a[0],nm.I=a[1],nm.u=a[2],nm.T=a[3]/255):(b.fillStyle=\"#FFFFFF\",b.fillStyle=a,nm.l=0,nm.I=0,nm.u=0,nm.T=1)}}\nfunction bi(){var a=nm.l/255,b=nm.I/255,c=nm.u/255,d=Math.max(a,b,c),e=Math.min(a,b,c),f=d-e;e=(d+e)/2;if(0===f)var g=a=0;else{switch(d){case a:g=(b-c)/f%6;break;case b:g=(c-a)/f+2;break;case c:g=(a-b)/f+4}g*=60;0>g&&(g+=360);a=f/(1-Math.abs(2*e-1))}ci.l=Math.round(g);ci.I=Math.round(100*a);ci.u=Math.round(100*e);ci.T=nm.T}function pm(a){a/=255;return.04045>=a?a/12.92:Math.pow((a+.055)/1.055,2.4)}function xm(a){return.0031308>=a?12.92*a:1.055*Math.pow(a,1/2.4)-.055}\nfunction rm(a){return a>wm?Math.pow(a,1/3):(vm*a+16)/116}function um(a){var b=a*a*a;return b>wm?b:(116*a-16)/vm}function Wl(a,b){\"string\"!==typeof a&&(a instanceof zl||B(\"Value for \"+b+\" must be a color string or a Brush, not \"+a))}function hm(){zm=Ug?(new Hk(null)).context:null}\nna.Object.defineProperties(zl.prototype,{type:{get:function(){return this.qa},set:function(a){this.v&&va(this,a);this.qa=a;this.start.nc()&&(a===Fl?this.start=uc:a===Al&&(this.start=zc));this.end.nc()&&(a===Fl?this.end=Cc:a===Al&&(this.end=zc));this.ke=null}},color:{get:function(){return this.fl},set:function(a){this.v&&va(this,a);this.fl=a;this.ke=null}},start:{get:function(){return this.Dd},set:function(a){this.v&&\nva(this,a);this.Dd=a.H();this.ke=null}},end:{get:function(){return this.sl},set:function(a){this.v&&va(this,a);this.sl=a.H();this.ke=null}},startRadius:{get:function(){return this.jt},set:function(a){this.v&&va(this,a);0>a&&wa(a,\">= zero\",zl,\"startRadius\");this.jt=a;this.ke=null}},endRadius:{get:function(){return this.Vr},set:function(a){this.v&&va(this,a);0>a&&wa(a,\">= zero\",zl,\"endRadius\");this.Vr=a;this.ke=\nnull}},colorStops:{get:function(){return this.je},set:function(a){this.v&&va(this,a);this.je=a;this.ke=null}},pattern:{get:function(){return this.Ks},set:function(a){this.v&&va(this,a);this.Ks=a;this.ke=null}}});zl.prototype.isDark=zl.prototype.Fy;zl.prototype.darkenBy=zl.prototype.Iz;zl.prototype.lightenBy=zl.prototype.FA;zl.prototype.addColorStop=zl.prototype.addColorStop;\nvar wm=216/24389,vm=24389/27,sm=[95.047,100,108.883],zm=null,nm=new fm,ci=new fm,qm=new fm,tm=new fm,gm=!1;zl.className=\"Brush\";var Cl;zl.Solid=Cl=new D(zl,\"Solid\",0);var Fl;zl.Linear=Fl=new D(zl,\"Linear\",1);var Al;zl.Radial=Al=new D(zl,\"Radial\",2);var El;zl.Pattern=El=new D(zl,\"Pattern\",4);var im;zl.Lab=im=new D(zl,\"Lab\",5);var ym;zl.HSL=ym=new D(zl,\"HSL\",6);\nzl.randomColor=function(a,b){void 0===a&&(a=128);void 0===b&&(b=Math.max(a,255));var c=Math.abs(b-a);b=Math.floor(a+Math.random()*c).toString(16);var d=Math.floor(a+Math.random()*c).toString(16);a=Math.floor(a+Math.random()*c).toString(16);2>b.length&&(b=\"0\"+b);2>d.length&&(d=\"0\"+d);2>a.length&&(a=\"0\"+a);return\"#\"+b+d+a};\nzl.isValidColor=function(a){if(\"black\"===a)return!0;if(\"\"===a)return!1;gm||(hm(),gm=!0);var b=zm;if(null===b)return!0;b.fillStyle=\"#000000\";var c=b.fillStyle;b.fillStyle=a;if(b.fillStyle!==c)return!0;b.fillStyle=\"#FFFFFF\";c=b.fillStyle;b.fillStyle=a;return b.fillStyle!==c};zl.lighten=function(a){return km(a)};zl.lightenBy=km;zl.darken=function(a){return lm(a)};zl.darkenBy=lm;zl.mix=mm;zl.isDark=om;function Tl(){this.oa=\"Base\"}Tl.prototype.measure=function(){};\nTl.prototype.IA=function(a,b,c,d,e){a.measure(b,c,d,e)};Tl.prototype.arrange=function(){};Tl.prototype.wz=function(a,b,c,d,e,f){a.arrange(b,c,d,e,f)};Tl.prototype.RA=function(a){a.Bk()};Tl.prototype.mc=function(){};na.Object.defineProperties(Tl.prototype,{name:{get:function(){return this.oa},set:function(a){this.oa=a}},classType:{get:function(){return X}}});Tl.prototype.remeasureObject=Tl.prototype.RA;Tl.prototype.arrangeElement=Tl.prototype.wz;\nTl.prototype.measureElement=Tl.prototype.IA;Tl.className=\"PanelLayout\";function Am(){this.oa=\"Base\"}ma(Am,Tl);\nAm.prototype.measure=function(a,b,c,d,e,f,g){var h=d.length;a=Bm(a);for(var k=0;k<h;k++){var l=d[k];if(l.visible||l===a){var m=l.margin,n=m.right+m.left;m=m.top+m.bottom;l.measure(b,c,f,g);var p=l.measuredBounds;n=Math.max(p.width+n,0);m=Math.max(p.height+m,0);p=l.position.x;var r=l.position.y;isFinite(p)||(p=0);isFinite(r)||(r=0);l instanceof Kf&&l.isGeometryPositioned&&(l=l.strokeWidth/2,p-=l,r-=l);bc(e,p,r,n,m)}}};\nAm.prototype.arrange=function(a,b,c){var d=b.length,e=a.padding;a=c.x-e.left;c=c.y-e.top;for(e=0;e<d;e++){var f=b[e],g=f.measuredBounds,h=f.margin,k=f.position.x,l=f.position.y;k=isNaN(k)?-a:k-a;l=isNaN(l)?-c:l-c;if(f instanceof Kf&&f.isGeometryPositioned){var m=f.strokeWidth/2;k-=m;l-=m}f.visible&&f.arrange(k+h.left,l+h.top,g.width,g.height)}};function Cm(){this.oa=\"Base\"}ma(Cm,Tl);\nCm.prototype.measure=function(a,b,c,d,e,f,g){var h=d.length;b=Ea();f=Bm(a);for(var k=0;k<h;k++){var l=d[k];if(l.visible||l===f){var m=ql(l,!1);if(m!==zg&&m!==bl)b.push(l);else{l.measure(Infinity,c,0,g);m=l.margin;l=l.measuredBounds;var n=Math.max(l.height+m.top+m.bottom,0);e.width+=Math.max(l.width+m.right+m.left,0);e.height=Math.max(e.height,n)}}}d=b.length;a.desiredSize.height?c=Math.min(a.desiredSize.height,a.maxSize.height):0!==e.height&&(c=Math.min(e.height,a.maxSize.height));for(a=0;a<d;a++)if(k=\nb[a],k.visible||k===f)m=k.margin,h=m.right+m.left,m=m.top+m.bottom,k.measure(Infinity,c,0,g),k=k.measuredBounds,m=Math.max(k.height+m,0),e.width+=Math.max(k.width+h,0),e.height=Math.max(e.height,m);Ia(b)};\nCm.prototype.arrange=function(a,b,c){for(var d=b.length,e=a.padding,f=e.top,g=a.isOpposite,h=g?c.width:e.left,k=0;k<d;k++){var l=f,m=b[k];if(m.visible){var n=m.measuredBounds,p=m.margin,r=p.top+p.bottom,q=f+e.bottom,u=n.height,w=ql(m,!1);if(isNaN(m.desiredSize.height)&&w===td||w===cl)u=Math.max(c.height-r-q,0);r=u+r+q;q=m.alignment;q.Mb()&&(q=a.defaultAlignment);q.kb()||(q=zc);g&&(h-=n.width+p.left+p.right);m.arrange(h+q.offsetX+p.left,l+q.offsetY+p.top+(c.height*q.y-r*q.y),n.width,u);g||(h+=n.width+\np.left+p.right)}}};function Dm(){this.oa=\"Base\"}ma(Dm,Tl);\nDm.prototype.measure=function(a,b,c,d,e,f){var g=d.length;c=Ea();for(var h=Bm(a),k=0;k<g;k++){var l=d[k];if(l.visible||l===h){var m=ql(l,!1);if(m!==zg&&m!==cl)c.push(l);else{var n=l.margin;m=n.right+n.left;n=n.top+n.bottom;l.measure(b,Infinity,f,0);l=l.measuredBounds;Sb(e,Math.max(e.width,Math.max(l.width+m,0)),e.height+Math.max(l.height+n,0))}}}d=c.length;if(0!==d){a.desiredSize.width?b=Math.min(a.desiredSize.width,a.maxSize.width):0!==e.width&&(b=Math.min(e.width,a.maxSize.width));for(a=0;a<d;a++)if(k=\nc[a],k.visible||k===h)l=k.margin,g=l.right+l.left,l=l.top+l.bottom,k.measure(b,Infinity,f,0),k=k.measuredBounds,l=Math.max(k.height+l,0),e.width=Math.max(e.width,Math.max(k.width+g,0)),e.height+=l;Ia(c)}};\nDm.prototype.arrange=function(a,b,c){for(var d=b.length,e=a.padding,f=e.left,g=a.isOpposite,h=g?c.height:e.top,k=0;k<d;k++){var l=f,m=b[k];if(m.visible){var n=m.measuredBounds,p=m.margin,r=p.left+p.right,q=f+e.right,u=n.width,w=ql(m,!1);if(isNaN(m.desiredSize.width)&&w===td||w===bl)u=Math.max(c.width-r-q,0);r=u+r+q;q=m.alignment;q.Mb()&&(q=a.defaultAlignment);q.kb()||(q=zc);g&&(h-=n.height+p.bottom+p.top);m.arrange(l+q.offsetX+p.left+(c.width*q.x-r*q.x),h+q.offsetY+p.top,u,n.height);g||(h+=n.height+\np.bottom+p.top)}}};function Em(){this.oa=\"Base\"}ma(Em,Tl);\nEm.prototype.measure=function(a,b,c,d,e,f,g){var h=d.length,k=a.tb(),l=k.margin,m=l.right+l.left,n=l.top+l.bottom;k.measure(b,c,f,g);var p=k.measuredBounds;f=p.width;g=p.height;var r=Math.max(f+m,0);var q=Math.max(g+n,0);for(var u=a.isClipping,w=N.allocAt(-l.left,-l.top,r,q),v=!0,y=Bm(a),z=0;z<h;z++){var A=d[z];if(A!==k&&(A.visible||A===y)){l=A.margin;r=l.right+l.left;q=l.top+l.bottom;p=ql(A,!1);switch(p){case td:b=f;c=g;break;case bl:b=f;break;case cl:c=g}A.measure(b,c,0,0);p=A.measuredBounds;r=\nMath.max(p.width+r,0);q=Math.max(p.height+q,0);var C=A.alignment;C.Mb()&&(C=a.defaultAlignment);C.kb()||(C=zc);var F=A.alignmentFocus;F.Mb()&&(F=zc);var Q=null;A instanceof X&&\"\"!==A.Lg&&(A.arrange(0,0,p.width,p.height),Q=A.bb(A.Lg),Q===A&&(Q=null));if(null!==Q){l=Q.naturalBounds;p=Q.margin;for(l=J.allocAt(F.x*l.width-F.offsetX-p.left,F.y*l.height-F.offsetY-p.top);Q!==A;)Q.transform.ta(l),Q=Q.panel;A=C.x*f+C.offsetX-l.x;p=C.y*g+C.offsetY-l.y;J.free(l)}else A=C.x*f+C.offsetX-(F.x*p.width+F.offsetX)-\nl.left,p=C.y*g+C.offsetY-(F.y*p.height+F.offsetY)-l.top;v?(v=!1,e.h(A,p,r,q)):bc(e,A,p,r,q)}}v?e.assign(w):u?e.bw(w.x,w.y,w.width,w.height):bc(e,w.x,w.y,w.width,w.height);N.free(w);p=k.stretch;p===al&&(p=ql(k,!1));switch(p){case zg:return;case td:if(!isFinite(b)&&!isFinite(c))return;break;case bl:if(!isFinite(b))return;break;case cl:if(!isFinite(c))return}p=k.measuredBounds;f=p.width;g=p.height;r=Math.max(f+m,0);q=Math.max(g+n,0);l=k.margin;w=N.allocAt(-l.left,-l.top,r,q);for(b=0;b<h;b++)c=d[b],c===\nk||!c.visible&&c!==y||(l=c.margin,r=l.right+l.left,q=l.top+l.bottom,p=c.measuredBounds,r=Math.max(p.width+r,0),q=Math.max(p.height+q,0),m=c.alignment,m.Mb()&&(m=a.defaultAlignment),m.kb()||(m=zc),c=c.alignmentFocus,c.Mb()&&(c=zc),v?(v=!1,e.h(m.x*f+m.offsetX-(c.x*p.width+c.offsetX)-l.left,m.y*g+m.offsetY-(c.y*p.height+c.offsetY)-l.top,r,q)):bc(e,m.x*f+m.offsetX-(c.x*p.width+c.offsetX)-l.left,m.y*g+m.offsetY-(c.y*p.height+c.offsetY)-l.top,r,q));v?e.assign(w):u?e.bw(w.x,w.y,w.width,w.height):bc(e,w.x,\nw.y,w.width,w.height);N.free(w)};\nEm.prototype.arrange=function(a,b,c){var d=b.length,e=a.tb(),f=e.measuredBounds,g=f.width;f=f.height;var h=a.padding,k=h.left;h=h.top;var l=k-c.x,m=h-c.y;e.arrange(l,m,g,f);for(var n=0;n<d;n++){var p=b[n];if(p!==e){var r=p.measuredBounds,q=r.width;r=r.height;m=p.alignment;m.Mb()&&(m=a.defaultAlignment);m.kb()||(m=zc);var u=p.alignmentFocus;u.Mb()&&(u=zc);l=null;p instanceof X&&\"\"!==p.Lg&&(l=p.bb(p.Lg),l===p&&(l=null));if(null!==l){var w=l.naturalBounds;for(u=J.allocAt(u.x*w.width-u.offsetX,u.y*w.height-\nu.offsetY);l!==p;)l.transform.ta(u),l=l.panel;l=m.x*g+m.offsetX-u.x;m=m.y*f+m.offsetY-u.y;J.free(u)}else l=m.x*g+m.offsetX-(u.x*q+u.offsetX),m=m.y*f+m.offsetY-(u.y*r+u.offsetY);l-=c.x;m-=c.y;p.visible&&p.arrange(k+l,h+m,q,r)}}};function Fm(){this.oa=\"Base\"}ma(Fm,Tl);\nFm.prototype.measure=function(a,b,c,d,e,f,g){var h=d.length,k=a.tb(),l=k.margin,m=b,n=c,p=l.right+l.left,r=l.top+l.bottom;k.measure(b,c,f,g);l=k.measuredBounds;var q=0,u=null;k instanceof Kf&&(u=k,q=u.strokeWidth*u.scale);var w=Math.max(l.width+p,0);l=Math.max(l.height+r,0);var v=Gm(k),y=v.x*w+v.offsetX;v=v.y*l+v.offsetY;var z=Hm(k),A=z.x*w+z.offsetX;z=z.y*l+z.offsetY;isFinite(b)&&(m=Math.max(Math.abs(y-A)-q,0));isFinite(c)&&(n=Math.max(Math.abs(v-z)-q,0));q=M.alloc();q.h(0,0);a=Bm(a);for(z=0;z<h;z++)v=\nd[z],v===k||!v.visible&&v!==a||(l=v.margin,w=l.right+l.left,y=l.top+l.bottom,v.measure(m,n,0,0),l=v.measuredBounds,w=Math.max(l.width+w,0),l=Math.max(l.height+y,0),q.h(Math.max(w,q.width),Math.max(l,q.height)));if(1===h)e.width=w,e.height=l,M.free(q);else{v=Gm(k);z=Hm(k);h=d=0;z.x!==v.x&&z.y!==v.y&&(d=q.width/Math.abs(z.x-v.x),h=q.height/Math.abs(z.y-v.y));M.free(q);q=0;null!==u&&(q=u.strokeWidth*u.scale,Ag(u)===Bg&&(d=h=Math.max(d,h)));d+=Math.abs(v.offsetX)+Math.abs(z.offsetX)+q;h+=Math.abs(v.offsetY)+\nMath.abs(z.offsetY)+q;u=k.stretch;u===al&&(u=ql(k,!1));switch(u){case zg:g=f=0;break;case td:isFinite(b)&&(d=b);isFinite(c)&&(h=c);break;case bl:isFinite(b)&&(d=b);g=0;break;case cl:f=0,isFinite(c)&&(h=c)}k.Bk();k.measure(d,h,f,g);e.width=k.measuredBounds.width+p;e.height=k.measuredBounds.height+r}};\nFm.prototype.arrange=function(a,b){var c=b.length,d=a.tb(),e=d.measuredBounds,f=N.alloc();f.h(0,0,1,1);var g=d.margin,h=g.left;g=g.top;var k=a.padding,l=k.left;k=k.top;d.arrange(l+h,k+g,e.width,e.height);var m=Gm(d),n=Hm(d),p=m.y*e.height+m.offsetY,r=n.x*e.width+n.offsetX;n=n.y*e.height+n.offsetY;f.x=m.x*e.width+m.offsetX;f.y=p;bc(f,r,n,0,0);f.x+=h+l;f.y+=g+k;for(e=0;e<c;e++)h=b[e],h!==d&&(l=h.measuredBounds,g=h.margin,k=Math.max(l.width+g.right+g.left,0),m=Math.max(l.height+g.top+g.bottom,0),p=h.alignment,\np.Mb()&&(p=a.defaultAlignment),p.kb()||(p=zc),k=f.width*p.x+p.offsetX-k*p.x+g.left+f.x,g=f.height*p.y+p.offsetY-m*p.y+g.top+f.y,h.visible&&(cc(f.x,f.y,f.width,f.height,k,g,l.width,l.height)?h.arrange(k,g,l.width,l.height):h.arrange(k,g,l.width,l.height,new N(f.x,f.y,f.width,f.height))));N.free(f)};function Im(){this.oa=\"Base\";this.name=\"Table\"}ma(Im,Tl);\nIm.prototype.measure=function(a,b,c,d,e){for(var f=d.length,g=Ea(),h=Ea(),k=0;k<f;k++){var l=d[k],m=l instanceof X?l:null;if(null===m||m.type!==X.TableRow&&m.type!==X.TableColumn||!l.visible)g.push(l);else{h.push(m);for(var n=m.W.j,p=n.length,r=0;r<p;r++){var q=n[r];m.type===X.TableRow?q.row=l.row:m.type===X.TableColumn&&(q.column=l.column);g.push(q)}}}f=g.length;0===f&&(a.getRowDefinition(0),a.getColumnDefinition(0));for(var u=[],w=0;w<f;w++){var v=g[w];pj(v,!0);rl(v,!0);u[v.row]||(u[v.row]=[]);\nu[v.row][v.column]||(u[v.row][v.column]=[]);u[v.row][v.column].push(v)}Ia(g);var y=Ea(),z=Ea(),A=Ea(),C={count:0},F={count:0},Q=b,K=c,T=a.qb;f=T.length;for(var P=0;P<f;P++){var I=T[P];void 0!==I&&(I.actual=0)}T=a.nb;f=T.length;for(var ja=0;ja<f;ja++)I=T[ja],void 0!==I&&(I.actual=0);for(var ba=u.length,qa=0,Ma=0;Ma<ba;Ma++)u[Ma]&&(qa=Math.max(qa,u[Ma].length));var eb=Math.min(a.topIndex,ba-1),Ga=Math.min(a.leftIndex,qa-1),Ha=0;ba=u.length;for(var Ad=Bm(a),Xb=0;Xb<ba;Xb++)if(u[Xb]){qa=u[Xb].length;\nvar Yb=a.getRowDefinition(Xb);Yb.actual=0;for(var fb=Yb.bc=0;fb<qa;fb++)if(u[Xb][fb]){var Bd=a.getColumnDefinition(fb);void 0===y[fb]&&(Bd.actual=0,Bd.bc=0,y[fb]=!0);for(var gg=u[Xb][fb],hg=gg.length,Le=0;Le<hg;Le++){var Db=gg[Le];if(Db.visible||Db===Ad){var yh=1<Db.rowSpan||1<Db.columnSpan;yh&&(Xb<eb||fb<Ga||z.push(Db));var ig=Db.margin,zh=ig.right+ig.left,Ah=ig.top+ig.bottom;var bb=Jl(Db,Yb,Bd,!1);var Ji=Db.desiredSize,ik=!isNaN(Ji.height),jg=!isNaN(Ji.width)&&ik;yh||bb===zg||jg||Xb<eb||fb<Ga||\n(void 0!==C[fb]||bb!==td&&bb!==bl||(C[fb]=-1,C.count++),void 0!==F[Xb]||bb!==td&&bb!==cl||(F[Xb]=-1,F.count++),A.push(Db));Db.measure(Infinity,Infinity,0,0);if(!(Xb<eb||fb<Ga)){var md=Db.measuredBounds,nc=Math.max(md.width+zh,0),Ef=Math.max(md.height+Ah,0);if(1===Db.rowSpan&&(bb===zg||bb===bl)){I=a.getRowDefinition(Xb);var wc=I.wc();Ha=Math.max(Ef-I.actual,0);Ha+wc>K&&(Ha=Math.max(K-wc,0));var kg=0===I.ha;I.bc=I.bc+Ha;I.actual=I.ha+Ha;K=Math.max(K-(Ha+(kg?wc:0)),0)}if(1===Db.columnSpan&&(bb===zg||\nbb===cl)){I=a.getColumnDefinition(fb);var Bh=I.wc();Ha=Math.max(nc-I.actual,0);Ha+Bh>Q&&(Ha=Math.max(Q-Bh,0));var Bn=0===I.ha;I.bc=I.bc+Ha;I.actual=I.ha+Ha;Q=Math.max(Q-(Ha+(Bn?Bh:0)),0)}yh&&Db.Bk()}}}}}Ia(y);var Jd=0,ne=0;f=a.columnCount;for(var lg=0;lg<f;lg++){var mg=a.nb[lg];void 0!==mg&&(Jd+=mg.bc,0!==mg.bc&&(Jd+=mg.wc()))}f=a.rowCount;for(var Xc=0;Xc<f;Xc++){var oe=a.qb[Xc];void 0!==oe&&(ne+=oe.bc,0!==oe.bc&&(ne+=oe.wc()))}Q=Math.max(b-Jd,0);var ec=K=Math.max(c-ne,0),Ch=Q;f=A.length;for(var Dh=\n0;Dh<f;Dh++){var Yc=A[Dh],Ki=a.getRowDefinition(Yc.row),pe=a.getColumnDefinition(Yc.column),ff=Yc.measuredBounds,Cd=Yc.margin,jk=Cd.right+Cd.left,Cn=Cd.top+Cd.bottom;C[Yc.column]=0===pe.bc&&void 0!==C[Yc.column]?Math.max(ff.width+jk,C[Yc.column]):null;F[Yc.row]=0===Ki.bc&&void 0!==F[Yc.row]?Math.max(ff.height+Cn,F[Yc.row]):null}var Ff=0,Eb=0,Kd;for(Kd in F)\"count\"!==Kd&&(Ff+=F[Kd]);for(Kd in C)\"count\"!==Kd&&(Eb+=C[Kd]);for(var gb=M.alloc(),Li=0;Li<f;Li++){var Zb=A[Li];if(Zb.visible||Zb===Ad){var xc=\na.getRowDefinition(Zb.row),oc=a.getColumnDefinition(Zb.column),Ld=0;isFinite(oc.width)?Ld=oc.width:(isFinite(Q)&&null!==C[Zb.column]?0===Eb?Ld=oc.actual+Q:Ld=C[Zb.column]/Eb*Ch:null!==C[Zb.column]?Ld=Q:Ld=oc.actual||Q,Ld=Math.max(0,Ld-oc.wc()));var Md=0;isFinite(xc.height)?Md=xc.height:(isFinite(K)&&null!==F[Zb.row]?0===Ff?Md=xc.actual+K:Md=F[Zb.row]/Ff*ec:null!==F[Zb.row]?Md=K:Md=xc.actual||K,Md=Math.max(0,Md-xc.wc()));gb.h(Math.max(oc.minimum,Math.min(Ld,oc.maximum)),Math.max(xc.minimum,Math.min(Md,\nxc.maximum)));bb=Jl(Zb,xc,oc,!1);switch(bb){case bl:gb.height=Math.max(gb.height,xc.actual+K);break;case cl:gb.width=Math.max(gb.width,oc.actual+Q)}var ng=Zb.margin,Fc=ng.right+ng.left,Eh=ng.top+ng.bottom;Zb.Bk();Zb.measure(gb.width,gb.height,oc.minimum,xc.minimum);var og=Zb.measuredBounds,Nd=Math.max(og.width+Fc,0),Fh=Math.max(og.height+Eh,0);isFinite(Q)&&(Nd=Math.min(Nd,gb.width));isFinite(K)&&(Fh=Math.min(Fh,gb.height));var gf=0;gf=xc.actual;xc.actual=Math.max(xc.actual,Fh);xc.bc=Math.max(xc.bc,\nFh);Ha=xc.actual-gf;K=Math.max(K-Ha,0);null===F[Zb.row]&&(ec=Math.max(ec-Ha,0));gf=oc.actual;oc.actual=Math.max(oc.actual,Nd);oc.bc=Math.max(oc.bc,Nd);Ha=oc.actual-gf;Q=Math.max(Q-Ha,0);null===C[Zb.column]&&(Ch=Math.max(Ch-Ha,0))}}Ia(A);var Od=M.alloc(),Pd=Ea(),Qd=Ea();f=z.length;if(0!==f)for(var Me=0;Me<ba;Me++)if(u[Me]){qa=u[Me].length;var Gh=a.getRowDefinition(Me);Pd[Me]=Gh.actual;for(var qe=0;qe<qa;qe++)if(u[Me][qe]){var Dn=a.getColumnDefinition(qe);Qd[qe]=Dn.actual}}for(var fc=0;fc<f;fc++){var Oa=\nz[fc];if(Oa.visible||Oa===Ad){var gc=a.getRowDefinition(Oa.row),Rd=a.getColumnDefinition(Oa.column);gb.h(Math.max(Rd.minimum,Math.min(b,Rd.maximum)),Math.max(gc.minimum,Math.min(c,gc.maximum)));bb=Jl(Oa,gc,Rd,!1);switch(bb){case td:0!==Qd[Rd.index]&&(gb.width=Math.min(gb.width,Qd[Rd.index]));0!==Pd[gc.index]&&(gb.height=Math.min(gb.height,Pd[gc.index]));break;case bl:0!==Qd[Rd.index]&&(gb.width=Math.min(gb.width,Qd[Rd.index]));break;case cl:0!==Pd[gc.index]&&(gb.height=Math.min(gb.height,Pd[gc.index]))}isFinite(Rd.width)&&\n(gb.width=Rd.width);isFinite(gc.height)&&(gb.height=gc.height);Od.h(0,0);for(var Ne=Rd.minimum,Hh=gc.minimum,Oe=1;Oe<Oa.rowSpan&&!(Oa.row+Oe>=a.rowCount);Oe++)I=a.getRowDefinition(Oa.row+Oe),Ha=0,Ha=bb===td||bb===cl?Math.max(I.minimum,0===Pd[Oa.row+Oe]?I.maximum:Math.min(Pd[Oa.row+Oe],I.maximum)):Math.max(I.minimum,isNaN(I.ad)?I.maximum:Math.min(I.ad,I.maximum)),Od.height+=Ha,Hh+=I.minimum;for(var Pc=1;Pc<Oa.columnSpan&&!(Oa.column+Pc>=a.columnCount);Pc++)I=a.getColumnDefinition(Oa.column+Pc),Ha=\n0,Ha=bb===td||bb===bl?Math.max(I.minimum,0===Qd[Oa.column+Pc]?I.maximum:Math.min(Qd[Oa.column+Pc],I.maximum)):Math.max(I.minimum,isNaN(I.ad)?I.maximum:Math.min(I.ad,I.maximum)),Od.width+=Ha,Ne+=I.minimum;gb.width+=Od.width;gb.height+=Od.height;var hf=Oa.margin,Ih=hf.right+hf.left,En=hf.top+hf.bottom;Oa.measure(gb.width,gb.height,Ne,Hh);for(var pg=Oa.measuredBounds,nd=Math.max(pg.width+Ih,0),Sd=Math.max(pg.height+En,0),re=0,se=0;se<Oa.rowSpan&&!(Oa.row+se>=a.rowCount);se++)I=a.getRowDefinition(Oa.row+\nse),re+=I.total||0;if(re<Sd){var Td=Sd-re,te=Sd-re;if(null!==Oa.spanAllocation)for(var kk=Oa.spanAllocation,Pe=0;Pe<Oa.rowSpan&&!(0>=Td)&&!(Oa.row+Pe>=a.rowCount);Pe++){I=a.getRowDefinition(Oa.row+Pe);var Mi=I.ha||0,Fn=kk(Oa,I,te);I.actual=Math.min(I.maximum,Mi+Fn);I.ha!==Mi&&(Td-=I.ha-Mi)}for(;0<Td;){var od=I.ha||0;isNaN(I.height)&&I.maximum>od&&(I.actual=Math.min(I.maximum,od+Td),I.ha!==od&&(Td-=I.ha-od));if(0===I.index)break;I=a.getRowDefinition(I.index-1)}}for(var Gf=0,Jh=0;Jh<Oa.columnSpan&&\n!(Oa.column+Jh>=a.columnCount);Jh++)I=a.getColumnDefinition(Oa.column+Jh),Gf+=I.total||0;if(Gf<nd){var qg=nd-Gf,eu=nd-Gf;if(null!==Oa.spanAllocation)for(var fu=Oa.spanAllocation,lk=0;lk<Oa.columnSpan&&!(0>=qg)&&!(Oa.column+lk>=a.columnCount);lk++){I=a.getColumnDefinition(Oa.column+lk);var Gn=I.ha||0,gu=fu(Oa,I,eu);I.actual=Math.min(I.maximum,Gn+gu);I.ha!==Gn&&(qg-=I.ha-Gn)}for(;0<qg;){var mk=I.ha||0;isNaN(I.width)&&I.maximum>mk&&(I.actual=Math.min(I.maximum,mk+qg),I.ha!==mk&&(qg-=I.ha-mk));if(0===\nI.index)break;I=a.getColumnDefinition(I.index-1)}}}}Ia(z);M.free(Od);M.free(gb);void 0!==Pd&&Ia(Pd);void 0!==Qd&&Ia(Qd);var rg=0,sg=0,nk=a.desiredSize,sr=a.maxSize;bb=ql(a,!0);var Ni=ne=Jd=0,Oi=0;f=a.columnCount;for(var ok=0;ok<f;ok++)void 0!==a.nb[ok]&&(I=a.getColumnDefinition(ok),isFinite(I.width)?(Ni+=I.width,Ni+=I.wc()):Jm(I)===Km?(Ni+=I.ha,Ni+=I.wc()):0!==I.ha&&(Jd+=I.ha,Jd+=I.wc()));isFinite(nk.width)?rg=Math.min(nk.width,sr.width):rg=bb!==zg&&isFinite(b)?b:Jd;rg=Math.max(rg,a.minSize.width);\nrg=Math.max(rg-Ni,0);for(var hu=0===Jd?1:Math.max(rg/Jd,1),qk=0;qk<f;qk++)void 0!==a.nb[qk]&&(I=a.getColumnDefinition(qk),isFinite(I.width)||Jm(I)===Km||(I.actual=I.ha*hu),I.position=e.width,0!==I.ha&&(e.width+=I.ha,e.width+=I.wc()));f=a.rowCount;for(var rk=0;rk<f;rk++)void 0!==a.qb[rk]&&(I=a.getRowDefinition(rk),isFinite(I.height)?(Oi+=I.height,Oi+=I.wc()):Jm(I)===Km?(Oi+=I.ha,Oi+=I.wc()):0!==I.ha&&(ne+=I.ha,0!==I.ha&&(ne+=I.wc())));isFinite(nk.height)?sg=Math.min(nk.height,sr.height):sg=bb!==zg&&\nisFinite(c)?c:ne;sg=Math.max(sg,a.minSize.height);sg=Math.max(sg-Oi,0);for(var iu=0===ne?1:Math.max(sg/ne,1),sk=0;sk<f;sk++)void 0!==a.qb[sk]&&(I=a.getRowDefinition(sk),isFinite(I.height)||Jm(I)===Km||(I.actual=I.ha*iu),I.position=e.height,0!==I.ha&&(e.height+=I.ha,0!==I.ha&&(e.height+=I.wc())));f=h.length;for(var Hn=0;Hn<f;Hn++){var pd=h[Hn],In=0,Jn=0;pd.type===X.TableRow?(In=e.width,I=a.getRowDefinition(pd.row),Jn=I.actual):(I=a.getColumnDefinition(pd.column),In=I.actual,Jn=e.height);pd.measuredBounds.h(0,\n0,In,Jn);pj(pd,!1);u[pd.row]||(u[pd.row]=[]);u[pd.row][pd.column]||(u[pd.row][pd.column]=[]);u[pd.row][pd.column].push(pd)}Ia(h);a.Lp=u};\nIm.prototype.arrange=function(a,b,c){var d=b.length,e=a.padding,f=e.left;e=e.top;for(var g=a.Lp,h,k,l=g.length,m=0,n=0;n<l;n++)g[n]&&(m=Math.max(m,g[n].length));for(n=Math.min(a.topIndex,l-1);n!==l&&(void 0===a.qb[n]||0===a.qb[n].ha);)n++;n=Math.min(n,l-1);n=-a.qb[n].position;for(h=Math.min(a.leftIndex,m-1);h!==m&&(void 0===a.nb[h]||0===a.nb[h].ha);)h++;h=Math.min(h,m-1);for(var p=-a.nb[h].position,r=M.alloc(),q=0;q<l;q++)if(g[q]){m=g[q].length;var u=a.getRowDefinition(q);k=u.position+n+e;0!==u.ha&&\n(k+=u.Jv());for(var w=0;w<m;w++)if(g[q][w]){var v=a.getColumnDefinition(w);h=v.position+p+f;0!==v.ha&&(h+=v.Jv());for(var y=g[q][w],z=y.length,A=0;A<z;A++){var C=y[A],F=C.measuredBounds,Q=C instanceof X?C:null;if(null===Q||Q.type!==X.TableRow&&Q.type!==X.TableColumn){r.h(0,0);for(var K=1;K<C.rowSpan&&!(q+K>=a.rowCount);K++)Q=a.getRowDefinition(q+K),r.height+=Q.total;for(K=1;K<C.columnSpan&&!(w+K>=a.columnCount);K++)Q=a.getColumnDefinition(w+K),r.width+=Q.total;var T=v.ha+r.width,P=u.ha+r.height;K=\nh;Q=k;var I=T,ja=P,ba=h,qa=k,Ma=T,eb=P;h+T>c.width&&(Ma=Math.max(c.width-h,0));k+P>c.height&&(eb=Math.max(c.height-k,0));var Ga=C.alignment;if(Ga.Mb()){Ga=a.defaultAlignment;Ga.kb()||(Ga=zc);var Ha=Ga.x;var Ad=Ga.y;var Xb=Ga.offsetX;Ga=Ga.offsetY;var Yb=v.alignment,fb=u.alignment;Yb.kb()&&(Ha=Yb.x,Xb=Yb.offsetX);fb.kb()&&(Ad=fb.y,Ga=fb.offsetY)}else Ha=Ga.x,Ad=Ga.y,Xb=Ga.offsetX,Ga=Ga.offsetY;if(isNaN(Ha)||isNaN(Ad))Ad=Ha=.5,Ga=Xb=0;Yb=F.width;fb=F.height;var Bd=C.margin,gg=Bd.left+Bd.right,hg=Bd.top+\nBd.bottom,Le=Jl(C,u,v,!1);!isNaN(C.desiredSize.width)||Le!==td&&Le!==bl||(Yb=Math.max(T-gg,0));!isNaN(C.desiredSize.height)||Le!==td&&Le!==cl||(fb=Math.max(P-hg,0));T=C.maxSize;P=C.minSize;Yb=Math.min(T.width,Yb);fb=Math.min(T.height,fb);Yb=Math.max(P.width,Yb);fb=Math.max(P.height,fb);T=fb+hg;K+=I*Ha-(Yb+gg)*Ha+Xb+Bd.left;Q+=ja*Ad-T*Ad+Ga+Bd.top;C.visible&&(cc(ba,qa,Ma,eb,K,Q,F.width,F.height)?C.arrange(K,Q,Yb,fb):C.arrange(K,Q,Yb,fb,new N(ba,qa,Ma,eb)))}else C.Fl(),C.actualBounds.ea(),I=C.actualBounds,\nK=N.allocAt(I.x,I.y,I.width,I.height),I.x=Q.type===X.TableRow?f:h,I.y=Q.type===X.TableColumn?e:k,I.width=F.width,I.height=F.height,C.actualBounds.freeze(),rl(C,!1),Vb(K,I)||(F=C.part,null!==F&&(F.Oh(),C.mp(F))),N.free(K)}}}M.free(r);for(a=0;a<d;a++)c=b[a],f=c instanceof X?c:null,null===f||f.type!==X.TableRow&&f.type!==X.TableColumn||(f=c.actualBounds,c.naturalBounds.ea(),c.naturalBounds.h(0,0,f.width,f.height),c.naturalBounds.freeze())};function Lm(){this.oa=\"Base\"}ma(Lm,Tl);\nLm.prototype.measure=function(){};Lm.prototype.arrange=function(){};function Mm(){this.oa=\"Base\"}ma(Mm,Tl);Mm.prototype.measure=function(){};Mm.prototype.arrange=function(){};function Nm(){this.oa=\"Base\"}ma(Nm,Tl);\nNm.prototype.measure=function(a,b,c,d,e,f,g){1<d.length&&B(\"Viewbox Panel cannot contain more than one GraphObject.\");d=d[0];d.Aa=1;d.Bk();d.measure(Infinity,Infinity,f,g);var h=d.measuredBounds,k=d.margin,l=k.right+k.left;k=k.top+k.bottom;if(isFinite(b)||isFinite(c)){var m=d.scale,n=h.width;h=h.height;var p=Math.max(b-l,0),r=Math.max(c-k,0),q=1;a.viewboxStretch===Bg?0!==n&&0!==h&&(q=Math.min(p/n,r/h)):0!==n&&0!==h&&(q=Math.max(p/n,r/h));0===q&&(q=1E-4);d.Aa*=q;m!==d.scale&&(pj(d,!0),d.measure(Infinity,\nInfinity,f,g))}h=d.measuredBounds;e.width=isFinite(b)?b:Math.max(h.width+l,0);e.height=isFinite(c)?c:Math.max(h.height+k,0)};Nm.prototype.arrange=function(a,b,c){b=b[0];var d=b.measuredBounds,e=b.margin,f=Math.max(d.width+(e.right+e.left),0);e=Math.max(d.height+(e.top+e.bottom),0);var g=b.alignment;g.Mb()&&(g=a.defaultAlignment);g.kb()||(g=zc);b.arrange(c.width*g.x-f*g.x+g.offsetX,c.height*g.y-e*g.y+g.offsetY,d.width,d.height)};function Om(){this.oa=\"Base\"}ma(Om,Tl);Om.prototype.measure=function(){};\nOm.prototype.arrange=function(){};\nOm.prototype.mc=function(a,b,c){c=a.Af()*c.scale;0>=c&&(c=1);var d=a.gridCellSize,e=d.width;d=d.height;var f=a.naturalBounds,g=a.actualBounds,h=f.width,k=f.height,l=Math.ceil(h/e),m=Math.ceil(k/d),n=a.gridOrigin,p=n.x;n=n.y;b.save();b.beginPath();b.rect(0,0,h,k);b.clip();for(var r=[],q=a.W.j,u=q.length,w=0;w<u;w++){var v=q[w],y=[];r.push(y);if(v.visible){var z=v.interval;if(!(0>z)){v=Zj(v.figure);for(var A=0;A<u;A++)if(A!==w){var C=q[A];C.visible&&Zj(C.figure)===v&&(C=C.interval,C>z&&y.push(C))}}}}q=\na.W.j;u=q.length;for(w=0;w<u;w++){var F=q[w];if(F.visible&&(y=F.interval||1,v=Math.abs(y),!(2>e*v*c))){z=F.segmentIndex;if(!isFinite(z)||isNaN(z))z=0;0>z&&(z=v-Math.min(-z,v));z=Math.round(z%v);v=F.opacity;A=1;if(1!==v){if(0===v)continue;A=b.globalAlpha;b.globalAlpha=A*v}C=r[w];var Q=!1,K=F.strokeDashArray;null!==K&&(Q=!0,b.Ft(K,F.strokeDashOffset));if(\"LineV\"===F.figure&&null!==F.stroke&&0<F.strokeWidth){b.lineWidth=F.strokeWidth;ni(a,b,F.stroke,!1,!1,f,g);b.beginPath();for(K=F=Math.floor((p-e)/\ne);K<=F+l;K++){var T=K*e+p;0<=T&&T<=h&&Pm(K,y,z,C)&&(b.moveTo(T,0),b.lineTo(T,k))}b.stroke()}else if(\"LineH\"===F.figure&&null!==F.stroke&&0<F.strokeWidth){b.lineWidth=F.strokeWidth;ni(a,b,F.stroke,!1,!1,f,g);b.beginPath();for(K=F=Math.floor((n-d)/d);K<=F+m;K++)T=K*d+n,0<=T&&T<=k&&Pm(K,y,z,C)&&(b.moveTo(0,T),b.lineTo(h,T));b.stroke()}else if(\"BarV\"===F.figure&&null!==F.fill)for(ni(a,b,F.fill,!0,!1,f,g),F=F.width,isNaN(F)&&(F=e),T=K=Math.floor((p-e)/e);T<=K+l;T++){var P=T*e+p;0<=P+F&&P<=h&&Pm(T,y,z,\nC)&&b.fillRect(P,0,F,k)}else if(\"BarH\"===F.figure&&null!==F.fill)for(ni(a,b,F.fill,!0,!1,f,g),F=F.height,isNaN(F)&&(F=d),T=K=Math.floor((n-d)/d);T<=K+m;T++)P=T*d+n,0<=P+F&&P<=k&&Pm(T,y,z,C)&&b.fillRect(0,P,h,F);Q&&b.Dt();1!==v&&(b.globalAlpha=A)}}b.restore();b.uc(!1)};function Pm(a,b,c,d){if(0>b)return a%b===c;if(a%b!==c)return!1;b=d.length;for(var e=0;e<b;e++)if(a%d[e]===c)return!1;return!0}function Qm(){this.oa=\"Base\"}ma(Qm,Tl);\nQm.prototype.measure=function(a,b,c,d,e){c=d.length;if(a instanceof Je||a instanceof S){var f=null,g=null,h=null;a instanceof S&&(g=f=a);a instanceof Je&&(h=a,f=h.adornedPart);if(f instanceof S){var k=f;if(0===c)Sb(a.naturalBounds,0,0),a.measuredBounds.h(0,0,0,0);else{var l=a instanceof Je?null:f.path,m=f.routeBounds;b=a.xg;b.h(0,0,m.width,m.height);var n=k.points;f=f.pointsCount;null!==h?h.Gk(!1):null!==g&&g.Gk(!1);var p=m.width,r=m.height;a.location.h(m.x,m.y);a.l.length=0;null!==l&&(Rm(a,p,r,l),\nh=l.measuredBounds,b.Rc(h),a.l.push(h));h=ld.alloc();for(var q=J.alloc(),u=J.alloc(),w=0;w<c;w++){var v=d[w];if(v!==l)if(v.isPanelMain&&v instanceof Kf){Rm(a,p,r,v);var y=v.measuredBounds;b.Rc(y);a.l.push(y)}else if(2>f)v.measure(Infinity,Infinity,0,0),y=v.measuredBounds,b.Rc(y),a.l.push(y);else{var z=v.segmentIndex,A=v.segmentFraction,C=v.alignmentFocus;C.nc()&&(C=zc);var F=v.segmentOrientation,Q=v.segmentOffset;if(isNaN(z)){var K=k.na;y=Ea();K.Yv(A,y);var T=J.allocAt(y[0],y[1]);T.add(k.i(0));K.type===\nud?T.offset(-K.startX,-K.startY):(K=K.figures.first(),T.offset(-K.startX,-K.startY));K=y[2];if(F!==ag){var P=k.computeAngle(v,F,K);v.Yb=P}P=T.x-m.x;var I=T.y-m.y;J.free(T);Ia(y)}else if(z<-f||z>=f)I=k.midPoint,K=k.midAngle,F!==ag&&(P=k.computeAngle(v,F,K),v.Yb=P),P=I.x-m.x,I=I.y-m.y;else{P=0;0<=z?(I=n.J(z),y=z<f-1?n.J(z+1):I):(P=f+z,I=n.J(P),y=0<P?n.J(P-1):I);if(I.Qa(y)){0<=z?(K=0<z?n.J(z-1):I,P=z<f-2?n.J(z+2):y):(K=P<f-1?n.J(P+1):I,P=1<P?n.J(P-2):y);T=K.Ie(I);var ja=y.Ie(P);K=T>ja+10?0<=z?K.Pa(I):\nI.Pa(K):ja>T+10?0<=z?y.Pa(P):P.Pa(y):0<=z?K.Pa(P):P.Pa(K)}else K=0<=z?I.Pa(y):y.Pa(I);F!==ag&&(P=k.computeAngle(v,F,K),v.Yb=P);P=I.x+(y.x-I.x)*A-m.x;I=I.y+(y.y-I.y)*A-m.y}v.measure(Infinity,Infinity,0,0);y=v.measuredBounds;T=v.naturalBounds;var ba=0;v instanceof Kf&&(ba=v.strokeWidth);ja=T.width+ba;var qa=T.height+ba;h.reset();h.translate(-y.x,-y.y);h.scale(v.scale,v.scale);h.rotate(F===ag?v.angle:K,ja/2,qa/2);F!==Sm&&F!==Tm||h.rotate(90,ja/2,qa/2);F!==Um&&F!==Vm||h.rotate(-90,ja/2,qa/2);F===Wm&&\n(45<K&&135>K||225<K&&315>K)&&h.rotate(-K,ja/2,qa/2);T=new N(0,0,ja,qa);q.tj(T,C);h.ta(q);C=-q.x+ba/2*v.scale;v=-q.y+ba/2*v.scale;u.assign(Q);ba=isNaN(Q.x);var Ma=isNaN(Q.y);if(ba||Ma){ja=ja/2+3;qa=qa/2+3;var eb=45<=K&&135>=K,Ga=225<=K&&315>=K;F===ag&&(eb||Ga)?(u.x=Ma?ja:Q.y,u.y=ba?qa:Q.x,eb?0<=z||isNaN(z)&&.5>A||!ba||(u.y=-qa):Ga&&((0<=z||isNaN(z)&&.5>A)&&ba&&(u.y=-qa),Ma&&(u.x=-ja))):(ba&&(u.x=0<=z||isNaN(z)&&.5>A?ja:-ja),Ma&&(u.y=-qa),u.rotate(K))}else u.rotate(K);P+=u.x;I+=u.y;T.set(y);T.h(P+C,\nI+v,y.width,y.height);a.l.push(T);b.Rc(T)}}if(null!==g)for(d=g.labelNodes;d.next();)d.value.measure(Infinity,Infinity);a.xg=b;a=a.location;a.h(a.x+b.x,a.y+b.y);Sb(e,b.width||0,b.height||0);ld.free(h);J.free(q);J.free(u)}}}};\nQm.prototype.arrange=function(a,b){var c=b.length;if(a instanceof Je||a instanceof S){var d=null,e=null,f=null;a instanceof S&&(e=d=a);a instanceof Je&&(f=a,d=f.adornedPart);var g=a instanceof Je?null:d.path;if(0!==a.l.length){var h=a.l,k=0;if(null!==g&&k<a.l.length){var l=h[k];k++;g.arrange(l.x-a.xg.x,l.y-a.xg.y,l.width,l.height)}for(l=0;l<c;l++){var m=b[l];if(m!==g&&k<a.l.length){var n=h[k];k++;m.arrange(n.x-a.xg.x,n.y-a.xg.y,n.width,n.height)}}}b=d.points;c=b.count;if(2<=c&&a instanceof S)for(d=\na.labelNodes;d.next();){var p=a;g=d.value;h=g.segmentIndex;k=g.segmentFraction;var r=g.alignmentFocus;l=g.segmentOrientation;m=g.segmentOffset;if(isNaN(h)){n=p.na;var q=Ea();n.Yv(k,q);var u=J.allocAt(q[0],q[1]);u.add(p.i(0));n.type===ud?u.offset(-n.startX,-n.startY):(n=n.figures.first(),u.offset(-n.startX,-n.startY));n=q[2];l!==ag&&(p=p.computeAngle(g,l,n),g.angle=p);p=u.x;var w=u.y;J.free(u);Ia(q)}else if(h<-c||h>=c)w=p.midPoint,n=p.midAngle,l!==ag&&(p=p.computeAngle(g,l,n),g.angle=p),p=w.x,w=w.y;\nelse{u=0;0<=h?(q=b.j[h],w=h<c-1?b.j[h+1]:q):(u=c+h,q=b.j[u],w=0<u?b.j[u-1]:q);if(q.Qa(w)){0<=h?(n=0<h?b.j[h-1]:q,u=h<c-2?b.j[h+2]:w):(n=u<c-1?b.j[u+1]:q,u=1<u?b.j[u-2]:w);var v=n.Ie(q),y=w.Ie(u);n=v>y+10?0<=h?n.Pa(q):q.Pa(n):y>v+10?0<=h?w.Pa(u):u.Pa(w):0<=h?n.Pa(u):u.Pa(n)}else n=0<=h?q.Pa(w):w.Pa(q);l!==ag&&(p=p.computeAngle(g,l,n),g.angle=p);p=q.x+(w.x-q.x)*k;w=q.y+(w.y-q.y)*k}if(r.Vt())g.location=new J(p,w);else{r.nc()&&(r=zc);q=ld.alloc();q.reset();q.scale(g.scale,g.scale);q.rotate(g.angle,0,\n0);var z=g.naturalBounds;u=N.allocAt(0,0,z.width,z.height);v=J.alloc();v.tj(u,r);q.ta(v);r=-v.x;y=-v.y;var A=z.width,C=z.height;z=J.alloc();z.assign(m);var F=isNaN(m.x),Q=isNaN(m.y);if(F||Q){A=A/2+3;C=C/2+3;var K=45<=n&&135>=n,T=225<=n&&315>=n;l===ag&&(K||T)?(z.x=Q?A:m.y,z.y=F?C:m.x,K?0<=h||isNaN(h)&&.5>k||!F||(z.y=-C):T&&((0<=h||isNaN(h)&&.5>k)&&F&&(z.y=-C),Q&&(z.x=-A))):(F&&(z.x=0<=h||isNaN(h)&&.5>k?A:-A),Q&&(z.y=-C),z.rotate(n))}else z.rotate(n);p+=z.x;w+=z.y;q.Pw(u);r+=u.x;y+=u.y;h=J.allocAt(p+\nr,w+y);g.move(h);J.free(h);J.free(z);J.free(v);N.free(u);ld.free(q)}}null!==f?f.Gk(!1):null!==e&&e.Gk(!1)}};\nfunction Rm(a,b,c,d){if(!1!==uj(d)){var e=d.strokeWidth;0===e&&a instanceof Je&&a.type===X.Link&&a.adornedObject instanceof Kf&&(e=a.adornedObject.strokeWidth);e*=d.Aa;a instanceof S&&null!==a.na?(a=a.na.bounds,nl(d,a.x-e/2,a.y-e/2,a.width+e,a.height+e)):a instanceof Je&&null!==a.adornedPart.na?(a=a.adornedPart.na.bounds,nl(d,a.x-e/2,a.y-e/2,a.width+e,a.height+e)):nl(d,-(e/2),-(e/2),b+e,c+e);pj(d,!1)}}function Xm(){this.oa=\"Base\"}ma(Xm,Tl);\nXm.prototype.measure=function(a,b,c,d,e,f,g){var h=a.tb();a.dh=[];var k=h.margin,l=k.right+k.left,m=k.top+k.bottom;h.measure(b,c,f,g);var n=h.measuredBounds,p=new N(-k.left,-k.top,Math.max(n.width+l,0),Math.max(n.height+m,0));a.dh.push(p);e.assign(p);for(var r=h.geometry,q=h.strokeWidth,u=r.flattenedSegments,w=r.flattenedLengths,v=r.flattenedTotalLength,y=u.length,z=0,A=0,C=Ea(),F=0;F<y;F++){var Q=u[F],K=[];A=z=0;for(var T=Q.length,P=0;P<T;P+=2){var I=Q[P],ja=Q[P+1];if(0!==P){var ba=180*Math.atan2(ja-\nA,I-z)/Math.PI;0>ba&&(ba+=360);K.push(ba)}z=I;A=ja}C.push(K)}if(null===a.eh){for(var qa=[],Ma=a.W.j,eb=Ma.length,Ga=0;Ga<eb;Ga++){var Ha=Ma[Ga],Ad=[];qa.push(Ad);if(Ha.visible){var Xb=Ha.interval;if(!(0>Xb))for(var Yb=0;Yb<eb;Yb++)if(Yb!==Ga){var fb=Ma[Yb];if(fb.visible&&Ha.constructor===fb.constructor){var Bd=fb.interval;Bd>Xb&&Ad.push(Bd)}}}}a.eh=qa}var gg=a.eh;var hg=a.W.j,Le=hg.length,Db=0,yh=0,ig=v;a.Mj=[];for(var zh,Ah=0;Ah<Le;Ah++){var bb=hg[Ah];zh=[];if(bb.visible&&bb!==h){var Ji=Math.abs(bb.interval),\nik=a.graduatedTickUnit;if(!(2>ik*Ji*v/a.graduatedRange)){var jg=w[0][0],md=0,nc=0;yh=v*bb.graduatedStart-1E-4;ig=v*bb.graduatedEnd+1E-4;var Ef=ik*Ji,wc=a.graduatedTickBase;if(wc<a.graduatedMin){var kg=(a.graduatedMin-wc)/Ef;kg=0===kg%1?kg:Math.floor(kg+1);wc+=kg*Ef}else wc>a.graduatedMin+Ef&&(wc-=Math.floor((wc-a.graduatedMin)/Ef)*Ef);for(var Bh=gg[Ah],Bn=wc,Jd=1;wc<a.graduatedMax+5E-8;Jd++){a:{for(var ne=Bh.length,lg=0;lg<ne;lg++)if(L.aa((wc-a.graduatedTickBase)%(Bh[lg]*a.graduatedTickUnit),0)){var mg=\n!1;break a}mg=!0}if(mg&&(null===bb.graduatedSkip||!bb.graduatedSkip(wc))&&(Db=(wc-a.graduatedMin)*v/a.graduatedRange,Db>v&&(Db=v),yh<=Db&&Db<=ig)){for(var Xc=C[md][nc],oe=w[md][nc];md<w.length;){for(;Db>jg&&nc<w[md].length-1;)nc++,Xc=C[md][nc],oe=w[md][nc],jg+=oe;if(Db<=jg)break;md++;nc=0;Xc=C[md][nc];oe=w[md][nc];jg+=oe}var ec=u[md],Ch=ec[2*nc],Dh=ec[2*nc+1],Yc=(Db-(jg-oe))/oe,Ki=new J(Ch+(ec[2*nc+2]-Ch)*Yc+q/2-r.bounds.x,Dh+(ec[2*nc+3]-Dh)*Yc+q/2-r.bounds.y);Ki.scale(h.scale,h.scale);var pe=Xc,\nff=C[md];1E-4>Yc?0<nc?pe=ff[nc-1]:L.aa(ec[0],ec[ec.length-2])&&L.aa(ec[1],ec[ec.length-1])&&(pe=ff[ff.length-1]):.9999<Yc&&(nc+1<ff.length?pe=ff[nc+1]:L.aa(ec[0],ec[ec.length-2])&&L.aa(ec[1],ec[ec.length-1])&&(pe=ff[0]));Xc!==pe&&(180<Math.abs(Xc-pe)&&(Xc<pe?Xc+=360:pe+=360),Xc=(Xc+pe)/2%360);if(bb instanceof Wg){var Cd=\"\";null!==bb.graduatedFunction?(Cd=bb.graduatedFunction(wc),Cd=null!==Cd&&void 0!==Cd?Cd.toString():\"\"):Cd=(+wc.toFixed(2)).toString();\"\"!==Cd&&zh.push({Km:Ki,angle:Xc,text:Cd})}else zh.push({Km:Ki,\nangle:Xc})}wc=Bn+Jd*Ef}}}a.Mj.push(zh)}Ia(C);var jk=a.Mj;if(null!==jk)for(var Cn=d.length,Ff=0;Ff<Cn;Ff++){var Eb=d[Ff],Kd=jk[Ff];if(Eb.visible&&Eb!==h&&0!==Kd.length){if(Eb instanceof Kf){var gb=a,Li=e,Zb=Eb.alignmentFocus;Zb.nc()&&(Zb=uc);var xc=Eb.angle;Eb.Yb=0;Eb.measure(Infinity,Infinity,0,0);Eb.Yb=xc;var oc=Eb.measuredBounds,Ld=oc.width,Md=oc.height,ng=N.allocAt(0,0,Ld,Md),Fc=J.alloc();Fc.tj(ng,Zb);N.free(ng);for(var Eh=-Fc.x,og=-Fc.y,Nd=new N,Fh=Kd.length,gf=0;gf<Fh;gf++)for(var Od=Kd[gf],\nPd=Od.Km.x,Qd=Od.Km.y,Me=Od.angle,Gh=0;4>Gh;Gh++){switch(Gh){case 0:Fc.h(Eh,og);break;case 1:Fc.h(Eh+Ld,og);break;case 2:Fc.h(Eh,og+Md);break;case 3:Fc.h(Eh+Ld,og+Md)}Fc.rotate(Me+Eb.angle);Fc.offset(Pd,Qd);0===gf&&0===Gh?Nd.h(Fc.x,Fc.y,0,0):Nd.Oe(Fc);Fc.offset(-Pd,-Qd);Fc.rotate(-Me-Eb.angle)}J.free(Fc);null!==gb.dh&&gb.dh.push(Nd);bc(Li,Nd.x,Nd.y,Nd.width,Nd.height)}else if(Eb instanceof Wg){var qe=a,Dn=e;null===qe.zh&&(qe.zh=new Wg);var fc=qe.zh;Ym(fc,Eb);var Oa=Eb.alignmentFocus;Oa.nc()&&(Oa=\nuc);for(var gc=Eb.segmentOrientation,Rd=Eb.segmentOffset,Ne=new N,Hh=0,Oe=0,Pc=0,hf=0,Ih=0,En=Kd.length,pg=0;pg<En;pg++){var nd=Kd[pg];Hh=nd.Km.x;Oe=nd.Km.y;Pc=nd.angle;Ih=hf=Eb.angle;gc!==ag&&(Ih=gc===Zm||gc===$m?Pc+Eb.angle:Pc,hf=S.computeAngle(gc,Ih));fc.Yb=hf;fc.text=nd.text||\"\";fc.measure(Infinity,Infinity,0,0);var Sd=fc.measuredBounds,re=fc.naturalBounds,se=re.width,Td=re.height,te=ld.alloc();te.reset();te.translate(-Sd.x,-Sd.y);te.scale(fc.scale,fc.scale);te.rotate(Ih,se/2,Td/2);gc!==Sm&&gc!==\nTm||te.rotate(90,se/2,Td/2);gc!==Um&&gc!==Vm||te.rotate(-90,se/2,Td/2);gc===Wm&&(45<Pc&&135>Pc||225<Pc&&315>Pc)&&te.rotate(-Pc,se/2,Td/2);var kk=N.allocAt(0,0,se,Td),Pe=J.alloc();Pe.tj(kk,Oa);te.ta(Pe);var Mi=-Pe.x,Fn=-Pe.y,od=J.alloc();od.assign(Rd);isNaN(od.x)&&(od.x=se/2+3);isNaN(od.y)&&(od.y=-(Td/2+3));od.rotate(Pc);Hh+=od.x+Mi;Oe+=od.y+Fn;var Gf=new N(Hh,Oe,Sd.width,Sd.height),Jh=new N(Sd.x,Sd.y,Sd.width,Sd.height),qg=new N(re.x,re.y,re.width,re.height);nd.DA=hf;nd.lineCount=fc.lineCount;nd.lines=\n[fc.vb,fc.Ei,fc.oe,fc.Be,fc.Qb,fc.lb,fc.me];nd.actualBounds=Gf;nd.measuredBounds=Jh;nd.naturalBounds=qg;0===pg?Ne.assign(Gf):Ne.Rc(Gf);J.free(od);J.free(Pe);N.free(kk);ld.free(te)}null!==qe.dh&&qe.dh.push(Ne);bc(Dn,Ne.x,Ne.y,Ne.width,Ne.height)}pj(Eb,!1)}}};\nXm.prototype.arrange=function(a,b,c){if(null!==a.dh){var d=a.tb(),e=a.Mj;if(null!==e){var f=a.dh,g=0,h=f[g];g++;null!==d&&d.arrange(h.x-c.x,h.y-c.y,h.width,h.height);for(var k=b.length,l=0;l<k;l++){var m=b[l];h=e[l];m.visible&&m!==d&&0!==h.length&&(h=f[g],g++,m.arrange(h.x-c.x,h.y-c.y,h.width,h.height))}a.dh=null}}};\nXm.prototype.mc=function(a,b,c){var d=c.yi;c.yi=!0;var e=a.naturalBounds,f=e.width;e=e.height;b.save();b.beginPath();b.rect(-1,-1,f+1,e+1);b.clip();f=a.tb();f.mc(b,c);e=a.Af()*c.scale;0>=e&&(e=1);for(var g=f.actualBounds,h=a.W.j,k=a.Mj,l=h.length,m=0;m<l;m++){var n=h[m],p=k[m],r=p.length;if(n.visible&&n!==f&&0!==p.length)if(n instanceof Kf){if(!(2>a.graduatedTickUnit*n.interval*f.geometry.flattenedTotalLength/a.graduatedRange*e)){var q=n.measuredBounds,u=n.strokeWidth*n.scale,w=n.alignmentFocus;w.nc()&&\n(w=uc);for(var v=0;v<r;v++){var y=p[v].Km,z=p[v].angle,A=w,C=n.sb;C.reset();C.translate(y.x+g.x,y.y+g.y);C.rotate(z+n.angle,0,0);C.translate(-q.width*A.x+A.offsetX+u/2,-q.height*A.y+A.offsetY+u/2);C.scale(n.scale,n.scale);Gl(n,!1);n.Zh.set(n.sb);n.ql=n.scale;Hl(n,!1);n.mc(b,c);n.sb.reset()}}}else if(n instanceof Wg)for(null===a.zh&&(a.zh=new Wg),q=a.zh,Ym(q,n),n=0;n<r;n++)u=p[n],u.actualBounds&&u.measuredBounds&&u.naturalBounds&&(q.Ub=u.text||\"\",q.Yb=u.DA||0,q.Zc=u.lineCount||0,w=u.lines,void 0!==\nw&&(q.vb=w[0],q.Ei=w[1],q.oe=w[2],q.Be=w[3],q.Qb=w[4],q.lb=w[5],q.me=w[6]),u.naturalBounds&&(q.rc=u.naturalBounds),u.actualBounds&&(w=u.actualBounds,q.arrange(w.x,w.y,w.width,w.height)),w=u.actualBounds,q.arrange(w.x,w.y,w.width,w.height),v=u.measuredBounds,u=u.naturalBounds,y=q.sb,y.reset(),y.translate(w.x+g.x,w.y+g.y),y.translate(-v.x,-v.y),ol(q,y,u.x,u.y,u.width,u.height),Gl(q,!1),q.Zh.set(q.sb),q.ql=q.scale,Hl(q,!1),q.mc(b,c))}c.yi=d;b.restore();b.uc(!0)};\nfunction X(a){Y.call(this);this.qa=void 0===a?X.Position:a;null===this.qa&&B(\"Panel type not specified or PanelLayout not loaded: \"+a);this.W=new E;this.ib=qc;this.qa===X.Grid&&(this.isAtomic=!0);this.Mn=Vc;this.Sf=al;this.qa===X.Table&&an(this);this.pq=Bg;this.no=Mb;this.oo=Bb;this.ko=0;this.jo=100;this.mo=10;this.lo=0;this.li=this.ob=this.eh=this.dh=this.Mj=null;this.Do=NaN;this.te=this.Ci=null;this.Jl=\"category\";this.Zd=null;this.xg=new N(NaN,NaN,NaN,NaN);this.zh=this.Lp=this.Ui=null;this.Lg=\"\"}\nma(X,Y);function an(a){a.Fj=qc;a.Ug=1;a.si=null;a.ri=null;a.Tg=1;a.Sg=null;a.pi=null;a.qb=[];a.nb=[];a.dk=bn;a.Cj=bn;a.Xi=0;a.Gi=0}\nX.prototype.cloneProtected=function(a){Y.prototype.cloneProtected.call(this,a);a.qa=this.qa;a.ib=this.ib.H();a.Mn=this.Mn.H();a.Sf=this.Sf;if(a.qa===X.Table){a.Fj=this.Fj.H();a.Ug=this.Ug;a.si=this.si;a.ri=this.ri;a.Tg=this.Tg;a.Sg=this.Sg;a.pi=this.pi;var b=[];if(0<this.qb.length)for(var c=this.qb,d=c.length,e=0;e<d;e++)if(void 0!==c[e]){var f=c[e].copy();f.sj(a);b[e]=f}a.qb=b;b=[];if(0<this.nb.length)for(c=this.nb,d=c.length,e=0;e<d;e++)void 0!==c[e]&&(f=c[e].copy(),f.sj(a),b[e]=f);a.nb=b;a.dk=\nthis.dk;a.Cj=this.Cj;a.Xi=this.Xi;a.Gi=this.Gi}a.pq=this.pq;a.no=this.no.H();a.oo=this.oo.H();a.ko=this.ko;a.jo=this.jo;a.mo=this.mo;a.lo=this.lo;a.Mj=this.Mj;a.eh=this.eh;a.ob=this.ob;a.li=this.li;a.Do=this.Do;a.Ci=this.Ci;a.te=this.te;a.Jl=this.Jl;a.xg.assign(this.xg);a.Lg=this.Lg;null!==this.Lp&&(a.Lp=this.Lp)};X.prototype.yf=function(a){Y.prototype.yf.call(this,a);a.W=this.W;for(var b=a.W.j,c=b.length,d=0;d<c;d++)b[d].og=a;a.Ui=null};\nX.prototype.copy=function(){var a=Y.prototype.copy.call(this);if(null!==a){for(var b=this.W.j,c=b.length,d=0;d<c;d++){var e=b[d].copy();e.sj(a);e.ak=null;var f=a.W,g=f.count;f.wb(g,e);f=a.part;if(null!==f){f.Xj=null;null!==e.portId&&f instanceof W&&(f.Nh=!0);var h=a.diagram;null!==h&&h.undoManager.isUndoingRedoing||f.Va(ze,\"elements\",a,null,e,null,g)}}return a}return null};t=X.prototype;t.toString=function(){return\"Panel(\"+this.type.name+\")#\"+kb(this)};\nt.mp=function(a){Y.prototype.mp.call(this,a);for(var b=this.W.j,c=b.length,d=0;d<c;d++)b[d].mp(a)};\nt.ej=function(a,b){if(this.qa===X.Grid)this.qa.mc(this,a,b);else if(this.qa===X.Graduated)this.qa.mc(this,a,b);else{this.qa===X.Table&&(a.lineCap=\"butt\",cn(this,a,!0,this.qb,!0),cn(this,a,!1,this.nb,!0),dn(this,a,!0,this.qb),dn(this,a,!1,this.nb),cn(this,a,!0,this.qb,!1),cn(this,a,!1,this.nb,!1));var c=this.isClipping&&this.qa===X.Spot;c&&a.save();for(var d=this.tb(),e=this.W.j,f=e.length,g=0;g<f;g++){var h=e[g];c&&h===d&&(a.clipInsteadOfFill=!0);h.mc(a,b);c&&h===d&&(a.clipInsteadOfFill=!1)}c&&(a.restore(),\na.uc(!0))}};\nfunction dn(a,b,c,d){for(var e=d.length,f=a.actualBounds,g=a.naturalBounds,h=!0,k=0;k<e;k++){var l=d[k];if(void 0!==l)if(h)h=!1;else if(0!==l.actual){if(c){if(l.position>f.height)continue}else if(l.position>f.width)continue;var m=l.separatorStrokeWidth;isNaN(m)&&(m=c?a.Ug:a.Tg);var n=l.separatorStroke;null===n&&(n=c?a.si:a.Sg);if(0!==m&&null!==n){ni(a,b,n,!1,!1,g,f);n=!1;var p=l.separatorDashArray;null===p&&(p=c?a.ri:a.pi);null!==p&&(n=!0,b.Ft(p,0));b.beginPath();p=l.position+m;c?p>f.height&&(m-=\np-f.height):p>f.width&&(m-=p-f.width);l=l.position+m/2;b.lineWidth=m;m=a.ib;c?(l+=m.top,p=f.width-m.right,b.moveTo(m.left,l),b.lineTo(p,l)):(l+=m.left,p=f.height-m.bottom,b.moveTo(l,m.top),b.lineTo(l,p));b.stroke();n&&b.Dt()}}}}\nfunction cn(a,b,c,d,e){for(var f=d.length,g=a.actualBounds,h=a.naturalBounds,k=0;k<f;k++){var l=d[k];if(void 0!==l&&null!==l.background&&l.coversSeparators!==e&&0!==l.actual){var m=c?g.height:g.width;if(!(l.position>m)){var n=l.wc(),p=l.separatorStrokeWidth;isNaN(p)&&(p=c?a.Ug:a.Tg);var r=l.separatorStroke;null===r&&(r=c?a.si:a.Sg);null===r&&(p=0);n-=p;p=l.position+p;n+=l.actual;p+n>m&&(n=m-p);0>=n||(m=a.ib,ni(a,b,l.background,!0,!1,h,g),c?b.fillRect(m.left,p+m.top,g.width-(m.left+m.right),n):b.fillRect(p+\nm.left,m.top,n,g.height-(m.top+m.bottom)))}}}}function Zj(a){return\"LineV\"===a||\"BarV\"===a}\nt.zk=function(a,b,c,d,e){var f=this.he(),g=this.transform,h=1/(g.m11*g.m22-g.m12*g.m21),k=g.m22*h,l=-g.m12*h,m=-g.m21*h,n=g.m11*h,p=h*(g.m21*g.dy-g.m22*g.dx),r=h*(g.m12*g.dx-g.m11*g.dy);if(null!==this.areaBackground)return g=this.actualBounds,L.Cf(g.left,g.top,g.right,g.bottom,a,b,c,d,e);if(null!==this.background)return f=a*k+b*m+p,h=a*l+b*n+r,a=c*k+d*m+p,k=c*l+d*n+r,e.h(0,0),c=this.naturalBounds,f=L.Cf(0,0,c.width,c.height,f,h,a,k,e),e.transform(g),f;f||(k=1,m=l=0,n=1,r=p=0);h=a*k+b*m+p;a=a*l+b*\nn+r;k=c*k+d*m+p;c=c*l+d*n+r;e.h(k,c);d=(k-h)*(k-h)+(c-a)*(c-a);l=!1;n=this.W.j;r=n.length;m=J.alloc();p=null;b=Infinity;var q=null,u=this.isClipping&&this.qa===X.Spot;u&&(q=J.alloc(),p=this.tb(),(l=p.zk(h,a,k,c,q))&&(b=(h-q.x)*(h-q.x)+(a-q.y)*(a-q.y)));for(var w=0;w<r;w++){var v=n[w];v.visible&&v!==p&&v.zk(h,a,k,c,m)&&(l=!0,v=(h-m.x)*(h-m.x)+(a-m.y)*(a-m.y),v<d&&(d=v,e.set(m)))}u&&(b>d&&e.set(q),J.free(q));J.free(m);f&&e.transform(g);return l};\nt.o=function(a){if(!uj(this)){Y.prototype.o.call(this,a);a=null;if(this.qa===X.Auto||this.qa===X.Link)a=this.tb();for(var b=this.W.j,c=b.length,d=0;d<c;d++){var e=b[d];(e===a||e.isPanelMain)&&e.o(!0);if(!e.desiredSize.s()){var f=ql(e,!1);(e instanceof xg||e instanceof X||e instanceof Wg||f!==zg)&&e.o(!0)}}}};t.Bk=function(){if(!uj(this)){pj(this,!0);rl(this,!0);for(var a=this.W.j,b=a.length,c=0;c<b;c++)a[c].Bk()}};\nt.Fl=function(){if(0!==(this.F&2048)===!1){Gl(this,!0);Hl(this,!0);for(var a=this.W.j,b=a.length,c=0;c<b;c++)a[c].dw()}};t.dw=function(){Hl(this,!0);for(var a=this.W.j,b=a.length,c=0;c<b;c++)a[c].dw()};\nt.Hm=function(a,b,c,d){var e=this.xg;e.h(0,0,0,0);var f=this.desiredSize,g=this.minSize;void 0===c&&(c=g.width,d=g.height);c=Math.max(c,g.width);d=Math.max(d,g.height);var h=this.maxSize;isNaN(f.width)||(a=Math.min(f.width,h.width));isNaN(f.height)||(b=Math.min(f.height,h.height));a=Math.max(c,a);b=Math.max(d,b);var k=this.ib;a=Math.max(a-k.left-k.right,0);b=Math.max(b-k.top-k.bottom,0);var l=this.W.j;0!==l.length&&this.qa.measure(this,a,b,l,e,c,d);a=e.width+k.left+k.right;k=e.height+k.top+k.bottom;\nisFinite(f.width)&&(a=f.width);isFinite(f.height)&&(k=f.height);a=Math.min(h.width,a);k=Math.min(h.height,k);a=Math.max(g.width,a);k=Math.max(g.height,k);a=Math.max(c,a);k=Math.max(d,k);Sb(e,a,k);Sb(this.naturalBounds,a,k);nl(this,0,0,a,k)};t.tb=function(){if(null===this.Ui){var a=this.W.j,b=a.length;if(0===b)return null;for(var c=0;c<b;c++){var d=a[c];if(!0===d.isPanelMain)return this.Ui=d}this.Ui=a[0]}return this.Ui};function Bm(a){return null!==a.part?a.part.locationObject:null}\nt.Ih=function(a,b,c,d){var e=this.W.j;this.actualBounds.h(a,b,c,d);if(0!==e.length){if(!this.desiredSize.s()){a=ql(this,!0);var f=this.measuredBounds;b=f.width;f=f.height;var g=this.jh,h=g.left+g.right;g=g.top+g.bottom;b===c&&f===d&&(a=zg);switch(a){case zg:if(b>c||f>d)this.o(),this.measure(b>c?c:b,f>d?d:f,0,0);break;case td:this.o(!0);this.measure(c+h,d+g,0,0);break;case bl:this.o(!0);this.measure(c+h,f+g,0,0);break;case cl:this.o(!0),this.measure(b+h,d+g,0,0)}}this.qa.arrange(this,e,this.xg)}};\nt.Kh=function(a){var b=this.naturalBounds,c=Bm(this);if(cc(0,0,b.width,b.height,a.x,a.y)){b=this.W.j;for(var d=b.length,e=J.allocAt(0,0);d--;){var f=b[d];if(f.visible||f===c)if(wb(e.set(a),f.transform),f.$(e))return J.free(e),!0}J.free(e);return null===this.mb&&null===this.ec?!1:!0}return!1};t.Gt=function(a){if(this.dl===a)return this;for(var b=this.W.j,c=b.length,d=0;d<c;d++){var e=b[d].Gt(a);if(null!==e)return e}return null};\nt.an=function(a,b){b(this,a);if(a instanceof X){a=a.W.j;for(var c=a.length,d=0;d<c;d++)this.an(a[d],b)}};function Hj(a,b){en(a,a,b)}function en(a,b,c){c(b);b=b.W.j;for(var d=b.length,e=0;e<d;e++){var f=b[e];f instanceof X&&en(a,f,c)}}function fn(a,b){gn(a,a,b)}function gn(a,b,c){c(b);if(b instanceof X){b=b.W.j;for(var d=b.length,e=0;e<d;e++)gn(a,b[e],c)}}t.ym=function(a){return hn(this,this,a)};\nfunction hn(a,b,c){if(c(b))return b;if(b instanceof X){b=b.W.j;for(var d=b.length,e=0;e<d;e++){var f=hn(a,b[e],c);if(null!==f)return f}}return null}t.bb=function(a){if(this.name===a)return this;var b=this.W.j,c=b.length;null===this.Ci&&null===this.te||(c=jn(this));for(var d=0;d<c;d++){var e=b[d];if(e instanceof X){var f=e.bb(a);if(null!==f)return f}if(e.name===a)return e}return null};\nfunction kn(a){a=a.W.j;for(var b=a.length,c=0,d=0;d<b;d++){var e=a[d];e instanceof X?c=Math.max(c,kn(e)):e instanceof Kf&&(c=Math.max(c,e.wh/2*e.gk*e.Af()))}return c}t.he=function(){return!(this.type===X.TableRow||this.type===X.TableColumn)};\nt.Vb=function(a,b,c){if(!1===this.pickable)return null;void 0===b&&(b=null);void 0===c&&(c=null);if(vj(this))return null;var d=this.naturalBounds,e=1/this.Af(),f=this.he(),g=f?a:wb(J.allocAt(a.x,a.y),this.transform),h=this.diagram,k=10,l=5;null!==h&&(k=h.Bm(\"extraTouchArea\"),l=k/2);if(cc(-(l*e),-(l*e),d.width+k*e,d.height+k*e,g.x,g.y)){if(!this.isAtomic){e=this.W.j;var m=e.length;h=J.alloc();l=(k=this.isClipping&&this.qa===X.Spot)?this.tb():null;if(k&&(l.he()?wb(h.set(a),l.transform):h.set(a),!l.$(h)))return J.free(h),\nf||J.free(g),null;for(var n=Bm(this);m--;){var p=e[m];if(p.visible||p===n)if(p.he()?wb(h.set(a),p.transform):h.set(a),!k||p!==l){var r=null;p instanceof X?r=p.Vb(h,b,c):!0===p.pickable&&p.$(h)&&(r=p);if(null!==r&&(null!==b&&(r=b(r)),null!==r&&(null===c||c(r))))return J.free(h),f||J.free(g),r}}J.free(h)}if(null===this.background&&null===this.areaBackground)return f||J.free(g),null;a=cc(0,0,d.width,d.height,g.x,g.y)?this:null;f||J.free(g);return a}f||J.free(g);return null};\nt.hj=function(a,b,c,d){if(!1===this.pickable)return!1;void 0===b&&(b=null);void 0===c&&(c=null);var e=this.naturalBounds,f=this.he(),g=f?a:wb(J.allocAt(a.x,a.y),this.transform);e=cc(0,0,e.width,e.height,g.x,g.y);if(this.type===X.TableRow||this.type===X.TableColumn||e){if(!this.isAtomic){for(var h=this.W.j,k=h.length,l=J.alloc(),m=Bm(this);k--;){var n=h[k];if(n.visible||n===m){n.he()?wb(l.set(a),n.transform):l.set(a);var p=n;n=n instanceof X?n:null;(null!==n?n.hj(l,b,c,d):p.$(l))&&!1!==p.pickable&&\n(null!==b&&(p=b(p)),null===p||null!==c&&!c(p)||d.add(p))}}J.free(l)}f||J.free(g);return e&&(null!==this.background||null!==this.areaBackground)}f||J.free(g);return!1};\nt.zf=function(a,b,c,d,e,f){if(!1===this.pickable)return!1;void 0===b&&(b=null);void 0===c&&(c=null);var g=f;void 0===f&&(g=ld.alloc(),g.reset());g.multiply(this.transform);if(this.Jh(a,g))return ln(this,b,c,e),void 0===f&&ld.free(g),!0;if(this.Mc(a,g)){if(!this.isAtomic)for(var h=Bm(this),k=this.W.j,l=k.length;l--;){var m=k[l];if(m.visible||m===h){var n=m.actualBounds,p=this.naturalBounds;if(!(n.x>p.width||n.y>p.height||0>n.x+n.width||0>n.y+n.height)){n=m;m=m instanceof X?m:null;p=ld.alloc();p.set(g);\nif(null!==m?m.zf(a,b,c,d,e,p):pl(n,a,d,p))null!==b&&(n=b(n)),null===n||null!==c&&!c(n)||e.add(n);ld.free(p)}}}void 0===f&&ld.free(g);return d}void 0===f&&ld.free(g);return!1};function ln(a,b,c,d){for(var e=a.W.j,f=e.length;f--;){var g=e[f];if(g.visible){var h=g.actualBounds,k=a.naturalBounds;h.x>k.width||h.y>k.height||0>h.x+h.width||0>h.y+h.height||(g instanceof X&&ln(g,b,c,d),null!==b&&(g=b(g)),null===g||null!==c&&!c(g)||d.add(g))}}}\nt.Eg=function(a,b,c,d,e,f){if(!1===this.pickable)return!1;void 0===c&&(c=null);void 0===d&&(d=null);var g=this.naturalBounds,h=this.he(),k=h?a:wb(J.allocAt(a.x,a.y),this.transform),l=h?b:wb(J.allocAt(b.x,b.y),this.transform),m=k.Ie(l),n=0<k.x&&k.x<g.width&&0<k.y&&k.y<g.height||xb(k.x,k.y,0,0,0,g.height)<=m||xb(k.x,k.y,0,g.height,g.width,g.height)<=m||xb(k.x,k.y,g.width,g.height,g.width,0)<=m||xb(k.x,k.y,g.width,0,0,0)<=m;g=k.qd(0,0)<=m&&k.qd(0,g.height)<=m&&k.qd(g.width,0)<=m&&k.qd(g.width,g.height)<=\nm;h||(J.free(k),J.free(l));if(n){if(!this.isAtomic){k=J.alloc();l=J.alloc();m=Bm(this);for(var p=this.W.j,r=p.length;r--;){var q=p[r];if(q.visible||q===m){var u=q.actualBounds,w=this.naturalBounds;if(!h||!(u.x>w.width||u.y>w.height||0>u.x+u.width||0>u.y+u.height))if(q.he()?(u=q.transform,wb(k.set(a),u),wb(l.set(b),u)):(k.set(a),l.set(b)),u=q,q=q instanceof X?q:null,null!==q?q.Eg(k,l,c,d,e,f):u.sy(k,l,e))null!==c&&(u=c(u)),null===u||null!==d&&!d(u)||f.add(u)}}J.free(k);J.free(l)}return e?n:g}return!1};\nfunction Gm(a){var b=null;a instanceof Kf&&(b=a.spot1,b===Vc&&(b=null),a=a.geometry,null!==a&&null===b&&(b=a.spot1));null===b&&(b=tc);return b}function Hm(a){var b=null;a instanceof Kf&&(b=a.spot2,b===Vc&&(b=null),a=a.geometry,null!==a&&null===b&&(b=a.spot2));null===b&&(b=Dc);return b}t.add=function(a){this.wb(this.W.count,a)};t.J=function(a){return this.W.J(a)};\nt.wb=function(a,b){b instanceof V&&B(\"Cannot add a Part to a Panel: \"+b+\"; use a Panel instead\");if(this===b||this.Gg(b))this===b&&B(\"Cannot make a Panel contain itself: \"+this.toString()),B(\"Cannot make a Panel indirectly contain itself: \"+this.toString()+\" already contains \"+b.toString());var c=b.panel;null!==c&&c!==this&&B(\"Cannot add a GraphObject that already belongs to another Panel to this Panel: \"+b.toString()+\", already contained by \"+c.toString()+\", cannot be shared by this Panel: \"+this.toString());\nthis.qa!==X.Grid||b instanceof Kf||B(\"Can only add Shapes to a Grid Panel, not: \"+b);this.qa!==X.Graduated||b instanceof Kf||b instanceof Wg||B(\"Can only add Shapes or TextBlocks to a Graduated Panel, not: \"+b);b.sj(this);b.ak=null;if(null!==this.itemArray){var d=b.data;null!==d&&\"object\"===typeof d&&(null===this.Zd&&(this.Zd=new H),this.Zd.add(d,b))}var e=this.W;d=-1;if(c===this){for(var f=-1,g=this.W.j,h=g.length,k=0;k<h;k++)if(g[k]===b){f=k;break}if(-1!==f){if(f===a||f+1>=e.count&&a>=e.count)return;\ne.cb(f);d=f}else B(\"element \"+b.toString()+\" has panel \"+c.toString()+\" but is not contained by it.\")}if(0>a||a>e.count)a=e.count;e.wb(a,b);if(0===a||b.isPanelMain)this.Ui=null;uj(this)||this.o();b.o(!1);null!==b.portId?this.Nh=!0:b instanceof X&&!0===b.Nh&&(this.Nh=!0);this.eh=null;c=this.part;null!==c&&(c.Xj=null,c.kh=NaN,this.Nh&&c instanceof W&&(c.Nh=!0),c.Nh&&c instanceof W&&(c.tc=null),e=this.diagram,null!==e&&e.undoManager.isUndoingRedoing||(-1!==d&&c.Va(Ae,\"elements\",this,b,null,d,null),c.Va(ze,\n\"elements\",this,null,b,null,a),this.Hg()||mn(this,b,!1)))};function nn(a,b){a.F=b?a.F|16777216:a.F&-16777217}t.remove=function(a){for(var b=this.W.j,c=b.length,d=-1,e=0;e<c;e++)if(b[e]===a){d=e;break}-1!==d&&this.Lc(d,!0)};t.cb=function(a){0<=a&&this.Lc(a,!0)};\nt.Lc=function(a,b){var c=this.W,d=c.J(a);d.ak=null;d.sj(null);if(null!==this.Zd){var e=d.data;\"object\"===typeof e&&this.Zd.remove(e)}c.cb(a);pj(this,!1);this.o();this.Ui===d&&(this.Ui=null);this.eh=null;var f=this.part;null!==f&&(f.Xj=null,f.kh=NaN,f.Lb(),f instanceof W&&(d instanceof X?d.an(d,function(a,c){Xl(f,c,b)}):Xl(f,d,b)),c=this.diagram,null!==c&&c.undoManager.isUndoingRedoing||f.Va(Ae,\"elements\",this,d,null,a,null))};\nX.prototype.getRowDefinition=function(a){0>a&&wa(a,\">= 0\",X,\"getRowDefinition:idx\");a=Math.round(a);var b=this.qb;if(void 0===b)return null;if(void 0===b[a]){var c=new Vj;c.sj(this);c.isRow=!0;c.index=a;b[a]=c;this.Va(ze,\"rowdefs\",this,null,c,null,a)}return b[a]};\nX.prototype.XA=function(a){0>a&&wa(a,\">= 0\",X,\"removeRowDefinition:idx\");a=Math.round(a);var b=this.qb;if(void 0!==b){var c=b[a];if(c){b[a]=void 0;for(var d=b.length-1;0<=d&&void 0===b[d--];)b.length--;this.Va(Ae,\"rowdefs\",this,c,null,a,null);this.o()}}};function Wj(a,b,c){var d=a.qb;if(d&&!(0>b)){d[b]=c instanceof Vj?c:void 0;if(!c)for(b=d.length-1;0<=b&&void 0===d[b--];)d.length--;a.o()}}\nX.prototype.getColumnDefinition=function(a){0>a&&wa(a,\">= 0\",X,\"getColumnDefinition:idx\");a=Math.round(a);var b=this.nb;if(void 0===b)return null;if(void 0===b[a]){var c=new Vj;c.sj(this);c.isRow=!1;c.index=a;b[a]=c;this.Va(ze,\"coldefs\",this,null,c,null,a)}return b[a]};t=X.prototype;\nt.SA=function(a){0>a&&wa(a,\">= 0\",X,\"removeColumnDefinition:idx\");a=Math.round(a);var b=this.nb;if(void 0!==b){var c=b[a];if(c){b[a]=void 0;for(var d=b.length-1;0<=d&&void 0===b[d--];)b.length--;this.Va(Ae,\"coldefs\",this,c,null,a,null);this.o()}}};function Xj(a,b,c){var d=a.nb;if(d&&!(0>b)){d[b]=c instanceof Vj?c:void 0;if(!c)for(b=d.length-1;0<=b&&void 0===d[b--];)d.length--;a.o()}}\nt.aA=function(a){if(0>a||this.type!==X.Table)return-1;for(var b=0,c=this.qb,d=c.length,e=this.Xi;e<d;e++){var f=c[e];if(void 0!==f&&(b+=f.total,a<b))break}return e};t.Tz=function(a){if(0>a||this.type!==X.Table)return-1;for(var b=0,c=this.nb,d=c.length,e=this.Gi;e<d;e++){var f=c[e];if(void 0!==f&&(b+=f.total,a<b))break}return e};\nt.qA=function(a,b){void 0===b&&(b=new J(NaN,NaN));if(this.type!==X.Graduated)return b.h(NaN,NaN),b;a=Math.min(Math.max(a,this.graduatedMin),this.graduatedMax);var c=this.tb();c.geometry.Xv((a-this.graduatedMin)/this.graduatedRange,b);return c.transform.ta(b)};t.rA=function(a){if(this.type!==X.Graduated)return NaN;var b=this.tb();b.transform.Jd(a);return b.geometry.wy(a)*this.graduatedRange+this.graduatedMin};function Ol(a){a=a.li;return null!==a&&a.v}\nfunction yg(a){var b=a.li;if(null===b)null!==a.data&&B(\"Template cannot have .data be non-null: \"+a),a.li=b=new E;else if(b.v)return;var c=new E;nn(a,!1);a.an(a,function(a,d){var e=d.fb;if(null!==e)for(Ll(d,!1),e=e.iterator;e.next();){var f=e.value;f.mode===on&&Ll(d,!0);var g=f.sourceName;null!==g&&(\"/\"===g&&nn(a,!0),g=ml(f,a,d),null!==g&&(c.add(g),null===g.im&&(g.im=new E),g.im.add(f)));b.add(f)}if(d instanceof X&&d.type===X.Table){if(0<d.qb.length)for(a=d.qb,e=a.length,f=0;f<e;f++)if(g=a[f],void 0!==\ng&&null!==g.fb)for(var h=g.fb.iterator;h.next();){var k=h.value;k.pd=g;k.hq=2;k.om=g.index;b.add(k)}if(0<d.nb.length)for(d=d.nb,a=d.length,e=0;e<a;e++)if(f=d[e],void 0!==f&&null!==f.fb)for(g=f.fb.iterator;g.next();)h=g.value,h.pd=f,h.hq=1,h.om=f.index,b.add(h)}});for(var d=c.iterator;d.next();){var e=d.value;if(null!==e.im){Ll(e,!0);for(var f=e.im.iterator;f.next();){var g=f.value;null===e.fb&&(e.fb=new E);e.fb.add(g)}}e.im=null}for(d=b.iterator;d.next();)if(e=d.value,f=e.pd,null!==f){e.pd=null;var h=\ne.targetProperty,k=h.indexOf(\".\");0<k&&f instanceof X&&(g=h.substring(0,k),h=h.substr(k+1),k=f.bb(g),null!==k?(f=k,e.targetProperty=h):xa('Warning: unable to find GraphObject named \"'+g+'\" for Binding: '+e.toString()));f instanceof Vj?(g=kb(f.panel),e.wj=void 0===g?-1:g,f.panel.dl=e.wj):f instanceof Y?(g=kb(f),e.wj=void 0===g?-1:g,f.dl=e.wj):B(\"Unknown type of binding target: \"+f)}b.freeze();a instanceof V&&a.Nc()&&a.Ta()}\nt.Gz=function(a){void 0===a&&(a=!1);var b=this.copy();fn(b,function(a){a instanceof X&&(a.li=null,a.ob=null);var b=a.fb;null!==b&&(a.fb=null,b.each(function(b){a.bind(b.copy())}));b=a.Mg;null!==b&&(a.Mg=null,b.each(function(b){a.Qw(b.value.copy())}))});a&&yg(b);return b};\nt.Da=function(a){var b=this.li;if(null!==b)for(void 0===a&&(a=\"\"),b=b.iterator;b.next();){var c=b.value,d=c.sourceProperty;if(\"\"===a||\"\"===d||d===a)if(d=c.targetProperty,null!==c.converter||\"\"!==d){d=this.data;var e=c.sourceName;if(null!==e)if(\"\"===e)d=this;else if(\"/\"===e)d=this;else if(\".\"===e)d=this;else if(\"..\"===e)d=this;else{if(d=this.bb(e),null===d)continue}else if(c.isToModel)if(d=this.diagram,null!==d)d=d.model.modelData;else continue;var f=this,g=c.wj;if(-1!==g){if(f=this.Gt(g),null===f)continue}else null!==\nc.pd&&(f=c.pd);\"/\"===e?d=f.part:\".\"===e?d=f:\"..\"===e&&(d=f.panel);e=c.hq;if(0!==e){if(!(f instanceof X))continue;1===e?f=f.getColumnDefinition(c.om):2===e&&(f=f.getRowDefinition(c.om))}void 0!==f&&c.Tw(f,d)}}};function pn(a,b){a=a.W.j;for(var c=a.length,d=b.length,e=0,f=null;e<c&&!(f=a[e],f instanceof X&&null!==f.data);)e++,f=a[e];if(c-e!==d)return!0;if(null===f)return 0<d;for(var g=0;e<c&&g<d;){f=a[e];if(!(f instanceof X)||f.data!==b[g])return!0;e++;g++}return!1}\nfunction jn(a){if(a.type===X.Spot||a.type===X.Auto)return Math.min(a.W.length,1);if(a.type===X.Link){a=a.W;for(var b=a.length,c=0;c<b;c++){var d=a.J(c);if(!(d instanceof Kf&&d.isPanelMain))break}return c}return a.type===X.Table&&0<a.W.length&&(a=a.W.J(0),a.isPanelMain&&a instanceof X&&(a.type===X.TableRow||a.type===X.TableColumn))?1:0}t.eu=function(){for(var a=jn(this);this.W.length>a;)this.Lc(this.W.length-1,!1);a=this.itemArray;if(null!==a)for(var b=a.length,c=0;c<b;c++)qn(this,a[c],c)};\nt.qy=function(a){return void 0===a||null===a||null===this.Zd?null:this.Zd.G(a)};\nfunction qn(a,b,c){if(!(void 0===b||null===b||0>c)){var d=rn(a,b),e=a.itemTemplateMap,f=null;null!==e&&(f=e.G(d));null===f&&(null!==e&&(f=e.G(\"\")),null===f&&(sn||(sn=!0,xa('No item template Panel found for category \"'+d+'\" on '+a),xa(\"  Using default item template.\"),d=new X,e=new Wg,e.bind(new Hi(\"text\",\"\",Ka)),d.add(e),tn=d),f=tn));d=f;null!==d&&(yg(d),d=d.copy(),0!==(d.F&16777216)&&(e=a.ij(),null!==e&&nn(e,!0)),\"object\"===typeof b&&(null===a.Zd&&(a.Zd=new H),a.Zd.add(b,d)),e=c+jn(a),a.wb(e,d),\nd.ob=b,un(a,e,c),d.ob=null,d.data=b)}}function un(a,b,c){for(a=a.W;b<a.length;){var d=a.J(b);if(d instanceof X){var e=b,f=c;d.type===X.TableRow?d.row=e:d.type===X.TableColumn&&(d.column=e);d.itemIndex=f}b++;c++}}\nfunction rn(a,b){if(null===b)return\"\";a=a.Jl;if(\"function\"===typeof a)a=a(b);else if(\"string\"===typeof a&&\"object\"===typeof b){if(\"\"===a)return\"\";a=vn(b,a)}else return\"\";if(void 0===a)return\"\";if(\"string\"===typeof a)return a;B(\"Panel.getCategoryForItemData found a non-string category for \"+b+\": \"+a);return\"\"}function mn(a,b,c){var d=b.enabledChanged;null!==d&&d(b,c);if(b instanceof X){b=b.W.j;d=b.length;for(var e=0;e<d;e++){var f=b[e];c&&f instanceof X&&!f.isEnabled||mn(a,f,c)}}}\nfunction wn(a,b){b.name=a;Sl.add(a,b)}\nna.Object.defineProperties(X.prototype,{type:{get:function(){return this.qa},set:function(a){var b=this.qa;b!==a&&(this.qa=a,this.qa===X.Grid?this.isAtomic=!0:this.qa===X.Table&&an(this),this.o(),this.g(\"type\",b,a))}},elements:{get:function(){return this.W.iterator}},naturalBounds:{get:function(){return this.rc}},padding:{get:function(){return this.ib},set:function(a){\"number\"===\ntypeof a?(0>a&&wa(a,\">= 0\",X,\"padding\"),a=new kc(a)):(0>a.left&&wa(a.left,\">= 0\",X,\"padding:value.left\"),0>a.right&&wa(a.right,\">= 0\",X,\"padding:value.right\"),0>a.top&&wa(a.top,\">= 0\",X,\"padding:value.top\"),0>a.bottom&&wa(a.bottom,\">= 0\",X,\"padding:value.bottom\"));var b=this.ib;b.w(a)||(this.ib=a=a.H(),this.o(),this.g(\"padding\",b,a))}},defaultAlignment:{get:function(){return this.Mn},set:function(a){var b=this.Mn;b.w(a)||(this.Mn=a=a.H(),this.o(),this.g(\"defaultAlignment\",\nb,a))}},defaultStretch:{get:function(){return this.Sf},set:function(a){var b=this.Sf;b!==a&&(this.Sf=a,this.o(),this.g(\"defaultStretch\",b,a))}},defaultSeparatorPadding:{get:function(){return void 0===this.Fj?qc:this.Fj},set:function(a){if(void 0!==this.Fj){\"number\"===typeof a&&(a=new kc(a));var b=this.Fj;b.w(a)||(this.Fj=a=a.H(),this.o(),this.g(\"defaultSeparatorPadding\",b,a))}}},defaultRowSeparatorStroke:{get:function(){return void 0===\nthis.si?null:this.si},set:function(a){var b=this.si;b!==a&&(null===a||\"string\"===typeof a||a instanceof zl)&&(a instanceof zl&&a.freeze(),this.si=a,this.M(),this.g(\"defaultRowSeparatorStroke\",b,a))}},defaultRowSeparatorStrokeWidth:{get:function(){return void 0===this.Ug?1:this.Ug},set:function(a){if(void 0!==this.Ug){var b=this.Ug;b!==a&&isFinite(a)&&0<=a&&(this.Ug=a,this.o(),this.g(\"defaultRowSeparatorStrokeWidth\",b,a))}}},defaultRowSeparatorDashArray:{\nget:function(){return void 0===this.ri?null:this.ri},set:function(a){if(void 0!==this.ri){var b=this.ri;if(b!==a){if(null!==a){for(var c=a.length,d=0,e=0;e<c;e++){var f=a[e];\"number\"===typeof f&&0<=f&&isFinite(f)||B(\"defaultRowSeparatorDashArray value \"+f+\" at index \"+e+\" must be a positive number or zero.\");d+=f}if(0===d){if(null===b)return;a=null}}this.ri=a;this.M();this.g(\"defaultRowSeparatorDashArray\",b,a)}}}},defaultColumnSeparatorStroke:{get:function(){return void 0===\nthis.Sg?null:this.Sg},set:function(a){if(void 0!==this.Sg){var b=this.Sg;b!==a&&(null===a||\"string\"===typeof a||a instanceof zl)&&(a instanceof zl&&a.freeze(),this.Sg=a,this.M(),this.g(\"defaultColumnSeparatorStroke\",b,a))}}},defaultColumnSeparatorStrokeWidth:{get:function(){return void 0===this.Tg?1:this.Tg},set:function(a){if(void 0!==this.Tg){var b=this.Tg;b!==a&&isFinite(a)&&0<=a&&(this.Tg=a,this.o(),this.g(\"defaultColumnSeparatorStrokeWidth\",b,a))}}},defaultColumnSeparatorDashArray:{\nget:function(){return void 0===this.pi?null:this.pi},set:function(a){if(void 0!==this.pi){var b=this.pi;if(b!==a){if(null!==a){for(var c=a.length,d=0,e=0;e<c;e++){var f=a[e];\"number\"===typeof f&&0<=f&&isFinite(f)||B(\"defaultColumnSeparatorDashArray value \"+f+\" at index \"+e+\" must be a positive number or zero.\");d+=f}if(0===d){if(null===b)return;a=null}}this.pi=a;this.M();this.g(\"defaultColumnSeparatorDashArray\",b,a)}}}},viewboxStretch:{get:function(){return this.pq},\nset:function(a){var b=this.pq;b!==a&&(this.pq=a,this.o(),this.g(\"viewboxStretch\",b,a))}},gridCellSize:{get:function(){return this.no},set:function(a){var b=this.no;if(!b.w(a)){a.s()&&0!==a.width&&0!==a.height||B(\"Invalid Panel.gridCellSize: \"+a);this.no=a.H();var c=this.diagram;null!==c&&this===c.grid&&qj(c);this.M();this.g(\"gridCellSize\",b,a)}}},gridOrigin:{get:function(){return this.oo},set:function(a){var b=this.oo;if(!b.w(a)){a.s()||\nB(\"Invalid Panel.gridOrigin: \"+a);this.oo=a.H();var c=this.diagram;null!==c&&this===c.grid&&qj(c);this.M();this.g(\"gridOrigin\",b,a)}}},graduatedMin:{get:function(){return this.ko},set:function(a){var b=this.ko;b!==a&&(this.ko=a,this.o(),this.g(\"graduatedMin\",b,a),kl(this)&&(a=this.part,null!==a&&ll(this,a,\"graduatedRange\")))}},graduatedMax:{get:function(){return this.jo},set:function(a){var b=this.jo;b!==a&&(this.jo=a,this.o(),this.g(\"graduatedMax\",\nb,a),kl(this)&&(a=this.part,null!==a&&ll(this,a,\"graduatedRange\")))}},graduatedRange:{get:function(){return this.graduatedMax-this.graduatedMin}},graduatedTickUnit:{get:function(){return this.mo},set:function(a){var b=this.mo;b!==a&&0<a&&(this.mo=a,this.o(),this.g(\"graduatedTickUnit\",b,a))}},graduatedTickBase:{get:function(){return this.lo},set:function(a){var b=this.lo;b!==a&&(this.lo=a,this.o(),this.g(\"graduatedTickBase\",\nb,a))}},Nh:{get:function(){return 0!==(this.F&8388608)},set:function(a){0!==(this.F&8388608)!==a&&(this.F^=8388608)}},rowCount:{get:function(){return void 0===this.qb?0:this.qb.length}},columnCount:{get:function(){return void 0===this.nb?0:this.nb.length}},rowSizing:{get:function(){return void 0===this.dk?bn:this.dk},set:function(a){if(void 0!==this.dk){var b=this.dk;b!==a&&(this.dk=\na,this.o(),this.g(\"rowSizing\",b,a))}}},columnSizing:{get:function(){return void 0===this.Cj?bn:this.Cj},set:function(a){if(void 0!==this.Cj){var b=this.Cj;b!==a&&(this.Cj=a,this.o(),this.g(\"columnSizing\",b,a))}}},topIndex:{get:function(){return void 0===this.Xi?0:this.Xi},set:function(a){if(void 0!==this.Xi){var b=this.Xi;b!==a&&((!isFinite(a)||0>a)&&B(\"Panel.topIndex must be greater than zero and a real number, not: \"+a),this.Xi=a,this.o(),\nthis.g(\"topIndex\",b,a))}}},leftIndex:{get:function(){return void 0===this.Gi?0:this.Gi},set:function(a){if(void 0!==this.Gi){var b=this.Gi;b!==a&&((!isFinite(a)||0>a)&&B(\"Panel.leftIndex must be greater than zero and a real number, not: \"+a),this.Gi=a,this.o(),this.g(\"leftIndex\",b,a))}}},data:{get:function(){return this.ob},set:function(a){var b=this.ob;if(b!==a){var c=this instanceof V&&!(this instanceof Je);yg(this);this.ob=a;var d=this.diagram;\nnull!==d&&(c?(c=d.partManager,this instanceof S?(null!==b&&c.Te.remove(b),null!==a&&c.Te.add(a,this)):this instanceof V&&(null!==b&&c.Ue.remove(b),null!==a&&c.Ue.add(a,this))):(c=this.panel,null!==c&&null!==c.Zd&&(null!==b&&c.Zd.remove(b),null!==a&&c.Zd.add(a,this))));this.g(\"data\",b,a);null!==d&&d.undoManager.isUndoingRedoing||null!==a&&this.Da()}}},itemIndex:{get:function(){return this.Do},set:function(a){var b=this.Do;b!==a&&(this.Do=a,this.g(\"itemIndex\",b,a))}},itemArray:{\nget:function(){return this.Ci},set:function(a){var b=this.Ci;if(b!==a||null!==a&&pn(this,a)){var c=this.diagram;b!==a&&(null!==c&&null!==b&&Mj(c.partManager,this,c),this.Ci=a,null!==c&&null!==a&&Jj(c.partManager,this));this.g(\"itemArray\",b,a);null!==c&&c.undoManager.isUndoingRedoing||this.eu()}}},itemTemplate:{get:function(){return null===this.te?null:this.te.G(\"\")},set:function(a){if(null===this.te){if(null===a)return;this.te=new H}var b=this.te.G(\"\");\nb!==a&&((a instanceof V||a.isPanelMain)&&B(\"Panel.itemTemplate must not be a Part or be Panel.isPanelMain: \"+a),this.te.add(\"\",a),this.g(\"itemTemplate\",b,a),a=this.diagram,null!==a&&a.undoManager.isUndoingRedoing||this.eu())}},itemTemplateMap:{get:function(){return this.te},set:function(a){var b=this.te;if(b!==a){for(var c=a.iterator;c.next(););this.te=a;this.g(\"itemTemplateMap\",b,a);a=this.diagram;null!==a&&a.undoManager.isUndoingRedoing||this.eu()}}},itemCategoryProperty:{\nget:function(){return this.Jl},set:function(a){var b=this.Jl;b!==a&&(this.Jl=a,this.g(\"itemCategoryProperty\",b,a))}},isAtomic:{get:function(){return 0!==(this.F&1048576)},set:function(a){var b=0!==(this.F&1048576);b!==a&&(this.F^=1048576,this.g(\"isAtomic\",b,a))}},isClipping:{get:function(){return 0!==(this.F&2097152)},set:function(a){var b=0!==(this.F&2097152);b!==a&&(!a||this.type===X.Spot||this instanceof U||xa(\"Warning: Panel.isClipping set on non-Spot Panel: \"+\nthis.toString()),this.F^=2097152,this instanceof U&&(this.Za=null),this.o(),this.g(\"isClipping\",b,a))}},isOpposite:{get:function(){return 0!==(this.F&33554432)},set:function(a){var b=0!==(this.F&33554432);b!==a&&(this.F^=33554432,this.o(),this.g(\"isOpposite\",b,a))}},isEnabled:{get:function(){return 0!==(this.F&4194304)},set:function(a){var b=0!==(this.F&4194304);if(b!==a){var c=null===this.panel||this.panel.Hg();this.F^=4194304;this.g(\"isEnabled\",\nb,a);b=this.diagram;null!==b&&b.undoManager.isUndoingRedoing||c&&mn(this,this,a)}}},alignmentFocusName:{get:function(){return this.Lg},set:function(a){var b=this.Lg;b!==a&&(this.Lg=a,this.o(),this.g(\"alignmentFocusName\",b,a))}}});\nna.Object.defineProperties(X,{Position:{get:function(){return Sl.G(\"Position\")}},Horizontal:{get:function(){return Sl.G(\"Horizontal\")}},Vertical:{get:function(){return Sl.G(\"Vertical\")}},Spot:{get:function(){return Sl.G(\"Spot\")}},Auto:{get:function(){return Sl.G(\"Auto\")}},Table:{get:function(){return Sl.G(\"Table\")}},Viewbox:{\nget:function(){return Sl.G(\"Viewbox\")}},TableRow:{get:function(){return Sl.G(\"TableRow\")}},TableColumn:{get:function(){return Sl.G(\"TableColumn\")}},Link:{get:function(){return Sl.G(\"Link\")}},Grid:{get:function(){return Sl.G(\"Grid\")}},Graduated:{get:function(){return Sl.G(\"Graduated\")}}});X.prototype.findItemPanelForData=X.prototype.qy;\nX.prototype.rebuildItemElements=X.prototype.eu;X.prototype.updateTargetBindings=X.prototype.Da;X.prototype.copyTemplate=X.prototype.Gz;X.prototype.graduatedValueForPoint=X.prototype.rA;X.prototype.graduatedPointForValue=X.prototype.qA;X.prototype.findColumnForLocalX=X.prototype.Tz;X.prototype.findRowForLocalY=X.prototype.aA;X.prototype.removeColumnDefinition=X.prototype.SA;X.prototype.removeRowDefinition=X.prototype.XA;X.prototype.removeAt=X.prototype.cb;X.prototype.remove=X.prototype.remove;\nX.prototype.insertAt=X.prototype.wb;X.prototype.elt=X.prototype.J;X.prototype.add=X.prototype.add;X.prototype.findObject=X.prototype.bb;X.prototype.findInVisualTree=X.prototype.ym;X.prototype.walkVisualTreeFrom=X.prototype.an;X.prototype.findMainElement=X.prototype.tb;var sn=!1,tn=null,Sl=new H;X.className=\"Panel\";X.definePanelLayout=wn;wn(\"Position\",new Am);wn(\"Vertical\",new Dm);wn(\"Auto\",new Fm);wn(\"Link\",new Qm);\nfunction Vj(){Xa(this);this.og=null;this.ns=!0;this.Ra=0;this.ad=NaN;this.nh=0;this.lh=Infinity;this.yb=Vc;this.la=this.bc=this.ha=0;this.fb=null;this.Yp=xn;this.De=al;this.Up=this.sg=null;this.Vp=NaN;this.mb=this.fk=null;this.In=!1}\nVj.prototype.copy=function(){var a=new Vj;a.ns=this.ns;a.Ra=this.Ra;a.ad=this.ad;a.nh=this.nh;a.lh=this.lh;a.yb=this.yb;a.ha=this.ha;a.bc=this.bc;a.la=this.la;a.De=this.De;a.Yp=this.Yp;null===this.sg?a.sg=null:a.sg=this.sg.H();a.Up=this.Up;a.Vp=this.Vp;a.fk=null;null!==this.fk&&(a.separatorDashArray=Ba(this.separatorDashArray));a.mb=this.mb;a.In=this.In;a.fb=this.fb;return a};t=Vj.prototype;\nt.gy=function(a){a.isRow?this.height=a.height:this.width=a.width;this.minimum=a.minimum;this.maximum=a.maximum;this.alignment=a.alignment;this.stretch=a.stretch;this.sizing=a.sizing;this.sg=null===a.separatorPadding?null:a.separatorPadding.H();this.separatorStroke=a.separatorStroke;this.separatorStrokeWidth=a.separatorStrokeWidth;this.fk=null;a.separatorDashArray&&(this.fk=Ba(a.separatorDashArray));this.background=a.background;this.coversSeparators=a.coversSeparators;this.fb=a.fb};\nt.jb=function(a){a.classType===Vj&&(this.sizing=a)};t.toString=function(){return\"RowColumnDefinition \"+(this.isRow?\"(Row \":\"(Column \")+this.index+\") #\"+kb(this)};t.sj=function(a){this.og=a};\nt.Jv=function(){var a=0,b=0,c=this.og,d=this.isRow;if(null!==c&&c.type===X.Table)for(var e=d?c.qb.length:c.nb.length,f=0;f<e;f++){var g=d?c.qb[f]:c.nb[f];if(void 0!==g){b=g.index;break}}this.index!==b&&(b=this.separatorStroke,null===b&&null!==c&&(b=this.isRow?c.defaultRowSeparatorStroke:c.defaultColumnSeparatorStroke),null!==b&&(a=this.separatorStrokeWidth,isNaN(a)&&(null!==c?a=this.isRow?c.defaultRowSeparatorStrokeWidth:c.defaultColumnSeparatorStrokeWidth:a=0)));b=this.sg;if(null===b)if(null!==c)b=\nc.defaultSeparatorPadding;else return a;return a+(this.isRow?b.top:b.left)};\nt.wc=function(){var a=0,b=this.og,c=0,d=this.isRow;if(null!==b&&b.type===X.Table)for(var e=d?b.qb.length:b.nb.length,f=0;f<e;f++){var g=d?b.qb[f]:b.nb[f];if(void 0!==g){c=g.index;break}}this.index!==c&&(c=this.separatorStroke,null===c&&null!==b&&(c=d?b.defaultRowSeparatorStroke:b.defaultColumnSeparatorStroke),null!==c&&(a=this.separatorStrokeWidth,isNaN(a)&&(null!==b?a=d?b.defaultRowSeparatorStrokeWidth:b.defaultColumnSeparatorStrokeWidth:a=0)));d=this.sg;if(null===d)if(null!==b)d=b.defaultSeparatorPadding;\nelse return a;return a+(this.isRow?d.top+d.bottom:d.left+d.right)};t.Bb=function(a,b,c){var d=this.og;if(null!==d&&(d.Va(xe,a,this,b,c,void 0,void 0),null!==this.fb&&(b=d.diagram,null!==b&&!b.skipsModelSourceBindings&&(d=d.ij(),null!==d&&(b=d.data,null!==b)))))for(c=this.fb.iterator;c.next();)c.value.jr(this,b,a,d)};function Jm(a){if(a.sizing===xn){var b=a.og;return a.isRow?b.rowSizing:b.columnSizing}return a.sizing}\nt.bind=function(a){a.pd=this;var b=this.panel;if(null!==b){var c=b.ij();null!==c&&Ol(c)&&B(\"Cannot add a Binding to a RowColumnDefinition that is already frozen: \"+a+\" on \"+b)}null===this.fb&&(this.fb=new E);this.fb.add(a)};\nna.Object.defineProperties(Vj.prototype,{panel:{get:function(){return this.og}},isRow:{get:function(){return this.ns},set:function(a){this.ns=a}},index:{get:function(){return this.Ra},set:function(a){this.Ra=a}},height:{get:function(){return this.ad},set:function(a){var b=this.ad;b!==a&&(0>a&&wa(a,\">= 0\",Vj,\"height\"),this.ad=a,this.actual=this.ha,null!==this.panel&&this.panel.o(),\nthis.Bb(\"height\",b,a))}},width:{get:function(){return this.ad},set:function(a){var b=this.ad;b!==a&&(0>a&&wa(a,\">= 0\",Vj,\"width\"),this.ad=a,this.actual=this.ha,null!==this.panel&&this.panel.o(),this.Bb(\"width\",b,a))}},minimum:{get:function(){return this.nh},set:function(a){var b=this.nh;b!==a&&((0>a||!isFinite(a))&&wa(a,\">= 0\",Vj,\"minimum\"),this.nh=a,this.actual=this.ha,null!==this.panel&&this.panel.o(),this.Bb(\"minimum\",b,a))}},maximum:{\nget:function(){return this.lh},set:function(a){var b=this.lh;b!==a&&(0>a&&wa(a,\">= 0\",Vj,\"maximum\"),this.lh=a,this.actual=this.ha,null!==this.panel&&this.panel.o(),this.Bb(\"maximum\",b,a))}},alignment:{get:function(){return this.yb},set:function(a){var b=this.yb;b.w(a)||(this.yb=a.H(),null!==this.panel&&this.panel.o(),this.Bb(\"alignment\",b,a))}},stretch:{get:function(){return this.De},set:function(a){var b=this.De;b!==a&&(this.De=\na,null!==this.panel&&this.panel.o(),this.Bb(\"stretch\",b,a))}},separatorPadding:{get:function(){return this.sg},set:function(a){\"number\"===typeof a&&(a=new kc(a));var b=this.sg;null!==a&&null!==b&&b.w(a)||(null!==a&&(a=a.H()),this.sg=a,null!==this.panel&&this.panel.o(),this.Bb(\"separatorPadding\",b,a))}},separatorStroke:{get:function(){return this.Up},set:function(a){var b=this.Up;b!==a&&(null!==a&&Wl(a,\"RowColumnDefinition.separatorStroke\"),\na instanceof zl&&a.freeze(),this.Up=a,null!==this.panel&&this.panel.o(),this.Bb(\"separatorStroke\",b,a))}},separatorStrokeWidth:{get:function(){return this.Vp},set:function(a){var b=this.Vp;b!==a&&(this.Vp=a,null!==this.panel&&this.panel.o(),this.Bb(\"separatorStrokeWidth\",b,a))}},separatorDashArray:{get:function(){return this.fk},set:function(a){var b=this.fk;if(b!==a){if(null!==a){for(var c=a.length,d=0,e=0;e<c;e++){var f=a[e];\"number\"===\ntypeof f&&0<=f&&isFinite(f)||B(\"separatorDashArray value \"+f+\" at index \"+e+\" must be a positive number or zero.\");d+=f}if(0===d){if(null===b)return;a=null}}this.fk=a;null!==this.panel&&this.panel.M();this.Bb(\"separatorDashArray\",b,a)}}},background:{get:function(){return this.mb},set:function(a){var b=this.mb;b!==a&&(null!==a&&Wl(a,\"RowColumnDefinition.background\"),a instanceof zl&&a.freeze(),this.mb=a,null!==this.panel&&this.panel.M(),this.Bb(\"background\",b,a))}},coversSeparators:{\nget:function(){return this.In},set:function(a){var b=this.In;b!==a&&(this.In=a,null!==this.panel&&this.panel.M(),this.Bb(\"coversSeparators\",b,a))}},sizing:{get:function(){return this.Yp},set:function(a){var b=this.Yp;b!==a&&(this.Yp=a,null!==this.panel&&this.panel.o(),this.Bb(\"sizing\",b,a))}},actual:{get:function(){return this.ha},set:function(a){this.ha=isNaN(this.ad)?Math.max(Math.min(this.lh,a),this.nh):Math.max(Math.min(this.lh,\nthis.ad),this.nh)}},measured:{get:function(){return this.bc},set:function(a){this.bc=a}},total:{get:function(){return this.ha+this.wc()},set:function(a){this.ha=isNaN(this.ad)?Math.max(Math.min(this.lh,a),this.nh):Math.max(Math.min(this.lh,this.ad),this.nh);this.ha=Math.max(0,this.ha-this.wc())}},position:{get:function(){return this.la},set:function(a){this.la=a}}});Vj.prototype.bind=Vj.prototype.bind;\nVj.prototype.computeEffectiveSpacing=Vj.prototype.wc;Vj.prototype.computeEffectiveSpacingTop=Vj.prototype.Jv;var xn=new D(Vj,\"Default\",0),Km=new D(Vj,\"None\",1),bn=new D(Vj,\"ProportionalExtra\",2);Vj.className=\"RowColumnDefinition\";Vj.Default=xn;Vj.None=Km;Vj.ProportionalExtra=bn;\nfunction Kf(){Y.call(this);this.Ed=this.na=null;this.Yn=\"None\";this.ho=al;this.Hc=this.tl=\"black\";this.wh=1;this.km=\"butt\";this.lm=\"miter\";this.gk=10;this.uh=null;this.vh=0;this.qf=this.pf=Vc;this.tp=this.sp=NaN;this.vo=!1;this.wp=null;this.ul=this.rm=\"None\";this.Yd=1;this.Wd=0;this.Ud=1;this.Vd=null}ma(Kf,Y);\nKf.prototype.cloneProtected=function(a){Y.prototype.cloneProtected.call(this,a);a.na=this.na;a.Yn=this.Yn;a.ho=this.ho;a.Ed=this.Ed;a.tl=this.tl;a.Hc=this.Hc;a.wh=this.wh;a.km=this.km;a.lm=this.lm;a.gk=this.gk;null!==this.uh&&(a.uh=Ba(this.uh));a.vh=this.vh;a.pf=this.pf.H();a.qf=this.qf.H();a.sp=this.sp;a.tp=this.tp;a.vo=this.vo;a.wp=this.wp;a.rm=this.rm;a.ul=this.ul;a.Yd=this.Yd;a.Wd=this.Wd;a.Ud=this.Ud;a.Vd=this.Vd};t=Kf.prototype;\nt.jb=function(a){a===zg||a===Bg||a===dl||a===al?this.geometryStretch=a:Y.prototype.jb.call(this,a)};t.toString=function(){return\"Shape(\"+(\"None\"!==this.figure?this.figure:\"None\"!==this.toArrow?this.toArrow:this.fromArrow)+\")#\"+kb(this)};\nfunction yn(a,b,c,d){var e=c.length;if(!(4>e)){var f=d.measuredBounds,g=Math.max(1,f.width);f=f.height;for(var h=c[0],k=c[1],l,m,n,p,r,q,u=0,w=Ea(),v=2;v<e;v+=2)l=c[v],m=c[v+1],n=l-h,h=m-k,0===n&&(n=.001),p=h/n,r=Math.atan2(h,n),q=Math.sqrt(n*n+h*h),w.push([n,r,p,q]),u+=q,h=l,k=m;h=c[0];k=c[1];n=d.measuredBounds.width;d instanceof Kf&&(n-=d.strokeWidth);1>n&&(n=1);e=c=n;l=g/2;m=0===l?!1:!0;v=0;q=w[v];n=q[0];r=q[1];p=q[2];q=q[3];for(var y=0;.1<=u;){0===y&&(m?(e=c,e-=l,u-=l,m=!1):e=c,0===e&&(e=1));\nif(e>u){Ia(w);return}e>q?(y=e-q,e=q):y=0;var z=Math.sqrt(e*e/(1+p*p));0>n&&(z=-z);h+=z;k+=p*z;a.translate(h,k);a.rotate(r);a.translate(-(g/2),-(f/2));0===y&&d.ej(a,b);a.translate(g/2,f/2);a.rotate(-r);a.translate(-h,-k);u-=e;q-=e;if(0!==y){v++;if(v===w.length){Ia(w);return}q=w[v];n=q[0];r=q[1];p=q[2];q=q[3];e=y}}Ia(w)}}\nt.ej=function(a,b){var c=this.Hc,d=this.tl;if(null!==c||null!==d){var e=this.actualBounds,f=this.naturalBounds;null!==d&&ni(this,a,d,!0,!1,f,e);var g=this.part,h=this.wh;null===c||0!==h||null===g||!this.isPanelMain&&g.tb()!==this||(h=g.type===X.Link&&g instanceof Je&&\"Selection\"===g.category&&g.adornedObject instanceof Kf&&g.adornedPart.tb()===g.adornedObject?g.adornedObject.strokeWidth:0);0===h&&(c=null);null!==c&&0!==h&&(ni(this,a,c,!1,!1,f,e),a.lineWidth=h,a.lineJoin=this.lm,a.lineCap=this.km,\na.miterLimit=this.gk);e=!1;g&&b.Ke(\"drawShadows\")&&(e=g.isShadowed);g=!0;null===c||null!==d&&\"transparent\"!==d||(g=!1);f=!1;h=this.strokeDashArray;null!==h&&(f=!0,a.Ft(h,this.vh));var k=this.na;if(null!==k){if(k.type===ud)a.beginPath(),a.moveTo(k.startX,k.startY),a.lineTo(k.endX,k.endY),null!==c&&a.vj();else if(k.type===yd){var l=k.startX;h=k.startY;var m=k.endX,n=k.endY;k=Math.min(l,m);var p=Math.min(h,n);l=Math.abs(m-l);h=Math.abs(n-h);a.beginPath();a.rect(k,p,l,h);null!==d&&a.Je(d);if(null!==c){g&&\ne&&yl(a);if(0===l||0===h)a.beginPath(),a.rect(k,p,Math.max(l,.1),Math.max(h,.1));a.vj();g&&e&&xl(a)}}else if(k.type===zd)l=k.startX,h=k.startY,m=k.endX,n=k.endY,k=Math.abs(m-l)/2,p=Math.abs(n-h)/2,l=Math.min(l,m)+k,h=Math.min(h,n)+p,a.beginPath(),a.moveTo(l,h-p),a.bezierCurveTo(l+L.Kg*k,h-p,l+k,h-L.Kg*p,l+k,h),a.bezierCurveTo(l+k,h+L.Kg*p,l+L.Kg*k,h+p,l,h+p),a.bezierCurveTo(l-L.Kg*k,h+p,l-k,h+L.Kg*p,l-k,h),a.bezierCurveTo(l-k,h-L.Kg*p,l-L.Kg*k,h-p,l,h-p),a.closePath(),null!==d&&a.Je(d),null!==c&&\n(g&&e?(yl(a),a.vj(),xl(a)):a.vj());else if(k.type===sd)for(h=k.figures,k=h.length,p=0;p<k;p++){l=h.j[p];a.beginPath();a.moveTo(l.startX,l.startY);m=l.segments.j;n=m.length;for(var r=null,q=0;q<n;q++){var u=m[q];switch(u.type){case Zd:a.moveTo(u.endX,u.endY);break;case wd:a.lineTo(u.endX,u.endY);break;case $d:a.bezierCurveTo(u.point1X,u.point1Y,u.point2X,u.point2Y,u.endX,u.endY);break;case ae:a.quadraticCurveTo(u.point1X,u.point1Y,u.endX,u.endY);break;case be:if(u.radiusX===u.radiusY){var w=Math.PI/\n180;a.arc(u.point1X,u.point1Y,u.radiusX,u.startAngle*w,(u.startAngle+u.sweepAngle)*w,0>u.sweepAngle,null!==r?r.endX:l.startX,null!==r?r.endY:l.startY)}else if(r=de(u,l),w=r.length,0===w)a.lineTo(u.centerX,u.centerY);else for(var v=0;v<w;v++){var y=r[v];0===v&&a.lineTo(y[0],y[1]);a.bezierCurveTo(y[2],y[3],y[4],y[5],y[6],y[7])}break;case ce:v=w=0;if(null!==r&&r.type===be){r=de(r,l);y=r.length;if(0===y){a.lineTo(u.endX,u.endY);break}r=r[y-1]||null;null!==r&&(w=r[6],v=r[7])}else w=null!==r?r.endX:l.startX,\nv=null!==r?r.endY:l.startY;r=ee(u,l,w,v);w=r.length;if(0===w){a.lineTo(u.endX,u.endY);break}for(v=0;v<w;v++)y=r[v],a.bezierCurveTo(y[2],y[3],y[4],y[5],y[6],y[7]);break;default:B(\"Segment not of valid type: \"+u.type)}u.isClosed&&a.closePath();r=u}m=l.isFilled;e?l.isShadowed?(!0===m&&\"transparent\"!==d&&null!==d&&a.Je(d),null!==c&&(m&&g&&yl(a),a.vj(),m&&g&&xl(a))):(yl(a),m&&\"transparent\"!==d&&null!==d&&a.Je(d),null!==c&&a.vj(),xl(a)):(m&&null!==d&&a.Je(d),null!==c&&a.vj())}f&&a.Dt();if(null!==this.pathPattern){c=\nthis.pathPattern;c.measure(Infinity,Infinity);d=c.measuredBounds;c.arrange(0,0,d.width,d.height);e=this.geometry;a.save();a.beginPath();d=Ea();if(e.type===ud)d.push(e.startX),d.push(e.startY),d.push(e.endX),d.push(e.endY),yn(a,b,d,c);else if(e.type===sd)for(e=e.figures.iterator;e.next();){g=e.value;d.length=0;d.push(g.startX);d.push(g.startY);f=g.startX;h=g.startY;k=f;p=h;l=g.segments.j;m=l.length;for(n=0;n<m;n++){q=l[n];switch(q.type){case Zd:yn(a,b,d,c);d.length=0;d.push(q.endX);d.push(q.endY);\nf=q.endX;h=q.endY;k=f;p=h;break;case wd:d.push(q.endX);d.push(q.endY);f=q.endX;h=q.endY;break;case $d:L.Fe(f,h,q.point1X,q.point1Y,q.point2X,q.point2Y,q.endX,q.endY,.5,d);f=q.endX;h=q.endY;break;case ae:L.Vq(f,h,q.point1X,q.point1Y,q.endX,q.endY,.5,d);f=q.endX;h=q.endY;break;case be:u=de(q,g);r=u.length;if(0===r){d.push(q.centerX);d.push(q.centerY);f=q.centerX;h=q.centerY;break}for(w=0;w<r;w++)v=u[w],L.Fe(f,h,v[2],v[3],v[4],v[5],v[6],v[7],.5,d),f=v[6],h=v[7];break;case ce:u=ee(q,g,f,h);r=u.length;\nif(0===r){d.push(q.endX);d.push(q.endY);f=q.endX;h=q.endY;break}for(w=0;w<r;w++)v=u[w],L.Fe(f,h,v[2],v[3],v[4],v[5],v[6],v[7],.5,d),f=v[6],h=v[7];break;default:B(\"Segment not of valid type: \"+q.type)}q.isClosed&&(d.push(k),d.push(p),yn(a,b,d,c))}yn(a,b,d,c)}else if(e.type===yd)d.push(e.startX),d.push(e.startY),d.push(e.endX),d.push(e.startY),d.push(e.endX),d.push(e.endY),d.push(e.startX),d.push(e.endY),d.push(e.startX),d.push(e.startY),yn(a,b,d,c);else if(e.type===zd){h=new je;h.startX=e.endX;h.startY=\n(e.startY+e.endY)/2;f=new ke(be);f.startAngle=0;f.sweepAngle=360;f.centerX=(e.startX+e.endX)/2;f.centerY=(e.startY+e.endY)/2;f.radiusX=Math.abs(e.startX-e.endX)/2;f.radiusY=Math.abs(e.startY-e.endY)/2;h.add(f);e=de(f,h);g=e.length;if(0===g)d.push(f.centerX),d.push(f.centerY);else for(f=h.startX,h=h.startY,k=0;k<g;k++)p=e[k],L.Fe(f,h,p[2],p[3],p[4],p[5],p[6],p[7],.5,d),f=p[6],h=p[7];yn(a,b,d,c)}Ia(d);a.restore();a.uc(!1)}}}};\nt.da=function(a,b){void 0===b&&(b=new J);if(a instanceof O){a.nc()&&B(\"getDocumentPoint Spot must be a real, specific Spot, not: \"+a.toString());var c=this.naturalBounds,d=this.strokeWidth;b.h(a.x*(c.width+d)-d/2+c.x+a.offsetX,a.y*(c.height+d)-d/2+c.y+a.offsetY)}else b.set(a);this.Fd.ta(b);return b};\nt.mj=function(a){void 0===a&&(a=new N);var b=this.naturalBounds,c=this.Fd;b=N.allocAt(b.x,b.y,b.width,b.height);var d=this.strokeWidth;b.Jc(d/2,d/2);d=J.allocAt(b.x,b.y).transform(c);a.h(d.x,d.y,0,0);d.h(b.right,b.y).transform(c);bc(a,d.x,d.y,0,0);d.h(b.right,b.bottom).transform(c);bc(a,d.x,d.y,0,0);d.h(b.x,b.bottom).transform(c);bc(a,d.x,d.y,0,0);N.free(b);J.free(d);return a};\nt.Kh=function(a,b){var c=this.geometry;if(null===c||null===this.fill&&null===this.stroke)return!1;var d=c.bounds,e=this.strokeWidth/2;c.type!==ud||b||(e+=2);var f=N.alloc();f.assign(d);f.Jc(e+2,e+2);if(!f.$(a))return N.free(f),!1;d=e+1E-4;if(c.type===ud){if(null===this.stroke)return!1;d=(c.endX-c.startX)*(a.x-c.startX)+(c.endY-c.startY)*(a.y-c.startY);if(0>(c.startX-c.endX)*(a.x-c.endX)+(c.startY-c.endY)*(a.y-c.endY)||0>d)return!1;N.free(f);return L.Nb(c.startX,c.startY,c.endX,c.endY,e,a.x,a.y)}if(c.type===\nyd){b=c.startX;var g=c.startY,h=c.endX;c=c.endY;f.x=Math.min(b,h);f.y=Math.min(g,c);f.width=Math.abs(h-b);f.height=Math.abs(c-g);if(null===this.fill){f.Jc(-d,-d);if(f.$(a))return N.free(f),!1;f.Jc(d,d)}null!==this.stroke&&f.Jc(e,e);a=f.$(a);N.free(f);return a}if(c.type===zd){g=c.startX;e=c.startY;h=c.endX;var k=c.endY;c=Math.min(g,h);b=Math.min(e,k);g=Math.abs(h-g)/2;e=Math.abs(k-e)/2;c=a.x-(c+g);b=a.y-(b+e);if(null===this.fill){g-=d;e-=d;if(0>=g||0>=e||1>=c*c/(g*g)+b*b/(e*e))return N.free(f),!1;\ng+=d;e+=d}null!==this.stroke&&(g+=d,e+=d);N.free(f);return 0>=g||0>=e?!1:1>=c*c/(g*g)+b*b/(e*e)}if(c.type===sd)return N.free(f),null===this.fill?he(c,a.x,a.y,e):fe(c,a,e,1<this.strokeWidth,b);B(\"Unknown Geometry type: \"+c.type);return!1};\nt.Hm=function(a,b,c,d){var e=this.desiredSize,f=this.wh;a=Math.max(a,0);b=Math.max(b,0);if(null!==this.Ed)var g=this.geometry.bounds;else{var h=this.figure,k=zn[h];if(void 0===k){var l=L.Qe[h];\"string\"===typeof l&&(l=L.Qe[l]);\"function\"===typeof l?(k=l(null,100,100),zn[h]=k):B(\"Unsupported Figure: \"+h)}g=k.bounds}h=g.width;k=g.height;l=g.width;var m=g.height;switch(ql(this,!0)){case zg:d=c=0;break;case td:l=Math.max(a-f,0);m=Math.max(b-f,0);break;case bl:l=Math.max(a-f,0);d=0;break;case cl:c=0,m=\nMath.max(b-f,0)}isFinite(e.width)&&(l=e.width);isFinite(e.height)&&(m=e.height);e=this.maxSize;g=this.minSize;c=Math.max(c-f,g.width);d=Math.max(d-f,g.height);l=Math.min(e.width,l);m=Math.min(e.height,m);l=isFinite(l)?Math.max(c,l):Math.max(h,c);m=isFinite(m)?Math.max(d,m):Math.max(k,d);c=Ag(this);switch(c){case zg:break;case td:h=l;k=m;break;case Bg:c=Math.min(l/h,m/k);isFinite(c)||(c=1);h*=c;k*=c;break;default:B(c+\" is not a valid geometryStretch.\")}null!==this.Ed?(0===h&&(h=.001),0===k&&(k=.001),\nc=null!==this.Ed?this.Ed:this.na,e=c.bounds,d=h/e.width,e=k/e.height,isFinite(d)||(d=1),isFinite(e)||(e=1),this.na=1===d&&1===e?c:c.copy().scale(d,e)):null!==this.na&&L.aa(this.na.Dl,a-f)&&L.aa(this.na.Cl,b-f)||(this.na=Kf.makeGeometry(this,h,k));g=this.na.bounds;Infinity===a||Infinity===b?nl(this,g.x-f/2,g.y-f/2,0===a&&0===h?0:g.width+f,0===b&&0===k?0:g.height+f):nl(this,-(f/2),-(f/2),l+f,m+f)};\nfunction Ag(a){var b=a.geometryStretch;return null!==a.Ed?b===al?td:b:b===al?zn[a.figure].defaultStretch:b}t.Ih=function(a,b,c,d){sl(this,a,b,c,d)};t.Nt=function(a,b,c){return this.zk(a.x,a.y,b.x,b.y,c)};\nt.zk=function(a,b,c,d,e){var f=this.transform,g=1/(f.m11*f.m22-f.m12*f.m21),h=f.m22*g,k=-f.m12*g,l=-f.m21*g,m=f.m11*g,n=g*(f.m21*f.dy-f.m22*f.dx),p=g*(f.m12*f.dx-f.m11*f.dy);f=a*h+b*l+n;g=a*k+b*m+p;h=c*h+d*l+n;k=c*k+d*m+p;n=this.wh/2;l=this.na;null===l&&(this.measure(Infinity,Infinity),l=this.na);var r=l.bounds;m=!1;if(l.type===ud)if(1.5>=this.strokeWidth)m=L.Me(l.startX,l.startY,l.endX,l.endY,f,g,h,k,e);else{l.startX===l.endX?(d=n,m=0):(b=(l.endY-l.startY)/(l.endX-l.startX),m=n/Math.sqrt(1+b*b),\nd=m*b);b=Ea();a=new J;L.Me(l.startX+d,l.startY+m,l.endX+d,l.endY+m,f,g,h,k,a)&&b.push(a);a=new J;L.Me(l.startX-d,l.startY-m,l.endX-d,l.endY-m,f,g,h,k,a)&&b.push(a);a=new J;L.Me(l.startX+d,l.startY+m,l.startX-d,l.startY-m,f,g,h,k,a)&&b.push(a);a=new J;L.Me(l.endX+d,l.endY+m,l.endX-d,l.endY-m,f,g,h,k,a)&&b.push(a);h=b.length;if(0===h)return Ia(b),!1;m=!0;k=Infinity;for(d=0;d<h;d++)a=b[d],c=(a.x-f)*(a.x-f)+(a.y-g)*(a.y-g),c<k&&(k=c,e.x=a.x,e.y=a.y);Ia(b)}else if(l.type===yd)m=L.Cf(r.x-n,r.y-n,r.x+r.width+\nn,r.y+r.height+n,f,g,h,k,e);else if(l.type===zd){b=N.allocAt(r.x,r.y,r.width,r.height).Jc(n,n);a:if(0===b.width)m=L.Me(b.x,b.y,b.x,b.y+b.height,f,g,h,k,e);else if(0===b.height)m=L.Me(b.x,b.y,b.x+b.width,b.y,f,g,h,k,e);else{a=b.width/2;l=b.height/2;d=b.x+a;m=b.y+l;c=9999;f!==h&&(c=(g-k)/(f-h));if(9999>Math.abs(c)){k=g-m-c*(f-d);if(0>a*a*c*c+l*l-k*k){e.x=NaN;e.y=NaN;m=!1;break a}n=Math.sqrt(a*a*c*c+l*l-k*k);h=(-(a*a*c*k)+a*l*n)/(l*l+a*a*c*c)+d;a=(-(a*a*c*k)-a*l*n)/(l*l+a*a*c*c)+d;l=c*(h-d)+k+m;k=c*\n(a-d)+k+m;Math.abs((f-h)*(f-h))+Math.abs((g-l)*(g-l))<Math.abs((f-a)*(f-a))+Math.abs((g-k)*(g-k))?(e.x=h,e.y=l):(e.x=a,e.y=k)}else{h=l*l;k=f-d;h-=h/(a*a)*k*k;if(0>h){e.x=NaN;e.y=NaN;m=!1;break a}k=Math.sqrt(h);h=m+k;k=m-k;Math.abs(h-g)<Math.abs(k-g)?(e.x=f,e.y=h):(e.x=f,e.y=k)}m=!0}N.free(b)}else if(l.type===sd){p=J.alloc();var q=h-f;var u=k-g,w=q*q+u*u,v=f,y=g;if(0<w&&r.contains(v,y)&&(p.x=v,p.y=y,this.$(p)))for(0!==q&&.5>Math.abs(q)?(u*=.5/q,q=.5):0!==u&&.5>Math.abs(u)&&(q*=.5/u,u=.5),v-=q,y-=u;r.contains(v,\ny);)v-=q,y-=u;e.x=h;e.y=k;for(u=0;u<l.figures.count;u++){var z=l.figures.j[u],A=z.isFilled?v:f,C=z.isFilled?y:g,F=z.segments;r=z.startX;q=z.startY;for(var Q=r,K=q,T=0;T<F.count;T++){var P=F.j[T],I=P.type;var ja=P.endX;var ba=P.endY;var qa=!1;switch(I){case Zd:Q=ja;K=ba;break;case wd:qa=An(r,q,ja,ba,A,C,h,k,p);break;case $d:qa=L.wq(r,q,P.point1X,P.point1Y,P.point2X,P.point2Y,ja,ba,A,C,h,k,.6,p);break;case ae:qa=L.wq(r,q,r+2/3*(P.point1X-r),q+2/3*(P.point1Y-q),ja+2/3*(P.point1X-ja),ba+2/3*(P.point1Y-\nba),ja,ba,A,C,h,k,.6,p);break;case be:case ce:I=P.type===be?de(P,z):ee(P,z,r,q);var Ma=I.length;if(0===Ma){qa=An(r,q,P.type===be?P.centerX:P.endX,P.type===be?P.centerY:P.endY,A,C,h,k,p);break}ba=null;for(ja=0;ja<Ma;ja++){ba=I[ja];if(0===ja&&An(r,q,ba[0],ba[1],A,C,h,k,p)){var eb=Kn(A,C,p,w,e);eb<w&&(w=eb,m=!0)}L.wq(ba[0],ba[1],ba[2],ba[3],ba[4],ba[5],ba[6],ba[7],A,C,h,k,.6,p)&&(eb=Kn(A,C,p,w,e),eb<w&&(w=eb,m=!0))}ja=ba[6];ba=ba[7];break;default:B(\"Unknown Segment type: \"+I)}r=ja;q=ba;qa&&(qa=Kn(A,\nC,p,w,e),qa<w&&(w=qa,m=!0));P.isClosed&&(ja=Q,ba=K,An(r,q,ja,ba,A,C,h,k,p)&&(P=Kn(A,C,p,w,e),P<w&&(w=P,m=!0)))}}f=c-a;g=d-b;h=Math.sqrt(f*f+g*g);0!==h&&(f/=h,g/=h);e.x-=f*n;e.y-=g*n;J.free(p)}else B(\"Unknown Geometry type: \"+l.type);if(!m)return!1;this.transform.ta(e);return!0};function Kn(a,b,c,d,e){a=c.x-a;b=c.y-b;b=a*a+b*b;return b<d?(e.x=c.x,e.y=c.y,b):d}\nfunction An(a,b,c,d,e,f,g,h,k){var l=!1,m=(e-g)*(b-d)-(f-h)*(a-c);if(0===m)return!1;k.x=((e*h-f*g)*(a-c)-(e-g)*(a*d-b*c))/m;k.y=((e*h-f*g)*(b-d)-(f-h)*(a*d-b*c))/m;(a>c?a-c:c-a)<(b>d?b-d:d-b)?(a=b<d?b:d,b=b<d?d:b,(k.y>a||L.aa(k.y,a))&&(k.y<b||L.aa(k.y,b))&&(l=!0)):(b=a<c?a:c,a=a<c?c:a,(k.x>b||L.aa(k.x,b))&&(k.x<a||L.aa(k.x,a))&&(l=!0));return l}\nt.Jh=function(a,b){if(void 0===b)return a.Ge(this.actualBounds);var c=this.na;null===c&&(this.measure(Infinity,Infinity),c=this.na);c=c.bounds;var d=this.strokeWidth/2,e=!1,f=J.alloc();f.h(c.x-d,c.y-d);a.$(b.ta(f))&&(f.h(c.x-d,c.bottom+d),a.$(b.ta(f))&&(f.h(c.right+d,c.bottom+d),a.$(b.ta(f))&&(f.h(c.right+d,c.y-d),a.$(b.ta(f))&&(e=!0))));J.free(f);return e};\nt.Mc=function(a,b){if(this.Jh(a,b)||void 0===b&&(b=this.transform,a.Ge(this.actualBounds)))return!0;var c=ld.alloc();c.set(b);c.St();var d=a.left,e=a.right,f=a.top;a=a.bottom;var g=J.alloc();g.h(d,f);c.ta(g);if(this.Kh(g,!0))return J.free(g),!0;g.h(e,f);c.ta(g);if(this.Kh(g,!0))return J.free(g),!0;g.h(d,a);c.ta(g);if(this.Kh(g,!0))return J.free(g),!0;g.h(e,a);c.ta(g);if(this.Kh(g,!0))return J.free(g),!0;var h=J.alloc(),k=J.alloc();c.set(b);c.jw(this.transform);c.St();h.x=e;h.y=f;h.transform(c);g.x=\nd;g.y=f;g.transform(c);b=!1;Ln(this,g,h,k)?b=!0:(g.x=e,g.y=a,g.transform(c),Ln(this,g,h,k)?b=!0:(h.x=d,h.y=a,h.transform(c),Ln(this,g,h,k)?b=!0:(g.x=d,g.y=f,g.transform(c),Ln(this,g,h,k)&&(b=!0))));J.free(g);ld.free(c);J.free(h);J.free(k);return b};function Ln(a,b,c,d){if(!a.Nt(b,c,d))return!1;a=b.x;b=b.y;var e=c.x,f=c.y;c=d.x;d=d.y;if(a===e)return b<f?(a=b,b=f):a=f,d>=a&&d<=b;a<e?(d=a,a=e):d=e;return c>=d&&c<=a}\nt.sy=function(a,b,c){function d(a,b){for(var c=a.length,d=0;d<c;d+=2)if(b.qd(a[d],a[d+1])>e)return!0;return!1}if(c&&null!==this.fill&&this.Kh(a,!0))return!0;var e=a.Ie(b),f=e;1.5<this.strokeWidth&&(e=this.strokeWidth/2+Math.sqrt(e),e*=e);b=this.na;if(null===b&&(this.measure(Infinity,Infinity),b=this.na,null===b))return!1;if(!c){var g=b.bounds,h=g.x,k=g.y,l=g.x+g.width;g=g.y+g.height;if(yb(a.x,a.y,h,k)<=e&&yb(a.x,a.y,l,k)<=e&&yb(a.x,a.y,h,g)<=e&&yb(a.x,a.y,l,g)<=e)return!0}h=b.startX;k=b.startY;l=\nb.endX;g=b.endY;if(b.type===ud){if(c=(h-l)*(a.x-l)+(k-g)*(a.y-g),xb(a.x,a.y,h,k,l,g)<=(0<=(l-h)*(a.x-h)+(g-k)*(a.y-k)&&0<=c?e:f))return!0}else{if(b.type===yd)return b=!1,c&&(b=xb(a.x,a.y,h,k,h,g)<=e||xb(a.x,a.y,h,k,l,k)<=e||xb(a.x,a.y,l,k,l,g)<=e||xb(a.x,a.y,h,g,l,g)<=e),b;if(b.type===zd){b=a.x-(h+l)/2;f=a.y-(k+g)/2;var m=Math.abs(l-h)/2,n=Math.abs(g-k)/2;if(0===m||0===n)return xb(a.x,a.y,h,k,l,g)<=e?!0:!1;if(c){if(a=L.Mz(m,n,b,f),a*a<=e)return!0}else return yb(b,f,-m,0)>=e||yb(b,f,0,-n)>=e||yb(b,\nf,0,n)>=e||yb(b,f,m,0)>=e?!1:!0}else if(b.type===sd){l=b.bounds;f=l.x;h=l.y;k=l.x+l.width;l=l.y+l.height;if(a.x>k&&a.x<f&&a.y>l&&a.y<h&&xb(a.x,a.y,f,h,f,l)>e&&xb(a.x,a.y,f,h,k,h)>e&&xb(a.x,a.y,k,l,f,l)>e&&xb(a.x,a.y,k,l,k,h)>e)return!1;f=Math.sqrt(e);if(c){if(null===this.fill?he(b,a.x,a.y,f):fe(b,a,f,!0,!1))return!0}else{c=b.figures;for(b=0;b<c.count;b++){f=c.j[b];g=f.startX;m=f.startY;if(a.qd(g,m)>e)return!1;h=f.segments.j;k=h.length;for(l=0;l<k;l++)switch(n=h[l],n.type){case Zd:case wd:g=n.endX;\nm=n.endY;if(a.qd(g,m)>e)return!1;break;case $d:var p=Ea();L.Fe(g,m,n.point1X,n.point1Y,n.point2X,n.point2Y,n.endX,n.endY,.8,p);g=d(p,a);Ia(p);if(g)return!1;g=n.endX;m=n.endY;if(a.qd(g,m)>e)return!1;break;case ae:p=Ea();L.Vq(g,m,n.point1X,n.point1Y,n.endX,n.endY,.8,p);g=d(p,a);Ia(p);if(g)return!1;g=n.endX;m=n.endY;if(a.qd(g,m)>e)return!1;break;case be:case ce:p=n.type===be?de(n,f):ee(n,f,g,m);var r=p.length;if(0===r){g=n.type===be?n.centerX:n.endX;m=n.type===be?n.centerY:n.endY;if(a.qd(g,m)>e)return!1;\nbreak}n=null;for(var q=Ea(),u=0;u<r;u++)if(n=p[u],q.length=0,L.Fe(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],.8,q),d(q,a))return Ia(q),!1;Ia(q);null!==n&&(g=n[6],m=n[7]);break;default:B(\"Unknown Segment type: \"+n.type)}}return!0}}}return!1};t.dc=function(){this.na=null};function Mn(a){var b=a.diagram;null!==b&&b.undoManager.isUndoingRedoing||(a.segmentOrientation=Zm,\"None\"!==a.rm?(a.segmentIndex=-1,a.alignmentFocus=dd):\"None\"!==a.ul&&(a.segmentIndex=0,a.alignmentFocus=new O(1-dd.x,dd.y)))}\nKf.makeGeometry=function(a,b,c){if(\"None\"!==a.toArrow)var d=Nn[a.toArrow];else\"None\"!==a.fromArrow?d=Nn[a.fromArrow]:(d=L.Qe[a.figure],\"string\"===typeof d&&(d=L.Qe[d]),void 0===d&&B(\"Unknown Shape.figure: \"+a.figure),d=d(a,b,c),d.Dl=b,d.Cl=c);if(null===d){var e=L.Qe.Rectangle;\"function\"===typeof e&&(d=e(a,b,c))}return d};\nfunction On(a){var b=Nn[a];if(void 0===b){var c=a.toLowerCase();if(\"none\"===c)return\"None\";b=Nn[c];if(void 0===b){var d=null,e;for(e in L.dn)if(e.toLowerCase()===c){d=e;break}if(null!==d)return a=Dd(L.dn[d],!1),Nn[d]=a,c!==d&&(Nn[c]=d),d}}return\"string\"===typeof b?b:b instanceof rd?a:null}\nna.Object.defineProperties(Kf.prototype,{geometry:{get:function(){return null!==this.na?this.na:this.Ed},set:function(a){var b=this.na,c=this.Ed;if(b!==a){null!==a?this.Ed=this.na=a.freeze():this.Ed=this.na=null;var d=this.part;null!==d&&(d.kh=NaN);this.o();this.g(\"geometry\",b||c,a);kl(this)&&(a=this.part,null!==a&&ll(this,a,\"geometryString\"))}}},geometryString:{get:function(){return null===this.geometry?\"\":this.geometry.toString()},set:function(a){a=\nDd(a);var b=a.normalize();this.geometry=a;this.position=a=J.allocAt(-b.x,-b.y);J.free(a)}},isGeometryPositioned:{get:function(){return this.vo},set:function(a){var b=this.vo;b!==a&&(this.vo=a,this.o(),this.g(\"isGeometryPositioned\",b,a))}},fill:{get:function(){return this.tl},set:function(a){var b=this.tl;b!==a&&(null!==a&&Wl(a,\"Shape.fill\"),a instanceof zl&&a.freeze(),this.tl=a,this.M(),this.g(\"fill\",b,a))}},stroke:{\nget:function(){return this.Hc},set:function(a){var b=this.Hc;b!==a&&(null!==a&&Wl(a,\"Shape.stroke\"),a instanceof zl&&a.freeze(),this.Hc=a,this.M(),this.g(\"stroke\",b,a))}},strokeWidth:{get:function(){return this.wh},set:function(a){var b=this.wh;if(b!==a)if(0<=a){this.wh=a;this.o();var c=this.part;null!==c&&(c.kh=NaN);this.g(\"strokeWidth\",b,a)}else wa(a,\"value >= 0\",Kf,\"strokeWidth:value\")}},strokeCap:{get:function(){return this.km},set:function(a){var b=\nthis.km;b!==a&&(\"string\"!==typeof a||\"butt\"!==a&&\"round\"!==a&&\"square\"!==a?wa(a,'\"butt\", \"round\", or \"square\"',Kf,\"strokeCap\"):(this.km=a,this.M(),this.g(\"strokeCap\",b,a)))}},strokeJoin:{get:function(){return this.lm},set:function(a){var b=this.lm;b!==a&&(\"string\"!==typeof a||\"miter\"!==a&&\"bevel\"!==a&&\"round\"!==a?wa(a,'\"miter\", \"bevel\", or \"round\"',Kf,\"strokeJoin\"):(this.lm=a,this.M(),this.g(\"strokeJoin\",b,a)))}},strokeMiterLimit:{get:function(){return this.gk},\nset:function(a){var b=this.gk;if(b!==a&&1<=a){this.gk=a;this.M();var c=this.part;null!==c&&(c.kh=NaN);this.g(\"strokeMiterLimit\",b,a)}}},strokeDashArray:{get:function(){return this.uh},set:function(a){var b=this.uh;if(b!==a){if(null!==a){for(var c=a.length,d=0,e=0;e<c;e++){var f=a[e];0<=f&&isFinite(f)||B(\"strokeDashArray:value \"+f+\" at index \"+e+\" must be a positive number or zero.\");d+=f}if(0===d){if(null===b)return;a=null}}this.uh=a;this.M();this.g(\"strokeDashArray\",\nb,a)}}},strokeDashOffset:{get:function(){return this.vh},set:function(a){var b=this.vh;b!==a&&0<=a&&(this.vh=a,this.M(),this.g(\"strokeDashOffset\",b,a))}},figure:{get:function(){return this.Yn},set:function(a){var b=this.Yn;if(b!==a){var c=L.Qe[a];\"function\"===typeof c?c=a:(c=L.Qe[a.toLowerCase()])||B(\"Unknown Shape.figure: \"+a);b!==c&&(a=this.part,null!==a&&(a.kh=NaN),this.Yn=c,this.Ed=null,this.dc(),this.o(),this.g(\"figure\",b,c))}}},toArrow:{\nget:function(){return this.rm},set:function(a){var b=this.rm;!0===a?a=\"Standard\":!1===a&&(a=\"\");if(b!==a){var c=On(a);null===c?B(\"Unknown Shape.toArrow: \"+a):b!==c&&(this.rm=c,this.Ed=null,this.dc(),this.o(),Mn(this),this.g(\"toArrow\",b,c))}}},fromArrow:{get:function(){return this.ul},set:function(a){var b=this.ul;!0===a?a=\"Standard\":!1===a&&(a=\"\");if(b!==a){var c=On(a);null===c?B(\"Unknown Shape.fromArrow: \"+a):b!==c&&(this.ul=c,this.Ed=null,this.dc(),this.o(),\nMn(this),this.g(\"fromArrow\",b,c))}}},spot1:{get:function(){return this.pf},set:function(a){var b=this.pf;b.w(a)||(this.pf=a=a.H(),this.o(),this.g(\"spot1\",b,a))}},spot2:{get:function(){return this.qf},set:function(a){var b=this.qf;b.w(a)||(this.qf=a=a.H(),this.o(),this.g(\"spot2\",b,a))}},parameter1:{get:function(){return this.sp},set:function(a){var b=this.sp;b!==a&&(this.sp=a,this.dc(),this.o(),this.g(\"parameter1\",\nb,a))}},parameter2:{get:function(){return this.tp},set:function(a){var b=this.tp;b!==a&&(this.tp=a,this.dc(),this.o(),this.g(\"parameter2\",b,a))}},naturalBounds:{get:function(){var a=this.desiredSize;return a.s()||null===this.na?new N(0,0,a.width,a.height):(this.rc.assign(this.na.bounds),this.rc)}},pathPattern:{get:function(){return this.wp},set:function(a){var b=this.wp;b!==a&&(this.wp=a,this.M(),this.g(\"pathPattern\",\nb,a))}},geometryStretch:{get:function(){return this.ho},set:function(a){var b=this.ho;b!==a&&(this.ho=a,this.o(),this.g(\"geometryStretch\",b,a))}},interval:{get:function(){return this.Yd},set:function(a){var b=this.Yd;a=Math.round(a);if(b!==a&&0!==a&&isFinite(a)){this.Yd=a;var c=this.diagram;null!==c&&this.panel===c.grid&&qj(c);this.o();c=this.panel;null!==c&&(c.eh=null);this.g(\"interval\",b,a)}}},graduatedStart:{\nget:function(){return this.Wd},set:function(a){var b=this.Wd;b!==a&&(0>a?a=0:1<a&&(a=1),this.Wd=a,this.o(),this.g(\"graduatedStart\",b,a))}},graduatedEnd:{get:function(){return this.Ud},set:function(a){var b=this.Ud;b!==a&&(0>a?a=0:1<a&&(a=1),this.Ud=a,this.o(),this.g(\"graduatedEnd\",b,a))}},graduatedSkip:{get:function(){return this.Vd},set:function(a){var b=this.Vd;b!==a&&(this.Vd=a,this.o(),this.g(\"graduatedSkip\",b,a))}}});\nKf.prototype.intersectsRect=Kf.prototype.Mc;Kf.prototype.containedInRect=Kf.prototype.Jh;Kf.prototype.getNearestIntersectionPoint=Kf.prototype.Nt;Kf.prototype.getDocumentBounds=Kf.prototype.mj;Kf.prototype.getDocumentPoint=Kf.prototype.da;var Nn=new $a,zn=new $a;Kf.className=\"Shape\";Kf.getFigureGenerators=function(){var a=new H,b;for(b in L.Qe)b!==b.toLowerCase()&&a.add(b,L.Qe[b]);a.freeze();return a};Kf.defineFigureGenerator=function(a,b){var c=a.toLowerCase(),d=L.Qe;d[a]=b;d[c]=a};\nKf.getArrowheadGeometries=function(){var a=new H;for(d in L.dn)if(void 0===Nn[d]){var b=Dd(L.dn[d],!1);Nn[d]=b;b=d.toLowerCase();b!==d&&(Nn[b]=d)}for(var c in Nn)if(c!==c.toLowerCase()){var d=Nn[c];d instanceof rd&&a.add(c,d)}a.freeze();return a};Kf.defineArrowheadGeometry=function(a,b){var c=null;\"string\"===typeof b?c=Dd(b,!1):c=b;b=a.toLowerCase();\"none\"!==b&&a!==b||B(\"Shape.defineArrowheadGeometry name must not be empty or None or all-lower-case: \"+a);var d=Nn;d[a]=c;d[b]=a};\nfunction Wg(){Y.call(this);Pn||(Qn=Ug?(new Hk(null)).context:null,Pn=!0);this.Jx=this.Ub=\"\";this.Hc=\"black\";this.ne=\"13px sans-serif\";this.Vi=\"start\";this.Td=zg;this.aj=$c;this.Pj=!0;this.Ai=this.Bi=!1;this.mg=Rn;this.zg=Sn;this.us=this.vb=this.Zc=0;this.ev=this.fv=null;this.Vn=!1;this.ld=this.xn=this.iq=this.Wi=this.jq=null;this.nf=this.mf=0;this.ti=Tn;this.ve=Infinity;this.Ei=0;this.oe=null;this.Be=0;this.me=this.lb=this.Qb=null;this.Yd=1;this.Wd=0;this.Ud=1;this.Vd=this.Lj=null}ma(Wg,Y);\nWg.prototype.cloneProtected=function(a){Y.prototype.cloneProtected.call(this,a);a.Ub=this.Ub;a.Jx=this.Jx;a.Hc=this.Hc;a.ne=this.ne;a.Vi=this.Vi;a.Td=this.Td;a.aj=this.aj;a.Pj=this.Pj;a.Bi=this.Bi;a.Ai=this.Ai;a.mg=this.mg;a.zg=this.zg;a.Zc=this.Zc;a.us=this.us;a.vb=this.vb;a.fv=this.fv;a.ev=this.ev;a.Vn=this.Vn;a.jq=this.jq;a.Wi=this.Wi;a.iq=this.iq;a.xn=this.xn;a.ld=this.ld;a.mf=this.mf;a.nf=this.nf;a.ti=this.ti;a.ve=this.ve;a.oe=this.oe;a.Be=this.Be;a.Qb=this.Qb;a.lb=this.lb;a.me=this.me;a.Ei=\nthis.Ei;a.Yd=this.Yd;a.Wd=this.Wd;a.Ud=this.Ud;a.Lj=this.Lj;a.Vd=this.Vd};\nfunction Ym(a,b){a.F=b.F|6144;a.hb=b.opacity;a.mb=b.background;a.ec=b.areaBackground;a.Xc=b.desiredSize.H();a.fg=b.minSize.H();a.eg=b.maxSize.H();a.cg=b.cg.copy();a.Aa=b.scale;a.Yb=b.angle;a.De=b.stretch;a.jh=b.margin.H();a.yb=b.alignment.H();a.$k=b.alignmentFocus.H();a.am=b.segmentFraction;a.bm=b.segmentOffset.H();a.cm=b.segmentOrientation;null!==b.Za&&(a.Za=b.Za.copy());a.em=b.shadowVisible;b instanceof Wg&&(a.Ub=b.Ub,a.Hc=b.Hc,a.ne=b.ne,a.Vi=b.Vi,a.Td=b.Td,a.aj=b.aj,a.Pj=b.Pj,a.Bi=b.Bi,a.Ai=b.Ai,\na.mg=b.mg,a.zg=b.zg,a.oe=null,a.mf=b.mf,a.nf=b.nf,a.ve=b.ve,a.Ei=b.Ei,a.Yd=b.Yd,a.Wd=b.Wd,a.Ud=b.Ud,a.Lj=b.Lj,a.Vd=b.Vd)}t=Wg.prototype;t.jb=function(a){a.classType===Wg?this.wrap=a:Y.prototype.jb.call(this,a)};t.toString=function(){return 22<this.Ub.length?'TextBlock(\"'+this.Ub.substring(0,20)+'\"...)':'TextBlock(\"'+this.Ub+'\")'};t.o=function(){Y.prototype.o.call(this);this.ev=this.fv=null};\nt.ej=function(a,b){if(null!==this.Hc&&0!==this.Ub.length&&null!==this.ne){var c=this.naturalBounds,d=this.actualBounds,e=c.width,f=c.height,g=Un(this),h=a.textAlign=this.Vi,k=b.Gl;\"start\"===h?h=k?\"right\":\"left\":\"end\"===h&&(h=k?\"left\":\"right\");k=this.Bi;var l=this.Ai;ni(this,a,this.Hc,!0,!1,c,d);(k||l)&&ni(this,a,this.Hc,!1,!1,c,d);d=0;c=!1;var m=J.allocAt(0,0);this.Fd.ta(m);var n=J.allocAt(0,g);this.Fd.ta(n);var p=m.Ie(n);J.free(m);J.free(n);m=b.scale;8>p*m*m&&(c=!0);b.Gb!==a&&(c=!1);!1===b.Ke(\"textGreeking\")&&\n(c=!1);b=this.mf;p=this.nf;switch(this.flip){case fl:a.translate(e,0);a.scale(-1,1);break;case el:a.translate(0,f);a.scale(1,-1);break;case gl:a.translate(e,f),a.scale(-1,-1)}m=this.Zc;n=(b+g+p)*m;f>n&&(d=this.aj,d=d.y*f-d.y*n+d.offsetY);if(1===m&&null!==this.me)p=this.vb,p>e&&(p=e),this.dj(this.me,a,0,d+b,e,g,p,c,h,k,l);else if(null!==this.Qb&&null!==this.lb)for(n=0;n<m;n++){var r=this.Qb[n];r>e&&(r=e);d+=b;this.dj(this.lb[n],a,0,d,e,g,r,c,h,k,l);d+=g+p}switch(this.flip){case fl:a.scale(-1,1);a.translate(-e,\n0);break;case el:a.scale(1,-1);a.translate(0,-f);break;case gl:a.scale(-1,-1),a.translate(-e,-f)}}};\nt.dj=function(a,b,c,d,e,f,g,h,k,l,m){var n=0;h?(\"left\"===k?n=0:\"right\"===k?n=e-g:\"center\"===k&&(n=(e-g)/2),b.fillRect(c+n,d+.25*f,g,1)):(\"left\"===k?n=0:\"right\"===k?n=e:\"center\"===k&&(n=e/2),e=null!==Vn?Vn(this,f):.75*f,b.fillText(a,c+n,d+e),a=f/20|0,0===a&&(a=1),\"right\"===k?n-=g:\"center\"===k&&(n-=g/2),l&&(k=null!==Wn?Wn(this,f):.8*f,b.beginPath(),b.lineWidth=a,b.moveTo(c+n,d+k),b.lineTo(c+n+g,d+k),b.stroke()),m&&(b.beginPath(),b.lineWidth=a,d=d+f-f/2.2|0,0!==a%2&&(d+=.5),b.moveTo(c+n,d),b.lineTo(c+\nn+g,d),b.stroke()))};\nt.Hm=function(a,b,c,d){this.Ei=a;var e=this.ne;null!==Qn&&Xn!==e&&(Xn=Qn.font=e);this.vb=this.Be=0;this.me=this.lb=this.Qb=this.oe=null;var f;if(isNaN(this.desiredSize.width)){e=this.Ub.replace(/\\r\\n/g,\"\\n\").replace(/\\r/g,\"\\n\");if(0===e.length)e=0;else if(this.isMultiline){for(var g=f=0,h=!1;!h;){var k=e.indexOf(\"\\n\",g);-1===k&&(k=e.length,h=!0);g=e.substr(g,k-g);this.ti===Tn&&(g=g.trim());f=Math.max(f,Yn(g));g=k+1}e=f}else f=e.indexOf(\"\\n\",0),0<=f&&(e=e.substr(0,f)),e=Yn(e);e=Math.min(e,a/this.scale);\ne=Math.max(8,e)}else e=this.desiredSize.width;null!==this.panel&&(e=Math.min(e,this.panel.maxSize.width));f=Zn(this,e);isNaN(this.desiredSize.height)?f=Math.min(f,b/this.scale):f=this.desiredSize.height;h=f;if(0!==this.vb&&null!==this.Qb&&null!==this.lb&&this.mg===$n&&(b=this.ne,b=this.mg===$n?ao(b):0,k=this.mf+this.nf,k=Math.max(0,Un(this)+k),h=Math.min(this.maxLines-1,Math.max(Math.floor(h/k+.01)-1,0)),!(h+1>=this.lb.length))){k=this.lb[h];for(b=Math.max(1,a-b);Yn(k)>b&&1<k.length;)k=k.substr(0,\nk.length-1);k+=bo;b=Yn(k);this.lb[h]=k;this.lb=this.lb.slice(0,h+1);this.Qb[h]=b;this.Qb=this.Qb.slice(0,h+1);this.Be=this.lb.length;this.vb=Math.max(this.vb,b);this.Zc=this.Be;1===this.Zc&&(this.me=this.lb[0])}if(this.wrap===co||isNaN(this.desiredSize.width))e=isNaN(a)?this.vb:Math.min(a,this.vb),isNaN(this.desiredSize.width)&&(e=Math.max(8,e));e=Math.max(c,e);f=Math.max(d,f);Sb(this.rc,e,f);nl(this,0,0,e,f)};t.Ih=function(a,b,c,d){sl(this,a,b,c,d)};\nfunction eo(a,b,c){if(null===a.me)a.me=b,a.vb=c;else{if(null===a.lb||null===a.Qb)a.lb=[],a.Qb=[],a.lb.push(a.me),a.Qb.push(a.vb);a.lb.push(b);a.Qb.push(c)}}\nfunction fo(a,b,c,d){var e=a.ti===Tn;e&&(b=b.trim());var f=0,g=a.ne,h=a.mf+a.nf;h=Math.max(0,Un(a)+h);var k=a.mg===$n?ao(g):0;if(a.Zc>=a.ve)null!==d&&d.h(0,h);else if(g=b,a.zg===go){a.Be=1;var l=Yn(b);if(0===k||l<=c)a.vb=Math.max(a.vb,l),eo(a,b,a.vb),null!==d&&d.h(l,h);else{f=ho(a,g);g=g.substr(f.length);b=ho(a,g);for(l=Yn(f+b);0<b.length&&l<=c;)f+=b,g=g.substr(b.length),b=ho(a,g),l=f+b,e&&(l=l.trim()),l=Yn(l);e&&(b=b.trim());f+=b;for(c=Math.max(1,c-k);Yn(f)>c&&1<f.length;)f=f.substr(0,f.length-1);\nf+=bo;var m=Yn(f);a.vb=m;eo(a,f,m);null!==d&&d.h(m,h)}}else{k=0;0===g.length&&(k=1,eo(a,g,0));for(;0<g.length;){b=ho(a,g);for(g=g.substr(b.length);Yn(b)>c;){var n=1;l=Yn(b.substr(0,n));for(m=0;l<=c;)n++,m=l,l=Yn(b.substr(0,n));if(1===n){var p=l;f=Math.max(f,l)}else p=m,f=Math.max(f,m);n--;1>n&&(n=1);eo(a,b.substr(0,n),p);k++;b=b.substr(n);if(a.Zc+k>a.ve)break}m=ho(a,g);for(l=Yn(b+m);0<m.length&&l<=c;)b+=m,g=g.substr(m.length),m=ho(a,g),l=b+m,e&&(l=l.trim()),l=Yn(l);e&&(b=b.trim());if(\"\"!==b&&(\"\\u00ad\"===\nb[b.length-1]&&(b=b.substring(0,b.length-1)+\"\\u2010\"),0===m.length?(n=l,f=Math.max(f,l)):(n=m=Yn(b),f=Math.max(f,m)),eo(a,b,n),k++,a.Zc+k>a.ve))break}a.Be=Math.min(a.ve,k);a.vb=Math.max(a.vb,f);null!==d&&d.h(a.vb,h*a.Be)}}function ho(a,b){if(a.zg===io)return b.substr(0,1);for(var c=b.length,d=0,e=jo;d<c&&!e.test(b.charAt(d));)d++;for(a.ti===ko&&(c=Math.min(c,d+1));d<c&&e.test(b.charAt(d));)d++;return d>=b.length?b:b.substr(0,d)}function Yn(a){return null===Qn?8*a.length:Qn.measureText(a).width}\nfunction Un(a){if(null!==a.oe)return a.oe;var b=a.ne;if(null===Qn){var c=16;return a.oe=c}void 0!==lo[b]&&5E3>mo?c=lo[b]:(c=1.3*Qn.measureText(\"M\").width,lo[b]=c,mo++);return a.oe=c}function ao(a){if(null===Qn)return 6;if(void 0!==no[a]&&5E3>oo)var b=no[a];else b=Qn.measureText(bo).width,no[a]=b,oo++;return b}\nfunction Zn(a,b){var c=a.Ub.replace(/\\r\\n/g,\"\\n\").replace(/\\r/g,\"\\n\"),d=a.mf+a.nf;d=Math.max(0,Un(a)+d);if(0===c.length)return a.vb=0,a.Zc=1,d;if(!a.isMultiline){var e=c.indexOf(\"\\n\",0);0<=e&&(c=c.substr(0,e))}e=0;for(var f=a.Zc=0,g,h=!1;!h;){g=c.indexOf(\"\\n\",f);-1===g&&(g=c.length,h=!0);if(f<=g){f=c.substr(f,g-f);if(a.zg!==go){a.Be=0;var k=M.alloc();fo(a,f,b,k);e+=k.height;M.free(k);a.Zc+=a.Be}else fo(a,f,b,null),e+=d,a.Zc++;a.Zc===a.ve&&(h=!0)}f=g+1}return a.us=e}\nna.Object.defineProperties(Wg.prototype,{font:{get:function(){return this.ne},set:function(a){var b=this.ne;b!==a&&(this.ne=a,this.oe=null,this.o(),this.g(\"font\",b,a))}},text:{get:function(){return this.Ub},set:function(a){var b=this.Ub;null!==a&&void 0!==a?a=a.toString():a=\"\";b!==a&&(this.Ub=a,this.o(),this.g(\"text\",b,a))}},textAlign:{get:function(){return this.Vi},set:function(a){var b=this.Vi;b===a||\"start\"!==\na&&\"end\"!==a&&\"left\"!==a&&\"right\"!==a&&\"center\"!==a||(this.Vi=a,this.M(),this.g(\"textAlign\",b,a))}},flip:{get:function(){return this.Td},set:function(a){var b=this.Td;b!==a&&(this.Td=a,this.M(),this.g(\"flip\",b,a))}},verticalAlignment:{get:function(){return this.aj},set:function(a){var b=this.aj;b.w(a)||(this.aj=a=a.H(),Il(this),this.g(\"verticalAlignment\",b,a))}},naturalBounds:{get:function(){if(!this.rc.s()){var a=\nM.alloc();fo(this,this.Ub,999999,a);var b=a.width;M.free(a);a=Zn(this,b);var c=this.desiredSize;isNaN(c.width)||(b=c.width);isNaN(c.height)||(a=c.height);Sb(this.rc,b,a)}return this.rc}},isMultiline:{get:function(){return this.Pj},set:function(a){var b=this.Pj;b!==a&&(this.Pj=a,this.o(),this.g(\"isMultiline\",b,a))}},isUnderline:{get:function(){return this.Bi},set:function(a){var b=this.Bi;b!==a&&(this.Bi=a,this.M(),this.g(\"isUnderline\",b,\na))}},isStrikethrough:{get:function(){return this.Ai},set:function(a){var b=this.Ai;b!==a&&(this.Ai=a,this.M(),this.g(\"isStrikethrough\",b,a))}},wrap:{get:function(){return this.zg},set:function(a){var b=this.zg;b!==a&&(this.zg=a,this.o(),this.g(\"wrap\",b,a))}},overflow:{get:function(){return this.mg},set:function(a){var b=this.mg;b!==a&&(this.mg=a,this.o(),this.g(\"overflow\",b,a))}},stroke:{\nget:function(){return this.Hc},set:function(a){var b=this.Hc;b!==a&&(null!==a&&Wl(a,\"TextBlock.stroke\"),a instanceof zl&&a.freeze(),this.Hc=a,this.M(),this.g(\"stroke\",b,a))}},lineCount:{get:function(){return this.Zc}},editable:{get:function(){return this.Vn},set:function(a){var b=this.Vn;b!==a&&(this.Vn=a,this.g(\"editable\",b,a))}},textEditor:{get:function(){return this.jq},set:function(a){var b=this.jq;b!==a&&\n(this.jq=a,this.g(\"textEditor\",b,a))}},errorFunction:{get:function(){return this.ld},set:function(a){var b=this.ld;b!==a&&(this.ld=a,this.g(\"errorFunction\",b,a))}},interval:{get:function(){return this.Yd},set:function(a){var b=this.Yd;a=Math.round(a);if(b!==a&&0!==a&&isFinite(a)){this.Yd=a;this.o();var c=this.panel;null!==c&&(c.eh=null);this.g(\"interval\",b,a)}}},graduatedStart:{get:function(){return this.Wd},\nset:function(a){var b=this.Wd;b!==a&&(0>a?a=0:1<a&&(a=1),this.Wd=a,this.o(),this.g(\"graduatedStart\",b,a))}},graduatedEnd:{get:function(){return this.Ud},set:function(a){var b=this.Ud;b!==a&&(0>a?a=0:1<a&&(a=1),this.Ud=a,this.o(),this.g(\"graduatedEnd\",b,a))}},graduatedFunction:{get:function(){return this.Lj},set:function(a){var b=this.Lj;b!==a&&(this.Lj=a,this.o(),this.g(\"graduatedFunction\",b,a))}},graduatedSkip:{\nget:function(){return this.Vd},set:function(a){var b=this.Vd;b!==a&&(this.Vd=a,this.o(),this.g(\"graduatedSkip\",b,a))}},textValidation:{get:function(){return this.Wi},set:function(a){var b=this.Wi;b!==a&&(this.Wi=a,this.g(\"textValidation\",b,a))}},textEdited:{get:function(){return this.iq},set:function(a){var b=this.iq;b!==a&&(this.iq=a,this.g(\"textEdited\",b,a))}},spacingAbove:{get:function(){return this.mf},set:function(a){var b=\nthis.mf;b!==a&&(this.mf=a,this.o(),this.g(\"spacingAbove\",b,a))}},spacingBelow:{get:function(){return this.nf},set:function(a){var b=this.nf;b!==a&&(this.nf=a,this.o(),this.g(\"spacingBelow\",b,a))}},formatting:{get:function(){return this.ti},set:function(a){var b=this.ti;b!==a&&(this.ti=a,this.o(),this.g(\"formatting\",b,a))}},maxLines:{get:function(){return this.ve},set:function(a){var b=this.ve;b!==a&&(a=Math.floor(a),\n0>=a&&wa(a,\"> 0\",Wg,\"maxLines\"),this.ve=a,this.o(),this.g(\"maxLines\",b,a))}},metrics:{get:function(){return{arrSize:null!==this.Qb?this.Qb:[this.vb],arrText:null!==this.lb?this.lb:[this.me],maxLineWidth:this.vb,fontHeight:this.oe}}},choices:{get:function(){return this.xn},set:function(a){var b=this.xn;b!==a&&(this.xn=a,this.g(\"choices\",b,a))}}});\nvar Vn=null,Wn=null,go=new D(Wg,\"None\",0),co=new D(Wg,\"WrapFit\",1),Sn=new D(Wg,\"WrapDesiredSize\",2),io=new D(Wg,\"WrapBreakAll\",3),Rn=new D(Wg,\"OverflowClip\",0),$n=new D(Wg,\"OverflowEllipsis\",1),Tn=new D(Wg,\"FormatTrim\",0),ko=new D(Wg,\"FormatNone\",0),jo=/[ \\u200b\\u00ad]/,lo=new $a,mo=0,no=new $a,oo=0,bo=\"...\",Xn=\"\",Qn=null,Pn=!1;Wg.className=\"TextBlock\";Wg.getEllipsis=function(){return bo};Wg.setEllipsis=function(a){bo=a;no=new $a;oo=0};Wg.getBaseline=function(){return Vn};\nWg.setBaseline=function(a){Vn=a};Wg.getUnderline=function(){return Wn};Wg.setUnderline=function(a){Wn=a};Wg.isValidFont=function(a){Pn||(Qn=Ug?(new Hk(null)).context:null,Pn=!0);if(null===Qn)return!0;var b=Qn.font;if(a===b||\"10px sans-serif\"===a)return!0;Qn.font=\"10px sans-serif\";Qn.font=a;var c=Qn.font;if(\"10px sans-serif\"!==c)return Qn.font=b,!0;Qn.font=\"19px serif\";var d=Qn.font;Qn.font=a;c=Qn.font;Qn.font=b;return c!==d};Wg.None=go;Wg.WrapFit=co;Wg.WrapDesiredSize=Sn;Wg.WrapBreakAll=io;\nWg.OverflowClip=Rn;Wg.OverflowEllipsis=$n;function po(){this.Qb=[];this.lb=[]}po.prototype.reset=function(){this.Qb=[];this.lb=[]};po.prototype.gy=function(a){this.Qb=Ba(a.Qb);this.lb=Ba(a.lb)};po.className=\"TextBlockMetrics\";function dk(){Y.call(this);this.Zg=null;this.$p=\"\";this.th=jc;this.yl=td;this.xh=this.ld=null;this.xl=zc;this.Td=zg;this.nm=null;this.uo=!1;this.Yr=!0;this.Ol=!1;this.gm=null}ma(dk,Y);\ndk.prototype.cloneProtected=function(a){Y.prototype.cloneProtected.call(this,a);a.element=this.Zg;a.$p=this.$p;a.th=this.th.H();a.yl=this.yl;a.Td=this.Td;a.ld=this.ld;a.xh=this.xh;a.xl=this.xl.H();a.Yr=this.Yr;a.gm=this.gm};dk.prototype.jb=function(a){a===zg||a===Bg||a===dl?this.imageStretch=a:Y.prototype.jb.call(this,a)};dk.prototype.toString=function(){return\"Picture(\"+this.source+\")#\"+kb(this)};function Gi(a){void 0===a&&(a=\"\");\"\"!==a?qo[a]&&(delete qo[a],ro--):(qo=new $a,ro=0)}\nfunction so(a,b){b.fz||(b.dv=function(c){b.ls=!0;b.ro=!1;var d=b.Wg.copy();if(null!==d&&void 0!==d){for(d=d.iterator;d.next();){var e=d.value;var f=b.getAttribute(\"src\");var g=e.pg.G(f);if(null!==g)for(var h=g.length,k=0;k<h;k++)f=g[k],e.Wl.add(f),e.Db(),b.io&&(void 0===b.ov&&(b.ov=c),null!==f.xh&&f.xh(f,c))}b.Wg=null}a.desiredSize.s()||(pj(a,!1),a.o())},b.Pu=function(a){b.ro=a;var c=b.Wg.copy();if(null!==c&&void 0!==c){for(c=c.iterator;c.next();){var e=c.value,f=b.getAttribute(\"src\");var g=e.pg.G(f);\nif(null!==g){e=g.length;f=Ea();for(var h=0;h<e;h++)f.push(g[h]);if(b.io)for(h=0;h<e;h++)g=f[h],null!==g.ld&&g.ld(g,a);Ia(f)}}b.Wg=null}},b.addEventListener(\"load\",b.dv),b.addEventListener(\"error\",b.Pu),b.fz=!0)}function fk(a){a.removeEventListener(\"load\",a.dv);a.removeEventListener(\"error\",a.Pu);delete a.dv;delete a.Pu}dk.prototype.QA=function(){if(\"\"!==this.source){Gi(this.source);var a=this.source;this.source=\"\";this.source=a}};dk.prototype.redraw=function(){this.M()};\ndk.prototype.ej=function(a,b){var c=this.Zg;if(null!==c){var d=c.getAttribute(\"src\");if(!(c instanceof HTMLImageElement&&(null===d||\"\"===d)||c.ro instanceof Event&&a instanceof Dl)){d=this.naturalBounds;var e=0,f=0,g=this.uo,h=g?+c.width:c.naturalWidth;g=g?+c.height:c.naturalHeight;void 0===h&&c.videoWidth&&(h=c.videoWidth);void 0===g&&c.videoHeight&&(g=c.videoHeight);h=h||d.width;g=g||d.height;if(0!==h&&0!==g){var k=h,l=g;this.sourceRect.s()&&(e=this.th.x,f=this.th.y,h=this.th.width,g=this.th.height);\nvar m=h,n=g,p=this.yl,r=this.xl;switch(p){case zg:if(this.sourceRect.s())break;m>=d.width&&(e=e+r.offsetX+(m*r.x-d.width*r.x));n>=d.height&&(f=f+r.offsetY+(n*r.y-d.height*r.y));h=Math.min(d.width,m);g=Math.min(d.height,n);break;case td:m=d.width;n=d.height;break;case Bg:case dl:p===Bg?(p=Math.min(d.height/n,d.width/m),m*=p,n*=p):p===dl&&(p=Math.max(d.height/n,d.width/m),m*=p,n*=p,m>=d.width&&(e=(e+r.offsetX+(m*r.x-d.width*r.x)/m)*h),n>=d.height&&(f=(f+r.offsetY+(n*r.y-d.height*r.y)/n)*g),h*=1/(m/\nd.width),g*=1/(n/d.height),m=d.width,n=d.height)}p=this.Af()*b.scale;var q=m*p*n*p,u=h*g/q,w=c.__goCache;p=null;var v=to;if(c.ls&&void 0!==w&&4<q&&u>v*v)for(null===w.cj&&(uo(w,4,k,l,c),uo(w,16,k,l,c)),k=w.cj,l=k.length,q=0;q<l;q++)if(k[q].ratio*k[q].ratio<u)p=k[q];else break;if(!b.rl){if(null===this.nm)if(null===this.Zg)this.nm=!1;else{k=(new Hk(null)).context;k.drawImage(this.Zg,0,0);try{k.getImageData(0,0,1,1).data[3]&&(this.nm=!1),this.nm=!1}catch(y){this.nm=!0}}if(this.nm)return}k=0;m<d.width&&\n(k=r.offsetX+(d.width*r.x-m*r.x));l=0;n<d.height&&(l=r.offsetY+(d.height*r.y-n*r.y));switch(this.flip){case fl:a.translate(Math.min(d.width,m),0);a.scale(-1,1);break;case el:a.translate(0,Math.min(d.height,n));a.scale(1,-1);break;case gl:a.translate(Math.min(d.width,m),Math.min(d.height,n)),a.scale(-1,-1)}if(b.Ke(\"pictureRatioOptimization\")&&!b.yi&&void 0!==w&&null!==p&&1!==p.ratio){a.save();b=p.ratio;try{a.drawImage(p.source,e/b,f/b,Math.min(p.source.width,h/b),Math.min(p.source.height,g/b),k,l,\nMath.min(d.width,m),Math.min(d.height,n))}catch(y){this.Yr=!1}a.restore()}else try{a.drawImage(c,e,f,h,g,k,l,Math.min(d.width,m),Math.min(d.height,n))}catch(y){this.Yr=!1}switch(this.flip){case fl:a.scale(-1,1);a.translate(-Math.min(d.width,m),0);break;case el:a.scale(1,-1);a.translate(0,-Math.min(d.height,n));break;case gl:a.scale(-1,-1),a.translate(-Math.min(d.width,m),-Math.min(d.height,n))}}}}};\ndk.prototype.Hm=function(a,b,c,d){var e=this.desiredSize,f=ql(this,!0),g=this.Zg,h=this.uo;if(h||!this.Ol&&g&&g.complete)this.Ol=!0;null===g&&(isFinite(e.width)||(a=0),isFinite(e.height)||(b=0));isFinite(e.width)||f===td||f===bl?(isFinite(a)||(a=this.sourceRect.s()?this.sourceRect.width:h?+g.width:g.naturalWidth),c=0):null!==g&&!1!==this.Ol&&(a=this.sourceRect.s()?this.sourceRect.width:h?+g.width:g.naturalWidth);isFinite(e.height)||f===td||f===cl?(isFinite(b)||(b=this.sourceRect.s()?this.sourceRect.height:\nh?+g.height:g.naturalHeight),d=0):null!==g&&!1!==this.Ol&&(b=this.sourceRect.s()?this.sourceRect.height:h?+g.height:g.naturalHeight);isFinite(e.width)&&(a=e.width);isFinite(e.height)&&(b=e.height);e=this.maxSize;f=this.minSize;c=Math.max(c,f.width);d=Math.max(d,f.height);a=Math.min(e.width,a);b=Math.min(e.height,b);a=Math.max(c,a);b=Math.max(d,b);null===g||g.complete||(isFinite(a)||(a=0),isFinite(b)||(b=0));Sb(this.rc,a,b);nl(this,0,0,a,b)};dk.prototype.Ih=function(a,b,c,d){sl(this,a,b,c,d)};\nna.Object.defineProperties(dk.prototype,{element:{get:function(){return this.Zg},set:function(a){var b=this.Zg;if(b!==a){this.uo=a instanceof HTMLCanvasElement;var c=a instanceof HTMLImageElement;b instanceof HTMLImageElement&&fk(b);null===a||c||a instanceof HTMLVideoElement||this.uo||B(\"Picture.element must be an instance of Image, Canvas, or Video, not: \"+a);var d=this.diagram;null!==d&&ek(d,this);this.Zg=a;null!==a&&c&&void 0===a.Wg&&(a.Wg=new G);null!==d&&c&&ck(d,\nthis);null!==a&&(this.uo||!0===a.complete?(a.io&&(a.ro instanceof Event&&null!==this.ld?this.ld(this,a.ro):!0===a.ls&&!a.ro&&null!==this.xh&&a.ov&&this.xh(this,a.ov)),a.ls=!0,this.desiredSize.s()||(pj(this,!1),this.o())):c&&so(this,a));this.g(\"element\",b,a);this.M()}}},source:{get:function(){return this.$p},set:function(a){var b=this.$p;if(b!==a){this.$p=a;var c=qo;if(Ug){var d=null;if(void 0!==c[a])d=c[a];else if(\"\"!==a){30<ro&&(Gi(),c=qo);d=ua(\"img\");d.io=!0;so(this,\nd);var e=this.gm;null!==e&&(d.crossOrigin=e(this));d.src=a;c[a]=d;ro++}this.element=d;null!==d&&void 0===d.__goCache&&(d.__goCache=new vo);this.o();this.M()}this.g(\"source\",b,a)}}},sourceCrossOrigin:{get:function(){return this.gm},set:function(a){if(this.gm!==a&&(this.gm=a,null!==this.element)){var b=this.element.getAttribute(\"src\");null===a&&\"string\"===typeof b?this.element.crossOrigin=null:null!==a&&(this.element.crossOrigin=a(this));this.element.src=b}}},sourceRect:{\nget:function(){return this.th},set:function(a){var b=this.th;b.w(a)||(this.th=a=a.H(),this.M(),this.g(\"sourceRect\",b,a))}},imageStretch:{get:function(){return this.yl},set:function(a){var b=this.yl;b!==a&&(this.yl=a,this.M(),this.g(\"imageStretch\",b,a))}},flip:{get:function(){return this.Td},set:function(a){var b=this.Td;b!==a&&(this.Td=a,this.M(),this.g(\"flip\",b,a))}},imageAlignment:{get:function(){return this.xl},\nset:function(a){var b=this.xl;b.w(a)||(this.xl=a=a.H(),this.M(),this.g(\"imageAlignment\",b,a))}},errorFunction:{get:function(){return this.ld},set:function(a){var b=this.ld;b!==a&&(this.ld=a,this.g(\"errorFunction\",b,a))}},successFunction:{get:function(){return this.xh},set:function(a){var b=this.xh;b!==a&&(this.xh=a,this.g(\"successFunction\",b,a))}},naturalBounds:{get:function(){return this.rc}}});\ndk.prototype.redraw=dk.prototype.redraw;dk.prototype.reloadSource=dk.prototype.QA;var qo=null,ro=0,to=4;dk.className=\"Picture\";qo=new $a;dk.clearCache=Gi;function vo(){this.cj=null}function uo(a,b,c,d,e){null===a.cj&&(a.cj=[]);var f=new Hk(null),g=f.context,h=1/b;f.width=c/b;f.height=d/b;0!==f.width&&0!==f.height&&(b=new wo(f.Ja,b),c=1,0<a.cj.length&&(c=a.cj[a.cj.length-1],e=c.source,c=c.ratio),g.setTransform(h*c,0,0,h*c,0,0),g.drawImage(e,0,0),a.cj.push(b))}vo.className=\"PictureCacheArray\";\nfunction wo(a,b){this.source=a;this.ratio=b}wo.className=\"PictureCacheInstance\";function xo(){this.Kt=new rd;this.ic=null}xo.prototype.reset=function(a){null!==a?(a.ea(),this.Kt=a,a.figures.clear()):this.Kt=new rd;this.ic=null};function Gd(a,b,c,d,e){a.ic=new je;a.ic.startX=b;a.ic.startY=c;a.ic.isFilled=d;a.Kt.figures.add(a.ic);void 0!==e&&(a.ic.isShadowed=e)}function Vd(a){var b=a.ic.segments.length;0<b&&a.ic.segments.J(b-1).close()}xo.prototype.Ym=function(a){this.ic.isShadowed=a};\nxo.prototype.moveTo=function(a,b,c){void 0===c&&(c=!1);var d=new ke(Zd);d.endX=a;d.endY=b;c&&d.close();this.ic.segments.add(d)};xo.prototype.lineTo=function(a,b,c){void 0===c&&(c=!1);var d=new ke(wd);d.endX=a;d.endY=b;c&&d.close();this.ic.segments.add(d)};function Hd(a,b,c,d,e,f,g){var h;void 0===h&&(h=!1);var k=new ke($d);k.point1X=b;k.point1Y=c;k.point2X=d;k.point2Y=e;k.endX=f;k.endY=g;h&&k.close();a.ic.segments.add(k)}\nfunction Id(a,b,c,d,e){var f;void 0===f&&(f=!1);var g=new ke(ae);g.point1X=b;g.point1Y=c;g.endX=d;g.endY=e;f&&g.close();a.ic.segments.add(g)}xo.prototype.arcTo=function(a,b,c,d,e,f,g){void 0===f&&(f=0);void 0===g&&(g=!1);var h=new ke(be);h.startAngle=a;h.sweepAngle=b;h.centerX=c;h.centerY=d;h.radiusX=e;h.radiusY=0!==f?f:e;g&&h.close();this.ic.segments.add(h)};function Ud(a,b,c,d,e,f,g,h){var k;void 0===k&&(k=!1);b=new ke(ce,g,h,b,c,d,e,f);k&&b.close();a.ic.segments.add(b)}\nfunction Fd(a){var b=Wd;if(null!==b)return Wd=null,b.reset(a),b;b=new xo;b.reset(a);return b}var Wd=null;xo.className=\"StreamGeometryContext\";function yo(a,b){var c=a.toLowerCase(),d=L.Qe;d[a]=b;d[c]=a}yo(\"Rectangle\",function(a,b,c){a=\"r\"+b+\",\"+c;var d=L.Uh[a];if(void 0!==d)return d;d=new rd(yd);d.endX=b;d.endY=c;50>L.Vh&&(L.Uh[a]=d,L.Vh++);return d});\nyo(\"Square\",function(a,b,c){a=\"s\"+b+\",\"+c;var d=L.Uh[a];if(void 0!==d)return d;d=new rd(yd);d.endX=b;d.endY=c;d.defaultStretch=Bg;50>L.Vh&&(L.Uh[a]=d,L.Vh++);return d});\nyo(\"RoundedRectangle\",function(a,b,c){var d=a?a.parameter1:NaN;if(isNaN(d)||0>d)d=5;d=Math.min(d,b/3);d=Math.min(d,c/3);a=d*L.Kg;b=(new rd).add((new je(d,0,!0)).add(new ke(wd,b-d,0)).add(new ke($d,b,d,b-a,0,b,a)).add(new ke(wd,b,c-d)).add(new ke($d,b-d,c,b,c-a,b-a,c)).add(new ke(wd,d,c)).add(new ke($d,0,c-d,a,c,0,c-a)).add(new ke(wd,0,d)).add((new ke($d,d,0,0,a,a,0)).close()));1<a&&(b.spot1=new O(0,0,a,a),b.spot2=new O(1,1,-a,-a));return b});yo(\"Border\",\"RoundedRectangle\");\nyo(\"Ellipse\",function(a,b,c){a=\"e\"+b+\",\"+c;var d=L.Uh[a];if(void 0!==d)return d;d=new rd(zd);d.endX=b;d.endY=c;d.spot1=fd;d.spot2=gd;50>L.Vh&&(L.Uh[a]=d,L.Vh++);return d});yo(\"Circle\",function(a,b,c){a=\"c\"+b+\",\"+c;var d=L.Uh[a];if(void 0!==d)return d;d=new rd(zd);d.endX=b;d.endY=c;d.spot1=fd;d.spot2=gd;d.defaultStretch=Bg;50>L.Vh&&(L.Uh[a]=d,L.Vh++);return d});yo(\"TriangleRight\",function(a,b,c){return(new rd).add((new je(0,0)).add(new ke(wd,b,.5*c)).add((new ke(wd,0,c)).close())).Zm(0,.25,.5,.75)});\nyo(\"TriangleDown\",function(a,b,c){return(new rd).add((new je(0,0)).add(new ke(wd,b,0)).add((new ke(wd,.5*b,c)).close())).Zm(.25,0,.75,.5)});yo(\"TriangleLeft\",function(a,b,c){return(new rd).add((new je(b,c)).add(new ke(wd,0,.5*c)).add((new ke(wd,b,0)).close())).Zm(.5,.25,1,.75)});yo(\"TriangleUp\",function(a,b,c){return(new rd).add((new je(b,c)).add(new ke(wd,0,c)).add((new ke(wd,.5*b,0)).close())).Zm(.25,.5,.75,1)});yo(\"Triangle\",\"TriangleUp\");\nyo(\"Diamond\",function(a,b,c){return(new rd).add((new je(.5*b,0)).add(new ke(wd,0,.5*c)).add(new ke(wd,.5*b,c)).add((new ke(wd,b,.5*c)).close())).Zm(.25,.25,.75,.75)});yo(\"LineH\",function(a,b,c){a=new rd(ud);a.startX=0;a.startY=c/2;a.endX=b;a.endY=c/2;return a});yo(\"LineV\",function(a,b,c){a=new rd(ud);a.startX=b/2;a.startY=0;a.endX=b/2;a.endY=c;return a});yo(\"None\",\"Rectangle\");yo(\"BarH\",\"Rectangle\");yo(\"BarV\",\"Rectangle\");yo(\"MinusLine\",\"LineH\");\nyo(\"PlusLine\",function(a,b,c){return(new rd).add((new je(0,c/2,!1)).add(new ke(wd,b,c/2)).add(new ke(Zd,b/2,0)).add(new ke(wd,b/2,c)))});yo(\"XLine\",function(a,b,c){return(new rd).add((new je(0,c,!1)).add(new ke(wd,b,0)).add(new ke(Zd,0,0)).add(new ke(wd,b,c)))});\nL.dn={\"\":\"\",Standard:\"F1 m 0,0 l 8,4 -8,4 2,-4 z\",Backward:\"F1 m 8,0 l -2,4 2,4 -8,-4 z\",Triangle:\"F1 m 0,0 l 8,4.62 -8,4.62 z\",BackwardTriangle:\"F1 m 8,4 l 0,4 -8,-4 8,-4 0,4 z\",Boomerang:\"F1 m 0,0 l 8,4 -8,4 4,-4 -4,-4 z\",BackwardBoomerang:\"F1 m 8,0 l -8,4 8,4 -4,-4 4,-4 z\",SidewaysV:\"m 0,0 l 8,4 -8,4 0,-1 6,-3 -6,-3 0,-1 z\",BackwardV:\"m 8,0 l -8,4 8,4 0,-1 -6,-3 6,-3 0,-1 z\",OpenTriangle:\"m 0,0 l 8,4 -8,4\",BackwardOpenTriangle:\"m 8,0 l -8,4 8,4\",OpenTriangleLine:\"m 0,0 l 8,4 -8,4 m 8.5,0 l 0,-8\",\nBackwardOpenTriangleLine:\"m 8,0 l  -8,4 8,4 m -8.5,0 l 0,-8\",OpenTriangleTop:\"m 0,0 l 8,4 m 0,4\",BackwardOpenTriangleTop:\"m 8,0 l -8,4 m 0,4\",OpenTriangleBottom:\"m 0,8 l 8,-4\",BackwardOpenTriangleBottom:\"m 0,4 l 8,4\",HalfTriangleTop:\"F1 m 0,0 l 0,4 8,0 z m 0,8\",BackwardHalfTriangleTop:\"F1 m 8,0 l 0,4 -8,0 z m 0,8\",HalfTriangleBottom:\"F1 m 0,4 l 0,4 8,-4 z\",BackwardHalfTriangleBottom:\"F1 m 8,4 l 0,4 -8,-4 z\",ForwardSemiCircle:\"m 4,0 b 270 180 0 4 4\",BackwardSemiCircle:\"m 4,8 b 90 180 0 -4 4\",Feather:\"m 0,0 l 3,4 -3,4\",\nBackwardFeather:\"m 3,0 l -3,4 3,4\",DoubleFeathers:\"m 0,0 l 3,4 -3,4 m 3,-8 l 3,4 -3,4\",BackwardDoubleFeathers:\"m 3,0 l -3,4 3,4 m 3,-8 l -3,4 3,4\",TripleFeathers:\"m 0,0 l 3,4 -3,4 m 3,-8 l 3,4 -3,4 m 3,-8 l 3,4 -3,4\",BackwardTripleFeathers:\"m 3,0 l -3,4 3,4 m 3,-8 l -3,4 3,4 m 3,-8 l -3,4 3,4\",ForwardSlash:\"m 0,8 l 5,-8\",BackSlash:\"m 0,0 l 5,8\",DoubleForwardSlash:\"m 0,8 l 4,-8 m -2,8 l 4,-8\",DoubleBackSlash:\"m 0,0 l 4,8 m -2,-8 l 4,8\",TripleForwardSlash:\"m 0,8 l 4,-8 m -2,8 l 4,-8 m -2,8 l 4,-8\",\nTripleBackSlash:\"m 0,0 l 4,8 m -2,-8 l 4,8 m -2,-8 l 4,8\",Fork:\"m 0,4 l 8,0 m -8,0 l 8,-4 m -8,4 l 8,4\",BackwardFork:\"m 8,4 l -8,0 m 8,0 l -8,-4 m 8,4 l -8,4\",LineFork:\"m 0,0 l 0,8 m 0,-4 l 8,0 m -8,0 l 8,-4 m -8,4 l 8,4\",BackwardLineFork:\"m 8,4 l -8,0 m 8,0 l -8,-4 m 8,4 l -8,4 m 8,-8 l 0,8\",CircleFork:\"F1 m 6,4 b 0 360 -3 0 3 z m 0,0 l 6,0 m -6,0 l 6,-4 m -6,4 l 6,4\",BackwardCircleFork:\"F1 m 0,4 l 6,0 m -6,-4 l 6,4 m -6,4 l 6,-4 m 6,0 b 0 360 -3 0 3\",CircleLineFork:\"F1 m 6,4 b 0 360 -3 0 3 z m 1,-4 l 0,8 m 0,-4 l 6,0 m -6,0 l 6,-4 m -6,4 l 6,4\",\nBackwardCircleLineFork:\"F1 m 0,4 l 6,0 m -6,-4 l 6,4 m -6,4 l 6,-4 m 0,-4 l 0,8 m 7,-4 b 0 360 -3 0 3\",Circle:\"F1 m 8,4 b 0 360 -4 0 4 z\",Block:\"F1 m 0,0 l 0,8 8,0 0,-8 z\",StretchedDiamond:\"F1 m 0,3 l 5,-3 5,3 -5,3 -5,-3 z\",Diamond:\"F1 m 0,4 l 4,-4 4,4 -4,4 -4,-4 z\",Chevron:\"F1 m 0,0 l 5,0 3,4 -3,4 -5,0 3,-4 -3,-4 z\",StretchedChevron:\"F1 m 0,0 l 8,0 3,4 -3,4 -8,0 3,-4 -3,-4 z\",NormalArrow:\"F1 m 0,2 l 4,0 0,-2 4,4 -4,4 0,-2 -4,0 z\",X:\"m 0,0 l 8,8 m 0,-8 l -8,8\",TailedNormalArrow:\"F1 m 0,0 l 2,0 1,2 3,0 0,-2 2,4 -2,4 0,-2 -3,0 -1,2 -2,0 1,-4 -1,-4 z\",\nDoubleTriangle:\"F1 m 0,0 l 4,4 -4,4 0,-8 z  m 4,0 l 4,4 -4,4 0,-8 z\",BigEndArrow:\"F1 m 0,0 l 5,2 0,-2 3,4 -3,4 0,-2 -5,2 0,-8 z\",ConcaveTailArrow:\"F1 m 0,2 h 4 v -2 l 4,4 -4,4 v -2 h -4 l 2,-2 -2,-2 z\",RoundedTriangle:\"F1 m 0,1 a 1,1 0 0 1 1,-1 l 7,3 a 0.5,1 0 0 1 0,2 l -7,3 a 1,1 0 0 1 -1,-1 l 0,-6 z\",SimpleArrow:\"F1 m 1,2 l -1,-2 2,0 1,2 -1,2 -2,0 1,-2 5,0 0,-2 2,2 -2,2 0,-2 z\",AccelerationArrow:\"F1 m 0,0 l 0,8 0.2,0 0,-8 -0.2,0 z m 2,0 l 0,8 1,0 0,-8 -1,0 z m 3,0 l 2,0 2,4 -2,4 -2,0 0,-8 z\",BoxArrow:\"F1 m 0,0 l 4,0 0,2 2,0 0,-2 2,4 -2,4 0,-2 -2,0 0,2 -4,0 0,-8 z\",\nTriangleLine:\"F1 m 8,4 l -8,-4 0,8 8,-4 z m 0.5,4 l 0,-8\",CircleEndedArrow:\"F1 m 10,4 l -2,-3 0,2 -2,0 0,2 2,0 0,2 2,-3 z m -4,0 b 0 360 -3 0 3 z\",DynamicWidthArrow:\"F1 m 0,3 l 2,0 2,-1 2,-2 2,4 -2,4 -2,-2 -2,-1 -2,0 0,-2 z\",EquilibriumArrow:\"m 0,3 l 8,0 -3,-3 m 3,5 l -8,0 3,3\",FastForward:\"F1 m 0,0 l 3.5,4 0,-4 3.5,4 0,-4 1,0 0,8 -1,0 0,-4 -3.5,4 0,-4 -3.5,4 0,-8 z\",Kite:\"F1 m 0,4 l 2,-4 6,4 -6,4 -2,-4 z\",HalfArrowTop:\"F1 m 0,0 l 4,4 4,0 -8,-4 z m 0,8\",HalfArrowBottom:\"F1 m 0,8 l 4,-4 4,0 -8,4 z\",\nOpposingDirectionDoubleArrow:\"F1 m 0,4 l 2,-4 0,2 4,0 0,-2 2,4 -2,4 0,-2 -4,0 0,2 -2,-4 z\",PartialDoubleTriangle:\"F1 m 0,0 4,3 0,-3 4,4 -4,4 0,-3 -4,3 0,-8 z\",LineCircle:\"F1 m 0,0 l 0,8 m 7 -4 b 0 360 -3 0 3 z\",DoubleLineCircle:\"F1 m 0,0 l 0,8 m 2,-8 l 0,8 m 7 -4 b 0 360 -3 0 3 z\",TripleLineCircle:\"F1 m 0,0 l 0,8 m 2,-8 l 0,8 m 2,-8 l 0,8 m 7 -4 b 0 360 -3 0 3 z\",CircleLine:\"F1 m 6 4 b 0 360 -3 0 3 z m 1,-4 l 0,8\",DiamondCircle:\"F1 m 8,4 l -4,4 -4,-4 4,-4 4,4 m 8,0 b 0 360 -4 0 4 z\",PlusCircle:\"F1 m 8,4 b 0 360 -4 0 4 l -8 0 z m -4 -4 l 0 8\",\nOpenRightTriangleTop:\"m 8,0 l 0,4 -8,0 m 0,4\",OpenRightTriangleBottom:\"m 8,8 l 0,-4 -8,0\",Line:\"m 0,0 l 0,8\",DoubleLine:\"m 0,0 l 0,8 m 2,0 l 0,-8\",TripleLine:\"m 0,0 l 0,8 m 2,0 l 0,-8 m 2,0 l 0,8\",PentagonArrow:\"F1 m 8,4 l -4,-4 -4,0 0,8 4,0 4,-4 z\"};\nfunction V(a){X.call(this,a);this.D=2408959;this.ih=this.Nf=\"\";this.Gp=this.Cp=this.Rp=this.Ho=null;this.Tp=\"\";this.Lf=this.so=this.Sp=this.sh=null;this.Ep=\"\";this.Dp=Ob;this.Ub=this.Hp=\"\";this.Fi=this.An=this.mi=null;this.dg=(new J(NaN,NaN)).freeze();this.Oo=\"\";this.cf=null;this.Po=tc;this.Ip=Vc;this.Yo=Cb;this.Qo=Fb;this.Sn=null;this.Io=127;this.Xp=Gb;this.Wp=\"gray\";this.ug=4;this.zx=-1;this.tq=NaN;this.ez=new N;this.Xj=null;this.kh=NaN}ma(V,X);\nV.prototype.cloneProtected=function(a){X.prototype.cloneProtected.call(this,a);a.D=this.D&-4097|49152;a.Nf=this.Nf;a.ih=this.ih;a.Ho=this.Ho;a.Rp=this.Rp;a.Cp=this.Cp;a.Gp=this.Gp;a.Tp=this.Tp;a.Sp=this.Sp;a.so=this.so;a.Lf=null;a.Ep=this.Ep;a.Dp=this.Dp.H();a.Hp=this.Hp;a.Ip=this.Ip.H();a.Ub=this.Ub;a.An=this.An;a.dg.assign(this.dg);a.Oo=this.Oo;a.Po=this.Po.H();a.Yo=this.Yo.H();a.Qo=this.Qo.H();a.Sn=this.Sn;a.Io=this.Io;a.Xp=this.Xp.H();a.Wp=this.Wp;a.ug=this.ug;a.tq=this.tq};\nV.prototype.yf=function(a){X.prototype.yf.call(this,a);a.Oh();a.sh=null;a.cf=null;a.Xj=null};V.prototype.toString=function(){var a=Ja(this.constructor)+\"#\"+kb(this);null!==this.data&&(a+=\"(\"+Ka(this.data)+\")\");return a};V.prototype.Sk=function(a,b,c,d,e,f,g){var h=this.diagram;null!==h&&(a===ze&&\"elements\"===b?e instanceof X?Hj(e,function(a){Jj(h.partManager,a);Ij(h,a)}):ck(h,e):a===Ae&&\"elements\"===b&&(e instanceof X?Hj(e,function(a){Mj(h.partManager,a,h)}):ek(h,e)),h.Va(a,b,c,d,e,f,g))};\nV.prototype.Da=function(a){X.prototype.Da.call(this,a);if(null!==this.data){for(var b=this.W.j,c=b.length,d=0;d<c;d++){var e=b[d];e instanceof X&&Hj(e,function(a){null!==a.data&&a.Da()})}for(b=this.adornments;b.next();)b.value.Da(a)}};V.prototype.updateRelationshipsFromData=function(){null!==this.data&&this.diagram.partManager.updateRelationshipsFromData(this)};V.prototype.wk=function(a){var b=this.Lf;return null===b?null:b.G(a)};\nV.prototype.Gh=function(a,b){if(null!==b){var c=null,d=this.Lf;null!==d&&(c=d.G(a));if(c!==b){if(null!==c){var e=c.diagram;null!==e&&e.remove(c)}null===d&&(this.Lf=d=new H);b.Nf!==a&&(b.category=a);d.add(a,b);a=this.diagram;null!==a&&(a.add(b),a=b.adornedObject,null!==a&&(a=a.ij(),null!==a&&(b.data=a.data)))}}};V.prototype.Hf=function(a){var b=this.Lf;if(null!==b){var c=b.G(a);if(null!==c){var d=c.diagram;null!==d&&d.remove(c)}b.remove(a);0===b.count&&(this.Lf=null)}};\nV.prototype.nk=function(){var a=this.Lf;if(null!==a){var b=Ea();for(a=a.iterator;a.next();)b.push(a.key);a=b.length;for(var c=0;c<a;c++)this.Hf(b[c]);Ia(b)}};\nV.prototype.updateAdornments=function(){var a=this.diagram;if(null!==a){for(var b=this.adornments;b.next();){var c=b.value;c.o();c.placeholder&&c.placeholder.o()}a:{if(this.isSelected&&this.selectionAdorned&&(b=this.selectionObject,null!==b&&this.actualBounds.s()&&this.isVisible()&&b.Gf()&&b.actualBounds.s())){c=this.wk(\"Selection\");if(null===c){c=this.selectionAdornmentTemplate;null===c&&(c=this.Ph()?a.linkSelectionAdornmentTemplate:this instanceof U?a.groupSelectionAdornmentTemplate:a.nodeSelectionAdornmentTemplate);\nif(!(c instanceof Je))break a;yg(c);c=c.copy();null!==c&&(this.Ph()&&this.selectionObject===this.path&&(c.type=X.Link),c.adornedObject=b)}if(null!==c){c.type===X.Link&&c.o();this.Gh(\"Selection\",c);break a}}this.Hf(\"Selection\")}zo(this,a);for(b=this.adornments;b.next();)b.value.Da()}};V.prototype.Lb=function(){var a=this.diagram;null!==a&&(Vi(a),0!==(this.D&16384)!==!0&&(this.D|=16384,a.Db()))};function li(a){0!==(a.D&16384)!==!1&&(a.updateAdornments(),a.D&=-16385)}\nfunction zo(a,b){b.toolManager.mouseDownTools.each(function(b){b.isEnabled&&b.updateAdornments(a)});b.toolManager.updateAdornments(a)}function Ao(a){if(!1===wj(a)){Bo(a,!0);a.Fl();var b=a.diagram;null!==b&&(b.wd.add(a),b.Db())}}function Co(a){a.D|=2097152;if(!1!==wj(a)){var b=a.position,c=a.location;c.s()&&b.s()||Do(a,b,c);c=a.xb;var d=N.alloc().assign(c);c.ea();c.x=b.x;c.y=b.y;c.freeze();a.Im(d,c);N.free(d);Bo(a,!1)}}V.prototype.move=function(a,b){!0===b?this.location=a:this.position=a};\nV.prototype.moveTo=function(a,b,c){a=J.allocAt(a,b);this.move(a,c);J.free(a)};V.prototype.isVisible=function(){if(!this.visible)return!1;var a=this.layer;if(null!==a){if(!a.visible)return!1;a=a.diagram;if(null!==a&&a.animationManager.cu(this))return!0}a=this.containingGroup;return null===a||a.isSubGraphExpanded&&a.isVisible()?!0:!1};t=V.prototype;t.Ob=function(a){var b=this.diagram;a?(this.B(4),this.Lb(),null!==b&&b.wd.add(this)):(this.B(8),this.nk());this.Oh();null!==b&&(b.Na(),b.M())};\nt.bb=function(a){if(this.name===a)return this;var b=this.Xj;null===b&&(this.Xj=b=new H);if(null!==b.G(a))return b.G(a);var c=X.prototype.bb.call(this,a);if(null!==c)return b.set(a,c),c;b.set(a,null);return null};t.Df=function(a,b,c){void 0===c&&(c=new J);b=b.nc()?zc:b;var d=a.naturalBounds;c.h(d.width*b.x+b.offsetX,d.height*b.y+b.offsetY);if(null===a||a===this)return c;a.transform.ta(c);for(a=a.panel;null!==a&&a!==this;)a.transform.ta(c),a=a.panel;this.cg.ta(c);c.offset(-this.qc.x,-this.qc.y);return c};\nt.mj=function(a){void 0===a&&(a=new N);return a.assign(this.actualBounds)};t.Ta=function(){!0===uj(this)&&this.measure(Infinity,Infinity);this.arrange()};function Fj(a,b){var c=a.ez;isNaN(a.kh)&&(a.kh=kn(a));var d=a.kh;var e=2*d;if(!a.isShadowed)return c.h(b.x-1-d,b.y-1-d,b.width+2+e,b.height+2+e),c;d=b.x;e=b.y;var f=b.width;b=b.height;var g=a.shadowBlur;a=a.shadowOffset;f+=g;b+=g;d-=g/2;e-=g/2;0<a.x?f+=a.x:(d+=a.x,f-=a.x);0<a.y?b+=a.y:(e+=a.y,b-=a.y);c.h(d-1,e-1,f+2,b+2);return c}\nV.prototype.arrange=function(){if(!1===vj(this))Co(this);else{rl(this,!1);var a=this.xb,b=N.alloc();b.assign(a);var c=wg(this);this.Ih(0,0,this.qc.width,this.qc.height);var d=this.position;Do(this,d,this.location);a.ea();a.x=d.x;a.y=d.y;a.freeze();this.Im(b,a);b.w(a)?this.Nd(c):!this.Nc()||L.A(b.width,a.width)&&L.A(b.height,a.height)||0<=this.zx&&this.B(16);N.free(b);Bo(this,!1)}};t=V.prototype;\nt.Im=function(a,b){var c=this.diagram;if(null!==c){var d=!1;if(!1===c.vi&&a.s()){var e=N.alloc();e.assign(c.documentBounds);e.Jw(c.padding);a.x>e.x&&a.y>e.y&&a.right<e.right&&a.bottom<e.bottom&&b.x>e.x&&b.y>e.y&&b.right<e.right&&b.bottom<e.bottom&&(d=!0);N.free(e)}0!==(this.D&65536)!==!0&&a.w(b)||Kj(this,d,c);c.M();!a.s()&&!b.s()||Vb(a,b)||(this instanceof W&&!c.undoManager.isUndoingRedoing&&this.sd(),this.Oh())}};\nt.Ew=function(a,b){if(this.Ph()||!a.s())return!1;var c=this.diagram;null!==c&&Eo(this,c,a,b);this.la=a;this.D&=-2097153;var d=this.dg;!d.s()||null!==c&&!c.animationManager.isTicking&&c.undoManager.isUndoingRedoing||(c=d.copy(),d.h(d.x+(a.x-b.x),d.y+(a.y-b.y)),this.g(\"location\",c,d.copy()));!1===wj(this)&&!1===vj(this)&&(Ao(this),Co(this));return!0};function Eo(a,b,c,d){null===b||a instanceof Je||(b=b.animationManager,b.ef&&Oh(b,a,d.copy(),c.copy()))}\nt.er=function(a,b,c){var d=this.dg,e=this.la;if(c){if(d.x===a&&d.y===b)return;wj(this)||vj(this)?e.h(NaN,NaN):e.h(e.x+a-d.x,e.y+b-d.y);d.h(a,b)}else{if(e.x===a&&e.y===b)return;wj(this)||vj(this)?this.lu():d.h(d.x+a-e.x,d.y+b-e.y);e.h(a,b)}Ao(this)};t.lu=function(){this.D&=-2097153;Ao(this)};\nfunction Do(a,b,c){var d=J.alloc(),e=a.locationSpot,f=a.locationObject;e.nc()&&B(\"determineOffset: Part's locationSpot must be real: \"+e.toString());var g=f.naturalBounds,h=f instanceof Kf?f.strokeWidth:0;d.Uk(0,0,g.width+h,g.height+h,e);if(f!==a)for(d.offset(-h/2,-h/2),f.transform.ta(d),e=f.panel;null!==e&&e!==a;)e.transform.ta(d),e=e.panel;a.cg.ta(d);d.offset(-a.qc.x,-a.qc.y);e=a.diagram;f=c.s();g=b.s();f&&g?0!==(a.D&2097152)?Fo(a,b,c,e,d):Go(a,b,c,e,d):f?Fo(a,b,c,e,d):g&&Go(a,b,c,e,d);a.D|=2097152;\nJ.free(d);a.Fl()}function Fo(a,b,c,d,e){var f=b.x,g=b.y;b.h(c.x-e.x,c.y-e.y);null!==d&&(c=d.animationManager,(d=c.defaultAnimation.isAnimating)||!c.ef||a instanceof Je||Oh(c,a,new J(f,g),b),d||b.x===f&&b.y===g||a.g(\"position\",new J(f,g),b.copy()))}function Go(a,b,c,d,e){var f=c.copy();c.h(b.x+e.x,b.y+e.y);c.w(f)||null===d||a.g(\"location\",f,c.copy())}\nfunction Kj(a,b,c){tl(a,!1);a instanceof W&&Ck(c,a);a.layer.isTemporary||b||c.Na();b=a.xb;var d=c.viewportBounds;d.s()?wg(a)?(ac(b,d)||a.Nd(!1),a.updateAdornments()):b.Mc(d)?(a.Nd(!0),a.updateAdornments()):a.Lb():c.xi=!0}t.rj=function(){return!0};t.Nc=function(){return!0};t.Ph=function(){return!1};t.Ff=function(){return!0};\nfunction Ho(a,b,c,d){b.constructor===a.constructor||Io||(Io=!0,xa('Should not change the class of the Part when changing category from \"'+c+'\" to \"'+d+'\"'),xa(\"  Old class: \"+Ja(a.constructor)+\", new class: \"+Ja(b.constructor)+\", part: \"+a.toString()));a.nk();var e=a.data;c=a.layerName;var f=a.isSelected,g=a.isHighlighted,h=!0,k=!0,l=!1;a instanceof W&&(h=a.isTreeLeaf,k=a.isTreeExpanded,l=a.wasTreeExpanded);b.yf(a);b.cloneProtected(a);a.Nf=d;a.o();a.M();b=a.diagram;d=!0;null!==b&&(d=b.skipsUndoManager,\nb.skipsUndoManager=!0);a.ob=e;a.D=f?a.D|4096:a.D&-4097;a.D=g?a.D|524288:a.D&-524289;a instanceof W&&(a.P=h?a.P|4:a.P&-5,a.P=k?a.P|1:a.P&-2,a.P=l?a.P|2:a.P&-3);null!==e&&a.Da();e=a.layerName;e!==c&&(a.ih=c,a.layerName=e);null!==b&&(b.skipsUndoManager=d);a.Nc()&&a.B(64)}V.prototype.canCopy=function(){if(!this.copyable)return!1;var a=this.layer;if(null===a)return!0;if(!a.allowCopy)return!1;a=a.diagram;return null===a?!0:a.allowCopy?!0:!1};\nV.prototype.canDelete=function(){if(!this.deletable)return!1;var a=this.layer;if(null===a)return!0;if(!a.allowDelete)return!1;a=a.diagram;return null===a?!0:a.allowDelete?!0:!1};V.prototype.canEdit=function(){if(!this.textEditable)return!1;var a=this.layer;if(null===a)return!0;if(!a.allowTextEdit)return!1;a=a.diagram;return null===a?!0:a.allowTextEdit?!0:!1};\nV.prototype.canGroup=function(){if(!this.groupable)return!1;var a=this.layer;if(null===a)return!0;if(!a.allowGroup)return!1;a=a.diagram;return null===a?!0:a.allowGroup?!0:!1};V.prototype.canMove=function(){if(!this.movable)return!1;var a=this.layer;if(null===a)return!0;if(!a.allowMove)return!1;a=a.diagram;return null===a?!0:a.allowMove?!0:!1};\nV.prototype.canReshape=function(){if(!this.reshapable)return!1;var a=this.layer;if(null===a)return!0;if(!a.allowReshape)return!1;a=a.diagram;return null===a?!0:a.allowReshape?!0:!1};V.prototype.canResize=function(){if(!this.resizable)return!1;var a=this.layer;if(null===a)return!0;if(!a.allowResize)return!1;a=a.diagram;return null===a?!0:a.allowResize?!0:!1};\nV.prototype.canRotate=function(){if(!this.rotatable)return!1;var a=this.layer;if(null===a)return!0;if(!a.allowRotate)return!1;a=a.diagram;return null===a?!0:a.allowRotate?!0:!1};V.prototype.canSelect=function(){if(!this.selectable)return!1;var a=this.layer;if(null===a)return!0;if(!a.allowSelect)return!1;a=a.diagram;return null===a?!0:a.allowSelect?!0:!1};function wj(a){return 0!==(a.D&32768)}function Bo(a,b){a.D=b?a.D|32768:a.D&-32769}function tl(a,b){a.D=b?a.D|65536:a.D&-65537}\nfunction wg(a){return 0!==(a.D&131072)}t=V.prototype;t.Nd=function(a){this.D=a?this.D|131072:this.D&-131073};function Jo(a,b){a.D=b?a.D|1048576:a.D&-1048577}t.Oh=function(){var a=this.containingGroup;null!==a&&(a.o(),null!==a.placeholder&&a.placeholder.o(),a.sd())};t.M=function(){var a=this.diagram;null!==a&&!vj(this)&&!wj(this)&&this.isVisible()&&this.xb.s()&&a.M(Fj(this,this.xb))};\nt.o=function(){X.prototype.o.call(this);var a=this.diagram;null!==a&&(a.wd.add(this),this instanceof W&&null!==this.labeledLink&&Il(this.labeledLink),a.Db(!0))};t.Mq=function(a){a||(a=this.mi,null!==a&&Ko(a,this))};t.Nq=function(a){a||(a=this.mi,null!==a&&Lo(a,this))};t.uk=function(){var a=this.data;if(null!==a){var b=this.diagram;null!==b&&(b=b.model,null!==b&&b.Nm(a))}};t.bA=function(){return Mo(this,this)};\nfunction Mo(a,b){var c=b.containingGroup;return null!==c?1+Mo(a,c):b instanceof W&&(b=b.labeledLink,null!==b)?Mo(a,b):0}t.eA=function(){return No(this,this)};function No(a,b){var c=b.containingGroup;return null!==c||b instanceof W&&(c=b.labeledLink,null!==c)?No(a,c):b}t.Kd=function(a){return a instanceof U?Oo(this,this,a):!1};function Oo(a,b,c){if(b===c||null===c)return!1;var d=b.containingGroup;return null===d||d!==c&&!Oo(a,d,c)?b instanceof W&&(b=b.labeledLink,null!==b)?Oo(a,b,c):!1:!0}\nt.oy=function(a){if(null===a)return null;if(this===a)return this.containingGroup;for(var b=this;null!==b;){b instanceof U&&Jo(b,!0);if(b instanceof W){var c=b.labeledLink;null!==c&&(b=c)}b=b.containingGroup}c=null;for(b=a;null!==b;){if(0!==(b.D&1048576)){c=b;break}b instanceof W&&(a=b.labeledLink,null!==a&&(b=a));b=b.containingGroup}for(b=this;null!==b;)b instanceof U&&Jo(b,!1),b instanceof W&&(a=b.labeledLink,null!==a&&(b=a)),b=b.containingGroup;return c};\nV.prototype.canLayout=function(){if(!this.isLayoutPositioned||!this.isVisible())return!1;var a=this.layer;return null!==a&&a.isTemporary||this instanceof W&&this.isLinkLabel?!1:!0};\nV.prototype.B=function(a){void 0===a&&(a=16777215);if(this.isLayoutPositioned&&0!==(a&this.layoutConditions)){var b=this.layer;null!==b&&b.isTemporary||this instanceof W&&this.isLinkLabel?b=!1:(b=this.diagram,b=null!==b&&b.undoManager.isUndoingRedoing?!1:!0)}else b=!1;if(b)if(b=this.mi,null!==b){var c=b.layout;null!==c?c.B():b.B(a)}else a=this.diagram,null!==a&&(a=a.layout,null!==a&&a.B())};function Lj(a){if(!a.isVisible())return!1;a=a.layer;return null!==a&&a.isTemporary?!1:!0}\nfunction Yk(a,b,c,d,e,f){void 0===f&&(f=null);if(!(a.contains(b)||null!==f&&!f(b)||b instanceof Je))if(a.add(b),b instanceof W){if(c&&b instanceof U)for(var g=b.memberParts;g.next();)Yk(a,g.value,c,d,e,f);if(!1!==e)for(g=b.linksConnected;g.next();){var h=g.value;if(!a.contains(h)){var k=h.fromNode,l=h.toNode;k=null===k||a.contains(k);l=null===l||a.contains(l);(e?k&&l:k||l)&&Yk(a,h,c,d,e,f)}}if(1<d)for(b=b.Wv();b.next();)Yk(a,b.value,c,d-1,e,f)}else if(b instanceof S)for(b=b.labelNodes;b.next();)Yk(a,\nb.value,c,d,e,f)}\nna.Object.defineProperties(V.prototype,{key:{get:function(){var a=this.diagram;if(null!==a)return a.model.ja(this.data)}},adornments:{get:function(){return null===this.Lf?db:this.Lf.iteratorValues}},layer:{get:function(){return this.Fi}},diagram:{get:function(){var a=this.Fi;return null!==a?a.diagram:null}},layerName:{get:function(){return this.ih},set:function(a){var b=\nthis.ih;if(b!==a){var c=this.diagram;if(null===c||null!==c.xk(a)&&!c.partManager.addsToTemporaryLayer)if(this.ih=a,null!==c&&c.Na(),this.g(\"layerName\",b,a),b=this.layer,null!==b&&b.name!==a&&(c=b.diagram,null!==c&&(a=c.xk(a),null!==a&&a!==b))){var d=b.Lc(-1,this,!0);0<=d&&c.Va(Ae,\"parts\",b,this,null,d,!0);d=a.oj(99999999,this,!0);b.visible!==a.visible&&this.Ob(a.visible);0<=d&&c.Va(ze,\"parts\",a,null,this,!0,d);d=this.layerChanged;if(null!==d){var e=c.Z;c.Z=!0;d(this,b,a);c.Z=e}}}}},layerChanged:{\nget:function(){return this.Ho},set:function(a){var b=this.Ho;b!==a&&(this.Ho=a,this.g(\"layerChanged\",b,a))}},zOrder:{get:function(){return this.tq},set:function(a){var b=this.tq;if(b!==a){this.tq=a;var c=this.layer;null!==c&&oi(c,-1,this);this.g(\"zOrder\",b,a);a=this.diagram;null!==a&&a.M()}}},locationObject:{get:function(){if(null===this.cf){var a=this.locationObjectName;\"\"!==a?(a=this.bb(a),null!==a?this.cf=a:this.cf=this):\nthis instanceof Je?this.type!==X.Link&&null!==this.placeholder?this.cf=this.placeholder:this.cf=this:this.cf=this}return this.cf.visible?this.cf:this}},minLocation:{get:function(){return this.Yo},set:function(a){var b=this.Yo;b.w(a)||(this.Yo=a=a.H(),this.g(\"minLocation\",b,a))}},maxLocation:{get:function(){return this.Qo},set:function(a){var b=this.Qo;b.w(a)||(this.Qo=a=a.H(),this.g(\"maxLocation\",b,a))}},locationObjectName:{\nget:function(){return this.Oo},set:function(a){var b=this.Oo;b!==a&&(this.Oo=a,this.cf=null,this.o(),this.g(\"locationObjectName\",b,a))}},locationSpot:{get:function(){return this.Po},set:function(a){var b=this.Po;b.w(a)||(this.Po=a=a.H(),this.o(),this.g(\"locationSpot\",b,a))}},location:{get:function(){return this.dg},set:function(a){var b=a.x,c=a.y,d=this.dg,e=d.x,f=d.y;(e===b||isNaN(e)&&isNaN(b))&&(f===c||isNaN(f)&&isNaN(c))||\n(a=a.copy(),b=a,this.Ph()?b=!1:(this.dg=b,this.D|=2097152,!1===vj(this)&&(Ao(this),c=this.la,c.s()&&(e=this.diagram,null===e||e.animationManager.isTicking||!e.undoManager.isUndoingRedoing))&&(f=c.copy(),c.h(c.x+(b.x-d.x),c.y+(b.y-d.y)),Eo(this,e,c,f),this.g(\"position\",f,c.copy())),b=!0),b&&this.g(\"location\",d.copy(),a.copy()))}},category:{get:function(){return this.Nf},set:function(a){var b=this.Nf;if(b!==a){var c=this.diagram,d=this.data,e=null;if(null!==c&&null!==d&&\n!(this instanceof Je)){var f=c.model.undoManager;f.isEnabled&&!f.isUndoingRedoing&&(e=this.clone(),e.W.addAll(this.W))}this.Nf=a;this.g(\"category\",b,a);null===c||null===d||this instanceof Je?this instanceof Je&&(e=this.adornedPart,null!==e&&(a=e.Lf,null!==a&&a.remove(b),e.Gh(this.category,this))):(f=c.model,f.undoManager.isUndoingRedoing||(this.Ph()?(c.partManager.setLinkCategoryForData(d,a),c=c.partManager.findLinkTemplateForCategory(a),null!==c&&(yg(c),c=c.copy(),null!==c&&Ho(this,c,b,a))):(null!==\nf&&f.Um(d,a),c=Po(c.partManager,d,a),null!==c&&(yg(c),c=c.copy(),null===c||c instanceof S||(d=this.location.copy(),Ho(this,c,b,a),this.location.s()||(this.location=d)))),null!==e&&(b=this.clone(),b.W.addAll(this.W),this.g(\"self\",e,b))))}}},self:{get:function(){return this},set:function(a){Ho(this,a,this.category,a.category)}},copyable:{get:function(){return 0!==(this.D&1)},set:function(a){var b=0!==(this.D&1);b!==a&&(this.D^=1,this.g(\"copyable\",\nb,a))}},deletable:{get:function(){return 0!==(this.D&2)},set:function(a){var b=0!==(this.D&2);b!==a&&(this.D^=2,this.g(\"deletable\",b,a))}},textEditable:{get:function(){return 0!==(this.D&4)},set:function(a){var b=0!==(this.D&4);b!==a&&(this.D^=4,this.g(\"textEditable\",b,a),this.Lb())}},groupable:{get:function(){return 0!==(this.D&8)},set:function(a){var b=0!==(this.D&8);b!==a&&(this.D^=8,this.g(\"groupable\",b,\na))}},movable:{get:function(){return 0!==(this.D&16)},set:function(a){var b=0!==(this.D&16);b!==a&&(this.D^=16,this.g(\"movable\",b,a))}},selectionAdorned:{get:function(){return 0!==(this.D&32)},set:function(a){var b=0!==(this.D&32);b!==a&&(this.D^=32,this.g(\"selectionAdorned\",b,a),this.Lb())}},isInDocumentBounds:{get:function(){return 0!==(this.D&64)},set:function(a){var b=0!==(this.D&64);if(b!==a){this.D^=64;\nvar c=this.diagram;null!==c&&c.Na();this.g(\"isInDocumentBounds\",b,a)}}},isLayoutPositioned:{get:function(){return 0!==(this.D&128)},set:function(a){var b=0!==(this.D&128);b!==a&&(this.D^=128,this.g(\"isLayoutPositioned\",b,a),this.B(a?4:8))}},selectable:{get:function(){return 0!==(this.D&256)},set:function(a){var b=0!==(this.D&256);b!==a&&(this.D^=256,this.g(\"selectable\",b,a),this.Lb())}},reshapable:{get:function(){return 0!==\n(this.D&512)},set:function(a){var b=0!==(this.D&512);b!==a&&(this.D^=512,this.g(\"reshapable\",b,a),this.Lb())}},resizable:{get:function(){return 0!==(this.D&1024)},set:function(a){var b=0!==(this.D&1024);b!==a&&(this.D^=1024,this.g(\"resizable\",b,a),this.Lb())}},rotatable:{get:function(){return 0!==(this.D&2048)},set:function(a){var b=0!==(this.D&2048);b!==a&&(this.D^=2048,this.g(\"rotatable\",b,a),this.Lb())}},isSelected:{\nget:function(){return 0!==(this.D&4096)},set:function(a){var b=0!==(this.D&4096);if(b!==a){var c=this.diagram;if(!a||this.canSelect()&&!(null!==c&&c.selection.count>=c.maxSelectionCount)){this.D^=4096;var d=!1;if(null!==c){d=c.skipsUndoManager;c.skipsUndoManager=!0;var e=c.selection;e.ea();a?e.add(this):e.remove(this);e.freeze()}this.g(\"isSelected\",b,a);this.Lb();a=this.selectionChanged;null!==a&&a(this);null!==c&&(c.Db(),c.skipsUndoManager=d)}}}},isHighlighted:{get:function(){return 0!==\n(this.D&524288)},set:function(a){var b=0!==(this.D&524288);if(b!==a){this.D^=524288;var c=this.diagram;null!==c&&(c=c.highlighteds,c.ea(),a?c.add(this):c.remove(this),c.freeze());this.g(\"isHighlighted\",b,a);this.M();a=this.highlightedChanged;null!==a&&a(this)}}},isShadowed:{get:function(){return 0!==(this.D&8192)},set:function(a){var b=0!==(this.D&8192);b!==a&&(this.D^=8192,this.g(\"isShadowed\",b,a),this.M())}},isAnimated:{get:function(){return 0!==\n(this.D&262144)},set:function(a){var b=0!==(this.D&262144);b!==a&&(this.D^=262144,this.g(\"isAnimated\",b,a))}},highlightedChanged:{get:function(){return this.so},set:function(a){var b=this.so;b!==a&&(this.so=a,this.g(\"highlightedChanged\",b,a))}},selectionObjectName:{get:function(){return this.Tp},set:function(a){var b=this.Tp;b!==a&&(this.Tp=a,this.sh=null,this.g(\"selectionObjectName\",b,a))}},selectionAdornmentTemplate:{\nget:function(){return this.Rp},set:function(a){var b=this.Rp;b!==a&&(this.Rp=a,this.g(\"selectionAdornmentTemplate\",b,a))}},selectionObject:{get:function(){if(null===this.sh){var a=this.selectionObjectName;null!==a&&\"\"!==a?(a=this.bb(a),null!==a?this.sh=a:this.sh=this):this instanceof S?(a=this.path,null!==a?this.sh=a:this.sh=this):this.sh=this}return this.sh}},selectionChanged:{get:function(){return this.Sp},set:function(a){var b=this.Sp;\nb!==a&&(this.Sp=a,this.g(\"selectionChanged\",b,a))}},resizeAdornmentTemplate:{get:function(){return this.Cp},set:function(a){var b=this.Cp;b!==a&&(this.Cp=a,this.g(\"resizeAdornmentTemplate\",b,a))}},resizeObjectName:{get:function(){return this.Ep},set:function(a){var b=this.Ep;b!==a&&(this.Ep=a,this.g(\"resizeObjectName\",b,a))}},resizeObject:{get:function(){var a=this.resizeObjectName;return\"\"!==a&&(a=this.bb(a),\nnull!==a)?a:this}},resizeCellSize:{get:function(){return this.Dp},set:function(a){var b=this.Dp;b.w(a)||(this.Dp=a=a.H(),this.g(\"resizeCellSize\",b,a))}},rotateAdornmentTemplate:{get:function(){return this.Gp},set:function(a){var b=this.Gp;b!==a&&(this.Gp=a,this.g(\"rotateAdornmentTemplate\",b,a))}},rotateObjectName:{get:function(){return this.Hp},set:function(a){var b=this.Hp;b!==a&&(this.Hp=a,this.g(\"rotateObjectName\",\nb,a))}},rotateObject:{get:function(){var a=this.rotateObjectName;return\"\"!==a&&(a=this.bb(a),null!==a)?a:this}},rotationSpot:{get:function(){return this.Ip},set:function(a){var b=this.Ip;b.w(a)||(this.Ip=a=a.H(),this.g(\"rotationSpot\",b,a))}},text:{get:function(){return this.Ub},set:function(a){var b=this.Ub;b!==a&&(this.Ub=a,this.g(\"text\",b,a))}},containingGroup:{get:function(){return this.mi},\nset:function(a){if(this.Nc()){var b=this.mi;if(b!==a){null===a||this!==a&&!a.Kd(this)||(this===a&&B(\"Cannot make a Group a member of itself: \"+this.toString()),B(\"Cannot make a Group indirectly contain itself: \"+this.toString()+\" already contains \"+a.toString()));this.B(2);var c=this.diagram;null!==b?Lo(b,this):this instanceof U&&null!==c&&c.Dh.remove(this);this.mi=a;null!==a?Ko(a,this):this instanceof U&&null!==c&&c.Dh.add(this);this.B(1);if(null!==c&&c.Z){var d=this.data,e=c.model;if(null!==d&&\ne.Dk()){var f=e.ja(null!==a?a.data:null);e.dr(d,f)}}d=this.containingGroupChanged;null!==d&&(e=!0,null!==c&&(e=c.Z,c.Z=!0),d(this,b,a),null!==c&&(c.Z=e));if(this instanceof U)for(c=new G,Yk(c,this,!0,0,!0),c=c.iterator;c.next();)if(d=c.value,d instanceof W)for(d=d.linksConnected;d.next();)Qo(d.value);if(this instanceof W){for(c=this.linksConnected;c.next();)Qo(c.value);c=this.labeledLink;null!==c&&Qo(c)}this.g(\"containingGroup\",b,a);null!==a&&(b=a.layer,null!==b&&oi(b,-1,a))}}else B(\"cannot set the Part.containingGroup of a Link or Adornment\")}},\ncontainingGroupChanged:{get:function(){return this.An},set:function(a){var b=this.An;b!==a&&(this.An=a,this.g(\"containingGroupChanged\",b,a))}},isTopLevel:{get:function(){return null!==this.containingGroup||this instanceof W&&null!==this.labeledLink?!1:!0}},layoutConditions:{get:function(){return this.Io},set:function(a){var b=this.Io;b!==a&&(this.Io=a,this.g(\"layoutConditions\",b,a))}},dragComputation:{\nget:function(){return this.Sn},set:function(a){var b=this.Sn;b!==a&&(this.Sn=a,this.g(\"dragComputation\",b,a))}},shadowOffset:{get:function(){return this.Xp},set:function(a){var b=this.Xp;b.w(a)||(this.Xp=a=a.H(),this.M(),this.g(\"shadowOffset\",b,a))}},shadowColor:{get:function(){return this.Wp},set:function(a){var b=this.Wp;b!==a&&(this.Wp=a,this.M(),this.g(\"shadowColor\",b,a))}},shadowBlur:{get:function(){return this.ug},\nset:function(a){var b=this.ug;b!==a&&(this.ug=a,this.M(),this.g(\"shadowBlur\",b,a))}}});V.prototype.invalidateLayout=V.prototype.B;V.prototype.findCommonContainingGroup=V.prototype.oy;V.prototype.isMemberOf=V.prototype.Kd;V.prototype.findTopLevelPart=V.prototype.eA;V.prototype.findSubGraphLevel=V.prototype.bA;V.prototype.ensureBounds=V.prototype.Ta;V.prototype.getDocumentBounds=V.prototype.mj;V.prototype.getRelativePoint=V.prototype.Df;V.prototype.findObject=V.prototype.bb;V.prototype.moveTo=V.prototype.moveTo;\nV.prototype.invalidateAdornments=V.prototype.Lb;V.prototype.clearAdornments=V.prototype.nk;V.prototype.removeAdornment=V.prototype.Hf;V.prototype.addAdornment=V.prototype.Gh;V.prototype.findAdornment=V.prototype.wk;V.prototype.updateTargetBindings=V.prototype.Da;var Io=!1;V.className=\"Part\";V.LayoutNone=0;V.LayoutAdded=1;V.LayoutRemoved=2;V.LayoutShown=4;V.LayoutHidden=8;V.LayoutNodeSized=16;V.LayoutGroupLayout=32;V.LayoutNodeReplaced=64;V.LayoutStandard=127;V.LayoutAll=16777215;\nfunction Je(a){V.call(this,a);this.D&=-257;this.ih=\"Adornment\";this.ie=null;this.Ex=0;this.Sx=!1;this.l=a instanceof Qm?[]:Ro;this.Sa=null}ma(Je,V);Je.prototype.toString=function(){var a=this.adornedPart;return\"Adornment(\"+this.category+\")\"+(null!==a?a.toString():\"\")};Je.prototype.updateRelationshipsFromData=function(){};\nJe.prototype.Gk=function(a){var b=this.adornedObject.part;if(b instanceof S&&this.adornedObject instanceof Kf){var c=b.path;b.Gk(a);a=c.geometry;b=this.W.j;c=b.length;for(var d=0;d<c;d++){var e=b[d];e.isPanelMain&&e instanceof Kf&&(e.na=a)}}};Je.prototype.rj=function(){var a=this.ie;if(null===a)return!0;a=a.part;return null===a||!vj(a)};Je.prototype.Nc=function(){return!1};\nJe.prototype.Sk=function(a,b,c,d,e,f,g){if(a===ze&&\"elements\"===b)if(e instanceof xg)null===this.Sa&&(this.Sa=e);else{if(e instanceof X){var h=e.ym(function(a){return a instanceof xg});h instanceof xg&&null===this.Sa&&(this.Sa=h)}}else a===Ae&&\"elements\"===b&&null!==this.Sa&&(d===this.Sa?this.Sa=null:d instanceof X&&this.Sa.Gg(d)&&(this.Sa=null));V.prototype.Sk.call(this,a,b,c,d,e,f,g)};Je.prototype.updateAdornments=function(){};Je.prototype.uk=function(){};\nna.Object.defineProperties(Je.prototype,{placeholder:{get:function(){return this.Sa}},adornedObject:{get:function(){return this.ie},set:function(a){var b=this.adornedPart,c=null;null!==a&&(c=a.part);null===b||null!==a&&b===c||b.Hf(this.category);this.ie=a;null!==c&&c.Gh(this.category,this)}},adornedPart:{get:function(){var a=this.ie;return null!==a?a.part:null}},containingGroup:{\nget:function(){return null}}});var Ro=[];Je.className=\"Adornment\";function W(a){V.call(this,a);this.P=13;this.$a=new E;this.nq=this.Kl=this.Ii=this.Ko=this.Jo=null;this.cl=rc;this.tc=this.Se=null;this.zp=So;this.Eh=!1}ma(W,V);W.prototype.cloneProtected=function(a){V.prototype.cloneProtected.call(this,a);a.P=this.P;a.P=this.P&-17;a.Jo=this.Jo;a.Ko=this.Ko;a.Ii=this.Ii;a.nq=this.nq;a.cl=this.cl.H();a.zp=this.zp};t=W.prototype;t.yf=function(a){V.prototype.yf.call(this,a);a.sd();a.Se=this.Se;a.tc=null};\nfunction To(a,b){null!==b&&(null===a.Se&&(a.Se=new G),a.Se.add(b))}function Uo(a,b,c,d){if(null===b||null===a.Se)return null;for(var e=a.Se.iterator;e.next();){var f=e.value;if(f.au===a&&f.lw===b&&f.My===c&&f.Ny===d||f.au===b&&f.lw===a&&f.My===d&&f.Ny===c)return f}return null}t.xA=function(a,b,c){if(void 0===b||null===b)b=\"\";if(void 0===c||null===c)c=\"\";a=Uo(this,a,b,c);null!==a&&a.Dm()};\nt.Sk=function(a,b,c,d,e,f,g){a===ze&&\"elements\"===b?this.tc=null:a===Ae&&\"elements\"===b&&(this.tc=null);V.prototype.Sk.call(this,a,b,c,d,e,f,g)};t.sd=function(a){void 0===a&&(a=null);for(var b=this.linksConnected;b.next();){var c=b.value;null!==a&&a.contains(c)||(Vo(c.fromPort),Vo(c.toPort),c.Ua())}};function ul(a,b){for(a=a.linksConnected;a.next();){var c=a.value;if(c.fromPort===b||c.toPort===b)Vo(c.fromPort),Vo(c.toPort),c.Ua()}}\nfunction Vo(a){if(null!==a){var b=a.yp;null!==b&&b.Dm();a=a.part;b=a.containingGroup;null===b||a.isVisible()||Vo(b.port)}}t.rj=function(){return!0};W.prototype.getAvoidableRect=function(a){a.set(this.actualBounds);a.uq(this.cl);return a};W.prototype.findVisibleNode=function(){for(var a=this;null!==a&&!a.isVisible();)a=a.containingGroup;return a};\nW.prototype.isVisible=function(){if(!V.prototype.isVisible.call(this))return!1;var a=!0,b=ti,c=this.diagram;if(null!==c){if(c.animationManager.cu(this))return!0;a=c.isTreePathToChildren;b=c.treeCollapsePolicy}if(b===ti){if(a=this.Fg(),null!==a&&!a.isTreeExpanded)return!1}else if(b===Jk){if(a=a?this.Tv():this.Uv(),0<a.count&&a.all(function(a){return!a.isTreeExpanded}))return!1}else if(b===Kk&&(a=a?this.Tv():this.Uv(),0<a.count&&a.any(function(a){return!a.isTreeExpanded})))return!1;a=this.labeledLink;\nreturn null!==a?a.isVisible():!0};W.prototype.Ob=function(a){V.prototype.Ob.call(this,a);for(var b=this.linksConnected;b.next();){var c=b.value;if(a&&null!==this.containingGroup){var d=c.Kq(this);null===d||d.Kd(this.containingGroup)||c.Ua()}c.Ob(a)}};W.prototype.py=function(){var a=new G,b=new G;Wo(this,this,a,b);return b.iterator};\nfunction Wo(a,b,c,d){if(null!==b&&!c.has(b)){c.add(b);var e=!0,f=a.diagram;null!==f&&(e=f.isTreePathToChildren);b.linksConnected.each(function(f){f.isTreeLink?(e?f.fromNode===b:f.toNode===b)&&Wo(a,e?f.toNode:f.fromNode,c,d):d.add(f)})}}W.prototype.findLinksConnected=function(a){void 0===a&&(a=null);if(null===a)return this.$a.iterator;var b=new ib(this.$a),c=this;b.predicate=function(b){return b.fromNode===c&&b.fromPortId===a||b.toNode===c&&b.toPortId===a};return b};t=W.prototype;\nt.Fq=function(a){void 0===a&&(a=null);var b=new ib(this.$a),c=this;b.predicate=function(b){return b.fromNode!==c?!1:null===a?!0:b.fromPortId===a};return b};t.Hd=function(a){void 0===a&&(a=null);var b=new ib(this.$a),c=this;b.predicate=function(b){return b.toNode!==c?!1:null===a?!0:b.toPortId===a};return b};\nt.Sv=function(a){void 0===a&&(a=null);for(var b=null,c=null,d=this.$a.iterator;d.next();){var e=d.value;if(e.fromNode===this){if(null===a||e.fromPortId===a)e=e.toNode,null!==b?b.add(e):null!==c&&c!==e?(b=new G,b.add(c),b.add(e)):c=e}else e.toNode!==this||null!==a&&e.toPortId!==a||(e=e.fromNode,null!==b?b.add(e):null!==c&&c!==e?(b=new G,b.add(c),b.add(e)):c=e)}return null!==b?b.iterator:null!==c?new hb(c):db};\nt.Uv=function(a){void 0===a&&(a=null);for(var b=null,c=null,d=this.$a.iterator;d.next();){var e=d.value;e.fromNode!==this||null!==a&&e.fromPortId!==a||(e=e.toNode,null!==b?b.add(e):null!==c&&c!==e?(b=new G,b.add(c),b.add(e)):c=e)}return null!==b?b.iterator:null!==c?new hb(c):db};\nt.Tv=function(a){void 0===a&&(a=null);for(var b=null,c=null,d=this.$a.iterator;d.next();){var e=d.value;e.toNode!==this||null!==a&&e.toPortId!==a||(e=e.fromNode,null!==b?b.add(e):null!==c&&c!==e?(b=new G,b.add(c),b.add(e)):c=e)}return null!==b?b.iterator:null!==c?new hb(c):db};\nt.Xz=function(a,b,c){void 0===b&&(b=null);void 0===c&&(c=null);var d=new ib(this.$a),e=this;d.predicate=function(d){return(d.fromNode!==e||d.toNode!==a||null!==b&&d.fromPortId!==b||null!==c&&d.toPortId!==c)&&(d.fromNode!==a||d.toNode!==e||null!==c&&d.fromPortId!==c||null!==b&&d.toPortId!==b)?!1:!0};return d};\nt.Yz=function(a,b,c){void 0===b&&(b=null);void 0===c&&(c=null);var d=new ib(this.$a),e=this;d.predicate=function(d){return d.fromNode!==e||d.toNode!==a||null!==b&&d.fromPortId!==b||null!==c&&d.toPortId!==c?!1:!0};return d};\nfunction Xo(a,b,c){Vo(c);var d=a.$a.contains(b);d||a.$a.add(b);if(!d||b.fromNode===b.toNode){var e=a.linkConnected;if(null!==e){var f=!0,g=a.diagram;null!==g&&(f=g.Z,g.Z=!0);e(a,b,c);null!==g&&(g.Z=f)}}!d&&b.isTreeLink&&(c=b.fromNode,b=b.toNode,null!==c&&null!==b&&c!==b&&(d=!0,a=a.diagram,null!==a&&(d=a.isTreePathToChildren),e=d?b:c,f=d?c:b,e.Eh||(e.Eh=f),!f.isTreeLeaf||null!==a&&a.undoManager.isUndoingRedoing||(d?c===f&&(f.isTreeLeaf=!1):b===f&&(f.isTreeLeaf=!1))))}\nfunction Yo(a,b,c){Vo(c);var d=a.$a.remove(b),e=null;if(d||b.toNode===b.fromNode){var f=a.linkDisconnected;e=a.diagram;if(null!==f){var g=!0;null!==e&&(g=e.Z,e.Z=!0);f(a,b,c);null!==e&&(e.Z=g)}}d&&b.isTreeLink&&(c=!0,null!==e&&(c=e.isTreePathToChildren),a=c?b.toNode:b.fromNode,b=c?b.fromNode:b.toNode,null!==a&&(a.Eh=!1),null===b||b.isTreeLeaf||(0===b.$a.count?(b.Eh=null,null!==e&&e.undoManager.isUndoingRedoing||(b.isTreeLeaf=!0)):Ik(b)))}\nfunction Ik(a){a.Eh=!1;if(0!==a.$a.count){var b=!0,c=a.diagram;if(null===c||!c.undoManager.isUndoingRedoing){null!==c&&(b=c.isTreePathToChildren);for(c=a.$a.iterator;c.next();){var d=c.value;if(d.isTreeLink)if(b){if(d.fromNode===a){a.isTreeLeaf=!1;return}}else if(d.toNode===a){a.isTreeLeaf=!1;return}}a.isTreeLeaf=!0}}}W.prototype.updateRelationshipsFromData=function(){var a=this.diagram;null!==a&&a.partManager.updateRelationshipsFromData(this)};t=W.prototype;\nt.Mq=function(a){V.prototype.Mq.call(this,a);a||(Ik(this),a=this.Kl,null!==a&&Zo(a,this))};t.Nq=function(a){V.prototype.Nq.call(this,a);a||(a=this.Kl,null!==a&&null!==a.nd&&(a.nd.remove(this),a.o()))};\nt.uk=function(){if(0<this.$a.count){var a=this.diagram;if(null!==a)for(var b=null!==a.commandHandler?a.commandHandler.deletesConnectedLinks:!0,c=this.$a.copy().iterator;c.next();){var d=c.value;b?a.remove(d):(d.fromNode===this&&(d.fromNode=null),d.toNode===this&&(d.toNode=null))}}this.labeledLink=null;V.prototype.uk.call(this)};t.Jt=function(a){if(null===this.tc){if(\"\"===a&&!1===this.Nh)return this;$o(this)}var b=this.tc.G(a);return null!==b||\"\"!==a&&(b=this.tc.G(\"\"),null!==b)?b:this};\nfunction $o(a){null===a.tc?a.tc=new H:a.tc.clear();a.an(a,function(a,c){Yl(a,c)});0===a.tc.count&&a.tc.add(\"\",a)}function Yl(a,b){var c=b.portId;null!==c&&null!==a.tc&&a.tc.add(c,b)}function Xl(a,b,c){var d=b.portId;if(null!==d&&(null!==a.tc&&a.tc.remove(d),b=a.diagram,null!==b&&c)){c=null;for(a=a.findLinksConnected(d);a.next();)d=a.value,null===c&&(c=Ea()),c.push(d);if(null!==c){for(a=0;a<c.length;a++)b.remove(c[a]);Ia(c)}}}\nt.zA=function(a){if(null===a||a===this)return!1;var b=!0,c=this.diagram;null!==c&&(b=c.isTreePathToChildren);c=this;if(b)for(;c!==a;){b=null;for(var d=c.$a.iterator;d.next();){var e=d.value;if(e.isTreeLink&&(b=e.fromNode,b!==c&&b!==this))break}if(b===this||null===b||b===c)return!1;c=b}else for(;c!==a;){b=null;for(d=c.$a.iterator;d.next()&&(e=d.value,!e.isTreeLink||(b=e.toNode,b===c||b===this)););if(b===this||null===b||b===c)return!1;c=b}return!0};\nt.iA=function(){var a=!0,b=this.diagram;null!==b&&(a=b.isTreePathToChildren);b=this;if(a)for(;;){a=null;for(var c=b.$a.iterator;c.next();){var d=c.value;if(d.isTreeLink&&(a=d.fromNode,a!==b&&a!==this))break}if(a===this)return this;if(null===a||a===b)return b;b=a}else for(;;){a=null;for(c=b.$a.iterator;c.next()&&(d=c.value,!d.isTreeLink||(a=d.toNode,a===b||a===this)););if(a===this)return this;if(null===a||a===b)return b;b=a}};\nt.Uz=function(a){if(null===a)return null;if(this===a)return this;for(var b=this;null!==b;)Jo(b,!0),b=b.Fg();var c=null;for(b=a;null!==b;){if(0!==(b.D&1048576)){c=b;break}b=b.Fg()}for(b=this;null!==b;)Jo(b,!1),b=b.Fg();return c};t.jj=function(){var a=!0,b=this.diagram;null!==b&&(a=b.isTreePathToChildren);b=this.$a.iterator;if(a)for(;b.next();){if(a=b.value,a.isTreeLink&&a.fromNode!==this)return a}else for(;b.next();)if(a=b.value,a.isTreeLink&&a.toNode!==this)return a;return null};\nt.Fg=function(){var a=this.Eh;if(null===a)return null;if(a instanceof W)return a;var b=!0;a=this.diagram;null!==a&&(b=a.isTreePathToChildren);a=this.$a.iterator;if(b)for(;a.next();){if(b=a.value,b.isTreeLink&&(b=b.fromNode,b!==this))return this.Eh=b}else for(;a.next();)if(b=a.value,b.isTreeLink&&(b=b.toNode,b!==this))return this.Eh=b;return this.Eh=null};t.gA=function(){function a(b,d){if(null!==b){d.add(b);var c=b.jj();null!==c&&(d.add(c),a(b.Fg(),d))}}var b=new G;a(this,b);return b};\nt.fA=function(){return ap(this,this)};function ap(a,b){b=b.Fg();return null===b?0:1+ap(a,b)}t.Hq=function(){var a=!0,b=this.diagram;null!==b&&(a=b.isTreePathToChildren);b=new ib(this.$a);var c=this;b.predicate=a?function(a){return a.isTreeLink&&a.fromNode===c?!0:!1}:function(a){return a.isTreeLink&&a.toNode===c?!0:!1};return b};\nt.Wv=function(){var a=!0,b=this.diagram;null!==b&&(a=b.isTreePathToChildren);var c=b=null,d=this.$a.iterator;if(a)for(;d.next();)a=d.value,a.isTreeLink&&a.fromNode===this&&(a=a.toNode,null!==b?b.add(a):null!==c&&c!==a?(b=new E,b.add(c),b.add(a)):c=a);else for(;d.next();)a=d.value,a.isTreeLink&&a.toNode===this&&(a=a.fromNode,null!==b?b.add(a):null!==c&&c!==a?(b=new E,b.add(c),b.add(a)):c=a);return null!==b?b.iterator:null!==c?new hb(c):db};\nt.hA=function(a){void 0===a&&(a=Infinity);var b=new G;Yk(b,this,!1,a,!0);return b};W.prototype.collapseTree=function(a){void 0===a&&(a=1);1>a&&(a=1);var b=this.diagram;if(null!==b&&!b.Le){b.Le=!0;var c=new G;c.add(this);bp(this,c,b.isTreePathToChildren,a,b,this,b.treeCollapsePolicy===ti);b.Le=!1}};function bp(a,b,c,d,e,f,g){if(1<d)for(var h=c?a.Fq():a.Hd();h.next();){var k=h.value;k.isTreeLink&&(k=k.Kq(a),null===k||k===a||b.contains(k)||(b.add(k),bp(k,b,c,d-1,e,f,g)))}else cp(a,b,c,e,f,g)}\nfunction cp(a,b,c,d,e,f){for(var g=e===a?!0:a.isTreeExpanded,h=c?a.Fq():a.Hd();h.next();){var k=h.value;if(k.isTreeLink&&(k=k.Kq(a),null!==k&&k!==a)){var l=b.contains(k);l||b.add(k);g&&(f&&d.jk(k,e),k.Oh(),k.Ob(!1));k.isTreeExpanded&&(k.wasTreeExpanded=k.isTreeExpanded,l||cp(k,b,c,d,e,f))}}a.isTreeExpanded=!1}\nW.prototype.expandTree=function(a){void 0===a&&(a=2);2>a&&(a=2);var b=this.diagram;if(null!==b&&!b.Le){b.Le=!0;var c=new G;c.add(this);dp(this,c,b.isTreePathToChildren,a,b,this,b.treeCollapsePolicy===ti);b.Le=!1}};\nfunction dp(a,b,c,d,e,f,g){for(var h=f===a?!1:a.isTreeExpanded,k=c?a.Fq():a.Hd();k.next();){var l=k.value;l.isTreeLink&&(h||l.ud||l.Ua(),l=l.Kq(a),null!==l&&l!==a&&!b.contains(l)&&(b.add(l),h||(l.Ob(!0),l.Oh(),g&&e.lk(l,f)),2<d||l.wasTreeExpanded))&&(l.wasTreeExpanded=!1,dp(l,b,c,d-1,e,f,g))}a.isTreeExpanded=!0}\nna.Object.defineProperties(W.prototype,{portSpreading:{get:function(){return this.zp},set:function(a){var b=this.zp;b!==a&&(this.zp=a,this.g(\"portSpreading\",b,a),a=this.diagram,null!==a&&a.undoManager.isUndoingRedoing||this.sd())}},avoidable:{get:function(){return 0!==(this.P&8)},set:function(a){var b=0!==(this.P&8);if(b!==a){this.P^=8;var c=this.diagram;null!==c&&Ck(c,this);this.g(\"avoidable\",b,a)}}},avoidableMargin:{\nget:function(){return this.cl},set:function(a){\"number\"===typeof a&&(a=new kc(a));var b=this.cl;if(!b.w(a)){this.cl=a=a.H();var c=this.diagram;null!==c&&Ck(c,this);this.g(\"avoidableMargin\",b,a)}}},linksConnected:{get:function(){return this.$a.iterator}},linkConnected:{get:function(){return this.Jo},set:function(a){var b=this.Jo;b!==a&&(this.Jo=a,this.g(\"linkConnected\",b,a))}},linkDisconnected:{get:function(){return this.Ko},\nset:function(a){var b=this.Ko;b!==a&&(this.Ko=a,this.g(\"linkDisconnected\",b,a))}},linkValidation:{get:function(){return this.Ii},set:function(a){var b=this.Ii;b!==a&&(this.Ii=a,this.g(\"linkValidation\",b,a))}},isLinkLabel:{get:function(){return null!==this.Kl}},labeledLink:{get:function(){return this.Kl},set:function(a){var b=this.Kl;if(b!==a){var c=this.diagram,d=this.data;if(null!==b){null!==b.nd&&(b.nd.remove(this),\nb.o());if(null!==c&&null!==d&&!c.undoManager.isUndoingRedoing){var e=b.data,f=c.model;if(null!==e&&f.qj()){var g=f.ja(d);void 0!==g&&f.Oy(e,g)}}this.containingGroup=null}this.Kl=a;null!==a&&(Zo(a,this),null===c||null===d||c.undoManager.isUndoingRedoing||(e=a.data,c=c.model,null!==e&&c.qj()&&(d=c.ja(d),void 0!==d&&c.Dv(e,d))),this.containingGroup=a.containingGroup);Il(this);this.g(\"labeledLink\",b,a)}}},port:{get:function(){return this.Jt(\"\")}},ports:{\nget:function(){null===this.tc&&$o(this);return this.tc.iteratorValues}},isTreeExpanded:{get:function(){return 0!==(this.P&1)},set:function(a){var b=0!==(this.P&1);if(b!==a){this.P^=1;var c=this.diagram;this.g(\"isTreeExpanded\",b,a);b=this.treeExpandedChanged;if(null!==b){var d=!0;null!==c&&(d=c.Z,c.Z=!0);b(this);null!==c&&(c.Z=d)}null!==c&&c.undoManager.isUndoingRedoing?this.Ob(a):a?this.expandTree():this.collapseTree()}}},wasTreeExpanded:{\nget:function(){return 0!==(this.P&2)},set:function(a){var b=0!==(this.P&2);b!==a&&(this.P^=2,this.g(\"wasTreeExpanded\",b,a))}},treeExpandedChanged:{get:function(){return this.nq},set:function(a){var b=this.nq;b!==a&&(this.nq=a,this.g(\"treeExpandedChanged\",b,a))}},isTreeLeaf:{get:function(){return 0!==(this.P&4)},set:function(a){var b=0!==(this.P&4);b!==a&&(this.P^=4,this.g(\"isTreeLeaf\",b,a))}}});W.prototype.expandTree=W.prototype.expandTree;\nW.prototype.collapseTree=W.prototype.collapseTree;W.prototype.findTreeParts=W.prototype.hA;W.prototype.findTreeChildrenNodes=W.prototype.Wv;W.prototype.findTreeChildrenLinks=W.prototype.Hq;W.prototype.findTreeLevel=W.prototype.fA;W.prototype.findTreeParentChain=W.prototype.gA;W.prototype.findTreeParentNode=W.prototype.Fg;W.prototype.findTreeParentLink=W.prototype.jj;W.prototype.findCommonTreeParent=W.prototype.Uz;W.prototype.findTreeRoot=W.prototype.iA;W.prototype.isInTreeOf=W.prototype.zA;\nW.prototype.findPort=W.prototype.Jt;W.prototype.findLinksTo=W.prototype.Yz;W.prototype.findLinksBetween=W.prototype.Xz;W.prototype.findNodesInto=W.prototype.Tv;W.prototype.findNodesOutOf=W.prototype.Uv;W.prototype.findNodesConnected=W.prototype.Sv;W.prototype.findLinksInto=W.prototype.Hd;W.prototype.findLinksOutOf=W.prototype.Fq;W.prototype.findExternalTreeLinksConnected=W.prototype.py;W.prototype.invalidateConnectedLinks=W.prototype.sd;W.prototype.invalidateLinkBundle=W.prototype.xA;\nvar ep=new D(W,\"SpreadingNone\",10),So=new D(W,\"SpreadingEvenly\",11),fp=new D(W,\"SpreadingPacked\",12);W.className=\"Node\";W.SpreadingNone=ep;W.SpreadingEvenly=So;W.SpreadingPacked=fp;function U(a){W.call(this,a);this.P|=4608;this.Vo=new G;this.Sl=new G;this.Sa=this.eq=this.Ki=this.Wo=this.Uo=this.Za=null;this.kc=new Ai;this.kc.group=this}ma(U,W);\nU.prototype.cloneProtected=function(a){W.prototype.cloneProtected.call(this,a);this.P=this.P&-32769;null!==this.Za&&(a.Za=this.Za.copy());a.Uo=this.Uo;a.Wo=this.Wo;a.Ki=this.Ki;a.eq=this.eq;var b=a.ym(function(a){return a instanceof xg});b instanceof xg?a.Sa=b:a.Sa=null;null!==this.kc?(a.kc=this.kc.copy(),a.kc.group=a):(null!==a.kc&&(a.kc.group=null),a.kc=null)};t=U.prototype;\nt.yf=function(a){W.prototype.yf.call(this,a);var b=a.yk();for(a=a.memberParts;a.next();){var c=a.value;c.o();c.B(8);c.nk();if(c instanceof W)c.sd(b);else if(c instanceof S)for(c=c.labelNodes;c.next();)c.value.sd(b)}};\nt.Sk=function(a,b,c,d,e,f,g){if(a===ze&&\"elements\"===b)if(e instanceof xg)null===this.Sa?this.Sa=e:this.Sa!==e&&B(\"Cannot insert a second Placeholder into the visual tree of a Group.\");else{if(e instanceof X){var h=e.ym(function(a){return a instanceof xg});h instanceof xg&&(null===this.Sa?this.Sa=h:this.Sa!==h&&B(\"Cannot insert a second Placeholder into the visual tree of a Group.\"))}}else a===Ae&&\"elements\"===b&&null!==this.Sa&&(d===this.Sa?this.Sa=null:d instanceof X&&this.Sa.Gg(d)&&(this.Sa=null));\nW.prototype.Sk.call(this,a,b,c,d,e,f,g)};t.Im=function(a,b){W.prototype.Im.call(this,a,b);this.isClipping&&this.type!==X.Spot&&(a=this.resizeObject,a instanceof X&&(a=a.tb()),null===this.Za&&(this.Za=new N),a.mj(this.Za),a instanceof Kf&&this.Za.Jc(-a.strokeWidth,-a.strokeWidth))};t.Ih=function(a,b,c,d){this.cf=this.Sa;W.prototype.Ih.call(this,a,b,c,d)};t.Ta=function(){var a=this;a.isSubGraphExpanded&&this.memberParts.each(function(b){!a.computesBoundsIncludingLinks&&b instanceof S||b.Ta()});W.prototype.Ta.call(this)};\nt.rj=function(){if(!W.prototype.rj.call(this))return!1;for(var a=this.memberParts;a.next();){var b=a.value;if(b instanceof W){if(b.isVisible()&&vj(b))return!1}else if(b instanceof S&&b.isVisible()&&vj(b)&&b.fromNode!==this&&b.toNode!==this)return!1}return!0};\nfunction Ko(a,b){if(a.Vo.add(b)){b instanceof U&&a.Sl.add(b);var c=a.memberAdded;if(null!==c){var d=!0,e=a.diagram;null!==e&&(d=e.Z,e.Z=!0);c(a,b);null!==e&&(e.Z=d)}a.isVisible()&&a.isSubGraphExpanded||b.Ob(!1)}b instanceof S&&!a.computesBoundsIncludingLinks||(b=a.Sa,null===b&&(b=a),b.o())}\nfunction Lo(a,b){if(a.Vo.remove(b)){b instanceof U&&a.Sl.remove(b);var c=a.memberRemoved;if(null!==c){var d=!0,e=a.diagram;null!==e&&(d=e.Z,e.Z=!0);c(a,b);null!==e&&(e.Z=d)}a.isVisible()&&a.isSubGraphExpanded||b.Ob(!0)}b instanceof S&&!a.computesBoundsIncludingLinks||(b=a.Sa,null===b&&(b=a),b.o())}t.uk=function(){if(0<this.Vo.count){var a=this.diagram;if(null!==a)for(var b=this.Vo.copy().iterator;b.next();)a.remove(b.value)}W.prototype.uk.call(this)};\nU.prototype.canAddMembers=function(a){var b=this.diagram;if(null===b)return!1;b=b.commandHandler;for(a=$k(a).iterator;a.next();)if(!b.isValidMember(this,a.value))return!1;return!0};U.prototype.addMembers=function(a,b){var c=this.diagram;if(null===c)return!1;c=c.commandHandler;var d=!0;for(a=$k(a).iterator;a.next();){var e=a.value;!b||c.isValidMember(this,e)?e.containingGroup=this:d=!1}return d};\nU.prototype.canUngroup=function(){if(!this.ungroupable)return!1;var a=this.layer;if(null!==a&&!a.allowUngroup)return!1;a=a.diagram;return null===a||a.allowUngroup?!0:!1};t=U.prototype;\nt.sd=function(a){void 0===a&&(a=null);var b=0!==(this.P&65536);W.prototype.sd.call(this,a);if(!b)for(0!==(this.P&65536)!==!0&&(this.P=this.P^65536),b=this.Rv();b.next();){var c=b.value;if(null===a||!a.contains(c)){var d=c.fromNode;null!==d&&d!==this&&d.Kd(this)&&!d.isVisible()?(Vo(c.fromPort),Vo(c.toPort),c.Ua()):(d=c.toNode,null!==d&&d!==this&&d.Kd(this)&&!d.isVisible()&&(Vo(c.fromPort),Vo(c.toPort),c.Ua()))}}};\nt.Rv=function(){var a=this.yk();a.add(this);for(var b=new G,c=a.iterator;c.next();){var d=c.value;if(d instanceof W)for(d=d.linksConnected;d.next();){var e=d.value;a.contains(e)||b.add(e)}}return b.iterator};t.Wz=function(){var a=this.yk();a.add(this);for(var b=new G,c=a.iterator;c.next();){var d=c.value;if(d instanceof W)for(d=d.linksConnected;d.next();){var e=d.value,f=e.fromNode;null===f||a.contains(f)&&f!==this||b.add(f);e=e.toNode;null===e||a.contains(e)&&e!==this||b.add(e)}}return b.iterator};\nt.Vz=function(){function a(b,d){null!==b&&(d.add(b),a(b.containingGroup,d))}var b=new G;a(this,b);return b};t.yk=function(){var a=new G;Yk(a,this,!0,0,!0);a.remove(this);return a};t.Ob=function(a){W.prototype.Ob.call(this,a);for(var b=this.memberParts;b.next();)b.value.Ob(a)};U.prototype.collapseSubGraph=function(){var a=this.diagram;if(null!==a&&!a.Le){a.Le=!0;var b=this.yk();gp(this,b,a,this);a.Le=!1}};\nfunction gp(a,b,c,d){for(var e=a.memberParts;e.next();){var f=e.value;f.Ob(!1);f instanceof U&&f.isSubGraphExpanded&&(f.wasSubGraphExpanded=f.isSubGraphExpanded,gp(f,b,c,d));if(f instanceof W)f.sd(b),c.jk(f,d);else if(f instanceof S)for(f=f.labelNodes;f.next();)f.value.sd(b)}a.isSubGraphExpanded=!1}U.prototype.expandSubGraph=function(){var a=this.diagram;if(null!==a&&!a.Le){a.Le=!0;var b=this.yk();hp(this,b,a,this);a.Le=!1}};\nfunction hp(a,b,c,d){for(var e=a.memberParts;e.next();){var f=e.value;f.Ob(!0);f instanceof U&&f.wasSubGraphExpanded&&(f.wasSubGraphExpanded=!1,hp(f,b,c,d));if(f instanceof W)f.sd(b),c.lk(f,d);else if(f instanceof S)for(f=f.labelNodes;f.next();)f.value.sd(b)}a.isSubGraphExpanded=!0}\nU.prototype.move=function(a,b){void 0===b&&(b=!1);var c=b?this.location:this.position,d=c.x;c=c.y;var e=a.x,f=a.y;if(!(d===e||isNaN(d)&&isNaN(e))||!(c===f||isNaN(c)&&isNaN(f))){d=e-(isNaN(d)?0:d);c=f-(isNaN(c)?0:c);f=J.alloc();W.prototype.move.call(this,a,b);a=new G;for(b=this.yk().iterator;b.next();)if(e=b.value,e instanceof S&&(e.suspendsRouting&&a.add(e),e.ud||e.fromNode!==this&&e.toNode!==this))e.suspendsRouting=!0;for(b.reset();b.next();)if(e=b.value,!(e.Ph()||e instanceof W&&e.isLinkLabel)){var g=\ne.position,h=e.location;g.s()?(f.x=g.x+d,f.y=g.y+c,e.position=f):h.s()&&(f.x=h.x+d,f.y=h.y+c,e.location=f)}for(b.reset();b.next();)if(e=b.value,e instanceof S&&(e.suspendsRouting=a.contains(e),e.ud||e.fromNode!==this&&e.toNode!==this))g=e.position,f.x=g.x+d,f.y=g.y+c,f.s()?e.move(f):e.Ua(),Sj(e)&&e.Ua();J.free(f)}};\nna.Object.defineProperties(U.prototype,{placeholder:{get:function(){return this.Sa}},computesBoundsAfterDrag:{get:function(){return 0!==(this.P&2048)},set:function(a){var b=0!==(this.P&2048);b!==a&&(this.P^=2048,this.g(\"computesBoundsAfterDrag\",b,a))}},computesBoundsIncludingLinks:{get:function(){return 0!==(this.P&4096)},set:function(a){var b=0!==(this.P&4096);b!==a&&(this.P^=4096,this.g(\"computesBoundsIncludingLinks\",\nb,a))}},computesBoundsIncludingLocation:{get:function(){return 0!==(this.P&8192)},set:function(a){var b=0!==(this.P&8192);b!==a&&(this.P^=8192,this.g(\"computesBoundsIncludingLocation\",b,a))}},handlesDragDropForMembers:{get:function(){return 0!==(this.P&16384)},set:function(a){var b=0!==(this.P&16384);b!==a&&(this.P^=16384,this.g(\"handlesDragDropForMembers\",b,a))}},memberParts:{get:function(){return this.Vo.iterator}},\nlayout:{get:function(){return this.kc},set:function(a){var b=this.kc;if(b!==a){null!==b&&(b.diagram=null,b.group=null);this.kc=a;var c=this.diagram;null!==a&&(a.diagram=c,a.group=this);null!==c&&(c.Ng=!0);this.g(\"layout\",b,a);null!==c&&c.Db()}}},memberAdded:{get:function(){return this.Uo},set:function(a){var b=this.Uo;b!==a&&(this.Uo=a,this.g(\"memberAdded\",b,a))}},memberRemoved:{get:function(){return this.Wo},\nset:function(a){var b=this.Wo;b!==a&&(this.Wo=a,this.g(\"memberRemoved\",b,a))}},memberValidation:{get:function(){return this.Ki},set:function(a){var b=this.Ki;b!==a&&(this.Ki=a,this.g(\"memberValidation\",b,a))}},ungroupable:{get:function(){return 0!==(this.P&256)},set:function(a){var b=0!==(this.P&256);b!==a&&(this.P^=256,this.g(\"ungroupable\",b,a))}},isSubGraphExpanded:{get:function(){return 0!==(this.P&512)},\nset:function(a){var b=0!==(this.P&512);if(b!==a){this.P^=512;var c=this.diagram;this.g(\"isSubGraphExpanded\",b,a);b=this.subGraphExpandedChanged;if(null!==b){var d=!0;null!==c&&(d=c.Z,c.Z=!0);b(this);null!==c&&(c.Z=d)}null!==c&&c.undoManager.isUndoingRedoing?(null!==this.Sa&&this.Sa.o(),this.memberParts.each(function(a){a.updateAdornments()})):a?this.expandSubGraph():this.collapseSubGraph()}}},wasSubGraphExpanded:{get:function(){return 0!==(this.P&1024)},set:function(a){var b=\n0!==(this.P&1024);b!==a&&(this.P^=1024,this.g(\"wasSubGraphExpanded\",b,a))}},subGraphExpandedChanged:{get:function(){return this.eq},set:function(a){var b=this.eq;b!==a&&(this.eq=a,this.g(\"subGraphExpandedChanged\",b,a))}},Rh:{get:function(){return 0!==(this.P&32768)},set:function(a){0!==(this.P&32768)!==a&&(this.P^=32768)}}});U.prototype.expandSubGraph=U.prototype.expandSubGraph;U.prototype.collapseSubGraph=U.prototype.collapseSubGraph;\nU.prototype.findSubGraphParts=U.prototype.yk;U.prototype.findContainingGroupChain=U.prototype.Vz;U.prototype.findExternalNodesConnected=U.prototype.Wz;U.prototype.findExternalLinksConnected=U.prototype.Rv;U.prototype.ensureBounds=U.prototype.Ta;U.className=\"Group\";function xg(){Y.call(this);this.ib=qc;this.Np=new N(NaN,NaN,NaN,NaN)}ma(xg,Y);xg.prototype.cloneProtected=function(a){Y.prototype.cloneProtected.call(this,a);a.ib=this.ib.H();a.Np=this.Np.copy()};\nxg.prototype.Kh=function(a){if(null===this.background&&null===this.areaBackground)return!1;var b=this.naturalBounds;return cc(0,0,b.width,b.height,a.x,a.y)};\nxg.prototype.Hm=function(){var a=this.part;null!==a&&(a instanceof U||a instanceof Je)||B(\"Placeholder is not inside a Group or Adornment.\");if(a instanceof U){var b=this.computeBorder(this.Np),c=this.minSize,d=this.rc;Sb(d,(isFinite(c.width)?Math.max(c.width,b.width):b.width)||0,(isFinite(c.height)?Math.max(c.height,b.height):b.height)||0);nl(this,0,0,d.width,d.height);d=a.memberParts;for(c=!1;d.next();)if(d.value.isVisible()){c=!0;break}d=a.diagram;!c||null===d||d.animationManager.ew(a)||isNaN(b.x)||\nisNaN(b.y)||(c=J.alloc(),c.tj(b,a.locationSpot),c.w(a.location)||(a.location=new J(c.x,c.y)),J.free(c))}else{b=this.rc;c=this.ib;d=c.left+c.right;var e=c.top+c.bottom,f=a.adornedObject;a.angle=f.lj();var g=0;f instanceof Kf&&(g=f.strokeWidth);var h=f.Af(),k=f.naturalBounds,l=(k.width+g)*h;g=(k.height+g)*h;a.type!==X.Link&&(f=f.da(\"Selection\"===a.category?tc:a.locationSpot,J.alloc()),a.location=f,J.free(f));isNaN(l)||isNaN(g)?(a=a.adornedObject,l=a.da(tc,J.alloc()),f=N.allocAt(l.x,l.y,0,0),f.Oe(a.da(Dc,\nl)),f.Oe(a.da(vc,l)),f.Oe(a.da(Bc,l)),Sb(b,f.width+d||0,f.height+e||0),nl(this,-c.left,-c.top,b.width,b.height),J.free(l),N.free(f)):(Sb(b,l+d||0,g+e||0),nl(this,-c.left,-c.top,b.width,b.height))}};xg.prototype.Ih=function(a,b,c,d){this.actualBounds.h(a,b,c,d)};\nxg.prototype.computeBorder=function(a){var b=this.part,c=b.diagram;if(null!==c&&b instanceof U&&!b.layer.isTemporary&&b.computesBoundsAfterDrag&&this.Np.s()){var d=c.toolManager.findTool(\"Dragging\");if(d===c.currentTool&&(c=d.computeBorder(b,this.Np,a),null!==c))return c}c=N.alloc();d=this.computeMemberBounds(c);var e=this.ib;b instanceof U&&!b.isSubGraphExpanded?a.h(d.x-e.left,d.y-e.top,0,0):a.h(d.x-e.left,d.y-e.top,Math.max(d.width+e.left+e.right,0),Math.max(d.height+e.top+e.bottom,0));N.free(c);\nb instanceof U&&b.computesBoundsIncludingLocation&&b.location.s()&&a.Oe(b.location);return a};\nxg.prototype.computeMemberBounds=function(a){if(!(this.part instanceof U))return a.h(0,0,0,0),a;for(var b=this.part,c=Infinity,d=Infinity,e=-Infinity,f=-Infinity,g=b.memberParts;g.next();){var h=g.value;if(h.isVisible()){if(h instanceof S){if(!b.computesBoundsIncludingLinks)continue;if(uj(h))continue;if(h.fromNode===b||h.toNode===b)continue}h=h.actualBounds;h.left<c&&(c=h.left);h.top<d&&(d=h.top);h.right>e&&(e=h.right);h.bottom>f&&(f=h.bottom)}}isFinite(c)&&isFinite(d)?a.h(c,d,e-c,f-d):(b=b.location,\na.h(b.x,b.y,0,0));return a};na.Object.defineProperties(xg.prototype,{padding:{get:function(){return this.ib},set:function(a){\"number\"===typeof a&&(a=new kc(a));var b=this.ib;b.w(a)||(this.ib=a=a.H(),this.g(\"padding\",b,a),this.o())}}});xg.className=\"Placeholder\";\nfunction S(){V.call(this,X.Link);this.Ga=8;this.We=null;this.Xe=\"\";this.rf=this.fo=null;this.sf=\"\";this.mq=null;this.Yk=ag;this.Hn=0;this.Jn=ag;this.Kn=NaN;this.ck=ip;this.Zp=.5;this.nd=null;this.Ab=(new E).freeze();this.jf=this.ph=null;this.Yl=new N;this.na=new rd;this.I=this.u=this.Mf=this.Vf=null;this.l=[];this.vv=new J;this.$r=this.Nx=this.Mx=null;this.Ru=NaN;this.O=null}ma(S,V);\nS.prototype.cloneProtected=function(a){V.prototype.cloneProtected.call(this,a);a.Ga=this.Ga&-113;a.Xe=this.Xe;a.fo=this.fo;a.sf=this.sf;a.mq=this.mq;a.Yk=this.Yk;a.Hn=this.Hn;a.Jn=this.Jn;a.Kn=this.Kn;a.ck=this.ck;a.Zp=this.Zp;null!==this.O&&(a.O=this.O.copy())};t=S.prototype;t.yf=function(a){V.prototype.yf.call(this,a);this.Xe=a.Xe;this.sf=a.sf;a.ph=null;a.Ua();a.Mf=this.Mf;var b=a.fromPort;null!==b&&Vo(b);a=a.toPort;null!==a&&Vo(a)};\nt.jb=function(a){a.classType===S?2===(a.value&2)?this.routing=a:a===dg||a===$f||a===Zf?this.curve=a:a===jp||a===kp||a===lp?this.adjusting=a:a!==ip&&a!==ag&&B(\"Unknown Link enum value for a Link property: \"+a):V.prototype.jb.call(this,a)};t.Kc=function(){null===this.O&&(this.O=new jl)};t.rj=function(){var a=this.fromNode;if(null!==a){var b=a.findVisibleNode();null!==b&&(a=b);if(vj(a)||wj(a))return!1}a=this.toNode;return null!==a&&(b=a.findVisibleNode(),null!==b&&(a=b),vj(a)||wj(a))?!1:!0};t.Ew=function(){return!1};\nt.lu=function(){};t.Nc=function(){return!1};S.prototype.computeAngle=function(a,b,c){return S.computeAngle(b,c)};S.computeAngle=function(a,b){switch(a){default:case ag:a=0;break;case Zm:a=b;break;case Sm:a=b+90;break;case Um:a=b-90;break;case mp:a=b+180;break;case $m:a=L.Tq(b);90<a&&270>a&&(a-=180);break;case Tm:a=L.Tq(b+90);90<a&&270>a&&(a-=180);break;case Vm:a=L.Tq(b-90);90<a&&270>a&&(a-=180);break;case Wm:a=L.Tq(b);if(45<a&&135>a||225<a&&315>a)return 0;90<a&&270>a&&(a-=180)}return L.Tq(a)};\nfunction Qo(a){var b=a.fromNode,c=a.toNode,d=null;null!==b?d=null!==c?b.oy(c):b.containingGroup:null!==c?d=c.containingGroup:d=null;b=d;c=a.mi;if(c!==b){null!==c&&Lo(c,a);a.mi=b;null!==b&&Ko(b,a);var e=a.containingGroupChanged;if(null!==e){var f=!0,g=a.diagram;null!==g&&(f=g.Z,g.Z=!0);e(a,c,b);null!==g&&(g.Z=f)}!a.ud||a.Mx!==c&&a.Nx!==c||a.Ua()}if(a.isLabeledLink)for(a=a.labelNodes;a.next();)a.value.containingGroup=d}t=S.prototype;\nt.Oh=function(){var a=this.containingGroup;null!==a&&this.fromNode!==a&&this.toNode!==a&&a.computesBoundsIncludingLinks&&V.prototype.Oh.call(this)};t.Kq=function(a){var b=this.fromNode;return a===b?this.toNode:b};t.nA=function(a){var b=this.fromPort;return a===b?this.toPort:b};function Zo(a,b){null===a.nd&&(a.nd=new G);a.nd.add(b);a.o()}\nt.Mq=function(a){V.prototype.Mq.call(this,a);np(this)&&this.Oq(this.actualBounds);if(!a){a=this.We;var b=null;null!==a&&(b=this.fromPort,Xo(a,this,b));var c=this.rf;if(null!==c){var d=this.toPort;c===a&&d===b||Xo(c,this,d)}op(this)}};t.Nq=function(a){V.prototype.Nq.call(this,a);np(this)&&this.Oq(this.actualBounds);if(!a){a=this.We;var b=null;null!==a&&(b=this.fromPort,Yo(a,this,b));var c=this.rf;if(null!==c){var d=this.toPort;c===a&&d===b||Yo(c,this,d)}pp(this)}};\nt.uk=function(){this.ud=!0;if(null!==this.nd){var a=this.diagram;if(null!==a)for(var b=this.nd.copy().iterator;b.next();)a.remove(b.value)}null!==this.data&&(a=this.diagram,null!==a&&a.partManager.removeDataForLink(this))};S.prototype.updateRelationshipsFromData=function(){if(null!==this.data){var a=this.diagram;null!==a&&a.partManager.updateRelationshipsFromData(this)}};\nS.prototype.move=function(a,b){var c=b?this.location:this.position,d=c.x;isNaN(d)&&(d=0);var e=c.y;isNaN(e)&&(e=0);d=a.x-d;e=a.y-e;!0===b?V.prototype.move.call(this,a,!1):(a=J.allocAt(c.x+d,c.y+e),V.prototype.move.call(this,a,!1),J.free(a));rf(this,d,e);for(a=this.labelNodes;a.next();)b=a.value,c=b.position,b.moveTo(c.x+d,c.y+e)};\nS.prototype.canRelinkFrom=function(){if(!this.relinkableFrom)return!1;var a=this.layer;if(null===a)return!0;if(!a.allowRelink)return!1;a=a.diagram;return null===a||a.allowRelink?!0:!1};S.prototype.canRelinkTo=function(){if(!this.relinkableTo)return!1;var a=this.layer;if(null===a)return!0;if(!a.allowRelink)return!1;a=a.diagram;return null===a||a.allowRelink?!0:!1};\nS.prototype.computeMidPoint=function(a){var b=this.pointsCount;if(0===b)return a.assign(Hb),a;if(1===b)return a.assign(this.i(0)),a;if(2===b){var c=this.i(0),d=this.i(1);a.h((c.x+d.x)/2,(c.y+d.y)/2);return a}if(this.isOrthogonal&&(15<=this.computeCorner()||this.computeCurve()===dg))return this.na.Xv(.5,a),a.add(this.i(0)),c=this.na.figures.first(),a.offset(-c.startX,-c.startY),a;if(this.computeCurve()===dg){if(3===b)return this.i(1);d=(b-1)/3|0;c=3*(d/2|0);if(1===d%2){d=this.i(c);var e=this.i(c+1),\nf=this.i(c+2);c=this.i(c+3);L.yz(d.x,d.y,e.x,e.y,f.x,f.y,c.x,c.y,a)}else a.assign(this.i(c));return a}var g=this.flattenedLengths;c=this.flattenedTotalLength;for(e=f=d=0;d<c/2&&f<b;){e=g[f];if(d+e>c/2)break;d+=e;f++}b=this.i(f);f=this.i(f+1);1>Math.abs(b.x-f.x)?b.y>f.y?a.h(b.x,b.y-(c/2-d)):a.h(b.x,b.y+(c/2-d)):1>Math.abs(b.y-f.y)?b.x>f.x?a.h(b.x-(c/2-d),b.y):a.h(b.x+(c/2-d),b.y):(c=(c/2-d)/e,a.h(b.x+c*(f.x-b.x),b.y+c*(f.y-b.y)));return a};\nS.prototype.computeMidAngle=function(){var a=this.pointsCount;if(2>a)return NaN;if(2===a)return this.i(0).Pa(this.i(1));if(this.isOrthogonal&&(15<=this.computeCorner()||this.computeCurve()===dg))return this.na.vy(.5);if(this.computeCurve()===dg&&4<=a){var b=(a-1)/3|0,c=3*(b/2|0);if(1===b%2){c=Math.floor(c);a=this.i(c);b=this.i(c+1);var d=this.i(c+2);c=this.i(c+3);return L.xz(a.x,a.y,b.x,b.y,d.x,d.y,c.x,c.y)}if(0<c&&c+1<a)return this.i(c-1).Pa(this.i(c+1))}b=this.flattenedLengths;d=this.flattenedTotalLength;\nvar e=0;c=0;for(var f;e<d/2&&c<a;){f=b[c];if(e+f>d/2)break;e+=f;c++}b=this.i(c);d=this.i(c+1);if(1>Math.abs(b.x-d.x)&&1>Math.abs(b.y-d.y)){if(0<c&&c+2<a)return this.i(c-1).Pa(this.i(c+2))}else{if(1>Math.abs(b.x-d.x))return b.y>d.y?270:90;if(1>Math.abs(b.y-d.y))return b.x>d.x?180:0}return b.Pa(d)};t=S.prototype;t.i=function(a){return this.Ab.j[a]};t.Qc=function(a,b){this.Ab.Pc(a,b)};t.L=function(a,b,c){this.Ab.Pc(a,new J(b,c))};t.wA=function(a,b){this.Ab.wb(a,b)};\nt.m=function(a,b,c){this.Ab.wb(a,new J(b,c))};t.ce=function(a){this.Ab.add(a)};t.vf=function(a,b){this.Ab.add(new J(a,b))};t.uw=function(a){this.Ab.cb(a)};t.pk=function(){this.Ab.clear()};\nfunction rf(a,b,c){if(0!==b||0!==c)if(0===a.pointsCount)a.defaultFromPoint&&a.defaultFromPoint.copy().offset(b,c),a.defaultToPoint&&a.defaultToPoint.copy().offset(b,c);else{for(var d=a.ud,e=new E,f=a.Ab.iterator;f.next();){var g=f.value;e.add((new J(g.x+b,g.y+c)).freeze())}e.freeze();f=a.Ab;a.Ab=e;g=a.diagram;isNaN(b)||isNaN(c)||null!==g&&g.animationManager.sc?a.o():(a.dg.h(a.dg.x+b,a.dg.y+c),a.la.h(a.la.x+b,a.la.y+c),Il(a));d?qp(a):(a.defaultFromPoint&&(a.defaultFromPoint=a.i(0)),a.defaultToPoint&&\n(a.defaultToPoint=a.i(a.pointsCount-1)));null!==g&&g.animationManager.sc&&(b=g.animationManager,a.jf=e,b.$l.add(a));a.g(\"points\",f,e)}}t.Th=function(){null===this.ph&&(this.ph=this.Ab,this.Ab=this.Ab.copy())};\nt.xf=function(){if(null!==this.ph){for(var a=this.ph,b=this.Ab,c=Infinity,d=Infinity,e=a.j,f=e.length,g=0;g<f;g++){var h=e[g];c=Math.min(h.x,c);d=Math.min(h.y,d)}h=g=Infinity;for(var k=b.j,l=k.length,m=0;m<l;m++){var n=k[m];g=Math.min(n.x,g);h=Math.min(n.y,h);n.freeze()}b.freeze();if(l===f)for(f=0;f<l;f++){if(m=e[f],n=k[f],m.x-c!==n.x-g||m.y-d!==n.y-h){this.dc();break}}else this.dc();this.ph=null;c=this.diagram;null!==c&&c.animationManager.sc&&(c=c.animationManager,this.jf=b,c.$l.add(this));qp(this);\nthis.g(\"points\",a,b)}};t.yw=function(){null!==this.ph&&(this.Ab=this.ph,this.ph=null)};function qp(a){0===a.Ab.count?a.ud=!1:(a.ud=!0,a.$r=null,a.Ru=NaN,a.defaultFromPoint=a.i(0),a.defaultToPoint=a.i(a.pointsCount-1),rp(a,!1))}\nt.Ua=function(){if(!this.suspendsRouting){var a=this.diagram;if(a){if(a.Yt.contains(this)||a.undoManager.isUndoingRedoing)return;a=a.animationManager;if(a.isTicking&&!a.isAnimating)return;null!==this.jf&&!a.isTicking&&a.isAnimating&&(this.jf=null)}a=this.path;null!==a&&(this.ud=!1,this.o(),a.o())}};t.xj=function(){if(!this.ud&&!this.Ct){var a=!0;try{this.Ct=!0,this.Th(),a=this.computePoints()}catch(b){this.Ct=!1,this.yw()}finally{this.Ct=!1,a?this.xf():this.yw()}}};\nS.prototype.computePoints=function(){if(null===this.diagram)return!1;var a=this.fromNode,b=null;null===a?(sp||(sp=new W,sp.desiredSize=Ib,sp.Ta()),this.defaultFromPoint&&(sp.location=this.defaultFromPoint,sp.Ta(),b=a=sp)):b=this.fromPort;if(null!==b&&!a.isVisible()){var c=a.findVisibleNode();null!==c&&c!==a?(a=c,b=c.port):a=c}this.Mx=a;if(null===a||!a.location.s())return!1;for(;!(null===b||b.actualBounds.s()&&b.Gf());)b=b.panel;if(null===b)return!1;var d=this.toNode,e=null;null===d?(tp||(tp=new W,\ntp.desiredSize=Ib,tp.Ta()),this.defaultToPoint&&(tp.location=this.defaultToPoint,tp.Ta(),e=d=tp)):e=this.toPort;null===e||d.isVisible()||(c=d.findVisibleNode(),null!==c&&c!==d?(d=c,e=c.port):d=c);this.Nx=d;if(null===d||!d.location.s())return!1;for(;!(null===e||e.actualBounds.s()&&e.Gf());)e=e.panel;if(null===e)return!1;var f=this.pointsCount,g=this.computeSpot(!0,b);c=this.computeSpot(!1,e);var h=up(g),k=up(c),l=b===e&&null!==b,m=this.isOrthogonal,n=this.curve===dg;this.Vf=l&&!m?n=!0:!1;var p=this.computeAdjusting()===\nag||l;if(!m&&!l&&h&&k){if(h=!1,!p&&3<=f&&(p=this.getLinkPoint(a,b,g,!0,!1,d,e),k=this.getLinkPoint(d,e,c,!1,!1,a,b),h=this.adjustPoints(0,p,f-1,k))&&(p=this.getLinkPoint(a,b,g,!0,!1,d,e),k=this.getLinkPoint(d,e,c,!1,!1,a,b),this.adjustPoints(0,p,f-1,k)),!h)if(this.pk(),n){f=this.getLinkPoint(a,b,g,!0,!1,d,e);p=this.getLinkPoint(d,e,c,!1,!1,a,b);h=p.x-f.x;k=p.y-f.y;l=this.computeCurviness();n=m=0;var r=f.x+h/3,q=f.y+k/3,u=r,w=q;L.A(k,0)?w=0<h?w-l:w+l:(m=-h/k,n=Math.sqrt(l*l/(m*m+1)),0>l&&(n=-n),u=\n(0>k?-1:1)*n+r,w=m*(u-r)+q);r=f.x+2*h/3;q=f.y+2*k/3;var v=r,y=q;L.A(k,0)?y=0<h?y-l:y+l:(v=(0>k?-1:1)*n+r,y=m*(v-r)+q);this.pk();this.ce(f);this.vf(u,w);this.vf(v,y);this.ce(p);this.Qc(0,this.getLinkPoint(a,b,g,!0,!1,d,e));this.Qc(3,this.getLinkPoint(d,e,c,!1,!1,a,b))}else if(f=d,p=e,d=this.getLinkPoint(a,b,g,!0,!1,f,p),e=this.getLinkPoint(f,p,c,!1,!1,a,b),this.hasCurviness())p=e.x-d.x,c=e.y-d.y,g=this.computeCurviness(),a=d.x+p/2,b=d.y+c/2,f=a,h=b,L.A(c,0)?h=0<p?h-g:h+g:(p=-p/c,f=Math.sqrt(g*g/(p*\np+1)),0>g&&(f=-f),f=(0>c?-1:1)*f+a,h=p*(f-a)+b),this.ce(d),this.vf(f,h),this.ce(e);else{this.ce(d);this.ce(e);h=N.alloc();b.mj(h);k=h.$(e);p.mj(h);l=h.$(d);if(k||l)g=b.da(vp(g),new J),this.Qc(0,this.getLinkPointFromPoint(a,b,g,e,!0,g)),c=p.da(vp(c),new J),this.Qc(1,this.getLinkPointFromPoint(f,p,c,d,!1,c));N.free(h)}}else{n=this.isAvoiding;p&&(m&&n||l)&&this.pk();var z=l?this.computeCurviness():0;n=this.getLinkPoint(a,b,g,!0,m,d,e);r=u=q=0;if(m||!h||l)w=this.computeEndSegmentLength(a,b,g,!0),r=this.getLinkDirection(a,\nb,n,g,!0,m,d,e),l&&(h||g.w(c)||!m&&1===g.x+c.x&&1===g.y+c.y)&&(r-=m?90:30,0>z&&(r-=180)),0>r?r+=360:360<=r&&(r-=360),l&&(w+=Math.abs(z)*(m?1:2)),0===r?q=w:90===r?u=w:180===r?q=-w:270===r?u=-w:(q=w*Math.cos(r*Math.PI/180),u=w*Math.sin(r*Math.PI/180)),g.nc()&&l&&(w=b.da(zc,J.alloc()),v=J.allocAt(w.x+1E3*q,w.y+1E3*u),this.getLinkPointFromPoint(a,b,w,v,!0,n),J.free(w),J.free(v));w=this.getLinkPoint(d,e,c,!1,m,a,b);var A=y=v=0;if(m||!k||l){var C=this.computeEndSegmentLength(d,e,c,!1);A=this.getLinkDirection(d,\ne,w,c,!1,m,a,b);l&&(k||g.w(c)||!m&&1===g.x+c.x&&1===g.y+c.y)&&(A+=m?0:30,0>z&&(A+=180));0>A?A+=360:360<=A&&(A-=360);l&&(C+=Math.abs(z)*(m?1:2));0===A?v=C:90===A?y=C:180===A?v=-C:270===A?y=-C:(v=C*Math.cos(A*Math.PI/180),y=C*Math.sin(A*Math.PI/180));c.nc()&&l&&(c=e.da(zc,J.alloc()),g=J.allocAt(c.x+1E3*v,c.y+1E3*y),this.getLinkPointFromPoint(d,e,c,g,!1,w),J.free(c),J.free(g))}c=n;if(m||!h||l)c=new J(n.x+q,n.y+u);g=w;if(m||!k||l)g=new J(w.x+v,w.y+y);!p&&!m&&h&&3<f&&this.adjustPoints(0,n,f-2,g)?this.Qc(f-\n1,w):!p&&!m&&k&&3<f&&this.adjustPoints(1,c,f-1,w)?this.Qc(0,n):!p&&(m?6<=f:4<f)&&this.adjustPoints(1,c,f-2,g)?(this.Qc(0,n),this.Qc(f-1,w)):(this.pk(),this.ce(n),(m||!h||l)&&this.ce(c),m&&this.addOrthoPoints(c,r,g,A,a,d),(m||!k||l)&&this.ce(g),this.ce(w))}return!0};function wp(a,b){Math.abs(b.x-a.x)>Math.abs(b.y-a.y)?(b.x>=a.x?b.x=a.x+9E9:b.x=a.x-9E9,b.y=a.y):(b.y>=a.y?b.y=a.y+9E9:b.y=a.y-9E9,b.x=a.x);return b}\nS.prototype.getLinkPointFromPoint=function(a,b,c,d,e,f){void 0===f&&(f=new J);if(null===a||null===b)return f.assign(c),f;a.isVisible()||(e=a.findVisibleNode(),null!==e&&e!==a&&(b=e.port));a=null;e=b.panel;null===e||e.he()||(e=e.panel);if(null===e){e=d.x;d=d.y;var g=c.x;c=c.y}else{a=e.Fd;e=1/(a.m11*a.m22-a.m12*a.m21);g=a.m22*e;var h=-a.m12*e,k=-a.m21*e,l=a.m11*e,m=e*(a.m21*a.dy-a.m22*a.dx),n=e*(a.m12*a.dx-a.m11*a.dy);e=d.x*g+d.y*k+m;d=d.x*h+d.y*l+n;g=c.x*g+c.y*k+m;c=c.x*h+c.y*l+n}b.zk(e,d,g,c,f);null!==\na&&f.transform(a);return f};function xp(a,b){var c=b.yp;null===c&&(c=new yp,c.port=b,c.node=b.part,b.yp=c);return zp(c,a)}\nS.prototype.getLinkPoint=function(a,b,c,d,e,f,g,h){void 0===h&&(h=new J);if(c.kb()&&!up(c))return b.da(c,h),h;if(c.Oc()){var k=xp(this,b);if(null!==k){h.assign(k.Qq);if(e&&this.routing===Ap){var l=xp(this,g);if(null!==l&&k.wm<l.wm){k=J.alloc();l=J.alloc();var m=new N(b.da(tc,k),b.da(Dc,l)),n=this.computeSpot(!d,g);a=this.getLinkPoint(f,g,n,!d,e,a,b,l);(c.Ef(Gc)||c.Ef(Hc))&&a.y>=m.y&&a.y<=m.y+m.height?h.y=a.y:(c.Ef(Ec)||c.Ef(Ic))&&a.x>=m.x&&a.x<=m.x+m.width&&(h.x=a.x);J.free(k);J.free(l)}}return h}}c=\nb.da(vp(c),J.alloc());this.pointsCount>(e?6:2)?(g=d?this.i(1):this.i(this.pointsCount-2),e&&(g=wp(c,g.copy()))):(k=this.computeSpot(!d,g),f=J.alloc(),g=g.da(vp(k),f),e&&(g=wp(c,g)),J.free(f));this.getLinkPointFromPoint(a,b,c,g,d,h);J.free(c);return h};\nS.prototype.getLinkDirection=function(a,b,c,d,e,f,g,h){a:if(d.kb())var k=d.x>d.y?d.x>1-d.y?0:d.x<1-d.y?270:315:d.x<d.y?d.x>1-d.y?90:d.x<1-d.y?180:135:.5>d.x?225:.5<d.x?45:0;else{if(d.Oc()&&(k=xp(this,b),null!==k))switch(k.Ac){case 1:k=270;break a;case 2:k=180;break a;default:case 4:k=0;break a;case 8:k=90;break a}k=b.da(zc,J.alloc());this.pointsCount>(f?6:2)?(h=e?this.i(1):this.i(this.pointsCount-2),h=f?wp(k,h.copy()):c):(c=J.alloc(),h=h.da(zc,c),J.free(c));c=Math.abs(h.x-k.x)>Math.abs(h.y-k.y)?h.x>=\nk.x?0:180:h.y>=k.y?90:270;J.free(k);k=c}d.nc()&&g.Kd(a)&&(k+=180,360<=k&&(k-=360));if(up(d))return k;a=b.lj();if(0===a)return k;45<=a&&135>a?k+=90:135<=a&&225>a?k+=180:225<=a&&315>a&&(k+=270);360<=k&&(k-=360);return k};S.prototype.computeEndSegmentLength=function(a,b,c,d){if(null!==b&&c.Oc()&&(a=xp(this,b),null!==a))return a.Pv;a=d?this.fromEndSegmentLength:this.toEndSegmentLength;null!==b&&isNaN(a)&&(a=d?b.fromEndSegmentLength:b.toEndSegmentLength);isNaN(a)&&(a=10);return a};\nS.prototype.computeSpot=function(a,b){void 0===b&&(b=null);a?(a=b?b:this.fromPort,null===a?a=zc:(b=this.fromSpot,b.Mb()&&(b=a.fromSpot),a=b===Vc?sc:b)):(a=b?b:this.toPort,null===a?a=zc:(b=this.toSpot,b.Mb()&&(b=a.toSpot),a=b===Vc?sc:b));return a};function up(a){return a===sc||.5===a.x&&.5===a.y}function vp(a){return.5===a.x&&.5===a.y?a:zc}\nS.prototype.computeOtherPoint=function(a,b){if(this.computeAdjusting()!==ag&&4<this.pointsCount)return this.computeMidPoint(new J);a=b.yp;a=null!==a?zp(a,this):null;return null!==a?a.Qq:b.da(zc)};S.prototype.computeShortLength=function(a){if(a){a=this.fromShortLength;if(isNaN(a)){var b=this.fromPort;null!==b&&(a=b.fromShortLength)}return isNaN(a)?0:a}a=this.toShortLength;isNaN(a)&&(b=this.toPort,null!==b&&(a=b.toShortLength));return isNaN(a)?0:a};\nS.prototype.zf=function(a,b,c,d,e,f){if(!1===this.pickable)return!1;void 0===b&&(b=null);void 0===c&&(c=null);var g=f;void 0===f&&(g=ld.alloc(),g.reset());g.multiply(this.transform);if(this.Jh(a,g))return ln(this,b,c,e),void 0===f&&ld.free(g),!0;if(this.Mc(a,g)){var h=!1;if(!this.isAtomic)for(var k=this.W.j,l=k.length;l--;){var m=k[l];if(m.visible||m===this.locationObject){var n=m.actualBounds,p=this.naturalBounds;if(!(n.x>p.width||n.y>p.height||0>n.x+n.width||0>n.y+n.height)){n=ld.alloc();n.set(g);\nif(m instanceof X)h=m.zf(a,b,c,d,e,n);else if(this.path===m){if(m instanceof Kf)if(h=a,p=d,!1===m.pickable)h=!1;else if(n.multiply(m.transform),p)b:{var r=h,q=n;if(m.Jh(r,q))h=!0;else{if(void 0===q&&(q=m.transform,r.Ge(m.actualBounds))){h=!0;break b}h=r.left;p=r.right;var u=r.top;r=r.bottom;var w=J.alloc(),v=J.alloc(),y=J.alloc(),z=ld.alloc();z.set(q);z.jw(m.transform);z.St();v.x=p;v.y=u;v.transform(z);w.x=h;w.y=u;w.transform(z);q=!1;Ln(m,w,v,y)?q=!0:(w.x=p,w.y=r,w.transform(z),Ln(m,w,v,y)?q=!0:(v.x=\nh,v.y=r,v.transform(z),Ln(m,w,v,y)?q=!0:(w.x=h,w.y=u,w.transform(z),Ln(m,w,v,y)&&(q=!0))));ld.free(z);J.free(w);J.free(v);J.free(y);h=q}}else h=m.Jh(h,n)}else h=pl(m,a,d,n);h&&(p=m,null!==b&&(p=b(m)),p&&(null===c||c(p))&&e.add(p));ld.free(n)}}}void 0===f&&ld.free(g);return h||null!==this.background||null!==this.areaBackground}void 0===f&&ld.free(g);return!1};\nS.prototype.computeCurve=function(){if(null===this.Vf){var a=this.fromPort,b=this.isOrthogonal;this.Vf=null!==a&&a===this.toPort&&!b}return this.Vf?dg:this.curve};S.prototype.computeCorner=function(){if(this.curve===dg)return 0;var a=this.corner;if(isNaN(a)||0>a)a=10;return a};\nS.prototype.findMidLabel=function(){for(var a=this.path,b=this.W.j,c=b.length,d=0;d<c;d++){var e=b[d];if(e!==a&&!e.isPanelMain&&(-Infinity===e.segmentIndex||isNaN(e.segmentIndex)))return e}for(a=this.labelNodes;a.next();)if(b=a.value,-Infinity===b.segmentIndex||isNaN(b.segmentIndex))return b;return null};\nS.prototype.computeSpacing=function(){if(!this.isVisible())return 0;var a=Bp;a=Math.max(a,this.computeThickness());var b=this.fromPort,c=this.toPort;if(null!==b&&null!==c){var d=this.findMidLabel();if(null!==d){var e=d.naturalBounds,f=d.margin,g=isNaN(e.width)?30:e.width*d.scale+f.left+f.right;e=isNaN(e.height)?14:e.height*d.scale+f.top+f.bottom;d=d.segmentOrientation;d===Zm||d===$m||d===mp?a=Math.max(a,e):d===Um||d===Vm||d===Sm||d===Tm?a=Math.max(a,g):(b=b.da(zc).Pa(c.da(zc))/180*Math.PI,a=Math.max(a,\nMath.abs(Math.sin(b)*g)+Math.abs(Math.cos(b)*e)+1));this.curve===dg&&(a*=1.333)}}return a};S.prototype.arrangeBundledLinks=function(a,b){if(b)for(b=0;b<a.length;b++){var c=a[b];c.computeAdjusting()===ag&&c.Ua()}};\nS.prototype.computeCurviness=function(){var a=this.curviness;if(isNaN(a)){a=Cp;var b=this.Mf;if(null!==b){for(var c=Ea(),d=0,e=b.links,f=0;f<e.length;f++){var g=e[f].computeSpacing();c.push(g);d+=g}d=-d/2;for(f=0;f<e.length;f++){if(e[f]===this){a=d+c[f]/2;break}d+=c[f]}b.au===this.fromNode&&(a=-a);Ia(c)}}return a};S.prototype.computeThickness=function(){if(!this.isVisible())return 0;var a=this.path;return null!==a?Math.max(a.strokeWidth,1):1};\nS.prototype.hasCurviness=function(){return!isNaN(this.curviness)||null!==this.Mf};\nS.prototype.adjustPoints=function(a,b,c,d){var e=this.computeAdjusting();if(this.isOrthogonal){if(e===kp)return!1;e===lp&&(e=jp)}switch(e){case kp:var f=this.i(a),g=this.i(c);if(!f.Qa(b)||!g.Qa(d)){e=f.x;f=f.y;var h=g.x-e,k=g.y-f,l=Math.sqrt(h*h+k*k);if(!L.aa(l,0)){if(L.aa(h,0))var m=0>k?-Math.PI/2:Math.PI/2;else m=Math.atan(k/Math.abs(h)),0>h&&(m=Math.PI-m);g=b.x;var n=b.y;h=d.x-g;var p=d.y-n;k=Math.sqrt(h*h+p*p);L.aa(h,0)?p=0>p?-Math.PI/2:Math.PI/2:(p=Math.atan(p/Math.abs(h)),0>h&&(p=Math.PI-p));\nl=k/l;m=p-m;this.Qc(a,b);for(a+=1;a<c;a++)b=this.i(a),h=b.x-e,k=b.y-f,b=Math.sqrt(h*h+k*k),L.aa(b,0)||(L.aa(h,0)?k=0>k?-Math.PI/2:Math.PI/2:(k=Math.atan(k/Math.abs(h)),0>h&&(k=Math.PI-k)),h=k+m,b*=l,this.L(a,g+b*Math.cos(h),n+b*Math.sin(h)));this.Qc(c,d)}}return!0;case lp:f=this.i(a);n=this.i(c);if(!f.Qa(b)||!n.Qa(d)){e=f.x;f=f.y;g=n.x;n=n.y;l=(g-e)*(g-e)+(n-f)*(n-f);h=b.x;m=b.y;k=d.x;p=d.y;var r=1;if(0!==k-h){var q=(p-m)/(k-h);r=Math.sqrt(1+1/(q*q))}else q=9E9;this.Qc(a,b);for(a+=1;a<c;a++){b=this.i(a);\nvar u=b.x,w=b.y,v=.5;0!==l&&(v=((e-u)*(e-g)+(f-w)*(f-n))/l);var y=e+v*(g-e),z=f+v*(n-f);b=Math.sqrt((u-y)*(u-y)+(w-z)*(w-z));w<q*(u-y)+z&&(b=-b);0<q&&(b=-b);u=h+v*(k-h);v=m+v*(p-m);0!==q?(b=u+b/r,this.L(a,b,v-(b-u)/q)):this.L(a,u,v+b)}this.Qc(c,d)}return!0;case jp:a:{if(this.isOrthogonal&&(e=this.i(a),f=this.i(a+1),g=this.i(a+2),h=f.x,m=f.y,n=h,l=m,L.A(e.y,f.y)?L.A(f.x,g.x)?m=b.y:L.A(f.y,g.y)&&(h=b.x):L.A(e.x,f.x)&&(L.A(f.y,g.y)?h=b.x:L.A(f.x,g.x)&&(m=b.y)),this.L(a+1,h,m),e=this.i(c),f=this.i(c-\n1),g=this.i(c-2),h=f.x,m=f.y,k=h,p=m,L.A(e.y,f.y)?L.A(f.x,g.x)?m=d.y:L.A(f.y,g.y)&&(h=d.x):L.A(e.x,f.x)&&(L.A(f.y,g.y)?h=d.x:L.A(f.x,g.x)&&(m=d.y)),this.L(c-1,h,m),Sj(this))){this.L(a+1,n,l);this.L(c-1,k,p);c=!1;break a}this.Qc(a,b);this.Qc(c,d);c=!0}return c;default:return!1}};\nS.prototype.addOrthoPoints=function(a,b,c,d,e,f){0>b?b+=360:360<=b&&(b-=360);0>d?d+=360:360<=d&&(d-=360);var g=d;b=315<=b||45>b?0:45<=b&&135>b?90:135<=b&&225>b?180:270;d=315<=d||45>d?0:45<=d&&135>d?90:135<=d&&225>d?180:270;var h=e.actualBounds.copy(),k=f.actualBounds.copy();if(h.s()&&k.s()){h.Jc(Dp,Dp);k.Jc(Dp,Dp);h.Oe(a);k.Oe(c);if(0===b)if(c.x>a.x||270===d&&c.y<a.y&&k.right>a.x||90===d&&c.y>a.y&&k.right>a.x){var l=new J(c.x,a.y);var m=new J(c.x,(a.y+c.y)/2);180===d?(l.x=this.computeMidOrthoPosition(a.x,\na.y,c.x,c.y,!1),m.x=l.x,m.y=c.y):270===d&&c.y<a.y||90===d&&c.y>a.y?(l.x=a.x<k.left?this.computeMidOrthoPosition(a.x,a.y,k.left,c.y,!1):a.x<k.right&&(270===d&&a.y<k.top||90===d&&a.y>k.bottom)?this.computeMidOrthoPosition(a.x,a.y,c.x,c.y,!1):k.right,m.x=l.x,m.y=c.y):0===d&&a.x<k.left&&a.y>k.top&&a.y<k.bottom&&(l.x=a.x,l.y=a.y<c.y?Math.min(c.y,k.top):Math.max(c.y,k.bottom),m.y=l.y)}else{l=new J(a.x,c.y);m=new J((a.x+c.x)/2,c.y);if(180===d||90===d&&c.y<h.top||270===d&&c.y>h.bottom)180===d&&(k.$(a)||h.$(c))?\nl.y=this.computeMidOrthoPosition(a.x,a.y,c.x,c.y,!0):c.y<a.y&&(180===d||90===d)?l.y=this.computeMidOrthoPosition(a.x,h.top,c.x,Math.max(c.y,k.bottom),!0):c.y>a.y&&(180===d||270===d)&&(l.y=this.computeMidOrthoPosition(a.x,h.bottom,c.x,Math.min(c.y,k.top),!0)),m.x=c.x,m.y=l.y;if(l.y>h.top&&l.y<h.bottom)if(c.x>=h.left&&c.x<=a.x||a.x<=k.right&&a.x>=c.x){if(90===d||270===d)l=new J(Math.max((a.x+c.x)/2,a.x),a.y),m=new J(l.x,c.y)}else l.y=270===d||(0===d||180===d)&&c.y<a.y?Math.min(c.y,0===d?h.top:Math.min(h.top,\nk.top)):Math.max(c.y,0===d?h.bottom:Math.max(h.bottom,k.bottom)),m.x=c.x,m.y=l.y}else if(180===b)if(c.x<a.x||270===d&&c.y<a.y&&k.left<a.x||90===d&&c.y>a.y&&k.left<a.x)l=new J(c.x,a.y),m=new J(c.x,(a.y+c.y)/2),0===d?(l.x=this.computeMidOrthoPosition(a.x,a.y,c.x,c.y,!1),m.x=l.x,m.y=c.y):270===d&&c.y<a.y||90===d&&c.y>a.y?(l.x=a.x>k.right?this.computeMidOrthoPosition(a.x,a.y,k.right,c.y,!1):a.x>k.left&&(270===d&&a.y<k.top||90===d&&a.y>k.bottom)?this.computeMidOrthoPosition(a.x,a.y,c.x,c.y,!1):k.left,\nm.x=l.x,m.y=c.y):180===d&&a.x>k.right&&a.y>k.top&&a.y<k.bottom&&(l.x=a.x,l.y=a.y<c.y?Math.min(c.y,k.top):Math.max(c.y,k.bottom),m.y=l.y);else{l=new J(a.x,c.y);m=new J((a.x+c.x)/2,c.y);if(0===d||90===d&&c.y<h.top||270===d&&c.y>h.bottom)0===d&&(k.$(a)||h.$(c))?l.y=this.computeMidOrthoPosition(a.x,a.y,c.x,c.y,!0):c.y<a.y&&(0===d||90===d)?l.y=this.computeMidOrthoPosition(a.x,h.top,c.x,Math.max(c.y,k.bottom),!0):c.y>a.y&&(0===d||270===d)&&(l.y=this.computeMidOrthoPosition(a.x,h.bottom,c.x,Math.min(c.y,\nk.top),!0)),m.x=c.x,m.y=l.y;if(l.y>h.top&&l.y<h.bottom)if(c.x<=h.right&&c.x>=a.x||a.x>=k.left&&a.x<=c.x){if(90===d||270===d)l=new J(Math.min((a.x+c.x)/2,a.x),a.y),m=new J(l.x,c.y)}else l.y=270===d||(0===d||180===d)&&c.y<a.y?Math.min(c.y,180===d?h.top:Math.min(h.top,k.top)):Math.max(c.y,180===d?h.bottom:Math.max(h.bottom,k.bottom)),m.x=c.x,m.y=l.y}else if(90===b)if(c.y>a.y||180===d&&c.x<a.x&&k.bottom>a.y||0===d&&c.x>a.x&&k.bottom>a.y)l=new J(a.x,c.y),m=new J((a.x+c.x)/2,c.y),270===d?(l.y=this.computeMidOrthoPosition(a.x,\na.y,c.x,c.y,!0),m.x=c.x,m.y=l.y):180===d&&c.x<a.x||0===d&&c.x>a.x?(l.y=a.y<k.top?this.computeMidOrthoPosition(a.x,a.y,c.x,k.top,!0):a.y<k.bottom&&(180===d&&a.x<k.left||0===d&&a.x>k.right)?this.computeMidOrthoPosition(a.x,a.y,c.x,c.y,!0):k.bottom,m.x=c.x,m.y=l.y):90===d&&a.y<k.top&&a.x>k.left&&a.x<k.right&&(l.x=a.x<c.x?Math.min(c.x,k.left):Math.max(c.x,k.right),l.y=a.y,m.x=l.x);else{l=new J(c.x,a.y);m=new J(c.x,(a.y+c.y)/2);if(270===d||0===d&&c.x<h.left||180===d&&c.x>h.right)270===d&&(k.$(a)||h.$(c))?\nl.x=this.computeMidOrthoPosition(a.x,a.y,c.x,c.y,!1):c.x<a.x&&(270===d||0===d)?l.x=this.computeMidOrthoPosition(h.left,a.y,Math.max(c.x,k.right),c.y,!1):c.x>a.x&&(270===d||180===d)&&(l.x=this.computeMidOrthoPosition(h.right,a.y,Math.min(c.x,k.left),c.y,!1)),m.x=l.x,m.y=c.y;if(l.x>h.left&&l.x<h.right)if(c.y>=h.top&&c.y<=a.y||a.y<=k.bottom&&a.y>=c.y){if(0===d||180===d)l=new J(a.x,Math.max((a.y+c.y)/2,a.y)),m=new J(c.x,l.y)}else l.x=180===d||(90===d||270===d)&&c.x<a.x?Math.min(c.x,90===d?h.left:Math.min(h.left,\nk.left)):Math.max(c.x,90===d?h.right:Math.max(h.right,k.right)),m.x=l.x,m.y=c.y}else if(c.y<a.y||180===d&&c.x<a.x&&k.top<a.y||0===d&&c.x>a.x&&k.top<a.y)l=new J(a.x,c.y),m=new J((a.x+c.x)/2,c.y),90===d?(l.y=this.computeMidOrthoPosition(a.x,a.y,c.x,c.y,!0),m.x=c.x,m.y=l.y):180===d&&c.x<a.x||0===d&&c.x>=a.x?(l.y=a.y>k.bottom?this.computeMidOrthoPosition(a.x,a.y,c.x,k.bottom,!0):a.y>k.top&&(180===d&&a.x<k.left||0===d&&a.x>k.right)?this.computeMidOrthoPosition(a.x,a.y,c.x,c.y,!0):k.top,m.x=c.x,m.y=l.y):\n270===d&&a.y>k.bottom&&a.x>k.left&&a.x<k.right&&(l.x=a.x<c.x?Math.min(c.x,k.left):Math.max(c.x,k.right),l.y=a.y,m.x=l.x);else{l=new J(c.x,a.y);m=new J(c.x,(a.y+c.y)/2);if(90===d||0===d&&c.x<h.left||180===d&&c.x>h.right)90===d&&(k.$(a)||h.$(c))?l.x=this.computeMidOrthoPosition(a.x,a.y,c.x,c.y,!1):c.x<a.x&&(90===d||0===d)?l.x=this.computeMidOrthoPosition(h.left,a.y,Math.max(c.x,k.right),c.y,!1):c.x>a.x&&(90===d||180===d)&&(l.x=this.computeMidOrthoPosition(h.right,a.y,Math.min(c.x,k.left),c.y,!1)),m.x=\nl.x,m.y=c.y;if(l.x>h.left&&l.x<h.right)if(c.y<=h.bottom&&c.y>=a.y||a.y>=k.top&&a.y<=c.y){if(0===d||180===d)l=new J(a.x,Math.min((a.y+c.y)/2,a.y)),m=new J(c.x,l.y)}else l.x=180===d||(90===d||270===d)&&c.x<a.x?Math.min(c.x,270===d?h.left:Math.min(h.left,k.left)):Math.max(c.x,270===d?h.right:Math.max(h.right,k.right)),m.x=l.x,m.y=c.y}var n=l,p=m,r=c;if(this.isAvoiding){var q=this.diagram;if(null===q||e===f||this.layer.isTemporary||!uk(q)||h.$(r)&&!f.Kd(e)||k.$(a)&&!e.Kd(f))b=!1;else{var u=vk(q,!0,this.containingGroup,\nnull);if(17!==this.segmentIndex&&u.Ek(Math.min(a.x,n.x),Math.min(a.y,n.y),Math.abs(a.x-n.x),Math.abs(a.y-n.y))&&u.Ek(Math.min(n.x,p.x),Math.min(n.y,p.y),Math.abs(n.x-p.x),Math.abs(n.y-p.y))&&u.Ek(Math.min(p.x,r.x),Math.min(p.y,r.y),Math.abs(p.x-r.x),Math.abs(p.y-r.y)))b=!1;else{e=a;f=r;var w=c=null;if(q.isVirtualized){q=u.bounds.copy();q.Jc(-u.zq,-u.yq);var v=J.alloc();Ak(u,a.x,a.y)||(L.Cf(q.x,q.y,q.x+q.width,q.y+q.height,a.x,a.y,n.x,n.y,v)?(c=a=v.copy(),b=v.Pa(n)):L.Cf(q.x,q.y,q.x+q.width,q.y+q.height,\nn.x,n.y,p.x,p.y,v)?(c=a=v.copy(),b=v.Pa(p)):L.Cf(q.x,q.y,q.x+q.width,q.y+q.height,p.x,p.y,r.x,r.y,v)&&(c=a=v.copy(),b=v.Pa(r)));Ak(u,r.x,r.y)||(L.Cf(q.x,q.y,q.x+q.width,q.y+q.height,r.x,r.y,p.x,p.y,v)?(w=r=v.copy(),d=p.Pa(v)):L.Cf(q.x,q.y,q.x+q.width,q.y+q.height,p.x,p.y,n.x,n.y,v)?(w=r=v.copy(),d=n.Pa(v)):L.Cf(q.x,q.y,q.x+q.width,q.y+q.height,n.x,n.y,a.x,a.y,v)&&(w=r=v.copy(),d=a.Pa(v)));J.free(v)}h=h.copy().Rc(k);h.Jc(u.zq*u.Wy,u.yq*u.Wy);Ep(u,a,b,r,d,h,!0);k=Fp(u,r.x,r.y);!u.abort&&k>=Gp&&(zk(u),\nh.Jc(u.zq*u.Gy,u.yq*u.Gy),Ep(u,a,b,r,d,h,!1),k=Fp(u,r.x,r.y));if(!u.abort&&k<Gp&&Fp(u,r.x,r.y)!==Bk){Hp(this,u,r.x,r.y,d,!0,g);h=this.i(2);if(4>this.pointsCount)0===b||180===b?(h.x=a.x,h.y=r.y):(h.x=r.x,h.y=a.y),this.L(2,h.x,h.y),this.m(3,h.x,h.y);else if(g=this.i(3),0===b||180===b)L.A(h.x,g.x)?(h=0===b?Math.max(h.x,a.x):Math.min(h.x,a.x),this.L(2,h,a.y),this.L(3,h,g.y)):L.A(h.y,g.y)?(Math.abs(a.y-h.y)<=u.yq/2&&(this.L(2,h.x,a.y),this.L(3,g.x,a.y)),this.m(2,h.x,a.y)):this.L(2,a.x,h.y);else if(90===\nb||270===b)L.A(h.y,g.y)?(h=90===b?Math.max(h.y,a.y):Math.min(h.y,a.y),this.L(2,a.x,h),this.L(3,g.x,h)):L.A(h.x,g.x)?(Math.abs(a.x-h.x)<=u.zq/2&&(this.L(2,a.x,h.y),this.L(3,a.x,g.y)),this.m(2,a.x,h.y)):this.L(2,h.x,a.y);null!==c&&(a=this.i(1),g=this.i(2),a.x!==g.x&&a.y!==g.y?0===b||180===b?this.m(2,a.x,g.y):this.m(2,g.x,a.y):0===b||180===b?this.m(2,e.x,c.y):this.m(2,c.x,e.y));null!==w&&(0===d||180===d?this.vf(f.x,w.y):this.vf(w.x,f.y));b=!0}else b=!1}}}else b=!1;b||(this.ce(l),this.ce(m))}};\nS.prototype.computeMidOrthoPosition=function(a,b,c,d,e){var f=0;!this.hasCurviness()||this.computeSpot(!0,this.fromPort).Oc()||this.computeSpot(!1,this.toPort).Oc()||(f=this.computeCurviness());return e?(b+d)/2+f:(a+c)/2+f};\nfunction Sj(a){if(null===a.diagram||!a.isAvoiding||!uk(a.diagram))return!1;var b=a.points.j,c=b.length;if(4>c)return!1;a=vk(a.diagram,!0,a.containingGroup,null);for(var d=1;d<c-2;d++){var e=b[d],f=b[d+1];if(!a.Ek(Math.min(e.x,f.x),Math.min(e.y,f.y),Math.abs(e.x-f.x),Math.abs(e.y-f.y)))return!0}return!1}\nfunction Hp(a,b,c,d,e,f,g){var h=b.zq,k=b.yq,l=Fp(b,c,d),m=c,n=d;0===e?m+=h:90===e?n+=k:180===e?m-=h:n-=k;e!==g&&l>Ip&&Fp(b,m,n)!==l-1&&(Fp(b,c-h,d)===l-1?(e=180,m=c-h,n=d):Fp(b,c+h,d)===l-1?(e=0,m=c+h,n=d):Fp(b,c,d-k)===l-1?(e=270,m=c,n=d-k):Fp(b,c,d+k)===l-1&&(e=90,m=c,n=d+k));for(;l>Ip&&Fp(b,m,n)===l-1;)c=m,d=n,0===e?m+=h:90===e?n+=k:180===e?m-=h:n-=k,--l;if(f){if(l>Ip)if(180===e||0===e)c=Math.floor(c/h)*h+h/2;else if(90===e||270===e)d=Math.floor(d/k)*k+k/2}else c=Math.floor(c/h)*h+h/2,d=Math.floor(d/\nk)*k+k/2;l>Ip&&(f=e,g=c,m=d,0===e?(f=90,m+=k):90===e?(f=180,g-=h):180===e?(f=270,m-=k):270===e&&(f=0,g+=h),Fp(b,g,m)===l-1?Hp(a,b,g,m,f,!1,f):(g=c,m=d,0===e?(f=270,m-=k):90===e?(f=0,g+=h):180===e?(f=90,m+=k):270===e&&(f=180,g-=h),Fp(b,g,m)===l-1&&Hp(a,b,g,m,f,!1,f)));a.vf(c,d)}S.prototype.Sz=function(a){var b=a.x;a=a.y;for(var c=this.i(0),d=this.i(1),e=xb(b,a,c.x,c.y,d.x,d.y),f=0,g=1;g<this.pointsCount-1;g++){c=this.i(g+1);var h=xb(b,a,d.x,d.y,c.x,c.y);d=c;h<e&&(f=g,e=h)}return f};\nS.prototype.dc=function(){this.$m=!1;this.o()};S.prototype.Gk=function(a){if(!a){if(!1===this.ud)return;a=this.tb();if(this.$m&&(null===a||null!==a.geometry))return}this.na=this.makeGeometry();a=this.path;if(null!==a){a.na=this.na;for(var b=this.W.j,c=b.length,d=0;d<c;d++){var e=b[d];e!==a&&e.isPanelMain&&e instanceof Kf&&(e.na=this.na)}}};\nS.prototype.makeGeometry=function(){var a=this.na,b=this.pointsCount;if(2>b)return a.type=ud,this.$m=!0,a;var c=!1,d=this.diagram;null!==d&&np(this)&&d.Vg.contains(this)&&(0!==this.Yl.width||0!==this.Yl.height)&&(c=!0);var e=this.i(0).copy(),f=e.copy();d=this.Ab.j;var g=this.computeCurve();if(g===dg&&3<=b&&!L.aa(this.smoothness,0))if(3===b){var h=this.i(1);d=Math.min(e.x,h.x);var k=Math.min(e.y,h.y);h=this.i(2);d=Math.min(d,h.x);k=Math.min(k,h.y)}else{if(this.isOrthogonal)for(k=0;k<b;k++)h=d[k],f.x=\nMath.min(h.x,f.x),f.y=Math.min(h.y,f.y);else for(d=3;d<b;d+=3)d+3>=b&&(d=b-1),k=this.i(d),f.x=Math.min(k.x,f.x),f.y=Math.min(k.y,f.y);d=f.x;k=f.y}else{for(k=0;k<b;k++)h=d[k],f.x=Math.min(h.x,f.x),f.y=Math.min(h.y,f.y);d=f.x;k=f.y}d-=this.vv.x;k-=this.vv.y;e.x-=d;e.y-=k;if(2!==b||np(this)){a.type=sd;h=Fd(a);0!==this.computeShortLength(!0)&&(e=Jp(this,e,!0,f));Gd(h,e.x,e.y,!1);if(g===dg&&3<=b&&!L.aa(this.smoothness,0))if(3===b)c=this.i(1),b=c.x-d,c=c.y-k,e=this.i(2).copy(),e.x-=d,e.y-=k,0!==this.computeShortLength(!1)&&\n(e=Jp(this,e,!1,f)),Hd(h,b,c,b,c,e.x,e.y);else if(this.isOrthogonal){f=new J(d,k);e=this.i(1).copy();g=new J(d,k);b=new J(d,k);c=this.i(0);for(var l,m=this.smoothness/3,n=1;n<this.pointsCount-1;n++){l=this.i(n);var p=c,r=l,q=this.i(Kp(this,l,n,!1));if(!L.aa(p.x,r.x)||!L.aa(r.x,q.x))if(!L.aa(p.y,r.y)||!L.aa(r.y,q.y)){var u=m;isNaN(u)&&(u=this.smoothness/3);var w=p.x;p=p.y;var v=r.x;r=r.y;var y=q.x;q=q.y;var z=u*Lp(w,p,v,r);u*=Lp(v,r,y,q);L.aa(p,r)&&L.aa(v,y)&&(v>w?q>r?(g.x=v-z,g.y=r-z,b.x=v+u,b.y=\nr+u):(g.x=v-z,g.y=r+z,b.x=v+u,b.y=r-u):q>r?(g.x=v+z,g.y=r-z,b.x=v-u,b.y=r+u):(g.x=v+z,g.y=r+z,b.x=v-u,b.y=r-u));L.aa(w,v)&&L.aa(r,q)&&(r>p?(y>v?(g.x=v-z,g.y=r-z,b.x=v+u):(g.x=v+z,g.y=r-z,b.x=v-u),b.y=r+u):(y>v?(g.x=v-z,g.y=r+z,b.x=v+u):(g.x=v+z,g.y=r+z,b.x=v-u),b.y=r-u));if(L.aa(w,v)&&L.aa(v,y)||L.aa(p,r)&&L.aa(r,q))w=.5*(w+y),p=.5*(p+q),g.x=w,g.y=p,b.x=w,b.y=p;1===n?(e.x=.5*(c.x+l.x),e.y=.5*(c.y+l.y)):2===n&&L.aa(c.x,this.i(0).x)&&L.aa(c.y,this.i(0).y)&&(e.x=.5*(c.x+l.x),e.y=.5*(c.y+l.y));Hd(h,e.x-\nd,e.y-k,g.x-d,g.y-k,l.x-d,l.y-k);f.set(g);e.set(b);c=l}}f=c.x;c=c.y;e=this.i(this.pointsCount-1);0!==this.computeShortLength(!1)&&(e=Jp(this,e.copy(),!1,Bb));f=.5*(f+e.x);c=.5*(c+e.y);Hd(h,b.x-d,b.y-k,f-d,c-k,e.x-d,e.y-k)}else for(c=3;c<b;c+=3)f=this.i(c-2),c+3>=b&&(c=b-1),e=this.i(c-1),g=this.i(c),c===b-1&&0!==this.computeShortLength(!1)&&(g=Jp(this,g.copy(),!1,Bb)),Hd(h,f.x-d,f.y-k,e.x-d,e.y-k,g.x-d,g.y-k);else{f=J.alloc();f.assign(this.i(0));e=J.alloc();e.assign(f);g=this.computeCorner();n=1;for(l=\n0;n<b;){n=Kp(this,f,n,1<n);m=this.i(n);if(n>=b-1){if(!f.w(m))0!==this.computeShortLength(!1)&&(m=Jp(this,m.copy(),!1,Bb)),Mp(this,h,-d,-k,f,m,c);else if(0===l)for(n=1;n<b;)e.assign(f),m=this.i(n++),Mp(this,h,-d,-k,f,m,c),f.assign(m);break}l=Kp(this,m,n+1,n<b-3);n=-d;w=-k;p=m;u=this.i(l);v=c;if(L.A(f.y,p.y)&&L.A(p.x,u.x))if(r=Math.min(g,Math.abs(p.x-e.x)/2),r=y=Math.min(r,Math.abs(u.y-p.y)/2),L.A(r,0))Mp(this,h,n,w,f,p,v),f.assign(p);else{q=p.x;z=p.y;var A=q,C=z;p.x>f.x?q=p.x-r:q=p.x+r;u.y>p.y?C=p.y+\ny:C=p.y-y;Mp(this,h,n,w,f,new J(q,z),v);Id(h,p.x+n,p.y+w,A+n,C+w);f.h(A,C)}else L.A(f.x,p.x)&&L.A(p.y,u.y)?(r=Math.min(g,Math.abs(p.y-e.y)/2),r=y=Math.min(r,Math.abs(u.x-p.x)/2),L.A(y,0)?(Mp(this,h,n,w,f,p,v),f.assign(p)):(q=p.x,z=p.y,A=q,C=z,p.y>f.y?z=p.y-r:z=p.y+r,u.x>p.x?A=p.x+y:A=p.x-y,Mp(this,h,n,w,f,new J(q,z),v),Id(h,p.x+n,p.y+w,A+n,C+w),f.h(A,C))):(Mp(this,h,n,w,f,p,v),f.assign(p));e.assign(m);n=l}J.free(f)}Wd=h}else h=this.i(1).copy(),h.x-=d,h.y-=k,0!==this.computeShortLength(!0)&&(e=Jp(this,\ne,!0,f)),0!==this.computeShortLength(!1)&&(h=Jp(this,h,!1,f)),a.type=ud,a.startX=e.x,a.startY=e.y,a.endX=h.x,a.endY=h.y;this.$m=!0;return a};function Lp(a,b,c,d){a=c-a;if(isNaN(a)||Infinity===a||-Infinity===a)return NaN;0>a&&(a=-a);b=d-b;if(isNaN(b)||Infinity===b||-Infinity===b)return NaN;0>b&&(b=-b);return L.aa(a,0)?b:L.aa(b,0)?a:Math.sqrt(a*a+b*b)}\nfunction Jp(a,b,c,d){var e=a.pointsCount;if(2>e)return b;if(c){var f=a.i(1);c=f.x-d.x;f=f.y-d.y;d=Lp(b.x,b.y,c,f);if(0===d)return b;e=2===e?.5*d:d;a=a.computeShortLength(!0);a>e&&(a=e);e=a*(f-b.y)/d;b.x+=a*(c-b.x)/d;b.y+=e}else{f=a.i(e-2);c=f.x-d.x;f=f.y-d.y;d=Lp(b.x,b.y,c,f);if(0===d)return b;e=2===e?.5*d:d;a=a.computeShortLength(!1);a>e&&(a=e);e=a*(b.y-f)/d;b.x-=a*(b.x-c)/d;b.y-=e}return b}\nfunction Kp(a,b,c,d){for(var e=a.pointsCount,f=b;L.aa(b.x,f.x)&&L.aa(b.y,f.y);){if(c>=e)return e-1;f=a.i(c++)}if(!L.aa(b.x,f.x)&&!L.aa(b.y,f.y))return c-1;for(var g=f;L.aa(b.x,f.x)&&L.aa(f.x,g.x)&&(!d||(b.y>=f.y?f.y>=g.y:f.y<=g.y))||L.aa(b.y,f.y)&&L.aa(f.y,g.y)&&(!d||(b.x>=f.x?f.x>=g.x:f.x<=g.x));){if(c>=e)return e-1;g=a.i(c++)}return c-2}S.prototype.computeJumpLength=function(){return 10};\nfunction Mp(a,b,c,d,e,f,g){if(!g&&np(a)){g=a.computeJumpLength();var h=g/2,k=[],l=0;a.isVisible()&&(l=Np(a,e,f,k));if(0<l)if(L.A(e.y,f.y))if(e.x<f.x)for(var m=0;m<l;){var n=Math.max(e.x,Math.min(k[m++]-h,f.x-g));b.lineTo(n+c,f.y+d);var p=n+c;for(var r=Math.min(n+g,f.x);m<l;)if(n=k[m],n<r+g)m++,r=Math.min(n+h,f.x);else break;n=f.y-g+d;r+=c;var q=f.y+d;a.curve===$f?Gd(b,r,q,!1):Hd(b,p,n,r,n,r,q)}else for(--l;0<=l;){m=Math.min(e.x,Math.max(k[l--]+h,f.x+g));b.lineTo(m+c,f.y+d);p=m+c;for(n=Math.max(m-\ng,f.x);0<=l;)if(m=k[l],m>n-g)l--,n=Math.max(m-h,f.x);else break;m=f.y-g+d;n+=c;r=f.y+d;a.curve===$f?Gd(b,n,r,!1):Hd(b,p,m,n,m,n,r)}else if(L.A(e.x,f.x))if(e.y<f.y)for(m=0;m<l;){n=Math.max(e.y,Math.min(k[m++]-h,f.y-g));b.lineTo(f.x+c,n+d);p=n+d;for(n=Math.min(n+g,f.y);m<l;)if(r=k[m],r<n+g)m++,n=Math.min(r+h,f.y);else break;r=f.x-g+c;q=f.x+c;n+=d;a.curve===$f?Gd(b,q,n,!1):Hd(b,r,p,r,n,q,n)}else for(--l;0<=l;){m=Math.min(e.y,Math.max(k[l--]+h,f.y+g));b.lineTo(f.x+c,m+d);p=m+d;for(m=Math.max(m-g,f.y);0<=\nl;)if(n=k[l],n>m-g)l--,m=Math.max(n-h,f.y);else break;n=f.x-g+c;r=f.x+c;m+=d;a.curve===$f?Gd(b,r,m,!1):Hd(b,n,p,n,m,r,m)}}b.lineTo(f.x+c,f.y+d)}\nfunction Np(a,b,c,d){var e=a.diagram;if(null===e||b.w(c))return 0;for(e=e.layers;e.next();){var f=e.value;if(null!==f&&f.visible){f=f.Ea.j;for(var g=f.length,h=0;h<g;h++){var k=f[h];if(k instanceof S){if(k===a)return 0<d.length&&d.sort(function(a,b){return a-b}),d.length;if(k.isVisible()&&np(k)){var l=k.routeBounds;l.s()&&a.routeBounds.Mc(l)&&!a.usesSamePort(k)&&(l=k.path,null!==l&&l.Gf()&&Op(b,c,d,k))}}}}}0<d.length&&d.sort(function(a,b){return a-b});return d.length}\nfunction Op(a,b,c,d){for(var e=L.A(a.y,b.y),f=d.pointsCount,g=d.i(0),h=J.alloc(),k=1;k<f;k++){var l=d.i(k);if(k<f-1){var m=d.i(k+1);if(g.y===l.y&&l.y===m.y){if(l.x>g.x&&m.x>=l.x||l.x<g.x&&m.x<=l.x)continue}else if(g.x===l.x&&l.x===m.x&&(l.y>g.y&&m.y>=l.y||l.y<g.y&&m.y<=l.y))continue}a:{m=a.x;var n=a.y,p=b.x,r=b.y,q=g.x;g=g.y;var u=l.x,w=l.y;if(!L.A(m,p)){if(L.A(n,r)&&L.A(q,u)&&Math.min(m,p)<q&&Math.max(m,p)>q&&Math.min(g,w)<n&&Math.max(g,w)>n&&!L.A(g,w)){h.x=q;h.y=n;m=!0;break a}}else if(!L.A(n,r)&&\nL.A(g,w)&&Math.min(n,r)<g&&Math.max(n,r)>g&&Math.min(q,u)<m&&Math.max(q,u)>m&&!L.A(q,u)){h.x=m;h.y=g;m=!0;break a}h.x=0;h.y=0;m=!1}m&&(e?c.push(h.x):c.push(h.y));g=l}J.free(h)}function np(a){a=a.curve;return a===Zf||a===$f}function rp(a,b){if(b||np(a))b=a.diagram,null===b||b.animationManager.isTicking||b.Vg.contains(a)||0===a.Yl.width&&0===a.Yl.height||b.Vg.add(a,a.Yl.copy())}\nS.prototype.Oq=function(a){var b=this.layer;if(null!==b&&b.visible&&!b.isTemporary){var c=b.diagram;if(null!==c&&!c.animationManager.isTicking){var d=!1;for(c=c.layers;c.next();){var e=c.value;if(e.visible)if(e===b){d=!0;var f=!1;e=e.Ea.j;for(var g=e.length,h=0;h<g;h++){var k=e[h];k instanceof S&&(k===this?f=!0:f&&Pp(this,k,a))}}else if(d)for(f=e.Ea.j,e=f.length,g=0;g<e;g++)h=f[g],h instanceof S&&Pp(this,h,a)}}}};\nfunction Pp(a,b,c){if(null!==b&&b.$m&&b.ud&&np(b)){var d=b.routeBounds;d.s()&&(a.routeBounds.Mc(d)||c.Mc(d))&&(a.usesSamePort(b)||b.dc())}}S.prototype.usesSamePort=function(a){var b=this.pointsCount,c=a.pointsCount;if(0<b&&0<c){var d=this.i(0),e=a.i(0);if(d.Qa(e))return!0;b=this.i(b-1);a=a.i(c-1);if(b.Qa(a)||d.Qa(a)||b.Qa(e))return!0}else if(this.fromNode===a.fromNode||this.toNode===a.toNode||this.fromNode===a.toNode||this.toNode===a.fromNode)return!0;return!1};\nS.prototype.isVisible=function(){if(!V.prototype.isVisible.call(this))return!1;var a=this.containingGroup,b=!0,c=this.diagram;null!==c&&(b=c.isTreePathToChildren);c=this.fromNode;if(null!==c){if(this.isTreeLink&&b&&!c.isTreeExpanded)return!1;if(c===a)return!0;for(var d=c;null!==d;){if(d.labeledLink===this)return!0;d=d.containingGroup}c=c.findVisibleNode();if(null===c||c===a)return!1}c=this.toNode;if(null!==c){if(this.isTreeLink&&!b&&!c.isTreeExpanded)return!1;if(c===a)return!0;for(b=c;null!==b;){if(b.labeledLink===\nthis)return!0;b=b.containingGroup}b=c.findVisibleNode();if(null===b||b===a)return!1}return!0};S.prototype.Ob=function(a){V.prototype.Ob.call(this,a);null!==this.Mf&&this.Mf.Dm();if(null!==this.nd)for(var b=this.nd.iterator;b.next();)b.value.Ob(a)};S.prototype.computeAdjusting=function(){return this.isAvoiding&&null!==this.diagram&&this.diagram.animationManager.defaultAnimation.isAnimating?jp:this.Yk};\nfunction op(a){var b=a.We;if(null!==b){var c=a.rf;if(null!==c&&isNaN(a.curviness)){for(var d=a.Xe,e=a.sf,f=a=null,g=b.$a.j,h=g.length,k=0;k<h;k++){var l=g[k];if(l.We===b&&l.Xe===d&&l.rf===c&&l.sf===e||l.We===c&&l.Xe===e&&l.rf===b&&l.sf===d)null===f?f=l:(null===a&&(a=[],a.push(f)),a.push(l))}if(null!==a){f=Uo(b,c,d,e);null===f&&(f=new Qp(b,d,c,e),To(b,f),To(c,f));f.links=a;for(b=0;b<a.length;b++)a[b].Mf=f;f.Dm()}}}}\nfunction pp(a){var b=a.Mf;null!==b&&isNaN(a.curviness)&&(a.Mf=null,a=b.links.indexOf(a),0<=a&&(Da(b.links,a),b.Dm()))}S.prototype.Ph=function(){return!0};\nna.Object.defineProperties(S.prototype,{fromNode:{get:function(){return this.We},set:function(a){var b=this.We;if(b!==a){var c=this.fromPort;null!==b&&(this.rf!==b&&Yo(b,this,c),pp(this),this.B(2));this.We=a;null!==a&&this.Ob(a.isVisible());this.Vf=null;this.Ua();var d=this.diagram;null!==d&&d.Z&&d.partManager.setFromNodeForLink(this,a,b);var e=this.fromPort,f=this.fromPortChanged;if(null!==f){var g=!0;null!==d&&(g=d.Z,d.Z=!0);f(this,c,e);null!==d&&(d.Z=g)}null!==a&&\n(this.rf!==a&&Xo(a,this,e),op(this),this.B(1));this.g(\"fromNode\",b,a);Qo(this)}}},fromPortId:{get:function(){return this.Xe},set:function(a){var b=this.Xe;if(b!==a){var c=this.fromPort;null!==c&&Vo(c);pp(this);this.Xe=a;var d=this.fromPort;null!==d&&Vo(d);var e=this.diagram;if(null!==e){var f=this.data,g=e.model;null!==f&&g.qj()&&g.Cw(f,a)}c!==d&&(this.Vf=null,this.Ua(),f=this.fromPortChanged,null!==f&&(g=!0,null!==e&&(g=e.Z,e.Z=!0),f(this,c,d),null!==e&&(e.Z=g)));op(this);\nthis.g(\"fromPortId\",b,a)}}},fromPort:{get:function(){var a=this.We;return null===a?null:a.Jt(this.Xe)}},fromPortChanged:{get:function(){return this.fo},set:function(a){var b=this.fo;b!==a&&(this.fo=a,this.g(\"fromPortChanged\",b,a))}},toNode:{get:function(){return this.rf},set:function(a){var b=this.rf;if(b!==a){var c=this.toPort;null!==b&&(this.We!==b&&Yo(b,this,c),pp(this),this.B(2));this.rf=a;null!==a&&this.Ob(a.isVisible());\nthis.Vf=null;this.Ua();var d=this.diagram;null!==d&&d.Z&&d.partManager.setToNodeForLink(this,a,b);var e=this.toPort,f=this.toPortChanged;if(null!==f){var g=!0;null!==d&&(g=d.Z,d.Z=!0);f(this,c,e);null!==d&&(d.Z=g)}null!==a&&(this.We!==a&&Xo(a,this,e),op(this),this.B(1));this.g(\"toNode\",b,a);Qo(this)}}},toPortId:{get:function(){return this.sf},set:function(a){var b=this.sf;if(b!==a){var c=this.toPort;null!==c&&Vo(c);pp(this);this.sf=a;var d=this.toPort;null!==d&&Vo(d);\nvar e=this.diagram;if(null!==e){var f=this.data,g=e.model;null!==f&&g.qj()&&g.Hw(f,a)}c!==d&&(this.Vf=null,this.Ua(),f=this.toPortChanged,null!==f&&(g=!0,null!==e&&(g=e.Z,e.Z=!0),f(this,c,d),null!==e&&(e.Z=g)));op(this);this.g(\"toPortId\",b,a)}}},toPort:{get:function(){var a=this.rf;return null===a?null:a.Jt(this.sf)}},toPortChanged:{get:function(){return this.mq},set:function(a){var b=this.mq;b!==a&&(this.mq=a,this.g(\"toPortChanged\",b,a))}},\nfromSpot:{get:function(){return null!==this.O?this.O.bh:Vc},set:function(a){this.Kc();var b=this.O.bh;b.w(a)||(a=a.H(),this.O.bh=a,this.g(\"fromSpot\",b,a),(b.Oc()||a.Oc())&&null!==this.fromNode&&Vo(this.fromPort),this.Ua())}},fromEndSegmentLength:{get:function(){return null!==this.O?this.O.$g:NaN},set:function(a){this.Kc();var b=this.O.$g;b!==a&&(0>a&&wa(a,\">= 0\",S,\"fromEndSegmentLength\"),this.O.$g=a,this.g(\"fromEndSegmentLength\",b,a),this.Ua())}},\nfromShortLength:{get:function(){return null!==this.O?this.O.ah:NaN},set:function(a){this.Kc();var b=this.O.ah;b!==a&&(this.O.ah=a,this.dc(),this.g(\"fromShortLength\",b,a))}},toSpot:{get:function(){return null!==this.O?this.O.Ch:Vc},set:function(a){this.Kc();var b=this.O.Ch;b.w(a)||(a=a.H(),this.O.Ch=a,this.g(\"toSpot\",b,a),(b.Oc()||a.Oc())&&null!==this.toNode&&Vo(this.toPort),this.Ua())}},toEndSegmentLength:{get:function(){return null!==\nthis.O?this.O.Ah:NaN},set:function(a){this.Kc();var b=this.O.Ah;b!==a&&(0>a&&wa(a,\">= 0\",S,\"toEndSegmentLength\"),this.O.Ah=a,this.g(\"toEndSegmentLength\",b,a),this.Ua())}},toShortLength:{get:function(){return null!==this.O?this.O.Bh:NaN},set:function(a){this.Kc();var b=this.O.Bh;b!==a&&(this.O.Bh=a,this.dc(),this.g(\"toShortLength\",b,a))}},isLabeledLink:{get:function(){return null===this.nd?!1:0<this.nd.count}},labelNodes:{\nget:function(){return null===this.nd?db:this.nd.iterator}},relinkableFrom:{get:function(){return 0!==(this.Ga&1)},set:function(a){var b=0!==(this.Ga&1);b!==a&&(this.Ga^=1,this.g(\"relinkableFrom\",b,a),this.Lb())}},relinkableTo:{get:function(){return 0!==(this.Ga&2)},set:function(a){var b=0!==(this.Ga&2);b!==a&&(this.Ga^=2,this.g(\"relinkableTo\",b,a),this.Lb())}},resegmentable:{get:function(){return 0!==\n(this.Ga&4)},set:function(a){var b=0!==(this.Ga&4);b!==a&&(this.Ga^=4,this.g(\"resegmentable\",b,a),this.Lb())}},isTreeLink:{get:function(){return 0!==(this.Ga&8)},set:function(a){var b=0!==(this.Ga&8);b!==a&&(this.Ga^=8,this.g(\"isTreeLink\",b,a),null!==this.fromNode&&Ik(this.fromNode),null!==this.toNode&&Ik(this.toNode))}},path:{get:function(){var a=this.tb();return a instanceof Kf?a:null}},routeBounds:{get:function(){this.xj();\nvar a=this.Yl,b=Infinity,c=Infinity,d=this.pointsCount;if(0===d)a.h(NaN,NaN,0,0);else{if(1===d)d=this.i(0),b=Math.min(d.x,b),c=Math.min(d.y,c),a.h(d.x,d.y,0,0);else if(2===d){d=this.i(0);var e=this.i(1);b=Math.min(d.x,e.x);c=Math.min(d.y,e.y);a.h(d.x,d.y,0,0);a.Oe(e)}else if(this.computeCurve()===dg&&3<=d&&!this.isOrthogonal)if(e=this.i(0),b=e.x,c=e.y,a.h(b,c,0,0),3===d){d=this.i(1);b=Math.min(d.x,b);c=Math.min(d.y,c);var f=this.i(2);b=Math.min(f.x,b);c=Math.min(f.y,c);L.vm(e.x,e.y,d.x,d.y,d.x,d.y,\nf.x,f.y,.5,a)}else for(f=3;f<d;f+=3){var g=this.i(f-2);f+3>=d&&(f=d-1);var h=this.i(f-1),k=this.i(f);L.vm(e.x,e.y,g.x,g.y,h.x,h.y,k.x,k.y,.5,a);b=Math.min(k.x,b);c=Math.min(k.y,c);e=k}else for(e=this.i(0),f=this.i(1),b=Math.min(e.x,f.x),c=Math.min(e.y,f.y),a.h(e.x,e.y,0,0),a.Oe(f),e=2;e<d;e++)f=this.i(e),b=Math.min(f.x,b),c=Math.min(f.y,c),a.Oe(f);this.vv.h(b-a.x,c-a.y)}return a}},midPoint:{get:function(){this.xj();return this.computeMidPoint(new J)}},midAngle:{\nget:function(){this.xj();return this.computeMidAngle()}},flattenedLengths:{get:function(){if(null===this.$r){this.ud||qp(this);for(var a=this.$r=[],b=this.pointsCount,c=0;c<b-1;c++){var d=this.i(c);var e=this.i(c+1);L.aa(d.x,e.x)?(d=e.y-d.y,0>d&&(d=-d)):L.aa(d.y,e.y)?(d=e.x-d.x,0>d&&(d=-d)):d=Math.sqrt(d.Ie(e));a.push(d)}}return this.$r}},flattenedTotalLength:{get:function(){var a=this.Ru;if(isNaN(a)){for(var b=this.flattenedLengths,\nc=b.length,d=a=0;d<c;d++)a+=b[d];this.Ru=a}return a}},points:{get:function(){return this.Ab},set:function(a){var b=this.Ab;if(b!==a){var c=null;if(Array.isArray(a)){var d=0===a.length%2;if(d)for(var e=0;e<a.length;e++)if(\"number\"!==typeof a[e]||isNaN(a[e])){d=!1;break}if(d)for(c=new E,d=0;d<a.length/2;d++)e=(new J(a[2*d],a[2*d+1])).freeze(),c.add(e);else{d=!0;for(e=0;e<a.length;e++){var f=a[e];if(!za(f)||\"number\"!==typeof f.x||isNaN(f.x)||\"number\"!==typeof f.y||isNaN(f.y)){d=\n!1;break}}if(d)for(c=new E,d=0;d<a.length;d++)e=a[d],c.add((new J(e.x,e.y)).freeze())}}else if(a instanceof E)for(c=a.copy(),a=c.iterator;a.next();)a.value.freeze();else B(\"Link.points value is not an instance of List or Array: \"+a);c.freeze();this.Ab=c;this.dc();qp(this);a=this.diagram;null!==a&&(a.pj||a.undoManager.isUndoingRedoing||a.Yt.add(this),a.animationManager.sc&&(a=a.animationManager,this.jf=c,a.$l.add(this)));this.g(\"points\",b,c)}}},pointsCount:{get:function(){return this.Ab.count}},\nud:{get:function(){return 0!==(this.Ga&16)},set:function(a){0!==(this.Ga&16)!==a&&(this.Ga^=16)}},suspendsRouting:{get:function(){return 0!==(this.Ga&32)},set:function(a){0!==(this.Ga&32)!==a&&(this.Ga^=32)}},Ct:{get:function(){return 0!==(this.Ga&64)},set:function(a){0!==(this.Ga&64)!==a&&(this.Ga^=64)}},defaultFromPoint:{get:function(){return this.u},set:function(a){this.u=a.copy()}},\ndefaultToPoint:{get:function(){return this.I},set:function(a){this.I=a.copy()}},isOrthogonal:{get:function(){return 2===(this.ck.value&2)}},isAvoiding:{get:function(){return 4===(this.ck.value&4)}},$m:{get:function(){return 0!==(this.Ga&128)},set:function(a){0!==(this.Ga&128)!==a&&(this.Ga^=128)}},geometry:{get:function(){this.$m||(this.xj(),this.na=\nthis.makeGeometry());return this.na}},firstPickIndex:{get:function(){return 2>=this.pointsCount?0:this.isOrthogonal||!up(this.computeSpot(!0))?1:0}},lastPickIndex:{get:function(){var a=this.pointsCount;return 0===a?0:2>=a?a-1:this.isOrthogonal||!up(this.computeSpot(!1))?a-2:a-1}},adjusting:{get:function(){return this.Yk},set:function(a){var b=this.Yk;b!==a&&(this.Yk=a,this.g(\"adjusting\",b,a))}},corner:{\nget:function(){return this.Hn},set:function(a){var b=this.Hn;b!==a&&(this.Hn=a,this.dc(),this.g(\"corner\",b,a))}},curve:{get:function(){return this.Jn},set:function(a){var b=this.Jn;b!==a&&(this.Jn=a,this.Ua(),this.dc(),rp(this,b===$f||b===Zf||a===$f||a===Zf),this.g(\"curve\",b,a))}},curviness:{get:function(){return this.Kn},set:function(a){var b=this.Kn;b!==a&&(this.Kn=a,this.Ua(),this.dc(),this.g(\"curviness\",b,a))}},routing:{\nget:function(){return this.ck},set:function(a){var b=this.ck;b!==a&&(this.ck=a,this.Vf=null,this.Ua(),rp(this,2===(b.value&2)||2===(a.value&2)),this.g(\"routing\",b,a))}},smoothness:{get:function(){return this.Zp},set:function(a){var b=this.Zp;b!==a&&(this.Zp=a,this.dc(),this.g(\"smoothness\",b,a))}},key:{get:function(){var a=this.diagram;if(null!==a&&a.model.qj())return a.model.Wb(this.data)}}});\nS.prototype.invalidateOtherJumpOvers=S.prototype.Oq;S.prototype.findClosestSegment=S.prototype.Sz;S.prototype.updateRoute=S.prototype.xj;S.prototype.invalidateRoute=S.prototype.Ua;S.prototype.rollbackRoute=S.prototype.yw;S.prototype.commitRoute=S.prototype.xf;S.prototype.startRoute=S.prototype.Th;S.prototype.clearPoints=S.prototype.pk;S.prototype.removePoint=S.prototype.uw;S.prototype.addPointAt=S.prototype.vf;S.prototype.addPoint=S.prototype.ce;S.prototype.insertPointAt=S.prototype.m;\nS.prototype.insertPoint=S.prototype.wA;S.prototype.setPointAt=S.prototype.L;S.prototype.setPoint=S.prototype.Qc;S.prototype.getPoint=S.prototype.i;S.prototype.getOtherPort=S.prototype.nA;S.prototype.getOtherNode=S.prototype.Kq;\nvar sp=null,tp=null,ip=new D(S,\"Normal\",1),Rp=new D(S,\"Orthogonal\",2),Sp=new D(S,\"AvoidsNodes\",6),Ap=new D(S,\"AvoidsNodesStraight\",7),ag=new D(S,\"None\",0),dg=new D(S,\"Bezier\",9),$f=new D(S,\"JumpGap\",10),Zf=new D(S,\"JumpOver\",11),jp=new D(S,\"End\",17),kp=new D(S,\"Scale\",18),lp=new D(S,\"Stretch\",19),Zm=new D(S,\"OrientAlong\",21),Sm=new D(S,\"OrientPlus90\",22),Um=new D(S,\"OrientMinus90\",23),mp=new D(S,\"OrientOpposite\",24),$m=new D(S,\"OrientUpright\",25),Tm=new D(S,\"OrientPlus90Upright\",26),Vm=new D(S,\"OrientMinus90Upright\",\n27),Wm=new D(S,\"OrientUpright45\",28),Cp=16,Bp=14,Dp=8;S.className=\"Link\";S.Normal=ip;S.Orthogonal=Rp;S.AvoidsNodes=Sp;S.AvoidsNodesStraight=Ap;S.None=ag;S.Bezier=dg;S.JumpGap=$f;S.JumpOver=Zf;S.End=jp;S.Scale=kp;S.Stretch=lp;S.OrientAlong=Zm;S.OrientPlus90=Sm;S.OrientMinus90=Um;S.OrientOpposite=mp;S.OrientUpright=$m;S.OrientPlus90Upright=Tm;S.OrientMinus90Upright=Vm;S.OrientUpright45=Wm;S.EndSegmentStep=8;S.CurvinessStart=Cp;S.SpacingMin=Bp;S.OrthoShortCut=Dp;S.AvoidanceCell=8;S.AvoidanceLimit=999;\nfunction Qp(a,b,c,d){Xa(this);this.se=this.hs=!1;this.au=a;this.My=b;this.lw=c;this.Ny=d;this.links=[]}Qp.prototype.Dm=function(){if(!this.hs){var a=this.links;0<a.length&&(a=a[0].diagram,null!==a&&(a.Tu.add(this),this.se=a.undoManager.isUndoingRedoing))}this.hs=!0};\nQp.prototype.Vw=function(){if(this.hs){this.hs=!1;var a=this.links;if(0<a.length){var b=a[0],c=b.diagram;c=null===c||c.pj&&!this.se;this.se=!1;b.arrangeBundledLinks(a,c);1===a.length&&(b.Mf=null,a.length=0)}0===a.length&&(a=this.au,null!==this&&null!==a.Se&&a.Se.remove(this),a=this.lw,null!==this&&null!==a.Se&&a.Se.remove(this))}};Qp.className=\"LinkBundle\";\nfunction wk(){Xa(this);this.Vy=this.group=null;this.Rt=!0;this.abort=!1;this.Bd=this.Ad=1;this.So=this.Ro=-1;this.gc=this.fc=8;this.Rb=null;this.$i=this.Zi=0;this.Wy=11;this.Gy=124}\nwk.prototype.initialize=function(a){if(!(0>=a.width||0>=a.height)){var b=a.y,c=a.x+a.width,d=a.y+a.height;this.Ad=Math.floor((a.x-this.fc)/this.fc)*this.fc;this.Bd=Math.floor((b-this.gc)/this.gc)*this.gc;this.Ro=Math.ceil((c+2*this.fc)/this.fc)*this.fc;this.So=Math.ceil((d+2*this.gc)/this.gc)*this.gc;a=1+(Math.ceil((this.Ro-this.Ad)/this.fc)|0);b=1+(Math.ceil((this.So-this.Bd)/this.gc)|0);if(null===this.Rb||this.Zi<a-1||this.$i<b-1){c=[];for(d=0;d<=a;d++)c[d]=new Uint32Array(b);this.Rb=c;this.Zi=\na-1;this.$i=b-1}a=Tp;if(null!==this.Rb)for(b=0;b<=this.Zi;b++)if(c=this.Rb[b],c.fill)c.fill(a);else for(d=0;d<=this.$i;d++)c[d]=a}};function Ak(a,b,c){return a.Ad<=b&&b<=a.Ro&&a.Bd<=c&&c<=a.So}function Fp(a,b,c){if(!Ak(a,b,c))return Tp;b-=a.Ad;b/=a.fc;c-=a.Bd;c/=a.gc;return a.Rb[b|0][c|0]}function zk(a){if(null!==a.Rb)for(var b=0;b<=a.Zi;b++)for(var c=a.Rb[b],d=0;d<=a.$i;d++)c[d]>=Ip&&(c[d]=Tp)}\nwk.prototype.Ek=function(a,b,c,d){if(a>this.Ro||a+c<this.Ad||b>this.So||b+d<this.Bd)return!0;a=(a-this.Ad)/this.fc|0;b=(b-this.Bd)/this.gc|0;c=Math.max(0,c)/this.fc+1|0;var e=Math.max(0,d)/this.gc+1|0;0>a&&(c+=a,a=0);0>b&&(e+=b,b=0);if(0>c||0>e)return!0;d=Math.min(a+c-1,this.Zi)|0;for(c=Math.min(b+e-1,this.$i)|0;a<=d;a++){e=this.Rb[a];for(var f=b;f<=c;f++)if(e[f]===Bk)return!1}return!0};\nfunction Up(a,b,c,d,e,f,g,h,k){if(!(b<f||b>g||c<h||c>k)){var l=b|0;var m=c|0;var n=a.Rb[l][m];if(n>=Ip&&n<Gp)for(e?m+=d:l+=d,n+=1;f<=l&&l<=g&&h<=m&&m<=k&&!(n>=a.Rb[l][m]);)a.Rb[l][m]=n,n+=1,e?m+=d:l+=d;l=e?m:l;if(e)if(0<d)for(c+=d;c<l;c+=d)Up(a,b,c,1,!e,f,g,h,k),Up(a,b,c,-1,!e,f,g,h,k);else for(c+=d;c>l;c+=d)Up(a,b,c,1,!e,f,g,h,k),Up(a,b,c,-1,!e,f,g,h,k);else if(0<d)for(b+=d;b<l;b+=d)Up(a,b,c,1,!e,f,g,h,k),Up(a,b,c,-1,!e,f,g,h,k);else for(b+=d;b>l;b+=d)Up(a,b,c,1,!e,f,g,h,k),Up(a,b,c,-1,!e,f,g,h,\nk)}}function Vp(a,b,c,d,e,f,g,h,k){b|=0;c|=0;var l=Bk,m=Ip;for(a.Rb[b][c]=m;l===Bk&&b>f&&b<g&&c>h&&c<k;)m+=1,a.Rb[b][c]=m,e?c+=d:b+=d,l=a.Rb[b][c]}function Wp(a,b,c,d,e,f,g,h,k){b|=0;c|=0;var l=Bk,m=Gp;for(a.Rb[b][c]=m;l===Bk&&b>f&&b<g&&c>h&&c<k;)a.Rb[b][c]=m,e?c+=d:b+=d,l=a.Rb[b][c]}\nfunction Ep(a,b,c,d,e,f,g){if(null!==a.Rb){a.abort=!1;var h=b.x,k=b.y;if(Ak(a,h,k)){h-=a.Ad;h/=a.fc;k-=a.Bd;k/=a.gc;var l=d.x,m=d.y;if(Ak(a,l,m))if(l-=a.Ad,l/=a.fc,m-=a.Bd,m/=a.gc,1>=Math.abs(h-l)&&1>=Math.abs(k-m))a.abort=!0;else{var n=f.x;d=f.y;b=f.x+f.width;var p=f.y+f.height;n-=a.Ad;n/=a.fc;d-=a.Bd;d/=a.gc;b-=a.Ad;b/=a.fc;p-=a.Bd;p/=a.gc;f=Math.max(0,Math.min(a.Zi,n|0));b=Math.min(a.Zi,Math.max(0,b|0));n=Math.max(0,Math.min(a.$i,d|0));p=Math.min(a.$i,Math.max(0,p|0));d=a.Rb;h|=0;k|=0;l|=0;m|=\n0;var r=0===c||90===c?1:-1;c=90===c||270===c;d[h][k]===Bk?(Vp(a,h,k,r,c,f,b,n,p),Vp(a,h,k,1,!c,f,b,n,p),Vp(a,h,k,-1,!c,f,b,n,p)):Vp(a,h,k,r,c,h,k,h,k);d[l][m]===Bk?(Wp(a,l,m,0===e||90===e?1:-1,90===e||270===e,f,b,n,p),Wp(a,l,m,1,!(90===e||270===e),f,b,n,p),Wp(a,l,m,-1,!(90===e||270===e),f,b,n,p)):Wp(a,l,m,r,c,l,m,l,m);c=Ea();if(g&&Xp(a,l,m,e,h,k,c)){if(c[0]!==l||c[1]!==m)c.unshift(m),c.unshift(l);if(c[c.length-2]!==h||c[c.length-1]!==k)c.push(h),c.push(k);a=Ip;e=c[c.length-2];g=c[c.length-1];d[e][g]=\na++;for(f=c.length-4;0<=f;f-=2)for(e=c[f+2],g=c[f+3],b=c[f],l=c[f+1];b>e?e++:b<e?e--:l>g?g++:l<g&&g--,d[e][g]=a++,e!==b||g!==l;);}else Up(a,h,k,1,!1,f,b,n,p),Up(a,h,k,-1,!1,f,b,n,p),Up(a,h,k,1,!0,f,b,n,p),Up(a,h,k,-1,!0,f,b,n,p);Ia(c)}}}}\nfunction Xp(a,b,c,d,e,f,g){for(var h=a.Rb,k=b,l=c;;){if(k===e&&l===f)return!0;var m=k,n=l;if(0===d)if(m<e)m++;else break;else if(90===d)if(n<f)n++;else break;else if(180===d)if(m>e)m--;else break;else if(n>f)n--;else break;var p=h[m][n];if(0===p||p===Yp)break;k=m;l=n}for(;;){m=d;n=k;p=l;0===d?p<f?(m=90,p++):p>f&&(m=270,p--):90===d?n<e?(m=0,n++):n>e&&(m=180,n--):180===d?p<f?(m=90,p++):p>f&&(m=270,p--):n<e?(m=0,n++):n>e&&(m=180,n--);n=h[n][p];if(m!==d&&0!==n&&n!==Yp){g.push(k);g.push(l);if(Xp(a,k,l,\nm,e,f,g))return!0;g.pop();g.pop()}h[k][l]=Yp;if(0===d){if(k===b)return!1;k--}else if(90===d){if(l===c)return!1;l--}else if(180===d){if(k===b)return!1;k++}else{if(l===c)return!1;l++}}}\nna.Object.defineProperties(wk.prototype,{bounds:{get:function(){return new N(this.Ad,this.Bd,this.Ro-this.Ad,this.So-this.Bd)}},zq:{get:function(){return this.fc},set:function(a){0<a&&a!==this.fc&&(this.fc=a,this.initialize(this.bounds))}},yq:{get:function(){return this.gc},set:function(a){0<a&&a!==this.gc&&(this.gc=a,this.initialize(this.bounds))}}});var Bk=0,Ip=1,Gp=999999,Tp=Gp+1,Yp=Gp+2;wk.className=\"PositionArray\";\nfunction yp(){Xa(this);this.port=this.node=null;this.de=[];this.Sq=!1}yp.prototype.toString=function(){for(var a=this.de,b=this.node.toString()+\" \"+a.length.toString()+\":\",c=0;c<a.length;c++){var d=a[c];null!==d&&(b+=\"\\n  \"+d.toString())}return b};\nfunction Zp(a,b,c,d){b=b.offsetY;switch(b){case 8:return 90;case 2:return 180;case 1:return 270;case 4:return 0}switch(b){case 9:return 180<c?270:90;case 6:return 90<c&&270>=c?180:0}a=180*Math.atan2(a.height,a.width)/Math.PI;switch(b){case 3:return c>a&&c<=180+a?180:270;case 5:return c>180-a&&c<=360-a?270:0;case 12:return c>a&&c<=180+a?90:0;case 10:return c>180-a&&c<=360-a?180:90;case 7:return 90<c&&c<=180+a?180:c>180+a&&c<=360-a?270:0;case 13:return 180<c&&c<=360-a?270:c>a&&180>=c?90:0;case 14:return c>\na&&c<=180-a?90:c>180-a&&270>=c?180:0;case 11:return c>180-a&&c<=180+a?180:c>180+a?270:90}d&&15!==b&&(c-=15,0>c&&(c+=360));return c>a&&c<180-a?90:c>=180-a&&c<=180+a?180:c>180+a&&c<360-a?270:0}yp.prototype.Dm=function(){this.de.length=0};\nfunction zp(a,b){var c=a.de;if(0===c.length){a:if(!a.Sq){c=a.Sq;a.Sq=!0;var d=null,e=a.node,f=e instanceof U?e:null;if(null===f||f.isSubGraphExpanded)var g=e.isTreeExpanded?e.findLinksConnected(a.port.portId):e.py();else{if(!f.actualBounds.s()){a.Sq=c;break a}d=f;g=d.Rv()}f=a.de.length=0;var h=a.port.da(tc,J.alloc()),k=a.port.da(Dc,J.alloc());e=N.allocAt(h.x,h.y,0,0);e.Oe(k);J.free(h);J.free(k);h=J.allocAt(e.x+e.width/2,e.y+e.height/2);k=a.port.lj();for(g=g.iterator;g.next();){var l=g.value;if(l.isVisible()&&\nl.fromPort!==l.toPort){var m=l.fromPort===a.port||null!==l.fromNode&&l.fromNode.Kd(d),n=l.computeSpot(m,a.port);if(n.Oc()){var p=m?l.toPort:l.fromPort;if(null!==p&&(m=p.part,null!==m)){var r=m.findVisibleNode();null!==r&&r!==m&&(m=r,p=m.port);m=l.computeOtherPoint(m,p);p=h.Pa(p.da(zc));p+=(h.Pa(m)-p)/360;p-=k;0>p?p+=360:360<=p&&(p-=360);n=Zp(e,n,p,l.isOrthogonal);0===n?(n=4,180<p&&(p-=360)):90===n?(n=8,270<p&&(p-=360)):180===n?n=2:(n=1,90>p&&(p+=360));r=a.de[f];void 0===r?(r=new $p(l,p,n),a.de[f]=\nr):(r.link=l,r.angle=p,r.Ac=n);r.ow.set(m);f++}}}}J.free(h);a.de.sort(yp.prototype.l);k=a.de.length;d=-1;for(f=h=0;f<k;f++)g=a.de[f],void 0!==g&&(g.Ac!==d&&(d=g.Ac,h=0),g.Lq=h,h++);d=-1;h=0;for(f=k-1;0<=f;f--)k=a.de[f],void 0!==k&&(k.Ac!==d&&(d=k.Ac,h=k.Lq+1),k.wm=h);f=a.de;n=a.port;d=a.node.portSpreading;h=J.alloc();k=J.alloc();g=J.alloc();l=J.alloc();n.da(tc,h);n.da(vc,k);n.da(Dc,g);n.da(Bc,l);r=p=m=n=0;if(d===fp)for(var q=0;q<f.length;q++){var u=f[q];if(null!==u){var w=u.link.computeThickness();\nswitch(u.Ac){case 8:p+=w;break;case 2:r+=w;break;case 1:n+=w;break;default:case 4:m+=w}}}var v=q=0,y=1,z=u=0;for(w=0;w<f.length;w++){var A=f[w];if(null!==A){if(q!==A.Ac){q=A.Ac;switch(q){case 8:var C=g;v=l;break;case 2:C=l;v=h;break;case 1:C=h;v=k;break;default:case 4:C=k,v=g}u=v.x-C.x;z=v.y-C.y;switch(q){case 8:p>Math.abs(u)?(y=Math.abs(u)/p,p=Math.abs(u)):y=1;break;case 2:r>Math.abs(z)?(y=Math.abs(z)/r,r=Math.abs(z)):y=1;break;case 1:n>Math.abs(u)?(y=Math.abs(u)/n,n=Math.abs(u)):y=1;break;default:case 4:m>\nMath.abs(z)?(y=Math.abs(z)/m,m=Math.abs(z)):y=1}v=0}var F=A.Qq;if(d===fp){A=A.link.computeThickness();A*=y;F.set(C);switch(q){case 8:F.x=C.x+u/2+p/2-v-A/2;break;case 2:F.y=C.y+z/2+r/2-v-A/2;break;case 1:F.x=C.x+u/2-n/2+v+A/2;break;default:case 4:F.y=C.y+z/2-m/2+v+A/2}v+=A}else{var Q=.5;d===So&&(Q=(A.Lq+1)/(A.wm+1));F.x=C.x+u*Q;F.y=C.y+z*Q}}}J.free(h);J.free(k);J.free(g);J.free(l);C=a.de;for(f=0;f<C.length;f++)d=C[f],null!==d&&(d.Pv=a.computeEndSegmentLength(d));a.Sq=c;N.free(e)}c=a.de}for(a=0;a<c.length;a++)if(e=\nc[a],null!==e&&e.link===b)return e;return null}yp.prototype.l=function(a,b){return a===b?0:null===a?-1:null===b?1:a.Ac<b.Ac?-1:a.Ac>b.Ac?1:a.angle<b.angle?-1:a.angle>b.angle?1:0};\nyp.prototype.computeEndSegmentLength=function(a){var b=a.link,c=b.computeEndSegmentLength(this.node,this.port,sc,b.fromPort===this.port),d=a.Lq;if(0>d)return c;var e=a.wm;if(1>=e||!b.isOrthogonal)return c;b=a.ow;var f=a.Qq;if(2===a.Ac||8===a.Ac)d=e-1-d;return((a=2===a.Ac||4===a.Ac)?b.y<f.y:b.x<f.x)?c+8*d:(a?b.y===f.y:b.x===f.x)?c:c+8*(e-1-d)};yp.className=\"Knot\";function $p(a,b,c){this.link=a;this.angle=b;this.Ac=c;this.ow=new J;this.wm=this.Lq=0;this.Qq=new J;this.Pv=0}\n$p.prototype.toString=function(){return this.link.toString()+\" \"+this.angle.toString()+\" \"+this.Ac.toString()+\":\"+this.Lq.toString()+\"/\"+this.wm.toString()+\" \"+this.Qq.toString()+\" \"+this.Pv.toString()+\" \"+this.ow.toString()};$p.className=\"LinkInfo\";function jl(){this.Ch=this.bh=Vc;this.Bh=this.ah=this.Ah=this.$g=NaN;this.kq=this.co=null;this.lq=this.eo=Infinity}\njl.prototype.copy=function(){var a=new jl;a.bh=this.bh.H();a.Ch=this.Ch.H();a.$g=this.$g;a.Ah=this.Ah;a.ah=this.ah;a.Bh=this.Bh;a.co=this.co;a.kq=this.kq;a.eo=this.eo;a.lq=this.lq;return a};jl.className=\"LinkSettings\";function Ai(){Xa(this);this.u=this.C=null;this.zi=this.xo=!0;this.Co=!1;this.nn=(new J(0,0)).freeze();this.zo=!0;this.vn=this.yo=null;this.Bo=!1;this.l=null;this.I=0;this.To=this.qq=null;this.wt=!1;this.yg=this.ek=null;this.lt=!1}\nAi.prototype.cloneProtected=function(a){a.xo=this.xo;a.zi=this.zi;a.Co=this.Co;a.nn.assign(this.nn);a.zo=this.zo;a.yo=this.yo;a.vn=this.vn;a.Bo=!0;a.To=this.To;a.qq=this.qq};Ai.prototype.copy=function(){var a=new this.constructor;this.cloneProtected(a);return a};Ai.prototype.serializeLayoutProperties=function(a){a.arrangementOrigin={x:this.arrangementOrigin.x,y:this.arrangementOrigin.y};a.isRouting=this.isRouting};\nAi.prototype.deserializeLayoutProperties=function(a){null!==a&&(this.arrangementOrigin=new J(a.arrangementOrigin.x,a.arrangementOrigin.y),this.isRouting=a.isRouting)};Ai.prototype.jb=function(){};Ai.prototype.toString=function(){var a=Ja(this.constructor);a+=\"(\";null!==this.group&&(a+=\" in \"+this.group);null!==this.diagram&&(a+=\" for \"+this.diagram);return a+\")\"};\nAi.prototype.B=function(){if(this.isValidLayout){var a=this.diagram;if(null!==a&&!a.undoManager.isUndoingRedoing){var b=a.animationManager;!b.isTicking&&(b.defaultAnimation.isAnimating&&b.Bc(),this.isOngoing&&a.pj||this.isInitial&&!a.pj)&&(this.isValidLayout=!1,a.Db())}}};Ai.prototype.createNetwork=function(){return new aq(this)};Ai.prototype.makeNetwork=function(a){var b=this.createNetwork();a instanceof R?(b.Ag(a.nodes,!0),b.Ag(a.links,!0)):a instanceof U?b.Ag(a.memberParts):b.Ag(a.iterator);return b};\nAi.prototype.updateParts=function(){this.isValidLayout=!0;if(!this.workerLayout()){var a=this.diagram;if(null===a&&null!==this.network)for(var b=this.network.vertexes.iterator;b.next();){var c=b.value.node;if(null!==c&&(a=c.diagram,null!==a))break}try{null!==a&&a.va(\"Layout\"),this.commitLayout()}finally{null!==a&&a.Xa(\"Layout\")}}};Ai.prototype.commitLayout=function(){if(null!==this.network){for(var a=this.network.vertexes.iterator;a.next();)a.value.commit();if(this.isRouting)for(a=this.network.edges.iterator;a.next();)a.value.commit()}};\nAi.prototype.doLayout=function(a){var b=new G;a instanceof R?(bq(this,b,a.nodes,!0,this.Rh,!0,!1,!0),bq(this,b,a.parts,!0,this.Rh,!0,!1,!0)):a instanceof U?bq(this,b,a.memberParts,!1,this.Rh,!0,!1,!0):b.addAll(a.iterator);0<b.count&&(a=this.diagram,null!==a&&a.va(\"Layout\"),this.doMinimalNoNetworkLayout(b),null!==a&&a.Xa(\"Layout\"));this.isValidLayout=!0};\nAi.prototype.doMinimalNoNetworkLayout=function(a){var b=Math.ceil(Math.sqrt(a.count));this.arrangementOrigin=this.initialOrigin(this.arrangementOrigin);var c=this.arrangementOrigin.x,d=c,e=this.arrangementOrigin.y,f=0,g=0;for(a=a.iterator;a.next();){var h=a.value;cq(h);var k=h.measuredBounds,l=k.width;k=k.height;h.moveTo(d,e);h instanceof U&&(h.Rh=!1);d+=Math.max(l,50)+20;g=Math.max(g,Math.max(k,50));f>=b-1?(f=0,d=c,e+=g+20,g=0):f++}};\nAi.prototype.doMinimalNetworkLayout=function(){var a=Math.ceil(Math.sqrt(this.network.vertexes.count));this.arrangementOrigin=this.initialOrigin(this.arrangementOrigin);for(var b=this.arrangementOrigin.x,c=b,d=this.arrangementOrigin.y,e=0,f=0,g=this.network.vertexes.iterator;g.next();){var h=g.value.node;if(!(null===h||h instanceof S)&&(cq(h),this.Rh(h))){var k=h.measuredBounds,l=k.width;k=k.height;h.moveTo(c,d);h instanceof U&&(h.Rh=!1);c+=Math.max(l,50)+20;f=Math.max(f,Math.max(k,50));e>=a-1?(e=\n0,c=b,d+=f+20,f=0):e++}}};Ai.prototype.Rh=function(a){return!a.location.s()||a instanceof U&&a.Rh?!0:!1};function bq(a,b,c,d,e,f,g,h){for(c=c.iterator;c.next();){var k=c.value;d&&!k.isTopLevel||null!==e&&!e(k)||!k.canLayout()||(f&&k instanceof W?k.isLinkLabel||(k instanceof U?null===k.layout?bq(a,b,k.memberParts,!1,e,f,g,h):(cq(k),b.add(k)):(cq(k),b.add(k))):g&&k instanceof S?b.add(k):!h||!k.Nc()||k instanceof W||(cq(k),b.add(k)))}}\nfunction cq(a){var b=a.actualBounds;(0===b.width||0===b.height||isNaN(b.width)||isNaN(b.height))&&a.Ta()}Ai.prototype.nj=function(a,b){var c=this.boundsComputation;if(null!==c)return b||(b=new N),c(a,this,b);if(!b)return a.actualBounds;b.set(a.actualBounds);return b};\nAi.prototype.$x=function(a){var b=new G;a instanceof R?(bq(this,b,a.nodes,!0,null,!0,!0,!0),bq(this,b,a.links,!0,null,!0,!0,!0),bq(this,b,a.parts,!0,null,!0,!0,!0)):a instanceof U?bq(this,b,a.memberParts,!1,null,!0,!0,!0):bq(this,b,a.iterator,!1,null,!0,!0,!0);return b};\nAi.prototype.initialOrigin=function(a){var b=this.group;if(null!==b){var c=b.position.copy();(isNaN(c.x)||isNaN(c.y))&&c.set(a);b=b.placeholder;null!==b&&(c=b.da(tc),(isNaN(c.x)||isNaN(c.y))&&c.set(a),a=b.padding,c.x+=a.left,c.y+=a.top);return c}return a};Ai.prototype.mayUseWorker=function(){return this.mayUseWorkerFunction?this.mayUseWorkerFunction(this):!1};Ai.prototype.workerLayout=function(){return!1};\nfunction dq(a,b){if(null!==a.workerStateChanged){var c={key:a.group?a.group.key:null};void 0!==b&&(c.time=b);null!==a.ek&&(c.running=eq(a.ek));null!==a.yg&&(c.waiting=eq(a.yg));a.workerStateChanged(c,a)}}function eq(a){return{vertexes:a.vertexes.count,edges:a.edges.count}}Ai.prototype.zz=function(){var a=fq(this.constructor);a&&(null!==a.Pe&&a.Pe.terminate(),a.Pe=null,a.Fm.iteratorValues.each(function(a){a.wt=!1;a.ek=null;a.yg=null;a.lt=!1;dq(a)}),a.Fm.clear())};\nfunction gq(a,b){var c=fq(a);if(c){if(b)for(var d in b)c[d]=b[d]}else throw Error(\"Unknown Layout class: \"+a);}function fq(a){var b=null;if(\"function\"===typeof a){if(b=hq.get(a),!b){var c=Ja(a);b=hq.get(c);b||(b=new iq,b.Lv=a,b.name=c,b.l=a.name,b.Cy=jq,hq.set(c,b),hq.set(a,b),hq.set(a.name,b))}}else\"string\"===typeof a&&(b=hq.get(a));return b}\nAi.prototype.Uw=function(){if(\"undefined\"===typeof Worker||!kq||\"undefined\"===typeof self||\"undefined\"!==typeof self.DedicatedWorkerGlobalScope)return!1;if(!this.mayUseWorker())return this.wt&&(this.lt=!0,this.yg=this.ek=null,dq(this)),!1;var a=fq(this.constructor);if(null===a)return!1;null===a.Pe&&(a.Pe=new Worker(kq),a.Pe.onerror=function(a){a.preventDefault();xa(\"Worker Error at: \"+a.filename+\" \"+a.lineno+\" \"+a.colno+\"\\n  \"+a.message)},a.Pe.l=function(a){xa(\"Worker serialization error: \"+a)},a.Pe.onmessage=\nfunction(b){var c=b.data;if(\"_GoJS\"===c._GoJS)if(c.version&&R.version&&c.version!==R.version)xa(\"Failure: GoJS v\"+R.version+\"  Worker v\"+c.version);else if(b=a.Fm.get(c.id)){a.Fm.remove(c.id);b.wt=!1;b.ek=null;if(b.lt)b.lt=!1,b.yg=null;else{var d=lq(b,c,!1);b.network=d;b.updateParts();b.network=null;b.isValidLayout=!0}dq(b,c.time);c=b.yg;if(null!==c)b.yg=null;else for(d=a.Fm.iteratorValues;d.next();){var e=d.value;c=e.yg;if(null!==c){e.yg=null;break}}null!==c&&mq(b,c)}},a.Pe.postMessage({_GoJS:\"_GoJS\",\nurl:a.Cy}),Array.isArray(a.scripts)&&a.scripts.forEach(function(b){a.Pe.postMessage({_GoJS:\"_GoJS\",url:b})}),a.Pe.postMessage({_GoJS:\"_GoJS\",version:-1}));null!==this.ek?this.yg=this.network:mq(this,this.network);dq(this);this.doMinimalNetworkLayout();this.network=null;return this.isValidLayout=!0};function mq(a,b){a.wt=!0;var c=fq(a.constructor),d=nq(a,b,!0);d._GoJS=\"_GoJS\";c.Pe.postMessage(d);c.Fm.set(kb(a),a);a.ek=b}\nfunction nq(a,b,c){a.onNetworkSerialization(1,c,b,null);var d={};a.serializeLayoutProperties(d,c);var e=[];b.vertexes.each(function(a){var b={};a.serializeVertexProperties(b,c);e.push(b)});var f=[];b.edges.each(function(a){var b={};a.serializeEdgeProperties(b,c);f.push(b)});d={id:c?kb(a):a.id,layout:Ja(a.constructor),p:d,jB:e,Qz:f};a.onNetworkSerialization(2,c,b,d);return d}\nfunction lq(a,b,c){c&&(a.id=b.id);var d=a.diagram,e=a.createNetwork();a.onNetworkSerialization(3,c,e,b);var f=b.jB,g=new H;f&&f.forEach(function(a){var b=null;null===a.key||null===d||c||(b=d.Cb(a.key));null!==b?b=e.mk(b):(b=e.createVertex(),e.Bg(b));c&&null!==a.key&&(b.data={Di:a.key});g.set(a.id,b)});var h=b.Qz,k=new H;h&&h.forEach(function(a){var b=null;null===a.key||null===d||c||(b=d.findLinkForKey(a.key));var f=e.createEdge();e.tm(f);f.link=b;c&&null!==a.key&&(f.data={Di:a.key});k.set(a.id,f)});\nf&&f.forEach(function(a){var b=g.get(a.id);b&&b.Cq(a,g,k,c)});h&&h.forEach(function(a){var b=k.get(a.id);b&&b.deserializeEdgeProperties(a,g,k,c)});a.deserializeLayoutProperties(b.p,g,k,c,e);a.onNetworkSerialization(4,c,e,b);return e}Ai.prototype.onNetworkSerialization=function(){};\nna.Object.defineProperties(Ai.prototype,{diagram:{get:function(){return this.C},set:function(a){this.C=a}},group:{get:function(){return this.u},set:function(a){this.u!==a&&(this.u=a,null!==a&&(this.C=a.diagram))}},isOngoing:{get:function(){return this.xo},set:function(a){this.xo!==a&&(this.xo=a)}},isInitial:{get:function(){return this.zi},set:function(a){this.zi=a;a||(this.Bo=!0)}},\nisViewportSized:{get:function(){return this.Co},set:function(a){this.Co!==a&&(this.Co=a)&&this.B()}},isRouting:{get:function(){return this.zo},set:function(a){this.zo!==a&&(this.zo=a)}},isRealtime:{get:function(){return this.yo},set:function(a){this.yo!==a&&(this.yo=a)}},isValidLayout:{get:function(){return this.Bo},set:function(a){this.Bo!==a&&(this.Bo=a,a||(a=this.diagram,null!==\na&&(a.Ng=!0)))}},network:{get:function(){return this.l},set:function(a){this.l!==a&&(this.l=a,null!==a&&(a.layout=this))}},boundsComputation:{get:function(){return this.vn},set:function(a){this.vn!==a&&(this.vn=a,this.B())}},arrangementOrigin:{get:function(){return this.nn},set:function(a){this.nn.w(a)||(this.nn.assign(a),this.B())}},id:{get:function(){return this.I},set:function(a){this.I=\na}},mayUseWorkerFunction:{get:function(){return this.To},set:function(a){this.To!==a&&(this.To=a)}},workerStateChanged:{get:function(){return this.qq},set:function(a){this.qq!==a&&(this.qq=a)}}});Ai.prototype.useWorker=Ai.prototype.Uw;Ai.declareWorkerLayout=gq;Ai.prototype.cancelWorker=Ai.prototype.zz;Ai.prototype.collectParts=Ai.prototype.$x;Ai.prototype.getLayoutBounds=Ai.prototype.nj;Ai.prototype.invalidateLayout=Ai.prototype.B;\nvar hq=new H,jq=\"object\"===typeof x.document&&x.document.currentScript?x.document.currentScript.src:\"\",kq=\"undefined\"!==typeof URL&&\"function\"===typeof URL.createObjectURL&&\"function\"===typeof Blob?URL.createObjectURL(new Blob([\"self.onmessage=function(e){if(e.data.url){\\nimportScripts(e.data.url);}}\"],{type:\"text/javascript\"})):\"\";Ai.className=\"Layout\";Ai.GoJSScriptURL=jq;Ai.declareWorkerLayout=gq;\n\"undefined\"!==typeof self&&\"undefined\"!==typeof self.DedicatedWorkerGlobalScope&&\"undefined\"!==typeof self&&\"undefined\"!==typeof self.DedicatedWorkerGlobalScope&&(self.onmessage=function(a){a=a.data;if(\"_GoJS\"===a._GoJS)if(a.url)importScripts(a.url);else if(a.version)self.postMessage({_GoJS:\"_GoJS\",version:R.version},void 0);else{var b=performance.now(),c=null;a.layout&&(c=fq(a.layout));var d=null;c&&c.Lv&&(d=new c.Lv);if(!d)throw Error(\"no registered Worker Layout: \"+a.layout);d.network=lq(d,a,!0);\nd.workerLayout=function(){var a=nq(d,d.network,!1);a._GoJS=\"_GoJS\";a.time=performance.now()-b;self.postMessage(a,void 0);return!0};d.doLayout(new E)}});function iq(){this.Lv=null;this.Cy=this.l=this.name=\"\";this.scripts=[];this.Pe=null;this.Fm=new H}function aq(a){Xa(this);this.kc=a;this.tf=new G;this.le=new G;this.bu=new H;this.Xt=new H}\naq.prototype.clear=function(){if(this.tf)for(var a=this.tf.iterator;a.next();)a.value.clear();if(this.le)for(a=this.le.iterator;a.next();)a.value.clear();this.tf=new G;this.le=new G;this.bu=new H;this.Xt=new H};\naq.prototype.toString=function(a){void 0===a&&(a=0);var b=\"LayoutNetwork\"+(null!==this.layout?\"(\"+this.layout.toString()+\")\":\"\");if(0>=a)return b;b+=\" vertexes: \"+this.tf.count+\" edges: \"+this.le.count;if(1<a){for(var c=this.tf.iterator;c.next();)b+=\"\\n    \"+c.value.toString(a-1);for(c=this.le.iterator;c.next();)b+=\"\\n    \"+c.value.toString(a-1)}return b};aq.prototype.createVertex=function(){return new oq(this)};aq.prototype.createEdge=function(){return new pq(this)};\naq.prototype.Ag=function(a,b,c){if(null!==a){void 0===b&&(b=!1);void 0===c&&(c=null);null===c&&(c=function(a){if(a instanceof W)return!a.isLinkLabel;if(a instanceof S){var b=a.fromNode;if(null===b||b.isLinkLabel)return!1;a=a.toNode;return null===a||a.isLinkLabel?!1:!0}return!1});for(a=a.iterator;a.next();){var d=a.value;if(d instanceof W&&(!b||d.isTopLevel)&&d.canLayout()&&c(d))if(d instanceof U&&null===d.layout)this.Ag(d.memberParts,!1);else if(null===this.kj(d)){var e=this.createVertex();e.node=\nd;this.Bg(e)}}for(a.reset();a.next();)if(d=a.value,d instanceof S&&(!b||d.isTopLevel)&&d.canLayout()&&c(d)&&null===this.Eq(d)){var f=d.fromNode;e=d.toNode;null!==f&&null!==e&&f!==e&&(f=this.findGroupVertex(f),e=this.findGroupVertex(e),null!==f&&null!==e&&this.Fk(f,e,d))}}};aq.prototype.findGroupVertex=function(a){if(null===a)return null;var b=a.findVisibleNode();if(null===b)return null;a=this.kj(b);if(null!==a)return a;for(b=b.containingGroup;null!==b;){a=this.kj(b);if(null!==a)return a;b=b.containingGroup}return null};\nt=aq.prototype;t.Bg=function(a){if(null!==a){this.tf.add(a);var b=a.node;null!==b&&this.bu.add(b,a);a.network=this}};t.mk=function(a){if(null===a)return null;var b=this.kj(a);null===b&&(b=this.createVertex(),b.node=a,this.Bg(b));return b};t.Ov=function(a){if(null!==a&&qq(this,a)){for(var b=a.td,c=b.count-1;0<=c;c--){var d=b.J(c);this.vk(d)}b=a.Gd;for(a=b.count-1;0<=a;a--)c=b.J(a),this.vk(c)}};\nfunction qq(a,b){if(null===b)return!1;var c=a.tf.remove(b);c&&(b=b.node,null!==b&&a.bu.remove(b));return c}t.Lz=function(a){null!==a&&(a=this.kj(a),null!==a&&this.Ov(a))};t.kj=function(a){return null===a?null:this.bu.G(a)};t.tm=function(a){if(null!==a){rq(this,a);var b=a.toVertex;null!==b&&b.Ev(a);b=a.fromVertex;null!==b&&b.Cv(a)}};function rq(a,b){if(null!==b){a.le.add(b);var c=b.link;null!==c&&null===a.Eq(c)&&a.Xt.add(c,b);b.network=a}}\nt.oz=function(a){if(null===a)return null;var b=a.fromNode,c=a.toNode,d=this.Eq(a);null===d?(d=this.createEdge(),d.link=a,null!==b&&(d.fromVertex=this.mk(b)),null!==c&&(d.toVertex=this.mk(c)),this.tm(d)):(null!==b?d.fromVertex=this.mk(b):d.fromVertex=null,null!==c?d.toVertex=this.mk(c):d.toVertex=null);return d};t.vk=function(a){if(null!==a){var b=a.toVertex;null!==b&&b.Nv(a);b=a.fromVertex;null!==b&&b.Mv(a);sq(this,a)}};\nfunction sq(a,b){null!==b&&a.le.remove(b)&&(b=b.link,null!==b&&a.Xt.remove(b))}t.Kz=function(a){null!==a&&(a=this.Eq(a),null!==a&&this.vk(a))};t.Eq=function(a){return null===a?null:this.Xt.G(a)};t.Fk=function(a,b,c){if(null===a||null===b)return null;if(a.network===this&&b.network===this){var d=this.createEdge();d.link=c;d.fromVertex=a;d.toVertex=b;this.tm(d);return d}return null};t.Rm=function(a){if(null!==a){var b=a.fromVertex,c=a.toVertex;null!==b&&null!==c&&(b.Mv(a),c.Nv(a),a.Rm(),b.Ev(a),c.Cv(a))}};\nt.Bq=function(){for(var a=Ea(),b=this.le.iterator;b.next();){var c=b.value;c.fromVertex===c.toVertex&&a.push(c)}b=a.length;for(c=0;c<b;c++)this.vk(a[c]);Ia(a)};aq.prototype.deleteArtificialVertexes=function(){for(var a=Ea(),b=this.tf.iterator;b.next();){var c=b.value;null===c.node&&null===c.data&&a.push(c)}c=a.length;for(b=0;b<c;b++)this.Ov(a[b]);b=Ea();for(c=this.le.iterator;c.next();){var d=c.value;null===d.link&&null===d.data&&b.push(d)}c=b.length;for(d=0;d<c;d++)this.vk(b[d]);Ia(a);Ia(b)};\nfunction tq(a){for(var b=Ea(),c=a.le.iterator;c.next();){var d=c.value;null!==d.fromVertex&&null!==d.toVertex||b.push(d)}c=b.length;for(d=0;d<c;d++)a.vk(b[d]);Ia(b)}\naq.prototype.Xy=function(a){void 0===a&&(a=!0);a&&(this.deleteArtificialVertexes(),tq(this),this.Bq());a=new E;for(var b=!0;b;){b=!1;for(var c=this.tf.iterator;c.next();){var d=c.value;if(0<d.td.count||0<d.Gd.count){b=this.layout.createNetwork();a.add(b);uq(this,b,d);b=!0;break}}}a.sort(function(a,b){return null===a||null===b||a===b?0:b.vertexes.count-a.vertexes.count});return a};\nfunction uq(a,b,c){if(null!==c&&c.network!==b){qq(a,c);b.Bg(c);for(var d=c.sourceEdges;d.next();){var e=d.value;e.network!==b&&(sq(a,e),rq(b,e),uq(a,b,e.fromVertex))}for(d=c.destinationEdges;d.next();)c=d.value,c.network!==b&&(sq(a,c),rq(b,c),uq(a,b,c.toVertex))}}aq.prototype.Rz=function(){for(var a=new G,b=this.tf.iterator;b.next();)a.add(b.value.node);for(b=this.le.iterator;b.next();)a.add(b.value.link);return a};\nna.Object.defineProperties(aq.prototype,{layout:{get:function(){return this.kc},set:function(a){null!==a&&(this.kc=a)}},vertexes:{get:function(){return this.tf}},edges:{get:function(){return this.le}}});aq.prototype.findAllParts=aq.prototype.Rz;aq.prototype.splitIntoSubNetworks=aq.prototype.Xy;aq.prototype.deleteSelfEdges=aq.prototype.Bq;aq.prototype.reverseEdge=aq.prototype.Rm;aq.prototype.linkVertexes=aq.prototype.Fk;\naq.prototype.findEdge=aq.prototype.Eq;aq.prototype.deleteLink=aq.prototype.Kz;aq.prototype.deleteEdge=aq.prototype.vk;aq.prototype.addLink=aq.prototype.oz;aq.prototype.addEdge=aq.prototype.tm;aq.prototype.findVertex=aq.prototype.kj;aq.prototype.deleteNode=aq.prototype.Lz;aq.prototype.deleteVertex=aq.prototype.Ov;aq.prototype.addNode=aq.prototype.mk;aq.prototype.addVertex=aq.prototype.Bg;aq.prototype.addParts=aq.prototype.Ag;aq.className=\"LayoutNetwork\";\nfunction oq(a){Xa(this);this.Tc=a;this.l=(new N(0,0,10,10)).freeze();this.u=(new J(5,5)).freeze();this.Mi=this.ob=null;this.td=new E;this.Gd=new E}\noq.prototype.serializeVertexProperties=function(a){a.id=kb(this);a.key=this.node?this.node.key:this.data?this.data.Di:void 0;void 0===a.key&&(a.key=null);a.x=this.bounds.x;a.y=this.bounds.y;a.kB=this.bounds.width;a.tA=this.bounds.height;a.fx=this.focus.x;a.fy=this.focus.y;var b=[];this.td.each(function(a){b.push(kb(a))});a.Uy=b;var c=[];this.Gd.each(function(a){c.push(kb(a))});a.jy=c};\noq.prototype.Cq=function(a,b,c){if(null!==a){this.x=a.x;this.y=a.y;this.width=a.kB;this.height=a.tA;this.focusX=a.fx;this.focusY=a.fy;var d=this;a.Uy&&a.Uy.forEach(function(a){(a=c.get(a))&&d.td.add(a)});a.jy&&a.jy.forEach(function(a){(a=c.get(a))&&d.Gd.add(a)})}};oq.prototype.clear=function(){this.Mi=this.ob=null;this.td=new E;this.Gd=new E};\noq.prototype.toString=function(a){void 0===a&&(a=0);var b=\"LayoutVertex#\"+kb(this);if(0<a&&(b+=null!==this.node?\"(\"+this.node.toString()+\")\":\"\",1<a)){a=\"\";for(var c=!0,d=this.td.iterator;d.next();){var e=d.value;c?c=!1:a+=\",\";a+=e.toString(0)}e=\"\";c=!0;for(d=this.Gd.iterator;d.next();){var f=d.value;c?c=!1:e+=\",\";e+=f.toString(0)}b+=\" sources: \"+a+\" destinations: \"+e}return b};\noq.prototype.commit=function(){var a=this.ob;if(null!==a){var b=this.bounds,c=a.bounds;za(c)?(c.x=b.x,c.y=b.y,c.width=b.width,c.height=b.height):a.bounds=b.copy()}else if(a=this.node,null!==a){b=this.bounds;if(!(a instanceof U)){c=N.alloc();var d=this.network.layout.nj(a,c),e=a.locationObject.da(zc);if(d.s()&&e.s()){a.moveTo(b.x+this.focusX-(e.x-d.x),b.y+this.focusY-(e.y-d.y));N.free(c);return}N.free(c)}a.moveTo(b.x,b.y)}};oq.prototype.Ev=function(a){null!==a&&(this.td.contains(a)||this.td.add(a))};\noq.prototype.Nv=function(a){null!==a&&this.td.remove(a)};oq.prototype.Cv=function(a){null!==a&&(this.Gd.contains(a)||this.Gd.add(a))};oq.prototype.Mv=function(a){null!==a&&this.Gd.remove(a)};function vq(a,b){a=a.Mi;b=b.Mi;return a?b?(a=a.text,b=b.text,a<b?-1:a>b?1:0):1:null!==b?-1:0}\nna.Object.defineProperties(oq.prototype,{sourceEdgesArrayAccess:{get:function(){return this.td._dataArray}},destinationEdgesArrayAccess:{get:function(){return this.Gd._dataArray}},data:{get:function(){return this.ob},set:function(a){this.ob=a;if(null!==a&&a.bounds){var b=a.bounds;a=b.x;var c=b.y,d=b.width;b=b.height;this.u.h(d/2,b/2);this.l.h(a,c,d,b)}}},node:{get:function(){return this.Mi},\nset:function(a){if(this.Mi!==a){this.Mi=a;a.Ta();var b=this.network.layout,c=N.alloc(),d=b.nj(a,c);b=d.x;var e=d.y,f=d.width;d=d.height;isNaN(b)&&(b=0);isNaN(e)&&(e=0);this.l.h(b,e,f,d);N.free(c);if(!(a instanceof U)&&(a=a.locationObject.da(zc),a.s())){this.u.h(a.x-b,a.y-e);return}this.u.h(f/2,d/2)}}},bounds:{get:function(){return this.l},set:function(a){this.l.w(a)||this.l.assign(a)}},focus:{get:function(){return this.u},set:function(a){this.u.w(a)||\nthis.u.assign(a)}},centerX:{get:function(){return this.l.x+this.u.x},set:function(a){var b=this.l;b.x+this.u.x!==a&&(b.ea(),b.x=a-this.u.x,b.freeze())}},centerY:{get:function(){return this.l.y+this.u.y},set:function(a){var b=this.l;b.y+this.u.y!==a&&(b.ea(),b.y=a-this.u.y,b.freeze())}},focusX:{get:function(){return this.u.x},set:function(a){var b=this.u;b.x!==a&&(b.ea(),b.x=a,b.freeze())}},focusY:{\nget:function(){return this.u.y},set:function(a){var b=this.u;b.y!==a&&(b.ea(),b.y=a,b.freeze())}},x:{get:function(){return this.l.x},set:function(a){var b=this.l;b.x!==a&&(b.ea(),b.x=a,b.freeze())}},y:{get:function(){return this.l.y},set:function(a){var b=this.l;b.y!==a&&(b.ea(),b.y=a,b.freeze())}},width:{get:function(){return this.l.width},set:function(a){var b=this.l;b.width!==a&&(b.ea(),b.width=\na,b.freeze())}},height:{get:function(){return this.l.height},set:function(a){var b=this.l;b.height!==a&&(b.ea(),b.height=a,b.freeze())}},network:{get:function(){return this.Tc},set:function(a){this.Tc=a}},sourceVertexes:{get:function(){for(var a=new G,b=this.sourceEdges;b.next();)a.add(b.value.fromVertex);return a.iterator}},destinationVertexes:{get:function(){for(var a=new G,b=\nthis.destinationEdges;b.next();)a.add(b.value.toVertex);return a.iterator}},vertexes:{get:function(){for(var a=new G,b=this.sourceEdges;b.next();)a.add(b.value.fromVertex);for(b=this.destinationEdges;b.next();)a.add(b.value.toVertex);return a.iterator}},sourceEdges:{get:function(){return this.td.iterator}},destinationEdges:{get:function(){return this.Gd.iterator}},edges:{get:function(){for(var a=\nnew E,b=this.sourceEdges;b.next();)a.add(b.value);for(b=this.destinationEdges;b.next();)a.add(b.value);return a.iterator}},edgesCount:{get:function(){return this.td.count+this.Gd.count}}});oq.prototype.deleteDestinationEdge=oq.prototype.Mv;oq.prototype.addDestinationEdge=oq.prototype.Cv;oq.prototype.deleteSourceEdge=oq.prototype.Nv;oq.prototype.addSourceEdge=oq.prototype.Ev;oq.className=\"LayoutVertex\";oq.standardComparer=vq;\noq.smartComparer=function(a,b){if(null!==a){if(null!==b){a=a.Mi;var c=b.Mi;if(null!==a){if(null!==c){b=a.text.toLocaleLowerCase().split(/([+\\-]?[\\.]?\\d+(?:\\.\\d*)?(?:e[+\\-]?\\d+)?)/);a=c.text.toLocaleLowerCase().split(/([+\\-]?[\\.]?\\d+(?:\\.\\d*)?(?:e[+\\-]?\\d+)?)/);for(c=0;c<b.length;c++)if(\"\"!==a[c]&&void 0!==a[c]){var d=parseFloat(b[c]),e=parseFloat(a[c]);if(isNaN(d))if(isNaN(e)){if(0!==b[c].localeCompare(a[c]))return b[c].localeCompare(a[c])}else return 1;else{if(isNaN(e))return-1;if(0!==d-e)return d-\ne}}else if(\"\"!==b[c])return 1;return\"\"!==a[c]&&void 0!==a[c]?-1:0}return 1}return null!==c?-1:0}return 1}return null!==b?-1:0};function pq(a){Xa(this);this.Sc=a;this.ed=this.Yc=this.Nl=this.ob=null}pq.prototype.clear=function(){this.ed=this.Yc=this.Nl=this.ob=null};\npq.prototype.serializeEdgeProperties=function(a){a.id=kb(this);a.key=this.link?this.link.key:this.data?this.data.Di:void 0;void 0===a.key&&(a.key=null);a.from=this.fromVertex?kb(this.fromVertex):null;a.fB=this.toVertex?kb(this.toVertex):null};pq.prototype.deserializeEdgeProperties=function(a,b){if(null!==a){var c=b.get(a.from);c&&(this.fromVertex=c);if(a=b.get(a.fB))this.toVertex=a}};\npq.prototype.toString=function(a){void 0===a&&(a=0);var b=\"LayoutEdge#\"+kb(this);0<a&&(b+=null!==this.Nl?\"(\"+this.Nl.toString()+\")\":\"\",1<a&&(b+=\" \"+(this.Yc?this.Yc.toString():\"null\")+\" --\\x3e \"+(this.ed?this.ed.toString():\"null\")));return b};pq.prototype.Rm=function(){var a=this.Yc;this.Yc=this.ed;this.ed=a};pq.prototype.commit=function(){};pq.prototype.zy=function(a){return this.ed===a?this.Yc:this.Yc===a?this.ed:null};\nna.Object.defineProperties(pq.prototype,{network:{get:function(){return this.Sc},set:function(a){this.Sc=a}},data:{get:function(){return this.ob},set:function(a){this.ob!==a&&(this.ob=a)}},link:{get:function(){return this.Nl},set:function(a){this.Nl!==a&&(this.Nl=a)}},fromVertex:{get:function(){return this.Yc},set:function(a){this.Yc!==a&&(this.Yc=a)}},toVertex:{\nget:function(){return this.ed},set:function(a){this.ed!==a&&(this.ed=a)}}});pq.prototype.getOtherVertex=pq.prototype.zy;pq.className=\"LayoutEdge\";function Sk(){Ai.call(this);this.isViewportSized=!0;this.rq=this.sq=NaN;this.Qg=(new M(NaN,NaN)).freeze();this.lf=(new M(10,10)).freeze();this.yb=wq;this.Eb=xq;this.bd=yq;this.Wc=zq}ma(Sk,Ai);\nSk.prototype.cloneProtected=function(a){Ai.prototype.cloneProtected.call(this,a);a.sq=this.sq;a.rq=this.rq;a.Qg.assign(this.Qg);a.lf.assign(this.lf);a.yb=this.yb;a.Eb=this.Eb;a.bd=this.bd;a.Wc=this.Wc};Sk.prototype.jb=function(a){a.classType===Sk?a===yq||a===Aq||a===Bq||a===Cq?this.sorting=a:a===xq||a===Dq?this.arrangement=a:a===wq||a===Eq?this.alignment=a:B(\"Unknown enum value: \"+a):Ai.prototype.jb.call(this,a)};\nSk.prototype.doLayout=function(a){this.arrangementOrigin=this.initialOrigin(this.arrangementOrigin);var b=this.$x(a);a=this.diagram;for(var c=b.copy().iterator;c.next();){var d=c.value;if(!d.Ph()||null===d.fromNode&&null===d.toNode){if(d.Ta(),d instanceof U)for(d=d.memberParts;d.next();)b.remove(d.value)}else b.remove(d)}var e=b.ma();if(0!==e.length){switch(this.sorting){case Cq:e.reverse();break;case yq:e.sort(this.comparer);break;case Aq:e.sort(this.comparer),e.reverse()}var f=this.wrappingColumn;\nisNaN(f)&&(f=0);var g=this.wrappingWidth;isNaN(g)&&null!==a?(b=a.padding,g=Math.max(a.viewportBounds.width-b.left-b.right,0)):g=Math.max(this.wrappingWidth,0);0>=f&&0>=g&&(f=1);b=this.spacing.width;isFinite(b)||(b=0);c=this.spacing.height;isFinite(c)||(c=0);null!==a&&a.va(\"Layout\");d=[];switch(this.alignment){case Eq:var h=b,k=c,l=N.alloc(),m=Math.max(this.cellSize.width,1);if(!isFinite(m))for(var n=m=0;n<e.length;n++){var p=this.nj(e[n],l);m=Math.max(m,p.width)}m=Math.max(m+h,1);n=Math.max(this.cellSize.height,\n1);if(!isFinite(n))for(p=n=0;p<e.length;p++){var r=this.nj(e[p],l);n=Math.max(n,r.height)}n=Math.max(n+k,1);p=this.arrangement;for(var q=r=this.arrangementOrigin.x,u=this.arrangementOrigin.y,w=0,v=0,y=0;y<e.length;y++){var z=e[y],A=this.nj(z,l),C=Math.ceil((A.width+h)/m)*m,F=Math.ceil((A.height+k)/n)*n;switch(p){case Dq:var Q=Math.abs(q-A.width);break;default:Q=q+A.width}if(0<f&&w>f-1||0<g&&0<w&&Q-r>g)d.push(new N(0,u,g+h,v)),w=0,q=r,u+=v,v=0;v=Math.max(v,F);switch(p){case Dq:A=-A.width;break;default:A=\n0}z.moveTo(q+A,u);switch(p){case Dq:q-=C;break;default:q+=C}w++}d.push(new N(0,u,g+h,v));N.free(l);break;case wq:k=g;m=f;n=b;p=c;g=N.alloc();r=Math.max(this.cellSize.width,1);f=u=l=0;h=J.alloc();for(q=0;q<e.length;q++)v=e[q],w=this.nj(v,g),v=v.Df(v.locationObject,v.locationSpot,h),l=Math.max(l,v.x),u=Math.max(u,w.width-v.x),f=Math.max(f,v.y);q=this.arrangement;switch(q){case Dq:l+=n;break;default:u+=n}r=isFinite(r)?Math.max(r+n,1):Math.max(l+u,1);var K=v=this.arrangementOrigin.x;y=this.arrangementOrigin.y;\nu=0;k>=l&&(k-=l);l=z=0;C=Math.max(this.cellSize.height,1);A=f=0;F=!0;w=J.alloc();for(Q=0;Q<e.length;Q++){var T=e[Q],P=this.nj(T,g),I=T.Df(T.locationObject,T.locationSpot,h);if(0<u)switch(q){case Dq:K=(K-v-(P.width-I.x))/r;K=L.aa(Math.round(K),K)?Math.round(K):Math.floor(K);K=K*r+v;break;default:K=(K-v+I.x)/r,K=L.aa(Math.round(K),K)?Math.round(K):Math.ceil(K),K=K*r+v}else switch(q){case Dq:z=K+I.x+P.width;break;default:z=K-I.x}switch(q){case Dq:var ja=-(K+I.x)+z;break;default:ja=K+P.width-I.x-z}if(0<\nm&&u>m-1||0<k&&0<u&&ja>k){d.push(new N(0,F?y-f:y,k+n,A+f+p));for(K=0;K<u&&Q!==u;K++){ja=e[Q-u+K];var ba=ja.Df(ja.locationObject,ja.locationSpot,w);ja.moveTo(ja.position.x,ja.position.y+f-ba.y)}A+=p;y=F?y+A:y+(A+f);u=A=f=0;K=v;F=!1}K===v&&(l=q===Dq?Math.max(l,P.width-I.x):Math.min(l,-I.x));f=Math.max(f,I.y);A=Math.max(A,P.height-I.y);isFinite(C)&&(A=Math.max(A,Math.max(P.height,C)-I.y));F?T.moveTo(K-I.x,y-I.y):T.moveTo(K-I.x,y);switch(q){case Dq:K-=I.x+n;break;default:K+=P.width-I.x+n}u++}d.push(new N(0,\ny,k+n,(F?A:A+f)+p));if(e.length!==u)for(k=0;k<u;k++)m=e[e.length-u+k],n=m.Df(m.locationObject,m.locationSpot,h),m.moveTo(m.position.x,m.position.y+f-n.y);J.free(h);J.free(w);if(q===Dq)for(e=0;e<d.length;e++)f=d[e],f.width+=l,f.x-=l;else for(e=0;e<d.length;e++)f=d[e],f.x>l&&(f.width+=f.x-l,f.x=l);N.free(g)}for(h=f=g=e=0;h<d.length;h++)k=d[h],e=Math.min(e,k.x),g=Math.min(g,k.y),f=Math.max(f,k.x+k.width);this.arrangement===Dq?this.commitLayers(d,new J(e+b/2-(f+e),g-c/2)):this.commitLayers(d,new J(e-\nb/2,g-c/2));null!==a&&a.Xa(\"Layout\");this.isValidLayout=!0}};Sk.prototype.commitLayers=function(){};function zq(a,b){a=a.text;b=b.text;return a<b?-1:a>b?1:0}\nna.Object.defineProperties(Sk.prototype,{wrappingWidth:{get:function(){return this.sq},set:function(a){this.sq!==a&&(0<a||isNaN(a))&&(this.sq=a,this.isViewportSized=isNaN(a),this.B())}},wrappingColumn:{get:function(){return this.rq},set:function(a){this.rq!==a&&(0<a||isNaN(a))&&(this.rq=a,this.B())}},cellSize:{get:function(){return this.Qg},set:function(a){this.Qg.w(a)||(this.Qg.assign(a),this.B())}},spacing:{\nget:function(){return this.lf},set:function(a){this.lf.w(a)||(this.lf.assign(a),this.B())}},alignment:{get:function(){return this.yb},set:function(a){this.yb===a||a!==wq&&a!==Eq||(this.yb=a,this.B())}},arrangement:{get:function(){return this.Eb},set:function(a){this.Eb===a||a!==xq&&a!==Dq||(this.Eb=a,this.B())}},sorting:{get:function(){return this.bd},set:function(a){this.bd===a||a!==Bq&&a!==Cq&&\na!==yq&&a!==Aq||(this.bd=a,this.B())}},comparer:{get:function(){return this.Wc},set:function(a){this.Wc!==a&&(this.Wc=a,this.B())}}});var Eq=new D(Sk,\"Position\",0),wq=new D(Sk,\"Location\",1),xq=new D(Sk,\"LeftToRight\",2),Dq=new D(Sk,\"RightToLeft\",3),Bq=new D(Sk,\"Forward\",4),Cq=new D(Sk,\"Reverse\",5),yq=new D(Sk,\"Ascending\",6),Aq=new D(Sk,\"Descending\",7);Sk.className=\"GridLayout\";Sk.standardComparer=zq;\nSk.smartComparer=function(a,b){if(null!==a){if(null!==b){a=a.text.toLocaleLowerCase().split(/([+\\-]?[\\.]?\\d+(?:\\.\\d*)?(?:e[+\\-]?\\d+)?)/);b=b.text.toLocaleLowerCase().split(/([+\\-]?[\\.]?\\d+(?:\\.\\d*)?(?:e[+\\-]?\\d+)?)/);for(var c=0;c<a.length;c++)if(\"\"!==b[c]&&void 0!==b[c]){var d=parseFloat(a[c]),e=parseFloat(b[c]);if(isNaN(d))if(isNaN(e)){if(0!==a[c].localeCompare(b[c]))return a[c].localeCompare(b[c])}else return 1;else{if(isNaN(e))return-1;if(0!==d-e)return d-e}}else if(\"\"!==a[c])return 1;return\"\"!==\nb[c]&&void 0!==b[c]?-1:0}return 1}return null!==b?-1:0};Sk.Position=Eq;Sk.Location=wq;Sk.LeftToRight=xq;Sk.RightToLeft=Dq;Sk.Forward=Bq;Sk.Reverse=Cq;Sk.Ascending=yq;Sk.Descending=Aq;function vi(){this.lp=new G;this.No=new G;this.Ea=new G;this.Ue=new H;this.Te=new H;this.Qj=new H;this.C=null;this.mr=!1}t=vi.prototype;t.clear=function(){this.lp.clear();this.No.clear();this.Ea.clear();this.Ue.clear();this.Te.clear();this.Qj.clear()};t.ee=function(a){this.C=a};\nt.oj=function(a){if(a instanceof W){if(this.lp.add(a),a instanceof U){var b=a.containingGroup;null===b?this.C.Dh.add(a):b.Sl.add(a);b=a.layout;null!==b&&(b.diagram=this.C)}}else a instanceof S?this.No.add(a):a instanceof Je||this.Ea.add(a);b=a.data;null===b||a instanceof Je||(a instanceof S?this.Te.add(b,a):this.Ue.add(b,a))};\nt.Lc=function(a){a.nk();if(a instanceof W){if(this.lp.remove(a),a instanceof U){var b=a.containingGroup;null===b?this.C.Dh.remove(a):b.Sl.remove(a);b=a.layout;null!==b&&(b.diagram=null)}}else a instanceof S?this.No.remove(a):a instanceof Je||this.Ea.remove(a);b=a.data;null===b||a instanceof Je||(a instanceof S?this.Te.remove(b):this.Ue.remove(b))};\nt.Md=function(){for(var a=this.C.nodeTemplateMap.iterator;a.next();){var b=a.value,c=a.key;(!b.Nc()||b instanceof U)&&B('Invalid node template in Diagram.nodeTemplateMap: template for \"'+c+'\" must be a Node or a simple Part, not a Group or Link: '+b)}for(a=this.C.groupTemplateMap.iterator;a.next();)b=a.value,c=a.key,b instanceof U||B('Invalid group template in Diagram.groupTemplateMap: template for \"'+c+'\" must be a Group, not a normal Node or Link: '+b);for(a=this.C.linkTemplateMap.iterator;a.next();)b=\na.value,c=a.key,b instanceof S||B('Invalid link template in Diagram.linkTemplateMap: template for \"'+c+'\" must be a Link, not a normal Node or simple Part: '+b);a=Ea();for(b=this.C.selection.iterator;b.next();)(c=b.value.data)&&a.push(c);b=Ea();for(c=this.C.highlighteds.iterator;c.next();){var d=c.value.data;d&&b.push(d)}c=Ea();for(d=this.nodes.iterator;d.next();){var e=d.value;null!==e.data&&(c.push(e.data),c.push(e.location))}for(d=this.links.iterator;d.next();)e=d.value,null!==e.data&&(c.push(e.data),\nc.push(e.location));for(d=this.parts.iterator;d.next();)e=d.value,null!==e.data&&(c.push(e.data),c.push(e.location));this.removeAllModeledParts();this.addAllModeledParts();for(d=0;d<a.length;d++)e=this.zc(a[d]),null!==e&&(e.isSelected=!0);for(d=0;d<b.length;d++)e=this.zc(b[d]),null!==e&&(e.isHighlighted=!0);for(d=0;d<c.length;d+=2)e=this.zc(c[d]),null!==e&&(e.location=c[d+1]);Ia(a);Ia(b);Ia(c)};vi.prototype.addAllModeledParts=function(){this.addModeledParts(this.diagram.model.nodeDataArray)};\nvi.prototype.addModeledParts=function(a,b){var c=this,d=this.diagram.model;a.forEach(function(a){d.ab(a)&&Fq(c,a,!1)});a.forEach(function(a){d.ab(a)&&c.resolveReferencesForData(a)});!1!==b&&gk(this.diagram,!1)};\nfunction Fq(a,b,c){if(void 0!==b&&null!==b&&!a.diagram.undoManager.isUndoingRedoing&&!a.Ue.contains(b)){void 0===c&&(c=!0);a:{if(void 0!==b&&null!==b&&!a.C.undoManager.isUndoingRedoing&&!a.Ue.contains(b)){var d=a.Iq(b);var e=Po(a,b,d);if(null!==e&&(yg(e),e=e.copy(),null!==e)){var f=a.diagram.skipsModelSourceBindings;a.diagram.skipsModelSourceBindings=!0;e.Nf=d;e.ob=b;a.mr&&(e.ih=\"Tool\");a.diagram.add(e);e.ob=null;e.data=b;a.diagram.skipsModelSourceBindings=f;d=e;break a}}d=null}null!==d&&c&&a.resolveReferencesForData(b)}}\nvi.prototype.insertLink=function(){return null};vi.prototype.resolveReferencesForData=function(){};vi.prototype.Iq=function(a){return this.C.model.Iq(a)};\nfunction Po(a,b,c){a=a.C;var d=a.model;d.Dk()&&d.fw(b)?(b=a.groupTemplateMap.G(c),null===b&&(b=a.groupTemplateMap.G(\"\"),null===b&&(Gq||(Gq=!0,xa('No Group template found for category \"'+c+'\"'),xa(\"  Using default group template\")),b=a.Eu))):(b=a.nodeTemplateMap.G(c),null===b&&(b=a.nodeTemplateMap.G(\"\"),null===b&&(Hq||(Hq=!0,xa('No Node template found for category \"'+c+'\"'),xa(\"  Using default node template\")),b=a.Gu)));return b}vi.prototype.getLinkCategoryForData=function(){return\"\"};\nvi.prototype.setLinkCategoryForData=function(){};vi.prototype.setFromNodeForLink=function(){};vi.prototype.setToNodeForLink=function(){};vi.prototype.findLinkTemplateForCategory=function(a){var b=this.C.linkTemplateMap.G(a);null===b&&(b=this.C.linkTemplateMap.G(\"\"),null===b&&(Iq||(Iq=!0,xa('No Link template found for category \"'+a+'\"'),xa(\"  Using default link template\")),b=this.C.Fu));return b};vi.prototype.removeAllModeledParts=function(){this.fu(this.diagram.model.nodeDataArray)};\nvi.prototype.fu=function(a){var b=this;a.forEach(function(a){b.$q(a)})};vi.prototype.$q=function(a){a=this.zc(a);null!==a&&(Nj(this.diagram,a,!1),this.unresolveReferencesForPart(a))};vi.prototype.unresolveReferencesForPart=function(){};vi.prototype.removeDataForLink=function(){};vi.prototype.findPartForKey=function(a){if(null===a||void 0===a)return null;a=this.C.model.Kb(a);return null!==a?this.Ue.G(a):null};\nvi.prototype.Cb=function(a){if(null===a||void 0===a)return null;a=this.C.model.Kb(a);if(null===a)return null;a=this.Ue.G(a);return a instanceof W?a:null};vi.prototype.findLinkForKey=function(){return null};t=vi.prototype;t.zc=function(a){if(null===a)return null;var b=this.Ue.G(a);return null!==b?b:b=this.Te.G(a)};t.gj=function(a){if(null===a)return null;a=this.Ue.G(a);return a instanceof W?a:null};t.yc=function(a){return null===a?null:this.Te.G(a)};\nt.It=function(a){for(var b=0;b<arguments.length;++b);b=new G;for(var c=this.lp.iterator;c.next();){var d=c.value,e=d.data;if(null!==e)for(var f=0;f<arguments.length;f++){var g=arguments[f];if(za(g)&&Jq(this,e,g)){b.add(d);break}}}return b.iterator};t.Ht=function(a){for(var b=0;b<arguments.length;++b);b=new G;for(var c=this.No.iterator;c.next();){var d=c.value,e=d.data;if(null!==e)for(var f=0;f<arguments.length;f++){var g=arguments[f];if(za(g)&&Jq(this,e,g)){b.add(d);break}}}return b.iterator};\nfunction Jq(a,b,c){for(var d in c){var e=b[d],f=c[d];if(Aa(f)){if(!Aa(e)||e.length<f.length)return!1;for(var g=0;g<e.length;g++){var h=f[g];if(void 0!==h&&!Kq(a,e[g],h))return!1}}else if(!Kq(a,e,f))return!1}return!0}function Kq(a,b,c){if(\"function\"===typeof c){if(!c(b))return!1}else if(c instanceof RegExp){if(!b||!c.test(b.toString()))return!1}else if(za(b)&&za(c)){if(!Jq(a,b,c))return!1}else if(b!==c)return!1;return!0}\nvi.prototype.doModelChanged=function(a){if(this.C){var b=this.C;if(a.model===b.model){var c=a.change;b.doModelChanged(a);if(b.Z){b.Z=!1;try{var d=a.modelChange;if(\"\"!==d)if(c===xe){if(\"nodeCategory\"===d){var e=this.zc(a.object),f=a.newValue;null!==e&&\"string\"===typeof f&&(e.category=f)}else\"nodeDataArray\"===d&&(this.fu(a.oldValue),this.addModeledParts(a.newValue));b.isModified=!0}else if(c===ze){var g=a.newValue;\"nodeDataArray\"===d&&za(g)&&Fq(this,g);b.isModified=!0}else if(c===Ae){var h=a.oldValue;\n\"nodeDataArray\"===d&&za(h)&&this.$q(h);b.isModified=!0}else c===ye&&(\"SourceChanged\"===d?null!==a.object?this.updateDataBindings(a.object,a.propertyName):(this.ir(),this.updateAllTargetBindings()):\"ModelDisplaced\"===d&&this.Md());else if(c===xe){var k=a.propertyName,l=a.object;if(l===b.model){if(\"nodeKeyProperty\"===k||\"nodeCategoryProperty\"===k)b.undoManager.isUndoingRedoing||this.Md()}else this.updateDataBindings(l,k);b.isModified=!0}else if(c===ze||c===Ae){var m=a.change===ze,n=m?a.newParam:a.oldParam,\np=m?a.newValue:a.oldValue,r=this.Qj.G(a.object);if(Array.isArray(r))for(a=0;a<r.length;a++){var q=r[a];if(m)qn(q,p,n);else if(!(0>n)){var u=n+jn(q);q.Lc(u,!0);un(q,u,n)}}b.isModified=!0}}finally{b.Z=!0}}}}};vi.prototype.updateAllTargetBindings=function(a){void 0===a&&(a=\"\");for(var b=this.parts.iterator;b.next();)b.value.Da(a);for(b=this.nodes.iterator;b.next();)b.value.Da(a);for(b=this.links.iterator;b.next();)b.value.Da(a)};\nvi.prototype.ir=function(){for(var a=this.C.model,b=new G,c=a.nodeDataArray,d=0;d<c.length;d++)b.add(c[d]);var e=[];this.nodes.each(function(a){null===a.data||b.contains(a.data)||e.push(a.data)});this.parts.each(function(a){null===a.data||b.contains(a.data)||e.push(a.data)});e.forEach(function(b){Lq(a,b,!1)});for(d=0;d<c.length;d++){var f=c[d];null===this.zc(f)&&Mq(a,f,!1)}this.refreshDataBoundLinks();for(c=this.parts.iterator;c.next();)c.value.updateRelationshipsFromData();for(c=this.nodes.iterator;c.next();)c.value.updateRelationshipsFromData();\nfor(c=this.links.iterator;c.next();)c.value.updateRelationshipsFromData()};vi.prototype.refreshDataBoundLinks=function(){};vi.prototype.updateRelationshipsFromData=function(){};\nvi.prototype.updateDataBindings=function(a,b){if(\"string\"===typeof b){var c=this.zc(a);if(null!==c)c.Da(b);else{c=null;for(var d=this.Qj.iterator;d.next();){for(var e=d.value,f=0;f<e.length;f++){var g=e[f].qy(a);null!==g&&(null===c&&(c=Ea()),c.push(g))}if(null!==c)break}if(null!==c){for(d=0;d<c.length;d++)c[d].Da(b);Ia(c)}}a===this.diagram.model.modelData&&this.updateAllTargetBindings(b)}};\nfunction Jj(a,b){var c=b.Ci;if(Aa(c)){var d=a.Qj.G(c);if(null===d)d=[],d.push(b),a.Qj.add(c,d);else{for(a=0;a<d.length;a++)if(d[a]===b)return;d.push(b)}}}function Mj(a,b,c){Hj(b,function(a){a=a.W.j;for(var b=a.length,d=0;d<b;d++)ek(c,a[d])});var d=b.Ci;if(Aa(d)){var e=a.Qj.G(d);if(null!==e)for(var f=0;f<e.length;f++)if(e[f]===b){e.splice(f,1);0===e.length&&a.Qj.remove(d);break}}}\nvi.prototype.tk=function(a,b,c){void 0===c&&(c=!1);var d=new H;if(Aa(a))for(var e=0;e<a.length;e++)Nq(this,a[e],b,d,c);else for(a=a.iterator;a.next();)Nq(this,a.value,b,d,c);if(null!==b){c=b.model;a=b.toolManager.findTool(\"Dragging\");a=null!==a?a.dragOptions.dragsLink:b.kl.dragsLink;e=new G;for(var f=new H,g=d.iterator;g.next();){var h=g.value;if(h instanceof S)a||null!==h.fromNode&&null!==h.toNode||e.add(h);else if(h instanceof W&&null!==h.data&&c.Em()){var k=h;h=g.key;var l=h.Fg();null!==l&&(l=\nd.G(l),null!==l?(c.fe(k.data,c.ja(l.data)),k=b.yc(k.data),h=h.jj(),null!==h&&null!==k&&f.add(h,k)):c.fe(k.data,void 0))}}0<e.count&&b.gu(e,!1);if(0<f.count)for(c=f.iterator;c.next();)d.add(c.key,c.value)}if(null!==b&&null!==this.C&&(b=b.model,c=b.afterCopyFunction,null!==c)){var m=new H;d.each(function(a){null!==a.key.data&&m.add(a.key.data,a.value.data)});c(m,b,this.C.model)}for(b=d.iterator;b.next();)b.value.Da();return d};\nfunction Nq(a,b,c,d,e){if(null===b||e&&!b.canCopy())return null;if(d.contains(b))return d.G(b);var f=a.copyPartData(b,c);if(!(f instanceof V))return null;f.isSelected=!1;f.isHighlighted=!1;d.add(b,f);if(b instanceof W){for(var g=b.linksConnected;g.next();){var h=g.value;if(h.fromNode===b){var k=d.G(h);null!==k&&(k.fromNode=f)}h.toNode===b&&(h=d.G(h),null!==h&&(h.toNode=f))}if(b instanceof U&&f instanceof U)for(b=b.memberParts;b.next();)g=Nq(a,b.value,c,d,e),g instanceof S||null===g||(g.containingGroup=\nf)}else if(b instanceof S&&f instanceof S)for(g=b.fromNode,null!==g&&(g=d.G(g),null!==g&&(f.fromNode=g)),g=b.toNode,null!==g&&(g=d.G(g),null!==g&&(f.toNode=g)),b=b.labelNodes;b.next();)g=Nq(a,b.value,c,d,e),null!==g&&g instanceof W&&(g.labeledLink=f);return f}\nvi.prototype.copyPartData=function(a,b){var c=null,d=a.data;if(null!==d&&null!==b){var e=b.model;a instanceof S||(d=e.copyNodeData(d),za(d)&&(e.uf(d),c=b.zc(d)))}else yg(a),c=a.copy(),null!==c&&(e=this.C,null!==b?b.add(c):null!==d&&null!==e&&null!==e.commandHandler&&e.commandHandler.copiesClipboardData&&(b=e.model,e=null,c instanceof S||(e=b.copyNodeData(d)),za(e)&&(c.data=e)));return c};\nna.Object.defineProperties(vi.prototype,{nodes:{get:function(){return this.lp}},links:{get:function(){return this.No}},parts:{get:function(){return this.Ea}},diagram:{get:function(){return this.C}},addsToTemporaryLayer:{get:function(){return this.mr},set:function(a){this.mr=a}}});vi.prototype.updateAllRelationshipsFromData=vi.prototype.ir;\nvi.prototype.findLinksByExample=vi.prototype.Ht;vi.prototype.findNodesByExample=vi.prototype.It;vi.prototype.findLinkForData=vi.prototype.yc;vi.prototype.findNodeForData=vi.prototype.gj;vi.prototype.findPartForData=vi.prototype.zc;vi.prototype.findNodeForKey=vi.prototype.Cb;vi.prototype.removeModeledPart=vi.prototype.$q;vi.prototype.removeModeledParts=vi.prototype.fu;vi.prototype.rebuildParts=vi.prototype.Md;var Hq=!1,Gq=!1,Iq=!1;vi.className=\"PartManager\";\nfunction Oq(a){vi.apply(this,arguments)}ma(Oq,vi);Oq.prototype.addAllModeledParts=function(){var a=this.diagram.model;this.addModeledParts(a.nodeDataArray);Pq(this,a.linkDataArray)};Oq.prototype.addModeledParts=function(a){vi.prototype.addModeledParts.call(this,a,!1);for(a=this.links.iterator;a.next();)Qo(a.value);gk(this.diagram,!1)};function Pq(a,b){b.forEach(function(b){Qq(a,b)});gk(a.diagram,!1)}\nfunction Qq(a,b){if(void 0!==b&&null!==b&&!a.diagram.undoManager.isUndoingRedoing&&!a.Te.contains(b)){var c=a.getLinkCategoryForData(b),d=a.findLinkTemplateForCategory(c);if(null!==d){yg(d);var e=d.copy();if(null!==e){d=a.diagram.skipsModelSourceBindings;a.diagram.skipsModelSourceBindings=!0;e.Nf=c;e.ob=b;c=a.diagram.model;var f=Rq(c,b,!0);\"\"!==f&&(e.fromPortId=f);f=Sq(c,b,!0);void 0!==f&&(f=a.Cb(f),f instanceof W&&(e.fromNode=f));f=Rq(c,b,!1);\"\"!==f&&(e.toPortId=f);f=Sq(c,b,!1);void 0!==f&&(f=a.Cb(f),\nf instanceof W&&(e.toNode=f));c=c.Bf(b);Array.isArray(c)&&c.forEach(function(b){b=a.Cb(b);null!==b&&(b.labeledLink=e)});a.mr&&(e.ih=\"Tool\");a.diagram.add(e);e.ob=null;e.data=b;a.diagram.skipsModelSourceBindings=d}}}}Oq.prototype.removeAllModeledParts=function(){var a=this.diagram.model;Tq(this,a.linkDataArray);this.fu(a.nodeDataArray)};function Tq(a,b){b.forEach(function(b){a.$q(b)})}Oq.prototype.getLinkCategoryForData=function(a){return this.diagram.model.Lt(a)};\nOq.prototype.setLinkCategoryForData=function(a,b){return this.diagram.model.cr(a,b)};Oq.prototype.setFromNodeForLink=function(a,b){var c=this.diagram.model;c.Bw(a.data,c.ja(null!==b?b.data:null))};Oq.prototype.setToNodeForLink=function(a,b){var c=this.diagram.model;c.Gw(a.data,c.ja(null!==b?b.data:null))};Oq.prototype.removeDataForLink=function(a){this.diagram.model.Mm(a.data)};\nOq.prototype.findPartForKey=function(a){var b=vi.prototype.findPartForKey.call(this,a);return null===b&&(a=this.diagram.model.Dg(a),null!==a)?this.Te.G(a):b};Oq.prototype.findLinkForKey=function(a){if(null===a||void 0===a)return null;a=this.diagram.model.Dg(a);return null!==a?this.Te.G(a):null};\nOq.prototype.doModelChanged=function(a){var b=this;vi.prototype.doModelChanged.call(this,a);if(this.diagram){var c=this.diagram;if(a.model===c.model){var d=a.change;if(c.Z){c.Z=!1;try{var e=a.modelChange;if(\"\"!==e)if(d===xe){if(\"linkFromKey\"===e){var f=this.yc(a.object);if(null!==f){var g=this.Cb(a.newValue);f.fromNode=g}}else if(\"linkToKey\"===e){var h=this.yc(a.object);if(null!==h){var k=this.Cb(a.newValue);h.toNode=k}}else if(\"linkFromPortId\"===e){var l=this.yc(a.object);if(null!==l){var m=a.newValue;\n\"string\"===typeof m&&(l.fromPortId=m)}}else if(\"linkToPortId\"===e){var n=this.yc(a.object);if(null!==n){var p=a.newValue;\"string\"===typeof p&&(n.toPortId=p)}}else if(\"nodeGroupKey\"===e){var r=this.zc(a.object);if(null!==r){var q=a.newValue;if(void 0!==q){var u=this.Cb(q);u instanceof U?r.containingGroup=u:r.containingGroup=null}else r.containingGroup=null}}else if(\"linkLabelKeys\"===e){var w=this.yc(a.object);if(null!==w){var v=a.oldValue,y=a.newValue;Array.isArray(v)&&v.forEach(function(a){0<=y.indexOf(a)||\n(a=b.Cb(a),null!==a&&(a.labeledLink=null))});Array.isArray(y)&&y.forEach(function(a){a=b.Cb(a);null!==a&&(a.labeledLink=w)})}}else if(\"linkCategory\"===e){var z=this.yc(a.object),A=a.newValue;null!==z&&\"string\"===typeof A&&(z.category=A)}else\"linkDataArray\"===e&&(Tq(this,a.oldValue),Pq(this,a.newValue));c.isModified=!0}else if(d===ze){var C=a.newValue;if(\"linkDataArray\"===e&&\"object\"===typeof C&&null!==C)Qq(this,C);else if(\"linkLabelKeys\"===e&&Uq(C)){var F=this.yc(a.object),Q=this.Cb(C);null!==F&&\nnull!==Q&&(Q.labeledLink=F)}c.isModified=!0}else{if(d===Ae){var K=a.oldValue;if(\"linkDataArray\"===e&&\"object\"===typeof K&&null!==K)this.$q(K);else if(\"linkLabelKeys\"===e&&Uq(K)){var T=this.Cb(K);null!==T&&(T.labeledLink=null)}c.isModified=!0}}else if(d===xe){var P=a.propertyName;a.object!==c.model||\"linkFromKeyProperty\"!==P&&\"linkToKeyProperty\"!==P&&\"linkFromPortIdProperty\"!==P&&\"linkToPortIdProperty\"!==P&&\"linkLabelKeysProperty\"!==P&&\"nodeIsGroupProperty\"!==P&&\"nodeGroupKeyProperty\"!==P&&\"linkCategoryProperty\"!==\nP||c.undoManager.isUndoingRedoing||this.Md();c.isModified=!0}}finally{c.Z=!0}}}}};Oq.prototype.refreshDataBoundLinks=function(){var a=this,b=this.diagram.model,c=new G,d=b.linkDataArray;d.forEach(function(a){c.add(a)});var e=[];this.links.each(function(a){null===a.data||c.contains(a.data)||e.push(a.data)});e.forEach(function(a){Vq(b,a,!1)});d.forEach(function(c){null===a.yc(c)&&Wq(b,c,!1)})};\nOq.prototype.updateRelationshipsFromData=function(a){var b=a.data;if(null!==b){var c=a.diagram;if(null!==c){var d=c.model;if(a instanceof S){var e=Sq(d,b,!0);e=c.Cb(e);a.fromNode=e;e=Sq(d,b,!1);e=c.Cb(e);a.toNode=e;b=d.Bf(b);if(0<b.length||0<a.labelNodes.count){if(1===b.length&&1===a.labelNodes.count){e=b[0];var f=a.labelNodes.first();if(d.ja(f.data)===e)return}e=(new G).addAll(b);var g=new G;a.labelNodes.each(function(a){null!==a.data&&(a=d.ja(a.data),void 0!==a&&g.add(a))});b=g.copy();b.Zq(e);e=\ne.copy();e.Zq(g);if(0<b.count||0<e.count)b.each(function(b){b=c.Cb(b);null!==b&&b.labeledLink===a&&(b.labeledLink=null)}),e.each(function(b){b=c.Cb(b);null!==b&&b.labeledLink!==a&&(b.labeledLink=a)})}}else!(a instanceof Je)&&(b=d.Lh(b),b=c.findPartForKey(b),null===b||b instanceof U)&&(a.containingGroup=b)}}};\nOq.prototype.resolveReferencesForData=function(a){var b=this.diagram.model,c=b.ja(a);if(void 0!==c){var d=Xq(b,c),e=this.zc(a);if(null!==d&&null!==e){d=d.iterator;for(var f={};d.next();){var g=d.value;b.ab(g)?e instanceof U&&b.Lh(g)===c&&(g=this.zc(g),null!==g&&(g.containingGroup=e)):(f.link=this.yc(g),null!==f.link&&e instanceof W&&(Sq(b,g,!0)===c&&(f.link.fromNode=e),Sq(b,g,!1)===c&&(f.link.toNode=e),g=b.Bf(g),Array.isArray(g)&&g.some(function(a){return function(b){return b===c?(e.labeledLink=a.link,\n!0):!1}}(f))));f={link:f.link}}Yq(b,c)}a=b.Lh(a);void 0!==a&&(a=this.Cb(a),a instanceof U&&(e.containingGroup=a))}};Oq.prototype.unresolveReferencesForPart=function(a){var b=this.diagram.model;if(a instanceof W){var c=b.ja(a.data);if(void 0!==c){for(var d=a.linksConnected;d.next();)Zq(b,c,d.value.data);a.isLinkLabel&&(d=a.labeledLink,null!==d&&Zq(b,c,d.data));if(a instanceof U)for(a=a.memberParts;a.next();)d=a.value.data,b.ab(d)&&Zq(b,c,d)}}};\nOq.prototype.copyPartData=function(a,b){var c=vi.prototype.copyPartData.call(this,a,b);if(a instanceof S)if(a=a.data,null!==a&&null!==b){var d=b.model;a=d.Aq(a);\"object\"===typeof a&&null!==a&&(d.bj(a),c=b.yc(a))}else null!==c&&(b=this.diagram,null!==a&&null!==b&&null!==b.commandHandler&&b.commandHandler.copiesClipboardData&&(b=b.model.Aq(a),\"object\"===typeof b&&null!==b&&(c.data=b)));return c};\nOq.prototype.insertLink=function(a,b,c,d){var e=this.diagram,f=e.model,g=e.toolManager.findTool(\"Linking\"),h=\"\";null!==a&&(null===b&&(b=a),h=b.portId,null===h&&(h=\"\"));b=\"\";null!==c&&(null===d&&(d=c),b=d.portId,null===b&&(b=\"\"));d=g.archetypeLinkData;if(d instanceof S){if(yg(d),f=d.copy(),null!==f)return f.fromNode=a,f.fromPortId=h,f.toNode=c,f.toPortId=b,e.add(f),a=g.archetypeLabelNodeData,a instanceof W&&(yg(a),a=a.copy(),null!==a&&(a.labeledLink=f,e.add(a))),f}else if(null!==d&&(d=f.Aq(d),\"object\"===\ntypeof d&&null!==d))return null!==a&&$q(f,d,f.ja(a.data),!0),ar(f,d,h,!0),null!==c&&$q(f,d,f.ja(c.data),!1),ar(f,d,b,!1),f.bj(d),a=g.archetypeLabelNodeData,null===a||a instanceof W||(a=f.copyNodeData(a),\"object\"===typeof a&&null!==a&&(f.uf(a),a=f.ja(a),void 0!==a&&f.Dv(d,a))),e.yc(d);return null};Oq.prototype.findLinkForKey=Oq.prototype.findLinkForKey;Oq.prototype.findPartForKey=Oq.prototype.findPartForKey;Oq.prototype.removeAllModeledParts=Oq.prototype.removeAllModeledParts;\nOq.prototype.addModeledParts=Oq.prototype.addModeledParts;Oq.prototype.addAllModeledParts=Oq.prototype.addAllModeledParts;Oq.className=\"GraphLinksPartManager\";function br(){vi.apply(this,arguments);this.rh=null}ma(br,vi);\nfunction cr(a,b,c){if(null!==b&&null!==c){var d=a.diagram.toolManager.findTool(\"Linking\"),e=b,f=c;if(a.diagram.isTreePathToChildren)for(b=f.linksConnected;b.next();){if(b.value.toNode===f)return}else for(e=c,f=b,b=e.linksConnected;b.next();)if(b.value.fromNode===e)return;if(null===d||!Of(d,e,f,null,!0))if(d=a.getLinkCategoryForData(c.data),b=a.findLinkTemplateForCategory(d),null!==b&&(yg(b),b=b.copy(),null!==b)){var g=a.diagram.skipsModelSourceBindings;a.diagram.skipsModelSourceBindings=!0;b.Nf=d;\nb.ob=c.data;b.fromNode=e;b.toNode=f;a.diagram.add(b);b.ob=null;b.data=c.data;a.diagram.skipsModelSourceBindings=g}}}br.prototype.getLinkCategoryForData=function(a){return this.diagram.model.Ot(a)};br.prototype.setLinkCategoryForData=function(a,b){this.diagram.model.ku(a,b)};\nbr.prototype.setFromNodeForLink=function(a,b,c){var d=this.diagram.model;void 0===c&&(c=null);b=null!==b?b.data:null;if(this.diagram.isTreePathToChildren)d.fe(a.data,d.ja(b));else{var e=this.rh;this.rh=a;null!==c&&d.fe(c.data,void 0);d.fe(b,d.ja(null!==a.toNode?a.toNode.data:null));this.rh=e}};\nbr.prototype.setToNodeForLink=function(a,b,c){var d=this.diagram.model;void 0===c&&(c=null);b=null!==b?b.data:null;if(this.diagram.isTreePathToChildren){var e=this.rh;this.rh=a;null!==c&&d.fe(c.data,void 0);d.fe(b,d.ja(null!==a.fromNode?a.fromNode.data:null));this.rh=e}else d.fe(a.data,d.ja(b))};br.prototype.removeDataForLink=function(a){this.diagram.model.fe(a.data,void 0)};\nbr.prototype.findLinkForKey=function(a){if(null===a||void 0===a)return null;a=this.diagram.model.Kb(a);return null!==a?this.Te.G(a):null};\nbr.prototype.doModelChanged=function(a){vi.prototype.doModelChanged.call(this,a);if(this.diagram){var b=this.diagram;if(a.model===b.model){var c=a.change;if(b.Z){b.Z=!1;try{var d=a.modelChange;if(\"\"!==d){if(c===xe){if(\"nodeParentKey\"===d){var e=a.object,f=this.Cb(a.newValue),g=this.gj(e);if(null!==this.rh)null!==f&&(this.rh.data=e,this.rh.category=this.getLinkCategoryForData(e));else if(null!==g){var h=g.jj();null!==h?null===f?b.remove(h):b.isTreePathToChildren?h.fromNode=f:h.toNode=f:cr(this,f,g)}}else if(\"parentLinkCategory\"===\nd){var k=this.gj(a.object),l=a.newValue;if(null!==k&&\"string\"===typeof l){var m=k.jj();null!==m&&(m.category=l)}}b.isModified=!0}}else if(c===xe){var n=a.propertyName;a.object===b.model&&\"nodeParentKeyProperty\"===n&&(b.undoManager.isUndoingRedoing||this.Md());b.isModified=!0}}finally{b.Z=!0}}}}};\nbr.prototype.updateRelationshipsFromData=function(a){var b=a.data;if(null!==b){var c=a.diagram;if(null!==c){var d=c.model;a instanceof W&&(b=d.Mh(b),b=c.Cb(b),d=a.Fg(),b!==d&&(d=a.jj(),null!==b?null!==d?c.isTreePathToChildren?d.fromNode=b:d.toNode=b:cr(this,b,a):null!==d&&Nj(c,d,!1)))}}};br.prototype.updateDataBindings=function(a,b){vi.prototype.updateDataBindings.call(this,a,b);\"string\"===typeof b&&null!==this.zc(a)&&(a=this.yc(a),null!==a&&a.Da(b))};\nbr.prototype.resolveReferencesForData=function(a){var b=this.diagram.model,c=b.ja(a);if(void 0!==c){var d=Xq(b,c),e=this.zc(a);if(null!==d&&null!==e){for(d=d.iterator;d.next();){var f=d.value;b.ab(f)&&e instanceof W&&b.Mh(f)===c&&cr(this,e,this.gj(f))}Yq(b,c)}a=b.Mh(a);void 0!==a&&e instanceof W&&(a=this.Cb(a),cr(this,a,e))}};\nbr.prototype.unresolveReferencesForPart=function(a){var b=this.diagram.model;if(a instanceof W){var c=b.ja(a.data),d=this.yc(a.data);if(null!==d){d.isSelected=!1;d.isHighlighted=!1;var e=d.layer;if(null!==e){var f=e.Lc(-1,d,!1);0<=f&&this.diagram.Va(Ae,\"parts\",e,d,null,f,null);f=d.layerChanged;null!==f&&f(d,e,null)}}d=this.diagram.isTreePathToChildren;for(a=a.linksConnected;a.next();)e=a.value,e=(d?e.toNode:e.fromNode).data,b.ab(e)&&Zq(b,c,e)}};\nbr.prototype.insertLink=function(a,b,c){b=this.diagram.model;var d=a,e=c;this.diagram.isTreePathToChildren||(d=c,e=a);return null!==d&&null!==e?(b.fe(e.data,b.ja(d.data)),e.jj()):null};br.prototype.findLinkForKey=br.prototype.findLinkForKey;br.className=\"TreePartManager\";\nfunction Z(a){this.Oi=new G;this.Li=new G;this.tu=',\\n  \"insertedNodeKeys\": ';this.lx=',\\n  \"modifiedNodeData\": ';this.vu=',\\n  \"removedNodeKeys\": ';this.Yh=null;Xa(this);this.Ln=this.oa=\"\";this.$f=!1;this.l={};this.Fc=[];this.Wa=new H;this.Ni=\"key\";this.il=this.Pl=null;this.Cn=this.Dn=!1;this.Fn=!0;this.kn=null;this.Yj=\"category\";this.Tf=new H;this.cv=new E;this.vg=!1;this.u=null;this.undoManager=new Ce;void 0!==a&&(this.nodeDataArray=a)}\nZ.prototype.cloneProtected=function(a){a.oa=this.oa;a.Ln=this.Ln;a.$f=this.$f;a.Ni=this.Ni;a.Pl=this.Pl;a.il=this.il;a.Dn=this.Dn;a.Cn=this.Cn;a.Fn=this.Fn;a.kn=this.kn;a.Yj=this.Yj};Z.prototype.copy=function(){var a=new this.constructor;this.cloneProtected(a);return a};Z.prototype.clear=function(){this.Fc=[];this.Wa.clear();this.Tf.clear();this.undoManager.clear()};\nZ.prototype.toString=function(a){void 0===a&&(a=0);if(1<a)return this.fr();var b=(\"\"!==this.name?this.name:\"\")+\" Model\";if(0<a){b+=\"\\n node data:\";a=this.nodeDataArray;for(var c=a.length,d=0;d<c;d++){var e=a[d];b+=\" \"+this.ja(e)+\":\"+Ka(e)}}return b};\nZ.prototype.gB=function(a){a.change!==ye&&B(\"Model.toIncrementalData argument is not a Transaction ChangedEvent:\"+a.toString());var b=a.object;if(!(a.isTransactionFinished&&b instanceof Be))return null;dr(this,b);a=this.Yw(b,\"FinishedUndo\"===a.propertyName);this.Yh=null;return a};\nZ.prototype.Yw=function(a,b){var c=this,d=!1,e=new G,f=new G,g=new G,h=this.Yh;a.changes.each(function(a){a.model===c&&(\"nodeDataArray\"===a.modelChange?a.change===ze?e.add(a.newValue):a.change===Ae&&g.add(a.oldValue):c.ab(a.object)?f.add(a.object):a.change!==xe||c.modelData!==a.object&&\"modelData\"!==a.propertyName?null!==a.object&&(h&&h.contains(a.object)?h.get(a.object).each(function(a){c.ab(a)&&f.add(a)}):a.object instanceof Z||c.qj()&&c.xc(a.object)||er(c,a.object).each(function(a){f.add(a)})):\nd=!0)});var k=this.Li;k.clear();e.each(function(a){k.add(c.ja(a));b||f.add(a)});var l=this.Oi;l.clear();g.each(function(a){l.add(c.ja(a));b&&f.add(a)});a=c.cloneDeep(f.ma());var m=null;d&&(null===m&&(m={}),m.modelData=this.cloneDeep(this.modelData));0<k.count&&(null===m&&(m={}),b?m.removedNodeKeys=k.ma():m.insertedNodeKeys=k.ma());0<a.length&&(null===m&&(m={}),m.modifiedNodeData=a);0<l.count&&(null===m&&(m={}),b?m.insertedNodeKeys=l.ma():m.removedNodeKeys=l.ma());l.clear();k.clear();return m};\nZ.prototype.cloneDeep=function(a){return fr(this,a,!0)};\nfunction fr(a,b,c,d,e,f){function g(a,c){h?(void 0===a.__gohashid&&f.push(a),d.set(a,c)):(a=ob++,d.set(a,c),e.set(a,b))}if(!za(b))return b;f||(f=[]);var h=Object.isExtensible(b);d||(d=new H);if(h){var k=d.get(b);if(k)return k}else for(e||(e=new H),k=e.iterator;k.next();){var l=k.key;if(k.value===b&&(l=d.get(l)))return l}if(Array.isArray(b)){k=[];g(b,k);for(var m=0;m<b.length;m++)k.push(fr(a,b[m],!1,d,e,f))}else if(b instanceof J||b instanceof M||b instanceof N||b instanceof kc||b instanceof O)k=b.copy(),\ng(b,k);else{if(b instanceof zl||b instanceof rd||b instanceof D)return b;if(b instanceof E)k=(new E).addAll(fr(a,b.ma(),!1,d,e,f)),g(b,k);else if(b instanceof G)k=(new G).addAll(fr(a,b.ma(),!1,d,e,f)),g(b,k);else if(b instanceof H)k=(new H).addAll(fr(a,b.ma(),!1,d,e,f)),g(b,k);else if(b instanceof Date)k=new Date(b.getTime()),g(b,k);else if(b instanceof RegExp)k=new RegExp(b),g(b,k),k.lastIndex=b.lastIndex;else if(\"function\"===typeof b.copy)k=b.copy(),g(b,k);else for(m in k={},g(b,k),b)\"__gohashid\"!==\nm&&(k[m]=fr(a,b[m],!1,d,e,f))}c&&f.forEach(function(a){delete a.__gohashid});return k}t=Z.prototype;\nt.Vk=function(){var a=\"\";\"\"!==this.name&&(a+=',\\n  \"name\": '+this.quote(this.name));\"\"!==this.dataFormat&&(a+=',\\n  \"dataFormat\": '+this.quote(this.dataFormat));this.isReadOnly&&(a+=',\\n  \"isReadOnly\": '+this.isReadOnly);\"key\"!==this.nodeKeyProperty&&\"string\"===typeof this.nodeKeyProperty&&(a+=',\\n  \"nodeKeyProperty\": '+this.quote(this.nodeKeyProperty));this.copiesArrays&&(a+=',\\n  \"copiesArrays\": true');this.copiesArrayObjects&&(a+=',\\n  \"copiesArrayObjects\": true');this.copiesKey||(a+=',\\n  \"copiesKey\": false');\n\"category\"!==this.nodeCategoryProperty&&\"string\"===typeof this.nodeCategoryProperty&&(a+=',\\n  \"nodeCategoryProperty\": '+this.quote(this.nodeCategoryProperty));return a};\nt.Xq=function(a){a.name&&(this.name=a.name);a.dataFormat&&(this.dataFormat=a.dataFormat);a.isReadOnly&&(this.isReadOnly=!0);a.nodeKeyProperty&&(this.nodeKeyProperty=a.nodeKeyProperty);a.copiesArrays&&(this.copiesArrays=!0);a.copiesArrayObjects&&(this.copiesArrayObjects=!0);!1===a.copiesKey&&(this.copiesKey=!1);a.nodeCategoryProperty&&(this.nodeCategoryProperty=a.nodeCategoryProperty)};function gr(a){return',\\n  \"modelData\": '+hr(a,a.modelData)}\nfunction ir(a,b){b=b.modelData;za(b)&&(a.Om(b),a.modelData=b)}t.Zw=function(){var a=this.modelData,b=!1,c;for(c in a)if(!jr(c,a[c])){b=!0;break}a=\"\";b&&(a=gr(this));return a+',\\n  \"nodeDataArray\": '+kr(this,this.nodeDataArray,!0)};t.rw=function(a){ir(this,a);a=a.nodeDataArray;Aa(a)&&(this.Om(a),this.nodeDataArray=a)};\nfunction lr(a,b,c,d){if(b===c)return!0;if(typeof b!==typeof c||\"function\"===typeof b||\"function\"===typeof c)return!1;if(Array.isArray(b)&&Array.isArray(c)){if(d.G(b)===c)return!0;d.add(b,c);if(b.length!==c.length)return!1;for(var e=0;e<b.length;e++)if(!lr(a,b[e],c[e],d))return!1;return!0}if(za(b)&&za(c)){if(d.G(b)===c)return!0;d.add(b,c);for(var f in b){var g=b[f];if(!jr(f,g)){var h=c[f];if(void 0===h||!lr(a,g,h,d))return!1}}for(e in c)if(f=c[e],!jr(e,f)&&(g=b[e],void 0===g||!lr(a,g,f,d)))return!1;\nreturn!0}return!1}function mr(a,b,c){a[c]!==b[c]&&B(\"Model.computeJsonDifference: Model.\"+c+' is not the same in both models: \"'+a[c]+'\" and \"'+b[c]+'\"')}\nt.kr=function(a){mr(this,a,\"nodeKeyProperty\");var b=this.Li;b.clear();var c=new G,d=this.Oi;d.clear();d.addAll(this.Wa.iteratorKeys);for(var e=new H,f=a.nodeDataArray,g=f.length,h=0;h<g;h++){var k=f[h],l=a.ja(k);if(void 0!==l){d.remove(l);var m=this.Kb(l);null===m?(b.add(l),c.add(k)):lr(this,m,k,e)||c.add(k)}else this.Zt(k),l=this.ja(k),b.add(l),c.add(k)}f=\"\";lr(this,this.modelData,a.modelData,e)||(f+=gr(this));0<b.count&&(f+=this.tu+kr(this,b.ma(),!0));0<c.count&&(f+=this.lx+kr(this,c.ma(),!0));\n0<d.count&&(f+=this.vu+kr(this,d.ma(),!0));d.clear();b.clear();return f};t.Dz=function(a,b){void 0===b&&(b=nr(this,this));return'{ \"class\": '+this.quote(b)+', \"incremental\": 1'+this.Vk()+this.kr(a)+\"}\"};\nfunction dr(a,b){function c(a,b){if(b=b.part)if(b=b.data,a!==b){var c=d.get(a);null===c?(c=new G,c.add(b),d.add(a,c)):c.add(b)}}var d=a.Yh;null===d&&(d=new H,b.changes.each(function(a){if(null!==a.diagram){var b=a.change;if(b===xe)(a=a.object.panel)&&(b=a.data)&&c(b,a);else if(b===ze||b===Ae)a=a.object,(b=a.itemArray)&&c(b,a)}}),a.Yh=d)}function er(a,b){for(var c=new G,d=0;d<a.nodeDataArray.length;d++){var e=a.nodeDataArray[d];or(a,b,e,e,c)}return c}\nfunction or(a,b,c,d,e){if(Array.isArray(c))for(var f=0;f<c.length;f++){var g=c[f];if(g===b)return e.add(d),!0;if(or(a,b,g,d,e))return!0}else if(za(c)&&Object.getPrototypeOf(c)===Object.prototype)for(f in c){g=c[f];if(g===b)return e.add(d),!0;if(or(a,b,g,d,e))return!0}return!1}\nt.Xw=function(a,b){var c=this,d=!1,e=new G,f=new G,g=new G,h=this.Yh;a.changes.each(function(a){a.model===c&&(\"nodeDataArray\"===a.modelChange?a.change===ze?e.add(a.newValue):a.change===Ae&&g.add(a.oldValue):c.ab(a.object)?f.add(a.object):a.change!==xe||c.modelData!==a.object&&\"modelData\"!==a.propertyName?null!==a.object&&(h&&h.contains(a.object)?h.get(a.object).each(function(a){c.ab(a)&&f.add(a)}):a.object instanceof Z||c.qj()&&c.xc(a.object)||er(c,a.object).each(function(a){f.add(a)})):d=!0)});var k=\nthis.Li;k.clear();e.each(function(a){k.add(c.ja(a));b||f.add(a)});var l=this.Oi;l.clear();g.each(function(a){l.add(c.ja(a));b&&f.add(a)});a=\"\";d&&(a+=gr(this));0<k.count&&(a+=(b?this.vu:this.tu)+kr(this,k.ma(),!0));0<f.count&&(a+=this.lx+kr(this,f.ma(),!0));0<l.count&&(a+=(b?this.tu:this.vu)+kr(this,l.ma(),!0));l.clear();k.clear();return a};\nt.Wq=function(a){(void 0!==a.name&&a.name!==this.name||void 0!==a.dataFormat&&a.dataFormat!==this.dataFormat||void 0!==a.isReadOnly&&a.isReadOnly!==this.isReadOnly||void 0!==a.nodeKeyProperty&&a.nodeKeyProperty!==this.nodeKeyProperty||void 0!==a.copiesArrays&&a.copiesArrays!==this.copiesArrays||void 0!==a.copiesArrayObjects&&a.copiesArrayObjects!==this.copiesArrayObjects||void 0!==a.copiesKey&&a.copiesKey!==this.copiesKey||void 0!==a.nodeCategoryProperty&&a.nodeCategoryProperty!==this.nodeCategoryProperty)&&\nB(\"applyIncrementalJson cannot change Model properties\");ir(this,a);var b=a.insertedNodeKeys,c=a.modifiedNodeData,d=new H;if(Array.isArray(c))for(var e=0;e<c.length;e++){var f=c[e],g=this.ja(f);void 0!==g&&null!==g&&d.set(g,f)}if(Array.isArray(b))for(e=b.length,f=0;f<e;f++){g=b[f];var h=this.Kb(g);null===h&&(h=(h=d.get(g))?h:this.copyNodeData({}),this.Vm(h,g),this.uf(h))}if(Array.isArray(c))for(b=c.length,d=0;d<b;d++)if(e=c[d],f=this.ja(e),f=this.Kb(f),null!==f){for(var k in e)\"__gohashid\"===k||k===\nthis.nodeKeyProperty||this.Ck()&&k===this.nodeIsGroupProperty||this.setDataProperty(f,k,e[k]);this.Wm(e,f)}a=a.removedNodeKeys;if(Array.isArray(a))for(c=a.length,k=0;k<c;k++)b=this.Kb(a[k]),null!==b&&this.Nm(b)};\nt.Yy=function(a,b){a.change!==ye&&B(\"Model.toIncrementalJson argument is not a Transaction ChangedEvent:\"+a.toString());var c=a.object;if(!(a.isTransactionFinished&&c instanceof Be))return'{ \"incremental\": 0 }';void 0===b&&(b=nr(this,this));dr(this,c);a=this.Xw(c,\"FinishedUndo\"===a.propertyName);this.Yh=null;return\"2\"===b?'{ \"incremental\": 2'+a+\"}\":'{ \"class\": '+this.quote(b)+', \"incremental\": 1'+this.Vk()+a+\"}\"};t.hB=function(a,b){return this.Yy(a,b)};\nt.fr=function(a){void 0===a&&(a=nr(this,this));return'{ \"class\": '+this.quote(a)+this.Vk()+this.Zw()+\"}\"};t.toJSON=function(a){return this.fr(a)};t.Xx=function(a){var b=null;if(\"string\"===typeof a)try{b=x.JSON.parse(a)}catch(d){}else\"object\"===typeof a?b=a:B(\"Unable to modify a Model from: \"+a);var c=b.incremental;\"number\"!==typeof c&&B(\"Unable to apply non-incremental changes to Model: \"+a);0!==c&&(this.va(\"applyIncrementalJson\"),this.Wq(b),this.Xa(\"applyIncrementalJson\"))};t.vz=function(a){return this.Xx(a)};\nZ.constructGraphLinksModel=function(){return new Z};t=Z.prototype;\nt.Om=function(a){if(Aa(a))for(var b=a.length,c=0;c<b;c++){var d=a[c];if(za(d)){var e=c;d=this.Om(d);Array.isArray(a)?a[e]=d:B(\"Cannot replace an object in an HTMLCollection or NodeList at \"+e)}}else if(za(a)){for(b in a)if(c=a[b],za(c)&&(c=this.Om(c),a[b]=c,\"points\"===b&&Array.isArray(c))){e=0===c.length%2;for(d=0;d<c.length;d++)if(\"number\"!==typeof c[d]){e=!1;break}if(e){e=new E;for(d=0;d<c.length/2;d++)e.add(new J(c[2*d],c[2*d+1]));e.freeze();a[b]=e}}return pr(a)}return a};\nt.quote=function(a){for(var b=\"\",c=a.length,d=0;d<c;d++){var e=a[d];if('\"'===e||\"\\\\\"===e)b+=\"\\\\\"+e;else if(\"\\b\"===e)b+=\"\\\\b\";else if(\"\\f\"===e)b+=\"\\\\f\";else if(\"\\n\"===e)b+=\"\\\\n\";else if(\"\\r\"===e)b+=\"\\\\r\";else if(\"\\t\"===e)b+=\"\\\\t\";else{var f=a.charCodeAt(d);b=16>f?b+(\"\\\\u000\"+a.charCodeAt(d).toString(16)):32>f?b+(\"\\\\u00\"+a.charCodeAt(d).toString(16)):8232===f?b+\"\\\\u2028\":8233===f?b+\"\\\\u2029\":b+e}}return'\"'+b+'\"'};\nt.bn=function(a){return void 0===a?\"undefined\":null===a?\"null\":!0===a?\"true\":!1===a?\"false\":\"string\"===typeof a?this.quote(a):\"number\"===typeof a?Infinity===a?\"9e9999\":-Infinity===a?\"-9e9999\":isNaN(a)?'{\"class\":\"NaN\"}':a.toString():a instanceof Date?'{\"class\":\"Date\", \"value\":\"'+a.toJSON()+'\"}':a instanceof Number?this.bn(a.valueOf()):Aa(a)?kr(this,a):za(a)?hr(this,a):\"function\"===typeof a?\"null\":a.toString()};\nfunction kr(a,b,c){void 0===c&&(c=!1);var d=b.length;if(0>=d)return\"[]\";var e=new Za;e.add(\"[\");c&&1<d&&e.add(\"\\n\");for(var f=0;f<d;f++){var g=b[f];void 0!==g&&(0<f&&(e.add(\",\"),c&&e.add(\"\\n\")),e.add(a.bn(g)))}c&&1<d&&e.add(\"\\n\");e.add(\"]\");return e.toString()}function jr(a,b){return void 0===b||\"__gohashid\"===a||\"_\"===a[0]||\"function\"===typeof b?!0:!1}function qr(a){return isNaN(a)?\"NaN\":Infinity===a?\"9e9999\":-Infinity===a?\"-9e9999\":a}\nfunction hr(a,b){var c=b;if(c instanceof J)b={\"class\":\"go.Point\",x:qr(c.x),y:qr(c.y)};else if(c instanceof M)b={\"class\":\"go.Size\",width:qr(c.width),height:qr(c.height)};else if(c instanceof N)b={\"class\":\"go.Rect\",x:qr(c.x),y:qr(c.y),width:qr(c.width),height:qr(c.height)};else if(c instanceof kc)b={\"class\":\"go.Margin\",top:qr(c.top),right:qr(c.right),bottom:qr(c.bottom),left:qr(c.left)};else if(c instanceof O)c.kb()?b={\"class\":\"go.Spot\",x:qr(c.x),y:qr(c.y),offsetX:qr(c.offsetX),offsetY:qr(c.offsetY)}:\nb={\"class\":\"go.Spot\",\"enum\":c.toString()};else if(c instanceof zl){b={\"class\":\"go.Brush\",type:c.type.name};if(c.type===Cl)b.color=c.color;else if(c.type===Fl||c.type===Al)b.start=c.start,b.end=c.end,c.type===Al&&(0!==c.startRadius&&(b.startRadius=qr(c.startRadius)),isNaN(c.endRadius)||(b.endRadius=qr(c.endRadius)));if(null!==c.colorStops){var d={};for(c=c.colorStops.iterator;c.next();)d[c.key]=c.value;b.colorStops=d}}else c instanceof rd?(b={\"class\":\"go.Geometry\",type:c.type.name},0!==c.startX&&(b.startX=\nqr(c.startX)),0!==c.startY&&(b.startY=qr(c.startY)),0!==c.endX&&(b.endX=qr(c.endX)),0!==c.endY&&(b.endY=qr(c.endY)),c.spot1.w(tc)||(b.spot1=c.spot1),c.spot2.w(Dc)||(b.spot2=c.spot2),c.type===sd&&(b.path=xd(c))):c instanceof D&&(b={\"class\":\"go.EnumValue\",classType:nr(a,c.classType),name:c.name});d=\"{\";c=!0;for(var e in b){var f=vn(b,e);if(!jr(e,f))if(c?c=!1:d+=\",\",d+=JSON.stringify(e)+\":\",\"points\"===e&&f instanceof E){var g=\"[\";for(f=f.iterator;f.next();){var h=f.value;1<g.length&&(g+=\",\");g+=a.bn(h.x);\ng+=\",\";g+=a.bn(h.y)}g+=\"]\";d+=g}else d+=a.bn(f)}return d+\"}\"}function rr(a){return\"number\"===typeof a?a:\"NaN\"===a?NaN:\"9e9999\"===a?Infinity:\"-9e9999\"===a?-Infinity:parseFloat(a)}\nfunction pr(a){if(\"object\"!==typeof a)return a;var b=a[\"class\"]||\"\";if(\"NaN\"===b)return NaN;if(\"Date\"===b)return new Date(a.value);if(0!==b.indexOf(\"go.\"))return a;b=b.substr(3);var c=a;if(\"Point\"===b)c=new J(rr(a.x),rr(a.y));else if(\"Size\"===b)c=new M(rr(a.width),rr(a.height));else if(\"Rect\"===b)c=new N(rr(a.x),rr(a.y),rr(a.width),rr(a.height));else if(\"Margin\"===b)c=new kc(rr(a.top),rr(a.right),rr(a.bottom),rr(a.left));else if(\"Spot\"===b)\"string\"===typeof a[\"enum\"]?c=id(a[\"enum\"]):c=new O(rr(a.x),\nrr(a.y),rr(a.offsetX),rr(a.offsetY));else if(\"Brush\"===b){if(c=new zl,c.type=Ya(zl,a.type),\"string\"===typeof a.color&&(c.color=a.color),a.start instanceof O&&(c.start=a.start),a.end instanceof O&&(c.end=a.end),\"number\"===typeof a.startRadius&&(c.startRadius=rr(a.startRadius)),\"number\"===typeof a.endRadius&&(c.endRadius=rr(a.endRadius)),a=a.colorStops,za(a))for(var d in a)c.addColorStop(parseFloat(d),a[d])}else\"Geometry\"===b?(c=null,\"string\"===typeof a.path?c=Dd(a.path):c=new rd,c.type=Ya(rd,a.type),\n\"number\"===typeof a.startX&&(c.startX=rr(a.startX)),\"number\"===typeof a.startY&&(c.startY=rr(a.startY)),\"number\"===typeof a.endX&&(c.endX=rr(a.endX)),\"number\"===typeof a.endY&&(c.endY=rr(a.endY)),a.spot1 instanceof O&&(c.spot1=a.spot1),a.spot2 instanceof O&&(c.spot2=a.spot2)):\"EnumValue\"===b&&(d=a.classType,0===d.indexOf(\"go.\")&&(d=d.substr(3)),d=tr(d),\"function\"===typeof d&&(c=Ya(d,a.name)));return c}t.Hh=function(a){this.cv.add(a)};t.Tk=function(a){this.cv.remove(a)};\nt.zt=function(a){this.skipsUndoManager||this.undoManager.aw(a);for(var b=this.cv,c=b.length,d=0;d<c;d++)b.J(d)(a)};t.Va=function(a,b,c,d,e,f,g){ur(this,\"\",a,b,c,d,e,f,g)};t.g=function(a,b,c,d,e){ur(this,\"\",xe,a,this,b,c,d,e)};t.du=function(a,b,c,d,e,f){ur(this,\"\",xe,b,a,c,d,e,f)};function ur(a,b,c,d,e,f,g,h,k){void 0===h&&(h=null);void 0===k&&(k=null);var l=new we;l.model=a;l.change=c;l.modelChange=b;l.propertyName=d;l.object=e;l.oldValue=f;l.oldParam=h;l.newValue=g;l.newParam=k;a.zt(l)}\nZ.prototype.changeState=function(a,b){if(null!==a&&a.model===this)if(a.change===xe){var c=a.object,d=a.propertyName,e=a.G(b);d===this.nodeKeyProperty&&this.ab(c)&&(b=a.G(!b),void 0!==b&&this.Wa.remove(b),void 0!==e&&this.Wa.add(e,c));Uj(c,d,e)}else a.change===ze?(c=a.newParam,\"nodeDataArray\"===a.modelChange?(a=a.newValue,za(a)&&\"number\"===typeof c&&(d=this.ja(a),b?(this.Fc[c]===a&&Da(this.Fc,c),void 0!==d&&this.Wa.remove(d)):(this.Fc[c]!==a&&Ca(this.Fc,c,a),void 0!==d&&this.Wa.add(d,a)))):\"\"===a.modelChange?\n((d=a.object)&&!Aa(d)&&a.propertyName&&(d=vn(a.object,a.propertyName)),Aa(d)&&\"number\"===typeof c&&(a=a.newValue,b?Da(d,c):Ca(d,c,a))):B(\"unknown ChangedEvent.Insert modelChange: \"+a.toString())):a.change===Ae?(c=a.oldParam,\"nodeDataArray\"===a.modelChange?(a=a.oldValue,za(a)&&\"number\"===typeof c&&(d=this.ja(a),b?(this.Fc[c]!==a&&Ca(this.Fc,c,a),void 0!==d&&this.Wa.add(d,a)):(this.Fc[c]===a&&Da(this.Fc,c),void 0!==d&&this.Wa.remove(d)))):\"\"===a.modelChange?((d=a.object)&&!Aa(d)&&a.propertyName&&(d=\nvn(a.object,a.propertyName)),Aa(d)&&\"number\"===typeof c&&(a=a.oldValue,b?Ca(d,c,a):Da(d,c))):B(\"unknown ChangedEvent.Remove modelChange: \"+a.toString())):a.change!==ye&&B(\"unknown ChangedEvent: \"+a.toString())};Z.prototype.va=function(a){return this.undoManager.va(a)};Z.prototype.Xa=function(a){return this.undoManager.Xa(a)};Z.prototype.If=function(){return this.undoManager.If()};\nZ.prototype.commit=function(a,b){void 0===b&&(b=\"\");var c=this.skipsUndoManager;null===b&&(this.skipsUndoManager=!0,b=\"\");this.undoManager.va(b);var d=!1;try{a(this),d=!0}finally{d?this.undoManager.Xa(b):this.undoManager.If(),this.skipsUndoManager=c}};t=Z.prototype;t.Da=function(a,b){void 0===b&&(b=\"\");ur(this,\"SourceChanged\",ye,b,a,null,null)};\nt.ja=function(a){if(null!==a){var b=this.Ni;if(\"\"!==b&&(b=vn(a,b),void 0!==b)){if(Uq(b))return b;B(\"Key value for node data \"+a+\" is not a number or a string: \"+b)}}};t.Vm=function(a,b){if(null!==a){var c=this.Ni;if(\"\"!==c)if(this.ab(a)){var d=vn(a,c);d!==b&&null===this.Kb(b)&&(Uj(a,c,b),void 0!==d&&this.Wa.remove(d),this.Wa.add(b,a),ur(this,\"nodeKey\",xe,c,a,d,b),\"string\"===typeof c&&this.Da(a,c),this.ar(d,b))}else Uj(a,c,b)}};function Uq(a){return\"number\"===typeof a||\"string\"===typeof a}\nt.ab=function(a){var b=this.ja(a);return void 0===b?!1:this.Wa.G(b)===a};t.Kb=function(a){null===a&&B(\"Model.findNodeDataForKey:key must not be null\");return void 0!==a&&Uq(a)?this.Wa.G(a):null};\nt.Zt=function(a){if(null!==a){var b=this.Ni;if(\"\"!==b){var c=this.ja(a);if(void 0===c||this.Wa.contains(c)){var d=this.Pl;if(null!==d&&(c=d(this,a),void 0!==c&&null!==c&&!this.Wa.contains(c))){Uj(a,b,c);return}if(\"string\"===typeof c){for(d=2;this.Wa.contains(c+d);)d++;Uj(a,b,c+d)}else if(void 0===c||\"number\"===typeof c){for(c=-this.Wa.count-1;this.Wa.contains(c);)c--;Uj(a,b,c)}}}}};t.uf=function(a){null!==a&&(mb(a),this.ab(a)||Mq(this,a,!0))};\nfunction Mq(a,b,c){var d=a.ja(b);if(void 0===d||a.Wa.G(d)!==b)a.Zt(b),d=a.ja(b),void 0===d?B(\"Model.makeNodeDataKeyUnique failed on \"+b+\".  Data not added to Model.\"):(a.Wa.add(d,b),d=null,c&&(d=a.Fc.length,Ca(a.Fc,d,b)),ur(a,\"nodeDataArray\",ze,\"nodeDataArray\",a,null,b,null,d),a.Qm(b),a.Pm(b))}t.qz=function(a){if(Aa(a))for(var b=a.length,c=0;c<b;c++)this.uf(a[c]);else for(a=a.iterator;a.next();)this.uf(a.value)};t.Nm=function(a){null!==a&&Lq(this,a,!0)};\nfunction Lq(a,b,c){var d=a.ja(b);void 0!==d&&a.Wa.remove(d);d=null;if(c){a:if(c=a.Fc,Array.isArray(c))d=c.indexOf(b);else{d=c.length;for(var e=0;e<d;e++)if(c[e]===b){d=e;break a}d=-1}if(0>d)return;Da(a.Fc,d)}ur(a,\"nodeDataArray\",Ae,\"nodeDataArray\",a,b,null,d,null);a.hr(b)}t.WA=function(a){if(Aa(a))for(var b=a.length,c=0;c<b;c++)this.Nm(a[c]);else for(a=a.iterator;a.next();)this.Nm(a.value)};\nt.KA=function(a){if(a!==this.nodeDataArray&&Aa(a)){var b=this.Oi;b.clear();b.addAll(this.Wa.iteratorKeys);var c=this.Li;c.clear();for(var d=a.length,e=0;e<d;e++){var f=a[e],g=this.ja(f);if(void 0!==g){c.add(g);var h=this.Kb(g);h!==f&&(null!==h?(this.vq(h,f),this.Wm(f,h)):(f=this.cloneDeep(f),this.Vm(f,g),this.uf(f)))}else g=this.cloneDeep(f),this.uf(g),c.add(this.ja(g))}for(a=b.iterator;a.next();)d=a.value,c.contains(d)||(d=this.Kb(d))&&this.Nm(d);b.clear();c.clear()}};\nt.ar=function(a,b){void 0!==b&&(a=Xq(this,a),a instanceof G&&this.Tf.add(b,a))};t.Sw=function(){};t.Qm=function(){};t.Pm=function(){};t.hr=function(){};function Zq(a,b,c){if(void 0!==b){var d=a.Tf.G(b);null===d&&(d=new G,a.Tf.add(b,d));d.add(c)}}function Yq(a,b,c){if(void 0!==b){var d=a.Tf.G(b);d instanceof G&&(void 0===c||null===c?a.Tf.remove(b):(d.remove(c),0===d.count&&a.Tf.remove(b)))}}function Xq(a,b){if(void 0===b)return null;a=a.Tf.G(b);return a instanceof G?a:null}\nt.Cz=function(a){void 0===a?this.Tf.clear():this.Tf.remove(a)};Z.prototype.copyNodeData=function(a){if(null===a)return null;var b=this.il;a=null!==b?b(a,this):vr(this,a,!0);za(a)&&Xa(a);return a};\nfunction vr(a,b,c){if(a.copiesArrays&&Array.isArray(b)){var d=[];for(c=0;c<b.length;c++){var e=vr(a,b[c],a.copiesArrayObjects);d.push(e)}Xa(d);return d}if(c&&za(b)){c=(c=b.constructor)?new c:{};e=a.copiesKey||\"string\"!==typeof a.nodeKeyProperty?null:a.nodeKeyProperty;for(d in b)if(\"__gohashid\"===d)c.__gohashid=void 0;else if(d===e)c[e]=void 0;else{var f=vn(b,d),g=nr(a,f);\"GraphObject\"===g||\"Diagram\"===g||\"Layer\"===g||\"RowColumnDefinition\"===g||\"AnimationManager\"===g||\"Tool\"===g||\"CommandHandler\"===\ng||\"Layout\"===g||\"InputEvent\"===g||\"DiagramEvent\"===g||f instanceof Z||f instanceof Ce||f instanceof Be||f instanceof we?Uj(c,d,f):(f=vr(a,f,!1),Uj(c,d,f))}Xa(c);return c}return b instanceof J?b.copy():b instanceof M?b.copy():b instanceof N?b.copy():b instanceof O?b.copy():b instanceof kc?b.copy():b}\nZ.prototype.setDataProperty=function(a,b,c){if(this.ab(a)){if(b===this.nodeKeyProperty){this.Vm(a,c);return}if(b===this.nodeCategoryProperty){this.Um(a,c);return}}else!wr&&a instanceof Y&&(wr=!0,xa('Model.setDataProperty is modifying a GraphObject, \"'+a.toString()+'\"'),xa(\"  Is that really your intent?\"));var d=vn(a,b);d!==c&&(Uj(a,b,c),this.du(a,b,d,c))};t=Z.prototype;t.set=function(a,b,c){this.setDataProperty(a,b,c)};\nt.vq=function(a,b){if(b){var c=this.ab(a),d;for(d in b)\"__gohashid\"===d||c&&d===this.nodeKeyProperty||this.setDataProperty(a,d,b[d])}};t.mz=function(a,b){this.Pt(a,-1,b)};t.Pt=function(a,b,c){0>b&&(b=a.length);Ca(a,b,c);ur(this,\"\",ze,\"\",a,null,c,null,b)};t.tw=function(a,b){void 0===b&&(b=-1);a===this.Fc&&B(\"Model.removeArrayItem should not be called on the Model.nodeDataArray\");-1===b&&(b=a.length-1);var c=a[b];Da(a,b);ur(this,\"\",Ae,\"\",a,c,null,b,null)};\nt.Iq=function(a){if(null===a)return\"\";var b=this.Yj;if(\"\"===b)return\"\";b=vn(a,b);if(void 0===b)return\"\";if(\"string\"===typeof b)return b;B(\"getCategoryForNodeData found a non-string category for \"+a+\": \"+b);return\"\"};t.Um=function(a,b){if(null!==a){var c=this.Yj;if(\"\"!==c)if(this.ab(a)){var d=vn(a,c);void 0===d&&(d=\"\");d!==b&&(Uj(a,c,b),ur(this,\"nodeCategory\",xe,c,a,d,b))}else Uj(a,c,b)}};t.Wm=function(a,b){this.Um(b,this.Iq(a))};t.Em=function(){return!1};t.Ck=function(){return!1};t.qj=function(){return!1};\nt.Ut=function(){return!1};t.Dk=function(){return!1};function yi(){return new Z}function nr(a,b){if(\"function\"===typeof b){if(b.className)return b.className;if(b.name)return b.name}else if(\"object\"===typeof b&&null!==b&&b.constructor)return nr(a,b.constructor);return typeof b}function tr(a){return xr[a]?xr[a]:void 0!==x.go&&x.go[a]?x.go[a]:null}\nfunction vn(a,b){if(!a||!b)return null;try{if(\"function\"===typeof b)var c=b(a);else\"function\"===typeof a.getAttribute?(c=a.getAttribute(b),null===c&&(c=void 0)):c=a[b]}catch(d){}return c}function Uj(a,b,c){if(a&&b)try{\"function\"===typeof b?b(a,c):\"function\"===typeof a.setAttribute?a.setAttribute(b,c):a[b]=c}catch(d){}}\nna.Object.defineProperties(Z.prototype,{name:{get:function(){return this.oa},set:function(a){var b=this.oa;b!==a&&(this.oa=a,this.g(\"name\",b,a))}},dataFormat:{get:function(){return this.Ln},set:function(a){var b=this.Ln;b!==a&&(this.Ln=a,this.g(\"dataFormat\",b,a))}},isReadOnly:{get:function(){return this.$f},set:function(a){var b=this.$f;b!==a&&(this.$f=a,this.g(\"isReadOnly\",b,a))}},modelData:{\nget:function(){return this.l},set:function(a){var b=this.l;b!==a&&(this.l=a,this.g(\"modelData\",b,a),this.Da(a))}},undoManager:{get:function(){return this.u},set:function(a){var b=this.u;b!==a&&(null!==b&&b.Py(this),this.u=a,null!==a&&a.Vx(this))}},skipsUndoManager:{get:function(){return this.vg},set:function(a){this.vg=a}},nodeKeyProperty:{get:function(){return this.Ni},set:function(a){var b=this.Ni;\nb!==a&&(\"\"===a&&B(\"Model.nodeKeyProperty may not be the empty string\"),0<this.Wa.count&&B(\"Cannot set Model.nodeKeyProperty when there is existing node data\"),this.Ni=a,this.g(\"nodeKeyProperty\",b,a))}},makeUniqueKeyFunction:{get:function(){return this.Pl},set:function(a){var b=this.Pl;b!==a&&(this.Pl=a,this.g(\"makeUniqueKeyFunction\",b,a))}},nodeDataArray:{get:function(){return this.Fc},set:function(a){var b=this.Fc;if(b!==a){this.Wa.clear();\nthis.Sw();for(var c=a.length,d=0;d<c;d++){var e=a[d];if(!za(e)){B(\"Model.nodeDataArray must only contain Objects, not: \"+e);return}mb(e)}this.Fc=a;d=new E;for(e=0;e<c;e++){var f=a[e],g=this.ja(f);void 0===g?d.add(f):null!==this.Wa.G(g)?d.add(f):this.Wa.add(g,f)}for(d=d.iterator;d.next();)e=d.value,this.Zt(e),f=this.ja(e),void 0!==f&&this.Wa.add(f,e);ur(this,\"nodeDataArray\",xe,\"nodeDataArray\",this,b,a);for(b=0;b<c;b++)d=a[b],this.Qm(d),this.Pm(d);Array.isArray(a)||(this.isReadOnly=!0)}}},copyNodeDataFunction:{\nget:function(){return this.il},set:function(a){var b=this.il;b!==a&&(this.il=a,this.g(\"copyNodeDataFunction\",b,a))}},copiesArrays:{get:function(){return this.Dn},set:function(a){var b=this.Dn;b!==a&&(this.Dn=a,this.g(\"copiesArrays\",b,a))}},copiesArrayObjects:{get:function(){return this.Cn},set:function(a){var b=this.Cn;b!==a&&(this.Cn=a,this.g(\"copiesArrayObjects\",b,a))}},copiesKey:{get:function(){return this.Fn},\nset:function(a){var b=this.Fn;b!==a&&(this.Fn=a,this.g(\"copiesKey\",b,a))}},afterCopyFunction:{get:function(){return this.kn},set:function(a){var b=this.kn;b!==a&&(this.kn=a,this.g(\"afterCopyFunction\",b,a))}},nodeCategoryProperty:{get:function(){return this.Yj},set:function(a){var b=this.Yj;b!==a&&(this.Yj=a,this.g(\"nodeCategoryProperty\",b,a))}},type:{get:function(){return\"Model\"}}});\nZ.prototype.setCategoryForNodeData=Z.prototype.Um;Z.prototype.getCategoryForNodeData=Z.prototype.Iq;Z.prototype.removeArrayItem=Z.prototype.tw;Z.prototype.insertArrayItem=Z.prototype.Pt;Z.prototype.addArrayItem=Z.prototype.mz;Z.prototype.assignAllDataProperties=Z.prototype.vq;Z.prototype.set=Z.prototype.set;Z.prototype.clearUnresolvedReferences=Z.prototype.Cz;Z.prototype.mergeNodeDataArray=Z.prototype.KA;Z.prototype.removeNodeDataCollection=Z.prototype.WA;Z.prototype.removeNodeData=Z.prototype.Nm;\nZ.prototype.addNodeDataCollection=Z.prototype.qz;Z.prototype.addNodeData=Z.prototype.uf;Z.prototype.makeNodeDataKeyUnique=Z.prototype.Zt;Z.prototype.findNodeDataForKey=Z.prototype.Kb;Z.prototype.containsNodeData=Z.prototype.ab;Z.prototype.setKeyForNodeData=Z.prototype.Vm;Z.prototype.getKeyForNodeData=Z.prototype.ja;Z.prototype.updateTargetBindings=Z.prototype.Da;Z.prototype.commit=Z.prototype.commit;Z.prototype.rollbackTransaction=Z.prototype.If;Z.prototype.commitTransaction=Z.prototype.Xa;\nZ.prototype.startTransaction=Z.prototype.va;Z.prototype.raiseDataChanged=Z.prototype.du;Z.prototype.raiseChanged=Z.prototype.g;Z.prototype.raiseChangedEvent=Z.prototype.Va;Z.prototype.removeChangedListener=Z.prototype.Tk;Z.prototype.addChangedListener=Z.prototype.Hh;Z.prototype.writeJsonValue=Z.prototype.bn;Z.prototype.replaceJsonObjects=Z.prototype.Om;Z.prototype.applyIncrementalJSON=Z.prototype.vz;Z.prototype.applyIncrementalJson=Z.prototype.Xx;Z.prototype.toJSON=Z.prototype.toJSON;\nZ.prototype.toJson=Z.prototype.fr;Z.prototype.toIncrementalJSON=Z.prototype.hB;Z.prototype.toIncrementalJson=Z.prototype.Yy;Z.prototype.computeJsonDifference=Z.prototype.Dz;Z.prototype.toIncrementalData=Z.prototype.gB;Z.prototype.clear=Z.prototype.clear;var wr=!1,xr={};Z.className=\"Model\";\nZ.fromJSON=Z.fromJson=function(a,b){void 0===b&&(b=null);var c=null;if(\"string\"===typeof a)try{c=x.JSON.parse(a)}catch(f){}else\"object\"===typeof a?c=a:B(\"Unable to construct a Model from: \"+a);if(null===b){a=null;var d=c[\"class\"];if(\"string\"===typeof d)try{var e=null;0===d.indexOf(\"go.\")?(d=d.substr(3),e=tr(d)):(e=tr(d),null===e&&(e=x[d]));\"function\"===typeof e&&(a=new e)}catch(f){}null===a||a instanceof Z?b=a:B(\"Unable to construct a Model of declared class: \"+c[\"class\"])}null===b&&(b=Z.constructGraphLinksModel());\nb.Xq(c);b.rw(c);return b};Z.safePropertyValue=vn;Z.safePropertySet=Uj;xr.Brush=zl;xr.ChangedEvent=we;xr.Geometry=rd;xr.Margin=kc;xr.Panel=X;xr.Point=J;xr.Rect=N;xr.Size=M;xr.Spot=O;xr.Transaction=Be;xr.UndoManager=Ce;function Hi(a,b,c){Xa(this);this.v=!1;void 0===a&&(a=\"\");void 0===b&&(b=a);void 0===c&&(c=null);this.l=-1;this.pd=null;this.pm=a;this.om=this.hq=0;this.ht=null;this.Ao=!1;this.hm=b;this.Bn=c;this.Zo=yr;this.un=null;this.Ou=new G}\nHi.prototype.copy=function(){var a=new Hi;a.pm=this.pm;a.hq=this.hq;a.om=this.om;a.ht=this.ht;a.Ao=this.Ao;a.hm=this.hm;a.Bn=this.Bn;a.Zo=this.Zo;a.un=this.un;return a};t=Hi.prototype;t.jb=function(a){a.classType===Hi&&(this.mode=a)};t.toString=function(){return\"Binding(\"+this.targetProperty+\":\"+this.sourceProperty+(-1!==this.wj?\" \"+this.wj:\"\")+\" \"+this.mode.name+\")\"};t.freeze=function(){this.v=!0;return this};t.ea=function(){this.v=!1;return this};\nt.Iy=function(a){void 0===a&&(a=null);this.mode=on;this.backConverter=a;return this};t.Uq=function(a){void 0===a&&(a=\"\");this.sourceName=a;this.isToModel=!1;return this};t.MA=function(){this.sourceName=null;this.isToModel=!0;return this};function ml(a,b,c){a=a.sourceName;return null===a||\"\"===a?b:\"/\"===a?c.part:\".\"===a?c:\"..\"===a?c.panel:b.bb(a)}\nt.Tw=function(a,b,c){var d=this.hm;if(void 0===c||\"\"===d||d===c){c=this.pm;var e=this.Bn;if(null===e&&\"\"===c)xa(\"Binding error: target property is the empty string: \"+this.toString());else{var f=b;\"\"!==d&&(f=vn(b,d));if(void 0!==f)if(null===e)\"\"!==c&&Uj(a,c,f);else try{if(\"\"!==c){var g=e(f,a);Uj(a,c,g)}else e(f,a)}catch(h){}}}};\nt.jr=function(a,b,c,d){if(this.Zo===on){var e=this.pm;if(void 0===c||e===c){c=this.hm;var f=this.un,g=a;\"\"!==e&&(g=vn(a,e));if(void 0!==g&&!this.Ou.contains(a))try{this.Ou.add(a);var h=null!==d?d.diagram:null,k=null!==h?h.model:null;if(null===f)if(\"\"!==c)null!==k?k.setDataProperty(b,c,g):Uj(b,c,g);else{if(null!==k&&null!==d&&0<=d.itemIndex&&null!==d.panel&&Array.isArray(d.panel.itemArray)){var l=d.itemIndex,m=d.panel.itemArray;k.tw(m,l);k.Pt(m,l,g)}}else try{if(\"\"!==c){var n=f(g,b,k);null!==k?k.setDataProperty(b,\nc,n):Uj(b,c,n)}else{var p=f(g,b,k);if(void 0!==p&&null!==k&&null!==d&&0<=d.itemIndex&&null!==d.panel&&Array.isArray(d.panel.itemArray)){var r=d.itemIndex,q=d.panel.itemArray;k.tw(q,r);k.Pt(q,r,p)}}}catch(u){}}finally{this.Ou.remove(a)}}}};\nna.Object.defineProperties(Hi.prototype,{wj:{get:function(){return this.l},set:function(a){this.v&&va(this);this.l=a}},targetProperty:{get:function(){return this.pm},set:function(a){this.v&&va(this);this.pm=a}},sourceName:{get:function(){return this.ht},set:function(a){this.v&&va(this);this.ht=a;null!==a&&(this.Ao=!1)}},isToModel:{get:function(){return this.Ao},set:function(a){this.v&&\nva(this);this.Ao=a}},sourceProperty:{get:function(){return this.hm},set:function(a){this.v&&va(this);this.hm=a}},converter:{get:function(){return this.Bn},set:function(a){this.v&&va(this);this.Bn=a}},backConverter:{get:function(){return this.un},set:function(a){this.v&&va(this);this.un=a}},mode:{get:function(){return this.Zo},set:function(a){this.v&&va(this);this.Zo=a}}});\nHi.prototype.updateSource=Hi.prototype.jr;Hi.prototype.updateTarget=Hi.prototype.Tw;Hi.prototype.ofModel=Hi.prototype.MA;Hi.prototype.ofObject=Hi.prototype.Uq;Hi.prototype.makeTwoWay=Hi.prototype.Iy;var Pk=\"Binding\",yr=new D(Hi,\"OneWay\",1),on=new D(Hi,\"TwoWay\",2);Hi.className=\"Binding\";Hi.parseEnum=function(a,b){return function(c){c=Ya(a,c);return null===c?b:c}};Hi.toString=Ka;Hi.OneWay=yr;Hi.TwoWay=on;\nfunction zr(a,b){Z.call(this);this.su=',\\n  \"insertedLinkKeys\": ';this.kx=',\\n  \"modifiedLinkData\": ';this.uu=',\\n  \"removedLinkKeys\": ';this.$c=[];this.ag=new G;this.gb=new H;this.Hi=\"\";this.Aj=this.hl=this.Ql=null;this.af=\"from\";this.bf=\"to\";this.Vj=this.Uj=\"\";this.Tj=\"category\";this.ae=\"\";this.Ul=\"isGroup\";this.ze=\"group\";this.En=!1;void 0!==a&&(this.nodeDataArray=a);void 0!==b&&(this.linkDataArray=b)}ma(zr,Z);zr.constructGraphLinksModel=Z.constructGraphLinksModel;\nzr.prototype.cloneProtected=function(a){Z.prototype.cloneProtected.call(this,a);a.Hi=this.Hi;a.Ql=this.Ql;a.hl=this.hl;a.af=this.af;a.bf=this.bf;a.Uj=this.Uj;a.Vj=this.Vj;a.Tj=this.Tj;a.ae=this.ae;a.Ul=this.Ul;a.ze=this.ze;a.En=this.En};t=zr.prototype;t.clear=function(){Z.prototype.clear.call(this);this.$c=[];this.gb.clear();this.ag.clear()};\nt.toString=function(a){void 0===a&&(a=0);if(2<=a)return this.fr();var b=(\"\"!==this.name?this.name:\"\")+\" GraphLinksModel\";if(0<a){b+=\"\\n node data:\";a=this.nodeDataArray;var c=a.length,d;for(d=0;d<c;d++){var e=a[d];b+=\" \"+this.ja(e)+\":\"+Ka(e)}b+=\"\\n link data:\";a=this.linkDataArray;c=a.length;for(d=0;d<c;d++)e=a[d],b+=\" \"+Sq(this,e,!0)+\"--\\x3e\"+Sq(this,e,!1)}return b};\nt.Yw=function(a,b){\"\"===this.linkKeyProperty&&B(\"GraphLinksModel.linkKeyProperty must not be an empty string for .toIncrementalData() to succeed.\");var c=Z.prototype.Yw.call(this,a,b),d=this,e=new G,f=new G,g=new G,h=this.Yh;a.changes.each(function(a){a.model===d&&(\"linkDataArray\"===a.modelChange?a.change===ze?e.add(a.newValue):a.change===Ae&&g.add(a.oldValue):d.xc(a.object)?f.add(a.object):null!==a.object&&(null!==a.object&&h&&h.contains(a.object)?h.get(a.object).each(function(a){d.xc(a)&&f.add(a)}):\na.object instanceof Z||d.ab(a.object)||Ar(d,a.object).each(function(a){f.add(a)})))});var k=this.Li;k.clear();e.each(function(a){k.add(d.Wb(a));b||f.add(a)});var l=this.Oi;l.clear();g.each(function(a){l.add(d.Wb(a));b&&f.add(a)});a=d.cloneDeep(f.ma());0<k.count&&(null===c&&(c={}),b?c.removedLinkKeys=k.ma():c.insertedLinkKeys=k.ma());0<a.length&&(null===c&&(c={}),c.modifiedLinkData=a);0<l.count&&(null===c&&(c={}),b?c.insertedLinkKeys=l.ma():c.removedLinkKeys=l.ma());l.clear();k.clear();return c};\nt.Vk=function(){var a=Z.prototype.Vk.call(this),b=\"\";\"category\"!==this.linkCategoryProperty&&\"string\"===typeof this.linkCategoryProperty&&(b+=',\\n  \"linkCategoryProperty\": '+this.quote(this.linkCategoryProperty));\"\"!==this.linkKeyProperty&&\"string\"===typeof this.linkKeyProperty&&(b+=',\\n  \"linkKeyProperty\": '+this.quote(this.linkKeyProperty));\"from\"!==this.linkFromKeyProperty&&\"string\"===typeof this.linkFromKeyProperty&&(b+=',\\n  \"linkFromKeyProperty\": '+this.quote(this.linkFromKeyProperty));\"to\"!==\nthis.linkToKeyProperty&&\"string\"===typeof this.linkToKeyProperty&&(b+=',\\n  \"linkToKeyProperty\": '+this.quote(this.linkToKeyProperty));\"\"!==this.linkFromPortIdProperty&&\"string\"===typeof this.linkFromPortIdProperty&&(b+=',\\n  \"linkFromPortIdProperty\": '+this.quote(this.linkFromPortIdProperty));\"\"!==this.linkToPortIdProperty&&\"string\"===typeof this.linkToPortIdProperty&&(b+=',\\n  \"linkToPortIdProperty\": '+this.quote(this.linkToPortIdProperty));\"\"!==this.linkLabelKeysProperty&&\"string\"===typeof this.linkLabelKeysProperty&&\n(b+=',\\n  \"linkLabelKeysProperty\": '+this.quote(this.linkLabelKeysProperty));\"isGroup\"!==this.nodeIsGroupProperty&&\"string\"===typeof this.nodeIsGroupProperty&&(b+=',\\n  \"nodeIsGroupProperty\": '+this.quote(this.nodeIsGroupProperty));\"group\"!==this.nodeGroupKeyProperty&&\"string\"===typeof this.nodeGroupKeyProperty&&(b+=',\\n  \"nodeGroupKeyProperty\": '+this.quote(this.nodeGroupKeyProperty));return a+b};\nt.Xq=function(a){Z.prototype.Xq.call(this,a);a.linkKeyProperty&&(this.linkKeyProperty=a.linkKeyProperty);a.linkFromKeyProperty&&(this.linkFromKeyProperty=a.linkFromKeyProperty);a.linkToKeyProperty&&(this.linkToKeyProperty=a.linkToKeyProperty);a.linkFromPortIdProperty&&(this.linkFromPortIdProperty=a.linkFromPortIdProperty);a.linkToPortIdProperty&&(this.linkToPortIdProperty=a.linkToPortIdProperty);a.linkCategoryProperty&&(this.linkCategoryProperty=a.linkCategoryProperty);a.linkLabelKeysProperty&&(this.linkLabelKeysProperty=\na.linkLabelKeysProperty);a.nodeIsGroupProperty&&(this.nodeIsGroupProperty=a.nodeIsGroupProperty);a.nodeGroupKeyProperty&&(this.nodeGroupKeyProperty=a.nodeGroupKeyProperty)};t.Zw=function(){var a=Z.prototype.Zw.call(this),b=',\\n  \"linkDataArray\": '+kr(this,this.linkDataArray,!0);return a+b};t.rw=function(a){Z.prototype.rw.call(this,a);a=a.linkDataArray;Array.isArray(a)&&(this.Om(a),this.linkDataArray=a)};\nt.kr=function(a){if(!(a instanceof zr))return B(\"Model.computeJsonDifference: newmodel must be a GraphLinksModel\"),\"\";\"\"===this.linkKeyProperty&&B(\"GraphLinksModel.linkKeyProperty must not be an empty string for .computeJsonDifference() to succeed.\");var b=Z.prototype.kr.call(this,a);mr(this,a,\"linkKeyProperty\");mr(this,a,\"linkFromKeyProperty\");mr(this,a,\"linkToKeyProperty\");mr(this,a,\"linkLabelKeysProperty\");mr(this,a,\"nodeIsGroupProperty\");mr(this,a,\"nodeGroupKeyProperty\");var c=this.Li;c.clear();\nvar d=new G,e=this.Oi;e.clear();e.addAll(this.gb.iteratorKeys);for(var f=new H,g=a.linkDataArray,h=g.length,k=0;k<h;k++){var l=g[k],m=a.Wb(l);if(void 0!==m){e.remove(m);var n=this.Dg(m);null===n?(c.add(m),d.add(l)):lr(this,n,l,f)||d.add(l)}else this.Rq(l),m=this.Wb(l),c.add(m),d.add(l)}a=b;0<c.count&&(a+=this.su+kr(this,c.ma(),!0));0<d.count&&(a+=this.kx+kr(this,d.ma(),!0));0<e.count&&(a+=this.uu+kr(this,e.ma(),!0));e.clear();c.clear();return a};\nfunction Ar(a,b){for(var c=new G,d=0;d<a.linkDataArray.length;d++){var e=a.linkDataArray[d];or(a,b,e,e,c)}return c}\nt.Xw=function(a,b){\"\"===this.linkKeyProperty&&B(\"GraphLinksModel.linkKeyProperty must not be an empty string for .toIncrementalJson() to succeed.\");var c=Z.prototype.Xw.call(this,a,b),d=this,e=new G,f=new G,g=new G,h=this.Yh;a.changes.each(function(a){a.model===d&&(\"linkDataArray\"===a.modelChange?a.change===ze?e.add(a.newValue):a.change===Ae&&g.add(a.oldValue):d.xc(a.object)?f.add(a.object):null!==a.object&&(null!==a.object&&h&&h.contains(a.object)?h.get(a.object).each(function(a){d.xc(a)&&f.add(a)}):\na.object instanceof Z||d.ab(a.object)||Ar(d,a.object).each(function(a){f.add(a)})))});var k=this.Li;k.clear();e.each(function(a){k.add(d.Wb(a));b||f.add(a)});var l=this.Oi;l.clear();g.each(function(a){l.add(d.Wb(a));b&&f.add(a)});a=c;0<k.count&&(a+=(b?this.uu:this.su)+kr(this,k.ma(),!0));0<f.count&&(a+=this.kx+kr(this,f.ma(),!0));0<l.count&&(a+=(b?this.su:this.uu)+kr(this,l.ma(),!0));l.clear();k.clear();return a};\nt.Wq=function(a){(void 0!==a.linkCategoryProperty&&a.linkCategoryProperty!==this.linkCategoryProperty||void 0!==a.linkKeyProperty&&a.linkKeyProperty!==this.linkKeyProperty||void 0!==a.linkFromKeyProperty&&a.linkFromKeyProperty!==this.linkFromKeyProperty||void 0!==a.linkToKeyProperty&&a.linkToKeyProperty!==this.linkToKeyProperty||void 0!==a.linkFromPortIdProperty&&a.linkFromPortIdProperty!==this.linkFromPortIdProperty||void 0!==a.linkToPortIdProperty&&a.linkToPortIdProperty!==this.linkToPortIdProperty||\nvoid 0!==a.linkLabelKeysProperty&&a.linkLabelKeysProperty!==this.linkLabelKeysProperty||void 0!==a.nodeIsGroupProperty&&a.nodeIsGroupProperty!==this.nodeIsGroupProperty||void 0!==a.nodeGroupKeyProperty&&a.nodeGroupKeyProperty!==this.nodeGroupKeyProperty)&&B(\"applyIncrementalJson cannot change Model properties\");Z.prototype.Wq.call(this,a);var b=a.insertedLinkKeys;if(Array.isArray(b))for(var c=b.length,d=0;d<c;d++){var e=b[d],f=this.Dg(e);null===f&&(f=this.Aq({}),this.iu(f,e),this.bj(f))}b=a.modifiedLinkData;\nif(Array.isArray(b))for(c=b.length,d=0;d<c;d++)if(e=b[d],f=this.Wb(e),f=this.Dg(f),null!==f){for(var g in e)\"__gohashid\"!==g&&g!==this.linkKeyProperty&&this.setDataProperty(f,g,e[g]);Br(this,e,f)}a=a.removedLinkKeys;if(Array.isArray(a))for(g=a.length,b=0;b<g;b++)c=this.Dg(a[b]),null!==c&&this.Mm(c)};\nzr.prototype.changeState=function(a,b){if(null!==a&&a.model===this){if(a.change===xe){var c=a.object,d=a.propertyName;if(d===this.linkKeyProperty&&this.xc(c)){var e=a.G(b);b=a.G(!b);void 0!==b&&this.gb.remove(b);void 0!==e&&this.gb.add(e,c);Uj(c,d,e);return}}else if(a.change===ze){c=a.newParam;if(\"linkDataArray\"===a.modelChange){a=a.newValue;za(a)&&\"number\"===typeof c&&(d=this.Wb(a),b?(this.ag.remove(a),this.$c[c]===a&&this.$c.splice(c,1),void 0!==d&&this.gb.remove(d)):(this.ag.add(a),this.$c[c]!==\na&&this.$c.splice(c,0,a),void 0!==d&&this.gb.add(d,a)));return}if(\"linkLabelKeys\"===a.modelChange){d=this.Bf(a.object);Array.isArray(d)&&\"number\"===typeof c&&(b?(c=d.indexOf(a.newValue),0<=c&&d.splice(c,1)):0>d.indexOf(a.newValue)&&d.splice(c,0,a.newValue));return}}else if(a.change===Ae){c=a.oldParam;if(\"linkDataArray\"===a.modelChange){a=a.oldValue;za(a)&&\"number\"===typeof c&&(d=this.Wb(a),b?(this.ag.add(a),this.$c[c]!==a&&this.$c.splice(c,0,a),void 0!==d&&this.gb.add(d,a)):(this.ag.remove(a),this.$c[c]===\na&&this.$c.splice(c,1),void 0!==d&&this.gb.remove(d)));return}if(\"linkLabelKeys\"===a.modelChange){d=this.Bf(a.object);Array.isArray(d)&&\"number\"===typeof c&&(b?0>d.indexOf(a.newValue)&&d.splice(c,0,a.newValue):(c=d.indexOf(a.newValue),0<=c&&d.splice(c,1)));return}}Z.prototype.changeState.call(this,a,b)}};t=zr.prototype;t.Gm=function(a){if(void 0!==a){var b=this.Aj;if(null!==b){var c=this.Kb(a);null===c&&(c=this.copyNodeData(b),Uj(c,this.nodeKeyProperty,a),this.uf(c))}return a}};\nt.xy=function(a){return Sq(this,a,!0)};t.Bw=function(a,b){$q(this,a,b,!0)};t.Ay=function(a){return Sq(this,a,!1)};t.Gw=function(a,b){$q(this,a,b,!1)};function Sq(a,b,c){if(null!==b&&(a=c?a.af:a.bf,\"\"!==a&&(a=vn(b,a),void 0!==a))){if(Uq(a))return a;B((c?\"FromKey\":\"ToKey\")+\" value for link data \"+b+\" is not a number or a string: \"+a)}}\nfunction $q(a,b,c,d){null===c&&(c=void 0);if(null!==b){var e=d?a.af:a.bf;if(\"\"!==e)if(c=a.Gm(c),a.xc(b)){var f=vn(b,e);f!==c&&(Yq(a,f,b),Uj(b,e,c),null===a.Kb(c)&&Zq(a,c,b),ur(a,d?\"linkFromKey\":\"linkToKey\",xe,e,b,f,c),\"string\"===typeof e&&a.Da(b,e))}else Uj(b,e,c)}}t.yy=function(a){return Rq(this,a,!0)};t.Cw=function(a,b){ar(this,a,b,!0)};t.By=function(a){return Rq(this,a,!1)};t.Hw=function(a,b){ar(this,a,b,!1)};\nfunction Rq(a,b,c){if(null===b)return\"\";a=c?a.Uj:a.Vj;if(\"\"===a)return\"\";b=vn(b,a);return void 0===b?\"\":b}function ar(a,b,c,d){if(null!==b){var e=d?a.Uj:a.Vj;if(\"\"!==e)if(a.xc(b)){var f=vn(b,e);void 0===f&&(f=\"\");f!==c&&(Uj(b,e,c),ur(a,d?\"linkFromPortId\":\"linkToPortId\",xe,e,b,f,c),\"string\"===typeof e&&a.Da(b,e))}else Uj(b,e,c)}}t.Bf=function(a){if(null===a)return Cr;var b=this.ae;if(\"\"===b)return Cr;a=vn(a,b);return void 0===a?Cr:a};\nt.ju=function(a,b){if(null!==a){var c=this.ae;if(\"\"!==c)if(this.xc(a)){var d=vn(a,c);void 0===d&&(d=Cr);if(d!==b){if(Array.isArray(d))for(var e=d.length,f=0;f<e;f++)Yq(this,d[f],a);Uj(a,c,b);e=b.length;for(f=0;f<e;f++){var g=b[f];null===this.Kb(g)&&Zq(this,g,a)}ur(this,\"linkLabelKeys\",xe,c,a,d,b);\"string\"===typeof c&&this.Da(a,c)}}else Uj(a,c,b)}};\nt.Dv=function(a,b){if(null!==b&&void 0!==b&&null!==a){var c=this.ae;if(\"\"!==c){var d=vn(a,c);if(void 0===d)c=[],c.push(b),this.ju(a,c);else if(Array.isArray(d)){var e=d.indexOf(b);0<=e||(e=d.length,d.push(b),this.xc(a)&&(null===this.Kb(b)&&Zq(this,b,a),ur(this,\"linkLabelKeys\",ze,c,a,null,b,null,e)))}else B(c+\" property is not an Array; cannot addLabelKeyForLinkData: \"+a)}}};\nt.Oy=function(a,b){if(null!==b&&void 0!==b&&null!==a){var c=this.ae;if(\"\"!==c){var d=vn(a,c);if(Array.isArray(d)){var e=d.indexOf(b);0>e||(d.splice(e,1),this.xc(a)&&(Yq(this,b,a),ur(this,\"linkLabelKeys\",Ae,c,a,b,null,e,null)))}else void 0!==d&&B(c+\" property is not an Array; cannot removeLabelKeyforLinkData: \"+a)}}};t.Wb=function(a){if(null!==a){var b=this.Hi;if(\"\"!==b&&(b=vn(a,b),void 0!==b)){if(Uq(b))return b;B(\"Key value for link data \"+a+\" is not a number or a string: \"+b)}}};\nt.iu=function(a,b){if(null!==a){var c=this.Hi;if(\"\"!==c)if(this.xc(a)){var d=vn(a,c);d!==b&&null===this.Dg(b)&&(Uj(a,c,b),void 0!==d&&this.gb.remove(d),this.gb.add(b,a),ur(this,\"linkKey\",xe,c,a,d,b),\"string\"===typeof c&&this.Da(a,c))}else Uj(a,c,b)}};t.Dg=function(a){null===a&&B(\"GraphLinksModel.findLinkDataForKey:key must not be null\");return void 0!==a&&Uq(a)?this.gb.G(a):null};\nt.Rq=function(a){if(null!==a){var b=this.Hi;if(\"\"!==b){var c=this.Wb(a);if(void 0===c||this.gb.contains(c)){var d=this.Ql;if(null!==d&&(c=d(this,a),void 0!==c&&null!==c&&!this.gb.contains(c))){Uj(a,b,c);return}if(\"string\"===typeof c){for(d=2;this.gb.contains(c+d);)d++;Uj(a,b,c+d)}else if(void 0===c||\"number\"===typeof c){for(c=-this.gb.count-1;this.gb.contains(c);)c--;Uj(a,b,c)}}}}};t.xc=function(a){return null===a?!1:this.ag.contains(a)};t.bj=function(a){null!==a&&(mb(a),this.xc(a)||Wq(this,a,!0))};\nfunction Wq(a,b,c){if(\"\"!==a.linkKeyProperty){var d=a.Wb(b);if(void 0!==d&&a.gb.G(d)===b)return;a.Rq(b);d=a.Wb(b);if(void 0===d){B(\"GraphLinksModel.makeLinkDataKeyUnique failed on \"+b+\". Data not added to model.\");return}a.gb.add(d,b)}a.ag.add(b);d=null;c&&(d=a.$c.length,a.$c.splice(d,0,b));ur(a,\"linkDataArray\",ze,\"linkDataArray\",a,null,b,null,d);Dr(a,b)}t.pz=function(a){if(Array.isArray(a))for(var b=a.length,c=0;c<b;c++)this.bj(a[c]);else for(a=a.iterator;a.next();)this.bj(a.value)};\nt.Mm=function(a){null!==a&&Vq(this,a,!0)};function Vq(a,b,c){a.ag.remove(b);var d=a.Wb(b);void 0!==d&&a.gb.remove(d);d=null;if(c){d=a.$c.indexOf(b);if(0>d)return;a.$c.splice(d,1)}ur(a,\"linkDataArray\",Ae,\"linkDataArray\",a,b,null,d,null);c=Sq(a,b,!0);Yq(a,c,b);c=Sq(a,b,!1);Yq(a,c,b);d=a.Bf(b);if(Array.isArray(d))for(var e=d.length,f=0;f<e;f++)c=d[f],Yq(a,c,b)}t.UA=function(a){if(Array.isArray(a))for(var b=a.length,c=0;c<b;c++)this.Mm(a[c]);else for(a=a.iterator;a.next();)this.Mm(a.value)};\nt.JA=function(a){\"\"===this.linkKeyProperty&&B(\"GraphLinksModel.linkKeyProperty must not be an empty string for .mergeLinkDataArray() to succeed.\");if(a!==this.linkDataArray&&Aa(a)){var b=this.Oi;b.clear();b.addAll(this.gb.iteratorKeys);var c=this.Li;c.clear();for(var d=a.length,e=0;e<d;e++){var f=a[e],g=this.Wb(f);if(void 0!==g){c.add(g);var h=this.Dg(g);h!==f&&(null!==h?(this.vq(h,f),Br(this,f,h)):(f=this.cloneDeep(f),this.iu(f,g),this.bj(f)))}else g=this.cloneDeep(f),this.bj(g),c.add(this.Wb(g))}for(a=\nb.iterator;a.next();)d=a.value,c.contains(d)||(d=this.Dg(d))&&this.Mm(d);b.clear();c.clear()}};function Dr(a,b){var c=Sq(a,b,!0);c=a.Gm(c);null===a.Kb(c)&&Zq(a,c,b);c=Sq(a,b,!1);c=a.Gm(c);null===a.Kb(c)&&Zq(a,c,b);var d=a.Bf(b);if(Array.isArray(d))for(var e=d.length,f=0;f<e;f++)c=d[f],null===a.Kb(c)&&Zq(a,c,b)}\nt.Aq=function(a){if(null===a)return null;var b=this.hl;a=null!==b?b(a,this):vr(this,a,!0);za(a)&&(Xa(a),\"\"!==this.af&&Uj(a,this.af,void 0),\"\"!==this.bf&&Uj(a,this.bf,void 0),\"\"!==this.ae&&Uj(a,this.ae,[]));return a};t.fw=function(a){if(null===a)return!1;var b=this.Ul;return\"\"===b?!1:vn(a,b)?!0:!1};t.Lh=function(a){if(null!==a){var b=this.ze;if(\"\"!==b&&(b=vn(a,b),void 0!==b)){if(Uq(b))return b;B(\"GroupKey value for node data \"+a+\" is not a number or a string: \"+b)}}};\nt.dr=function(a,b){null===b&&(b=void 0);if(null!==a){var c=this.ze;if(\"\"!==c)if(this.ab(a)){var d=vn(a,c);d!==b&&(Yq(this,d,a),Uj(a,c,b),null===this.Kb(b)&&Zq(this,b,a),ur(this,\"nodeGroupKey\",xe,c,a,d,b),\"string\"===typeof c&&this.Da(a,c))}else Uj(a,c,b)}};zr.prototype.copyNodeData=function(a){if(null===a)return null;a=Z.prototype.copyNodeData.call(this,a);this.rk||\"\"===this.ze||void 0===vn(a,this.ze)||Uj(a,this.ze,void 0);return a};\nzr.prototype.setDataProperty=function(a,b,c){if(this.ab(a)){if(b===this.nodeKeyProperty){this.Vm(a,c);return}if(b===this.nodeCategoryProperty){this.Um(a,c);return}if(b===this.nodeGroupKeyProperty){this.dr(a,c);return}}else if(this.xc(a)){if(b===this.linkFromKeyProperty){$q(this,a,c,!0);return}if(b===this.linkToKeyProperty){$q(this,a,c,!1);return}if(b===this.linkFromPortIdProperty){ar(this,a,c,!0);return}if(b===this.linkToPortIdProperty){ar(this,a,c,!1);return}if(b===this.linkKeyProperty){this.iu(a,\nc);return}if(b===this.linkCategoryProperty){this.cr(a,c);return}if(b===this.linkLabelKeysProperty){this.ju(a,c);return}}var d=vn(a,b);d!==c&&(Uj(a,b,c),this.du(a,b,d,c))};t=zr.prototype;t.vq=function(a,b){if(b){var c=this.ab(a),d=this.xc(a),e;for(e in b)\"__gohashid\"===e||c&&e===this.nodeKeyProperty||c&&e===this.nodeIsGroupProperty&&vn(a,e)===b[e]||d&&e===this.linkKeyProperty||this.setDataProperty(a,e,b[e])}};\nt.ar=function(a,b){Z.prototype.ar.call(this,a,b);for(var c=this.Wa.iterator;c.next();)this.vw(c.value,a,b);for(c=this.ag.iterator;c.next();){var d=c.value,e=a,f=b;if(Sq(this,d,!0)===e){var g=this.af;Uj(d,g,f);ur(this,\"linkFromKey\",xe,g,d,e,f);\"string\"===typeof g&&this.Da(d,g)}Sq(this,d,!1)===e&&(g=this.bf,Uj(d,g,f),ur(this,\"linkToKey\",xe,g,d,e,f),\"string\"===typeof g&&this.Da(d,g));g=this.Bf(d);if(Array.isArray(g))for(var h=g.length,k=this.ae,l=0;l<h;l++)g[l]===e&&(g[l]=f,ur(this,\"linkLabelKeys\",ze,\nk,d,e,f,l,l))}};t.vw=function(a,b,c){if(this.Lh(a)===b){var d=this.ze;Uj(a,d,c);ur(this,\"nodeGroupKey\",xe,d,a,b,c);\"string\"===typeof d&&this.Da(a,d)}};t.Sw=function(){Z.prototype.Sw.call(this);for(var a=this.linkDataArray,b=a.length,c=0;c<b;c++)Dr(this,a[c])};\nt.Qm=function(a){Z.prototype.Qm.call(this,a);a=this.ja(a);var b=Xq(this,a);if(null!==b){var c=Ea();for(b=b.iterator;b.next();){var d=b.value;if(this.ab(d)){if(this.Lh(d)===a){var e=this.ze;ur(this,\"nodeGroupKey\",xe,e,d,a,a);\"string\"===typeof e&&this.Da(d,e);c.push(d)}}else if(Sq(this,d,!0)===a&&(e=this.af,ur(this,\"linkFromKey\",xe,e,d,a,a),\"string\"===typeof e&&this.Da(d,e),c.push(d)),Sq(this,d,!1)===a&&(e=this.bf,ur(this,\"linkToKey\",xe,e,d,a,a),\"string\"===typeof e&&this.Da(d,e),c.push(d)),e=this.Bf(d),\nArray.isArray(e))for(var f=e.length,g=this.ae,h=0;h<f;h++)e[h]===a&&(ur(this,\"linkLabelKeys\",ze,g,d,a,a,h,h),c.push(d))}for(b=0;b<c.length;b++)Yq(this,a,c[b]);Ia(c)}};t.Pm=function(a){Z.prototype.Pm.call(this,a);var b=this.Lh(a);null===this.Kb(b)&&Zq(this,b,a)};t.hr=function(a){Z.prototype.hr.call(this,a);var b=this.Lh(a);Yq(this,b,a)};\nt.Lt=function(a){if(null===a)return\"\";var b=this.Tj;if(\"\"===b)return\"\";b=vn(a,b);if(void 0===b)return\"\";if(\"string\"===typeof b)return b;B(\"getCategoryForLinkData found a non-string category for \"+a+\": \"+b);return\"\"};zr.prototype.getLinkCategoryForData=function(a){return this.Lt(a)};zr.prototype.cr=function(a,b){if(null!==a){var c=this.Tj;if(\"\"!==c)if(this.xc(a)){var d=vn(a,c);void 0===d&&(d=\"\");d!==b&&(Uj(a,c,b),ur(this,\"linkCategory\",xe,c,a,d,b),\"string\"===typeof c&&this.Da(a,c))}else Uj(a,c,b)}};\nzr.prototype.setLinkCategoryForData=function(a,b){this.cr(a,b)};t=zr.prototype;t.Wm=function(a,b){Z.prototype.Wm.call(this,a,b);this.dr(b,this.Lh(a))};function Br(a,b,c){a.cr(c,a.Lt(b));a.Bw(c,a.xy(b));a.Gw(c,a.Ay(b));a.ju(c,a.Bf(b));a.Cw(c,a.yy(b));a.Hw(c,a.By(b))}t.Ck=function(){return!0};t.qj=function(){return!0};t.Ut=function(){return!0};t.Dk=function(){return!0};\nna.Object.defineProperties(zr.prototype,{archetypeNodeData:{get:function(){return this.Aj},set:function(a){var b=this.Aj;b!==a&&(this.Aj=a,this.g(\"archetypeNodeData\",b,a))}},linkFromKeyProperty:{get:function(){return this.af},set:function(a){var b=this.af;b!==a&&(this.af=a,this.g(\"linkFromKeyProperty\",b,a))}},linkToKeyProperty:{get:function(){return this.bf},set:function(a){var b=this.bf;b!==a&&(this.bf=a,this.g(\"linkToKeyProperty\",\nb,a))}},linkFromPortIdProperty:{get:function(){return this.Uj},set:function(a){var b=this.Uj;b!==a&&(this.Uj=a,this.g(\"linkFromPortIdProperty\",b,a))}},linkToPortIdProperty:{get:function(){return this.Vj},set:function(a){var b=this.Vj;b!==a&&(this.Vj=a,this.g(\"linkToPortIdProperty\",b,a))}},linkLabelKeysProperty:{get:function(){return this.ae},set:function(a){var b=this.ae;b!==a&&(this.ae=a,this.g(\"linkLabelKeysProperty\",\nb,a))}},linkDataArray:{get:function(){return this.$c},set:function(a){var b=this.$c;if(b!==a){this.gb.clear();for(var c=a.length,d=0;d<c;d++){var e=a[d];if(!za(e)){B(\"GraphLinksModel.linkDataArray must only contain Objects, not: \"+e);return}mb(e)}this.$c=a;if(\"\"!==this.linkKeyProperty){d=new E;for(e=0;e<c;e++){var f=a[e],g=this.Wb(f);void 0===g?d.add(f):null!==this.gb.G(g)?d.add(f):this.gb.add(g,f)}for(d=d.iterator;d.next();)e=d.value,this.Rq(e),f=this.Wb(e),void 0!==\nf&&this.gb.add(f,e)}d=new G;for(e=0;e<c;e++)d.add(a[e]);this.ag=d;ur(this,\"linkDataArray\",xe,\"linkDataArray\",this,b,a);for(b=0;b<c;b++)Dr(this,a[b])}}},linkKeyProperty:{get:function(){return this.Hi},set:function(a){var b=this.Hi;if(b!==a){this.Hi=a;this.gb.clear();for(var c=this.linkDataArray.length,d=0;d<c;d++){var e=this.linkDataArray[d],f=this.Wb(e);void 0===f&&(this.Rq(e),f=this.Wb(e));void 0!==f&&this.gb.add(f,e)}this.g(\"linkKeyProperty\",b,a)}}},makeUniqueLinkKeyFunction:{\nget:function(){return this.Ql},set:function(a){var b=this.Ql;b!==a&&(this.Ql=a,this.g(\"makeUniqueLinkKeyFunction\",b,a))}},copyLinkDataFunction:{get:function(){return this.hl},set:function(a){var b=this.hl;b!==a&&(this.hl=a,this.g(\"copyLinkDataFunction\",b,a))}},nodeIsGroupProperty:{get:function(){return this.Ul},set:function(a){var b=this.Ul;b!==a&&(this.Ul=a,this.g(\"nodeIsGroupProperty\",b,a))}},nodeGroupKeyProperty:{\nget:function(){return this.ze},set:function(a){var b=this.ze;b!==a&&(this.ze=a,this.g(\"nodeGroupKeyProperty\",b,a))}},rk:{get:function(){return this.En},set:function(a){this.En!==a&&(this.En=a)}},linkCategoryProperty:{get:function(){return this.Tj},set:function(a){var b=this.Tj;b!==a&&(this.Tj=a,this.g(\"linkCategoryProperty\",b,a))}},type:{get:function(){return\"GraphLinksModel\"}}});\nzr.prototype.setCategoryForLinkData=zr.prototype.cr;zr.prototype.getCategoryForLinkData=zr.prototype.Lt;zr.prototype.assignAllDataProperties=zr.prototype.vq;zr.prototype.setGroupKeyForNodeData=zr.prototype.dr;zr.prototype.getGroupKeyForNodeData=zr.prototype.Lh;zr.prototype.isGroupForNodeData=zr.prototype.fw;zr.prototype.copyLinkData=zr.prototype.Aq;zr.prototype.mergeLinkDataArray=zr.prototype.JA;zr.prototype.removeLinkDataCollection=zr.prototype.UA;zr.prototype.removeLinkData=zr.prototype.Mm;\nzr.prototype.addLinkDataCollection=zr.prototype.pz;zr.prototype.addLinkData=zr.prototype.bj;zr.prototype.containsLinkData=zr.prototype.xc;zr.prototype.makeLinkDataKeyUnique=zr.prototype.Rq;zr.prototype.findLinkDataForKey=zr.prototype.Dg;zr.prototype.setKeyForLinkData=zr.prototype.iu;zr.prototype.getKeyForLinkData=zr.prototype.Wb;zr.prototype.removeLabelKeyForLinkData=zr.prototype.Oy;zr.prototype.addLabelKeyForLinkData=zr.prototype.Dv;zr.prototype.setLabelKeysForLinkData=zr.prototype.ju;\nzr.prototype.getLabelKeysForLinkData=zr.prototype.Bf;zr.prototype.setToPortIdForLinkData=zr.prototype.Hw;zr.prototype.getToPortIdForLinkData=zr.prototype.By;zr.prototype.setFromPortIdForLinkData=zr.prototype.Cw;zr.prototype.getFromPortIdForLinkData=zr.prototype.yy;zr.prototype.setToKeyForLinkData=zr.prototype.Gw;zr.prototype.getToKeyForLinkData=zr.prototype.Ay;zr.prototype.setFromKeyForLinkData=zr.prototype.Bw;zr.prototype.getFromKeyForLinkData=zr.prototype.xy;zr.prototype.clear=zr.prototype.clear;\nvar Cr=Object.freeze([]);zr.className=\"GraphLinksModel\";xr.GraphLinksModel=zr;Z.constructGraphLinksModel=Z.constructGraphLinksModel=function(){return new zr};Z.initDiagramModel=yi=function(){return new zr};function Er(a){Z.call(this);this.Ae=\"parent\";this.Gn=!1;this.$j=\"parentLinkCategory\";void 0!==a&&(this.nodeDataArray=a)}ma(Er,Z);Er.constructGraphLinksModel=Z.constructGraphLinksModel;\nEr.prototype.cloneProtected=function(a){Z.prototype.cloneProtected.call(this,a);a.Ae=this.Ae;a.Gn=this.Gn;a.$j=this.$j};t=Er.prototype;t.toString=function(a){void 0===a&&(a=0);if(2<=a)return this.fr();var b=(\"\"!==this.name?this.name:\"\")+\" TreeModel\";if(0<a){b+=\"\\n node data:\";a=this.nodeDataArray;for(var c=a.length,d=0;d<c;d++){var e=a[d];b+=\" \"+this.ja(e)+\":\"+Ka(e)}}return b};\nt.Vk=function(){var a=Z.prototype.Vk.call(this),b=\"\";\"parent\"!==this.nodeParentKeyProperty&&\"string\"===typeof this.nodeParentKeyProperty&&(b+=',\\n  \"nodeParentKeyProperty\": '+this.quote(this.nodeParentKeyProperty));return a+b};t.Xq=function(a){Z.prototype.Xq.call(this,a);a.nodeParentKeyProperty&&(this.nodeParentKeyProperty=a.nodeParentKeyProperty)};t.kr=function(a){mr(this,a,\"nodeParentKeyProperty\");return Z.prototype.kr.call(this,a)};\nt.Wq=function(a){void 0!==a.nodeParentKeyProperty&&a.nodeParentKeyProperty!==this.nodeParentKeyProperty&&B(\"applyIncrementalJson cannot change Model properties\");Z.prototype.Wq.call(this,a)};t.Gm=function(a){return a};t.Mh=function(a){if(null!==a){var b=this.Ae;if(\"\"!==b&&(b=vn(a,b),void 0!==b)){if(Uq(b))return b;B(\"ParentKey value for node data \"+a+\" is not a number or a string: \"+b)}}};\nt.fe=function(a,b){null===b&&(b=void 0);if(null!==a){var c=this.Ae;if(\"\"!==c)if(b=this.Gm(b),this.ab(a)){var d=vn(a,c);d!==b&&(Yq(this,d,a),Uj(a,c,b),null===this.Kb(b)&&Zq(this,b,a),ur(this,\"nodeParentKey\",xe,c,a,d,b),\"string\"===typeof c&&this.Da(a,c))}else Uj(a,c,b)}};t.Ot=function(a){if(null===a)return\"\";var b=this.$j;if(\"\"===b)return\"\";b=vn(a,b);if(void 0===b)return\"\";if(\"string\"===typeof b)return b;B(\"getParentLinkCategoryForNodeData found a non-string category for \"+a+\": \"+b);return\"\"};\nEr.prototype.getLinkCategoryForData=function(a){return this.Ot(a)};Er.prototype.ku=function(a,b){if(null!==a){var c=this.$j;if(\"\"!==c)if(this.ab(a)){var d=vn(a,c);void 0===d&&(d=\"\");d!==b&&(Uj(a,c,b),ur(this,\"parentLinkCategory\",xe,c,a,d,b),\"string\"===typeof c&&this.Da(a,c))}else Uj(a,c,b)}};Er.prototype.setLinkCategoryForData=function(a,b){this.ku(a,b)};\nEr.prototype.copyNodeData=function(a){if(null===a)return null;a=Z.prototype.copyNodeData.call(this,a);this.sk||\"\"===this.Ae||void 0===vn(a,this.Ae)||Uj(a,this.Ae,void 0);return a};Er.prototype.setDataProperty=function(a,b,c){if(this.ab(a)){if(b===this.nodeKeyProperty){this.Vm(a,c);return}if(b===this.nodeCategoryProperty){this.Um(a,c);return}if(b===this.nodeParentKeyProperty){this.fe(a,c);return}}var d=vn(a,b);d!==c&&(Uj(a,b,c),this.du(a,b,d,c))};t=Er.prototype;\nt.ar=function(a,b){Z.prototype.ar.call(this,a,b);for(var c=this.Wa.iterator;c.next();)this.vw(c.value,a,b)};t.vw=function(a,b,c){if(this.Mh(a)===b){var d=this.Ae;Uj(a,d,c);ur(this,\"nodeParentKey\",xe,d,a,b,c);\"string\"===typeof d&&this.Da(a,d)}};\nt.Qm=function(a){Z.prototype.Qm.call(this,a);a=this.ja(a);var b=Xq(this,a);if(null!==b){var c=Ea();for(b=b.iterator;b.next();){var d=b.value;if(this.ab(d)&&this.Mh(d)===a){var e=this.Ae;ur(this,\"nodeParentKey\",xe,e,d,a,a);\"string\"===typeof e&&this.Da(d,e);c.push(d)}}for(b=0;b<c.length;b++)Yq(this,a,c[b]);Ia(c)}};t.Pm=function(a){Z.prototype.Pm.call(this,a);var b=this.Mh(a);b=this.Gm(b);null===this.Kb(b)&&Zq(this,b,a)};t.hr=function(a){Z.prototype.hr.call(this,a);var b=this.Mh(a);Yq(this,b,a)};\nt.Wm=function(a,b){Z.prototype.Wm.call(this,a,b);this.ku(b,this.Ot(a));this.fe(b,this.Mh(a))};t.Em=function(){return!0};t.Ut=function(){return!0};\nna.Object.defineProperties(Er.prototype,{nodeParentKeyProperty:{get:function(){return this.Ae},set:function(a){var b=this.Ae;b!==a&&(this.Ae=a,this.g(\"nodeParentKeyProperty\",b,a))}},sk:{get:function(){return this.Gn},set:function(a){this.Gn!==a&&(this.Gn=a)}},parentLinkCategoryProperty:{get:function(){return this.$j},set:function(a){var b=this.$j;b!==a&&(this.$j=a,this.g(\"parentLinkCategoryProperty\",b,a))}},\nlinkCategoryProperty:{get:function(){return this.parentLinkCategoryProperty},set:function(a){this.parentLinkCategoryProperty=a}},type:{get:function(){return\"TreeModel\"}}});Er.prototype.setParentLinkCategoryForNodeData=Er.prototype.ku;Er.prototype.getParentLinkCategoryForNodeData=Er.prototype.Ot;Er.prototype.setParentKeyForNodeData=Er.prototype.fe;Er.prototype.getParentKeyForNodeData=Er.prototype.Mh;Er.className=\"TreeModel\";xr.TreeModel=Er;\nfunction Fr(){Ai.call(this);this.wx=this.Un=this.$b=0;this.Ur=360;this.vx=Gr;this.Ij=0;this.mx=new J;this.Gr=this.be=0;this.ut=new Hr;this.Bu=this.Zj=0;this.gz=600;this.Ap=NaN;this.pn=1;this.bq=0;this.mm=360;this.Eb=Gr;this.K=Ir;this.bd=Jr;this.Wc=vq;this.lf=6;this.jp=Kr}ma(Fr,Ai);Fr.prototype.cloneProtected=function(a){Ai.prototype.cloneProtected.call(this,a);a.Ap=this.Ap;a.pn=this.pn;a.bq=this.bq;a.mm=this.mm;a.Eb=this.Eb;a.K=this.K;a.bd=this.bd;a.Wc=this.Wc;a.lf=this.lf;a.jp=this.jp};\nFr.prototype.jb=function(a){if(a.classType===Fr)if(a===Lr||a===Mr||a===Nr||a===Or||a===Jr)this.sorting=a;else if(a===Pr||a===Qr||a===Ir||a===Rr)this.direction=a;else if(a===Sr||a===Tr||a===Gr||a===Ur)this.arrangement=a;else{if(a===Vr||a===Kr)this.nodeDiameterFormula=a}else Ai.prototype.jb.call(this,a)};Fr.prototype.createNetwork=function(){return new Wr(this)};\nFr.prototype.doLayout=function(a){null===this.network&&(this.network=this.makeNetwork(a));this.arrangementOrigin=this.initialOrigin(this.arrangementOrigin);a=this.network.vertexes;if(1>=a.count)1===a.count&&(a=a.first(),a.centerX=0,a.centerY=0);else{var b=new E;b.addAll(a.iterator);a=new E;var c=new E;var d=this.sort(b);var e,f,g=this.Gr;var h=this.arrangement;var k=this.nodeDiameterFormula;var l=this.radius;if(!isFinite(l)||0>=l)l=NaN;var m=this.aspectRatio;if(!isFinite(m)||0>=m)m=1;var n=this.startAngle;\nisFinite(n)||(n=0);var p=this.sweepAngle;if(!isFinite(p)||360<p||1>p)p=360;b=this.spacing;isFinite(b)||(b=NaN);h===Ur&&k===Vr?h=Gr:h===Ur&&k!==Vr&&(h=this.arrangement);if((this.direction===Pr||this.direction===Qr)&&this.sorting!==Jr){for(k=0;!(k>=d.length);k+=2){a.add(d.J(k));if(k+1>=d.length)break;c.add(d.J(k+1))}this.direction===Pr?(this.arrangement===Ur&&a.reverse(),d=new E,d.addAll(a),d.addAll(c)):(this.arrangement===Ur&&c.reverse(),d=new E,d.addAll(c),d.addAll(a))}k=d.length;for(var r=f=e=0;r<\nd.length;r++){var q=n+p*f*(this.direction===Ir?1:-1)/k,u=d.J(r).diameter;isNaN(u)&&(u=Xr(d.J(r),q));360>p&&(0===r||r===d.length-1)&&(u/=2);e+=u;f++}if(isNaN(l)||h===Ur){isNaN(b)&&(b=6);if(h!==Gr&&h!==Ur){f=-Infinity;for(g=0;g<k;g++)r=d.J(g),e=d.J(g===k-1?0:g+1),isNaN(r.diameter)&&Xr(r,0),isNaN(e.diameter)&&Xr(e,0),f=Math.max(f,(r.diameter+e.diameter)/2);g=f+b;h===Sr?l=(f+b)/(2*Math.PI/k):l=Yr(this,g*(360<=p?k:k-1),m,n*Math.PI/180,p*Math.PI/180)}else l=Yr(this,e+(360<=p?k:k-1)*(h!==Ur?b:1.6*b),m,n*\nMath.PI/180,p*Math.PI/180);f=l*m}else if(f=l*m,r=Zr(this,l,f,n*Math.PI/180,p*Math.PI/180),isNaN(b)){if(h===Gr||h===Ur)b=(r-e)/(360<=p?k:k-1)}else if(h===Gr||h===Ur)r=(r-e)/(360<=p?k:k-1),r<b?(l=Yr(this,e+b*(360<=p?k:k-1),m,n*Math.PI/180,p*Math.PI/180),f=l*m):b=r;else{g=-Infinity;for(e=0;e<k;e++)q=d.J(e),u=d.J(e===k-1?0:e+1),isNaN(q.diameter)&&Xr(q,0),isNaN(u.diameter)&&Xr(u,0),g=Math.max(g,(q.diameter+u.diameter)/2);g+=b;e=Yr(this,g*(360<=p?k:k-1),m,n*Math.PI/180,p*Math.PI/180);e>l?(l=e,f=l*m):g=\nr/(360<=p?k:k-1)}this.vx=h;this.$b=l;this.Un=m;this.wx=n;this.Ur=p;this.Ij=b;this.be=f;this.Gr=g;b=d;d=this.vx;h=this.$b;l=this.wx;m=this.Ur;n=this.Ij;p=this.be;k=this.Gr;if(this.direction!==Pr&&this.direction!==Qr||d!==Ur)if(this.direction===Pr||this.direction===Qr){g=0;switch(d){case Tr:g=180*$r(this,h,p,l,k)/Math.PI;break;case Gr:k=b=0;g=a.first();null!==g&&(b=Xr(g,Math.PI/2));g=c.first();null!==g&&(k=Xr(g,Math.PI/2));g=180*$r(this,h,p,l,n+(b+k)/2)/Math.PI;break;case Sr:g=m/b.length}if(this.direction===\nPr){switch(d){case Tr:as(this,a,l,Rr);break;case Gr:bs(this,a,l,Rr);break;case Sr:cs(this,a,m/2,l,Rr)}switch(d){case Tr:as(this,c,l+g,Ir);break;case Gr:bs(this,c,l+g,Ir);break;case Sr:cs(this,c,m/2,l+g,Ir)}}else{switch(d){case Tr:as(this,c,l,Rr);break;case Gr:bs(this,c,l,Rr);break;case Sr:cs(this,c,m/2,l,Rr)}switch(d){case Tr:as(this,a,l+g,Ir);break;case Gr:bs(this,a,l+g,Ir);break;case Sr:cs(this,a,m/2,l+g,Ir)}}}else switch(d){case Tr:as(this,b,l,this.direction);break;case Gr:bs(this,b,l,this.direction);\nbreak;case Sr:cs(this,b,m,l,this.direction);break;case Ur:ds(this,b,m,l,this.direction)}else ds(this,b,m,l-m/2,Ir)}this.updateParts();this.network=null;this.isValidLayout=!0};function cs(a,b,c,d,e){var f=a.Ur,g=a.$b;a=a.be;d=d*Math.PI/180;c=c*Math.PI/180;for(var h=b.length,k=0;k<h;k++){var l=d+(e===Ir?k*c/(360<=f?h:h-1):-(k*c)/h),m=b.J(k),n=g*Math.tan(l)/a;n=Math.sqrt((g*g+a*a*n*n)/(1+n*n));m.centerX=n*Math.cos(l);m.centerY=n*Math.sin(l);m.actualAngle=180*l/Math.PI}}\nfunction bs(a,b,c,d){var e=a.$b,f=a.be,g=a.Ij;c=c*Math.PI/180;for(var h=b.length,k=0;k<h;k++){var l=b.J(k),m=b.J(k===h-1?0:k+1),n=f*Math.sin(c);l.centerX=e*Math.cos(c);l.centerY=n;l.actualAngle=180*c/Math.PI;isNaN(l.diameter)&&Xr(l,0);isNaN(m.diameter)&&Xr(m,0);l=$r(a,e,f,d===Ir?c:-c,(l.diameter+m.diameter)/2+g);c+=d===Ir?l:-l}}\nfunction as(a,b,c,d){var e=a.$b,f=a.be,g=a.Gr;c=c*Math.PI/180;for(var h=b.length,k=0;k<h;k++){var l=b.J(k);l.centerX=e*Math.cos(c);l.centerY=f*Math.sin(c);l.actualAngle=180*c/Math.PI;l=$r(a,e,f,d===Ir?c:-c,g);c+=d===Ir?l:-l}}function ds(a,b,c,d,e){var f=a.Ur;a.Zj=0;a.ut=new Hr;if(360>c){for(f=d+(e===Ir?f:-f);0>f;)f+=360;f%=360;180<f&&(f-=360);f*=Math.PI/180;a.Bu=f;es(a,b,c,d,e)}else fs(a,b,c,d,e);a.ut.commit(b)}\nfunction fs(a,b,c,d,e){var f=a.$b,g=a.Ij,h=a.Un,k=f*Math.cos(d*Math.PI/180),l=a.be*Math.sin(d*Math.PI/180),m=b.ma();if(3===m.length)m[0].centerX=f,m[0].centerY=0,m[1].centerX=m[0].centerX-m[0].width/2-m[1].width/2-g,m[1].y=m[0].y,m[2].centerX=(m[0].centerX+m[1].centerX)/2,m[2].y=m[0].y-m[2].height-g;else if(4===m.length)m[0].centerX=f,m[0].centerY=0,m[2].centerX=-m[0].centerX,m[2].centerY=m[0].centerY,m[1].centerX=0,m[1].y=Math.min(m[0].y,m[2].y)-m[1].height-g,m[3].centerX=0,m[3].y=Math.max(m[0].y+\nm[0].height+g,m[2].y+m[2].height+g);else{f=J.alloc();for(var n=0;n<m.length;n++){m[n].centerX=k;m[n].centerY=l;if(n>=m.length-1)break;gs(a,k,l,m,n,e,f)||hs(a,k,l,m,n,e,f);k=f.x;l=f.y}J.free(f);a.Zj++;if(!(23<a.Zj)){k=m[0].centerX;l=m[0].centerY;f=m[m.length-1].centerX;n=m[m.length-1].centerY;var p=Math.abs(k-f)-((m[0].width+m[m.length-1].width)/2+g),r=Math.abs(l-n)-((m[0].height+m[m.length-1].height)/2+g);g=0;1>Math.abs(r)?Math.abs(k-f)<(m[0].width+m[m.length-1].width)/2&&(g=0):g=0<r?r:1>Math.abs(p)?\n0:p;k=Math.abs(f)>Math.abs(n)?0<f!==l>n:0<n!==k<f;if(k=e===Ir?k:!k)g=-Math.abs(g),g=Math.min(g,-m[m.length-1].width),g=Math.min(g,-m[m.length-1].height);a.ut.compare(g,m);1<Math.abs(g)&&(a.$b=8>a.Zj?a.$b-g/(2*Math.PI):5>m.length&&10<g?a.$b/2:a.$b-(0<g?1.7:-2.3),a.be=a.$b*h,fs(a,b,c,d,e))}}}\nfunction es(a,b,c,d,e){for(var f=a.$b,g=a.be,h=a.Un,k=f*Math.cos(d*Math.PI/180),l=g*Math.sin(d*Math.PI/180),m=J.alloc(),n=b.ma(),p=0;p<n.length;p++){n[p].centerX=k;n[p].centerY=l;if(p>=n.length-1)break;gs(a,k,l,n,p,e,m)||hs(a,k,l,n,p,e,m);k=m.x;l=m.y}J.free(m);a.Zj++;if(!(23<a.Zj)){k=Math.atan2(l,k);k=e===Ir?a.Bu-k:k-a.Bu;k=Math.abs(k)<Math.abs(k-2*Math.PI)?k:k-2*Math.PI;f=k*(f+g)/2;g=a.ut;if(Math.abs(f)<Math.abs(g.Am))for(g.Am=f,g.Wk=[],g.cn=[],k=0;k<n.length;k++)g.Wk[k]=n[k].bounds.x,g.cn[k]=n[k].bounds.y;\n1<Math.abs(f)&&(a.$b=8>a.Zj?a.$b-f/(2*Math.PI):a.$b-(0<f?1.7:-2.3),a.be=a.$b*h,es(a,b,c,d,e))}}function gs(a,b,c,d,e,f,g){var h=a.$b,k=a.be,l=0;a=(d[e].width+d[e+1].width)/2+a.Ij;var m=!1;if(0<=c!==(f===Ir)){if(f=b+a,f>h){f=b-a;if(f<-h)return g.x=f,g.y=l,!1;m=!0}}else if(f=b-a,f<-h){f=b+a;if(f>h)return g.x=f,g.y=l,!1;m=!0}l=Math.sqrt(1-Math.min(1,f*f/(h*h)))*k;0>c!==m&&(l=-l);if(Math.abs(c-l)>(d[e].height+d[e+1].height)/2)return g.x=f,g.y=l,!1;g.x=f;g.y=l;return!0}\nfunction hs(a,b,c,d,e,f,g){var h=a.$b,k=a.be,l=0;a=(d[e].height+d[e+1].height)/2+a.Ij;d=!1;if(0<=b!==(f===Ir)){if(f=c-a,f<-k){f=c+a;if(f>k){g.x=l;g.y=f;return}d=!0}}else if(f=c+a,f>k){f=c-a;if(f<-k){g.x=l;g.y=f;return}d=!0}l=Math.sqrt(1-Math.min(1,f*f/(k*k)))*h;0>b!==d&&(l=-l);g.x=l;g.y=f}Fr.prototype.commitLayout=function(){this.commitNodes();this.isRouting&&this.commitLinks()};\nFr.prototype.commitNodes=function(){var a=null!==this.group&&null!==this.group.placeholder&&this.group.isSubGraphExpanded,b=a?this.group.location.copy():null,c=this.actualCenter;a?c=new J(0,0):(c.x=this.arrangementOrigin.x+this.$b,c.y=this.arrangementOrigin.y+this.be);for(var d=this.network.vertexes.iterator;d.next();){var e=d.value;e.x+=c.x;e.y+=c.y;e.commit()}a&&(this.group.Ta(),a=this.group.position.copy(),c=this.group.location.copy(),b=b.ge(c.ge(a)),this.group.move(b),this.mx=b.ge(a))};\nFr.prototype.commitLinks=function(){for(var a=this.network.edges.iterator;a.next();)a.value.commit()};function Zr(a,b,c,d,e){var f=a.gz;if(.001>Math.abs(a.Un-1))return void 0!==d&&void 0!==e?e*b:2*Math.PI*b;a=b>c?Math.sqrt(b*b-c*c)/b:Math.sqrt(c*c-b*b)/c;var g=0;var h=void 0!==d&&void 0!==e?e/(f+1):Math.PI/(2*(f+1));for(var k=0,l=0;l<=f;l++){void 0!==d&&void 0!==e?k=d+l*e/f:k=l*Math.PI/(2*f);var m=Math.sin(k);g+=Math.sqrt(1-a*a*m*m)*h}return void 0!==d&&void 0!==e?(b>c?b:c)*g:4*(b>c?b:c)*g}\nfunction Yr(a,b,c,d,e){return b/(void 0!==d&&void 0!==e?Zr(a,1,c,d,e):Zr(a,1,c))}function $r(a,b,c,d,e){if(.001>Math.abs(a.Un-1))return e/b;var f=b>c?Math.sqrt(b*b-c*c)/b:Math.sqrt(c*c-b*b)/c,g=0;a=2*Math.PI/(700*a.network.vertexes.count);b>c&&(d+=Math.PI/2);for(var h=0;;h++){var k=Math.sin(d+h*a);g+=(b>c?b:c)*Math.sqrt(1-f*f*k*k)*a;if(g>=e)return h*a}}\nFr.prototype.sort=function(a){switch(this.sorting){case Nr:break;case Or:a.reverse();break;case Lr:a.sort(this.comparer);break;case Mr:a.sort(this.comparer);a.reverse();break;case Jr:return this.nw(is(a));default:B(\"Invalid sorting type.\")}return a};\nfunction is(a){for(var b=[],c=0;c<a.length;c++)b.push(0);c=new E;for(var d=0;d<a.length;d++){var e=-1,f=-1;if(0===d)for(var g=0;g<a.length;g++){var h=a.J(g).edgesCount;h>e&&(e=h,f=g)}else for(g=0;g<a.length;g++)h=b[g],h>e&&(e=h,f=g);c.add(a.J(f));b[f]=-1;f=a.J(f);for(g=f.sourceEdges;g.next();)e=a.indexOf(g.value.fromVertex),0>e||0<=b[e]&&b[e]++;for(f=f.destinationEdges;f.next();)e=a.indexOf(f.value.toVertex),0>e||0<=b[e]&&b[e]++}return c}\nFr.prototype.nw=function(a){for(var b=[],c=0;c<a.length;c++){var d=a.J(c);b[c]=[];for(var e,f=d.destinationEdges;f.next();)e=a.indexOf(f.value.toVertex),e!==c&&0>b[c].indexOf(e)&&b[c].push(e);for(d=d.sourceEdges;d.next();)e=a.indexOf(d.value.fromVertex),e!==c&&0>b[c].indexOf(e)&&b[c].push(e)}f=[];for(c=0;c<b.length;c++)f[c]=0;c=[];var g=[],h=[];d=[];e=new E;for(var k=0,l=0;l<b.length;l++){var m=b[l].length;if(1===m)d.push(l);else if(0===m)e.add(a.J(l));else{if(0===k)c.push(l);else{for(var n=m=Infinity,\np=-1,r=[],q=0;q<c.length;q++)0>b[c[q]].indexOf(c[q===c.length-1?0:q+1])&&r.push(q===c.length-1?0:q+1);if(0===r.length)for(q=0;q<c.length;q++)r.push(q);for(q=0;q<r.length;q++){for(var u=r[q],w=b[l],v=0,y=0;y<g.length;y++){var z=f[g[y]],A=f[h[y]];if(z<A){var C=z;z=A}else C=A;if(C<u&&u<=z)for(A=0;A<w.length;A++){var F=w[A];0>c.indexOf(F)||C<f[F]&&f[F]<z||C===f[F]||z===f[F]||v++}else for(A=0;A<w.length;A++)F=w[A],0>c.indexOf(F)||C<f[F]&&f[F]<z&&C!==f[F]&&z!==f[F]&&v++}w=v;for(y=v=0;y<b[l].length;y++)C=\nc.indexOf(b[l][y]),0<=C&&(C=Math.abs(u-(C>=u?C+1:C)),v+=C<c.length+1-C?C:c.length+1-C);for(y=0;y<g.length;y++)C=f[g[y]],z=f[h[y]],C>=u&&C++,z>=u&&z++,C>z&&(A=z,z=C,C=A),z-C<(c.length+2)/2===(C<u&&u<=z)&&v++;if(w<m||w===m&&v<n)m=w,n=v,p=u}c.splice(p,0,l);for(m=0;m<c.length;m++)f[c[m]]=m;for(m=0;m<b[l].length;m++)n=b[l][m],0<=c.indexOf(n)&&(g.push(l),h.push(n))}k++}}for(g=c.length;;){f=!0;for(h=0;h<d.length;h++)if(k=d[h],l=b[k][0],m=c.indexOf(l),0<=m){for(p=n=0;p<b[l].length;p++)r=c.indexOf(b[l][p]),\n0>r||r===m||(q=r>m?r-m:m-r,n+=r<m!==q>g-q?1:-1);c.splice(0>n?m:m+1,0,k);d.splice(h,1);h--}else f=!1;if(f)break;else c.push(d[0]),d.splice(0,1)}for(b=0;b<c.length;b++)e.add(a.J(c[b]));return e};\nna.Object.defineProperties(Fr.prototype,{radius:{get:function(){return this.Ap},set:function(a){this.Ap!==a&&(0<a||isNaN(a))&&(this.Ap=a,this.B())}},aspectRatio:{get:function(){return this.pn},set:function(a){this.pn!==a&&0<a&&(this.pn=a,this.B())}},startAngle:{get:function(){return this.bq},set:function(a){this.bq!==a&&(this.bq=a,this.B())}},sweepAngle:{get:function(){return this.mm},\nset:function(a){this.mm!==a&&(0<a&&360>=a?this.mm=a:this.mm=360,this.B())}},arrangement:{get:function(){return this.Eb},set:function(a){this.Eb===a||a!==Ur&&a!==Gr&&a!==Tr&&a!==Sr||(this.Eb=a,this.B())}},direction:{get:function(){return this.K},set:function(a){this.K===a||a!==Ir&&a!==Rr&&a!==Pr&&a!==Qr||(this.K=a,this.B())}},sorting:{get:function(){return this.bd},set:function(a){this.bd===a||a!==Nr&&a!==Or&&\na!==Lr&&!Mr&&a!==Jr||(this.bd=a,this.B())}},comparer:{get:function(){return this.Wc},set:function(a){this.Wc!==a&&(this.Wc=a,this.B())}},spacing:{get:function(){return this.lf},set:function(a){this.lf!==a&&(this.lf=a,this.B())}},nodeDiameterFormula:{get:function(){return this.jp},set:function(a){this.jp===a||a!==Kr&&a!==Vr||(this.jp=a,this.B())}},actualXRadius:{get:function(){return this.$b}},\nactualYRadius:{get:function(){return this.be}},actualSpacing:{get:function(){return this.Ij}},actualCenter:{get:function(){return this.mx}}});\nvar Gr=new D(Fr,\"ConstantSpacing\",0),Tr=new D(Fr,\"ConstantDistance\",1),Sr=new D(Fr,\"ConstantAngle\",2),Ur=new D(Fr,\"Packed\",3),Ir=new D(Fr,\"Clockwise\",4),Rr=new D(Fr,\"Counterclockwise\",5),Pr=new D(Fr,\"BidirectionalLeft\",6),Qr=new D(Fr,\"BidirectionalRight\",7),Nr=new D(Fr,\"Forwards\",8),Or=new D(Fr,\"Reverse\",9),Lr=new D(Fr,\"Ascending\",10),Mr=new D(Fr,\"Descending\",11),Jr=new D(Fr,\"Optimized\",12),Kr=new D(Fr,\"Pythagorean\",13),Vr=new D(Fr,\"Circular\",14);Fr.className=\"CircularLayout\";Fr.ConstantSpacing=Gr;\nFr.ConstantDistance=Tr;Fr.ConstantAngle=Sr;Fr.Packed=Ur;Fr.Clockwise=Ir;Fr.Counterclockwise=Rr;Fr.BidirectionalLeft=Pr;Fr.BidirectionalRight=Qr;Fr.Forwards=Nr;Fr.Reverse=Or;Fr.Ascending=Lr;Fr.Descending=Mr;Fr.Optimized=Jr;Fr.Pythagorean=Kr;Fr.Circular=Vr;function Hr(){this.Am=-Infinity;this.cn=this.Wk=null}\nHr.prototype.compare=function(a,b){if(0<a&&0>this.Am||Math.abs(a)<Math.abs(this.Am)&&!(0>a&&0<this.Am))for(this.Am=a,this.Wk=[],this.cn=[],a=0;a<b.length;a++)this.Wk[a]=b[a].bounds.x,this.cn[a]=b[a].bounds.y};Hr.prototype.commit=function(a){if(null!==this.Wk&&null!==this.cn)for(var b=0;b<this.Wk.length;b++){var c=a.J(b);c.x=this.Wk[b];c.y=this.cn[b]}};Hr.className=\"VertexArrangement\";function Wr(a){aq.call(this,a)}ma(Wr,aq);Wr.prototype.createVertex=function(){return new js(this)};\nWr.prototype.createEdge=function(){return new ks(this)};Wr.className=\"CircularNetwork\";function js(a){oq.call(this,a);this.I=this.Gj=NaN}ma(js,oq);\nfunction Xr(a,b){var c=a.network;if(null===c)return NaN;c=c.layout;if(null===c)return NaN;if(c.arrangement===Ur)if(c.nodeDiameterFormula===Vr)a.Gj=Math.max(a.width,a.height);else{c=Math.abs(Math.sin(b));b=Math.abs(Math.cos(b));if(0===c)return a.width;if(0===b)return a.height;a.Gj=Math.min(a.height/c,a.width/b)}else a.Gj=c.nodeDiameterFormula===Vr?Math.max(a.width,a.height):Math.sqrt(a.width*a.width+a.height*a.height);return a.Gj}\nna.Object.defineProperties(js.prototype,{diameter:{get:function(){return this.Gj},set:function(a){this.Gj!==a&&(this.Gj=a)}},actualAngle:{get:function(){return this.I},set:function(a){this.I!==a&&(this.I=a)}}});js.className=\"CircularVertex\";function ks(a){pq.call(this,a)}ma(ks,pq);ks.className=\"CircularEdge\";\nfunction ls(){Ai.call(this);this.Fh=null;this.Eo=0;this.Pd=(new M(100,100)).freeze();this.on=!1;this.kf=!0;this.jd=!1;this.Rl=100;this.Xn=1;this.Xf=1E3;this.bp=10;this.Bp=Math;this.ol=.05;this.nl=50;this.ll=150;this.ml=0;this.On=10;this.Nn=5}ma(ls,Ai);\nls.prototype.cloneProtected=function(a){Ai.prototype.cloneProtected.call(this,a);a.Pd.assign(this.Pd);a.on=this.on;a.kf=this.kf;a.jd=this.jd;a.Rl=this.Rl;a.Xn=this.Xn;a.Xf=this.Xf;a.bp=this.bp;a.Bp=this.Bp;a.ol=this.ol;a.nl=this.nl;a.ll=this.ll;a.ml=this.ml;a.On=this.On;a.Nn=this.Nn};\nls.prototype.serializeLayoutProperties=function(a,b){Ai.prototype.serializeLayoutProperties.call(this,a,b);a.arrangementSpacing={width:this.arrangementSpacing.width,height:this.arrangementSpacing.height};a.arrangesToOrigin=this.arrangesToOrigin;a.setsPortSpots=this.setsPortSpots;a.comments=this.comments;a.maxIterations=this.maxIterations;a.epsilonDistance=this.epsilonDistance;a.infinityDistance=this.infinityDistance;a.moveLimit=this.moveLimit;a.defaultSpringStiffness=this.defaultSpringStiffness;a.defaultSpringLength=\nthis.defaultSpringLength;a.defaultElectricalCharge=this.defaultElectricalCharge;a.defaultGravitationalMass=this.defaultGravitationalMass;a.defaultCommentSpringLength=this.defaultCommentSpringLength;a.defaultCommentElectricalCharge=this.defaultCommentElectricalCharge};\nls.prototype.deserializeLayoutProperties=function(a,b,c,d,e){Ai.prototype.deserializeLayoutProperties.call(this,a,b,c,d,e);this.arrangementSpacing=new M(a.arrangementSpacing.width,a.arrangementSpacing.height);this.arrangesToOrigin=a.arrangesToOrigin;this.setsPortSpots=a.setsPortSpots;this.comments=a.comments;this.maxIterations=a.maxIterations;this.epsilonDistance=a.epsilonDistance;this.infinityDistance=a.infinityDistance;this.moveLimit=a.moveLimit;this.defaultSpringStiffness=a.defaultSpringStiffness;\nthis.defaultSpringLength=a.defaultSpringLength;this.defaultElectricalCharge=a.defaultElectricalCharge;this.defaultGravitationalMass=a.defaultGravitationalMass;this.defaultCommentSpringLength=a.defaultCommentSpringLength;this.defaultCommentElectricalCharge=a.defaultCommentElectricalCharge};ls.prototype.createNetwork=function(){return new ms(this)};\nls.prototype.doLayout=function(a){null===this.network&&(this.network=this.makeNetwork(a));if(!this.Uw()){a=this.maxIterations;if(0<this.network.vertexes.count){this.network.Bq();for(var b=this.network.vertexes.iterator;b.next();){var c=b.value;c.charge=this.electricalCharge(c);c.mass=this.gravitationalMass(c)}for(b=this.network.edges.iterator;b.next();)c=b.value,c.stiffness=this.springStiffness(c),c.length=this.springLength(c);this.Fv();this.Eo=0;if(this.needsClusterLayout()){b=this.network;c=b.Xy();\nfor(var d=c.iterator;d.next();){this.network=d.value;for(var e=this.network.vertexes.iterator;e.next();){var f=e.value;f.Ld=f.vertexes.count;f.Sh=1;f.qk=null;f.Ne=null}ns(this,0,a)}this.network=b;var g=d=c.iterator;d=this.arrangementSpacing;var h=g.count,k=!0;f=e=0;for(var l=Ea(),m=0;m<h+b.vertexes.count+2;m++)l[m]=null;h=0;g.reset();for(var n=N.alloc();g.next();)if(m=g.value,this.computeBounds(m,n),k)k=!1,e=n.x+n.width/2,f=n.y+n.height/2,l[0]=new J(n.x+n.width+d.width,n.y),l[1]=new J(n.x,n.y+n.height+\nd.height),h=2;else{var p=os(l,h,e,f,n.width,n.height,d),r=l[p],q=new J(r.x+n.width+d.width,r.y),u=new J(r.x,r.y+n.height+d.height);p+1<h&&l.splice(p+1,0,null);l[p]=q;l[p+1]=u;h++;p=r.x-n.x;r=r.y-n.y;for(m=m.vertexes.iterator;m.next();)q=m.value,q.centerX+=p,q.centerY+=r}N.free(n);for(m=b.vertexes.iterator;m.next();)g=m.value,p=g.bounds,2>h?(e=p.x+p.width/2,f=p.y+p.height/2,l[0]=new J(p.x+p.width+d.width,p.y),l[1]=new J(p.x,p.y+p.height+d.height),h=2):(k=os(l,h,e,f,p.width,p.height,d),n=l[k],r=new J(n.x+\np.width+d.width,n.y),p=new J(n.x,n.y+p.height+d.height),k+1<h&&l.splice(k+1,0,null),l[k]=r,l[k+1]=p,h++,g.centerX=n.x+g.width/2,g.centerY=n.y+g.height/2);Ia(l);for(d=c.iterator;d.next();){c=d.value;for(e=c.vertexes.iterator;e.next();)b.Bg(e.value);for(c=c.edges.iterator;c.next();)b.tm(c.value)}}ps(this,a);this.updateParts()}this.Rl=a;this.network=null;this.isValidLayout=!0}};\nls.prototype.needsClusterLayout=function(){if(3>this.network.vertexes.count)return!1;for(var a=0,b=0,c=this.network.vertexes.first().bounds,d=this.network.vertexes.iterator;d.next();){if(d.value.bounds.Mc(c)&&(a++,2<a))return!0;if(10<b)break;b++}return!1};ls.prototype.computeBounds=function(a,b){var c=!0;for(a=a.vertexes.iterator;a.next();){var d=a.value;c?(c=!1,b.set(d.bounds)):b.Rc(d.bounds)}return b};\nfunction ns(a,b,c){if(qs(a,b)){var d=a.Xf;a.Xf*=1+1/(b+1);var e=rs(a,b),f=Math.max(0,Math.max(Math.min(a.network.vertexes.count,c*(b+1)/11),10));a.maxIterations+=f;ns(a,b+1,c);ps(a,f);ss(a,e);b=e.vertexes.ma();b.sort(function(a,b){return null===a||null===b||a===b?0:b.Ld-a.Ld});for(c=0;c<b.length;c++)ts(a,b[c]);a.Xf=d}}\nfunction qs(a,b){if(10<b||3>a.network.vertexes.count)return!1;a.Fh=a.network.vertexes.ma();a=a.Fh;a.sort(function(a,b){return null===a||null===b||a===b?0:b.Ld-a.Ld});for(b=a.length-1;0<=b&&1>=a[b].Ld;)b--;return 1<a.length-b}\nfunction rs(a,b){for(var c=a.network,d=new ms(a),e=0;e<a.Fh.length;e++){var f=a.Fh[e];if(1<f.Ld){d.Bg(f);var g=new us;g.qu=f.Ld;g.ru=f.width;g.pu=f.height;g.$w=f.focus.x;g.ax=f.focus.y;null===f.Ne&&(f.Ne=new E);f.Ne.add(g);f.zw=f.Ne.count-1}else break}for(f=c.edges.iterator;f.next();){var h=f.value;e=h.fromVertex;g=h.toVertex;e.network===d&&g.network===d?d.tm(h):e.network===d?(h=e.qk,null===h&&(h=new E,e.qk=h),h.add(g),e.Ld--,e.Sh+=g.Sh):g.network===d&&(h=g.qk,null===h&&(h=new E,g.qk=h),h.add(e),\ng.Ld--,g.Sh+=e.Sh)}for(e=d.edges.iterator;e.next();)f=e.value,f.length*=Math.max(1,L.sqrt((f.fromVertex.Sh+f.toVertex.Sh)/(4*b+1)));for(b=d.vertexes.iterator;b.next();){e=b.value;var k=e.qk;if(null!==k&&0<k.count&&(g=e.Ne.J(e.Ne.count-1).qu-e.Ld,!(0>=g))){for(var l=h=0,m=k.count-g;m<k.count;m++){var n=k.J(m),p=null;for(f=n.edges.iterator;f.next();){var r=f.value;if(r.zy(n)===e){p=r;break}}null!==p&&(l+=p.length,h+=n.width*n.height)}f=e.centerX;k=e.centerY;m=e.width;n=e.height;p=e.focus;r=m*n;1>r&&\n(r=1);h=L.sqrt((h+r+l*l*4/(g*g))/r);g=(h-1)*m/2;h=(h-1)*n/2;e.bounds=new N(f-p.x-g,k-p.y-h,m+2*g,n+2*h);e.focus=new J(p.x+g,p.y+h)}}a.network=d;return c}function ss(a,b){for(var c=a.network.vertexes.iterator;c.next();){var d=c.value;d.network=b;if(null!==d.Ne){var e=d.Ne.J(d.zw);d.Ld=e.qu;var f=e.$w,g=e.ax;d.bounds=new N(d.centerX-f,d.centerY-g,e.ru,e.pu);d.focus=new J(f,g);d.zw--}}for(c=a.network.edges.iterator;c.next();)c.value.network=b;a.network=b}\nfunction ts(a,b){var c=b.qk;if(null!==c&&0!==c.count){var d=b.centerX,e=b.centerY,f=b.width,g=b.height;null!==b.Ne&&0<b.Ne.count&&(g=b.Ne.J(0),f=g.ru,g=g.pu);f=L.sqrt(f*f+g*g)/2;for(var h=!1,k=g=0,l=0,m=b.vertexes.iterator;m.next();){var n=m.value;1>=n.Ld?k++:(h=!0,l++,g+=Math.atan2(b.centerY-n.centerY,b.centerX-n.centerX))}if(0!==k)for(0<l&&(g/=l),l=b=0,b=h?2*Math.PI/(k+1):2*Math.PI/k,0===k%2&&(l=b/2),1<c.count&&c.sort(function(a,b){return null===a||null===b||a===b?0:b.width*b.height-a.width*a.height}),\nh=0===k%2?0:1,c=c.iterator;c.next();)if(k=c.value,!(1<k.Ld||a.isFixed(k))){m=null;for(n=k.edges.iterator;n.next();){m=n.value;break}n=k.width;var p=k.height;n=L.sqrt(n*n+p*p)/2;m=f+m.length+n;n=g+(b*(h/2>>1)+l)*(0===h%2?1:-1);k.centerX=d+m*Math.cos(n);k.centerY=e+m*Math.sin(n);h++}}}\nfunction os(a,b,c,d,e,f,g){var h=9E19,k=-1,l=0;a:for(;l<b;l++){var m=a[l],n=m.x-c,p=m.y-d;n=n*n+p*p;if(n<h){for(p=l-1;0<=p;p--)if(a[p].y>m.y&&a[p].x-m.x<e+g.width)continue a;for(p=l+1;p<b;p++)if(a[p].x>m.x&&a[p].y-m.y<f+g.height)continue a;k=l;h=n}}return k}ls.prototype.Fv=function(){if(this.comments)for(var a=this.network.vertexes.iterator;a.next();)this.addComments(a.value)};\nls.prototype.addComments=function(a){var b=a.node;if(null!==b)for(b=b.Sv();b.next();){var c=b.value;if(\"Comment\"===c.category&&c.isVisible()){var d=this.network.kj(c);null===d&&(d=this.network.mk(c));d.charge=this.defaultCommentElectricalCharge;c=null;for(var e=d.destinationEdges;e.next();){var f=e.value;if(f.toVertex===a){c=f;break}}if(null===c)for(e=d.sourceEdges;e.next();)if(f=e.value,f.fromVertex===a){c=f;break}null===c&&(c=this.network.Fk(a,d,null));c.length=this.defaultCommentSpringLength}}};\nfunction vs(a,b){var c=a.bounds,d=c.x;a=c.y;var e=c.width;c=c.height;var f=b.bounds,g=f.x;b=f.y;var h=f.width;f=f.height;return d+e<g?a>b+f?(c=d+e-g,a=a-b-f,L.sqrt(c*c+a*a)):a+c<b?(d=d+e-g,a=a+c-b,L.sqrt(d*d+a*a)):g-(d+e):d>g+h?a>b+f?(c=d-g-h,a=a-b-f,L.sqrt(c*c+a*a)):a+c<b?(d=d-g-h,a=a+c-b,L.sqrt(d*d+a*a)):d-(g+h):a>b+f?a-(b+f):a+c<b?b-(a+c):.1}function ps(a,b){a.Fh=null;for(b=a.Eo+b;a.Eo<b&&(a.Eo++,ws(a)););a.Fh=null}\nfunction ws(a){null===a.Fh&&(a.Fh=a.network.vertexes.ma());var b=a.Fh;if(0>=b.length)return!1;var c=b[0];c.forceX=0;c.forceY=0;for(var d=c.centerX,e=d,f=c=c.centerY,g=1;g<b.length;g++){var h=b[g];h.forceX=0;h.forceY=0;var k=h.centerX;h=h.centerY;d=Math.min(d,k);e=Math.max(e,k);c=Math.min(c,h);f=Math.max(f,h)}(e=e-d>f-c)?b.sort(function(a,b){return null===a||null===b||a===b?0:a.centerX-b.centerX}):b.sort(function(a,b){return null===a||null===b||a===b?0:a.centerY-b.centerY});c=a.Xf;var l=d=h=0;for(f=\n0;f<b.length;f++){g=b[f];d=g.bounds;h=g.focus;k=d.x+h.x;var m=d.y+h.y;d=g.charge*a.electricalFieldX(k,m);l=g.charge*a.electricalFieldY(k,m);d+=g.mass*a.gravitationalFieldX(k,m);l+=g.mass*a.gravitationalFieldY(k,m);g.forceX+=d;g.forceY+=l;for(var n=f+1;n<b.length;n++){var p=b[n];if(p!==g){d=p.bounds;h=p.focus;l=d.x+h.x;var r=d.y+h.y;if(k-l>c||l-k>c){if(e)break}else if(m-r>c||r-m>c){if(!e)break}else{var q=vs(g,p);1>q?(d=a.randomNumberGenerator,null===d&&(a.randomNumberGenerator=d=new xs),q=d.random(),\nh=d.random(),k>l?(d=Math.abs(p.bounds.right-g.bounds.x),d=(1+d)*q):k<l?(d=Math.abs(p.bounds.x-g.bounds.right),d=-(1+d)*q):(d=Math.max(p.width,g.width),d=(1+d)*q-d/2),m>r?(l=Math.abs(p.bounds.bottom-g.bounds.y),l=(1+l)*h):k<l?(l=Math.abs(p.bounds.y-g.bounds.bottom),l=-(1+l)*h):(l=Math.max(p.height,g.height),l=(1+l)*h-l/2)):(h=-(g.charge*p.charge)/(q*q),d=(l-k)/q*h,l=(r-m)/q*h);g.forceX+=d;g.forceY+=l;p.forceX-=d;p.forceY-=l}}}}for(e=a.network.edges.iterator;e.next();)h=e.value,c=h.fromVertex,f=h.toVertex,\ng=c.bounds,k=c.focus,d=g.x+k.x,g=g.y+k.y,m=f.bounds,n=f.focus,k=m.x+n.x,m=m.y+n.y,n=vs(c,f),1>n?(n=a.randomNumberGenerator,null===n&&(a.randomNumberGenerator=n=new xs),h=n.random(),n=n.random(),d=(d>k?1:-1)*(1+(f.width>c.width?f.width:c.width))*h,l=(g>m?1:-1)*(1+(f.height>c.height?f.height:c.height))*n):(h=h.stiffness*(n-h.length),d=(k-d)/n*h,l=(m-g)/n*h),c.forceX+=d,c.forceY+=l,f.forceX-=d,f.forceY-=l;for(e=d=0;e<b.length;e++)c=b[e],a.isFixed(c)?a.moveFixedVertex(c):d=Math.max(d,a.moveVertex(c)||\n0);return d>a.epsilonDistance*a.epsilonDistance}ls.prototype.moveVertex=function(a){var b=a.forceX,c=a.forceY,d=this.moveLimit;b<-d?b=-d:b>d&&(b=d);c<-d?c=-d:c>d&&(c=d);a.centerX+=b;a.centerY+=c;return b*b+c*c};ls.prototype.moveFixedVertex=function(){};ls.prototype.commitLayout=function(){this.Dw();this.commitNodes();this.isRouting&&this.commitLinks()};\nls.prototype.Dw=function(){if(this.setsPortSpots)for(var a=this.network.edges.iterator;a.next();){var b=a.value.link;null!==b&&(b.fromSpot=Vc,b.toSpot=Vc)}};ls.prototype.commitNodes=function(){var a=0,b=0;if(this.arrangesToOrigin){var c=N.alloc();this.computeBounds(this.network,c);b=this.arrangementOrigin;a=b.x-c.x;b=b.y-c.y;N.free(c)}c=N.alloc();for(var d=this.network.vertexes.iterator;d.next();){var e=d.value;if(0!==a||0!==b)c.assign(e.bounds),c.x+=a,c.y+=b,e.bounds=c;e.commit()}N.free(c)};\nls.prototype.commitLinks=function(){for(var a=this.network.edges.iterator;a.next();)a.value.commit()};ls.prototype.springStiffness=function(a){a=a.stiffness;return isNaN(a)?this.ol:a};ls.prototype.springLength=function(a){a=a.length;return isNaN(a)?this.nl:a};ls.prototype.electricalCharge=function(a){a=a.charge;return isNaN(a)?this.ll:a};ls.prototype.electricalFieldX=function(){return 0};ls.prototype.electricalFieldY=function(){return 0};\nls.prototype.gravitationalMass=function(a){a=a.mass;return isNaN(a)?this.ml:a};ls.prototype.gravitationalFieldX=function(){return 0};ls.prototype.gravitationalFieldY=function(){return 0};ls.prototype.isFixed=function(a){return a.isFixed};\nna.Object.defineProperties(ls.prototype,{currentIteration:{get:function(){return this.Eo}},arrangementSpacing:{get:function(){return this.Pd},set:function(a){this.Pd.w(a)||(this.Pd.assign(a),this.B())}},arrangesToOrigin:{get:function(){return this.on},set:function(a){this.on!==a&&(this.on=a,this.B())}},setsPortSpots:{get:function(){return this.kf},set:function(a){this.kf!==a&&(this.kf=\na,this.B())}},comments:{get:function(){return this.jd},set:function(a){this.jd!==a&&(this.jd=a,this.B())}},maxIterations:{get:function(){return this.Rl},set:function(a){this.Rl!==a&&0<=a&&(this.Rl=a,this.B())}},epsilonDistance:{get:function(){return this.Xn},set:function(a){this.Xn!==a&&0<a&&(this.Xn=a,this.B())}},infinityDistance:{get:function(){return this.Xf},set:function(a){this.Xf!==\na&&1<a&&(this.Xf=a,this.B())}},moveLimit:{get:function(){return this.bp},set:function(a){this.bp!==a&&1<a&&(this.bp=a,this.B())}},randomNumberGenerator:{get:function(){return this.Bp},set:function(a){this.Bp!==a&&(null!==a&&\"function\"!==typeof a.random&&B('ForceDirectedLayout.randomNumberGenerator must have a \"random()\" function on it: '+a),this.Bp=a)}},defaultSpringStiffness:{get:function(){return this.ol},\nset:function(a){this.ol!==a&&(this.ol=a,this.B())}},defaultSpringLength:{get:function(){return this.nl},set:function(a){this.nl!==a&&(this.nl=a,this.B())}},defaultElectricalCharge:{get:function(){return this.ll},set:function(a){this.ll!==a&&(this.ll=a,this.B())}},defaultGravitationalMass:{get:function(){return this.ml},set:function(a){this.ml!==a&&(this.ml=a,this.B())}},defaultCommentSpringLength:{\nget:function(){return this.On},set:function(a){this.On!==a&&(this.On=a,this.B())}},defaultCommentElectricalCharge:{get:function(){return this.Nn},set:function(a){this.Nn!==a&&(this.Nn=a,this.B())}}});ls.className=\"ForceDirectedLayout\";function us(){this.ax=this.$w=this.pu=this.ru=this.qu=0}us.className=\"ForceDirectedSubnet\";function ms(a){aq.call(this,a)}ma(ms,aq);ms.prototype.createVertex=function(){return new ys(this)};ms.prototype.createEdge=function(){return new zs(this)};\nms.className=\"ForceDirectedNetwork\";function ys(a){oq.call(this,a);this.La=!1;this.eb=this.I=NaN;this.Sh=this.Ld=this.Ka=this.T=0;this.Ne=this.qk=null;this.zw=0}ma(ys,oq);ys.prototype.serializeVertexProperties=function(a,b){oq.prototype.serializeVertexProperties.call(this,a,b);a.isFixed=this.isFixed;a.charge=this.charge;a.mass=this.mass};ys.prototype.Cq=function(a,b,c,d){oq.prototype.Cq.call(this,a,b,c,d);this.isFixed=a.isFixed;this.charge=a.charge;this.mass=a.mass};\nna.Object.defineProperties(ys.prototype,{isFixed:{get:function(){return this.La},set:function(a){this.La!==a&&(this.La=a)}},charge:{get:function(){return this.I},set:function(a){this.I!==a&&(this.I=a)}},mass:{get:function(){return this.eb},set:function(a){this.eb!==a&&(this.eb=a)}},forceX:{get:function(){return this.T},set:function(a){this.T!==a&&(this.T=a)}},forceY:{\nget:function(){return this.Ka},set:function(a){this.Ka!==a&&(this.Ka=a)}}});ys.className=\"ForceDirectedVertex\";function zs(a){pq.call(this,a);this.l=this.u=NaN}ma(zs,pq);zs.prototype.serializeEdgeProperties=function(a,b){pq.prototype.serializeEdgeProperties.call(this,a,b);a.stiffness=this.stiffness;a.length=this.length};zs.prototype.deserializeEdgeProperties=function(a,b,c,d){pq.prototype.deserializeEdgeProperties.call(this,a,b,c,d);this.stiffness=a.stiffness;this.length=a.length};\nna.Object.defineProperties(zs.prototype,{stiffness:{get:function(){return this.u},set:function(a){this.u!==a&&(this.u=a)}},length:{get:function(){return this.l},set:function(a){this.l!==a&&(this.l=a)}}});zs.className=\"ForceDirectedEdge\";function xs(){var a=0;void 0===a&&(a=42);this.seed=a;this.Zy=48271;this.az=2147483647;this.Q=44488.07041494893;this.bz=3399;this.$y=1/2147483647;this.random()}\nxs.prototype.random=function(){var a=this.seed%this.Q*this.Zy-this.seed/this.Q*this.bz;0<a?this.seed=a:this.seed=a+this.az;return this.seed*this.$y};xs.className=\"RandomNumberGenerator\";\nfunction As(){Ai.call(this);this.Zb=this.ue=25;this.K=0;this.jl=Bs;this.Ml=Cs;this.Bl=Ds;this.Rj=4;this.Zk=Es;this.ng=15;this.kf=!0;this.Mo=4;this.Ca=this.Ji=this.sa=-1;this.pc=this.mh=0;this.Ia=this.yd=this.zd=this.$d=this.zb=null;this.oh=0;this.fp=this.Wj=null;this.Ec=0;this.gp=null;this.Vc=new J;this.xe=[];this.xe.length=100}ma(As,Ai);\nAs.prototype.cloneProtected=function(a){Ai.prototype.cloneProtected.call(this,a);a.ue=this.ue;a.Zb=this.Zb;a.K=this.K;a.jl=this.jl;a.Ml=this.Ml;a.Bl=this.Bl;a.Rj=this.Rj;a.Zk=this.Zk;a.ng=this.ng;a.kf=this.kf;a.Mo=this.Mo};\nAs.prototype.serializeLayoutProperties=function(a,b){Ai.prototype.serializeLayoutProperties.call(this,a,b);a.layerSpacing=this.layerSpacing;a.columnSpacing=this.columnSpacing;a.direction=this.direction;a.cycleRemoveOption=this.cycleRemoveOption.name;a.layeringOption=this.layeringOption.name;a.initializeOption=this.initializeOption.name;a.iterations=this.iterations;a.aggressiveOption=this.aggressiveOption.name;a.packOption=this.packOption;a.setsPortSpots=this.setsPortSpots;a.linkSpacing=this.linkSpacing;\na.sa=this.sa;a.Ji=this.Ji;a.Ca=this.Ca;a.mh=this.mh;a.pc=this.pc;a.zb=this.zb;a.oh=this.oh;a.Ec=this.Ec;a.Vc={x:this.Vc.x,y:this.Vc.y}};\nAs.prototype.deserializeLayoutProperties=function(a,b,c,d,e){Ai.prototype.deserializeLayoutProperties.call(this,a,b,c,d,e);this.layerSpacing=a.layerSpacing;this.columnSpacing=a.columnSpacing;this.direction=a.direction;this.cycleRemoveOption=Ya(As,a.cycleRemoveOption);this.layeringOption=Ya(As,a.layeringOption);this.initializeOption=Ya(As,a.initializeOption);this.iterations=a.iterations;this.aggressiveOption=Ya(As,a.aggressiveOption);this.packOption=a.packOption;this.setsPortSpots=a.setsPortSpots;\nthis.linkSpacing=a.linkSpacing;this.sa=a.sa;this.Ji=a.Ji;this.Ca=a.Ca;this.mh=a.mh;this.pc=a.pc;this.zb=a.zb;this.oh=a.oh;this.Ec=a.Ec;this.Vc=new J(this.Vc.x,this.Vc.y);e&&!d&&e.edges.each(function(a){if(!a.link&&a.fromVertex&&a.toVertex&&(null===a.fromVertex.node||null===a.toVertex.node)){for(var b=a.fromVertex;null!==b&&null===b.node&&0<b.td.count;){var c=b.td.J(0);if(c.link){a.link=c.link;break}b=c.fromVertex}if(!a.link){for(c=a.toVertex;null!==c&&null===c.node&&0<c.Gd.count;){var d=c.Gd.J(0);\nif(d.link){a.link=d.link;break}c=d.toVertex}if(!a.link)for(c=c.td.iterator;c.next();)if(d=c.value,d.link&&d.fromVertex===b){a.link=d.link;break}}}})};As.prototype.jb=function(a){a.classType===As?0===a.name.indexOf(\"Aggressive\")?this.aggressiveOption=a:0===a.name.indexOf(\"Cycle\")?this.cycleRemoveOption=a:0===a.name.indexOf(\"Init\")?this.initializeOption=a:0===a.name.indexOf(\"Layer\")?this.layeringOption=a:B(\"Unknown enum value: \"+a):Ai.prototype.jb.call(this,a)};As.prototype.createNetwork=function(){return new Fs(this)};\nAs.prototype.doLayout=function(a){null===this.network&&(this.network=this.makeNetwork(a));this.arrangementOrigin=this.initialOrigin(this.arrangementOrigin);this.Ji=-1;this.pc=this.mh=0;this.gp=this.fp=this.Wj=null;for(a=0;a<this.xe.length;a++)this.xe[a]=null;if(0<this.network.vertexes.count){this.network.Bq();if(this.Uw())return;this.cycleRemoveOption!==Gs&&this.removeCycles();for(a=this.network.vertexes.iterator;a.next();)a.value.layer=-1;this.sa=-1;this.assignLayers();for(a.reset();a.next();)this.sa=\nMath.max(this.sa,a.value.layer);this.cycleRemoveOption===Gs&&this.removeCycles();a=this.network;for(var b=[],c=a.edges.iterator;c.next();){var d=c.value;d.valid=!1;b.push(d)}for(c=0;c<b.length;c++){d=b[c];var e=d.fromVertex,f=d.toVertex;if(!(d.valid||(null===e.node&&null===e.data||null===f.node&&null===f.data)&&e.layer===f.layer)){var g=0,h=0,k=0,l=0;if(null!==d.link){h=d.link;if(null===h)continue;var m=e.node;g=f.node;if(null===m||null===g)continue;var n=h.fromNode;k=h.toNode;var p=h.fromPort;h=\nh.toPort;if(d.rev){l=n;var r=p;n=k;p=h;k=l;h=r}var q=e.focus;l=f.focus;var u=d.rev?f.bounds:e.bounds;r=J.alloc();m!==n?u.s()&&n.isVisible()?n.actualBounds.s()?(n.Df(p,zc,r),r.x+=n.actualBounds.x-u.x,r.y+=n.actualBounds.y-u.y):(n.Df(p,zc,r),r.s()||r.assign(q)):r.assign(q):u.s()?(n.Df(p,zc,r),r.s()||r.assign(q)):r.assign(q);n=d.rev?e.bounds:f.bounds;m=J.alloc();g!==k?n.s()&&k.isVisible()?k.actualBounds.s()?(k.Df(h,zc,m),m.x+=k.actualBounds.x-n.x,m.y+=k.actualBounds.y-n.y):(k.Df(h,zc,m),m.s()||m.assign(l)):\nm.assign(l):n.s()?(k.Df(h,zc,m),m.s()||m.assign(l)):m.assign(l);90===this.K||270===this.K?(g=Math.round((r.x-q.x)/this.Zb),k=r.x,h=Math.round((m.x-l.x)/this.Zb),l=m.x):(g=Math.round((r.y-q.y)/this.Zb),k=r.y,h=Math.round((m.y-l.y)/this.Zb),l=m.y);J.free(r);J.free(m);d.portFromColOffset=g;d.portFromPos=k;d.portToColOffset=h;d.portToPos=l}else d.portFromColOffset=0,d.portFromPos=0,d.portToColOffset=0,d.portToPos=0;r=e.layer;m=f.layer;n=0;u=d.link;if(null!==u){var w=u.fromPort,v=u.toPort;if(null!==w&&\nnull!==v){var y=u.fromNode;p=u.toNode;if(null!==y&&null!==p){var z=Hs(this,!0),A=Hs(this,!1),C=this.setsPortSpots?z:u.computeSpot(!0,w);q=this.setsPortSpots?A:u.computeSpot(!1,v);var F=u.isOrthogonal;C.Oc()&&C.Ef(A)&&q.Oc()&&q.Ef(z)?n=0:(z=u.getLinkPoint(y,w,C,!0,F,p,v,J.alloc()),A=u.getLinkDirection(y,w,z,C,!0,F,p,v),J.free(z),C.Vt()||A!==Is(this,d,!0)?this.setsPortSpots&&null!==y&&1===y.ports.count&&d.rev&&(n+=1):n+=1,C=u.getLinkPoint(p,v,q,!1,F,y,w,J.alloc()),u=u.getLinkDirection(p,v,C,q,!1,F,\ny,w),J.free(C),q.Vt()||u!==Is(this,d,!1)?this.setsPortSpots&&null!==p&&1===p.ports.count&&d.rev&&(n+=2):n+=2)}}}p=n;n=1===p||3===p?!0:!1;if(p=2===p||3===p?!0:!1)q=a.createVertex(),q.node=null,q.wf=1,q.layer=r,q.near=e,a.Bg(q),e=a.Fk(e,q,d.link),e.valid=!1,e.rev=d.rev,e.portFromColOffset=g,e.portToColOffset=0,e.portFromPos=k,e.portToPos=0,e=q;u=1;n&&u--;if(r-m>u&&0<r){d.valid=!1;q=a.createVertex();q.node=null;q.wf=2;q.layer=r-1;a.Bg(q);e=a.Fk(e,q,d.link);e.valid=!0;e.rev=d.rev;e.portFromColOffset=\np?0:g;e.portToColOffset=0;e.portFromPos=p?0:k;e.portToPos=0;e=q;for(r--;r-m>u&&0<r;)q=a.createVertex(),q.node=null,q.wf=3,q.layer=r-1,a.Bg(q),e=a.Fk(e,q,d.link),e.valid=!0,e.rev=d.rev,e.portFromColOffset=0,e.portToColOffset=0,e.portFromPos=0,e.portToPos=0,e=q,r--;e=a.Fk(q,f,d.link);e.valid=!n;n&&(q.near=f);e.rev=d.rev;e.portFromColOffset=0;e.portToColOffset=h;e.portFromPos=0;e.portToPos=l}else d.valid=!0}}a=this.zb=[];for(b=0;b<=this.sa;b++)a[b]=0;for(b=this.network.vertexes.iterator;b.next();)b.value.index=\n-1;this.initializeIndices();this.Ji=-1;for(c=this.pc=this.mh=0;c<=this.sa;c++)a[c]>a[this.pc]&&(this.Ji=a[c]-1,this.pc=c),a[c]<a[this.mh]&&(this.mh=c);this.gp=[];for(c=0;c<a.length;c++)this.gp[c]=[];for(b.reset();b.next();)a=b.value,this.gp[a.layer][a.index]=a;this.Ca=-1;for(a=0;a<=this.sa;a++){b=Js(this,a);c=0;d=this.zb[a];for(f=0;f<d;f++)e=b[f],c+=this.nodeMinColumnSpace(e,!0),e.column=c,c+=1,c+=this.nodeMinColumnSpace(e,!1);this.Ca=Math.max(this.Ca,c-1);Ks(this,a,b)}this.reduceCrossings();this.straightenAndPack();\nthis.updateParts()}this.network=null;this.isValidLayout=!0};As.prototype.linkMinLength=function(){return 1};function Ls(a){var b=a.fromVertex.node||a.fromVertex.data;a=a.toVertex.node||a.toVertex.data;return null===b&&null===a?8:null===b||null===a?4:1}As.prototype.nodeMinLayerSpace=function(a,b){return null===a.node&&null===a.data?0:90===this.K||270===this.K?b?a.focus.y+10:a.bounds.height-a.focus.y+10:b?a.focus.x+10:a.bounds.width-a.focus.x+10};\nAs.prototype.nodeMinColumnSpace=function(a,b){if(null===a.node&&null===a.data)return 0;var c=b?a.Nk:a.Mk;if(null!==c)return c;c=this.K;return 90===c||270===c?b?a.Nk=a.focus.x/this.Zb+1|0:a.Mk=(a.bounds.width-a.focus.x)/this.Zb+1|0:b?a.Nk=a.focus.y/this.Zb+1|0:a.Mk=(a.bounds.height-a.focus.y)/this.Zb+1|0};function Ms(a){null===a.Wj&&(a.Wj=[]);for(var b=0,c=a.network.vertexes.iterator;c.next();){var d=c.value;a.Wj[b]=d.layer;b++;a.Wj[b]=d.column;b++;a.Wj[b]=d.index;b++}return a.Wj}\nfunction Ns(a,b){var c=0;for(a=a.network.vertexes.iterator;a.next();){var d=a.value;d.layer=b[c];c++;d.column=b[c];c++;d.index=b[c];c++}}\nfunction Os(a,b,c){var d=Js(a,b),e=a.zb[b];if(null===a.fp||a.fp.length<e*e)a.fp=[];for(var f=a.fp,g=0;g<e;g++){var h=0,k=d[g],l=k.near;if(null!==l&&l.layer===k.layer)if(k=l.index,k>g)for(var m=g+1;m<k;m++){var n=d[m];n.near===l&&n.wf===l.wf||h++}else for(m=g-1;m>k;m--)n=d[m],n.near===l&&n.wf===l.wf||h++;var p;if(0<=c)for(k=d[g].sourceEdgesArrayAccess,l=0;l<k.length;l++){var r=k[l];if(r.valid&&r.fromVertex.layer!==b)for(n=r.fromVertex.index,m=r.portToPos,r=r.portFromPos,p=l+1;p<k.length;p++){var q=\nk[p];if(q.valid&&q.fromVertex.layer!==b){var u=q.fromVertex.index;var w=q.portToPos;q=q.portFromPos;m<w&&(n>u||n===u&&r>q)&&h++;w<m&&(u>n||u===n&&q>r)&&h++}}}if(0>=c)for(k=d[g].destinationEdgesArrayAccess,l=0;l<k.length;l++)if(r=k[l],r.valid&&r.toVertex.layer!==b)for(n=r.toVertex.index,m=r.portToPos,r=r.portFromPos,p=l+1;p<k.length;p++)q=k[p],q.valid&&q.toVertex.layer!==b&&(u=q.toVertex.index,w=q.portToPos,q=q.portFromPos,r<q&&(n>u||n===u&&m>w)&&h++,q<r&&(u>n||u===n&&w>m)&&h++);f[g*e+g]=h;for(k=g+\n1;k<e;k++){var v=0,y=0;if(0<=c){h=d[g].sourceEdgesArrayAccess;var z=d[k].sourceEdgesArrayAccess;for(l=0;l<h.length;l++)if(r=h[l],r.valid&&r.fromVertex.layer!==b)for(n=r.fromVertex.index,r=r.portFromPos,p=0;p<z.length;p++)q=z[p],q.valid&&q.fromVertex.layer!==b&&(u=q.fromVertex.index,q=q.portFromPos,(n<u||n===u&&r<q)&&y++,(u<n||u===n&&q<r)&&v++)}if(0>=c)for(h=d[g].destinationEdgesArrayAccess,z=d[k].destinationEdgesArrayAccess,l=0;l<h.length;l++)if(r=h[l],r.valid&&r.toVertex.layer!==b)for(n=r.toVertex.index,\nm=r.portToPos,p=0;p<z.length;p++)q=z[p],q.valid&&q.toVertex.layer!==b&&(u=q.toVertex.index,w=q.portToPos,(n<u||n===u&&m<w)&&y++,(u<n||u===n&&w<m)&&v++);f[g*e+k]=v;f[k*e+g]=y}}Ks(a,b,d);return f}As.prototype.countCrossings=function(){for(var a=0,b=0;b<=this.sa;b++)for(var c=Os(this,b,1),d=this.zb[b],e=0;e<d;e++)for(var f=e;f<d;f++)a+=c[e*d+f];return a};\nfunction Ps(a){for(var b=0,c=0;c<=a.sa;c++){for(var d=a,e=c,f=Js(d,e),g=d.zb[e],h=0,k=0;k<g;k++){var l=f[k].destinationEdgesArrayAccess;if(null!==l)for(var m=0;m<l.length;m++){var n=l[m];if(n.valid&&n.toVertex.layer!==e){var p=n.fromVertex.column+n.portFromColOffset;var r=n.toVertex.column+n.portToColOffset;h+=(Math.abs(p-r)+1)*Ls(n)}}}Ks(d,e,f);b+=h}return b}\nAs.prototype.normalize=function(){var a=Infinity;this.Ca=-1;for(var b=this.network.vertexes.iterator;b.next();){var c=b.value;a=Math.min(a,c.column-this.nodeMinColumnSpace(c,!0));this.Ca=Math.max(this.Ca,c.column+this.nodeMinColumnSpace(c,!1))}for(b.reset();b.next();)b.value.column-=a;this.Ca-=a};\nfunction Qs(a,b,c){for(var d=Js(a,b),e=a.zb[b],f=[],g=0;g<e;g++){var h=d[g],k=null;0>=c&&(k=h.sourceEdgesArrayAccess);var l=null;0<=c&&(l=h.destinationEdgesArrayAccess);var m=0,n=0,p=h.near;null!==p&&p.layer===h.layer&&(m+=p.column-1,n++);if(null!==k)for(p=0;p<k.length;p++){h=k[p];var r=h.fromVertex;h.valid&&!h.rev&&r.layer!==b&&(m+=r.column,n++)}if(null!==l)for(k=0;k<l.length;k++)h=l[k],p=h.toVertex,h.valid&&!h.rev&&p.layer!==b&&(m+=p.column,n++);f[g]=0===n?-1:m/n}Ks(a,b,d);return f}\nfunction Rs(a,b,c){for(var d=Js(a,b),e=a.zb[b],f=[],g=0;g<e;g++){var h=d[g],k=null;0>=c&&(k=h.sourceEdgesArrayAccess);var l=null;0<=c&&(l=h.destinationEdgesArrayAccess);var m=0,n=[],p=h.near;null!==p&&p.layer===h.layer&&(n[m]=p.column-1,m++);h=void 0;if(null!==k)for(p=0;p<k.length;p++){h=k[p];var r=h.fromVertex;h.valid&&!h.rev&&r.layer!==b&&(n[m]=r.column+h.portFromColOffset,m++)}if(null!==l)for(k=0;k<l.length;k++)h=l[k],p=h.toVertex,h.valid&&!h.rev&&p.layer!==b&&(n[m]=p.column+h.portToColOffset,\nm++);0===m?f[g]=-1:(n.sort(function(a,b){return a-b}),l=m>>1,f[g]=0!==(m&1)?n[l]:n[l-1]+n[l]>>1)}Ks(a,b,d);return f}function Ss(a,b,c,d,e,f){if(b.component===d){b.component=c;if(e)for(var g=b.destinationEdges;g.next();){var h=g.value;var k=h.toVertex;var l=b.layer-k.layer;h=a.linkMinLength(h);l===h&&Ss(a,k,c,d,e,f)}if(f)for(g=b.sourceEdges;g.next();)h=g.value,k=h.fromVertex,l=k.layer-b.layer,h=a.linkMinLength(h),l===h&&Ss(a,k,c,d,e,f)}}\nfunction Ts(a,b,c,d,e,f){if(b.component===d){b.component=c;if(e)for(var g=b.destinationEdges;g.next();)Ts(a,g.value.toVertex,c,d,e,f);if(f)for(b=b.sourceEdges;b.next();)Ts(a,b.value.fromVertex,c,d,e,f)}}\nAs.prototype.removeCycles=function(){for(var a=this.network.edges.iterator;a.next();)a.value.rev=!1;switch(this.jl){default:case Us:a=this.network;var b=0,c=a.vertexes.count-1,d=[];d.length=c+1;for(var e=a.vertexes.iterator;e.next();)e.value.valid=!0;for(;null!==Vs(a);){for(e=Ws(a);null!==e;)d[c]=e,c--,e.valid=!1,e=Ws(a);for(e=Xs(a);null!==e;)d[b]=e,b++,e.valid=!1,e=Xs(a);e=null;for(var f=0,g=this.network.vertexes.iterator;g.next();){var h=g.value;if(h.valid){for(var k=0,l=h.destinationEdges;l.next();)l.value.toVertex.valid&&\nk++;l=0;for(var m=h.sourceEdges;m.next();)m.value.fromVertex.valid&&l++;if(null===e||f<k-l)e=h,f=k-l}}null!==e&&(d[b]=e,b++,e.valid=!1)}for(b=0;b<a.vertexes.count;b++)d[b].index=b;for(d=a.edges.iterator;d.next();)b=d.value,b.fromVertex.index>b.toVertex.index&&(a.Rm(b),b.rev=!0);break;case Bs:for(d=this.network.vertexes.iterator;d.next();)a=d.value,a.Cg=-1,a.finish=-1;for(a=this.network.edges.iterator;a.next();)a.value.forest=!1;this.oh=0;for(d.reset();d.next();)b=d.value,0===b.sourceEdges.count&&\nYs(this,b);for(d.reset();d.next();)b=d.value,-1===b.Cg&&Ys(this,b);for(a.reset();a.next();)d=a.value,d.forest||(b=d.fromVertex,c=b.finish,e=d.toVertex,f=e.finish,e.Cg<b.Cg&&c<f&&(this.network.Rm(d),d.rev=!0));break;case Gs:a=this.network;b=a.vertexes.iterator;for(d=Infinity;b.next();)d=Math.min(d,b.value.layer);if(Infinity>d){if(0>d)for(b.reset();b.next();)b.value.layer-=d;d=[];for(b.reset();b.next();)c=b.value,e=d[c.layer],void 0===e?d[c.layer]=[c]:e.push(c);for(c=b=0;c<d.length;c++)if(e=d[c],!e||\n0===e.length)b++;else if(0<c)for(f=0;f<e.length;f++)e[f].layer-=b;for(d=a.edges.iterator;d.next();)b=d.value,b.fromVertex.layer<b.toVertex.layer&&(a.Rm(b),b.rev=!0)}}};function Vs(a){for(a=a.vertexes.iterator;a.next();){var b=a.value;if(b.valid)return b}return null}function Ws(a){for(a=a.vertexes.iterator;a.next();){var b=a.value;if(b.valid){for(var c=!0,d=b.destinationEdges;d.next();)if(d.value.toVertex.valid){c=!1;break}if(c)return b}}return null}\nfunction Xs(a){for(a=a.vertexes.iterator;a.next();){var b=a.value;if(b.valid){for(var c=!0,d=b.sourceEdges;d.next();)if(d.value.fromVertex.valid){c=!1;break}if(c)return b}}return null}function Ys(a,b){b.Cg=a.oh;a.oh++;for(var c=b.destinationEdges;c.next();){var d=c.value,e=d.toVertex;-1===e.Cg&&(d.forest=!0,Ys(a,e))}b.finish=a.oh;a.oh++}\nAs.prototype.assignLayers=function(){switch(this.Ml){case Zs:$s(this);break;case at:for(var a,b=this.network.vertexes.iterator;b.next();)a=bt(this,b.value),this.sa=Math.max(a,this.sa);for(b.reset();b.next();)a=b.value,a.layer=this.sa-a.layer;break;default:case Cs:$s(this);for(b=this.network.vertexes.iterator;b.next();)b.value.valid=!1;for(b.reset();b.next();)a=b.value,0===a.sourceEdges.count&&ct(this,a);a=Infinity;for(b.reset();b.next();)a=Math.min(a,b.value.layer);this.sa=-1;for(b.reset();b.next();){var c=\nb.value;c.layer-=a;this.sa=Math.max(this.sa,c.layer)}}};function $s(a){for(var b=a.network.vertexes.iterator;b.next();){var c=dt(a,b.value);a.sa=Math.max(c,a.sa)}}function dt(a,b){var c=0;if(-1===b.layer){for(var d=b.destinationEdges;d.next();){var e=d.value,f=e.toVertex;e=a.linkMinLength(e);c=Math.max(c,dt(a,f)+e)}b.layer=c}else c=b.layer;return c}\nfunction bt(a,b){var c=0;if(-1===b.layer){for(var d=b.sourceEdges;d.next();){var e=d.value,f=e.fromVertex;e=a.linkMinLength(e);c=Math.max(c,bt(a,f)+e)}b.layer=c}else c=b.layer;return c}\nfunction ct(a,b){if(!b.valid){b.valid=!0;for(var c=b.destinationEdges;c.next();)ct(a,c.value.toVertex);for(c=a.network.vertexes.iterator;c.next();)c.value.component=-1;for(var d=b.sourceEdgesArrayAccess,e=d.length,f=0;f<e;f++){var g=d[f],h=g.fromVertex,k=g.toVertex;g=a.linkMinLength(g);h.layer-k.layer>g&&Ss(a,h,0,-1,!0,!1)}for(Ss(a,b,1,-1,!0,!0);0!==b.component;){f=0;d=Infinity;h=0;k=null;for(g=a.network.vertexes.iterator;g.next();){var l=g.value;if(1===l.component){var m=0,n=!1,p=l.sourceEdgesArrayAccess;\ne=p.length;for(var r=0;r<e;r++){var q=p[r],u=q.fromVertex;m+=1;1!==u.component&&(f+=1,u=u.layer-l.layer,q=a.linkMinLength(q),d=Math.min(d,u-q))}p=l.destinationEdgesArrayAccess;e=p.length;for(r=0;r<e;r++)q=p[r].toVertex,--m,1!==q.component?--f:n=!0;(null===k||m<h)&&!n&&(k=l,h=m)}}if(0<f){for(c.reset();c.next();)e=c.value,1===e.component&&(e.layer+=d);b.component=0}else k.component=0}for(c=a.network.vertexes.iterator;c.next();)c.value.component=-1;for(Ss(a,b,1,-1,!0,!1);0!==b.component;){d=0;e=Infinity;\nf=0;h=null;for(k=a.network.vertexes.iterator;k.next();)if(g=k.value,1===g.component){l=0;m=!1;p=g.sourceEdgesArrayAccess;n=p.length;for(r=0;r<n;r++)q=p[r].fromVertex,l+=1,1!==q.component?d+=1:m=!0;p=g.destinationEdgesArrayAccess;n=p.length;for(r=0;r<n;r++)q=p[r],u=q.toVertex,--l,1!==u.component&&(--d,u=g.layer-u.layer,q=a.linkMinLength(q),e=Math.min(e,u-q));(null===h||l>f)&&!m&&(h=g,f=l)}if(0>d){for(c.reset();c.next();)d=c.value,1===d.component&&(d.layer-=e);b.component=0}else h.component=0}}}\nfunction Is(a,b,c){return 90===a.K?c&&!b.rev||!c&&b.rev?270:90:180===a.K?c&&!b.rev||!c&&b.rev?0:180:270===a.K?c&&!b.rev||!c&&b.rev?90:270:c&&!b.rev||!c&&b.rev?180:0}\nAs.prototype.initializeIndices=function(){switch(this.Bl){default:case et:for(var a=this.network.vertexes.iterator;a.next();){var b=a.value,c=b.layer;b.index=this.zb[c];this.zb[c]++}break;case Ds:a=this.network.vertexes.iterator;for(b=this.sa;0<=b;b--)for(a.reset();a.next();)c=a.value,c.layer===b&&-1===c.index&&ft(this,c);break;case gt:for(a=this.network.vertexes.iterator,b=0;b<=this.sa;b++)for(a.reset();a.next();)c=a.value,c.layer===b&&-1===c.index&&ht(this,c)}};\nfunction ft(a,b){var c=b.layer;b.index=a.zb[c];a.zb[c]++;b=b.destinationEdgesArrayAccess;for(c=!0;c;){c=!1;for(var d=0;d<b.length-1;d++){var e=b[d],f=b[d+1];e.portFromColOffset>f.portFromColOffset&&(c=!0,b[d]=f,b[d+1]=e)}}for(c=0;c<b.length;c++)d=b[c],d.valid&&(d=d.toVertex,-1===d.index&&ft(a,d))}\nfunction ht(a,b){var c=b.layer;b.index=a.zb[c];a.zb[c]++;b=b.sourceEdgesArrayAccess;for(var d=!0;d;)for(d=!1,c=0;c<b.length-1;c++){var e=b[c],f=b[c+1];e.portToColOffset>f.portToColOffset&&(d=!0,b[c]=f,b[c+1]=e)}for(c=0;c<b.length;c++)d=b[c],d.valid&&(d=d.fromVertex,-1===d.index&&ht(a,d))}\nAs.prototype.reduceCrossings=function(){var a=this.countCrossings(),b=Ms(this),c,d;for(c=0;c<this.Rj;c++){for(d=0;d<=this.sa;d++)it(this,d,1),jt(this,d,1);var e=this.countCrossings();e<a&&(a=e,b=Ms(this));for(d=this.sa;0<=d;d--)it(this,d,-1),jt(this,d,-1);e=this.countCrossings();e<a&&(a=e,b=Ms(this))}Ns(this,b);for(c=0;c<this.Rj;c++){for(d=0;d<=this.sa;d++)it(this,d,0),jt(this,d,0);e=this.countCrossings();e<a&&(a=e,b=Ms(this));for(d=this.sa;0<=d;d--)it(this,d,0),jt(this,d,0);e=this.countCrossings();\ne<a&&(a=e,b=Ms(this))}Ns(this,b);var f,g,h;switch(this.Zk){case kt:break;case lt:for(h=a+1;(d=this.countCrossings())<h;)for(h=d,c=this.sa;0<=c;c--)for(g=0;g<=c;g++){for(f=!0;f;)for(f=!1,d=c;d>=g;d--)f=jt(this,d,-1)||f;e=this.countCrossings();e>=a?Ns(this,b):(a=e,b=Ms(this));for(f=!0;f;)for(f=!1,d=c;d>=g;d--)f=jt(this,d,1)||f;e=this.countCrossings();e>=a?Ns(this,b):(a=e,b=Ms(this));for(f=!0;f;)for(f=!1,d=g;d<=c;d++)f=jt(this,d,1)||f;e>=a?Ns(this,b):(a=e,b=Ms(this));for(f=!0;f;)for(f=!1,d=g;d<=c;d++)f=\njt(this,d,-1)||f;e>=a?Ns(this,b):(a=e,b=Ms(this));for(f=!0;f;)for(f=!1,d=c;d>=g;d--)f=jt(this,d,0)||f;e>=a?Ns(this,b):(a=e,b=Ms(this));for(f=!0;f;)for(f=!1,d=g;d<=c;d++)f=jt(this,d,0)||f;e>=a?Ns(this,b):(a=e,b=Ms(this))}break;default:case Es:for(c=this.sa,g=0,h=a+1;(d=this.countCrossings())<h;){h=d;for(f=!0;f;)for(f=!1,d=c;d>=g;d--)f=jt(this,d,-1)||f;e=this.countCrossings();e>=a?Ns(this,b):(a=e,b=Ms(this));for(f=!0;f;)for(f=!1,d=c;d>=g;d--)f=jt(this,d,1)||f;e=this.countCrossings();e>=a?Ns(this,b):\n(a=e,b=Ms(this));for(f=!0;f;)for(f=!1,d=g;d<=c;d++)f=jt(this,d,1)||f;e>=a?Ns(this,b):(a=e,b=Ms(this));for(f=!0;f;)for(f=!1,d=g;d<=c;d++)f=jt(this,d,-1)||f;e>=a?Ns(this,b):(a=e,b=Ms(this));for(f=!0;f;)for(f=!1,d=c;d>=g;d--)f=jt(this,d,0)||f;e>=a?Ns(this,b):(a=e,b=Ms(this));for(f=!0;f;)for(f=!1,d=g;d<=c;d++)f=jt(this,d,0)||f;e>=a?Ns(this,b):(a=e,b=Ms(this))}}Ns(this,b)};\nfunction it(a,b,c){var d=Js(a,b),e=a.zb[b],f=Rs(a,b,c),g=Qs(a,b,c);for(c=0;c<e;c++)-1===g[c]&&(g[c]=d[c].column),-1===f[c]&&(f[c]=d[c].column);for(var h=!0,k;h;)for(h=!1,c=0;c<e-1;c++)if(f[c+1]<f[c]||f[c+1]===f[c]&&g[c+1]<g[c])h=!0,k=f[c],f[c]=f[c+1],f[c+1]=k,k=g[c],g[c]=g[c+1],g[c+1]=k,k=d[c],d[c]=d[c+1],d[c+1]=k;for(c=f=0;c<e;c++)k=d[c],k.index=c,f+=a.nodeMinColumnSpace(k,!0),k.column=f,f+=1,f+=a.nodeMinColumnSpace(k,!1);Ks(a,b,d)}\nfunction jt(a,b,c){var d=Js(a,b),e=a.zb[b];c=Os(a,b,c);var f;var g=[];for(f=0;f<e;f++)g[f]=-1;var h=[];for(f=0;f<e;f++)h[f]=-1;for(var k=!1,l=!0;l;)for(l=!1,f=0;f<e-1;f++){var m=c[d[f].index*e+d[f+1].index],n=c[d[f+1].index*e+d[f].index],p=0,r=0,q=d[f].column,u=d[f+1].column,w=a.nodeMinColumnSpace(d[f],!0),v=a.nodeMinColumnSpace(d[f],!1),y=a.nodeMinColumnSpace(d[f+1],!0),z=a.nodeMinColumnSpace(d[f+1],!1);w=q-w+y;v=u-v+z;var A=d[f].sourceEdges.iterator;for(A.reset();A.next();)if(y=A.value,z=y.fromVertex,\ny.valid&&z.layer===b){for(y=0;d[y]!==z;)y++;y<f&&(p+=2*(f-y),r+=2*(f+1-y));y===f+1&&(p+=1);y>f+1&&(p+=4*(y-f),r+=4*(y-(f+1)))}A=d[f].destinationEdges.iterator;for(A.reset();A.next();)if(y=A.value,z=y.toVertex,y.valid&&z.layer===b){for(y=0;d[y]!==z;)y++;y===f+1&&(r+=1)}A=d[f+1].sourceEdges.iterator;for(A.reset();A.next();)if(y=A.value,z=y.fromVertex,y.valid&&z.layer===b){for(y=0;d[y]!==z;)y++;y<f&&(p+=2*(f+1-y),r+=2*(f-y));y===f&&(r+=1);y>f+1&&(p+=4*(y-(f+1)),r+=4*(y-f))}A=d[f+1].destinationEdges.iterator;\nfor(A.reset();A.next();)if(y=A.value,z=y.toVertex,y.valid&&z.layer===b){for(y=0;d[y]!==z;)y++;y===f&&(p+=1)}y=z=0;A=g[d[f].index];var C=h[d[f].index],F=g[d[f+1].index],Q=h[d[f+1].index];-1!==A&&(z+=Math.abs(A-q),y+=Math.abs(A-v));-1!==C&&(z+=Math.abs(C-q),y+=Math.abs(C-v));-1!==F&&(z+=Math.abs(F-u),y+=Math.abs(F-w));-1!==Q&&(z+=Math.abs(Q-u),y+=Math.abs(Q-w));if(r<p-.5||r===p&&n<m-.5||r===p&&n===m&&y<z-.5)l=k=!0,d[f].column=v,d[f+1].column=w,m=d[f],d[f]=d[f+1],d[f+1]=m}for(f=0;f<e;f++)d[f].index=\nf;Ks(a,b,d);return k}\nAs.prototype.straightenAndPack=function(){var a=0!==(this.ng&1);var b=0!==(this.ng&mt);1E3<this.network.edges.count&&b&&(a=!1);if(a){var c=[];for(b=0;b<=this.sa;b++)c[b]=0;for(var d,e=this.network.vertexes.iterator;e.next();){var f=e.value;b=f.layer;d=f.column;f=this.nodeMinColumnSpace(f,!1);c[b]=Math.max(c[b],d+f)}for(e.reset();e.next();)f=e.value,b=f.layer,d=f.column,f.column=(8*(this.Ca-c[b])>>1)+8*d;this.Ca*=8}if(0!==(this.ng&2))for(c=!0;c;){c=!1;for(b=this.pc+1;b<=this.sa;b++)c=nt(this,b,1)||\nc;for(b=this.pc-1;0<=b;b--)c=nt(this,b,-1)||c;c=nt(this,this.pc,0)||c}if(0!==(this.ng&4)){for(b=this.pc+1;b<=this.sa;b++)ot(this,b,1);for(b=this.pc-1;0<=b;b--)ot(this,b,-1);ot(this,this.pc,0)}a&&(pt(this,-1),pt(this,1));if(0!==(this.ng&2))for(c=!0;c;){c=!1;c=nt(this,this.pc,0)||c;for(b=this.pc+1;b<=this.sa;b++)c=nt(this,b,0)||c;for(b=this.pc-1;0<=b;b--)c=nt(this,b,0)||c}};function nt(a,b,c){for(var d=!1;qt(a,b,c);)d=!0;return d}\nfunction qt(a,b,c){var d,e=Js(a,b),f=a.zb[b],g=Qs(a,b,-1);if(0<c)for(d=0;d<f;d++)g[d]=-1;var h=Qs(a,b,1);if(0>c)for(d=0;d<f;d++)h[d]=-1;for(var k=!1,l=!0;l;)for(l=!1,d=0;d<f;d++){var m=e[d].column,n=a.nodeMinColumnSpace(e[d],!0),p=a.nodeMinColumnSpace(e[d],!1),r=0;0>d-1||m-e[d-1].column-1>n+a.nodeMinColumnSpace(e[d-1],!1)?r=m-1:r=m;n=d+1>=f||e[d+1].column-m-1>p+a.nodeMinColumnSpace(e[d+1],!0)?m+1:m;var q=p=0,u=0;if(0>=c)for(var w=e[d].sourceEdges.iterator;w.next();){var v=w.value;var y=v.fromVertex;\nif(v.valid&&y.layer!==b){var z=Ls(v);var A=v.portFromColOffset;v=v.portToColOffset;y=y.column;p+=(Math.abs(m+v-(y+A))+1)*z;q+=(Math.abs(r+v-(y+A))+1)*z;u+=(Math.abs(n+v-(y+A))+1)*z}}if(0<=c)for(w=e[d].destinationEdges.iterator;w.next();)v=w.value,y=v.toVertex,v.valid&&y.layer!==b&&(z=Ls(v),A=v.portFromColOffset,v=v.portToColOffset,y=y.column,p+=(Math.abs(m+A-(y+v))+1)*z,q+=(Math.abs(r+A-(y+v))+1)*z,u+=(Math.abs(n+A-(y+v))+1)*z);v=A=z=0;w=g[e[d].index];y=h[e[d].index];-1!==w&&(z+=Math.abs(w-m),A+=\nMath.abs(w-r),v+=Math.abs(w-n));-1!==y&&(z+=Math.abs(y-m),A+=Math.abs(y-r),v+=Math.abs(y-n));if(q<p||q===p&&A<z)l=k=!0,e[d].column=r;else if(u<p||u===p&&v<z)l=k=!0,e[d].column=n}Ks(a,b,e);a.normalize();return k}\nfunction ot(a,b,c){var d=Js(a,b),e=a.zb[b],f=Rs(a,b,c),g=[];for(c=0;c<e;c++)g[c]=f[c];for(f=!0;f;)for(f=!1,c=0;c<e;c++){var h=d[c].column,k=a.nodeMinColumnSpace(d[c],!0),l=a.nodeMinColumnSpace(d[c],!1),m=0;if(-1===g[c])if(0===c&&c===e-1)m=h;else if(0===c){var n=d[c+1].column;n-h===l+a.nodeMinColumnSpace(d[c+1],!0)?m=h-1:m=h}else c===e-1?(n=d[c-1].column,m=h-n===k+a.nodeMinColumnSpace(d[c-1],!1)?h+1:h):(n=d[c-1].column,k=n+a.nodeMinColumnSpace(d[c-1],!1)+k+1,n=d[c+1].column,l=n-a.nodeMinColumnSpace(d[c+\n1],!0)-l-1,m=(k+l)/2|0);else 0===c&&c===e-1?m=g[c]:0===c?(n=d[c+1].column,l=n-a.nodeMinColumnSpace(d[c+1],!0)-l-1,m=Math.min(g[c],l)):c===e-1?(n=d[c-1].column,k=n+a.nodeMinColumnSpace(d[c-1],!1)+k+1,m=Math.max(g[c],k)):(n=d[c-1].column,k=n+a.nodeMinColumnSpace(d[c-1],!1)+k+1,n=d[c+1].column,l=n-a.nodeMinColumnSpace(d[c+1],!0)-l-1,k<g[c]&&g[c]<l?m=g[c]:k>=g[c]?m=k:l<=g[c]&&(m=l));m!==h&&(f=!0,d[c].column=m)}Ks(a,b,d);a.normalize()}\nfunction rt(a,b){for(var c=!0,d=a.network.vertexes.iterator;d.next();){var e=d.value,f=a.nodeMinColumnSpace(e,!0),g=a.nodeMinColumnSpace(e,!1);if(e.column-f<=b&&e.column+g>=b){c=!1;break}}a=!1;if(c)for(d.reset();d.next();)c=d.value,c.column>b&&(--c.column,a=!0);return a}\nfunction st(a,b){var c=b+1;var d,e=[],f=[];for(d=0;d<=a.sa;d++)e[d]=!1,f[d]=!1;for(var g=a.network.vertexes.iterator;g.next();){d=g.value;var h=d.column-a.nodeMinColumnSpace(d,!0),k=d.column+a.nodeMinColumnSpace(d,!1);h<=b&&k>=b&&(e[d.layer]=!0);h<=c&&k>=c&&(f[d.layer]=!0)}h=!0;c=!1;for(d=0;d<=a.sa;d++)h=h&&!(e[d]&&f[d]);if(h)for(g.reset();g.next();)a=g.value,a.column>b&&(--a.column,c=!0);return c}\nfunction pt(a,b){for(var c=0;c<=a.Ca;c++)for(;rt(a,c););a.normalize();for(c=0;c<a.Ca;c++)for(;st(a,c););a.normalize();var d;if(0<b)for(c=0;c<=a.Ca;c++){var e=Ms(a);var f=Ps(a);for(d=f+1;f<d;){d=f;tt(a,c,1);var g=Ps(a);g>f?Ns(a,e):g<f&&(f=g,e=Ms(a))}}if(0>b)for(c=a.Ca;0<=c;c--)for(e=Ms(a),f=Ps(a),d=f+1;f<d;)d=f,tt(a,c,-1),g=Ps(a),g>f?Ns(a,e):g<f&&(f=g,e=Ms(a));a.normalize()}\nfunction tt(a,b,c){a.Ec=0;for(var d=a.network.vertexes.iterator;d.next();)d.value.component=-1;if(0<c)for(d.reset();d.next();){var e=d.value;e.column-a.nodeMinColumnSpace(e,!0)<=b&&(e.component=a.Ec)}if(0>c)for(d.reset();d.next();)e=d.value,e.column+a.nodeMinColumnSpace(e,!1)>=b&&(e.component=a.Ec);a.Ec++;for(d.reset();d.next();)b=d.value,-1===b.component&&(Ts(a,b,a.Ec,-1,!0,!0),a.Ec++);var f;b=[];for(f=0;f<a.Ec*a.Ec;f++)b[f]=!1;e=[];for(f=0;f<(a.sa+1)*(a.Ca+1);f++)e[f]=-1;for(d.reset();d.next();){f=\nd.value;for(var g=f.layer,h=Math.max(0,f.column-a.nodeMinColumnSpace(f,!0)),k=Math.min(a.Ca,f.column+a.nodeMinColumnSpace(f,!1));h<=k;h++)e[g*(a.Ca+1)+h]=f.component}for(f=0;f<=a.sa;f++){if(0<c)for(g=0;g<a.Ca;g++)-1!==e[f*(a.Ca+1)+g]&&-1!==e[f*(a.Ca+1)+g+1]&&e[f*(a.Ca+1)+g]!==e[f*(a.Ca+1)+g+1]&&(b[e[f*(a.Ca+1)+g]*a.Ec+e[f*(a.Ca+1)+g+1]]=!0);if(0>c)for(g=a.Ca;0<g;g--)-1!==e[f*(a.Ca+1)+g]&&-1!==e[f*(a.Ca+1)+g-1]&&e[f*(a.Ca+1)+g]!==e[f*(a.Ca+1)+g-1]&&(b[e[f*(a.Ca+1)+g]*a.Ec+e[f*(a.Ca+1)+g-1]]=!0)}e=\n[];for(f=0;f<a.Ec;f++)e[f]=!0;g=[];for(g.push(0);0!==g.length;)if(k=g[g.length-1],g.pop(),e[k])for(e[k]=!1,f=0;f<a.Ec;f++)b[k*a.Ec+f]&&g.splice(0,0,f);if(0<c)for(d.reset();d.next();)a=d.value,e[a.component]&&--a.column;if(0>c)for(d.reset();d.next();)c=d.value,e[c.component]&&(c.column+=1)}\nAs.prototype.commitLayout=function(){if(this.setsPortSpots)for(var a=Hs(this,!0),b=Hs(this,!1),c=this.network.edges.iterator;c.next();){var d=c.value.link;null!==d&&(d.fromSpot=a,d.toSpot=b)}this.commitNodes();this.Iv();this.isRouting&&this.commitLinks()};function Hs(a,b){return 270===a.K?b?bd:ed:90===a.K?b?ed:bd:180===a.K?b?cd:dd:b?dd:cd}\nAs.prototype.commitNodes=function(){this.$d=[];this.zd=[];this.yd=[];this.Ia=[];for(var a=0;a<=this.sa;a++)this.$d[a]=0,this.zd[a]=0,this.yd[a]=0,this.Ia[a]=0;for(a=this.network.vertexes.iterator;a.next();){var b=a.value,c=b.layer;this.$d[c]=Math.max(this.$d[c],this.nodeMinLayerSpace(b,!0));this.zd[c]=Math.max(this.zd[c],this.nodeMinLayerSpace(b,!1))}b=0;c=this.ue;for(var d=0;d<=this.sa;d++){var e=c;0>=this.$d[d]+this.zd[d]&&(e=0);0<d&&(b+=e/2);90===this.K||0===this.K?(b+=this.zd[d],this.yd[d]=b,\nb+=this.$d[d]):(b+=this.$d[d],this.yd[d]=b,b+=this.zd[d]);d<this.sa&&(b+=e/2);this.Ia[d]=b}c=b;b=this.arrangementOrigin;for(d=0;d<=this.sa;d++)270===this.K?this.yd[d]=b.y+this.yd[d]:90===this.K?(this.yd[d]=b.y+c-this.yd[d],this.Ia[d]=c-this.Ia[d]):180===this.K?this.yd[d]=b.x+this.yd[d]:(this.yd[d]=b.x+c-this.yd[d],this.Ia[d]=c-this.Ia[d]);a.reset();for(c=d=Infinity;a.next();){e=a.value;var f=e.layer,g=e.column|0;if(270===this.K||90===this.K){var h=b.x+this.Zb*g;f=this.yd[f]}else h=this.yd[f],f=b.y+\nthis.Zb*g;e.centerX=h;e.centerY=f;d=Math.min(e.x,d);c=Math.min(e.y,c)}d=b.x-d;b=b.y-c;this.Vc=new J(d,b);for(a.reset();a.next();)c=a.value,c.x+=d,c.y+=b,c.commit()};\nAs.prototype.Iv=function(){for(var a=0,b=this.ue,c=0;c<=this.sa;c++)a+=this.$d[c],a+=this.zd[c];a+=this.sa*b;b=[];c=this.Zb*this.Ca;for(var d=this.maxLayer;0<=d;d--)270===this.K?0===d?b.push(new N(0,0,c,Math.abs(this.Ia[0]))):b.push(new N(0,this.Ia[d-1],c,Math.abs(this.Ia[d-1]-this.Ia[d]))):90===this.K?0===d?b.push(new N(0,this.Ia[0],c,Math.abs(this.Ia[0]-a))):b.push(new N(0,this.Ia[d],c,Math.abs(this.Ia[d-1]-this.Ia[d]))):180===this.K?0===d?b.push(new N(0,0,Math.abs(this.Ia[0]),c)):b.push(new N(this.Ia[d-\n1],0,Math.abs(this.Ia[d-1]-this.Ia[d]),c)):0===d?b.push(new N(this.Ia[0],0,Math.abs(this.Ia[0]-a),c)):b.push(new N(this.Ia[d],0,Math.abs(this.Ia[d-1]-this.Ia[d]),c));this.commitLayers(b,this.Vc)};As.prototype.commitLayers=function(){};\nAs.prototype.commitLinks=function(){for(var a=this.network.edges.iterator,b;a.next();)b=a.value.link,null!==b&&(b.Th(),b.pk(),b.xf());for(a.reset();a.next();)b=a.value.link,null!==b&&b.xj();for(a.reset();a.next();){var c=a.value;b=c.link;if(null!==b){b.Th();var d=b,e=d.fromNode,f=d.toNode,g=d.fromPort,h=d.toPort;if(null!==e){var k=e.findVisibleNode();null!==k&&k!==e&&(e=k,g=k.port)}null!==f&&(k=f.findVisibleNode(),null!==k&&k!==f&&(f=k,h=k.port));var l=b.computeSpot(!0,g);k=b.computeSpot(!1,h);var m=\nc.fromVertex,n=c.toVertex;if(c.valid){if(b.curve===dg&&4===b.pointsCount)if(m.column===n.column)c=b.getLinkPoint(e,g,l,!0,!1,f,h),g=b.getLinkPoint(f,h,k,!1,!1,e,g),c.s()||c.set(e.actualBounds.center),g.s()||g.set(f.actualBounds.center),b.pk(),b.vf(c.x,c.y),b.vf((2*c.x+g.x)/3,(2*c.y+g.y)/3),b.vf((c.x+2*g.x)/3,(c.y+2*g.y)/3),b.vf(g.x,g.y);else{var p=!1,r=!1;null!==g&&l===sc&&(p=!0);null!==h&&k===sc&&(r=!0);if(p||r){var q=b.i(0).x;c=b.i(0).y;m=b.i(3).x;d=b.i(3).y;p&&(90===this.K||270===this.K?(p=q,n=\n(c+d)/2):(p=(q+m)/2,n=c),b.L(1,p,n),l=b.getLinkPoint(e,g,l,!0,!1,f,h),l.s()||l.set(e.actualBounds.center),b.L(0,l.x,l.y));r&&(90===this.K||270===this.K?(l=m,c=(c+d)/2):(l=(q+m)/2,c=d),b.L(2,l,c),e=b.getLinkPoint(f,h,k,!1,!1,e,g),e.s()||e.set(f.actualBounds.center),b.L(3,e.x,e.y))}}b.xf()}else if(m.layer===n.layer)b.xf();else{p=r=!1;q=b.firstPickIndex+1;if(b.isOrthogonal){p=!0;var u=b.pointsCount;4<u&&b.points.removeRange(2,u-3)}else if(b.curve===dg)r=!0,u=b.pointsCount,4<u&&b.points.removeRange(2,\nu-3),4===u&&(q=2);else{u=b.pointsCount;var w=l===sc,v=k===sc;2<u&&w&&v?b.points.removeRange(1,u-2):3<u&&w&&!v?b.points.removeRange(1,u-3):3<u&&!w&&v?b.points.removeRange(2,u-2):4<u&&!w&&!v&&b.points.removeRange(2,u-3)}if(c.rev){for(;null!==n&&m!==n;){var y=u=null;for(w=n.sourceEdges.iterator;w.next()&&(v=w.value,v.link!==c.link||(u=v.fromVertex,y=v.toVertex,null!==u.node)););if(u!==m){w=b.i(q-1).x;v=b.i(q-1).y;var z=u.centerX;var A=u.centerY;if(p)180===this.K||0===this.K?q===b.firstPickIndex+1?(b.m(q++,\nw,v),b.m(q++,w,A)):(null!==y?y.centerY:v)!==A&&(y=this.Ia[u.layer-1]+this.Vc.x,b.m(q++,y,v),b.m(q++,y,A)):q===b.firstPickIndex+1?(b.m(q++,w,v),b.m(q++,z,v)):(null!==y?y.centerX:w)!==z&&(y=this.Ia[u.layer-1]+this.Vc.y,b.m(q++,w,y),b.m(q++,z,y));else if(q===b.firstPickIndex+1){y=Math.max(10,this.$d[n.layer]);var C=Math.max(10,this.zd[n.layer]);if(r)180===this.K?z<=n.bounds.x?(n=n.bounds.x,b.m(q++,n-y,A),b.m(q++,n,A),b.m(q++,n+C,A)):(b.m(q++,z-y,A),b.m(q++,z,A),b.m(q++,z+C,A)):90===this.K?A>=n.bounds.bottom?\n(n=n.bounds.y+n.bounds.height,b.m(q++,z,n+C),b.m(q++,z,n),b.m(q++,z,n-y)):(b.m(q++,z,A+C),b.m(q++,z,A),b.m(q++,z,A-y)):270===this.K?A<=n.bounds.y?(n=n.bounds.y,b.m(q++,z,n-y),b.m(q++,z,n),b.m(q++,z,n+C)):(b.m(q++,z,A-y),b.m(q++,z,A),b.m(q++,z,A+C)):0===this.K&&(z>=n.bounds.right?(n=n.bounds.x+n.bounds.width,b.m(q++,n+C,A),b.m(q++,n,A),b.m(q++,n-y,A)):(b.m(q++,z+C,A),b.m(q++,z,A),b.m(q++,z-y,A)));else{b.m(q++,w,v);var F=0;if(180===this.K||0===this.K){if(180===this.K?z>=n.bounds.right:z<=n.bounds.x)F=\n(0===this.K?-y:C)/2;b.m(q++,w+F,A)}else{if(270===this.K?A>=n.bounds.bottom:A<=n.bounds.y)F=(90===this.K?-y:C)/2;b.m(q++,z,v+F)}b.m(q++,z,A)}}else y=Math.max(10,this.$d[u.layer]),C=Math.max(10,this.zd[u.layer]),180===this.K?(r&&b.m(q++,z-y,A),b.m(q++,z,A),r&&b.m(q++,z+C,A)):90===this.K?(r&&b.m(q++,z,A+C),b.m(q++,z,A),r&&b.m(q++,z,A-y)):270===this.K?(r&&b.m(q++,z,A-y),b.m(q++,z,A),r&&b.m(q++,z,A+C)):(r&&b.m(q++,z+C,A),b.m(q++,z,A),r&&b.m(q++,z-y,A))}n=u}if(null===h||l!==sc||p)if(w=b.i(q-1).x,v=b.i(q-\n1).y,z=b.i(q).x,A=b.i(q).y,p)n=this.zd[m.layer],180===this.K||0===this.K?(p=v,p>=m.bounds.y&&p<=m.bounds.bottom&&(180===this.K?z>=m.bounds.x:z<=m.bounds.right)&&(n=m.centerX+(180===this.K?-n:n),p<m.bounds.y+m.bounds.height/2?p=m.bounds.y-this.Zb/2:p=m.bounds.bottom+this.Zb/2,b.m(q++,n,v),b.m(q++,n,p)),b.m(q++,z,p)):(p=w,p>=m.bounds.x&&p<=m.bounds.right&&(270===this.K?A>=m.bounds.y:A<=m.bounds.bottom)&&(n=m.centerY+(270===this.K?-n:n),p<m.bounds.x+m.bounds.width/2?p=m.bounds.x-this.Zb/2:p=m.bounds.right+\nthis.Zb/2,b.m(q++,w,n),b.m(q++,p,n)),b.m(q++,p,A)),b.m(q++,z,A);else if(r)y=Math.max(10,this.$d[m.layer]),C=Math.max(10,this.zd[m.layer]),180===this.K&&z>=m.bounds.x?(n=m.bounds.x+m.bounds.width,b.L(q-2,n,v),b.L(q-1,n+C,v)):90===this.K&&A<=m.bounds.bottom?(n=m.bounds.y,b.L(q-2,w,n),b.L(q-1,w,n-y)):270===this.K&&A>=m.bounds.y?(n=m.bounds.y+m.bounds.height,b.L(q-2,w,n),b.L(q-1,w,n+C)):0===this.K&&z<=m.bounds.right&&(n=m.bounds.x,b.L(q-2,n,v),b.L(q-1,n-y,v));else{y=Math.max(10,this.$d[m.layer]);C=Math.max(10,\nthis.zd[m.layer]);p=0;if(180===this.K||0===this.K){if(180===this.K?z<=m.bounds.x:z>=m.bounds.right)p=(0===this.K?C:-y)/2;b.m(q++,z+p,v)}else{if(270===this.K?A<=m.bounds.y:A>=m.bounds.bottom)p=(90===this.K?C:-y)/2;b.m(q++,w,A+p)}b.m(q++,z,A)}}else{for(;null!==m&&m!==n;){y=u=null;for(m=m.destinationEdges.iterator;m.next()&&(w=m.value,w.link!==c.link||(u=w.toVertex,y=w.fromVertex,null!==y.node&&(y=null),null!==u.node)););u!==n&&(w=b.i(q-1).x,v=b.i(q-1).y,z=u.centerX,A=u.centerY,p?180===this.K||0===this.K?\n(null!==y?y.centerY:v)!==A&&(y=this.Ia[u.layer]+this.Vc.x,q===b.firstPickIndex+1&&(y=0===this.K?Math.max(y,w):Math.min(y,w)),b.m(q++,y,v),b.m(q++,y,A)):(null!==y?y.centerX:w)!==z&&(y=this.Ia[u.layer]+this.Vc.y,q===b.firstPickIndex+1&&(y=90===this.K?Math.max(y,v):Math.min(y,v)),b.m(q++,w,y),b.m(q++,z,y)):(y=Math.max(10,this.$d[u.layer]),C=Math.max(10,this.zd[u.layer]),180===this.K?(b.m(q++,z+C,A),r&&b.m(q++,z,A),b.m(q++,z-y,A)):90===this.K?(b.m(q++,z,A-y),r&&b.m(q++,z,A),b.m(q++,z,A+C)):270===this.K?\n(b.m(q++,z,A+C),r&&b.m(q++,z,A),b.m(q++,z,A-y)):(b.m(q++,z-y,A),r&&b.m(q++,z,A),b.m(q++,z+C,A))));m=u}p&&(w=b.i(q-1).x,v=b.i(q-1).y,z=b.i(q).x,A=b.i(q).y,180===this.K||0===this.K?v!==A&&(y=0===this.K?Math.min(Math.max((z+w)/2,this.Ia[n.layer]+this.Vc.x),z):Math.max(Math.min((z+w)/2,this.Ia[n.layer]+this.Vc.x),z),b.m(q++,y,v),b.m(q++,y,A)):w!==z&&(y=90===this.K?Math.min(Math.max((A+v)/2,this.Ia[n.layer]+this.Vc.y),A):Math.max(Math.min((A+v)/2,this.Ia[n.layer]+this.Vc.y),A),b.m(q++,w,y),b.m(q++,z,y)))}null!==\nd&&r&&(null!==g&&(l===sc&&(l=b.i(0),d=b.i(2),l.w(d)||b.L(1,(l.x+d.x)/2,(l.y+d.y)/2)),l=b.getLinkPoint(e,g,sc,!0,!1,f,h),l.s()||l.set(e.actualBounds.center),b.L(0,l.x,l.y)),null!==h&&(k===sc&&(k=b.i(b.pointsCount-1),l=b.i(b.pointsCount-3),k.w(l)||b.L(b.pointsCount-2,(k.x+l.x)/2,(k.y+l.y)/2)),e=b.getLinkPoint(f,h,sc,!1,!1,e,g),e.s()||e.set(f.actualBounds.center),b.L(b.pointsCount-1,e.x,e.y)));b.xf();c.commit()}}}this.avoidOrthogonalOverlaps()};\nAs.prototype.avoidOrthogonalOverlaps=function(){if(!(0>=this.linkSpacing)){for(var a=new E,b=this.network.edges.iterator;b.next();){var c=b.value.link;null!==c&&c.isOrthogonal&&!a.contains(c)&&a.add(c)}if(0<a.count)if(90===this.K||270===this.K){b=0;c=[];for(a=a.iterator;a.next();){var d=a.value;if(null!==d&&d.isOrthogonal)for(var e=2;e<d.pointsCount-3;e++){var f=d.i(e);var g=d.i(e+1);if(this.A(f.y,g.y)&&!this.A(f.x,g.x)){var h=new ut;h.layer=Math.floor(f.y/2);var k=d.i(0),l=d.i(d.pointsCount-1);h.first=\nk.x*k.x+k.y;h.Xb=l.x*l.x+l.y;h.fd=Math.min(f.x,g.x);h.vc=Math.max(f.x,g.x);h.index=e;h.link=d;if(e+2<d.pointsCount){k=d.i(e-1);l=d.i(e+2);var m=0;k.y<f.y?m=l.y<f.y?3:f.x<g.x?2:1:k.y>f.y&&(m=l.y>f.y?0:g.x<f.x?2:1);h.l=m}c.push(h)}}}if(1<c.length)for(c.sort(this.Ry),a=0;a<c.length;){f=c[a].layer;for(d=a+1;d<c.length&&c[d].layer===f;)d++;if(1<d-a)for(f=a;f<d;){g=c[f].vc;for(e=a+1;e<d&&c[e].fd<g;)g=Math.max(g,c[e].vc),e++;g=e-f;if(1<g){this.uj(c,this.hu,f,f+g);m=1;h=c[f].Xb;for(k=f;k<e;k++)l=c[k],l.Xb!==\nh&&(m++,h=l.Xb);this.uj(c,this.Qy,f,f+g);var n=1;h=c[f].first;for(k=f;k<e;k++)l=c[k],l.first!==h&&(n++,h=l.first);k=!0;l=n;m<n?(k=!1,l=m,h=c[f].Xb,this.uj(c,this.hu,f,f+g)):h=c[f].first;m=0;for(n=f;n<e;n++){var p=c[n];(k?p.first:p.Xb)!==h&&(m++,h=k?p.first:p.Xb);var r=p.link;f=r.i(p.index);g=r.i(p.index+1);var q=this.linkSpacing*(m-(l-1)/2);b++;r.Th();r.L(p.index,f.x,f.y+q);r.L(p.index+1,g.x,g.y+q);r.xf()}}f=e}a=d}}else{b=0;c=[];for(a=a.iterator;a.next();)if(d=a.value,null!==d&&d.isOrthogonal)for(e=\n2;e<d.pointsCount-3;e++)f=d.i(e),g=d.i(e+1),this.A(f.x,g.x)&&!this.A(f.y,g.y)&&(h=new ut,h.layer=Math.floor(f.x/2),k=d.i(0),l=d.i(d.pointsCount-1),h.first=k.x+k.y*k.y,h.Xb=l.x+l.y*l.y,h.fd=Math.min(f.y,g.y),h.vc=Math.max(f.y,g.y),h.index=e,h.link=d,e+2<d.pointsCount&&(k=d.i(e-1),l=d.i(e+2),m=0,k.x<f.x?m=l.x<f.x?3:f.y<g.y?2:1:k.x>f.x&&(m=l.x>f.x?0:g.y<f.y?2:1),h.l=m),c.push(h));if(1<c.length)for(c.sort(this.Ry),a=0;a<c.length;){f=c[a].layer;for(d=a+1;d<c.length&&c[d].layer===f;)d++;if(1<d-a)for(f=\na;f<d;){g=c[f].vc;for(e=a+1;e<d&&c[e].fd<g;)g=Math.max(g,c[e].vc),e++;g=e-f;if(1<g){this.uj(c,this.hu,f,f+g);m=1;h=c[f].Xb;for(k=f;k<e;k++)l=c[k],l.Xb!==h&&(m++,h=l.Xb);this.uj(c,this.Qy,f,f+g);n=1;h=c[f].first;for(k=f;k<e;k++)l=c[k],l.first!==h&&(n++,h=l.first);k=!0;l=n;m<n?(k=!1,l=m,h=c[f].Xb,this.uj(c,this.hu,f,f+g)):h=c[f].first;m=0;for(n=f;n<e;n++)p=c[n],(k?p.first:p.Xb)!==h&&(m++,h=k?p.first:p.Xb),r=p.link,f=r.i(p.index),g=r.i(p.index+1),q=this.linkSpacing*(m-(l-1)/2),b++,r.Th(),r.L(p.index,\nf.x+q,f.y),r.L(p.index+1,g.x+q,g.y),r.xf()}f=e}a=d}}}};t=As.prototype;t.Ry=function(a,b){return a instanceof ut&&b instanceof ut&&a!==b?a.layer<b.layer?-1:a.layer>b.layer?1:a.fd<b.fd?-1:a.fd>b.fd?1:a.vc<b.vc?-1:a.vc>b.vc?1:0:0};t.Qy=function(a,b){return a instanceof ut&&b instanceof ut&&a!==b?a.first<b.first?-1:a.first>b.first||a.l<b.l?1:a.l>b.l||a.fd<b.fd?-1:a.fd>b.fd?1:a.vc<b.vc?-1:a.vc>b.vc?1:0:0};\nt.hu=function(a,b){return a instanceof ut&&b instanceof ut&&a!==b?a.Xb<b.Xb?-1:a.Xb>b.Xb||a.l<b.l?1:a.l>b.l||a.fd<b.fd?-1:a.fd>b.fd?1:a.vc<b.vc?-1:a.vc>b.vc?1:0:0};t.A=function(a,b){a-=b;return-1<a&&1>a};\nt.uj=function(a,b,c,d){var e=a.length,f=d-c;if(!(1>=f))if((0>c||c>=e-1)&&B(\"not in range 0 <= from < length: \"+c),2===f)d=a[c],e=a[c+1],0<b(d,e)&&(a[c]=e,a[c+1]=d);else if(0===c)if(d>=e)a.sort(b);else for(c=a.slice(0,d),c.sort(b),b=0;b<d;b++)a[b]=c[b];else if(d>=e)for(d=a.slice(c),d.sort(b),b=c;b<e;b++)a[b]=d[b-c];else for(e=a.slice(c,d),e.sort(b),b=c;b<d;b++)a[b]=e[b-c]};\nfunction Js(a,b){var c=a.zb[b];if(c>=a.xe.length){var d=[];for(var e=0;e<a.xe.length;e++)d[e]=a.xe[e];a.xe=d}void 0===a.xe[c]||null===a.xe[c]?d=[]:(d=a.xe[c],a.xe[c]=null);a=a.gp[b];for(b=0;b<a.length;b++)c=a[b],d[c.index]=c;return d}function Ks(a,b,c){a.xe[a.zb[b]]=c}\nna.Object.defineProperties(As.prototype,{layerSpacing:{get:function(){return this.ue},set:function(a){this.ue!==a&&0<=a&&(this.ue=a,this.B())}},columnSpacing:{get:function(){return this.Zb},set:function(a){this.Zb!==a&&0<a&&(this.Zb=a,this.B())}},direction:{get:function(){return this.K},set:function(a){this.K!==a&&(0===a||90===a||180===a||270===a?(this.K=a,this.B()):B(\"LayeredDigraphLayout.direction must be 0, 90, 180, or 270\"))}},\ncycleRemoveOption:{get:function(){return this.jl},set:function(a){this.jl===a||a!==Us&&a!==Bs&&a!==Gs||(this.jl=a,this.B())}},layeringOption:{get:function(){return this.Ml},set:function(a){this.Ml===a||a!==Cs&&a!==Zs&&a!==at||(this.Ml=a,this.B())}},initializeOption:{get:function(){return this.Bl},set:function(a){this.Bl===a||a!==Ds&&a!==gt&&a!==et||(this.Bl=a,this.B())}},iterations:{\nget:function(){return this.Rj},set:function(a){this.Rj!==a&&0<=a&&(this.Rj=a,this.B())}},aggressiveOption:{get:function(){return this.Zk},set:function(a){this.Zk===a||a!==kt&&a!==Es&&a!==lt||(this.Zk=a,this.B())}},packOption:{get:function(){return this.ng},set:function(a){this.ng!==a&&0<=a&&8>a&&(this.ng=a,this.B())}},setsPortSpots:{get:function(){return this.kf},set:function(a){this.kf!==a&&(this.kf=a,this.B())}},\nlinkSpacing:{get:function(){return this.Mo},set:function(a){this.Mo!==a&&0<=a&&(this.Mo=a,this.B())}},maxLayer:{get:function(){return this.sa}},maxIndex:{get:function(){return this.Ji}},maxColumn:{get:function(){return this.Ca}},minIndexLayer:{get:function(){return this.mh}},maxIndexLayer:{get:function(){return this.pc}}});\nvar Bs=new D(As,\"CycleDepthFirst\",0),Us=new D(As,\"CycleGreedy\",1),Gs=new D(As,\"CycleFromLayers\",2),Cs=new D(As,\"LayerOptimalLinkLength\",0),Zs=new D(As,\"LayerLongestPathSink\",1),at=new D(As,\"LayerLongestPathSource\",2),Ds=new D(As,\"InitDepthFirstOut\",0),gt=new D(As,\"InitDepthFirstIn\",1),et=new D(As,\"InitNaive\",2),kt=new D(As,\"AggressiveNone\",0),Es=new D(As,\"AggressiveLess\",1),lt=new D(As,\"AggressiveMore\",2),mt=8;As.className=\"LayeredDigraphLayout\";As.CycleDepthFirst=Bs;As.CycleGreedy=Us;\nAs.CycleFromLayers=Gs;As.LayerOptimalLinkLength=Cs;As.LayerLongestPathSink=Zs;As.LayerLongestPathSource=at;As.InitDepthFirstOut=Ds;As.InitDepthFirstIn=gt;As.InitNaive=et;As.AggressiveNone=kt;As.AggressiveLess=Es;As.AggressiveMore=lt;As.PackNone=0;As.PackExpand=1;As.PackStraighten=2;As.PackMedian=4;As.PackAll=15;function ut(){this.index=this.vc=this.fd=this.Xb=this.first=this.layer=0;this.link=null;this.l=0}ut.className=\"SegInfo\";function Fs(a){aq.call(this,a)}ma(Fs,aq);Fs.prototype.createVertex=function(){return new vt(this)};\nFs.prototype.createEdge=function(){return new wt(this)};Fs.className=\"LayeredDigraphNetwork\";function vt(a){oq.call(this,a);this.Ra=this.Rg=this.Fi=-1;this.I=NaN;this.T=null;this.valid=!1;this.finish=this.Cg=NaN;this.wf=0;this.Mk=this.Nk=null}ma(vt,oq);\nvt.prototype.serializeVertexProperties=function(a,b){oq.prototype.serializeVertexProperties.call(this,a,b);a.layer=this.layer;a.column=this.column;a.index=this.index;a.component=this.component;a.near=this.near?kb(this.near):null;a.valid=this.valid;a.Cg=this.Cg;a.finish=this.finish;a.wf=this.wf;a.Nk=this.Nk;a.Mk=this.Mk};\nvt.prototype.Cq=function(a,b,c,d){oq.prototype.Cq.call(this,a,b,c,d);this.layer=a.layer;this.column=a.column;this.index=a.index;this.component=a.component;if(b=b.get(a.near))this.near=b;this.valid=a.valid;this.Cg=a.Cg;this.finish=a.finish;this.wf=a.wf;this.Nk=a.Nk;this.Mk=a.Mk};\nna.Object.defineProperties(vt.prototype,{layer:{get:function(){return this.Fi},set:function(a){this.Fi!==a&&(this.Fi=a)}},column:{get:function(){return this.Rg},set:function(a){this.Rg!==a&&(this.Rg=a)}},index:{get:function(){return this.Ra},set:function(a){this.Ra!==a&&(this.Ra=a)}},component:{get:function(){return this.I},set:function(a){this.I!==a&&(this.I=a)}},near:{\nget:function(){return this.T},set:function(a){this.T!==a&&(this.T=a)}}});vt.className=\"LayeredDigraphVertex\";function wt(a){pq.call(this,a);this.l=this.La=this.eb=!1;this.Ka=this.I=NaN;this.T=this.u=0}ma(wt,pq);\nwt.prototype.serializeEdgeProperties=function(a,b){pq.prototype.serializeEdgeProperties.call(this,a,b);a.valid=this.valid;a.rev=this.rev;a.forest=this.forest;a.portFromPos=this.portFromPos;a.portToPos=this.portToPos;a.portFromColOffset=this.portFromColOffset;a.portToColOffset=this.portToColOffset};\nwt.prototype.deserializeEdgeProperties=function(a,b,c,d){pq.prototype.deserializeEdgeProperties.call(this,a,b,c,d);this.valid=a.valid;this.rev=a.rev;this.forest=a.forest;this.portFromPos=a.portFromPos;this.portToPos=a.portToPos;this.portFromColOffset=a.portFromColOffset;this.portToColOffset=a.portToColOffset};\nna.Object.defineProperties(wt.prototype,{fromVertex:{get:function(){return this.Yc},set:function(a){this.Yc!==a&&(this.Yc=a)}},toVertex:{get:function(){return this.ed},set:function(a){this.ed!==a&&(this.ed=a)}},valid:{get:function(){return this.eb},set:function(a){this.eb!==a&&(this.eb=a)}},rev:{get:function(){return this.La},set:function(a){this.La!==a&&(this.La=a)}},forest:{\nget:function(){return this.l},set:function(a){this.l!==a&&(this.l=a)}},portFromPos:{get:function(){return this.I},set:function(a){this.I!==a&&(this.I=a)}},portToPos:{get:function(){return this.Ka},set:function(a){this.Ka!==a&&(this.Ka=a)}},portFromColOffset:{get:function(){return this.u},set:function(a){this.u!==a&&(this.u=a)}},portToColOffset:{get:function(){return this.T},\nset:function(a){this.T!==a&&(this.T=a)}}});wt.className=\"LayeredDigraphEdge\";function xt(){Ai.call(this);this.Jb=new G;this.vp=yt;this.kd=zt;this.oq=At;this.ts=Bt;this.nx=[];this.jd=!0;this.Eb=Ct;this.Pd=(new M(10,10)).freeze();var a=new Dt(this);this.U=new Et(a);this.V=new Et(a);this.uv=[]}ma(xt,Ai);\nxt.prototype.cloneProtected=function(a){Ai.prototype.cloneProtected.call(this,a);a.vp=this.vp;a.oq=this.oq;a.ts=this.ts;a.jd=this.jd;a.Eb=this.Eb;a.Pd.assign(this.Pd);a.U.copyInheritedPropertiesFrom(this.U);a.V.copyInheritedPropertiesFrom(this.V)};\nxt.prototype.jb=function(a){a.classType===xt?0===a.name.indexOf(\"Alignment\")?this.alignment=a:0===a.name.indexOf(\"Arrangement\")?this.arrangement=a:0===a.name.indexOf(\"Compaction\")?this.compaction=a:0===a.name.indexOf(\"Path\")?this.path=a:0===a.name.indexOf(\"Sorting\")?this.sorting=a:0===a.name.indexOf(\"Style\")?this.treeStyle=a:B(\"Unknown enum value: \"+a):Ai.prototype.jb.call(this,a)};xt.prototype.createNetwork=function(){return new Dt(this)};\nxt.prototype.makeNetwork=function(a){function b(a){if(a instanceof W)return!a.isLinkLabel&&\"Comment\"!==a.category;if(a instanceof S){var b=a.fromNode;if(null===b||b.isLinkLabel||\"Comment\"===b.category)return!1;a=a.toNode;return null===a||a.isLinkLabel||\"Comment\"===a.category?!1:!0}return!1}var c=this.createNetwork();a instanceof R?(c.Ag(a.nodes,!0,b),c.Ag(a.links,!0,b)):a instanceof U?c.Ag(a.memberParts,!1,b):c.Ag(a.iterator,!1,b);return c};\nxt.prototype.doLayout=function(a){null===this.network&&(this.network=this.makeNetwork(a));this.arrangement!==Ft&&(this.arrangementOrigin=this.initialOrigin(this.arrangementOrigin));var b=this.diagram;null===b&&a instanceof R&&(b=a);this.path===yt&&null!==b?this.kd=b.isTreePathToChildren?zt:Gt:this.kd=this.path===yt?zt:this.path;if(0<this.network.vertexes.count){this.network.Bq();for(a=this.network.vertexes.iterator;a.next();)b=a.value,b.initialized=!1,b.level=0,b.parent=null,b.children=[];if(0<this.Jb.count){a=\nnew G;for(b=this.Jb.iterator;b.next();){var c=b.value;c instanceof W?(c=this.network.kj(c),null!==c&&a.add(c)):c instanceof Et&&a.add(c)}this.Jb=a}0===this.Jb.count&&this.findRoots();for(a=this.Jb.copy().iterator;a.next();)b=a.value,b.initialized||(b.initialized=!0,Ht(this,b));b=this.network.vertexes;for(a=null;a=It(b),0<a.count;)b=Jt(this,a),null!==b&&this.Jb.add(b),b.initialized=!0,Ht(this,b),b=a;for(a=this.Jb.iterator;a.next();)b=a.value,b instanceof Et&&Kt(this,b);for(a=this.Jb.iterator;a.next();)b=\na.value,b instanceof Et&&Lt(this,b);for(a=this.Jb.iterator;a.next();)b=a.value,b instanceof Et&&Mt(this,b);this.Fv();if(this.layerStyle===Nt){a=[];for(b=this.network.vertexes.iterator;b.next();){c=b.value;var d=c.parent;null===d&&(d=c);d=0===d.angle||180===d.angle;var e=a[c.level];void 0===e&&(e=0);a[c.level]=Math.max(e,d?c.width:c.height)}for(b=0;b<a.length;b++)void 0===a[b]&&(a[b]=0);this.nx=a;for(b=this.network.vertexes.iterator;b.next();)c=b.value,d=c.parent,null===d&&(d=c),0===d.angle||180===\nd.angle?(180===d.angle&&(c.focusX+=a[c.level]-c.width),c.width=a[c.level]):(270===d.angle&&(c.focusY+=a[c.level]-c.height),c.height=a[c.level])}else if(this.layerStyle===Ot)for(a=this.network.vertexes.iterator;a.next();){b=a.value;c=0===b.angle||180===b.angle;d=-1;for(e=0;e<b.children.length;e++){var f=b.children[e];d=Math.max(d,c?f.width:f.height)}if(0<=d)for(e=0;e<b.children.length;e++)f=b.children[e],c?(180===b.angle&&(f.focusX+=d-f.width),f.width=d):(270===b.angle&&(f.focusY+=d-f.height),f.height=\nd)}for(a=this.Jb.iterator;a.next();)b=a.value,b instanceof Et&&this.layoutTree(b);this.arrangeTrees();this.updateParts()}this.network=null;this.Jb=new G;this.isValidLayout=!0};function It(a){var b=new G;for(a=a.iterator;a.next();){var c=a.value;c.initialized||b.add(c)}return b}\nxt.prototype.findRoots=function(){for(var a=this.network.vertexes,b=a.iterator;b.next();){var c=b.value;switch(this.kd){case zt:0===c.sourceEdges.count&&this.Jb.add(c);break;case Gt:0===c.destinationEdges.count&&this.Jb.add(c);break;default:B(\"Unhandled path value \"+this.kd.toString())}}0===this.Jb.count&&(a=Jt(this,a),null!==a&&this.Jb.add(a))};\nfunction Jt(a,b){var c=999999,d=null;for(b=b.iterator;b.next();){var e=b.value;switch(a.kd){case zt:e.sourceEdges.count<c&&(c=e.sourceEdges.count,d=e);break;case Gt:e.destinationEdges.count<c&&(c=e.destinationEdges.count,d=e);break;default:B(\"Unhandled path value \"+a.kd.toString())}}return d}\nfunction Ht(a,b){if(null!==b){switch(a.kd){case zt:if(0<b.destinationEdges.count){for(var c=new E,d=b.destinationVertexes;d.next();){var e=d.value;Pt(a,b,e)&&c.add(e)}0<c.count&&(b.children=c.ma())}break;case Gt:if(0<b.sourceEdges.count){c=new E;for(d=b.sourceVertexes;d.next();)e=d.value,Pt(a,b,e)&&c.add(e);0<c.count&&(b.children=c.ma())}break;default:B(\"Unhandled path value\"+a.kd.toString())}c=b.children;d=c.length;for(e=0;e<d;e++){var f=c[e];f.initialized=!0;f.level=b.level+1;f.parent=b;a.Jb.remove(f)}for(b=\n0;b<d;b++)Ht(a,c[b])}}function Pt(a,b,c){if(c.initialized){if(null===b)var d=!1;else{for(d=b.parent;null!==d&&d!==c;)d=d.parent;d=d===c}if(d||c.level>b.level)return!1;a.removeChild(c.parent,c)}return!0}xt.prototype.removeChild=function(a,b){if(null!==a&&null!==b){for(var c=a.children,d=0,e=0;e<c.length;e++)c[e]===b&&d++;if(0<d){d=Array(c.length-d);for(var f=e=0;f<c.length;f++)c[f]!==b&&(d[e++]=c[f]);a.children=d}}};\nfunction Kt(a,b){if(null!==b){a.initializeTreeVertexValues(b);b.alignment===Qt&&a.sortTreeVertexChildren(b);for(var c=0,d=b.childrenCount,e=0,f=b.children,g=f.length,h=0;h<g;h++){var k=f[h];Kt(a,k);c+=k.descendantCount+1;d=Math.max(d,k.maxChildrenCount);e=Math.max(e,k.maxGenerationCount)}b.descendantCount=c;b.maxChildrenCount=d;b.maxGenerationCount=0<d?e+1:0}}\nfunction Rt(a,b){switch(a.oq){default:case At:return null!==b.parent?b.parent:a.U;case St:return null===b.parent?a.U:null===b.parent.parent?a.V:b.parent;case Tt:return null!==b.parent?null!==b.parent.parent?b.parent.parent:a.V:a.U;case Ut:var c=!0;if(0===b.childrenCount)c=!1;else for(var d=b.children,e=d.length,f=0;f<e;f++)if(0<d[f].childrenCount){c=!1;break}return c&&null!==b.parent?a.V:null!==b.parent?b.parent:a.U}}\nxt.prototype.initializeTreeVertexValues=function(a){a.copyInheritedPropertiesFrom(Rt(this,a));if(null!==a.parent&&a.parent.alignment===Qt){for(var b=a.angle,c=a.parent.children,d=0;d<c.length&&a!==c[d];)d++;0===d%2?d!==c.length-1&&(b=90===b?180:180===b?270:270===b?180:270):b=90===b?0:180===b?90:270===b?0:90;a.angle=b}a.initialized=!0};function Lt(a,b){if(null!==b){a.assignTreeVertexValues(b);b=b.children;for(var c=b.length,d=0;d<c;d++)Lt(a,b[d])}}xt.prototype.assignTreeVertexValues=function(){};\nfunction Mt(a,b){if(null!==b){b.alignment!==Qt&&a.sortTreeVertexChildren(b);b=b.children;for(var c=b.length,d=0;d<c;d++)Mt(a,b[d])}}xt.prototype.sortTreeVertexChildren=function(a){switch(a.sorting){case Vt:break;case Wt:a.children.reverse();break;case Xt:a.children.sort(a.comparer);break;case Yt:a.children.sort(a.comparer);a.children.reverse();break;default:B(\"Unhandled sorting value \"+a.sorting.toString())}};xt.prototype.Fv=function(){if(this.comments)for(var a=this.network.vertexes.iterator;a.next();)this.addComments(a.value)};\nxt.prototype.addComments=function(a){var b=a.angle,c=a.parent,d=0;var e=!1;null!==c&&(d=c.angle,e=c.alignment,e=Zt(e));b=90===b||270===b;d=90===d||270===d;c=0===a.childrenCount;var f=0,g=0,h=0,k=a.commentSpacing;if(null!==a.node)for(var l=a.node.Sv();l.next();){var m=l.value;\"Comment\"===m.category&&m.canLayout()&&(null===a.comments&&(a.comments=[]),a.comments.push(m),m.Ta(),m=m.measuredBounds,b&&!c||!e&&!d&&c||e&&d&&c?(f=Math.max(f,m.width),g+=m.height+Math.abs(h)):(f+=m.width+Math.abs(h),g=Math.max(g,\nm.height)),h=k)}null!==a.comments&&(b&&!c||!e&&!d&&c||e&&d&&c?(f+=Math.abs(a.commentMargin),g=Math.max(0,g-a.height)):(g+=Math.abs(a.commentMargin),f=Math.max(0,f-a.width)),e=N.allocAt(0,0,a.bounds.width+f,a.bounds.height+g),a.bounds=e,N.free(e))};function Zt(a){return a===$t||a===Qt||a===au||a===bu}function cu(a){return a===$t||a===Qt}\nfunction du(a){var b=a.parent;if(null!==b){var c=b.alignment;if(Zt(c)){if(cu(c)){b=b.children;for(c=0;c<b.length&&a!==b[c];)c++;return 0===c%2}if(c===au)return!0}}return!1}\nxt.prototype.layoutComments=function(a){if(null!==a.comments){var b=a.node.measuredBounds,c=a.parent,d=a.angle,e=0;var f=!1;null!==c&&(e=c.angle,f=c.alignment,f=Zt(f));d=90===d||270===d;c=90===e||270===e;for(var g=0===a.childrenCount,h=du(a),k=0,l=a.comments,m=l.length,n=J.alloc(),p=0;p<m;p++){var r=l[p],q=r.measuredBounds;if(d&&!g||!f&&!c&&g||f&&c&&g){if(135<e&&!f||c&&h)if(0<=a.commentMargin)for(n.h(a.bounds.x-a.commentMargin-q.width,a.bounds.y+k),r.move(n),r=r.Hd();r.next();){var u=r.value;u.fromSpot=\ncd;u.toSpot=dd}else for(n.h(a.bounds.x+2*a.focus.x-a.commentMargin,a.bounds.y+k),r.move(n),r=r.Hd();r.next();)u=r.value,u.fromSpot=dd,u.toSpot=cd;else if(0<=a.commentMargin)for(n.h(a.bounds.x+2*a.focus.x+a.commentMargin,a.bounds.y+k),r.move(n),r=r.Hd();r.next();)u=r.value,u.fromSpot=dd,u.toSpot=cd;else for(n.h(a.bounds.x+a.commentMargin-q.width,a.bounds.y+k),r.move(n),r=r.Hd();r.next();)u=r.value,u.fromSpot=cd,u.toSpot=dd;k=0<=a.commentSpacing?k+(q.height+a.commentSpacing):k+(a.commentSpacing-q.height)}else{if(135<\ne&&!f||!c&&h)if(0<=a.commentMargin)for(n.h(a.bounds.x+k,a.bounds.y-a.commentMargin-q.height),r.move(n),r=r.Hd();r.next();)u=r.value,u.fromSpot=bd,u.toSpot=ed;else for(n.h(a.bounds.x+k,a.bounds.y+2*a.focus.y-a.commentMargin),r.move(n),r=r.Hd();r.next();)u=r.value,u.fromSpot=ed,u.toSpot=bd;else if(0<=a.commentMargin)for(n.h(a.bounds.x+k,a.bounds.y+2*a.focus.y+a.commentMargin),r.move(n),r=r.Hd();r.next();)u=r.value,u.fromSpot=ed,u.toSpot=bd;else for(n.h(a.bounds.x+k,a.bounds.y+a.commentMargin-q.height),\nr.move(n),r=r.Hd();r.next();)u=r.value,u.fromSpot=bd,u.toSpot=ed;k=0<=a.commentSpacing?k+(q.width+a.commentSpacing):k+(a.commentSpacing-q.width)}}J.free(n);b=k-a.commentSpacing-(d?b.height:b.width);if(this.kd===zt)for(a=a.destinationEdges;a.next();)e=a.value.link,null===e||e.isAvoiding||(e.fromEndSegmentLength=0<b?b:NaN);else for(a=a.sourceEdges;a.next();)e=a.value.link,null===e||e.isAvoiding||(e.toEndSegmentLength=0<b?b:NaN)}};\nxt.prototype.layoutTree=function(a){if(null!==a){for(var b=a.children,c=b.length,d=0;d<c;d++)this.layoutTree(b[d]);switch(a.compaction){case ju:ku(this,a);break;case lu:if(a.alignment===Qt)ku(this,a);else if(0===a.childrenCount)d=a.parent,c=!1,b=0,null!==d&&(b=d.angle,c=d.alignment,c=Zt(c)),d=du(a),a.S.h(0,0),a.ua.h(a.width,a.height),null===a.parent||null===a.comments||(180!==b&&270!==b||c)&&!d?a.fa.h(0,0):180===b&&!c||(90===b||270===b)&&d?a.fa.h(a.width-2*a.focus.x,0):a.fa.h(0,a.height-2*a.focus.y),\na.Pq=null,a.br=null;else{var e=mu(a);b=90===e||270===e;var f=0,g=a.children,h=g.length;for(c=0;c<h;c++)d=g[c],f=Math.max(f,b?d.ua.width:d.ua.height);var k=a.alignment,l=k===nu,m=Zt(k),n=Math.max(0,a.breadthLimit);c=ou(a);var p=a.nodeSpacing,r=pu(a),q=a.rowSpacing,u=0;if(k===qu||l||a.Sm||a.Tm&&1===a.maxGenerationCount)u=Math.max(0,a.rowIndent);d=a.width;var w=a.height,v=0,y=0,z=0,A=null,C=null,F=0,Q=0,K=0,T=0,P=0,I=0,ja=0,ba=0;m&&!cu(k)&&135<e&&g.reverse();if(cu(k))if(1<h)for(var qa=0;qa<h;qa++)0===\nqa%2&&qa!==h-1&&(ba=Math.max(ba,b?g[qa].ua.width:g[qa].ua.height));else 1===h&&(ba=b?g[0].ua.width:g[0].ua.height);if(m){switch(k){case $t:y=135>e?ru(a,g,ba,v,y):su(a,g,ba,v,y);ba=y.x;v=y.width;y=y.height;break;case au:for(A=0;A<h;A++)C=g[A],n=C.ua,z=0===I?0:q,b?(C.S.h(f-n.width,T+z),v=Math.max(v,n.width),y=Math.max(y,T+z+n.height),T+=z+n.height):(C.S.h(K+z,f-n.height),v=Math.max(v,K+z+n.width),y=Math.max(y,n.height),K+=z+n.width),I++;break;case bu:for(A=0;A<h;A++)C=g[A],f=C.ua,n=0===I?0:q,b?(C.S.h(p/\n2+a.focus.x,T+n),v=Math.max(v,f.width),y=Math.max(y,T+n+f.height),T+=n+f.height):(C.S.h(K+n,p/2+a.focus.y),v=Math.max(v,K+n+f.width),y=Math.max(y,f.height),K+=n+f.width),I++}A=tu(this,2);C=tu(this,2);b?(A[0].h(0,0),A[1].h(0,y),C[0].h(v,0)):(A[0].h(0,0),A[1].h(v,0),C[0].h(0,y));C[1].h(v,y)}else for(qa=0;qa<h;qa++){var Ma=g[qa],eb=Ma.ua;if(b){0<n&&0<I&&K+p+eb.width>n&&(K<f&&uu(a,k,f-K,0,ja,qa-1),P++,I=0,ja=qa,z=y,K=0,T=135<e?-y-q:y+q);vu(this,Ma,0,T);var Ga=0;if(0===I){if(A=Ma.Pq,C=Ma.br,F=eb.width,\nQ=eb.height,null===A||null===C||e!==mu(Ma))A=tu(this,2),C=tu(this,2),A[0].h(0,0),A[1].h(0,Q),C[0].h(F,0),C[1].h(F,Q)}else{var Ha=Ea();Q=wu(this,a,Ma,A,C,F,Q,Ha);Ga=Q.x;A=Ha[0];C=Ha[1];F=Q.width;Q=Q.height;Ia(Ha);K<eb.width&&0>Ga&&(xu(a,-Ga,0,ja,qa-1),yu(A,-Ga,0),yu(C,-Ga,0),Ga=0)}Ma.S.h(Ga,T);v=Math.max(v,F);y=Math.max(y,z+(0===P?0:q)+eb.height);K=F}else{0<n&&0<I&&T+p+eb.height>n&&(T<f&&uu(a,k,0,f-T,ja,qa-1),P++,I=0,ja=qa,z=v,T=0,K=135<e?-v-q:v+q);vu(this,Ma,K,0);Ga=0;if(0===I){if(A=Ma.Pq,C=Ma.br,\nF=eb.width,Q=eb.height,null===A||null===C||e!==mu(Ma))A=tu(this,2),C=tu(this,2),A[0].h(0,0),A[1].h(F,0),C[0].h(0,Q),C[1].h(F,Q)}else Ha=Ea(),Q=wu(this,a,Ma,A,C,F,Q,Ha),Ga=Q.x,A=Ha[0],C=Ha[1],F=Q.width,Q=Q.height,Ia(Ha),T<eb.height&&0>Ga&&(xu(a,0,-Ga,ja,qa-1),yu(A,0,-Ga),yu(C,0,-Ga),Ga=0);Ma.S.h(K,Ga);y=Math.max(y,Q);v=Math.max(v,z+(0===P?0:q)+eb.width);T=Q}I++}0<P&&(b?(y+=Math.max(0,c),K<v&&uu(a,k,v-K,0,ja,h-1),0<u&&(l||xu(a,u,0,0,h-1),v+=u)):(v+=Math.max(0,c),T<y&&uu(a,k,0,y-T,ja,h-1),0<u&&(l||xu(a,\n0,u,0,h-1),y+=u)));u=l=0;switch(k){case zu:b?l+=v/2-a.focus.x-r/2:u+=y/2-a.focus.y-r/2;break;case Au:0<P?b?l+=v/2-a.focus.x-r/2:u+=y/2-a.focus.y-r/2:b?(ba=g[0].S.x+g[0].fa.x,l+=ba+(g[h-1].S.x+g[h-1].fa.x+2*g[h-1].focus.x-ba)/2-a.focus.x-r/2):(ba=g[0].S.y+g[0].fa.y,u+=ba+(g[h-1].S.y+g[h-1].fa.y+2*g[h-1].focus.y-ba)/2-a.focus.y-r/2);break;case qu:b?(l-=r,v+=r):(u-=r,y+=r);break;case nu:b?(l+=v-a.width+r,v+=r):(u+=y-a.height+r,y+=r);break;case $t:b?1<h?l+=ba+p/2-a.focus.x:l+=g[0].focus.x-a.focus.x+g[0].fa.x:\n1<h?u+=ba+p/2-a.focus.y:u+=g[0].focus.y-a.focus.y+g[0].fa.y;break;case au:b?l+=v+p/2-a.focus.x:u+=y+p/2-a.focus.y;break;case bu:break;default:B(\"Unhandled alignment value \"+k.toString())}for(r=0;r<h;r++)ba=g[r],b?ba.S.h(ba.S.x+ba.fa.x-l,ba.S.y+(135<e?(m?-y:-ba.ua.height)+ba.fa.y-c:w+c+ba.fa.y)):ba.S.h(ba.S.x+(135<e?(m?-v:-ba.ua.width)+ba.fa.x-c:d+c+ba.fa.x),ba.S.y+ba.fa.y-u);h=g=0;m?b?(v=Bu(a,v,l),0>l&&(l=0),135<e&&(u+=y+c),y+=w+c,k===bu&&(g+=p/2+a.focus.x),h+=w+c):(135<e&&(l+=v+c),v+=d+c,y=Cu(a,\ny,u),0>u&&(u=0),k===bu&&(h+=p/2+a.focus.y),g+=d+c):b?(null===a.comments?d>v&&(v=Du(k,d-v,0),g=v.x,h=v.y,v=d,l=0):v=Bu(a,v,l),0>l&&(g-=l,l=0),135<e&&(u+=y+c),y=Math.max(Math.max(y,w),y+w+c),h+=w+c):(135<e&&(l+=v+c),v=Math.max(Math.max(v,d),v+d+c),null===a.comments?w>y&&(y=Du(k,0,w-y),g=y.x,h=y.y,y=w,u=0):y=Cu(a,y,u),0>u&&(h-=u,u=0),g+=d+c);if(0<P)e=tu(this,4),P=tu(this,4),b?(e[2].h(0,w+c),e[3].h(e[2].x,y),P[2].h(v,e[2].y),P[3].h(P[2].x,e[3].y)):(e[2].h(d+c,0),e[3].h(v,e[2].y),P[2].h(e[2].x,y),P[3].h(e[3].x,\nP[2].y));else{e=tu(this,A.length+2);P=tu(this,C.length+2);for(k=0;k<A.length;k++)m=A[k],e[k+2].h(m.x+g,m.y+h);for(k=0;k<C.length;k++)m=C[k],P[k+2].h(m.x+g,m.y+h)}b?(e[0].h(l,0),e[1].h(e[0].x,w),e[2].y<e[1].y&&(e[2].x>e[0].x?e[2].assign(e[1]):e[1].assign(e[2])),e[3].y<e[2].y&&(e[3].x>e[0].x?e[3].assign(e[2]):e[2].assign(e[3])),P[0].h(l+d,0),P[1].h(P[0].x,w),P[2].y<P[1].y&&(P[2].x<P[0].x?P[2].assign(P[1]):P[1].assign(P[2])),P[3].y<P[2].y&&(P[3].x<P[0].x?P[3].assign(P[2]):P[2].assign(P[3])),e[2].y-=\nc/2,P[2].y-=c/2):(e[0].h(0,u),e[1].h(d,e[0].y),e[2].x<e[1].x&&(e[2].y>e[0].y?e[2].assign(e[1]):e[1].assign(e[2])),e[3].x<e[2].x&&(e[3].y>e[0].y?e[3].assign(e[2]):e[2].assign(e[3])),P[0].h(0,u+w),P[1].h(d,P[0].y),P[2].x<P[1].x&&(P[2].y<P[0].y?P[2].assign(P[1]):P[1].assign(P[2])),P[3].x<P[2].x&&(P[3].y<P[0].y?P[3].assign(P[2]):P[2].assign(P[3])),e[2].x-=c/2,P[2].x-=c/2);Eu(this,A);Eu(this,C);a.Pq=e;a.br=P;a.fa.h(l,u);a.ua.h(v,y)}break;default:B(\"Unhandled compaction value \"+a.compaction.toString())}}};\nfunction ku(a,b){if(0===b.childrenCount){var c=!1,d=0;null!==b.parent&&(d=b.parent.angle,c=b.parent.alignment,c=Zt(c));var e=du(b);b.S.h(0,0);b.ua.h(b.width,b.height);null===b.parent||null===b.comments||(180!==d&&270!==d||c)&&!e?b.fa.h(0,0):180===d&&!c||(90===d||270===d)&&e?b.fa.h(b.width-2*b.focus.x,0):b.fa.h(0,b.height-2*b.focus.y)}else{d=mu(b);c=90===d||270===d;var f=0;e=b.children;for(var g=e.length,h=0;h<g;h++){var k=e[h];f=Math.max(f,c?k.ua.width:k.ua.height)}var l=b.alignment,m=l===qu,n=l===\nnu;h=Zt(l);var p=Math.max(0,b.breadthLimit);k=ou(b);var r=b.nodeSpacing,q=pu(b),u=m||n?0:q/2,w=b.rowSpacing,v=0;if(m||n||b.Sm||b.Tm&&1===b.maxGenerationCount)v=Math.max(0,b.rowIndent);m=b.width;var y=b.height,z=0,A=0,C=0,F=0,Q=0,K=0,T=0,P=0,I=0;h&&!cu(l)&&135<d&&e.reverse();if(cu(l))if(1<g)for(var ja=0;ja<g;ja++){var ba=e[ja],qa=ba.ua;0===ja%2&&ja!==g-1&&(I=Math.max(I,(c?qa.width:qa.height)+Fu(ba)-r))}else 1===g&&(I=c?e[0].ua.width:e[0].ua.height);if(h)switch(l){case $t:case Qt:A=135>d?ru(b,e,I,z,\nA):su(b,e,I,z,A);I=A.x;z=A.width;A=A.height;break;case au:for(a=0;a<g;a++)p=e[a],u=p.ua,C=0===T?0:w,c?(p.S.h(f-u.width,Q+C),z=Math.max(z,u.width),A=Math.max(A,Q+C+u.height),Q+=C+u.height):(p.S.h(F+C,f-u.height),z=Math.max(z,F+C+u.width),A=Math.max(A,u.height),F+=C+u.width),T++;break;case bu:for(f=0;f<g;f++)a=e[f],p=a.ua,u=0===T?0:w,c?(a.S.h(r/2+b.focus.x,Q+u),z=Math.max(z,p.width),A=Math.max(A,Q+u+p.height),Q+=u+p.height):(a.S.h(F+u,r/2+b.focus.y),z=Math.max(z,F+u+p.width),A=Math.max(A,p.height),\nF+=u+p.width),T++}else for(ja=0;ja<g;ja++){ba=e[ja];qa=ba.ua;if(c){0<p&&0<T&&F+r+qa.width>p&&(F<f&&uu(b,l,f-F,0,P,ja-1),K++,T=0,P=ja,C=A,F=0,Q=135<d?-A-w:A+w);var Ma=0===T?u:r;vu(a,ba,0,Q);ba.S.h(F+Ma,Q);z=Math.max(z,F+Ma+qa.width);A=Math.max(A,C+(0===K?0:w)+qa.height);F+=Ma+qa.width}else 0<p&&0<T&&Q+r+qa.height>p&&(Q<f&&uu(b,l,0,f-Q,P,ja-1),K++,T=0,P=ja,C=z,Q=0,F=135<d?-z-w:z+w),Ma=0===T?u:r,vu(a,ba,F,0),ba.S.h(F,Q+Ma),A=Math.max(A,Q+Ma+qa.height),z=Math.max(z,C+(0===K?0:w)+qa.width),Q+=Ma+qa.height;\nT++}0<K&&(c?(A+=Math.max(0,k),F<z&&uu(b,l,z-F,0,P,g-1),0<v&&(n||xu(b,v,0,0,g-1),z+=v)):(z+=Math.max(0,k),Q<A&&uu(b,l,0,A-Q,P,g-1),0<v&&(n||xu(b,0,v,0,g-1),A+=v)));v=n=0;switch(l){case zu:c?n+=z/2-b.focus.x-q/2:v+=A/2-b.focus.y-q/2;break;case Au:0<K?c?n+=z/2-b.focus.x-q/2:v+=A/2-b.focus.y-q/2:c?(l=e[0].S.x+e[0].fa.x,n+=l+(e[g-1].S.x+e[g-1].fa.x+2*e[g-1].focus.x-l)/2-b.focus.x-q/2):(l=e[0].S.y+e[0].fa.y,v+=l+(e[g-1].S.y+e[g-1].fa.y+2*e[g-1].focus.y-l)/2-b.focus.y-q/2);break;case qu:c?(n-=q,z+=q):(v-=\nq,A+=q);break;case nu:c?(n+=z-b.width+q,z+=q):(v+=A-b.height+q,A+=q);break;case $t:case Qt:c?1<g?n+=I+r/2-b.focus.x:n+=e[0].focus.x-b.focus.x+e[0].fa.x:1<g?v+=I+r/2-b.focus.y:v+=e[0].focus.y-b.focus.y+e[0].fa.y;break;case au:c?n+=z+r/2-b.focus.x:v+=A+r/2-b.focus.y;break;case bu:break;default:B(\"Unhandled alignment value \"+l.toString())}for(q=0;q<g;q++)l=e[q],c?l.S.h(l.S.x+l.fa.x-n,l.S.y+(135<d?(h?-A:-l.ua.height)+l.fa.y-k:y+k+l.fa.y)):l.S.h(l.S.x+(135<d?(h?-z:-l.ua.width)+l.fa.x-k:m+k+l.fa.x),l.S.y+\nl.fa.y-v);c?(z=Bu(b,z,n),0>n&&(n=0),135<d&&(v+=A+k),A=Math.max(Math.max(A,y),A+y+k)):(135<d&&(n+=z+k),z=Math.max(Math.max(z,m),z+m+k),A=Cu(b,A,v),0>v&&(v=0));b.fa.h(n,v);b.ua.h(z,A)}}\nfunction ru(a,b,c,d,e){var f=b.length;if(0===f)return new N(c,0,d,e);if(1===f)return a=b[0],d=a.ua.width,e=a.ua.height,new N(c,0,d,e);for(var g=a.nodeSpacing,h=a.rowSpacing,k=90===mu(a),l=0,m=0,n=0,p=0;p<f;p++)if(!(0!==p%2||1<f&&p===f-1)){var r=b[p],q=r.ua,u=0===l?0:h;if(k){var w=Fu(r)-g;r.S.h(c-(q.width+w),n+u);d=Math.max(d,q.width+w);e=Math.max(e,n+u+q.height);n+=u+q.height}else w=Fu(r)-g,r.S.h(m+u,c-(q.height+w)),e=Math.max(e,q.height+w),d=Math.max(d,m+u+q.width),m+=u+q.width;l++}l=0;r=m;p=n;k?\n(m=c+g,n=0):(m=0,n=c+g);for(q=0;q<f;q++)if(0!==q%2){u=b[q];w=u.ua;var v=0===l?0:h;if(k){var y=Fu(u)-g;u.S.h(m+y,n+v);d=Math.max(d,m+w.width+y);e=Math.max(e,n+v+w.height);n+=v+w.height}else y=Fu(u)-g,u.S.h(m+v,n+y),d=Math.max(d,m+v+w.width),e=Math.max(e,n+w.height+y),m+=v+w.width;l++}1<f&&1===f%2&&(b=b[f-1],f=b.ua,h=null===b.parent?0:b.parent.rowSpacing,k?(b.S.h(c+g/2-b.focus.x-b.fa.x,e+h),k=c+g/2-b.focus.x-b.fa.x,d=Math.max(d,k+f.width),0>k&&(d-=k),e=Math.max(e,Math.max(p,n)+h+f.height),0>b.S.x&&\n(c=Gu(a,b.S.x,!1,c,g))):(b.S.h(d+h,c+g/2-b.focus.y-b.fa.y),d=Math.max(d,Math.max(r,m)+h+f.width),n=c+g/2-b.focus.y-b.fa.y,e=Math.max(e,n+f.height),0>n&&(e-=n),0>b.S.y&&(c=Gu(a,b.S.y,!0,c,g))));return new N(c,0,d,e)}\nfunction su(a,b,c,d,e){var f=b.length;if(0===f)return new N(c,0,d,e);if(1===f)return b=b[0],d=b.ua.width,e=b.ua.height,new N(c,0,d,e);for(var g=a.nodeSpacing,h=a.rowSpacing,k=270===mu(a),l=0,m=0,n=0,p=0;p<f;p++)if(!(0!==p%2||1<f&&p===f-1)){var r=b[p],q=r.ua,u=0===l?0:h;if(k){var w=Fu(r)-g;n-=u+q.height;r.S.h(c-(q.width+w),n);d=Math.max(d,q.width+w);e=Math.max(e,Math.abs(n))}else w=Fu(r)-g,m-=u+q.width,r.S.h(m,c-(q.height+w)),e=Math.max(e,q.height+w),d=Math.max(d,Math.abs(m));l++}l=0;r=m;p=n;k?(m=\nc+g,n=0):(m=0,n=c+g);for(q=0;q<f;q++)if(0!==q%2){u=b[q];w=u.ua;var v=0===l?0:h;if(k){var y=Fu(u)-g;n-=v+w.height;u.S.h(m+y,n);d=Math.max(d,m+w.width+y);e=Math.max(e,Math.abs(n))}else y=Fu(u)-g,m-=v+w.width,u.S.h(m,n+y),e=Math.max(e,n+w.height+y),d=Math.max(d,Math.abs(m));l++}1<f&&1===f%2&&(h=b[f-1],l=h.ua,q=null===h.parent?0:h.parent.rowSpacing,k?(h.S.h(c+g/2-h.focus.x-h.fa.x,-e-l.height-q),m=c+g/2-h.focus.x-h.fa.x,d=Math.max(d,m+l.width),0>m&&(d-=m),e=Math.max(e,Math.abs(Math.min(p,n))+q+l.height),\n0>h.S.x&&(c=Gu(a,h.S.x,!1,c,g))):(h.S.h(-d-l.width-q,c+g/2-h.focus.y-h.fa.y),d=Math.max(d,Math.abs(Math.min(r,m))+q+l.width),n=c+g/2-h.focus.y-h.fa.y,e=Math.max(e,n+l.height),0>n&&(e-=n),0>h.S.y&&(c=Gu(a,h.S.y,!0,c,g))));for(a=0;a<f;a++)g=b[a],k?g.S.h(g.S.x,g.S.y+e):g.S.h(g.S.x+d,g.S.y);return new N(c,0,d,e)}function Fu(a){return null===a.parent?0:a.parent.nodeSpacing}\nfunction Gu(a,b,c,d,e){a=a.children;for(var f=a.length,g=0;g<f;g++)c?a[g].S.h(a[g].S.x,a[g].S.y-b):a[g].S.h(a[g].S.x-b,a[g].S.y);b=a[f-1];return Math.max(d,c?b.fa.y+b.focus.y-e/2:b.fa.x+b.focus.x-e/2)}\nfunction Bu(a,b,c){switch(a.alignment){case Au:case zu:return c+a.width>b&&(b=c+a.width),0>c&&(b-=c),b;case qu:return a.width>b?a.width:b;case nu:return 2*a.focus.x>b?a.width:b+a.width-2*a.focus.x;case $t:case Qt:return Math.max(a.width,Math.max(b,c+a.width)-Math.min(0,c));case au:return a.width-a.focus.x+a.nodeSpacing/2+b;case bu:return Math.max(a.width,a.focus.x+a.nodeSpacing/2+b);default:return b}}\nfunction Cu(a,b,c){switch(a.alignment){case Au:case zu:return c+a.height>b&&(b=c+a.height),0>c&&(b-=c),b;case qu:return a.height>b?a.height:b;case nu:return 2*a.focus.y>b?a.height:b+a.height-2*a.focus.y;case $t:case Qt:return Math.max(a.height,Math.max(b,c+a.height)-Math.min(0,c));case au:return a.height-a.focus.y+a.nodeSpacing/2+b;case bu:return Math.max(a.height,a.focus.y+a.nodeSpacing/2+b);default:return b}}\nfunction Du(a,b,c){switch(a){case zu:b/=2;c/=2;break;case Au:b/=2;c/=2;break;case qu:c=b=0;break;case nu:break;default:B(\"Unhandled alignment value \"+a.toString())}return new J(b,c)}function uu(a,b,c,d,e,f){b=Du(b,c,d);xu(a,b.x,b.y,e,f)}function xu(a,b,c,d,e){if(0!==b||0!==c)for(a=a.children;d<=e;d++){var f=a[d].S;f.x+=b;f.y+=c}}\nfunction vu(a,b,c,d){var e=b.parent;switch(a.kd){case zt:for(a=b.sourceEdges;a.next();)b=a.value,b.fromVertex===e&&b.relativePoint.h(c,d);break;case Gt:for(a=b.destinationEdges;a.next();)b=a.value,b.toVertex===e&&b.relativePoint.h(c,d);break;default:B(\"Unhandled path value \"+a.kd.toString())}}function yu(a,b,c){for(var d=0;d<a.length;d++){var e=a[d];e.x+=b;e.y+=c}}\nfunction wu(a,b,c,d,e,f,g,h){var k=mu(b),l=90===k||270===k,m=b.nodeSpacing;b=d;var n=e;d=f;var p=g,r=c.Pq,q=c.br;g=c.ua;var u=l?Math.max(p,g.height):Math.max(d,g.width);if(null===r||k!==mu(c))r=tu(a,2),q=tu(a,2),l?(r[0].h(0,0),r[1].h(0,g.height),q[0].h(g.width,0),q[1].h(q[0].x,r[1].y)):(r[0].h(0,0),r[1].h(g.width,0),q[0].h(0,g.height),q[1].h(r[1].x,q[0].y));if(l){p=9999999;if(!(null===n||2>n.length||null===r||2>r.length))for(e=c=0;c<n.length&&e<r.length;){f=n[c];var w=r[e];k=w.x;l=w.y;k+=d;var v=\nf;c+1<n.length&&(v=n[c+1]);var y=w;w=y.x;y=y.y;e+1<r.length&&(y=r[e+1],w=y.x,y=y.y,w+=d);var z=p;f.y===l?z=k-f.x:f.y>l&&f.y<y?z=k+(f.y-l)/(y-l)*(w-k)-f.x:l>f.y&&l<v.y&&(z=k-(f.x+(l-f.y)/(v.y-f.y)*(v.x-f.x)));z<p&&(p=z);v.y<=f.y?c++:y<=l?e++:(v.y<=y&&c++,y<=v.y&&e++)}p=d-p;p+=m;c=r;e=p;if(null===b||2>b.length||null===c||2>c.length)d=null;else{m=tu(a,b.length+c.length);for(d=f=k=0;f<c.length&&c[f].y<b[0].y;)l=c[f++],m[d++].h(l.x+e,l.y);for(;k<b.length;)l=b[k++],m[d++].h(l.x,l.y);for(k=b[b.length-1].y;f<\nc.length&&c[f].y<=k;)f++;for(;f<c.length&&c[f].y>k;)l=c[f++],m[d++].h(l.x+e,l.y);c=tu(a,d);for(k=0;k<d;k++)c[k].assign(m[k]);Eu(a,m);d=c}f=q;k=p;if(null===n||2>n.length||null===f||2>f.length)e=null;else{m=tu(a,n.length+f.length);for(e=l=c=0;c<n.length&&n[c].y<f[0].y;)v=n[c++],m[e++].h(v.x,v.y);for(;l<f.length;)v=f[l++],m[e++].h(v.x+k,v.y);for(f=f[f.length-1].y;c<n.length&&n[c].y<=f;)c++;for(;c<n.length&&n[c].y>f;)k=n[c++],m[e++].h(k.x,k.y);f=tu(a,e);for(c=0;c<e;c++)f[c].assign(m[c]);Eu(a,m);e=f}f=\nMath.max(0,p)+g.width;g=u;Eu(a,b);Eu(a,r);Eu(a,n);Eu(a,q);h[0]=d;h[1]=e;return new N(p,0,f,g)}d=9999999;if(!(null===n||2>n.length||null===r||2>r.length))for(e=c=0;c<n.length&&e<r.length;)f=n[c],w=r[e],k=w.x,l=w.y,l+=p,v=f,c+1<n.length&&(v=n[c+1]),y=w,w=y.x,y=y.y,e+1<r.length&&(y=r[e+1],w=y.x,y=y.y,y+=p),z=d,f.x===k?z=l-f.y:f.x>k&&f.x<w?z=l+(f.x-k)/(w-k)*(y-l)-f.y:k>f.x&&k<v.x&&(z=l-(f.y+(k-f.x)/(v.x-f.x)*(v.y-f.y))),z<d&&(d=z),v.x<=f.x?c++:w<=k?e++:(v.x<=w&&c++,w<=v.x&&e++);p-=d;p+=m;c=r;e=p;if(null===\nb||2>b.length||null===c||2>c.length)d=null;else{m=tu(a,b.length+c.length);for(d=f=k=0;f<c.length&&c[f].x<b[0].x;)l=c[f++],m[d++].h(l.x,l.y+e);for(;k<b.length;)l=b[k++],m[d++].h(l.x,l.y);for(k=b[b.length-1].x;f<c.length&&c[f].x<=k;)f++;for(;f<c.length&&c[f].x>k;)l=c[f++],m[d++].h(l.x,l.y+e);c=tu(a,d);for(k=0;k<d;k++)c[k].assign(m[k]);Eu(a,m);d=c}f=q;k=p;if(null===n||2>n.length||null===f||2>f.length)e=null;else{m=tu(a,n.length+f.length);for(e=l=c=0;c<n.length&&n[c].x<f[0].x;)v=n[c++],m[e++].h(v.x,v.y);\nfor(;l<f.length;)v=f[l++],m[e++].h(v.x,v.y+k);for(f=f[f.length-1].x;c<n.length&&n[c].x<=f;)c++;for(;c<n.length&&n[c].x>f;)k=n[c++],m[e++].h(k.x,k.y);f=tu(a,e);for(c=0;c<e;c++)f[c].assign(m[c]);Eu(a,m);e=f}f=u;g=Math.max(0,p)+g.height;Eu(a,b);Eu(a,r);Eu(a,n);Eu(a,q);h[0]=d;h[1]=e;return new N(p,0,f,g)}function tu(a,b){a=a.uv[b];if(void 0!==a&&(a=a.pop(),void 0!==a))return a;a=[];for(var c=0;c<b;c++)a[c]=new J;return a}\nfunction Eu(a,b){var c=b.length,d=a.uv[c];void 0===d&&(d=[],a.uv[c]=d);d.push(b)}\nxt.prototype.arrangeTrees=function(){if(this.Eb===Ft)for(var a=this.Jb.iterator;a.next();){var b=a.value;if(b instanceof Et){var c=b.node;if(null!==c){var d=c.position;c=d.x;d=d.y;isFinite(c)||(c=0);isFinite(d)||(d=0);Hu(this,b,c,d)}}}else{a=[];for(b=this.Jb.iterator;b.next();)c=b.value,c instanceof Et&&a.push(c);switch(this.sorting){case Vt:break;case Wt:a.reverse();break;case Xt:a.sort(this.comparer);break;case Yt:a.sort(this.comparer);a.reverse();break;default:B(\"Unhandled sorting value \"+this.sorting.toString())}c=\nthis.arrangementOrigin;b=c.x;c=c.y;for(d=0;d<a.length;d++){var e=a[d];Hu(this,e,b+e.fa.x,c+e.fa.y);switch(this.Eb){case Ct:c+=e.ua.height+this.Pd.height;break;case Iu:b+=e.ua.width+this.Pd.width;break;default:B(\"Unhandled arrangement value \"+this.Eb.toString())}}}};function Hu(a,b,c,d){if(null!==b){b.x=c;b.y=d;b=b.children;for(var e=b.length,f=0;f<e;f++){var g=b[f];Hu(a,g,c+g.S.x,d+g.S.y)}}}xt.prototype.commitLayout=function(){this.Dw();this.commitNodes();this.Iv();this.isRouting&&this.commitLinks()};\nxt.prototype.commitNodes=function(){for(var a=this.network.vertexes.iterator;a.next();)a.value.commit();for(a.reset();a.next();)this.layoutComments(a.value)};\nxt.prototype.Iv=function(){if(this.layerStyle===Nt){for(var a=this.nx,b=[],c=null,d=this.network.vertexes.iterator;d.next();){var e=d.value;null===c?c=e.bounds.copy():c.Rc(e.bounds);var f=b[e.level];void 0===f?f=ou(e):f=Math.max(f,ou(e));b[e.level]=f}for(d=0;d<b.length;d++)void 0===b[d]&&(b[d]=0);90===this.angle||270===this.angle?(c.Jc(this.nodeSpacing/2,this.layerSpacing),d=new J(-this.nodeSpacing/2,-this.layerSpacing/2)):(c.Jc(this.layerSpacing,this.nodeSpacing/2),d=new J(-this.layerSpacing/2,-this.nodeSpacing/\n2));e=[];c=90===this.angle||270===this.angle?c.width:c.height;f=0;if(180===this.angle||270===this.angle)for(var g=0;g<a.length;g++)f+=a[g]+b[g];for(g=0;g<a.length;g++){var h=a[g]+b[g];270===this.angle?(f-=h,e.push(new N(0,f,c,h))):90===this.angle?(e.push(new N(0,f,c,h)),f+=h):180===this.angle?(f-=h,e.push(new N(f,0,h,c))):(e.push(new N(f,0,h,c)),f+=h)}this.commitLayers(e,d)}};xt.prototype.commitLayers=function(){};xt.prototype.commitLinks=function(){for(var a=this.network.edges.iterator;a.next();)a.value.commit()};\nxt.prototype.Dw=function(){for(var a=this.Jb.iterator;a.next();){var b=a.value;b instanceof Et&&Ju(this,b)}};function Ju(a,b){if(null!==b){a.setPortSpots(b);b=b.children;for(var c=b.length,d=0;d<c;d++)Ju(a,b[d])}}\nxt.prototype.setPortSpots=function(a){var b=a.alignment;if(Zt(b)){var c=this.kd===zt,d=mu(a);switch(d){case 0:var e=dd;break;case 90:e=ed;break;case 180:e=cd;break;default:e=bd}var f=a.children,g=f.length;switch(b){case $t:case Qt:for(b=0;b<g;b++){var h=f[b];h=(c?h.sourceEdges:h.destinationEdges).first();if(null!==h&&(h=h.link,null!==h)){var k=90===d||270===d?cd:bd;if(1===g||b===g-1&&1===g%2)switch(d){case 0:k=cd;break;case 90:k=bd;break;case 180:k=dd;break;default:k=ed}else 0===b%2&&(k=90===d||270===\nd?dd:ed);c?(a.setsPortSpot&&(h.fromSpot=e),a.setsChildPortSpot&&(h.toSpot=k)):(a.setsPortSpot&&(h.fromSpot=k),a.setsChildPortSpot&&(h.toSpot=e))}}break;case au:d=90===d||270===d?dd:ed;for(f=c?a.destinationEdges:a.sourceEdges;f.next();)g=f.value.link,null!==g&&(c?(a.setsPortSpot&&(g.fromSpot=e),a.setsChildPortSpot&&(g.toSpot=d)):(a.setsPortSpot&&(g.fromSpot=d),a.setsChildPortSpot&&(g.toSpot=e)));break;case bu:for(d=90===d||270===d?cd:bd,f=c?a.destinationEdges:a.sourceEdges;f.next();)g=f.value.link,\nnull!==g&&(c?(a.setsPortSpot&&(g.fromSpot=e),a.setsChildPortSpot&&(g.toSpot=d)):(a.setsPortSpot&&(g.fromSpot=d),a.setsChildPortSpot&&(g.toSpot=e)))}}else if(c=mu(a),this.kd===zt)for(e=a.destinationEdges;e.next();){if(d=e.value.link,null!==d){if(a.setsPortSpot)if(a.portSpot.Mb())switch(c){case 0:d.fromSpot=dd;break;case 90:d.fromSpot=ed;break;case 180:d.fromSpot=cd;break;default:d.fromSpot=bd}else d.fromSpot=a.portSpot;if(a.setsChildPortSpot)if(a.childPortSpot.Mb())switch(c){case 0:d.toSpot=cd;break;\ncase 90:d.toSpot=bd;break;case 180:d.toSpot=dd;break;default:d.toSpot=ed}else d.toSpot=a.childPortSpot}}else for(e=a.sourceEdges;e.next();)if(d=e.value.link,null!==d){if(a.setsPortSpot)if(a.portSpot.Mb())switch(c){case 0:d.toSpot=dd;break;case 90:d.toSpot=ed;break;case 180:d.toSpot=cd;break;default:d.toSpot=bd}else d.toSpot=a.portSpot;if(a.setsChildPortSpot)if(a.childPortSpot.Mb())switch(c){case 0:d.fromSpot=cd;break;case 90:d.fromSpot=bd;break;case 180:d.fromSpot=dd;break;default:d.fromSpot=ed}else d.fromSpot=\na.childPortSpot}};function mu(a){a=a.angle;return 45>=a?0:135>=a?90:225>=a?180:315>=a?270:0}function ou(a){var b=mu(a);b=90===b||270===b;var c=a.layerSpacing;if(0<a.layerSpacingParentOverlap){var d=Math.min(1,a.layerSpacingParentOverlap);c-=b?a.height*d:a.width*d}c<(b?-a.height:-a.width)&&(c=b?-a.height:-a.width);return c}function pu(a){var b=mu(a),c=a.nodeIndent;if(0<a.nodeIndentPastParent){var d=Math.min(1,a.nodeIndentPastParent);c+=90===b||270===b?a.width*d:a.height*d}return c=Math.max(0,c)}\nna.Object.defineProperties(xt.prototype,{roots:{get:function(){return this.Jb},set:function(a){this.Jb!==a&&(this.Jb=a,this.B())}},path:{get:function(){return this.vp},set:function(a){this.vp!==a&&(this.vp=a,this.B())}},treeStyle:{get:function(){return this.oq},set:function(a){this.Eb===a||a!==At&&a!==Tt&&a!==Ut&&a!==St||(this.oq=a,this.B())}},layerStyle:{get:function(){return this.ts},\nset:function(a){this.Eb===a||a!==Bt&&a!==Ot&&a!==Nt||(this.ts=a,this.B())}},comments:{get:function(){return this.jd},set:function(a){this.jd!==a&&(this.jd=a,this.B())}},arrangement:{get:function(){return this.Eb},set:function(a){this.Eb===a||a!==Ct&&a!==Iu&&a!==Ft||(this.Eb=a,this.B())}},arrangementSpacing:{get:function(){return this.Pd},set:function(a){this.Pd.w(a)||(this.Pd.assign(a),this.B())}},rootDefaults:{\nget:function(){return this.U},set:function(a){this.U!==a&&(this.U=a,this.B())}},alternateDefaults:{get:function(){return this.V},set:function(a){this.V!==a&&(this.V=a,this.B())}},sorting:{get:function(){return this.U.sorting},set:function(a){this.U.sorting===a||a!==Vt&&a!==Wt&&a!==Xt&&!Yt||(this.U.sorting=a,this.B())}},comparer:{get:function(){return this.U.comparer},set:function(a){this.U.comparer!==\na&&(this.U.comparer=a,this.B())}},angle:{get:function(){return this.U.angle},set:function(a){this.U.angle!==a&&(0===a||90===a||180===a||270===a?(this.U.angle=a,this.B()):B(\"TreeLayout.angle must be 0, 90, 180, or 270\"))}},alignment:{get:function(){return this.U.alignment},set:function(a){this.U.alignment!==a&&(this.U.alignment=a,this.B())}},nodeIndent:{get:function(){return this.U.nodeIndent},set:function(a){this.U.nodeIndent!==\na&&0<=a&&(this.U.nodeIndent=a,this.B())}},nodeIndentPastParent:{get:function(){return this.U.nodeIndentPastParent},set:function(a){this.U.nodeIndentPastParent!==a&&0<=a&&1>=a&&(this.U.nodeIndentPastParent=a,this.B())}},nodeSpacing:{get:function(){return this.U.nodeSpacing},set:function(a){this.U.nodeSpacing!==a&&(this.U.nodeSpacing=a,this.B())}},layerSpacing:{get:function(){return this.U.layerSpacing},set:function(a){this.U.layerSpacing!==\na&&(this.U.layerSpacing=a,this.B())}},layerSpacingParentOverlap:{get:function(){return this.U.layerSpacingParentOverlap},set:function(a){this.U.layerSpacingParentOverlap!==a&&0<=a&&1>=a&&(this.U.layerSpacingParentOverlap=a,this.B())}},compaction:{get:function(){return this.U.compaction},set:function(a){this.U.compaction===a||a!==ju&&a!==lu||(this.U.compaction=a,this.B())}},breadthLimit:{get:function(){return this.U.breadthLimit},\nset:function(a){this.U.breadthLimit!==a&&0<=a&&(this.U.breadthLimit=a,this.B())}},rowSpacing:{get:function(){return this.U.rowSpacing},set:function(a){this.U.rowSpacing!==a&&(this.U.rowSpacing=a,this.B())}},rowIndent:{get:function(){return this.U.rowIndent},set:function(a){this.U.rowIndent!==a&&0<=a&&(this.U.rowIndent=a,this.B())}},commentSpacing:{get:function(){return this.U.commentSpacing},set:function(a){this.U.commentSpacing!==\na&&(this.U.commentSpacing=a,this.B())}},commentMargin:{get:function(){return this.U.commentMargin},set:function(a){this.U.commentMargin!==a&&(this.U.commentMargin=a,this.B())}},setsPortSpot:{get:function(){return this.U.setsPortSpot},set:function(a){this.U.setsPortSpot!==a&&(this.U.setsPortSpot=a,this.B())}},portSpot:{get:function(){return this.U.portSpot},set:function(a){this.U.portSpot.w(a)||(this.U.portSpot=\na,this.B())}},setsChildPortSpot:{get:function(){return this.U.setsChildPortSpot},set:function(a){this.U.setsChildPortSpot!==a&&(this.U.setsChildPortSpot=a,this.B())}},childPortSpot:{get:function(){return this.U.childPortSpot},set:function(a){this.U.childPortSpot.w(a)||(this.U.childPortSpot=a,this.B())}},alternateSorting:{get:function(){return this.V.sorting},set:function(a){this.V.sorting===a||a!==Vt&&a!==Wt&&\na!==Xt&&!Yt||(this.V.sorting=a,this.B())}},alternateComparer:{get:function(){return this.V.comparer},set:function(a){this.V.comparer!==a&&(this.V.comparer=a,this.B())}},alternateAngle:{get:function(){return this.V.angle},set:function(a){this.V.angle===a||0!==a&&90!==a&&180!==a&&270!==a||(this.V.angle=a,this.B())}},alternateAlignment:{get:function(){return this.V.alignment},set:function(a){this.V.alignment!==\na&&(this.V.alignment=a,this.B())}},alternateNodeIndent:{get:function(){return this.V.nodeIndent},set:function(a){this.V.nodeIndent!==a&&0<=a&&(this.V.nodeIndent=a,this.B())}},alternateNodeIndentPastParent:{get:function(){return this.V.nodeIndentPastParent},set:function(a){this.V.nodeIndentPastParent!==a&&0<=a&&1>=a&&(this.V.nodeIndentPastParent=a,this.B())}},alternateNodeSpacing:{get:function(){return this.V.nodeSpacing},\nset:function(a){this.V.nodeSpacing!==a&&(this.V.nodeSpacing=a,this.B())}},alternateLayerSpacing:{get:function(){return this.V.layerSpacing},set:function(a){this.V.layerSpacing!==a&&(this.V.layerSpacing=a,this.B())}},alternateLayerSpacingParentOverlap:{get:function(){return this.V.layerSpacingParentOverlap},set:function(a){this.V.layerSpacingParentOverlap!==a&&0<=a&&1>=a&&(this.V.layerSpacingParentOverlap=a,this.B())}},alternateCompaction:{\nget:function(){return this.V.compaction},set:function(a){this.V.compaction===a||a!==ju&&a!==lu||(this.V.compaction=a,this.B())}},alternateBreadthLimit:{get:function(){return this.V.breadthLimit},set:function(a){this.V.breadthLimit!==a&&0<=a&&(this.V.breadthLimit=a,this.B())}},alternateRowSpacing:{get:function(){return this.V.rowSpacing},set:function(a){this.V.rowSpacing!==a&&(this.V.rowSpacing=a,this.B())}},alternateRowIndent:{\nget:function(){return this.V.rowIndent},set:function(a){this.V.rowIndent!==a&&0<=a&&(this.V.rowIndent=a,this.B())}},alternateCommentSpacing:{get:function(){return this.V.commentSpacing},set:function(a){this.V.commentSpacing!==a&&(this.V.commentSpacing=a,this.B())}},alternateCommentMargin:{get:function(){return this.V.commentMargin},set:function(a){this.V.commentMargin!==a&&(this.V.commentMargin=a,this.B())}},alternateSetsPortSpot:{\nget:function(){return this.V.setsPortSpot},set:function(a){this.V.setsPortSpot!==a&&(this.V.setsPortSpot=a,this.B())}},alternatePortSpot:{get:function(){return this.V.portSpot},set:function(a){this.V.portSpot.w(a)||(this.V.portSpot=a,this.B())}},alternateSetsChildPortSpot:{get:function(){return this.V.setsChildPortSpot},set:function(a){this.V.setsChildPortSpot!==a&&(this.V.setsChildPortSpot=a,this.B())}},alternateChildPortSpot:{\nget:function(){return this.V.childPortSpot},set:function(a){this.V.childPortSpot.w(a)||(this.V.childPortSpot=a,this.B())}}});\nvar yt=new D(xt,\"PathDefault\",-1),zt=new D(xt,\"PathDestination\",0),Gt=new D(xt,\"PathSource\",1),Vt=new D(xt,\"SortingForwards\",10),Wt=new D(xt,\"SortingReverse\",11),Xt=new D(xt,\"SortingAscending\",12),Yt=new D(xt,\"SortingDescending\",13),zu=new D(xt,\"AlignmentCenterSubtrees\",20),Au=new D(xt,\"AlignmentCenterChildren\",21),qu=new D(xt,\"AlignmentStart\",22),nu=new D(xt,\"AlignmentEnd\",23),$t=new D(xt,\"AlignmentBus\",24),Qt=new D(xt,\"AlignmentBusBranching\",25),au=new D(xt,\"AlignmentTopLeftBus\",26),bu=new D(xt,\n\"AlignmentBottomRightBus\",27),ju=new D(xt,\"CompactionNone\",30),lu=new D(xt,\"CompactionBlock\",31),At=new D(xt,\"StyleLayered\",40),Ut=new D(xt,\"StyleLastParents\",41),Tt=new D(xt,\"StyleAlternating\",42),St=new D(xt,\"StyleRootOnly\",43),Ct=new D(xt,\"ArrangementVertical\",50),Iu=new D(xt,\"ArrangementHorizontal\",51),Ft=new D(xt,\"ArrangementFixedRoots\",52),Bt=new D(xt,\"LayerIndividual\",60),Ot=new D(xt,\"LayerSiblings\",61),Nt=new D(xt,\"LayerUniform\",62);xt.className=\"TreeLayout\";xt.PathDefault=yt;\nxt.PathDestination=zt;xt.PathSource=Gt;xt.SortingForwards=Vt;xt.SortingReverse=Wt;xt.SortingAscending=Xt;xt.SortingDescending=Yt;xt.AlignmentCenterSubtrees=zu;xt.AlignmentCenterChildren=Au;xt.AlignmentStart=qu;xt.AlignmentEnd=nu;xt.AlignmentBus=$t;xt.AlignmentBusBranching=Qt;xt.AlignmentTopLeftBus=au;xt.AlignmentBottomRightBus=bu;xt.CompactionNone=ju;xt.CompactionBlock=lu;xt.StyleLayered=At;xt.StyleLastParents=Ut;xt.StyleAlternating=Tt;xt.StyleRootOnly=St;xt.ArrangementVertical=Ct;\nxt.ArrangementHorizontal=Iu;xt.ArrangementFixedRoots=Ft;xt.LayerIndividual=Bt;xt.LayerSiblings=Ot;xt.LayerUniform=Nt;function Dt(a){aq.call(this,a)}ma(Dt,aq);Dt.prototype.createVertex=function(){return new Et(this)};Dt.prototype.createEdge=function(){return new Ku(this)};Dt.className=\"TreeNetwork\";\nfunction Et(a){oq.call(this,a);this.Ka=!1;this.Cc=null;this.I=[];this.Sc=this.eb=this.T=this.La=0;this.jd=null;this.S=new J(0,0);this.ua=new M(0,0);this.fa=new J(0,0);this.Tm=this.Sm=this.ZA=!1;this.br=this.Pq=null;this.bd=Vt;this.Wc=vq;this.Yb=0;this.yb=Au;this.Ds=this.Cs=0;this.Es=20;this.ue=50;this.ss=0;this.Er=lu;this.wr=0;this.Rs=25;this.Dr=this.Qs=10;this.Cr=20;this.dt=!0;this.Ms=Vc;this.ct=!0;this.zr=Vc}ma(Et,oq);\nEt.prototype.copyInheritedPropertiesFrom=function(a){null!==a&&(this.bd=a.sorting,this.Wc=a.comparer,this.Yb=a.angle,this.yb=a.alignment,this.Cs=a.nodeIndent,this.Ds=a.nodeIndentPastParent,this.Es=a.nodeSpacing,this.ue=a.layerSpacing,this.ss=a.layerSpacingParentOverlap,this.Er=a.compaction,this.wr=a.breadthLimit,this.Rs=a.rowSpacing,this.Qs=a.rowIndent,this.Dr=a.commentSpacing,this.Cr=a.commentMargin,this.dt=a.setsPortSpot,this.Ms=a.portSpot,this.ct=a.setsChildPortSpot,this.zr=a.childPortSpot)};\nna.Object.defineProperties(Et.prototype,{initialized:{get:function(){return this.Ka},set:function(a){this.Ka!==a&&(this.Ka=a)}},parent:{get:function(){return this.Cc},set:function(a){this.Cc!==a&&(this.Cc=a)}},children:{get:function(){return this.I},set:function(a){if(this.I!==a){if(null!==a)for(var b=a.length,c=0;c<b;c++);this.I=a}}},level:{get:function(){return this.La},set:function(a){this.La!==\na&&(this.La=a)}},descendantCount:{get:function(){return this.T},set:function(a){this.T!==a&&(this.T=a)}},maxChildrenCount:{get:function(){return this.eb},set:function(a){this.eb!==a&&(this.eb=a)}},maxGenerationCount:{get:function(){return this.Sc},set:function(a){this.Sc!==a&&(this.Sc=a)}},comments:{get:function(){return this.jd},set:function(a){if(this.jd!==a){if(null!==a)for(var b=\na.length,c=0;c<b;c++);this.jd=a}}},sorting:{get:function(){return this.bd},set:function(a){this.bd!==a&&(this.bd=a)}},comparer:{get:function(){return this.Wc},set:function(a){this.Wc!==a&&(this.Wc=a)}},angle:{get:function(){return this.Yb},set:function(a){this.Yb!==a&&(this.Yb=a)}},alignment:{get:function(){return this.yb},set:function(a){this.yb!==a&&(this.yb=a)}},nodeIndent:{\nget:function(){return this.Cs},set:function(a){this.Cs!==a&&(this.Cs=a)}},nodeIndentPastParent:{get:function(){return this.Ds},set:function(a){this.Ds!==a&&(this.Ds=a)}},nodeSpacing:{get:function(){return this.Es},set:function(a){this.Es!==a&&(this.Es=a)}},layerSpacing:{get:function(){return this.ue},set:function(a){this.ue!==a&&(this.ue=a)}},layerSpacingParentOverlap:{\nget:function(){return this.ss},set:function(a){this.ss!==a&&(this.ss=a)}},compaction:{get:function(){return this.Er},set:function(a){this.Er!==a&&(this.Er=a)}},breadthLimit:{get:function(){return this.wr},set:function(a){this.wr!==a&&(this.wr=a)}},rowSpacing:{get:function(){return this.Rs},set:function(a){this.Rs!==a&&(this.Rs=a)}},rowIndent:{get:function(){return this.Qs},set:function(a){this.Qs!==\na&&(this.Qs=a)}},commentSpacing:{get:function(){return this.Dr},set:function(a){this.Dr!==a&&(this.Dr=a)}},commentMargin:{get:function(){return this.Cr},set:function(a){this.Cr!==a&&(this.Cr=a)}},setsPortSpot:{get:function(){return this.dt},set:function(a){this.dt!==a&&(this.dt=a)}},portSpot:{get:function(){return this.Ms},set:function(a){this.Ms.w(a)||(this.Ms=a)}},setsChildPortSpot:{\nget:function(){return this.ct},set:function(a){this.ct!==a&&(this.ct=a)}},childPortSpot:{get:function(){return this.zr},set:function(a){this.zr.w(a)||(this.zr=a)}},childrenCount:{get:function(){return this.children.length}},relativePosition:{get:function(){return this.S},set:function(a){this.S.set(a)}},subtreeSize:{get:function(){return this.ua},set:function(a){this.ua.set(a)}},\nsubtreeOffset:{get:function(){return this.fa},set:function(a){this.fa.set(a)}}});Et.className=\"TreeVertex\";function Ku(a){pq.call(this,a);this.lv=new J(0,0)}ma(Ku,pq);\nKu.prototype.commit=function(){var a=this.link;if(null!==a&&!a.isAvoiding){var b=this.network.layout,c=null,d=null;switch(b.kd){case zt:c=this.fromVertex;d=this.toVertex;break;case Gt:c=this.toVertex;d=this.fromVertex;break;default:B(\"Unhandled path value \"+b.kd.toString())}if(null!==c&&null!==d)if(b=this.lv,0!==b.x||0!==b.y||c.ZA){d=c.bounds;var e=mu(c),f=ou(c),g=c.rowSpacing;a.xj();var h=a.curve===dg,k=a.isOrthogonal,l;a.Th();if(k||h){for(l=2;4<a.pointsCount;)a.uw(2);var m=a.i(1);var n=a.i(2)}else{for(l=\n1;3<a.pointsCount;)a.uw(1);m=a.i(0);n=a.i(a.pointsCount-1)}var p=a.i(a.pointsCount-1);0===e?(c.alignment===nu?(e=d.bottom+b.y,0===b.y&&m.y>p.y+c.rowIndent&&(e=Math.min(e,Math.max(m.y,e-pu(c))))):c.alignment===qu?(e=d.top+b.y,0===b.y&&m.y<p.y-c.rowIndent&&(e=Math.max(e,Math.min(m.y,e+pu(c))))):e=c.Sm||c.Tm&&1===c.maxGenerationCount?d.top-c.fa.y+b.y:d.y+d.height/2+b.y,h?(a.m(l,m.x,e),l++,a.m(l,d.right+f,e),l++,a.m(l,d.right+f+(b.x-g)/3,e),l++,a.m(l,d.right+f+2*(b.x-g)/3,e),l++,a.m(l,d.right+f+(b.x-\ng),e),l++,a.m(l,n.x,e)):(k&&(a.m(l,d.right+f/2,m.y),l++),a.m(l,d.right+f/2,e),l++,a.m(l,d.right+f+b.x-(k?g/2:g),e),l++,k&&a.m(l,a.i(l-1).x,n.y))):90===e?(c.alignment===nu?(e=d.right+b.x,0===b.x&&m.x>p.x+c.rowIndent&&(e=Math.min(e,Math.max(m.x,e-pu(c))))):c.alignment===qu?(e=d.left+b.x,0===b.x&&m.x<p.x-c.rowIndent&&(e=Math.max(e,Math.min(m.x,e+pu(c))))):e=c.Sm||c.Tm&&1===c.maxGenerationCount?d.left-c.fa.x+b.x:d.x+d.width/2+b.x,h?(a.m(l,e,m.y),l++,a.m(l,e,d.bottom+f),l++,a.m(l,e,d.bottom+f+(b.y-g)/\n3),l++,a.m(l,e,d.bottom+f+2*(b.y-g)/3),l++,a.m(l,e,d.bottom+f+(b.y-g)),l++,a.m(l,e,n.y)):(k&&(a.m(l,m.x,d.bottom+f/2),l++),a.m(l,e,d.bottom+f/2),l++,a.m(l,e,d.bottom+f+b.y-(k?g/2:g)),l++,k&&a.m(l,n.x,a.i(l-1).y))):180===e?(c.alignment===nu?(e=d.bottom+b.y,0===b.y&&m.y>p.y+c.rowIndent&&(e=Math.min(e,Math.max(m.y,e-pu(c))))):c.alignment===qu?(e=d.top+b.y,0===b.y&&m.y<p.y-c.rowIndent&&(e=Math.max(e,Math.min(m.y,e+pu(c))))):e=c.Sm||c.Tm&&1===c.maxGenerationCount?d.top-c.fa.y+b.y:d.y+d.height/2+b.y,h?\n(a.m(l,m.x,e),l++,a.m(l,d.left-f,e),l++,a.m(l,d.left-f+(b.x+g)/3,e),l++,a.m(l,d.left-f+2*(b.x+g)/3,e),l++,a.m(l,d.left-f+(b.x+g),e),l++,a.m(l,n.x,e)):(k&&(a.m(l,d.left-f/2,m.y),l++),a.m(l,d.left-f/2,e),l++,a.m(l,d.left-f+b.x+(k?g/2:g),e),l++,k&&a.m(l,a.i(l-1).x,n.y))):270===e?(c.alignment===nu?(e=d.right+b.x,0===b.x&&m.x>p.x+c.rowIndent&&(e=Math.min(e,Math.max(m.x,e-pu(c))))):c.alignment===qu?(e=d.left+b.x,0===b.x&&m.x<p.x-c.rowIndent&&(e=Math.max(e,Math.min(m.x,e+pu(c))))):e=c.Sm||c.Tm&&1===c.maxGenerationCount?\nd.left-c.fa.x+b.x:d.x+d.width/2+b.x,h?(a.m(l,e,m.y),l++,a.m(l,e,d.top-f),l++,a.m(l,e,d.top-f+(b.y+g)/3),l++,a.m(l,e,d.top-f+2*(b.y+g)/3),l++,a.m(l,e,d.top-f+(b.y+g)),l++,a.m(l,e,n.y)):(k&&(a.m(l,m.x,d.top-f/2),l++),a.m(l,e,d.top-f/2),l++,a.m(l,e,d.top-f+b.y+(k?g/2:g)),l++,k&&a.m(l,n.x,a.i(l-1).y))):B(\"Invalid angle \"+e);a.xf()}else a=this.link,f=mu(c),f!==mu(d)&&(g=ou(c),h=c.bounds,c=d.bounds,0===f&&c.left-h.right<g+1||90===f&&c.top-h.bottom<g+1||180===f&&h.left-c.right<g+1||270===f&&h.top-c.bottom<\ng+1||(a.xj(),c=a.curve===dg,b=a.isOrthogonal,d=Zt(this.fromVertex.alignment),a.Th(),0===f?(f=h.right+g/2,c?4===a.pointsCount&&(c=a.i(3).y,a.L(1,f-20,a.i(1).y),a.m(2,f-20,c),a.m(3,f,c),a.m(4,f+20,c),a.L(5,a.i(5).x,c)):b?d?a.L(3,a.i(2).x,a.i(4).y):6===a.pointsCount&&(a.L(2,f,a.i(2).y),a.L(3,f,a.i(3).y)):4===a.pointsCount?a.m(2,f,a.i(2).y):3===a.pointsCount?a.L(1,f,a.i(2).y):2===a.pointsCount&&a.m(1,f,a.i(1).y)):90===f?(f=h.bottom+g/2,c?4===a.pointsCount&&(c=a.i(3).x,a.L(1,a.i(1).x,f-20),a.m(2,c,f-20),\na.m(3,c,f),a.m(4,c,f+20),a.L(5,c,a.i(5).y)):b?d?a.L(3,a.i(2).x,a.i(4).y):6===a.pointsCount&&(a.L(2,a.i(2).x,f),a.L(3,a.i(3).x,f)):4===a.pointsCount?a.m(2,a.i(2).x,f):3===a.pointsCount?a.L(1,a.i(2).x,f):2===a.pointsCount&&a.m(1,a.i(1).x,f)):180===f?(f=h.left-g/2,c?4===a.pointsCount&&(c=a.i(3).y,a.L(1,f+20,a.i(1).y),a.m(2,f+20,c),a.m(3,f,c),a.m(4,f-20,c),a.L(5,a.i(5).x,c)):b?d?a.L(3,a.i(2).x,a.i(4).y):6===a.pointsCount&&(a.L(2,f,a.i(2).y),a.L(3,f,a.i(3).y)):4===a.pointsCount?a.m(2,f,a.i(2).y):3===a.pointsCount?\na.L(1,f,a.i(2).y):2===a.pointsCount&&a.m(1,f,a.i(1).y)):270===f&&(f=h.top-g/2,c?4===a.pointsCount&&(c=a.i(3).x,a.L(1,a.i(1).x,f+20),a.m(2,c,f+20),a.m(3,c,f),a.m(4,c,f-20),a.L(5,c,a.i(5).y)):b?d?a.L(3,a.i(2).x,a.i(4).y):6===a.pointsCount&&(a.L(2,a.i(2).x,f),a.L(3,a.i(3).x,f)):4===a.pointsCount?a.m(2,a.i(2).x,f):3===a.pointsCount?a.L(1,a.i(2).x,f):2===a.pointsCount&&a.m(1,a.i(1).x,f)),a.xf()))}};\nna.Object.defineProperties(Ku.prototype,{fromVertex:{get:function(){return this.Yc},set:function(a){this.Yc!==a&&(this.Yc=a)}},toVertex:{get:function(){return this.ed},set:function(a){this.ed!==a&&(this.ed=a)}},relativePoint:{get:function(){return this.lv},set:function(a){this.lv.set(a)}}});Ku.className=\"TreeEdge\";\nPa.prototype.initializeStandardTools=function(){this.Ya(\"Action\",new Eg,this.mouseDownTools);this.Ya(\"Relinking\",new bf,this.mouseDownTools);this.Ya(\"LinkReshaping\",new bg,this.mouseDownTools);this.Ya(\"Rotating\",new Cg,this.mouseDownTools);this.Ya(\"Resizing\",new vg,this.mouseDownTools);this.Ya(\"Linking\",new Vf,this.mouseMoveTools);this.Ya(\"Dragging\",new Ve,this.mouseMoveTools);this.Ya(\"DragSelecting\",new Hg,this.mouseMoveTools);this.Ya(\"Panning\",new Ig,this.mouseMoveTools);this.Ya(\"ContextMenu\",new Kg,\nthis.mouseUpTools);this.Ya(\"TextEditing\",new Vg,this.mouseUpTools);this.Ya(\"ClickCreating\",new Fg,this.mouseUpTools);this.Ya(\"ClickSelecting\",new Dg,this.mouseUpTools)};wn(\"Horizontal\",new Cm);wn(\"Spot\",new Em);wn(\"Table\",new Im);wn(\"Viewbox\",new Nm);wn(\"TableRow\",new Lm);wn(\"TableColumn\",new Mm);wn(\"Graduated\",new Xm);wn(\"Grid\",new Om);ui.add(\"GraphLinksModel\",Oq);ui.add(\"TreeModel\",br);gq(ls,null);gq(As,null);\nvar Lu=x.go,Mu={get licenseKey(){return R.licenseKey},set licenseKey(a){R.licenseKey=a},get version(){return R.version},Group:U,EnumValue:D,List:E,Set:G,Map:H,Point:J,Size:M,Rect:N,Margin:kc,Spot:O,Geometry:rd,PathFigure:je,PathSegment:ke,InputEvent:me,DiagramEvent:ve,ChangedEvent:we,Model:Z,GraphLinksModel:zr,TreeModel:Er,Binding:Hi,Transaction:Be,UndoManager:Ce,CommandHandler:Xk,Tool:Ee,DraggingTool:Ve,DraggingInfo:cf,DraggingOptions:We,LinkingBaseTool:Jf,LinkingTool:Vf,RelinkingTool:bf,LinkReshapingTool:bg,\nResizingTool:vg,RotatingTool:Cg,ClickSelectingTool:Dg,ActionTool:Eg,ClickCreatingTool:Fg,HTMLInfo:Te,ContextMenuTool:Kg,DragSelectingTool:Hg,PanningTool:Ig,TextEditingTool:Vg,ToolManager:Pa,Animation:qh,AnimationManager:mh,AnimationTrigger:fi,Layer:ki,Diagram:R,Palette:Qk,Overview:Tk,Brush:zl,GraphObject:Y,Panel:X,RowColumnDefinition:Vj,Shape:Kf,TextBlock:Wg,TextBlockMetrics:po,Picture:dk,Part:V,Adornment:Je,Node:W,Link:S,Placeholder:xg,Layout:Ai,LayoutNetwork:aq,LayoutVertex:oq,LayoutEdge:pq,GridLayout:Sk,\nPanelLayout:Tl,CircularLayout:Fr,CircularNetwork:Wr,CircularVertex:js,CircularEdge:ks,ForceDirectedLayout:ls,ForceDirectedNetwork:ms,ForceDirectedVertex:ys,ForceDirectedEdge:zs,LayeredDigraphLayout:As,LayeredDigraphNetwork:Fs,LayeredDigraphVertex:vt,LayeredDigraphEdge:wt,TreeLayout:xt,TreeNetwork:Dt,TreeVertex:Et,TreeEdge:Ku};\n\"object\"===typeof Lu&&Lu.version&&B(\"WARNING: a `go` object on the root object is already defined.  \"+(\"Debug\"in Lu?\"debug \":\"\")+\"version: \"+Lu.version+\", replaced with version: \"+Mu.version);R.prototype.go=Mu;x.go=Mu;(\"undefined\"===typeof x||\"undefined\"===typeof x.module||\"object\"!==typeof x.module.exports)&&x.define&&\"function\"===typeof x.define&&x.define.amd&&x.define(Mu); 'undefined'!==typeof module&&'object'===typeof module.exports&&(module.exports='undefined'!==typeof global?global.go:self.go); })();\n","var isCallable = require('../internals/is-callable');\nvar isObject = require('../internals/is-object');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\n\n// makes subclassing work correct for wrapped built-ins\nmodule.exports = function ($this, dummy, Wrapper) {\n  var NewTarget, NewTargetPrototype;\n  if (\n    // it can work only with native `setPrototypeOf`\n    setPrototypeOf &&\n    // we haven't completely correct pre-ES6 way for getting `new.target`, so use this\n    isCallable(NewTarget = dummy.constructor) &&\n    NewTarget !== Wrapper &&\n    isObject(NewTargetPrototype = NewTarget.prototype) &&\n    NewTargetPrototype !== Wrapper.prototype\n  ) setPrototypeOf($this, NewTargetPrototype);\n  return $this;\n};\n","// eslint-disable-next-line es/no-object-getownpropertysymbols -- safe\nexports.f = Object.getOwnPropertySymbols;\n","// IE8- don't enum bug keys\nmodule.exports = [\n  'constructor',\n  'hasOwnProperty',\n  'isPrototypeOf',\n  'propertyIsEnumerable',\n  'toLocaleString',\n  'toString',\n  'valueOf'\n];\n","var global = require('../internals/global');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nvar Object = global.Object;\n\n// `ToObject` abstract operation\n// https://tc39.es/ecma262/#sec-toobject\nmodule.exports = function (argument) {\n  return Object(requireObjectCoercible(argument));\n};\n","/* global ActiveXObject -- old IE, WSH */\nvar anObject = require('../internals/an-object');\nvar defineProperties = require('../internals/object-define-properties');\nvar enumBugKeys = require('../internals/enum-bug-keys');\nvar hiddenKeys = require('../internals/hidden-keys');\nvar html = require('../internals/html');\nvar documentCreateElement = require('../internals/document-create-element');\nvar sharedKey = require('../internals/shared-key');\n\nvar GT = '>';\nvar LT = '<';\nvar PROTOTYPE = 'prototype';\nvar SCRIPT = 'script';\nvar IE_PROTO = sharedKey('IE_PROTO');\n\nvar EmptyConstructor = function () { /* empty */ };\n\nvar scriptTag = function (content) {\n  return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;\n};\n\n// Create object with fake `null` prototype: use ActiveX Object with cleared prototype\nvar NullProtoObjectViaActiveX = function (activeXDocument) {\n  activeXDocument.write(scriptTag(''));\n  activeXDocument.close();\n  var temp = activeXDocument.parentWindow.Object;\n  activeXDocument = null; // avoid memory leak\n  return temp;\n};\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar NullProtoObjectViaIFrame = function () {\n  // Thrash, waste and sodomy: IE GC bug\n  var iframe = documentCreateElement('iframe');\n  var JS = 'java' + SCRIPT + ':';\n  var iframeDocument;\n  iframe.style.display = 'none';\n  html.appendChild(iframe);\n  // https://github.com/zloirock/core-js/issues/475\n  iframe.src = String(JS);\n  iframeDocument = iframe.contentWindow.document;\n  iframeDocument.open();\n  iframeDocument.write(scriptTag('document.F=Object'));\n  iframeDocument.close();\n  return iframeDocument.F;\n};\n\n// Check for document.domain and active x support\n// No need to use active x approach when document.domain is not set\n// see https://github.com/es-shims/es5-shim/issues/150\n// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346\n// avoid IE GC bug\nvar activeXDocument;\nvar NullProtoObject = function () {\n  try {\n    activeXDocument = new ActiveXObject('htmlfile');\n  } catch (error) { /* ignore */ }\n  NullProtoObject = typeof document != 'undefined'\n    ? document.domain && activeXDocument\n      ? NullProtoObjectViaActiveX(activeXDocument) // old IE\n      : NullProtoObjectViaIFrame()\n    : NullProtoObjectViaActiveX(activeXDocument); // WSH\n  var length = enumBugKeys.length;\n  while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];\n  return NullProtoObject();\n};\n\nhiddenKeys[IE_PROTO] = true;\n\n// `Object.create` method\n// https://tc39.es/ecma262/#sec-object.create\nmodule.exports = Object.create || function create(O, Properties) {\n  var result;\n  if (O !== null) {\n    EmptyConstructor[PROTOTYPE] = anObject(O);\n    result = new EmptyConstructor();\n    EmptyConstructor[PROTOTYPE] = null;\n    // add \"__proto__\" for Object.getPrototypeOf polyfill\n    result[IE_PROTO] = O;\n  } else result = NullProtoObject();\n  return Properties === undefined ? result : defineProperties(result, Properties);\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar IS_PURE = require('../internals/is-pure');\nvar FunctionName = require('../internals/function-name');\nvar isCallable = require('../internals/is-callable');\nvar createIteratorConstructor = require('../internals/create-iterator-constructor');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar redefine = require('../internals/redefine');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar Iterators = require('../internals/iterators');\nvar IteratorsCore = require('../internals/iterators-core');\n\nvar PROPER_FUNCTION_NAME = FunctionName.PROPER;\nvar CONFIGURABLE_FUNCTION_NAME = FunctionName.CONFIGURABLE;\nvar IteratorPrototype = IteratorsCore.IteratorPrototype;\nvar BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS;\nvar ITERATOR = wellKnownSymbol('iterator');\nvar KEYS = 'keys';\nvar VALUES = 'values';\nvar ENTRIES = 'entries';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) {\n  createIteratorConstructor(IteratorConstructor, NAME, next);\n\n  var getIterationMethod = function (KIND) {\n    if (KIND === DEFAULT && defaultIterator) return defaultIterator;\n    if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) return IterablePrototype[KIND];\n    switch (KIND) {\n      case KEYS: return function keys() { return new IteratorConstructor(this, KIND); };\n      case VALUES: return function values() { return new IteratorConstructor(this, KIND); };\n      case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); };\n    } return function () { return new IteratorConstructor(this); };\n  };\n\n  var TO_STRING_TAG = NAME + ' Iterator';\n  var INCORRECT_VALUES_NAME = false;\n  var IterablePrototype = Iterable.prototype;\n  var nativeIterator = IterablePrototype[ITERATOR]\n    || IterablePrototype['@@iterator']\n    || DEFAULT && IterablePrototype[DEFAULT];\n  var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT);\n  var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator;\n  var CurrentIteratorPrototype, methods, KEY;\n\n  // fix native\n  if (anyNativeIterator) {\n    CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable()));\n    if (CurrentIteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) {\n      if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) {\n        if (setPrototypeOf) {\n          setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype);\n        } else if (!isCallable(CurrentIteratorPrototype[ITERATOR])) {\n          redefine(CurrentIteratorPrototype, ITERATOR, returnThis);\n        }\n      }\n      // Set @@toStringTag to native iterators\n      setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true);\n      if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis;\n    }\n  }\n\n  // fix Array.prototype.{ values, @@iterator }.name in V8 / FF\n  if (PROPER_FUNCTION_NAME && DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) {\n    if (!IS_PURE && CONFIGURABLE_FUNCTION_NAME) {\n      createNonEnumerableProperty(IterablePrototype, 'name', VALUES);\n    } else {\n      INCORRECT_VALUES_NAME = true;\n      defaultIterator = function values() { return call(nativeIterator, this); };\n    }\n  }\n\n  // export additional methods\n  if (DEFAULT) {\n    methods = {\n      values: getIterationMethod(VALUES),\n      keys: IS_SET ? defaultIterator : getIterationMethod(KEYS),\n      entries: getIterationMethod(ENTRIES)\n    };\n    if (FORCED) for (KEY in methods) {\n      if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {\n        redefine(IterablePrototype, KEY, methods[KEY]);\n      }\n    } else $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods);\n  }\n\n  // define iterator\n  if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) {\n    redefine(IterablePrototype, ITERATOR, defaultIterator, { name: DEFAULT });\n  }\n  Iterators[NAME] = defaultIterator;\n\n  return methods;\n};\n","var global = require('../internals/global');\nvar isCallable = require('../internals/is-callable');\nvar inspectSource = require('../internals/inspect-source');\n\nvar WeakMap = global.WeakMap;\n\nmodule.exports = isCallable(WeakMap) && /native code/.test(inspectSource(WeakMap));\n","var global = require('../internals/global');\nvar isObject = require('../internals/is-object');\n\nvar String = global.String;\nvar TypeError = global.TypeError;\n\n// `Assert: Type(argument) is Object`\nmodule.exports = function (argument) {\n  if (isObject(argument)) return argument;\n  throw TypeError(String(argument) + ' is not an object');\n};\n","var fails = require('../internals/fails');\n\n// Detect IE8's incomplete defineProperty implementation\nmodule.exports = !fails(function () {\n  // eslint-disable-next-line es/no-object-defineproperty -- required for testing\n  return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7;\n});\n","var isCallable = require('../internals/is-callable');\n\nmodule.exports = function (it) {\n  return typeof it == 'object' ? it !== null : isCallable(it);\n};\n","var uncurryThis = require('../internals/function-uncurry-this');\nvar isCallable = require('../internals/is-callable');\nvar store = require('../internals/shared-store');\n\nvar functionToString = uncurryThis(Function.toString);\n\n// this helper broken in `core-js@3.4.1-3.4.4`, so we can't use `shared` helper\nif (!isCallable(store.inspectSource)) {\n  store.inspectSource = function (it) {\n    return functionToString(it);\n  };\n}\n\nmodule.exports = store.inspectSource;\n","var uncurryThis = require('../internals/function-uncurry-this');\n\nvar id = 0;\nvar postfix = Math.random();\nvar toString = uncurryThis(1.0.toString);\n\nmodule.exports = function (key) {\n  return 'Symbol(' + (key === undefined ? '' : key) + ')_' + toString(++id + postfix, 36);\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = DESCRIPTORS ? function (object, key, value) {\n  return definePropertyModule.f(object, key, createPropertyDescriptor(1, value));\n} : function (object, key, value) {\n  object[key] = value;\n  return object;\n};\n","'use strict';\n/* eslint-disable regexp/no-empty-capturing-group, regexp/no-empty-group, regexp/no-lazy-ends -- testing */\n/* eslint-disable regexp/no-useless-quantifier -- testing */\nvar call = require('../internals/function-call');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar toString = require('../internals/to-string');\nvar regexpFlags = require('../internals/regexp-flags');\nvar stickyHelpers = require('../internals/regexp-sticky-helpers');\nvar shared = require('../internals/shared');\nvar create = require('../internals/object-create');\nvar getInternalState = require('../internals/internal-state').get;\nvar UNSUPPORTED_DOT_ALL = require('../internals/regexp-unsupported-dot-all');\nvar UNSUPPORTED_NCG = require('../internals/regexp-unsupported-ncg');\n\nvar nativeReplace = shared('native-string-replace', String.prototype.replace);\nvar nativeExec = RegExp.prototype.exec;\nvar patchedExec = nativeExec;\nvar charAt = uncurryThis(''.charAt);\nvar indexOf = uncurryThis(''.indexOf);\nvar replace = uncurryThis(''.replace);\nvar stringSlice = uncurryThis(''.slice);\n\nvar UPDATES_LAST_INDEX_WRONG = (function () {\n  var re1 = /a/;\n  var re2 = /b*/g;\n  call(nativeExec, re1, 'a');\n  call(nativeExec, re2, 'a');\n  return re1.lastIndex !== 0 || re2.lastIndex !== 0;\n})();\n\nvar UNSUPPORTED_Y = stickyHelpers.UNSUPPORTED_Y || stickyHelpers.BROKEN_CARET;\n\n// nonparticipating capturing group, copied from es5-shim's String#split patch.\nvar NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\n\nvar PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED || UNSUPPORTED_Y || UNSUPPORTED_DOT_ALL || UNSUPPORTED_NCG;\n\nif (PATCH) {\n  // eslint-disable-next-line max-statements -- TODO\n  patchedExec = function exec(string) {\n    var re = this;\n    var state = getInternalState(re);\n    var str = toString(string);\n    var raw = state.raw;\n    var result, reCopy, lastIndex, match, i, object, group;\n\n    if (raw) {\n      raw.lastIndex = re.lastIndex;\n      result = call(patchedExec, raw, str);\n      re.lastIndex = raw.lastIndex;\n      return result;\n    }\n\n    var groups = state.groups;\n    var sticky = UNSUPPORTED_Y && re.sticky;\n    var flags = call(regexpFlags, re);\n    var source = re.source;\n    var charsAdded = 0;\n    var strCopy = str;\n\n    if (sticky) {\n      flags = replace(flags, 'y', '');\n      if (indexOf(flags, 'g') === -1) {\n        flags += 'g';\n      }\n\n      strCopy = stringSlice(str, re.lastIndex);\n      // Support anchored sticky behavior.\n      if (re.lastIndex > 0 && (!re.multiline || re.multiline && charAt(str, re.lastIndex - 1) !== '\\n')) {\n        source = '(?: ' + source + ')';\n        strCopy = ' ' + strCopy;\n        charsAdded++;\n      }\n      // ^(? + rx + ) is needed, in combination with some str slicing, to\n      // simulate the 'y' flag.\n      reCopy = new RegExp('^(?:' + source + ')', flags);\n    }\n\n    if (NPCG_INCLUDED) {\n      reCopy = new RegExp('^' + source + '$(?!\\\\s)', flags);\n    }\n    if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex;\n\n    match = call(nativeExec, sticky ? reCopy : re, strCopy);\n\n    if (sticky) {\n      if (match) {\n        match.input = stringSlice(match.input, charsAdded);\n        match[0] = stringSlice(match[0], charsAdded);\n        match.index = re.lastIndex;\n        re.lastIndex += match[0].length;\n      } else re.lastIndex = 0;\n    } else if (UPDATES_LAST_INDEX_WRONG && match) {\n      re.lastIndex = re.global ? match.index + match[0].length : lastIndex;\n    }\n    if (NPCG_INCLUDED && match && match.length > 1) {\n      // Fix browsers whose `exec` methods don't consistently return `undefined`\n      // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/\n      call(nativeReplace, match[0], reCopy, function () {\n        for (i = 1; i < arguments.length - 2; i++) {\n          if (arguments[i] === undefined) match[i] = undefined;\n        }\n      });\n    }\n\n    if (match && groups) {\n      match.groups = object = create(null);\n      for (i = 0; i < groups.length; i++) {\n        group = groups[i];\n        object[group[0]] = match[group[1]];\n      }\n    }\n\n    return match;\n  };\n}\n\nmodule.exports = patchedExec;\n","var fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\n\nvar replacement = /#|\\.prototype\\./;\n\nvar isForced = function (feature, detection) {\n  var value = data[normalize(feature)];\n  return value == POLYFILL ? true\n    : value == NATIVE ? false\n    : isCallable(detection) ? fails(detection)\n    : !!detection;\n};\n\nvar normalize = isForced.normalize = function (string) {\n  return String(string).replace(replacement, '.').toLowerCase();\n};\n\nvar data = isForced.data = {};\nvar NATIVE = isForced.NATIVE = 'N';\nvar POLYFILL = isForced.POLYFILL = 'P';\n\nmodule.exports = isForced;\n","var global = require('../internals/global');\nvar call = require('../internals/function-call');\nvar aCallable = require('../internals/a-callable');\nvar anObject = require('../internals/an-object');\nvar tryToString = require('../internals/try-to-string');\nvar getIteratorMethod = require('../internals/get-iterator-method');\n\nvar TypeError = global.TypeError;\n\nmodule.exports = function (argument, usingIterator) {\n  var iteratorMethod = arguments.length < 2 ? getIteratorMethod(argument) : usingIterator;\n  if (aCallable(iteratorMethod)) return anObject(call(iteratorMethod, argument));\n  throw TypeError(tryToString(argument) + ' is not iterable');\n};\n","var global = require('../internals/global');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\nvar anObject = require('../internals/an-object');\nvar toPropertyKey = require('../internals/to-property-key');\n\nvar TypeError = global.TypeError;\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar $defineProperty = Object.defineProperty;\n\n// `Object.defineProperty` method\n// https://tc39.es/ecma262/#sec-object.defineproperty\nexports.f = DESCRIPTORS ? $defineProperty : function defineProperty(O, P, Attributes) {\n  anObject(O);\n  P = toPropertyKey(P);\n  anObject(Attributes);\n  if (IE8_DOM_DEFINE) try {\n    return $defineProperty(O, P, Attributes);\n  } catch (error) { /* empty */ }\n  if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported');\n  if ('value' in Attributes) O[P] = Attributes.value;\n  return O;\n};\n","'use strict';\nvar IteratorPrototype = require('../internals/iterators-core').IteratorPrototype;\nvar create = require('../internals/object-create');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar Iterators = require('../internals/iterators');\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (IteratorConstructor, NAME, next) {\n  var TO_STRING_TAG = NAME + ' Iterator';\n  IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(1, next) });\n  setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true);\n  Iterators[TO_STRING_TAG] = returnThis;\n  return IteratorConstructor;\n};\n","var fails = require('../internals/fails');\nvar global = require('../internals/global');\n\n// babel-minify and Closure Compiler transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError\nvar $RegExp = global.RegExp;\n\nexports.UNSUPPORTED_Y = fails(function () {\n  var re = $RegExp('a', 'y');\n  re.lastIndex = 2;\n  return re.exec('abcd') != null;\n});\n\nexports.BROKEN_CARET = fails(function () {\n  // https://bugzilla.mozilla.org/show_bug.cgi?id=773687\n  var re = $RegExp('^r', 'gy');\n  re.lastIndex = 2;\n  return re.exec('str') != null;\n});\n","var toPrimitive = require('../internals/to-primitive');\nvar isSymbol = require('../internals/is-symbol');\n\n// `ToPropertyKey` abstract operation\n// https://tc39.es/ecma262/#sec-topropertykey\nmodule.exports = function (argument) {\n  var key = toPrimitive(argument, 'string');\n  return isSymbol(key) ? key : key + '';\n};\n","var userAgent = require('../internals/engine-user-agent');\n\nmodule.exports = /web0s(?!.*chrome)/i.test(userAgent);\n","'use strict';\nvar $ = require('../internals/export');\nvar IS_PURE = require('../internals/is-pure');\nvar NativePromise = require('../internals/native-promise-constructor');\nvar fails = require('../internals/fails');\nvar getBuiltIn = require('../internals/get-built-in');\nvar isCallable = require('../internals/is-callable');\nvar speciesConstructor = require('../internals/species-constructor');\nvar promiseResolve = require('../internals/promise-resolve');\nvar redefine = require('../internals/redefine');\n\n// Safari bug https://bugs.webkit.org/show_bug.cgi?id=200829\nvar NON_GENERIC = !!NativePromise && fails(function () {\n  NativePromise.prototype['finally'].call({ then: function () { /* empty */ } }, function () { /* empty */ });\n});\n\n// `Promise.prototype.finally` method\n// https://tc39.es/ecma262/#sec-promise.prototype.finally\n$({ target: 'Promise', proto: true, real: true, forced: NON_GENERIC }, {\n  'finally': function (onFinally) {\n    var C = speciesConstructor(this, getBuiltIn('Promise'));\n    var isFunction = isCallable(onFinally);\n    return this.then(\n      isFunction ? function (x) {\n        return promiseResolve(C, onFinally()).then(function () { return x; });\n      } : onFinally,\n      isFunction ? function (e) {\n        return promiseResolve(C, onFinally()).then(function () { throw e; });\n      } : onFinally\n    );\n  }\n});\n\n// makes sure that native promise-based APIs `Promise#finally` properly works with patched `Promise#then`\nif (!IS_PURE && isCallable(NativePromise)) {\n  var method = getBuiltIn('Promise').prototype['finally'];\n  if (NativePromise.prototype['finally'] !== method) {\n    redefine(NativePromise.prototype, 'finally', method, { unsafe: true });\n  }\n}\n","'use strict';\nvar $ = require('../internals/export');\nvar exec = require('../internals/regexp-exec');\n\n// `RegExp.prototype.exec` method\n// https://tc39.es/ecma262/#sec-regexp.prototype.exec\n$({ target: 'RegExp', proto: true, forced: /./.exec !== exec }, {\n  exec: exec\n});\n","'use strict';\nvar anObject = require('../internals/an-object');\n\n// `RegExp.prototype.flags` getter implementation\n// https://tc39.es/ecma262/#sec-get-regexp.prototype.flags\nmodule.exports = function () {\n  var that = anObject(this);\n  var result = '';\n  if (that.global) result += 'g';\n  if (that.ignoreCase) result += 'i';\n  if (that.multiline) result += 'm';\n  if (that.dotAll) result += 's';\n  if (that.unicode) result += 'u';\n  if (that.sticky) result += 'y';\n  return result;\n};\n","'use strict';\nvar fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\nvar create = require('../internals/object-create');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar redefine = require('../internals/redefine');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar BUGGY_SAFARI_ITERATORS = false;\n\n// `%IteratorPrototype%` object\n// https://tc39.es/ecma262/#sec-%iteratorprototype%-object\nvar IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;\n\n/* eslint-disable es/no-array-prototype-keys -- safe */\nif ([].keys) {\n  arrayIterator = [].keys();\n  // Safari 8 has buggy iterators w/o `next`\n  if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;\n  else {\n    PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator));\n    if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype;\n  }\n}\n\nvar NEW_ITERATOR_PROTOTYPE = IteratorPrototype == undefined || fails(function () {\n  var test = {};\n  // FF44- legacy iterators case\n  return IteratorPrototype[ITERATOR].call(test) !== test;\n});\n\nif (NEW_ITERATOR_PROTOTYPE) IteratorPrototype = {};\nelse if (IS_PURE) IteratorPrototype = create(IteratorPrototype);\n\n// `%IteratorPrototype%[@@iterator]()` method\n// https://tc39.es/ecma262/#sec-%iteratorprototype%-@@iterator\nif (!isCallable(IteratorPrototype[ITERATOR])) {\n  redefine(IteratorPrototype, ITERATOR, function () {\n    return this;\n  });\n}\n\nmodule.exports = {\n  IteratorPrototype: IteratorPrototype,\n  BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS\n};\n","var global = require('../internals/global');\nvar bind = require('../internals/function-bind-context');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar macrotask = require('../internals/task').set;\nvar IS_IOS = require('../internals/engine-is-ios');\nvar IS_IOS_PEBBLE = require('../internals/engine-is-ios-pebble');\nvar IS_WEBOS_WEBKIT = require('../internals/engine-is-webos-webkit');\nvar IS_NODE = require('../internals/engine-is-node');\n\nvar MutationObserver = global.MutationObserver || global.WebKitMutationObserver;\nvar document = global.document;\nvar process = global.process;\nvar Promise = global.Promise;\n// Node.js 11 shows ExperimentalWarning on getting `queueMicrotask`\nvar queueMicrotaskDescriptor = getOwnPropertyDescriptor(global, 'queueMicrotask');\nvar queueMicrotask = queueMicrotaskDescriptor && queueMicrotaskDescriptor.value;\n\nvar flush, head, last, notify, toggle, node, promise, then;\n\n// modern engines have queueMicrotask method\nif (!queueMicrotask) {\n  flush = function () {\n    var parent, fn;\n    if (IS_NODE && (parent = process.domain)) parent.exit();\n    while (head) {\n      fn = head.fn;\n      head = head.next;\n      try {\n        fn();\n      } catch (error) {\n        if (head) notify();\n        else last = undefined;\n        throw error;\n      }\n    } last = undefined;\n    if (parent) parent.enter();\n  };\n\n  // browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339\n  // also except WebOS Webkit https://github.com/zloirock/core-js/issues/898\n  if (!IS_IOS && !IS_NODE && !IS_WEBOS_WEBKIT && MutationObserver && document) {\n    toggle = true;\n    node = document.createTextNode('');\n    new MutationObserver(flush).observe(node, { characterData: true });\n    notify = function () {\n      node.data = toggle = !toggle;\n    };\n  // environments with maybe non-completely correct, but existent Promise\n  } else if (!IS_IOS_PEBBLE && Promise && Promise.resolve) {\n    // Promise.resolve without an argument throws an error in LG WebOS 2\n    promise = Promise.resolve(undefined);\n    // workaround of WebKit ~ iOS Safari 10.1 bug\n    promise.constructor = Promise;\n    then = bind(promise.then, promise);\n    notify = function () {\n      then(flush);\n    };\n  // Node.js without promises\n  } else if (IS_NODE) {\n    notify = function () {\n      process.nextTick(flush);\n    };\n  // for other environments - macrotask based on:\n  // - setImmediate\n  // - MessageChannel\n  // - window.postMessag\n  // - onreadystatechange\n  // - setTimeout\n  } else {\n    // strange IE + webpack dev server bug - use .bind(global)\n    macrotask = bind(macrotask, global);\n    notify = function () {\n      macrotask(flush);\n    };\n  }\n}\n\nmodule.exports = queueMicrotask || function (fn) {\n  var task = { fn: fn, next: undefined };\n  if (last) last.next = task;\n  if (!head) {\n    head = task;\n    notify();\n  } last = task;\n};\n","var global = require('../internals/global');\nvar shared = require('../internals/shared');\nvar hasOwn = require('../internals/has-own-property');\nvar uid = require('../internals/uid');\nvar NATIVE_SYMBOL = require('../internals/native-symbol');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\n\nvar WellKnownSymbolsStore = shared('wks');\nvar Symbol = global.Symbol;\nvar symbolFor = Symbol && Symbol['for'];\nvar createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol : Symbol && Symbol.withoutSetter || uid;\n\nmodule.exports = function (name) {\n  if (!hasOwn(WellKnownSymbolsStore, name) || !(NATIVE_SYMBOL || typeof WellKnownSymbolsStore[name] == 'string')) {\n    var description = 'Symbol.' + name;\n    if (NATIVE_SYMBOL && hasOwn(Symbol, name)) {\n      WellKnownSymbolsStore[name] = Symbol[name];\n    } else if (USE_SYMBOL_AS_UID && symbolFor) {\n      WellKnownSymbolsStore[name] = symbolFor(description);\n    } else {\n      WellKnownSymbolsStore[name] = createWellKnownSymbol(description);\n    }\n  } return WellKnownSymbolsStore[name];\n};\n","var global = require('../internals/global');\nvar call = require('../internals/function-call');\nvar isObject = require('../internals/is-object');\nvar isSymbol = require('../internals/is-symbol');\nvar getMethod = require('../internals/get-method');\nvar ordinaryToPrimitive = require('../internals/ordinary-to-primitive');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TypeError = global.TypeError;\nvar TO_PRIMITIVE = wellKnownSymbol('toPrimitive');\n\n// `ToPrimitive` abstract operation\n// https://tc39.es/ecma262/#sec-toprimitive\nmodule.exports = function (input, pref) {\n  if (!isObject(input) || isSymbol(input)) return input;\n  var exoticToPrim = getMethod(input, TO_PRIMITIVE);\n  var result;\n  if (exoticToPrim) {\n    if (pref === undefined) pref = 'default';\n    result = call(exoticToPrim, input, pref);\n    if (!isObject(result) || isSymbol(result)) return result;\n    throw TypeError(\"Can't convert object to primitive value\");\n  }\n  if (pref === undefined) pref = 'number';\n  return ordinaryToPrimitive(input, pref);\n};\n","module.exports = false;\n","var global = require('../internals/global');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar UNSUPPORTED_DOT_ALL = require('../internals/regexp-unsupported-dot-all');\nvar classof = require('../internals/classof-raw');\nvar defineProperty = require('../internals/object-define-property').f;\nvar getInternalState = require('../internals/internal-state').get;\n\nvar RegExpPrototype = RegExp.prototype;\nvar TypeError = global.TypeError;\n\n// `RegExp.prototype.dotAll` getter\n// https://tc39.es/ecma262/#sec-get-regexp.prototype.dotall\nif (DESCRIPTORS && UNSUPPORTED_DOT_ALL) {\n  defineProperty(RegExpPrototype, 'dotAll', {\n    configurable: true,\n    get: function () {\n      if (this === RegExpPrototype) return undefined;\n      // We can't use InternalStateModule.getterFor because\n      // we don't add metadata for regexps created by a literal.\n      if (classof(this) === 'RegExp') {\n        return !!getInternalState(this).dotAll;\n      }\n      throw TypeError('Incompatible receiver, RegExp required');\n    }\n  });\n}\n","var call = Function.prototype.call;\n\nmodule.exports = call.bind ? call.bind(call) : function () {\n  return call.apply(call, arguments);\n};\n","var uncurryThis = require('../internals/function-uncurry-this');\n\nvar toString = uncurryThis({}.toString);\nvar stringSlice = uncurryThis(''.slice);\n\nmodule.exports = function (it) {\n  return stringSlice(toString(it), 8, -1);\n};\n","var global = require('../internals/global');\nvar setGlobal = require('../internals/set-global');\n\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || setGlobal(SHARED, {});\n\nmodule.exports = store;\n","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","var uncurryThis = require('../internals/function-uncurry-this');\nvar hasOwn = require('../internals/has-own-property');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar indexOf = require('../internals/array-includes').indexOf;\nvar hiddenKeys = require('../internals/hidden-keys');\n\nvar push = uncurryThis([].push);\n\nmodule.exports = function (object, names) {\n  var O = toIndexedObject(object);\n  var i = 0;\n  var result = [];\n  var key;\n  for (key in O) !hasOwn(hiddenKeys, key) && hasOwn(O, key) && push(result, key);\n  // Don't enum bug & hidden keys\n  while (names.length > i) if (hasOwn(O, key = names[i++])) {\n    ~indexOf(result, key) || push(result, key);\n  }\n  return result;\n};\n","var global = require('../internals/global');\nvar isObject = require('../internals/is-object');\n\nvar document = global.document;\n// typeof document.createElement is 'object' in old IE\nvar EXISTS = isObject(document) && isObject(document.createElement);\n\nmodule.exports = function (it) {\n  return EXISTS ? document.createElement(it) : {};\n};\n","var $ = require('../internals/export');\nvar assign = require('../internals/object-assign');\n\n// `Object.assign` method\n// https://tc39.es/ecma262/#sec-object.assign\n// eslint-disable-next-line es/no-object-assign -- required for testing\n$({ target: 'Object', stat: true, forced: Object.assign !== assign }, {\n  assign: assign\n});\n","var anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar newPromiseCapability = require('../internals/new-promise-capability');\n\nmodule.exports = function (C, x) {\n  anObject(C);\n  if (isObject(x) && x.constructor === C) return x;\n  var promiseCapability = newPromiseCapability.f(C);\n  var resolve = promiseCapability.resolve;\n  resolve(x);\n  return promiseCapability.promise;\n};\n","var global = require('../internals/global');\n\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar defineProperty = Object.defineProperty;\n\nmodule.exports = function (key, value) {\n  try {\n    defineProperty(global, key, { value: value, configurable: true, writable: true });\n  } catch (error) {\n    global[key] = value;\n  } return value;\n};\n","module.exports = {};\n","module.exports = function (exec) {\n  try {\n    return !!exec();\n  } catch (error) {\n    return true;\n  }\n};\n","var global = require('../internals/global');\nvar isCallable = require('../internals/is-callable');\n\nvar aFunction = function (argument) {\n  return isCallable(argument) ? argument : undefined;\n};\n\nmodule.exports = function (namespace, method) {\n  return arguments.length < 2 ? aFunction(global[namespace]) : global[namespace] && global[namespace][method];\n};\n","'use strict';\nvar $propertyIsEnumerable = {}.propertyIsEnumerable;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Nashorn ~ JDK8 bug\nvar NASHORN_BUG = getOwnPropertyDescriptor && !$propertyIsEnumerable.call({ 1: 2 }, 1);\n\n// `Object.prototype.propertyIsEnumerable` method implementation\n// https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable\nexports.f = NASHORN_BUG ? function propertyIsEnumerable(V) {\n  var descriptor = getOwnPropertyDescriptor(this, V);\n  return !!descriptor && descriptor.enumerable;\n} : $propertyIsEnumerable;\n","/* eslint-disable no-proto -- safe */\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar anObject = require('../internals/an-object');\nvar aPossiblePrototype = require('../internals/a-possible-prototype');\n\n// `Object.setPrototypeOf` method\n// https://tc39.es/ecma262/#sec-object.setprototypeof\n// Works with __proto__ only. Old v8 can't work with null proto objects.\n// eslint-disable-next-line es/no-object-setprototypeof -- safe\nmodule.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () {\n  var CORRECT_SETTER = false;\n  var test = {};\n  var setter;\n  try {\n    // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\n    setter = uncurryThis(Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set);\n    setter(test, []);\n    CORRECT_SETTER = test instanceof Array;\n  } catch (error) { /* empty */ }\n  return function setPrototypeOf(O, proto) {\n    anObject(O);\n    aPossiblePrototype(proto);\n    if (CORRECT_SETTER) setter(O, proto);\n    else O.__proto__ = proto;\n    return O;\n  };\n}() : undefined);\n","var defineProperty = require('../internals/object-define-property').f;\nvar hasOwn = require('../internals/has-own-property');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n\nmodule.exports = function (it, TAG, STATIC) {\n  if (it && !hasOwn(it = STATIC ? it : it.prototype, TO_STRING_TAG)) {\n    defineProperty(it, TO_STRING_TAG, { configurable: true, value: TAG });\n  }\n};\n","var userAgent = require('../internals/engine-user-agent');\nvar global = require('../internals/global');\n\nmodule.exports = /ipad|iphone|ipod/i.test(userAgent) && global.Pebble !== undefined;\n","var global = require('../internals/global');\nvar getBuiltIn = require('../internals/get-built-in');\nvar isCallable = require('../internals/is-callable');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\n\nvar Object = global.Object;\n\nmodule.exports = USE_SYMBOL_AS_UID ? function (it) {\n  return typeof it == 'symbol';\n} : function (it) {\n  var $Symbol = getBuiltIn('Symbol');\n  return isCallable($Symbol) && isPrototypeOf($Symbol.prototype, Object(it));\n};\n","var check = function (it) {\n  return it && it.Math == Math && it;\n};\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nmodule.exports =\n  // eslint-disable-next-line es/no-global-this -- safe\n  check(typeof globalThis == 'object' && globalThis) ||\n  check(typeof window == 'object' && window) ||\n  // eslint-disable-next-line no-restricted-globals -- safe\n  check(typeof self == 'object' && self) ||\n  check(typeof global == 'object' && global) ||\n  // eslint-disable-next-line no-new-func -- fallback\n  (function () { return this; })() || Function('return this')();\n","var aCallable = require('../internals/a-callable');\n\n// `GetMethod` abstract operation\n// https://tc39.es/ecma262/#sec-getmethod\nmodule.exports = function (V, P) {\n  var func = V[P];\n  return func == null ? undefined : aCallable(func);\n};\n","var internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\n// `Object.keys` method\n// https://tc39.es/ecma262/#sec-object.keys\n// eslint-disable-next-line es/no-object-keys -- safe\nmodule.exports = Object.keys || function keys(O) {\n  return internalObjectKeys(O, enumBugKeys);\n};\n","var global = require('../internals/global');\nvar hasOwn = require('../internals/has-own-property');\nvar isCallable = require('../internals/is-callable');\nvar toObject = require('../internals/to-object');\nvar sharedKey = require('../internals/shared-key');\nvar CORRECT_PROTOTYPE_GETTER = require('../internals/correct-prototype-getter');\n\nvar IE_PROTO = sharedKey('IE_PROTO');\nvar Object = global.Object;\nvar ObjectPrototype = Object.prototype;\n\n// `Object.getPrototypeOf` method\n// https://tc39.es/ecma262/#sec-object.getprototypeof\nmodule.exports = CORRECT_PROTOTYPE_GETTER ? Object.getPrototypeOf : function (O) {\n  var object = toObject(O);\n  if (hasOwn(object, IE_PROTO)) return object[IE_PROTO];\n  var constructor = object.constructor;\n  if (isCallable(constructor) && object instanceof constructor) {\n    return constructor.prototype;\n  } return object instanceof Object ? ObjectPrototype : null;\n};\n","var fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n  function F() { /* empty */ }\n  F.prototype.constructor = null;\n  // eslint-disable-next-line es/no-object-getprototypeof -- required for testing\n  return Object.getPrototypeOf(new F()) !== F.prototype;\n});\n","'use strict';\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar Iterators = require('../internals/iterators');\nvar InternalStateModule = require('../internals/internal-state');\nvar defineIterator = require('../internals/define-iterator');\n\nvar ARRAY_ITERATOR = 'Array Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR);\n\n// `Array.prototype.entries` method\n// https://tc39.es/ecma262/#sec-array.prototype.entries\n// `Array.prototype.keys` method\n// https://tc39.es/ecma262/#sec-array.prototype.keys\n// `Array.prototype.values` method\n// https://tc39.es/ecma262/#sec-array.prototype.values\n// `Array.prototype[@@iterator]` method\n// https://tc39.es/ecma262/#sec-array.prototype-@@iterator\n// `CreateArrayIterator` internal method\n// https://tc39.es/ecma262/#sec-createarrayiterator\nmodule.exports = defineIterator(Array, 'Array', function (iterated, kind) {\n  setInternalState(this, {\n    type: ARRAY_ITERATOR,\n    target: toIndexedObject(iterated), // target\n    index: 0,                          // next index\n    kind: kind                         // kind\n  });\n// `%ArrayIteratorPrototype%.next` method\n// https://tc39.es/ecma262/#sec-%arrayiteratorprototype%.next\n}, function () {\n  var state = getInternalState(this);\n  var target = state.target;\n  var kind = state.kind;\n  var index = state.index++;\n  if (!target || index >= target.length) {\n    state.target = undefined;\n    return { value: undefined, done: true };\n  }\n  if (kind == 'keys') return { value: index, done: false };\n  if (kind == 'values') return { value: target[index], done: false };\n  return { value: [index, target[index]], done: false };\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values%\n// https://tc39.es/ecma262/#sec-createunmappedargumentsobject\n// https://tc39.es/ecma262/#sec-createmappedargumentsobject\nIterators.Arguments = Iterators.Array;\n\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n","var redefine = require('../internals/redefine');\n\nmodule.exports = function (target, src, options) {\n  for (var key in src) redefine(target, key, src[key], options);\n  return target;\n};\n","var FunctionPrototype = Function.prototype;\nvar bind = FunctionPrototype.bind;\nvar call = FunctionPrototype.call;\nvar callBind = bind && bind.bind(call);\n\nmodule.exports = bind ? function (fn) {\n  return fn && callBind(call, fn);\n} : function (fn) {\n  return fn && function () {\n    return call.apply(fn, arguments);\n  };\n};\n","module.exports = function (exec) {\n  try {\n    return { error: false, value: exec() };\n  } catch (error) {\n    return { error: true, value: error };\n  }\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar IS_PURE = require('../internals/is-pure');\nvar global = require('../internals/global');\nvar getBuiltIn = require('../internals/get-built-in');\nvar call = require('../internals/function-call');\nvar NativePromise = require('../internals/native-promise-constructor');\nvar redefine = require('../internals/redefine');\nvar redefineAll = require('../internals/redefine-all');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar setSpecies = require('../internals/set-species');\nvar aCallable = require('../internals/a-callable');\nvar isCallable = require('../internals/is-callable');\nvar isObject = require('../internals/is-object');\nvar anInstance = require('../internals/an-instance');\nvar inspectSource = require('../internals/inspect-source');\nvar iterate = require('../internals/iterate');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\nvar speciesConstructor = require('../internals/species-constructor');\nvar task = require('../internals/task').set;\nvar microtask = require('../internals/microtask');\nvar promiseResolve = require('../internals/promise-resolve');\nvar hostReportErrors = require('../internals/host-report-errors');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\nvar perform = require('../internals/perform');\nvar InternalStateModule = require('../internals/internal-state');\nvar isForced = require('../internals/is-forced');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_BROWSER = require('../internals/engine-is-browser');\nvar IS_NODE = require('../internals/engine-is-node');\nvar V8_VERSION = require('../internals/engine-v8-version');\n\nvar SPECIES = wellKnownSymbol('species');\nvar PROMISE = 'Promise';\n\nvar getInternalState = InternalStateModule.get;\nvar setInternalState = InternalStateModule.set;\nvar getInternalPromiseState = InternalStateModule.getterFor(PROMISE);\nvar NativePromisePrototype = NativePromise && NativePromise.prototype;\nvar PromiseConstructor = NativePromise;\nvar PromisePrototype = NativePromisePrototype;\nvar TypeError = global.TypeError;\nvar document = global.document;\nvar process = global.process;\nvar newPromiseCapability = newPromiseCapabilityModule.f;\nvar newGenericPromiseCapability = newPromiseCapability;\n\nvar DISPATCH_EVENT = !!(document && document.createEvent && global.dispatchEvent);\nvar NATIVE_REJECTION_EVENT = isCallable(global.PromiseRejectionEvent);\nvar UNHANDLED_REJECTION = 'unhandledrejection';\nvar REJECTION_HANDLED = 'rejectionhandled';\nvar PENDING = 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\nvar HANDLED = 1;\nvar UNHANDLED = 2;\nvar SUBCLASSING = false;\n\nvar Internal, OwnPromiseCapability, PromiseWrapper, nativeThen;\n\nvar FORCED = isForced(PROMISE, function () {\n  var PROMISE_CONSTRUCTOR_SOURCE = inspectSource(PromiseConstructor);\n  var GLOBAL_CORE_JS_PROMISE = PROMISE_CONSTRUCTOR_SOURCE !== String(PromiseConstructor);\n  // V8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables\n  // https://bugs.chromium.org/p/chromium/issues/detail?id=830565\n  // We can't detect it synchronously, so just check versions\n  if (!GLOBAL_CORE_JS_PROMISE && V8_VERSION === 66) return true;\n  // We need Promise#finally in the pure version for preventing prototype pollution\n  if (IS_PURE && !PromisePrototype['finally']) return true;\n  // We can't use @@species feature detection in V8 since it causes\n  // deoptimization and performance degradation\n  // https://github.com/zloirock/core-js/issues/679\n  if (V8_VERSION >= 51 && /native code/.test(PROMISE_CONSTRUCTOR_SOURCE)) return false;\n  // Detect correctness of subclassing with @@species support\n  var promise = new PromiseConstructor(function (resolve) { resolve(1); });\n  var FakePromise = function (exec) {\n    exec(function () { /* empty */ }, function () { /* empty */ });\n  };\n  var constructor = promise.constructor = {};\n  constructor[SPECIES] = FakePromise;\n  SUBCLASSING = promise.then(function () { /* empty */ }) instanceof FakePromise;\n  if (!SUBCLASSING) return true;\n  // Unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n  return !GLOBAL_CORE_JS_PROMISE && IS_BROWSER && !NATIVE_REJECTION_EVENT;\n});\n\nvar INCORRECT_ITERATION = FORCED || !checkCorrectnessOfIteration(function (iterable) {\n  PromiseConstructor.all(iterable)['catch'](function () { /* empty */ });\n});\n\n// helpers\nvar isThenable = function (it) {\n  var then;\n  return isObject(it) && isCallable(then = it.then) ? then : false;\n};\n\nvar notify = function (state, isReject) {\n  if (state.notified) return;\n  state.notified = true;\n  var chain = state.reactions;\n  microtask(function () {\n    var value = state.value;\n    var ok = state.state == FULFILLED;\n    var index = 0;\n    // variable length - can't use forEach\n    while (chain.length > index) {\n      var reaction = chain[index++];\n      var handler = ok ? reaction.ok : reaction.fail;\n      var resolve = reaction.resolve;\n      var reject = reaction.reject;\n      var domain = reaction.domain;\n      var result, then, exited;\n      try {\n        if (handler) {\n          if (!ok) {\n            if (state.rejection === UNHANDLED) onHandleUnhandled(state);\n            state.rejection = HANDLED;\n          }\n          if (handler === true) result = value;\n          else {\n            if (domain) domain.enter();\n            result = handler(value); // can throw\n            if (domain) {\n              domain.exit();\n              exited = true;\n            }\n          }\n          if (result === reaction.promise) {\n            reject(TypeError('Promise-chain cycle'));\n          } else if (then = isThenable(result)) {\n            call(then, result, resolve, reject);\n          } else resolve(result);\n        } else reject(value);\n      } catch (error) {\n        if (domain && !exited) domain.exit();\n        reject(error);\n      }\n    }\n    state.reactions = [];\n    state.notified = false;\n    if (isReject && !state.rejection) onUnhandled(state);\n  });\n};\n\nvar dispatchEvent = function (name, promise, reason) {\n  var event, handler;\n  if (DISPATCH_EVENT) {\n    event = document.createEvent('Event');\n    event.promise = promise;\n    event.reason = reason;\n    event.initEvent(name, false, true);\n    global.dispatchEvent(event);\n  } else event = { promise: promise, reason: reason };\n  if (!NATIVE_REJECTION_EVENT && (handler = global['on' + name])) handler(event);\n  else if (name === UNHANDLED_REJECTION) hostReportErrors('Unhandled promise rejection', reason);\n};\n\nvar onUnhandled = function (state) {\n  call(task, global, function () {\n    var promise = state.facade;\n    var value = state.value;\n    var IS_UNHANDLED = isUnhandled(state);\n    var result;\n    if (IS_UNHANDLED) {\n      result = perform(function () {\n        if (IS_NODE) {\n          process.emit('unhandledRejection', value, promise);\n        } else dispatchEvent(UNHANDLED_REJECTION, promise, value);\n      });\n      // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n      state.rejection = IS_NODE || isUnhandled(state) ? UNHANDLED : HANDLED;\n      if (result.error) throw result.value;\n    }\n  });\n};\n\nvar isUnhandled = function (state) {\n  return state.rejection !== HANDLED && !state.parent;\n};\n\nvar onHandleUnhandled = function (state) {\n  call(task, global, function () {\n    var promise = state.facade;\n    if (IS_NODE) {\n      process.emit('rejectionHandled', promise);\n    } else dispatchEvent(REJECTION_HANDLED, promise, state.value);\n  });\n};\n\nvar bind = function (fn, state, unwrap) {\n  return function (value) {\n    fn(state, value, unwrap);\n  };\n};\n\nvar internalReject = function (state, value, unwrap) {\n  if (state.done) return;\n  state.done = true;\n  if (unwrap) state = unwrap;\n  state.value = value;\n  state.state = REJECTED;\n  notify(state, true);\n};\n\nvar internalResolve = function (state, value, unwrap) {\n  if (state.done) return;\n  state.done = true;\n  if (unwrap) state = unwrap;\n  try {\n    if (state.facade === value) throw TypeError(\"Promise can't be resolved itself\");\n    var then = isThenable(value);\n    if (then) {\n      microtask(function () {\n        var wrapper = { done: false };\n        try {\n          call(then, value,\n            bind(internalResolve, wrapper, state),\n            bind(internalReject, wrapper, state)\n          );\n        } catch (error) {\n          internalReject(wrapper, error, state);\n        }\n      });\n    } else {\n      state.value = value;\n      state.state = FULFILLED;\n      notify(state, false);\n    }\n  } catch (error) {\n    internalReject({ done: false }, error, state);\n  }\n};\n\n// constructor polyfill\nif (FORCED) {\n  // 25.4.3.1 Promise(executor)\n  PromiseConstructor = function Promise(executor) {\n    anInstance(this, PromisePrototype);\n    aCallable(executor);\n    call(Internal, this);\n    var state = getInternalState(this);\n    try {\n      executor(bind(internalResolve, state), bind(internalReject, state));\n    } catch (error) {\n      internalReject(state, error);\n    }\n  };\n  PromisePrototype = PromiseConstructor.prototype;\n  // eslint-disable-next-line no-unused-vars -- required for `.length`\n  Internal = function Promise(executor) {\n    setInternalState(this, {\n      type: PROMISE,\n      done: false,\n      notified: false,\n      parent: false,\n      reactions: [],\n      rejection: false,\n      state: PENDING,\n      value: undefined\n    });\n  };\n  Internal.prototype = redefineAll(PromisePrototype, {\n    // `Promise.prototype.then` method\n    // https://tc39.es/ecma262/#sec-promise.prototype.then\n    then: function then(onFulfilled, onRejected) {\n      var state = getInternalPromiseState(this);\n      var reactions = state.reactions;\n      var reaction = newPromiseCapability(speciesConstructor(this, PromiseConstructor));\n      reaction.ok = isCallable(onFulfilled) ? onFulfilled : true;\n      reaction.fail = isCallable(onRejected) && onRejected;\n      reaction.domain = IS_NODE ? process.domain : undefined;\n      state.parent = true;\n      reactions[reactions.length] = reaction;\n      if (state.state != PENDING) notify(state, false);\n      return reaction.promise;\n    },\n    // `Promise.prototype.catch` method\n    // https://tc39.es/ecma262/#sec-promise.prototype.catch\n    'catch': function (onRejected) {\n      return this.then(undefined, onRejected);\n    }\n  });\n  OwnPromiseCapability = function () {\n    var promise = new Internal();\n    var state = getInternalState(promise);\n    this.promise = promise;\n    this.resolve = bind(internalResolve, state);\n    this.reject = bind(internalReject, state);\n  };\n  newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n    return C === PromiseConstructor || C === PromiseWrapper\n      ? new OwnPromiseCapability(C)\n      : newGenericPromiseCapability(C);\n  };\n\n  if (!IS_PURE && isCallable(NativePromise) && NativePromisePrototype !== Object.prototype) {\n    nativeThen = NativePromisePrototype.then;\n\n    if (!SUBCLASSING) {\n      // make `Promise#then` return a polyfilled `Promise` for native promise-based APIs\n      redefine(NativePromisePrototype, 'then', function then(onFulfilled, onRejected) {\n        var that = this;\n        return new PromiseConstructor(function (resolve, reject) {\n          call(nativeThen, that, resolve, reject);\n        }).then(onFulfilled, onRejected);\n      // https://github.com/zloirock/core-js/issues/640\n      }, { unsafe: true });\n\n      // makes sure that native promise-based APIs `Promise#catch` properly works with patched `Promise#then`\n      redefine(NativePromisePrototype, 'catch', PromisePrototype['catch'], { unsafe: true });\n    }\n\n    // make `.constructor === Promise` work for native promise-based APIs\n    try {\n      delete NativePromisePrototype.constructor;\n    } catch (error) { /* empty */ }\n\n    // make `instanceof Promise` work for native promise-based APIs\n    if (setPrototypeOf) {\n      setPrototypeOf(NativePromisePrototype, PromisePrototype);\n    }\n  }\n}\n\n$({ global: true, wrap: true, forced: FORCED }, {\n  Promise: PromiseConstructor\n});\n\nsetToStringTag(PromiseConstructor, PROMISE, false, true);\nsetSpecies(PROMISE);\n\nPromiseWrapper = getBuiltIn(PROMISE);\n\n// statics\n$({ target: PROMISE, stat: true, forced: FORCED }, {\n  // `Promise.reject` method\n  // https://tc39.es/ecma262/#sec-promise.reject\n  reject: function reject(r) {\n    var capability = newPromiseCapability(this);\n    call(capability.reject, undefined, r);\n    return capability.promise;\n  }\n});\n\n$({ target: PROMISE, stat: true, forced: IS_PURE || FORCED }, {\n  // `Promise.resolve` method\n  // https://tc39.es/ecma262/#sec-promise.resolve\n  resolve: function resolve(x) {\n    return promiseResolve(IS_PURE && this === PromiseWrapper ? PromiseConstructor : this, x);\n  }\n});\n\n$({ target: PROMISE, stat: true, forced: INCORRECT_ITERATION }, {\n  // `Promise.all` method\n  // https://tc39.es/ecma262/#sec-promise.all\n  all: function all(iterable) {\n    var C = this;\n    var capability = newPromiseCapability(C);\n    var resolve = capability.resolve;\n    var reject = capability.reject;\n    var result = perform(function () {\n      var $promiseResolve = aCallable(C.resolve);\n      var values = [];\n      var counter = 0;\n      var remaining = 1;\n      iterate(iterable, function (promise) {\n        var index = counter++;\n        var alreadyCalled = false;\n        remaining++;\n        call($promiseResolve, C, promise).then(function (value) {\n          if (alreadyCalled) return;\n          alreadyCalled = true;\n          values[index] = value;\n          --remaining || resolve(values);\n        }, reject);\n      });\n      --remaining || resolve(values);\n    });\n    if (result.error) reject(result.value);\n    return capability.promise;\n  },\n  // `Promise.race` method\n  // https://tc39.es/ecma262/#sec-promise.race\n  race: function race(iterable) {\n    var C = this;\n    var capability = newPromiseCapability(C);\n    var reject = capability.reject;\n    var result = perform(function () {\n      var $promiseResolve = aCallable(C.resolve);\n      iterate(iterable, function (promise) {\n        call($promiseResolve, C, promise).then(capability.resolve, reject);\n      });\n    });\n    if (result.error) reject(result.value);\n    return capability.promise;\n  }\n});\n","var hasOwn = require('../internals/has-own-property');\nvar ownKeys = require('../internals/own-keys');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar definePropertyModule = require('../internals/object-define-property');\n\nmodule.exports = function (target, source) {\n  var keys = ownKeys(source);\n  var defineProperty = definePropertyModule.f;\n  var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\n  for (var i = 0; i < keys.length; i++) {\n    var key = keys[i];\n    if (!hasOwn(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n  }\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\nvar Iterators = require('../internals/iterators');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar ArrayPrototype = Array.prototype;\n\n// check on default Array iterator\nmodule.exports = function (it) {\n  return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it);\n};\n","'use strict';\nvar aCallable = require('../internals/a-callable');\n\nvar PromiseCapability = function (C) {\n  var resolve, reject;\n  this.promise = new C(function ($$resolve, $$reject) {\n    if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n    resolve = $$resolve;\n    reject = $$reject;\n  });\n  this.resolve = aCallable(resolve);\n  this.reject = aCallable(reject);\n};\n\n// `NewPromiseCapability` abstract operation\n// https://tc39.es/ecma262/#sec-newpromisecapability\nmodule.exports.f = function (C) {\n  return new PromiseCapability(C);\n};\n","var uncurryThis = require('../internals/function-uncurry-this');\n\nmodule.exports = uncurryThis([].slice);\n","var global = require('../internals/global');\nvar TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar isCallable = require('../internals/is-callable');\nvar classofRaw = require('../internals/classof-raw');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar Object = global.Object;\n\n// ES3 wrong here\nvar CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n  try {\n    return it[key];\n  } catch (error) { /* empty */ }\n};\n\n// getting tag from ES6+ `Object.prototype.toString`\nmodule.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) {\n  var O, tag, result;\n  return it === undefined ? 'Undefined' : it === null ? 'Null'\n    // @@toStringTag case\n    : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG)) == 'string' ? tag\n    // builtinTag case\n    : CORRECT_ARGUMENTS ? classofRaw(O)\n    // ES3 arguments fallback\n    : (result = classofRaw(O)) == 'Object' && isCallable(O.callee) ? 'Arguments' : result;\n};\n","var shared = require('../internals/shared');\nvar uid = require('../internals/uid');\n\nvar keys = shared('keys');\n\nmodule.exports = function (key) {\n  return keys[key] || (keys[key] = uid(key));\n};\n","// toObject with fallback for non-array-like ES3 strings\nvar IndexedObject = require('../internals/indexed-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nmodule.exports = function (it) {\n  return IndexedObject(requireObjectCoercible(it));\n};\n","var fails = require('../internals/fails');\nvar global = require('../internals/global');\n\n// babel-minify and Closure Compiler transpiles RegExp('.', 's') -> /./s and it causes SyntaxError\nvar $RegExp = global.RegExp;\n\nmodule.exports = fails(function () {\n  var re = $RegExp('.', 's');\n  return !(re.dotAll && re.exec('\\n') && re.flags === 's');\n});\n","/* eslint-disable es/no-symbol -- required for testing */\nvar NATIVE_SYMBOL = require('../internals/native-symbol');\n\nmodule.exports = NATIVE_SYMBOL\n  && !Symbol.sham\n  && typeof Symbol.iterator == 'symbol';\n","var global = require('../internals/global');\n\nmodule.exports = global.Promise;\n"],"sourceRoot":""}
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/markdown.html b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/markdown.html
new file mode 100644
index 0000000..d34b7b1
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/markdown.html
@@ -0,0 +1,156 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<title>markdown缂栬緫鍣�</title>
+    <script type="text/javascript" src="https://cdn.bootcss.com/jquery/1.8.2/jquery.min.js"></script>
+    <script src="https://cdn.bootcdn.net/ajax/libs/marked/2.1.3/marked.js"></script>
+    <link href="http://cdn.bootcss.com/highlight.js/8.0/styles/monokai_sublime.min.css" rel="stylesheet">
+    <script src="http://cdn.bootcss.com/highlight.js/8.0/highlight.min.js"></script>
+
+    <style type="text/css">
+        html, body {
+            margin: 0;
+            padding: 0;
+            font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+            color: #333;
+            background-color: #fbfbfb;
+            height: 100%;
+        }
+        textarea {
+            font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
+            font-size: 12px;
+            resize: none;
+        }
+        header {
+            padding-top: 10px;
+            display: flex;
+            height: 58px;
+        }
+        header h1 {
+            margin: 0;
+        }
+        .containers {
+            display: flex;
+            height: calc(100vh - 10px);
+        }
+        .container {
+            flex-basis: 50%;
+            padding: 5px;
+            display: flex;
+            flex-direction: column;
+            height: 100%;
+            box-sizing: border-box;
+        }
+        .pane, .inputPane {
+            margin-top: 5px;
+            padding: 0.6em;
+            border: 1px solid #ccc;
+            overflow: auto;
+            flex-grow: 1;
+            flex-shrink: 1;
+        }
+    </style>
+</head>
+
+<body>
+    <div class="containers">
+        <div class="container">
+            <input type="button" id="clear" value="娓呴櫎" style="width: 100px;height: 25px"/>
+            <textarea  id="markedSource" class="inputPane"></textarea>
+        </div>
+        <div class="container">
+            <select id="outputType" style="width: 150px;height: 25px">
+                <option value="markedResult">markedResult</option>
+                <option value="html">HTML Source</option>
+                <option value="lexer">Lexer Data</option>
+            </select>
+            <div id="markedResult" class="pane"></div>
+            <textarea id="html" class="pane" readonly="readonly" style="display: none;"></textarea>
+            <textarea id="lexer" class="pane" readonly="readonly" style="display: none;"></textarea>
+            <textarea id="quickref" class="pane" readonly="readonly" style="display: none;"></textarea>
+        </div>
+    </div>
+
+
+    <script>
+        var rendererMD = new marked.Renderer();
+        marked.setOptions({
+            renderer: rendererMD,
+            gfm: true,
+            tables: true,
+            breaks: false,//鍏佽鍥炶溅鎹㈣銆傝閫夐」瑕佹眰 gfm 涓簍rue
+            pedantic: false,
+            sanitize: false,//涓嶈緭鍑篐TML
+            smartLists: true,
+            smartypants: false,
+            highlight: function (code) {
+                return hljs.highlightAuto(code).value;
+            }
+        });
+
+        // 鐩戝惉杈撳叆鍊煎彉鍖�
+        $('#markedSource').on('keyup', (cm) => {
+            document.getElementById('markedResult').innerHTML = marked(cm.currentTarget.value);
+
+            var lexed = marked.lexer(cm.currentTarget.value);
+            var lexedList = jsonString(lexed);
+            var parsed = marked.parser(lexed);
+            document.getElementById('lexer').value=lexedList
+            document.getElementById('html').value=parsed
+        })
+
+        $('#clear').on('click',function (e){
+            document.getElementById('markedSource').value = '';
+            document.getElementById('markedResult').innerHTML= '';
+        })
+        $('#outputType').on('change',function (e){
+            for(var i = 0; i< $('.pane').length; i++) {
+                if ($('.pane')[i].id === e.currentTarget.value) {
+                    $('.pane')[i].style.display = '';
+                    active = $('.pane')[i];
+                } else {
+                    $('.pane')[i].style.display = 'none';
+                }
+            }
+        })
+
+        function stringRepeat(char, times) {
+            var s = '';
+            for (var i = 0; i < times; i++) {
+                s += char;
+            }
+            return s;
+        }
+        function jsonString(input, level) {
+            level = level || 0;
+            if (Array.isArray(input)) {
+                if (input.length === 0) {
+                    return '[]';
+                }
+                var items = [],
+                    i;
+                if (!Array.isArray(input[0]) && typeof input[0] === 'object' && input[0] !== null) {
+                    for (i = 0; i < input.length; i++) {
+                        items.push(stringRepeat(' ', 2 * level) + jsonString(input[i], level + 1));
+                    }
+                    return '[\n' + items.join('\n') + '\n]';
+                }
+                for (i = 0; i < input.length; i++) {
+                    items.push(jsonString(input[i], level));
+                }
+                return '[' + items.join(', ') + ']';
+            } else if (typeof input === 'object' && input !== null) {
+                var props = [];
+                for (var prop in input) {
+                    props.push(prop + ':' + jsonString(input[prop], level));
+                }
+                return '{' + props.join(', ') + '}';
+            } else {
+                return JSON.stringify(input);
+            }
+        }
+
+    </script>
+</body>
+</html>
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/markdown.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/markdown.js
new file mode 100644
index 0000000..6c9f52b
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/markdown.js
@@ -0,0 +1,350 @@
+/**
+ * markdown缂栬緫鍣ㄩ〉闈�
+ * @author weidy
+ * @date 2021-11-29
+ */
+layui.define(['layer','element','form','table','dynamicCondition','upload' ],function(exports){
+    var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "platform/objectService/markdown";
+        this.moduleKey = "markdown";
+        this.backPath =  configData.adminServicePath;
+        this.url = {
+            controller:'helpDocumentController/',
+            createOrGetContentByOid:'createOrGetContentByOid',
+            saveContentByOid:'saveContentByOid',
+            uploadPic:'uploadPic',
+            gridImageInfo:'gridImageInfo'
+        };
+        this.getContent=function(){
+            var that = this;
+            var html = "";
+            html = [
+                '<div class="layui-layout" style="display:block;overflow-y: hidden">',
+                    '<div class="layui-layout-border" style="display:block;margin-top:0px; " id="border_',that.id,'">',
+                        '<div class="layui-center" style="overflow-y:auto;">',
+                            this.getmarkdownHtml(),
+                        '</div>',
+                    '</div>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getmarkdownHtml=function (){
+            var that=this;
+            return '    <link href="style/css/markdown.min.css" rel="stylesheet" type="text/css"/>' +
+                '<style type="text/css">\n' +
+                '        html, body {\n' +
+                '            margin: 0;\n' +
+                '            padding: 0;\n' +
+                '            font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;\n' +
+                '            color: #333;\n' +
+                '            background-color: #fbfbfb;\n' +
+                '            height: 100%;\n' +
+                '        }\n' +
+                '        textarea {\n' +
+                '            font-family: Menlo, Monaco, Consolas, "Courier New", monospace;\n' +
+                '            font-size: 12px;\n' +
+                '            resize: none;\n' +
+                '        }\n' +
+                '        header {\n' +
+                '            padding-top: 10px;\n' +
+                '            display: flex;\n' +
+                '            height: 58px;\n' +
+                '        }\n' +
+                '        header h1 {\n' +
+                '            margin: 0;\n' +
+                '        }\n' +
+                '        .containers {\n' +
+                '            display: flex;\n' +
+                '            height: calc(100vh - 180px);\n' +
+                '        }\n' +
+                '        .container {\n' +
+                '            width: 50%;\n' +
+                '            padding: 5px;\n' +
+                '            display: flex;\n' +
+                '            flex-direction: column;\n' +
+                '            height: 100%;\n' +
+                '            box-sizing: border-box;\n' +
+                '        }\n' +
+                '        .pane, .inputPane {\n' +
+                '            margin-top: 5px;\n' +
+                '            padding: 0.6em;\n' +
+                '            border: 1px solid #ccc;\n' +
+                '            overflow: auto;\n' +
+                '            flex-grow: 1;\n' +
+                '            flex-shrink: 1;\n' +
+                '            flex:1;'+
+                '        }\n' +
+                '        .btns{\n' +
+                '            display: flex;\n' +
+                '        }\n' +
+                '        .btns input{\n' +
+                '            margin-right: 20px;\n' +
+                '        }\n' +
+                '        .img_content ul{\n' +
+                '            list-style: none;\n' +
+                '            margin: 10px 20px;\n' +
+                '            padding: 0;\n' +
+                '        }\n' +
+                '        .img_content li{\n' +
+                '            display: flex;\n' +
+                '            align-items: center;\n' +
+                '            padding: 10px 0;\n' +
+                '            border-bottom: 1px solid #efefef;\n' +
+                '        }\n' +
+                '        .img_content li img{\n' +
+                '            width: 150px;\n' +
+                '            margin-right: 20px;\n' +
+                '        }' +
+                '    </style>' +
+                '<div class="containers" id="containers'+that.sourceData.oid+'">\n' +
+                '        <div class="container" style="width: 40%">\n' +
+                '            <div class="btns">\n' +
+                '                <input type="button" id="clear'+that.sourceData.oid+'" oid="'+that.sourceData.oid+'" value="娓呴櫎" style="width: 80px;height: 25px"/>\n' +
+                '                <input type="button" id="save'+that.sourceData.oid+'" oid="'+that.sourceData.oid+'" value="淇濆瓨" style="width: 80px;height: 25px"/>\n' +
+                '                <input type="button" id="btnimages'+that.sourceData.oid+'" oid="'+that.sourceData.oid+'" value="宸蹭笂浼犲浘鐗�" style="width: 80px;height: 25px"/>\n' +
+                '                <input type="button" id="uploadmdimg'+that.sourceData.oid+'" name="uploader-input" oid="'+that.sourceData.oid+'" class="uploader-file" value="涓婁紶鍥剧墖" style="width: 80px;height: 25px">\n' +
+                '            </div>\n' +
+                '            <textarea  id="markedSource'+that.sourceData.oid+'" class="inputPane" oid="'+that.sourceData.oid+'"></textarea>\n' +
+                '        </div>\n' +
+                '        <div class="container" style="width: 60%">\n' +
+                '            <select id="outputType'+that.sourceData.oid+'" oid="'+that.sourceData.oid+'" style="width: 150px;height: 25px;visibility: hidden">\n' +
+                '                <option value="markedResult">markedResult</option>\n' +
+                '                <option value="html">HTML Source</option>\n' +
+                '                <option value="lexer">Lexer Data</option>\n' +
+                '            </select>\n' +
+                '            <div id="markedResult'+that.sourceData.oid+'" class="pane"><div class="markdownDiv"></div></div>\n' +
+                '            <textarea id="html'+that.sourceData.oid+'" class="pane" readonly="readonly" style="display: none;"></textarea>\n' +
+                '            <textarea id="lexer'+that.sourceData.oid+'" class="pane" readonly="readonly" style="display: none;"></textarea>\n' +
+                '        </div>\n' +
+                '    </div>'
+        };
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            this.renderMD()
+        };
+        this.renderMD=function (){
+            var that=this;
+            var rendererMD = new marked.Renderer();
+            marked.setOptions({
+                renderer: rendererMD,
+                gfm: true,
+                tables: true,
+                breaks: false,//鍏佽鍥炶溅鎹㈣銆傝閫夐」瑕佹眰 gfm 涓簍rue
+                pedantic: false,
+                sanitize: false,//涓嶈緭鍑篐TML
+                smartLists: true,
+                smartypants: false,
+                highlight: function (code) {
+                    return hljs.highlightAuto(code).value;
+                }
+            });
+
+            $webUtil.ajax('get',this.url.controller+this.url.createOrGetContentByOid,{oid:this.sourceData.oid},function (result) {
+                if (result.success) {
+                    if (result.obj) {
+                        $('#markedSource'+that.sourceData.oid).val(result.obj)
+                        document.getElementById('markedResult'+that.sourceData.oid).firstChild.innerHTML = marked(result.obj);
+
+                        var lexed = marked.lexer(result.obj);
+                        var lexedList = that.jsonString(lexed);
+                        var parsed = marked.parser(lexed);
+                        document.getElementById('lexer'+that.sourceData.oid).value=lexedList
+                        document.getElementById('html'+that.sourceData.oid).value=parsed
+                    }
+                } else {
+                    webUtil.showErrorMsg(result.msg);
+                }
+            },function (xhr,error) {
+                $webUtil.showDebugMsg(error);
+            },this.backPath);
+            this.bind()
+            this.upload(that.sourceData.oid);
+        }
+
+        this.bind=function (){
+            var that=this;
+            // 鐩戝惉杈撳叆鍊煎彉鍖�
+            $('#markedSource'+that.sourceData.oid).on('keyup', function(cm){
+                var oid=$(this).attr('oid')
+                document.getElementById('markedResult'+oid).firstChild.innerHTML = marked(cm.currentTarget.value);
+
+                var lexed = marked.lexer(cm.currentTarget.value);
+                var lexedList = that.jsonString(lexed);
+                var parsed = marked.parser(lexed);
+                document.getElementById('lexer'+oid).value=lexedList
+                document.getElementById('html'+oid).value=parsed
+            })
+
+            $('#clear'+that.sourceData.oid).on('click',function (e){
+                var oid=$(this).attr('oid')
+                document.getElementById('markedSource'+oid).value = '';
+                document.getElementById('markedResult'+oid).firstChild.innerHTML= '';
+            })
+            $('#save'+that.sourceData.oid).on('click',function (e){
+                var oid=$(this).attr('oid')
+                $webUtil.ajax('post',that.url.controller+that.url.saveContentByOid,{oid:oid,content:$('#markedSource'+oid).val()},function(result){
+                    if(result.success){
+                        $webUtil.showMsgFromResult(result,"淇濆瓨鎴愬姛");
+                    }else{
+                        $webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    $webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            })
+            $('#outputType'+that.sourceData.oid).on('change',function (e){
+                var oid=$(this).attr('oid')
+                var panes=$('#containers'+oid+' .pane')
+                for(var i = 0; i< panes.length; i++) {
+                    if (panes[i].id === e.currentTarget.value+oid) {
+                        panes[i].style.display = '';
+                    } else {
+                        panes[i].style.display = 'none';
+                    }
+                }
+            })
+
+            //鏄剧ず宸蹭笂浼犲浘鐗�
+            $('#btnimages'+that.sourceData.oid).on('click',function (){
+                var oid=$(this).attr('oid')
+                var imglayer=layer.open({
+                    title:'宸蹭笂浼犲浘鐗�',
+                    type: 1,
+                    skin: 'layui-layer-rim', //鍔犱笂杈规
+                    area: ['1200px', '600px'], //瀹介珮
+                    content: '<div class="img_content" id="img_content'+oid+'"><ul></ul><input type="text" style="opacity: 0;width: 1px" id="imgCopy'+oid+'" value="" /></div>',
+                    success: function (layero) {
+                        $webUtil.ajax('get',that.url.controller+that.url.gridImageInfo,{'conditionMap["ownbizOid"]':oid},function (result) {
+                            if (result.success) {
+                                if (result.data && result.data.length>0) {
+                                    var list=[]
+                                    var imgJson=[]
+                                    $.each(result.data,function (i,item){
+                                        item.url=that.backPath+item.url;
+                                        list.push('<li>' +
+                                                '<img src="'+item.url+'" alt=""/>' +
+                                                '<div>' +item.url+
+                                                    '<button class="btn btn-img-copy" imgsrc="'+item.url+'" style="margin-left: 20px">澶嶅埗鍥剧墖鍦板潃</button>' +
+                                                    '<button class="btn btn-imgDiv-copy" imgsrc="'+item.url+'" style="margin-left: 20px">澶嶅埗img鏍囩</button>' +
+                                                '</div>' +
+                                            '</li>');
+                                        imgJson.push({
+                                            "alt": item.url,
+                                            "pid": item.oid, //鍥剧墖id
+                                            "src": item.url, //鍘熷浘鍦板潃
+                                            "thumb":item.url //缂╃暐鍥惧湴鍧�
+                                        })
+                                    })
+                                    $('#img_content'+oid+' ul').append(list)
+                                    $('#img_content'+oid+' img').on('click',function (){
+                                        layer.photos({
+                                            photos: {
+                                                "title": "", //鐩稿唽鏍囬
+                                                "id": 123, //鐩稿唽id
+                                                "start": 0, //鍒濆鏄剧ず鐨勫浘鐗囧簭鍙凤紝榛樿0
+                                                "data":imgJson
+                                            }
+                                            ,shift:5
+                                        });
+                                    })
+                                    //澶嶅埗鎸夐挳
+                                    $('#img_content'+oid+' .btn-img-copy').on('click', function() {
+                                        var input = document.getElementById('imgCopy'+oid);
+                                        input.value='![avatar]('+$(this).attr('imgsrc')+')'
+                                        $('#markedSource'+oid).val($('#markedSource'+oid).val()+input.value);
+                                        document.getElementById('markedResult'+oid).firstChild.innerHTML = marked( $('#markedSource'+oid).val());
+                                        // 閫変腑鏂囨湰
+                                        input.select();
+                                        // 鎵ц娴忚鍣ㄥ鍒跺懡浠�
+                                        document.execCommand("copy");
+                                        //alert("鎴愬姛澶嶅埗鍒板壀鍒囩増锛�");
+                                        layer.close(imglayer)
+                                    })
+                                    //澶嶅埗div鎸夐挳
+                                    $('#img_content'+oid+' .btn-imgDiv-copy').on('click', function() {
+                                        var input = document.getElementById('imgCopy'+oid);
+                                        input.value='<div style="text-align:center;margin:10px 0"><img src="'+$(this).attr('imgsrc')+'"/></div>'
+                                        $('#markedSource'+oid).val($('#markedSource'+oid).val()+input.value);
+                                        document.getElementById('markedResult'+oid).firstChild.innerHTML = marked( $('#markedSource'+oid).val());
+                                        // 閫変腑鏂囨湰
+                                        input.select();
+                                        // 鎵ц娴忚鍣ㄥ鍒跺懡浠�
+                                        document.execCommand("copy");
+                                        //alert("鎴愬姛澶嶅埗鍒板壀鍒囩増锛�");
+                                        layer.close(imglayer)
+                                    })
+                                }
+                            } else {
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function (xhr,error) {
+                            $webUtil.showDebugMsg(error);
+                        },that.backPath);
+
+
+
+                    }
+                });
+            })
+
+        }
+
+        this.upload=function (oid){
+            var that=this;
+            //鏂囦欢涓婁紶
+            layui.upload.render({
+                elem: '#uploadmdimg'+oid
+                ,url: that.backPath+that.url.controller+that.url.uploadPic
+                ,data: {ownbizOid:oid}
+                ,acceptMime: 'image/*'
+                ,done: function(result, index, upload){ //涓婁紶鍚庣殑鍥炶皟
+                    if(result.success) {
+                        $webUtil.showMsgFromResult(result, "鍥剧墖涓婁紶鎴愬姛");
+                    }
+                }
+                ,accept: 'images'
+            })
+        }
+
+        this.stringRepeat=function (char, times) {
+            var s = '';
+            for (var i = 0; i < times; i++) {
+                s += char;
+            }
+            return s;
+        }
+        this.jsonString=function (input, level) {
+            level = level || 0;
+            if (Array.isArray(input)) {
+                if (input.length === 0) {
+                    return '[]';
+                }
+                var items = [],
+                    i;
+                if (!Array.isArray(input[0]) && typeof input[0] === 'object' && input[0] !== null) {
+                    for (i = 0; i < input.length; i++) {
+                        items.push(this.stringRepeat(' ', 2 * level) + this.jsonString(input[i], level + 1));
+                    }
+                    return '[\n' + items.join('\n') + '\n]';
+                }
+                for (i = 0; i < input.length; i++) {
+                    items.push(this.jsonString(input[i], level));
+                }
+                return '[' + items.join(', ') + ']';
+            } else if (typeof input === 'object' && input !== null) {
+                var props = [];
+                for (var prop in input) {
+                    props.push(prop + ':' + this.jsonString(input[prop], level));
+                }
+                return '{' + props.join(', ') + '}';
+            } else {
+                return JSON.stringify(input);
+            }
+        }
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/md.html b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/md.html
new file mode 100644
index 0000000..69c3845
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/objectService/md.html
@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="UTF-8" />
+<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1">
+<meta http-equiv="X-UA-Compatible" content="IE=edge" />
+    <script src="../../../../jquery/jquery-1.8.2.min.js" type="text/javascript" charset="UTF-8"></script>
+    <script src="../../../../jquery/jquery.cookie.js" type="text/javascript" charset="UTF-8"></script>
+    <script src="../../../../markdown/marked.min.js" type="text/javascript" charset="UTF-8"></script>
+    <link href="../../../../../style/css/markdown.min.css" rel="stylesheet" type="text/css"/>
+</head>
+<body>
+
+</body>
+<script>
+    $(document).ready(function(){
+        $.ajaxSetup({
+            cache:false,
+            xhr: function() {
+                if (window.ActiveXObject) {
+                    return new window.ActiveXObject("Microsoft.XMLHTTP");
+                } else {
+                    return new window.XMLHttpRequest();
+                }
+            }
+        });
+        var param = {};
+        //鑾峰彇杩炴帴鍦板潃
+        var url = document.location.toString();
+        //鍒嗛殧寮�杩炴帴,鐢�?鎶婁紶鐨勫�煎彇鍑烘潵
+        var arrObj = url.split("?");
+        //鍒ゆ柇杩炴帴閲岄潰鏄笉鏄湁鍊�,濡傛灉鏈夊垯鎵ц涓嬮潰鎿嶄綔
+        if (arrObj.length > 1) {
+            //鍙栧嚭鎵�鏈変紶鐨勫��
+            var arrPara = arrObj[1].split("&");
+            var arr;
+            for (var i = 0; i < arrPara.length; i++) {
+                arr = arrPara[i].split("=");
+                //鎶婄浜屼釜鍊艰祴鍊肩粰绗竴涓��
+                param[arr[0]] = arr[1];
+            }
+        }
+        $.ajax({
+            type:'get',
+            url:param.url,
+            dataType:'html',
+            success:function (res) {
+                $("body").html(marked(res));
+            }
+        });
+    });
+</script>
+</html>
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/orgs/OrgPosition.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/orgs/OrgPosition.js
new file mode 100644
index 0000000..01649f1
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/orgs/OrgPosition.js
@@ -0,0 +1,372 @@
+/**
+ * 宀椾綅绠$悊椤甸潰
+ * @author weidy
+ * @date 2020-10-30
+ */
+layui.define(['layer','element','form','table','dynamicCondition','upload' ],function(exports){
+        var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "platform/orgs/OrgPosition";
+        this.moduleKey = "OrgPosition";
+        this.backPath =  configData.compatibility?path:configData.frameworkPath;
+        this.url = {
+            controller:'orgPositionController/',
+            dataGrid:'gridOrgPosition',
+            addSave:'addSave',
+            editSave:'editSave',
+            deleteUrl:'deleteData',
+            enableData: 'enableData',
+            disableData: 'disableData',
+            downloadImportTemplate:'downloadImportTemplate',
+            importData : 'importData',
+            exportData : 'exportData',
+             getObjectByOid:'getObjectByOid'
+        };
+        this.getContent=function(){
+            var that = this;
+            var html = "";
+            html = [
+                '<div class="layui-layout" style="display:block;overflow-y: hidden">',
+                    '<div class="layui-layout-border" style="display:block;margin-top:0px; " id="border_',that.id,'">',
+                        '<div class="layui-center" style="overflow-y:auto;">',
+                            that.getToolbarHtml(),
+                            '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                            '<div id="toolbar_column_',that.id ,'" style="display:none;"></div>',
+                        '</div>',
+                    '</div>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EXPORT"><i class="layui-icon layui-icon-export"></i>瀵煎嚭</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_IMPORT"><i class="layui-icon layui-icon-upload-drag"></i>瀵煎叆</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DISABLE"><i class="layui-icon layui-icon-404"></i>鍋滅敤</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ENABLE"><i class="layui-icon layui-icon-ok-circle"></i>鍚敤</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.createSearchHtml({id:"缂栧彿",name:"鍚嶇О"} ,$("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+        };
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            that.initMainTable();
+            that.createSearchHtml();
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var tableWidth = $("#border_" + that.id).width()-225;
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                width:tableWidth,
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'EDIT'){
+                                that.addOrEdit(false,data.oid);
+                            }
+                        });
+                    }else{
+                        if(total>0) {
+                            table.selectRecord('table_' + that.id, {index:0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                }
+            };
+            if(parentFieldName){
+                options.treeConfig = {
+                    treepid:parentFieldName,
+                    treeid:'id',
+                    showField:'name'
+                };
+            }
+            table.render(options);
+            document.getElementById("toolbar_column_" + that.id).innerHTML =
+                '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>';
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),
+                    {
+                        title: '缂栧彿',
+                        field: 'id',
+                        width: 150
+                    },                    {
+                        title: '鍚嶇О',
+                        field: 'name',
+                        width: 150
+                    },                    {
+                        title: '宀椾綅绯诲垪',
+                        field: 'positionClassify',
+                        width: 150
+                    },                    {
+                        title: '鎻忚堪',
+                        field: 'description',
+                        width: 150
+                    },                    {
+                        title: '鐘舵��',
+                        field: 'lcStatusText',
+                        width: 150
+                    }        ];
+            }
+        };
+
+        this.getFormItems = function(onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [
+                {
+                    field: 'id',
+                    title: '缂栧彿',
+                    required: true,
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'name',
+                    title: '鍚嶇О',
+                    required: true,
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'positionClassify',
+                    title: '宀椾綅绯诲垪',
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'description',
+                    title: '鎻忚堪',
+                    type: 'text',
+                    readOnly:onlyShow
+                } ];
+        };
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            that.addOrEdit(false,oid);
+        };
+        this.addOrEdit = function(add,oid) {
+            var that = this;
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var addSaveIndex =webUtil.dialog({
+                title:add?'娣诲姞宀椾綅绠$悊':'淇敼宀椾綅绠$悊',
+                btn:['淇濆瓨','鍙栨秷'],
+                //skin:'layui-layer-lan',
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                //fullScreen:true,
+                area: ['920px', '300px'],
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getFormItems(false),
+                        function () {
+                            if(!add){
+                                form.load(filter,{
+                                    backPath:that.backPath,
+                                    url:that.url.controller + that.url.getObjectByOid,
+                                    method:'get',
+                                    params:{
+                                        oid:oid
+                                    }
+                                });
+                            }else{
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+                        }, {}, {defaultColumnOneRow: 2});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        var url = that.url.controller + (add?that.url.addSave:that.url.editSave);
+                        webUtil.ajax(add?'post':'put',url,values,function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts= webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+        this.refresh = function () {
+            var that = this;
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+        this.DISABLE = function () {
+            var that = this;
+            that.disableOrEnable(false);
+        };
+        this.ENABLE = function () {
+            var that = this;
+            that.disableOrEnable(true);
+        };
+        this.disableOrEnable = function (enable) {
+            var that = this;
+            var oid ;
+            var ts ;
+            oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            ts = webUtil.getOidFromGrid("table_" + that.id,false,false,'ts');
+            webUtil.post(that.url.controller + (enable?that.url.enableData:that.url.disableData),{
+                oid:oid,
+                ts:ts
+                },function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,(enable?'鍚敤鎴愬姛':'鍋滅敤鎴愬姛'));
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+        };
+
+        this.EXPORT = function () {
+            var that = this;
+            var iframeId = MD5("export" +webUtil.getSystemVar(webUtil.systemValueKey.currentDateTimeSSS) +webUtil.getSystemVar(webUtil.systemValueKey.userOid));
+            var data = {};
+            data[TOKEN_KEY] = webUtil.getToken();
+            data['downloadUUID'] = iframeId;
+            webUtil.fileDownloadPost(that.backPath + that.url.controller + that.url.exportData,data);
+        };
+        this.IMPORT = function () {
+            var that = this;
+            var filter =that.id + "_upload";
+            var form = layui.form;
+            var uploadIndex = webUtil.dialog({
+                title:'瀵煎叆宀椾綅绠$悊',
+                btn:['涓嬭浇瀵煎叆妯℃澘','鍙栨秷'],
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" enctype="multipart/form-data"></form>',
+                area: ['300px', '300px'],
+                resize:false,
+                success:function(layero){
+                    //濡傛灉瀵煎叆鏈夊叾浠栨搷浣滐紝鍦ㄧ浜屼釜鍙傛暟涓坊鍔�
+                    form.addItems(filter,[],function(){
+                        $("#form_" + filter).append('<button type="button" class="layui-btn" id="' + that.id + '_upload_form_file" style="margin-left:100px;margin-top:80px;"><i class="layui-icon">&#xe67c;</i>閫夋嫨鏂囦欢鍚庤嚜鍔ㄥ鍏�</button>&nbsp;&nbsp;&nbsp;&nbsp;');
+                        var upload = layui.upload;
+                        //鎵ц瀹炰緥
+                        var uploadInst = upload.render({
+                            elem: '#' + that.id + '_upload_form_file' //缁戝畾鍏冪礌
+                            ,accept:'file'
+                            ,acceptMime:'file/*'
+                            ,exts:'xls|xlsx'
+                            ,url: that.backPath + that.url.controller + that.url.importData
+                            ,done: function(result){
+                                if(result.success){
+                                    layer.close(uploadIndex);
+                                    webUtil.showMsgFromResult(result,"瀵煎叆鎴愬姛");
+                                    that.refresh();
+                                }else{
+                                    webUtil.showErrorMsg(result.msg);
+                                }
+                            }
+                            ,error: function(){
+                                //璇锋眰寮傚父鍥炶皟
+                                 webUtil.showErrorMsg("涓婁紶寮傚父");
+                            }
+                        });
+                    },{},{
+                        defaultColumnOneRow:1
+                    });
+                },
+                yes:function(){
+                    var iframeId = MD5("downloadImportTemplate" +webUtil.getSystemVar(webUtil.systemValueKey.currentDateTimeSSS)  +webUtil.getSystemVar(webUtil.systemValueKey.userOid));
+                    webUtil.fileDownload(that.backPath + that.url.controller + that.url.downloadImportTemplate+ "?" + TOKEN_KEY + "=" + webUtil.getToken()  + "&downloadUUID=" + iframeId );
+                }
+            });
+        };
+        this.ADVQUERY = function () {
+            var that = this;
+            if(!that.serinorQueryInstance) {
+                var dynamicCondition = layui.dynamicCondition;
+                $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar' + that.id + '" class="layui-inline"></div>');
+                var dataFields = that.columns;
+                that.serinorQueryInstance = dynamicCondition.create({
+                    fields: dataFields//鏌ヨ瀛楁
+                    , tableId: "table_" + that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                    , type: "complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                    //,conditionTextId:"#toolbar"+that.id//楂樼骇鏌ヨ 鎸夐挳鎵�鍦ㄧ殑div
+                    //,popupShowQueryBtn: true//鏄剧ず楂樼骇鏌ヨ鎸夐挳
+                    , queryCallBack: function (requestData) {//鏌ヨ涔嬪悗鐨刢allback
+                        //console.log(JSON.stringify(requestData))
+                    }
+                });
+            }
+            that.serinorQueryInstance.open();
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/orgs/orgDuty.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/orgs/orgDuty.js
new file mode 100644
index 0000000..c0e9483
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/orgs/orgDuty.js
@@ -0,0 +1,371 @@
+/**
+ * 鑱屽姟绠$悊椤甸潰
+ * @author weidy
+ * @date 2020-08-12
+ */
+layui.define(['layer','element','form','table','dynamicCondition','upload' ],function(exports){
+        var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "platform/orgs/orgDuty";
+        this.moduleKey = "OrgDuty";
+        this.backPath =  configData.compatibility?path:configData.frameworkPath;
+        this.url = {
+            controller:'orgDutyController/',
+            dataGrid:'gridOrgDuty',
+            addSave:'addSave',
+            editSave:'editSave',
+            deleteUrl:'delOrgDuty',
+            enableData: 'enableData',
+            disableData: 'disableData',
+            downloadImportTemplate:'downloadImportTemplate',
+            importData : 'importData',
+            exportData : 'exportData',
+             getObjectByOid:'getObjectByOid'
+        };
+        this.getContent=function(){
+            var that = this;
+            var html = "";
+            html = [
+                '<div class="layui-layout" style="display:block;overflow-y: hidden">',
+                    '<div class="layui-layout-border" style="display:block;margin-top:0px; " id="border_',that.id,'">',
+                        '<div class="layui-center" style="overflow-y:auto;">',
+                            that.getToolbarHtml(),
+                            '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                            '<div id="toolbar_column_',that.id ,'" style="display:none;"></div>',
+                        '</div>',
+                    '</div>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ENABLE"><i class="layui-icon layui-icon-ok-circle"></i>鍚敤</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DISABLE"><i class="layui-icon layui-icon-404"></i>鍋滅敤</button>',
+                    // '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_IMPORT"><i class="layui-icon layui-icon-upload-drag"></i>瀵煎叆</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                    // '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EXPORT"><i class="layui-icon layui-icon-export"></i>瀵煎嚭</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.createSearchHtml({id:"鑱屽姟缂栧彿",name:"鑱屽姟鍚嶇О"} ,$("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+        };
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            that.initMainTable();
+            that.createSearchHtml();
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var tableWidth = $("#border_" + that.id).width()-225;
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                width:tableWidth,
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'EDIT'){
+                                that.addOrEdit(false,data.oid);
+                            }
+                        });
+                    }else{
+                        if(total>0) {
+                            table.selectRecord('table_' + that.id, {index:0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                }
+            };
+            if(parentFieldName){
+                options.treeConfig = {
+                    treepid:parentFieldName,
+                    treeid:'id',
+                    showField:'name'
+                };
+            }
+            table.render(options);
+            document.getElementById("toolbar_column_" + that.id).innerHTML =
+                '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>';
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),
+                    {
+                        title: '缂栧彿',
+                        field: 'id',
+                        width: 150
+                    },                    {
+                        title: '鍚嶇О',
+                        field: 'name',
+                        width: 150
+                    },                    {
+                        title: '鑱屽姟绫诲埆',
+                        field: 'dutyClassify',
+                        width: 150
+                    },                    {
+                        title: '鎻忚堪',
+                        field: 'description',
+                        width: 150
+                    },                    {
+                        title: '鐘舵��',
+                        field: 'lcStatusText',
+                        width: 150
+                    }        ];
+            }
+        };
+
+        this.getFormItems = function(onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [
+                {
+                    field: 'id',
+                    title: '缂栧彿',
+                    required: true,
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'name',
+                    title: '鍚嶇О',
+                    required: true,
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'dutyClassify',
+                    title: '鑱屽姟绫诲埆',
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'description',
+                    title: '鎻忚堪',
+                    type: 'text',
+                    readOnly:onlyShow
+                } ];
+        };
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            that.addOrEdit(false,oid);
+        };
+        this.addOrEdit = function(add,oid) {
+            var that = this;
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var addSaveIndex =webUtil.dialog({
+                title:add?'娣诲姞鑱屽姟绠$悊':'淇敼鑱屽姟绠$悊',
+                btn:['淇濆瓨','鍙栨秷'],
+                skin:'layui-layer-lan',
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                area:['820px','400px'],
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getFormItems(false),
+                        function () {
+                            if(!add){
+                                form.load(filter,{
+                                    backPath:that.backPath,
+                                    url:that.url.controller + that.url.getObjectByOid,
+                                    method:'get',
+                                    params:{
+                                        oid:oid
+                                    }
+                                });
+                            }else{
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+                        }, {}, {defaultColumnOneRow: 2});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        var url = that.url.controller + (add?that.url.addSave:that.url.editSave);
+                        webUtil.ajax(add?'post':'put',url,values,function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts= webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+        this.refresh = function () {
+            var that = this;
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+        this.DISABLE = function () {
+            var that = this;
+            that.disableOrEnable(false);
+        };
+        this.ENABLE = function () {
+            var that = this;
+            that.disableOrEnable(true);
+        };
+        this.disableOrEnable = function (enable) {
+            var that = this;
+            var oid ;
+            var ts ;
+            oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            ts = webUtil.getOidFromGrid("table_" + that.id,false,false,'ts');
+            webUtil.post(that.url.controller + (enable?that.url.enableData:that.url.disableData),{
+                oid:oid,
+                ts:ts
+                },function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,(enable?'鍚敤鎴愬姛':'鍋滅敤鎴愬姛'));
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+        };
+
+        this.EXPORT = function () {
+            var that = this;
+            var iframeId = MD5("export" +webUtil.getSystemVar(webUtil.systemValueKey.currentDateTimeSSS) +webUtil.getSystemVar(webUtil.systemValueKey.userOid));
+            var data = {};
+            data[TOKEN_KEY] =$webUtil.getToken() ;
+            data['downloadUUID'] = iframeId;
+            webUtil.fileDownloadPost(that.backPath + that.url.controller + that.url.exportData,data);
+        };
+        this.IMPORT = function () {
+            var that = this;
+            var filter =that.id + "_upload";
+            var form = layui.form;
+            var uploadIndex = webUtil.dialog({
+                title:'瀵煎叆鑱屽姟绠$悊',
+                btn:['涓嬭浇瀵煎叆妯℃澘','鍙栨秷'],
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" enctype="multipart/form-data"></form>',
+                area: ['300px', '300px'],
+                resize:false,
+                success:function(layero){
+                    //濡傛灉瀵煎叆鏈夊叾浠栨搷浣滐紝鍦ㄧ浜屼釜鍙傛暟涓坊鍔�
+                    form.addItems(filter,[],function(){
+                        $("#form_" + filter).append('<button type="button" class="layui-btn" id="' + that.id + '_upload_form_file" style="margin-left:100px;margin-top:80px;"><i class="layui-icon">&#xe67c;</i>閫夋嫨鏂囦欢鍚庤嚜鍔ㄥ鍏�</button>&nbsp;&nbsp;&nbsp;&nbsp;');
+                        var upload = layui.upload;
+                        //鎵ц瀹炰緥
+                        var uploadInst = upload.render({
+                            elem: '#' + that.id + '_upload_form_file' //缁戝畾鍏冪礌
+                            ,accept:'file'
+                            ,acceptMime:'file/*'
+                            ,exts:'xls|xlsx'
+                            ,url: that.backPath + that.url.controller + that.url.importData
+                            ,done: function(result){
+                                if(result.success){
+                                    layer.close(uploadIndex);
+                                    webUtil.showMsgFromResult(result,"瀵煎叆鎴愬姛");
+                                    that.refresh();
+                                }else{
+                                    webUtil.showErrorMsg(result.msg);
+                                }
+                            }
+                            ,error: function(){
+                                //璇锋眰寮傚父鍥炶皟
+                                 webUtil.showErrorMsg("涓婁紶寮傚父");
+                            }
+                        });
+                    },{},{
+                        defaultColumnOneRow:1
+                    });
+                },
+                yes:function(){
+                    var iframeId = MD5("downloadImportTemplate" +webUtil.getSystemVar(webUtil.systemValueKey.currentDateTimeSSS)  +webUtil.getSystemVar(webUtil.systemValueKey.userOid));
+                    webUtil.fileDownload(that.backPath + that.url.controller + that.url.downloadImportTemplate+ "?" + TOKEN_KEY + "=" + $webUtil.getToken()  + "&downloadUUID=" + iframeId );
+                }
+            });
+        };
+        this.ADVQUERY = function () {
+            var that = this;
+            var dynamicCondition = layui.dynamicCondition;
+            $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar'+ that.id+'" class="layui-inline"></div>');
+            var dataFields = that.columns;
+            if(!that.serinorQueryInstance) {
+                that.serinorQueryInstance = dynamicCondition.create({
+                    fields: dataFields//鏌ヨ瀛楁
+                    , tableId: "table_" + that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                    , type: "complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                    // , conditionTextId: "#toolbar" + that.id//楂樼骇鏌ヨ 鎸夐挳鎵�鍦ㄧ殑div
+                    // , popupShowQueryBtn: true//鏄剧ず楂樼骇鏌ヨ鎸夐挳
+                    , queryCallBack: function (requestData) {//鏌ヨ涔嬪悗鐨刢allback
+                        //console.log(JSON.stringify(requestData))
+                    }
+                });
+            }
+            that.serinorQueryInstance.open();
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/orgs/orgJobGrade.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/orgs/orgJobGrade.js
new file mode 100644
index 0000000..c3c7055
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/orgs/orgJobGrade.js
@@ -0,0 +1,362 @@
+/**
+ * 鑱岀骇绠$悊椤甸潰
+ * @author weidy
+ * @date 2020-10-30
+ */
+layui.define(['layer','element','form','table','dynamicCondition','upload' ],function(exports){
+        var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "platform/orgs/orgJobGrade";
+        this.moduleKey = "OrgJobGrade";
+        this.backPath =  configData.compatibility?path:configData.frameworkPath;
+        this.url = {
+            controller:'orgJobGradeController/',
+            dataGrid:'gridOrgJobGrade',
+            addSave:'addSave',
+            editSave:'editSave',
+            deleteUrl:'deleteData',
+            enableData: 'enableData',
+            disableData: 'disableData',
+            downloadImportTemplate:'downloadImportTemplate',
+            importData : 'importData',
+            exportData : 'exportData',
+             getObjectByOid:'getObjectByOid'
+        };
+        this.getContent=function(){
+            var that = this;
+            var html = "";
+            html = [
+                '<div class="layui-layout" style="display:block;overflow-y: hidden">',
+                    '<div class="layui-layout-border" style="display:block;margin-top:0px; " id="border_',that.id,'">',
+                        '<div class="layui-center" style="overflow-y:auto;">',
+                            that.getToolbarHtml(),
+                            '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                            '<div id="toolbar_column_',that.id ,'" style="display:none;"></div>',
+                        '</div>',
+                    '</div>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_IMPORT"><i class="layui-icon layui-icon-upload-drag"></i>瀵煎叆</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EXPORT"><i class="layui-icon layui-icon-export"></i>瀵煎嚭</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ENABLE"><i class="layui-icon layui-icon-ok-circle"></i>鍚敤</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DISABLE"><i class="layui-icon layui-icon-404"></i>鍋滅敤</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.createSearchHtml({id:"鑱岀骇缂栧彿",name:"鑱岀骇鍚嶇О"} ,$("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+        };
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            that.initMainTable();
+            that.createSearchHtml();
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var tableWidth = $("#border_" + that.id).width()-225;
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                width:tableWidth,
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'EDIT'){
+                                that.addOrEdit(false,data.oid);
+                            }
+                        });
+                    }else{
+                        if(total>0) {
+                            table.selectRecord('table_' + that.id, {index:0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                }
+            };
+            if(parentFieldName){
+                options.treeConfig = {
+                    treepid:parentFieldName,
+                    treeid:'id',
+                    showField:'name'
+                };
+            }
+            table.render(options);
+            document.getElementById("toolbar_column_" + that.id).innerHTML =
+                '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>';
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),
+                    {
+                        title: '缂栧彿',
+                        field: 'id',
+                        width: 150
+                    },                    {
+                        title: '鍚嶇О',
+                        field: 'name',
+                        width: 150
+                    },                    {
+                        title: '鎻忚堪',
+                        field: 'description',
+                        width: 150
+                    },                    {
+                        title: '鐘舵��',
+                        field: 'lcStatusText',
+                        width: 150
+                    }        ];
+            }
+        };
+
+        this.getFormItems = function(onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [
+                {
+                    field: 'id',
+                    title: '缂栧彿',
+                    required: true,
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'name',
+                    title: '鍚嶇О',
+                    required: true,
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'description',
+                    title: '鎻忚堪',
+                    type: 'text',
+                    readOnly:onlyShow
+                }  ];
+        };
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            that.addOrEdit(false,oid);
+        };
+        this.addOrEdit = function(add,oid) {
+            var that = this;
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var addSaveIndex =webUtil.dialog({
+                title:add?'娣诲姞鑱岀骇绠$悊':'淇敼鑱岀骇绠$悊',
+                btn:['淇濆瓨','鍙栨秷'],
+                skin:'layui-layer-lan',
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                //fullScreen:true,
+                area:['920px','300px'],
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getFormItems(false),
+                        function () {
+                            if(!add){
+                                form.load(filter,{
+                                    backPath:that.backPath,
+                                    url:that.url.controller + that.url.getObjectByOid,
+                                    method:'get',
+                                    params:{
+                                        oid:oid
+                                    }
+                                });
+                            }else{
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+                        }, {}, {defaultColumnOneRow: 2});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        var url = that.url.controller + (add?that.url.addSave:that.url.editSave);
+                        webUtil.ajax(add?'post':'put',url,values,function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts= webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+        this.refresh = function () {
+            var that = this;
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+        this.DISABLE = function () {
+            var that = this;
+            that.disableOrEnable(false);
+        };
+        this.ENABLE = function () {
+            var that = this;
+            that.disableOrEnable(true);
+        };
+        this.disableOrEnable = function (enable) {
+            var that = this;
+            var oid ;
+            var ts ;
+            oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            ts = webUtil.getOidFromGrid("table_" + that.id,false,false,'ts');
+            webUtil.post(that.url.controller + (enable?that.url.enableData:that.url.disableData),{
+                oid:oid,
+                ts:ts
+                },function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,(enable?'鍚敤鎴愬姛':'鍋滅敤鎴愬姛'));
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+        };
+
+        this.EXPORT = function () {
+            var that = this;
+            var iframeId = MD5("export" +webUtil.getSystemVar(webUtil.systemValueKey.currentDateTimeSSS) +webUtil.getSystemVar(webUtil.systemValueKey.userOid));
+            var data = {};
+            data[TOKEN_KEY] = webUtil.getToken();
+            data['downloadUUID'] = iframeId;
+            webUtil.fileDownloadPost(that.backPath + that.url.controller + that.url.exportData,data);
+        };
+        this.IMPORT = function () {
+            var that = this;
+            var filter =that.id + "_upload";
+            var form = layui.form;
+            var uploadIndex = webUtil.dialog({
+                title:'瀵煎叆鑱岀骇绠$悊',
+                btn:['涓嬭浇瀵煎叆妯℃澘','鍙栨秷'],
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" enctype="multipart/form-data"></form>',
+                area: ['300px', '300px'],
+                resize:false,
+                success:function(layero){
+                    //濡傛灉瀵煎叆鏈夊叾浠栨搷浣滐紝鍦ㄧ浜屼釜鍙傛暟涓坊鍔�
+                    form.addItems(filter,[],function(){
+                        $("#form_" + filter).append('<button type="button" class="layui-btn" id="' + that.id + '_upload_form_file" style="margin-left:100px;margin-top:80px;"><i class="layui-icon">&#xe67c;</i>閫夋嫨鏂囦欢鍚庤嚜鍔ㄥ鍏�</button>&nbsp;&nbsp;&nbsp;&nbsp;');
+                        var upload = layui.upload;
+                        //鎵ц瀹炰緥
+                        var uploadInst = upload.render({
+                            elem: '#' + that.id + '_upload_form_file' //缁戝畾鍏冪礌
+                            ,accept:'file'
+                            ,acceptMime:'file/*'
+                            ,exts:'xls|xlsx'
+                            ,url: that.backPath + that.url.controller + that.url.importData
+                            ,done: function(result){
+                                if(result.success){
+                                    layer.close(uploadIndex);
+                                    webUtil.showMsgFromResult(result,"瀵煎叆鎴愬姛");
+                                    that.refresh();
+                                }else{
+                                    webUtil.showErrorMsg(result.msg);
+                                }
+                            }
+                            ,error: function(){
+                                //璇锋眰寮傚父鍥炶皟
+                                 webUtil.showErrorMsg("涓婁紶寮傚父");
+                            }
+                        });
+                    },{},{
+                        defaultColumnOneRow:1
+                    });
+                },
+                yes:function(){
+                    var iframeId = MD5("downloadImportTemplate" +webUtil.getSystemVar(webUtil.systemValueKey.currentDateTimeSSS)  +webUtil.getSystemVar(webUtil.systemValueKey.userOid));
+                    webUtil.fileDownload(that.backPath + that.url.controller + that.url.downloadImportTemplate+ "?" + TOKEN_KEY + "=" + webUtil.getToken()  + "&downloadUUID=" + iframeId );
+                }
+            });
+        };
+        this.ADVQUERY = function () {
+            var that = this;
+            if(!that.serinorQueryInstance) {
+                var dynamicCondition = layui.dynamicCondition;
+                $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar' + that.id + '" class="layui-inline"></div>');
+                var dataFields = that.columns;
+                that.serinorQueryInstance = dynamicCondition.create({
+                    fields: dataFields//鏌ヨ瀛楁
+                    , tableId: "table_" + that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                    , type: "complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                    //,conditionTextId:"#toolbar"+that.id//楂樼骇鏌ヨ 鎸夐挳鎵�鍦ㄧ殑div
+                    //,popupShowQueryBtn: true//鏄剧ず楂樼骇鏌ヨ鎸夐挳
+                    , queryCallBack: function (requestData) {//鏌ヨ涔嬪悗鐨刢allback
+                        //console.log(JSON.stringify(requestData))
+                    }
+                });
+            }
+            that.serinorQueryInstance.open();
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/orgs/orgsDepartment.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/orgs/orgsDepartment.js
new file mode 100644
index 0000000..511f24d
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/orgs/orgsDepartment.js
@@ -0,0 +1,362 @@
+/**
+ * 閮ㄩ棬绠$悊
+ * @author weidy@2018-06-04
+ * @constructor
+ */
+layui.define(['layer','element','form','table','tree'],function(exports){
+    var Dept = function(){
+        this.MODELNAME = "platform/orgs/orgsDepartment";
+        this.moduleKey = "orgDept";
+        this.id='orgDept';
+        this.sourceData={};
+        this.deptTree = null;
+        this.deptForm = null;
+        this.backPath = configData.compatibility?path:configData.frameworkPath;
+        this.buttonIconMap = {};
+        this.url={
+            controller:'departmentController/',
+            tree:'deptTree',
+            add:'add',
+            edit:'edit',
+            checkIsDelete:'checkIsCanDelete',
+            deleteUrl:'delete',
+            disableUrl:'disable',
+            enableUrl:"enable",
+            referUser:'userQueryController/refDataGrid'
+        };
+        this.getContent=function(){
+            var that = this;
+            var html = "";
+            html = [
+                that.getToolbarHtml(),
+                '<div class="layui-layout" style="display:block;overflow-y: hidden">',
+                '<div class="layui-vci-tree" style="width:280px;float: left;background-color:#ffffff;overflow-y: auto;">',
+                '<label class="layui-icon layui-icon-tree" style="line-height: 20px;color:red;font-size:20px;">閮ㄩ棬妗f</label>',
+                '<ul layui-filter="tree_',that.id,'" style="overflow-x: auto;"><ul>',
+                '</div>',
+                '<div class="layui-layout-border" style="display:block;margin-top:0px;margin-left:285px;">',
+                '<div class="layui-center" style="overflow-y:auto;">',
+                '<form class="layui-form" lay-filter="form_inPanel',that.id,'"></form>',
+                '</div>',
+                '</div>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml = function(){
+            var that = this;
+            return ['<div layui-filter="toolbar_',that.id, '" class="layui-btn-container">',//涓诲垪琛ㄧ殑鎸夐挳
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_STAR"><i class="layui-icon layui-icon-ok-circle"></i>鍚敤</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_STOP"><i class="layui-icon layui-icon-404"></i>鍋滅敤</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'].join("");
+        };
+        this.init=function(){//鍩虹鐨刪tml琚坊鍔犲悗锛屽啀鎵ц鍒濆鍖�
+            var that = this;
+            $webUtil.copyConfig(that,that.moduleKey);
+            $webUtil.bindDefultButtonLisenter(that, that.id);
+            var tree = layui.tree;
+            var scrollHeight =  window.innerHeight;
+            var treeUL = $('[layui-filter="tree_' + that.id + '"]');
+            var treeHeight = scrollHeight - 200;
+            treeUL.parent().height(treeHeight);
+            tree.init("tree_" + that.id, treeUL, {
+                url: that.url.controller + that.url.tree,
+                backPath: that.backPath,
+                extraParams: {
+                    isMuti: false,
+                    isQueryAllColumn: true
+                },
+                showSearch:true,
+                click: function (item, elem, options) {
+                    that.currentItemOid = item.oid;
+                    that.currentItemAttributes = item.attributes;
+                    that.setFormValues(that.currentItemAttributes);
+                },
+                done: function (thisFilter) {
+                    that.initForm();
+                }
+            });
+
+        };
+        this.initForm = function(){
+            var that = this;
+            var form = layui.form;
+            form.addItems("form_inPanel" + that.id, that.getFormItems(true), function () {
+            }, {}, {
+                defaultColumnOneRow: 1,
+                labelWidth: 150,
+                textWidth:240
+            });
+        };
+        this.setFormValues = function (attributes) {
+            var that = this;
+            if(attributes){
+                try{
+                    var form = layui.form;
+                    form.clear("form_inPanel" + that.id,true);
+                    form.setValues(attributes,"form_inPanel" + that.id);//涓嶉渶瑕佽浆鎹㈠璞★紝鍥犱负attributes宸茬粡鏄璞℃牸寮忎簡
+                }catch (e){
+                    $webUtil.showDebugMsg(e);
+                }
+            }
+        };
+        this.getFormItems = function(onlyShow){
+            var that = this;
+            return [{
+                field: 'id',
+                text: '閮ㄩ棬缂栧彿',
+                required:true,
+                readOnly: onlyShow
+            }, {
+                field: 'name',
+                text: '閮ㄩ棬鍚嶇О',
+                required:true,
+                readOnly: onlyShow
+            },{
+                name:'departmentLevel',
+                text:'閮ㄩ棬绾у埆',
+                type:'combox',
+                data:[{key:1,value:"涓氬姟鍗曞厓/鍒嗗巶"},{key:2,value:"閮ㄩ棬"}]
+            },{
+                name:'pkLeader',
+                text:'閮ㄩ棬涓荤棰嗗',
+                type:'refer',
+                showField:'pkLeaderName',
+                readOnly: onlyShow,
+                referConfig:{
+                    type:layui.vciAlias.referRegister.userRefer
+                }
+            },{
+                field:'pkFatherDepartment',
+                text:'涓婄骇閮ㄩ棬',
+                type:'refer',
+                showField: 'pkFatherDepartmentName',
+                readOnly: onlyShow,
+                referConfig:{
+                    type:layui.vciAlias.referRegister.departmentRefer
+                }
+            },{
+                name:'address',
+                text:'閮ㄩ棬浣嶇疆',
+                readOnly: onlyShow
+            },{
+                name:'tel',
+                readOnly: onlyShow,
+                text:'鐢佃瘽'
+            },{
+                name:'description',
+                readOnly: onlyShow,
+                text:'澶囨敞'
+            },{
+                field: 'lcStatusText',
+                text: '鐘舵��',
+                readOnly: true,
+                hidden:!onlyShow
+            }];
+        };
+        this.getUserReferColumns = function(){
+            var table = layui.table;
+           return [table.getIndexColumn(),table.getCheckColumn(),{
+               field:'id',
+               title:'鐢ㄦ埛鍚�',
+               width:120
+           },{
+               field:'name',
+               title:'濮撳悕',
+               width:120
+           },{
+               field:'secretGradeText',
+               title:'瀵嗙骇',
+               width:90
+           }];
+        };
+        this.ADD = function(){//淇濆瓨
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            that.addOrEdit(false);
+        };
+        this.addOrEdit = function (add) {
+            var that = this;
+
+            if(!add && $webUtil.isNull(that.currentItemOid)){
+                $webUtil.showErrorMsg("璇峰厛閫夋嫨涓�涓儴闂�");
+                return false;
+            }
+            var filter = "addOrEdit_" + that.id;
+            var form = layui.form;
+            var addSaveIndex = layer.open({
+                type: 1,
+                title: add?'鏂板閮ㄩ棬':'淇敼閮ㄩ棬',
+                btn: ['淇濆瓨', '鍙栨秷'],
+                skin: 'layui-layer-lan',
+                content: '<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                area: ['900px', '500px'],
+                closeBtn: 2,
+                shade: true,
+                shadeClose: true,
+                resize: true,
+                resizing: function (layero) {
+                    form.doResize(filter);
+                },
+                success: function (layero) {
+                    form.addItems(filter,that.getFormItems(false),
+                        function () {
+                            if(add){
+                                //娣诲姞鐨勬椂鍊欙紝濡傛灉閫夋嫨浜嗚妭鐐癸紝閭d箞閫夋嫨鐨勮妭鐐瑰氨鏄綋鍓嶇殑涓婄骇鑺傜偣
+                                if($webUtil.isNotNull(that.currentItemOid)){
+                                    form.setValues({
+                                        pkFatherDepartment:that.currentItemOid,
+                                        pkFatherDepartmentName:(that.currentItemAttributes.id + " " + that.currentItemAttributes.name)
+                                    },filter);
+                                }else{
+                                    form.setValues({},filter);
+                                }
+                            }else{
+                                form.setValues(that.currentItemAttributes,filter);
+                            }
+                        }
+                        , {}
+                        , {
+                            defaultColumnOneRow: 2,
+                            labelWidth: 150,
+                            textWidth:240
+                        });
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var formValues = form.getValues(filter,true);
+                        $webUtil.ajax(add?'post':'put',that.url.controller + (add?that.url.add:that.url.edit),formValues,function (result) {
+                            if(result.success){
+                                $webUtil.showMsgFromResult(result,add?"鏂板閮ㄩ棬":"淇敼閮ㄩ棬");
+                                that.refresh(that.currentItemOid);
+                                layer.close(addSaveIndex);
+                            }else{
+                                $webUtil.showErrorMsg(result.msg);
+                            }
+                        },function (xhr,error) {
+                            $webUtil.showErrorMsg("璁块棶鏈嶅姟鍣ㄥ嚭鐜颁簡閿欒锛屽彲鑳芥湇鍔″櫒娌℃湁寮�鍚紝鎴栬�呰繛鎺ュけ璐�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    that.refresh();
+                    layer.close()
+                }
+            });
+        };
+        this.DEL= function(){
+            var that = this;
+            if($webUtil.isNull(that.currentItemOid)){
+                $webUtil.showErrorMsg("璇峰厛閫夋嫨涓�涓儴闂�");
+                return false;
+            }
+            var ts =  that.currentItemAttributes.ts;
+            $webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欎釜閮ㄩ棬锛熷鏋滆鐢ㄦ埛绛変俊鎭紩鐢ㄥ皢涓嶈兘琚垹闄�!",function () {
+                var submitValue = {oid:that.currentItemOid,ts:ts};
+                $webUtil.post(that.url.controller + that.url.checkIsDelete,submitValue,function(result){
+                    if(result.success){
+                        if('true' == result.obj || true == result.obj){
+                            $webUtil.showConfirmMsg("褰撳墠鍒嗙被鍖呭惈鏈変笅绾ч儴闂紝瑕佸垹闄ょ殑璇濅細鍜屼笅绾ч儴闂ㄤ竴璧峰垹闄わ紝浣犵‘璁ょ户缁�?",function () {
+                                that.doDelete(submitValue);
+                            });
+                        }else{
+                            //璇存槑鍙互鍒犻櫎
+                            that.doDelete(submitValue);
+                        }
+                    }else{
+                        $webUtil.showErrorMsg(result.msg);
+                    }
+                },function (xhr,error) {
+                    $webUtil.showErrorMsg("鏍¢獙鍒犻櫎鍑虹幇浜嗛敊璇紝鍙兘鏄湇鍔″櫒鏈惎鍔�")
+                },that.backPath);
+            });
+        };
+        this.doDelete = function (submitValue) {
+            var that = this;
+            $webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,submitValue,function(result){
+                if(result.success){
+                    $webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                    that.refresh();
+                }else{
+                    $webUtil.showErrorMsg(result.msg);
+                }
+            },function (xhr,err) {
+                $webUtil.showErrorMsg("鎵ц鍒犻櫎鐨勬椂鍊欏嚭閿欎簡閿欒锛屽彲鑳芥槸鏈嶅姟鍣ㄦ殏鏃舵棤娉曡闂�");
+            },that.backPath);
+        };
+
+        this.STAR = function(){
+            var that = this;
+            if($webUtil.isNull(that.currentItemOid)){
+                $webUtil.showErrorMsg("璇峰厛閫夋嫨涓�涓儴闂�");
+                return false;
+            }
+            that.operaData(that.url.controller +that.url.enableUrl,{oid:that.currentItemOid,ts:that.currentItemAttributes.ts},'鍚敤鎴愬姛')
+        };
+        this.STOP = function(){
+            var that = this;
+            if($webUtil.isNull(that.currentItemOid)){
+                $webUtil.showErrorMsg("璇峰厛閫夋嫨涓�涓儴闂�");
+                return false;
+            }
+            that.operaData(that.url.controller +that.url.disableUrl,{oid:that.currentItemOid,ts:that.currentItemAttributes.ts},'鍋滅敤鎴愬姛')
+        };
+        this.operaData = function(url,submitValue,msg){
+            var that = this;
+            if($webUtil.isNull(that.currentItemOid)){
+                return false;
+            }
+            that.showConfirmMsg("瀛愯妭鐐规槸鍚︿竴璧锋搷浣滐紵",function(){
+                submitValue['cascade'] = true;
+                $webUtil.post(url,submitValue,function(result){
+                    if(result.success){
+                        $webUtil.showMsgFromResult(result,msg);
+                        that.refresh();
+                    }else{
+                        $webUtil.showErrorMsg(result.msg);
+                    }
+                },function (xhr,err) {
+                    $webUtil.showErrorMsg("鎵ц鐨勬椂鍊欏嚭閿欎簡閿欒锛屽彲鑳芥槸鏈嶅姟鍣ㄦ殏鏃舵棤娉曡闂�");
+                },that.backPath)
+            },function(){
+                $webUtil.post(url,submitValue,function(result){
+                    if(result.success){
+                        $webUtil.showMsgFromResult(result,msg);
+                        that.refresh();
+                    }else{
+                        $webUtil.showErrorMsg(result.msg);
+                    }
+                },function (xhr,err) {
+                    $webUtil.showErrorMsg("鎵ц鐨勬椂鍊欏嚭閿欎簡閿欒锛屽彲鑳芥槸鏈嶅姟鍣ㄦ殏鏃舵棤娉曡闂�");
+                },that.backPath);
+            });
+        };
+        this.showConfirmMsg = function (title,yes,cancel){
+            layer.open($.extend({
+                content: title,
+                btn: ['鏄�','鍚�'],
+                yes: yes,
+                btn2: cancel
+            }, {icon:3,title:'闇�瑕佹偍纭'}));
+        };
+
+        this.refresh = function(parentNodeOid){
+            var that = this;
+            var tree = layui.tree;
+            if($webUtil.isNotNull(parentNodeOid)){
+                tree.reloadNode("tree_" + that.id,parentNodeOid);
+            }else {
+                tree.reload("tree_" + that.id);
+            }
+        };
+    };
+    var dept = new Dept();
+    exports(dept.MODELNAME,dept);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/orgs/vciWebPost.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/orgs/vciWebPost.js
new file mode 100644
index 0000000..33fd03e
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/orgs/vciWebPost.js
@@ -0,0 +1,114 @@
+/**
+ * 宀椾綅绠$悊
+ * @author weidy@2018-06-05
+ * @constructor
+ */
+layui.define(['layer','element','form','table'],function(exports){
+    var Class = function(){
+        this.moduleKey = "vciWebPost";
+        this.id='vciWebPost';
+        this.sourceData={};//鏉ユ簮鏁版嵁锛岄渶瑕佽嚦灏戝寘鍚玹ype锛屽鏋滄病鏈夊垯榛樿涓烘壒浜�
+        this.columns = [];
+        this.backPath = path;//榛樿娴佺▼鍜岄」鐩殑璺緞鏄竴鏍风殑
+        this.url={
+            dataGrid:'/webPostController/dataGrid',//鍒楄〃鏁版嵁鍜屾煡璇�
+            add:'/webPostController/addPost',
+            edit:'/webPostController/editPost',
+            del:'/webPostController/deletePost',
+           // export:'/webPostController/export',//鍛藉悕鏈夐棶棰� ie 璇嗗埆涓嶅嚭鏉ヤ細鎶ラ敊
+           // import:'/webPostController/import'//鍛藉悕鏈夐棶棰� ie 璇嗗埆涓嶅嚭鏉ヤ細鎶ラ敊
+        };
+        this.getContent=function(){//杩斿洖杩欎釜缁勪欢鐨勫熀纭�html
+            var that = this;
+            var html = "";
+            html = [
+                    '<div layui-filter="toolbar_',that.id, '" class="layui-btn-container">',//涓诲垪琛ㄧ殑鎸夐挳
+                        '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_add"><i class="layui-icon layui-icon-add-1"></i>澧炲姞</button>',
+                        '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_edit"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                        '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_del"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                        '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_export"><i class="layui-icon layui-icon-share"></i>瀵煎嚭</button>',
+                        '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_import"><i class="layui-icon layui-icon-upload"></i>瀵煎叆</button>',
+                        '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_senior"><i class="layui-icon layui-icon-search"></i>楂樼骇鏌ヨ</button>',
+                        that.getSearchAreaHtml(),
+                    '</div>',
+                    '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',//涓诲垪琛�
+            ].join("");
+            return html;
+        };
+        this.getSearchAreaHtml = function(){
+        	var that = this;
+            var html = "";
+            html = [
+                '<select class="layui-btn layui-btn-sm layui-btn-primary" name=""><option value="">缂栧彿</option><option value="">鍚嶇О</option><option value="">鎻忚堪</option><option value="">褰掑睘</option><option value="">绾у埆</option></select>',
+                '<input class="layui-btn layui-btn-sm layui-btn-primary" type="text" name="title" lay-verify="title" placeholder="璇疯緭鍏ユ兂鏌ヨ鐨勫唴瀹�"/>',
+            ].join("");
+            return html;
+        };
+        this.init=function(){//鍩虹鐨刪tml琚坊鍔犲悗锛屽啀鎵ц鍒濆鍖�
+            var that = this;
+            $webUtil.copyConfig(that,that.moduleKey);
+            var table = layui.table;
+            that.checkColumns();//涓诲垪琛ㄤ腑鍒椼��
+            table.render({
+                elem:'#table_' + that.id,
+                id:'table_' + that.id,
+                url:that.backPath + that.url.dataGrid,
+                page:{
+                    limit:30,
+                    page:1
+                },
+                cols:[that.columns],
+                done:function(res,cur,count){
+
+                },
+                rowDbClick:function(thisTableFilter,record){
+
+                }
+            });
+            that.bindListeners();
+        };
+        this.bindListeners = function(){
+            var that = this;
+            var that = this;
+            $('[layui-filter^="toolbar_' + that.id + '_"]').click(function(){
+                var event = $(this).attr("layui-filter");
+                if($webUtil.isNotNull(event) && event.indexOf("_")>-1){
+                    event = event.substring(event.lastIndexOf("_")+1);
+                    if($webUtil.isNotNull(event)){
+                        that[event]();//鍦ㄥ叾涓墽琛岀浉搴旂殑鍐呭
+                    }
+                }
+            });
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){//濡傛灉鍏朵粬鍦版柟鎯充娇鐢ㄨ繖涓粍浠剁殑鏃跺�欙紝鍙互鑷畾涔夊垪
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),{
+                    field:'id',
+                    title:'缂栧彿',
+                    width:150
+                },{
+                    field:'name',
+                    title:'鍚嶇О',
+                    width:150
+                },{
+                    field:'description',
+                    title:'鎻忚堪',
+                    width:150
+                },{
+                    field:'postclsf',
+                    title:'褰掑睘',
+                    width:150
+                },{
+                    field:'postlevel',
+                    title:'绾у埆',
+                    width:150
+                }];
+            }
+        };
+
+    };
+    var cs = new Class();
+    exports('orgs/vciWebPost',cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/plugins/ImageView.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/plugins/ImageView.js
new file mode 100644
index 0000000..a88ed85
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/plugins/ImageView.js
@@ -0,0 +1,147 @@
+/**
+ * 鑷畾涔夊浘鐗囧睍绀�
+ * @author wangting
+ * @date 2021-3-11
+ */
+layui.define(['layer','element','flow'],function(exports){
+    var webUtil = $webUtil;
+    var Class = function() {
+        this.MODELNAME = "ImageView";
+        this.moduleKey = "ImageView";
+        this.backPath = configData.compatibility?path:configData.objectServicePath;
+        this.url = {
+            imgview: 'imageViewerController/downloadImage'
+        };
+        this.sourceData  = {
+            imgWidth:600,
+            imgHeight:300
+        };
+        this.getContent = function (id,options) {
+            var that = this;
+            that.id=id;
+            var html = [
+                '<div class="lazyimgs" id="lazyimgs_',id,'" lay-filter="lazyimgs_',id,'" style="display:block; text-align: center"></div>'
+            ].join("");
+            return html;
+        };
+        this.init = function (id, options) {
+            var that = this;
+            webUtil.copyConfig(that, that.moduleKey);
+            that.id=id;
+
+            $.extend(that.sourceData,options);
+        };
+
+        this.loadForUI=function (sourceData){
+            if(!sourceData){
+                return;
+            }
+            var that =this;
+            $("#lazyimgs_"+that.id).empty();
+            //鍙傛暟鏈夎皟鏁�
+            //    /**
+            //      * 涓氬姟绫诲瀷
+            //      */
+            //     private String btmType;
+            //
+            //     /**
+            //      * 鍥剧墖鏄剧ず鐨勬柟寮�
+            //      */
+            //     private String imageType;
+            //
+            //     /**
+            //      * 鏂囦欢鐨勪富閿�
+            //      */
+            //     private String fileOid;
+            //
+            //     /**
+            //      * 鏂囦欢鐨勮矾寰�
+            //      */
+            //     private String filePath;
+
+            //fileOid 鏄湪imageType绛変簬鈥渇ileobject鈥濇椂锛屽埄鐢╬ropertyname鍦ㄩ�夋嫨鐨勮繖鏉℃暟鎹腑鑾峰彇锛屼篃灏辨槸propertyname瀹為檯灏辨槸閫夋嫨鏁版嵁涓殑鏌愪釜灞炴�э紙娉ㄦ剰灞炴�т笉鍖哄垎澶у皬鍐欙級
+            //filePath 鏄湪imageType绛変簬鈥渇ilepath鈥濇椂锛屽埄鐢╬ropertyname鍦ㄩ�夋嫨鐨勮繖鏉℃暟鎹腑鑾峰彇锛�
+            var url = $webUtil.isNull(that.sourceData.url) ? that.url.imgview : that.sourceData.url;
+            if(that.sourceData.urlParams.imageType=='fileobject'){
+                that.sourceData.urlParams['fileOid']=sourceData[that.sourceData.urlParams.propertyname]
+            }else if(that.sourceData.urlParams.imageType=='filepath'){
+                that.sourceData.urlParams['filePath']=sourceData[that.sourceData.urlParams.propertyname]
+            }
+
+            if(that.sourceData.urlParams['fileOid']==''||that.sourceData.urlParams['filePath']==''){
+                return;
+            }
+            var img = $('<img class="fullScreen" lay-src="' + that.backPath + url +
+                '?fileOid=' + (that.sourceData.urlParams['fileOid']||'')
+                + '&filePath=' + (that.sourceData.urlParams['filePath'].replace(/\\/g, '/')||'')
+                + '&imageType=' + that.sourceData.urlParams.imageType
+                + '&' + TOKEN_KEY + '=' + $webUtil.getToken() + '"> ');
+            img.width(that.sourceData.imgWidth).height(that.sourceData.imgHeight).on('dblclick', function () {
+                var div = $('<div style="position:absolute;width:100%;height: 100%;left:0;top:0;z-index: 99999"><i class="layui-icon layui-icon-close-fill" style="font-size:40px;position:absolute;right:0;top:0;z-index: 100000"></i></div>');
+                $('.layui-body').append(div)
+                var fullImg = new Image();
+                fullImg.onerror = function () {
+                };
+                fullImg.src = this.src;
+                fullImg.style.position = "absolute";
+                fullImg.style.width = "98%";
+                fullImg.style.height = "auto";
+                fullImg.style.left = '1%';
+                fullImg.style.top = '20px';
+                div.append(fullImg);
+                $('.layui-icon-close-fill', div).on('click', function () {
+                    $(this).parent().remove()
+                })
+            })
+            $("#lazyimgs_"+that.id).html(img);
+            var flow = layui.flow;
+            flow.lazyimg({
+                elem: '.lazyimgs img'
+            });
+            // $webUtil.get(url , that.sourceData.urlParams, function (result) {
+            //     if (result.success) {
+            //         var img = $('<img class="fullScreen" lay-src="'+result+'"> ')
+            //         img.width(that.sourceData.imgWidth).height(that.sourceData.imgHeight).on('dblclick', function () {
+            //             var div = $('<div style="position:absolute;width:100%;height: 100%;left:0;top:0;z-index: 99999"><i class="layui-icon layui-icon-close-fill" style="font-size:40px;position:absolute;right:0;top:0;z-index: 100000"></i></div>');
+            //             $('.layui-body').append(div)
+            //             var fullImg = new Image();
+            //             fullImg.onerror = function () {
+            //             };
+            //             fullImg.src = this.src;
+            //             fullImg.style.position = "absolute";
+            //             fullImg.style.width = "98%";
+            //             fullImg.style.height = "auto";
+            //             fullImg.style.left = '1%';
+            //             fullImg.style.top = '20px';
+            //             div.append(fullImg);
+            //             $('.layui-icon-close-fill', div).on('click', function () {
+            //                 $(this).parent().remove()
+            //             })
+            //         })
+            //         $("#lazyimgs_"+that.id).html(img);
+            //         var flow = layui.flow;
+            //         flow.lazyimg({
+            //             elem: '.lazyimgs img'
+            //         });
+            //     } else {
+            //         $webUtil.showErrorMsg(result.msg);
+            //     }
+            // }, function (xhr, error) {
+            //     $webUtil.showErrorMsg("鑾峰彇鍥剧墖鍑虹幇浜嗛敊璇紝鍙兘鏄枃浠舵湇鍔℃病鏈夊惎鍔�");
+            // }, that.backPath);
+        }
+
+        this.refresh = function(){
+            var that = this;
+
+        };
+
+        this.destory = function(){
+            var that = this;
+            var filter = "lazyimgs_" + that.id;
+            $('#'+filter).remove()
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/plugins/Sql2Table.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/plugins/Sql2Table.js
new file mode 100644
index 0000000..faba0f8
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/plugins/Sql2Table.js
@@ -0,0 +1,86 @@
+/**
+ * 鍒╃敤sql鐢熸垚琛ㄦ牸
+ * @author lihang
+ * @date 2022-1-20
+ */
+layui.define(['layer','element','flow','table'],function(exports){
+    var webUtil = $webUtil;
+    var Class = function() {
+        this.MODELNAME = "platform/plugins/Sql2Table";
+        this.moduleKey = "Sql2Table";
+        this.backPath = configData.compatibility?path:configData.objectServicePath;
+        this.url = {
+            sqlTable: 'sqlController/excute'
+        };
+        this.getContent = function (id,options) {
+            var that = this;
+            that.id=id;
+            var html =[ '<div class="Sql2Table" id="Sql2Table_'+ id+ ' lay-filter="Sql2Table'+ id+ '" style="display:block; text-align: center">',
+                '<table id="table_', id , '" lay-filter="table_',id , '" style="overflow-x:auto;"></table>','</div>'
+                ]
+            return html.join("");
+        };
+        this.init = function (id, options) {
+            //     鍏蜂綋鍐呭灞曠ず
+            var that = this;
+            this.sql = options.uiParseClass;
+            webUtil.copyConfig(that, that.moduleKey);
+            that.id=id;
+            $.extend(that.sourceData,options);
+        };
+        this.loadForUI=function (id,sourceData){
+            console.log(sourceData);
+            //鎸夌収sql璇彞鍒濆鍖栭〉闈�
+            var that = this;
+            $webUtil.ajax("get",this.url.sqlTable, {
+                sql:that.sql,
+                oid:sourceData.oid
+            },function (baseResult){
+                var dataList = baseResult.data;
+                var columnList = baseResult.obj;
+                var table = layui.table;
+                that.checkColumns(id);
+                table.render({
+                    elem: '#table_' + id,
+                    id: 'table_' + id,
+                    data: dataList,
+                    selectMode:table.selectMode.muti,
+                    cols: [columnList]
+                });
+            });
+        }
+        this.refresh = function(){
+            //     鍏蜂綋鍔熻兘瀹炵幇
+        };
+        this.destory = function(){
+            var that = this;
+        };
+
+        this.checkColumns = function(id){
+            var table = layui.table;
+            var that = this;
+            if(that.columns==null || that.columns.length==0){
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),{
+                    field:'name',
+                    title:'鍚嶇О',
+                    width:250
+                },{
+                    field:'fileExtension',
+                    title:'鍚庣紑鍚�',
+                    width:100,
+                    sort:true
+                },{
+                    field:'fileSize',
+                    title:'鏂囦欢澶у皬',
+                    width:110
+                },{
+                    field:'fileDocClassifyName',
+                    title:'鏂囨。绫诲瀷',
+                    width:130
+                }];
+            }
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/VciProcessProxy.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/VciProcessProxy.js
new file mode 100644
index 0000000..a0d0da1
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/VciProcessProxy.js
@@ -0,0 +1,305 @@
+/**
+ * 娴佺▼浠g悊椤甸潰
+ * @author weidy
+ * @date 2020-09-29
+ */
+layui.define(['layer','element','form','table','dynamicCondition' ],function(exports){
+        var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "platform/process/VciProcessProxy";
+        this.moduleKey = "WFWorkflowProxy";
+        this.backPath =  configData.compatibility?path:configData.processServicePath;
+        this.url = {
+            controller:'wFWorkflowProxyController/',
+            dataGrid:'gridWFWorkflowProxy',
+            addSave:'addSave',
+            editSave:'editSave',
+            deleteUrl:'deleteData',
+            getObjectByOid:'getObjectByOid'
+        };
+        this.getContent=function(){
+            var that = this;
+            var html = "";
+            html = [
+                '<div class="layui-layout" style="display:block;overflow-y: hidden">',
+                    '<div class="layui-layout-border" style="display:block;margin-top:0px; " id="border_',that.id,'">',
+                        '<div class="layui-center" style="overflow-y:auto;">',
+                            that.getToolbarHtml(),
+                            '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                            '<div id="toolbar_column_',that.id ,'" style="display:none;"></div>',
+                        '</div>',
+                    '</div>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.createSearchHtml({id:"缂栧彿",name:"鍚嶇О"} ,$("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+        };
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            that.initMainTable();
+            that.createSearchHtml();
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var tableWidth = $("#border_" + that.id).width()-225;
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                width:tableWidth,
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'EDIT'){
+                                that.addOrEdit(false,data.oid);
+                            }
+                        });
+                    }else{
+                        if(total>0) {
+                            table.selectRecord('table_' + that.id, {index:0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                }
+            };
+            if(parentFieldName){
+                options.treeConfig = {
+                    treepid:parentFieldName,
+                    treeid:'id',
+                    showField:'name'
+                };
+            }
+            table.render(options);
+            document.getElementById("toolbar_column_" + that.id).innerHTML =
+                '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>';
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),
+                    {
+                        title: '缂栧彿',
+                        field: 'id',
+                        width: 150
+                    },                    {
+                        title: '鍚嶇О',
+                        field: 'name',
+                        width: 150
+                    },                    {
+                        title: '浠g悊鐢ㄦ埛鍚�',
+                        field: 'proxyUserId',
+                        width: 150
+                    },                    {
+                        title: '浠g悊鐢ㄦ埛濮撳悕',
+                        field: 'proxyUserName',
+                        width: 150
+                    },                    {
+                        title: '娴佺▼浠g悊寮�濮嬫椂闂�',
+                        field: 'proxyStartTime',
+                        width: 110,
+                        templet: function (d) {
+                            return webUtil.formateDate(d.proxyStartTime);
+                        }
+                    },                    {
+                        title: '娴佺▼浠g悊缁撴潫鏃堕棿',
+                        field: 'proxyEndTime',
+                        width: 130,
+                        templet: function (d) {
+                            return webUtil.formateDateTimeNoSecond(d.proxyEndTime);
+                        }
+                    },                    {
+                        title: '鎻忚堪',
+                        field: 'description',
+                        width: 150
+                    }        ];
+            }
+        };
+
+        this.getFormItems = function(onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [
+                {
+                    field: 'id',
+                    title: '缂栧彿',
+                    required: true,
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'name',
+                    title: '鍚嶇О',
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'proxyUserId',
+                    title: '浠g悊鐢ㄦ埛鍚�',
+                    required: true,
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'proxyUserName',
+                    title: '浠g悊鐢ㄦ埛濮撳悕',
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'proxyStartTime',
+                    title: '娴佺▼浠g悊寮�濮嬫椂闂�',
+                    type: 'date',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'proxyEndTime',
+                    title: '娴佺▼浠g悊缁撴潫鏃堕棿',
+                    type: 'datetime',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'description',
+                    title: '鎻忚堪',
+                    type: 'text',
+                    readOnly:onlyShow
+                }             ];
+        };
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            that.addOrEdit(false,oid);
+        };
+        this.addOrEdit = function(add,oid) {
+            var that = this;
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var addSaveIndex =webUtil.dialog({
+                title:add?'娣诲姞娴佺▼浠g悊':'淇敼娴佺▼浠g悊',
+                btn:['淇濆瓨','鍙栨秷'],
+                skin:'layui-layer-lan',
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                fullScreen:true,
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getFormItems(false),
+                        function () {
+                            if(!add){
+                                form.load(filter,{
+                                    backPath:that.backPath,
+                                    url:that.url.controller + that.url.getObjectByOid,
+                                    method:'get',
+                                    params:{
+                                        oid:oid
+                                    }
+                                });
+                            }else{
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+                        }, {}, {defaultColumnOneRow: 2});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        var url = that.url.controller + (add?that.url.addSave:that.url.editSave);
+                        webUtil.ajax(add?'post':'put',url,values,function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts= webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+        this.refresh = function () {
+            var that = this;
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+
+        this.ADVQUERY = function () {
+            var that = this;
+            if(!that.serinorQueryInstance) {
+                var dynamicCondition = layui.dynamicCondition;
+                $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar' + that.id + '" class="layui-inline"></div>');
+                var dataFields = that.columns;
+                that.serinorQueryInstance = dynamicCondition.create({
+                    fields: dataFields//鏌ヨ瀛楁
+                    , tableId: "table_" + that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                    , type: "complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                    //,conditionTextId:"#toolbar"+that.id//楂樼骇鏌ヨ 鎸夐挳鎵�鍦ㄧ殑div
+                    //,popupShowQueryBtn: true//鏄剧ず楂樼骇鏌ヨ鎸夐挳
+                    , queryCallBack: function (requestData) {//鏌ヨ涔嬪悗鐨刢allback
+                        //console.log(JSON.stringify(requestData))
+                    }
+                });
+            }
+            that.serinorQueryInstance.open();
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/VciProcessTemplate.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/VciProcessTemplate.js
new file mode 100644
index 0000000..48f1d54
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/VciProcessTemplate.js
@@ -0,0 +1,171 @@
+/**
+ * 娴佺▼妯℃澘
+ * @author weidy
+ * @date 2020-09-15
+ */
+layui.define(['layer','element','tree','table','upload','dynamicCondition' ,'platform/process/designer/VciProcessDesigner'],function(exports){
+    var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "platform/process/VciProcessTemplate";
+        this.moduleKey = "VciProcessTemplate";
+        this.backPath =  configData.compatibility?path:configData.processServicePath;
+        this.url = {
+            treeTemplateClassify:'workflowTemplateClassifyController/refDataGrid',
+            gridTemplate:'workflowDefineController/gridTemplate'
+
+        };
+        this.getContent=function(){
+            var that = this;
+            var html ;
+            html = [
+                '<div class="layui-layout" style="display:block;overflow-y: hidden">',
+                    '<div class="layui-layout-border" style="display:block;margin-top:0px; " id="border_',that.id,'">',
+                        '<div class="layui-center" style="overflow-y:auto;">',
+                            '<div style="padding: 5px;" >',
+                                '<span>娴佺▼妯℃澘绫诲瀷:</span>',
+                                '<select name="processTemplateClassify" style="width:260px;">',
+                                 '       <option value=""></option>',
+                                '</select>',
+                            '</div>',
+                            that.getToolbarHtml(),
+                            '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                            '<div id="toolbar_column_',that.id ,'" style="display:none;"></div>',
+                        '</div>',
+                    '</div>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.init = function(){
+            var that = this;
+            $webUtil.copyConfig(that,that.moduleKey);
+
+            var table = layui.table;
+            that.checkColumns();
+            var tableWidth = $("#border_" + that.id).width()-225;
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath:that.backPath,
+                url: that.url.gridTemplate,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                width:tableWidth,
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'DESIGN'){
+                                that.DESIGN(data.oid);
+                            }else if(layEvent == 'DEPLOY'){
+
+                            }
+                        });
+                    }else{
+                        if(total>0) {
+                            table.selectRecord('table_' + that.id, {index:0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                }
+            };
+            table.render(options);
+            document.getElementById("toolbar_column_" + that.id).innerHTML =
+                '<a class="layui-btn layui-btn-intable" lay-event="DESIGN">璁捐娴佺▼</a>' +
+                '<a class="layui-btn layui-btn-intable" lay-event="DEPLOY">鍙戝竷</a>' +
+                '<a class="layui-btn layui-btn-intable" lay-event="UPLOADPROCESS">涓婁紶</a>' +
+                '<a class="layui-btn layui-btn-intable" lay-event="CLONE">鍏嬮殕</a>'
+            ;
+            that.createSearchHtml();
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.createSearchHtml({name:"娴佺▼妯℃澘鍚嶇О",id:"娴佺▼妯℃澘缂栧彿"} ,$("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),
+                    {
+                        title: '娴佺▼妯℃澘缂栧彿',
+                        field: 'id',
+                        sort:true,
+                        width: 150
+                    }, {
+                        title: '娴佺▼妯℃澘鍚嶇О',
+                        field: 'name',
+                        sort:true,
+                        width: 150
+                    },{
+                        title:'鎵�灞炲垎绫�',
+                        field:'processTemplateClassifyName',
+                        width:150
+                    },{
+                        title:'鐘舵��',
+                        field:'lcStatusText',
+                        width:90
+                    },{
+                        title: '鎻忚堪',
+                        field: 'description',
+                        width: 150
+                    },{
+                        title:'鍒涘缓浜�',
+                        field:'creator',
+                        width:90
+                    },{
+                        title:'鍒涘缓鏃堕棿',
+                        field:'createTime',
+                        width:135,
+                        template:function (d) {
+                            return $webUtil.formateDateTimeNoSecond(d.createTime);
+                        }
+                    },{
+                        title:'鎿嶄綔',
+                        field:'options',
+                        width:300,
+                        toolbar:('#toolbar_column_' + that.id)
+                    }];
+            }
+        };
+        this.DESIGN = function (oid) {
+            var that = this;
+            var designer = layui['platform/process/designer/VciProcessDesigner'];
+            $webUtil.dialog({
+                title:'娴佺▼璁捐鍣�',
+                skin:'layui-layer-lan liucs',
+                btn:[],
+                content:'<div id="design_' + that.id + '"></div>',
+                fullScreen:true,
+                resize:false,
+                shadeClose: false,
+                success:function(layero) {
+                    designer.id = that.id;
+                    $("#design_" + that.id).html(designer.getContent());
+                    designer.init();
+                }
+            });
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/VciProcessTemplateClassify.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/VciProcessTemplateClassify.js
new file mode 100644
index 0000000..212af4d
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/VciProcessTemplateClassify.js
@@ -0,0 +1,263 @@
+/**
+ * 娴佺▼妯℃澘鍒嗙被椤甸潰
+ * @author weidy
+ * @date 2020-10-30
+ */
+layui.define(['layer','element','form','table','dynamicCondition' ],function(exports){
+        var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "platform/process/VciProcessTemplateClassify";
+        this.moduleKey = "WFWorkflowTemplateClassify";
+        this.backPath =  configData.compatibility?path:configData.processServicePath;
+        this.url = {
+            controller:'workflowTemplateClassifyController/',
+            dataGrid:'gridWFWorkflowTemplateClassify',
+            addSave:'addSave',
+            editSave:'editSave',
+            deleteUrl:'deleteData',
+            getObjectByOid:'getObjectByOid'
+        };
+        this.getContent=function(){
+            var that = this;
+            var html = "";
+            html = [
+                '<div class="layui-layout" style="display:block;overflow-y: hidden">',
+                    '<div class="layui-layout-border" style="display:block;margin-top:0px; " id="border_',that.id,'">',
+                        '<div class="layui-center" style="overflow-y:auto;">',
+                            that.getToolbarHtml(),
+                            '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                            '<div id="toolbar_column_',that.id ,'" style="display:none;"></div>',
+                        '</div>',
+                    '</div>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.createSearchHtml({id:"缂栧彿",name:"鍚嶇О"} ,$("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+        };
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            that.initMainTable();
+            that.createSearchHtml();
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var tableWidth = $("#border_" + that.id).width()-225;
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                width:tableWidth,
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'EDIT'){
+                                that.addOrEdit(false,data.oid);
+                            }
+                        });
+                    }else{
+                        if(total>0) {
+                            table.selectRecord('table_' + that.id, {index:0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                }
+            };
+            if(parentFieldName){
+                options.treeConfig = {
+                    treepid:parentFieldName,
+                    treeid:'id',
+                    showField:'name'
+                };
+            }
+            table.render(options);
+            document.getElementById("toolbar_column_" + that.id).innerHTML =
+                '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>';
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),
+                    {
+                        title: '缂栧彿',
+                        field: 'id',
+                        width: 150
+                    },                    {
+                        title: '鍚嶇О',
+                        field: 'name',
+                        width: 150
+                    },                    {
+                        title: '鎻忚堪',
+                        field: 'description',
+                        width: 150
+                    }        ];
+            }
+        };
+
+        this.getFormItems = function(onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [
+                {
+                    field: 'id',
+                    title: '缂栧彿',
+                    required: true,
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'name',
+                    title: '鍚嶇О',
+                    required: true,
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'description',
+                    title: '鎻忚堪',
+                    type: 'text',
+                    readOnly:onlyShow
+                }             ];
+        };
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            that.addOrEdit(false,oid);
+        };
+        this.addOrEdit = function(add,oid) {
+            var that = this;
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var addSaveIndex =webUtil.dialog({
+                title:add?'娣诲姞娴佺▼妯℃澘鍒嗙被':'淇敼娴佺▼妯℃澘鍒嗙被',
+                btn:['淇濆瓨','鍙栨秷'],
+                skin:'layui-layer-lan',
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                area:['920px','300px'],
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getFormItems(false),
+                        function () {
+                            if(!add){
+                                form.load(filter,{
+                                    backPath:that.backPath,
+                                    url:that.url.controller + that.url.getObjectByOid,
+                                    method:'get',
+                                    params:{
+                                        oid:oid
+                                    }
+                                });
+                            }else{
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+                        }, {}, {defaultColumnOneRow: 2});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        var url = that.url.controller + (add?that.url.addSave:that.url.editSave);
+                        webUtil.ajax(add?'post':'put',url,values,function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts= webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+        this.refresh = function () {
+            var that = this;
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+
+        this.ADVQUERY = function () {
+            var that = this;
+            if(!that.serinorQueryInstance) {
+                var dynamicCondition = layui.dynamicCondition;
+                $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar' + that.id + '" class="layui-inline"></div>');
+                var dataFields = that.columns;
+                that.serinorQueryInstance = dynamicCondition.create({
+                    fields: dataFields//鏌ヨ瀛楁
+                    , tableId: "table_" + that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                    , type: "complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                    //,conditionTextId:"#toolbar"+that.id//楂樼骇鏌ヨ 鎸夐挳鎵�鍦ㄧ殑div
+                    //,popupShowQueryBtn: true//鏄剧ず楂樼骇鏌ヨ鎸夐挳
+                    , queryCallBack: function (requestData) {//鏌ヨ涔嬪悗鐨刢allback
+                        //console.log(JSON.stringify(requestData))
+                    }
+                });
+            }
+            that.serinorQueryInstance.open();
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/VciProcessUserGroup.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/VciProcessUserGroup.js
new file mode 100644
index 0000000..52073ac
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/VciProcessUserGroup.js
@@ -0,0 +1,303 @@
+/**
+ * 娴佺▼鐢ㄦ埛缁勯〉闈�
+ * @author weidy
+ * @date 2020-09-29
+ */
+layui.define(['layer','element','form','table','dynamicCondition' ],function(exports){
+        var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "platform/process/VciProcessUserGroup";
+        this.moduleKey = "WFWorkflowUserGroup";
+        this.backPath =  configData.compatibility?path:configData.processServicePath;
+        this.url = {
+            controller:'wFWorkflowUserGroupController/',
+            dataGrid:'gridWFWorkflowUserGroup',
+            addSave:'addSave',
+            editSave:'editSave',
+            deleteUrl:'deleteData',
+            enableData: 'enableData',
+            disableData: 'disableData',
+            getObjectByOid:'getObjectByOid'
+        };
+        this.getContent=function(){
+            var that = this;
+            var html = "";
+            html = [
+                '<div class="layui-layout" style="display:block;overflow-y: hidden">',
+                    '<div class="layui-layout-border" style="display:block;margin-top:0px; " id="border_',that.id,'">',
+                        '<div class="layui-center" style="overflow-y:auto;">',
+                            that.getToolbarHtml(),
+                            '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                            '<div id="toolbar_column_',that.id ,'" style="display:none;"></div>',
+                        '</div>',
+                    '</div>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.createSearchHtml({id:"缂栧彿",name:"鍚嶇О"} ,$("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+        };
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            that.initMainTable();
+            that.createSearchHtml();
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var tableWidth = $("#border_" + that.id).width()-225;
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                width:tableWidth,
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'EDIT'){
+                                that.addOrEdit(false,data.oid);
+                            }
+                        });
+                    }else{
+                        if(total>0) {
+                            table.selectRecord('table_' + that.id, {index:0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                }
+            };
+            if(parentFieldName){
+                options.treeConfig = {
+                    treepid:parentFieldName,
+                    treeid:'id',
+                    showField:'name'
+                };
+            }
+            table.render(options);
+            document.getElementById("toolbar_column_" + that.id).innerHTML =
+                '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>';
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),
+                    {
+                        title: '鍚嶇О',
+                        field: 'name',
+                        width: 150
+                    },                    {
+                        title: '鎻忚堪',
+                        field: 'description',
+                        width: 150
+                    },                    {
+                        title: '鐢熷懡鍛ㄦ湡鍊�',
+                        field: 'lcStatus',
+                        width: 150
+                    },                    {
+                        title: '缂栧彿',
+                        field: 'id',
+                        width: 150
+                    }        ];
+            }
+        };
+
+        this.getFormItems = function(onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [
+                {
+                    field: 'name',
+                    title: '鍚嶇О',
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'description',
+                    title: '鎻忚堪',
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'lcStatus',
+                    title: '鐢熷懡鍛ㄦ湡鍊�',
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'id',
+                    title: '缂栧彿',
+                    type: 'text',
+                    readOnly:onlyShow
+                }             ];
+        };
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            that.addOrEdit(false,oid);
+        };
+        this.addOrEdit = function(add,oid) {
+            var that = this;
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var addSaveIndex =webUtil.dialog({
+                title:add?'娣诲姞娴佺▼鐢ㄦ埛缁�':'淇敼娴佺▼鐢ㄦ埛缁�',
+                btn:['淇濆瓨','鍙栨秷'],
+                skin:'layui-layer-lan',
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                fullScreen:true,
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getFormItems(false),
+                        function () {
+                            if(!add){
+                                form.load(filter,{
+                                    backPath:that.backPath,
+                                    url:that.url.controller + that.url.getObjectByOid,
+                                    method:'get',
+                                    params:{
+                                        oid:oid
+                                    }
+                                });
+                            }else{
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+                        }, {}, {defaultColumnOneRow: 2});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        var url = that.url.controller + (add?that.url.addSave:that.url.editSave);
+                        webUtil.ajax(add?'post':'put',url,values,function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts= webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+        this.refresh = function () {
+            var that = this;
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+        this.DISABLE = function () {
+            var that = this;
+            that.disableOrEnable(false);
+        };
+        this.ENABLE = function () {
+            var that = this;
+            that.disableOrEnable(true);
+        };
+        this.disableOrEnable = function (enable) {
+            var that = this;
+            var oid ;
+            var ts ;
+            oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            ts = webUtil.getOidFromGrid("table_" + that.id,false,false,'ts');
+            webUtil.post(that.url.controller + (enable?that.url.enableData:that.url.disableData),{
+                oid:oid,
+                ts:ts
+                },function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,(enable?'鍚敤鎴愬姛':'鍋滅敤鎴愬姛'));
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+        };
+
+        this.ADVQUERY = function () {
+            var that = this;
+            if(!that.serinorQueryInstance) {
+                var dynamicCondition = layui.dynamicCondition;
+                $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar' + that.id + '" class="layui-inline"></div>');
+                var dataFields = that.columns;
+                that.serinorQueryInstance = dynamicCondition.create({
+                    fields: dataFields//鏌ヨ瀛楁
+                    , tableId: "table_" + that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                    , type: "complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                    //,conditionTextId:"#toolbar"+that.id//楂樼骇鏌ヨ 鎸夐挳鎵�鍦ㄧ殑div
+                    //,popupShowQueryBtn: true//鏄剧ず楂樼骇鏌ヨ鎸夐挳
+                    , queryCallBack: function (requestData) {//鏌ヨ涔嬪悗鐨刢allback
+                        //console.log(JSON.stringify(requestData))
+                    }
+                });
+            }
+            that.serinorQueryInstance.open();
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/WfWorkflowHandle.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/WfWorkflowHandle.js
new file mode 100644
index 0000000..04658ba
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/WfWorkflowHandle.js
@@ -0,0 +1,325 @@
+/**
+ * 娴佺▼浜嬩欢椤甸潰
+ * @author weidy
+ * @date 2020-09-24
+ */
+layui.define(['layer','element','form','table','dynamicCondition' ],function(exports){
+        var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "platform/process/WfWorkflowHandle";
+        this.moduleKey = "WFWorkflowHandle";
+        this.backPath =  configData.compatibility?path:configData.processServicePath;
+        this.url = {
+            controller:'workflowHandleController/',
+            dataGrid:'gridWFWorkflowHandle',
+            addSave:'addSave',
+            editSave:'editSave',
+            deleteUrl:'deleteData',
+            getObjectByOid:'getObjectByOid'
+        };
+        this.getContent=function(){
+            var that = this;
+            var html = "";
+            html = [
+                '<div class="layui-layout" style="display:block;overflow-y: hidden">',
+                    '<div class="layui-layout-border" style="display:block;margin-top:0px; " id="border_',that.id,'">',
+                        '<div class="layui-center" style="overflow-y:auto;">',
+                            that.getToolbarHtml(),
+                            '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                            '<div id="toolbar_column_',that.id ,'" style="display:none;"></div>',
+                        '</div>',
+                    '</div>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.createSearchHtml({id:"缂栧彿",name:"鍚嶇О"} ,$("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+        };
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            that.initMainTable();
+            that.createSearchHtml();
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var tableWidth = $("#border_" + that.id).width()-225;
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                width:tableWidth,
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'EDIT'){
+                                that.addOrEdit(false,data.oid);
+                            }
+                        });
+                    }else{
+                        if(total>0) {
+                            table.selectRecord('table_' + that.id, {index:0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                }
+            };
+            if(parentFieldName){
+                options.treeConfig = {
+                    treepid:parentFieldName,
+                    treeid:'id',
+                    showField:'name'
+                };
+            }
+            table.render(options);
+            document.getElementById("toolbar_column_" + that.id).innerHTML =
+                '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>';
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),
+                    {
+                        title: '缂栧彿',
+                        field: 'id',
+                        width: 150
+                    },                    {
+                        title: '鍚嶇О',
+                        field: 'name',
+                        width: 150
+                    },                    {
+                        title: '绫昏矾寰�',
+                        field: 'classFullPath',
+                        width: 150
+                    },                    {
+                        title: '鎻忚堪',
+                        field: 'description',
+                        width: 150
+                    },                    {
+                        title: '鏄惁鍙敤浜庡紑濮嬩簨浠�',
+                        field: 'useInStartFlag',
+                        width: 60,
+                        templet: function (d) {
+                            return webUtil.formateBoolean(d.useInStartFlag);
+                        }
+                    },                    {
+                        title: '鏄惁鍙敤浜庣粨鏉熶簨浠�',
+                        field: 'useInCompleteFlag',
+                        width: 60,
+                        templet: function (d) {
+                            return webUtil.formateBoolean(d.useInCompleteFlag);
+                        }
+                    },                    {
+                        title: '鏄惁鍙敤浜庣粓姝簨浠�',
+                        field: 'useInEndFlag',
+                        width: 60,
+                        templet: function (d) {
+                            return webUtil.formateBoolean(d.useInEndFlag);
+                        }
+                    },                    {
+                        title: '鏄惁鍙敤浜庤繛鎺ョ嚎',
+                        field: 'useInTransitionFlag',
+                        width: 60,
+                        templet: function (d) {
+                            return webUtil.formateBoolean(d.useInTransitionFlag);
+                        }
+                    }        ];
+            }
+        };
+
+        this.getFormItems = function(onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [
+                {
+                    field: 'id',
+                    title: '缂栧彿',
+                    required: true,
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'name',
+                    title: '鍚嶇О',
+                    required: true,
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'classFullPath',
+                    title: '绫昏矾寰�',
+                    required: true,
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'description',
+                    title: '鎻忚堪',
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'useInStartFlag',
+                    title: '鏄惁鍙敤浜庡紑濮嬩簨浠�',
+                    type: 'truefalse',
+                    defaultValue:"true",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'useInCompleteFlag',
+                    title: '鏄惁鍙敤浜庣粨鏉熶簨浠�',
+                    type: 'truefalse',
+                    defaultValue:"true",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'useInEndFlag',
+                    title: '鏄惁鍙敤浜庣粓姝簨浠�',
+                    type: 'truefalse',
+                    defaultValue:"true",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'useInTransitionFlag',
+                    title: '鏄惁鍙敤浜庤繛鎺ョ嚎',
+                    type: 'truefalse',
+                    defaultValue:"true",
+                    readOnly:onlyShow
+                }             ];
+        };
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            that.addOrEdit(false,oid);
+        };
+        this.addOrEdit = function(add,oid) {
+            var that = this;
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var addSaveIndex =webUtil.dialog({
+                title:add?'娣诲姞娴佺▼浜嬩欢':'淇敼娴佺▼浜嬩欢',
+                btn:['淇濆瓨','鍙栨秷'],
+                skin:'layui-layer-lan',
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                fullScreen:true,
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getFormItems(false),
+                        function () {
+                            if(!add){
+                                form.load(filter,{
+                                    backPath:that.backPath,
+                                    url:that.url.controller + that.url.getObjectByOid,
+                                    method:'get',
+                                    params:{
+                                        oid:oid
+                                    }
+                                });
+                            }else{
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+                        }, {}, {defaultColumnOneRow: 2});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        var url = that.url.controller + (add?that.url.addSave:that.url.editSave);
+                        webUtil.ajax(add?'post':'put',url,values,function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts= webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+        this.refresh = function () {
+            var that = this;
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+
+        this.ADVQUERY = function () {
+            var that = this;
+            if(!that.serinorQueryInstance) {
+                var dynamicCondition = layui.dynamicCondition;
+                $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar' + that.id + '" class="layui-inline"></div>');
+                var dataFields = that.columns;
+                that.serinorQueryInstance = dynamicCondition.create({
+                    fields: dataFields//鏌ヨ瀛楁
+                    , tableId: "table_" + that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                    , type: "complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                    //,conditionTextId:"#toolbar"+that.id//楂樼骇鏌ヨ 鎸夐挳鎵�鍦ㄧ殑div
+                    //,popupShowQueryBtn: true//鏄剧ず楂樼骇鏌ヨ鎸夐挳
+                    , queryCallBack: function (requestData) {//鏌ヨ涔嬪悗鐨刢allback
+                        //console.log(JSON.stringify(requestData))
+                    }
+                });
+            }
+            that.serinorQueryInstance.open();
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/VciProcessDesigner.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/VciProcessDesigner.js
new file mode 100644
index 0000000..e3a6e99
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/VciProcessDesigner.js
@@ -0,0 +1,125 @@
+/**
+ * 娴佺▼璁捐鍣�
+ * @author weidy
+ * @date 2020-09-15
+ */
+layui.define(['layer','element' ],function(exports){
+    var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "platform/process/designer/VciProcessDesigner";
+        this.moduleKey = "VciProcessDesigner";
+        this.backPath =  configData.compatibility?path:configData.processServicePath;
+        this.url = {
+            listDepts:'departmentQueryController/refDataGrid',
+            listRoles:'roleQueryController/refDataGrid',
+            listUser:'userQueryController/refDataGrid',
+            listDuty:'dutyQueryController/refDataGrid', 
+            listWorkType:'smWorkTypeController/refDataGrid',
+            listUserByDept:'userQueryController/refDataGridByPkDepartment',
+            listUserByRole:'userQueryController/refDataGridByPkRole',
+            listUserByDuty:'userQueryController/refDataGridByPkDuty',
+            listProcessUserGroup:''
+        };
+        this.getContent=function(){
+            var that = this;
+            var html = "";
+            html = [
+                '<div class="layui-layout" style="display:block;overflow-y: auto">',
+                    that.getToolbarHtml(),
+                    '<div class="layui-layout-border" style="display:block;margin-top:0px;position:relative;height:815px;overflow:hidden;background:#f2f2f2;" id="border_',that.id,'">',
+                        '<style type="text/css">.processElement{' ,
+                        'background-color:#f2f2f2;color:#000;width:95px;font-size:16px;' ,
+                        '}</style>',
+                        '<div class="layui-west" style="width:135px;float: left;margin-top: 5px;">',
+                            '<fieldset style="margin-left:10px;"><legend style="margin-left:10px;"><a href="javascript:void(0);" style="color:#0000ff;font-size:16px;">娴佺▼鍏冪礌</a></legend></fieldset>',
+                            '<div class="layui-collapse">',
+                                '<div class="layui-colla-item">',
+                                    '<h2 class="layui-colla-title">寮�濮嬬粨鏉�</h2>',
+                                    '<div class="layui-colla-content layui-show">',
+                                        '<button class="layui-btn layui-btn-sm processElement"  layui-filter="toolbar_',that.id,'_START"><i class="layui-icon layui-icon-circle-dot" style="color:green"></i>寮�濮�</button></br>',
+                                        '<button class="layui-btn layui-btn-sm processElement"  layui-filter="toolbar_',that.id,'_END"><i class="layui-icon layui-icon-circle-dot" style="color:red;"></i>缁撴潫</button></br>',
+                                    '</div>',
+                                '</div>',
+                                '<div class="layui-colla-item">',
+                                    '<h2 class="layui-colla-title">浠诲姟绫诲瀷</h2>',
+                                    '<div class="layui-colla-content" >',
+                                        '<button class="layui-btn layui-btn-sm processElement" layui-filter="toolbar_',that.id,'_USERTASK"><i class="layui-icon layui-icon-user" ></i>鐢ㄦ埛浠诲姟</button></br>',
+                                        '<button class="layui-btn layui-btn-sm processElement" layui-filter="toolbar_',that.id,'_MANUTASK"><i class="layui-icon layui-icon-praise" ></i>鎵嬪姩浠诲姟</button></br>',
+                                        '<button class="layui-btn layui-btn-sm processElement" layui-filter="toolbar_',that.id,'_SERVICETASK"><i class="layui-icon layui-icon-set" ></i>鏈嶅姟浠诲姟</button></br>',
+                                        '<button class="layui-btn layui-btn-sm processElement" layui-filter="toolbar_',that.id,'_SECRIPTTASK"><i class="layui-icon layui-icon-console" ></i>鑴氭湰浠诲姟</button></br>',
+                                        '<button class="layui-btn layui-btn-sm processElement" layui-filter="toolbar_',that.id,'_EMAILTASK"><i class="layui-icon layui-icon-email" ></i>閭欢浠诲姟</button></br>',
+                                        '<button class="layui-btn layui-btn-sm processElement" layui-filter="toolbar_',that.id,'_RECEIVETASK"><i class="layui-icon layui-icon-email" style="color:green;"></i>鎺ュ彈浠诲姟</button></br>',
+                                        '<button class="layui-btn layui-btn-sm processElement" layui-filter="toolbar_',that.id,'_RULETASK"><i class="layui-icon layui-icon-table" ></i>涓氬姟瑙勫垯</button></br>',
+                                        '<button class="layui-btn layui-btn-sm processElement" layui-filter="toolbar_',that.id,'_SUBTASK"><i class="layui-icon layui-icon-engine" ></i>瀛愭祦绋�</button></br>',
+                                    '</div>',
+                                '</div>',
+                                '<div class="layui-colla-item">',
+                                    '<h2 class="layui-colla-title">缃戝叧</h2>',
+                                    '<div class="layui-colla-content">',
+                                        '<button class="layui-btn layui-btn-sm processElement"  layui-filter="toolbar_',that.id,'_GATEAND"><i class="layui-icon layui-icon-add-circle" ></i>鍚屾</button></br>',
+                                        '<button class="layui-btn layui-btn-sm processElement"  layui-filter="toolbar_',that.id,'_GATEOR"><i class="layui-icon layui-icon-share" ></i>鍒嗘敮</button></br>',
+                                        '<button class="layui-btn layui-btn-sm processElement"  layui-filter="toolbar_',that.id,'_GATEINCLUDE"><i class="layui-icon layui-icon-component" ></i>鍖呭惈</button></br>',
+                                    '</div>',
+                                '</div>',
+                                '<div class="layui-colla-item">',
+                                    '<h2 class="layui-colla-title">杈圭晫浜嬩欢</h2>',
+                                    '<div class="layui-colla-content">',
+                                        '<button class="layui-btn layui-btn-sm processElement"  layui-filter="toolbar_',that.id,'_TIMEEVENT"><i class="layui-icon layui-icon-time"></i>鏃堕棿杈圭晫</button></br>',
+                                        '<button class="layui-btn layui-btn-sm processElement"  layui-filter="toolbar_',that.id,'_EXCEPTIONEVENT"><i class="layui-icon layui-icon-close-fill"></i>閿欒杈圭晫</button></br>',
+                                    '</div>',
+                                '</div>',
+                            '</div>',
+                        '</div>',
+                        '<div class="layui-center layuiCenter" id="center_',that.id,'">',
+                             '<fieldset style="margin-left:10px;width:123px;"><legend style="margin-left:10px;"><a href="javascript:void(0);" style="color:#0000ff;font-size:16px;">娴佺▼缁樺埗</a></legend></fieldset>',
+                             '<div class="layui-tab" lay-filter="design_panel_',that.id,'">',
+                                 '<ul class="layui-tab-title">',
+                                     '<li class="layui-this">璁捐</li>',
+                                     '<li>婧愮爜</li>',
+                                 '</ul>',
+                                 '<div class="layui-tab-content" style="padding:0px;">',
+                                     '<div class="layui-tab-item layui-show" id="designer-area" style="POSITION: absolute;width:100%;height:100%;padding: 0;border: none;overflow:auto">' ,
+                                        '<div id="paintarea" style="POSITION: absolute;WIDTH: 100%; HEIGHT: 100%;background:url(\'./vciweb/platform/process/designer/images/paint.png\') repeat; " ></div>',
+                                     '</div>',
+                                     '<div class="layui-tab-item ">',
+                                        '<pre class="layui-code" style="width: 100%;height:100%;padding: 0;border: none;"></pre>',
+                                    '</div>',
+                                 '</div>',
+                             '</div>',
+                        '</div>',
+                        '<div class="layui-east" style="overflow-y:auto;overflow-x:hidden;width:280px;">',
+                            '<fieldset style="margin-left:10px;"><legend style="margin-left:10px;"><a href="javascript:void(0);" style="color:#0000ff;font-size:16px;">娴佺▼锛堜换鍔★級灞炴��</a></legend></fieldset>',
+                            '<div class="layui-collapse" id="process_properties_',that.id,'">',
+                            '</div>',
+                        '</div>',
+                    '</div>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons" style="padding:5px">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_SAVE"><i class="layui-icon layui-icon-template-1"></i>淇濆瓨</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_REBACK"><i class="layui-icon layui-icon-prev"></i>鎾ら攢</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_REDO"><i class="layui-icon layui-icon-next"></i>閲嶅仛</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EXPORT"><i class="layui-icon layui-icon-export"></i>瀵煎嚭</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.init = function(options){
+            var that = this;
+            var allWidth = $("#border_" + that.id ).parent().parent().width();
+            var centerWidth = allWidth - 265;
+            $("#center_" + that.id).width(centerWidth);
+            $("#designer-area").width(centerWidth);
+            $("#paintarea").width(centerWidth);
+            layui.element.render();
+        };
+
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/css/style.css b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/css/style.css
new file mode 100644
index 0000000..b38b0f7
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/css/style.css
@@ -0,0 +1,91 @@
+a{border:none;}
+a:visited{TEXT-DECORATION:none;color:black} 
+a:link{text-decoration:none;color:black} 
+a:hover{TEXT-DECORATION:none;color:black} 
+.icon-upload{
+	background:url('../image/upload.png') no-repeat;
+}
+.loginpage-tab{
+	border:0px;
+}
+.loginpage-userName-icon{
+	background:url('../image/user_icon.png') no-repeat top left;
+}
+.loginpage-pwd-icon{
+	background:url('../image/password_icon.png') no-repeat top left;
+}
+.
+.portlet-calendar-icon{
+	background:url('../image/calendar.png') no-repeat top left;
+}
+.portlet-clock-icon{
+	background:url('../image/clock.png') no-repeat top left;
+}
+.portlet-weather-icon{
+	background:url('../image/weather.png') no-repeat top left;
+}
+.portlet-task-icon{
+	background:url('../image/task.png') no-repeat top left;
+}
+.portlet-message-icon{
+	background:url('../image/message.png') no-repeat top left;
+}
+.homepage-user-welcome{
+	background:url('../image/welcome.gif') no-repeat top left;
+}
+.homepage-banner-bt-home{
+	background:url('../image/homePage.png') no-repeat top left;
+}
+.homepage-banner-bt-help{
+	background:url('../image/help.png') no-repeat top left;
+}
+.homepage-banner-bt-password{
+	background:url('../image/setPassword.gif') no-repeat top left;
+}
+.homepage-banner-bt-logout{
+	background:url('../image/logout.png') no-repeat top left;
+}
+.homepage-menu-header{
+	background:url('../image/menu.png') no-repeat top left;
+}
+<!-- change style button-->
+
+.blue-style{ }
+.blue-style a{ width:10px; height:9px; margin-right:10px; float:left; }
+.blue-style .a1{ background:url(../image/hua.gif) no-repeat;float:left;margin-left:55px;display:inline;	margin-top:8px;}
+.blue-style .a2{ background:url(../image/lv.gif) no-repeat;margin-top:8px;}
+.blue-style .a3{  background:url(../image/lan2.gif) no-repeat;margin-top:8px;}
+.blue-style .a4{  background:url(../image/hui.gif) no-repeat;margin-top:8px;}
+.blue-style .a5{  background:url(../image/fen.gif) no-repeat;margin-top:8px;}
+
+.gray-style{ }
+.gray-style a{ width:10px; height:9px; margin-right:10px; float:left; }
+.gray-style .a1{ background:url(../image/hua.gif) no-repeat;float:left;margin-left:55px;display:inline;	margin-top:8px;}
+.gray-style .a2{ background:url(../image/lv.gif) no-repeat;margin-top:8px;}
+.gray-style .a3{  background:url(../image/lan.gif) no-repeat;margin-top:8px;}
+.gray-style .a4{  background:url(../image/hui2.gif) no-repeat;margin-top:8px;}
+.gray-style .a5{  background:url(../image/fen.gif) no-repeat;margin-top:8px;}
+
+.green-style{ }
+.green-style a{ width:10px; height:9px; margin-right:10px; float:left; }
+.green-style .a1{ background:url(../image/hua.gif) no-repeat;float:left;margin-left:55px;display:inline;	margin-top:8px;}
+.green-style .a2{ background:url(../image/lv2.gif) no-repeat;margin-top:8px;}
+.green-style .a3{  background:url(../image/lan.gif) no-repeat;margin-top:8px;}
+.green-style .a4{  background:url(../image/hui.gif) no-repeat;margin-top:8px;}
+.green-style .a5{  background:url(../image/fen.gif) no-repeat;margin-top:8px;}
+
+.orange-style{ }
+.orange-style a{ width:10px; height:9px; margin-right:10px; float:left; }
+.orange-style .a1{ background:url(../image/hua2.gif) no-repeat;float:left;margin-left:55px;display:inline;	margin-top:8px;}
+.orange-style .a2{ background:url(../image/lv.gif) no-repeat;margin-top:8px;}
+.orange-style .a3{  background:url(../image/lan.gif) no-repeat;margin-top:8px;}
+.orange-style .a4{  background:url(../image/hui.gif) no-repeat;margin-top:8px;}
+.orange-style .a5{  background:url(../image/fen.gif) no-repeat;margin-top:8px;}
+
+.pink-style{ }
+.pink-style a{ width:10px; height:9px; margin-right:10px; float:left; }
+.pink-style .a1{ background:url(../image/hua.gif) no-repeat;float:left;margin-left:55px;display:inline;	margin-top:8px;}
+.pink-style .a2{ background:url(../image/lv.gif) no-repeat;margin-top:8px;}
+.pink-style .a3{  background:url(../image/lan.gif) no-repeat;margin-top:8px;}
+.pink-style .a4{  background:url(../image/hui.gif) no-repeat;margin-top:8px;}
+.pink-style .a5{  background:url(../image/fen2.gif) no-repeat;margin-top:8px;}
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/draw2d/draw2d.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/draw2d/draw2d.js
new file mode 100644
index 0000000..8c7ec56
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/draw2d/draw2d.js
@@ -0,0 +1,10427 @@
+/**
+ * This notice must be untouched at all times. This is the COMPRESSED version of
+ * the Draw2D Library WebSite: http://www.draw2d.org Copyright: 2006 Andreas
+ * Herz. All rights reserved. Created: 5.11.2006 by Andreas Herz (Web:
+ * http://www.freegroup.de ) LICENSE: LGPL
+ */
+var draw2d = new Object();
+var _errorStack_ = [];
+function pushErrorStack(e, _56b2) {
+	_errorStack_.push(_56b2 + "\n");
+	throw e;
+}
+draw2d.AbstractEvent = function() {
+	this.type = null;
+	this.target = null;
+	this.relatedTarget = null;
+	this.cancelable = false;
+	this.timeStamp = null;
+	this.returnValue = true;
+};
+draw2d.AbstractEvent.prototype.initEvent = function(sType, _56b4) {
+	this.type = sType;
+	this.cancelable = _56b4;
+	this.timeStamp = (new Date()).getTime();
+};
+draw2d.AbstractEvent.prototype.preventDefault = function() {
+	if (this.cancelable) {
+		this.returnValue = false;
+	}
+};
+draw2d.AbstractEvent.fireDOMEvent = function(_56b5, _56b6) {
+	if (document.createEvent) {
+		var evt = document.createEvent("Events");
+		evt.initEvent(_56b5, true, true);
+		_56b6.dispatchEvent(evt);
+	} else {
+		if (document.createEventObject) {
+			var evt = document.createEventObject();
+			_56b6.fireEvent("on" + _56b5, evt);
+		}
+	}
+};
+draw2d.EventTarget = function() {
+	this.eventhandlers = {};
+};
+draw2d.EventTarget.prototype.addEventListener = function(sType, _56b9) {
+	if (typeof this.eventhandlers[sType] == "undefined") {
+		this.eventhandlers[sType] = [];
+	}
+	this.eventhandlers[sType][this.eventhandlers[sType].length] = _56b9;
+};
+draw2d.EventTarget.prototype.dispatchEvent = function(_56ba) {
+	_56ba.target = this;
+	if (typeof this.eventhandlers[_56ba.type] != "undefined") {
+		for ( var i = 0; i < this.eventhandlers[_56ba.type].length; i++) {
+			this.eventhandlers[_56ba.type][i](_56ba);
+		}
+	}
+	return _56ba.returnValue;
+};
+draw2d.EventTarget.prototype.removeEventListener = function(sType, _56bd) {
+	if (typeof this.eventhandlers[sType] != "undefined") {
+		var _56be = [];
+		for ( var i = 0; i < this.eventhandlers[sType].length; i++) {
+			if (this.eventhandlers[sType][i] != _56bd) {
+				_56be[_56be.length] = this.eventhandlers[sType][i];
+			}
+		}
+		this.eventhandlers[sType] = _56be;
+	}
+};
+String.prototype.trim = function() {
+	return (this.replace(new RegExp("^([\\s]+)|([\\s]+)$", "gm"), ""));
+};
+String.prototype.lefttrim = function() {
+	return (this.replace(new RegExp("^[\\s]+", "gm"), ""));
+};
+String.prototype.righttrim = function() {
+	return (this.replace(new RegExp("[\\s]+$", "gm"), ""));
+};
+String.prototype.between = function(left, right, _558a) {
+	if (!_558a) {
+		_558a = 0;
+	}
+	var li = this.indexOf(left, _558a);
+	if (li == -1) {
+		return null;
+	}
+	var ri = this.indexOf(right, li);
+	if (ri == -1) {
+		return null;
+	}
+	return this.substring(li + left.length, ri);
+};
+draw2d.UUID = function() {
+};
+draw2d.UUID.prototype.type = "draw2d.UUID";
+draw2d.UUID.create = function() {
+	var _4a13 = function() {
+		return (((1 + Math.random()) * 65536) | 0).toString(16).substring(1);
+	};
+	return (_4a13() + _4a13() + "-" + _4a13() + "-" + _4a13() + "-" + _4a13()
+			+ "-" + _4a13() + _4a13() + _4a13());
+};
+draw2d.ArrayList = function() {
+	this.increment = 10;
+	this.size = 0;
+	this.data = new Array(this.increment);
+};
+draw2d.ArrayList.EMPTY_LIST = new draw2d.ArrayList();
+draw2d.ArrayList.prototype.type = "draw2d.ArrayList";
+draw2d.ArrayList.prototype.reverse = function() {
+	var _4b1e = new Array(this.size);
+	for ( var i = 0; i < this.size; i++) {
+		_4b1e[i] = this.data[this.size - i - 1];
+	}
+	this.data = _4b1e;
+};
+draw2d.ArrayList.prototype.getCapacity = function() {
+	return this.data.length;
+};
+draw2d.ArrayList.prototype.getSize = function() {
+	return this.size;
+};
+draw2d.ArrayList.prototype.isEmpty = function() {
+	return this.getSize() === 0;
+};
+draw2d.ArrayList.prototype.getLastElement = function() {
+	if (this.data[this.getSize() - 1] !== null) {
+		return this.data[this.getSize() - 1];
+	}
+};
+draw2d.ArrayList.prototype.getFirstElement = function() {
+	if (this.data[0] !== null && this.data[0] !== undefined) {
+		return this.data[0];
+	}
+	return null;
+};
+draw2d.ArrayList.prototype.get = function(i) {
+	return this.data[i];
+};
+draw2d.ArrayList.prototype.add = function(obj) {
+	if (this.getSize() == this.data.length) {
+		this.resize();
+	}
+	this.data[this.size++] = obj;
+};
+draw2d.ArrayList.prototype.addAll = function(obj) {
+	for ( var i = 0; i < obj.getSize(); i++) {
+		this.add(obj.get(i));
+	}
+};
+draw2d.ArrayList.prototype.remove = function(obj) {
+	var index = this.indexOf(obj);
+	if (index >= 0) {
+		return this.removeElementAt(index);
+	}
+	return null;
+};
+draw2d.ArrayList.prototype.insertElementAt = function(obj, index) {
+	if (this.size == this.capacity) {
+		this.resize();
+	}
+	for ( var i = this.getSize(); i > index; i--) {
+		this.data[i] = this.data[i - 1];
+	}
+	this.data[index] = obj;
+	this.size++;
+};
+draw2d.ArrayList.prototype.removeElementAt = function(index) {
+	var _4b2a = this.data[index];
+	for ( var i = index; i < (this.getSize() - 1); i++) {
+		this.data[i] = this.data[i + 1];
+	}
+	this.data[this.getSize() - 1] = null;
+	this.size--;
+	return _4b2a;
+};
+draw2d.ArrayList.prototype.removeAllElements = function() {
+	this.size = 0;
+	for ( var i = 0; i < this.data.length; i++) {
+		this.data[i] = null;
+	}
+};
+draw2d.ArrayList.prototype.indexOf = function(obj) {
+	for ( var i = 0; i < this.getSize(); i++) {
+		if (this.data[i] == obj) {
+			return i;
+		}
+	}
+	return -1;
+};
+draw2d.ArrayList.prototype.contains = function(obj) {
+	for ( var i = 0; i < this.getSize(); i++) {
+		if (this.data[i] == obj) {
+			return true;
+		}
+	}
+	return false;
+};
+draw2d.ArrayList.prototype.resize = function() {
+	newData = new Array(this.data.length + this.increment);
+	for ( var i = 0; i < this.data.length; i++) {
+		newData[i] = this.data[i];
+	}
+	this.data = newData;
+};
+draw2d.ArrayList.prototype.trimToSize = function() {
+	if (this.data.length == this.size) {
+		return;
+	}
+	var temp = new Array(this.getSize());
+	for ( var i = 0; i < this.getSize(); i++) {
+		temp[i] = this.data[i];
+	}
+	this.size = temp.length;
+	this.data = temp;
+};
+draw2d.ArrayList.prototype.sort = function(f) {
+	var i, j;
+	var _4b36;
+	var _4b37;
+	var _4b38;
+	var _4b39;
+	for (i = 1; i < this.getSize(); i++) {
+		_4b37 = this.data[i];
+		_4b36 = _4b37[f];
+		j = i - 1;
+		_4b38 = this.data[j];
+		_4b39 = _4b38[f];
+		while (j >= 0 && _4b39 > _4b36) {
+			this.data[j + 1] = this.data[j];
+			j--;
+			if (j >= 0) {
+				_4b38 = this.data[j];
+				_4b39 = _4b38[f];
+			}
+		}
+		this.data[j + 1] = _4b37;
+	}
+};
+draw2d.ArrayList.prototype.clone = function() {
+	var _4b3a = new draw2d.ArrayList(this.size);
+	for ( var i = 0; i < this.size; i++) {
+		_4b3a.add(this.data[i]);
+	}
+	return _4b3a;
+};
+draw2d.ArrayList.prototype.overwriteElementAt = function(obj, index) {
+	this.data[index] = obj;
+};
+draw2d.ArrayList.prototype.getPersistentAttributes = function() {
+	return {
+		data : this.data,
+		increment : this.increment,
+		size : this.getSize()
+	};
+};
+function trace(_5cb5) {
+	var _5cb6 = openwindow("about:blank", 700, 400);
+	_5cb6.document.writeln("<pre>" + _5cb5 + "</pre>");
+}
+function openwindow(url, width, _5cb9) {
+	var left = (screen.width - width) / 2;
+	var top = (screen.height - _5cb9) / 2;
+	property = "left="
+			+ left
+			+ ", top="
+			+ top
+			+ ", toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=1,alwaysRaised,width="
+			+ width + ",height=" + _5cb9;
+	return window.open(url, "_blank", property);
+}
+function dumpObject(obj) {
+	trace("----------------------------------------------------------------------------");
+	trace("- Object dump");
+	trace("----------------------------------------------------------------------------");
+	for ( var i in obj) {
+		try {
+			if (typeof obj[i] != "function") {
+				trace(i + " --&gt; " + obj[i]);
+			}
+		} catch (e) {
+		}
+	}
+	for ( var i in obj) {
+		try {
+			if (typeof obj[i] == "function") {
+				trace(i + " --&gt; " + obj[i]);
+			}
+		} catch (e) {
+		}
+	}
+	trace("----------------------------------------------------------------------------");
+}
+draw2d.Drag = function() {
+};
+draw2d.Drag.current = null;
+draw2d.Drag.currentTarget = null;
+draw2d.Drag.currentHover = null;
+draw2d.Drag.currentCompartment = null;
+draw2d.Drag.dragging = false;
+draw2d.Drag.isDragging = function() {
+	return this.dragging;
+};
+draw2d.Drag.setCurrent = function(_604e) {
+	this.current = _604e;
+	this.dragging = true;
+};
+draw2d.Drag.getCurrent = function() {
+	return this.current;
+};
+draw2d.Drag.clearCurrent = function() {
+	this.current = null;
+	this.dragging = false;
+	this.currentTarget = null;
+};
+draw2d.Draggable = function(_604f, _6050) {
+	this.id = draw2d.UUID.create();
+	this.node = null;
+	draw2d.EventTarget.call(this);
+	this.construct(_604f, _6050);
+	this.diffX = 0;
+	this.diffY = 0;
+	this.targets = new draw2d.ArrayList();
+};
+draw2d.Draggable.prototype = new draw2d.EventTarget();
+draw2d.Draggable.prototype.construct = function(_6051) {
+	if (_6051 === null || _6051 === undefined) {
+		return;
+	}
+	this.element = _6051;
+	var oThis = this;
+	var _6053 = function() {
+		var _6054 = new draw2d.DragDropEvent();
+		_6054.initDragDropEvent("dblclick", true);
+		oThis.dispatchEvent(_6054);
+		var _6055 = arguments[0] || window.event;
+		_6055.cancelBubble = true;
+		_6055.returnValue = false;
+	};
+	var _6056 = function() {
+		var _6057 = arguments[0] || window.event;
+		var _6058 = new draw2d.DragDropEvent();
+		if (oThis.node !== null) {
+			var _6059 = oThis.node.getWorkflow().getAbsoluteX();
+			var _605a = oThis.node.getWorkflow().getAbsoluteY();
+			var _605b = oThis.node.getWorkflow().getScrollLeft();
+			var _605c = oThis.node.getWorkflow().getScrollTop();
+			_6058.x = _6057.clientX - oThis.element.offsetLeft + _605b - _6059;
+			_6058.y = _6057.clientY - oThis.element.offsetTop + _605c - _605a;
+		}
+		if (_6057.button === 2) {
+			_6058.initDragDropEvent("contextmenu", true);
+			oThis.dispatchEvent(_6058);
+		} else {
+			_6058.initDragDropEvent("dragstart", true);
+			if (oThis.dispatchEvent(_6058)) {
+				oThis.diffX = _6057.clientX - oThis.element.offsetLeft;
+				oThis.diffY = _6057.clientY - oThis.element.offsetTop;
+				draw2d.Drag.setCurrent(oThis);
+				if (oThis.isAttached == true) {
+					oThis.detachEventHandlers();
+				}
+				oThis.attachEventHandlers();
+			}
+		}
+		_6057.cancelBubble = true;
+		_6057.returnValue = false;
+	};
+	var _605d = function() {
+		if (draw2d.Drag.getCurrent() === null) {
+			var _605e = arguments[0] || window.event;
+			if (draw2d.Drag.currentHover !== null
+					&& oThis !== draw2d.Drag.currentHover) {
+				var _605f = new draw2d.DragDropEvent();
+				_605f.initDragDropEvent("mouseleave", false, oThis);
+				draw2d.Drag.currentHover.dispatchEvent(_605f);
+			}
+			if (oThis !== null && oThis !== draw2d.Drag.currentHover) {
+				var _605f = new draw2d.DragDropEvent();
+				_605f.initDragDropEvent("mouseenter", false, oThis);
+				oThis.dispatchEvent(_605f);
+			}
+			draw2d.Drag.currentHover = oThis;
+		} else {
+		}
+	};
+	if (this.element.addEventListener) {
+		this.element.addEventListener("mousemove", _605d, false);
+		this.element.addEventListener("mousedown", _6056, false);
+		this.element.addEventListener("dblclick", _6053, false);
+	} else {
+		if (this.element.attachEvent) {
+			this.element.attachEvent("onmousemove", _605d);
+			this.element.attachEvent("onmousedown", _6056);
+			this.element.attachEvent("ondblclick", _6053);
+		} else {
+			throw "Drag not supported in this browser.";
+		}
+	}
+};
+draw2d.Draggable.prototype.onDrop = function(_6060, _6061) {
+};
+draw2d.Draggable.prototype.attachEventHandlers = function() {
+	var oThis = this;
+	oThis.isAttached = true;
+	this.tempMouseMove = function() {
+		var _6063 = arguments[0] || window.event;
+		var _6064 = new draw2d.Point(_6063.clientX - oThis.diffX, _6063.clientY
+				- oThis.diffY);
+		if (oThis.node !== null && oThis.node.getCanSnapToHelper()) {
+			_6064 = oThis.node.getWorkflow().snapToHelper(oThis.node, _6064);
+		}
+		oThis.element.style.left = _6064.x + "px";
+		oThis.element.style.top = _6064.y + "px";
+		if (oThis.node !== null) {
+			var _6065 = oThis.node.getWorkflow().getScrollLeft();
+			var _6066 = oThis.node.getWorkflow().getScrollTop();
+			var _6067 = oThis.node.getWorkflow().getAbsoluteX();
+			var _6068 = oThis.node.getWorkflow().getAbsoluteY();
+			var _6069 = oThis.getDropTarget(_6063.clientX + _6065 - _6067,
+					_6063.clientY + _6066 - _6068);
+			var _606a = oThis.getCompartment(_6063.clientX + _6065 - _6067,
+					_6063.clientY + _6066 - _6068);
+			if (draw2d.Drag.currentTarget !== null
+					&& _6069 != draw2d.Drag.currentTarget) {
+				var _606b = new draw2d.DragDropEvent();
+				_606b.initDragDropEvent("dragleave", false, oThis);
+				draw2d.Drag.currentTarget.dispatchEvent(_606b);
+			}
+			if (_6069 !== null && _6069 !== draw2d.Drag.currentTarget) {
+				var _606b = new draw2d.DragDropEvent();
+				_606b.initDragDropEvent("dragenter", false, oThis);
+				_6069.dispatchEvent(_606b);
+			}
+			draw2d.Drag.currentTarget = _6069;
+			if (draw2d.Drag.currentCompartment !== null
+					&& _606a !== draw2d.Drag.currentCompartment) {
+				var _606b = new draw2d.DragDropEvent();
+				_606b.initDragDropEvent("figureleave", false, oThis);
+				draw2d.Drag.currentCompartment.dispatchEvent(_606b);
+			}
+			if (_606a !== null && _606a.node != oThis.node
+					&& _606a !== draw2d.Drag.currentCompartment) {
+				var _606b = new draw2d.DragDropEvent();
+				_606b.initDragDropEvent("figureenter", false, oThis);
+				_606a.dispatchEvent(_606b);
+			}
+			draw2d.Drag.currentCompartment = _606a;
+		}
+		var _606c = new draw2d.DragDropEvent();
+		_606c.initDragDropEvent("drag", false);
+		oThis.dispatchEvent(_606c);
+	};
+	oThis.tempMouseUp = function() {
+		oThis.detachEventHandlers();
+		var _606d = arguments[0] || window.event;
+		if (oThis.node !== null) {
+			var _606e = oThis.node.getWorkflow().getScrollLeft();
+			var _606f = oThis.node.getWorkflow().getScrollTop();
+			var _6070 = oThis.node.getWorkflow().getAbsoluteX();
+			var _6071 = oThis.node.getWorkflow().getAbsoluteY();
+			var _6072 = oThis.getDropTarget(_606d.clientX + _606e - _6070,
+					_606d.clientY + _606f - _6071);
+			var _6073 = oThis.getCompartment(_606d.clientX + _606e - _6070,
+					_606d.clientY + _606f - _6071);
+			if (_6072 !== null) {
+				var _6074 = new draw2d.DragDropEvent();
+				_6074.initDragDropEvent("drop", false, oThis);
+				_6072.dispatchEvent(_6074);
+			}
+			if (_6073 !== null && _6073.node !== oThis.node) {
+				var _6074 = new draw2d.DragDropEvent();
+				_6074.initDragDropEvent("figuredrop", false, oThis);
+				_6073.dispatchEvent(_6074);
+			}
+			if (draw2d.Drag.currentTarget !== null) {
+				var _6074 = new draw2d.DragDropEvent();
+				_6074.initDragDropEvent("dragleave", false, oThis);
+				draw2d.Drag.currentTarget.dispatchEvent(_6074);
+				draw2d.Drag.currentTarget = null;
+			}
+		}
+		var _6075 = new draw2d.DragDropEvent();
+		_6075.initDragDropEvent("dragend", false);
+		oThis.dispatchEvent(_6075);
+		oThis.onDrop(_606d.clientX, _606d.clientY);
+		draw2d.Drag.currentCompartment = null;
+		draw2d.Drag.clearCurrent();
+	};
+	if (document.body.addEventListener) {
+		document.body.addEventListener("mousemove", this.tempMouseMove, false);
+		document.body.addEventListener("mouseup", this.tempMouseUp, false);
+	} else {
+		if (document.body.attachEvent) {
+			document.body.attachEvent("onmousemove", this.tempMouseMove);
+			document.body.attachEvent("onmouseup", this.tempMouseUp);
+		} else {
+			throw new Error("Drag doesn't support this browser.");
+		}
+	}
+};
+draw2d.Draggable.prototype.detachEventHandlers = function() {
+	this.isAttached = false;
+	if (document.body.removeEventListener) {
+		document.body.removeEventListener("mousemove", this.tempMouseMove,
+				false);
+		document.body.removeEventListener("mouseup", this.tempMouseUp, false);
+	} else {
+		if (document.body.detachEvent) {
+			document.body.detachEvent("onmousemove", this.tempMouseMove);
+			document.body.detachEvent("onmouseup", this.tempMouseUp);
+		} else {
+			throw new Error("Drag doesn't support this browser.");
+		}
+	}
+};
+draw2d.Draggable.prototype.getDropTarget = function(x, y) {
+	for ( var i = 0; i < this.targets.getSize(); i++) {
+		var _6079 = this.targets.get(i);
+		if (_6079.node.isOver(x, y) && _6079.node !== this.node) {
+			return _6079;
+		}
+	}
+	return null;
+};
+draw2d.Draggable.prototype.getCompartment = function(x, y) {
+	var _607c = null;
+	for ( var i = 0; i < this.node.getWorkflow().compartments.getSize(); i++) {
+		var _607e = this.node.getWorkflow().compartments.get(i);
+		if (_607e.isOver(x, y) && _607e !== this.node) {
+			if (_607c === null) {
+				_607c = _607e;
+			} else {
+				if (_607c.getZOrder() < _607e.getZOrder()) {
+					_607c = _607e;
+				}
+			}
+		}
+	}
+	return _607c === null ? null : _607c.dropable;
+};
+draw2d.Draggable.prototype.getLeft = function() {
+	return this.element.offsetLeft;
+};
+draw2d.Draggable.prototype.getTop = function() {
+	return this.element.offsetTop;
+};
+draw2d.DragDropEvent = function() {
+	draw2d.AbstractEvent.call(this);
+};
+draw2d.DragDropEvent.prototype = new draw2d.AbstractEvent();
+draw2d.DragDropEvent.prototype.initDragDropEvent = function(sType, _6080, _6081) {
+	this.initEvent(sType, _6080);
+	this.relatedTarget = _6081;
+};
+draw2d.DropTarget = function(_6082) {
+	draw2d.EventTarget.call(this);
+	this.construct(_6082);
+};
+draw2d.DropTarget.prototype = new draw2d.EventTarget();
+draw2d.DropTarget.prototype.construct = function(_6083) {
+	this.element = _6083;
+};
+draw2d.DropTarget.prototype.getLeft = function() {
+	var el = this.element;
+	var ol = el.offsetLeft;
+	while ((el = el.offsetParent) !== null) {
+		ol += el.offsetLeft;
+	}
+	return ol;
+};
+draw2d.DropTarget.prototype.getTop = function() {
+	var el = this.element;
+	var ot = el.offsetTop;
+	while ((el = el.offsetParent) !== null) {
+		ot += el.offsetTop;
+	}
+	return ot;
+};
+draw2d.DropTarget.prototype.getHeight = function() {
+	return this.element.offsetHeight;
+};
+draw2d.DropTarget.prototype.getWidth = function() {
+	return this.element.offsetWidth;
+};
+draw2d.PositionConstants = function() {
+};
+draw2d.PositionConstants.NORTH = 1;
+draw2d.PositionConstants.SOUTH = 4;
+draw2d.PositionConstants.WEST = 8;
+draw2d.PositionConstants.EAST = 16;
+draw2d.Color = function(red, green, blue) {
+	if (typeof green == "undefined") {
+		var rgb = this.hex2rgb(red);
+		this.red = rgb[0];
+		this.green = rgb[1];
+		this.blue = rgb[2];
+	} else {
+		this.red = red;
+		this.green = green;
+		this.blue = blue;
+	}
+};
+draw2d.Color.prototype.type = "draw2d.Color";
+draw2d.Color.prototype.getHTMLStyle = function() {
+	return "rgb(" + this.red + "," + this.green + "," + this.blue + ")";
+};
+draw2d.Color.prototype.getRed = function() {
+	return this.red;
+};
+draw2d.Color.prototype.getGreen = function() {
+	return this.green;
+};
+draw2d.Color.prototype.getBlue = function() {
+	return this.blue;
+};
+draw2d.Color.prototype.getIdealTextColor = function() {
+	var _5062 = 105;
+	var _5063 = (this.red * 0.299) + (this.green * 0.587) + (this.blue * 0.114);
+	return (255 - _5063 < _5062) ? new draw2d.Color(0, 0, 0)
+			: new draw2d.Color(255, 255, 255);
+};
+draw2d.Color.prototype.hex2rgb = function(_5064) {
+	_5064 = _5064.replace("#", "");
+	return ( {
+		0 : parseInt(_5064.substr(0, 2), 16),
+		1 : parseInt(_5064.substr(2, 2), 16),
+		2 : parseInt(_5064.substr(4, 2), 16)
+	});
+};
+draw2d.Color.prototype.hex = function() {
+	return (this.int2hex(this.red) + this.int2hex(this.green) + this
+			.int2hex(this.blue));
+};
+draw2d.Color.prototype.int2hex = function(v) {
+	v = Math.round(Math.min(Math.max(0, v), 255));
+	return ("0123456789ABCDEF".charAt((v - v % 16) / 16) + "0123456789ABCDEF"
+			.charAt(v % 16));
+};
+draw2d.Color.prototype.darker = function(_5066) {
+	var red = parseInt(Math.round(this.getRed() * (1 - _5066)));
+	var green = parseInt(Math.round(this.getGreen() * (1 - _5066)));
+	var blue = parseInt(Math.round(this.getBlue() * (1 - _5066)));
+	if (red < 0) {
+		red = 0;
+	} else {
+		if (red > 255) {
+			red = 255;
+		}
+	}
+	if (green < 0) {
+		green = 0;
+	} else {
+		if (green > 255) {
+			green = 255;
+		}
+	}
+	if (blue < 0) {
+		blue = 0;
+	} else {
+		if (blue > 255) {
+			blue = 255;
+		}
+	}
+	return new draw2d.Color(red, green, blue);
+};
+draw2d.Color.prototype.lighter = function(_506a) {
+	var red = parseInt(Math.round(this.getRed() * (1 + _506a)));
+	var green = parseInt(Math.round(this.getGreen() * (1 + _506a)));
+	var blue = parseInt(Math.round(this.getBlue() * (1 + _506a)));
+	if (red < 0) {
+		red = 0;
+	} else {
+		if (red > 255) {
+			red = 255;
+		}
+	}
+	if (green < 0) {
+		green = 0;
+	} else {
+		if (green > 255) {
+			green = 255;
+		}
+	}
+	if (blue < 0) {
+		blue = 0;
+	} else {
+		if (blue > 255) {
+			blue = 255;
+		}
+	}
+	return new draw2d.Color(red, green, blue);
+};
+draw2d.Point = function(x, y) {
+	this.x = x;
+	this.y = y;
+};
+draw2d.Point.prototype.type = "draw2d.Point";
+draw2d.Point.prototype.getX = function() {
+	return this.x;
+};
+draw2d.Point.prototype.getY = function() {
+	return this.y;
+};
+draw2d.Point.prototype.getPosition = function(p) {
+	var dx = p.x - this.x;
+	var dy = p.y - this.y;
+	if (Math.abs(dx) > Math.abs(dy)) {
+		if (dx < 0) {
+			return draw2d.PositionConstants.WEST;
+		}
+		return draw2d.PositionConstants.EAST;
+	}
+	if (dy < 0) {
+		return draw2d.PositionConstants.NORTH;
+	}
+	return draw2d.PositionConstants.SOUTH;
+};
+draw2d.Point.prototype.equals = function(o) {
+	return this.x == o.x && this.y == o.y;
+};
+draw2d.Point.prototype.getDistance = function(other) {
+	return Math.sqrt((this.x - other.x) * (this.x - other.x)
+			+ (this.y - other.y) * (this.y - other.y));
+};
+draw2d.Point.prototype.getTranslated = function(other) {
+	return new draw2d.Point(this.x + other.x, this.y + other.y);
+};
+draw2d.Point.prototype.getPersistentAttributes = function() {
+	return {
+		x : this.x,
+		y : this.y
+	};
+};
+draw2d.Dimension = function(x, y, w, h) {
+	draw2d.Point.call(this, x, y);
+	this.w = w;
+	this.h = h;
+};
+draw2d.Dimension.prototype = new draw2d.Point();
+draw2d.Dimension.prototype.type = "draw2d.Dimension";
+draw2d.Dimension.prototype.translate = function(dx, dy) {
+	this.x += dx;
+	this.y += dy;
+	return this;
+};
+draw2d.Dimension.prototype.resize = function(dw, dh) {
+	this.w += dw;
+	this.h += dh;
+	return this;
+};
+draw2d.Dimension.prototype.setBounds = function(rect) {
+	this.x = rect.x;
+	this.y = rect.y;
+	this.w = rect.w;
+	this.h = rect.h;
+	return this;
+};
+draw2d.Dimension.prototype.isEmpty = function() {
+	return this.w <= 0 || this.h <= 0;
+};
+draw2d.Dimension.prototype.getWidth = function() {
+	return this.w;
+};
+draw2d.Dimension.prototype.getHeight = function() {
+	return this.h;
+};
+draw2d.Dimension.prototype.getRight = function() {
+	return this.x + this.w;
+};
+draw2d.Dimension.prototype.getBottom = function() {
+	return this.y + this.h;
+};
+draw2d.Dimension.prototype.getTopLeft = function() {
+	return new draw2d.Point(this.x, this.y);
+};
+draw2d.Dimension.prototype.getCenter = function() {
+	return new draw2d.Point(this.x + this.w / 2, this.y + this.h / 2);
+};
+draw2d.Dimension.prototype.getBottomRight = function() {
+	return new draw2d.Point(this.x + this.w, this.y + this.h);
+};
+draw2d.Dimension.prototype.equals = function(o) {
+	return this.x == o.x && this.y == o.y && this.w == o.w && this.h == o.h;
+};
+draw2d.SnapToHelper = function(_5932) {
+	this.workflow = _5932;
+};
+draw2d.SnapToHelper.NORTH = 1;
+draw2d.SnapToHelper.SOUTH = 4;
+draw2d.SnapToHelper.WEST = 8;
+draw2d.SnapToHelper.EAST = 16;
+draw2d.SnapToHelper.CENTER = 32;
+draw2d.SnapToHelper.NORTH_EAST = draw2d.SnapToHelper.NORTH
+		| draw2d.SnapToHelper.EAST;
+draw2d.SnapToHelper.NORTH_WEST = draw2d.SnapToHelper.NORTH
+		| draw2d.SnapToHelper.WEST;
+draw2d.SnapToHelper.SOUTH_EAST = draw2d.SnapToHelper.SOUTH
+		| draw2d.SnapToHelper.EAST;
+draw2d.SnapToHelper.SOUTH_WEST = draw2d.SnapToHelper.SOUTH
+		| draw2d.SnapToHelper.WEST;
+draw2d.SnapToHelper.NORTH_SOUTH = draw2d.SnapToHelper.NORTH
+		| draw2d.SnapToHelper.SOUTH;
+draw2d.SnapToHelper.EAST_WEST = draw2d.SnapToHelper.EAST
+		| draw2d.SnapToHelper.WEST;
+draw2d.SnapToHelper.NSEW = draw2d.SnapToHelper.NORTH_SOUTH
+		| draw2d.SnapToHelper.EAST_WEST;
+draw2d.SnapToHelper.prototype.snapPoint = function(_5933, _5934, _5935) {
+	return _5934;
+};
+draw2d.SnapToHelper.prototype.snapRectangle = function(_5936, _5937) {
+	return _5936;
+};
+draw2d.SnapToHelper.prototype.onSetDocumentDirty = function() {
+};
+draw2d.SnapToGrid = function(_4a14) {
+	draw2d.SnapToHelper.call(this, _4a14);
+};
+draw2d.SnapToGrid.prototype = new draw2d.SnapToHelper();
+draw2d.SnapToGrid.prototype.type = "draw2d.SnapToGrid";
+draw2d.SnapToGrid.prototype.snapPoint = function(_4a15, _4a16, _4a17) {
+	_4a17.x = this.workflow.gridWidthX
+			* Math
+					.floor(((_4a16.x + this.workflow.gridWidthX / 2) / this.workflow.gridWidthX));
+	_4a17.y = this.workflow.gridWidthY
+			* Math
+					.floor(((_4a16.y + this.workflow.gridWidthY / 2) / this.workflow.gridWidthY));
+	return 0;
+};
+draw2d.SnapToGrid.prototype.snapRectangle = function(_4a18, _4a19) {
+	_4a19.x = _4a18.x;
+	_4a19.y = _4a18.y;
+	_4a19.w = _4a18.w;
+	_4a19.h = _4a18.h;
+	return 0;
+};
+draw2d.SnapToGeometryEntry = function(type, _5944) {
+	this.type = type;
+	this.location = _5944;
+};
+draw2d.SnapToGeometryEntry.prototype.getLocation = function() {
+	return this.location;
+};
+draw2d.SnapToGeometryEntry.prototype.getType = function() {
+	return this.type;
+};
+draw2d.SnapToGeometry = function(_5afe) {
+	draw2d.SnapToHelper.call(this, _5afe);
+	this.rows = null;
+	this.cols = null;
+};
+draw2d.SnapToGeometry.prototype = new draw2d.SnapToHelper();
+draw2d.SnapToGeometry.THRESHOLD = 5;
+draw2d.SnapToGeometry.prototype.snapPoint = function(_5aff, _5b00, _5b01) {
+	if (this.rows === null || this.cols === null) {
+		this.populateRowsAndCols();
+	}
+	if ((_5aff & draw2d.SnapToHelper.EAST) !== 0) {
+		var _5b02 = this.getCorrectionFor(this.cols, _5b00.getX() - 1, 1);
+		if (_5b02 !== draw2d.SnapToGeometry.THRESHOLD) {
+			_5aff &= ~draw2d.SnapToHelper.EAST;
+			_5b01.x += _5b02;
+		}
+	}
+	if ((_5aff & draw2d.SnapToHelper.WEST) !== 0) {
+		var _5b03 = this.getCorrectionFor(this.cols, _5b00.getX(), -1);
+		if (_5b03 !== draw2d.SnapToGeometry.THRESHOLD) {
+			_5aff &= ~draw2d.SnapToHelper.WEST;
+			_5b01.x += _5b03;
+		}
+	}
+	if ((_5aff & draw2d.SnapToHelper.SOUTH) !== 0) {
+		var _5b04 = this.getCorrectionFor(this.rows, _5b00.getY() - 1, 1);
+		if (_5b04 !== draw2d.SnapToGeometry.THRESHOLD) {
+			_5aff &= ~draw2d.SnapToHelper.SOUTH;
+			_5b01.y += _5b04;
+		}
+	}
+	if ((_5aff & draw2d.SnapToHelper.NORTH) !== 0) {
+		var _5b05 = this.getCorrectionFor(this.rows, _5b00.getY(), -1);
+		if (_5b05 !== draw2d.SnapToGeometry.THRESHOLD) {
+			_5aff &= ~draw2d.SnapToHelper.NORTH;
+			_5b01.y += _5b05;
+		}
+	}
+	return _5aff;
+};
+draw2d.SnapToGeometry.prototype.snapRectangle = function(_5b06, _5b07) {
+	var _5b08 = _5b06.getTopLeft();
+	var _5b09 = _5b06.getBottomRight();
+	var _5b0a = this.snapPoint(draw2d.SnapToHelper.NORTH_WEST, _5b06
+			.getTopLeft(), _5b08);
+	_5b07.x = _5b08.x;
+	_5b07.y = _5b08.y;
+	var _5b0b = this.snapPoint(draw2d.SnapToHelper.SOUTH_EAST, _5b06
+			.getBottomRight(), _5b09);
+	if (_5b0a & draw2d.SnapToHelper.WEST) {
+		_5b07.x = _5b09.x - _5b06.getWidth();
+	}
+	if (_5b0a & draw2d.SnapToHelper.NORTH) {
+		_5b07.y = _5b09.y - _5b06.getHeight();
+	}
+	return _5b0a | _5b0b;
+};
+draw2d.SnapToGeometry.prototype.populateRowsAndCols = function() {
+	this.rows = [];
+	this.cols = [];
+	var _5b0c = this.workflow.getDocument().getFigures();
+	var index = 0;
+	for ( var i = 0; i < _5b0c.getSize(); i++) {
+		var _5b0f = _5b0c.get(i);
+		if (_5b0f != this.workflow.getCurrentSelection()) {
+			var _5b10 = _5b0f.getBounds();
+			this.cols[index * 3] = new draw2d.SnapToGeometryEntry(-1, _5b10
+					.getX());
+			this.rows[index * 3] = new draw2d.SnapToGeometryEntry(-1, _5b10
+					.getY());
+			this.cols[index * 3 + 1] = new draw2d.SnapToGeometryEntry(0,
+					_5b10.x + (_5b10.getWidth() - 1) / 2);
+			this.rows[index * 3 + 1] = new draw2d.SnapToGeometryEntry(0,
+					_5b10.y + (_5b10.getHeight() - 1) / 2);
+			this.cols[index * 3 + 2] = new draw2d.SnapToGeometryEntry(1, _5b10
+					.getRight() - 1);
+			this.rows[index * 3 + 2] = new draw2d.SnapToGeometryEntry(1, _5b10
+					.getBottom() - 1);
+			index++;
+		}
+	}
+};
+draw2d.SnapToGeometry.prototype.getCorrectionFor = function(_5b11, value, side) {
+	var _5b14 = draw2d.SnapToGeometry.THRESHOLD;
+	var _5b15 = draw2d.SnapToGeometry.THRESHOLD;
+	for ( var i = 0; i < _5b11.length; i++) {
+		var entry = _5b11[i];
+		var _5b18;
+		if (entry.type === -1 && side !== 0) {
+			_5b18 = Math.abs(value - entry.location);
+			if (_5b18 < _5b14) {
+				_5b14 = _5b18;
+				_5b15 = entry.location - value;
+			}
+		} else {
+			if (entry.type === 0 && side === 0) {
+				_5b18 = Math.abs(value - entry.location);
+				if (_5b18 < _5b14) {
+					_5b14 = _5b18;
+					_5b15 = entry.location - value;
+				}
+			} else {
+				if (entry.type === 1 && side !== 0) {
+					_5b18 = Math.abs(value - entry.location);
+					if (_5b18 < _5b14) {
+						_5b14 = _5b18;
+						_5b15 = entry.location - value;
+					}
+				}
+			}
+		}
+	}
+	return _5b15;
+};
+draw2d.SnapToGeometry.prototype.onSetDocumentDirty = function() {
+	this.rows = null;
+	this.cols = null;
+};
+draw2d.Border = function() {
+	this.color = null;
+};
+draw2d.Border.prototype.type = "draw2d.Border";
+draw2d.Border.prototype.dispose = function() {
+	this.color = null;
+};
+draw2d.Border.prototype.getHTMLStyle = function() {
+	return "";
+};
+draw2d.Border.prototype.setColor = function(c) {
+	this.color = c;
+};
+draw2d.Border.prototype.getColor = function() {
+	return this.color;
+};
+draw2d.Border.prototype.refresh = function() {
+};
+draw2d.LineBorder = function(width) {
+	draw2d.Border.call(this);
+	this.width = 1;
+	if (width) {
+		this.width = width;
+	}
+	this.figure = null;
+};
+draw2d.LineBorder.prototype = new draw2d.Border();
+draw2d.LineBorder.prototype.type = "draw2d.LineBorder";
+draw2d.LineBorder.prototype.dispose = function() {
+	draw2d.Border.prototype.dispose.call(this);
+	this.figure = null;
+};
+draw2d.LineBorder.prototype.setLineWidth = function(w) {
+	this.width = w;
+	if (this.figure !== null) {
+		this.figure.html.style.border = this.getHTMLStyle();
+	}
+};
+draw2d.LineBorder.prototype.getHTMLStyle = function() {
+	if (this.getColor() !== null) {
+		return this.width + "px solid " + this.getColor().getHTMLStyle();
+	}
+	return this.width + "px solid black";
+};
+draw2d.LineBorder.prototype.refresh = function() {
+	this.setLineWidth(this.width);
+};
+draw2d.Figure = function() {
+	this.construct();
+};
+draw2d.Figure.prototype.type = "draw2d.Figure";
+draw2d.Figure.ZOrderBaseIndex = 100;
+draw2d.Figure.setZOrderBaseIndex = function(index) {
+	draw2d.Figure.ZOrderBaseIndex = index;
+};
+draw2d.Figure.prototype.construct = function() {
+	this.lastDragStartTime = 0;
+	this.x = 0;
+	this.y = 0;
+	this.width = 10;
+	this.height = 10;
+	this.border = null;
+	this.id = draw2d.UUID.create();
+	this.html = this.createHTMLElement();
+	this.canvas = null;
+	this.workflow = null;
+	this.draggable = null;
+	this.parent = null;
+	this.isMoving = false;
+	this.canSnapToHelper = true;
+	this.snapToGridAnchor = new draw2d.Point(0, 0);
+	this.timer = -1;
+	this.model = null;
+	this.alpha = 1;
+	this.alphaBeforeOnDrag = 1;
+	this.properties = {};
+	this.moveListener = new draw2d.ArrayList();
+	this.setDimension(this.width, this.height);
+	this.setDeleteable(true);
+	this.setCanDrag(true);
+	this.setResizeable(true);
+	this.setSelectable(true);
+};
+draw2d.Figure.prototype.dispose = function() {
+	
+	this.canvas = null;
+	this.workflow = null;
+	this.moveListener = null;
+	if (this.draggable !== null) {
+		this.draggable.removeEventListener("mouseenter", this.tmpMouseEnter);
+		this.draggable.removeEventListener("mouseleave", this.tmpMouseLeave);
+		this.draggable.removeEventListener("dragend", this.tmpDragend);
+		this.draggable.removeEventListener("dragstart", this.tmpDragstart);
+		this.draggable.removeEventListener("drag", this.tmpDrag);
+		this.draggable.removeEventListener("dblclick", this.tmpDoubleClick);
+		this.draggable.node = null;
+		this.draggable.target.removeAllElements();
+	}
+	this.draggable = null;
+	if (this.border !== null) {
+		this.border.dispose();
+	}
+	this.border = null;
+	if (this.parent !== null) {
+		this.parent.removeChild(this);
+	}
+};
+draw2d.Figure.prototype.getProperties = function() {
+	return this.properties;
+};
+draw2d.Figure.prototype.getProperty = function(key) {
+	return this.properties[key];
+};
+draw2d.Figure.prototype.setProperty = function(key, value) {
+	this.properties[key] = value;
+	this.setDocumentDirty();
+};
+draw2d.Figure.prototype.getId = function() {
+	return this.id;
+};
+draw2d.Figure.prototype.setId = function(id) {
+	this.id = id;
+	if (this.html !== null) {
+		this.html.id = id;
+	}
+};
+draw2d.Figure.prototype.setCanvas = function(_59c6) {
+	this.canvas = _59c6;
+};
+draw2d.Figure.prototype.getWorkflow = function() {
+	return this.workflow;
+};
+draw2d.Figure.prototype.setWorkflow = function(_59c7) {
+	
+	if (this.draggable === null) {
+		this.html.tabIndex = "0";
+		var oThis = this;
+		this.keyDown = function(event) {
+			event.cancelBubble = true;
+			event.returnValue = true;
+			oThis.onKeyDown(event.keyCode, event.ctrlKey);
+		};
+		if (this.html.addEventListener) {
+			this.html.addEventListener("keydown", this.keyDown, false);
+		} else {
+			if (this.html.attachEvent) {
+				this.html.attachEvent("onkeydown", this.keyDown);
+			}
+		}
+		this.draggable = new draw2d.Draggable(this.html,
+				draw2d.Draggable.DRAG_X | draw2d.Draggable.DRAG_Y);
+		this.draggable.node = this;
+		this.tmpContextMenu = function(_59ca) {
+			oThis.onContextMenu(oThis.x + _59ca.x, _59ca.y + oThis.y);
+		};
+		this.tmpMouseEnter = function(_59cb) {
+			oThis.onMouseEnter();
+		};
+		this.tmpMouseLeave = function(_59cc) {
+			oThis.onMouseLeave();
+		};
+		this.tmpDragend = function(_59cd) {
+			oThis.onDragend();
+		};
+		this.tmpDragstart = function(_59ce) {
+			var w = oThis.workflow;
+			w.showMenu(null);
+			if (w.toolPalette && w.toolPalette.activeTool) {
+				_59ce.returnValue = false;
+				w.onMouseDown(oThis.x + _59ce.x, _59ce.y + oThis.y);
+				w.onMouseUp(oThis.x + _59ce.x, _59ce.y + oThis.y);
+				return;
+			}
+			if (!(oThis instanceof draw2d.ResizeHandle)
+					&& !(oThis instanceof draw2d.Port)) {
+				var line = w.getBestLine(oThis.x + _59ce.x, _59ce.y + oThis.y);
+				if (line !== null) {
+					_59ce.returnValue = false;
+					w.setCurrentSelection(line);
+					w.showLineResizeHandles(line);
+					w.onMouseDown(oThis.x + _59ce.x, _59ce.y + oThis.y);
+					return;
+				} else {
+					if (oThis.isSelectable()) {
+						w.showResizeHandles(oThis);
+						w.setCurrentSelection(oThis);
+					}
+				}
+			}
+			_59ce.returnValue = oThis.onDragstart(_59ce.x, _59ce.y);
+		};
+		this.tmpDrag = function(_59d1) {
+			oThis.onDrag();
+		};
+		this.tmpDoubleClick = function(_59d2) {
+			oThis.onDoubleClick();
+		};
+		this.draggable.addEventListener("contextmenu", this.tmpContextMenu);
+		this.draggable.addEventListener("mouseenter", this.tmpMouseEnter);
+		this.draggable.addEventListener("mouseleave", this.tmpMouseLeave);
+		this.draggable.addEventListener("dragend", this.tmpDragend);
+		this.draggable.addEventListener("dragstart", this.tmpDragstart);
+		this.draggable.addEventListener("drag", this.tmpDrag);
+		this.draggable.addEventListener("dblclick", this.tmpDoubleClick);
+	}
+	this.workflow = _59c7;
+};
+draw2d.Figure.prototype.createHTMLElement = function() {
+	var item = document.createElement("div");
+	item.id = this.id;
+	item.style.position = "absolute";
+	item.style.left = this.x + "px";
+	item.style.top = this.y + "px";
+	item.style.height = this.width + "px";
+	item.style.width = this.height + "px";
+	item.style.margin = "0px";
+	item.style.padding = "0px";
+	item.style.outline = "none";
+	item.style.zIndex = "" + draw2d.Figure.ZOrderBaseIndex;
+	return item;
+};
+draw2d.Figure.prototype.setParent = function(_59d4) {
+	this.parent = _59d4;
+};
+draw2d.Figure.prototype.getParent = function() {
+	return this.parent;
+};
+draw2d.Figure.prototype.getZOrder = function() {
+	return this.html.style.zIndex;
+};
+draw2d.Figure.prototype.setZOrder = function(index) {
+	this.html.style.zIndex = index;
+};
+draw2d.Figure.prototype.hasFixedPosition = function() {
+	return false;
+};
+draw2d.Figure.prototype.getMinWidth = function() {
+	return 5;
+};
+draw2d.Figure.prototype.getMinHeight = function() {
+	return 5;
+};
+draw2d.Figure.prototype.getHTMLElement = function() {
+	if (this.html === null) {
+		this.html = this.createHTMLElement();
+	}
+	return this.html;
+};
+draw2d.Figure.prototype.paint = function() {
+};
+draw2d.Figure.prototype.setBorder = function(_59d6) {
+	if (this.border !== null) {
+		this.border.figure = null;
+	}
+	this.border = _59d6;
+	this.border.figure = this;
+	this.border.refresh();
+	this.setDocumentDirty();
+};
+draw2d.Figure.prototype.onRemove = function(_59d7) {
+};
+draw2d.Figure.prototype.onContextMenu = function(x, y) {
+	var menu = this.getContextMenu();
+	if (menu !== null) {
+		this.workflow.showMenu(menu, x, y);
+	}
+};
+draw2d.Figure.prototype.getContextMenu = function() {
+	return null;
+};
+draw2d.Figure.prototype.onDoubleClick = function() {
+	this.figureDoubleClick();
+	
+};
+
+draw2d.Figure.prototype.figureDoubleClick = function() {
+	return null;
+};
+
+draw2d.Figure.prototype.onMouseEnter = function() {
+};
+draw2d.Figure.prototype.onMouseLeave = function() {
+};
+draw2d.Figure.prototype.onDrag = function() {
+	this.x = this.draggable.getLeft();
+	this.y = this.draggable.getTop();
+	if (this.isMoving == false) {
+		this.isMoving = true;
+		this.alphaBeforeOnDrag = this.getAlpha();
+		this.setAlpha(this.alphaBeforeOnDrag * 0.5);
+	}
+	this.fireMoveEvent();
+};
+draw2d.Figure.prototype.onDragend = function() {
+	if (this.getWorkflow().getEnableSmoothFigureHandling() === true) {
+		var oThis = this;
+		var _59dc = function() {
+			if (oThis.alpha < oThis.alphaBeforeOnDrag) {
+				oThis.setAlpha(Math.min(1, oThis.alpha + 0.05));
+			} else {
+				window.clearInterval(oThis.timer);
+				oThis.timer = -1;
+			}
+		};
+		if (oThis.timer > 0) {
+			window.clearInterval(oThis.timer);
+		}
+		oThis.timer = window.setInterval(_59dc, 20);
+	} else {
+		this.setAlpha(this.alphaBeforeOnDrag);
+	}
+	this.command.setPosition(this.x, this.y);
+	this.workflow.commandStack.execute(this.command);
+	this.command = null;
+	this.isMoving = false;
+	this.workflow.hideSnapToHelperLines();
+	this.fireMoveEvent();
+};
+draw2d.Figure.prototype.onDragstart = function(x, y) {
+	this.command = this.createCommand(new draw2d.EditPolicy(
+			draw2d.EditPolicy.MOVE));
+	return this.command !== null;
+};
+draw2d.Figure.prototype.setCanDrag = function(flag) {
+	this.canDrag = flag;
+	if (flag) {
+		this.html.style.cursor = "move";
+	} else {
+		this.html.style.cursor = "";
+	}
+};
+draw2d.Figure.prototype.getCanDrag = function() {
+	return this.canDrag;
+};
+draw2d.Figure.prototype.setAlpha = function(_59e0) {
+	if (this.alpha === _59e0) {
+		return;
+	}
+	this.alpha = Math.max(0, Math.min(1, _59e0));
+	if (this.alpha == 1) {
+		this.html.style.filter = "";
+		this.html.style.opacity = "";
+	} else {
+		this.html.style.filter = "alpha(opacity="
+				+ Math.round(this.alpha * 100) + ")";
+		this.html.style.opacity = this.alpha;
+	}
+};
+draw2d.Figure.prototype.getAlpha = function() {
+	return this.alpha;
+};
+draw2d.Figure.prototype.setDimension = function(w, h) {
+	this.width = Math.max(this.getMinWidth(), w);
+	this.height = Math.max(this.getMinHeight(), h);
+	if (this.html === null) {
+		return;
+	}
+	this.html.style.width = this.width + "px";
+	this.html.style.height = this.height + "px";
+	this.fireMoveEvent();
+	if (this.workflow !== null && this.workflow.getCurrentSelection() == this) {
+		this.workflow.showResizeHandles(this);
+	}
+};
+draw2d.Figure.prototype.setPosition = function(xPos, yPos) {
+	this.x = xPos;
+	this.y = yPos;
+	if (this.html === null) {
+		return;
+	}
+	this.html.style.left = this.x + "px";
+	this.html.style.top = this.y + "px";
+	this.fireMoveEvent();
+	if (this.workflow !== null && this.workflow.getCurrentSelection() == this) {
+		this.workflow.showResizeHandles(this);
+	}
+};
+draw2d.Figure.prototype.isResizeable = function() {
+	return this.resizeable;
+};
+draw2d.Figure.prototype.setResizeable = function(flag) {
+	this.resizeable = flag;
+};
+draw2d.Figure.prototype.isSelectable = function() {
+	return this.selectable;
+};
+draw2d.Figure.prototype.setSelectable = function(flag) {
+	this.selectable = flag;
+};
+draw2d.Figure.prototype.isStrechable = function() {
+	return true;
+};
+draw2d.Figure.prototype.isDeleteable = function() {
+	return this.deleteable;
+};
+draw2d.Figure.prototype.setDeleteable = function(flag) {
+	this.deleteable = flag;
+};
+draw2d.Figure.prototype.setCanSnapToHelper = function(flag) {
+	this.canSnapToHelper = flag;
+};
+draw2d.Figure.prototype.getCanSnapToHelper = function() {
+	return this.canSnapToHelper;
+};
+draw2d.Figure.prototype.getSnapToGridAnchor = function() {
+	return this.snapToGridAnchor;
+};
+draw2d.Figure.prototype.setSnapToGridAnchor = function(point) {
+	this.snapToGridAnchor = point;
+};
+draw2d.Figure.prototype.getBounds = function() {
+	return new draw2d.Dimension(this.getX(), this.getY(), this.getWidth(), this
+			.getHeight());
+};
+draw2d.Figure.prototype.getWidth = function() {
+	return this.width;
+};
+draw2d.Figure.prototype.getHeight = function() {
+	return this.height;
+};
+draw2d.Figure.prototype.getY = function() {
+	return this.y;
+};
+draw2d.Figure.prototype.getX = function() {
+	return this.x;
+};
+draw2d.Figure.prototype.getAbsoluteY = function() {
+	return this.y;
+};
+draw2d.Figure.prototype.getAbsoluteX = function() {
+	return this.x;
+};
+draw2d.Figure.prototype.onKeyDown = function(_59ea, ctrl) {
+	if (_59ea == 46) {
+		this.workflow.getCommandStack().execute(
+				this.createCommand(new draw2d.EditPolicy(
+						draw2d.EditPolicy.DELETE)));
+	}
+	if (ctrl) {
+		this.workflow.onKeyDown(_59ea, ctrl);
+	}
+};
+draw2d.Figure.prototype.getPosition = function() {
+	return new draw2d.Point(this.x, this.y);
+};
+draw2d.Figure.prototype.isOver = function(iX, iY) {
+	var x = this.getAbsoluteX();
+	var y = this.getAbsoluteY();
+	var iX2 = x + this.width;
+	var iY2 = y + this.height;
+	return (iX >= x && iX <= iX2 && iY >= y && iY <= iY2);
+};
+draw2d.Figure.prototype.attachMoveListener = function(_59f2) {
+	
+	if (_59f2 === null || this.moveListener === null) {
+		return;
+	}
+	this.moveListener.add(_59f2);
+};
+draw2d.Figure.prototype.detachMoveListener = function(_59f3) {
+	if (_59f3 === null || this.moveListener === null) {
+		return;
+	}
+	this.moveListener.remove(_59f3);
+};
+draw2d.Figure.prototype.fireMoveEvent = function() {
+	
+	this.setDocumentDirty();
+	var size = this.moveListener.getSize();
+	for ( var i = 0; i < size; i++) {
+		this.moveListener.get(i).onOtherFigureMoved(this);
+	}
+};
+draw2d.Figure.prototype.setModel = function(model) {
+	if (this.model !== null) {
+		this.model.removePropertyChangeListener(this);
+	}
+	this.model = model;
+	if (this.model !== null) {
+		this.model.addPropertyChangeListener(this);
+	}
+};
+draw2d.Figure.prototype.getModel = function() {
+	return this.model;
+};
+draw2d.Figure.prototype.onOtherFigureMoved = function(_59f7) {
+};
+draw2d.Figure.prototype.setDocumentDirty = function() {
+	if (this.workflow !== null) {
+		this.workflow.setDocumentDirty();
+	}
+};
+draw2d.Figure.prototype.disableTextSelection = function(_59f8) {
+	_59f8.onselectstart = function() {
+		return false;
+	};
+	_59f8.unselectable = "on";
+	_59f8.style.MozUserSelect = "none";
+	_59f8.onmousedown = function() {
+		return false;
+	};
+};
+draw2d.Figure.prototype.createCommand = function(_59f9) {
+	if (_59f9.getPolicy() == draw2d.EditPolicy.MOVE) {
+		if (!this.canDrag) {
+			return null;
+		}
+		return new draw2d.CommandMove(this);
+	}
+	if (_59f9.getPolicy() == draw2d.EditPolicy.DELETE) {
+		if (!this.isDeleteable()) {
+			return null;
+		}
+		return new draw2d.CommandDelete(this);
+	}
+	if (_59f9.getPolicy() == draw2d.EditPolicy.RESIZE) {
+		if (!this.isResizeable()) {
+			return null;
+		}
+		return new draw2d.CommandResize(this);
+	}
+	return null;
+};
+draw2d.Node = function() {
+	this.bgColor = null;
+	this.lineColor = new draw2d.Color(128, 128, 255);
+	this.lineStroke = 1;
+	this.ports = new draw2d.ArrayList();
+	draw2d.Figure.call(this);
+};
+draw2d.Node.prototype = new draw2d.Figure();
+draw2d.Node.prototype.type = "draw2d.Node";
+draw2d.Node.prototype.dispose = function() {
+	for ( var i = 0; i < this.ports.getSize(); i++) {
+		this.ports.get(i).dispose();
+	}
+	this.ports = null;
+	draw2d.Figure.prototype.dispose.call(this);
+};
+draw2d.Node.prototype.createHTMLElement = function() {
+	var item = draw2d.Figure.prototype.createHTMLElement.call(this);
+	item.style.width = "auto";
+	item.style.height = "auto";
+	item.style.margin = "0px";
+	item.style.padding = "0px";
+	if (this.lineColor !== null) {
+		item.style.border = this.lineStroke + "px solid "
+				+ this.lineColor.getHTMLStyle();
+	}
+	item.style.fontSize = "1px";
+	if (this.bgColor !== null) {
+		item.style.backgroundColor = this.bgColor.getHTMLStyle();
+	}
+	return item;
+};
+draw2d.Node.prototype.paint = function() {
+	draw2d.Figure.prototype.paint.call(this);
+	for ( var i = 0; i < this.ports.getSize(); i++) {
+		this.ports.get(i).paint();
+	}
+};
+draw2d.Node.prototype.getPorts = function() {
+	return this.ports;
+};
+draw2d.Node.prototype.getInputPorts = function() {
+	var _4ad8 = new draw2d.ArrayList();
+	for ( var i = 0; i < this.ports.getSize(); i++) {
+		var port = this.ports.get(i);
+		if (port instanceof draw2d.InputPort) {
+			_4ad8.add(port);
+		}
+	}
+	return _4ad8;
+};
+draw2d.Node.prototype.getOutputPorts = function() {
+	var _4adb = new draw2d.ArrayList();
+	for ( var i = 0; i < this.ports.getSize(); i++) {
+		var port = this.ports.get(i);
+		if (port instanceof draw2d.OutputPort) {
+			_4adb.add(port);
+		}
+	}
+	return _4adb;
+};
+draw2d.Node.prototype.getPort = function(_4ade) {
+	if (this.ports === null) {
+		return null;
+	}
+	for ( var i = 0; i < this.ports.getSize(); i++) {
+		var port = this.ports.get(i);
+		if (port.getName() == _4ade) {
+			return port;
+		}
+	}
+};
+draw2d.Node.prototype.getInputPort = function(_4ae1) {
+	if (this.ports === null) {
+		return null;
+	}
+	for ( var i = 0; i < this.ports.getSize(); i++) {
+		var port = this.ports.get(i);
+		if (port.getName() == _4ae1 && port instanceof draw2d.InputPort) {
+			return port;
+		}
+	}
+};
+draw2d.Node.prototype.getOutputPort = function(_4ae4) {
+	if (this.ports === null) {
+		return null;
+	}
+	for ( var i = 0; i < this.ports.getSize(); i++) {
+		var port = this.ports.get(i);
+		if (port.getName() == _4ae4 && port instanceof draw2d.OutputPort) {
+			return port;
+		}
+	}
+};
+draw2d.Node.prototype.addPort = function(port, x, y) {
+	this.ports.add(port);
+	port.setOrigin(x, y);
+	port.setPosition(x, y);
+	port.setParent(this);
+	port.setDeleteable(false);
+	this.html.appendChild(port.getHTMLElement());
+	if (this.workflow !== null) {
+		this.workflow.registerPort(port);
+	}
+};
+draw2d.Node.prototype.removePort = function(port) {
+	if (this.ports !== null) {
+		this.ports.remove(port);
+	}
+	try {
+		this.html.removeChild(port.getHTMLElement());
+	} catch (exc) {
+	}
+	if (this.workflow !== null) {
+		this.workflow.unregisterPort(port);
+	}
+	var _4aeb = port.getConnections();
+	for ( var i = 0; i < _4aeb.getSize(); ++i) {
+		this.workflow.removeFigure(_4aeb.get(i));
+	}
+};
+draw2d.Node.prototype.setWorkflow = function(_4aed) {
+	var _4aee = this.workflow;
+	draw2d.Figure.prototype.setWorkflow.call(this, _4aed);
+	if (_4aee !== null) {
+		for ( var i = 0; i < this.ports.getSize(); i++) {
+			_4aee.unregisterPort(this.ports.get(i));
+		}
+	}
+	if (this.workflow !== null) {
+		for ( var i = 0; i < this.ports.getSize(); i++) {
+			this.workflow.registerPort(this.ports.get(i));
+		}
+	}
+};
+draw2d.Node.prototype.setBackgroundColor = function(color) {
+	this.bgColor = color;
+	if (this.bgColor !== null) {
+		this.html.style.backgroundColor = this.bgColor.getHTMLStyle();
+	} else {
+		this.html.style.backgroundColor = "transparent";
+	}
+};
+draw2d.Node.prototype.getBackgroundColor = function() {
+	return this.bgColor;
+};
+draw2d.Node.prototype.setColor = function(color) {
+	this.lineColor = color;
+	if (this.lineColor !== null) {
+		this.html.style.border = this.lineStroke + "px solid "
+				+ this.lineColor.getHTMLStyle();
+	} else {
+		this.html.style.border = "0px";
+	}
+};
+draw2d.Node.prototype.setLineWidth = function(w) {
+	this.lineStroke = w;
+	if (this.lineColor !== null) {
+		this.html.style.border = this.lineStroke + "px solid "
+				+ this.lineColor.getHTMLStyle();
+	} else {
+		this.html.style.border = "0px";
+	}
+};
+draw2d.Node.prototype.getModelSourceConnections = function() {
+	throw "You must override the method [Node.prototype.getModelSourceConnections]";
+};
+draw2d.Node.prototype.refreshConnections = function() {
+	if (this.workflow !== null) {
+		this.workflow.refreshConnections(this);
+	}
+};
+draw2d.VectorFigure = function() {
+	this.bgColor = null;
+	this.lineColor = new draw2d.Color(0, 0, 0);
+	this.stroke = 1;
+	this.graphics = null;
+	draw2d.Node.call(this);
+};
+draw2d.VectorFigure.prototype = new draw2d.Node;
+draw2d.VectorFigure.prototype.type = "draw2d.VectorFigure";
+draw2d.VectorFigure.prototype.dispose = function() {
+	draw2d.Node.prototype.dispose.call(this);
+	this.bgColor = null;
+	this.lineColor = null;
+	if (this.graphics !== null) {
+		this.graphics.clear();
+	}
+	this.graphics = null;
+};
+draw2d.VectorFigure.prototype.createHTMLElement = function() {
+	var item = draw2d.Node.prototype.createHTMLElement.call(this);
+	item.style.border = "0px";
+	item.style.backgroundColor = "transparent";
+	return item;
+};
+draw2d.VectorFigure.prototype.setWorkflow = function(_4b44) {
+	draw2d.Node.prototype.setWorkflow.call(this, _4b44);
+	if (this.workflow === null) {
+		this.graphics.clear();
+		this.graphics = null;
+	}
+};
+draw2d.VectorFigure.prototype.paint = function() {
+	if (this.html === null) {
+		return;
+	}
+	try {
+		if (this.graphics === null) {
+			this.graphics = new jsGraphics(this.html);
+		} else {
+			this.graphics.clear();
+		}
+		draw2d.Node.prototype.paint.call(this);
+		for ( var i = 0; i < this.ports.getSize(); i++) {
+			this.getHTMLElement().appendChild(
+					this.ports.get(i).getHTMLElement());
+		}
+	} catch (e) {
+		pushErrorStack(e, "draw2d.VectorFigure.prototype.paint=function()["
+				+ area + "]");
+	}
+};
+draw2d.VectorFigure.prototype.setDimension = function(w, h) {
+	draw2d.Node.prototype.setDimension.call(this, w, h);
+	if (this.graphics !== null) {
+		this.paint();
+	}
+};
+draw2d.VectorFigure.prototype.setBackgroundColor = function(color) {
+	this.bgColor = color;
+	if (this.graphics !== null) {
+		this.paint();
+	}
+};
+draw2d.VectorFigure.prototype.getBackgroundColor = function() {
+	return this.bgColor;
+};
+draw2d.VectorFigure.prototype.setLineWidth = function(w) {
+	this.stroke = w;
+	if (this.graphics !== null) {
+		this.paint();
+	}
+};
+draw2d.VectorFigure.prototype.setColor = function(color) {
+	this.lineColor = color;
+	if (this.graphics !== null) {
+		this.paint();
+	}
+};
+draw2d.VectorFigure.prototype.getColor = function() {
+	return this.lineColor;
+};
+draw2d.SVGFigure = function(width, _5070) {
+	this.bgColor = null;
+	this.lineColor = new draw2d.Color(0, 0, 0);
+	this.stroke = 1;
+	this.context = null;
+	draw2d.Node.call(this);
+	if (width && _5070) {
+		this.setDimension(width, _5070);
+	}
+};
+draw2d.SVGFigure.prototype = new draw2d.Node();
+draw2d.SVGFigure.prototype.type = "draw2d.SVGFigure";
+draw2d.SVGFigure.prototype.createHTMLElement = function() {
+	var item = new MooCanvas(this.id, {
+		width : 100,
+		height : 100
+	});
+	item.style.position = "absolute";
+	item.style.left = this.x + "px";
+	item.style.top = this.y + "px";
+	item.style.zIndex = "" + draw2d.Figure.ZOrderBaseIndex;
+	this.context = item.getContext("2d");
+	return item;
+};
+draw2d.SVGFigure.prototype.paint = function() {
+	this.context.clearRect(0, 0, this.getWidth(), this.getHeight());
+	this.context.fillStyle = "rgba(200,0,0,0.3)";
+	this.context.fillRect(0, 0, this.getWidth(), this.getHeight());
+};
+draw2d.SVGFigure.prototype.setDimension = function(w, h) {
+	draw2d.Node.prototype.setDimension.call(this, w, h);
+	this.html.width = w;
+	this.html.height = h;
+	this.html.style.width = w + "px";
+	this.html.style.height = h + "px";
+	if (this.context !== null) {
+		if (this.context.element) {
+			this.context.element.style.width = w + "px";
+			this.context.element.style.height = h + "px";
+		}
+		this.paint();
+	}
+};
+draw2d.SVGFigure.prototype.setBackgroundColor = function(color) {
+	this.bgColor = color;
+	if (this.graphics !== null) {
+		this.paint();
+	}
+};
+draw2d.SVGFigure.prototype.getBackgroundColor = function() {
+	return this.bgColor;
+};
+draw2d.SVGFigure.prototype.setLineWidth = function(w) {
+	this.stroke = w;
+	if (this.context !== null) {
+		this.paint();
+	}
+};
+draw2d.SVGFigure.prototype.setColor = function(color) {
+	this.lineColor = color;
+	if (this.context !== null) {
+		this.paint();
+	}
+};
+draw2d.SVGFigure.prototype.getColor = function() {
+	return this.lineColor;
+};
+draw2d.Label = function(msg) {
+	this.msg = msg;
+	this.bgColor = null;
+	this.color = new draw2d.Color(0, 0, 0);
+	this.fontSize = 10;
+	this.textNode = null;
+	this.align = "center";
+	draw2d.Figure.call(this);
+};
+draw2d.Label.prototype = new draw2d.Figure();
+draw2d.Label.prototype.type = "draw2d.Label";
+draw2d.Label.prototype.createHTMLElement = function() {
+	var item = draw2d.Figure.prototype.createHTMLElement.call(this);
+	this.textNode = document.createTextNode(this.msg);
+	item.appendChild(this.textNode);
+	item.style.color = this.color.getHTMLStyle();
+	item.style.fontSize = this.fontSize + "pt";
+	item.style.width = "auto";
+	item.style.height = "auto";
+	item.style.paddingLeft = "3px";
+	item.style.paddingRight = "3px";
+	item.style.textAlign = this.align;
+	item.style.MozUserSelect = "none";
+	this.disableTextSelection(item);
+	if (this.bgColor !== null) {
+		item.style.backgroundColor = this.bgColor.getHTMLStyle();
+	}
+	return item;
+};
+draw2d.Label.prototype.isResizeable = function() {
+	return false;
+};
+draw2d.Label.prototype.setWordwrap = function(flag) {
+	this.html.style.whiteSpace = flag ? "wrap" : "nowrap";
+};
+draw2d.Label.prototype.setAlign = function(align) {
+	this.align = align;
+	this.html.style.textAlign = align;
+};
+draw2d.Label.prototype.setBackgroundColor = function(color) {
+	this.bgColor = color;
+	if (this.bgColor !== null) {
+		this.html.style.backgroundColor = this.bgColor.getHTMLStyle();
+	} else {
+		this.html.style.backgroundColor = "transparent";
+	}
+};
+draw2d.Label.prototype.setColor = function(color) {
+	this.color = color;
+	this.html.style.color = this.color.getHTMLStyle();
+};
+draw2d.Label.prototype.setFontSize = function(size) {
+	this.fontSize = size;
+	this.html.style.fontSize = this.fontSize + "pt";
+};
+draw2d.Label.prototype.setDimension = function(w, h) {
+};
+draw2d.Label.prototype.getWidth = function() {
+	if (window.getComputedStyle) {
+		return parseInt(getComputedStyle(this.html, "").getPropertyValue(
+				"width"));
+	}
+	return parseInt(this.html.clientWidth);
+};
+draw2d.Label.prototype.getHeight = function() {
+	if (window.getComputedStyle) {
+		return parseInt(getComputedStyle(this.html, "").getPropertyValue(
+				"height"));
+	}
+	return parseInt(this.html.clientHeight);
+};
+draw2d.Label.prototype.getText = function() {
+	return this.msg;
+};
+draw2d.Label.prototype.setText = function(text) {
+	this.msg = text;
+	this.html.removeChild(this.textNode);
+	this.textNode = document.createTextNode(this.msg);
+	this.html.appendChild(this.textNode);
+};
+draw2d.Label.prototype.setStyledText = function(text) {
+	this.msg = text;
+	this.html.removeChild(this.textNode);
+	this.textNode = document.createElement("div");
+	this.textNode.style.whiteSpace = "nowrap";
+	this.textNode.innerHTML = text;
+	this.html.appendChild(this.textNode);
+};
+draw2d.Oval = function() {
+	draw2d.VectorFigure.call(this);
+};
+draw2d.Oval.prototype = new draw2d.VectorFigure();
+draw2d.Oval.prototype.type = "draw2d.Oval";
+draw2d.Oval.prototype.paint = function() {
+	if (this.html === null) {
+		return;
+	}
+	try {
+		draw2d.VectorFigure.prototype.paint.call(this);
+		this.graphics.setStroke(this.stroke);
+		if (this.bgColor !== null) {
+			this.graphics.setColor(this.bgColor.getHTMLStyle());
+			this.graphics.fillOval(0, 0, this.getWidth() - 1,
+					this.getHeight() - 1);
+		}
+		if (this.lineColor !== null) {
+			this.graphics.setColor(this.lineColor.getHTMLStyle());
+			this.graphics.drawOval(0, 0, this.getWidth() - 1,
+					this.getHeight() - 1);
+		}
+		this.graphics.paint();
+	} catch (e) {
+		pushErrorStack(e, "draw2d.Oval.prototype.paint=function()");
+	}
+};
+draw2d.Circle = function(_5044) {
+	draw2d.Oval.call(this);
+	if (_5044) {
+		this.setDimension(_5044, _5044);
+	}
+};
+draw2d.Circle.prototype = new draw2d.Oval();
+draw2d.Circle.prototype.type = "draw2d.Circle";
+draw2d.Circle.prototype.setDimension = function(w, h) {
+	if (w > h) {
+		draw2d.Oval.prototype.setDimension.call(this, w, w);
+	} else {
+		draw2d.Oval.prototype.setDimension.call(this, h, h);
+	}
+};
+draw2d.Circle.prototype.isStrechable = function() {
+	return false;
+};
+draw2d.Rectangle = function(width, _5698) {
+	this.bgColor = null;
+	this.lineColor = new draw2d.Color(0, 0, 0);
+	this.lineStroke = 1;
+	draw2d.Figure.call(this);
+	if (width && _5698) {
+		this.setDimension(width, _5698);
+	}
+};
+draw2d.Rectangle.prototype = new draw2d.Figure();
+draw2d.Rectangle.prototype.type = "draw2d.Rectangle";
+draw2d.Rectangle.prototype.dispose = function() {
+	draw2d.Figure.prototype.dispose.call(this);
+	this.bgColor = null;
+	this.lineColor = null;
+};
+draw2d.Rectangle.prototype.createHTMLElement = function() {
+	var item = draw2d.Figure.prototype.createHTMLElement.call(this);
+	item.style.width = "auto";
+	item.style.height = "auto";
+	item.style.margin = "0px";
+	item.style.padding = "0px";
+	item.style.border = this.lineStroke + "px solid "
+			+ this.lineColor.getHTMLStyle();
+	item.style.fontSize = "1px";
+	item.style.lineHeight = "1px";
+	item.innerHTML = "&nbsp";
+	if (this.bgColor !== null) {
+		item.style.backgroundColor = this.bgColor.getHTMLStyle();
+	}
+	return item;
+};
+draw2d.Rectangle.prototype.setBackgroundColor = function(color) {
+	this.bgColor = color;
+	if (this.bgColor !== null) {
+		this.html.style.backgroundColor = this.bgColor.getHTMLStyle();
+	} else {
+		this.html.style.backgroundColor = "transparent";
+	}
+};
+draw2d.Rectangle.prototype.getBackgroundColor = function() {
+	return this.bgColor;
+};
+draw2d.Rectangle.prototype.setColor = function(color) {
+	this.lineColor = color;
+	if (this.lineColor !== null) {
+		this.html.style.border = this.lineStroke + "px solid "
+				+ this.lineColor.getHTMLStyle();
+	} else {
+		this.html.style.border = this.lineStroke + "0px";
+	}
+};
+draw2d.Rectangle.prototype.getColor = function() {
+	return this.lineColor;
+};
+draw2d.Rectangle.prototype.getWidth = function() {
+	return draw2d.Figure.prototype.getWidth.call(this) + 2 * this.lineStroke;
+};
+draw2d.Rectangle.prototype.getHeight = function() {
+	return draw2d.Figure.prototype.getHeight.call(this) + 2 * this.lineStroke;
+};
+draw2d.Rectangle.prototype.setDimension = function(w, h) {
+	draw2d.Figure.prototype.setDimension.call(this, w - 2 * this.lineStroke, h
+			- 2 * this.lineStroke);
+};
+draw2d.Rectangle.prototype.setLineWidth = function(w) {
+	var diff = w - this.lineStroke;
+	this.setDimension(this.getWidth() - 2 * diff, this.getHeight() - 2 * diff);
+	this.lineStroke = w;
+	var c = "transparent";
+	if (this.lineColor !== null) {
+		c = this.lineColor.getHTMLStyle();
+	}
+	this.html.style.border = this.lineStroke + "px solid " + c;
+};
+draw2d.Rectangle.prototype.getLineWidth = function() {
+	return this.lineStroke;
+};
+draw2d.ImageFigure = function(url) {
+	if (url === undefined) {
+		url = null;
+	}
+	this.url = url;
+	draw2d.Node.call(this);
+	this.setDimension(40, 40);
+};
+draw2d.ImageFigure.prototype = new draw2d.Node;
+draw2d.ImageFigure.prototype.type = "draw2d.Image";
+draw2d.ImageFigure.prototype.createHTMLElement = function() {
+	var item = draw2d.Node.prototype.createHTMLElement.call(this);
+	item.style.width = this.width + "px";
+	item.style.height = this.height + "px";
+	item.style.margin = "0px";
+	item.style.padding = "0px";
+	item.style.border = "0px";
+	if (this.url !== null) {
+		item.style.backgroundImage = "url(" + this.url + ")";
+	} else {
+		item.style.backgroundImage = "";
+	}
+	return item;
+};
+draw2d.ImageFigure.prototype.setColor = function(color) {
+};
+draw2d.ImageFigure.prototype.isResizeable = function() {
+	return false;
+};
+draw2d.ImageFigure.prototype.setImage = function(url) {
+	if (url === undefined) {
+		url = null;
+	}
+	this.url = url;
+	if (this.url !== null) {
+		this.html.style.backgroundImage = "url(" + this.url + ")";
+	} else {
+		this.html.style.backgroundImage = "";
+	}
+};
+draw2d.Port = function(_5730, _5731) {
+	Corona = function() {
+	};
+	Corona.prototype = new draw2d.Circle();
+	Corona.prototype.setAlpha = function(_5732) {
+		draw2d.Circle.prototype.setAlpha.call(this, Math.min(0.3, _5732));
+		this.setDeleteable(false);
+		this.setCanDrag(false);
+		this.setResizeable(false);
+		this.setSelectable(false);
+	};
+	if (_5730 === null || _5730 === undefined) {
+		this.currentUIRepresentation = new draw2d.Circle();
+	} else {
+		this.currentUIRepresentation = _5730;
+	}
+	if (_5731 === null || _5731 === undefined) {
+		this.connectedUIRepresentation = new draw2d.Circle();
+		this.connectedUIRepresentation.setColor(null);
+	} else {
+		this.connectedUIRepresentation = _5731;
+	}
+	this.disconnectedUIRepresentation = this.currentUIRepresentation;
+	this.hideIfConnected = false;
+	this.uiRepresentationAdded = true;
+	this.parentNode = null;
+	this.originX = 0;
+	this.originY = 0;
+	this.coronaWidth = 10;
+	this.corona = null;
+	draw2d.Rectangle.call(this);
+	this.setDimension(8, 8);
+	this.setBackgroundColor(new draw2d.Color(100, 180, 100));
+	this.setColor(new draw2d.Color(90, 150, 90));
+	draw2d.Rectangle.prototype.setColor.call(this, null);
+	this.dropable = new draw2d.DropTarget(this.html);
+	this.dropable.node = this;
+	this.dropable.addEventListener("dragenter", function(_5733) {
+		_5733.target.node.onDragEnter(_5733.relatedTarget.node);
+	});
+	this.dropable.addEventListener("dragleave", function(_5734) {
+		_5734.target.node.onDragLeave(_5734.relatedTarget.node);
+	});
+	this.dropable.addEventListener("drop", function(_5735) {
+		_5735.relatedTarget.node.onDrop(_5735.target.node);
+	});
+};
+draw2d.Port.prototype = new draw2d.Rectangle();
+draw2d.Port.prototype.type = "draw2d.Port";
+draw2d.Port.ZOrderBaseIndex = 5000;
+draw2d.Port.setZOrderBaseIndex = function(index) {
+	draw2d.Port.ZOrderBaseIndex = index;
+};
+draw2d.Port.prototype.setHideIfConnected = function(flag) {
+	this.hideIfConnected = flag;
+};
+draw2d.Port.prototype.dispose = function() {
+	var size = this.moveListener.getSize();
+	for ( var i = 0; i < size; i++) {
+		var _573a = this.moveListener.get(i);
+		this.parentNode.workflow.removeFigure(_573a);
+		_573a.dispose();
+	}
+	draw2d.Rectangle.prototype.dispose.call(this);
+	this.parentNode = null;
+	this.dropable.node = null;
+	this.dropable = null;
+	this.disconnectedUIRepresentation.dispose();
+	this.connectedUIRepresentation.dispose();
+};
+draw2d.Port.prototype.createHTMLElement = function() {
+	var item = draw2d.Rectangle.prototype.createHTMLElement.call(this);
+	item.style.zIndex = draw2d.Port.ZOrderBaseIndex;
+	this.currentUIRepresentation.html.zIndex = draw2d.Port.ZOrderBaseIndex;
+	item.appendChild(this.currentUIRepresentation.html);
+	this.uiRepresentationAdded = true;
+	return item;
+};
+draw2d.Port.prototype.setUiRepresentation = function(_573c) {
+	if (_573c === null) {
+		_573c = new draw2d.Figure();
+	}
+	if (this.uiRepresentationAdded) {
+		this.html.removeChild(this.currentUIRepresentation.getHTMLElement());
+	}
+	this.html.appendChild(_573c.getHTMLElement());
+	_573c.paint();
+	this.currentUIRepresentation = _573c;
+};
+draw2d.Port.prototype.onMouseEnter = function() {
+	this.setLineWidth(2);
+};
+draw2d.Port.prototype.onMouseLeave = function() {
+	this.setLineWidth(0);
+};
+draw2d.Port.prototype.setDimension = function(width, _573e) {
+	draw2d.Rectangle.prototype.setDimension.call(this, width, _573e);
+	this.connectedUIRepresentation.setDimension(width, _573e);
+	this.disconnectedUIRepresentation.setDimension(width, _573e);
+	this.setPosition(this.x, this.y);
+};
+draw2d.Port.prototype.setBackgroundColor = function(color) {
+	this.currentUIRepresentation.setBackgroundColor(color);
+};
+draw2d.Port.prototype.getBackgroundColor = function() {
+	return this.currentUIRepresentation.getBackgroundColor();
+};
+draw2d.Port.prototype.getConnections = function() {
+	var _5740 = new draw2d.ArrayList();
+	var size = this.moveListener.getSize();
+	for ( var i = 0; i < size; i++) {
+		var _5743 = this.moveListener.get(i);
+		if (_5743 instanceof draw2d.Connection) {
+			_5740.add(_5743);
+		}
+	}
+	return _5740;
+};
+draw2d.Port.prototype.setColor = function(color) {
+	this.currentUIRepresentation.setColor(color);
+};
+draw2d.Port.prototype.getColor = function() {
+	return this.currentUIRepresentation.getColor();
+};
+draw2d.Port.prototype.setLineWidth = function(width) {
+	this.currentUIRepresentation.setLineWidth(width);
+};
+draw2d.Port.prototype.getLineWidth = function() {
+	return this.currentUIRepresentation.getLineWidth();
+};
+draw2d.Port.prototype.paint = function() {
+	try {
+		this.currentUIRepresentation.paint();
+	} catch (e) {
+		pushErrorStack(e, "draw2d.Port.prototype.paint=function()");
+	}
+};
+draw2d.Port.prototype.setPosition = function(xPos, yPos) {
+	this.originX = xPos;
+	this.originY = yPos;
+	draw2d.Rectangle.prototype.setPosition.call(this, xPos, yPos);
+	if (this.html === null) {
+		return;
+	}
+	this.html.style.left = (this.x - this.getWidth() / 2) + "px";
+	this.html.style.top = (this.y - this.getHeight() / 2) + "px";
+};
+draw2d.Port.prototype.setParent = function(_5748) {
+	if (this.parentNode !== null) {
+		this.parentNode.detachMoveListener(this);
+	}
+	this.parentNode = _5748;
+	if (this.parentNode !== null) {
+		this.parentNode.attachMoveListener(this);
+	}
+};
+draw2d.Port.prototype.attachMoveListener = function(_5749) {
+	draw2d.Rectangle.prototype.attachMoveListener.call(this, _5749);
+	if (this.hideIfConnected == true) {
+		this.setUiRepresentation(this.connectedUIRepresentation);
+	}
+};
+draw2d.Port.prototype.detachMoveListener = function(_574a) {
+	draw2d.Rectangle.prototype.detachMoveListener.call(this, _574a);
+	if (this.getConnections().getSize() == 0) {
+		this.setUiRepresentation(this.disconnectedUIRepresentation);
+	}
+};
+draw2d.Port.prototype.getParent = function() {
+	return this.parentNode;
+};
+draw2d.Port.prototype.onDrag = function() {
+	draw2d.Rectangle.prototype.onDrag.call(this);
+	this.parentNode.workflow.showConnectionLine(this.parentNode.x + this.x,
+			this.parentNode.y + this.y, this.parentNode.x + this.originX,
+			this.parentNode.y + this.originY);
+};
+draw2d.Port.prototype.getCoronaWidth = function() {
+	return this.coronaWidth;
+};
+draw2d.Port.prototype.setCoronaWidth = function(width) {
+	this.coronaWidth = width;
+};
+draw2d.Port.prototype.setOrigin = function(x, y) {
+	this.originX = x;
+	this.originY = y;
+};
+draw2d.Port.prototype.onDragend = function() {
+	this.setAlpha(1);
+	this.setPosition(this.originX, this.originY);
+	this.parentNode.workflow.hideConnectionLine();
+	document.body.focus();
+};
+draw2d.Port.prototype.onDragEnter = function(port) {
+	var _574f = new draw2d.EditPolicy(draw2d.EditPolicy.CONNECT);
+	_574f.canvas = this.parentNode.workflow;
+	_574f.source = port;
+	_574f.target = this;
+	var _5750 = this.createCommand(_574f);
+	if (_5750 === null) {
+		return;
+	}
+	this.parentNode.workflow.connectionLine
+			.setColor(new draw2d.Color(0, 150, 0));
+	this.parentNode.workflow.connectionLine.setLineWidth(3);
+	this.showCorona(true);
+};
+draw2d.Port.prototype.onDragLeave = function(port) {
+	this.parentNode.workflow.connectionLine.setColor(new draw2d.Color(0, 0, 0));
+	this.parentNode.workflow.connectionLine.setLineWidth(1);
+	this.showCorona(false);
+};
+draw2d.Port.prototype.onDrop = function(port) {
+	var _5753 = new draw2d.EditPolicy(draw2d.EditPolicy.CONNECT);
+	_5753.canvas = this.parentNode.workflow;
+	_5753.source = port;
+	_5753.target = this;
+	var _5754 = this.createCommand(_5753);
+	if (_5754 !== null) {
+		this.parentNode.workflow.getCommandStack().execute(_5754);
+	}
+};
+draw2d.Port.prototype.getAbsolutePosition = function() {
+	return new draw2d.Point(this.getAbsoluteX(), this.getAbsoluteY());
+};
+draw2d.Port.prototype.getAbsoluteBounds = function() {
+	return new draw2d.Dimension(this.getAbsoluteX(), this.getAbsoluteY(), this
+			.getWidth(), this.getHeight());
+};
+draw2d.Port.prototype.getAbsoluteY = function() {
+	return this.originY + this.parentNode.getY();
+};
+draw2d.Port.prototype.getAbsoluteX = function() {
+	return this.originX + this.parentNode.getX();
+};
+draw2d.Port.prototype.onOtherFigureMoved = function(_5755) {
+	this.fireMoveEvent();
+};
+draw2d.Port.prototype.getName = function() {
+	return this.name;
+};
+draw2d.Port.prototype.setName = function(name) {
+	this.name = name;
+};
+draw2d.Port.prototype.isOver = function(iX, iY) {
+	var x = this.getAbsoluteX() - this.coronaWidth - this.getWidth() / 2;
+	var y = this.getAbsoluteY() - this.coronaWidth - this.getHeight() / 2;
+	var iX2 = x + this.width + (this.coronaWidth * 2) + this.getWidth() / 2;
+	var iY2 = y + this.height + (this.coronaWidth * 2) + this.getHeight() / 2;
+	return (iX >= x && iX <= iX2 && iY >= y && iY <= iY2);
+};
+draw2d.Port.prototype.showCorona = function(flag, _575e) {
+	if (flag === true) {
+		this.corona = new Corona();
+		this.corona.setAlpha(0.3);
+		this.corona.setBackgroundColor(new draw2d.Color(0, 125, 125));
+		this.corona.setColor(null);
+		this.corona.setDimension(this.getWidth() + (this.getCoronaWidth() * 2),
+				this.getWidth() + (this.getCoronaWidth() * 2));
+		this.parentNode.getWorkflow().addFigure(
+				this.corona,
+				this.getAbsoluteX() - this.getCoronaWidth() - this.getWidth()
+						/ 2,
+				this.getAbsoluteY() - this.getCoronaWidth() - this.getHeight()
+						/ 2);
+	} else {
+		if (flag === false && this.corona !== null) {
+			this.parentNode.getWorkflow().removeFigure(this.corona);
+			this.corona = null;
+		}
+	}
+};
+draw2d.Port.prototype.createCommand = function(_575f) {
+	if (_575f.getPolicy() === draw2d.EditPolicy.MOVE) {
+		if (!this.canDrag) {
+			return null;
+		}
+		return new draw2d.CommandMovePort(this);
+	}
+	if (_575f.getPolicy() === draw2d.EditPolicy.CONNECT) {
+		if (_575f.source.parentNode.id === _575f.target.parentNode.id) {
+			return null;
+		} else {
+			return new draw2d.CommandConnect(_575f.canvas, _575f.source,
+					_575f.target);
+		}
+	}
+	return null;
+};
+draw2d.InputPort = function(_590b) {
+	draw2d.Port.call(this, _590b);
+};
+draw2d.InputPort.prototype = new draw2d.Port();
+draw2d.InputPort.prototype.type = "draw2d.InputPort";
+draw2d.InputPort.prototype.onDragstart = function(x, y) {
+	if (!this.canDrag) {
+		return false;
+	}
+	return true;
+};
+draw2d.InputPort.prototype.onDragEnter = function(port) {
+	if (port instanceof draw2d.OutputPort) {
+		draw2d.Port.prototype.onDragEnter.call(this, port);
+	} else {
+		if (port instanceof draw2d.LineStartResizeHandle) {
+			var line = this.workflow.currentSelection;
+			if (line instanceof draw2d.Connection
+					&& line.getSource() instanceof draw2d.InputPort) {
+				draw2d.Port.prototype.onDragEnter.call(this, line.getTarget());
+			}
+		} else {
+			if (port instanceof draw2d.LineEndResizeHandle) {
+				var line = this.workflow.currentSelection;
+				if (line instanceof draw2d.Connection
+						&& line.getTarget() instanceof draw2d.InputPort) {
+					draw2d.Port.prototype.onDragEnter.call(this, line
+							.getSource());
+				}
+			}
+		}
+	}
+};
+draw2d.InputPort.prototype.onDragLeave = function(port) {
+	if (port instanceof draw2d.OutputPort) {
+		draw2d.Port.prototype.onDragLeave.call(this, port);
+	} else {
+		if (port instanceof draw2d.LineStartResizeHandle) {
+			var line = this.workflow.currentSelection;
+			if (line instanceof draw2d.Connection
+					&& line.getSource() instanceof draw2d.InputPort) {
+				draw2d.Port.prototype.onDragLeave.call(this, line.getTarget());
+			}
+		} else {
+			if (port instanceof draw2d.LineEndResizeHandle) {
+				var line = this.workflow.currentSelection;
+				if (line instanceof draw2d.Connection
+						&& line.getTarget() instanceof draw2d.InputPort) {
+					draw2d.Port.prototype.onDragLeave.call(this, line
+							.getSource());
+				}
+			}
+		}
+	}
+};
+draw2d.InputPort.prototype.createCommand = function(_5912) {
+	if (_5912.getPolicy() == draw2d.EditPolicy.CONNECT) {
+		if (_5912.source.parentNode.id == _5912.target.parentNode.id) {
+			return null;
+		}
+		if (_5912.source instanceof draw2d.OutputPort) {
+			return new draw2d.CommandConnect(_5912.canvas, _5912.source,
+					_5912.target);
+		}
+		return null;
+	}
+	return draw2d.Port.prototype.createCommand.call(this, _5912);
+};
+draw2d.OutputPort = function(_5ca2) {
+	draw2d.Port.call(this, _5ca2);
+	this.maxFanOut = 100;
+};
+draw2d.OutputPort.prototype = new draw2d.Port();
+draw2d.OutputPort.prototype.type = "draw2d.OutputPort";
+draw2d.OutputPort.prototype.onDragEnter = function(port) {
+	if (this.getMaxFanOut() <= this.getFanOut()) {
+		return;
+	}
+	if (port instanceof draw2d.InputPort) {
+		draw2d.Port.prototype.onDragEnter.call(this, port);
+	} else {
+		if (port instanceof draw2d.LineStartResizeHandle) {
+			var line = this.workflow.currentSelection;
+			if (line instanceof draw2d.Connection
+					&& line.getSource() instanceof draw2d.OutputPort) {
+				draw2d.Port.prototype.onDragEnter.call(this, line.getTarget());
+			}
+		} else {
+			if (port instanceof draw2d.LineEndResizeHandle) {
+				var line = this.workflow.currentSelection;
+				if (line instanceof draw2d.Connection
+						&& line.getTarget() instanceof draw2d.OutputPort) {
+					draw2d.Port.prototype.onDragEnter.call(this, line
+							.getSource());
+				}
+			}
+		}
+	}
+};
+draw2d.OutputPort.prototype.onDragLeave = function(port) {
+	if (port instanceof draw2d.InputPort) {
+		draw2d.Port.prototype.onDragLeave.call(this, port);
+	} else {
+		if (port instanceof draw2d.LineStartResizeHandle) {
+			var line = this.workflow.currentSelection;
+			if (line instanceof draw2d.Connection
+					&& line.getSource() instanceof draw2d.OutputPort) {
+				draw2d.Port.prototype.onDragLeave.call(this, line.getTarget());
+			}
+		} else {
+			if (port instanceof draw2d.LineEndResizeHandle) {
+				var line = this.workflow.currentSelection;
+				if (line instanceof draw2d.Connection
+						&& line.getTarget() instanceof draw2d.OutputPort) {
+					draw2d.Port.prototype.onDragLeave.call(this, line
+							.getSource());
+				}
+			}
+		}
+	}
+};
+draw2d.OutputPort.prototype.onDragstart = function(x, y) {
+	if (!this.canDrag) {
+		return false;
+	}
+	if (this.maxFanOut === -1) {
+		return true;
+	}
+	if (this.getMaxFanOut() <= this.getFanOut()) {
+		return false;
+	}
+	return true;
+};
+draw2d.OutputPort.prototype.setMaxFanOut = function(count) {
+	this.maxFanOut = count;
+};
+draw2d.OutputPort.prototype.getMaxFanOut = function() {
+	return this.maxFanOut;
+};
+draw2d.OutputPort.prototype.getFanOut = function() {
+	if (this.getParent().workflow === null) {
+		return 0;
+	}
+	var count = 0;
+	var lines = this.getParent().workflow.getLines();
+	var size = lines.getSize();
+	for ( var i = 0; i < size; i++) {
+		var line = lines.get(i);
+		if (line instanceof draw2d.Connection) {
+			if (line.getSource() == this) {
+				count++;
+			} else {
+				if (line.getTarget() == this) {
+					count++;
+				}
+			}
+		}
+	}
+	return count;
+};
+draw2d.OutputPort.prototype.createCommand = function(_5caf) {
+	if (_5caf.getPolicy() === draw2d.EditPolicy.CONNECT) {
+		if (_5caf.source.parentNode.id === _5caf.target.parentNode.id) {
+			return null;
+		}
+		if (_5caf.source instanceof draw2d.InputPort) {
+			return new draw2d.CommandConnect(_5caf.canvas, _5caf.target,
+					_5caf.source);
+		}
+		return null;
+	}
+	return draw2d.Port.prototype.createCommand.call(this, _5caf);
+};
+draw2d.Line = function() {
+	this.lineColor = new draw2d.Color(0, 0, 0);
+	this.stroke = 1;
+	this.canvas = null;
+	this.parent = null;
+	this.workflow = null;
+	this.html = null;
+	this.graphics = null;
+	this.id = draw2d.UUID.create();
+	this.startX = 30;
+	this.startY = 30;
+	this.endX = 100;
+	this.endY = 100;
+	this.alpha = 1;
+	this.isMoving = false;
+	this.model = null;
+	this.zOrder = draw2d.Line.ZOrderBaseIndex;
+	this.corona = draw2d.Line.CoronaWidth;
+	this.properties = {};
+	this.moveListener = new draw2d.ArrayList();
+	this.setSelectable(true);
+	this.setDeleteable(true);
+};
+draw2d.Line.prototype.type = "draw2d.Line";
+draw2d.Line.ZOrderBaseIndex = 200;
+draw2d.Line.ZOrderBaseIndex = 200;
+draw2d.Line.CoronaWidth = 5;
+draw2d.Line.setZOrderBaseIndex = function(index) {
+	draw2d.Line.ZOrderBaseIndex = index;
+};
+draw2d.Line.setDefaultCoronaWidth = function(width) {
+	draw2d.Line.CoronaWidth = width;
+};
+draw2d.Line.prototype.dispose = function() {
+	this.canvas = null;
+	this.workflow = null;
+	if (this.graphics !== null) {
+		this.graphics.clear();
+	}
+	this.graphics = null;
+};
+draw2d.Line.prototype.getZOrder = function() {
+	return this.zOrder;
+};
+draw2d.Line.prototype.setZOrder = function(index) {
+	if (this.html !== null) {
+		this.html.style.zIndex = index;
+	}
+	this.zOrder = index;
+};
+draw2d.Line.prototype.setCoronaWidth = function(width) {
+	this.corona = width;
+};
+draw2d.Line.prototype.createHTMLElement = function() {
+	var item = document.createElement("div");
+	item.id = this.id;
+	item.style.position = "absolute";
+	item.style.left = "0px";
+	item.style.top = "0px";
+	item.style.height = "0px";
+	item.style.width = "0px";
+	item.style.zIndex = this.zOrder;
+	return item;
+};
+draw2d.Line.prototype.setId = function(id) {
+	this.id = id;
+	if (this.html !== null) {
+		this.html.id = id;
+	}
+};
+draw2d.Line.prototype.getId = function() {
+	return this.id;
+};
+draw2d.Line.prototype.getProperties = function() {
+	return this.properties;
+};
+draw2d.Line.prototype.getProperty = function(key) {
+	return this.properties[key];
+};
+draw2d.Line.prototype.setProperty = function(key, value) {
+	this.properties[key] = value;
+	this.setDocumentDirty();
+};
+draw2d.Line.prototype.getHTMLElement = function() {
+	if (this.html === null) {
+		this.html = this.createHTMLElement();
+	}
+	return this.html;
+};
+draw2d.Line.prototype.getWorkflow = function() {
+	return this.workflow;
+};
+draw2d.Line.prototype.isResizeable = function() {
+	return true;
+};
+draw2d.Line.prototype.setCanvas = function(_56ed) {
+	this.canvas = _56ed;
+	if (this.graphics !== null) {
+		this.graphics.clear();
+	}
+	this.graphics = null;
+};
+draw2d.Line.prototype.setWorkflow = function(_56ee) {
+	this.workflow = _56ee;
+	if (this.graphics !== null) {
+		this.graphics.clear();
+	}
+	this.graphics = null;
+};
+draw2d.Line.prototype.paint = function() {
+	if (this.html === null) {
+		return;
+	}
+	try {
+		if (this.graphics === null) {
+			this.graphics = new jsGraphics(this.html);
+		} else {
+			this.graphics.clear();
+		}
+		this.graphics.setStroke(this.stroke);
+		this.graphics.setColor(this.lineColor.getHTMLStyle());
+		this.graphics.drawLine(this.startX, this.startY, this.endX, this.endY);
+		this.graphics.paint();
+	} catch (e) {
+		pushErrorStack(e, "draw2d.Line.prototype.paint=function()");
+	}
+};
+draw2d.Line.prototype.attachMoveListener = function(_56ef) {
+	this.moveListener.add(_56ef);
+};
+draw2d.Line.prototype.detachMoveListener = function(_56f0) {
+	this.moveListener.remove(_56f0);
+};
+draw2d.Line.prototype.fireMoveEvent = function() {
+	var size = this.moveListener.getSize();
+	for ( var i = 0; i < size; i++) {
+		this.moveListener.get(i).onOtherFigureMoved(this);
+	}
+};
+draw2d.Line.prototype.onOtherFigureMoved = function(_56f3) {
+};
+draw2d.Line.prototype.setLineWidth = function(w) {
+	this.stroke = w;
+	if (this.graphics !== null) {
+		this.paint();
+	}
+	this.setDocumentDirty();
+};
+draw2d.Line.prototype.setColor = function(color) {
+	this.lineColor = color;
+	if (this.graphics !== null) {
+		this.paint();
+	}
+	this.setDocumentDirty();
+};
+draw2d.Line.prototype.getColor = function() {
+	return this.lineColor;
+};
+draw2d.Line.prototype.setAlpha = function(_56f6) {
+	if (_56f6 == this.alpha) {
+		return;
+	}
+	try {
+		this.html.style.MozOpacity = _56f6;
+	} catch (exc1) {
+	}
+	try {
+		this.html.style.opacity = _56f6;
+	} catch (exc2) {
+	}
+	try {
+		var _56f7 = Math.round(_56f6 * 100);
+		if (_56f7 >= 99) {
+			this.html.style.filter = "";
+		} else {
+			this.html.style.filter = "alpha(opacity=" + _56f7 + ")";
+		}
+	} catch (exc3) {
+	}
+	this.alpha = _56f6;
+};
+draw2d.Line.prototype.setStartPoint = function(x, y) {
+	this.startX = x;
+	this.startY = y;
+	if (this.graphics !== null) {
+		this.paint();
+	}
+	this.setDocumentDirty();
+};
+draw2d.Line.prototype.setEndPoint = function(x, y) {
+	this.endX = x;
+	this.endY = y;
+	if (this.graphics !== null) {
+		this.paint();
+	}
+	this.setDocumentDirty();
+};
+draw2d.Line.prototype.getStartX = function() {
+	return this.startX;
+};
+draw2d.Line.prototype.getStartY = function() {
+	return this.startY;
+};
+draw2d.Line.prototype.getStartPoint = function() {
+	return new draw2d.Point(this.startX, this.startY);
+};
+draw2d.Line.prototype.getEndX = function() {
+	return this.endX;
+};
+draw2d.Line.prototype.getEndY = function() {
+	return this.endY;
+};
+draw2d.Line.prototype.getEndPoint = function() {
+	return new draw2d.Point(this.endX, this.endY);
+};
+draw2d.Line.prototype.isSelectable = function() {
+	return this.selectable;
+};
+draw2d.Line.prototype.setSelectable = function(flag) {
+	this.selectable = flag;
+};
+draw2d.Line.prototype.isDeleteable = function() {
+	return this.deleteable;
+};
+draw2d.Line.prototype.setDeleteable = function(flag) {
+	this.deleteable = flag;
+};
+draw2d.Line.prototype.getLength = function() {
+	return Math.sqrt((this.startX - this.endX) * (this.startX - this.endX)
+			+ (this.startY - this.endY) * (this.startY - this.endY));
+};
+draw2d.Line.prototype.getAngle = function() {
+	var _56fe = this.getLength();
+	var angle = -(180 / Math.PI) * Math.asin((this.startY - this.endY) / _56fe);
+	if (angle < 0) {
+		if (this.endX < this.startX) {
+			angle = Math.abs(angle) + 180;
+		} else {
+			angle = 360 - Math.abs(angle);
+		}
+	} else {
+		if (this.endX < this.startX) {
+			angle = 180 - angle;
+		}
+	}
+	return angle;
+};
+draw2d.Line.prototype.createCommand = function(_5700) {
+	if (_5700.getPolicy() == draw2d.EditPolicy.MOVE) {
+		var x1 = this.getStartX();
+		var y1 = this.getStartY();
+		var x2 = this.getEndX();
+		var y2 = this.getEndY();
+		return new draw2d.CommandMoveLine(this, x1, y1, x2, y2);
+	}
+	if (_5700.getPolicy() == draw2d.EditPolicy.DELETE) {
+		if (this.isDeleteable() == false) {
+			return null;
+		}
+		return new draw2d.CommandDelete(this);
+	}
+	return null;
+};
+draw2d.Line.prototype.setModel = function(model) {
+	if (this.model !== null) {
+		this.model.removePropertyChangeListener(this);
+	}
+	this.model = model;
+	if (this.model !== null) {
+		this.model.addPropertyChangeListener(this);
+	}
+};
+draw2d.Line.prototype.getModel = function() {
+	return this.model;
+};
+draw2d.Line.prototype.onRemove = function(_5706) {
+};
+draw2d.Line.prototype.onContextMenu = function(x, y) {
+	var menu = this.getContextMenu();
+	if (menu !== null) {
+		this.workflow.showMenu(menu, x, y);
+	}
+};
+draw2d.Line.prototype.getContextMenu = function() {
+	return null;
+};
+draw2d.Line.prototype.onDoubleClick = function() {
+};
+draw2d.Line.prototype.setDocumentDirty = function() {
+	if (this.workflow !== null) {
+		this.workflow.setDocumentDirty();
+	}
+};
+draw2d.Line.prototype.containsPoint = function(px, py) {
+	return draw2d.Line.hit(this.corona, this.startX, this.startY, this.endX,
+			this.endY, px, py);
+};
+draw2d.Line.hit = function(_570c, X1, Y1, X2, Y2, px, py) {
+	X2 -= X1;
+	Y2 -= Y1;
+	px -= X1;
+	py -= Y1;
+	var _5713 = px * X2 + py * Y2;
+	var _5714;
+	if (_5713 <= 0) {
+		_5714 = 0;
+	} else {
+		px = X2 - px;
+		py = Y2 - py;
+		_5713 = px * X2 + py * Y2;
+		if (_5713 <= 0) {
+			_5714 = 0;
+		} else {
+			_5714 = _5713 * _5713 / (X2 * X2 + Y2 * Y2);
+		}
+	}
+	var lenSq = px * px + py * py - _5714;
+	if (lenSq < 0) {
+		lenSq = 0;
+	}
+	return Math.sqrt(lenSq) < _570c;
+};
+draw2d.ConnectionRouter = function() {
+};
+draw2d.ConnectionRouter.prototype.type = "draw2d.ConnectionRouter";
+draw2d.ConnectionRouter.prototype.getDirection = function(r, p) {
+	var _5b2e = Math.abs(r.x - p.x);
+	var _5b2f = 3;
+	var i = Math.abs(r.y - p.y);
+	if (i <= _5b2e) {
+		_5b2e = i;
+		_5b2f = 0;
+	}
+	i = Math.abs(r.getBottom() - p.y);
+	if (i <= _5b2e) {
+		_5b2e = i;
+		_5b2f = 2;
+	}
+	i = Math.abs(r.getRight() - p.x);
+	if (i < _5b2e) {
+		_5b2e = i;
+		_5b2f = 1;
+	}
+	return _5b2f;
+};
+draw2d.ConnectionRouter.prototype.getEndDirection = function(conn) {
+	var p = conn.getEndPoint();
+	var rect = conn.getTarget().getParent().getBounds();
+	return this.getDirection(rect, p);
+};
+draw2d.ConnectionRouter.prototype.getStartDirection = function(conn) {
+	var p = conn.getStartPoint();
+	var rect = conn.getSource().getParent().getBounds();
+	return this.getDirection(rect, p);
+};
+draw2d.ConnectionRouter.prototype.route = function(_5b37) {
+};
+draw2d.NullConnectionRouter = function() {
+};
+draw2d.NullConnectionRouter.prototype = new draw2d.ConnectionRouter();
+draw2d.NullConnectionRouter.prototype.type = "draw2d.NullConnectionRouter";
+draw2d.NullConnectionRouter.prototype.invalidate = function() {
+};
+draw2d.NullConnectionRouter.prototype.route = function(_4a11) {
+	_4a11.addPoint(_4a11.getStartPoint());
+	_4a11.addPoint(_4a11.getEndPoint());
+};
+draw2d.ManhattanConnectionRouter = function() {
+	this.MINDIST = 20;
+};
+draw2d.ManhattanConnectionRouter.prototype = new draw2d.ConnectionRouter();
+draw2d.ManhattanConnectionRouter.prototype.type = "draw2d.ManhattanConnectionRouter";
+draw2d.ManhattanConnectionRouter.prototype.route = function(conn) {
+	var _5525 = conn.getStartPoint();
+	var _5526 = this.getStartDirection(conn);
+	var toPt = conn.getEndPoint();
+	var toDir = this.getEndDirection(conn);
+	this._route(conn, toPt, toDir, _5525, _5526);
+};
+draw2d.ManhattanConnectionRouter.prototype._route = function(conn, _552a,
+		_552b, toPt, toDir) {
+	var TOL = 0.1;
+	var _552f = 0.01;
+	var UP = 0;
+	var RIGHT = 1;
+	var DOWN = 2;
+	var LEFT = 3;
+	var xDiff = _552a.x - toPt.x;
+	var yDiff = _552a.y - toPt.y;
+	var point;
+	var dir;
+	if (((xDiff * xDiff) < (_552f)) && ((yDiff * yDiff) < (_552f))) {
+		conn.addPoint(new draw2d.Point(toPt.x, toPt.y));
+		return;
+	}
+	if (_552b == LEFT) {
+		if ((xDiff > 0) && ((yDiff * yDiff) < TOL) && (toDir === RIGHT)) {
+			point = toPt;
+			dir = toDir;
+		} else {
+			if (xDiff < 0) {
+				point = new draw2d.Point(_552a.x - this.MINDIST, _552a.y);
+			} else {
+				if (((yDiff > 0) && (toDir === DOWN))
+						|| ((yDiff < 0) && (toDir == UP))) {
+					point = new draw2d.Point(toPt.x, _552a.y);
+				} else {
+					if (_552b == toDir) {
+						var pos = Math.min(_552a.x, toPt.x) - this.MINDIST;
+						point = new draw2d.Point(pos, _552a.y);
+					} else {
+						point = new draw2d.Point(_552a.x - (xDiff / 2), _552a.y);
+					}
+				}
+			}
+			if (yDiff > 0) {
+				dir = UP;
+			} else {
+				dir = DOWN;
+			}
+		}
+	} else {
+		if (_552b == RIGHT) {
+			if ((xDiff < 0) && ((yDiff * yDiff) < TOL) && (toDir === LEFT)) {
+				point = toPt;
+				dir = toDir;
+			} else {
+				if (xDiff > 0) {
+					point = new draw2d.Point(_552a.x + this.MINDIST, _552a.y);
+				} else {
+					if (((yDiff > 0) && (toDir === DOWN))
+							|| ((yDiff < 0) && (toDir === UP))) {
+						point = new draw2d.Point(toPt.x, _552a.y);
+					} else {
+						if (_552b == toDir) {
+							var pos = Math.max(_552a.x, toPt.x) + this.MINDIST;
+							point = new draw2d.Point(pos, _552a.y);
+						} else {
+							point = new draw2d.Point(_552a.x - (xDiff / 2),
+									_552a.y);
+						}
+					}
+				}
+				if (yDiff > 0) {
+					dir = UP;
+				} else {
+					dir = DOWN;
+				}
+			}
+		} else {
+			if (_552b == DOWN) {
+				if (((xDiff * xDiff) < TOL) && (yDiff < 0) && (toDir == UP)) {
+					point = toPt;
+					dir = toDir;
+				} else {
+					if (yDiff > 0) {
+						point = new draw2d.Point(_552a.x, _552a.y
+								+ this.MINDIST);
+					} else {
+						if (((xDiff > 0) && (toDir === RIGHT))
+								|| ((xDiff < 0) && (toDir === LEFT))) {
+							point = new draw2d.Point(_552a.x, toPt.y);
+						} else {
+							if (_552b === toDir) {
+								var pos = Math.max(_552a.y, toPt.y)
+										+ this.MINDIST;
+								point = new draw2d.Point(_552a.x, pos);
+							} else {
+								point = new draw2d.Point(_552a.x, _552a.y
+										- (yDiff / 2));
+							}
+						}
+					}
+					if (xDiff > 0) {
+						dir = LEFT;
+					} else {
+						dir = RIGHT;
+					}
+				}
+			} else {
+				if (_552b == UP) {
+					if (((xDiff * xDiff) < TOL) && (yDiff > 0)
+							&& (toDir === DOWN)) {
+						point = toPt;
+						dir = toDir;
+					} else {
+						if (yDiff < 0) {
+							point = new draw2d.Point(_552a.x, _552a.y
+									- this.MINDIST);
+						} else {
+							if (((xDiff > 0) && (toDir === RIGHT))
+									|| ((xDiff < 0) && (toDir === LEFT))) {
+								point = new draw2d.Point(_552a.x, toPt.y);
+							} else {
+								if (_552b === toDir) {
+									var pos = Math.min(_552a.y, toPt.y)
+											- this.MINDIST;
+									point = new draw2d.Point(_552a.x, pos);
+								} else {
+									point = new draw2d.Point(_552a.x, _552a.y
+											- (yDiff / 2));
+								}
+							}
+						}
+						if (xDiff > 0) {
+							dir = LEFT;
+						} else {
+							dir = RIGHT;
+						}
+					}
+				}
+			}
+		}
+	}
+	this._route(conn, point, dir, toPt, toDir);
+	conn.addPoint(_552a);
+};
+draw2d.BezierConnectionRouter = function(_5fa4) {
+	if (!_5fa4) {
+		this.cheapRouter = new draw2d.ManhattanConnectionRouter();
+	} else {
+		this.cheapRouter = null;
+	}
+	this.iteration = 5;
+};
+draw2d.BezierConnectionRouter.prototype = new draw2d.ConnectionRouter();
+draw2d.BezierConnectionRouter.prototype.type = "draw2d.BezierConnectionRouter";
+draw2d.BezierConnectionRouter.prototype.drawBezier = function(_5fa5, _5fa6, t,
+		iter) {
+	var n = _5fa5.length - 1;
+	var q = [];
+	var _5fab = n + 1;
+	for ( var i = 0; i < _5fab; i++) {
+		q[i] = [];
+		q[i][0] = _5fa5[i];
+	}
+	for ( var j = 1; j <= n; j++) {
+		for ( var i = 0; i <= (n - j); i++) {
+			q[i][j] = new draw2d.Point((1 - t) * q[i][j - 1].x + t
+					* q[i + 1][j - 1].x, (1 - t) * q[i][j - 1].y + t
+					* q[i + 1][j - 1].y);
+		}
+	}
+	var c1 = [];
+	var c2 = [];
+	for ( var i = 0; i < n + 1; i++) {
+		c1[i] = q[0][i];
+		c2[i] = q[i][n - i];
+	}
+	if (iter >= 0) {
+		this.drawBezier(c1, _5fa6, t, --iter);
+		this.drawBezier(c2, _5fa6, t, --iter);
+	} else {
+		for ( var i = 0; i < n; i++) {
+			_5fa6.push(q[i][n - i]);
+		}
+	}
+};
+draw2d.BezierConnectionRouter.prototype.route = function(conn) {
+	if (this.cheapRouter !== null
+			&& (conn.getSource().getParent().isMoving === true || conn
+					.getTarget().getParent().isMoving === true)) {
+		this.cheapRouter.route(conn);
+		return;
+	}
+	var _5fb1 = [];
+	var _5fb2 = conn.getStartPoint();
+	var toPt = conn.getEndPoint();
+	this._route(_5fb1, conn, toPt, this.getEndDirection(conn), _5fb2, this
+			.getStartDirection(conn));
+	var _5fb4 = [];
+	this.drawBezier(_5fb1, _5fb4, 0.5, this.iteration);
+	for ( var i = 0; i < _5fb4.length; i++) {
+		conn.addPoint(_5fb4[i]);
+	}
+	conn.addPoint(toPt);
+};
+draw2d.BezierConnectionRouter.prototype._route = function(_5fb6, conn, _5fb8,
+		_5fb9, toPt, toDir) {
+	var TOL = 0.1;
+	var _5fbd = 0.01;
+	var _5fbe = 90;
+	var UP = 0;
+	var RIGHT = 1;
+	var DOWN = 2;
+	var LEFT = 3;
+	var xDiff = _5fb8.x - toPt.x;
+	var yDiff = _5fb8.y - toPt.y;
+	var point;
+	var dir;
+	if (((xDiff * xDiff) < (_5fbd)) && ((yDiff * yDiff) < (_5fbd))) {
+		_5fb6.push(new draw2d.Point(toPt.x, toPt.y));
+		return;
+	}
+	if (_5fb9 === LEFT) {
+		if ((xDiff > 0) && ((yDiff * yDiff) < TOL) && (toDir === RIGHT)) {
+			point = toPt;
+			dir = toDir;
+		} else {
+			if (xDiff < 0) {
+				point = new draw2d.Point(_5fb8.x - _5fbe, _5fb8.y);
+			} else {
+				if (((yDiff > 0) && (toDir === DOWN))
+						|| ((yDiff < 0) && (toDir === UP))) {
+					point = new draw2d.Point(toPt.x, _5fb8.y);
+				} else {
+					if (_5fb9 === toDir) {
+						var pos = Math.min(_5fb8.x, toPt.x) - _5fbe;
+						point = new draw2d.Point(pos, _5fb8.y);
+					} else {
+						point = new draw2d.Point(_5fb8.x - (xDiff / 2), _5fb8.y);
+					}
+				}
+			}
+			if (yDiff > 0) {
+				dir = UP;
+			} else {
+				dir = DOWN;
+			}
+		}
+	} else {
+		if (_5fb9 === RIGHT) {
+			if ((xDiff < 0) && ((yDiff * yDiff) < TOL) && (toDir == LEFT)) {
+				point = toPt;
+				dir = toDir;
+			} else {
+				if (xDiff > 0) {
+					point = new draw2d.Point(_5fb8.x + _5fbe, _5fb8.y);
+				} else {
+					if (((yDiff > 0) && (toDir === DOWN))
+							|| ((yDiff < 0) && (toDir === UP))) {
+						point = new draw2d.Point(toPt.x, _5fb8.y);
+					} else {
+						if (_5fb9 === toDir) {
+							var pos = Math.max(_5fb8.x, toPt.x) + _5fbe;
+							point = new draw2d.Point(pos, _5fb8.y);
+						} else {
+							point = new draw2d.Point(_5fb8.x - (xDiff / 2),
+									_5fb8.y);
+						}
+					}
+				}
+				if (yDiff > 0) {
+					dir = UP;
+				} else {
+					dir = DOWN;
+				}
+			}
+		} else {
+			if (_5fb9 === DOWN) {
+				if (((xDiff * xDiff) < TOL) && (yDiff < 0) && (toDir === UP)) {
+					point = toPt;
+					dir = toDir;
+				} else {
+					if (yDiff > 0) {
+						point = new draw2d.Point(_5fb8.x, _5fb8.y + _5fbe);
+					} else {
+						if (((xDiff > 0) && (toDir === RIGHT))
+								|| ((xDiff < 0) && (toDir === LEFT))) {
+							point = new draw2d.Point(_5fb8.x, toPt.y);
+						} else {
+							if (_5fb9 === toDir) {
+								var pos = Math.max(_5fb8.y, toPt.y) + _5fbe;
+								point = new draw2d.Point(_5fb8.x, pos);
+							} else {
+								point = new draw2d.Point(_5fb8.x, _5fb8.y
+										- (yDiff / 2));
+							}
+						}
+					}
+					if (xDiff > 0) {
+						dir = LEFT;
+					} else {
+						dir = RIGHT;
+					}
+				}
+			} else {
+				if (_5fb9 === UP) {
+					if (((xDiff * xDiff) < TOL) && (yDiff > 0)
+							&& (toDir === DOWN)) {
+						point = toPt;
+						dir = toDir;
+					} else {
+						if (yDiff < 0) {
+							point = new draw2d.Point(_5fb8.x, _5fb8.y - _5fbe);
+						} else {
+							if (((xDiff > 0) && (toDir === RIGHT))
+									|| ((xDiff < 0) && (toDir === LEFT))) {
+								point = new draw2d.Point(_5fb8.x, toPt.y);
+							} else {
+								if (_5fb9 === toDir) {
+									var pos = Math.min(_5fb8.y, toPt.y) - _5fbe;
+									point = new draw2d.Point(_5fb8.x, pos);
+								} else {
+									point = new draw2d.Point(_5fb8.x, _5fb8.y
+											- (yDiff / 2));
+								}
+							}
+						}
+						if (xDiff > 0) {
+							dir = LEFT;
+						} else {
+							dir = RIGHT;
+						}
+					}
+				}
+			}
+		}
+	}
+	this._route(_5fb6, conn, point, dir, toPt, toDir);
+	_5fb6.push(_5fb8);
+};
+draw2d.FanConnectionRouter = function() {
+};
+draw2d.FanConnectionRouter.prototype = new draw2d.NullConnectionRouter();
+draw2d.FanConnectionRouter.prototype.type = "draw2d.FanConnectionRouter";
+draw2d.FanConnectionRouter.prototype.route = function(conn) {
+	var _5680 = conn.getStartPoint();
+	var toPt = conn.getEndPoint();
+	var lines = conn.getSource().getConnections();
+	var _5683 = new draw2d.ArrayList();
+	var index = 0;
+	for ( var i = 0; i < lines.getSize(); i++) {
+		var _5686 = lines.get(i);
+		if (_5686.getTarget() == conn.getTarget()
+				|| _5686.getSource() == conn.getTarget()) {
+			_5683.add(_5686);
+			if (conn == _5686) {
+				index = _5683.getSize();
+			}
+		}
+	}
+	if (_5683.getSize() > 1) {
+		this.routeCollision(conn, index);
+	} else {
+		draw2d.NullConnectionRouter.prototype.route.call(this, conn);
+	}
+};
+draw2d.FanConnectionRouter.prototype.routeNormal = function(conn) {
+	conn.addPoint(conn.getStartPoint());
+	conn.addPoint(conn.getEndPoint());
+};
+draw2d.FanConnectionRouter.prototype.routeCollision = function(conn, index) {
+	var start = conn.getStartPoint();
+	var end = conn.getEndPoint();
+	conn.addPoint(start);
+	var _568c = 10;
+	var _568d = new draw2d.Point((end.x + start.x) / 2, (end.y + start.y) / 2);
+	var _568e = end.getPosition(start);
+	var ray;
+	if (_568e == draw2d.PositionConstants.SOUTH
+			|| _568e == draw2d.PositionConstants.EAST) {
+		ray = new draw2d.Point(end.x - start.x, end.y - start.y);
+	} else {
+		ray = new draw2d.Point(start.x - end.x, start.y - end.y);
+	}
+	var _5690 = Math.sqrt(ray.x * ray.x + ray.y * ray.y);
+	var _5691 = _568c * ray.x / _5690;
+	var _5692 = _568c * ray.y / _5690;
+	var _5693;
+	if (index % 2 === 0) {
+		_5693 = new draw2d.Point(_568d.x + (index / 2) * (-1 * _5692), _568d.y
+				+ (index / 2) * _5691);
+	} else {
+		_5693 = new draw2d.Point(_568d.x + (index / 2) * _5692, _568d.y
+				+ (index / 2) * (-1 * _5691));
+	}
+	conn.addPoint(_5693);
+	conn.addPoint(end);
+};
+draw2d.Graphics = function(_6019, _601a, _601b) {
+	this.jsGraphics = _6019;
+	this.xt = _601b.x;
+	this.yt = _601b.y;
+	this.radian = _601a * Math.PI / 180;
+	this.sinRadian = Math.sin(this.radian);
+	this.cosRadian = Math.cos(this.radian);
+};
+draw2d.Graphics.prototype.setStroke = function(x) {
+	this.jsGraphics.setStroke(x);
+};
+draw2d.Graphics.prototype.drawLine = function(x1, y1, x2, y2) {
+	var _x1 = this.xt + x1 * this.cosRadian - y1 * this.sinRadian;
+	var _y1 = this.yt + x1 * this.sinRadian + y1 * this.cosRadian;
+	var _x2 = this.xt + x2 * this.cosRadian - y2 * this.sinRadian;
+	var _y2 = this.yt + x2 * this.sinRadian + y2 * this.cosRadian;
+	this.jsGraphics.drawLine(_x1, _y1, _x2, _y2);
+};
+draw2d.Graphics.prototype.fillRect = function(x, y, w, h) {
+	var x1 = this.xt + x * this.cosRadian - y * this.sinRadian;
+	var y1 = this.yt + x * this.sinRadian + y * this.cosRadian;
+	var x2 = this.xt + (x + w) * this.cosRadian - y * this.sinRadian;
+	var y2 = this.yt + (x + w) * this.sinRadian + y * this.cosRadian;
+	var x3 = this.xt + (x + w) * this.cosRadian - (y + h) * this.sinRadian;
+	var y3 = this.yt + (x + w) * this.sinRadian + (y + h) * this.cosRadian;
+	var x4 = this.xt + x * this.cosRadian - (y + h) * this.sinRadian;
+	var y4 = this.yt + x * this.sinRadian + (y + h) * this.cosRadian;
+	this.jsGraphics.fillPolygon( [ x1, x2, x3, x4 ], [ y1, y2, y3, y4 ]);
+};
+draw2d.Graphics.prototype.fillPolygon = function(_6031, _6032) {
+	var rotX = [];
+	var rotY = [];
+	for ( var i = 0; i < _6031.length; i++) {
+		rotX[i] = this.xt + _6031[i] * this.cosRadian - _6032[i]
+				* this.sinRadian;
+		rotY[i] = this.yt + _6031[i] * this.sinRadian + _6032[i]
+				* this.cosRadian;
+	}
+	this.jsGraphics.fillPolygon(rotX, rotY);
+};
+draw2d.Graphics.prototype.setColor = function(color) {
+	this.jsGraphics.setColor(color.getHTMLStyle());
+};
+draw2d.Graphics.prototype.drawPolygon = function(_6037, _6038) {
+	var rotX = [];
+	var rotY = [];
+	for ( var i = 0; i < _6037.length; i++) {
+		rotX[i] = this.xt + _6037[i] * this.cosRadian - _6038[i]
+				* this.sinRadian;
+		rotY[i] = this.yt + _6037[i] * this.sinRadian + _6038[i]
+				* this.cosRadian;
+	}
+	this.jsGraphics.drawPolygon(rotX, rotY);
+};
+draw2d.Connection = function() {
+	draw2d.Line.call(this);
+	this.sourcePort = null;
+	this.targetPort = null;
+	this.canDrag = true;
+	this.sourceDecorator = null;
+	this.targetDecorator = null;
+	this.sourceAnchor = new draw2d.ConnectionAnchor();
+	this.targetAnchor = new draw2d.ConnectionAnchor();
+	this.router = draw2d.Connection.defaultRouter;
+	this.lineSegments = new draw2d.ArrayList();
+	this.children = new draw2d.ArrayList();
+	this.setColor(new draw2d.Color(0, 0, 115));
+	this.setLineWidth(1);
+};
+draw2d.Connection.prototype = new draw2d.Line();
+draw2d.Connection.prototype.type = "draw2d.Connection";
+draw2d.Connection.defaultRouter = new draw2d.ManhattanConnectionRouter();
+draw2d.Connection.setDefaultRouter = function(_58bd) {
+	draw2d.Connection.defaultRouter = _58bd;
+};
+draw2d.Connection.prototype.disconnect = function() {
+	if (this.sourcePort !== null) {
+		this.sourcePort.detachMoveListener(this);
+		this.fireSourcePortRouteEvent();
+	}
+	if (this.targetPort !== null) {
+		this.targetPort.detachMoveListener(this);
+		this.fireTargetPortRouteEvent();
+	}
+};
+draw2d.Connection.prototype.reconnect = function() {
+	if (this.sourcePort !== null) {
+		this.sourcePort.attachMoveListener(this);
+		this.fireSourcePortRouteEvent();
+	}
+	if (this.targetPort !== null) {
+		this.targetPort.attachMoveListener(this);
+		this.fireTargetPortRouteEvent();
+	}
+};
+draw2d.Connection.prototype.isResizeable = function() {
+	return this.getCanDrag();
+};
+draw2d.Connection.prototype.setCanDrag = function(flag) {
+	this.canDrag = flag;
+};
+draw2d.Connection.prototype.getCanDrag = function() {
+	return this.canDrag;
+};
+draw2d.Connection.prototype.addFigure = function(_58bf, _58c0) {
+	var entry = {};
+	entry.figure = _58bf;
+	entry.locator = _58c0;
+	this.children.add(entry);
+	if (this.graphics !== null) {
+		this.paint();
+	}
+	var oThis = this;
+	var _58c3 = function() {
+		var _58c4 = arguments[0] || window.event;
+		_58c4.returnValue = false;
+		oThis.getWorkflow().setCurrentSelection(oThis);
+		oThis.getWorkflow().showLineResizeHandles(oThis);
+	};
+	if (_58bf.getHTMLElement().addEventListener) {
+		_58bf.getHTMLElement().addEventListener("mousedown", _58c3, false);
+	} else {
+		if (_58bf.getHTMLElement().attachEvent) {
+			_58bf.getHTMLElement().attachEvent("onmousedown", _58c3);
+		}
+	}
+};
+draw2d.Connection.prototype.setSourceDecorator = function(_58c5) {
+	this.sourceDecorator = _58c5;
+	if (this.graphics !== null) {
+		this.paint();
+	}
+};
+draw2d.Connection.prototype.getSourceDecorator = function() {
+	return this.sourceDecorator;
+};
+draw2d.Connection.prototype.setTargetDecorator = function(_58c6) {
+	this.targetDecorator = _58c6;
+	if (this.graphics !== null) {
+		this.paint();
+	}
+};
+draw2d.Connection.prototype.getTargetDecorator = function() {
+	return this.targetDecorator;
+};
+draw2d.Connection.prototype.setSourceAnchor = function(_58c7) {
+	this.sourceAnchor = _58c7;
+	this.sourceAnchor.setOwner(this.sourcePort);
+	if (this.graphics !== null) {
+		this.paint();
+	}
+};
+draw2d.Connection.prototype.setTargetAnchor = function(_58c8) {
+	this.targetAnchor = _58c8;
+	this.targetAnchor.setOwner(this.targetPort);
+	if (this.graphics !== null) {
+		this.paint();
+	}
+};
+draw2d.Connection.prototype.setRouter = function(_58c9) {
+	if (_58c9 !== null) {
+		this.router = _58c9;
+	} else {
+		this.router = new draw2d.NullConnectionRouter();
+	}
+	if (this.graphics !== null) {
+		this.paint();
+	}
+};
+draw2d.Connection.prototype.getRouter = function() {
+	return this.router;
+};
+draw2d.Connection.prototype.setWorkflow = function(_58ca) {
+	draw2d.Line.prototype.setWorkflow.call(this, _58ca);
+	for ( var i = 0; i < this.children.getSize(); i++) {
+		this.children.get(i).isAppended = false;
+	}
+};
+draw2d.Connection.prototype.paint = function() {
+	if (this.html === null) {
+		return;
+	}
+	try {
+		for ( var i = 0; i < this.children.getSize(); i++) {
+			var entry = this.children.get(i);
+			if (entry.isAppended == true) {
+				this.html.removeChild(entry.figure.getHTMLElement());
+			}
+			entry.isAppended = false;
+		}
+		if (this.graphics === null) {
+			this.graphics = new jsGraphics(this.html);
+		} else {
+			this.graphics.clear();
+		}
+		this.graphics.setStroke(this.stroke);
+		this.graphics.setColor(this.lineColor.getHTMLStyle());
+		this.startStroke();
+		this.router.route(this);
+		if (this.getSource().getParent().isMoving == false
+				&& this.getTarget().getParent().isMoving == false) {
+			if (this.targetDecorator !== null) {
+				this.targetDecorator.paint(new draw2d.Graphics(this.graphics,
+						this.getEndAngle(), this.getEndPoint()));
+			}
+			if (this.sourceDecorator !== null) {
+				this.sourceDecorator.paint(new draw2d.Graphics(this.graphics,
+						this.getStartAngle(), this.getStartPoint()));
+			}
+		}
+		this.finishStroke();
+		for ( var i = 0; i < this.children.getSize(); i++) {
+			var entry = this.children.get(i);
+			this.html.appendChild(entry.figure.getHTMLElement());
+			entry.isAppended = true;
+			entry.locator.relocate(entry.figure);
+		}
+	} catch (e) {
+		pushErrorStack(e, "draw2d.Connection.prototype.paint=function()");
+	}
+};
+draw2d.Connection.prototype.getStartPoint = function() {
+	if (this.isMoving == false) {
+		return this.sourceAnchor.getLocation(this.targetAnchor
+				.getReferencePoint());
+	} else {
+		return draw2d.Line.prototype.getStartPoint.call(this);
+	}
+};
+draw2d.Connection.prototype.getEndPoint = function() {
+	if (this.isMoving == false) {
+		return this.targetAnchor.getLocation(this.sourceAnchor
+				.getReferencePoint());
+	} else {
+		return draw2d.Line.prototype.getEndPoint.call(this);
+	}
+};
+draw2d.Connection.prototype.startStroke = function() {
+	this.oldPoint = null;
+	this.lineSegments = new draw2d.ArrayList();
+};
+draw2d.Connection.prototype.finishStroke = function() {
+	this.graphics.paint();
+	this.oldPoint = null;
+};
+draw2d.Connection.prototype.getPoints = function() {
+	var _58ce = new draw2d.ArrayList();
+	var line = null;
+	for ( var i = 0; i < this.lineSegments.getSize(); i++) {
+		line = this.lineSegments.get(i);
+		_58ce.add(line.start);
+	}
+	if (line !== null) {
+		_58ce.add(line.end);
+	}
+	return _58ce;
+};
+draw2d.Connection.prototype.addPoint = function(p) {
+	p = new draw2d.Point(parseInt(p.x), parseInt(p.y));
+	if (this.oldPoint !== null) {
+		this.graphics.drawLine(this.oldPoint.x, this.oldPoint.y, p.x, p.y);
+		var line = {};
+		line.start = this.oldPoint;
+		line.end = p;
+		this.lineSegments.add(line);
+	}
+	this.oldPoint = {};
+	this.oldPoint.x = p.x;
+	this.oldPoint.y = p.y;
+};
+draw2d.Connection.prototype.refreshSourcePort = function() {
+	var model = this.getModel().getSourceModel();
+	var _58d4 = this.getModel().getSourcePortName();
+	var _58d5 = this.getWorkflow().getDocument().getFigures();
+	var count = _58d5.getSize();
+	for ( var i = 0; i < count; i++) {
+		var _58d8 = _58d5.get(i);
+		if (_58d8.getModel() == model) {
+			var port = _58d8.getOutputPort(_58d4);
+			this.setSource(port);
+		}
+	}
+	this.setRouter(this.getRouter());
+};
+draw2d.Connection.prototype.refreshTargetPort = function() {
+	var model = this.getModel().getTargetModel();
+	var _58db = this.getModel().getTargetPortName();
+	var _58dc = this.getWorkflow().getDocument().getFigures();
+	var count = _58dc.getSize();
+	for ( var i = 0; i < count; i++) {
+		var _58df = _58dc.get(i);
+		if (_58df.getModel() == model) {
+			var port = _58df.getInputPort(_58db);
+			this.setTarget(port);
+		}
+	}
+	this.setRouter(this.getRouter());
+};
+draw2d.Connection.prototype.setSource = function(port) {
+	if (this.sourcePort !== null) {
+		this.sourcePort.detachMoveListener(this);
+	}
+	this.sourcePort = port;
+	if (this.sourcePort === null) {
+		return;
+	}
+	this.sourceAnchor.setOwner(this.sourcePort);
+	this.fireSourcePortRouteEvent();
+	this.sourcePort.attachMoveListener(this);
+	this.setStartPoint(port.getAbsoluteX(), port.getAbsoluteY());
+};
+draw2d.Connection.prototype.getSource = function() {
+	return this.sourcePort;
+};
+draw2d.Connection.prototype.setTarget = function(port) {
+	if (this.targetPort !== null) {
+		this.targetPort.detachMoveListener(this);
+	}
+	this.targetPort = port;
+	if (this.targetPort === null) {
+		return;
+	}
+	this.targetAnchor.setOwner(this.targetPort);
+	this.fireTargetPortRouteEvent();
+	this.targetPort.attachMoveListener(this);
+	this.setEndPoint(port.getAbsoluteX(), port.getAbsoluteY());
+};
+draw2d.Connection.prototype.getTarget = function() {
+	return this.targetPort;
+};
+draw2d.Connection.prototype.onOtherFigureMoved = function(_58e3) {
+	if (_58e3 == this.sourcePort) {
+		this.setStartPoint(this.sourcePort.getAbsoluteX(), this.sourcePort
+				.getAbsoluteY());
+	} else {
+		this.setEndPoint(this.targetPort.getAbsoluteX(), this.targetPort
+				.getAbsoluteY());
+	}
+};
+draw2d.Connection.prototype.containsPoint = function(px, py) {
+	for ( var i = 0; i < this.lineSegments.getSize(); i++) {
+		var line = this.lineSegments.get(i);
+		if (draw2d.Line.hit(this.corona, line.start.x, line.start.y,
+				line.end.x, line.end.y, px, py)) {
+			return true;
+		}
+	}
+	return false;
+};
+draw2d.Connection.prototype.getStartAngle = function() {
+	var p1 = this.lineSegments.get(0).start;
+	var p2 = this.lineSegments.get(0).end;
+	if (this.router instanceof draw2d.BezierConnectionRouter) {
+		p2 = this.lineSegments.get(5).end;
+	}
+	var _58ea = Math.sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y)
+			* (p1.y - p2.y));
+	var angle = -(180 / Math.PI) * Math.asin((p1.y - p2.y) / _58ea);
+	if (angle < 0) {
+		if (p2.x < p1.x) {
+			angle = Math.abs(angle) + 180;
+		} else {
+			angle = 360 - Math.abs(angle);
+		}
+	} else {
+		if (p2.x < p1.x) {
+			angle = 180 - angle;
+		}
+	}
+	return angle;
+};
+draw2d.Connection.prototype.getEndAngle = function() {
+	if (this.lineSegments.getSize() === 0) {
+		return 90;
+	}
+	var p1 = this.lineSegments.get(this.lineSegments.getSize() - 1).end;
+	var p2 = this.lineSegments.get(this.lineSegments.getSize() - 1).start;
+	if (this.router instanceof draw2d.BezierConnectionRouter) {
+		p2 = this.lineSegments.get(this.lineSegments.getSize() - 5).end;
+	}
+	var _58ee = Math.sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y)
+			* (p1.y - p2.y));
+	var angle = -(180 / Math.PI) * Math.asin((p1.y - p2.y) / _58ee);
+	if (angle < 0) {
+		if (p2.x < p1.x) {
+			angle = Math.abs(angle) + 180;
+		} else {
+			angle = 360 - Math.abs(angle);
+		}
+	} else {
+		if (p2.x < p1.x) {
+			angle = 180 - angle;
+		}
+	}
+	return angle;
+};
+draw2d.Connection.prototype.fireSourcePortRouteEvent = function() {
+	var _58f0 = this.sourcePort.getConnections();
+	for ( var i = 0; i < _58f0.getSize(); i++) {
+		_58f0.get(i).paint();
+	}
+};
+draw2d.Connection.prototype.fireTargetPortRouteEvent = function() {
+	var _58f2 = this.targetPort.getConnections();
+	for ( var i = 0; i < _58f2.getSize(); i++) {
+		_58f2.get(i).paint();
+	}
+};
+draw2d.Connection.prototype.createCommand = function(_58f4) {
+	if (_58f4.getPolicy() == draw2d.EditPolicy.MOVE) {
+		return new draw2d.CommandReconnect(this);
+	}
+	if (_58f4.getPolicy() == draw2d.EditPolicy.DELETE) {
+		if (this.isDeleteable() == true) {
+			return new draw2d.CommandDelete(this);
+		}
+		return null;
+	}
+	return null;
+};
+draw2d.ConnectionAnchor = function(owner) {
+	this.owner = owner;
+};
+draw2d.ConnectionAnchor.prototype.type = "draw2d.ConnectionAnchor";
+draw2d.ConnectionAnchor.prototype.getLocation = function(_5901) {
+	return this.getReferencePoint();
+};
+draw2d.ConnectionAnchor.prototype.getOwner = function() {
+	return this.owner;
+};
+draw2d.ConnectionAnchor.prototype.setOwner = function(owner) {
+	this.owner = owner;
+};
+draw2d.ConnectionAnchor.prototype.getBox = function() {
+	return this.getOwner().getAbsoluteBounds();
+};
+draw2d.ConnectionAnchor.prototype.getReferencePoint = function() {
+	if (this.getOwner() === null) {
+		return null;
+	} else {
+		return this.getOwner().getAbsolutePosition();
+	}
+};
+draw2d.ChopboxConnectionAnchor = function(owner) {
+	draw2d.ConnectionAnchor.call(this, owner);
+};
+draw2d.ChopboxConnectionAnchor.prototype = new draw2d.ConnectionAnchor();
+draw2d.ChopboxConnectionAnchor.prototype.type = "draw2d.ChopboxConnectionAnchor";
+draw2d.ChopboxConnectionAnchor.prototype.getLocation = function(_5009) {
+	var r = new draw2d.Dimension();
+	r.setBounds(this.getBox());
+	r.translate(-1, -1);
+	r.resize(1, 1);
+	var _500b = r.x + r.w / 2;
+	var _500c = r.y + r.h / 2;
+	if (r.isEmpty() || (_5009.x == _500b && _5009.y == _500c)) {
+		return new Point(_500b, _500c);
+	}
+	var dx = _5009.x - _500b;
+	var dy = _5009.y - _500c;
+	var scale = 0.5 / Math.max(Math.abs(dx) / r.w, Math.abs(dy) / r.h);
+	dx *= scale;
+	dy *= scale;
+	_500b += dx;
+	_500c += dy;
+	return new draw2d.Point(Math.round(_500b), Math.round(_500c));
+};
+draw2d.ChopboxConnectionAnchor.prototype.getBox = function() {
+	return this.getOwner().getParent().getBounds();
+};
+draw2d.ChopboxConnectionAnchor.prototype.getReferencePoint = function() {
+	return this.getBox().getCenter();
+};
+draw2d.ConnectionDecorator = function() {
+	this.color = new draw2d.Color(0, 0, 0);
+	this.backgroundColor = new draw2d.Color(250, 250, 250);
+};
+draw2d.ConnectionDecorator.prototype.type = "draw2d.ConnectionDecorator";
+draw2d.ConnectionDecorator.prototype.paint = function(g) {
+};
+draw2d.ConnectionDecorator.prototype.setColor = function(c) {
+	this.color = c;
+};
+draw2d.ConnectionDecorator.prototype.setBackgroundColor = function(c) {
+	this.backgroundColor = c;
+};
+draw2d.ArrowConnectionDecorator = function(_4b3e, width) {
+	draw2d.ConnectionDecorator.call(this);
+	if (_4b3e === undefined || _4b3e < 1) {
+		this.lenght = 15;
+	}
+	if (width === undefined || width < 1) {
+		this.width = 10;
+	}
+};
+draw2d.ArrowConnectionDecorator.prototype = new draw2d.ConnectionDecorator();
+draw2d.ArrowConnectionDecorator.prototype.type = "draw2d.ArrowConnectionDecorator";
+draw2d.ArrowConnectionDecorator.prototype.paint = function(g) {
+	if (this.backgroundColor !== null) {
+		g.setColor(this.backgroundColor);
+		g.fillPolygon( [ 3, this.lenght, this.lenght, 3 ], [ 0,
+				(this.width / 2), -(this.width / 2), 0 ]);
+	}
+	g.setColor(this.color);
+	g.setStroke(1);
+	g.drawPolygon( [ 3, this.lenght, this.lenght, 3 ], [ 0, (this.width / 2),
+			-(this.width / 2), 0 ]);
+};
+draw2d.ArrowConnectionDecorator.prototype.setDimension = function(l, width) {
+	this.width = w;
+	this.lenght = l;
+};
+draw2d.CompartmentFigure = function() {
+	draw2d.Node.call(this);
+	this.children = new draw2d.ArrayList();
+	this.setBorder(new draw2d.LineBorder(1));
+	this.dropable = new draw2d.DropTarget(this.html);
+	this.dropable.node = this;
+	this.dropable.addEventListener("figureenter", function(_4b0a) {
+		_4b0a.target.node.onFigureEnter(_4b0a.relatedTarget.node);
+	});
+	this.dropable.addEventListener("figureleave", function(_4b0b) {
+		_4b0b.target.node.onFigureLeave(_4b0b.relatedTarget.node);
+	});
+	this.dropable.addEventListener("figuredrop", function(_4b0c) {
+		_4b0c.target.node.onFigureDrop(_4b0c.relatedTarget.node);
+	});
+};
+draw2d.CompartmentFigure.prototype = new draw2d.Node();
+draw2d.CompartmentFigure.prototype.type = "draw2d.CompartmentFigure";
+draw2d.CompartmentFigure.prototype.onFigureEnter = function(_4b0d) {
+};
+draw2d.CompartmentFigure.prototype.onFigureLeave = function(_4b0e) {
+};
+draw2d.CompartmentFigure.prototype.onFigureDrop = function(_4b0f) {
+};
+draw2d.CompartmentFigure.prototype.getChildren = function() {
+	return this.children;
+};
+draw2d.CompartmentFigure.prototype.addChild = function(_4b10) {
+	_4b10.setZOrder(this.getZOrder() + 1);
+	_4b10.setParent(this);
+	this.children.add(_4b10);
+};
+draw2d.CompartmentFigure.prototype.removeChild = function(_4b11) {
+	_4b11.setParent(null);
+	this.children.remove(_4b11);
+};
+draw2d.CompartmentFigure.prototype.setZOrder = function(index) {
+	draw2d.Node.prototype.setZOrder.call(this, index);
+	for ( var i = 0; i < this.children.getSize(); i++) {
+		this.children.get(i).setZOrder(index + 1);
+	}
+};
+draw2d.CompartmentFigure.prototype.setPosition = function(xPos, yPos) {
+	
+	var oldX = this.getX();
+	var oldY = this.getY();
+	draw2d.Node.prototype.setPosition.call(this, xPos, yPos);
+	for ( var i = 0; i < this.children.getSize(); i++) {
+		var child = this.children.get(i);
+		child.setPosition(child.getX() + this.getX() - oldX, child.getY()
+				+ this.getY() - oldY);
+	}
+};
+draw2d.CompartmentFigure.prototype.onDrag = function() {
+	var oldX = this.getX();
+	var oldY = this.getY();
+	draw2d.Node.prototype.onDrag.call(this);
+	for ( var i = 0; i < this.children.getSize(); i++) {
+		var child = this.children.get(i);
+		child.setPosition(child.getX() + this.getX() - oldX, child.getY()
+				+ this.getY() - oldY);
+	}
+};
+draw2d.CanvasDocument = function(_56a8) {
+	this.canvas = _56a8;
+};
+draw2d.CanvasDocument.prototype.type = "draw2d.CanvasDocument";
+draw2d.CanvasDocument.prototype.getFigures = function() {
+	var _56a9 = new draw2d.ArrayList();
+	var _56aa = this.canvas.figures;
+	var _56ab = this.canvas.dialogs;
+	for ( var i = 0; i < _56aa.getSize(); i++) {
+		var _56ad = _56aa.get(i);
+		if (_56ab.indexOf(_56ad) == -1 && _56ad.getParent() === null
+				&& !(_56ad instanceof draw2d.WindowFigure)) {
+			_56a9.add(_56ad);
+		}
+	}
+	return _56a9;
+};
+draw2d.CanvasDocument.prototype.getFigure = function(id) {
+	return this.canvas.getFigure(id);
+};
+draw2d.CanvasDocument.prototype.getLines = function() {
+	return this.canvas.getLines();
+};
+draw2d.CanvasDocument.prototype.getLine = function(id) {
+	return this.canvas.getLine(id);
+};
+draw2d.Annotation = function(msg) {
+	this.msg = msg;
+	this.alpha = 1;
+	this.color = new draw2d.Color(0, 0, 0);
+	this.bgColor = new draw2d.Color(241, 241, 121);
+	this.fontSize = 10;
+	this.textNode = null;
+	draw2d.Figure.call(this);
+};
+draw2d.Annotation.prototype = new draw2d.Figure();
+draw2d.Annotation.prototype.type = "draw2d.Annotation";
+draw2d.Annotation.prototype.createHTMLElement = function() {
+	var item = draw2d.Figure.prototype.createHTMLElement.call(this);
+	item.style.color = this.color.getHTMLStyle();
+	item.style.backgroundColor = this.bgColor.getHTMLStyle();
+	item.style.fontSize = this.fontSize + "pt";
+	item.style.width = "auto";
+	item.style.height = "auto";
+	item.style.margin = "0px";
+	item.style.padding = "0px";
+	item.onselectstart = function() {
+		return false;
+	};
+	item.unselectable = "on";
+	item.style.cursor = "default";
+	this.textNode = document.createTextNode(this.msg);
+	item.appendChild(this.textNode);
+	this.disableTextSelection(item);
+	return item;
+};
+draw2d.Annotation.prototype.onDoubleClick = function() {
+	var _57d0 = new draw2d.AnnotationDialog(this);
+	this.workflow.showDialog(_57d0);
+};
+draw2d.Annotation.prototype.setBackgroundColor = function(color) {
+	this.bgColor = color;
+	if (this.bgColor !== null) {
+		this.html.style.backgroundColor = this.bgColor.getHTMLStyle();
+	} else {
+		this.html.style.backgroundColor = "transparent";
+	}
+};
+draw2d.Annotation.prototype.getBackgroundColor = function() {
+	return this.bgColor;
+};
+draw2d.Annotation.prototype.setFontSize = function(size) {
+	this.fontSize = size;
+	this.html.style.fontSize = this.fontSize + "pt";
+};
+draw2d.Annotation.prototype.getText = function() {
+	return this.msg;
+};
+draw2d.Annotation.prototype.setText = function(text) {
+	this.msg = text;
+	this.html.removeChild(this.textNode);
+	this.textNode = document.createTextNode(this.msg);
+	this.html.appendChild(this.textNode);
+};
+draw2d.Annotation.prototype.setStyledText = function(text) {
+	this.msg = text;
+	this.html.removeChild(this.textNode);
+	this.textNode = document.createElement("div");
+	this.textNode.innerHTML = text;
+	this.html.appendChild(this.textNode);
+};
+draw2d.ResizeHandle = function(_57e4, type) {
+	draw2d.Rectangle.call(this, 5, 5);
+	this.type = type;
+	var _57e6 = this.getWidth();
+	var _57e7 = _57e6 / 2;
+	switch (this.type) {
+	case 1:
+		this.setSnapToGridAnchor(new draw2d.Point(_57e6, _57e6));
+		break;
+	case 2:
+		this.setSnapToGridAnchor(new draw2d.Point(_57e7, _57e6));
+		break;
+	case 3:
+		this.setSnapToGridAnchor(new draw2d.Point(0, _57e6));
+		break;
+	case 4:
+		this.setSnapToGridAnchor(new draw2d.Point(0, _57e7));
+		break;
+	case 5:
+		this.setSnapToGridAnchor(new draw2d.Point(0, 0));
+		break;
+	case 6:
+		this.setSnapToGridAnchor(new draw2d.Point(_57e7, 0));
+		break;
+	case 7:
+		this.setSnapToGridAnchor(new draw2d.Point(_57e6, 0));
+		break;
+	case 8:
+		this.setSnapToGridAnchor(new draw2d.Point(_57e6, _57e7));
+	case 9:
+		this.setSnapToGridAnchor(new draw2d.Point(_57e7, _57e7));
+		break;
+	}
+	this.setBackgroundColor(new draw2d.Color(0, 255, 0));
+	this.setWorkflow(_57e4);
+	this.setZOrder(10000);
+};
+draw2d.ResizeHandle.prototype = new draw2d.Rectangle();
+draw2d.ResizeHandle.prototype.type = "draw2d.ResizeHandle";
+draw2d.ResizeHandle.prototype.getSnapToDirection = function() {
+	switch (this.type) {
+	case 1:
+		return draw2d.SnapToHelper.NORTH_WEST;
+	case 2:
+		return draw2d.SnapToHelper.NORTH;
+	case 3:
+		return draw2d.SnapToHelper.NORTH_EAST;
+	case 4:
+		return draw2d.SnapToHelper.EAST;
+	case 5:
+		return draw2d.SnapToHelper.SOUTH_EAST;
+	case 6:
+		return draw2d.SnapToHelper.SOUTH;
+	case 7:
+		return draw2d.SnapToHelper.SOUTH_WEST;
+	case 8:
+		return draw2d.SnapToHelper.WEST;
+	case 9:
+		return draw2d.SnapToHelper.CENTER;
+	}
+};
+draw2d.ResizeHandle.prototype.onDragend = function() {
+	var _57e8 = this.workflow.currentSelection;
+	if (this.commandMove !== null) {
+		this.commandMove.setPosition(_57e8.getX(), _57e8.getY());
+		this.workflow.getCommandStack().execute(this.commandMove);
+		this.commandMove = null;
+	}
+	if (this.commandResize !== null) {
+		this.commandResize.setDimension(_57e8.getWidth(), _57e8.getHeight());
+		this.workflow.getCommandStack().execute(this.commandResize);
+		this.commandResize = null;
+	}
+	this.workflow.hideSnapToHelperLines();
+};
+draw2d.ResizeHandle.prototype.setPosition = function(xPos, yPos) {
+	this.x = xPos;
+	this.y = yPos;
+	if (this.html === null) {
+		return;
+	}
+	this.html.style.left = this.x + "px";
+	this.html.style.top = this.y + "px";
+};
+draw2d.ResizeHandle.prototype.onDragstart = function(x, y) {
+	if (!this.canDrag) {
+		return false;
+	}
+	var _57ed = this.workflow.currentSelection;
+	this.commandMove = _57ed.createCommand(new draw2d.EditPolicy(
+			draw2d.EditPolicy.MOVE));
+	this.commandResize = _57ed.createCommand(new draw2d.EditPolicy(
+			draw2d.EditPolicy.RESIZE));
+	return true;
+};
+draw2d.ResizeHandle.prototype.onDrag = function() {
+	var oldX = this.getX();
+	var oldY = this.getY();
+	draw2d.Rectangle.prototype.onDrag.call(this);
+	var diffX = oldX - this.getX();
+	var diffY = oldY - this.getY();
+	var _57f2 = this.workflow.currentSelection.getX();
+	var _57f3 = this.workflow.currentSelection.getY();
+	var _57f4 = this.workflow.currentSelection.getWidth();
+	var _57f5 = this.workflow.currentSelection.getHeight();
+	switch (this.type) {
+	case 1:
+		this.workflow.currentSelection
+				.setPosition(_57f2 - diffX, _57f3 - diffY);
+		this.workflow.currentSelection.setDimension(_57f4 + diffX, _57f5
+				+ diffY);
+		break;
+	case 2:
+		this.workflow.currentSelection.setPosition(_57f2, _57f3 - diffY);
+		this.workflow.currentSelection.setDimension(_57f4, _57f5 + diffY);
+		break;
+	case 3:
+		this.workflow.currentSelection.setPosition(_57f2, _57f3 - diffY);
+		this.workflow.currentSelection.setDimension(_57f4 - diffX, _57f5
+				+ diffY);
+		break;
+	case 4:
+		this.workflow.currentSelection.setPosition(_57f2, _57f3);
+		this.workflow.currentSelection.setDimension(_57f4 - diffX, _57f5);
+		break;
+	case 5:
+		this.workflow.currentSelection.setPosition(_57f2, _57f3);
+		this.workflow.currentSelection.setDimension(_57f4 - diffX, _57f5
+				- diffY);
+		break;
+	case 6:
+		this.workflow.currentSelection.setPosition(_57f2, _57f3);
+		this.workflow.currentSelection.setDimension(_57f4, _57f5 - diffY);
+		break;
+	case 7:
+		this.workflow.currentSelection.setPosition(_57f2 - diffX, _57f3);
+		this.workflow.currentSelection.setDimension(_57f4 + diffX, _57f5
+				- diffY);
+		break;
+	case 8:
+		this.workflow.currentSelection.setPosition(_57f2 - diffX, _57f3);
+		this.workflow.currentSelection.setDimension(_57f4 + diffX, _57f5);
+		break;
+	}
+	this.workflow.moveResizeHandles(this.workflow.getCurrentSelection());
+};
+draw2d.ResizeHandle.prototype.setCanDrag = function(flag) {
+	draw2d.Rectangle.prototype.setCanDrag.call(this, flag);
+	if (this.html === null) {
+		return;
+	}
+	if (!flag) {
+		this.html.style.cursor = "";
+		return;
+	}
+	switch (this.type) {
+	case 1:
+		this.html.style.cursor = "nw-resize";
+		break;
+	case 2:
+		this.html.style.cursor = "s-resize";
+		break;
+	case 3:
+		this.html.style.cursor = "ne-resize";
+		break;
+	case 4:
+		this.html.style.cursor = "w-resize";
+		break;
+	case 5:
+		this.html.style.cursor = "se-resize";
+		break;
+	case 6:
+		this.html.style.cursor = "n-resize";
+		break;
+	case 7:
+		this.html.style.cursor = "sw-resize";
+		break;
+	case 8:
+		this.html.style.cursor = "e-resize";
+		break;
+	case 9:
+		this.html.style.cursor = "resize";
+		break;
+	}
+};
+draw2d.ResizeHandle.prototype.onKeyDown = function(_57f7, ctrl) {
+	this.workflow.onKeyDown(_57f7, ctrl);
+};
+draw2d.ResizeHandle.prototype.fireMoveEvent = function() {
+};
+draw2d.LineStartResizeHandle = function(_5b1e) {
+	draw2d.ResizeHandle.call(this, _5b1e, 9);
+	this.setDimension(10, 10);
+	this.setBackgroundColor(new draw2d.Color(100, 255, 0));
+	this.setZOrder(10000);
+};
+draw2d.LineStartResizeHandle.prototype = new draw2d.ResizeHandle();
+draw2d.LineStartResizeHandle.prototype.type = "draw2d.LineStartResizeHandle";
+draw2d.LineStartResizeHandle.prototype.onDragend = function() {
+	if (this.workflow.currentSelection instanceof draw2d.Connection) {
+		if (this.command !== null) {
+			this.command.cancel();
+		}
+	} else {
+		if (this.command !== null) {
+			this.getWorkflow().getCommandStack().execute(this.command);
+		}
+	}
+	this.command = null;
+};
+draw2d.LineStartResizeHandle.prototype.onDragstart = function(x, y) {
+	if (!this.canDrag) {
+		return false;
+	}
+	this.command = this.workflow.currentSelection
+			.createCommand(new draw2d.EditPolicy(draw2d.EditPolicy.MOVE));
+	return this.command !== null;
+};
+draw2d.LineStartResizeHandle.prototype.onDrag = function() {
+	var oldX = this.getX();
+	var oldY = this.getY();
+	draw2d.Rectangle.prototype.onDrag.call(this);
+	var diffX = oldX - this.getX();
+	var diffY = oldY - this.getY();
+	var _5b25 = this.workflow.currentSelection.getStartPoint();
+	var line = this.workflow.currentSelection;
+	line.setStartPoint(_5b25.x - diffX, _5b25.y - diffY);
+	line.isMoving = true;
+};
+draw2d.LineStartResizeHandle.prototype.onDrop = function(_5b27) {
+	var line = this.workflow.currentSelection;
+	line.isMoving = false;
+	if (line instanceof draw2d.Connection) {
+		this.command.setNewPorts(_5b27, line.getTarget());
+		this.getWorkflow().getCommandStack().execute(this.command);
+	}
+	this.command = null;
+};
+draw2d.LineEndResizeHandle = function(_58f5) {
+	draw2d.ResizeHandle.call(this, _58f5, 9);
+	this.setDimension(10, 10);
+	this.setBackgroundColor(new draw2d.Color(0, 255, 0));
+	this.setZOrder(10000);
+};
+draw2d.LineEndResizeHandle.prototype = new draw2d.ResizeHandle();
+draw2d.LineEndResizeHandle.prototype.type = "draw2d.LineEndResizeHandle";
+draw2d.LineEndResizeHandle.prototype.onDragend = function() {
+	if (this.workflow.currentSelection instanceof draw2d.Connection) {
+		if (this.command !== null) {
+			this.command.cancel();
+		}
+	} else {
+		if (this.command !== null) {
+			this.workflow.getCommandStack().execute(this.command);
+		}
+	}
+	this.command = null;
+};
+draw2d.LineEndResizeHandle.prototype.onDragstart = function(x, y) {
+	if (!this.canDrag) {
+		return false;
+	}
+	this.command = this.workflow.currentSelection
+			.createCommand(new draw2d.EditPolicy(draw2d.EditPolicy.MOVE));
+	return this.command !== null;
+};
+draw2d.LineEndResizeHandle.prototype.onDrag = function() {
+	var oldX = this.getX();
+	var oldY = this.getY();
+	draw2d.Rectangle.prototype.onDrag.call(this);
+	var diffX = oldX - this.getX();
+	var diffY = oldY - this.getY();
+	var _58fc = this.workflow.currentSelection.getEndPoint();
+	var line = this.workflow.currentSelection;
+	line.setEndPoint(_58fc.x - diffX, _58fc.y - diffY);
+	line.isMoving = true;
+};
+draw2d.LineEndResizeHandle.prototype.onDrop = function(_58fe) {
+	var line = this.workflow.currentSelection;
+	line.isMoving = false;
+	if (line instanceof draw2d.Connection) {
+		this.command.setNewPorts(line.getSource(), _58fe);
+		this.getWorkflow().getCommandStack().execute(this.command);
+	}
+	this.command = null;
+};
+draw2d.Canvas = function(_5020) {
+	try {
+		if (_5020) {
+			this.construct(_5020);
+		}
+		this.enableSmoothFigureHandling = false;
+		this.canvasLines = new draw2d.ArrayList();
+	} catch (e) {
+		pushErrorStack(e, "draw2d.Canvas=function(/*:String*/id)");
+	}
+};
+draw2d.Canvas.IMAGE_BASE_URL = "";
+draw2d.Canvas.prototype.type = "draw2d.Canvas";
+draw2d.Canvas.prototype.construct = function(_5021) {
+	this.canvasId = _5021;
+	this.html = document.getElementById(this.canvasId);
+	this.scrollArea = document.body.parentNode;
+};
+draw2d.Canvas.prototype.setViewPort = function(divId) {
+	this.scrollArea = document.getElementById(divId);
+};
+draw2d.Canvas.prototype.addFigure = function(_5023, xPos, yPos, _5026) {
+	try {
+		if (this.enableSmoothFigureHandling === true) {
+			if (_5023.timer <= 0) {
+				_5023.setAlpha(0.001);
+			}
+			var _5027 = _5023;
+			var _5028 = function() {
+				if (_5027.alpha < 1) {
+					_5027.setAlpha(Math.min(1, _5027.alpha + 0.05));
+				} else {
+					window.clearInterval(_5027.timer);
+					_5027.timer = -1;
+				}
+			};
+			if (_5027.timer > 0) {
+				window.clearInterval(_5027.timer);
+			}
+			_5027.timer = window.setInterval(_5028, 30);
+		}
+		_5023.setCanvas(this);
+		if (xPos && yPos) {
+			_5023.setPosition(xPos, yPos);
+		}
+		if (_5023 instanceof draw2d.Line) {
+			this.canvasLines.add(_5023);
+			this.html.appendChild(_5023.getHTMLElement());
+		} else {
+			var obj = this.canvasLines.getFirstElement();
+			if (obj === null) {
+				this.html.appendChild(_5023.getHTMLElement());
+			} else {
+				this.html.insertBefore(_5023.getHTMLElement(), obj
+						.getHTMLElement());
+			}
+		}
+		if (!_5026) {
+			_5023.paint();
+		}
+	} catch (e) {
+		pushErrorStack(
+				e,
+				"draw2d.Canvas.prototype.addFigure= function( /*:draw2d.Figure*/figure,/*:int*/ xPos,/*:int*/ yPos, /*:boolean*/ avoidPaint)");
+	}
+};
+draw2d.Canvas.prototype.removeFigure = function(_502a) {
+	if (this.enableSmoothFigureHandling === true) {
+		var oThis = this;
+		var _502c = _502a;
+		var _502d = function() {
+			if (_502c.alpha > 0) {
+				_502c.setAlpha(Math.max(0, _502c.alpha - 0.05));
+			} else {
+				window.clearInterval(_502c.timer);
+				_502c.timer = -1;
+				oThis.html.removeChild(_502c.html);
+				_502c.setCanvas(null);
+			}
+		};
+		if (_502c.timer > 0) {
+			window.clearInterval(_502c.timer);
+		}
+		_502c.timer = window.setInterval(_502d, 20);
+	} else {
+		this.html.removeChild(_502a.html);
+		_502a.setCanvas(null);
+	}
+	if (_502a instanceof draw2d.Line) {
+		this.canvasLines.remove(_502a);
+	}
+};
+draw2d.Canvas.prototype.getEnableSmoothFigureHandling = function() {
+	return this.enableSmoothFigureHandling;
+};
+draw2d.Canvas.prototype.setEnableSmoothFigureHandling = function(flag) {
+	this.enableSmoothFigureHandling = flag;
+};
+draw2d.Canvas.prototype.getWidth = function() {
+	return parseInt(this.html.style.width);
+};
+draw2d.Canvas.prototype.setWidth = function(width) {
+	if (this.scrollArea !== null) {
+		this.scrollArea.style.width = width + "px";
+	} else {
+		this.html.style.width = width + "px";
+	}
+};
+draw2d.Canvas.prototype.getHeight = function() {
+	return parseInt(this.html.style.height);
+};
+draw2d.Canvas.prototype.setHeight = function(_5030) {
+	if (this.scrollArea !== null) {
+		this.scrollArea.style.height = _5030 + "px";
+	} else {
+		this.html.style.height = _5030 + "px";
+	}
+};
+draw2d.Canvas.prototype.setBackgroundImage = function(_5031, _5032) {
+	if (_5031 !== null) {
+		if (_5032) {
+			this.html.style.background = "transparent url(" + _5031 + ") ";
+		} else {
+			this.html.style.background = "transparent url(" + _5031
+					+ ") no-repeat";
+		}
+	} else {
+		this.html.style.background = "transparent";
+	}
+};
+draw2d.Canvas.prototype.getY = function() {
+	return this.y;
+};
+draw2d.Canvas.prototype.getX = function() {
+	return this.x;
+};
+draw2d.Canvas.prototype.getAbsoluteY = function() {
+	var el = this.html;
+	var ot = el.offsetTop;
+	while ((el = el.offsetParent) !== null) {
+		ot += el.offsetTop;
+	}
+	return ot;
+};
+draw2d.Canvas.prototype.getAbsoluteX = function() {
+	var el = this.html;
+	var ol = el.offsetLeft;
+	while ((el = el.offsetParent) !== null) {
+		ol += el.offsetLeft;
+	}
+	return ol;
+};
+draw2d.Canvas.prototype.getScrollLeft = function() {
+	return this.scrollArea.scrollLeft;
+};
+draw2d.Canvas.prototype.getScrollTop = function() {
+	return this.scrollArea.scrollTop;
+};
+draw2d.Workflow = function(id) {
+	try {
+		if (!id) {
+			return;
+		}
+		this.menu = null;
+		this.gridWidthX = 10;
+		this.gridWidthY = 10;
+		this.snapToGridHelper = null;
+		this.verticalSnapToHelperLine = null;
+		this.horizontalSnapToHelperLine = null;
+		this.snapToGeometryHelper = null;
+		this.figures = new draw2d.ArrayList();
+		this.lines = new draw2d.ArrayList();
+		this.commonPorts = new draw2d.ArrayList();
+		this.dropTargets = new draw2d.ArrayList();
+		this.compartments = new draw2d.ArrayList();
+		this.selectionListeners = new draw2d.ArrayList();
+		this.dialogs = new draw2d.ArrayList();
+		this.toolPalette = null;
+		this.dragging = false;
+		this.tooltip = null;
+		this.draggingLine = null;
+		this.draggingLineCommand = null;
+		this.commandStack = new draw2d.CommandStack();
+		this.oldScrollPosLeft = 0;
+		this.oldScrollPosTop = 0;
+		this.currentSelection = null;
+		this.currentMenu = null;
+		this.connectionLine = new draw2d.Line();
+		this.resizeHandleStart = new draw2d.LineStartResizeHandle(this);
+		this.resizeHandleEnd = new draw2d.LineEndResizeHandle(this);
+		this.resizeHandle1 = new draw2d.ResizeHandle(this, 1);
+		this.resizeHandle2 = new draw2d.ResizeHandle(this, 2);
+		this.resizeHandle3 = new draw2d.ResizeHandle(this, 3);
+		this.resizeHandle4 = new draw2d.ResizeHandle(this, 4);
+		this.resizeHandle5 = new draw2d.ResizeHandle(this, 5);
+		this.resizeHandle6 = new draw2d.ResizeHandle(this, 6);
+		this.resizeHandle7 = new draw2d.ResizeHandle(this, 7);
+		this.resizeHandle8 = new draw2d.ResizeHandle(this, 8);
+		this.resizeHandleHalfWidth = parseInt(this.resizeHandle2.getWidth() / 2);
+		draw2d.Canvas.call(this, id);
+		this.setPanning(false);
+		if (this.html !== null) {
+			this.html.style.backgroundImage = "url(paint.png)";
+			this.html.className = "Workflow";
+			oThis = this;
+			this.html.tabIndex = "0";
+			var _4a24 = function() {
+				var _4a25 = arguments[0] || window.event;
+				_4a25.cancelBubble = true;
+				_4a25.returnValue = false;
+				_4a25.stopped = true;
+				var diffX = _4a25.clientX;
+				var diffY = _4a25.clientY;
+				var _4a28 = oThis.getScrollLeft();
+				var _4a29 = oThis.getScrollTop();
+				var _4a2a = oThis.getAbsoluteX();
+				var _4a2b = oThis.getAbsoluteY();
+				var line = oThis.getBestLine(diffX + _4a28 - _4a2a, diffY
+						+ _4a29 - _4a2b, null);
+				if (line !== null) {
+					line.onContextMenu(diffX + _4a28 - _4a2a, diffY + _4a29
+							- _4a2b);
+				} else {
+					oThis.onContextMenu(diffX + _4a28 - _4a2a, diffY + _4a29
+							- _4a2b);
+				}
+			};
+			this.html.oncontextmenu = function() {
+				return false;
+			};
+			var oThis = this;
+			var _4a2e = function(event) {
+				var ctrl = event.ctrlKey;
+				oThis.onKeyDown(event.keyCode, ctrl);
+			};
+			var _4a31 = function() {
+				var _4a32 = arguments[0] || window.event;
+				if (_4a32.returnValue == false) {
+					return;
+				}
+				var diffX = _4a32.clientX;
+				var diffY = _4a32.clientY;
+				var _4a35 = oThis.getScrollLeft();
+				var _4a36 = oThis.getScrollTop();
+				var _4a37 = oThis.getAbsoluteX();
+				var _4a38 = oThis.getAbsoluteY();
+				oThis.onMouseDown(diffX + _4a35 - _4a37, diffY + _4a36 - _4a38);
+			};
+			var _4a39 = function() {
+				var _4a3a = arguments[0] || window.event;
+				if (oThis.currentMenu !== null) {
+					oThis.removeFigure(oThis.currentMenu);
+					oThis.currentMenu = null;
+				}
+				if (_4a3a.button == 2) {
+					return;
+				}
+				var diffX = _4a3a.clientX;
+				var diffY = _4a3a.clientY;
+				var _4a3d = oThis.getScrollLeft();
+				var _4a3e = oThis.getScrollTop();
+				var _4a3f = oThis.getAbsoluteX();
+				var _4a40 = oThis.getAbsoluteY();
+				oThis.onMouseUp(diffX + _4a3d - _4a3f, diffY + _4a3e - _4a40);
+			};
+			var _4a41 = function() {
+				var _4a42 = arguments[0] || window.event;
+				var diffX = _4a42.clientX;
+				var diffY = _4a42.clientY;
+				var _4a45 = oThis.getScrollLeft();
+				var _4a46 = oThis.getScrollTop();
+				var _4a47 = oThis.getAbsoluteX();
+				var _4a48 = oThis.getAbsoluteY();
+				oThis.currentMouseX = diffX + _4a45 - _4a47;
+				oThis.currentMouseY = diffY + _4a46 - _4a48;
+				var obj = oThis.getBestFigure(oThis.currentMouseX,
+						oThis.currentMouseY);
+				if (draw2d.Drag.currentHover !== null && obj === null) {
+					var _4a4a = new draw2d.DragDropEvent();
+					_4a4a.initDragDropEvent("mouseleave", false, oThis);
+					draw2d.Drag.currentHover.dispatchEvent(_4a4a);
+				} else {
+					var diffX = _4a42.clientX;
+					var diffY = _4a42.clientY;
+					var _4a45 = oThis.getScrollLeft();
+					var _4a46 = oThis.getScrollTop();
+					var _4a47 = oThis.getAbsoluteX();
+					var _4a48 = oThis.getAbsoluteY();
+					oThis.onMouseMove(diffX + _4a45 - _4a47, diffY + _4a46
+							- _4a48);
+				}
+				if (obj === null) {
+					draw2d.Drag.currentHover = null;
+				}
+				if (oThis.tooltip !== null) {
+					if (Math.abs(oThis.currentTooltipX - oThis.currentMouseX) > 10
+							|| Math.abs(oThis.currentTooltipY
+									- oThis.currentMouseY) > 10) {
+						oThis.showTooltip(null);
+					}
+				}
+			};
+			var _4a4b = function(_4a4c) {
+				var _4a4c = arguments[0] || window.event;
+				var diffX = _4a4c.clientX;
+				var diffY = _4a4c.clientY;
+				var _4a4f = oThis.getScrollLeft();
+				var _4a50 = oThis.getScrollTop();
+				var _4a51 = oThis.getAbsoluteX();
+				var _4a52 = oThis.getAbsoluteY();
+				var line = oThis.getBestLine(diffX + _4a4f - _4a51, diffY
+						+ _4a50 - _4a52, null);
+				if (line !== null) {
+					line.onDoubleClick();
+				}
+			};
+			if (this.html.addEventListener) {
+				this.html.addEventListener("contextmenu", _4a24, false);
+				this.html.addEventListener("mousemove", _4a41, false);
+				this.html.addEventListener("mouseup", _4a39, false);
+				this.html.addEventListener("mousedown", _4a31, false);
+				this.html.addEventListener("keydown", _4a2e, false);
+				this.html.addEventListener("dblclick", _4a4b, false);
+			} else {
+				if (this.html.attachEvent) {
+					this.html.attachEvent("oncontextmenu", _4a24);
+					this.html.attachEvent("onmousemove", _4a41);
+					this.html.attachEvent("onmousedown", _4a31);
+					this.html.attachEvent("onmouseup", _4a39);
+					this.html.attachEvent("onkeydown", _4a2e);
+					this.html.attachEvent("ondblclick", _4a4b);
+				} else {
+					throw "Open-jACOB Draw2D not supported in this browser.";
+				}
+			}
+		}
+	} catch (e) {
+		pushErrorStack(e, "draw2d.Workflow=function(/*:String*/id)");
+	}
+};
+draw2d.Workflow.prototype = new draw2d.Canvas();
+draw2d.Workflow.prototype.type = "draw2d.Workflow";
+draw2d.Workflow.COLOR_GREEN = new draw2d.Color(0, 255, 0);
+draw2d.Workflow.prototype.clear = function() {
+	this.scrollTo(0, 0, true);
+	this.gridWidthX = 10;
+	this.gridWidthY = 10;
+	this.snapToGridHelper = null;
+	this.verticalSnapToHelperLine = null;
+	this.horizontalSnapToHelperLine = null;
+	var _4a54 = this.getDocument();
+	var _4a55 = _4a54.getLines().clone();
+	for ( var i = 0; i < _4a55.getSize(); i++) {
+		(new draw2d.CommandDelete(_4a55.get(i))).execute();
+	}
+	var _4a57 = _4a54.getFigures().clone();
+	for ( var i = 0; i < _4a57.getSize(); i++) {
+		(new draw2d.CommandDelete(_4a57.get(i))).execute();
+	}
+	this.commonPorts.removeAllElements();
+	this.dropTargets.removeAllElements();
+	this.compartments.removeAllElements();
+	this.selectionListeners.removeAllElements();
+	this.dialogs.removeAllElements();
+	this.commandStack = new draw2d.CommandStack();
+	this.currentSelection = null;
+	this.currentMenu = null;
+	draw2d.Drag.clearCurrent();
+};
+draw2d.Workflow.prototype.onScroll = function() {
+	var _4a58 = this.getScrollLeft();
+	var _4a59 = this.getScrollTop();
+	var _4a5a = _4a58 - this.oldScrollPosLeft;
+	var _4a5b = _4a59 - this.oldScrollPosTop;
+	for ( var i = 0; i < this.figures.getSize(); i++) {
+		var _4a5d = this.figures.get(i);
+		if (_4a5d.hasFixedPosition && _4a5d.hasFixedPosition() == true) {
+			_4a5d.setPosition(_4a5d.getX() + _4a5a, _4a5d.getY() + _4a5b);
+		}
+	}
+	this.oldScrollPosLeft = _4a58;
+	this.oldScrollPosTop = _4a59;
+};
+draw2d.Workflow.prototype.setPanning = function(flag) {
+	this.panning = flag;
+	if (flag) {
+		this.html.style.cursor = "move";
+	} else {
+		this.html.style.cursor = "default";
+	}
+};
+draw2d.Workflow.prototype.scrollTo = function(x, y, fast) {
+	if (fast) {
+		this.scrollArea.scrollLeft = x;
+		this.scrollArea.scrollTop = y;
+	} else {
+		var steps = 40;
+		var xStep = (x - this.getScrollLeft()) / steps;
+		var yStep = (y - this.getScrollTop()) / steps;
+		var oldX = this.getScrollLeft();
+		var oldY = this.getScrollTop();
+		for ( var i = 0; i < steps; i++) {
+			this.scrollArea.scrollLeft = oldX + (xStep * i);
+			this.scrollArea.scrollTop = oldY + (yStep * i);
+		}
+	}
+};
+draw2d.Workflow.prototype.showTooltip = function(_4a68, _4a69) {
+	if (this.tooltip !== null) {
+		this.removeFigure(this.tooltip);
+		this.tooltip = null;
+		if (this.tooltipTimer >= 0) {
+			window.clearTimeout(this.tooltipTimer);
+			this.tooltipTimer = -1;
+		}
+	}
+	this.tooltip = _4a68;
+	if (this.tooltip !== null) {
+		this.currentTooltipX = this.currentMouseX;
+		this.currentTooltipY = this.currentMouseY;
+		this.addFigure(this.tooltip, this.currentTooltipX + 10,
+				this.currentTooltipY + 10);
+		var oThis = this;
+		var _4a6b = function() {
+			oThis.tooltipTimer = -1;
+			oThis.showTooltip(null);
+		};
+		if (_4a69 == true) {
+			this.tooltipTimer = window.setTimeout(_4a6b, 5000);
+		}
+	}
+};
+draw2d.Workflow.prototype.showDialog = function(_4a6c, xPos, yPos) {
+	if (xPos) {
+		this.addFigure(_4a6c, xPos, yPos);
+	} else {
+		this.addFigure(_4a6c, 200, 100);
+	}
+	this.dialogs.add(_4a6c);
+};
+draw2d.Workflow.prototype.showMenu = function(menu, xPos, yPos) {
+	if (this.menu !== null) {
+		this.html.removeChild(this.menu.getHTMLElement());
+		this.menu.setWorkflow();
+	}
+	this.menu = menu;
+	if (this.menu !== null) {
+		this.menu.setWorkflow(this);
+		this.menu.setPosition(xPos, yPos);
+		this.html.appendChild(this.menu.getHTMLElement());
+		this.menu.paint();
+	}
+};
+draw2d.Workflow.prototype.onContextMenu = function(x, y) {
+	var menu = this.getContextMenu();
+	if (menu !== null) {
+		this.showMenu(menu, x, y);
+	}
+};
+draw2d.Workflow.prototype.getContextMenu = function() {
+	return null;
+};
+draw2d.Workflow.prototype.setToolWindow = function(_4a75, x, y) {
+	this.toolPalette = _4a75;
+	if (y) {
+		this.addFigure(_4a75, x, y);
+	} else {
+		this.addFigure(_4a75, 20, 20);
+	}
+	this.dialogs.add(_4a75);
+};
+draw2d.Workflow.prototype.setSnapToGrid = function(flag) {
+	if (flag) {
+		this.snapToGridHelper = new draw2d.SnapToGrid(this);
+	} else {
+		this.snapToGridHelper = null;
+	}
+};
+draw2d.Workflow.prototype.setSnapToGeometry = function(flag) {
+	if (flag) {
+		this.snapToGeometryHelper = new draw2d.SnapToGeometry(this);
+	} else {
+		this.snapToGeometryHelper = null;
+	}
+};
+draw2d.Workflow.prototype.setGridWidth = function(dx, dy) {
+	this.gridWidthX = dx;
+	this.gridWidthY = dy;
+};
+draw2d.Workflow.prototype.addFigure = function(_4a7c, xPos, yPos) {
+	try {
+		draw2d.Canvas.prototype.addFigure.call(this, _4a7c, xPos, yPos, true);
+		_4a7c.setWorkflow(this);
+		var _4a7f = this;
+		if (_4a7c instanceof draw2d.CompartmentFigure) {
+			this.compartments.add(_4a7c);
+		}
+		if (_4a7c instanceof draw2d.Line) {
+			this.lines.add(_4a7c);
+		} else {
+			this.figures.add(_4a7c);
+			_4a7c.draggable.addEventListener("drag", function(_4a80) {
+				var _4a81 = _4a7f.getFigure(_4a80.target.element.id);
+				if (_4a81 === null) {
+					return;
+				}
+				if (_4a81.isSelectable() == false) {
+					return;
+				}
+				_4a7f.moveResizeHandles(_4a81);
+			});
+		}
+		_4a7c.paint();
+		this.setDocumentDirty();
+	} catch (e) {
+		pushErrorStack(
+				e,
+				"draw2d.Workflow.prototype.addFigure=function(/*:draw2d.Figure*/ figure ,/*:int*/ xPos, /*:int*/ yPos)");
+	}
+};
+draw2d.Workflow.prototype.removeFigure = function(_4a82) {
+	draw2d.Canvas.prototype.removeFigure.call(this, _4a82);
+	this.figures.remove(_4a82);
+	this.lines.remove(_4a82);
+	this.dialogs.remove(_4a82);
+	_4a82.setWorkflow(null);
+	if (_4a82 instanceof draw2d.CompartmentFigure) {
+		this.compartments.remove(_4a82);
+	}
+	if (_4a82 instanceof draw2d.Connection) {
+		_4a82.disconnect();
+	}
+	if (this.currentSelection == _4a82) {
+		this.setCurrentSelection(null);
+	}
+	this.setDocumentDirty();
+	_4a82.onRemove(this);
+};
+draw2d.Workflow.prototype.moveFront = function(_4a83) {
+	this.html.removeChild(_4a83.getHTMLElement());
+	this.html.appendChild(_4a83.getHTMLElement());
+};
+draw2d.Workflow.prototype.moveBack = function(_4a84) {
+	this.html.removeChild(_4a84.getHTMLElement());
+	this.html.insertBefore(_4a84.getHTMLElement(), this.html.firstChild);
+};
+draw2d.Workflow.prototype.getBestCompartmentFigure = function(x, y, _4a87) {
+	var _4a88 = null;
+	for ( var i = 0; i < this.figures.getSize(); i++) {
+		var _4a8a = this.figures.get(i);
+		if ((_4a8a instanceof draw2d.CompartmentFigure)
+				&& _4a8a.isOver(x, y) == true && _4a8a != _4a87) {
+			if (_4a88 === null) {
+				_4a88 = _4a8a;
+			} else {
+				if (_4a88.getZOrder() < _4a8a.getZOrder()) {
+					_4a88 = _4a8a;
+				}
+			}
+		}
+	}
+	return _4a88;
+};
+draw2d.Workflow.prototype.getBestFigure = function(x, y, _4a8d) {
+	var _4a8e = null;
+	for ( var i = 0; i < this.figures.getSize(); i++) {
+		var _4a90 = this.figures.get(i);
+		if (_4a90.isOver(x, y) == true && _4a90 != _4a8d) {
+			if (_4a8e === null) {
+				_4a8e = _4a90;
+			} else {
+				if (_4a8e.getZOrder() < _4a90.getZOrder()) {
+					_4a8e = _4a90;
+				}
+			}
+		}
+	}
+	return _4a8e;
+};
+draw2d.Workflow.prototype.getBestLine = function(x, y, _4a93) {
+	var _4a94 = null;
+	var count = this.lines.getSize();
+	for ( var i = 0; i < count; i++) {
+		var line = this.lines.get(i);
+		if (line.containsPoint(x, y) == true && line != _4a93) {
+			if (_4a94 === null) {
+				_4a94 = line;
+			} else {
+				if (_4a94.getZOrder() < line.getZOrder()) {
+					_4a94 = line;
+				}
+			}
+		}
+	}
+	return _4a94;
+};
+draw2d.Workflow.prototype.getFigure = function(id) {
+	for ( var i = 0; i < this.figures.getSize(); i++) {
+		var _4a9a = this.figures.get(i);
+		if (_4a9a.id == id) {
+			return _4a9a;
+		}
+	}
+	return null;
+};
+draw2d.Workflow.prototype.getFigures = function() {
+	return this.figures;
+};
+draw2d.Workflow.prototype.getDocument = function() {
+	return new draw2d.CanvasDocument(this);
+};
+draw2d.Workflow.prototype.addSelectionListener = function(w) {
+	if (w !== null) {
+		if (w.onSelectionChanged) {
+			this.selectionListeners.add(w);
+		} else {
+			throw "Object doesn't implement required callback method [onSelectionChanged]";
+		}
+	}
+};
+draw2d.Workflow.prototype.removeSelectionListener = function(w) {
+	this.selectionListeners.remove(w);
+};
+draw2d.Workflow.prototype.setCurrentSelection = function(_4a9d) {
+	if (_4a9d === null || this.currentSelection != _4a9d) {
+		this.hideResizeHandles();
+		this.hideLineResizeHandles();
+	}
+	this.currentSelection = _4a9d;
+	for ( var i = 0; i < this.selectionListeners.getSize(); i++) {
+		var w = this.selectionListeners.get(i);
+		if (w.onSelectionChanged) {
+			w.onSelectionChanged(this.currentSelection,
+					this.currentSelection ? this.currentSelection.getModel()
+							: null);
+		}
+	}
+	if (_4a9d instanceof draw2d.Line) {
+		this.showLineResizeHandles(_4a9d);
+		if (!(_4a9d instanceof draw2d.Connection)) {
+			this.draggingLineCommand = line
+					.createCommand(new draw2d.EditPolicy(draw2d.EditPolicy.MOVE));
+			if (this.draggingLineCommand !== null) {
+				this.draggingLine = _4a9d;
+			}
+		}
+	}
+};
+draw2d.Workflow.prototype.getCurrentSelection = function() {
+	return this.currentSelection;
+};
+draw2d.Workflow.prototype.getLine = function(id) {
+	var count = this.lines.getSize();
+	for ( var i = 0; i < count; i++) {
+		var line = this.lines.get(i);
+		if (line.getId() == id) {
+			return line;
+		}
+	}
+	return null;
+};
+draw2d.Workflow.prototype.getLines = function() {
+	return this.lines;
+};
+draw2d.Workflow.prototype.registerPort = function(port) {
+	port.draggable.targets = this.dropTargets;
+	this.commonPorts.add(port);
+	this.dropTargets.add(port.dropable);
+};
+draw2d.Workflow.prototype.unregisterPort = function(port) {
+	port.draggable.targets = null;
+	this.commonPorts.remove(port);
+	this.dropTargets.remove(port.dropable);
+};
+draw2d.Workflow.prototype.getCommandStack = function() {
+	return this.commandStack;
+};
+draw2d.Workflow.prototype.showConnectionLine = function(x1, y1, x2, y2) {
+	this.connectionLine.setStartPoint(x1, y1);
+	this.connectionLine.setEndPoint(x2, y2);
+	if (this.connectionLine.canvas === null) {
+		draw2d.Canvas.prototype.addFigure.call(this, this.connectionLine);
+	}
+};
+draw2d.Workflow.prototype.hideConnectionLine = function() {
+	if (this.connectionLine.canvas !== null) {
+		draw2d.Canvas.prototype.removeFigure.call(this, this.connectionLine);
+	}
+};
+draw2d.Workflow.prototype.showLineResizeHandles = function(_4aaa) {
+	var _4aab = this.resizeHandleStart.getWidth() / 2;
+	var _4aac = this.resizeHandleStart.getHeight() / 2;
+	var _4aad = _4aaa.getStartPoint();
+	var _4aae = _4aaa.getEndPoint();
+	draw2d.Canvas.prototype.addFigure.call(this, this.resizeHandleStart,
+			_4aad.x - _4aab, _4aad.y - _4aab);
+	draw2d.Canvas.prototype.addFigure.call(this, this.resizeHandleEnd, _4aae.x
+			- _4aab, _4aae.y - _4aab);
+	this.resizeHandleStart.setCanDrag(_4aaa.isResizeable());
+	this.resizeHandleEnd.setCanDrag(_4aaa.isResizeable());
+	if (_4aaa.isResizeable()) {
+		this.resizeHandleStart.setBackgroundColor(draw2d.Workflow.COLOR_GREEN);
+		this.resizeHandleEnd.setBackgroundColor(draw2d.Workflow.COLOR_GREEN);
+		this.resizeHandleStart.draggable.targets = this.dropTargets;
+		this.resizeHandleEnd.draggable.targets = this.dropTargets;
+	} else {
+		this.resizeHandleStart.setBackgroundColor(null);
+		this.resizeHandleEnd.setBackgroundColor(null);
+	}
+};
+draw2d.Workflow.prototype.hideLineResizeHandles = function() {
+	if (this.resizeHandleStart.canvas !== null) {
+		draw2d.Canvas.prototype.removeFigure.call(this, this.resizeHandleStart);
+	}
+	if (this.resizeHandleEnd.canvas !== null) {
+		draw2d.Canvas.prototype.removeFigure.call(this, this.resizeHandleEnd);
+	}
+};
+draw2d.Workflow.prototype.showResizeHandles = function(_4aaf) {
+	this.hideLineResizeHandles();
+	this.hideResizeHandles();
+	if (this.getEnableSmoothFigureHandling() == true
+			&& this.getCurrentSelection() != _4aaf) {
+		this.resizeHandle1.setAlpha(0.01);
+		this.resizeHandle2.setAlpha(0.01);
+		this.resizeHandle3.setAlpha(0.01);
+		this.resizeHandle4.setAlpha(0.01);
+		this.resizeHandle5.setAlpha(0.01);
+		this.resizeHandle6.setAlpha(0.01);
+		this.resizeHandle7.setAlpha(0.01);
+		this.resizeHandle8.setAlpha(0.01);
+	}
+	var _4ab0 = this.resizeHandle1.getWidth();
+	var _4ab1 = this.resizeHandle1.getHeight();
+	var _4ab2 = _4aaf.getHeight();
+	var _4ab3 = _4aaf.getWidth();
+	var xPos = _4aaf.getX();
+	var yPos = _4aaf.getY();
+	draw2d.Canvas.prototype.addFigure.call(this, this.resizeHandle1, xPos
+			- _4ab0, yPos - _4ab1);
+	draw2d.Canvas.prototype.addFigure.call(this, this.resizeHandle3, xPos
+			+ _4ab3, yPos - _4ab1);
+	draw2d.Canvas.prototype.addFigure.call(this, this.resizeHandle5, xPos
+			+ _4ab3, yPos + _4ab2);
+	draw2d.Canvas.prototype.addFigure.call(this, this.resizeHandle7, xPos
+			- _4ab0, yPos + _4ab2);
+	this.moveFront(this.resizeHandle1);
+	this.moveFront(this.resizeHandle3);
+	this.moveFront(this.resizeHandle5);
+	this.moveFront(this.resizeHandle7);
+	this.resizeHandle1.setCanDrag(_4aaf.isResizeable());
+	this.resizeHandle3.setCanDrag(_4aaf.isResizeable());
+	this.resizeHandle5.setCanDrag(_4aaf.isResizeable());
+	this.resizeHandle7.setCanDrag(_4aaf.isResizeable());
+	if (_4aaf.isResizeable()) {
+		var green = new draw2d.Color(0, 255, 0);
+		this.resizeHandle1.setBackgroundColor(green);
+		this.resizeHandle3.setBackgroundColor(green);
+		this.resizeHandle5.setBackgroundColor(green);
+		this.resizeHandle7.setBackgroundColor(green);
+	} else {
+		this.resizeHandle1.setBackgroundColor(null);
+		this.resizeHandle3.setBackgroundColor(null);
+		this.resizeHandle5.setBackgroundColor(null);
+		this.resizeHandle7.setBackgroundColor(null);
+	}
+	if (_4aaf.isStrechable() && _4aaf.isResizeable()) {
+		this.resizeHandle2.setCanDrag(_4aaf.isResizeable());
+		this.resizeHandle4.setCanDrag(_4aaf.isResizeable());
+		this.resizeHandle6.setCanDrag(_4aaf.isResizeable());
+		this.resizeHandle8.setCanDrag(_4aaf.isResizeable());
+		draw2d.Canvas.prototype.addFigure.call(this, this.resizeHandle2, xPos
+				+ (_4ab3 / 2) - this.resizeHandleHalfWidth, yPos - _4ab1);
+		draw2d.Canvas.prototype.addFigure.call(this, this.resizeHandle4, xPos
+				+ _4ab3, yPos + (_4ab2 / 2) - (_4ab1 / 2));
+		draw2d.Canvas.prototype.addFigure.call(this, this.resizeHandle6, xPos
+				+ (_4ab3 / 2) - this.resizeHandleHalfWidth, yPos + _4ab2);
+		draw2d.Canvas.prototype.addFigure.call(this, this.resizeHandle8, xPos
+				- _4ab0, yPos + (_4ab2 / 2) - (_4ab1 / 2));
+		this.moveFront(this.resizeHandle2);
+		this.moveFront(this.resizeHandle4);
+		this.moveFront(this.resizeHandle6);
+		this.moveFront(this.resizeHandle8);
+	}
+};
+draw2d.Workflow.prototype.hideResizeHandles = function() {
+	if (this.resizeHandle1.canvas !== null) {
+		draw2d.Canvas.prototype.removeFigure.call(this, this.resizeHandle1);
+	}
+	if (this.resizeHandle2.canvas !== null) {
+		draw2d.Canvas.prototype.removeFigure.call(this, this.resizeHandle2);
+	}
+	if (this.resizeHandle3.canvas !== null) {
+		draw2d.Canvas.prototype.removeFigure.call(this, this.resizeHandle3);
+	}
+	if (this.resizeHandle4.canvas !== null) {
+		draw2d.Canvas.prototype.removeFigure.call(this, this.resizeHandle4);
+	}
+	if (this.resizeHandle5.canvas !== null) {
+		draw2d.Canvas.prototype.removeFigure.call(this, this.resizeHandle5);
+	}
+	if (this.resizeHandle6.canvas !== null) {
+		draw2d.Canvas.prototype.removeFigure.call(this, this.resizeHandle6);
+	}
+	if (this.resizeHandle7.canvas !== null) {
+		draw2d.Canvas.prototype.removeFigure.call(this, this.resizeHandle7);
+	}
+	if (this.resizeHandle8.canvas !== null) {
+		draw2d.Canvas.prototype.removeFigure.call(this, this.resizeHandle8);
+	}
+};
+draw2d.Workflow.prototype.moveResizeHandles = function(_4ab7) {
+	var _4ab8 = this.resizeHandle1.getWidth();
+	var _4ab9 = this.resizeHandle1.getHeight();
+	var _4aba = _4ab7.getHeight();
+	var _4abb = _4ab7.getWidth();
+	var xPos = _4ab7.getX();
+	var yPos = _4ab7.getY();
+	this.resizeHandle1.setPosition(xPos - _4ab8, yPos - _4ab9);
+	this.resizeHandle3.setPosition(xPos + _4abb, yPos - _4ab9);
+	this.resizeHandle5.setPosition(xPos + _4abb, yPos + _4aba);
+	this.resizeHandle7.setPosition(xPos - _4ab8, yPos + _4aba);
+	if (_4ab7.isStrechable()) {
+		this.resizeHandle2.setPosition(xPos + (_4abb / 2)
+				- this.resizeHandleHalfWidth, yPos - _4ab9);
+		this.resizeHandle4.setPosition(xPos + _4abb, yPos + (_4aba / 2)
+				- (_4ab9 / 2));
+		this.resizeHandle6.setPosition(xPos + (_4abb / 2)
+				- this.resizeHandleHalfWidth, yPos + _4aba);
+		this.resizeHandle8.setPosition(xPos - _4ab8, yPos + (_4aba / 2)
+				- (_4ab9 / 2));
+	}
+};
+draw2d.Workflow.prototype.onMouseDown = function(x, y) {
+	this.dragging = true;
+	this.mouseDownPosX = x;
+	this.mouseDownPosY = y;
+	if (this.toolPalette !== null && this.toolPalette.getActiveTool() !== null) {
+		this.toolPalette.getActiveTool().execute(x, y);
+	}
+	this.showMenu(null);
+	var line = this.getBestLine(x, y);
+	if (line !== null && line.isSelectable()) {
+		this.setCurrentSelection(line);
+	} else {
+		this.setCurrentSelection(null);
+	}
+};
+draw2d.Workflow.prototype.onMouseUp = function(x, y) {
+	this.dragging = false;
+	if (this.draggingLineCommand !== null) {
+		this.getCommandStack().execute(this.draggingLineCommand);
+		this.draggingLine = null;
+		this.draggingLineCommand = null;
+	}
+};
+draw2d.Workflow.prototype.onMouseMove = function(x, y) {
+	if (this.dragging === true && this.draggingLine !== null) {
+		var diffX = x - this.mouseDownPosX;
+		var diffY = y - this.mouseDownPosY;
+		this.draggingLine.startX = this.draggingLine.getStartX() + diffX;
+		this.draggingLine.startY = this.draggingLine.getStartY() + diffY;
+		this.draggingLine.setEndPoint(this.draggingLine.getEndX() + diffX,
+				this.draggingLine.getEndY() + diffY);
+		this.mouseDownPosX = x;
+		this.mouseDownPosY = y;
+		this.showLineResizeHandles(this.currentSelection);
+	} else {
+		if (this.dragging === true && this.panning === true) {
+			var diffX = x - this.mouseDownPosX;
+			var diffY = y - this.mouseDownPosY;
+			this.scrollTo(this.getScrollLeft() - diffX, this.getScrollTop()
+					- diffY, true);
+			this.onScroll();
+		}
+	}
+};
+draw2d.Workflow.prototype.onKeyDown = function(_4ac7, ctrl) {
+	if (_4ac7 == 46 && this.currentSelection !== null) {
+		this.commandStack
+				.execute(this.currentSelection
+						.createCommand(new draw2d.EditPolicy(
+								draw2d.EditPolicy.DELETE)));
+	} else {
+		if (_4ac7 == 90 && ctrl) {
+			this.commandStack.undo();
+		} else {
+			if (_4ac7 == 89 && ctrl) {
+				this.commandStack.redo();
+			}
+		}
+	}
+};
+draw2d.Workflow.prototype.setDocumentDirty = function() {
+	try {
+		for ( var i = 0; i < this.dialogs.getSize(); i++) {
+			var d = this.dialogs.get(i);
+			if (d !== null && d.onSetDocumentDirty) {
+				d.onSetDocumentDirty();
+			}
+		}
+		if (this.snapToGeometryHelper !== null) {
+			this.snapToGeometryHelper.onSetDocumentDirty();
+		}
+		if (this.snapToGridHelper !== null) {
+			this.snapToGridHelper.onSetDocumentDirty();
+		}
+	} catch (e) {
+		pushErrorStack(e,
+				"draw2d.Workflow.prototype.setDocumentDirty=function()");
+	}
+};
+draw2d.Workflow.prototype.snapToHelper = function(_4acb, pos) {
+	if (this.snapToGeometryHelper !== null) {
+		if (_4acb instanceof draw2d.ResizeHandle) {
+			var _4acd = _4acb.getSnapToGridAnchor();
+			pos.x += _4acd.x;
+			pos.y += _4acd.y;
+			var _4ace = new draw2d.Point(pos.x, pos.y);
+			var _4acf = _4acb.getSnapToDirection();
+			var _4ad0 = this.snapToGeometryHelper.snapPoint(_4acf, pos, _4ace);
+			if ((_4acf & draw2d.SnapToHelper.EAST_WEST)
+					&& !(_4ad0 & draw2d.SnapToHelper.EAST_WEST)) {
+				this.showSnapToHelperLineVertical(_4ace.x);
+			} else {
+				this.hideSnapToHelperLineVertical();
+			}
+			if ((_4acf & draw2d.SnapToHelper.NORTH_SOUTH)
+					&& !(_4ad0 & draw2d.SnapToHelper.NORTH_SOUTH)) {
+				this.showSnapToHelperLineHorizontal(_4ace.y);
+			} else {
+				this.hideSnapToHelperLineHorizontal();
+			}
+			_4ace.x -= _4acd.x;
+			_4ace.y -= _4acd.y;
+			return _4ace;
+		} else {
+			var _4ad1 = new draw2d.Dimension(pos.x, pos.y, _4acb.getWidth(),
+					_4acb.getHeight());
+			var _4ace = new draw2d.Dimension(pos.x, pos.y, _4acb.getWidth(),
+					_4acb.getHeight());
+			var _4acf = draw2d.SnapToHelper.NSEW;
+			var _4ad0 = this.snapToGeometryHelper.snapRectangle(_4ad1, _4ace);
+			if ((_4acf & draw2d.SnapToHelper.WEST)
+					&& !(_4ad0 & draw2d.SnapToHelper.WEST)) {
+				this.showSnapToHelperLineVertical(_4ace.x);
+			} else {
+				if ((_4acf & draw2d.SnapToHelper.EAST)
+						&& !(_4ad0 & draw2d.SnapToHelper.EAST)) {
+					this.showSnapToHelperLineVertical(_4ace.getX()
+							+ _4ace.getWidth());
+				} else {
+					this.hideSnapToHelperLineVertical();
+				}
+			}
+			if ((_4acf & draw2d.SnapToHelper.NORTH)
+					&& !(_4ad0 & draw2d.SnapToHelper.NORTH)) {
+				this.showSnapToHelperLineHorizontal(_4ace.y);
+			} else {
+				if ((_4acf & draw2d.SnapToHelper.SOUTH)
+						&& !(_4ad0 & draw2d.SnapToHelper.SOUTH)) {
+					this.showSnapToHelperLineHorizontal(_4ace.getY()
+							+ _4ace.getHeight());
+				} else {
+					this.hideSnapToHelperLineHorizontal();
+				}
+			}
+			return _4ace.getTopLeft();
+		}
+	} else {
+		if (this.snapToGridHelper !== null) {
+			var _4acd = _4acb.getSnapToGridAnchor();
+			pos.x = pos.x + _4acd.x;
+			pos.y = pos.y + _4acd.y;
+			var _4ace = new draw2d.Point(pos.x, pos.y);
+			this.snapToGridHelper.snapPoint(0, pos, _4ace);
+			_4ace.x = _4ace.x - _4acd.x;
+			_4ace.y = _4ace.y - _4acd.y;
+			return _4ace;
+		}
+	}
+	return pos;
+};
+draw2d.Workflow.prototype.showSnapToHelperLineHorizontal = function(_4ad2) {
+	if (this.horizontalSnapToHelperLine === null) {
+		this.horizontalSnapToHelperLine = new draw2d.Line();
+		this.horizontalSnapToHelperLine
+				.setColor(new draw2d.Color(175, 175, 255));
+		this.addFigure(this.horizontalSnapToHelperLine);
+	}
+	this.horizontalSnapToHelperLine.setStartPoint(0, _4ad2);
+	this.horizontalSnapToHelperLine.setEndPoint(this.getWidth(), _4ad2);
+};
+draw2d.Workflow.prototype.showSnapToHelperLineVertical = function(_4ad3) {
+	if (this.verticalSnapToHelperLine === null) {
+		this.verticalSnapToHelperLine = new draw2d.Line();
+		this.verticalSnapToHelperLine.setColor(new draw2d.Color(175, 175, 255));
+		this.addFigure(this.verticalSnapToHelperLine);
+	}
+	this.verticalSnapToHelperLine.setStartPoint(_4ad3, 0);
+	this.verticalSnapToHelperLine.setEndPoint(_4ad3, this.getHeight());
+};
+draw2d.Workflow.prototype.hideSnapToHelperLines = function() {
+	this.hideSnapToHelperLineHorizontal();
+	this.hideSnapToHelperLineVertical();
+};
+draw2d.Workflow.prototype.hideSnapToHelperLineHorizontal = function() {
+	if (this.horizontalSnapToHelperLine !== null) {
+		this.removeFigure(this.horizontalSnapToHelperLine);
+		this.horizontalSnapToHelperLine = null;
+	}
+};
+draw2d.Workflow.prototype.hideSnapToHelperLineVertical = function() {
+	if (this.verticalSnapToHelperLine !== null) {
+		this.removeFigure(this.verticalSnapToHelperLine);
+		this.verticalSnapToHelperLine = null;
+	}
+};
+draw2d.WindowFigure = function(title) {
+	this.title = title;
+	this.titlebar = null;
+	draw2d.Figure.call(this);
+	this.setDeleteable(false);
+	this.setCanSnapToHelper(false);
+	this.setZOrder(draw2d.WindowFigure.ZOrderIndex);
+};
+draw2d.WindowFigure.prototype = new draw2d.Figure();
+draw2d.WindowFigure.prototype.type = ":draw2d.WindowFigure";
+draw2d.WindowFigure.ZOrderIndex = 50000;
+draw2d.WindowFigure.setZOrderBaseIndex = function(index) {
+	draw2d.WindowFigure.ZOrderBaseIndex = index;
+};
+draw2d.WindowFigure.prototype.hasFixedPosition = function() {
+	return true;
+};
+draw2d.WindowFigure.prototype.hasTitleBar = function() {
+	return true;
+};
+draw2d.WindowFigure.prototype.createHTMLElement = function() {
+	var item = draw2d.Figure.prototype.createHTMLElement.call(this);
+	item.style.margin = "0px";
+	item.style.padding = "0px";
+	item.style.border = "1px solid black";
+	item.style.backgroundImage = "url(window_bg.png)";
+	item.style.zIndex = draw2d.WindowFigure.ZOrderIndex;
+	item.style.cursor = null;
+	item.className = "WindowFigure";
+	if (this.hasTitleBar()) {
+		this.titlebar = document.createElement("div");
+		this.titlebar.style.position = "absolute";
+		this.titlebar.style.left = "0px";
+		this.titlebar.style.top = "0px";
+		this.titlebar.style.width = this.getWidth() + "px";
+		this.titlebar.style.height = "15px";
+		this.titlebar.style.margin = "0px";
+		this.titlebar.style.padding = "0px";
+		this.titlebar.style.font = "normal 10px verdana";
+		this.titlebar.style.backgroundColor = "blue";
+		this.titlebar.style.borderBottom = "2px solid gray";
+		this.titlebar.style.whiteSpace = "nowrap";
+		this.titlebar.style.textAlign = "center";
+		this.titlebar.style.backgroundImage = "url(window_toolbar.png)";
+		this.titlebar.className = "WindowFigure_titlebar";
+		this.textNode = document.createTextNode(this.title);
+		this.titlebar.appendChild(this.textNode);
+		this.disableTextSelection(this.titlebar);
+		item.appendChild(this.titlebar);
+	}
+	return item;
+};
+draw2d.WindowFigure.prototype.setDocumentDirty = function(_566d) {
+};
+draw2d.WindowFigure.prototype.onDragend = function() {
+};
+draw2d.WindowFigure.prototype.onDragstart = function(x, y) {
+	if (this.titlebar === null) {
+		return false;
+	}
+	if (this.canDrag === true && x < parseInt(this.titlebar.style.width)
+			&& y < parseInt(this.titlebar.style.height)) {
+		return true;
+	}
+	return false;
+};
+draw2d.WindowFigure.prototype.isSelectable = function() {
+	return false;
+};
+draw2d.WindowFigure.prototype.setCanDrag = function(flag) {
+	draw2d.Figure.prototype.setCanDrag.call(this, flag);
+	this.html.style.cursor = "";
+	if (this.titlebar === null) {
+		return;
+	}
+	if (flag) {
+		this.titlebar.style.cursor = "move";
+	} else {
+		this.titlebar.style.cursor = "";
+	}
+};
+draw2d.WindowFigure.prototype.setWorkflow = function(_5671) {
+	var _5672 = this.workflow;
+	draw2d.Figure.prototype.setWorkflow.call(this, _5671);
+	if (_5672 !== null) {
+		_5672.removeSelectionListener(this);
+	}
+	if (this.workflow !== null) {
+		this.workflow.addSelectionListener(this);
+	}
+};
+draw2d.WindowFigure.prototype.setDimension = function(w, h) {
+	draw2d.Figure.prototype.setDimension.call(this, w, h);
+	if (this.titlebar !== null) {
+		this.titlebar.style.width = this.getWidth() + "px";
+	}
+};
+draw2d.WindowFigure.prototype.setTitle = function(title) {
+	this.title = title;
+};
+draw2d.WindowFigure.prototype.getMinWidth = function() {
+	return 50;
+};
+draw2d.WindowFigure.prototype.getMinHeight = function() {
+	return 50;
+};
+draw2d.WindowFigure.prototype.isResizeable = function() {
+	return false;
+};
+draw2d.WindowFigure.prototype.setAlpha = function(_5676) {
+};
+draw2d.WindowFigure.prototype.setBackgroundColor = function(color) {
+	this.bgColor = color;
+	if (this.bgColor !== null) {
+		this.html.style.backgroundColor = this.bgColor.getHTMLStyle();
+	} else {
+		this.html.style.backgroundColor = "transparent";
+		this.html.style.backgroundImage = "";
+	}
+};
+draw2d.WindowFigure.prototype.setColor = function(color) {
+	this.lineColor = color;
+	if (this.lineColor !== null) {
+		this.html.style.border = this.lineStroke + "px solid "
+				+ this.lineColor.getHTMLStyle();
+	} else {
+		this.html.style.border = "0px";
+	}
+};
+draw2d.WindowFigure.prototype.setLineWidth = function(w) {
+	this.lineStroke = w;
+	this.html.style.border = this.lineStroke + "px solid black";
+};
+draw2d.WindowFigure.prototype.onSelectionChanged = function(_567a, model) {
+};
+draw2d.Button = function(_5544, width, _5546) {
+	this.x = 0;
+	this.y = 0;
+	this.width = 24;
+	this.height = 24;
+	this.id = draw2d.UUID.create();
+	this.enabled = true;
+	this.active = false;
+	this.palette = _5544;
+	this.html = this.createHTMLElement();
+	if (width !== undefined && _5546 !== undefined) {
+		this.setDimension(width, _5546);
+	} else {
+		this.setDimension(24, 24);
+	}
+};
+draw2d.Button.prototype.type = "draw2d.Button";
+draw2d.Button.prototype.dispose = function() {
+};
+draw2d.Button.prototype.getImageUrl = function() {
+	return this.type + ".png";
+};
+draw2d.Button.prototype.createHTMLElement = function() {
+	var item = document.createElement("div");
+	item.id = this.id;
+	item.style.position = "absolute";
+	item.style.left = this.x + "px";
+	item.style.top = this.y + "px";
+	item.style.height = this.width + "px";
+	item.style.width = this.height + "px";
+	item.style.margin = "0px";
+	item.style.padding = "0px";
+	item.style.outline = "none";
+	if (this.getImageUrl() !== null) {
+		item.style.backgroundImage = "url(" + this.getImageUrl() + ")";
+	} else {
+		item.style.backgroundImage = "";
+	}
+	var oThis = this;
+	this.omousedown = function(event) {
+		if (oThis.enabled) {
+			oThis.setActive(true);
+		}
+		event.cancelBubble = true;
+		event.returnValue = false;
+	};
+	this.omouseup = function(event) {
+		if (oThis.enabled) {
+			oThis.setActive(false);
+			oThis.execute();
+			oThis.palette.setActiveTool(null);
+		}
+		event.cancelBubble = true;
+		event.returnValue = false;
+	};
+	if (item.addEventListener) {
+		item.addEventListener("mousedown", this.omousedown, false);
+		item.addEventListener("mouseup", this.omouseup, false);
+	} else {
+		if (item.attachEvent) {
+			item.attachEvent("onmousedown", this.omousedown);
+			item.attachEvent("onmouseup", this.omouseup);
+		}
+	}
+	return item;
+};
+draw2d.Button.prototype.getHTMLElement = function() {
+	if (this.html === null) {
+		this.html = this.createHTMLElement();
+	}
+	return this.html;
+};
+draw2d.Button.prototype.execute = function() {
+};
+draw2d.Button.prototype.setTooltip = function(_554b) {
+	this.tooltip = _554b;
+	if (this.tooltip !== null) {
+		this.html.title = this.tooltip;
+	} else {
+		this.html.title = "";
+	}
+};
+draw2d.Button.prototype.getWorkflow = function() {
+	return this.getToolPalette().getWorkflow();
+};
+draw2d.Button.prototype.getToolPalette = function() {
+	return this.palette;
+};
+draw2d.Button.prototype.setActive = function(flag) {
+	if (!this.enabled) {
+		return;
+	}
+	this.active = flag;
+	if (flag === true) {
+		this.html.style.border = "1px inset";
+	} else {
+		this.html.style.border = "0px";
+	}
+};
+draw2d.Button.prototype.isActive = function() {
+	return this.active;
+};
+draw2d.Button.prototype.setEnabled = function(flag) {
+	this.enabled = flag;
+	if (flag) {
+		this.html.style.filter = "alpha(opacity=100)";
+		this.html.style.opacity = "1.0";
+	} else {
+		this.html.style.filter = "alpha(opacity=30)";
+		this.html.style.opacity = "0.3";
+	}
+};
+draw2d.Button.prototype.setDimension = function(w, h) {
+	this.width = w;
+	this.height = h;
+	if (this.html === null) {
+		return;
+	}
+	this.html.style.width = this.width + "px";
+	this.html.style.height = this.height + "px";
+};
+draw2d.Button.prototype.setPosition = function(xPos, yPos) {
+	this.x = Math.max(0, xPos);
+	this.y = Math.max(0, yPos);
+	if (this.html === null) {
+		return;
+	}
+	this.html.style.left = this.x + "px";
+	this.html.style.top = this.y + "px";
+};
+draw2d.Button.prototype.getWidth = function() {
+	return this.width;
+};
+draw2d.Button.prototype.getHeight = function() {
+	return this.height;
+};
+draw2d.Button.prototype.getY = function() {
+	return this.y;
+};
+draw2d.Button.prototype.getX = function() {
+	return this.x;
+};
+draw2d.Button.prototype.getPosition = function() {
+	return new draw2d.Point(this.x, this.y);
+};
+draw2d.ToggleButton = function(_58b2) {
+	draw2d.Button.call(this, _58b2);
+	this.isDownFlag = false;
+};
+draw2d.ToggleButton.prototype = new draw2d.Button();
+draw2d.ToggleButton.prototype.type = "draw2d.ToggleButton";
+draw2d.ToggleButton.prototype.createHTMLElement = function() {
+	var item = document.createElement("div");
+	item.id = this.id;
+	item.style.position = "absolute";
+	item.style.left = this.x + "px";
+	item.style.top = this.y + "px";
+	item.style.height = "24px";
+	item.style.width = "24px";
+	item.style.margin = "0px";
+	item.style.padding = "0px";
+	if (this.getImageUrl() !== null) {
+		item.style.backgroundImage = "url(" + this.getImageUrl() + ")";
+	} else {
+		item.style.backgroundImage = "";
+	}
+	var oThis = this;
+	this.omousedown = function(event) {
+		if (oThis.enabled) {
+			if (!oThis.isDown()) {
+				draw2d.Button.prototype.setActive.call(oThis, true);
+			}
+		}
+		event.cancelBubble = true;
+		event.returnValue = false;
+	};
+	this.omouseup = function(event) {
+		if (oThis.enabled) {
+			if (oThis.isDown()) {
+				draw2d.Button.prototype.setActive.call(oThis, false);
+			}
+			oThis.isDownFlag = !oThis.isDownFlag;
+			oThis.execute();
+		}
+		event.cancelBubble = true;
+		event.returnValue = false;
+	};
+	if (item.addEventListener) {
+		item.addEventListener("mousedown", this.omousedown, false);
+		item.addEventListener("mouseup", this.omouseup, false);
+	} else {
+		if (item.attachEvent) {
+			item.attachEvent("onmousedown", this.omousedown);
+			item.attachEvent("onmouseup", this.omouseup);
+		}
+	}
+	return item;
+};
+draw2d.ToggleButton.prototype.isDown = function() {
+	return this.isDownFlag;
+};
+draw2d.ToggleButton.prototype.setActive = function(flag) {
+	draw2d.Button.prototype.setActive.call(this, flag);
+	this.isDownFlag = flag;
+};
+draw2d.ToggleButton.prototype.execute = function() {
+};
+draw2d.ToolGeneric = function(_58a4) {
+	this.x = 0;
+	this.y = 0;
+	this.enabled = true;
+	this.tooltip = null;
+	this.palette = _58a4;
+	this.html = this.createHTMLElement();
+	this.setDimension(10, 10);
+};
+draw2d.ToolGeneric.prototype.type = "draw2d.ToolGeneric";
+draw2d.ToolGeneric.prototype.dispose = function() {
+};
+draw2d.ToolGeneric.prototype.getImageUrl = function() {
+	return this.type + ".png";
+};
+draw2d.ToolGeneric.prototype.getWorkflow = function() {
+	return this.getToolPalette().getWorkflow();
+};
+draw2d.ToolGeneric.prototype.getToolPalette = function() {
+	return this.palette;
+};
+draw2d.ToolGeneric.prototype.createHTMLElement = function() {
+	var item = document.createElement("div");
+	item.id = this.id;
+	item.style.position = "absolute";
+	item.style.left = this.x + "px";
+	item.style.top = this.y + "px";
+	item.style.height = "24px";
+	item.style.width = "24px";
+	item.style.margin = "0px";
+	item.style.padding = "0px";
+	if (this.getImageUrl() !== null) {
+		item.style.backgroundImage = "url(" + this.getImageUrl() + ")";
+	} else {
+		item.style.backgroundImage = "";
+	}
+	var oThis = this;
+	this.click = function(event) {
+		if (oThis.enabled) {
+			oThis.palette.setActiveTool(oThis);
+		}
+		event.cancelBubble = true;
+		event.returnValue = false;
+	};
+	if (item.addEventListener) {
+		item.addEventListener("click", this.click, false);
+	} else {
+		if (item.attachEvent) {
+			item.attachEvent("onclick", this.click);
+		}
+	}
+	if (this.tooltip !== null) {
+		item.title = this.tooltip;
+	} else {
+		item.title = "";
+	}
+	return item;
+};
+draw2d.ToolGeneric.prototype.getHTMLElement = function() {
+	if (this.html === null) {
+		this.html = this.createHTMLElement();
+	}
+	return this.html;
+};
+draw2d.ToolGeneric.prototype.execute = function(x, y) {
+	if (this.enabled) {
+		this.palette.setActiveTool(null);
+	}
+};
+draw2d.ToolGeneric.prototype.setTooltip = function(_58aa) {
+	this.tooltip = _58aa;
+	if (this.tooltip !== null) {
+		this.html.title = this.tooltip;
+	} else {
+		this.html.title = "";
+	}
+};
+draw2d.ToolGeneric.prototype.setActive = function(flag) {
+	if (!this.enabled) {
+		return;
+	}
+	if (flag === true) {
+		this.html.style.border = "1px inset";
+	} else {
+		this.html.style.border = "0px";
+	}
+};
+draw2d.ToolGeneric.prototype.setEnabled = function(flag) {
+	this.enabled = flag;
+	if (flag) {
+		this.html.style.filter = "alpha(opacity=100)";
+		this.html.style.opacity = "1.0";
+	} else {
+		this.html.style.filter = "alpha(opacity=30)";
+		this.html.style.opacity = "0.3";
+	}
+};
+draw2d.ToolGeneric.prototype.setDimension = function(w, h) {
+	this.width = w;
+	this.height = h;
+	if (this.html === null) {
+		return;
+	}
+	this.html.style.width = this.width + "px";
+	this.html.style.height = this.height + "px";
+};
+draw2d.ToolGeneric.prototype.setPosition = function(xPos, yPos) {
+	this.x = Math.max(0, xPos);
+	this.y = Math.max(0, yPos);
+	if (this.html === null) {
+		return;
+	}
+	this.html.style.left = this.x + "px";
+	this.html.style.top = this.y + "px";
+};
+draw2d.ToolGeneric.prototype.getWidth = function() {
+	return this.width;
+};
+draw2d.ToolGeneric.prototype.getHeight = function() {
+	return this.height;
+};
+draw2d.ToolGeneric.prototype.getY = function() {
+	return this.y;
+};
+draw2d.ToolGeneric.prototype.getX = function() {
+	return this.x;
+};
+draw2d.ToolGeneric.prototype.getPosition = function() {
+	return new draw2d.Point(this.x, this.y);
+};
+draw2d.ToolPalette = function(title) {
+	draw2d.WindowFigure.call(this, title);
+	this.setDimension(75, 400);
+	this.activeTool = null;
+	this.children = {};
+};
+draw2d.ToolPalette.prototype = new draw2d.WindowFigure();
+draw2d.ToolPalette.prototype.type = "draw2d.ToolPalette";
+draw2d.ToolPalette.prototype.dispose = function() {
+	draw2d.WindowFigure.prototype.dispose.call(this);
+};
+draw2d.ToolPalette.prototype.createHTMLElement = function() {
+	var item = draw2d.WindowFigure.prototype.createHTMLElement.call(this);
+	this.scrollarea = document.createElement("div");
+	this.scrollarea.style.position = "absolute";
+	this.scrollarea.style.left = "0px";
+	if (this.hasTitleBar()) {
+		this.scrollarea.style.top = "15px";
+	} else {
+		this.scrollarea.style.top = "0px";
+	}
+	this.scrollarea.style.width = this.getWidth() + "px";
+	this.scrollarea.style.height = "15px";
+	this.scrollarea.style.margin = "0px";
+	this.scrollarea.style.padding = "0px";
+	this.scrollarea.style.font = "normal 10px verdana";
+	this.scrollarea.style.borderBottom = "2px solid gray";
+	this.scrollarea.style.whiteSpace = "nowrap";
+	this.scrollarea.style.textAlign = "center";
+	this.scrollarea.style.overflowX = "auto";
+	this.scrollarea.style.overflowY = "auto";
+	this.scrollarea.style.overflow = "auto";
+	item.appendChild(this.scrollarea);
+	return item;
+};
+draw2d.ToolPalette.prototype.setDimension = function(w, h) {
+	draw2d.WindowFigure.prototype.setDimension.call(this, w, h);
+	if (this.scrollarea !== null) {
+		this.scrollarea.style.width = this.getWidth() + "px";
+		if (this.hasTitleBar()) {
+			this.scrollarea.style.height = (this.getHeight() - 15) + "px";
+		} else {
+			this.scrollarea.style.height = this.getHeight() + "px";
+		}
+	}
+};
+draw2d.ToolPalette.prototype.addChild = function(item) {
+	this.children[item.id] = item;
+	this.scrollarea.appendChild(item.getHTMLElement());
+};
+draw2d.ToolPalette.prototype.getChild = function(id) {
+	return this.children[id];
+};
+draw2d.ToolPalette.prototype.getActiveTool = function() {
+	return this.activeTool;
+};
+draw2d.ToolPalette.prototype.setActiveTool = function(tool) {
+	if (this.activeTool != tool && this.activeTool !== null) {
+		this.activeTool.setActive(false);
+	}
+	if (tool !== null) {
+		tool.setActive(true);
+	}
+	this.activeTool = tool;
+};
+draw2d.Dialog = function(title) {
+	this.buttonbar = null;
+	if (title) {
+		draw2d.WindowFigure.call(this, title);
+	} else {
+		draw2d.WindowFigure.call(this, "Dialog");
+	}
+	this.setDimension(400, 300);
+};
+draw2d.Dialog.prototype = new draw2d.WindowFigure();
+draw2d.Dialog.prototype.type = "draw2d.Dialog";
+draw2d.Dialog.prototype.createHTMLElement = function() {
+	var item = draw2d.WindowFigure.prototype.createHTMLElement.call(this);
+	var oThis = this;
+	this.buttonbar = document.createElement("div");
+	this.buttonbar.style.position = "absolute";
+	this.buttonbar.style.left = "0px";
+	this.buttonbar.style.bottom = "0px";
+	this.buttonbar.style.width = this.getWidth() + "px";
+	this.buttonbar.style.height = "30px";
+	this.buttonbar.style.margin = "0px";
+	this.buttonbar.style.padding = "0px";
+	this.buttonbar.style.font = "normal 10px verdana";
+	this.buttonbar.style.backgroundColor = "#c0c0c0";
+	this.buttonbar.style.borderBottom = "2px solid gray";
+	this.buttonbar.style.whiteSpace = "nowrap";
+	this.buttonbar.style.textAlign = "center";
+	this.buttonbar.className = "Dialog_buttonbar";
+	this.okbutton = document.createElement("button");
+	this.okbutton.style.border = "1px solid gray";
+	this.okbutton.style.font = "normal 10px verdana";
+	this.okbutton.style.width = "80px";
+	this.okbutton.style.margin = "5px";
+	this.okbutton.className = "Dialog_okbutton";
+	this.okbutton.innerHTML = "Ok";
+	this.okbutton.onclick = function() {
+		var error = null;
+		try {
+			oThis.onOk();
+		} catch (e) {
+			error = e;
+		}
+		oThis.workflow.removeFigure(oThis);
+		if (error !== null) {
+			throw error;
+		}
+	};
+	this.buttonbar.appendChild(this.okbutton);
+	this.cancelbutton = document.createElement("button");
+	this.cancelbutton.innerHTML = "Cancel";
+	this.cancelbutton.style.font = "normal 10px verdana";
+	this.cancelbutton.style.border = "1px solid gray";
+	this.cancelbutton.style.width = "80px";
+	this.cancelbutton.style.margin = "5px";
+	this.cancelbutton.className = "Dialog_cancelbutton";
+	this.cancelbutton.onclick = function() {
+		var error = null;
+		try {
+			oThis.onCancel();
+		} catch (e) {
+			error = e;
+		}
+		oThis.workflow.removeFigure(oThis);
+		if (error !== null) {
+			throw error;
+		}
+	};
+	this.buttonbar.appendChild(this.cancelbutton);
+	item.appendChild(this.buttonbar);
+	return item;
+};
+draw2d.Dialog.prototype.onOk = function() {
+};
+draw2d.Dialog.prototype.onCancel = function() {
+};
+draw2d.Dialog.prototype.setDimension = function(w, h) {
+	draw2d.WindowFigure.prototype.setDimension.call(this, w, h);
+	if (this.buttonbar !== null) {
+		this.buttonbar.style.width = this.getWidth() + "px";
+	}
+};
+draw2d.Dialog.prototype.setWorkflow = function(_5af6) {
+	draw2d.WindowFigure.prototype.setWorkflow.call(this, _5af6);
+	this.setFocus();
+};
+draw2d.Dialog.prototype.setFocus = function() {
+};
+draw2d.Dialog.prototype.onSetDocumentDirty = function() {
+};
+draw2d.InputDialog = function() {
+	draw2d.Dialog.call(this);
+	this.setDimension(400, 100);
+};
+draw2d.InputDialog.prototype = new draw2d.Dialog();
+draw2d.InputDialog.prototype.type = "draw2d.InputDialog";
+draw2d.InputDialog.prototype.createHTMLElement = function() {
+	var item = draw2d.Dialog.prototype.createHTMLElement.call(this);
+	return item;
+};
+draw2d.InputDialog.prototype.onOk = function() {
+	this.workflow.removeFigure(this);
+};
+draw2d.InputDialog.prototype.onCancel = function() {
+	this.workflow.removeFigure(this);
+};
+draw2d.PropertyDialog = function(_4b4f, _4b50, label) {
+	this.figure = _4b4f;
+	this.propertyName = _4b50;
+	this.label = label;
+	draw2d.Dialog.call(this);
+	this.setDimension(400, 120);
+};
+draw2d.PropertyDialog.prototype = new draw2d.Dialog();
+draw2d.PropertyDialog.prototype.type = "draw2d.PropertyDialog";
+draw2d.PropertyDialog.prototype.createHTMLElement = function() {
+	var item = draw2d.Dialog.prototype.createHTMLElement.call(this);
+	var _4b53 = document.createElement("form");
+	_4b53.style.position = "absolute";
+	_4b53.style.left = "10px";
+	_4b53.style.top = "30px";
+	_4b53.style.width = "375px";
+	_4b53.style.font = "normal 10px verdana";
+	item.appendChild(_4b53);
+	this.labelDiv = document.createElement("div");
+	this.labelDiv.innerHTML = this.label;
+	this.disableTextSelection(this.labelDiv);
+	_4b53.appendChild(this.labelDiv);
+	this.input = document.createElement("input");
+	this.input.style.border = "1px solid gray";
+	this.input.style.font = "normal 10px verdana";
+	this.input.type = "text";
+	var value = this.figure.getProperty(this.propertyName);
+	if (value) {
+		this.input.value = value;
+	} else {
+		this.input.value = "";
+	}
+	this.input.style.width = "100%";
+	_4b53.appendChild(this.input);
+	this.input.focus();
+	return item;
+};
+draw2d.PropertyDialog.prototype.onOk = function() {
+	draw2d.Dialog.prototype.onOk.call(this);
+	this.figure.setProperty(this.propertyName, this.input.value);
+};
+draw2d.AnnotationDialog = function(_57df) {
+	this.figure = _57df;
+	draw2d.Dialog.call(this);
+	this.setDimension(400, 100);
+};
+draw2d.AnnotationDialog.prototype = new draw2d.Dialog();
+draw2d.AnnotationDialog.prototype.type = "draw2d.AnnotationDialog";
+draw2d.AnnotationDialog.prototype.createHTMLElement = function() {
+	var item = draw2d.Dialog.prototype.createHTMLElement.call(this);
+	var _57e1 = document.createElement("form");
+	_57e1.style.position = "absolute";
+	_57e1.style.left = "10px";
+	_57e1.style.top = "30px";
+	_57e1.style.width = "375px";
+	_57e1.style.font = "normal 10px verdana";
+	item.appendChild(_57e1);
+	this.label = document.createTextNode("Text");
+	_57e1.appendChild(this.label);
+	this.input = document.createElement("input");
+	this.input.style.border = "1px solid gray";
+	this.input.style.font = "normal 10px verdana";
+	this.input.type = "text";
+	var value = this.figure.getText();
+	if (value) {
+		this.input.value = value;
+	} else {
+		this.input.value = "";
+	}
+	this.input.style.width = "100%";
+	_57e1.appendChild(this.input);
+	this.input.focus();
+	return item;
+};
+draw2d.AnnotationDialog.prototype.onOk = function() {
+	this.workflow.getCommandStack().execute(
+			new draw2d.CommandSetText(this.figure, this.input.value));
+	this.workflow.removeFigure(this);
+};
+draw2d.PropertyWindow = function() {
+	this.currentSelection = null;
+	draw2d.WindowFigure.call(this, "Property Window");
+	this.setDimension(200, 100);
+};
+draw2d.PropertyWindow.prototype = new draw2d.WindowFigure();
+draw2d.PropertyWindow.prototype.type = "draw2d.PropertyWindow";
+draw2d.PropertyWindow.prototype.dispose = function() {
+	draw2d.WindowFigure.prototype.dispose.call(this);
+};
+draw2d.PropertyWindow.prototype.createHTMLElement = function() {
+	var item = draw2d.WindowFigure.prototype.createHTMLElement.call(this);
+	item.appendChild(this.createLabel("Type:", 15, 25));
+	item.appendChild(this.createLabel("X :", 15, 50));
+	item.appendChild(this.createLabel("Y :", 15, 70));
+	item.appendChild(this.createLabel("Width :", 85, 50));
+	item.appendChild(this.createLabel("Height :", 85, 70));
+	this.labelType = this.createLabel("", 50, 25);
+	this.labelX = this.createLabel("", 40, 50);
+	this.labelY = this.createLabel("", 40, 70);
+	this.labelWidth = this.createLabel("", 135, 50);
+	this.labelHeight = this.createLabel("", 135, 70);
+	this.labelType.style.fontWeight = "normal";
+	this.labelX.style.fontWeight = "normal";
+	this.labelY.style.fontWeight = "normal";
+	this.labelWidth.style.fontWeight = "normal";
+	this.labelHeight.style.fontWeight = "normal";
+	item.appendChild(this.labelType);
+	item.appendChild(this.labelX);
+	item.appendChild(this.labelY);
+	item.appendChild(this.labelWidth);
+	item.appendChild(this.labelHeight);
+	return item;
+};
+draw2d.PropertyWindow.prototype.onSelectionChanged = function(_4b56) {
+	draw2d.WindowFigure.prototype.onSelectionChanged.call(this, _4b56);
+	if (this.currentSelection !== null) {
+		this.currentSelection.detachMoveListener(this);
+	}
+	this.currentSelection = _4b56;
+	if (_4b56 !== null && _4b56 != this) {
+		this.labelType.innerHTML = _4b56.type;
+		if (_4b56.getX) {
+			this.labelX.innerHTML = _4b56.getX();
+			this.labelY.innerHTML = _4b56.getY();
+			this.labelWidth.innerHTML = _4b56.getWidth();
+			this.labelHeight.innerHTML = _4b56.getHeight();
+			this.currentSelection = _4b56;
+			this.currentSelection.attachMoveListener(this);
+		} else {
+			this.labelX.innerHTML = "";
+			this.labelY.innerHTML = "";
+			this.labelWidth.innerHTML = "";
+			this.labelHeight.innerHTML = "";
+		}
+	} else {
+		this.labelType.innerHTML = "&lt;none&gt;";
+		this.labelX.innerHTML = "";
+		this.labelY.innerHTML = "";
+		this.labelWidth.innerHTML = "";
+		this.labelHeight.innerHTML = "";
+	}
+};
+draw2d.PropertyWindow.prototype.getCurrentSelection = function() {
+	return this.currentSelection;
+};
+draw2d.PropertyWindow.prototype.onOtherFigureMoved = function(_4b57) {
+	if (_4b57 == this.currentSelection) {
+		this.onSelectionChanged(_4b57);
+	}
+};
+draw2d.PropertyWindow.prototype.createLabel = function(text, x, y) {
+	var l = document.createElement("div");
+	l.style.position = "absolute";
+	l.style.left = x + "px";
+	l.style.top = y + "px";
+	l.style.font = "normal 10px verdana";
+	l.style.whiteSpace = "nowrap";
+	l.style.fontWeight = "bold";
+	l.innerHTML = text;
+	return l;
+};
+draw2d.ColorDialog = function() {
+	this.maxValue = {
+		"h" : "359",
+		"s" : "100",
+		"v" : "100"
+	};
+	this.HSV = {
+		0 : 359,
+		1 : 100,
+		2 : 100
+	};
+	this.slideHSV = {
+		0 : 359,
+		1 : 100,
+		2 : 100
+	};
+	this.SVHeight = 165;
+	this.wSV = 162;
+	this.wH = 162;
+	draw2d.Dialog.call(this, "Color Chooser");
+	this.loadSV();
+	this.setColor(new draw2d.Color(255, 0, 0));
+	this.setDimension(219, 244);
+};
+draw2d.ColorDialog.prototype = new draw2d.Dialog();
+draw2d.ColorDialog.prototype.type = "draw2d.ColorDialog";
+draw2d.ColorDialog.prototype.createHTMLElement = function() {
+	var oThis = this;
+	var item = draw2d.Dialog.prototype.createHTMLElement.call(this);
+	this.outerDiv = document.createElement("div");
+	this.outerDiv.id = "plugin";
+	this.outerDiv.style.top = "15px";
+	this.outerDiv.style.left = "0px";
+	this.outerDiv.style.width = "201px";
+	this.outerDiv.style.position = "absolute";
+	this.outerDiv.style.padding = "9px";
+	this.outerDiv.display = "block";
+	this.outerDiv.style.background = "#0d0d0d";
+	this.plugHEX = document.createElement("div");
+	this.plugHEX.id = "plugHEX";
+	this.plugHEX.innerHTML = "F1FFCC";
+	this.plugHEX.style.color = "white";
+	this.plugHEX.style.font = "normal 10px verdana";
+	this.outerDiv.appendChild(this.plugHEX);
+	this.SV = document.createElement("div");
+	this.SV.onmousedown = function(event) {
+		oThis.mouseDownSV(oThis.SVslide, event);
+	};
+	this.SV.id = "SV";
+	this.SV.style.cursor = "crosshair";
+	this.SV.style.background = "#FF0000 url(SatVal.png)";
+	this.SV.style.position = "absolute";
+	this.SV.style.height = "166px";
+	this.SV.style.width = "167px";
+	this.SV.style.marginRight = "10px";
+	this.SV.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='SatVal.png', sizingMethod='scale')";
+	this.SV.style["float"] = "left";
+	this.outerDiv.appendChild(this.SV);
+	this.SVslide = document.createElement("div");
+	this.SVslide.onmousedown = function(event) {
+		oThis.mouseDownSV(event);
+	};
+	this.SVslide.style.top = "40px";
+	this.SVslide.style.left = "40px";
+	this.SVslide.style.position = "absolute";
+	this.SVslide.style.cursor = "crosshair";
+	this.SVslide.style.background = "url(slide.gif)";
+	this.SVslide.style.height = "9px";
+	this.SVslide.style.width = "9px";
+	this.SVslide.style.lineHeight = "1px";
+	this.outerDiv.appendChild(this.SVslide);
+	this.H = document.createElement("form");
+	this.H.id = "H";
+	this.H.onmousedown = function(event) {
+		oThis.mouseDownH(event);
+	};
+	this.H.style.border = "1px solid #000000";
+	this.H.style.cursor = "crosshair";
+	this.H.style.position = "absolute";
+	this.H.style.width = "19px";
+	this.H.style.top = "28px";
+	this.H.style.left = "191px";
+	this.outerDiv.appendChild(this.H);
+	this.Hslide = document.createElement("div");
+	this.Hslide.style.top = "-7px";
+	this.Hslide.style.left = "-8px";
+	this.Hslide.style.background = "url(slideHue.gif)";
+	this.Hslide.style.height = "5px";
+	this.Hslide.style.width = "33px";
+	this.Hslide.style.position = "absolute";
+	this.Hslide.style.lineHeight = "1px";
+	this.H.appendChild(this.Hslide);
+	this.Hmodel = document.createElement("div");
+	this.Hmodel.style.height = "1px";
+	this.Hmodel.style.width = "19px";
+	this.Hmodel.style.lineHeight = "1px";
+	this.Hmodel.style.margin = "0px";
+	this.Hmodel.style.padding = "0px";
+	this.Hmodel.style.fontSize = "1px";
+	this.H.appendChild(this.Hmodel);
+	item.appendChild(this.outerDiv);
+	return item;
+};
+draw2d.ColorDialog.prototype.onOk = function() {
+	draw2d.Dialog.prototype.onOk.call(this);
+};
+draw2d.browser = function(v) {
+	return (Math.max(navigator.userAgent.toLowerCase().indexOf(v), 0));
+};
+draw2d.ColorDialog.prototype.showColor = function(c) {
+	this.plugHEX.style.background = "#" + c;
+	this.plugHEX.innerHTML = c;
+};
+draw2d.ColorDialog.prototype.getSelectedColor = function() {
+	var rgb = this.hex2rgb(this.plugHEX.innerHTML);
+	return new draw2d.Color(rgb[0], rgb[1], rgb[2]);
+};
+draw2d.ColorDialog.prototype.setColor = function(color) {
+	if (color === null) {
+		color = new draw2d.Color(100, 100, 100);
+	}
+	var hex = this.rgb2hex(Array(color.getRed(), color.getGreen(), color
+			.getBlue()));
+	this.updateH(hex);
+};
+draw2d.ColorDialog.prototype.XY = function(e, v) {
+	var z = draw2d.browser("msie") ? Array(event.clientX
+			+ document.body.scrollLeft, event.clientY + document.body.scrollTop)
+			: Array(e.pageX, e.pageY);
+	return z[v];
+};
+draw2d.ColorDialog.prototype.mkHSV = function(a, b, c) {
+	return (Math.min(a, Math.max(0, Math.ceil((parseInt(c) / b) * a))));
+};
+draw2d.ColorDialog.prototype.ckHSV = function(a, b) {
+	if (a >= 0 && a <= b) {
+		return (a);
+	} else {
+		if (a > b) {
+			return (b);
+		} else {
+			if (a < 0) {
+				return ("-" + oo);
+			}
+		}
+	}
+};
+draw2d.ColorDialog.prototype.mouseDownH = function(e) {
+	this.slideHSV[0] = this.HSV[0];
+	var oThis = this;
+	this.H.onmousemove = function(e) {
+		oThis.dragH(e);
+	};
+	this.H.onmouseup = function(e) {
+		oThis.H.onmousemove = "";
+		oThis.H.onmouseup = "";
+	};
+	this.dragH(e);
+};
+draw2d.ColorDialog.prototype.dragH = function(e) {
+	var y = this.XY(e, 1) - this.getY() - 40;
+	this.Hslide.style.top = (this.ckHSV(y, this.wH) - 5) + "px";
+	this.slideHSV[0] = this.mkHSV(359, this.wH, this.Hslide.style.top);
+	this.updateSV();
+	this.showColor(this.commit());
+	this.SV.style.backgroundColor = "#"
+			+ this.hsv2hex(Array(this.HSV[0], 100, 100));
+};
+draw2d.ColorDialog.prototype.mouseDownSV = function(o, e) {
+	this.slideHSV[0] = this.HSV[0];
+	var oThis = this;
+	function reset() {
+		oThis.SV.onmousemove = "";
+		oThis.SV.onmouseup = "";
+		oThis.SVslide.onmousemove = "";
+		oThis.SVslide.onmouseup = "";
+	}
+	this.SV.onmousemove = function(e) {
+		oThis.dragSV(e);
+	};
+	this.SV.onmouseup = reset;
+	this.SVslide.onmousemove = function(e) {
+		oThis.dragSV(e);
+	};
+	this.SVslide.onmouseup = reset;
+	this.dragSV(e);
+};
+draw2d.ColorDialog.prototype.dragSV = function(e) {
+	var x = this.XY(e, 0) - this.getX() - 1;
+	var y = this.XY(e, 1) - this.getY() - 20;
+	this.SVslide.style.left = this.ckHSV(x, this.wSV) + "px";
+	this.SVslide.style.top = this.ckHSV(y, this.wSV) + "px";
+	this.slideHSV[1] = this.mkHSV(100, this.wSV, this.SVslide.style.left);
+	this.slideHSV[2] = 100 - this.mkHSV(100, this.wSV, this.SVslide.style.top);
+	this.updateSV();
+};
+draw2d.ColorDialog.prototype.commit = function() {
+	var r = "hsv";
+	var z = {};
+	var j = "";
+	for ( var i = 0; i <= r.length - 1; i++) {
+		j = r.substr(i, 1);
+		z[i] = (j == "h") ? this.maxValue[j]
+				- this.mkHSV(this.maxValue[j], this.wH, this.Hslide.style.top)
+				: this.HSV[i];
+	}
+	return (this.updateSV(this.hsv2hex(z)));
+};
+draw2d.ColorDialog.prototype.updateSV = function(v) {
+	this.HSV = v ? this.hex2hsv(v) : Array(this.slideHSV[0], this.slideHSV[1],
+			this.slideHSV[2]);
+	if (!v) {
+		v = this.hsv2hex(Array(this.slideHSV[0], this.slideHSV[1],
+				this.slideHSV[2]));
+	}
+	this.showColor(v);
+	return v;
+};
+draw2d.ColorDialog.prototype.loadSV = function() {
+	var z = "";
+	for ( var i = this.SVHeight; i >= 0; i--) {
+		z += "<div style=\"background:#"
+				+ this.hsv2hex(Array(Math.round((359 / this.SVHeight) * i),
+						100, 100)) + ";\"><br/></div>";
+	}
+	this.Hmodel.innerHTML = z;
+};
+draw2d.ColorDialog.prototype.updateH = function(v) {
+	this.plugHEX.innerHTML = v;
+	this.HSV = this.hex2hsv(v);
+	this.SV.style.backgroundColor = "#"
+			+ this.hsv2hex(Array(this.HSV[0], 100, 100));
+	this.SVslide.style.top = (parseInt(this.wSV - this.wSV
+			* (this.HSV[1] / 100)) + 20)
+			+ "px";
+	this.SVslide.style.left = (parseInt(this.wSV * (this.HSV[1] / 100)) + 5)
+			+ "px";
+	this.Hslide.style.top = (parseInt(this.wH
+			* ((this.maxValue["h"] - this.HSV[0]) / this.maxValue["h"])) - 7)
+			+ "px";
+};
+draw2d.ColorDialog.prototype.toHex = function(v) {
+	v = Math.round(Math.min(Math.max(0, v), 255));
+	return ("0123456789ABCDEF".charAt((v - v % 16) / 16) + "0123456789ABCDEF"
+			.charAt(v % 16));
+};
+draw2d.ColorDialog.prototype.hex2rgb = function(r) {
+	return ( {
+		0 : parseInt(r.substr(0, 2), 16),
+		1 : parseInt(r.substr(2, 2), 16),
+		2 : parseInt(r.substr(4, 2), 16)
+	});
+};
+draw2d.ColorDialog.prototype.rgb2hex = function(r) {
+	return (this.toHex(r[0]) + this.toHex(r[1]) + this.toHex(r[2]));
+};
+draw2d.ColorDialog.prototype.hsv2hex = function(h) {
+	return (this.rgb2hex(this.hsv2rgb(h)));
+};
+draw2d.ColorDialog.prototype.hex2hsv = function(v) {
+	return (this.rgb2hsv(this.hex2rgb(v)));
+};
+draw2d.ColorDialog.prototype.rgb2hsv = function(r) {
+	var max = Math.max(r[0], r[1], r[2]);
+	var delta = max - Math.min(r[0], r[1], r[2]);
+	var H;
+	var S;
+	var V;
+	if (max != 0) {
+		S = Math.round(delta / max * 100);
+		if (r[0] == max) {
+			H = (r[1] - r[2]) / delta;
+		} else {
+			if (r[1] == max) {
+				H = 2 + (r[2] - r[0]) / delta;
+			} else {
+				if (r[2] == max) {
+					H = 4 + (r[0] - r[1]) / delta;
+				}
+			}
+		}
+		var H = Math.min(Math.round(H * 60), 360);
+		if (H < 0) {
+			H += 360;
+		}
+	}
+	return ( {
+		0 : H ? H : 0,
+		1 : S ? S : 0,
+		2 : Math.round((max / 255) * 100)
+	});
+};
+draw2d.ColorDialog.prototype.hsv2rgb = function(r) {
+	var R;
+	var B;
+	var G;
+	var S = r[1] / 100;
+	var V = r[2] / 100;
+	var H = r[0] / 360;
+	if (S > 0) {
+		if (H >= 1) {
+			H = 0;
+		}
+		H = 6 * H;
+		F = H - Math.floor(H);
+		A = Math.round(255 * V * (1 - S));
+		B = Math.round(255 * V * (1 - (S * F)));
+		C = Math.round(255 * V * (1 - (S * (1 - F))));
+		V = Math.round(255 * V);
+		switch (Math.floor(H)) {
+		case 0:
+			R = V;
+			G = C;
+			B = A;
+			break;
+		case 1:
+			R = B;
+			G = V;
+			B = A;
+			break;
+		case 2:
+			R = A;
+			G = V;
+			B = C;
+			break;
+		case 3:
+			R = A;
+			G = B;
+			B = V;
+			break;
+		case 4:
+			R = C;
+			G = A;
+			B = V;
+			break;
+		case 5:
+			R = V;
+			G = A;
+			B = B;
+			break;
+		}
+		return ( {
+			0 : R ? R : 0,
+			1 : G ? G : 0,
+			2 : B ? B : 0
+		});
+	} else {
+		return ( {
+			0 : (V = Math.round(V * 255)),
+			1 : V,
+			2 : V
+		});
+	}
+};
+draw2d.LineColorDialog = function(_5a31) {
+	draw2d.ColorDialog.call(this);
+	this.figure = _5a31;
+	var color = _5a31.getColor();
+	this.updateH(this
+			.rgb2hex(color.getRed(), color.getGreen(), color.getBlue()));
+};
+draw2d.LineColorDialog.prototype = new draw2d.ColorDialog();
+draw2d.LineColorDialog.prototype.type = "draw2d.LineColorDialog";
+draw2d.LineColorDialog.prototype.onOk = function() {
+	var _5a33 = this.workflow;
+	draw2d.ColorDialog.prototype.onOk.call(this);
+	if (typeof this.figure.setColor == "function") {
+		_5a33.getCommandStack()
+				.execute(
+						new draw2d.CommandSetColor(this.figure, this
+								.getSelectedColor()));
+		if (_5a33.getCurrentSelection() == this.figure) {
+			_5a33.setCurrentSelection(this.figure);
+		}
+	}
+};
+draw2d.BackgroundColorDialog = function(_5b1b) {
+	draw2d.ColorDialog.call(this);
+	this.figure = _5b1b;
+	var color = _5b1b.getBackgroundColor();
+	if (color !== null) {
+		this.updateH(this.rgb2hex(color.getRed(), color.getGreen(), color
+				.getBlue()));
+	}
+};
+draw2d.BackgroundColorDialog.prototype = new draw2d.ColorDialog();
+draw2d.BackgroundColorDialog.prototype.type = "draw2d.BackgroundColorDialog";
+draw2d.BackgroundColorDialog.prototype.onOk = function() {
+	var _5b1d = this.workflow;
+	draw2d.ColorDialog.prototype.onOk.call(this);
+	if (typeof this.figure.setBackgroundColor == "function") {
+		_5b1d.getCommandStack().execute(
+				new draw2d.CommandSetBackgroundColor(this.figure, this
+						.getSelectedColor()));
+		if (_5b1d.getCurrentSelection() == this.figure) {
+			_5b1d.setCurrentSelection(this.figure);
+		}
+	}
+};
+draw2d.AnnotationDialog = function(_57df) {
+	this.figure = _57df;
+	draw2d.Dialog.call(this);
+	this.setDimension(400, 100);
+};
+draw2d.AnnotationDialog.prototype = new draw2d.Dialog();
+draw2d.AnnotationDialog.prototype.type = "draw2d.AnnotationDialog";
+draw2d.AnnotationDialog.prototype.createHTMLElement = function() {
+	var item = draw2d.Dialog.prototype.createHTMLElement.call(this);
+	var _57e1 = document.createElement("form");
+	_57e1.style.position = "absolute";
+	_57e1.style.left = "10px";
+	_57e1.style.top = "30px";
+	_57e1.style.width = "375px";
+	_57e1.style.font = "normal 10px verdana";
+	item.appendChild(_57e1);
+	this.label = document.createTextNode("Text");
+	_57e1.appendChild(this.label);
+	this.input = document.createElement("input");
+	this.input.style.border = "1px solid gray";
+	this.input.style.font = "normal 10px verdana";
+	this.input.type = "text";
+	var value = this.figure.getText();
+	if (value) {
+		this.input.value = value;
+	} else {
+		this.input.value = "";
+	}
+	this.input.style.width = "100%";
+	_57e1.appendChild(this.input);
+	this.input.focus();
+	return item;
+};
+draw2d.AnnotationDialog.prototype.onOk = function() {
+	this.workflow.getCommandStack().execute(
+			new draw2d.CommandSetText(this.figure, this.input.value));
+	this.workflow.removeFigure(this);
+};
+draw2d.Command = function(label) {
+	this.label = label;
+};
+draw2d.Command.prototype.type = "draw2d.Command";
+draw2d.Command.prototype.getLabel = function() {
+	return this.label;
+};
+draw2d.Command.prototype.canExecute = function() {
+	return true;
+};
+draw2d.Command.prototype.execute = function() {
+};
+draw2d.Command.prototype.cancel = function() {
+};
+draw2d.Command.prototype.undo = function() {
+};
+draw2d.Command.prototype.redo = function() {
+};
+draw2d.CommandStack = function() {
+	this.undostack = [];
+	this.redostack = [];
+	this.maxundo = 50;
+	this.eventListeners = new draw2d.ArrayList();
+};
+draw2d.CommandStack.PRE_EXECUTE = 1;
+draw2d.CommandStack.PRE_REDO = 2;
+draw2d.CommandStack.PRE_UNDO = 4;
+draw2d.CommandStack.POST_EXECUTE = 8;
+draw2d.CommandStack.POST_REDO = 16;
+draw2d.CommandStack.POST_UNDO = 32;
+draw2d.CommandStack.POST_MASK = draw2d.CommandStack.POST_EXECUTE
+		| draw2d.CommandStack.POST_UNDO | draw2d.CommandStack.POST_REDO;
+draw2d.CommandStack.PRE_MASK = draw2d.CommandStack.PRE_EXECUTE
+		| draw2d.CommandStack.PRE_UNDO | draw2d.CommandStack.PRE_REDO;
+draw2d.CommandStack.prototype.type = "draw2d.CommandStack";
+draw2d.CommandStack.prototype.setUndoLimit = function(count) {
+	this.maxundo = count;
+};
+draw2d.CommandStack.prototype.markSaveLocation = function() {
+	this.undostack = [];
+	this.redostack = [];
+};
+draw2d.CommandStack.prototype.execute = function(_5577) {
+	if (_5577 === null) {
+		return;
+	}
+	if (_5577.canExecute() == false) {
+		return;
+	}
+	this.notifyListeners(_5577, draw2d.CommandStack.PRE_EXECUTE);
+	this.undostack.push(_5577);
+	_5577.execute();
+	this.redostack = [];
+	if (this.undostack.length > this.maxundo) {
+		this.undostack = this.undostack.slice(this.undostack.length
+				- this.maxundo);
+	}
+	this.notifyListeners(_5577, draw2d.CommandStack.POST_EXECUTE);
+};
+draw2d.CommandStack.prototype.undo = function() {
+	var _5578 = this.undostack.pop();
+	if (_5578) {
+		this.notifyListeners(_5578, draw2d.CommandStack.PRE_UNDO);
+		this.redostack.push(_5578);
+		_5578.undo();
+		this.notifyListeners(_5578, draw2d.CommandStack.POST_UNDO);
+	}
+};
+draw2d.CommandStack.prototype.redo = function() {
+	var _5579 = this.redostack.pop();
+	if (_5579) {
+		this.notifyListeners(_5579, draw2d.CommandStack.PRE_REDO);
+		this.undostack.push(_5579);
+		_5579.redo();
+		this.notifyListeners(_5579, draw2d.CommandStack.POST_REDO);
+	}
+};
+draw2d.CommandStack.prototype.canRedo = function() {
+	return this.redostack.length > 0;
+};
+draw2d.CommandStack.prototype.canUndo = function() {
+	return this.undostack.length > 0;
+};
+draw2d.CommandStack.prototype.addCommandStackEventListener = function(_557a) {
+	this.eventListeners.add(_557a);
+};
+draw2d.CommandStack.prototype.removeCommandStackEventListener = function(_557b) {
+	this.eventListeners.remove(_557b);
+};
+draw2d.CommandStack.prototype.notifyListeners = function(_557c, state) {
+	var event = new draw2d.CommandStackEvent(_557c, state);
+	var size = this.eventListeners.getSize();
+	for ( var i = 0; i < size; i++) {
+		this.eventListeners.get(i).stackChanged(event);
+	}
+};
+draw2d.CommandStackEvent = function(_507a, _507b) {
+	this.command = _507a;
+	this.details = _507b;
+};
+draw2d.CommandStackEvent.prototype.type = "draw2d.CommandStackEvent";
+draw2d.CommandStackEvent.prototype.getCommand = function() {
+	return this.command;
+};
+draw2d.CommandStackEvent.prototype.getDetails = function() {
+	return this.details;
+};
+draw2d.CommandStackEvent.prototype.isPostChangeEvent = function() {
+	return 0 != (this.getDetails() & draw2d.CommandStack.POST_MASK);
+};
+draw2d.CommandStackEvent.prototype.isPreChangeEvent = function() {
+	return 0 != (this.getDetails() & draw2d.CommandStack.PRE_MASK);
+};
+draw2d.CommandStackEventListener = function() {
+};
+draw2d.CommandStackEventListener.prototype.type = "draw2d.CommandStackEventListener";
+draw2d.CommandStackEventListener.prototype.stackChanged = function(event) {
+};
+draw2d.CommandAdd = function(_58b8, _58b9, x, y, _58bc) {
+	draw2d.Command.call(this, "add figure");
+	if (_58bc === undefined) {
+		_58bc = null;
+	}
+	this.parent = _58bc;
+	this.figure = _58b9;
+	this.x = x;
+	this.y = y;
+	this.workflow = _58b8;
+};
+draw2d.CommandAdd.prototype = new draw2d.Command();
+draw2d.CommandAdd.prototype.type = "draw2d.CommandAdd";
+draw2d.CommandAdd.prototype.execute = function() {
+	this.redo();
+};
+draw2d.CommandAdd.prototype.redo = function() {
+	if (this.x && this.y) {
+		this.workflow.addFigure(this.figure, this.x, this.y);
+	} else {
+		this.workflow.addFigure(this.figure);
+	}
+	this.workflow.setCurrentSelection(this.figure);
+	if (this.parent !== null) {
+		this.parent.addChild(this.figure);
+	}
+};
+draw2d.CommandAdd.prototype.undo = function() {
+	this.workflow.removeFigure(this.figure);
+	this.workflow.setCurrentSelection(null);
+	if (this.parent !== null) {
+		this.parent.removeChild(this.figure);
+	}
+};
+draw2d.CommandDelete = function(_553a) {
+	draw2d.Command.call(this, "delete figure");
+	this.parent = _553a.parent;
+	this.figure = _553a;
+	this.workflow = _553a.workflow;
+	this.connections = null;
+	this.compartmentDeleteCommands = null;
+};
+draw2d.CommandDelete.prototype = new draw2d.Command();
+draw2d.CommandDelete.prototype.type = "draw2d.CommandDelete";
+draw2d.CommandDelete.prototype.execute = function() {
+	this.redo();
+};
+draw2d.CommandDelete.prototype.undo = function() {
+	if (this.figure instanceof draw2d.CompartmentFigure) {
+		for ( var i = 0; i < this.compartmentDeleteCommands.getSize(); i++) {
+			var _553c = this.compartmentDeleteCommands.get(i);
+			this.figure.addChild(_553c.figure);
+			this.workflow.getCommandStack().undo();
+		}
+	}
+	this.workflow.addFigure(this.figure);
+	if (this.figure instanceof draw2d.Connection) {
+		this.figure.reconnect();
+	}
+	this.workflow.setCurrentSelection(this.figure);
+	if (this.parent !== null) {
+		this.parent.addChild(this.figure);
+	}
+	for ( var i = 0; i < this.connections.getSize(); ++i) {
+		this.workflow.addFigure(this.connections.get(i));
+		this.connections.get(i).reconnect();
+	}
+};
+draw2d.CommandDelete.prototype.redo = function() {
+	if (this.figure instanceof draw2d.CompartmentFigure) {
+		if (this.compartmentDeleteCommands === null) {
+			this.compartmentDeleteCommands = new draw2d.ArrayList();
+			var _553d = this.figure.getChildren().clone();
+			for ( var i = 0; i < _553d.getSize(); i++) {
+				var child = _553d.get(i);
+				this.figure.removeChild(child);
+				var _5540 = new draw2d.CommandDelete(child);
+				this.compartmentDeleteCommands.add(_5540);
+				this.workflow.getCommandStack().execute(_5540);
+			}
+		} else {
+			for ( var i = 0; i < this.compartmentDeleteCommands.getSize(); i++) {
+				this.workflow.redo();
+			}
+		}
+	}
+	this.workflow.removeFigure(this.figure);
+	this.workflow.setCurrentSelection(null);
+	if (this.figure instanceof draw2d.Node && this.connections === null) {
+		this.connections = new draw2d.ArrayList();
+		var ports = this.figure.getPorts();
+		for ( var i = 0; i < ports.getSize(); i++) {
+			var port = ports.get(i);
+			for ( var c = 0, c_size = port.getConnections().getSize(); c < c_size; c++) {
+				if (!this.connections.contains(port.getConnections().get(c))) {
+					this.connections.add(port.getConnections().get(c));
+				}
+			}
+		}
+	}
+	if (this.connections === null) {
+		this.connections = new draw2d.ArrayList();
+	}
+	if (this.parent !== null) {
+		this.parent.removeChild(this.figure);
+	}
+	for ( var i = 0; i < this.connections.getSize(); ++i) {
+		this.workflow.removeFigure(this.connections.get(i));
+	}
+};
+draw2d.CommandMove = function(_4fff, x, y) {
+	draw2d.Command.call(this, "move figure");
+	this.figure = _4fff;
+	if (x == undefined) {
+		this.oldX = _4fff.getX();
+		this.oldY = _4fff.getY();
+	} else {
+		this.oldX = x;
+		this.oldY = y;
+	}
+	this.oldCompartment = _4fff.getParent();
+};
+draw2d.CommandMove.prototype = new draw2d.Command();
+draw2d.CommandMove.prototype.type = "draw2d.CommandMove";
+draw2d.CommandMove.prototype.setStartPosition = function(x, y) {
+	this.oldX = x;
+	this.oldY = y;
+};
+draw2d.CommandMove.prototype.setPosition = function(x, y) {
+	this.newX = x;
+	this.newY = y;
+	this.newCompartment = this.figure.workflow.getBestCompartmentFigure(x, y,
+			this.figure);
+};
+draw2d.CommandMove.prototype.canExecute = function() {
+	return this.newX != this.oldX || this.newY != this.oldY;
+};
+draw2d.CommandMove.prototype.execute = function() {
+	this.redo();
+};
+draw2d.CommandMove.prototype.undo = function() {
+	this.figure.setPosition(this.oldX, this.oldY);
+	if (this.newCompartment !== null) {
+		this.newCompartment.removeChild(this.figure);
+	}
+	if (this.oldCompartment !== null) {
+		this.oldCompartment.addChild(this.figure);
+	}
+	this.figure.workflow.moveResizeHandles(this.figure);
+};
+draw2d.CommandMove.prototype.redo = function() {
+	this.figure.setPosition(this.newX, this.newY);
+	if (this.oldCompartment !== null) {
+		this.oldCompartment.removeChild(this.figure);
+	}
+	if (this.newCompartment !== null) {
+		this.newCompartment.addChild(this.figure);
+	}
+	this.figure.workflow.moveResizeHandles(this.figure);
+};
+draw2d.CommandResize = function(_5570, width, _5572) {
+	draw2d.Command.call(this, "resize figure");
+	this.figure = _5570;
+	if (width === undefined) {
+		this.oldWidth = _5570.getWidth();
+		this.oldHeight = _5570.getHeight();
+	} else {
+		this.oldWidth = width;
+		this.oldHeight = _5572;
+	}
+};
+draw2d.CommandResize.prototype = new draw2d.Command();
+draw2d.CommandResize.prototype.type = "draw2d.CommandResize";
+draw2d.CommandResize.prototype.setDimension = function(width, _5574) {
+	this.newWidth = width;
+	this.newHeight = _5574;
+};
+draw2d.CommandResize.prototype.canExecute = function() {
+	return this.newWidth != this.oldWidth || this.newHeight != this.oldHeight;
+};
+draw2d.CommandResize.prototype.execute = function() {
+	this.redo();
+};
+draw2d.CommandResize.prototype.undo = function() {
+	this.figure.setDimension(this.oldWidth, this.oldHeight);
+	this.figure.workflow.moveResizeHandles(this.figure);
+};
+draw2d.CommandResize.prototype.redo = function() {
+	this.figure.setDimension(this.newWidth, this.newHeight);
+	this.figure.workflow.moveResizeHandles(this.figure);
+};
+draw2d.CommandSetText = function(_5771, text) {
+	draw2d.Command.call(this, "set text");
+	this.figure = _5771;
+	this.newText = text;
+	this.oldText = _5771.getText();
+};
+draw2d.CommandSetText.prototype = new draw2d.Command();
+draw2d.CommandSetText.prototype.type = "draw2d.CommandSetText";
+draw2d.CommandSetText.prototype.execute = function() {
+	this.redo();
+};
+draw2d.CommandSetText.prototype.redo = function() {
+	this.figure.setText(this.newText);
+};
+draw2d.CommandSetText.prototype.undo = function() {
+	this.figure.setText(this.oldText);
+};
+draw2d.CommandSetColor = function(_5581, color) {
+	draw2d.Command.call(this, "set color");
+	this.figure = _5581;
+	this.newColor = color;
+	this.oldColor = _5581.getColor();
+};
+draw2d.CommandSetColor.prototype = new draw2d.Command();
+draw2d.CommandSetColor.prototype.type = "draw2d.CommandSetColor";
+draw2d.CommandSetColor.prototype.execute = function() {
+	this.redo();
+};
+draw2d.CommandSetColor.prototype.undo = function() {
+	this.figure.setColor(this.oldColor);
+};
+draw2d.CommandSetColor.prototype.redo = function() {
+	this.figure.setColor(this.newColor);
+};
+draw2d.CommandSetBackgroundColor = function(_572e, color) {
+	draw2d.Command.call(this, "set background color");
+	this.figure = _572e;
+	this.newColor = color;
+	this.oldColor = _572e.getBackgroundColor();
+};
+draw2d.CommandSetBackgroundColor.prototype = new draw2d.Command();
+draw2d.CommandSetBackgroundColor.prototype.type = "draw2d.CommandSetBackgroundColor";
+draw2d.CommandSetBackgroundColor.prototype.execute = function() {
+	this.redo();
+};
+draw2d.CommandSetBackgroundColor.prototype.undo = function() {
+	this.figure.setBackgroundColor(this.oldColor);
+};
+draw2d.CommandSetBackgroundColor.prototype.redo = function() {
+	this.figure.setBackgroundColor(this.newColor);
+};
+draw2d.CommandConnect = function(_5951, _5952, _5953) {
+	draw2d.Command.call(this, "create connection");
+	this.workflow = _5951;
+	this.source = _5952;
+	this.target = _5953;
+	this.connection = null;
+};
+draw2d.CommandConnect.prototype = new draw2d.Command();
+draw2d.CommandConnect.prototype.type = "draw2d.CommandConnect";
+draw2d.CommandConnect.prototype.setConnection = function(_5954) {
+	this.connection = _5954;
+};
+draw2d.CommandConnect.prototype.execute = function() {
+	if (this.connection === null) {
+		this.connection = new draw2d.Connection();
+	}
+	this.connection.setSource(this.source);
+	this.connection.setTarget(this.target);
+	this.workflow.addFigure(this.connection);
+};
+draw2d.CommandConnect.prototype.redo = function() {
+	this.workflow.addFigure(this.connection);
+	this.connection.reconnect();
+};
+draw2d.CommandConnect.prototype.undo = function() {
+	this.workflow.removeFigure(this.connection);
+};
+draw2d.CommandReconnect = function(con) {
+	draw2d.Command.call(this, "reconnect connection");
+	this.con = con;
+	this.oldSourcePort = con.getSource();
+	this.oldTargetPort = con.getTarget();
+	this.oldRouter = con.getRouter();
+	this.con.setRouter(new draw2d.NullConnectionRouter());
+};
+draw2d.CommandReconnect.prototype = new draw2d.Command();
+draw2d.CommandReconnect.prototype.type = "draw2d.CommandReconnect";
+draw2d.CommandReconnect.prototype.canExecute = function() {
+	return true;
+};
+draw2d.CommandReconnect.prototype.setNewPorts = function(_5584, _5585) {
+	this.newSourcePort = _5584;
+	this.newTargetPort = _5585;
+};
+draw2d.CommandReconnect.prototype.execute = function() {
+	this.redo();
+};
+draw2d.CommandReconnect.prototype.cancel = function() {
+	var start = this.con.sourceAnchor.getLocation(this.con.targetAnchor
+			.getReferencePoint());
+	var end = this.con.targetAnchor.getLocation(this.con.sourceAnchor
+			.getReferencePoint());
+	this.con.setStartPoint(start.x, start.y);
+	this.con.setEndPoint(end.x, end.y);
+	this.con.getWorkflow().showLineResizeHandles(this.con);
+	this.con.setRouter(this.oldRouter);
+};
+draw2d.CommandReconnect.prototype.undo = function() {
+	this.con.setSource(this.oldSourcePort);
+	this.con.setTarget(this.oldTargetPort);
+	this.con.setRouter(this.oldRouter);
+	if (this.con.getWorkflow().getCurrentSelection() == this.con) {
+		this.con.getWorkflow().showLineResizeHandles(this.con);
+	}
+};
+draw2d.CommandReconnect.prototype.redo = function() {
+	this.con.setSource(this.newSourcePort);
+	this.con.setTarget(this.newTargetPort);
+	this.con.setRouter(this.oldRouter);
+	if (this.con.getWorkflow().getCurrentSelection() == this.con) {
+		this.con.getWorkflow().showLineResizeHandles(this.con);
+	}
+};
+draw2d.CommandMoveLine = function(line, _57a3, _57a4, endX, endY) {
+	draw2d.Command.call(this, "move line");
+	this.line = line;
+	this.startX1 = _57a3;
+	this.startY1 = _57a4;
+	this.endX1 = endX;
+	this.endY1 = endY;
+};
+draw2d.CommandMoveLine.prototype = new draw2d.Command();
+draw2d.CommandMoveLine.prototype.type = "draw2d.CommandMoveLine";
+draw2d.CommandMoveLine.prototype.canExecute = function() {
+	return this.startX1 != this.startX2 || this.startY1 != this.startY2
+			|| this.endX1 != this.endX2 || this.endY1 != this.endY2;
+};
+draw2d.CommandMoveLine.prototype.execute = function() {
+	this.startX2 = this.line.getStartX();
+	this.startY2 = this.line.getStartY();
+	this.endX2 = this.line.getEndX();
+	this.endY2 = this.line.getEndY();
+	this.redo();
+};
+draw2d.CommandMoveLine.prototype.undo = function() {
+	this.line.setStartPoint(this.startX1, this.startY1);
+	this.line.setEndPoint(this.endX1, this.endY1);
+	if (this.line.workflow.getCurrentSelection() == this.line) {
+		this.line.workflow.showLineResizeHandles(this.line);
+	}
+};
+draw2d.CommandMoveLine.prototype.redo = function() {
+	this.line.setStartPoint(this.startX2, this.startY2);
+	this.line.setEndPoint(this.endX2, this.endY2);
+	if (this.line.workflow.getCurrentSelection() == this.line) {
+		this.line.workflow.showLineResizeHandles(this.line);
+	}
+};
+draw2d.CommandMovePort = function(port) {
+	draw2d.Command.call(this, "move port");
+	this.port = port;
+};
+draw2d.CommandMovePort.prototype = new draw2d.Command();
+draw2d.CommandMovePort.prototype.type = "draw2d.CommandMovePort";
+draw2d.CommandMovePort.prototype.execute = function() {
+	this.port.setAlpha(1);
+	this.port.setPosition(this.port.originX, this.port.originY);
+	this.port.parentNode.workflow.hideConnectionLine();
+};
+draw2d.CommandMovePort.prototype.undo = function() {
+};
+draw2d.CommandMovePort.prototype.redo = function() {
+};
+draw2d.CommandMovePort.prototype.setPosition = function(x, y) {
+};
+draw2d.Menu = function() {
+	this.menuItems = new draw2d.ArrayList();
+	draw2d.Figure.call(this);
+	this.setSelectable(false);
+	this.setDeleteable(false);
+	this.setCanDrag(false);
+	this.setResizeable(false);
+	this.setSelectable(false);
+	this.setZOrder(10000);
+	this.dirty = false;
+};
+draw2d.Menu.prototype = new draw2d.Figure();
+draw2d.Menu.prototype.type = "draw2d.Menu";
+draw2d.Menu.prototype.createHTMLElement = function() {
+	var item = document.createElement("div");
+	item.style.position = "absolute";
+	item.style.left = this.x + "px";
+	item.style.top = this.y + "px";
+	item.style.margin = "0px";
+	item.style.padding = "0px";
+	item.style.zIndex = "" + draw2d.Figure.ZOrderBaseIndex;
+	item.style.border = "1px solid gray";
+	item.style.background = "lavender";
+	item.style.cursor = "pointer";
+	item.style.width = "auto";
+	item.style.height = "auto";
+	item.className = "Menu";
+	return item;
+};
+draw2d.Menu.prototype.setWorkflow = function(_5085) {
+	this.workflow = _5085;
+};
+draw2d.Menu.prototype.setDimension = function(w, h) {
+};
+draw2d.Menu.prototype.appendMenuItem = function(item) {
+	this.menuItems.add(item);
+	item.parentMenu = this;
+	this.dirty = true;
+};
+draw2d.Menu.prototype.getHTMLElement = function() {
+	var html = draw2d.Figure.prototype.getHTMLElement.call(this);
+	if (this.dirty) {
+		this.createList();
+	}
+	return html;
+};
+draw2d.Menu.prototype.createList = function() {
+	this.dirty = false;
+	this.html.innerHTML = "";
+	var oThis = this;
+	for ( var i = 0; i < this.menuItems.getSize(); i++) {
+		var item = this.menuItems.get(i);
+		var li = document.createElement("a");
+		li.innerHTML = item.getLabel();
+		li.style.display = "block";
+		li.style.fontFamily = "Verdana, Arial, Helvetica, sans-serif";
+		li.style.fontSize = "9pt";
+		li.style.color = "dimgray";
+		li.style.borderBottom = "1px solid silver";
+		li.style.paddingLeft = "5px";
+		li.style.paddingRight = "5px";
+		li.style.whiteSpace = "nowrap";
+		li.style.cursor = "pointer";
+		li.className = "MenuItem";
+		this.html.appendChild(li);
+		li.menuItem = item;
+		if (li.addEventListener) {
+			li.addEventListener("click", function(event) {
+				var _508f = arguments[0] || window.event;
+				_508f.cancelBubble = true;
+				_508f.returnValue = false;
+				var diffX = _508f.clientX;
+				var diffY = _508f.clientY;
+				var _5092 = document.body.parentNode.scrollLeft;
+				var _5093 = document.body.parentNode.scrollTop;
+				this.menuItem.execute(diffX + _5092, diffY + _5093);
+			}, false);
+			li.addEventListener("mouseup", function(event) {
+				event.cancelBubble = true;
+				event.returnValue = false;
+			}, false);
+			li.addEventListener("mousedown", function(event) {
+				event.cancelBubble = true;
+				event.returnValue = false;
+			}, false);
+			li.addEventListener("mouseover", function(event) {
+				this.style.backgroundColor = "silver";
+			}, false);
+			li.addEventListener("mouseout", function(event) {
+				this.style.backgroundColor = "transparent";
+			}, false);
+		} else {
+			if (li.attachEvent) {
+				li.attachEvent("onclick", function(event) {
+					var _5099 = arguments[0] || window.event;
+					_5099.cancelBubble = true;
+					_5099.returnValue = false;
+					var diffX = _5099.clientX;
+					var diffY = _5099.clientY;
+					var _509c = document.body.parentNode.scrollLeft;
+					var _509d = document.body.parentNode.scrollTop;
+					event.srcElement.menuItem.execute(diffX + _509c, diffY
+							+ _509d);
+				});
+				li.attachEvent("onmousedown", function(event) {
+					event.cancelBubble = true;
+					event.returnValue = false;
+				});
+				li.attachEvent("onmouseup", function(event) {
+					event.cancelBubble = true;
+					event.returnValue = false;
+				});
+				li.attachEvent("onmouseover", function(event) {
+					event.srcElement.style.backgroundColor = "silver";
+				});
+				li.attachEvent("onmouseout", function(event) {
+					event.srcElement.style.backgroundColor = "transparent";
+				});
+			}
+		}
+	}
+};
+draw2d.MenuItem = function(label, _4f03, _4f04) {
+	this.label = label;
+	this.iconUrl = _4f03;
+	this.parentMenu = null;
+	this.action = _4f04;
+};
+draw2d.MenuItem.prototype.type = "draw2d.MenuItem";
+draw2d.MenuItem.prototype.isEnabled = function() {
+	return true;
+};
+draw2d.MenuItem.prototype.getLabel = function() {
+	return this.label;
+};
+draw2d.MenuItem.prototype.execute = function(x, y) {
+	this.parentMenu.workflow.showMenu(null);
+	this.action(x, y);
+};
+draw2d.Locator = function() {
+};
+draw2d.Locator.prototype.type = "draw2d.Locator";
+draw2d.Locator.prototype.relocate = function(_5077) {
+};
+draw2d.ConnectionLocator = function(_57d5) {
+	draw2d.Locator.call(this);
+	this.connection = _57d5;
+};
+draw2d.ConnectionLocator.prototype = new draw2d.Locator;
+draw2d.ConnectionLocator.prototype.type = "draw2d.ConnectionLocator";
+draw2d.ConnectionLocator.prototype.getConnection = function() {
+	return this.connection;
+};
+draw2d.ManhattanMidpointLocator = function(_603c) {
+	draw2d.ConnectionLocator.call(this, _603c);
+};
+draw2d.ManhattanMidpointLocator.prototype = new draw2d.ConnectionLocator;
+draw2d.ManhattanMidpointLocator.prototype.type = "draw2d.ManhattanMidpointLocator";
+draw2d.ManhattanMidpointLocator.prototype.relocate = function(_603d) {
+	var conn = this.getConnection();
+	var p = new draw2d.Point();
+	var _6040 = conn.getPoints();
+	var index = Math.floor((_6040.getSize() - 2) / 2);
+	if (_6040.getSize() <= index + 1) {
+		return;
+	}
+	var p1 = _6040.get(index);
+	var p2 = _6040.get(index + 1);
+	p.x = (p2.x - p1.x) / 2 + p1.x + 5;
+	p.y = (p2.y - p1.y) / 2 + p1.y + 5;
+	_603d.setPosition(p.x, p.y);
+};
+draw2d.EditPartFactory = function() {
+};
+draw2d.EditPartFactory.prototype.type = "draw2d.EditPartFactory";
+draw2d.EditPartFactory.prototype.createEditPart = function(model) {
+};
+draw2d.AbstractObjectModel = function() {
+	this.listeners = new draw2d.ArrayList();
+	this.id = draw2d.UUID.create();
+};
+draw2d.AbstractObjectModel.EVENT_ELEMENT_ADDED = "element added";
+draw2d.AbstractObjectModel.EVENT_ELEMENT_REMOVED = "element removed";
+draw2d.AbstractObjectModel.EVENT_CONNECTION_ADDED = "connection addedx";
+draw2d.AbstractObjectModel.EVENT_CONNECTION_REMOVED = "connection removed";
+draw2d.AbstractObjectModel.prototype.type = "draw2d.AbstractObjectModel";
+draw2d.AbstractObjectModel.prototype.getModelChildren = function() {
+	return new draw2d.ArrayList();
+};
+draw2d.AbstractObjectModel.prototype.getModelParent = function() {
+	return this.modelParent;
+};
+draw2d.AbstractObjectModel.prototype.setModelParent = function(_555f) {
+	this.modelParent = _555f;
+};
+draw2d.AbstractObjectModel.prototype.getId = function() {
+	return this.id;
+};
+draw2d.AbstractObjectModel.prototype.firePropertyChange = function(_5560,
+		_5561, _5562) {
+	var count = this.listeners.getSize();
+	if (count === 0) {
+		return;
+	}
+	var event = new draw2d.PropertyChangeEvent(this, _5560, _5561, _5562);
+	for ( var i = 0; i < count; i++) {
+		try {
+			this.listeners.get(i).propertyChange(event);
+		} catch (e) {
+			alert("Method: draw2d.AbstractObjectModel.prototype.firePropertyChange\n"
+					+ e
+					+ "\nProperty: "
+					+ _5560
+					+ "\nListener Class:"
+					+ this.listeners.get(i).type);
+		}
+	}
+};
+draw2d.AbstractObjectModel.prototype.addPropertyChangeListener = function(_5566) {
+	if (_5566 !== null) {
+		this.listeners.add(_5566);
+	}
+};
+draw2d.AbstractObjectModel.prototype.removePropertyChangeListener = function(
+		_5567) {
+	if (_5567 !== null) {
+		this.listeners.remove(_5567);
+	}
+};
+draw2d.AbstractObjectModel.prototype.getPersistentAttributes = function() {
+	return {
+		id : this.id
+	};
+};
+draw2d.AbstractConnectionModel = function() {
+	draw2d.AbstractObjectModel.call(this);
+};
+draw2d.AbstractConnectionModel.prototype = new draw2d.AbstractObjectModel();
+draw2d.AbstractConnectionModel.prototype.type = "draw2d.AbstractConnectionModel";
+draw2d.AbstractConnectionModel.prototype.getSourceModel = function() {
+	throw "you must override the method [AbstractConnectionModel.prototype.getSourceModel]";
+};
+draw2d.AbstractConnectionModel.prototype.getTargetModel = function() {
+	throw "you must override the method [AbstractConnectionModel.prototype.getTargetModel]";
+};
+draw2d.AbstractConnectionModel.prototype.getSourcePortName = function() {
+	throw "you must override the method [AbstractConnectionModel.prototype.getSourcePortName]";
+};
+draw2d.AbstractConnectionModel.prototype.getTargetPortName = function() {
+	throw "you must override the method [AbstractConnectionModel.prototype.getTargetPortName]";
+};
+draw2d.AbstractConnectionModel.prototype.getSourcePortModel = function() {
+	throw "you must override the method [AbstractConnectionModel.prototype.getSourcePortModel]";
+};
+draw2d.AbstractConnectionModel.prototype.getTargetPortModel = function() {
+	throw "you must override the method [AbstractConnectionModel.prototype.getTargetPortModel]";
+};
+draw2d.PropertyChangeEvent = function(model, _5919, _591a, _591b) {
+	this.model = model;
+	this.property = _5919;
+	this.oldValue = _591a;
+	this.newValue = _591b;
+};
+draw2d.PropertyChangeEvent.prototype.type = "draw2d.PropertyChangeEvent";
+draw2d.GraphicalViewer = function(id) {
+	try {
+		draw2d.Workflow.call(this, id);
+		this.factory = null;
+		this.model = null;
+		this.initDone = false;
+	} catch (e) {
+		pushErrorStack(e, "draw2d.GraphicalViewer=function(/*:String*/ id)");
+	}
+};
+draw2d.GraphicalViewer.prototype = new draw2d.Workflow();
+draw2d.GraphicalViewer.prototype.type = "draw2d.GraphicalViewer";
+draw2d.GraphicalViewer.prototype.setEditPartFactory = function(_56c3) {
+	this.factory = _56c3;
+	this.checkInit();
+};
+draw2d.GraphicalViewer.prototype.setModel = function(model) {
+	try {
+		if (model instanceof draw2d.AbstractObjectModel) {
+			this.model = model;
+			this.checkInit();
+			this.model.addPropertyChangeListener(this);
+		} else {
+			alert("Invalid model class type:" + model.type);
+		}
+	} catch (e) {
+		pushErrorStack(
+				e,
+				"draw2d.GraphicalViewer.prototype.setModel=function(/*:draw2d.AbstractObjectModel*/ model )");
+	}
+};
+draw2d.GraphicalViewer.prototype.propertyChange = function(event) {
+	switch (event.property) {
+	case draw2d.AbstractObjectModel.EVENT_ELEMENT_REMOVED:
+		var _56c6 = this.getFigure(event.oldValue.getId());
+		this.removeFigure(_56c6);
+		break;
+	case draw2d.AbstractObjectModel.EVENT_ELEMENT_ADDED:
+		var _56c6 = this.factory.createEditPart(event.newValue);
+		_56c6.setId(event.newValue.getId());
+		this.addFigure(_56c6);
+		this.setCurrentSelection(_56c6);
+		break;
+	}
+};
+draw2d.GraphicalViewer.prototype.checkInit = function() {
+	if (this.factory !== null && this.model !== null && this.initDone == false) {
+		try {
+			var _56c7 = this.model.getModelChildren();
+			var count = _56c7.getSize();
+			for ( var i = 0; i < count; i++) {
+				var child = _56c7.get(i);
+				var _56cb = this.factory.createEditPart(child);
+				_56cb.setId(child.getId());
+				this.addFigure(_56cb);
+			}
+		} catch (e) {
+			pushErrorStack(e,
+					"draw2d.GraphicalViewer.prototype.checkInit=function()[addFigures]");
+		}
+		try {
+			var _56cc = this.getDocument().getFigures();
+			var count = _56cc.getSize();
+			for ( var i = 0; i < count; i++) {
+				var _56cb = _56cc.get(i);
+				if (_56cb instanceof draw2d.Node) {
+					this.refreshConnections(_56cb);
+				}
+			}
+		} catch (e) {
+			pushErrorStack(e,
+					"draw2d.GraphicalViewer.prototype.checkInit=function()[refreshConnections]");
+		}
+	}
+};
+draw2d.GraphicalViewer.prototype.refreshConnections = function(node) {
+	try {
+		var _56ce = new draw2d.ArrayList();
+		var _56cf = node.getModelSourceConnections();
+		var count = _56cf.getSize();
+		for ( var i = 0; i < count; i++) {
+			var _56d2 = _56cf.get(i);
+			_56ce.add(_56d2.getId());
+			var _56d3 = this.getLine(_56d2.getId());
+			if (_56d3 === null) {
+				_56d3 = this.factory.createEditPart(_56d2);
+				var _56d4 = _56d2.getSourceModel();
+				var _56d5 = _56d2.getTargetModel();
+				var _56d6 = this.getFigure(_56d4.getId());
+				var _56d7 = this.getFigure(_56d5.getId());
+				var _56d8 = _56d6.getOutputPort(_56d2.getSourcePortName());
+				var _56d9 = _56d7.getInputPort(_56d2.getTargetPortName());
+				_56d3.setTarget(_56d9);
+				_56d3.setSource(_56d8);
+				_56d3.setId(_56d2.getId());
+				this.addFigure(_56d3);
+				this.setCurrentSelection(_56d3);
+			}
+		}
+		var ports = node.getOutputPorts();
+		count = ports.getSize();
+		for ( var i = 0; i < count; i++) {
+			var _56db = ports.get(i).getConnections();
+			var _56dc = _56db.getSize();
+			for ( var ii = 0; ii < _56dc; ii++) {
+				var _56de = _56db.get(ii);
+				if (!_56ce.contains(_56de.getId())) {
+					this.removeFigure(_56de);
+					_56ce.add(_56de.getId());
+				}
+			}
+		}
+	} catch (e) {
+		pushErrorStack(
+				e,
+				"draw2d.GraphicalViewer.prototype.refreshConnections=function(/*:draw2d.Node*/ node )");
+	}
+};
+draw2d.GraphicalEditor = function(id) {
+	try {
+		this.view = new draw2d.GraphicalViewer(id);
+		this.initializeGraphicalViewer();
+	} catch (e) {
+		pushErrorStack(e, "draw2d.GraphicalEditor=function(/*:String*/ id)");
+	}
+};
+draw2d.GraphicalEditor.prototype.type = "draw2d.GraphicalEditor";
+draw2d.GraphicalEditor.prototype.initializeGraphicalViewer = function() {
+};
+draw2d.GraphicalEditor.prototype.getGraphicalViewer = function() {
+	return this.view;
+};
+var whitespace = "\n\r\t ";
+XMLP = function(_595d) {
+	_595d = SAXStrings.replace(_595d, null, null, "\r\n", "\n");
+	_595d = SAXStrings.replace(_595d, null, null, "\r", "\n");
+	this.m_xml = _595d;
+	this.m_iP = 0;
+	this.m_iState = XMLP._STATE_PROLOG;
+	this.m_stack = new Stack();
+	this._clearAttributes();
+};
+XMLP._NONE = 0;
+XMLP._ELM_B = 1;
+XMLP._ELM_E = 2;
+XMLP._ELM_EMP = 3;
+XMLP._ATT = 4;
+XMLP._TEXT = 5;
+XMLP._ENTITY = 6;
+XMLP._PI = 7;
+XMLP._CDATA = 8;
+XMLP._COMMENT = 9;
+XMLP._DTD = 10;
+XMLP._ERROR = 11;
+XMLP._CONT_XML = 0;
+XMLP._CONT_ALT = 1;
+XMLP._ATT_NAME = 0;
+XMLP._ATT_VAL = 1;
+XMLP._STATE_PROLOG = 1;
+XMLP._STATE_DOCUMENT = 2;
+XMLP._STATE_MISC = 3;
+XMLP._errs = [];
+XMLP._errs[XMLP.ERR_CLOSE_PI = 0] = "PI: missing closing sequence";
+XMLP._errs[XMLP.ERR_CLOSE_DTD = 1] = "DTD: missing closing sequence";
+XMLP._errs[XMLP.ERR_CLOSE_COMMENT = 2] = "Comment: missing closing sequence";
+XMLP._errs[XMLP.ERR_CLOSE_CDATA = 3] = "CDATA: missing closing sequence";
+XMLP._errs[XMLP.ERR_CLOSE_ELM = 4] = "Element: missing closing sequence";
+XMLP._errs[XMLP.ERR_CLOSE_ENTITY = 5] = "Entity: missing closing sequence";
+XMLP._errs[XMLP.ERR_PI_TARGET = 6] = "PI: target is required";
+XMLP._errs[XMLP.ERR_ELM_EMPTY = 7] = "Element: cannot be both empty and closing";
+XMLP._errs[XMLP.ERR_ELM_NAME = 8] = "Element: name must immediatly follow \"<\"";
+XMLP._errs[XMLP.ERR_ELM_LT_NAME = 9] = "Element: \"<\" not allowed in element names";
+XMLP._errs[XMLP.ERR_ATT_VALUES = 10] = "Attribute: values are required and must be in quotes";
+XMLP._errs[XMLP.ERR_ATT_LT_NAME = 11] = "Element: \"<\" not allowed in attribute names";
+XMLP._errs[XMLP.ERR_ATT_LT_VALUE = 12] = "Attribute: \"<\" not allowed in attribute values";
+XMLP._errs[XMLP.ERR_ATT_DUP = 13] = "Attribute: duplicate attributes not allowed";
+XMLP._errs[XMLP.ERR_ENTITY_UNKNOWN = 14] = "Entity: unknown entity";
+XMLP._errs[XMLP.ERR_INFINITELOOP = 15] = "Infininte loop";
+XMLP._errs[XMLP.ERR_DOC_STRUCTURE = 16] = "Document: only comments, processing instructions, or whitespace allowed outside of document element";
+XMLP._errs[XMLP.ERR_ELM_NESTING = 17] = "Element: must be nested correctly";
+XMLP.prototype._addAttribute = function(name, value) {
+	this.m_atts[this.m_atts.length] = new Array(name, value);
+};
+XMLP.prototype._checkStructure = function(_5960) {
+	if (XMLP._STATE_PROLOG == this.m_iState) {
+		if ((XMLP._TEXT == _5960) || (XMLP._ENTITY == _5960)) {
+			if (SAXStrings.indexOfNonWhitespace(this.getContent(), this
+					.getContentBegin(), this.getContentEnd()) != -1) {
+				return this._setErr(XMLP.ERR_DOC_STRUCTURE);
+			}
+		}
+		if ((XMLP._ELM_B == _5960) || (XMLP._ELM_EMP == _5960)) {
+			this.m_iState = XMLP._STATE_DOCUMENT;
+		}
+	}
+	if (XMLP._STATE_DOCUMENT == this.m_iState) {
+		if ((XMLP._ELM_B == _5960) || (XMLP._ELM_EMP == _5960)) {
+			this.m_stack.push(this.getName());
+		}
+		if ((XMLP._ELM_E == _5960) || (XMLP._ELM_EMP == _5960)) {
+			var _5961 = this.m_stack.pop();
+			if ((_5961 === null) || (_5961 != this.getName())) {
+				return this._setErr(XMLP.ERR_ELM_NESTING);
+			}
+		}
+		if (this.m_stack.count() === 0) {
+			this.m_iState = XMLP._STATE_MISC;
+			return _5960;
+		}
+	}
+	if (XMLP._STATE_MISC == this.m_iState) {
+		if ((XMLP._ELM_B == _5960) || (XMLP._ELM_E == _5960)
+				|| (XMLP._ELM_EMP == _5960) || (XMLP.EVT_DTD == _5960)) {
+			return this._setErr(XMLP.ERR_DOC_STRUCTURE);
+		}
+		if ((XMLP._TEXT == _5960) || (XMLP._ENTITY == _5960)) {
+			if (SAXStrings.indexOfNonWhitespace(this.getContent(), this
+					.getContentBegin(), this.getContentEnd()) != -1) {
+				return this._setErr(XMLP.ERR_DOC_STRUCTURE);
+			}
+		}
+	}
+	return _5960;
+};
+XMLP.prototype._clearAttributes = function() {
+	this.m_atts = [];
+};
+XMLP.prototype._findAttributeIndex = function(name) {
+	for ( var i = 0; i < this.m_atts.length; i++) {
+		if (this.m_atts[i][XMLP._ATT_NAME] == name) {
+			return i;
+		}
+	}
+	return -1;
+};
+XMLP.prototype.getAttributeCount = function() {
+	return this.m_atts ? this.m_atts.length : 0;
+};
+XMLP.prototype.getAttributeName = function(index) {
+	return ((index < 0) || (index >= this.m_atts.length)) ? null
+			: this.m_atts[index][XMLP._ATT_NAME];
+};
+XMLP.prototype.getAttributeValue = function(index) {
+	return ((index < 0) || (index >= this.m_atts.length)) ? null
+			: __unescapeString(this.m_atts[index][XMLP._ATT_VAL]);
+};
+XMLP.prototype.getAttributeValueByName = function(name) {
+	return this.getAttributeValue(this._findAttributeIndex(name));
+};
+XMLP.prototype.getColumnNumber = function() {
+	return SAXStrings.getColumnNumber(this.m_xml, this.m_iP);
+};
+XMLP.prototype.getContent = function() {
+	return (this.m_cSrc == XMLP._CONT_XML) ? this.m_xml : this.m_cAlt;
+};
+XMLP.prototype.getContentBegin = function() {
+	return this.m_cB;
+};
+XMLP.prototype.getContentEnd = function() {
+	return this.m_cE;
+};
+XMLP.prototype.getLineNumber = function() {
+	return SAXStrings.getLineNumber(this.m_xml, this.m_iP);
+};
+XMLP.prototype.getName = function() {
+	return this.m_name;
+};
+XMLP.prototype.next = function() {
+	return this._checkStructure(this._parse());
+};
+XMLP.prototype._parse = function() {
+	if (this.m_iP == this.m_xml.length) {
+		return XMLP._NONE;
+	}
+	if (this.m_iP == this.m_xml.indexOf("<?", this.m_iP)) {
+		return this._parsePI(this.m_iP + 2);
+	} else {
+		if (this.m_iP == this.m_xml.indexOf("<!DOCTYPE", this.m_iP)) {
+			return this._parseDTD(this.m_iP + 9);
+		} else {
+			if (this.m_iP == this.m_xml.indexOf("<!--", this.m_iP)) {
+				return this._parseComment(this.m_iP + 4);
+			} else {
+				if (this.m_iP == this.m_xml.indexOf("<![CDATA[", this.m_iP)) {
+					return this._parseCDATA(this.m_iP + 9);
+				} else {
+					if (this.m_iP == this.m_xml.indexOf("<", this.m_iP)) {
+						return this._parseElement(this.m_iP + 1);
+					} else {
+						if (this.m_iP == this.m_xml.indexOf("&", this.m_iP)) {
+							return this._parseEntity(this.m_iP + 1);
+						} else {
+							return this._parseText(this.m_iP);
+						}
+					}
+				}
+			}
+		}
+	}
+};
+XMLP.prototype._parseAttribute = function(iB, iE) {
+	var iNB, iNE, iEq, iVB, iVE;
+	var _596a, strN, strV;
+	this.m_cAlt = "";
+	iNB = SAXStrings.indexOfNonWhitespace(this.m_xml, iB, iE);
+	if ((iNB == -1) || (iNB >= iE)) {
+		return iNB;
+	}
+	iEq = this.m_xml.indexOf("=", iNB);
+	if ((iEq == -1) || (iEq > iE)) {
+		return this._setErr(XMLP.ERR_ATT_VALUES);
+	}
+	iNE = SAXStrings.lastIndexOfNonWhitespace(this.m_xml, iNB, iEq);
+	iVB = SAXStrings.indexOfNonWhitespace(this.m_xml, iEq + 1, iE);
+	if ((iVB == -1) || (iVB > iE)) {
+		return this._setErr(XMLP.ERR_ATT_VALUES);
+	}
+	_596a = this.m_xml.charAt(iVB);
+	if (SAXStrings.QUOTES.indexOf(_596a) == -1) {
+		return this._setErr(XMLP.ERR_ATT_VALUES);
+	}
+	iVE = this.m_xml.indexOf(_596a, iVB + 1);
+	if ((iVE == -1) || (iVE > iE)) {
+		return this._setErr(XMLP.ERR_ATT_VALUES);
+	}
+	strN = this.m_xml.substring(iNB, iNE + 1);
+	strV = this.m_xml.substring(iVB + 1, iVE);
+	if (strN.indexOf("<") != -1) {
+		return this._setErr(XMLP.ERR_ATT_LT_NAME);
+	}
+	if (strV.indexOf("<") != -1) {
+		return this._setErr(XMLP.ERR_ATT_LT_VALUE);
+	}
+	strV = SAXStrings.replace(strV, null, null, "\n", " ");
+	strV = SAXStrings.replace(strV, null, null, "\t", " ");
+	iRet = this._replaceEntities(strV);
+	if (iRet == XMLP._ERROR) {
+		return iRet;
+	}
+	strV = this.m_cAlt;
+	if (this._findAttributeIndex(strN) == -1) {
+		this._addAttribute(strN, strV);
+	} else {
+		return this._setErr(XMLP.ERR_ATT_DUP);
+	}
+	this.m_iP = iVE + 2;
+	return XMLP._ATT;
+};
+XMLP.prototype._parseCDATA = function(iB) {
+	var iE = this.m_xml.indexOf("]]>", iB);
+	if (iE == -1) {
+		return this._setErr(XMLP.ERR_CLOSE_CDATA);
+	}
+	this._setContent(XMLP._CONT_XML, iB, iE);
+	this.m_iP = iE + 3;
+	return XMLP._CDATA;
+};
+XMLP.prototype._parseComment = function(iB) {
+	var iE = this.m_xml.indexOf("-" + "->", iB);
+	if (iE == -1) {
+		return this._setErr(XMLP.ERR_CLOSE_COMMENT);
+	}
+	this._setContent(XMLP._CONT_XML, iB, iE);
+	this.m_iP = iE + 3;
+	return XMLP._COMMENT;
+};
+XMLP.prototype._parseDTD = function(iB) {
+	var iE, strClose, iInt, iLast;
+	iE = this.m_xml.indexOf(">", iB);
+	if (iE == -1) {
+		return this._setErr(XMLP.ERR_CLOSE_DTD);
+	}
+	iInt = this.m_xml.indexOf("[", iB);
+	strClose = ((iInt != -1) && (iInt < iE)) ? "]>" : ">";
+	while (true) {
+		if (iE == iLast) {
+			return this._setErr(XMLP.ERR_INFINITELOOP);
+		}
+		iLast = iE;
+		iE = this.m_xml.indexOf(strClose, iB);
+		if (iE == -1) {
+			return this._setErr(XMLP.ERR_CLOSE_DTD);
+		}
+		if (this.m_xml.substring(iE - 1, iE + 2) != "]]>") {
+			break;
+		}
+	}
+	this.m_iP = iE + strClose.length;
+	return XMLP._DTD;
+};
+XMLP.prototype._parseElement = function(iB) {
+	var iE, iDE, iNE, iRet;
+	var iType, strN, iLast;
+	iDE = iE = this.m_xml.indexOf(">", iB);
+	if (iE == -1) {
+		return this._setErr(XMLP.ERR_CLOSE_ELM);
+	}
+	if (this.m_xml.charAt(iB) == "/") {
+		iType = XMLP._ELM_E;
+		iB++;
+	} else {
+		iType = XMLP._ELM_B;
+	}
+	if (this.m_xml.charAt(iE - 1) == "/") {
+		if (iType == XMLP._ELM_E) {
+			return this._setErr(XMLP.ERR_ELM_EMPTY);
+		}
+		iType = XMLP._ELM_EMP;
+		iDE--;
+	}
+	iDE = SAXStrings.lastIndexOfNonWhitespace(this.m_xml, iB, iDE);
+	if (iE - iB != 1) {
+		if (SAXStrings.indexOfNonWhitespace(this.m_xml, iB, iDE) != iB) {
+			return this._setErr(XMLP.ERR_ELM_NAME);
+		}
+	}
+	this._clearAttributes();
+	iNE = SAXStrings.indexOfWhitespace(this.m_xml, iB, iDE);
+	if (iNE == -1) {
+		iNE = iDE + 1;
+	} else {
+		this.m_iP = iNE;
+		while (this.m_iP < iDE) {
+			if (this.m_iP == iLast) {
+				return this._setErr(XMLP.ERR_INFINITELOOP);
+			}
+			iLast = this.m_iP;
+			iRet = this._parseAttribute(this.m_iP, iDE);
+			if (iRet == XMLP._ERROR) {
+				return iRet;
+			}
+		}
+	}
+	strN = this.m_xml.substring(iB, iNE);
+	if (strN.indexOf("<") != -1) {
+		return this._setErr(XMLP.ERR_ELM_LT_NAME);
+	}
+	this.m_name = strN;
+	this.m_iP = iE + 1;
+	return iType;
+};
+XMLP.prototype._parseEntity = function(iB) {
+	var iE = this.m_xml.indexOf(";", iB);
+	if (iE == -1) {
+		return this._setErr(XMLP.ERR_CLOSE_ENTITY);
+	}
+	this.m_iP = iE + 1;
+	return this._replaceEntity(this.m_xml, iB, iE);
+};
+XMLP.prototype._parsePI = function(iB) {
+	var iE, iTB, iTE, iCB, iCE;
+	iE = this.m_xml.indexOf("?>", iB);
+	if (iE == -1) {
+		return this._setErr(XMLP.ERR_CLOSE_PI);
+	}
+	iTB = SAXStrings.indexOfNonWhitespace(this.m_xml, iB, iE);
+	if (iTB == -1) {
+		return this._setErr(XMLP.ERR_PI_TARGET);
+	}
+	iTE = SAXStrings.indexOfWhitespace(this.m_xml, iTB, iE);
+	if (iTE == -1) {
+		iTE = iE;
+	}
+	iCB = SAXStrings.indexOfNonWhitespace(this.m_xml, iTE, iE);
+	if (iCB == -1) {
+		iCB = iE;
+	}
+	iCE = SAXStrings.lastIndexOfNonWhitespace(this.m_xml, iCB, iE);
+	if (iCE == -1) {
+		iCE = iE - 1;
+	}
+	this.m_name = this.m_xml.substring(iTB, iTE);
+	this._setContent(XMLP._CONT_XML, iCB, iCE + 1);
+	this.m_iP = iE + 2;
+	return XMLP._PI;
+};
+XMLP.prototype._parseText = function(iB) {
+	var iE, iEE;
+	iE = this.m_xml.indexOf("<", iB);
+	if (iE == -1) {
+		iE = this.m_xml.length;
+	}
+	iEE = this.m_xml.indexOf("&", iB);
+	if ((iEE != -1) && (iEE <= iE)) {
+		iE = iEE;
+	}
+	this._setContent(XMLP._CONT_XML, iB, iE);
+	this.m_iP = iE;
+	return XMLP._TEXT;
+};
+XMLP.prototype._replaceEntities = function(strD, iB, iE) {
+	if (SAXStrings.isEmpty(strD)) {
+		return "";
+	}
+	iB = iB || 0;
+	iE = iE || strD.length;
+	var iEB, iEE, strRet = "";
+	iEB = strD.indexOf("&", iB);
+	iEE = iB;
+	while ((iEB > 0) && (iEB < iE)) {
+		strRet += strD.substring(iEE, iEB);
+		iEE = strD.indexOf(";", iEB) + 1;
+		if ((iEE === 0) || (iEE > iE)) {
+			return this._setErr(XMLP.ERR_CLOSE_ENTITY);
+		}
+		iRet = this._replaceEntity(strD, iEB + 1, iEE - 1);
+		if (iRet == XMLP._ERROR) {
+			return iRet;
+		}
+		strRet += this.m_cAlt;
+		iEB = strD.indexOf("&", iEE);
+	}
+	if (iEE != iE) {
+		strRet += strD.substring(iEE, iE);
+	}
+	this._setContent(XMLP._CONT_ALT, strRet);
+	return XMLP._ENTITY;
+};
+XMLP.prototype._replaceEntity = function(strD, iB, iE) {
+	if (SAXStrings.isEmpty(strD)) {
+		return -1;
+	}
+	iB = iB || 0;
+	iE = iE || strD.length;
+	switch (strD.substring(iB, iE)) {
+	case "amp":
+		strEnt = "&";
+		break;
+	case "lt":
+		strEnt = "<";
+		break;
+	case "gt":
+		strEnt = ">";
+		break;
+	case "apos":
+		strEnt = "'";
+		break;
+	case "quot":
+		strEnt = "\"";
+		break;
+	default:
+		if (strD.charAt(iB) == "#") {
+			strEnt = String.fromCharCode(parseInt(strD.substring(iB + 1, iE)));
+		} else {
+			return this._setErr(XMLP.ERR_ENTITY_UNKNOWN);
+		}
+		break;
+	}
+	this._setContent(XMLP._CONT_ALT, strEnt);
+	return XMLP._ENTITY;
+};
+XMLP.prototype._setContent = function(iSrc) {
+	var args = arguments;
+	if (XMLP._CONT_XML == iSrc) {
+		this.m_cAlt = null;
+		this.m_cB = args[1];
+		this.m_cE = args[2];
+	} else {
+		this.m_cAlt = args[1];
+		this.m_cB = 0;
+		this.m_cE = args[1].length;
+	}
+	this.m_cSrc = iSrc;
+};
+XMLP.prototype._setErr = function(iErr) {
+	var _5984 = XMLP._errs[iErr];
+	this.m_cAlt = _5984;
+	this.m_cB = 0;
+	this.m_cE = _5984.length;
+	this.m_cSrc = XMLP._CONT_ALT;
+	return XMLP._ERROR;
+};
+SAXDriver = function() {
+	this.m_hndDoc = null;
+	this.m_hndErr = null;
+	this.m_hndLex = null;
+};
+SAXDriver.DOC_B = 1;
+SAXDriver.DOC_E = 2;
+SAXDriver.ELM_B = 3;
+SAXDriver.ELM_E = 4;
+SAXDriver.CHARS = 5;
+SAXDriver.PI = 6;
+SAXDriver.CD_B = 7;
+SAXDriver.CD_E = 8;
+SAXDriver.CMNT = 9;
+SAXDriver.DTD_B = 10;
+SAXDriver.DTD_E = 11;
+SAXDriver.prototype.parse = function(strD) {
+	var _5986 = new XMLP(strD);
+	if (this.m_hndDoc && this.m_hndDoc.setDocumentLocator) {
+		this.m_hndDoc.setDocumentLocator(this);
+	}
+	this.m_parser = _5986;
+	this.m_bErr = false;
+	if (!this.m_bErr) {
+		this._fireEvent(SAXDriver.DOC_B);
+	}
+	this._parseLoop();
+	if (!this.m_bErr) {
+		this._fireEvent(SAXDriver.DOC_E);
+	}
+	this.m_xml = null;
+	this.m_iP = 0;
+};
+SAXDriver.prototype.setDocumentHandler = function(hnd) {
+	this.m_hndDoc = hnd;
+};
+SAXDriver.prototype.setErrorHandler = function(hnd) {
+	this.m_hndErr = hnd;
+};
+SAXDriver.prototype.setLexicalHandler = function(hnd) {
+	this.m_hndLex = hnd;
+};
+SAXDriver.prototype.getColumnNumber = function() {
+	return this.m_parser.getColumnNumber();
+};
+SAXDriver.prototype.getLineNumber = function() {
+	return this.m_parser.getLineNumber();
+};
+SAXDriver.prototype.getMessage = function() {
+	return this.m_strErrMsg;
+};
+SAXDriver.prototype.getPublicId = function() {
+	return null;
+};
+SAXDriver.prototype.getSystemId = function() {
+	return null;
+};
+SAXDriver.prototype.getLength = function() {
+	return this.m_parser.getAttributeCount();
+};
+SAXDriver.prototype.getName = function(index) {
+	return this.m_parser.getAttributeName(index);
+};
+SAXDriver.prototype.getValue = function(index) {
+	return this.m_parser.getAttributeValue(index);
+};
+SAXDriver.prototype.getValueByName = function(name) {
+	return this.m_parser.getAttributeValueByName(name);
+};
+SAXDriver.prototype._fireError = function(_598d) {
+	this.m_strErrMsg = _598d;
+	this.m_bErr = true;
+	if (this.m_hndErr && this.m_hndErr.fatalError) {
+		this.m_hndErr.fatalError(this);
+	}
+};
+SAXDriver.prototype._fireEvent = function(iEvt) {
+	var hnd, func, args = arguments, iLen = args.length - 1;
+	if (this.m_bErr) {
+		return;
+	}
+	if (SAXDriver.DOC_B == iEvt) {
+		func = "startDocument";
+		hnd = this.m_hndDoc;
+	} else {
+		if (SAXDriver.DOC_E == iEvt) {
+			func = "endDocument";
+			hnd = this.m_hndDoc;
+		} else {
+			if (SAXDriver.ELM_B == iEvt) {
+				func = "startElement";
+				hnd = this.m_hndDoc;
+			} else {
+				if (SAXDriver.ELM_E == iEvt) {
+					func = "endElement";
+					hnd = this.m_hndDoc;
+				} else {
+					if (SAXDriver.CHARS == iEvt) {
+						func = "characters";
+						hnd = this.m_hndDoc;
+					} else {
+						if (SAXDriver.PI == iEvt) {
+							func = "processingInstruction";
+							hnd = this.m_hndDoc;
+						} else {
+							if (SAXDriver.CD_B == iEvt) {
+								func = "startCDATA";
+								hnd = this.m_hndLex;
+							} else {
+								if (SAXDriver.CD_E == iEvt) {
+									func = "endCDATA";
+									hnd = this.m_hndLex;
+								} else {
+									if (SAXDriver.CMNT == iEvt) {
+										func = "comment";
+										hnd = this.m_hndLex;
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+	if (hnd && hnd[func]) {
+		if (0 == iLen) {
+			hnd[func]();
+		} else {
+			if (1 == iLen) {
+				hnd[func](args[1]);
+			} else {
+				if (2 == iLen) {
+					hnd[func](args[1], args[2]);
+				} else {
+					if (3 == iLen) {
+						hnd[func](args[1], args[2], args[3]);
+					}
+				}
+			}
+		}
+	}
+};
+SAXDriver.prototype._parseLoop = function(_5990) {
+	var _5991, _5990;
+	_5990 = this.m_parser;
+	while (!this.m_bErr) {
+		_5991 = _5990.next();
+		if (_5991 == XMLP._ELM_B) {
+			this._fireEvent(SAXDriver.ELM_B, _5990.getName(), this);
+		} else {
+			if (_5991 == XMLP._ELM_E) {
+				this._fireEvent(SAXDriver.ELM_E, _5990.getName());
+			} else {
+				if (_5991 == XMLP._ELM_EMP) {
+					this._fireEvent(SAXDriver.ELM_B, _5990.getName(), this);
+					this._fireEvent(SAXDriver.ELM_E, _5990.getName());
+				} else {
+					if (_5991 == XMLP._TEXT) {
+						this._fireEvent(SAXDriver.CHARS, _5990.getContent(),
+								_5990.getContentBegin(), _5990.getContentEnd()
+										- _5990.getContentBegin());
+					} else {
+						if (_5991 == XMLP._ENTITY) {
+							this._fireEvent(SAXDriver.CHARS,
+									_5990.getContent(),
+									_5990.getContentBegin(), _5990
+											.getContentEnd()
+											- _5990.getContentBegin());
+						} else {
+							if (_5991 == XMLP._PI) {
+								this._fireEvent(SAXDriver.PI, _5990.getName(),
+										_5990.getContent().substring(
+												_5990.getContentBegin(),
+												_5990.getContentEnd()));
+							} else {
+								if (_5991 == XMLP._CDATA) {
+									this._fireEvent(SAXDriver.CD_B);
+									this._fireEvent(SAXDriver.CHARS, _5990
+											.getContent(), _5990
+											.getContentBegin(), _5990
+											.getContentEnd()
+											- _5990.getContentBegin());
+									this._fireEvent(SAXDriver.CD_E);
+								} else {
+									if (_5991 == XMLP._COMMENT) {
+										this._fireEvent(SAXDriver.CMNT, _5990
+												.getContent(), _5990
+												.getContentBegin(), _5990
+												.getContentEnd()
+												- _5990.getContentBegin());
+									} else {
+										if (_5991 == XMLP._DTD) {
+										} else {
+											if (_5991 == XMLP._ERROR) {
+												this._fireError(_5990
+														.getContent());
+											} else {
+												if (_5991 == XMLP._NONE) {
+													return;
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+};
+SAXStrings = function() {
+};
+SAXStrings.WHITESPACE = " \t\n\r";
+SAXStrings.QUOTES = "\"'";
+SAXStrings.getColumnNumber = function(strD, iP) {
+	if (SAXStrings.isEmpty(strD)) {
+		return -1;
+	}
+	iP = iP || strD.length;
+	var arrD = strD.substring(0, iP).split("\n");
+	var _5995 = arrD[arrD.length - 1];
+	arrD.length--;
+	var _5996 = arrD.join("\n").length;
+	return iP - _5996;
+};
+SAXStrings.getLineNumber = function(strD, iP) {
+	if (SAXStrings.isEmpty(strD)) {
+		return -1;
+	}
+	iP = iP || strD.length;
+	return strD.substring(0, iP).split("\n").length;
+};
+SAXStrings.indexOfNonWhitespace = function(strD, iB, iE) {
+	if (SAXStrings.isEmpty(strD)) {
+		return -1;
+	}
+	iB = iB || 0;
+	iE = iE || strD.length;
+	for ( var i = iB; i < iE; i++) {
+		if (SAXStrings.WHITESPACE.indexOf(strD.charAt(i)) == -1) {
+			return i;
+		}
+	}
+	return -1;
+};
+SAXStrings.indexOfWhitespace = function(strD, iB, iE) {
+	if (SAXStrings.isEmpty(strD)) {
+		return -1;
+	}
+	iB = iB || 0;
+	iE = iE || strD.length;
+	for ( var i = iB; i < iE; i++) {
+		if (SAXStrings.WHITESPACE.indexOf(strD.charAt(i)) != -1) {
+			return i;
+		}
+	}
+	return -1;
+};
+SAXStrings.isEmpty = function(strD) {
+	return (strD === null) || (strD.length === 0);
+};
+SAXStrings.lastIndexOfNonWhitespace = function(strD, iB, iE) {
+	if (SAXStrings.isEmpty(strD)) {
+		return -1;
+	}
+	iB = iB || 0;
+	iE = iE || strD.length;
+	for ( var i = iE - 1; i >= iB; i--) {
+		if (SAXStrings.WHITESPACE.indexOf(strD.charAt(i)) == -1) {
+			return i;
+		}
+	}
+	return -1;
+};
+SAXStrings.replace = function(strD, iB, iE, strF, strR) {
+	if (SAXStrings.isEmpty(strD)) {
+		return "";
+	}
+	iB = iB || 0;
+	iE = iE || strD.length;
+	return strD.substring(iB, iE).split(strF).join(strR);
+};
+Stack = function() {
+	this.m_arr = [];
+};
+Stack.prototype.clear = function() {
+	this.m_arr = [];
+};
+Stack.prototype.count = function() {
+	return this.m_arr.length;
+};
+Stack.prototype.destroy = function() {
+	this.m_arr = null;
+};
+Stack.prototype.peek = function() {
+	if (this.m_arr.length === 0) {
+		return null;
+	}
+	return this.m_arr[this.m_arr.length - 1];
+};
+Stack.prototype.pop = function() {
+	if (this.m_arr.length === 0) {
+		return null;
+	}
+	var o = this.m_arr[this.m_arr.length - 1];
+	this.m_arr.length--;
+	return o;
+};
+Stack.prototype.push = function(o) {
+	this.m_arr[this.m_arr.length] = o;
+};
+function isEmpty(str) {
+	return (str === null) || (str.length == 0);
+}
+function trim(_59ae, _59af, _59b0) {
+	if (isEmpty(_59ae)) {
+		return "";
+	}
+	if (_59af === null) {
+		_59af = true;
+	}
+	if (_59b0 === null) {
+		_59b0 = true;
+	}
+	var left = 0;
+	var right = 0;
+	var i = 0;
+	var k = 0;
+	if (_59af == true) {
+		while ((i < _59ae.length)
+				&& (whitespace.indexOf(_59ae.charAt(i++)) != -1)) {
+			left++;
+		}
+	}
+	if (_59b0 == true) {
+		k = _59ae.length - 1;
+		while ((k >= left) && (whitespace.indexOf(_59ae.charAt(k--)) != -1)) {
+			right++;
+		}
+	}
+	return _59ae.substring(left, _59ae.length - right);
+}
+function __escapeString(str) {
+	var _59b6 = /&/g;
+	var _59b7 = /</g;
+	var _59b8 = />/g;
+	var _59b9 = /"/g;
+	var _59ba = /'/g;
+	str = str.replace(_59b6, "&amp;");
+	str = str.replace(_59b7, "&lt;");
+	str = str.replace(_59b8, "&gt;");
+	str = str.replace(_59b9, "&quot;");
+	str = str.replace(_59ba, "&apos;");
+	return str;
+}
+function __unescapeString(str) {
+	var _59bc = /&amp;/g;
+	var _59bd = /&lt;/g;
+	var _59be = /&gt;/g;
+	var _59bf = /&quot;/g;
+	var _59c0 = /&apos;/g;
+	str = str.replace(_59bc, "&");
+	str = str.replace(_59bd, "<");
+	str = str.replace(_59be, ">");
+	str = str.replace(_59bf, "\"");
+	str = str.replace(_59c0, "'");
+	return str;
+}
+function addClass(_619a, _619b) {
+	if (_619a) {
+		if (_619a.indexOf("|" + _619b + "|") < 0) {
+			_619a += _619b + "|";
+		}
+	} else {
+		_619a = "|" + _619b + "|";
+	}
+	return _619a;
+}
+DOMException = function(code) {
+	this._class = addClass(this._class, "DOMException");
+	this.code = code;
+};
+DOMException.INDEX_SIZE_ERR = 1;
+DOMException.DOMSTRING_SIZE_ERR = 2;
+DOMException.HIERARCHY_REQUEST_ERR = 3;
+DOMException.WRONG_DOCUMENT_ERR = 4;
+DOMException.INVALID_CHARACTER_ERR = 5;
+DOMException.NO_DATA_ALLOWED_ERR = 6;
+DOMException.NO_MODIFICATION_ALLOWED_ERR = 7;
+DOMException.NOT_FOUND_ERR = 8;
+DOMException.NOT_SUPPORTED_ERR = 9;
+DOMException.INUSE_ATTRIBUTE_ERR = 10;
+DOMException.INVALID_STATE_ERR = 11;
+DOMException.SYNTAX_ERR = 12;
+DOMException.INVALID_MODIFICATION_ERR = 13;
+DOMException.NAMESPACE_ERR = 14;
+DOMException.INVALID_ACCESS_ERR = 15;
+DOMImplementation = function() {
+	this._class = addClass(this._class, "DOMImplementation");
+	this._p = null;
+	this.preserveWhiteSpace = false;
+	this.namespaceAware = true;
+	this.errorChecking = true;
+};
+DOMImplementation.prototype.escapeString = function DOMNode__escapeString(str) {
+	return __escapeString(str);
+};
+DOMImplementation.prototype.unescapeString = function DOMNode__unescapeString(
+		str) {
+	return __unescapeString(str);
+};
+DOMImplementation.prototype.hasFeature = function DOMImplementation_hasFeature(
+		_619f, _61a0) {
+	var ret = false;
+	if (_619f.toLowerCase() == "xml") {
+		ret = (!_61a0 || (_61a0 == "1.0") || (_61a0 == "2.0"));
+	} else {
+		if (_619f.toLowerCase() == "core") {
+			ret = (!_61a0 || (_61a0 == "2.0"));
+		}
+	}
+	return ret;
+};
+DOMImplementation.prototype.loadXML = function DOMImplementation_loadXML(_61a2) {
+	var _61a3;
+	try {
+		_61a3 = new XMLP(_61a2);
+	} catch (e) {
+		alert("Error Creating the SAX Parser. Did you include xmlsax.js or tinyxmlsax.js in your web page?\nThe SAX parser is needed to populate XML for <SCRIPT>'s W3C DOM Parser with data.");
+	}
+	var doc = new DOMDocument(this);
+	this._parseLoop(doc, _61a3);
+	doc._parseComplete = true;
+	return doc;
+};
+DOMImplementation.prototype.translateErrCode = function DOMImplementation_translateErrCode(
+		code) {
+	var msg = "";
+	switch (code) {
+	case DOMException.INDEX_SIZE_ERR:
+		msg = "INDEX_SIZE_ERR: Index out of bounds";
+		break;
+	case DOMException.DOMSTRING_SIZE_ERR:
+		msg = "DOMSTRING_SIZE_ERR: The resulting string is too long to fit in a DOMString";
+		break;
+	case DOMException.HIERARCHY_REQUEST_ERR:
+		msg = "HIERARCHY_REQUEST_ERR: The Node can not be inserted at this location";
+		break;
+	case DOMException.WRONG_DOCUMENT_ERR:
+		msg = "WRONG_DOCUMENT_ERR: The source and the destination Documents are not the same";
+		break;
+	case DOMException.INVALID_CHARACTER_ERR:
+		msg = "INVALID_CHARACTER_ERR: The string contains an invalid character";
+		break;
+	case DOMException.NO_DATA_ALLOWED_ERR:
+		msg = "NO_DATA_ALLOWED_ERR: This Node / NodeList does not support data";
+		break;
+	case DOMException.NO_MODIFICATION_ALLOWED_ERR:
+		msg = "NO_MODIFICATION_ALLOWED_ERR: This object cannot be modified";
+		break;
+	case DOMException.NOT_FOUND_ERR:
+		msg = "NOT_FOUND_ERR: The item cannot be found";
+		break;
+	case DOMException.NOT_SUPPORTED_ERR:
+		msg = "NOT_SUPPORTED_ERR: This implementation does not support function";
+		break;
+	case DOMException.INUSE_ATTRIBUTE_ERR:
+		msg = "INUSE_ATTRIBUTE_ERR: The Attribute has already been assigned to another Element";
+		break;
+	case DOMException.INVALID_STATE_ERR:
+		msg = "INVALID_STATE_ERR: The object is no longer usable";
+		break;
+	case DOMException.SYNTAX_ERR:
+		msg = "SYNTAX_ERR: Syntax error";
+		break;
+	case DOMException.INVALID_MODIFICATION_ERR:
+		msg = "INVALID_MODIFICATION_ERR: Cannot change the type of the object";
+		break;
+	case DOMException.NAMESPACE_ERR:
+		msg = "NAMESPACE_ERR: The namespace declaration is incorrect";
+		break;
+	case DOMException.INVALID_ACCESS_ERR:
+		msg = "INVALID_ACCESS_ERR: The object does not support this function";
+		break;
+	default:
+		msg = "UNKNOWN: Unknown Exception Code (" + code + ")";
+	}
+	return msg;
+};
+DOMImplementation.prototype._parseLoop = function DOMImplementation__parseLoop(
+		doc, p) {
+	var iEvt, iNode, iAttr, strName;
+	iNodeParent = doc;
+	var _61aa = 0;
+	var _61ab = [];
+	var _61ac = [];
+	if (this.namespaceAware) {
+		var iNS = doc.createNamespace("");
+		iNS.setValue("http://www.w3.org/2000/xmlns/");
+		doc._namespaces.setNamedItem(iNS);
+	}
+	while (true) {
+		iEvt = p.next();
+		if (iEvt == XMLP._ELM_B) {
+			var pName = p.getName();
+			pName = trim(pName, true, true);
+			if (!this.namespaceAware) {
+				iNode = doc.createElement(p.getName());
+				for ( var i = 0; i < p.getAttributeCount(); i++) {
+					strName = p.getAttributeName(i);
+					iAttr = iNode.getAttributeNode(strName);
+					if (!iAttr) {
+						iAttr = doc.createAttribute(strName);
+					}
+					iAttr.setValue(p.getAttributeValue(i));
+					iNode.setAttributeNode(iAttr);
+				}
+			} else {
+				iNode = doc.createElementNS("", p.getName());
+				iNode._namespaces = iNodeParent._namespaces._cloneNodes(iNode);
+				for ( var i = 0; i < p.getAttributeCount(); i++) {
+					strName = p.getAttributeName(i);
+					if (this._isNamespaceDeclaration(strName)) {
+						var _61b0 = this._parseNSName(strName);
+						if (strName != "xmlns") {
+							iNS = doc.createNamespace(strName);
+						} else {
+							iNS = doc.createNamespace("");
+						}
+						iNS.setValue(p.getAttributeValue(i));
+						iNode._namespaces.setNamedItem(iNS);
+					} else {
+						iAttr = iNode.getAttributeNode(strName);
+						if (!iAttr) {
+							iAttr = doc.createAttributeNS("", strName);
+						}
+						iAttr.setValue(p.getAttributeValue(i));
+						iNode.setAttributeNodeNS(iAttr);
+						if (this._isIdDeclaration(strName)) {
+							iNode.id = p.getAttributeValue(i);
+						}
+					}
+				}
+				if (iNode._namespaces.getNamedItem(iNode.prefix)) {
+					iNode.namespaceURI = iNode._namespaces
+							.getNamedItem(iNode.prefix).value;
+				}
+				for ( var i = 0; i < iNode.attributes.length; i++) {
+					if (iNode.attributes.item(i).prefix != "") {
+						if (iNode._namespaces.getNamedItem(iNode.attributes
+								.item(i).prefix)) {
+							iNode.attributes.item(i).namespaceURI = iNode._namespaces
+									.getNamedItem(iNode.attributes.item(i).prefix).value;
+						}
+					}
+				}
+			}
+			if (iNodeParent.nodeType == DOMNode.DOCUMENT_NODE) {
+				iNodeParent.documentElement = iNode;
+			}
+			iNodeParent.appendChild(iNode);
+			iNodeParent = iNode;
+		} else {
+			if (iEvt == XMLP._ELM_E) {
+				iNodeParent = iNodeParent.parentNode;
+			} else {
+				if (iEvt == XMLP._ELM_EMP) {
+					pName = p.getName();
+					pName = trim(pName, true, true);
+					if (!this.namespaceAware) {
+						iNode = doc.createElement(pName);
+						for ( var i = 0; i < p.getAttributeCount(); i++) {
+							strName = p.getAttributeName(i);
+							iAttr = iNode.getAttributeNode(strName);
+							if (!iAttr) {
+								iAttr = doc.createAttribute(strName);
+							}
+							iAttr.setValue(p.getAttributeValue(i));
+							iNode.setAttributeNode(iAttr);
+						}
+					} else {
+						iNode = doc.createElementNS("", p.getName());
+						iNode._namespaces = iNodeParent._namespaces
+								._cloneNodes(iNode);
+						for ( var i = 0; i < p.getAttributeCount(); i++) {
+							strName = p.getAttributeName(i);
+							if (this._isNamespaceDeclaration(strName)) {
+								var _61b0 = this._parseNSName(strName);
+								if (strName != "xmlns") {
+									iNS = doc.createNamespace(strName);
+								} else {
+									iNS = doc.createNamespace("");
+								}
+								iNS.setValue(p.getAttributeValue(i));
+								iNode._namespaces.setNamedItem(iNS);
+							} else {
+								iAttr = iNode.getAttributeNode(strName);
+								if (!iAttr) {
+									iAttr = doc.createAttributeNS("", strName);
+								}
+								iAttr.setValue(p.getAttributeValue(i));
+								iNode.setAttributeNodeNS(iAttr);
+								if (this._isIdDeclaration(strName)) {
+									iNode.id = p.getAttributeValue(i);
+								}
+							}
+						}
+						if (iNode._namespaces.getNamedItem(iNode.prefix)) {
+							iNode.namespaceURI = iNode._namespaces
+									.getNamedItem(iNode.prefix).value;
+						}
+						for ( var i = 0; i < iNode.attributes.length; i++) {
+							if (iNode.attributes.item(i).prefix != "") {
+								if (iNode._namespaces
+										.getNamedItem(iNode.attributes.item(i).prefix)) {
+									iNode.attributes.item(i).namespaceURI = iNode._namespaces
+											.getNamedItem(iNode.attributes
+													.item(i).prefix).value;
+								}
+							}
+						}
+					}
+					if (iNodeParent.nodeType == DOMNode.DOCUMENT_NODE) {
+						iNodeParent.documentElement = iNode;
+					}
+					iNodeParent.appendChild(iNode);
+				} else {
+					if (iEvt == XMLP._TEXT || iEvt == XMLP._ENTITY) {
+						var _61b1 = p.getContent().substring(
+								p.getContentBegin(), p.getContentEnd());
+						if (!this.preserveWhiteSpace) {
+							if (trim(_61b1, true, true) == "") {
+								_61b1 = "";
+							}
+						}
+						if (_61b1.length > 0) {
+							var _61b2 = doc.createTextNode(_61b1);
+							iNodeParent.appendChild(_61b2);
+							if (iEvt == XMLP._ENTITY) {
+								_61ab[_61ab.length] = _61b2;
+							} else {
+								_61ac[_61ac.length] = _61b2;
+							}
+						}
+					} else {
+						if (iEvt == XMLP._PI) {
+							iNodeParent.appendChild(doc
+									.createProcessingInstruction(p.getName(), p
+											.getContent().substring(
+													p.getContentBegin(),
+													p.getContentEnd())));
+						} else {
+							if (iEvt == XMLP._CDATA) {
+								_61b1 = p.getContent().substring(
+										p.getContentBegin(), p.getContentEnd());
+								if (!this.preserveWhiteSpace) {
+									_61b1 = trim(_61b1, true, true);
+									_61b1.replace(/ +/g, " ");
+								}
+								if (_61b1.length > 0) {
+									iNodeParent.appendChild(doc
+											.createCDATASection(_61b1));
+								}
+							} else {
+								if (iEvt == XMLP._COMMENT) {
+									var _61b1 = p.getContent().substring(
+											p.getContentBegin(),
+											p.getContentEnd());
+									if (!this.preserveWhiteSpace) {
+										_61b1 = trim(_61b1, true, true);
+										_61b1.replace(/ +/g, " ");
+									}
+									if (_61b1.length > 0) {
+										iNodeParent.appendChild(doc
+												.createComment(_61b1));
+									}
+								} else {
+									if (iEvt == XMLP._DTD) {
+									} else {
+										if (iEvt == XMLP._ERROR) {
+											throw (new DOMException(
+													DOMException.SYNTAX_ERR));
+										} else {
+											if (iEvt == XMLP._NONE) {
+												if (iNodeParent == doc) {
+													break;
+												} else {
+													throw (new DOMException(
+															DOMException.SYNTAX_ERR));
+												}
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+	var _61b3 = _61ab.length;
+	for (intLoop = 0; intLoop < _61b3; intLoop++) {
+		var _61b4 = _61ab[intLoop];
+		var _61b5 = _61b4.getParentNode();
+		if (_61b5) {
+			_61b5.normalize();
+			if (!this.preserveWhiteSpace) {
+				var _61b6 = _61b5.getChildNodes();
+				var _61b7 = _61b6.getLength();
+				for (intLoop2 = 0; intLoop2 < _61b7; intLoop2++) {
+					var child = _61b6.item(intLoop2);
+					if (child.getNodeType() == DOMNode.TEXT_NODE) {
+						var _61b9 = child.getData();
+						_61b9 = trim(_61b9, true, true);
+						_61b9.replace(/ +/g, " ");
+						child.setData(_61b9);
+					}
+				}
+			}
+		}
+	}
+	if (!this.preserveWhiteSpace) {
+		var _61b3 = _61ac.length;
+		for (intLoop = 0; intLoop < _61b3; intLoop++) {
+			var node = _61ac[intLoop];
+			if (node.getParentNode() !== null) {
+				var _61bb = node.getData();
+				_61bb = trim(_61bb, true, true);
+				_61bb.replace(/ +/g, " ");
+				node.setData(_61bb);
+			}
+		}
+	}
+};
+DOMImplementation.prototype._isNamespaceDeclaration = function DOMImplementation__isNamespaceDeclaration(
+		_61bc) {
+	return (_61bc.indexOf("xmlns") > -1);
+};
+DOMImplementation.prototype._isIdDeclaration = function DOMImplementation__isIdDeclaration(
+		_61bd) {
+	return (_61bd.toLowerCase() == "id");
+};
+DOMImplementation.prototype._isValidName = function DOMImplementation__isValidName(
+		name) {
+	return name.match(re_validName);
+};
+re_validName = /^[a-zA-Z_:][a-zA-Z0-9\.\-_:]*$/;
+DOMImplementation.prototype._isValidString = function DOMImplementation__isValidString(
+		name) {
+	return (name.search(re_invalidStringChars) < 0);
+};
+re_invalidStringChars = /\x01|\x02|\x03|\x04|\x05|\x06|\x07|\x08|\x0B|\x0C|\x0E|\x0F|\x10|\x11|\x12|\x13|\x14|\x15|\x16|\x17|\x18|\x19|\x1A|\x1B|\x1C|\x1D|\x1E|\x1F|\x7F/;
+DOMImplementation.prototype._parseNSName = function DOMImplementation__parseNSName(
+		_61c0) {
+	var _61c1 = {};
+	_61c1.prefix = _61c0;
+	_61c1.namespaceName = "";
+	delimPos = _61c0.indexOf(":");
+	if (delimPos > -1) {
+		_61c1.prefix = _61c0.substring(0, delimPos);
+		_61c1.namespaceName = _61c0.substring(delimPos + 1, _61c0.length);
+	}
+	return _61c1;
+};
+DOMImplementation.prototype._parseQName = function DOMImplementation__parseQName(
+		_61c2) {
+	var _61c3 = {};
+	_61c3.localName = _61c2;
+	_61c3.prefix = "";
+	delimPos = _61c2.indexOf(":");
+	if (delimPos > -1) {
+		_61c3.prefix = _61c2.substring(0, delimPos);
+		_61c3.localName = _61c2.substring(delimPos + 1, _61c2.length);
+	}
+	return _61c3;
+};
+DOMNodeList = function(_61c4, _61c5) {
+	this._class = addClass(this._class, "DOMNodeList");
+	this._nodes = [];
+	this.length = 0;
+	this.parentNode = _61c5;
+	this.ownerDocument = _61c4;
+	this._readonly = false;
+};
+DOMNodeList.prototype.getLength = function DOMNodeList_getLength() {
+	return this.length;
+};
+DOMNodeList.prototype.item = function DOMNodeList_item(index) {
+	var ret = null;
+	if ((index >= 0) && (index < this._nodes.length)) {
+		ret = this._nodes[index];
+	}
+	return ret;
+};
+DOMNodeList.prototype._findItemIndex = function DOMNodeList__findItemIndex(id) {
+	var ret = -1;
+	if (id > -1) {
+		for ( var i = 0; i < this._nodes.length; i++) {
+			if (this._nodes[i]._id == id) {
+				ret = i;
+				break;
+			}
+		}
+	}
+	return ret;
+};
+DOMNodeList.prototype._insertBefore = function DOMNodeList__insertBefore(_61cb,
+		_61cc) {
+	if ((_61cc >= 0) && (_61cc < this._nodes.length)) {
+		var _61cd = [];
+		_61cd = this._nodes.slice(0, _61cc);
+		if (_61cb.nodeType == DOMNode.DOCUMENT_FRAGMENT_NODE) {
+			_61cd = _61cd.concat(_61cb.childNodes._nodes);
+		} else {
+			_61cd[_61cd.length] = _61cb;
+		}
+		this._nodes = _61cd.concat(this._nodes.slice(_61cc));
+		this.length = this._nodes.length;
+	}
+};
+DOMNodeList.prototype._replaceChild = function DOMNodeList__replaceChild(_61ce,
+		_61cf) {
+	var ret = null;
+	if ((_61cf >= 0) && (_61cf < this._nodes.length)) {
+		ret = this._nodes[_61cf];
+		if (_61ce.nodeType == DOMNode.DOCUMENT_FRAGMENT_NODE) {
+			var _61d1 = [];
+			_61d1 = this._nodes.slice(0, _61cf);
+			_61d1 = _61d1.concat(_61ce.childNodes._nodes);
+			this._nodes = _61d1.concat(this._nodes.slice(_61cf + 1));
+		} else {
+			this._nodes[_61cf] = _61ce;
+		}
+	}
+	return ret;
+};
+DOMNodeList.prototype._removeChild = function DOMNodeList__removeChild(_61d2) {
+	var ret = null;
+	if (_61d2 > -1) {
+		ret = this._nodes[_61d2];
+		var _61d4 = [];
+		_61d4 = this._nodes.slice(0, _61d2);
+		this._nodes = _61d4.concat(this._nodes.slice(_61d2 + 1));
+		this.length = this._nodes.length;
+	}
+	return ret;
+};
+DOMNodeList.prototype._appendChild = function DOMNodeList__appendChild(_61d5) {
+	if (_61d5.nodeType == DOMNode.DOCUMENT_FRAGMENT_NODE) {
+		this._nodes = this._nodes.concat(_61d5.childNodes._nodes);
+	} else {
+		this._nodes[this._nodes.length] = _61d5;
+	}
+	this.length = this._nodes.length;
+};
+DOMNodeList.prototype._cloneNodes = function DOMNodeList__cloneNodes(deep,
+		_61d7) {
+	var _61d8 = new DOMNodeList(this.ownerDocument, _61d7);
+	for ( var i = 0; i < this._nodes.length; i++) {
+		_61d8._appendChild(this._nodes[i].cloneNode(deep));
+	}
+	return _61d8;
+};
+DOMNodeList.prototype.toString = function DOMNodeList_toString() {
+	var ret = "";
+	for ( var i = 0; i < this.length; i++) {
+		ret += this._nodes[i].toString();
+	}
+	return ret;
+};
+DOMNamedNodeMap = function(_61dc, _61dd) {
+	this._class = addClass(this._class, "DOMNamedNodeMap");
+	this.DOMNodeList = DOMNodeList;
+	this.DOMNodeList(_61dc, _61dd);
+};
+DOMNamedNodeMap.prototype = new DOMNodeList;
+DOMNamedNodeMap.prototype.getNamedItem = function DOMNamedNodeMap_getNamedItem(
+		name) {
+	var ret = null;
+	var _61e0 = this._findNamedItemIndex(name);
+	if (_61e0 > -1) {
+		ret = this._nodes[_61e0];
+	}
+	return ret;
+};
+DOMNamedNodeMap.prototype.setNamedItem = function DOMNamedNodeMap_setNamedItem(
+		arg) {
+	if (this.ownerDocument.implementation.errorChecking) {
+		if (this.ownerDocument != arg.ownerDocument) {
+			throw (new DOMException(DOMException.WRONG_DOCUMENT_ERR));
+		}
+		if (this._readonly || (this.parentNode && this.parentNode._readonly)) {
+			throw (new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR));
+		}
+		if (arg.ownerElement && (arg.ownerElement != this.parentNode)) {
+			throw (new DOMException(DOMException.INUSE_ATTRIBUTE_ERR));
+		}
+	}
+	var _61e2 = this._findNamedItemIndex(arg.name);
+	var ret = null;
+	if (_61e2 > -1) {
+		ret = this._nodes[_61e2];
+		if (this.ownerDocument.implementation.errorChecking && ret._readonly) {
+			throw (new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR));
+		} else {
+			this._nodes[_61e2] = arg;
+		}
+	} else {
+		this._nodes[this.length] = arg;
+	}
+	this.length = this._nodes.length;
+	arg.ownerElement = this.parentNode;
+	return ret;
+};
+DOMNamedNodeMap.prototype.removeNamedItem = function DOMNamedNodeMap_removeNamedItem(
+		name) {
+	var ret = null;
+	if (this.ownerDocument.implementation.errorChecking
+			&& (this._readonly || (this.parentNode && this.parentNode._readonly))) {
+		throw (new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR));
+	}
+	var _61e6 = this._findNamedItemIndex(name);
+	if (this.ownerDocument.implementation.errorChecking && (_61e6 < 0)) {
+		throw (new DOMException(DOMException.NOT_FOUND_ERR));
+	}
+	var _61e7 = this._nodes[_61e6];
+	if (this.ownerDocument.implementation.errorChecking && _61e7._readonly) {
+		throw (new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR));
+	}
+	return this._removeChild(_61e6);
+};
+DOMNamedNodeMap.prototype.getNamedItemNS = function DOMNamedNodeMap_getNamedItemNS(
+		_61e8, _61e9) {
+	var ret = null;
+	var _61eb = this._findNamedItemNSIndex(_61e8, _61e9);
+	if (_61eb > -1) {
+		ret = this._nodes[_61eb];
+	}
+	return ret;
+};
+DOMNamedNodeMap.prototype.setNamedItemNS = function DOMNamedNodeMap_setNamedItemNS(
+		arg) {
+	if (this.ownerDocument.implementation.errorChecking) {
+		if (this._readonly || (this.parentNode && this.parentNode._readonly)) {
+			throw (new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR));
+		}
+		if (this.ownerDocument != arg.ownerDocument) {
+			throw (new DOMException(DOMException.WRONG_DOCUMENT_ERR));
+		}
+		if (arg.ownerElement && (arg.ownerElement != this.parentNode)) {
+			throw (new DOMException(DOMException.INUSE_ATTRIBUTE_ERR));
+		}
+	}
+	var _61ed = this._findNamedItemNSIndex(arg.namespaceURI, arg.localName);
+	var ret = null;
+	if (_61ed > -1) {
+		ret = this._nodes[_61ed];
+		if (this.ownerDocument.implementation.errorChecking && ret._readonly) {
+			throw (new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR));
+		} else {
+			this._nodes[_61ed] = arg;
+		}
+	} else {
+		this._nodes[this.length] = arg;
+	}
+	this.length = this._nodes.length;
+	arg.ownerElement = this.parentNode;
+	return ret;
+};
+DOMNamedNodeMap.prototype.removeNamedItemNS = function DOMNamedNodeMap_removeNamedItemNS(
+		_61ef, _61f0) {
+	var ret = null;
+	if (this.ownerDocument.implementation.errorChecking
+			&& (this._readonly || (this.parentNode && this.parentNode._readonly))) {
+		throw (new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR));
+	}
+	var _61f2 = this._findNamedItemNSIndex(_61ef, _61f0);
+	if (this.ownerDocument.implementation.errorChecking && (_61f2 < 0)) {
+		throw (new DOMException(DOMException.NOT_FOUND_ERR));
+	}
+	var _61f3 = this._nodes[_61f2];
+	if (this.ownerDocument.implementation.errorChecking && _61f3._readonly) {
+		throw (new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR));
+	}
+	return this._removeChild(_61f2);
+};
+DOMNamedNodeMap.prototype._findNamedItemIndex = function DOMNamedNodeMap__findNamedItemIndex(
+		name) {
+	var ret = -1;
+	for ( var i = 0; i < this._nodes.length; i++) {
+		if (this._nodes[i].name == name) {
+			ret = i;
+			break;
+		}
+	}
+	return ret;
+};
+DOMNamedNodeMap.prototype._findNamedItemNSIndex = function DOMNamedNodeMap__findNamedItemNSIndex(
+		_61f7, _61f8) {
+	var ret = -1;
+	if (_61f8) {
+		for ( var i = 0; i < this._nodes.length; i++) {
+			if ((this._nodes[i].namespaceURI == _61f7)
+					&& (this._nodes[i].localName == _61f8)) {
+				ret = i;
+				break;
+			}
+		}
+	}
+	return ret;
+};
+DOMNamedNodeMap.prototype._hasAttribute = function DOMNamedNodeMap__hasAttribute(
+		name) {
+	var ret = false;
+	var _61fd = this._findNamedItemIndex(name);
+	if (_61fd > -1) {
+		ret = true;
+	}
+	return ret;
+};
+DOMNamedNodeMap.prototype._hasAttributeNS = function DOMNamedNodeMap__hasAttributeNS(
+		_61fe, _61ff) {
+	var ret = false;
+	var _6201 = this._findNamedItemNSIndex(_61fe, _61ff);
+	if (_6201 > -1) {
+		ret = true;
+	}
+	return ret;
+};
+DOMNamedNodeMap.prototype._cloneNodes = function DOMNamedNodeMap__cloneNodes(
+		_6202) {
+	var _6203 = new DOMNamedNodeMap(this.ownerDocument, _6202);
+	for ( var i = 0; i < this._nodes.length; i++) {
+		_6203._appendChild(this._nodes[i].cloneNode(false));
+	}
+	return _6203;
+};
+DOMNamedNodeMap.prototype.toString = function DOMNamedNodeMap_toString() {
+	var ret = "";
+	for ( var i = 0; i < this.length - 1; i++) {
+		ret += this._nodes[i].toString() + " ";
+	}
+	if (this.length > 0) {
+		ret += this._nodes[this.length - 1].toString();
+	}
+	return ret;
+};
+DOMNamespaceNodeMap = function(_6207, _6208) {
+	this._class = addClass(this._class, "DOMNamespaceNodeMap");
+	this.DOMNamedNodeMap = DOMNamedNodeMap;
+	this.DOMNamedNodeMap(_6207, _6208);
+};
+DOMNamespaceNodeMap.prototype = new DOMNamedNodeMap;
+DOMNamespaceNodeMap.prototype._findNamedItemIndex = function DOMNamespaceNodeMap__findNamedItemIndex(
+		_6209) {
+	var ret = -1;
+	for ( var i = 0; i < this._nodes.length; i++) {
+		if (this._nodes[i].localName == _6209) {
+			ret = i;
+			break;
+		}
+	}
+	return ret;
+};
+DOMNamespaceNodeMap.prototype._cloneNodes = function DOMNamespaceNodeMap__cloneNodes(
+		_620c) {
+	var _620d = new DOMNamespaceNodeMap(this.ownerDocument, _620c);
+	for ( var i = 0; i < this._nodes.length; i++) {
+		_620d._appendChild(this._nodes[i].cloneNode(false));
+	}
+	return _620d;
+};
+DOMNamespaceNodeMap.prototype.toString = function DOMNamespaceNodeMap_toString() {
+	var ret = "";
+	for ( var ind = 0; ind < this._nodes.length; ind++) {
+		var ns = null;
+		try {
+			var ns = this.parentNode.parentNode._namespaces
+					.getNamedItem(this._nodes[ind].localName);
+		} catch (e) {
+			break;
+		}
+		if (!(ns && ("" + ns.nodeValue == "" + this._nodes[ind].nodeValue))) {
+			ret += this._nodes[ind].toString() + " ";
+		}
+	}
+	return ret;
+};
+DOMNode = function(_6212) {
+	this._class = addClass(this._class, "DOMNode");
+	if (_6212) {
+		this._id = _6212._genId();
+	}
+	this.namespaceURI = "";
+	this.prefix = "";
+	this.localName = "";
+	this.nodeName = "";
+	this.nodeValue = "";
+	this.nodeType = 0;
+	this.parentNode = null;
+	this.childNodes = new DOMNodeList(_6212, this);
+	this.firstChild = null;
+	this.lastChild = null;
+	this.previousSibling = null;
+	this.nextSibling = null;
+	this.attributes = new DOMNamedNodeMap(_6212, this);
+	this.ownerDocument = _6212;
+	this._namespaces = new DOMNamespaceNodeMap(_6212, this);
+	this._readonly = false;
+};
+DOMNode.ELEMENT_NODE = 1;
+DOMNode.ATTRIBUTE_NODE = 2;
+DOMNode.TEXT_NODE = 3;
+DOMNode.CDATA_SECTION_NODE = 4;
+DOMNode.ENTITY_REFERENCE_NODE = 5;
+DOMNode.ENTITY_NODE = 6;
+DOMNode.PROCESSING_INSTRUCTION_NODE = 7;
+DOMNode.COMMENT_NODE = 8;
+DOMNode.DOCUMENT_NODE = 9;
+DOMNode.DOCUMENT_TYPE_NODE = 10;
+DOMNode.DOCUMENT_FRAGMENT_NODE = 11;
+DOMNode.NOTATION_NODE = 12;
+DOMNode.NAMESPACE_NODE = 13;
+DOMNode.prototype.hasAttributes = function DOMNode_hasAttributes() {
+	if (this.attributes.length === 0) {
+		return false;
+	} else {
+		return true;
+	}
+};
+DOMNode.prototype.getNodeName = function DOMNode_getNodeName() {
+	return this.nodeName;
+};
+DOMNode.prototype.getNodeValue = function DOMNode_getNodeValue() {
+	return this.nodeValue;
+};
+DOMNode.prototype.setNodeValue = function DOMNode_setNodeValue(_6213) {
+	if (this.ownerDocument.implementation.errorChecking && this._readonly) {
+		throw (new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR));
+	}
+	this.nodeValue = _6213;
+};
+DOMNode.prototype.getNodeType = function DOMNode_getNodeType() {
+	return this.nodeType;
+};
+DOMNode.prototype.getParentNode = function DOMNode_getParentNode() {
+	return this.parentNode;
+};
+DOMNode.prototype.getChildNodes = function DOMNode_getChildNodes() {
+	return this.childNodes;
+};
+DOMNode.prototype.getFirstChild = function DOMNode_getFirstChild() {
+	return this.firstChild;
+};
+DOMNode.prototype.getLastChild = function DOMNode_getLastChild() {
+	return this.lastChild;
+};
+DOMNode.prototype.getPreviousSibling = function DOMNode_getPreviousSibling() {
+	return this.previousSibling;
+};
+DOMNode.prototype.getNextSibling = function DOMNode_getNextSibling() {
+	return this.nextSibling;
+};
+DOMNode.prototype.getAttributes = function DOMNode_getAttributes() {
+	return this.attributes;
+};
+DOMNode.prototype.getOwnerDocument = function DOMNode_getOwnerDocument() {
+	return this.ownerDocument;
+};
+DOMNode.prototype.getNamespaceURI = function DOMNode_getNamespaceURI() {
+	return this.namespaceURI;
+};
+DOMNode.prototype.getPrefix = function DOMNode_getPrefix() {
+	return this.prefix;
+};
+DOMNode.prototype.setPrefix = function DOMNode_setPrefix(_6214) {
+	if (this.ownerDocument.implementation.errorChecking) {
+		if (this._readonly) {
+			throw (new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR));
+		}
+		if (!this.ownerDocument.implementation._isValidName(_6214)) {
+			throw (new DOMException(DOMException.INVALID_CHARACTER_ERR));
+		}
+		if (!this.ownerDocument._isValidNamespace(this.namespaceURI, _6214
+				+ ":" + this.localName)) {
+			throw (new DOMException(DOMException.NAMESPACE_ERR));
+		}
+		if ((_6214 == "xmlns")
+				&& (this.namespaceURI != "http://www.w3.org/2000/xmlns/")) {
+			throw (new DOMException(DOMException.NAMESPACE_ERR));
+		}
+		if ((_6214 == "") && (this.localName == "xmlns")) {
+			throw (new DOMException(DOMException.NAMESPACE_ERR));
+		}
+	}
+	this.prefix = _6214;
+	if (this.prefix != "") {
+		this.nodeName = this.prefix + ":" + this.localName;
+	} else {
+		this.nodeName = this.localName;
+	}
+};
+DOMNode.prototype.getLocalName = function DOMNode_getLocalName() {
+	return this.localName;
+};
+DOMNode.prototype.insertBefore = function DOMNode_insertBefore(_6215, _6216) {
+	var _6217;
+	if (this.ownerDocument.implementation.errorChecking) {
+		if (this._readonly) {
+			throw (new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR));
+		}
+		if (this.ownerDocument != _6215.ownerDocument) {
+			throw (new DOMException(DOMException.WRONG_DOCUMENT_ERR));
+		}
+		if (this._isAncestor(_6215)) {
+			throw (new DOMException(DOMException.HIERARCHY_REQUEST_ERR));
+		}
+	}
+	if (_6216) {
+		var _6218 = this.childNodes._findItemIndex(_6216._id);
+		if (this.ownerDocument.implementation.errorChecking && (_6218 < 0)) {
+			throw (new DOMException(DOMException.NOT_FOUND_ERR));
+		}
+		var _6219 = _6215.parentNode;
+		if (_6219) {
+			_6219.removeChild(_6215);
+		}
+		this.childNodes._insertBefore(_6215, this.childNodes
+				._findItemIndex(_6216._id));
+		_6217 = _6216.previousSibling;
+		if (_6215.nodeType == DOMNode.DOCUMENT_FRAGMENT_NODE) {
+			if (_6215.childNodes._nodes.length > 0) {
+				for ( var ind = 0; ind < _6215.childNodes._nodes.length; ind++) {
+					_6215.childNodes._nodes[ind].parentNode = this;
+				}
+				_6216.previousSibling = _6215.childNodes._nodes[_6215.childNodes._nodes.length - 1];
+			}
+		} else {
+			_6215.parentNode = this;
+			_6216.previousSibling = _6215;
+		}
+	} else {
+		_6217 = this.lastChild;
+		this.appendChild(_6215);
+	}
+	if (_6215.nodeType == DOMNode.DOCUMENT_FRAGMENT_NODE) {
+		if (_6215.childNodes._nodes.length > 0) {
+			if (_6217) {
+				_6217.nextSibling = _6215.childNodes._nodes[0];
+			} else {
+				this.firstChild = _6215.childNodes._nodes[0];
+			}
+			_6215.childNodes._nodes[0].previousSibling = _6217;
+			_6215.childNodes._nodes[_6215.childNodes._nodes.length - 1].nextSibling = _6216;
+		}
+	} else {
+		if (_6217) {
+			_6217.nextSibling = _6215;
+		} else {
+			this.firstChild = _6215;
+		}
+		_6215.previousSibling = _6217;
+		_6215.nextSibling = _6216;
+	}
+	return _6215;
+};
+DOMNode.prototype.replaceChild = function DOMNode_replaceChild(_621b, _621c) {
+	var ret = null;
+	if (this.ownerDocument.implementation.errorChecking) {
+		if (this._readonly) {
+			throw (new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR));
+		}
+		if (this.ownerDocument != _621b.ownerDocument) {
+			throw (new DOMException(DOMException.WRONG_DOCUMENT_ERR));
+		}
+		if (this._isAncestor(_621b)) {
+			throw (new DOMException(DOMException.HIERARCHY_REQUEST_ERR));
+		}
+	}
+	var index = this.childNodes._findItemIndex(_621c._id);
+	if (this.ownerDocument.implementation.errorChecking && (index < 0)) {
+		throw (new DOMException(DOMException.NOT_FOUND_ERR));
+	}
+	var _621f = _621b.parentNode;
+	if (_621f) {
+		_621f.removeChild(_621b);
+	}
+	ret = this.childNodes._replaceChild(_621b, index);
+	if (_621b.nodeType == DOMNode.DOCUMENT_FRAGMENT_NODE) {
+		if (_621b.childNodes._nodes.length > 0) {
+			for ( var ind = 0; ind < _621b.childNodes._nodes.length; ind++) {
+				_621b.childNodes._nodes[ind].parentNode = this;
+			}
+			if (_621c.previousSibling) {
+				_621c.previousSibling.nextSibling = _621b.childNodes._nodes[0];
+			} else {
+				this.firstChild = _621b.childNodes._nodes[0];
+			}
+			if (_621c.nextSibling) {
+				_621c.nextSibling.previousSibling = _621b;
+			} else {
+				this.lastChild = _621b.childNodes._nodes[_621b.childNodes._nodes.length - 1];
+			}
+			_621b.childNodes._nodes[0].previousSibling = _621c.previousSibling;
+			_621b.childNodes._nodes[_621b.childNodes._nodes.length - 1].nextSibling = _621c.nextSibling;
+		}
+	} else {
+		_621b.parentNode = this;
+		if (_621c.previousSibling) {
+			_621c.previousSibling.nextSibling = _621b;
+		} else {
+			this.firstChild = _621b;
+		}
+		if (_621c.nextSibling) {
+			_621c.nextSibling.previousSibling = _621b;
+		} else {
+			this.lastChild = _621b;
+		}
+		_621b.previousSibling = _621c.previousSibling;
+		_621b.nextSibling = _621c.nextSibling;
+	}
+	return ret;
+};
+DOMNode.prototype.removeChild = function DOMNode_removeChild(_6221) {
+	if (this.ownerDocument.implementation.errorChecking
+			&& (this._readonly || _6221._readonly)) {
+		throw (new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR));
+	}
+	var _6222 = this.childNodes._findItemIndex(_6221._id);
+	if (this.ownerDocument.implementation.errorChecking && (_6222 < 0)) {
+		throw (new DOMException(DOMException.NOT_FOUND_ERR));
+	}
+	this.childNodes._removeChild(_6222);
+	_6221.parentNode = null;
+	if (_6221.previousSibling) {
+		_6221.previousSibling.nextSibling = _6221.nextSibling;
+	} else {
+		this.firstChild = _6221.nextSibling;
+	}
+	if (_6221.nextSibling) {
+		_6221.nextSibling.previousSibling = _6221.previousSibling;
+	} else {
+		this.lastChild = _6221.previousSibling;
+	}
+	_6221.previousSibling = null;
+	_6221.nextSibling = null;
+	return _6221;
+};
+DOMNode.prototype.appendChild = function DOMNode_appendChild(_6223) {
+	if (this.ownerDocument.implementation.errorChecking) {
+		if (this._readonly) {
+			throw (new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR));
+		}
+		if (this.ownerDocument != _6223.ownerDocument) {
+			throw (new DOMException(DOMException.WRONG_DOCUMENT_ERR));
+		}
+		if (this._isAncestor(_6223)) {
+			throw (new DOMException(DOMException.HIERARCHY_REQUEST_ERR));
+		}
+	}
+	var _6224 = _6223.parentNode;
+	if (_6224) {
+		_6224.removeChild(_6223);
+	}
+	this.childNodes._appendChild(_6223);
+	if (_6223.nodeType == DOMNode.DOCUMENT_FRAGMENT_NODE) {
+		if (_6223.childNodes._nodes.length > 0) {
+			for ( var ind = 0; ind < _6223.childNodes._nodes.length; ind++) {
+				_6223.childNodes._nodes[ind].parentNode = this;
+			}
+			if (this.lastChild) {
+				this.lastChild.nextSibling = _6223.childNodes._nodes[0];
+				_6223.childNodes._nodes[0].previousSibling = this.lastChild;
+				this.lastChild = _6223.childNodes._nodes[_6223.childNodes._nodes.length - 1];
+			} else {
+				this.lastChild = _6223.childNodes._nodes[_6223.childNodes._nodes.length - 1];
+				this.firstChild = _6223.childNodes._nodes[0];
+			}
+		}
+	} else {
+		_6223.parentNode = this;
+		if (this.lastChild) {
+			this.lastChild.nextSibling = _6223;
+			_6223.previousSibling = this.lastChild;
+			this.lastChild = _6223;
+		} else {
+			this.lastChild = _6223;
+			this.firstChild = _6223;
+		}
+	}
+	return _6223;
+};
+DOMNode.prototype.hasChildNodes = function DOMNode_hasChildNodes() {
+	return (this.childNodes.length > 0);
+};
+DOMNode.prototype.cloneNode = function DOMNode_cloneNode(deep) {
+	try {
+		return this.ownerDocument.importNode(this, deep);
+	} catch (e) {
+		return null;
+	}
+};
+DOMNode.prototype.normalize = function DOMNode_normalize() {
+	var inode;
+	var _6228 = new DOMNodeList();
+	if (this.nodeType == DOMNode.ELEMENT_NODE
+			|| this.nodeType == DOMNode.DOCUMENT_NODE) {
+		var _6229 = null;
+		for ( var i = 0; i < this.childNodes.length; i++) {
+			inode = this.childNodes.item(i);
+			if (inode.nodeType == DOMNode.TEXT_NODE) {
+				if (inode.length < 1) {
+					_6228._appendChild(inode);
+				} else {
+					if (_6229) {
+						_6229.appendData(inode.data);
+						_6228._appendChild(inode);
+					} else {
+						_6229 = inode;
+					}
+				}
+			} else {
+				_6229 = null;
+				inode.normalize();
+			}
+		}
+		for ( var i = 0; i < _6228.length; i++) {
+			inode = _6228.item(i);
+			inode.parentNode.removeChild(inode);
+		}
+	}
+};
+DOMNode.prototype.isSupported = function DOMNode_isSupported(_622b, _622c) {
+	return this.ownerDocument.implementation.hasFeature(_622b, _622c);
+};
+DOMNode.prototype.getElementsByTagName = function DOMNode_getElementsByTagName(
+		_622d) {
+	return this._getElementsByTagNameRecursive(_622d, new DOMNodeList(
+			this.ownerDocument));
+};
+DOMNode.prototype._getElementsByTagNameRecursive = function DOMNode__getElementsByTagNameRecursive(
+		_622e, _622f) {
+	if (this.nodeType == DOMNode.ELEMENT_NODE
+			|| this.nodeType == DOMNode.DOCUMENT_NODE) {
+		if ((this.nodeName == _622e) || (_622e == "*")) {
+			_622f._appendChild(this);
+		}
+		for ( var i = 0; i < this.childNodes.length; i++) {
+			_622f = this.childNodes.item(i)._getElementsByTagNameRecursive(
+					_622e, _622f);
+		}
+	}
+	return _622f;
+};
+DOMNode.prototype.getXML = function DOMNode_getXML() {
+	return this.toString();
+};
+DOMNode.prototype.getElementsByTagNameNS = function DOMNode_getElementsByTagNameNS(
+		_6231, _6232) {
+	return this._getElementsByTagNameNSRecursive(_6231, _6232, new DOMNodeList(
+			this.ownerDocument));
+};
+DOMNode.prototype._getElementsByTagNameNSRecursive = function DOMNode__getElementsByTagNameNSRecursive(
+		_6233, _6234, _6235) {
+	if (this.nodeType == DOMNode.ELEMENT_NODE
+			|| this.nodeType == DOMNode.DOCUMENT_NODE) {
+		if (((this.namespaceURI == _6233) || (_6233 == "*"))
+				&& ((this.localName == _6234) || (_6234 == "*"))) {
+			_6235._appendChild(this);
+		}
+		for ( var i = 0; i < this.childNodes.length; i++) {
+			_6235 = this.childNodes.item(i)._getElementsByTagNameNSRecursive(
+					_6233, _6234, _6235);
+		}
+	}
+	return _6235;
+};
+DOMNode.prototype._isAncestor = function DOMNode__isAncestor(node) {
+	return ((this == node) || ((this.parentNode) && (this.parentNode
+			._isAncestor(node))));
+};
+DOMNode.prototype.importNode = function DOMNode_importNode(_6238, deep) {
+	var _623a;
+	this.getOwnerDocument()._performingImportNodeOperation = true;
+	try {
+		if (_6238.nodeType == DOMNode.ELEMENT_NODE) {
+			if (!this.ownerDocument.implementation.namespaceAware) {
+				_623a = this.ownerDocument.createElement(_6238.tagName);
+				for ( var i = 0; i < _6238.attributes.length; i++) {
+					_623a.setAttribute(_6238.attributes.item(i).name,
+							_6238.attributes.item(i).value);
+				}
+			} else {
+				_623a = this.ownerDocument.createElementNS(_6238.namespaceURI,
+						_6238.nodeName);
+				for ( var i = 0; i < _6238.attributes.length; i++) {
+					_623a.setAttributeNS(_6238.attributes.item(i).namespaceURI,
+							_6238.attributes.item(i).name, _6238.attributes
+									.item(i).value);
+				}
+				for ( var i = 0; i < _6238._namespaces.length; i++) {
+					_623a._namespaces._nodes[i] = this.ownerDocument
+							.createNamespace(_6238._namespaces.item(i).localName);
+					_623a._namespaces._nodes[i].setValue(_6238._namespaces
+							.item(i).value);
+				}
+			}
+		} else {
+			if (_6238.nodeType == DOMNode.ATTRIBUTE_NODE) {
+				if (!this.ownerDocument.implementation.namespaceAware) {
+					_623a = this.ownerDocument.createAttribute(_6238.name);
+				} else {
+					_623a = this.ownerDocument.createAttributeNS(
+							_6238.namespaceURI, _6238.nodeName);
+					for ( var i = 0; i < _6238._namespaces.length; i++) {
+						_623a._namespaces._nodes[i] = this.ownerDocument
+								.createNamespace(_6238._namespaces.item(i).localName);
+						_623a._namespaces._nodes[i].setValue(_6238._namespaces
+								.item(i).value);
+					}
+				}
+				_623a.setValue(_6238.value);
+			} else {
+				if (_6238.nodeType == DOMNode.DOCUMENT_FRAGMENT) {
+					_623a = this.ownerDocument.createDocumentFragment();
+				} else {
+					if (_6238.nodeType == DOMNode.NAMESPACE_NODE) {
+						_623a = this.ownerDocument
+								.createNamespace(_6238.nodeName);
+						_623a.setValue(_6238.value);
+					} else {
+						if (_6238.nodeType == DOMNode.TEXT_NODE) {
+							_623a = this.ownerDocument
+									.createTextNode(_6238.data);
+						} else {
+							if (_6238.nodeType == DOMNode.CDATA_SECTION_NODE) {
+								_623a = this.ownerDocument
+										.createCDATASection(_6238.data);
+							} else {
+								if (_6238.nodeType == DOMNode.PROCESSING_INSTRUCTION_NODE) {
+									_623a = this.ownerDocument
+											.createProcessingInstruction(
+													_6238.target, _6238.data);
+								} else {
+									if (_6238.nodeType == DOMNode.COMMENT_NODE) {
+										_623a = this.ownerDocument
+												.createComment(_6238.data);
+									} else {
+										throw (new DOMException(
+												DOMException.NOT_SUPPORTED_ERR));
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		if (deep) {
+			for ( var i = 0; i < _6238.childNodes.length; i++) {
+				_623a.appendChild(this.ownerDocument.importNode(
+						_6238.childNodes.item(i), true));
+			}
+		}
+		this.getOwnerDocument()._performingImportNodeOperation = false;
+		return _623a;
+	} catch (eAny) {
+		this.getOwnerDocument()._performingImportNodeOperation = false;
+		throw eAny;
+	}
+};
+DOMNode.prototype.__escapeString = function DOMNode__escapeString(str) {
+	return __escapeString(str);
+};
+DOMNode.prototype.__unescapeString = function DOMNode__unescapeString(str) {
+	return __unescapeString(str);
+};
+DOMDocument = function(_623e) {
+	this._class = addClass(this._class, "DOMDocument");
+	this.DOMNode = DOMNode;
+	this.DOMNode(this);
+	this.doctype = null;
+	this.implementation = _623e;
+	this.documentElement = null;
+	this.all = [];
+	this.nodeName = "#document";
+	this.nodeType = DOMNode.DOCUMENT_NODE;
+	this._id = 0;
+	this._lastId = 0;
+	this._parseComplete = false;
+	this.ownerDocument = this;
+	this._performingImportNodeOperation = false;
+};
+DOMDocument.prototype = new DOMNode;
+DOMDocument.prototype.getDoctype = function DOMDocument_getDoctype() {
+	return this.doctype;
+};
+DOMDocument.prototype.getImplementation = function DOMDocument_implementation() {
+	return this.implementation;
+};
+DOMDocument.prototype.getDocumentElement = function DOMDocument_getDocumentElement() {
+	return this.documentElement;
+};
+DOMDocument.prototype.createElement = function DOMDocument_createElement(_623f) {
+	if (this.ownerDocument.implementation.errorChecking
+			&& (!this.ownerDocument.implementation._isValidName(_623f))) {
+		throw (new DOMException(DOMException.INVALID_CHARACTER_ERR));
+	}
+	var node = new DOMElement(this);
+	node.tagName = _623f;
+	node.nodeName = _623f;
+	this.all[this.all.length] = node;
+	return node;
+};
+DOMDocument.prototype.createDocumentFragment = function DOMDocument_createDocumentFragment() {
+	var node = new DOMDocumentFragment(this);
+	return node;
+};
+DOMDocument.prototype.createTextNode = function DOMDocument_createTextNode(data) {
+	var node = new DOMText(this);
+	node.data = data;
+	node.nodeValue = data;
+	node.length = data.length;
+	return node;
+};
+DOMDocument.prototype.createComment = function DOMDocument_createComment(data) {
+	var node = new DOMComment(this);
+	node.data = data;
+	node.nodeValue = data;
+	node.length = data.length;
+	return node;
+};
+DOMDocument.prototype.createCDATASection = function DOMDocument_createCDATASection(
+		data) {
+	var node = new DOMCDATASection(this);
+	node.data = data;
+	node.nodeValue = data;
+	node.length = data.length;
+	return node;
+};
+DOMDocument.prototype.createProcessingInstruction = function DOMDocument_createProcessingInstruction(
+		_6248, data) {
+	if (this.ownerDocument.implementation.errorChecking
+			&& (!this.implementation._isValidName(_6248))) {
+		throw (new DOMException(DOMException.INVALID_CHARACTER_ERR));
+	}
+	var node = new DOMProcessingInstruction(this);
+	node.target = _6248;
+	node.nodeName = _6248;
+	node.data = data;
+	node.nodeValue = data;
+	node.length = data.length;
+	return node;
+};
+DOMDocument.prototype.createAttribute = function DOMDocument_createAttribute(
+		name) {
+	if (this.ownerDocument.implementation.errorChecking
+			&& (!this.ownerDocument.implementation._isValidName(name))) {
+		throw (new DOMException(DOMException.INVALID_CHARACTER_ERR));
+	}
+	var node = new DOMAttr(this);
+	node.name = name;
+	node.nodeName = name;
+	return node;
+};
+DOMDocument.prototype.createElementNS = function DOMDocument_createElementNS(
+		_624d, _624e) {
+	if (this.ownerDocument.implementation.errorChecking) {
+		if (!this.ownerDocument._isValidNamespace(_624d, _624e)) {
+			throw (new DOMException(DOMException.NAMESPACE_ERR));
+		}
+		if (!this.ownerDocument.implementation._isValidName(_624e)) {
+			throw (new DOMException(DOMException.INVALID_CHARACTER_ERR));
+		}
+	}
+	var node = new DOMElement(this);
+	var qname = this.implementation._parseQName(_624e);
+	node.nodeName = _624e;
+	node.namespaceURI = _624d;
+	node.prefix = qname.prefix;
+	node.localName = qname.localName;
+	node.tagName = _624e;
+	this.all[this.all.length] = node;
+	return node;
+};
+DOMDocument.prototype.createAttributeNS = function DOMDocument_createAttributeNS(
+		_6251, _6252) {
+	if (this.ownerDocument.implementation.errorChecking) {
+		if (!this.ownerDocument._isValidNamespace(_6251, _6252, true)) {
+			throw (new DOMException(DOMException.NAMESPACE_ERR));
+		}
+		if (!this.ownerDocument.implementation._isValidName(_6252)) {
+			throw (new DOMException(DOMException.INVALID_CHARACTER_ERR));
+		}
+	}
+	var node = new DOMAttr(this);
+	var qname = this.implementation._parseQName(_6252);
+	node.nodeName = _6252;
+	node.namespaceURI = _6251;
+	node.prefix = qname.prefix;
+	node.localName = qname.localName;
+	node.name = _6252;
+	node.nodeValue = "";
+	return node;
+};
+DOMDocument.prototype.createNamespace = function DOMDocument_createNamespace(
+		_6255) {
+	var node = new DOMNamespace(this);
+	var qname = this.implementation._parseQName(_6255);
+	node.nodeName = _6255;
+	node.prefix = qname.prefix;
+	node.localName = qname.localName;
+	node.name = _6255;
+	node.nodeValue = "";
+	return node;
+};
+DOMDocument.prototype.getElementById = function DOMDocument_getElementById(
+		_6258) {
+	retNode = null;
+	for ( var i = 0; i < this.all.length; i++) {
+		var node = this.all[i];
+		if ((node.id == _6258)
+				&& (node._isAncestor(node.ownerDocument.documentElement))) {
+			retNode = node;
+			break;
+		}
+	}
+	return retNode;
+};
+DOMDocument.prototype._genId = function DOMDocument__genId() {
+	this._lastId += 1;
+	return this._lastId;
+};
+DOMDocument.prototype._isValidNamespace = function DOMDocument__isValidNamespace(
+		_625b, _625c, _625d) {
+	if (this._performingImportNodeOperation == true) {
+		return true;
+	}
+	var valid = true;
+	var qName = this.implementation._parseQName(_625c);
+	if (this._parseComplete == true) {
+		if (qName.localName.indexOf(":") > -1) {
+			valid = false;
+		}
+		if ((valid) && (!_625d)) {
+			if (!_625b) {
+				valid = false;
+			}
+		}
+		if ((valid) && (qName.prefix == "")) {
+			valid = false;
+		}
+	}
+	if ((valid) && (qName.prefix == "xml")
+			&& (_625b != "http://www.w3.org/XML/1998/namespace")) {
+		valid = false;
+	}
+	return valid;
+};
+DOMDocument.prototype.toString = function DOMDocument_toString() {
+	return "" + this.childNodes;
+};
+DOMElement = function(_6260) {
+	this._class = addClass(this._class, "DOMElement");
+	this.DOMNode = DOMNode;
+	this.DOMNode(_6260);
+	this.tagName = "";
+	this.id = "";
+	this.nodeType = DOMNode.ELEMENT_NODE;
+};
+DOMElement.prototype = new DOMNode;
+DOMElement.prototype.getTagName = function DOMElement_getTagName() {
+	return this.tagName;
+};
+DOMElement.prototype.getAttribute = function DOMElement_getAttribute(name) {
+	var ret = "";
+	var attr = this.attributes.getNamedItem(name);
+	if (attr) {
+		ret = attr.value;
+	}
+	return ret;
+};
+DOMElement.prototype.setAttribute = function DOMElement_setAttribute(name,
+		value) {
+	var attr = this.attributes.getNamedItem(name);
+	if (!attr) {
+		attr = this.ownerDocument.createAttribute(name);
+	}
+	var value = new String(value);
+	if (this.ownerDocument.implementation.errorChecking) {
+		if (attr._readonly) {
+			throw (new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR));
+		}
+		if (!this.ownerDocument.implementation._isValidString(value)) {
+			throw (new DOMException(DOMException.INVALID_CHARACTER_ERR));
+		}
+	}
+	if (this.ownerDocument.implementation._isIdDeclaration(name)) {
+		this.id = value;
+	}
+	attr.value = value;
+	attr.nodeValue = value;
+	if (value.length > 0) {
+		attr.specified = true;
+	} else {
+		attr.specified = false;
+	}
+	this.attributes.setNamedItem(attr);
+};
+DOMElement.prototype.removeAttribute = function DOMElement_removeAttribute(name) {
+	return this.attributes.removeNamedItem(name);
+};
+DOMElement.prototype.getAttributeNode = function DOMElement_getAttributeNode(
+		name) {
+	return this.attributes.getNamedItem(name);
+};
+DOMElement.prototype.setAttributeNode = function DOMElement_setAttributeNode(
+		_6269) {
+	if (this.ownerDocument.implementation._isIdDeclaration(_6269.name)) {
+		this.id = _6269.value;
+	}
+	return this.attributes.setNamedItem(_6269);
+};
+DOMElement.prototype.removeAttributeNode = function DOMElement_removeAttributeNode(
+		_626a) {
+	if (this.ownerDocument.implementation.errorChecking && _626a._readonly) {
+		throw (new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR));
+	}
+	var _626b = this.attributes._findItemIndex(_626a._id);
+	if (this.ownerDocument.implementation.errorChecking && (_626b < 0)) {
+		throw (new DOMException(DOMException.NOT_FOUND_ERR));
+	}
+	return this.attributes._removeChild(_626b);
+};
+DOMElement.prototype.getAttributeNS = function DOMElement_getAttributeNS(_626c,
+		_626d) {
+	var ret = "";
+	var attr = this.attributes.getNamedItemNS(_626c, _626d);
+	if (attr) {
+		ret = attr.value;
+	}
+	return ret;
+};
+DOMElement.prototype.setAttributeNS = function DOMElement_setAttributeNS(_6270,
+		_6271, value) {
+	var attr = this.attributes.getNamedItem(_6270, _6271);
+	if (!attr) {
+		attr = this.ownerDocument.createAttributeNS(_6270, _6271);
+	}
+	var value = new String(value);
+	if (this.ownerDocument.implementation.errorChecking) {
+		if (attr._readonly) {
+			throw (new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR));
+		}
+		if (!this.ownerDocument._isValidNamespace(_6270, _6271)) {
+			throw (new DOMException(DOMException.NAMESPACE_ERR));
+		}
+		if (!this.ownerDocument.implementation._isValidString(value)) {
+			throw (new DOMException(DOMException.INVALID_CHARACTER_ERR));
+		}
+	}
+	if (this.ownerDocument.implementation._isIdDeclaration(name)) {
+		this.id = value;
+	}
+	attr.value = value;
+	attr.nodeValue = value;
+	if (value.length > 0) {
+		attr.specified = true;
+	} else {
+		attr.specified = false;
+	}
+	this.attributes.setNamedItemNS(attr);
+};
+DOMElement.prototype.removeAttributeNS = function DOMElement_removeAttributeNS(
+		_6274, _6275) {
+	return this.attributes.removeNamedItemNS(_6274, _6275);
+};
+DOMElement.prototype.getAttributeNodeNS = function DOMElement_getAttributeNodeNS(
+		_6276, _6277) {
+	return this.attributes.getNamedItemNS(_6276, _6277);
+};
+DOMElement.prototype.setAttributeNodeNS = function DOMElement_setAttributeNodeNS(
+		_6278) {
+	if ((_6278.prefix == "")
+			&& this.ownerDocument.implementation._isIdDeclaration(_6278.name)) {
+		this.id = _6278.value;
+	}
+	return this.attributes.setNamedItemNS(_6278);
+};
+DOMElement.prototype.hasAttribute = function DOMElement_hasAttribute(name) {
+	return this.attributes._hasAttribute(name);
+};
+DOMElement.prototype.hasAttributeNS = function DOMElement_hasAttributeNS(_627a,
+		_627b) {
+	return this.attributes._hasAttributeNS(_627a, _627b);
+};
+DOMElement.prototype.toString = function DOMElement_toString() {
+	var ret = "";
+	var ns = this._namespaces.toString();
+	if (ns.length > 0) {
+		ns = " " + ns;
+	}
+	var attrs = this.attributes.toString();
+	if (attrs.length > 0) {
+		attrs = " " + attrs;
+	}
+	ret += "<" + this.nodeName + ns + attrs + ">";
+	ret += this.childNodes.toString();
+	ret += "</" + this.nodeName + ">";
+	return ret;
+};
+DOMAttr = function(_627f) {
+	this._class = addClass(this._class, "DOMAttr");
+	this.DOMNode = DOMNode;
+	this.DOMNode(_627f);
+	this.name = "";
+	this.specified = false;
+	this.value = "";
+	this.nodeType = DOMNode.ATTRIBUTE_NODE;
+	this.ownerElement = null;
+	this.childNodes = null;
+	this.attributes = null;
+};
+DOMAttr.prototype = new DOMNode;
+DOMAttr.prototype.getName = function DOMAttr_getName() {
+	return this.nodeName;
+};
+DOMAttr.prototype.getSpecified = function DOMAttr_getSpecified() {
+	return this.specified;
+};
+DOMAttr.prototype.getValue = function DOMAttr_getValue() {
+	return this.nodeValue;
+};
+DOMAttr.prototype.setValue = function DOMAttr_setValue(value) {
+	if (this.ownerDocument.implementation.errorChecking && this._readonly) {
+		throw (new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR));
+	}
+	this.setNodeValue(value);
+};
+DOMAttr.prototype.setNodeValue = function DOMAttr_setNodeValue(value) {
+	this.nodeValue = new String(value);
+	this.value = this.nodeValue;
+	this.specified = (this.value.length > 0);
+};
+DOMAttr.prototype.toString = function DOMAttr_toString() {
+	var ret = "";
+	ret += this.nodeName + "=\"" + this.__escapeString(this.nodeValue) + "\"";
+	return ret;
+};
+DOMAttr.prototype.getOwnerElement = function() {
+	return this.ownerElement;
+};
+DOMNamespace = function(_6283) {
+	this._class = addClass(this._class, "DOMNamespace");
+	this.DOMNode = DOMNode;
+	this.DOMNode(_6283);
+	this.name = "";
+	this.specified = false;
+	this.value = "";
+	this.nodeType = DOMNode.NAMESPACE_NODE;
+};
+DOMNamespace.prototype = new DOMNode;
+DOMNamespace.prototype.getValue = function DOMNamespace_getValue() {
+	return this.nodeValue;
+};
+DOMNamespace.prototype.setValue = function DOMNamespace_setValue(value) {
+	this.nodeValue = new String(value);
+	this.value = this.nodeValue;
+};
+DOMNamespace.prototype.toString = function DOMNamespace_toString() {
+	var ret = "";
+	if (this.nodeName != "") {
+		ret += this.nodeName + "=\"" + this.__escapeString(this.nodeValue)
+				+ "\"";
+	} else {
+		ret += "xmlns=\"" + this.__escapeString(this.nodeValue) + "\"";
+	}
+	return ret;
+};
+DOMCharacterData = function(_6286) {
+	this._class = addClass(this._class, "DOMCharacterData");
+	this.DOMNode = DOMNode;
+	this.DOMNode(_6286);
+	this.data = "";
+	this.length = 0;
+};
+DOMCharacterData.prototype = new DOMNode;
+DOMCharacterData.prototype.getData = function DOMCharacterData_getData() {
+	return this.nodeValue;
+};
+DOMCharacterData.prototype.setData = function DOMCharacterData_setData(data) {
+	this.setNodeValue(data);
+};
+DOMCharacterData.prototype.setNodeValue = function DOMCharacterData_setNodeValue(
+		data) {
+	if (this.ownerDocument.implementation.errorChecking && this._readonly) {
+		throw (new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR));
+	}
+	this.nodeValue = new String(data);
+	this.data = this.nodeValue;
+	this.length = this.nodeValue.length;
+};
+DOMCharacterData.prototype.getLength = function DOMCharacterData_getLength() {
+	return this.nodeValue.length;
+};
+DOMCharacterData.prototype.substringData = function DOMCharacterData_substringData(
+		_6289, count) {
+	var ret = null;
+	if (this.data) {
+		if (this.ownerDocument.implementation.errorChecking
+				&& ((_6289 < 0) || (_6289 > this.data.length) || (count < 0))) {
+			throw (new DOMException(DOMException.INDEX_SIZE_ERR));
+		}
+		if (!count) {
+			ret = this.data.substring(_6289);
+		} else {
+			ret = this.data.substring(_6289, _6289 + count);
+		}
+	}
+	return ret;
+};
+DOMCharacterData.prototype.appendData = function DOMCharacterData_appendData(
+		arg) {
+	if (this.ownerDocument.implementation.errorChecking && this._readonly) {
+		throw (new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR));
+	}
+	this.setData("" + this.data + arg);
+};
+DOMCharacterData.prototype.insertData = function DOMCharacterData_insertData(
+		_628d, arg) {
+	if (this.ownerDocument.implementation.errorChecking && this._readonly) {
+		throw (new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR));
+	}
+	if (this.data) {
+		if (this.ownerDocument.implementation.errorChecking
+				&& ((_628d < 0) || (_628d > this.data.length))) {
+			throw (new DOMException(DOMException.INDEX_SIZE_ERR));
+		}
+		this.setData(this.data.substring(0, _628d).concat(arg,
+				this.data.substring(_628d)));
+	} else {
+		if (this.ownerDocument.implementation.errorChecking && (_628d != 0)) {
+			throw (new DOMException(DOMException.INDEX_SIZE_ERR));
+		}
+		this.setData(arg);
+	}
+};
+DOMCharacterData.prototype.deleteData = function DOMCharacterData_deleteData(
+		_628f, count) {
+	if (this.ownerDocument.implementation.errorChecking && this._readonly) {
+		throw (new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR));
+	}
+	if (this.data) {
+		if (this.ownerDocument.implementation.errorChecking
+				&& ((_628f < 0) || (_628f > this.data.length) || (count < 0))) {
+			throw (new DOMException(DOMException.INDEX_SIZE_ERR));
+		}
+		if (!count || (_628f + count) > this.data.length) {
+			this.setData(this.data.substring(0, _628f));
+		} else {
+			this.setData(this.data.substring(0, _628f).concat(
+					this.data.substring(_628f + count)));
+		}
+	}
+};
+DOMCharacterData.prototype.replaceData = function DOMCharacterData_replaceData(
+		_6291, count, arg) {
+	if (this.ownerDocument.implementation.errorChecking && this._readonly) {
+		throw (new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR));
+	}
+	if (this.data) {
+		if (this.ownerDocument.implementation.errorChecking
+				&& ((_6291 < 0) || (_6291 > this.data.length) || (count < 0))) {
+			throw (new DOMException(DOMException.INDEX_SIZE_ERR));
+		}
+		this.setData(this.data.substring(0, _6291).concat(arg,
+				this.data.substring(_6291 + count)));
+	} else {
+		this.setData(arg);
+	}
+};
+DOMText = function(_6294) {
+	this._class = addClass(this._class, "DOMText");
+	this.DOMCharacterData = DOMCharacterData;
+	this.DOMCharacterData(_6294);
+	this.nodeName = "#text";
+	this.nodeType = DOMNode.TEXT_NODE;
+};
+DOMText.prototype = new DOMCharacterData;
+DOMText.prototype.splitText = function DOMText_splitText(_6295) {
+	var data, inode;
+	if (this.ownerDocument.implementation.errorChecking) {
+		if (this._readonly) {
+			throw (new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR));
+		}
+		if ((_6295 < 0) || (_6295 > this.data.length)) {
+			throw (new DOMException(DOMException.INDEX_SIZE_ERR));
+		}
+	}
+	if (this.parentNode) {
+		data = this.substringData(_6295);
+		inode = this.ownerDocument.createTextNode(data);
+		if (this.nextSibling) {
+			this.parentNode.insertBefore(inode, this.nextSibling);
+		} else {
+			this.parentNode.appendChild(inode);
+		}
+		this.deleteData(_6295);
+	}
+	return inode;
+};
+DOMText.prototype.toString = function DOMText_toString() {
+	return this.__escapeString("" + this.nodeValue);
+};
+DOMCDATASection = function(_6297) {
+	this._class = addClass(this._class, "DOMCDATASection");
+	this.DOMCharacterData = DOMCharacterData;
+	this.DOMCharacterData(_6297);
+	this.nodeName = "#cdata-section";
+	this.nodeType = DOMNode.CDATA_SECTION_NODE;
+};
+DOMCDATASection.prototype = new DOMCharacterData;
+DOMCDATASection.prototype.splitText = function DOMCDATASection_splitText(_6298) {
+	var data, inode;
+	if (this.ownerDocument.implementation.errorChecking) {
+		if (this._readonly) {
+			throw (new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR));
+		}
+		if ((_6298 < 0) || (_6298 > this.data.length)) {
+			throw (new DOMException(DOMException.INDEX_SIZE_ERR));
+		}
+	}
+	if (this.parentNode) {
+		data = this.substringData(_6298);
+		inode = this.ownerDocument.createCDATASection(data);
+		if (this.nextSibling) {
+			this.parentNode.insertBefore(inode, this.nextSibling);
+		} else {
+			this.parentNode.appendChild(inode);
+		}
+		this.deleteData(_6298);
+	}
+	return inode;
+};
+DOMCDATASection.prototype.toString = function DOMCDATASection_toString() {
+	var ret = "";
+	ret += "<![CDATA[" + this.nodeValue + "]]>";
+	return ret;
+};
+DOMComment = function(_629b) {
+	this._class = addClass(this._class, "DOMComment");
+	this.DOMCharacterData = DOMCharacterData;
+	this.DOMCharacterData(_629b);
+	this.nodeName = "#comment";
+	this.nodeType = DOMNode.COMMENT_NODE;
+};
+DOMComment.prototype = new DOMCharacterData;
+DOMComment.prototype.toString = function DOMComment_toString() {
+	var ret = "";
+	ret += "<!--" + this.nodeValue + "-->";
+	return ret;
+};
+DOMProcessingInstruction = function(_629d) {
+	this._class = addClass(this._class, "DOMProcessingInstruction");
+	this.DOMNode = DOMNode;
+	this.DOMNode(_629d);
+	this.target = "";
+	this.data = "";
+	this.nodeType = DOMNode.PROCESSING_INSTRUCTION_NODE;
+};
+DOMProcessingInstruction.prototype = new DOMNode;
+DOMProcessingInstruction.prototype.getTarget = function DOMProcessingInstruction_getTarget() {
+	return this.nodeName;
+};
+DOMProcessingInstruction.prototype.getData = function DOMProcessingInstruction_getData() {
+	return this.nodeValue;
+};
+DOMProcessingInstruction.prototype.setData = function DOMProcessingInstruction_setData(
+		data) {
+	this.setNodeValue(data);
+};
+DOMProcessingInstruction.prototype.setNodeValue = function DOMProcessingInstruction_setNodeValue(
+		data) {
+	if (this.ownerDocument.implementation.errorChecking && this._readonly) {
+		throw (new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR));
+	}
+	this.nodeValue = new String(data);
+	this.data = this.nodeValue;
+};
+DOMProcessingInstruction.prototype.toString = function DOMProcessingInstruction_toString() {
+	var ret = "";
+	ret += "<?" + this.nodeName + " " + this.nodeValue + " ?>";
+	return ret;
+};
+DOMDocumentFragment = function(_62a1) {
+	this._class = addClass(this._class, "DOMDocumentFragment");
+	this.DOMNode = DOMNode;
+	this.DOMNode(_62a1);
+	this.nodeName = "#document-fragment";
+	this.nodeType = DOMNode.DOCUMENT_FRAGMENT_NODE;
+};
+DOMDocumentFragment.prototype = new DOMNode;
+DOMDocumentFragment.prototype.toString = function DOMDocumentFragment_toString() {
+	var xml = "";
+	var _62a3 = this.getChildNodes().getLength();
+	for (intLoop = 0; intLoop < _62a3; intLoop++) {
+		xml += this.getChildNodes().item(intLoop).toString();
+	}
+	return xml;
+};
+DOMDocumentType = function() {
+	alert("DOMDocumentType.constructor(): Not Implemented");
+};
+DOMEntity = function() {
+	alert("DOMEntity.constructor(): Not Implemented");
+};
+DOMEntityReference = function() {
+	alert("DOMEntityReference.constructor(): Not Implemented");
+};
+DOMNotation = function() {
+	alert("DOMNotation.constructor(): Not Implemented");
+};
+Strings = new Object();
+Strings.WHITESPACE = " \t\n\r";
+Strings.QUOTES = "\"'";
+Strings.isEmpty = function Strings_isEmpty(strD) {
+	return (strD === null) || (strD.length === 0);
+};
+Strings.indexOfNonWhitespace = function Strings_indexOfNonWhitespace(strD, iB,
+		iE) {
+	if (Strings.isEmpty(strD)) {
+		return -1;
+	}
+	iB = iB || 0;
+	iE = iE || strD.length;
+	for ( var i = iB; i < iE; i++) {
+		if (Strings.WHITESPACE.indexOf(strD.charAt(i)) == -1) {
+			return i;
+		}
+	}
+	return -1;
+};
+Strings.lastIndexOfNonWhitespace = function Strings_lastIndexOfNonWhitespace(
+		strD, iB, iE) {
+	if (Strings.isEmpty(strD)) {
+		return -1;
+	}
+	iB = iB || 0;
+	iE = iE || strD.length;
+	for ( var i = iE - 1; i >= iB; i--) {
+		if (Strings.WHITESPACE.indexOf(strD.charAt(i)) == -1) {
+			return i;
+		}
+	}
+	return -1;
+};
+Strings.indexOfWhitespace = function Strings_indexOfWhitespace(strD, iB, iE) {
+	if (Strings.isEmpty(strD)) {
+		return -1;
+	}
+	iB = iB || 0;
+	iE = iE || strD.length;
+	for ( var i = iB; i < iE; i++) {
+		if (Strings.WHITESPACE.indexOf(strD.charAt(i)) != -1) {
+			return i;
+		}
+	}
+	return -1;
+};
+Strings.replace = function Strings_replace(strD, iB, iE, strF, strR) {
+	if (Strings.isEmpty(strD)) {
+		return "";
+	}
+	iB = iB || 0;
+	iE = iE || strD.length;
+	return strD.substring(iB, iE).split(strF).join(strR);
+};
+Strings.getLineNumber = function Strings_getLineNumber(strD, iP) {
+	if (Strings.isEmpty(strD)) {
+		return -1;
+	}
+	iP = iP || strD.length;
+	return strD.substring(0, iP).split("\n").length;
+};
+Strings.getColumnNumber = function Strings_getColumnNumber(strD, iP) {
+	if (Strings.isEmpty(strD)) {
+		return -1;
+	}
+	iP = iP || strD.length;
+	var arrD = strD.substring(0, iP).split("\n");
+	var _62bb = arrD[arrD.length - 1];
+	arrD.length--;
+	var _62bc = arrD.join("\n").length;
+	return iP - _62bc;
+};
+StringBuffer = function() {
+	this._a = [];
+};
+StringBuffer.prototype.append = function StringBuffer_append(d) {
+	this._a[this._a.length] = d;
+};
+StringBuffer.prototype.toString = function StringBuffer_toString() {
+	return this._a.join("");
+};
+draw2d.XMLSerializer = function() {
+	alert("do not init this class. Use the static methods instead");
+};
+draw2d.XMLSerializer.toXML = function(obj, _5717, _5718) {
+	if (_5717 == undefined) {
+		_5717 = "model";
+	}
+	_5718 = _5718 ? _5718 : "";
+	var t = draw2d.XMLSerializer.getTypeName(obj);
+	var s = _5718 + "<" + _5717 + " type=\"" + t + "\">";
+	switch (t) {
+	case "int":
+	case "number":
+	case "boolean":
+		s += obj;
+		break;
+	case "string":
+		s += draw2d.XMLSerializer.xmlEncode(obj);
+		break;
+	case "date":
+		s += obj.toLocaleString();
+		break;
+	case "Array":
+	case "array":
+		s += "\n";
+		var _571b = _5718 + "   ";
+		for ( var i = 0; i < obj.length; i++) {
+			s += draw2d.XMLSerializer.toXML(obj[i], ("element"), _571b);
+		}
+		s += _5718;
+		break;
+	default:
+		if (obj !== null) {
+			s += "\n";
+			if (obj instanceof draw2d.ArrayList) {
+				obj.trimToSize();
+			}
+			var _571d = obj.getPersistentAttributes();
+			var _571b = _5718 + "   ";
+			for ( var name in _571d) {
+				s += draw2d.XMLSerializer.toXML(_571d[name], name, _571b);
+			}
+			s += _5718;
+		}
+		break;
+	}
+	s += "</" + _5717 + ">\n";
+	return s;
+};
+draw2d.XMLSerializer.isSimpleVar = function(t) {
+	switch (t) {
+	case "int":
+	case "string":
+	case "String":
+	case "Number":
+	case "number":
+	case "Boolean":
+	case "boolean":
+	case "bool":
+	case "dateTime":
+	case "Date":
+	case "date":
+	case "float":
+		return true;
+	}
+	return false;
+};
+draw2d.XMLSerializer.getTypeName = function(obj) {
+	if (obj === null) {
+		return "undefined";
+	}
+	if (obj instanceof Array) {
+		return "Array";
+	}
+	if (obj instanceof Date) {
+		return "Date";
+	}
+	var t = typeof (obj);
+	if (t == "number") {
+		return (parseInt(obj).toString() == obj) ? "int" : "number";
+	}
+	if (draw2d.XMLSerializer.isSimpleVar(t)) {
+		return t;
+	}
+	return obj.type.replace("@NAMESPACE" + "@", "");
+};
+draw2d.XMLSerializer.xmlEncode = function(_5722) {
+	var _5723 = _5722;
+	var amp = /&/gi;
+	var gt = />/gi;
+	var lt = /</gi;
+	var quot = /"/gi;
+	var apos = /'/gi;
+	var _5729 = "&#62;";
+	var _572a = "&#38;#60;";
+	var _572b = "&#38;#38;";
+	var _572c = "&#34;";
+	var _572d = "&#39;";
+	_5723 = _5723.replace(amp, _572b);
+	_5723 = _5723.replace(quot, _572c);
+	_5723 = _5723.replace(lt, _572a);
+	_5723 = _5723.replace(gt, _5729);
+	_5723 = _5723.replace(apos, _572d);
+	return _5723;
+};
+draw2d.XMLDeserializer = function() {
+	alert("do not init this class. Use the static methods instead");
+};
+draw2d.XMLDeserializer.fromXML = function(node, _4fe9) {
+	var _4fea = "" + node.getAttributes().getNamedItem("type").getNodeValue();
+	var value = node.getNodeValue();
+	switch (_4fea) {
+	case "int":
+		try {
+			return parseInt("" + node.getChildNodes().item(0).getNodeValue());
+		} catch (e) {
+			alert("Error:" + e + "\nDataType:" + _4fea + "\nXML Node:" + node);
+		}
+	case "string":
+	case "String":
+		try {
+			if (node.getChildNodes().getLength() > 0) {
+				return "" + node.getChildNodes().item(0).getNodeValue();
+			}
+			return "";
+		} catch (e) {
+			alert("Error:" + e + "\nDataType:" + _4fea + "\nXML Node:" + node);
+		}
+	case "Number":
+	case "number":
+		try {
+			return parseFloat("" + node.getChildNodes().item(0).getNodeValue());
+		} catch (e) {
+			alert("Error:" + e + "\nDataType:" + _4fea + "\nXML Node:" + node);
+		}
+	case "Boolean":
+	case "boolean":
+	case "bool":
+		try {
+			return "true" == ("" + node.getChildNodes().item(0).getNodeValue())
+					.toLowerCase();
+		} catch (e) {
+			alert("Error:" + e + "\nDataType:" + _4fea + "\nXML Node:" + node);
+		}
+	case "dateTime":
+	case "Date":
+	case "date":
+		try {
+			return new Date("" + node.getChildNodes().item(0).getNodeValue());
+		} catch (e) {
+			alert("Error:" + e + "\nDataType:" + _4fea + "\nXML Node:" + node);
+		}
+	case "float":
+		try {
+			return parseFloat("" + node.getChildNodes().item(0).getNodeValue());
+		} catch (e) {
+			alert("Error:" + e + "\nDataType:" + _4fea + "\nXML Node:" + node);
+		}
+		break;
+	}
+	_4fea = _4fea.replace("@NAMESPACE" + "@", "");
+	var obj = eval("new " + _4fea + "()");
+	if (_4fe9 != undefined && obj.setModelParent != undefined) {
+		obj.setModelParent(_4fe9);
+	}
+	var _4fed = node.getChildNodes();
+	for ( var i = 0; i < _4fed.length; i++) {
+		var child = _4fed.item(i);
+		var _4ff0 = child.getNodeName();
+		if (obj instanceof Array) {
+			_4ff0 = i;
+		}
+		obj[_4ff0] = draw2d.XMLDeserializer.fromXML(child,
+				obj instanceof draw2d.AbstractObjectModel ? obj : _4fe9);
+	}
+	return obj;
+};
+draw2d.EditPolicy = function(_5cb1) {
+	this.policy = _5cb1;
+};
+draw2d.EditPolicy.DELETE = "DELETE";
+draw2d.EditPolicy.MOVE = "MOVE";
+draw2d.EditPolicy.CONNECT = "CONNECT";
+draw2d.EditPolicy.RESIZE = "RESIZE";
+draw2d.EditPolicy.prototype.type = "draw2d.EditPolicy";
+draw2d.EditPolicy.prototype.getPolicy = function() {
+	return this.policy;
+};
+draw2d.AbstractPalettePart = function() {
+	this.x = 0;
+	this.y = 0;
+	this.html = null;
+};
+draw2d.AbstractPalettePart.prototype.type = "draw2d.AbstractPalettePart";
+draw2d.AbstractPalettePart.prototype = new draw2d.Draggable();
+draw2d.AbstractPalettePart.prototype.createHTMLElement = function() {
+	var item = document.createElement("div");
+	item.id = this.id;
+	item.style.position = "absolute";
+	item.style.height = "24px";
+	item.style.width = "24px";
+	return item;
+};
+draw2d.AbstractPalettePart.prototype.setEnviroment = function(_6008, _6009) {
+	this.palette = _6009;
+	this.workflow = _6008;
+};
+draw2d.AbstractPalettePart.prototype.getHTMLElement = function() {
+	if (this.html === null) {
+		this.html = this.createHTMLElement();
+		draw2d.Draggable.call(this, this.html);
+	}
+	return this.html;
+};
+draw2d.AbstractPalettePart.prototype.onDrop = function(_600a, _600b) {
+	var _600c = this.workflow.getScrollLeft();
+	var _600d = this.workflow.getScrollTop();
+	var _600e = this.workflow.getAbsoluteX();
+	var _600f = this.workflow.getAbsoluteY();
+	this.setPosition(this.x, this.y);
+	this.execute(_600a + _600c - _600e, _600b + _600d - _600f);
+};
+draw2d.AbstractPalettePart.prototype.execute = function(x, y) {
+	alert("inerited class should override the method 'draw2d.AbstractPalettePart.prototype.execute'");
+};
+draw2d.AbstractPalettePart.prototype.setTooltip = function(_6012) {
+	this.tooltip = _6012;
+	if (this.tooltip !== null) {
+		this.html.title = this.tooltip;
+	} else {
+		this.html.title = "";
+	}
+};
+draw2d.AbstractPalettePart.prototype.setDimension = function(w, h) {
+	this.width = w;
+	this.height = h;
+	if (this.html === null) {
+		return;
+	}
+	this.html.style.width = this.width + "px";
+	this.html.style.height = this.height + "px";
+};
+draw2d.AbstractPalettePart.prototype.setPosition = function(xPos, yPos) {
+	this.x = Math.max(0, xPos);
+	this.y = Math.max(0, yPos);
+	if (this.html === null) {
+		return;
+	}
+	this.html.style.left = this.x + "px";
+	this.html.style.top = this.y + "px";
+	this.html.style.cursor = "move";
+};
+draw2d.AbstractPalettePart.prototype.getWidth = function() {
+	return this.width;
+};
+draw2d.AbstractPalettePart.prototype.getHeight = function() {
+	return this.height;
+};
+draw2d.AbstractPalettePart.prototype.getY = function() {
+	return this.y;
+};
+draw2d.AbstractPalettePart.prototype.getX = function() {
+	return this.x;
+};
+draw2d.AbstractPalettePart.prototype.getPosition = function() {
+	return new draw2d.Point(this.x, this.y);
+};
+draw2d.AbstractPalettePart.prototype.disableTextSelection = function(e) {
+	if (typeof e.onselectstart != "undefined") {
+		e.onselectstart = function() {
+			return false;
+		};
+	} else {
+		if (typeof e.style.MozUserSelect != "undefined") {
+			e.style.MozUserSelect = "none";
+		}
+	}
+};
+draw2d.ExternalPalette = function(_5b29, divId) {
+	this.html = document.getElementById(divId);
+	this.workflow = _5b29;
+	this.parts = new draw2d.ArrayList();
+};
+draw2d.ExternalPalette.prototype.type = "draw2d.ExternalPalette";
+draw2d.ExternalPalette.prototype.getHTMLElement = function() {
+	return this.html;
+};
+draw2d.ExternalPalette.prototype.addPalettePart = function(part) {
+	if (!(part instanceof draw2d.AbstractPalettePart)) {
+		throw "parameter is not instanceof [draw2d.AbstractPalettePart]";
+	}
+	this.parts.add(part);
+	this.html.appendChild(part.getHTMLElement());
+	part.setEnviroment(this.workflow, this);
+};
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/draw2d/moocanvas.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/draw2d/moocanvas.js
new file mode 100644
index 0000000..34ea8d7
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/draw2d/moocanvas.js
@@ -0,0 +1,873 @@
+//MooCanvas, My Object Oriented Canvas Element. Copyright (c) 2007 Olmo Maldonado, <http://ibolmo.no-ip.info/sandbox/moocanvas/>, MIT Style License.
+/*
+Script: Canvas.js
+	Contains the <Canvas> class.
+
+Dependencies:
+	MooTools, <http://mootools.net/>
+		Element, and its dependencies
+
+Author:
+	Olmo Maldonado, <http://olmo-maldonado.com/>
+	
+Credits:
+	Lightly based from Ralph Sommerer's work: <http://blogs.msdn.com/sompost/archive/2006/02/22/536967.aspx>
+	Moderately based from excanvas: <http://excanvas.sourceforge.net/>
+	Great thanks to Inviz, <http://inviz.ru/>, for his optimizing help.
+	
+License:
+	MIT License, <http://en.wikipedia.org/wiki/MIT_License>
+*/
+
+/*
+Class: Canvas
+	Creates the element <canvas> and extends the element with getContext if not defined.
+
+Arguments:
+	id - The ID of the canvas element
+	props - Optional properties for the canvas element, which also gets passed to the new Element
+	
+Example:
+	> var cv = new Canvas('cv');
+	> var ctx = cv.getContext('2d');
+	> 
+	> $(document.body).adopt(cv);
+*/
+var MooCanvas = new Class({
+	
+	initialize: function(id, props) {
+		var el;
+		if($type(id) == 'string') {
+			props = $merge({width: 300, height: 150}, props, {'id': id});
+			el = new Element('canvas', props);
+			if(!el.getContext) {
+				if(!CanvasRenderingContext2D.cssFixed) {
+					document.createStyleSheet().cssText = 
+						'canvas{display:inline-block;overflow:hidden;text-align:left;cursor:default;}' +
+						'v\\:*{behavior:url(#default#VML)}' + 
+						'o\\:*{behavior:url(#default#VML)}';
+					CanvasRenderingContext2D.cssFixed = true;
+				}
+		
+				el.set({
+					styles: { 
+						width: props.width,
+						height: props.height,
+						display: 'inline-block',
+						overflow: 'hidden'
+					},
+					
+					getContext: function() {
+						this.context = this.context || new CanvasRenderingContext2D(el);
+						return this.context;
+					}
+				});
+				
+			}
+		}
+		
+		return el;
+	}
+	
+});
+
+/*
+Class: CanvasRenderingContext2D
+	Context2D class with all the Context methods specified by the WHATWG, <http://www.whatwg.org/specs/web-apps/current-work/#the-canvas>
+	
+Arguments:
+	el - Element requesting the context2D
+*/
+var CanvasRenderingContext2D = new Class({
+
+	initialize: function(el) {
+		this.parent = el;
+		this.fragment = document.createDocumentFragment();
+		this.element = new Element('div', {
+			styles: {
+				width: el.clientWidth || el.width,
+				height: el.clientHeight || el.height,
+				overflow: 'hidden',
+				position: 'absolute'	
+			}
+		});
+		this.fragment.appendChild(this.element);
+
+		this.m = [
+			[1, 0, 0],
+			[0, 1, 0],
+			[0, 0, 1]
+		];
+		this.rot = 0;
+		this.state = [];
+		this.path = [];
+		this.delay = 30;
+		this.max = 10;
+		this.i = 0;
+		
+		// from excanvas, subpixel rendering.
+		this.Z = 10;
+		this.Z2 = this.Z / 2;
+		this.arcScaleX = 1;
+		this.arcScaleY = 1;
+		this.currentX = 0;
+		this.currentY = 0;
+		
+		
+		this.miterLimit = this.Z * 1;
+	},
+	
+	lineWidth: 1,
+	strokeStyle: '#000',
+	fillStyle: '#fff',
+	globalAlpha: 1,
+	globalCompositeOperation: 'source-over',
+	lineCap: 'butt',
+	lineJoin: 'miter',
+	shadowBlur: 0,
+	shadowColor: '#000',
+	shadowOffsetX: 0,
+	shadowOffsetY: 0
+	
+});
+
+/*
+Script: Path.js
+
+Dependencies:
+	Canvas.js
+	
+Author:
+	Olmo Maldonado, <http://olmo-maldonado.com/>
+	
+Credits:
+	Lightly based from Ralph Sommerer's work: <http://blogs.msdn.com/sompost/archive/2006/02/22/536967.aspx>
+	Moderately based from excanvas: <http://excanvas.sourceforge.net/>
+	Great thanks to Inviz, <http://inviz.ru/>, for his optimizing help.
+	
+License:
+	MIT License, <http://en.wikipedia.org/wiki/MIT_License>
+*/
+
+CanvasRenderingContext2D.implement({
+	
+	/*
+		A path has a list of zero or more subpaths. 
+		Each subpath consists of a list of one or more points, 
+		connected by straight or curved lines, and a flag indicating whether
+		the subpath is closed or not. A closed subpath is one where the
+		last point of the subpath is connected to the first point of
+		the subpath by a straight line. Subpaths with fewer than two
+		points are ignored when painting the path.
+	*/
+
+	/*
+	Property:
+		Empties the list of subpaths so that the context once again has zero
+		subpaths.
+	*/
+	beginPath: function() {
+		this.path = [];
+		this.moved = false;
+	},
+	
+	/*
+	Property:
+		Creates a new subpath with the specified point as its first
+		(and only) point.
+	*/
+	moveTo: function(x, y) {
+		this.path.push('m', this.coord(x, y));
+		this.currentX = x;
+		this.currentY = y;
+		this.moved = true;
+	},
+	
+	/*
+	Property:
+		Does nothing if the context has no subpaths.
+		Otherwise, marks the last subpath as closed, create a new
+		subpath whose first point is the same as the previous 
+		subpath's first point, and finally add this new subpath to the
+		path.
+	*/
+	closePath: function() {
+		this.path.push('x');
+	},
+	
+	/*
+	Property:
+		Method must do nothing if the context has no subpaths. Otherwise, 
+		it must connect the last point in the subpath to the given point 
+		(x, y) using a straight line, and must then add the given point 
+		(x, y) to the subpath.
+	*/
+	lineTo: function(x, y) {
+		this.path.push((this.moved ? 'l' : ','), this.coord(x, y));
+		this.currentX = x;
+		this.currentY = y;
+		this.moved = false;
+	},
+
+	/*
+	Property:
+		Method must do nothing if the context has no subpaths. Otherwise, 
+		it must connect the last point in the subpath to the given point 
+		(x, y) using a straight line, and must then add the given point 
+		(x, y) to the subpath.
+	*/
+	quadraticCurveTo: function(cpx, cpy, x, y) {
+		var cx = 2 * cpx,
+			cy = 2 * cpy;
+			
+		this.bezierCurveTo(
+			(cx + this.currentX) / 3, 
+			(cy + this.currentY) / 3, 
+			(cx + x) / 3, 
+			(cy + y) / 3, 
+			x, 
+			y
+		);
+	},
+	
+	/*
+	Property:
+		Method must do nothing if the context has no subpaths. Otherwise, 
+		it must connect the last point in the subpath to the given point 
+		(x, y) using a bezier curve with control points (cp1x, cp1y) and 
+		(cp2x, cp2y). Then, it must add the point (x, y) to the subpath.
+	*/
+	bezierCurveTo: function(cp0x, cp0y, cp1x, cp1y, x, y) {
+		this.path.push(' c ',
+			this.coord(cp0x, cp0y), ",",
+			this.coord(cp1x, cp1y), ",",
+			this.coord(x, y)
+		);
+		
+		this.currentX = x;
+		this.currentY = y;
+	},
+	
+	/*
+	Property:
+		Method must do nothing if the context has no subpaths. If the context
+		does have a subpath, then the behaviour depends on the arguments and 
+		the last point in the subpath.
+		
+		Let the point (x0, y0) be the last point in the subpath. Let The Arc 
+		be the shortest arc given by circumference of the circle that has one 
+		point tangent to the line defined by the points (x0, y0) and (x1, y1), 
+		another point tangent to the line defined by the points (x1, y1) and 
+		(x2, y2), and that has radius radius. The points at which this circle 
+		touches these two lines are called the start and end tangent points 
+		respectively.
+		
+		If the point (x2, y2) is on the line defined by the points (x0, y0) 
+		and (x1, y1) then the method must do nothing, as no arc would satisfy 
+		the above constraints.
+		
+		Otherwise, the method must connect the point (x0, y0) to the start 
+		tangent point by a straight line, then connect the start tangent point 
+		to the end tangent point by The Arc, and finally add the start and end 
+		tangent points to the subpath.
+		
+		Negative or zero values for radius must cause the implementation to 
+		raise an INDEX_SIZE_ERR exception.
+	*/
+	arcTo: function(x, y, w, h) {
+
+	},
+	
+	/*
+	Property:
+		Method draws an arc. If the context has any subpaths, then the method 
+		must add a straight line from the last point in the subpath to the 
+		start point of the arc. In any case, it must draw the arc between the 
+		start point of the arc and the end point of the arc, and add the start 
+		and end points of the arc to the subpath. The arc and its start and 
+		end points are defined as follows:
+		
+		Consider a circle that has its origin at (x, y) and that has radius 
+		radius. The points at startAngle and endAngle along the circle's 
+		circumference, measured in radians clockwise from the positive x-axis, 
+		are the start and end points respectively. The arc is the path along 
+		the circumference of this circle from the start point to the end point, 
+		going anti-clockwise if the anticlockwise argument is true, and 
+		clockwise otherwise.
+		
+		Negative or zero values for radius must cause the implementation to 
+		raise an INDEX_SIZE_ERR exception.
+	*/
+	arc: function(x, y, rad, a0, a1, cw) {
+		if(this.rot === 0) rad *= this.Z;
+		
+		var x0 = Math.cos(a0) * rad,
+			y0 = Math.sin(a0) * rad,
+			x1 = Math.cos(a1) * rad,
+			y1 = Math.sin(a1) * rad;
+			
+		if (this.rot !== 0) {
+			var da = Math.PI / 24;
+			this.lineTo(x0 + x, y0 + y);
+			if(cw) {
+				if (a0 < a1) a0 += 2 * Math.PI;
+				while(a0 - da > a1) this.lineTo(x + Math.cos(a0 -= da) * rad, y + Math.sin(a0) * rad);
+			} else {
+				if (a1 < a0) a1 += 2 * Math.PI;
+				while(a0 + da < a1) this.lineTo(x + Math.cos(a0 += da) * rad, y + Math.sin(a0) * rad);
+			}
+			this.lineTo(x1 + x, y1 + y);
+			return;
+		}
+		
+		if (x0 == x1 && !cw) x0 += 0.125;
+		
+		var c = this.getCoords(x, y);
+		this.path.push(cw ? 'at ' : 'wa ',
+			Math.round(c.x - this.arcScaleX * rad) + ',' + Math.round(c.y - this.arcScaleY * rad),  ' ',
+			Math.round(c.x + this.arcScaleX * rad) + ',' + Math.round(c.y + this.arcScaleY * rad),  ' ',
+			this.coord(x0 + x - this.Z2, y0 + y - this.Z2), ' ',
+			this.coord(x1 + x - this.Z2, y1 + y - this.Z2)
+		);
+	},
+
+	/*
+	Property:
+		method must create a new subpath containing just the four points 
+		(x, y), (x+w, y), (x+w, y+h), (x, y+h), with those four points 
+		connected by straight lines, and must then mark the subpath as 
+		closed. It must then create a new subpath with the point (x, y) 
+		as the only point in the subpath.
+		
+		Negative values for w and h must cause the implementation to raise 
+		an INDEX_SIZE_ERR exception.
+	*/
+	rect: function(x, y, w, h) {
+		this.moveTo(x, y);
+		this.lineTo(x + w, y);
+		this.lineTo(x + w, y + h);
+		this.lineTo(x, y + h);
+		this.closePath();
+	},
+	
+	/*
+	Property:
+		Method must fill each subpath of the current path in turn, using 
+		fillStyle, and using the non-zero winding number rule. Open subpaths 
+		must be implicitly closed when being filled (without affecting the 
+		actual subpaths).
+	*/
+	fill: function() {
+		this.stroke(true);
+	},
+
+
+	/*
+	Property:
+		Method must stroke each subpath of the current path in turn, using 
+		the strokeStyle, lineWidth, lineJoin, and (if appropriate) miterLimit 
+		attributes.
+		
+		Paths, when filled or stroked, must be painted without affecting the 
+		current path, and must be subject to transformations, shadow effects, 
+		global alpha, clipping paths, and global composition operators.
+		
+		The transformation is applied to the path when it is drawn, not when 
+		the path is constructed. Thus, a single path can be constructed and 
+		then drawn according to different transformations without recreating 
+		the path. 
+	*/
+	
+	stroke: function(fill) {
+		if(!this.path.length) return;
+		var a, color;
+		if (fill) {
+			a = [1000, '<v:fill ' + this.processColorObject(this.fillStyle) + '></v:fill>'];
+		} else {
+			color = this.processColor(this.strokeStyle);
+			a = [10, 
+			'<v:stroke ' +
+				'endcap="' + ((this.lineCap == 'butt') ? 'flat' : this.lineCap) + '" ' +
+				'joinstyle="' + this.lineJoin + '" ' +
+				'color="' + color.color + '" ' +
+				'opacity="' + color.opacity + '"' +
+			'/>'];
+		}
+		this.element.insertAdjacentHTML('beforeEnd', 
+			'<v:shape ' +
+				'path="' + this.path.join('') + 'e" ' +
+				'stroked="' + !fill + '" ' +
+				(!fill ? ('strokeweight="' + 0.8 * this.lineWidth * this.m[0][0] + '" ') : '') +
+				'filled="' + !!fill + '" ' +
+				'coordsize="' + this.Z * a[0] + ',' +  this.Z * a[0] + '" ' +
+				'style="width:' + a[0] + 'px; height:' + a[0] + 'px; position: absolute;">' +
+				a[1] +
+			'</v:shape>'
+		);
+		
+		this.parent.appendChild(this.fragment);
+		
+		if(fill && this.fillStyle.img) this.element.getLast().fill.alignshape = false; // not sure why this has to be called explicitly
+											 
+		this.path = [];
+	},
+
+	/*
+	Property:
+		Method must create a new clipping path by calculating the intersection 
+		of the current clipping path and the area described by the current path 
+		(after applying the current transformation), using the non-zero winding 
+		number rule. Open subpaths must be implicitly closed when computing the 
+		clipping path, without affecting the actual subpaths.
+		
+		When the context is created, the initial clipping path is the rectangle 
+		with the top left corner at (0,0) and the width and height of the 
+		coordinate space. 
+	*/
+	clip: function() {
+
+	},
+	
+	/*
+	Property:
+		Method must return true if the point given by the x and y coordinates 
+		passed to the method, when treated as coordinates in the canvas' 
+		coordinate space unaffected by the current transformation, is within 
+		the area of the canvas that is inside the current path; and must 
+		return false otherwise.
+	*/
+	isPointInPath: function(x, y) {
+	
+	},
+	
+	processColor: function(col) { //path
+		var a = this.globalAlpha;	
+		if (col.substr(0, 3) == 'rgb') {
+			if (col.charAt(3) == "a") {
+				a*= col.match(/([\d.]*)\)$/)[1];
+			}
+			
+			col = col.rgbToHex();
+		}
+		return {
+			color: col,
+			opacity: a
+		};
+	},
+	
+	/* 
+		If a gradient has no stops defined, then the gradient must be treated as a 
+		solid transparent black. Gradients are, naturally, only painted where the 
+		stroking or filling effect requires that they be drawn.
+	*/
+	processColorObject: function(obj) {
+		var ret = '', col;
+		if(obj.addColorStop) {
+			ret += ((obj.r0) ? (
+				'type="gradientradial" ' +
+				'focusposition="0.2, 0.2" ' +
+				'focussize="0.2, 0.2" '
+			) : (
+				'type="gradient" ' +
+				'focus="0" ' +
+				'angle="' + (180 + (180 * obj.angle(obj.x0, obj.y0, obj.x1, obj.y1) / Math.PI)) + '" '
+			)) +
+				'color="' + obj.col0.color + '" ' +
+				'opacity="' + obj.col0.opacity * 100 + '%" ' +
+				'color2="' + obj.col1.color + '" ' +
+				'o:opacity2="' + obj.col1.opacity * 100 + '%" ' +
+				'colors="';
+			if(obj.stops) {
+				for (var i = 0, l = obj.stops.length; i < l; i++) {
+					ret += Math.round(100 * obj.stops[i][0]) + '% ' + obj.stops[i][1];
+				}
+			}
+			ret +=
+				'" ';
+		} else if(obj.img) { //pattern
+			ret +=
+				'type="tile" ' +
+				'src="' + obj.img.src + '" ';
+		} else {
+			col = this.processColor(obj);
+			ret +=
+				'color="' + col.color + '" ' +
+				'opacity="' + col.opacity + '" ';
+		}
+		
+		return ret;
+	},
+	
+	getCoords: function(x, y) {
+		var m = this.m;
+		return {
+			x: this.Z * (x * m[0][0] + y * m[1][0] + m[2][0]) - this.Z2, 
+			y: this.Z * (x * m[0][1] + y * m[1][1] + m[2][1]) - this.Z2
+		};
+	},
+
+	coord: function(x, y) {
+		var m = this.m;
+		return  [
+			 Math.round(this.Z * (x * m[0][0] + y * m[1][0] + m[2][0]) - this.Z2), ',',
+			 Math.round(this.Z * (x * m[0][1] + y * m[1][1] + m[2][1]) - this.Z2)
+		].join('');
+	}
+});
+/*
+Script: Rects.js
+
+Dependencies: 
+	Canvas.js, Path.js
+
+Author:
+	Olmo Maldonado, <http://olmo-maldonado.com/>
+	
+Credits:
+	Lightly based from Ralph Sommerer's work: <http://blogs.msdn.com/sompost/archive/2006/02/22/536967.aspx>
+	Moderately based from excanvas: <http://excanvas.sourceforge.net/>
+	Great thanks to Inviz, <http://inviz.ru/>, for his optimizing help.
+	
+License:
+	MIT License, <http://en.wikipedia.org/wiki/MIT_License>
+*/
+
+CanvasRenderingContext2D.implement({
+	
+	/*
+	Property: clearRect
+		Clears the pixels in the specified rectangle.
+		If height or width are zero has no effect.
+		
+		If no arguments, clears all of the canvas
+		
+		Currently, clearRect clears all of the canvas.
+	 */
+	clearRect: function(x, y, w, h) {
+		//if((x <= 0) && (y <= 0) && ( x + w >= this.element.width) && (y + h >= this.element.height)){
+			this.element.innerHTML = '';
+		//} else {
+		//	var f0 = this.fillStyle;
+		//	this.fillStyle = '#fff';
+		//	this.fillRect(x, y, w, h);
+		//	this.fillStyle = f0;
+		//}
+	},
+	
+	/*
+	Property: fillRect
+		Paints the specified rectangle using fillStyle.
+		If height or width are zero, this method has no effect.
+	 */
+	fillRect: function(x, y, w, h) {
+		this.rect(x, y, w, h);
+		this.fill();
+	},
+	
+	/*
+		Draws a rectangular outline of the specified size.
+		If width or height are zero: ??
+	 */
+	strokeRect: function(x, y, w, h) {
+		this.rect(x, y, w, h);
+		this.stroke();
+	}
+	
+});
+/*
+Script: Transform.js
+
+Dependencies:
+	Canvas.js
+
+Author:
+	Olmo Maldonado, <http://olmo-maldonado.com/>
+	
+Credits:
+	Lightly based from Ralph Sommerer's work: <http://blogs.msdn.com/sompost/archive/2006/02/22/536967.aspx>
+	Moderately based from excanvas: <http://excanvas.sourceforge.net/>
+	Great thanks to Inviz, <http://inviz.ru/>, for his optimizing help.
+	
+License:
+	MIT License, <http://en.wikipedia.org/wiki/MIT_License>
+*/
+
+CanvasRenderingContext2D.implement({
+	/*
+		The transformation matrix is applied to all drawing operations prior 
+		to their being rendered. It is also applied when creating the clip region.
+		*  The transformations must be performed in reverse order. For instance, 
+		if a scale transformation that doubles the width is applied, followed 
+		by a rotation transformation that rotates drawing operations by a 
+		quarter turn, and a rectangle twice as wide as it is tall is then 
+		drawn on the canvas, the actual result will be a square.
+	*/
+
+  	/*
+  	Property: scale
+		Method must add the scaling transformation described by the arguments 
+		to the transformation matrix. The x argument represents the scale factor 
+		in the horizontal direction and the y argument represents the scale 
+		factor in the vertical direction. The factors are multiples.
+	*/
+	scale: function(x, y) {
+		this.arcScaleX *= x;
+		this.arcScaleY *= y;
+		
+		this.matMult([
+			[x, 0, 0],
+			[0, y, 0],
+			[0, 0, 1]
+		]);
+	},
+	
+  	/*
+  	Property: rotate
+		Method must add the rotation transformation described by the argument 
+		to the transformation matrix. The angle argument represents a clockwise 
+		rotation angle expressed in radians.
+	*/
+	rotate: function(ang) {
+		this.rot += ang;
+		var c = Math.cos(ang),
+			s = Math.sin(ang);
+		
+		this.matMult([
+			[ c, s, 0],
+			[-s, c, 0],
+			[ 0, 0, 1]
+		]);
+	},
+	
+  	/*
+  	Property: translate
+		Method must add the translation transformation described by the arguments 
+		to the transformation matrix. The x argument represents the translation 
+		distance in the horizontal direction and the y argument represents the 
+		translation distance in the vertical direction. The arguments are in 
+		coordinate space units.
+	*/
+	translate: function(x, y) {
+		this.matMult([
+			[1, 0, 0],
+			[0, 1, 0],
+			[x, y, 1]
+		]);
+	},
+	
+  	/*
+  	Property: transform
+		Method must multiply the current transformation matrix with the matrix described
+		by the inputs.
+	*/
+ 	transform: function(m11, m12, m21, m22, dx, dy) {
+		this.matMult([
+			[m11, m21, dx],
+			[m12, m22, dy],
+			[  0,   0,  1]
+		]);		
+	},
+  
+  	/*
+  	Property: setTransform
+  		Method must reset the current transform to the identity matrix, and then invoke 
+  		the transform method with the same arguments.
+  	*/
+	setTransform: function(m11, m12, m21, m22, dx, dy) {
+		this.m = [
+			[1, 0, 0],
+			[0, 1, 0],
+			[0, 0, 1]
+		];
+		
+		this.transform(m11, m12, m21, m22, dx, dy);
+	},
+	
+	/*
+		Property: matMult
+			Method to multiply 3x3 matrice. Currently takes input and multiplies against
+			the transform matrix and saves the result to the transform matrix.
+			
+			This is an optimized multiplication method. Will only multiply if the input
+			value is not zero. Thus, minimizing multiplications and additions.
+	*/
+	matMult: function(b) {
+		var m = this.m,
+			o = [
+				[0, 0, 0], 
+				[0, 0, 0], 
+				[0, 0, 0]
+			];
+		
+		for(var i = 0; i < 3; i++) {
+			if(b[0][i] !== 0) this.sum(o[0], this.mult(b[0][i], m[i]));
+			if(b[1][i] !== 0) this.sum(o[1], this.mult(b[1][i], m[i]));
+			if(b[2][i] !== 0) this.sum(o[2], this.mult(b[2][i], m[i]));
+		}
+		
+		this.m = [o[0], o[1], o[2]];
+	},
+
+	mult: function(x, y) {
+		return [x * y[0], x * y[1], x * y[2]];	
+	},
+	
+	sum: function(o, v) {
+		o[0] += v[0];
+		o[1] += v[1];
+		o[2] += v[2];
+	}
+});
+/*
+Script: Image.js
+
+Dependencies:
+	Canvas.js
+
+Author:
+	Olmo Maldonado, <http://olmo-maldonado.com/>
+	
+Credits:
+	Lightly based from Ralph Sommerer's work: <http://blogs.msdn.com/sompost/archive/2006/02/22/536967.aspx>
+	Moderately based from excanvas: <http://excanvas.sourceforge.net/>
+	Great thanks to Inviz, <http://inviz.ru/>, for his optimizing help.
+	
+License:
+	MIT License, <http://en.wikipedia.org/wiki/MIT_License>
+*/
+
+CanvasRenderingContext2D.implement({
+	/*
+	Property: drawImage
+		This method is overloaded with three variants: drawImage(image, dx, dy),
+		drawImage(image, dx, dy, dw, dh), and drawImage(image, sx, sy, sw, sh, 
+		dx, dy, dw, dh). (Actually it is overloaded with six; each of those three 
+		can take either an HTMLImageElement or an HTMLCanvasElement for the image 
+		argument.) If not specified, the dw and dh arguments default to the values 
+		of sw and sh, interpreted such that one CSS pixel in the image is treated 
+		as one unit in the canvas coordinate space. If the sx, sy, sw, and sh 
+		arguments are omitted, they default to 0, 0, the image's intrinsic width 
+		in image pixels, and the image's intrinsic height in image pixels, 
+		respectively.
+		
+		If the image is of the wrong type, the implementation must raise a 
+		TYPE_MISMATCH_ERR exception. If one of the sy, sw, sw, and sh arguments 
+		is outside the size of the image, or if one of the dw and dh arguments 
+		is negative, the implementation must raise an INDEX_SIZE_ERR  exception.
+		
+		The specified region of the image specified by the source rectangle 
+		(sx, sy, sw, sh) must be painted on the region of the canvas specified 
+		by the destination rectangle (dx, dy, dw, dh).
+		
+		Images are painted without affecting the current path, and are subject to
+		transformations, shadow effects, global alpha, clipping paths, and global 
+		composition operators.
+	*/
+	drawImage: function (image, var_args) {
+		var args = arguments, 
+			length = args.length, 
+			off = (length == 9) ? 4 : 0;
+			
+		if(!((length + '').test(/3|5|9/))) throw 'Wrong number of arguments';
+		
+		var w0 = image.runtimeStyle.width, 
+			h0 = image.runtimeStyle.height;
+		image.runtimeStyle.width = 'auto';
+		image.runtimeStyle.height = 'auto';
+	
+		var w = image.width, 
+			h = image.height;
+		image.runtimeStyle.width = w0;
+		image.runtimeStyle.height = h0;
+		
+		var sx = 0, 
+			sy = 0, 
+			sw = w, 
+			sh = h, 
+			dx = args[1 + off], 
+			dy = args[2 + off], 
+			dw = args[3 + off] || w, 
+			dh = args[4 + off] || h;
+		
+		if (length == 9) {
+			sx = args[1];
+			sy = args[2];
+			sw = args[3];
+			sh = args[4];
+		}
+
+		var d = this.getCoords(dx, dy),
+			vmlStr = 
+			'<v:group coordsize="' + this.Z * 10 + ',' + this.Z * 10 + '" ' + 
+				'coordorigin="0,0" ' +
+				'style="width:10;height:10;position:absolute;';
+		
+		if (this.m[0][0] != 1 || this.m[0][1]) {
+			var max = Math.max(
+				this.getCoords(dx + dw, dy), 
+				this.getCoords(dx, dy + dh), 
+				this.getCoords(dx + dw, dy + dh)
+			);
+			
+			vmlStr += 
+				'padding:0;' +
+				'padding-right:' + Math.round(Math.max(d.x, max) / this.Z) + 'px;' +
+				'padding-bottom:' + Math.round(Math.max(d.y, max) / this.Z) + 'px;' +
+				'filter:progid:DXImageTransform.Microsoft.Matrix(' +
+					"M11='" + this.m[0][0] + "', M12='" + this.m[1][0] + "', " +
+					"M21='" + this.m[0][1] + "', M22='" + this.m[1][1] + "', " +
+					"Dx='" + Math.round(d.x / this.Z) + "', Dy='" + Math.round(d.y / this.Z) + "', " +
+					"sizingmethod='clip'" +
+				');';
+		} else {
+			vmlStr += 
+				'top:' + Math.round(d.y / this.Z) + 'px;' +
+				'left:' + Math.round(d.x / this.Z) + 'px;';
+		}
+		
+		this.element.insertAdjacentHTML('BeforeEnd', vmlStr + 
+			'"><v:image src="' + image.src + '" ' +
+				'style="width:' + this.Z * dw + ';height:' + this.Z * dh + ';" ' +
+				'cropleft="' + sx / w + '" ' +
+				'croptop="' + sy / h + '" ' +
+				'cropright="' + (w - sx - sw) / w + '" ' +
+				'cropbottom="' + (h - sy - sh) / h + '" ' +
+			'/></v:group>'
+		);
+		
+		this.parent.appendChild(this.fragment);
+	},
+
+	drawImageFromRect: Function.empty,
+	
+	/*
+	Property: getImageData
+		Method must return an ImageData object representing the underlying 
+		pixel data for the area of the canvas denoted by the rectangle which 
+		has one corner at the (sx, sy) coordinate, and that has width sw and 
+		height sh. Pixels outside the canvas must be returned as transparent 
+		black.
+	*/
+	getImageData: function(sx, sy, sw, sh) {
+
+	},
+	
+	/*
+	Property: putImageData
+		Method must take the given ImageData structure, and draw it at the 
+		specified location dx,dy in the canvas coordinate space, mapping each 
+		pixel represented by the ImageData structure into one device pixel.
+	*/
+	putImageData: function(image, dx, dy) {
+	
+	},
+
+	getCoords: function(x, y) {
+		var m = this.m;
+		return {
+			x: this.Z * (x * m[0][0] + y * m[1][0] + m[2][0]) - this.Z2, 
+			y: this.Z * (x * m[0][1] + y * m[1][1] + m[2][1]) - this.Z2
+		};
+	}
+	
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/draw2d/mootools.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/draw2d/mootools.js
new file mode 100644
index 0000000..3f3b2c2
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/draw2d/mootools.js
@@ -0,0 +1,2409 @@
+/*
+Script: Core.js
+	Mootools - My Object Oriented javascript.
+
+License:
+	MIT-style license.
+
+MooTools Copyright:
+	copyright (c) 2007 Valerio Proietti, <http://mad4milk.net>
+
+MooTools Credits:
+	- Class is slightly based on Base.js <http://dean.edwards.name/weblog/2006/03/base/> (c) 2006 Dean Edwards, License <http://creativecommons.org/licenses/LGPL/2.1/>
+	- Some functions are inspired by those found in prototype.js <http://prototype.conio.net/> (c) 2005 Sam Stephenson sam [at] conio [dot] net, MIT-style license
+	- Documentation by Aaron Newton (aaron.newton [at] cnet [dot] com) and Valerio Proietti.
+*/
+
+var MooTools = {
+	version: '1.11'
+};
+
+/* Section: Core Functions */
+
+/*
+Function: $defined
+	Returns true if the passed in value/object is defined, that means is not null or undefined.
+
+Arguments:
+	obj - object to inspect
+*/
+
+function $defined(obj){
+	return (obj != undefined);
+};
+
+/*
+Function: $type
+	Returns the type of object that matches the element passed in.
+
+Arguments:
+	obj - the object to inspect.
+
+Example:
+	>var myString = 'hello';
+	>$type(myString); //returns "string"
+
+Returns:
+	'element' - if obj is a DOM element node
+	'textnode' - if obj is a DOM text node
+	'whitespace' - if obj is a DOM whitespace node
+	'arguments' - if obj is an arguments object
+	'object' - if obj is an object
+	'string' - if obj is a string
+	'number' - if obj is a number
+	'boolean' - if obj is a boolean
+	'function' - if obj is a function
+	'regexp' - if obj is a regular expression
+	'class' - if obj is a Class. (created with new Class, or the extend of another class).
+	'collection' - if obj is a native htmlelements collection, such as childNodes, getElementsByTagName .. etc.
+	false - (boolean) if the object is not defined or none of the above.
+*/
+
+function $type(obj){
+	if (!$defined(obj)) return false;
+	if (obj.htmlElement) return 'element';
+	var type = typeof obj;
+	if (type == 'object' && obj.nodeName){
+		switch(obj.nodeType){
+			case 1: return 'element';
+			case 3: return (/\S/).test(obj.nodeValue) ? 'textnode' : 'whitespace';
+		}
+	}
+	if (type == 'object' || type == 'function'){
+		switch(obj.constructor){
+			case Array: return 'array';
+			case RegExp: return 'regexp';
+			case Class: return 'class';
+		}
+		if (typeof obj.length == 'number'){
+			if (obj.item) return 'collection';
+			if (obj.callee) return 'arguments';
+		}
+	}
+	return type;
+};
+
+/*
+Function: $merge
+	merges a number of objects recursively without referencing them or their sub-objects.
+
+Arguments:
+	any number of objects.
+
+Example:
+	>var mergedObj = $merge(obj1, obj2, obj3);
+	>//obj1, obj2, and obj3 are unaltered
+*/
+
+function $merge(){
+	var mix = {};
+	for (var i = 0; i < arguments.length; i++){
+		for (var property in arguments[i]){
+			var ap = arguments[i][property];
+			var mp = mix[property];
+			if (mp && $type(ap) == 'object' && $type(mp) == 'object') mix[property] = $merge(mp, ap);
+			else mix[property] = ap;
+		}
+	}
+	return mix;
+};
+
+/*
+Function: $extend
+	Copies all the properties from the second passed object to the first passed Object.
+	If you do myWhatever.extend = $extend the first parameter will become myWhatever, and your extend function will only need one parameter.
+
+Example:
+	(start code)
+	var firstOb = {
+		'name': 'John',
+		'lastName': 'Doe'
+	};
+	var secondOb = {
+		'age': '20',
+		'sex': 'male',
+		'lastName': 'Dorian'
+	};
+	$extend(firstOb, secondOb);
+	//firstOb will become:
+	{
+		'name': 'John',
+		'lastName': 'Dorian',
+		'age': '20',
+		'sex': 'male'
+	};
+	(end)
+
+Returns:
+	The first object, extended.
+*/
+
+var $extend = function(){
+	var args = arguments;
+	if (!args[1]) args = [this, args[0]];
+	for (var property in args[1]) args[0][property] = args[1][property];
+	return args[0];
+};
+
+/*
+Function: $native
+	Will add a .extend method to the objects passed as a parameter, but the property passed in will be copied to the object's prototype only if non previously existent.
+	Its handy if you dont want the .extend method of an object to overwrite existing methods.
+	Used automatically in MooTools to implement Array/String/Function/Number methods to browser that dont support them whitout manual checking.
+
+Arguments:
+	a number of classes/native javascript objects
+
+*/
+
+var $native = function(){
+	for (var i = 0, l = arguments.length; i < l; i++){
+		arguments[i].extend = function(props){
+			for (var prop in props){
+				if (!this.prototype[prop]) this.prototype[prop] = props[prop];
+				if (!this[prop]) this[prop] = $native.generic(prop);
+			}
+		};
+	}
+};
+
+$native.generic = function(prop){
+	return function(bind){
+		return this.prototype[prop].apply(bind, Array.prototype.slice.call(arguments, 1));
+	};
+};
+
+$native(Function, Array, String, Number);
+
+/*
+Function: $chk
+	Returns true if the passed in value/object exists or is 0, otherwise returns false.
+	Useful to accept zeroes.
+
+Arguments:
+	obj - object to inspect
+*/
+
+function $chk(obj){
+	return !!(obj || obj === 0);
+};
+
+/*
+Function: $pick
+	Returns the first object if defined, otherwise returns the second.
+
+Arguments:
+	obj - object to test
+	picked - the default to return
+
+Example:
+	(start code)
+		function say(msg){
+			alert($pick(msg, 'no meessage supplied'));
+		}
+	(end)
+*/
+
+function $pick(obj, picked){
+	return $defined(obj) ? obj : picked;
+};
+
+/*
+Function: $random
+	Returns a random integer number between the two passed in values.
+
+Arguments:
+	min - integer, the minimum value (inclusive).
+	max - integer, the maximum value (inclusive).
+
+Returns:
+	a random integer between min and max.
+*/
+
+function $random(min, max){
+	return Math.floor(Math.random() * (max - min + 1) + min);
+};
+
+/*
+Function: $time
+	Returns the current timestamp
+
+Returns:
+	a timestamp integer.
+*/
+
+function $time(){
+	return new Date().getTime();
+};
+
+/*
+Function: $clear
+	clears a timeout or an Interval.
+
+Returns:
+	null
+
+Arguments:
+	timer - the setInterval or setTimeout to clear.
+
+Example:
+	>var myTimer = myFunction.delay(5000); //wait 5 seconds and execute my function.
+	>myTimer = $clear(myTimer); //nevermind
+
+See also:
+	<Function.delay>, <Function.periodical>
+*/
+
+function $clear(timer){
+	clearTimeout(timer);
+	clearInterval(timer);
+	return null;
+};
+
+/*
+Class: Abstract
+	Abstract class, to be used as singleton. Will add .extend to any object
+
+Arguments:
+	an object
+
+Returns:
+	the object with an .extend property, equivalent to <$extend>.
+*/
+
+var Abstract = function(obj){
+	obj = obj || {};
+	obj.extend = $extend;
+	return obj;
+};
+
+//window, document
+
+var Window = new Abstract(window);
+var Document = new Abstract(document);
+document.head = document.getElementsByTagName('head')[0];
+
+/*
+Class: window
+	Some properties are attached to the window object by the browser detection.
+	
+Note:
+	browser detection is entirely object-based. We dont sniff.
+
+Properties:
+	window.ie - will be set to true if the current browser is internet explorer (any).
+	window.ie6 - will be set to true if the current browser is internet explorer 6.
+	window.ie7 - will be set to true if the current browser is internet explorer 7.
+	window.gecko - will be set to true if the current browser is Mozilla/Gecko.
+	window.webkit - will be set to true if the current browser is Safari/Konqueror.
+	window.webkit419 - will be set to true if the current browser is Safari2 / webkit till version 419.
+	window.webkit420 - will be set to true if the current browser is Safari3 (Webkit SVN Build) / webkit over version 419.
+	window.opera - is set to true by opera itself.
+*/
+
+window.xpath = !!(document.evaluate);
+if (window.ActiveXObject) window.ie = window[window.XMLHttpRequest ? 'ie7' : 'ie6'] = true;
+else if (document.childNodes && !document.all && !navigator.taintEnabled) window.webkit = window[window.xpath ? 'webkit420' : 'webkit419'] = true;
+else if (document.getBoxObjectFor !== null) window.gecko = true;
+
+/*compatibility*/
+
+window.khtml = window.webkit;
+
+Object.extend = $extend;
+
+/*end compatibility*/
+
+//htmlelement
+
+if (typeof HTMLElement == 'undefined'){
+	var HTMLElement = function(){};
+	if (window.webkit) document.createElement("iframe"); //fixes safari
+	HTMLElement.prototype = (window.webkit) ? window["[[DOMElement.prototype]]"] : {};
+};
+HTMLElement.prototype.htmlElement = function(){};
+
+//enables background image cache for internet explorer 6
+
+if (window.ie6) try {document.execCommand("BackgroundImageCache", false, true);} catch(e){};
+
+/*
+Script: Class.js
+	Contains the Class Function, aims to ease the creation of reusable Classes.
+
+License:
+	MIT-style license.
+*/
+
+/*
+Class: Class
+	The index class object of the <http://mootools.net> framework.
+	Creates a new class, its initialize method will fire upon class instantiation.
+	Initialize wont fire on instantiation when you pass *null*.
+
+Arguments:
+	properties - the collection of properties that apply to the class.
+
+Example:
+	(start code)
+	var Cat = new Class({
+		initialize: function(name){
+			this.name = name;
+		}
+	});
+	var myCat = new Cat('Micia');
+	alert(myCat.name); //alerts 'Micia'
+	(end)
+*/
+
+var Class = function(properties){
+	var klass = function(){
+		return (arguments[0] !== null && this.initialize && $type(this.initialize) == 'function') ? this.initialize.apply(this, arguments) : this;
+	};
+	$extend(klass, this);
+	klass.prototype = properties;
+	klass.constructor = Class;
+	return klass;
+};
+
+/*
+Property: empty
+	Returns an empty function
+*/
+
+Class.empty = function(){};
+
+Class.prototype = {
+
+	/*
+	Property: extend
+		Returns the copy of the Class extended with the passed in properties.
+
+	Arguments:
+		properties - the properties to add to the index class in this new Class.
+
+	Example:
+		(start code)
+		var Animal = new Class({
+			initialize: function(age){
+				this.age = age;
+			}
+		});
+		var Cat = Animal.extend({
+			initialize: function(name, age){
+				this.parent(age); //will call the previous initialize;
+				this.name = name;
+			}
+		});
+		var myCat = new Cat('Micia', 20);
+		alert(myCat.name); //alerts 'Micia'
+		alert(myCat.age); //alerts 20
+		(end)
+	*/
+
+	extend: function(properties){
+		var proto = new this(null);
+		for (var property in properties){
+			var pp = proto[property];
+			proto[property] = Class.Merge(pp, properties[property]);
+		}
+		return new Class(proto);
+	},
+
+	/*
+	Property: implement
+		Implements the passed in properties to the index Class prototypes, altering the index class, unlike <Class.extend>.
+
+	Arguments:
+		properties - the properties to add to the index class.
+
+	Example:
+		(start code)
+		var Animal = new Class({
+			initialize: function(age){
+				this.age = age;
+			}
+		});
+		Animal.implement({
+			setName: function(name){
+				this.name = name
+			}
+		});
+		var myAnimal = new Animal(20);
+		myAnimal.setName('Micia');
+		alert(myAnimal.name); //alerts 'Micia'
+		(end)
+	*/
+
+	implement: function(){
+		for (var i = 0, l = arguments.length; i < l; i++) $extend(this.prototype, arguments[i]);
+	}
+
+};
+
+//internal
+
+Class.Merge = function(previous, current){
+	if (previous && previous != current){
+		var type = $type(current);
+		if (type != $type(previous)) return current;
+		switch(type){
+			case 'function':
+				var merged = function(){
+					this.parent = arguments.callee.parent;
+					return current.apply(this, arguments);
+				};
+				merged.parent = previous;
+				return merged;
+			case 'object': return $merge(previous, current);
+		}
+	}
+	return current;
+};
+
+/*
+Script: Array.js
+	Contains Array prototypes, <$A>, <$each>
+
+License:
+	MIT-style license.
+*/
+
+/*
+Class: Array
+	A collection of The Array Object prototype methods.
+*/
+
+//custom methods
+
+Array.extend({
+
+	/*
+	Property: forEach
+		Iterates through an array; This method is only available for browsers without native *forEach* support.
+		For more info see <http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:forEach>
+
+		*forEach* executes the provided function (callback) once for each element present in the array. callback is invoked only for indexes of the array which have assigned values; it is not invoked for indexes which have been deleted or which have never been assigned values.
+
+	Arguments:
+		fn - function to execute with each item in the array; passed the item and the index of that item in the array
+		bind - the object to bind "this" to (see <Function.bind>)
+
+	Example:
+		>['apple','banana','lemon'].each(function(item, index){
+		>	alert(index + " = " + item); //alerts "0 = apple" etc.
+		>}, bindObj); //optional second arg for binding, not used here
+	*/
+
+	forEach: function(fn, bind){
+		for (var i = 0, j = this.length; i < j; i++) fn.call(bind, this[i], i, this);
+	},
+
+	/*
+	Property: filter
+		This method is provided only for browsers without native *filter* support.
+		For more info see <http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Objects:Array:filter>
+
+		*filter* calls a provided callback function once for each element in an array, and constructs a new array of all the values for which callback returns a true value. callback is invoked only for indexes of the array which have assigned values; it is not invoked for indexes which have been deleted or which have never been assigned values. Array elements which do not pass the callback test are simply skipped, and are not included in the new array.
+
+	Arguments:
+		fn - function to execute with each item in the array; passed the item and the index of that item in the array
+		bind - the object to bind "this" to (see <Function.bind>)
+
+	Example:
+		>var biggerThanTwenty = [10,3,25,100].filter(function(item, index){
+		> return item > 20;
+		>});
+		>//biggerThanTwenty = [25,100]
+	*/
+
+	filter: function(fn, bind){
+		var results = [];
+		for (var i = 0, j = this.length; i < j; i++){
+			if (fn.call(bind, this[i], i, this)) results.push(this[i]);
+		}
+		return results;
+	},
+
+	/*
+	Property: map
+		This method is provided only for browsers without native *map* support.
+		For more info see <http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:map>
+
+		*map* calls a provided callback function once for each element in an array, in order, and constructs a new array from the results. callback is invoked only for indexes of the array which have assigned values; it is not invoked for indexes which have been deleted or which have never been assigned values.
+
+	Arguments:
+		fn - function to execute with each item in the array; passed the item and the index of that item in the array
+		bind - the object to bind "this" to (see <Function.bind>)
+
+	Example:
+		>var timesTwo = [1,2,3].map(function(item, index){
+		> return item*2;
+		>});
+		>//timesTwo = [2,4,6];
+	*/
+
+	map: function(fn, bind){
+		var results = [];
+		for (var i = 0, j = this.length; i < j; i++) results[i] = fn.call(bind, this[i], i, this);
+		return results;
+	},
+
+	/*
+	Property: every
+		This method is provided only for browsers without native *every* support.
+		For more info see <http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:every>
+
+		*every* executes the provided callback function once for each element present in the array until it finds one where callback returns a false value. If such an element is found, the every method immediately returns false. Otherwise, if callback returned a true value for all elements, every will return true. callback is invoked only for indexes of the array which have assigned values; it is not invoked for indexes which have been deleted or which have never been assigned values.
+
+	Arguments:
+		fn - function to execute with each item in the array; passed the item and the index of that item in the array
+		bind - the object to bind "this" to (see <Function.bind>)
+
+	Example:
+		>var areAllBigEnough = [10,4,25,100].every(function(item, index){
+		> return item > 20;
+		>});
+		>//areAllBigEnough = false
+	*/
+
+	every: function(fn, bind){
+		for (var i = 0, j = this.length; i < j; i++){
+			if (!fn.call(bind, this[i], i, this)) return false;
+		}
+		return true;
+	},
+
+	/*
+	Property: some
+		This method is provided only for browsers without native *some* support.
+		For more info see <http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:some>
+
+		*some* executes the callback function once for each element present in the array until it finds one where callback returns a true value. If such an element is found, some immediately returns true. Otherwise, some returns false. callback is invoked only for indexes of the array which have assigned values; it is not invoked for indexes which have been deleted or which have never been assigned values.
+
+	Arguments:
+		fn - function to execute with each item in the array; passed the item and the index of that item in the array
+		bind - the object to bind "this" to (see <Function.bind>)
+
+	Example:
+		>var isAnyBigEnough = [10,4,25,100].some(function(item, index){
+		> return item > 20;
+		>});
+		>//isAnyBigEnough = true
+	*/
+
+	some: function(fn, bind){
+		for (var i = 0, j = this.length; i < j; i++){
+			if (fn.call(bind, this[i], i, this)) return true;
+		}
+		return false;
+	},
+
+	/*
+	Property: indexOf
+		This method is provided only for browsers without native *indexOf* support.
+		For more info see <http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:indexOf>
+
+		*indexOf* compares a search element to elements of the Array using strict equality (the same method used by the ===, or triple-equals, operator).
+
+	Arguments:
+		item - any type of object; element to locate in the array
+		from - integer; optional; the index of the array at which to begin the search (defaults to 0)
+
+	Example:
+		>['apple','lemon','banana'].indexOf('lemon'); //returns 1
+		>['apple','lemon'].indexOf('banana'); //returns -1
+	*/
+
+	indexOf: function(item, from){
+		var len = this.length;
+		for (var i = (from < 0) ? Math.max(0, len + from) : from || 0; i < len; i++){
+			if (this[i] === item) return i;
+		}
+		return -1;
+	},
+
+	/*
+	Property: each
+		Same as <Array.forEach>.
+
+	Arguments:
+		fn - function to execute with each item in the array; passed the item and the index of that item in the array
+		bind - optional, the object that the "this" of the function will refer to.
+
+	Example:
+		>var Animals = ['Cat', 'Dog', 'Coala'];
+		>Animals.each(function(animal){
+		>	document.write(animal)
+		>});
+	*/
+
+	/*
+	Property: copy
+		returns a copy of the array.
+
+	Returns:
+		a new array which is a copy of the current one.
+
+	Arguments:
+		start - integer; optional; the index where to start the copy, default is 0. If negative, it is taken as the offset from the end of the array.
+		length - integer; optional; the number of elements to copy. By default, copies all elements from start to the end of the array.
+
+	Example:
+		>var letters = ["a","b","c"];
+		>var copy = letters.copy();		// ["a","b","c"] (new instance)
+	*/
+
+	copy: function(start, length){
+		start = start || 0;
+		if (start < 0) start = this.length + start;
+		length = length || (this.length - start);
+		var newArray = [];
+		for (var i = 0; i < length; i++) newArray[i] = this[start++];
+		return newArray;
+	},
+
+	/*
+	Property: remove
+		Removes all occurrences of an item from the array.
+
+	Arguments:
+		item - the item to remove
+
+	Returns:
+		the Array with all occurrences of the item removed.
+
+	Example:
+		>["1","2","3","2"].remove("2") // ["1","3"];
+	*/
+
+	remove: function(item){
+		var i = 0;
+		var len = this.length;
+		while (i < len){
+			if (this[i] === item){
+				this.splice(i, 1);
+				len--;
+			} else {
+				i++;
+			}
+		}
+		return this;
+	},
+
+	/*
+	Property: contains
+		Tests an array for the presence of an item.
+
+	Arguments:
+		item - the item to search for in the array.
+		from - integer; optional; the index at which to begin the search, default is 0. If negative, it is taken as the offset from the end of the array.
+
+	Returns:
+		true - the item was found
+		false - it wasn't
+
+	Example:
+		>["a","b","c"].contains("a"); // true
+		>["a","b","c"].contains("d"); // false
+	*/
+
+	contains: function(item, from){
+		return this.indexOf(item, from) != -1;
+	},
+
+	/*
+	Property: associate
+		Creates an object with key-value pairs based on the array of keywords passed in
+		and the current content of the array.
+
+	Arguments:
+		keys - the array of keywords.
+
+	Example:
+		(start code)
+		var Animals = ['Cat', 'Dog', 'Coala', 'Lizard'];
+		var Speech = ['Miao', 'Bau', 'Fruuu', 'Mute'];
+		var Speeches = Animals.associate(Speech);
+		//Speeches['Miao'] is now Cat.
+		//Speeches['Bau'] is now Dog.
+		//...
+		(end)
+	*/
+
+	associate: function(keys){
+		var obj = {}, length = Math.min(this.length, keys.length);
+		for (var i = 0; i < length; i++) obj[keys[i]] = this[i];
+		return obj;
+	},
+
+	/*
+	Property: extend
+		Extends an array with another one.
+
+	Arguments:
+		array - the array to extend ours with
+
+	Example:
+		>var Animals = ['Cat', 'Dog', 'Coala'];
+		>Animals.extend(['Lizard']);
+		>//Animals is now: ['Cat', 'Dog', 'Coala', 'Lizard'];
+	*/
+
+	extend: function(array){
+		for (var i = 0, j = array.length; i < j; i++) this.push(array[i]);
+		return this;
+	},
+
+	/*
+	Property: merge
+		merges an array in another array, without duplicates. (case- and type-sensitive)
+
+	Arguments:
+		array - the array to merge from.
+
+	Example:
+		>['Cat','Dog'].merge(['Dog','Coala']); //returns ['Cat','Dog','Coala']
+	*/
+
+	merge: function(array){
+		for (var i = 0, l = array.length; i < l; i++) this.include(array[i]);
+		return this;
+	},
+
+	/*
+	Property: include
+		includes the passed in element in the array, only if its not already present. (case- and type-sensitive)
+
+	Arguments:
+		item - item to add to the array (if not present)
+
+	Example:
+		>['Cat','Dog'].include('Dog'); //returns ['Cat','Dog']
+		>['Cat','Dog'].include('Coala'); //returns ['Cat','Dog','Coala']
+	*/
+
+	include: function(item){
+		if (!this.contains(item)) this.push(item);
+		return this;
+	},
+
+	/*
+	Property: getRandom
+		returns a random item in the Array
+	*/
+
+	getRandom: function(){
+		return this[$random(0, this.length - 1)] || null;
+	},
+
+	/*
+	Property: getLast
+		returns the last item in the Array
+	*/
+
+	getLast: function(){
+		return this[this.length - 1] || null;
+	}
+
+});
+
+//copies
+
+Array.prototype.each = Array.prototype.forEach;
+Array.each = Array.forEach;
+
+/* Section: Utility Functions */
+
+/*
+Function: $A()
+	Same as <Array.copy>, but as function.
+	Useful to apply Array prototypes to iterable objects, as a collection of DOM elements or the arguments object.
+
+Example:
+	(start code)
+	function myFunction(){
+		$A(arguments).each(argument, function(){
+			alert(argument);
+		});
+	};
+	//the above will alert all the arguments passed to the function myFunction.
+	(end)
+*/
+
+function $A(array){
+	return Array.copy(array);
+};
+
+/*
+Function: $each
+	Use to iterate through iterables that are not regular arrays, such as builtin getElementsByTagName calls, arguments of a function, or an object.
+
+Arguments:
+	iterable - an iterable element or an objct.
+	function - function to apply to the iterable.
+	bind - optional, the 'this' of the function will refer to this object.
+
+Function argument:
+	The function argument will be passed the following arguments.
+
+	item - the current item in the iterator being procesed
+	index - integer; the index of the item, or key in case of an object.
+
+Examples:
+	(start code)
+	$each(['Sun','Mon','Tue'], function(day, index){
+		alert('name:' + day + ', index: ' + index);
+	});
+	//alerts "name: Sun, index: 0", "name: Mon, index: 1", etc.
+	//over an object
+	$each({first: "Sunday", second: "Monday", third: "Tuesday"}, function(value, key){
+		alert("the " + key + " day of the week is " + value);
+	});
+	//alerts "the first day of the week is Sunday",
+	//"the second day of the week is Monday", etc.
+	(end)
+*/
+
+function $each(iterable, fn, bind){
+	if (iterable && typeof iterable.length == 'number' && $type(iterable) != 'object'){
+		Array.forEach(iterable, fn, bind);
+	} else {
+		 for (var name in iterable) fn.call(bind || iterable, iterable[name], name);
+	}
+};
+
+/*compatibility*/
+
+Array.prototype.test = Array.prototype.contains;
+
+/*end compatibility*/
+
+/*
+Script: String.js
+	Contains String prototypes.
+
+License:
+	MIT-style license.
+*/
+
+/*
+Class: String
+	A collection of The String Object prototype methods.
+*/
+
+String.extend({
+
+	/*
+	Property: test
+		Tests a string with a regular expression.
+
+	Arguments:
+		regex - a string or regular expression object, the regular expression you want to match the string with
+		params - optional, if first parameter is a string, any parameters you want to pass to the regex ('g' has no effect)
+
+	Returns:
+		true if a match for the regular expression is found in the string, false if not.
+		See <http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Objects:RegExp:test>
+
+	Example:
+		>"I like cookies".test("cookie"); // returns true
+		>"I like cookies".test("COOKIE", "i") // ignore case, returns true
+		>"I like cookies".test("cake"); // returns false
+	*/
+
+	test: function(regex, params){
+		return (($type(regex) == 'string') ? new RegExp(regex, params) : regex).test(this);
+	},
+
+	/*
+	Property: toInt
+		parses a string to an integer.
+
+	Returns:
+		either an int or "NaN" if the string is not a number.
+
+	Example:
+		>var value = "10px".toInt(); // value is 10
+	*/
+
+	toInt: function(){
+		return parseInt(this, 10);
+	},
+
+	/*
+	Property: toFloat
+		parses a string to an float.
+
+	Returns:
+		either a float or "NaN" if the string is not a number.
+
+	Example:
+		>var value = "10.848".toFloat(); // value is 10.848
+	*/
+
+	toFloat: function(){
+		return parseFloat(this);
+	},
+
+	/*
+	Property: camelCase
+		Converts a hiphenated string to a camelcase string.
+
+	Example:
+		>"I-like-cookies".camelCase(); //"ILikeCookies"
+
+	Returns:
+		the camel cased string
+	*/
+
+	camelCase: function(){
+		return this.replace(/-\D/g, function(match){
+			return match.charAt(1).toUpperCase();
+		});
+	},
+
+	/*
+	Property: hyphenate
+		Converts a camelCased string to a hyphen-ated string.
+
+	Example:
+		>"ILikeCookies".hyphenate(); //"I-like-cookies"
+	*/
+
+	hyphenate: function(){
+		return this.replace(/\w[A-Z]/g, function(match){
+			return (match.charAt(0) + '-' + match.charAt(1).toLowerCase());
+		});
+	},
+
+	/*
+	Property: capitalize
+		Converts the first letter in each word of a string to Uppercase.
+
+	Example:
+		>"i like cookies".capitalize(); //"I Like Cookies"
+
+	Returns:
+		the capitalized string
+	*/
+
+	capitalize: function(){
+		return this.replace(/\b[a-z]/g, function(match){
+			return match.toUpperCase();
+		});
+	},
+
+	/*
+	Property: trim
+		Trims the leading and trailing spaces off a string.
+
+	Example:
+		>"    i like cookies     ".trim() //"i like cookies"
+
+	Returns:
+		the trimmed string
+	*/
+
+	trim: function(){
+		return this.replace(/^\s+|\s+$/g, '');
+	},
+
+	/*
+	Property: clean
+		trims (<String.trim>) a string AND removes all the double spaces in a string.
+
+	Returns:
+		the cleaned string
+
+	Example:
+		>" i      like     cookies      \n\n".clean() //"i like cookies"
+	*/
+
+	clean: function(){
+		return this.replace(/\s{2,}/g, ' ').trim();
+	},
+
+	/*
+	Property: rgbToHex
+		Converts an RGB value to hexidecimal. The string must be in the format of "rgb(255,255,255)" or "rgba(255,255,255,1)";
+
+	Arguments:
+		array - boolean value, defaults to false. Use true if you want the array ['FF','33','00'] as output instead of "#FF3300"
+
+	Returns:
+		hex string or array. returns "transparent" if the output is set as string and the fourth value of rgba in input string is 0.
+
+	Example:
+		>"rgb(17,34,51)".rgbToHex(); //"#112233"
+		>"rgba(17,34,51,0)".rgbToHex(); //"transparent"
+		>"rgb(17,34,51)".rgbToHex(true); //['11','22','33']
+	*/
+
+	rgbToHex: function(array){
+		var rgb = this.match(/\d{1,3}/g);
+		return (rgb) ? rgb.rgbToHex(array) : false;
+	},
+
+	/*
+	Property: hexToRgb
+		Converts a hexidecimal color value to RGB. Input string must be the hex color value (with or without the hash). Also accepts triplets ('333');
+
+	Arguments:
+		array - boolean value, defaults to false. Use true if you want the array [255,255,255] as output instead of "rgb(255,255,255)";
+
+	Returns:
+		rgb string or array.
+
+	Example:
+		>"#112233".hexToRgb(); //"rgb(17,34,51)"
+		>"#112233".hexToRgb(true); //[17,34,51]
+	*/
+
+	hexToRgb: function(array){
+		var hex = this.match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/);
+		return (hex) ? hex.slice(1).hexToRgb(array) : false;
+	},
+
+	/*
+	Property: contains
+		checks if the passed in string is contained in the String. also accepts an optional second parameter, to check if the string is contained in a list of separated values.
+
+	Example:
+		>'a b c'.contains('c', ' '); //true
+		>'a bc'.contains('bc'); //true
+		>'a bc'.contains('b', ' '); //false
+	*/
+
+	contains: function(string, s){
+		return (s) ? (s + this + s).indexOf(s + string + s) > -1 : this.indexOf(string) > -1;
+	},
+
+	/*
+	Property: escapeRegExp
+		Returns string with escaped regular expression characters
+
+	Example:
+		>var search = 'animals.sheeps[1]'.escapeRegExp(); // search is now 'animals\.sheeps\[1\]'
+
+	Returns:
+		Escaped string
+	*/
+
+	escapeRegExp: function(){
+		return this.replace(/([.*+?^${}()|[\]\/\\])/g, '\\$1');
+	}
+
+});
+
+Array.extend({
+
+	/*
+	Property: rgbToHex
+		see <String.rgbToHex>, but as an array method.
+	*/
+
+	rgbToHex: function(array){
+		if (this.length < 3) return false;
+		if (this.length == 4 && this[3] === 0 && !array) return 'transparent';
+		var hex = [];
+		for (var i = 0; i < 3; i++){
+			var bit = (this[i] - 0).toString(16);
+			hex.push((bit.length == 1) ? '0' + bit : bit);
+		}
+		return array ? hex : '#' + hex.join('');
+	},
+
+	/*
+	Property: hexToRgb
+		same as <String.hexToRgb>, but as an array method.
+	*/
+
+	hexToRgb: function(array){
+		if (this.length != 3) return false;
+		var rgb = [];
+		for (var i = 0; i < 3; i++){
+			rgb.push(parseInt((this[i].length == 1) ? this[i] + this[i] : this[i], 16));
+		}
+		return array ? rgb : 'rgb(' + rgb.join(',') + ')';
+	}
+
+});
+
+/* 
+Script: Function.js
+	Contains Function prototypes and utility functions .
+
+License:
+	MIT-style license.
+
+Credits:
+	- Some functions are inspired by those found in prototype.js <http://prototype.conio.net/> (c) 2005 Sam Stephenson sam [at] conio [dot] net, MIT-style license
+*/
+
+/*
+Class: Function
+	A collection of The Function Object prototype methods.
+*/
+
+Function.extend({
+
+	/*
+	Property: create
+		Main function to create closures.
+
+	Returns:
+		a function.
+
+	Arguments:
+		options - An Options object.
+
+	Options:
+		bind - The object that the "this" of the function will refer to. Default is the current function.
+		event - If set to true, the function will act as an event listener and receive an event as first argument.
+				If set to a class name, the function will receive a new instance of this class (with the event passed as argument's constructor) as first argument.
+				Default is false.
+		arguments - A single argument or array of arguments that will be passed to the function when called.
+		
+					If both the event and arguments options are set, the event is passed as first argument and the arguments array will follow.
+					
+					Default is no custom arguments, the function will receive the standard arguments when called.
+					
+		delay - Numeric value: if set, the returned function will delay the actual execution by this amount of milliseconds and return a timer handle when called.
+				Default is no delay.
+		periodical - Numeric value: if set, the returned function will periodically perform the actual execution with this specified interval and return a timer handle when called.
+				Default is no periodical execution.
+		attempt - If set to true, the returned function will try to execute and return either the results or false on error. Default is false.
+	*/
+
+	create: function(options){
+		var fn = this;
+		options = $merge({
+			'bind': fn,
+			'event': false,
+			'arguments': null,
+			'delay': false,
+			'periodical': false,
+			'attempt': false
+		}, options);
+		if ($chk(options.arguments) && $type(options.arguments) != 'array') options.arguments = [options.arguments];
+		return function(event){
+			var args;
+			if (options.event){
+				event = event || window.event;
+				args = [(options.event === true) ? event : new options.event(event)];
+				if (options.arguments) args.extend(options.arguments);
+			}
+			else args = options.arguments || arguments;
+			var returns = function(){
+				return fn.apply($pick(options.bind, fn), args);
+			};
+			if (options.delay) return setTimeout(returns, options.delay);
+			if (options.periodical) return setInterval(returns, options.periodical);
+			if (options.attempt) try {return returns();} catch(err){return false;};
+			return returns();
+		};
+	},
+
+	/*
+	Property: pass
+		Shortcut to create closures with arguments and bind.
+
+	Returns:
+		a function.
+
+	Arguments:
+		args - the arguments passed. must be an array if arguments > 1
+		bind - optional, the object that the "this" of the function will refer to.
+
+	Example:
+		>myFunction.pass([arg1, arg2], myElement);
+	*/
+
+	pass: function(args, bind){
+		return this.create({'arguments': args, 'bind': bind});
+	},
+
+	/*
+	Property: attempt
+		Tries to execute the function, returns either the result of the function or false on error.
+
+	Arguments:
+		args - the arguments passed. must be an array if arguments > 1
+		bind - optional, the object that the "this" of the function will refer to.
+
+	Example:
+		>myFunction.attempt([arg1, arg2], myElement);
+	*/
+
+	attempt: function(args, bind){
+		return this.create({'arguments': args, 'bind': bind, 'attempt': true})();
+	},
+
+	/*
+	Property: bind
+		method to easily create closures with "this" altered.
+
+	Arguments:
+		bind - optional, the object that the "this" of the function will refer to.
+		args - optional, the arguments passed. must be an array if arguments > 1
+
+	Returns:
+		a function.
+
+	Example:
+		>function myFunction(){
+		>	this.setStyle('color', 'red');
+		>	// note that 'this' here refers to myFunction, not an element
+		>	// we'll need to bind this function to the element we want to alter
+		>};
+		>var myBoundFunction = myFunction.bind(myElement);
+		>myBoundFunction(); // this will make the element myElement red.
+	*/
+
+	bind: function(bind, args){
+		return this.create({'bind': bind, 'arguments': args});
+	},
+
+	/*
+	Property: bindAsEventListener
+		cross browser method to pass event firer
+
+	Arguments:
+		bind - optional, the object that the "this" of the function will refer to.
+		args - optional, the arguments passed. must be an array if arguments > 1
+
+	Returns:
+		a function with the parameter bind as its "this" and as a pre-passed argument event or window.event, depending on the browser.
+
+	Example:
+		>function myFunction(event){
+		>	alert(event.clientx) //returns the coordinates of the mouse..
+		>};
+		>myElement.onclick = myFunction.bindAsEventListener(myElement);
+	*/
+
+	bindAsEventListener: function(bind, args){
+		return this.create({'bind': bind, 'event': true, 'arguments': args});
+	},
+
+	/*
+	Property: delay
+		Delays the execution of a function by a specified duration.
+
+	Arguments:
+		delay - the duration to wait in milliseconds.
+		bind - optional, the object that the "this" of the function will refer to.
+		args - optional, the arguments passed. must be an array if arguments > 1
+
+	Example:
+		>myFunction.delay(50, myElement) //wait 50 milliseconds, then call myFunction and bind myElement to it
+		>(function(){alert('one second later...')}).delay(1000); //wait a second and alert
+	*/
+
+	delay: function(delay, bind, args){
+		return this.create({'delay': delay, 'bind': bind, 'arguments': args})();
+	},
+
+	/*
+	Property: periodical
+		Executes a function in the specified intervals of time
+
+	Arguments:
+		interval - the duration of the intervals between executions.
+		bind - optional, the object that the "this" of the function will refer to.
+		args - optional, the arguments passed. must be an array if arguments > 1
+	*/
+
+	periodical: function(interval, bind, args){
+		return this.create({'periodical': interval, 'bind': bind, 'arguments': args})();
+	}
+
+});
+
+/*
+Script: Number.js
+	Contains the Number prototypes.
+
+License:
+	MIT-style license.
+*/
+
+/*
+Class: Number
+	A collection of The Number Object prototype methods.
+*/
+
+Number.extend({
+
+	/*
+	Property: toInt
+		Returns this number; useful because toInt must work on both Strings and Numbers.
+	*/
+
+	toInt: function(){
+		return parseInt(this);
+	},
+
+	/*
+	Property: toFloat
+		Returns this number as a float; useful because toFloat must work on both Strings and Numbers.
+	*/
+
+	toFloat: function(){
+		return parseFloat(this);
+	},
+
+	/*
+	Property: limit
+		Limits the number.
+
+	Arguments:
+		min - number, minimum value
+		max - number, maximum value
+
+	Returns:
+		the number in the given limits.
+
+	Example:
+		>(12).limit(2, 6.5)  // returns 6.5
+		>(-4).limit(2, 6.5)  // returns 2
+		>(4.3).limit(2, 6.5) // returns 4.3
+	*/
+
+	limit: function(min, max){
+		return Math.min(max, Math.max(min, this));
+	},
+
+	/*
+	Property: round
+		Returns the number rounded to specified precision.
+
+	Arguments:
+		precision - integer, number of digits after the decimal point. Can also be negative or zero (default).
+
+	Example:
+		>12.45.round() // returns 12
+		>12.45.round(1) // returns 12.5
+		>12.45.round(-1) // returns 10
+
+	Returns:
+		The rounded number.
+	*/
+
+	round: function(precision){
+		precision = Math.pow(10, precision || 0);
+		return Math.round(this * precision) / precision;
+	},
+
+	/*
+	Property: times
+		Executes a passed in function the specified number of times
+
+	Arguments:
+		function - the function to be executed on each iteration of the loop
+
+	Example:
+		>(4).times(alert);
+	*/
+
+	times: function(fn){
+		for (var i = 0; i < this; i++) fn(i);
+	}
+
+});
+
+/*
+Script: Element.js
+	Contains useful Element prototypes, to be used with the dollar function <$>.
+
+License:
+	MIT-style license.
+
+Credits:
+	- Some functions are inspired by those found in prototype.js <http://prototype.conio.net/> (c) 2005 Sam Stephenson sam [at] conio [dot] net, MIT-style license
+*/
+
+/*
+Class: Element
+	Custom class to allow all of its methods to be used with any DOM element via the dollar function <$>.
+*/
+
+var Element = new Class({
+
+	/*
+	Property: initialize
+		Creates a new element of the type passed in.
+
+	Arguments:
+		el - string; the tag name for the element you wish to create. you can also pass in an element reference, in which case it will be extended.
+		props - object; the properties you want to add to your element.
+		Accepts the same keys as <Element.setProperties>, but also allows events and styles
+
+	Props:
+		the key styles will be used as setStyles, the key events will be used as addEvents. any other key is used as setProperty.
+
+	Example:
+		(start code)
+		new Element('a', {
+			'styles': {
+				'display': 'block',
+				'border': '1px solid black'
+			},
+			'events': {
+				'click': function(){
+					//aaa
+				},
+				'mousedown': function(){
+					//aaa
+				}
+			},
+			'class': 'myClassSuperClass',
+			'href': 'http://mad4milk.net'
+		});
+
+		(end)
+	*/
+
+	initialize: function(el, props){
+		if ($type(el) == 'string'){
+			if (window.ie && props && (props.name || props.type)){
+				var name = (props.name) ? ' name="' + props.name + '"' : '';
+				var type = (props.type) ? ' type="' + props.type + '"' : '';
+				delete props.name;
+				delete props.type;
+				el = '<' + el + name + type + '>';
+			}
+			el = document.createElement(el);
+		}
+		el = $(el);
+		return (!props || !el) ? el : el.set(props);
+	}
+
+});
+
+/*
+Class: Elements
+	- Every dom function such as <$$>, or in general every function that returns a collection of nodes in mootools, returns them as an Elements class.
+	- The purpose of the Elements class is to allow <Element> methods to work also on <Elements> array.
+	- Elements is also an Array, so it accepts all the <Array> methods.
+	- Every node of the Elements instance is already extended with <$>.
+
+Example:
+	>$$('myselector').each(function(el){
+	> //...
+	>});
+
+	some iterations here, $$('myselector') is also an array.
+
+	>$$('myselector').setStyle('color', 'red');
+	every element returned by $$('myselector') also accepts <Element> methods, in this example every element will be made red.
+*/
+
+var Elements = new Class({
+
+	initialize: function(elements){
+		return (elements) ? $extend(elements, this) : this;
+	}
+
+});
+
+Elements.extend = function(props){
+	for (var prop in props){
+		this.prototype[prop] = props[prop];
+		this[prop] = $native.generic(prop);
+	}
+};
+
+/*
+Section: Utility Functions
+
+Function: $
+	returns the element passed in with all the Element prototypes applied.
+
+Arguments:
+	el - a reference to an actual element or a string representing the id of an element
+
+Example:
+	>$('myElement') // gets a DOM element by id with all the Element prototypes applied.
+	>var div = document.getElementById('myElement');
+	>$(div) //returns an Element also with all the mootools extentions applied.
+
+	You'll use this when you aren't sure if a variable is an actual element or an id, as
+	well as just shorthand for document.getElementById().
+
+Returns:
+	a DOM element or false (if no id was found).
+
+Note:
+	you need to call $ on an element only once to get all the prototypes.
+	But its no harm to call it multiple times, as it will detect if it has been already extended.
+*/
+
+function $(el){
+	if (!el) return null;
+	if (el.htmlElement) return Garbage.collect(el);
+	if ([window, document].contains(el)) return el;
+	var type = $type(el);
+	if (type == 'string'){
+		el = document.getElementById(el);
+		type = (el) ? 'element' : false;
+	}
+	if (type != 'element') return null;
+	if (el.htmlElement) return Garbage.collect(el);
+	if (['object', 'embed'].contains(el.tagName.toLowerCase())) return el;
+	$extend(el, Element.prototype);
+	el.htmlElement = function(){};
+	return Garbage.collect(el);
+};
+
+/*
+Function: $$
+	Selects, and extends DOM elements. Elements arrays returned with $$ will also accept all the <Element> methods.
+	The return type of element methods run through $$ is always an array. If the return array is only made by elements,
+	$$ will be applied automatically.
+
+Arguments:
+	HTML Collections, arrays of elements, arrays of strings as element ids, elements, strings as selectors.
+	Any number of the above as arguments are accepted.
+
+Note:
+	if you load <Element.Selectors.js>, $$ will also accept CSS Selectors, otherwise the only selectors supported are tag names.
+
+Example:
+	>$$('a') //an array of all anchor tags on the page
+	>$$('a', 'b') //an array of all anchor and bold tags on the page
+	>$$('#myElement') //array containing only the element with id = myElement. (only with <Element.Selectors.js>)
+	>$$('#myElement a.myClass') //an array of all anchor tags with the class "myClass"
+	>//within the DOM element with id "myElement" (only with <Element.Selectors.js>)
+	>$$(myelement, myelement2, 'a', ['myid', myid2, 'myid3'], document.getElementsByTagName('div')) //an array containing:
+	>// the element referenced as myelement if existing,
+	>// the element referenced as myelement2 if existing,
+	>// all the elements with a as tag in the page,
+	>// the element with id = myid if existing
+	>// the element with id = myid2 if existing
+	>// the element with id = myid3 if existing
+	>// all the elements with div as tag in the page
+
+Returns:
+	array - array of all the dom elements matched, extended with <$>.  Returns as <Elements>.
+*/
+
+document.getElementsBySelector = document.getElementsByTagName;
+
+function $$(){
+	var elements = [];
+	for (var i = 0, j = arguments.length; i < j; i++){
+		var selector = arguments[i];
+		switch($type(selector)){
+			case 'element': elements.push(selector);
+			case 'boolean': break;
+			case false: break;
+			case 'string': selector = document.getElementsBySelector(selector, true);
+			default: elements.extend(selector);
+		}
+	}
+	return $$.unique(elements);
+};
+
+$$.unique = function(array){
+	var elements = [];
+	for (var i = 0, l = array.length; i < l; i++){
+		if (array[i].$included) continue;
+		var element = $(array[i]);
+		if (element && !element.$included){
+			element.$included = true;
+			elements.push(element);
+		}
+	}
+	for (var n = 0, d = elements.length; n < d; n++) elements[n].$included = null;
+	return new Elements(elements);
+};
+
+Elements.Multi = function(property){
+	return function(){
+		var args = arguments;
+		var items = [];
+		var elements = true;
+		for (var i = 0, j = this.length, returns; i < j; i++){
+			returns = this[i][property].apply(this[i], args);
+			if ($type(returns) != 'element') elements = false;
+			items.push(returns);
+		};
+		return (elements) ? $$.unique(items) : items;
+	};
+};
+
+Element.extend = function(properties){
+	for (var property in properties){
+		HTMLElement.prototype[property] = properties[property];
+		Element.prototype[property] = properties[property];
+		Element[property] = $native.generic(property);
+		var elementsProperty = (Array.prototype[property]) ? property + 'Elements' : property;
+		Elements.prototype[elementsProperty] = Elements.Multi(property);
+	}
+};
+
+/*
+Class: Element
+	Custom class to allow all of its methods to be used with any DOM element via the dollar function <$>.
+*/
+
+Element.extend({
+
+	/*
+	Property: set
+		you can set events, styles and properties with this shortcut. same as calling new Element.
+	*/
+
+	set: function(props){
+		for (var prop in props){
+			var val = props[prop];
+			switch(prop){
+				case 'styles': this.setStyles(val); break;
+				case 'events': if (this.addEvents) this.addEvents(val); break;
+				case 'properties': this.setProperties(val); break;
+				default: this.setProperty(prop, val);
+			}
+		}
+		return this;
+	},
+
+	inject: function(el, where){
+		el = $(el);
+		switch(where){
+			case 'before': el.parentNode.insertBefore(this, el); break;
+			case 'after':
+				var next = el.getNext();
+				if (!next) el.parentNode.appendChild(this);
+				else el.parentNode.insertBefore(this, next);
+				break;
+			case 'top':
+				var first = el.firstChild;
+				if (first){
+					el.insertBefore(this, first);
+					break;
+				}
+			default: el.appendChild(this);
+		}
+		return this;
+	},
+
+	/*
+	Property: injectBefore
+		Inserts the Element before the passed element.
+
+	Arguments:
+		el - an element reference or the id of the element to be injected in.
+
+	Example:
+		>html:
+		><div id="myElement"></div>
+		><div id="mySecondElement"></div>
+		>js:
+		>$('mySecondElement').injectBefore('myElement');
+		>resulting html:
+		><div id="mySecondElement"></div>
+		><div id="myElement"></div>
+	*/
+
+	injectBefore: function(el){
+		return this.inject(el, 'before');
+	},
+
+	/*
+	Property: injectAfter
+		Same as <Element.injectBefore>, but inserts the element after.
+	*/
+
+	injectAfter: function(el){
+		return this.inject(el, 'after');
+	},
+
+	/*
+	Property: injectInside
+		Same as <Element.injectBefore>, but inserts the element inside.
+	*/
+
+	injectInside: function(el){
+		return this.inject(el, 'bottom');
+	},
+
+	/*
+	Property: injectTop
+		Same as <Element.injectInside>, but inserts the element inside, at the top.
+	*/
+
+	injectTop: function(el){
+		return this.inject(el, 'top');
+	},
+
+	/*
+	Property: adopt
+		Inserts the passed elements inside the Element.
+
+	Arguments:
+		accepts elements references, element ids as string, selectors ($$('stuff')) / array of elements, array of ids as strings and collections.
+	*/
+
+	adopt: function(){
+		var elements = [];
+		$each(arguments, function(argument){
+			elements = elements.concat(argument);
+		});
+		$$(elements).inject(this);
+		return this;
+	},
+
+	/*
+	Property: remove
+		Removes the Element from the DOM.
+
+	Example:
+		>$('myElement').remove() //bye bye
+	*/
+
+	remove: function(){
+		return this.parentNode.removeChild(this);
+	},
+
+	/*
+	Property: clone
+		Clones the Element and returns the cloned one.
+
+	Arguments:
+		contents - boolean, when true the Element is cloned with childNodes, default true
+
+	Returns:
+		the cloned element
+
+	Example:
+		>var clone = $('myElement').clone().injectAfter('myElement');
+		>//clones the Element and append the clone after the Element.
+	*/
+
+	clone: function(contents){
+		var el = $(this.cloneNode(contents !== false));
+		if (!el.$events) return el;
+		el.$events = {};
+		for (var type in this.$events) el.$events[type] = {
+			'keys': $A(this.$events[type].keys),
+			'values': $A(this.$events[type].values)
+		};
+		return el.removeEvents();
+	},
+
+	/*
+	Property: replaceWith
+		Replaces the Element with an element passed.
+
+	Arguments:
+		el - a string representing the element to be injected in (myElementId, or div), or an element reference.
+		If you pass div or another tag, the element will be created.
+
+	Returns:
+		the passed in element
+
+	Example:
+		>$('myOldElement').replaceWith($('myNewElement')); //$('myOldElement') is gone, and $('myNewElement') is in its place.
+	*/
+
+	replaceWith: function(el){
+		el = $(el);
+		this.parentNode.replaceChild(el, this);
+		return el;
+	},
+
+	/*
+	Property: appendText
+		Appends text node to a DOM element.
+
+	Arguments:
+		text - the text to append.
+
+	Example:
+		><div id="myElement">hey</div>
+		>$('myElement').appendText(' howdy'); //myElement innerHTML is now "hey howdy"
+	*/
+
+	appendText: function(text){
+		this.appendChild(document.createTextNode(text));
+		return this;
+	},
+
+	/*
+	Property: hasClass
+		Tests the Element to see if it has the passed in className.
+
+	Returns:
+		true - the Element has the class
+		false - it doesn't
+
+	Arguments:
+		className - string; the class name to test.
+
+	Example:
+		><div id="myElement" class="testClass"></div>
+		>$('myElement').hasClass('testClass'); //returns true
+	*/
+
+	hasClass: function(className){
+		return this.className.contains(className, ' ');
+	},
+
+	/*
+	Property: addClass
+		Adds the passed in class to the Element, if the element doesnt already have it.
+
+	Arguments:
+		className - string; the class name to add
+
+	Example:
+		><div id="myElement" class="testClass"></div>
+		>$('myElement').addClass('newClass'); //<div id="myElement" class="testClass newClass"></div>
+	*/
+
+	addClass: function(className){
+		if (!this.hasClass(className)) this.className = (this.className + ' ' + className).clean();
+		return this;
+	},
+
+	/*
+	Property: removeClass
+		Works like <Element.addClass>, but removes the class from the element.
+	*/
+
+	removeClass: function(className){
+		this.className = this.className.replace(new RegExp('(^|\\s)' + className + '(?:\\s|$)'), '$1').clean();
+		return this;
+	},
+
+	/*
+	Property: toggleClass
+		Adds or removes the passed in class name to the element, depending on if it's present or not.
+
+	Arguments:
+		className - the class to add or remove
+
+	Example:
+		><div id="myElement" class="myClass"></div>
+		>$('myElement').toggleClass('myClass');
+		><div id="myElement" class=""></div>
+		>$('myElement').toggleClass('myClass');
+		><div id="myElement" class="myClass"></div>
+	*/
+
+	toggleClass: function(className){
+		return this.hasClass(className) ? this.removeClass(className) : this.addClass(className);
+	},
+
+	/*
+	Property: setStyle
+		Sets a css property to the Element.
+
+		Arguments:
+			property - the property to set
+			value - the value to which to set it; for numeric values that require "px" you can pass an integer
+
+		Example:
+			>$('myElement').setStyle('width', '300px'); //the width is now 300px
+			>$('myElement').setStyle('width', 300); //the width is now 300px
+	*/
+
+	setStyle: function(property, value){
+		switch(property){
+			case 'opacity': return this.setOpacity(parseFloat(value));
+			case 'float': property = (window.ie) ? 'styleFloat' : 'cssFloat';
+		}
+		property = property.camelCase();
+		switch($type(value)){
+			case 'number': if (!['zIndex', 'zoom'].contains(property)) value += 'px'; break;
+			case 'array': value = 'rgb(' + value.join(',') + ')';
+		}
+		this.style[property] = value;
+		return this;
+	},
+
+	/*
+	Property: setStyles
+		Applies a collection of styles to the Element.
+
+	Arguments:
+		source - an object or string containing all the styles to apply. When its a string it overrides old style.
+
+	Examples:
+		>$('myElement').setStyles({
+		>	border: '1px solid #000',
+		>	width: 300,
+		>	height: 400
+		>});
+
+		OR
+
+		>$('myElement').setStyles('border: 1px solid #000; width: 300px; height: 400px;');
+	*/
+
+	setStyles: function(source){
+		switch($type(source)){
+			case 'object': Element.setMany(this, 'setStyle', source); break;
+			case 'string': this.style.cssText = source;
+		}
+		return this;
+	},
+
+	/*
+	Property: setOpacity
+		Sets the opacity of the Element, and sets also visibility == "hidden" if opacity === 0, and visibility = "visible" if opacity > 0.
+
+	Arguments:
+		opacity - float; Accepts values from 0 to 1.
+
+	Example:
+		>$('myElement').setOpacity(0.5) //make it 50% transparent
+	*/
+
+	setOpacity: function(opacity){
+		if (opacity === 0){
+			if (this.style.visibility != "hidden") this.style.visibility = "hidden";
+		} else {
+			if (this.style.visibility != "visible") this.style.visibility = "visible";
+		}
+		if (!this.currentStyle || !this.currentStyle.hasLayout) this.style.zoom = 1;
+		if (window.ie) this.style.filter = (opacity == 1) ? '' : "alpha(opacity=" + opacity * 100 + ")";
+		this.style.opacity = this.$tmp.opacity = opacity;
+		return this;
+	},
+
+	/*
+	Property: getStyle
+		Returns the style of the Element given the property passed in.
+
+	Arguments:
+		property - the css style property you want to retrieve
+
+	Example:
+		>$('myElement').getStyle('width'); //returns "400px"
+		>//but you can also use
+		>$('myElement').getStyle('width').toInt(); //returns 400
+
+	Returns:
+		the style as a string
+	*/
+
+	getStyle: function(property){
+		property = property.camelCase();
+		var result = this.style[property];
+		if (!$chk(result)){
+			if (property == 'opacity') return this.$tmp.opacity;
+			result = [];
+			for (var style in Element.Styles){
+				if (property == style){
+					Element.Styles[style].each(function(s){
+						var style = this.getStyle(s);
+						result.push(parseInt(style) ? style : '0px');
+					}, this);
+					if (property == 'border'){
+						var every = result.every(function(bit){
+							return (bit == result[0]);
+						});
+						return (every) ? result[0] : false;
+					}
+					return result.join(' ');
+				}
+			}
+			if (property.contains('border')){
+				if (Element.Styles.border.contains(property)){
+					return ['Width', 'Style', 'Color'].map(function(p){
+						return this.getStyle(property + p);
+					}, this).join(' ');
+				} else if (Element.borderShort.contains(property)){
+					return ['Top', 'Right', 'Bottom', 'Left'].map(function(p){
+						return this.getStyle('border' + p + property.replace('border', ''));
+					}, this).join(' ');
+				}
+			}
+			if (document.defaultView) result = document.defaultView.getComputedStyle(this, null).getPropertyValue(property.hyphenate());
+			else if (this.currentStyle) result = this.currentStyle[property];
+		}
+		if (window.ie) result = Element.fixStyle(property, result, this);
+		if (result && property.test(/color/i) && result.contains('rgb')){
+			return result.split('rgb').splice(1,4).map(function(color){
+				return color.rgbToHex();
+			}).join(' ');
+		}
+		return result;
+	},
+
+	/*
+	Property: getStyles
+		Returns an object of styles of the Element for each argument passed in.
+		Arguments:
+		properties - strings; any number of style properties
+	Example:
+		>$('myElement').getStyles('width','height','padding');
+		>//returns an object like:
+		>{width: "10px", height: "10px", padding: "10px 0px 10px 0px"}
+	*/
+
+	getStyles: function(){
+		return Element.getMany(this, 'getStyle', arguments);
+	},
+
+	walk: function(brother, start){
+		brother += 'Sibling';
+		var el = (start) ? this[start] : this[brother];
+		while (el && $type(el) != 'element') el = el[brother];
+		return $(el);
+	},
+
+	/*
+	Property: getPrevious
+		Returns the previousSibling of the Element, excluding text nodes.
+
+	Example:
+		>$('myElement').getPrevious(); //get the previous DOM element from myElement
+
+	Returns:
+		the sibling element or undefined if none found.
+	*/
+
+	getPrevious: function(){
+		return this.walk('previous');
+	},
+
+	/*
+	Property: getNext
+		Works as Element.getPrevious, but tries to find the nextSibling.
+	*/
+
+	getNext: function(){
+		return this.walk('next');
+	},
+
+	/*
+	Property: getFirst
+		Works as <Element.getPrevious>, but tries to find the firstChild.
+	*/
+
+	getFirst: function(){
+		return this.walk('next', 'firstChild');
+	},
+
+	/*
+	Property: getLast
+		Works as <Element.getPrevious>, but tries to find the lastChild.
+	*/
+
+	getLast: function(){
+		return this.walk('previous', 'lastChild');
+	},
+
+	/*
+	Property: getParent
+		returns the $(element.parentNode)
+	*/
+
+	getParent: function(){
+		return $(this.parentNode);
+	},
+
+	/*
+	Property: getChildren
+		returns all the $(element.childNodes), excluding text nodes. Returns as <Elements>.
+	*/
+
+	getChildren: function(){
+		return $$(this.childNodes);
+	},
+
+	/*
+	Property: hasChild
+		returns true if the passed in element is a child of the $(element).
+	*/
+
+	hasChild: function(el){
+		return !!$A(this.getElementsByTagName('*')).contains(el);
+	},
+
+	/*
+	Property: getProperty
+		Gets the an attribute of the Element.
+
+	Arguments:
+		property - string; the attribute to retrieve
+
+	Example:
+		>$('myImage').getProperty('src') // returns whatever.gif
+
+	Returns:
+		the value, or an empty string
+	*/
+
+	getProperty: function(property){
+		var index = Element.Properties[property];
+		if (index) return this[index];
+		var flag = Element.PropertiesIFlag[property] || 0;
+		if (!window.ie || flag) return this.getAttribute(property, flag);
+		var node = this.attributes[property];
+		return (node) ? node.nodeValue : null;
+	},
+
+	/*
+	Property: removeProperty
+		Removes an attribute from the Element
+
+	Arguments:
+		property - string; the attribute to remove
+	*/
+
+	removeProperty: function(property){
+		var index = Element.Properties[property];
+		if (index) this[index] = '';
+		else this.removeAttribute(property);
+		return this;
+	},
+
+	/*
+	Property: getProperties
+		same as <Element.getStyles>, but for properties
+	*/
+
+	getProperties: function(){
+		return Element.getMany(this, 'getProperty', arguments);
+	},
+
+	/*
+	Property: setProperty
+		Sets an attribute for the Element.
+
+	Arguments:
+		property - string; the property to assign the value passed in
+		value - the value to assign to the property passed in
+
+	Example:
+		>$('myImage').setProperty('src', 'whatever.gif'); //myImage now points to whatever.gif for its source
+	*/
+
+	setProperty: function(property, value){
+		var index = Element.Properties[property];
+		if (index) this[index] = value;
+		else this.setAttribute(property, value);
+		return this;
+	},
+
+	/*
+	Property: setProperties
+		Sets numerous attributes for the Element.
+
+	Arguments:
+		source - an object with key/value pairs.
+
+	Example:
+		(start code)
+		$('myElement').setProperties({
+			src: 'whatever.gif',
+			alt: 'whatever dude'
+		});
+		<img src="whatever.gif" alt="whatever dude">
+		(end)
+	*/
+
+	setProperties: function(source){
+		return Element.setMany(this, 'setProperty', source);
+	},
+
+	/*
+	Property: setHTML
+		Sets the innerHTML of the Element.
+
+	Arguments:
+		html - string; the new innerHTML for the element.
+
+	Example:
+		>$('myElement').setHTML(newHTML) //the innerHTML of myElement is now = newHTML
+	*/
+
+	setHTML: function(){
+		this.innerHTML = $A(arguments).join('');
+		return this;
+	},
+
+	/*
+	Property: setText
+		Sets the inner text of the Element.
+
+	Arguments:
+		text - string; the new text content for the element.
+
+	Example:
+		>$('myElement').setText('some text') //the text of myElement is now = 'some text'
+	*/
+
+	setText: function(text){
+		var tag = this.getTag();
+		if (['style', 'script'].contains(tag)){
+			if (window.ie){
+				if (tag == 'style') this.styleSheet.cssText = text;
+				else if (tag ==  'script') this.setProperty('text', text);
+				return this;
+			} else {
+				this.removeChild(this.firstChild);
+				return this.appendText(text);
+			}
+		}
+		this[$defined(this.innerText) ? 'innerText' : 'textContent'] = text;
+		return this;
+	},
+
+	/*
+	Property: getText
+		Gets the inner text of the Element.
+	*/
+
+	getText: function(){
+		var tag = this.getTag();
+		if (['style', 'script'].contains(tag)){
+			if (window.ie){
+				if (tag == 'style') return this.styleSheet.cssText;
+				else if (tag ==  'script') return this.getProperty('text');
+			} else {
+				return this.innerHTML;
+			}
+		}
+		return ($pick(this.innerText, this.textContent));
+	},
+
+	/*
+	Property: getTag
+		Returns the tagName of the element in lower case.
+
+	Example:
+		>$('myImage').getTag() // returns 'img'
+
+	Returns:
+		The tag name in lower case
+	*/
+
+	getTag: function(){
+		return this.tagName.toLowerCase();
+	},
+
+	/*
+	Property: empty
+		Empties an element of all its children.
+
+	Example:
+		>$('myDiv').empty() // empties the Div and returns it
+
+	Returns:
+		The element.
+	*/
+
+	empty: function(){
+		Garbage.trash(this.getElementsByTagName('*'));
+		return this.setHTML('');
+	}
+
+});
+
+Element.fixStyle = function(property, result, element){
+	if ($chk(parseInt(result))) return result;
+	if (['height', 'width'].contains(property)){
+		var values = (property == 'width') ? ['left', 'right'] : ['top', 'bottom'];
+		var size = 0;
+		values.each(function(value){
+			size += element.getStyle('border-' + value + '-width').toInt() + element.getStyle('padding-' + value).toInt();
+		});
+		return element['offset' + property.capitalize()] - size + 'px';
+	} else if (property.test(/border(.+)Width|margin|padding/)){
+		return '0px';
+	}
+	return result;
+};
+
+Element.Styles = {'border': [], 'padding': [], 'margin': []};
+['Top', 'Right', 'Bottom', 'Left'].each(function(direction){
+	for (var style in Element.Styles) Element.Styles[style].push(style + direction);
+});
+
+Element.borderShort = ['borderWidth', 'borderStyle', 'borderColor'];
+
+Element.getMany = function(el, method, keys){
+	var result = {};
+	$each(keys, function(key){
+		result[key] = el[method](key);
+	});
+	return result;
+};
+
+Element.setMany = function(el, method, pairs){
+	for (var key in pairs) el[method](key, pairs[key]);
+	return el;
+};
+
+Element.Properties = new Abstract({
+	'class': 'className', 'for': 'htmlFor', 'colspan': 'colSpan', 'rowspan': 'rowSpan',
+	'accesskey': 'accessKey', 'tabindex': 'tabIndex', 'maxlength': 'maxLength',
+	'readonly': 'readOnly', 'frameborder': 'frameBorder', 'value': 'value',
+	'disabled': 'disabled', 'checked': 'checked', 'multiple': 'multiple', 'selected': 'selected'
+});
+Element.PropertiesIFlag = {
+	'href': 2, 'src': 2
+};
+
+Element.Methods = {
+	Listeners: {
+		addListener: function(type, fn){
+			if (this.addEventListener) this.addEventListener(type, fn, false);
+			else this.attachEvent('on' + type, fn);
+			return this;
+		},
+
+		removeListener: function(type, fn){
+			if (this.removeEventListener) this.removeEventListener(type, fn, false);
+			else this.detachEvent('on' + type, fn);
+			return this;
+		}
+	}
+};
+
+window.extend(Element.Methods.Listeners);
+document.extend(Element.Methods.Listeners);
+Element.extend(Element.Methods.Listeners);
+
+var Garbage = {
+
+	elements: [],
+
+	collect: function(el){
+		if (!el.$tmp){
+			Garbage.elements.push(el);
+			el.$tmp = {'opacity': 1};
+		}
+		return el;
+	},
+
+	trash: function(elements){
+		for (var i = 0, j = elements.length, el; i < j; i++){
+			if (!(el = elements[i]) || !el.$tmp) continue;
+			if (el.$events) el.fireEvent('trash').removeEvents();
+			for (var p in el.$tmp) el.$tmp[p] = null;
+			for (var d in Element.prototype) el[d] = null;
+			Garbage.elements[Garbage.elements.indexOf(el)] = null;
+			el.htmlElement = el.$tmp = el = null;
+		}
+		Garbage.elements.remove(null);
+	},
+
+	empty: function(){
+		Garbage.collect(window);
+		Garbage.collect(document);
+		Garbage.trash(Garbage.elements);
+	}
+
+};
+
+window.addListener('beforeunload', function(){
+	window.addListener('unload', Garbage.empty);
+	if (window.ie) window.addListener('unload', CollectGarbage);
+});
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/draw2d/wz_jsgraphics.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/draw2d/wz_jsgraphics.js
new file mode 100644
index 0000000..8567905
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/draw2d/wz_jsgraphics.js
@@ -0,0 +1,1108 @@
+/* This notice must be untouched at all times.
+
+wz_jsgraphics.js    v. 3.05
+The latest version is available at
+http://www.walterzorn.com
+or http://www.devira.com
+or http://www.walterzorn.de
+
+Copyright (c) 2002-2009 Walter Zorn. All rights reserved.
+Created 3. 11. 2002 by Walter Zorn (Web: http://www.walterzorn.com )
+Last modified: 2. 2. 2009
+
+Performance optimizations for Internet Explorer
+by Thomas Frank and John Holdsworth.
+fillPolygon method implemented by Matthieu Haller.
+
+High Performance JavaScript Graphics Library.
+Provides methods
+- to draw lines, rectangles, ellipses, polygons
+	with specifiable line thickness,
+- to fill rectangles, polygons, ellipses and arcs
+- to draw text.
+NOTE: Operations, functions and branching have rather been optimized
+to efficiency and speed than to shortness of source code.
+
+LICENSE: LGPL
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License (LGPL) as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA,
+or see http://www.gnu.org/copyleft/lesser.html
+*/
+
+
+var jg_ok, jg_ie, jg_fast, jg_dom, jg_moz;
+
+
+function _chkDHTM(wnd, x, i)
+// Under XUL, owner of 'document' must be specified explicitly
+{
+	x = wnd.document.body || null;
+	jg_ie = x && typeof x.insertAdjacentHTML != "undefined" && wnd.document.createElement;
+	jg_dom = (x && !jg_ie &&
+		typeof x.appendChild != "undefined" &&
+		typeof wnd.document.createRange != "undefined" &&
+		typeof (i = wnd.document.createRange()).setStartBefore != "undefined" &&
+		typeof i.createContextualFragment != "undefined");
+	jg_fast = jg_ie && wnd.document.all && !wnd.opera;
+	jg_moz = jg_dom && typeof x.style.MozOpacity != "undefined";
+	jg_ok = !!(jg_ie || jg_dom);
+};
+
+function _pntCnvDom()
+{
+	var x = this.wnd.document.createRange();
+	x.setStartBefore(this.cnv);
+	x = x.createContextualFragment(jg_fast? this._htmRpc() : this.htm);
+	if(this.cnv) this.cnv.appendChild(x);
+	this.htm = "";
+};
+
+function _pntCnvIe()
+{
+	if(this.cnv) this.cnv.insertAdjacentHTML("BeforeEnd", jg_fast? this._htmRpc() : this.htm);
+	this.htm = "";
+};
+
+function _pntDoc()
+{
+	this.wnd.document.write(jg_fast? this._htmRpc() : this.htm);
+	this.htm = '';
+};
+
+function _pntN()
+{
+	;
+};
+
+function _mkDiv(x, y, w, h)
+{
+	this.htm += '<div style="position:absolute;'+
+		'left:' + x + 'px;'+
+		'top:' + y + 'px;'+
+		'width:' + w + 'px;'+
+		'height:' + h + 'px;'+
+		'clip:rect(0,'+w+'px,'+h+'px,0);'+
+		'background-color:' + this.color +
+		(!jg_moz? ';overflow:hidden' : '')+
+		';"><\/div>';
+};
+
+function _mkDivIe(x, y, w, h)
+{
+	this.htm += '%%'+this.color+';'+x+';'+y+';'+w+';'+h+';';
+};
+
+function _mkDivPrt(x, y, w, h)
+{
+	this.htm += '<div style="position:absolute;'+
+		'border-left:' + w + 'px solid ' + this.color + ';'+
+		'left:' + x + 'px;'+
+		'top:' + y + 'px;'+
+		'width:0px;'+
+		'height:' + h + 'px;'+
+		'clip:rect(0,'+w+'px,'+h+'px,0);'+
+		'background-color:' + this.color +
+		(!jg_moz? ';overflow:hidden' : '')+
+		';"><\/div>';
+};
+
+var _regex =  /%%([^;]+);([^;]+);([^;]+);([^;]+);([^;]+);/g;
+function _htmRpc()
+{
+	return this.htm.replace(
+		_regex,
+		'<div style="overflow:hidden;position:absolute;background-color:'+
+		'$1;left:$2px;top:$3px;width:$4px;height:$5px"></div>\n');
+};
+
+function _htmPrtRpc()
+{
+	return this.htm.replace(
+		_regex,
+		'<div style="overflow:hidden;position:absolute;background-color:'+
+		'$1;left:$2px;top:$3px;width:$4px;height:$5px;border-left:$4px solid $1"></div>\n');
+};
+
+function _mkLin(x1, y1, x2, y2)
+{
+	if(x1 > x2)
+	{
+		var _x2 = x2;
+		var _y2 = y2;
+		x2 = x1;
+		y2 = y1;
+		x1 = _x2;
+		y1 = _y2;
+	}
+	var dx = x2-x1, dy = Math.abs(y2-y1),
+	x = x1, y = y1,
+	yIncr = (y1 > y2)? -1 : 1;
+
+	if(dx >= dy)
+	{
+		var pr = dy<<1,
+		pru = pr - (dx<<1),
+		p = pr-dx,
+		ox = x;
+		while(dx > 0)
+		{--dx;
+			++x;
+			if(p > 0)
+			{
+				this._mkDiv(ox, y, x-ox, 1);
+				y += yIncr;
+				p += pru;
+				ox = x;
+			}
+			else p += pr;
+		}
+		this._mkDiv(ox, y, x2-ox+1, 1);
+	}
+
+	else
+	{
+		var pr = dx<<1,
+		pru = pr - (dy<<1),
+		p = pr-dy,
+		oy = y;
+		if(y2 <= y1)
+		{
+			while(dy > 0)
+			{--dy;
+				if(p > 0)
+				{
+					this._mkDiv(x++, y, 1, oy-y+1);
+					y += yIncr;
+					p += pru;
+					oy = y;
+				}
+				else
+				{
+					y += yIncr;
+					p += pr;
+				}
+			}
+			this._mkDiv(x2, y2, 1, oy-y2+1);
+		}
+		else
+		{
+			while(dy > 0)
+			{--dy;
+				y += yIncr;
+				if(p > 0)
+				{
+					this._mkDiv(x++, oy, 1, y-oy);
+					p += pru;
+					oy = y;
+				}
+				else p += pr;
+			}
+			this._mkDiv(x2, oy, 1, y2-oy+1);
+		}
+	}
+};
+
+function _mkLin2D(x1, y1, x2, y2)
+{
+	if(x1 > x2)
+	{
+		var _x2 = x2;
+		var _y2 = y2;
+		x2 = x1;
+		y2 = y1;
+		x1 = _x2;
+		y1 = _y2;
+	}
+	var dx = x2-x1, dy = Math.abs(y2-y1),
+	x = x1, y = y1,
+	yIncr = (y1 > y2)? -1 : 1;
+
+	var s = this.stroke;
+	if(dx >= dy)
+	{
+		if(dx > 0 && s-3 > 0)
+		{
+			var _s = (s*dx*Math.sqrt(1+dy*dy/(dx*dx))-dx-(s>>1)*dy) / dx;
+			_s = (!(s-4)? Math.ceil(_s) : Math.round(_s)) + 1;
+		}
+		else var _s = s;
+		var ad = Math.ceil(s/2);
+
+		var pr = dy<<1,
+		pru = pr - (dx<<1),
+		p = pr-dx,
+		ox = x;
+		while(dx > 0)
+		{--dx;
+			++x;
+			if(p > 0)
+			{
+				this._mkDiv(ox, y, x-ox+ad, _s);
+				y += yIncr;
+				p += pru;
+				ox = x;
+			}
+			else p += pr;
+		}
+		this._mkDiv(ox, y, x2-ox+ad+1, _s);
+	}
+
+	else
+	{
+		if(s-3 > 0)
+		{
+			var _s = (s*dy*Math.sqrt(1+dx*dx/(dy*dy))-(s>>1)*dx-dy) / dy;
+			_s = (!(s-4)? Math.ceil(_s) : Math.round(_s)) + 1;
+		}
+		else var _s = s;
+		var ad = Math.round(s/2);
+
+		var pr = dx<<1,
+		pru = pr - (dy<<1),
+		p = pr-dy,
+		oy = y;
+		if(y2 <= y1)
+		{
+			++ad;
+			while(dy > 0)
+			{--dy;
+				if(p > 0)
+				{
+					this._mkDiv(x++, y, _s, oy-y+ad);
+					y += yIncr;
+					p += pru;
+					oy = y;
+				}
+				else
+				{
+					y += yIncr;
+					p += pr;
+				}
+			}
+			this._mkDiv(x2, y2, _s, oy-y2+ad);
+		}
+		else
+		{
+			while(dy > 0)
+			{--dy;
+				y += yIncr;
+				if(p > 0)
+				{
+					this._mkDiv(x++, oy, _s, y-oy+ad);
+					p += pru;
+					oy = y;
+				}
+				else p += pr;
+			}
+			this._mkDiv(x2, oy, _s, y2-oy+ad+1);
+		}
+	}
+};
+
+function _mkLinDott(x1, y1, x2, y2)
+{
+	if(x1 > x2)
+	{
+		var _x2 = x2;
+		var _y2 = y2;
+		x2 = x1;
+		y2 = y1;
+		x1 = _x2;
+		y1 = _y2;
+	}
+	var dx = x2-x1, dy = Math.abs(y2-y1),
+	x = x1, y = y1,
+	yIncr = (y1 > y2)? -1 : 1,
+	drw = true;
+	if(dx >= dy)
+	{
+		var pr = dy<<1,
+		pru = pr - (dx<<1),
+		p = pr-dx;
+		while(dx > 0)
+		{--dx;
+			if(drw) this._mkDiv(x, y, 1, 1);
+			drw = !drw;
+			if(p > 0)
+			{
+				y += yIncr;
+				p += pru;
+			}
+			else p += pr;
+			++x;
+		}
+	}
+	else
+	{
+		var pr = dx<<1,
+		pru = pr - (dy<<1),
+		p = pr-dy;
+		while(dy > 0)
+		{--dy;
+			if(drw) this._mkDiv(x, y, 1, 1);
+			drw = !drw;
+			y += yIncr;
+			if(p > 0)
+			{
+				++x;
+				p += pru;
+			}
+			else p += pr;
+		}
+	}
+	if(drw) this._mkDiv(x, y, 1, 1);
+};
+
+function _mkOv(left, top, width, height)
+{
+	var a = (++width)>>1, b = (++height)>>1,
+	wod = width&1, hod = height&1,
+	cx = left+a, cy = top+b,
+	x = 0, y = b,
+	ox = 0, oy = b,
+	aa2 = (a*a)<<1, aa4 = aa2<<1, bb2 = (b*b)<<1, bb4 = bb2<<1,
+	st = (aa2>>1)*(1-(b<<1)) + bb2,
+	tt = (bb2>>1) - aa2*((b<<1)-1),
+	w, h;
+	while(y > 0)
+	{
+		if(st < 0)
+		{
+			st += bb2*((x<<1)+3);
+			tt += bb4*(++x);
+		}
+		else if(tt < 0)
+		{
+			st += bb2*((x<<1)+3) - aa4*(y-1);
+			tt += bb4*(++x) - aa2*(((y--)<<1)-3);
+			w = x-ox;
+			h = oy-y;
+			if((w&2) && (h&2))
+			{
+				this._mkOvQds(cx, cy, x-2, y+2, 1, 1, wod, hod);
+				this._mkOvQds(cx, cy, x-1, y+1, 1, 1, wod, hod);
+			}
+			else this._mkOvQds(cx, cy, x-1, oy, w, h, wod, hod);
+			ox = x;
+			oy = y;
+		}
+		else
+		{
+			tt -= aa2*((y<<1)-3);
+			st -= aa4*(--y);
+		}
+	}
+	w = a-ox+1;
+	h = (oy<<1)+hod;
+	y = cy-oy;
+	this._mkDiv(cx-a, y, w, h);
+	this._mkDiv(cx+ox+wod-1, y, w, h);
+};
+
+function _mkOv2D(left, top, width, height)
+{
+	var s = this.stroke;
+	width += s+1;
+	height += s+1;
+	var a = width>>1, b = height>>1,
+	wod = width&1, hod = height&1,
+	cx = left+a, cy = top+b,
+	x = 0, y = b,
+	aa2 = (a*a)<<1, aa4 = aa2<<1, bb2 = (b*b)<<1, bb4 = bb2<<1,
+	st = (aa2>>1)*(1-(b<<1)) + bb2,
+	tt = (bb2>>1) - aa2*((b<<1)-1);
+
+	if(s-4 < 0 && (!(s-2) || width-51 > 0 && height-51 > 0))
+	{
+		var ox = 0, oy = b,
+		w, h,
+		pxw;
+		while(y > 0)
+		{
+			if(st < 0)
+			{
+				st += bb2*((x<<1)+3);
+				tt += bb4*(++x);
+			}
+			else if(tt < 0)
+			{
+				st += bb2*((x<<1)+3) - aa4*(y-1);
+				tt += bb4*(++x) - aa2*(((y--)<<1)-3);
+				w = x-ox;
+				h = oy-y;
+
+				if(w-1)
+				{
+					pxw = w+1+(s&1);
+					h = s;
+				}
+				else if(h-1)
+				{
+					pxw = s;
+					h += 1+(s&1);
+				}
+				else pxw = h = s;
+				this._mkOvQds(cx, cy, x-1, oy, pxw, h, wod, hod);
+				ox = x;
+				oy = y;
+			}
+			else
+			{
+				tt -= aa2*((y<<1)-3);
+				st -= aa4*(--y);
+			}
+		}
+		this._mkDiv(cx-a, cy-oy, s, (oy<<1)+hod);
+		this._mkDiv(cx+a+wod-s, cy-oy, s, (oy<<1)+hod);
+	}
+
+	else
+	{
+		var _a = (width-(s<<1))>>1,
+		_b = (height-(s<<1))>>1,
+		_x = 0, _y = _b,
+		_aa2 = (_a*_a)<<1, _aa4 = _aa2<<1, _bb2 = (_b*_b)<<1, _bb4 = _bb2<<1,
+		_st = (_aa2>>1)*(1-(_b<<1)) + _bb2,
+		_tt = (_bb2>>1) - _aa2*((_b<<1)-1),
+
+		pxl = new Array(),
+		pxt = new Array(),
+		_pxb = [];
+		pxl[0] = 0;
+		pxt[0] = b;
+		_pxb[0] = _b-1;
+		while(y > 0)
+		{
+			if(st < 0)
+			{
+				pxl[pxl.length] = x;
+				pxt[pxt.length] = y;
+				st += bb2*((x<<1)+3);
+				tt += bb4*(++x);
+			}
+			else if(tt < 0)
+			{
+				pxl[pxl.length] = x;
+				st += bb2*((x<<1)+3) - aa4*(y-1);
+				tt += bb4*(++x) - aa2*(((y--)<<1)-3);
+				pxt[pxt.length] = y;
+			}
+			else
+			{
+				tt -= aa2*((y<<1)-3);
+				st -= aa4*(--y);
+			}
+
+			if(_y > 0)
+			{
+				if(_st < 0)
+				{
+					_st += _bb2*((_x<<1)+3);
+					_tt += _bb4*(++_x);
+					_pxb[_pxb.length] = _y-1;
+				}
+				else if(_tt < 0)
+				{
+					_st += _bb2*((_x<<1)+3) - _aa4*(_y-1);
+					_tt += _bb4*(++_x) - _aa2*(((_y--)<<1)-3);
+					_pxb[_pxb.length] = _y-1;
+				}
+				else
+				{
+					_tt -= _aa2*((_y<<1)-3);
+					_st -= _aa4*(--_y);
+					_pxb[_pxb.length-1]--;
+				}
+			}
+		}
+
+		var ox = -wod, oy = b,
+		_oy = _pxb[0],
+		l = pxl.length,
+		w, h;
+		for(var i = 0; i < l; i++)
+		{
+			if(typeof _pxb[i] != "undefined")
+			{
+				if(_pxb[i] < _oy || pxt[i] < oy)
+				{
+					x = pxl[i];
+					this._mkOvQds(cx, cy, x, oy, x-ox, oy-_oy, wod, hod);
+					ox = x;
+					oy = pxt[i];
+					_oy = _pxb[i];
+				}
+			}
+			else
+			{
+				x = pxl[i];
+				this._mkDiv(cx-x, cy-oy, 1, (oy<<1)+hod);
+				this._mkDiv(cx+ox+wod, cy-oy, 1, (oy<<1)+hod);
+				ox = x;
+				oy = pxt[i];
+			}
+		}
+		this._mkDiv(cx-a, cy-oy, 1, (oy<<1)+hod);
+		this._mkDiv(cx+ox+wod, cy-oy, 1, (oy<<1)+hod);
+	}
+};
+
+function _mkOvDott(left, top, width, height)
+{
+	var a = (++width)>>1, b = (++height)>>1,
+	wod = width&1, hod = height&1, hodu = hod^1,
+	cx = left+a, cy = top+b,
+	x = 0, y = b,
+	aa2 = (a*a)<<1, aa4 = aa2<<1, bb2 = (b*b)<<1, bb4 = bb2<<1,
+	st = (aa2>>1)*(1-(b<<1)) + bb2,
+	tt = (bb2>>1) - aa2*((b<<1)-1),
+	drw = true;
+	while(y > 0)
+	{
+		if(st < 0)
+		{
+			st += bb2*((x<<1)+3);
+			tt += bb4*(++x);
+		}
+		else if(tt < 0)
+		{
+			st += bb2*((x<<1)+3) - aa4*(y-1);
+			tt += bb4*(++x) - aa2*(((y--)<<1)-3);
+		}
+		else
+		{
+			tt -= aa2*((y<<1)-3);
+			st -= aa4*(--y);
+		}
+		if(drw && y >= hodu) this._mkOvQds(cx, cy, x, y, 1, 1, wod, hod);
+		drw = !drw;
+	}
+};
+
+function _mkRect(x, y, w, h)
+{
+	var s = this.stroke;
+	this._mkDiv(x, y, w, s);
+	this._mkDiv(x+w, y, s, h);
+	this._mkDiv(x, y+h, w+s, s);
+	this._mkDiv(x, y+s, s, h-s);
+};
+
+function _mkRectDott(x, y, w, h)
+{
+	this.drawLine(x, y, x+w, y);
+	this.drawLine(x+w, y, x+w, y+h);
+	this.drawLine(x, y+h, x+w, y+h);
+	this.drawLine(x, y, x, y+h);
+};
+
+function jsgFont()
+{
+	this.PLAIN = 'font-weight:normal;';
+	this.BOLD = 'font-weight:bold;';
+	this.ITALIC = 'font-style:italic;';
+	this.ITALIC_BOLD = this.ITALIC + this.BOLD;
+	this.BOLD_ITALIC = this.ITALIC_BOLD;
+};
+var Font = new jsgFont();
+
+function jsgStroke()
+{
+	this.DOTTED = -1;
+};
+var Stroke = new jsgStroke();
+
+function jsGraphics(cnv, wnd)
+{
+	this.setColor = function(x)
+	{
+		this.color = x.toLowerCase();
+	};
+
+	this.setStroke = function(x)
+	{
+		this.stroke = x;
+		if(!(x+1))
+		{
+			this.drawLine = _mkLinDott;
+			this._mkOv = _mkOvDott;
+			this.drawRect = _mkRectDott;
+		}
+		else if(x-1 > 0)
+		{
+			this.drawLine = _mkLin2D;
+			this._mkOv = _mkOv2D;
+			this.drawRect = _mkRect;
+		}
+		else
+		{
+			this.drawLine = _mkLin;
+			this._mkOv = _mkOv;
+			this.drawRect = _mkRect;
+		}
+	};
+
+	this.setPrintable = function(arg)
+	{
+		this.printable = arg;
+		if(jg_fast)
+		{
+			this._mkDiv = _mkDivIe;
+			this._htmRpc = arg? _htmPrtRpc : _htmRpc;
+		}
+		else this._mkDiv = arg? _mkDivPrt : _mkDiv;
+	};
+
+	this.setFont = function(fam, sz, sty)
+	{
+		this.ftFam = fam;
+		this.ftSz = sz;
+		this.ftSty = sty || Font.PLAIN;
+	};
+
+	this.drawPolyline = this.drawPolyLine = function(x, y)
+	{
+		for (var i=x.length - 1; i;)
+		{--i;
+			this.drawLine(x[i], y[i], x[i+1], y[i+1]);
+		}
+	};
+
+	this.fillRect = function(x, y, w, h)
+	{
+		this._mkDiv(x, y, w, h);
+	};
+
+	this.drawPolygon = function(x, y)
+	{
+		this.drawPolyline(x, y);
+		this.drawLine(x[x.length-1], y[x.length-1], x[0], y[0]);
+	};
+
+	this.drawEllipse = this.drawOval = function(x, y, w, h)
+	{
+		this._mkOv(x, y, w, h);
+	};
+
+	this.fillEllipse = this.fillOval = function(left, top, w, h)
+	{
+		var a = w>>1, b = h>>1,
+		wod = w&1, hod = h&1,
+		cx = left+a, cy = top+b,
+		x = 0, y = b, oy = b,
+		aa2 = (a*a)<<1, aa4 = aa2<<1, bb2 = (b*b)<<1, bb4 = bb2<<1,
+		st = (aa2>>1)*(1-(b<<1)) + bb2,
+		tt = (bb2>>1) - aa2*((b<<1)-1),
+		xl, dw, dh;
+		if(w) while(y > 0)
+		{
+			if(st < 0)
+			{
+				st += bb2*((x<<1)+3);
+				tt += bb4*(++x);
+			}
+			else if(tt < 0)
+			{
+				st += bb2*((x<<1)+3) - aa4*(y-1);
+				xl = cx-x;
+				dw = (x<<1)+wod;
+				tt += bb4*(++x) - aa2*(((y--)<<1)-3);
+				dh = oy-y;
+				this._mkDiv(xl, cy-oy, dw, dh);
+				this._mkDiv(xl, cy+y+hod, dw, dh);
+				oy = y;
+			}
+			else
+			{
+				tt -= aa2*((y<<1)-3);
+				st -= aa4*(--y);
+			}
+		}
+		this._mkDiv(cx-a, cy-oy, w, (oy<<1)+hod);
+	};
+
+	this.fillArc = function(iL, iT, iW, iH, fAngA, fAngZ)
+	{
+		var a = iW>>1, b = iH>>1,
+		iOdds = (iW&1) | ((iH&1) << 16),
+		cx = iL+a, cy = iT+b,
+		x = 0, y = b, ox = x, oy = y,
+		aa2 = (a*a)<<1, aa4 = aa2<<1, bb2 = (b*b)<<1, bb4 = bb2<<1,
+		st = (aa2>>1)*(1-(b<<1)) + bb2,
+		tt = (bb2>>1) - aa2*((b<<1)-1),
+		// Vars for radial boundary lines
+		xEndA, yEndA, xEndZ, yEndZ,
+		iSects = (1 << (Math.floor((fAngA %= 360.0)/180.0) << 3))
+				| (2 << (Math.floor((fAngZ %= 360.0)/180.0) << 3))
+				| ((fAngA >= fAngZ) << 16),
+		aBndA = new Array(b+1), aBndZ = new Array(b+1);
+		
+		// Set up radial boundary lines
+		fAngA *= Math.PI/180.0;
+		fAngZ *= Math.PI/180.0;
+		xEndA = cx+Math.round(a*Math.cos(fAngA));
+		yEndA = cy+Math.round(-b*Math.sin(fAngA));
+		_mkLinVirt(aBndA, cx, cy, xEndA, yEndA);
+		xEndZ = cx+Math.round(a*Math.cos(fAngZ));
+		yEndZ = cy+Math.round(-b*Math.sin(fAngZ));
+		_mkLinVirt(aBndZ, cx, cy, xEndZ, yEndZ);
+
+		while(y > 0)
+		{
+			if(st < 0) // Advance x
+			{
+				st += bb2*((x<<1)+3);
+				tt += bb4*(++x);
+			}
+			else if(tt < 0) // Advance x and y
+			{
+				st += bb2*((x<<1)+3) - aa4*(y-1);
+				ox = x;
+				tt += bb4*(++x) - aa2*(((y--)<<1)-3);
+				this._mkArcDiv(ox, y, oy, cx, cy, iOdds, aBndA, aBndZ, iSects);
+				oy = y;
+			}
+			else // Advance y
+			{
+				tt -= aa2*((y<<1)-3);
+				st -= aa4*(--y);
+				if(y && (aBndA[y] != aBndA[y-1] || aBndZ[y] != aBndZ[y-1]))
+				{
+					this._mkArcDiv(x, y, oy, cx, cy, iOdds, aBndA, aBndZ, iSects);
+					ox = x;
+					oy = y;
+				}
+			}
+		}
+		this._mkArcDiv(x, 0, oy, cx, cy, iOdds, aBndA, aBndZ, iSects);
+		if(iOdds >> 16) // Odd height
+		{
+			if(iSects >> 16) // Start-angle > end-angle
+			{
+				var xl = (yEndA <= cy || yEndZ > cy)? (cx - x) : cx;
+				this._mkDiv(xl, cy, x + cx - xl + (iOdds & 0xffff), 1);
+			}
+			else if((iSects & 0x01) && yEndZ > cy)
+				this._mkDiv(cx - x, cy, x, 1);
+		}
+	};
+
+/* fillPolygon method, implemented by Matthieu Haller.
+This javascript function is an adaptation of the gdImageFilledPolygon for Walter Zorn lib.
+C source of GD 1.8.4 found at http://www.boutell.com/gd/
+
+THANKS to Kirsten Schulz for the polygon fixes!
+
+The intersection finding technique of this code could be improved
+by remembering the previous intertersection, and by using the slope.
+That could help to adjust intersections to produce a nice
+interior_extrema. */
+	this.fillPolygon = function(array_x, array_y)
+	{
+		var i;
+		var y;
+		var miny, maxy;
+		var x1, y1;
+		var x2, y2;
+		var ind1, ind2;
+		var ints;
+
+		var n = array_x.length;
+		if(!n) return;
+
+		miny = array_y[0];
+		maxy = array_y[0];
+		for(i = 1; i < n; i++)
+		{
+			if(array_y[i] < miny)
+				miny = array_y[i];
+
+			if(array_y[i] > maxy)
+				maxy = array_y[i];
+		}
+		for(y = miny; y <= maxy; y++)
+		{
+			var polyInts = [];
+			ints = 0;
+			for(i = 0; i < n; i++)
+			{
+				if(!i)
+				{
+					ind1 = n-1;
+					ind2 = 0;
+				}
+				else
+				{
+					ind1 = i-1;
+					ind2 = i;
+				}
+				y1 = array_y[ind1];
+				y2 = array_y[ind2];
+				if(y1 < y2)
+				{
+					x1 = array_x[ind1];
+					x2 = array_x[ind2];
+				}
+				else if(y1 > y2)
+				{
+					y2 = array_y[ind1];
+					y1 = array_y[ind2];
+					x2 = array_x[ind1];
+					x1 = array_x[ind2];
+				}
+				else continue;
+
+				 //  Modified 11. 2. 2004 Walter Zorn
+				if((y >= y1) && (y < y2))
+					polyInts[ints++] = Math.round((y-y1) * (x2-x1) / (y2-y1) + x1);
+
+				else if((y == maxy) && (y > y1) && (y <= y2))
+					polyInts[ints++] = Math.round((y-y1) * (x2-x1) / (y2-y1) + x1);
+			}
+			polyInts.sort(_CompInt);
+			for(i = 0; i < ints; i+=2)
+				this._mkDiv(polyInts[i], y, polyInts[i+1]-polyInts[i]+1, 1);
+		}
+	};
+
+	this.drawString = function(txt, x, y)
+	{
+		this.htm += '<div style="position:absolute;white-space:nowrap;'+
+			'left:' + x + 'px;'+
+			'top:' + y + 'px;'+
+			'font-family:' +  this.ftFam + ';'+
+			'font-size:' + this.ftSz + ';'+
+			'color:' + this.color + ';' + this.ftSty + '">'+
+			txt +
+			'<\/div>';
+	};
+
+/* drawStringRect() added by Rick Blommers.
+Allows to specify the size of the text rectangle and to align the
+text both horizontally (e.g. right) and vertically within that rectangle */
+	this.drawStringRect = function(txt, x, y, width, halign)
+	{
+		this.htm += '<div style="position:absolute;overflow:hidden;'+
+			'left:' + x + 'px;'+
+			'top:' + y + 'px;'+
+			'width:'+width +'px;'+
+			'text-align:'+halign+';'+
+			'font-family:' +  this.ftFam + ';'+
+			'font-size:' + this.ftSz + ';'+
+			'color:' + this.color + ';' + this.ftSty + '">'+
+			txt +
+			'<\/div>';
+	};
+
+	this.drawImage = function(imgSrc, x, y, w, h, a)
+	{
+		this.htm += '<div style="position:absolute;'+
+			'left:' + x + 'px;'+
+			'top:' + y + 'px;'+
+			// w (width) and h (height) arguments are now optional.
+			// Added by Mahmut Keygubatli, 14.1.2008
+			(w? ('width:' +  w + 'px;') : '') +
+			(h? ('height:' + h + 'px;'):'')+'">'+
+			'<img src="' + imgSrc +'"'+ (w ? (' width="' + w + '"'):'')+ (h ? (' height="' + h + '"'):'') + (a? (' '+a) : '') + '>'+
+			'<\/div>';
+	};
+
+	this.clear = function()
+	{
+		this.htm = "";
+		if(this.cnv) this.cnv.innerHTML = "";
+	};
+
+	this._mkOvQds = function(cx, cy, x, y, w, h, wod, hod)
+	{
+		var xl = cx - x, xr = cx + x + wod - w, yt = cy - y, yb = cy + y + hod - h;
+		if(xr > xl+w)
+		{
+			this._mkDiv(xr, yt, w, h);
+			this._mkDiv(xr, yb, w, h);
+		}
+		else
+			w = xr - xl + w;
+		this._mkDiv(xl, yt, w, h);
+		this._mkDiv(xl, yb, w, h);
+	};
+	
+	this._mkArcDiv = function(x, y, oy, cx, cy, iOdds, aBndA, aBndZ, iSects)
+	{
+		var xrDef = cx + x + (iOdds & 0xffff), y2, h = oy - y, xl, xr, w;
+
+		if(!h) h = 1;
+		x = cx - x;
+
+		if(iSects & 0xff0000) // Start-angle > end-angle
+		{
+			y2 = cy - y - h;
+			if(iSects & 0x00ff)
+			{
+				if(iSects & 0x02)
+				{
+					xl = Math.max(x, aBndZ[y]);
+					w = xrDef - xl;
+					if(w > 0) this._mkDiv(xl, y2, w, h);
+				}
+				if(iSects & 0x01)
+				{
+					xr = Math.min(xrDef, aBndA[y]);
+					w = xr - x;
+					if(w > 0) this._mkDiv(x, y2, w, h);
+				}
+			}
+			else
+				this._mkDiv(x, y2, xrDef - x, h);
+			y2 = cy + y + (iOdds >> 16);
+			if(iSects & 0xff00)
+			{
+				if(iSects & 0x0100)
+				{
+					xl = Math.max(x, aBndA[y]);
+					w = xrDef - xl;
+					if(w > 0) this._mkDiv(xl, y2, w, h);
+				}
+				if(iSects & 0x0200)
+				{
+					xr = Math.min(xrDef, aBndZ[y]);
+					w = xr - x;
+					if(w > 0) this._mkDiv(x, y2, w, h);
+				}
+			}
+			else
+				this._mkDiv(x, y2, xrDef - x, h);
+		}
+		else
+		{
+			if(iSects & 0x00ff)
+			{
+				if(iSects & 0x02)
+					xl = Math.max(x, aBndZ[y]);
+				else
+					xl = x;
+				if(iSects & 0x01)
+					xr = Math.min(xrDef, aBndA[y]);
+				else
+					xr = xrDef;
+				y2 = cy - y - h;
+				w = xr - xl;
+				if(w > 0) this._mkDiv(xl, y2, w, h);
+			}
+			if(iSects & 0xff00)
+			{
+				if(iSects & 0x0100)
+					xl = Math.max(x, aBndA[y]);
+				else
+					xl = x;
+				if(iSects & 0x0200)
+					xr = Math.min(xrDef, aBndZ[y]);
+				else
+					xr = xrDef;
+				y2 = cy + y + (iOdds >> 16);
+				w = xr - xl;
+				if(w > 0) this._mkDiv(xl, y2, w, h);
+			}
+		}
+	};
+
+	this.setStroke(1);
+	this.setFont("verdana,geneva,helvetica,sans-serif", "12px", Font.PLAIN);
+	this.color = "#000000";
+	this.htm = "";
+	this.wnd = wnd || window;
+
+	if(!jg_ok) _chkDHTM(this.wnd);
+	if(jg_ok)
+	{
+		if(cnv)
+		{
+			if(typeof(cnv) == "string")
+				this.cont = document.all? (this.wnd.document.all[cnv] || null)
+					: document.getElementById? (this.wnd.document.getElementById(cnv) || null)
+					: null;
+			else if(cnv == window.document)
+				this.cont = document.getElementsByTagName("body")[0];
+			// If cnv is a direct reference to a canvas DOM node
+			// (option suggested by Andreas Luleich)
+			else this.cont = cnv;
+			// Create new canvas inside container DIV. Thus the drawing and clearing
+			// methods won't interfere with the container's inner html.
+			// Solution suggested by Vladimir.
+			this.cnv = this.wnd.document.createElement("div");
+			this.cnv.style.fontSize=0;
+			this.cont.appendChild(this.cnv);
+			this.paint = jg_dom? _pntCnvDom : _pntCnvIe;
+		}
+		else
+			this.paint = _pntDoc;
+	}
+	else
+		this.paint = _pntN;
+
+	this.setPrintable(false);
+};
+
+function _mkLinVirt(aLin, x1, y1, x2, y2)
+{
+	var dx = Math.abs(x2-x1), dy = Math.abs(y2-y1),
+	x = x1, y = y1,
+	xIncr = (x1 > x2)? -1 : 1,
+	yIncr = (y1 > y2)? -1 : 1,
+	p,
+	i = 0;
+	if(dx >= dy)
+	{
+		var pr = dy<<1,
+		pru = pr - (dx<<1);
+		p = pr-dx;
+		while(dx > 0)
+		{--dx;
+			if(p > 0)    //  Increment y
+			{
+				aLin[i++] = x;
+				y += yIncr;
+				p += pru;
+			}
+			else p += pr;
+			x += xIncr;
+		}
+	}
+	else
+	{
+		var pr = dx<<1,
+		pru = pr - (dy<<1);
+		p = pr-dy;
+		while(dy > 0)
+		{--dy;
+			y += yIncr;
+			aLin[i++] = x;
+			if(p > 0)    //  Increment x
+			{
+				x += xIncr;
+				p += pru;
+			}
+			else p += pr;
+		}
+	}
+	for(var len = aLin.length, i = len-i; i;)
+		aLin[len-(i--)] = x;
+};
+
+function _CompInt(x, y)
+{
+	return(x - y);
+};
+
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/activate.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/activate.gif
new file mode 100644
index 0000000..7b2e7ae
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/activate.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/assign.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/assign.gif
new file mode 100644
index 0000000..ef4eafa
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/assign.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/browseButton.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/browseButton.png
new file mode 100644
index 0000000..d0c2cda
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/browseButton.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/calendar.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/calendar.png
new file mode 100644
index 0000000..67f8939
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/calendar.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/cancel.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/cancel.png
new file mode 100644
index 0000000..a432b49
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/cancel.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/chart_bar_edit.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/chart_bar_edit.png
new file mode 100644
index 0000000..df64d97
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/chart_bar_edit.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/clock.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/clock.png
new file mode 100644
index 0000000..cd7f178
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/clock.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/deactivate.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/deactivate.gif
new file mode 100644
index 0000000..abc0a71
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/deactivate.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/delegate.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/delegate.gif
new file mode 100644
index 0000000..739e826
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/delegate.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/delete.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/delete.gif
new file mode 100644
index 0000000..ab868bf
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/delete.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/download.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/download.png
new file mode 100644
index 0000000..d1209ed
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/download.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/edit.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/edit.gif
new file mode 100644
index 0000000..b7c58a1
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/edit.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/edit_add.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/edit_add.png
new file mode 100644
index 0000000..e948508
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/edit_add.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/en_US.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/en_US.gif
new file mode 100644
index 0000000..df9ca85
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/en_US.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/fen.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/fen.gif
new file mode 100644
index 0000000..bfa6386
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/fen.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/fen2.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/fen2.gif
new file mode 100644
index 0000000..0c981c0
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/fen2.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/help.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/help.png
new file mode 100644
index 0000000..5c87017
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/help.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/homePage.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/homePage.png
new file mode 100644
index 0000000..3d26af5
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/homePage.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/hua.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/hua.gif
new file mode 100644
index 0000000..8ce4ba1
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/hua.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/hua2.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/hua2.gif
new file mode 100644
index 0000000..370d039
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/hua2.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/hui.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/hui.gif
new file mode 100644
index 0000000..d358844
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/hui.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/hui2.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/hui2.gif
new file mode 100644
index 0000000..7747b77
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/hui2.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/Thumbs.db b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/Thumbs.db
new file mode 100644
index 0000000..a011425
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/Thumbs.db
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/action.down.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/action.down.png
new file mode 100644
index 0000000..2c4e279
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/action.down.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/action.magnifier.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/action.magnifier.png
new file mode 100644
index 0000000..cf3d97f
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/action.magnifier.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/action.up.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/action.up.png
new file mode 100644
index 0000000..1ebb193
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/action.up.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/callactivity.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/callactivity.png
new file mode 100644
index 0000000..40c8f70
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/callactivity.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/defaultCustomServiceTask.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/defaultCustomServiceTask.png
new file mode 100644
index 0000000..9680afd
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/defaultCustomServiceTask.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/ereference.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/ereference.gif
new file mode 100644
index 0000000..5f42bf5
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/ereference.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/error.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/error.png
new file mode 100644
index 0000000..c6e5de6
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/error.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/errorCustomServiceTask.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/errorCustomServiceTask.png
new file mode 100644
index 0000000..1514d51
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/errorCustomServiceTask.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/palette.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/palette.png
new file mode 100644
index 0000000..def3d94
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/palette.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/process.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/process.gif
new file mode 100644
index 0000000..0faf8cc
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/process.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/properties.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/properties.gif
new file mode 100644
index 0000000..b6a3fd7
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/properties.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/timer.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/timer.png
new file mode 100644
index 0000000..c755723
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/timer.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/tree_folder_open.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/tree_folder_open.gif
new file mode 100644
index 0000000..56ba737
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/tree_folder_open.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.annotation.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.annotation.png
new file mode 100644
index 0000000..14718ca
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.annotation.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.business.rule.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.business.rule.png
new file mode 100644
index 0000000..5e02e6a
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.business.rule.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.endevent.none.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.endevent.none.png
new file mode 100644
index 0000000..a704a64
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.endevent.none.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.gateway.exclusive.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.gateway.exclusive.png
new file mode 100644
index 0000000..c845d13
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.gateway.exclusive.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.gateway.inclusive.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.gateway.inclusive.png
new file mode 100644
index 0000000..8575dd0
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.gateway.inclusive.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.gateway.parallel.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.gateway.parallel.png
new file mode 100644
index 0000000..1feb70a
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.gateway.parallel.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.loopmarker.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.loopmarker.png
new file mode 100644
index 0000000..d5c8e83
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.loopmarker.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.mail.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.mail.png
new file mode 100644
index 0000000..64b99ac
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.mail.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.manual.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.manual.png
new file mode 100644
index 0000000..f72bd12
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.manual.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.receive.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.receive.png
new file mode 100644
index 0000000..64b99ac
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.receive.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.script.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.script.png
new file mode 100644
index 0000000..ba63aec
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.script.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.send.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.send.png
new file mode 100644
index 0000000..802954d
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.send.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.service.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.service.png
new file mode 100644
index 0000000..2c21f0f
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.service.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.startevent.none.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.startevent.none.png
new file mode 100644
index 0000000..b2e4508
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.startevent.none.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.subprocess.collapsed.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.subprocess.collapsed.png
new file mode 100644
index 0000000..17dd040
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.subprocess.collapsed.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.subprocess.expanded.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.subprocess.expanded.png
new file mode 100644
index 0000000..17dd040
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.subprocess.expanded.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.user.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.user.png
new file mode 100644
index 0000000..6e16f1e
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/icons/type.user.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/join.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/join.gif
new file mode 100644
index 0000000..b3cceb3
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/join.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/lan.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/lan.gif
new file mode 100644
index 0000000..7c5e18d
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/lan.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/lan2.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/lan2.gif
new file mode 100644
index 0000000..22fe7d5
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/lan2.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/left_icon.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/left_icon.gif
new file mode 100644
index 0000000..4ee253c
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/left_icon.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/logout.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/logout.png
new file mode 100644
index 0000000..7ce82b4
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/logout.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/lv.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/lv.gif
new file mode 100644
index 0000000..9fce359
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/lv.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/lv2.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/lv2.gif
new file mode 100644
index 0000000..874ed31
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/lv2.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/menu.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/menu.png
new file mode 100644
index 0000000..2239d5e
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/menu.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/message.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/message.png
new file mode 100644
index 0000000..59717ec
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/message.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/modify.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/modify.png
new file mode 100644
index 0000000..5b8cc89
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/modify.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/ok.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/ok.png
new file mode 100644
index 0000000..5b0f6a6
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/ok.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/pages.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/pages.gif
new file mode 100644
index 0000000..4268f06
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/pages.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/paint.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/paint.png
new file mode 100644
index 0000000..bcfe401
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/paint.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/password_icon.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/password_icon.png
new file mode 100644
index 0000000..5656824
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/password_icon.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/permissions.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/permissions.gif
new file mode 100644
index 0000000..103b434
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/permissions.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/picture_go.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/picture_go.png
new file mode 100644
index 0000000..27c63c5
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/picture_go.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/right_icon.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/right_icon.gif
new file mode 100644
index 0000000..b62e25d
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/right_icon.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/role.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/role.gif
new file mode 100644
index 0000000..e422843
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/role.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/save.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/save.png
new file mode 100644
index 0000000..fd0048d
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/save.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/setPassword.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/setPassword.gif
new file mode 100644
index 0000000..c735f2e
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/setPassword.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/task.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/task.png
new file mode 100644
index 0000000..ad07d67
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/task.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/unchecked.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/unchecked.gif
new file mode 100644
index 0000000..06ecaba
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/unchecked.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/upload.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/upload.png
new file mode 100644
index 0000000..8644fcf
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/upload.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/user_icon.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/user_icon.png
new file mode 100644
index 0000000..dd30089
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/user_icon.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/validatebox_pointer.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/validatebox_pointer.gif
new file mode 100644
index 0000000..6a74491
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/validatebox_pointer.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/validatebox_warning.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/validatebox_warning.png
new file mode 100644
index 0000000..2b3d4f0
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/validatebox_warning.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/weather.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/weather.png
new file mode 100644
index 0000000..4985bba
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/weather.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/welcome.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/welcome.gif
new file mode 100644
index 0000000..b20cc78
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/welcome.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/zh_CN.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/zh_CN.gif
new file mode 100644
index 0000000..9f0f4f2
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/zh_CN.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/zoom.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/zoom.png
new file mode 100644
index 0000000..908612e
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/images/zoom.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/MyCanvas.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/MyCanvas.js
new file mode 100644
index 0000000..8524f8d
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/MyCanvas.js
@@ -0,0 +1,154 @@
+draw2d.MyCanvas=function(id){
+		draw2d.Workflow.call(this,id);
+		this.html.style.backgroundImage="";//remove default backgourd
+		this.html.className="MyCanvas";
+		this.disabled=false;
+		//this.processCategory=null;
+		this.processId=null;
+		this.processName=null;
+		this.process=new draw2d.Process();
+		//this.listeners=new draw2d.ArrayList();
+};
+draw2d.MyCanvas.prototype = new draw2d.Workflow();
+draw2d.MyCanvas.prototype.type = "MyCanvas";
+/*
+draw2d.MyCanvas.prototype.showConnectionLine=function(x1, y1, x2, y2){
+	var connectionLine = new draw2d.DecoratedConnection();
+	connectionLine.setStartPoint(x1, y1);
+	connectionLine.setEndPoint(x2, y2);
+	if (connectionLine.canvas === null) {
+		draw2d.Canvas.prototype.addFigure.call(this, connectionLine);
+	}
+};
+*/
+draw2d.MyCanvas.prototype.setDisabled = function(){
+	this.disabled = true;
+	return this.readOnly;
+};
+draw2d.MyCanvas.prototype.addFigure = function(figure, xPos, yPos){
+	var parent = this.getBestCompartmentFigure(xPos,yPos);
+	if(parent === null){
+		draw2d.Workflow.prototype.addFigure.call(this,figure, xPos, yPos);
+	}else{
+		this.getCommandStack().execute(new draw2d.CommandAdd(this,figure,xPos,yPos,parent));
+	}
+};
+draw2d.MyCanvas.prototype.addModel = function(figure, xPos, yPos){
+	var parent = this.getBestCompartmentFigure(xPos,yPos);
+	this.getCommandStack().execute(new draw2d.CommandAdd(this,figure,xPos,yPos,parent));
+};
+draw2d.MyCanvas.prototype.getContextMenu=function(){
+	if(this.readOnly)return null;
+	var menu =new draw2d.ContextMenu(100, 50);
+	var data = {workflow:this};
+	menu.appendMenuItem(new draw2d.ContextMenuItem("Properties", "properties-icon",data,function(x,y)
+	{
+		var data = this.getData();
+		var workflow = data.workflow;
+		var pid = workflow.process.id;
+		openProcessProperties(pid);
+	}));
+	return menu;
+	
+};
+
+draw2d.MyCanvas.prototype.getListener=function(id){
+	for(var i=0;i<this.listeners.getSize();i++){
+		var listener = this.listeners.get(i);
+		if(listener.getId()=== id){
+			return listener;
+		}
+	}
+};
+draw2d.MyCanvas.prototype.deleteListener=function(id){
+	var listener = this.getListener(id);
+	this.listeners.remove(listener);
+};
+draw2d.MyCanvas.prototype.setListener=function(listenser){
+	this.listeners.add(listener);
+};
+
+draw2d.MyCanvas.prototype.onContextMenu=function(x,y){
+	if(this.readOnly)return;
+	var f = this.getBestFigure(x, y);
+	if(f==null)
+		f = this.getBestLine(x, y);
+	if(f !=null){
+		var menu = f.getContextMenu();
+		if (menu !== null) {
+			this.showMenu(menu, x, y);
+		}
+	}else{
+		var menu = this.getContextMenu();
+		if (menu !== null) {
+			this.showMenu(menu, x, y);
+		}
+	}
+};
+
+
+draw2d.MyCanvas.prototype.getXMLHeader=function(){
+	var xml='<?xml version="1.0" encoding="UTF-8"?>\n';
+	return xml;
+};
+draw2d.MyCanvas.prototype.getDefinitionsStartXML=function(){
+	var xml = '<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" '
+		+'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" '
+		+'xmlns:activiti="http://activiti.org/bpmn" '
+		+'xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" '
+		+'xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" '
+		+'xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" '
+		+'typeLanguage="http://www.w3.org/2001/XMLSchema" '
+		+'expressionLanguage="http://www.w3.org/1999/XPath" '
+		+'targetNamespace="'+this.process.category+'">\n';
+	return xml;
+};
+draw2d.MyCanvas.prototype.getDefinitionsEndXML=function(){
+	var xml='</definitions>\n';
+	return xml;
+};
+
+draw2d.MyCanvas.prototype.toXML=function(){
+	var xml = this.getXMLHeader();
+	xml = xml+this.getDefinitionsStartXML();
+	xml=xml+'<process id="'+this.process.id+'" name="'+this.process.name+'">\n';
+	xml=xml+this.process.getDocumentationXML();
+	xml=xml+this.process.getExtensionElementsXML();
+	var bpmnDigramXml='<bpmndi:BPMNDiagram id="BPMNDiagram_'+this.process.id+'">\n';
+	bpmnDigramXml=bpmnDigramXml+'<bpmndi:BPMNPlane bpmnElement="'+this.process.id+'" id="BPMNPlane_'+this.process.id+'">\n';
+	
+	var models = this.getFigures();
+	//alert(models.getSize()+"####"); 
+	for(var i=0;i<models.getSize();i++){
+		var model=models.get(i);
+		for(var j=0;j<DefaultModelTypeEnum.length;j++){
+			if(DefaultModelTypeEnum[j]==model.type){
+				//alert(model.type);
+			//	alert(model.toXML());
+				xml=xml+model.toXML();
+				bpmnDigramXml=bpmnDigramXml+model.toBpmnDI();
+				break;
+			}
+		}
+	} 
+	var lines = this.getLines();
+
+	for(var i=0;i<lines.getSize();i++){
+		var line = lines.get(i);
+		for(var j=0;j<DefaultModelTypeEnum.length;j++){
+			if(DefaultModelTypeEnum[j]==line.type){
+				//alert(line.type);
+				xml=xml+line.toXML();
+				bpmnDigramXml=bpmnDigramXml+line.toBpmnDI();
+				break;
+			}
+		}
+	}
+	xml=xml+'</process>\n';
+	bpmnDigramXml=bpmnDigramXml+'</bpmndi:BPMNPlane>\n'
+	bpmnDigramXml=bpmnDigramXml+'</bpmndi:BPMNDiagram>\n';
+	xml=xml+bpmnDigramXml;
+	xml=xml+this.getDefinitionsEndXML();
+	xml=formatXml(xml);
+	return xml;
+};
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/ResizeImage.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/ResizeImage.js
new file mode 100644
index 0000000..c24b6d6
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/ResizeImage.js
@@ -0,0 +1,53 @@
+draw2d.ResizeImage = function(_url) {
+	this.url = _url;
+	this.img = null;
+	draw2d.Node.call(this);
+	this.setDimension(100, 100);
+	this.setColor(null);
+};
+draw2d.ResizeImage.prototype = new draw2d.Node;
+draw2d.ResizeImage.prototype.type = "ResizeImage";
+draw2d.ResizeImage.prototype.createHTMLElement = function() {
+	var item = draw2d.Node.prototype.createHTMLElement.call(this);
+	if (navigator.appName.toUpperCase() == "MICROSOFT INTERNET EXPLORER") {
+		this.d = document.createElement("div");
+		this.d.style.position = "absolute";
+		this.d.style.left = "0px";
+		this.d.style.top = "0px";
+		this.d.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader (src='"
+				+ this.url + "', sizingMethod='scale')";
+		item.appendChild(this.d);
+	} else {
+		this.img = document.createElement("img");
+		this.img.style.position = "absolute";
+		this.img.style.left = "0px";
+		this.img.style.top = "0px";
+		this.img.src = this.url;
+		item.appendChild(this.img);
+		this.d = document.createElement("div");
+		this.d.style.position = "absolute";
+		this.d.style.left = "0px";
+		this.d.style.top = "0px";
+		item.appendChild(this.d);
+	}
+	item.style.left = this.x + "px";
+	item.style.top = this.y + "px";
+	return item;
+};
+draw2d.ResizeImage.prototype.setDimension = function(w, h) {
+	try{
+		draw2d.Node.prototype.setDimension.call(this, w, h);
+		if (this.d !== null) {
+			this.d.style.width = this.width + "px";
+			this.d.style.height = this.height + "px";
+		}
+		if (this.img !== null) {
+			this.img.width = this.width;
+			this.img.height = this.height;
+		}
+	}catch(e){
+	}
+};
+draw2d.ResizeImage.prototype.setWorkflow = function(_4b06) {
+	draw2d.Node.prototype.setWorkflow.call(this, _4b06);
+};
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/connection/DecoratedConnection.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/connection/DecoratedConnection.js
new file mode 100644
index 0000000..43d7c3b
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/connection/DecoratedConnection.js
@@ -0,0 +1,126 @@
+draw2d.DecoratedConnection=function(){
+	draw2d.Connection.call(this);
+	var decorator = new draw2d.ArrowConnectionDecorator();
+	var black = new draw2d.Color(0,0,0);
+	decorator.setBackgroundColor(black);
+	this.setTargetDecorator(decorator);
+	this.setRouter(new draw2d.ManhattanConnectionRouter());
+	this.setLineWidth(1);
+	this.setColor(black);
+	this.lineId=null;
+	this.lineName=null;
+	this.condition=null;
+	this.listeners=new draw2d.ArrayList();
+	this.label=null;
+};
+draw2d.DecoratedConnection.prototype=new draw2d.Connection();
+draw2d.DecoratedConnection.prototype.type="DecoratedConnection";
+draw2d.DecoratedConnection.prototype.getConditionXML=function(){
+	var xml = '';
+	if(this.condition != null&&this.condition!=''){
+		xml = '<conditionExpression xsi:type="tFormalExpression"><![CDATA['+this.condition+']]></conditionExpression>\n';
+	}
+	return xml;
+}
+draw2d.DecoratedConnection.prototype.toXML=function(){
+	var sourceId = null;
+	var type=this.getSource().getParent().type;
+	if(type=='draw2d.Start'){
+		sourceId = this.getSource().getParent().eventId;
+	}	
+	else if(type=='draw2d.ExclusiveGateway'){
+		sourceId = this.getSource().getParent().gatewayId;
+	}else if(type=='draw2d.ParallelGateway'){
+		sourceId = this.getSource().getParent().gatewayId;
+	}else{
+		sourceId = this.getSource().getParent().taskId;
+	}
+	var targetId = null;
+	type=this.getTarget().getParent().type;
+	if(type=='draw2d.End'){
+		targetId = this.getTarget().getParent().eventId;
+	}else if(type=='draw2d.ExclusiveGateway'){
+		targetId = this.getTarget().getParent().gatewayId;
+	}else if(type=='draw2d.ParallelGateway'){
+		targetId = this.getTarget().getParent().gatewayId;
+	}else{
+		targetId = this.getTarget().getParent().taskId;
+	}
+	var name = this.lineId;
+	var lineName = trim(this.lineName);
+	if(lineName != null && lineName != "")
+		name = lineName;
+	var xml = '<sequenceFlow id="'+this.lineId+'" name="'+name+'" sourceRef="'+sourceId+'" targetRef="'+targetId+'">\n';
+	xml = xml+this.getConditionXML();
+	xml = xml+'</sequenceFlow>\n';
+	return xml;
+};
+draw2d.DecoratedConnection.prototype.setLabel=function(text){
+	if(this.label == null){
+		this.label=new draw2d.Label(text);
+		this.label.setFontSize(10);
+		this.label.setAlign("left");
+		//label.setBackgroundColor(new draw2d.Color(230,230,250));
+		//label.setBorder(new draw2d.LineBorder(1));
+		this.addFigure(this.label,new draw2d.ManhattanMidpointLocator(this));
+	}else{
+		this.label.setText(text);
+	}
+};
+draw2d.DecoratedConnection.prototype.toBpmnDI=function(){
+	var xml='<bpmndi:BPMNEdge bpmnElement="'+this.lineId+'" id="BPMNEdge_'+this.lineId+'">\n';
+//	var startX = this.getSource().getAbsoluteX();
+//	var startY = this.getSource().getAbsoluteY();
+//	var endX = this.getTarget().getAbsoluteX();
+//	var endY = this.getTarget().getAbsoluteY();
+	var points=this.getPoints();
+	for(var i=0;i<points.size;i++){
+		xml=xml+'<omgdi:waypoint x="'+points.get(i).x+'" y="'+points.get(i).y+'" />\n';
+	}
+	xml=xml+'</bpmndi:BPMNEdge>\n';
+	return xml;
+};
+draw2d.DecoratedConnection.prototype.onDoubleClick=function(){
+	var id = this.getId();
+	openFlowProperties(id);
+};
+draw2d.DecoratedConnection.prototype.getContextMenu=function(){
+	if(this.workflow.disabled)return null;
+	var menu =new draw2d.ContextMenu(100, 50);
+	var data = {line:this};
+	menu.appendMenuItem(new draw2d.ContextMenuItem("Properties", "properties-icon",data,function(x,y)
+	{
+		var data = this.getData();
+		var line = data.line;
+		var lid = line.getId();
+		if(typeof openFlowProperties != "undefined"){
+			openFlowProperties(lid);
+		}
+	}));
+	menu.appendMenuItem(new draw2d.ContextMenuItem("Delete", "icon-remove",data,function(x,y)
+	{
+		var data = this.getData();
+		var line = data.line;
+		var lid = line.getId();
+		var wf = line.getWorkflow();
+		wf.getCommandStack().execute(new draw2d.CommandDelete(line));
+		//wf.removeFigure(line);
+	}));
+	
+	return menu;
+};
+draw2d.DecoratedConnection.prototype.getListener=function(id){
+	for(var i=0;i<this.listeners.getSize();i++){
+		var listener = this.listeners.get(i);
+		if(listener.getId()=== id){
+			return listener;
+		}
+	}
+};
+draw2d.DecoratedConnection.prototype.deleteListener=function(id){
+	var listener = this.getListener(id);
+	this.listeners.remove(listener);
+};
+draw2d.DecoratedConnection.prototype.setListener=function(listener){
+	this.listeners.add(listener);
+};
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/connection/MyInputPort.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/connection/MyInputPort.js
new file mode 100644
index 0000000..65eabd7
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/connection/MyInputPort.js
@@ -0,0 +1,26 @@
+draw2d.MyInputPort=function(_5920){
+draw2d.InputPort.call(this,_5920);
+};
+draw2d.MyInputPort.prototype=new draw2d.InputPort();
+draw2d.MyInputPort.prototype.type="MyInputPort";
+draw2d.MyInputPort.prototype.setWorkflow=function(){
+	draw2d.InputPort.prototype.setWorkflow.call(this,workflow);
+};
+draw2d.MyInputPort.prototype.onDrop=function(port){
+	if(port.getMaxFanOut&&port.getMaxFanOut()<=port.getFanOut()){
+		return;
+	}
+	if(this.parentNode.id==port.parentNode.id){
+	}else{
+		var _5922=new draw2d.CommandConnect(this.parentNode.workflow,port,this);
+		var connection = new draw2d.DecoratedConnection();
+		var id = "flow"+Sequence.create();
+		connection.id=id;
+		connection.lineId=id;
+		connection.lineName=id;
+		//connection.setLabel(id);
+		//connection.setId(id);
+		_5922.setConnection(connection);
+		this.parentNode.workflow.getCommandStack().execute(_5922);
+	}
+};
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/connection/MyOutputPort.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/connection/MyOutputPort.js
new file mode 100644
index 0000000..25d3d7e
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/connection/MyOutputPort.js
@@ -0,0 +1,26 @@
+draw2d.MyOutputPort=function(_4aff){
+	draw2d.OutputPort.call(this,_4aff);
+};
+draw2d.MyOutputPort.prototype=new draw2d.OutputPort();
+draw2d.MyOutputPort.prototype.type="MyOutputPort";
+draw2d.MyOutputPort.prototype.setWorkflow=function(workflow){
+	draw2d.OutputPort.prototype.setWorkflow.call(this,workflow);
+};
+draw2d.MyOutputPort.prototype.onDrop=function(port){
+	if(this.getMaxFanOut()<=this.getFanOut()){
+		return;
+	}
+	if(this.parentNode.id==port.parentNode.id){
+	}else{
+		var _4b01=new draw2d.CommandConnect(this.parentNode.workflow,this,port);
+		var connection = new draw2d.DecoratedConnection();
+		var id = "flow"+Sequence.create();
+		connection.id=id;
+		connection.lineId=id;
+		connection.lineName=id;
+		//connection.setLabel(id);
+		//connection.setId(id);
+		_4b01.setConnection(connection);
+		this.parentNode.workflow.getCommandStack().execute(_4b01);
+	}
+};
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/designer.css b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/designer.css
new file mode 100644
index 0000000..2fe1372
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/designer.css
@@ -0,0 +1,203 @@
+.MyCanvas{
+	background-image:url(img/grid_10.png);
+}
+.draggable-model-proxy{
+	border:1px solid #ccc;
+	opacity:0.7;
+	position:absolute;
+	z-index:20;
+	filter:alpha(opacity=70);
+}
+.task{
+	margin : 0px;
+	padding : 0px;
+	outline : none;
+}
+.task-highlight{
+	border-radius:5px;
+	border-style: double;
+  	border-width: 3px;
+  	border-color: red;
+	margin : 0px;
+	padding : 0px;
+	outline : none;
+}
+.task-tip{
+	display:none;
+	position:absolute;
+	color:#4D9FBF;
+	font:14px;
+	background-color:#E5F6FE;
+	border-radius:5px;
+	border:#ADD9ED 2px double
+}
+.task-top-left{
+	background:url(img/circle.png) no-repeat top left;
+	position:absolute;
+	left:0;
+	top:0;
+	font-size:2px;
+}
+.task-top-right{
+	background:url(img/circle.png) no-repeat top right;
+	position:absolute;
+	left:0;
+	top:0;
+	font-size:2px;
+}
+.task-header{
+	background-color : #CCCCFF;
+	border-top : 3px solid #666666;
+	font-size : 10px;
+	text-align : center;
+}
+.task-textarea{
+	background-color : white;
+	border-top : 1px solid #666666;
+	border-left : 1px solid #666666;
+	border-right : 1px solid #666666;
+	overflow : auto;
+	font-size =: 9pt;
+	font-weight : bolder;
+	text-align : center;
+	vertical-align : middle;
+}
+.task-footer{
+	background-color : white;
+	border-bottom : 1px solid #666666;
+	font-size : 2px;
+}
+.bottom-top-left{
+	background:url(img/circle.png) no-repeat bottom left;
+	position:absolute;
+	left:0;
+	top:0;
+	font-size:2px;
+}
+.bottom-top-right{
+	background:url(img/circle.png) no-repeat bottom right;
+	position:absolute;
+	left:0;
+	top:0;
+	font-size:2px;
+}
+.user-task-icon{
+	background : url(icons/type.user.png) no-repeat;
+}
+.manual-task-icon{
+	background : url(icons/type.manual.png) no-repeat;
+}
+.script-task-icon{
+	background : url(icons/type.script.png) no-repeat;
+}
+.mail-task-icon{
+	background : url(icons/type.send.png) no-repeat;
+}
+.service-task-icon{
+	background : url(icons/type.service.png) no-repeat;
+}
+.receive-task-icon{
+	background : url(icons/type.receive.png) no-repeat;
+}
+.business-rule-task-icon{
+	background : url(icons/type.business.rule.png) no-repeat;
+}
+.subprocess-icon{
+	background : url(icons/type.subprocess.expanded.png) no-repeat;
+}
+.callactivity-icon{
+	background : url(icons/callactivity.png) no-repeat;
+}
+.sequence-flow-icon{
+	background : url(icons/ereference.gif) no-repeat;
+}
+.start-event-icon{
+	background : url(icons/type.startevent.none.png) no-repeat;
+}
+.end-event-icon{
+	background : url(icons/type.endevent.none.png) no-repeat;
+}
+.parallel-gateway-icon{
+	background : url(icons/type.gateway.parallel.png) no-repeat;
+}
+.exclusive-gateway-icon{
+	background : url(icons/type.gateway.exclusive.png) no-repeat;
+}
+.timer-boundary-event-icon{
+	background : url(icons/timer.png) no-repeat;
+}
+.error-boundary-event-icon{
+	background : url(icons/error.png) no-repeat;
+}
+.palette-icon{
+	background : url(icons/palette.png) no-repeat;
+}
+.palette-menu{
+	padding:5px;
+	overflow:auto;
+}
+.palette-menu-icon{
+	background : url(icons/tree_folder_open.gif) no-repeat;
+}
+.process-icon{
+	background : url(icons/process.gif) no-repeat;
+}
+.properties-icon{
+	background : url(icons/properties.gif) no-repeat;
+}
+.properties-menu{
+	overflow:auto;
+}
+.context-menu{
+	position:absolute;
+	background:#f0f0f0 url('img/menu.gif') repeat-y;
+	margin:0;
+	padding:2px;
+	border:1px solid #ccc;
+	overflow:hidden;
+}
+.context-menu-item{
+	position:relative;
+	margin:0;
+	padding:0;
+	height:22px;
+	line-height:20px;
+	overflow:hidden;
+	font-size:12px;
+	cursor:pointer;
+	border:1px solid transparent;
+	_border:1px solid #f0f0f0;
+}
+.context-menu-text{
+	position:absolute;
+	left:28px;
+	top:0px;
+}
+.context-menu-icon{
+	position:absolute;
+	width:16px;
+	height:16px;
+	top:3px;
+	left:2px;
+}
+.context-menu-sep{
+	margin:3px 0px 3px 24px;
+	line-height:2px;
+	font-size:2px;
+	background:url('img/menu_sep.png') repeat-x;
+}
+.context-menu-active{
+	border:1px solid #7eabcd;
+	background:#fafafa;
+	-moz-border-radius:3px;
+	-webkit-border-radius: 3px;
+}
+.context-menu-shadow{
+	position:absolute;
+	background:#ddd;
+	-moz-border-radius:5px;
+	-webkit-border-radius: 5px;
+	-moz-box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.2);
+	-webkit-box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.2);
+	filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2);
+}
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/designer.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/designer.js
new file mode 100644
index 0000000..eccadad
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/designer.js
@@ -0,0 +1,523 @@
+var jq = jQuery.noConflict();
+
+var DefaultModelTypeEnum=[
+                          draw2d.Start.prototype.type,
+                          draw2d.End.prototype.type,
+                          draw2d.UserTask.prototype.type,
+                          draw2d.ManualTask.prototype.type,
+                          draw2d.ServiceTask.prototype.type,
+                          draw2d.DecoratedConnection.prototype.type,
+                          draw2d.ExclusiveGateway.prototype.type,
+                          draw2d.ParallelGateway.prototype.type];
+draw2d.Random=function(){};
+draw2d.Random.create=function () {
+	/*
+	var len = 10;
+	var seed = new Array 
+	( 
+	'abcdefghijklmnopqrstuvwxyz', 
+	'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 
+	'1234567890' 
+	); 
+	var idd, i; 
+	var result = ''; 
+	for (i = 0; i < len; i++) { 
+		idd = Math.floor(Math.random() * seed.length); 
+		result += seed[idd].substr(Math.floor(Math.random() * (seed[idd].length)), 1); 
+	} 
+	return result;
+	*/
+	return new Date().getTime();
+};
+//Sequence=draw2d.UUID;
+Sequence=draw2d.Random;
+//designer index objects definition
+
+/**
+ * process object definition
+ */
+draw2d.Process=function(){
+	this.id=null;
+	this.name=null;
+	this.category=null;
+	this.documentation=null;
+	this.listeners=new draw2d.ArrayList();
+	this.variables=new draw2d.ArrayList();
+};
+draw2d.Process.prototype.getListener=function(id){
+	for(var i=0;i<this.listeners.getSize();i++){
+		var listener = this.listeners.get(i);
+		if(listener.getId()=== id){
+			return listener;
+		}
+	}
+};
+draw2d.Process.prototype.deleteListener=function(id){
+	var listener = this.getListener(id);
+	this.listeners.remove(listener);
+};
+draw2d.Process.prototype.addListener=function(listener){
+	this.listeners.add(listener);
+};
+draw2d.Process.prototype.setListeners=function(listeners){
+	this.listeners = listeners;
+};
+draw2d.Process.prototype.getVariable=function(id){
+	for(var i=0;i<this.variables.getSize();i++){
+		var variable = this.variables.get(i);
+		if(variable.id=== id){
+			return variable;
+		}
+	}
+};
+draw2d.Process.prototype.deleteVariable=function(id){
+	var variable = this.getVariable(id);
+	this.variables.remove(variable);
+};
+draw2d.Process.prototype.addVariable=function(variable){
+	this.variables.add(variable);
+};
+draw2d.Process.prototype.getVariablesJSONObject=function(){
+	return JSON.stringify(this.variables.data);
+};
+draw2d.Process.prototype.getListenersXML=function(){
+	var xml = '';
+	for(var i=0;i<this.listeners.getSize();i++){
+		var listener = this.listeners.get(i);
+		xml=xml+listener.toXML();
+	}
+	return xml;
+};
+draw2d.Process.prototype.getExtensionElementsXML=function(){
+	if(this.listeners.getSize()==0)return '';
+	var xml = '<extensionElements>\n';
+	xml=xml+this.getListenersXML();
+	xml=xml+'</extensionElements>\n';
+	return xml;
+};
+draw2d.Process.prototype.getDocumentationXML=function(){
+	var documentation = trim(this.documentation);
+	if(documentation==null||documentation=='')return '';
+	var xml='<documentation>';
+	xml=xml+this.documentation;
+	xml=xml+'</documentation>';
+	return xml;
+};
+draw2d.Process.variable=function(){
+	this.id=draw2d.UUID.create();
+	this.name=null;
+	this.type=null;
+	this.scope=null;
+	this.defaultValue=null;
+	this.remark=null;
+};
+draw2d.Process.Listener=function(){
+	this.id=draw2d.UUID.create();
+	this.event=null;
+	this.serviceType=null;
+	this.serviceClass=null;
+	this.serviceExpression=null;
+	this.fields=new draw2d.ArrayList();
+};
+draw2d.Process.Listener.prototype.setId=function(id){
+	this.id=id;
+};
+draw2d.Process.Listener.prototype.getId=function(){
+	return this.id;
+};
+draw2d.Process.Listener.prototype.setField=function(field){
+	this.fields.add(field);
+};
+draw2d.Process.Listener.prototype.getField=function(id){
+	for(var i=0;i<this.fields.getSize();i++ ){
+		var field = this.fields.get(i);
+		if(field.id == id){
+			return field;
+		}
+	}
+};
+draw2d.Process.Listener.prototype.deleteField=function(id){
+	var field = this.getField(id);
+	this.fields.remove(field);
+};
+draw2d.Process.Listener.prototype.getServiceImplementation=function(){
+	if(this.serviceType=='javaClass')
+		return this.serviceClass;
+	else if(this.serviceType=='expression')
+		return this.serviceExpression;
+};
+draw2d.Process.Listener.prototype.getFieldsString=function(){
+	var f = '';
+	var v = '';
+	for(var i=0;i<this.fields.getSize();i++){
+		var field = this.fields.get(i);
+		f=f+field.name+":"+field.value+",";
+	}
+	return f;
+};
+draw2d.Process.Listener.prototype.toJSON=function(){
+	var json={
+			id:this.id,
+			event:this.event,
+			serviceType:this.serviceType,
+			serviceClass:this.serviceClass,
+			serviceExpression:this.serviceExpression,
+			fields:this.fields.data
+	};
+	return JSON.stringify(json);
+};
+draw2d.Process.Listener.prototype.parseJSON=function(){
+	var jsonString = this.toJSON();
+	return JSON.parse(jsonString);
+};
+draw2d.Process.Listener.prototype.getFieldsXML=function(){
+	var xml = "";
+	for(var i=0;i<this.fields.getSize();i++){
+		var field = this.fields.get(i);
+		xml=xml+field.toXML();
+	}
+	return xml;
+};
+draw2d.Process.Listener.prototype.toXML=function(){
+	var xml = '<activiti:executionListener event="'+this.event+'" ';
+	if(this.serviceType=='javaClass'){
+		xml=xml+'class="'+this.serviceClass+'" ';
+	}else if(this.serviceType=='expression'){
+		xml=xml+'expression="'+this.serviceExpression+'" ';
+	}
+	xml=xml+'>\n';
+	xml=xml+this.getFieldsXML();
+	xml=xml+'</activiti:executionListener>\n'
+	return xml;
+};
+/**
+ * Process field object
+ */
+draw2d.Process.Listener.Field=function(){
+	this.id=draw2d.UUID.create();
+	this.name=null;
+	this.type=null;
+	this.value=null;
+};
+draw2d.Process.Listener.Field.prototype.toJSON=function(){
+
+	var json = {
+			id:this.id,
+			name:this.name,
+			type:this.type,
+			value:this.value
+	};
+	return JSON.stringify(json);
+};
+draw2d.Process.Listener.Field.prototype.toXML=function(){
+
+	var xml = '<activiti:field name="'+this.name+'">\n';
+	if(this.type=='string'){
+		xml=xml+'<activiti:string>'+this.value+'</activiti:string>\n';
+	}else if(this.type='expression'){
+		xml=xml+'<activiti:expression>'+this.value+'</activiti:expression>\n';
+	}
+	xml=xml+'</activiti:field>\n';
+	
+  	return xml
+};
+/**
+ * Task listener object definition
+ */
+draw2d.Task.Listener=function(){
+	draw2d.Process.Listener.call(this);
+};
+
+draw2d.Task.Listener.prototype=new draw2d.Process.Listener();
+draw2d.Task.Listener.prototype.toXML=function(){
+	var xml = '<activiti:taskListener event="'+this.event+'" ';
+	if(this.serviceType=='javaClass'){
+		xml=xml+'class="'+this.serviceClass+'" ';
+	}else if(this.serviceType=='expression'){
+		xml=xml+'delegateExpression="'+this.serviceExpression+'" ';
+	}
+	xml=xml+'>\n';
+	//alert(this.getFieldsXML())
+	xml=xml+this.getFieldsXML();
+	xml=xml+'</activiti:taskListener>\n'
+	return xml;
+};
+
+/**
+ * Task listener field object definition
+ */
+draw2d.Task.Listener.Field=function(){
+	draw2d.Process.Listener.Field.call(this);
+};
+draw2d.Task.Listener.Field.prototype=new draw2d.Process.Listener.Field();
+
+/**
+ * Line listener object definition
+ */
+draw2d.DecoratedConnection.Listener=function(){
+	draw2d.Process.Listener.call(this);
+};
+draw2d.DecoratedConnection.Listener.prototype=new draw2d.Process.Listener();
+draw2d.DecoratedConnection.Listener.prototype.toXML=function(){
+
+	var xml = '<activiti:executionListener ';
+	if(this.serviceType=='javaClass'){
+		xml=xml+'class="'+this.serviceClass+'" ';
+	}else if(this.serviceType=='expression'){
+		xml=xml+'expression="'+this.serviceExpression+'" ';
+	}
+	xml=xml+'>\n';
+	xml=xml+this.getFieldsXML();
+	xml=xml+'</activiti:executionListener>\n'
+	return xml;
+};
+/**
+ * Line listener field object definition
+ */
+draw2d.DecoratedConnection.Listener.Field=function(){
+	draw2d.Process.Listener.Field.call(this);
+};
+draw2d.DecoratedConnection.Listener.Field.prototype=new draw2d.Process.Listener.Field();
+
+/**
+ * designer UI objects definition
+ */
+draw2d.ContextMenu=function(w,h){
+	draw2d.Menu.call(this);
+	this.setDimension(w,h);
+	this.item = null;
+	this.width = w;
+	this.height = h;
+};
+draw2d.ContextMenu.prototype = new draw2d.Menu();
+draw2d.ContextMenu.prototype.type = "draw2d.ContextMenu";
+draw2d.ContextMenu.prototype.setDimension=function(w,h){
+	//draw2d.Menu.prototype.setDimension.call(this,w,h);
+	this.item.style.width = w+"px";
+	this.item.style.height = h+"px";
+	/*
+	this.shadow.css( {
+		display : "block",
+		zIndex : this.getZOrder()-1,
+		left : this.menu.css("left"),
+		top : this.menu.css("top"),
+		width : w+3,
+		height : h+3
+	});
+	*/
+};
+draw2d.ContextMenu.prototype.createHTMLElement = function() {
+	this.item = document.createElement("div");
+	this.item.style.left = this.x + "px";
+	this.item.style.top = this.y + "px";
+	this.item.style.cursor = "pointer";
+	this.item.style.width = this.width+"px";
+	this.item.style.height = this.height+"px";
+	this.item.className = "context-menu";
+	return this.item;
+};
+draw2d.ContextMenu.prototype.createList = function() {
+	this.dirty = false;
+	this.html.innerHTML = "";
+	var oThis = this;
+	for ( var i = 0; i < this.menuItems.getSize(); i++) {
+		var item = this.menuItems.get(i);
+		var li = document.createElement("div");
+		li.className = "context-menu-item";
+		var mtext = document.createElement("div");
+		mtext.innerHTML = item.getLabel();
+		mtext.className="context-menu-text";
+		li.appendChild(mtext);
+		var micon = document.createElement("div");
+		micon.className = "context-menu-icon "+item.iconCls;
+		li.appendChild(micon);
+		li.menuItem = item;
+		this.html.appendChild(li);
+		if (li.addEventListener) {
+			li.addEventListener("click", function(event) {
+				var _508f = arguments[0] || window.event;
+				_508f.cancelBubble = true;
+				_508f.returnValue = false;
+				var diffX = _508f.clientX;
+				var diffY = _508f.clientY;
+				var _5092 = document.body.parentNode.scrollLeft;
+				var _5093 = document.body.parentNode.scrollTop;
+				var target=event.srcElement ? event.srcElement : event.target;
+				if(target.className.indexOf("context-menu-item")!=-1){
+					target.menuItem.execute(diffX + _5092, diffY
+							+ _5093);
+				}else{
+					target.parentNode.menuItem.execute(diffX + _5092, diffY
+							+ _5093);
+				}
+			}, false);
+			li.addEventListener("mouseup", function(event) {
+				//alert("mouseup");
+				event.cancelBubble = true;
+				event.returnValue = false;
+			}, false);
+			li.addEventListener("mousedown", function(event) {
+				//alert("mousedown");
+				event.cancelBubble = true;
+				event.returnValue = false;
+			}, false);
+			li.addEventListener("mouseover", function(event) {
+				var target=event.srcElement ? event.srcElement : event.target;
+				if(target.className.indexOf("context-menu-item")!=-1)
+					target.className="context-menu-item context-menu-active";
+				else
+					target.parentNode.className="context-menu-item context-menu-active";
+			}, false);
+			li.addEventListener("mouseout", function(event) {
+				var target=event.srcElement ? event.srcElement : event.target;
+				if(target.className.indexOf("context-menu-active")!=-1)
+					target.className="context-menu-item";
+				else
+					target.parentNode.className="context-menu-item";
+			}, false);
+		} else {
+			if (li.attachEvent) {
+				li.attachEvent("onclick", function(event) {
+					var _5099 = arguments[0] || window.event;
+					_5099.cancelBubble = true;
+					_5099.returnValue = false;
+					var diffX = _5099.clientX;
+					var diffY = _5099.clientY;
+					var _509c = document.body.parentNode.scrollLeft;
+					var _509d = document.body.parentNode.scrollTop;
+					var target=event.srcElement ? event.srcElement : event.target;
+					if(target.className.indexOf("context-menu-item")!=-1)
+						target.menuItem.execute(diffX + _509c, diffY
+								+ _509d);
+					else
+						target.parentNode.menuItem.execute(diffX + _509c, diffY
+								+ _509d);
+				});
+				li.attachEvent("onmousedown", function(event) {
+					event.cancelBubble = true;
+					event.returnValue = false;
+				});
+				li.attachEvent("onmouseup", function(event) {
+					event.cancelBubble = true;
+					event.returnValue = false;
+				});
+				li.attachEvent("onmouseover", function(event) {
+					var target=event.srcElement ? event.srcElement : event.target;
+					if(target.className.indexOf("context-menu-item")!=-1)
+						target.className="context-menu-item context-menu-active";
+					else
+						target.parentNode.className="context-menu-item context-menu-active";
+				});
+				li.attachEvent("onmouseout", function(event) {
+					var target=event.srcElement ? event.srcElement : event.target;
+					if(target.className.indexOf("context-menu-active")!=-1)
+						target.className="context-menu-item";
+					else
+						target.parentNode.className="context-menu-item";
+				});
+			}
+		}
+	}
+};
+draw2d.ContextMenuItem=function(label, iconCls, data ,action){
+	draw2d.MenuItem.call(this,label,"",action);
+	this.data = data;
+	this.iconCls = iconCls;
+};
+draw2d.ContextMenuItem.prototype = new draw2d.MenuItem();
+draw2d.ContextMenuItem.prototype.type = "draw2d.ContextMenuItem";
+draw2d.ContextMenuItem.prototype.setIconCls=function(iconCls){
+	this.iconCls = iconCls;
+};
+draw2d.ContextMenuItem.prototype.setData=function(data){
+	this.data = data;
+};
+draw2d.ContextMenuItem.prototype.getData=function(){
+	return this.data;
+};
+draw2d.ContextMenuItem.prototype.execute = function(x, y,f) {
+	this.parentMenu.workflow.showMenu(null);
+	this.action(x, y,f);
+};
+String.prototype.removeLineEnd = function()
+{
+    return this.replace(/(<.+?\s+?)(?:\n\s*?(.+?=".*?"))/g,'$1 $2')
+};
+function formatXml(text)
+{
+    //鍘绘帀澶氫綑鐨勭┖鏍�
+    text = '\n' + text.replace(/(<\w+)(\s.*?>)/g,function($0, name, props)
+    {
+        return name + ' ' + props.replace(/\s+(\w+=)/g," $1");
+    }).replace(/>\s*?</g,">\n<");
+    
+    //鎶婃敞閲婄紪鐮�
+    text = text.replace(/\n/g,'\r').replace(/<!--(.+?)-->/g,function($0, text)
+    {
+        var ret = '<!--' + escape(text) + '-->';
+        //alert(ret);
+        return ret;
+    }).replace(/\r/g,'\n');
+    
+    //璋冩暣鏍煎紡
+    var rgx = /\n(<(([^\?]).+?)(?:\s|\s*?>|\s*?(\/)>)(?:.*?(?:(?:(\/)>)|(?:<(\/)\2>)))?)/mg;
+    var nodeStack = [];
+    var output = text.replace(rgx,function($0,all,name,isBegin,isCloseFull1,isCloseFull2 ,isFull1,isFull2){
+        var isClosed = (isCloseFull1 == '/') || (isCloseFull2 == '/' ) || (isFull1 == '/') || (isFull2 == '/');
+        //alert([all,isClosed].join('='));
+        var prefix = '';
+        if(isBegin == '!')
+        {
+            prefix = getPrefix(nodeStack.length);
+        }
+        else 
+        {
+            if(isBegin != '/')
+            {
+                prefix = getPrefix(nodeStack.length);
+                if(!isClosed)
+                {
+                    nodeStack.push(name);
+                }
+            }
+            else
+            {
+                nodeStack.pop();
+                prefix = getPrefix(nodeStack.length);
+            }
+
+        
+        }
+            var ret =  '\n' + prefix + all;
+            return ret;
+    });
+    
+    var prefixSpace = -1;
+    var outputText = output.substring(1);
+    
+    //鎶婃敞閲婅繕鍘熷苟瑙g爜锛岃皟鏍煎紡
+    outputText = outputText.replace(/\n/g,'\r').replace(/(\s*)<!--(.+?)-->/g,function($0, prefix,  text)
+    {
+        //alert(['[',prefix,']=',prefix.length].join(''));
+        if(prefix.charAt(0) == '\r')
+            prefix = prefix.substring(1);
+        text = unescape(text).replace(/\r/g,'\n');
+        var ret = '\n' + prefix + '<!--' + text.replace(/^\s*/mg, prefix ) + '-->';
+        //alert(ret);
+        return ret;
+    });
+    
+    return outputText.replace(/\s+$/g,'').replace(/\r/g,'\r\n');
+}
+
+function getPrefix(prefixIndex)
+{
+    var span = '    ';
+    var output = [];
+    for(var i = 0 ; i < prefixIndex; ++i)
+    {
+        output.push(span);
+    }
+    
+    return output.join('');
+}
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/event/End.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/event/End.js
new file mode 100644
index 0000000..5e9b2ca
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/event/End.js
@@ -0,0 +1,91 @@
+draw2d.End=function(_url){
+draw2d.ResizeImage.call(this,_url);
+this.rightInputPort=null;
+this.leftInputPort=null;
+this.topInputPort=null;
+this.bottomInputPort=null;
+this.eventId='end';
+this.eventName='End';
+this.setDimension(30,30);
+};
+draw2d.End.prototype=new draw2d.Node();
+draw2d.End.prototype.type="draw2d.End";
+draw2d.End.prototype.generateId=function(){
+	this.id="end";
+	this.taskId=this.id;
+};
+draw2d.End.prototype.createHTMLElement=function(){
+	var item = draw2d.ResizeImage.prototype.createHTMLElement.call(this);
+	return item;
+};
+draw2d.End.prototype.setDimension=function(w, h){
+	draw2d.ResizeImage.prototype.setDimension.call(this, w, h);
+};
+draw2d.End.prototype.setWorkflow=function(_505d){
+	draw2d.ResizeImage.prototype.setWorkflow.call(this,_505d);
+	this.resizeable=false;//涓嶈鏀瑰彉澶у皬
+	if(_505d!==null&&this.rightInputPort===null){
+		this.rightInputPort=new draw2d.MyInputPort();
+		this.rightInputPort.setName("RightInputPort");
+		this.rightInputPort.setWorkflow(_505d);
+		this.rightInputPort.setBackgroundColor(new draw2d.Color(115,115,245));
+		this.addPort(this.rightInputPort,this.width,this.height/2);
+	}
+	if(_505d!==null&&this.leftInputPort===null){
+		this.leftInputPort=new draw2d.MyInputPort();
+		this.leftInputPort.setName("leftInputPort");
+		this.leftInputPort.setWorkflow(_505d);
+		this.leftInputPort.setBackgroundColor(new draw2d.Color(115,115,245));
+		this.addPort(this.leftInputPort,0,this.height/2);
+	}
+	if(_505d!==null&&this.topInputPort===null){
+		this.topInputPort=new draw2d.MyInputPort();
+		this.topInputPort.setName("RightInputPort");
+		this.topInputPort.setWorkflow(_505d);
+		this.topInputPort.setBackgroundColor(new draw2d.Color(115,115,245));
+		this.addPort(this.topInputPort,this.width/2,0);
+	}
+	if(_505d!==null&&this.bottomInputPort===null){
+		this.bottomInputPort=new draw2d.MyInputPort();
+		this.bottomInputPort.setName("RightInputPort");
+		this.bottomInputPort.setWorkflow(_505d);
+		this.bottomInputPort.setBackgroundColor(new draw2d.Color(115,115,245));
+		this.addPort(this.bottomInputPort,this.width/2,this.height);
+	}
+};
+draw2d.End.prototype.figureDoubleClick=function(){
+	var data = {event:this};
+	var event = data.event;
+	var tid = event.getId();
+	openEventProperties(tid);
+}
+draw2d.End.prototype.getContextMenu=function(){
+	if(this.workflow.disabled)return null;
+	var menu =new draw2d.ContextMenu(100, 50);
+	var data = {event:this};
+	menu.appendMenuItem(new draw2d.ContextMenuItem("Properties", "properties-icon",data,function(x,y)
+	{
+		var data = this.getData();
+		var event = data.event;
+		var tid = event.getId();
+		if(typeof openEventProperties != "undefined"){
+			openEventProperties(tid);
+		}
+	}));
+	
+	return menu;
+};
+draw2d.End.prototype.toXML=function(){
+	var xml='<endEvent id="'+this.eventId+'" name="'+this.eventName+'"></endEvent>\n';
+	return xml;
+};
+draw2d.End.prototype.toBpmnDI=function(){
+	var w=this.getWidth();
+	var h=this.getHeight();
+	var x=this.getAbsoluteX();
+	var y=this.getAbsoluteY();
+	var xml='<bpmndi:BPMNShape bpmnElement="'+this.eventId+'" id="BPMNShape_'+this.eventId+'">\n';
+	xml=xml+'<omgdc:Bounds height="'+h+'" width="'+w+'" x="'+x+'" y="'+y+'"/>\n';
+	xml=xml+'</bpmndi:BPMNShape>\n';
+	return xml;
+};
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/event/Start.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/event/Start.js
new file mode 100644
index 0000000..42f364a
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/event/Start.js
@@ -0,0 +1,97 @@
+draw2d.Start=function(_url){
+	draw2d.ResizeImage.call(this,_url);
+	this.rightOutputPort=null;
+	this.leftOutputPort=null;
+	this.topOutputPort=null;
+	this.bottomOutputPort=null;
+	this.eventId='start';
+	this.eventName='Start';
+	this.expression=null;
+	this.setDimension(30,30);
+};
+draw2d.Start.prototype=new draw2d.Node();
+draw2d.Start.prototype.type="draw2d.Start";
+draw2d.Start.prototype.generateId=function(){
+	this.id="start";
+	this.taskId=this.id;
+};
+draw2d.Start.prototype.createHTMLElement=function(){
+	var item = draw2d.ResizeImage.prototype.createHTMLElement.call(this);
+	return item;
+};
+draw2d.Start.prototype.setDimension=function(w, h){
+	draw2d.ResizeImage.prototype.setDimension.call(this, w, h);
+};
+draw2d.Start.prototype.setWorkflow=function(_4fe5){
+	draw2d.ResizeImage.prototype.setWorkflow.call(this,_4fe5);
+	this.resizeable=false;//涓嶈鏀瑰彉澶у皬
+	if(_4fe5!==null&&this.rightOutputPort===null){
+		this.rightOutputPort=new draw2d.MyOutputPort();
+		this.rightOutputPort.setMaxFanOut(1);
+		this.rightOutputPort.setWorkflow(_4fe5);
+		this.rightOutputPort.setName("rightOutputPort");
+		this.rightOutputPort.setBackgroundColor(new draw2d.Color(245,115,115));
+		this.addPort(this.rightOutputPort,this.width,this.height/2);
+	}
+	if(_4fe5!==null&&this.leftOutputPort===null){
+		this.leftOutputPort=new draw2d.MyOutputPort();
+		this.leftOutputPort.setMaxFanOut(1);
+		this.leftOutputPort.setWorkflow(_4fe5);
+		this.leftOutputPort.setName("leftOutputPort");
+		this.leftOutputPort.setBackgroundColor(new draw2d.Color(245,115,115));
+		this.addPort(this.leftOutputPort,0,this.height/2);
+	}
+	if(_4fe5!==null&&this.topOutputPort===null){
+		this.topOutputPort=new draw2d.MyOutputPort();
+		this.topOutputPort.setMaxFanOut(1);
+		this.topOutputPort.setWorkflow(_4fe5);
+		this.topOutputPort.setName("topOutputPort");
+		this.topOutputPort.setBackgroundColor(new draw2d.Color(245,115,115));
+		this.addPort(this.topOutputPort,this.width/2,0);
+	}
+	if(_4fe5!==null&&this.bottomOutputPort===null){
+		this.bottomOutputPort=new draw2d.MyOutputPort();
+		this.bottomOutputPort.setMaxFanOut(1);
+		this.bottomOutputPort.setWorkflow(_4fe5);
+		this.bottomOutputPort.setName("bottomOutputPort");
+		this.bottomOutputPort.setBackgroundColor(new draw2d.Color(245,115,115));
+		this.addPort(this.bottomOutputPort,this.width/2,this.height);
+	}
+};
+draw2d.Start.prototype.figureDoubleClick=function(){
+	var data = {event:this};
+	var event = data.event;
+	var tid = event.getId();
+	openEventProperties(tid);
+}
+draw2d.Start.prototype.getContextMenu=function(){
+	
+	if(this.workflow.disabled)return null;
+	var menu =new draw2d.ContextMenu(100, 50);
+	var data = {event:this};
+	menu.appendMenuItem(new draw2d.ContextMenuItem("Properties", "properties-icon",data,function(x,y)
+	{
+		var data = this.getData();
+		var event = data.event;
+		var tid = event.getId();
+		if(typeof openEventProperties != "undefined"){
+			openEventProperties(tid);
+		}
+	}));
+	
+	return menu;
+};
+draw2d.Start.prototype.toXML=function(){
+	var xml='<startEvent id="'+this.eventId+'" name="'+this.eventName+'" activiti:initiator="'+this.expression+'"></startEvent>\n';
+	return xml;
+};
+draw2d.Start.prototype.toBpmnDI=function(){
+	var w=this.getWidth();
+	var h=this.getHeight();
+	var x=this.getAbsoluteX();
+	var y=this.getAbsoluteY();
+	var xml='<bpmndi:BPMNShape bpmnElement="'+this.eventId+'" id="BPMNShape_'+this.eventId+'">\n';
+	xml=xml+'<omgdc:Bounds height="'+h+'" width="'+w+'" x="'+x+'" y="'+y+'"/>\n';
+	xml=xml+'</bpmndi:BPMNShape>\n';
+	return xml;
+};	
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/gateway/ExclusiveGateway.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/gateway/ExclusiveGateway.js
new file mode 100644
index 0000000..d0de3c4
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/gateway/ExclusiveGateway.js
@@ -0,0 +1,101 @@
+draw2d.ExclusiveGateway=function(_url){
+	_url="js/designer/icons/type.gateway.exclusive.png";
+	draw2d.ResizeImage.call(this,_url);
+	this.rightOutputPort=null;
+	this.leftOutputPort=null;
+	this.topOutputPort=null;
+	this.bottomOutputPort=null;
+	this.gatewayId=null;
+	this.gatewayName=null;
+	this.setDimension(40,40);
+};
+draw2d.ExclusiveGateway.prototype=new draw2d.Node();
+draw2d.ExclusiveGateway.prototype.type="draw2d.ExclusiveGateway";
+draw2d.ExclusiveGateway.prototype.generateId=function(){
+	this.id="exclusiveGateway"+Sequence.create();
+	this.gatewayId=this.id;
+	this.gatewayName=this.id;
+};
+draw2d.ExclusiveGateway.prototype.createHTMLElement=function(){
+	var item = draw2d.ResizeImage.prototype.createHTMLElement.call(this);
+	return item;
+};
+draw2d.ExclusiveGateway.prototype.setDimension=function(w, h){
+	draw2d.ResizeImage.prototype.setDimension.call(this, w, h);
+};
+draw2d.ExclusiveGateway.prototype.setWorkflow=function(_4fe5){
+	draw2d.ResizeImage.prototype.setWorkflow.call(this,_4fe5);
+	this.resizeable=false;//涓嶈鏀瑰彉澶у皬
+	if(_4fe5!==null&&this.rightOutputPort===null){
+		this.rightOutputPort=new draw2d.MyOutputPort();
+		this.rightOutputPort.setMaxFanOut(1);
+		this.rightOutputPort.setWorkflow(_4fe5);
+		this.rightOutputPort.setName("rightOutputPort");
+		//this.rightOutputPort.setBackgroundColor(new draw2d.Color(245,115,115));
+		this.addPort(this.rightOutputPort,this.width,this.height/2);
+	}
+	if(_4fe5!==null&&this.leftOutputPort===null){
+		this.leftOutputPort=new draw2d.MyOutputPort();
+		this.leftOutputPort.setMaxFanOut(1);
+		this.leftOutputPort.setWorkflow(_4fe5);
+		this.leftOutputPort.setName("leftOutputPort");
+		//this.leftOutputPort.setBackgroundColor(new draw2d.Color(245,115,115));
+		this.addPort(this.leftOutputPort,0,this.height/2);
+	}
+	if(_4fe5!==null&&this.topOutputPort===null){
+		this.topOutputPort=new draw2d.MyOutputPort();
+		this.topOutputPort.setMaxFanOut(1);
+		this.topOutputPort.setWorkflow(_4fe5);
+		this.topOutputPort.setName("topOutputPort");
+		//this.topOutputPort.setBackgroundColor(new draw2d.Color(245,115,115));
+		this.addPort(this.topOutputPort,this.width/2,0);
+	}
+	if(_4fe5!==null&&this.bottomOutputPort===null){
+		this.bottomOutputPort=new draw2d.MyOutputPort();
+		this.bottomOutputPort.setMaxFanOut(1);
+		this.bottomOutputPort.setWorkflow(_4fe5);
+		this.bottomOutputPort.setName("bottomOutputPort");
+		//this.bottomOutputPort.setBackgroundColor(new draw2d.Color(245,115,115));
+		this.addPort(this.bottomOutputPort,this.width/2,this.height);
+	}
+};
+draw2d.ExclusiveGateway.prototype.figureDoubleClick=function(){
+	var data = {event:this};
+	var event = data.event;
+	var tid = event.getId();
+	openGatewayProperties(tid);
+}
+draw2d.ExclusiveGateway.prototype.getContextMenu=function(){
+	if(this.workflow.disabled)return null;
+	var menu =new draw2d.ContextMenu(100, 50);
+	var data = {event:this};
+	menu.appendMenuItem(new draw2d.ContextMenuItem("Properties", "properties-icon",data,function(x,y)
+	{
+		var data = this.getData();
+		var event = data.event;
+		var tid = event.getId();
+		if(typeof openGatewayProperties != "undefined"){
+			openGatewayProperties(tid);
+		}
+	}));
+	
+	return menu;
+};
+draw2d.ExclusiveGateway.prototype.toXML=function(){
+	var name = this.gatewayId;
+	var newName = trim(this.gatewayName);
+	if(newName != null && newName != "")
+		name = newName;
+	var xml='<exclusiveGateway id="'+this.gatewayId+'" name="'+name+'"></exclusiveGateway>\n';
+	return xml;
+};
+draw2d.ExclusiveGateway.prototype.toBpmnDI=function(){
+	var w=this.getWidth();
+	var h=this.getHeight();
+	var x=this.getAbsoluteX();
+	var y=this.getAbsoluteY();
+	var xml='<bpmndi:BPMNShape bpmnElement="'+this.gatewayId+'" id="BPMNShape_'+this.gatewayId+'">\n';
+	xml=xml+'<omgdc:Bounds height="'+h+'" width="'+w+'" x="'+x+'" y="'+y+'"/>\n';
+	xml=xml+'</bpmndi:BPMNShape>\n';
+	return xml;
+};	
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/gateway/ParallelGateway.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/gateway/ParallelGateway.js
new file mode 100644
index 0000000..b0b25df
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/gateway/ParallelGateway.js
@@ -0,0 +1,103 @@
+draw2d.ParallelGateway=function(_url){
+	_url="js/designer/icons/type.gateway.parallel.png";
+	draw2d.ResizeImage.call(this,_url);
+	this.rightOutputPort=null;
+	this.leftOutputPort=null;
+	this.topOutputPort=null;
+	this.bottomOutputPort=null;
+	this.gatewayId=null;
+	this.gatewayName=null;
+	this.setDimension(40,40);
+};
+
+draw2d.ParallelGateway.prototype=new draw2d.Node();
+draw2d.ParallelGateway.prototype.type="draw2d.ParallelGateway";
+draw2d.ParallelGateway.prototype.generateId=function(){
+	this.id="parallelGateway"+Sequence.create();
+	this.gatewayId=this.id;
+	this.gatewayName=this.id;
+};
+draw2d.ParallelGateway.prototype.createHTMLElement=function(){
+	var item = draw2d.ResizeImage.prototype.createHTMLElement.call(this);
+	return item;
+};
+draw2d.ParallelGateway.prototype.setDimension=function(w, h){
+	draw2d.ResizeImage.prototype.setDimension.call(this, w, h);
+};
+draw2d.ParallelGateway.prototype.setWorkflow=function(_4fe5){
+	draw2d.ResizeImage.prototype.setWorkflow.call(this,_4fe5);
+	this.resizeable=false;//涓嶈鏀瑰彉澶у皬
+	if(_4fe5!==null&&this.rightOutputPort===null){
+		this.rightOutputPort=new draw2d.MyOutputPort();
+		this.rightOutputPort.setMaxFanOut(1);
+		this.rightOutputPort.setWorkflow(_4fe5);
+		this.rightOutputPort.setName("rightOutputPort");
+		//this.rightOutputPort.setBackgroundColor(new draw2d.Color(245,115,115));
+		this.addPort(this.rightOutputPort,this.width,this.height/2);
+	}
+	if(_4fe5!==null&&this.leftOutputPort===null){
+		this.leftOutputPort=new draw2d.MyOutputPort();
+		this.leftOutputPort.setMaxFanOut(1);
+		this.leftOutputPort.setWorkflow(_4fe5);
+		this.leftOutputPort.setName("leftOutputPort");
+		//this.leftOutputPort.setBackgroundColor(new draw2d.Color(245,115,115));
+		this.addPort(this.leftOutputPort,0,this.height/2);
+	}
+	if(_4fe5!==null&&this.topOutputPort===null){
+		this.topOutputPort=new draw2d.MyOutputPort();
+		this.topOutputPort.setMaxFanOut(1);
+		this.topOutputPort.setWorkflow(_4fe5);
+		this.topOutputPort.setName("topOutputPort");
+		//this.topOutputPort.setBackgroundColor(new draw2d.Color(245,115,115));
+		this.addPort(this.topOutputPort,this.width/2,0);
+	}
+	if(_4fe5!==null&&this.bottomOutputPort===null){
+		this.bottomOutputPort=new draw2d.MyOutputPort();
+		this.bottomOutputPort.setMaxFanOut(1);
+		this.bottomOutputPort.setWorkflow(_4fe5);
+		this.bottomOutputPort.setName("bottomOutputPort");
+		//this.bottomOutputPort.setBackgroundColor(new draw2d.Color(245,115,115));
+		this.addPort(this.bottomOutputPort,this.width/2,this.height);
+	}
+};
+
+draw2d.ParallelGateway.prototype.figureDoubleClick=function(){
+	var data = {event:this};
+	var event = data.event;
+	var tid = event.getId();
+	openGatewayProperties(tid);
+}
+draw2d.ParallelGateway.prototype.getContextMenu=function(){
+	if(this.workflow.disabled)return null;
+	var menu =new draw2d.ContextMenu(100, 50);
+	var data = {event:this};
+	menu.appendMenuItem(new draw2d.ContextMenuItem("Properties", "properties-icon",data,function(x,y)
+	{
+		var data = this.getData();
+		var event = data.event;
+		var tid = event.getId();
+		if(typeof openGatewayProperties != "undefined"){
+			openGatewayProperties(tid);
+		}
+	}));
+	
+	return menu;
+};
+draw2d.ParallelGateway.prototype.toXML=function(){
+	var name = this.gatewayId;
+	var newName = trim(this.gatewayName);
+	if(newName != null && newName != "")
+		name = newName;
+	var xml='<parallelGateway id="'+this.gatewayId+'" name="'+name+'"></parallelGateway>\n';
+	return xml;
+};
+draw2d.ParallelGateway.prototype.toBpmnDI=function(){
+	var w=this.getWidth();
+	var h=this.getHeight();
+	var x=this.getAbsoluteX();
+	var y=this.getAbsoluteY();
+	var xml='<bpmndi:BPMNShape bpmnElement="'+this.gatewayId+'" id="BPMNShape_'+this.gatewayId+'">\n';
+	xml=xml+'<omgdc:Bounds height="'+h+'" width="'+w+'" x="'+x+'" y="'+y+'"/>\n';
+	xml=xml+'</bpmndi:BPMNShape>\n';
+	return xml;
+};	
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/img/circle.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/img/circle.png
new file mode 100644
index 0000000..e9170a5
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/img/circle.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/img/grid_10.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/img/grid_10.png
new file mode 100644
index 0000000..bcfe401
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/img/grid_10.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/img/manual-task.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/img/manual-task.png
new file mode 100644
index 0000000..58cca66
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/img/manual-task.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/img/menu.gif b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/img/menu.gif
new file mode 100644
index 0000000..30a2c4b
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/img/menu.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/img/menu_sep.png b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/img/menu_sep.png
new file mode 100644
index 0000000..37b07e6
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/img/menu_sep.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/task/BaseTask.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/task/BaseTask.js
new file mode 100644
index 0000000..0837b74
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/task/BaseTask.js
@@ -0,0 +1,52 @@
+draw2d.BaseTask=function(_url){
+draw2d.ResizeImage.call(this,_url);
+	this.outputPort = null;
+	this.inputPort = null;
+	this.setDimension(120,60);
+};
+draw2d.BaseTask.prototype=new draw2d.ResizeImage();
+draw2d.BaseTask.prototype.type="BaseTask";
+draw2d.BaseTask.prototype.createHTMLElement=function(){
+	var item = draw2d.ResizeImage.prototype.createHTMLElement.call(this);
+	this.textarea = document.createElement("div");
+	this.textarea.className="task-textarea";
+	this.textarea.style.position = "absolute";
+	//this.textarea.style.zIndex = "" + draw2d.Figure.ZOrderBaseIndex;
+	this.textarea.style.left = "0px";
+	this.textarea.style.top = "0px";
+	item.appendChild(this.textarea);
+	return item;
+};
+draw2d.BaseTask.prototype.setDimension=function(w, h){
+	try{
+		draw2d.ResizeImage.prototype.setDimension.call(this, w, h);
+		this.textarea.style.left = (this.width/10)+"px";
+		this.textarea.style.top = (this.height/3)+"px";
+		this.textarea.style.width = (this.width - 20) + "px";
+		this.textarea.style.height = (this.height - 40)+ "px";
+		if (this.outputPort !== null) {
+			this.outputPort.setPosition(this.width + 5, this.height / 2);
+		}
+		if (this.inputPort !== null) {
+			this.inputPort.setPosition(-5, this.height / 2);
+		}
+	}catch(e){
+	}
+};
+draw2d.BaseTask.prototype.setWorkflow=function(_5019){
+	draw2d.ResizeImage.prototype.setWorkflow.call(this,_5019);
+	if (_5019 !== null && this.inputPort === null) {
+		this.inputPort = new draw2d.MyInputPort();
+		this.inputPort.setWorkflow(_5019);
+		this.inputPort.setName("input");
+		this.addPort(this.inputPort, -5, this.height / 2);
+		this.outputPort = new draw2d.MyOutputPort();
+		this.outputPort.setMaxFanOut(5);
+		this.outputPort.setWorkflow(_5019);
+		this.outputPort.setName("output");
+		this.addPort(this.outputPort, this.width + 5, this.height / 2);
+	}
+};
+draw2d.BaseTask.prototype.setContent = function(_5014) {
+	this.textarea.innerHTML=_5014;
+};
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/task/ManualTask.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/task/ManualTask.js
new file mode 100644
index 0000000..4309802
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/task/ManualTask.js
@@ -0,0 +1,132 @@
+draw2d.ManualTask=function(){
+	draw2d.Task.call(this);
+	this.setTitle("Manual Task");
+	this.setIcon();
+};
+draw2d.ManualTask.prototype=new draw2d.Task();
+draw2d.ManualTask.prototype.type="draw2d.ManualTask";
+
+draw2d.ManualTask.newInstance=function(manualTaskXMLNode){
+	var task = new draw2d.ManualTask();
+	task.id=manualTaskXMLNode.attr('id');
+	task.taskId=manualTaskXMLNode.attr('id');
+	task.taskName=manualTaskXMLNode.attr('name');
+	task.setContent(manualTaskXMLNode.attr('name'));
+	return task;
+};
+
+draw2d.ManualTask.prototype.setWorkflow=function(_5019){
+	draw2d.Task.prototype.setWorkflow.call(this,_5019);
+};
+draw2d.ManualTask.prototype.getContextMenu=function(){
+	var menu = draw2d.Task.prototype.getContextMenu.call(this);
+  return menu;
+};
+draw2d.ManualTask.prototype.setIcon = function(){
+	var icon=draw2d.Task.prototype.setIcon.call(this);
+	icon.className="manual-task-icon";
+};
+
+draw2d.ManualTask.prototype.getStartElementXML=function(){
+	var name = this.taskId;
+	var taskName = trim(this.taskName);
+	if(taskName != null && taskName != "")
+		name = taskName;
+	var xml='<manualTask id="'+this.taskId+'" name="'+name+'" ';
+	if(this.isUseExpression){
+		if(this.performerType=='assignee'){
+			xml=xml+'activiti:assignee="'+this.expression+'" ';
+		}else if(this.performerType=='candidateUsers'){
+			xml=xml+'activiti:candidateUsers="'+this.expression+'" ';
+		}else if(this.performerType=='candidateGroups'){
+			xml=xml+'activiti:candidateGroups="'+this.expression+'" ';
+		}
+	}
+	if(this.formKey != null && this.formKey != ""){
+		xml=xml+'activiti:formKey="'+this.formKey+'" ';
+	}
+	xml=xml+'>\n';
+	return xml;
+};
+draw2d.ManualTask.prototype.getEndElementXML=function(){
+	var xml = '</manualTask>\n';
+	return xml;
+};
+
+draw2d.ManualTask.prototype.getDocumentationXML=function(){
+	if(this.documentation==null||this.documentation=='')return '';
+	var xml='<documentation>';
+	xml=xml+this.documentation;
+	xml=xml+'</documentation>';
+	return xml;
+};
+draw2d.ManualTask.prototype.getExtensionElementsXML=function(){
+	if(this.listeners.getSize()==0)return '';
+	var xml = '<extensionElements>\n';
+	xml=xml+this.getListenersXML();
+	xml=xml+'</extensionElements>\n';
+	return xml;
+};
+draw2d.ManualTask.prototype.getListenersXML=function(){
+	var xml = '';
+	for(var i=0;i<this.listeners.getSize();i++){
+		var listener = this.listeners.get(i);
+		xml=xml+listener.toXML();
+	}
+	return xml;
+};
+draw2d.ManualTask.prototype.getPerformersBPMNXML=function(){
+	var xml = '';
+	if(this.performerType=='candidateUsers'){
+		if(this.candidateUsers.getSize()!=0){
+			xml=xml+'<potentialOwner>\n';
+			xml=xml+'<resourceAssignmentExpression>\n';
+			xml=xml+'<formalExpression>\n';
+			xml=xml+'<![CDATA[';
+			for(var i=0;i<this.candidateUsers.getSize();i++){
+				var user = this.candidateUsers.get(i);
+				xml=xml+'user('+user.sso+'),';
+			}
+			xml=xml.substring(0, xml.length-1);
+			xml=xml+']]>\n';
+			xml=xml+'</formalExpression>\n';
+			xml=xml+'</resourceAssignmentExpression>\n';
+			xml=xml+'</potentialOwner>\n';
+		}
+	}else if(this.performerType=='candidateGroups'){
+		if(this.candidateGroups.getSize()!=0){
+			xml=xml+'<potentialOwner>\n';
+			xml=xml+'<resourceAssignmentExpression>\n';
+			xml=xml+'<formalExpression>\n';
+			xml=xml+'<![CDATA[';
+			for(var i=0;i<this.candidateGroups.getSize();i++){
+				var group = this.candidateGroups.get(i);
+				xml=xml+'group('+group+'),';
+			}
+			xml=xml.substring(0, xml.length-1);
+			xml=xml+']]>\n';
+			xml=xml+'</formalExpression>\n';
+			xml=xml+'</resourceAssignmentExpression>\n';
+			xml=xml+'</potentialOwner>\n';
+		}
+	}
+	return xml;
+};
+draw2d.ManualTask.prototype.toXML=function(){
+	var xml=this.getStartElementXML();
+	xml=xml+this.getDocumentationXML();
+	xml=xml+this.getExtensionElementsXML();
+	xml=xml+this.getPerformersBPMNXML();
+	xml=xml+this.getEndElementXML();
+	return xml;
+};
+draw2d.ManualTask.prototype.toBpmnDI=function(){
+	var w=this.getWidth();
+	var h=this.getHeight();
+	var x=this.getAbsoluteX();
+	var y=this.getAbsoluteY();
+	var xml='<bpmndi:BPMNShape bpmnElement="'+this.taskId+'" id="BPMNShape_'+this.taskId+'">\n';
+	xml=xml+'<omgdc:Bounds height="'+h+'" width="'+w+'" x="'+x+'" y="'+y+'"/>\n';
+	xml=xml+'</bpmndi:BPMNShape>\n';
+	return xml;
+};
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/task/ServiceTask.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/task/ServiceTask.js
new file mode 100644
index 0000000..e7c3c87
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/task/ServiceTask.js
@@ -0,0 +1,179 @@
+draw2d.ServiceTask=function(){
+	draw2d.Task.call(this);
+	this.setTitle("鏈嶅姟浠诲姟");
+	this.setIcon();
+};
+draw2d.ServiceTask.prototype=new draw2d.Task();
+draw2d.ServiceTask.prototype.type="draw2d.ServiceTask";
+draw2d.ServiceTask.newInstance=function(serviceTaskXMLNode){
+	var task = new draw2d.ServiceTask();
+	task.id=serviceTaskXMLNode.attr('id');
+	task.taskId=serviceTaskXMLNode.attr('id');
+	task.taskName=serviceTaskXMLNode.attr('name');
+	task.setContent(serviceTaskXMLNode.attr('name'));
+	return task;
+};
+draw2d.ServiceTask.prototype.setWorkflow=function(_5019){
+	draw2d.Task.prototype.setWorkflow.call(this,_5019);
+};
+draw2d.ServiceTask.prototype.getContextMenu=function(){
+	var menu = draw2d.Task.prototype.getContextMenu.call(this);
+  return menu;
+};
+draw2d.ServiceTask.prototype.setIcon = function(){
+	var icon=draw2d.Task.prototype.setIcon.call(this);
+	icon.className="user-task-icon";
+};
+draw2d.ServiceTask.prototype.getStartElementXML=function(){
+
+	var name = this.taskId;  
+	var taskName = trim(this.taskName);
+	if(taskName != null && taskName != "")
+		name = taskName;
+	var xml='<serviceTask id="'+this.taskId+'" name="'+name+'" ';
+	if(this.isUseExpression){
+		if(this.performerType=='assignee'){
+			xml=xml+'activiti:assignee="'+this.expression+'" ';
+		}else if(this.performerType=='candidateUsers'){
+			xml=xml+'activiti:candidateUsers="'+this.expression+'" ';
+		}else if(this.performerType=='candidateGroups'){
+			xml=xml+'activiti:candidateGroups="'+this.expression+'" ';
+		}
+	}
+	if(this.formKey != null && this.formKey != ""){
+		xml=xml+'activiti:formKey="'+this.formKey+'" ';
+	}
+	xml=xml+'>\n';
+	return xml;
+};
+draw2d.ServiceTask.prototype.getEndElementXML=function(){
+	var xml = '</serviceTask>\n';
+	return xml;
+};
+draw2d.ServiceTask.prototype.getDocumentationXML=function(){
+	if(this.documentation==null||this.documentation=='')return '';
+	var xml='<documentation>';
+	xml=xml+this.documentation;
+	xml=xml+'</documentation>';
+	
+	return xml;
+};
+draw2d.ServiceTask.prototype.getExtensionElementsXML=function(){
+	
+	if(this.listeners.getSize()==0)return '';
+	var xml = '<extensionElements>\n';
+	var x = this.getListenersXML();
+	x = x.replace('event="undefined"','');
+	xml=xml+x;
+	
+	xml=xml+'</extensionElements>\n';
+
+	return xml;
+};
+draw2d.ServiceTask.prototype.getListenersXML=function(){
+	var xml = '';  
+
+	for(var i=0;i<this.listeners.getSize();i++){
+		var listener = this.listeners.get(i);
+	//	alert(listener.toXML()+"#####");
+		var x = listener.toXML();
+		x = x.replace('event="create"','');
+	//	alert(x); 
+		xml=xml+x;
+	
+		break;  
+	}
+	return xml;
+};
+draw2d.ServiceTask.prototype.getPerformersBPMNXML=function(){
+	var xml = '';
+	if(this.performerType=='candidateUsers'){
+		if(this.candidateUsers.getSize()!=0){
+			xml=xml+'<potentialOwner>\n';
+			xml=xml+'<resourceAssignmentExpression>\n';
+			xml=xml+'<formalExpression>\n';
+			xml=xml+'<![CDATA[';
+			for(var i=0;i<this.candidateUsers.getSize();i++){
+				var user = this.candidateUsers.get(i);
+				xml=xml+'user('+user.sso+'),';
+			}
+			xml=xml.substring(0, xml.length-1);
+			xml=xml+']]>\n';
+			xml=xml+'</formalExpression>\n';
+			xml=xml+'</resourceAssignmentExpression>\n';
+			xml=xml+'</potentialOwner>\n';
+		}
+	}else if(this.performerType=='candidateGroups'){
+		if(this.candidateGroups.getSize()!=0){
+			xml=xml+'<potentialOwner>\n';
+			xml=xml+'<resourceAssignmentExpression>\n';
+			xml=xml+'<formalExpression>\n';
+			xml=xml+'<![CDATA[';
+			for(var i=0;i<this.candidateGroups.getSize();i++){
+				var group = this.candidateGroups.get(i);
+				xml=xml+'group('+group+'),';
+			}
+			xml=xml.substring(0, xml.length-1);
+			xml=xml+']]>\n';
+			xml=xml+'</formalExpression>\n';
+			xml=xml+'</resourceAssignmentExpression>\n';
+			xml=xml+'</potentialOwner>\n';
+		}
+	}
+	return xml;
+};
+draw2d.ServiceTask.prototype.toXML=function(){
+	var xml=this.getStartElementXML();
+	xml=xml+this.getDocumentationXML();
+	xml=xml+this.getExtensionElementsXML();
+	xml=xml+this.getPerformersBPMNXML();
+	xml=xml+this.getEndElementXML();
+//	alert(xml);
+//	alert(xml);
+	//<activiti:taskListener
+	var s = xml.indexOf("<activiti:taskListener");
+	var e = xml.lastIndexOf("</activiti:taskListener>");
+	var str = xml.substring(s, e);
+	
+	var xs = str.substring(str.indexOf('"'), str.indexOf('>'));
+	//alert(xs);
+	//alert(str);
+
+	var ms = str.substring(str.indexOf('>')+1, str.lastIndexOf('>')+1);
+	//alert("@"+ms);
+	//str.indexOf("class")
+	
+	
+	var i = xml.indexOf(">");
+	var xm = xml.substring(0, i);
+	
+	//alert(this.expression);
+	//alert(xs);
+	//if(xs=="null"){
+	//		alert(22);
+//	alert(this.expression);
+//	alert(xs);
+	var k = xs.split('"');
+//	alert(k.length);
+	if(k.length!=3){
+	xs = '"'+this.expression+'"';
+	}
+	//} 
+	if(ms!=""){
+		xm+='activiti:class='+xs+'><extensionElements>'+ms+'</extensionElements> </serviceTask>';
+	}else{
+		xm+='activiti:class='+xs+'>'+ms+'</serviceTask>';
+		
+	}
+	return xm;
+};
+draw2d.ServiceTask.prototype.toBpmnDI=function(){
+	var w=this.getWidth();
+	var h=this.getHeight();
+	var x=this.getAbsoluteX();
+	var y=this.getAbsoluteY();
+	var xml='<bpmndi:BPMNShape bpmnElement="'+this.taskId+'" id="BPMNShape_'+this.taskId+'">\n';
+	xml=xml+'<omgdc:Bounds height="'+h+'" width="'+w+'" x="'+x+'" y="'+y+'"/>\n';
+	xml=xml+'</bpmndi:BPMNShape>\n';
+	return xml;
+};
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/task/Task.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/task/Task.js
new file mode 100644
index 0000000..8ae99b3
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/task/Task.js
@@ -0,0 +1,311 @@
+draw2d.Task = function() {
+	this.cornerWidth = 15;
+	this.cornerHeight = 15;
+	this.rightOutputPort = null;
+	this.bottomOutputPort = null;
+	this.topOutputPort = null;
+	this.leftOutputPort = null;
+	draw2d.Node.call(this);
+	this.setDimension(120,60);
+	this.originalHeight = -1;
+	this.taskId=null;
+	this.taskName=null;
+	this.performerType=null;
+	this.isUseExpression=false;
+	this.expression=null;
+	this.formKey = null;
+	this.documentation=null;
+	this.listeners=new draw2d.ArrayList();
+	this.candidateUsers=new draw2d.ArrayList();
+	this.candidateGroups=new draw2d.ArrayList();
+};
+draw2d.Task.prototype = new draw2d.Node();
+draw2d.Task.prototype.type = "Task";
+draw2d.Task.prototype.generateId=function(){
+	this.id="task"+Sequence.create();
+	this.taskId=this.id;
+	this.taskName=this.id;
+};
+
+draw2d.Task.prototype.figureDoubleClick=function(){
+	var data = {event:this};
+	var event = data.event;
+	var tid = event.getId();
+	openTaskProperties(tid);
+}
+draw2d.Task.prototype.createHTMLElement = function() {
+	var item = document.createElement("div");
+	item.id = this.id;
+	item.style.position = "absolute";
+	item.style.left = this.x + "px";
+	item.style.top = this.y + "px";
+	item.style.height = this.width + "px";
+	item.style.width = this.height + "px";
+	item.className="task";
+	item.style.zIndex = "" + draw2d.Figure.ZOrderBaseIndex;
+	
+	this.top_left = document.createElement("div");
+	this.top_left.className="task-top-left";
+	this.top_left.style.width = this.cornerWidth + "px";
+	this.top_left.style.height = this.cornerHeight + "px";
+	
+	this.top_right = document.createElement("div");
+	this.top_right.className="task-top-right";
+	this.top_right.style.width = this.cornerWidth + "px";
+	this.top_right.style.height = this.cornerHeight + "px";
+	
+	this.bottom_left = document.createElement("div");
+	this.bottom_left.className="bottom-top-left";
+	this.bottom_left.style.width = this.cornerWidth + "px";
+	this.bottom_left.style.height = this.cornerHeight + "px";
+	
+	this.bottom_right = document.createElement("div");
+	this.bottom_right.className="bottom-top-right";
+	this.bottom_right.style.width = this.cornerWidth + "px";
+	this.bottom_right.style.height = this.cornerHeight + "px";
+	
+	this.header = document.createElement("div");
+	this.header.className="task-header";
+	this.header.style.position = "absolute";
+	this.header.style.left = this.cornerWidth + "px";
+	this.header.style.top = "0px";
+	this.header.style.height = (this.cornerHeight) + "px";
+	this.disableTextSelection(this.header);
+	
+	this.footer = document.createElement("div");
+	this.footer.className="task-footer";
+	this.footer.style.position = "absolute";
+	this.footer.style.left = this.cornerWidth + "px";
+	this.footer.style.top = "0px";
+	this.footer.style.height = (this.cornerHeight - 1) + "px";
+	
+	this.textarea = document.createElement("div");
+	this.textarea.className="task-textarea";
+	this.textarea.style.position = "absolute";
+	this.textarea.style.left = "0px";
+	this.textarea.style.top = this.cornerHeight + "px";
+	this.disableTextSelection(this.textarea);
+	
+	item.appendChild(this.top_left);
+	item.appendChild(this.header);
+	item.appendChild(this.top_right);
+	item.appendChild(this.textarea);
+	item.appendChild(this.bottom_left);
+	item.appendChild(this.footer);
+	item.appendChild(this.bottom_right);
+	
+	return item;
+};
+draw2d.Task.prototype.setDimension = function(w, h) {
+	try{
+		draw2d.Node.prototype.setDimension.call(this, w, h);
+		if (this.top_left !== null) {
+			this.top_right.style.left = (this.width - this.cornerWidth) + "px";
+			this.bottom_right.style.left = (this.width - this.cornerWidth) + "px";
+			this.bottom_right.style.top = (this.height - this.cornerHeight) + "px";
+			this.bottom_left.style.top = (this.height - this.cornerHeight) + "px";
+			this.textarea.style.width = (this.width - 2) + "px";
+			this.textarea.style.height = (this.height - this.cornerHeight * 2)
+					+ "px";
+			this.header.style.width = (this.width - this.cornerWidth * 2) + "px";
+			this.footer.style.width = (this.width - this.cornerWidth * 2) + "px";
+			this.footer.style.top = (this.height - this.cornerHeight) + "px";
+		}
+		if (this.rightOutputPort !== null) {
+			this.rightOutputPort.setPosition(this.width + 5, this.height / 2);
+		}
+		if (this.bottomOutputPort !== null) {
+			this.bottomOutputPort.setPosition(this.width/2, this.height + 5);
+		}
+		if (this.leftOutputPort !== null) {
+			this.leftOutputPort.setPosition(-5, this.height / 2);
+		}
+		if (this.topOutputPort !== null) {
+			this.topOutputPort.setPosition(this.width/2, -5);
+		}
+	}catch(e){
+	}
+};
+draw2d.Task.prototype.setTitle = function(title) {
+
+	this.header.innerHTML = title;
+	
+};
+draw2d.Task.prototype.setContent = function(_5014) {
+	this.textarea.innerHTML = _5014;
+};
+draw2d.Task.prototype.onDragstart = function(x, y) {
+	var _5017 = draw2d.Node.prototype.onDragstart.call(this, x, y);
+	if (this.header === null) {
+		return false;
+	}
+	if (y < this.cornerHeight && x < this.width
+			&& x > (this.width - this.cornerWidth)) {
+		this.toggle();
+		return false;
+	}
+	if (this.originalHeight == -1) {
+		if (this.canDrag === true && x < parseInt(this.header.style.width)
+				&& y < parseInt(this.header.style.height)) {
+			return true;
+		}
+	} else {
+		return _5017;
+	}
+};
+draw2d.Task.prototype.setCanDrag = function(flag) {
+	draw2d.Node.prototype.setCanDrag.call(this, flag);
+	this.html.style.cursor = "";
+	if (this.header === null) {
+		return;
+	}
+	if (flag) {
+		this.header.style.cursor = "move";
+	} else {
+		this.header.style.cursor = "";
+	}
+};
+draw2d.Task.prototype.setWorkflow = function(_5019) {
+	draw2d.Node.prototype.setWorkflow.call(this, _5019);
+	if (_5019 !== null && this.leftOutputPort === null) {
+		this.leftOutputPort = new draw2d.MyOutputPort();
+		this.leftOutputPort.setWorkflow(_5019);
+		this.leftOutputPort.setName("leftOutputPort");
+		this.addPort(this.leftOutputPort, -5, this.height / 2);
+		
+		this.topOutputPort = new draw2d.MyOutputPort();
+		this.topOutputPort.setWorkflow(_5019);
+		this.topOutputPort.setName("topOutputPort");
+		this.addPort(this.topOutputPort, this.width/2, -5);
+		
+		this.rightOutputPort = new draw2d.MyOutputPort();
+		this.rightOutputPort.setMaxFanOut(5);
+		this.rightOutputPort.setWorkflow(_5019);
+		this.rightOutputPort.setName("rightOutputPort");
+		this.addPort(this.rightOutputPort, this.width + 5, this.height / 2);
+		
+		this.bottomOutputPort = new draw2d.MyOutputPort();
+		this.bottomOutputPort.setMaxFanOut(5);
+		this.bottomOutputPort.setWorkflow(_5019);
+		this.bottomOutputPort.setName("bottomOutputPort");
+		this.addPort(this.bottomOutputPort, this.width/2, this.height + 5);
+	}
+};
+draw2d.Task.prototype.toggle = function() {
+	if (this.originalHeight == -1) {
+		this.originalHeight = this.height;
+		this.setDimension(this.width, this.cornerHeight * 2);
+		this.setResizeable(false);
+	} else {
+		this.setDimension(this.width, this.originalHeight);
+		this.originalHeight = -1;
+		this.setResizeable(true);
+	}
+};
+/*
+draw2d.Task.prototype.onDoubleClick=function(){
+	var tid = this.getId();
+	openTaskProperties(tid);
+};
+*/
+draw2d.Task.prototype.getContextMenu=function(){
+	if(this.workflow.disabled)return null;
+	var menu =new draw2d.ContextMenu(100, 50);
+	var data = {task:this};
+	menu.appendMenuItem(new draw2d.ContextMenuItem("Properties", "properties-icon",data,function(x,y)
+	{
+		var data = this.getData();
+		var task = data.task;
+		var tid = task.getId();
+		if(typeof openTaskProperties != "undefined"){
+			openTaskProperties(tid);
+		}
+	}));
+	menu.appendMenuItem(new draw2d.ContextMenuItem("Delete", "icon-remove",data,function(x,y)
+	{
+		var data = this.getData();
+		var task = data.task;
+		var tid = task.getId();
+		var wf = task.getWorkflow();
+		wf.getCommandStack().execute(new draw2d.CommandDelete(task));
+		//wf.removeFigure(task);
+	}));
+	
+	return menu;
+};
+draw2d.Task.prototype.setIcon = function(){
+	this.icon = document.createElement("div");
+	this.icon.style.position = "absolute";
+	this.icon.style.width = this.cornerWidth + "px";
+	this.icon.style.height = this.cornerHeight + "px";
+	this.icon.style.left = "10px";
+	this.icon.style.top = "2px";
+	this.getHTMLElement().appendChild(this.icon);
+	return this.icon;
+};
+draw2d.Task.prototype.getListener=function(id){
+	for(var i=0;i<this.listeners.getSize();i++){
+		var listener = this.listeners.get(i);
+		if(listener.getId()=== id){
+			return listener;
+		}
+	}
+};
+draw2d.Task.prototype.deleteListener=function(id){
+	var listener = this.getListener(id);
+	this.listeners.remove(listener);
+};
+draw2d.Task.prototype.addListener=function(listener){
+	this.listeners.add(listener);
+};
+draw2d.Task.prototype.setListeners=function(listeners){
+	this.listeners = listeners;
+};
+draw2d.Task.prototype.getCandidateUser=function(sso){
+	for(var i=0;i<this.candidateUsers.getSize();i++){
+		var candidate = this.candidateUsers.get(i);
+		if(candidate.sso===sso){
+			return candidate;
+		}
+	}
+	return null;
+};
+draw2d.Task.prototype.deleteCandidateUser=function(sso){
+	var candidate = this.getCandidateUser(sso);
+	this.candidateUsers.remove(candidate);
+};
+draw2d.Task.prototype.addCandidateUser=function(user){
+	if(this.getCandidateUser(user.sso)==null){
+		this.candidateUsers.add(user);
+	}
+};
+draw2d.Task.prototype.getCandidateGroup=function(id){
+	for(var i=0;i<this.candidateGroups.getSize();i++){
+		var candidate = this.candidateGroups.get(i);
+		if(candidate.id===id){
+			return candidate;
+		}
+	}
+	return null;
+};
+draw2d.Task.prototype.deleteCandidateGroup=function(id){
+	var candidate = this.getCandidateGroup(id);
+	this.candidateGroups.remove(candidate);
+};
+draw2d.Task.prototype.addCandidateGroup=function(name){
+	if(!this.candidateGroups.contains(name))
+		this.candidateGroups.add(name);
+};
+draw2d.Task.prototype.setHighlight=function(){
+	this.getHTMLElement().className="task-highlight";
+};
+draw2d.Task.prototype.onMouseEnter=function(){
+	if(typeof onTaskMouseEnter != "undefined"){
+		onTaskMouseEnter(this);
+	}
+};
+draw2d.Task.prototype.onMouseLeave=function(){
+	if(typeof onTaskMouseLeave != "undefined"){
+		onTaskMouseLeave(this);
+	}
+};
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/task/UserTask.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/task/UserTask.js
new file mode 100644
index 0000000..3a20c16
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/process/designer/js/designer/task/UserTask.js
@@ -0,0 +1,139 @@
+draw2d.UserTask=function(){
+	draw2d.Task.call(this);
+	this.setTitle("鐢ㄦ埛浠诲姟");
+	this.setIcon();
+};
+draw2d.UserTask.prototype=new draw2d.Task();
+draw2d.UserTask.prototype.type="draw2d.UserTask";
+draw2d.UserTask.newInstance=function(userTaskXMLNode){
+	var task = new draw2d.UserTask();
+	task.id=userTaskXMLNode.attr('id');
+	task.taskId=userTaskXMLNode.attr('id');
+	task.taskName=userTaskXMLNode.attr('name');
+	task.setContent(userTaskXMLNode.attr('name'));
+	return task;
+};
+draw2d.UserTask.prototype.setWorkflow=function(_5019){
+	draw2d.Task.prototype.setWorkflow.call(this,_5019);
+};
+draw2d.UserTask.prototype.getContextMenu=function(){
+	var menu = draw2d.Task.prototype.getContextMenu.call(this);
+  return menu;
+};
+draw2d.UserTask.prototype.setIcon = function(){
+	var icon=draw2d.Task.prototype.setIcon.call(this);
+	icon.className="user-task-icon";
+};
+draw2d.UserTask.prototype.getStartElementXML=function(){
+	var name = this.taskId;
+	var taskName = trim(this.taskName);
+	if(taskName != null && taskName != "")
+		name = taskName;
+	var xml='<userTask id="'+this.taskId+'" name="'+name+'" ';
+	if(this.isUseExpression){
+		if(this.performerType=='assignee'){
+			xml=xml+'activiti:assignee="'+this.expression+'" ';
+		}else if(this.performerType=='candidateUsers'){
+			xml=xml+'activiti:candidateUsers="'+this.expression+'" ';
+		}else if(this.performerType=='candidateGroups'){
+			xml=xml+'activiti:candidateGroups="'+this.expression+'" ';
+		}
+	}
+	if(this.formKey != null && this.formKey != ""){
+		xml=xml+'activiti:formKey="'+this.formKey+'" ';
+	}
+	xml=xml+'>\n';
+	return xml;
+};
+draw2d.UserTask.prototype.getEndElementXML=function(){
+	var xml = '</userTask>\n';
+	return xml;
+};
+draw2d.UserTask.prototype.getDocumentationXML=function(){
+	if(this.documentation==null||this.documentation=='')return '';
+	var xml='<documentation>';
+	xml=xml+this.documentation;
+	xml=xml+'</documentation>';
+	return xml;
+};
+draw2d.UserTask.prototype.getExtensionElementsXML=function(){
+	if(this.listeners.getSize()==0)return '';
+	var xml = '<extensionElements>\n';
+	xml=xml+this.getListenersXML();
+	xml=xml+'</extensionElements>\n';
+	return xml;
+};
+draw2d.UserTask.prototype.getListenersXML=function(){
+	var xml = '';
+	for(var i=0;i<this.listeners.getSize();i++){
+		var listener = this.listeners.get(i);
+		xml=xml+listener.toXML();
+	}
+	return xml; 
+};
+draw2d.UserTask.prototype.getPerformersBPMNXML=function(){
+	var xml = '';
+	if(this.performerType=='candidateUsers'){
+		if(this.candidateUsers.getSize()!=0){
+			xml=xml+'<potentialOwner>\n';
+			xml=xml+'<resourceAssignmentExpression>\n';
+			xml=xml+'<formalExpression>\n';
+			xml=xml+'<![CDATA[';
+			
+			for(var i=0;i<this.candidateUsers.getSize();i++){
+				var user = this.candidateUsers.get(i);
+				xml=xml+'user('+user.sso+'),';
+				/*
+				var k = user.sso.lastIndexOf('(');
+			
+				if(k!=-1){
+					var s = user.sso.substring(k+1);
+					xml=xml+'user('+s+'),';
+				}else{
+					xml=xml+'user('+user.sso+'),';
+				}
+			    */
+			}
+			xml=xml.substring(0, xml.length-1);
+			xml=xml+']]>\n';
+			xml=xml+'</formalExpression>\n';
+			xml=xml+'</resourceAssignmentExpression>\n';
+			xml=xml+'</potentialOwner>\n';
+		}
+	}else if(this.performerType=='candidateGroups'){
+		if(this.candidateGroups.getSize()!=0){
+			xml=xml+'<potentialOwner>\n';
+			xml=xml+'<resourceAssignmentExpression>\n';
+			xml=xml+'<formalExpression>\n';
+			xml=xml+'<![CDATA[';
+			for(var i=0;i<this.candidateGroups.getSize();i++){
+				var group = this.candidateGroups.get(i);
+				xml=xml+'group('+group.id+'),';
+			}
+			xml=xml.substring(0, xml.length-1);
+			xml=xml+']]>\n';
+			xml=xml+'</formalExpression>\n';
+			xml=xml+'</resourceAssignmentExpression>\n';
+			xml=xml+'</potentialOwner>\n';
+		}
+	}
+	return xml;
+};
+draw2d.UserTask.prototype.toXML=function(){
+	var xml=this.getStartElementXML();
+	xml=xml+this.getDocumentationXML();
+	xml=xml+this.getExtensionElementsXML();
+	xml=xml+this.getPerformersBPMNXML();
+	xml=xml+this.getEndElementXML();
+	return xml;
+};
+draw2d.UserTask.prototype.toBpmnDI=function(){
+	var w=this.getWidth();
+	var h=this.getHeight();
+	var x=this.getAbsoluteX();
+	var y=this.getAbsoluteY();
+	var xml='<bpmndi:BPMNShape bpmnElement="'+this.taskId+'" id="BPMNShape_'+this.taskId+'">\n';
+	xml=xml+'<omgdc:Bounds height="'+h+'" width="'+w+'" x="'+x+'" y="'+y+'"/>\n';
+	xml=xml+'</bpmndi:BPMNShape>\n';
+	return xml;
+};
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/securityManage/SmButton.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/securityManage/SmButton.js
new file mode 100644
index 0000000..8e6e2a0
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/securityManage/SmButton.js
@@ -0,0 +1,276 @@
+/**
+ * 鎸夐挳姹�
+ * @author weidy@2019-11-26
+ */
+layui.define(['layer','element','form','table','util'],function(exports){
+    var Class = function(){
+        this.MODELNAME = "platform/securityManage/SmButton";
+        this.moduleKey = "SmButton";
+        this.id='SmButton';
+        this.sourceData={};
+        this.columns = [];
+        this.backPath =  configData.compatibility?path:configData.frameworkPath;
+        this.url={
+            dataGrid:'smButtonController/dataGrid',//鍒楄〃鏁版嵁鍜屾煡璇�
+            add:'smButtonController/addSave',
+            edit:'smButtonController/editSave',
+            deleteUrl:'smButtonController/delete'
+        };
+        this.buttonIconMap = {
+            SEARCH:'layui-icon-refresh-2',
+            SENIORSEARCH:'layui-icon-query',
+            ADD:'layui-icon-add-1',
+            EDIT:'layui-icon-edit',
+            DELETE:'layui-icon-delete'
+        };
+        this.getContent=function(){//杩斿洖杩欎釜缁勪欢鐨勫熀纭�html
+            var that = this;
+            var html = "";
+            html = [
+                    '<div class="layui-layout-border">',
+                        '<div class="layui-center">',
+                            that.getToolbarHtml(),
+                            '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',//涓诲垪琛�
+                        '</div>',
+                    '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id, '" class="layui-btn-container">',//涓诲垪琛ㄧ殑鎸夐挳
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getDetailToolbarHtml = function(){
+            var me = this;
+            return '<div layui-filter="detail_toolbar_' + me.id + '" class="layui-btn-container"></div>';
+        };
+        this.init=function(){//鍩虹鐨刪tml琚坊鍔犲悗锛屽啀鎵ц鍒濆鍖�
+            var that = this;
+            $webUtil.copyConfig(that,that.moduleKey);
+            $webUtil.createButtonHtmlEx(that.sourceData,that.buttonIconMap,$('[layui-filter="toolbar_' + that.id + '"]'),that.id,
+                [{uniqueFlag:'ADD',alias:'娣诲姞'},{uniqueFlag:'EDIT',alias:'淇敼'},{uniqueFlag:'DEL',alias:'鍒犻櫎'},{uniqueFlag:'LISTUSED',alias:'鏌ョ湅搴旂敤鑼冨洿'},{uniqueFlag:'CASCADEDEL',alias:'鍏宠仈鍒犻櫎'},{uniqueFlag:'refresh',alias:'鍒锋柊'}],
+                [],function(buttons,hasViewRight,hasQueryRight) {
+                    hasViewRight = true;
+                    hasQueryRight = true;
+                    if (hasViewRight) {
+                        $webUtil.bindDefultButtonLisenter(that, that.id);
+                        var table = layui.table;
+                        that.checkColumns();//涓诲垪琛ㄤ腑鍒椼��
+                        table.render({
+                            elem: '#table_' + that.id,
+                            id: 'table_' + that.id,
+                            url: that.backPath + that.url.dataGrid,
+                            page: {
+                                limit: 30,
+                                page: 1
+                            },
+                            cols: [that.columns],
+                            done: function (res, cur, count) {
+                                if(res && res.data && res.data.length>0){
+                                    table.selectRecord('table_' + that.id,res.data[0]);
+                                }
+                            },
+                            rowClick: function (thisTableFilter, record) {
+                                if(that.hasDetailRight) {
+                                    table.reload("person_" + that.id, {
+                                        where: {
+                                            oid: record.oid
+                                        }
+                                    });
+                                }
+                            }
+                        });
+                        if(hasQueryRight) {
+                            $webUtil.createSearchHtml({
+                                id: '鎸夐挳鏍囪瘑',
+                                name: '鎸夐挳鍚嶇О'
+                            }, $('[layui-filter="toolbar_' + that.id + '"]'), 'table_' + that.id);
+                        }
+                    }else{
+                        $webUtil.showErrorMsg("鎮ㄦ病鏈夋潈闄愭祻瑙堟湰椤甸潰");
+                    }
+            });
+        };
+        this.ADD = function(){//淇濆瓨
+        	var that = this;
+        	layui.use('form',function(){
+				var form = layui.form;
+				var filter ="form_" + that.id;
+				var addSaveIndex = layer.open({
+					type:1,
+					title:'娣诲姞鎸夐挳',
+					btn:['淇濆瓨','鍙栨秷'],
+					skin:'layui-layer-lan',
+					content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+					area:['800px','270px'],
+				    closeBtn:2,
+				    shade:true,
+				    shadeClose:true,
+				    resize:true,
+				    resizing:function(layero){
+				    	form.doResize(filter);
+				    },
+				    success:function(layero) {
+                        form.addItems(filter,that.getFormItems(false),
+                        function () {}, {}, {defaultColumnOneRow: 2});
+                    },
+                    yes:function(layero){
+                        if(form.validata(filter)){
+                            var values = form.getValues(filter);
+                            $webUtil.post(that.url.add,values,function(result){
+                                if(result.success){
+                                    $webUtil.showMsg("娣诲姞鎸夐挳鎴愬姛");
+                                    layer.close(addSaveIndex);
+                                    that.refresh();
+                                }else{
+                                    $webUtil.showErrorMsg(result.msg);
+                                }
+                            },function (xhr,error) {
+
+                            },that.backPath);
+                        }
+                    },
+                    btn2:function(layero){
+                        layer.close(addSaveIndex);
+                        that.refresh();
+                    }
+				});
+			});
+        };
+        this.getFormItems = function(isEdit){
+            return [{
+                type: 'text',
+                name: 'id',
+                text: '鎸夐挳鏍囪瘑',
+                required: true
+            }, {
+                type: 'text',
+                name: 'name',
+                text: '鎸夐挳鍚嶇О',
+                required: true
+            }, {
+                name: 'iconCss',
+                text: '鏄剧ず鍥炬爣'
+            }, {
+                type: 'text',
+                name: 'description',
+                text: '鎻忚堪'
+            }];
+        };
+        this.EDIT = function(){
+        	var that = this;
+        	var oid = $webUtil.getOidFromGrid("table_" + that.id,true,true);
+        	if(!oid){
+        		return false;
+			}
+			var selectRowData = layui.table.checkStatus("table_" + that.id);
+        	layui.use('form',function(){
+				var form = layui.form;
+				var filter ="form_" + that.id;
+				var addSaveIndex = layer.open({
+                    type: 1,
+                    title: '淇敼鎸夐挳',
+                    btn: ['淇濆瓨', '鍙栨秷'],
+                    url: that.backPath + that.url.edit,
+                    skin: 'layui-layer-lan',
+                    content: '<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                    area: ['800px', '270px'],
+                    closeBtn: 2,
+                    shade: true,
+                    shadeClose: true,
+                    resize: true,
+                    resizing: function (layero) {
+                        form.doResize(filter);
+                    },
+                    success: function (layero) {
+                        form.addItems(filter,that.getFormItems(true),
+                            function () {
+								form.setValues(selectRowData.data[0],filter);
+                            }
+                            , {}
+                            , {
+                                defaultColumnOneRow: 2
+                            });
+                    },
+					yes:function(layero){
+                    	if(form.validata(filter)){
+                            var formValues = form.getValues(filter,true);
+                            formValues['oid'] = selectRowData.data[0].oid;
+                            formValues['ts'] = selectRowData.data[0].ts;
+                            $webUtil.put(that.url.edit,formValues,function (result) {
+								if(result.success){
+									$webUtil.showMsg("淇敼鎸夐挳鎴愬姛");
+									that.refresh();
+									layer.close(addSaveIndex);
+								}else{
+									$webUtil.showErrorMsg(result.msg);
+								}
+                            },function (error) {
+
+                            },that.backPath);
+						}
+					},
+					btn2:function(layero){
+                        that.refresh();
+                        layer.close()
+					}
+                });
+			});
+        };
+        
+        this.DEL= function(){
+            var that = this;
+            var oid = $webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts =  $webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            $webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欎釜鎸夐挳锛屽搴旂殑鍔熻兘鑿滃崟涓殑鎸夐挳涓嶄細鑷姩鍒犻櫎",function () {
+                $webUtil.deleteRequest(that.url.deleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        $webUtil.showMsg("鍒犻櫎鎸夐挳鎴愬姛");
+                        that.refresh();
+                    }else{
+                        $webUtil.showErrorMsg(result.msg);
+                    }
+                },function (xhr,error) {
+
+                },that.backPath);
+            });
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){//濡傛灉鍏朵粬鍦版柟鎯充娇鐢ㄨ繖涓粍浠剁殑鏃跺�欙紝鍙互鑷畾涔夊垪
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),{
+                    field:'id',
+                    title:'鎸夐挳鏍囪瘑',
+                    width:150
+                },{
+                    field:'name',
+                    title:'鎸夐挳鍚嶇О',
+                    width:200
+                },{
+                    field:'iconCss',
+                    title:'鏄剧ず鍥炬爣',
+                    width:100
+                },{
+                    field:'description',
+                    title:'鎻忚堪',
+                    width:150
+                }];
+            }
+        };
+        this.refresh = function(){
+            var that = this;
+            layui.table.reload("table_" + that.id);
+
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/securityManage/SmFunction.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/securityManage/SmFunction.js
new file mode 100644
index 0000000..c030ae8
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/securityManage/SmFunction.js
@@ -0,0 +1,884 @@
+/**
+ * 鍔熻兘妯″潡鑿滃崟
+ * @author weidy@2018-06-04
+ * @constructor
+ */
+layui.define(['layer','element','form','table','tree'],function(exports){
+    var Class = function(){
+        this.MODELNAME = "platform/securityManage/SmFunction";
+        this.moduleKey = "SmFunction";
+        this.id='SmFunction';
+        this.sourceData={};
+        this.backPath = configData.compatibility?path:configData.frameworkPath;
+        this.buttonIconMap = {};
+        this.url={
+            tree:'smFunctionController/treeAllMenu',
+            getObject: 'smFunctionController/getObjectByOid',
+            add:'smFunctionController/addSave',
+            edit:'smFunctionController/editSave',
+            deleteUrl:'smFunctionController/delete',
+            referTree:'smFunctionController/refTreeMenu',
+            listButton:'smFunctionController/listButton',
+            referButton:'smFunctionController/referButton',
+            addButton:'smFunctionController/addButton',
+            editButton:'smFunctionController/editButton',
+            deleteButton:'smFunctionController/deleteButton',
+            batchAddButton:'smFunctionController/batchAddButton'
+        };
+        this.columns = [];
+        this.getContent=function(){//杩斿洖杩欎釜缁勪欢鐨勫熀纭�html
+            var that = this;
+            var html = "";
+            html = [
+                    that.getToolbarHtml(),
+                    '<div class="layui-layout" style="display:block;overflow-y: hidden">',
+                        '<div class="layui-vci-tree" style="width:250px;float: left;background-color:#ffffff;overflow-y: auto;">',
+                            '<label class="layui-icon layui-icon-tree" style="line-height: 20px;color:red;font-size:20px;">鍔熻兘妯″潡鑿滃崟</label>',
+                            '<ul layui-filter="tree_',that.id,'"><ul>',
+                        '</div>',
+                        '<div class="layui-layout-border" style="display:block;margin-top:0px;margin-left:255px;">',
+                            '<div class="layui-center" style="overflow-y:auto;">',
+                                '<form class="layui-form" lay-filter="form_',that.id,'"></form>',
+                            '</div>',
+                            '<div class="layui-south" >',
+                                '<div layui-filter="toolbar_button_',that.id,'" class="layui-btn-container">',
+                                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_button_',that.id,'_selectButton"><i class="layui-icon layui-icon-add-1"></i>浠庢寜閽簱涓�夋嫨鍚庢坊鍔�</button>',
+                                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_button_',that.id,'_addButton"><i class="layui-icon layui-icon-add-1"></i>娣诲姞鎸夐挳</button>',
+                                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_button_',that.id,'_editButton"><i class="layui-icon layui-icon-edit"></i>淇敼鎸夐挳</button>',
+                                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_button_',that.id,'_deleteButton"><i class="layui-icon layui-icon-delete"></i>绉婚櫎鎸夐挳</button>',
+                                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_button_',that.id,'_upButton"><i class="layui-icon layui-icon-up"></i>涓婄Щ</button>',
+                                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_button_',that.id,'_downButton"><i class="layui-icon layui-icon-down"></i>涓嬬Щ</button>',
+                                '</div>',
+                                '<table id="table_',that.id ,'" lay-filter="', that.id ,'"></table>',
+                            '</div>',
+                        '</div>',
+                    '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml = function(){
+            var that =this;
+            return ['<div layui-filter="toolbar_',that.id, '" class="layui-btn-container">',//涓诲垪琛ㄧ殑鎸夐挳
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_add"><i class="layui-icon layui-icon-add-1"></i>澧炲姞</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_edit"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                 '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_del"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_copy"><i class="layui-icon layui-icon-cart"></i>鍏嬮殕</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_export"><i class="layui-icon layui-icon-share"></i>瀵煎嚭鎴恓son</button>',
+                '</div>'].join("");
+        };
+        this.init=function(){
+            //鍩虹鐨刪tml琚坊鍔犲悗锛屽啀鎵ц鍒濆鍖�
+            var that = this;
+            $webUtil.copyConfig(that,that.moduleKey);
+            $webUtil.bindDefultButtonLisenter(that, that.id);
+            if(that.sourceData && 'true' == that.sourceData['admin']){
+                that.admin = true;
+                $("div[layui-filter='toolbar_button_" + that.id + "']").parent().hide();
+                that.backPath = configData.compatibility?path:configData.adminServicePath;
+            }else{
+                that.admin = false;
+            }
+            var tree = layui.tree;
+            var scrollHeight =  window.innerHeight;
+            var treeUL = $('[layui-filter="tree_' + that.id + '"]');
+            var treeHeight = scrollHeight - 200;
+            treeUL.parent().height(treeHeight);
+            tree.init("tree_" + that.id, treeUL, {
+                url: that.url.tree,
+                backPath: that.backPath,
+                extraParams: {
+                    isMuti: false,
+                    isQueryAllColumn: true
+                },
+                showSearch:true,
+                click: function (item, elem, options) {
+                    that.setFormValues(item.attributes);
+                },
+                done: function (thisFilter) {
+                    that.initForm();
+                }
+            });
+        };
+        this.initForm = function(){
+            var that = this;
+            var form = layui.form;
+            form.addItems("form_" + that.id, that.getFormItems(true), function () {
+                if(!that.admin) {
+                    that.initButtonTable();
+                }
+            }, {}, {
+                defaultColumnOneRow: 2
+            });
+        };
+        this.initButtonTable = function(){
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();//涓诲垪琛ㄤ腑鍒椼��
+            table.render({
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                url: that.backPath + that.url.listButton,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                where:{
+                    functionOid:'11'
+                },
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                done:function(res, cur, count){
+                    that.buttonTotal = count;
+                }
+            });
+            $webUtil.bindDefultButtonLisenter(that, "button_" + that.id);
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){//濡傛灉鍏朵粬鍦版柟鎯充娇鐢ㄨ繖涓粍浠剁殑鏃跺�欙紝鍙互鑷畾涔夊垪
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),{
+                    field:'id',
+                    title:'鎸夐挳鏍囪瘑',
+                    width:150
+                },{
+                    field:'name',
+                    title:'鎸夐挳鍚嶇О',
+                    width:200
+                },{
+                    field:'iconCss',
+                    title:'鏄剧ず鍥炬爣',
+                    width:150
+                },{
+                    field:'displayFlag',
+                    title:'鏄惁鏄剧ず',
+                    width:80,
+                    templet:function(r){
+                        return $webUtil.formateBoolean(r.displayFlag);
+                    }
+                },{
+                    field:'controlRightFlag',
+                    title:'鏄惁鎺у埗鏉冮檺',
+                    width:120,
+                    templet:function(r){
+                        return $webUtil.formateBoolean(r.displayFlag);
+                    }
+                },{
+                    field:'uiFlag',
+                    title:'鏄剧ず鐣岄潰鏍囪瘑',
+                    width:150
+                },{
+                    field:'usedBySpecifyRole',
+                    title:'鎸囧畾璁块棶瑙掕壊',
+                    width:150
+                }];
+            }
+        };
+        this.add=function(){
+            var that = this;
+            that.doAdd(false);
+        };
+        this.copy=function () {
+            var that = this;
+            that.doAdd(true);
+        };
+        this.doAdd = function(isCopy){
+            var that = this;
+            var filter ="addForm_" + that.id;
+            var form = layui.form;
+            var addSaveIndex = layer.open({
+                type:1,
+                title:'娣诲姞鍔熻兘妯″潡鑿滃崟',
+                btn:['淇濆瓨','鍙栨秷','淇濆瓨鏂板'],
+                skin:'layui-layer-lan',
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                area:['800px','510px'],
+                closeBtn:2,
+                shade:true,
+                shadeClose:true,
+                resize:true,
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero){
+                    form.addItems(filter,that.getFormItems(), function(){
+                        if(isCopy && that.selectTreeAttribute){
+                            var copyAttribute = {};
+                            for(var key in that.selectTreeAttribute){
+                                if(key.toLocaleLowerCase() != 'oid'){
+                                    copyAttribute[key] = that.selectTreeAttribute[key];
+                                }
+                            }
+                            form.setValues(copyAttribute, filter);
+                        }else {
+                            if (that.selectTreeAttribute) {
+                                form.setValues({
+                                    id: that.selectTreeAttribute['id'],
+                                    parentFunctionId: that.selectTreeAttribute['oid'],
+                                    parentFunctionIdName: that.selectTreeAttribute['name'],
+                                    displayFlag: that.selectTreeAttribute['displayFlag'],
+                                    controlRightFlag: that.selectTreeAttribute['controlRightFlag']
+                                }, filter);
+                            } else {
+                                form.setValues({
+                                    displayFlag: true,
+                                    controlRightFlag: true
+                                }, filter);
+                            }
+                        }
+                    },{},{defaultColumnOneRow:2,inDialog:true});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter);
+                        $webUtil.post(that.url.add,values,function(result){
+                            if(result.success){
+                                $webUtil.showMsg("娣诲姞鑿滃崟鎴愬姛");
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                $webUtil.showErrorMsg(result.msg);
+                            }
+                        },function (xhr,error) {
+                            $webUtil.showErrorMsg("娣诲姞鑿滃崟鐨勬椂鍊欏嚭鐜颁簡閿欒");
+                        },that.backPath);
+                    }
+                },
+                btn3:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter);
+                        $webUtil.post(that.url.add,values,function(result){
+                            if(result.success){
+                                $webUtil.showMsgFromResult(result,"娣诲姞鑿滃崟鎴愬姛");
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                                that.add();
+                            }else{
+                                $webUtil.showErrorMsg(result.msg);
+                            }
+                        },function (xhr,error) {
+                            $webUtil.showErrorMsg("娣诲姞鑿滃崟鐨勬椂鍊欏嚭鐜颁簡閿欒");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                    that.refresh();
+                }
+            });
+        };
+        this.edit = function(){
+            var that = this;
+            if($webUtil.isNotNull(that.selectTreeOid )){
+                var filter ="editForm_" + that.id;
+                var form = layui.form;
+                var addSaveIndex = layer.open({
+                    type:1,
+                    title:'淇敼鍔熻兘妯″潡鑿滃崟',
+                    btn:['淇濆瓨','鍙栨秷'],
+                    skin:'layui-layer-lan',
+                    content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                    area:['800px','510px'],
+                    closeBtn:2,
+                    shade:true,
+                    shadeClose:true,
+                    resize:true,
+                    resizing:function(layero){
+                        form.doResize(filter);
+                    },
+                    success:function(layero){
+                        form.addItems(filter,that.getFormItems(), function(){
+                            form.setValues( that.selectTreeAttribute,filter);
+                        },{},{defaultColumnOneRow:2,inDialog:true});
+                    },
+                    yes:function(layero){
+                        if(form.validata(filter)){
+                            var values = form.getValues(filter);
+                            var submitValues = {};
+                            for(var key in that.selectTreeAttribute){
+                                submitValues[key] = that.selectTreeAttribute[key];
+                            }
+                            for(var key in values){
+                                submitValues[key] = values[key];
+                            }
+                            if(!( "displayFlag" in values)){
+                                submitValues['displayFlag'] = false;
+                            }
+                            if(!( "controlRightFlag" in values)){
+                                submitValues['controlRightFlag'] = false;
+                            }
+                            $webUtil.put(that.url.edit,submitValues,function(result){
+                                if(result.success){
+                                    $webUtil.showMsg("淇敼鍔熻兘妯″潡鑿滃崟鎴愬姛");
+                                    layer.close(addSaveIndex);
+                                    that.refresh();
+                                }else{
+                                    $webUtil.showErrorMsg(result.msg);
+                                }
+                            },function (xhr,error) {
+                                $webUtil.showErrorMsg("淇敼鑿滃崟鐨勬椂鍊欏嚭鐜颁簡閿欒");
+                            },that.backPath);
+                        }
+                    },
+                    btn2:function(layero){
+                        layer.close(addSaveIndex);
+                        that.refresh();
+                    }
+                });
+            }else{
+                $webUtil.showErrorMsg("娌℃湁閫夋嫨鑿滃崟");
+            }
+        };
+        this.del = function(){
+            var that = this;
+            if($webUtil.isNotNull(that.selectTreeOid )){
+                $webUtil.showConfirmMsg("鎮ㄦ槸鍚﹁鍒犻櫎杩欎釜鑿滃崟锛熷畠鐨勪笅绾ц彍鍗曞皢浼氳涓�鍚屽垹闄ゃ��",function(r){
+                    if(r){
+                        $webUtil.deleteRequest(that.url.deleteUrl,{oid:that.selectTreeOid},function(result){
+                            if(result.success){
+                                $webUtil.showMsg("鍒犻櫎鑿滃崟鎴愬姛");
+                                that.refresh();
+                            }else{
+                                $webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,error) {
+                            $webUtil.showErrorMsg("鍒犻櫎鑿滃崟鏃惰姹傛湇鍔″櫒鍑虹幇浜嗛敊璇�");
+                        },that.backPath);
+                    }
+                });
+            }else{
+                $webUtil.showErrorMsg("娌℃湁閫夋嫨鑿滃崟");
+            }
+        };
+        this.export = function(){
+            var that = this;
+            var  form = layui.form;
+            $webUtil.get(that.url.tree,{},function (result) {
+                var filter = "export_form_" + that.id;
+                var addSaveIndex = layer.open({
+                    type:1,
+                    title:'璇峰湪涓嬫柟鐨勬枃鏈涓嫹璐濇墍鏈夌殑json鍐呭',
+                    skin:'layui-layer-lan',
+                    content:'<form id=' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                    area:['1200px','500px'],
+                    closeBtn:2,
+                    shade:true,
+                    shadeClose:true,
+                    resize:true,
+                    resizing:function(layero){
+                        form.doResize(filter);
+                    },
+                    success:function(layero){
+
+                        form.addItems(filter,[{
+                            field: 'result',
+                            text: 'json鍐呭',
+                            type:'textarea',
+                            inputWidth:1000,
+                            height:400
+                        }], function(){
+                            form.setValues({result:JSON.stringify(result)},filter);
+                        },{},{defaultColumnOneRow:2,inDialog:true});
+                    }
+                });
+            },function(xhr,err){},that.backPath);
+
+        };
+        this.setFormValues = function(attributes){
+            var that = this;
+            if(attributes){
+                that.selectTreeOid =attributes['oid'];
+                that.selectTreeAttribute = attributes;
+                try{
+                    var form = layui.form;
+                    form.clear("form_" + that.id,true);
+                    form.setValues(attributes,"form_" + that.id);//涓嶉渶瑕佽浆鎹㈠璞★紝鍥犱负attributes宸茬粡鏄璞℃牸寮忎簡
+                }catch (e){
+                    $webUtil.showDebugMsg(e);
+                }
+                layui.table.reload("table_" + that.id,{
+                    where:{
+                        functionOid: that.selectTreeOid
+                    }
+                });
+            }
+        };
+        this.refresh = function(parentNodeOid){
+            var that = this;
+            var tree = layui.tree;
+            if(parentNodeOid){
+                tree.reloadNode("tree_" + that.id,parentNodeOid);
+            }else {
+                that.selectTreeOid = null;
+                that.selectTreeAttribute = null;
+                tree.reload("tree_" + that.id);
+            }
+            layui.table.reload("table_" + that.id);
+        };
+        this.getFormItems = function(onlyShow){
+            var that = this;
+            var resourceField = {};
+            if(that.admin){
+                resourceField = {
+                    field:'resourceControlType',
+                    text:'璧勬簮鎺у埗绫诲瀷',
+                    type:'combox',
+                    required:true,
+                    data:[{key:"resourceControlType_bs",value:"B/S"}],
+                    defaultValue:'resourceControlType_bs',
+                    readOnly: onlyShow
+                }
+            }else{
+                resourceField = {
+                    field:'resourceControlType',
+                    text:'璧勬簮鎺у埗绫诲瀷',
+                    type:'combox',
+                    required:true,
+                    comboxKey:'resourceControlType',
+                    hidden:that.admin,
+                    readOnly: onlyShow
+                }
+            }
+            return [{
+                field: 'id',
+                text: '鑿滃崟缂栧彿',
+                required:true,
+                readOnly: onlyShow
+            }, {
+                field: 'name',
+                text: '鑿滃崟鍚嶇О',
+                required:true,
+                readOnly: onlyShow
+            },resourceField, {
+                field: 'orderNum',
+                readOnly: onlyShow,
+                text: '鎺掑簭鍙�',
+                required:true,
+                type:'text',
+                verify:'number'
+            },{
+                field:'url',
+                text:'閾炬帴鍦板潃',
+                readOnly: onlyShow,
+                textWidth:530,
+                defaultValue:'USEJS:',
+                useAllWidth:true
+            }, {
+                field: 'displayFlag',
+                readOnly: onlyShow,
+                text: '鏄惁鏄剧ず',
+                defaultValue:true,
+                type:'boolean'
+            }, {
+                field: 'controlRightFlag',
+                readOnly: onlyShow,
+                text: '鏄惁鎺у埗鏉冮檺',
+                required:true,
+                defaultValue:true,
+                type:'boolean'
+            }, {
+                field: 'parentFunctionId',
+                readOnly: onlyShow,
+                text: '涓婄骇鑿滃崟',
+                type:'refer',
+                showField:'parentFunctionIdName',
+                referConfig:{
+                    type:'tree',
+                    url:that.url.referTree,
+                    backPath:that.backPath,
+                    textField:'name',
+                    valueField:'oid',
+                    isMuti:false
+                }
+            },{
+                field:'iconCss',
+                text:'鏄剧ず鍥炬爣',
+                readOnly: onlyShow
+            }, {
+                field: 'logName',
+                readOnly: onlyShow,
+                text: '鏃ュ織鍚嶇О',
+                readOnly: onlyShow
+            }, {
+                field: 'helpName',
+                readOnly: onlyShow,
+                text: '甯姪鏂囨。鍚嶇О'
+            },{
+                field:'usedBySpecifyRole',
+                text:'鎸囧畾璁块棶鐨勮鑹�',
+                readOnly: onlyShow,
+                textWidth:530,
+                useAllWidth:true
+            },{
+                field:'description',
+                text:'澶囨敞',
+                readOnly: onlyShow,
+                textWidth:530,
+                useAllWidth:true
+            }];
+        };
+        this.addButton = function(){
+            var that = this;
+            if($webUtil.isNull(that.selectTreeOid)){
+                $webUtil.showErrorMsg("璇锋偍鍏堥�夋嫨鑿滃崟");
+                return false;
+            }
+            var filter ="addButtonForm_" + that.id;
+            var form = layui.form;
+            var addSaveIndex = layer.open({
+                type:1,
+                title:'娣诲姞鎸夐挳',
+                btn:['淇濆瓨','鍙栨秷','淇濆瓨骞舵柊澧�'],
+                skin:'layui-layer-lan',
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                area:['800px','510px'],
+                closeBtn:2,
+                shade:true,
+                shadeClose:true,
+                resize:true,
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero){
+                    form.addItems(filter,that.getButtonFormItems(), function(){
+                        form.setValues({
+                            displayFlag: 'true',
+                            controlRightFlag: 'true'
+                        }, filter);
+                    },{},{defaultColumnOneRow:2,inDialog:true});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter);
+                        values['functionOid'] = that.selectTreeOid;
+                        $webUtil.post(that.url.addButton,values,function(result){
+                            if(result.success){
+                                $webUtil.showMsg("娣诲姞鎸夐挳鎴愬姛");
+                                layer.close(addSaveIndex);
+                                that.refreshButton();
+                            }else{
+                                $webUtil.showErrorMsg(result.msg);
+                            }
+                        },function (xhr,error) {
+                            $webUtil.showErrorMsg("娣诲姞鎸夐挳鐨勬椂鍊欏嚭鐜颁簡閿欒");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                    that.refreshButton();
+                },
+                btn3:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter);
+                        values['functionOid'] = that.selectTreeOid;
+                        $webUtil.post(that.url.addButton,values,function(result){
+                            if(result.success){
+                                $webUtil.showMsg("娣诲姞鎸夐挳鎴愬姛");
+                                form.clear();
+                                form.setValues({
+                                    displayFlag: 'true',
+                                    controlRightFlag: 'true'
+                                }, filter);
+                            }else{
+                                $webUtil.showErrorMsg(result.msg);
+                            }
+                        },function (xhr,error) {
+                            $webUtil.showErrorMsg("娣诲姞鎸夐挳鐨勬椂鍊欏嚭鐜颁簡閿欒");
+                        },that.backPath);
+                    }
+                }
+            });
+        };
+        this.editButton = function(){
+            var that = this;
+            var oid = $webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var selectRowData = layui.table.checkStatus("table_" + that.id);
+            if($webUtil.isNull(that.selectTreeOid)){
+                $webUtil.showErrorMsg("璇锋偍鍏堥�夋嫨鑿滃崟");
+                return false;
+            }
+            var filter ="addButtonForm_" + that.id;
+            var form = layui.form;
+            var addSaveIndex = layer.open({
+                type:1,
+                title:'淇敼鎸夐挳',
+                btn:['淇濆瓨','鍙栨秷'],
+                skin:'layui-layer-lan',
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                area:['800px','510px'],
+                closeBtn:2,
+                shade:true,
+                shadeClose:true,
+                resize:true,
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero){
+                    form.addItems(filter,that.getButtonFormItems(), function(){
+                        form.setValues(selectRowData.data[0],filter);
+                    },{},{defaultColumnOneRow:2,inDialog:true});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = selectRowData.data[0];
+                        var formValues = form.getValues(filter);
+                        for(var key in formValues){
+                            values[key] = formValues[key];
+                        }
+                        values['t_oid'] = selectRowData.data[0]['toid'];
+                        values['functionOid'] = that.selectTreeOid;
+                        $webUtil.put(that.url.editButton,values,function(result){
+                            if(result.success){
+                                $webUtil.showMsg("淇敼鎸夐挳鎴愬姛");
+                                layer.close(addSaveIndex);
+                                that.refreshButton();
+                            }else{
+                                $webUtil.showErrorMsg(result.msg);
+                            }
+                        },function (xhr,error) {
+                            $webUtil.showErrorMsg("淇敼鎸夐挳鐨勬椂鍊欏嚭鐜颁簡閿欒");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                    that.refreshButton();
+                }
+            });
+        };
+        this.deleteButton = function () {
+            var that = this;
+            var oid = $webUtil.getOidFromGrid("table_" + that.id,true,false);
+            if(!oid){
+                return false;
+            }
+            var selectRowData = layui.table.checkStatus("table_" + that.id);
+            if($webUtil.isNull(that.selectTreeOid)){
+                $webUtil.showErrorMsg("璇锋偍鍏堥�夋嫨鑿滃崟");
+                return false;
+            }
+            $webUtil.showConfirmMsg("鎮ㄦ槸鍚︾‘瀹氬垹闄よ繖浜涙寜閽�",function (r) {
+                if(r){
+                    var submitValues = {
+                        functionOid:that.selectTreeOid
+                    };
+                    layui.each(selectRowData.data,function(_index,_item){
+                        submitValues['buttonDTOList[' + _index + '].t_oid'] = _item['toid'];
+                    });
+                    $webUtil.deleteRequest(that.url.deleteButton,submitValues,function (result) {
+                        if(result.success){
+                            $webUtil.showMsg("鍒犻櫎鎸夐挳鎴愬姛");
+                            that.refreshButton();
+                        }else{
+                            $webUtil.showErrorMsg(result.msg);
+                        }
+                    },function (xhr,err) {
+                        $webUtil.showErrorMsg("鍒犻櫎鎸夐挳鐨勬椂鍊欏嚭鐜颁簡閿欒");
+                    },that.backPath);
+                }
+            });
+        };
+        this.selectButton = function(){
+            var that = this;
+            if($webUtil.isNull(that.selectTreeOid)){
+                $webUtil.showErrorMsg("璇锋偍鍏堥�夋嫨鑿滃崟");
+                return false;
+            }
+            var filter ="selectButton_" + that.id;
+            var addSaveIndex = layer.open({
+                type:1,
+                title:'浠庢寜閽簱涓�夋嫨',
+                btn:['纭畾骞剁户缁�','纭畾骞跺叧闂�','鍙栨秷'],
+                skin:'layui-layer-lan',
+                content:'<div layui-filter="search_form_for_table_' + filter + '" class="layui-form" >' +
+                            '<div class="layui-form-item" style="height:24px;float:left;display:inline-block"> ' +
+                                '<div class="layui-input-inline" style="height:24px;line-height:24px;width:150px">' +
+                                    '<select name="search_for_table_'+ filter + '" style="height:24px;width:120px;padding-right: 30px;">' +
+                                        '<option value="id" >鎸夐挳鏍囪瘑</option>' +
+                                        '<option value="name" >鎸夐挳鍚嶇О</option>' +
+                                    '</select>' +
+                                '</div>' +
+                                '<div class="layui-input-inline">' +
+                                    '<input type="text" style="height:24px" name="searchvalue_for_table_'+ filter + '" placeholder="杈撳叆鍊煎悗杩涜妯$硦鏌ヨ" class="layui-input" >' +
+                                '</div>'+
+                            '</div>' +
+                         '</div>' +
+                         '<table id="table_' + filter + '" lay-filter="' + filter + '" style="margin-top:40px" ></table>',
+                area:['800px','510px'],
+                closeBtn:2,
+                shade:true,
+                shadeClose:true,
+                resize:true,
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero){
+                    layui.form.render('select');
+                    layui.table.render({
+                        elem: '#table_' + filter,
+                        id:filter,
+                        url:that.backPath + that.url.referButton,
+                        page:{
+                            limit:20,
+                            page:1
+                        },
+                        where:{
+                            functionOid:that.selectTreeOid
+                        },
+                        cols: [that.getReferButtonColums()]
+                    });
+                    $('[name="searchvalue_for_table_' + filter + '"]').keydown(function(e){
+                        if(e.which == 13){
+                            //鎸変笅鍥炶溅閿�
+                            var searchField = $(this).parent().parent().find('select').val();
+                            var searchValue = $(this).val();
+                            if($webUtil.isNotNull(searchValue)){
+                                searchValue = "*" + searchValue + "*";
+                            }
+                            var requestData = {};
+                            requestData['conditionMap["' + searchField + '"]'] = searchValue;
+                            layui.table.reload(
+                                filter, {
+                                    where: requestData
+                                }
+                            );
+                        }
+                    });
+                },
+                yes:function(layero){
+                    var selectData = layui.table.checkStatus(filter);
+                    if(!selectData || !selectData.data || selectData.data.length == 0){
+                        $webUtil.showErrorMsg("娌℃湁閫夋嫨鎸夐挳锛屾棤娉曠户缁�");
+                        return false;
+                    }
+                    selectData = selectData.data;
+                    var submitValue = {
+                        functionOid: that.selectTreeOid
+                    };
+                    layui.each(selectData,function(_index,_item){
+                        submitValue['buttonDTOList[' + _index + '].oid'] = _item.oid;
+                        submitValue['buttonDTOList[' + _index + '].id'] = _item.id;
+                        submitValue['buttonDTOList[' + _index + '].name'] = _item.name;
+                        submitValue['buttonDTOList[' + _index + '].iconCss'] = _item.iconCss;
+                        submitValue['buttonDTOList[' + _index + '].displayFlag'] = true;
+                        submitValue['buttonDTOList[' + _index + '].controlRightFlag'] = true;
+                        submitValue['buttonDTOList[' + _index + '].orderNum'] =  that.buttonTotal? (that.buttonTotal+1 + _index) : (_index + 1);
+                        submitValue['buttonDTOList[' + _index + '].uiFlag'] = 'main';
+                    });
+                    $webUtil.post(that.url.batchAddButton,submitValue,function(result){
+                        if(result.success){
+                            $webUtil.showAutoMsg("鎵归噺娣诲姞鎸夐挳鎴愬姛");
+                            layui.table.reload(filter);
+                            that.refreshButton();
+                        }else{
+                            $webUtil.showErrorMsg(result.msg);
+                        }
+                    },function(xhr,error){
+                        $webUtil.showErrorMsg("鎵归噺娣诲姞鎸夐挳鏃跺嚭鐜颁簡閿欒");
+                    },that.backPath);
+                },
+                btn2:function(layero){
+                    var selectData = layui.table.checkStatus(filter);
+                    if(!selectData || !selectData.data || selectData.data.length == 0){
+                        $webUtil.showErrorMsg("娌℃湁閫夋嫨鎸夐挳锛屾棤娉曠户缁�");
+                        return false;
+                    }
+                    selectData = selectData.data;
+                    var submitValue = {
+                        functionOid: that.selectTreeOid
+                    };
+                    layui.each(selectData,function(_index,_item){
+                        submitValue['buttonDTOList[' + _index + '].oid'] = _item.oid;
+                        submitValue['buttonDTOList[' + _index + '].id'] = _item.id;
+                        submitValue['buttonDTOList[' + _index + '].name'] = _item.name;
+                        submitValue['buttonDTOList[' + _index + '].iconCss'] = _item.iconCss;
+                        submitValue['buttonDTOList[' + _index + '].displayFlag'] = true;
+                        submitValue['buttonDTOList[' + _index + '].controlRightFlag'] = true;
+                        submitValue['buttonDTOList[' + _index + '].orderNum'] =  that.buttonTotal? (that.buttonTotal+1 + _index) : (_index + 1);
+                        submitValue['buttonDTOList[' + _index + '].uiFlag'] = 'main';
+                    });
+                    $webUtil.post(that.url.batchAddButton,submitValue,function(result){
+                        if(result.success){
+                            $webUtil.showMsg("鎵归噺娣诲姞鎸夐挳鎴愬姛");
+                            layer.close(addSaveIndex);
+                            that.refreshButton();
+                        }else{
+                            $webUtil.showErrorMsg(result.msg);
+                        }
+                    },function(xhr,error){
+                        $webUtil.showErrorMsg("鎵归噺娣诲姞鎸夐挳鏃跺嚭鐜颁簡閿欒");
+                    },that.backPath);
+                },
+                btn3:function(layero){
+                    layer.close(addSaveIndex);
+                    that.refreshButton();
+                }
+            });
+        };
+        this.getReferButtonColums = function () {
+            var table = layui.table;
+            return [table.getIndexColumn(),table.getCheckColumn(),{
+                    field:'id',
+                    title:'鎸夐挳鏍囪瘑',
+                    width:150
+                },{
+                    field:'name',
+                    title:'鎸夐挳鍚嶇О',
+                    width:200
+                },{
+                    field:'iconCss',
+                    title:'鏄剧ず鍥炬爣',
+                    width:150
+                }];
+        };
+        this.getButtonFormItems = function () {
+            var that = this;
+            return [{
+                field: 'id',
+                text: '鎸夐挳鏍囪瘑',
+                required:true
+            }, {
+                field: 'name',
+                text: '鎸夐挳鍚嶇О',
+                required:true
+            },{
+                field:'uiFlag',
+                text:'鏄剧ず浣嶇疆鎵�灞為〉闈㈡爣璇�',
+                defaultValue:'main'
+            }, {
+                field: 'orderNum',
+                text: '鎺掑簭鍙�',
+                required:true,
+                verify:'number'
+            }, {
+                field: 'displayFlag',
+                text: '鏄惁鏄剧ず',
+                required:true,
+                type:'boolean'
+            }, {
+                field: 'controlRightFlag',
+                text: '鏄惁鎺у埗鏉冮檺',
+                required:true,
+                type:'boolean'
+            },{
+                field:'iconCss',
+                text:'鏄剧ず鍥炬爣'
+            },{
+                field:'usedBySpecifyRole',
+                text:'鎸囧畾璁块棶鐨勮鑹�',
+                textWidth:530,
+                useAllWidth:true
+            }];
+        };
+        this.refreshButton = function(){
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+    };
+    var c = new Class();
+    exports(c.MODELNAME,c);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/securityManage/SmPasswordStrategy.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/securityManage/SmPasswordStrategy.js
new file mode 100644
index 0000000..80ae955
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/securityManage/SmPasswordStrategy.js
@@ -0,0 +1,418 @@
+/**
+ * 瀵嗙爜瀹夊叏绛栫暐椤甸潰
+ * @author weidy
+ * @date 2020-08-14
+ */
+layui.define(['layer','element','form','table','dynamicCondition','upload' ],function(exports){
+        var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "platform/securityManage/SmPasswordStrategy";
+        this.moduleKey = "SmPasswordStrategy";
+        this.backPath =  configData.compatibility?path:configData.frameworkPath;
+        this.url = {
+            controller:'smPasswordStrategyController/',
+            dataGrid:'gridSmPasswordStrategy',
+            addSave:'addSave',
+            editSave:'editSave',
+            deleteUrl:'delSmPasswordStrategy',
+            downloadImportTemplate:'downloadImportTemplate',
+            importData : 'importData',
+            exportData : 'exportData',
+             getObjectByOid:'getObjectByOid'
+        };
+        this.getContent=function(){
+            var that = this;
+            var html = "";
+            html = [
+                '<div class="layui-layout" style="display:block;overflow-y: hidden">',
+                    '<div class="layui-layout-border" style="display:block;margin-top:0px; " id="border_',that.id,'">',
+                        '<div class="layui-center" style="overflow-y:auto;">',
+                            that.getToolbarHtml(),
+                            '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                            '<div id="toolbar_column_',that.id ,'" style="display:none;"></div>',
+                        '</div>',
+                    '</div>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.createSearchHtml({id:"缂栧彿",name:"鍚嶇О"} ,$("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+        };
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            that.initMainTable();
+            that.createSearchHtml();
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var tableWidth = $("#border_" + that.id).width();
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                width:tableWidth,
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'EDIT'){
+                                that.addOrEdit(false,data.oid);
+                            }
+                        });
+                    }else{
+                        if(total>0) {
+                            table.selectRecord('table_' + that.id, {index:0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                }
+            };
+            if(parentFieldName){
+                options.treeConfig = {
+                    treepid:parentFieldName,
+                    treeid:'id',
+                    showField:'name'
+                };
+            }
+            table.render(options);
+            document.getElementById("toolbar_column_" + that.id).innerHTML =
+                '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>';
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),
+                    {
+                        title: '鏈�灏忛暱搴�',
+                        field: 'minLength',
+                        width: 100
+                    },                    {
+                        title: '鏈夋晥澶╂暟',
+                        field: 'validDay',
+                        width: 100
+                    },                    {
+                        title: '鎻愰啋澶╂暟',
+                        field: 'remindDay',
+                        width: 100
+                    },                    {
+                        title: '鍙互閲嶈瘯鐨勬鏁�',
+                        field: 'retryTime',
+                        width: 100
+                    },                    {
+                        title: '閿佸畾鏃堕棿',
+                        field: 'lockTime',
+                        width: 100
+                    },                    {
+                        title: '鏄惁涓洪粯璁�',
+                        field: 'defaultFlag',
+                        width: 60,
+                        templet: function (d) {
+                            return webUtil.formateBoolean(d.defaultFlag);
+                        }
+                    },                    {
+                        title: '瀵嗙爜鐨勬渶澶ч暱搴�',
+                        field: 'maxLength',
+                        width: 100
+                    },                    {
+                        title: '瀵嗙爜瀛楃鎵�闇�绫诲瀷',
+                        field: 'requireCharTypeText',
+                        width: 150
+                    },                    {
+                        title: '瀵嗙爜鎵�闇�瀛楃绉嶇被涓暟',
+                        field: 'requireCharCount',
+                        width: 100
+                    },                    {
+                        title: '缂栧彿',
+                        field: 'id',
+                        width: 150
+                    },                    {
+                        title: '鍚嶇О',
+                        field: 'name',
+                        width: 150
+                    },                    {
+                        title: '鎻忚堪',
+                        field: 'description',
+                        width: 150
+                    }        ];
+            }
+        };
+
+        this.getFormItems = function(onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [{
+                field: 'id',
+                title: '缂栧彿',
+                required: false,
+                type: 'text',
+                readOnly:onlyShow
+            } ,                {
+                field: 'name',
+                title: '鍚嶇О',
+                required: false,
+                type: 'text',
+                readOnly:onlyShow
+            },
+                {
+                    field: 'minLength',
+                    title: '鏈�灏忛暱搴�',
+                    required: false,
+                    verify: 'number',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'validDay',
+                    title: '鏈夋晥澶╂暟',
+                    required: false,
+                    verify: 'number',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'remindDay',
+                    title: '鎻愰啋澶╂暟',
+                    required: false,
+                    verify: 'number',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'retryTime',
+                    title: '鍙互閲嶈瘯鐨勬鏁�',
+                    required: false,
+                    verify: 'number',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'lockTime',
+                    title: '閿佸畾鏃堕棿',
+                    required: false,
+                    verify: 'number',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'maxLength',
+                    title: '瀵嗙爜鐨勬渶澶ч暱搴�',
+                    required: false,
+                    verify: 'number',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'requireCharType',
+                    title: '瀵嗙爜瀛楃鎵�闇�绫诲瀷',
+                    required: false,
+                    type: 'combobox',
+                    comboxKey:'requireCharType',
+                    isCheckbox:true,
+                    useAllWidth:true,
+                    labelWidth:150,
+                    inputWidth:600,
+                    data:[{"key":"upletter","value":"澶у啓瀛楁瘝"},{"key":"lowletter","value":"灏忓啓瀛楁瘝"},{"key":"number","value":"鏁板瓧"},{"key":"character","value":"鐗规畩瀛楃"}],
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'requireCharCount',
+                    title: '瀵嗙爜鎵�闇�瀛楃绉嶇被涓暟',
+                    required: false,
+                    verify: 'number',
+                    labelWidth:150,
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'defaultFlag',
+                    title: '鏄惁涓洪粯璁�',
+                    required: false,
+                    type: 'truefalse',
+                    readOnly:onlyShow
+                } ,                              {
+                    field: 'description',
+                    title: '鎻忚堪',
+                    required: false,
+                    type: 'text',
+                    readOnly:onlyShow
+                }             ];
+        };
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            that.addOrEdit(false,oid);
+        };
+        this.addOrEdit = function(add,oid) {
+            var that = this;
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var addSaveIndex =webUtil.dialog({
+                title:add?'娣诲姞瀵嗙爜瀹夊叏绛栫暐':'淇敼瀵嗙爜瀹夊叏绛栫暐',
+                btn:['淇濆瓨','鍙栨秷'],
+                skin:'layui-layer-lan',
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                area:["900px","500px"],
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getFormItems(false),
+                        function () {
+                            if(!add){
+                                form.load(filter,{
+                                    backPath:that.backPath,
+                                    url:that.url.controller + that.url.getObjectByOid,
+                                    method:'get',
+                                    params:{
+                                        oid:oid
+                                    }
+                                });
+                            }else{
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+                        }, {}, {defaultColumnOneRow: 2});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        var url = that.url.controller + (add?that.url.addSave:that.url.editSave);
+                        webUtil.ajax(add?'post':'put',url,values,function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts= webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+        this.refresh = function () {
+            var that = this;
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+
+        this.EXPORT = function () {
+            var that = this;
+            var iframeId = MD5("export" +webUtil.getSystemVar(webUtil.systemValueKey.currentDateTimeSSS) +webUtil.getSystemVar(webUtil.systemValueKey.userOid));
+            var data = {};
+            data[TOKEN_KEY] = $webUtil.getToken() ;
+            data['downloadUUID'] = iframeId;
+            webUtil.fileDownloadPost(that.backPath + that.url.controller + that.url.exportData,data);
+        };
+        this.IMPORT = function () {
+            var that = this;
+            var filter =that.id + "_upload";
+            var form = layui.form;
+            var uploadIndex = webUtil.dialog({
+                title:'瀵煎叆瀵嗙爜瀹夊叏绛栫暐',
+                btn:['涓嬭浇瀵煎叆妯℃澘','鍙栨秷'],
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" enctype="multipart/form-data"></form>',
+                area: ['300px', '300px'],
+                resize:false,
+                success:function(layero){
+                    //濡傛灉瀵煎叆鏈夊叾浠栨搷浣滐紝鍦ㄧ浜屼釜鍙傛暟涓坊鍔�
+                    form.addItems(filter,[],function(){
+                        $("#form_" + filter).append('<button type="button" class="layui-btn" id="' + that.id + '_upload_form_file" style="margin-left:100px;margin-top:80px;"><i class="layui-icon">&#xe67c;</i>閫夋嫨鏂囦欢鍚庤嚜鍔ㄥ鍏�</button>&nbsp;&nbsp;&nbsp;&nbsp;');
+                        var upload = layui.upload;
+                        //鎵ц瀹炰緥
+                        var uploadInst = upload.render({
+                            elem: '#' + that.id + '_upload_form_file' //缁戝畾鍏冪礌
+                            ,accept:'file'
+                            ,acceptMime:'file/*'
+                            ,exts:'xls|xlsx'
+                            ,url: that.backPath + that.url.controller + that.url.importData
+                            ,done: function(result){
+                                if(result.success){
+                                    layer.close(uploadIndex);
+                                    webUtil.showMsgFromResult(result,"瀵煎叆鎴愬姛");
+                                    that.refresh();
+                                }else{
+                                    webUtil.showErrorMsg(result.msg);
+                                }
+                            }
+                            ,error: function(){
+                                //璇锋眰寮傚父鍥炶皟
+                                 webUtil.showErrorMsg("涓婁紶寮傚父");
+                            }
+                        });
+                    },{},{
+                        defaultColumnOneRow:1
+                    });
+                },
+                yes:function(){
+                    var iframeId = MD5("downloadImportTemplate" +webUtil.getSystemVar(webUtil.systemValueKey.currentDateTimeSSS)  +webUtil.getSystemVar(webUtil.systemValueKey.userOid));
+                    webUtil.fileDownload(that.backPath + that.url.controller + that.url.downloadImportTemplate+ "?" + TOKEN_KEY + "=" + $webUtil.getToken()  + "&downloadUUID=" + iframeId );
+                }
+            });
+        };
+        this.ADVQUERY = function () {
+            var that = this;
+            var dynamicCondition = layui.dynamicCondition;
+            $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar'+ that.id+'" class="layui-inline"></div>');
+            var dataFields = that.columns;
+            that.serinorQueryInstance = dynamicCondition.create({
+                fields : dataFields//鏌ヨ瀛楁
+                ,tableId:"table_"+that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                ,type:"complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                ,conditionTextId:"#toolbar"+that.id//楂樼骇鏌ヨ 鎸夐挳鎵�鍦ㄧ殑div
+                ,popupShowQueryBtn: true//鏄剧ず楂樼骇鏌ヨ鎸夐挳
+                ,queryCallBack:function(requestData){//鏌ヨ涔嬪悗鐨刢allback
+                    //console.log(JSON.stringify(requestData))
+                }
+            });
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/securityManage/SmWorkType.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/securityManage/SmWorkType.js
new file mode 100644
index 0000000..9be6835
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/securityManage/SmWorkType.js
@@ -0,0 +1,377 @@
+/**
+ * 宸ョ椤甸潰
+ * @author mixiao
+ * @date 2020-08-14
+ */
+layui.define(['layer','element','form','table','dynamicCondition','upload' ],function(exports){
+        var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "platform/securityManage/SmWorkType";
+        this.moduleKey = "SmWorkType";
+        this.backPath =  configData.frameworkPath;
+        this.url = {
+            controller:'smWorkTypeController/',
+            dataGrid:'gridSmWorkType',
+            addSave:'addSave',
+            editSave:'editSave',
+            deleteUrl:'deleteData',
+            enableData: 'enableData',
+            disableData: 'disableData',
+            downloadImportTemplate:'downloadImportTemplate',
+            importData : 'importData',
+            exportData : 'exportData',
+             getObjectByOid:'getObjectByOid'
+        };
+        this.getContent=function(){
+            var that = this;
+            var html = "";
+            html = [
+                '<div class="layui-layout" style="display:block;overflow-y: hidden">',
+                    '<div class="layui-layout-border" style="display:block;margin-top:0px; " id="border_',that.id,'">',
+                        '<div class="layui-center" style="overflow-y:auto;">',
+                            that.getToolbarHtml(),
+                            '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                            '<div id="toolbar_column_',that.id ,'" style="display:none;"></div>',
+                        '</div>',
+                    '</div>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DISABLE"><i class="layui-icon layui-icon-404"></i>鍋滅敤</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ENABLE"><i class="layui-icon layui-icon-ok-circle"></i>鍚敤</button>',
+                    // '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_IMPORT"><i class="layui-icon layui-icon-upload-drag"></i>瀵煎叆</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                    // '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EXPORT"><i class="layui-icon layui-icon-export"></i>瀵煎嚭</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.createSearchHtml({id:"宸ョ缂栧彿",name:"宸ョ鍚嶇О"} ,$("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+        };
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            that.initMainTable();
+            that.createSearchHtml();
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var tableWidth = $("#border_" + that.id).width();
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                width:tableWidth,
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'EDIT'){
+                                that.addOrEdit(false,data.oid);
+                            }
+                        });
+                    }else{
+                        if(total>0) {
+                            table.selectRecord('table_' + that.id, {index:0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                }
+            };
+            if(parentFieldName){
+                options.treeConfig = {
+                    treepid:parentFieldName,
+                    treeid:'id',
+                    showField:'name'
+                };
+            }
+            table.render(options);
+            document.getElementById("toolbar_column_" + that.id).innerHTML =
+                '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>';
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),
+                    {
+                        title: '缂栧彿',
+                        field: 'id',
+                        width: 150
+                    },                    {
+                        title: '鍚嶇О',
+                        field: 'name',
+                        width: 150
+                    },                    {
+                        title: '鎻忚堪',
+                        field: 'description',
+                        width: 150
+                    },                    {
+                        title: '鐘舵��',
+                        field: 'lcStatusText',
+                        width: 150
+                    }        ];
+            }
+        };
+
+        this.getFormItems = function(onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [
+                {
+                    field: 'id',
+                    title: '缂栧彿',
+                    required: true,
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'name',
+                    title: '鍚嶇О',
+                    required: true,
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'description',
+                    title: '鎻忚堪',
+                    required: false,
+                    type: 'text',
+                    readOnly:onlyShow
+                }             ];
+        };
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            that.addOrEdit(false,oid);
+        };
+        this.addOrEdit = function(add,oid) {
+            var that = this;
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var addSaveIndex =webUtil.dialog({
+                title:add?'娣诲姞宸ョ':'淇敼宸ョ',
+                btn:['淇濆瓨','鍙栨秷'],
+                skin:'layui-layer-lan',
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                area:['900px','300px'],
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getFormItems(false),
+                        function () {
+                            if(!add){
+                                form.load(filter,{
+                                    backPath:that.backPath,
+                                    url:that.url.controller + that.url.getObjectByOid,
+                                    method:'get',
+                                    params:{
+                                        oid:oid
+                                    }
+                                });
+                            }else{
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+                        }, {}, {defaultColumnOneRow: 2});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        var url = that.url.controller + (add?that.url.addSave:that.url.editSave);
+                        webUtil.ajax(add?'post':'put',url,values,function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts= webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+        this.refresh = function () {
+            var that = this;
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+        this.DISABLE = function () {
+            var that = this;
+            that.disableOrEnable(false);
+        };
+        this.ENABLE = function () {
+            var that = this;
+            that.disableOrEnable(true);
+        };
+        this.disableOrEnable = function (enable) {
+            var that = this;
+            var oid ;
+            var ts ;
+            oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            ts = webUtil.getOidFromGrid("table_" + that.id,false,false,'ts');
+            webUtil.post(that.url.controller + (enable?that.url.enableData:that.url.disableData),{
+                oid:oid,
+                ts:ts
+                },function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,(enable?'鍚敤鎴愬姛':'鍋滅敤鎴愬姛'));
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+        };
+
+        this.EXPORT = function () {
+            var that = this;
+            var iframeId = MD5("export" +webUtil.getSystemVar(webUtil.systemValueKey.currentDateTimeSSS) +webUtil.getSystemVar(webUtil.systemValueKey.userOid));
+            var data = {};
+            data[TOKEN_KEY] = $webUtil.getToken() ;
+            data['downloadUUID'] = iframeId;
+            webUtil.fileDownloadPost(that.backPath + that.url.controller + that.url.exportData,data);
+        };
+        this.IMPORT = function () {
+            var that = this;
+            var filter =that.id + "_upload";
+            var form = layui.form;
+            var uploadIndex = webUtil.dialog({
+                title:'瀵煎叆宸ョ',
+                btn:['涓嬭浇瀵煎叆妯℃澘','鍙栨秷'],
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" enctype="multipart/form-data"></form>',
+                area: ['300px', '300px'],
+                resize:false,
+                success:function(layero){
+                    //濡傛灉瀵煎叆鏈夊叾浠栨搷浣滐紝鍦ㄧ浜屼釜鍙傛暟涓坊鍔�
+                    form.addItems(filter,[],function(){
+                        $("#form_" + filter).append('<button type="button" class="layui-btn" id="' + that.id + '_upload_form_file" style="margin-left:100px;margin-top:80px;"><i class="layui-icon">&#xe67c;</i>閫夋嫨鏂囦欢鍚庤嚜鍔ㄥ鍏�</button>&nbsp;&nbsp;&nbsp;&nbsp;');
+                        var upload = layui.upload;
+                        //鎵ц瀹炰緥
+                        var uploadInst = upload.render({
+                            elem: '#' + that.id + '_upload_form_file' //缁戝畾鍏冪礌
+                            ,accept:'file'
+                            ,acceptMime:'file/*'
+                            ,exts:'xls|xlsx'
+                            ,url: that.backPath + that.url.controller + that.url.importData
+                            ,done: function(result){
+                                if(result.success){
+                                    layer.close(uploadIndex);
+                                    webUtil.showMsgFromResult(result,"瀵煎叆鎴愬姛");
+                                    that.refresh();
+                                }else{
+                                    webUtil.showErrorMsg(result.msg);
+                                }
+                            }
+                            ,error: function(){
+                                //璇锋眰寮傚父鍥炶皟
+                                 webUtil.showErrorMsg("涓婁紶寮傚父");
+                            }
+                        });
+                    },{},{
+                        defaultColumnOneRow:1
+                    });
+                },
+                yes:function(){
+                    var iframeId = MD5("downloadImportTemplate" +webUtil.getSystemVar(webUtil.systemValueKey.currentDateTimeSSS)  +webUtil.getSystemVar(webUtil.systemValueKey.userOid));
+                    webUtil.fileDownload(that.backPath + that.url.controller + that.url.downloadImportTemplate+ "?" + TOKEN_KEY + "=" + $webUtil.getToken()  + "&downloadUUID=" + iframeId );
+                }
+            });
+        };
+        this.ADVQUERY = function () {
+            var that = this;
+            var dynamicCondition = layui.dynamicCondition;
+            $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar'+ that.id+'" class="layui-inline"></div>');
+            var dataFields = that.columns;
+            var queryFields =[];
+            for(var index = 0 ; index < dataFields.length; index++){
+                var record = dataFields[index];
+                if(record.field=='lcStatusText'){
+                    queryFields.push({
+                        field:'lcStatus',
+                        title:'鐘舵��',
+                        comboxKey:'enableStatus',
+                        editor:'select',
+                        data:[{key:'Enabled',value:'鍚敤'},{key:'Disabled',value:'鍋滅敤'}]
+                    });
+                }else{
+                    queryFields.push(record);
+                }
+            }
+            if(!that.serinorQueryInstance) {
+                that.serinorQueryInstance = dynamicCondition.create({
+                    fields: dataFields//鏌ヨ瀛楁
+                    , tableId: "table_" + that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                    , type: "complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                    , conditionTextId: "#toolbar" + that.id//楂樼骇鏌ヨ 鎸夐挳鎵�鍦ㄧ殑div
+                    //,popupShowQueryBtn: true//鏄剧ず楂樼骇鏌ヨ鎸夐挳
+                    , queryCallBack: function (requestData) {//鏌ヨ涔嬪悗鐨刢allback
+                        //console.log(JSON.stringify(requestData))
+                    }
+                });
+            }
+            that.serinorQueryInstance.open();
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/securityManage/VciSmRightCenter.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/securityManage/VciSmRightCenter.js
new file mode 100644
index 0000000..b44c141
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/securityManage/VciSmRightCenter.js
@@ -0,0 +1,260 @@
+/**
+ * 闆嗕腑鎺堟潈
+ * @author xurc@2020/11/04
+ */
+layui.define(['layer','element','form','table','util'],function(exports){
+    var Class = function(){
+        this.MODELNAME = "platform/securityManage/VciSmRightCenter";
+        this.moduleKey = "VciSmRightCenter";
+        this.id = 'VciSmRightCenter';
+        this.sourceData = {};
+        this.columns = [];
+        this.backPath =  configData.compatibility?path:configData.frameworkPath;//榛樿娴佺▼鍜岄」鐩殑璺緞鏄竴鏍风殑
+        this.url={
+            controller:'roleFunctionController/',
+            classifyTree:'roleQueryController/refTree',
+            oneTree:'treeFunctionByRole',
+            submit:'roleAuthorityChanges',
+            del:'removeAuthority'
+        };
+        this.buttonIconMap = {
+            SEARCH:'layui-icon-refresh-2',
+            SENIORSEARCH:'layui-icon-query',
+            ADD:'layui-icon-add-1',
+            EDIT:'layui-icon-edit',
+            DELETE:'layui-icon-delete'
+        };
+        this.getContent=function(){
+            var that = this;
+            var html = "";
+            html = [
+                '<div class="layui-layout" style="display:block;overflow-y: hidden">',
+                    '<div class="layui-vci-tree" style="width:400px;float: left;background-color:#ffffff;overflow-y: auto;">',
+                        '<label class="layui-icon layui-icon-tree" style="line-height: 20px;color:red;font-size:20px;">瑙掕壊鎺堟潈</label>',
+                        '<ul layui-filter="tree_',that.id,'" style="overflow-x: auto;"><ul>',
+                    '</div>',
+                    '<div class="layui-layout-border layui-tab" style="display:block;margin-top:0px;margin-left:185px;">',
+                        '<ul class="layui-tab-title tabTitle" lay-allowClose="false">',
+                            '<li class="layui-this">鍔熻兘妯″潡鎺堟潈</li>',
+                            '<li>鐣岄潰鍜岃闂巿鏉�</li>',
+                            '<li>鏁版嵁鏉冮檺鎺堟潈</li>',
+                        '</ul>',
+                        '<ul class="layui-tab-content tabContent">',
+                            '<li class="layui-tab-item layui-show">',
+                                '<div layui-filter="toolbar_',that.id, '" class="layui-btn-container">',//涓诲垪琛ㄧ殑鎸夐挳
+                                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_AllCHECK" compid ="',that.id,'"><i class="layui-icon layui-icon-screen-full"></i>鍏ㄩ��</button>',
+                                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_NOCHECK" compid ="',that.id,'"><i class="layui-icon layui-icon-screen-restore"></i>鍏ㄤ笉閫�</button>',
+                                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_FCHECK" compid ="',that.id,'"><i class="layui-icon layui-icon-engine"></i>鍙嶉��</button>',
+                                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL" compid ="',that.id,'"><i class="layui-icon layui-icon-delete"></i>绉婚櫎鏉冮檺</button>',
+                                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_SUBMIT" compid ="',that.id,'"><i class="layui-icon layui-icon-auz"></i>鎺堟潈</button>',
+                                '</div>',
+                                '<ul id="oneTree_',that.id , '" layui-filter="oneTree_',that.id , '" style="overflow-x:auto;"></ul>',
+                            '</li>',
+                            '<li class="layui-tab-item">',
+                                '<div layui-filter="toolbar_',that.id, '" class="layui-btn-container">',//涓诲垪琛ㄧ殑鎸夐挳
+                                    //'<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDITRULE" compid ="',that.id,'"><i class="layui-icon layui-icon-delete"></i>缂栬緫琛ㄥ崟</button>',
+                                    //'<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DELRULE" compid ="',that.id,'"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                                    //'<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_PREVIEW" compid ="',that.id,'"><i class="layui-icon layui-icon-edit"></i>棰勮</button>',
+                                '</div>',
+                                '<form class="layui-form" lay-filter="formRule_',that.id,'"></form>',
+                            '</li>',
+                            '<li class="layui-tab-item">',
+                                '<div layui-filter="toolbar_',that.id, '" class="layui-btn-container">',//涓诲垪琛ㄧ殑鎸夐挳
+                                   // '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDITRULE" compid ="',that.id,'"><i class="layui-icon layui-icon-delete"></i>缂栬緫琛ㄥ崟</button>',
+                                    //'<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DELRULE" compid ="',that.id,'"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                                    //'<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_PREVIEW" compid ="',that.id,'"><i class="layui-icon layui-icon-edit"></i>棰勮</button>',
+                                '</div>',
+                                '<form class="layui-form" lay-filter="formRule_',that.id,'"></form>',
+                            '</li>',
+                        '</ul>',
+                    '</div>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            return ['<div layui-filter="toolbar_',that.id, '" class="layui-btn-container">',//涓诲垪琛ㄧ殑鎸夐挳
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_STAR"><i class="layui-icon layui-icon-ok-circle"></i>鍚敤</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_STOP"><i class="layui-icon layui-icon-404"></i>鍋滅敤</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'].join("");
+        };
+        this.init=function(){
+            //鍩虹鐨刪tml琚坊鍔犲悗锛屽啀鎵ц鍒濆鍖�
+            var that = this;
+            $webUtil.copyConfig(that,that.moduleKey);
+            $webUtil.bindDefultButtonLisenter(that, that.id);
+            that.initMainTree();
+
+        };
+        this.initMainTree = function() {
+            var that = this;
+            var tree = layui.tree;
+            var scrollHeight =  window.innerHeight;
+            var treeUL = $('[layui-filter="tree_' + that.id + '"]');
+            var treeHeight = scrollHeight - 200;
+            treeUL.parent().height(treeHeight);
+            treeUL.parent().width(180);
+            tree.init("tree_" + that.id, treeUL, {
+                url: that.url.classifyTree,
+                backPath: that.backPath,
+                extraParams: {
+                    isMuti: false,
+                    isQueryAllColumn: true
+                },
+                noApi:true,
+                showSearch:true,
+                click: function (item, elem, options) {
+                    that.currentItemOid = item.oid;
+                    that.currentItemAttributes = item.attributes;
+                    if(tree.config['oneTree_' + that.id] != undefined) {
+                        that.reload();
+                    } else {
+                        that.initOneTree();
+                    }
+                }
+            });
+        };
+
+        this.initOneTree = function(){
+            var that = this;
+            var tree = layui.tree;
+            var scrollHeight =  window.innerHeight;
+            var treeUL = $('[layui-filter="oneTree_' + that.id + '"]');
+            var treeHeight = scrollHeight - 200;
+            treeUL.parent().height(treeHeight);
+            tree.init("oneTree_" + that.id, treeUL, {
+                url: that.url.controller + that.url.oneTree,
+                backPath: that.backPath,
+                extraParams: {
+                    isQueryAllColumn: true,
+                    roleOid:that.currentItemOid
+                },
+                noApi:true,
+                showSearch:true,
+                isMuti: true,
+                click: function (item, elem, options) {
+            
+                },
+                done: function (thisFilter) {
+                    
+                }
+            });
+        };
+
+        this.SUBMIT = function(){ // 鎺堟潈
+            var that = this;
+            var tree = layui.tree;
+            if(that.currentItemOid == undefined) {
+                $webUtil.showErrorMsg("璇峰厛閫夋嫨涓�涓鑹�!");
+                return false;
+            }
+            if($webUtil.objIsNull(tree.getAllData)) {
+                $webUtil.showErrorMsg("鑷冲皯閫夋嫨涓�涓姛鑳芥ā鍧�!");
+                return false;
+            }
+            var submitData = {};
+            submitData.roleOid =that.currentItemOid
+            submitData.roleAuthorityDTOList = {};
+            var list = [];
+            $.each(tree.getAllData,function(k,v) {
+                list.push({
+                    functionOid: k
+                });
+            }); 
+            submitData.roleAuthorityDTOList = list;
+            // return false
+            $webUtil.manualAjax('post',that.url.controller + that.url.submit,JSON.stringify(submitData),function (result) {
+                if(result.success){
+                    $webUtil.showErrorMsg("鎺堟潈鎴愬姛",that.reload());
+                }else{
+                    $webUtil.showErrorMsg(result.msg);
+                }
+            },function (xhr,error) {
+                $webUtil.showErrorMsg("璁块棶鏈嶅姟鍣ㄥ嚭鐜颁簡閿欒锛屽彲鑳芥湇鍔″櫒娌℃湁寮�鍚紝鎴栬�呰繛鎺ュけ璐�");
+            },that.backPath);
+        };
+
+        this.AllCHECK = function(){ // 鍏ㄩ��
+            var that = this;
+            var tree = layui.tree;
+            if(that.currentItemOid == undefined) {
+                $webUtil.showErrorMsg("璇峰厛閫夋嫨涓�涓鑹�!");
+                return false;
+            }
+            tree.allSelect("oneTree_"+ that.id);            
+        };
+
+        this.NOCHECK = function(){ // 鍏ㄤ笉閫�
+            var that = this;
+            var tree = layui.tree;
+            if(that.currentItemOid == undefined) {
+                $webUtil.showErrorMsg("璇峰厛閫夋嫨涓�涓鑹�!");
+                return false;
+            }
+            tree.allUnSelect("oneTree_"+ that.id);  
+        };
+        
+        this.FCHECK = function(){ // 鍙嶉��
+            var that = this;
+            var tree = layui.tree;
+            if(that.currentItemOid == undefined) {
+                $webUtil.showErrorMsg("璇峰厛閫夋嫨涓�涓鑹�!");
+                return false;
+            }
+            tree.reverseChecked("oneTree_"+ that.id);  
+        };
+
+        this.DEL = function(){ // 绉婚櫎鏉冮檺
+            var that = this;
+            if(that.currentItemOid == undefined) {
+                $webUtil.showErrorMsg("璇峰厛閫夋嫨涓�涓鑹�!");
+                return false;
+            }
+            var submitData = {
+                roleOid:that.currentItemOid
+            }
+            $webUtil.ajax('post',that.url.controller + that.url.del,submitData,function (result) {
+                if(result.success){
+                    $webUtil.showErrorMsg("绉婚櫎鏉冮檺鎴愬姛");
+                    that.reload();
+                }else{
+                    $webUtil.showErrorMsg(result.msg);
+                }
+            },function (xhr,error) {
+                $webUtil.showErrorMsg("璁块棶鏈嶅姟鍣ㄥ嚭鐜颁簡閿欒锛屽彲鑳芥湇鍔″櫒娌℃湁寮�鍚紝鎴栬�呰繛鎺ュけ璐�");
+            },that.backPath);
+        }
+
+        this.refresh = function(parentNodeOid){
+            var that = this;
+            var tree = layui.tree;
+            if($webUtil.isNotNull(parentNodeOid)){
+                tree.reloadNode("tree_" + that.id,parentNodeOid);
+            }else {
+                tree.reload("tree_" + that.id);
+            }
+        };
+        this.reload = function(){
+            var that = this;
+            var tree = layui.tree;
+            tree.reload("oneTree_" + that.id,{
+                url: that.url.controller + that.url.oneTree,
+                backPath: that.backPath,
+                extraParams: {
+                    isQueryAllColumn: true,
+                    roleOid:that.currentItemOid
+                },
+                noApi:true,
+                showSearch:true,
+                isMuti: true,
+            });
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/securityManage/VciSmRole.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/securityManage/VciSmRole.js
new file mode 100644
index 0000000..0771a93
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/securityManage/VciSmRole.js
@@ -0,0 +1,535 @@
+/**
+ * 瑙掕壊绠$悊椤甸潰
+ * @author weidy
+ * @date 2020-10-19
+ */
+layui.define(['layer','element','form','table','dynamicCondition','upload','transfer'],function(exports){
+        var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "platform/securityManage/VciSmRole";
+        this.moduleKey = "SmRole";
+        this.backPath =  configData.compatibility?path:configData.frameworkPath;
+        this.url = {
+            controller:'roleController/',
+            dataGrid:'gridRole',
+            addSave:'add',
+            editSave:'edit',
+            deleteUrl:'delete',
+            enableData: 'enable',
+            disableData: 'disable',
+            downloadImportTemplate:'downloadImportTemplate',
+            importData : 'importData',
+            exportData : 'exportData',
+            getObjectByOid:'getObjectByOid',
+            referUser:'framework/userQueryController/refDataGrid',//浜哄憳鏍戠殑鍙傜収璺緞 
+            associatedUsers:'roleUserController/associatedUsers' // 鍏宠仈鐢ㄦ埛
+        };
+        this.getContent=function(){
+            var that = this;
+            var html = "";
+            html = [
+                '<div class="layui-layout" style="display:block;overflow-y: hidden;">',
+                    '<div class="layui-layout-border" style="display:block;margin-top:0px;overflow-x: hidden " id="border_',that.id,'">',
+                        '<div class="layui-center">',
+                            that.getToolbarHtml(),
+                            '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                            '<div id="toolbar_column_',that.id ,'" style="display:none;"></div>',
+                        '</div>',
+                        '<div class="layui-south">',
+                            '<div class="layui-tab-item layui-show">',
+                                '<table id="table_source_', that.id , '" lay-filter="source_',that.id , '" style="overflow-x:auto;"></table>',
+                                '<div id="toolbar_column_source_',that.id ,'" style="display:none;"></div>',
+                            '</div>',
+                        '</div>',
+                    '</div>',
+                '</div>'
+            ].join("");
+            return html;
+        }; 
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+       
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.createSearchHtml({id:"瑙掕壊缂栧彿",name:"瑙掕壊鍚嶇О"} ,$("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+        };
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            that.initMainTable();
+            that.createSearchHtml();
+            that.advancedQuery();
+            that.initSourceTable('111');
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var tableWidth = $("#border_" + that.id).width()-225;
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                width:tableWidth,
+                // selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'DEL'){
+                                that.DEL(data);
+                            }
+                            if(layEvent == 'ENABLE'){
+                                that.ENABLE(data);
+                            }
+                            if(layEvent == 'DISABLE'){
+                                that.DISABLE(data);
+                            }
+                            if(layEvent == 'AWARDUSER'){
+                                that.AWARDUSER(data);
+                            }
+                        });
+                    }else{
+                        if(total>0) {
+                            table.selectRecord('table_' + that.id, {index:0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                },
+                rowClick:function(thisTableFilter,record){
+                    table.reload("table_source_" + that.id, {
+                        extraParams: {
+                            "conditionMap['roleOid']": record.oid
+                        }
+                    });
+                }
+                
+            };
+            if(parentFieldName){
+                options.treeConfig = {
+                    treepid:parentFieldName,
+                    treeid:'id',
+                    showField:'name'
+                };
+            }
+            table.render(options);
+            // document.getElementById("toolbar_column_" + that.id).innerHTML = [
+            //     '<a class="layui-btn layui-btn-intable" lay-event="DEL">鍒犻櫎</a>',
+            //     '<a class="layui-btn layui-btn-intable" lay-event="ENABLE">鍚敤</a>',
+            //     '<a class="layui-btn layui-btn-intable" lay-event="DISABLE">鍋滅敤</a>',
+            //     '<a class="layui-btn layui-btn-intable" lay-event="AWARDUSER">鍏宠仈鐢ㄦ埛</a>',
+            // ].join('');
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),    {
+                    title: '缂栧彿',
+                    field: 'id',
+                    width: 150
+                },                    {
+                    title: '鍚嶇О',
+                    field: 'name',
+                    width: 150
+                },{
+                    title: '瑙掕壊绫诲瀷',
+                    field: 'roleClassifyText',
+                    width: 80
+                },{
+                    title: '瑙掕壊绠$悊鑼冨洿',
+                    field: 'roleControlAreaText',
+                    width: 100
+                },{
+                    title: '鎻忚堪',
+                    field: 'description',
+                    width: 150
+                },{
+                    title: '鐘舵��',
+                    field: 'lcStatusText',
+                    width: 60
+                },{
+                    field:'options',
+                    title:'鎿嶄綔',
+                    width: 230,
+                    fixed:'right',
+                    templet:function (d){
+                        var btns = [ '<a class="layui-btn layui-btn-intable" lay-event="DEL">鍒犻櫎</a>',
+                            '<a class="layui-btn layui-btn-intable" lay-event="AWARDUSER">鍏宠仈鐢ㄦ埛</a>'];
+                        if(d.lcStatus =='Enabled'){
+                            btns.push('<a class="layui-btn layui-btn-intable" lay-event="DISABLE">鍋滅敤</a>');
+                        }else{
+                            btns.push('<a class="layui-btn layui-btn-intable" lay-event="ENABLE">鍚敤</a>');
+                        }
+                        return btns.join('');
+                    }
+                    //toolbar: '#toolbar_column_' + that.id
+                }];
+            }
+        };
+        this.initSourceTable = function (oid) {
+            var table = layui.table;
+            var that = this;
+            that.checkSourceColumns(that);
+            table.render({
+                elem: '#table_source_' + that.id,
+                id: 'table_source_' + that.id,
+                url: configData.frameworkPath + 'userQueryController/gridUserByRoleOid',
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                method:'post',
+                cols: [that.sourceColumns],
+                where:{
+                    "conditionMap['roleOid']": oid
+                }
+            });
+        };
+        this.checkSourceColumns = function (that) {
+            var table = layui.table;
+            if(that.sourceColumns==null || that.sourceColumns.length==0) {
+                that.sourceColumns = [table.getIndexColumn(),  {
+                    field: 'id',
+                    title: '鐢ㄦ埛鍚�',
+                    width: 180
+                },{
+                    field: 'name',
+                    title: '濮撳悕',
+                    width: 130
+                },{
+                    field: 'pkDepartmentName',
+                    title: '閮ㄩ棬',
+                    width: 200
+                }];
+            }
+        };
+        this.getFormItems = function(onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [                {
+                field: 'id',
+                title: '缂栧彿',
+                required: true,
+                type: 'text',
+                readOnly:onlyShow
+            } ,                {
+                field: 'name',
+                title: '鍚嶇О',
+                required: true,
+                type: 'text',
+                readOnly:onlyShow
+            },
+                {
+                    field: 'roleClassify',
+                    title: '瑙掕壊绫诲瀷',
+                    type: 'combox',
+                    comboxKey: 'roleclassify',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'roleControlArea',
+                    title: '瑙掕壊绠$悊鑼冨洿',
+                    type: 'combox',
+                    defaultValue:'role_bs',
+                    comboxKey: 'roleControlArea',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'description',
+                    title: '鎻忚堪',
+                    type: 'text',
+                    readOnly:onlyShow
+                } ];
+        };
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            that.addOrEdit(false,oid);
+        };
+        this.addOrEdit = function(add,oid) {
+            var that = this;
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var addSaveIndex =webUtil.dialog({
+                title:add?'娣诲姞瑙掕壊绠$悊':'淇敼瑙掕壊绠$悊',
+                btn:['淇濆瓨','鍙栨秷'],
+                skin:'layui-layer-lan',
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                area:['900px','400px'],
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getFormItems(false),
+                        function () {
+                            if(!add){
+                                form.load(filter,{
+                                    backPath:that.backPath,
+                                    url:that.url.controller + that.url.getObjectByOid,
+                                    method:'get',
+                                    params:{
+                                        oid:oid
+                                    }
+                                });
+                            }else{
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+                        }, {}, {defaultColumnOneRow: 2});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        var url = that.url.controller + (add?that.url.addSave:that.url.editSave);
+                        webUtil.ajax(add?'post':'put',url,values,function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function(data){
+            var that = this;
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,{oid:data.oid,ts:data.ts},function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+        this.refresh = function () {
+            var that = this;
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+        this.DISABLE = function (data) {
+            var that = this;
+            if(data.lcStatus == 'Disabled') {
+                $webUtil.showMsg($webUtil.starORstop(data.lcStatus))
+                return false;
+            }
+            that.disableOrEnable(false,data);
+        };
+        this.ENABLE = function (data) {
+            var that = this;
+            if(data.lcStatus == 'Enabled') {
+                $webUtil.showMsg($webUtil.starORstop(data.lcStatus))
+                return false;
+            }
+            that.disableOrEnable(true,data);
+        };
+        this.disableOrEnable = function (enable,data) {
+            var that = this;
+            ts = webUtil.getOidFromGrid("table_" + that.id,false,false,'ts');
+            webUtil.post(that.url.controller + (enable?that.url.enableData:that.url.disableData),{
+                oid:data.oid,
+                ts:data.ts
+                },function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,(enable?'鍚敤鎴愬姛':'鍋滅敤鎴愬姛'));
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+        };
+
+        this.EXPORT = function () {
+            var that = this;
+            var iframeId = MD5("export" +webUtil.getSystemVar(webUtil.systemValueKey.currentDateTimeSSS) +webUtil.getSystemVar(webUtil.systemValueKey.userOid));
+            var data = {};
+            data[TOKEN_KEY] = webUtil.getToken();
+            data['downloadUUID'] = iframeId;
+            webUtil.fileDownloadPost(that.backPath + that.url.controller + that.url.exportData,data);
+        };
+        this.IMPORT = function () {
+            var that = this;
+            var filter =that.id + "_upload";
+            var form = layui.form;
+            var uploadIndex = webUtil.dialog({
+                title:'瀵煎叆瑙掕壊绠$悊',
+                btn:['涓嬭浇瀵煎叆妯℃澘','鍙栨秷'],
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" enctype="multipart/form-data"></form>',
+                area: ['300px', '300px'],
+                resize:false,
+                success:function(layero){
+                    //濡傛灉瀵煎叆鏈夊叾浠栨搷浣滐紝鍦ㄧ浜屼釜鍙傛暟涓坊鍔�
+                    form.addItems(filter,[],function(){
+                        $("#form_" + filter).append('<button type="button" class="layui-btn" id="' + that.id + '_upload_form_file" style="margin-left:100px;margin-top:80px;"><i class="layui-icon">&#xe67c;</i>閫夋嫨鏂囦欢鍚庤嚜鍔ㄥ鍏�</button>&nbsp;&nbsp;&nbsp;&nbsp;');
+                        var upload = layui.upload;
+                        //鎵ц瀹炰緥
+                        var uploadInst = upload.render({
+                            elem: '#' + that.id + '_upload_form_file' //缁戝畾鍏冪礌
+                            ,accept:'file'
+                            ,acceptMime:'file/*'
+                            ,exts:'xls|xlsx'
+                            ,url: that.backPath + that.url.controller + that.url.importData
+                            ,done: function(result){
+                                if(result.success){
+                                    layer.close(uploadIndex);
+                                    webUtil.showMsgFromResult(result,"瀵煎叆鎴愬姛");
+                                    that.refresh();
+                                }else{
+                                    webUtil.showErrorMsg(result.msg);
+                                }
+                            }
+                            ,error: function(){
+                                //璇锋眰寮傚父鍥炶皟
+                                 webUtil.showErrorMsg("涓婁紶寮傚父");
+                            }
+                        });
+                    },{},{
+                        defaultColumnOneRow:1
+                    });
+                },
+                yes:function(){
+                    var iframeId = MD5("downloadImportTemplate" +webUtil.getSystemVar(webUtil.systemValueKey.currentDateTimeSSS)  +webUtil.getSystemVar(webUtil.systemValueKey.userOid));
+                    webUtil.fileDownload(that.backPath + that.url.controller + that.url.downloadImportTemplate+ "?" + TOKEN_KEY + "=" + webUtil.getToken()  + "&downloadUUID=" + iframeId );
+                }
+            });
+        };
+        this.AWARDUSER = function(data){
+            var that = this;
+            that.transferOpen(data.oid);
+        };
+
+        this.transferOpen = function(oid) {
+            var that = this;
+            var addSaveIndex = layer.open({
+                title:'鍏宠仈鐢ㄦ埛',
+                btn:['淇濆瓨','鍙栨秷'],
+                skin:'layui-layer-lan',
+                content:'<div id="inkperson_'+that.id+'" class="demo-transfer"></div>',
+                area:['780px','600px'],
+                closeBtn: 2,
+                shade: true,
+                shadeClose: true,
+                resize: false,
+                success:function(layero) {
+                    var submitData = {
+                        "conditionMap['roleOid']": oid
+                    }
+                    layui.transfer.render({ 
+                        elem: '#inkperson_'+that.id
+                        ,url: 'userQueryController/listUserUnInRoleOids'
+                        ,where:{roleOid:oid}
+                        ,backPath:configData.frameworkPath
+                        ,selectUrl: 'userQueryController/gridUserByRoleOid'
+                        ,selectWhere:submitData
+                        ,selectMethod:'post'
+                        ,selectBackPath:configData.frameworkPath
+                        ,width: 300
+                        ,height: 450
+                        ,id:'linkuser_'+that.id//绱㈠紩
+                        ,parseData: function(res){
+                            return {
+                                "value": res.oid //鏁版嵁鍊�
+                                ,"title": res.id + " " + res.name//鏁版嵁鏍囬
+                            }
+                        }
+                        ,title: ['鏈�夌敤鎴�', '宸查�夌敤鎴�']
+                        ,showSearch: true
+                    })
+                },
+                yes:function(layero){
+                    var getData = layui.transfer.getData('linkuser_'+that.id);
+                    var values = {
+                        roleOid:oid
+                    }
+                    var usersOid = [];
+                    $.each(getData,function(k,v) {
+                        usersOid.push(v.value)
+                    })
+                    values.usersOid = usersOid.join(',');
+                    var url = that.url.associatedUsers;
+                    webUtil.ajax('post',url,values,function(result){
+                        if(result.success){
+                            webUtil.showMsgFromResult(result,"鍏宠仈鎴愬姛!");
+                            layer.close(addSaveIndex);
+                            that.refresh();
+                        }else{
+                            webUtil.showErrorMsg(result.msg);
+                        }
+                    },function(xhr,err){
+                        webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                    },that.backPath);
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+
+        this.ADVQUERY = function(){//楂樼骇鏌ヨ
+            var that = this;
+            that.serinorQueryInstance.open();
+        };
+        this.advancedQuery = function(){
+            var that = this;
+            var dynamicCondition = layui.dynamicCondition;
+
+            var smUserTable = JSON.parse(JSON.stringify(that.columns));
+            $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar'+ that.id+'" class="layui-inline"></div>');
+            that.serinorQueryInstance = dynamicCondition.create({
+                fields : smUserTable//鏌ヨ瀛楁
+                ,tableId:"table_"+that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                ,type:"complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                // ,conditionTextId:"#toolbar"+that.id//楂樼骇鏌ヨ 鎸夐挳鎵�鍦ㄧ殑div
+                // ,popupShowQueryBtn: true//鏄剧ず楂樼骇鏌ヨ鎸夐挳
+                ,queryCallBack:function(requestData){//鏌ヨ涔嬪悗鐨刢allback
+                    //console.log(JSON.stringify(requestData))
+                }
+            });
+        };
+        this.refresh = function () {
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/securityManage/VciSmUser.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/securityManage/VciSmUser.js
new file mode 100644
index 0000000..c2f8ec8
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/platform/securityManage/VciSmUser.js
@@ -0,0 +1,1046 @@
+/**
+ * 鐢ㄦ埛绠$悊椤甸潰
+ * @author weidy
+ * @date 2020-08-13
+ */
+layui.define(['layer','element','form','table','dynamicCondition','upload' ],function(exports){
+        var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "platform/securityManage/VciSmUser";
+        this.moduleKey = "SmUser";
+        this.backPath =  configData.compatibility?path:configData.frameworkPath;
+        this.url = {
+            refDepartment:'departmentQueryController/refTree',
+            controller:'smUserController/',
+            dataGrid:'gridSmUser',
+            addSave:'addSave',
+            editSave:'editSave',
+            deleteUrl:'deleteData',
+            enableData: 'enableData',
+            disableData: 'disableData',
+            downloadImportTemplate:'downloadImportTemplate',
+            importData : 'importData',
+            exportData : 'exportData',
+            unlock:'unlockUser',
+            lock:'lockUser',
+            getObjectByOid:'getObjectByOid',
+            batchSetUserDept:'batchSetUserDept',
+            batchSetSecretGrade:'batchSetSecretGrade',
+            batchSetWorkType:'batchSetWorkType',
+            batchSetPasswordStrategy:'batchSetPasswordStrategy'
+        };
+        this.getContent=function(){
+            var that = this;
+            var html = "";
+            html = [
+                '<div class="layui-layout" style="display:block;overflow-y: hidden">',
+                    that.getWestToolbarHtml(),
+                    '<div class="layui-vci-tree" style="width:250px;float: left;background-color:#ffffff;overflow-y: auto;">',
+                        '<label class="layui-icon layui-icon-tree" style="line-height: 20px;color:red;font-size:20px;">閮ㄩ棬淇℃伅</label>',
+                        '<ul layui-filter="tree_',that.id,'"><ul>',
+                    '</div>',
+                    '<div class="layui-layout-border" style="display:block;margin-top:0px; margin-left:255px;overflow-x:hidden;" id="border_',that.id,'">',
+                        '<div class="layui-center" style="overflow-y:auto;overflow-x:hidden;">',
+                            that.getToolbarHtml(),
+                            '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                            '<div id="toolbar_column_',that.id ,'" style="display:none;"></div>',
+                        '</div>',
+                        '<div class="layui-south">',
+                            '<div class="layui-tab-item layui-show">',
+                                '<table id="table_source_', that.id , '" lay-filter="source_',that.id , '" style="overflow-x:auto;"></table>',
+                                '<div id="toolbar_column_source_',that.id ,'" style="display:none;"></div>',
+                            '</div>',
+                        '</div>',
+                    '</div>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getWestToolbarHtml = function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_west_',that.id,'" class="layui-btn-container layui-buttons">',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                // '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                // '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                // '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DISABLE"><i class="layui-icon layui-icon-404"></i>鍋滅敤</button>',
+                // '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ENABLE"><i class="layui-icon layui-icon-ok-circle"></i>鍚敤</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EXPORT"><i class="layui-icon layui-icon-export"></i>瀵煎嚭</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_IMPORT"><i class="layui-icon layui-icon-upload-drag"></i>瀵煎叆</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ALLOTDEPT"><i class="layui-icon layui-icon-app"></i>鎵归噺璁剧疆閮ㄩ棬</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ALLOTSECRET"><i class="layui-icon layui-icon-app"></i>鎵归噺璁剧疆瀵嗙骇</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ALLOTWORKTYPE"><i class="layui-icon layui-icon-app"></i>鎵归噺璁剧疆宸ョ</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ALLOTPOLICY"><i class="layui-icon layui-icon-app"></i>鎵归噺璁剧疆瀹夊叏绛栫暐</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ALLOTPASSWORD"><i class="layui-icon layui-icon-app"></i>鎵归噺閲嶇疆瀵嗙爜</button>',
+
+                '</div>'
+            ];
+            return html.join("");
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.createSearchHtml({id:"鐢ㄦ埛鍚�",name:"濮撳悕"} ,$("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+        };
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            that.initTree();
+            that.initMainTable();
+            that.createSearchHtml();
+            that.advancedQuery();
+            that.initSourceTable('111');
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var tableWidth = $("#border_" + that.id).width();
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                width:tableWidth,
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'edit'){
+                                that.addOrEdit(false,data.oid);
+                            }else if(layEvent =='delete'){
+                                that.DEL(data.oid,data.ts);
+                            }else if(layEvent == 'unlock'){
+                                that.UNLOCK(data.oid);
+                            }else if(layEvent == 'lock'){
+                                that.LOCK(data.oid);
+                            }else if(layEvent == 'ENABLE'){ // 鍚敤
+                                that.ENABLE(data);
+                            }else if(layEvent == 'DISABLE'){  // 鍋滅敤
+                                that.DISABLE(data);
+                            }
+                            
+                        });
+                    }else{
+                        if(total>0) {
+                            table.selectRecord('table_' + that.id, {index:0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                },
+                rowClick:function(thisTableFilter,record){
+                table.reload("table_source_" + that.id, {
+                    extraParams: {
+                        "conditionMap['userOid']": record.oid
+                    }
+                });
+            }
+            };
+            if(parentFieldName){
+                options.treeConfig = {
+                    treepid:parentFieldName,
+                    treeid:'id',
+                    showField:'name'
+                };
+            }
+            table.render(options);
+            // document.getElementById("toolbar_column_" + that.id).innerHTML =
+            //     '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>';
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),
+                    {
+                        title: '鐢ㄦ埛鍚�',
+                        field: 'id',
+                        width: 150
+                    },{
+                        title: '濮撳悕',
+                        field: 'name',
+                        width: 90
+                    },{
+                        title: '宸ュ彿',
+                        field: 'workNo',
+                        width: 100
+                    },{
+                        title: '閭欢鍦板潃',
+                        field: 'email',
+                        width: 150
+                    },{
+                        title: '鐢佃瘽',
+                        field: 'tel',
+                        width: 110
+                    },{
+                        title: '鎵�灞炲瘑鐮佸畨鍏ㄧ瓥鐣�',
+                        field: 'pkPasswordStrategyName',
+                        width: 150
+                    },{
+                        title: '鎬у埆',
+                        field: 'sexText',
+                        width: 50
+                    },{
+                        title: '璇█缂栫爜',
+                        field: 'langCodeText',
+                        width: 100
+                    },{
+                        title: '閿佸畾',
+                        field: 'lockFlag',
+                        width: 50,
+                        templet: function (d) {
+                            return webUtil.formateBoolean(d.lockFlag);
+                        }
+                    },{
+                        title: '鎵�灞炲伐绉�',
+                        field: 'pkWorkTypeText',
+                        width: 150
+                    },{
+                        title: '鐘舵��',
+                        field: 'lcStatusText',
+                        width: 60
+                    },{
+                        title: '瀵嗙骇',
+                        field: 'secretGradeText',
+                        width: 50
+                    },{
+                        title: '澶辨晥鏃ユ湡',
+                        field: 'disabledate',
+                        width: 110,
+                        hidden:true,
+                        templet: function (d) {
+                            return webUtil.formateDate(d.disabledate);
+                        }
+                    },{
+                        title: '鎻忚堪',
+                        field: 'description',
+                        width: 150
+                    },{
+                        title: '瀹炴椂閫氳杞欢璐﹀彿',
+                        field: 'iMNo',
+                        hidden:true,
+                        width: 150
+                    },{
+                        title:'鎿嶄綔',
+                        field:'options',
+                        width: 200,
+                        fixed:'right',
+                        templet:function(d){
+                            var btns =[];
+                            if(d.lockFlag){
+                                btns.push('<a class="layui-btn layui-btn-intable" lay-event="unlock" id="unlock_'+d.oid+'">瑙i攣</a>');
+                            }else{
+                                btns.push('<a class="layui-btn layui-btn-intable" lay-event="lock" id="lock_'+d.oid+'">閿佸畾</a>');
+                            }
+                            if(d.lcStatus != 'Enabled') {
+                                btns.push('<a class="layui-btn layui-btn-intable" lay-event="ENABLE" id="ENABLE_'+d.oid+'">鍚敤</a>');
+                            } else {
+                                btns.push('<a class="layui-btn layui-btn-intable" lay-event="DISABLE" id="DISABLE_'+d.oid+'">鍋滅敤</a>');
+                            }
+                            btns.push('<a class="layui-btn layui-btn-intable" lay-event="edit" id="edit_'+d.oid+'">缂栬緫</a>');
+                            btns.push('<a class="layui-btn layui-btn-intable" lay-event="delete" id="delete_'+d.oid+'">鍒犻櫎</a>');
+
+                            return btns.join("");
+                        }
+                    }];
+            }
+        };
+
+        this.initTree = function () {
+            var that = this;
+            var tree = layui.tree;
+            var scrollHeight =  window.innerHeight;
+            var treeUL = $('[layui-filter="tree_' + that.id + '"]');
+            var treeHeight = scrollHeight - 200;
+            treeUL.parent().height(treeHeight);
+            tree.init("tree_" + that.id, treeUL, {
+                url: that.url.refDepartment,
+                backPath: that.backPath,
+                extraParams: {
+                    isMuti: false,
+                    isQueryAllColumn: true
+                },
+                showSearch:true,
+                click: function (item, elem, options) {
+                    that.currentItemOid = item.oid;
+                    that.currentItemAttributes = item.attributes;
+                    that.setFormValues();
+                }
+            });
+        };
+        this.setFormValues = function () {
+            var that = this;
+            layui.table.reload('table_' + that.id,{
+                extraParams:{pkDepartment:that.currentItemAttributes.oid},
+                page: {
+                    curr: 1
+                }
+            });
+        };
+        this.getFormItems = function(onlyShow,isEdit) {
+            var that = this;
+            var table = layui.table;
+            return [
+                {
+                    field: 'id',
+                    title: '鐢ㄦ埛鍚�',
+                    required: true,
+                    type: 'text',
+                    readOnly:(onlyShow||isEdit)
+                } ,                {
+                    field: 'name',
+                    title: '濮撳悕',
+                    required: true,
+                    type: 'text',
+                    readOnly:onlyShow
+                },                {
+                    field: 'password',
+                    title: '鐢ㄦ埛瀵嗙爜',
+                    required: !isEdit,
+                    type: 'password',
+                    hidden:isEdit,
+                    readOnly:onlyShow
+                },                {
+                    field: 'confirmPassword',
+                    title: '纭瀵嗙爜',
+                    required: !isEdit,
+                    type: 'password',
+                    hidden:isEdit,
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'pkDepartment',
+                    title: '鎵�灞為儴闂�',
+                    required: true,
+                    type: 'refer',
+                    showField: 'pkDepartmentName',
+                    referConfig: {
+                        textField: 'name',
+                        valueField: 'oid',
+                        backPath: that.backPath,
+                        isMuti: false,
+                        type: 'tree',
+                        url: that.url.refDepartment
+                    },
+                    readOnly:onlyShow
+                }   ,                {
+                    field: 'sex',
+                    title: '鎬у埆',
+                    required: false,
+                    type: 'combox',
+                    comboxKey: 'sex',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'langCode',
+                    title: '榛樿鐨勮瑷�缂栫爜',
+                    required: false,
+                    type: 'combox',
+                    comboxKey: 'langCode',
+                    readOnly:onlyShow
+                }  ,                {
+                    field: 'pkWorkType',
+                    title: '鎵�灞炲伐绉�',
+                    required: false,
+                    type: 'refer',
+                    showField: 'pkWorkTypeText',
+                    referConfig: {
+                       type:layui.vciAlias.referRegister.workTypeRefer
+                    },
+                    readOnly:onlyShow
+                },{
+                    field:'workNo',
+                    title:'宸ュ彿',
+                    readOnly: onlyShow
+
+                } ,                {
+                    field: 'pkPasswordStrategy',
+                    title: '鎵�灞炲瘑鐮佸畨鍏ㄧ瓥鐣�',
+                    required: true,
+                    type: 'refer',
+                    showField: 'pkPasswordStrategyName',
+                    referConfig: {
+                        textField: 'name',
+                        valueField: 'oid',
+                        backPath: that.backPath,//娉ㄦ剰杩欓噷闇�瑕佷慨鏀瑰弬鐓х殑瀵瑰簲璺緞
+                        isMuti: false,
+                        type: 'grid',
+                        tableConfig:{
+                            page:{
+                                limit:15,
+                                page:1
+                            },
+                            cols:[table.getIndexColumn(),table.getCheckColumn(),{
+                                field:'id',
+                                title:'绛栫暐缂栧彿',
+                                width:180
+                            },{
+                                field:'name',
+                                title:'绛栫暐鍚嶇О',
+                                width:180
+                            }],
+                            queryColumns:[{
+                                field:'id',
+                                title:'绛栫暐缂栧彿'
+                            },{
+                                field:'name',
+                                title:'绛栫暐鍚嶇О'
+                            }]
+                        },
+                        url: 'smPasswordStrategyController/refDataGrid'
+                    },
+                    readOnly:onlyShow
+                }  ,                {
+                    field: 'disabledate',
+                    title: '澶辨晥鏃ユ湡',
+                    type: 'date',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'email',
+                    title: '閭欢鍦板潃',
+                    required: false,
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'tel',
+                    title: '鐢佃瘽',
+                    required: false,
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'rtxNo',
+                    title: 'RTX鑱旂郴鍙�',
+                    required: false,
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'iMNo',
+                    title: '瀹炴椂閫氳杞欢璐﹀彿',
+                    required: false,
+                    type: 'text',
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'description',
+                    title: '鎻忚堪',
+                    required: false,
+                    type: 'text',
+                    readOnly:onlyShow
+                }  ,                {
+                    field: 'secretGrade',
+                    title: '鐢ㄦ埛瀵嗙骇',
+                    required: true,
+                    readOnly:onlyShow,
+                    type:'combox',
+                    data:[{"key":"10","value":"鍐呴儴"},{"key":"20","value":"涓�鑸�"},{"key":"30","value":"閲嶈"}]
+                }];
+        };
+        this.initSourceTable = function (oid) {
+            var table = layui.table;
+            var that = this;
+            that.checkSourceColumns(that);
+            table.render({
+                elem: '#table_source_' + that.id,
+                id: 'table_source_' + that.id,
+                url: configData.frameworkPath + 'roleQueryController/gridRoleByUserOid',
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                method:'post',
+                cols: [that.sourceColumns],
+                where:{
+                    "conditionMap['userOid']": oid
+                }
+            });
+        };
+        this.checkSourceColumns = function (that) {
+            var table = layui.table;
+            if(that.sourceColumns==null || that.sourceColumns.length==0) {
+                that.sourceColumns = [table.getIndexColumn(),  {
+                    field: 'id',
+                    title: '瑙掕壊缂栫爜',
+                    width: 180
+                },{
+                    field: 'name',
+                    title: '瑙掕壊鍚嶇О',
+                    width: 180
+                },{
+                    field: 'roleClassifyText',
+                    title: '瑙掕壊绫诲瀷',
+                    width: 100
+                },{
+                    field: 'roleControlAreaText',
+                    title: '瑙掕壊绠$悊鑼冨洿',
+                    width: 100
+                }];
+            }
+        };
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            that.addOrEdit(false,oid);
+        };
+        this.addOrEdit = function(add,oid) {
+            var that = this;
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var addSaveIndex =webUtil.dialog({
+                title:add?'娣诲姞鐢ㄦ埛绠$悊':'淇敼鐢ㄦ埛绠$悊',
+                btn:['淇濆瓨','鍙栨秷'],
+                skin:'layui-layer-lan',
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                area:['1210px','500px'],
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getFormItems(false,!add),
+                        function () {
+                            if(!add){
+                                form.load(filter,{
+                                    backPath:that.backPath,
+                                    url:that.url.controller + that.url.getObjectByOid,
+                                    method:'get',
+                                    params:{
+                                        oid:oid
+                                    }
+                                });
+                            }else{
+                                var defaultValues = {
+                                    sex:'sex_man',
+                                    langCode:'zh_CN',
+                                    pkDepartment:(that.currentItemAttributes?that.currentItemAttributes.oid:""),
+                                    pkDepartmentName:(that.currentItemAttributes?that.currentItemAttributes.name:""),
+                                };
+
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+                        }, {}, {defaultColumnOneRow: 3});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        if(values['password'] !=  values['confirmPassword']){
+                            $webUtil.showErrorMsg("涓ゆ瀵嗙爜杈撳叆涓嶄竴鑷�");
+                            return false;
+                        }
+                        var url = that.url.controller + (add?that.url.addSave:that.url.editSave);
+                        webUtil.ajax(add?'post':'put',url,values,function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function(oid,ts){
+            var that = this;
+            // var oid = webUtil.getOidFromGrid("table_" +that.id,true,true);
+            // if(!oid){
+            //     return false;
+            // }
+            //var ts= webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+        this.UNLOCK = function (oid){
+            var that = this;
+            webUtil.showConfirmMsg("鏄惁瑙i攣杩欎釜鐢ㄦ埛",function (){
+                webUtil.post(that.url.controller + that.url.unlock,{oid:oid},function (result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"瑙i攣鐢ㄦ埛鎴愬姛");
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+        this.LOCK = function (oid){
+            var that = this;
+            webUtil.showConfirmMsg("鏄惁閿佸畾杩欎釜鐢ㄦ埛",function (){
+                webUtil.post(that.url.controller + that.url.lock,{oid:oid},function (result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"閿佸畾鐢ㄦ埛鎴愬姛");
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+        this.refresh = function () {
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+        this.DISABLE = function (data) {
+            var that = this;
+            if(data.lcStatus == 'Disabled') {
+                $webUtil.showMsg($webUtil.starORstop(data.lcStatus))
+                return false;
+            }
+            that.disableOrEnable(false,data);
+        };
+        this.ENABLE = function (data) {
+            var that = this;
+            if(data.lcStatus == 'Enabled') {
+                $webUtil.showMsg($webUtil.starORstop(data.lcStatus))
+                return false;
+            }
+            that.disableOrEnable(true,data);
+        };
+        this.disableOrEnable = function (enable,data) {
+            var that = this;
+            webUtil.post(that.url.controller + (enable?that.url.enableData:that.url.disableData),{
+                oid:data.oid,
+                ts:data.ts
+                },function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,(enable?'鍚敤鎴愬姛':'鍋滅敤鎴愬姛'));
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+        };
+
+        this.EXPORT = function () {
+            var that = this;
+            var iframeId = MD5("export" +webUtil.getSystemVar(webUtil.systemValueKey.currentDateTimeSSS) +webUtil.getSystemVar(webUtil.systemValueKey.userOid));
+            var data = {};
+            data[TOKEN_KEY] = $webUtil.getToken() ;
+            data['downloadUUID'] = iframeId;
+            webUtil.fileDownloadPost(that.backPath + that.url.controller + that.url.exportData,data);
+        };
+        this.IMPORT = function () {
+            var that = this;
+            var filter =that.id + "_upload";
+            var form = layui.form;
+            var uploadIndex = webUtil.dialog({
+                title:'瀵煎叆鐢ㄦ埛绠$悊',
+                btn:['涓嬭浇瀵煎叆妯℃澘','鍙栨秷'],
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" enctype="multipart/form-data"></form>',
+                area: ['300px', '300px'],
+                resize:false,
+                success:function(layero){
+                    //濡傛灉瀵煎叆鏈夊叾浠栨搷浣滐紝鍦ㄧ浜屼釜鍙傛暟涓坊鍔�
+                    form.addItems(filter,[],function(){
+                        $("#form_" + filter).append('<button type="button" class="layui-btn" id="' + that.id + '_upload_form_file" style="margin-left:100px;margin-top:80px;"><i class="layui-icon">&#xe67c;</i>閫夋嫨鏂囦欢鍚庤嚜鍔ㄥ鍏�</button>&nbsp;&nbsp;&nbsp;&nbsp;');
+                        var upload = layui.upload;
+                        //鎵ц瀹炰緥
+                        var uploadInst = upload.render({
+                            elem: '#' + that.id + '_upload_form_file' //缁戝畾鍏冪礌
+                            ,accept:'file'
+                            ,acceptMime:'file/*'
+                            ,exts:'xls|xlsx'
+                            ,auto:true
+                            ,url: that.backPath + that.url.controller + that.url.importData
+                            ,before:function(obj){            
+                                obj.setData();
+                                return true;
+                            }
+                            ,done: function(result){
+                                if(result.success){
+                                    layer.close(uploadIndex);
+                                    webUtil.showMsgFromResult(result,"瀵煎叆鎴愬姛");
+                                    that.refresh();
+                                }else{
+                                    webUtil.showErrorMsg(result.msg);
+                                }
+                            }
+                            ,error: function(){
+                                //璇锋眰寮傚父鍥炶皟
+                                 webUtil.showErrorMsg("涓婁紶寮傚父");
+                            }
+                        });
+                    },{},{
+                        defaultColumnOneRow:1
+                    });
+                },
+                yes:function(){
+                    var iframeId = MD5("downloadImportTemplate" +webUtil.getSystemVar(webUtil.systemValueKey.currentDateTimeSSS)  +webUtil.getSystemVar(webUtil.systemValueKey.userOid));
+                    webUtil.fileDownload(that.backPath + that.url.controller + that.url.downloadImportTemplate+ "?" + TOKEN_KEY + "=" + $webUtil.getToken()  + "&downloadUUID=" + iframeId );
+                }
+            });
+        };
+        this.ADVQUERY = function(){//楂樼骇鏌ヨ
+            var that = this;
+            that.serinorQueryInstance.open();
+        };
+        this.advancedQuery = function(){
+            var that = this;
+            var dynamicCondition = layui.dynamicCondition;
+
+            var smUserTable = JSON.parse(JSON.stringify(that.columns));
+            $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar'+ that.id+'" class="layui-inline"></div>');
+            that.serinorQueryInstance = dynamicCondition.create({
+                fields : smUserTable//鏌ヨ瀛楁
+                ,tableId:"table_"+that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                ,type:"complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                // ,conditionTextId:"#toolbar"+that.id//楂樼骇鏌ヨ 鎸夐挳鎵�鍦ㄧ殑div
+                // ,popupShowQueryBtn: true//鏄剧ず楂樼骇鏌ヨ鎸夐挳
+                ,queryCallBack:function(requestData){//鏌ヨ涔嬪悗鐨刢allback
+                    //console.log(JSON.stringify(requestData))
+                }
+            });
+        };
+        this.refresh = function(){ 
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+
+        this.ALLOTDEPT = function() { // 鎵归噺璁剧疆閮ㄩ棬
+            var that = this;
+            var selectData  = layui.table.checkStatus("table_" + that.id).data;
+            if(selectData.length <= 0) {
+                webUtil.showErrorMsg('璇疯嚦灏戦�夋嫨涓�鍚嶇敤鎴�!');
+                return false;
+            }
+            var seleArr = []
+            $.each(selectData,function(k,v){
+                seleArr.push(v.oid)
+            });
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var addSaveIndex = layer.open({
+                type:1,
+                title:'鎵归噺璁剧疆閮ㄩ棬',
+                btn:['淇濆瓨','鍙栨秷'],
+                skin:'layui-layer-lan',
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                area: ['600px', '350px'],
+                closeBtn: 2,
+                shade: true,
+                shadeClose: true,
+                resize: false,
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,[{
+                        field: 'useDeptId',
+                        title: '浣跨敤閮ㄩ棬',
+                        required: true,
+                        type: 'refer',
+                        showField: 'useDeptName',
+                        referConfig: {
+                            type:'tree',
+                            url:'/departmentQueryController/refTree',
+                            backPath:configData.frameworkPath,
+                            textField:'name',
+                            valueField:'oid',
+                            isMuti:false
+                        }
+                    }],
+                    function () {}, {}, {defaultColumnOneRow: 1});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        values.deptOid = values.useDeptId;
+                        values.userOidS = seleArr.join(',');
+                        var url = that.url.controller +that.url.batchSetUserDept;
+                        webUtil.ajax('post',url,values,function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,("璁剧疆鎴愬姛!"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        }
+
+        this.ALLOTSECRET = function() { // 鎵归噺璁剧疆瀵嗙骇
+            var that = this;
+            var selectData  = layui.table.checkStatus("table_" + that.id).data;
+            if(selectData.length <= 0) {
+                webUtil.showErrorMsg('璇疯嚦灏戦�夋嫨涓�鍚嶇敤鎴�!');
+                return false;
+            }
+            var seleArr = []
+            $.each(selectData,function(k,v){
+                seleArr.push(v.oid)
+            });
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var addSaveIndex = layer.open({
+                type:1,
+                title:'鎵归噺璁剧疆瀵嗙骇',
+                btn:['淇濆瓨','鍙栨秷'],
+                skin:'layui-layer-lan',
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                area: ['600px', '350px'],
+                closeBtn: 2,
+                shade: true,
+                shadeClose: true,
+                resize: false,
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,[{
+                        field: 'secretGrade',
+                        title: '鐢ㄦ埛瀵嗙骇',
+                        required: true,
+                        type:'combox',
+                        data:[{"key":"10","value":"鍐呴儴"},{"key":"20","value":"涓�鑸�"},{"key":"30","value":"閲嶈"}]
+                    }],
+                    function () {}, {}, {defaultColumnOneRow: 1});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        values.userOidS = seleArr.join(',');
+                        var url = that.url.controller + that.url.batchSetSecretGrade;
+                        webUtil.ajax('post',url,values,function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,("璁剧疆鎴愬姛!"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        }
+
+        this.ALLOTWORKTYPE = function() { // 鎵归噺璁剧疆宸ョ
+            var that = this;
+            var selectData  = layui.table.checkStatus("table_" + that.id).data;
+            if(selectData.length <= 0) {
+                webUtil.showErrorMsg('璇疯嚦灏戦�夋嫨涓�鍚嶇敤鎴�!');
+                return false;
+            }
+            var seleArr = []
+            $.each(selectData,function(k,v){
+                seleArr.push(v.oid);
+            });
+            var target = {
+                setValue: function (filter, name, value, rawValue, isClose, allSelectValues) {
+                    var values = {};
+                    values.userOidS = seleArr.join(',');
+                    var workTypeOids= [];
+                    layui.each(allSelectValues,function (_index,_item){
+                        workTypeOids.push(_item.oid);
+                    });
+                    values.workTypeOid = workTypeOids.join(',');
+                    var url = that.url.controller + that.url.batchSetWorkType;
+                    webUtil.ajax('post',url,values,function(result){
+                        if(result.success){
+                            webUtil.showMsgFromResult(result,("璁剧疆鎴愬姛!"));
+                            that.refresh();
+                        }else{
+                            webUtil.showErrorMsg(result.msg);
+                        }
+                    },function(xhr,err){
+                        webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                    },that.backPath);
+                }
+            }
+            var filter ="form_" + that.id;
+            var referConfig = {
+                filter:filter,
+                name:'worktype',
+                title:'鎵归噺璁剧疆宸ョ',
+                options: {
+                    filter:filter,
+                    name:'worktype',
+                },
+                isMuti:false,
+                target:target,
+                value:'',
+                text:''
+            };
+            layui[layui.vciAlias.referRegister.workTypeRefer].showReferDialog(referConfig);
+
+        }
+
+        this.ALLOTPOLICY = function() { // 鎵归噺璁剧疆瀹夊叏绛栫暐
+            var that = this;
+            var selectData  = layui.table.checkStatus("table_" + that.id).data;
+            if(selectData.length <= 0) {
+                webUtil.showErrorMsg('璇疯嚦灏戦�夋嫨涓�鍚嶇敤鎴�!');
+                return false;
+            }
+            var seleArr = []
+            $.each(selectData,function(k,v){
+                seleArr.push(v.oid)
+            });
+            var form = layui.form;
+            var table = layui.table;
+            var filter ="form_" + that.id;
+            var addSaveIndex = layer.open({
+                type:1,
+                title:'鎵归噺璁剧疆宸ョ',
+                btn:['淇濆瓨','鍙栨秷'],
+                skin:'layui-layer-lan',
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                area: ['650px', '350px'],
+                closeBtn: 2,
+                shade: true,
+                shadeClose: true,
+                resize: false,
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,[{
+                        field: 'passwordStrategy',
+                        title: '鎵�灞炲瘑鐮佸畨鍏ㄧ瓥鐣�',
+                        required: true,
+                        type: 'refer',
+                        showField: 'pkPasswordStrategyName',
+                        referConfig: {
+                            textField: 'name',
+                            valueField: 'oid',
+                            backPath: that.backPath,//娉ㄦ剰杩欓噷闇�瑕佷慨鏀瑰弬鐓х殑瀵瑰簲璺緞
+                            isMuti: false,
+                            type: 'grid',
+                            tableConfig:{
+                                page:{
+                                    limit:15,
+                                    page:1
+                                },
+                                cols:[table.getIndexColumn(),table.getCheckColumn(),{
+                                    field:'id',
+                                    title:'绛栫暐缂栧彿',
+                                    width:180
+                                },{
+                                    field:'name',
+                                    title:'绛栫暐鍚嶇О',
+                                    width:180
+                                }],
+                                queryColumns:[{
+                                    field:'id',
+                                    title:'绛栫暐缂栧彿'
+                                },{
+                                    field:'name',
+                                    title:'绛栫暐鍚嶇О'
+                                }]
+                            },
+                            url: 'smPasswordStrategyController/refDataGrid'
+                        }
+                    }],
+                    function () {}, {}, {defaultColumnOneRow: 1,defaultLabelWidth:200});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        values.userOidS = seleArr.join(',');
+                        var url = that.url.controller + that.url.batchSetPasswordStrategy;
+                        webUtil.ajax('post',url,values,function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,("璁剧疆鎴愬姛!"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        }
+
+        this.ALLOTPASSWORD = function() { // 鎵归噺閲嶇疆瀵嗙爜
+            var that = this;
+            var selectData  = layui.table.checkStatus("table_" + that.id).data;
+            if(selectData.length <= 0) {
+                webUtil.showErrorMsg('璇疯嚦灏戦�夋嫨涓�鍚嶇敤鎴�!');
+                return false;
+            }
+            var seleArr = []
+            $.each(selectData,function(k,v){
+                seleArr.push(v.oid)
+            });
+            var values = {
+                usersOid:seleArr.join(',')
+            }
+            var url = 'userQueryController/resetPassword';
+            webUtil.ajax('post',url,values,function(result){
+                if(result.success){
+                    webUtil.showMsgFromResult(result,("閲嶇疆瀵嗙爜鎴愬姛!"));
+                    that.refresh();
+                }else{
+                    webUtil.showErrorMsg(result.msg);
+                }
+            },function(xhr,err){
+                webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+            },that.backPath);
+        }
+        
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/portal/vciBaseCalPortlet.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/portal/vciBaseCalPortlet.js
new file mode 100644
index 0000000..30c82a4
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/portal/vciBaseCalPortlet.js
@@ -0,0 +1,40 @@
+/**
+ * 宸ヤ綔鏃ュ巻
+ * Created by weidy on 2018/5/2.
+ */
+
+layui.define(['laydate'],function(exports){
+
+    var Dev = function(){
+        this.url = '';
+        this.id = "vciBaseCalPortlet";
+        this.modelKey = "vciBaseCallPortlet";
+    };
+    Dev.prototype.getContent = function(){
+        var that = this;
+        return '<div id="' + that.id + '" style="line-height:14px; text-align: center; padding-bottom: 15px;" ></div>';
+    };
+    Dev.prototype.init = function(){
+        var that = this;
+        var laydate = layui.laydate;
+        laydate.render({
+            elem : '#' + that.id,
+            position:'static',
+            showBottom:false,
+            calendar:true,
+            show:true,
+            mark:{
+                '2018-06-02': '鍔犵彮',
+                '2018-06-09': '鍔犵彮',
+                '2018-05-31': '鍙岀彮'
+            },
+            specialmark:{
+                '2019-11-11':"laydate-day-red",
+                '2019-11-12':"laydate-day-yellow"
+            },
+            markweek:true
+        });
+    };
+    var dev = new Dev();
+   exports('portal/vciBaseCalPortlet',dev);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/portal/vciBaseDevPortlet.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/portal/vciBaseDevPortlet.js
new file mode 100644
index 0000000..b0caf61
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/portal/vciBaseDevPortlet.js
@@ -0,0 +1,74 @@
+/**
+ * 寮�鍙戣繘绋�
+ * Created by weidy on 2018/5/2.
+ */
+
+layui.define(['layer','table'],function(exports){
+
+    var Dev = function(){
+        this.url = 'devLogController/getLogData';
+    };
+    Dev.prototype.getContent = function(){
+        var that = this;
+        return '<table id="table_devlog_' + that.id + '" lay-filter="' + that.id +'"></table><script type="text/html" id="toolbar_devlog_' + that.id + '" >s</script>';
+    };
+    Dev.prototype.getTableColumns = function(){
+        var that =this;
+        var table = layui.table;
+        var cols = [{
+            field:'version',
+            title:'鐗堟湰鍙�',
+            width:80,
+        },{
+            field:'content',
+            title:'涓昏鍐呭',
+            width:200,
+        },{
+            field:'options',
+            title:'鎿嶄綔',
+            width:150,
+            toolbar:'#toolbar_devlog_' + that.id
+        }];
+        return cols;
+    };
+    Dev.prototype.getToolbarHtml = function(){
+        var that =this;
+        var html = "";
+        html += '<a class="layui-btn layui-btn-xs" lay-event="viewbug">淇鍒楄〃</a>';
+        html += '<a class="layui-btn layui-btn-xs" lay-event="viewdoc">閮ㄧ讲鏂囨。</a>';
+        return html;
+    };
+    Dev.prototype.init = function(){
+        var that = this;
+        var table = layui.table;
+        //鍏堝垵濮嬪寲宸ュ叿鏍忕殑html
+        $('#toolbar_devlog_' + that.id).html(that.getToolbarHtml());
+        //鍒濆鍖栧垪琛�
+        table.render({
+            elem:'#table_devlog_' + that.id ,
+            data:[],
+            page:{
+                limit:that.limit,
+                page:1
+            },
+            width:'100%',
+            height:200,
+            cols:[that.getTableColumns()],
+            done:function(res,curr,count){
+                //涓嶆竻妤氬伐鍏锋爮鐨勭洃鍚槸鍚﹀湪琛ㄦ牸鍔犺浇瀹屾垚涔嬪墠鏈夊奖鍝嶏紝鍥犳鍙兘鍦ㄥ姞杞藉畬鎴愬悗娣诲姞鐩戝惉
+                table.on('tool(' + that.id + ')',function(obj){
+                    var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                    var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                    if(layEvent == 'viewbug'){
+                        //鐩存帴寮瑰嚭绐楀彛
+                        // that.doProcess(data);
+                    }else if(layEvent == 'viewdoc'){
+                        //that.viewData(data);
+                    }
+                });
+            }
+        });
+    };
+    var dev = new Dev();
+   exports('portal/vciBaseDevPortlet',dev);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/portal/vciBaseFavPortlet.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/portal/vciBaseFavPortlet.js
new file mode 100644
index 0000000..8366eab
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/portal/vciBaseFavPortlet.js
@@ -0,0 +1,108 @@
+/**
+ * 鏀惰棌鍔熻兘
+ * Created by weidy on 2018/5/2.
+ */
+
+layui.define(['layer','carousel'],function(exports){
+
+    var Fav = function(){
+        this.moduleKey = "vciBaseFavPortlet";
+        this.id ='vciBaseFavPortlet';
+        this.backPath = configData.compatibility?path:configData.frameworkPath;
+        this.menuConfig= {//杩欓噷鐨勯厤缃兘鏄粯璁ょ殑锛屽湪浣跨敤鐨勬椂鍊欏彲浠ヨ鐩�
+            menuIconType:"iconFont",//鑿滃崟鍥炬爣鐨勮幏鍙栨柟寮忥紝鏀寔iconSrc.iconFont,id鏂瑰紡锛宨conSrc琛ㄧず鍦ㄥ钩鍙颁腑鐨勮彍鍗昫esc閲岄厤缃紝id琛ㄧず浣跨敤鑿滃崟鍞竴缂栧彿
+            defaultMenuIconPath:'style/images/menuicons',
+            defaultMenuIcon:'layui-icon-app',
+            favUrl:"favFunctionController/listFavFunction"
+        };
+        this.favStore = {};
+    };
+    Fav.prototype.getContent = function(){
+        var that = this;
+        return '<div class="layui-carousel layui-vci-fav "  id="' + that.id + '"></div>';
+    };
+    Fav.prototype.init = function(){
+        var that = this;
+        $webUtil.copyConfig(that,that.moduleKey);
+        $webUtil.get(that.menuConfig.favUrl,{},function(result){
+            if(result.success){
+                var carousel = layui.carousel;
+                //鑷繁鍔犳潯鐩紝鑰屼笉鏄敱carousel鍔�
+                var html = "<div carousel-item>";
+                layui.each(result.obj,function(_index,record){
+                    record.text = record.name;
+                    if(_index%8==0){
+                        //8鐨勬暣鏁板��
+                        html += '<ul class="layui-row layui-col-space10  ' + (_index == 0?'layui-this':'') + '">';
+                    }
+                    //娣诲姞鏈姛鑳�
+                    html += '<li class="layui-col-xs3"><a href="javascript:;" class="vciWebFavMenu"  data-id="' + record.oid + '">' + that.getIconHtml(record) + '<cite>' + record.name + '</cite></a></li>';
+                    if(_index%8==7 || _index == result.obj.length-1){
+                        html += '</ul>';
+                    }
+                    if(!that.favStore){
+                        that.favStore = {};
+                    }
+                    that.favStore[record.oid] = record;
+                });
+                html += '</div>';
+                $("#" + that.id).html(html);
+                carousel.render({
+                    elem:'#' + that.id,
+                    width:'100%',
+                    autoplay:false,
+                    arrow:'none',
+                    indicator:'inside'
+                });
+
+                that.bindButtonListener();
+            }
+        },function(xhr,error){},that.backPath);
+    };
+    Fav.prototype.getIconHtml = function(record){
+        var me = this;
+        var iconSrc = '';
+        var menuIconType = me.menuConfig.menuIconType;
+        if(record.menuIconType) {
+            menuIconType = record.menuIconType;
+        }
+        if(menuIconType == "iconSrc" && $webUtil.isNotNull(record.iconSrc)){
+            iconSrc = me.menuConfig.defaultMenuIconPath + "/" + record.iconSrc;
+        }else if(menuIconType == "id"){
+            iconSrc = me.menuConfig.defaultMenuIconPath + "/" + record.id + ".png";
+        }else if(menuIconType == "iconFont"){
+            iconSrc = record.iconSrc;
+            if($webUtil.isNull(iconSrc)){
+                iconSrc = me.menuConfig.defaultMenuIcon;
+            }
+        }
+        if($webUtil.isNull(iconSrc)){
+            iconSrc = me.menuConfig.defaultMenuIcon;
+        }
+        var html = "";
+        if(iconSrc.indexOf(".")>-1){
+            html += '<img src="' + iconSrc + '" style="width:30px;height:30px;">';
+        }else{
+            html += '<i class="layui-icon ' + iconSrc + '" style="font-size: 30px; "></i>';
+        }
+        return html;
+    };
+    Fav.prototype.bindButtonListener = function(){
+        var that = this;
+        $(".vciWebFavMenu").click(function(){
+            var id = $(this).attr("data-id");
+            var menuObject = null;
+            for(var key in that.favStore){
+                if(key == id){
+                    menuObject = that.favStore[key];
+                    break;
+                }
+            }
+            if(menuObject!=null){
+                portal.showTabByMenu(id,menuObject);
+            }
+        });
+    };
+    var fav = new Fav();
+   exports('portal/vciBaseFavPortlet',fav);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/portal/vciBaseTaskPortlet.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/portal/vciBaseTaskPortlet.js
new file mode 100644
index 0000000..9cffe65
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/portal/vciBaseTaskPortlet.js
@@ -0,0 +1,94 @@
+/**
+ * 寰呭姙浜嬮」--涓嶅寘鎷祦绋�--2021-2-22澧炲姞鍓嶇鏌ヨ鐨勬柟寮�
+ * Created by weidy on 2018/5/2.
+ */
+
+layui.define(['layer','carousel'],function(exports){
+
+    var Task = function(){
+        this.id ='vciBaseTaskPortlet';
+        this.backPath = configData.compatibility?path:configData.frameworkPath
+        this.urlConfig = {
+            listMyTask:'homeTaskController/listMyHomeTask'
+        };
+        this.countByServer = false;
+        this.moduleKey = "vciBaseTaskPortlet";
+        this.items = [];
+    };
+    Task.prototype.getContent = function(){
+        var that = this;
+        return '<div class="layui-carousel layui-vci-undotask"  id="' + that.id + '"></div>';
+    };
+    Task.prototype.init = function(){
+        var that = this;
+        $webUtil.copyConfig(that,that.moduleKey);
+        if(this.items.length == 0){
+            $webUtil.get(that.urlConfig.listMyTask,{},function(result){
+                if(!result.success){
+                    return false;
+                }
+                that.items = result.data;
+                var carousel = layui.carousel;
+                //鑷繁鍔犳潯鐩紝鑰屼笉鏄敱carousel鍔�
+                var html = "<div carousel-item>";
+                layui.each(that.items,function(_index,record){
+                    if(_index%6==0){
+                        //4鐨勬暣鏁板��
+                        html += '<ul class="layui-row layui-col-space10 ' + (_index == 0?'layui-this':'') + '">';
+                    }
+                    //娣诲姞鏈姛鑳�
+                    html += '<li class="layui-col-xs6"><a href="javascript:;" class="vciTaskPortlet_task"  data-id="' + record.oid + '"><h3>'  + record.name + '</h3><p style="text-align: center"><cite>' + (that.countByServer?record.count:'0') + '</cite></p></a></li>';
+                    if(_index%6==5 || _index == that.items.length-1){
+                        html += '</ul>';
+                    }
+                });
+                html += '</div>';
+                $("#" + that.id).html(html);
+                carousel.render({
+                    elem:'#' + that.id,
+                    width:'100%',
+                    autoplay:false,
+                    arrow:'none',
+                    indicator:'inside'
+                });
+                that.bindButtonListener();
+                if(!that.countByServer){
+                    //鏄墠绔煡璇�
+                    layui.each(that.items,function(_index,record){
+                        $webUtil.get(record.countUrl,{},function (result) {
+                            if(result.success){
+                                $('#' + that.id).find('a[data-id="' + record.oid + '"]').find('cite').html(result.obj);
+                            }else{
+                                $('#' + that.id).find('a[data-id="' + record.oid + '"]').find('cite').html(0);
+                            }
+                        },function (err,xhr) {
+                            $webUtil.showDebugMsg(err);
+                        },configData['serviceName']);
+                    });
+                }
+            },function(xhr,err){
+
+            },that.backPath,false);
+        }
+    };
+
+    Task.prototype.bindButtonListener = function(){
+        var that = this;
+        $(".vciTaskPortlet_task").click(function(){
+            var oid = $(this).attr("data-id");
+            layui.each(that.items,function(_index,record){
+                if(record.oid == oid){
+                    var menuObj = {
+                        id:record.id,
+                        text : record.name,
+                        url : record.uiUrl
+                    };
+                    portal.showTabByMenu(record.id,menuObj);
+                    return false;
+                }
+            });
+        });
+    };
+    var task = new Task();
+   exports('portal/vciBaseTaskPortlet',task);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/portal/vciBaseUserPortlet.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/portal/vciBaseUserPortlet.js
new file mode 100644
index 0000000..2e6ca27
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/portal/vciBaseUserPortlet.js
@@ -0,0 +1,73 @@
+/**
+ * 鐢ㄦ埛涓績
+ * Created by weidy on 2020/7/12.
+ */
+
+layui.define(['layer','table'],function(exports){
+
+    var Dev = function(){
+        this.MODULE_NAME = "portal/vciBaseUserPortlet";
+    };
+    Dev.prototype.getContent = function(){
+        var that = this;
+        return '<div class="layui-index-home layui-fluid" style="padding:5px;overflow:hidden;" >'+
+                    '<div class="layui-row layui-col-space15>' +
+                       '<div class="layui-col-md12">' +
+                          '<div class="layadmin-contact-box">' +  
+                            '<div class="layui-col-md4 layui-col-sm6">' + 
+                                '<a href="javascript:;">' + 
+                              '<div class="layadmin-text-center">' + 
+                              '  <img src="style/images/base/login/userphotoman.png"> ' +
+                               ' <div class="layadmin-maillist-img layadmin-font-blod personCenterWorkType" style="text-align: center;"></div> ' +
+                             ' </div>' +
+                            '</a>'+
+                          '</div>'+
+                        '<div class="layui-col-md8 layadmin-padding-left20 layui-col-sm6" style="padding:20px">'+
+                         '<a href="javascript:;">'+
+                            '<h3 class="layadmin-title">'+
+                              '<strong class="personCenterName"></strong>'+
+                           ' </h3>'+
+                            '<p class="layadmin-textimg personCenterDeptName ">'+
+                            ' <i class="layui-icon layui-icon-location"></i>'+
+                          '  </p>'+
+                          '</a>'+
+                          '<div class="layadmin-address">'+
+                            '<a href="javascript:;" class="personCenterWorkTime">'+
+
+                            '</a>'+
+                          '</div>'+
+                        '</div>'+
+                      '</div>'+
+                      '</div>' +
+                      '</div>' +      
+        '</div>';
+    };
+
+    Dev.prototype.init = function(){
+        var that = this;
+        $(".personCenterName").html($webUtil.getCurrentUserName());
+        var workTypeName = $webUtil.getSystemVar('workTypeName');
+        if($webUtil.isNull(workTypeName)){
+            //鏌ヨ瑙掕壊
+            var roleNamMap = $webUtil.getSystemVar('rolesName');
+            if(roleNamMap){
+                var rolesName = [];
+                var i = 0 ;
+                for(var roleOid in roleNamMap){
+                    if(i < 5) {
+                        rolesName.push(roleNamMap[roleOid]);
+                    }else{
+                        break;
+                    }
+                    i++;
+
+                }
+                workTypeName= rolesName.join(",");
+            }
+        }
+        $(".personCenterWorkType").html(workTypeName);
+        $(".personCenterDeptName").append( $webUtil.getSystemVar('deptName'));
+    };
+    var dev = new Dev();
+   exports(dev.MODULE_NAME,dev);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/portal/vciDefaultIndex.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/portal/vciDefaultIndex.js
new file mode 100644
index 0000000..65ae5c0
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/portal/vciDefaultIndex.js
@@ -0,0 +1,99 @@
+/**
+ * 榛樿鐨勯椤�
+ */
+layui.define(['layer','vciWebPortalHome'],function(exports){
+	var index = {
+		MODULENAME:'portal/vciDefaultIndex',
+		getContent:function(){
+			return '<div class="layui-vci-mes208-index"></div>';
+		},
+		init:function(){
+			var that = this;
+			var home = layui['vciWebPortalHome'];
+			var windowWidth = 0 ;
+			if(window.innerWidth){
+				windowWidth = window.innerWidth;
+			}else{
+				windowWidth = document.documentElement.clientWidth;
+			}
+			windowWidth =  windowWidth-200;
+			var userWidth = 3;
+			if(windowWidth < 1250){
+				userWidth = 4;
+			}
+			var taskWidth = 12-userWidth;
+			if(!configData.portal ){
+				configData.portal = {};
+			}
+			if(!configData.portal.vciDefaultIndex){
+				configData.portal.vciDefaultIndex = {};
+			}
+			home.setConfig({requestDataType:'data'});
+			home.setData([{
+				width:taskWidth,
+				id:'vciDefaultIndex_col_0',
+				enable:(configData.portal.vciDefaultIndex.favEnable?configData.portal.vciDefaultIndex.favEnable:true),
+				children:[{
+					width:12,
+					id:'vciDefaultIndex_col_0_1',
+					enable:(configData.portal.vciDefaultIndex.favEnable?configData.portal.vciDefaultIndex.flowEnable:true),
+					portlets:[{
+						id:'vcimes182index_process',
+						customStyle:'height:605px;',
+						title:'寰呭姙娴佺▼浠诲姟',
+						type:'card',
+						centerUrl:'USEJS:process/vciWebProUndoTab',
+						info:'鐐瑰嚮鍘诲鐞嗗彲浠ョ洿鎺ユ墽琛�,鎴栬�呯偣鍑绘澶勫乏渚х殑鎸夐挳杩涘叆寰呭姙娴佺▼涓績',
+						items:[{
+							id:'vciDefaultIndex_protask_1',
+							title:'寰呭姙娴佺▼浠诲姟',
+							type:'layui',
+							url:'portal/vciWebProUndoTaskPortlet'
+						}]
+					}]
+				}]
+			},{
+				width:userWidth,
+				id:'vciDefaultIndex_col_1',
+				enable:true,
+				children:[{
+					width:12,
+					id:'vciDefaultIndex_col_0_2',
+					enable:(configData.portal.vciDefaultIndex.favEnable?configData.portal.vciDefaultIndex.userEnable:true),
+					portlets:[{
+						id:'vciDefaultIndex_usercenter',
+						title:'涓汉涓績',
+						type:'card',
+						customStyle:'padding:2px',
+						info:'鐐瑰嚮鍙互杩涘幓鐢ㄦ埛涓汉涓績',
+						items:[{
+							id:'vciDefaultIndex_usercenter_1',
+							title:'涓汉淇℃伅',
+							type:'layui',
+							url: 'portal/vciBaseUserPortlet'
+						}]
+					}]
+				},{
+					width:12,
+					id:'vciDefaultIndex_col_2',
+					enable:(configData.portal.vciDefaultIndex.favEnable?configData.portal.vciDefaultIndex.calEnable:true),
+					portlets:[{
+						id:'vciDefaultIndex_workcal',
+						title:'鎴戠殑宸ヤ綔鏃ュ巻',
+						type:'card',
+						info:'榛勮壊浠h〃鍔犵彮锛岀孩鑹蹭唬琛ㄥ弻鐝�',
+						items:[{
+							id:'vciDefaultIndex_workcal_2',
+							title:'鎴戠殑宸ヤ綔鏃ュ巻',
+							type:'layui',
+							url:'portal/vciBaseCalPortlet'
+						}]
+					}]
+				}]
+			}]);
+			$(".layui-vci-mes208-index").html(home.getContent());
+			home.init();
+		}
+	};
+	exports(index.MODULENAME,index);
+});
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/portal/vciWebProUndoTaskPortlet.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/portal/vciWebProUndoTaskPortlet.js
new file mode 100644
index 0000000..92fb423
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/portal/vciWebProUndoTaskPortlet.js
@@ -0,0 +1,161 @@
+/**
+ * 娴佺▼鐨勫緟鍔炰簨椤规寕浠讹紝棣栭〉閲屼娇鐢ㄧ殑锛屼笌閫夐」鍗¢噷鐨勫尯鍒湪浜庤繖閲岀殑琛ㄦ牸鐨勫垎椤垫暟鎹浉瀵硅緝灏�
+ * Created by weidy on 2018/5/2.
+ */
+
+layui.define(['layer','table'],function(exports){
+
+    var UndoTask = function(){
+        this.moduleKey = "vciWebProUndoTaskPortlet";
+        this.taskCenterUrl='USEJS:/process/vciWebProUndoTask';//寰呭姙浠诲姟涓績鐨勬暟鎹�
+        this.url= {
+            task: 'processDefineController/getMyUndoTask'
+        };
+        this.limit = 10;
+        this.id = '';
+    };
+    UndoTask.prototype.getContent = function(){
+        var that = this;
+        return '<table id="table_vciProcessUndoTask_' + that.id + '" lay-filter="' + that.id +'"></table><div  id="toolbar_vciProcessUndoTask_' + that.id + '" style="display:none"></div>';
+    };
+    UndoTask.prototype.getTableColumns = function(){
+        var that =this;
+        var table = layui.table;
+        var cols = [table.getIndexColumn(),{
+            field:'name',
+            title:'浠诲姟鍚嶇О',
+            width:450,
+            templet:'<div><a name="processname" dataIndex="{{d.LAY_INDEX}}" lay-event="gotodo" href="javascript:;" style="text-decoration:underline;color:blue;">{{d.name}}</a></div>'
+        },{
+            field:'createtime',
+            title:'涓婁竴姝ュ鐞嗘椂闂�',
+            width:150,
+            templet:function(d){
+                if(d.createtime !=null){
+                    return layui.util.toDateString(d.createtime,'yyyy-MM-dd HH:mm');
+                }else{
+                    return "";
+                }
+            }
+        },{
+            field:'description',
+            title:'鎻忚堪',
+            width:130
+        },{
+            field:'creator_name',
+            title:'涓婁竴姝ユ搷浣滀汉',
+            width:100
+        },{
+            field: 'executionid',
+            title: '鎵�灞炴祦绋嬫ā鏉�',
+            width: 150,
+            templet: function (d) {
+                if($webUtil.isNotNull(d.executionid) && d.executionid.indexOf(".") > -1){
+                    return d.executionid.substring(0,d.executionid.indexOf("."));
+                }else{
+                    return d.executionid;
+                }
+            }
+        },{
+            field:'options',
+            title:'鎿嶄綔',
+            fixed:'right',
+            width:60,
+            toolbar:'#toolbar_vciProcessUndoTask_' + that.id
+        }];
+        return cols;
+    };
+    UndoTask.prototype.getToolbarHtml = function(){
+        var that =this;
+        var html = "";
+        html += '<a class="layui-btn layui-btn-intable " lay-event="gotodo">鎵ц</a>';//鍘诲鐞�
+       // html += '<a class="layui-btn layui-btn-primary" lay-event="viewdata">鏌ョ湅鏁版嵁</a>';//鏌ョ湅鏁版嵁
+        return html;
+    };
+    UndoTask.prototype.init = function(){
+        var that = this;
+        $webUtil.copyConfig(that,that.moduleKey);
+        var table = layui.table;
+        //鍏堝垵濮嬪寲宸ュ叿鏍忕殑html--涔嬪墠浣跨敤鐨剆cript鏍囩鍦↖E8涓婃槸鏃犳晥鐨勶紝鎵�浠ヤ慨鏀逛负DIV
+        document.getElementById("toolbar_vciProcessUndoTask_" + that.id).innerHTML = that.getToolbarHtml();
+        //鍒濆鍖栧垪琛�
+        table.render({
+            elem:'#table_vciProcessUndoTask_' + that.id ,
+            id:'table_vciProcessUndoTask_' + that.id ,
+            url:that.url.task,
+            backPath:(configData.compatibility ? path : configData.processServicePath),
+            page:{
+                limit:that.limit,
+                page:1
+            },
+            //height:600,
+            cols:[that.getTableColumns()],
+            done:function(res,curr,count){
+                //涓嶆竻妤氬伐鍏锋爮鐨勭洃鍚槸鍚﹀湪琛ㄦ牸鍔犺浇瀹屾垚涔嬪墠鏈夊奖鍝嶏紝鍥犳鍙兘鍦ㄥ姞杞藉畬鎴愬悗娣诲姞鐩戝惉
+                table.on('tool(' + that.id + ')',function(obj){
+                    var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                    var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                    if(layEvent == 'gotodo'){
+                        //鐩存帴寮瑰嚭绐楀彛
+                         that.doProcess(data);
+                    }else if(layEvent == 'viewdata'){
+                        that.viewData(data);
+                    }
+                });
+                /*$('a[name="processname"]',$('#table_vciProcessUndoTask_' + that.id).parent()).on('click',function(){
+                    var table = layui.table;
+                    var allData = table.getData('table_vciProcessUndoTask_' + that.id);
+                    if(allData&& allData.length > 0){
+                        var thisDataRowIndex = $(this).attr("dataIndex");
+                        var thisRowData = null;
+                        layui.each(allData,function(_index,_item){
+                            if(_item.LAY_TABLE_INDEX == (thisDataRowIndex*1 - 1)){
+                                thisRowData = _item;
+                                return true;
+                            }
+                        });
+                        if(thisRowData!=null){
+                            that.doProcess(thisRowData);
+                        }
+                    }
+                });*/
+            }
+        });
+
+    };
+    UndoTask.prototype.doProcess=function(data){
+        var that = this;
+        var table = layui.table;
+        if(data&&data.oid){
+            layui.use('process/vciWebProExecuteTask',function(){
+                var executeTask = layui['process/vciWebProExecuteTask'];
+                executeTask.init();
+                var task = data;
+                task.taskOid = data.oid;
+                task.taskName = data.name;
+                task.executionId=data.executionid
+                var taskInfo = [task];
+                executeTask.showExecuteWindow(taskInfo,{
+                    fullScreen:true
+                },function(finish){
+                    if(finish){
+                        table.reload('table_vciProcessUndoTask_' + that.id);
+                    }
+                });
+            });
+        }
+    };
+    UndoTask.prototype.viewData = function(data){
+        var that = this;
+    };
+    UndoTask.prototype.getCenterObject = function(){//鑾峰彇璺宠浆鍒颁腑蹇冪殑鐩稿叧瀵硅薄
+        var that = this;
+        return {
+            text:'鎴戠殑寰呭姙浠诲姟',
+            id:that.id,
+            bsUrl:that.taskCenterUrl
+        };
+    };
+    var task = new UndoTask();
+   exports('portal/vciWebProUndoTaskPortlet',task);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebProAllProcessInfo.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebProAllProcessInfo.js
new file mode 100644
index 0000000..b388611
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebProAllProcessInfo.js
@@ -0,0 +1,574 @@
+/**
+ * Created by weidy on 2019/8/30
+ * 鎵�鏈夌殑鎵ц涓殑娴佺▼.鎵�鏈夌殑宸叉寕璧锋祦绋嬶紝鎵�鏈夌殑宸茬粓姝㈡祦绋嬶紝鎵�鏈夌殑宸插畬鎴愭祦绋嬪叕鐢ㄩ〉闈�
+ */
+layui.define(['layer','element','form','table','vciWebDataGrid','flow','process/vciWebProExecuteTask','vciWebFileManager'],function(exports){
+    /**
+     * 涓诲尯鍩熶负寰呭姙浠诲姟鐨勫垪琛�
+     * 涓嬫柟鐨勫尯鍩熷垎涓轰笁涓�夐」鍗°�愬叧鑱旀暟鎹�戙�愭祦绋嬪巻鍙层�戙�愭祦绋嬪浘銆�
+     * 涓诲尯鍩熺殑寰呭姙浠诲姟鍒楄〃鐨勫悗鍙拌矾寰勪笌涓婚〉涓殑鎸備欢涓�鑷�
+     * 涓婚〉涓殑鏌ョ湅鏁版嵁鐨勫悗鍙拌矾寰勪笌姝ら〉闈㈢殑銆愬叧鑱旀暟鎹�戜腑涓�鑷�
+     */
+    var ExecutPro = function(){
+        this.moduleKey = "vciWebProAllProcessInfo";
+        this.id='vciWebProAllProcessInfo';
+        this.sourceData={};
+        this.columns = [];
+        this.historyColumns = [];
+        this.backPath = path;//榛樿娴佺▼鍜岄」鐩殑璺緞鏄竴鏍风殑
+        this.isDebug = false;
+        this.url={
+            dataDefine:'/webProcessDefineController/getDataDefine',//浠庡悗鍙拌幏鍙栨樉绀哄叧鑱旀暟鎹殑鍒楄〃鐨刢ode
+            data:'/webProcessDefineController/getDataByTask',
+            history:'/webProcessDefineController/getHistory',
+            picture:'/webProcessDefineController/getProcessPic',
+            dataGridDetail:'/webTrailorderplanController/getOrderItemByOidUnAccept',//trailorderplan鑾峰彇璇︾粏
+            executing:'/webProcessDefineController/getAllExecutingProcess',//鎵ц涓殑娴佺▼
+            suspended:'/webProcessDefineController/getAllSuspendedProcess',//宸叉寕璧锋祦绋�
+            end:'/webProcessDefineController/getAllEndProcess',//宸茬粓姝㈡祦绋�
+            finish:'/webProcessDefineController/getAllFinishProcess',//宸插畬鎴愭祦绋�
+            done:'/webProcessDefineController/getMyDoneProcessTask',//宸插姙浠诲姟
+            endProcess:'/webProcessCommandController/endProcess',//缁堟娴佺▼
+            suspendProcess:'/webProcessCommandController/suspendProcess',//鍐荤粨娴佺▼
+            resumeProcess:'/webProcessCommandController/resumeProcess'//鍥炲娴佺▼
+        };
+        this.defaults = {
+            dataShowByOid:true,//鏄惁鏍规嵁浠诲姟鐨勪笉鍚屾潵鏄剧ず涓嶅悓鐨勬暟鎹垪琛�--濡傛灉娴佺▼涓病鏈夋坊鍔燿ataDisplayTable鍙橀噺璇疯缃负false
+            dataTableBtmType:"input",//鍏宠仈鏁版嵁鐨勮〃鏍煎湪鐨勪笟鍔$被鍨嬶紝鐢ㄤ簬鏌ヨ骞冲彴涓殑鍒楄〃
+            dataTableCode:"ShowMyTaskLinkDataList"//鍏宠仈鏁版嵁鐨勮〃鏍间唬鍙�
+        };
+        this.limit={
+            task:10,
+            data:5,
+            history:5
+        };
+        this.taskDataConfig = {
+
+        };
+        this.trailDetailColumns = [];
+        this.getContent=function(){//杩斿洖杩欎釜缁勪欢鐨勫熀纭�html
+            var me = this;
+            if(me.sourceData && "page" in me.sourceData){
+                me.id = me.id + "_" + me.sourceData.page;
+            }
+            var html = [ '<div class="layui-layout-border">',
+                '<div layui-filter="toolbar_',me.id, '" class="layui-btn-container">',//涓诲垪琛ㄧ殑鎸夐挳
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',me.id,'_freez" style="display:none"><i class="layui-icon layui-icon-logo"></i>鍐荤粨</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',me.id,'_stop" style="display:none"><i class="layui-icon layui-icon-refresh-2"></i>缁堟</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',me.id,'_resume" style="display:none"><i class="layui-icon layui-icon-refresh-2"></i>鎭㈠</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',me.id,'_refresh"><i class="layui-icon layui-icon-refresh-2"></i>鍒锋柊</button>',
+
+                '</div>',
+                '<div class="layui-center" style="max-height:400px">',
+
+                '<table id="table_', me.id , '" lay-filter="',me.id , '"></table>',//涓诲垪琛�
+                '</div>',
+                '<div class="layui-south" style="min-height:100px;padding:0 5px">',
+                '<div layui-filter="south_toolbar_',me.id, '" class="layui-btn-container">',//涓诲垪琛ㄧ殑鎸夐挳
+
+                '</div>',
+                '<div class="layui-tab">' ,//搴曢儴閫夐」鍗�
+                '<ul class="layui-tab-title">',
+                '<li class="layui-this">鍏宠仈鏁版嵁</li>',
+                '<li>鍏宠仈鏂囦欢</li>',
+                '<li>瀹℃壒鍘嗗彶</li>',
+                '<li>娴佺▼鍥�</li>',
+                '</ul>',
+                '<div class="layui-tab-content">',
+                '<div class="layui-tab-item layui-show">',  //榛樿鏄剧ず鍏宠仈鏁版嵁
+                '<div layui-filter="data_toolbar_',me.id,'" class="layui-btn-container">',
+                // '<button class="layui-btn layui-btn-xs" layui-filter="data_toolbar_',me.id,'_viewdata"><i class="layui-icon layui-icon-search"></i>鏌ョ湅璇︽儏</button> ',
+                // '<button class="layui-btn layui-btn-xs" layui-filter="data_toolbar_',me.id,'_viewdataintable"><i class="layui-icon layui-icon-biaoge"></i>鏌ヨ璇︽儏(鍒楄〃)</button>',
+                //  '<button class="layui-btn layui-btn-xs" layui-filter="data_toolbar_',me.id,'_viewfile"><i class="layui-icon layui-icon-search"></i>鏌ョ湅鍏宠仈鏂囦欢</button> ',
+                '<button id="'+me.id+'_VIEWDETAIL"class="layui-btn layui-btn-sm" layui-filter="toolbar_',me.id,'_VIEWDETAIL" style="display:block"><i class="layui-icon layui-icon-logo"></i>鏌ョ湅璇︾粏淇℃伅</button>',
+                '</div>',
+                '<table id="data_', me.id , '" lay-filter="data_', me.id , '" ></table>',
+                '</div>',
+                '<div class="layui-tab-item" style="width:100%">',
+                '<div layui-filter="file_toolbar_',me.id,'" class="layui-btn-container">,' ,
+                '<table id="file_' , me.id , '" lay-filter="file_' , me.id , '" ></table>',
+                '</div>' ,
+                '</div>',
+                '<div class="layui-tab-item" style="width:100%"><table id="history_' , me.id , '" lay-filter="history_' , me.id , '" ></table></div>' ,
+                '<div class="layui-tab-item" id="picture_parent_',me.id,'" style="overflow-y:auto;"><span>鐐瑰嚮鍥剧墖鍙互鏀惧ぇ鏌ョ湅</span><img layer-pid="picture_' , me.id , '" lay-filter="picture_' , me.id , '" src=""  alt="娴佺▼鍥�" style="width:100%;" /></div>',
+                '</div>',
+                '</div>',
+                '</div>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getUrlByPage = function(){
+            var url = '',that = this,urlArr = that.url;
+            var page = that.sourceData.page;
+            if(page){
+                for(var item in urlArr){
+                    if(item == page){
+                        url = urlArr[item];
+                    }
+                }
+                if(page == 'executing'){
+                    $("button[layui-filter='toolbar_"+that.id+"_freez']").show();
+                    $("button[layui-filter='toolbar_"+that.id+"_stop']").show()
+                }
+                if(page == 'suspended'){
+                    $("button[layui-filter='toolbar_"+that.id+"_resume']").show()
+                }
+            }else{
+                url = urlArr.task;
+            }
+            return url;
+        };
+        this.init=function(){//鍩虹鐨刪tml琚坊鍔犲悗锛屽啀鎵ц鍒濆鍖�
+            var me = this;
+            me.taskDataConfig = null;
+            me.fileDataTable = false;
+            me.historyColumns = null;
+            me.columns = null;
+            $webUtil.copyConfig(me,me.moduleKey);
+            var table = layui.table;
+            me.checkColumns();//涓诲垪琛ㄤ腑鍒椼��
+            table.render({
+                elem:'#table_' + me.id,
+                id:'table_' + me.id,
+                url:me.backPath + me.getUrlByPage(),
+                page:{
+                    limit:me.limit.task,
+                    page:1
+                },
+                height:400,
+                cols:[me.columns],
+                done:function(res,cur,count){
+                    var taskOid = "";
+                    var executionId = "";
+                    table.selectRecord('table_' + me.id,[{index:0}]);
+                },
+                rowClick:function(thisTableFilter,record){
+                    if(record.detailUrl){
+                        $("#"+me.id+'_VIEWDETAIL').show()
+                    }
+                    me.showDataTable(record.executionid,record.oid);
+                    me.showFileDataTable(record.executionid);
+                    me.showHistoryTable(record.executionid);
+                    me.showHistoryPic(record.executionid,record.oid);
+                }
+            });
+            var searchFieldObject = {
+                name: "娴佺▼鍚嶇О",
+                executionid:"鎵�灞炴祦绋嬫ā鏉�",
+                description:"娴佺▼鍚姩鏃舵弿杩�"
+            };
+            if("done" == me.sourceData.page){
+                searchFieldObject['name'] = '浠诲姟鍚嶇О';
+            }
+            $webUtil.createSearchHtml(searchFieldObject, $('[layui-filter="toolbar_' + me.id + '"]'), 'table_' +me.id);
+            me.bindListeners();
+        };
+        this.bindListeners = function(){
+            var that = this;
+            $("img[layer-pid='picture_" + that.id + "']").click(function(){
+                that.showImgFullScreen();
+            });
+            $("[layui-filter='toolbar_" + that.id + "_execute']").click(function(){
+                var table = layui.table;
+                var checkData = table.checkStatus('table_' + that.id);
+                if(checkData && checkData.data && checkData.data.length>0){
+                    var executeTask = layui['view/process/vciWebProExecuteTask'];
+                    executeTask.init();
+                    var taskInfo = [];
+                    layui.each(checkData.data,function(_index,_item){
+                        taskInfo.push({
+                            taskOid:(_item.oid),
+                            taskName:_item.name,
+                            executionId:(_item.executionid)
+                        });
+                    });
+                    executeTask.showExecuteWindow(taskInfo,{
+                        fullScreen:true
+                    },function(finish){
+                        if(finish){
+                            table.reload('table_' + that.id);
+                        }
+                    });
+                }else{
+                    $webUtil.showErrorMsg("娌℃湁閫夋嫨娴佺▼浠诲姟");
+                }
+            });
+            $("[layui-filter='toolbar_" + that.id + "_VIEWDETAIL']").click(function(){
+                that.VIEWDETAIL()
+            });
+            $("[layui-filter='toolbar_" + that.id + "_stop']").click(function(){
+                that.stop();
+            });
+            $("[layui-filter='toolbar_" + that.id + "_freez']").click(function(){
+                that.freez();
+            });
+            $("[layui-filter='toolbar_" + that.id + "_resume']").click(function(){
+                that.resume();
+            });
+            $("[layui-filter='toolbar_" + that.id + "_refresh']").click(function(){
+                that.refresh();
+            });
+        };
+        this.refresh = function(){
+            var that = this;
+            var table = layui.table;
+            table.reload("table_" + that.id,{});
+        };
+        this.freez = function(){
+            var that = this;
+            var executionid = $webUtil.getOidFromGrid("table_" + that.id,true,false,'executionid');
+            if(!executionid){
+                return;
+            }
+            $webUtil.showConfirmMsg("鎮ㄧ‘瀹氳鍐荤粨杩欎釜娴佺▼鍚�?",function(){
+                $webUtil.post(that.url.suspendProcess,{processOids:executionid},function(result){
+                    if(result.success){
+                        $webUtil.showMsg("鍐荤粨娴佺▼鎴愬姛");
+                        that.refresh();
+                    }else{
+                        $webUtil.showErrorMsg(result.msg);
+                    }
+                },function(){
+                    // $webUtil.showErrorMsg("杩炴帴鏈嶅姟鍑虹幇浜嗛棶棰�");
+                },that.backPath);
+            });
+
+        };
+        this.stop = function(){
+            var that = this;
+            var executionid = $webUtil.getOidFromGrid("table_" + that.id,true,false,'executionid');
+            if(!executionid){
+                return;
+            }
+            $webUtil.showConfirmMsg("鎮ㄧ‘瀹氳缁堟杩欎釜娴佺▼鍚�?",function() {
+                $webUtil.post(that.url.endProcess, {processOids: executionid}, function (result) {
+                    if (result.success) {
+                        $webUtil.showMsg("缁堟娴佺▼鎴愬姛");
+                        that.refresh();
+                    } else {
+                        $webUtil.showErrorMsg(result.msg);
+                    }
+                }, function () {
+                    // $webUtil.showErrorMsg("杩炴帴鏈嶅姟鍑虹幇浜嗛棶棰�");
+                }, that.backPath);
+            });
+        };
+        this.resume = function(){
+            var that = this;
+            var executionid = $webUtil.getOidFromGrid("table_" + that.id,true,false,'executionid');
+            if(!executionid){
+                return;
+            }
+            $webUtil.showConfirmMsg("鎮ㄧ‘瀹氳鍐荤粨杩欎釜娴佺▼鍚�?",function() {
+                $webUtil.post(that.url.resumeProcess, {processOids: executionid}, function (result) {
+                    if (result.success) {
+                        $webUtil.showMsg("鎭㈠娴佺▼鎴愬姛");
+                        that.refresh();
+                    } else {
+                        $webUtil.showErrorMsg(result.msg);
+                    }
+                }, function () {
+                }, that.backPath);
+            });
+        };
+        this.showDataTable = function(executionId){//鑾峰彇鏁版嵁琛ㄦ牸涓殑鐩稿叧瀹氫箟
+            var me = this;
+            var table = layui.table;
+            if(me.defaults.dataShowByOid && layui.util.isNotNull(executionId)){
+                //瑕佷粠鍚庡彴鍘绘煡璇㈠畾涔変簡
+                $webUtil.post(me.url.dataDefine,{executionId:executionId},function(result){
+                    if(result.success){
+                        me.renderDataTable(result.obj.btmType,result.obj.tableCode,executionId);
+                    }else{
+                        me.renderDataTable(me.defaults.dataTableBtmType,me.defaults.dataTableCode,executionId); //鏈�缁堝睍绀鸿〃鏍�
+                    }
+                },function(){
+                    $webUtil.showErrorMsg("杩炴帴鏈嶅姟鍑虹幇浜嗛棶棰�");
+                },me.backPath,true);
+            }else{
+                me.renderDataTable(me.defaults.dataTableBtmType,me.defaults.dataTableCode,taskOid);//鏈�缁堝睍绀鸿〃鏍�
+            }
+        };
+        this.VIEWDETAIL = function(){
+            var that = this,table = layui.table;
+            var id = "data_"+ that.id;
+            var detailDialog = layui['view/tech/vciUnapproveTech'];
+            var btm = $webUtil.getOidFromGrid(id,true,true,"btmname");
+            var oid = $webUtil.getOidFromGrid(id,true,true);
+            if(!btm){
+                $webUtil.showErrorMsg("璇烽�夋嫨鏁版嵁");
+                return false
+            }
+            if(btm =="importrecord"){
+                detailDialog.VIEWDETAIL(id);
+            }else if(btm =="trailorderplan"){
+                that.trailorderplanDetail(oid)
+            } else{
+                $webUtil.showErrorMsg("娌℃湁鏄庣粏")
+            }
+
+        };
+        this.showFileDataTable = function(executionid){
+            var that = this;
+            if(!that.fileDataTable){
+                var vciFileManager = layui.vciWebFileManager;
+                vciFileManager.tableDivId = '#file_' + that.id;
+                vciFileManager.id = "file_" + that.id;
+                vciFileManager.inProcess = true;
+                vciFileManager.dataOid = executionid;
+                vciFileManager.dataIsProcessInstance = true;
+                vciFileManager.toolbarDivId =  $('[layui-filter="file_toolbar_' + that.id + '"]');
+                vciFileManager.init();
+                that.fileDataTable = true;
+            }else{
+                layui.vciWebFileManager.reloadByWhere("file_" + that.id,executionid);
+            }
+        };
+        this.renderDataTable = function(btmType,tableCode,executionId,callback){
+            var me = this;
+            var vciWebDataGrid = layui.vciWebDataGrid;
+            var table = layui.table;
+            if(me.taskDataConfig !=null && me.taskDataConfig.btmType == btmType && me.taskDataConfig.tableCode == tableCode){
+                table.reload("data_" + me.id,{
+                    where:{
+                        "conditionMap['processOid']":executionId
+                    }
+                });
+                return;
+            }
+            me.taskDataConfig = {
+                btmType:btmType,
+                tableCode:tableCode
+            };
+            vciWebDataGrid.setConfig("data_" + me.id,{
+                isLoaded :false,
+                tableId:"data_" + me.id,
+                elemId:"#data_" + me.id,
+                btmType:btmType,
+                tableCode:tableCode,
+                isMuti:true,
+                url:me.backPath + me.url.data,
+                extraParams:{//涔熷彲浠ヤ娇鐢╳here
+                    processOid:executionId
+                },
+                done:callback
+            });
+            vciWebDataGrid.init();
+            vciWebDataGrid.showGridByUrl("data_" + me.id);
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            var page = that.sourceData.page;
+            var finishTimeTitle = "瀹屾垚鏃堕棿";
+            if('suspended' == page){
+                finishTimeTitle = "鍐荤粨鏃堕棿";
+            }
+            if(that.columns==null || that.columns.length==0){//濡傛灉鍏朵粬鍦版柟鎯充娇鐢ㄨ繖涓粍浠剁殑鏃跺�欙紝鍙互鑷畾涔夊垪
+                if('done' == page){
+                    that.columns = [table.getIndexColumn(),table.getCheckColumn(),{
+                        field:'name',
+                        title:'浠诲姟鍚嶇О',
+                        width:300
+                    },{
+                        field:'createtime',
+                        title:'浠诲姟寮�濮嬫椂闂�',
+                        width:150,
+                        templet:function(d){
+                            return $webUtil.formateDateTimeNoSecond(d.createtime);
+                        }
+                    },{
+                        field:'creator_name',
+                        title:'涓婁竴姝ユ搷浣滀汉',
+                        width:120,
+                        templet:function(d){
+                            return d.creator_name + "(" + d.creator+")";
+                        }
+                    },{
+                        field: 'ts',
+                        title: '浠诲姟瀹屾垚鏃堕棿',
+                        width: 150,
+                        templet: function (d) {
+                            return $webUtil.formateDateTimeNoSecond(d.ts);
+                        }
+                    },{
+                        field: 'executionid',
+                        title: '鎵�灞炴祦绋嬫ā鏉�',
+                        width: 200,
+                        templet: function (d) {
+                            if($webUtil.isNotNull(d.executionid) && d.executionid.indexOf(".") > -1){
+                                return d.executionid.substring(0,d.executionid.indexOf("."));
+                            }else{
+                                return d.executionid;
+                            }
+                        }
+                    },{
+                        field:'secretgrade',
+                        title:'瀵嗙骇',
+                        width:80,
+                        templet:function (d) {
+                            if(d.secretgrade == '10' || d.secretgrade == 10){
+                                return '闈炲瘑';
+                            }else if(d.secretgrade == '20' || d.secretgrade == 20){
+                                return '绉樺瘑';
+                            }else if(d.secretgrade == '30' || d.secretgrade == 30){
+                                return '鏈哄瘑';
+                            }else{
+                                return '';
+                            }
+                        }
+                    },{
+                        field:'description',
+                        title:'娴佺▼鍚姩鏃舵弿杩�',
+                        width:200
+                    }]
+                }else {
+                    that.columns = [table.getIndexColumn(), table.getCheckColumn(), {
+                        field: 'name',
+                        title: '娴佺▼鍚嶇О',
+                        width: 300
+                    }, {
+                        field: 'creator_name',
+                        title: '鍙戣捣浜�',
+                        width: 120,
+                        templet:function(d){
+                            return d.creator_name + "(" + d.creator +")";
+                        }
+                    }, {
+                        field: 'createtime',
+                        title: '鍙戣捣鏃堕棿',
+                        width: 150,
+                        templet: function (d) {
+                            return $webUtil.formateDateTimeNoSecond(d.createtime);
+                        }
+                    }, {
+                        field: 'ts',
+                        title: finishTimeTitle,
+                        width: 150,
+                        hidden: (($webUtil.inArray(['finish', 'suspended'], page)) ? false : true),
+                        templet: function (d) {
+                            return $webUtil.formateDateTimeNoSecond(d.ts);
+                        }
+                    },{
+                        field: 'executionid',
+                        title: '鎵�灞炴祦绋嬫ā鏉�',
+                        width: 200,
+                        templet: function (d) {
+                            if($webUtil.isNotNull(d.executionid) && d.executionid.indexOf(".") > -1){
+                                return d.executionid.substring(0,d.executionid.indexOf("."));
+                            }else{
+                                return d.executionid;
+                            }
+                        }
+                    },{
+                        field:'description',
+                        title:'娴佺▼鍚姩鏃舵弿杩�',
+                        width:200
+                    }]
+                }
+            }
+        };
+        this.showHistoryTable = function(executionId){
+            var that = this;
+            var table = layui.table;
+            if(that.historyColumns == null || that.historyColumns.length == 0){
+                that.checkHistoryColumns();
+                table.render({
+                    elem:'#history_' + that.id,
+                    url:that.backPath + that.url.history,
+                    page:false,
+                    where:{
+                        executionId:executionId,
+                        showCurrentNode:true
+                    },
+                    cols:[that.historyColumns],
+                    done:function(res,curr,count){
+
+                    }
+                });
+            }else{
+                table.reload("history_" + that.id,{
+                    where:{
+                        executionId:executionId,
+                        showCurrentNode:true
+                    }
+                });
+            }
+        };
+        this.checkHistoryColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.historyColumns==null || that.historyColumns.length==0){//濡傛灉鍏朵粬鍦版柟鎯充娇鐢ㄨ繖涓粍浠剁殑鏃跺�欙紝鍙互鑷畾涔夊垪
+                that.historyColumns = [table.getIndexColumn(),{
+                    field:'taskName',
+                    title:'浠诲姟鍚嶇О',
+                    width:150
+                },{
+                    field:'opinin',
+                    title:'鎵ц鎿嶄綔',
+                    width:100
+                },{
+                    field:'createTime',
+                    title:'浠诲姟寮�濮嬫椂闂�',
+                    width:180
+                },{
+                    field:'node',
+                    title:'瀹℃壒鎰忚',
+                    width:200
+                },{
+                    field:'assigneeName',
+                    title:'鎵ц浜�',
+                    width:120
+                },{
+                    field:'endTime',
+                    title:'浠诲姟瀹屾垚鏃堕棿',
+                    width:180
+                }]
+            }
+        };
+        this.showHistoryPic = function(executionId,taskOid){
+            var that = this;
+            var url = "";
+            if(layui.util.isNotNull(taskOid) && layui.util.isNotNull(executionId)){
+                url = that.backPath + that.url.picture + "?taskOid=" + taskOid + "&executionId=" + encodeURI(executionId);
+            }
+            $("img[layer-pid='picture_" + that.id + "']").attr("src",url);
+        };
+        this.destroy = function(){
+            var that = this;
+            that.taskDataConfig = null;
+            that.columns = null;
+            that.historyColumns = null;
+            var vciWebDataGrid = layui.vciWebDataGrid;
+            vciWebDataGrid.destroy("data_" + that.id);
+        };
+        this.showImgFullScreen = function(){//鍏ㄥ睆鏄剧ず鍥剧墖
+            var that = this;
+            var layer = layui.layer;
+            var url = $("img[layer-pid='picture_" + that.id + "']").attr("src");
+            var alt = "娴佺▼鍥�";
+            if(url && url.indexOf("executionId=")>-1){
+                alt = url.substring(url.indexOf("executionId=") + "executionId=".length );
+                if(alt.indexOf(".")>-1){
+                    alt = alt.substring(0,alt.indexOf("."));
+                }
+            }
+            layer.photos({
+                photos:{
+                    title:'鏌ョ湅娴佺▼鍥�',
+                    id:'show_picture_' +that.id,
+                    start:0,
+                    data:[{
+                        alt:alt,
+                        pid:0,
+                        src:url,
+                        thumb:url
+                    }]
+                }
+            });
+        };
+    };
+    var ep = new ExecutPro();
+    exports('process/vciWebProAllProcessInfo',ep);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebProBusinessData.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebProBusinessData.js
new file mode 100644
index 0000000..0cc2038
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebProBusinessData.js
@@ -0,0 +1,228 @@
+/**
+ * 娴佺▼鍏宠仈鐨勪笟鍔℃暟鎹煡鐪嬪櫒
+ * 鍒嗕负涓夌鐨勬煡鐪嬫柟寮�
+ * 1. 榛樿鐨勮〃鏍硷紝杩欎釜鏄湪骞冲彴鎻愬墠瀹氫箟鐨勶紝鏄竴涓〃鏍硷紝璇峰湪骞冲彴鐨刬nput閾炬帴绫诲瀷涓婂畾涔� ShowMyTaskLinkDataList杩欎釜琛ㄦ牸
+ * 2. 瀹氫箟浜唗ableCode鐨勮瘽锛屽垯鏄湪骞冲彴涓畾涔夊ソ杩欎釜琛ㄦ牸锛屾澶勪細鑷姩鏄剧ず
+ * 3. 鍙戣捣娴佺▼鐨勬椂鍊欏畾涔塪etailUrl锛岃繖涓殑鍊兼槸涓ょ
+ *    a锛� usejs:/jspath/jsfile#contentMethod|initMethod?param
+ *    b锛� http://url ;鎴栬�呮槸涓巑ain.html鐨勭浉瀵硅矾寰�
+ */
+layui.define(['layer','element','form','table','vciWebDataGrid'],function(exports){
+    var BusinessDataInProcess = function(){
+        this.id = "vciWebProBusinessData";
+        this.modelKey = "vciWebProBusinessData";
+        this.businessBtmInProcess = "";
+        this.businessOidsInProcess = "";
+        this.taskOidInProcess = "";
+        this.tableCode = "";
+        this.detailUrl = "";
+        this.UIContentCode = "";
+        this.viewProcessLinkBusinessToken = "";
+        this.backPath = path;
+        this.maxWidth = 1000;
+        this.executionidNoInProcess = "";
+        this.executionid = "";
+        this.url={
+            data:'processDefineController/getDataByTask'
+        };
+        this.defaults = {//榛樿璁剧疆
+            dataTableBtmType:"input",//鍏宠仈鏁版嵁鐨勮〃鏍煎湪鐨勪笟鍔$被鍨嬶紝鐢ㄤ簬鏌ヨ骞冲彴涓殑鍒楄〃
+            dataTableCode:"ShowMyTaskLinkDataList"//鍏宠仈鏁版嵁鐨勮〃鏍间唬鍙�
+        };
+    };
+
+    BusinessDataInProcess.prototype.getContent = function(){
+        var that = this;
+        if($webUtil.isNotNull(that.taskOidInProcess) && that.taskOidInProcess.indexOf(",")>-1){
+            return '<div><span>鍙湁鍗曚釜娴佺▼鐨勬椂鍊欐墠鑳芥煡鐪嬪叧鑱旀枃浠�</span></div>';
+        }
+        var html = '<div id="webProBusinessDataPanel_' + that.id + '">' ;
+        if($webUtil.isNull(that.detailUrl)){
+            html += '<table id="data_'  + that.id  + '" lay-filter="data_' + that.id + '" ></table>';
+        }
+        html += '</div>'
+        return html;
+    }
+    BusinessDataInProcess.prototype.init = function() {
+        var that = this;
+        if ($webUtil.isNotNull(that.taskOidInProcess) && that.taskOidInProcess.indexOf(",") > -1) {
+            return false;
+        }
+        if ($webUtil.isNotNull(that.detailUrl)) {
+            //璇存槑鏄嚜瀹氫箟鐨勯〉闈�
+            var url = that.detailUrl;
+            if ($webUtil.startWith(url.toUpperCase(), "USEJS:")) {
+                url = url.substring(6);
+                var contentMethod = "";
+                var initMethod = "";
+                var compJsPath = "";
+                var params = "";
+                if (url.indexOf("?") > -1) {
+                    params = url.substring(url.indexOf("?") + 1);
+                    url = url.substring(0, url.indexOf("?"));
+                }
+                if (url.indexOf("#") > -1) {
+                    compJsPath = url.substring(0, url.indexOf("#"));
+                    var methods = url.substring(url.indexOf("#") + 1);
+                    if ($webUtil.isNotNull(methods) && methods.indexOf("|") > -1) {
+                        //璇存槑鍗曠嫭璁剧疆浜嗙殑
+                        contentMethod = methods.substring(0, methods.indexOf("|"));
+                        initMethod = methods.substring(methods.indexOf("|") + 1);
+                    } else {
+                        if ($webUtil.isNotNull(methods)) {
+                            initMethod = methods;
+                        } else {
+                            initMethod = "init";
+                        }
+                        contentMethod = "getContent";
+                    }
+                } else {
+                    compJsPath = url;
+                }
+                var sourceData = {};
+                if ($webUtil.isNotNull(params)) {
+                    var paramsArray = params.split("&");
+                    for (var i = 0; i < paramsArray.length; i++) {
+                        var preParam = paramsArray[i].split("=");
+                        sourceData[preParam[0]] = preParam[1];
+                    }
+                }
+                sourceData['businessBtmInProcess'] = that.businessBtmInProcess;
+                sourceData['businessOidsInProcess'] = that.businessOidsInProcess;
+                sourceData['taskOidInProcess'] = that.taskOidInProcess;
+                sourceData['processOid'] = that.processOid;
+                sourceData['oids'] = that.businessOidsInProcess;
+                sourceData['viewProcessLinkBusinessToken'] = that.viewProcessLinkBusinessToken;
+                sourceData['executionidNo'] = that.executionidNoInProcess;
+                sourceData['executionid'] = that.executionid;
+                sourceData['maxWidth'] = that.maxWidth;
+                sourceData['maxHeight'] = that.maxHeight;
+                sourceData['dataStore'] = that.businessDataInProcess;
+                layui.use(compJsPath, function () {
+                    var comp = layui[compJsPath];
+                    comp.id = that.id + "_js";
+                    comp.sourceData = sourceData;
+                    $("#webProBusinessDataPanel_" + that.id).html(comp[contentMethod]());
+                    comp[initMethod]();
+                });
+            } else {
+                //浣跨敤iframe鍖呰9锛岄渶瑕佸厛澶勭悊鍙傛暟
+                var url = that.detailUrl;
+                if (url.indexOf("?")) {
+                    url += "&";
+                } else {
+                    url += "?";
+                }
+                var params = "businessBtmInProcess=" + that.businessBtmInProcess + "&businessOidsInProcess=" + that.businessOidsInProcess +
+                    "&taskOidInProcess=" + that.taskOidInProcess +"&processOid=" + that.processOid +"&oids=" + that.businessOidsInProcess +
+                    "&viewProcessLinkBusinessToken=" + that.viewProcessLinkBusinessToken +
+                    "&executionid=" + that.executionid + "&executionidNo=" + that.executionidNoInProcess +
+                    "&maxWidth=" + that.maxWidth;
+                $("#webProBusinessDataPanel_" + that.id).html('<iframe src="' + url + params + '" style="width:100%;height:100%" frameborder=0 frameScroll=auto ></iframe>');
+            }
+        } else if ($webUtil.isNotNull(that.tableCode)) {
+            //琛ㄦ牸瀹氫箟
+            that.renderDataTable(that.businessBtmInProcess, that.tableCode, that.taskOidInProcess,that.processOid);
+        } else if ($webUtil.isNotNull(that.UIContentCode)) {
+            //UI涓婁笅鏂�
+            layui.use('platform/objectService/VciUIContentViewer', function () {
+                var newTabClass = layui['platform/objectService/VciUIContentViewer'];
+                newTabClass.id = that.id;
+                newTabClass.multiCompent = true;
+                newTabClass.sourceData = {
+                    btmType: that.businessBtmInProcess,
+                    content: that.UIContentCode,
+                    dataOid:that.businessOidsInProcess,
+                    actionData: {
+                        isOpen: true,
+                        paramVOS:{
+                            taskOidInProcess: that.taskOidInProcess,
+                            taskNodeName: that.taskCodeInProcess,
+                            oids:that.businessOidsInProcess,
+                            processOid: that.processOid,
+                            viewProcessLinkBusinessToken: that.viewProcessLinkBusinessToken,
+                            executionidNo:that.executionidNoInProcess,
+                            executionid: that.executionid
+                        },
+                        dataStore:that.businessDataInProcess
+                    }
+                };
+                $('#webProBusinessDataPanel_' + that.id).html(newTabClass.getContent(that.id))
+                newTabClass.init(that.id, newTabClass.sourceData)
+            });
+
+        } else {
+            that.renderDataTable(that.defaults.dataTableBtmType, that.defaults.dataTableCode, that.taskOidInProcess,that.processOid);
+        }
+    }
+    BusinessDataInProcess.prototype.renderDataTable = function(btmType,tableCode,taskOid,processOid,callback){//浣跨敤骞冲彴鐨勬潵鏄剧ず
+        var me = this;
+        var requestData = {
+            "conditionMap['taskOid']":taskOid,
+            "conditionMap['processOid']":processOid,
+            "conditionMap['viewProcessLinkBusinessToken']":me.viewProcessLinkBusinessToken,
+            "isMuti":true,
+            "btmType":btmType,
+            "id":tableCode,
+            "tableCode":tableCode
+        };
+
+        $webUtil.get('webUIController/getTableDefineById', requestData, function (result) {
+            if (result.success) {
+                requestData['queryScheme'] = result.obj.querySchema;
+                var cols = [];
+                for (var i = 0; i < result.obj.cols.length; i++) {
+                    layui.each(result.obj.cols[i], function (_index, record) {
+                        if (record.field.indexOf("t_oid.") > -1) {
+                            record.field = record.field.replace("t_oid.", "");
+                        }
+                        result.obj.cols[i][_index]=record;
+                    });
+                    if (i == 0) {
+                        result.obj.cols[i].unshift({
+                            field: layui.table.config.indexName,
+                            type: 'numbers',
+                            title: '搴忓彿',
+                            rowspan: result.obj.cols.length,
+                            width: 40
+                        })
+                    }
+                    cols.push(result.obj.cols[i]);
+                }
+                //鍙互瀹氫箟琛ㄦ牸浜�
+                layui.table.render({
+                    elem: "#data_" + me.id,
+                    id: "data_" + me.id,
+                    url: me.url.data,
+                    backPath: me.backPath,
+                    page: {
+                        limit: result.obj.limit ? result.obj.limit : 10,
+                        page: result.obj.page? result.obj.page :1
+                    },
+                    limits: result.obj.limits,
+                    where: requestData,
+                    method: 'get',
+                    selectMode: layui.table.selectMode.single,
+                    cols: cols,
+                    done: function (res, cur, total) {
+                        if (total > 0) {
+                            layui.table.selectRecord("data_" + me.id, {index: 0});
+                        }
+                        if(callback){
+                            callback()
+                        }
+                    },
+                    rowClick: function (thisTableFilter, record,isChecked) {
+                    },
+                    rowDBLClick:function (thisTableFilter, record){
+                    }
+                })
+            } else {
+                $webUtil.showErrorMsg(result.msg);
+            }
+        });
+    };
+
+    var bdp = new BusinessDataInProcess();
+    exports('process/vciWebProBusinessData',bdp);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebProBusinessDoc.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebProBusinessDoc.js
new file mode 100644
index 0000000..6046ead
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebProBusinessDoc.js
@@ -0,0 +1,44 @@
+/**
+ * 娴佺▼鐨勬枃浠舵煡璇㈡柟寮�
+ * 浼氱洿鎺ヨ皟鐢ㄦ枃浠剁鐞嗙殑鍒楄〃
+ * 鐢ㄦ埛鐐瑰嚮鏂囦欢鍚嶏紝鏁版嵁琛岀殑鍙充晶锛岀偣鍑绘寜閽笁绉嶆柟寮忔煡鐪嬫枃浠�
+ */
+layui.define(['layer','table','vciWebFileManager'],function(exports){
+    var BusinessDocInProcess = function(){
+        this.id = "vciWebProBusinessDoc";
+        this.modelKey = "vciWebProBusinessDoc";
+        this.businessBtmInProcess = "";
+        this.businessOidsInProcess = "";
+        this.taskOidInProcess = "";
+        this.backPath = path;
+    };
+
+    BusinessDocInProcess.prototype.getContent = function(){
+        var me = this;
+        if($webUtil.isNotNull(me.taskOidInProcess) && me.taskOidInProcess.indexOf(",")>-1){
+            return '<div><span>鍙湁鍗曚釜娴佺▼鐨勬椂鍊欐墠鑳芥煡鐪嬪叧鑱旀枃浠�</span></div>';
+        }
+        return '<div><div layui-filter="file_toolbar_'+me.id+'" class="layui-btn-container"></div>'  +
+                   '<table id="file_' + me.id + '" lay-filter="file_' + me.id + '" ></table></div>';
+    };
+
+    BusinessDocInProcess.prototype.init = function(){
+        var that = this;
+        var vciFileManager = layui.vciWebFileManager;
+        vciFileManager.tableDivId = '#file_' + that.id;
+        vciFileManager.id = "file_" + that.id;
+        vciFileManager.inProcess = true;
+        vciFileManager.dataOid = that.taskOidInProcess;
+        vciFileManager.toolbarDivId =  $('[layui-filter="file_toolbar_' + that.id + '"]');
+        vciFileManager.init();
+    };
+
+    BusinessDocInProcess.prototype.destroy= function(){
+        var that = this;
+        $('[layui-filter="file_toolbar_' + that.id + '"]').remove();
+        $('#file_' + that.id).remove();
+    };
+
+    var bdp = new BusinessDocInProcess();
+    exports('process/vciWebProBusinessDoc',bdp);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebProExecutePanel.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebProExecutePanel.js
new file mode 100644
index 0000000..03c054e
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebProExecutePanel.js
@@ -0,0 +1,314 @@
+/**
+ * 娴佺▼澶勭悊鐨勯〉闈�
+ * 鏀寔鎵归噺鎵ц浠诲姟
+ * 鎵归噺浠诲姟蹇呴』鏄悓涓�涓ā鏉匡紝鍚屼竴涓换鍔★紝骞朵笖閮借缃簡璐熻矗浜虹殑
+ * 鍗曚竴浠诲姟锛屽鏋滀笅涓�鑺傜偣娌℃湁璁剧疆璐熻矗浜猴紝闇�瑕侀�夋嫨璐熻矗浜�
+ */
+layui.define(['layer','form','table','BaseAction'],function(exports){
+    var ProcessExecutePanel = function(){
+        this.id = "vciWebProExecutePanel";
+        this.modelKey = "vciWebProExecutePanel";
+        this.taskOidInProcess = "";//浠诲姟涓婚敭
+        this.taskName = "";//浠诲姟鍚嶇О
+        this.executionId = "";//鎵ц涓婚敭
+        this.backPath = configData.compatibility ? path : configData.processServicePath;
+        this.outcomeMap = [];//鎵�鏈夌殑璺敱
+        this.canSelectUserMap = null;//涓嬩竴璐熻矗浜虹殑鏄犲皠
+        this.creator = "";//娴佺▼鍙戣捣浜� 鐢ㄤ簬娴佺▼瀹屾瘯鎺ㄩ�佹秷鎭�
+        this.url = {
+            execute :'webProcessCommandController/completeTasks',//鏈�缁堢殑鎵цURL
+            getOutcome: 'processDefineController/getOutcomes'//鑾峰彇璺敱
+        }
+    };
+
+    ProcessExecutePanel.prototype.getContent = function(){
+        var that = this;
+        var formId = "form_" + that.id;
+        return '<div id="' + formId + '" lay-filter="' + formId + '" class="layui-form" style="width:250px;"></div>';
+    };
+    ProcessExecutePanel.prototype.init = function() {
+        var that = this;
+        if (that.outcomeMap == null || that.outcomeMap.length == 0) {
+            $webUtil.showErrorMsg("娌℃湁鍙緵鎵ц鐨勬搷浣�,鏃犳硶鎵ц浠诲姟");
+            if (that.finishListener) {
+                that.finishListener(false);
+            }
+            return;
+        }
+        var form = layui.form;
+        var formId = "form_" + that.id;
+        //鐩存帴娣诲姞浠g爜锛屽洜涓轰娇鐢ㄨ〃鍗曠殑娣诲姞鏂规硶涓嶈兘瀹屽叏杈惧埌鏁堟灉
+        var formHtmls = [];
+        formHtmls.push('<input type="text" name="taskOids" style="display:none;"/>');
+        formHtmls.push('<div class="layui-form-item"><div class="layui-form-mid layui-word-aux" style="max-width:240px;width:240px;font-size:10px;word-wrap: break-word;word-break: break-all;overflow: hidden;"><span style="color: #000000">褰撳墠浠诲姟锛�</span>' + that.taskName + '</div></div>');//褰撳墠浠诲姟鎻愮ず
+
+        var needSetNextUser = false;
+        if (that.canSelectUserMap != null) {
+            needSetNextUser = true;
+        }
+        if (needSetNextUser) {//TODO 鏈変笅涓�璐熻矗浜虹殑鎯呭喌娌℃湁娴嬭瘯
+            //闇�瑕佹坊鍔犱笅涓�璐熻矗鐨勬椂鍊欙紝閫夐」鍗曢�夋寜閽紝鍥犱负闇�瑕侀�夋嫨鍚庡啀閫夋嫨澶勭悊浜�
+            formHtmls.push('<div class="layui-form-item"><div class="llayui-form-mid layui-word-aux layui-field-required" style="font-size:10px;">閫夋嫨澶勭悊鏂瑰紡:</div></div>');
+            formHtmls.push('<div class="layui-form-item"><div class="layui-input-block">');
+            layui.each(that.outcomeMap, function (_index, _item) {
+                formHtmls.push('<input type="radio" name="outcome" value="' + _item.key + '" lay-filter="outcome" title="' + _item.value + '" ' + ((_index == 0) ? 'checked' : '') + ' />');
+            });
+            formHtmls.push('</div></div>');
+            //涓嬩竴璐熻矗浜猴紝鍙湁鍚屾剰鐨勬椂鍊欐墠鏈変笅涓�璐熻矗浜�
+            var nextUserData = that.canSelectUserMap[that.outcomeMap[0].key];
+            //闇�瑕佸鐞嗕竴涓嬫樉绀虹殑鍚嶇О
+            if (nextUserData) {
+                layui.each(nextUserData, function (_userIndex, _userItem) {
+                    if (_userItem.type == "role") {
+                        _userItem.name = _userItem.name + "(瑙掕壊)";
+                    } else if (_userItem.type == "dept") {
+                        _userItem.name = _userItem.name + "(閮ㄩ棬)";
+                    } else {
+                        _userItem.name = "(" + _userItem.id + ")" + _userItem.name;
+                    }
+                    if (_userItem.secret && _userItem.secret * 1 > 0 && _userItem.secretText) {
+                        _userItem.name += " [" + _userItem.secretText + "]";
+                    }
+                    if (_userItem.children && _userItem.children.length > 0) {
+                        layui.each(_userItem.children, function (_childrenUserIndex, _childrenUserItem) {
+                            _childrenUserItem.name = "(" + _childrenUserItem.id + ")" + _childrenUserItem.name;
+                            if (_childrenUserItem.secret && _childrenUserItem.secret * 1 > 0 && _childrenUserItem.secretText) {
+                                _childrenUserItem.name += " [" + _childrenUserItem.secretText + "]";
+                            }
+                        });
+                    }
+                });
+            }
+            formHtmls.push('<div class="layui-form-item" style="' +
+                (nextUserData ? '' : "display:none;") + '">' +
+                '<div class="llayui-form-mid layui-word-aux">涓嬩竴璐熻矗浜�:</div></div>');
+            formHtmls.push('<div class="layui-form-item" style="' +
+                (nextUserData ? '' : "display:none;") + '"><div class="layui-input-block" style="margin-left:5px;margin-top:5px;">');
+            formHtmls.push('<select name="nextTaskUser" required lay-filter="nextTaskUser" style="width:230px" ');
+            var referConfigString = JSON.stringify({
+                textField: 'name',
+                valueField: 'id',
+                loadType: 'all',
+                type: 'tree',
+                isMuti: false,
+                data: (nextUserData ? nextUserData : [])
+            }, function (key, val) {
+                if (typeof val === 'function') {
+                    return val + '';
+                }
+                return val;
+            });
+            formHtmls.push(' lay-refer=\'' + referConfigString + '\' lay-refer-showField="name" inDialog="true">');
+            formHtmls.push('<option value=""></option></select></div></div>');
+            //褰撲慨鏀逛簡澶勭悊鏂瑰紡鐨勬椂鍊欙紝鍚屾瑕佷慨鏀逛笅涓�璐熻矗浜虹殑鍐呭
+            form.on('radio(outcome)', function (data) {
+                var selectOutComeElem = $('select[name="nextTaskUser"]');
+                if (that.canSelectUserMap && that.canSelectUserMap[data.value]) {
+                    //璇存槑搴旇璁剧疆涓嬩竴璐熻矗浜�
+                    var referConfigString1 = JSON.stringify({
+                        textField: 'name',
+                        valueField: 'id',
+                        loadType: 'all',
+                        type: 'tree',
+                        isMuti: false,
+                        data: that.canSelectUserMap[data.value]
+                    }, function (key, val) {
+                        if (typeof val === 'function') {
+                            return val + '';
+                        }
+                        return val;
+                    });
+                    selectOutComeElem.attr("lay-refer", referConfigString1);
+                    selectOutComeElem.parent().parent().show();
+                    selectOutComeElem.parent().parent().prev().show();
+                } else {
+                    //涓嶈缃笅涓�璐熻矗浜猴紝閭e簲璇ラ殣钘�
+                    selectOutComeElem.parent().parent().hide();
+                    selectOutComeElem.parent().parent().prev().hide();
+                }
+            });
+        }
+        formHtmls.push('<div class="layui-form-item"><div class="layui-form-mid layui-word-aux" style="font-size:10px;color:#2080da;"><span style="color: #000000">璇峰湪涓嬫柟杈撳叆鎮ㄧ殑瀹℃壒鎰忚锛�</span></div></div>');//瀹℃壒鎰忚
+        formHtmls.push('<div class="layui-form-item layui-form-text"><div class="layui-input-block" style="margin-left:0px">' +
+            '<textarea name="note" placeholder="" class="layui-textarea"></textarea>' +
+            '</div></div>');
+
+        var fileHtml = '<div class="layui-upload-drag processFile" data-value="processFile" id="upload-drag-processFile" extendAttrMap=\'{"accept":"file"}\' lay-filter="processFile" >' +
+            '  <i class="layui-icon" style="font-size: 36px;">顧�</i>' +
+            '  <p style="font-size: 12px;">鐐瑰嚮涓婁紶锛屾垨灏嗘枃浠舵嫋鎷藉埌姝ゅ</p>' +
+            '  <div class="layui-hide uploadDemoView">' +
+            '    <hr>' +
+            '<input class="uploadFileOid" type="hidden" name="processFile">'+
+            '    <img src="" alt="宸蹭笂浼犲浘鐗�" style="max-width: 180px">' +
+            '  </div>' +
+            '</div>';
+        formHtmls.push('<div class="layui-form-item"><label class="layui-form-label" style="width: 90px;padding: 0;color:#000;">瀹℃壒鎰忚闄勪欢锛�</label><div class="layui-input-block" style="margin-left: 90px">'+fileHtml+'</div></div>');//闄勪欢
+        formHtmls.push('<div class="layui-form-mid layui-word-aux" style="font-size:10px;color:#000 !important;padding: 0 !important;line-height: 16px">宸蹭笂浼犲鎵规枃浠讹細</div>');
+        formHtmls.push('<table id="table_profile" lay-filter="table_profile" style="overflow-x:auto;clear:both"></table>')
+        if (needSetNextUser) {
+            formHtmls.push('<div class="layui-form-item"><div class="layui-input-inline" style="padding:5px 0;">' +
+                '<button class="layui-btn" name="processOutCome" lay-filter="processTask_ok_' + that.id + '">纭畾鎻愪氦</button></div></div>');
+        } else {
+            formHtmls.push('<div class="layui-form-item">');
+            that.setRouter = false;//鏄惁闇�瑕佹彁绀洪噸鏂拌缃祦绋嬫ā鏉�
+            var outcomeBtn=[],outcomeBtn2=[]
+            layui.each(that.outcomeMap, function (_index, _item) {
+                if (_index == 0 && _item.key == "鏈懡鍚嶈矾鐢�") {
+                    that.setRouter = true;
+                    outcomeBtn.push('<button style="margin: 0 10px 10px 0;display: block" class="layui-btn layui-btn-sm" name="processOutCome" lay-filter="processTask_ok_' + that.id + '_' + _index + '" type="button">鎵ц</button>');
+                } else if (_index == 1 && _item.key == "鏈懡鍚嶈矾鐢�" && setRouter) {
+                    $webUtil.showErrorMsg("娴佺▼妯℃澘閿欒锛佽淇敼娴佺▼妯℃澘锛�");
+                    that.setRouter = false;
+                    return false
+                }else if(_item.key=='鍚屾剰'){
+                    outcomeBtn.push('<button style="margin: 0 10px 10px 0;display: block;" class="layui-btn layui-btn-sm ' + ((_index % 2 == 1) ? 'layui-btn-primary' : '') + '" name="processOutCome" lay-filter="processTask_ok_' + that.id + '_' + _index + '" type="button">鍚屾剰</button>');
+                } else {
+                    outcomeBtn2.push('<button style="margin: 0 10px 10px 0;display: block" class="layui-btn layui-btn-sm ' + ((_index % 2 == 1) ? 'layui-btn-primary' : '') + '" name="processOutCome" lay-filter="processTask_ok_' + that.id + '_' + _index + '" type="button">' + _item.key + '</button>');
+                }
+
+            });
+            if(outcomeBtn.length>0){
+                formHtmls.push('<div class="layui-input-inline" style="padding:5px 0;min-width: auto;margin-right: 0">'+outcomeBtn.join('')+'</div>');
+            }
+            if(outcomeBtn2.length>0){
+                formHtmls.push('<div class="layui-input-inline" style="padding:5px 0;min-width: auto;margin-right: 0">'+outcomeBtn2.join('')+'</div>');
+            }
+            formHtmls.push('</div>');
+        }
+        $("#" + formId).html(formHtmls.join(''));
+        $('#' + formId + ' [name="processOutCome"]').click(function () {
+            that.executeTask(needSetNextUser ? "" : $(this).html());
+        });
+        form.render();
+        var baseAction = layui['BaseAction'];
+        baseAction.renderUploadFile('#upload-drag-processFile', {
+            uploadfileurl: 'webProcessCommandController/uploadAuditSuggestFile',
+            uploadfilebackpath: configData.compatibility ? path : configData.fileServicePath
+        },{
+            taskOids:that.taskOidInProcess
+        },function (){
+            that.refresh()
+        })
+        that.initFileTable('table_profile')
+        $('#' + formId + '_attach .layui-upload').css({'margin-left': '0'})
+        form.setValues({
+            taskOids: that.taskOidInProcess,
+            taskName: that.taskName
+        });
+    };
+    ProcessExecutePanel.prototype.initFileTable = function(id) {
+        var that = this;
+        var table = layui.table;
+        table.render({
+            elem: '#' + id,
+            id: id,
+            url: 'processDefineController/listAuditSuggestFile',
+            backPath: that.backPath,
+            selectMode: table.selectMode.signal,
+            width: 250,
+            extraParams: {
+                taskOids:that.taskOidInProcess
+            },
+            cols: [[{
+                    title: '鏂囦欢鍚�',
+                    field: 'name',
+                    width: 120,
+                    templet:function (d){
+                        return '<a class="layui-btn layui-btn-intable"  style="width: 100%;text-overflow: ellipsis;overflow: hidden;" title="'+d.name+'" lay-event="PREVIEW">'+d.name+'</a>'
+                    }
+                }, {
+                    title: '涓婁紶浜�',
+                    field: 'creator',
+                    width: 68
+                },{
+                    field:'option',
+                    title:'鎿嶄綔',
+                    width:56,
+                    templet:function (d){
+                        return '<a class="layui-btn layui-btn-intable" lay-event="download">涓嬭浇</a>';
+                    }
+                }]],
+            done: function (res, cur, total) {
+                table.on('tool(' + id + ')',function(obj){
+                    var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                    var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                    if(layEvent == 'PREVIEW'){
+                        //鏂囦欢棰勮
+                        layui.use('BaseFileDownloadAction', function () {
+                            var vciWebFilePreview = layui['BaseFileDownloadAction'];
+                            vciWebFilePreview.PREVIEW(data.oid,{fileOid:data.oid},function (){
+                                $webUtil.showErrorMsg("鏂囦欢棰勮澶辫触锛岃鑱旂郴绠$悊鍛�")
+                            })
+                        })
+                    }else if(layEvent=='download'){
+                        layui.use('BaseFileDownloadAction', function () {
+                            var vciWebFilePreview = layui['BaseFileDownloadAction'];
+                            vciWebFilePreview.doAction({
+                                paramVOS: {},
+                                id: 'download'+data.oid,
+                                dataStore: [data]
+                            })
+                        })
+                    }
+                });
+            }
+        });
+    };
+    ProcessExecutePanel.prototype.executeTask = function(outcome){
+        var that = this;
+        var form = layui.form;
+        var formId = "form_" + that.id;
+        if(form.validata(formId)){
+            //鏍¢獙閫氳繃
+            var values = form.getValues(formId);
+            if($webUtil.isNull(outcome) && $webUtil.isNull(values.outcome)){
+                $webUtil.showErrorMsg("璇峰繀椤婚�夋嫨澶勭悊鏂瑰紡");
+                return false;
+            }
+            if($webUtil.isNotNull(outcome) && $webUtil.isNull(values.outcome)){
+                values.outcome =outcome;
+            }
+            var nextTaskUser = values.nextTaskUser;
+            if($webUtil.isNull(nextTaskUser) && that.canSelectUserMap !=null && that.canSelectUserMap[values.outcome]){
+                $webUtil.showErrorMsg("璇峰繀椤婚�夋嫨涓嬩竴璐熻矗浜�");
+                return false;
+            }
+            if(that.setRouter && values.outcome =='鎵ц'){
+                values.outcome  = '鏈懡鍚嶈矾鐢�';
+                outcome = "鏈懡鍚嶈矾鐢�";
+            }
+            if("涓嶅悓鎰�"==values.outcome && $webUtil.isNull(values.note)){
+                $webUtil.showErrorMsg("褰撳鐞嗘柟寮忎负涓嶅悓鎰忔椂锛岄渶瑕佸~鍐欏鎵规剰瑙�");
+                return false;
+            }
+            if("鍚屾剰"==values.outcome && $webUtil.isNull(values.note)){
+                values.note = "鍚屾剰";
+            }
+            var requestData = {
+                taskOids:values.taskOids,
+                outCome:($webUtil.isNotNull(outcome)?outcome:(values.outcome)),
+                note:values.note,
+                nextTaskUserIds:nextTaskUser
+            };
+
+            $webUtil.post(that.url.execute,requestData,function(result){
+                if(result.success){
+                    if(that.finishListener){
+                        that.finishListener(true);
+                    }
+                    $webUtil.showMsg("娴佺▼浠诲姟鎵ц鎴愬姛");
+                }else{
+                    $webUtil.showErrorMsg(result.msg);
+                }
+            },{
+            },that.backPath,true);
+        }
+    };
+
+    ProcessExecutePanel.prototype.refresh=function (){
+        layui.table.reload('table_profile')
+    }
+
+    var bdp = new ProcessExecutePanel();
+    exports('process/vciWebProExecutePanel',bdp);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebProExecuteTask.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebProExecuteTask.js
new file mode 100644
index 0000000..59cb07a
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebProExecuteTask.js
@@ -0,0 +1,291 @@
+/**
+ * Created by weidy on 2018/5/17.
+ * 娴佺▼鎵ц绐楀彛
+ */
+layui.define(['table','element','layer','form','vciWebComboxStore','vciWebFileManager','vciWebDataGrid',
+            'process/vciWebProBusinessData','process/vciWebProBusinessDoc',
+            'process/vciWebProHistory','process/vciWebProExecutePanel'],function(exports){
+    var ExecuteTask = function(){
+        this.moduleKey = "vciWebProExecuteTask";
+        this.rejectRouteName="涓嶅悓鎰�";
+        this.backPath = configData.compatibility ? path : configData.processServicePath;//榛樿娴佺▼鍜岄」鐩殑璺緞鏄竴鏍风殑
+        this.url = {
+            getOutcome: 'processDefineController/getOutcomes',
+            checkUserSameTemplate:'processDefineController/checkUseSameTemplate',
+            dataDefine:'processDefineController/getDataDefine'//浠庡悗鍙拌幏鍙栨樉绀哄叧鑱旀暟鎹殑鍒楄〃鐨刢ode
+        };
+        this.allowMutiExecuteTask = false;//鏄惁鍏佽鎵归噺鎵ц浠诲姟
+        this.id="vciWebProExecuteTask";
+        this.dialogForm ='';
+        this.defaults = {
+            dataTableBtmType:"input",//鍏宠仈鏁版嵁鐨勮〃鏍煎湪鐨勪笟鍔$被鍨嬶紝鐢ㄤ簬鏌ヨ骞冲彴涓殑鍒楄〃
+            dataTableCode:"ShowMyTaskLinkDataList"//鍏宠仈鏁版嵁鐨勮〃鏍间唬鍙�
+        };
+    };
+    ExecuteTask.prototype.getContent = function(){//鑾峰彇鍩虹鐨刪tml
+        return "";
+    };
+    ExecuteTask.prototype.init = function(){//鍒濆鍖�
+        var that = this;
+        $webUtil.copyConfig(that,that.moduleKey);
+    };
+    ExecuteTask.prototype.showExecuteWindow=function(taskInfo,options,closeCallback){
+        var that = this;
+        if(!taskInfo){
+            $webUtil.showErrorMsg("娌℃湁娴佺▼鐩稿叧鐨勪俊鎭�");
+            return;
+        }
+        var isMutiTask = false;
+        if(!$webUtil.isArray(taskInfo)){
+            taskInfo = [taskInfo];
+        }
+        if(taskInfo.length == 0 ){
+            $webUtil.showErrorMsg("娌℃湁娴佺▼鐩稿叧鐨勪俊鎭�");
+            return;
+        }
+        if(taskInfo.length >1){
+            isMutiTask = true;
+        }
+        if(!that.allowMutiExecuteTask && isMutiTask){
+            $webUtil.showErrorMsg("涓嶅厑璁告壒閲忔墽琛屾祦绋�");
+            return false;
+        }
+        var taskOids = "";
+        var taskName = taskInfo[0].taskName;
+        var executionId = taskInfo[0].executionId;
+        layui.each(taskInfo,function(_index,_item){
+            taskOids += _item.taskOid + ",";
+        });
+        taskOids = layui.util.removeComma(taskOids);
+
+        var taskCodes = "";
+        layui.each(taskInfo,function(_index,_item){
+            taskCodes += _item.code + ",";
+        });
+        taskCodes = layui.util.removeComma(taskCodes);
+        var firstOid = taskInfo[0].taskOid;
+        //濡傛灉鏄壒閲忔墽琛屾祦绋嬶紝閭e氨闇�瑕佸厛鏄惁浣跨敤鐩稿悓鐨勬祦绋嬫ā鏉垮拰鐩稿悓鐨勪换鍔¤妭鐐�
+        if(isMutiTask){
+            $webUtil.post(that.url.checkUserSameTemplate,{taskOids:taskOids},function(result){
+                if(result.success){
+                    $webUtil.showErrorMsg("鏆傛椂杩樻病鏈夋坊鍔犲浜庢壒閲忔墽琛屼换鍔$殑鏀寔");
+                    //鎵归噺鐨勪换鍔℃椂锛屾槸涓嶈兘鏌ョ湅鏁版嵁锛屾枃浠跺拰娴佺▼鍘嗗彶鐨�
+                    //鐩存帴鏄剧ず鎵归噺鎵ц鐨勭獥鍙�
+                    //that.gotoShowWindow(taskOids,taskCodes,firstOid,taskName,isMutiTask,options,closeCallback,taskInfo);
+                }else{
+                    $webUtil.showErrorMsg(result.msg);
+                }
+            },function(){},that.backPath,true);
+        }else{
+            that.gotoShowWindow(taskOids,taskCodes,executionId,taskName,isMutiTask,options,closeCallback,taskInfo);
+        }
+    };
+    ExecuteTask.prototype.gotoShowWindow = function(taskOids,taskCodes,executionId,taskName,isMutiTask,options,closeCallback,taskInfo){
+        var that = this;
+        var form = layui.form;
+        var formId = "execute_task_form_" + taskOids;
+        var title = "鎵ц[" + taskName + "]" + (isMutiTask?"绛変换鍔�":"");
+        var tree = layui.tree;
+        var canSelectUserMap = null;
+        var windowArea= [(($webUtil.isNotNull(options.width) || options.width*1>1) ?options.width*1 : 950) +'px',
+        (($webUtil.isNotNull(options.height) && options.height*1>1) ?options.height*1 : 600) + 'px'];
+        if(options.fullScreen){
+            if(window.innerWidth){
+                windowArea = [(window.innerWidth-50) + "px",(window.innerHeight-50) + "px"];
+            }else{
+                windowArea = [(document.documentElement.clientWidth-50) + "px",(document.documentElement.clientHeight-50) + "px"];
+            }
+        }
+        var divWidth = windowArea[0].substring(0,windowArea[0].indexOf("px")) - 295;
+        that.closeedWindow = false;
+        var taskWindowIndex = layer.open({
+            type:1,
+            title:title,
+            //btn:['鍙栨秷'],//鎰熻鐩存帴鍏抽棴姣旇緝濂斤紝鍙栨秷鍗犵敤澶绾靛悜绌洪棿
+            //skin:'layui-layer-lan',
+            content:'<div id="processbusniessdata_' + formId + '_div" class="layui-layout-center" style="margin-left:5px;width:' + divWidth + 'px;max-width:'+ divWidth +'px;overflow:auto;" >' +
+                        '<div lay-filter="processbusniessdata_' + formId + '" class="layui-tab layui-tab-card" lay-allowClose="false">'+
+                            '<ul class="layui-tab-title" lay-allowClose="false">' +
+                            '</ul>' +
+                            '<div class="layui-tab-content"></div>' +
+                        '</div> '+
+                    '</div>' +
+                '<div id="processtaskdo_' + formId + '" class="layui-layout-east" style="display:block;position:absolute;top:0;right:0;margin:10px 5px 0 0;padding:0 5px;max-width:300px;min-width:150px;border:1px solid #e1e1e1"></div>',
+            area:windowArea,
+            closeBtn:(options.full)?0:1,
+            shade:true,
+            shadeClose:true,
+            resize:true,
+            resizing:function(layero){
+                form.doResize();
+            },
+            yes:function(index,layero){
+                layer.close(taskWindowIndex);
+                if(closeCallback){
+                    closeCallback(false);
+                }
+            },
+            success:function(layero){
+                //鐗瑰埆娉ㄦ剰锛屽浠诲姟澶勭悊鐨勶紝椤甸潰鍙兘鏄剧ず鍒楄〃锛涜�屼笖澶氫换鍔′腑鐨勪笟鍔℃暟鎹繀椤绘槸鍚屼竴涓笟鍔$被鍨嬩笅锛涜繖涓渶瑕佸悇鑷睍绀虹殑椤甸潰涓嚜琛屽鐞�
+                //1. 娣诲姞鍏宠仈鐨勪笟鍔℃暟鎹睍绀鸿〃鍗曠殑閫夐」鍗★紝闇�瑕佷粠鍚庡彴鍘绘煡璇㈠弬鏁伴噷瀹氫箟锛屽鏋滃畾涔変簡tableCode锛岃鏄庢槸鏄剧ず骞冲彴鐨勮〃鏍硷紝濡傛灉鏄痙etailUrl璇存槑鏄樉绀鸿嚜瀹氫箟鐨勯〉闈紝鍚﹀垯鏄剧ず榛樿鐨�
+                //2. 娣诲姞鍏宠仈鏂囨。鐨勯�夐」鍗★紝鍙樉绀哄綋鍓嶄笟鍔℃暟鎹叧鑱旂殑鏂囨。锛屽鏋滄槸鏄庣粏鏁版嵁锛岄渶瑕佷娇鐢ㄨ嚜瀹氫箟鐨勯〉闈㈠唴瀹逛腑灞曠ず
+                //3. 娣诲姞娴佺▼鍘嗗彶鐨勯�夐」鍗★紝鍏朵腑鍖呭惈娴佺▼鍥惧拰娴佺▼鍘嗗彶
+                //浠庡悗鍙板厛鑾峰彇娴佺▼鐩稿叧鐨勯厤缃�
+                var compIdFix =  taskOids;
+                $webUtil.post(that.url.dataDefine,{executionid:executionId},function(result){
+                    if(result.success){
+                        var businessDataComp = layui['process/vciWebProBusinessData'];//涓氬姟鏁版嵁
+                        var businessDocComp = layui['process/vciWebProBusinessDoc'];//鍏宠仈鏂囨。
+                        var processHistoryComp = layui['process/vciWebProHistory'];//鎿嶄綔鍘嗗彶
+
+                        businessDataComp.businessBtmInProcess = result.obj.UIType;
+                        businessDataComp.businessOidsInProcess = result.obj.businessOids;
+                        businessDataComp.taskOidInProcess = taskOids;
+                        businessDataComp.taskCodeInProcess = taskCodes;
+                        businessDataComp.tableCode = result.obj.tableCode;
+                        businessDataComp.detailUrl = result.obj.detailUrl;
+                        businessDataComp.UIContentCode = result.obj.UIContentCode;
+                        result.obj.UIContentCode && (businessDataComp.UIContentSelectData = taskInfo)
+                        businessDataComp.viewProcessLinkBusinessToken = result.obj.viewProcessLinkBusinessToken;//鐢ㄦ潵鍦ㄦ煡鐪嬫祦绋嬬殑鏁版嵁鏃讹紝鍛婅瘔鍚庡彴璺宠繃鏉冮檺鐨�
+                        businessDataComp.executionidNoInProcess = result.obj.executionidno;
+                        businessDataComp.executionid = executionId;
+                        businessDataComp.maxWidth = divWidth;
+                        businessDataComp.maxHeight = null;
+                        businessDataComp.id = "vciProcessBusinessData_executeTask_" + compIdFix;
+
+                        businessDocComp.businessBtmInProcess = result.obj.UIType;
+                        businessDocComp.businessOidsInProcess = result.obj.businessOids;
+                        businessDocComp.taskOidInProcess = taskOids;
+                        businessDocComp.taskCodeInProcess = taskCodes;
+                        businessDocComp.id = "vciProcessBusinessDoc_executeTask_" + compIdFix;
+
+                        processHistoryComp.taskOidInProcess = taskOids;
+                        processHistoryComp.taskCodeInProcess = taskCodes;
+                        processHistoryComp.executionId=executionId;
+                        processHistoryComp.maxWidth = divWidth;
+                        processHistoryComp.id = "vciProcessHistory_executeTask_" + compIdFix;
+
+                        webUtil.ajax('get','/uiDataController/getDataAttr',{oid: result.obj.businessOids, btmname: result.obj.UIType} , function (res) {
+                            if (res.success) {
+                                if(res.data){
+                                    businessDataComp.businessDataInProcess=res.data;
+                                    processHistoryComp.businessDataInProcess=res.data;
+                                    businessDocComp.businessDataInProcess=res.data;
+                                }else{
+                                    businessDataComp.businessDataInProcess=[res.obj];
+                                    processHistoryComp.businessDataInProcess=[res.obj];
+                                    businessDocComp.businessDataInProcess=[res.obj];
+                                }
+                                layui.element.tabAdd('processbusniessdata_' + formId,{
+                                    title:'涓氬姟鏁版嵁淇℃伅',
+                                    id: "tab_" + businessDataComp.id,
+                                    unAllowClose:true,
+                                    item:businessDataComp
+                                });
+
+                                /*layui.element.tabAdd('processbusniessdata_' + formId,{
+                                    title:'涓氬姟鏁版嵁鍏宠仈鏂囨。',
+                                    id: "tab_" + businessDocComp.id,
+                                    unAllowClose:true,
+                                    item:businessDocComp
+                                });*/
+
+                                layui.element.tabAdd('processbusniessdata_' + formId,{
+                                    title:'娴佺▼璺熻釜',
+                                    id: "tab_" + processHistoryComp.id,
+                                    unAllowClose:true,
+                                    item:processHistoryComp
+                                });
+                                if(result.defaultDisplayDoc || result.defaultDisplayDoc == "true"){ //濡傛灉鐢ㄦ埛鎯充紭鍏堢湅鏂囦欢
+                                    layui.element.tabChange('processbusniessdata_' + formId, "tab_" + businessDocComp.id);
+                                }else{
+                                    layui.element.tabChange('processbusniessdata_' + formId, "tab_" + businessDataComp.id);
+                                }
+                            } else {
+                                webUtil.showErrorMsg(res.msg);
+                            }
+                        }, function (xhr, err) {
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        }, that.backPath,true);
+
+                    }else{
+                        if(!that.closeedWindow){
+                            $webUtil.showErrorMsg(result.msg,function(){
+                                that.closeedWindow = true;
+                                layer.close(taskWindowIndex);
+                                if(closeCallback){
+                                    closeCallback(false);
+                                }
+                            });
+                        }
+                    }
+                },function(){
+                    $webUtil.showErrorMsg("杩炴帴鏈嶅姟鍑虹幇浜嗛棶棰�");
+                },that.backPath,true);
+                //澶勭悊闈㈡澘鏄悓姝ュ鐞嗙殑銆�
+                $webUtil.post(that.url.getOutcome,{taskOid:taskOids},function(result){
+                    if(result.success&&result.obj && result.obj.length > 0){
+                        //鏌ヨ鎴愬姛鐨�
+                        var outcomeMap = [];
+                        var canSelectUserMap = null;
+                        var end = false;
+                        layui.each(result.obj,function(_index,_item){
+                           if(!_item.processUser || _item.processUser == null || _item.processUser.length == 0){
+                                if(_item.nextNodeUser && _item.nextNodeUser != null && _item.nextNodeUser.length > 0){
+                                    if(canSelectUserMap == null){
+                                        canSelectUserMap = {};
+                                    }
+                                     canSelectUserMap[_item.name] = _item.nextNodeUser;
+                                }
+                            }
+                            outcomeMap.push({
+                                key:_item.name,
+                                value:_item.name
+                            });
+                            if(_item.nextTaskName == "缁撴潫"){
+                                end = true;
+                            }
+                        });
+                        var executePanel = layui['process/vciWebProExecutePanel'];
+                        executePanel.id = "execute_" + compIdFix;
+                        executePanel.taskOidInProcess = taskOids;
+                        executePanel.outcomeMap = outcomeMap;
+                        executePanel.executionId = executionId;
+                        executePanel.taskName = taskName;
+                        executePanel.creator = end?taskInfo[0].creator:"";
+                        executePanel.canSelectUserMap = canSelectUserMap;
+                        executePanel.finishListener = function(success){
+                            if(success){
+                                that.closeedWindow = false;
+                                layer.close(taskWindowIndex);
+                                if(closeCallback){
+                                    closeCallback(true);
+                                }
+                            }
+                        };
+                        $('#processtaskdo_' + formId).html(executePanel.getContent());
+                        executePanel.init();
+                    }else{//璇存槑杩欎簺浠诲姟鍙兘涓嶆槸鍚屼竴涓祦绋嬫ā鏉匡紝鍚屼竴涓殑娴佺▼浠诲姟鑺傜偣
+                        if(!that.closeedWindow){
+                            $webUtil.showErrorMsg(result.msg,function(){
+                                that.closeedWindow = true;
+                                layer.close(taskWindowIndex);
+                                if(closeCallback){
+                                    closeCallback(false);
+                                }
+                            });
+                        }
+                    }
+                },function(){
+                    $webUtil.showErrorMsg("杩炴帴鏈嶅姟鍑虹幇浜嗛棶棰�");
+                },that.backPath,true);
+            }
+        });
+        if(options.full){
+            layer.full(taskWindowIndex);
+        }
+
+    };
+    var et = new ExecuteTask();
+    exports("process/vciWebProExecuteTask",et);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebProExecutingTab.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebProExecutingTab.js
new file mode 100644
index 0000000..d6d6327
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebProExecutingTab.js
@@ -0,0 +1,615 @@
+/**
+ * Created by dengbk on 2019/4/26.
+ * 鎵ц涓殑娴佺▼.宸叉寕璧锋祦绋嬶紝宸茬粓姝㈡祦绋嬶紝宸插畬鎴愭祦绋嬪叕鐢ㄩ〉闈�
+ */
+layui.define(['layer','element','form','table','vciWebDataGrid','flow','process/vciWebProExecuteTask','vciWebFileManager'],function(exports){
+    /**
+     * 涓诲尯鍩熶负寰呭姙浠诲姟鐨勫垪琛�
+     * 涓嬫柟鐨勫尯鍩熷垎涓轰笁涓�夐」鍗°�愬叧鑱旀暟鎹�戙�愭祦绋嬪巻鍙层�戙�愭祦绋嬪浘銆�
+     * 涓诲尯鍩熺殑寰呭姙浠诲姟鍒楄〃鐨勫悗鍙拌矾寰勪笌涓婚〉涓殑鎸備欢涓�鑷�
+     * 涓婚〉涓殑鏌ョ湅鏁版嵁鐨勫悗鍙拌矾寰勪笌姝ら〉闈㈢殑銆愬叧鑱旀暟鎹�戜腑涓�鑷�
+     */
+    var ExecutPro = function(){
+        this.moduleKey = "vciWebProExecutingTab";
+        this.id='vciWebProExecutingTab';
+        this.sourceData={};
+        this.columns = [];
+        this.historyColumns = [];
+        this.backPath = configData.compatibility ? path : configData.processServicePath;//榛樿娴佺▼鍜岄」鐩殑璺緞鏄竴鏍风殑
+        this.isDebug = false;
+        this.url={
+            task:'processDefineController/getMyUndoTask',
+            dataDefine:'processDefineController/getDataDefine',//浠庡悗鍙拌幏鍙栨樉绀哄叧鑱旀暟鎹殑鍒楄〃鐨刢ode
+            data:'processDefineController/getDataByTask',
+            history:'processDefineController/getHistory',
+            picture:'processDefineController/getProcessPic',
+            dataGridDetail:'webTrailorderplanController/getOrderItemByOidUnAccept',//trailorderplan鑾峰彇璇︾粏
+            executing:'processDefineController/getMyExecutingProcess',//鎵ц涓殑娴佺▼
+            suspended:'processDefineController/getMySuspendedProcess',//宸叉寕璧锋祦绋�
+            end:'processDefineController/getMyEndProcess',//宸茬粓姝㈡祦绋�
+            finish:'processDefineController/getMyFinishProcess',//宸插畬鎴愭祦绋�
+            done:'processDefineController/getMyDoneProcessTask',//宸插姙浠诲姟
+            endProcess:'webProcessCommandController/endProcess',//缁堟娴佺▼
+            suspendProcess:'webProcessCommandController/suspendProcess',//鍐荤粨娴佺▼
+            resumeProcess:'webProcessCommandController/resumeProcess',//鍥炲娴佺▼
+            getDataByTask:'processDefineController/getDataByTask'
+        };
+        this.defaults = {
+            dataShowByOid:true,//鏄惁鏍规嵁浠诲姟鐨勪笉鍚屾潵鏄剧ず涓嶅悓鐨勬暟鎹垪琛�--濡傛灉娴佺▼涓病鏈夋坊鍔燿ataDisplayTable鍙橀噺璇疯缃负false
+            dataTableBtmType:"input",//鍏宠仈鏁版嵁鐨勮〃鏍煎湪鐨勪笟鍔$被鍨嬶紝鐢ㄤ簬鏌ヨ骞冲彴涓殑鍒楄〃
+            dataTableCode:"ShowMyTaskLinkDataList"//鍏宠仈鏁版嵁鐨勮〃鏍间唬鍙�
+        };
+        this.limit={
+            task:10,
+            data:5,
+            history:5
+        };
+        this.taskDataConfig = {
+
+        };
+        this.trailDetailColumns = [];
+        this.getContent = function () {
+            var me = this;
+            if(me.sourceData && "page" in me.sourceData){
+                me.id = me.id + "_" + me.sourceData.page;
+            }
+            return '<div id="UIContent_' + me.id + '" style="overflow: auto;padding:0 5px"></div>';
+        };
+        this.showContent = function () {
+            var html = "";
+            var that = this;
+            html = [
+                '<div class="layui-layout easyui-layout UIContentLayout" id="easyuiLayout_', that.id, '" data-options="fit:true" style="display:block;overflow-y: hidden">',
+                    '<div data-options="region:\'north\',split:true" style="padding: 5px;height:450px">',
+                        '<div layui-filter="toolbar_',that.id, '" class="layui-btn-container">',//涓诲垪琛ㄧ殑鎸夐挳
+                            '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_freez" style="display:none"><i class="layui-icon layui-icon-logo"></i>鍐荤粨</button>',
+                            '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_stop" style="display:none"><i class="layui-icon layui-icon-refresh-2"></i>缁堟</button>',
+                            '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_resume" style="display:none"><i class="layui-icon layui-icon-refresh-2"></i>鎭㈠</button>',
+                            '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh-2"></i>鍒锋柊</button>',
+                        '</div>',
+                        '<table id="table_', that.id , '" lay-filter="',that.id , '"></table>',//涓诲垪琛�
+                    '</div>',
+                    '<div data-options="region:\'center\'" style="padding:0 5px" id="border_', that.id, '">',
+                        '<div class="">',
+                            '<div class="layui-tab" lay-filter="tab_',that.id ,'" style="margin-top: 5px">' ,//搴曢儴閫夐」鍗�
+                                '<ul class="layui-tab-title">',
+                                    '<li lay-id="businessData" class="layui-this">鍏宠仈鏁版嵁</li>',
+                                    '<li>鍏宠仈鏂囦欢</li>',
+                                    '<li>瀹℃壒鍘嗗彶</li>',
+                                    '<li>娴佺▼鍥�</li>',
+                                '</ul>',
+                                '<div class="layui-tab-content">',
+                                    '<div lay-id="businessData" class="layui-tab-item layui-show">',  //榛樿鏄剧ず鍏宠仈鏁版嵁
+                                        '<div layui-filter="data_toolbar_',that.id,'" class="layui-btn-container"></div>',
+                                        '<div layui-filter="data_div_',that.id,'" ></div>',
+                                        '<table id="data_', that.id , '" lay-filter="data_', that.id , '" ></table>',
+                                    '</div>',
+                                    '<div class="layui-tab-item" id="file_item_"',that.id,' style="width:100%">',
+                                        '<div layui-filter="file_toolbar_',that.id,'" class="layui-btn-container"></div>' ,
+                                        '<table id="file_' , that.id , '" lay-filter="file_' , that.id , '" ></table>',
+                                    '</div>',
+                                    '<div class="layui-tab-item" style="width:100%"><table id="history_' , that.id , '" lay-filter="history_' , that.id , '" ></table></div>' ,
+                                    '<div class="layui-tab-item" id="picture_parent_',that.id,'" style="overflow-y:auto;"><span>鐐瑰嚮鍥剧墖鍙互鏀惧ぇ鏌ョ湅</span><img layer-pid="picture_' , that.id , '" lay-filter="picture_' , that.id , '" src=""  alt="娴佺▼鍥�" style="width:100%;" /></div>',
+                                '</div>',
+                            '</div>',
+                        '</div>',
+                    '</div>',
+                '</div>'
+            ].join("");
+            $("#UIContent_" + that.id).html(html);
+        };
+        this.getUrlByPage = function(){
+            var url = '',that = this,urlArr = that.url;
+            var page = that.sourceData.page;
+            if(page){
+                for(var item in urlArr){
+                    if(item == page){
+                        url = urlArr[item];
+                    }
+                }
+                if(page == 'executing'){
+                    $("button[layui-filter='toolbar_"+that.id+"_freez']").show();
+                    $("button[layui-filter='toolbar_"+that.id+"_stop']").show()
+                }
+                if(page == 'suspended'){
+                    $("button[layui-filter='toolbar_"+that.id+"_resume']").show()
+                }
+            }else{
+                url = urlArr.task;
+            }
+            return url;
+        };
+        this.init=function(){//鍩虹鐨刪tml琚坊鍔犲悗锛屽啀鎵ц鍒濆鍖�
+            var me = this;
+            me.taskDataConfig = null;
+            me.fileDataTable = false;
+            me.historyColumns = null;
+            me.columns = null;
+            $webUtil.copyConfig(me,me.moduleKey);
+            var table = layui.table;
+            me.checkColumns();//涓诲垪琛ㄤ腑鍒椼��
+            setTimeout(function () {
+                me.showContent();
+                var easyuiLayout = $('#easyuiLayout_' + me.id)
+                easyuiLayout.css({height: $('#portal_body').height() - 43, width: $('#portal_body').width() - 15})
+                easyuiLayout.layout();
+
+                table.render({
+                    elem:'#table_' + me.id,
+                    id:'table_' + me.id,
+                    url:me.getUrlByPage(),
+                    backPath:me.backPath,
+                    page:{
+                        limit:me.limit.task,
+                        page:1
+                    },
+                    height:390,
+                    cols:[me.columns],
+                    done:function(res,cur,count){
+                        var taskOid = "";
+                        var executionId = "";
+                        table.selectRecord('table_' + me.id,[{index:0}]);
+                    },
+                    rowClick:function(thisTableFilter,record){
+                        if(record.detailUrl){
+                            $("#"+me.id+'_VIEWDETAIL').show()
+                        }
+                        me.showDataTable(record.executionid,record);
+                        me.showHistoryTable(record.executionid);
+                        me.showHistoryPic(record.executionid,record.oid);
+                    }
+                });
+                var searchFieldObject = {
+                    name: "娴佺▼鍚嶇О",
+                    executionid:"鎵�灞炴祦绋嬫ā鏉�",
+                    description:"娴佺▼鍚姩鏃舵弿杩�"
+                };
+                if("done" == me.sourceData.page){
+                    searchFieldObject['name'] = '浠诲姟鍚嶇О';
+                }
+                $webUtil.createSearchHtml(searchFieldObject, $('[layui-filter="toolbar_' + me.id + '"]'), 'table_' +me.id);
+                me.bindListeners();
+
+            }, 1);
+
+
+        };
+        this.bindListeners = function(){
+            var that = this;
+            $("img[layer-pid='picture_" + that.id + "']").click(function(){
+                that.showImgFullScreen();
+            });
+            $("[layui-filter='toolbar_" + that.id + "_execute']").click(function(){
+                var table = layui.table;
+                var checkData = table.checkStatus('table_' + that.id);
+                if(checkData && checkData.data && checkData.data.length>0){
+                    var executeTask = layui['view/process/vciWebProExecuteTask'];
+                    executeTask.init();
+                    var taskInfo = [];
+                    layui.each(checkData.data,function(_index,_item){
+                        taskInfo.push({
+                            taskOid:(_item.oid),
+                            taskName:_item.name,
+                            executionId:(_item.executionid)
+                        });
+                    });
+                    executeTask.showExecuteWindow(taskInfo,{
+                        fullScreen:true
+                    },function(finish){
+                        if(finish){
+                            table.reload('table_' + that.id);
+                        }
+                    });
+                }else{
+                    $webUtil.showErrorMsg("娌℃湁閫夋嫨娴佺▼浠诲姟");
+                }
+            });
+            $("[layui-filter='toolbar_" + that.id + "_VIEWDETAIL']").click(function(){
+                that.VIEWDETAIL()
+            });
+            $("[layui-filter='toolbar_" + that.id + "_stop']").click(function(){
+                that.stop();
+            });
+            $("[layui-filter='toolbar_" + that.id + "_freez']").click(function(){
+                that.freez();
+            });
+            $("[layui-filter='toolbar_" + that.id + "_resume']").click(function(){
+                that.resume();
+            });
+            $("[layui-filter='toolbar_" + that.id + "_refresh']").click(function(){
+                that.refresh();
+            });
+        };
+        this.refresh = function(){
+            var that = this;
+            var table = layui.table;
+            table.reload("table_" + that.id,{});
+        };
+        this.freez = function(){
+            var that = this;
+            var executionid = $webUtil.getOidFromGrid("table_" + that.id,true,false,'executionid');
+            if(!executionid){
+                return;
+            }
+            $webUtil.showConfirmMsg("鎮ㄧ‘瀹氳鍐荤粨杩欎釜娴佺▼鍚�?",function(){
+                $webUtil.post(that.url.suspendProcess,{processOids:executionid},function(result){
+                    if(result.success){
+                        $webUtil.showMsg("鍐荤粨娴佺▼鎴愬姛");
+                        that.refresh();
+                    }else{
+                        $webUtil.showErrorMsg(result.msg);
+                    }
+                },function(){
+                    // $webUtil.showErrorMsg("杩炴帴鏈嶅姟鍑虹幇浜嗛棶棰�");
+                },that.backPath);
+            });
+
+        };
+        this.stop = function(){
+            var that = this;
+            var executionid = $webUtil.getOidFromGrid("table_" + that.id,true,false,'executionid');
+            if(!executionid){
+                return;
+            }
+            $webUtil.showConfirmMsg("鎮ㄧ‘瀹氳缁堟杩欎釜娴佺▼鍚�?",function() {
+                $webUtil.post(that.url.endProcess, {processOids: executionid}, function (result) {
+                    if (result.success) {
+                        $webUtil.showMsg("缁堟娴佺▼鎴愬姛");
+                        that.refresh();
+                    } else {
+                        $webUtil.showErrorMsg(result.msg);
+                    }
+                }, function () {
+                    // $webUtil.showErrorMsg("杩炴帴鏈嶅姟鍑虹幇浜嗛棶棰�");
+                }, that.backPath);
+            });
+        };
+        this.resume = function(){
+            var that = this;
+            var executionid = $webUtil.getOidFromGrid("table_" + that.id,true,false,'executionid');
+            if(!executionid){
+                return;
+            }
+            $webUtil.showConfirmMsg("鎮ㄧ‘瀹氳鍐荤粨杩欎釜娴佺▼鍚�?",function() {
+                $webUtil.post(that.url.resumeProcess, {processOids: executionid}, function (result) {
+                    if (result.success) {
+                        $webUtil.showMsg("鎭㈠娴佺▼鎴愬姛");
+                        that.refresh();
+                    } else {
+                        $webUtil.showErrorMsg(result.msg);
+                    }
+                }, function () {
+                }, that.backPath);
+            });
+        };
+        this.showDataTable = function(executionId,data) {//鑾峰彇鏁版嵁琛ㄦ牸涓殑鐩稿叧瀹氫箟
+            var that = this;
+            $webUtil.post(that.url.dataDefine, {executionid: executionId}, function (result) {
+                if (result.success && $webUtil.isNotNull(result.obj.UIType)) {
+                    var businessDataComp = layui['process/vciWebProBusinessData'];//涓氬姟鏁版嵁
+
+                    businessDataComp.businessBtmInProcess = result.obj.UIType;
+                    businessDataComp.businessOidsInProcess = result.obj.businessOids;
+                    businessDataComp.tableCode = result.obj.tableCode;
+                    businessDataComp.detailUrl = result.obj.detailUrl;
+                    businessDataComp.UIContentCode = result.obj.UIContentCode;
+                    businessDataComp.viewProcessLinkBusinessToken = result.obj.viewProcessLinkBusinessToken;//鐢ㄦ潵鍦ㄦ煡鐪嬫祦绋嬬殑鏁版嵁鏃讹紝鍛婅瘔鍚庡彴璺宠繃鏉冮檺鐨�
+                    businessDataComp.executionidNoInProcess = result.obj.executionidno;
+                    businessDataComp.executionid = executionId;
+                    businessDataComp.maxHeight = $('#border_'+that.id).height() - 45;
+                    businessDataComp.maxWidth = $('#portal_body').width() - 10;
+                    businessDataComp.id = "vciProcessBusinessData_" + data.oid;
+                    businessDataComp.noEdit = false;
+
+                    webUtil.ajax('get', '/uiDataController/getDataAttr', {
+                        oid: result.obj.businessOids,
+                        btmname: result.obj.UIType
+                    }, function (res) {
+                        if (res.success) {
+                            if (res.data) {
+                                businessDataComp.businessDataInProcess = res.data;
+                            } else {
+                                businessDataComp.businessDataInProcess = [res.obj];
+                            }
+                            $("[layui-filter='data_div_" + that.id + "']").html(businessDataComp.getContent());
+                            businessDataComp.init();
+                        } else {
+                            webUtil.showErrorMsg(res.msg);
+                        }
+                    }, function (xhr, err) {
+                        webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                    }, that.backPath,true);
+
+
+                }else{
+                    layui.element.tabDelete("tab_" + that.id, "businessData");
+                }
+
+                that.showFileDataTable(executionId,result.obj);
+
+            }, function () {
+                $webUtil.showErrorMsg("杩炴帴鏈嶅姟鍑虹幇浜嗛棶棰�");
+            }, that.backPath,true);
+        };
+        this.showFileDataTable = function(executionid,obj){
+            var that = this;
+            if(!that.fileDataTable){
+                var vciFileManager = layui.vciWebFileManager;
+                var options= {
+                    tableId: '#file_' + that.id,
+                    url:'processDefineController/dataGridFileInProcess',
+                    inProcess: true,
+                    dataOid: executionid,
+                    dataIsProcessInstance: true,
+                    toolbarId: '[layui-filter="file_toolbar_' + that.id + '"]',
+                    sourceData:{
+                        viewProcessLinkBusinessToken:obj.viewProcessLinkBusinessToken,
+                        executionidNoInProcess:obj.executionidno,
+                        businessOidsInProcess:obj.businessOids
+                    },
+                    elem:'#file_item_' + that.id
+                }
+                vciFileManager.tableDivId = '#file_' + that.id;
+                vciFileManager.id = "file_" + that.id;
+                vciFileManager.inProcess = true;
+                vciFileManager.dataOid = executionid;
+                vciFileManager.dataIsProcessInstance = true;
+                vciFileManager.toolbarDivId =  $('[layui-filter="file_toolbar_' + that.id + '"]');
+                vciFileManager.init();
+                vciFileManager.render(vciFileManager.id,options)
+                that.fileDataTable = true;
+            }else{
+                layui.vciWebFileManager.reloadByWhere("file_" + that.id,executionid);
+            }
+        };
+        this.renderDataTable = function(btmType,tableCode,executionId,callback){
+            var me = this;
+            var vciWebDataGrid = layui.vciWebDataGrid;
+            var table = layui.table;
+            if(me.taskDataConfig !=null && me.taskDataConfig.btmType == btmType && me.taskDataConfig.tableCode == tableCode){
+                table.reload("data_" + me.id,{
+                    where:{
+                        "conditionMap['processOid']":executionId
+                    }
+                });
+                return;
+            }
+            me.taskDataConfig = {
+                btmType:btmType,
+                tableCode:tableCode
+            };
+            vciWebDataGrid.setConfig("data_" + me.id,{
+                isLoaded :false,
+                tableId:"data_" + me.id,
+                elemId:"#data_" + me.id,
+                btmType:btmType,
+                tableCode:tableCode,
+                isMuti:true,
+                url:me.backPath + me.url.data,
+                extraParams:{//涔熷彲浠ヤ娇鐢╳here
+                    processOid:executionId
+                },
+                done:callback
+            });
+            vciWebDataGrid.init();
+            vciWebDataGrid.showGridByUrl("data_" + me.id);
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            var page = that.sourceData.page;
+            var finishTimeTitle = "瀹屾垚鏃堕棿";
+            if('suspended' == page){
+                finishTimeTitle = "鍐荤粨鏃堕棿";
+            }
+            if(that.columns==null || that.columns.length==0){//濡傛灉鍏朵粬鍦版柟鎯充娇鐢ㄨ繖涓粍浠剁殑鏃跺�欙紝鍙互鑷畾涔夊垪
+                if('done' == page){
+                    that.columns = [table.getIndexColumn(),table.getCheckColumn(),{
+                        field:'name',
+                        title:'浠诲姟鍚嶇О',
+                        width:300
+                    },{
+                        field:'createtime',
+                        title:'浠诲姟寮�濮嬫椂闂�',
+                        width:150,
+                        templet:function(d){
+                            return $webUtil.formateDateTimeNoSecond(d.createtime);
+                        }
+                    },{
+                        field:'creator_name',
+                        title:'涓婁竴姝ユ搷浣滀汉',
+                        width:120,
+                        templet:function(d){
+                            return d.creator_name + "(" + d.creator+")";
+                        }
+                    },{
+                        field: 'ts',
+                        title: '浠诲姟瀹屾垚鏃堕棿',
+                        width: 150,
+                        templet: function (d) {
+                            return $webUtil.formateDateTimeNoSecond(d.ts);
+                        }
+                    },{
+                        field: 'executionid',
+                        title: '鎵�灞炴祦绋嬫ā鏉�',
+                        width: 200,
+                        templet: function (d) {
+                            if($webUtil.isNotNull(d.executionid) && d.executionid.indexOf(".") > -1){
+                                return d.executionid.substring(0,d.executionid.indexOf("."));
+                            }else{
+                                return d.executionid;
+                            }
+                        }
+                    },{
+                        field:'secretgrade',
+                        title:'瀵嗙骇',
+                        width:80,
+                        templet:function (d) {
+                            if(d.secretgrade == '10' || d.secretgrade == 10){
+                                return '闈炲瘑';
+                            }else if(d.secretgrade == '20' || d.secretgrade == 20){
+                                return '绉樺瘑';
+                            }else if(d.secretgrade == '30' || d.secretgrade == 30){
+                                return '鏈哄瘑';
+                            }else{
+                                return '';
+                            }
+                        }
+                    },{
+                        field:'description',
+                        title:'娴佺▼鍚姩鏃舵弿杩�',
+                        width:200
+                    }]
+                }else {
+                    that.columns = [table.getIndexColumn(), table.getCheckColumn(), {
+                        field: 'name',
+                        title: '娴佺▼鍚嶇О',
+                        width: 300
+                    }, {
+                        field: 'creator_name',
+                        title: '鍙戣捣浜�',
+                        width: 120,
+                        templet:function(d){
+                            return d.creator_name + "(" + d.creator +")";
+                        }
+                    }, {
+                        field: 'createtime',
+                        title: '鍙戣捣鏃堕棿',
+                        width: 150,
+                        templet: function (d) {
+                            return $webUtil.formateDateTimeNoSecond(d.createtime);
+                        }
+                    }, {
+                        field: 'ts',
+                        title: finishTimeTitle,
+                        width: 150,
+                        hidden: (($webUtil.inArray(['finish', 'suspended'], page)) ? false : true),
+                        templet: function (d) {
+                            return $webUtil.formateDateTimeNoSecond(d.ts);
+                        }
+                    },{
+                        field: 'executionid',
+                        title: '鎵�灞炴祦绋嬫ā鏉�',
+                        width: 200,
+                        templet: function (d) {
+                            if($webUtil.isNotNull(d.executionid) && d.executionid.indexOf(".") > -1){
+                                return d.executionid.substring(0,d.executionid.indexOf("."));
+                            }else{
+                                return d.executionid;
+                            }
+                        }
+                    },{
+                        field:'description',
+                        title:'娴佺▼鍚姩鏃舵弿杩�',
+                        width:200
+                    }]
+                }
+            }
+        };
+        this.showHistoryTable = function(executionId){
+            var that = this;
+            var table = layui.table;
+            if(that.historyColumns == null || that.historyColumns.length == 0){
+                that.checkHistoryColumns();
+                table.render({
+                    elem:'#history_' + that.id,
+                    url:that.url.history,
+                    backPath:that.backPath,
+                    page:false,
+                    where:{
+                        executionId:executionId,
+                        showCurrentNode:true
+                    },
+                    cols:[that.historyColumns],
+                    done:function(res,curr,count){
+
+                    }
+                });
+            }else{
+                table.reload("history_" + that.id,{
+                    where:{
+                        executionId:executionId,
+                        showCurrentNode:true
+                    }
+                });
+            }
+        };
+        this.checkHistoryColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.historyColumns==null || that.historyColumns.length==0){//濡傛灉鍏朵粬鍦版柟鎯充娇鐢ㄨ繖涓粍浠剁殑鏃跺�欙紝鍙互鑷畾涔夊垪
+                that.historyColumns = [table.getIndexColumn(),{
+                    field:'taskName',
+                    title:'浠诲姟鍚嶇О',
+                    width:150
+                },{
+                    field:'opinin',
+                    title:'鎵ц鎿嶄綔',
+                    width:100
+                },{
+                    field:'createTime',
+                    title:'浠诲姟寮�濮嬫椂闂�',
+                    width:180
+                },{
+                    field:'node',
+                    title:'瀹℃壒鎰忚',
+                    width:200
+                },{
+                    field:'assigneeName',
+                    title:'鎵ц浜�',
+                    width:120
+                },{
+                    field:'endTime',
+                    title:'浠诲姟瀹屾垚鏃堕棿',
+                    width:180
+                }]
+            }
+        };
+        this.showHistoryPic = function(executionId){
+            var that = this;
+            var url = "";
+            if(layui.util.isNotNull(executionId)){
+                url = that.backPath + that.url.picture + "?executionId=" + executionId + "&" + TOKEN_KEY + "=" + $webUtil.getToken();
+            }
+            $("img[layer-pid='picture_" + that.id + "']").attr("src",url);
+        };
+        this.destroy = function(){
+            var that = this;
+            that.taskDataConfig = null;
+            that.columns = null;
+            that.historyColumns = null;
+            var vciWebDataGrid = layui.vciWebDataGrid;
+            vciWebDataGrid.destroy("data_" + that.id);
+        };
+        this.showImgFullScreen = function(){//鍏ㄥ睆鏄剧ず鍥剧墖
+            var that = this;
+            var layer = layui.layer;
+            var url = $("img[layer-pid='picture_" + that.id + "']").attr("src");
+            var alt = "娴佺▼鍥�";
+            if(url && url.indexOf("executionId=")>-1){
+                alt = url.substring(url.indexOf("executionId=") + "executionId=".length );
+                if(alt.indexOf(".")>-1){
+                    alt = alt.substring(0,alt.indexOf("."));
+                }
+            }
+            layer.photos({
+                photos:{
+                    title:'鏌ョ湅娴佺▼鍥�',
+                    id:'show_picture_' +that.id,
+                    start:0,
+                    data:[{
+                        alt:alt,
+                        pid:0,
+                        src:url,
+                        thumb:url
+                    }]
+                }
+            });
+        };
+        this._VIEWDETAIL = function (){
+
+        }
+    };
+    var ep = new ExecutPro();
+    exports('process/vciWebProExecutingTab',ep);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebProHistory.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebProHistory.js
new file mode 100644
index 0000000..4164002
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebProHistory.js
@@ -0,0 +1,96 @@
+/**
+ * 娴佺▼璺熻釜锛屾煡鐪嬫祦绋嬪巻鍙插拰褰撳墠鐨勬祦绋嬪浘
+ */
+layui.define(['layer','element','table'],function(exports){
+    var ProcessHistory = function(){
+        this.id = "vciWebProHistory";
+        this.modelKey = "vciWebProHistory";
+        this.businessBtmInProcess = "";
+        this.businessOidsInProcess = "";//涓氬姟鏁版嵁浼氭湁澶氫釜
+        this.taskOidInProcess = "";
+        this.executionId = "";
+        this.backPath = configData.compatibility ? path : configData.processServicePath ;
+        this.maxWidth = 1000;
+        this.url={
+            history:'processDefineController/getHistory',
+            picture:'processDefineController/getProcessPic',
+        };
+    }
+
+    ProcessHistory.prototype.getContent = function(){
+        var that = this;
+        if($webUtil.isNotNull(that.executionOid) && that.executionOid.indexOf(",") > -1){
+            return '<div><span>鍙湁鍗曚釜浠诲姟鐨勬椂鍊欐墠鑳芥煡鐪嬫祦绋嬪巻鍙�</div>';
+        }
+        return ['<div style="width:', that.maxWidth - 10, 'px;overflow:auto;"><table id="history_' , that.id , '" lay-filter="history_' , that.id , '" ></table>',
+                '<img layer-pid="picture_' , that.id , '" lay-filter="picture_' , that.id , '" src=""  alt="娴佺▼鍥�" style="width:', that.maxWidth - 10 ,'px;" /></div>'].join('');
+    };
+
+    ProcessHistory.prototype.init = function(){
+        var that = this;
+        var table = layui.table;
+        if(that.historyColumns == null || that.historyColumns.length == 0){
+            that.checkHistoryColumns();
+        }
+        table.render({
+            elem:'#history_' + that.id,
+            backPath: that.backPath,
+            url:that.url.history,
+            page:false,
+            where:{
+                executionId:that.executionId,
+                showCurrentNode:true
+            },
+            cols:[that.historyColumns]
+        });
+        //鏄剧ず娴佺▼鍥�
+        var url = "";
+        if(layui.util.isNotNull(that.taskOidInProcess)){
+            url = that.backPath + that.url.picture + "?taskOid=" + that.taskOidInProcess + "&" + TOKEN_KEY + "=" + $webUtil.getToken();
+        }else{
+            url = that.backPath + that.url.picture + "?executionId=" + that.executionId + "&" + TOKEN_KEY + "=" + $webUtil.getToken();
+        }
+        $("img[layer-pid='picture_" + that.id + "']").attr("src",url);
+    };
+    ProcessHistory.prototype.checkHistoryColumns = function(){
+        var that = this;
+        var table = layui.table;
+        if(that.historyColumns==null || that.historyColumns.length==0){//濡傛灉鍏朵粬鍦版柟鎯充娇鐢ㄨ繖涓粍浠剁殑鏃跺�欙紝鍙互鑷畾涔夊垪
+            that.historyColumns = [table.getIndexColumn(),{
+                field:'taskName',
+                title:'浠诲姟鍚嶇О',
+                width:150
+            },{
+                field:'opinin',
+                title:'鎵ц鎿嶄綔',
+                width:100
+            },{
+                field:'createTime',
+                title:'浠诲姟寮�濮嬫椂闂�',
+                width:180
+            },{
+                field:'node',
+                title:'瀹℃壒鎰忚',
+                width:200
+            },{
+                field:'assigneeName',
+                title:'鎵ц浜�',
+                width:120
+            },{
+                field:'endTime',
+                title:'浠诲姟瀹屾垚鏃堕棿',
+                width:180,
+                templet:function(d){
+                    if($webUtil.isNotNull(d.endTime)){
+                        return d.endTime;
+                    }else{
+                        return "姝e湪澶勭悊涓�";
+                    }
+                }
+            }]
+        }
+    };
+
+    var history = new ProcessHistory();
+    exports('process/vciWebProHistory',history);
+});
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebProMonitor.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebProMonitor.js
new file mode 100644
index 0000000..e977a1e
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebProMonitor.js
@@ -0,0 +1,458 @@
+/**
+ * Created by dengbk on 2019/4/26.
+ * 鎵ц涓殑娴佺▼.宸叉寕璧锋祦绋嬶紝宸茬粓姝㈡祦绋嬶紝宸插畬鎴愭祦绋嬪叕鐢ㄩ〉闈�
+ */
+layui.define(['layer','element','form','table','vciWebDataGrid','flow','process/vciWebProExecuteTask','vciWebFileManager'],function(exports){
+    /**
+     * 涓诲尯鍩熶负寰呭姙浠诲姟鐨勫垪琛�
+     * 涓嬫柟鐨勫尯鍩熷垎涓轰笁涓�夐」鍗°�愬叧鑱旀暟鎹�戙�愭祦绋嬪巻鍙层�戙�愭祦绋嬪浘銆�
+     * 涓诲尯鍩熺殑寰呭姙浠诲姟鍒楄〃鐨勫悗鍙拌矾寰勪笌涓婚〉涓殑鎸備欢涓�鑷�
+     * 涓婚〉涓殑鏌ョ湅鏁版嵁鐨勫悗鍙拌矾寰勪笌姝ら〉闈㈢殑銆愬叧鑱旀暟鎹�戜腑涓�鑷�
+     */
+    var ExecutPro = function(){
+        this.moduleKey = "vciWebProExecutingTab";
+        this.id='vciWebProExecutingTab';
+        this.sourceData={};
+        this.columns = [];
+        this.backPath = configData.compatibility ? path : configData.processServicePath;//榛樿娴佺▼鍜岄」鐩殑璺緞鏄竴鏍风殑
+        this.isDebug = false;
+        this.url={
+            task:'processDefineController/getMyUndoTask',
+            dataDefine:'processDefineController/getDataDefine',//浠庡悗鍙拌幏鍙栨樉绀哄叧鑱旀暟鎹殑鍒楄〃鐨刢ode
+            data:'processDefineController/getDataByTask',
+            history:'processDefineController/getHistory',
+            picture:'processDefineController/getProcessPic',
+            dataGridDetail:'webTrailorderplanController/getOrderItemByOidUnAccept',//trailorderplan鑾峰彇璇︾粏
+            executing:'processDefineController/getMyExecutingProcess',//鎵ц涓殑娴佺▼
+            allExecuting:'processDefineController/getAllExecutingProcess',//鎵ц涓殑鍏ㄩ儴娴佺▼
+            suspended:'processDefineController/getMySuspendedProcess',//宸叉寕璧锋祦绋�
+            allSuspended:'processDefineController/getAllSuspendedProcess',//鍏ㄩ儴鎸傝捣鐨勬祦绋�
+            end:'processDefineController/getMyEndProcess',//宸茬粓姝㈡祦绋�
+            allEnd:'processDefineController/getAllEndProcess',//鍏ㄩ儴宸茬粓姝㈢殑娴佺▼
+            finish:'processDefineController/getMyFinishProcess',//宸插畬鎴愭祦绋�
+            allFinish:'processDefineController/getAllFinishProcess',//鍏ㄩ儴瀹屾垚鐨勬祦绋�
+            done:'processDefineController/getMyDoneProcessTask',//宸插姙浠诲姟
+            endProcess:'webProcessCommandController/endProcess',//缁堟娴佺▼
+            suspendProcess:'webProcessCommandController/suspendProcess',//鍐荤粨娴佺▼
+            resumeProcess:'webProcessCommandController/resumeProcess'//鍥炲娴佺▼
+        };
+        this.defaults = {
+            dataShowByOid:true,//鏄惁鏍规嵁浠诲姟鐨勪笉鍚屾潵鏄剧ず涓嶅悓鐨勬暟鎹垪琛�--濡傛灉娴佺▼涓病鏈夋坊鍔燿ataDisplayTable鍙橀噺璇疯缃负false
+            dataTableBtmType:"input",//鍏宠仈鏁版嵁鐨勮〃鏍煎湪鐨勪笟鍔$被鍨嬶紝鐢ㄤ簬鏌ヨ骞冲彴涓殑鍒楄〃
+            dataTableCode:"ShowMyTaskLinkDataList"//鍏宠仈鏁版嵁鐨勮〃鏍间唬鍙�
+        };
+        this.limit={
+            task:10,
+            data:5,
+            history:5
+        };
+        this.getContent=function(){//杩斿洖杩欎釜缁勪欢鐨勫熀纭�html
+            var me = this;
+            if(me.sourceData && "page" in me.sourceData){
+                me.id = me.id + "_" + me.sourceData.page;
+            }
+            var html = [ '<div class="layui-layout-border">',
+                '<div layui-filter="toolbar_',me.id, '" class="layui-btn-container">',//涓诲垪琛ㄧ殑鎸夐挳
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',me.id,'_freez" compid ="',me.id,'" style="display:none"><i class="layui-icon layui-icon-logo"></i>鍐荤粨</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',me.id,'_stop" compid ="',me.id,'" style="display:none"><i class="layui-icon layui-icon-refresh-2"></i>缁堟</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',me.id,'_resume" compid ="',me.id,'" style="display:none"><i class="layui-icon layui-icon-refresh-2"></i>鎭㈠</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',me.id,'_refresh" compid ="',me.id,'" ><i class="layui-icon layui-icon-refresh-2"></i>鍒锋柊</button>',
+
+                '</div>',
+                '<div class="layui-center" style="max-height:400px">',
+
+                '<table id="table_', me.id , '" lay-filter="table_',me.id , '"></table>',//涓诲垪琛�
+                '</div>',
+                '<div class="layui-south" style="min-height:100px;padding:0 5px">',
+                '<div layui-filter="south_toolbar_',me.id, '" class="layui-btn-container">',//涓诲垪琛ㄧ殑鎸夐挳
+
+                '</div>',
+                '<div class="layui-tab">' ,//搴曢儴閫夐」鍗�
+                '<ul class="layui-tab-title">',
+                '<li class="layui-this">鍏宠仈鏁版嵁</li>',
+                '<li>瀹℃壒鍘嗗彶</li>',
+                '<li>娴佺▼鍥�</li>',
+                '</ul>',
+                '<div class="layui-tab-content">',
+                '<div class="layui-tab-item layui-show">',  //榛樿鏄剧ず鍏宠仈鏁版嵁
+                    '<div id="data_div_' , me.id , '"  layui-filter="data_div_',me.id,'" ></div>',
+                '</div>',
+                '<div class="layui-tab-item" style="width:100%"><div id="history_div_' , me.id , '" lay-filter="history_div_' , me.id , '" ></div></div>' ,
+                '<div class="layui-tab-item" id="picture_parent_',me.id,'" style="overflow-y:auto;"><span>鐐瑰嚮鍥剧墖鍙互鏀惧ぇ鏌ョ湅</span><img layer-pid="picture_' , me.id , '" lay-filter="picture_' , me.id , '" src=""  alt="娴佺▼鍥�" style="width:1000px;display:block" /></div>',
+                '</div>',
+                '</div>',
+                '</div>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getUrlByPage = function(){
+            var url = '',that = this,urlArr = that.url;
+            var page = that.sourceData.page;
+            if(page){
+                for(var item in urlArr){
+                    if(item == page){
+                        url = urlArr[item];
+                    }
+                }
+                if(page == 'executing'){
+                    $("button[layui-filter='toolbar_"+that.id+"_freez']").show();
+                    $("button[layui-filter='toolbar_"+that.id+"_stop']").show()
+                }
+                if(page == 'suspended'){
+                    $("button[layui-filter='toolbar_"+that.id+"_resume']").show()
+                }
+            }else{
+                url = urlArr.task;
+            }
+            return url;
+        };
+        this.init=function(){//鍩虹鐨刪tml琚坊鍔犲悗锛屽啀鎵ц鍒濆鍖�
+            var me = this;
+            me.columns = null;
+            $webUtil.copyConfig(me,me.moduleKey);
+            var table = layui.table;
+            me.checkColumns();//涓诲垪琛ㄤ腑鍒椼��
+            table.render({
+                elem:'#table_' + me.id,
+                id:'table_' + me.id,
+                url:me.backPath + me.getUrlByPage(),
+                page:{
+                    limit:me.limit.task,
+                    page:1
+                },
+                height:400,
+                cols:[me.columns],
+                done:function(res,cur,count){
+                    table.selectRecord('table_' + me.id,[{index:0}]);
+                },
+                rowClick:function(thisTableFilter,record){
+                    me.showDataTable(record);
+                    me.showHistoryPic(record.executionid,record.oid);
+                }
+            });
+            var searchFieldObject = {
+                name: "娴佺▼鍚嶇О",
+                executionid:"鎵�灞炴祦绋嬫ā鏉�",
+                description:"娴佺▼鍚姩鏃舵弿杩�"
+            };
+            if("done" == me.sourceData.page){
+                searchFieldObject['name'] = '浠诲姟鍚嶇О';
+            }
+            $webUtil.createSearchHtml(searchFieldObject, $('[layui-filter="toolbar_' + me.id + '"]'), 'table_' +me.id);
+            me.bindListeners();
+        };
+        this.bindListeners = function(){
+            var that = this;
+            $("img[layer-pid='picture_" + that.id + "']").click(function(){
+                that.showImgFullScreen();
+            });
+            $("[layui-filter='toolbar_" + that.id + "_execute']").click(function(){
+                var table = layui.table;
+                var checkData = table.checkStatus('table_' + that.id);
+                if(checkData && checkData.data && checkData.data.length>0){
+                    var executeTask = layui['process/vciWebProExecuteTask'];
+                    executeTask.init();
+                    var taskInfo = [];
+                    layui.each(checkData.data,function(_index,_item){
+                        var task = _item;
+                        task.taskOid = _item.oid;
+                        task.taskName = _item.name;
+                        task.executionId=_item.executionid
+                        task.creator=_item.creator
+                        taskInfo.push(task);
+                    });
+                    executeTask.showExecuteWindow(taskInfo,{
+                        fullScreen:true
+                    },function(finish){
+                        if(finish){
+                            table.reload('table_' + that.id);
+                        }
+                    });
+                }else{
+                    $webUtil.showErrorMsg("娌℃湁閫夋嫨娴佺▼浠诲姟");
+                }
+            });
+            $("[layui-filter='toolbar_" + that.id + "_stop']").click(function(){
+                var compid = $(this).attr("compid");
+                that.stop(compid);
+            });
+            $("[layui-filter='toolbar_" + that.id + "_freez']").click(function(){
+                var compid = $(this).attr("compid");
+                that.freez(compid);
+            });
+            $("[layui-filter='toolbar_" + that.id + "_resume']").click(function(){
+                var compid = $(this).attr("compid");
+                that.resume(compid);
+            });
+            $("[layui-filter='toolbar_" + that.id + "_refresh']").click(function(){
+                var compid = $(this).attr("compid");
+                that.refresh(compid);
+            });
+        };
+        this.refresh = function(id){
+            var table = layui.table;
+            table.reload("table_" + id,{});
+        };
+        this.refreshAll = function() {
+            var that = this;
+            var btns = $('.layui-buttons .layui-btn[layui-filter$="_refresh"]');
+            layui.each(btns, function (i, btn) {
+                var compid = $(btn).attr("compid");
+                that.refresh(compid)
+            })
+        };
+
+        //鍐荤粨
+        this.freez = function(id){
+            var that = this;
+            var executionid = $webUtil.getOidFromGrid("table_" + id,true,false,'executionid');
+            if(!executionid){
+                return;
+            }
+            $webUtil.showConfirmMsg("鎮ㄧ‘瀹氳鍐荤粨杩欎釜娴佺▼鍚�?",function(){
+                $webUtil.post(that.url.suspendProcess,{processOids:executionid},function(result){
+                    if(result.success){
+                        $webUtil.showMsg("鍐荤粨娴佺▼鎴愬姛");
+                        that.refresh();
+                    }else{
+                        $webUtil.showErrorMsg(result.msg);
+                    }
+                },function(){
+                    // $webUtil.showErrorMsg("杩炴帴鏈嶅姟鍑虹幇浜嗛棶棰�");
+                },that.backPath);
+            });
+
+        };
+        //缁堟
+        this.stop = function(id){
+            var that = this;
+            var executionid = $webUtil.getOidFromGrid("table_" + id,true,false,'executionid');
+            if(!executionid){
+                return;
+            }
+            $webUtil.showConfirmMsg("鎮ㄧ‘瀹氳缁堟杩欎釜娴佺▼鍚�?",function() {
+                $webUtil.post(that.url.endProcess, {processOids: executionid}, function (result) {
+                    if (result.success) {
+                        $webUtil.showMsg("缁堟娴佺▼鎴愬姛");
+                        that.refresh();
+                    } else {
+                        $webUtil.showErrorMsg(result.msg);
+                    }
+                }, function () {
+                    // $webUtil.showErrorMsg("杩炴帴鏈嶅姟鍑虹幇浜嗛棶棰�");
+                }, that.backPath);
+            });
+        };
+        //鎭㈠
+        this.resume = function(id){
+            var that = this;
+            var executionid = $webUtil.getOidFromGrid("table_" + id,true,false,'executionid');
+            if(!executionid){
+                return;
+            }
+            $webUtil.showConfirmMsg("鎮ㄧ‘瀹氳鍐荤粨杩欎釜娴佺▼鍚�?",function() {
+                $webUtil.post(that.url.resumeProcess, {processOids: executionid}, function (result) {
+                    if (result.success) {
+                        $webUtil.showMsg("鎭㈠娴佺▼鎴愬姛");
+                        that.refresh();
+                    } else {
+                        $webUtil.showErrorMsg(result.msg);
+                    }
+                }, function () {
+                }, that.backPath);
+            });
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            var page = that.sourceData.page;
+            var finishTimeTitle = "瀹屾垚鏃堕棿";
+            if('suspended' == page){
+                finishTimeTitle = "鍐荤粨鏃堕棿";
+            }
+            if(that.columns==null || that.columns.length==0){//濡傛灉鍏朵粬鍦版柟鎯充娇鐢ㄨ繖涓粍浠剁殑鏃跺�欙紝鍙互鑷畾涔夊垪
+                if('done' == page){
+                    that.columns = [table.getIndexColumn(),table.getCheckColumn(),{
+                        field:'name',
+                        title:'浠诲姟鍚嶇О',
+                        width:300
+                    },{
+                        field:'createtime',
+                        title:'浠诲姟寮�濮嬫椂闂�',
+                        width:150,
+                        templet:function(d){
+                            return $webUtil.formateDateTimeNoSecond(d.createtime);
+                        }
+                    },{
+                        field:'creator_name',
+                        title:'涓婁竴姝ユ搷浣滀汉',
+                        width:120,
+                        templet:function(d){
+                            return d.creator_name + "(" + d.creator+")";
+                        }
+                    },{
+                        field: 'ts',
+                        title: '浠诲姟瀹屾垚鏃堕棿',
+                        width: 150,
+                        templet: function (d) {
+                            return $webUtil.formateDateTimeNoSecond(d.ts);
+                        }
+                    },{
+                        field: 'executionid',
+                        title: '鎵�灞炴祦绋嬫ā鏉�',
+                        width: 200,
+                        templet: function (d) {
+                            if($webUtil.isNotNull(d.executionid) && d.executionid.indexOf(".") > -1){
+                                return d.executionid.substring(0,d.executionid.indexOf("."));
+                            }else{
+                                return d.executionid;
+                            }
+                        }
+                    },{
+                        field:'secretgrade',
+                        title:'瀵嗙骇',
+                        width:80,
+                        templet:function (d) {
+                            if(d.secretgrade == '10' || d.secretgrade == 10){
+                                return '闈炲瘑';
+                            }else if(d.secretgrade == '20' || d.secretgrade == 20){
+                                return '绉樺瘑';
+                            }else if(d.secretgrade == '30' || d.secretgrade == 30){
+                                return '鏈哄瘑';
+                            }else{
+                                return '';
+                            }
+                        }
+                    },{
+                        field:'description',
+                        title:'娴佺▼鍚姩鏃舵弿杩�',
+                        width:200
+                    }]
+                }else {
+                    that.columns = [table.getIndexColumn(), table.getCheckColumn(), {
+                        field: 'name',
+                        title: '娴佺▼鍚嶇О',
+                        width: 300
+                    }, {
+                        field: 'creator_name',
+                        title: '鍙戣捣浜�',
+                        width: 120,
+                        templet:function(d){
+                            return d.creator_name + "(" + d.creator +")";
+                        }
+                    }, {
+                        field: 'createtime',
+                        title: '鍙戣捣鏃堕棿',
+                        width: 150,
+                        templet: function (d) {
+                            return $webUtil.formateDateTimeNoSecond(d.createtime);
+                        }
+                    }, {
+                        field: 'ts',
+                        title: finishTimeTitle,
+                        width: 150,
+                        hidden: (($webUtil.inArray(['finish', 'suspended'], page)) ? false : true),
+                        templet: function (d) {
+                            return $webUtil.formateDateTimeNoSecond(d.ts);
+                        }
+                    },{
+                        field: 'executionid',
+                        title: '鎵�灞炴祦绋嬫ā鏉�',
+                        width: 200,
+                        templet: function (d) {
+                            if($webUtil.isNotNull(d.executionid) && d.executionid.indexOf(".") > -1){
+                                return d.executionid.substring(0,d.executionid.indexOf("."));
+                            }else{
+                                return d.executionid;
+                            }
+                        }
+                    },{
+                        field:'description',
+                        title:'娴佺▼鍚姩鏃舵弿杩�',
+                        width:200
+                    }]
+                }
+            }
+        };
+        this.showDataTable = function(data){//鑾峰彇鏁版嵁琛ㄦ牸涓殑鐩稿叧瀹氫箟
+            var me = this;
+            var compIdFix =  data.oid;
+            $webUtil.post(me.url.dataDefine,{executionid:data.executionid},function(result){
+                if(result.success){
+                    var businessDataComp = layui['process/vciWebProBusinessData'];//涓氬姟鏁版嵁
+                    var processHistoryComp = layui['process/vciWebProHistory'];//鎿嶄綔鍘嗗彶
+
+                    businessDataComp.businessBtmInProcess = result.obj.UIType;
+                    businessDataComp.businessOidsInProcess = result.obj.businessOids;
+                    businessDataComp.processOid = data.oid;
+                    businessDataComp.tableCode = result.obj.tableCode;
+                    businessDataComp.detailUrl = result.obj.detailUrl;
+                    businessDataComp.UIContentCode = result.obj.UIContentCode;
+                    result.obj.UIContentCode && (businessDataComp.UIContentSelectData = data)
+                    businessDataComp.viewProcessLinkBusinessToken = result.obj.viewProcessLinkBusinessToken;//鐢ㄦ潵鍦ㄦ煡鐪嬫祦绋嬬殑鏁版嵁鏃讹紝鍛婅瘔鍚庡彴璺宠繃鏉冮檺鐨�
+                    businessDataComp.executionidNoInProcess = result.obj.executionidno;
+                    businessDataComp.executionid = data.executionid;
+                    businessDataComp.id = "vciProcessBusinessData_" +me.id+'_'+ compIdFix;
+
+                    $("#data_div_" + me.id ).html(businessDataComp.getContent());
+                    businessDataComp.init();
+
+
+                    processHistoryComp.executionId=data.executionid;
+                    processHistoryComp.id = "vciProcessHistory_" +me.id+'_' + compIdFix;
+                    $("#history_div_" + me.id ).html(processHistoryComp.getContent());
+                    processHistoryComp.init();
+
+                }else{
+                    $webUtil.showErrorMsg(result.msg);
+                }
+            },function(){
+                $webUtil.showErrorMsg("杩炴帴鏈嶅姟鍑虹幇浜嗛棶棰�");
+            },me.backPath,true);
+        };
+        this.showHistoryPic = function(executionId,taskOid){
+            var that = this;
+            var url = "";
+            if(layui.util.isNotNull(executionId)){
+                url = that.backPath + that.url.picture + "?executionId=" + executionId + "&" + TOKEN_KEY + "=" + $webUtil.getToken();
+            }
+            $("img[layer-pid='picture_" + that.id + "']").attr("src",url);
+        };
+        this.destroy = function(){
+            var that = this;
+            that.taskDataConfig = null;
+            that.columns = null;
+            that.historyColumns = null;
+            var vciWebDataGrid = layui.vciWebDataGrid;
+            vciWebDataGrid.destroy("table_" + that.id);
+        };
+        this.showImgFullScreen = function(){//鍏ㄥ睆鏄剧ず鍥剧墖
+            var that = this;
+            var layer = layui.layer;
+            var url = $("img[layer-pid='picture_" + that.id + "']").attr("src");
+            var alt = "娴佺▼鍥�";
+            if(url && url.indexOf("executionId=")>-1){
+                alt = url.substring(url.indexOf("executionId=") + "executionId=".length );
+                if(alt.indexOf(".")>-1){
+                    alt = alt.substring(0,alt.indexOf("."));
+                }
+            }
+            layer.photos({
+                photos:{
+                    title:'鏌ョ湅娴佺▼鍥�',
+                    id:'show_picture_' +that.id,
+                    start:0,
+                    data:[{
+                        alt:alt,
+                        pid:0,
+                        src:url,
+                        thumb:url
+                    }]
+                }
+            });
+        };
+    };
+    var ep = new ExecutPro();
+    exports('process/vciWebProMonitor',ep);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebProProxy.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebProProxy.js
new file mode 100644
index 0000000..a2f6289
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebProProxy.js
@@ -0,0 +1,225 @@
+/**
+ * Created by weidy on 2018/5/22
+ * 娴佺▼浠g悊
+ */
+layui.define(['layer','table','form'],function(exports){
+    var WorkFlowProxy = function(){
+        this.moduleKey = "vciWebProProxy";
+        this.id = "vciWebProProxy_table";
+        this.backPath = configData.compatibility ? path : configData.processServicePath;//榛樿娴佺▼鍜岄」鐩殑璺緞鏄竴鏍风殑
+        this.userBackPath = path;//鐢ㄦ埛鐨勫悗鍙拌矾寰勶紝榛樿鍜岄」鐩矾寰勬槸涓�鏍风殑
+        this.url = {
+            getProxy :'webProcessCommandController/getProxy',
+            startProxy: 'webProcessCommandController/startProxy',
+            endProxy:'webProcessCommandController/endProxy',
+            referUser:'userQueryController/refDataGrid'//queryUserTree'
+        };
+        this.columns = [];
+    };
+    WorkFlowProxy.prototype.getContent = function(){//鑾峰彇鍩虹鐨刪tml
+        var that = this;
+        return  ['<div layui-filter="toolbar_',that.id, '" class="layui-btn-container">',//涓诲垪琛ㄧ殑鎸夐挳
+            '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_startProxy"><i class="layui-icon layui-icon-logo"></i>娣诲姞浠g悊</button>',
+            '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_endProxy"><i class="layui-icon layui-icon-haoyouqingqiu"></i>鍋滄浠g悊</button>',
+            '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh-2"></i>鍒锋柊</button>',
+            '</div>',
+            '<table id="table_', that.id , '" lay-filter="',that.id , '"></table>'].join("");//涓诲垪琛�
+    };
+    WorkFlowProxy.prototype.init = function(){//鍒濆鍖�
+        var that = this;
+        $webUtil.copyConfig(that,that.moduleKey);
+        //鏄剧ず琛ㄦ牸淇℃伅
+        that.checkColumns();
+        var table =layui.table;
+        table.render({
+            elem: "#table_" + that.id,
+            id: that.id,
+            backPath:that.backPath,
+            url:that.url.getProxy,
+            height:150,
+            cols:[that.columns],
+            done:function(res,cur,count){
+                that.proxyCount = count;
+            }
+        });
+        that.bindButtonListener();
+    };
+    WorkFlowProxy.prototype.checkColumns=function(){
+         var that = this;
+         var table = layui.table;
+         if(!that.columns || that.columns.length == 0){
+             that.columns = [table.getIndexColumn(),{
+                 field:'tasksName',
+                 title:'浠g悊浜鸿处鍙�',
+                 width:150
+             },{
+                 field:'userName',
+                 title:'浠g悊浜�',
+                 width:220
+             },{
+                 field:'startTime',
+                 title:'寮�濮嬫棩鏈�',
+                 width:135
+             },{
+                 field:'endTime',
+                 title:'缁撴潫鏃ユ湡',
+                 width:135
+             },{
+                 field:'isTrue',
+                 title:'鍚敤鐘舵��',
+                 width:150,
+                 templet:function(d){
+                     if(d.isTrue == 1){
+                         return "鍚敤";
+                     }else{
+                         return "鍋滅敤";
+                     }
+                 }
+             }]
+         }
+    };
+    WorkFlowProxy.prototype.bindButtonListener=function(){
+        var that =this;
+        $("[layui-filter='toolbar_" + that.id + "_startProxy']").click(function(){
+            if(that.proxyCount>0){
+                $webUtil.showConfirmMsg("宸茬粡璁剧疆杩囦唬鐞嗕汉,鍙兘璁剧疆涓�涓唬鐞嗕汉锛岀户缁搷浣滃皢浼氳鐩栧師鏉ョ殑璁剧疆銆傛槸鍚︾户缁�?",function(){
+                    that.showStartProxy();
+                });
+            }else{
+                that.showStartProxy();
+            }
+        });
+        $("[layui-filter='toolbar_" + that.id + "_refresh']").click(function(){
+           that.refresh();
+        });
+        $("[layui-filter='toolbar_" + that.id + "_endProxy']").click(function(){
+            that.endProxy();
+        });
+    };
+    WorkFlowProxy.prototype.refresh = function(){
+        var that =this;
+        var table = layui.table;
+        table.reload(that.id);
+    };
+    /**
+     * 璁剧疆娴佺▼浠g悊浜虹獥鍙�
+     * 闇�瑕侀�夋嫨涓�涓敤鎴�
+     * 鐒跺悗閫夋嫨寮�濮嬫棩鏈�
+     */
+    WorkFlowProxy.prototype.showStartProxy = function(){
+        var that = this;
+        var formId = "start_process_proxy_form" ;
+        var form = layui.form;
+        var table = layui.table;
+        var startProxyIndex = layer.open({
+            type:1,
+            title:'璁剧疆娴佺▼浠g悊浜�',
+            btn:['纭畾','鍙栨秷'],
+            skin:'layui-layer-lan',
+            content:'<form id="' + formId + '" lay-filter="' + formId + '" class="layui-form" ></form>',
+            area:[620 +'px', 300 + 'px'],
+            closeBtn:2,
+            shade:true,
+            shadeClose:true,
+            resize:true,
+            resizing:function(layero){
+                form.doResize();
+            },
+            yes:function(index,layero){
+                if(form.validata(formId)){
+                    //鏍¢獙閫氳繃
+                    var values = form.getValues(formId);
+                    delete values.name;
+                    $webUtil.post(that.url.startProxy,values,function(result){
+                        if(result.success){
+                            $webUtil.showMsg("璁剧疆娴佺▼浠g悊浜烘垚鍔�");
+                            layer.close(startProxyIndex);
+                            that.refresh();
+                        }else{
+                            $webUtil.showErrorMsg(result.msg);
+                        }
+                    },function(result){},that.backPath);
+                }
+            },
+            btn2:function(index,layero){
+                layer.close(startProxyIndex);
+                that.refresh();
+            },
+            cancel:function(index,layero){
+                that.refresh();
+            },
+            success:function(layero) {
+                var formItems = [{
+                    type: 'refer',
+                    name: 'userId',
+                    text: '娴佺▼浠g悊浜�',
+                    required: true,
+                    labelWidth: 120,
+                    textWidth: 400,
+                    showField:'userName',
+                    referConfig:{
+                        type:'refer/SmUserRefer',
+                        valueField:'id'
+                    }
+                }, {
+                    type: 'date',
+                    name: 'startTime',
+                    text: '寮�濮嬫椂闂�',
+                    textWidth: 400,
+                    required:true,
+                    labelWidth: 120,
+                    value:$webUtil.getSystemVar($webUtil.systemValueKey.currentDate),
+                    min:$webUtil.getSystemVar($webUtil.systemValueKey.currentDate)
+                },{
+                    type:'date',
+                    name:'endTime',
+                    text:'缁撴潫鏃堕棿',
+                    textWidth:400,
+                    required:true,
+                    labelWidth:120,
+                    min:$webUtil.getSystemVar($webUtil.systemValueKey.currentDate)
+                }];
+                form.addItems(formId,formItems,function() {
+                    //form.setValues({
+                    //startTime: $webUtil.getSystemVar($webUtil.systemValueKey.currentDate)
+                    //});
+                    form.on('select(' + formId + ')', function (data) {
+                        if (data.name == 'startTime') {
+                            var values = form.getValues(formId);
+                            if (values.endTime <= data.value) {
+                                form.setValues({endTime: ''}, formId);
+                            }
+                        } else if (data.name == 'endTime') {
+                            var values = form.getValues(formId);
+                            if (values.startTime >= data.value) {
+                                form.setValues({startTime: ''}, formId);
+                            }
+                        }
+                    })
+                },{},{
+                    defaultColumnOneRow:1,
+                    inDialog:true
+                });
+            }
+        });
+    };
+    /**
+     * 鍋滄浠g悊锛屼細灏嗚缃殑浠g悊鐨勪俊鎭洿鎺ュ垹闄�
+     */
+    WorkFlowProxy.prototype.endProxy =function(){
+        var that =this;
+        $webUtil.showConfirmMsg("鏄惁鍋滄浠g悊娴佺▼",function(){
+            $webUtil.post(that.url.endProxy,{},function(result){
+                if(result.success){
+                    $webUtil.showMsg("鍋滄浠g悊娴佺▼鎴愬姛");
+                    that.refresh();
+                }else{
+                    $webUtil.showErrorMsg(result.msg);
+                }
+            },function(result){},that.backPath);
+        });
+    };
+
+    var sp = new WorkFlowProxy();
+    exports("process/vciWebProProxy",sp);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebProUndoTab.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebProUndoTab.js
new file mode 100644
index 0000000..766141b
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebProUndoTab.js
@@ -0,0 +1,307 @@
+/**
+ * Created by weidy on 2018/5/4.
+ * 娴佺▼鐨勫緟鍔炰换鍔¢〉闈�
+ */
+layui.define(['layer','element','form','table','vciWebDataGrid','flow','process/vciWebProExecuteTask','vciWebFileManager'],function(exports){
+    /**
+     * 涓诲尯鍩熶负寰呭姙浠诲姟鐨勫垪琛�
+     * 涓嬫柟鐨勫尯鍩熷垎涓轰笁涓�夐」鍗°�愬叧鑱旀暟鎹�戙�愭祦绋嬪巻鍙层�戙�愭祦绋嬪浘銆�
+     * 涓诲尯鍩熺殑寰呭姙浠诲姟鍒楄〃鐨勫悗鍙拌矾寰勪笌涓婚〉涓殑鎸備欢涓�鑷�
+     * 鐐瑰嚮鎵ц鎸夐挳锛屼笌涓婚〉涓寕浠剁殑鎵ц鎸夐挳涓�鏍�
+     * 涓婚〉涓殑鏌ョ湅鏁版嵁鐨勫悗鍙拌矾寰勪笌姝ら〉闈㈢殑銆愬叧鑱旀暟鎹�戜腑涓�鑷�
+     *
+     * @constructor
+     */
+    var ProTask = function(){
+        this.moduleKey = "vciWebProUndoTab";
+        this.id='vciWebProUndoTab';
+        this.sourceData={};
+        this.columns = [];
+        this.backPath = configData.compatibility ? path : configData.processServicePath;//榛樿娴佺▼鍜岄」鐩殑璺緞鏄竴鏍风殑
+        this.url={
+            task:'processDefineController/getMyUndoTask',
+            dataDefine:'processDefineController/getDataDefine',//浠庡悗鍙拌幏鍙栨樉绀哄叧鑱旀暟鎹殑鍒楄〃鐨刢ode
+            data:'processDefineController/getDataByTask',
+            history:'processDefineController/getHistory',
+            picture:'processDefineController/getProcessPic',
+            dataGridDetail:'webTrailorderplanController/getOrderItemByOidUnAccept'//trailorderplan鑾峰彇璇︾粏
+        };
+        this.defaults = {
+            dataShowByOid:true,//鏄惁鏍规嵁浠诲姟鐨勪笉鍚屾潵鏄剧ず涓嶅悓鐨勬暟鎹垪琛�--濡傛灉娴佺▼涓病鏈夋坊鍔燿ataDisplayTable鍙橀噺璇疯缃负false
+            dataTableBtmType:"input",//鍏宠仈鏁版嵁鐨勮〃鏍煎湪鐨勪笟鍔$被鍨嬶紝鐢ㄤ簬鏌ヨ骞冲彴涓殑鍒楄〃
+            dataTableCode:"ShowMyTaskLinkDataList"//鍏宠仈鏁版嵁鐨勮〃鏍间唬鍙�
+        };
+        this.limit={
+            task:10,
+            data:5,
+            history:5
+        };
+        this.getContent=function(){//杩斿洖杩欎釜缁勪欢鐨勫熀纭�html
+            var me = this;
+            var html = [ '<div class="layui-layout-border">',
+                '<div layui-filter="toolbar_',me.id, '" class="layui-btn-container">',//涓诲垪琛ㄧ殑鎸夐挳
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',me.id,'_execute"><i class="layui-icon layui-icon-logo"></i>鎵ц</button>',
+                    //'<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',me.id,'_setAssign"><i class="layui-icon layui-icon-chart"></i>杞淳</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',me.id,'_refresh"><i class="layui-icon layui-icon-refresh-2"></i>鍒锋柊</button>',
+                '</div>',
+                '<div class="layui-center" style="max-height:400px">',
+                    '<table id="table_', me.id , '" lay-filter="',me.id , '"></table>',//涓诲垪琛�
+                '</div>',
+                '<div class="layui-south" style="min-height:100px;padding:0 5px">',
+                    '<div layui-filter="south_toolbar_',me.id, '" class="layui-btn-container">',//涓诲垪琛ㄧ殑鎸夐挳
+
+                    '</div>',
+                    '<div class="layui-tab">' ,//搴曢儴閫夐」鍗�
+                        '<ul class="layui-tab-title">',
+                             '<li class="layui-this">鍏宠仈鏁版嵁</li>',
+                             '<li>瀹℃壒鍘嗗彶</li>',
+                             '<li>娴佺▼鍥�</li>',
+                        '</ul>',
+                        '<div class="layui-tab-content">',
+                            '<div class="layui-tab-item layui-show">',  //榛樿鏄剧ず鍏宠仈鏁版嵁
+                                '<div id="data_div_' , me.id , '"  layui-filter="data_div_',me.id,'" ></div>',
+                            '</div>',
+                            '<div class="layui-tab-item" style="width:100%"><div id="history_div_' , me.id , '" lay-filter="history_div_' , me.id , '" ></div></div>' ,
+                            '<div class="layui-tab-item" id="picture_parent_',me.id,'" style="overflow-y:auto;"><span>鐐瑰嚮鍥剧墖鍙互鏀惧ぇ鏌ョ湅</span><img layer-pid="picture_' , me.id , '" lay-filter="picture_' , me.id , '" src=""  alt="娴佺▼鍥�" style="width:1000px;display:block" /></div>',
+                        '</div>',
+                    '</div>',
+                '</div>',
+              '</div>'
+            ].join("");
+            return html;
+        };
+        this.init=function(){//鍩虹鐨刪tml琚坊鍔犲悗锛屽啀鎵ц鍒濆鍖�
+            var me = this;
+            $webUtil.copyConfig(me,me.moduleKey);
+            var table = layui.table;
+            me.checkColumns();//涓诲垪琛ㄤ腑鍒椼��
+            me.historyColumns = null;
+            table.render({
+                elem:'#table_' + me.id,
+                id:'table_' + me.id,
+                url:me.backPath + me.url.task,
+                page:{
+                    limit:me.limit.task,
+                    page:1
+                },
+                height:400,
+                cols:[me.columns],
+                done:function(res,cur,count){
+                    table.selectRecord('table_' + me.id,[{index:0}]);
+                },
+                rowClick:function(thisTableFilter,record){
+                    me.showDataTable(record);
+                    me.showHistoryPic(record.oid);
+                }
+            });
+            var searchFieldObject = {
+                name: "浠诲姟鍚嶇О",
+                executionid:"鎵�灞炴祦绋嬫ā鏉�",
+                description:"娴佺▼鍚姩鏃舵弿杩�"
+            };
+            $webUtil.createSearchHtml(searchFieldObject, $('[layui-filter="toolbar_' + me.id + '"]'), 'table_' +me.id);
+            me.bindListeners();
+        };
+        this.bindListeners = function(){
+            var that = this;
+            $("img[layer-pid='picture_" + that.id + "']").click(function(){
+                that.showImgFullScreen();
+            });
+            $("[layui-filter='toolbar_" + that.id + "_execute']").click(function(){
+                var table = layui.table;
+                var checkData = table.checkStatus('table_' + that.id);
+                if(checkData && checkData.data && checkData.data.length>0){
+                    var executeTask = layui['process/vciWebProExecuteTask'];
+                    executeTask.init();
+                    var taskInfo = [];
+                    layui.each(checkData.data,function(_index,_item){
+                        var task = _item;
+                        task.taskOid = _item.oid;
+                        task.taskName = _item.name;
+                        task.executionId=_item.executionid
+                        task.creator=_item.creator
+                        taskInfo.push(task);
+                    });
+                    executeTask.showExecuteWindow(taskInfo,{
+                        fullScreen:true
+                    },function(finish){
+                        if(finish){
+                            table.reload('table_' + that.id);
+                        }
+                    });
+                }else{
+                    $webUtil.showErrorMsg("娌℃湁閫夋嫨娴佺▼浠诲姟");
+                }
+            });
+            $("[layui-filter='toolbar_" + that.id + "_setAssign']").click(function(){
+                var table = layui.table;
+                var checkData = table.checkStatus('table_' + that.id);
+                if(checkData && checkData.data && checkData.data.length>0){
+                    if(checkData.data.length>1){
+                        $webUtil.showErrorMsg("姣忎竴娆″彧鑳戒负涓�涓换鍔¤浆绉昏礋璐d汉");
+                        return false;
+                    }else{
+                        var data = checkData.data[0];
+                        //鏄剧ず璐熻矗浜�
+                        layui.use('process/vciWebProcessAssign',function(){
+                            var processAssign = layui['process/vciWebProcessAssign'];
+                            var options={};
+                            options.taskOid = data.oid;
+                            options.id = data.oid;
+                            options.processTaskTitle = data.name;
+                            processAssign.okCallback =function(){
+                                layui.table.reload('table_' + that.id);
+                            };
+                            processAssign.init(options.id,options);
+                        });
+                    }
+                }
+            });
+            $("[layui-filter='toolbar_" + that.id + "_refresh']").click(function(){
+               that.refresh();
+            });
+        };
+        this.refresh = function(){
+            var that = this;
+            var table = layui.table;
+            table.reload("table_" + that.id,{});
+        };
+        this.refreshAll = function() {
+            var that = this;
+            that.refresh();
+        };
+
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){//濡傛灉鍏朵粬鍦版柟鎯充娇鐢ㄨ繖涓粍浠剁殑鏃跺�欙紝鍙互鑷畾涔夊垪
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),{
+                    field:'name',
+                    title:'浠诲姟鍚嶇О',
+                    width:300
+                },{
+                    field:'createtime',
+                    title:'涓婁竴姝ュ鐞嗘椂闂�',
+                    width:150,
+                    templet:function(d){
+                        return $webUtil.formateDateTimeNoSecond(d.createtime);
+                    }
+                },{
+                    field:'description',
+                    title:'娴佺▼鍚姩鏃舵弿杩�',
+                    width:200
+                },{
+                    field:'creator_name',
+                    title:'涓婁竴姝ユ搷浣滀汉',
+                    width:120
+                },{
+                    field: 'executionid',
+                    title: '鎵�灞炴祦绋嬫ā鏉�',
+                    width: 200,
+                    templet: function (d) {
+                        if($webUtil.isNotNull(d.executionid) && d.executionid.indexOf(".") > -1){
+                            return d.executionid.substring(0,d.executionid.indexOf("."));
+                        }else{
+                            return d.executionid;
+                        }
+                    }
+                },{
+                    field:'secretgrade',
+                    title:'瀵嗙骇',
+                    width:80,
+                    templet:function (d) {
+                        if(d.secretgrade == '10' || d.secretgrade == 10){
+                            return '闈炲瘑';
+                        }else if(d.secretgrade == '20' || d.secretgrade == 20){
+                            return '绉樺瘑';
+                        }else if(d.secretgrade == '30' || d.secretgrade == 30){
+                            return '鏈哄瘑';
+                        }else{
+                            return '';
+                        }
+                    }
+                }];
+            }
+        };
+        //鍏宠仈鏁版嵁
+        this.showDataTable = function(data){//鑾峰彇鏁版嵁琛ㄦ牸涓殑鐩稿叧瀹氫箟
+             var me = this;
+            var compIdFix =  data.oid;
+            $webUtil.post(me.url.dataDefine,{executionid:data.executionid},function(result){
+                if(result.success){
+                    var businessDataComp = layui['process/vciWebProBusinessData'];//涓氬姟鏁版嵁
+                    var processHistoryComp = layui['process/vciWebProHistory'];//鎿嶄綔鍘嗗彶
+
+                    businessDataComp.businessBtmInProcess = result.obj.UIType;
+                    businessDataComp.businessOidsInProcess = result.obj.businessOids;
+                    businessDataComp.taskOidInProcess = data.oid;
+                    businessDataComp.tableCode = result.obj.tableCode;
+                    businessDataComp.detailUrl = result.obj.detailUrl;
+                    businessDataComp.UIContentCode = result.obj.UIContentCode;
+                    result.obj.UIContentCode && (businessDataComp.UIContentSelectData = data)
+                    businessDataComp.viewProcessLinkBusinessToken = result.obj.viewProcessLinkBusinessToken;//鐢ㄦ潵鍦ㄦ煡鐪嬫祦绋嬬殑鏁版嵁鏃讹紝鍛婅瘔鍚庡彴璺宠繃鏉冮檺鐨�
+                    businessDataComp.executionidNoInProcess = result.obj.executionidno;
+                    businessDataComp.executionid = data.executionid;
+                    businessDataComp.id = "vciProcessBusinessData_" +me.id+'_'+ compIdFix;
+
+                    $("#data_div_" + me.id ).html(businessDataComp.getContent());
+                    businessDataComp.init();
+
+
+                    processHistoryComp.taskOidInProcess = data.oid;
+                    processHistoryComp.executionId=data.executionid;
+                    processHistoryComp.id = "vciProcessHistory_" +me.id+'_' + compIdFix;
+                    $("#history_div_" + me.id ).html(processHistoryComp.getContent());
+                    processHistoryComp.init();
+
+                }else{
+                    $webUtil.showErrorMsg(result.msg);
+                }
+            },function(){
+                $webUtil.showErrorMsg("杩炴帴鏈嶅姟鍑虹幇浜嗛棶棰�");
+            },me.backPath,true);
+        };
+        this.showHistoryPic = function(taskOid){
+            var that = this;
+            var url = "";
+            if(layui.util.isNotNull(taskOid)){
+                url = that.backPath + that.url.picture + "?taskOid=" + taskOid + "&" + TOKEN_KEY + "=" + $webUtil.getToken();
+            }
+            $("img[layer-pid='picture_" + that.id + "']").attr("src",url);
+        };
+        this.destroy = function(){
+            var that = this;
+            that.columns = null;
+            var vciWebDataGrid = layui.vciWebDataGrid;
+            vciWebDataGrid.destroy("table_" + that.id);
+        };
+        this.showImgFullScreen = function(){//鍏ㄥ睆鏄剧ず鍥剧墖
+            var that = this;
+            var layer = layui.layer;
+            var url = $("img[layer-pid='picture_" + that.id + "']").attr("src");
+            var alt = "娴佺▼鍥�";
+            if(url && url.indexOf("executionId=")>-1){
+                alt = url.substring(url.indexOf("executionId=") + "executionId=".length );
+                if(alt.indexOf(".")>-1){
+                    alt = alt.substring(0,alt.indexOf("."));
+                }
+            }
+            layer.photos({
+                photos:{
+                    title:'鏌ョ湅娴佺▼鍥�',
+                    id:'show_picture_' +that.id,
+                    width:'100%',
+                    start:0,
+                    data:[{
+                        alt:alt,
+                        pid:0,
+                        src:url,
+                        thumb:url
+                    }]
+                }
+            });
+        };
+    };
+    var pt = new ProTask();
+    exports('process/vciWebProUndoTab',pt);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebProcessAssign.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebProcessAssign.js
new file mode 100644
index 0000000..8dcc32c
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebProcessAssign.js
@@ -0,0 +1,338 @@
+/**
+娴佺▼涓浆绉昏礋璐d汉
+**/
+layui.define(['layer','table','form','tree','element'],function(exports){
+	var Assign = function(){
+		this.MODULENAME = "flowable/vciFlowableAssign";
+		this.id = "vciFlowableAssign";
+		this.moduleKey = "vciFlowableAssign";
+		this.backPath = configData.compatibility ? path : configData.processServicePath ;
+		this.taskOid = "";//浠诲姟鐨勪富閿�
+		this.processTaskTitle = "";//浠诲姟鐨勬爣棰�
+		this.config = {};
+		this.url = {
+			treeDept:'departmentQueryController/refTree',
+			dataGridMyDept:'userQueryController/refDataGridByCurrentDepartment',
+			dataGridAllUser:'userQueryController/refDataGrid',//鍏ㄩ儴鐨勭敤鎴�
+			dataGridThisTaskInTemplate:'workflowDefineController/listProcessUserByTask',//娴佺▼妯℃澘涓畾涔夌殑鍊欓�変汉
+			dataGridSystemVar:'',//绯荤粺鍙橀噺涓殑鐢ㄦ埛
+			setAssign:'workflowCommandController/transferPrincipal'//杞淳
+		};
+	};
+	Assign.prototype.getContent = function(){
+		//鍏煎鐨勬柟娉曪紝瀹為檯鏃犲唴瀹�
+		return "";
+	};
+	Assign.prototype.init = function(id,options){
+		//鍒濆鍖�
+		var that = this;
+	    $webUtil.copyConfig(that,that.moduleKey);
+	    that.config[id] = options;
+	    if($webUtil.isNull(options.taskOid)){
+	    	$webUtil.showErrorMsg("娌℃湁娴佺▼寰呭姙浠诲姟鐨勪富閿�");
+	    	return false;
+	    }
+	    if($webUtil.isNull(options.processTaskTitle)){
+	    	$webUtil.showErrorMsg("娌℃湁娴佺▼寰呭姙浠诲姟鐨勫悕绉�");
+	    	return false;
+	    }
+        var tabId = "tab_user_for_task_" + id;
+		options.tabId = tabId;
+        var table = layui.table;
+        var tree = layui.tree;
+        var startAssign = layer.open({
+            type:1,
+            title:'涓恒��' + options.processTaskTitle + '銆戜换鍔¤缃鐞嗕汉',
+            btn:['纭畾','鍙栨秷'],
+            //skin:'layui-layer-lan',
+            content:'<div lay-filter="' + tabId + '" class="layui-tab layui-tab-card" lay-allowClose="false">'+
+            			'<ul class="layui-tab-title" lay-allowClose="false">' +
+            				'<li lay-id="samedept_' + tabId + '" lay-unallowclose="true" class="layui-this">鍚岄儴闂ㄧ敤鎴�</li>' +
+            				'<li lay-id="alluser_' + tabId + '" lay-unallowclose="true" >鎵�鏈夌殑鐢ㄦ埛</li>' +
+            				'<li lay-id="intemplate_' + tabId + '" lay-unallowclose="true" >鏈换鍔$殑娴佺▼妯℃澘涓畾涔夌殑鍊欓�変汉 </li>' +
+//            				'<li lay-id="systemvar_' + tabId + '" lay-unallowclose="true">绯荤粺鍙橀噺</li>' +
+            			'</ul>' +
+            			'<div class="layui-tab-content">' + 
+	            			'<div class="layui-tab-item layui-show">' +
+	    						'<div layui-filter="samedept_toolbar_' + tabId + '" class="layui-btn-container"></div>' + 
+	    						'<table id="samedept_table_' + tabId + '" lay-filter="alluser_table_' + tabId + '"></table>'+
+	    					'</div>' + 
+            				'<div class="layui-tab-item">' +
+	            				'<div class="layui-vci-tree" style="width:250px;border-right:1px solid #ff;float: left;background-color:#ffffff;overflow-y: auto;">' +
+	    							'<label class="layui-icon layui-icon-tree" style="line-height: 20px;color:red;font-size:20px;">閮ㄩ棬</label>' +
+	    							'<ul layui-filter="alluser_tree_' + tabId + '"><ul>' + 
+	    						'</div>' +
+	    						'<div style="display:block;margin-top:0px;margin-left:255px;">' + 
+            						'<div layui-filter="alluser_toolbar_' + tabId + '" class="layui-btn-container"></div>' + 
+            						'<table id="alluser_table_' + tabId + '" lay-filter="alluser_table_' + tabId + '"></table>'+
+            					'</div>' + 
+            				'</div>' +
+            				'<div class="layui-tab-item">' + 
+            	                 '<ul layui-filter="intemplate_' + tabId + '"><ul>'+
+            				'</div>' +
+            				//鐩墠鏆傛椂涓嶆坊鍔犵郴缁熷彉閲忥紝鍚庣画骞冲彴瀹屽杽鍚庯紝搴旇鍔犱笂鍚屽矖浣嶏紝鍚岃亴鍔★紝鍚岃亴绾э紝鐩村睘棰嗗锛屾垜鐨勪笅灞炶繖浜涚郴缁熷彉閲�
+//            				'<div class="layui-tab-item">' +
+//            					'<div class="layui-vci-tree" style="width:200px;border-right:1px solid #ff;float: left;background-color:#ffffff;overflow-y: auto;">' +
+//            						'<label class="layui-icon layui-icon-tree" style="line-height: 20px;color:red;font-size:20px;">绯荤粺鍙橀噺</label>' +
+//            						'<ul layui-filter="systemvar_tree_' + tabId + '"><ul>' + 
+//            					'</div>' +
+//            					'<div style="display:block;margin-top:0px;margin-left:205px;">' + 
+//            						'<div layui-filter="systemvar_toolbar_' + tabId + '" class="layui-btn-container"></div>' +
+//            						'<table id="systemvar_table_' + tabId + '" lay-filter="systemvar_table_' + tabId + '"></table>' + 
+//            					'</div>' + 
+//            				'</div>' +
+            			'</div>' +
+            		'</div>',
+            area:[$webUtil.getDialogScreenWidth({width:900}) + 'px',$webUtil.getDialogScreenHeight({fullScreen:true}) + 'px'],
+            closeBtn:1,
+            shade:true,
+            shadeClose:true,
+            yes:function(index,layero){
+                var userId = that.getSelectUser(id);
+                if(!userId){
+                	return false;
+                }
+                $webUtil.post(that.url.setAssign,{taskOid:options.taskOid,userId:userId},function(result){
+                	if(result.success){
+                		$webUtil.showMsgFromResult(result,"杞淳鎴愬姛");
+                		 layer.close(startAssign);
+                		 if(that.okCallback){
+                			 that.okCallback();
+                		 }
+                	}else{
+                		$webUtil.showErrorMsg(result.msg);
+                	}
+                },function(xhr,err){
+                	$webUtil.showErrorMsg("璁剧疆杞Щ璐熻矗浜哄嚭鐜颁簡閿欒,鎮ㄥ彲浠ョ◢鍚庡啀璇�");
+                },that.backPath);
+            },
+            cancel:function(index,layero){
+            	 layer.close(startAssign);
+            },
+            success:function(layero) {
+            	//1.鍒濆鍖栭�夐」鍗�
+            	//鍚岄儴闂ㄧ殑鐢ㄦ埛
+            	that.initSameDeptUser(id);
+            	//鍏ㄩ儴鐢ㄦ埛
+            	that.initAllUser(id);
+            	//妯℃澘涓畾涔夌殑鍊欓�変汉
+            	that.initTemplatUser(id);
+            	//绯荤粺鍙橀噺鐨勬殏鏃朵笉璋冪敤
+            	
+            	//鐩戞帶閫夐」鍗$偣鍑伙紝榛樿灏辨槸绗竴涓�夐」鍗�
+				options.selectTabIndex = 0;
+            	layui.element.on('tab(' + options.tabId + ')', function(data){
+					options.selectTabIndex = data.index;
+            	});
+            }
+        });
+	};
+	Assign.prototype.initSameDeptUser = function(id){
+		var that = this;
+		var options = that.config[id];
+		//鐩稿悓閮ㄩ棬鐨勭敤鎴�
+        var table = layui.table;
+		table.render({
+            elem:'#samedept_table_' + options.tabId,
+            id:'samedept_table_' + options.tabId,
+            url:configData.frameworkPath + that.url.dataGridMyDept,
+            page:{
+                limit:30,
+                page:1
+            },
+            cols:[that.getUserColumns()]
+    	});
+    	$webUtil.createSearchHtml({
+    		name:'濮撳悕',
+    		id:'鐢ㄦ埛璐﹀彿锛堢敤鎴峰悕锛�'
+    	},$('[layui-filter="samedept_toolbar_' + options.tabId + '"]'),'samedept_table_' + options.tabId);
+	};
+	Assign.prototype.initAllUser = function(id){
+		var that = this;
+		var options = that.config[id];
+        var table = layui.table;
+        var tree = layui.tree;
+		//鍒濆鍖栧叏閮ㄧ敤鎴风殑鍒楄〃锛屼娇鐢ㄩ儴闂ㄥ睍绀�
+		var deptTreeUI = $('[layui-filter="alluser_tree_' +  options.tabId + '"]');
+        tree.init("alluser_tree_" + options.tabId , deptTreeUI,{
+        	showSearch:true,
+        	url:that.url.treeDept,
+			backPath:configData.frameworkPath,
+        	extraParams: {
+        		showAllDept:true
+            },
+            click: function (item, elem, options) {
+                that.showUsersForDept(id,item.oid);
+            }
+        });
+        //鍒楄〃骞惰鍒濆鍖栵紝鏄洜涓虹涓�涓妭鐐归粯璁ょ殑灏辨槸鍏ㄩ儴鐢ㄦ埛
+    	table.render({
+            elem:'#alluser_table_' + options.tabId,
+            id:'alluser_table_' + options.tabId,
+            url:configData.frameworkPath + that.url.dataGridAllUser,
+            page:{
+                limit:30,
+                page:1
+            },
+            cols:[that.getUserColumns()]
+    	});
+    	$webUtil.createSearchHtml({
+    		name:'濮撳悕',
+    		id:'鐢ㄦ埛璐﹀彿锛堢敤鎴峰悕锛�'
+    	},$('[layui-filter="alluser_toolbar_' + options.tabId + '"]'),'alluser_table_' + options.tabId);
+	};
+	Assign.prototype.showUsersForDept = function(id,deptOid){
+		//鏍规嵁閮ㄩ棬鏄剧ず鐢ㄦ埛
+		var that = this;
+		var table = layui.table;
+		if(deptOid == "#ALLDEPT#"){
+			deptOid  = "";
+		}
+		var options = that.config[id];
+		table.reload('alluser_table_' + options.tabId ,{
+			where:{
+				"conditionMap['pkDepartment']":deptOid
+			}
+		});
+	};
+	Assign.prototype.initTemplatUser = function(id){
+		var that = this;
+		var options = that.config[id];
+        var tree = layui.tree;
+		//鍒濆鍖栨祦绋嬫ā鏉夸腑瀹氫箟鐨勭敤鎴�
+		$webUtil.get(that.url.dataGridThisTaskInTemplate,{taskOid:options.taskOid},function(result){
+    		if(result.success){
+				var thisNodeUsers = result.obj.departments;
+				if(thisNodeUsers){
+					layui.each(thisNodeUsers,function(_userIndex,_userItem){
+						if(_userItem.type == "role"){
+							_userItem.name = _userItem.name + "(瑙掕壊)";
+						} else if(_userItem.type == "dept"){
+							_userItem.name = _userItem.name + "(閮ㄩ棬)";
+						}
+						if(_userItem.secret && _userItem.secret*1>0 && _userItem.secretText){
+							_userItem.name += "[" + _userItem.secretText + "]";
+						}
+						if(!$webUtil.isNull(_userItem.id)){
+							_userItem.name = _userItem.id+' '+_userItem.name;
+						}
+						if(_userItem.children && _userItem.children.length > 0){
+							layui.each(_userItem.children,function(_childrenUserIndex,_childrenUserItem){
+								if(_childrenUserItem.secret && _childrenUserItem.secret*1>0 && _childrenUserItem.secretText){
+									_childrenUserItem.name += "[" + _childrenUserItem.secretText + "]";
+								}
+								if(!$webUtil.isNull(_childrenUserItem.id)){
+									_childrenUserItem.name = _childrenUserItem.id+' '+_childrenUserItem.name;
+								}
+							});
+						}
+					});
+				}
+    			 var treeUL = $('[layui-filter="intemplate_' +options.tabId + '"]');
+                 tree.init("tree_" + that.tabId, treeUL, {
+                     nodes:thisNodeUsers,
+                     showSearch:true,
+                     onlyLeaf:false,//鍙兘閫夋嫨鍙跺瓙鑺傜偣
+                     onlyLeafText:'璇烽�夋嫨鐢ㄦ埛,涓嶈閫夋嫨瑙掕壊鍜岄儴闂紙鏍戜笂鐨勫彾瀛愯妭鐐规墠鏄敤鎴风被鍨�)',
+                     click: function (item, elem, options) {
+						 that.config[id].selectTreeItem = item;
+                     }
+                 });
+    		}else{
+    			 $('[layui-filter="intemplate_' +options.tabId + '"]').html("鑾峰彇娴佺▼妯℃澘涓缃殑鍊欓�変汉鍑洪敊锛屼絾鏄偍浠嶇劧鍙互浣跨敤鍏朵粬鏂瑰紡閫夋嫨鐢ㄦ埛");
+    		}
+    	},function(xhr,error){
+    		 $('[layui-filter="intemplate_' +options.tabId + '"]').html("鑾峰彇娴佺▼妯℃澘涓缃殑鍊欓�変汉鍑洪敊锛屼絾鏄偍浠嶇劧鍙互浣跨敤鍏朵粬鏂瑰紡閫夋嫨鐢ㄦ埛");
+    	},that.backPath,false);
+	};
+	Assign.prototype.initSystemVarUser = function(){
+		var that = this;
+        var table = layui.table;
+        var tree = layui.tree;
+		 //绯荤粺鍙橀噺--杩樻湭瀹屾垚
+        var systemTreeUI = $('[layui-filter="systemvar_tree_' + that.tabId + '"]');
+        tree.init("systemvar_tree_" + that.tabId, systemTreeUI, {
+            nodes:[{
+            	oid:'CURRENT',
+            	text:'鐩稿悓閮ㄩ棬涓嬬殑鐢ㄦ埛',
+            	leaf:true
+            },{
+            	oid:'CURREN',
+            	text:'鐩稿悓瑙掕壊涓嬬殑鐢ㄦ埛',
+            	leaf:true
+            },{
+            	oid:'CURREeNT',
+            	text:'鎴戠殑涓荤棰嗗',
+            	leaf:true
+            }],
+            click: function (item, elem, options) {
+                that.showUsersForSystem(item.id);
+            }
+        });
+        table.render({
+            elem:'#systemvar_table_' + that.tabId,
+            id:'systemvar_table_' + that.tabId,
+            url:that.backPath + that.url.dataGridSystemVar,
+            page:{
+                limit:30,
+                page:1
+            },
+            cols:[that.getUserColumns()]
+    	});
+        $webUtil.createSearchHtml({
+    		name:'濮撳悕',
+    		id:'鐢ㄦ埛璐﹀彿锛堢敤鎴峰悕锛�'
+    	},$('[layui-filter="systemvar_toolbar_' + that.tabId + '"]'),'systemvar_table_' + that.tabId);
+	};
+	Assign.prototype.getUserColumns = function(){
+		//鐢ㄦ埛鐨勫睍绀哄垪琛�
+		var table = layui.table;
+		return [table.getIndexColumn(),table.getCheckColumn(),{
+			field:'id',
+			title:'鐢ㄦ埛璐﹀彿锛堢敤鎴峰悕锛�',
+			sort:true,
+			width:170
+		},{
+			field:'name',
+			title:'濮撳悕',
+			sort: true,
+			width:150
+		},{
+			field:'secretGradeText',
+			title:'瀵嗙骇',
+			width:100,
+			hidden:!configData.controllerSecret
+		}];
+	};
+	Assign.prototype.getSelectUser = function(id){
+		var that = this;
+		var options = that.config[id];
+		if(options.selectTabIndex == 0){
+			//璇存槑鏄涓�涓�
+			var userId = $webUtil.getOidFromGrid("samedept_table_" + options.tabId,true,true,'id');
+	        if(!userId){
+	            return false;
+	        }
+	        return userId;
+		}else if(options.selectTabIndex == 1){
+			var userId = $webUtil.getOidFromGrid("alluser_table_" + options.tabId,true,true,'id');
+	        if(!userId){
+	            return false;
+	        }
+	        return userId;
+		}else{
+			if(!options.selectTreeItem){
+				//閫夋嫨鏍戠殑鑺傜偣
+				$webUtil.showErrorMsg("娌℃湁閫夋嫨鐢ㄦ埛");
+				return false;
+			}
+			if(!options.selectTreeItem.leaf && options.selectTreeItem.children && options.selectTreeItem.children.length>0){
+				$webUtil.showErrorMsg("鍦ㄣ�愭湰浠诲姟鐨勬祦绋嬫ā鏉夸腑瀹氫箟鐨勫�欓�変汉銆戦�夐」鍗′腑鍙兘閫夋嫨鐢ㄦ埛");
+				return false;
+			}
+			return options.selectTreeItem.id;
+		}
+	};
+	var sp = new Assign();
+	exports(sp.MODULENAME,sp);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebStartProcess.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebStartProcess.js
new file mode 100644
index 0000000..93ca064
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebStartProcess.js
@@ -0,0 +1,885 @@
+/**
+ * Created by weidy on 2018/5/18
+ * 鍙戣捣娴佺▼
+ */
+layui.define(['layer','form','vciWebComboxStore'],function(exports){
+    var StartProcess = function(){
+        this.moduleKey = "vciWebStartProcess";
+        this.backPath = configData.compatibility ? path : configData.processServicePath ;//榛樿娴佺▼鍜岄」鐩殑璺緞鏄竴鏍风殑
+        this.url = {
+            getTemplate :'processDefineController/getTemplateByType',
+            getFavData:'wFWorkflowNodeFavController/listNodeFavByWorkflowTemplate',//鏀惰棌鏂规鍒楄〃
+            addFav:'wFWorkflowNodeFavController/addSave',//鏀惰棌
+            editFav:'wFWorkflowNodeFavController/editSave',//缂栬緫鏀惰棌鏂规
+            delFav:'wFWorkflowNodeFavController/deleteData',//鍒犻櫎鏀惰棌
+            getFavByOid:'wFWorkflowNodeFavController/listNodeFavItemVOBySchema',//鏍规嵁鏂规鐨勪富閿幏鍙栨槑缁�
+            getNode: 'processDefineController/getAllProcessNode',
+            startProcess:'webProcessCommandController/startProcess',
+            checkDataSecret:'webDataRightController/checkDataSecret',
+            checkAttribute:'webProcessCommandController/checkAttributesOnStartProcess'//鍙戣捣娴佺▼鏃舵牎楠屾暟鎹殑灞炴�ф槸鍚︾鍚堣姹�
+        };
+        this.autoProcessSeparator = "_";
+        this.requiredProcessName = true;
+        this.requiredAllNode = true;//鏄惁鍏佽鍏ㄩ儴鑺傜偣閮介�夋嫨
+        this.allowMutiExecuteTask = false;//鏄惁鍏佽鎵归噺鎵ц浠诲姟
+    };
+    StartProcess.prototype.getContent = function(){//鑾峰彇鍩虹鐨刪tml
+        return "";
+    };
+    StartProcess.prototype.init = function(){//鍒濆鍖�
+        var that = this;
+        $webUtil.copyConfig(that,that.moduleKey);
+    };
+    /**
+     * 鏄剧ず娴佺▼鐨勭獥鍙�
+     * @param type 娴佺▼妯℃澘鎵�鍦ㄧ被鍨嬶紝涓庝箣鍓嶇殑椤圭洰鏈夊尯鍒紝濡傛灉type涓虹┖鑷姩鍙朾usinessData閲岀殑绗竴鏉℃暟鎹殑btmname
+     * @param businessData 涓氬姟鏁版嵁锛屽彲浠ユ槸瀵硅薄锛屽彲浠ユ槸鏁扮粍锛屼絾鏄兘蹇呴』鏈塷id鍜宐tmname灞炴��
+     * @param options 鍙傛暟
+     * isMutiProcess鎵归噺鍙戣捣娴佺▼锛堝嵆鍙戣捣澶氭潯);
+     * beforeCheck鍙戣捣涔嬪墠鐨勬牎楠屼簨浠�-涓嶆帹鑽愪娇鐢紝鐢卞彂璧蜂箣鍓嶆牎楠岋紱
+     * tableDefineCode娴佺▼鎵ц杩囩▼涓樉绀烘暟鎹墍浣跨敤鐨勮〃鏍硷紱
+     * autoProcessSeparator 娴佺▼鍚嶇О涓殑鍒嗛殧绗�
+     * autoProcessName鑷姩娴佺▼鍚嶇О锛�
+     * title 娴佺▼绐楀彛鐨勫悕绉�
+     * width 娴佺▼绐楀彛鐨勫搴�
+     * height 娴佺▼绐楀彛鐨勯珮搴�
+     * canUseTemplate 鍙互浣跨敤鐨勬祦绋嬫ā鏉匡紝鐢ㄩ�楀彿鍒嗛殧锛屽鏋滀负绌鸿〃绀烘墍鏈夌殑鍐呭閮芥湁
+     * variablesInfo 鍙傛暟淇℃伅
+     * @param callback 瀹屾垚鍥炶皟鍑芥暟
+     * @returns {boolean}
+     */
+    StartProcess.prototype.showStartWindow=function(type,businessData,options,callback) {
+        var that = this;
+        if (!businessData || businessData.length == 0) {
+            $webUtil.showErrorMsg("娌℃湁鏁版嵁鐩稿叧鐨勪俊鎭�");
+            return;
+        }
+        if (!$webUtil.isArray(businessData)) {
+            businessData = [businessData];
+        }
+        var isMutiProcess = false;
+        if (options.isMutiProcess == true && businessData.length > 1) {
+            isMutiProcess = true;
+        }
+        if ($webUtil.isNull(type)) {
+            type = businessData[0].btmname;
+        }
+        if ($webUtil.isNull(type)) {
+            $webUtil.showErrorMsg("涓氬姟鏁版嵁涓病鏈塨tmname灞炴�х殑鍊�");
+            return false;
+        }
+        var btmType = "";
+        var oids = [];
+        var maxSecret = -1;
+        var processName = [];
+        var isReturn = false;
+        layui.each(businessData, function (_index, _item) {
+            for (var key in _item) {
+                _item[key.toLowerCase()] = _item[key];
+            }
+            if (!_item.btmname || $webUtil.isNull(_item.btmname)) {
+                $webUtil.showErrorMsg("涓氬姟鏁版嵁涓病鏈塨tmname灞炴�х殑鍊�");
+                isReturn = true;
+                return;
+            } else if (!_item.oid || $webUtil.isNull(_item.oid)) {
+                $webUtil.showErrorMsg("涓氬姟鏁版嵁涓病鏈塷id灞炴�х殑鍊�");
+                isReturn = true;
+                return;
+            }
+            if (_item.secretgrade || _item.secretgrade * 1 > 0) {
+                //璇存槑鏄湁瀵嗙骇鐨勶紝鑾峰彇鏈�澶х殑瀵嗙骇
+                var secretInThisData = _item.secretgrade * 1;
+                if (secretInThisData > maxSecret) {
+                    maxSecret = secretInThisData;
+                }
+            }
+            oids.push(_item.oid);
+            if(options.processName && $webUtil.isNotNull(options.processName)){
+                processName.push(options.processName);
+            }
+            if (options.autoProcessName && $webUtil.isNotNull(options.autoProcessName)) {
+                processName.push(that.doAutoName(_item, options.autoProcessName));
+            }
+            btmType = _item.btmname;
+        });
+        if (isReturn) {
+            return false;
+        }
+        //鐪嬬湅鏄惁闇�瑕佹牎楠屽睘鎬�
+        //checkAllowProperties:'lcstatus',
+        //checkAllowPropertiesValue:'Working'
+        if (options && (options.checkAllowAttributes|| options.checkAllowAttributeValues)) {
+            if (!options.checkAllowAttributes) {
+                options.checkAllowAttributes = 'lcstatus';//榛樿鏄牎楠岀敓鍛藉懆鏈熺姸鎬�
+            }
+            if ($webUtil.isNull(options.checkAllowAttributeValues)) {
+                //涓嶆牎楠屼簡
+                that.doCheckSecret(maxSecret, type, btmType, oids, processName, options, isMutiProcess, callback);
+            } else {
+                $webUtil.post(options.checkAttributeUrl ? options.checkAttributeUrl : that.url.checkAttribute, {
+                    oids: oids.join(","),
+                    btmType: btmType,
+                    uiType:options.UIType,
+                    attributes: options.checkAllowAttributes,
+                    attributeValues: options.checkAllowAttributeValues
+                }, function (result) {
+                    if (result.success) {
+                        that.doCheckSecret(maxSecret, type, btmType, oids, processName, options, isMutiProcess, callback);
+                    } else {
+                        $webUtil.showErrorMsg(result.msg + ',' + ((options.allowAttributesMsg)?options.allowAttributesMsg:""));
+                        return false;
+                    }
+                }, function (xhr, error) {
+                    $webUtil.showErrorMsg("鏍¢獙鏁版嵁灞炴�ф槸鍚﹀彲浠ュ彂璧锋祦绋嬬殑鏃跺�欏嚭鐜颁簡閿欒");
+                    $webUtil.showDebugMsg(error);
+                }, that.backPath);
+            }
+        } else {
+            that.doCheckSecret(maxSecret, type, btmType, oids, processName, options, isMutiProcess, callback);
+        }
+    };
+    StartProcess.prototype.doCheckSecret = function(maxSecret,type,btmType,oids,processName,options,isMutiProcess,callback){
+        var that = this;
+        if(maxSecret> -1){
+            //璇存槑鏈夊瘑绾э紝闇�瑕佸厛璋冪敤鍚庡彴鏍¢獙涓�涓嬶紙鍥犱负瀵嗙骇鍙兘涓嶆槸鍗曠函浣跨敤鏁板�煎ぇ灏忔瘮杈冿級
+            $webUtil.post(that.url.checkDataSecret,{dataSecret:maxSecret},function(result){
+                if(result.success){
+                    that.gotoShowWindow(type,btmType,oids,maxSecret,processName,options,isMutiProcess,callback);
+                }else{
+                    $webUtil.showErrorMsg(result.msg);
+                }
+            },function(xhr,error){
+                $webUtil.showErrorMsg("鏍¢獙鏁版嵁瀵嗙骇鐨勬椂鍊欏嚭鐜颁簡閿欒");
+                $webUtil.showDebugMsg(error);
+            },that.backPath);
+        }else {
+            that.gotoShowWindow(type, btmType, oids, maxSecret, processName, options, isMutiProcess, callback);
+        }
+    };
+    /**
+     * 鑷姩鏋勫缓娴佺▼鍚嶇О
+     * @param _item
+     * @param autoProcessName
+     * @param separator
+     */
+    StartProcess.prototype.doAutoName = function(_item,autoProcessName,separator){
+        var that= this;
+        var name = "";
+        if(!separator){
+            separator = that.autoProcessSeparator;
+        }
+        layui.each(autoProcessName.split(","),function(index,key){
+            key = key.toLowerCase();
+            if($webUtil.startWith(key,"${static}")){
+                name +=key.substring("${static}".length) + separator;
+            }else{
+                var value = _item[key];
+                if($webUtil.isNotNull(value)){
+                    name += value + separator;
+                }
+            }
+        });
+        if($webUtil.endWith(name,separator)){
+            name = name.substring(0,name.length - separator.length);
+        }
+        return name;
+    };
+    /**
+     * 鏄剧ず娴佺▼鍚姩绐楀彛
+     * @param type 娴佺▼鍒嗙被
+     * @param oids 鎵�鏈夌殑涓婚敭鏁扮粍
+     * @param maxSecret 鏁版嵁涓渶澶х殑瀵嗙骇鍊硷紝濡傛灉璇ヤ笟鍔$被鍨嬮噷娌℃湁瀵嗙骇瀛楁锛岃繖涓�间负-1
+     * @param processName 鎵�鏈夌殑娴佺▼鍚嶇О
+     * @param options 鍙傛暟锛屼笌showStartWindow閲岀殑鍙傛暟鐩稿悓
+     * @param isMutiProcess 鏄惁鎵归噺鍙戣捣娴佺▼
+     * @param callback 瀹屾垚鍚庣殑鍥炶皟鍑芥暟
+     */
+    StartProcess.prototype.gotoShowWindow = function(type,btmType,oids,maxSecret,processName,options,isMutiProcess,callback){
+        var that = this;
+        var form = layui.form;
+        var table = layui.table;
+        var formId = "start_process_form_" + oids[0];
+        var title = (options.title && $webUtil.isNotNull(options.title))?options.title:"鍚姩娴佺▼";
+        var isMutiProcessAndHasName = false;//鏄壒閲忓彂璧凤紝鑰屼笖姣忎釜鏁版嵁閮芥湁鍚嶇О锛�
+        var thisProcessName = "";
+        if(isMutiProcess && processName && processName.length>0 && $webUtil.isNotNull(processName[0])){
+            thisProcessName = "鎵归噺鍙戣捣娴佺▼,绯荤粺鑷姩鐢熸垚娴佺▼鍚嶇О";
+            isMutiProcessAndHasName = true;
+        }else if( processName && processName.length>0 && $webUtil.isNotNull(processName[0])){
+            thisProcessName = processName[0];
+        }
+        that.loadTemplated = false;
+        var startProcessWindowIndex = layer.open({
+            type:1,
+            title:title,
+            btn:['鍚姩娴佺▼','鍙栨秷'],
+            //skin:'layui-layer-lan',
+            content:'<form id="' + formId + '" lay-filter="' + formId + '" class="layui-form" style="margin-top:5px;margin-right:5px;display: inline-block;"></form>' +
+                '<div style="display: inline-block;visibility: hidden;"><table id="table_'+formId+ '" lay-filter="table_'+formId+ '" style="overflow-x:auto;"></table></div>'+
+                '<hr class="layui-bg-red">' +
+                '<div style="padding-right: 100px;text-align: right">'+
+                '<a id="btnFav_'+formId+'" title="鏀惰棌"><i class="layui-icon layui-icon-star" style="font-size: 32px;margin-right: 10px"></i></a>'+
+                '<a id="btnclear_'+formId+'" title="娓呯┖"><i class="layui-icon layui-icon-refresh-1" style="font-size: 32px;"></i></a>'+
+                '</div>'+
+                '<form id="processNode_' + formId + '" lay-filter="processNode_' + formId + '" class="layui-form" style="margin-top:10px"></form>',
+            area:[(($webUtil.isNotNull(options.width) && options.width*1>1) ?options.width*1 : 920) +'px',
+                (($webUtil.isNotNull(options.height) && options.height*1>1) ?options.height*1 : 600) + 'px'],
+            closeBtn:1,
+            shade:true,
+            shadeClose:true,
+            resize:true,
+            resizing:function(layero){
+                form.doResize();
+            },
+            yes:function(index,layero){
+                if(form.validata(formId) && form.validata("processNode_" + formId)){
+                   that.doStartProcess(formId,btmType,oids,processName,isMutiProcess,options,startProcessWindowIndex,callback);
+                }
+            },
+            btn2:function(index,layero){
+                layer.close(startProcessWindowIndex);
+                if(callback){
+                    callback(false);
+                }
+            },
+            cancel:function(index,layero){
+                if(callback){
+                    callback(false);
+                }
+            },
+            success:function(layero){
+                var formItems = [];
+                /*if(options.canUseTemplate){
+                    var canUseTemplate=options.canUseTemplate.split(',')
+                    var templateData = [];
+                    layui.each(canUseTemplate,function (i,item){
+                        templateData.push({"key":item,"value":item});
+                    })
+                    formItems = [{
+                        name:'processTemplateOid',
+                        text:'娴佺▼妯℃澘',
+                        type:'combox',
+                        data:templateData,
+                        reloadCombox:true,
+                        labelWidth:120,
+                        textWidth:400
+                    }];
+                }else{
+                    formItems = [{
+                        type:'combox',
+                        name:'processTemplateOid',
+                        text:'娴佺▼妯℃澘',
+                        comboxKey:'processTemplate',
+                        labelWidth:120,
+                        textWidth:400,
+                        reloadCombox:true,
+                        extraParams:{
+                            type:type,
+                            filterTemplate:options.canUseTemplate
+                        },
+                        url:that.url.getTemplate
+                    }];
+                }*/
+                formItems.push({
+                    type:'combox',
+                    name:'processTemplateOid',
+                    text:'娴佺▼妯℃澘',
+                    comboxKey:'processTemplate',
+                    labelWidth:120,
+                    textWidth:400,
+                    reloadCombox:true,
+                    extraParams:{
+                        type:type,
+                        filterTemplate:options.canUseTemplate
+                    },
+                    url:that.url.getTemplate
+                },{
+                    type:'text',
+                    name:'title',
+                    text:'娴佺▼鍚嶇О',
+                    textWidth:400,
+                    labelWidth:120,
+                    required:that.requiredProcessName,
+                    readOnly:isMutiProcessAndHasName,
+                    value:thisProcessName
+                },{
+                    type:'textArea',
+                    name:'description',
+                    text:'娴佺▼鎻忚堪',
+                    labelWidth:120,
+                    textWidth:400
+                })
+
+                form.addItems(formId,formItems,function(elemForm){
+                    //濡傛灉鏈夊涓ā鏉跨殑鏃跺�欙紝闇�瑕佹樉绀烘ā鏉垮悕绉扮殑涓嬫媺妗嗭紝鍚﹀垯鐩存帴鏄剧ず鑺傜偣鍐呭
+                    form.setValues({
+                        title:thisProcessName
+                    });
+                    form.on('select(processTemplateOid)',function(data){
+                        var templateOid = data.value;//鏄祦绋嬬殑涓婚敭
+                        var selected = $(data.elem.options[data.elem.selectedIndex]);
+                        that.currTemplateAttr=selected.data('attributes');
+                        that.getProcessNode(templateOid,maxSecret,formId,function (){
+                            $('#table_' + formId).parent().css({'visibility':'hidden'});
+                            table.reload('table_' + formId,{
+                                extraParams: {
+                                    templateOid: that.currTemplateAttr.deploymentId,
+                                    templateRevision: that.currTemplateAttr.version
+                                }
+                            })
+                        });
+                    });
+                    var templateOid = options.templateOid || form.getValues(formId).processTemplateOid;
+                    var selectElem=elemForm.find('select')[0];
+                    that.currTemplateAttr=$(selectElem.options[selectElem.selectedIndex]).data('attributes');
+                    that.getProcessNode(templateOid,maxSecret,formId,function (){
+                        table.render({
+                            elem: '#table_' + formId,
+                            id: 'table_' + formId,
+                            backPath: that.backPath,
+                            url: that.url.getFavData,
+                            extraParams:{
+                                templateOid: that.currTemplateAttr.deploymentId,
+                                templateRevision: that.currTemplateAttr.version
+                            },
+                            limit: Number.MAX_VALUE,
+                            width: 345,
+                            height:220,
+                            selectMode:table.selectMode.single,
+                            cols: [[{
+                                title: '鏂规鍚嶇О',
+                                field: 'name',
+                                width: 145,
+                                edit:'text'
+                            }, {
+                                field: 'options',
+                                title: '鎿嶄綔',
+                                templet: function (d) {
+                                    return '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>' +
+                                        '<a class="layui-btn layui-btn-intable" lay-event="DEL">鍒犻櫎</a>' +
+                                        '<a class="layui-btn layui-btn-intable" lay-event="doStart">閫夋嫨骞跺彂璧�</a>';
+                                }
+                            }]],
+                            done: function (res, cur, total) {
+                                that.clickTool=false;
+                                $('#table_' + formId).next('.layui-table-view').css('border-width', '0').find('.layui-table-header').hide().next('.layui-table-body').height(220).find('td').css('border-color', '#ffffff');
+                                $('#table_' + formId).parent().css({'visibility':'visible'})
+                                if (total > 0) {
+                                    table.on('tool(table_' + formId + ')', function (obj) {
+                                        var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                                        var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                                        if (layEvent == 'EDIT') {
+                                            if (form.validata("processNode_" + formId)) {
+                                                that.addOrEditFav(false, formId, data.oid, data.name)
+                                            }
+                                        }
+                                        if (layEvent == 'DEL') {
+                                            that.clickTool=true;
+                                            that.DEL(data.oid, data.ts, 'table_' + formId);
+                                        }
+                                        if (layEvent == 'doStart') {
+                                            that.clickTool=true;
+                                            if(obj.tr.hasClass('layui-table-click')){
+                                                if(form.validata(formId) && form.validata("processNode_" + formId)){
+                                                    that.doStartProcess(formId,btmType,oids,processName,isMutiProcess,options,startProcessWindowIndex,callback);
+                                                }
+                                            }else{
+                                                that.checkedFav(data,formId,function (){
+                                                    if(form.validata(formId) && form.validata("processNode_" + formId)){
+                                                        that.doStartProcess(formId,btmType,oids,processName,isMutiProcess,options,startProcessWindowIndex,callback);
+                                                    }
+                                                });
+                                            }
+                                        }
+                                        return false;
+                                    });
+                                    //鐩戝惉鍗曞厓鏍肩紪杈�
+                                    table.on('edit(table_' + formId + ')', function (obj) {
+                                        var value = obj.value //寰楀埌淇敼鍚庣殑鍊�
+                                            , data = obj.data //寰楀埌鎵�鍦ㄨ鎵�鏈夐敭鍊�
+                                            , field = obj.field; //寰楀埌瀛楁
+                                        if ($webUtil.isNotNull(value)) {
+                                            $webUtil.manualAjax('put', that.url.editFav, JSON.stringify({
+                                                name: value,
+                                                oid: data.oid
+                                            }), function (result) {
+                                                if (result.success) {
+                                                    $webUtil.showMsg("淇敼鎴愬姛");
+                                                    layui.table.reload('table_' + formId);
+                                                } else {
+                                                    $webUtil.showErrorMsg("淇敼澶辫触:" + result.msg);
+                                                }
+                                            }, function () {
+                                            }, that.backPath);
+                                        } else {
+                                            $(this).parent().trigger('click')
+                                            $webUtil.showErrorMsg("鏂规鍚嶇О涓嶈兘涓虹┖");
+                                        }
+                                        layui.stope(event)
+                                    });
+                                    table.selectRecord('table_' + formId, {index: 0});
+                                } else {
+                                    $('#table_' + formId).next('.layui-table-view ').find('.layui-none').hide()
+                                }
+                            },
+                            rowClick: function (thisTableFilter, record,tr) {
+                                if(!that.clickTool){
+                                    that.checkedFav(record, formId);
+                                }
+                                that.clickTool=false;
+                            }
+                        });
+                        $('#btnFav_'+formId).click(function () {
+                            if (form.validata("processNode_" + formId)) {
+                                that.addOrEditFav(true, formId)
+                            }
+                        })
+                        $('#btnclear_'+formId).click(function (){
+                            //alert('娓呯┖')
+                            $("#processNode_" + formId).find(".layui-clear").trigger('click')
+                        })
+                    });
+                },{},{
+                    defaultColumnOneRow:1,
+                    inDialog:true
+                });
+            }
+        });
+    };
+    /**
+     * 鑾峰彇娴佺▼妯℃澘涓婄殑鑺傜偣
+     * @param templateOid 妯℃澘涓婚敭
+     * @param maxSecret 鏈�澶х殑瀵嗙骇
+     * @param formId 琛ㄥ崟鐨刬d
+     */
+    StartProcess.prototype.getProcessNode = function(templateOid,maxSecret,formId,callback){
+        var that = this;
+        if($webUtil.isNotNull(templateOid)){
+            $webUtil.post(that.url.getNode,{processOid:templateOid,maxSecret:maxSecret},function(result){
+                if(result.success){
+                    that.showProcessNode(result.obj,formId,callback);
+                }else{
+                    $webUtil.showErrorMsg(result.msg);
+                }
+            },function(result){},that.backPath);
+        }
+    };
+    /**
+     * 鏄剧ず娴佺▼鑺傜偣
+     * @param nodes 宸茬粡鑾峰彇鍒扮殑鑺傜偣鐨勪俊鎭�
+     * @param formId 琛ㄥ崟鐨勪富閿�
+     */
+    StartProcess.prototype.showProcessNode=function(nodes,formId,callback){
+        var that = this;
+        var form = layui.form;
+        if($webUtil.isNotNull($("#processNode_" + formId).html())){
+            form.removeItems("#processNode_" + formId,[],true);//娓呴櫎鍘熸湁鐨�
+        }
+        var nodeItems = [];
+        layui.each(nodes,function(_index,_item){
+            var thisNodeUsers = _item.processUserVO;
+            var referConfig={
+                textField:'name',
+                valueField:'id',
+                loadType:'all',
+                isMuti: true,
+                type:"process/vciWebUserTransferRefer"
+            }
+            if(thisNodeUsers && thisNodeUsers.length>0){
+                var roleuserData=[];
+                var deptuserData=[];
+                var userData=[];
+                layui.each(thisNodeUsers,function(_userIndex,_userItem){
+                    var item=JSON.parse(JSON.stringify(_userItem))
+                    item.users=_userItem.children;
+                    item.children=null;
+                    if(item.type == "role") {
+                        roleuserData.push(item)
+                    }else if(item.type == "dept") {
+                        deptuserData.push(item)
+                    }else if(item.type == "user"){
+                        userData.push(item)
+                    }
+                });
+                if(roleuserData.length>0){
+                    referConfig.displayType=['roleUserData'];
+                    referConfig.displayTypeTitle={roleUserData:{
+                            title:'瑙掕壊',
+                            data:roleuserData
+                        }}
+                    referConfig.data=null;
+                }
+                if(deptuserData.length>0){
+                    if(referConfig.displayType){
+                        referConfig.displayType.push('departUserData');
+                        referConfig.displayTypeTitle.departUserData={
+                                title:'閮ㄩ棬',
+                                data:deptuserData
+                            }
+                    }else {
+                        referConfig.displayType=['departUserData'];
+                        referConfig.displayTypeTitle={departUserData:{
+                                title:'閮ㄩ棬',
+                                data:deptuserData
+                            }}
+                    }
+                    referConfig.data=null;
+                }
+                if(userData.length>0){
+                    if(roleuserData.length>0 || deptuserData.length>0){
+                        referConfig.displayType.push('usersData');
+                        referConfig.displayTypeTitle.usersData={
+                            title:'鎸囧畾鐢ㄦ埛',
+                            data:userData
+                        }
+                        referConfig.data=null;
+                    }else{
+                        referConfig.displayType=[]
+                        referConfig.data=userData
+                    }
+
+                }
+            }else{
+                //娌℃湁瀹氫箟鐢ㄦ埛淇℃伅锛屾樉绀哄叏閮ㄧ敤鎴�
+                referConfig.displayType=['roleUser','departUser'];
+                referConfig.displayTypeTitle={
+                    roleUser:{
+                        title:'瑙掕壊',
+                        url:'roleQueryController/refTree',
+                        queryField:'pkRole',
+                        queryUserUrl:'userQueryController/refDataGridByPkRole'
+                    },
+                    departUser:{
+                        title:'閮ㄩ棬',
+                        url:'departmentQueryController/refTree',
+                        queryField:'pkDepartment',
+                        queryUserUrl:'userQueryController/refDataGridByPkDepartment'
+                    }
+                }
+            }
+            nodeItems.push({
+                type: 'refer',
+                name: _item.name,
+                text: _item.name,
+                showField:  _item.name +'name',
+                textWidth: 730,
+                labelWidth:120,
+                required:that.requiredAllNode,
+                referConfig:referConfig,
+                readOnly: (_index==0?true:false)
+            });
+        });
+        form.addItems("processNode_" + formId,nodeItems,function(){
+            var firstNodeName =  nodes[0].name;
+            var values = {};
+            values[firstNodeName] = $webUtil.getSystemVar($webUtil.systemValueKey.userId);
+            var userSecretText=$webUtil.getSystemVar($webUtil.systemValueKey.userSecretText)
+            values[firstNodeName + "name"] = $webUtil.getSystemVar($webUtil.systemValueKey.userName)+(userSecretText?("["+ userSecretText+"]"):'') ;
+            form.setValues(values,"processNode_" + formId);
+            //form.on('select(processNode_' + formId + ')',function(data){   });
+            if(callback){
+                callback();
+            }
+        },{},{
+            defaultColumnOneRow:1,
+            inDialog:true
+        });
+    };
+    /**
+     * 鏍¢獙閫氳繃鍚庯紝鍙戣捣娴佺▼
+     * @param formId
+     * @param startProcessWindowIndex
+     * @param callback
+     */
+    StartProcess.prototype.doStartProcess = function(formId,btmType,oids,processName,isMutiProcess,options,startProcessWindowIndex,callback){
+        var that = this;
+        var layer = layui.layer;
+        var form = layui.form;
+        //浠庝笅鎷夎彍鍗曚腑鍘绘壘閮ㄧ讲鐨勪俊鎭�
+        var formValues = form.getValues(formId);
+        var nodeValues = form.getValues("processNode_" + formId);
+        var processTemplateOid = formValues['processTemplateOid'];
+        var deployid = "";
+        var allTemplateAttr = $("[lay-combox='processTemplate']").data('processTemplate');
+        if(allTemplateAttr && allTemplateAttr.length > 0){
+            layui.each(allTemplateAttr,function(_index,_item){
+                if(_item.key == processTemplateOid){
+                    deployid = _item.attributes.deploymentId;
+                    return;
+                }
+            });
+        }
+        if($webUtil.isNotNull(deployid)){
+            if(isMutiProcess){
+                //鎵归噺鍙戣捣娴佺▼
+                var finishCount = 0;
+                layui.each(oids,function(_oidIndex,_oid){
+                    var startData = {
+                        deployId :deployid,
+                        title:processName.length >_oidIndex ? processName[_oidIndex]:"",
+                        description:formValues.description,
+                        btmType:btmType,
+                        uiType:options.UIType||btmType,
+                        oids:_oid,
+                        tableDefineCode:options.tableDefineCode,
+                        detailInfoUrl:options.detailUrl,
+                        content:options.content,
+                        startStatus:options.startStatus,
+                        resetStatus:options.resetStatus,
+                        releaseRemoteMethod: options.releaseRemoteMethod,
+                        resetRemoteMethod:options.resetRemoteMethod,
+                        alwaysDisplayNext:options.alwaysDisplayNext
+                    };
+                    if(options.otherParam){
+                        $.extend(startData,options.otherParam)
+                    }
+                    for(var key in nodeValues){
+                        var tempObj = {};
+                        startData[ "nodeUsers['" + key + "']"] = nodeValues[key];
+                    }
+                    if(options.variablesInfo){
+                        for(var key in options.variablesInfo){
+                            var tempObj = {};
+                            startData[ "data['" + key + "']"] = options.variablesInfo[key];
+                        }
+                    }
+                    $webUtil.post(that.url.startProcess,startData,function(result){
+                        if(result.success){
+                            finishCount ++;
+                            if(finishCount == oids.size()){
+                                $webUtil.showMsg("鎵归噺鍙戣捣娴佺▼鍏ㄩ儴瀹屾垚锛屽叡鍙戣捣浜�" + finishCount + "涓祦绋�");
+                                layer.close(startProcessWindowIndex);
+                                if(callback){
+                                    callback(true);
+                                }
+                            }
+                        }else{
+                            $webUtil.showErrorMsg("鍙戣捣澶辫触:" + result.msg);
+                            /*layer.close(startProcessWindowIndex);
+                            if(callback){
+                                callback(false);
+                            }*/
+                        }
+                    },function(){},that.backPath,true);
+                });
+            }else{
+                var startData = {
+                    deployId :deployid,
+                    title:formValues.title,
+                    description:formValues.description,
+                    btmType:btmType,
+                    uiType:options.UIType||btmType,
+                    oids:oids.join(","),
+                    tableDefineCode:options.tableDefineCode,
+                    detailInfoUrl:options.detailUrl,
+                    content:options.content,
+                    startStatus:options.startStatus,
+                    resetStatus:options.resetStatus,
+                    releaseRemoteMethod: options.releaseRemoteMethod,
+                    resetRemoteMethod:options.resetRemoteMethod,
+                    alwaysDisplayNext:options.alwaysDisplayNext
+                };
+                if(options.otherParam){
+                    $.extend(startData,options.otherParam)
+                }
+                for(var key in nodeValues){
+                    var tempObj = {};
+                    startData[ "nodeUsers['" + key + "']"] = nodeValues[key];
+                }
+                if(options.variablesInfo){
+                    for(var key in options.variablesInfo){
+                        var tempObj = {};
+                        startData[ "data['" + key + "']"] = options.variablesInfo[key];
+                    }
+                }
+                $webUtil.post(that.url.startProcess,startData,function(result){
+                    if(result.success){
+                        $webUtil.showMsg(formValues.title + "鍙戣捣鎴愬姛");
+                        layer.close(startProcessWindowIndex);
+                        if(callback){
+                            callback(true);
+                        }
+                    }else{
+                        $webUtil.showErrorMsg(formValues.title + "鍙戣捣澶辫触:" + result.msg);
+                        /*layer.close(startProcessWindowIndex);
+                        if(callback){
+                            callback(false);
+                        }*/
+                    }
+                },function(){},that.backPath,true);
+            }
+
+        }else{
+            $webUtil.showErrorMsg("鏁版嵁閿欒锛屾病鏈夎幏鍙栧埌娴佺▼妯℃澘鐨勯儴缃蹭富閿�");
+        }
+    };
+
+    /**
+     * 鏂板淇敼鏀惰棌鏂规
+     * @param formId
+     */
+    StartProcess.prototype.addOrEditFav = function(isAdd,formId,FavOid,FavName){
+        var that=this;
+        var form=layui.form;
+        var table=layui.table;
+        var formValues = form.getValues(formId);
+        var nodeValues = form.getValues("processNode_" + formId);
+        var processTemplateOid = formValues['processTemplateOid'];
+        var deployid = "";
+        var allTemplateAttr = $("[lay-combox='processTemplate']").data('processTemplate');
+        if(allTemplateAttr && allTemplateAttr.length > 0){
+            layui.each(allTemplateAttr,function(_index,_item){
+                if(_item.key == processTemplateOid){
+                    deployid = _item.attributes.deploymentId;
+                    return;
+                }
+            });
+        }
+        if($webUtil.isNotNull(deployid)) {
+            var FavIndex = layer.open({
+                type: 1,
+                title: isAdd?'鏂板鏀惰棌鏂规':'淇敼鏀惰棌鏂规',
+                btn: ['淇濆瓨', '鍙栨秷'],
+                content: '<form id="Favform_'+ formId+'" lay-filter="Favform_'+formId+ '" class="layui-form" style="margin-top:25px" ></form>',
+                area: ['400px', '200px'],
+                closeBtn: 1,
+                shade: true,
+                shadeClose: true,
+                success: function (layero) {
+                    form.addItems('Favform_'+formId, [{
+                        field: 'name',
+                        text: '鏂规鍚嶇О',
+                        type:'text',
+                        defaultValue: FavName,
+                        required:true
+                    }])
+                },
+                yes: function (layero) {
+                    if (form.validata('Favform_' + formId) ) {
+                        var FavName = form.getValues('Favform_' + formId, true).name;
+                        var hasName=false;
+                        var items=[];
+                        $.each(nodeValues,function (i,_item) {
+                            if (i.indexOf('name') > -1) {
+                                items.push({
+                                    name: i.replace('name', ''),
+                                    nodeUserIds: nodeValues[i.replace('name', '')],
+                                    nodeUserNames: _item
+                                })
+                            }
+                        })
+                        var favData = {
+                            name: FavName,
+                            id: deployid,
+                            description: '',
+                            wfTemplateName: that.currTemplateAttr.name,
+                            wfTemplateRev:that.currTemplateAttr.version,
+                            items: items
+                        };
+                        if(isAdd){
+                            var Favlist=table.getData('table_' + formId);
+                            layui.each(Favlist,function (index,item){
+                                if(item.name==FavName){
+                                    hasName=true;
+                                    return ;
+                                }
+                            })
+                        }else{
+                            favData = {
+                                name: FavName,
+                                oid:FavOid
+                            }
+                        }
+                        if(!hasName) {
+                            $webUtil.manualAjax(isAdd ? 'post' : 'put', isAdd ? that.url.addFav : that.url.editFav, JSON.stringify(favData), function (result) {
+                                if (result.success) {
+                                    $webUtil.showMsg(isAdd ?"鏀惰棌鎴愬姛":'淇敼鎴愬姛');
+                                    layer.close(FavIndex);
+                                    layui.table.reload('table_' + formId);
+                                } else {
+                                    $webUtil.showErrorMsg((isAdd ?"鏀惰棌澶辫触:":'淇敼澶辫触锛�') + result.msg);
+                                }
+                            }, function () {
+                            }, that.backPath);
+                        }else {
+                            $webUtil.showConfirmMsg('璇ュ悕绉板凡鏈夋柟妗堬紝鏄惁瑕嗙洊',function (r) {
+                                if(r){
+                                    hasName=false;
+                                    $webUtil.manualAjax(isAdd ? 'post' : 'put', isAdd ? that.url.addFav : that.url.editFav, JSON.stringify(favData), function (result) {
+                                        if (result.success) {
+                                            $webUtil.showMsg(isAdd ?"鏀惰棌鎴愬姛":'淇敼鎴愬姛');
+                                            layer.close(FavIndex);
+                                            layui.table.reload('table_' + formId);
+                                        } else {
+                                            $webUtil.showErrorMsg((isAdd ?"鏀惰棌澶辫触:":'淇敼澶辫触锛�') + result.msg);
+                                        }
+                                    }, function () {
+                                    }, that.backPath);
+                                }
+                            });
+                        }
+                    }
+                },
+                btn2: function (layero) {
+                    layer.close(FavIndex)
+                }
+            });
+        }
+    }
+
+    //鍒犻櫎鏀惰棌鏂规
+    StartProcess.prototype.DEL= function(FavOid,ts,tableid){
+        var that = this;
+        $webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欎釜鏂规锛�",function () {
+            $webUtil.deleteRequest(that.url.delFav, {oid:FavOid,TS:ts},function(result){
+                if(result.success){
+                    $webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                    layui.table.reload(tableid);
+                }else{
+                    $webUtil.showErrorMsg(result.msg);
+                }
+            },function (xhr,err) {
+                $webUtil.showErrorMsg("鎵ц鍒犻櫎鐨勬椂鍊欏嚭閿欎簡閿欒锛屽彲鑳芥槸鏈嶅姟鍣ㄦ殏鏃舵棤娉曡闂�");
+            },that.backPath);
+        });
+    };
+
+    //閫変腑鏂规
+    StartProcess.prototype.checkedFav= function(data,formId,callback){
+        var that = this;
+        $webUtil.get(that.url.getFavByOid,{schemaOid:data.oid},function(result){
+            if(result.success){
+                var nodes= layui.form.getFormItems("processNode_" + formId);
+                var values={};
+                layui.each(nodes,function(_index,_item) {
+                    for(var i=0;i<result.obj.length;i++){
+                        if(_item.text==result.obj[i].name){
+                            values[_item.name]=result.obj[i].nodeUserIds;
+                            values[_item.showField]=result.obj[i].nodeUserNames;
+                            /*if(result.obj[i].nodeUserNames.indexOf(',')>-1){
+                                values[_item.showField]=''
+                                for(var nIndex=0;nIndex<result.obj[i].nodeUserNames.split(',').length;nIndex++){
+                                    values[_item.showField]+=','+result.obj[i].nodeUserIds.split(',')[nIndex]+' '+result.obj[i].nodeUserNames.split(',')[nIndex]
+                                }
+                                values[_item.showField]=values[_item.showField].replace(',','');
+                            }else{
+                                values[_item.showField]=result.obj[i].nodeUserIds+' '+result.obj[i].nodeUserNames;
+                            }*/
+
+                            result.obj.remove(result.obj[i]);
+                            return;
+                        }
+                    }
+                })
+                layui.form.setValues(values,"processNode_" + formId);
+                if(callback){
+                    callback()
+                }
+            }else{
+                $webUtil.showErrorMsg(result.msg);
+            }
+        },function(result){},that.backPath);
+    };
+    var sp = new StartProcess();
+    exports("process/vciWebStartProcess",sp);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebUserTransferRefer.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebUserTransferRefer.js
new file mode 100644
index 0000000..fa4b226
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/process/vciWebUserTransferRefer.js
@@ -0,0 +1,358 @@
+/**
+ * 鐢ㄦ埛绌挎妗嗙殑鍙傜収椤甸潰
+ * @author wangting
+ * @date 2022-1-17
+ */
+layui.define(['layer','element','transfer'],function(exports){
+    var Class = function(){
+        this.MODELNAME = "process/vciWebUserTransferRefer";
+        this.moduleKey = "vciWebUserTransferRefer";
+        this.url = {
+            controller:'smUserController/',
+            dataGrid:'userQueryController/refDataGrid'
+        };
+        this.displayType = {
+            roleUser:'roleUser',
+            departUser:'departUser',
+            workTypeUser:'workTypeUser',
+            dutyUser:'dutyUser'
+        };
+        this.displayTypeTitle = {
+            roleUser:{
+                title:'瑙掕壊',
+                url:'roleQueryController/refTree',
+                queryField:'pkRole',
+                queryUserUrl:'userQueryController/refDataGridByPkRole'
+            },
+            departUser:{
+                title:'閮ㄩ棬',
+                url:'departmentQueryController/refTree',
+                queryField:'pkDepartment',
+                queryUserUrl:'userQueryController/refDataGridByPkDepartment'
+            },
+            workTypeUser:{
+                title:'宸ョ',
+                url:'smWorkTypeController/refTree',
+                queryField:'pkWorktype',
+                queryUserUrl:'userQueryController/refDataGridByPkWorktype'
+            },
+            dutyUser:{
+                title:'鑱屽姟',
+                url:'dutyQueryController/refTree',
+                queryField:'pkDuty',
+                queryUserUrl:'userQueryController/refDataGridByPkDuty'
+            }
+        };
+        this.defaultConfig = {
+            favUser:false,//鏄惁鏈夊父鐢ㄧ敤鎴�
+            displayType:[this.displayType.departUser,this.displayType.roleUser],//榛樿鏄剧ず鐨勬槸閮ㄩ棬鍜岃鑹蹭笌鐢ㄦ埛
+            textField:'name',
+            valueField:'id'
+        };
+        /**
+         * 鐩存帴鏄剧ず閫夋嫨鐨勫璇濇锛岃繖涓粡甯稿湪鐐瑰嚮鎸夐挳鍚庣殑鍔熻兘閲屼娇鐢�
+         * @param options 閰嶇疆鐨勪俊鎭紝鍖呭惈濡備笅灞炴��
+         *    filter 锛屾爣璇�
+         *    name 锛屾爣璇嗗悕绉�
+         *    favUser:false, 鏄惁鏄剧ず甯哥敤鐢ㄦ埛锛岄粯璁や负false
+         *    displayType:鏄剧ず閫夐」鍗★紝[userRefer.displayType.roleUser,userRefer.displayType.departUser,userRefer.displayType.workTypeUser,userRefer.displayType.dutyUser],
+         *   setValue:function (filter,name,value,rawValue,isClose,allSelectValues) {}   璁剧疆鍊肩殑鍥炶皟
+         * @returns 绐楀彛鐨勭储寮曞彿
+         */
+        this.showReferDialog = function (options) {
+            //鍦ㄥ璇濇涓�夋嫨鐢ㄦ埛
+            var that = this;
+            if(options.displayTypeTitle){
+                that.displayTypeTitle=options.displayTypeTitle;
+            }
+            options = $.extend(that.defaultConfig,options);
+            options.userUrl = $webUtil.getValueFromObj(options,['url','referUrl'],that.url.dataGrid);
+            options.textField = $webUtil.getValueFromObj(options,['textField'],that.defaultConfig.textField);
+            options.valueField = $webUtil.getValueFromObj(options,['valueField'],that.defaultConfig.valueField);
+            options.setValue = function (filter,name,value,rawValue,isClose,selectRecords){
+                options.target.setValue(filter,name,value,rawValue,isClose,selectRecords);
+            }
+            var filter = options.filter;
+            var name = options.name;
+            var valueInfo = ($webUtil.isNotNull(options.text)?("宸茶缃殑鍊间负[" +options.text +"]"):'鏈缃��');
+            var area=[(($webUtil.isNotNull(options.width) && options.width*1>1) ?options.width*1 :( (options.favUser||(options.displayType && options.displayType.length>0))?1050:700)) +'px',
+                (($webUtil.isNotNull(options.height) && options.height*1>1) ?options.height*1 : 620) + 'px']
+            var referIndex = $webUtil.dialog({
+                title:(options.title?options.title:'璇烽�夋嫨鐢ㄦ埛'),
+                btn:['纭畾','鍙栨秷'],
+                content:'<div id="referGrid_toolbar_' + filter + '" layui-filter="referGrid_toolbar_' + filter + '" class="layui-table-toolbar referGrid_toolbar_'+filter+'" style="height:510px;"></div>',
+                area:area,
+                btnBefore:valueInfo,
+                yes:function(index,layero){
+                    var selectValue = that.getSelectValue(filter,name);
+                    if(selectValue){
+                        options.setValue(filter,name,selectValue.value,selectValue.rawValue,true,selectValue.allValues);
+                        layer.close(referIndex);
+                    }else {
+                        $webUtil.showErrorMsg("璇烽�夋嫨鐢ㄦ埛");
+                    }
+                },
+                success:function(layero){
+                    that.showTransfer(filter,name,options);
+                }
+            });
+            return referIndex;
+        };
+        this.setConfig=function(filter,name,options){
+            var that = this;
+            if(!that.referConfig){
+                that.referConfig = {};
+            }
+            that.referConfig[filter + "_" + name] = options;
+        };
+        this.getConfig=function(filter,name){
+            var that = this;
+            if(!that.referConfig){
+                that.referConfig = {};
+            }
+            if((filter + "_" + name) in that.referConfig){
+                return that.referConfig[filter + "_" + name];
+            }
+        };
+        this.showTransfer =function (filter,name,options) {
+            //鏄剧ず
+            var that = this;
+            that.setConfig(filter,name,options);
+            var contentFilter = filter + "_" + name;
+            if(options.favUser||(options.displayType && options.displayType.length>0)){
+                var typeHtml=['<div data-options="region:\'west\',split:true,minWidth:40,maxWidth:600" style="width:320px;background-color:#ffffff;display:',options.onlyTable?'none':'block','">',
+                    '<div lay-filter="referTree_' + contentFilter + '" class="layui-tab layui-tab-card" lay-allowClose="false" style="margin-top: 0">',
+                    '<ul class="layui-tab-title" lay-allowClose="false">'];
+                var tabHtml = [];
+                var tabContentHtml = [];
+                if(options.favUser){
+                    tabHtml.push('<li class="layui-this">甯哥敤鐢ㄦ埛</li>');
+                    tabContentHtml.push([
+                        '<div class="layui-tab-item layui-show">',
+                        '<ul layui-filter="favTree_',contentFilter,'" style="border:1px solid #6886ff;overflow-x:auto"></ul>',
+                        '</div>'].join(''));
+                }
+                if(options.displayType) {
+                    layui.each(options.displayType, function (_index, _item) {
+                        tabHtml.push('<li ' + ((!options.favUser&&_index == 0)?' class="layui-this" ':'') + ' treeFilter="', _item, '_', contentFilter, '">' +  that.displayTypeTitle[_item].title + '</li>');
+                        tabContentHtml.push([
+                            '<div class="layui-tab-item',((!options.favUser&&_index == 0)?' layui-show':''),'">',
+                            '<ul layui-filter="', _item, '_', contentFilter, '" style="border:0px solid #6886ff;overflow-x:auto"></ul>',
+                            '</div>'].join(''));
+                    });
+                }
+                typeHtml.push(tabHtml.join(''));
+                typeHtml.push('</ul>');
+                typeHtml.push('<div class="layui-tab-content">');
+                typeHtml.push(tabContentHtml.join(''));
+                typeHtml.push( '</div>');
+                typeHtml.push(    '</div>');
+                typeHtml.push('</div>');
+                var content= [
+                    '<div class="layui-layout-border vciWebReferGridInDojo easyui-layout" data-options="fit:true" style="height: 100%">',
+                        typeHtml.join(''),
+                        '<div class="layui-layout" data-options="region:\'center\'">',
+                            '<div class="demo-transfer" layui-filter="referTransfer_' + contentFilter + '" id="referTransfer_' + contentFilter + '" style="padding: 0 10px">',
+                        '</div>',
+                    '</div>',
+                ];
+                $("#referGrid_toolbar_"+ filter ).html(content.join(''));
+                $('.vciWebReferGridInDojo').css({'width':$("#referGrid_toolbar_"+ filter ).parent().width()-10}).layout();
+
+            }else{
+                var content= [
+                    '<div class="layui-layout-border vciWebReferGridInDojo " style="height: 100%">',
+                        '<div class="layui-layout">',
+                            '<div class="demo-transfer" layui-filter="referTransfer_' + contentFilter + '" id="referTransfer_' + contentFilter + '" style="padding: 0 10px">',
+                        '</div>',
+                    '</div>',
+                ];
+                $("#referGrid_toolbar_"+ filter ).html(content.join(''));
+            }
+            var transferId = 'referTransfer_' + contentFilter;
+            var isMuti = options.isMuti;
+            var where=$.extend({limit:-1},options.where||{});
+            var selectWhere=$.extend({limit:-1},options.selectWhere||{});
+            that.selectedUser=[]
+            var formValues=options.formValues[name]==''?[]:options.formValues[name].split(',');
+            that.selectedUserValues=formValues;
+            layui.each(formValues,function (i,item){
+                if(item){
+                    that.selectedUser.push({id:item,name:options.formValues[options.showField].split(',')[i],secret:-1,originalData:{id:item,name:options.formValues[options.showField].split(',')[i],secret:-1}})
+                }
+            })
+            layui.transfer.render({
+                elem: '#'+transferId
+                ,id:transferId//绱㈠紩
+                ,data:options.data
+                ,selectData:that.selectedUser
+                ,value:that.selectedUserValues
+                ,url: ''
+                ,where:where
+                ,backPath:configData.compatibility ? path : configData.frameworkPath
+                ,selectUrl: ''
+                ,selectWhere:selectWhere
+                ,selectMethod:'post'
+                ,selectBackPath:configData.compatibility ? path : configData.frameworkPath
+                ,width: 295
+                ,height: 480
+                ,parseData: function(res){
+                    return {
+                        "originalData":res,
+                        "value": res.id //鏁版嵁鍊�
+                        ,"title": res.id + " " + res.name+((res.secret && res.secret*1>0 && res.secretText)?("[" + res.secretText + "]"):"")//鏁版嵁鏍囬
+                    }
+                }
+                ,title: ['鏈�夌敤鎴�', '鎵�鏈夊凡閫夌敤鎴�']
+                ,showSearch: true
+                ,onchange: function(obj, index){
+                    if(index){
+                        //鏉ヨ嚜鍙宠竟
+                        for(var i=0;i< obj.length;i++){
+                            that.selectedUser.splice(that.selectedUserValues.indexOf(obj[i].value),1);
+                            that.selectedUserValues.remove(obj[i].value);
+                        }
+                    }else{
+                        //鏉ヨ嚜宸﹁竟
+                        for(var i=0;i< obj.length;i++){
+                            that.selectedUser.push(obj[i].originalData);
+                            that.selectedUserValues.push(obj[i].value);
+                        }
+
+                    }
+                }
+            })
+            var treeIndex=0
+            if(options.favUser){
+                //鏄剧ず甯哥敤鐢ㄦ埛鐨勬爲
+                that.showTree("favTree",filter,name,treeIndex);
+                treeIndex++
+            }
+            if(options.displayType) {
+                layui.each(options.displayType, function (_index, _item) {
+                    that.showTree(_item ,filter,name,treeIndex);
+                    treeIndex++
+                });
+                if(options.displayType.length>1){
+                    $('[lay-filter="referTree_' + contentFilter + '"] .layui-tab-title li').on('click' , function(e){
+                        var treeFilter=$(this).attr('treeFilter');
+                        layui.tree.reload(treeFilter)
+                    });
+                }
+            }
+
+
+        };
+        this.showTree = function (displayType,filter,name,treeIndex) {
+            var that = this;
+            var tree = layui.tree;
+            var requestData = {};
+            var options = that.getConfig(filter,name);
+            var url = that.displayTypeTitle[displayType].url;
+            var data=that.displayTypeTitle[displayType].data;
+            //鏄剧ずtree
+            var treeOptions = {
+                url:url,
+                extraParams:requestData,
+                data:data,
+                treeFilter:filter,
+                treeName:name,
+                showSearch:true,
+                backPath:(options.backPath?options.backPath:that.backPath),
+                noApi:(displayType==that.displayType.roleUser?true:false),
+                loadType:tree.loadType.all,
+                click:function(item,elem,treeOptions){
+                    that.treeDoClick(item,elem,treeOptions,displayType,filter,name);
+                    return false;
+                },
+                done:function (filter,children,elem){
+                    if(treeIndex==0){
+                        var currentelem=layui.tree.getElemByItem(filter, children[0].oid);
+                        if(currentelem.length>0){
+                            currentelem.children('a').trigger('click')
+                        }
+                    }
+
+                }
+            };
+            tree.init(displayType + "_" + filter+'_'+name,$('[layui-filter="'+ displayType + "_" + filter+'_'+name + '"]'),treeOptions);
+        };
+        this.treeDoClick = function (item,elem,option,displayType,filter,name) {
+            var that = this;
+            var tableId = 'referTransfer_' + filter + '_' + name;
+            var where = {};
+            where[that.displayTypeTitle[displayType].queryField] = item.oid;
+            var tableUrl = that.displayTypeTitle[displayType].queryUserUrl;
+            layui.transfer.reload(tableId, {
+                url:tableUrl,
+                where:where,
+                data:item.users,
+                title: ['['+item.name+'] 鏈�夌敤鎴�', '鎵�鏈夊凡閫夌敤鎴�'],
+                selectData:that.selectedUser
+                ,value:that.selectedUserValues
+            })
+        };
+        this.destory = function (filter,name) {
+            //閿�姣�
+            var that = this;
+            if($('#referTransfer_' + filter + '_' + name)){
+                $('#referTransfer_' + filter + '_' + name).remove();
+            }
+        };
+        this.getSelectValue = function (filter,name) {
+            var that = this;
+            var selectValue = {};
+            var getData = that.selectedUser;//layui.transfer.getData('referTransfer_' + filter + "_" + name);
+            var options = that.getConfig(filter,name);
+            if(getData.length>0){
+                if(!options.isMuti && getData.length > 1){
+                    $webUtil.showErrorMsg("鍙兘閫夋嫨涓�鏉℃暟鎹�");
+                    return false;
+                }
+                var value = "";
+                var rawValue = "";
+                options.valueField = options.valueField?options.valueField:that.defaultConfig.valueField;
+                options.textField = options.textField?options.textField:that.defaultConfig.textField;
+                var isMutiValue = (options.valueField.indexOf(",")>-1);
+                var isMutiRaw = (options.textField.indexOf(",")>-1);
+                layui.each(getData,function(_index,item){
+                    item=item.originalData||item;
+                    if(isMutiValue){
+                        var valueFieldArray = options.valueField.split(",");
+                        layui.each(valueFieldArray,function(_indexField,_itemField){
+                            value += item[_itemField] + (options.valueSep?options.valueSep:' ');
+                        });
+                        value+= ",";
+                    }else {
+                        value += item[options.valueField] + ",";
+                    }
+                    if(isMutiRaw) {
+                        var rawFieldArray = options.textField.split(",");
+                        layui.each(rawFieldArray,function(_indexField,_itemField){
+                            rawValue += item[_itemField] + (options.textSep?options.textSep:' ');
+                        });
+                        rawValue+= ",";
+                    }else{
+                        rawValue += item[options.textField] + ",";
+                    }
+                });
+                if($webUtil.endWith(value,",")){
+                    value = value.substring(0,value.length - 1);
+                }
+                if($webUtil.endWith(rawValue,",")){
+                    rawValue = rawValue.substring(0,rawValue.length -1);
+                }
+                selectValue = {
+                    value : value,
+                    rawValue : rawValue,
+                    allValues: getData
+                };
+                return selectValue;
+            }else{
+                return false;
+            }
+        };
+    };
+    var cs = new Class();
+    exports("process/vciWebUserTransferRefer",cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/refer/OrgDepartmentGridRefer.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/refer/OrgDepartmentGridRefer.js
new file mode 100644
index 0000000..df57fd9
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/refer/OrgDepartmentGridRefer.js
@@ -0,0 +1,64 @@
+/**
+ * 閮ㄩ棬鍒楄〃鐨勫弬鐓�
+ * @author weidy
+ * @date 2021-1-7
+ */
+layui.define(['layer','vciWebReferGrid'],function(exports){
+	var ReferGrid = function(){
+		this.backPath = (configData.compatibility?path:configData.frameworkPath);
+	};
+	ReferGrid.prototype.showReferDialog = function (referConfig){
+		//鍙渶瑕佽缃粯璁ょ殑鍊硷紝璋冪敤VciWebReferGrid鍗冲彲
+		var that = this;
+		referConfig.options.url = referConfig.options.url?referConfig.options.url:'departmentQueryController/refDataGrid';
+		referConfig.options.backPath = referConfig.options.backPath?referConfig.options.backPath:that.backPath;
+		if(!("method" in referConfig.options)){
+			referConfig.options.method = 'get';
+		}
+		if(!("tableConfig" in referConfig.options)){
+			referConfig.options.tableConfig = {
+				page: {
+					limit: 15,
+					page: 1
+				},
+				cols: [layui.table.getIndexColumn(), layui.table.getCheckColumn(), {
+					field: 'id',
+					title: '閮ㄩ棬缂栧彿',
+					sort:true,
+					width: 150
+				}, {
+					field: 'name',
+					title: '閮ㄩ棬鍚嶇О',
+					sort:true,
+					width: 260
+				},{
+					field:'pkLeaderName',
+					title: '閮ㄩ棬涓荤',
+					width: 80
+				}, {
+					field: 'description',
+					title: '閮ㄩ棬鎻忚堪',
+					sort:true,
+					width: 200
+				},{
+					field:'secretGradeText',
+					title:'瀵嗙骇',
+					width: 60,
+					hidden:(!configData.controllerSecret)
+				}],
+				queryColumns: [
+					{
+						field: 'name',
+						title: '閮ㄩ棬鍚嶇О'
+					}, {
+						field: 'id',
+						title: '閮ㄩ棬缂栧彿'
+					}
+					]
+			};
+		}
+		layui.vciWebReferGrid.showReferDialog(referConfig);
+	};
+	var rg = new ReferGrid();
+	exports('refer/OrgDepartmentGridRefer',rg);
+});
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/refer/OrgDepartmentRefer.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/refer/OrgDepartmentRefer.js
new file mode 100644
index 0000000..1765ce6
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/refer/OrgDepartmentRefer.js
@@ -0,0 +1,23 @@
+/**
+ * 閮ㄩ棬鏍戠殑鍙傜収
+ * @author weidy
+ * @date 2021-1-7
+ */
+layui.define(['layer','vciWebReferTree'],function(exports){
+	var ReferGrid = function(){
+		this.backPath = (configData.compatibility?path:configData.frameworkPath);
+	};
+	ReferGrid.prototype.showReferDialog = function (referConfig){
+		//鍙渶瑕佽缃粯璁ょ殑鍊硷紝璋冪敤VciWebReferGrid鍗冲彲
+		var that = this;
+		referConfig.options.url = referConfig.options.url?referConfig.options.url:'departmentQueryController/refTree';
+		referConfig.options.backPath = referConfig.options.backPath?referConfig.options.backPath:that.backPath;
+		if(!("method" in referConfig.options)){
+			referConfig.options.method = 'get';
+		}
+		referConfig.options.loadType = layui.tree.loadType.all;
+		layui.vciWebReferTree.showReferDialog(referConfig);
+	};
+	var rg = new ReferGrid();
+	exports('refer/OrgDepartmentRefer',rg);
+});
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/refer/OrgDutyRefer.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/refer/OrgDutyRefer.js
new file mode 100644
index 0000000..c1818fc
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/refer/OrgDutyRefer.js
@@ -0,0 +1,60 @@
+/**
+ * 鑱屽姟鐨勫弬鐓�
+ * @author weidy
+ * @date 2021-1-7
+ */
+layui.define(['layer','vciWebReferGrid'],function(exports){
+	var ReferGrid = function(){
+		this.backPath = (configData.compatibility?path:configData.frameworkPath);
+	};
+	ReferGrid.prototype.showReferDialog = function (referConfig){
+		//鍙渶瑕佽缃粯璁ょ殑鍊硷紝璋冪敤VciWebReferGrid鍗冲彲
+		var that = this;
+		referConfig.options.url = referConfig.options.url?referConfig.options.url:'dutyQueryController/refDataGrid';
+		referConfig.options.backPath = referConfig.options.backPath?referConfig.options.backPath:that.backPath;
+		if(!("method" in referConfig.options)){
+			referConfig.options.method = 'get';
+		}
+		if(!("tableConfig" in referConfig.options)){
+			referConfig.options.tableConfig = {
+				page: {
+					limit: 15,
+					page: 1
+				},
+				cols: [layui.table.getIndexColumn(), layui.table.getCheckColumn(), {
+					field: 'id',
+					title: '鑱屽姟缂栧彿',
+					sort:true,
+					width: 150
+				}, {
+					field: 'name',
+					title: '鑱屽姟鍚嶇О',
+					sort:true,
+					width: 260
+				}, {
+					field: 'description',
+					title: '鎻忚堪',
+					sort:true,
+					width: 200
+				},{
+					field:'secretGradeText',
+					title:'瀵嗙骇',
+					width: 60,
+					hidden:(!configData.controllerSecret)
+				}],
+				queryColumns: [
+					{
+						field: 'id',
+						title: '鑱屽姟缂栧彿'
+					}, {
+						field: 'name',
+						title: '鑱屽姟鍚嶇О'
+					}
+					]
+			};
+		}
+		layui.vciWebReferGrid.showReferDialog(referConfig);
+	};
+	var rg = new ReferGrid();
+	exports('refer/OrgDutyRefer',rg);
+});
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/refer/SmRoleRefer.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/refer/SmRoleRefer.js
new file mode 100644
index 0000000..95f1dec
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/refer/SmRoleRefer.js
@@ -0,0 +1,63 @@
+/**
+ * 瑙掕壊鐨勫弬鐓�
+ * @author weidy
+ * @date 2021-1-7
+ */
+layui.define(['layer','vciWebReferGrid'],function(exports){
+	var ReferGrid = function(){
+		this.backPath = (configData.compatibility?path:configData.frameworkPath);
+	};
+	ReferGrid.prototype.showReferDialog = function (referConfig){
+		//鍙渶瑕佽缃粯璁ょ殑鍊硷紝璋冪敤VciWebReferGrid鍗冲彲
+		var that = this;
+		referConfig.options.url = referConfig.options.url?referConfig.options.url:'roleQueryController/refDataGrid';
+		referConfig.options.backPath = referConfig.options.backPath?referConfig.options.backPath:that.backPath;
+		if(!("method" in referConfig.options)){
+			referConfig.options.method = 'get';
+		}
+		if(!("tableConfig" in referConfig.options)){
+			var queryColumns = [{
+				field: 'name',
+				title: '瑙掕壊鍚嶇О'
+			}];
+			if(!configData.compatibility){
+				queryColumns.push({
+					field: 'id',
+					title: '瑙掕壊缂栧彿'
+				});
+			}
+			referConfig.options.tableConfig = {
+				page: {
+					limit: 15,
+					page: 1
+				},
+				cols: [layui.table.getIndexColumn(), layui.table.getCheckColumn(), {
+					field: 'id',
+					title: '瑙掕壊缂栧彿',
+					sort:true,
+					hidden:configData.compatibility,
+					width: 150
+				}, {
+					field: 'name',
+					title: '瑙掕壊鍚嶇О',
+					sort:true,
+					width: 260
+				}, {
+					field: 'description',
+					title: '瑙掕壊鎻忚堪',
+					sort:true,
+					width: 200
+				},{
+					field:'secretGradeText',
+					title:'瀵嗙骇',
+					width: 60,
+					hidden:(!configData.controllerSecret)
+				}],
+				queryColumns: queryColumns
+			};
+		}
+		layui.vciWebReferGrid.showReferDialog(referConfig);
+	};
+	var rg = new ReferGrid();
+	exports('refer/SmRoleRefer',rg);
+});
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/refer/SmUserGridRefer.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/refer/SmUserGridRefer.js
new file mode 100644
index 0000000..43890b8
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/refer/SmUserGridRefer.js
@@ -0,0 +1,65 @@
+/**
+ * 鐢ㄦ埛鍒楄〃鐨勫弬鐓�
+ * @author weidy
+ * @date 2021-1-7
+ */
+layui.define(['layer','vciWebReferGrid'],function(exports){
+	var ReferGrid = function(){
+		this.backPath = (configData.compatibility?path:configData.frameworkPath);
+	};
+	ReferGrid.prototype.showReferDialog = function (referConfig){
+		//鍙渶瑕佽缃粯璁ょ殑鍊硷紝璋冪敤VciWebReferGrid鍗冲彲
+		var that = this;
+		referConfig.options.url = referConfig.options.url?referConfig.options.url:'userQueryController/refDataGrid';
+		referConfig.options.backPath = referConfig.options.backPath?referConfig.options.backPath:that.backPath;
+		if(!("method" in referConfig.options)){
+			referConfig.options.method = 'get';
+		}
+		if(!("tableConfig" in referConfig.options)){
+			referConfig.options.tableConfig = {
+				page: {
+					limit: 15,
+					page: 1
+				},
+				cols: [layui.table.getIndexColumn(), layui.table.getCheckColumn(), {
+					field: 'id',
+					title: '鐢ㄦ埛鍚�',
+					sort:true,
+					width: 150
+				}, {
+					field: 'name',
+					title: '濮撳悕',
+					sort:true,
+					width: 80
+				},{
+					field: 'workNo',
+					title: '宸ュ彿',
+					sort:true,
+					width: 120
+				},{
+					field:'secretGradeText',
+					title:'瀵嗙骇',
+					width: 60,
+					hidden:(!configData.controllerSecret)
+				}, {
+					field: 'email',
+					title: '閭',
+					sort:true,
+					width: 200
+				}],
+				queryColumns: [
+					{
+						field: 'id',
+						title: '鐢ㄦ埛鍚�'
+					}, {
+						field: 'name',
+						title: '濮撳悕'
+					}
+					]
+			};
+		}
+		layui.vciWebReferGrid.showReferDialog(referConfig);
+	};
+	var rg = new ReferGrid();
+	exports('refer/SmUserGridRefer',rg);
+});
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/refer/SmUserRefer.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/refer/SmUserRefer.js
new file mode 100644
index 0000000..f230c77
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/refer/SmUserRefer.js
@@ -0,0 +1,34 @@
+/**
+ * 鐢ㄦ埛鐨勫弬鐓�
+ * @author weidy
+ */
+layui.define(['layer','refer/SmUserReferBase'],function(exports){
+	var ReferGrid = function(){};
+	ReferGrid.prototype.showReferDialog = function (referConfig){
+		var filter = referConfig.filter,
+			name = referConfig.name,
+			title = referConfig.title,
+			target = referConfig.target,
+			value = referConfig.value,
+			text = referConfig.text;
+		var options = referConfig.options;
+		var baseOptions = {};
+		for(var key in options){
+			baseOptions[key] = options[key];
+		}
+		var userRefer = layui['refer/SmUserReferBase'];
+		baseOptions.filter = filter;
+		baseOptions.name = name;
+		baseOptions.value = value;
+		baseOptions.text = text;
+		baseOptions.title = title;
+		baseOptions.favUser = false;
+		//displayType榛樿鏄儴闂紝瑙掕壊銆備笉闇�瑕佽缃紝鍥犱负閲岄潰浼氳嚜鍔ㄨ缃�
+		baseOptions.setValue = function (filter,name,value,rawValue,isClose,selectRecords){
+			target.setValue(filter,name,value,rawValue,isClose,selectRecords);
+		}
+		userRefer.viewUserInDialog(baseOptions);
+	};
+	var rg = new ReferGrid();
+	exports('refer/SmUserRefer',rg);
+});
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/refer/SmUserReferBase.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/refer/SmUserReferBase.js
new file mode 100644
index 0000000..87591ab
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/refer/SmUserReferBase.js
@@ -0,0 +1,368 @@
+/**
+ * 鐢ㄦ埛鍙傜収鐨勫熀纭�椤甸潰
+ * @author weidy
+ * @date 2020-12-21
+ */
+layui.define(['layer','element','form','table'],function(exports){
+    var Class = function(){
+        this.MODELNAME = "refer/SmUserReferBase";
+        this.moduleKey = "SmUserReferBase";
+        this.backPath =  (configData.compatibility?path:configData.frameworkPath);
+        this.url = {
+            controller:'smUserController/',
+            dataGrid:'userQueryController/refDataGrid'
+        };
+        this.displayType = {
+            roleUser:'roleUser',
+            departUser:'departUser',
+            workTypeUser:'workTypeUser',
+            dutyUser:'dutyUser'
+        };
+        this.displayTypeTitle = {
+            roleUser:{
+                title:'瑙掕壊',
+                url:'roleQueryController/refTree',
+                queryField:'pkRole',
+                queryUserUrl:'userQueryController/refDataGridByPkRole'
+            },
+            departUser:{
+                title:'閮ㄩ棬',
+                url:'departmentQueryController/refTree',
+                queryField:'pkDepartment',
+                queryUserUrl:'userQueryController/refDataGridByPkDepartment'
+            },
+            workTypeUser:{
+                title:'宸ョ',
+                url:'smWorkTypeController/refTree',
+                queryField:'pkWorktype',
+                queryUserUrl:'userQueryController/refDataGridByPkWorktype'
+            },
+            dutyUser:{
+                title:'鑱屽姟',
+                url:'dutyQueryController/refTree',
+                queryField:'pkDuty',
+                queryUserUrl:'userQueryController/refDataGridByPkDuty'
+            }
+        };
+        this.defaultConfig = {
+            favUser:true,//鏄惁鏈夊父鐢ㄧ敤鎴�
+            displayType:[this.displayType.departUser,this.displayType.roleUser],//榛樿鏄剧ず鐨勬槸閮ㄩ棬鍜岃鑹蹭笌鐢ㄦ埛
+            textField:'name',
+            valueField:'oid'
+        };
+
+        /**
+         * 鐩存帴鏄剧ず閫夋嫨鐨勫璇濇锛岃繖涓粡甯稿湪鐐瑰嚮鎸夐挳鍚庣殑鍔熻兘閲屼娇鐢�
+         * @param options 閰嶇疆鐨勪俊鎭紝鍖呭惈濡備笅灞炴��
+         *    filter 锛屾爣璇�
+         *    name 锛屾爣璇嗗悕绉�
+         *    favUser:false, 鏄惁鏄剧ず甯哥敤鐢ㄦ埛锛岄粯璁や负true
+         *    displayType:鏄剧ず閫夐」鍗★紝[userRefer.displayType.roleUser,userRefer.displayType.departUser,userRefer.displayType.workTypeUser,userRefer.displayType.dutyUser],
+         *   setValue:function (filter,name,value,rawValue,isClose,allSelectValues) {}   璁剧疆鍊肩殑鍥炶皟
+         * @returns 绐楀彛鐨勭储寮曞彿
+         */
+        this.viewUserInDialog = function (options) {
+            //鍦ㄥ璇濇涓�夋嫨鐢ㄦ埛
+            var that = this;
+            options = $.extend(that.defaultConfig,options);
+            options.userUrl = $webUtil.getValueFromObj(options,['url','referUrl'],that.url.dataGrid);
+            options.textField = $webUtil.getValueFromObj(options,['textField'],that.defaultConfig.textField);
+            options.valueField = $webUtil.getValueFromObj(options,['valueField'],that.defaultConfig.valueField);
+            var filter = options.filter;
+            var name = options.name;
+            var valueInfo = ($webUtil.isNotNull(options.text)?("宸茶缃殑鍊间负[" +options.text +"]"):'鏈缃��');
+            var referIndex = $webUtil.dialog({
+                title:(options.title?options.title:'璇烽�夋嫨鐢ㄦ埛'),
+                btn:['纭畾','鍙栨秷'],
+                content:'<div id="referGrid_toolbar_' + filter + '" layui-filter="referGrid_toolbar_' + filter + '" class="layui-table-toolbar referGrid_toolbar_'+filter+'" style="height:550px;"></div>',
+                area:[(($webUtil.isNotNull(options.width) && options.width*1>1) ?options.width*1 : 1050) +'px',
+                    (($webUtil.isNotNull(options.height) && options.height*1>1) ?options.height*1 : 670) + 'px'],
+                btnBefore:valueInfo,
+                yes:function(index,layero){
+                    var selectValue = that.getSelectValue(filter,name);
+                    if(selectValue){
+                        options.setValue(filter,name,selectValue.value,selectValue.rawValue,true,selectValue.allValues);
+                        layer.close(referIndex);
+                    }
+                },
+                success:function(layero){
+                    that.showGrid(filter,name,options);
+                }
+            });
+            return referIndex;
+        };
+        this.setConfig=function(filter,name,options){
+            var that = this;
+            if(!that.referConfig){
+                that.referConfig = {};
+            }
+            that.referConfig[filter + "_" + name] = options;
+        };
+        this.getConfig=function(filter,name){
+            var that = this;
+            if(!that.referConfig){
+                that.referConfig = {};
+            }
+            if((filter + "_" + name) in that.referConfig){
+                return that.referConfig[filter + "_" + name];
+            }
+        };
+        this.showGrid =function (filter,name,options) {
+            //鏄剧ず
+            var that = this;
+            that.setConfig(filter,name,options);
+            var contentFilter = filter + "_" + name;
+            var typeHtml=['<div data-options="region:\'west\',split:true,minWidth:40,maxWidth:600" style="width:350px;background-color:#ffffff;display:',options.onlyTable?'none':'block','">',
+                        '<div lay-filter="referTree_' + contentFilter + '" class="layui-tab layui-tab-card" lay-allowClose="false" style="margin-top: 0">',
+                            '<ul class="layui-tab-title" lay-allowClose="false">'];
+            var tabHtml = [];
+            var tabContentHtml = [];
+            if(options.favUser){
+                tabHtml.push('<li class="layui-this">甯哥敤鐢ㄦ埛</li>');
+                tabContentHtml.push([
+                    '<div class="layui-tab-item layui-show">',
+                        '<ul layui-filter="favTree_',contentFilter,'" style="border:1px solid #6886ff;overflow-x:auto"></ul>',
+                    '</div>'].join(''));
+            }
+            if(options.displayType) {
+                layui.each(options.displayType, function (_index, _item) {
+                    tabHtml.push('<li ' + ((!options.favUser&&_index == 0)?' class="layui-this" ':'') + '>' +  that.displayTypeTitle[_item].title + '</li>');
+                    tabContentHtml.push([
+                        '<div class="layui-tab-item',((!options.favUser&&_index == 0)?' layui-show':''),'">',
+                        '<ul layui-filter="', _item, '_', contentFilter, '" style="border:0px solid #6886ff;overflow-x:auto"></ul>',
+                        '</div>'].join(''));
+                });
+            }
+            typeHtml.push(tabHtml.join(''));
+            typeHtml.push('</ul>');
+            typeHtml.push('<div class="layui-tab-content">');
+            typeHtml.push(tabContentHtml.join(''));
+            typeHtml.push( '</div>');
+            typeHtml.push(    '</div>');
+            typeHtml.push('</div>');
+            var content= [
+                '<div class="layui-layout-border vciWebReferGridInDojo easyui-layout" data-options="fit:true" style="">',
+                    typeHtml.join(''),
+                    //'<div class="layui-layout" style="margin-left:',options.onlyTable?'5':'355','px;">',
+                    '<div class="layui-layout" data-options="region:\'center\'">',
+                         '<div layui-filter="referGrid_toolbar_',contentFilter, '" class="layui-btn-container">',//涓诲垪琛ㄧ殑鎸夐挳
+                    '</div>',
+                    '<div class="layui-center">',
+                        '<table class="layui-table layui-referGrid" lay-size="sm" lay-even layui-filter="referGrid_' + contentFilter + '" id="referGrid_' + contentFilter + '" ></table>',//涓诲垪琛�
+                    '</div>',
+                '</div>',
+            ];
+            $("#referGrid_toolbar_"+ filter ).html(content.join(''));
+            $('.vciWebReferGridInDojo').css({'width':$("#referGrid_toolbar_"+ filter ).parent().width()-10}).layout();
+            //$("#referGrid_toolbar_"+filter+" .layui-layout-border").css({'height':'100%'});
+            if(options.favUser){
+                //鏄剧ず甯哥敤鐢ㄦ埛鐨勬爲
+                that.showTree("favTree",filter,name);
+            }
+            if(options.displayType) {
+                layui.each(options.displayType, function (_index, _item) {
+                    that.showTree(_item ,filter,name);
+                });
+            }
+            var tableId = 'referGrid_' + filter + '_' + name;
+            var table = layui.table;
+            var isMuti = options.isMuti;
+            var requestData = options.where || {};
+            //鍙互瀹氫箟琛ㄦ牸浜�
+            table.render({
+                elem:'#referGrid_' + filter + '_' + name,
+                id:tableId,
+                url:(options.userUrl?options.userUrl:that.url.dataGrid),
+                page:{
+                    limit: 15,
+                    page: 1
+                },
+                backPath:(options.backPath?options.backPath:that.backPath),
+                height: '475px',
+                where:requestData,
+                method:'get',
+                selectMode:(isMuti?table.selectMode.muti:table.selectMode.single),
+                cols:[[table.getIndexColumn(),table.getCheckColumn(),
+                    {
+                        field: 'id',
+                        title: '鐢ㄦ埛鍚�',
+                        sort:true,
+                        width: 120
+                    }, {
+                        field: 'name',
+                        title: '濮撳悕',
+                        sort:true,
+                        width: 70
+                    },{
+                        field:'workNo',
+                        title:'宸ュ彿',
+                        sort:true,
+                        width:100
+                    },{
+                        field:'pkWorkTypeText',
+                        title:'宸ョ',
+                        sort:true,
+                        hidden:configData.controllerSecret,
+                        width:60
+                    },{
+                        field:'secretGradeText',
+                        title:'瀵嗙骇',
+                        sort:true,
+                        width: 60,
+                        hidden:(!configData.controllerSecret),
+                    },{
+                        field:'pkDepartmentName',
+                        title:'鎵�鍦ㄩ儴闂�',
+                        sort:true,
+                        width:150
+                    }]]
+            });
+            var queryColumns = [ {
+                field: 'id',
+                title: '鐢ㄦ埛鍚�'
+            }, {
+                field: 'name',
+                title: '鐪熷疄濮撳悕'
+            }];
+            that.showSearchHtml(queryColumns,tableId,filter,name,requestData);
+        };
+        this.showTree = function (displayType,filter,name) {
+            var that = this;
+            var tree = layui.tree;
+            var requestData = {};
+            var options = that.getConfig(filter,name);
+            var url = that.displayTypeTitle[displayType].url;
+            //鏄剧ずtree
+            var treeOptions = {
+                url:url,
+                extraParams:requestData,
+                treeFilter:filter,
+                treeName:name,
+                showSearch:true,
+                backPath:(options.backPath?options.backPath:that.backPath),
+                noApi:(displayType==that.displayType.roleUser?true:false),
+                loadType:tree.loadType.all,
+                click:function(item,elem,treeOptions){
+                    that.treeDoClick(item,elem,treeOptions,displayType,filter,name);
+                    return false;
+                }
+            };
+            tree.init(displayType + "_" + filter+'_'+name,$('[layui-filter="'+ displayType + "_" + filter+'_'+name + '"]'),treeOptions);
+        };
+        this.treeDoClick = function (item,elem,option,displayType,filter,name) {
+            var that = this;
+            var tableId = 'referGrid_' + filter + '_' + name;
+            var where = {};
+            where[that.displayTypeTitle[displayType].queryField] = item.oid;
+            var tableUrl = that.displayTypeTitle[displayType].queryUserUrl;
+            layui.table.reload(tableId,{
+                url:tableUrl,
+                where:where
+            });
+        };
+        this.showSearchHtml = function (queryColumns,tableId,filter,name,requestData) {
+            var that = this;
+            var table = layui.table;
+            var toolbarElem = $('[layui-filter="referGrid_toolbar_' + filter + '_' + name +'"]');
+            if(queryColumns){
+                var toolbarHtml = '<div class="layui-form-item" style="height:24px;margin:5px 5px 0 5px;display:inline-block"> '
+                    + '<div class="layui-input-inline" style="height:24px;line-height:24px;width:120px;min-width: 120px"><select name="referGrid_search_'+ filter + '_' + name +'" style="height:24px;width:120px;padding-right:30px;font-size:15px;">';
+                layui.each(queryColumns,function(_index,queryRecord){
+                    toolbarHtml += '<option value="' + queryRecord.field + '" >' + queryRecord.title + '</option>';
+                });
+                toolbarHtml += '</select></div>';
+                toolbarHtml += '<div class="layui-input-inline"><input type="text" style="height:24px;font-size:14px;" name="referGrid_searchvalue_'+ filter + '_' + name +'" placeholder="杈撳叆鍊煎悗鍥炶溅杩涜妯$硦鏌ヨ" class="layui-input" ></div>';
+                toolbarHtml += '<div class="layui-input-inline" ><button class="layui-btn" style="height:24px;line-height:24px;margin: 0" name="referGrid_searchbtn_'+ filter + '_' + name +'" >鏌ヨ</button></div>';
+                toolbarHtml += '</div>';
+                toolbarElem.html(toolbarHtml);
+                layui.form.render('select');
+                $('[name="referGrid_searchvalue_' + filter + "_" + name + '"]').keydown(function (e){
+                    if(e.keyCode == 13){
+                        var searchField = $(this).parent().parent().find('select').val();
+                        var searchValue = $(this).val();
+                        searchValue = "*" + searchValue + "*";
+                        requestData['conditionMap["' + searchField + '"]'] = searchValue;
+                        table.reload(
+                            tableId, {
+                                where: requestData
+                            }
+                        );
+                    }
+                });
+                $('[name="referGrid_searchbtn_'+ filter + '_' + name +'"]').click(function(){
+                    var searchField = $(this).parent().parent().find('select').val();
+                    var searchValue = $(this).parent().parent().find('[name="referGrid_searchvalue_' + filter + '_' + name + '"]').val();
+                    searchValue = "*" + searchValue + "*";
+                    requestData['conditionMap["' + searchField + '"]'] = searchValue;
+                    table.reload(
+                        tableId, {
+                            where: requestData
+                        }
+                    );
+                });
+            }
+        };
+        this.destory = function (filter,name) {
+            //閿�姣�
+            var that = this;
+            if($('#referGrid_' + filter + '_' + name)){
+                $('#referGrid_' + filter + '_' + name).remove();
+            }
+        };
+        this.getSelectValue = function (filter,name) {
+             var that = this;
+             var table = layui.table;
+             var selectValue = {};
+             var checkStatus = table.checkStatus('referGrid_' + filter + "_" + name);
+             var options = that.getConfig(filter,name);
+             if(checkStatus.data.length>0){
+                 if(!options.isMuti && checkStatus.data.length > 1){
+                     $webUtil.showErrorMsg("鍙兘閫夋嫨涓�鏉℃暟鎹�");
+                     return false;
+                 }
+                 var value = "";
+                 var rawValue = "";
+                 options.valueField = options.valueField?options.valueField:that.defaultConfig.valueField;
+                 options.textField = options.textField?options.textField:that.defaultConfig.textField;
+                 var isMutiValue = (options.valueField.indexOf(",")>-1);
+                 var isMutiRaw = (options.textField.indexOf(",")>-1);
+                 layui.each(checkStatus.data,function(_index,item){
+                     if(isMutiValue){
+                         var valueFieldArray = options.valueField.split(",");
+                         layui.each(valueFieldArray,function(_indexField,_itemField){
+                             value += item[_itemField] + (options.valueSep?options.valueSep:' ');
+                         });
+                         value+= ",";
+                     }else {
+                         value += item[options.valueField] + ",";
+                     }
+                     if(isMutiRaw) {
+                         var rawFieldArray = options.textField.split(",");
+                         layui.each(rawFieldArray,function(_indexField,_itemField){
+                             rawValue += item[_itemField] + (options.textSep?options.textSep:' ');
+                         });
+                         rawValue+= ",";
+                     }else{
+                         rawValue += item[options.textField] + ",";
+                     }
+                 });
+                 if($webUtil.endWith(value,",")){
+                     value = value.substring(0,value.length - 1);
+                 }
+                 if($webUtil.endWith(rawValue,",")){
+                    rawValue = rawValue.substring(0,rawValue.length -1);
+                 }
+                 selectValue = {
+                    value : value,
+                    rawValue : rawValue,
+                    allValues: checkStatus.data
+                 };
+                 return selectValue;
+             }else{
+                 return false;
+             }
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/refer/SmWorkTypeRefer.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/refer/SmWorkTypeRefer.js
new file mode 100644
index 0000000..1932a0c
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/refer/SmWorkTypeRefer.js
@@ -0,0 +1,59 @@
+/**
+ * 宸ョ鐨勫弬鐓�
+ * @author weidy
+ * @date 2021-1-9
+ */
+layui.define(['layer','vciWebReferGrid'],function(exports){
+	var ReferGrid = function(){
+		this.backPath = (configData.compatibility?path:configData.frameworkPath);
+	};
+	ReferGrid.prototype.showReferDialog = function (referConfig){
+		//鍙渶瑕佽缃粯璁ょ殑鍊硷紝璋冪敤VciWebReferGrid鍗冲彲
+		var that = this;
+		referConfig.options.url = referConfig.options.url?referConfig.options.url:'smWorkTypeController/refDataGrid';
+		referConfig.options.backPath = referConfig.options.backPath?referConfig.options.backPath:that.backPath;
+		if(!("method" in referConfig.options)){
+			referConfig.options.method = 'get';
+		}
+		if(!("tableConfig" in referConfig.options)){
+			var queryColumns = [{
+				field: 'id',
+				title: '宸ョ缂栧彿'
+			},{
+				field: 'name',
+				title: '宸ョ鍚嶇О'
+			}];
+			referConfig.options.tableConfig = {
+				page: {
+					limit: 15,
+					page: 1
+				},
+				cols: [layui.table.getIndexColumn(), layui.table.getCheckColumn(), {
+					field: 'id',
+					title: '宸ョ缂栧彿',
+					sort:true,
+					width: 150
+				}, {
+					field: 'name',
+					title: '宸ョ鍚嶇О',
+					sort:true,
+					width: 260
+				}, {
+					field: 'description',
+					title: '鎻忚堪',
+					sort:true,
+					width: 200
+				},{
+					field:'secretGradeText',
+					title:'瀵嗙骇',
+					width: 60,
+					hidden:(!configData.controllerSecret)
+				}],
+				queryColumns: queryColumns
+			};
+		}
+		layui.vciWebReferGrid.showReferDialog(referConfig);
+	};
+	var rg = new ReferGrid();
+	exports('refer/SmWorkTypeRefer',rg);
+});
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/refer/WfProcessTemplateRefer.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/refer/WfProcessTemplateRefer.js
new file mode 100644
index 0000000..632873b
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/lay/refer/WfProcessTemplateRefer.js
@@ -0,0 +1,330 @@
+/**
+ * 娴佺▼妯℃澘鍙傜収鐨勫熀纭�椤甸潰
+ * @author weidy
+ * @date 2022-2-18
+ */
+layui.define(['layer','element','form','table'],function(exports){
+    var Class = function(){
+        this.MODELNAME = "refer/WfProcessTemplateRefer";
+        this.moduleKey = "WfProcessTemplateRefer";
+        this.backPath =  (configData.compatibility?path:configData.processServicePath);
+        this.displayType = {
+            processClassify:'processClassify'
+        };
+        this.displayTypeTitle = {
+            processClassify: {
+                title: '娴佺▼妯℃澘鍒嗙被',
+                url: 'processDefineController/referTreeProcessClassify',
+                queryField: 'processClassifyId',
+                queryUserUrl: 'processDefineController/referGridProcessTemplate'
+            }
+        };
+        this.defaultConfig = {
+            displayType:[this.displayType.processClassify],
+            textField:'name',
+            valueField:'oid'
+        };
+        this.showReferDialog = function (referConfig){
+            var filter = referConfig.filter,
+                name = referConfig.name,
+                title = referConfig.title,
+                target = referConfig.target,
+                value = referConfig.value,
+                text = referConfig.text;
+            var options = referConfig.options;
+            var baseOptions = {};
+            for(var key in options){
+                baseOptions[key] = options[key];
+            }
+            baseOptions.filter = filter;
+            baseOptions.name = name;
+            baseOptions.value = value;
+            baseOptions.text = text;
+            baseOptions.title = title;
+            baseOptions.favUser = false;
+            //displayType榛樿鏄儴闂紝瑙掕壊銆備笉闇�瑕佽缃紝鍥犱负閲岄潰浼氳嚜鍔ㄨ缃�
+            baseOptions.setValue = function (filter,name,value,rawValue,isClose,selectRecords){
+                target.setValue(filter,name,value,rawValue,isClose,selectRecords);
+            }
+            this.viewUserInDialog(baseOptions);
+        }
+
+        /**
+         * 鐩存帴鏄剧ず閫夋嫨鐨勫璇濇锛岃繖涓粡甯稿湪鐐瑰嚮鎸夐挳鍚庣殑鍔熻兘閲屼娇鐢�
+         * @param options 閰嶇疆鐨勪俊鎭紝鍖呭惈濡備笅灞炴��
+         *    filter 锛屾爣璇�
+         *    name 锛屾爣璇嗗悕绉�
+         *    displayType:鏄剧ず閫夐」鍗★紝[processTemplate.displayType.processClassify],
+         *   setValue:function (filter,name,value,rawValue,isClose,allSelectValues) {}   璁剧疆鍊肩殑鍥炶皟
+         * @returns 绐楀彛鐨勭储寮曞彿
+         */
+        this.viewUserInDialog = function (options) {
+            //鍦ㄥ璇濇涓�夋嫨鐢ㄦ埛
+            var that = this;
+            options = $.extend(that.defaultConfig,options);
+            options.userUrl = $webUtil.getValueFromObj(options,['url','referUrl'],that.displayTypeTitle.processClassify.queryUserUrl);
+            options.textField = $webUtil.getValueFromObj(options,['textField'],that.defaultConfig.textField);
+            options.valueField = $webUtil.getValueFromObj(options,['valueField'],that.defaultConfig.valueField);
+            var filter = options.filter;
+            var name = options.name;
+            var valueInfo = ($webUtil.isNotNull(options.text)?("宸茶缃殑鍊间负[" +options.text +"]"):'鏈缃��');
+            var referIndex = $webUtil.dialog({
+                title:(options.title?options.title:'璇烽�夋嫨娴佺▼妯℃澘'),
+                btn:['纭畾','鍙栨秷'],
+                content:'<div id="referGrid_toolbar_' + filter + '" layui-filter="referGrid_toolbar_' + filter + '" class="layui-table-toolbar referGrid_toolbar_'+filter+'" style="height:550px;"></div>',
+                area:[(($webUtil.isNotNull(options.width) && options.width*1>1) ?options.width*1 : 1050) +'px',
+                    (($webUtil.isNotNull(options.height) && options.height*1>1) ?options.height*1 : 670) + 'px'],
+                btnBefore:valueInfo,
+                yes:function(index,layero){
+                    var selectValue = that.getSelectValue(filter,name);
+                    if(selectValue){
+                        options.setValue(filter,name,selectValue.value,selectValue.rawValue,true,selectValue.allValues);
+                        layer.close(referIndex);
+                    }
+                },
+                success:function(layero){
+                    that.showGrid(filter,name,options);
+                }
+            });
+            return referIndex;
+        };
+        this.setConfig=function(filter,name,options){
+            var that = this;
+            if(!that.referConfig){
+                that.referConfig = {};
+            }
+            that.referConfig[filter + "_" + name] = options;
+        };
+        this.getConfig=function(filter,name){
+            var that = this;
+            if(!that.referConfig){
+                that.referConfig = {};
+            }
+            if((filter + "_" + name) in that.referConfig){
+                return that.referConfig[filter + "_" + name];
+            }
+        };
+        this.showGrid =function (filter,name,options) {
+            //鏄剧ず
+            var that = this;
+            that.setConfig(filter,name,options);
+            var contentFilter = filter + "_" + name;
+            var typeHtml=['<div data-options="region:\'west\',split:true,minWidth:40,maxWidth:600" style="width:350px;background-color:#ffffff;display:',options.onlyTable?'none':'block','">',
+                        '<div lay-filter="referTree_' + contentFilter + '" class="layui-tab layui-tab-card" lay-allowClose="false" style="margin-top: 0">',
+                            '<ul class="layui-tab-title" lay-allowClose="false">'];
+            var tabHtml = [];
+            var tabContentHtml = [];
+            if(options.displayType) {
+                layui.each(options.displayType, function (_index, _item) {
+                    tabHtml.push('<li ' + ((!options.favUser&&_index == 0)?' class="layui-this" ':'') + '>' +  that.displayTypeTitle[_item].title + '</li>');
+                    tabContentHtml.push([
+                        '<div class="layui-tab-item',((!options.favUser&&_index == 0)?' layui-show':''),'">',
+                        '<ul layui-filter="', _item, '_', contentFilter, '" style="border:0px solid #6886ff;overflow-x:auto"></ul>',
+                        '</div>'].join(''));
+                });
+            }
+            typeHtml.push(tabHtml.join(''));
+            typeHtml.push('</ul>');
+            typeHtml.push('<div class="layui-tab-content">');
+            typeHtml.push(tabContentHtml.join(''));
+            typeHtml.push( '</div>');
+            typeHtml.push(    '</div>');
+            typeHtml.push('</div>');
+            var content= [
+                '<div class="layui-layout-border vciWebReferGridInDojo easyui-layout" data-options="fit:true" style="">',
+                    typeHtml.join(''),
+                    //'<div class="layui-layout" style="margin-left:',options.onlyTable?'5':'355','px;">',
+                    '<div class="layui-layout" data-options="region:\'center\'">',
+                         '<div layui-filter="referGrid_toolbar_',contentFilter, '" class="layui-btn-container">',//涓诲垪琛ㄧ殑鎸夐挳
+                    '</div>',
+                    '<div class="layui-center">',
+                        '<table class="layui-table layui-referGrid" lay-size="sm" lay-even layui-filter="referGrid_' + contentFilter + '" id="referGrid_' + contentFilter + '" ></table>',//涓诲垪琛�
+                    '</div>',
+                '</div>',
+            ];
+            $("#referGrid_toolbar_"+ filter ).html(content.join(''));
+            $('.vciWebReferGridInDojo').css({'width':$("#referGrid_toolbar_"+ filter ).parent().width()-10}).layout();
+            if(options.displayType) {
+                layui.each(options.displayType, function (_index, _item) {
+                    that.showTree(_item ,filter,name);
+                });
+            }
+            var tableId = 'referGrid_' + filter + '_' + name;
+            var table = layui.table;
+            var isMuti = options.isMuti;
+            var requestData = options.where || {};
+            //鍙互瀹氫箟琛ㄦ牸浜�
+            table.render({
+                elem:'#referGrid_' + filter + '_' + name,
+                id:tableId,
+                url:(options.userUrl?options.userUrl:that.displayTypeTitle.processClassify.queryUserUrl),
+                page:{
+                    limit: 15,
+                    page: 1
+                },
+                backPath:(options.backPath?options.backPath:that.backPath),
+                height: '475px',
+                where:requestData,
+                method:'get',
+                selectMode:(isMuti?table.selectMode.muti:table.selectMode.single),
+                cols:[[table.getIndexColumn(),table.getCheckColumn(),
+                    {
+                        field: 'name',
+                        title: '娴佺▼妯℃澘鍚嶇О',
+                        width: 200
+                    }, {
+                        field: 'key',
+                        title: '妯℃澘key',
+                        width: 150
+                    },{
+                        field:'version',
+                        title:'鐗堟湰鍙�',
+                        width:70
+                    }]]
+            });
+            var queryColumns = [ {
+                field: 'name',
+                title: '妯℃澘鍚嶇О'
+            }];
+            that.showSearchHtml(queryColumns,tableId,filter,name,requestData);
+        };
+        this.showTree = function (displayType,filter,name) {
+            var that = this;
+            var tree = layui.tree;
+            var requestData = {};
+            var options = that.getConfig(filter,name);
+            var url = that.displayTypeTitle[displayType].url;
+            //鏄剧ずtree
+            var treeOptions = {
+                url:url,
+                extraParams:requestData,
+                treeFilter:filter,
+                treeName:name,
+                showSearch:true,
+                backPath:(options.backPath?options.backPath:that.backPath),
+                noApi:true,
+                loadType:tree.loadType.all,
+                click:function(item,elem,treeOptions){
+                    that.treeDoClick(item,elem,treeOptions,displayType,filter,name);
+                    return false;
+                }
+            };
+            tree.init(displayType + "_" + filter+'_'+name,$('[layui-filter="'+ displayType + "_" + filter+'_'+name + '"]'),treeOptions);
+        };
+        this.treeDoClick = function (item,elem,option,displayType,filter,name) {
+            var that = this;
+            var tableId = 'referGrid_' + filter + '_' + name;
+            var where = {};
+            where[that.displayTypeTitle[displayType].queryField] = item.text;
+            var tableUrl = that.displayTypeTitle[displayType].queryUserUrl;
+            layui.table.reload(tableId,{
+                url:tableUrl,
+                where:where
+            });
+        };
+        this.showSearchHtml = function (queryColumns,tableId,filter,name,requestData) {
+            var that = this;
+            var table = layui.table;
+            var toolbarElem = $('[layui-filter="referGrid_toolbar_' + filter + '_' + name +'"]');
+            if(queryColumns){
+                var toolbarHtml = '<div class="layui-form-item" style="height:24px;margin:5px 5px 0 5px;display:inline-block"> '
+                    + '<div class="layui-input-inline" style="height:24px;line-height:24px;width:120px;min-width: 120px"><select name="referGrid_search_'+ filter + '_' + name +'" style="height:24px;width:120px;padding-right:30px;font-size:15px;">';
+                layui.each(queryColumns,function(_index,queryRecord){
+                    toolbarHtml += '<option value="' + queryRecord.field + '" >' + queryRecord.title + '</option>';
+                });
+                toolbarHtml += '</select></div>';
+                toolbarHtml += '<div class="layui-input-inline"><input type="text" style="height:24px;font-size:14px;" name="referGrid_searchvalue_'+ filter + '_' + name +'" placeholder="杈撳叆鍊煎悗鍥炶溅杩涜妯$硦鏌ヨ" class="layui-input" ></div>';
+                toolbarHtml += '<div class="layui-input-inline" ><button class="layui-btn" style="height:24px;line-height:24px;margin: 0" name="referGrid_searchbtn_'+ filter + '_' + name +'" >鏌ヨ</button></div>';
+                toolbarHtml += '</div>';
+                toolbarElem.html(toolbarHtml);
+                layui.form.render('select');
+                $('[name="referGrid_searchvalue_' + filter + "_" + name + '"]').keydown(function (e){
+                    if(e.keyCode == 13){
+                        var searchField = $(this).parent().parent().find('select').val();
+                        var searchValue = $(this).val();
+                        searchValue = "*" + searchValue + "*";
+                        requestData[searchField] = searchValue;
+                        table.reload(
+                            tableId, {
+                                where: requestData
+                            }
+                        );
+                    }
+                });
+                $('[name="referGrid_searchbtn_'+ filter + '_' + name +'"]').click(function(){
+                    var searchField = $(this).parent().parent().find('select').val();
+                    var searchValue = $(this).parent().parent().find('[name="referGrid_searchvalue_' + filter + '_' + name + '"]').val();
+                    searchValue = "*" + searchValue + "*";
+                    requestData[searchField] = searchValue;
+                    table.reload(
+                        tableId, {
+                            where: requestData
+                        }
+                    );
+                });
+            }
+        };
+        this.destory = function (filter,name) {
+            //閿�姣�
+            var that = this;
+            if($('#referGrid_' + filter + '_' + name)){
+                $('#referGrid_' + filter + '_' + name).remove();
+            }
+        };
+        this.getSelectValue = function (filter,name) {
+             var that = this;
+             var table = layui.table;
+             var selectValue = {};
+             var checkStatus = table.checkStatus('referGrid_' + filter + "_" + name);
+             var options = that.getConfig(filter,name);
+             if(checkStatus.data.length>0){
+                 if(!options.isMuti && checkStatus.data.length > 1){
+                     $webUtil.showErrorMsg("鍙兘閫夋嫨涓�鏉℃暟鎹�");
+                     return false;
+                 }
+                 var value = "";
+                 var rawValue = "";
+                 options.valueField = options.valueField?options.valueField:that.defaultConfig.valueField;
+                 options.textField = options.textField?options.textField:that.defaultConfig.textField;
+                 var isMutiValue = (options.valueField.indexOf(",")>-1);
+                 var isMutiRaw = (options.textField.indexOf(",")>-1);
+                 layui.each(checkStatus.data,function(_index,item){
+                     if(isMutiValue){
+                         var valueFieldArray = options.valueField.split(",");
+                         layui.each(valueFieldArray,function(_indexField,_itemField){
+                             value += item[_itemField] + (options.valueSep?options.valueSep:' ');
+                         });
+                         value+= ",";
+                     }else {
+                         value += item[options.valueField] + ",";
+                     }
+                     if(isMutiRaw) {
+                         var rawFieldArray = options.textField.split(",");
+                         layui.each(rawFieldArray,function(_indexField,_itemField){
+                             rawValue += item[_itemField] + (options.textSep?options.textSep:' ');
+                         });
+                         rawValue+= ",";
+                     }else{
+                         rawValue += item[options.textField] + ",";
+                     }
+                 });
+                 if($webUtil.endWith(value,",")){
+                     value = value.substring(0,value.length - 1);
+                 }
+                 if($webUtil.endWith(rawValue,",")){
+                    rawValue = rawValue.substring(0,rawValue.length -1);
+                 }
+                 selectValue = {
+                    value : value,
+                    rawValue : rawValue,
+                    allValues: checkStatus.data
+                 };
+                 return selectValue;
+             }else{
+                 return false;
+             }
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/layui.js b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/layui.js
new file mode 100644
index 0000000..3cce488
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/layui-2.2.5-debug/layui.js
@@ -0,0 +1,640 @@
+/*!
+
+ @Title: Layui
+ @Description锛氱粡鍏告ā鍧楀寲鍓嶇妗嗘灦
+ @Site: www.layui.com
+ @Author: 璐ゅ績
+ @License锛歁IT
+
+ */
+ 
+;!function(win){
+  "use strict";
+
+  var doc = document, config = {
+    modules: {} //璁板綍妯″潡鐗╃悊璺緞
+    ,status: {} //璁板綍妯″潡鍔犺浇鐘舵��
+    ,timeout: 10 //绗﹀悎瑙勮寖鐨勬ā鍧楄姹傛渶闀跨瓑寰呯鏁�
+    ,event: {} //璁板綍妯″潡鑷畾涔変簨浠�
+  }
+
+  ,Layui = function(){
+    this.v = '2.2.5'; //鐗堟湰鍙�
+  }
+
+  //鑾峰彇layui鎵�鍦ㄧ洰褰�
+  ,getPath = function(){
+    var jsPath = doc.currentScript ? doc.currentScript.src : function(){
+      var js = doc.scripts
+      ,last = js.length - 1
+      ,src;
+      for(var i = last; i > 0; i--){
+        if(js[i].readyState === 'interactive'){
+          src = js[i].src;
+          break;
+        }
+      }
+      return src || js[last].src;
+    }();
+    return jsPath.substring(0, jsPath.lastIndexOf('/') + 1);
+  }()
+
+  //寮傚父鎻愮ず
+  ,error = function(msg){
+    win.console && console.error && console.error('Layui hint: ' + msg);
+  }
+
+  ,isOpera = typeof opera !== 'undefined' && opera.toString() === '[object Opera]'
+
+  //鍐呯疆妯″潡
+  ,modules = {
+    lay: 'modules/lay' //鍩虹 DOM 鎿嶄綔
+    ,layer: 'modules/layer' //寮瑰眰
+    ,laydate: 'modules/laydate' //鏃ユ湡
+    ,laypage: 'modules/laypage' //鍒嗛〉
+    ,laytpl: 'modules/laytpl' //妯℃澘寮曟搸
+    ,layim: 'modules/layim' //web閫氳
+    ,layedit: 'modules/layedit' //瀵屾枃鏈紪杈戝櫒
+    ,form: 'modules/form' //琛ㄥ崟闆�
+    ,upload: 'modules/upload' //涓婁紶
+    ,dropdown: 'modules/dropdown' //涓嬫媺鑿滃崟
+    ,tree: 'modules/tree' //鏍戠粨鏋�
+    ,table: 'modules/table' //琛ㄦ牸
+    ,element: 'modules/element' //甯哥敤鍏冪礌鎿嶄綔
+    ,util: 'modules/util' //宸ュ叿鍧�
+    ,flow: 'modules/flow' //娴佸姞杞�
+    ,carousel: 'modules/carousel' //杞挱
+    ,code: 'modules/code' //浠g爜淇グ鍣�
+    ,jquery: 'modules/jquery' //DOM搴擄紙绗笁鏂癸級
+    ,dltable:'modules/dltable'
+    ,treeGrid:'modules/treeGrid'
+    ,mobile: 'modules/mobile' //绉诲姩澶фā鍧� | 鑻ュ綋鍓嶄负寮�鍙戠洰褰曪紝鍒欎负绉诲姩妯″潡鍏ュ彛锛屽惁鍒欎负绉诲姩妯″潡闆嗗悎
+    ,'layui.all': '../layui.all', //PC妯″潡鍚堝苟鐗�
+    transfer:'modules/transfer',//绌挎妗�
+    transferTable:'modules/transferTable',//绌挎琛ㄦ牸
+    rate:'modules/rate',//璇勫垎
+    echarts:'modules/echarts',//echarts
+    vciWebComboxStore:'framework/vciWebComboxStore',       //vci娣诲姞鐨勫叕鐢ㄧ殑缁勪欢
+    vciWebDataGrid:'framework/vciWebDataGrid',//閫氳繃瀹氫箟鐨勮〃鏍�
+    vciWebMenu:'framework/vciWebMenu',//鑿滃崟
+    vciWebPortal:'framework/vciWebPortal',//闂ㄦ埛
+    vciWebPortalDojoUI:'framework/vciWebPortalDojoUI',//闂ㄦ埛,鍙嫋鍔ㄦ敼鍙樺垎鍖哄ぇ灏�
+    vciWebRefer:'framework/vciWebRefer',//鍙傜収
+    vciWebReferGrid:'framework/vciWebReferGrid',//鍒楄〃鍙傜収
+    vciWebReferTree:'framework/vciWebReferTree',//鏍戝舰鍙傜収
+    vciWebReferStand:'framework/vciWebReferStand',//UI涓婁笅鏂囧弬鐓�
+    vciWebReferDefalut:'framework/vciWebReferDefalut',//鎸囧畾鍒楃殑鍒楄〃鍙傜収
+    vciWebReferClassify:'framework/vciWebReferClassify',//鍒嗙被鍙傜収
+    vciWebCheckSession:'framework/vciWebCheckSession',//妫�鏌ヤ細璇濇槸鍚﹁秴鏃�
+    vciWebDataRightCheck:'framework/vciWebDataRightCheck',//鏁版嵁鏉冮檺
+    vciWebFileManager:'framework/vciWebFileManager',//鏂囦欢缁勪欢
+    referConfig:'framework/referConfig',//鍙傜収閰嶇疆
+    formulaEditor:'framework/formulaEditor',//鍏紡缂栬緫鍣�
+    FilePreviewBase:'filepreview/FilePreviewBase',//鏂囦欢棰勮鐨勫熀纭�缁勪欢
+    vciFilePreview:'framework/vciFilePreview',//鏂囦欢棰勮缁勪欢
+    dynamicCondition:'framework/dynamicCondition',//楂樼骇鏌ヨ
+    dcConfig:'framework/dcConfig',//楂樼骇鏌ヨ鎵�闇�鍩虹
+    ImageView:'platform/plugins/ImageView',//鑷畾涔夊浘鐗囧睍绀�
+    'BaseAction':'platform/actions/BaseAction',
+    BaseAddAction: 'platform/actions/BaseAddAction',
+    BaseEditAction: 'platform/actions/BaseEditAction',
+    'BaseDeleteAction':'platform/actions/BaseDeleteAction',
+    'BaseViewAction':'platform/actions/BaseViewAction',
+    'BaseTabViewAction':'platform/actions/BaseTabViewAction',
+    'BaseRevisionAction':'platform/actions/BaseRevisionAction',
+    'BaseStartWorkflowAction':'platform/actions/BaseStartWorkflowAction',//娴佺▼鎸夐挳澶勭悊
+    'RefreshAction':'platform/actions/RefreshAction',
+    'BaseLinkAddAction':'platform/actions/BaseLinkAddAction',
+    'BaseLinkEditAction':'platform/actions/BaseLinkEditAction',
+    'BaseLinkDeleteAction':'platform/actions/BaseLinkDeleteAction',
+    'BaseFileDownloadAction':'platform/actions/BaseFileDownloadAction',//鏂囦欢涓嬭浇鎸夐挳澶勭悊
+    'BaseFileUploadAction':'platform/actions/BaseFileUploadAction',//鏂囦欢涓婁紶鎸夐挳澶勭悊
+    vciWebOnlineUser:'framework/vciWebOnlineUser',//鍦ㄧ嚎鐢ㄦ埛
+    "vciWebPortalHome":"framework/vciWebPortalHome",//棣栭〉
+    "process/vciWebProExecuteTask":"process/vciWebProExecuteTask",//jbpm娴佺▼鐨勯〉闈�
+    "process/vciWebProProxy":"process/vciWebProProxy",
+    "process/vciWebProUndoTab":"process/vciWebProUndoTab",
+    "process/vciWebStartProcess":"process/vciWebStartProcess",
+    "process/vciWebProHistory":"process/vciWebProHistory",
+    "process/vciWebProMonitor":"process/vciWebProMonitor"
+  };
+
+  //璁板綍鍩虹鏁版嵁
+  Layui.prototype.cache = config;
+
+  //瀹氫箟妯″潡
+  Layui.prototype.define = function(deps, factory){
+    var that = this
+    ,type = typeof deps === 'function'
+    ,callback = function(){
+      var setApp = function(app, exports){
+        layui[app] = exports;
+        config.status[app] = true;
+      };
+      typeof factory === 'function' && factory(function(app, exports){
+        setApp(app, exports);
+        config.callback[app] = function(){
+          factory(setApp);
+        }
+      });
+      return this;
+    };
+    
+    type && (
+      factory = deps,
+      deps = []
+    );
+    
+    if(layui['layui.all'] || (!layui['layui.all'] && layui['layui.mobile'])){
+      return callback.call(that);
+    }
+
+    that.use(deps, callback);
+    return that;
+  };
+
+  //浣跨敤鐗瑰畾妯″潡
+  Layui.prototype.use = function(apps, callback, exports){
+    var that = this
+    ,dir = config.dir = config.dir ? config.dir : getPath
+    ,head = doc.getElementsByTagName('head')[0];
+
+    apps = typeof apps === 'string' ? [apps] : apps;
+    
+    //濡傛灉椤甸潰宸茬粡瀛樺湪jQuery1.7+搴撲笖鎵�瀹氫箟鐨勬ā鍧椾緷璧杍Query锛屽垯涓嶅姞杞藉唴閮╦query妯″潡
+    if(window.jQuery && jQuery.fn.on){
+      that.each(apps, function(index, item){
+        if(item === 'jquery'){
+          apps.splice(index, 1);
+        }
+      });
+      layui.jquery = layui.$ = jQuery;
+    }
+    
+    var item = apps[0]
+    ,timeout = 0;
+    exports = exports || [];
+
+    //闈欐�佽祫婧恏ost
+    config.host = config.host || (dir.match(/\/\/([\s\S]+?)\//)||['//'+ location.host +'/'])[0];
+    if(config.host.indexOf('http')!=0){
+      config.host='http:'+config.host
+    }
+    
+    //鍔犺浇瀹屾瘯
+    function onScriptLoad(e, url){
+      var readyRegExp = navigator.platform === 'PLaySTATION 3' ? /^complete$/ : /^(complete|loaded)$/
+      if (e.type === 'load' || (readyRegExp.test((e.currentTarget || e.srcElement).readyState))) {
+        config.modules[item] = url;
+        head.removeChild(node);
+        (function poll() {
+          if(++timeout > config.timeout * 1000 / 4){
+            return error(item + ' is not a valid module' + ';url=' + url);
+          };
+          config.status[item] ? onCallback() : setTimeout(poll, 4);
+        }());
+      }
+    }
+    
+    //鍥炶皟
+    function onCallback(){
+      exports.push(layui[item]);
+      apps.length > 1 ?
+        that.use(apps.slice(1), callback, exports)
+      : ( typeof callback === 'function' && callback.apply(layui, exports) );
+    }
+    
+    //濡傛灉浣跨敤浜� layui.all.js
+    if(apps.length === 0 
+    || (layui['layui.all'] && modules[item]) 
+    || (!layui['layui.all'] && layui['layui.mobile'] && modules[item])
+    ){
+      return onCallback(), that;
+    }
+
+    //棣栨鍔犺浇妯″潡
+    item=item.replace(/^\/+/,'');
+    if(!config.modules[item]){
+      var node = doc.createElement('script');
+      if(item.indexOf("platform")==0 || item.indexOf("/platform")==0
+         || item.indexOf("portal") == 0 || item.indexOf("/portal") == 0
+          || item.indexOf("process") == 0 || item.indexOf("/process") == 0
+          || item.indexOf("framework") == 0 || item.indexOf("/framework") == 0){
+          if(!(item in that.modules)){
+            //璇存槑鏄钩鍙扮殑鍐呭
+            that.modules[item] = item;
+          }
+      }
+      if(item.indexOf("USEJS://")==0 || item.indexOf("USEJS:")==0){
+        item=item.replace(/USEJS:\/*/,'');
+      }
+      //濡傛灉鏄唴缃ā鍧楋紝鍒欐寜鐓� dir 鍙傛暟鎷兼帴妯″潡璺緞
+      //濡傛灉鏄墿灞曟ā鍧楋紝鍒欏垽鏂ā鍧楄矾寰勫�兼槸鍚︿负 {/} 寮�澶达紝
+      //濡傛灉璺緞鍊兼槸 {/} 寮�澶达紝鍒欐ā鍧楄矾寰勫嵆涓哄悗闈㈢揣璺熺殑瀛楃銆�
+      //鍚﹀垯锛屽垯鎸夌収 index 鍙傛暟鎷兼帴妯″潡璺緞
+      var url = ( that.modules[item] ? (dir + 'lay/')
+        : (/^\{\/\}/.test(that.modules[item]) ? '' : (config.base || ''))
+      ) + (that.modules[item] || item) + '.js';
+
+      url = url.replace(/^\{\/\}/, '');
+      
+      node.async = true;
+      node.charset = 'utf-8';
+      node.src = url + function(){
+        var version = config.version === true 
+        ? (config.v || (new Date()).getTime())
+        : (config.version||'');
+        return version ? ('?v=' + version) : '';
+      }();
+      
+      head.appendChild(node);
+      
+      if(node.attachEvent && !(node.attachEvent.toString && node.attachEvent.toString().indexOf('[native code') < 0) && !isOpera){
+        node.attachEvent('onreadystatechange', function(e){
+          onScriptLoad(e, url);
+        });
+      } else {
+        node.addEventListener('load', function(e){
+          onScriptLoad(e, url);
+        }, false);
+      }
+      
+      config.modules[item] = url;
+    } else { //缂撳瓨
+      (function poll() {
+        if(++timeout > config.timeout * 1000 / 4){
+          return error(item + ' is not a valid module');
+        };
+        (typeof config.modules[item] === 'string' && config.status[item]) 
+        ? onCallback() 
+        : setTimeout(poll, 4);
+      }());
+    }
+    
+    return that;
+  };
+
+  //鑾峰彇鑺傜偣鐨剆tyle灞炴�у��
+  Layui.prototype.getStyle = function(node, name){
+    var style = node.currentStyle ? node.currentStyle : win.getComputedStyle(node, null);
+    return style[style.getPropertyValue ? 'getPropertyValue' : 'getAttribute'](name);
+  };
+
+  //css澶栭儴鍔犺浇鍣�
+  Layui.prototype.link = function(href, fn, cssname){
+    var that = this
+    ,link = doc.createElement('link')
+    ,head = doc.getElementsByTagName('head')[0];
+    
+    if(typeof fn === 'string') cssname = fn;
+    
+    var app = (cssname || href).replace(/\.|\//g, '')
+    ,id = link.id = 'layuicss-'+app
+    ,timeout = 0;
+    
+    link.rel = 'stylesheet';
+    link.href = href + (config.debug ? '?v='+new Date().getTime() : '');
+    link.media = 'all';
+    
+    if(!doc.getElementById(id)){
+      head.appendChild(link);
+    }
+
+    if(typeof fn !== 'function') return that;
+    
+    //杞css鏄惁鍔犺浇瀹屾瘯
+    (function poll() {
+      if(++timeout > config.timeout * 1000 / 100){
+        return error(href + ' timeout');
+      };
+      parseInt(that.getStyle(doc.getElementById(id), 'width')) === 1989 ? function(){
+        fn();
+      }() : setTimeout(poll, 100);
+    }());
+    
+    return that;
+  };
+  
+  //瀛樺偍妯″潡鐨勫洖璋�
+  config.callback = {};
+  
+  //閲嶆柊鎵ц妯″潡鐨勫伐鍘傚嚱鏁�
+  Layui.prototype.factory = function(modName){
+    if(layui[modName]){
+      return typeof config.callback[modName] === 'function' 
+        ? config.callback[modName]
+      : null;
+    }
+  };
+
+  //css鍐呴儴鍔犺浇鍣�
+  Layui.prototype.addcss = function(firename, fn, cssname){
+    return layui.link(config.dir + 'css/' + firename, fn, cssname);
+  };
+
+  //鍥剧墖棰勫姞杞�
+  Layui.prototype.img = function(url, callback, error) {   
+    var img = new Image();
+    img.src = url; 
+    if(img.complete){
+      return callback(img);
+    }
+    img.onload = function(){
+      img.onload = null;
+      callback(img);
+    };
+    img.onerror = function(e){
+      img.onerror = null;
+      error(e);
+    };  
+  };
+
+  //鍏ㄥ眬閰嶇疆
+  Layui.prototype.config = function(options){
+    options = options || {};
+    for(var key in options){
+      config[key] = options[key];
+    }
+    return this;
+  };
+
+  //璁板綍鍏ㄩ儴妯″潡
+  Layui.prototype.modules = function(){
+    var clone = {};
+    for(var o in modules){
+      clone[o] = modules[o];
+    }
+    return clone;
+  }();
+
+  //鎷撳睍妯″潡
+  Layui.prototype.extend = function(options){
+    var that = this;
+
+    //楠岃瘉妯″潡鏄惁琚崰鐢�
+    options = options || {};
+    for(var o in options){
+      if(that[o] || that.modules[o]){
+        error('\u6A21\u5757\u540D '+ o +' \u5DF2\u88AB\u5360\u7528');
+      } else {
+        that.modules[o] = options[o];
+      }
+    }
+
+    return that;
+  };
+
+  //璺敱瑙f瀽
+  Layui.prototype.router = function(hash){
+    var that = this
+    ,hash = hash || location.hash
+    ,data = {
+      path: []
+      ,search: {}
+      ,hash: (hash.match(/[^#](#.*$)/) || [])[1] || ''
+    };
+    
+    if(!/^#\//.test(hash)) return data; //绂佹闈炶矾鐢辫鑼�
+    data.href = hash = hash.replace(/^#\//, '');
+    hash = hash.replace(/([^#])(#.*$)/, '$1').split('/') || [];
+    
+    //鎻愬彇Hash缁撴瀯
+    that.each(hash, function(index, item){
+      /^\w+=/.test(item) ? function(){
+        item = item.split('=');
+        data.search[item[0]] = item[1];
+      }() : data.path.push(item);
+    });
+    
+    return data;
+  };
+
+  //鏈湴鎸佷箙鎬у瓨鍌�
+  Layui.prototype.data = function(table, settings, storage){
+    table = table || 'layui';
+    storage = storage || localStorage;
+    
+    if(!win.JSON || !win.JSON.parse) return;
+    
+    //濡傛灉settings涓簄ull锛屽垯鍒犻櫎琛�
+    if(settings === null){
+      return delete storage[table];
+    }
+    
+    settings = typeof settings === 'object' 
+      ? settings 
+    : {key: settings};
+    
+    try{
+      var data = JSON.parse(storage[table]);
+    } catch(e){
+      var data = {};
+    }
+    
+    if('value' in settings) data[settings.key] = settings.value;
+    if(settings.remove) delete data[settings.key];
+    storage[table] = JSON.stringify(data);
+    
+    return settings.key ? data[settings.key] : data;
+  };
+  
+  //鏈湴浼氳瘽鎬у瓨鍌�
+  Layui.prototype.sessionData = function(table, settings){
+    return this.data(table, settings, sessionStorage);
+  }
+
+  //璁惧淇℃伅
+  Layui.prototype.device = function(key){
+    var agent = navigator.userAgent.toLowerCase()
+
+    //鑾峰彇鐗堟湰鍙�
+    ,getVersion = function(label){
+      var exp = new RegExp(label + '/([^\\s\\_\\-]+)');
+      label = (agent.match(exp)||[])[1];
+      return label || false;
+    }
+    
+    //杩斿洖缁撴灉闆�
+    ,result = {
+      os: function(){ //搴曞眰鎿嶄綔绯荤粺
+        if(/windows/.test(agent)){
+          return 'windows';
+        } else if(/linux/.test(agent)){
+          return 'linux';
+        } else if(/iphone|ipod|ipad|ios/.test(agent)){
+          return 'ios';
+        } else if(/mac/.test(agent)){
+          return 'mac';
+        } 
+      }()
+      ,ie: function(){ //ie鐗堟湰
+        return (!!win.ActiveXObject || "ActiveXObject" in win) ? (
+          (agent.match(/msie\s(\d+)/) || [])[1] || '11' //鐢变簬ie11骞舵病鏈塵sie鐨勬爣璇�
+        ) : false;
+      }()
+      ,weixin: getVersion('micromessenger')  //鏄惁寰俊
+    };
+    
+    //浠绘剰鐨刱ey
+    if(key && !result[key]){
+      result[key] = getVersion(key);
+    }
+    
+    //绉诲姩璁惧
+    result.android = /android/.test(agent);
+    result.ios = result.os === 'ios';
+    
+    return result;
+  };
+
+  //鎻愮ず
+  Layui.prototype.hint = function(){
+    return {
+      error: error
+    }
+  };
+
+  //閬嶅巻
+  Layui.prototype.each = function(obj, fn){
+    var key
+    ,that = this;
+    if(typeof fn !== 'function') return that;
+    obj = obj || [];
+    if(obj.constructor === Object){
+      for(key in obj){
+        if(fn.call(obj[key], key, obj[key])) break;
+      }
+    } else {
+      for(key = 0; key < obj.length; key++){
+        if(fn.call(obj[key], key, obj[key])) break;
+      }
+    }
+    return that;
+  };
+
+  //灏嗘暟缁勪腑鐨勫璞℃寜鍏舵煇涓垚鍛樻帓搴�
+  Layui.prototype.sort = function(obj, key, desc){
+    var clone = JSON.parse(
+      JSON.stringify(obj || [])
+    );
+    
+    if(!key) return clone;
+    
+    //濡傛灉鏄暟瀛楋紝鎸夊ぇ灏忔帓搴忥紝濡傛灉鏄潪鏁板瓧锛屾寜瀛楀吀搴忔帓搴�
+    clone.sort(function(o1, o2){
+      var isNum = /^-?\d+$/
+      ,v1 = o1[key]
+      ,v2 = o2[key];
+      
+      if(isNum.test(v1)) v1 = parseFloat(v1);
+      if(isNum.test(v2)) v2 = parseFloat(v2);
+      
+      if(v1 && !v2){
+        return 1;
+      } else if(!v1 && v2){
+        return -1;
+      }
+        
+      if(v1 > v2){
+        return 1;
+      } else if (v1 < v2) {
+        return -1;
+      } else {
+        return 0;
+      }
+    });
+
+    desc && clone.reverse(); //鍊掑簭
+    return clone;
+  };
+
+  //typeof 绫诲瀷缁嗗垎 -> string/number/boolean/undefined/null銆乷bject/array/function/鈥�
+  Layui.prototype._typeof = function(operand){
+    if(operand === null) return String(operand);
+
+    //缁嗗垎寮曠敤绫诲瀷
+    return (typeof operand === 'object' || typeof operand === 'function') ? function(){
+      var type = Object.prototype.toString.call(operand).match(/\s(.+)\]$/) || [] //鍖归厤绫诲瀷瀛楃
+          ,classType = 'Function|Array|Date|RegExp|Object|Error|Symbol'; //甯歌绫诲瀷瀛楃
+
+      type = type[1] || 'Object';
+
+      //闄ゅ尮閰嶅埌鐨勭被鍨嬪锛屽叾浠栧璞″潎杩斿洖 object
+      return new RegExp('\\b('+ classType + ')\\b').test(type)
+          ? type.toLowerCase()
+          : 'object';
+    }() : typeof operand;
+  };
+
+  //瀵硅薄鏄惁鍏峰鏁扮粍缁撴瀯锛堟澶勪负鍏煎 jQuery 瀵硅薄锛�
+  Layui.prototype._isArray = function(obj){
+    var that = this
+        ,len
+        ,type = that._typeof(obj);
+
+    if(!obj || (typeof obj !== 'object') || obj === win) return false;
+
+    len = 'length' in obj && obj.length; //鍏煎 ie
+    return type === 'array' || len === 0 || (
+        typeof len === 'number' && len > 0 && (len - 1) in obj //鍏煎 jQuery 瀵硅薄
+    );
+  };
+
+  //闃绘浜嬩欢鍐掓场
+  Layui.prototype.stope = function(thisEvent){
+    thisEvent = thisEvent || win.event;
+    try { thisEvent.stopPropagation() } catch(e){
+      thisEvent.cancelBubble = true;
+    }
+  };
+
+  //鑷畾涔夋ā鍧椾簨浠�
+  Layui.prototype.onevent = function(modName, events, callback){
+    if(typeof modName !== 'string' 
+    || typeof callback !== 'function') return this;
+
+    return Layui.event(modName, events, null, callback);
+  };
+
+  //鎵ц鑷畾涔夋ā鍧椾簨浠�
+  Layui.prototype.event = Layui.event = function(modName, events, params, fn){
+    var that = this
+    ,result = null
+    ,filter = events.match(/\((.*)\)$/)||[] //鎻愬彇浜嬩欢杩囨护鍣ㄥ瓧绗︾粨鏋勶紝濡傦細select(xxx)
+    ,eventName = (modName + '.'+ events).replace(filter[0], '') //鑾峰彇浜嬩欢鍚嶇О锛屽锛歠orm.select
+    ,filterName = filter[1] || '' //鑾峰彇杩囨护鍣ㄥ悕绉�,锛屽锛歺xx
+    ,callback = function(_, item){
+      var res = item && item.call(that, params);
+      res === false && result === null && (result = false);
+    };
+    
+    //娣诲姞浜嬩欢
+    if(fn){
+      config.event[eventName] = config.event[eventName] || {};
+
+      //杩欓噷涓嶅啀瀵瑰娆′簨浠剁洃鍚仛鏀寔锛岄伩鍏嶆洿澶氶夯鐑�
+      //config.event[eventName][filterName] ? config.event[eventName][filterName].push(fn) : 
+      config.event[eventName][filterName] = [fn];
+      return this;
+    }
+    
+    //鎵ц浜嬩欢鍥炶皟
+    layui.each(config.event[eventName], function(key, item){
+      //鎵ц褰撳墠妯″潡鐨勫叏閮ㄤ簨浠�
+      if(filterName === '{*}'){
+        layui.each(item, callback);
+        return;
+      }
+      
+      //鎵ц鎸囧畾浜嬩欢
+      key === '' && layui.each(item, callback);
+      key === filterName && layui.each(item, callback);
+    });
+    
+    return result;
+  };
+
+  win.layui = new Layui();
+  
+}(window);
+
diff --git a/Source/platformProject/platform2022UI/jslib/markdown/highlight.min.js b/Source/platformProject/platform2022UI/jslib/markdown/highlight.min.js
new file mode 100644
index 0000000..4a9444e
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/markdown/highlight.min.js
@@ -0,0 +1 @@
+var hljs=new function(){function k(v){return v.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;")}function t(v){return v.nodeName.toLowerCase()}function i(w,x){var v=w&&w.exec(x);return v&&v.index==0}function d(v){return Array.prototype.map.call(v.childNodes,function(w){if(w.nodeType==3){return b.useBR?w.nodeValue.replace(/\n/g,""):w.nodeValue}if(t(w)=="br"){return"\n"}return d(w)}).join("")}function r(w){var v=(w.className+" "+(w.parentNode?w.parentNode.className:"")).split(/\s+/);v=v.map(function(x){return x.replace(/^language-/,"")});return v.filter(function(x){return j(x)||x=="no-highlight"})[0]}function o(x,y){var v={};for(var w in x){v[w]=x[w]}if(y){for(var w in y){v[w]=y[w]}}return v}function u(x){var v=[];(function w(y,z){for(var A=y.firstChild;A;A=A.nextSibling){if(A.nodeType==3){z+=A.nodeValue.length}else{if(t(A)=="br"){z+=1}else{if(A.nodeType==1){v.push({event:"start",offset:z,node:A});z=w(A,z);v.push({event:"stop",offset:z,node:A})}}}}return z})(x,0);return v}function q(w,y,C){var x=0;var F="";var z=[];function B(){if(!w.length||!y.length){return w.length?w:y}if(w[0].offset!=y[0].offset){return(w[0].offset<y[0].offset)?w:y}return y[0].event=="start"?w:y}function A(H){function G(I){return" "+I.nodeName+'="'+k(I.value)+'"'}F+="<"+t(H)+Array.prototype.map.call(H.attributes,G).join("")+">"}function E(G){F+="</"+t(G)+">"}function v(G){(G.event=="start"?A:E)(G.node)}while(w.length||y.length){var D=B();F+=k(C.substr(x,D[0].offset-x));x=D[0].offset;if(D==w){z.reverse().forEach(E);do{v(D.splice(0,1)[0]);D=B()}while(D==w&&D.length&&D[0].offset==x);z.reverse().forEach(A)}else{if(D[0].event=="start"){z.push(D[0].node)}else{z.pop()}v(D.splice(0,1)[0])}}return F+k(C.substr(x))}function m(y){function v(z){return(z&&z.source)||z}function w(A,z){return RegExp(v(A),"m"+(y.cI?"i":"")+(z?"g":""))}function x(D,C){if(D.compiled){return}D.compiled=true;D.k=D.k||D.bK;if(D.k){var z={};function E(G,F){if(y.cI){F=F.toLowerCase()}F.split(" ").forEach(function(H){var I=H.split("|");z[I[0]]=[G,I[1]?Number(I[1]):1]})}if(typeof D.k=="string"){E("keyword",D.k)}else{Object.keys(D.k).forEach(function(F){E(F,D.k[F])})}D.k=z}D.lR=w(D.l||/\b[A-Za-z0-9_]+\b/,true);if(C){if(D.bK){D.b=D.bK.split(" ").join("|")}if(!D.b){D.b=/\B|\b/}D.bR=w(D.b);if(!D.e&&!D.eW){D.e=/\B|\b/}if(D.e){D.eR=w(D.e)}D.tE=v(D.e)||"";if(D.eW&&C.tE){D.tE+=(D.e?"|":"")+C.tE}}if(D.i){D.iR=w(D.i)}if(D.r===undefined){D.r=1}if(!D.c){D.c=[]}var B=[];D.c.forEach(function(F){if(F.v){F.v.forEach(function(G){B.push(o(F,G))})}else{B.push(F=="self"?D:F)}});D.c=B;D.c.forEach(function(F){x(F,D)});if(D.starts){x(D.starts,C)}var A=D.c.map(function(F){return F.bK?"\\.?\\b("+F.b+")\\b\\.?":F.b}).concat([D.tE]).concat([D.i]).map(v).filter(Boolean);D.t=A.length?w(A.join("|"),true):{exec:function(F){return null}};D.continuation={}}x(y)}function c(S,L,J,R){function v(U,V){for(var T=0;T<V.c.length;T++){if(i(V.c[T].bR,U)){return V.c[T]}}}function z(U,T){if(i(U.eR,T)){return U}if(U.eW){return z(U.parent,T)}}function A(T,U){return !J&&i(U.iR,T)}function E(V,T){var U=M.cI?T[0].toLowerCase():T[0];return V.k.hasOwnProperty(U)&&V.k[U]}function w(Z,X,W,V){var T=V?"":b.classPrefix,U='<span class="'+T,Y=W?"":"</span>";U+=Z+'">';return U+X+Y}function N(){var U=k(C);if(!I.k){return U}var T="";var X=0;I.lR.lastIndex=0;var V=I.lR.exec(U);while(V){T+=U.substr(X,V.index-X);var W=E(I,V);if(W){H+=W[1];T+=w(W[0],V[0])}else{T+=V[0]}X=I.lR.lastIndex;V=I.lR.exec(U)}return T+U.substr(X)}function F(){if(I.sL&&!f[I.sL]){return k(C)}var T=I.sL?c(I.sL,C,true,I.continuation.top):g(C);if(I.r>0){H+=T.r}if(I.subLanguageMode=="continuous"){I.continuation.top=T.top}return w(T.language,T.value,false,true)}function Q(){return I.sL!==undefined?F():N()}function P(V,U){var T=V.cN?w(V.cN,"",true):"";if(V.rB){D+=T;C=""}else{if(V.eB){D+=k(U)+T;C=""}else{D+=T;C=U}}I=Object.create(V,{parent:{value:I}})}function G(T,X){C+=T;if(X===undefined){D+=Q();return 0}var V=v(X,I);if(V){D+=Q();P(V,X);return V.rB?0:X.length}var W=z(I,X);if(W){var U=I;if(!(U.rE||U.eE)){C+=X}D+=Q();do{if(I.cN){D+="</span>"}H+=I.r;I=I.parent}while(I!=W.parent);if(U.eE){D+=k(X)}C="";if(W.starts){P(W.starts,"")}return U.rE?0:X.length}if(A(X,I)){throw new Error('Illegal lexeme "'+X+'" for mode "'+(I.cN||"<unnamed>")+'"')}C+=X;return X.length||1}var M=j(S);if(!M){throw new Error('Unknown language: "'+S+'"')}m(M);var I=R||M;var D="";for(var K=I;K!=M;K=K.parent){if(K.cN){D=w(K.cN,D,true)}}var C="";var H=0;try{var B,y,x=0;while(true){I.t.lastIndex=x;B=I.t.exec(L);if(!B){break}y=G(L.substr(x,B.index-x),B[0]);x=B.index+y}G(L.substr(x));for(var K=I;K.parent;K=K.parent){if(K.cN){D+="</span>"}}return{r:H,value:D,language:S,top:I}}catch(O){if(O.message.indexOf("Illegal")!=-1){return{r:0,value:k(L)}}else{throw O}}}function g(y,x){x=x||b.languages||Object.keys(f);var v={r:0,value:k(y)};var w=v;x.forEach(function(z){if(!j(z)){return}var A=c(z,y,false);A.language=z;if(A.r>w.r){w=A}if(A.r>v.r){w=v;v=A}});if(w.language){v.second_best=w}return v}function h(v){if(b.tabReplace){v=v.replace(/^((<[^>]+>|\t)+)/gm,function(w,z,y,x){return z.replace(/\t/g,b.tabReplace)})}if(b.useBR){v=v.replace(/\n/g,"<br>")}return v}function p(z){var y=d(z);var A=r(z);if(A=="no-highlight"){return}var v=A?c(A,y,true):g(y);var w=u(z);if(w.length){var x=document.createElementNS("http://www.w3.org/1999/xhtml","pre");x.innerHTML=v.value;v.value=q(w,u(x),y)}v.value=h(v.value);z.innerHTML=v.value;z.className+=" hljs "+(!A&&v.language||"");z.result={language:v.language,re:v.r};if(v.second_best){z.second_best={language:v.second_best.language,re:v.second_best.r}}}var b={classPrefix:"hljs-",tabReplace:null,useBR:false,languages:undefined};function s(v){b=o(b,v)}function l(){if(l.called){return}l.called=true;var v=document.querySelectorAll("pre code");Array.prototype.forEach.call(v,p)}function a(){addEventListener("DOMContentLoaded",l,false);addEventListener("load",l,false)}var f={};var n={};function e(v,x){var w=f[v]=x(this);if(w.aliases){w.aliases.forEach(function(y){n[y]=v})}}function j(v){return f[v]||f[n[v]]}this.highlight=c;this.highlightAuto=g;this.fixMarkup=h;this.highlightBlock=p;this.configure=s;this.initHighlighting=l;this.initHighlightingOnLoad=a;this.registerLanguage=e;this.getLanguage=j;this.inherit=o;this.IR="[a-zA-Z][a-zA-Z0-9_]*";this.UIR="[a-zA-Z_][a-zA-Z0-9_]*";this.NR="\\b\\d+(\\.\\d+)?";this.CNR="(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)";this.BNR="\\b(0b[01]+)";this.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";this.BE={b:"\\\\[\\s\\S]",r:0};this.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[this.BE]};this.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[this.BE]};this.CLCM={cN:"comment",b:"//",e:"$"};this.CBLCLM={cN:"comment",b:"/\\*",e:"\\*/"};this.HCM={cN:"comment",b:"#",e:"$"};this.NM={cN:"number",b:this.NR,r:0};this.CNM={cN:"number",b:this.CNR,r:0};this.BNM={cN:"number",b:this.BNR,r:0};this.REGEXP_MODE={cN:"regexp",b:/\//,e:/\/[gim]*/,i:/\n/,c:[this.BE,{b:/\[/,e:/\]/,r:0,c:[this.BE]}]};this.TM={cN:"title",b:this.IR,r:0};this.UTM={cN:"title",b:this.UIR,r:0}}();hljs.registerLanguage("ruleslanguage",function(a){return{k:{keyword:"BILL_PERIOD BILL_START BILL_STOP RS_EFFECTIVE_START RS_EFFECTIVE_STOP RS_JURIS_CODE RS_OPCO_CODE INTDADDATTRIBUTE|5 INTDADDVMSG|5 INTDBLOCKOP|5 INTDBLOCKOPNA|5 INTDCLOSE|5 INTDCOUNT|5 INTDCOUNTSTATUSCODE|5 INTDCREATEMASK|5 INTDCREATEDAYMASK|5 INTDCREATEFACTORMASK|5 INTDCREATEHANDLE|5 INTDCREATEOVERRIDEDAYMASK|5 INTDCREATEOVERRIDEMASK|5 INTDCREATESTATUSCODEMASK|5 INTDCREATETOUPERIOD|5 INTDDELETE|5 INTDDIPTEST|5 INTDEXPORT|5 INTDGETERRORCODE|5 INTDGETERRORMESSAGE|5 INTDISEQUAL|5 INTDJOIN|5 INTDLOAD|5 INTDLOADACTUALCUT|5 INTDLOADDATES|5 INTDLOADHIST|5 INTDLOADLIST|5 INTDLOADLISTDATES|5 INTDLOADLISTENERGY|5 INTDLOADLISTHIST|5 INTDLOADRELATEDCHANNEL|5 INTDLOADSP|5 INTDLOADSTAGING|5 INTDLOADUOM|5 INTDLOADUOMDATES|5 INTDLOADUOMHIST|5 INTDLOADVERSION|5 INTDOPEN|5 INTDREADFIRST|5 INTDREADNEXT|5 INTDRECCOUNT|5 INTDRELEASE|5 INTDREPLACE|5 INTDROLLAVG|5 INTDROLLPEAK|5 INTDSCALAROP|5 INTDSCALE|5 INTDSETATTRIBUTE|5 INTDSETDSTPARTICIPANT|5 INTDSETSTRING|5 INTDSETVALUE|5 INTDSETVALUESTATUS|5 INTDSHIFTSTARTTIME|5 INTDSMOOTH|5 INTDSORT|5 INTDSPIKETEST|5 INTDSUBSET|5 INTDTOU|5 INTDTOURELEASE|5 INTDTOUVALUE|5 INTDUPDATESTATS|5 INTDVALUE|5 STDEV INTDDELETEEX|5 INTDLOADEXACTUAL|5 INTDLOADEXCUT|5 INTDLOADEXDATES|5 INTDLOADEX|5 INTDLOADEXRELATEDCHANNEL|5 INTDSAVEEX|5 MVLOAD|5 MVLOADACCT|5 MVLOADACCTDATES|5 MVLOADACCTHIST|5 MVLOADDATES|5 MVLOADHIST|5 MVLOADLIST|5 MVLOADLISTDATES|5 MVLOADLISTHIST|5 IF FOR NEXT DONE SELECT END CALL ABORT CLEAR CHANNEL FACTOR LIST NUMBER OVERRIDE SET WEEK DISTRIBUTIONNODE ELSE WHEN THEN OTHERWISE IENUM CSV INCLUDE LEAVE RIDER SAVE DELETE NOVALUE SECTION WARN SAVE_UPDATE DETERMINANT LABEL REPORT REVENUE EACH IN FROM TOTAL CHARGE BLOCK AND OR CSV_FILE RATE_CODE AUXILIARY_DEMAND UIDACCOUNT RS BILL_PERIOD_SELECT HOURS_PER_MONTH INTD_ERROR_STOP SEASON_SCHEDULE_NAME ACCOUNTFACTOR ARRAYUPPERBOUND CALLSTOREDPROC GETADOCONNECTION GETCONNECT GETDATASOURCE GETQUALIFIER GETUSERID HASVALUE LISTCOUNT LISTOP LISTUPDATE LISTVALUE PRORATEFACTOR RSPRORATE SETBINPATH SETDBMONITOR WQ_OPEN BILLINGHOURS DATE DATEFROMFLOAT DATETIMEFROMSTRING DATETIMETOSTRING DATETOFLOAT DAY DAYDIFF DAYNAME DBDATETIME HOUR MINUTE MONTH MONTHDIFF MONTHHOURS MONTHNAME ROUNDDATE SAMEWEEKDAYLASTYEAR SECOND WEEKDAY WEEKDIFF YEAR YEARDAY YEARSTR COMPSUM HISTCOUNT HISTMAX HISTMIN HISTMINNZ HISTVALUE MAXNRANGE MAXRANGE MINRANGE COMPIKVA COMPKVA COMPKVARFROMKQKW COMPLF IDATTR FLAG LF2KW LF2KWH MAXKW POWERFACTOR READING2USAGE AVGSEASON MAXSEASON MONTHLYMERGE SEASONVALUE SUMSEASON ACCTREADDATES ACCTTABLELOAD CONFIGADD CONFIGGET CREATEOBJECT CREATEREPORT EMAILCLIENT EXPBLKMDMUSAGE EXPMDMUSAGE EXPORT_USAGE FACTORINEFFECT GETUSERSPECIFIEDSTOP INEFFECT ISHOLIDAY RUNRATE SAVE_PROFILE SETREPORTTITLE USEREXIT WATFORRUNRATE TO TABLE ACOS ASIN ATAN ATAN2 BITAND CEIL COS COSECANT COSH COTANGENT DIVQUOT DIVREM EXP FABS FLOOR FMOD FREPM FREXPN LOG LOG10 MAX MAXN MIN MINNZ MODF POW ROUND ROUND2VALUE ROUNDINT SECANT SIN SINH SQROOT TAN TANH FLOAT2STRING FLOAT2STRINGNC INSTR LEFT LEN LTRIM MID RIGHT RTRIM STRING STRINGNC TOLOWER TOUPPER TRIM NUMDAYS READ_DATE STAGING",built_in:"IDENTIFIER OPTIONS XML_ELEMENT XML_OP XML_ELEMENT_OF DOMDOCCREATE DOMDOCLOADFILE DOMDOCLOADXML DOMDOCSAVEFILE DOMDOCGETROOT DOMDOCADDPI DOMNODEGETNAME DOMNODEGETTYPE DOMNODEGETVALUE DOMNODEGETCHILDCT DOMNODEGETFIRSTCHILD DOMNODEGETSIBLING DOMNODECREATECHILDELEMENT DOMNODESETATTRIBUTE DOMNODEGETCHILDELEMENTCT DOMNODEGETFIRSTCHILDELEMENT DOMNODEGETSIBLINGELEMENT DOMNODEGETATTRIBUTECT DOMNODEGETATTRIBUTEI DOMNODEGETATTRIBUTEBYNAME DOMNODEGETBYNAME"},c:[a.CLCM,a.CBLCLM,a.ASM,a.QSM,a.CNM,{cN:"array",b:"#[a-zA-Z .]+"}]}});hljs.registerLanguage("ruby",function(e){var h="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?";var g="and false then defined module in return redo if BEGIN retry end for true self when next until do begin unless END rescue nil else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor";var a={cN:"yardoctag",b:"@[A-Za-z]+"};var i={cN:"comment",v:[{b:"#",e:"$",c:[a]},{b:"^\\=begin",e:"^\\=end",c:[a],r:10},{b:"^__END__",e:"\\n$"}]};var c={cN:"subst",b:"#\\{",e:"}",k:g};var d={cN:"string",c:[e.BE,c],v:[{b:/'/,e:/'/},{b:/"/,e:/"/},{b:"%[qw]?\\(",e:"\\)"},{b:"%[qw]?\\[",e:"\\]"},{b:"%[qw]?{",e:"}"},{b:"%[qw]?<",e:">",r:10},{b:"%[qw]?/",e:"/",r:10},{b:"%[qw]?%",e:"%",r:10},{b:"%[qw]?-",e:"-",r:10},{b:"%[qw]?\\|",e:"\\|",r:10},{b:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/}]};var b={cN:"params",b:"\\(",e:"\\)",k:g};var f=[d,i,{cN:"class",bK:"class module",e:"$|;",i:/=/,c:[e.inherit(e.TM,{b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{cN:"inheritance",b:"<\\s*",c:[{cN:"parent",b:"("+e.IR+"::)?"+e.IR}]},i]},{cN:"function",bK:"def",e:" |$|;",r:0,c:[e.inherit(e.TM,{b:h}),b,i]},{cN:"constant",b:"(::)?(\\b[A-Z]\\w*(::)?)+",r:0},{cN:"symbol",b:":",c:[d,{b:h}],r:0},{cN:"symbol",b:e.UIR+"(\\!|\\?)?:",r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{cN:"variable",b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{b:"("+e.RSR+")\\s*",c:[i,{cN:"regexp",c:[e.BE,c],i:/\n/,v:[{b:"/",e:"/[a-z]*"},{b:"%r{",e:"}[a-z]*"},{b:"%r\\(",e:"\\)[a-z]*"},{b:"%r!",e:"![a-z]*"},{b:"%r\\[",e:"\\][a-z]*"}]}],r:0}];c.c=f;b.c=f;return{k:g,c:f}});hljs.registerLanguage("haml",function(a){return{cI:true,c:[{cN:"doctype",b:"^!!!( (5|1\\.1|Strict|Frameset|Basic|Mobile|RDFa|XML\\b.*))?$",r:10},{cN:"comment",b:"^\\s*(!=#|=#|-#|/).*$",r:0},{b:"^\\s*(-|=|!=)(?!#)",starts:{e:"\\n",sL:"ruby"}},{cN:"tag",b:"^\\s*%",c:[{cN:"title",b:"\\w+"},{cN:"value",b:"[#\\.]\\w+"},{b:"{\\s*",e:"\\s*}",eE:true,c:[{b:":\\w+\\s*=>",e:",\\s+",rB:true,eW:true,c:[{cN:"symbol",b:":\\w+"},{cN:"string",b:'"',e:'"'},{cN:"string",b:"'",e:"'"},{b:"\\w+",r:0}]}]},{b:"\\(\\s*",e:"\\s*\\)",eE:true,c:[{b:"\\w+\\s*=",e:"\\s+",rB:true,eW:true,c:[{cN:"attribute",b:"\\w+",r:0},{cN:"string",b:'"',e:'"'},{cN:"string",b:"'",e:"'"},{b:"\\w+",r:0}]},]}]},{cN:"bullet",b:"^\\s*[=~]\\s*",r:0},{b:"#{",starts:{e:"}",sL:"ruby"}}]}});hljs.registerLanguage("haskell",function(f){var g={cN:"comment",v:[{b:"--",e:"$"},{b:"{-",e:"-}",c:["self"]}]};var e={cN:"pragma",b:"{-#",e:"#-}"};var b={cN:"preprocessor",b:"^#",e:"$"};var d={cN:"type",b:"\\b[A-Z][\\w']*",r:0};var c={cN:"container",b:"\\(",e:"\\)",i:'"',c:[e,g,b,{cN:"type",b:"\\b[A-Z][\\w]*(\\((\\.\\.|,|\\w+)\\))?"},f.inherit(f.TM,{b:"[_a-z][\\w']*"})]};var a={cN:"container",b:"{",e:"}",c:c.c};return{k:"let in if then else case of where do module import hiding qualified type data newtype deriving class instance as default infix infixl infixr foreign export ccall stdcall cplusplus jvm dotnet safe unsafe family forall mdo proc rec",c:[{cN:"module",b:"\\bmodule\\b",e:"where",k:"module where",c:[c,g],i:"\\W\\.|;"},{cN:"import",b:"\\bimport\\b",e:"$",k:"import|0 qualified as hiding",c:[c,g],i:"\\W\\.|;"},{cN:"class",b:"^(\\s*)?(class|instance)\\b",e:"where",k:"class family instance where",c:[d,c,g]},{cN:"typedef",b:"\\b(data|(new)?type)\\b",e:"$",k:"data family type newtype deriving",c:[e,g,d,c,a]},{cN:"default",bK:"default",e:"$",c:[d,c,g]},{cN:"infix",bK:"infix infixl infixr",e:"$",c:[f.CNM,g]},{cN:"foreign",b:"\\bforeign\\b",e:"$",k:"foreign import export ccall stdcall cplusplus jvm dotnet safe unsafe",c:[d,f.QSM,g]},{cN:"shebang",b:"#!\\/usr\\/bin\\/env runhaskell",e:"$"},e,g,b,f.QSM,f.CNM,d,f.inherit(f.TM,{b:"^[_a-z][\\w']*"}),{b:"->|<-"}]}});hljs.registerLanguage("xml",function(a){var c="[A-Za-z0-9\\._:-]+";var d={b:/<\?(php)?(?!\w)/,e:/\?>/,sL:"php",subLanguageMode:"continuous"};var b={eW:true,i:/</,r:0,c:[d,{cN:"attribute",b:c,r:0},{b:"=",r:0,c:[{cN:"value",v:[{b:/"/,e:/"/},{b:/'/,e:/'/},{b:/[^\s\/>]+/}]}]}]};return{aliases:["html"],cI:true,c:[{cN:"doctype",b:"<!DOCTYPE",e:">",r:10,c:[{b:"\\[",e:"\\]"}]},{cN:"comment",b:"<!--",e:"-->",r:10},{cN:"cdata",b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"tag",b:"<style(?=\\s|>|$)",e:">",k:{title:"style"},c:[b],starts:{e:"</style>",rE:true,sL:"css"}},{cN:"tag",b:"<script(?=\\s|>|$)",e:">",k:{title:"script"},c:[b],starts:{e:"<\/script>",rE:true,sL:"javascript"}},{b:"<%",e:"%>",sL:"vbscript"},d,{cN:"pi",b:/<\?\w+/,e:/\?>/,r:10},{cN:"tag",b:"</?",e:"/?>",c:[{cN:"title",b:"[^ /><]+",r:0},b]}]}});hljs.registerLanguage("django",function(a){var b={cN:"filter",b:/\|[A-Za-z]+\:?/,k:"truncatewords removetags linebreaksbr yesno get_digit timesince random striptags filesizeformat escape linebreaks length_is ljust rjust cut urlize fix_ampersands title floatformat capfirst pprint divisibleby add make_list unordered_list urlencode timeuntil urlizetrunc wordcount stringformat linenumbers slice date dictsort dictsortreversed default_if_none pluralize lower join center default truncatewords_html upper length phone2numeric wordwrap time addslashes slugify first escapejs force_escape iriencode last safe safeseq truncatechars localize unlocalize localtime utc timezone",c:[{cN:"argument",b:/"/,e:/"/},{cN:"argument",b:/'/,e:/'/}]};return{cI:true,sL:"xml",subLanguageMode:"continuous",c:[{cN:"template_comment",b:/\{%\s*comment\s*%}/,e:/\{%\s*endcomment\s*%}/},{cN:"template_comment",b:/\{#/,e:/#}/},{cN:"template_tag",b:/\{%/,e:/%}/,k:"comment endcomment load templatetag ifchanged endifchanged if endif firstof for endfor in ifnotequal endifnotequal widthratio extends include spaceless endspaceless regroup by as ifequal endifequal ssi now with cycle url filter endfilter debug block endblock else autoescape endautoescape csrf_token empty elif endwith static trans blocktrans endblocktrans get_static_prefix get_media_prefix plural get_current_language language get_available_languages get_current_language_bidi get_language_info get_language_info_list localize endlocalize localtime endlocaltime timezone endtimezone get_current_timezone verbatim",c:[b]},{cN:"variable",b:/\{\{/,e:/}}/,c:[b]}]}});hljs.registerLanguage("bash",function(b){var a={cN:"variable",v:[{b:/\$[\w\d#@][\w\d_]*/},{b:/\$\{(.*?)\}/}]};var d={cN:"string",b:/"/,e:/"/,c:[b.BE,a,{cN:"variable",b:/\$\(/,e:/\)/,c:[b.BE]}]};var c={cN:"string",b:/'/,e:/'/};return{l:/-?[a-z\.]+/,k:{keyword:"if then else elif fi for break continue while in do done exit return set declare case esac export exec",literal:"true false",built_in:"printf echo read cd pwd pushd popd dirs let eval unset typeset readonly getopts source shopt caller type hash bind help sudo",operator:"-ne -eq -lt -gt -f -d -e -s -l -a"},c:[{cN:"shebang",b:/^#![^\n]+sh\s*$/,r:10},{cN:"function",b:/\w[\w\d_]*\s*\(\s*\)\s*\{/,rB:true,c:[b.inherit(b.TM,{b:/\w[\w\d_]*/})],r:0},b.HCM,b.NM,d,c,a]}});hljs.registerLanguage("ini",function(a){return{cI:true,i:/\S/,c:[{cN:"comment",b:";",e:"$"},{cN:"title",b:"^\\[",e:"\\]"},{cN:"setting",b:"^[a-z0-9\\[\\]_-]+[ \\t]*=[ \\t]*",e:"$",c:[{cN:"value",eW:true,k:"on off true false yes no",c:[a.QSM,a.NM],r:0}]}]}});hljs.registerLanguage("objectivec",function(a){var d={keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign self synchronized id nonatomic super unichar IBOutlet IBAction strong weak @private @protected @public @try @property @end @throw @catch @finally @synthesize @dynamic @selector @optional @required",literal:"false true FALSE TRUE nil YES NO NULL",built_in:"NSString NSDictionary CGRect CGPoint UIButton UILabel UITextView UIWebView MKMapView UISegmentedControl NSObject UITableViewDelegate UITableViewDataSource NSThread UIActivityIndicator UITabbar UIToolBar UIBarButtonItem UIImageView NSAutoreleasePool UITableView BOOL NSInteger CGFloat NSException NSLog NSMutableString NSMutableArray NSMutableDictionary NSURL NSIndexPath CGSize UITableViewCell UIView UIViewController UINavigationBar UINavigationController UITabBarController UIPopoverController UIPopoverControllerDelegate UIImage NSNumber UISearchBar NSFetchedResultsController NSFetchedResultsChangeType UIScrollView UIScrollViewDelegate UIEdgeInsets UIColor UIFont UIApplication NSNotFound NSNotificationCenter NSNotification UILocalNotification NSBundle NSFileManager NSTimeInterval NSDate NSCalendar NSUserDefaults UIWindow NSRange NSArray NSError NSURLRequest NSURLConnection UIInterfaceOrientation MPMoviePlayerController dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"};var c=/[a-zA-Z@][a-zA-Z0-9_]*/;var b="@interface @class @protocol @implementation";return{k:d,l:c,i:"</",c:[a.CLCM,a.CBLCLM,a.CNM,a.QSM,{cN:"string",b:"'",e:"[^\\\\]'",i:"[^\\\\][^']"},{cN:"preprocessor",b:"#import",e:"$",c:[{cN:"title",b:'"',e:'"'},{cN:"title",b:"<",e:">"}]},{cN:"preprocessor",b:"#",e:"$"},{cN:"class",b:"("+b.split(" ").join("|")+")\\b",e:"({|$)",k:b,l:c,c:[a.UTM]},{cN:"variable",b:"\\."+a.UIR,r:0}]}});hljs.registerLanguage("scss",function(a){var c="[a-zA-Z-][a-zA-Z0-9_-]*";var d={cN:"function",b:c+"\\(",e:"\\)",c:["self",a.NM,a.ASM,a.QSM]};var b={cN:"hexcolor",b:"#[0-9A-Fa-f]+"};var e={cN:"attribute",b:"[A-Z\\_\\.\\-]+",e:":",eE:true,i:"[^\\s]",starts:{cN:"value",eW:true,eE:true,c:[d,b,a.NM,a.QSM,a.ASM,a.CBLCLM,{cN:"important",b:"!important"}]}};return{cI:true,i:"[=/|']",c:[a.CLCM,a.CBLCLM,{cN:"function",b:c+"\\(",e:"\\)",c:["self",a.NM,a.ASM,a.QSM]},{cN:"id",b:"\\#[A-Za-z0-9_-]+",r:0},{cN:"class",b:"\\.[A-Za-z0-9_-]+",r:0},{cN:"attr_selector",b:"\\[",e:"\\]",i:"$"},{cN:"tag",b:"\\b(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|frame|frameset|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|map|mark|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|samp|script|section|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)\\b",r:0},{cN:"pseudo",b:":(visited|valid|root|right|required|read-write|read-only|out-range|optional|only-of-type|only-child|nth-of-type|nth-last-of-type|nth-last-child|nth-child|not|link|left|last-of-type|last-child|lang|invalid|indeterminate|in-range|hover|focus|first-of-type|first-line|first-letter|first-child|first|enabled|empty|disabled|default|checked|before|after|active)"},{cN:"pseudo",b:"::(after|before|choices|first-letter|first-line|repeat-index|repeat-item|selection|value)"},{cN:"attribute",b:"\\b(z-index|word-wrap|word-spacing|word-break|width|widows|white-space|visibility|vertical-align|unicode-bidi|transition-timing-function|transition-property|transition-duration|transition-delay|transition|transform-style|transform-origin|transform|top|text-underline-position|text-transform|text-shadow|text-rendering|text-overflow|text-indent|text-decoration-style|text-decoration-line|text-decoration-color|text-decoration|text-align-last|text-align|tab-size|table-layout|right|resize|quotes|position|pointer-events|perspective-origin|perspective|page-break-inside|page-break-before|page-break-after|padding-top|padding-right|padding-left|padding-bottom|padding|overflow-y|overflow-x|overflow-wrap|overflow|outline-width|outline-style|outline-offset|outline-color|outline|orphans|order|opacity|object-position|object-fit|normal|none|nav-up|nav-right|nav-left|nav-index|nav-down|min-width|min-height|max-width|max-height|mask|marks|margin-top|margin-right|margin-left|margin-bottom|margin|list-style-type|list-style-position|list-style-image|list-style|line-height|letter-spacing|left|justify-content|initial|inherit|ime-mode|image-orientation|image-resolution|image-rendering|icon|hyphens|height|font-weight|font-variant-ligatures|font-variant|font-style|font-stretch|font-size-adjust|font-size|font-language-override|font-kerning|font-feature-settings|font-family|font|float|flex-wrap|flex-shrink|flex-grow|flex-flow|flex-direction|flex-basis|flex|filter|empty-cells|display|direction|cursor|counter-reset|counter-increment|content|column-width|column-span|column-rule-width|column-rule-style|column-rule-color|column-rule|column-gap|column-fill|column-count|columns|color|clip-path|clip|clear|caption-side|break-inside|break-before|break-after|box-sizing|box-shadow|box-decoration-break|bottom|border-width|border-top-width|border-top-style|border-top-right-radius|border-top-left-radius|border-top-color|border-top|border-style|border-spacing|border-right-width|border-right-style|border-right-color|border-right|border-radius|border-left-width|border-left-style|border-left-color|border-left|border-image-width|border-image-source|border-image-slice|border-image-repeat|border-image-outset|border-image|border-color|border-collapse|border-bottom-width|border-bottom-style|border-bottom-right-radius|border-bottom-left-radius|border-bottom-color|border-bottom|border|background-size|background-repeat|background-position|background-origin|background-image|background-color|background-clip|background-attachment|background|backface-visibility|auto|animation-timing-function|animation-play-state|animation-name|animation-iteration-count|animation-fill-mode|animation-duration|animation-direction|animation-delay|animation|align-self|align-items|align-content)\\b",i:"[^\\s]"},{cN:"value",b:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b"},{cN:"value",b:":",e:";",c:[b,a.NM,a.QSM,a.ASM,{cN:"important",b:"!important"}]},{cN:"at_rule",b:"@",e:"[{;]",k:"mixin include extend for if else each while charset import debug media page content font-face namespace warn",c:[d,a.QSM,a.ASM,b,a.NM,{cN:"preprocessor",b:"\\s[A-Za-z0-9_.-]+",r:0}]}]}});hljs.registerLanguage("python",function(a){var f={cN:"prompt",b:/^(>>>|\.\.\.) /};var b={cN:"string",c:[a.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,c:[f],r:10},{b:/(u|b)?r?"""/,e:/"""/,c:[f],r:10},{b:/(u|r|ur)'/,e:/'/,r:10},{b:/(u|r|ur)"/,e:/"/,r:10},{b:/(b|br)'/,e:/'/,},{b:/(b|br)"/,e:/"/,},a.ASM,a.QSM]};var d={cN:"number",r:0,v:[{b:a.BNR+"[lLjJ]?"},{b:"\\b(0o[0-7]+)[lLjJ]?"},{b:a.CNR+"[lLjJ]?"}]};var e={cN:"params",b:/\(/,e:/\)/,c:["self",f,d,b]};var c={e:/:/,i:/[${=;\n]/,c:[a.UTM,e]};return{k:{keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda nonlocal|10 None True False",built_in:"Ellipsis NotImplemented"},i:/(<\/|->|\?)/,c:[f,d,b,a.HCM,a.inherit(c,{cN:"function",bK:"def",r:10}),a.inherit(c,{cN:"class",bK:"class"}),{cN:"decorator",b:/@/,e:/$/},{b:/\b(print|exec)\(/}]}});hljs.registerLanguage("mel",function(a){return{k:"int float string vector matrix if else switch case default while do for in break continue global proc return about abs addAttr addAttributeEditorNodeHelp addDynamic addNewShelfTab addPP addPanelCategory addPrefixToName advanceToNextDrivenKey affectedNet affects aimConstraint air alias aliasAttr align alignCtx alignCurve alignSurface allViewFit ambientLight angle angleBetween animCone animCurveEditor animDisplay animView annotate appendStringArray applicationName applyAttrPreset applyTake arcLenDimContext arcLengthDimension arclen arrayMapper art3dPaintCtx artAttrCtx artAttrPaintVertexCtx artAttrSkinPaintCtx artAttrTool artBuildPaintMenu artFluidAttrCtx artPuttyCtx artSelectCtx artSetPaintCtx artUserPaintCtx assignCommand assignInputDevice assignViewportFactories attachCurve attachDeviceAttr attachSurface attrColorSliderGrp attrCompatibility attrControlGrp attrEnumOptionMenu attrEnumOptionMenuGrp attrFieldGrp attrFieldSliderGrp attrNavigationControlGrp attrPresetEditWin attributeExists attributeInfo attributeMenu attributeQuery autoKeyframe autoPlace bakeClip bakeFluidShading bakePartialHistory bakeResults bakeSimulation basename basenameEx batchRender bessel bevel bevelPlus binMembership bindSkin blend2 blendShape blendShapeEditor blendShapePanel blendTwoAttr blindDataType boneLattice boundary boxDollyCtx boxZoomCtx bufferCurve buildBookmarkMenu buildKeyframeMenu button buttonManip CBG cacheFile cacheFileCombine cacheFileMerge cacheFileTrack camera cameraView canCreateManip canvas capitalizeString catch catchQuiet ceil changeSubdivComponentDisplayLevel changeSubdivRegion channelBox character characterMap characterOutlineEditor characterize chdir checkBox checkBoxGrp checkDefaultRenderGlobals choice circle circularFillet clamp clear clearCache clip clipEditor clipEditorCurrentTimeCtx clipSchedule clipSchedulerOutliner clipTrimBefore closeCurve closeSurface cluster cmdFileOutput cmdScrollFieldExecuter cmdScrollFieldReporter cmdShell coarsenSubdivSelectionList collision color colorAtPoint colorEditor colorIndex colorIndexSliderGrp colorSliderButtonGrp colorSliderGrp columnLayout commandEcho commandLine commandPort compactHairSystem componentEditor compositingInterop computePolysetVolume condition cone confirmDialog connectAttr connectControl connectDynamic connectJoint connectionInfo constrain constrainValue constructionHistory container containsMultibyte contextInfo control convertFromOldLayers convertIffToPsd convertLightmap convertSolidTx convertTessellation convertUnit copyArray copyFlexor copyKey copySkinWeights cos cpButton cpCache cpClothSet cpCollision cpConstraint cpConvClothToMesh cpForces cpGetSolverAttr cpPanel cpProperty cpRigidCollisionFilter cpSeam cpSetEdit cpSetSolverAttr cpSolver cpSolverTypes cpTool cpUpdateClothUVs createDisplayLayer createDrawCtx createEditor createLayeredPsdFile createMotionField createNewShelf createNode createRenderLayer createSubdivRegion cross crossProduct ctxAbort ctxCompletion ctxEditMode ctxTraverse currentCtx currentTime currentTimeCtx currentUnit curve curveAddPtCtx curveCVCtx curveEPCtx curveEditorCtx curveIntersect curveMoveEPCtx curveOnSurface curveSketchCtx cutKey cycleCheck cylinder dagPose date defaultLightListCheckBox defaultNavigation defineDataServer defineVirtualDevice deformer deg_to_rad delete deleteAttr deleteShadingGroupsAndMaterials deleteShelfTab deleteUI deleteUnusedBrushes delrandstr detachCurve detachDeviceAttr detachSurface deviceEditor devicePanel dgInfo dgdirty dgeval dgtimer dimWhen directKeyCtx directionalLight dirmap dirname disable disconnectAttr disconnectJoint diskCache displacementToPoly displayAffected displayColor displayCull displayLevelOfDetail displayPref displayRGBColor displaySmoothness displayStats displayString displaySurface distanceDimContext distanceDimension doBlur dolly dollyCtx dopeSheetEditor dot dotProduct doubleProfileBirailSurface drag dragAttrContext draggerContext dropoffLocator duplicate duplicateCurve duplicateSurface dynCache dynControl dynExport dynExpression dynGlobals dynPaintEditor dynParticleCtx dynPref dynRelEdPanel dynRelEditor dynamicLoad editAttrLimits editDisplayLayerGlobals editDisplayLayerMembers editRenderLayerAdjustment editRenderLayerGlobals editRenderLayerMembers editor editorTemplate effector emit emitter enableDevice encodeString endString endsWith env equivalent equivalentTol erf error eval evalDeferred evalEcho event exactWorldBoundingBox exclusiveLightCheckBox exec executeForEachObject exists exp expression expressionEditorListen extendCurve extendSurface extrude fcheck fclose feof fflush fgetline fgetword file fileBrowserDialog fileDialog fileExtension fileInfo filetest filletCurve filter filterCurve filterExpand filterStudioImport findAllIntersections findAnimCurves findKeyframe findMenuItem findRelatedSkinCluster finder firstParentOf fitBspline flexor floatEq floatField floatFieldGrp floatScrollBar floatSlider floatSlider2 floatSliderButtonGrp floatSliderGrp floor flow fluidCacheInfo fluidEmitter fluidVoxelInfo flushUndo fmod fontDialog fopen formLayout format fprint frameLayout fread freeFormFillet frewind fromNativePath fwrite gamma gauss geometryConstraint getApplicationVersionAsFloat getAttr getClassification getDefaultBrush getFileList getFluidAttr getInputDeviceRange getMayaPanelTypes getModifiers getPanel getParticleAttr getPluginResource getenv getpid glRender glRenderEditor globalStitch gmatch goal gotoBindPose grabColor gradientControl gradientControlNoAttr graphDollyCtx graphSelectContext graphTrackCtx gravity grid gridLayout group groupObjectsByName HfAddAttractorToAS HfAssignAS HfBuildEqualMap HfBuildFurFiles HfBuildFurImages HfCancelAFR HfConnectASToHF HfCreateAttractor HfDeleteAS HfEditAS HfPerformCreateAS HfRemoveAttractorFromAS HfSelectAttached HfSelectAttractors HfUnAssignAS hardenPointCurve hardware hardwareRenderPanel headsUpDisplay headsUpMessage help helpLine hermite hide hilite hitTest hotBox hotkey hotkeyCheck hsv_to_rgb hudButton hudSlider hudSliderButton hwReflectionMap hwRender hwRenderLoad hyperGraph hyperPanel hyperShade hypot iconTextButton iconTextCheckBox iconTextRadioButton iconTextRadioCollection iconTextScrollList iconTextStaticLabel ikHandle ikHandleCtx ikHandleDisplayScale ikSolver ikSplineHandleCtx ikSystem ikSystemInfo ikfkDisplayMethod illustratorCurves image imfPlugins inheritTransform insertJoint insertJointCtx insertKeyCtx insertKnotCurve insertKnotSurface instance instanceable instancer intField intFieldGrp intScrollBar intSlider intSliderGrp interToUI internalVar intersect iprEngine isAnimCurve isConnected isDirty isParentOf isSameObject isTrue isValidObjectName isValidString isValidUiName isolateSelect itemFilter itemFilterAttr itemFilterRender itemFilterType joint jointCluster jointCtx jointDisplayScale jointLattice keyTangent keyframe keyframeOutliner keyframeRegionCurrentTimeCtx keyframeRegionDirectKeyCtx keyframeRegionDollyCtx keyframeRegionInsertKeyCtx keyframeRegionMoveKeyCtx keyframeRegionScaleKeyCtx keyframeRegionSelectKeyCtx keyframeRegionSetKeyCtx keyframeRegionTrackCtx keyframeStats lassoContext lattice latticeDeformKeyCtx launch launchImageEditor layerButton layeredShaderPort layeredTexturePort layout layoutDialog lightList lightListEditor lightListPanel lightlink lineIntersection linearPrecision linstep listAnimatable listAttr listCameras listConnections listDeviceAttachments listHistory listInputDeviceAxes listInputDeviceButtons listInputDevices listMenuAnnotation listNodeTypes listPanelCategories listRelatives listSets listTransforms listUnselected listerEditor loadFluid loadNewShelf loadPlugin loadPluginLanguageResources loadPrefObjects localizedPanelLabel lockNode loft log longNameOf lookThru ls lsThroughFilter lsType lsUI Mayatomr mag makeIdentity makeLive makePaintable makeRoll makeSingleSurface makeTubeOn makebot manipMoveContext manipMoveLimitsCtx manipOptions manipRotateContext manipRotateLimitsCtx manipScaleContext manipScaleLimitsCtx marker match max memory menu menuBarLayout menuEditor menuItem menuItemToShelf menuSet menuSetPref messageLine min minimizeApp mirrorJoint modelCurrentTimeCtx modelEditor modelPanel mouse movIn movOut move moveIKtoFK moveKeyCtx moveVertexAlongDirection multiProfileBirailSurface mute nParticle nameCommand nameField namespace namespaceInfo newPanelItems newton nodeCast nodeIconButton nodeOutliner nodePreset nodeType noise nonLinear normalConstraint normalize nurbsBoolean nurbsCopyUVSet nurbsCube nurbsEditUV nurbsPlane nurbsSelect nurbsSquare nurbsToPoly nurbsToPolygonsPref nurbsToSubdiv nurbsToSubdivPref nurbsUVSet nurbsViewDirectionVector objExists objectCenter objectLayer objectType objectTypeUI obsoleteProc oceanNurbsPreviewPlane offsetCurve offsetCurveOnSurface offsetSurface openGLExtension openMayaPref optionMenu optionMenuGrp optionVar orbit orbitCtx orientConstraint outlinerEditor outlinerPanel overrideModifier paintEffectsDisplay pairBlend palettePort paneLayout panel panelConfiguration panelHistory paramDimContext paramDimension paramLocator parent parentConstraint particle particleExists particleInstancer particleRenderInfo partition pasteKey pathAnimation pause pclose percent performanceOptions pfxstrokes pickWalk picture pixelMove planarSrf plane play playbackOptions playblast plugAttr plugNode pluginInfo pluginResourceUtil pointConstraint pointCurveConstraint pointLight pointMatrixMult pointOnCurve pointOnSurface pointPosition poleVectorConstraint polyAppend polyAppendFacetCtx polyAppendVertex polyAutoProjection polyAverageNormal polyAverageVertex polyBevel polyBlendColor polyBlindData polyBoolOp polyBridgeEdge polyCacheMonitor polyCheck polyChipOff polyClipboard polyCloseBorder polyCollapseEdge polyCollapseFacet polyColorBlindData polyColorDel polyColorPerVertex polyColorSet polyCompare polyCone polyCopyUV polyCrease polyCreaseCtx polyCreateFacet polyCreateFacetCtx polyCube polyCut polyCutCtx polyCylinder polyCylindricalProjection polyDelEdge polyDelFacet polyDelVertex polyDuplicateAndConnect polyDuplicateEdge polyEditUV polyEditUVShell polyEvaluate polyExtrudeEdge polyExtrudeFacet polyExtrudeVertex polyFlipEdge polyFlipUV polyForceUV polyGeoSampler polyHelix polyInfo polyInstallAction polyLayoutUV polyListComponentConversion polyMapCut polyMapDel polyMapSew polyMapSewMove polyMergeEdge polyMergeEdgeCtx polyMergeFacet polyMergeFacetCtx polyMergeUV polyMergeVertex polyMirrorFace polyMoveEdge polyMoveFacet polyMoveFacetUV polyMoveUV polyMoveVertex polyNormal polyNormalPerVertex polyNormalizeUV polyOptUvs polyOptions polyOutput polyPipe polyPlanarProjection polyPlane polyPlatonicSolid polyPoke polyPrimitive polyPrism polyProjection polyPyramid polyQuad polyQueryBlindData polyReduce polySelect polySelectConstraint polySelectConstraintMonitor polySelectCtx polySelectEditCtx polySeparate polySetToFaceNormal polySewEdge polyShortestPathCtx polySmooth polySoftEdge polySphere polySphericalProjection polySplit polySplitCtx polySplitEdge polySplitRing polySplitVertex polyStraightenUVBorder polySubdivideEdge polySubdivideFacet polyToSubdiv polyTorus polyTransfer polyTriangulate polyUVSet polyUnite polyWedgeFace popen popupMenu pose pow preloadRefEd print progressBar progressWindow projFileViewer projectCurve projectTangent projectionContext projectionManip promptDialog propModCtx propMove psdChannelOutliner psdEditTextureFile psdExport psdTextureFile putenv pwd python querySubdiv quit rad_to_deg radial radioButton radioButtonGrp radioCollection radioMenuItemCollection rampColorPort rand randomizeFollicles randstate rangeControl readTake rebuildCurve rebuildSurface recordAttr recordDevice redo reference referenceEdit referenceQuery refineSubdivSelectionList refresh refreshAE registerPluginResource rehash reloadImage removeJoint removeMultiInstance removePanelCategory rename renameAttr renameSelectionList renameUI render renderGlobalsNode renderInfo renderLayerButton renderLayerParent renderLayerPostProcess renderLayerUnparent renderManip renderPartition renderQualityNode renderSettings renderThumbnailUpdate renderWindowEditor renderWindowSelectContext renderer reorder reorderDeformers requires reroot resampleFluid resetAE resetPfxToPolyCamera resetTool resolutionNode retarget reverseCurve reverseSurface revolve rgb_to_hsv rigidBody rigidSolver roll rollCtx rootOf rot rotate rotationInterpolation roundConstantRadius rowColumnLayout rowLayout runTimeCommand runup sampleImage saveAllShelves saveAttrPreset saveFluid saveImage saveInitialState saveMenu savePrefObjects savePrefs saveShelf saveToolSettings scale scaleBrushBrightness scaleComponents scaleConstraint scaleKey scaleKeyCtx sceneEditor sceneUIReplacement scmh scriptCtx scriptEditorInfo scriptJob scriptNode scriptTable scriptToShelf scriptedPanel scriptedPanelType scrollField scrollLayout sculpt searchPathArray seed selLoadSettings select selectContext selectCurveCV selectKey selectKeyCtx selectKeyframeRegionCtx selectMode selectPref selectPriority selectType selectedNodes selectionConnection separator setAttr setAttrEnumResource setAttrMapping setAttrNiceNameResource setConstraintRestPosition setDefaultShadingGroup setDrivenKeyframe setDynamic setEditCtx setEditor setFluidAttr setFocus setInfinity setInputDeviceMapping setKeyCtx setKeyPath setKeyframe setKeyframeBlendshapeTargetWts setMenuMode setNodeNiceNameResource setNodeTypeFlag setParent setParticleAttr setPfxToPolyCamera setPluginResource setProject setStampDensity setStartupMessage setState setToolTo setUITemplate setXformManip sets shadingConnection shadingGeometryRelCtx shadingLightRelCtx shadingNetworkCompare shadingNode shapeCompare shelfButton shelfLayout shelfTabLayout shellField shortNameOf showHelp showHidden showManipCtx showSelectionInTitle showShadingGroupAttrEditor showWindow sign simplify sin singleProfileBirailSurface size sizeBytes skinCluster skinPercent smoothCurve smoothTangentSurface smoothstep snap2to2 snapKey snapMode snapTogetherCtx snapshot soft softMod softModCtx sort sound soundControl source spaceLocator sphere sphrand spotLight spotLightPreviewPort spreadSheetEditor spring sqrt squareSurface srtContext stackTrace startString startsWith stitchAndExplodeShell stitchSurface stitchSurfacePoints strcmp stringArrayCatenate stringArrayContains stringArrayCount stringArrayInsertAtIndex stringArrayIntersector stringArrayRemove stringArrayRemoveAtIndex stringArrayRemoveDuplicates stringArrayRemoveExact stringArrayToString stringToStringArray strip stripPrefixFromName stroke subdAutoProjection subdCleanTopology subdCollapse subdDuplicateAndConnect subdEditUV subdListComponentConversion subdMapCut subdMapSewMove subdMatchTopology subdMirror subdToBlind subdToPoly subdTransferUVsToCache subdiv subdivCrease subdivDisplaySmoothness substitute substituteAllString substituteGeometry substring surface surfaceSampler surfaceShaderList swatchDisplayPort switchTable symbolButton symbolCheckBox sysFile system tabLayout tan tangentConstraint texLatticeDeformContext texManipContext texMoveContext texMoveUVShellContext texRotateContext texScaleContext texSelectContext texSelectShortestPathCtx texSmudgeUVContext texWinToolCtx text textCurves textField textFieldButtonGrp textFieldGrp textManip textScrollList textToShelf textureDisplacePlane textureHairColor texturePlacementContext textureWindow threadCount threePointArcCtx timeControl timePort timerX toNativePath toggle toggleAxis toggleWindowVisibility tokenize tokenizeList tolerance tolower toolButton toolCollection toolDropped toolHasOptions toolPropertyWindow torus toupper trace track trackCtx transferAttributes transformCompare transformLimits translator trim trunc truncateFluidCache truncateHairCache tumble tumbleCtx turbulence twoPointArcCtx uiRes uiTemplate unassignInputDevice undo undoInfo ungroup uniform unit unloadPlugin untangleUV untitledFileName untrim upAxis updateAE userCtx uvLink uvSnapshot validateShelfName vectorize view2dToolCtx viewCamera viewClipPlane viewFit viewHeadOn viewLookAt viewManip viewPlace viewSet visor volumeAxis vortex waitCursor warning webBrowser webBrowserPrefs whatIs window windowPref wire wireContext workspace wrinkle wrinkleContext writeTake xbmLangPathList xform",i:"</",c:[a.CNM,a.ASM,a.QSM,{cN:"string",b:"`",e:"`",c:[a.BE]},{cN:"variable",v:[{b:"\\$\\d"},{b:"[\\$\\%\\@](\\^\\w\\b|#\\w+|[^\\s\\w{]|{\\w+}|\\w+)"},{b:"\\*(\\^\\w\\b|#\\w+|[^\\s\\w{]|{\\w+}|\\w+)",r:0}]},a.CLCM,a.CBLCLM]}});hljs.registerLanguage("dos",function(a){return{cI:true,k:{flow:"if else goto for in do call exit not exist errorlevel defined equ neq lss leq gtr geq",keyword:"shift cd dir echo setlocal endlocal set pause copy",stream:"prn nul lpt3 lpt2 lpt1 con com4 com3 com2 com1 aux",winutils:"ping net ipconfig taskkill xcopy ren del"},c:[{cN:"envvar",b:"%%[^ ]"},{cN:"envvar",b:"%[^ ]+?%"},{cN:"envvar",b:"![^ ]+?!"},{cN:"number",b:"\\b\\d+",r:0},{cN:"comment",b:"@?rem",e:"$"}]}});hljs.registerLanguage("java",function(b){var a="false synchronized int abstract float private char boolean static null if const for true while long throw strictfp finally protected import native final return void enum else break transient new catch instanceof byte super volatile case assert short package default double public try this switch continue throws";return{k:a,i:/<\//,c:[{cN:"javadoc",b:"/\\*\\*",e:"\\*/",c:[{cN:"javadoctag",b:"(^|\\s)@[A-Za-z]+"}],r:10},b.CLCM,b.CBLCLM,b.ASM,b.QSM,{bK:"protected public private",e:/[{;=]/,k:a,c:[{cN:"class",bK:"class interface",eW:true,i:/[:"<>]/,c:[{bK:"extends implements",r:10},b.UTM]},{b:b.UIR+"\\s*\\(",rB:true,c:[b.UTM]}]},b.CNM,{cN:"annotation",b:"@[A-Za-z]+"}]}});hljs.registerLanguage("tex",function(a){var d={cN:"command",b:"\\\\[a-zA-Z邪-褟袗-褟]+[\\*]?"};var c={cN:"command",b:"\\\\[^a-zA-Z邪-褟袗-褟0-9]"};var b={cN:"special",b:"[{}\\[\\]\\&#~]",r:0};return{c:[{b:"\\\\[a-zA-Z邪-褟袗-褟]+[\\*]? *= *-?\\d*\\.?\\d+(pt|pc|mm|cm|in|dd|cc|ex|em)?",rB:true,c:[d,c,{cN:"number",b:" *=",e:"-?\\d*\\.?\\d+(pt|pc|mm|cm|in|dd|cc|ex|em)?",eB:true}],r:10},d,c,b,{cN:"formula",b:"\\$\\$",e:"\\$\\$",c:[d,c,b],r:0},{cN:"formula",b:"\\$",e:"\\$",c:[d,c,b],r:0},{cN:"comment",b:"%",e:"$",r:0}]}});hljs.registerLanguage("glsl",function(a){return{k:{keyword:"atomic_uint attribute bool break bvec2 bvec3 bvec4 case centroid coherent const continue default discard dmat2 dmat2x2 dmat2x3 dmat2x4 dmat3 dmat3x2 dmat3x3 dmat3x4 dmat4 dmat4x2 dmat4x3 dmat4x4 do double dvec2 dvec3 dvec4 else flat float for highp if iimage1D iimage1DArray iimage2D iimage2DArray iimage2DMS iimage2DMSArray iimage2DRect iimage3D iimageBuffer iimageCube iimageCubeArray image1D image1DArray image2D image2DArray image2DMS image2DMSArray image2DRect image3D imageBuffer imageCube imageCubeArray in inout int invariant isampler1D isampler1DArray isampler2D isampler2DArray isampler2DMS isampler2DMSArray isampler2DRect isampler3D isamplerBuffer isamplerCube isamplerCubeArray ivec2 ivec3 ivec4 layout lowp mat2 mat2x2 mat2x3 mat2x4 mat3 mat3x2 mat3x3 mat3x4 mat4 mat4x2 mat4x3 mat4x4 mediump noperspective out patch precision readonly restrict return sample sampler1D sampler1DArray sampler1DArrayShadow sampler1DShadow sampler2D sampler2DArray sampler2DArrayShadow sampler2DMS sampler2DMSArray sampler2DRect sampler2DRectShadow sampler2DShadow sampler3D samplerBuffer samplerCube samplerCubeArray samplerCubeArrayShadow samplerCubeShadow smooth struct subroutine switch uimage1D uimage1DArray uimage2D uimage2DArray uimage2DMS uimage2DMSArray uimage2DRect uimage3D uimageBuffer uimageCube uimageCubeArray uint uniform usampler1D usampler1DArray usampler2D usampler2DArray usampler2DMS usampler2DMSArray usampler2DRect usampler3D usamplerBuffer usamplerCube usamplerCubeArray uvec2 uvec3 uvec4 varying vec2 vec3 vec4 void volatile while writeonly",built_in:"gl_BackColor gl_BackLightModelProduct gl_BackLightProduct gl_BackMaterial gl_BackSecondaryColor gl_ClipDistance gl_ClipPlane gl_ClipVertex gl_Color gl_DepthRange gl_EyePlaneQ gl_EyePlaneR gl_EyePlaneS gl_EyePlaneT gl_Fog gl_FogCoord gl_FogFragCoord gl_FragColor gl_FragCoord gl_FragData gl_FragDepth gl_FrontColor gl_FrontFacing gl_FrontLightModelProduct gl_FrontLightProduct gl_FrontMaterial gl_FrontSecondaryColor gl_InstanceID gl_InvocationID gl_Layer gl_LightModel gl_LightSource gl_MaxAtomicCounterBindings gl_MaxAtomicCounterBufferSize gl_MaxClipDistances gl_MaxClipPlanes gl_MaxCombinedAtomicCounterBuffers gl_MaxCombinedAtomicCounters gl_MaxCombinedImageUniforms gl_MaxCombinedImageUnitsAndFragmentOutputs gl_MaxCombinedTextureImageUnits gl_MaxDrawBuffers gl_MaxFragmentAtomicCounterBuffers gl_MaxFragmentAtomicCounters gl_MaxFragmentImageUniforms gl_MaxFragmentInputComponents gl_MaxFragmentUniformComponents gl_MaxFragmentUniformVectors gl_MaxGeometryAtomicCounterBuffers gl_MaxGeometryAtomicCounters gl_MaxGeometryImageUniforms gl_MaxGeometryInputComponents gl_MaxGeometryOutputComponents gl_MaxGeometryOutputVertices gl_MaxGeometryTextureImageUnits gl_MaxGeometryTotalOutputComponents gl_MaxGeometryUniformComponents gl_MaxGeometryVaryingComponents gl_MaxImageSamples gl_MaxImageUnits gl_MaxLights gl_MaxPatchVertices gl_MaxProgramTexelOffset gl_MaxTessControlAtomicCounterBuffers gl_MaxTessControlAtomicCounters gl_MaxTessControlImageUniforms gl_MaxTessControlInputComponents gl_MaxTessControlOutputComponents gl_MaxTessControlTextureImageUnits gl_MaxTessControlTotalOutputComponents gl_MaxTessControlUniformComponents gl_MaxTessEvaluationAtomicCounterBuffers gl_MaxTessEvaluationAtomicCounters gl_MaxTessEvaluationImageUniforms gl_MaxTessEvaluationInputComponents gl_MaxTessEvaluationOutputComponents gl_MaxTessEvaluationTextureImageUnits gl_MaxTessEvaluationUniformComponents gl_MaxTessGenLevel gl_MaxTessPatchComponents gl_MaxTextureCoords gl_MaxTextureImageUnits gl_MaxTextureUnits gl_MaxVaryingComponents gl_MaxVaryingFloats gl_MaxVaryingVectors gl_MaxVertexAtomicCounterBuffers gl_MaxVertexAtomicCounters gl_MaxVertexAttribs gl_MaxVertexImageUniforms gl_MaxVertexOutputComponents gl_MaxVertexTextureImageUnits gl_MaxVertexUniformComponents gl_MaxVertexUniformVectors gl_MaxViewports gl_MinProgramTexelOffsetgl_ModelViewMatrix gl_ModelViewMatrixInverse gl_ModelViewMatrixInverseTranspose gl_ModelViewMatrixTranspose gl_ModelViewProjectionMatrix gl_ModelViewProjectionMatrixInverse gl_ModelViewProjectionMatrixInverseTranspose gl_ModelViewProjectionMatrixTranspose gl_MultiTexCoord0 gl_MultiTexCoord1 gl_MultiTexCoord2 gl_MultiTexCoord3 gl_MultiTexCoord4 gl_MultiTexCoord5 gl_MultiTexCoord6 gl_MultiTexCoord7 gl_Normal gl_NormalMatrix gl_NormalScale gl_ObjectPlaneQ gl_ObjectPlaneR gl_ObjectPlaneS gl_ObjectPlaneT gl_PatchVerticesIn gl_PerVertex gl_Point gl_PointCoord gl_PointSize gl_Position gl_PrimitiveID gl_PrimitiveIDIn gl_ProjectionMatrix gl_ProjectionMatrixInverse gl_ProjectionMatrixInverseTranspose gl_ProjectionMatrixTranspose gl_SampleID gl_SampleMask gl_SampleMaskIn gl_SamplePosition gl_SecondaryColor gl_TessCoord gl_TessLevelInner gl_TessLevelOuter gl_TexCoord gl_TextureEnvColor gl_TextureMatrixInverseTranspose gl_TextureMatrixTranspose gl_Vertex gl_VertexID gl_ViewportIndex gl_in gl_out EmitStreamVertex EmitVertex EndPrimitive EndStreamPrimitive abs acos acosh all any asin asinh atan atanh atomicCounter atomicCounterDecrement atomicCounterIncrement barrier bitCount bitfieldExtract bitfieldInsert bitfieldReverse ceil clamp cos cosh cross dFdx dFdy degrees determinant distance dot equal exp exp2 faceforward findLSB findMSB floatBitsToInt floatBitsToUint floor fma fract frexp ftransform fwidth greaterThan greaterThanEqual imageAtomicAdd imageAtomicAnd imageAtomicCompSwap imageAtomicExchange imageAtomicMax imageAtomicMin imageAtomicOr imageAtomicXor imageLoad imageStore imulExtended intBitsToFloat interpolateAtCentroid interpolateAtOffset interpolateAtSample inverse inversesqrt isinf isnan ldexp length lessThan lessThanEqual log log2 matrixCompMult max memoryBarrier min mix mod modf noise1 noise2 noise3 noise4 normalize not notEqual outerProduct packDouble2x32 packHalf2x16 packSnorm2x16 packSnorm4x8 packUnorm2x16 packUnorm4x8 pow radians reflect refract round roundEven shadow1D shadow1DLod shadow1DProj shadow1DProjLod shadow2D shadow2DLod shadow2DProj shadow2DProjLod sign sin sinh smoothstep sqrt step tan tanh texelFetch texelFetchOffset texture texture1D texture1DLod texture1DProj texture1DProjLod texture2D texture2DLod texture2DProj texture2DProjLod texture3D texture3DLod texture3DProj texture3DProjLod textureCube textureCubeLod textureGather textureGatherOffset textureGatherOffsets textureGrad textureGradOffset textureLod textureLodOffset textureOffset textureProj textureProjGrad textureProjGradOffset textureProjLod textureProjLodOffset textureProjOffset textureQueryLod textureSize transpose trunc uaddCarry uintBitsToFloat umulExtended unpackDouble2x32 unpackHalf2x16 unpackSnorm2x16 unpackSnorm4x8 unpackUnorm2x16 unpackUnorm4x8 usubBorrow gl_TextureMatrix gl_TextureMatrixInverse",literal:"true false"},i:'"',c:[a.CLCM,a.CBLCLM,a.CNM,{cN:"preprocessor",b:"#",e:"$"}]}});hljs.registerLanguage("brainfuck",function(b){var a={cN:"literal",b:"[\\+\\-]",r:0};return{c:[{cN:"comment",b:"[^\\[\\]\\.,\\+\\-<> \r\n]",rE:true,e:"[\\[\\]\\.,\\+\\-<> \r\n]",r:0},{cN:"title",b:"[\\[\\]]",r:0},{cN:"string",b:"[\\.,]",r:0},{b:/\+\+|\-\-/,rB:true,c:[a]},a]}});hljs.registerLanguage("mathematica",function(a){return{aliases:["mma"],l:"(\\$|\\b)"+a.IR+"\\b",k:"AbelianGroup Abort AbortKernels AbortProtect Above Abs Absolute AbsoluteCorrelation AbsoluteCorrelationFunction AbsoluteCurrentValue AbsoluteDashing AbsoluteFileName AbsoluteOptions AbsolutePointSize AbsoluteThickness AbsoluteTime AbsoluteTiming AccountingForm Accumulate Accuracy AccuracyGoal ActionDelay ActionMenu ActionMenuBox ActionMenuBoxOptions Active ActiveItem ActiveStyle AcyclicGraphQ AddOnHelpPath AddTo AdjacencyGraph AdjacencyList AdjacencyMatrix AdjustmentBox AdjustmentBoxOptions AdjustTimeSeriesForecast AffineTransform After AiryAi AiryAiPrime AiryAiZero AiryBi AiryBiPrime AiryBiZero AlgebraicIntegerQ AlgebraicNumber AlgebraicNumberDenominator AlgebraicNumberNorm AlgebraicNumberPolynomial AlgebraicNumberTrace AlgebraicRules AlgebraicRulesData Algebraics AlgebraicUnitQ Alignment AlignmentMarker AlignmentPoint All AllowedDimensions AllowGroupClose AllowInlineCells AllowKernelInitialization AllowReverseGroupClose AllowScriptLevelChange AlphaChannel AlternatingGroup AlternativeHypothesis Alternatives AmbientLight Analytic AnchoredSearch And AndersonDarlingTest AngerJ AngleBracket AngularGauge Animate AnimationCycleOffset AnimationCycleRepetitions AnimationDirection AnimationDisplayTime AnimationRate AnimationRepetitions AnimationRunning Animator AnimatorBox AnimatorBoxOptions AnimatorElements Annotation Annuity AnnuityDue Antialiasing Antisymmetric Apart ApartSquareFree Appearance AppearanceElements AppellF1 Append AppendTo Apply ArcCos ArcCosh ArcCot ArcCoth ArcCsc ArcCsch ArcSec ArcSech ArcSin ArcSinDistribution ArcSinh ArcTan ArcTanh Arg ArgMax ArgMin ArgumentCountQ ARIMAProcess ArithmeticGeometricMean ARMAProcess ARProcess Array ArrayComponents ArrayDepth ArrayFlatten ArrayPad ArrayPlot ArrayQ ArrayReshape ArrayRules Arrays Arrow Arrow3DBox ArrowBox Arrowheads AspectRatio AspectRatioFixed Assert Assuming Assumptions AstronomicalData Asynchronous AsynchronousTaskObject AsynchronousTasks AtomQ Attributes AugmentedSymmetricPolynomial AutoAction AutoDelete AutoEvaluateEvents AutoGeneratedPackage AutoIndent AutoIndentSpacings AutoItalicWords AutoloadPath AutoMatch Automatic AutomaticImageSize AutoMultiplicationSymbol AutoNumberFormatting AutoOpenNotebooks AutoOpenPalettes AutorunSequencing AutoScaling AutoScroll AutoSpacing AutoStyleOptions AutoStyleWords Axes AxesEdge AxesLabel AxesOrigin AxesStyle Axis BabyMonsterGroupB Back Background BackgroundTasksSettings Backslash Backsubstitution Backward Band BandpassFilter BandstopFilter BarabasiAlbertGraphDistribution BarChart BarChart3D BarLegend BarlowProschanImportance BarnesG BarOrigin BarSpacing BartlettHannWindow BartlettWindow BaseForm Baseline BaselinePosition BaseStyle BatesDistribution BattleLemarieWavelet Because BeckmannDistribution Beep Before Begin BeginDialogPacket BeginFrontEndInteractionPacket BeginPackage BellB BellY Below BenfordDistribution BeniniDistribution BenktanderGibratDistribution BenktanderWeibullDistribution BernoulliB BernoulliDistribution BernoulliGraphDistribution BernoulliProcess BernsteinBasis BesselFilterModel BesselI BesselJ BesselJZero BesselK BesselY BesselYZero Beta BetaBinomialDistribution BetaDistribution BetaNegativeBinomialDistribution BetaPrimeDistribution BetaRegularized BetweennessCentrality BezierCurve BezierCurve3DBox BezierCurve3DBoxOptions BezierCurveBox BezierCurveBoxOptions BezierFunction BilateralFilter Binarize BinaryFormat BinaryImageQ BinaryRead BinaryReadList BinaryWrite BinCounts BinLists Binomial BinomialDistribution BinomialProcess BinormalDistribution BiorthogonalSplineWavelet BipartiteGraphQ BirnbaumImportance BirnbaumSaundersDistribution BitAnd BitClear BitGet BitLength BitNot BitOr BitSet BitShiftLeft BitShiftRight BitXor Black BlackmanHarrisWindow BlackmanNuttallWindow BlackmanWindow Blank BlankForm BlankNullSequence BlankSequence Blend Block BlockRandom BlomqvistBeta BlomqvistBetaTest Blue Blur BodePlot BohmanWindow Bold Bookmarks Boole BooleanConsecutiveFunction BooleanConvert BooleanCountingFunction BooleanFunction BooleanGraph BooleanMaxterms BooleanMinimize BooleanMinterms Booleans BooleanTable BooleanVariables BorderDimensions BorelTannerDistribution Bottom BottomHatTransform BoundaryStyle Bounds Box BoxBaselineShift BoxData BoxDimensions Boxed Boxes BoxForm BoxFormFormatTypes BoxFrame BoxID BoxMargins BoxMatrix BoxRatios BoxRotation BoxRotationPoint BoxStyle BoxWhiskerChart Bra BracketingBar BraKet BrayCurtisDistance BreadthFirstScan Break Brown BrownForsytheTest BrownianBridgeProcess BrowserCategory BSplineBasis BSplineCurve BSplineCurve3DBox BSplineCurveBox BSplineCurveBoxOptions BSplineFunction BSplineSurface BSplineSurface3DBox BubbleChart BubbleChart3D BubbleScale BubbleSizes BulletGauge BusinessDayQ ButterflyGraph ButterworthFilterModel Button ButtonBar ButtonBox ButtonBoxOptions ButtonCell ButtonContents ButtonData ButtonEvaluator ButtonExpandable ButtonFrame ButtonFunction ButtonMargins ButtonMinHeight ButtonNote ButtonNotebook ButtonSource ButtonStyle ButtonStyleMenuListing Byte ByteCount ByteOrdering C CachedValue CacheGraphics CalendarData CalendarType CallPacket CanberraDistance Cancel CancelButton CandlestickChart Cap CapForm CapitalDifferentialD CardinalBSplineBasis CarmichaelLambda Cases Cashflow Casoratian Catalan CatalanNumber Catch CauchyDistribution CauchyWindow CayleyGraph CDF CDFDeploy CDFInformation CDFWavelet Ceiling Cell CellAutoOverwrite CellBaseline CellBoundingBox CellBracketOptions CellChangeTimes CellContents CellContext CellDingbat CellDynamicExpression CellEditDuplicate CellElementsBoundingBox CellElementSpacings CellEpilog CellEvaluationDuplicate CellEvaluationFunction CellEventActions CellFrame CellFrameColor CellFrameLabelMargins CellFrameLabels CellFrameMargins CellGroup CellGroupData CellGrouping CellGroupingRules CellHorizontalScrolling CellID CellLabel CellLabelAutoDelete CellLabelMargins CellLabelPositioning CellMargins CellObject CellOpen CellPrint CellProlog Cells CellSize CellStyle CellTags CellularAutomaton CensoredDistribution Censoring Center CenterDot CentralMoment CentralMomentGeneratingFunction CForm ChampernowneNumber ChanVeseBinarize Character CharacterEncoding CharacterEncodingsPath CharacteristicFunction CharacteristicPolynomial CharacterRange Characters ChartBaseStyle ChartElementData ChartElementDataFunction ChartElementFunction ChartElements ChartLabels ChartLayout ChartLegends ChartStyle Chebyshev1FilterModel Chebyshev2FilterModel ChebyshevDistance ChebyshevT ChebyshevU Check CheckAbort CheckAll Checkbox CheckboxBar CheckboxBox CheckboxBoxOptions ChemicalData ChessboardDistance ChiDistribution ChineseRemainder ChiSquareDistribution ChoiceButtons ChoiceDialog CholeskyDecomposition Chop Circle CircleBox CircleDot CircleMinus CirclePlus CircleTimes CirculantGraph CityData Clear ClearAll ClearAttributes ClearSystemCache ClebschGordan ClickPane Clip ClipboardNotebook ClipFill ClippingStyle ClipPlanes ClipRange Clock ClockGauge ClockwiseContourIntegral Close Closed CloseKernels ClosenessCentrality Closing ClosingAutoSave ClosingEvent ClusteringComponents CMYKColor Coarse Coefficient CoefficientArrays CoefficientDomain CoefficientList CoefficientRules CoifletWavelet Collect Colon ColonForm ColorCombine ColorConvert ColorData ColorDataFunction ColorFunction ColorFunctionScaling Colorize ColorNegate ColorOutput ColorProfileData ColorQuantize ColorReplace ColorRules ColorSelectorSettings ColorSeparate ColorSetter ColorSetterBox ColorSetterBoxOptions ColorSlider ColorSpace Column ColumnAlignments ColumnBackgrounds ColumnForm ColumnLines ColumnsEqual ColumnSpacings ColumnWidths CommonDefaultFormatTypes Commonest CommonestFilter CommonUnits CommunityBoundaryStyle CommunityGraphPlot CommunityLabels CommunityRegionStyle CompatibleUnitQ CompilationOptions CompilationTarget Compile Compiled CompiledFunction Complement CompleteGraph CompleteGraphQ CompleteKaryTree CompletionsListPacket Complex Complexes ComplexExpand ComplexInfinity ComplexityFunction ComponentMeasurements ComponentwiseContextMenu Compose ComposeList ComposeSeries Composition CompoundExpression CompoundPoissonDistribution CompoundPoissonProcess CompoundRenewalProcess Compress CompressedData Condition ConditionalExpression Conditioned Cone ConeBox ConfidenceLevel ConfidenceRange ConfidenceTransform ConfigurationPath Congruent Conjugate ConjugateTranspose Conjunction Connect ConnectedComponents ConnectedGraphQ ConnesWindow ConoverTest ConsoleMessage ConsoleMessagePacket ConsolePrint Constant ConstantArray Constants ConstrainedMax ConstrainedMin ContentPadding ContentsBoundingBox ContentSelectable ContentSize Context ContextMenu Contexts ContextToFilename ContextToFileName Continuation Continue ContinuedFraction ContinuedFractionK ContinuousAction ContinuousMarkovProcess ContinuousTimeModelQ ContinuousWaveletData ContinuousWaveletTransform ContourDetect ContourGraphics ContourIntegral ContourLabels ContourLines ContourPlot ContourPlot3D Contours ContourShading ContourSmoothing ContourStyle ContraharmonicMean Control ControlActive ControlAlignment ControllabilityGramian ControllabilityMatrix ControllableDecomposition ControllableModelQ ControllerDuration ControllerInformation ControllerInformationData ControllerLinking ControllerManipulate ControllerMethod ControllerPath ControllerState ControlPlacement ControlsRendering ControlType Convergents ConversionOptions ConversionRules ConvertToBitmapPacket ConvertToPostScript ConvertToPostScriptPacket Convolve ConwayGroupCo1 ConwayGroupCo2 ConwayGroupCo3 CoordinateChartData CoordinatesToolOptions CoordinateTransform CoordinateTransformData CoprimeQ Coproduct CopulaDistribution Copyable CopyDirectory CopyFile CopyTag CopyToClipboard CornerFilter CornerNeighbors Correlation CorrelationDistance CorrelationFunction CorrelationTest Cos Cosh CoshIntegral CosineDistance CosineWindow CosIntegral Cot Coth Count CounterAssignments CounterBox CounterBoxOptions CounterClockwiseContourIntegral CounterEvaluator CounterFunction CounterIncrements CounterStyle CounterStyleMenuListing CountRoots CountryData Covariance CovarianceEstimatorFunction CovarianceFunction CoxianDistribution CoxIngersollRossProcess CoxModel CoxModelFit CramerVonMisesTest CreateArchive CreateDialog CreateDirectory CreateDocument CreateIntermediateDirectories CreatePalette CreatePalettePacket CreateScheduledTask CreateTemporary CreateWindow CriticalityFailureImportance CriticalitySuccessImportance CriticalSection Cross CrossingDetect CrossMatrix Csc Csch CubeRoot Cubics Cuboid CuboidBox Cumulant CumulantGeneratingFunction Cup CupCap Curl CurlyDoubleQuote CurlyQuote CurrentImage CurrentlySpeakingPacket CurrentValue CurvatureFlowFilter CurveClosed Cyan CycleGraph CycleIndexPolynomial Cycles CyclicGroup Cyclotomic Cylinder CylinderBox CylindricalDecomposition D DagumDistribution DamerauLevenshteinDistance DampingFactor Darker Dashed Dashing DataCompression DataDistribution DataRange DataReversed Date DateDelimiters DateDifference DateFunction DateList DateListLogPlot DateListPlot DatePattern DatePlus DateRange DateString DateTicksFormat DaubechiesWavelet DavisDistribution DawsonF DayCount DayCountConvention DayMatchQ DayName DayPlus DayRange DayRound DeBruijnGraph Debug DebugTag Decimal DeclareKnownSymbols DeclarePackage Decompose Decrement DedekindEta Default DefaultAxesStyle DefaultBaseStyle DefaultBoxStyle DefaultButton DefaultColor DefaultControlPlacement DefaultDuplicateCellStyle DefaultDuration DefaultElement DefaultFaceGridsStyle DefaultFieldHintStyle DefaultFont DefaultFontProperties DefaultFormatType DefaultFormatTypeForStyle DefaultFrameStyle DefaultFrameTicksStyle DefaultGridLinesStyle DefaultInlineFormatType DefaultInputFormatType DefaultLabelStyle DefaultMenuStyle DefaultNaturalLanguage DefaultNewCellStyle DefaultNewInlineCellStyle DefaultNotebook DefaultOptions DefaultOutputFormatType DefaultStyle DefaultStyleDefinitions DefaultTextFormatType DefaultTextInlineFormatType DefaultTicksStyle DefaultTooltipStyle DefaultValues Defer DefineExternal DefineInputStreamMethod DefineOutputStreamMethod Definition Degree DegreeCentrality DegreeGraphDistribution DegreeLexicographic DegreeReverseLexicographic Deinitialization Del Deletable Delete DeleteBorderComponents DeleteCases DeleteContents DeleteDirectory DeleteDuplicates DeleteFile DeleteSmallComponents DeleteWithContents DeletionWarning Delimiter DelimiterFlashTime DelimiterMatching Delimiters Denominator DensityGraphics DensityHistogram DensityPlot DependentVariables Deploy Deployed Depth DepthFirstScan Derivative DerivativeFilter DescriptorStateSpace DesignMatrix Det DGaussianWavelet DiacriticalPositioning Diagonal DiagonalMatrix Dialog DialogIndent DialogInput DialogLevel DialogNotebook DialogProlog DialogReturn DialogSymbols Diamond DiamondMatrix DiceDissimilarity DictionaryLookup DifferenceDelta DifferenceOrder DifferenceRoot DifferenceRootReduce Differences DifferentialD DifferentialRoot DifferentialRootReduce DifferentiatorFilter DigitBlock DigitBlockMinimum DigitCharacter DigitCount DigitQ DihedralGroup Dilation Dimensions DiracComb DiracDelta DirectedEdge DirectedEdges DirectedGraph DirectedGraphQ DirectedInfinity Direction Directive Directory DirectoryName DirectoryQ DirectoryStack DirichletCharacter DirichletConvolve DirichletDistribution DirichletL DirichletTransform DirichletWindow DisableConsolePrintPacket DiscreteChirpZTransform DiscreteConvolve DiscreteDelta DiscreteHadamardTransform DiscreteIndicator DiscreteLQEstimatorGains DiscreteLQRegulatorGains DiscreteLyapunovSolve DiscreteMarkovProcess DiscretePlot DiscretePlot3D DiscreteRatio DiscreteRiccatiSolve DiscreteShift DiscreteTimeModelQ DiscreteUniformDistribution DiscreteVariables DiscreteWaveletData DiscreteWaveletPacketTransform DiscreteWaveletTransform Discriminant Disjunction Disk DiskBox DiskMatrix Dispatch DispersionEstimatorFunction Display DisplayAllSteps DisplayEndPacket DisplayFlushImagePacket DisplayForm DisplayFunction DisplayPacket DisplayRules DisplaySetSizePacket DisplayString DisplayTemporary DisplayWith DisplayWithRef DisplayWithVariable DistanceFunction DistanceTransform Distribute Distributed DistributedContexts DistributeDefinitions DistributionChart DistributionDomain DistributionFitTest DistributionParameterAssumptions DistributionParameterQ Dithering Div Divergence Divide DivideBy Dividers Divisible Divisors DivisorSigma DivisorSum DMSList DMSString Do DockedCells DocumentNotebook DominantColors DOSTextFormat Dot DotDashed DotEqual Dotted DoubleBracketingBar DoubleContourIntegral DoubleDownArrow DoubleLeftArrow DoubleLeftRightArrow DoubleLeftTee DoubleLongLeftArrow DoubleLongLeftRightArrow DoubleLongRightArrow DoubleRightArrow DoubleRightTee DoubleUpArrow DoubleUpDownArrow DoubleVerticalBar DoublyInfinite Down DownArrow DownArrowBar DownArrowUpArrow DownLeftRightVector DownLeftTeeVector DownLeftVector DownLeftVectorBar DownRightTeeVector DownRightVector DownRightVectorBar Downsample DownTee DownTeeArrow DownValues DragAndDrop DrawEdges DrawFrontFaces DrawHighlighted Drop DSolve Dt DualLinearProgramming DualSystemsModel DumpGet DumpSave DuplicateFreeQ Dynamic DynamicBox DynamicBoxOptions DynamicEvaluationTimeout DynamicLocation DynamicModule DynamicModuleBox DynamicModuleBoxOptions DynamicModuleParent DynamicModuleValues DynamicName DynamicNamespace DynamicReference DynamicSetting DynamicUpdating DynamicWrapper DynamicWrapperBox DynamicWrapperBoxOptions E EccentricityCentrality EdgeAdd EdgeBetweennessCentrality EdgeCapacity EdgeCapForm EdgeColor EdgeConnectivity EdgeCost EdgeCount EdgeCoverQ EdgeDashing EdgeDelete EdgeDetect EdgeForm EdgeIndex EdgeJoinForm EdgeLabeling EdgeLabels EdgeLabelStyle EdgeList EdgeOpacity EdgeQ EdgeRenderingFunction EdgeRules EdgeShapeFunction EdgeStyle EdgeThickness EdgeWeight Editable EditButtonSettings EditCellTagsSettings EditDistance EffectiveInterest Eigensystem Eigenvalues EigenvectorCentrality Eigenvectors Element ElementData Eliminate EliminationOrder EllipticE EllipticExp EllipticExpPrime EllipticF EllipticFilterModel EllipticK EllipticLog EllipticNomeQ EllipticPi EllipticReducedHalfPeriods EllipticTheta EllipticThetaPrime EmitSound EmphasizeSyntaxErrors EmpiricalDistribution Empty EmptyGraphQ EnableConsolePrintPacket Enabled Encode End EndAdd EndDialogPacket EndFrontEndInteractionPacket EndOfFile EndOfLine EndOfString EndPackage EngineeringForm Enter EnterExpressionPacket EnterTextPacket Entropy EntropyFilter Environment Epilog Equal EqualColumns EqualRows EqualTilde EquatedTo Equilibrium EquirippleFilterKernel Equivalent Erf Erfc Erfi ErlangB ErlangC ErlangDistribution Erosion ErrorBox ErrorBoxOptions ErrorNorm ErrorPacket ErrorsDialogSettings EstimatedDistribution EstimatedProcess EstimatorGains EstimatorRegulator EuclideanDistance EulerE EulerGamma EulerianGraphQ EulerPhi Evaluatable Evaluate Evaluated EvaluatePacket EvaluationCell EvaluationCompletionAction EvaluationElements EvaluationMode EvaluationMonitor EvaluationNotebook EvaluationObject EvaluationOrder Evaluator EvaluatorNames EvenQ EventData EventEvaluator EventHandler EventHandlerTag EventLabels ExactBlackmanWindow ExactNumberQ ExactRootIsolation ExampleData Except ExcludedForms ExcludePods Exclusions ExclusionsStyle Exists Exit ExitDialog Exp Expand ExpandAll ExpandDenominator ExpandFileName ExpandNumerator Expectation ExpectationE ExpectedValue ExpGammaDistribution ExpIntegralE ExpIntegralEi Exponent ExponentFunction ExponentialDistribution ExponentialFamily ExponentialGeneratingFunction ExponentialMovingAverage ExponentialPowerDistribution ExponentPosition ExponentStep Export ExportAutoReplacements ExportPacket ExportString Expression ExpressionCell ExpressionPacket ExpToTrig ExtendedGCD Extension ExtentElementFunction ExtentMarkers ExtentSize ExternalCall ExternalDataCharacterEncoding Extract ExtractArchive ExtremeValueDistribution FaceForm FaceGrids FaceGridsStyle Factor FactorComplete Factorial Factorial2 FactorialMoment FactorialMomentGeneratingFunction FactorialPower FactorInteger FactorList FactorSquareFree FactorSquareFreeList FactorTerms FactorTermsList Fail FailureDistribution False FARIMAProcess FEDisableConsolePrintPacket FeedbackSector FeedbackSectorStyle FeedbackType FEEnableConsolePrintPacket Fibonacci FieldHint FieldHintStyle FieldMasked FieldSize File FileBaseName FileByteCount FileDate FileExistsQ FileExtension FileFormat FileHash FileInformation FileName FileNameDepth FileNameDialogSettings FileNameDrop FileNameJoin FileNames FileNameSetter FileNameSplit FileNameTake FilePrint FileType FilledCurve FilledCurveBox Filling FillingStyle FillingTransform FilterRules FinancialBond FinancialData FinancialDerivative FinancialIndicator Find FindArgMax FindArgMin FindClique FindClusters FindCurvePath FindDistributionParameters FindDivisions FindEdgeCover FindEdgeCut FindEulerianCycle FindFaces FindFile FindFit FindGeneratingFunction FindGeoLocation FindGeometricTransform FindGraphCommunities FindGraphIsomorphism FindGraphPartition FindHamiltonianCycle FindIndependentEdgeSet FindIndependentVertexSet FindInstance FindIntegerNullVector FindKClan FindKClique FindKClub FindKPlex FindLibrary FindLinearRecurrence FindList FindMaximum FindMaximumFlow FindMaxValue FindMinimum FindMinimumCostFlow FindMinimumCut FindMinValue FindPermutation FindPostmanTour FindProcessParameters FindRoot FindSequenceFunction FindSettings FindShortestPath FindShortestTour FindThreshold FindVertexCover FindVertexCut Fine FinishDynamic FiniteAbelianGroupCount FiniteGroupCount FiniteGroupData First FirstPassageTimeDistribution FischerGroupFi22 FischerGroupFi23 FischerGroupFi24Prime FisherHypergeometricDistribution FisherRatioTest FisherZDistribution Fit FitAll FittedModel FixedPoint FixedPointList FlashSelection Flat Flatten FlattenAt FlatTopWindow FlipView Floor FlushPrintOutputPacket Fold FoldList Font FontColor FontFamily FontForm FontName FontOpacity FontPostScriptName FontProperties FontReencoding FontSize FontSlant FontSubstitutions FontTracking FontVariations FontWeight For ForAll Format FormatRules FormatType FormatTypeAutoConvert FormatValues FormBox FormBoxOptions FortranForm Forward ForwardBackward Fourier FourierCoefficient FourierCosCoefficient FourierCosSeries FourierCosTransform FourierDCT FourierDCTFilter FourierDCTMatrix FourierDST FourierDSTMatrix FourierMatrix FourierParameters FourierSequenceTransform FourierSeries FourierSinCoefficient FourierSinSeries FourierSinTransform FourierTransform FourierTrigSeries FractionalBrownianMotionProcess FractionalPart FractionBox FractionBoxOptions FractionLine Frame FrameBox FrameBoxOptions Framed FrameInset FrameLabel Frameless FrameMargins FrameStyle FrameTicks FrameTicksStyle FRatioDistribution FrechetDistribution FreeQ FrequencySamplingFilterKernel FresnelC FresnelS Friday FrobeniusNumber FrobeniusSolve FromCharacterCode FromCoefficientRules FromContinuedFraction FromDate FromDigits FromDMS Front FrontEndDynamicExpression FrontEndEventActions FrontEndExecute FrontEndObject FrontEndResource FrontEndResourceString FrontEndStackSize FrontEndToken FrontEndTokenExecute FrontEndValueCache FrontEndVersion FrontFaceColor FrontFaceOpacity Full FullAxes FullDefinition FullForm FullGraphics FullOptions FullSimplify Function FunctionExpand FunctionInterpolation FunctionSpace FussellVeselyImportance GaborFilter GaborMatrix GaborWavelet GainMargins GainPhaseMargins Gamma GammaDistribution GammaRegularized GapPenalty Gather GatherBy GaugeFaceElementFunction GaugeFaceStyle GaugeFrameElementFunction GaugeFrameSize GaugeFrameStyle GaugeLabels GaugeMarkers GaugeStyle GaussianFilter GaussianIntegers GaussianMatrix GaussianWindow GCD GegenbauerC General GeneralizedLinearModelFit GenerateConditions GeneratedCell GeneratedParameters GeneratingFunction Generic GenericCylindricalDecomposition GenomeData GenomeLookup GeodesicClosing GeodesicDilation GeodesicErosion GeodesicOpening GeoDestination GeodesyData GeoDirection GeoDistance GeoGridPosition GeometricBrownianMotionProcess GeometricDistribution GeometricMean GeometricMeanFilter GeometricTransformation GeometricTransformation3DBox GeometricTransformation3DBoxOptions GeometricTransformationBox GeometricTransformationBoxOptions GeoPosition GeoPositionENU GeoPositionXYZ GeoProjectionData GestureHandler GestureHandlerTag Get GetBoundingBoxSizePacket GetContext GetEnvironment GetFileName GetFrontEndOptionsDataPacket GetLinebreakInformationPacket GetMenusPacket GetPageBreakInformationPacket Glaisher GlobalClusteringCoefficient GlobalPreferences GlobalSession Glow GoldenRatio GompertzMakehamDistribution GoodmanKruskalGamma GoodmanKruskalGammaTest Goto Grad Gradient GradientFilter GradientOrientationFilter Graph GraphAssortativity GraphCenter GraphComplement GraphData GraphDensity GraphDiameter GraphDifference GraphDisjointUnion GraphDistance GraphDistanceMatrix GraphElementData GraphEmbedding GraphHighlight GraphHighlightStyle GraphHub Graphics Graphics3D Graphics3DBox Graphics3DBoxOptions GraphicsArray GraphicsBaseline GraphicsBox GraphicsBoxOptions GraphicsColor GraphicsColumn GraphicsComplex GraphicsComplex3DBox GraphicsComplex3DBoxOptions GraphicsComplexBox GraphicsComplexBoxOptions GraphicsContents GraphicsData GraphicsGrid GraphicsGridBox GraphicsGroup GraphicsGroup3DBox GraphicsGroup3DBoxOptions GraphicsGroupBox GraphicsGroupBoxOptions GraphicsGrouping GraphicsHighlightColor GraphicsRow GraphicsSpacing GraphicsStyle GraphIntersection GraphLayout GraphLinkEfficiency GraphPeriphery GraphPlot GraphPlot3D GraphPower GraphPropertyDistribution GraphQ GraphRadius GraphReciprocity GraphRoot GraphStyle GraphUnion Gray GrayLevel GreatCircleDistance Greater GreaterEqual GreaterEqualLess GreaterFullEqual GreaterGreater GreaterLess GreaterSlantEqual GreaterTilde Green Grid GridBaseline GridBox GridBoxAlignment GridBoxBackground GridBoxDividers GridBoxFrame GridBoxItemSize GridBoxItemStyle GridBoxOptions GridBoxSpacings GridCreationSettings GridDefaultElement GridElementStyleOptions GridFrame GridFrameMargins GridGraph GridLines GridLinesStyle GroebnerBasis GroupActionBase GroupCentralizer GroupElementFromWord GroupElementPosition GroupElementQ GroupElements GroupElementToWord GroupGenerators GroupMultiplicationTable GroupOrbits GroupOrder GroupPageBreakWithin GroupSetwiseStabilizer GroupStabilizer GroupStabilizerChain Gudermannian GumbelDistribution HaarWavelet HadamardMatrix HalfNormalDistribution HamiltonianGraphQ HammingDistance HammingWindow HankelH1 HankelH2 HankelMatrix HannPoissonWindow HannWindow HaradaNortonGroupHN HararyGraph HarmonicMean HarmonicMeanFilter HarmonicNumber Hash HashTable Haversine HazardFunction Head HeadCompose Heads HeavisideLambda HeavisidePi HeavisideTheta HeldGroupHe HeldPart HelpBrowserLookup HelpBrowserNotebook HelpBrowserSettings HermiteDecomposition HermiteH HermitianMatrixQ HessenbergDecomposition Hessian HexadecimalCharacter Hexahedron HexahedronBox HexahedronBoxOptions HiddenSurface HighlightGraph HighlightImage HighpassFilter HigmanSimsGroupHS HilbertFilter HilbertMatrix Histogram Histogram3D HistogramDistribution HistogramList HistogramTransform HistogramTransformInterpolation HitMissTransform HITSCentrality HodgeDual HoeffdingD HoeffdingDTest Hold HoldAll HoldAllComplete HoldComplete HoldFirst HoldForm HoldPattern HoldRest HolidayCalendar HomeDirectory HomePage Horizontal HorizontalForm HorizontalGauge HorizontalScrollPosition HornerForm HotellingTSquareDistribution HoytDistribution HTMLSave Hue HumpDownHump HumpEqual HurwitzLerchPhi HurwitzZeta HyperbolicDistribution HypercubeGraph HyperexponentialDistribution Hyperfactorial Hypergeometric0F1 Hypergeometric0F1Regularized Hypergeometric1F1 Hypergeometric1F1Regularized Hypergeometric2F1 Hypergeometric2F1Regularized HypergeometricDistribution HypergeometricPFQ HypergeometricPFQRegularized HypergeometricU Hyperlink HyperlinkCreationSettings Hyphenation HyphenationOptions HypoexponentialDistribution HypothesisTestData I Identity IdentityMatrix If IgnoreCase Im Image Image3D Image3DSlices ImageAccumulate ImageAdd ImageAdjust ImageAlign ImageApply ImageAspectRatio ImageAssemble ImageCache ImageCacheValid ImageCapture ImageChannels ImageClip ImageColorSpace ImageCompose ImageConvolve ImageCooccurrence ImageCorners ImageCorrelate ImageCorrespondingPoints ImageCrop ImageData ImageDataPacket ImageDeconvolve ImageDemosaic ImageDifference ImageDimensions ImageDistance ImageEffect ImageFeatureTrack ImageFileApply ImageFileFilter ImageFileScan ImageFilter ImageForestingComponents ImageForwardTransformation ImageHistogram ImageKeypoints ImageLevels ImageLines ImageMargins ImageMarkers ImageMeasurements ImageMultiply ImageOffset ImagePad ImagePadding ImagePartition ImagePeriodogram ImagePerspectiveTransformation ImageQ ImageRangeCache ImageReflect ImageRegion ImageResize ImageResolution ImageRotate ImageRotated ImageScaled ImageScan ImageSize ImageSizeAction ImageSizeCache ImageSizeMultipliers ImageSizeRaw ImageSubtract ImageTake ImageTransformation ImageTrim ImageType ImageValue ImageValuePositions Implies Import ImportAutoReplacements ImportString ImprovementImportance In IncidenceGraph IncidenceList IncidenceMatrix IncludeConstantBasis IncludeFileExtension IncludePods IncludeSingularTerm Increment Indent IndentingNewlineSpacings IndentMaxFraction IndependenceTest IndependentEdgeSetQ IndependentUnit IndependentVertexSetQ Indeterminate IndexCreationOptions Indexed IndexGraph IndexTag Inequality InexactNumberQ InexactNumbers Infinity Infix Information Inherited InheritScope Initialization InitializationCell InitializationCellEvaluation InitializationCellWarning InlineCounterAssignments InlineCounterIncrements InlineRules Inner Inpaint Input InputAliases InputAssumptions InputAutoReplacements InputField InputFieldBox InputFieldBoxOptions InputForm InputGrouping InputNamePacket InputNotebook InputPacket InputSettings InputStream InputString InputStringPacket InputToBoxFormPacket Insert InsertionPointObject InsertResults Inset Inset3DBox Inset3DBoxOptions InsetBox InsetBoxOptions Install InstallService InString Integer IntegerDigits IntegerExponent IntegerLength IntegerPart IntegerPartitions IntegerQ Integers IntegerString Integral Integrate Interactive InteractiveTradingChart Interlaced Interleaving InternallyBalancedDecomposition InterpolatingFunction InterpolatingPolynomial Interpolation InterpolationOrder InterpolationPoints InterpolationPrecision Interpretation InterpretationBox InterpretationBoxOptions InterpretationFunction InterpretTemplate InterquartileRange Interrupt InterruptSettings Intersection Interval IntervalIntersection IntervalMemberQ IntervalUnion Inverse InverseBetaRegularized InverseCDF InverseChiSquareDistribution InverseContinuousWaveletTransform InverseDistanceTransform InverseEllipticNomeQ InverseErf InverseErfc InverseFourier InverseFourierCosTransform InverseFourierSequenceTransform InverseFourierSinTransform InverseFourierTransform InverseFunction InverseFunctions InverseGammaDistribution InverseGammaRegularized InverseGaussianDistribution InverseGudermannian InverseHaversine InverseJacobiCD InverseJacobiCN InverseJacobiCS InverseJacobiDC InverseJacobiDN InverseJacobiDS InverseJacobiNC InverseJacobiND InverseJacobiNS InverseJacobiSC InverseJacobiSD InverseJacobiSN InverseLaplaceTransform InversePermutation InverseRadon InverseSeries InverseSurvivalFunction InverseWaveletTransform InverseWeierstrassP InverseZTransform Invisible InvisibleApplication InvisibleTimes IrreduciblePolynomialQ IsolatingInterval IsomorphicGraphQ IsotopeData Italic Item ItemBox ItemBoxOptions ItemSize ItemStyle ItoProcess JaccardDissimilarity JacobiAmplitude Jacobian JacobiCD JacobiCN JacobiCS JacobiDC JacobiDN JacobiDS JacobiNC JacobiND JacobiNS JacobiP JacobiSC JacobiSD JacobiSN JacobiSymbol JacobiZeta JankoGroupJ1 JankoGroupJ2 JankoGroupJ3 JankoGroupJ4 JarqueBeraALMTest JohnsonDistribution Join Joined JoinedCurve JoinedCurveBox JoinForm JordanDecomposition JordanModelDecomposition K KagiChart KaiserBesselWindow KaiserWindow KalmanEstimator KalmanFilter KarhunenLoeveDecomposition KaryTree KatzCentrality KCoreComponents KDistribution KelvinBei KelvinBer KelvinKei KelvinKer KendallTau KendallTauTest KernelExecute KernelMixtureDistribution KernelObject Kernels Ket Khinchin KirchhoffGraph KirchhoffMatrix KleinInvariantJ KnightTourGraph KnotData KnownUnitQ KolmogorovSmirnovTest KroneckerDelta KroneckerModelDecomposition KroneckerProduct KroneckerSymbol KuiperTest KumaraswamyDistribution Kurtosis KuwaharaFilter Label Labeled LabeledSlider LabelingFunction LabelStyle LaguerreL LambdaComponents LambertW LanczosWindow LandauDistribution Language LanguageCategory LaplaceDistribution LaplaceTransform Laplacian LaplacianFilter LaplacianGaussianFilter Large Larger Last Latitude LatitudeLongitude LatticeData LatticeReduce Launch LaunchKernels LayeredGraphPlot LayerSizeFunction LayoutInformation LCM LeafCount LeapYearQ LeastSquares LeastSquaresFilterKernel Left LeftArrow LeftArrowBar LeftArrowRightArrow LeftDownTeeVector LeftDownVector LeftDownVectorBar LeftRightArrow LeftRightVector LeftTee LeftTeeArrow LeftTeeVector LeftTriangle LeftTriangleBar LeftTriangleEqual LeftUpDownVector LeftUpTeeVector LeftUpVector LeftUpVectorBar LeftVector LeftVectorBar LegendAppearance Legended LegendFunction LegendLabel LegendLayout LegendMargins LegendMarkers LegendMarkerSize LegendreP LegendreQ LegendreType Length LengthWhile LerchPhi Less LessEqual LessEqualGreater LessFullEqual LessGreater LessLess LessSlantEqual LessTilde LetterCharacter LetterQ Level LeveneTest LeviCivitaTensor LevyDistribution Lexicographic LibraryFunction LibraryFunctionError LibraryFunctionInformation LibraryFunctionLoad LibraryFunctionUnload LibraryLoad LibraryUnload LicenseID LiftingFilterData LiftingWaveletTransform LightBlue LightBrown LightCyan Lighter LightGray LightGreen Lighting LightingAngle LightMagenta LightOrange LightPink LightPurple LightRed LightSources LightYellow Likelihood Limit LimitsPositioning LimitsPositioningTokens LindleyDistribution Line Line3DBox LinearFilter LinearFractionalTransform LinearModelFit LinearOffsetFunction LinearProgramming LinearRecurrence LinearSolve LinearSolveFunction LineBox LineBreak LinebreakAdjustments LineBreakChart LineBreakWithin LineColor LineForm LineGraph LineIndent LineIndentMaxFraction LineIntegralConvolutionPlot LineIntegralConvolutionScale LineLegend LineOpacity LineSpacing LineWrapParts LinkActivate LinkClose LinkConnect LinkConnectedQ LinkCreate LinkError LinkFlush LinkFunction LinkHost LinkInterrupt LinkLaunch LinkMode LinkObject LinkOpen LinkOptions LinkPatterns LinkProtocol LinkRead LinkReadHeld LinkReadyQ Links LinkWrite LinkWriteHeld LiouvilleLambda List Listable ListAnimate ListContourPlot ListContourPlot3D ListConvolve ListCorrelate ListCurvePathPlot ListDeconvolve ListDensityPlot Listen ListFourierSequenceTransform ListInterpolation ListLineIntegralConvolutionPlot ListLinePlot ListLogLinearPlot ListLogLogPlot ListLogPlot ListPicker ListPickerBox ListPickerBoxBackground ListPickerBoxOptions ListPlay ListPlot ListPlot3D ListPointPlot3D ListPolarPlot ListQ ListStreamDensityPlot ListStreamPlot ListSurfacePlot3D ListVectorDensityPlot ListVectorPlot ListVectorPlot3D ListZTransform Literal LiteralSearch LocalClusteringCoefficient LocalizeVariables LocationEquivalenceTest LocationTest Locator LocatorAutoCreate LocatorBox LocatorBoxOptions LocatorCentering LocatorPane LocatorPaneBox LocatorPaneBoxOptions LocatorRegion Locked Log Log10 Log2 LogBarnesG LogGamma LogGammaDistribution LogicalExpand LogIntegral LogisticDistribution LogitModelFit LogLikelihood LogLinearPlot LogLogisticDistribution LogLogPlot LogMultinormalDistribution LogNormalDistribution LogPlot LogRankTest LogSeriesDistribution LongEqual Longest LongestAscendingSequence LongestCommonSequence LongestCommonSequencePositions LongestCommonSubsequence LongestCommonSubsequencePositions LongestMatch LongForm Longitude LongLeftArrow LongLeftRightArrow LongRightArrow Loopback LoopFreeGraphQ LowerCaseQ LowerLeftArrow LowerRightArrow LowerTriangularize LowpassFilter LQEstimatorGains LQGRegulator LQOutputRegulatorGains LQRegulatorGains LUBackSubstitution LucasL LuccioSamiComponents LUDecomposition LyapunovSolve LyonsGroupLy MachineID MachineName MachineNumberQ MachinePrecision MacintoshSystemPageSetup Magenta Magnification Magnify MainSolve MaintainDynamicCaches Majority MakeBoxes MakeExpression MakeRules MangoldtLambda ManhattanDistance Manipulate Manipulator MannWhitneyTest MantissaExponent Manual Map MapAll MapAt MapIndexed MAProcess MapThread MarcumQ MardiaCombinedTest MardiaKurtosisTest MardiaSkewnessTest MarginalDistribution MarkovProcessProperties Masking MatchingDissimilarity MatchLocalNameQ MatchLocalNames MatchQ Material MathematicaNotation MathieuC MathieuCharacteristicA MathieuCharacteristicB MathieuCharacteristicExponent MathieuCPrime MathieuGroupM11 MathieuGroupM12 MathieuGroupM22 MathieuGroupM23 MathieuGroupM24 MathieuS MathieuSPrime MathMLForm MathMLText Matrices MatrixExp MatrixForm MatrixFunction MatrixLog MatrixPlot MatrixPower MatrixQ MatrixRank Max MaxBend MaxDetect MaxExtraBandwidths MaxExtraConditions MaxFeatures MaxFilter Maximize MaxIterations MaxMemoryUsed MaxMixtureKernels MaxPlotPoints MaxPoints MaxRecursion MaxStableDistribution MaxStepFraction MaxSteps MaxStepSize MaxValue MaxwellDistribution McLaughlinGroupMcL Mean MeanClusteringCoefficient MeanDegreeConnectivity MeanDeviation MeanFilter MeanGraphDistance MeanNeighborDegree MeanShift MeanShiftFilter Median MedianDeviation MedianFilter Medium MeijerG MeixnerDistribution MemberQ MemoryConstrained MemoryInUse Menu MenuAppearance MenuCommandKey MenuEvaluator MenuItem MenuPacket MenuSortingValue MenuStyle MenuView MergeDifferences Mesh MeshFunctions MeshRange MeshShading MeshStyle Message MessageDialog MessageList MessageName MessageOptions MessagePacket Messages MessagesNotebook MetaCharacters MetaInformation Method MethodOptions MexicanHatWavelet MeyerWavelet Min MinDetect MinFilter MinimalPolynomial MinimalStateSpaceModel Minimize Minors MinRecursion MinSize MinStableDistribution Minus MinusPlus MinValue Missing MissingDataMethod MittagLefflerE MixedRadix MixedRadixQuantity MixtureDistribution Mod Modal Mode Modular ModularLambda Module Modulus MoebiusMu Moment Momentary MomentConvert MomentEvaluate MomentGeneratingFunction Monday Monitor MonomialList MonomialOrder MonsterGroupM MorletWavelet MorphologicalBinarize MorphologicalBranchPoints MorphologicalComponents MorphologicalEulerNumber MorphologicalGraph MorphologicalPerimeter MorphologicalTransform Most MouseAnnotation MouseAppearance MouseAppearanceTag MouseButtons Mouseover MousePointerNote MousePosition MovingAverage MovingMedian MoyalDistribution MultiedgeStyle MultilaunchWarning MultiLetterItalics MultiLetterStyle MultilineFunction Multinomial MultinomialDistribution MultinormalDistribution MultiplicativeOrder Multiplicity Multiselection MultivariateHypergeometricDistribution MultivariatePoissonDistribution MultivariateTDistribution N NakagamiDistribution NameQ Names NamespaceBox Nand NArgMax NArgMin NBernoulliB NCache NDSolve NDSolveValue Nearest NearestFunction NeedCurrentFrontEndPackagePacket NeedCurrentFrontEndSymbolsPacket NeedlemanWunschSimilarity Needs Negative NegativeBinomialDistribution NegativeMultinomialDistribution NeighborhoodGraph Nest NestedGreaterGreater NestedLessLess NestedScriptRules NestList NestWhile NestWhileList NevilleThetaC NevilleThetaD NevilleThetaN NevilleThetaS NewPrimitiveStyle NExpectation Next NextPrime NHoldAll NHoldFirst NHoldRest NicholsGridLines NicholsPlot NIntegrate NMaximize NMaxValue NMinimize NMinValue NominalVariables NonAssociative NoncentralBetaDistribution NoncentralChiSquareDistribution NoncentralFRatioDistribution NoncentralStudentTDistribution NonCommutativeMultiply NonConstants None NonlinearModelFit NonlocalMeansFilter NonNegative NonPositive Nor NorlundB Norm Normal NormalDistribution NormalGrouping Normalize NormalizedSquaredEuclideanDistance NormalsFunction NormFunction Not NotCongruent NotCupCap NotDoubleVerticalBar Notebook NotebookApply NotebookAutoSave NotebookClose NotebookConvertSettings NotebookCreate NotebookCreateReturnObject NotebookDefault NotebookDelete NotebookDirectory NotebookDynamicExpression NotebookEvaluate NotebookEventActions NotebookFileName NotebookFind NotebookFindReturnObject NotebookGet NotebookGetLayoutInformationPacket NotebookGetMisspellingsPacket NotebookInformation NotebookInterfaceObject NotebookLocate NotebookObject NotebookOpen NotebookOpenReturnObject NotebookPath NotebookPrint NotebookPut NotebookPutReturnObject NotebookRead NotebookResetGeneratedCells Notebooks NotebookSave NotebookSaveAs NotebookSelection NotebookSetupLayoutInformationPacket NotebooksMenu NotebookWrite NotElement NotEqualTilde NotExists NotGreater NotGreaterEqual NotGreaterFullEqual NotGreaterGreater NotGreaterLess NotGreaterSlantEqual NotGreaterTilde NotHumpDownHump NotHumpEqual NotLeftTriangle NotLeftTriangleBar NotLeftTriangleEqual NotLess NotLessEqual NotLessFullEqual NotLessGreater NotLessLess NotLessSlantEqual NotLessTilde NotNestedGreaterGreater NotNestedLessLess NotPrecedes NotPrecedesEqual NotPrecedesSlantEqual NotPrecedesTilde NotReverseElement NotRightTriangle NotRightTriangleBar NotRightTriangleEqual NotSquareSubset NotSquareSubsetEqual NotSquareSuperset NotSquareSupersetEqual NotSubset NotSubsetEqual NotSucceeds NotSucceedsEqual NotSucceedsSlantEqual NotSucceedsTilde NotSuperset NotSupersetEqual NotTilde NotTildeEqual NotTildeFullEqual NotTildeTilde NotVerticalBar NProbability NProduct NProductFactors NRoots NSolve NSum NSumTerms Null NullRecords NullSpace NullWords Number NumberFieldClassNumber NumberFieldDiscriminant NumberFieldFundamentalUnits NumberFieldIntegralBasis NumberFieldNormRepresentatives NumberFieldRegulator NumberFieldRootsOfUnity NumberFieldSignature NumberForm NumberFormat NumberMarks NumberMultiplier NumberPadding NumberPoint NumberQ NumberSeparator NumberSigns NumberString Numerator NumericFunction NumericQ NuttallWindow NValues NyquistGridLines NyquistPlot O ObservabilityGramian ObservabilityMatrix ObservableDecomposition ObservableModelQ OddQ Off Offset OLEData On ONanGroupON OneIdentity Opacity Open OpenAppend Opener OpenerBox OpenerBoxOptions OpenerView OpenFunctionInspectorPacket Opening OpenRead OpenSpecialOptions OpenTemporary OpenWrite Operate OperatingSystem OptimumFlowData Optional OptionInspectorSettings OptionQ Options OptionsPacket OptionsPattern OptionValue OptionValueBox OptionValueBoxOptions Or Orange Order OrderDistribution OrderedQ Ordering Orderless OrnsteinUhlenbeckProcess Orthogonalize Out Outer OutputAutoOverwrite OutputControllabilityMatrix OutputControllableModelQ OutputForm OutputFormData OutputGrouping OutputMathEditExpression OutputNamePacket OutputResponse OutputSizeLimit OutputStream Over OverBar OverDot Overflow OverHat Overlaps Overlay OverlayBox OverlayBoxOptions Overscript OverscriptBox OverscriptBoxOptions OverTilde OverVector OwenT OwnValues PackingMethod PaddedForm Padding PadeApproximant PadLeft PadRight PageBreakAbove PageBreakBelow PageBreakWithin PageFooterLines PageFooters PageHeaderLines PageHeaders PageHeight PageRankCentrality PageWidth PairedBarChart PairedHistogram PairedSmoothHistogram PairedTTest PairedZTest PaletteNotebook PalettePath Pane PaneBox PaneBoxOptions Panel PanelBox PanelBoxOptions Paneled PaneSelector PaneSelectorBox PaneSelectorBoxOptions PaperWidth ParabolicCylinderD ParagraphIndent ParagraphSpacing ParallelArray ParallelCombine ParallelDo ParallelEvaluate Parallelization Parallelize ParallelMap ParallelNeeds ParallelProduct ParallelSubmit ParallelSum ParallelTable ParallelTry Parameter ParameterEstimator ParameterMixtureDistribution ParameterVariables ParametricFunction ParametricNDSolve ParametricNDSolveValue ParametricPlot ParametricPlot3D ParentConnect ParentDirectory ParentForm Parenthesize ParentList ParetoDistribution Part PartialCorrelationFunction PartialD ParticleData Partition PartitionsP PartitionsQ ParzenWindow PascalDistribution PassEventsDown PassEventsUp Paste PasteBoxFormInlineCells PasteButton Path PathGraph PathGraphQ Pattern PatternSequence PatternTest PauliMatrix PaulWavelet Pause PausedTime PDF PearsonChiSquareTest PearsonCorrelationTest PearsonDistribution PerformanceGoal PeriodicInterpolation Periodogram PeriodogramArray PermutationCycles PermutationCyclesQ PermutationGroup PermutationLength PermutationList PermutationListQ PermutationMax PermutationMin PermutationOrder PermutationPower PermutationProduct PermutationReplace Permutations PermutationSupport Permute PeronaMalikFilter Perpendicular PERTDistribution PetersenGraph PhaseMargins Pi Pick PIDData PIDDerivativeFilter PIDFeedforward PIDTune Piecewise PiecewiseExpand PieChart PieChart3D PillaiTrace PillaiTraceTest Pink Pivoting PixelConstrained PixelValue PixelValuePositions Placed Placeholder PlaceholderReplace Plain PlanarGraphQ Play PlayRange Plot Plot3D Plot3Matrix PlotDivision PlotJoined PlotLabel PlotLayout PlotLegends PlotMarkers PlotPoints PlotRange PlotRangeClipping PlotRangePadding PlotRegion PlotStyle Plus PlusMinus Pochhammer PodStates PodWidth Point Point3DBox PointBox PointFigureChart PointForm PointLegend PointSize PoissonConsulDistribution PoissonDistribution PoissonProcess PoissonWindow PolarAxes PolarAxesOrigin PolarGridLines PolarPlot PolarTicks PoleZeroMarkers PolyaAeppliDistribution PolyGamma Polygon Polygon3DBox Polygon3DBoxOptions PolygonBox PolygonBoxOptions PolygonHoleScale PolygonIntersections PolygonScale PolyhedronData PolyLog PolynomialExtendedGCD PolynomialForm PolynomialGCD PolynomialLCM PolynomialMod PolynomialQ PolynomialQuotient PolynomialQuotientRemainder PolynomialReduce PolynomialRemainder Polynomials PopupMenu PopupMenuBox PopupMenuBoxOptions PopupView PopupWindow Position Positive PositiveDefiniteMatrixQ PossibleZeroQ Postfix PostScript Power PowerDistribution PowerExpand PowerMod PowerModList PowerSpectralDensity PowersRepresentations PowerSymmetricPolynomial Precedence PrecedenceForm Precedes PrecedesEqual PrecedesSlantEqual PrecedesTilde Precision PrecisionGoal PreDecrement PredictionRoot PreemptProtect PreferencesPath Prefix PreIncrement Prepend PrependTo PreserveImageOptions Previous PriceGraphDistribution PrimaryPlaceholder Prime PrimeNu PrimeOmega PrimePi PrimePowerQ PrimeQ Primes PrimeZetaP PrimitiveRoot PrincipalComponents PrincipalValue Print PrintAction PrintForm PrintingCopies PrintingOptions PrintingPageRange PrintingStartingPageNumber PrintingStyleEnvironment PrintPrecision PrintTemporary Prism PrismBox PrismBoxOptions PrivateCellOptions PrivateEvaluationOptions PrivateFontOptions PrivateFrontEndOptions PrivateNotebookOptions PrivatePaths Probability ProbabilityDistribution ProbabilityPlot ProbabilityPr ProbabilityScalePlot ProbitModelFit ProcessEstimator ProcessParameterAssumptions ProcessParameterQ ProcessStateDomain ProcessTimeDomain Product ProductDistribution ProductLog ProgressIndicator ProgressIndicatorBox ProgressIndicatorBoxOptions Projection Prolog PromptForm Properties Property PropertyList PropertyValue Proportion Proportional Protect Protected ProteinData Pruning PseudoInverse Purple Put PutAppend Pyramid PyramidBox PyramidBoxOptions QBinomial QFactorial QGamma QHypergeometricPFQ QPochhammer QPolyGamma QRDecomposition QuadraticIrrationalQ Quantile QuantilePlot Quantity QuantityForm QuantityMagnitude QuantityQ QuantityUnit Quartics QuartileDeviation Quartiles QuartileSkewness QueueingNetworkProcess QueueingProcess QueueProperties Quiet Quit Quotient QuotientRemainder RadialityCentrality RadicalBox RadicalBoxOptions RadioButton RadioButtonBar RadioButtonBox RadioButtonBoxOptions Radon RamanujanTau RamanujanTauL RamanujanTauTheta RamanujanTauZ Random RandomChoice RandomComplex RandomFunction RandomGraph RandomImage RandomInteger RandomPermutation RandomPrime RandomReal RandomSample RandomSeed RandomVariate RandomWalkProcess Range RangeFilter RangeSpecification RankedMax RankedMin Raster Raster3D Raster3DBox Raster3DBoxOptions RasterArray RasterBox RasterBoxOptions Rasterize RasterSize Rational RationalFunctions Rationalize Rationals Ratios Raw RawArray RawBoxes RawData RawMedium RayleighDistribution Re Read ReadList ReadProtected Real RealBlockDiagonalForm RealDigits RealExponent Reals Reap Record RecordLists RecordSeparators Rectangle RectangleBox RectangleBoxOptions RectangleChart RectangleChart3D RecurrenceFilter RecurrenceTable RecurringDigitsForm Red Reduce RefBox ReferenceLineStyle ReferenceMarkers ReferenceMarkerStyle Refine ReflectionMatrix ReflectionTransform Refresh RefreshRate RegionBinarize RegionFunction RegionPlot RegionPlot3D RegularExpression Regularization Reinstall Release ReleaseHold ReliabilityDistribution ReliefImage ReliefPlot Remove RemoveAlphaChannel RemoveAsynchronousTask Removed RemoveInputStreamMethod RemoveOutputStreamMethod RemoveProperty RemoveScheduledTask RenameDirectory RenameFile RenderAll RenderingOptions RenewalProcess RenkoChart Repeated RepeatedNull RepeatedString Replace ReplaceAll ReplaceHeldPart ReplaceImageValue ReplaceList ReplacePart ReplacePixelValue ReplaceRepeated Resampling Rescale RescalingTransform ResetDirectory ResetMenusPacket ResetScheduledTask Residue Resolve Rest Resultant ResumePacket Return ReturnExpressionPacket ReturnInputFormPacket ReturnPacket ReturnTextPacket Reverse ReverseBiorthogonalSplineWavelet ReverseElement ReverseEquilibrium ReverseGraph ReverseUpEquilibrium RevolutionAxis RevolutionPlot3D RGBColor RiccatiSolve RiceDistribution RidgeFilter RiemannR RiemannSiegelTheta RiemannSiegelZ Riffle Right RightArrow RightArrowBar RightArrowLeftArrow RightCosetRepresentative RightDownTeeVector RightDownVector RightDownVectorBar RightTee RightTeeArrow RightTeeVector RightTriangle RightTriangleBar RightTriangleEqual RightUpDownVector RightUpTeeVector RightUpVector RightUpVectorBar RightVector RightVectorBar RiskAchievementImportance RiskReductionImportance RogersTanimotoDissimilarity Root RootApproximant RootIntervals RootLocusPlot RootMeanSquare RootOfUnityQ RootReduce Roots RootSum Rotate RotateLabel RotateLeft RotateRight RotationAction RotationBox RotationBoxOptions RotationMatrix RotationTransform Round RoundImplies RoundingRadius Row RowAlignments RowBackgrounds RowBox RowHeights RowLines RowMinHeight RowReduce RowsEqual RowSpacings RSolve RudvalisGroupRu Rule RuleCondition RuleDelayed RuleForm RulerUnits Run RunScheduledTask RunThrough RuntimeAttributes RuntimeOptions RussellRaoDissimilarity SameQ SameTest SampleDepth SampledSoundFunction SampledSoundList SampleRate SamplingPeriod SARIMAProcess SARMAProcess SatisfiabilityCount SatisfiabilityInstances SatisfiableQ Saturday Save Saveable SaveAutoDelete SaveDefinitions SawtoothWave Scale Scaled ScaleDivisions ScaledMousePosition ScaleOrigin ScalePadding ScaleRanges ScaleRangeStyle ScalingFunctions ScalingMatrix ScalingTransform Scan ScheduledTaskActiveQ ScheduledTaskData ScheduledTaskObject ScheduledTasks SchurDecomposition ScientificForm ScreenRectangle ScreenStyleEnvironment ScriptBaselineShifts ScriptLevel ScriptMinSize ScriptRules ScriptSizeMultipliers Scrollbars ScrollingOptions ScrollPosition Sec Sech SechDistribution SectionGrouping SectorChart SectorChart3D SectorOrigin SectorSpacing SeedRandom Select Selectable SelectComponents SelectedCells SelectedNotebook Selection SelectionAnimate SelectionCell SelectionCellCreateCell SelectionCellDefaultStyle SelectionCellParentStyle SelectionCreateCell SelectionDebuggerTag SelectionDuplicateCell SelectionEvaluate SelectionEvaluateCreateCell SelectionMove SelectionPlaceholder SelectionSetStyle SelectWithContents SelfLoops SelfLoopStyle SemialgebraicComponentInstances SendMail Sequence SequenceAlignment SequenceForm SequenceHold SequenceLimit Series SeriesCoefficient SeriesData SessionTime Set SetAccuracy SetAlphaChannel SetAttributes Setbacks SetBoxFormNamesPacket SetDelayed SetDirectory SetEnvironment SetEvaluationNotebook SetFileDate SetFileLoadingContext SetNotebookStatusLine SetOptions SetOptionsPacket SetPrecision SetProperty SetSelectedNotebook SetSharedFunction SetSharedVariable SetSpeechParametersPacket SetStreamPosition SetSystemOptions Setter SetterBar SetterBox SetterBoxOptions Setting SetValue Shading Shallow ShannonWavelet ShapiroWilkTest Share Sharpen ShearingMatrix ShearingTransform ShenCastanMatrix Short ShortDownArrow Shortest ShortestMatch ShortestPathFunction ShortLeftArrow ShortRightArrow ShortUpArrow Show ShowAutoStyles ShowCellBracket ShowCellLabel ShowCellTags ShowClosedCellArea ShowContents ShowControls ShowCursorTracker ShowGroupOpenCloseIcon ShowGroupOpener ShowInvisibleCharacters ShowPageBreaks ShowPredictiveInterface ShowSelection ShowShortBoxForm ShowSpecialCharacters ShowStringCharacters ShowSyntaxStyles ShrinkingDelay ShrinkWrapBoundingBox SiegelTheta SiegelTukeyTest Sign Signature SignedRankTest SignificanceLevel SignPadding SignTest SimilarityRules SimpleGraph SimpleGraphQ Simplify Sin Sinc SinghMaddalaDistribution SingleEvaluation SingleLetterItalics SingleLetterStyle SingularValueDecomposition SingularValueList SingularValuePlot SingularValues Sinh SinhIntegral SinIntegral SixJSymbol Skeleton SkeletonTransform SkellamDistribution Skewness SkewNormalDistribution Skip SliceDistribution Slider Slider2D Slider2DBox Slider2DBoxOptions SliderBox SliderBoxOptions SlideView Slot SlotSequence Small SmallCircle Smaller SmithDelayCompensator SmithWatermanSimilarity SmoothDensityHistogram SmoothHistogram SmoothHistogram3D SmoothKernelDistribution SocialMediaData Socket SokalSneathDissimilarity Solve SolveAlways SolveDelayed Sort SortBy Sound SoundAndGraphics SoundNote SoundVolume Sow Space SpaceForm Spacer Spacings Span SpanAdjustments SpanCharacterRounding SpanFromAbove SpanFromBoth SpanFromLeft SpanLineThickness SpanMaxSize SpanMinSize SpanningCharacters SpanSymmetric SparseArray SpatialGraphDistribution Speak SpeakTextPacket SpearmanRankTest SpearmanRho Spectrogram SpectrogramArray Specularity SpellingCorrection SpellingDictionaries SpellingDictionariesPath SpellingOptions SpellingSuggestionsPacket Sphere SphereBox SphericalBesselJ SphericalBesselY SphericalHankelH1 SphericalHankelH2 SphericalHarmonicY SphericalPlot3D SphericalRegion SpheroidalEigenvalue SpheroidalJoiningFactor SpheroidalPS SpheroidalPSPrime SpheroidalQS SpheroidalQSPrime SpheroidalRadialFactor SpheroidalS1 SpheroidalS1Prime SpheroidalS2 SpheroidalS2Prime Splice SplicedDistribution SplineClosed SplineDegree SplineKnots SplineWeights Split SplitBy SpokenString Sqrt SqrtBox SqrtBoxOptions Square SquaredEuclideanDistance SquareFreeQ SquareIntersection SquaresR SquareSubset SquareSubsetEqual SquareSuperset SquareSupersetEqual SquareUnion SquareWave StabilityMargins StabilityMarginsStyle StableDistribution Stack StackBegin StackComplete StackInhibit StandardDeviation StandardDeviationFilter StandardForm Standardize StandbyDistribution Star StarGraph StartAsynchronousTask StartingStepSize StartOfLine StartOfString StartScheduledTask StartupSound StateDimensions StateFeedbackGains StateOutputEstimator StateResponse StateSpaceModel StateSpaceRealization StateSpaceTransform StationaryDistribution StationaryWaveletPacketTransform StationaryWaveletTransform StatusArea StatusCentrality StepMonitor StieltjesGamma StirlingS1 StirlingS2 StopAsynchronousTask StopScheduledTask StrataVariables StratonovichProcess StreamColorFunction StreamColorFunctionScaling StreamDensityPlot StreamPlot StreamPoints StreamPosition Streams StreamScale StreamStyle String StringBreak StringByteCount StringCases StringCount StringDrop StringExpression StringForm StringFormat StringFreeQ StringInsert StringJoin StringLength StringMatchQ StringPosition StringQ StringReplace StringReplaceList StringReplacePart StringReverse StringRotateLeft StringRotateRight StringSkeleton StringSplit StringTake StringToStream StringTrim StripBoxes StripOnInput StripWrapperBoxes StrokeForm StructuralImportance StructuredArray StructuredSelection StruveH StruveL Stub StudentTDistribution Style StyleBox StyleBoxAutoDelete StyleBoxOptions StyleData StyleDefinitions StyleForm StyleKeyMapping StyleMenuListing StyleNameDialogSettings StyleNames StylePrint StyleSheetPath Subfactorial Subgraph SubMinus SubPlus SubresultantPolynomialRemainders SubresultantPolynomials Subresultants Subscript SubscriptBox SubscriptBoxOptions Subscripted Subset SubsetEqual Subsets SubStar Subsuperscript SubsuperscriptBox SubsuperscriptBoxOptions Subtract SubtractFrom SubValues Succeeds SucceedsEqual SucceedsSlantEqual SucceedsTilde SuchThat Sum SumConvergence Sunday SuperDagger SuperMinus SuperPlus Superscript SuperscriptBox SuperscriptBoxOptions Superset SupersetEqual SuperStar Surd SurdForm SurfaceColor SurfaceGraphics SurvivalDistribution SurvivalFunction SurvivalModel SurvivalModelFit SuspendPacket SuzukiDistribution SuzukiGroupSuz SwatchLegend Switch Symbol SymbolName SymletWavelet Symmetric SymmetricGroup SymmetricMatrixQ SymmetricPolynomial SymmetricReduction Symmetrize SymmetrizedArray SymmetrizedArrayRules SymmetrizedDependentComponents SymmetrizedIndependentComponents SymmetrizedReplacePart SynchronousInitialization SynchronousUpdating Syntax SyntaxForm SyntaxInformation SyntaxLength SyntaxPacket SyntaxQ SystemDialogInput SystemException SystemHelpPath SystemInformation SystemInformationData SystemOpen SystemOptions SystemsModelDelay SystemsModelDelayApproximate SystemsModelDelete SystemsModelDimensions SystemsModelExtract SystemsModelFeedbackConnect SystemsModelLabels SystemsModelOrder SystemsModelParallelConnect SystemsModelSeriesConnect SystemsModelStateFeedbackConnect SystemStub Tab TabFilling Table TableAlignments TableDepth TableDirections TableForm TableHeadings TableSpacing TableView TableViewBox TabSpacings TabView TabViewBox TabViewBoxOptions TagBox TagBoxNote TagBoxOptions TaggingRules TagSet TagSetDelayed TagStyle TagUnset Take TakeWhile Tally Tan Tanh TargetFunctions TargetUnits TautologyQ TelegraphProcess TemplateBox TemplateBoxOptions TemplateSlotSequence TemporalData Temporary TemporaryVariable TensorContract TensorDimensions TensorExpand TensorProduct TensorQ TensorRank TensorReduce TensorSymmetry TensorTranspose TensorWedge Tetrahedron TetrahedronBox TetrahedronBoxOptions TeXForm TeXSave Text Text3DBox Text3DBoxOptions TextAlignment TextBand TextBoundingBox TextBox TextCell TextClipboardType TextData TextForm TextJustification TextLine TextPacket TextParagraph TextRecognize TextRendering TextStyle Texture TextureCoordinateFunction TextureCoordinateScaling Therefore ThermometerGauge Thick Thickness Thin Thinning ThisLink ThompsonGroupTh Thread ThreeJSymbol Threshold Through Throw Thumbnail Thursday Ticks TicksStyle Tilde TildeEqual TildeFullEqual TildeTilde TimeConstrained TimeConstraint Times TimesBy TimeSeriesForecast TimeSeriesInvertibility TimeUsed TimeValue TimeZone Timing Tiny TitleGrouping TitsGroupT ToBoxes ToCharacterCode ToColor ToContinuousTimeModel ToDate ToDiscreteTimeModel ToeplitzMatrix ToExpression ToFileName Together Toggle ToggleFalse Toggler TogglerBar TogglerBox TogglerBoxOptions ToHeldExpression ToInvertibleTimeSeries TokenWords Tolerance ToLowerCase ToNumberField TooBig Tooltip TooltipBox TooltipBoxOptions TooltipDelay TooltipStyle Top TopHatTransform TopologicalSort ToRadicals ToRules ToString Total TotalHeight TotalVariationFilter TotalWidth TouchscreenAutoZoom TouchscreenControlPlacement ToUpperCase Tr Trace TraceAbove TraceAction TraceBackward TraceDepth TraceDialog TraceForward TraceInternal TraceLevel TraceOff TraceOn TraceOriginal TracePrint TraceScan TrackedSymbols TradingChart TraditionalForm TraditionalFunctionNotation TraditionalNotation TraditionalOrder TransferFunctionCancel TransferFunctionExpand TransferFunctionFactor TransferFunctionModel TransferFunctionPoles TransferFunctionTransform TransferFunctionZeros TransformationFunction TransformationFunctions TransformationMatrix TransformedDistribution TransformedField Translate TranslationTransform TransparentColor Transpose TreeForm TreeGraph TreeGraphQ TreePlot TrendStyle TriangleWave TriangularDistribution Trig TrigExpand TrigFactor TrigFactorList Trigger TrigReduce TrigToExp TrimmedMean True TrueQ TruncatedDistribution TsallisQExponentialDistribution TsallisQGaussianDistribution TTest Tube TubeBezierCurveBox TubeBezierCurveBoxOptions TubeBox TubeBSplineCurveBox TubeBSplineCurveBoxOptions Tuesday TukeyLambdaDistribution TukeyWindow Tuples TuranGraph TuringMachine Transparent UnateQ Uncompress Undefined UnderBar Underflow Underlined Underoverscript UnderoverscriptBox UnderoverscriptBoxOptions Underscript UnderscriptBox UnderscriptBoxOptions UndirectedEdge UndirectedGraph UndirectedGraphQ UndocumentedTestFEParserPacket UndocumentedTestGetSelectionPacket Unequal Unevaluated UniformDistribution UniformGraphDistribution UniformSumDistribution Uninstall Union UnionPlus Unique UnitBox UnitConvert UnitDimensions Unitize UnitRootTest UnitSimplify UnitStep UnitTriangle UnitVector Unprotect UnsameQ UnsavedVariables Unset UnsetShared UntrackedVariables Up UpArrow UpArrowBar UpArrowDownArrow Update UpdateDynamicObjects UpdateDynamicObjectsSynchronous UpdateInterval UpDownArrow UpEquilibrium UpperCaseQ UpperLeftArrow UpperRightArrow UpperTriangularize Upsample UpSet UpSetDelayed UpTee UpTeeArrow UpValues URL URLFetch URLFetchAsynchronous URLSave URLSaveAsynchronous UseGraphicsRange Using UsingFrontEnd V2Get ValidationLength Value ValueBox ValueBoxOptions ValueForm ValueQ ValuesData Variables Variance VarianceEquivalenceTest VarianceEstimatorFunction VarianceGammaDistribution VarianceTest VectorAngle VectorColorFunction VectorColorFunctionScaling VectorDensityPlot VectorGlyphData VectorPlot VectorPlot3D VectorPoints VectorQ Vectors VectorScale VectorStyle Vee Verbatim Verbose VerboseConvertToPostScriptPacket VerifyConvergence VerifySolutions VerifyTestAssumptions Version VersionNumber VertexAdd VertexCapacity VertexColors VertexComponent VertexConnectivity VertexCoordinateRules VertexCoordinates VertexCorrelationSimilarity VertexCosineSimilarity VertexCount VertexCoverQ VertexDataCoordinates VertexDegree VertexDelete VertexDiceSimilarity VertexEccentricity VertexInComponent VertexInDegree VertexIndex VertexJaccardSimilarity VertexLabeling VertexLabels VertexLabelStyle VertexList VertexNormals VertexOutComponent VertexOutDegree VertexQ VertexRenderingFunction VertexReplace VertexShape VertexShapeFunction VertexSize VertexStyle VertexTextureCoordinates VertexWeight Vertical VerticalBar VerticalForm VerticalGauge VerticalSeparator VerticalSlider VerticalTilde ViewAngle ViewCenter ViewMatrix ViewPoint ViewPointSelectorSettings ViewPort ViewRange ViewVector ViewVertical VirtualGroupData Visible VisibleCell VoigtDistribution VonMisesDistribution WaitAll WaitAsynchronousTask WaitNext WaitUntil WakebyDistribution WalleniusHypergeometricDistribution WaringYuleDistribution WatershedComponents WatsonUSquareTest WattsStrogatzGraphDistribution WaveletBestBasis WaveletFilterCoefficients WaveletImagePlot WaveletListPlot WaveletMapIndexed WaveletMatrixPlot WaveletPhi WaveletPsi WaveletScale WaveletScalogram WaveletThreshold WeaklyConnectedComponents WeaklyConnectedGraphQ WeakStationarity WeatherData WeberE Wedge Wednesday WeibullDistribution WeierstrassHalfPeriods WeierstrassInvariants WeierstrassP WeierstrassPPrime WeierstrassSigma WeierstrassZeta WeightedAdjacencyGraph WeightedAdjacencyMatrix WeightedData WeightedGraphQ Weights WelchWindow WheelGraph WhenEvent Which While White Whitespace WhitespaceCharacter WhittakerM WhittakerW WienerFilter WienerProcess WignerD WignerSemicircleDistribution WilksW WilksWTest WindowClickSelect WindowElements WindowFloating WindowFrame WindowFrameElements WindowMargins WindowMovable WindowOpacity WindowSelected WindowSize WindowStatusArea WindowTitle WindowToolbars WindowWidth With WolframAlpha WolframAlphaDate WolframAlphaQuantity WolframAlphaResult Word WordBoundary WordCharacter WordData WordSearch WordSeparators WorkingPrecision Write WriteString Wronskian XMLElement XMLObject Xnor Xor Yellow YuleDissimilarity ZernikeR ZeroSymmetric ZeroTest ZeroWidthTimes Zeta ZetaZero ZipfDistribution ZTest ZTransform $Aborted $ActivationGroupID $ActivationKey $ActivationUserRegistered $AddOnsDirectory $AssertFunction $Assumptions $AsynchronousTask $BaseDirectory $BatchInput $BatchOutput $BoxForms $ByteOrdering $Canceled $CharacterEncoding $CharacterEncodings $CommandLine $CompilationTarget $ConditionHold $ConfiguredKernels $Context $ContextPath $ControlActiveSetting $CreationDate $CurrentLink $DateStringFormat $DefaultFont $DefaultFrontEnd $DefaultImagingDevice $DefaultPath $Display $DisplayFunction $DistributedContexts $DynamicEvaluation $Echo $Epilog $ExportFormats $Failed $FinancialDataSource $FormatType $FrontEnd $FrontEndSession $GeoLocation $HistoryLength $HomeDirectory $HTTPCookies $IgnoreEOF $ImagingDevices $ImportFormats $InitialDirectory $Input $InputFileName $InputStreamMethods $Inspector $InstallationDate $InstallationDirectory $InterfaceEnvironment $IterationLimit $KernelCount $KernelID $Language $LaunchDirectory $LibraryPath $LicenseExpirationDate $LicenseID $LicenseProcesses $LicenseServer $LicenseSubprocesses $LicenseType $Line $Linked $LinkSupported $LoadedFiles $MachineAddresses $MachineDomain $MachineDomains $MachineEpsilon $MachineID $MachineName $MachinePrecision $MachineType $MaxExtraPrecision $MaxLicenseProcesses $MaxLicenseSubprocesses $MaxMachineNumber $MaxNumber $MaxPiecewiseCases $MaxPrecision $MaxRootDegree $MessageGroups $MessageList $MessagePrePrint $Messages $MinMachineNumber $MinNumber $MinorReleaseNumber $MinPrecision $ModuleNumber $NetworkLicense $NewMessage $NewSymbol $Notebooks $NumberMarks $Off $OperatingSystem $Output $OutputForms $OutputSizeLimit $OutputStreamMethods $Packages $ParentLink $ParentProcessID $PasswordFile $PatchLevelID $Path $PathnameSeparator $PerformanceGoal $PipeSupported $Post $Pre $PreferencesDirectory $PrePrint $PreRead $PrintForms $PrintLiteral $ProcessID $ProcessorCount $ProcessorType $ProductInformation $ProgramName $RandomState $RecursionLimit $ReleaseNumber $RootDirectory $ScheduledTask $ScriptCommandLine $SessionID $SetParentLink $SharedFunctions $SharedVariables $SoundDisplay $SoundDisplayFunction $SuppressInputFormHeads $SynchronousEvaluation $SyntaxHandler $System $SystemCharacterEncoding $SystemID $SystemWordLength $TemporaryDirectory $TemporaryPrefix $TextStyle $TimedOut $TimeUnit $TimeZone $TopDirectory $TraceOff $TraceOn $TracePattern $TracePostAction $TracePreAction $Urgent $UserAddOnsDirectory $UserBaseDirectory $UserDocumentsDirectory $UserName $Version $VersionNumber",c:[{cN:"comment",b:/\(\*/,e:/\*\)/},a.ASM,a.QSM,a.CNM,{cN:"list",b:/\{/,e:/\}/,i:/:/}]}});hljs.registerLanguage("cs",function(b){var a="abstract as base bool break byte case catch char checked const continue decimal default delegate do double else enum event explicit extern false finally fixed float for foreach goto if implicit in int interface internal is lock long new null object operator out override params private protected public readonly ref return sbyte sealed short sizeof stackalloc static string struct switch this throw true try typeof uint ulong unchecked unsafe ushort using virtual volatile void while async await ascending descending from get group into join let orderby partial select set value var where yield";return{k:a,c:[{cN:"comment",b:"///",e:"$",rB:true,c:[{cN:"xmlDocTag",b:"///|<!--|-->"},{cN:"xmlDocTag",b:"</?",e:">"}]},b.CLCM,b.CBLCLM,{cN:"preprocessor",b:"#",e:"$",k:"if else elif endif define undef warning error line region endregion pragma checksum"},{cN:"string",b:'@"',e:'"',c:[{b:'""'}]},b.ASM,b.QSM,b.CNM,{bK:"protected public private internal",e:/[{;=]/,k:a,c:[{bK:"class namespace interface",starts:{c:[b.TM]}},{b:b.IR+"\\s*\\(",rB:true,c:[b.TM]}]}]}});hljs.registerLanguage("http",function(a){return{i:"\\S",c:[{cN:"status",b:"^HTTP/[0-9\\.]+",e:"$",c:[{cN:"number",b:"\\b\\d{3}\\b"}]},{cN:"request",b:"^[A-Z]+ (.*?) HTTP/[0-9\\.]+$",rB:true,e:"$",c:[{cN:"string",b:" ",e:" ",eB:true,eE:true}]},{cN:"attribute",b:"^\\w",e:": ",eE:true,i:"\\n|\\s|=",starts:{cN:"string",e:"$"}},{b:"\\n\\n",starts:{sL:"",eW:true}}]}});hljs.registerLanguage("rust",function(b){var c={cN:"number",b:"\\b(0[xb][A-Za-z0-9_]+|[0-9_]+(\\.[0-9_]+)?([uif](8|16|32|64)?)?)",r:0};var a="assert bool break char check claim comm const cont copy dir do drop else enum extern export f32 f64 fail false float fn for i16 i32 i64 i8 if impl int let log loop match mod move mut priv pub pure ref return self static str struct task true trait type u16 u32 u64 u8 uint unsafe use vec while";return{k:a,i:"</",c:[b.CLCM,b.CBLCLM,b.inherit(b.QSM,{i:null}),b.ASM,c,{cN:"function",bK:"fn",e:"(\\(|<)",c:[b.UTM]},{cN:"preprocessor",b:"#\\[",e:"\\]"},{bK:"type",e:"(=|<)",c:[b.UTM],i:"\\S"},{bK:"trait enum",e:"({|<)",c:[b.UTM],i:"\\S"}]}});hljs.registerLanguage("handlebars",function(b){var a="each in with if else unless bindattr action collection debugger log outlet template unbound view yield";return{cI:true,sL:"xml",subLanguageMode:"continuous",c:[{cN:"expression",b:"{{",e:"}}",c:[{cN:"begin-block",b:"#[a-zA-Z- .]+",k:a},{cN:"string",b:'"',e:'"'},{cN:"end-block",b:"\\/[a-zA-Z- .]+",k:a},{cN:"variable",b:"[a-zA-Z-.]+",k:a}]}]}});hljs.registerLanguage("cmake",function(a){return{cI:true,k:{keyword:"add_custom_command add_custom_target add_definitions add_dependencies add_executable add_library add_subdirectory add_test aux_source_directory break build_command cmake_minimum_required cmake_policy configure_file create_test_sourcelist define_property else elseif enable_language enable_testing endforeach endfunction endif endmacro endwhile execute_process export find_file find_library find_package find_path find_program fltk_wrap_ui foreach function get_cmake_property get_directory_property get_filename_component get_property get_source_file_property get_target_property get_test_property if include include_directories include_external_msproject include_regular_expression install link_directories load_cache load_command macro mark_as_advanced message option output_required_files project qt_wrap_cpp qt_wrap_ui remove_definitions return separate_arguments set set_directory_properties set_property set_source_files_properties set_target_properties set_tests_properties site_name source_group string target_link_libraries try_compile try_run unset variable_watch while build_name exec_program export_library_dependencies install_files install_programs install_targets link_libraries make_directory remove subdir_depends subdirs use_mangled_mesa utility_source variable_requires write_file qt5_use_modules qt5_use_package qt5_wrap_cpp on off true false and or",operator:"equal less greater strless strgreater strequal matches"},c:[{cN:"envvar",b:"\\${",e:"}"},a.HCM,a.QSM,a.NM]}});hljs.registerLanguage("lisp",function(h){var k="[a-zA-Z_\\-\\+\\*\\/\\<\\=\\>\\&\\#][a-zA-Z0-9_\\-\\+\\*\\/\\<\\=\\>\\&\\#!]*";var l="(\\-|\\+)?\\d+(\\.\\d+|\\/\\d+)?((d|e|f|l|s)(\\+|\\-)?\\d+)?";var j={cN:"shebang",b:"^#!",e:"$"};var b={cN:"literal",b:"\\b(t{1}|nil)\\b"};var d={cN:"number",v:[{b:l,r:0},{b:"#b[0-1]+(/[0-1]+)?"},{b:"#o[0-7]+(/[0-7]+)?"},{b:"#x[0-9a-f]+(/[0-9a-f]+)?"},{b:"#c\\("+l+" +"+l,e:"\\)"}]};var g=h.inherit(h.QSM,{i:null});var m={cN:"comment",b:";",e:"$"};var f={cN:"variable",b:"\\*",e:"\\*"};var n={cN:"keyword",b:"[:&]"+k};var c={b:"\\(",e:"\\)",c:["self",b,g,d]};var a={cN:"quoted",c:[d,g,f,n,c],v:[{b:"['`]\\(",e:"\\)",},{b:"\\(quote ",e:"\\)",k:{title:"quote"},}]};var i={cN:"list",b:"\\(",e:"\\)"};var e={eW:true,r:0};i.c=[{cN:"title",b:k},e];e.c=[a,i,b,d,g,m,f,n];return{i:/\S/,c:[d,j,b,g,m,a,i]}});hljs.registerLanguage("rib",function(a){return{k:"ArchiveRecord AreaLightSource Atmosphere Attribute AttributeBegin AttributeEnd Basis Begin Blobby Bound Clipping ClippingPlane Color ColorSamples ConcatTransform Cone CoordinateSystem CoordSysTransform CropWindow Curves Cylinder DepthOfField Detail DetailRange Disk Displacement Display End ErrorHandler Exposure Exterior Format FrameAspectRatio FrameBegin FrameEnd GeneralPolygon GeometricApproximation Geometry Hider Hyperboloid Identity Illuminate Imager Interior LightSource MakeCubeFaceEnvironment MakeLatLongEnvironment MakeShadow MakeTexture Matte MotionBegin MotionEnd NuPatch ObjectBegin ObjectEnd ObjectInstance Opacity Option Orientation Paraboloid Patch PatchMesh Perspective PixelFilter PixelSamples PixelVariance Points PointsGeneralPolygons PointsPolygons Polygon Procedural Projection Quantize ReadArchive RelativeDetail ReverseOrientation Rotate Scale ScreenWindow ShadingInterpolation ShadingRate Shutter Sides Skew SolidBegin SolidEnd Sphere SubdivisionMesh Surface TextureCoordinates Torus Transform TransformBegin TransformEnd TransformPoints Translate TrimCurve WorldBegin WorldEnd",i:"</",c:[a.HCM,a.CNM,a.ASM,a.QSM]}});hljs.registerLanguage("css",function(a){var b="[a-zA-Z-][a-zA-Z0-9_-]*";var c={cN:"function",b:b+"\\(",e:"\\)",c:["self",a.NM,a.ASM,a.QSM]};return{cI:true,i:"[=/|']",c:[a.CBLCLM,{cN:"id",b:"\\#[A-Za-z0-9_-]+"},{cN:"class",b:"\\.[A-Za-z0-9_-]+",r:0},{cN:"attr_selector",b:"\\[",e:"\\]",i:"$"},{cN:"pseudo",b:":(:)?[a-zA-Z0-9\\_\\-\\+\\(\\)\\\"\\']+"},{cN:"at_rule",b:"@(font-face|page)",l:"[a-z-]+",k:"font-face page"},{cN:"at_rule",b:"@",e:"[{;]",c:[{cN:"keyword",b:/\S+/},{b:/\s/,eW:true,eE:true,r:0,c:[c,a.ASM,a.QSM,a.NM]}]},{cN:"tag",b:b,r:0},{cN:"rules",b:"{",e:"}",i:"[^\\s]",r:0,c:[a.CBLCLM,{cN:"rule",b:"[^\\s]",rB:true,e:";",eW:true,c:[{cN:"attribute",b:"[A-Z\\_\\.\\-]+",e:":",eE:true,i:"[^\\s]",starts:{cN:"value",eW:true,eE:true,c:[c,a.NM,a.QSM,a.ASM,a.CBLCLM,{cN:"hexcolor",b:"#[0-9A-Fa-f]+"},{cN:"important",b:"!important"}]}}]}]}]}});hljs.registerLanguage("avrasm",function(a){return{cI:true,k:{keyword:"adc add adiw and andi asr bclr bld brbc brbs brcc brcs break breq brge brhc brhs brid brie brlo brlt brmi brne brpl brsh brtc brts brvc brvs bset bst call cbi cbr clc clh cli cln clr cls clt clv clz com cp cpc cpi cpse dec eicall eijmp elpm eor fmul fmuls fmulsu icall ijmp in inc jmp ld ldd ldi lds lpm lsl lsr mov movw mul muls mulsu neg nop or ori out pop push rcall ret reti rjmp rol ror sbc sbr sbrc sbrs sec seh sbi sbci sbic sbis sbiw sei sen ser ses set sev sez sleep spm st std sts sub subi swap tst wdr",built_in:"r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 r16 r17 r18 r19 r20 r21 r22 r23 r24 r25 r26 r27 r28 r29 r30 r31 x|0 xh xl y|0 yh yl z|0 zh zl ucsr1c udr1 ucsr1a ucsr1b ubrr1l ubrr1h ucsr0c ubrr0h tccr3c tccr3a tccr3b tcnt3h tcnt3l ocr3ah ocr3al ocr3bh ocr3bl ocr3ch ocr3cl icr3h icr3l etimsk etifr tccr1c ocr1ch ocr1cl twcr twdr twar twsr twbr osccal xmcra xmcrb eicra spmcsr spmcr portg ddrg ping portf ddrf sreg sph spl xdiv rampz eicrb eimsk gimsk gicr eifr gifr timsk tifr mcucr mcucsr tccr0 tcnt0 ocr0 assr tccr1a tccr1b tcnt1h tcnt1l ocr1ah ocr1al ocr1bh ocr1bl icr1h icr1l tccr2 tcnt2 ocr2 ocdr wdtcr sfior eearh eearl eedr eecr porta ddra pina portb ddrb pinb portc ddrc pinc portd ddrd pind spdr spsr spcr udr0 ucsr0a ucsr0b ubrr0l acsr admux adcsr adch adcl porte ddre pine pinf"},c:[a.CBLCLM,{cN:"comment",b:";",e:"$",r:0},a.CNM,a.BNM,{cN:"number",b:"\\b(\\$[a-zA-Z0-9]+|0o[0-7]+)"},a.QSM,{cN:"string",b:"'",e:"[^\\\\]'",i:"[^\\\\][^']"},{cN:"label",b:"^[A-Za-z0-9_.$]+:"},{cN:"preprocessor",b:"#",e:"$"},{cN:"preprocessor",b:"\\.[a-zA-Z]+"},{cN:"localvars",b:"@[0-9]+"}]}});hljs.registerLanguage("apache",function(a){var b={cN:"number",b:"[\\$%]\\d+"};return{cI:true,c:[a.HCM,{cN:"tag",b:"</?",e:">"},{cN:"keyword",b:/\w+/,r:0,k:{common:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername"},starts:{e:/$/,r:0,k:{literal:"on off all"},c:[{cN:"sqbracket",b:"\\s\\[",e:"\\]$"},{cN:"cbracket",b:"[\\$%]\\{",e:"\\}",c:["self",b]},b,a.QSM]}}],i:/\S/}});hljs.registerLanguage("1c",function(b){var f="[a-zA-Z邪-褟袗-携][a-zA-Z0-9_邪-褟袗-携]*";var c="胁芯蟹胁褉邪褌 写邪褌邪 写谢褟 械褋谢懈 懈 懈谢懈 懈薪邪褔械 懈薪邪褔械械褋谢懈 懈褋泻谢褞褔械薪懈械 泻芯薪械褑械褋谢懈 泻芯薪械褑锌芯锌褘褌泻懈 泻芯薪械褑锌褉芯褑械写褍褉褘 泻芯薪械褑褎褍薪泻褑懈懈 泻芯薪械褑褑懈泻谢邪 泻芯薪褋褌邪薪褌邪 薪械 锌械褉械泄褌懈 锌械褉械屑 锌械褉械褔懈褋谢械薪懈械 锌芯 锌芯泻邪 锌芯锌褘褌泻邪 锌褉械褉胁邪褌褜 锌褉芯写芯谢卸懈褌褜 锌褉芯褑械写褍褉邪 褋褌褉芯泻邪 褌芯谐写邪 褎褋 褎褍薪泻褑懈褟 褑懈泻谢 褔懈褋谢芯 褝泻褋锌芯褉褌";var e="ansitooem oemtoansi 胁胁械褋褌懈胁懈写褋褍斜泻芯薪褌芯 胁胁械褋褌懈写邪褌褍 胁胁械褋褌懈蟹薪邪褔械薪懈械 胁胁械褋褌懈锌械褉械褔懈褋谢械薪懈械 胁胁械褋褌懈锌械褉懈芯写 胁胁械褋褌懈锌谢邪薪褋褔械褌芯胁 胁胁械褋褌懈褋褌褉芯泻褍 胁胁械褋褌懈褔懈褋谢芯 胁芯锌褉芯褋 胁芯褋褋褌邪薪芯胁懈褌褜蟹薪邪褔械薪懈械 胁褉械谐 胁褘斜褉邪薪薪褘泄锌谢邪薪褋褔械褌芯胁 胁褘蟹胁邪褌褜懈褋泻谢褞褔械薪懈械 写邪褌邪谐芯写 写邪褌邪屑械褋褟褑 写邪褌邪褔懈褋谢芯 写芯斜邪胁懈褌褜屑械褋褟褑 蟹邪胁械褉褕懈褌褜褉邪斜芯褌褍褋懈褋褌械屑褘 蟹邪谐芯谢芯胁芯泻褋懈褋褌械屑褘 蟹邪锌懈褋褜卸褍褉薪邪谢邪褉械谐懈褋褌褉邪褑懈懈 蟹邪锌褍褋褌懈褌褜锌褉懈谢芯卸械薪懈械 蟹邪褎懈泻褋懈褉芯胁邪褌褜褌褉邪薪蟹邪泻褑懈褞 蟹薪邪褔械薪懈械胁褋褌褉芯泻褍 蟹薪邪褔械薪懈械胁褋褌褉芯泻褍胁薪褍褌褉 蟹薪邪褔械薪懈械胁褎邪泄谢 蟹薪邪褔械薪懈械懈蟹褋褌褉芯泻懈 蟹薪邪褔械薪懈械懈蟹褋褌褉芯泻懈胁薪褍褌褉 蟹薪邪褔械薪懈械懈蟹褎邪泄谢邪 懈屑褟泻芯屑锌褜褞褌械褉邪 懈屑褟锌芯谢褜蟹芯胁邪褌械谢褟 泻邪褌邪谢芯谐胁褉械屑械薪薪褘褏褎邪泄谢芯胁 泻邪褌邪谢芯谐懈斜 泻邪褌邪谢芯谐锌芯谢褜蟹芯胁邪褌械谢褟 泻邪褌邪谢芯谐锌褉芯谐褉邪屑屑褘 泻芯写褋懈屑胁 泻芯屑邪薪写邪褋懈褋褌械屑褘 泻芯薪谐芯写邪 泻芯薪械褑锌械褉懈芯写邪斜懈 泻芯薪械褑褉邪褋褋褔懈褌邪薪薪芯谐芯锌械褉懈芯写邪斜懈 泻芯薪械褑褋褌邪薪写邪褉褌薪芯谐芯懈薪褌械褉胁邪谢邪 泻芯薪泻胁邪褉褌邪谢邪 泻芯薪屑械褋褟褑邪 泻芯薪薪械写械谢懈 谢械胁 谢芯谐 谢芯谐10 屑邪泻褋 屑邪泻褋懈屑邪谢褜薪芯械泻芯谢懈褔械褋褌胁芯褋褍斜泻芯薪褌芯 屑懈薪 屑芯薪芯锌芯谢褜薪褘泄褉械卸懈屑 薪邪蟹胁邪薪懈械懈薪褌械褉褎械泄褋邪 薪邪蟹胁邪薪懈械薪邪斜芯褉邪锌褉邪胁 薪邪蟹薪邪褔懈褌褜胁懈写 薪邪蟹薪邪褔懈褌褜褋褔械褌 薪邪泄褌懈 薪邪泄褌懈锌芯屑械褔械薪薪褘械薪邪褍写邪谢械薪懈械 薪邪泄褌懈褋褋褘谢泻懈 薪邪褔邪谢芯锌械褉懈芯写邪斜懈 薪邪褔邪谢芯褋褌邪薪写邪褉褌薪芯谐芯懈薪褌械褉胁邪谢邪 薪邪褔邪褌褜褌褉邪薪蟹邪泻褑懈褞 薪邪褔谐芯写邪 薪邪褔泻胁邪褉褌邪谢邪 薪邪褔屑械褋褟褑邪 薪邪褔薪械写械谢懈 薪芯屑械褉写薪褟谐芯写邪 薪芯屑械褉写薪褟薪械写械谢懈 薪芯屑械褉薪械写械谢懈谐芯写邪 薪褉械谐 芯斜褉邪斜芯褌泻邪芯卸懈写邪薪懈褟 芯泻褉 芯锌懈褋邪薪懈械芯褕懈斜泻懈 芯褋薪芯胁薪芯泄卸褍褉薪邪谢褉邪褋褔械褌芯胁 芯褋薪芯胁薪芯泄锌谢邪薪褋褔械褌芯胁 芯褋薪芯胁薪芯泄褟蟹褘泻 芯褌泻褉褘褌褜褎芯褉屑褍 芯褌泻褉褘褌褜褎芯褉屑褍屑芯写邪谢褜薪芯 芯褌屑械薪懈褌褜褌褉邪薪蟹邪泻褑懈褞 芯褔懈褋褌懈褌褜芯泻薪芯褋芯芯斜褖械薪懈泄 锌械褉懈芯写褋褌褉 锌芯谢薪芯械懈屑褟锌芯谢褜蟹芯胁邪褌械谢褟 锌芯谢褍褔懈褌褜胁褉械屑褟褌邪 锌芯谢褍褔懈褌褜写邪褌褍褌邪 锌芯谢褍褔懈褌褜写芯泻褍屑械薪褌褌邪 锌芯谢褍褔懈褌褜蟹薪邪褔械薪懈褟芯褌斜芯褉邪 锌芯谢褍褔懈褌褜锌芯蟹懈褑懈褞褌邪 锌芯谢褍褔懈褌褜锌褍褋褌芯械蟹薪邪褔械薪懈械 锌芯谢褍褔懈褌褜褌邪 锌褉邪胁 锌褉邪胁芯写芯褋褌褍锌邪 锌褉械写褍锌褉械卸写械薪懈械 锌褉械褎懈泻褋邪胁褌芯薪褍屑械褉邪褑懈懈 锌褍褋褌邪褟褋褌褉芯泻邪 锌褍褋褌芯械蟹薪邪褔械薪懈械 褉邪斜芯褔邪褟写邪褌褌褜锌褍褋褌芯械蟹薪邪褔械薪懈械 褉邪斜芯褔邪褟写邪褌邪 褉邪蟹写械谢懈褌械谢褜褋褌褉邪薪懈褑 褉邪蟹写械谢懈褌械谢褜褋褌褉芯泻 褉邪蟹屑 褉邪蟹芯斜褉邪褌褜锌芯蟹懈褑懈褞写芯泻褍屑械薪褌邪 褉邪褋褋褔懈褌邪褌褜褉械谐懈褋褌褉褘薪邪 褉邪褋褋褔懈褌邪褌褜褉械谐懈褋褌褉褘锌芯 褋懈谐薪邪谢 褋懈屑胁 褋懈屑胁芯谢褌邪斜褍谢褟褑懈懈 褋芯蟹写邪褌褜芯斜褗械泻褌 褋芯泻褉谢 褋芯泻褉谢锌 褋芯泻褉锌 褋芯芯斜褖懈褌褜 褋芯褋褌芯褟薪懈械 褋芯褏褉邪薪懈褌褜蟹薪邪褔械薪懈械 褋褉械写 褋褌邪褌褍褋胁芯蟹胁褉邪褌邪 褋褌褉写谢懈薪邪 褋褌褉蟹邪屑械薪懈褌褜 褋褌褉泻芯谢懈褔械褋褌胁芯褋褌褉芯泻 褋褌褉锌芯谢褍褔懈褌褜褋褌褉芯泻褍  褋褌褉褔懈褋谢芯胁褏芯卸写械薪懈泄 褋褎芯褉屑懈褉芯胁邪褌褜锌芯蟹懈褑懈褞写芯泻褍屑械薪褌邪 褋褔械褌锌芯泻芯写褍 褌械泻褍褖邪褟写邪褌邪 褌械泻褍褖械械胁褉械屑褟 褌懈锌蟹薪邪褔械薪懈褟 褌懈锌蟹薪邪褔械薪懈褟褋褌褉 褍写邪谢懈褌褜芯斜褗械泻褌褘 褍褋褌邪薪芯胁懈褌褜褌邪薪邪 褍褋褌邪薪芯胁懈褌褜褌邪锌芯 褎懈泻褋褕邪斜谢芯薪 褎芯褉屑邪褌 褑械谢 褕邪斜谢芯薪";var a={cN:"dquote",b:'""'};var d={cN:"string",b:'"',e:'"|$',c:[a]};var g={cN:"string",b:"\\|",e:'"|$',c:[a]};return{cI:true,l:f,k:{keyword:c,built_in:e},c:[b.CLCM,b.NM,d,g,{cN:"function",b:"(锌褉芯褑械写褍褉邪|褎褍薪泻褑懈褟)",e:"$",l:f,k:"锌褉芯褑械写褍褉邪 褎褍薪泻褑懈褟",c:[b.inherit(b.TM,{b:f}),{cN:"tail",eW:true,c:[{cN:"params",b:"\\(",e:"\\)",l:f,k:"蟹薪邪褔",c:[d,g]},{cN:"export",b:"褝泻褋锌芯褉褌",eW:true,l:f,k:"褝泻褋锌芯褉褌",c:[b.CLCM]}]},b.CLCM]},{cN:"preprocessor",b:"#",e:"$"},{cN:"date",b:"'\\d{2}\\.\\d{2}\\.(\\d{2}|\\d{4})'"}]}});hljs.registerLanguage("javascript",function(a){return{aliases:["js"],k:{keyword:"in if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const class",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require"},c:[{cN:"pi",b:/^\s*('|")use strict('|")/,r:10},a.ASM,a.QSM,a.CLCM,a.CBLCLM,a.CNM,{b:"("+a.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[a.CLCM,a.CBLCLM,a.REGEXP_MODE,{b:/</,e:/>;/,r:0,sL:"xml"}],r:0},{cN:"function",bK:"function",e:/\{/,c:[a.inherit(a.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/}),{cN:"params",b:/\(/,e:/\)/,c:[a.CLCM,a.CBLCLM],i:/["'\(]/}],i:/\[|%/},{b:/\$[(.]/},{b:"\\."+a.IR,r:0}]}});hljs.registerLanguage("vbnet",function(a){return{cI:true,k:{keyword:"addhandler addressof alias and andalso aggregate ansi as assembly auto binary by byref byval call case catch class compare const continue custom declare default delegate dim distinct do each equals else elseif end enum erase error event exit explicit finally for friend from function get global goto group handles if implements imports in inherits interface into is isfalse isnot istrue join key let lib like loop me mid mod module mustinherit mustoverride mybase myclass namespace narrowing new next not notinheritable notoverridable of off on operator option optional or order orelse overloads overridable overrides paramarray partial preserve private property protected public raiseevent readonly redim rem removehandler resume return select set shadows shared skip static step stop structure strict sub synclock take text then throw to try unicode until using when where while widening with withevents writeonly xor",built_in:"boolean byte cbool cbyte cchar cdate cdec cdbl char cint clng cobj csbyte cshort csng cstr ctype date decimal directcast double gettype getxmlnamespace iif integer long object sbyte short single string trycast typeof uinteger ulong ushort",literal:"true false nothing"},i:"//|{|}|endif|gosub|variant|wend",c:[a.inherit(a.QSM,{c:[{b:'""'}]}),{cN:"comment",b:"'",e:"$",rB:true,c:[{cN:"xmlDocTag",b:"'''|<!--|-->"},{cN:"xmlDocTag",b:"</?",e:">"},]},a.CNM,{cN:"preprocessor",b:"#",e:"$",k:"if else elseif end region externalsource"},]}});hljs.registerLanguage("fsharp",function(a){return{k:"abstract and as assert base begin class default delegate do done downcast downto elif else end exception extern false finally for fun function global if in inherit inline interface internal lazy let match member module mutable namespace new null of open or override private public rec return sig static struct then to true try type upcast use val void when while with yield",c:[{cN:"string",b:'@"',e:'"',c:[{b:'""'}]},{cN:"string",b:'"""',e:'"""'},{cN:"comment",b:"\\(\\*",e:"\\*\\)"},{cN:"class",bK:"type",e:"\\(|=|$",c:[a.UTM]},{cN:"annotation",b:"\\[<",e:">\\]"},{cN:"attribute",b:"\\B('[A-Za-z])\\b",c:[a.BE]},a.CLCM,a.inherit(a.QSM,{i:null}),a.CNM]}});hljs.registerLanguage("matlab",function(a){var b=[a.CNM,{cN:"string",b:"'",e:"'",c:[a.BE,{b:"''"}]}];return{k:{keyword:"break case catch classdef continue else elseif end enumerated events for function global if methods otherwise parfor persistent properties return spmd switch try while",built_in:"sin sind sinh asin asind asinh cos cosd cosh acos acosd acosh tan tand tanh atan atand atan2 atanh sec secd sech asec asecd asech csc cscd csch acsc acscd acsch cot cotd coth acot acotd acoth hypot exp expm1 log log1p log10 log2 pow2 realpow reallog realsqrt sqrt nthroot nextpow2 abs angle complex conj imag real unwrap isreal cplxpair fix floor ceil round mod rem sign airy besselj bessely besselh besseli besselk beta betainc betaln ellipj ellipke erf erfc erfcx erfinv expint gamma gammainc gammaln psi legendre cross dot factor isprime primes gcd lcm rat rats perms nchoosek factorial cart2sph cart2pol pol2cart sph2cart hsv2rgb rgb2hsv zeros ones eye repmat rand randn linspace logspace freqspace meshgrid accumarray size length ndims numel disp isempty isequal isequalwithequalnans cat reshape diag blkdiag tril triu fliplr flipud flipdim rot90 find sub2ind ind2sub bsxfun ndgrid permute ipermute shiftdim circshift squeeze isscalar isvector ans eps realmax realmin pi i inf nan isnan isinf isfinite j why compan gallery hadamard hankel hilb invhilb magic pascal rosser toeplitz vander wilkinson"},i:'(//|"|#|/\\*|\\s+/\\w+)',c:[{cN:"function",bK:"function",e:"$",c:[a.UTM,{cN:"params",b:"\\(",e:"\\)"},{cN:"params",b:"\\[",e:"\\]"}]},{cN:"transposed_variable",b:"[a-zA-Z_][a-zA-Z_0-9]*('+[\\.']*|[\\.']+)",e:"",r:0},{cN:"matrix",b:"\\[",e:"\\]'*[\\.']*",c:b,r:0},{cN:"cell",b:"\\{",e:"\\}'*[\\.']*",c:b,i:/:/},{cN:"comment",b:"\\%",e:"$"}].concat(b)}});hljs.registerLanguage("applescript",function(a){var b=a.inherit(a.QSM,{i:""});var d={cN:"params",b:"\\(",e:"\\)",c:["self",a.CNM,b]};var c=[{cN:"comment",b:"--",e:"$",},{cN:"comment",b:"\\(\\*",e:"\\*\\)",c:["self",{b:"--",e:"$"}]},a.HCM];return{k:{keyword:"about above after against and around as at back before beginning behind below beneath beside between but by considering contain contains continue copy div does eighth else end equal equals error every exit fifth first for fourth from front get given global if ignoring in into is it its last local me middle mod my ninth not of on onto or over prop property put ref reference repeat returning script second set seventh since sixth some tell tenth that the then third through thru timeout times to transaction try until where while whose with without",constant:"AppleScript false linefeed return pi quote result space tab true",type:"alias application boolean class constant date file integer list number real record string text",command:"activate beep count delay launch log offset read round run say summarize write",property:"character characters contents day frontmost id item length month name paragraph paragraphs rest reverse running time version weekday word words year"},c:[b,a.CNM,{cN:"type",b:"\\bPOSIX file\\b"},{cN:"command",b:"\\b(clipboard info|the clipboard|info for|list (disks|folder)|mount volume|path to|(close|open for) access|(get|set) eof|current date|do shell script|get volume settings|random number|set volume|system attribute|system info|time to GMT|(load|run|store) script|scripting components|ASCII (character|number)|localized string|choose (application|color|file|file name|folder|from list|remote application|URL)|display (alert|dialog))\\b|^\\s*return\\b"},{cN:"constant",b:"\\b(text item delimiters|current application|missing value)\\b"},{cN:"keyword",b:"\\b(apart from|aside from|instead of|out of|greater than|isn't|(doesn't|does not) (equal|come before|come after|contain)|(greater|less) than( or equal)?|(starts?|ends|begins?) with|contained by|comes (before|after)|a (ref|reference))\\b"},{cN:"property",b:"\\b(POSIX path|(date|time) string|quoted form)\\b"},{cN:"function_start",bK:"on",i:"[${=;\\n]",c:[a.UTM,d]}].concat(c),i:"//"}});hljs.registerLanguage("delphi",function(b){var a="exports register file shl array record property for mod while set ally label uses raise not stored class safecall var interface or private static exit index inherited to else stdcall override shr asm far resourcestring finalization packed virtual out and protected library do xorwrite goto near function end div overload object unit begin string on inline repeat until destructor write message program with read initialization except default nil if case cdecl in downto threadvar of try pascal const external constructor type public then implementation finally published procedure";var e={cN:"comment",v:[{b:/\{/,e:/\}/,r:0},{b:/\(\*/,e:/\*\)/,r:10}]};var c={cN:"string",b:/'/,e:/'/,c:[{b:/''/}]};var d={cN:"string",b:/(#\d+)+/};var f={b:b.IR+"\\s*=\\s*class\\s*\\(",rB:true,c:[b.TM]};var g={cN:"function",bK:"function constructor destructor procedure",e:/[:;]/,k:"function constructor|10 destructor|10 procedure|10",c:[b.TM,{cN:"params",b:/\(/,e:/\)/,k:a,c:[c,d]},e]};return{cI:true,k:a,i:/("|\$[G-Zg-z]|\/\*|<\/)/,c:[e,b.CLCM,c,d,b.NM,f,g]}});hljs.registerLanguage("cpp",function(a){var b={keyword:"false int float while private char catch export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const struct for static_cast|10 union namespace unsigned long throw volatile static protected bool template mutable if public friend do return goto auto void enum else break new extern using true class asm case typeid short reinterpret_cast|10 default double register explicit signed typename try this switch continue wchar_t inline delete alignof char16_t char32_t constexpr decltype noexcept nullptr static_assert thread_local restrict _Bool complex _Complex _Imaginary",built_in:"std string cin cout cerr clog stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr abort abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf"};return{aliases:["c"],k:b,i:"</",c:[a.CLCM,a.CBLCLM,a.QSM,{cN:"string",b:"'\\\\?.",e:"'",i:"."},{cN:"number",b:"\\b(\\d+(\\.\\d*)?|\\.\\d+)(u|U|l|L|ul|UL|f|F)"},a.CNM,{cN:"preprocessor",b:"#",e:"$",c:[{b:"include\\s*<",e:">",i:"\\n"},a.CLCM]},{cN:"stl_container",b:"\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\s*<",e:">",k:b,r:10,c:["self"]}]}});hljs.registerLanguage("json",function(a){var e={literal:"true false null"};var d=[a.QSM,a.CNM];var c={cN:"value",e:",",eW:true,eE:true,c:d,k:e};var b={b:"{",e:"}",c:[{cN:"attribute",b:'\\s*"',e:'"\\s*:\\s*',eB:true,eE:true,c:[a.BE],i:"\\n",starts:c}],i:"\\S"};var f={b:"\\[",e:"\\]",c:[a.inherit(c,{cN:null})],i:"\\S"};d.splice(d.length,0,b,f);return{c:d,k:e,i:"\\S"}});hljs.registerLanguage("perl",function(c){var d="getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qqfileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmgetsub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedirioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when";var f={cN:"subst",b:"[$@]\\{",e:"\\}",k:d};var g={b:"->{",e:"}"};var a={cN:"variable",v:[{b:/\$\d/},{b:/[\$\%\@\*](\^\w\b|#\w+(\:\:\w+)*|{\w+}|\w+(\:\:\w*)*)/},{b:/[\$\%\@\*][^\s\w{]/,r:0}]};var e={cN:"comment",b:"^(__END__|__DATA__)",e:"\\n$",r:5};var h=[c.BE,f,a];var b=[a,c.HCM,e,{cN:"comment",b:"^\\=\\w",e:"\\=cut",eW:true},g,{cN:"string",c:h,v:[{b:"q[qwxr]?\\s*\\(",e:"\\)",r:5},{b:"q[qwxr]?\\s*\\[",e:"\\]",r:5},{b:"q[qwxr]?\\s*\\{",e:"\\}",r:5},{b:"q[qwxr]?\\s*\\|",e:"\\|",r:5},{b:"q[qwxr]?\\s*\\<",e:"\\>",r:5},{b:"qw\\s+q",e:"q",r:5},{b:"'",e:"'",c:[c.BE]},{b:'"',e:'"'},{b:"`",e:"`",c:[c.BE]},{b:"{\\w+}",c:[],r:0},{b:"-?\\w+\\s*\\=\\>",c:[],r:0}]},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{b:"(\\/\\/|"+c.RSR+"|\\b(split|return|print|reverse|grep)\\b)\\s*",k:"split return print reverse grep",r:0,c:[c.HCM,e,{cN:"regexp",b:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",r:10},{cN:"regexp",b:"(m|qr)?/",e:"/[a-z]*",c:[c.BE],r:0}]},{cN:"sub",bK:"sub",e:"(\\s*\\(.*?\\))?[;{]",r:5},{cN:"operator",b:"-\\w\\b",r:0}];f.c=b;g.c=b;return{k:d,c:b}});hljs.registerLanguage("markdown",function(a){return{c:[{cN:"header",v:[{b:"^#{1,6}",e:"$"},{b:"^.+?\\n[=-]{2,}$"}]},{b:"<",e:">",sL:"xml",r:0},{cN:"bullet",b:"^([*+-]|(\\d+\\.))\\s+"},{cN:"strong",b:"[*_]{2}.+?[*_]{2}"},{cN:"emphasis",v:[{b:"\\*.+?\\*"},{b:"_.+?_",r:0}]},{cN:"blockquote",b:"^>\\s+",e:"$"},{cN:"code",v:[{b:"`.+?`"},{b:"^( {4}|\t)",e:"$",r:0}]},{cN:"horizontal_rule",b:"^[-\\*]{3,}",e:"$"},{b:"\\[.+?\\][\\(\\[].+?[\\)\\]]",rB:true,c:[{cN:"link_label",b:"\\[",e:"\\]",eB:true,rE:true,r:0},{cN:"link_url",b:"\\]\\(",e:"\\)",eB:true,eE:true},{cN:"link_reference",b:"\\]\\[",e:"\\]",eB:true,eE:true,}],r:10},{b:"^\\[.+\\]:",e:"$",rB:true,c:[{cN:"link_reference",b:"\\[",e:"\\]",eB:true,eE:true},{cN:"link_url",b:"\\s",e:"$"}]}]}});hljs.registerLanguage("ocaml",function(a){return{k:{keyword:"and as assert asr begin class constraint do done downto else end exception external false for fun function functor if in include inherit initializer land lazy let lor lsl lsr lxor match method mod module mutable new object of open or private rec ref sig struct then to true try type val virtual when while with parser value",built_in:"bool char float int list unit array exn option int32 int64 nativeint format4 format6 lazy_t in_channel out_channel string",},i:/\/\//,c:[{cN:"string",b:'"""',e:'"""'},{cN:"comment",b:"\\(\\*",e:"\\*\\)",c:["self"]},{cN:"class",bK:"type",e:"\\(|=|$",c:[a.UTM]},{cN:"annotation",b:"\\[<",e:">\\]"},a.CBLCLM,a.inherit(a.ASM,{i:null}),a.inherit(a.QSM,{i:null}),a.CNM]}});hljs.registerLanguage("d",function(x){var b={keyword:"abstract alias align asm assert auto body break byte case cast catch class const continue debug default delete deprecated do else enum export extern final finally for foreach foreach_reverse|10 goto if immutable import in inout int interface invariant is lazy macro mixin module new nothrow out override package pragma private protected public pure ref return scope shared static struct super switch synchronized template this throw try typedef typeid typeof union unittest version void volatile while with __FILE__ __LINE__ __gshared|10 __thread __traits __DATE__ __EOF__ __TIME__ __TIMESTAMP__ __VENDOR__ __VERSION__",built_in:"bool cdouble cent cfloat char creal dchar delegate double dstring float function idouble ifloat ireal long real short string ubyte ucent uint ulong ushort wchar wstring",literal:"false null true"};var c="(0|[1-9][\\d_]*)",q="(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)",h="0[bB][01_]+",v="([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*)",y="0[xX]"+v,p="([eE][+-]?"+q+")",o="("+q+"(\\.\\d*|"+p+")|\\d+\\."+q+q+"|\\."+c+p+"?)",k="(0[xX]("+v+"\\."+v+"|\\.?"+v+")[pP][+-]?"+q+")",l="("+c+"|"+h+"|"+y+")",n="("+k+"|"+o+")";var z="\\\\(['\"\\?\\\\abfnrtv]|u[\\dA-Fa-f]{4}|[0-7]{1,3}|x[\\dA-Fa-f]{2}|U[\\dA-Fa-f]{8})|&[a-zA-Z\\d]{2,};";var m={cN:"number",b:"\\b"+l+"(L|u|U|Lu|LU|uL|UL)?",r:0};var j={cN:"number",b:"\\b("+n+"([fF]|L|i|[fF]i|Li)?|"+l+"(i|[fF]i|Li))",r:0};var s={cN:"string",b:"'("+z+"|.)",e:"'",i:"."};var r={b:z,r:0};var w={cN:"string",b:'"',c:[r],e:'"[cwd]?'};var f={cN:"string",b:'[rq]"',e:'"[cwd]?',r:5};var u={cN:"string",b:"`",e:"`[cwd]?"};var i={cN:"string",b:'x"[\\da-fA-F\\s\\n\\r]*"[cwd]?',r:10};var t={cN:"string",b:'q"\\{',e:'\\}"'};var e={cN:"shebang",b:"^#!",e:"$",r:5};var g={cN:"preprocessor",b:"#(line)",e:"$",r:5};var d={cN:"keyword",b:"@[a-zA-Z_][a-zA-Z_\\d]*"};var a={cN:"comment",b:"\\/\\+",c:["self"],e:"\\+\\/",r:10};return{l:x.UIR,k:b,c:[x.CLCM,x.CBLCLM,a,i,w,f,u,t,j,m,s,e,g,d]}});hljs.registerLanguage("coffeescript",function(c){var b={keyword:"in if for while finally new do return else break catch instanceof throw try this switch continue typeof delete debugger super then unless until loop of by when and or is isnt not",literal:"true false null undefined yes no on off",reserved:"case default function var void with const let enum export import native __hasProp __extends __slice __bind __indexOf",built_in:"npm require console print module exports global window document"};var a="[A-Za-z$_][0-9A-Za-z$_]*";var f=c.inherit(c.TM,{b:a});var e={cN:"subst",b:/#\{/,e:/}/,k:b};var d=[c.BNM,c.inherit(c.CNM,{starts:{e:"(\\s*/)?",r:0}}),{cN:"string",v:[{b:/'''/,e:/'''/,c:[c.BE]},{b:/'/,e:/'/,c:[c.BE]},{b:/"""/,e:/"""/,c:[c.BE,e]},{b:/"/,e:/"/,c:[c.BE,e]}]},{cN:"regexp",v:[{b:"///",e:"///",c:[e,c.HCM]},{b:"//[gim]*",r:0},{b:"/\\S(\\\\.|[^\\n])*?/[gim]*(?=\\s|\\W|$)"}]},{cN:"property",b:"@"+a},{b:"`",e:"`",eB:true,eE:true,sL:"javascript"}];e.c=d;return{k:b,c:d.concat([{cN:"comment",b:"###",e:"###"},c.HCM,{cN:"function",b:"("+a+"\\s*=\\s*)?(\\(.*\\))?\\s*\\B[-=]>",e:"[-=]>",rB:true,c:[f,{cN:"params",b:"\\(",rB:true,c:[{b:/\(/,e:/\)/,k:b,c:["self"].concat(d)}]}]},{cN:"class",bK:"class",e:"$",i:/[:="\[\]]/,c:[{bK:"extends",eW:true,i:/[:="\[\]]/,c:[f]},f]},{cN:"attribute",b:a+":",e:":",rB:true,eE:true,r:0}])}});hljs.registerLanguage("lua",function(b){var a="\\[=*\\[";var e="\\]=*\\]";var c={b:a,e:e,c:["self"]};var d=[{cN:"comment",b:"--(?!"+a+")",e:"$"},{cN:"comment",b:"--"+a,e:e,c:[c],r:10}];return{l:b.UIR,k:{keyword:"and break do else elseif end false for if in local nil not or repeat return then true until while",built_in:"_G _VERSION assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall coroutine debug io math os package string table"},c:d.concat([{cN:"function",bK:"function",e:"\\)",c:[b.inherit(b.TM,{b:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{cN:"params",b:"\\(",eW:true,c:d}].concat(d)},b.CNM,b.ASM,b.QSM,{cN:"string",b:a,e:e,c:[c],r:10}])}});hljs.registerLanguage("makefile",function(a){var b={cN:"variable",b:/\$\(/,e:/\)/,c:[a.BE]};return{c:[a.HCM,{b:/^\w+\s*\W*=/,rB:true,r:0,starts:{cN:"constant",e:/\s*\W*=/,eE:true,starts:{e:/$/,r:0,c:[b],}}},{cN:"title",b:/^[\w]+:\s*$/},{cN:"phony",b:/^\.PHONY:/,e:/$/,k:".PHONY",l:/[\.\w]+/},{b:/^\t+/,e:/$/,c:[a.QSM,b]}]}});hljs.registerLanguage("rsl",function(a){return{k:{keyword:"float color point normal vector matrix while for if do return else break extern continue",built_in:"abs acos ambient area asin atan atmosphere attribute calculatenormal ceil cellnoise clamp comp concat cos degrees depth Deriv diffuse distance Du Dv environment exp faceforward filterstep floor format fresnel incident length lightsource log match max min mod noise normalize ntransform opposite option phong pnoise pow printf ptlined radians random reflect refract renderinfo round setcomp setxcomp setycomp setzcomp shadow sign sin smoothstep specular specularbrdf spline sqrt step tan texture textureinfo trace transform vtransform xcomp ycomp zcomp"},i:"</",c:[a.CLCM,a.CBLCLM,a.QSM,a.ASM,a.CNM,{cN:"preprocessor",b:"#",e:"$"},{cN:"shader",bK:"surface displacement light volume imager",e:"\\("},{cN:"shading",bK:"illuminate illuminance gather",e:"\\("}]}});hljs.registerLanguage("vbscript",function(a){return{cI:true,k:{keyword:"call class const dim do loop erase execute executeglobal exit for each next function if then else on error option explicit new private property let get public randomize redim rem select case set stop sub while wend with end to elseif is or xor and not class_initialize class_terminate default preserve in me byval byref step resume goto",built_in:"lcase month vartype instrrev ubound setlocale getobject rgb getref string weekdayname rnd dateadd monthname now day minute isarray cbool round formatcurrency conversions csng timevalue second year space abs clng timeserial fixs len asc isempty maths dateserial atn timer isobject filter weekday datevalue ccur isdate instr datediff formatdatetime replace isnull right sgn array snumeric log cdbl hex chr lbound msgbox ucase getlocale cos cdate cbyte rtrim join hour oct typename trim strcomp int createobject loadpicture tan formatnumber mid scriptenginebuildversion scriptengine split scriptengineminorversion cint sin datepart ltrim sqr scriptenginemajorversion time derived eval date formatpercent exp inputbox left ascw chrw regexp server response request cstr err",literal:"true false null nothing empty"},i:"//",c:[a.inherit(a.QSM,{c:[{b:'""'}]}),{cN:"comment",b:/'/,e:/$/,r:0},a.CNM]}});hljs.registerLanguage("go",function(a){var b={keyword:"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer",constant:"true false iota nil",typename:"bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune",built_in:"append cap close complex copy imag len make new panic print println real recover delete"};return{aliases:["golang"],k:b,i:"</",c:[a.CLCM,a.CBLCLM,a.QSM,{cN:"string",b:"'",e:"[^\\\\]'"},{cN:"string",b:"`",e:"`"},{cN:"number",b:"[^a-zA-Z_0-9](\\-|\\+)?\\d+(\\.\\d+|\\/\\d+)?((d|e|f|l|s)(\\+|\\-)?\\d+)?",r:0},a.CNM]}});hljs.registerLanguage("axapta",function(a){return{k:"false int abstract private char boolean static null if for true while long throw finally protected final return void enum else break new catch byte super case short default double public try this switch continue reverse firstfast firstonly forupdate nofetch sum avg minof maxof count order group by asc desc index hint like dispaly edit client server ttsbegin ttscommit str real date container anytype common div mod",c:[a.CLCM,a.CBLCLM,a.ASM,a.QSM,a.CNM,{cN:"preprocessor",b:"#",e:"$"},{cN:"class",bK:"class interface",e:"{",i:":",c:[{cN:"inheritance",bK:"extends implements",r:10},a.UTM]}]}});hljs.registerLanguage("vala",function(a){return{k:{keyword:"char uchar unichar int uint long ulong short ushort int8 int16 int32 int64 uint8 uint16 uint32 uint64 float double bool struct enum string void weak unowned owned async signal static abstract interface override while do for foreach else switch case break default return try catch public private protected internal using new this get set const stdout stdin stderr var",built_in:"DBus GLib CCode Gee Object",literal:"false true null"},c:[{cN:"class",bK:"class interface delegate namespace",e:"{",i:"[^,:\\n\\s\\.]",c:[a.UTM]},a.CLCM,a.CBLCLM,{cN:"string",b:'"""',e:'"""',r:5},a.ASM,a.QSM,a.CNM,{cN:"preprocessor",b:"^#",e:"$",r:2},{cN:"constant",b:" [A-Z_]+ ",r:0}]}});hljs.registerLanguage("erlang",function(i){var c="[a-z'][a-zA-Z0-9_']*";var o="("+c+":"+c+"|"+c+")";var f={keyword:"after and andalso|10 band begin bnot bor bsl bzr bxor case catch cond div end fun let not of orelse|10 query receive rem try when xor",literal:"false true"};var l={cN:"comment",b:"%",e:"$",r:0};var e={cN:"number",b:"\\b(\\d+#[a-fA-F0-9]+|\\d+(\\.\\d+)?([eE][-+]?\\d+)?)",r:0};var g={b:"fun\\s+"+c+"/\\d+"};var n={b:o+"\\(",e:"\\)",rB:true,r:0,c:[{cN:"function_name",b:o,r:0},{b:"\\(",e:"\\)",eW:true,rE:true,r:0}]};var h={cN:"tuple",b:"{",e:"}",r:0};var a={cN:"variable",b:"\\b_([A-Z][A-Za-z0-9_]*)?",r:0};var m={cN:"variable",b:"[A-Z][a-zA-Z0-9_]*",r:0};var b={b:"#"+i.UIR,r:0,rB:true,c:[{cN:"record_name",b:"#"+i.UIR,r:0},{b:"{",e:"}",r:0}]};var k={bK:"fun receive if try case",e:"end",k:f};k.c=[l,g,i.inherit(i.ASM,{cN:""}),k,n,i.QSM,e,h,a,m,b];var j=[l,g,k,n,i.QSM,e,h,a,m,b];n.c[1].c=j;h.c=j;b.c[1].c=j;var d={cN:"params",b:"\\(",e:"\\)",c:j};return{k:f,i:"(</|\\*=|\\+=|-=|/=|/\\*|\\*/|\\(\\*|\\*\\))",c:[{cN:"function",b:"^"+c+"\\s*\\(",e:"->",rB:true,i:"\\(|#|//|/\\*|\\\\|:|;",c:[d,i.inherit(i.TM,{b:c})],starts:{e:";|\\.",k:f,c:j}},l,{cN:"pp",b:"^-",e:"\\.",r:0,eE:true,rB:true,l:"-"+i.IR,k:"-module -record -undef -export -ifdef -ifndef -author -copyright -doc -vsn -import -include -include_lib -compile -define -else -endif -file -behaviour -behavior",c:[d]},e,i.QSM,b,a,m,h]}});hljs.registerLanguage("sql",function(a){return{cI:true,i:/[<>]/,c:[{cN:"operator",b:"\\b(begin|end|start|commit|rollback|savepoint|lock|alter|create|drop|rename|call|delete|do|handler|insert|load|replace|select|truncate|update|set|show|pragma|grant|merge)\\b(?!:)",e:";",eW:true,k:{keyword:"all partial global month current_timestamp using go revoke smallint indicator end-exec disconnect zone with character assertion to add current_user usage input local alter match collate real then rollback get read timestamp session_user not integer bit unique day minute desc insert execute like ilike|2 level decimal drop continue isolation found where constraints domain right national some module transaction relative second connect escape close system_user for deferred section cast current sqlstate allocate intersect deallocate numeric public preserve full goto initially asc no key output collation group by union session both last language constraint column of space foreign deferrable prior connection unknown action commit view or first into float year primary cascaded except restrict set references names table outer open select size are rows from prepare distinct leading create only next inner authorization schema corresponding option declare precision immediate else timezone_minute external varying translation true case exception join hour default double scroll value cursor descriptor values dec fetch procedure delete and false int is describe char as at in varchar null trailing any absolute current_time end grant privileges when cross check write current_date pad begin temporary exec time update catalog user sql date on identity timezone_hour natural whenever interval work order cascade diagnostics nchar having left call do handler load replace truncate start lock show pragma exists number trigger if before after each row merge matched database",aggregate:"count sum min max avg"},c:[{cN:"string",b:"'",e:"'",c:[a.BE,{b:"''"}]},{cN:"string",b:'"',e:'"',c:[a.BE,{b:'""'}]},{cN:"string",b:"`",e:"`",c:[a.BE]},a.CNM]},a.CBLCLM,{cN:"comment",b:"--",e:"$"}]}});hljs.registerLanguage("mizar",function(a){return{k:["environ vocabularies notations constructors definitions registrations theorems schemes requirements","begin end definition registration cluster existence pred func defpred deffunc theorem proof","let take assume then thus hence ex for st holds consider reconsider such that and in provided of as from","be being by means equals implies iff redefine define now not or attr is mode suppose per cases set","thesis contradiction scheme reserve struct","correctness compatibility coherence symmetry assymetry reflexivity irreflexivity","connectedness uniqueness commutativity idempotence involutiveness projectivity"].join(" "),c:[{cN:"comment",b:"::",e:"$"}]}});hljs.registerLanguage("lasso",function(d){var b="[a-zA-Z_][a-zA-Z0-9_.]*";var i="<\\?(lasso(script)?|=)";var c="\\]|\\?>";var g={literal:"true false none minimal full all void and or not bw nbw ew new cn ncn lt lte gt gte eq neq rx nrx ft",built_in:"array date decimal duration integer map pair string tag xml null bytes list queue set stack staticarray tie local var variable global data self inherited",keyword:"error_code error_msg error_pop error_push error_reset cache database_names database_schemanames database_tablenames define_tag define_type email_batch encode_set html_comment handle handle_error header if inline iterate ljax_target link link_currentaction link_currentgroup link_currentrecord link_detail link_firstgroup link_firstrecord link_lastgroup link_lastrecord link_nextgroup link_nextrecord link_prevgroup link_prevrecord log loop namespace_using output_none portal private protect records referer referrer repeating resultset rows search_args search_arguments select sort_args sort_arguments thread_atomic value_list while abort case else if_empty if_false if_null if_true loop_abort loop_continue loop_count params params_up return return_value run_children soap_definetag soap_lastrequest soap_lastresponse tag_name ascending average by define descending do equals frozen group handle_failure import in into join let match max min on order parent protected provide public require returnhome skip split_thread sum take thread to trait type where with yield yieldhome"};var a={cN:"comment",b:"<!--",e:"-->",r:0};var j={cN:"preprocessor",b:"\\[noprocess\\]",starts:{cN:"markup",e:"\\[/noprocess\\]",rE:true,c:[a]}};var e={cN:"preprocessor",b:"\\[/noprocess|"+i};var h={cN:"variable",b:"'"+b+"'"};var f=[d.CLCM,{cN:"javadoc",b:"/\\*\\*!",e:"\\*/"},d.CBLCLM,d.inherit(d.CNM,{b:d.CNR+"|-?(infinity|nan)\\b"}),d.inherit(d.ASM,{i:null}),d.inherit(d.QSM,{i:null}),{cN:"string",b:"`",e:"`"},{cN:"variable",v:[{b:"[#$]"+b},{b:"#",e:"\\d+",i:"\\W"}]},{cN:"tag",b:"::\\s*",e:b,i:"\\W"},{cN:"attribute",b:"\\.\\.\\.|-"+d.UIR},{cN:"subst",v:[{b:"->\\s*",c:[h]},{b:":=|/(?!\\w)=?|[-+*%=<>&|!?\\\\]+",r:0}]},{cN:"built_in",b:"\\.\\.?",r:0,c:[h]},{cN:"class",bK:"define",rE:true,e:"\\(|=>",c:[d.inherit(d.TM,{b:d.UIR+"(=(?!>))?"})]}];return{aliases:["ls","lassoscript"],cI:true,l:b+"|&[lg]t;",k:g,c:[{cN:"preprocessor",b:c,r:0,starts:{cN:"markup",e:"\\[|"+i,rE:true,r:0,c:[a]}},j,e,{cN:"preprocessor",b:"\\[no_square_brackets",starts:{e:"\\[/no_square_brackets\\]",l:b+"|&[lg]t;",k:g,c:[{cN:"preprocessor",b:c,r:0,starts:{cN:"markup",e:i,rE:true,c:[a]}},j,e].concat(f)}},{cN:"preprocessor",b:"\\[",r:0},{cN:"shebang",b:"^#!.+lasso9\\b",r:10}].concat(f)}});hljs.registerLanguage("r",function(a){var b="([a-zA-Z]|\\.[a-zA-Z.])[a-zA-Z0-9._]*";return{c:[a.HCM,{b:b,l:b,k:{keyword:"function if in break next repeat else for return switch while try tryCatch|10 stop warning require library attach detach source setMethod setGeneric setGroupGeneric setClass ...|10",literal:"NULL NA TRUE FALSE T F Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10"},r:0},{cN:"number",b:"0[xX][0-9a-fA-F]+[Li]?\\b",r:0},{cN:"number",b:"\\d+(?:[eE][+\\-]?\\d*)?L\\b",r:0},{cN:"number",b:"\\d+\\.(?!\\d)(?:i\\b)?",r:0},{cN:"number",b:"\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d*)?i?\\b",r:0},{cN:"number",b:"\\.\\d+(?:[eE][+\\-]?\\d*)?i?\\b",r:0},{b:"`",e:"`",r:0},{cN:"string",c:[a.BE],v:[{b:'"',e:'"'},{b:"'",e:"'"}]}]}});hljs.registerLanguage("scala",function(a){var c={cN:"annotation",b:"@[A-Za-z]+"};var b={cN:"string",b:'u?r?"""',e:'"""',r:10};return{k:"type yield lazy override def with val var false true sealed abstract private trait object null if for while throw finally protected extends import final return else break new catch super class case package default try this match continue throws",c:[{cN:"javadoc",b:"/\\*\\*",e:"\\*/",c:[{cN:"javadoctag",b:"@[A-Za-z]+"}],r:10},a.CLCM,a.CBLCLM,b,a.ASM,a.QSM,{cN:"class",b:"((case )?class |object |trait )",e:"({|$)",i:":",k:"case class trait object",c:[{bK:"extends with",r:10},a.UTM,{cN:"params",b:"\\(",e:"\\)",c:[a.ASM,a.QSM,b,c]}]},a.CNM,c]}});hljs.registerLanguage("livecodeserver",function(a){var e={cN:"variable",b:"\\b[gtps][A-Z]+[A-Za-z0-9_\\-]*\\b|\\$_[A-Z]+",r:0};var b={cN:"comment",e:"$",v:[a.CBLCLM,a.HCM,{b:"--",},{b:"[^:]//",}]};var d=a.inherit(a.TM,{v:[{b:"\\b_*rig[A-Z]+[A-Za-z0-9_\\-]*"},{b:"\\b_[a-z0-9\\-]+"}]});var c=a.inherit(a.TM,{b:"\\b([A-Za-z0-9_\\-]+)\\b"});return{cI:false,k:{keyword:"after byte bytes english the until http forever descending using line real8 with seventh for stdout finally element word fourth before black ninth sixth characters chars stderr uInt1 uInt1s uInt2 uInt2s stdin string lines relative rel any fifth items from middle mid at else of catch then third it file milliseconds seconds second secs sec int1 int1s int4 int4s internet int2 int2s normal text item last long detailed effective uInt4 uInt4s repeat end repeat URL in try into switch to words https token binfile each tenth as ticks tick system real4 by dateItems without char character ascending eighth whole dateTime numeric short first ftp integer abbreviated abbr abbrev private case while if",constant:"SIX TEN FORMFEED NINE ZERO NONE SPACE FOUR FALSE COLON CRLF PI COMMA ENDOFFILE EOF EIGHT FIVE QUOTE EMPTY ONE TRUE RETURN CR LINEFEED RIGHT BACKSLASH NULL SEVEN TAB THREE TWO six ten formfeed nine zero none space four false colon crlf pi comma endoffile eof eight five quote empty one true return cr linefeed right backslash null seven tab three two RIVERSION RISTATE FILE_READ_MODE FILE_WRITE_MODE FILE_WRITE_MODE DIR_WRITE_MODE FILE_READ_UMASK FILE_WRITE_UMASK DIR_READ_UMASK DIR_WRITE_UMASK",operator:"div mod wrap and or bitAnd bitNot bitOr bitXor among not in a an within contains ends with begins the keys of keys",built_in:"put abs acos aliasReference annuity arrayDecode arrayEncode asin atan atan2 average avg base64Decode base64Encode baseConvert binaryDecode binaryEncode byteToNum cachedURL cachedURLs charToNum cipherNames commandNames compound compress constantNames cos date dateFormat decompress directories diskSpace DNSServers exp exp1 exp2 exp10 extents files flushEvents folders format functionNames global globals hasMemory hostAddress hostAddressToName hostName hostNameToAddress isNumber ISOToMac itemOffset keys len length libURLErrorData libUrlFormData libURLftpCommand libURLLastHTTPHeaders libURLLastRHHeaders libUrlMultipartFormAddPart libUrlMultipartFormData libURLVersion lineOffset ln ln1 localNames log log2 log10 longFilePath lower macToISO matchChunk matchText matrixMultiply max md5Digest median merge millisec millisecs millisecond milliseconds min monthNames num number numToByte numToChar offset open openfiles openProcesses openProcessIDs openSockets paramCount param params peerAddress pendingMessages platform processID random randomBytes replaceText result revCreateXMLTree revCreateXMLTreeFromFile revCurrentRecord revCurrentRecordIsFirst revCurrentRecordIsLast revDatabaseColumnCount revDatabaseColumnIsNull revDatabaseColumnLengths revDatabaseColumnNames revDatabaseColumnNamed revDatabaseColumnNumbered revDatabaseColumnTypes revDatabaseConnectResult revDatabaseCursors revDatabaseID revDatabaseTableNames revDatabaseType revDataFromQuery revdb_closeCursor revdb_columnbynumber revdb_columncount revdb_columnisnull revdb_columnlengths revdb_columnnames revdb_columntypes revdb_commit revdb_connect revdb_connections revdb_connectionerr revdb_currentrecord revdb_cursorconnection revdb_cursorerr revdb_cursors revdb_dbtype revdb_disconnect revdb_execute revdb_iseof revdb_isbof revdb_movefirst revdb_movelast revdb_movenext revdb_moveprev revdb_query revdb_querylist revdb_recordcount revdb_rollback revdb_tablenames revGetDatabaseDriverPath revNumberOfRecords revOpenDatabase revOpenDatabases revQueryDatabase revQueryDatabaseBlob revQueryResult revQueryIsAtStart revQueryIsAtEnd revUnixFromMacPath revXMLAttribute revXMLAttributes revXMLAttributeValues revXMLChildContents revXMLChildNames revXMLFirstChild revXMLMatchingNode revXMLNextSibling revXMLNodeContents revXMLNumberOfChildren revXMLParent revXMLPreviousSibling revXMLRootNode revXMLRPC_CreateRequest revXMLRPC_Documents revXMLRPC_Error revXMLRPC_Execute revXMLRPC_GetHost revXMLRPC_GetMethod revXMLRPC_GetParam revXMLText revXMLRPC_GetParamCount revXMLRPC_GetParamNode revXMLRPC_GetParamType revXMLRPC_GetPath revXMLRPC_GetPort revXMLRPC_GetProtocol revXMLRPC_GetRequest revXMLRPC_GetResponse revXMLRPC_GetSocket revXMLTree revXMLTrees revXMLValidateDTD revZipDescribeItem revZipEnumerateItems revZipOpenArchives round sec secs seconds sha1Digest shell shortFilePath sin specialFolderPath sqrt standardDeviation statRound stdDev sum sysError systemVersion tan tempName tick ticks time to toLower toUpper transpose trunc uniDecode uniEncode upper URLDecode URLEncode URLStatus value variableNames version waitDepth weekdayNames wordOffset add breakpoint cancel clear local variable file word line folder directory URL close socket process combine constant convert create new alias folder directory decrypt delete variable word line folder directory URL dispatch divide do encrypt filter get include intersect kill libURLDownloadToFile libURLFollowHttpRedirects libURLftpUpload libURLftpUploadFile libURLresetAll libUrlSetAuthCallback libURLSetCustomHTTPHeaders libUrlSetExpect100 libURLSetFTPListCommand libURLSetFTPMode libURLSetFTPStopTime libURLSetStatusCallback load multiply socket process post seek rel relative read from process rename replace require resetAll revAddXMLNode revAppendXML revCloseCursor revCloseDatabase revCommitDatabase revCopyFile revCopyFolder revCopyXMLNode revDeleteFolder revDeleteXMLNode revDeleteAllXMLTrees revDeleteXMLTree revExecuteSQL revGoURL revInsertXMLNode revMoveFolder revMoveToFirstRecord revMoveToLastRecord revMoveToNextRecord revMoveToPreviousRecord revMoveToRecord revMoveXMLNode revPutIntoXMLNode revRollBackDatabase revSetDatabaseDriverPath revSetXMLAttribute revXMLRPC_AddParam revXMLRPC_DeleteAllDocuments revXMLAddDTD revXMLRPC_Free revXMLRPC_FreeAll revXMLRPC_DeleteDocument revXMLRPC_DeleteParam revXMLRPC_SetHost revXMLRPC_SetMethod revXMLRPC_SetPort revXMLRPC_SetProtocol revXMLRPC_SetSocket revZipAddItemWithData revZipAddItemWithFile revZipAddUncompressedItemWithData revZipAddUncompressedItemWithFile revZipCancel revZipCloseArchive revZipDeleteItem revZipExtractItemToFile revZipExtractItemToVariable revZipSetProgressCallback revZipRenameItem revZipReplaceItemWithData revZipReplaceItemWithFile revZipOpenArchive send set sort split subtract union unload wait write"},c:[e,{cN:"keyword",b:"\\bend\\sif\\b"},{cN:"function",bK:"function",e:"$",c:[e,c,a.ASM,a.QSM,a.BNM,a.CNM,d]},{cN:"function",bK:"end",e:"$",c:[c,d]},{cN:"command",bK:"command on",e:"$",c:[e,c,a.ASM,a.QSM,a.BNM,a.CNM,d]},{cN:"command",bK:"end",e:"$",c:[c,d]},{cN:"preprocessor",b:"<\\?rev|<\\?lc|<\\?livecode",r:10},{cN:"preprocessor",b:"<\\?"},{cN:"preprocessor",b:"\\?>"},b,a.ASM,a.QSM,a.BNM,a.CNM,d],i:";$|^\\[|^="}});hljs.registerLanguage("profile",function(a){return{c:[a.CNM,{cN:"built_in",b:"{",e:"}$",eB:true,eE:true,c:[a.ASM,a.QSM],r:0},{cN:"filename",b:"[a-zA-Z_][\\da-zA-Z_]+\\.[\\da-zA-Z_]{1,3}",e:":",eE:true},{cN:"header",b:"(ncalls|tottime|cumtime)",e:"$",k:"ncalls tottime|10 cumtime|10 filename",r:10},{cN:"summary",b:"function calls",e:"$",c:[a.CNM],r:10},a.ASM,a.QSM,{cN:"function",b:"\\(",e:"\\)$",c:[a.UTM],r:0}]}});hljs.registerLanguage("php",function(b){var e={cN:"variable",b:"\\$+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*"};var a={cN:"preprocessor",b:/<\?(php)?|\?>/};var c={cN:"string",c:[b.BE,a],v:[{b:'b"',e:'"'},{b:"b'",e:"'"},b.inherit(b.ASM,{i:null}),b.inherit(b.QSM,{i:null})]};var d={v:[b.BNM,b.CNM]};return{cI:true,k:"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally",c:[b.CLCM,b.HCM,{cN:"comment",b:"/\\*",e:"\\*/",c:[{cN:"phpdoc",b:"\\s@[A-Za-z]+"},a]},{cN:"comment",b:"__halt_compiler.+?;",eW:true,k:"__halt_compiler",l:b.UIR},{cN:"string",b:"<<<['\"]?\\w+['\"]?$",e:"^\\w+;",c:[b.BE]},a,e,{cN:"function",bK:"function",e:/[;{]/,i:"\\$|\\[|%",c:[b.UTM,{cN:"params",b:"\\(",e:"\\)",c:["self",e,b.CBLCLM,c,d]}]},{cN:"class",bK:"class interface",e:"{",i:/[:\(\$"]/,c:[{bK:"extends implements",r:10},b.UTM]},{bK:"namespace",e:";",i:/[\.']/,c:[b.UTM]},{bK:"use",e:";",c:[b.UTM]},{b:"=>"},c,d]}});hljs.registerLanguage("parser3",function(a){return{sL:"xml",r:0,c:[{cN:"comment",b:"^#",e:"$"},{cN:"comment",b:"\\^rem{",e:"}",r:10,c:[{b:"{",e:"}",c:["self"]}]},{cN:"preprocessor",b:"^@(?:BASE|USE|CLASS|OPTIONS)$",r:10},{cN:"title",b:"@[\\w\\-]+\\[[\\w^;\\-]*\\](?:\\[[\\w^;\\-]*\\])?(?:.*)$"},{cN:"variable",b:"\\$\\{?[\\w\\-\\.\\:]+\\}?"},{cN:"keyword",b:"\\^[\\w\\-\\.\\:]+"},{cN:"number",b:"\\^#[0-9a-fA-F]+"},a.CNM]}});hljs.registerLanguage("actionscript",function(a){var c="[a-zA-Z_$][a-zA-Z0-9_$]*";var b="([*]|[a-zA-Z_$][a-zA-Z0-9_$]*)";var d={cN:"rest_arg",b:"[.]{3}",e:c,r:10};return{k:{keyword:"as break case catch class const continue default delete do dynamic each else extends final finally for function get if implements import in include instanceof interface internal is namespace native new override package private protected public return set static super switch this throw try typeof use var void while with",literal:"true false null undefined"},c:[a.ASM,a.QSM,a.CLCM,a.CBLCLM,a.CNM,{cN:"package",bK:"package",e:"{",c:[a.TM]},{cN:"class",bK:"class interface",e:"{",c:[{bK:"extends implements"},a.TM]},{cN:"preprocessor",bK:"import include",e:";"},{cN:"function",bK:"function",e:"[{;]",i:"\\S",c:[a.TM,{cN:"params",b:"\\(",e:"\\)",c:[a.ASM,a.QSM,a.CLCM,a.CBLCLM,d]},{cN:"type",b:":",e:b,r:10}]}]}});hljs.registerLanguage("nginx",function(c){var b={cN:"variable",v:[{b:/\$\d+/},{b:/\$\{/,e:/}/},{b:"[\\$\\@]"+c.UIR}]};var a={eW:true,l:"[a-z/_]+",k:{built_in:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},r:0,i:"=>",c:[c.HCM,{cN:"string",c:[c.BE,b],v:[{b:/"/,e:/"/},{b:/'/,e:/'/}]},{cN:"url",b:"([a-z]+):/",e:"\\s",eW:true,eE:true},{cN:"regexp",c:[c.BE,b],v:[{b:"\\s\\^",e:"\\s|{|;",rE:true},{b:"~\\*?\\s+",e:"\\s|{|;",rE:true},{b:"\\*(\\.[a-z\\-]+)+"},{b:"([a-z\\-]+\\.)+\\*"}]},{cN:"number",b:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{cN:"number",b:"\\b\\d+[kKmMgGdshdwy]*\\b",r:0},b]};return{c:[c.HCM,{b:c.UIR+"\\s",e:";|{",rB:true,c:[c.inherit(c.UTM,{starts:a})],r:0}],i:"[^\\s\\}]"}});hljs.registerLanguage("vhdl",function(a){return{cI:true,k:{keyword:"abs access after alias all and architecture array assert attribute begin block body buffer bus case component configuration constant context cover disconnect downto default else elsif end entity exit fairness file for force function generate generic group guarded if impure in inertial inout is label library linkage literal loop map mod nand new next nor not null of on open or others out package port postponed procedure process property protected pure range record register reject release rem report restrict restrict_guarantee return rol ror select sequence severity shared signal sla sll sra srl strong subtype then to transport type unaffected units until use variable vmode vprop vunit wait when while with xnor xor",typename:"boolean bit character severity_level integer time delay_length natural positive string bit_vector file_open_kind file_open_status std_ulogic std_ulogic_vector std_logic std_logic_vector unsigned signed boolean_vector integer_vector real_vector time_vector"},i:"{",c:[a.CBLCLM,{cN:"comment",b:"--",e:"$"},a.QSM,a.CNM,{cN:"literal",b:"'(U|X|0|1|Z|W|L|H|-)'",c:[a.BE]},{cN:"attribute",b:"'[A-Za-z](_?[A-Za-z0-9])*",c:[a.BE]}]}});hljs.registerLanguage("fix",function(a){return{c:[{b:/[^\u2401\u0001]+/,e:/[\u2401\u0001]/,eE:true,rB:true,rE:false,c:[{b:/([^\u2401\u0001=]+)/,e:/=([^\u2401\u0001=]+)/,rE:true,rB:false,cN:"attribute"},{b:/=/,e:/([\u2401\u0001])/,eE:true,eB:true,cN:"string"}]}],cI:true}});hljs.registerLanguage("diff",function(a){return{c:[{cN:"chunk",r:10,v:[{b:/^\@\@ +\-\d+,\d+ +\+\d+,\d+ +\@\@$/},{b:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{b:/^\-\-\- +\d+,\d+ +\-\-\-\-$/}]},{cN:"header",v:[{b:/Index: /,e:/$/},{b:/=====/,e:/=====$/},{b:/^\-\-\-/,e:/$/},{b:/^\*{3} /,e:/$/},{b:/^\+\+\+/,e:/$/},{b:/\*{5}/,e:/\*{5}$/}]},{cN:"addition",b:"^\\+",e:"$"},{cN:"deletion",b:"^\\-",e:"$"},{cN:"change",b:"^\\!",e:"$"}]}});hljs.registerLanguage("smalltalk",function(a){var b="[a-z][a-zA-Z0-9_]*";var d={cN:"char",b:"\\$.{1}"};var c={cN:"symbol",b:"#"+a.UIR};return{k:"self super nil true false thisContext",c:[{cN:"comment",b:'"',e:'"'},a.ASM,{cN:"class",b:"\\b[A-Z][A-Za-z0-9_]*",r:0},{cN:"method",b:b+":",r:0},a.CNM,c,d,{cN:"localvars",b:"\\|[ ]*"+b+"([ ]+"+b+")*[ ]*\\|",rB:true,e:/\|/,i:/\S/,c:[{b:"(\\|[ ]*)?"+b}]},{cN:"array",b:"\\#\\(",e:"\\)",c:[a.ASM,d,a.CNM,c]}]}});hljs.registerLanguage("clojure",function(l){var e={built_in:"def cond apply if-not if-let if not not= = &lt; < > &lt;= <= >= == + / * - rem quot neg? pos? delay? symbol? keyword? true? false? integer? empty? coll? list? set? ifn? fn? associative? sequential? sorted? counted? reversible? number? decimal? class? distinct? isa? float? rational? reduced? ratio? odd? even? char? seq? vector? string? map? nil? contains? zero? instance? not-every? not-any? libspec? -> ->> .. . inc compare do dotimes mapcat take remove take-while drop letfn drop-last take-last drop-while while intern condp case reduced cycle split-at split-with repeat replicate iterate range merge zipmap declare line-seq sort comparator sort-by dorun doall nthnext nthrest partition eval doseq await await-for let agent atom send send-off release-pending-sends add-watch mapv filterv remove-watch agent-error restart-agent set-error-handler error-handler set-error-mode! error-mode shutdown-agents quote var fn loop recur throw try monitor-enter monitor-exit defmacro defn defn- macroexpand macroexpand-1 for dosync and or when when-not when-let comp juxt partial sequence memoize constantly complement identity assert peek pop doto proxy defstruct first rest cons defprotocol cast coll deftype defrecord last butlast sigs reify second ffirst fnext nfirst nnext defmulti defmethod meta with-meta ns in-ns create-ns import refer keys select-keys vals key val rseq name namespace promise into transient persistent! conj! assoc! dissoc! pop! disj! use class type num float double short byte boolean bigint biginteger bigdec print-method print-dup throw-if printf format load compile get-in update-in pr pr-on newline flush read slurp read-line subvec with-open memfn time re-find re-groups rand-int rand mod locking assert-valid-fdecl alias resolve ref deref refset swap! reset! set-validator! compare-and-set! alter-meta! reset-meta! commute get-validator alter ref-set ref-history-count ref-min-history ref-max-history ensure sync io! new next conj set! to-array future future-call into-array aset gen-class reduce map filter find empty hash-map hash-set sorted-map sorted-map-by sorted-set sorted-set-by vec vector seq flatten reverse assoc dissoc list disj get union difference intersection extend extend-type extend-protocol int nth delay count concat chunk chunk-buffer chunk-append chunk-first chunk-rest max min dec unchecked-inc-int unchecked-inc unchecked-dec-inc unchecked-dec unchecked-negate unchecked-add-int unchecked-add unchecked-subtract-int unchecked-subtract chunk-next chunk-cons chunked-seq? prn vary-meta lazy-seq spread list* str find-keyword keyword symbol gensym force rationalize"};var f="[a-zA-Z_0-9\\!\\.\\?\\-\\+\\*\\/\\<\\=\\>\\&\\#\\$';]+";var a="[\\s:\\(\\{]+\\d+(\\.\\d+)?";var d={cN:"number",b:a,r:0};var j=l.inherit(l.QSM,{i:null});var o={cN:"comment",b:";",e:"$",r:0};var n={cN:"collection",b:"[\\[\\{]",e:"[\\]\\}]"};var c={cN:"comment",b:"\\^"+f};var b={cN:"comment",b:"\\^\\{",e:"\\}"};var h={cN:"attribute",b:"[:]"+f};var m={cN:"list",b:"\\(",e:"\\)"};var g={eW:true,k:{literal:"true false nil"},r:0};var i={k:e,l:f,cN:"title",b:f,starts:g};m.c=[{cN:"comment",b:"comment"},i,g];g.c=[m,j,c,b,o,h,n,d];n.c=[m,j,c,o,h,n,d];return{i:/\S/,c:[o,m,{cN:"prompt",b:/^=> /,starts:{e:/\n\n|\Z/}}]}});hljs.registerLanguage("oxygene",function(b){var g="abstract add and array as asc aspect assembly async begin break block by case class concat const copy constructor continue create default delegate desc distinct div do downto dynamic each else empty end ensure enum equals event except exit extension external false final finalize finalizer finally flags for forward from function future global group has if implementation implements implies in index inherited inline interface into invariants is iterator join locked locking loop matching method mod module namespace nested new nil not notify nullable of old on operator or order out override parallel params partial pinned private procedure property protected public queryable raise read readonly record reintroduce remove repeat require result reverse sealed select self sequence set shl shr skip static step soft take then to true try tuple type union unit unsafe until uses using var virtual raises volatile where while with write xor yield await mapped deprecated stdcall cdecl pascal register safecall overload library platform reference packed strict published autoreleasepool selector strong weak unretained";var a={cN:"comment",b:"{",e:"}",r:0};var e={cN:"comment",b:"\\(\\*",e:"\\*\\)",r:10};var c={cN:"string",b:"'",e:"'",c:[{b:"''"}]};var d={cN:"string",b:"(#\\d+)+"};var f={cN:"function",bK:"function constructor destructor procedure method",e:"[:;]",k:"function constructor|10 destructor|10 procedure|10 method|10",c:[b.TM,{cN:"params",b:"\\(",e:"\\)",k:g,c:[c,d]},a,e]};return{cI:true,k:g,i:'("|\\$[G-Zg-z]|\\/\\*|</)',c:[a,e,b.CLCM,c,d,b.NM,f,{cN:"class",b:"=\\bclass\\b",e:"end;",k:g,c:[c,d,a,e,b.CLCM,f]}]}});hljs.registerLanguage("asciidoc",function(a){return{c:[{cN:"comment",b:"^/{4,}\\n",e:"\\n/{4,}$",r:10},{cN:"comment",b:"^//",e:"$",r:0},{cN:"title",b:"^\\.\\w.*$"},{b:"^[=\\*]{4,}\\n",e:"\\n^[=\\*]{4,}$",r:10},{cN:"header",b:"^(={1,5}) .+?( \\1)?$",r:10},{cN:"header",b:"^[^\\[\\]\\n]+?\\n[=\\-~\\^\\+]{2,}$",r:10},{cN:"attribute",b:"^:.+?:",e:"\\s",eE:true,r:10},{cN:"attribute",b:"^\\[.+?\\]$",r:0},{cN:"blockquote",b:"^_{4,}\\n",e:"\\n_{4,}$",r:10},{cN:"code",b:"^[\\-\\.]{4,}\\n",e:"\\n[\\-\\.]{4,}$",r:10},{b:"^\\+{4,}\\n",e:"\\n\\+{4,}$",c:[{b:"<",e:">",sL:"xml",r:0}],r:10},{cN:"bullet",b:"^(\\*+|\\-+|\\.+|[^\\n]+?::)\\s+"},{cN:"label",b:"^(NOTE|TIP|IMPORTANT|WARNING|CAUTION):\\s+",r:10},{cN:"strong",b:"\\B\\*(?![\\*\\s])",e:"(\\n{2}|\\*)",c:[{b:"\\\\*\\w",r:0}]},{cN:"emphasis",b:"\\B'(?!['\\s])",e:"(\\n{2}|')",c:[{b:"\\\\'\\w",r:0}],r:0},{cN:"emphasis",b:"_(?![_\\s])",e:"(\\n{2}|_)",r:0},{cN:"smartquote",b:"``.+?''",r:10},{cN:"smartquote",b:"`.+?'",r:10},{cN:"code",b:"(`.+?`|\\+.+?\\+)",r:0},{cN:"code",b:"^[ \\t]",e:"$",r:0},{cN:"horizontal_rule",b:"^'{3,}[ \\t]*$",r:10},{b:"(link:)?(http|https|ftp|file|irc|image:?):\\S+\\[.*?\\]",rB:true,c:[{b:"(link|image:?):",r:0},{cN:"link_url",b:"\\w",e:"[^\\[]+",r:0},{cN:"link_label",b:"\\[",e:"\\]",eB:true,eE:true,r:0}],r:10}]}});hljs.registerLanguage("erlang-repl",function(a){return{k:{special_functions:"spawn spawn_link self",reserved:"after and andalso|10 band begin bnot bor bsl bsr bxor case catch cond div end fun if let not of or orelse|10 query receive rem try when xor"},c:[{cN:"prompt",b:"^[0-9]+> ",r:10},{cN:"comment",b:"%",e:"$"},{cN:"number",b:"\\b(\\d+#[a-fA-F0-9]+|\\d+(\\.\\d+)?([eE][-+]?\\d+)?)",r:0},a.ASM,a.QSM,{cN:"constant",b:"\\?(::)?([A-Z]\\w*(::)?)+"},{cN:"arrow",b:"->"},{cN:"ok",b:"ok"},{cN:"exclamation_mark",b:"!"},{cN:"function_or_atom",b:"(\\b[a-z'][a-zA-Z0-9_']*:[a-z'][a-zA-Z0-9_']*)|(\\b[a-z'][a-zA-Z0-9_']*)",r:0},{cN:"variable",b:"[A-Z][a-zA-Z0-9_']*",r:0}]}});hljs.registerLanguage("autohotkey",function(b){var d={cN:"escape",b:"`[\\s\\S]"};var c={cN:"comment",b:";",e:"$",r:0};var a=[{cN:"built_in",b:"A_[a-zA-Z0-9]+"},{cN:"built_in",bK:"ComSpec Clipboard ClipboardAll ErrorLevel"}];return{cI:true,k:{keyword:"Break Continue Else Gosub If Loop Return While",literal:"A true false NOT AND OR"},c:a.concat([d,b.inherit(b.QSM,{c:[d]}),c,{cN:"number",b:b.NR,r:0},{cN:"var_expand",b:"%",e:"%",i:"\\n",c:[d]},{cN:"label",c:[d],v:[{b:'^[^\\n";]+::(?!=)'},{b:'^[^\\n";]+:(?!=)',r:0}]},{b:",\\s*,",r:10}])}});hljs.registerLanguage("scilab",function(a){var b=[a.CNM,{cN:"string",b:"'|\"",e:"'|\"",c:[a.BE,{b:"''"}]}];return{k:{keyword:"abort break case clear catch continue do elseif else endfunction end for functionglobal if pause return resume select try then while%f %F %t %T %pi %eps %inf %nan %e %i %z %s",built_in:"abs and acos asin atan ceil cd chdir clearglobal cosh cos cumprod deff disp errorexec execstr exists exp eye gettext floor fprintf fread fsolve imag isdef isemptyisinfisnan isvector lasterror length load linspace list listfiles log10 log2 logmax min msprintf mclose mopen ones or pathconvert poly printf prod pwd rand realround sinh sin size gsort sprintf sqrt strcat strcmps tring sum system tanh tantype typename warning zeros matrix"},i:'("|#|/\\*|\\s+/\\w+)',c:[{cN:"function",bK:"function endfunction",e:"$",k:"function endfunction|10",c:[a.UTM,{cN:"params",b:"\\(",e:"\\)"},],},{cN:"transposed_variable",b:"[a-zA-Z_][a-zA-Z_0-9]*('+[\\.']*|[\\.']+)",e:"",r:0},{cN:"matrix",b:"\\[",e:"\\]'*[\\.']*",r:0,c:b},{cN:"comment",b:"//",e:"$"}].concat(b)}});
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/markdown/marked.min.js b/Source/platformProject/platform2022UI/jslib/markdown/marked.min.js
new file mode 100644
index 0000000..4302234
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/markdown/marked.min.js
@@ -0,0 +1,896 @@
+/**
+ * marked - a markdown parser
+ * Copyright (c) 2011-2021, Christopher Jeffrey. (MIT Licensed)
+ * https://github.com/markedjs/marked
+ */
+!function (e, u) {
+    "object" == typeof exports && "undefined" != typeof module ? module.exports = u() : "function" == typeof define && define.amd ? define(u) : (e = "undefined" != typeof globalThis ? globalThis : e || self).marked = u()
+}(this, function () {
+    "use strict";
+
+    function r(e, u) {
+        for (var t = 0; t < u.length; t++) {
+            var n = u[t];
+            n.enumerable = n.enumerable || !1, n.configurable = !0, "value" in n && (n.writable = !0), Object.defineProperty(e, n.key, n)
+        }
+    }
+
+    function i(e, u) {
+        (null == u || u > e.length) && (u = e.length);
+        for (var t = 0, n = new Array(u); t < u; t++) n[t] = e[t];
+        return n
+    }
+
+    function c(e, u) {
+        var t;
+        if ("undefined" != typeof Symbol && null != e[Symbol.iterator]) return (t = e[Symbol.iterator]()).next.bind(t);
+        if (Array.isArray(e) || (t = function (e, u) {
+            if (e) {
+                if ("string" == typeof e) return i(e, u);
+                var t = Object.prototype.toString.call(e).slice(8, -1);
+                return "Map" === (t = "Object" === t && e.constructor ? e.constructor.name : t) || "Set" === t ? Array.from(e) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? i(e, u) : void 0
+            }
+        }(e)) || u && e && "number" == typeof e.length) {
+            t && (e = t);
+            var n = 0;
+            return function () {
+                return n >= e.length ? {done: !0} : {done: !1, value: e[n++]}
+            }
+        }
+        throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")
+    }
+
+    function t(e) {
+        return D[e]
+    }
+
+    var e, u = (function (u) {
+            function e() {
+                return {
+                    baseUrl: null,
+                    breaks: !1,
+                    gfm: !0,
+                    headerIds: !0,
+                    headerPrefix: "",
+                    highlight: null,
+                    langPrefix: "language-",
+                    mangle: !0,
+                    pedantic: !1,
+                    renderer: null,
+                    sanitize: !1,
+                    sanitizer: null,
+                    silent: !1,
+                    smartLists: !1,
+                    smartypants: !1,
+                    tokenizer: null,
+                    walkTokens: null,
+                    xhtml: !1
+                }
+            }
+
+            u.exports = {
+                defaults: e(), getDefaults: e, changeDefaults: function (e) {
+                    u.exports.defaults = e
+                }
+            }
+        }(e = {exports: {}}), e.exports), n = /[&<>"']/, s = /[&<>"']/g, l = /[<>"']|&(?!#?\w+;)/,
+        a = /[<>"']|&(?!#?\w+;)/g, D = {"&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;", "'": "&#39;"};
+    var o = /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi;
+
+    function h(e) {
+        return e.replace(o, function (e, u) {
+            return "colon" === (u = u.toLowerCase()) ? ":" : "#" === u.charAt(0) ? "x" === u.charAt(1) ? String.fromCharCode(parseInt(u.substring(2), 16)) : String.fromCharCode(+u.substring(1)) : ""
+        })
+    }
+
+    var p = /(^|[^\[])\^/g;
+    var g = /[^\w:]/g, f = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;
+    var F = {}, A = /^[^:]+:\/*[^/]*$/, C = /^([^:]+:)[\s\S]*$/, d = /^([^:]+:\/*[^/]*)[\s\S]*$/;
+
+    function E(e, u) {
+        F[" " + e] || (A.test(e) ? F[" " + e] = e + "/" : F[" " + e] = k(e, "/", !0));
+        var t = -1 === (e = F[" " + e]).indexOf(":");
+        return "//" === u.substring(0, 2) ? t ? u : e.replace(C, "$1") + u : "/" === u.charAt(0) ? t ? u : e.replace(d, "$1") + u : e + u
+    }
+
+    function k(e, u, t) {
+        var n = e.length;
+        if (0 === n) return "";
+        for (var r = 0; r < n;) {
+            var i = e.charAt(n - r - 1);
+            if (i !== u || t) {
+                if (i === u || !t) break;
+                r++
+            } else r++
+        }
+        return e.substr(0, n - r)
+    }
+
+    var m = function (e, u) {
+        if (u) {
+            if (n.test(e)) return e.replace(s, t)
+        } else if (l.test(e)) return e.replace(a, t);
+        return e
+    }, b = h, x = function (t, e) {
+        t = t.source || t, e = e || "";
+        var n = {
+            replace: function (e, u) {
+                return u = (u = u.source || u).replace(p, "$1"), t = t.replace(e, u), n
+            }, getRegex: function () {
+                return new RegExp(t, e)
+            }
+        };
+        return n
+    }, B = function (e, u, t) {
+        if (e) {
+            var n;
+            try {
+                n = decodeURIComponent(h(t)).replace(g, "").toLowerCase()
+            } catch (e) {
+                return null
+            }
+            if (0 === n.indexOf("javascript:") || 0 === n.indexOf("vbscript:") || 0 === n.indexOf("data:")) return null
+        }
+        u && !f.test(t) && (t = E(u, t));
+        try {
+            t = encodeURI(t).replace(/%25/g, "%")
+        } catch (e) {
+            return null
+        }
+        return t
+    }, w = {
+        exec: function () {
+        }
+    }, v = function (e) {
+        for (var u, t, n = 1; n < arguments.length; n++) for (t in u = arguments[n]) Object.prototype.hasOwnProperty.call(u, t) && (e[t] = u[t]);
+        return e
+    }, y = function (e, u) {
+        var t = e.replace(/\|/g, function (e, u, t) {
+            for (var n = !1, r = u; 0 <= --r && "\\" === t[r];) n = !n;
+            return n ? "|" : " |"
+        }).split(/ \|/), n = 0;
+        if (t.length > u) t.splice(u); else for (; t.length < u;) t.push("");
+        for (; n < t.length; n++) t[n] = t[n].trim().replace(/\\\|/g, "|");
+        return t
+    }, _ = function (e, u) {
+        if (-1 === e.indexOf(u[1])) return -1;
+        for (var t = e.length, n = 0, r = 0; r < t; r++) if ("\\" === e[r]) r++; else if (e[r] === u[0]) n++; else if (e[r] === u[1] && --n < 0) return r;
+        return -1
+    }, z = function (e) {
+        e && e.sanitize && !e.silent && console.warn("marked(): sanitize and sanitizer parameters are deprecated since version 0.7.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/#/USING_ADVANCED.md#options")
+    }, $ = function (e, u) {
+        if (u < 1) return "";
+        for (var t = ""; 1 < u;) 1 & u && (t += e), u >>= 1, e += e;
+        return t + e
+    }, S = u.defaults, T = k, I = y, R = m, Z = _;
+
+    function q(e, u, t) {
+        var n = u.href, r = u.title ? R(u.title) : null, u = e[1].replace(/\\([\[\]])/g, "$1");
+        return "!" !== e[0].charAt(0) ? {type: "link", raw: t, href: n, title: r, text: u} : {
+            type: "image",
+            raw: t,
+            href: n,
+            title: r,
+            text: R(u)
+        }
+    }
+
+    var O = function () {
+        function e(e) {
+            this.options = e || S
+        }
+
+        var u = e.prototype;
+        return u.space = function (e) {
+            e = this.rules.block.newline.exec(e);
+            if (e) return 1 < e[0].length ? {type: "space", raw: e[0]} : {raw: "\n"}
+        }, u.code = function (e) {
+            var u = this.rules.block.code.exec(e);
+            if (u) {
+                e = u[0].replace(/^ {1,4}/gm, "");
+                return {
+                    type: "code",
+                    raw: u[0],
+                    codeBlockStyle: "indented",
+                    text: this.options.pedantic ? e : T(e, "\n")
+                }
+            }
+        }, u.fences = function (e) {
+            var u = this.rules.block.fences.exec(e);
+            if (u) {
+                var t = u[0], e = function (e, u) {
+                    if (null === (e = e.match(/^(\s+)(?:```)/))) return u;
+                    var t = e[1];
+                    return u.split("\n").map(function (e) {
+                        var u = e.match(/^\s+/);
+                        return null !== u && u[0].length >= t.length ? e.slice(t.length) : e
+                    }).join("\n")
+                }(t, u[3] || "");
+                return {type: "code", raw: t, lang: u[2] && u[2].trim(), text: e}
+            }
+        }, u.heading = function (e) {
+            var u = this.rules.block.heading.exec(e);
+            if (u) {
+                var t = u[2].trim();
+                return /#$/.test(t) && (e = T(t, "#"), !this.options.pedantic && e && !/ $/.test(e) || (t = e.trim())), {
+                    type: "heading",
+                    raw: u[0],
+                    depth: u[1].length,
+                    text: t
+                }
+            }
+        }, u.nptable = function (e) {
+            e = this.rules.block.nptable.exec(e);
+            if (e) {
+                var u = {
+                    type: "table",
+                    header: I(e[1].replace(/^ *| *\| *$/g, "")),
+                    align: e[2].replace(/^ *|\| *$/g, "").split(/ *\| */),
+                    cells: e[3] ? e[3].replace(/\n$/, "").split("\n") : [],
+                    raw: e[0]
+                };
+                if (u.header.length === u.align.length) {
+                    for (var t = u.align.length, n = 0; n < t; n++) /^ *-+: *$/.test(u.align[n]) ? u.align[n] = "right" : /^ *:-+: *$/.test(u.align[n]) ? u.align[n] = "center" : /^ *:-+ *$/.test(u.align[n]) ? u.align[n] = "left" : u.align[n] = null;
+                    for (t = u.cells.length, n = 0; n < t; n++) u.cells[n] = I(u.cells[n], u.header.length);
+                    return u
+                }
+            }
+        }, u.hr = function (e) {
+            e = this.rules.block.hr.exec(e);
+            if (e) return {type: "hr", raw: e[0]}
+        }, u.blockquote = function (e) {
+            var u = this.rules.block.blockquote.exec(e);
+            if (u) {
+                e = u[0].replace(/^ *> ?/gm, "");
+                return {type: "blockquote", raw: u[0], text: e}
+            }
+        }, u.list = function (e) {
+            e = this.rules.block.list.exec(e);
+            if (e) {
+                for (var u, t, n, r, i, s, l = e[0], a = e[2], D = 1 < a.length, o = {
+                    type: "list",
+                    raw: l,
+                    ordered: D,
+                    start: D ? +a.slice(0, -1) : "",
+                    loose: !1,
+                    items: []
+                }, c = e[0].match(this.rules.block.item), h = !1, p = c.length, g = this.rules.block.listItemStart.exec(c[0]), f = 0; f < p; f++) {
+                    if (l = u = c[f], this.options.pedantic || (s = u.match(new RegExp("\\n\\s*\\n {0," + (g[0].length - 1) + "}\\S"))) && (t = u.length - s.index + c.slice(f + 1).join("\n").length, o.raw = o.raw.substring(0, o.raw.length - t), l = u = u.substring(0, s.index), p = f + 1), f !== p - 1) {
+                        if (n = this.rules.block.listItemStart.exec(c[f + 1]), this.options.pedantic ? n[1].length > g[1].length : n[1].length >= g[0].length || 3 < n[1].length) {
+                            c.splice(f, 2, c[f] + (!this.options.pedantic && n[1].length < g[0].length && !c[f].match(/\n$/) ? "" : "\n") + c[f + 1]), f--, p--;
+                            continue
+                        }
+                        (!this.options.pedantic || this.options.smartLists ? n[2][n[2].length - 1] !== a[a.length - 1] : D == (1 === n[2].length)) && (t = c.slice(f + 1).join("\n").length, o.raw = o.raw.substring(0, o.raw.length - t), f = p - 1), g = n
+                    }
+                    n = u.length, ~(u = u.replace(/^ *([*+-]|\d+[.)]) ?/, "")).indexOf("\n ") && (n -= u.length, u = this.options.pedantic ? u.replace(/^ {1,4}/gm, "") : u.replace(new RegExp("^ {1," + n + "}", "gm"), "")), u = T(u, "\n"), f !== p - 1 && (l += "\n"), n = h || /\n\n(?!\s*$)/.test(l), f !== p - 1 && (h = "\n\n" === l.slice(-2), n = n || h), n && (o.loose = !0), this.options.gfm && (i = void 0, (r = /^\[[ xX]\] /.test(u)) && (i = " " !== u[1], u = u.replace(/^\[[ xX]\] +/, ""))), o.items.push({
+                        type: "list_item",
+                        raw: l,
+                        task: r,
+                        checked: i,
+                        loose: n,
+                        text: u
+                    })
+                }
+                return o
+            }
+        }, u.html = function (e) {
+            e = this.rules.block.html.exec(e);
+            if (e) return {
+                type: this.options.sanitize ? "paragraph" : "html",
+                raw: e[0],
+                pre: !this.options.sanitizer && ("pre" === e[1] || "script" === e[1] || "style" === e[1]),
+                text: this.options.sanitize ? this.options.sanitizer ? this.options.sanitizer(e[0]) : R(e[0]) : e[0]
+            }
+        }, u.def = function (e) {
+            e = this.rules.block.def.exec(e);
+            if (e) return e[3] && (e[3] = e[3].substring(1, e[3].length - 1)), {
+                tag: e[1].toLowerCase().replace(/\s+/g, " "),
+                raw: e[0],
+                href: e[2],
+                title: e[3]
+            }
+        }, u.table = function (e) {
+            e = this.rules.block.table.exec(e);
+            if (e) {
+                var u = {
+                    type: "table",
+                    header: I(e[1].replace(/^ *| *\| *$/g, "")),
+                    align: e[2].replace(/^ *|\| *$/g, "").split(/ *\| */),
+                    cells: e[3] ? e[3].replace(/\n$/, "").split("\n") : []
+                };
+                if (u.header.length === u.align.length) {
+                    u.raw = e[0];
+                    for (var t = u.align.length, n = 0; n < t; n++) /^ *-+: *$/.test(u.align[n]) ? u.align[n] = "right" : /^ *:-+: *$/.test(u.align[n]) ? u.align[n] = "center" : /^ *:-+ *$/.test(u.align[n]) ? u.align[n] = "left" : u.align[n] = null;
+                    for (t = u.cells.length, n = 0; n < t; n++) u.cells[n] = I(u.cells[n].replace(/^ *\| *| *\| *$/g, ""), u.header.length);
+                    return u
+                }
+            }
+        }, u.lheading = function (e) {
+            e = this.rules.block.lheading.exec(e);
+            if (e) return {type: "heading", raw: e[0], depth: "=" === e[2].charAt(0) ? 1 : 2, text: e[1]}
+        }, u.paragraph = function (e) {
+            e = this.rules.block.paragraph.exec(e);
+            if (e) return {
+                type: "paragraph",
+                raw: e[0],
+                text: "\n" === e[1].charAt(e[1].length - 1) ? e[1].slice(0, -1) : e[1]
+            }
+        }, u.text = function (e) {
+            e = this.rules.block.text.exec(e);
+            if (e) return {type: "text", raw: e[0], text: e[0]}
+        }, u.escape = function (e) {
+            e = this.rules.inline.escape.exec(e);
+            if (e) return {type: "escape", raw: e[0], text: R(e[1])}
+        }, u.tag = function (e, u, t) {
+            e = this.rules.inline.tag.exec(e);
+            if (e) return !u && /^<a /i.test(e[0]) ? u = !0 : u && /^<\/a>/i.test(e[0]) && (u = !1), !t && /^<(pre|code|kbd|script)(\s|>)/i.test(e[0]) ? t = !0 : t && /^<\/(pre|code|kbd|script)(\s|>)/i.test(e[0]) && (t = !1), {
+                type: this.options.sanitize ? "text" : "html",
+                raw: e[0],
+                inLink: u,
+                inRawBlock: t,
+                text: this.options.sanitize ? this.options.sanitizer ? this.options.sanitizer(e[0]) : R(e[0]) : e[0]
+            }
+        }, u.link = function (e) {
+            var u = this.rules.inline.link.exec(e);
+            if (u) {
+                var t = u[2].trim();
+                if (!this.options.pedantic && /^</.test(t)) {
+                    if (!/>$/.test(t)) return;
+                    e = T(t.slice(0, -1), "\\");
+                    if ((t.length - e.length) % 2 == 0) return
+                } else {
+                    var n = Z(u[2], "()");
+                    -1 < n && (i = (0 === u[0].indexOf("!") ? 5 : 4) + u[1].length + n, u[2] = u[2].substring(0, n), u[0] = u[0].substring(0, i).trim(), u[3] = "")
+                }
+                var r, n = u[2], i = "";
+                return this.options.pedantic ? (r = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(n)) && (n = r[1], i = r[3]) : i = u[3] ? u[3].slice(1, -1) : "", n = n.trim(), q(u, {
+                    href: (n = /^</.test(n) ? this.options.pedantic && !/>$/.test(t) ? n.slice(1) : n.slice(1, -1) : n) && n.replace(this.rules.inline._escapes, "$1"),
+                    title: i && i.replace(this.rules.inline._escapes, "$1")
+                }, u[0])
+            }
+        }, u.reflink = function (e, u) {
+            if ((t = this.rules.inline.reflink.exec(e)) || (t = this.rules.inline.nolink.exec(e))) {
+                e = (t[2] || t[1]).replace(/\s+/g, " ");
+                if ((e = u[e.toLowerCase()]) && e.href) return q(t, e, t[0]);
+                var t = t[0].charAt(0);
+                return {type: "text", raw: t, text: t}
+            }
+        }, u.emStrong = function (e, u, t) {
+            void 0 === t && (t = "");
+            var n = this.rules.inline.emStrong.lDelim.exec(e);
+            if (n && (!n[3] || !t.match(/(?:[0-9A-Za-z\xAA\xB2\xB3\xB5\xB9\xBA\xBC-\xBE\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u0660-\u0669\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07C0-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08C7\u0904-\u0939\u093D\u0950\u0958-\u0961\u0966-\u096F\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09E6-\u09F1\u09F4-\u09F9\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A66-\u0A6F\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AE6-\u0AEF\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B66-\u0B6F\u0B71-\u0B77\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0BE6-\u0BF2\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C66-\u0C6F\u0C78-\u0C7E\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CE6-\u0CEF\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D58-\u0D61\u0D66-\u0D78\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DE6-\u0DEF\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F20-\u0F33\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F-\u1049\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u1090-\u1099\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1369-\u137C\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u17E0-\u17E9\u17F0-\u17F9\u1810-\u1819\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A16\u1A20-\u1A54\u1A80-\u1A89\u1A90-\u1A99\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B50-\u1B59\u1B83-\u1BA0\u1BAE-\u1BE5\u1C00-\u1C23\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2070\u2071\u2074-\u2079\u207F-\u2089\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2150-\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2CFD\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u3192-\u3195\u31A0-\u31BF\u31F0-\u31FF\u3220-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\u3400-\u4DBF\u4E00-\u9FFC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7BF\uA7C2-\uA7CA\uA7F5-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA830-\uA835\uA840-\uA873\uA882-\uA8B3\uA8D0-\uA8D9\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA900-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF-\uA9D9\uA9E0-\uA9E4\uA9E6-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA50-\uAA59\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD07-\uDD33\uDD40-\uDD78\uDD8A\uDD8B\uDE80-\uDE9C\uDEA0-\uDED0\uDEE1-\uDEFB\uDF00-\uDF23\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC58-\uDC76\uDC79-\uDC9E\uDCA7-\uDCAF\uDCE0-\uDCF2\uDCF4\uDCF5\uDCFB-\uDD1B\uDD20-\uDD39\uDD80-\uDDB7\uDDBC-\uDDCF\uDDD2-\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE40-\uDE48\uDE60-\uDE7E\uDE80-\uDE9F\uDEC0-\uDEC7\uDEC9-\uDEE4\uDEEB-\uDEEF\uDF00-\uDF35\uDF40-\uDF55\uDF58-\uDF72\uDF78-\uDF91\uDFA9-\uDFAF]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDCFA-\uDD23\uDD30-\uDD39\uDE60-\uDE7E\uDE80-\uDEA9\uDEB0\uDEB1\uDF00-\uDF27\uDF30-\uDF45\uDF51-\uDF54\uDFB0-\uDFCB\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC52-\uDC6F\uDC83-\uDCAF\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD03-\uDD26\uDD36-\uDD3F\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDD0-\uDDDA\uDDDC\uDDE1-\uDDF4\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDEF0-\uDEF9\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC50-\uDC59\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE50-\uDE59\uDE80-\uDEAA\uDEB8\uDEC0-\uDEC9\uDF00-\uDF1A\uDF30-\uDF3B]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCF2\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDD50-\uDD59\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC50-\uDC6C\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD50-\uDD59\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDDA0-\uDDA9\uDEE0-\uDEF2\uDFB0\uDFC0-\uDFD4]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF50-\uDF59\uDF5B-\uDF61\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE96\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82C[\uDC00-\uDD1E\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD834[\uDEE0-\uDEF3\uDF60-\uDF78]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD838[\uDD00-\uDD2C\uDD37-\uDD3D\uDD40-\uDD49\uDD4E\uDEC0-\uDEEB\uDEF0-\uDEF9]|\uD83A[\uDC00-\uDCC4\uDCC7-\uDCCF\uDD00-\uDD43\uDD4B\uDD50-\uDD59]|\uD83B[\uDC71-\uDCAB\uDCAD-\uDCAF\uDCB1-\uDCB4\uDD01-\uDD2D\uDD2F-\uDD3D\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD83C[\uDD00-\uDD0C]|\uD83E[\uDFF0-\uDFF9]|\uD869[\uDC00-\uDEDD\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A])/))) {
+                var r = n[1] || n[2] || "";
+                if (!r || r && ("" === t || this.rules.inline.punctuation.exec(t))) {
+                    var i, s = n[0].length - 1, l = s, a = 0,
+                        D = "*" === n[0][0] ? this.rules.inline.emStrong.rDelimAst : this.rules.inline.emStrong.rDelimUnd;
+                    for (D.lastIndex = 0, u = u.slice(-1 * e.length + s); null != (n = D.exec(u));) if (i = n[1] || n[2] || n[3] || n[4] || n[5] || n[6]) if (i = i.length, n[3] || n[4]) l += i; else if (!((n[5] || n[6]) && s % 3) || (s + i) % 3) {
+                        if (!(0 < (l -= i))) {
+                            if (l + a - i <= 0 && !u.slice(D.lastIndex).match(D) && (i = Math.min(i, i + l + a)), Math.min(s, i) % 2) return {
+                                type: "em",
+                                raw: e.slice(0, s + n.index + i + 1),
+                                text: e.slice(1, s + n.index + i)
+                            };
+                            if (Math.min(s, i) % 2 == 0) return {
+                                type: "strong",
+                                raw: e.slice(0, s + n.index + i + 1),
+                                text: e.slice(2, s + n.index + i - 1)
+                            }
+                        }
+                    } else a += i
+                }
+            }
+        }, u.codespan = function (e) {
+            var u = this.rules.inline.code.exec(e);
+            if (u) {
+                var t = u[2].replace(/\n/g, " "), n = /[^ ]/.test(t), e = /^ /.test(t) && / $/.test(t);
+                return n && e && (t = t.substring(1, t.length - 1)), t = R(t, !0), {
+                    type: "codespan",
+                    raw: u[0],
+                    text: t
+                }
+            }
+        }, u.br = function (e) {
+            e = this.rules.inline.br.exec(e);
+            if (e) return {type: "br", raw: e[0]}
+        }, u.del = function (e) {
+            e = this.rules.inline.del.exec(e);
+            if (e) return {type: "del", raw: e[0], text: e[2]}
+        }, u.autolink = function (e, u) {
+            e = this.rules.inline.autolink.exec(e);
+            if (e) {
+                var t, u = "@" === e[2] ? "mailto:" + (t = R(this.options.mangle ? u(e[1]) : e[1])) : t = R(e[1]);
+                return {type: "link", raw: e[0], text: t, href: u, tokens: [{type: "text", raw: t, text: t}]}
+            }
+        }, u.url = function (e, u) {
+            var t, n, r, i;
+            if (t = this.rules.inline.url.exec(e)) {
+                if ("@" === t[2]) r = "mailto:" + (n = R(this.options.mangle ? u(t[0]) : t[0])); else {
+                    for (; i = t[0], t[0] = this.rules.inline._backpedal.exec(t[0])[0], i !== t[0];) ;
+                    n = R(t[0]), r = "www." === t[1] ? "http://" + n : n
+                }
+                return {type: "link", raw: t[0], text: n, href: r, tokens: [{type: "text", raw: n, text: n}]}
+            }
+        }, u.inlineText = function (e, u, t) {
+            e = this.rules.inline.text.exec(e);
+            if (e) {
+                t = u ? this.options.sanitize ? this.options.sanitizer ? this.options.sanitizer(e[0]) : R(e[0]) : e[0] : R(this.options.smartypants ? t(e[0]) : e[0]);
+                return {type: "text", raw: e[0], text: t}
+            }
+        }, e
+    }(), y = w, _ = x, w = v, x = {
+        newline: /^(?: *(?:\n|$))+/,
+        code: /^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/,
+        fences: /^ {0,3}(`{3,}(?=[^`\n]*\n)|~{3,})([^\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?:\n+|$)|$)/,
+        hr: /^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,
+        heading: /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,
+        blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,
+        list: /^( {0,3})(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?! {0,3}bull )\n*|\s*$)/,
+        html: "^ {0,3}(?:<(script|pre|style)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|<![A-Z][\\s\\S]*?(?:>\\n*|$)|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>\\n*|$)|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:\\n{2,}|$)|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$)|</(?!script|pre|style)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$))",
+        def: /^ {0,3}\[(label)\]: *\n? *<?([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,
+        nptable: y,
+        table: y,
+        lheading: /^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/,
+        _paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html| +\n)[^\n]+)*)/,
+        text: /^[^\n]+/,
+        _label: /(?!\s*\])(?:\\[\[\]]|[^\[\]])+/,
+        _title: /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/
+    };
+    x.def = _(x.def).replace("label", x._label).replace("title", x._title).getRegex(), x.bullet = /(?:[*+-]|\d{1,9}[.)])/, x.item = /^( *)(bull) ?[^\n]*(?:\n(?! *bull ?)[^\n]*)*/, x.item = _(x.item, "gm").replace(/bull/g, x.bullet).getRegex(), x.listItemStart = _(/^( *)(bull) */).replace("bull", x.bullet).getRegex(), x.list = _(x.list).replace(/bull/g, x.bullet).replace("hr", "\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))").replace("def", "\\n+(?=" + x.def.source + ")").getRegex(), x._tag = "address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul", x._comment = /<!--(?!-?>)[\s\S]*?(?:-->|$)/, x.html = _(x.html, "i").replace("comment", x._comment).replace("tag", x._tag).replace("attribute", / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(), x.paragraph = _(x._paragraph).replace("hr", x.hr).replace("heading", " {0,3}#{1,6} ").replace("|lheading", "").replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", "</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|!--)").replace("tag", x._tag).getRegex(), x.blockquote = _(x.blockquote).replace("paragraph", x.paragraph).getRegex(), x.normal = w({}, x), x.gfm = w({}, x.normal, {
+        nptable: "^ *([^|\\n ].*\\|.*)\\n {0,3}([-:]+ *\\|[-| :]*)(?:\\n((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)",
+        table: "^ *\\|(.+)\\n {0,3}\\|?( *[-:]+[-| :]*)(?:\\n *((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)"
+    }), x.gfm.nptable = _(x.gfm.nptable).replace("hr", x.hr).replace("heading", " {0,3}#{1,6} ").replace("blockquote", " {0,3}>").replace("code", " {4}[^\\n]").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", "</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|!--)").replace("tag", x._tag).getRegex(), x.gfm.table = _(x.gfm.table).replace("hr", x.hr).replace("heading", " {0,3}#{1,6} ").replace("blockquote", " {0,3}>").replace("code", " {4}[^\\n]").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", "</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|!--)").replace("tag", x._tag).getRegex(), x.pedantic = w({}, x.normal, {
+        html: _("^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:\"[^\"]*\"|'[^']*'|\\s[^'\"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))").replace("comment", x._comment).replace(/tag/g, "(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),
+        def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,
+        heading: /^(#{1,6})(.*)(?:\n+|$)/,
+        fences: y,
+        paragraph: _(x.normal._paragraph).replace("hr", x.hr).replace("heading", " *#{1,6} *[^\n]").replace("lheading", x.lheading).replace("blockquote", " {0,3}>").replace("|fences", "").replace("|list", "").replace("|html", "").getRegex()
+    });
+    y = {
+        escape: /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,
+        autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/,
+        url: y,
+        tag: "^comment|^</[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>",
+        link: /^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/,
+        reflink: /^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,
+        nolink: /^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,
+        reflinkSearch: "reflink|nolink(?!\\()",
+        emStrong: {
+            lDelim: /^(?:\*+(?:([punct_])|[^\s*]))|^_+(?:([punct*])|([^\s_]))/,
+            rDelimAst: /\_\_[^_]*?\*[^_]*?\_\_|[punct_](\*+)(?=[\s]|$)|[^punct*_\s](\*+)(?=[punct_\s]|$)|[punct_\s](\*+)(?=[^punct*_\s])|[\s](\*+)(?=[punct_])|[punct_](\*+)(?=[punct_])|[^punct*_\s](\*+)(?=[^punct*_\s])/,
+            rDelimUnd: /\*\*[^*]*?\_[^*]*?\*\*|[punct*](\_+)(?=[\s]|$)|[^punct*_\s](\_+)(?=[punct*\s]|$)|[punct*\s](\_+)(?=[^punct*_\s])|[\s](\_+)(?=[punct*])|[punct*](\_+)(?=[punct*])/
+        },
+        code: /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,
+        br: /^( {2,}|\\)\n(?!\s*$)/,
+        del: y,
+        text: /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/,
+        punctuation: /^([\spunctuation])/,
+        _punctuation: "!\"#$%&'()+\\-.,/:;<=>?@\\[\\]`^{|}~"
+    };
+    y.punctuation = _(y.punctuation).replace(/punctuation/g, y._punctuation).getRegex(), y.blockSkip = /\[[^\]]*?\]\([^\)]*?\)|`[^`]*?`|<[^>]*?>/g, y.escapedEmSt = /\\\*|\\_/g, y._comment = _(x._comment).replace("(?:--\x3e|$)", "--\x3e").getRegex(), y.emStrong.lDelim = _(y.emStrong.lDelim).replace(/punct/g, y._punctuation).getRegex(), y.emStrong.rDelimAst = _(y.emStrong.rDelimAst, "g").replace(/punct/g, y._punctuation).getRegex(), y.emStrong.rDelimUnd = _(y.emStrong.rDelimUnd, "g").replace(/punct/g, y._punctuation).getRegex(), y._escapes = /\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g, y._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/, y._email = /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/, y.autolink = _(y.autolink).replace("scheme", y._scheme).replace("email", y._email).getRegex(), y._attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/, y.tag = _(y.tag).replace("comment", y._comment).replace("attribute", y._attribute).getRegex(), y._label = /(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/, y._href = /<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/, y._title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/, y.link = _(y.link).replace("label", y._label).replace("href", y._href).replace("title", y._title).getRegex(), y.reflink = _(y.reflink).replace("label", y._label).getRegex(), y.reflinkSearch = _(y.reflinkSearch, "g").replace("reflink", y.reflink).replace("nolink", y.nolink).getRegex(), y.normal = w({}, y), y.pedantic = w({}, y.normal, {
+        strong: {
+            start: /^__|\*\*/,
+            middle: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
+            endAst: /\*\*(?!\*)/g,
+            endUnd: /__(?!_)/g
+        },
+        em: {
+            start: /^_|\*/,
+            middle: /^()\*(?=\S)([\s\S]*?\S)\*(?!\*)|^_(?=\S)([\s\S]*?\S)_(?!_)/,
+            endAst: /\*(?!\*)/g,
+            endUnd: /_(?!_)/g
+        },
+        link: _(/^!?\[(label)\]\((.*?)\)/).replace("label", y._label).getRegex(),
+        reflink: _(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label", y._label).getRegex()
+    }), y.gfm = w({}, y.normal, {
+        escape: _(y.escape).replace("])", "~|])").getRegex(),
+        _extended_email: /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,
+        url: /^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,
+        _backpedal: /(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,
+        del: /^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/,
+        text: /^([`~]+|[^`~])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|https?:\/\/|ftp:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@))|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@))/
+    }), y.gfm.url = _(y.gfm.url, "i").replace("email", y.gfm._extended_email).getRegex(), y.breaks = w({}, y.gfm, {
+        br: _(y.br).replace("{2,}", "*").getRegex(),
+        text: _(y.gfm.text).replace("\\b_", "\\b_| {2,}\\n").replace(/\{2,\}/g, "*").getRegex()
+    });
+    var y = {block: x, inline: y}, j = u.defaults, U = y.block, P = y.inline, L = $;
+
+    function M(e) {
+        return e.replace(/---/g, "鈥�").replace(/--/g, "鈥�").replace(/(^|[-\u2014/(\[{"\s])'/g, "$1鈥�").replace(/'/g, "鈥�").replace(/(^|[-\u2014/(\[{\u2018\s])"/g, "$1鈥�").replace(/"/g, "鈥�").replace(/\.{3}/g, "鈥�")
+    }
+
+    function N(e) {
+        for (var u, t = "", n = e.length, r = 0; r < n; r++) u = e.charCodeAt(r), t += "&#" + (u = .5 < Math.random() ? "x" + u.toString(16) : u) + ";";
+        return t
+    }
+
+    var X = function () {
+        function t(e) {
+            this.tokens = [], this.tokens.links = Object.create(null), this.options = e || j, this.options.tokenizer = this.options.tokenizer || new O, this.tokenizer = this.options.tokenizer, this.tokenizer.options = this.options;
+            e = {block: U.normal, inline: P.normal};
+            this.options.pedantic ? (e.block = U.pedantic, e.inline = P.pedantic) : this.options.gfm && (e.block = U.gfm, this.options.breaks ? e.inline = P.breaks : e.inline = P.gfm), this.tokenizer.rules = e
+        }
+
+        t.lex = function (e, u) {
+            return new t(u).lex(e)
+        }, t.lexInline = function (e, u) {
+            return new t(u).inlineTokens(e)
+        };
+        var e, u, n = t.prototype;
+        return n.lex = function (e) {
+            return e = e.replace(/\r\n|\r/g, "\n").replace(/\t/g, "    "), this.blockTokens(e, this.tokens, !0), this.inline(this.tokens), this.tokens
+        }, n.blockTokens = function (e, u, t) {
+            var n, r, i, s;
+            for (void 0 === u && (u = []), void 0 === t && (t = !0), this.options.pedantic && (e = e.replace(/^ +$/gm, "")); e;) if (n = this.tokenizer.space(e)) e = e.substring(n.raw.length), n.type && u.push(n); else if (n = this.tokenizer.code(e)) e = e.substring(n.raw.length), (s = u[u.length - 1]) && "paragraph" === s.type ? (s.raw += "\n" + n.raw, s.text += "\n" + n.text) : u.push(n); else if (n = this.tokenizer.fences(e)) e = e.substring(n.raw.length), u.push(n); else if (n = this.tokenizer.heading(e)) e = e.substring(n.raw.length), u.push(n); else if (n = this.tokenizer.nptable(e)) e = e.substring(n.raw.length), u.push(n); else if (n = this.tokenizer.hr(e)) e = e.substring(n.raw.length), u.push(n); else if (n = this.tokenizer.blockquote(e)) e = e.substring(n.raw.length), n.tokens = this.blockTokens(n.text, [], t), u.push(n); else if (n = this.tokenizer.list(e)) {
+                for (e = e.substring(n.raw.length), i = n.items.length, r = 0; r < i; r++) n.items[r].tokens = this.blockTokens(n.items[r].text, [], !1);
+                u.push(n)
+            } else if (n = this.tokenizer.html(e)) e = e.substring(n.raw.length), u.push(n); else if (t && (n = this.tokenizer.def(e))) e = e.substring(n.raw.length), this.tokens.links[n.tag] || (this.tokens.links[n.tag] = {
+                href: n.href,
+                title: n.title
+            }); else if (n = this.tokenizer.table(e)) e = e.substring(n.raw.length), u.push(n); else if (n = this.tokenizer.lheading(e)) e = e.substring(n.raw.length), u.push(n); else if (t && (n = this.tokenizer.paragraph(e))) e = e.substring(n.raw.length), u.push(n); else if (n = this.tokenizer.text(e)) e = e.substring(n.raw.length), (s = u[u.length - 1]) && "text" === s.type ? (s.raw += "\n" + n.raw, s.text += "\n" + n.text) : u.push(n); else if (e) {
+                var l = "Infinite loop on byte: " + e.charCodeAt(0);
+                if (this.options.silent) {
+                    console.error(l);
+                    break
+                }
+                throw new Error(l)
+            }
+            return u
+        }, n.inline = function (e) {
+            for (var u, t, n, r, i, s = e.length, l = 0; l < s; l++) switch ((i = e[l]).type) {
+                case"paragraph":
+                case"text":
+                case"heading":
+                    i.tokens = [], this.inlineTokens(i.text, i.tokens);
+                    break;
+                case"table":
+                    for (i.tokens = {
+                        header: [],
+                        cells: []
+                    }, n = i.header.length, u = 0; u < n; u++) i.tokens.header[u] = [], this.inlineTokens(i.header[u], i.tokens.header[u]);
+                    for (n = i.cells.length, u = 0; u < n; u++) for (r = i.cells[u], i.tokens.cells[u] = [], t = 0; t < r.length; t++) i.tokens.cells[u][t] = [], this.inlineTokens(r[t], i.tokens.cells[u][t]);
+                    break;
+                case"blockquote":
+                    this.inline(i.tokens);
+                    break;
+                case"list":
+                    for (n = i.items.length, u = 0; u < n; u++) this.inline(i.items[u].tokens)
+            }
+            return e
+        }, n.inlineTokens = function (e, u, t, n) {
+            var r;
+            void 0 === u && (u = []), void 0 === t && (t = !1), void 0 === n && (n = !1);
+            var i, s, l, a = e;
+            if (this.tokens.links) {
+                var D = Object.keys(this.tokens.links);
+                if (0 < D.length) for (; null != (i = this.tokenizer.rules.inline.reflinkSearch.exec(a));) D.includes(i[0].slice(i[0].lastIndexOf("[") + 1, -1)) && (a = a.slice(0, i.index) + "[" + L("a", i[0].length - 2) + "]" + a.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))
+            }
+            for (; null != (i = this.tokenizer.rules.inline.blockSkip.exec(a));) a = a.slice(0, i.index) + "[" + L("a", i[0].length - 2) + "]" + a.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);
+            for (; null != (i = this.tokenizer.rules.inline.escapedEmSt.exec(a));) a = a.slice(0, i.index) + "++" + a.slice(this.tokenizer.rules.inline.escapedEmSt.lastIndex);
+            for (; e;) if (s || (l = ""), s = !1, r = this.tokenizer.escape(e)) e = e.substring(r.raw.length), u.push(r); else if (r = this.tokenizer.tag(e, t, n)) {
+                e = e.substring(r.raw.length), t = r.inLink, n = r.inRawBlock;
+                var o = u[u.length - 1];
+                o && "text" === r.type && "text" === o.type ? (o.raw += r.raw, o.text += r.text) : u.push(r)
+            } else if (r = this.tokenizer.link(e)) e = e.substring(r.raw.length), "link" === r.type && (r.tokens = this.inlineTokens(r.text, [], !0, n)), u.push(r); else if (r = this.tokenizer.reflink(e, this.tokens.links)) {
+                e = e.substring(r.raw.length);
+                o = u[u.length - 1];
+                "link" === r.type ? (r.tokens = this.inlineTokens(r.text, [], !0, n), u.push(r)) : o && "text" === r.type && "text" === o.type ? (o.raw += r.raw, o.text += r.text) : u.push(r)
+            } else if (r = this.tokenizer.emStrong(e, a, l)) e = e.substring(r.raw.length), r.tokens = this.inlineTokens(r.text, [], t, n), u.push(r); else if (r = this.tokenizer.codespan(e)) e = e.substring(r.raw.length), u.push(r); else if (r = this.tokenizer.br(e)) e = e.substring(r.raw.length), u.push(r); else if (r = this.tokenizer.del(e)) e = e.substring(r.raw.length), r.tokens = this.inlineTokens(r.text, [], t, n), u.push(r); else if (r = this.tokenizer.autolink(e, N)) e = e.substring(r.raw.length), u.push(r); else if (t || !(r = this.tokenizer.url(e, N))) {
+                if (r = this.tokenizer.inlineText(e, n, M)) e = e.substring(r.raw.length), "_" !== r.raw.slice(-1) && (l = r.raw.slice(-1)), s = !0, (c = u[u.length - 1]) && "text" === c.type ? (c.raw += r.raw, c.text += r.text) : u.push(r); else if (e) {
+                    var c = "Infinite loop on byte: " + e.charCodeAt(0);
+                    if (this.options.silent) {
+                        console.error(c);
+                        break
+                    }
+                    throw new Error(c)
+                }
+            } else e = e.substring(r.raw.length), u.push(r);
+            return u
+        }, e = t, u = [{
+            key: "rules", get: function () {
+                return {block: U, inline: P}
+            }
+        }], (n = null) && r(e.prototype, n), u && r(e, u), t
+    }(), G = u.defaults, V = B, H = m, J = function () {
+        function e(e) {
+            this.options = e || G
+        }
+
+        var u = e.prototype;
+        return u.code = function (e, u, t) {
+            var n = (u || "").match(/\S*/)[0];
+            return !this.options.highlight || null != (u = this.options.highlight(e, n)) && u !== e && (t = !0, e = u), e = e.replace(/\n$/, "") + "\n", n ? '<pre><code class="' + this.options.langPrefix + H(n, !0) + '">' + (t ? e : H(e, !0)) + "</code></pre>\n" : "<pre><code>" + (t ? e : H(e, !0)) + "</code></pre>\n"
+        }, u.blockquote = function (e) {
+            return "<blockquote>\n" + e + "</blockquote>\n"
+        }, u.html = function (e) {
+            return e
+        }, u.heading = function (e, u, t, n) {
+            return this.options.headerIds ? "<h" + u + ' id="' + this.options.headerPrefix + n.slug(t) + '">' + e + "</h" + u + ">\n" : "<h" + u + ">" + e + "</h" + u + ">\n"
+        }, u.hr = function () {
+            return this.options.xhtml ? "<hr/>\n" : "<hr>\n"
+        }, u.list = function (e, u, t) {
+            var n = u ? "ol" : "ul";
+            return "<" + n + (u && 1 !== t ? ' start="' + t + '"' : "") + ">\n" + e + "</" + n + ">\n"
+        }, u.listitem = function (e) {
+            return "<li>" + e + "</li>\n"
+        }, u.checkbox = function (e) {
+            return "<input " + (e ? 'checked="" ' : "") + 'disabled="" type="checkbox"' + (this.options.xhtml ? " /" : "") + "> "
+        }, u.paragraph = function (e) {
+            return "<p>" + e + "</p>\n"
+        }, u.table = function (e, u) {
+            return "<table>\n<thead>\n" + e + "</thead>\n" + (u = u && "<tbody>" + u + "</tbody>") + "</table>\n"
+        }, u.tablerow = function (e) {
+            return "<tr>\n" + e + "</tr>\n"
+        }, u.tablecell = function (e, u) {
+            var t = u.header ? "th" : "td";
+            return (u.align ? "<" + t + ' align="' + u.align + '">' : "<" + t + ">") + e + "</" + t + ">\n"
+        }, u.strong = function (e) {
+            return "<strong>" + e + "</strong>"
+        }, u.em = function (e) {
+            return "<em>" + e + "</em>"
+        }, u.codespan = function (e) {
+            return "<code>" + e + "</code>"
+        }, u.br = function () {
+            return this.options.xhtml ? "<br/>" : "<br>"
+        }, u.del = function (e) {
+            return "<del>" + e + "</del>"
+        }, u.link = function (e, u, t) {
+            if (null === (e = V(this.options.sanitize, this.options.baseUrl, e))) return t;
+            e = '<a href="' + H(e) + '"';
+            return u && (e += ' title="' + u + '"'), e += ">" + t + "</a>"
+        }, u.image = function (e, u, t) {
+            if (null === (e = V(this.options.sanitize, this.options.baseUrl, e))) return t;
+            t = '<img src="' + e + '" alt="' + t + '"';
+            return u && (t += ' title="' + u + '"'), t += this.options.xhtml ? "/>" : ">"
+        }, u.text = function (e) {
+            return e
+        }, e
+    }(), K = function () {
+        function e() {
+        }
+
+        var u = e.prototype;
+        return u.strong = function (e) {
+            return e
+        }, u.em = function (e) {
+            return e
+        }, u.codespan = function (e) {
+            return e
+        }, u.del = function (e) {
+            return e
+        }, u.html = function (e) {
+            return e
+        }, u.text = function (e) {
+            return e
+        }, u.link = function (e, u, t) {
+            return "" + t
+        }, u.image = function (e, u, t) {
+            return "" + t
+        }, u.br = function () {
+            return ""
+        }, e
+    }(), Q = function () {
+        function e() {
+            this.seen = {}
+        }
+
+        var u = e.prototype;
+        return u.serialize = function (e) {
+            return e.toLowerCase().trim().replace(/<[!\/a-z].*?>/gi, "").replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g, "").replace(/\s/g, "-")
+        }, u.getNextSafeSlug = function (e, u) {
+            var t = e, n = 0;
+            if (this.seen.hasOwnProperty(t)) for (n = this.seen[e]; t = e + "-" + ++n, this.seen.hasOwnProperty(t);) ;
+            return u || (this.seen[e] = n, this.seen[t] = 0), t
+        }, u.slug = function (e, u) {
+            void 0 === u && (u = {});
+            var t = this.serialize(e);
+            return this.getNextSafeSlug(t, u.dryrun)
+        }, e
+    }(), W = u.defaults, Y = b, ee = function () {
+        function t(e) {
+            this.options = e || W, this.options.renderer = this.options.renderer || new J, this.renderer = this.options.renderer, this.renderer.options = this.options, this.textRenderer = new K, this.slugger = new Q
+        }
+
+        t.parse = function (e, u) {
+            return new t(u).parse(e)
+        }, t.parseInline = function (e, u) {
+            return new t(u).parseInline(e)
+        };
+        var e = t.prototype;
+        return e.parse = function (e, u) {
+            void 0 === u && (u = !0);
+            for (var t, n, r, i, s, l, a, D, o, c, h, p, g, f, F, A = "", C = e.length, d = 0; d < C; d++) switch ((D = e[d]).type) {
+                case"space":
+                    continue;
+                case"hr":
+                    A += this.renderer.hr();
+                    continue;
+                case"heading":
+                    A += this.renderer.heading(this.parseInline(D.tokens), D.depth, Y(this.parseInline(D.tokens, this.textRenderer)), this.slugger);
+                    continue;
+                case"code":
+                    A += this.renderer.code(D.text, D.lang, D.escaped);
+                    continue;
+                case"table":
+                    for (l = o = "", r = D.header.length, t = 0; t < r; t++) l += this.renderer.tablecell(this.parseInline(D.tokens.header[t]), {
+                        header: !0,
+                        align: D.align[t]
+                    });
+                    for (o += this.renderer.tablerow(l), a = "", r = D.cells.length, t = 0; t < r; t++) {
+                        for (l = "", i = (s = D.tokens.cells[t]).length, n = 0; n < i; n++) l += this.renderer.tablecell(this.parseInline(s[n]), {
+                            header: !1,
+                            align: D.align[n]
+                        });
+                        a += this.renderer.tablerow(l)
+                    }
+                    A += this.renderer.table(o, a);
+                    continue;
+                case"blockquote":
+                    a = this.parse(D.tokens), A += this.renderer.blockquote(a);
+                    continue;
+                case"list":
+                    for (o = D.ordered, E = D.start, c = D.loose, r = D.items.length, a = "", t = 0; t < r; t++) g = (p = D.items[t]).checked, f = p.task, h = "", p.task && (F = this.renderer.checkbox(g), c ? 0 < p.tokens.length && "text" === p.tokens[0].type ? (p.tokens[0].text = F + " " + p.tokens[0].text, p.tokens[0].tokens && 0 < p.tokens[0].tokens.length && "text" === p.tokens[0].tokens[0].type && (p.tokens[0].tokens[0].text = F + " " + p.tokens[0].tokens[0].text)) : p.tokens.unshift({
+                        type: "text",
+                        text: F
+                    }) : h += F), h += this.parse(p.tokens, c), a += this.renderer.listitem(h, f, g);
+                    A += this.renderer.list(a, o, E);
+                    continue;
+                case"html":
+                    A += this.renderer.html(D.text);
+                    continue;
+                case"paragraph":
+                    A += this.renderer.paragraph(this.parseInline(D.tokens));
+                    continue;
+                case"text":
+                    for (a = D.tokens ? this.parseInline(D.tokens) : D.text; d + 1 < C && "text" === e[d + 1].type;) a += "\n" + ((D = e[++d]).tokens ? this.parseInline(D.tokens) : D.text);
+                    A += u ? this.renderer.paragraph(a) : a;
+                    continue;
+                default:
+                    var E = 'Token with "' + D.type + '" type was not found.';
+                    if (this.options.silent) return void console.error(E);
+                    throw new Error(E)
+            }
+            return A
+        }, e.parseInline = function (e, u) {
+            u = u || this.renderer;
+            for (var t, n = "", r = e.length, i = 0; i < r; i++) switch ((t = e[i]).type) {
+                case"escape":
+                    n += u.text(t.text);
+                    break;
+                case"html":
+                    n += u.html(t.text);
+                    break;
+                case"link":
+                    n += u.link(t.href, t.title, this.parseInline(t.tokens, u));
+                    break;
+                case"image":
+                    n += u.image(t.href, t.title, t.text);
+                    break;
+                case"strong":
+                    n += u.strong(this.parseInline(t.tokens, u));
+                    break;
+                case"em":
+                    n += u.em(this.parseInline(t.tokens, u));
+                    break;
+                case"codespan":
+                    n += u.codespan(t.text);
+                    break;
+                case"br":
+                    n += u.br();
+                    break;
+                case"del":
+                    n += u.del(this.parseInline(t.tokens, u));
+                    break;
+                case"text":
+                    n += u.text(t.text);
+                    break;
+                default:
+                    var s = 'Token with "' + t.type + '" type was not found.';
+                    if (this.options.silent) return void console.error(s);
+                    throw new Error(s)
+            }
+            return n
+        }, t
+    }(), ue = v, te = z, ne = m, m = u.getDefaults, re = u.changeDefaults, u = u.defaults;
+
+    function ie(e, t, n) {
+        if (null == e) throw new Error("marked(): input parameter is undefined or null");
+        if ("string" != typeof e) throw new Error("marked(): input parameter is of type " + Object.prototype.toString.call(e) + ", string expected");
+        if ("function" == typeof t && (n = t, t = null), t = ue({}, ie.defaults, t || {}), te(t), n) {
+            var r, i = t.highlight;
+            try {
+                r = X.lex(e, t)
+            } catch (e) {
+                return n(e)
+            }
+            var s = function (u) {
+                var e;
+                if (!u) try {
+                    e = ee.parse(r, t)
+                } catch (e) {
+                    u = e
+                }
+                return t.highlight = i, u ? n(u) : n(null, e)
+            };
+            if (!i || i.length < 3) return s();
+            if (delete t.highlight, !r.length) return s();
+            var l = 0;
+            return ie.walkTokens(r, function (t) {
+                "code" === t.type && (l++, setTimeout(function () {
+                    i(t.text, t.lang, function (e, u) {
+                        return e ? s(e) : (null != u && u !== t.text && (t.text = u, t.escaped = !0), void (0 === --l && s()))
+                    })
+                }, 0))
+            }), void (0 === l && s())
+        }
+        try {
+            var u = X.lex(e, t);
+            return t.walkTokens && ie.walkTokens(u, t.walkTokens), ee.parse(u, t)
+        } catch (e) {
+            if (e.message += "\nPlease report this to https://github.com/markedjs/marked.", t.silent) return "<p>An error occurred:</p><pre>" + ne(e.message + "", !0) + "</pre>";
+            throw e
+        }
+    }
+
+    return ie.options = ie.setOptions = function (e) {
+        return ue(ie.defaults, e), re(ie.defaults), ie
+    }, ie.getDefaults = m, ie.defaults = u, ie.use = function (l) {
+        var u, t = ue({}, l);
+        l.renderer && function () {
+            var e, s = ie.defaults.renderer || new J;
+            for (e in l.renderer) !function (r) {
+                var i = s[r];
+                s[r] = function () {
+                    for (var e = arguments.length, u = new Array(e), t = 0; t < e; t++) u[t] = arguments[t];
+                    var n = l.renderer[r].apply(s, u);
+                    return n = !1 === n ? i.apply(s, u) : n
+                }
+            }(e);
+            t.renderer = s
+        }(), l.tokenizer && function () {
+            var e, s = ie.defaults.tokenizer || new O;
+            for (e in l.tokenizer) !function (r) {
+                var i = s[r];
+                s[r] = function () {
+                    for (var e = arguments.length, u = new Array(e), t = 0; t < e; t++) u[t] = arguments[t];
+                    var n = l.tokenizer[r].apply(s, u);
+                    return n = !1 === n ? i.apply(s, u) : n
+                }
+            }(e);
+            t.tokenizer = s
+        }(), l.walkTokens && (u = ie.defaults.walkTokens, t.walkTokens = function (e) {
+            l.walkTokens(e), u && u(e)
+        }), ie.setOptions(t)
+    }, ie.walkTokens = function (e, u) {
+        for (var t, n = c(e); !(t = n()).done;) {
+            var r = t.value;
+            switch (u(r), r.type) {
+                case"table":
+                    for (var i = c(r.tokens.header); !(s = i()).done;) {
+                        var s = s.value;
+                        ie.walkTokens(s, u)
+                    }
+                    for (var l, a = c(r.tokens.cells); !(l = a()).done;) for (var D = c(l.value); !(o = D()).done;) {
+                        var o = o.value;
+                        ie.walkTokens(o, u)
+                    }
+                    break;
+                case"list":
+                    ie.walkTokens(r.items, u);
+                    break;
+                default:
+                    r.tokens && ie.walkTokens(r.tokens, u)
+            }
+        }
+    }, ie.parseInline = function (e, u) {
+        if (null == e) throw new Error("marked.parseInline(): input parameter is undefined or null");
+        if ("string" != typeof e) throw new Error("marked.parseInline(): input parameter is of type " + Object.prototype.toString.call(e) + ", string expected");
+        u = ue({}, ie.defaults, u || {}), te(u);
+        try {
+            var t = X.lexInline(e, u);
+            return u.walkTokens && ie.walkTokens(t, u.walkTokens), ee.parseInline(t, u)
+        } catch (e) {
+            if (e.message += "\nPlease report this to https://github.com/markedjs/marked.", u.silent) return "<p>An error occurred:</p><pre>" + ne(e.message + "", !0) + "</pre>";
+            throw e
+        }
+    }, ie.Parser = ee, ie.parser = ee.parse, ie.Renderer = J, ie.TextRenderer = K, ie.Lexer = X, ie.lexer = X.lex, ie.Tokenizer = O, ie.Slugger = Q, ie.parse = ie
+});
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/markdown/marked2.1.3.js b/Source/platformProject/platform2022UI/jslib/markdown/marked2.1.3.js
new file mode 100644
index 0000000..10fe5d2
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/markdown/marked2.1.3.js
@@ -0,0 +1,2986 @@
+/**
+ * marked - a markdown parser
+ * Copyright (c) 2011-2021, Christopher Jeffrey. (MIT Licensed)
+ * https://github.com/markedjs/marked
+ */
+
+/**
+ * DO NOT EDIT THIS FILE
+ * The code in this file is generated from files in ./src/
+ */
+
+(function (global, factory) {
+  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+  typeof define === 'function' && define.amd ? define(factory) :
+  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.marked = factory());
+}(this, (function () { 'use strict';
+
+  function _defineProperties(target, props) {
+    for (var i = 0; i < props.length; i++) {
+      var descriptor = props[i];
+      descriptor.enumerable = descriptor.enumerable || false;
+      descriptor.configurable = true;
+      if ("value" in descriptor) descriptor.writable = true;
+      Object.defineProperty(target, descriptor.key, descriptor);
+    }
+  }
+
+  function _createClass(Constructor, protoProps, staticProps) {
+    if (protoProps) _defineProperties(Constructor.prototype, protoProps);
+    if (staticProps) _defineProperties(Constructor, staticProps);
+    return Constructor;
+  }
+
+  function _unsupportedIterableToArray(o, minLen) {
+    if (!o) return;
+    if (typeof o === "string") return _arrayLikeToArray(o, minLen);
+    var n = Object.prototype.toString.call(o).slice(8, -1);
+    if (n === "Object" && o.constructor) n = o.constructor.name;
+    if (n === "Map" || n === "Set") return Array.from(o);
+    if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
+  }
+
+  function _arrayLikeToArray(arr, len) {
+    if (len == null || len > arr.length) len = arr.length;
+
+    for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
+
+    return arr2;
+  }
+
+  function _createForOfIteratorHelperLoose(o, allowArrayLike) {
+    var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"];
+    if (it) return (it = it.call(o)).next.bind(it);
+
+    if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
+      if (it) o = it;
+      var i = 0;
+      return function () {
+        if (i >= o.length) return {
+          done: true
+        };
+        return {
+          done: false,
+          value: o[i++]
+        };
+      };
+    }
+
+    throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
+  }
+
+  var defaults$5 = {exports: {}};
+
+  function getDefaults$1() {
+    return {
+      baseUrl: null,
+      breaks: false,
+      extensions: null,
+      gfm: true,
+      headerIds: true,
+      headerPrefix: '',
+      highlight: null,
+      langPrefix: 'language-',
+      mangle: true,
+      pedantic: false,
+      renderer: null,
+      sanitize: false,
+      sanitizer: null,
+      silent: false,
+      smartLists: false,
+      smartypants: false,
+      tokenizer: null,
+      walkTokens: null,
+      xhtml: false
+    };
+  }
+
+  function changeDefaults$1(newDefaults) {
+    defaults$5.exports.defaults = newDefaults;
+  }
+
+  defaults$5.exports = {
+    defaults: getDefaults$1(),
+    getDefaults: getDefaults$1,
+    changeDefaults: changeDefaults$1
+  };
+
+  /**
+   * Helpers
+   */
+  var escapeTest = /[&<>"']/;
+  var escapeReplace = /[&<>"']/g;
+  var escapeTestNoEncode = /[<>"']|&(?!#?\w+;)/;
+  var escapeReplaceNoEncode = /[<>"']|&(?!#?\w+;)/g;
+  var escapeReplacements = {
+    '&': '&amp;',
+    '<': '&lt;',
+    '>': '&gt;',
+    '"': '&quot;',
+    "'": '&#39;'
+  };
+
+  var getEscapeReplacement = function getEscapeReplacement(ch) {
+    return escapeReplacements[ch];
+  };
+
+  function escape$2(html, encode) {
+    if (encode) {
+      if (escapeTest.test(html)) {
+        return html.replace(escapeReplace, getEscapeReplacement);
+      }
+    } else {
+      if (escapeTestNoEncode.test(html)) {
+        return html.replace(escapeReplaceNoEncode, getEscapeReplacement);
+      }
+    }
+
+    return html;
+  }
+
+  var unescapeTest = /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig;
+
+  function unescape$1(html) {
+    // explicitly match decimal, hex, and named HTML entities
+    return html.replace(unescapeTest, function (_, n) {
+      n = n.toLowerCase();
+      if (n === 'colon') return ':';
+
+      if (n.charAt(0) === '#') {
+        return n.charAt(1) === 'x' ? String.fromCharCode(parseInt(n.substring(2), 16)) : String.fromCharCode(+n.substring(1));
+      }
+
+      return '';
+    });
+  }
+
+  var caret = /(^|[^\[])\^/g;
+
+  function edit$1(regex, opt) {
+    regex = regex.source || regex;
+    opt = opt || '';
+    var obj = {
+      replace: function replace(name, val) {
+        val = val.source || val;
+        val = val.replace(caret, '$1');
+        regex = regex.replace(name, val);
+        return obj;
+      },
+      getRegex: function getRegex() {
+        return new RegExp(regex, opt);
+      }
+    };
+    return obj;
+  }
+
+  var nonWordAndColonTest = /[^\w:]/g;
+  var originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;
+
+  function cleanUrl$1(sanitize, base, href) {
+    if (sanitize) {
+      var prot;
+
+      try {
+        prot = decodeURIComponent(unescape$1(href)).replace(nonWordAndColonTest, '').toLowerCase();
+      } catch (e) {
+        return null;
+      }
+
+      if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) {
+        return null;
+      }
+    }
+
+    if (base && !originIndependentUrl.test(href)) {
+      href = resolveUrl(base, href);
+    }
+
+    try {
+      href = encodeURI(href).replace(/%25/g, '%');
+    } catch (e) {
+      return null;
+    }
+
+    return href;
+  }
+
+  var baseUrls = {};
+  var justDomain = /^[^:]+:\/*[^/]*$/;
+  var protocol = /^([^:]+:)[\s\S]*$/;
+  var domain = /^([^:]+:\/*[^/]*)[\s\S]*$/;
+
+  function resolveUrl(base, href) {
+    if (!baseUrls[' ' + base]) {
+      // we can ignore everything in base after the last slash of its path component,
+      // but we might need to add _that_
+      // https://tools.ietf.org/html/rfc3986#section-3
+      if (justDomain.test(base)) {
+        baseUrls[' ' + base] = base + '/';
+      } else {
+        baseUrls[' ' + base] = rtrim$1(base, '/', true);
+      }
+    }
+
+    base = baseUrls[' ' + base];
+    var relativeBase = base.indexOf(':') === -1;
+
+    if (href.substring(0, 2) === '//') {
+      if (relativeBase) {
+        return href;
+      }
+
+      return base.replace(protocol, '$1') + href;
+    } else if (href.charAt(0) === '/') {
+      if (relativeBase) {
+        return href;
+      }
+
+      return base.replace(domain, '$1') + href;
+    } else {
+      return base + href;
+    }
+  }
+
+  var noopTest$1 = {
+    exec: function noopTest() {}
+  };
+
+  function merge$2(obj) {
+    var i = 1,
+        target,
+        key;
+
+    for (; i < arguments.length; i++) {
+      target = arguments[i];
+
+      for (key in target) {
+        if (Object.prototype.hasOwnProperty.call(target, key)) {
+          obj[key] = target[key];
+        }
+      }
+    }
+
+    return obj;
+  }
+
+  function splitCells$1(tableRow, count) {
+    // ensure that every cell-delimiting pipe has a space
+    // before it to distinguish it from an escaped pipe
+    var row = tableRow.replace(/\|/g, function (match, offset, str) {
+      var escaped = false,
+          curr = offset;
+
+      while (--curr >= 0 && str[curr] === '\\') {
+        escaped = !escaped;
+      }
+
+      if (escaped) {
+        // odd number of slashes means | is escaped
+        // so we leave it alone
+        return '|';
+      } else {
+        // add space before unescaped |
+        return ' |';
+      }
+    }),
+        cells = row.split(/ \|/);
+    var i = 0;
+
+    if (cells.length > count) {
+      cells.splice(count);
+    } else {
+      while (cells.length < count) {
+        cells.push('');
+      }
+    }
+
+    for (; i < cells.length; i++) {
+      // leading or trailing whitespace is ignored per the gfm spec
+      cells[i] = cells[i].trim().replace(/\\\|/g, '|');
+    }
+
+    return cells;
+  } // Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').
+  // /c*$/ is vulnerable to REDOS.
+  // invert: Remove suffix of non-c chars instead. Default falsey.
+
+
+  function rtrim$1(str, c, invert) {
+    var l = str.length;
+
+    if (l === 0) {
+      return '';
+    } // Length of suffix matching the invert condition.
+
+
+    var suffLen = 0; // Step left until we fail to match the invert condition.
+
+    while (suffLen < l) {
+      var currChar = str.charAt(l - suffLen - 1);
+
+      if (currChar === c && !invert) {
+        suffLen++;
+      } else if (currChar !== c && invert) {
+        suffLen++;
+      } else {
+        break;
+      }
+    }
+
+    return str.substr(0, l - suffLen);
+  }
+
+  function findClosingBracket$1(str, b) {
+    if (str.indexOf(b[1]) === -1) {
+      return -1;
+    }
+
+    var l = str.length;
+    var level = 0,
+        i = 0;
+
+    for (; i < l; i++) {
+      if (str[i] === '\\') {
+        i++;
+      } else if (str[i] === b[0]) {
+        level++;
+      } else if (str[i] === b[1]) {
+        level--;
+
+        if (level < 0) {
+          return i;
+        }
+      }
+    }
+
+    return -1;
+  }
+
+  function checkSanitizeDeprecation$1(opt) {
+    if (opt && opt.sanitize && !opt.silent) {
+      console.warn('marked(): sanitize and sanitizer parameters are deprecated since version 0.7.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/#/USING_ADVANCED.md#options');
+    }
+  } // copied from https://stackoverflow.com/a/5450113/806777
+
+
+  function repeatString$1(pattern, count) {
+    if (count < 1) {
+      return '';
+    }
+
+    var result = '';
+
+    while (count > 1) {
+      if (count & 1) {
+        result += pattern;
+      }
+
+      count >>= 1;
+      pattern += pattern;
+    }
+
+    return result + pattern;
+  }
+
+  var helpers = {
+    escape: escape$2,
+    unescape: unescape$1,
+    edit: edit$1,
+    cleanUrl: cleanUrl$1,
+    resolveUrl: resolveUrl,
+    noopTest: noopTest$1,
+    merge: merge$2,
+    splitCells: splitCells$1,
+    rtrim: rtrim$1,
+    findClosingBracket: findClosingBracket$1,
+    checkSanitizeDeprecation: checkSanitizeDeprecation$1,
+    repeatString: repeatString$1
+  };
+
+  var defaults$4 = defaults$5.exports.defaults;
+  var rtrim = helpers.rtrim,
+      splitCells = helpers.splitCells,
+      _escape = helpers.escape,
+      findClosingBracket = helpers.findClosingBracket;
+
+  function outputLink(cap, link, raw) {
+    var href = link.href;
+    var title = link.title ? _escape(link.title) : null;
+    var text = cap[1].replace(/\\([\[\]])/g, '$1');
+
+    if (cap[0].charAt(0) !== '!') {
+      return {
+        type: 'link',
+        raw: raw,
+        href: href,
+        title: title,
+        text: text
+      };
+    } else {
+      return {
+        type: 'image',
+        raw: raw,
+        href: href,
+        title: title,
+        text: _escape(text)
+      };
+    }
+  }
+
+  function indentCodeCompensation(raw, text) {
+    var matchIndentToCode = raw.match(/^(\s+)(?:```)/);
+
+    if (matchIndentToCode === null) {
+      return text;
+    }
+
+    var indentToCode = matchIndentToCode[1];
+    return text.split('\n').map(function (node) {
+      var matchIndentInNode = node.match(/^\s+/);
+
+      if (matchIndentInNode === null) {
+        return node;
+      }
+
+      var indentInNode = matchIndentInNode[0];
+
+      if (indentInNode.length >= indentToCode.length) {
+        return node.slice(indentToCode.length);
+      }
+
+      return node;
+    }).join('\n');
+  }
+  /**
+   * Tokenizer
+   */
+
+
+  var Tokenizer_1 = /*#__PURE__*/function () {
+    function Tokenizer(options) {
+      this.options = options || defaults$4;
+    }
+
+    var _proto = Tokenizer.prototype;
+
+    _proto.space = function space(src) {
+      var cap = this.rules.block.newline.exec(src);
+
+      if (cap) {
+        if (cap[0].length > 1) {
+          return {
+            type: 'space',
+            raw: cap[0]
+          };
+        }
+
+        return {
+          raw: '\n'
+        };
+      }
+    };
+
+    _proto.code = function code(src) {
+      var cap = this.rules.block.code.exec(src);
+
+      if (cap) {
+        var text = cap[0].replace(/^ {1,4}/gm, '');
+        return {
+          type: 'code',
+          raw: cap[0],
+          codeBlockStyle: 'indented',
+          text: !this.options.pedantic ? rtrim(text, '\n') : text
+        };
+      }
+    };
+
+    _proto.fences = function fences(src) {
+      var cap = this.rules.block.fences.exec(src);
+
+      if (cap) {
+        var raw = cap[0];
+        var text = indentCodeCompensation(raw, cap[3] || '');
+        return {
+          type: 'code',
+          raw: raw,
+          lang: cap[2] ? cap[2].trim() : cap[2],
+          text: text
+        };
+      }
+    };
+
+    _proto.heading = function heading(src) {
+      var cap = this.rules.block.heading.exec(src);
+
+      if (cap) {
+        var text = cap[2].trim(); // remove trailing #s
+
+        if (/#$/.test(text)) {
+          var trimmed = rtrim(text, '#');
+
+          if (this.options.pedantic) {
+            text = trimmed.trim();
+          } else if (!trimmed || / $/.test(trimmed)) {
+            // CommonMark requires space before trailing #s
+            text = trimmed.trim();
+          }
+        }
+
+        return {
+          type: 'heading',
+          raw: cap[0],
+          depth: cap[1].length,
+          text: text
+        };
+      }
+    };
+
+    _proto.nptable = function nptable(src) {
+      var cap = this.rules.block.nptable.exec(src);
+
+      if (cap) {
+        var item = {
+          type: 'table',
+          header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
+          align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
+          cells: cap[3] ? cap[3].replace(/\n$/, '').split('\n') : [],
+          raw: cap[0]
+        };
+
+        if (item.header.length === item.align.length) {
+          var l = item.align.length;
+          var i;
+
+          for (i = 0; i < l; i++) {
+            if (/^ *-+: *$/.test(item.align[i])) {
+              item.align[i] = 'right';
+            } else if (/^ *:-+: *$/.test(item.align[i])) {
+              item.align[i] = 'center';
+            } else if (/^ *:-+ *$/.test(item.align[i])) {
+              item.align[i] = 'left';
+            } else {
+              item.align[i] = null;
+            }
+          }
+
+          l = item.cells.length;
+
+          for (i = 0; i < l; i++) {
+            item.cells[i] = splitCells(item.cells[i], item.header.length);
+          }
+
+          return item;
+        }
+      }
+    };
+
+    _proto.hr = function hr(src) {
+      var cap = this.rules.block.hr.exec(src);
+
+      if (cap) {
+        return {
+          type: 'hr',
+          raw: cap[0]
+        };
+      }
+    };
+
+    _proto.blockquote = function blockquote(src) {
+      var cap = this.rules.block.blockquote.exec(src);
+
+      if (cap) {
+        var text = cap[0].replace(/^ *> ?/gm, '');
+        return {
+          type: 'blockquote',
+          raw: cap[0],
+          text: text
+        };
+      }
+    };
+
+    _proto.list = function list(src) {
+      var cap = this.rules.block.list.exec(src);
+
+      if (cap) {
+        var raw = cap[0];
+        var bull = cap[2];
+        var isordered = bull.length > 1;
+        var list = {
+          type: 'list',
+          raw: raw,
+          ordered: isordered,
+          start: isordered ? +bull.slice(0, -1) : '',
+          loose: false,
+          items: []
+        }; // Get each top-level item.
+
+        var itemMatch = cap[0].match(this.rules.block.item);
+        var next = false,
+            item,
+            space,
+            bcurr,
+            bnext,
+            addBack,
+            loose,
+            istask,
+            ischecked,
+            endMatch;
+        var l = itemMatch.length;
+        bcurr = this.rules.block.listItemStart.exec(itemMatch[0]);
+
+        for (var i = 0; i < l; i++) {
+          item = itemMatch[i];
+          raw = item;
+
+          if (!this.options.pedantic) {
+            // Determine if current item contains the end of the list
+            endMatch = item.match(new RegExp('\\n\\s*\\n {0,' + (bcurr[0].length - 1) + '}\\S'));
+
+            if (endMatch) {
+              addBack = item.length - endMatch.index + itemMatch.slice(i + 1).join('\n').length;
+              list.raw = list.raw.substring(0, list.raw.length - addBack);
+              item = item.substring(0, endMatch.index);
+              raw = item;
+              l = i + 1;
+            }
+          } // Determine whether the next list item belongs here.
+          // Backpedal if it does not belong in this list.
+
+
+          if (i !== l - 1) {
+            bnext = this.rules.block.listItemStart.exec(itemMatch[i + 1]);
+
+            if (!this.options.pedantic ? bnext[1].length >= bcurr[0].length || bnext[1].length > 3 : bnext[1].length > bcurr[1].length) {
+              // nested list or continuation
+              itemMatch.splice(i, 2, itemMatch[i] + (!this.options.pedantic && bnext[1].length < bcurr[0].length && !itemMatch[i].match(/\n$/) ? '' : '\n') + itemMatch[i + 1]);
+              i--;
+              l--;
+              continue;
+            } else if ( // different bullet style
+            !this.options.pedantic || this.options.smartLists ? bnext[2][bnext[2].length - 1] !== bull[bull.length - 1] : isordered === (bnext[2].length === 1)) {
+              addBack = itemMatch.slice(i + 1).join('\n').length;
+              list.raw = list.raw.substring(0, list.raw.length - addBack);
+              i = l - 1;
+            }
+
+            bcurr = bnext;
+          } // Remove the list item's bullet
+          // so it is seen as the next token.
+
+
+          space = item.length;
+          item = item.replace(/^ *([*+-]|\d+[.)]) ?/, ''); // Outdent whatever the
+          // list item contains. Hacky.
+
+          if (~item.indexOf('\n ')) {
+            space -= item.length;
+            item = !this.options.pedantic ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '') : item.replace(/^ {1,4}/gm, '');
+          } // trim item newlines at end
+
+
+          item = rtrim(item, '\n');
+
+          if (i !== l - 1) {
+            raw = raw + '\n';
+          } // Determine whether item is loose or not.
+          // Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/
+          // for discount behavior.
+
+
+          loose = next || /\n\n(?!\s*$)/.test(raw);
+
+          if (i !== l - 1) {
+            next = raw.slice(-2) === '\n\n';
+            if (!loose) loose = next;
+          }
+
+          if (loose) {
+            list.loose = true;
+          } // Check for task list items
+
+
+          if (this.options.gfm) {
+            istask = /^\[[ xX]\] /.test(item);
+            ischecked = undefined;
+
+            if (istask) {
+              ischecked = item[1] !== ' ';
+              item = item.replace(/^\[[ xX]\] +/, '');
+            }
+          }
+
+          list.items.push({
+            type: 'list_item',
+            raw: raw,
+            task: istask,
+            checked: ischecked,
+            loose: loose,
+            text: item
+          });
+        }
+
+        return list;
+      }
+    };
+
+    _proto.html = function html(src) {
+      var cap = this.rules.block.html.exec(src);
+
+      if (cap) {
+        return {
+          type: this.options.sanitize ? 'paragraph' : 'html',
+          raw: cap[0],
+          pre: !this.options.sanitizer && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),
+          text: this.options.sanitize ? this.options.sanitizer ? this.options.sanitizer(cap[0]) : _escape(cap[0]) : cap[0]
+        };
+      }
+    };
+
+    _proto.def = function def(src) {
+      var cap = this.rules.block.def.exec(src);
+
+      if (cap) {
+        if (cap[3]) cap[3] = cap[3].substring(1, cap[3].length - 1);
+        var tag = cap[1].toLowerCase().replace(/\s+/g, ' ');
+        return {
+          type: 'def',
+          tag: tag,
+          raw: cap[0],
+          href: cap[2],
+          title: cap[3]
+        };
+      }
+    };
+
+    _proto.table = function table(src) {
+      var cap = this.rules.block.table.exec(src);
+
+      if (cap) {
+        var item = {
+          type: 'table',
+          header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
+          align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
+          cells: cap[3] ? cap[3].replace(/\n$/, '').split('\n') : []
+        };
+
+        if (item.header.length === item.align.length) {
+          item.raw = cap[0];
+          var l = item.align.length;
+          var i;
+
+          for (i = 0; i < l; i++) {
+            if (/^ *-+: *$/.test(item.align[i])) {
+              item.align[i] = 'right';
+            } else if (/^ *:-+: *$/.test(item.align[i])) {
+              item.align[i] = 'center';
+            } else if (/^ *:-+ *$/.test(item.align[i])) {
+              item.align[i] = 'left';
+            } else {
+              item.align[i] = null;
+            }
+          }
+
+          l = item.cells.length;
+
+          for (i = 0; i < l; i++) {
+            item.cells[i] = splitCells(item.cells[i].replace(/^ *\| *| *\| *$/g, ''), item.header.length);
+          }
+
+          return item;
+        }
+      }
+    };
+
+    _proto.lheading = function lheading(src) {
+      var cap = this.rules.block.lheading.exec(src);
+
+      if (cap) {
+        return {
+          type: 'heading',
+          raw: cap[0],
+          depth: cap[2].charAt(0) === '=' ? 1 : 2,
+          text: cap[1]
+        };
+      }
+    };
+
+    _proto.paragraph = function paragraph(src) {
+      var cap = this.rules.block.paragraph.exec(src);
+
+      if (cap) {
+        return {
+          type: 'paragraph',
+          raw: cap[0],
+          text: cap[1].charAt(cap[1].length - 1) === '\n' ? cap[1].slice(0, -1) : cap[1]
+        };
+      }
+    };
+
+    _proto.text = function text(src) {
+      var cap = this.rules.block.text.exec(src);
+
+      if (cap) {
+        return {
+          type: 'text',
+          raw: cap[0],
+          text: cap[0]
+        };
+      }
+    };
+
+    _proto.escape = function escape(src) {
+      var cap = this.rules.inline.escape.exec(src);
+
+      if (cap) {
+        return {
+          type: 'escape',
+          raw: cap[0],
+          text: _escape(cap[1])
+        };
+      }
+    };
+
+    _proto.tag = function tag(src, inLink, inRawBlock) {
+      var cap = this.rules.inline.tag.exec(src);
+
+      if (cap) {
+        if (!inLink && /^<a /i.test(cap[0])) {
+          inLink = true;
+        } else if (inLink && /^<\/a>/i.test(cap[0])) {
+          inLink = false;
+        }
+
+        if (!inRawBlock && /^<(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
+          inRawBlock = true;
+        } else if (inRawBlock && /^<\/(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
+          inRawBlock = false;
+        }
+
+        return {
+          type: this.options.sanitize ? 'text' : 'html',
+          raw: cap[0],
+          inLink: inLink,
+          inRawBlock: inRawBlock,
+          text: this.options.sanitize ? this.options.sanitizer ? this.options.sanitizer(cap[0]) : _escape(cap[0]) : cap[0]
+        };
+      }
+    };
+
+    _proto.link = function link(src) {
+      var cap = this.rules.inline.link.exec(src);
+
+      if (cap) {
+        var trimmedUrl = cap[2].trim();
+
+        if (!this.options.pedantic && /^</.test(trimmedUrl)) {
+          // commonmark requires matching angle brackets
+          if (!/>$/.test(trimmedUrl)) {
+            return;
+          } // ending angle bracket cannot be escaped
+
+
+          var rtrimSlash = rtrim(trimmedUrl.slice(0, -1), '\\');
+
+          if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) {
+            return;
+          }
+        } else {
+          // find closing parenthesis
+          var lastParenIndex = findClosingBracket(cap[2], '()');
+
+          if (lastParenIndex > -1) {
+            var start = cap[0].indexOf('!') === 0 ? 5 : 4;
+            var linkLen = start + cap[1].length + lastParenIndex;
+            cap[2] = cap[2].substring(0, lastParenIndex);
+            cap[0] = cap[0].substring(0, linkLen).trim();
+            cap[3] = '';
+          }
+        }
+
+        var href = cap[2];
+        var title = '';
+
+        if (this.options.pedantic) {
+          // split pedantic href and title
+          var link = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href);
+
+          if (link) {
+            href = link[1];
+            title = link[3];
+          }
+        } else {
+          title = cap[3] ? cap[3].slice(1, -1) : '';
+        }
+
+        href = href.trim();
+
+        if (/^</.test(href)) {
+          if (this.options.pedantic && !/>$/.test(trimmedUrl)) {
+            // pedantic allows starting angle bracket without ending angle bracket
+            href = href.slice(1);
+          } else {
+            href = href.slice(1, -1);
+          }
+        }
+
+        return outputLink(cap, {
+          href: href ? href.replace(this.rules.inline._escapes, '$1') : href,
+          title: title ? title.replace(this.rules.inline._escapes, '$1') : title
+        }, cap[0]);
+      }
+    };
+
+    _proto.reflink = function reflink(src, links) {
+      var cap;
+
+      if ((cap = this.rules.inline.reflink.exec(src)) || (cap = this.rules.inline.nolink.exec(src))) {
+        var link = (cap[2] || cap[1]).replace(/\s+/g, ' ');
+        link = links[link.toLowerCase()];
+
+        if (!link || !link.href) {
+          var text = cap[0].charAt(0);
+          return {
+            type: 'text',
+            raw: text,
+            text: text
+          };
+        }
+
+        return outputLink(cap, link, cap[0]);
+      }
+    };
+
+    _proto.emStrong = function emStrong(src, maskedSrc, prevChar) {
+      if (prevChar === void 0) {
+        prevChar = '';
+      }
+
+      var match = this.rules.inline.emStrong.lDelim.exec(src);
+      if (!match) return; // _ can't be between two alphanumerics. \p{L}\p{N} includes non-english alphabet/numbers as well
+
+      if (match[3] && prevChar.match(/(?:[0-9A-Za-z\xAA\xB2\xB3\xB5\xB9\xBA\xBC-\xBE\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u0660-\u0669\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07C0-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08C7\u0904-\u0939\u093D\u0950\u0958-\u0961\u0966-\u096F\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09E6-\u09F1\u09F4-\u09F9\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A66-\u0A6F\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AE6-\u0AEF\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B66-\u0B6F\u0B71-\u0B77\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0BE6-\u0BF2\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C66-\u0C6F\u0C78-\u0C7E\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CE6-\u0CEF\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D58-\u0D61\u0D66-\u0D78\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DE6-\u0DEF\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F20-\u0F33\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F-\u1049\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u1090-\u1099\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1369-\u137C\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u17E0-\u17E9\u17F0-\u17F9\u1810-\u1819\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A16\u1A20-\u1A54\u1A80-\u1A89\u1A90-\u1A99\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B50-\u1B59\u1B83-\u1BA0\u1BAE-\u1BE5\u1C00-\u1C23\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2070\u2071\u2074-\u2079\u207F-\u2089\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2150-\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2CFD\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u3192-\u3195\u31A0-\u31BF\u31F0-\u31FF\u3220-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\u3400-\u4DBF\u4E00-\u9FFC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7BF\uA7C2-\uA7CA\uA7F5-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA830-\uA835\uA840-\uA873\uA882-\uA8B3\uA8D0-\uA8D9\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA900-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF-\uA9D9\uA9E0-\uA9E4\uA9E6-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA50-\uAA59\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD07-\uDD33\uDD40-\uDD78\uDD8A\uDD8B\uDE80-\uDE9C\uDEA0-\uDED0\uDEE1-\uDEFB\uDF00-\uDF23\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC58-\uDC76\uDC79-\uDC9E\uDCA7-\uDCAF\uDCE0-\uDCF2\uDCF4\uDCF5\uDCFB-\uDD1B\uDD20-\uDD39\uDD80-\uDDB7\uDDBC-\uDDCF\uDDD2-\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE40-\uDE48\uDE60-\uDE7E\uDE80-\uDE9F\uDEC0-\uDEC7\uDEC9-\uDEE4\uDEEB-\uDEEF\uDF00-\uDF35\uDF40-\uDF55\uDF58-\uDF72\uDF78-\uDF91\uDFA9-\uDFAF]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDCFA-\uDD23\uDD30-\uDD39\uDE60-\uDE7E\uDE80-\uDEA9\uDEB0\uDEB1\uDF00-\uDF27\uDF30-\uDF45\uDF51-\uDF54\uDFB0-\uDFCB\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC52-\uDC6F\uDC83-\uDCAF\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD03-\uDD26\uDD36-\uDD3F\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDD0-\uDDDA\uDDDC\uDDE1-\uDDF4\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDEF0-\uDEF9\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC50-\uDC59\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE50-\uDE59\uDE80-\uDEAA\uDEB8\uDEC0-\uDEC9\uDF00-\uDF1A\uDF30-\uDF3B]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCF2\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDD50-\uDD59\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC50-\uDC6C\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD50-\uDD59\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDDA0-\uDDA9\uDEE0-\uDEF2\uDFB0\uDFC0-\uDFD4]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF50-\uDF59\uDF5B-\uDF61\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE96\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82C[\uDC00-\uDD1E\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD834[\uDEE0-\uDEF3\uDF60-\uDF78]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD838[\uDD00-\uDD2C\uDD37-\uDD3D\uDD40-\uDD49\uDD4E\uDEC0-\uDEEB\uDEF0-\uDEF9]|\uD83A[\uDC00-\uDCC4\uDCC7-\uDCCF\uDD00-\uDD43\uDD4B\uDD50-\uDD59]|\uD83B[\uDC71-\uDCAB\uDCAD-\uDCAF\uDCB1-\uDCB4\uDD01-\uDD2D\uDD2F-\uDD3D\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD83C[\uDD00-\uDD0C]|\uD83E[\uDFF0-\uDFF9]|\uD869[\uDC00-\uDEDD\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A])/)) return;
+      var nextChar = match[1] || match[2] || '';
+
+      if (!nextChar || nextChar && (prevChar === '' || this.rules.inline.punctuation.exec(prevChar))) {
+        var lLength = match[0].length - 1;
+        var rDelim,
+            rLength,
+            delimTotal = lLength,
+            midDelimTotal = 0;
+        var endReg = match[0][0] === '*' ? this.rules.inline.emStrong.rDelimAst : this.rules.inline.emStrong.rDelimUnd;
+        endReg.lastIndex = 0; // Clip maskedSrc to same section of string as src (move to lexer?)
+
+        maskedSrc = maskedSrc.slice(-1 * src.length + lLength);
+
+        while ((match = endReg.exec(maskedSrc)) != null) {
+          rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];
+          if (!rDelim) continue; // skip single * in __abc*abc__
+
+          rLength = rDelim.length;
+
+          if (match[3] || match[4]) {
+            // found another Left Delim
+            delimTotal += rLength;
+            continue;
+          } else if (match[5] || match[6]) {
+            // either Left or Right Delim
+            if (lLength % 3 && !((lLength + rLength) % 3)) {
+              midDelimTotal += rLength;
+              continue; // CommonMark Emphasis Rules 9-10
+            }
+          }
+
+          delimTotal -= rLength;
+          if (delimTotal > 0) continue; // Haven't found enough closing delimiters
+          // Remove extra characters. *a*** -> *a*
+
+          rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal); // Create `em` if smallest delimiter has odd char count. *a***
+
+          if (Math.min(lLength, rLength) % 2) {
+            return {
+              type: 'em',
+              raw: src.slice(0, lLength + match.index + rLength + 1),
+              text: src.slice(1, lLength + match.index + rLength)
+            };
+          } // Create 'strong' if smallest delimiter has even char count. **a***
+
+
+          return {
+            type: 'strong',
+            raw: src.slice(0, lLength + match.index + rLength + 1),
+            text: src.slice(2, lLength + match.index + rLength - 1)
+          };
+        }
+      }
+    };
+
+    _proto.codespan = function codespan(src) {
+      var cap = this.rules.inline.code.exec(src);
+
+      if (cap) {
+        var text = cap[2].replace(/\n/g, ' ');
+        var hasNonSpaceChars = /[^ ]/.test(text);
+        var hasSpaceCharsOnBothEnds = /^ /.test(text) && / $/.test(text);
+
+        if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) {
+          text = text.substring(1, text.length - 1);
+        }
+
+        text = _escape(text, true);
+        return {
+          type: 'codespan',
+          raw: cap[0],
+          text: text
+        };
+      }
+    };
+
+    _proto.br = function br(src) {
+      var cap = this.rules.inline.br.exec(src);
+
+      if (cap) {
+        return {
+          type: 'br',
+          raw: cap[0]
+        };
+      }
+    };
+
+    _proto.del = function del(src) {
+      var cap = this.rules.inline.del.exec(src);
+
+      if (cap) {
+        return {
+          type: 'del',
+          raw: cap[0],
+          text: cap[2]
+        };
+      }
+    };
+
+    _proto.autolink = function autolink(src, mangle) {
+      var cap = this.rules.inline.autolink.exec(src);
+
+      if (cap) {
+        var text, href;
+
+        if (cap[2] === '@') {
+          text = _escape(this.options.mangle ? mangle(cap[1]) : cap[1]);
+          href = 'mailto:' + text;
+        } else {
+          text = _escape(cap[1]);
+          href = text;
+        }
+
+        return {
+          type: 'link',
+          raw: cap[0],
+          text: text,
+          href: href,
+          tokens: [{
+            type: 'text',
+            raw: text,
+            text: text
+          }]
+        };
+      }
+    };
+
+    _proto.url = function url(src, mangle) {
+      var cap;
+
+      if (cap = this.rules.inline.url.exec(src)) {
+        var text, href;
+
+        if (cap[2] === '@') {
+          text = _escape(this.options.mangle ? mangle(cap[0]) : cap[0]);
+          href = 'mailto:' + text;
+        } else {
+          // do extended autolink path validation
+          var prevCapZero;
+
+          do {
+            prevCapZero = cap[0];
+            cap[0] = this.rules.inline._backpedal.exec(cap[0])[0];
+          } while (prevCapZero !== cap[0]);
+
+          text = _escape(cap[0]);
+
+          if (cap[1] === 'www.') {
+            href = 'http://' + text;
+          } else {
+            href = text;
+          }
+        }
+
+        return {
+          type: 'link',
+          raw: cap[0],
+          text: text,
+          href: href,
+          tokens: [{
+            type: 'text',
+            raw: text,
+            text: text
+          }]
+        };
+      }
+    };
+
+    _proto.inlineText = function inlineText(src, inRawBlock, smartypants) {
+      var cap = this.rules.inline.text.exec(src);
+
+      if (cap) {
+        var text;
+
+        if (inRawBlock) {
+          text = this.options.sanitize ? this.options.sanitizer ? this.options.sanitizer(cap[0]) : _escape(cap[0]) : cap[0];
+        } else {
+          text = _escape(this.options.smartypants ? smartypants(cap[0]) : cap[0]);
+        }
+
+        return {
+          type: 'text',
+          raw: cap[0],
+          text: text
+        };
+      }
+    };
+
+    return Tokenizer;
+  }();
+
+  var noopTest = helpers.noopTest,
+      edit = helpers.edit,
+      merge$1 = helpers.merge;
+  /**
+   * Block-Level Grammar
+   */
+
+  var block$1 = {
+    newline: /^(?: *(?:\n|$))+/,
+    code: /^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/,
+    fences: /^ {0,3}(`{3,}(?=[^`\n]*\n)|~{3,})([^\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?:\n+|$)|$)/,
+    hr: /^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,
+    heading: /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,
+    blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,
+    list: /^( {0,3})(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?! {0,3}bull )\n*|\s*$)/,
+    html: '^ {0,3}(?:' // optional indentation
+    + '<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)' // (1)
+    + '|comment[^\\n]*(\\n+|$)' // (2)
+    + '|<\\?[\\s\\S]*?(?:\\?>\\n*|$)' // (3)
+    + '|<![A-Z][\\s\\S]*?(?:>\\n*|$)' // (4)
+    + '|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>\\n*|$)' // (5)
+    + '|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n *)+\\n|$)' // (6)
+    + '|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)' // (7) open tag
+    + '|</(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)' // (7) closing tag
+    + ')',
+    def: /^ {0,3}\[(label)\]: *\n? *<?([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,
+    nptable: noopTest,
+    table: noopTest,
+    lheading: /^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/,
+    // regex template, placeholders will be replaced according to different paragraph
+    // interruption rules of commonmark and the original markdown spec:
+    _paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html| +\n)[^\n]+)*)/,
+    text: /^[^\n]+/
+  };
+  block$1._label = /(?!\s*\])(?:\\[\[\]]|[^\[\]])+/;
+  block$1._title = /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/;
+  block$1.def = edit(block$1.def).replace('label', block$1._label).replace('title', block$1._title).getRegex();
+  block$1.bullet = /(?:[*+-]|\d{1,9}[.)])/;
+  block$1.item = /^( *)(bull) ?[^\n]*(?:\n(?! *bull ?)[^\n]*)*/;
+  block$1.item = edit(block$1.item, 'gm').replace(/bull/g, block$1.bullet).getRegex();
+  block$1.listItemStart = edit(/^( *)(bull) */).replace('bull', block$1.bullet).getRegex();
+  block$1.list = edit(block$1.list).replace(/bull/g, block$1.bullet).replace('hr', '\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))').replace('def', '\\n+(?=' + block$1.def.source + ')').getRegex();
+  block$1._tag = 'address|article|aside|base|basefont|blockquote|body|caption' + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption' + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe' + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option' + '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr' + '|track|ul';
+  block$1._comment = /<!--(?!-?>)[\s\S]*?(?:-->|$)/;
+  block$1.html = edit(block$1.html, 'i').replace('comment', block$1._comment).replace('tag', block$1._tag).replace('attribute', / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex();
+  block$1.paragraph = edit(block$1._paragraph).replace('hr', block$1.hr).replace('heading', ' {0,3}#{1,6} ').replace('|lheading', '') // setex headings don't interrupt commonmark paragraphs
+  .replace('blockquote', ' {0,3}>').replace('fences', ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n').replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt
+  .replace('html', '</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)').replace('tag', block$1._tag) // pars can be interrupted by type (6) html blocks
+  .getRegex();
+  block$1.blockquote = edit(block$1.blockquote).replace('paragraph', block$1.paragraph).getRegex();
+  /**
+   * Normal Block Grammar
+   */
+
+  block$1.normal = merge$1({}, block$1);
+  /**
+   * GFM Block Grammar
+   */
+
+  block$1.gfm = merge$1({}, block$1.normal, {
+    nptable: '^ *([^|\\n ].*\\|.*)\\n' // Header
+    + ' {0,3}([-:]+ *\\|[-| :]*)' // Align
+    + '(?:\\n((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)',
+    // Cells
+    table: '^ *\\|(.+)\\n' // Header
+    + ' {0,3}\\|?( *[-:]+[-| :]*)' // Align
+    + '(?:\\n *((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)' // Cells
+
+  });
+  block$1.gfm.nptable = edit(block$1.gfm.nptable).replace('hr', block$1.hr).replace('heading', ' {0,3}#{1,6} ').replace('blockquote', ' {0,3}>').replace('code', ' {4}[^\\n]').replace('fences', ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n').replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt
+  .replace('html', '</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)').replace('tag', block$1._tag) // tables can be interrupted by type (6) html blocks
+  .getRegex();
+  block$1.gfm.table = edit(block$1.gfm.table).replace('hr', block$1.hr).replace('heading', ' {0,3}#{1,6} ').replace('blockquote', ' {0,3}>').replace('code', ' {4}[^\\n]').replace('fences', ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n').replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt
+  .replace('html', '</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)').replace('tag', block$1._tag) // tables can be interrupted by type (6) html blocks
+  .getRegex();
+  /**
+   * Pedantic grammar (original John Gruber's loose markdown specification)
+   */
+
+  block$1.pedantic = merge$1({}, block$1.normal, {
+    html: edit('^ *(?:comment *(?:\\n|\\s*$)' + '|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)' // closed tag
+    + '|<tag(?:"[^"]*"|\'[^\']*\'|\\s[^\'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))').replace('comment', block$1._comment).replace(/tag/g, '(?!(?:' + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub' + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)' + '\\b)\\w+(?!:|[^\\w\\s@]*@)\\b').getRegex(),
+    def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,
+    heading: /^(#{1,6})(.*)(?:\n+|$)/,
+    fences: noopTest,
+    // fences not supported
+    paragraph: edit(block$1.normal._paragraph).replace('hr', block$1.hr).replace('heading', ' *#{1,6} *[^\n]').replace('lheading', block$1.lheading).replace('blockquote', ' {0,3}>').replace('|fences', '').replace('|list', '').replace('|html', '').getRegex()
+  });
+  /**
+   * Inline-Level Grammar
+   */
+
+  var inline$1 = {
+    escape: /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,
+    autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/,
+    url: noopTest,
+    tag: '^comment' + '|^</[a-zA-Z][\\w:-]*\\s*>' // self-closing tag
+    + '|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>' // open tag
+    + '|^<\\?[\\s\\S]*?\\?>' // processing instruction, e.g. <?php ?>
+    + '|^<![a-zA-Z]+\\s[\\s\\S]*?>' // declaration, e.g. <!DOCTYPE html>
+    + '|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>',
+    // CDATA section
+    link: /^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/,
+    reflink: /^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,
+    nolink: /^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,
+    reflinkSearch: 'reflink|nolink(?!\\()',
+    emStrong: {
+      lDelim: /^(?:\*+(?:([punct_])|[^\s*]))|^_+(?:([punct*])|([^\s_]))/,
+      //        (1) and (2) can only be a Right Delimiter. (3) and (4) can only be Left.  (5) and (6) can be either Left or Right.
+      //        () Skip other delimiter (1) #***                   (2) a***#, a***                   (3) #***a, ***a                 (4) ***#              (5) #***#                 (6) a***a
+      rDelimAst: /\_\_[^_*]*?\*[^_*]*?\_\_|[punct_](\*+)(?=[\s]|$)|[^punct*_\s](\*+)(?=[punct_\s]|$)|[punct_\s](\*+)(?=[^punct*_\s])|[\s](\*+)(?=[punct_])|[punct_](\*+)(?=[punct_])|[^punct*_\s](\*+)(?=[^punct*_\s])/,
+      rDelimUnd: /\*\*[^_*]*?\_[^_*]*?\*\*|[punct*](\_+)(?=[\s]|$)|[^punct*_\s](\_+)(?=[punct*\s]|$)|[punct*\s](\_+)(?=[^punct*_\s])|[\s](\_+)(?=[punct*])|[punct*](\_+)(?=[punct*])/ // ^- Not allowed for _
+
+    },
+    code: /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,
+    br: /^( {2,}|\\)\n(?!\s*$)/,
+    del: noopTest,
+    text: /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/,
+    punctuation: /^([\spunctuation])/
+  }; // list of punctuation marks from CommonMark spec
+  // without * and _ to handle the different emphasis markers * and _
+
+  inline$1._punctuation = '!"#$%&\'()+\\-.,/:;<=>?@\\[\\]`^{|}~';
+  inline$1.punctuation = edit(inline$1.punctuation).replace(/punctuation/g, inline$1._punctuation).getRegex(); // sequences em should skip over [title](link), `code`, <html>
+
+  inline$1.blockSkip = /\[[^\]]*?\]\([^\)]*?\)|`[^`]*?`|<[^>]*?>/g;
+  inline$1.escapedEmSt = /\\\*|\\_/g;
+  inline$1._comment = edit(block$1._comment).replace('(?:-->|$)', '-->').getRegex();
+  inline$1.emStrong.lDelim = edit(inline$1.emStrong.lDelim).replace(/punct/g, inline$1._punctuation).getRegex();
+  inline$1.emStrong.rDelimAst = edit(inline$1.emStrong.rDelimAst, 'g').replace(/punct/g, inline$1._punctuation).getRegex();
+  inline$1.emStrong.rDelimUnd = edit(inline$1.emStrong.rDelimUnd, 'g').replace(/punct/g, inline$1._punctuation).getRegex();
+  inline$1._escapes = /\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g;
+  inline$1._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;
+  inline$1._email = /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/;
+  inline$1.autolink = edit(inline$1.autolink).replace('scheme', inline$1._scheme).replace('email', inline$1._email).getRegex();
+  inline$1._attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/;
+  inline$1.tag = edit(inline$1.tag).replace('comment', inline$1._comment).replace('attribute', inline$1._attribute).getRegex();
+  inline$1._label = /(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/;
+  inline$1._href = /<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/;
+  inline$1._title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/;
+  inline$1.link = edit(inline$1.link).replace('label', inline$1._label).replace('href', inline$1._href).replace('title', inline$1._title).getRegex();
+  inline$1.reflink = edit(inline$1.reflink).replace('label', inline$1._label).getRegex();
+  inline$1.reflinkSearch = edit(inline$1.reflinkSearch, 'g').replace('reflink', inline$1.reflink).replace('nolink', inline$1.nolink).getRegex();
+  /**
+   * Normal Inline Grammar
+   */
+
+  inline$1.normal = merge$1({}, inline$1);
+  /**
+   * Pedantic Inline Grammar
+   */
+
+  inline$1.pedantic = merge$1({}, inline$1.normal, {
+    strong: {
+      start: /^__|\*\*/,
+      middle: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
+      endAst: /\*\*(?!\*)/g,
+      endUnd: /__(?!_)/g
+    },
+    em: {
+      start: /^_|\*/,
+      middle: /^()\*(?=\S)([\s\S]*?\S)\*(?!\*)|^_(?=\S)([\s\S]*?\S)_(?!_)/,
+      endAst: /\*(?!\*)/g,
+      endUnd: /_(?!_)/g
+    },
+    link: edit(/^!?\[(label)\]\((.*?)\)/).replace('label', inline$1._label).getRegex(),
+    reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace('label', inline$1._label).getRegex()
+  });
+  /**
+   * GFM Inline Grammar
+   */
+
+  inline$1.gfm = merge$1({}, inline$1.normal, {
+    escape: edit(inline$1.escape).replace('])', '~|])').getRegex(),
+    _extended_email: /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,
+    url: /^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,
+    _backpedal: /(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,
+    del: /^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/,
+    text: /^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|https?:\/\/|ftp:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/
+  });
+  inline$1.gfm.url = edit(inline$1.gfm.url, 'i').replace('email', inline$1.gfm._extended_email).getRegex();
+  /**
+   * GFM + Line Breaks Inline Grammar
+   */
+
+  inline$1.breaks = merge$1({}, inline$1.gfm, {
+    br: edit(inline$1.br).replace('{2,}', '*').getRegex(),
+    text: edit(inline$1.gfm.text).replace('\\b_', '\\b_| {2,}\\n').replace(/\{2,\}/g, '*').getRegex()
+  });
+  var rules = {
+    block: block$1,
+    inline: inline$1
+  };
+
+  var Tokenizer$1 = Tokenizer_1;
+  var defaults$3 = defaults$5.exports.defaults;
+  var block = rules.block,
+      inline = rules.inline;
+  var repeatString = helpers.repeatString;
+  /**
+   * smartypants text replacement
+   */
+
+  function smartypants(text) {
+    return text // em-dashes
+    .replace(/---/g, "\u2014") // en-dashes
+    .replace(/--/g, "\u2013") // opening singles
+    .replace(/(^|[-\u2014/(\[{"\s])'/g, "$1\u2018") // closing singles & apostrophes
+    .replace(/'/g, "\u2019") // opening doubles
+    .replace(/(^|[-\u2014/(\[{\u2018\s])"/g, "$1\u201C") // closing doubles
+    .replace(/"/g, "\u201D") // ellipses
+    .replace(/\.{3}/g, "\u2026");
+  }
+  /**
+   * mangle email addresses
+   */
+
+
+  function mangle(text) {
+    var out = '',
+        i,
+        ch;
+    var l = text.length;
+
+    for (i = 0; i < l; i++) {
+      ch = text.charCodeAt(i);
+
+      if (Math.random() > 0.5) {
+        ch = 'x' + ch.toString(16);
+      }
+
+      out += '&#' + ch + ';';
+    }
+
+    return out;
+  }
+  /**
+   * Block Lexer
+   */
+
+
+  var Lexer_1 = /*#__PURE__*/function () {
+    function Lexer(options) {
+      this.tokens = [];
+      this.tokens.links = Object.create(null);
+      this.options = options || defaults$3;
+      this.options.tokenizer = this.options.tokenizer || new Tokenizer$1();
+      this.tokenizer = this.options.tokenizer;
+      this.tokenizer.options = this.options;
+      var rules = {
+        block: block.normal,
+        inline: inline.normal
+      };
+
+      if (this.options.pedantic) {
+        rules.block = block.pedantic;
+        rules.inline = inline.pedantic;
+      } else if (this.options.gfm) {
+        rules.block = block.gfm;
+
+        if (this.options.breaks) {
+          rules.inline = inline.breaks;
+        } else {
+          rules.inline = inline.gfm;
+        }
+      }
+
+      this.tokenizer.rules = rules;
+    }
+    /**
+     * Expose Rules
+     */
+
+
+    /**
+     * Static Lex Method
+     */
+    Lexer.lex = function lex(src, options) {
+      var lexer = new Lexer(options);
+      return lexer.lex(src);
+    }
+    /**
+     * Static Lex Inline Method
+     */
+    ;
+
+    Lexer.lexInline = function lexInline(src, options) {
+      var lexer = new Lexer(options);
+      return lexer.inlineTokens(src);
+    }
+    /**
+     * Preprocessing
+     */
+    ;
+
+    var _proto = Lexer.prototype;
+
+    _proto.lex = function lex(src) {
+      src = src.replace(/\r\n|\r/g, '\n').replace(/\t/g, '    ');
+      this.blockTokens(src, this.tokens, true);
+      this.inline(this.tokens);
+      return this.tokens;
+    }
+    /**
+     * Lexing
+     */
+    ;
+
+    _proto.blockTokens = function blockTokens(src, tokens, top) {
+      var _this = this;
+
+      if (tokens === void 0) {
+        tokens = [];
+      }
+
+      if (top === void 0) {
+        top = true;
+      }
+
+      if (this.options.pedantic) {
+        src = src.replace(/^ +$/gm, '');
+      }
+
+      var token, i, l, lastToken, cutSrc, lastParagraphClipped;
+
+      while (src) {
+        if (this.options.extensions && this.options.extensions.block && this.options.extensions.block.some(function (extTokenizer) {
+          if (token = extTokenizer.call(_this, src, tokens)) {
+            src = src.substring(token.raw.length);
+            tokens.push(token);
+            return true;
+          }
+
+          return false;
+        })) {
+          continue;
+        } // newline
+
+
+        if (token = this.tokenizer.space(src)) {
+          src = src.substring(token.raw.length);
+
+          if (token.type) {
+            tokens.push(token);
+          }
+
+          continue;
+        } // code
+
+
+        if (token = this.tokenizer.code(src)) {
+          src = src.substring(token.raw.length);
+          lastToken = tokens[tokens.length - 1]; // An indented code block cannot interrupt a paragraph.
+
+          if (lastToken && lastToken.type === 'paragraph') {
+            lastToken.raw += '\n' + token.raw;
+            lastToken.text += '\n' + token.text;
+          } else {
+            tokens.push(token);
+          }
+
+          continue;
+        } // fences
+
+
+        if (token = this.tokenizer.fences(src)) {
+          src = src.substring(token.raw.length);
+          tokens.push(token);
+          continue;
+        } // heading
+
+
+        if (token = this.tokenizer.heading(src)) {
+          src = src.substring(token.raw.length);
+          tokens.push(token);
+          continue;
+        } // table no leading pipe (gfm)
+
+
+        if (token = this.tokenizer.nptable(src)) {
+          src = src.substring(token.raw.length);
+          tokens.push(token);
+          continue;
+        } // hr
+
+
+        if (token = this.tokenizer.hr(src)) {
+          src = src.substring(token.raw.length);
+          tokens.push(token);
+          continue;
+        } // blockquote
+
+
+        if (token = this.tokenizer.blockquote(src)) {
+          src = src.substring(token.raw.length);
+          token.tokens = this.blockTokens(token.text, [], top);
+          tokens.push(token);
+          continue;
+        } // list
+
+
+        if (token = this.tokenizer.list(src)) {
+          src = src.substring(token.raw.length);
+          l = token.items.length;
+
+          for (i = 0; i < l; i++) {
+            token.items[i].tokens = this.blockTokens(token.items[i].text, [], false);
+          }
+
+          tokens.push(token);
+          continue;
+        } // html
+
+
+        if (token = this.tokenizer.html(src)) {
+          src = src.substring(token.raw.length);
+          tokens.push(token);
+          continue;
+        } // def
+
+
+        if (top && (token = this.tokenizer.def(src))) {
+          src = src.substring(token.raw.length);
+
+          if (!this.tokens.links[token.tag]) {
+            this.tokens.links[token.tag] = {
+              href: token.href,
+              title: token.title
+            };
+          }
+
+          continue;
+        } // table (gfm)
+
+
+        if (token = this.tokenizer.table(src)) {
+          src = src.substring(token.raw.length);
+          tokens.push(token);
+          continue;
+        } // lheading
+
+
+        if (token = this.tokenizer.lheading(src)) {
+          src = src.substring(token.raw.length);
+          tokens.push(token);
+          continue;
+        } // top-level paragraph
+        // prevent paragraph consuming extensions by clipping 'src' to extension start
+
+
+        cutSrc = src;
+
+        if (this.options.extensions && this.options.extensions.startBlock) {
+          (function () {
+            var startIndex = Infinity;
+            var tempSrc = src.slice(1);
+            var tempStart = void 0;
+
+            _this.options.extensions.startBlock.forEach(function (getStartIndex) {
+              tempStart = getStartIndex.call(this, tempSrc);
+
+              if (typeof tempStart === 'number' && tempStart >= 0) {
+                startIndex = Math.min(startIndex, tempStart);
+              }
+            });
+
+            if (startIndex < Infinity && startIndex >= 0) {
+              cutSrc = src.substring(0, startIndex + 1);
+            }
+          })();
+        }
+
+        if (top && (token = this.tokenizer.paragraph(cutSrc))) {
+          lastToken = tokens[tokens.length - 1];
+
+          if (lastParagraphClipped && lastToken.type === 'paragraph') {
+            lastToken.raw += '\n' + token.raw;
+            lastToken.text += '\n' + token.text;
+          } else {
+            tokens.push(token);
+          }
+
+          lastParagraphClipped = cutSrc.length !== src.length;
+          src = src.substring(token.raw.length);
+          continue;
+        } // text
+
+
+        if (token = this.tokenizer.text(src)) {
+          src = src.substring(token.raw.length);
+          lastToken = tokens[tokens.length - 1];
+
+          if (lastToken && lastToken.type === 'text') {
+            lastToken.raw += '\n' + token.raw;
+            lastToken.text += '\n' + token.text;
+          } else {
+            tokens.push(token);
+          }
+
+          continue;
+        }
+
+        if (src) {
+          var errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);
+
+          if (this.options.silent) {
+            console.error(errMsg);
+            break;
+          } else {
+            throw new Error(errMsg);
+          }
+        }
+      }
+
+      return tokens;
+    };
+
+    _proto.inline = function inline(tokens) {
+      var i, j, k, l2, row, token;
+      var l = tokens.length;
+
+      for (i = 0; i < l; i++) {
+        token = tokens[i];
+
+        switch (token.type) {
+          case 'paragraph':
+          case 'text':
+          case 'heading':
+            {
+              token.tokens = [];
+              this.inlineTokens(token.text, token.tokens);
+              break;
+            }
+
+          case 'table':
+            {
+              token.tokens = {
+                header: [],
+                cells: []
+              }; // header
+
+              l2 = token.header.length;
+
+              for (j = 0; j < l2; j++) {
+                token.tokens.header[j] = [];
+                this.inlineTokens(token.header[j], token.tokens.header[j]);
+              } // cells
+
+
+              l2 = token.cells.length;
+
+              for (j = 0; j < l2; j++) {
+                row = token.cells[j];
+                token.tokens.cells[j] = [];
+
+                for (k = 0; k < row.length; k++) {
+                  token.tokens.cells[j][k] = [];
+                  this.inlineTokens(row[k], token.tokens.cells[j][k]);
+                }
+              }
+
+              break;
+            }
+
+          case 'blockquote':
+            {
+              this.inline(token.tokens);
+              break;
+            }
+
+          case 'list':
+            {
+              l2 = token.items.length;
+
+              for (j = 0; j < l2; j++) {
+                this.inline(token.items[j].tokens);
+              }
+
+              break;
+            }
+        }
+      }
+
+      return tokens;
+    }
+    /**
+     * Lexing/Compiling
+     */
+    ;
+
+    _proto.inlineTokens = function inlineTokens(src, tokens, inLink, inRawBlock) {
+      var _this2 = this;
+
+      if (tokens === void 0) {
+        tokens = [];
+      }
+
+      if (inLink === void 0) {
+        inLink = false;
+      }
+
+      if (inRawBlock === void 0) {
+        inRawBlock = false;
+      }
+
+      var token, lastToken, cutSrc; // String with links masked to avoid interference with em and strong
+
+      var maskedSrc = src;
+      var match;
+      var keepPrevChar, prevChar; // Mask out reflinks
+
+      if (this.tokens.links) {
+        var links = Object.keys(this.tokens.links);
+
+        if (links.length > 0) {
+          while ((match = this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc)) != null) {
+            if (links.includes(match[0].slice(match[0].lastIndexOf('[') + 1, -1))) {
+              maskedSrc = maskedSrc.slice(0, match.index) + '[' + repeatString('a', match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex);
+            }
+          }
+        }
+      } // Mask out other blocks
+
+
+      while ((match = this.tokenizer.rules.inline.blockSkip.exec(maskedSrc)) != null) {
+        maskedSrc = maskedSrc.slice(0, match.index) + '[' + repeatString('a', match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);
+      } // Mask out escaped em & strong delimiters
+
+
+      while ((match = this.tokenizer.rules.inline.escapedEmSt.exec(maskedSrc)) != null) {
+        maskedSrc = maskedSrc.slice(0, match.index) + '++' + maskedSrc.slice(this.tokenizer.rules.inline.escapedEmSt.lastIndex);
+      }
+
+      while (src) {
+        if (!keepPrevChar) {
+          prevChar = '';
+        }
+
+        keepPrevChar = false; // extensions
+
+        if (this.options.extensions && this.options.extensions.inline && this.options.extensions.inline.some(function (extTokenizer) {
+          if (token = extTokenizer.call(_this2, src, tokens)) {
+            src = src.substring(token.raw.length);
+            tokens.push(token);
+            return true;
+          }
+
+          return false;
+        })) {
+          continue;
+        } // escape
+
+
+        if (token = this.tokenizer.escape(src)) {
+          src = src.substring(token.raw.length);
+          tokens.push(token);
+          continue;
+        } // tag
+
+
+        if (token = this.tokenizer.tag(src, inLink, inRawBlock)) {
+          src = src.substring(token.raw.length);
+          inLink = token.inLink;
+          inRawBlock = token.inRawBlock;
+          lastToken = tokens[tokens.length - 1];
+
+          if (lastToken && token.type === 'text' && lastToken.type === 'text') {
+            lastToken.raw += token.raw;
+            lastToken.text += token.text;
+          } else {
+            tokens.push(token);
+          }
+
+          continue;
+        } // link
+
+
+        if (token = this.tokenizer.link(src)) {
+          src = src.substring(token.raw.length);
+
+          if (token.type === 'link') {
+            token.tokens = this.inlineTokens(token.text, [], true, inRawBlock);
+          }
+
+          tokens.push(token);
+          continue;
+        } // reflink, nolink
+
+
+        if (token = this.tokenizer.reflink(src, this.tokens.links)) {
+          src = src.substring(token.raw.length);
+          lastToken = tokens[tokens.length - 1];
+
+          if (token.type === 'link') {
+            token.tokens = this.inlineTokens(token.text, [], true, inRawBlock);
+            tokens.push(token);
+          } else if (lastToken && token.type === 'text' && lastToken.type === 'text') {
+            lastToken.raw += token.raw;
+            lastToken.text += token.text;
+          } else {
+            tokens.push(token);
+          }
+
+          continue;
+        } // em & strong
+
+
+        if (token = this.tokenizer.emStrong(src, maskedSrc, prevChar)) {
+          src = src.substring(token.raw.length);
+          token.tokens = this.inlineTokens(token.text, [], inLink, inRawBlock);
+          tokens.push(token);
+          continue;
+        } // code
+
+
+        if (token = this.tokenizer.codespan(src)) {
+          src = src.substring(token.raw.length);
+          tokens.push(token);
+          continue;
+        } // br
+
+
+        if (token = this.tokenizer.br(src)) {
+          src = src.substring(token.raw.length);
+          tokens.push(token);
+          continue;
+        } // del (gfm)
+
+
+        if (token = this.tokenizer.del(src)) {
+          src = src.substring(token.raw.length);
+          token.tokens = this.inlineTokens(token.text, [], inLink, inRawBlock);
+          tokens.push(token);
+          continue;
+        } // autolink
+
+
+        if (token = this.tokenizer.autolink(src, mangle)) {
+          src = src.substring(token.raw.length);
+          tokens.push(token);
+          continue;
+        } // url (gfm)
+
+
+        if (!inLink && (token = this.tokenizer.url(src, mangle))) {
+          src = src.substring(token.raw.length);
+          tokens.push(token);
+          continue;
+        } // text
+        // prevent inlineText consuming extensions by clipping 'src' to extension start
+
+
+        cutSrc = src;
+
+        if (this.options.extensions && this.options.extensions.startInline) {
+          (function () {
+            var startIndex = Infinity;
+            var tempSrc = src.slice(1);
+            var tempStart = void 0;
+
+            _this2.options.extensions.startInline.forEach(function (getStartIndex) {
+              tempStart = getStartIndex.call(this, tempSrc);
+
+              if (typeof tempStart === 'number' && tempStart >= 0) {
+                startIndex = Math.min(startIndex, tempStart);
+              }
+            });
+
+            if (startIndex < Infinity && startIndex >= 0) {
+              cutSrc = src.substring(0, startIndex + 1);
+            }
+          })();
+        }
+
+        if (token = this.tokenizer.inlineText(cutSrc, inRawBlock, smartypants)) {
+          src = src.substring(token.raw.length);
+
+          if (token.raw.slice(-1) !== '_') {
+            // Track prevChar before string of ____ started
+            prevChar = token.raw.slice(-1);
+          }
+
+          keepPrevChar = true;
+          lastToken = tokens[tokens.length - 1];
+
+          if (lastToken && lastToken.type === 'text') {
+            lastToken.raw += token.raw;
+            lastToken.text += token.text;
+          } else {
+            tokens.push(token);
+          }
+
+          continue;
+        }
+
+        if (src) {
+          var errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);
+
+          if (this.options.silent) {
+            console.error(errMsg);
+            break;
+          } else {
+            throw new Error(errMsg);
+          }
+        }
+      }
+
+      return tokens;
+    };
+
+    _createClass(Lexer, null, [{
+      key: "rules",
+      get: function get() {
+        return {
+          block: block,
+          inline: inline
+        };
+      }
+    }]);
+
+    return Lexer;
+  }();
+
+  var defaults$2 = defaults$5.exports.defaults;
+  var cleanUrl = helpers.cleanUrl,
+      escape$1 = helpers.escape;
+  /**
+   * Renderer
+   */
+
+  var Renderer_1 = /*#__PURE__*/function () {
+    function Renderer(options) {
+      this.options = options || defaults$2;
+    }
+
+    var _proto = Renderer.prototype;
+
+    _proto.code = function code(_code, infostring, escaped) {
+      var lang = (infostring || '').match(/\S*/)[0];
+
+      if (this.options.highlight) {
+        var out = this.options.highlight(_code, lang);
+
+        if (out != null && out !== _code) {
+          escaped = true;
+          _code = out;
+        }
+      }
+
+      _code = _code.replace(/\n$/, '') + '\n';
+
+      if (!lang) {
+        return '<pre><code>' + (escaped ? _code : escape$1(_code, true)) + '</code></pre>\n';
+      }
+
+      return '<pre><code class="' + this.options.langPrefix + escape$1(lang, true) + '">' + (escaped ? _code : escape$1(_code, true)) + '</code></pre>\n';
+    };
+
+    _proto.blockquote = function blockquote(quote) {
+      return '<blockquote>\n' + quote + '</blockquote>\n';
+    };
+
+    _proto.html = function html(_html) {
+      return _html;
+    };
+
+    _proto.heading = function heading(text, level, raw, slugger) {
+      if (this.options.headerIds) {
+        return '<h' + level + ' id="' + this.options.headerPrefix + slugger.slug(raw) + '">' + text + '</h' + level + '>\n';
+      } // ignore IDs
+
+
+      return '<h' + level + '>' + text + '</h' + level + '>\n';
+    };
+
+    _proto.hr = function hr() {
+      return this.options.xhtml ? '<hr/>\n' : '<hr>\n';
+    };
+
+    _proto.list = function list(body, ordered, start) {
+      var type = ordered ? 'ol' : 'ul',
+          startatt = ordered && start !== 1 ? ' start="' + start + '"' : '';
+      return '<' + type + startatt + '>\n' + body + '</' + type + '>\n';
+    };
+
+    _proto.listitem = function listitem(text) {
+      return '<li>' + text + '</li>\n';
+    };
+
+    _proto.checkbox = function checkbox(checked) {
+      return '<input ' + (checked ? 'checked="" ' : '') + 'disabled="" type="checkbox"' + (this.options.xhtml ? ' /' : '') + '> ';
+    };
+
+    _proto.paragraph = function paragraph(text) {
+      return '<p>' + text + '</p>\n';
+    };
+
+    _proto.table = function table(header, body) {
+      if (body) body = '<tbody>' + body + '</tbody>';
+      return '<table>\n' + '<thead>\n' + header + '</thead>\n' + body + '</table>\n';
+    };
+
+    _proto.tablerow = function tablerow(content) {
+      return '<tr>\n' + content + '</tr>\n';
+    };
+
+    _proto.tablecell = function tablecell(content, flags) {
+      var type = flags.header ? 'th' : 'td';
+      var tag = flags.align ? '<' + type + ' align="' + flags.align + '">' : '<' + type + '>';
+      return tag + content + '</' + type + '>\n';
+    } // span level renderer
+    ;
+
+    _proto.strong = function strong(text) {
+      return '<strong>' + text + '</strong>';
+    };
+
+    _proto.em = function em(text) {
+      return '<em>' + text + '</em>';
+    };
+
+    _proto.codespan = function codespan(text) {
+      return '<code>' + text + '</code>';
+    };
+
+    _proto.br = function br() {
+      return this.options.xhtml ? '<br/>' : '<br>';
+    };
+
+    _proto.del = function del(text) {
+      return '<del>' + text + '</del>';
+    };
+
+    _proto.link = function link(href, title, text) {
+      href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);
+
+      if (href === null) {
+        return text;
+      }
+
+      var out = '<a href="' + escape$1(href) + '"';
+
+      if (title) {
+        out += ' title="' + title + '"';
+      }
+
+      out += '>' + text + '</a>';
+      return out;
+    };
+
+    _proto.image = function image(href, title, text) {
+      href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);
+
+      if (href === null) {
+        return text;
+      }
+
+      var out = '<img src="' + href + '" alt="' + text + '"';
+
+      if (title) {
+        out += ' title="' + title + '"';
+      }
+
+      out += this.options.xhtml ? '/>' : '>';
+      return out;
+    };
+
+    _proto.text = function text(_text) {
+      return _text;
+    };
+
+    return Renderer;
+  }();
+
+  /**
+   * TextRenderer
+   * returns only the textual part of the token
+   */
+
+  var TextRenderer_1 = /*#__PURE__*/function () {
+    function TextRenderer() {}
+
+    var _proto = TextRenderer.prototype;
+
+    // no need for block level renderers
+    _proto.strong = function strong(text) {
+      return text;
+    };
+
+    _proto.em = function em(text) {
+      return text;
+    };
+
+    _proto.codespan = function codespan(text) {
+      return text;
+    };
+
+    _proto.del = function del(text) {
+      return text;
+    };
+
+    _proto.html = function html(text) {
+      return text;
+    };
+
+    _proto.text = function text(_text) {
+      return _text;
+    };
+
+    _proto.link = function link(href, title, text) {
+      return '' + text;
+    };
+
+    _proto.image = function image(href, title, text) {
+      return '' + text;
+    };
+
+    _proto.br = function br() {
+      return '';
+    };
+
+    return TextRenderer;
+  }();
+
+  /**
+   * Slugger generates header id
+   */
+
+  var Slugger_1 = /*#__PURE__*/function () {
+    function Slugger() {
+      this.seen = {};
+    }
+
+    var _proto = Slugger.prototype;
+
+    _proto.serialize = function serialize(value) {
+      return value.toLowerCase().trim() // remove html tags
+      .replace(/<[!\/a-z].*?>/ig, '') // remove unwanted chars
+      .replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g, '').replace(/\s/g, '-');
+    }
+    /**
+     * Finds the next safe (unique) slug to use
+     */
+    ;
+
+    _proto.getNextSafeSlug = function getNextSafeSlug(originalSlug, isDryRun) {
+      var slug = originalSlug;
+      var occurenceAccumulator = 0;
+
+      if (this.seen.hasOwnProperty(slug)) {
+        occurenceAccumulator = this.seen[originalSlug];
+
+        do {
+          occurenceAccumulator++;
+          slug = originalSlug + '-' + occurenceAccumulator;
+        } while (this.seen.hasOwnProperty(slug));
+      }
+
+      if (!isDryRun) {
+        this.seen[originalSlug] = occurenceAccumulator;
+        this.seen[slug] = 0;
+      }
+
+      return slug;
+    }
+    /**
+     * Convert string to unique id
+     * @param {object} options
+     * @param {boolean} options.dryrun Generates the next unique slug without updating the internal accumulator.
+     */
+    ;
+
+    _proto.slug = function slug(value, options) {
+      if (options === void 0) {
+        options = {};
+      }
+
+      var slug = this.serialize(value);
+      return this.getNextSafeSlug(slug, options.dryrun);
+    };
+
+    return Slugger;
+  }();
+
+  var Renderer$1 = Renderer_1;
+  var TextRenderer$1 = TextRenderer_1;
+  var Slugger$1 = Slugger_1;
+  var defaults$1 = defaults$5.exports.defaults;
+  var unescape = helpers.unescape;
+  /**
+   * Parsing & Compiling
+   */
+
+  var Parser_1 = /*#__PURE__*/function () {
+    function Parser(options) {
+      this.options = options || defaults$1;
+      this.options.renderer = this.options.renderer || new Renderer$1();
+      this.renderer = this.options.renderer;
+      this.renderer.options = this.options;
+      this.textRenderer = new TextRenderer$1();
+      this.slugger = new Slugger$1();
+    }
+    /**
+     * Static Parse Method
+     */
+
+
+    Parser.parse = function parse(tokens, options) {
+      var parser = new Parser(options);
+      return parser.parse(tokens);
+    }
+    /**
+     * Static Parse Inline Method
+     */
+    ;
+
+    Parser.parseInline = function parseInline(tokens, options) {
+      var parser = new Parser(options);
+      return parser.parseInline(tokens);
+    }
+    /**
+     * Parse Loop
+     */
+    ;
+
+    var _proto = Parser.prototype;
+
+    _proto.parse = function parse(tokens, top) {
+      if (top === void 0) {
+        top = true;
+      }
+
+      var out = '',
+          i,
+          j,
+          k,
+          l2,
+          l3,
+          row,
+          cell,
+          header,
+          body,
+          token,
+          ordered,
+          start,
+          loose,
+          itemBody,
+          item,
+          checked,
+          task,
+          checkbox,
+          ret;
+      var l = tokens.length;
+
+      for (i = 0; i < l; i++) {
+        token = tokens[i]; // Run any renderer extensions
+
+        if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) {
+          ret = this.options.extensions.renderers[token.type].call(this, token);
+
+          if (ret !== false || !['space', 'hr', 'heading', 'code', 'table', 'blockquote', 'list', 'html', 'paragraph', 'text'].includes(token.type)) {
+            out += ret || '';
+            continue;
+          }
+        }
+
+        switch (token.type) {
+          case 'space':
+            {
+              continue;
+            }
+
+          case 'hr':
+            {
+              out += this.renderer.hr();
+              continue;
+            }
+
+          case 'heading':
+            {
+              out += this.renderer.heading(this.parseInline(token.tokens), token.depth, unescape(this.parseInline(token.tokens, this.textRenderer)), this.slugger);
+              continue;
+            }
+
+          case 'code':
+            {
+              out += this.renderer.code(token.text, token.lang, token.escaped);
+              continue;
+            }
+
+          case 'table':
+            {
+              header = ''; // header
+
+              cell = '';
+              l2 = token.header.length;
+
+              for (j = 0; j < l2; j++) {
+                cell += this.renderer.tablecell(this.parseInline(token.tokens.header[j]), {
+                  header: true,
+                  align: token.align[j]
+                });
+              }
+
+              header += this.renderer.tablerow(cell);
+              body = '';
+              l2 = token.cells.length;
+
+              for (j = 0; j < l2; j++) {
+                row = token.tokens.cells[j];
+                cell = '';
+                l3 = row.length;
+
+                for (k = 0; k < l3; k++) {
+                  cell += this.renderer.tablecell(this.parseInline(row[k]), {
+                    header: false,
+                    align: token.align[k]
+                  });
+                }
+
+                body += this.renderer.tablerow(cell);
+              }
+
+              out += this.renderer.table(header, body);
+              continue;
+            }
+
+          case 'blockquote':
+            {
+              body = this.parse(token.tokens);
+              out += this.renderer.blockquote(body);
+              continue;
+            }
+
+          case 'list':
+            {
+              ordered = token.ordered;
+              start = token.start;
+              loose = token.loose;
+              l2 = token.items.length;
+              body = '';
+
+              for (j = 0; j < l2; j++) {
+                item = token.items[j];
+                checked = item.checked;
+                task = item.task;
+                itemBody = '';
+
+                if (item.task) {
+                  checkbox = this.renderer.checkbox(checked);
+
+                  if (loose) {
+                    if (item.tokens.length > 0 && item.tokens[0].type === 'text') {
+                      item.tokens[0].text = checkbox + ' ' + item.tokens[0].text;
+
+                      if (item.tokens[0].tokens && item.tokens[0].tokens.length > 0 && item.tokens[0].tokens[0].type === 'text') {
+                        item.tokens[0].tokens[0].text = checkbox + ' ' + item.tokens[0].tokens[0].text;
+                      }
+                    } else {
+                      item.tokens.unshift({
+                        type: 'text',
+                        text: checkbox
+                      });
+                    }
+                  } else {
+                    itemBody += checkbox;
+                  }
+                }
+
+                itemBody += this.parse(item.tokens, loose);
+                body += this.renderer.listitem(itemBody, task, checked);
+              }
+
+              out += this.renderer.list(body, ordered, start);
+              continue;
+            }
+
+          case 'html':
+            {
+              // TODO parse inline content if parameter markdown=1
+              out += this.renderer.html(token.text);
+              continue;
+            }
+
+          case 'paragraph':
+            {
+              out += this.renderer.paragraph(this.parseInline(token.tokens));
+              continue;
+            }
+
+          case 'text':
+            {
+              body = token.tokens ? this.parseInline(token.tokens) : token.text;
+
+              while (i + 1 < l && tokens[i + 1].type === 'text') {
+                token = tokens[++i];
+                body += '\n' + (token.tokens ? this.parseInline(token.tokens) : token.text);
+              }
+
+              out += top ? this.renderer.paragraph(body) : body;
+              continue;
+            }
+
+          default:
+            {
+              var errMsg = 'Token with "' + token.type + '" type was not found.';
+
+              if (this.options.silent) {
+                console.error(errMsg);
+                return;
+              } else {
+                throw new Error(errMsg);
+              }
+            }
+        }
+      }
+
+      return out;
+    }
+    /**
+     * Parse Inline Tokens
+     */
+    ;
+
+    _proto.parseInline = function parseInline(tokens, renderer) {
+      renderer = renderer || this.renderer;
+      var out = '',
+          i,
+          token,
+          ret;
+      var l = tokens.length;
+
+      for (i = 0; i < l; i++) {
+        token = tokens[i]; // Run any renderer extensions
+
+        if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) {
+          ret = this.options.extensions.renderers[token.type].call(this, token);
+
+          if (ret !== false || !['escape', 'html', 'link', 'image', 'strong', 'em', 'codespan', 'br', 'del', 'text'].includes(token.type)) {
+            out += ret || '';
+            continue;
+          }
+        }
+
+        switch (token.type) {
+          case 'escape':
+            {
+              out += renderer.text(token.text);
+              break;
+            }
+
+          case 'html':
+            {
+              out += renderer.html(token.text);
+              break;
+            }
+
+          case 'link':
+            {
+              out += renderer.link(token.href, token.title, this.parseInline(token.tokens, renderer));
+              break;
+            }
+
+          case 'image':
+            {
+              out += renderer.image(token.href, token.title, token.text);
+              break;
+            }
+
+          case 'strong':
+            {
+              out += renderer.strong(this.parseInline(token.tokens, renderer));
+              break;
+            }
+
+          case 'em':
+            {
+              out += renderer.em(this.parseInline(token.tokens, renderer));
+              break;
+            }
+
+          case 'codespan':
+            {
+              out += renderer.codespan(token.text);
+              break;
+            }
+
+          case 'br':
+            {
+              out += renderer.br();
+              break;
+            }
+
+          case 'del':
+            {
+              out += renderer.del(this.parseInline(token.tokens, renderer));
+              break;
+            }
+
+          case 'text':
+            {
+              out += renderer.text(token.text);
+              break;
+            }
+
+          default:
+            {
+              var errMsg = 'Token with "' + token.type + '" type was not found.';
+
+              if (this.options.silent) {
+                console.error(errMsg);
+                return;
+              } else {
+                throw new Error(errMsg);
+              }
+            }
+        }
+      }
+
+      return out;
+    };
+
+    return Parser;
+  }();
+
+  var Lexer = Lexer_1;
+  var Parser = Parser_1;
+  var Tokenizer = Tokenizer_1;
+  var Renderer = Renderer_1;
+  var TextRenderer = TextRenderer_1;
+  var Slugger = Slugger_1;
+  var merge = helpers.merge,
+      checkSanitizeDeprecation = helpers.checkSanitizeDeprecation,
+      escape = helpers.escape;
+  var getDefaults = defaults$5.exports.getDefaults,
+      changeDefaults = defaults$5.exports.changeDefaults,
+      defaults = defaults$5.exports.defaults;
+  /**
+   * Marked
+   */
+
+  function marked(src, opt, callback) {
+    // throw error in case of non string input
+    if (typeof src === 'undefined' || src === null) {
+      throw new Error('marked(): input parameter is undefined or null');
+    }
+
+    if (typeof src !== 'string') {
+      throw new Error('marked(): input parameter is of type ' + Object.prototype.toString.call(src) + ', string expected');
+    }
+
+    if (typeof opt === 'function') {
+      callback = opt;
+      opt = null;
+    }
+
+    opt = merge({}, marked.defaults, opt || {});
+    checkSanitizeDeprecation(opt);
+
+    if (callback) {
+      var highlight = opt.highlight;
+      var tokens;
+
+      try {
+        tokens = Lexer.lex(src, opt);
+      } catch (e) {
+        return callback(e);
+      }
+
+      var done = function done(err) {
+        var out;
+
+        if (!err) {
+          try {
+            if (opt.walkTokens) {
+              marked.walkTokens(tokens, opt.walkTokens);
+            }
+
+            out = Parser.parse(tokens, opt);
+          } catch (e) {
+            err = e;
+          }
+        }
+
+        opt.highlight = highlight;
+        return err ? callback(err) : callback(null, out);
+      };
+
+      if (!highlight || highlight.length < 3) {
+        return done();
+      }
+
+      delete opt.highlight;
+      if (!tokens.length) return done();
+      var pending = 0;
+      marked.walkTokens(tokens, function (token) {
+        if (token.type === 'code') {
+          pending++;
+          setTimeout(function () {
+            highlight(token.text, token.lang, function (err, code) {
+              if (err) {
+                return done(err);
+              }
+
+              if (code != null && code !== token.text) {
+                token.text = code;
+                token.escaped = true;
+              }
+
+              pending--;
+
+              if (pending === 0) {
+                done();
+              }
+            });
+          }, 0);
+        }
+      });
+
+      if (pending === 0) {
+        done();
+      }
+
+      return;
+    }
+
+    try {
+      var _tokens = Lexer.lex(src, opt);
+
+      if (opt.walkTokens) {
+        marked.walkTokens(_tokens, opt.walkTokens);
+      }
+
+      return Parser.parse(_tokens, opt);
+    } catch (e) {
+      e.message += '\nPlease report this to https://github.com/markedjs/marked.';
+
+      if (opt.silent) {
+        return '<p>An error occurred:</p><pre>' + escape(e.message + '', true) + '</pre>';
+      }
+
+      throw e;
+    }
+  }
+  /**
+   * Options
+   */
+
+
+  marked.options = marked.setOptions = function (opt) {
+    merge(marked.defaults, opt);
+    changeDefaults(marked.defaults);
+    return marked;
+  };
+
+  marked.getDefaults = getDefaults;
+  marked.defaults = defaults;
+  /**
+   * Use Extension
+   */
+
+  marked.use = function () {
+    var _this = this;
+
+    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
+      args[_key] = arguments[_key];
+    }
+
+    var opts = merge.apply(void 0, [{}].concat(args));
+    var extensions = marked.defaults.extensions || {
+      renderers: {},
+      childTokens: {}
+    };
+    var hasExtensions;
+    args.forEach(function (pack) {
+      // ==-- Parse "addon" extensions --== //
+      if (pack.extensions) {
+        hasExtensions = true;
+        pack.extensions.forEach(function (ext) {
+          if (!ext.name) {
+            throw new Error('extension name required');
+          }
+
+          if (ext.renderer) {
+            // Renderer extensions
+            var prevRenderer = extensions.renderers ? extensions.renderers[ext.name] : null;
+
+            if (prevRenderer) {
+              // Replace extension with func to run new extension but fall back if false
+              extensions.renderers[ext.name] = function () {
+                for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
+                  args[_key2] = arguments[_key2];
+                }
+
+                var ret = ext.renderer.apply(this, args);
+
+                if (ret === false) {
+                  ret = prevRenderer.apply(this, args);
+                }
+
+                return ret;
+              };
+            } else {
+              extensions.renderers[ext.name] = ext.renderer;
+            }
+          }
+
+          if (ext.tokenizer) {
+            // Tokenizer Extensions
+            if (!ext.level || ext.level !== 'block' && ext.level !== 'inline') {
+              throw new Error("extension level must be 'block' or 'inline'");
+            }
+
+            if (extensions[ext.level]) {
+              extensions[ext.level].unshift(ext.tokenizer);
+            } else {
+              extensions[ext.level] = [ext.tokenizer];
+            }
+
+            if (ext.start) {
+              // Function to check for start of token
+              if (ext.level === 'block') {
+                if (extensions.startBlock) {
+                  extensions.startBlock.push(ext.start);
+                } else {
+                  extensions.startBlock = [ext.start];
+                }
+              } else if (ext.level === 'inline') {
+                if (extensions.startInline) {
+                  extensions.startInline.push(ext.start);
+                } else {
+                  extensions.startInline = [ext.start];
+                }
+              }
+            }
+          }
+
+          if (ext.childTokens) {
+            // Child tokens to be visited by walkTokens
+            extensions.childTokens[ext.name] = ext.childTokens;
+          }
+        });
+      } // ==-- Parse "overwrite" extensions --== //
+
+
+      if (pack.renderer) {
+        (function () {
+          var renderer = marked.defaults.renderer || new Renderer();
+
+          var _loop = function _loop(prop) {
+            var prevRenderer = renderer[prop]; // Replace renderer with func to run extension, but fall back if false
+
+            renderer[prop] = function () {
+              for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
+                args[_key3] = arguments[_key3];
+              }
+
+              var ret = pack.renderer[prop].apply(renderer, args);
+
+              if (ret === false) {
+                ret = prevRenderer.apply(renderer, args);
+              }
+
+              return ret;
+            };
+          };
+
+          for (var prop in pack.renderer) {
+            _loop(prop);
+          }
+
+          opts.renderer = renderer;
+        })();
+      }
+
+      if (pack.tokenizer) {
+        (function () {
+          var tokenizer = marked.defaults.tokenizer || new Tokenizer();
+
+          var _loop2 = function _loop2(prop) {
+            var prevTokenizer = tokenizer[prop]; // Replace tokenizer with func to run extension, but fall back if false
+
+            tokenizer[prop] = function () {
+              for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
+                args[_key4] = arguments[_key4];
+              }
+
+              var ret = pack.tokenizer[prop].apply(tokenizer, args);
+
+              if (ret === false) {
+                ret = prevTokenizer.apply(tokenizer, args);
+              }
+
+              return ret;
+            };
+          };
+
+          for (var prop in pack.tokenizer) {
+            _loop2(prop);
+          }
+
+          opts.tokenizer = tokenizer;
+        })();
+      } // ==-- Parse WalkTokens extensions --== //
+
+
+      if (pack.walkTokens) {
+        var walkTokens = marked.defaults.walkTokens;
+
+        opts.walkTokens = function (token) {
+          pack.walkTokens.call(_this, token);
+
+          if (walkTokens) {
+            walkTokens(token);
+          }
+        };
+      }
+
+      if (hasExtensions) {
+        opts.extensions = extensions;
+      }
+
+      marked.setOptions(opts);
+    });
+  };
+  /**
+   * Run callback for every token
+   */
+
+
+  marked.walkTokens = function (tokens, callback) {
+    var _loop3 = function _loop3() {
+      var token = _step.value;
+      callback(token);
+
+      switch (token.type) {
+        case 'table':
+          {
+            for (var _iterator2 = _createForOfIteratorHelperLoose(token.tokens.header), _step2; !(_step2 = _iterator2()).done;) {
+              var cell = _step2.value;
+              marked.walkTokens(cell, callback);
+            }
+
+            for (var _iterator3 = _createForOfIteratorHelperLoose(token.tokens.cells), _step3; !(_step3 = _iterator3()).done;) {
+              var row = _step3.value;
+
+              for (var _iterator4 = _createForOfIteratorHelperLoose(row), _step4; !(_step4 = _iterator4()).done;) {
+                var _cell = _step4.value;
+                marked.walkTokens(_cell, callback);
+              }
+            }
+
+            break;
+          }
+
+        case 'list':
+          {
+            marked.walkTokens(token.items, callback);
+            break;
+          }
+
+        default:
+          {
+            if (marked.defaults.extensions && marked.defaults.extensions.childTokens && marked.defaults.extensions.childTokens[token.type]) {
+              // Walk any extensions
+              marked.defaults.extensions.childTokens[token.type].forEach(function (childTokens) {
+                marked.walkTokens(token[childTokens], callback);
+              });
+            } else if (token.tokens) {
+              marked.walkTokens(token.tokens, callback);
+            }
+          }
+      }
+    };
+
+    for (var _iterator = _createForOfIteratorHelperLoose(tokens), _step; !(_step = _iterator()).done;) {
+      _loop3();
+    }
+  };
+  /**
+   * Parse Inline
+   */
+
+
+  marked.parseInline = function (src, opt) {
+    // throw error in case of non string input
+    if (typeof src === 'undefined' || src === null) {
+      throw new Error('marked.parseInline(): input parameter is undefined or null');
+    }
+
+    if (typeof src !== 'string') {
+      throw new Error('marked.parseInline(): input parameter is of type ' + Object.prototype.toString.call(src) + ', string expected');
+    }
+
+    opt = merge({}, marked.defaults, opt || {});
+    checkSanitizeDeprecation(opt);
+
+    try {
+      var tokens = Lexer.lexInline(src, opt);
+
+      if (opt.walkTokens) {
+        marked.walkTokens(tokens, opt.walkTokens);
+      }
+
+      return Parser.parseInline(tokens, opt);
+    } catch (e) {
+      e.message += '\nPlease report this to https://github.com/markedjs/marked.';
+
+      if (opt.silent) {
+        return '<p>An error occurred:</p><pre>' + escape(e.message + '', true) + '</pre>';
+      }
+
+      throw e;
+    }
+  };
+  /**
+   * Expose
+   */
+
+
+  marked.Parser = Parser;
+  marked.parser = Parser.parse;
+  marked.Renderer = Renderer;
+  marked.TextRenderer = TextRenderer;
+  marked.Lexer = Lexer;
+  marked.lexer = Lexer.lex;
+  marked.Tokenizer = Tokenizer;
+  marked.Slugger = Slugger;
+  marked.parse = marked;
+  var marked_1 = marked;
+
+  return marked_1;
+
+})));
diff --git a/Source/platformProject/platform2022UI/jslib/markdown/monokai_sublime.min.css b/Source/platformProject/platform2022UI/jslib/markdown/monokai_sublime.min.css
new file mode 100644
index 0000000..124b4e2
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/markdown/monokai_sublime.min.css
@@ -0,0 +1 @@
+.hljs{display:block;padding:.5em;background:#23241f}.hljs,.hljs-tag,.css .hljs-rules,.css .hljs-value,.css .hljs-function .hljs-preprocessor,.hljs-pragma{color:#f8f8f2}.hljs-strongemphasis,.hljs-strong,.hljs-emphasis{color:#a8a8a2}.hljs-bullet,.hljs-blockquote,.hljs-horizontal_rule,.hljs-number,.hljs-regexp,.alias .hljs-keyword,.hljs-literal,.hljs-hexcolor{color:#ae81ff}.hljs-tag .hljs-value,.hljs-code,.hljs-title,.css .hljs-class,.hljs-class .hljs-title:last-child{color:#a6e22e}.hljs-link_url{font-size:80%}.hljs-strong,.hljs-strongemphasis{font-weight:bold}.hljs-emphasis,.hljs-strongemphasis,.hljs-class .hljs-title:last-child{font-style:italic}.hljs-keyword,.hljs-function,.hljs-change,.hljs-winutils,.hljs-flow,.lisp .hljs-title,.clojure .hljs-built_in,.nginx .hljs-title,.tex .hljs-special,.hljs-header,.hljs-attribute,.hljs-symbol,.hljs-symbol .hljs-string,.hljs-tag .hljs-title,.hljs-value,.alias .hljs-keyword:first-child,.css .hljs-tag,.css .unit,.css .hljs-important{color:#f92672}.hljs-function .hljs-keyword,.hljs-class .hljs-keyword:first-child,.hljs-constant,.css .hljs-attribute{color:#66d9ef}.hljs-variable,.hljs-params,.hljs-class .hljs-title{color:#f8f8f2}.hljs-string,.css .hljs-id,.hljs-subst,.haskell .hljs-type,.ruby .hljs-class .hljs-parent,.hljs-built_in,.sql .hljs-aggregate,.django .hljs-template_tag,.django .hljs-variable,.smalltalk .hljs-class,.django .hljs-filter .hljs-argument,.smalltalk .hljs-localvars,.smalltalk .hljs-array,.hljs-attr_selector,.hljs-pseudo,.hljs-addition,.hljs-stream,.hljs-envvar,.apache .hljs-tag,.apache .hljs-cbracket,.tex .hljs-command,.hljs-prompt,.hljs-link_label,.hljs-link_url{color:#e6db74}.hljs-comment,.hljs-javadoc,.java .hljs-annotation,.python .hljs-decorator,.hljs-template_comment,.hljs-pi,.hljs-doctype,.hljs-deletion,.hljs-shebang,.apache .hljs-sqbracket,.tex .hljs-formula{color:#75715e}.coffeescript .javascript,.javascript .xml,.tex .hljs-formula,.xml .javascript,.xml .vbscript,.xml .css,.xml .hljs-cdata,.xml .php,.php .xml{opacity:.5}
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/metaQueryForIe8/htm5.min.js b/Source/platformProject/platform2022UI/jslib/metaQueryForIe8/htm5.min.js
new file mode 100644
index 0000000..1bb7e80
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/metaQueryForIe8/htm5.min.js
@@ -0,0 +1 @@
+(function(e,t){function n(e,t){var n=e.createElement("p"),i=e.getElementsByTagName("head")[0]||e.documentElement;return n.innerHTML="x<style>"+t+"</style>",i.insertBefore(n.lastChild,i.firstChild)}function i(){var e=m.elements;return"string"==typeof e?e.split(" "):e}function r(e){var t={},n=e.createElement,r=e.createDocumentFragment,o=r();e.createElement=function(e){m.shivMethods||n(e);var i;return i=t[e]?t[e].cloneNode():g.test(e)?(t[e]=n(e)).cloneNode():n(e),i.canHaveChildren&&!f.test(e)?o.appendChild(i):i},e.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+i().join().replace(/\w+/g,function(e){return t[e]=n(e),o.createElement(e),'c("'+e+'")'})+");return n}")(m,o)}function o(e){var t;return e.documentShived?e:(m.shivCSS&&!d&&(t=!!n(e,"article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio{display:none}canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden]{display:none}audio[controls]{display:inline-block;*display:inline;*zoom:1}mark{background:#FF0;color:#000}")),h||(t=!r(e)),t&&(e.documentShived=t),e)}function a(e){for(var t,n=e.getElementsByTagName("*"),r=n.length,o=RegExp("^(?:"+i().join("|")+")$","i"),a=[];r--;)t=n[r],o.test(t.nodeName)&&a.push(t.applyElement(s(t)));return a}function s(e){for(var t,n=e.attributes,i=n.length,r=e.ownerDocument.createElement(b+":"+e.nodeName);i--;)t=n[i],t.specified&&r.setAttribute(t.nodeName,t.nodeValue);return r.style.cssText=e.style.cssText,r}function l(e){for(var t,n=e.split("{"),r=n.length,o=RegExp("(^|[\\s,>+~])("+i().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),a="$1"+b+"\\:$2";r--;)t=n[r]=n[r].split("}"),t[t.length-1]=t[t.length-1].replace(o,a),n[r]=t.join("}");return n.join("{")}function c(e){for(var t=e.length;t--;)e[t].removeNode()}function u(e){var t,i,r=e.namespaces,o=e.parentWindow;return!y||e.printShived?e:(r[b]===void 0&&r.add(b),o.attachEvent("onbeforeprint",function(){for(var r,o,s,c=e.styleSheets,u=[],d=c.length,h=Array(d);d--;)h[d]=c[d];for(;s=h.pop();)if(!s.disabled&&v.test(s.media)){for(r=s.imports,d=0,o=r.length;o>d;d++)h.push(r[d]);try{u.push(s.cssText)}catch(p){}}u=l(u.reverse().join("")),i=a(e),t=n(e,u)}),o.attachEvent("onafterprint",function(){c(i),t.removeNode(!0)}),e.printShived=!0,e)}var d,h,p=e.html5||{},f=/^<|^(?:button|form|map|select|textarea|object|iframe)$/i,g=/^<|^(?:a|b|button|code|div|fieldset|form|h1|h2|h3|h4|h5|h6|i|iframe|img|input|label|li|link|ol|option|p|param|q|script|select|span|strong|style|table|tbody|td|textarea|tfoot|th|thead|tr|ul)$/i;(function(){var n=t.createElement("a");n.innerHTML="<xyz></xyz>",d="hidden"in n,d&&"function"==typeof injectElementWithStyles&&injectElementWithStyles("#modernizr{}",function(t){t.hidden=!0,d="none"==(e.getComputedStyle?getComputedStyle(t,null):t.currentStyle).display}),h=1==n.childNodes.length||function(){try{t.createElement("a")}catch(e){return!0}var n=t.createDocumentFragment();return n.cloneNode===void 0||n.createDocumentFragment===void 0||n.createElement===void 0}()})();var m={elements:p.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video",shivCSS:p.shivCSS!==!1,shivMethods:p.shivMethods!==!1,type:"default",shivDocument:o};e.html5=m,o(t);var v=/^$|\b(?:all|print)\b/,b="html5shiv",y=!h&&function(){var n=t.documentElement;return t.namespaces!==void 0&&t.parentWindow!==void 0&&n.applyElement!==void 0&&n.removeNode!==void 0&&e.attachEvent!==void 0}();m.type+=" print",m.shivPrint=u,u(t)})(this,document);
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/metaQueryForIe8/respond.min.js b/Source/platformProject/platform2022UI/jslib/metaQueryForIe8/respond.min.js
new file mode 100644
index 0000000..80a7b69
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/metaQueryForIe8/respond.min.js
@@ -0,0 +1,5 @@
+/*! Respond.js v1.4.2: min/max-width media query polyfill * Copyright 2013 Scott Jehl
+ * Licensed under https://github.com/scottjehl/Respond/blob/master/LICENSE-MIT
+ *  */
+
+!function(a){"use strict";a.matchMedia=a.matchMedia||function(a){var b,c=a.documentElement,d=c.firstElementChild||c.firstChild,e=a.createElement("body"),f=a.createElement("div");return f.id="mq-test-1",f.style.cssText="position:absolute;top:-100em",e.style.background="none",e.appendChild(f),function(a){return f.innerHTML='&shy;<style media="'+a+'"> #mq-test-1 { width: 42px; }</style>',c.insertBefore(e,d),b=42===f.offsetWidth,c.removeChild(e),{matches:b,media:a}}}(a.document)}(this),function(a){"use strict";function b(){u(!0)}var c={};a.respond=c,c.update=function(){};var d=[],e=function(){var b=!1;try{b=new a.XMLHttpRequest}catch(c){b=new a.ActiveXObject("Microsoft.XMLHTTP")}return function(){return b}}(),f=function(a,b){var c=e();c&&(c.open("GET",a,!0),c.onreadystatechange=function(){4!==c.readyState||200!==c.status&&304!==c.status||b(c.responseText)},4!==c.readyState&&c.send(null))};if(c.ajax=f,c.queue=d,c.regex={media:/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,keyframes:/@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,urls:/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,findStyles:/@media *([^\{]+)\{([\S\s]+?)$/,only:/(only\s+)?([a-zA-Z]+)\s?/,minw:/\([\s]*min\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/,maxw:/\([\s]*max\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/},c.mediaQueriesSupported=a.matchMedia&&null!==a.matchMedia("only all")&&a.matchMedia("only all").matches,!c.mediaQueriesSupported){var g,h,i,j=a.document,k=j.documentElement,l=[],m=[],n=[],o={},p=30,q=j.getElementsByTagName("head")[0]||k,r=j.getElementsByTagName("base")[0],s=q.getElementsByTagName("link"),t=function(){var a,b=j.createElement("div"),c=j.body,d=k.style.fontSize,e=c&&c.style.fontSize,f=!1;return b.style.cssText="position:absolute;font-size:1em;width:1em",c||(c=f=j.createElement("body"),c.style.background="none"),k.style.fontSize="100%",c.style.fontSize="100%",c.appendChild(b),f&&k.insertBefore(c,k.firstChild),a=b.offsetWidth,f?k.removeChild(c):c.removeChild(b),k.style.fontSize=d,e&&(c.style.fontSize=e),a=i=parseFloat(a)},u=function(b){var c="clientWidth",d=k[c],e="CSS1Compat"===j.compatMode&&d||j.body[c]||d,f={},o=s[s.length-1],r=(new Date).getTime();if(b&&g&&p>r-g)return a.clearTimeout(h),h=a.setTimeout(u,p),void 0;g=r;for(var v in l)if(l.hasOwnProperty(v)){var w=l[v],x=w.minw,y=w.maxw,z=null===x,A=null===y,B="em";x&&(x=parseFloat(x)*(x.indexOf(B)>-1?i||t():1)),y&&(y=parseFloat(y)*(y.indexOf(B)>-1?i||t():1)),w.hasquery&&(z&&A||!(z||e>=x)||!(A||y>=e))||(f[w.media]||(f[w.media]=[]),f[w.media].push(m[w.rules]))}for(var C in n)n.hasOwnProperty(C)&&n[C]&&n[C].parentNode===q&&q.removeChild(n[C]);n.length=0;for(var D in f)if(f.hasOwnProperty(D)){var E=j.createElement("style"),F=f[D].join("\n");E.type="text/css",E.media=D,q.insertBefore(E,o.nextSibling),E.styleSheet?E.styleSheet.cssText=F:E.appendChild(j.createTextNode(F)),n.push(E)}},v=function(a,b,d){var e=a.replace(c.regex.keyframes,"").match(c.regex.media),f=e&&e.length||0;b=b.substring(0,b.lastIndexOf("/"));var g=function(a){return a.replace(c.regex.urls,"$1"+b+"$2$3")},h=!f&&d;b.length&&(b+="/"),h&&(f=1);for(var i=0;f>i;i++){var j,k,n,o;h?(j=d,m.push(g(a))):(j=e[i].match(c.regex.findStyles)&&RegExp.$1,m.push(RegExp.$2&&g(RegExp.$2))),n=j.split(","),o=n.length;for(var p=0;o>p;p++)k=n[p],l.push({media:k.split("(")[0].match(c.regex.only)&&RegExp.$2||"all",rules:m.length-1,hasquery:k.indexOf("(")>-1,minw:k.match(c.regex.minw)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:k.match(c.regex.maxw)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}u()},w=function(){if(d.length){var b=d.shift();f(b.href,function(c){v(c,b.href,b.media),o[b.href]=!0,a.setTimeout(function(){w()},0)})}},x=function(){for(var b=0;b<s.length;b++){var c=s[b],e=c.href,f=c.media,g=c.rel&&"stylesheet"===c.rel.toLowerCase();e&&g&&!o[e]&&(c.styleSheet&&c.styleSheet.rawCssText?(v(c.styleSheet.rawCssText,e,f),o[e]=!0):(!/^([a-zA-Z:]*\/\/)/.test(e)&&!r||e.replace(RegExp.$1,"").split("/")[0]===a.location.host)&&("//"===e.substring(0,2)&&(e=a.location.protocol+e),d.push({href:e,media:f})))}w()};x(),c.update=x,c.getEmValue=t,a.addEventListener?a.addEventListener("resize",b,!1):a.attachEvent&&a.attachEvent("onresize",b)}}(this);
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/vcijs/admin.js b/Source/platformProject/platform2022UI/jslib/vcijs/admin.js
new file mode 100644
index 0000000..eedfafc
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/vcijs/admin.js
@@ -0,0 +1,285 @@
+//澶勭悊鐧诲綍椤甸潰鐨勭浉鍏冲姩浣�
+//weidy@2013-08-01
+
+var path = "";//鍚庡彴璺緞
+var configData = {};
+var browserInfo = null;
+var processStep = 0;
+var processInterval = null;
+var usedTime = 0;
+var projectName = "";
+var pathName = "";
+var jq = null;
+$(document).ready(function() {
+	jq = $;
+	// 鍏堝垽鏂祻瑙堝櫒鐗堟湰
+	browserInfo = checkBrowser();
+	pathName = window.document.location.pathname;
+    projectName = pathName.substring(0, pathName.substr(1).indexOf('/') + 1) + "/";
+	//澶勭悊椤甸潰鐨勫唴瀹�
+	getConfig(function(){
+        initDefaultConfig();
+		//checkIsLogin(function(){
+			initPage();//鑾峰彇閰嶇疆鍚庯紝妫�鏌ユ槸鍚﹀凡缁忕櫥褰曡繃锛屽鏋滄病鏈夌櫥褰曞垯鍦ㄥ垵濮嬪寲椤甸潰鐨勫唴瀹�
+		//});
+	});
+});
+function getConfig(callback){
+	$.getJSON(projectName + "config.json?v=" +  (new Date()).getTime(),function(data){
+		configData = data;
+		if(configData.isDebug == "true" || configData.isDebug == true){
+            path = configData.backPath;
+        }else{
+			path = projectName;
+			if(configData.compatibility) {
+				if (pathName.indexOf("/") > -1) {
+					if(""!=configData.unCorsPath){
+						path = path.substring(0, path.lastIndexOf("/")) + "/" + configData.unCorsPath + "/";
+					}else{
+						path = path.substring(0, path.lastIndexOf("/")) + "/";
+					}
+				}
+			}
+		}
+		if(callback){
+			callback();
+		}
+	});
+}
+
+function initDefaultConfig(){
+    if(!configData.backgroundimg ){
+        configData.backgroundimg = "style/images/base/login/background-classic.png";
+    }
+    if(!configData.defaultPhoto){
+        configData.defaultPhoto = "style/images/base/login/userphotoman.png";
+    }
+    if(!configData.loginUrl){
+        configData.loginUrl = "framework/loginController/login";
+	}
+	if(!configData.sessionInfoUrl){
+        configData.sessionInfoUrl = "framework/loginController/getSessionInfo";
+	}
+    if(!configData.logoutUrl){
+        configData.logoutUrl = "framework/loginController/logout";
+    }
+}
+
+function initPage(){
+    $(document).attr("title",configData.title + "--鐩戞帶涓績鏈嶅姟");
+	$("#background img").attr("src", projectName + configData.backgroundimg );
+	if ($.cookie('useridcookie') != null && $.cookie('useridcookie') != "" && $.cookie('useridcookie') != "null") {
+        $("#userid").val($.cookie('useridcookie'));
+    }
+	//娓呴櫎閿佸畾绐楀彛鐨刢ookie
+	$.cookie("isLockWindow", "false");
+	$.cookie('AuthorizationToken','',{path:"/"});
+	//璁剧疆鐢ㄦ埛鐨勫ご鍍�
+	if($.cookie('userphotocookie') != null && $.cookie('userphotocookie') != "" && $.cookie('userphotocookie') != "null"){
+		$("#userPhoto").attr("src",projectName + $.cookie('userphotocookie'));
+	}else{
+		$("#userPhoto").attr("src",projectName  + configData.defaultPhoto);
+	}
+	$("#loginbt").click(function() {
+		if (checkEmpty())// 鍏堟鏌ユ槸鍚︿负绌�
+			login();
+	});
+	// 鍦ㄥ瘑鐮佹涓婄偣鍑讳簡鍥炶溅閿�
+	$("#password").bind("keydown", function(e) {
+		var key = e.which;
+		if (key == 13){// 鎸変笅鍥炶溅閿畕
+			if (checkEmpty())// 鍏堟鏌ユ槸鍚︿负绌�
+				login();
+		}
+	});
+	if(configData.unSecret){
+		$("#secretFlag").show();
+		$("#secretFlag").html(configData.unSecretText);
+	}
+}
+
+function checkIsLogin(callback){
+	crosPost(configData.sessionInfoUrl,{},function(result){
+		//濡傛灉鍦ㄧ嚎锛岄偅鐩存帴鎻愮ず鐢ㄦ埛鏄惁瑕佺户缁�
+		if(result.success){
+			$webUtil.deptOid = result.obj.deptOid; // 淇濆瓨鐢ㄦ埛閮ㄩ棬Oid
+			var sessionInfo = result.obj;
+			if (window.confirm('褰撳墠娴忚鍣ㄤ腑宸茬粡浣跨敤[' + sessionInfo.userName + ']鐧诲綍浜嗭紝濡傛灉鎮ㄧ幇鍦ㄨ浣跨敤鍒殑璐︽埛鐧诲綍锛�'
+					+ sessionInfo.userName + '灏嗕細鑷姩娉ㄩ攢,鎮ㄦ槸鍚﹁缁х画锛�')) {
+				crosPost(configData.logoutUrl,{"userid":sessionInfo.userId},function(result){
+					window.location.href = window.location.href;
+				},function(xhr,error){
+					window.location.href = window.location.href;
+				});
+			} else {
+				if(browserInfo.browser == "IE"){
+					window.open(",鈥檁parent鈥�,");
+					window.close();
+				}else{
+					try{
+						window.opener = null;
+						window.open('', '_self');
+					}catch(e){
+						window.close();
+					}
+				}
+			}
+		}else{
+			if(callback){
+				callback();
+			}
+		}
+	},function(xhr,error){
+		if(callback){
+			callback();
+		}
+	});
+}
+
+function crosPost(url1,data,callback,errorCallback){
+	var url = "";
+	if(configData.isDebug == "true" || configData.isDebug == true){
+		url = configData.adminServicePath + url1;
+	}else{
+		url = path + url1;
+	}
+	var ajaxOperation ={
+        type:'post',
+        url:url,
+        data:data,
+        success:function(data){
+            var result = data;
+            if(callback){
+                callback(result);
+            }
+        },
+        error:function(xhr,error){
+            if(errorCallback){
+                errorCallback(xhr,error);
+            }
+        }
+    };
+	if(configData.isDebug){
+		jQuery.support.cors=true;
+	}
+	jq.ajax(ajaxOperation);
+}
+
+// 妫�鏌ョ敤鎴峰悕鍜屽瘑鐮佹槸鍚︿负绌�
+function checkEmpty() {
+	if (($("#userid").val() == "") && ($("#password").val() == "")) {
+		showError("鐧诲綍璐﹀彿鍜屽瘑鐮佷笉鑳戒负绌�");
+		return false;
+	} else if ($("#userid").val() == "") {
+		showError("鐧诲綍璐﹀彿涓嶈兘涓虹┖");
+		return false;
+	} else if ($("#password").val() == "") {
+		showError("瀵嗙爜涓嶈兘涓虹┖");
+		return false;
+	} else
+		return true;
+}
+
+// 鏄剧ず閿欒
+function showError(text) {
+	$("#msg").html( text);
+	hideError(5000);
+}
+
+// 閿欒鏄剧ずdiv闅愯棌鍊�
+function hideError(time) {
+	window.setTimeout(function() {
+		$("#msg").html("");
+	}, time);
+}
+
+// 鐧诲綍
+function login() {
+	$("#loginbt").attr("disabled", true);
+	var userid = $("#userid").val();
+	if($("#isForceLogin").attr("checked") == "checked"){
+		$.cookie('useridcookie',userid,{expires:30});
+	}else{
+		$.cookie('useridcookie',null);
+	}
+	//var password = MD5($("#password").val());
+	//鏂板钩鍙板凡缁忔敮鎸乵d5鍔犲瘑浜�
+	var password = MD5($("#password").val());
+	var isForceLogin = $("#isForceLogin").is(":checked");
+	showLoading();
+	var loginData = {
+		userId : userid,
+		password : password,
+		forceLogin : isForceLogin,
+		browser:browserInfo.browser,
+		browserversion:browserInfo.browserversion,
+		osversion: browserInfo.osversion 
+	};
+	//鍥犱负姣忎釜椤圭洰锛屽湪鐧诲綍鍚庤幏鍙栫殑鍐呭鍙兘浼氭湁涓嶄竴鏍凤紝鎵�浠ョ櫥褰曠殑璺緞鏀寔閰嶇疆configData.loginUrl
+	crosPost("loginForAdmin/login",loginData,function(result){
+		hideLoading();
+		if(result == undefined || result == null){
+			showError("鐧诲綍鍑虹幇浜嗛敊璇紒璇锋煡鐪嬫湇鍔″櫒鏄惁寮�鍚�");
+			$("#loginbt").attr("disabled", false);
+		}	
+		if (result.success){
+			$.cookie('AuthorizationToken',result.obj.sessionInfo.token,{path:"/"});
+			createCookie('AuthorizationToken',result.obj.sessionInfo.token);
+			if(configData.mainDisplay == "open" && browserInfo.browser == 'IE'){
+				window.open(projectName + "mainAdmin.html",'_blank','menubar=no,fullscreen=1,toolbar=no,resizable=no,location=no,status=no');
+				window.close();
+			}else {
+				window.location.href = projectName + "mainAdmin.html";
+			}
+		}else {
+			showError(result.msg);
+			$("#loginbt").attr("disabled", false);
+		}
+	},function(xhr,error){
+		hideLoading();
+		showError(error); 
+	});
+}
+
+function createCookie(name,value,days) {
+	if (days) {
+		var date = new Date();
+		date.setTime(date.getTime()+(days*24*60*60*1000));
+		var expires = "; expires="+date.toGMTString();
+	} else{
+		expires = "";
+	}
+	document.cookie = name+"="+value+expires+"; path=/";
+}
+
+function showLoading(){
+	$(".loadbg").show();
+	$(".processbar").show();
+	$(".loading").show();
+	var preWidth = $(".loading").css("width");
+	if(preWidth.indexOf("px")>-1){
+		preWidth = preWidth.replace("px","");
+	}
+	preWidth = preWidth*1/10;
+	processInterval = window.setInterval(function(){
+		$("#useTime").html(usedTime + 1);
+		$(".processbar").css("width",preWidth*(processStep+1));
+		usedTime ++;
+		processStep ++ ;
+	    if(processStep == 10){
+	    	processStep = 0;
+	    }
+	},1000);
+}
+function hideLoading(){
+	$(".loadbg").hide();
+	$(".processbar").hide();
+	$(".loading").hide();
+    processStep = 0;
+    usedTime =0;
+	if(processInterval != null){
+		window.clearInterval(processInterval);
+	}
+}
+
+
diff --git a/Source/platformProject/platform2022UI/jslib/vcijs/adminMain.js b/Source/platformProject/platform2022UI/jslib/vcijs/adminMain.js
new file mode 100644
index 0000000..3ec10a2
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/vcijs/adminMain.js
@@ -0,0 +1,228 @@
+var path = "";
+var configData = {};
+var portal = null;
+var usedTime = 0;
+var projectName = "";
+var processInterval = null;
+var isDebug = true;
+var $webUtil = null;
+var pathName = "";
+var themeName = "";
+var TOKEN_KEY = "AuthorizationToken";
+
+var emptyFunction = function(){};
+var mySessionInfo = {};
+	$(document).ready(function(){
+
+		$.ajaxSetup({
+			cache:false,
+			xhr: function() {
+				if (window.ActiveXObject) {
+					return new window.ActiveXObject("Microsoft.XMLHTTP");
+				} else {
+					return new window.XMLHttpRequest();
+				}
+			}
+		});
+		pathName = window.document.location.pathname;
+	    projectName = pathName.substring(0, pathName.substr(1).indexOf('/') + 1) + "/";
+		getConfig(function(){
+            initDefaultConfig();
+			checkIsLogin(function(sessionInfo){
+				loadJs(sessionInfo);//鑾峰彇閰嶇疆鍚庯紝鍒ゆ柇鏄惁鐧诲綍-娌℃湁鐧诲綍璺宠浆鍒扮櫥褰曢〉锛岀櫥褰曞悗鍒濆鍖栭〉闈�
+			});
+		});
+	});
+	function getConfig(callback){
+		$.getJSON(projectName + "config.json?v=" +  (new Date()).getTime(),function(data){
+			configData = data;
+			$webUtil = new vciWebUtil();
+			if(configData.isDebug == "true" || configData.isDebug == true){
+				path = configData.backPath;
+			}else{
+				path = projectName;
+				if(configData.compatibility) {
+					if (pathName.indexOf("/") > -1) {
+						if(""!=configData.unCorsPath){
+							path = path.substring(0, path.lastIndexOf("/")) + "/" + configData.unCorsPath + "/";
+						}else{
+							path = path.substring(0, path.lastIndexOf("/")) + "/";
+						}
+					}
+				}
+			}
+		    isDebug = configData.isDebug;
+			if(callback){
+				callback();
+			}
+		});
+	}
+
+	function initDefaultConfig() {
+		if (!configData.backgroundimg) {
+			configData.backgroundimg = "style/images/index/login/background-gray.png";
+		}
+		if (!configData.defaultPhoto) {
+			configData.defaultPhoto = "style/images/index/login/userphotoman.png";
+		}
+		if (!configData.loginUrl) {
+			configData.loginUrl = "framework/loginController/login";
+		}
+		configData.sessionInfoUrl = "loginForAdmin/getSessionInfo";
+		if (!configData.logoutUrl) {
+			configData.logoutUrl = "framework/loginController/logout";
+		}
+		if (!configData.objectServicePath) {
+			configData.objectServicePath = path + "objectService/";
+		}
+		if (!configData.frameworkPath) {
+			configData.frameworkPath = path + "framework/";
+		}
+	}
+	function checkIsLogin(callback){
+		var token =$.cookie(TOKEN_KEY);
+		if($webUtil.isNull(token)){
+			//鍏煎IE6
+			token = readCookie(TOKEN_KEY);
+			if($webUtil.isNull(token)) {
+				doNoLogin();
+				return false;
+			}
+		}
+		jQuery.support.cors = true;
+		$webUtil.post('loginForAdmin/getSessionInfo2',{},function(result){
+			//濡傛灉鍦ㄧ嚎锛岄偅鐩存帴鎻愮ず鐢ㄦ埛鏄惁瑕佺户缁�
+			if(result.success){
+				if(callback){
+					callback(result.obj);
+				}
+			}else{
+				doNoLogin();
+			}
+		},function(xhr,error){
+			alert(error);
+			//doNoLogin();
+		},(configData.isDebug == "true" || configData.isDebug == true)?configData.adminServicePath:path);
+	}
+	function doNoLogin(){//鏈櫥褰曠殑澶勭悊鏂瑰紡
+		$("#noLogin").show();
+		$("#noLoginInfo").html("鎮ㄦ病鏈夌櫥褰曪紝灏嗗湪5绉掑悗鑷姩璺宠浆鍒扮櫥褰曢〉闈�");
+		processInterval = window.setInterval(function(){
+			usedTime ++;
+			if(usedTime == 5){
+				window.clearInterval(processInterval);
+				window.location.href = projectName + "indexAdmin.html";
+			}else{
+				$("#noLoginInfo").html("鎮ㄦ病鏈夌櫥褰曪紝灏嗗湪" + (5-usedTime) + "绉掑悗鑷姩璺宠浆鍒扮櫥褰曢〉闈�");
+			}
+		},1000);
+	}
+	function loadJs(sessionInfo){
+		for(var cssName in configData.loadCss){
+			if("gaodeMapCss" != cssName || configData.isOpenMap || ("gaodeMapCss" == cssName && configData.isOpenMap)){
+				$("head").append('<link href="'  + projectName + configData.loadCss[cssName] + '"  rel="stylesheet" type="text/css" />');//娣诲姞css寮曠敤
+			}
+		}
+		//鍔犺浇js鏂囦欢
+		for(var jsName in configData.loadJs){
+			if("gaodeMapjs" != jsName || configData.isOpenMap || ("gaodeMapjs" == jsName && configData.isOpenMap)){
+				var jsUrl = projectName + configData.loadJs[jsName];
+				if("gaodeMapjs" == jsName){
+					jsUrl = jsUrl + "&key=" + configData.gaodeMapKey;
+				}
+				$("head").append('<script src="' +jsUrl + '" type="text/javascript" charset="UTF-8"></script>');
+			}
+		}
+		initData(sessionInfo);
+	}
+
+
+	function readCookie(name) {
+		var nameEQ = name + "=";
+		var ca = document.cookie.split(';');
+		for(var i=0;i < ca.length;i++) {
+			var c = ca[i];
+			while (c.charAt(0)==' '){
+				c = c.substring(1,c.length);
+			}
+			if (c.indexOf(nameEQ) == 0) {
+				return c.substring(nameEQ.length,c.length)
+			}
+		}
+		return false;
+	}
+	
+	function initData(sessionInfo){
+		document.title = configData.title;//璁剧疆鏍囬--涓嶈兘浣跨敤jquery閲岀殑attr鏂规硶
+		//鑾峰彇涓婚
+		themeName = $.cookie('vciWebThemeName');
+		if(themeName == null || themeName == "" || themeName =="null"){
+			themeName = "black"; 
+		}
+		$.cookie('userphotocookie',sessionInfo.photoUrl);
+		mySessionInfo = sessionInfo;
+		if($webUtil.isNotNull(sessionInfo.photoUrl)){
+			configData.vciWebPortal.mainConfig.userCenterSrc = sessionInfo.photoUrl
+		}
+		//瀵煎叆閰嶇疆
+		layui.config({
+			base:projectName +configData.webJsLib,
+			version:configData.jsversion
+		});
+		layui.isDebug = isDebug;
+		configData.mesPath = configData.mes182Path;
+		//鍒濆鍖栦富椤�
+		layui.use(['vciAlias'],function(){
+			var alias = layui.vciAlias;
+			alias.configAlias();
+            layui.use(['platform/monitor/VciMonitorMain','vciWebPortal'], function () {
+				portal = layui.vciWebPortal;
+				portal.sessionInfo = mySessionInfo;
+				portal.themeName = themeName;
+				portal.loginUrl = configData.loginUrl;
+				if(!configData.isDebug && configData.compatibility){
+					configData.adminServicePath = path;
+				}
+				configData.logoutUrl = configData.adminServicePath + "loginForAdmin/logout";
+				var webMenu = layui.vciWebMenu;
+				webMenu.menuUlId = 'portal_menu_tree';
+				webMenu.backPath = configData.adminServicePath;
+				webMenu.menuClickListener = function (id, menuObject, isFav) {
+					portal.showTabByMenu(id, menuObject);
+				};
+				webMenu.init();
+				portal.webMenu = webMenu;
+				portal.element = layui.element;
+				webMenu.buildAllListener();
+				$(".vciWebMenuLeaf").eq(0).trigger('click')
+				portal.element.init();//鍒锋柊鎵�鏈夌殑鍏冪礌
+				portal.element.on('tabDelete(' + portal.tabPanelFilter + ')',function(data){
+					var id = $(this).parent().attr("lay-id");
+					if(portal.allAddedTab && portal.allAddedTab[id] && portal.allAddedTab[id].instanceObject){//璋冪敤閿�姣佷簨浠�
+						try{
+							portal.allAddedTab[id].instanceObject.destory();
+						}catch(e){
+						}
+					}
+					delete portal.allAddedTab[id];
+				});
+				layui.use('portal/vciAdminMain', function () {
+					var index = layui['portal/vciAdminMain'];
+					$("#vciPortalIndexContent").html(index.getContent());
+					index.init();
+				});
+			});
+		});
+		$(".outLogin").on("click",function() {
+			$webUtil.showConfirmMsg('鎮ㄧ‘瀹氳閫�鍑虹郴缁熷悧', function (index) {
+				$webUtil.post(configData.logoutUrl, {}, function (result) {
+					//鏃犺鎴愬姛涓庡惁閮介渶瑕佽烦杞簡
+					$.removeCookie('AuthorizationToken',{path:"/"});
+					window.location.href = projectName + "indexAdmin.html";
+				},function (err,xhr) {
+					$.removeCookie('AuthorizationToken',{path:"/"});
+					window.location.href = projectName + "indexAdmin.html";
+				});
+			});
+		});
+	}
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/vcijs/browserInfo.js b/Source/platformProject/platform2022UI/jslib/vcijs/browserInfo.js
new file mode 100644
index 0000000..a3bbc8b
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/vcijs/browserInfo.js
@@ -0,0 +1,121 @@
+// 妫�娴嬫祻瑙堝櫒鐗堟湰
+//jquery鍦�1.9鐗堟湰鑾峰彇鏂瑰紡涓嶄竴鏍�
+function checkBrowser() {
+    var b_version = navigator.appVersion;
+    var version = b_version.split(";");
+    if (version.length > 1)
+        version = version[1].replace(/[ ]/g, "");
+    var osInfo = getOSInfo();
+    var explorer = navigator.userAgent.toLowerCase();
+    // ie
+    if (explorer.indexOf("msie") >= 0) {
+        var ver = explorer.match(/msie ([\d.]+)/)[1];
+        return {
+            browser:'IE',
+            browserversion: ver,
+            osversion:osInfo
+        };
+    }
+    // firefox
+    else if (explorer.indexOf("firefox") >= 0) {
+        var ver = explorer.match(/firefox\/([\d.]+)/)[1];
+        return {
+            browser:'Firefox',
+            browserversion:ver,
+            osversion: osInfo
+        };
+    }
+    // Chrome
+    else if (explorer.indexOf("chrome") >= 0) {
+        var ver = explorer.match(/chrome\/([\d.]+)/)[1];
+        return {
+            browser:'Chrome',
+            browserversion: ver,
+            osversion: osInfo
+        };
+    }
+    // Opera
+    else if (explorer.indexOf("opera") >= 0) {
+        var ver = explorer.match(/opera.([\d.]+)/)[1];
+        return {
+            browser:'Opera',
+            browserversion:ver ,
+            osversion:osInfo
+        };
+    }
+    // Safari
+    else if (explorer.indexOf("safari") >= 0) {
+        var ver = explorer.match(/version\/([\d.]+)/)[1];
+        return {
+            browser:'Safari',
+            browserversion: ver,
+            osversion:osInfo
+        }
+    } else{
+        return {
+            browser:'unknown',
+            browserversion: '',
+            osversion:osInfo
+        };
+    }
+}
+/**
+ * 鑾峰彇绯荤粺鐨勭増鏈�
+ *
+ * @returns {String}
+ */
+function getOSInfo() {
+    var _pf = navigator.platform;
+    var appVer = navigator.userAgent;
+    if (_pf == "Win32" || _pf == "Windows") {
+        if (appVer.indexOf("WOW64") > -1)
+            _bit = "64浣�";
+        else
+            _bit = "32浣�";
+        if (appVer.indexOf("Windows NT 6.0") > -1
+            || appVer.indexOf("Windows Vista") > -1) {
+            if (_bit == '64浣�' || _bit == '32浣�')
+                return 'Windows_vista ' + _bit;
+            else
+                return "Windows_vista";
+        } else if (appVer.indexOf("Windows NT 6.1") > -1
+            || appVer.indexOf("Windows 7") > -1) {
+            if (_bit == '32浣�' || _bit == '64浣�')
+                return 'Windows_7 ' + _bit;
+            else
+                return "Windows_7";
+        } else {
+            try {
+                var _winName = Array('2000', 'XP', '2003');
+                var _ntNum = appVer.match(/Windows NT 5.\d/i).toString();
+                return 'Windows_'
+                    + _winName[_ntNum.replace(/Windows NT 5.(\d)/i, "$1")]
+                    + " " + _bit;
+            } catch (e) {
+                return 'Windows';
+            }
+        }
+    } else if (_pf == "Mac68K" || _pf == "MacPPC" || _pf == "Macintosh"
+        || _pf == "MacIntel")
+        return "Mac";
+    else if (_pf == "X11")
+        return "Unix";
+    else if (String(_pf).indexOf("Linux") > -1)
+        return "Linux";
+    else
+        return "Unknow";
+}
+
+jQuery.browser={};
+(function(){
+    jQuery.browser.msie=false;
+    jQuery.browser.version=0;
+    if(navigator.userAgent.match(/MSIE ([0-9]+)./)){
+        jQuery.browser.msie=true;
+        jQuery.browser.version=RegExp.$1;
+    }
+    $.browser.mozilla = /firefox/.test(navigator.userAgent.toLowerCase());
+    $.browser.webkit = /webkit/.test(navigator.userAgent.toLowerCase());
+    $.browser.opera = /opera/.test(navigator.userAgent.toLowerCase());
+    $.browser.msie = /msie/.test(navigator.userAgent.toLowerCase());
+})();
diff --git a/Source/platformProject/platform2022UI/jslib/vcijs/json2.js b/Source/platformProject/platform2022UI/jslib/vcijs/json2.js
new file mode 100644
index 0000000..deb88ec
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/vcijs/json2.js
@@ -0,0 +1,489 @@
+/*
+    json2.js
+    2014-02-04
+
+    Public Domain.
+
+    NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
+
+    See http://www.JSON.org/js.html
+
+
+    This code should be minified before deployment.
+    See http://javascript.crockford.com/jsmin.html
+
+    USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
+    NOT CONTROL.
+
+
+    This file creates a global JSON object containing two methods: stringify
+    and parse.
+
+        JSON.stringify(value, replacer, space)
+            value       any JavaScript value, usually an object or array.
+
+            replacer    an optional parameter that determines how object
+                        values are stringified for objects. It can be a
+                        function or an array of strings.
+
+            space       an optional parameter that specifies the indentation
+                        of nested structures. If it is omitted, the text will
+                        be packed without extra whitespace. If it is a number,
+                        it will specify the number of spaces to indent at each
+                        level. If it is a string (such as '\t' or '&nbsp;'),
+                        it contains the characters used to indent at each level.
+
+            This method produces a JSON text from a JavaScript value.
+
+            When an object value is found, if the object contains a toJSON
+            method, its toJSON method will be called and the result will be
+            stringified. A toJSON method does not serialize: it returns the
+            value represented by the name/value pair that should be serialized,
+            or undefined if nothing should be serialized. The toJSON method
+            will be passed the key associated with the value, and this will be
+            bound to the value
+
+            For example, this would serialize Dates as ISO strings.
+
+                Date.prototype.toJSON = function (key) {
+                    function f(n) {
+                        // Format integers to have at least two digits.
+                        return n < 10 ? '0' + n : n;
+                    }
+
+                    return this.getUTCFullYear()   + '-' +
+                         f(this.getUTCMonth() + 1) + '-' +
+                         f(this.getUTCDate())      + 'T' +
+                         f(this.getUTCHours())     + ':' +
+                         f(this.getUTCMinutes())   + ':' +
+                         f(this.getUTCSeconds())   + 'Z';
+                };
+
+            You can provide an optional replacer method. It will be passed the
+            key and value of each member, with this bound to the containing
+            object. The value that is returned from your method will be
+            serialized. If your method returns undefined, then the member will
+            be excluded from the serialization.
+
+            If the replacer parameter is an array of strings, then it will be
+            used to select the members to be serialized. It filters the results
+            such that only members with keys listed in the replacer array are
+            stringified.
+
+            Values that do not have JSON representations, such as undefined or
+            functions, will not be serialized. Such values in objects will be
+            dropped; in arrays they will be replaced with null. You can use
+            a replacer function to replace those with JSON values.
+            JSON.stringify(undefined) returns undefined.
+
+            The optional space parameter produces a stringification of the
+            value that is filled with line breaks and indentation to make it
+            easier to read.
+
+            If the space parameter is a non-empty string, then that string will
+            be used for indentation. If the space parameter is a number, then
+            the indentation will be that many spaces.
+
+            Example:
+
+            text = JSON.stringify(['e', {pluribus: 'unum'}]);
+            // text is '["e",{"pluribus":"unum"}]'
+
+
+            text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t');
+            // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
+
+            text = JSON.stringify([new Date()], function (key, value) {
+                return this[key] instanceof Date ?
+                    'Date(' + this[key] + ')' : value;
+            });
+            // text is '["Date(---current time---)"]'
+
+
+        JSON.parse(text, reviver)
+            This method parses a JSON text to produce an object or array.
+            It can throw a SyntaxError exception.
+
+            The optional reviver parameter is a function that can filter and
+            transform the results. It receives each of the keys and values,
+            and its return value is used instead of the original value.
+            If it returns what it received, then the structure is not modified.
+            If it returns undefined then the member is deleted.
+
+            Example:
+
+            // Parse the text. Values that look like ISO date strings will
+            // be converted to Date objects.
+
+            myData = JSON.parse(text, function (key, value) {
+                var a;
+                if (typeof value === 'string') {
+                    a =
+/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
+                    if (a) {
+                        return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
+                            +a[5], +a[6]));
+                    }
+                }
+                return value;
+            });
+
+            myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
+                var d;
+                if (typeof value === 'string' &&
+                        value.slice(0, 5) === 'Date(' &&
+                        value.slice(-1) === ')') {
+                    d = new Date(value.slice(5, -1));
+                    if (d) {
+                        return d;
+                    }
+                }
+                return value;
+            });
+
+
+    This is a reference implementation. You are free to copy, modify, or
+    redistribute.
+*/
+
+/*jslint evil: true, regexp: true */
+
+/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply,
+    call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
+    getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
+    lastIndex, length, parse, prototype, push, replace, slice, stringify,
+    test, toJSON, toString, valueOf
+*/
+
+
+// Create a JSON object only if one does not already exist. We create the
+// methods in a closure to avoid creating global variables.
+
+if (typeof JSON !== 'object') {
+    JSON = {};
+}
+
+(function () {
+    'use strict';
+
+    function f(n) {
+        // Format integers to have at least two digits.
+        return n < 10 ? '0' + n : n;
+    }
+
+    if (typeof Date.prototype.toJSON !== 'function') {
+
+        Date.prototype.toJSON = function () {
+
+            return isFinite(this.valueOf())
+                ? this.getUTCFullYear()     + '-' +
+                    f(this.getUTCMonth() + 1) + '-' +
+                    f(this.getUTCDate())      + 'T' +
+                    f(this.getUTCHours())     + ':' +
+                    f(this.getUTCMinutes())   + ':' +
+                    f(this.getUTCSeconds())   + 'Z'
+                : null;
+        };
+
+        String.prototype.toJSON      =
+            Number.prototype.toJSON  =
+            Boolean.prototype.toJSON = function () {
+                return this.valueOf();
+            };
+    }
+
+    var cx,
+        escapable,
+        gap,
+        indent,
+        meta,
+        rep;
+
+
+    function quote(string) {
+
+// If the string contains no control characters, no quote characters, and no
+// backslash characters, then we can safely slap some quotes around it.
+// Otherwise we must also replace the offending characters with safe escape
+// sequences.
+
+        escapable.lastIndex = 0;
+        return escapable.test(string) ? '"' + string.replace(escapable, function (a) {
+            var c = meta[a];
+            return typeof c === 'string'
+                ? c
+                : '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
+        }) + '"' : '"' + string + '"';
+    }
+
+
+    function str(key, holder) {
+
+// Produce a string from holder[key].
+
+        var i,          // The loop counter.
+            k,          // The member key.
+            v,          // The member value.
+            length,
+            mind = gap,
+            partial,
+            value = holder[key];
+
+// If the value has a toJSON method, call it to obtain a replacement value.
+
+        if (value && typeof value === 'object' &&
+                typeof value.toJSON === 'function') {
+            value = value.toJSON(key);
+        }
+
+// If we were called with a replacer function, then call the replacer to
+// obtain a replacement value.
+
+        if (typeof rep === 'function') {
+            value = rep.call(holder, key, value);
+        }
+
+// What happens next depends on the value's type.
+
+        switch (typeof value) {
+        case 'string':
+            return quote(value);
+
+        case 'number':
+
+// JSON numbers must be finite. Encode non-finite numbers as null.
+
+            return isFinite(value) ? String(value) : 'null';
+
+        case 'boolean':
+        case 'null':
+
+// If the value is a boolean or null, convert it to a string. Note:
+// typeof null does not produce 'null'. The case is included here in
+// the remote chance that this gets fixed someday.
+
+            return String(value);
+
+// If the type is 'object', we might be dealing with an object or an array or
+// null.
+
+        case 'object':
+
+// Due to a specification blunder in ECMAScript, typeof null is 'object',
+// so watch out for that case.
+
+            if (!value) {
+                return 'null';
+            }
+
+// Make an array to hold the partial results of stringifying this object value.
+
+            gap += indent;
+            partial = [];
+
+// Is the value an array?
+
+            if (Object.prototype.toString.apply(value) === '[object Array]') {
+
+// The value is an array. Stringify every element. Use null as a placeholder
+// for non-JSON values.
+
+                length = value.length;
+                for (i = 0; i < length; i += 1) {
+                    partial[i] = str(i, value) || 'null';
+                }
+
+// Join all of the elements together, separated with commas, and wrap them in
+// brackets.
+
+                v = partial.length === 0
+                    ? '[]'
+                    : gap
+                    ? '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']'
+                    : '[' + partial.join(',') + ']';
+                gap = mind;
+                return v;
+            }
+
+// If the replacer is an array, use it to select the members to be stringified.
+
+            if (rep && typeof rep === 'object') {
+                length = rep.length;
+                for (i = 0; i < length; i += 1) {
+                    if (typeof rep[i] === 'string') {
+                        k = rep[i];
+                        v = str(k, value);
+                        if (v) {
+                            partial.push(quote(k) + (gap ? ': ' : ':') + v);
+                        }
+                    }
+                }
+            } else {
+
+// Otherwise, iterate through all of the keys in the object.
+
+                for (k in value) {
+                    if (Object.prototype.hasOwnProperty.call(value, k)) {
+                        v = str(k, value);
+                        if (v) {
+                            partial.push(quote(k) + (gap ? ': ' : ':') + v);
+                        }
+                    }
+                }
+            }
+
+// Join all of the member texts together, separated with commas,
+// and wrap them in braces.
+
+            v = partial.length === 0
+                ? '{}'
+                : gap
+                ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}'
+                : '{' + partial.join(',') + '}';
+            gap = mind;
+            return v;
+        }
+    }
+
+// If the JSON object does not yet have a stringify method, give it one.
+
+    if (typeof JSON.stringify !== 'function') {
+        escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
+        meta = {    // table of character substitutions
+            '\b': '\\b',
+            '\t': '\\t',
+            '\n': '\\n',
+            '\f': '\\f',
+            '\r': '\\r',
+            '"' : '\\"',
+            '\\': '\\\\'
+        };
+        JSON.stringify = function (value, replacer, space) {
+
+// The stringify method takes a value and an optional replacer, and an optional
+// space parameter, and returns a JSON text. The replacer can be a function
+// that can replace values, or an array of strings that will select the keys.
+// A default replacer method can be provided. Use of the space parameter can
+// produce text that is more easily readable.
+
+            var i;
+            gap = '';
+            indent = '';
+
+// If the space parameter is a number, make an indent string containing that
+// many spaces.
+
+            if (typeof space === 'number') {
+                for (i = 0; i < space; i += 1) {
+                    indent += ' ';
+                }
+
+// If the space parameter is a string, it will be used as the indent string.
+
+            } else if (typeof space === 'string') {
+                indent = space;
+            }
+
+// If there is a replacer, it must be a function or an array.
+// Otherwise, throw an error.
+
+            rep = replacer;
+            if (replacer && typeof replacer !== 'function' &&
+                    (typeof replacer !== 'object' ||
+                    typeof replacer.length !== 'number')) {
+                throw new Error('JSON.stringify');
+            }
+
+// Make a fake root object containing our value under the key of ''.
+// Return the result of stringifying the value.
+
+            return str('', {'': value});
+        };
+    }
+
+
+// If the JSON object does not yet have a parse method, give it one.
+
+    if (typeof JSON.parse !== 'function') {
+        cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
+        JSON.parse = function (text, reviver) {
+
+// The parse method takes a text and an optional reviver function, and returns
+// a JavaScript value if the text is a valid JSON text.
+
+            var j;
+
+            function walk(holder, key) {
+
+// The walk method is used to recursively walk the resulting structure so
+// that modifications can be made.
+
+                var k, v, value = holder[key];
+                if (value && typeof value === 'object') {
+                    for (k in value) {
+                        if (Object.prototype.hasOwnProperty.call(value, k)) {
+                            v = walk(value, k);
+                            if (v !== undefined) {
+                                value[k] = v;
+                            } else {
+                                delete value[k];
+                            }
+                        }
+                    }
+                }
+                return reviver.call(holder, key, value);
+            }
+
+
+// Parsing happens in four stages. In the first stage, we replace certain
+// Unicode characters with escape sequences. JavaScript handles many characters
+// incorrectly, either silently deleting them, or treating them as line endings.
+
+            text = String(text);
+            cx.lastIndex = 0;
+            if (cx.test(text)) {
+                text = text.replace(cx, function (a) {
+                    return '\\u' +
+                        ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
+                });
+            }
+
+// In the second stage, we run the text against regular expressions that look
+// for non-JSON patterns. We are especially concerned with '()' and 'new'
+// because they can cause invocation, and '=' because it can cause mutation.
+// But just to be safe, we want to reject all unexpected forms.
+
+// We split the second stage into 4 regexp operations in order to work around
+// crippling inefficiencies in IE's and Safari's regexp engines. First we
+// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we
+// replace all simple value tokens with ']' characters. Third, we delete all
+// open brackets that follow a colon or comma or that begin the text. Finally,
+// we look to see that the remaining characters are only whitespace or ']' or
+// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.
+
+            if (/^[\],:{}\s]*$/
+                    .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')
+                        .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']')
+                        .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
+
+// In the third stage we use the eval function to compile the text into a
+// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
+// in JavaScript: it can begin a block or an object literal. We wrap the text
+// in parens to eliminate the ambiguity.
+
+                j = eval('(' + text + ')');
+
+// In the optional fourth stage, we recursively walk the new structure, passing
+// each name/value pair to a reviver function for possible transformation.
+
+                return typeof reviver === 'function'
+                    ? walk({'': j}, '')
+                    : j;
+            }
+
+// If the text is not JSON parseable, then a SyntaxError is thrown.
+
+            throw new SyntaxError('JSON.parse');
+        };
+    }
+}());
diff --git a/Source/platformProject/platform2022UI/jslib/vcijs/login.js b/Source/platformProject/platform2022UI/jslib/vcijs/login.js
new file mode 100644
index 0000000..8c6cee1
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/vcijs/login.js
@@ -0,0 +1,300 @@
+//澶勭悊鐧诲綍椤甸潰鐨勭浉鍏冲姩浣�
+//weidy@2013-08-01
+
+var path = "";//鍚庡彴璺緞
+var configData = {};
+var browserInfo = null;
+var processStep = 0;
+var processInterval = null;
+var usedTime = 0;
+var projectName = "";
+var pathName = "";
+var jq = null;
+$(document).ready(function() {
+	jq = $;
+	// 鍏堝垽鏂祻瑙堝櫒鐗堟湰
+	browserInfo = checkBrowser();
+	pathName = window.document.location.pathname;
+    projectName = pathName.substring(0, pathName.substr(1).indexOf('/') + 1) + "/";
+	//澶勭悊椤甸潰鐨勫唴瀹�
+	getConfig(function(){
+        initDefaultConfig();
+		//checkIsLogin(function(){
+			initPage();//鑾峰彇閰嶇疆鍚庯紝妫�鏌ユ槸鍚﹀凡缁忕櫥褰曡繃锛屽鏋滄病鏈夌櫥褰曞垯鍦ㄥ垵濮嬪寲椤甸潰鐨勫唴瀹�
+		//});
+	});
+});
+function getConfig(callback){
+	$.getJSON(projectName + "config.json?v=" +  (new Date()).getTime(),function(data){
+		configData = data;
+		if(configData.isDebug == "true" || configData.isDebug == true){
+            path = configData.backPath;
+        }else{
+			path = projectName;
+			if(configData.compatibility) {
+				if (pathName.indexOf("/") > -1) {
+					if(""!=configData.unCorsPath){
+						path = path.substring(0, path.lastIndexOf("/")) + "/" + configData.unCorsPath + "/";
+					}else{
+						path = path.substring(0, path.lastIndexOf("/")) + "/";
+					}
+				}
+			}
+		}
+		if(callback){
+			callback();
+		}
+	});
+}
+
+function initDefaultConfig(){
+    if(!configData.backgroundimg ){
+        configData.backgroundimg = "style/images/base/login/background-classic.png";
+    }
+    if(!configData.defaultPhoto){
+        configData.defaultPhoto = "style/images/base/login/userphotoman.png";
+    }
+    if(!configData.loginUrl){
+        configData.loginUrl = "framework/loginController/login";
+	}
+	if(!configData.sessionInfoUrl){
+        configData.sessionInfoUrl = "framework/loginController/getSessionInfo";
+	}
+    if(!configData.logoutUrl){
+        configData.logoutUrl = "framework/loginController/logout";
+    }
+}
+
+function initPage(){
+    $(document).attr("title",configData.title);
+	$("#loginTitle").html(configData.title);
+	$("#background img").attr("src", projectName + configData.backgroundimg );
+	if ($.cookie('useridcookie') != null && $.cookie('useridcookie') != "" && $.cookie('useridcookie') != "null") {
+        $("#userid").val($.cookie('useridcookie'));
+    }
+	//娓呴櫎閿佸畾绐楀彛鐨刢ookie
+	$.cookie("isLockWindow", "false");
+	$.cookie('AuthorizationToken','',{path:"/"});
+	//璁剧疆鐢ㄦ埛鐨勫ご鍍�
+	if($.cookie('userphotocookie') != null && $.cookie('userphotocookie') != "" && $.cookie('userphotocookie') != "null"){
+		$("#userPhoto").attr("src",projectName + $.cookie('userphotocookie'));
+	}else{
+		$("#userPhoto").attr("src",projectName  + configData.defaultPhoto);
+	}
+	$("#loginbt").click(function() {
+		if (checkEmpty())// 鍏堟鏌ユ槸鍚︿负绌�
+			login();
+	});
+	// 鍦ㄥ瘑鐮佹涓婄偣鍑讳簡鍥炶溅閿�
+	$("#password").bind("keydown", function(e) {
+		var key = e.which;
+		if (key == 13){// 鎸変笅鍥炶溅閿畕
+			if (checkEmpty())// 鍏堟鏌ユ槸鍚︿负绌�
+				login();
+		}
+	});
+	if(configData.unSecret){
+		$("#secretFlag").show();
+		$("#secretFlag").html(configData.unSecretText);
+		$(".loading").css('margin-top','170px');
+	}
+}
+
+function checkIsLogin(callback){
+	crosPost(configData.sessionInfoUrl,{},function(result){
+		//濡傛灉鍦ㄧ嚎锛岄偅鐩存帴鎻愮ず鐢ㄦ埛鏄惁瑕佺户缁�
+		if(result.success){
+			$webUtil.deptOid = result.obj.deptOid; // 淇濆瓨鐢ㄦ埛閮ㄩ棬Oid
+			var sessionInfo = result.obj;
+			if (window.confirm('褰撳墠娴忚鍣ㄤ腑宸茬粡浣跨敤[' + sessionInfo.userName + ']鐧诲綍浜嗭紝濡傛灉鎮ㄧ幇鍦ㄨ浣跨敤鍒殑璐︽埛鐧诲綍锛�'
+					+ sessionInfo.userName + '灏嗕細鑷姩娉ㄩ攢,鎮ㄦ槸鍚﹁缁х画锛�')) {
+				crosPost(configData.logoutUrl,{"userid":sessionInfo.userId},function(result){
+					window.location.href = window.location.href;
+				},function(xhr,error){
+					window.location.href = window.location.href;
+				});
+			} else {
+				if(browserInfo.browser == "IE"){
+					window.open(",鈥檁parent鈥�,");
+					window.close();
+				}else{
+					try{
+						window.opener = null;
+						window.open('', '_self');
+					}catch(e){
+						window.close();
+					}
+				}
+			}
+		}else{
+			if(callback){
+				callback();
+			}
+		}
+	},function(xhr,error){
+		if(callback){
+			callback();
+		}
+	});
+}
+
+function crosPost(url1,data,callback,errorCallback){
+	var ajaxOperation ={
+        type:'post',
+        url:path + url1,
+        data:data,
+        success:function(data){
+            var result = data;
+            if(callback){
+                callback(result);
+            }
+        },
+        error:function(xhr,error){
+            if(errorCallback){
+                errorCallback(xhr,error);
+            }
+        }
+    };
+	if(configData.isDebug){
+		jQuery.support.cors=true;
+		// jQuery.ajaxSetup({
+		// 	xhr: function() {
+		// 		if (window.ActiveXObject) {
+		// 			return new window.ActiveXObject("Microsoft.XMLHTTP");
+		// 		} else {
+		// 			return new window.XMLHttpRequest();
+		// 		}
+		// 	}
+		// });
+        // ajaxOperation['xhrFields'] = {
+        //     withCredentials: true
+        // };
+        // ajaxOperation['crossDomain']=true;//(true == !(document.all));
+	}
+	jq.ajax(ajaxOperation);
+}
+
+// 妫�鏌ョ敤鎴峰悕鍜屽瘑鐮佹槸鍚︿负绌�
+function checkEmpty() {
+	if (($("#userid").val() == "") && ($("#password").val() == "")) {
+		showError("鐧诲綍璐﹀彿鍜屽瘑鐮佷笉鑳戒负绌�");
+		return false;
+	} else if ($("#userid").val() == "") {
+		showError("鐧诲綍璐﹀彿涓嶈兘涓虹┖");
+		return false;
+	} else if ($("#password").val() == "") {
+		showError("瀵嗙爜涓嶈兘涓虹┖");
+		return false;
+	} else
+		return true;
+}
+
+// 鏄剧ず閿欒
+function showError(text) {
+	$("#msg").html( text);
+	hideError(5000);
+}
+
+// 閿欒鏄剧ずdiv闅愯棌鍊�
+function hideError(time) {
+	window.setTimeout(function() {
+		$("#msg").html("");
+	}, time);
+}
+
+// 鐧诲綍
+function login() {
+	$("#loginbt").attr("disabled", true);
+	var userid = $("#userid").val();
+	if($("#isForceLogin").attr("checked") == "checked"){
+		$.cookie('useridcookie',userid,{expires:30});
+	}else{
+		$.cookie('useridcookie',null);
+	}
+	//var password = MD5($("#password").val());
+	//鏂板钩鍙板凡缁忔敮鎸乵d5鍔犲瘑浜�
+	var password = configData.compatibility?$("#password").val():MD5($("#password").val());
+	var isForceLogin = $("#isForceLogin").is(":checked");
+	showLoading();
+	var loginData = {
+		userId : userid,
+		password : password,
+		forceLogin : isForceLogin,
+		browser:browserInfo.browser,
+		browserversion:browserInfo.browserversion,
+		osversion: browserInfo.osversion 
+	};
+	//鍥犱负姣忎釜椤圭洰锛屽湪鐧诲綍鍚庤幏鍙栫殑鍐呭鍙兘浼氭湁涓嶄竴鏍凤紝鎵�浠ョ櫥褰曠殑璺緞鏀寔閰嶇疆configData.loginUrl
+	crosPost(configData.loginUrl,loginData,function(result){
+		hideLoading();
+		if(result == undefined || result == null){
+			showError("鐧诲綍鍑虹幇浜嗛敊璇紒璇锋煡鐪嬫湇鍔″櫒鏄惁寮�鍚�");
+			$("#loginbt").attr("disabled", false);
+		}	
+		if (result.success){
+			//$.cookie('AuthorizationToken',result.obj.sessionInfo.token,{path:"/"});
+			createCookie('AuthorizationToken',result.obj.sessionInfo.token);
+			createCookie("msg","");
+			if(configData.mainDisplay == "open" && browserInfo.browser == 'IE'){
+				window.open(projectName + "main.html",'_blank','menubar=no,fullscreen=1,toolbar=no,resizable=no,location=no,status=no');
+				window.close();
+			}else {
+				window.location.href = projectName + "main.html";
+			}
+		}else {
+			showError(result.msg);
+			$("#loginbt").attr("disabled", false);
+		}
+	},function(xhr,error){
+		hideLoading();
+		showError(error); 
+	});
+}
+
+function createCookie(name,value,days) {
+	$.cookie(value,name,{path:"/"});
+	if (days) {
+		var date = new Date();
+		date.setTime(date.getTime()+(days*24*60*60*1000));
+		var expires = "; expires="+date.toGMTString();
+	} else{
+		expires = "";
+	}
+	document.cookie = name+"="+value+expires+"; path=/";
+}
+
+function showLoading(){
+	$(".loadbg").show();
+	$(".processbar").show();
+	$(".loading").show();
+	var preWidth = $(".loading").css("width");
+	if(preWidth.indexOf("px")>-1){
+		preWidth = preWidth.replace("px","");
+	}
+	$("#useTime").html(usedTime );
+	preWidth = preWidth*1/10;
+	processInterval = window.setInterval(function(){
+		$("#useTime").html(usedTime + 1);
+		$(".processbar").css("width",preWidth*(processStep+1));
+		usedTime ++;
+		processStep ++ ;
+	    if(processStep == 10){
+	    	processStep = 0;
+	    }
+	    if(usedTime>10){
+			$(".loading").css('color','rgb(249,0,69)')
+		}
+	},1000);
+}
+function hideLoading(){
+	$(".loadbg").hide();
+	$(".processbar").hide();
+	$(".loading").hide().css({color:'#333333'});
+    processStep = 0;
+    usedTime =0;
+	if(processInterval != null){
+		window.clearInterval(processInterval);
+	}
+}
+
+
diff --git a/Source/platformProject/platform2022UI/jslib/vcijs/main.js b/Source/platformProject/platform2022UI/jslib/vcijs/main.js
new file mode 100644
index 0000000..63b9078
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/vcijs/main.js
@@ -0,0 +1,291 @@
+var path = "";
+var configData = {};
+var portal = null;
+var usedTime = 0;
+var projectName = "";
+var processInterval = null;
+var isDebug = true;
+var $webUtil = null;
+var webUtil = null;
+var pathName = "";
+var themeName = "";
+var TOKEN_KEY = "AuthorizationToken";
+
+var emptyFunction = function(){};
+var mySessionInfo = {};
+	$(document).ready(function(){
+		$.ajaxSetup({
+			cache:false,
+			xhr: function() {
+				if (window.ActiveXObject) {
+					return new window.ActiveXObject("Microsoft.XMLHTTP");
+				} else {
+					return new window.XMLHttpRequest();
+				}
+			}
+		});
+		pathName = window.document.location.pathname;
+	    projectName = pathName.substring(0, pathName.substr(1).indexOf('/') + 1) + "/";
+		getConfig(function(){
+            initDefaultConfig();
+			checkIsLogin(function(sessionInfo,taskOid){
+				loadJs(sessionInfo,taskOid);//鑾峰彇閰嶇疆鍚庯紝鍒ゆ柇鏄惁鐧诲綍-娌℃湁鐧诲綍璺宠浆鍒扮櫥褰曢〉锛岀櫥褰曞悗鍒濆鍖栭〉闈�
+			});
+		});
+	});
+	function getConfig(callback){
+		$.getJSON(projectName + "config.json?v=" +  (new Date()).getTime(),function(data){
+			configData = data;
+			$webUtil = new vciWebUtil();
+			webUtil = $webUtil;
+			if(configData.isDebug == "true" || configData.isDebug == true){
+				jQuery.support.cors = true;
+				path = configData.backPath;
+			}else{
+				path = projectName;
+				if(configData.compatibility) {
+					if (pathName.indexOf("/") > -1) {
+						path = path.substring(0, path.lastIndexOf("/")) + "/";
+					}
+				}
+			}
+		    isDebug = configData.isDebug;
+			if(callback){
+				callback();
+			}
+		});
+	}
+
+	function initDefaultConfig() {
+		if (!configData.backgroundimg) {
+			configData.backgroundimg = "style/images/index/login/background-gray.png";
+		}
+		if (!configData.defaultPhoto) {
+			configData.defaultPhoto = "style/images/index/login/userphotoman.png";
+		}
+		if (!configData.loginUrl) {
+			configData.loginUrl = "framework/loginController/login";
+		}
+		if (!configData.sessionInfoUrl) {
+			configData.sessionInfoUrl = "framework/loginController/getSessionInfo";
+		}
+		if (!configData.logoutUrl) {
+			configData.logoutUrl = "framework/loginController/logout";
+		}
+		if (!configData.objectServicePath) {
+			configData.objectServicePath = path + "objectService/";
+		}
+		if (!configData.frameworkPath) {
+			configData.frameworkPath = path + "framework/";
+		}
+	}
+	function getUrlParam() {
+		//鑾峰彇杩炴帴鍦板潃
+		var url = document.location.toString();
+		//鍒嗛殧寮�杩炴帴,鐢�?鎶婁紶鐨勫�煎彇鍑烘潵
+		var arrObj = url.split("?");
+		var param = {};
+		//鍒ゆ柇杩炴帴閲岄潰鏄笉鏄湁鍊�,濡傛灉鏈夊垯鎵ц涓嬮潰鎿嶄綔
+		if (arrObj.length > 1) {
+			//鍙栧嚭鎵�鏈変紶鐨勫��
+			var arrPara = arrObj[1].split("&");
+			var arr;
+			for (var i = 0; i < arrPara.length; i++) {
+				arr = arrPara[i].split("=");
+				//鎶婄浜屼釜鍊艰祴鍊肩粰绗竴涓��
+				param[arr[0]] = arr[1];
+			}
+		}
+		return param;
+	}
+	function checkIsLogin(callback){
+		//澧炲姞鍗曠偣鐧诲綍鐨勫唴瀹�
+		var param = getUrlParam();
+		var token= readCookie(TOKEN_KEY);
+		var taskOid = param['taskOid'];
+		var msg = readCookie("msg");
+		if(msg && $webUtil.isNotNull(msg)){
+			$webUtil.showErrorMsg(msg);
+			return false;
+		}
+		if($webUtil.isNull(token)){
+			//鍏煎IE6
+			token = readCookie(TOKEN_KEY);
+			if($webUtil.isNull(token)) {
+				doNoLogin();
+				return false;
+			}
+		}
+		var param = {};
+		param[TOKEN_KEY] = token;
+		$webUtil.post(configData.sessionInfoUrl,param,function(result){
+			//濡傛灉鍦ㄧ嚎锛岄偅鐩存帴鎻愮ず鐢ㄦ埛鏄惁瑕佺户缁�
+			if(result.success){
+				$webUtil.deptOid = result.obj.deptOid; // 淇濆瓨鐢ㄦ埛閮ㄩ棬Oid
+				if(callback){
+					callback(result.obj,taskOid);
+				}
+			}else{
+				doNoLogin();
+			}
+		},function(xhr,error){
+			alert(error);
+			doNoLogin();
+		});
+	}
+	function doNoLogin(){//鏈櫥褰曠殑澶勭悊鏂瑰紡
+		$("#noLogin").show();
+		$("#noLoginInfo").html("鎮ㄦ病鏈夌櫥褰曪紝灏嗗湪5绉掑悗鑷姩璺宠浆鍒扮櫥褰曢〉闈�");
+		processInterval = window.setInterval(function(){
+			usedTime ++;
+			if(usedTime == 5){
+				window.clearInterval(processInterval);
+				window.location.href = projectName + "index.html";
+			}else{
+				$("#noLoginInfo").html("鎮ㄦ病鏈夌櫥褰曪紝灏嗗湪" + (5-usedTime) + "绉掑悗鑷姩璺宠浆鍒扮櫥褰曢〉闈�");
+			}
+		},1000);
+	}
+	function loadJs(sessionInfo,taskOid){
+		for(var cssName in configData.loadCss){
+			if("gaodeMapCss" != cssName || configData.isOpenMap || ("gaodeMapCss" == cssName && configData.isOpenMap)){
+				$("head").append('<link href="'  + projectName + configData.loadCss[cssName] + '"  rel="stylesheet" type="text/css" />');//娣诲姞css寮曠敤
+			}
+		}
+		//鍔犺浇js鏂囦欢
+		for(var jsName in configData.loadJs){
+			if("gaodeMapjs" != jsName || configData.isOpenMap || ("gaodeMapjs" == jsName && configData.isOpenMap)){
+				var jsUrl = projectName + configData.loadJs[jsName];
+				if("gaodeMapjs" == jsName){
+					jsUrl = jsUrl + "&key=" + configData.gaodeMapKey;
+				}
+				$("head").append('<script src="' +jsUrl + '" type="text/javascript" charset="UTF-8"></script>');
+			}
+		}
+		initData(sessionInfo,taskOid);
+	}
+
+
+	function readCookie(name) {
+		var value = $.cookie(name);
+		if($webUtil.isNull(value)) {
+			var nameEQ = name + "=";
+			var ca = document.cookie.split(';');
+			for (var i = 0; i < ca.length; i++) {
+				var c = ca[i];
+				while (c.charAt(0) == ' ') {
+					c = c.substring(1, c.length);
+				}
+				if (c.indexOf(nameEQ) == 0) {
+					return c.substring(nameEQ.length, c.length)
+				}
+			}
+		}else{
+			return value;
+		}
+		return false;
+	}
+	
+	function initData(sessionInfo,taskOid){
+		document.title = configData.title;//璁剧疆鏍囬--涓嶈兘浣跨敤jquery閲岀殑attr鏂规硶
+		//鑾峰彇涓婚
+		themeName = $.cookie('vciWebThemeName');
+		if(themeName == null || themeName == "" || themeName =="null"){
+			themeName = "black"; 
+		}
+		$.cookie('userphotocookie',sessionInfo.photoUrl);
+		mySessionInfo = sessionInfo;
+		if($webUtil.isNotNull(sessionInfo.photoUrl)){
+			configData.vciWebPortal.mainConfig.userCenterSrc = sessionInfo.photoUrl
+		}
+		//瀵煎叆閰嶇疆
+		layui.config({
+			base:projectName +configData.webJsLib
+		});
+		layui.isDebug = isDebug;
+
+		//鍒濆鍖栦富椤�
+		layui.use(['vciAlias'],function(){
+			var alias = layui.vciAlias;
+			alias.configAlias();
+			if($webUtil.isNotNull(taskOid)){
+				//鍙樉绀哄緟鍔炰换鍔�
+				layui.use(['view/process/vciWebProExecuteTask'], function () {
+					var executeTask = layui['view/process/vciWebProExecuteTask'];
+					executeTask.init();
+					$webUtil.post("/webProcessDefineController/getTaskByOid",{taskOid:taskOid},function(result){
+						if(result.success && result.obj && result.obj.length > 0){
+							var taskInfo = [];
+							taskInfo.push({
+								taskOid:result.obj[0].oid,
+								taskName:result.obj[0].name,
+								executionId:result.obj[0].executionid
+							});
+							executeTask.showExecuteWindow(taskInfo,{
+								full:true,
+								fullScreen:true
+							},function(finish){
+
+							});
+						}else{
+							$webUtil.showErrorMsg(result.msg);
+						}
+					},function(xhr,error){
+						$webUtil.showErrorMsg("鏌ョ湅娴佺▼浠诲姟鍑洪敊");
+					},path);
+				});
+			}else {
+				layui.use(['vciWebPortalDojoUI'], function () {
+					portal = layui.vciWebPortalDojoUI;
+					portal.sessionInfo = mySessionInfo;
+					portal.themeName = themeName;
+					portal.loginUrl = configData.loginUrl;
+					if (!$webUtil.isSso() && (portal.sessionInfo.mustChangePassword == "true" || portal.sessionInfo.mustChangePassword == true)) {
+						if ($webUtil.isNotNull(portal.sessionInfo.passwordInfo)) {
+							//璇存槑闇�瑕佹樉绀哄瘑鐮佷俊鎭�
+							$webUtil.showErrorMsg(portal.sessionInfo.passwordInfo, function () {
+								portal.sessionInfo.passwordInfo = "";
+								portal.changepdw(true, function () {
+									initPortal();
+									portal.sessionInfo.mustChangePassword = false;
+								});
+							});
+						} else {
+							portal.changepdw(true, function () {
+								initPortal();
+								portal.sessionInfo.mustChangePassword = false;
+							});
+						}
+					} else {
+						initPortal();
+						portal.sessionInfo.mustChangePassword = false;
+					}
+				});
+			}
+			// layui.use(['vciWebSocket','layer'],function(){
+			// 	var socket = layui.vciWebSocket;
+			// 	socket.config = {
+			// 		onopen: function(){
+			// 			//鎻℃墜鎴愬姛
+			// 			//console.log("鏈嶅姟杩炴帴鎴愬姛");
+			// 		},
+			// 		onmessage:function(data){
+			// 			//console.log(data);layer.alert(data.data)
+			// 			//top.layer.alert(data);
+			// 			//鏀跺埌娑堟伅
+			// 		}
+			// 	};
+			// 	socket.init()
+			// })
+		});
+	}
+	function initPortal(){
+		portal.init();//鍒濆鍖�
+		if ($.cookie("isLockWindow") == "true") {
+			portal.lockWindow();
+		}
+		if($webUtil.isNotNull(portal.sessionInfo.passwordInfo) &&  !$webUtil.isSso()){
+			//璇存槑闇�瑕佹樉绀哄瘑鐮佷俊鎭�
+			$webUtil.showErrorMsg(portal.sessionInfo.passwordInfo);
+		}
+	}
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/vcijs/md5.js b/Source/platformProject/platform2022UI/jslib/vcijs/md5.js
new file mode 100644
index 0000000..d8c7826
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/vcijs/md5.js
@@ -0,0 +1,172 @@
+function MD5(sMessage) {
+    function RotateLeft(lValue, iShiftBits) {
+        return (lValue << iShiftBits) | (lValue >>> (32 - iShiftBits));
+    }
+    function AddUnsigned(lX, lY) {
+        var lX4, lY4, lX8, lY8, lResult;
+        lX8 = (lX & 0x80000000);
+        lY8 = (lY & 0x80000000);
+        lX4 = (lX & 0x40000000);
+        lY4 = (lY & 0x40000000);
+        lResult = (lX & 0x3FFFFFFF) + (lY & 0x3FFFFFFF);
+        if (lX4 & lY4)
+            return (lResult ^ 0x80000000 ^ lX8 ^ lY8);
+        if (lX4 | lY4) {
+            if (lResult & 0x40000000)
+                return (lResult ^ 0xC0000000 ^ lX8 ^ lY8);
+            else
+                return (lResult ^ 0x40000000 ^ lX8 ^ lY8);
+        } else
+            return (lResult ^ lX8 ^ lY8);
+    }
+    function F(x, y, z) {
+        return (x & y) | ((~x) & z);
+    }
+    function G(x, y, z) {
+        return (x & z) | (y & (~z));
+    }
+    function H(x, y, z) {
+        return (x ^ y ^ z);
+    }
+    function I(x, y, z) {
+        return (y ^ (x | (~z)));
+    }
+    function FF(a, b, c, d, x, s, ac) {
+        a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac));
+        return AddUnsigned(RotateLeft(a, s), b);
+    }
+    function GG(a, b, c, d, x, s, ac) {
+        a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac));
+        return AddUnsigned(RotateLeft(a, s), b);
+    }
+    function HH(a, b, c, d, x, s, ac) {
+        a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac));
+        return AddUnsigned(RotateLeft(a, s), b);
+    }
+    function II(a, b, c, d, x, s, ac) {
+        a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac));
+        return AddUnsigned(RotateLeft(a, s), b);
+    }
+    function ConvertToWordArray(sMessage) {
+        var lWordCount;
+        var lMessageLength = sMessage.length;
+        var lNumberOfWords_temp1 = lMessageLength + 8;
+        var lNumberOfWords_temp2 = (lNumberOfWords_temp1 - (lNumberOfWords_temp1 % 64)) / 64;
+        var lNumberOfWords = (lNumberOfWords_temp2 + 1) * 16;
+        var lWordArray = Array(lNumberOfWords - 1);
+        var lBytePosition = 0;
+        var lByteCount = 0;
+        while (lByteCount < lMessageLength) {
+            lWordCount = (lByteCount - (lByteCount % 4)) / 4;
+            lBytePosition = (lByteCount % 4) * 8;
+            lWordArray[lWordCount] = (lWordArray[lWordCount] | (sMessage
+                .charCodeAt(lByteCount) << lBytePosition));
+            lByteCount++;
+        }
+        lWordCount = (lByteCount - (lByteCount % 4)) / 4;
+        lBytePosition = (lByteCount % 4) * 8;
+        lWordArray[lWordCount] = lWordArray[lWordCount]
+            | (0x80 << lBytePosition);
+        lWordArray[lNumberOfWords - 2] = lMessageLength << 3;
+        lWordArray[lNumberOfWords - 1] = lMessageLength >>> 29;
+        return lWordArray;
+    }
+    function WordToHex(lValue) {
+        var WordToHexValue = "", WordToHexValue_temp = "", lByte, lCount;
+        for (lCount = 0; lCount <= 3; lCount++) {
+            lByte = (lValue >>> (lCount * 8)) & 255;
+            WordToHexValue_temp = "0" + lByte.toString(16);
+            WordToHexValue = WordToHexValue
+                + WordToHexValue_temp.substr(
+                    WordToHexValue_temp.length - 2, 2);
+        }
+        return WordToHexValue;
+    }
+    var x = Array();
+    var k, AA, BB, CC, DD, a, b, c, d;
+    var S11 = 7, S12 = 12, S13 = 17, S14 = 22;
+    var S21 = 5, S22 = 9, S23 = 14, S24 = 20;
+    var S31 = 4, S32 = 11, S33 = 16, S34 = 23;
+    var S41 = 6, S42 = 10, S43 = 15, S44 = 21;
+    x = ConvertToWordArray(sMessage);
+    a = 0x67452301;
+    b = 0xEFCDAB89;
+    c = 0x98BADCFE;
+    d = 0x10325476;
+    for (k = 0; k < x.length; k += 16) {
+        AA = a;
+        BB = b;
+        CC = c;
+        DD = d;
+        a = FF(a, b, c, d, x[k + 0], S11, 0xD76AA478);
+        d = FF(d, a, b, c, x[k + 1], S12, 0xE8C7B756);
+        c = FF(c, d, a, b, x[k + 2], S13, 0x242070DB);
+        b = FF(b, c, d, a, x[k + 3], S14, 0xC1BDCEEE);
+        a = FF(a, b, c, d, x[k + 4], S11, 0xF57C0FAF);
+        d = FF(d, a, b, c, x[k + 5], S12, 0x4787C62A);
+        c = FF(c, d, a, b, x[k + 6], S13, 0xA8304613);
+        b = FF(b, c, d, a, x[k + 7], S14, 0xFD469501);
+        a = FF(a, b, c, d, x[k + 8], S11, 0x698098D8);
+        d = FF(d, a, b, c, x[k + 9], S12, 0x8B44F7AF);
+        c = FF(c, d, a, b, x[k + 10], S13, 0xFFFF5BB1);
+        b = FF(b, c, d, a, x[k + 11], S14, 0x895CD7BE);
+        a = FF(a, b, c, d, x[k + 12], S11, 0x6B901122);
+        d = FF(d, a, b, c, x[k + 13], S12, 0xFD987193);
+        c = FF(c, d, a, b, x[k + 14], S13, 0xA679438E);
+        b = FF(b, c, d, a, x[k + 15], S14, 0x49B40821);
+        a = GG(a, b, c, d, x[k + 1], S21, 0xF61E2562);
+        d = GG(d, a, b, c, x[k + 6], S22, 0xC040B340);
+        c = GG(c, d, a, b, x[k + 11], S23, 0x265E5A51);
+        b = GG(b, c, d, a, x[k + 0], S24, 0xE9B6C7AA);
+        a = GG(a, b, c, d, x[k + 5], S21, 0xD62F105D);
+        d = GG(d, a, b, c, x[k + 10], S22, 0x2441453);
+        c = GG(c, d, a, b, x[k + 15], S23, 0xD8A1E681);
+        b = GG(b, c, d, a, x[k + 4], S24, 0xE7D3FBC8);
+        a = GG(a, b, c, d, x[k + 9], S21, 0x21E1CDE6);
+        d = GG(d, a, b, c, x[k + 14], S22, 0xC33707D6);
+        c = GG(c, d, a, b, x[k + 3], S23, 0xF4D50D87);
+        b = GG(b, c, d, a, x[k + 8], S24, 0x455A14ED);
+        a = GG(a, b, c, d, x[k + 13], S21, 0xA9E3E905);
+        d = GG(d, a, b, c, x[k + 2], S22, 0xFCEFA3F8);
+        c = GG(c, d, a, b, x[k + 7], S23, 0x676F02D9);
+        b = GG(b, c, d, a, x[k + 12], S24, 0x8D2A4C8A);
+        a = HH(a, b, c, d, x[k + 5], S31, 0xFFFA3942);
+        d = HH(d, a, b, c, x[k + 8], S32, 0x8771F681);
+        c = HH(c, d, a, b, x[k + 11], S33, 0x6D9D6122);
+        b = HH(b, c, d, a, x[k + 14], S34, 0xFDE5380C);
+        a = HH(a, b, c, d, x[k + 1], S31, 0xA4BEEA44);
+        d = HH(d, a, b, c, x[k + 4], S32, 0x4BDECFA9);
+        c = HH(c, d, a, b, x[k + 7], S33, 0xF6BB4B60);
+        b = HH(b, c, d, a, x[k + 10], S34, 0xBEBFBC70);
+        a = HH(a, b, c, d, x[k + 13], S31, 0x289B7EC6);
+        d = HH(d, a, b, c, x[k + 0], S32, 0xEAA127FA);
+        c = HH(c, d, a, b, x[k + 3], S33, 0xD4EF3085);
+        b = HH(b, c, d, a, x[k + 6], S34, 0x4881D05);
+        a = HH(a, b, c, d, x[k + 9], S31, 0xD9D4D039);
+        d = HH(d, a, b, c, x[k + 12], S32, 0xE6DB99E5);
+        c = HH(c, d, a, b, x[k + 15], S33, 0x1FA27CF8);
+        b = HH(b, c, d, a, x[k + 2], S34, 0xC4AC5665);
+        a = II(a, b, c, d, x[k + 0], S41, 0xF4292244);
+        d = II(d, a, b, c, x[k + 7], S42, 0x432AFF97);
+        c = II(c, d, a, b, x[k + 14], S43, 0xAB9423A7);
+        b = II(b, c, d, a, x[k + 5], S44, 0xFC93A039);
+        a = II(a, b, c, d, x[k + 12], S41, 0x655B59C3);
+        d = II(d, a, b, c, x[k + 3], S42, 0x8F0CCC92);
+        c = II(c, d, a, b, x[k + 10], S43, 0xFFEFF47D);
+        b = II(b, c, d, a, x[k + 1], S44, 0x85845DD1);
+        a = II(a, b, c, d, x[k + 8], S41, 0x6FA87E4F);
+        d = II(d, a, b, c, x[k + 15], S42, 0xFE2CE6E0);
+        c = II(c, d, a, b, x[k + 6], S43, 0xA3014314);
+        b = II(b, c, d, a, x[k + 13], S44, 0x4E0811A1);
+        a = II(a, b, c, d, x[k + 4], S41, 0xF7537E82);
+        d = II(d, a, b, c, x[k + 11], S42, 0xBD3AF235);
+        c = II(c, d, a, b, x[k + 2], S43, 0x2AD7D2BB);
+        b = II(b, c, d, a, x[k + 9], S44, 0xEB86D391);
+        a = AddUnsigned(a, AA);
+        b = AddUnsigned(b, BB);
+        c = AddUnsigned(c, CC);
+        d = AddUnsigned(d, DD);
+    }
+    var temp = WordToHex(a) + WordToHex(b) + WordToHex(c) + WordToHex(d);
+    return temp.toLowerCase();
+}
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/vcijs/showTodo.js b/Source/platformProject/platform2022UI/jslib/vcijs/showTodo.js
new file mode 100644
index 0000000..a7e3569
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/vcijs/showTodo.js
@@ -0,0 +1,104 @@
+/**
+ * Created by dengbk on 2019/4/15.
+ */
+var iframePath = "";
+var path = '';
+var param = {};
+var pathName = "";
+var projectName = "";
+$(document).ready(function(){
+    iframePath = window.parent.location;
+    pathName = window.document.location.pathname;
+    projectName = pathName.substring(0, pathName.substr(1).indexOf('/') + 1) + "/";
+    // param = {
+    //     todoOid : getUrlParam("todoOid"),
+    //     btwname : getUrlParam("btwname"),
+    //     businessOid : getUrlParam("businessOid"),
+    //     taskName : getUrlParam("taskName"),
+    //     executionId:getUrlParam("executionId")
+    // };
+    getUrlParam2();
+    getConfig(function(){
+        init(param);
+    });
+
+});
+function getConfig(callback){
+    $.getJSON(projectName + "config.json",function(data){
+        configData = data;
+        $webUtil = new vciWebUtil();
+        if(configData.isDebug == "true" || configData.isDebug == true){
+            path = configData.backPath;
+        }else{
+            path = pathName;
+            if(pathName.indexOf("/")>-1){
+                path = path.substring(0,path.lastIndexOf("/")) + "/mes";
+            }
+        }
+        isDebug = configData.isDebug;
+        $webUtil = new vciWebUtil();
+        if(callback){
+            callback();
+        }
+    });
+}
+function getUrlParam(name){
+    var reg = new RegExp("(^|&)"+name+"=([^&]*])(&|$)");
+    var param = iframePath.search.substr(1).match(reg);
+    if(param!=null){
+        return decodeURIComponent(param[2])
+    }else{
+        return null
+    }
+}
+function getUrlParam2() {
+   //鑾峰彇杩炴帴鍦板潃
+   var url = document.location.toString();
+   //鍒嗛殧寮�杩炴帴,鐢�?鎶婁紶鐨勫�煎彇鍑烘潵
+   var arrObj = url.split("?");
+   //鍒ゆ柇杩炴帴閲岄潰鏄笉鏄湁鍊�,濡傛灉鏈夊垯鎵ц涓嬮潰鎿嶄綔
+   if (arrObj.length > 1) {
+        //鍙栧嚭鎵�鏈変紶鐨勫��
+        var arrPara = arrObj[1].split("&");
+        var arr;
+        for (var i = 0; i < arrPara.length; i++) {
+            arr = arrPara[i].split("=");
+            //鎶婄浜屼釜鍊艰祴鍊肩粰绗竴涓��
+            param[arr[0]] = arr[1];
+        }
+   }
+}
+function init(param){
+    layui.config({
+        base:projectName +configData.webJsLib
+    });
+    layui.isDebug = isDebug;
+    layui.use(['vciAlias'],function(){
+        var alias = layui.vciAlias;
+        alias.configAlias();
+        layui.use(['view/process/vciWebProExecuteTask'], function () {
+            var executeTask = layui['view/process/vciWebProExecuteTask'];
+            executeTask.init();
+            $webUtil.post("/webProcessDefineController/getTaskByOid",{taskOid:param.todoOid},function(result){
+                if(result.success && result.obj && result.obj.length > 0){
+                    var taskInfo = [];
+                    taskInfo.push({
+                        taskOid:result.obj[0].oid,
+                        taskName:result.obj[0].name,
+                        executionId:result.obj[0].executionid
+                    });
+                    executeTask.showExecuteWindow(taskInfo,{
+                        full:true,
+                        fullScreen:true
+                    },function(finish){
+
+                    });
+                }else{
+                    $webUtil.showErrorMsg(result.msg);
+                }
+            },function(xhr,error){
+                $webUtil.showErrorMsg("鏌ョ湅娴佺▼浠诲姟鍑洪敊");
+            },path);
+        });
+    });
+}
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/vcijs/singleLogin.js b/Source/platformProject/platform2022UI/jslib/vcijs/singleLogin.js
new file mode 100644
index 0000000..16b864c
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/vcijs/singleLogin.js
@@ -0,0 +1,165 @@
+//澶勭悊鐧诲綍椤甸潰鐨勭浉鍏冲姩浣�
+//weidy@2013-08-01
+
+var path = "";//鍚庡彴璺緞
+var configData = {};
+var browserInfo = null;
+var processStep = 0;
+var processInterval = null;
+var usedTime = 0;
+var projectName = "";
+var pathName = "";
+$(document).ready(function() {
+    // 鍏堝垽鏂祻瑙堝櫒鐗堟湰
+    browserInfo = checkBrowser();
+    pathName = window.document.location.pathname;
+    projectName = pathName.substring(0, pathName.substr(1).indexOf('/') + 1) + "/";
+    //澶勭悊椤甸潰鐨勫唴瀹�
+    getConfig(function(){
+        checkParamFromSso(function(username,params){
+            doSingleLogin(username,params);
+        });
+    });
+});
+function getConfig(callback){
+    $.getJSON(projectName + "config.json",function(data){
+        configData = data;
+        if(configData.isDebug == "true" || configData.isDebug == true){
+            path = configData.backPath;
+        }else{
+            path = pathName;
+            if(pathName.indexOf("/")>-1){
+                path = path.substring(0,path.lastIndexOf("/"));
+            }
+        }
+        if(callback){
+            callback();
+        }
+    });
+}
+
+
+function checkParamFromSso(callback){
+    $.ajax({
+        url:window.location,
+        type:'POST',
+        success:function(data,textStatus,jqXHR){
+            var userid = jqXHR.getResponseHeader('iv-user');
+            if(!userid || userid == null || userid == ''){
+                showError("娌℃湁鑾峰彇鍒扮敤鎴峰悕,鏃犳硶鎵ц鍗曠偣鐧诲綍");
+                return false;
+            }
+            var params = new Object();
+            var url = window.location.search;
+            if (url.indexOf("?") != -1) {
+                var str = url.substr(1);
+                strs = str.split("&");
+                for(var i = 0; i < strs.length; i ++) {
+                    params[strs[i].split("=")[0]] = unescape(strs[i].split("=")[1]);
+                }
+            }
+            if(callback){
+                callback(userid,params);
+            }
+        },
+        error:function(jqXHR,textStatus,errorThrown){
+            showError("鍑虹幇浜嗗紓甯革紝鏃犳硶鍗曠偣鐧诲綍锛�" + textStatus);
+        }
+    });
+}
+
+function crosPost(url1,data,callback,errorCallback){
+    $.ajax({
+        type:'post',
+        // xhrFields: {
+        //     withCredentials: true
+        // },
+        // crossDomain: configData.isDebug?(true == !(document.all)):false,
+        url:path + url1,
+        data:data,
+        success:function(data){
+            var result = eval("(" + data + ")");
+            if(callback){
+                callback(result);
+            }
+        },
+        error:function(xhr,error){
+            if(errorCallback){
+                errorCallback(xhr,error);
+            }
+        }
+    });
+}
+
+
+// 鏄剧ず閿欒
+function showError(text) {
+    $("#msg").html( text);
+    $("#errorMsg").show();
+}
+
+
+
+// 鐧诲綍
+function doSingleLogin(userid,params) {
+    showLoading();
+    var loginData = {
+        userid : userid,
+        password : "",
+        isForceLogin : true,
+        browser:browserInfo.browser,
+        browserversion:browserInfo.browserversion,
+        osversion: browserInfo.osversion
+    };
+    for(var key in params){
+        loginData[key] = params[key];
+    }
+    //鍥犱负姣忎釜椤圭洰锛屽湪鐧诲綍鍚庤幏鍙栫殑鍐呭鍙兘浼氭湁涓嶄竴鏍凤紝鎵�浠ョ櫥褰曠殑璺緞鏀寔閰嶇疆configData.loginUrl
+    crosPost(configData.singleLoginUrl,loginData,function(result){
+        hideLoading();
+        if(result == undefined || result == null){
+            showError("鐧诲綍鍑虹幇浜嗛敊璇紒璇锋煡鐪嬫湇鍔″櫒鏄惁寮�鍚�");
+        }
+        if (result.success){
+            window.location.href = projectName + "main.html";
+        }else {
+            showError(result.msg);
+        }
+    },function(xhr,error){
+        hideLoading();
+        showError(error);
+    });
+}
+
+function showLoading(){
+    $(".loadbg").show();
+    $(".processbar").show();
+    $(".loading").show();
+    var preWidth = $(".loading").css("width");
+    if(preWidth.indexOf("px")>-1){
+        preWidth = preWidth.replace("px","");
+    }
+    preWidth = preWidth*1/10;
+    processInterval = window.setInterval(function(){
+        $("#useTime").html(usedTime + 1);
+        $(".processbar").css("width",preWidth*(processStep+1));
+        usedTime ++;
+        processStep ++ ;
+        if(processStep == 10){
+            processStep = 0;
+        }
+    },1000);
+}
+function hideLoading(){
+    $(".loadbg").hide();
+    $(".processbar").hide();
+    $(".loading").hide();
+    processStep = 0;
+    usedTime =0;
+    if(processInterval != null){
+        window.clearInterval(processInterval);
+    }
+}
+
+
+
diff --git a/Source/platformProject/platform2022UI/jslib/vcijs/vciWebUtil.js b/Source/platformProject/platform2022UI/jslib/vcijs/vciWebUtil.js
new file mode 100644
index 0000000..05de926
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/vcijs/vciWebUtil.js
@@ -0,0 +1,1655 @@
+/**
+閫氱敤鐨勫伐鍏风被
+@author weidy
+*/
+
+/**
+ * 鍘婚櫎鍓嶅悗绌烘牸
+ */
+String.prototype.trim = function(){
+	try {
+		return this.replace(/(^\s*)|(\s*$)/g, '');
+	}catch (e){
+		return this;
+	}
+};
+/**
+ * 鏁扮粍鍏冪礌绱㈠紩,娌℃湁璇ュ�兼椂杩斿洖-1
+ */
+Array.prototype.indexOf = function(val) {
+	for (var i = 0; i < this.length; i++) {
+		if (this[i] == val) return i;
+	}
+	return -1;
+};
+
+Array.prototype.remove = function(val) {
+	var index = this.indexOf(val);
+	if (index > -1) {
+		this.splice(index, 1);
+	}
+};
+window.innerWidth =window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
+window.innerHeight =window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
+(function($){
+	vciWebUtil=function() {
+		this.sessionInfoKey = {
+			orgsOid: 'orgsOid', //鐢ㄦ埛鎵�灞炵粍缁�
+			orgsName: 'orgsName',//鐢ㄦ埛鎵�灞炵粍缁囧悕绉�
+			deptOid: 'deptOid',//鎵�灞為儴闂�
+			deptName: 'deptName',//鎵�灞為儴闂ㄥ悕绉�
+			userOid: 'userOid',//鐢ㄦ埛涓婚敭
+			userId: 'userId',//鐢ㄦ埛鍚�
+			userName: 'userName',//鐢ㄦ埛濮撳悕
+			personOid: 'personOid',//鐢ㄦ埛韬唤涓婚敭
+			personName: 'personName',//鐪熷疄韬唤鍚嶇О
+			workgroupOid: 'workgroupOid',//鎵�灞炵彮缁�--杩欎釜鏄疢ES208鐙湁鐨�
+			workgroupName: 'workgroupName',//鎵�灞炵彮缁勫悕绉�--杩欎釜鏄疢ES208鐙湁鐨�
+			usertype: 'usertype',//鐢ㄦ埛鐨勭被鍨�
+			usertypeText: 'usertypeText',//鐢ㄦ埛绫诲瀷鏂囨湰
+			sex: 'sex',//鎬у埆
+			sextext: 'sextext',//鎬у埆鍚嶇О
+			photoUrl: 'photoUrl',//鐢ㄦ埛澶村儚
+			isMustChangePassword: 'isMustChangePassword', //鏄惁椹笂淇敼瀵嗙爜
+			passwordInfo: 'passwordInfo',
+			token: 'token',
+			userSecret: 'userSecret',
+			userSecretText: 'userSecretText'
+		};
+		this.systemValueKey = {
+			currentDateTime: 'curentDateTime',
+			currentDateTimeE: 'curentDateTimeE',
+			currentDateTimeSSS: 'curentDateTimeSSS',
+			currentDate: 'currentDate',
+			currentTime: 'currentTime',
+			uuid: 'uuid',
+			orgsOid: 'orgsOid',
+			orgsName: 'orgsName',
+			deptOid: 'deptOid',
+			deptName: 'deptName',
+			userOid: 'userOid',
+			userId: 'userId',
+			userName: 'userName',
+			personOid: 'personOid',
+			personName: 'personName',
+			workgroupOid: 'workgroupOid',
+			workgroupName: 'workgroupName',
+			usertype: 'usertype',
+			usertypeText: 'usertypeText',
+			sex: 'sex',
+			sextext: 'sextext',
+			photoUrl: 'photoUrl',
+			isMustChangePassword: 'isMustChangePassword',
+			passwordInfo: 'passwordInfo',
+			ip: 'ip',
+			language: 'language',
+			userSecret: 'userSecret',
+			userSecretText: 'userSecretText'
+		};
+		this.deptOid = ''; // 鐧诲綍鏃朵繚瀛樼敤鎴烽儴闂�
+		this.uuid = function () {
+			var s = [];
+			var hexDigits = "0123456789ABCDEF";
+			for (var i = 0; i < 36; i++) {
+				s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
+			}
+			s[14] = "4";
+			s[19] = hexDigits.substr(s[19] & 0x3 | 0x8, 1);
+			s[8] = s[13] = s[18] = s[23] = "-";
+			return s.join('');
+		};
+
+		this.isNotNull = function (v) {//涓嶄负绌�
+			if (v != undefined && v != null && v.toString().length > 0)
+				return true;
+			else
+				return false;
+		};
+		this.objIsNull = function (v) {
+			var result = true;
+			for (var key in v) {
+				if (v[key]) {
+					result = false;
+					break;
+				}
+			}
+			return result;
+		};
+		this.isNull = function (v) {//涓虹┖
+			var me = this;
+			return !me.isNotNull(v);
+		};
+		this.endWith = function (string, subStr) {//浠ヤ粈涔堢粨灏�
+			string=string.toString();
+			var me = this;
+			if (me.isNull(string) || me.isNull(subStr))
+				return false;
+			if (string.length < subStr.length)
+				return false;
+			if (string.substring(string.length - subStr.length) == subStr)
+				return true;
+			else
+				return false;
+		};
+		this.startWith = function (string, subStr) {//浠ヤ粈涔堝紑澶�
+			string=string.toString();
+			var me = this;
+			if (me.isNull(string) || me.isNull(subStr))
+				return false;
+			if (string.length < subStr.length)
+				return false;
+			if (string.substring(0, subStr.length) == subStr)
+				return true;
+			else
+				return false;
+		};
+		this.isArray = function (array) {
+			if (!array) {
+				return false;
+			} else {
+				if (Object.prototype.toString.call(array) == '[object Array]') {
+					return true;
+				} else {
+					return false;
+				}
+			}
+		};
+		this.inArray = function (array, v) {//鏄惁鍦ㄦ暟缁勪腑
+			try {
+				for (var i = 0; i < array.length; i++) {
+					if (v == array[i])
+						return true;
+				}
+			} catch (e) {
+
+			}
+			return false;
+		};
+		this.removeFormArray = function (array, v, attr) {
+			try {
+				for (var i = 0; i < array.length; i++) {
+					if (v == array[i] || (attr && array[i][attr] == v[attr])) {
+						array.splice(i, 1);
+						return true;
+					}
+				}
+			} catch (e) {
+
+			}
+		};
+		this.showMsgFromResult = function (result, defaultMsg, callback) {
+			if (!result) {
+				result = {
+					msg: defaultMsg
+				};
+			}
+			if (result && this.isNull(result.msg)) {
+				result.msg = defaultMsg;
+			}
+			this.showMsg(result.msg, callback);
+		};
+		this.showMsg = function (msg, callBack) {//鏄剧ず淇℃伅
+			if (!msg) {
+				msg = "";
+			}
+			if (callBack) {
+				top.layer.msg(msg, callBack);
+			} else {
+				top.layer.msg(msg);
+			}
+		};
+		this.showDebugMsg = function (msg) {
+			if (!msg) {
+				msg = "";
+			}
+			if (top.isDebug) {
+				try {
+					console.log(msg);
+				} catch (e) {
+
+				}
+			}
+		};
+		this.showConfirmMsg = function (title, callback, cancleCallback) {
+			var lastCallback = function (index) {
+				if (callback) {
+					callback(index);
+				}
+				top.layer.close(index);
+			};
+			top.layer.confirm(title, {icon: 3, title: '闇�瑕佹偍纭'}, lastCallback, cancleCallback);
+		};
+		this.showErrorMsg = function (msg, callback) {
+			if (!msg) {
+				msg = "";
+			}
+			var lastCallback = function (index) {
+				if (callback) {
+					callback(index);
+				}
+				top.layer.close(index);
+			};
+			top.layer.alert(msg, lastCallback);
+			if (top.isDebug && console) {//璋冭瘯鐨勬椂鍊欐妸寮曠敤鏂规硶鐨勪俊鎭墦鍗板嚭鏉�
+				try {
+					throw msg;
+				} catch (e) {
+					var caller = arguments.callee;
+					//console.log(caller.caller);
+				}
+			}
+		};
+		this.showAutoMsg = function (msg, timeout, callback) {
+			if (!msg) {
+				msg = "";
+			}
+			top.layer.msg(msg, {icon: 1, time: timeout}, callback);
+		};
+		this.showProgress = function (text) {
+			if (top.progressIndex) {
+
+			}else {
+				//this.closeProgress();
+				try {
+					if (this.isNotNull(text)) {
+						top.progressIndex = top.layer.load(2, {content: text, area: ['350px', 'auto']});
+						$(".layui-layer-loading2").css("width", "100%");
+						$(".layui-layer-loading2").css("background-positionX", "30px");
+						$(".layui-layer-loading2").css("background-positionY", "center");
+						$(".layui-layer-loading2").css("background-color", "#fff");
+						$(".layui-layer-loading2").css("line-height", "30px");
+						$(".layui-layer-loading2").css("font-size", "20px");
+						$(".layui-layer-loading2").css("font-weight", "bold")
+						$(".layui-layer-loading2").css("display", "table")
+						$(".layui-layer-loading2 .layui-layer-content-pane").css("display", "table-cell")
+						$(".layui-layer-loading2 .layui-layer-content-pane").css("vertical-align", "middle")
+						$(".layui-layer-loading2 .layui-layer-content-pane").css("padding", "30px 30px 30px 85px");
+					}
+				} catch (e) {
+
+				}
+			}
+
+		};
+		this.closeProgress = function () {
+			try {
+				if (top.progressIndex) {
+					top.layer.close(top.progressIndex);
+					top.progressIndex = null;
+				}
+			} catch (e) {
+
+			}
+		};
+		this.checkResult = function (result) {//妫�鏌ョ粨鏋滐紝寮傛璇锋眰鐨勬椂鍊欎娇鐢ㄨ繖涓�
+			var me = this;
+			try {
+				if (!result) {
+					me.showMsg("娌℃湁杩斿洖缁撴灉");
+					return false;
+				}
+				if (result && result.isNoLogin) {
+					me.showLoginDialog();
+					return false;
+				}
+				if (result && result.isNoRigh) {
+					me.showMsg("浣犳病鏈夋潈闄愬仛姝ゆ搷浣�");
+					return false;
+				}
+				if (!result.success) {
+					me.showMsg(result.msg);
+					return false;
+				}
+				return true;
+			} catch (e) {
+
+			}
+			return false;
+		};
+		this.processNullForObject = function (obj) {//澶勭悊绌哄��
+			var me = this;
+			if (obj && typeof obj == "object") {
+				for (var key in obj) {
+					var value = obj[key];
+					if (me.isNull(value))
+						value = "";
+				}
+			}
+		};
+		this.getIEVersion = function () {
+			var IEVersion = {};
+			if (navigator.userAgent.toLowerCase().indexOf("msie") > -1) {
+				IEVersion['isIE'] = true;
+				var version = $.browser.version;
+				version = parseInt(version.substring(0, version.indexOf('.')));
+				if (version <= 8) {
+					IEVersion['isIE8'] = true;
+				}
+			} else {
+				IEVersion['isIE'] = false;
+			}
+			return IEVersion;
+		};
+		/**
+		 * 鏀寔绯荤粺鍙傛暟鍖呮嫭:
+		 */
+		this.getSystemVar = function (code) {
+			var me = this;
+			if (me.isNull(code))
+				return "";
+			if (me.systemValueKey.currentDateTime == code) {
+				return me.getSystemVar(me.systemValueKey.currentDate) + " " + me.getSystemVar(me.systemValueKey.currentTime);
+			}
+			if (me.systemValueKey.currentDateTimeSSS == code) {
+				var date = new Date();
+				return me.getSystemVar(me.systemValueKey.currentDateTime) + "." + date.getMilliseconds();
+			}
+			if (me.systemValueKey.currentDate == code) {
+				var date = new Date();
+				var month = date.getMonth() + 1;
+				if (month >= 1 && month <= 9)
+					month = "0" + month;
+				var day = date.getDate();
+				if (day >= 0 && day <= 9)
+					day = "0" + day;
+				return date.getFullYear() + "-" + month + "-" + day;
+			}
+			if (me.systemValueKey.currentDateTimeE == code) {//鍚湁鏄熸湡鍑�
+				var date = new Date();
+				var week = date.getDay();
+				var weekName = ['鏃�', '涓�', '浜�', '涓�', '鍥�', '浜�', '鍏�'];
+				dateStr += " 鏄熸湡" + weekName[week];
+				return me.getSystemVar(me.systemValueKey.currentDateTime) + dateStr;
+			}
+			if (me.systemValueKey.currentTime == code) {
+				var date = new Date();
+				var hours = date.getHours();
+				if (hours >= 0 && hours <= 9)
+					hours = "0" + hours;
+				var minutes = date.getMinutes();
+				if (minutes >= 0 && minutes <= 9)
+					minutes = "0" + minutes;
+				var secends = date.getSeconds();
+				if (secends >= 0 && secends <= 9)
+					secends = "0" + secends;
+				return hours + ":" + minutes + ":" + secends;
+			}
+			if (me.systemValueKey.uuid == code) {
+				return me.uuid();
+			}
+			var value = top.mySessionInfo[code];
+			if (value == undefined || value == null)
+				return "";
+			else
+				return value;
+		};
+		this.isSso = function () {
+			var me = this;
+			return me.getSystemVar('sso');
+		};
+		this.getSsoinfo = function () {
+			var me = this;
+			return me.getSystemVar('ssoInfo');
+		};
+		this.getToken = function () {
+			var me = this;
+			var token = me.getSystemVar(me.sessionInfoKey.token);
+			if (!token) {
+				token = $.cookie(TOKEN_KEY);
+			}
+			return token;
+		};
+		this.getWorkGroupName = function () {
+			var me = this;
+			return me.getSystemVar(me.sessionInfoKey.workgroupName);
+		};
+		this.getRolesName = function () {
+			var me = this;
+			return me.getSystemVar("rolesname")
+		};
+		this.isNumber = function (value) {
+			var reg = new RegExp("^[0-9]+$");
+			if (reg.test(value)) {
+				return true;
+			} else {
+				return false;
+			}
+		};
+		this.isValidCharactor = function (value) {
+			var reg = new RegExp("^[0-9A-Za-z_]*$");
+			if (reg.test(value)) {
+				return true;
+			} else {
+				return false;
+			}
+		};
+		this.dateFormate = {
+			dateTime: 'yyyy-MM-dd HH:mm:ss',
+			date: 'yyyy-MM-dd',
+			dateNoSecond: 'yyyy-MM-dd HH:mm'
+		};
+		this.formateDateTime = function (value) {
+			return this.formateDateByFormate(value, 'yyyy-MM-dd HH:mm:ss');
+		};
+		this.formateDateTimeNoSecond = function (value) {
+			var that = this;
+			return this.formateDateByFormate(value, 'yyyy-MM-dd HH:mm');
+		};
+		this.formateDate = function (value) {
+			return this.formateDateByFormate(value, 'yyyy-MM-dd');
+		};
+		this.formateDateByFormate = function (value, formate) {
+			if (value != null && formate != null) {
+				//楠岃瘉value
+				var valueType = typeof value;
+				if (valueType == 'number') {
+					value = value.toString();
+				}
+				if (value.substring(0, 4).indexOf("-") != -1 || value.substring(0, 4).indexOf("/") != -1) {
+					value = "20" + value
+				}
+				return layui.util.toDateString(value, formate);
+			} else {
+				return "";
+			}
+		};
+		this.formateUserSecret = function (value) {
+			if (value * 1 == 30) {
+				return "閲嶈";
+			} else if (value * 1 == 20) {
+				return "涓�鑸�";
+			} else if (value * 1 == 10) {
+				return "鍐呴儴";
+			} else {
+				return "榛樿[鍐呴儴]"
+			}
+		};
+		this.formateDataSecret = function (value) {
+			if (value * 1 == 30) {
+				return "鏈哄瘑";
+			} else if (value * 1 == 20) {
+				return "绉樺瘑";
+			} else if (value * 1 == 10) {
+				return "闈炲瘑";
+			} else {
+				return "榛樿[闈炲瘑]"
+			}
+		};
+		this.formateBoolean = function (value) {
+			if (!value) {
+				return '鍚�';
+			}
+			if (value == true || (value != null && 'true' == value.toLowerCase())) {
+				return "鏄�";
+			}
+			return "鍚�";
+		};
+		this.displayButton = function (buttonInfo) {//鏄剧ず/闅愯棌鎸夐挳
+			for (var buttonId in buttonInfo) {
+				if (buttonInfo[buttonId]) {
+					$(buttonId).show();
+				} else {
+					$(buttonId).hide();
+				}
+			}
+		};
+		this.getObjectLength = function (obj) {//鑾峰彇瀵硅薄閲岀殑灞炴�т釜鏁�
+			if (!obj) {
+				return 0;
+			} else {
+				var l = 0;
+				for (var key in obj) {
+					l++;
+				}
+				return l;
+			}
+		};
+		this.getOidFromGrid = function (gridId, checkEmpty, checkOne, pk) {
+			if (!pk) {
+				pk = "oid";
+			}
+			var checkData = layui.table.checkStatus(gridId);
+			var oids = "";
+			if (checkData && checkData.data && checkData.data.length > 0) {
+				var rows = checkData.data;
+				for (var i = 0; i < rows.length; i++) {
+					var value = rows[i][pk];
+					if (!value || value == "undefined") {
+						value = "";
+					}
+					if (i == rows.length - 1) {
+						oids += value;
+					} else {
+						oids += value + ",";
+					}
+				}
+			}
+			var me = this;
+			if (checkEmpty && me.isNull(oids)) {
+				me.showErrorMsg("娌℃湁閫夋嫨鏁版嵁");
+				return false;
+			}
+			if (checkOne && oids.indexOf(",") > -1) {
+				me.showErrorMsg("姣忔鍙兘閫夋嫨涓�鏉℃暟鎹�");
+				return false;
+			}
+			return oids;
+		};
+		//鏍煎紡濡俲sPath#methodName?param=aaa&param1=bbb
+		this.getUrlParams = function (url, urlobj, splitMethod, splitParams) {
+			if (!urlobj) {
+				urlobj = {
+					jsPath: '',
+					methodName: '',
+					params: {}
+				}
+			}
+			if (!urlobj['params']) {
+				urlobj['params'] = {}
+			}
+			if (!splitMethod) {
+				splitMethod = '#'
+			}
+			if (!splitParams) {
+				splitParams = '&'
+			}
+			if (url && url != 'null') {
+				urlobj['jsPath'] = url.split('?')[0].split(splitMethod)[0];
+				if (url.indexOf(splitMethod) > -1) {
+					urlobj['methodName'] = url.split('?')[0].split(splitMethod)[1];
+				} else {
+					urlobj['methodName'] = 'doAction'
+				}
+				if (url.indexOf('?') > -1) {
+					var params = url.split('?')[1].split(splitParams);
+					layui.each(params, function (i, item) {
+						urlobj['params'][item.split('=')[0]] = item.split('=')[1]
+					})
+				}
+			}
+			return urlobj
+		}
+
+		this.postJsonP = function (ip, funcName, data, callback, failcallback) {
+			if (!ip || this.isNull(ip)) {
+				alert("杩欎釜椤甸潰娌℃湁浼犻�抜p鍦板潃");
+				return;
+			}
+			var url = "http://" + ip + funcName;
+			$.ajax({
+				type: 'post',
+				url: url,
+				dataType: 'jsonp',
+				data: data,
+				cache: false,
+				async: false,
+				success: function (json) {
+					if (json && callback) {
+						callback(json);
+					}
+				},
+				error: function (result) {
+					if (failcallback) {
+						failcallback(result);
+					}
+				}
+			});
+		};
+		this.post = function (url, data, callback, errorCallback, newPath, noprogress, isasync) {
+			var that = this;
+			if (isasync) {
+				that.async("post", url, data, callback, errorCallback, newPath, noprogress);
+			} else {
+				that.ajax("post", url, data, callback, errorCallback, newPath, noprogress);
+			}
+		};
+		this.ajax = function (requestType, url, data, callback, errorCallback, newPath, noprogres) {
+			var that = this;
+			url = newPath ? newPath + url : (that.startWith(url, "http:") ? url : (path + url));
+			if (!noprogres) {
+				that.showProgress("鎵ц涓�,璇风◢鍊�...");
+			}
+			var header = {};
+			header[TOKEN_KEY] = that.getToken();
+			$.ajax({
+				type: requestType,
+				headers: header,
+				url: url,
+				data: data,
+				cache: false,
+				contentType: "application/x-www-form-urlencoded",
+				success: function (data) {
+					that.closeProgress();
+					var result = {};
+					if (typeof (data) == 'string') {
+						if (data && data.length > 0)
+							result = eval("(" + data + ")");
+					} else {
+						result = data;
+					}
+					if (callback) {
+						callback(result);
+					}
+				},
+				error: function (xhr, error) {
+					that.closeProgress();
+					if (errorCallback) {
+						errorCallback(xhr, error);
+					}
+				}
+			});
+		};
+		this.manualAjax = function (requestType, url, data, callback, errorCallback, newPath, noprogres) {
+			var that = this;
+			jQuery.support.cors = true;
+			url = newPath ? newPath + url : (that.startWith(url, "http:") ? url : (path + url));
+			if (!noprogres) {
+				that.showProgress("鎵ц涓�,璇风◢鍊�...");
+			}
+			var header = {};
+			header[TOKEN_KEY] = that.getToken();
+			$.ajax({
+				type: requestType,
+				headers: header,
+				url: url,
+				data: data,
+				cache: false,
+				contentType: "application/json",
+				success: function (data) {
+					that.closeProgress();
+					var result = {};
+					if (typeof (data) == 'string') {
+						if (data && data.length > 0)
+							result = eval("(" + data + ")");
+					} else {
+						result = data;
+					}
+					if (callback) {
+						callback(result);
+					}
+				},
+				error: function (xhr, error) {
+					that.closeProgress();
+					if (errorCallback) {
+						errorCallback(xhr, error);
+					}
+				}
+			});
+		};
+		this.async = function (requestType, url, data, callback, errorCallback, newPath, noprogres) {
+			var that = this;
+			jQuery.support.cors = true;
+			url = newPath ? newPath + url : (that.startWith(url, "http:") ? url : (path + url));
+			if (!noprogres) {
+				that.showProgress("鎵ц涓�,璇风◢鍊�...");
+			}
+			var header = {};
+			header[TOKEN_KEY] = that.getToken();
+			$.ajax({
+				type: requestType,
+				async: true,
+				headers: header,
+				//crossDomain: true == !(document.all),
+				url: url,
+				data: data,
+				success: function (data) {
+					that.closeProgress();
+					var result = {};
+					if (typeof (data) == 'string') {
+						if (data && data.length > 0)
+							result = eval("(" + data + ")");
+					} else {
+						result = data;
+					}
+					if (callback) {
+						callback(result);
+					}
+				},
+				error: function (xhr, error) {
+					that.closeProgress();
+					if (errorCallback) {
+						errorCallback(xhr, error);
+					}
+				}
+			});
+		};
+		// 鍚屾
+		this.synchro = function (url, data, callback, errorCallback, newPath, noprogres) {
+			var that = this;
+			jQuery.support.cors = true;
+			url = newPath ? newPath + url : (that.startWith(url, "http:") ? url : (path + url));
+			if (!noprogres) {
+				that.showProgress("鎵ц涓�,璇风◢鍊�...");
+			}
+			var header = {};
+			header[TOKEN_KEY] = that.getToken();
+			$.ajax({
+				type: 'get',
+				async: false,
+				headers: header,
+				url: url,
+				data: data,
+				success: function (data) {
+					that.closeProgress();
+					var result = {};
+					if (typeof (data) == 'string') {
+						if (data && data.length > 0)
+							result = eval("(" + data + ")");
+					} else {
+						result = data;
+					}
+					if (callback) {
+						callback(result);
+					}
+				},
+				error: function (xhr, error) {
+					that.closeProgress();
+					if (errorCallback) {
+						errorCallback(xhr, error);
+					}
+				}
+			});
+		};
+		// 鍚屾
+		this.syncpost = function (url, data, callback, errorCallback, newPath, noprogres) {
+			var that = this;
+			jQuery.support.cors = true;
+			url = newPath ? newPath + url : (that.startWith(url, "http:") ? url : (path + url));
+			if (!noprogres) {
+				that.showProgress("鎵ц涓�,璇风◢鍊�...");
+			}
+			var header = {};
+			header[TOKEN_KEY] = that.getToken();
+			$.ajax({
+				type: 'post',
+				async: false,
+				headers: header,
+				url: url,
+				data: data,
+				success: function (data) {
+					that.closeProgress();
+					var result = {};
+					if (typeof (data) == 'string') {
+						if (data && data.length > 0)
+							result = eval("(" + data + ")");
+					} else {
+						result = data;
+					}
+					if (callback) {
+						callback(result);
+					}
+				},
+				error: function (xhr, error) {
+					that.closeProgress();
+					if (errorCallback) {
+						errorCallback(xhr, error);
+					}
+				}
+			});
+		};
+		this.get = function (url, data, callback, errorCallback, newPath, noProgress, isAsync) {
+			var that = this;
+			if (isAsync) {
+				that.async("get", url, data, callback, errorCallback, newPath, noProgress);
+			} else {
+				that.ajax("get", url, data, callback, errorCallback, newPath, noProgress);
+			}
+		};
+		this.put = function (url, data, callback, errorCallback, newPath, noProgress, isAsync) {
+			var that = this;
+			if (isAsync) {
+				that.async("put", url, data, callback, errorCallback, newPath, noProgress);
+			} else {
+				that.ajax("put", url, data, callback, errorCallback, newPath, noProgress);
+			}
+		};
+		this.deleteRequest = function (url, data, callback, errorCallback, newPath, noProgress, isAsync) {
+			var that = this;
+			if (isAsync) {
+				that.async("delete", url, data, callback, errorCallback, newPath, noProgress);
+			} else {
+				that.ajax("delete", url, data, callback, errorCallback, newPath, noProgress);
+			}
+		};
+		this.postForCheckId = function (url, data, callback, errorCallback, newPath, showProgress, isasync, noprogress) {
+			var that = this;
+			jQuery.support.cors = true;
+			url = newPath ? newPath + url : (that.startWith(url, "http:") ? url : (path + url));
+			var header = {};
+			header[TOKEN_KEY] = that.getToken();
+			$.ajax({
+				type: 'post',
+				async: !isasync,
+				headers: header,
+				url: url,
+				data: data,
+				success: function (data) {
+					var result = {};
+					if (typeof (data) == 'string') {
+						if (data && data.length > 0)
+							result = eval("(" + data + ")");
+					} else {
+						result = data;
+					}
+					if (callback) {
+						callback(result);
+					}
+				},
+				error: function (xhr, error) {
+					//that.closeProgress();
+					if (errorCallback) {
+						errorCallback(xhr, error);
+					}
+				}
+			});
+		};
+		this.postSetHeader = function (url, data, callback, errorCallback, newPath) {
+			var that = this;
+			jQuery.support.cors = true;
+			url = newPath ? newPath + url : (that.startWith(url, "http:") ? url : (path + url));
+			$.ajax({
+				type: 'post',
+				async: true,
+				url: url,
+				data: data,
+				headers: {TOKEN_KEY: that.getToken(), 'appCode': '123', 'userId': that.getCurrentUserId()},
+				success: function (data) {
+					var result = {};
+					if (typeof (data) == 'string') {
+						if (data && data.length > 0)
+							result = eval("(" + data + ")");
+					} else {
+						result = data;
+					}
+					if (callback) {
+						callback(result);
+					}
+				},
+				error: function (xhr, error) {
+					//that.closeProgress();
+					if (errorCallback) {
+						errorCallback(xhr, error);
+					}
+				}
+			});
+		};
+		/**
+		 * 鏍规嵁婧愭暟鎹潵鑾峰彇鎸夐挳
+		 */
+		this.getButtionsBySourceData = function (sourceData, callback, backPath) {
+			var me = this;
+			if (sourceData) {
+				me.getButtionsByFunctionId(sourceData['functionId'], callback, backPath);
+			} else {
+				me.showDebugMsg("鏉ユ簮鏁版嵁涓病鏈塮unctionId鍙傛暟鐨勫��");
+				if (callback) {
+					callback([]);
+				}
+			}
+		};
+		/**
+		 * 鏍规嵁鑿滃崟鐨勭紪鍙疯幏鍙栨寜閽�
+		 */
+		this.getButtionsByFunctionId = function (functionId, callback, backPath) {
+			var me = this;
+			if (me.isNull(functionId)) {
+				if (callback) {
+					callback([]);
+				}
+			} else {
+				me.post("/webMenuController/getButtonsByFunctionId", {functionId: functionId}, function (result) {
+					if (callback) {
+						callback(result);
+					}
+				}, function (xhr, error) {
+					if (callback) {
+						callback([]);
+					}
+				}, backPath);
+			}
+		};
+		/**
+		 * 鍒涘缓鎸夐挳鐨刪tml
+		 * @param sourceData 鏉ユ簮鏁版嵁
+		 * @param buttonIconMap 鎸夐挳鐨勫浘鏍囨槧灏�,
+		 * @param buttonDivHtml 鎸夐挳鎵�鍦╠iv鐨勫厓绱犲璞�
+		 * @param appendButtons 涓嶅彈鏉冮檺鎺у埗鐨勬寜閽�
+		 * @param callback 鍥炶皟浜嬩欢
+		 * @param backPath 鍚庡彴璺緞锛屽父绌�
+		 */
+		this.createButtonHtml = function (sourceData, buttonIconMap, buttonDivHtml, buttonIdPrefix, appendButtons, callback, backPath) {
+			var me = this;
+			me.createButtonHtmlEx(sourceData, buttonIconMap, buttonDivHtml, buttonIdPrefix, appendButtons, null, callback, backPath);
+		};
+		this.createButtonHtmlEx = function (sourceData, buttonIconMap, buttonDivHtml, buttonIdPrefix, appendButtons, unDisplayButtons, callback, backPath) {
+			var me = this;
+			if (me.isNull(buttonIdPrefix)) {
+				buttonIdPrefix = "";
+			}
+			me.getButtionsBySourceData(sourceData, function (result) {
+				/**
+				 * 鍔熻兘鐨勪富閿� functionOid
+				 * 鍔熻兘鐨勭紪鍙� moduleNo
+				 * 鍔熻兘鍜屾寜閽叧鑱旂殑涓婚敭 oid
+				 * 鍞竴鏍囪瘑绗� uniqueFlag;
+				 * 鎻忚堪 description;
+				 * 鍦ㄥ姛鑳戒腑鐨勬帓搴忓彿 orderNo;
+				 * 鎸夐挳鍚嶇О name
+				 * 鎸夐挳鏄电О锛屾槸鍦ㄥ姛鑳藉拰鎸夐挳鐨勫叧鑱斾腑鐨勬樀绉帮紝鍓嶇浣跨敤杩欎釜鏉ユ樉绀烘寜閽� alias;
+				 * */
+				var buttons = result.obj;
+				if (!buttons) {
+					buttons = [];
+				}
+				if (appendButtons && appendButtons.length > 0) {//鎶婁笉鍙楁潈闄愭帶鍒剁殑鎸夐挳涔熸坊鍔犺繘鍘�
+					layui.each(appendButtons, function (_index, item) {
+						buttons.push(item);
+					});
+				}
+				var buttonHtml = [];
+				var hasViewRight = false;
+				var hasQueryRight = false;
+				layui.each(buttons, function (_index, _item) {
+					if (_item.uniqueFlag != 'VIEW' && _item.uniqueFlag != 'SEARCH'   //TODO 鏆傛椂涓嶆樉绀烘墍鏈夌殑楂樼骇鏌ヨ鎸夐挳
+						&& (!unDisplayButtons || unDisplayButtons == null || !me.inArray(unDisplayButtons, _item.uniqueFlag))) {//VIEW鏄樉绀鸿繖涓〉闈�
+						buttonHtml.push(me.getButtonHtmlFromBtnObject(_item, buttonIdPrefix, buttonIconMap));
+					} else {
+						if (_item.uniqueFlag == 'VIEW') {
+							hasViewRight = true;
+						}
+						if (_item.uniqueFlag == 'SEARCH') {
+							hasQueryRight = true;
+						}
+					}
+				});
+				buttonDivHtml.prepend(buttonHtml.join(''));//娣诲姞鍒板墠闈�
+				if (callback) {
+					callback(buttons, hasViewRight, hasQueryRight);
+				}
+			}, backPath);
+		};
+		this.getButtonHtmlFromBtnObject = function (button, buttonIdPrefix, buttonIconMap) {
+			var me = this;
+			var buttonHtml = [];
+			var executeJs = "";
+			if(me.isNotNull(button.executeJs)){
+				executeJs = " execute-js='" + button.executeJs + "' ";
+			}
+			buttonHtml.push('<button type="button" class="layui-btn layui-btn-sm" layui-filter="toolbar_');
+			buttonHtml.push(buttonIdPrefix);
+			buttonHtml.push('_');
+			buttonHtml.push(button.uniqueFlag);
+			buttonHtml.push('" ');
+			buttonHtml.push(executeJs);
+			buttonHtml.push('>');
+			buttonHtml.push('<i class="layui-icon ');
+			var thisButtonIcon = "";
+			if (buttonIconMap && button.uniqueFlag in buttonIconMap) {
+				thisButtonIcon = buttonIconMap[button.uniqueFlag];
+			}
+			if (me.isNull(thisButtonIcon)) {
+				if (button.uniqueFlag == 'SENIORSEARCH') {
+					thisButtonIcon = 'layui-icon-search';
+				} else if (button.uniqueFlag == 'refresh') {
+					thisButtonIcon = 'layui-icon-refresh';
+				} else {
+					thisButtonIcon = 'layui-icon-util';
+				}
+			}
+			buttonHtml.push(thisButtonIcon);
+			buttonHtml.push('"></i>');
+			buttonHtml.push(button.alias);
+			buttonHtml.push('</button>');
+			return buttonHtml.join("");
+		};
+		/**
+		 *    鍒涘缓榛樿鐨勬煡璇㈠尯鍩燂紝濡傛灉浼犻�掍簡tableId锛屽垯浼氳嚜鍔ㄨ嚜鍔ㄨ繘琛屾煡璇�
+		 */
+		this.createSearchHtml = function (searchNameMap, searchDiv, tableId) {
+			var me = this;
+			var ieVersion = me.getIEVersion();
+			var isShow = "none";
+			if (ieVersion.isIE) {
+				isShow = "block";
+			}
+			var html = ['<div class="layui-input-inline" style="position: relative;"><div id="selectWrapForIE" style="display:' + isShow + '"></div><select class="layui-btn layui-btn-sm layui-btn-primary" style="border:2px solid #C9C9C9;line-height: 18px;display: block" name="fast_search_select">'];
+			if (searchNameMap) {
+				for (var name in searchNameMap) {
+					if (me.isNotNull(name) && me.isNotNull(searchNameMap[name])) {
+						html.push('<option value="' + name + '">' + searchNameMap[name] + '</option>');
+					}
+				}
+			}
+			html.push('</select></div>');
+			html.push('<input class="layui-btn layui-btn-sm layui-btn-primary" type="text" name="fast_search_select_value" lay-verify="fast_search_select_value" placeholder="璇疯緭鍏ュ唴瀹规寜鍥炶溅鏌ヨ"/>');
+			html.push('<input name="fast_search_last_selectt_value" type="hidden" />');
+			searchDiv.append(html.join(''));
+			if (me.isNotNull(tableId)) {
+				//娣诲姞鐩戝惉
+				searchDiv.find('.layui-input-inline').on('click', function () {//鐐瑰嚮DIV涓嬫媺妗嗗睍寮�  鍙檺浜巌e
+					if (ieVersion.isIE) {
+						searchDiv.find('select[name="fast_search_select"]').focus();
+						var WshShell = new ActiveXObject("Wscript.Shell");
+						try {
+							WshShell.SendKeys("%{DOWN}")
+						} catch (e) {
+							WshShell.Quit
+						}
+					}
+				});
+				searchDiv.find('input[name="fast_search_select_value"]').keydown(function (e) {
+					if (e && e.keyCode == 13) {
+						var queryValue = $(this).val();
+						var queryKey = $(this).prev().find('select[name="fast_search_select"]').val();
+						var lastQueryKeyInput = $(this).next();
+						var lastQueryKey = lastQueryKeyInput.val();
+						if (me.isNotNull(queryKey)) {
+							var tableConfig = layui.table.getConfig(tableId)
+							if (tableConfig.page) {
+								tableConfig.page['curr'] = 1
+							} else {
+								tableConfig.page = {
+									curr: 1 //閲嶆柊鍔犺浇褰撳墠椤�
+								}
+							}
+							tableConfig.queryParams={}
+							tableConfig.queryParams['conditionMap["' + queryKey + '"]'] = (me.isNull(queryValue) ? "" : ("*" + queryValue + "*"));
+
+							lastQueryKeyInput.val(queryKey);
+							layui.table.setConfig(tableConfig);
+							layui.table.reload(tableId);
+						}
+						return false;
+					}
+					layui.stope(e);
+				});
+			}
+		};
+		this.showSearchHtml = function (queryColumns, tableId, filter, name, requestData) {
+			//璁剧疆鏌ヨ鍖哄煙
+			var that = this;
+			var table = layui.table;
+			var toolbarElem = $('[layui-filter="hisTable_' + filter + '"]');
+			//console.log('[layui-filter="hisTable_' + filter +'"]')
+			if (queryColumns) {
+				var toolbarHtml = '<div class="layui-form-item hisTable_dvi" style="height:24px;float:left;display:inline-block"> '
+					+ '<div class="layui-input-inline" style="height:24px;line-height:24px;width:150px"><select name="referGrid_search_' + filter + '_' + name + '" style="height:24px;width:120px;padding-right: 30px;">';
+				layui.each(queryColumns, function (_index, queryRecord) {
+					toolbarHtml += '<option value="' + queryRecord.field + '" >' + queryRecord.title + '</option>';
+				});
+				toolbarHtml += '</select></div>';
+				toolbarHtml += '<div class="layui-input-inline"><input type="text" style="height:24px" name="referGrid_searchvalue_' + filter + '_' + name + '" placeholder="杈撳叆鍊煎悗杩涜妯$硦鏌ヨ" class="layui-input" ></div>';
+				toolbarHtml += '<div class="layui-input-inline" ><button class="layui-btn" style="height:24px;line-height:24px" name="referGrid_searchbtn_' + filter + '_' + name + '" >鏌ヨ</button></div>';
+				toolbarHtml += '</div>';
+				toolbarElem.html(toolbarHtml);
+				layui.form.render('select');
+				$('[name="referGrid_searchbtn_' + filter + '_' + name + '"]').click(function () {
+					var searchField = $(this).parent().parent().find('select').val();
+					var searchValue = $(this).parent().parent().find('[name="referGrid_searchvalue_' + filter + '_' + name + '"]').val();
+					if ($webUtil.isNotNull(searchValue)) {
+						searchValue = "*" + searchValue + "*";
+					}
+					requestData['conditionMap["' + searchField + '"]'] = searchValue;
+					requestData['page'] = 1;
+					table.reload(
+						tableId, {
+							where: requestData
+						}
+					);
+				});
+			}
+		};
+		this.fastSearch = function (tableId) {
+			var that = this;
+			var thatid = tableId.substring(tableId.lastIndexOf("_") + 1);
+			var searchDiv = $('[layui-filter="toolbar_' + thatid + '"]').find('input[name="fast_search_select_value"]');
+			var queryValue = searchDiv.val();
+			var queryKey = searchDiv.prev().find('select[name="fast_search_select"]').val();
+			var lastQueryKeyInput = searchDiv.next();
+			var lastQueryKey = lastQueryKeyInput.val();
+			if (that.isNotNull(queryKey)) {
+				var options = {
+					where: {}
+				};
+				options.where['conditionMap["' + queryKey + '"]'] = (that.isNull(queryValue) ? "" : ("*" + queryValue + "*"));
+				if (that.isNotNull(lastQueryKey) && lastQueryKey != queryKey) {
+					options.where['conditionMap["' + lastQueryKey + '"]'] = "";
+				}
+				lastQueryKeyInput.val(queryKey);
+				layui.table.reload(tableId, options);
+			}
+		};
+		this.wrapperSourceDataByUrl = function(trueUrl,sourceData){
+			if(trueUrl.indexOf("?") > -1){//璇存槑鏈夊弬鏁�
+				var params = trueUrl.substring(trueUrl.indexOf("?")+1);
+				var paramsArray = params.split("&");
+				for(var i = 0 ; i < paramsArray.length ; i ++){
+					var preParam =paramsArray[i].split("=");
+					sourceData[preParam[0]] = preParam[1];
+				}
+			}
+		};
+		/**
+		 * 鍒涘缓榛樿鐨勬寜閽簨浠�
+		 */
+		this.bindDefultButtonLisenter = function (obj, buttonIdPrefix) {
+			var me = this;
+			$('[layui-filter^="toolbar_' + buttonIdPrefix + '_"]').unbind('click').click(function (e) {
+				var event = $(this).attr("layui-filter");
+				var executeJs = $(this).attr("execute-js");
+				var buttonThis = this;
+				if(executeJs){
+					var urlUp = executeJs.toUpperCase();
+					if($webUtil.startWith(urlUp,"USEJS:")) {
+						//璇存槑鏄娇鐢╦s缁勪欢
+						var trueUrl = executeJs.substring(6);
+						if ($webUtil.startWith(trueUrl, "//")) {
+							trueUrl = trueUrl.substring(2);
+						}
+						var sourceData = {};
+						me.wrapperSourceDataByUrl(trueUrl, sourceData);
+						if (trueUrl.indexOf("?") > -1) {
+							trueUrl = trueUrl.substring(0, trueUrl.indexOf("?"));
+						}
+						trueUrl = trueUrl.replace(/^\/+/, '');
+						layui.use([trueUrl], function () {
+							var buttonClass = layui[trueUrl];
+							buttonClass.id = event;
+							buttonClass.sourceData = sourceData;
+							buttonClass.buttonThis = buttonThis;
+							buttonClass.buttonThat = obj;
+							try {
+								buttonClass.executeButton();
+							}catch (ex) {
+								me.showDebugMsg(ex);
+							}
+						});
+					}
+				}else {
+					if (me.isNotNull(event) && event.indexOf("_") > -1) {
+						event = event.substring(event.lastIndexOf("_") + 1);
+						if (me.isNotNull(event)) {
+							if (event in obj) {
+								try {
+									obj[event](event, this);//鍦ㄥ叾涓墽琛岀浉搴旂殑鍐呭
+								} catch (ex) {
+									me.showDebugMsg(ex);
+								}
+							} else {
+								if (event == 'SENIORSEARCH' && "serinorQueryInstance" in obj) {
+									obj.serinorQueryInstance.open();
+								}
+
+							}
+						}
+					}
+				}
+				layui.stope(e);
+			});
+		};
+		/**
+		 *    鍒涘缓涓嬫媺妗�
+		 *    @selectNameMap 鏍煎紡[{attributes: {}, key: "web", value: "web鏈嶅姟"}]
+		 */
+		this.createSelectHtml = function (selectNameMap, selectDiv,selecId,selectcallback) {
+			var me = this;
+			if(typeof selecId !='string'){
+				selecId='fast_select'
+			}
+			function initHtml(selectNameMap, selectDiv,selectcallback){
+				var html = ['<select class="layui-btn layui-btn-sm layui-btn-primary" style="border:2px solid #C9C9C9;line-height: 18px;display: block" name="fast_select" id="'+selecId+'">'];
+				if (selectNameMap) {
+					for (var i=0;i<selectNameMap.length;i++){
+						html.push('<option value="' + selectNameMap[i].key + '" data="'+JSON.stringify(selectNameMap[i].attributes)+'">' + selectNameMap[i].value + '</option>');
+					}
+				}
+				html.push('</select>');
+				html.push('<input name="fast_select_value" type="hidden" />');
+				selectDiv.append(html.join(''));
+				if(selectcallback){
+					$('select[name="fast_select"]',selectDiv).on('change',function (){
+						var data= $(this).val();
+						selectcallback(data)
+					})
+				}
+			}
+			if(typeof selectNameMap =="string"){
+				$webUtil.ajax('get',selectNameMap,{},function (res) {
+					if(res.success){
+						initHtml(res.obj, selectDiv,selectcallback)
+					}else{
+						$webUtil.showErrorMsg(res.msg);
+					}
+				},function (xhr,error) {
+					$webUtil.showDebugMsg(error);
+				});
+			}else{
+				initHtml(selectNameMap, selectDiv,selectcallback)
+			}
+
+		};
+		//url杞爜鏂规硶 姹夊瓧杞瑄nicode
+		this.GB2312ToUnicode = function (str) {
+			return escape(str).toLocaleLowerCase().replace(/%u/gi, '\\u');
+		};
+		//url杞爜鏂规硶 unicode杞眽瀛�
+		this.unicodeToGB2312 = function (str) {
+			return unescape(str.replace(/\\u/gi, '%u'));
+		};
+		this.addEnterListener = function (key, funcs) {
+			var me = this;
+			if (!me.enterListeners) {
+				me.enterListeners = {};
+			}
+			me.enterListeners[key] = funcs;
+		};
+		this.clearEnterListener = function (key) {
+			var me = this;
+			if (!me.enterListeners) {
+				me.enterListeners = {};
+			}
+			if (key in me.enterListeners) {
+				delete me.enterListeners.key;
+			}
+		};
+		this.getDefaultValue = function (value, sourceData) {
+			var me = this;
+			if (value && me.startWith(value, "${") && me.endWith(value, "}")) {
+				//璇存槑鏄郴缁熷唴缃殑
+				return me.getSystemVar(value.replace("${", "").replace("}", ""));
+			} else if (value && me.startWith(value, "sourcedata.")) {// TODO 闇�瑕佽窡骞冲彴鐨勬暣鍚堝埌涓�璧� weidy
+				var attr = sourceData.replace("sourcedata.", '');
+				if (sourceData && attr in sourceData) {
+					return sourceDara[attr];
+				}
+			} else {
+				return value;
+			}
+		};
+		this.getCurrentUserId = function () {
+			var me = this;
+			var userid = me.getSystemVar(me.sessionInfoKey.userId);
+			return userid;
+		};
+		this.getCurrentUserOid = function () {
+			var me = this;
+			return me.getSystemVar(me.sessionInfoKey.userOid);
+		};
+		this.getCurrentUserName = function () {
+			var me = this;
+			return me.getSystemVar(me.sessionInfoKey.userName);
+		};
+		this.showLoginDialog = function () {
+			return portal.relogin();
+		};
+		this.formateDateValueForObj = function (obj, fields, dateFormate) {
+			var me = this;
+			if (obj) {
+				if (!dateFormate) {
+					dateFormate = "yyyy-MM-dd HH:mm:ss";//鏃ユ湡鎺т欢涓嶆敮鎸佹绉掞紝鍑℃槸鏄剧ず鏃ユ湡鐨勶紝鍩烘湰涓嶉渶瑕佹绉掑唴瀹�
+				}
+				if (!me.isArray(fields)) {
+					fields = [fields];
+				}
+				layui.each(fields, function (_index, _item) {
+					if (_item in obj) {
+						var value = obj[_item];
+						if (me.isNotNull(value)) {
+							value = layui.util.toDateString(value, dateFormate);
+						}
+						obj[_item] = value;
+					}
+				});
+			}
+			return obj;
+		};
+		this.getValueFromObj = function (obj, fields, defaultValue) {
+			var me = this;
+			if (!me.isArray(fields)) {
+				fields = [fields];
+			}
+			for (var i = 0; i < fields.length; i++) {
+				var field = fields[i];
+				if (field in obj) {
+					return obj[field];
+				}
+			}
+			if (defaultValue) {
+				return defaultValue;
+			}
+			return "";
+		};
+		this.getBoolean = function (v) {
+			if (v == true || 'true' == v) {
+				return true;
+			} else {
+				return false;
+			}
+		};
+		this.copyConfig = function (tartObject, moduleKey) {
+			var that = this;
+			if (!moduleKey && tartObject) {
+				moduleKey = tartObject.moduleKey;
+			}
+			if (tartObject && configData && configData[moduleKey]) {
+				var configObject = configData[moduleKey];
+				for (var key in configObject) {
+					var item = configObject[key];
+					if (item && typeof (item) == 'object') {
+						//璇存槑杩樻槸瀵硅薄
+						if (!tartObject[key]) {
+							tartObject[key] = {};
+						}
+						for (var childKey in item) {
+							var childItem = item[childKey];
+							if (childItem && that.isNotNull(childItem)) {
+								tartObject[key][childKey] = childItem;
+							}
+						}
+					} else if (item && that.isNotNull(item)) {
+						tartObject[key] = item;
+					}
+				}
+			}
+		};
+		/*	鑾峰彇json涓璌ey瀵瑰簲鐨勫��	*/
+		this.getValueByKey = function (data, field) {
+			var that = this;
+			for (var key in data) {
+				if (key === field) {
+					return data[key];
+				} else {
+					return that.getValueByKey(data[key], field);
+				}
+			}
+		};
+		this.unableSubmit = function (id, btnname) {//绂佺敤鎸夐挳  闃叉澶氭鎻愪氦
+			$('[layui-filter="toolbar_' + id + '_' + btnname + '"]').addClass('layui-disabled');
+			$('[layui-filter="toolbar_' + id + '_' + btnname + '"]').attr('disabled', 'disabled');
+		};
+		this.allowSubmit = function (id, btnname) {//鎭㈠
+			$('[layui-filter="toolbar_' + id + '_' + btnname + '"]').removeClass('layui-disabled');
+			$('[layui-filter="toolbar_' + id + '_' + btnname + '"]').attr('disabled', false);
+		};
+		this.getTime = function () {     	//鑾峰彇鏃堕棿
+			var date = new Date();
+			var year = date.getFullYear();
+			var month = date.getMonth() + 1;
+			var day = date.getDate();
+
+			var hour = date.getHours();
+			var minute = date.getMinutes();
+			var second = date.getSeconds();
+
+			//杩欐牱鍐欐樉绀烘椂闂村湪1~9浼氭尋鍗犵┖闂达紱鎵�浠ヨ鍦�1~9鐨勬暟瀛楀墠琛ラ浂;
+			if (hour < 10) {
+				hour = '0' + hour;
+			}
+			if (minute < 10) {
+				minute = '0' + minute;
+			}
+			if (second < 10) {
+				second = '0' + second;
+			}
+			var x = date.getDay();//鑾峰彇鏄熸湡
+			var time = year + '-' + month + '-' + day + ' ' + hour + ':' + minute + ':' + second;
+			return time;
+		};
+		this.getDialogScreenSize = function (options) {
+			//鑾峰彇鍏ㄥ睆鐨勫昂瀵�
+			var that = this;
+			return [that.getDialogScreenWidth(options) + 'px', that.getDialogScreenHeight(options) + 'px'];
+		};
+		this.getDialogScreenHeight = function (options) {
+			//鑾峰彇楂樺害
+			var that = this;
+			var height = (that.isNotNull(options.height) || options.height * 1 > 1) ? options.height * 1 : 600;
+			var windowHeight = 0;
+			if (window.innerHeight) {
+				windowHeight = window.innerHeight;
+			} else {
+				windowHeight = document.documentElement.clientHeight;
+			}
+			if (options.fullScreen) {
+				return windowHeight - 50;
+			}
+			if ((height + 50) > windowHeight) {
+				return windowHeight - 50;
+			}
+			return height;
+		};
+		this.getDialogScreenWidth = function (options) {
+			//鑾峰彇瀹藉害
+			var that = this;
+			var width = (that.isNotNull(options.width) || options.width * 1 > 1) ? options.width * 1 : 950;
+			var windowWidth = 0;
+			if (window.innerWidth) {
+				windowWidth = window.innerWidth;
+			} else {
+				windowWidth = document.documentElement.clientWidth;
+			}
+			if (options.fullScreen) {
+				return windowWidth - 50;
+			}
+			if ((width + 50) > windowWidth) {
+				return windowWidth - 50;
+			}
+			return width;
+		};
+		this.fileDownload = function (url, successCallback,successMsg) {
+			//GET鏂瑰紡涓嬭浇鏂囦欢
+			var that = this;
+			//weidy@2020-07-27
+			//娣诲姞token
+			if (url.indexOf("?") > -1) {
+				url = url + "&";
+			} else {
+				url = url + "?";
+			}
+			url = url + TOKEN_KEY + "=" + that.getToken();
+			$.fileDownload(url, {
+				httpMethod: 'GET',
+				prepareCallback: function (url) {
+					//console.log(url)
+					that.showProgress("鏂囦欢涓嬭浇涓�傚鏋滀笅杞藉畬鎴愶紝杩涘害鏉′緷鐒舵病鏈夊叧闂紝璇风偣鍑婚〉闈㈢┖鐧藉");
+					setTimeout(function (){
+						that.closeProgress();
+					},60000*2)
+				},
+				abortCallback: function (url) {
+					// 寮傚父缁堟
+					that.closeProgress();
+					that.showErrorMsg("鏂囦欢涓嬭浇寮傚父锛侊紒");
+				},
+				successCallback: function (url) {
+					that.showMsg(successMsg||"鎵ц涓嬭浇鎴愬姛锛侊紒璇疯�愬績绛夊緟鏂囦欢涓嬭浇瀹屾垚");
+					that.closeProgress();
+					if (successCallback) {
+						successCallback();
+					}
+				},
+				failCallback: function (html, url) {
+					that.showErrorMsg("鏂囦欢涓嬭浇澶辫触锛侊紒");
+					that.closeProgress();
+				}
+			});
+		};
+		this.fileDownloadPost = function (url, data, successCallback) {
+			//POST鏂瑰紡涓嬭浇鏂囦欢
+			var that = this;
+			if (!data) {
+				data = {};
+			}
+			data[TOKEN_KEY] = that.getToken();
+			$.fileDownload(url, {
+				httpMethod: 'post',
+				data: data,
+				prepareCallback: function (url) {
+					that.showProgress("鏂囦欢涓嬭浇涓�傚鏋滀笅杞藉畬鎴愶紝杩涘害鏉′緷鐒舵病鏈夊叧闂紝璇风偣鍑婚〉闈㈢┖鐧藉");
+					setTimeout(function (){
+						that.closeProgress();
+					},60000*2)
+				},
+				abortCallback: function (url) {
+					// 寮傚父缁堟
+					that.closeProgress();
+					that.showErrorMsg("鏂囦欢涓嬭浇寮傚父锛侊紒");
+				},
+				successCallback: function (url) {
+					that.showMsg("鎵ц涓嬭浇鎴愬姛锛侊紒璇疯�愬績绛夊緟鏂囦欢涓嬭浇瀹屾垚");
+					that.closeProgress();
+					if (successCallback) {
+						successCallback();
+					}
+				},
+				failCallback: function (html, url) {
+					that.showErrorMsg("鏂囦欢涓嬭浇澶辫触锛侊紒");
+					that.closeProgress();
+				}
+			});
+		};
+		this.paramLow = function (paramsVOs) {
+			//鍙傛暟杞崲涓哄皬鍐�
+			if (!paramsVOs) {
+				paramsVOs = {};
+			}
+			var params = {};
+			for (var key in paramsVOs) {
+				params[key.toLowerCase()] = paramsVOs[key];
+			}
+			return params;
+		};
+		this.replaceFreeMarker = function (text, dataStore, sourceData) {
+			//鏇挎崲琛ㄨ揪寮�
+			if (!sourceData) {
+				sourceData = {};
+			}
+			if (!dataStore) {
+				dataStore = [];
+			}
+			var replaceData = dataStore.length > 0 ? dataStore[0] : {};
+			if (text && text.indexOf("${") > -1 && text.indexOf("}")) {
+				//js鍙兘浣跨敤${xxx}杩欑鐨勬柟寮�
+				var reg = "root.${";
+				while (text.indexOf(reg) > -1) {
+					var temp = text.substring(0, text.indexOf(reg));
+					var field = text.substring(text.indexOf(reg) + reg.length, text.indexOf("}"));
+					var end = text.substring(text.indexOf("}") + 1);
+					field = replaceData[field] || sourceData[field] || '';
+					text = temp + field + end;
+				}
+				reg = "sourceData.${";
+				while (text.indexOf(reg) > -1) {
+					var temp = text.substring(0, text.indexOf(reg));
+					var field = text.substring(text.indexOf(reg) + reg.length, text.indexOf("}"));
+					var end = text.substring(text.indexOf("}") + 1);
+					field = replaceData[field] || sourceData[field] || '';
+					text = temp + field + end;
+				}
+				reg = "${";
+				while (text.indexOf(reg) > -1) {
+					var temp = text.substring(0, text.indexOf(reg));
+					var field = text.substring(text.indexOf(reg) + reg.length, text.indexOf("}"));
+					var end = text.substring(text.indexOf("}") + 1);
+					field = replaceData[field] || sourceData[field] || '';
+					text = temp + field + end;
+				}
+			}
+			return text;
+		};
+
+		this.setDataTableRowColor = function (TabDivId, RowIndex, ColorString, FontColor) {//table 琛屽彉鑹�
+			var div = $(TabDivId).next();
+			if (div != null) {
+				var table_main = div.find('.layui-table-main ');
+				if (table_main != null && table_main.length > 0) {
+					var table = table_main[0].getElementsByTagName('table')//getElementsByClassName('layui-table');
+					if (table != null && table.length > 0) {
+						var trs = table[0].querySelectorAll("tr");
+						if (trs != null && trs.length > 0) {
+							trs[RowIndex].style.background = ColorString;
+							trs[RowIndex].style.color = FontColor;
+						}
+					}
+				}
+
+			}
+
+		};
+		this.getTrueId = function (btn) {//鍚屼竴涓〉闈㈡墦寮�澶氫釜 涔嬪墠鐨勯〉闈㈡寜閽笉璧蜂綔鐢�
+			//闇�瑕侀厤缃〉闈㈡椂浼犲弬鏁� 骞跺湪娓叉煋鏃舵妸鍙傛暟鍔犲埌椤甸潰id閲� 浣块〉闈腑浣跨敤id鐨勫厓绱犲敮涓� 涔熷氨鏄瘡涓〉闈㈢殑getContent涓� 闇�瑕佽this.id=this.sourceData.鍙傛暟鍚� + this.id 锛堣繖閲屾槸涓緥瀛愶級 淇濊瘉椤甸潰鎵撳紑澶氭鏄墍鏈夊厓绱爄d涓嶅悓
+			//杩欎釜鏂规硶閫氳繃鎸夐挳鐨勫睘鎬� 鑾峰彇褰撳墠椤甸潰鐨刬d
+			//姣忎釜鎸夐挳鏂规硶閲岀涓�涓弬鏁版槸鍚嶇О  绗簩涓弬鏁板氨鏄痓tn  渚嬪 this.refresh(event,btn){} btn灏辨槸瑕佷紶鐨勫弬鏁�
+			//闇�瑕侀噸澶嶄娇鐢ㄧ殑椤甸潰 鎸夐挳浜嬩欢涓殑 that.id 閮藉簲璇ユ浛鎹㈡垚 $webUtil.getTrueId(btn)
+			var target = $(btn).attr("layui-filter");
+			var name = target.substring(target.indexOf("_") + 1);
+			var trueId = name.substring(0, name.lastIndexOf("_"));
+			return trueId
+		};
+		this.dialog = function (options) {
+			if (!options) {
+				options = {};
+			}
+			//鎶婁紶閫掕繘鏉ョ殑鍙傛暟鍜岄粯璁ょ殑鍙傛暟鍚堝苟
+			var diaglogIndex;
+			options = $.extend({
+				type: 1,
+				//skin: 'layui-layer-lan',
+				//area: ['900px', '500px'],
+				closeBtn: 1,
+				shade: true,
+				shadeClose: true,
+				resize: true
+			}, options);
+			if (options.btn && options.btn[1] && options.btn[1] == '鍙栨秷' && !('btn2' in options)) {
+				options.btn2 = function (layero) {
+					layer.close(diaglogIndex);
+					if (options.targetObject) {
+						options.targetObject.refresh();
+					}
+				};
+			}
+			diaglogIndex = layer.open(options);
+			return diaglogIndex;
+		};
+
+		this.userIsDep = function (tab) {
+			var that = this;
+			$("#tab_" + tab).remove();
+			that.showErrorMsg('姝ょ敤鎴锋病鏈夎缃儴闂ㄣ�佷笉鍙睍鐜伴〉闈�!');
+			return false
+		};
+
+		this.starORstop = function (lcStatus) {
+			if (lcStatus == 'Enabled') {
+				return '宸茬粡涓哄惎鐢ㄧ姸鎬�!';
+			} else {
+				return '宸茬粡涓哄仠鐢ㄧ姸鎬�!';
+			}
+		};
+
+		this.createScript = function (src, callback) {
+			var head = document.getElementsByTagName('head')[0];
+			var script = document.createElement('script');
+			script.type = 'text/javascript';
+			script.onreadystatechange = function () {
+				if (this.readyState == 'loaded' || this.readyState == 'complete')
+					if (callback)
+						callback();
+			}
+			script.onload = function () {
+				if (callback)
+					callback();
+			}
+			script.src = src;
+			head.appendChild(script);
+		}
+
+		//寮圭獥鍐呭鍔犺浇瀹屽悗閲嶆柊瀹氫綅寮圭獥灞呬腑
+		this.relocationOpen=function (classP){
+			!(/^\d+%$/.test(classP.config.area[0]) || /^\d+%$/.test(classP.config.area[1])) && classP.auto(classP.index);
+			classP.offset();
+			classP.config.type == 4 && classP.tips();
+		}
+	};
+})(jQuery);
diff --git a/Source/platformProject/platform2022UI/jslib/websocket/WebSocketMain.swf b/Source/platformProject/platform2022UI/jslib/websocket/WebSocketMain.swf
new file mode 100644
index 0000000..5ff5b04
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/websocket/WebSocketMain.swf
Binary files differ
diff --git a/Source/platformProject/platform2022UI/jslib/websocket/swfobject.js b/Source/platformProject/platform2022UI/jslib/websocket/swfobject.js
new file mode 100644
index 0000000..8eafe9d
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/websocket/swfobject.js
@@ -0,0 +1,4 @@
+/*	SWFObject v2.2 <http://code.google.com/p/swfobject/> 
+	is released under the MIT License <http://www.opensource.org/licenses/mit-license.php> 
+*/
+var swfobject=function(){var D="undefined",r="object",S="Shockwave Flash",W="ShockwaveFlash.ShockwaveFlash",q="application/x-shockwave-flash",R="SWFObjectExprInst",x="onreadystatechange",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,X=!+"\v1",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ag[0]=parseInt(ab.replace(/^(.*)\..*$/,"$1"),10);ag[1]=parseInt(ab.replace(/^.*\.(.*)\s.*$/,"$1"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}}else{if(typeof O.ActiveXObject!=D){try{var ad=new ActiveXObject(W);if(ad){ab=ad.GetVariable("$version");if(ab){X=true;ab=ab.split(" ")[1].split(",");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState=="complete")||(typeof j.readyState==D&&(j.getElementsByTagName("body")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener("DOMContentLoaded",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState=="complete"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll("left")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName("body")[0].appendChild(C("span"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y<X;Y++){U[Y]()}}function K(X){if(J){X()}else{U[U.length]=X}}function s(Y){if(typeof O.addEventListener!=D){O.addEventListener("load",Y,false)}else{if(typeof j.addEventListener!=D){j.addEventListener("load",Y,false)}else{if(typeof O.attachEvent!=D){i(O,"onload",Y)}else{if(typeof O.onload=="function"){var X=O.onload;O.onload=function(){X();Y()}}else{O.onload=Y}}}}}function h(){if(T){V()}else{H()}}function V(){var X=j.getElementsByTagName("body")[0];var aa=C(r);aa.setAttribute("type",q);var Z=X.appendChild(aa);if(Z){var Y=0;(function(){if(typeof Z.GetVariable!=D){var ab=Z.GetVariable("$version");if(ab){ab=ab.split(" ")[1].split(",");M.pv=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}else{if(Y<10){Y++;setTimeout(arguments.callee,10);return}}X.removeChild(aa);Z=null;H()})()}else{H()}}function H(){var ag=o.length;if(ag>0){for(var af=0;af<ag;af++){var Y=o[af].id;var ab=o[af].callbackFn;var aa={success:false,id:Y};if(M.pv[0]>0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute("width")||"0";ai.height=ae.getAttribute("height")||"0";if(ae.getAttribute("class")){ai.styleclass=ae.getAttribute("class")}if(ae.getAttribute("align")){ai.align=ae.getAttribute("align")}var ah={};var X=ae.getElementsByTagName("param");var ac=X.length;for(var ad=0;ad<ac;ad++){if(X[ad].getAttribute("name").toLowerCase()!="movie"){ah[X[ad].getAttribute("name")]=X[ad].getAttribute("value")}}P(ai,ah,Y,ab)}else{p(ae);if(ab){ab(aa)}}}}}else{w(Y,true);if(ab){var Z=z(Y);if(Z&&typeof Z.SetVariable!=D){aa.success=true;aa.ref=Z}ab(aa)}}}}}function z(aa){var X=null;var Y=c(aa);if(Y&&Y.nodeName=="OBJECT"){if(typeof Y.SetVariable!=D){X=Y}else{var Z=Y.getElementsByTagName(r)[0];if(Z){X=Z}}}return X}function A(){return !a&&F("6.0.65")&&(M.win||M.mac)&&!(M.wk&&M.wk<312)}function P(aa,ab,X,Z){a=true;E=Z||null;B={success:false,id:X};var ae=c(X);if(ae){if(ae.nodeName=="OBJECT"){l=g(ae);Q=null}else{l=ae;Q=X}aa.id=R;if(typeof aa.width==D||(!/%$/.test(aa.width)&&parseInt(aa.width,10)<310)){aa.width="310"}if(typeof aa.height==D||(!/%$/.test(aa.height)&&parseInt(aa.height,10)<137)){aa.height="137"}j.title=j.title.slice(0,47)+" - Flash Player Installation";var ad=M.ie&&M.win?"ActiveX":"PlugIn",ac="MMredirectURL="+O.location.toString().replace(/&/g,"%26")+"&MMplayerType="+ad+"&MMdoctitle="+j.title;if(typeof ab.flashvars!=D){ab.flashvars+="&"+ac}else{ab.flashvars=ac}if(M.ie&&M.win&&ae.readyState!=4){var Y=C("div");X+="SWFObjectNew";Y.setAttribute("id",X);ae.parentNode.insertBefore(Y,ae);ae.style.display="none";(function(){if(ae.readyState==4){ae.parentNode.removeChild(ae)}else{setTimeout(arguments.callee,10)}})()}u(aa,ab,X)}}function p(Y){if(M.ie&&M.win&&Y.readyState!=4){var X=C("div");Y.parentNode.insertBefore(X,Y);X.parentNode.replaceChild(g(Y),X);Y.style.display="none";(function(){if(Y.readyState==4){Y.parentNode.removeChild(Y)}else{setTimeout(arguments.callee,10)}})()}else{Y.parentNode.replaceChild(g(Y),Y)}}function g(ab){var aa=C("div");if(M.win&&M.ie){aa.innerHTML=ab.innerHTML}else{var Y=ab.getElementsByTagName(r)[0];if(Y){var ad=Y.childNodes;if(ad){var X=ad.length;for(var Z=0;Z<X;Z++){if(!(ad[Z].nodeType==1&&ad[Z].nodeName=="PARAM")&&!(ad[Z].nodeType==8)){aa.appendChild(ad[Z].cloneNode(true))}}}}}return aa}function u(ai,ag,Y){var X,aa=c(Y);if(M.wk&&M.wk<312){return X}if(aa){if(typeof ai.id==D){ai.id=Y}if(M.ie&&M.win){var ah="";for(var ae in ai){if(ai[ae]!=Object.prototype[ae]){if(ae.toLowerCase()=="data"){ag.movie=ai[ae]}else{if(ae.toLowerCase()=="styleclass"){ah+=' class="'+ai[ae]+'"'}else{if(ae.toLowerCase()!="classid"){ah+=" "+ae+'="'+ai[ae]+'"'}}}}}var af="";for(var ad in ag){if(ag[ad]!=Object.prototype[ad]){af+='<param name="'+ad+'" value="'+ag[ad]+'" />'}}aa.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'+ah+">"+af+"</object>";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute("type",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()=="styleclass"){Z.setAttribute("class",ai[ac])}else{if(ac.toLowerCase()!="classid"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!="movie"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C("param");aa.setAttribute("name",X);aa.setAttribute("value",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName=="OBJECT"){if(M.ie&&M.win){X.style.display="none";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]=="function"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(".");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName("head")[0];if(!aa){return}var X=(ad&&typeof ad=="string")?ad:"screen";if(ab){n=null;G=null}if(!n||G!=X){var Z=C("style");Z.setAttribute("type","text/css");Z.setAttribute("media",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+" {"+Y+"}"))}}}function w(Z,X){if(!m){return}var Y=X?"visible":"hidden";if(J&&c(Z)){c(Z).style.visibility=Y}else{v("#"+Z,"visibility:"+Y)}}function L(Y){var Z=/[\\\"<>\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent("onunload",function(){var ac=I.length;for(var ab=0;ab<ac;ab++){I[ab][0].detachEvent(I[ab][1],I[ab][2])}var Z=N.length;for(var aa=0;aa<Z;aa++){y(N[aa])}for(var Y in M){M[Y]=null}M=null;for(var X in swfobject){swfobject[X]=null}swfobject=null})}}();return{registerObject:function(ab,X,aa,Z){if(M.w3&&ab&&X){var Y={};Y.id=ab;Y.swfVersion=X;Y.expressInstall=aa;Y.callbackFn=Z;o[o.length]=Y;w(ab,false)}else{if(Z){Z({success:false,id:ab})}}},getObjectById:function(X){if(M.w3){return z(X)}},embedSWF:function(ab,ah,ae,ag,Y,aa,Z,ad,af,ac){var X={success:false,id:ah};if(M.w3&&!(M.wk&&M.wk<312)&&ab&&ah&&ae&&ag&&Y){w(ah,false);K(function(){ae+="";ag+="";var aj={};if(af&&typeof af===r){for(var al in af){aj[al]=af[al]}}aj.data=ab;aj.width=ae;aj.height=ag;var am={};if(ad&&typeof ad===r){for(var ak in ad){am[ak]=ad[ak]}}if(Z&&typeof Z===r){for(var ai in Z){if(typeof am.flashvars!=D){am.flashvars+="&"+ai+"="+Z[ai]}else{am.flashvars=ai+"="+Z[ai]}}}if(F(Y)){var an=u(aj,am,ah);if(aj.id==ah){w(ah,true)}X.success=true;X.ref=an}else{if(aa&&A()){aj.data=aa;P(aj,am,ah,ac);return}else{w(ah,true)}}if(ac){ac(X)}})}else{if(ac){ac(X)}}},switchOffAutoHideShow:function(){m=false},ua:M,getFlashPlayerVersion:function(){return{major:M.pv[0],minor:M.pv[1],release:M.pv[2]}},hasFlashPlayerVersion:F,createSWF:function(Z,Y,X){if(M.w3){return u(Z,Y,X)}else{return undefined}},showExpressInstall:function(Z,aa,X,Y){if(M.w3&&A()){P(Z,aa,X,Y)}},removeSWF:function(X){if(M.w3){y(X)}},createCSS:function(aa,Z,Y,X){if(M.w3){v(aa,Z,Y,X)}},addDomLoadEvent:K,addLoadEvent:s,getQueryParamValue:function(aa){var Z=j.location.search||j.location.hash;if(Z){if(/\?/.test(Z)){Z=Z.split("?")[1]}if(aa==null){return L(Z)}var Y=Z.split("&");for(var X=0;X<Y.length;X++){if(Y[X].substring(0,Y[X].indexOf("="))==aa){return L(Y[X].substring((Y[X].indexOf("=")+1)))}}}return""},expressInstallCallback:function(){if(a){var X=c(R);if(X&&l){X.parentNode.replaceChild(l,X);if(Q){w(Q,true);if(M.ie&&M.win){l.style.display="block"}}if(E){E(B)}}a=false}}}}();
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/jslib/websocket/web_socket.js b/Source/platformProject/platform2022UI/jslib/websocket/web_socket.js
new file mode 100644
index 0000000..6817aa9
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/websocket/web_socket.js
@@ -0,0 +1,398 @@
+// Copyright: Hiroshi Ichikawa <http://gimite.net/en/>
+// License: New BSD License
+// Reference: http://dev.w3.org/html5/websockets/
+// Reference: http://tools.ietf.org/html/rfc6455
+
+(function() {
+  
+  if (window.WEB_SOCKET_FORCE_FLASH) {
+    // Keeps going.
+  } else if (window.WebSocket) {
+    return;
+  } else if (window.MozWebSocket) {
+    // Firefox.
+    window.WebSocket = MozWebSocket;
+    return;
+  }
+  
+  var logger;
+  if (window.WEB_SOCKET_LOGGER) {
+    logger = WEB_SOCKET_LOGGER;
+  } else if (window.console && window.console.log && window.console.error) {
+    // In some environment, console is defined but console.log or console.error is missing.
+    logger = window.console;
+  } else {
+    logger = {log: function(){ }, error: function(){ }};
+  }
+  
+  // swfobject.hasFlashPlayerVersion("10.0.0") doesn't work with Gnash.
+  if (swfobject.getFlashPlayerVersion().major < 10) {
+    logger.error("Flash Player >= 10.0.0 is required.");
+    return;
+  }
+  if (location.protocol == "file:") {
+    logger.error(
+      "WARNING: web-socket-js doesn't work in file:///... URL " +
+      "unless you set Flash Security Settings properly. " +
+      "Open the page via Web server i.e. http://...");
+  }
+
+  /**
+   * Our own implementation of WebSocket class using Flash.
+   * @param {string} url
+   * @param {array or string} protocols
+   * @param {string} proxyHost
+   * @param {int} proxyPort
+   * @param {string} headers
+   */
+  window.WebSocket = function(url, protocols, proxyHost, proxyPort, headers) {
+    var self = this;
+    self.__id = WebSocket.__nextId++;
+    WebSocket.__instances[self.__id] = self;
+    self.readyState = WebSocket.CONNECTING;
+    self.bufferedAmount = 0;
+    self.__events = {};
+    if (!protocols) {
+      protocols = [];
+    } else if (typeof protocols == "string") {
+      protocols = [protocols];
+    }
+    // Uses setTimeout() to make sure __createFlash() runs after the caller sets ws.onopen etc.
+    // Otherwise, when onopen fires immediately, onopen is called before it is set.
+    self.__createTask = setTimeout(function() {
+      WebSocket.__addTask(function() {
+        self.__createTask = null;
+        WebSocket.__flash.create(
+            self.__id, url, protocols, proxyHost || null, proxyPort || 0, headers || null);
+      });
+    }, 0);
+  };
+
+  /**
+   * Send data to the web socket.
+   * @param {string} data  The data to send to the socket.
+   * @return {boolean}  True for success, false for failure.
+   */
+  WebSocket.prototype.send = function(data) {
+    if (this.readyState == WebSocket.CONNECTING) {
+      throw "INVALID_STATE_ERR: Web Socket connection has not been established";
+    }
+    // We use encodeURIComponent() here, because FABridge doesn't work if
+    // the argument includes some characters. We don't use escape() here
+    // because of this:
+    // https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Functions#escape_and_unescape_Functions
+    // But it looks decodeURIComponent(encodeURIComponent(s)) doesn't
+    // preserve all Unicode characters either e.g. "\uffff" in Firefox.
+    // Note by wtritch: Hopefully this will not be necessary using ExternalInterface.  Will require
+    // additional testing.
+    var result = WebSocket.__flash.send(this.__id, encodeURIComponent(data));
+    if (result < 0) { // success
+      return true;
+    } else {
+      this.bufferedAmount += result;
+      return false;
+    }
+  };
+
+  /**
+   * Close this web socket gracefully.
+   */
+  WebSocket.prototype.close = function() {
+    if (this.__createTask) {
+      clearTimeout(this.__createTask);
+      this.__createTask = null;
+      this.readyState = WebSocket.CLOSED;
+      return;
+    }
+    if (this.readyState == WebSocket.CLOSED || this.readyState == WebSocket.CLOSING) {
+      return;
+    }
+    this.readyState = WebSocket.CLOSING;
+    WebSocket.__flash.close(this.__id);
+  };
+
+  /**
+   * Implementation of {@link <a href="http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-registration">DOM 2 EventTarget Interface</a>}
+   *
+   * @param {string} type
+   * @param {function} listener
+   * @param {boolean} useCapture
+   * @return void
+   */
+  WebSocket.prototype.addEventListener = function(type, listener, useCapture) {
+    if (!(type in this.__events)) {
+      this.__events[type] = [];
+    }
+    this.__events[type].push(listener);
+  };
+
+  /**
+   * Implementation of {@link <a href="http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-registration">DOM 2 EventTarget Interface</a>}
+   *
+   * @param {string} type
+   * @param {function} listener
+   * @param {boolean} useCapture
+   * @return void
+   */
+  WebSocket.prototype.removeEventListener = function(type, listener, useCapture) {
+    if (!(type in this.__events)) return;
+    var events = this.__events[type];
+    for (var i = events.length - 1; i >= 0; --i) {
+      if (events[i] === listener) {
+        events.splice(i, 1);
+        break;
+      }
+    }
+  };
+
+  /**
+   * Implementation of {@link <a href="http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-registration">DOM 2 EventTarget Interface</a>}
+   *
+   * @param {Event} event
+   * @return void
+   */
+  WebSocket.prototype.dispatchEvent = function(event) {
+    var events = this.__events[event.type] || [];
+    for (var i = 0; i < events.length; ++i) {
+      events[i](event);
+    }
+    var handler = this["on" + event.type];
+    if (handler) handler.apply(this, [event]);
+  };
+
+  /**
+   * Handles an event from Flash.
+   * @param {Object} flashEvent
+   */
+  WebSocket.prototype.__handleEvent = function(flashEvent) {
+    
+    if ("readyState" in flashEvent) {
+      this.readyState = flashEvent.readyState;
+    }
+    if ("protocol" in flashEvent) {
+      this.protocol = flashEvent.protocol;
+    }
+    
+    var jsEvent;
+    if (flashEvent.type == "open" || flashEvent.type == "error") {
+      jsEvent = this.__createSimpleEvent(flashEvent.type);
+    } else if (flashEvent.type == "close") {
+      jsEvent = this.__createSimpleEvent("close");
+      jsEvent.wasClean = flashEvent.wasClean ? true : false;
+      jsEvent.code = flashEvent.code;
+      jsEvent.reason = flashEvent.reason;
+    } else if (flashEvent.type == "message") {
+      var data = decodeURIComponent(flashEvent.message);
+      jsEvent = this.__createMessageEvent("message", data);
+    } else {
+      throw "unknown event type: " + flashEvent.type;
+    }
+    
+    this.dispatchEvent(jsEvent);
+    
+  };
+  
+  WebSocket.prototype.__createSimpleEvent = function(type) {
+    if (document.createEvent && window.Event) {
+      var event = document.createEvent("Event");
+      event.initEvent(type, false, false);
+      return event;
+    } else {
+      return {type: type, bubbles: false, cancelable: false};
+    }
+  };
+  
+  WebSocket.prototype.__createMessageEvent = function(type, data) {
+    if (window.MessageEvent && typeof(MessageEvent) == "function" && !window.opera) {
+      return new MessageEvent("message", {
+        "view": window,
+        "bubbles": false,
+        "cancelable": false,
+        "data": data
+      });
+    } else if (document.createEvent && window.MessageEvent && !window.opera) {
+      var event = document.createEvent("MessageEvent");
+    	event.initMessageEvent("message", false, false, data, null, null, window, null);
+      return event;
+    } else {
+      // Old IE and Opera, the latter one truncates the data parameter after any 0x00 bytes.
+      return {type: type, data: data, bubbles: false, cancelable: false};
+    }
+  };
+  
+  /**
+   * Define the WebSocket readyState enumeration.
+   */
+  WebSocket.CONNECTING = 0;
+  WebSocket.OPEN = 1;
+  WebSocket.CLOSING = 2;
+  WebSocket.CLOSED = 3;
+
+  // Field to check implementation of WebSocket.
+  WebSocket.__isFlashImplementation = true;
+  WebSocket.__initialized = false;
+  WebSocket.__flash = null;
+  WebSocket.__instances = {};
+  WebSocket.__tasks = [];
+  WebSocket.__nextId = 0;
+  
+  /**
+   * Load a new flash security policy file.
+   * @param {string} url
+   */
+  WebSocket.loadFlashPolicyFile = function(url){
+    WebSocket.__addTask(function() {
+      WebSocket.__flash.loadManualPolicyFile(url);
+    });
+  };
+
+  /**
+   * Loads WebSocketMain.swf and creates WebSocketMain object in Flash.
+   */
+  WebSocket.__initialize = function() {
+    
+    if (WebSocket.__initialized) return;
+    WebSocket.__initialized = true;
+    
+    if (WebSocket.__swfLocation) {
+      // For backword compatibility.
+      window.WEB_SOCKET_SWF_LOCATION = WebSocket.__swfLocation;
+    }
+    if (!window.WEB_SOCKET_SWF_LOCATION) {
+      logger.error("[WebSocket] set WEB_SOCKET_SWF_LOCATION to location of WebSocketMain.swf");
+      return;
+    }
+    if (!window.WEB_SOCKET_SUPPRESS_CROSS_DOMAIN_SWF_ERROR &&
+        !WEB_SOCKET_SWF_LOCATION.match(/(^|\/)WebSocketMainInsecure\.swf(\?.*)?$/) &&
+        WEB_SOCKET_SWF_LOCATION.match(/^\w+:\/\/([^\/]+)/)) {
+      var swfHost = RegExp.$1;
+      if (location.host != swfHost) {
+        logger.error(
+            "[WebSocket] You must host HTML and WebSocketMain.swf in the same host " +
+            "('" + location.host + "' != '" + swfHost + "'). " +
+            "See also 'How to host HTML file and SWF file in different domains' section " +
+            "in README.md. If you use WebSocketMainInsecure.swf, you can suppress this message " +
+            "by WEB_SOCKET_SUPPRESS_CROSS_DOMAIN_SWF_ERROR = true;");
+      }
+    }
+    var container = document.createElement("div");
+    container.id = "webSocketContainer";
+    // Hides Flash box. We cannot use display: none or visibility: hidden because it prevents
+    // Flash from loading at least in IE. So we move it out of the screen at (-100, -100).
+    // But this even doesn't work with Flash Lite (e.g. in Droid Incredible). So with Flash
+    // Lite, we put it at (0, 0). This shows 1x1 box visible at left-top corner but this is
+    // the best we can do as far as we know now.
+    container.style.position = "absolute";
+    if (WebSocket.__isFlashLite()) {
+      container.style.left = "0px";
+      container.style.top = "0px";
+    } else {
+      container.style.left = "-100px";
+      container.style.top = "-100px";
+    }
+    var holder = document.createElement("div");
+    holder.id = "webSocketFlash";
+    container.appendChild(holder);
+    document.body.appendChild(container);
+    // See this article for hasPriority:
+    // http://help.adobe.com/en_US/as3/mobile/WS4bebcd66a74275c36cfb8137124318eebc6-7ffd.html
+    swfobject.embedSWF(
+      WEB_SOCKET_SWF_LOCATION,
+      "webSocketFlash",
+      "1" /* width */,
+      "1" /* height */,
+      "10.0.0" /* SWF version */,
+      null,
+      null,
+      {hasPriority: true, swliveconnect : true, allowScriptAccess: "always"},
+      null,
+      function(e) {
+        if (!e.success) {
+          logger.error("[WebSocket] swfobject.embedSWF failed");
+        }
+      }
+    );
+    
+  };
+  
+  /**
+   * Called by Flash to notify JS that it's fully loaded and ready
+   * for communication.
+   */
+  WebSocket.__onFlashInitialized = function() {
+    // We need to set a timeout here to avoid round-trip calls
+    // to flash during the initialization process.
+    setTimeout(function() {
+      WebSocket.__flash = document.getElementById("webSocketFlash");
+      WebSocket.__flash.setCallerUrl(location.href);
+      WebSocket.__flash.setDebug(!!window.WEB_SOCKET_DEBUG);
+      for (var i = 0; i < WebSocket.__tasks.length; ++i) {
+        WebSocket.__tasks[i]();
+      }
+      WebSocket.__tasks = [];
+    }, 0);
+  };
+  
+  /**
+   * Called by Flash to notify WebSockets events are fired.
+   */
+  WebSocket.__onFlashEvent = function() {
+    setTimeout(function() {
+      try {
+        // Gets events using receiveEvents() instead of getting it from event object
+        // of Flash event. This is to make sure to keep message order.
+        // It seems sometimes Flash events don't arrive in the same order as they are sent.
+        var events = WebSocket.__flash.receiveEvents();
+        for (var i = 0; i < events.length; ++i) {
+          WebSocket.__instances[events[i].webSocketId].__handleEvent(events[i]);
+        }
+      } catch (e) {
+        logger.error(e);
+      }
+    }, 0);
+    return true;
+  };
+  
+  // Called by Flash.
+  WebSocket.__log = function(message) {
+    logger.log(decodeURIComponent(message));
+  };
+  
+  // Called by Flash.
+  WebSocket.__error = function(message) {
+    logger.error(decodeURIComponent(message));
+  };
+  
+  WebSocket.__addTask = function(task) {
+    if (WebSocket.__flash) {
+      task();
+    } else {
+      WebSocket.__tasks.push(task);
+    }
+  };
+  
+  /**
+   * Test if the browser is running flash lite.
+   * @return {boolean} True if flash lite is running, false otherwise.
+   */
+  WebSocket.__isFlashLite = function() {
+    if (!window.navigator || !window.navigator.mimeTypes) {
+      return false;
+    }
+    var mimeType = window.navigator.mimeTypes["application/x-shockwave-flash"];
+    if (!mimeType || !mimeType.enabledPlugin || !mimeType.enabledPlugin.filename) {
+      return false;
+    }
+    return mimeType.enabledPlugin.filename.match(/flashlite/i) ? true : false;
+  };
+  
+  if (!window.WEB_SOCKET_DISABLE_AUTO_INITIALIZATION) {
+    // NOTE:
+    //   This fires immediately if web_socket.js is dynamically loaded after
+    //   the document is loaded.
+    swfobject.addDomLoadEvent(function() {
+      WebSocket.__initialize();
+    });
+  }
+  
+})();
diff --git a/Source/platformProject/platform2022UI/jslib/yaml/css/codemirror.css b/Source/platformProject/platform2022UI/jslib/yaml/css/codemirror.css
new file mode 100644
index 0000000..a64f97c
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/yaml/css/codemirror.css
@@ -0,0 +1,350 @@
+/* BASICS */
+
+.CodeMirror {
+  /* Set height, width, borders, and global font properties here */
+  font-family: monospace;
+  height: 300px;
+  color: black;
+  direction: ltr;
+}
+
+/* PADDING */
+
+.CodeMirror-lines {
+  padding: 4px 0; /* Vertical padding around content */
+}
+.CodeMirror pre.CodeMirror-line,
+.CodeMirror pre.CodeMirror-line-like {
+  padding: 0 4px; /* Horizontal padding of content */
+}
+
+.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
+  background-color: white; /* The little square between H and V scrollbars */
+}
+
+/* GUTTER */
+
+.CodeMirror-gutters {
+  border-right: 1px solid #ddd;
+  background-color: #f7f7f7;
+  white-space: nowrap;
+}
+.CodeMirror-linenumbers {}
+.CodeMirror-linenumber {
+  padding: 0 3px 0 5px;
+  min-width: 20px;
+  text-align: right;
+  color: #999;
+  white-space: nowrap;
+}
+
+.CodeMirror-guttermarker { color: black; }
+.CodeMirror-guttermarker-subtle { color: #999; }
+
+/* CURSOR */
+
+.CodeMirror-cursor {
+  border-left: 1px solid black;
+  border-right: none;
+  width: 0;
+}
+/* Shown when moving in bi-directional text */
+.CodeMirror div.CodeMirror-secondarycursor {
+  border-left: 1px solid silver;
+}
+.cm-fat-cursor .CodeMirror-cursor {
+  width: auto;
+  border: 0 !important;
+  background: #7e7;
+}
+.cm-fat-cursor div.CodeMirror-cursors {
+  z-index: 1;
+}
+.cm-fat-cursor-mark {
+  background-color: rgba(20, 255, 20, 0.5);
+  -webkit-animation: blink 1.06s steps(1) infinite;
+  -moz-animation: blink 1.06s steps(1) infinite;
+  animation: blink 1.06s steps(1) infinite;
+}
+.cm-animate-fat-cursor {
+  width: auto;
+  border: 0;
+  -webkit-animation: blink 1.06s steps(1) infinite;
+  -moz-animation: blink 1.06s steps(1) infinite;
+  animation: blink 1.06s steps(1) infinite;
+  background-color: #7e7;
+}
+@-moz-keyframes blink {
+  0% {}
+  50% { background-color: transparent; }
+  100% {}
+}
+@-webkit-keyframes blink {
+  0% {}
+  50% { background-color: transparent; }
+  100% {}
+}
+@keyframes blink {
+  0% {}
+  50% { background-color: transparent; }
+  100% {}
+}
+
+/* Can style cursor different in overwrite (non-insert) mode */
+.CodeMirror-overwrite .CodeMirror-cursor {}
+
+.cm-tab { display: inline-block; text-decoration: inherit; }
+
+.CodeMirror-rulers {
+  position: absolute;
+  left: 0; right: 0; top: -50px; bottom: 0;
+  overflow: hidden;
+}
+.CodeMirror-ruler {
+  border-left: 1px solid #ccc;
+  top: 0; bottom: 0;
+  position: absolute;
+}
+
+/* DEFAULT THEME */
+
+.cm-s-default .cm-header {color: blue;}
+.cm-s-default .cm-quote {color: #090;}
+.cm-negative {color: #d44;}
+.cm-positive {color: #292;}
+.cm-header, .cm-strong {font-weight: bold;}
+.cm-em {font-style: italic;}
+.cm-link {text-decoration: underline;}
+.cm-strikethrough {text-decoration: line-through;}
+
+.cm-s-default .cm-keyword {color: #708;}
+.cm-s-default .cm-atom {color: #219;}
+.cm-s-default .cm-number {color: #164;}
+.cm-s-default .cm-def {color: #00f;}
+.cm-s-default .cm-variable,
+.cm-s-default .cm-punctuation,
+.cm-s-default .cm-property,
+.cm-s-default .cm-operator {}
+.cm-s-default .cm-variable-2 {color: #05a;}
+.cm-s-default .cm-variable-3, .cm-s-default .cm-type {color: #085;}
+.cm-s-default .cm-comment {color: #a50;}
+.cm-s-default .cm-string {color: #a11;}
+.cm-s-default .cm-string-2 {color: #f50;}
+.cm-s-default .cm-meta {color: #555;}
+.cm-s-default .cm-qualifier {color: #555;}
+.cm-s-default .cm-builtin {color: #30a;}
+.cm-s-default .cm-bracket {color: #997;}
+.cm-s-default .cm-tag {color: #170;}
+.cm-s-default .cm-attribute {color: #00c;}
+.cm-s-default .cm-hr {color: #999;}
+.cm-s-default .cm-link {color: #00c;}
+
+.cm-s-default .cm-error {color: #f00;}
+.cm-invalidchar {color: #f00;}
+
+.CodeMirror-composing { border-bottom: 2px solid; }
+
+/* Default styles for common addons */
+
+div.CodeMirror span.CodeMirror-matchingbracket {color: #0b0;}
+div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #a22;}
+.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); }
+.CodeMirror-activeline-background {background: #e8f2ff;}
+
+/* STOP */
+
+/* The rest of this file contains styles related to the mechanics of
+   the editor. You probably shouldn't touch them. */
+
+.CodeMirror {
+  position: relative;
+  overflow: hidden;
+  background: white;
+}
+
+.CodeMirror-scroll {
+  overflow: scroll !important; /* Things will break if this is overridden */
+  /* 50px is the magic margin used to hide the element's real scrollbars */
+  /* See overflow: hidden in .CodeMirror */
+  margin-bottom: -50px; margin-right: -50px;
+  padding-bottom: 50px;
+  height: 100%;
+  outline: none; /* Prevent dragging from highlighting the element */
+  position: relative;
+}
+.CodeMirror-sizer {
+  position: relative;
+  border-right: 50px solid transparent;
+}
+
+/* The fake, visible scrollbars. Used to force redraw during scrolling
+   before actual scrolling happens, thus preventing shaking and
+   flickering artifacts. */
+.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
+  position: absolute;
+  z-index: 6;
+  display: none;
+  outline: none;
+}
+.CodeMirror-vscrollbar {
+  right: 0; top: 0;
+  overflow-x: hidden;
+  overflow-y: scroll;
+}
+.CodeMirror-hscrollbar {
+  bottom: 0; left: 0;
+  overflow-y: hidden;
+  overflow-x: scroll;
+}
+.CodeMirror-scrollbar-filler {
+  right: 0; bottom: 0;
+}
+.CodeMirror-gutter-filler {
+  left: 0; bottom: 0;
+}
+
+.CodeMirror-gutters {
+  position: absolute; left: 0; top: 0;
+  min-height: 100%;
+  z-index: 3;
+}
+.CodeMirror-gutter {
+  white-space: normal;
+  height: 100%;
+  display: inline-block;
+  vertical-align: top;
+  margin-bottom: -50px;
+}
+.CodeMirror-gutter-wrapper {
+  position: absolute;
+  z-index: 4;
+  background: none !important;
+  border: none !important;
+}
+.CodeMirror-gutter-background {
+  position: absolute;
+  top: 0; bottom: 0;
+  z-index: 4;
+}
+.CodeMirror-gutter-elt {
+  position: absolute;
+  cursor: default;
+  z-index: 4;
+}
+.CodeMirror-gutter-wrapper ::selection { background-color: transparent }
+.CodeMirror-gutter-wrapper ::-moz-selection { background-color: transparent }
+
+.CodeMirror-lines {
+  cursor: text;
+  min-height: 1px; /* prevents collapsing before first draw */
+}
+.CodeMirror pre.CodeMirror-line,
+.CodeMirror pre.CodeMirror-line-like {
+  /* Reset some styles that the rest of the page might have set */
+  -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0;
+  border-width: 0;
+  background: transparent;
+  font-family: inherit;
+  font-size: inherit;
+  margin: 0;
+  white-space: pre;
+  word-wrap: normal;
+  line-height: inherit;
+  color: inherit;
+  z-index: 2;
+  position: relative;
+  overflow: visible;
+  -webkit-tap-highlight-color: transparent;
+  -webkit-font-variant-ligatures: contextual;
+  font-variant-ligatures: contextual;
+}
+.CodeMirror-wrap pre.CodeMirror-line,
+.CodeMirror-wrap pre.CodeMirror-line-like {
+  word-wrap: break-word;
+  white-space: pre-wrap;
+  word-break: normal;
+}
+
+.CodeMirror-linebackground {
+  position: absolute;
+  left: 0; right: 0; top: 0; bottom: 0;
+  z-index: 0;
+}
+
+.CodeMirror-linewidget {
+  position: relative;
+  z-index: 2;
+  padding: 0.1px; /* Force widget margins to stay inside of the container */
+}
+
+.CodeMirror-widget {}
+
+.CodeMirror-rtl pre { direction: rtl; }
+
+.CodeMirror-code {
+  outline: none;
+}
+
+/* Force content-box sizing for the elements where we expect it */
+.CodeMirror-scroll,
+.CodeMirror-sizer,
+.CodeMirror-gutter,
+.CodeMirror-gutters,
+.CodeMirror-linenumber {
+  -moz-box-sizing: content-box;
+  box-sizing: content-box;
+}
+
+.CodeMirror-measure {
+  position: absolute;
+  width: 100%;
+  height: 0;
+  overflow: hidden;
+  visibility: hidden;
+}
+
+.CodeMirror-cursor {
+  position: absolute;
+  pointer-events: none;
+}
+.CodeMirror-measure pre { position: static; }
+
+div.CodeMirror-cursors {
+  visibility: hidden;
+  position: relative;
+  z-index: 3;
+}
+div.CodeMirror-dragcursors {
+  visibility: visible;
+}
+
+.CodeMirror-focused div.CodeMirror-cursors {
+  visibility: visible;
+}
+
+.CodeMirror-selected { background: #d9d9d9; }
+.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; }
+.CodeMirror-crosshair { cursor: crosshair; }
+.CodeMirror-line::selection, .CodeMirror-line > span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; }
+.CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; }
+
+.cm-searching {
+  background-color: #ffa;
+  background-color: rgba(255, 255, 0, .4);
+}
+
+/* Used to force a border model for a node */
+.cm-force-border { padding-right: .1px; }
+
+@media print {
+  /* Hide the cursor when printing */
+  .CodeMirror div.CodeMirror-cursors {
+    visibility: hidden;
+  }
+}
+
+/* See issue #2901 */
+.cm-tab-wrap-hack:after { content: ''; }
+
+/* Help users use markselection to safely style text background */
+span.CodeMirror-selectedtext { background: none; }
diff --git a/Source/platformProject/platform2022UI/jslib/yaml/index.html b/Source/platformProject/platform2022UI/jslib/yaml/index.html
new file mode 100644
index 0000000..d1fcaa0
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/yaml/index.html
@@ -0,0 +1,67 @@
+<!doctype html>
+
+<title>CodeMirror</title>
+<meta charset="utf-8"/>
+
+<link rel=stylesheet href="css/codemirror.css">
+<script src="js/codemirror.js"></script>
+<script src="js/yaml.js"></script>
+<script src="js/js-yaml.min.js"></script>
+<style type="text/css">
+    .CodeMirror{
+        height:500px;
+    }
+</style>
+
+<body>
+  <div id="yamlSource" style="width: 700px;height:500px;float: left;margin-right: 10px;border: 1px solid #ddd"></div>
+  <div id="yamlResult" style="width: 600px;height:500px;float: left;border: 1px solid #ddd"></div>
+<script>
+  var yamlSourceCodeMirror = CodeMirror(document.getElementById('yamlSource'), {
+    value: '',
+    mode: 'yaml',
+    lineNumbers: true,     // 鏄剧ず琛屾暟
+    indentUnit: 1,         // 缂╄繘鍗曚綅涓�2
+    styleActiveLine: true, // 褰撳墠琛岃儗鏅珮浜�
+    matchBrackets: true,   // 鎷彿鍖归厤
+    lineWrapping: true,    // 鑷姩鎹㈣
+    tabSize: 2,
+  });
+
+  var yamlResultCodeMirror = CodeMirror(document.getElementById('yamlResult'), {
+      value: '',
+      mode: 'yaml',
+      lineNumbers: true,     // 鏄剧ず琛屾暟
+      indentUnit: 1,         // 缂╄繘鍗曚綅涓�2
+      styleActiveLine: true, // 褰撳墠琛岃儗鏅珮浜�
+      matchBrackets: true,   // 鎷彿鍖归厤
+      lineWrapping: true,    // 鑷姩鎹㈣
+      tabSize: 2,
+  });
+
+  // 鐩戝惉杈撳叆鍊煎彉鍖�
+  yamlSourceCodeMirror.on('change', (cm) => {
+    var parseYaml=parseYamlFn(cm.doc.getValue())
+    if(!!parseYaml.isYaml){
+        var json = JSON.stringify(parseYaml.isYaml, null, 2);
+        yamlResultCodeMirror.setValue(json);
+    }else {
+        console.log(parseYaml.errorMessage)
+        yamlResultCodeMirror.setValue(parseYaml.errorMessage);
+    }
+  })
+
+  const parseYamlFn = (str) => {
+    let isYaml = false;
+    let errorMessage = '';
+    try {
+      isYaml = jsyaml.load(str)
+    } catch(e) {
+      errorMessage = e && e.message;
+    }
+    return {
+      isYaml, errorMessage
+    };
+  }
+</script>
+</body>
diff --git a/Source/platformProject/platform2022UI/jslib/yaml/js/codemirror.js b/Source/platformProject/platform2022UI/jslib/yaml/js/codemirror.js
new file mode 100644
index 0000000..3765b15
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/yaml/js/codemirror.js
@@ -0,0 +1,9803 @@
+// CodeMirror, copyright (c) by Marijn Haverbeke and others
+// Distributed under an MIT license: https://codemirror.net/LICENSE
+
+// This is CodeMirror (https://codemirror.net), a code editor
+// implemented in JavaScript on top of the browser's DOM.
+//
+// You can find some technical background for some of the code below
+// at http://marijnhaverbeke.nl/blog/#cm-internals .
+
+(function (global, factory) {
+  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+  typeof define === 'function' && define.amd ? define(factory) :
+  (global = global || self, global.CodeMirror = factory());
+}(this, (function () { 'use strict';
+
+  // Kludges for bugs and behavior differences that can't be feature
+  // detected are enabled based on userAgent etc sniffing.
+  var userAgent = navigator.userAgent;
+  var platform = navigator.platform;
+
+  var gecko = /gecko\/\d/i.test(userAgent);
+  var ie_upto10 = /MSIE \d/.test(userAgent);
+  var ie_11up = /Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(userAgent);
+  var edge = /Edge\/(\d+)/.exec(userAgent);
+  var ie = ie_upto10 || ie_11up || edge;
+  var ie_version = ie && (ie_upto10 ? document.documentMode || 6 : +(edge || ie_11up)[1]);
+  var webkit = !edge && /WebKit\//.test(userAgent);
+  var qtwebkit = webkit && /Qt\/\d+\.\d+/.test(userAgent);
+  var chrome = !edge && /Chrome\//.test(userAgent);
+  var presto = /Opera\//.test(userAgent);
+  var safari = /Apple Computer/.test(navigator.vendor);
+  var mac_geMountainLion = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(userAgent);
+  var phantom = /PhantomJS/.test(userAgent);
+
+  var ios = safari && (/Mobile\/\w+/.test(userAgent) || navigator.maxTouchPoints > 2);
+  var android = /Android/.test(userAgent);
+  // This is woefully incomplete. Suggestions for alternative methods welcome.
+  var mobile = ios || android || /webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(userAgent);
+  var mac = ios || /Mac/.test(platform);
+  var chromeOS = /\bCrOS\b/.test(userAgent);
+  var windows = /win/i.test(platform);
+
+  var presto_version = presto && userAgent.match(/Version\/(\d*\.\d*)/);
+  if (presto_version) { presto_version = Number(presto_version[1]); }
+  if (presto_version && presto_version >= 15) { presto = false; webkit = true; }
+  // Some browsers use the wrong event properties to signal cmd/ctrl on OS X
+  var flipCtrlCmd = mac && (qtwebkit || presto && (presto_version == null || presto_version < 12.11));
+  var captureRightClick = gecko || (ie && ie_version >= 9);
+
+  function classTest(cls) { return new RegExp("(^|\\s)" + cls + "(?:$|\\s)\\s*") }
+
+  var rmClass = function(node, cls) {
+    var current = node.className;
+    var match = classTest(cls).exec(current);
+    if (match) {
+      var after = current.slice(match.index + match[0].length);
+      node.className = current.slice(0, match.index) + (after ? match[1] + after : "");
+    }
+  };
+
+  function removeChildren(e) {
+    for (var count = e.childNodes.length; count > 0; --count)
+      { e.removeChild(e.firstChild); }
+    return e
+  }
+
+  function removeChildrenAndAdd(parent, e) {
+    return removeChildren(parent).appendChild(e)
+  }
+
+  function elt(tag, content, className, style) {
+    var e = document.createElement(tag);
+    if (className) { e.className = className; }
+    if (style) { e.style.cssText = style; }
+    if (typeof content == "string") { e.appendChild(document.createTextNode(content)); }
+    else if (content) { for (var i = 0; i < content.length; ++i) { e.appendChild(content[i]); } }
+    return e
+  }
+  // wrapper for elt, which removes the elt from the accessibility tree
+  function eltP(tag, content, className, style) {
+    var e = elt(tag, content, className, style);
+    e.setAttribute("role", "presentation");
+    return e
+  }
+
+  var range;
+  if (document.createRange) { range = function(node, start, end, endNode) {
+    var r = document.createRange();
+    r.setEnd(endNode || node, end);
+    r.setStart(node, start);
+    return r
+  }; }
+  else { range = function(node, start, end) {
+    var r = document.body.createTextRange();
+    try { r.moveToElementText(node.parentNode); }
+    catch(e) { return r }
+    r.collapse(true);
+    r.moveEnd("character", end);
+    r.moveStart("character", start);
+    return r
+  }; }
+
+  function contains(parent, child) {
+    if (child.nodeType == 3) // Android browser always returns false when child is a textnode
+      { child = child.parentNode; }
+    if (parent.contains)
+      { return parent.contains(child) }
+    do {
+      if (child.nodeType == 11) { child = child.host; }
+      if (child == parent) { return true }
+    } while (child = child.parentNode)
+  }
+
+  function activeElt() {
+    // IE and Edge may throw an "Unspecified Error" when accessing document.activeElement.
+    // IE < 10 will throw when accessed while the page is loading or in an iframe.
+    // IE > 9 and Edge will throw when accessed in an iframe if document.body is unavailable.
+    var activeElement;
+    try {
+      activeElement = document.activeElement;
+    } catch(e) {
+      activeElement = document.body || null;
+    }
+    while (activeElement && activeElement.shadowRoot && activeElement.shadowRoot.activeElement)
+      { activeElement = activeElement.shadowRoot.activeElement; }
+    return activeElement
+  }
+
+  function addClass(node, cls) {
+    var current = node.className;
+    if (!classTest(cls).test(current)) { node.className += (current ? " " : "") + cls; }
+  }
+  function joinClasses(a, b) {
+    var as = a.split(" ");
+    for (var i = 0; i < as.length; i++)
+      { if (as[i] && !classTest(as[i]).test(b)) { b += " " + as[i]; } }
+    return b
+  }
+
+  var selectInput = function(node) { node.select(); };
+  if (ios) // Mobile Safari apparently has a bug where select() is broken.
+    { selectInput = function(node) { node.selectionStart = 0; node.selectionEnd = node.value.length; }; }
+  else if (ie) // Suppress mysterious IE10 errors
+    { selectInput = function(node) { try { node.select(); } catch(_e) {} }; }
+
+  function bind(f) {
+    var args = Array.prototype.slice.call(arguments, 1);
+    return function(){return f.apply(null, args)}
+  }
+
+  function copyObj(obj, target, overwrite) {
+    if (!target) { target = {}; }
+    for (var prop in obj)
+      { if (obj.hasOwnProperty(prop) && (overwrite !== false || !target.hasOwnProperty(prop)))
+        { target[prop] = obj[prop]; } }
+    return target
+  }
+
+  // Counts the column offset in a string, taking tabs into account.
+  // Used mostly to find indentation.
+  function countColumn(string, end, tabSize, startIndex, startValue) {
+    if (end == null) {
+      end = string.search(/[^\s\u00a0]/);
+      if (end == -1) { end = string.length; }
+    }
+    for (var i = startIndex || 0, n = startValue || 0;;) {
+      var nextTab = string.indexOf("\t", i);
+      if (nextTab < 0 || nextTab >= end)
+        { return n + (end - i) }
+      n += nextTab - i;
+      n += tabSize - (n % tabSize);
+      i = nextTab + 1;
+    }
+  }
+
+  var Delayed = function() {
+    this.id = null;
+    this.f = null;
+    this.time = 0;
+    this.handler = bind(this.onTimeout, this);
+  };
+  Delayed.prototype.onTimeout = function (self) {
+    self.id = 0;
+    if (self.time <= +new Date) {
+      self.f();
+    } else {
+      setTimeout(self.handler, self.time - +new Date);
+    }
+  };
+  Delayed.prototype.set = function (ms, f) {
+    this.f = f;
+    var time = +new Date + ms;
+    if (!this.id || time < this.time) {
+      clearTimeout(this.id);
+      this.id = setTimeout(this.handler, ms);
+      this.time = time;
+    }
+  };
+
+  function indexOf(array, elt) {
+    for (var i = 0; i < array.length; ++i)
+      { if (array[i] == elt) { return i } }
+    return -1
+  }
+
+  // Number of pixels added to scroller and sizer to hide scrollbar
+  var scrollerGap = 50;
+
+  // Returned or thrown by various protocols to signal 'I'm not
+  // handling this'.
+  var Pass = {toString: function(){return "CodeMirror.Pass"}};
+
+  // Reused option objects for setSelection & friends
+  var sel_dontScroll = {scroll: false}, sel_mouse = {origin: "*mouse"}, sel_move = {origin: "+move"};
+
+  // The inverse of countColumn -- find the offset that corresponds to
+  // a particular column.
+  function findColumn(string, goal, tabSize) {
+    for (var pos = 0, col = 0;;) {
+      var nextTab = string.indexOf("\t", pos);
+      if (nextTab == -1) { nextTab = string.length; }
+      var skipped = nextTab - pos;
+      if (nextTab == string.length || col + skipped >= goal)
+        { return pos + Math.min(skipped, goal - col) }
+      col += nextTab - pos;
+      col += tabSize - (col % tabSize);
+      pos = nextTab + 1;
+      if (col >= goal) { return pos }
+    }
+  }
+
+  var spaceStrs = [""];
+  function spaceStr(n) {
+    while (spaceStrs.length <= n)
+      { spaceStrs.push(lst(spaceStrs) + " "); }
+    return spaceStrs[n]
+  }
+
+  function lst(arr) { return arr[arr.length-1] }
+
+  function map(array, f) {
+    var out = [];
+    for (var i = 0; i < array.length; i++) { out[i] = f(array[i], i); }
+    return out
+  }
+
+  function insertSorted(array, value, score) {
+    var pos = 0, priority = score(value);
+    while (pos < array.length && score(array[pos]) <= priority) { pos++; }
+    array.splice(pos, 0, value);
+  }
+
+  function nothing() {}
+
+  function createObj(base, props) {
+    var inst;
+    if (Object.create) {
+      inst = Object.create(base);
+    } else {
+      nothing.prototype = base;
+      inst = new nothing();
+    }
+    if (props) { copyObj(props, inst); }
+    return inst
+  }
+
+  var nonASCIISingleCaseWordChar = /[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/;
+  function isWordCharBasic(ch) {
+    return /\w/.test(ch) || ch > "\x80" &&
+      (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch))
+  }
+  function isWordChar(ch, helper) {
+    if (!helper) { return isWordCharBasic(ch) }
+    if (helper.source.indexOf("\\w") > -1 && isWordCharBasic(ch)) { return true }
+    return helper.test(ch)
+  }
+
+  function isEmpty(obj) {
+    for (var n in obj) { if (obj.hasOwnProperty(n) && obj[n]) { return false } }
+    return true
+  }
+
+  // Extending unicode characters. A series of a non-extending char +
+  // any number of extending chars is treated as a single unit as far
+  // as editing and measuring is concerned. This is not fully correct,
+  // since some scripts/fonts/browsers also treat other configurations
+  // of code points as a group.
+  var extendingChars = /[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/;
+  function isExtendingChar(ch) { return ch.charCodeAt(0) >= 768 && extendingChars.test(ch) }
+
+  // Returns a number from the range [`0`; `str.length`] unless `pos` is outside that range.
+  function skipExtendingChars(str, pos, dir) {
+    while ((dir < 0 ? pos > 0 : pos < str.length) && isExtendingChar(str.charAt(pos))) { pos += dir; }
+    return pos
+  }
+
+  // Returns the value from the range [`from`; `to`] that satisfies
+  // `pred` and is closest to `from`. Assumes that at least `to`
+  // satisfies `pred`. Supports `from` being greater than `to`.
+  function findFirst(pred, from, to) {
+    // At any point we are certain `to` satisfies `pred`, don't know
+    // whether `from` does.
+    var dir = from > to ? -1 : 1;
+    for (;;) {
+      if (from == to) { return from }
+      var midF = (from + to) / 2, mid = dir < 0 ? Math.ceil(midF) : Math.floor(midF);
+      if (mid == from) { return pred(mid) ? from : to }
+      if (pred(mid)) { to = mid; }
+      else { from = mid + dir; }
+    }
+  }
+
+  // BIDI HELPERS
+
+  function iterateBidiSections(order, from, to, f) {
+    if (!order) { return f(from, to, "ltr", 0) }
+    var found = false;
+    for (var i = 0; i < order.length; ++i) {
+      var part = order[i];
+      if (part.from < to && part.to > from || from == to && part.to == from) {
+        f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? "rtl" : "ltr", i);
+        found = true;
+      }
+    }
+    if (!found) { f(from, to, "ltr"); }
+  }
+
+  var bidiOther = null;
+  function getBidiPartAt(order, ch, sticky) {
+    var found;
+    bidiOther = null;
+    for (var i = 0; i < order.length; ++i) {
+      var cur = order[i];
+      if (cur.from < ch && cur.to > ch) { return i }
+      if (cur.to == ch) {
+        if (cur.from != cur.to && sticky == "before") { found = i; }
+        else { bidiOther = i; }
+      }
+      if (cur.from == ch) {
+        if (cur.from != cur.to && sticky != "before") { found = i; }
+        else { bidiOther = i; }
+      }
+    }
+    return found != null ? found : bidiOther
+  }
+
+  // Bidirectional ordering algorithm
+  // See http://unicode.org/reports/tr9/tr9-13.html for the algorithm
+  // that this (partially) implements.
+
+  // One-char codes used for character types:
+  // L (L):   Left-to-Right
+  // R (R):   Right-to-Left
+  // r (AL):  Right-to-Left Arabic
+  // 1 (EN):  European Number
+  // + (ES):  European Number Separator
+  // % (ET):  European Number Terminator
+  // n (AN):  Arabic Number
+  // , (CS):  Common Number Separator
+  // m (NSM): Non-Spacing Mark
+  // b (BN):  Boundary Neutral
+  // s (B):   Paragraph Separator
+  // t (S):   Segment Separator
+  // w (WS):  Whitespace
+  // N (ON):  Other Neutrals
+
+  // Returns null if characters are ordered as they appear
+  // (left-to-right), or an array of sections ({from, to, level}
+  // objects) in the order in which they occur visually.
+  var bidiOrdering = (function() {
+    // Character types for codepoints 0 to 0xff
+    var lowTypes = "bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN";
+    // Character types for codepoints 0x600 to 0x6f9
+    var arabicTypes = "nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111";
+    function charType(code) {
+      if (code <= 0xf7) { return lowTypes.charAt(code) }
+      else if (0x590 <= code && code <= 0x5f4) { return "R" }
+      else if (0x600 <= code && code <= 0x6f9) { return arabicTypes.charAt(code - 0x600) }
+      else if (0x6ee <= code && code <= 0x8ac) { return "r" }
+      else if (0x2000 <= code && code <= 0x200b) { return "w" }
+      else if (code == 0x200c) { return "b" }
+      else { return "L" }
+    }
+
+    var bidiRE = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/;
+    var isNeutral = /[stwN]/, isStrong = /[LRr]/, countsAsLeft = /[Lb1n]/, countsAsNum = /[1n]/;
+
+    function BidiSpan(level, from, to) {
+      this.level = level;
+      this.from = from; this.to = to;
+    }
+
+    return function(str, direction) {
+      var outerType = direction == "ltr" ? "L" : "R";
+
+      if (str.length == 0 || direction == "ltr" && !bidiRE.test(str)) { return false }
+      var len = str.length, types = [];
+      for (var i = 0; i < len; ++i)
+        { types.push(charType(str.charCodeAt(i))); }
+
+      // W1. Examine each non-spacing mark (NSM) in the level run, and
+      // change the type of the NSM to the type of the previous
+      // character. If the NSM is at the start of the level run, it will
+      // get the type of sor.
+      for (var i$1 = 0, prev = outerType; i$1 < len; ++i$1) {
+        var type = types[i$1];
+        if (type == "m") { types[i$1] = prev; }
+        else { prev = type; }
+      }
+
+      // W2. Search backwards from each instance of a European number
+      // until the first strong type (R, L, AL, or sor) is found. If an
+      // AL is found, change the type of the European number to Arabic
+      // number.
+      // W3. Change all ALs to R.
+      for (var i$2 = 0, cur = outerType; i$2 < len; ++i$2) {
+        var type$1 = types[i$2];
+        if (type$1 == "1" && cur == "r") { types[i$2] = "n"; }
+        else if (isStrong.test(type$1)) { cur = type$1; if (type$1 == "r") { types[i$2] = "R"; } }
+      }
+
+      // W4. A single European separator between two European numbers
+      // changes to a European number. A single common separator between
+      // two numbers of the same type changes to that type.
+      for (var i$3 = 1, prev$1 = types[0]; i$3 < len - 1; ++i$3) {
+        var type$2 = types[i$3];
+        if (type$2 == "+" && prev$1 == "1" && types[i$3+1] == "1") { types[i$3] = "1"; }
+        else if (type$2 == "," && prev$1 == types[i$3+1] &&
+                 (prev$1 == "1" || prev$1 == "n")) { types[i$3] = prev$1; }
+        prev$1 = type$2;
+      }
+
+      // W5. A sequence of European terminators adjacent to European
+      // numbers changes to all European numbers.
+      // W6. Otherwise, separators and terminators change to Other
+      // Neutral.
+      for (var i$4 = 0; i$4 < len; ++i$4) {
+        var type$3 = types[i$4];
+        if (type$3 == ",") { types[i$4] = "N"; }
+        else if (type$3 == "%") {
+          var end = (void 0);
+          for (end = i$4 + 1; end < len && types[end] == "%"; ++end) {}
+          var replace = (i$4 && types[i$4-1] == "!") || (end < len && types[end] == "1") ? "1" : "N";
+          for (var j = i$4; j < end; ++j) { types[j] = replace; }
+          i$4 = end - 1;
+        }
+      }
+
+      // W7. Search backwards from each instance of a European number
+      // until the first strong type (R, L, or sor) is found. If an L is
+      // found, then change the type of the European number to L.
+      for (var i$5 = 0, cur$1 = outerType; i$5 < len; ++i$5) {
+        var type$4 = types[i$5];
+        if (cur$1 == "L" && type$4 == "1") { types[i$5] = "L"; }
+        else if (isStrong.test(type$4)) { cur$1 = type$4; }
+      }
+
+      // N1. A sequence of neutrals takes the direction of the
+      // surrounding strong text if the text on both sides has the same
+      // direction. European and Arabic numbers act as if they were R in
+      // terms of their influence on neutrals. Start-of-level-run (sor)
+      // and end-of-level-run (eor) are used at level run boundaries.
+      // N2. Any remaining neutrals take the embedding direction.
+      for (var i$6 = 0; i$6 < len; ++i$6) {
+        if (isNeutral.test(types[i$6])) {
+          var end$1 = (void 0);
+          for (end$1 = i$6 + 1; end$1 < len && isNeutral.test(types[end$1]); ++end$1) {}
+          var before = (i$6 ? types[i$6-1] : outerType) == "L";
+          var after = (end$1 < len ? types[end$1] : outerType) == "L";
+          var replace$1 = before == after ? (before ? "L" : "R") : outerType;
+          for (var j$1 = i$6; j$1 < end$1; ++j$1) { types[j$1] = replace$1; }
+          i$6 = end$1 - 1;
+        }
+      }
+
+      // Here we depart from the documented algorithm, in order to avoid
+      // building up an actual levels array. Since there are only three
+      // levels (0, 1, 2) in an implementation that doesn't take
+      // explicit embedding into account, we can build up the order on
+      // the fly, without following the level-based algorithm.
+      var order = [], m;
+      for (var i$7 = 0; i$7 < len;) {
+        if (countsAsLeft.test(types[i$7])) {
+          var start = i$7;
+          for (++i$7; i$7 < len && countsAsLeft.test(types[i$7]); ++i$7) {}
+          order.push(new BidiSpan(0, start, i$7));
+        } else {
+          var pos = i$7, at = order.length, isRTL = direction == "rtl" ? 1 : 0;
+          for (++i$7; i$7 < len && types[i$7] != "L"; ++i$7) {}
+          for (var j$2 = pos; j$2 < i$7;) {
+            if (countsAsNum.test(types[j$2])) {
+              if (pos < j$2) { order.splice(at, 0, new BidiSpan(1, pos, j$2)); at += isRTL; }
+              var nstart = j$2;
+              for (++j$2; j$2 < i$7 && countsAsNum.test(types[j$2]); ++j$2) {}
+              order.splice(at, 0, new BidiSpan(2, nstart, j$2));
+              at += isRTL;
+              pos = j$2;
+            } else { ++j$2; }
+          }
+          if (pos < i$7) { order.splice(at, 0, new BidiSpan(1, pos, i$7)); }
+        }
+      }
+      if (direction == "ltr") {
+        if (order[0].level == 1 && (m = str.match(/^\s+/))) {
+          order[0].from = m[0].length;
+          order.unshift(new BidiSpan(0, 0, m[0].length));
+        }
+        if (lst(order).level == 1 && (m = str.match(/\s+$/))) {
+          lst(order).to -= m[0].length;
+          order.push(new BidiSpan(0, len - m[0].length, len));
+        }
+      }
+
+      return direction == "rtl" ? order.reverse() : order
+    }
+  })();
+
+  // Get the bidi ordering for the given line (and cache it). Returns
+  // false for lines that are fully left-to-right, and an array of
+  // BidiSpan objects otherwise.
+  function getOrder(line, direction) {
+    var order = line.order;
+    if (order == null) { order = line.order = bidiOrdering(line.text, direction); }
+    return order
+  }
+
+  // EVENT HANDLING
+
+  // Lightweight event framework. on/off also work on DOM nodes,
+  // registering native DOM handlers.
+
+  var noHandlers = [];
+
+  var on = function(emitter, type, f) {
+    if (emitter.addEventListener) {
+      emitter.addEventListener(type, f, false);
+    } else if (emitter.attachEvent) {
+      emitter.attachEvent("on" + type, f);
+    } else {
+      var map = emitter._handlers || (emitter._handlers = {});
+      map[type] = (map[type] || noHandlers).concat(f);
+    }
+  };
+
+  function getHandlers(emitter, type) {
+    return emitter._handlers && emitter._handlers[type] || noHandlers
+  }
+
+  function off(emitter, type, f) {
+    if (emitter.removeEventListener) {
+      emitter.removeEventListener(type, f, false);
+    } else if (emitter.detachEvent) {
+      emitter.detachEvent("on" + type, f);
+    } else {
+      var map = emitter._handlers, arr = map && map[type];
+      if (arr) {
+        var index = indexOf(arr, f);
+        if (index > -1)
+          { map[type] = arr.slice(0, index).concat(arr.slice(index + 1)); }
+      }
+    }
+  }
+
+  function signal(emitter, type /*, values...*/) {
+    var handlers = getHandlers(emitter, type);
+    if (!handlers.length) { return }
+    var args = Array.prototype.slice.call(arguments, 2);
+    for (var i = 0; i < handlers.length; ++i) { handlers[i].apply(null, args); }
+  }
+
+  // The DOM events that CodeMirror handles can be overridden by
+  // registering a (non-DOM) handler on the editor for the event name,
+  // and preventDefault-ing the event in that handler.
+  function signalDOMEvent(cm, e, override) {
+    if (typeof e == "string")
+      { e = {type: e, preventDefault: function() { this.defaultPrevented = true; }}; }
+    signal(cm, override || e.type, cm, e);
+    return e_defaultPrevented(e) || e.codemirrorIgnore
+  }
+
+  function signalCursorActivity(cm) {
+    var arr = cm._handlers && cm._handlers.cursorActivity;
+    if (!arr) { return }
+    var set = cm.curOp.cursorActivityHandlers || (cm.curOp.cursorActivityHandlers = []);
+    for (var i = 0; i < arr.length; ++i) { if (indexOf(set, arr[i]) == -1)
+      { set.push(arr[i]); } }
+  }
+
+  function hasHandler(emitter, type) {
+    return getHandlers(emitter, type).length > 0
+  }
+
+  // Add on and off methods to a constructor's prototype, to make
+  // registering events on such objects more convenient.
+  function eventMixin(ctor) {
+    ctor.prototype.on = function(type, f) {on(this, type, f);};
+    ctor.prototype.off = function(type, f) {off(this, type, f);};
+  }
+
+  // Due to the fact that we still support jurassic IE versions, some
+  // compatibility wrappers are needed.
+
+  function e_preventDefault(e) {
+    if (e.preventDefault) { e.preventDefault(); }
+    else { e.returnValue = false; }
+  }
+  function e_stopPropagation(e) {
+    if (e.stopPropagation) { e.stopPropagation(); }
+    else { e.cancelBubble = true; }
+  }
+  function e_defaultPrevented(e) {
+    return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == false
+  }
+  function e_stop(e) {e_preventDefault(e); e_stopPropagation(e);}
+
+  function e_target(e) {return e.target || e.srcElement}
+  function e_button(e) {
+    var b = e.which;
+    if (b == null) {
+      if (e.button & 1) { b = 1; }
+      else if (e.button & 2) { b = 3; }
+      else if (e.button & 4) { b = 2; }
+    }
+    if (mac && e.ctrlKey && b == 1) { b = 3; }
+    return b
+  }
+
+  // Detect drag-and-drop
+  var dragAndDrop = function() {
+    // There is *some* kind of drag-and-drop support in IE6-8, but I
+    // couldn't get it to work yet.
+    if (ie && ie_version < 9) { return false }
+    var div = elt('div');
+    return "draggable" in div || "dragDrop" in div
+  }();
+
+  var zwspSupported;
+  function zeroWidthElement(measure) {
+    if (zwspSupported == null) {
+      var test = elt("span", "\u200b");
+      removeChildrenAndAdd(measure, elt("span", [test, document.createTextNode("x")]));
+      if (measure.firstChild.offsetHeight != 0)
+        { zwspSupported = test.offsetWidth <= 1 && test.offsetHeight > 2 && !(ie && ie_version < 8); }
+    }
+    var node = zwspSupported ? elt("span", "\u200b") :
+      elt("span", "\u00a0", null, "display: inline-block; width: 1px; margin-right: -1px");
+    node.setAttribute("cm-text", "");
+    return node
+  }
+
+  // Feature-detect IE's crummy client rect reporting for bidi text
+  var badBidiRects;
+  function hasBadBidiRects(measure) {
+    if (badBidiRects != null) { return badBidiRects }
+    var txt = removeChildrenAndAdd(measure, document.createTextNode("A\u062eA"));
+    var r0 = range(txt, 0, 1).getBoundingClientRect();
+    var r1 = range(txt, 1, 2).getBoundingClientRect();
+    removeChildren(measure);
+    if (!r0 || r0.left == r0.right) { return false } // Safari returns null in some cases (#2780)
+    return badBidiRects = (r1.right - r0.right < 3)
+  }
+
+  // See if "".split is the broken IE version, if so, provide an
+  // alternative way to split lines.
+  var splitLinesAuto = "\n\nb".split(/\n/).length != 3 ? function (string) {
+    var pos = 0, result = [], l = string.length;
+    while (pos <= l) {
+      var nl = string.indexOf("\n", pos);
+      if (nl == -1) { nl = string.length; }
+      var line = string.slice(pos, string.charAt(nl - 1) == "\r" ? nl - 1 : nl);
+      var rt = line.indexOf("\r");
+      if (rt != -1) {
+        result.push(line.slice(0, rt));
+        pos += rt + 1;
+      } else {
+        result.push(line);
+        pos = nl + 1;
+      }
+    }
+    return result
+  } : function (string) { return string.split(/\r\n?|\n/); };
+
+  var hasSelection = window.getSelection ? function (te) {
+    try { return te.selectionStart != te.selectionEnd }
+    catch(e) { return false }
+  } : function (te) {
+    var range;
+    try {range = te.ownerDocument.selection.createRange();}
+    catch(e) {}
+    if (!range || range.parentElement() != te) { return false }
+    return range.compareEndPoints("StartToEnd", range) != 0
+  };
+
+  var hasCopyEvent = (function () {
+    var e = elt("div");
+    if ("oncopy" in e) { return true }
+    e.setAttribute("oncopy", "return;");
+    return typeof e.oncopy == "function"
+  })();
+
+  var badZoomedRects = null;
+  function hasBadZoomedRects(measure) {
+    if (badZoomedRects != null) { return badZoomedRects }
+    var node = removeChildrenAndAdd(measure, elt("span", "x"));
+    var normal = node.getBoundingClientRect();
+    var fromRange = range(node, 0, 1).getBoundingClientRect();
+    return badZoomedRects = Math.abs(normal.left - fromRange.left) > 1
+  }
+
+  // Known modes, by name and by MIME
+  var modes = {}, mimeModes = {};
+
+  // Extra arguments are stored as the mode's dependencies, which is
+  // used by (legacy) mechanisms like loadmode.js to automatically
+  // load a mode. (Preferred mechanism is the require/define calls.)
+  function defineMode(name, mode) {
+    if (arguments.length > 2)
+      { mode.dependencies = Array.prototype.slice.call(arguments, 2); }
+    modes[name] = mode;
+  }
+
+  function defineMIME(mime, spec) {
+    mimeModes[mime] = spec;
+  }
+
+  // Given a MIME type, a {name, ...options} config object, or a name
+  // string, return a mode config object.
+  function resolveMode(spec) {
+    if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) {
+      spec = mimeModes[spec];
+    } else if (spec && typeof spec.name == "string" && mimeModes.hasOwnProperty(spec.name)) {
+      var found = mimeModes[spec.name];
+      if (typeof found == "string") { found = {name: found}; }
+      spec = createObj(found, spec);
+      spec.name = found.name;
+    } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+xml$/.test(spec)) {
+      return resolveMode("application/xml")
+    } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+json$/.test(spec)) {
+      return resolveMode("application/json")
+    }
+    if (typeof spec == "string") { return {name: spec} }
+    else { return spec || {name: "null"} }
+  }
+
+  // Given a mode spec (anything that resolveMode accepts), find and
+  // initialize an actual mode object.
+  function getMode(options, spec) {
+    spec = resolveMode(spec);
+    var mfactory = modes[spec.name];
+    if (!mfactory) { return getMode(options, "text/plain") }
+    var modeObj = mfactory(options, spec);
+    if (modeExtensions.hasOwnProperty(spec.name)) {
+      var exts = modeExtensions[spec.name];
+      for (var prop in exts) {
+        if (!exts.hasOwnProperty(prop)) { continue }
+        if (modeObj.hasOwnProperty(prop)) { modeObj["_" + prop] = modeObj[prop]; }
+        modeObj[prop] = exts[prop];
+      }
+    }
+    modeObj.name = spec.name;
+    if (spec.helperType) { modeObj.helperType = spec.helperType; }
+    if (spec.modeProps) { for (var prop$1 in spec.modeProps)
+      { modeObj[prop$1] = spec.modeProps[prop$1]; } }
+
+    return modeObj
+  }
+
+  // This can be used to attach properties to mode objects from
+  // outside the actual mode definition.
+  var modeExtensions = {};
+  function extendMode(mode, properties) {
+    var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {});
+    copyObj(properties, exts);
+  }
+
+  function copyState(mode, state) {
+    if (state === true) { return state }
+    if (mode.copyState) { return mode.copyState(state) }
+    var nstate = {};
+    for (var n in state) {
+      var val = state[n];
+      if (val instanceof Array) { val = val.concat([]); }
+      nstate[n] = val;
+    }
+    return nstate
+  }
+
+  // Given a mode and a state (for that mode), find the inner mode and
+  // state at the position that the state refers to.
+  function innerMode(mode, state) {
+    var info;
+    while (mode.innerMode) {
+      info = mode.innerMode(state);
+      if (!info || info.mode == mode) { break }
+      state = info.state;
+      mode = info.mode;
+    }
+    return info || {mode: mode, state: state}
+  }
+
+  function startState(mode, a1, a2) {
+    return mode.startState ? mode.startState(a1, a2) : true
+  }
+
+  // STRING STREAM
+
+  // Fed to the mode parsers, provides helper functions to make
+  // parsers more succinct.
+
+  var StringStream = function(string, tabSize, lineOracle) {
+    this.pos = this.start = 0;
+    this.string = string;
+    this.tabSize = tabSize || 8;
+    this.lastColumnPos = this.lastColumnValue = 0;
+    this.lineStart = 0;
+    this.lineOracle = lineOracle;
+  };
+
+  StringStream.prototype.eol = function () {return this.pos >= this.string.length};
+  StringStream.prototype.sol = function () {return this.pos == this.lineStart};
+  StringStream.prototype.peek = function () {return this.string.charAt(this.pos) || undefined};
+  StringStream.prototype.next = function () {
+    if (this.pos < this.string.length)
+      { return this.string.charAt(this.pos++) }
+  };
+  StringStream.prototype.eat = function (match) {
+    var ch = this.string.charAt(this.pos);
+    var ok;
+    if (typeof match == "string") { ok = ch == match; }
+    else { ok = ch && (match.test ? match.test(ch) : match(ch)); }
+    if (ok) {++this.pos; return ch}
+  };
+  StringStream.prototype.eatWhile = function (match) {
+    var start = this.pos;
+    while (this.eat(match)){}
+    return this.pos > start
+  };
+  StringStream.prototype.eatSpace = function () {
+    var start = this.pos;
+    while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) { ++this.pos; }
+    return this.pos > start
+  };
+  StringStream.prototype.skipToEnd = function () {this.pos = this.string.length;};
+  StringStream.prototype.skipTo = function (ch) {
+    var found = this.string.indexOf(ch, this.pos);
+    if (found > -1) {this.pos = found; return true}
+  };
+  StringStream.prototype.backUp = function (n) {this.pos -= n;};
+  StringStream.prototype.column = function () {
+    if (this.lastColumnPos < this.start) {
+      this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue);
+      this.lastColumnPos = this.start;
+    }
+    return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0)
+  };
+  StringStream.prototype.indentation = function () {
+    return countColumn(this.string, null, this.tabSize) -
+      (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0)
+  };
+  StringStream.prototype.match = function (pattern, consume, caseInsensitive) {
+    if (typeof pattern == "string") {
+      var cased = function (str) { return caseInsensitive ? str.toLowerCase() : str; };
+      var substr = this.string.substr(this.pos, pattern.length);
+      if (cased(substr) == cased(pattern)) {
+        if (consume !== false) { this.pos += pattern.length; }
+        return true
+      }
+    } else {
+      var match = this.string.slice(this.pos).match(pattern);
+      if (match && match.index > 0) { return null }
+      if (match && consume !== false) { this.pos += match[0].length; }
+      return match
+    }
+  };
+  StringStream.prototype.current = function (){return this.string.slice(this.start, this.pos)};
+  StringStream.prototype.hideFirstChars = function (n, inner) {
+    this.lineStart += n;
+    try { return inner() }
+    finally { this.lineStart -= n; }
+  };
+  StringStream.prototype.lookAhead = function (n) {
+    var oracle = this.lineOracle;
+    return oracle && oracle.lookAhead(n)
+  };
+  StringStream.prototype.baseToken = function () {
+    var oracle = this.lineOracle;
+    return oracle && oracle.baseToken(this.pos)
+  };
+
+  // Find the line object corresponding to the given line number.
+  function getLine(doc, n) {
+    n -= doc.first;
+    if (n < 0 || n >= doc.size) { throw new Error("There is no line " + (n + doc.first) + " in the document.") }
+    var chunk = doc;
+    while (!chunk.lines) {
+      for (var i = 0;; ++i) {
+        var child = chunk.children[i], sz = child.chunkSize();
+        if (n < sz) { chunk = child; break }
+        n -= sz;
+      }
+    }
+    return chunk.lines[n]
+  }
+
+  // Get the part of a document between two positions, as an array of
+  // strings.
+  function getBetween(doc, start, end) {
+    var out = [], n = start.line;
+    doc.iter(start.line, end.line + 1, function (line) {
+      var text = line.text;
+      if (n == end.line) { text = text.slice(0, end.ch); }
+      if (n == start.line) { text = text.slice(start.ch); }
+      out.push(text);
+      ++n;
+    });
+    return out
+  }
+  // Get the lines between from and to, as array of strings.
+  function getLines(doc, from, to) {
+    var out = [];
+    doc.iter(from, to, function (line) { out.push(line.text); }); // iter aborts when callback returns truthy value
+    return out
+  }
+
+  // Update the height of a line, propagating the height change
+  // upwards to parent nodes.
+  function updateLineHeight(line, height) {
+    var diff = height - line.height;
+    if (diff) { for (var n = line; n; n = n.parent) { n.height += diff; } }
+  }
+
+  // Given a line object, find its line number by walking up through
+  // its parent links.
+  function lineNo(line) {
+    if (line.parent == null) { return null }
+    var cur = line.parent, no = indexOf(cur.lines, line);
+    for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) {
+      for (var i = 0;; ++i) {
+        if (chunk.children[i] == cur) { break }
+        no += chunk.children[i].chunkSize();
+      }
+    }
+    return no + cur.first
+  }
+
+  // Find the line at the given vertical position, using the height
+  // information in the document tree.
+  function lineAtHeight(chunk, h) {
+    var n = chunk.first;
+    outer: do {
+      for (var i$1 = 0; i$1 < chunk.children.length; ++i$1) {
+        var child = chunk.children[i$1], ch = child.height;
+        if (h < ch) { chunk = child; continue outer }
+        h -= ch;
+        n += child.chunkSize();
+      }
+      return n
+    } while (!chunk.lines)
+    var i = 0;
+    for (; i < chunk.lines.length; ++i) {
+      var line = chunk.lines[i], lh = line.height;
+      if (h < lh) { break }
+      h -= lh;
+    }
+    return n + i
+  }
+
+  function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size}
+
+  function lineNumberFor(options, i) {
+    return String(options.lineNumberFormatter(i + options.firstLineNumber))
+  }
+
+  // A Pos instance represents a position within the text.
+  function Pos(line, ch, sticky) {
+    if ( sticky === void 0 ) sticky = null;
+
+    if (!(this instanceof Pos)) { return new Pos(line, ch, sticky) }
+    this.line = line;
+    this.ch = ch;
+    this.sticky = sticky;
+  }
+
+  // Compare two positions, return 0 if they are the same, a negative
+  // number when a is less, and a positive number otherwise.
+  function cmp(a, b) { return a.line - b.line || a.ch - b.ch }
+
+  function equalCursorPos(a, b) { return a.sticky == b.sticky && cmp(a, b) == 0 }
+
+  function copyPos(x) {return Pos(x.line, x.ch)}
+  function maxPos(a, b) { return cmp(a, b) < 0 ? b : a }
+  function minPos(a, b) { return cmp(a, b) < 0 ? a : b }
+
+  // Most of the external API clips given positions to make sure they
+  // actually exist within the document.
+  function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.first + doc.size - 1))}
+  function clipPos(doc, pos) {
+    if (pos.line < doc.first) { return Pos(doc.first, 0) }
+    var last = doc.first + doc.size - 1;
+    if (pos.line > last) { return Pos(last, getLine(doc, last).text.length) }
+    return clipToLen(pos, getLine(doc, pos.line).text.length)
+  }
+  function clipToLen(pos, linelen) {
+    var ch = pos.ch;
+    if (ch == null || ch > linelen) { return Pos(pos.line, linelen) }
+    else if (ch < 0) { return Pos(pos.line, 0) }
+    else { return pos }
+  }
+  function clipPosArray(doc, array) {
+    var out = [];
+    for (var i = 0; i < array.length; i++) { out[i] = clipPos(doc, array[i]); }
+    return out
+  }
+
+  var SavedContext = function(state, lookAhead) {
+    this.state = state;
+    this.lookAhead = lookAhead;
+  };
+
+  var Context = function(doc, state, line, lookAhead) {
+    this.state = state;
+    this.doc = doc;
+    this.line = line;
+    this.maxLookAhead = lookAhead || 0;
+    this.baseTokens = null;
+    this.baseTokenPos = 1;
+  };
+
+  Context.prototype.lookAhead = function (n) {
+    var line = this.doc.getLine(this.line + n);
+    if (line != null && n > this.maxLookAhead) { this.maxLookAhead = n; }
+    return line
+  };
+
+  Context.prototype.baseToken = function (n) {
+    if (!this.baseTokens) { return null }
+    while (this.baseTokens[this.baseTokenPos] <= n)
+      { this.baseTokenPos += 2; }
+    var type = this.baseTokens[this.baseTokenPos + 1];
+    return {type: type && type.replace(/( |^)overlay .*/, ""),
+            size: this.baseTokens[this.baseTokenPos] - n}
+  };
+
+  Context.prototype.nextLine = function () {
+    this.line++;
+    if (this.maxLookAhead > 0) { this.maxLookAhead--; }
+  };
+
+  Context.fromSaved = function (doc, saved, line) {
+    if (saved instanceof SavedContext)
+      { return new Context(doc, copyState(doc.mode, saved.state), line, saved.lookAhead) }
+    else
+      { return new Context(doc, copyState(doc.mode, saved), line) }
+  };
+
+  Context.prototype.save = function (copy) {
+    var state = copy !== false ? copyState(this.doc.mode, this.state) : this.state;
+    return this.maxLookAhead > 0 ? new SavedContext(state, this.maxLookAhead) : state
+  };
+
+
+  // Compute a style array (an array starting with a mode generation
+  // -- for invalidation -- followed by pairs of end positions and
+  // style strings), which is used to highlight the tokens on the
+  // line.
+  function highlightLine(cm, line, context, forceToEnd) {
+    // A styles array always starts with a number identifying the
+    // mode/overlays that it is based on (for easy invalidation).
+    var st = [cm.state.modeGen], lineClasses = {};
+    // Compute the base array of styles
+    runMode(cm, line.text, cm.doc.mode, context, function (end, style) { return st.push(end, style); },
+            lineClasses, forceToEnd);
+    var state = context.state;
+
+    // Run overlays, adjust style array.
+    var loop = function ( o ) {
+      context.baseTokens = st;
+      var overlay = cm.state.overlays[o], i = 1, at = 0;
+      context.state = true;
+      runMode(cm, line.text, overlay.mode, context, function (end, style) {
+        var start = i;
+        // Ensure there's a token end at the current position, and that i points at it
+        while (at < end) {
+          var i_end = st[i];
+          if (i_end > end)
+            { st.splice(i, 1, end, st[i+1], i_end); }
+          i += 2;
+          at = Math.min(end, i_end);
+        }
+        if (!style) { return }
+        if (overlay.opaque) {
+          st.splice(start, i - start, end, "overlay " + style);
+          i = start + 2;
+        } else {
+          for (; start < i; start += 2) {
+            var cur = st[start+1];
+            st[start+1] = (cur ? cur + " " : "") + "overlay " + style;
+          }
+        }
+      }, lineClasses);
+      context.state = state;
+      context.baseTokens = null;
+      context.baseTokenPos = 1;
+    };
+
+    for (var o = 0; o < cm.state.overlays.length; ++o) loop( o );
+
+    return {styles: st, classes: lineClasses.bgClass || lineClasses.textClass ? lineClasses : null}
+  }
+
+  function getLineStyles(cm, line, updateFrontier) {
+    if (!line.styles || line.styles[0] != cm.state.modeGen) {
+      var context = getContextBefore(cm, lineNo(line));
+      var resetState = line.text.length > cm.options.maxHighlightLength && copyState(cm.doc.mode, context.state);
+      var result = highlightLine(cm, line, context);
+      if (resetState) { context.state = resetState; }
+      line.stateAfter = context.save(!resetState);
+      line.styles = result.styles;
+      if (result.classes) { line.styleClasses = result.classes; }
+      else if (line.styleClasses) { line.styleClasses = null; }
+      if (updateFrontier === cm.doc.highlightFrontier)
+        { cm.doc.modeFrontier = Math.max(cm.doc.modeFrontier, ++cm.doc.highlightFrontier); }
+    }
+    return line.styles
+  }
+
+  function getContextBefore(cm, n, precise) {
+    var doc = cm.doc, display = cm.display;
+    if (!doc.mode.startState) { return new Context(doc, true, n) }
+    var start = findStartLine(cm, n, precise);
+    var saved = start > doc.first && getLine(doc, start - 1).stateAfter;
+    var context = saved ? Context.fromSaved(doc, saved, start) : new Context(doc, startState(doc.mode), start);
+
+    doc.iter(start, n, function (line) {
+      processLine(cm, line.text, context);
+      var pos = context.line;
+      line.stateAfter = pos == n - 1 || pos % 5 == 0 || pos >= display.viewFrom && pos < display.viewTo ? context.save() : null;
+      context.nextLine();
+    });
+    if (precise) { doc.modeFrontier = context.line; }
+    return context
+  }
+
+  // Lightweight form of highlight -- proceed over this line and
+  // update state, but don't save a style array. Used for lines that
+  // aren't currently visible.
+  function processLine(cm, text, context, startAt) {
+    var mode = cm.doc.mode;
+    var stream = new StringStream(text, cm.options.tabSize, context);
+    stream.start = stream.pos = startAt || 0;
+    if (text == "") { callBlankLine(mode, context.state); }
+    while (!stream.eol()) {
+      readToken(mode, stream, context.state);
+      stream.start = stream.pos;
+    }
+  }
+
+  function callBlankLine(mode, state) {
+    if (mode.blankLine) { return mode.blankLine(state) }
+    if (!mode.innerMode) { return }
+    var inner = innerMode(mode, state);
+    if (inner.mode.blankLine) { return inner.mode.blankLine(inner.state) }
+  }
+
+  function readToken(mode, stream, state, inner) {
+    for (var i = 0; i < 10; i++) {
+      if (inner) { inner[0] = innerMode(mode, state).mode; }
+      var style = mode.token(stream, state);
+      if (stream.pos > stream.start) { return style }
+    }
+    throw new Error("Mode " + mode.name + " failed to advance stream.")
+  }
+
+  var Token = function(stream, type, state) {
+    this.start = stream.start; this.end = stream.pos;
+    this.string = stream.current();
+    this.type = type || null;
+    this.state = state;
+  };
+
+  // Utility for getTokenAt and getLineTokens
+  function takeToken(cm, pos, precise, asArray) {
+    var doc = cm.doc, mode = doc.mode, style;
+    pos = clipPos(doc, pos);
+    var line = getLine(doc, pos.line), context = getContextBefore(cm, pos.line, precise);
+    var stream = new StringStream(line.text, cm.options.tabSize, context), tokens;
+    if (asArray) { tokens = []; }
+    while ((asArray || stream.pos < pos.ch) && !stream.eol()) {
+      stream.start = stream.pos;
+      style = readToken(mode, stream, context.state);
+      if (asArray) { tokens.push(new Token(stream, style, copyState(doc.mode, context.state))); }
+    }
+    return asArray ? tokens : new Token(stream, style, context.state)
+  }
+
+  function extractLineClasses(type, output) {
+    if (type) { for (;;) {
+      var lineClass = type.match(/(?:^|\s+)line-(background-)?(\S+)/);
+      if (!lineClass) { break }
+      type = type.slice(0, lineClass.index) + type.slice(lineClass.index + lineClass[0].length);
+      var prop = lineClass[1] ? "bgClass" : "textClass";
+      if (output[prop] == null)
+        { output[prop] = lineClass[2]; }
+      else if (!(new RegExp("(?:^|\\s)" + lineClass[2] + "(?:$|\\s)")).test(output[prop]))
+        { output[prop] += " " + lineClass[2]; }
+    } }
+    return type
+  }
+
+  // Run the given mode's parser over a line, calling f for each token.
+  function runMode(cm, text, mode, context, f, lineClasses, forceToEnd) {
+    var flattenSpans = mode.flattenSpans;
+    if (flattenSpans == null) { flattenSpans = cm.options.flattenSpans; }
+    var curStart = 0, curStyle = null;
+    var stream = new StringStream(text, cm.options.tabSize, context), style;
+    var inner = cm.options.addModeClass && [null];
+    if (text == "") { extractLineClasses(callBlankLine(mode, context.state), lineClasses); }
+    while (!stream.eol()) {
+      if (stream.pos > cm.options.maxHighlightLength) {
+        flattenSpans = false;
+        if (forceToEnd) { processLine(cm, text, context, stream.pos); }
+        stream.pos = text.length;
+        style = null;
+      } else {
+        style = extractLineClasses(readToken(mode, stream, context.state, inner), lineClasses);
+      }
+      if (inner) {
+        var mName = inner[0].name;
+        if (mName) { style = "m-" + (style ? mName + " " + style : mName); }
+      }
+      if (!flattenSpans || curStyle != style) {
+        while (curStart < stream.start) {
+          curStart = Math.min(stream.start, curStart + 5000);
+          f(curStart, curStyle);
+        }
+        curStyle = style;
+      }
+      stream.start = stream.pos;
+    }
+    while (curStart < stream.pos) {
+      // Webkit seems to refuse to render text nodes longer than 57444
+      // characters, and returns inaccurate measurements in nodes
+      // starting around 5000 chars.
+      var pos = Math.min(stream.pos, curStart + 5000);
+      f(pos, curStyle);
+      curStart = pos;
+    }
+  }
+
+  // Finds the line to start with when starting a parse. Tries to
+  // find a line with a stateAfter, so that it can start with a
+  // valid state. If that fails, it returns the line with the
+  // smallest indentation, which tends to need the least context to
+  // parse correctly.
+  function findStartLine(cm, n, precise) {
+    var minindent, minline, doc = cm.doc;
+    var lim = precise ? -1 : n - (cm.doc.mode.innerMode ? 1000 : 100);
+    for (var search = n; search > lim; --search) {
+      if (search <= doc.first) { return doc.first }
+      var line = getLine(doc, search - 1), after = line.stateAfter;
+      if (after && (!precise || search + (after instanceof SavedContext ? after.lookAhead : 0) <= doc.modeFrontier))
+        { return search }
+      var indented = countColumn(line.text, null, cm.options.tabSize);
+      if (minline == null || minindent > indented) {
+        minline = search - 1;
+        minindent = indented;
+      }
+    }
+    return minline
+  }
+
+  function retreatFrontier(doc, n) {
+    doc.modeFrontier = Math.min(doc.modeFrontier, n);
+    if (doc.highlightFrontier < n - 10) { return }
+    var start = doc.first;
+    for (var line = n - 1; line > start; line--) {
+      var saved = getLine(doc, line).stateAfter;
+      // change is on 3
+      // state on line 1 looked ahead 2 -- so saw 3
+      // test 1 + 2 < 3 should cover this
+      if (saved && (!(saved instanceof SavedContext) || line + saved.lookAhead < n)) {
+        start = line + 1;
+        break
+      }
+    }
+    doc.highlightFrontier = Math.min(doc.highlightFrontier, start);
+  }
+
+  // Optimize some code when these features are not used.
+  var sawReadOnlySpans = false, sawCollapsedSpans = false;
+
+  function seeReadOnlySpans() {
+    sawReadOnlySpans = true;
+  }
+
+  function seeCollapsedSpans() {
+    sawCollapsedSpans = true;
+  }
+
+  // TEXTMARKER SPANS
+
+  function MarkedSpan(marker, from, to) {
+    this.marker = marker;
+    this.from = from; this.to = to;
+  }
+
+  // Search an array of spans for a span matching the given marker.
+  function getMarkedSpanFor(spans, marker) {
+    if (spans) { for (var i = 0; i < spans.length; ++i) {
+      var span = spans[i];
+      if (span.marker == marker) { return span }
+    } }
+  }
+  // Remove a span from an array, returning undefined if no spans are
+  // left (we don't store arrays for lines without spans).
+  function removeMarkedSpan(spans, span) {
+    var r;
+    for (var i = 0; i < spans.length; ++i)
+      { if (spans[i] != span) { (r || (r = [])).push(spans[i]); } }
+    return r
+  }
+  // Add a span to a line.
+  function addMarkedSpan(line, span) {
+    line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span];
+    span.marker.attachLine(line);
+  }
+
+  // Used for the algorithm that adjusts markers for a change in the
+  // document. These functions cut an array of spans at a given
+  // character position, returning an array of remaining chunks (or
+  // undefined if nothing remains).
+  function markedSpansBefore(old, startCh, isInsert) {
+    var nw;
+    if (old) { for (var i = 0; i < old.length; ++i) {
+      var span = old[i], marker = span.marker;
+      var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh);
+      if (startsBefore || span.from == startCh && marker.type == "bookmark" && (!isInsert || !span.marker.insertLeft)) {
+        var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh)
+        ;(nw || (nw = [])).push(new MarkedSpan(marker, span.from, endsAfter ? null : span.to));
+      }
+    } }
+    return nw
+  }
+  function markedSpansAfter(old, endCh, isInsert) {
+    var nw;
+    if (old) { for (var i = 0; i < old.length; ++i) {
+      var span = old[i], marker = span.marker;
+      var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh);
+      if (endsAfter || span.from == endCh && marker.type == "bookmark" && (!isInsert || span.marker.insertLeft)) {
+        var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh)
+        ;(nw || (nw = [])).push(new MarkedSpan(marker, startsBefore ? null : span.from - endCh,
+                                              span.to == null ? null : span.to - endCh));
+      }
+    } }
+    return nw
+  }
+
+  // Given a change object, compute the new set of marker spans that
+  // cover the line in which the change took place. Removes spans
+  // entirely within the change, reconnects spans belonging to the
+  // same marker that appear on both sides of the change, and cuts off
+  // spans partially within the change. Returns an array of span
+  // arrays with one element for each line in (after) the change.
+  function stretchSpansOverChange(doc, change) {
+    if (change.full) { return null }
+    var oldFirst = isLine(doc, change.from.line) && getLine(doc, change.from.line).markedSpans;
+    var oldLast = isLine(doc, change.to.line) && getLine(doc, change.to.line).markedSpans;
+    if (!oldFirst && !oldLast) { return null }
+
+    var startCh = change.from.ch, endCh = change.to.ch, isInsert = cmp(change.from, change.to) == 0;
+    // Get the spans that 'stick out' on both sides
+    var first = markedSpansBefore(oldFirst, startCh, isInsert);
+    var last = markedSpansAfter(oldLast, endCh, isInsert);
+
+    // Next, merge those two ends
+    var sameLine = change.text.length == 1, offset = lst(change.text).length + (sameLine ? startCh : 0);
+    if (first) {
+      // Fix up .to properties of first
+      for (var i = 0; i < first.length; ++i) {
+        var span = first[i];
+        if (span.to == null) {
+          var found = getMarkedSpanFor(last, span.marker);
+          if (!found) { span.to = startCh; }
+          else if (sameLine) { span.to = found.to == null ? null : found.to + offset; }
+        }
+      }
+    }
+    if (last) {
+      // Fix up .from in last (or move them into first in case of sameLine)
+      for (var i$1 = 0; i$1 < last.length; ++i$1) {
+        var span$1 = last[i$1];
+        if (span$1.to != null) { span$1.to += offset; }
+        if (span$1.from == null) {
+          var found$1 = getMarkedSpanFor(first, span$1.marker);
+          if (!found$1) {
+            span$1.from = offset;
+            if (sameLine) { (first || (first = [])).push(span$1); }
+          }
+        } else {
+          span$1.from += offset;
+          if (sameLine) { (first || (first = [])).push(span$1); }
+        }
+      }
+    }
+    // Make sure we didn't create any zero-length spans
+    if (first) { first = clearEmptySpans(first); }
+    if (last && last != first) { last = clearEmptySpans(last); }
+
+    var newMarkers = [first];
+    if (!sameLine) {
+      // Fill gap with whole-line-spans
+      var gap = change.text.length - 2, gapMarkers;
+      if (gap > 0 && first)
+        { for (var i$2 = 0; i$2 < first.length; ++i$2)
+          { if (first[i$2].to == null)
+            { (gapMarkers || (gapMarkers = [])).push(new MarkedSpan(first[i$2].marker, null, null)); } } }
+      for (var i$3 = 0; i$3 < gap; ++i$3)
+        { newMarkers.push(gapMarkers); }
+      newMarkers.push(last);
+    }
+    return newMarkers
+  }
+
+  // Remove spans that are empty and don't have a clearWhenEmpty
+  // option of false.
+  function clearEmptySpans(spans) {
+    for (var i = 0; i < spans.length; ++i) {
+      var span = spans[i];
+      if (span.from != null && span.from == span.to && span.marker.clearWhenEmpty !== false)
+        { spans.splice(i--, 1); }
+    }
+    if (!spans.length) { return null }
+    return spans
+  }
+
+  // Used to 'clip' out readOnly ranges when making a change.
+  function removeReadOnlyRanges(doc, from, to) {
+    var markers = null;
+    doc.iter(from.line, to.line + 1, function (line) {
+      if (line.markedSpans) { for (var i = 0; i < line.markedSpans.length; ++i) {
+        var mark = line.markedSpans[i].marker;
+        if (mark.readOnly && (!markers || indexOf(markers, mark) == -1))
+          { (markers || (markers = [])).push(mark); }
+      } }
+    });
+    if (!markers) { return null }
+    var parts = [{from: from, to: to}];
+    for (var i = 0; i < markers.length; ++i) {
+      var mk = markers[i], m = mk.find(0);
+      for (var j = 0; j < parts.length; ++j) {
+        var p = parts[j];
+        if (cmp(p.to, m.from) < 0 || cmp(p.from, m.to) > 0) { continue }
+        var newParts = [j, 1], dfrom = cmp(p.from, m.from), dto = cmp(p.to, m.to);
+        if (dfrom < 0 || !mk.inclusiveLeft && !dfrom)
+          { newParts.push({from: p.from, to: m.from}); }
+        if (dto > 0 || !mk.inclusiveRight && !dto)
+          { newParts.push({from: m.to, to: p.to}); }
+        parts.splice.apply(parts, newParts);
+        j += newParts.length - 3;
+      }
+    }
+    return parts
+  }
+
+  // Connect or disconnect spans from a line.
+  function detachMarkedSpans(line) {
+    var spans = line.markedSpans;
+    if (!spans) { return }
+    for (var i = 0; i < spans.length; ++i)
+      { spans[i].marker.detachLine(line); }
+    line.markedSpans = null;
+  }
+  function attachMarkedSpans(line, spans) {
+    if (!spans) { return }
+    for (var i = 0; i < spans.length; ++i)
+      { spans[i].marker.attachLine(line); }
+    line.markedSpans = spans;
+  }
+
+  // Helpers used when computing which overlapping collapsed span
+  // counts as the larger one.
+  function extraLeft(marker) { return marker.inclusiveLeft ? -1 : 0 }
+  function extraRight(marker) { return marker.inclusiveRight ? 1 : 0 }
+
+  // Returns a number indicating which of two overlapping collapsed
+  // spans is larger (and thus includes the other). Falls back to
+  // comparing ids when the spans cover exactly the same range.
+  function compareCollapsedMarkers(a, b) {
+    var lenDiff = a.lines.length - b.lines.length;
+    if (lenDiff != 0) { return lenDiff }
+    var aPos = a.find(), bPos = b.find();
+    var fromCmp = cmp(aPos.from, bPos.from) || extraLeft(a) - extraLeft(b);
+    if (fromCmp) { return -fromCmp }
+    var toCmp = cmp(aPos.to, bPos.to) || extraRight(a) - extraRight(b);
+    if (toCmp) { return toCmp }
+    return b.id - a.id
+  }
+
+  // Find out whether a line ends or starts in a collapsed span. If
+  // so, return the marker for that span.
+  function collapsedSpanAtSide(line, start) {
+    var sps = sawCollapsedSpans && line.markedSpans, found;
+    if (sps) { for (var sp = (void 0), i = 0; i < sps.length; ++i) {
+      sp = sps[i];
+      if (sp.marker.collapsed && (start ? sp.from : sp.to) == null &&
+          (!found || compareCollapsedMarkers(found, sp.marker) < 0))
+        { found = sp.marker; }
+    } }
+    return found
+  }
+  function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, true) }
+  function collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, false) }
+
+  function collapsedSpanAround(line, ch) {
+    var sps = sawCollapsedSpans && line.markedSpans, found;
+    if (sps) { for (var i = 0; i < sps.length; ++i) {
+      var sp = sps[i];
+      if (sp.marker.collapsed && (sp.from == null || sp.from < ch) && (sp.to == null || sp.to > ch) &&
+          (!found || compareCollapsedMarkers(found, sp.marker) < 0)) { found = sp.marker; }
+    } }
+    return found
+  }
+
+  // Test whether there exists a collapsed span that partially
+  // overlaps (covers the start or end, but not both) of a new span.
+  // Such overlap is not allowed.
+  function conflictingCollapsedRange(doc, lineNo, from, to, marker) {
+    var line = getLine(doc, lineNo);
+    var sps = sawCollapsedSpans && line.markedSpans;
+    if (sps) { for (var i = 0; i < sps.length; ++i) {
+      var sp = sps[i];
+      if (!sp.marker.collapsed) { continue }
+      var found = sp.marker.find(0);
+      var fromCmp = cmp(found.from, from) || extraLeft(sp.marker) - extraLeft(marker);
+      var toCmp = cmp(found.to, to) || extraRight(sp.marker) - extraRight(marker);
+      if (fromCmp >= 0 && toCmp <= 0 || fromCmp <= 0 && toCmp >= 0) { continue }
+      if (fromCmp <= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.to, from) >= 0 : cmp(found.to, from) > 0) ||
+          fromCmp >= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.from, to) <= 0 : cmp(found.from, to) < 0))
+        { return true }
+    } }
+  }
+
+  // A visual line is a line as drawn on the screen. Folding, for
+  // example, can cause multiple logical lines to appear on the same
+  // visual line. This finds the start of the visual line that the
+  // given line is part of (usually that is the line itself).
+  function visualLine(line) {
+    var merged;
+    while (merged = collapsedSpanAtStart(line))
+      { line = merged.find(-1, true).line; }
+    return line
+  }
+
+  function visualLineEnd(line) {
+    var merged;
+    while (merged = collapsedSpanAtEnd(line))
+      { line = merged.find(1, true).line; }
+    return line
+  }
+
+  // Returns an array of logical lines that continue the visual line
+  // started by the argument, or undefined if there are no such lines.
+  function visualLineContinued(line) {
+    var merged, lines;
+    while (merged = collapsedSpanAtEnd(line)) {
+      line = merged.find(1, true).line
+      ;(lines || (lines = [])).push(line);
+    }
+    return lines
+  }
+
+  // Get the line number of the start of the visual line that the
+  // given line number is part of.
+  function visualLineNo(doc, lineN) {
+    var line = getLine(doc, lineN), vis = visualLine(line);
+    if (line == vis) { return lineN }
+    return lineNo(vis)
+  }
+
+  // Get the line number of the start of the next visual line after
+  // the given line.
+  function visualLineEndNo(doc, lineN) {
+    if (lineN > doc.lastLine()) { return lineN }
+    var line = getLine(doc, lineN), merged;
+    if (!lineIsHidden(doc, line)) { return lineN }
+    while (merged = collapsedSpanAtEnd(line))
+      { line = merged.find(1, true).line; }
+    return lineNo(line) + 1
+  }
+
+  // Compute whether a line is hidden. Lines count as hidden when they
+  // are part of a visual line that starts with another line, or when
+  // they are entirely covered by collapsed, non-widget span.
+  function lineIsHidden(doc, line) {
+    var sps = sawCollapsedSpans && line.markedSpans;
+    if (sps) { for (var sp = (void 0), i = 0; i < sps.length; ++i) {
+      sp = sps[i];
+      if (!sp.marker.collapsed) { continue }
+      if (sp.from == null) { return true }
+      if (sp.marker.widgetNode) { continue }
+      if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp))
+        { return true }
+    } }
+  }
+  function lineIsHiddenInner(doc, line, span) {
+    if (span.to == null) {
+      var end = span.marker.find(1, true);
+      return lineIsHiddenInner(doc, end.line, getMarkedSpanFor(end.line.markedSpans, span.marker))
+    }
+    if (span.marker.inclusiveRight && span.to == line.text.length)
+      { return true }
+    for (var sp = (void 0), i = 0; i < line.markedSpans.length; ++i) {
+      sp = line.markedSpans[i];
+      if (sp.marker.collapsed && !sp.marker.widgetNode && sp.from == span.to &&
+          (sp.to == null || sp.to != span.from) &&
+          (sp.marker.inclusiveLeft || span.marker.inclusiveRight) &&
+          lineIsHiddenInner(doc, line, sp)) { return true }
+    }
+  }
+
+  // Find the height above the given line.
+  function heightAtLine(lineObj) {
+    lineObj = visualLine(lineObj);
+
+    var h = 0, chunk = lineObj.parent;
+    for (var i = 0; i < chunk.lines.length; ++i) {
+      var line = chunk.lines[i];
+      if (line == lineObj) { break }
+      else { h += line.height; }
+    }
+    for (var p = chunk.parent; p; chunk = p, p = chunk.parent) {
+      for (var i$1 = 0; i$1 < p.children.length; ++i$1) {
+        var cur = p.children[i$1];
+        if (cur == chunk) { break }
+        else { h += cur.height; }
+      }
+    }
+    return h
+  }
+
+  // Compute the character length of a line, taking into account
+  // collapsed ranges (see markText) that might hide parts, and join
+  // other lines onto it.
+  function lineLength(line) {
+    if (line.height == 0) { return 0 }
+    var len = line.text.length, merged, cur = line;
+    while (merged = collapsedSpanAtStart(cur)) {
+      var found = merged.find(0, true);
+      cur = found.from.line;
+      len += found.from.ch - found.to.ch;
+    }
+    cur = line;
+    while (merged = collapsedSpanAtEnd(cur)) {
+      var found$1 = merged.find(0, true);
+      len -= cur.text.length - found$1.from.ch;
+      cur = found$1.to.line;
+      len += cur.text.length - found$1.to.ch;
+    }
+    return len
+  }
+
+  // Find the longest line in the document.
+  function findMaxLine(cm) {
+    var d = cm.display, doc = cm.doc;
+    d.maxLine = getLine(doc, doc.first);
+    d.maxLineLength = lineLength(d.maxLine);
+    d.maxLineChanged = true;
+    doc.iter(function (line) {
+      var len = lineLength(line);
+      if (len > d.maxLineLength) {
+        d.maxLineLength = len;
+        d.maxLine = line;
+      }
+    });
+  }
+
+  // LINE DATA STRUCTURE
+
+  // Line objects. These hold state related to a line, including
+  // highlighting info (the styles array).
+  var Line = function(text, markedSpans, estimateHeight) {
+    this.text = text;
+    attachMarkedSpans(this, markedSpans);
+    this.height = estimateHeight ? estimateHeight(this) : 1;
+  };
+
+  Line.prototype.lineNo = function () { return lineNo(this) };
+  eventMixin(Line);
+
+  // Change the content (text, markers) of a line. Automatically
+  // invalidates cached information and tries to re-estimate the
+  // line's height.
+  function updateLine(line, text, markedSpans, estimateHeight) {
+    line.text = text;
+    if (line.stateAfter) { line.stateAfter = null; }
+    if (line.styles) { line.styles = null; }
+    if (line.order != null) { line.order = null; }
+    detachMarkedSpans(line);
+    attachMarkedSpans(line, markedSpans);
+    var estHeight = estimateHeight ? estimateHeight(line) : 1;
+    if (estHeight != line.height) { updateLineHeight(line, estHeight); }
+  }
+
+  // Detach a line from the document tree and its markers.
+  function cleanUpLine(line) {
+    line.parent = null;
+    detachMarkedSpans(line);
+  }
+
+  // Convert a style as returned by a mode (either null, or a string
+  // containing one or more styles) to a CSS style. This is cached,
+  // and also looks for line-wide styles.
+  var styleToClassCache = {}, styleToClassCacheWithMode = {};
+  function interpretTokenStyle(style, options) {
+    if (!style || /^\s*$/.test(style)) { return null }
+    var cache = options.addModeClass ? styleToClassCacheWithMode : styleToClassCache;
+    return cache[style] ||
+      (cache[style] = style.replace(/\S+/g, "cm-$&"))
+  }
+
+  // Render the DOM representation of the text of a line. Also builds
+  // up a 'line map', which points at the DOM nodes that represent
+  // specific stretches of text, and is used by the measuring code.
+  // The returned object contains the DOM node, this map, and
+  // information about line-wide styles that were set by the mode.
+  function buildLineContent(cm, lineView) {
+    // The padding-right forces the element to have a 'border', which
+    // is needed on Webkit to be able to get line-level bounding
+    // rectangles for it (in measureChar).
+    var content = eltP("span", null, null, webkit ? "padding-right: .1px" : null);
+    var builder = {pre: eltP("pre", [content], "CodeMirror-line"), content: content,
+                   col: 0, pos: 0, cm: cm,
+                   trailingSpace: false,
+                   splitSpaces: cm.getOption("lineWrapping")};
+    lineView.measure = {};
+
+    // Iterate over the logical lines that make up this visual line.
+    for (var i = 0; i <= (lineView.rest ? lineView.rest.length : 0); i++) {
+      var line = i ? lineView.rest[i - 1] : lineView.line, order = (void 0);
+      builder.pos = 0;
+      builder.addToken = buildToken;
+      // Optionally wire in some hacks into the token-rendering
+      // algorithm, to deal with browser quirks.
+      if (hasBadBidiRects(cm.display.measure) && (order = getOrder(line, cm.doc.direction)))
+        { builder.addToken = buildTokenBadBidi(builder.addToken, order); }
+      builder.map = [];
+      var allowFrontierUpdate = lineView != cm.display.externalMeasured && lineNo(line);
+      insertLineContent(line, builder, getLineStyles(cm, line, allowFrontierUpdate));
+      if (line.styleClasses) {
+        if (line.styleClasses.bgClass)
+          { builder.bgClass = joinClasses(line.styleClasses.bgClass, builder.bgClass || ""); }
+        if (line.styleClasses.textClass)
+          { builder.textClass = joinClasses(line.styleClasses.textClass, builder.textClass || ""); }
+      }
+
+      // Ensure at least a single node is present, for measuring.
+      if (builder.map.length == 0)
+        { builder.map.push(0, 0, builder.content.appendChild(zeroWidthElement(cm.display.measure))); }
+
+      // Store the map and a cache object for the current logical line
+      if (i == 0) {
+        lineView.measure.map = builder.map;
+        lineView.measure.cache = {};
+      } else {
+  (lineView.measure.maps || (lineView.measure.maps = [])).push(builder.map)
+        ;(lineView.measure.caches || (lineView.measure.caches = [])).push({});
+      }
+    }
+
+    // See issue #2901
+    if (webkit) {
+      var last = builder.content.lastChild;
+      if (/\bcm-tab\b/.test(last.className) || (last.querySelector && last.querySelector(".cm-tab")))
+        { builder.content.className = "cm-tab-wrap-hack"; }
+    }
+
+    signal(cm, "renderLine", cm, lineView.line, builder.pre);
+    if (builder.pre.className)
+      { builder.textClass = joinClasses(builder.pre.className, builder.textClass || ""); }
+
+    return builder
+  }
+
+  function defaultSpecialCharPlaceholder(ch) {
+    var token = elt("span", "\u2022", "cm-invalidchar");
+    token.title = "\\u" + ch.charCodeAt(0).toString(16);
+    token.setAttribute("aria-label", token.title);
+    return token
+  }
+
+  // Build up the DOM representation for a single token, and add it to
+  // the line map. Takes care to render special characters separately.
+  function buildToken(builder, text, style, startStyle, endStyle, css, attributes) {
+    if (!text) { return }
+    var displayText = builder.splitSpaces ? splitSpaces(text, builder.trailingSpace) : text;
+    var special = builder.cm.state.specialChars, mustWrap = false;
+    var content;
+    if (!special.test(text)) {
+      builder.col += text.length;
+      content = document.createTextNode(displayText);
+      builder.map.push(builder.pos, builder.pos + text.length, content);
+      if (ie && ie_version < 9) { mustWrap = true; }
+      builder.pos += text.length;
+    } else {
+      content = document.createDocumentFragment();
+      var pos = 0;
+      while (true) {
+        special.lastIndex = pos;
+        var m = special.exec(text);
+        var skipped = m ? m.index - pos : text.length - pos;
+        if (skipped) {
+          var txt = document.createTextNode(displayText.slice(pos, pos + skipped));
+          if (ie && ie_version < 9) { content.appendChild(elt("span", [txt])); }
+          else { content.appendChild(txt); }
+          builder.map.push(builder.pos, builder.pos + skipped, txt);
+          builder.col += skipped;
+          builder.pos += skipped;
+        }
+        if (!m) { break }
+        pos += skipped + 1;
+        var txt$1 = (void 0);
+        if (m[0] == "\t") {
+          var tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize;
+          txt$1 = content.appendChild(elt("span", spaceStr(tabWidth), "cm-tab"));
+          txt$1.setAttribute("role", "presentation");
+          txt$1.setAttribute("cm-text", "\t");
+          builder.col += tabWidth;
+        } else if (m[0] == "\r" || m[0] == "\n") {
+          txt$1 = content.appendChild(elt("span", m[0] == "\r" ? "\u240d" : "\u2424", "cm-invalidchar"));
+          txt$1.setAttribute("cm-text", m[0]);
+          builder.col += 1;
+        } else {
+          txt$1 = builder.cm.options.specialCharPlaceholder(m[0]);
+          txt$1.setAttribute("cm-text", m[0]);
+          if (ie && ie_version < 9) { content.appendChild(elt("span", [txt$1])); }
+          else { content.appendChild(txt$1); }
+          builder.col += 1;
+        }
+        builder.map.push(builder.pos, builder.pos + 1, txt$1);
+        builder.pos++;
+      }
+    }
+    builder.trailingSpace = displayText.charCodeAt(text.length - 1) == 32;
+    if (style || startStyle || endStyle || mustWrap || css || attributes) {
+      var fullStyle = style || "";
+      if (startStyle) { fullStyle += startStyle; }
+      if (endStyle) { fullStyle += endStyle; }
+      var token = elt("span", [content], fullStyle, css);
+      if (attributes) {
+        for (var attr in attributes) { if (attributes.hasOwnProperty(attr) && attr != "style" && attr != "class")
+          { token.setAttribute(attr, attributes[attr]); } }
+      }
+      return builder.content.appendChild(token)
+    }
+    builder.content.appendChild(content);
+  }
+
+  // Change some spaces to NBSP to prevent the browser from collapsing
+  // trailing spaces at the end of a line when rendering text (issue #1362).
+  function splitSpaces(text, trailingBefore) {
+    if (text.length > 1 && !/  /.test(text)) { return text }
+    var spaceBefore = trailingBefore, result = "";
+    for (var i = 0; i < text.length; i++) {
+      var ch = text.charAt(i);
+      if (ch == " " && spaceBefore && (i == text.length - 1 || text.charCodeAt(i + 1) == 32))
+        { ch = "\u00a0"; }
+      result += ch;
+      spaceBefore = ch == " ";
+    }
+    return result
+  }
+
+  // Work around nonsense dimensions being reported for stretches of
+  // right-to-left text.
+  function buildTokenBadBidi(inner, order) {
+    return function (builder, text, style, startStyle, endStyle, css, attributes) {
+      style = style ? style + " cm-force-border" : "cm-force-border";
+      var start = builder.pos, end = start + text.length;
+      for (;;) {
+        // Find the part that overlaps with the start of this text
+        var part = (void 0);
+        for (var i = 0; i < order.length; i++) {
+          part = order[i];
+          if (part.to > start && part.from <= start) { break }
+        }
+        if (part.to >= end) { return inner(builder, text, style, startStyle, endStyle, css, attributes) }
+        inner(builder, text.slice(0, part.to - start), style, startStyle, null, css, attributes);
+        startStyle = null;
+        text = text.slice(part.to - start);
+        start = part.to;
+      }
+    }
+  }
+
+  function buildCollapsedSpan(builder, size, marker, ignoreWidget) {
+    var widget = !ignoreWidget && marker.widgetNode;
+    if (widget) { builder.map.push(builder.pos, builder.pos + size, widget); }
+    if (!ignoreWidget && builder.cm.display.input.needsContentAttribute) {
+      if (!widget)
+        { widget = builder.content.appendChild(document.createElement("span")); }
+      widget.setAttribute("cm-marker", marker.id);
+    }
+    if (widget) {
+      builder.cm.display.input.setUneditable(widget);
+      builder.content.appendChild(widget);
+    }
+    builder.pos += size;
+    builder.trailingSpace = false;
+  }
+
+  // Outputs a number of spans to make up a line, taking highlighting
+  // and marked text into account.
+  function insertLineContent(line, builder, styles) {
+    var spans = line.markedSpans, allText = line.text, at = 0;
+    if (!spans) {
+      for (var i$1 = 1; i$1 < styles.length; i$1+=2)
+        { builder.addToken(builder, allText.slice(at, at = styles[i$1]), interpretTokenStyle(styles[i$1+1], builder.cm.options)); }
+      return
+    }
+
+    var len = allText.length, pos = 0, i = 1, text = "", style, css;
+    var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, collapsed, attributes;
+    for (;;) {
+      if (nextChange == pos) { // Update current marker set
+        spanStyle = spanEndStyle = spanStartStyle = css = "";
+        attributes = null;
+        collapsed = null; nextChange = Infinity;
+        var foundBookmarks = [], endStyles = (void 0);
+        for (var j = 0; j < spans.length; ++j) {
+          var sp = spans[j], m = sp.marker;
+          if (m.type == "bookmark" && sp.from == pos && m.widgetNode) {
+            foundBookmarks.push(m);
+          } else if (sp.from <= pos && (sp.to == null || sp.to > pos || m.collapsed && sp.to == pos && sp.from == pos)) {
+            if (sp.to != null && sp.to != pos && nextChange > sp.to) {
+              nextChange = sp.to;
+              spanEndStyle = "";
+            }
+            if (m.className) { spanStyle += " " + m.className; }
+            if (m.css) { css = (css ? css + ";" : "") + m.css; }
+            if (m.startStyle && sp.from == pos) { spanStartStyle += " " + m.startStyle; }
+            if (m.endStyle && sp.to == nextChange) { (endStyles || (endStyles = [])).push(m.endStyle, sp.to); }
+            // support for the old title property
+            // https://github.com/codemirror/CodeMirror/pull/5673
+            if (m.title) { (attributes || (attributes = {})).title = m.title; }
+            if (m.attributes) {
+              for (var attr in m.attributes)
+                { (attributes || (attributes = {}))[attr] = m.attributes[attr]; }
+            }
+            if (m.collapsed && (!collapsed || compareCollapsedMarkers(collapsed.marker, m) < 0))
+              { collapsed = sp; }
+          } else if (sp.from > pos && nextChange > sp.from) {
+            nextChange = sp.from;
+          }
+        }
+        if (endStyles) { for (var j$1 = 0; j$1 < endStyles.length; j$1 += 2)
+          { if (endStyles[j$1 + 1] == nextChange) { spanEndStyle += " " + endStyles[j$1]; } } }
+
+        if (!collapsed || collapsed.from == pos) { for (var j$2 = 0; j$2 < foundBookmarks.length; ++j$2)
+          { buildCollapsedSpan(builder, 0, foundBookmarks[j$2]); } }
+        if (collapsed && (collapsed.from || 0) == pos) {
+          buildCollapsedSpan(builder, (collapsed.to == null ? len + 1 : collapsed.to) - pos,
+                             collapsed.marker, collapsed.from == null);
+          if (collapsed.to == null) { return }
+          if (collapsed.to == pos) { collapsed = false; }
+        }
+      }
+      if (pos >= len) { break }
+
+      var upto = Math.min(len, nextChange);
+      while (true) {
+        if (text) {
+          var end = pos + text.length;
+          if (!collapsed) {
+            var tokenText = end > upto ? text.slice(0, upto - pos) : text;
+            builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle,
+                             spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : "", css, attributes);
+          }
+          if (end >= upto) {text = text.slice(upto - pos); pos = upto; break}
+          pos = end;
+          spanStartStyle = "";
+        }
+        text = allText.slice(at, at = styles[i++]);
+        style = interpretTokenStyle(styles[i++], builder.cm.options);
+      }
+    }
+  }
+
+
+  // These objects are used to represent the visible (currently drawn)
+  // part of the document. A LineView may correspond to multiple
+  // logical lines, if those are connected by collapsed ranges.
+  function LineView(doc, line, lineN) {
+    // The starting line
+    this.line = line;
+    // Continuing lines, if any
+    this.rest = visualLineContinued(line);
+    // Number of logical lines in this visual line
+    this.size = this.rest ? lineNo(lst(this.rest)) - lineN + 1 : 1;
+    this.node = this.text = null;
+    this.hidden = lineIsHidden(doc, line);
+  }
+
+  // Create a range of LineView objects for the given lines.
+  function buildViewArray(cm, from, to) {
+    var array = [], nextPos;
+    for (var pos = from; pos < to; pos = nextPos) {
+      var view = new LineView(cm.doc, getLine(cm.doc, pos), pos);
+      nextPos = pos + view.size;
+      array.push(view);
+    }
+    return array
+  }
+
+  var operationGroup = null;
+
+  function pushOperation(op) {
+    if (operationGroup) {
+      operationGroup.ops.push(op);
+    } else {
+      op.ownsGroup = operationGroup = {
+        ops: [op],
+        delayedCallbacks: []
+      };
+    }
+  }
+
+  function fireCallbacksForOps(group) {
+    // Calls delayed callbacks and cursorActivity handlers until no
+    // new ones appear
+    var callbacks = group.delayedCallbacks, i = 0;
+    do {
+      for (; i < callbacks.length; i++)
+        { callbacks[i].call(null); }
+      for (var j = 0; j < group.ops.length; j++) {
+        var op = group.ops[j];
+        if (op.cursorActivityHandlers)
+          { while (op.cursorActivityCalled < op.cursorActivityHandlers.length)
+            { op.cursorActivityHandlers[op.cursorActivityCalled++].call(null, op.cm); } }
+      }
+    } while (i < callbacks.length)
+  }
+
+  function finishOperation(op, endCb) {
+    var group = op.ownsGroup;
+    if (!group) { return }
+
+    try { fireCallbacksForOps(group); }
+    finally {
+      operationGroup = null;
+      endCb(group);
+    }
+  }
+
+  var orphanDelayedCallbacks = null;
+
+  // Often, we want to signal events at a point where we are in the
+  // middle of some work, but don't want the handler to start calling
+  // other methods on the editor, which might be in an inconsistent
+  // state or simply not expect any other events to happen.
+  // signalLater looks whether there are any handlers, and schedules
+  // them to be executed when the last operation ends, or, if no
+  // operation is active, when a timeout fires.
+  function signalLater(emitter, type /*, values...*/) {
+    var arr = getHandlers(emitter, type);
+    if (!arr.length) { return }
+    var args = Array.prototype.slice.call(arguments, 2), list;
+    if (operationGroup) {
+      list = operationGroup.delayedCallbacks;
+    } else if (orphanDelayedCallbacks) {
+      list = orphanDelayedCallbacks;
+    } else {
+      list = orphanDelayedCallbacks = [];
+      setTimeout(fireOrphanDelayed, 0);
+    }
+    var loop = function ( i ) {
+      list.push(function () { return arr[i].apply(null, args); });
+    };
+
+    for (var i = 0; i < arr.length; ++i)
+      loop( i );
+  }
+
+  function fireOrphanDelayed() {
+    var delayed = orphanDelayedCallbacks;
+    orphanDelayedCallbacks = null;
+    for (var i = 0; i < delayed.length; ++i) { delayed[i](); }
+  }
+
+  // When an aspect of a line changes, a string is added to
+  // lineView.changes. This updates the relevant part of the line's
+  // DOM structure.
+  function updateLineForChanges(cm, lineView, lineN, dims) {
+    for (var j = 0; j < lineView.changes.length; j++) {
+      var type = lineView.changes[j];
+      if (type == "text") { updateLineText(cm, lineView); }
+      else if (type == "gutter") { updateLineGutter(cm, lineView, lineN, dims); }
+      else if (type == "class") { updateLineClasses(cm, lineView); }
+      else if (type == "widget") { updateLineWidgets(cm, lineView, dims); }
+    }
+    lineView.changes = null;
+  }
+
+  // Lines with gutter elements, widgets or a background class need to
+  // be wrapped, and have the extra elements added to the wrapper div
+  function ensureLineWrapped(lineView) {
+    if (lineView.node == lineView.text) {
+      lineView.node = elt("div", null, null, "position: relative");
+      if (lineView.text.parentNode)
+        { lineView.text.parentNode.replaceChild(lineView.node, lineView.text); }
+      lineView.node.appendChild(lineView.text);
+      if (ie && ie_version < 8) { lineView.node.style.zIndex = 2; }
+    }
+    return lineView.node
+  }
+
+  function updateLineBackground(cm, lineView) {
+    var cls = lineView.bgClass ? lineView.bgClass + " " + (lineView.line.bgClass || "") : lineView.line.bgClass;
+    if (cls) { cls += " CodeMirror-linebackground"; }
+    if (lineView.background) {
+      if (cls) { lineView.background.className = cls; }
+      else { lineView.background.parentNode.removeChild(lineView.background); lineView.background = null; }
+    } else if (cls) {
+      var wrap = ensureLineWrapped(lineView);
+      lineView.background = wrap.insertBefore(elt("div", null, cls), wrap.firstChild);
+      cm.display.input.setUneditable(lineView.background);
+    }
+  }
+
+  // Wrapper around buildLineContent which will reuse the structure
+  // in display.externalMeasured when possible.
+  function getLineContent(cm, lineView) {
+    var ext = cm.display.externalMeasured;
+    if (ext && ext.line == lineView.line) {
+      cm.display.externalMeasured = null;
+      lineView.measure = ext.measure;
+      return ext.built
+    }
+    return buildLineContent(cm, lineView)
+  }
+
+  // Redraw the line's text. Interacts with the background and text
+  // classes because the mode may output tokens that influence these
+  // classes.
+  function updateLineText(cm, lineView) {
+    var cls = lineView.text.className;
+    var built = getLineContent(cm, lineView);
+    if (lineView.text == lineView.node) { lineView.node = built.pre; }
+    lineView.text.parentNode.replaceChild(built.pre, lineView.text);
+    lineView.text = built.pre;
+    if (built.bgClass != lineView.bgClass || built.textClass != lineView.textClass) {
+      lineView.bgClass = built.bgClass;
+      lineView.textClass = built.textClass;
+      updateLineClasses(cm, lineView);
+    } else if (cls) {
+      lineView.text.className = cls;
+    }
+  }
+
+  function updateLineClasses(cm, lineView) {
+    updateLineBackground(cm, lineView);
+    if (lineView.line.wrapClass)
+      { ensureLineWrapped(lineView).className = lineView.line.wrapClass; }
+    else if (lineView.node != lineView.text)
+      { lineView.node.className = ""; }
+    var textClass = lineView.textClass ? lineView.textClass + " " + (lineView.line.textClass || "") : lineView.line.textClass;
+    lineView.text.className = textClass || "";
+  }
+
+  function updateLineGutter(cm, lineView, lineN, dims) {
+    if (lineView.gutter) {
+      lineView.node.removeChild(lineView.gutter);
+      lineView.gutter = null;
+    }
+    if (lineView.gutterBackground) {
+      lineView.node.removeChild(lineView.gutterBackground);
+      lineView.gutterBackground = null;
+    }
+    if (lineView.line.gutterClass) {
+      var wrap = ensureLineWrapped(lineView);
+      lineView.gutterBackground = elt("div", null, "CodeMirror-gutter-background " + lineView.line.gutterClass,
+                                      ("left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px; width: " + (dims.gutterTotalWidth) + "px"));
+      cm.display.input.setUneditable(lineView.gutterBackground);
+      wrap.insertBefore(lineView.gutterBackground, lineView.text);
+    }
+    var markers = lineView.line.gutterMarkers;
+    if (cm.options.lineNumbers || markers) {
+      var wrap$1 = ensureLineWrapped(lineView);
+      var gutterWrap = lineView.gutter = elt("div", null, "CodeMirror-gutter-wrapper", ("left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px"));
+      gutterWrap.setAttribute("aria-hidden", "true");
+      cm.display.input.setUneditable(gutterWrap);
+      wrap$1.insertBefore(gutterWrap, lineView.text);
+      if (lineView.line.gutterClass)
+        { gutterWrap.className += " " + lineView.line.gutterClass; }
+      if (cm.options.lineNumbers && (!markers || !markers["CodeMirror-linenumbers"]))
+        { lineView.lineNumber = gutterWrap.appendChild(
+          elt("div", lineNumberFor(cm.options, lineN),
+              "CodeMirror-linenumber CodeMirror-gutter-elt",
+              ("left: " + (dims.gutterLeft["CodeMirror-linenumbers"]) + "px; width: " + (cm.display.lineNumInnerWidth) + "px"))); }
+      if (markers) { for (var k = 0; k < cm.display.gutterSpecs.length; ++k) {
+        var id = cm.display.gutterSpecs[k].className, found = markers.hasOwnProperty(id) && markers[id];
+        if (found)
+          { gutterWrap.appendChild(elt("div", [found], "CodeMirror-gutter-elt",
+                                     ("left: " + (dims.gutterLeft[id]) + "px; width: " + (dims.gutterWidth[id]) + "px"))); }
+      } }
+    }
+  }
+
+  function updateLineWidgets(cm, lineView, dims) {
+    if (lineView.alignable) { lineView.alignable = null; }
+    var isWidget = classTest("CodeMirror-linewidget");
+    for (var node = lineView.node.firstChild, next = (void 0); node; node = next) {
+      next = node.nextSibling;
+      if (isWidget.test(node.className)) { lineView.node.removeChild(node); }
+    }
+    insertLineWidgets(cm, lineView, dims);
+  }
+
+  // Build a line's DOM representation from scratch
+  function buildLineElement(cm, lineView, lineN, dims) {
+    var built = getLineContent(cm, lineView);
+    lineView.text = lineView.node = built.pre;
+    if (built.bgClass) { lineView.bgClass = built.bgClass; }
+    if (built.textClass) { lineView.textClass = built.textClass; }
+
+    updateLineClasses(cm, lineView);
+    updateLineGutter(cm, lineView, lineN, dims);
+    insertLineWidgets(cm, lineView, dims);
+    return lineView.node
+  }
+
+  // A lineView may contain multiple logical lines (when merged by
+  // collapsed spans). The widgets for all of them need to be drawn.
+  function insertLineWidgets(cm, lineView, dims) {
+    insertLineWidgetsFor(cm, lineView.line, lineView, dims, true);
+    if (lineView.rest) { for (var i = 0; i < lineView.rest.length; i++)
+      { insertLineWidgetsFor(cm, lineView.rest[i], lineView, dims, false); } }
+  }
+
+  function insertLineWidgetsFor(cm, line, lineView, dims, allowAbove) {
+    if (!line.widgets) { return }
+    var wrap = ensureLineWrapped(lineView);
+    for (var i = 0, ws = line.widgets; i < ws.length; ++i) {
+      var widget = ws[i], node = elt("div", [widget.node], "CodeMirror-linewidget" + (widget.className ? " " + widget.className : ""));
+      if (!widget.handleMouseEvents) { node.setAttribute("cm-ignore-events", "true"); }
+      positionLineWidget(widget, node, lineView, dims);
+      cm.display.input.setUneditable(node);
+      if (allowAbove && widget.above)
+        { wrap.insertBefore(node, lineView.gutter || lineView.text); }
+      else
+        { wrap.appendChild(node); }
+      signalLater(widget, "redraw");
+    }
+  }
+
+  function positionLineWidget(widget, node, lineView, dims) {
+    if (widget.noHScroll) {
+  (lineView.alignable || (lineView.alignable = [])).push(node);
+      var width = dims.wrapperWidth;
+      node.style.left = dims.fixedPos + "px";
+      if (!widget.coverGutter) {
+        width -= dims.gutterTotalWidth;
+        node.style.paddingLeft = dims.gutterTotalWidth + "px";
+      }
+      node.style.width = width + "px";
+    }
+    if (widget.coverGutter) {
+      node.style.zIndex = 5;
+      node.style.position = "relative";
+      if (!widget.noHScroll) { node.style.marginLeft = -dims.gutterTotalWidth + "px"; }
+    }
+  }
+
+  function widgetHeight(widget) {
+    if (widget.height != null) { return widget.height }
+    var cm = widget.doc.cm;
+    if (!cm) { return 0 }
+    if (!contains(document.body, widget.node)) {
+      var parentStyle = "position: relative;";
+      if (widget.coverGutter)
+        { parentStyle += "margin-left: -" + cm.display.gutters.offsetWidth + "px;"; }
+      if (widget.noHScroll)
+        { parentStyle += "width: " + cm.display.wrapper.clientWidth + "px;"; }
+      removeChildrenAndAdd(cm.display.measure, elt("div", [widget.node], null, parentStyle));
+    }
+    return widget.height = widget.node.parentNode.offsetHeight
+  }
+
+  // Return true when the given mouse event happened in a widget
+  function eventInWidget(display, e) {
+    for (var n = e_target(e); n != display.wrapper; n = n.parentNode) {
+      if (!n || (n.nodeType == 1 && n.getAttribute("cm-ignore-events") == "true") ||
+          (n.parentNode == display.sizer && n != display.mover))
+        { return true }
+    }
+  }
+
+  // POSITION MEASUREMENT
+
+  function paddingTop(display) {return display.lineSpace.offsetTop}
+  function paddingVert(display) {return display.mover.offsetHeight - display.lineSpace.offsetHeight}
+  function paddingH(display) {
+    if (display.cachedPaddingH) { return display.cachedPaddingH }
+    var e = removeChildrenAndAdd(display.measure, elt("pre", "x", "CodeMirror-line-like"));
+    var style = window.getComputedStyle ? window.getComputedStyle(e) : e.currentStyle;
+    var data = {left: parseInt(style.paddingLeft), right: parseInt(style.paddingRight)};
+    if (!isNaN(data.left) && !isNaN(data.right)) { display.cachedPaddingH = data; }
+    return data
+  }
+
+  function scrollGap(cm) { return scrollerGap - cm.display.nativeBarWidth }
+  function displayWidth(cm) {
+    return cm.display.scroller.clientWidth - scrollGap(cm) - cm.display.barWidth
+  }
+  function displayHeight(cm) {
+    return cm.display.scroller.clientHeight - scrollGap(cm) - cm.display.barHeight
+  }
+
+  // Ensure the lineView.wrapping.heights array is populated. This is
+  // an array of bottom offsets for the lines that make up a drawn
+  // line. When lineWrapping is on, there might be more than one
+  // height.
+  function ensureLineHeights(cm, lineView, rect) {
+    var wrapping = cm.options.lineWrapping;
+    var curWidth = wrapping && displayWidth(cm);
+    if (!lineView.measure.heights || wrapping && lineView.measure.width != curWidth) {
+      var heights = lineView.measure.heights = [];
+      if (wrapping) {
+        lineView.measure.width = curWidth;
+        var rects = lineView.text.firstChild.getClientRects();
+        for (var i = 0; i < rects.length - 1; i++) {
+          var cur = rects[i], next = rects[i + 1];
+          if (Math.abs(cur.bottom - next.bottom) > 2)
+            { heights.push((cur.bottom + next.top) / 2 - rect.top); }
+        }
+      }
+      heights.push(rect.bottom - rect.top);
+    }
+  }
+
+  // Find a line map (mapping character offsets to text nodes) and a
+  // measurement cache for the given line number. (A line view might
+  // contain multiple lines when collapsed ranges are present.)
+  function mapFromLineView(lineView, line, lineN) {
+    if (lineView.line == line)
+      { return {map: lineView.measure.map, cache: lineView.measure.cache} }
+    for (var i = 0; i < lineView.rest.length; i++)
+      { if (lineView.rest[i] == line)
+        { return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i]} } }
+    for (var i$1 = 0; i$1 < lineView.rest.length; i$1++)
+      { if (lineNo(lineView.rest[i$1]) > lineN)
+        { return {map: lineView.measure.maps[i$1], cache: lineView.measure.caches[i$1], before: true} } }
+  }
+
+  // Render a line into the hidden node display.externalMeasured. Used
+  // when measurement is needed for a line that's not in the viewport.
+  function updateExternalMeasurement(cm, line) {
+    line = visualLine(line);
+    var lineN = lineNo(line);
+    var view = cm.display.externalMeasured = new LineView(cm.doc, line, lineN);
+    view.lineN = lineN;
+    var built = view.built = buildLineContent(cm, view);
+    view.text = built.pre;
+    removeChildrenAndAdd(cm.display.lineMeasure, built.pre);
+    return view
+  }
+
+  // Get a {top, bottom, left, right} box (in line-local coordinates)
+  // for a given character.
+  function measureChar(cm, line, ch, bias) {
+    return measureCharPrepared(cm, prepareMeasureForLine(cm, line), ch, bias)
+  }
+
+  // Find a line view that corresponds to the given line number.
+  function findViewForLine(cm, lineN) {
+    if (lineN >= cm.display.viewFrom && lineN < cm.display.viewTo)
+      { return cm.display.view[findViewIndex(cm, lineN)] }
+    var ext = cm.display.externalMeasured;
+    if (ext && lineN >= ext.lineN && lineN < ext.lineN + ext.size)
+      { return ext }
+  }
+
+  // Measurement can be split in two steps, the set-up work that
+  // applies to the whole line, and the measurement of the actual
+  // character. Functions like coordsChar, that need to do a lot of
+  // measurements in a row, can thus ensure that the set-up work is
+  // only done once.
+  function prepareMeasureForLine(cm, line) {
+    var lineN = lineNo(line);
+    var view = findViewForLine(cm, lineN);
+    if (view && !view.text) {
+      view = null;
+    } else if (view && view.changes) {
+      updateLineForChanges(cm, view, lineN, getDimensions(cm));
+      cm.curOp.forceUpdate = true;
+    }
+    if (!view)
+      { view = updateExternalMeasurement(cm, line); }
+
+    var info = mapFromLineView(view, line, lineN);
+    return {
+      line: line, view: view, rect: null,
+      map: info.map, cache: info.cache, before: info.before,
+      hasHeights: false
+    }
+  }
+
+  // Given a prepared measurement object, measures the position of an
+  // actual character (or fetches it from the cache).
+  function measureCharPrepared(cm, prepared, ch, bias, varHeight) {
+    if (prepared.before) { ch = -1; }
+    var key = ch + (bias || ""), found;
+    if (prepared.cache.hasOwnProperty(key)) {
+      found = prepared.cache[key];
+    } else {
+      if (!prepared.rect)
+        { prepared.rect = prepared.view.text.getBoundingClientRect(); }
+      if (!prepared.hasHeights) {
+        ensureLineHeights(cm, prepared.view, prepared.rect);
+        prepared.hasHeights = true;
+      }
+      found = measureCharInner(cm, prepared, ch, bias);
+      if (!found.bogus) { prepared.cache[key] = found; }
+    }
+    return {left: found.left, right: found.right,
+            top: varHeight ? found.rtop : found.top,
+            bottom: varHeight ? found.rbottom : found.bottom}
+  }
+
+  var nullRect = {left: 0, right: 0, top: 0, bottom: 0};
+
+  function nodeAndOffsetInLineMap(map, ch, bias) {
+    var node, start, end, collapse, mStart, mEnd;
+    // First, search the line map for the text node corresponding to,
+    // or closest to, the target character.
+    for (var i = 0; i < map.length; i += 3) {
+      mStart = map[i];
+      mEnd = map[i + 1];
+      if (ch < mStart) {
+        start = 0; end = 1;
+        collapse = "left";
+      } else if (ch < mEnd) {
+        start = ch - mStart;
+        end = start + 1;
+      } else if (i == map.length - 3 || ch == mEnd && map[i + 3] > ch) {
+        end = mEnd - mStart;
+        start = end - 1;
+        if (ch >= mEnd) { collapse = "right"; }
+      }
+      if (start != null) {
+        node = map[i + 2];
+        if (mStart == mEnd && bias == (node.insertLeft ? "left" : "right"))
+          { collapse = bias; }
+        if (bias == "left" && start == 0)
+          { while (i && map[i - 2] == map[i - 3] && map[i - 1].insertLeft) {
+            node = map[(i -= 3) + 2];
+            collapse = "left";
+          } }
+        if (bias == "right" && start == mEnd - mStart)
+          { while (i < map.length - 3 && map[i + 3] == map[i + 4] && !map[i + 5].insertLeft) {
+            node = map[(i += 3) + 2];
+            collapse = "right";
+          } }
+        break
+      }
+    }
+    return {node: node, start: start, end: end, collapse: collapse, coverStart: mStart, coverEnd: mEnd}
+  }
+
+  function getUsefulRect(rects, bias) {
+    var rect = nullRect;
+    if (bias == "left") { for (var i = 0; i < rects.length; i++) {
+      if ((rect = rects[i]).left != rect.right) { break }
+    } } else { for (var i$1 = rects.length - 1; i$1 >= 0; i$1--) {
+      if ((rect = rects[i$1]).left != rect.right) { break }
+    } }
+    return rect
+  }
+
+  function measureCharInner(cm, prepared, ch, bias) {
+    var place = nodeAndOffsetInLineMap(prepared.map, ch, bias);
+    var node = place.node, start = place.start, end = place.end, collapse = place.collapse;
+
+    var rect;
+    if (node.nodeType == 3) { // If it is a text node, use a range to retrieve the coordinates.
+      for (var i$1 = 0; i$1 < 4; i$1++) { // Retry a maximum of 4 times when nonsense rectangles are returned
+        while (start && isExtendingChar(prepared.line.text.charAt(place.coverStart + start))) { --start; }
+        while (place.coverStart + end < place.coverEnd && isExtendingChar(prepared.line.text.charAt(place.coverStart + end))) { ++end; }
+        if (ie && ie_version < 9 && start == 0 && end == place.coverEnd - place.coverStart)
+          { rect = node.parentNode.getBoundingClientRect(); }
+        else
+          { rect = getUsefulRect(range(node, start, end).getClientRects(), bias); }
+        if (rect.left || rect.right || start == 0) { break }
+        end = start;
+        start = start - 1;
+        collapse = "right";
+      }
+      if (ie && ie_version < 11) { rect = maybeUpdateRectForZooming(cm.display.measure, rect); }
+    } else { // If it is a widget, simply get the box for the whole widget.
+      if (start > 0) { collapse = bias = "right"; }
+      var rects;
+      if (cm.options.lineWrapping && (rects = node.getClientRects()).length > 1)
+        { rect = rects[bias == "right" ? rects.length - 1 : 0]; }
+      else
+        { rect = node.getBoundingClientRect(); }
+    }
+    if (ie && ie_version < 9 && !start && (!rect || !rect.left && !rect.right)) {
+      var rSpan = node.parentNode.getClientRects()[0];
+      if (rSpan)
+        { rect = {left: rSpan.left, right: rSpan.left + charWidth(cm.display), top: rSpan.top, bottom: rSpan.bottom}; }
+      else
+        { rect = nullRect; }
+    }
+
+    var rtop = rect.top - prepared.rect.top, rbot = rect.bottom - prepared.rect.top;
+    var mid = (rtop + rbot) / 2;
+    var heights = prepared.view.measure.heights;
+    var i = 0;
+    for (; i < heights.length - 1; i++)
+      { if (mid < heights[i]) { break } }
+    var top = i ? heights[i - 1] : 0, bot = heights[i];
+    var result = {left: (collapse == "right" ? rect.right : rect.left) - prepared.rect.left,
+                  right: (collapse == "left" ? rect.left : rect.right) - prepared.rect.left,
+                  top: top, bottom: bot};
+    if (!rect.left && !rect.right) { result.bogus = true; }
+    if (!cm.options.singleCursorHeightPerLine) { result.rtop = rtop; result.rbottom = rbot; }
+
+    return result
+  }
+
+  // Work around problem with bounding client rects on ranges being
+  // returned incorrectly when zoomed on IE10 and below.
+  function maybeUpdateRectForZooming(measure, rect) {
+    if (!window.screen || screen.logicalXDPI == null ||
+        screen.logicalXDPI == screen.deviceXDPI || !hasBadZoomedRects(measure))
+      { return rect }
+    var scaleX = screen.logicalXDPI / screen.deviceXDPI;
+    var scaleY = screen.logicalYDPI / screen.deviceYDPI;
+    return {left: rect.left * scaleX, right: rect.right * scaleX,
+            top: rect.top * scaleY, bottom: rect.bottom * scaleY}
+  }
+
+  function clearLineMeasurementCacheFor(lineView) {
+    if (lineView.measure) {
+      lineView.measure.cache = {};
+      lineView.measure.heights = null;
+      if (lineView.rest) { for (var i = 0; i < lineView.rest.length; i++)
+        { lineView.measure.caches[i] = {}; } }
+    }
+  }
+
+  function clearLineMeasurementCache(cm) {
+    cm.display.externalMeasure = null;
+    removeChildren(cm.display.lineMeasure);
+    for (var i = 0; i < cm.display.view.length; i++)
+      { clearLineMeasurementCacheFor(cm.display.view[i]); }
+  }
+
+  function clearCaches(cm) {
+    clearLineMeasurementCache(cm);
+    cm.display.cachedCharWidth = cm.display.cachedTextHeight = cm.display.cachedPaddingH = null;
+    if (!cm.options.lineWrapping) { cm.display.maxLineChanged = true; }
+    cm.display.lineNumChars = null;
+  }
+
+  function pageScrollX() {
+    // Work around https://bugs.chromium.org/p/chromium/issues/detail?id=489206
+    // which causes page_Offset and bounding client rects to use
+    // different reference viewports and invalidate our calculations.
+    if (chrome && android) { return -(document.body.getBoundingClientRect().left - parseInt(getComputedStyle(document.body).marginLeft)) }
+    return window.pageXOffset || (document.documentElement || document.body).scrollLeft
+  }
+  function pageScrollY() {
+    if (chrome && android) { return -(document.body.getBoundingClientRect().top - parseInt(getComputedStyle(document.body).marginTop)) }
+    return window.pageYOffset || (document.documentElement || document.body).scrollTop
+  }
+
+  function widgetTopHeight(lineObj) {
+    var height = 0;
+    if (lineObj.widgets) { for (var i = 0; i < lineObj.widgets.length; ++i) { if (lineObj.widgets[i].above)
+      { height += widgetHeight(lineObj.widgets[i]); } } }
+    return height
+  }
+
+  // Converts a {top, bottom, left, right} box from line-local
+  // coordinates into another coordinate system. Context may be one of
+  // "line", "div" (display.lineDiv), "local"./null (editor), "window",
+  // or "page".
+  function intoCoordSystem(cm, lineObj, rect, context, includeWidgets) {
+    if (!includeWidgets) {
+      var height = widgetTopHeight(lineObj);
+      rect.top += height; rect.bottom += height;
+    }
+    if (context == "line") { return rect }
+    if (!context) { context = "local"; }
+    var yOff = heightAtLine(lineObj);
+    if (context == "local") { yOff += paddingTop(cm.display); }
+    else { yOff -= cm.display.viewOffset; }
+    if (context == "page" || context == "window") {
+      var lOff = cm.display.lineSpace.getBoundingClientRect();
+      yOff += lOff.top + (context == "window" ? 0 : pageScrollY());
+      var xOff = lOff.left + (context == "window" ? 0 : pageScrollX());
+      rect.left += xOff; rect.right += xOff;
+    }
+    rect.top += yOff; rect.bottom += yOff;
+    return rect
+  }
+
+  // Coverts a box from "div" coords to another coordinate system.
+  // Context may be "window", "page", "div", or "local"./null.
+  function fromCoordSystem(cm, coords, context) {
+    if (context == "div") { return coords }
+    var left = coords.left, top = coords.top;
+    // First move into "page" coordinate system
+    if (context == "page") {
+      left -= pageScrollX();
+      top -= pageScrollY();
+    } else if (context == "local" || !context) {
+      var localBox = cm.display.sizer.getBoundingClientRect();
+      left += localBox.left;
+      top += localBox.top;
+    }
+
+    var lineSpaceBox = cm.display.lineSpace.getBoundingClientRect();
+    return {left: left - lineSpaceBox.left, top: top - lineSpaceBox.top}
+  }
+
+  function charCoords(cm, pos, context, lineObj, bias) {
+    if (!lineObj) { lineObj = getLine(cm.doc, pos.line); }
+    return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, bias), context)
+  }
+
+  // Returns a box for a given cursor position, which may have an
+  // 'other' property containing the position of the secondary cursor
+  // on a bidi boundary.
+  // A cursor Pos(line, char, "before") is on the same visual line as `char - 1`
+  // and after `char - 1` in writing order of `char - 1`
+  // A cursor Pos(line, char, "after") is on the same visual line as `char`
+  // and before `char` in writing order of `char`
+  // Examples (upper-case letters are RTL, lower-case are LTR):
+  //     Pos(0, 1, ...)
+  //     before   after
+  // ab     a|b     a|b
+  // aB     a|B     aB|
+  // Ab     |Ab     A|b
+  // AB     B|A     B|A
+  // Every position after the last character on a line is considered to stick
+  // to the last character on the line.
+  function cursorCoords(cm, pos, context, lineObj, preparedMeasure, varHeight) {
+    lineObj = lineObj || getLine(cm.doc, pos.line);
+    if (!preparedMeasure) { preparedMeasure = prepareMeasureForLine(cm, lineObj); }
+    function get(ch, right) {
+      var m = measureCharPrepared(cm, preparedMeasure, ch, right ? "right" : "left", varHeight);
+      if (right) { m.left = m.right; } else { m.right = m.left; }
+      return intoCoordSystem(cm, lineObj, m, context)
+    }
+    var order = getOrder(lineObj, cm.doc.direction), ch = pos.ch, sticky = pos.sticky;
+    if (ch >= lineObj.text.length) {
+      ch = lineObj.text.length;
+      sticky = "before";
+    } else if (ch <= 0) {
+      ch = 0;
+      sticky = "after";
+    }
+    if (!order) { return get(sticky == "before" ? ch - 1 : ch, sticky == "before") }
+
+    function getBidi(ch, partPos, invert) {
+      var part = order[partPos], right = part.level == 1;
+      return get(invert ? ch - 1 : ch, right != invert)
+    }
+    var partPos = getBidiPartAt(order, ch, sticky);
+    var other = bidiOther;
+    var val = getBidi(ch, partPos, sticky == "before");
+    if (other != null) { val.other = getBidi(ch, other, sticky != "before"); }
+    return val
+  }
+
+  // Used to cheaply estimate the coordinates for a position. Used for
+  // intermediate scroll updates.
+  function estimateCoords(cm, pos) {
+    var left = 0;
+    pos = clipPos(cm.doc, pos);
+    if (!cm.options.lineWrapping) { left = charWidth(cm.display) * pos.ch; }
+    var lineObj = getLine(cm.doc, pos.line);
+    var top = heightAtLine(lineObj) + paddingTop(cm.display);
+    return {left: left, right: left, top: top, bottom: top + lineObj.height}
+  }
+
+  // Positions returned by coordsChar contain some extra information.
+  // xRel is the relative x position of the input coordinates compared
+  // to the found position (so xRel > 0 means the coordinates are to
+  // the right of the character position, for example). When outside
+  // is true, that means the coordinates lie outside the line's
+  // vertical range.
+  function PosWithInfo(line, ch, sticky, outside, xRel) {
+    var pos = Pos(line, ch, sticky);
+    pos.xRel = xRel;
+    if (outside) { pos.outside = outside; }
+    return pos
+  }
+
+  // Compute the character position closest to the given coordinates.
+  // Input must be lineSpace-local ("div" coordinate system).
+  function coordsChar(cm, x, y) {
+    var doc = cm.doc;
+    y += cm.display.viewOffset;
+    if (y < 0) { return PosWithInfo(doc.first, 0, null, -1, -1) }
+    var lineN = lineAtHeight(doc, y), last = doc.first + doc.size - 1;
+    if (lineN > last)
+      { return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, null, 1, 1) }
+    if (x < 0) { x = 0; }
+
+    var lineObj = getLine(doc, lineN);
+    for (;;) {
+      var found = coordsCharInner(cm, lineObj, lineN, x, y);
+      var collapsed = collapsedSpanAround(lineObj, found.ch + (found.xRel > 0 || found.outside > 0 ? 1 : 0));
+      if (!collapsed) { return found }
+      var rangeEnd = collapsed.find(1);
+      if (rangeEnd.line == lineN) { return rangeEnd }
+      lineObj = getLine(doc, lineN = rangeEnd.line);
+    }
+  }
+
+  function wrappedLineExtent(cm, lineObj, preparedMeasure, y) {
+    y -= widgetTopHeight(lineObj);
+    var end = lineObj.text.length;
+    var begin = findFirst(function (ch) { return measureCharPrepared(cm, preparedMeasure, ch - 1).bottom <= y; }, end, 0);
+    end = findFirst(function (ch) { return measureCharPrepared(cm, preparedMeasure, ch).top > y; }, begin, end);
+    return {begin: begin, end: end}
+  }
+
+  function wrappedLineExtentChar(cm, lineObj, preparedMeasure, target) {
+    if (!preparedMeasure) { preparedMeasure = prepareMeasureForLine(cm, lineObj); }
+    var targetTop = intoCoordSystem(cm, lineObj, measureCharPrepared(cm, preparedMeasure, target), "line").top;
+    return wrappedLineExtent(cm, lineObj, preparedMeasure, targetTop)
+  }
+
+  // Returns true if the given side of a box is after the given
+  // coordinates, in top-to-bottom, left-to-right order.
+  function boxIsAfter(box, x, y, left) {
+    return box.bottom <= y ? false : box.top > y ? true : (left ? box.left : box.right) > x
+  }
+
+  function coordsCharInner(cm, lineObj, lineNo, x, y) {
+    // Move y into line-local coordinate space
+    y -= heightAtLine(lineObj);
+    var preparedMeasure = prepareMeasureForLine(cm, lineObj);
+    // When directly calling `measureCharPrepared`, we have to adjust
+    // for the widgets at this line.
+    var widgetHeight = widgetTopHeight(lineObj);
+    var begin = 0, end = lineObj.text.length, ltr = true;
+
+    var order = getOrder(lineObj, cm.doc.direction);
+    // If the line isn't plain left-to-right text, first figure out
+    // which bidi section the coordinates fall into.
+    if (order) {
+      var part = (cm.options.lineWrapping ? coordsBidiPartWrapped : coordsBidiPart)
+                   (cm, lineObj, lineNo, preparedMeasure, order, x, y);
+      ltr = part.level != 1;
+      // The awkward -1 offsets are needed because findFirst (called
+      // on these below) will treat its first bound as inclusive,
+      // second as exclusive, but we want to actually address the
+      // characters in the part's range
+      begin = ltr ? part.from : part.to - 1;
+      end = ltr ? part.to : part.from - 1;
+    }
+
+    // A binary search to find the first character whose bounding box
+    // starts after the coordinates. If we run across any whose box wrap
+    // the coordinates, store that.
+    var chAround = null, boxAround = null;
+    var ch = findFirst(function (ch) {
+      var box = measureCharPrepared(cm, preparedMeasure, ch);
+      box.top += widgetHeight; box.bottom += widgetHeight;
+      if (!boxIsAfter(box, x, y, false)) { return false }
+      if (box.top <= y && box.left <= x) {
+        chAround = ch;
+        boxAround = box;
+      }
+      return true
+    }, begin, end);
+
+    var baseX, sticky, outside = false;
+    // If a box around the coordinates was found, use that
+    if (boxAround) {
+      // Distinguish coordinates nearer to the left or right side of the box
+      var atLeft = x - boxAround.left < boxAround.right - x, atStart = atLeft == ltr;
+      ch = chAround + (atStart ? 0 : 1);
+      sticky = atStart ? "after" : "before";
+      baseX = atLeft ? boxAround.left : boxAround.right;
+    } else {
+      // (Adjust for extended bound, if necessary.)
+      if (!ltr && (ch == end || ch == begin)) { ch++; }
+      // To determine which side to associate with, get the box to the
+      // left of the character and compare it's vertical position to the
+      // coordinates
+      sticky = ch == 0 ? "after" : ch == lineObj.text.length ? "before" :
+        (measureCharPrepared(cm, preparedMeasure, ch - (ltr ? 1 : 0)).bottom + widgetHeight <= y) == ltr ?
+        "after" : "before";
+      // Now get accurate coordinates for this place, in order to get a
+      // base X position
+      var coords = cursorCoords(cm, Pos(lineNo, ch, sticky), "line", lineObj, preparedMeasure);
+      baseX = coords.left;
+      outside = y < coords.top ? -1 : y >= coords.bottom ? 1 : 0;
+    }
+
+    ch = skipExtendingChars(lineObj.text, ch, 1);
+    return PosWithInfo(lineNo, ch, sticky, outside, x - baseX)
+  }
+
+  function coordsBidiPart(cm, lineObj, lineNo, preparedMeasure, order, x, y) {
+    // Bidi parts are sorted left-to-right, and in a non-line-wrapping
+    // situation, we can take this ordering to correspond to the visual
+    // ordering. This finds the first part whose end is after the given
+    // coordinates.
+    var index = findFirst(function (i) {
+      var part = order[i], ltr = part.level != 1;
+      return boxIsAfter(cursorCoords(cm, Pos(lineNo, ltr ? part.to : part.from, ltr ? "before" : "after"),
+                                     "line", lineObj, preparedMeasure), x, y, true)
+    }, 0, order.length - 1);
+    var part = order[index];
+    // If this isn't the first part, the part's start is also after
+    // the coordinates, and the coordinates aren't on the same line as
+    // that start, move one part back.
+    if (index > 0) {
+      var ltr = part.level != 1;
+      var start = cursorCoords(cm, Pos(lineNo, ltr ? part.from : part.to, ltr ? "after" : "before"),
+                               "line", lineObj, preparedMeasure);
+      if (boxIsAfter(start, x, y, true) && start.top > y)
+        { part = order[index - 1]; }
+    }
+    return part
+  }
+
+  function coordsBidiPartWrapped(cm, lineObj, _lineNo, preparedMeasure, order, x, y) {
+    // In a wrapped line, rtl text on wrapping boundaries can do things
+    // that don't correspond to the ordering in our `order` array at
+    // all, so a binary search doesn't work, and we want to return a
+    // part that only spans one line so that the binary search in
+    // coordsCharInner is safe. As such, we first find the extent of the
+    // wrapped line, and then do a flat search in which we discard any
+    // spans that aren't on the line.
+    var ref = wrappedLineExtent(cm, lineObj, preparedMeasure, y);
+    var begin = ref.begin;
+    var end = ref.end;
+    if (/\s/.test(lineObj.text.charAt(end - 1))) { end--; }
+    var part = null, closestDist = null;
+    for (var i = 0; i < order.length; i++) {
+      var p = order[i];
+      if (p.from >= end || p.to <= begin) { continue }
+      var ltr = p.level != 1;
+      var endX = measureCharPrepared(cm, preparedMeasure, ltr ? Math.min(end, p.to) - 1 : Math.max(begin, p.from)).right;
+      // Weigh against spans ending before this, so that they are only
+      // picked if nothing ends after
+      var dist = endX < x ? x - endX + 1e9 : endX - x;
+      if (!part || closestDist > dist) {
+        part = p;
+        closestDist = dist;
+      }
+    }
+    if (!part) { part = order[order.length - 1]; }
+    // Clip the part to the wrapped line.
+    if (part.from < begin) { part = {from: begin, to: part.to, level: part.level}; }
+    if (part.to > end) { part = {from: part.from, to: end, level: part.level}; }
+    return part
+  }
+
+  var measureText;
+  // Compute the default text height.
+  function textHeight(display) {
+    if (display.cachedTextHeight != null) { return display.cachedTextHeight }
+    if (measureText == null) {
+      measureText = elt("pre", null, "CodeMirror-line-like");
+      // Measure a bunch of lines, for browsers that compute
+      // fractional heights.
+      for (var i = 0; i < 49; ++i) {
+        measureText.appendChild(document.createTextNode("x"));
+        measureText.appendChild(elt("br"));
+      }
+      measureText.appendChild(document.createTextNode("x"));
+    }
+    removeChildrenAndAdd(display.measure, measureText);
+    var height = measureText.offsetHeight / 50;
+    if (height > 3) { display.cachedTextHeight = height; }
+    removeChildren(display.measure);
+    return height || 1
+  }
+
+  // Compute the default character width.
+  function charWidth(display) {
+    if (display.cachedCharWidth != null) { return display.cachedCharWidth }
+    var anchor = elt("span", "xxxxxxxxxx");
+    var pre = elt("pre", [anchor], "CodeMirror-line-like");
+    removeChildrenAndAdd(display.measure, pre);
+    var rect = anchor.getBoundingClientRect(), width = (rect.right - rect.left) / 10;
+    if (width > 2) { display.cachedCharWidth = width; }
+    return width || 10
+  }
+
+  // Do a bulk-read of the DOM positions and sizes needed to draw the
+  // view, so that we don't interleave reading and writing to the DOM.
+  function getDimensions(cm) {
+    var d = cm.display, left = {}, width = {};
+    var gutterLeft = d.gutters.clientLeft;
+    for (var n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) {
+      var id = cm.display.gutterSpecs[i].className;
+      left[id] = n.offsetLeft + n.clientLeft + gutterLeft;
+      width[id] = n.clientWidth;
+    }
+    return {fixedPos: compensateForHScroll(d),
+            gutterTotalWidth: d.gutters.offsetWidth,
+            gutterLeft: left,
+            gutterWidth: width,
+            wrapperWidth: d.wrapper.clientWidth}
+  }
+
+  // Computes display.scroller.scrollLeft + display.gutters.offsetWidth,
+  // but using getBoundingClientRect to get a sub-pixel-accurate
+  // result.
+  function compensateForHScroll(display) {
+    return display.scroller.getBoundingClientRect().left - display.sizer.getBoundingClientRect().left
+  }
+
+  // Returns a function that estimates the height of a line, to use as
+  // first approximation until the line becomes visible (and is thus
+  // properly measurable).
+  function estimateHeight(cm) {
+    var th = textHeight(cm.display), wrapping = cm.options.lineWrapping;
+    var perLine = wrapping && Math.max(5, cm.display.scroller.clientWidth / charWidth(cm.display) - 3);
+    return function (line) {
+      if (lineIsHidden(cm.doc, line)) { return 0 }
+
+      var widgetsHeight = 0;
+      if (line.widgets) { for (var i = 0; i < line.widgets.length; i++) {
+        if (line.widgets[i].height) { widgetsHeight += line.widgets[i].height; }
+      } }
+
+      if (wrapping)
+        { return widgetsHeight + (Math.ceil(line.text.length / perLine) || 1) * th }
+      else
+        { return widgetsHeight + th }
+    }
+  }
+
+  function estimateLineHeights(cm) {
+    var doc = cm.doc, est = estimateHeight(cm);
+    doc.iter(function (line) {
+      var estHeight = est(line);
+      if (estHeight != line.height) { updateLineHeight(line, estHeight); }
+    });
+  }
+
+  // Given a mouse event, find the corresponding position. If liberal
+  // is false, it checks whether a gutter or scrollbar was clicked,
+  // and returns null if it was. forRect is used by rectangular
+  // selections, and tries to estimate a character position even for
+  // coordinates beyond the right of the text.
+  function posFromMouse(cm, e, liberal, forRect) {
+    var display = cm.display;
+    if (!liberal && e_target(e).getAttribute("cm-not-content") == "true") { return null }
+
+    var x, y, space = display.lineSpace.getBoundingClientRect();
+    // Fails unpredictably on IE[67] when mouse is dragged around quickly.
+    try { x = e.clientX - space.left; y = e.clientY - space.top; }
+    catch (e$1) { return null }
+    var coords = coordsChar(cm, x, y), line;
+    if (forRect && coords.xRel > 0 && (line = getLine(cm.doc, coords.line).text).length == coords.ch) {
+      var colDiff = countColumn(line, line.length, cm.options.tabSize) - line.length;
+      coords = Pos(coords.line, Math.max(0, Math.round((x - paddingH(cm.display).left) / charWidth(cm.display)) - colDiff));
+    }
+    return coords
+  }
+
+  // Find the view element corresponding to a given line. Return null
+  // when the line isn't visible.
+  function findViewIndex(cm, n) {
+    if (n >= cm.display.viewTo) { return null }
+    n -= cm.display.viewFrom;
+    if (n < 0) { return null }
+    var view = cm.display.view;
+    for (var i = 0; i < view.length; i++) {
+      n -= view[i].size;
+      if (n < 0) { return i }
+    }
+  }
+
+  // Updates the display.view data structure for a given change to the
+  // document. From and to are in pre-change coordinates. Lendiff is
+  // the amount of lines added or subtracted by the change. This is
+  // used for changes that span multiple lines, or change the way
+  // lines are divided into visual lines. regLineChange (below)
+  // registers single-line changes.
+  function regChange(cm, from, to, lendiff) {
+    if (from == null) { from = cm.doc.first; }
+    if (to == null) { to = cm.doc.first + cm.doc.size; }
+    if (!lendiff) { lendiff = 0; }
+
+    var display = cm.display;
+    if (lendiff && to < display.viewTo &&
+        (display.updateLineNumbers == null || display.updateLineNumbers > from))
+      { display.updateLineNumbers = from; }
+
+    cm.curOp.viewChanged = true;
+
+    if (from >= display.viewTo) { // Change after
+      if (sawCollapsedSpans && visualLineNo(cm.doc, from) < display.viewTo)
+        { resetView(cm); }
+    } else if (to <= display.viewFrom) { // Change before
+      if (sawCollapsedSpans && visualLineEndNo(cm.doc, to + lendiff) > display.viewFrom) {
+        resetView(cm);
+      } else {
+        display.viewFrom += lendiff;
+        display.viewTo += lendiff;
+      }
+    } else if (from <= display.viewFrom && to >= display.viewTo) { // Full overlap
+      resetView(cm);
+    } else if (from <= display.viewFrom) { // Top overlap
+      var cut = viewCuttingPoint(cm, to, to + lendiff, 1);
+      if (cut) {
+        display.view = display.view.slice(cut.index);
+        display.viewFrom = cut.lineN;
+        display.viewTo += lendiff;
+      } else {
+        resetView(cm);
+      }
+    } else if (to >= display.viewTo) { // Bottom overlap
+      var cut$1 = viewCuttingPoint(cm, from, from, -1);
+      if (cut$1) {
+        display.view = display.view.slice(0, cut$1.index);
+        display.viewTo = cut$1.lineN;
+      } else {
+        resetView(cm);
+      }
+    } else { // Gap in the middle
+      var cutTop = viewCuttingPoint(cm, from, from, -1);
+      var cutBot = viewCuttingPoint(cm, to, to + lendiff, 1);
+      if (cutTop && cutBot) {
+        display.view = display.view.slice(0, cutTop.index)
+          .concat(buildViewArray(cm, cutTop.lineN, cutBot.lineN))
+          .concat(display.view.slice(cutBot.index));
+        display.viewTo += lendiff;
+      } else {
+        resetView(cm);
+      }
+    }
+
+    var ext = display.externalMeasured;
+    if (ext) {
+      if (to < ext.lineN)
+        { ext.lineN += lendiff; }
+      else if (from < ext.lineN + ext.size)
+        { display.externalMeasured = null; }
+    }
+  }
+
+  // Register a change to a single line. Type must be one of "text",
+  // "gutter", "class", "widget"
+  function regLineChange(cm, line, type) {
+    cm.curOp.viewChanged = true;
+    var display = cm.display, ext = cm.display.externalMeasured;
+    if (ext && line >= ext.lineN && line < ext.lineN + ext.size)
+      { display.externalMeasured = null; }
+
+    if (line < display.viewFrom || line >= display.viewTo) { return }
+    var lineView = display.view[findViewIndex(cm, line)];
+    if (lineView.node == null) { return }
+    var arr = lineView.changes || (lineView.changes = []);
+    if (indexOf(arr, type) == -1) { arr.push(type); }
+  }
+
+  // Clear the view.
+  function resetView(cm) {
+    cm.display.viewFrom = cm.display.viewTo = cm.doc.first;
+    cm.display.view = [];
+    cm.display.viewOffset = 0;
+  }
+
+  function viewCuttingPoint(cm, oldN, newN, dir) {
+    var index = findViewIndex(cm, oldN), diff, view = cm.display.view;
+    if (!sawCollapsedSpans || newN == cm.doc.first + cm.doc.size)
+      { return {index: index, lineN: newN} }
+    var n = cm.display.viewFrom;
+    for (var i = 0; i < index; i++)
+      { n += view[i].size; }
+    if (n != oldN) {
+      if (dir > 0) {
+        if (index == view.length - 1) { return null }
+        diff = (n + view[index].size) - oldN;
+        index++;
+      } else {
+        diff = n - oldN;
+      }
+      oldN += diff; newN += diff;
+    }
+    while (visualLineNo(cm.doc, newN) != newN) {
+      if (index == (dir < 0 ? 0 : view.length - 1)) { return null }
+      newN += dir * view[index - (dir < 0 ? 1 : 0)].size;
+      index += dir;
+    }
+    return {index: index, lineN: newN}
+  }
+
+  // Force the view to cover a given range, adding empty view element
+  // or clipping off existing ones as needed.
+  function adjustView(cm, from, to) {
+    var display = cm.display, view = display.view;
+    if (view.length == 0 || from >= display.viewTo || to <= display.viewFrom) {
+      display.view = buildViewArray(cm, from, to);
+      display.viewFrom = from;
+    } else {
+      if (display.viewFrom > from)
+        { display.view = buildViewArray(cm, from, display.viewFrom).concat(display.view); }
+      else if (display.viewFrom < from)
+        { display.view = display.view.slice(findViewIndex(cm, from)); }
+      display.viewFrom = from;
+      if (display.viewTo < to)
+        { display.view = display.view.concat(buildViewArray(cm, display.viewTo, to)); }
+      else if (display.viewTo > to)
+        { display.view = display.view.slice(0, findViewIndex(cm, to)); }
+    }
+    display.viewTo = to;
+  }
+
+  // Count the number of lines in the view whose DOM representation is
+  // out of date (or nonexistent).
+  function countDirtyView(cm) {
+    var view = cm.display.view, dirty = 0;
+    for (var i = 0; i < view.length; i++) {
+      var lineView = view[i];
+      if (!lineView.hidden && (!lineView.node || lineView.changes)) { ++dirty; }
+    }
+    return dirty
+  }
+
+  function updateSelection(cm) {
+    cm.display.input.showSelection(cm.display.input.prepareSelection());
+  }
+
+  function prepareSelection(cm, primary) {
+    if ( primary === void 0 ) primary = true;
+
+    var doc = cm.doc, result = {};
+    var curFragment = result.cursors = document.createDocumentFragment();
+    var selFragment = result.selection = document.createDocumentFragment();
+
+    for (var i = 0; i < doc.sel.ranges.length; i++) {
+      if (!primary && i == doc.sel.primIndex) { continue }
+      var range = doc.sel.ranges[i];
+      if (range.from().line >= cm.display.viewTo || range.to().line < cm.display.viewFrom) { continue }
+      var collapsed = range.empty();
+      if (collapsed || cm.options.showCursorWhenSelecting)
+        { drawSelectionCursor(cm, range.head, curFragment); }
+      if (!collapsed)
+        { drawSelectionRange(cm, range, selFragment); }
+    }
+    return result
+  }
+
+  // Draws a cursor for the given range
+  function drawSelectionCursor(cm, head, output) {
+    var pos = cursorCoords(cm, head, "div", null, null, !cm.options.singleCursorHeightPerLine);
+
+    var cursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor"));
+    cursor.style.left = pos.left + "px";
+    cursor.style.top = pos.top + "px";
+    cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + "px";
+
+    if (pos.other) {
+      // Secondary cursor, shown when on a 'jump' in bi-directional text
+      var otherCursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor CodeMirror-secondarycursor"));
+      otherCursor.style.display = "";
+      otherCursor.style.left = pos.other.left + "px";
+      otherCursor.style.top = pos.other.top + "px";
+      otherCursor.style.height = (pos.other.bottom - pos.other.top) * .85 + "px";
+    }
+  }
+
+  function cmpCoords(a, b) { return a.top - b.top || a.left - b.left }
+
+  // Draws the given range as a highlighted selection
+  function drawSelectionRange(cm, range, output) {
+    var display = cm.display, doc = cm.doc;
+    var fragment = document.createDocumentFragment();
+    var padding = paddingH(cm.display), leftSide = padding.left;
+    var rightSide = Math.max(display.sizerWidth, displayWidth(cm) - display.sizer.offsetLeft) - padding.right;
+    var docLTR = doc.direction == "ltr";
+
+    function add(left, top, width, bottom) {
+      if (top < 0) { top = 0; }
+      top = Math.round(top);
+      bottom = Math.round(bottom);
+      fragment.appendChild(elt("div", null, "CodeMirror-selected", ("position: absolute; left: " + left + "px;\n                             top: " + top + "px; width: " + (width == null ? rightSide - left : width) + "px;\n                             height: " + (bottom - top) + "px")));
+    }
+
+    function drawForLine(line, fromArg, toArg) {
+      var lineObj = getLine(doc, line);
+      var lineLen = lineObj.text.length;
+      var start, end;
+      function coords(ch, bias) {
+        return charCoords(cm, Pos(line, ch), "div", lineObj, bias)
+      }
+
+      function wrapX(pos, dir, side) {
+        var extent = wrappedLineExtentChar(cm, lineObj, null, pos);
+        var prop = (dir == "ltr") == (side == "after") ? "left" : "right";
+        var ch = side == "after" ? extent.begin : extent.end - (/\s/.test(lineObj.text.charAt(extent.end - 1)) ? 2 : 1);
+        return coords(ch, prop)[prop]
+      }
+
+      var order = getOrder(lineObj, doc.direction);
+      iterateBidiSections(order, fromArg || 0, toArg == null ? lineLen : toArg, function (from, to, dir, i) {
+        var ltr = dir == "ltr";
+        var fromPos = coords(from, ltr ? "left" : "right");
+        var toPos = coords(to - 1, ltr ? "right" : "left");
+
+        var openStart = fromArg == null && from == 0, openEnd = toArg == null && to == lineLen;
+        var first = i == 0, last = !order || i == order.length - 1;
+        if (toPos.top - fromPos.top <= 3) { // Single line
+          var openLeft = (docLTR ? openStart : openEnd) && first;
+          var openRight = (docLTR ? openEnd : openStart) && last;
+          var left = openLeft ? leftSide : (ltr ? fromPos : toPos).left;
+          var right = openRight ? rightSide : (ltr ? toPos : fromPos).right;
+          add(left, fromPos.top, right - left, fromPos.bottom);
+        } else { // Multiple lines
+          var topLeft, topRight, botLeft, botRight;
+          if (ltr) {
+            topLeft = docLTR && openStart && first ? leftSide : fromPos.left;
+            topRight = docLTR ? rightSide : wrapX(from, dir, "before");
+            botLeft = docLTR ? leftSide : wrapX(to, dir, "after");
+            botRight = docLTR && openEnd && last ? rightSide : toPos.right;
+          } else {
+            topLeft = !docLTR ? leftSide : wrapX(from, dir, "before");
+            topRight = !docLTR && openStart && first ? rightSide : fromPos.right;
+            botLeft = !docLTR && openEnd && last ? leftSide : toPos.left;
+            botRight = !docLTR ? rightSide : wrapX(to, dir, "after");
+          }
+          add(topLeft, fromPos.top, topRight - topLeft, fromPos.bottom);
+          if (fromPos.bottom < toPos.top) { add(leftSide, fromPos.bottom, null, toPos.top); }
+          add(botLeft, toPos.top, botRight - botLeft, toPos.bottom);
+        }
+
+        if (!start || cmpCoords(fromPos, start) < 0) { start = fromPos; }
+        if (cmpCoords(toPos, start) < 0) { start = toPos; }
+        if (!end || cmpCoords(fromPos, end) < 0) { end = fromPos; }
+        if (cmpCoords(toPos, end) < 0) { end = toPos; }
+      });
+      return {start: start, end: end}
+    }
+
+    var sFrom = range.from(), sTo = range.to();
+    if (sFrom.line == sTo.line) {
+      drawForLine(sFrom.line, sFrom.ch, sTo.ch);
+    } else {
+      var fromLine = getLine(doc, sFrom.line), toLine = getLine(doc, sTo.line);
+      var singleVLine = visualLine(fromLine) == visualLine(toLine);
+      var leftEnd = drawForLine(sFrom.line, sFrom.ch, singleVLine ? fromLine.text.length + 1 : null).end;
+      var rightStart = drawForLine(sTo.line, singleVLine ? 0 : null, sTo.ch).start;
+      if (singleVLine) {
+        if (leftEnd.top < rightStart.top - 2) {
+          add(leftEnd.right, leftEnd.top, null, leftEnd.bottom);
+          add(leftSide, rightStart.top, rightStart.left, rightStart.bottom);
+        } else {
+          add(leftEnd.right, leftEnd.top, rightStart.left - leftEnd.right, leftEnd.bottom);
+        }
+      }
+      if (leftEnd.bottom < rightStart.top)
+        { add(leftSide, leftEnd.bottom, null, rightStart.top); }
+    }
+
+    output.appendChild(fragment);
+  }
+
+  // Cursor-blinking
+  function restartBlink(cm) {
+    if (!cm.state.focused) { return }
+    var display = cm.display;
+    clearInterval(display.blinker);
+    var on = true;
+    display.cursorDiv.style.visibility = "";
+    if (cm.options.cursorBlinkRate > 0)
+      { display.blinker = setInterval(function () {
+        if (!cm.hasFocus()) { onBlur(cm); }
+        display.cursorDiv.style.visibility = (on = !on) ? "" : "hidden";
+      }, cm.options.cursorBlinkRate); }
+    else if (cm.options.cursorBlinkRate < 0)
+      { display.cursorDiv.style.visibility = "hidden"; }
+  }
+
+  function ensureFocus(cm) {
+    if (!cm.hasFocus()) {
+      cm.display.input.focus();
+      if (!cm.state.focused) { onFocus(cm); }
+    }
+  }
+
+  function delayBlurEvent(cm) {
+    cm.state.delayingBlurEvent = true;
+    setTimeout(function () { if (cm.state.delayingBlurEvent) {
+      cm.state.delayingBlurEvent = false;
+      if (cm.state.focused) { onBlur(cm); }
+    } }, 100);
+  }
+
+  function onFocus(cm, e) {
+    if (cm.state.delayingBlurEvent && !cm.state.draggingText) { cm.state.delayingBlurEvent = false; }
+
+    if (cm.options.readOnly == "nocursor") { return }
+    if (!cm.state.focused) {
+      signal(cm, "focus", cm, e);
+      cm.state.focused = true;
+      addClass(cm.display.wrapper, "CodeMirror-focused");
+      // This test prevents this from firing when a context
+      // menu is closed (since the input reset would kill the
+      // select-all detection hack)
+      if (!cm.curOp && cm.display.selForContextMenu != cm.doc.sel) {
+        cm.display.input.reset();
+        if (webkit) { setTimeout(function () { return cm.display.input.reset(true); }, 20); } // Issue #1730
+      }
+      cm.display.input.receivedFocus();
+    }
+    restartBlink(cm);
+  }
+  function onBlur(cm, e) {
+    if (cm.state.delayingBlurEvent) { return }
+
+    if (cm.state.focused) {
+      signal(cm, "blur", cm, e);
+      cm.state.focused = false;
+      rmClass(cm.display.wrapper, "CodeMirror-focused");
+    }
+    clearInterval(cm.display.blinker);
+    setTimeout(function () { if (!cm.state.focused) { cm.display.shift = false; } }, 150);
+  }
+
+  // Read the actual heights of the rendered lines, and update their
+  // stored heights to match.
+  function updateHeightsInViewport(cm) {
+    var display = cm.display;
+    var prevBottom = display.lineDiv.offsetTop;
+    for (var i = 0; i < display.view.length; i++) {
+      var cur = display.view[i], wrapping = cm.options.lineWrapping;
+      var height = (void 0), width = 0;
+      if (cur.hidden) { continue }
+      if (ie && ie_version < 8) {
+        var bot = cur.node.offsetTop + cur.node.offsetHeight;
+        height = bot - prevBottom;
+        prevBottom = bot;
+      } else {
+        var box = cur.node.getBoundingClientRect();
+        height = box.bottom - box.top;
+        // Check that lines don't extend past the right of the current
+        // editor width
+        if (!wrapping && cur.text.firstChild)
+          { width = cur.text.firstChild.getBoundingClientRect().right - box.left - 1; }
+      }
+      var diff = cur.line.height - height;
+      if (diff > .005 || diff < -.005) {
+        updateLineHeight(cur.line, height);
+        updateWidgetHeight(cur.line);
+        if (cur.rest) { for (var j = 0; j < cur.rest.length; j++)
+          { updateWidgetHeight(cur.rest[j]); } }
+      }
+      if (width > cm.display.sizerWidth) {
+        var chWidth = Math.ceil(width / charWidth(cm.display));
+        if (chWidth > cm.display.maxLineLength) {
+          cm.display.maxLineLength = chWidth;
+          cm.display.maxLine = cur.line;
+          cm.display.maxLineChanged = true;
+        }
+      }
+    }
+  }
+
+  // Read and store the height of line widgets associated with the
+  // given line.
+  function updateWidgetHeight(line) {
+    if (line.widgets) { for (var i = 0; i < line.widgets.length; ++i) {
+      var w = line.widgets[i], parent = w.node.parentNode;
+      if (parent) { w.height = parent.offsetHeight; }
+    } }
+  }
+
+  // Compute the lines that are visible in a given viewport (defaults
+  // the the current scroll position). viewport may contain top,
+  // height, and ensure (see op.scrollToPos) properties.
+  function visibleLines(display, doc, viewport) {
+    var top = viewport && viewport.top != null ? Math.max(0, viewport.top) : display.scroller.scrollTop;
+    top = Math.floor(top - paddingTop(display));
+    var bottom = viewport && viewport.bottom != null ? viewport.bottom : top + display.wrapper.clientHeight;
+
+    var from = lineAtHeight(doc, top), to = lineAtHeight(doc, bottom);
+    // Ensure is a {from: {line, ch}, to: {line, ch}} object, and
+    // forces those lines into the viewport (if possible).
+    if (viewport && viewport.ensure) {
+      var ensureFrom = viewport.ensure.from.line, ensureTo = viewport.ensure.to.line;
+      if (ensureFrom < from) {
+        from = ensureFrom;
+        to = lineAtHeight(doc, heightAtLine(getLine(doc, ensureFrom)) + display.wrapper.clientHeight);
+      } else if (Math.min(ensureTo, doc.lastLine()) >= to) {
+        from = lineAtHeight(doc, heightAtLine(getLine(doc, ensureTo)) - display.wrapper.clientHeight);
+        to = ensureTo;
+      }
+    }
+    return {from: from, to: Math.max(to, from + 1)}
+  }
+
+  // SCROLLING THINGS INTO VIEW
+
+  // If an editor sits on the top or bottom of the window, partially
+  // scrolled out of view, this ensures that the cursor is visible.
+  function maybeScrollWindow(cm, rect) {
+    if (signalDOMEvent(cm, "scrollCursorIntoView")) { return }
+
+    var display = cm.display, box = display.sizer.getBoundingClientRect(), doScroll = null;
+    if (rect.top + box.top < 0) { doScroll = true; }
+    else if (rect.bottom + box.top > (window.innerHeight || document.documentElement.clientHeight)) { doScroll = false; }
+    if (doScroll != null && !phantom) {
+      var scrollNode = elt("div", "\u200b", null, ("position: absolute;\n                         top: " + (rect.top - display.viewOffset - paddingTop(cm.display)) + "px;\n                         height: " + (rect.bottom - rect.top + scrollGap(cm) + display.barHeight) + "px;\n                         left: " + (rect.left) + "px; width: " + (Math.max(2, rect.right - rect.left)) + "px;"));
+      cm.display.lineSpace.appendChild(scrollNode);
+      scrollNode.scrollIntoView(doScroll);
+      cm.display.lineSpace.removeChild(scrollNode);
+    }
+  }
+
+  // Scroll a given position into view (immediately), verifying that
+  // it actually became visible (as line heights are accurately
+  // measured, the position of something may 'drift' during drawing).
+  function scrollPosIntoView(cm, pos, end, margin) {
+    if (margin == null) { margin = 0; }
+    var rect;
+    if (!cm.options.lineWrapping && pos == end) {
+      // Set pos and end to the cursor positions around the character pos sticks to
+      // If pos.sticky == "before", that is around pos.ch - 1, otherwise around pos.ch
+      // If pos == Pos(_, 0, "before"), pos and end are unchanged
+      pos = pos.ch ? Pos(pos.line, pos.sticky == "before" ? pos.ch - 1 : pos.ch, "after") : pos;
+      end = pos.sticky == "before" ? Pos(pos.line, pos.ch + 1, "before") : pos;
+    }
+    for (var limit = 0; limit < 5; limit++) {
+      var changed = false;
+      var coords = cursorCoords(cm, pos);
+      var endCoords = !end || end == pos ? coords : cursorCoords(cm, end);
+      rect = {left: Math.min(coords.left, endCoords.left),
+              top: Math.min(coords.top, endCoords.top) - margin,
+              right: Math.max(coords.left, endCoords.left),
+              bottom: Math.max(coords.bottom, endCoords.bottom) + margin};
+      var scrollPos = calculateScrollPos(cm, rect);
+      var startTop = cm.doc.scrollTop, startLeft = cm.doc.scrollLeft;
+      if (scrollPos.scrollTop != null) {
+        updateScrollTop(cm, scrollPos.scrollTop);
+        if (Math.abs(cm.doc.scrollTop - startTop) > 1) { changed = true; }
+      }
+      if (scrollPos.scrollLeft != null) {
+        setScrollLeft(cm, scrollPos.scrollLeft);
+        if (Math.abs(cm.doc.scrollLeft - startLeft) > 1) { changed = true; }
+      }
+      if (!changed) { break }
+    }
+    return rect
+  }
+
+  // Scroll a given set of coordinates into view (immediately).
+  function scrollIntoView(cm, rect) {
+    var scrollPos = calculateScrollPos(cm, rect);
+    if (scrollPos.scrollTop != null) { updateScrollTop(cm, scrollPos.scrollTop); }
+    if (scrollPos.scrollLeft != null) { setScrollLeft(cm, scrollPos.scrollLeft); }
+  }
+
+  // Calculate a new scroll position needed to scroll the given
+  // rectangle into view. Returns an object with scrollTop and
+  // scrollLeft properties. When these are undefined, the
+  // vertical/horizontal position does not need to be adjusted.
+  function calculateScrollPos(cm, rect) {
+    var display = cm.display, snapMargin = textHeight(cm.display);
+    if (rect.top < 0) { rect.top = 0; }
+    var screentop = cm.curOp && cm.curOp.scrollTop != null ? cm.curOp.scrollTop : display.scroller.scrollTop;
+    var screen = displayHeight(cm), result = {};
+    if (rect.bottom - rect.top > screen) { rect.bottom = rect.top + screen; }
+    var docBottom = cm.doc.height + paddingVert(display);
+    var atTop = rect.top < snapMargin, atBottom = rect.bottom > docBottom - snapMargin;
+    if (rect.top < screentop) {
+      result.scrollTop = atTop ? 0 : rect.top;
+    } else if (rect.bottom > screentop + screen) {
+      var newTop = Math.min(rect.top, (atBottom ? docBottom : rect.bottom) - screen);
+      if (newTop != screentop) { result.scrollTop = newTop; }
+    }
+
+    var gutterSpace = cm.options.fixedGutter ? 0 : display.gutters.offsetWidth;
+    var screenleft = cm.curOp && cm.curOp.scrollLeft != null ? cm.curOp.scrollLeft : display.scroller.scrollLeft - gutterSpace;
+    var screenw = displayWidth(cm) - display.gutters.offsetWidth;
+    var tooWide = rect.right - rect.left > screenw;
+    if (tooWide) { rect.right = rect.left + screenw; }
+    if (rect.left < 10)
+      { result.scrollLeft = 0; }
+    else if (rect.left < screenleft)
+      { result.scrollLeft = Math.max(0, rect.left + gutterSpace - (tooWide ? 0 : 10)); }
+    else if (rect.right > screenw + screenleft - 3)
+      { result.scrollLeft = rect.right + (tooWide ? 0 : 10) - screenw; }
+    return result
+  }
+
+  // Store a relative adjustment to the scroll position in the current
+  // operation (to be applied when the operation finishes).
+  function addToScrollTop(cm, top) {
+    if (top == null) { return }
+    resolveScrollToPos(cm);
+    cm.curOp.scrollTop = (cm.curOp.scrollTop == null ? cm.doc.scrollTop : cm.curOp.scrollTop) + top;
+  }
+
+  // Make sure that at the end of the operation the current cursor is
+  // shown.
+  function ensureCursorVisible(cm) {
+    resolveScrollToPos(cm);
+    var cur = cm.getCursor();
+    cm.curOp.scrollToPos = {from: cur, to: cur, margin: cm.options.cursorScrollMargin};
+  }
+
+  function scrollToCoords(cm, x, y) {
+    if (x != null || y != null) { resolveScrollToPos(cm); }
+    if (x != null) { cm.curOp.scrollLeft = x; }
+    if (y != null) { cm.curOp.scrollTop = y; }
+  }
+
+  function scrollToRange(cm, range) {
+    resolveScrollToPos(cm);
+    cm.curOp.scrollToPos = range;
+  }
+
+  // When an operation has its scrollToPos property set, and another
+  // scroll action is applied before the end of the operation, this
+  // 'simulates' scrolling that position into view in a cheap way, so
+  // that the effect of intermediate scroll commands is not ignored.
+  function resolveScrollToPos(cm) {
+    var range = cm.curOp.scrollToPos;
+    if (range) {
+      cm.curOp.scrollToPos = null;
+      var from = estimateCoords(cm, range.from), to = estimateCoords(cm, range.to);
+      scrollToCoordsRange(cm, from, to, range.margin);
+    }
+  }
+
+  function scrollToCoordsRange(cm, from, to, margin) {
+    var sPos = calculateScrollPos(cm, {
+      left: Math.min(from.left, to.left),
+      top: Math.min(from.top, to.top) - margin,
+      right: Math.max(from.right, to.right),
+      bottom: Math.max(from.bottom, to.bottom) + margin
+    });
+    scrollToCoords(cm, sPos.scrollLeft, sPos.scrollTop);
+  }
+
+  // Sync the scrollable area and scrollbars, ensure the viewport
+  // covers the visible area.
+  function updateScrollTop(cm, val) {
+    if (Math.abs(cm.doc.scrollTop - val) < 2) { return }
+    if (!gecko) { updateDisplaySimple(cm, {top: val}); }
+    setScrollTop(cm, val, true);
+    if (gecko) { updateDisplaySimple(cm); }
+    startWorker(cm, 100);
+  }
+
+  function setScrollTop(cm, val, forceScroll) {
+    val = Math.max(0, Math.min(cm.display.scroller.scrollHeight - cm.display.scroller.clientHeight, val));
+    if (cm.display.scroller.scrollTop == val && !forceScroll) { return }
+    cm.doc.scrollTop = val;
+    cm.display.scrollbars.setScrollTop(val);
+    if (cm.display.scroller.scrollTop != val) { cm.display.scroller.scrollTop = val; }
+  }
+
+  // Sync scroller and scrollbar, ensure the gutter elements are
+  // aligned.
+  function setScrollLeft(cm, val, isScroller, forceScroll) {
+    val = Math.max(0, Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth));
+    if ((isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) && !forceScroll) { return }
+    cm.doc.scrollLeft = val;
+    alignHorizontally(cm);
+    if (cm.display.scroller.scrollLeft != val) { cm.display.scroller.scrollLeft = val; }
+    cm.display.scrollbars.setScrollLeft(val);
+  }
+
+  // SCROLLBARS
+
+  // Prepare DOM reads needed to update the scrollbars. Done in one
+  // shot to minimize update/measure roundtrips.
+  function measureForScrollbars(cm) {
+    var d = cm.display, gutterW = d.gutters.offsetWidth;
+    var docH = Math.round(cm.doc.height + paddingVert(cm.display));
+    return {
+      clientHeight: d.scroller.clientHeight,
+      viewHeight: d.wrapper.clientHeight,
+      scrollWidth: d.scroller.scrollWidth, clientWidth: d.scroller.clientWidth,
+      viewWidth: d.wrapper.clientWidth,
+      barLeft: cm.options.fixedGutter ? gutterW : 0,
+      docHeight: docH,
+      scrollHeight: docH + scrollGap(cm) + d.barHeight,
+      nativeBarWidth: d.nativeBarWidth,
+      gutterWidth: gutterW
+    }
+  }
+
+  var NativeScrollbars = function(place, scroll, cm) {
+    this.cm = cm;
+    var vert = this.vert = elt("div", [elt("div", null, null, "min-width: 1px")], "CodeMirror-vscrollbar");
+    var horiz = this.horiz = elt("div", [elt("div", null, null, "height: 100%; min-height: 1px")], "CodeMirror-hscrollbar");
+    vert.tabIndex = horiz.tabIndex = -1;
+    place(vert); place(horiz);
+
+    on(vert, "scroll", function () {
+      if (vert.clientHeight) { scroll(vert.scrollTop, "vertical"); }
+    });
+    on(horiz, "scroll", function () {
+      if (horiz.clientWidth) { scroll(horiz.scrollLeft, "horizontal"); }
+    });
+
+    this.checkedZeroWidth = false;
+    // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8).
+    if (ie && ie_version < 8) { this.horiz.style.minHeight = this.vert.style.minWidth = "18px"; }
+  };
+
+  NativeScrollbars.prototype.update = function (measure) {
+    var needsH = measure.scrollWidth > measure.clientWidth + 1;
+    var needsV = measure.scrollHeight > measure.clientHeight + 1;
+    var sWidth = measure.nativeBarWidth;
+
+    if (needsV) {
+      this.vert.style.display = "block";
+      this.vert.style.bottom = needsH ? sWidth + "px" : "0";
+      var totalHeight = measure.viewHeight - (needsH ? sWidth : 0);
+      // A bug in IE8 can cause this value to be negative, so guard it.
+      this.vert.firstChild.style.height =
+        Math.max(0, measure.scrollHeight - measure.clientHeight + totalHeight) + "px";
+    } else {
+      this.vert.style.display = "";
+      this.vert.firstChild.style.height = "0";
+    }
+
+    if (needsH) {
+      this.horiz.style.display = "block";
+      this.horiz.style.right = needsV ? sWidth + "px" : "0";
+      this.horiz.style.left = measure.barLeft + "px";
+      var totalWidth = measure.viewWidth - measure.barLeft - (needsV ? sWidth : 0);
+      this.horiz.firstChild.style.width =
+        Math.max(0, measure.scrollWidth - measure.clientWidth + totalWidth) + "px";
+    } else {
+      this.horiz.style.display = "";
+      this.horiz.firstChild.style.width = "0";
+    }
+
+    if (!this.checkedZeroWidth && measure.clientHeight > 0) {
+      if (sWidth == 0) { this.zeroWidthHack(); }
+      this.checkedZeroWidth = true;
+    }
+
+    return {right: needsV ? sWidth : 0, bottom: needsH ? sWidth : 0}
+  };
+
+  NativeScrollbars.prototype.setScrollLeft = function (pos) {
+    if (this.horiz.scrollLeft != pos) { this.horiz.scrollLeft = pos; }
+    if (this.disableHoriz) { this.enableZeroWidthBar(this.horiz, this.disableHoriz, "horiz"); }
+  };
+
+  NativeScrollbars.prototype.setScrollTop = function (pos) {
+    if (this.vert.scrollTop != pos) { this.vert.scrollTop = pos; }
+    if (this.disableVert) { this.enableZeroWidthBar(this.vert, this.disableVert, "vert"); }
+  };
+
+  NativeScrollbars.prototype.zeroWidthHack = function () {
+    var w = mac && !mac_geMountainLion ? "12px" : "18px";
+    this.horiz.style.height = this.vert.style.width = w;
+    this.horiz.style.pointerEvents = this.vert.style.pointerEvents = "none";
+    this.disableHoriz = new Delayed;
+    this.disableVert = new Delayed;
+  };
+
+  NativeScrollbars.prototype.enableZeroWidthBar = function (bar, delay, type) {
+    bar.style.pointerEvents = "auto";
+    function maybeDisable() {
+      // To find out whether the scrollbar is still visible, we
+      // check whether the element under the pixel in the bottom
+      // right corner of the scrollbar box is the scrollbar box
+      // itself (when the bar is still visible) or its filler child
+      // (when the bar is hidden). If it is still visible, we keep
+      // it enabled, if it's hidden, we disable pointer events.
+      var box = bar.getBoundingClientRect();
+      var elt = type == "vert" ? document.elementFromPoint(box.right - 1, (box.top + box.bottom) / 2)
+          : document.elementFromPoint((box.right + box.left) / 2, box.bottom - 1);
+      if (elt != bar) { bar.style.pointerEvents = "none"; }
+      else { delay.set(1000, maybeDisable); }
+    }
+    delay.set(1000, maybeDisable);
+  };
+
+  NativeScrollbars.prototype.clear = function () {
+    var parent = this.horiz.parentNode;
+    parent.removeChild(this.horiz);
+    parent.removeChild(this.vert);
+  };
+
+  var NullScrollbars = function () {};
+
+  NullScrollbars.prototype.update = function () { return {bottom: 0, right: 0} };
+  NullScrollbars.prototype.setScrollLeft = function () {};
+  NullScrollbars.prototype.setScrollTop = function () {};
+  NullScrollbars.prototype.clear = function () {};
+
+  function updateScrollbars(cm, measure) {
+    if (!measure) { measure = measureForScrollbars(cm); }
+    var startWidth = cm.display.barWidth, startHeight = cm.display.barHeight;
+    updateScrollbarsInner(cm, measure);
+    for (var i = 0; i < 4 && startWidth != cm.display.barWidth || startHeight != cm.display.barHeight; i++) {
+      if (startWidth != cm.display.barWidth && cm.options.lineWrapping)
+        { updateHeightsInViewport(cm); }
+      updateScrollbarsInner(cm, measureForScrollbars(cm));
+      startWidth = cm.display.barWidth; startHeight = cm.display.barHeight;
+    }
+  }
+
+  // Re-synchronize the fake scrollbars with the actual size of the
+  // content.
+  function updateScrollbarsInner(cm, measure) {
+    var d = cm.display;
+    var sizes = d.scrollbars.update(measure);
+
+    d.sizer.style.paddingRight = (d.barWidth = sizes.right) + "px";
+    d.sizer.style.paddingBottom = (d.barHeight = sizes.bottom) + "px";
+    d.heightForcer.style.borderBottom = sizes.bottom + "px solid transparent";
+
+    if (sizes.right && sizes.bottom) {
+      d.scrollbarFiller.style.display = "block";
+      d.scrollbarFiller.style.height = sizes.bottom + "px";
+      d.scrollbarFiller.style.width = sizes.right + "px";
+    } else { d.scrollbarFiller.style.display = ""; }
+    if (sizes.bottom && cm.options.coverGutterNextToScrollbar && cm.options.fixedGutter) {
+      d.gutterFiller.style.display = "block";
+      d.gutterFiller.style.height = sizes.bottom + "px";
+      d.gutterFiller.style.width = measure.gutterWidth + "px";
+    } else { d.gutterFiller.style.display = ""; }
+  }
+
+  var scrollbarModel = {"native": NativeScrollbars, "null": NullScrollbars};
+
+  function initScrollbars(cm) {
+    if (cm.display.scrollbars) {
+      cm.display.scrollbars.clear();
+      if (cm.display.scrollbars.addClass)
+        { rmClass(cm.display.wrapper, cm.display.scrollbars.addClass); }
+    }
+
+    cm.display.scrollbars = new scrollbarModel[cm.options.scrollbarStyle](function (node) {
+      cm.display.wrapper.insertBefore(node, cm.display.scrollbarFiller);
+      // Prevent clicks in the scrollbars from killing focus
+      on(node, "mousedown", function () {
+        if (cm.state.focused) { setTimeout(function () { return cm.display.input.focus(); }, 0); }
+      });
+      node.setAttribute("cm-not-content", "true");
+    }, function (pos, axis) {
+      if (axis == "horizontal") { setScrollLeft(cm, pos); }
+      else { updateScrollTop(cm, pos); }
+    }, cm);
+    if (cm.display.scrollbars.addClass)
+      { addClass(cm.display.wrapper, cm.display.scrollbars.addClass); }
+  }
+
+  // Operations are used to wrap a series of changes to the editor
+  // state in such a way that each change won't have to update the
+  // cursor and display (which would be awkward, slow, and
+  // error-prone). Instead, display updates are batched and then all
+  // combined and executed at once.
+
+  var nextOpId = 0;
+  // Start a new operation.
+  function startOperation(cm) {
+    cm.curOp = {
+      cm: cm,
+      viewChanged: false,      // Flag that indicates that lines might need to be redrawn
+      startHeight: cm.doc.height, // Used to detect need to update scrollbar
+      forceUpdate: false,      // Used to force a redraw
+      updateInput: 0,       // Whether to reset the input textarea
+      typing: false,           // Whether this reset should be careful to leave existing text (for compositing)
+      changeObjs: null,        // Accumulated changes, for firing change events
+      cursorActivityHandlers: null, // Set of handlers to fire cursorActivity on
+      cursorActivityCalled: 0, // Tracks which cursorActivity handlers have been called already
+      selectionChanged: false, // Whether the selection needs to be redrawn
+      updateMaxLine: false,    // Set when the widest line needs to be determined anew
+      scrollLeft: null, scrollTop: null, // Intermediate scroll position, not pushed to DOM yet
+      scrollToPos: null,       // Used to scroll to a specific position
+      focus: false,
+      id: ++nextOpId           // Unique ID
+    };
+    pushOperation(cm.curOp);
+  }
+
+  // Finish an operation, updating the display and signalling delayed events
+  function endOperation(cm) {
+    var op = cm.curOp;
+    if (op) { finishOperation(op, function (group) {
+      for (var i = 0; i < group.ops.length; i++)
+        { group.ops[i].cm.curOp = null; }
+      endOperations(group);
+    }); }
+  }
+
+  // The DOM updates done when an operation finishes are batched so
+  // that the minimum number of relayouts are required.
+  function endOperations(group) {
+    var ops = group.ops;
+    for (var i = 0; i < ops.length; i++) // Read DOM
+      { endOperation_R1(ops[i]); }
+    for (var i$1 = 0; i$1 < ops.length; i$1++) // Write DOM (maybe)
+      { endOperation_W1(ops[i$1]); }
+    for (var i$2 = 0; i$2 < ops.length; i$2++) // Read DOM
+      { endOperation_R2(ops[i$2]); }
+    for (var i$3 = 0; i$3 < ops.length; i$3++) // Write DOM (maybe)
+      { endOperation_W2(ops[i$3]); }
+    for (var i$4 = 0; i$4 < ops.length; i$4++) // Read DOM
+      { endOperation_finish(ops[i$4]); }
+  }
+
+  function endOperation_R1(op) {
+    var cm = op.cm, display = cm.display;
+    maybeClipScrollbars(cm);
+    if (op.updateMaxLine) { findMaxLine(cm); }
+
+    op.mustUpdate = op.viewChanged || op.forceUpdate || op.scrollTop != null ||
+      op.scrollToPos && (op.scrollToPos.from.line < display.viewFrom ||
+                         op.scrollToPos.to.line >= display.viewTo) ||
+      display.maxLineChanged && cm.options.lineWrapping;
+    op.update = op.mustUpdate &&
+      new DisplayUpdate(cm, op.mustUpdate && {top: op.scrollTop, ensure: op.scrollToPos}, op.forceUpdate);
+  }
+
+  function endOperation_W1(op) {
+    op.updatedDisplay = op.mustUpdate && updateDisplayIfNeeded(op.cm, op.update);
+  }
+
+  function endOperation_R2(op) {
+    var cm = op.cm, display = cm.display;
+    if (op.updatedDisplay) { updateHeightsInViewport(cm); }
+
+    op.barMeasure = measureForScrollbars(cm);
+
+    // If the max line changed since it was last measured, measure it,
+    // and ensure the document's width matches it.
+    // updateDisplay_W2 will use these properties to do the actual resizing
+    if (display.maxLineChanged && !cm.options.lineWrapping) {
+      op.adjustWidthTo = measureChar(cm, display.maxLine, display.maxLine.text.length).left + 3;
+      cm.display.sizerWidth = op.adjustWidthTo;
+      op.barMeasure.scrollWidth =
+        Math.max(display.scroller.clientWidth, display.sizer.offsetLeft + op.adjustWidthTo + scrollGap(cm) + cm.display.barWidth);
+      op.maxScrollLeft = Math.max(0, display.sizer.offsetLeft + op.adjustWidthTo - displayWidth(cm));
+    }
+
+    if (op.updatedDisplay || op.selectionChanged)
+      { op.preparedSelection = display.input.prepareSelection(); }
+  }
+
+  function endOperation_W2(op) {
+    var cm = op.cm;
+
+    if (op.adjustWidthTo != null) {
+      cm.display.sizer.style.minWidth = op.adjustWidthTo + "px";
+      if (op.maxScrollLeft < cm.doc.scrollLeft)
+        { setScrollLeft(cm, Math.min(cm.display.scroller.scrollLeft, op.maxScrollLeft), true); }
+      cm.display.maxLineChanged = false;
+    }
+
+    var takeFocus = op.focus && op.focus == activeElt();
+    if (op.preparedSelection)
+      { cm.display.input.showSelection(op.preparedSelection, takeFocus); }
+    if (op.updatedDisplay || op.startHeight != cm.doc.height)
+      { updateScrollbars(cm, op.barMeasure); }
+    if (op.updatedDisplay)
+      { setDocumentHeight(cm, op.barMeasure); }
+
+    if (op.selectionChanged) { restartBlink(cm); }
+
+    if (cm.state.focused && op.updateInput)
+      { cm.display.input.reset(op.typing); }
+    if (takeFocus) { ensureFocus(op.cm); }
+  }
+
+  function endOperation_finish(op) {
+    var cm = op.cm, display = cm.display, doc = cm.doc;
+
+    if (op.updatedDisplay) { postUpdateDisplay(cm, op.update); }
+
+    // Abort mouse wheel delta measurement, when scrolling explicitly
+    if (display.wheelStartX != null && (op.scrollTop != null || op.scrollLeft != null || op.scrollToPos))
+      { display.wheelStartX = display.wheelStartY = null; }
+
+    // Propagate the scroll position to the actual DOM scroller
+    if (op.scrollTop != null) { setScrollTop(cm, op.scrollTop, op.forceScroll); }
+
+    if (op.scrollLeft != null) { setScrollLeft(cm, op.scrollLeft, true, true); }
+    // If we need to scroll a specific position into view, do so.
+    if (op.scrollToPos) {
+      var rect = scrollPosIntoView(cm, clipPos(doc, op.scrollToPos.from),
+                                   clipPos(doc, op.scrollToPos.to), op.scrollToPos.margin);
+      maybeScrollWindow(cm, rect);
+    }
+
+    // Fire events for markers that are hidden/unidden by editing or
+    // undoing
+    var hidden = op.maybeHiddenMarkers, unhidden = op.maybeUnhiddenMarkers;
+    if (hidden) { for (var i = 0; i < hidden.length; ++i)
+      { if (!hidden[i].lines.length) { signal(hidden[i], "hide"); } } }
+    if (unhidden) { for (var i$1 = 0; i$1 < unhidden.length; ++i$1)
+      { if (unhidden[i$1].lines.length) { signal(unhidden[i$1], "unhide"); } } }
+
+    if (display.wrapper.offsetHeight)
+      { doc.scrollTop = cm.display.scroller.scrollTop; }
+
+    // Fire change events, and delayed event handlers
+    if (op.changeObjs)
+      { signal(cm, "changes", cm, op.changeObjs); }
+    if (op.update)
+      { op.update.finish(); }
+  }
+
+  // Run the given function in an operation
+  function runInOp(cm, f) {
+    if (cm.curOp) { return f() }
+    startOperation(cm);
+    try { return f() }
+    finally { endOperation(cm); }
+  }
+  // Wraps a function in an operation. Returns the wrapped function.
+  function operation(cm, f) {
+    return function() {
+      if (cm.curOp) { return f.apply(cm, arguments) }
+      startOperation(cm);
+      try { return f.apply(cm, arguments) }
+      finally { endOperation(cm); }
+    }
+  }
+  // Used to add methods to editor and doc instances, wrapping them in
+  // operations.
+  function methodOp(f) {
+    return function() {
+      if (this.curOp) { return f.apply(this, arguments) }
+      startOperation(this);
+      try { return f.apply(this, arguments) }
+      finally { endOperation(this); }
+    }
+  }
+  function docMethodOp(f) {
+    return function() {
+      var cm = this.cm;
+      if (!cm || cm.curOp) { return f.apply(this, arguments) }
+      startOperation(cm);
+      try { return f.apply(this, arguments) }
+      finally { endOperation(cm); }
+    }
+  }
+
+  // HIGHLIGHT WORKER
+
+  function startWorker(cm, time) {
+    if (cm.doc.highlightFrontier < cm.display.viewTo)
+      { cm.state.highlight.set(time, bind(highlightWorker, cm)); }
+  }
+
+  function highlightWorker(cm) {
+    var doc = cm.doc;
+    if (doc.highlightFrontier >= cm.display.viewTo) { return }
+    var end = +new Date + cm.options.workTime;
+    var context = getContextBefore(cm, doc.highlightFrontier);
+    var changedLines = [];
+
+    doc.iter(context.line, Math.min(doc.first + doc.size, cm.display.viewTo + 500), function (line) {
+      if (context.line >= cm.display.viewFrom) { // Visible
+        var oldStyles = line.styles;
+        var resetState = line.text.length > cm.options.maxHighlightLength ? copyState(doc.mode, context.state) : null;
+        var highlighted = highlightLine(cm, line, context, true);
+        if (resetState) { context.state = resetState; }
+        line.styles = highlighted.styles;
+        var oldCls = line.styleClasses, newCls = highlighted.classes;
+        if (newCls) { line.styleClasses = newCls; }
+        else if (oldCls) { line.styleClasses = null; }
+        var ischange = !oldStyles || oldStyles.length != line.styles.length ||
+          oldCls != newCls && (!oldCls || !newCls || oldCls.bgClass != newCls.bgClass || oldCls.textClass != newCls.textClass);
+        for (var i = 0; !ischange && i < oldStyles.length; ++i) { ischange = oldStyles[i] != line.styles[i]; }
+        if (ischange) { changedLines.push(context.line); }
+        line.stateAfter = context.save();
+        context.nextLine();
+      } else {
+        if (line.text.length <= cm.options.maxHighlightLength)
+          { processLine(cm, line.text, context); }
+        line.stateAfter = context.line % 5 == 0 ? context.save() : null;
+        context.nextLine();
+      }
+      if (+new Date > end) {
+        startWorker(cm, cm.options.workDelay);
+        return true
+      }
+    });
+    doc.highlightFrontier = context.line;
+    doc.modeFrontier = Math.max(doc.modeFrontier, context.line);
+    if (changedLines.length) { runInOp(cm, function () {
+      for (var i = 0; i < changedLines.length; i++)
+        { regLineChange(cm, changedLines[i], "text"); }
+    }); }
+  }
+
+  // DISPLAY DRAWING
+
+  var DisplayUpdate = function(cm, viewport, force) {
+    var display = cm.display;
+
+    this.viewport = viewport;
+    // Store some values that we'll need later (but don't want to force a relayout for)
+    this.visible = visibleLines(display, cm.doc, viewport);
+    this.editorIsHidden = !display.wrapper.offsetWidth;
+    this.wrapperHeight = display.wrapper.clientHeight;
+    this.wrapperWidth = display.wrapper.clientWidth;
+    this.oldDisplayWidth = displayWidth(cm);
+    this.force = force;
+    this.dims = getDimensions(cm);
+    this.events = [];
+  };
+
+  DisplayUpdate.prototype.signal = function (emitter, type) {
+    if (hasHandler(emitter, type))
+      { this.events.push(arguments); }
+  };
+  DisplayUpdate.prototype.finish = function () {
+    for (var i = 0; i < this.events.length; i++)
+      { signal.apply(null, this.events[i]); }
+  };
+
+  function maybeClipScrollbars(cm) {
+    var display = cm.display;
+    if (!display.scrollbarsClipped && display.scroller.offsetWidth) {
+      display.nativeBarWidth = display.scroller.offsetWidth - display.scroller.clientWidth;
+      display.heightForcer.style.height = scrollGap(cm) + "px";
+      display.sizer.style.marginBottom = -display.nativeBarWidth + "px";
+      display.sizer.style.borderRightWidth = scrollGap(cm) + "px";
+      display.scrollbarsClipped = true;
+    }
+  }
+
+  function selectionSnapshot(cm) {
+    if (cm.hasFocus()) { return null }
+    var active = activeElt();
+    if (!active || !contains(cm.display.lineDiv, active)) { return null }
+    var result = {activeElt: active};
+    if (window.getSelection) {
+      var sel = window.getSelection();
+      if (sel.anchorNode && sel.extend && contains(cm.display.lineDiv, sel.anchorNode)) {
+        result.anchorNode = sel.anchorNode;
+        result.anchorOffset = sel.anchorOffset;
+        result.focusNode = sel.focusNode;
+        result.focusOffset = sel.focusOffset;
+      }
+    }
+    return result
+  }
+
+  function restoreSelection(snapshot) {
+    if (!snapshot || !snapshot.activeElt || snapshot.activeElt == activeElt()) { return }
+    snapshot.activeElt.focus();
+    if (!/^(INPUT|TEXTAREA)$/.test(snapshot.activeElt.nodeName) &&
+        snapshot.anchorNode && contains(document.body, snapshot.anchorNode) && contains(document.body, snapshot.focusNode)) {
+      var sel = window.getSelection(), range = document.createRange();
+      range.setEnd(snapshot.anchorNode, snapshot.anchorOffset);
+      range.collapse(false);
+      sel.removeAllRanges();
+      sel.addRange(range);
+      sel.extend(snapshot.focusNode, snapshot.focusOffset);
+    }
+  }
+
+  // Does the actual updating of the line display. Bails out
+  // (returning false) when there is nothing to be done and forced is
+  // false.
+  function updateDisplayIfNeeded(cm, update) {
+    var display = cm.display, doc = cm.doc;
+
+    if (update.editorIsHidden) {
+      resetView(cm);
+      return false
+    }
+
+    // Bail out if the visible area is already rendered and nothing changed.
+    if (!update.force &&
+        update.visible.from >= display.viewFrom && update.visible.to <= display.viewTo &&
+        (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo) &&
+        display.renderedView == display.view && countDirtyView(cm) == 0)
+      { return false }
+
+    if (maybeUpdateLineNumberWidth(cm)) {
+      resetView(cm);
+      update.dims = getDimensions(cm);
+    }
+
+    // Compute a suitable new viewport (from & to)
+    var end = doc.first + doc.size;
+    var from = Math.max(update.visible.from - cm.options.viewportMargin, doc.first);
+    var to = Math.min(end, update.visible.to + cm.options.viewportMargin);
+    if (display.viewFrom < from && from - display.viewFrom < 20) { from = Math.max(doc.first, display.viewFrom); }
+    if (display.viewTo > to && display.viewTo - to < 20) { to = Math.min(end, display.viewTo); }
+    if (sawCollapsedSpans) {
+      from = visualLineNo(cm.doc, from);
+      to = visualLineEndNo(cm.doc, to);
+    }
+
+    var different = from != display.viewFrom || to != display.viewTo ||
+      display.lastWrapHeight != update.wrapperHeight || display.lastWrapWidth != update.wrapperWidth;
+    adjustView(cm, from, to);
+
+    display.viewOffset = heightAtLine(getLine(cm.doc, display.viewFrom));
+    // Position the mover div to align with the current scroll position
+    cm.display.mover.style.top = display.viewOffset + "px";
+
+    var toUpdate = countDirtyView(cm);
+    if (!different && toUpdate == 0 && !update.force && display.renderedView == display.view &&
+        (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo))
+      { return false }
+
+    // For big changes, we hide the enclosing element during the
+    // update, since that speeds up the operations on most browsers.
+    var selSnapshot = selectionSnapshot(cm);
+    if (toUpdate > 4) { display.lineDiv.style.display = "none"; }
+    patchDisplay(cm, display.updateLineNumbers, update.dims);
+    if (toUpdate > 4) { display.lineDiv.style.display = ""; }
+    display.renderedView = display.view;
+    // There might have been a widget with a focused element that got
+    // hidden or updated, if so re-focus it.
+    restoreSelection(selSnapshot);
+
+    // Prevent selection and cursors from interfering with the scroll
+    // width and height.
+    removeChildren(display.cursorDiv);
+    removeChildren(display.selectionDiv);
+    display.gutters.style.height = display.sizer.style.minHeight = 0;
+
+    if (different) {
+      display.lastWrapHeight = update.wrapperHeight;
+      display.lastWrapWidth = update.wrapperWidth;
+      startWorker(cm, 400);
+    }
+
+    display.updateLineNumbers = null;
+
+    return true
+  }
+
+  function postUpdateDisplay(cm, update) {
+    var viewport = update.viewport;
+
+    for (var first = true;; first = false) {
+      if (!first || !cm.options.lineWrapping || update.oldDisplayWidth == displayWidth(cm)) {
+        // Clip forced viewport to actual scrollable area.
+        if (viewport && viewport.top != null)
+          { viewport = {top: Math.min(cm.doc.height + paddingVert(cm.display) - displayHeight(cm), viewport.top)}; }
+        // Updated line heights might result in the drawn area not
+        // actually covering the viewport. Keep looping until it does.
+        update.visible = visibleLines(cm.display, cm.doc, viewport);
+        if (update.visible.from >= cm.display.viewFrom && update.visible.to <= cm.display.viewTo)
+          { break }
+      } else if (first) {
+        update.visible = visibleLines(cm.display, cm.doc, viewport);
+      }
+      if (!updateDisplayIfNeeded(cm, update)) { break }
+      updateHeightsInViewport(cm);
+      var barMeasure = measureForScrollbars(cm);
+      updateSelection(cm);
+      updateScrollbars(cm, barMeasure);
+      setDocumentHeight(cm, barMeasure);
+      update.force = false;
+    }
+
+    update.signal(cm, "update", cm);
+    if (cm.display.viewFrom != cm.display.reportedViewFrom || cm.display.viewTo != cm.display.reportedViewTo) {
+      update.signal(cm, "viewportChange", cm, cm.display.viewFrom, cm.display.viewTo);
+      cm.display.reportedViewFrom = cm.display.viewFrom; cm.display.reportedViewTo = cm.display.viewTo;
+    }
+  }
+
+  function updateDisplaySimple(cm, viewport) {
+    var update = new DisplayUpdate(cm, viewport);
+    if (updateDisplayIfNeeded(cm, update)) {
+      updateHeightsInViewport(cm);
+      postUpdateDisplay(cm, update);
+      var barMeasure = measureForScrollbars(cm);
+      updateSelection(cm);
+      updateScrollbars(cm, barMeasure);
+      setDocumentHeight(cm, barMeasure);
+      update.finish();
+    }
+  }
+
+  // Sync the actual display DOM structure with display.view, removing
+  // nodes for lines that are no longer in view, and creating the ones
+  // that are not there yet, and updating the ones that are out of
+  // date.
+  function patchDisplay(cm, updateNumbersFrom, dims) {
+    var display = cm.display, lineNumbers = cm.options.lineNumbers;
+    var container = display.lineDiv, cur = container.firstChild;
+
+    function rm(node) {
+      var next = node.nextSibling;
+      // Works around a throw-scroll bug in OS X Webkit
+      if (webkit && mac && cm.display.currentWheelTarget == node)
+        { node.style.display = "none"; }
+      else
+        { node.parentNode.removeChild(node); }
+      return next
+    }
+
+    var view = display.view, lineN = display.viewFrom;
+    // Loop over the elements in the view, syncing cur (the DOM nodes
+    // in display.lineDiv) with the view as we go.
+    for (var i = 0; i < view.length; i++) {
+      var lineView = view[i];
+      if (lineView.hidden) ; else if (!lineView.node || lineView.node.parentNode != container) { // Not drawn yet
+        var node = buildLineElement(cm, lineView, lineN, dims);
+        container.insertBefore(node, cur);
+      } else { // Already drawn
+        while (cur != lineView.node) { cur = rm(cur); }
+        var updateNumber = lineNumbers && updateNumbersFrom != null &&
+          updateNumbersFrom <= lineN && lineView.lineNumber;
+        if (lineView.changes) {
+          if (indexOf(lineView.changes, "gutter") > -1) { updateNumber = false; }
+          updateLineForChanges(cm, lineView, lineN, dims);
+        }
+        if (updateNumber) {
+          removeChildren(lineView.lineNumber);
+          lineView.lineNumber.appendChild(document.createTextNode(lineNumberFor(cm.options, lineN)));
+        }
+        cur = lineView.node.nextSibling;
+      }
+      lineN += lineView.size;
+    }
+    while (cur) { cur = rm(cur); }
+  }
+
+  function updateGutterSpace(display) {
+    var width = display.gutters.offsetWidth;
+    display.sizer.style.marginLeft = width + "px";
+    // Send an event to consumers responding to changes in gutter width.
+    signalLater(display, "gutterChanged", display);
+  }
+
+  function setDocumentHeight(cm, measure) {
+    cm.display.sizer.style.minHeight = measure.docHeight + "px";
+    cm.display.heightForcer.style.top = measure.docHeight + "px";
+    cm.display.gutters.style.height = (measure.docHeight + cm.display.barHeight + scrollGap(cm)) + "px";
+  }
+
+  // Re-align line numbers and gutter marks to compensate for
+  // horizontal scrolling.
+  function alignHorizontally(cm) {
+    var display = cm.display, view = display.view;
+    if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) { return }
+    var comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft;
+    var gutterW = display.gutters.offsetWidth, left = comp + "px";
+    for (var i = 0; i < view.length; i++) { if (!view[i].hidden) {
+      if (cm.options.fixedGutter) {
+        if (view[i].gutter)
+          { view[i].gutter.style.left = left; }
+        if (view[i].gutterBackground)
+          { view[i].gutterBackground.style.left = left; }
+      }
+      var align = view[i].alignable;
+      if (align) { for (var j = 0; j < align.length; j++)
+        { align[j].style.left = left; } }
+    } }
+    if (cm.options.fixedGutter)
+      { display.gutters.style.left = (comp + gutterW) + "px"; }
+  }
+
+  // Used to ensure that the line number gutter is still the right
+  // size for the current document size. Returns true when an update
+  // is needed.
+  function maybeUpdateLineNumberWidth(cm) {
+    if (!cm.options.lineNumbers) { return false }
+    var doc = cm.doc, last = lineNumberFor(cm.options, doc.first + doc.size - 1), display = cm.display;
+    if (last.length != display.lineNumChars) {
+      var test = display.measure.appendChild(elt("div", [elt("div", last)],
+                                                 "CodeMirror-linenumber CodeMirror-gutter-elt"));
+      var innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW;
+      display.lineGutter.style.width = "";
+      display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding) + 1;
+      display.lineNumWidth = display.lineNumInnerWidth + padding;
+      display.lineNumChars = display.lineNumInnerWidth ? last.length : -1;
+      display.lineGutter.style.width = display.lineNumWidth + "px";
+      updateGutterSpace(cm.display);
+      return true
+    }
+    return false
+  }
+
+  function getGutters(gutters, lineNumbers) {
+    var result = [], sawLineNumbers = false;
+    for (var i = 0; i < gutters.length; i++) {
+      var name = gutters[i], style = null;
+      if (typeof name != "string") { style = name.style; name = name.className; }
+      if (name == "CodeMirror-linenumbers") {
+        if (!lineNumbers) { continue }
+        else { sawLineNumbers = true; }
+      }
+      result.push({className: name, style: style});
+    }
+    if (lineNumbers && !sawLineNumbers) { result.push({className: "CodeMirror-linenumbers", style: null}); }
+    return result
+  }
+
+  // Rebuild the gutter elements, ensure the margin to the left of the
+  // code matches their width.
+  function renderGutters(display) {
+    var gutters = display.gutters, specs = display.gutterSpecs;
+    removeChildren(gutters);
+    display.lineGutter = null;
+    for (var i = 0; i < specs.length; ++i) {
+      var ref = specs[i];
+      var className = ref.className;
+      var style = ref.style;
+      var gElt = gutters.appendChild(elt("div", null, "CodeMirror-gutter " + className));
+      if (style) { gElt.style.cssText = style; }
+      if (className == "CodeMirror-linenumbers") {
+        display.lineGutter = gElt;
+        gElt.style.width = (display.lineNumWidth || 1) + "px";
+      }
+    }
+    gutters.style.display = specs.length ? "" : "none";
+    updateGutterSpace(display);
+  }
+
+  function updateGutters(cm) {
+    renderGutters(cm.display);
+    regChange(cm);
+    alignHorizontally(cm);
+  }
+
+  // The display handles the DOM integration, both for input reading
+  // and content drawing. It holds references to DOM nodes and
+  // display-related state.
+
+  function Display(place, doc, input, options) {
+    var d = this;
+    this.input = input;
+
+    // Covers bottom-right square when both scrollbars are present.
+    d.scrollbarFiller = elt("div", null, "CodeMirror-scrollbar-filler");
+    d.scrollbarFiller.setAttribute("cm-not-content", "true");
+    // Covers bottom of gutter when coverGutterNextToScrollbar is on
+    // and h scrollbar is present.
+    d.gutterFiller = elt("div", null, "CodeMirror-gutter-filler");
+    d.gutterFiller.setAttribute("cm-not-content", "true");
+    // Will contain the actual code, positioned to cover the viewport.
+    d.lineDiv = eltP("div", null, "CodeMirror-code");
+    // Elements are added to these to represent selection and cursors.
+    d.selectionDiv = elt("div", null, null, "position: relative; z-index: 1");
+    d.cursorDiv = elt("div", null, "CodeMirror-cursors");
+    // A visibility: hidden element used to find the size of things.
+    d.measure = elt("div", null, "CodeMirror-measure");
+    // When lines outside of the viewport are measured, they are drawn in this.
+    d.lineMeasure = elt("div", null, "CodeMirror-measure");
+    // Wraps everything that needs to exist inside the vertically-padded coordinate system
+    d.lineSpace = eltP("div", [d.measure, d.lineMeasure, d.selectionDiv, d.cursorDiv, d.lineDiv],
+                      null, "position: relative; outline: none");
+    var lines = eltP("div", [d.lineSpace], "CodeMirror-lines");
+    // Moved around its parent to cover visible view.
+    d.mover = elt("div", [lines], null, "position: relative");
+    // Set to the height of the document, allowing scrolling.
+    d.sizer = elt("div", [d.mover], "CodeMirror-sizer");
+    d.sizerWidth = null;
+    // Behavior of elts with overflow: auto and padding is
+    // inconsistent across browsers. This is used to ensure the
+    // scrollable area is big enough.
+    d.heightForcer = elt("div", null, null, "position: absolute; height: " + scrollerGap + "px; width: 1px;");
+    // Will contain the gutters, if any.
+    d.gutters = elt("div", null, "CodeMirror-gutters");
+    d.lineGutter = null;
+    // Actual scrollable element.
+    d.scroller = elt("div", [d.sizer, d.heightForcer, d.gutters], "CodeMirror-scroll");
+    d.scroller.setAttribute("tabIndex", "-1");
+    // The element in which the editor lives.
+    d.wrapper = elt("div", [d.scrollbarFiller, d.gutterFiller, d.scroller], "CodeMirror");
+
+    // Work around IE7 z-index bug (not perfect, hence IE7 not really being supported)
+    if (ie && ie_version < 8) { d.gutters.style.zIndex = -1; d.scroller.style.paddingRight = 0; }
+    if (!webkit && !(gecko && mobile)) { d.scroller.draggable = true; }
+
+    if (place) {
+      if (place.appendChild) { place.appendChild(d.wrapper); }
+      else { place(d.wrapper); }
+    }
+
+    // Current rendered range (may be bigger than the view window).
+    d.viewFrom = d.viewTo = doc.first;
+    d.reportedViewFrom = d.reportedViewTo = doc.first;
+    // Information about the rendered lines.
+    d.view = [];
+    d.renderedView = null;
+    // Holds info about a single rendered line when it was rendered
+    // for measurement, while not in view.
+    d.externalMeasured = null;
+    // Empty space (in pixels) above the view
+    d.viewOffset = 0;
+    d.lastWrapHeight = d.lastWrapWidth = 0;
+    d.updateLineNumbers = null;
+
+    d.nativeBarWidth = d.barHeight = d.barWidth = 0;
+    d.scrollbarsClipped = false;
+
+    // Used to only resize the line number gutter when necessary (when
+    // the amount of lines crosses a boundary that makes its width change)
+    d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null;
+    // Set to true when a non-horizontal-scrolling line widget is
+    // added. As an optimization, line widget aligning is skipped when
+    // this is false.
+    d.alignWidgets = false;
+
+    d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null;
+
+    // Tracks the maximum line length so that the horizontal scrollbar
+    // can be kept static when scrolling.
+    d.maxLine = null;
+    d.maxLineLength = 0;
+    d.maxLineChanged = false;
+
+    // Used for measuring wheel scrolling granularity
+    d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null;
+
+    // True when shift is held down.
+    d.shift = false;
+
+    // Used to track whether anything happened since the context menu
+    // was opened.
+    d.selForContextMenu = null;
+
+    d.activeTouch = null;
+
+    d.gutterSpecs = getGutters(options.gutters, options.lineNumbers);
+    renderGutters(d);
+
+    input.init(d);
+  }
+
+  // Since the delta values reported on mouse wheel events are
+  // unstandardized between browsers and even browser versions, and
+  // generally horribly unpredictable, this code starts by measuring
+  // the scroll effect that the first few mouse wheel events have,
+  // and, from that, detects the way it can convert deltas to pixel
+  // offsets afterwards.
+  //
+  // The reason we want to know the amount a wheel event will scroll
+  // is that it gives us a chance to update the display before the
+  // actual scrolling happens, reducing flickering.
+
+  var wheelSamples = 0, wheelPixelsPerUnit = null;
+  // Fill in a browser-detected starting value on browsers where we
+  // know one. These don't have to be accurate -- the result of them
+  // being wrong would just be a slight flicker on the first wheel
+  // scroll (if it is large enough).
+  if (ie) { wheelPixelsPerUnit = -.53; }
+  else if (gecko) { wheelPixelsPerUnit = 15; }
+  else if (chrome) { wheelPixelsPerUnit = -.7; }
+  else if (safari) { wheelPixelsPerUnit = -1/3; }
+
+  function wheelEventDelta(e) {
+    var dx = e.wheelDeltaX, dy = e.wheelDeltaY;
+    if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) { dx = e.detail; }
+    if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) { dy = e.detail; }
+    else if (dy == null) { dy = e.wheelDelta; }
+    return {x: dx, y: dy}
+  }
+  function wheelEventPixels(e) {
+    var delta = wheelEventDelta(e);
+    delta.x *= wheelPixelsPerUnit;
+    delta.y *= wheelPixelsPerUnit;
+    return delta
+  }
+
+  function onScrollWheel(cm, e) {
+    var delta = wheelEventDelta(e), dx = delta.x, dy = delta.y;
+
+    var display = cm.display, scroll = display.scroller;
+    // Quit if there's nothing to scroll here
+    var canScrollX = scroll.scrollWidth > scroll.clientWidth;
+    var canScrollY = scroll.scrollHeight > scroll.clientHeight;
+    if (!(dx && canScrollX || dy && canScrollY)) { return }
+
+    // Webkit browsers on OS X abort momentum scrolls when the target
+    // of the scroll event is removed from the scrollable element.
+    // This hack (see related code in patchDisplay) makes sure the
+    // element is kept around.
+    if (dy && mac && webkit) {
+      outer: for (var cur = e.target, view = display.view; cur != scroll; cur = cur.parentNode) {
+        for (var i = 0; i < view.length; i++) {
+          if (view[i].node == cur) {
+            cm.display.currentWheelTarget = cur;
+            break outer
+          }
+        }
+      }
+    }
+
+    // On some browsers, horizontal scrolling will cause redraws to
+    // happen before the gutter has been realigned, causing it to
+    // wriggle around in a most unseemly way. When we have an
+    // estimated pixels/delta value, we just handle horizontal
+    // scrolling entirely here. It'll be slightly off from native, but
+    // better than glitching out.
+    if (dx && !gecko && !presto && wheelPixelsPerUnit != null) {
+      if (dy && canScrollY)
+        { updateScrollTop(cm, Math.max(0, scroll.scrollTop + dy * wheelPixelsPerUnit)); }
+      setScrollLeft(cm, Math.max(0, scroll.scrollLeft + dx * wheelPixelsPerUnit));
+      // Only prevent default scrolling if vertical scrolling is
+      // actually possible. Otherwise, it causes vertical scroll
+      // jitter on OSX trackpads when deltaX is small and deltaY
+      // is large (issue #3579)
+      if (!dy || (dy && canScrollY))
+        { e_preventDefault(e); }
+      display.wheelStartX = null; // Abort measurement, if in progress
+      return
+    }
+
+    // 'Project' the visible viewport to cover the area that is being
+    // scrolled into view (if we know enough to estimate it).
+    if (dy && wheelPixelsPerUnit != null) {
+      var pixels = dy * wheelPixelsPerUnit;
+      var top = cm.doc.scrollTop, bot = top + display.wrapper.clientHeight;
+      if (pixels < 0) { top = Math.max(0, top + pixels - 50); }
+      else { bot = Math.min(cm.doc.height, bot + pixels + 50); }
+      updateDisplaySimple(cm, {top: top, bottom: bot});
+    }
+
+    if (wheelSamples < 20) {
+      if (display.wheelStartX == null) {
+        display.wheelStartX = scroll.scrollLeft; display.wheelStartY = scroll.scrollTop;
+        display.wheelDX = dx; display.wheelDY = dy;
+        setTimeout(function () {
+          if (display.wheelStartX == null) { return }
+          var movedX = scroll.scrollLeft - display.wheelStartX;
+          var movedY = scroll.scrollTop - display.wheelStartY;
+          var sample = (movedY && display.wheelDY && movedY / display.wheelDY) ||
+            (movedX && display.wheelDX && movedX / display.wheelDX);
+          display.wheelStartX = display.wheelStartY = null;
+          if (!sample) { return }
+          wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1);
+          ++wheelSamples;
+        }, 200);
+      } else {
+        display.wheelDX += dx; display.wheelDY += dy;
+      }
+    }
+  }
+
+  // Selection objects are immutable. A new one is created every time
+  // the selection changes. A selection is one or more non-overlapping
+  // (and non-touching) ranges, sorted, and an integer that indicates
+  // which one is the primary selection (the one that's scrolled into
+  // view, that getCursor returns, etc).
+  var Selection = function(ranges, primIndex) {
+    this.ranges = ranges;
+    this.primIndex = primIndex;
+  };
+
+  Selection.prototype.primary = function () { return this.ranges[this.primIndex] };
+
+  Selection.prototype.equals = function (other) {
+    if (other == this) { return true }
+    if (other.primIndex != this.primIndex || other.ranges.length != this.ranges.length) { return false }
+    for (var i = 0; i < this.ranges.length; i++) {
+      var here = this.ranges[i], there = other.ranges[i];
+      if (!equalCursorPos(here.anchor, there.anchor) || !equalCursorPos(here.head, there.head)) { return false }
+    }
+    return true
+  };
+
+  Selection.prototype.deepCopy = function () {
+    var out = [];
+    for (var i = 0; i < this.ranges.length; i++)
+      { out[i] = new Range(copyPos(this.ranges[i].anchor), copyPos(this.ranges[i].head)); }
+    return new Selection(out, this.primIndex)
+  };
+
+  Selection.prototype.somethingSelected = function () {
+    for (var i = 0; i < this.ranges.length; i++)
+      { if (!this.ranges[i].empty()) { return true } }
+    return false
+  };
+
+  Selection.prototype.contains = function (pos, end) {
+    if (!end) { end = pos; }
+    for (var i = 0; i < this.ranges.length; i++) {
+      var range = this.ranges[i];
+      if (cmp(end, range.from()) >= 0 && cmp(pos, range.to()) <= 0)
+        { return i }
+    }
+    return -1
+  };
+
+  var Range = function(anchor, head) {
+    this.anchor = anchor; this.head = head;
+  };
+
+  Range.prototype.from = function () { return minPos(this.anchor, this.head) };
+  Range.prototype.to = function () { return maxPos(this.anchor, this.head) };
+  Range.prototype.empty = function () { return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch };
+
+  // Take an unsorted, potentially overlapping set of ranges, and
+  // build a selection out of it. 'Consumes' ranges array (modifying
+  // it).
+  function normalizeSelection(cm, ranges, primIndex) {
+    var mayTouch = cm && cm.options.selectionsMayTouch;
+    var prim = ranges[primIndex];
+    ranges.sort(function (a, b) { return cmp(a.from(), b.from()); });
+    primIndex = indexOf(ranges, prim);
+    for (var i = 1; i < ranges.length; i++) {
+      var cur = ranges[i], prev = ranges[i - 1];
+      var diff = cmp(prev.to(), cur.from());
+      if (mayTouch && !cur.empty() ? diff > 0 : diff >= 0) {
+        var from = minPos(prev.from(), cur.from()), to = maxPos(prev.to(), cur.to());
+        var inv = prev.empty() ? cur.from() == cur.head : prev.from() == prev.head;
+        if (i <= primIndex) { --primIndex; }
+        ranges.splice(--i, 2, new Range(inv ? to : from, inv ? from : to));
+      }
+    }
+    return new Selection(ranges, primIndex)
+  }
+
+  function simpleSelection(anchor, head) {
+    return new Selection([new Range(anchor, head || anchor)], 0)
+  }
+
+  // Compute the position of the end of a change (its 'to' property
+  // refers to the pre-change end).
+  function changeEnd(change) {
+    if (!change.text) { return change.to }
+    return Pos(change.from.line + change.text.length - 1,
+               lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0))
+  }
+
+  // Adjust a position to refer to the post-change position of the
+  // same text, or the end of the change if the change covers it.
+  function adjustForChange(pos, change) {
+    if (cmp(pos, change.from) < 0) { return pos }
+    if (cmp(pos, change.to) <= 0) { return changeEnd(change) }
+
+    var line = pos.line + change.text.length - (change.to.line - change.from.line) - 1, ch = pos.ch;
+    if (pos.line == change.to.line) { ch += changeEnd(change).ch - change.to.ch; }
+    return Pos(line, ch)
+  }
+
+  function computeSelAfterChange(doc, change) {
+    var out = [];
+    for (var i = 0; i < doc.sel.ranges.length; i++) {
+      var range = doc.sel.ranges[i];
+      out.push(new Range(adjustForChange(range.anchor, change),
+                         adjustForChange(range.head, change)));
+    }
+    return normalizeSelection(doc.cm, out, doc.sel.primIndex)
+  }
+
+  function offsetPos(pos, old, nw) {
+    if (pos.line == old.line)
+      { return Pos(nw.line, pos.ch - old.ch + nw.ch) }
+    else
+      { return Pos(nw.line + (pos.line - old.line), pos.ch) }
+  }
+
+  // Used by replaceSelections to allow moving the selection to the
+  // start or around the replaced test. Hint may be "start" or "around".
+  function computeReplacedSel(doc, changes, hint) {
+    var out = [];
+    var oldPrev = Pos(doc.first, 0), newPrev = oldPrev;
+    for (var i = 0; i < changes.length; i++) {
+      var change = changes[i];
+      var from = offsetPos(change.from, oldPrev, newPrev);
+      var to = offsetPos(changeEnd(change), oldPrev, newPrev);
+      oldPrev = change.to;
+      newPrev = to;
+      if (hint == "around") {
+        var range = doc.sel.ranges[i], inv = cmp(range.head, range.anchor) < 0;
+        out[i] = new Range(inv ? to : from, inv ? from : to);
+      } else {
+        out[i] = new Range(from, from);
+      }
+    }
+    return new Selection(out, doc.sel.primIndex)
+  }
+
+  // Used to get the editor into a consistent state again when options change.
+
+  function loadMode(cm) {
+    cm.doc.mode = getMode(cm.options, cm.doc.modeOption);
+    resetModeState(cm);
+  }
+
+  function resetModeState(cm) {
+    cm.doc.iter(function (line) {
+      if (line.stateAfter) { line.stateAfter = null; }
+      if (line.styles) { line.styles = null; }
+    });
+    cm.doc.modeFrontier = cm.doc.highlightFrontier = cm.doc.first;
+    startWorker(cm, 100);
+    cm.state.modeGen++;
+    if (cm.curOp) { regChange(cm); }
+  }
+
+  // DOCUMENT DATA STRUCTURE
+
+  // By default, updates that start and end at the beginning of a line
+  // are treated specially, in order to make the association of line
+  // widgets and marker elements with the text behave more intuitive.
+  function isWholeLineUpdate(doc, change) {
+    return change.from.ch == 0 && change.to.ch == 0 && lst(change.text) == "" &&
+      (!doc.cm || doc.cm.options.wholeLineUpdateBefore)
+  }
+
+  // Perform a change on the document data structure.
+  function updateDoc(doc, change, markedSpans, estimateHeight) {
+    function spansFor(n) {return markedSpans ? markedSpans[n] : null}
+    function update(line, text, spans) {
+      updateLine(line, text, spans, estimateHeight);
+      signalLater(line, "change", line, change);
+    }
+    function linesFor(start, end) {
+      var result = [];
+      for (var i = start; i < end; ++i)
+        { result.push(new Line(text[i], spansFor(i), estimateHeight)); }
+      return result
+    }
+
+    var from = change.from, to = change.to, text = change.text;
+    var firstLine = getLine(doc, from.line), lastLine = getLine(doc, to.line);
+    var lastText = lst(text), lastSpans = spansFor(text.length - 1), nlines = to.line - from.line;
+
+    // Adjust the line structure
+    if (change.full) {
+      doc.insert(0, linesFor(0, text.length));
+      doc.remove(text.length, doc.size - text.length);
+    } else if (isWholeLineUpdate(doc, change)) {
+      // This is a whole-line replace. Treated specially to make
+      // sure line objects move the way they are supposed to.
+      var added = linesFor(0, text.length - 1);
+      update(lastLine, lastLine.text, lastSpans);
+      if (nlines) { doc.remove(from.line, nlines); }
+      if (added.length) { doc.insert(from.line, added); }
+    } else if (firstLine == lastLine) {
+      if (text.length == 1) {
+        update(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), lastSpans);
+      } else {
+        var added$1 = linesFor(1, text.length - 1);
+        added$1.push(new Line(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight));
+        update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));
+        doc.insert(from.line + 1, added$1);
+      }
+    } else if (text.length == 1) {
+      update(firstLine, firstLine.text.slice(0, from.ch) + text[0] + lastLine.text.slice(to.ch), spansFor(0));
+      doc.remove(from.line + 1, nlines);
+    } else {
+      update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0));
+      update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans);
+      var added$2 = linesFor(1, text.length - 1);
+      if (nlines > 1) { doc.remove(from.line + 1, nlines - 1); }
+      doc.insert(from.line + 1, added$2);
+    }
+
+    signalLater(doc, "change", doc, change);
+  }
+
+  // Call f for all linked documents.
+  function linkedDocs(doc, f, sharedHistOnly) {
+    function propagate(doc, skip, sharedHist) {
+      if (doc.linked) { for (var i = 0; i < doc.linked.length; ++i) {
+        var rel = doc.linked[i];
+        if (rel.doc == skip) { continue }
+        var shared = sharedHist && rel.sharedHist;
+        if (sharedHistOnly && !shared) { continue }
+        f(rel.doc, shared);
+        propagate(rel.doc, doc, shared);
+      } }
+    }
+    propagate(doc, null, true);
+  }
+
+  // Attach a document to an editor.
+  function attachDoc(cm, doc) {
+    if (doc.cm) { throw new Error("This document is already in use.") }
+    cm.doc = doc;
+    doc.cm = cm;
+    estimateLineHeights(cm);
+    loadMode(cm);
+    setDirectionClass(cm);
+    if (!cm.options.lineWrapping) { findMaxLine(cm); }
+    cm.options.mode = doc.modeOption;
+    regChange(cm);
+  }
+
+  function setDirectionClass(cm) {
+  (cm.doc.direction == "rtl" ? addClass : rmClass)(cm.display.lineDiv, "CodeMirror-rtl");
+  }
+
+  function directionChanged(cm) {
+    runInOp(cm, function () {
+      setDirectionClass(cm);
+      regChange(cm);
+    });
+  }
+
+  function History(prev) {
+    // Arrays of change events and selections. Doing something adds an
+    // event to done and clears undo. Undoing moves events from done
+    // to undone, redoing moves them in the other direction.
+    this.done = []; this.undone = [];
+    this.undoDepth = prev ? prev.undoDepth : Infinity;
+    // Used to track when changes can be merged into a single undo
+    // event
+    this.lastModTime = this.lastSelTime = 0;
+    this.lastOp = this.lastSelOp = null;
+    this.lastOrigin = this.lastSelOrigin = null;
+    // Used by the isClean() method
+    this.generation = this.maxGeneration = prev ? prev.maxGeneration : 1;
+  }
+
+  // Create a history change event from an updateDoc-style change
+  // object.
+  function historyChangeFromChange(doc, change) {
+    var histChange = {from: copyPos(change.from), to: changeEnd(change), text: getBetween(doc, change.from, change.to)};
+    attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1);
+    linkedDocs(doc, function (doc) { return attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1); }, true);
+    return histChange
+  }
+
+  // Pop all selection events off the end of a history array. Stop at
+  // a change event.
+  function clearSelectionEvents(array) {
+    while (array.length) {
+      var last = lst(array);
+      if (last.ranges) { array.pop(); }
+      else { break }
+    }
+  }
+
+  // Find the top change event in the history. Pop off selection
+  // events that are in the way.
+  function lastChangeEvent(hist, force) {
+    if (force) {
+      clearSelectionEvents(hist.done);
+      return lst(hist.done)
+    } else if (hist.done.length && !lst(hist.done).ranges) {
+      return lst(hist.done)
+    } else if (hist.done.length > 1 && !hist.done[hist.done.length - 2].ranges) {
+      hist.done.pop();
+      return lst(hist.done)
+    }
+  }
+
+  // Register a change in the history. Merges changes that are within
+  // a single operation, or are close together with an origin that
+  // allows merging (starting with "+") into a single event.
+  function addChangeToHistory(doc, change, selAfter, opId) {
+    var hist = doc.history;
+    hist.undone.length = 0;
+    var time = +new Date, cur;
+    var last;
+
+    if ((hist.lastOp == opId ||
+         hist.lastOrigin == change.origin && change.origin &&
+         ((change.origin.charAt(0) == "+" && hist.lastModTime > time - (doc.cm ? doc.cm.options.historyEventDelay : 500)) ||
+          change.origin.charAt(0) == "*")) &&
+        (cur = lastChangeEvent(hist, hist.lastOp == opId))) {
+      // Merge this change into the last event
+      last = lst(cur.changes);
+      if (cmp(change.from, change.to) == 0 && cmp(change.from, last.to) == 0) {
+        // Optimized case for simple insertion -- don't want to add
+        // new changesets for every character typed
+        last.to = changeEnd(change);
+      } else {
+        // Add new sub-event
+        cur.changes.push(historyChangeFromChange(doc, change));
+      }
+    } else {
+      // Can not be merged, start a new event.
+      var before = lst(hist.done);
+      if (!before || !before.ranges)
+        { pushSelectionToHistory(doc.sel, hist.done); }
+      cur = {changes: [historyChangeFromChange(doc, change)],
+             generation: hist.generation};
+      hist.done.push(cur);
+      while (hist.done.length > hist.undoDepth) {
+        hist.done.shift();
+        if (!hist.done[0].ranges) { hist.done.shift(); }
+      }
+    }
+    hist.done.push(selAfter);
+    hist.generation = ++hist.maxGeneration;
+    hist.lastModTime = hist.lastSelTime = time;
+    hist.lastOp = hist.lastSelOp = opId;
+    hist.lastOrigin = hist.lastSelOrigin = change.origin;
+
+    if (!last) { signal(doc, "historyAdded"); }
+  }
+
+  function selectionEventCanBeMerged(doc, origin, prev, sel) {
+    var ch = origin.charAt(0);
+    return ch == "*" ||
+      ch == "+" &&
+      prev.ranges.length == sel.ranges.length &&
+      prev.somethingSelected() == sel.somethingSelected() &&
+      new Date - doc.history.lastSelTime <= (doc.cm ? doc.cm.options.historyEventDelay : 500)
+  }
+
+  // Called whenever the selection changes, sets the new selection as
+  // the pending selection in the history, and pushes the old pending
+  // selection into the 'done' array when it was significantly
+  // different (in number of selected ranges, emptiness, or time).
+  function addSelectionToHistory(doc, sel, opId, options) {
+    var hist = doc.history, origin = options && options.origin;
+
+    // A new event is started when the previous origin does not match
+    // the current, or the origins don't allow matching. Origins
+    // starting with * are always merged, those starting with + are
+    // merged when similar and close together in time.
+    if (opId == hist.lastSelOp ||
+        (origin && hist.lastSelOrigin == origin &&
+         (hist.lastModTime == hist.lastSelTime && hist.lastOrigin == origin ||
+          selectionEventCanBeMerged(doc, origin, lst(hist.done), sel))))
+      { hist.done[hist.done.length - 1] = sel; }
+    else
+      { pushSelectionToHistory(sel, hist.done); }
+
+    hist.lastSelTime = +new Date;
+    hist.lastSelOrigin = origin;
+    hist.lastSelOp = opId;
+    if (options && options.clearRedo !== false)
+      { clearSelectionEvents(hist.undone); }
+  }
+
+  function pushSelectionToHistory(sel, dest) {
+    var top = lst(dest);
+    if (!(top && top.ranges && top.equals(sel)))
+      { dest.push(sel); }
+  }
+
+  // Used to store marked span information in the history.
+  function attachLocalSpans(doc, change, from, to) {
+    var existing = change["spans_" + doc.id], n = 0;
+    doc.iter(Math.max(doc.first, from), Math.min(doc.first + doc.size, to), function (line) {
+      if (line.markedSpans)
+        { (existing || (existing = change["spans_" + doc.id] = {}))[n] = line.markedSpans; }
+      ++n;
+    });
+  }
+
+  // When un/re-doing restores text containing marked spans, those
+  // that have been explicitly cleared should not be restored.
+  function removeClearedSpans(spans) {
+    if (!spans) { return null }
+    var out;
+    for (var i = 0; i < spans.length; ++i) {
+      if (spans[i].marker.explicitlyCleared) { if (!out) { out = spans.slice(0, i); } }
+      else if (out) { out.push(spans[i]); }
+    }
+    return !out ? spans : out.length ? out : null
+  }
+
+  // Retrieve and filter the old marked spans stored in a change event.
+  function getOldSpans(doc, change) {
+    var found = change["spans_" + doc.id];
+    if (!found) { return null }
+    var nw = [];
+    for (var i = 0; i < change.text.length; ++i)
+      { nw.push(removeClearedSpans(found[i])); }
+    return nw
+  }
+
+  // Used for un/re-doing changes from the history. Combines the
+  // result of computing the existing spans with the set of spans that
+  // existed in the history (so that deleting around a span and then
+  // undoing brings back the span).
+  function mergeOldSpans(doc, change) {
+    var old = getOldSpans(doc, change);
+    var stretched = stretchSpansOverChange(doc, change);
+    if (!old) { return stretched }
+    if (!stretched) { return old }
+
+    for (var i = 0; i < old.length; ++i) {
+      var oldCur = old[i], stretchCur = stretched[i];
+      if (oldCur && stretchCur) {
+        spans: for (var j = 0; j < stretchCur.length; ++j) {
+          var span = stretchCur[j];
+          for (var k = 0; k < oldCur.length; ++k)
+            { if (oldCur[k].marker == span.marker) { continue spans } }
+          oldCur.push(span);
+        }
+      } else if (stretchCur) {
+        old[i] = stretchCur;
+      }
+    }
+    return old
+  }
+
+  // Used both to provide a JSON-safe object in .getHistory, and, when
+  // detaching a document, to split the history in two
+  function copyHistoryArray(events, newGroup, instantiateSel) {
+    var copy = [];
+    for (var i = 0; i < events.length; ++i) {
+      var event = events[i];
+      if (event.ranges) {
+        copy.push(instantiateSel ? Selection.prototype.deepCopy.call(event) : event);
+        continue
+      }
+      var changes = event.changes, newChanges = [];
+      copy.push({changes: newChanges});
+      for (var j = 0; j < changes.length; ++j) {
+        var change = changes[j], m = (void 0);
+        newChanges.push({from: change.from, to: change.to, text: change.text});
+        if (newGroup) { for (var prop in change) { if (m = prop.match(/^spans_(\d+)$/)) {
+          if (indexOf(newGroup, Number(m[1])) > -1) {
+            lst(newChanges)[prop] = change[prop];
+            delete change[prop];
+          }
+        } } }
+      }
+    }
+    return copy
+  }
+
+  // The 'scroll' parameter given to many of these indicated whether
+  // the new cursor position should be scrolled into view after
+  // modifying the selection.
+
+  // If shift is held or the extend flag is set, extends a range to
+  // include a given position (and optionally a second position).
+  // Otherwise, simply returns the range between the given positions.
+  // Used for cursor motion and such.
+  function extendRange(range, head, other, extend) {
+    if (extend) {
+      var anchor = range.anchor;
+      if (other) {
+        var posBefore = cmp(head, anchor) < 0;
+        if (posBefore != (cmp(other, anchor) < 0)) {
+          anchor = head;
+          head = other;
+        } else if (posBefore != (cmp(head, other) < 0)) {
+          head = other;
+        }
+      }
+      return new Range(anchor, head)
+    } else {
+      return new Range(other || head, head)
+    }
+  }
+
+  // Extend the primary selection range, discard the rest.
+  function extendSelection(doc, head, other, options, extend) {
+    if (extend == null) { extend = doc.cm && (doc.cm.display.shift || doc.extend); }
+    setSelection(doc, new Selection([extendRange(doc.sel.primary(), head, other, extend)], 0), options);
+  }
+
+  // Extend all selections (pos is an array of selections with length
+  // equal the number of selections)
+  function extendSelections(doc, heads, options) {
+    var out = [];
+    var extend = doc.cm && (doc.cm.display.shift || doc.extend);
+    for (var i = 0; i < doc.sel.ranges.length; i++)
+      { out[i] = extendRange(doc.sel.ranges[i], heads[i], null, extend); }
+    var newSel = normalizeSelection(doc.cm, out, doc.sel.primIndex);
+    setSelection(doc, newSel, options);
+  }
+
+  // Updates a single range in the selection.
+  function replaceOneSelection(doc, i, range, options) {
+    var ranges = doc.sel.ranges.slice(0);
+    ranges[i] = range;
+    setSelection(doc, normalizeSelection(doc.cm, ranges, doc.sel.primIndex), options);
+  }
+
+  // Reset the selection to a single range.
+  function setSimpleSelection(doc, anchor, head, options) {
+    setSelection(doc, simpleSelection(anchor, head), options);
+  }
+
+  // Give beforeSelectionChange handlers a change to influence a
+  // selection update.
+  function filterSelectionChange(doc, sel, options) {
+    var obj = {
+      ranges: sel.ranges,
+      update: function(ranges) {
+        this.ranges = [];
+        for (var i = 0; i < ranges.length; i++)
+          { this.ranges[i] = new Range(clipPos(doc, ranges[i].anchor),
+                                     clipPos(doc, ranges[i].head)); }
+      },
+      origin: options && options.origin
+    };
+    signal(doc, "beforeSelectionChange", doc, obj);
+    if (doc.cm) { signal(doc.cm, "beforeSelectionChange", doc.cm, obj); }
+    if (obj.ranges != sel.ranges) { return normalizeSelection(doc.cm, obj.ranges, obj.ranges.length - 1) }
+    else { return sel }
+  }
+
+  function setSelectionReplaceHistory(doc, sel, options) {
+    var done = doc.history.done, last = lst(done);
+    if (last && last.ranges) {
+      done[done.length - 1] = sel;
+      setSelectionNoUndo(doc, sel, options);
+    } else {
+      setSelection(doc, sel, options);
+    }
+  }
+
+  // Set a new selection.
+  function setSelection(doc, sel, options) {
+    setSelectionNoUndo(doc, sel, options);
+    addSelectionToHistory(doc, doc.sel, doc.cm ? doc.cm.curOp.id : NaN, options);
+  }
+
+  function setSelectionNoUndo(doc, sel, options) {
+    if (hasHandler(doc, "beforeSelectionChange") || doc.cm && hasHandler(doc.cm, "beforeSelectionChange"))
+      { sel = filterSelectionChange(doc, sel, options); }
+
+    var bias = options && options.bias ||
+      (cmp(sel.primary().head, doc.sel.primary().head) < 0 ? -1 : 1);
+    setSelectionInner(doc, skipAtomicInSelection(doc, sel, bias, true));
+
+    if (!(options && options.scroll === false) && doc.cm && doc.cm.getOption("readOnly") != "nocursor")
+      { ensureCursorVisible(doc.cm); }
+  }
+
+  function setSelectionInner(doc, sel) {
+    if (sel.equals(doc.sel)) { return }
+
+    doc.sel = sel;
+
+    if (doc.cm) {
+      doc.cm.curOp.updateInput = 1;
+      doc.cm.curOp.selectionChanged = true;
+      signalCursorActivity(doc.cm);
+    }
+    signalLater(doc, "cursorActivity", doc);
+  }
+
+  // Verify that the selection does not partially select any atomic
+  // marked ranges.
+  function reCheckSelection(doc) {
+    setSelectionInner(doc, skipAtomicInSelection(doc, doc.sel, null, false));
+  }
+
+  // Return a selection that does not partially select any atomic
+  // ranges.
+  function skipAtomicInSelection(doc, sel, bias, mayClear) {
+    var out;
+    for (var i = 0; i < sel.ranges.length; i++) {
+      var range = sel.ranges[i];
+      var old = sel.ranges.length == doc.sel.ranges.length && doc.sel.ranges[i];
+      var newAnchor = skipAtomic(doc, range.anchor, old && old.anchor, bias, mayClear);
+      var newHead = skipAtomic(doc, range.head, old && old.head, bias, mayClear);
+      if (out || newAnchor != range.anchor || newHead != range.head) {
+        if (!out) { out = sel.ranges.slice(0, i); }
+        out[i] = new Range(newAnchor, newHead);
+      }
+    }
+    return out ? normalizeSelection(doc.cm, out, sel.primIndex) : sel
+  }
+
+  function skipAtomicInner(doc, pos, oldPos, dir, mayClear) {
+    var line = getLine(doc, pos.line);
+    if (line.markedSpans) { for (var i = 0; i < line.markedSpans.length; ++i) {
+      var sp = line.markedSpans[i], m = sp.marker;
+
+      // Determine if we should prevent the cursor being placed to the left/right of an atomic marker
+      // Historically this was determined using the inclusiveLeft/Right option, but the new way to control it
+      // is with selectLeft/Right
+      var preventCursorLeft = ("selectLeft" in m) ? !m.selectLeft : m.inclusiveLeft;
+      var preventCursorRight = ("selectRight" in m) ? !m.selectRight : m.inclusiveRight;
+
+      if ((sp.from == null || (preventCursorLeft ? sp.from <= pos.ch : sp.from < pos.ch)) &&
+          (sp.to == null || (preventCursorRight ? sp.to >= pos.ch : sp.to > pos.ch))) {
+        if (mayClear) {
+          signal(m, "beforeCursorEnter");
+          if (m.explicitlyCleared) {
+            if (!line.markedSpans) { break }
+            else {--i; continue}
+          }
+        }
+        if (!m.atomic) { continue }
+
+        if (oldPos) {
+          var near = m.find(dir < 0 ? 1 : -1), diff = (void 0);
+          if (dir < 0 ? preventCursorRight : preventCursorLeft)
+            { near = movePos(doc, near, -dir, near && near.line == pos.line ? line : null); }
+          if (near && near.line == pos.line && (diff = cmp(near, oldPos)) && (dir < 0 ? diff < 0 : diff > 0))
+            { return skipAtomicInner(doc, near, pos, dir, mayClear) }
+        }
+
+        var far = m.find(dir < 0 ? -1 : 1);
+        if (dir < 0 ? preventCursorLeft : preventCursorRight)
+          { far = movePos(doc, far, dir, far.line == pos.line ? line : null); }
+        return far ? skipAtomicInner(doc, far, pos, dir, mayClear) : null
+      }
+    } }
+    return pos
+  }
+
+  // Ensure a given position is not inside an atomic range.
+  function skipAtomic(doc, pos, oldPos, bias, mayClear) {
+    var dir = bias || 1;
+    var found = skipAtomicInner(doc, pos, oldPos, dir, mayClear) ||
+        (!mayClear && skipAtomicInner(doc, pos, oldPos, dir, true)) ||
+        skipAtomicInner(doc, pos, oldPos, -dir, mayClear) ||
+        (!mayClear && skipAtomicInner(doc, pos, oldPos, -dir, true));
+    if (!found) {
+      doc.cantEdit = true;
+      return Pos(doc.first, 0)
+    }
+    return found
+  }
+
+  function movePos(doc, pos, dir, line) {
+    if (dir < 0 && pos.ch == 0) {
+      if (pos.line > doc.first) { return clipPos(doc, Pos(pos.line - 1)) }
+      else { return null }
+    } else if (dir > 0 && pos.ch == (line || getLine(doc, pos.line)).text.length) {
+      if (pos.line < doc.first + doc.size - 1) { return Pos(pos.line + 1, 0) }
+      else { return null }
+    } else {
+      return new Pos(pos.line, pos.ch + dir)
+    }
+  }
+
+  function selectAll(cm) {
+    cm.setSelection(Pos(cm.firstLine(), 0), Pos(cm.lastLine()), sel_dontScroll);
+  }
+
+  // UPDATING
+
+  // Allow "beforeChange" event handlers to influence a change
+  function filterChange(doc, change, update) {
+    var obj = {
+      canceled: false,
+      from: change.from,
+      to: change.to,
+      text: change.text,
+      origin: change.origin,
+      cancel: function () { return obj.canceled = true; }
+    };
+    if (update) { obj.update = function (from, to, text, origin) {
+      if (from) { obj.from = clipPos(doc, from); }
+      if (to) { obj.to = clipPos(doc, to); }
+      if (text) { obj.text = text; }
+      if (origin !== undefined) { obj.origin = origin; }
+    }; }
+    signal(doc, "beforeChange", doc, obj);
+    if (doc.cm) { signal(doc.cm, "beforeChange", doc.cm, obj); }
+
+    if (obj.canceled) {
+      if (doc.cm) { doc.cm.curOp.updateInput = 2; }
+      return null
+    }
+    return {from: obj.from, to: obj.to, text: obj.text, origin: obj.origin}
+  }
+
+  // Apply a change to a document, and add it to the document's
+  // history, and propagating it to all linked documents.
+  function makeChange(doc, change, ignoreReadOnly) {
+    if (doc.cm) {
+      if (!doc.cm.curOp) { return operation(doc.cm, makeChange)(doc, change, ignoreReadOnly) }
+      if (doc.cm.state.suppressEdits) { return }
+    }
+
+    if (hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange")) {
+      change = filterChange(doc, change, true);
+      if (!change) { return }
+    }
+
+    // Possibly split or suppress the update based on the presence
+    // of read-only spans in its range.
+    var split = sawReadOnlySpans && !ignoreReadOnly && removeReadOnlyRanges(doc, change.from, change.to);
+    if (split) {
+      for (var i = split.length - 1; i >= 0; --i)
+        { makeChangeInner(doc, {from: split[i].from, to: split[i].to, text: i ? [""] : change.text, origin: change.origin}); }
+    } else {
+      makeChangeInner(doc, change);
+    }
+  }
+
+  function makeChangeInner(doc, change) {
+    if (change.text.length == 1 && change.text[0] == "" && cmp(change.from, change.to) == 0) { return }
+    var selAfter = computeSelAfterChange(doc, change);
+    addChangeToHistory(doc, change, selAfter, doc.cm ? doc.cm.curOp.id : NaN);
+
+    makeChangeSingleDoc(doc, change, selAfter, stretchSpansOverChange(doc, change));
+    var rebased = [];
+
+    linkedDocs(doc, function (doc, sharedHist) {
+      if (!sharedHist && indexOf(rebased, doc.history) == -1) {
+        rebaseHist(doc.history, change);
+        rebased.push(doc.history);
+      }
+      makeChangeSingleDoc(doc, change, null, stretchSpansOverChange(doc, change));
+    });
+  }
+
+  // Revert a change stored in a document's history.
+  function makeChangeFromHistory(doc, type, allowSelectionOnly) {
+    var suppress = doc.cm && doc.cm.state.suppressEdits;
+    if (suppress && !allowSelectionOnly) { return }
+
+    var hist = doc.history, event, selAfter = doc.sel;
+    var source = type == "undo" ? hist.done : hist.undone, dest = type == "undo" ? hist.undone : hist.done;
+
+    // Verify that there is a useable event (so that ctrl-z won't
+    // needlessly clear selection events)
+    var i = 0;
+    for (; i < source.length; i++) {
+      event = source[i];
+      if (allowSelectionOnly ? event.ranges && !event.equals(doc.sel) : !event.ranges)
+        { break }
+    }
+    if (i == source.length) { return }
+    hist.lastOrigin = hist.lastSelOrigin = null;
+
+    for (;;) {
+      event = source.pop();
+      if (event.ranges) {
+        pushSelectionToHistory(event, dest);
+        if (allowSelectionOnly && !event.equals(doc.sel)) {
+          setSelection(doc, event, {clearRedo: false});
+          return
+        }
+        selAfter = event;
+      } else if (suppress) {
+        source.push(event);
+        return
+      } else { break }
+    }
+
+    // Build up a reverse change object to add to the opposite history
+    // stack (redo when undoing, and vice versa).
+    var antiChanges = [];
+    pushSelectionToHistory(selAfter, dest);
+    dest.push({changes: antiChanges, generation: hist.generation});
+    hist.generation = event.generation || ++hist.maxGeneration;
+
+    var filter = hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange");
+
+    var loop = function ( i ) {
+      var change = event.changes[i];
+      change.origin = type;
+      if (filter && !filterChange(doc, change, false)) {
+        source.length = 0;
+        return {}
+      }
+
+      antiChanges.push(historyChangeFromChange(doc, change));
+
+      var after = i ? computeSelAfterChange(doc, change) : lst(source);
+      makeChangeSingleDoc(doc, change, after, mergeOldSpans(doc, change));
+      if (!i && doc.cm) { doc.cm.scrollIntoView({from: change.from, to: changeEnd(change)}); }
+      var rebased = [];
+
+      // Propagate to the linked documents
+      linkedDocs(doc, function (doc, sharedHist) {
+        if (!sharedHist && indexOf(rebased, doc.history) == -1) {
+          rebaseHist(doc.history, change);
+          rebased.push(doc.history);
+        }
+        makeChangeSingleDoc(doc, change, null, mergeOldSpans(doc, change));
+      });
+    };
+
+    for (var i$1 = event.changes.length - 1; i$1 >= 0; --i$1) {
+      var returned = loop( i$1 );
+
+      if ( returned ) return returned.v;
+    }
+  }
+
+  // Sub-views need their line numbers shifted when text is added
+  // above or below them in the parent document.
+  function shiftDoc(doc, distance) {
+    if (distance == 0) { return }
+    doc.first += distance;
+    doc.sel = new Selection(map(doc.sel.ranges, function (range) { return new Range(
+      Pos(range.anchor.line + distance, range.anchor.ch),
+      Pos(range.head.line + distance, range.head.ch)
+    ); }), doc.sel.primIndex);
+    if (doc.cm) {
+      regChange(doc.cm, doc.first, doc.first - distance, distance);
+      for (var d = doc.cm.display, l = d.viewFrom; l < d.viewTo; l++)
+        { regLineChange(doc.cm, l, "gutter"); }
+    }
+  }
+
+  // More lower-level change function, handling only a single document
+  // (not linked ones).
+  function makeChangeSingleDoc(doc, change, selAfter, spans) {
+    if (doc.cm && !doc.cm.curOp)
+      { return operation(doc.cm, makeChangeSingleDoc)(doc, change, selAfter, spans) }
+
+    if (change.to.line < doc.first) {
+      shiftDoc(doc, change.text.length - 1 - (change.to.line - change.from.line));
+      return
+    }
+    if (change.from.line > doc.lastLine()) { return }
+
+    // Clip the change to the size of this doc
+    if (change.from.line < doc.first) {
+      var shift = change.text.length - 1 - (doc.first - change.from.line);
+      shiftDoc(doc, shift);
+      change = {from: Pos(doc.first, 0), to: Pos(change.to.line + shift, change.to.ch),
+                text: [lst(change.text)], origin: change.origin};
+    }
+    var last = doc.lastLine();
+    if (change.to.line > last) {
+      change = {from: change.from, to: Pos(last, getLine(doc, last).text.length),
+                text: [change.text[0]], origin: change.origin};
+    }
+
+    change.removed = getBetween(doc, change.from, change.to);
+
+    if (!selAfter) { selAfter = computeSelAfterChange(doc, change); }
+    if (doc.cm) { makeChangeSingleDocInEditor(doc.cm, change, spans); }
+    else { updateDoc(doc, change, spans); }
+    setSelectionNoUndo(doc, selAfter, sel_dontScroll);
+
+    if (doc.cantEdit && skipAtomic(doc, Pos(doc.firstLine(), 0)))
+      { doc.cantEdit = false; }
+  }
+
+  // Handle the interaction of a change to a document with the editor
+  // that this document is part of.
+  function makeChangeSingleDocInEditor(cm, change, spans) {
+    var doc = cm.doc, display = cm.display, from = change.from, to = change.to;
+
+    var recomputeMaxLength = false, checkWidthStart = from.line;
+    if (!cm.options.lineWrapping) {
+      checkWidthStart = lineNo(visualLine(getLine(doc, from.line)));
+      doc.iter(checkWidthStart, to.line + 1, function (line) {
+        if (line == display.maxLine) {
+          recomputeMaxLength = true;
+          return true
+        }
+      });
+    }
+
+    if (doc.sel.contains(change.from, change.to) > -1)
+      { signalCursorActivity(cm); }
+
+    updateDoc(doc, change, spans, estimateHeight(cm));
+
+    if (!cm.options.lineWrapping) {
+      doc.iter(checkWidthStart, from.line + change.text.length, function (line) {
+        var len = lineLength(line);
+        if (len > display.maxLineLength) {
+          display.maxLine = line;
+          display.maxLineLength = len;
+          display.maxLineChanged = true;
+          recomputeMaxLength = false;
+        }
+      });
+      if (recomputeMaxLength) { cm.curOp.updateMaxLine = true; }
+    }
+
+    retreatFrontier(doc, from.line);
+    startWorker(cm, 400);
+
+    var lendiff = change.text.length - (to.line - from.line) - 1;
+    // Remember that these lines changed, for updating the display
+    if (change.full)
+      { regChange(cm); }
+    else if (from.line == to.line && change.text.length == 1 && !isWholeLineUpdate(cm.doc, change))
+      { regLineChange(cm, from.line, "text"); }
+    else
+      { regChange(cm, from.line, to.line + 1, lendiff); }
+
+    var changesHandler = hasHandler(cm, "changes"), changeHandler = hasHandler(cm, "change");
+    if (changeHandler || changesHandler) {
+      var obj = {
+        from: from, to: to,
+        text: change.text,
+        removed: change.removed,
+        origin: change.origin
+      };
+      if (changeHandler) { signalLater(cm, "change", cm, obj); }
+      if (changesHandler) { (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push(obj); }
+    }
+    cm.display.selForContextMenu = null;
+  }
+
+  function replaceRange(doc, code, from, to, origin) {
+    var assign;
+
+    if (!to) { to = from; }
+    if (cmp(to, from) < 0) { (assign = [to, from], from = assign[0], to = assign[1]); }
+    if (typeof code == "string") { code = doc.splitLines(code); }
+    makeChange(doc, {from: from, to: to, text: code, origin: origin});
+  }
+
+  // Rebasing/resetting history to deal with externally-sourced changes
+
+  function rebaseHistSelSingle(pos, from, to, diff) {
+    if (to < pos.line) {
+      pos.line += diff;
+    } else if (from < pos.line) {
+      pos.line = from;
+      pos.ch = 0;
+    }
+  }
+
+  // Tries to rebase an array of history events given a change in the
+  // document. If the change touches the same lines as the event, the
+  // event, and everything 'behind' it, is discarded. If the change is
+  // before the event, the event's positions are updated. Uses a
+  // copy-on-write scheme for the positions, to avoid having to
+  // reallocate them all on every rebase, but also avoid problems with
+  // shared position objects being unsafely updated.
+  function rebaseHistArray(array, from, to, diff) {
+    for (var i = 0; i < array.length; ++i) {
+      var sub = array[i], ok = true;
+      if (sub.ranges) {
+        if (!sub.copied) { sub = array[i] = sub.deepCopy(); sub.copied = true; }
+        for (var j = 0; j < sub.ranges.length; j++) {
+          rebaseHistSelSingle(sub.ranges[j].anchor, from, to, diff);
+          rebaseHistSelSingle(sub.ranges[j].head, from, to, diff);
+        }
+        continue
+      }
+      for (var j$1 = 0; j$1 < sub.changes.length; ++j$1) {
+        var cur = sub.changes[j$1];
+        if (to < cur.from.line) {
+          cur.from = Pos(cur.from.line + diff, cur.from.ch);
+          cur.to = Pos(cur.to.line + diff, cur.to.ch);
+        } else if (from <= cur.to.line) {
+          ok = false;
+          break
+        }
+      }
+      if (!ok) {
+        array.splice(0, i + 1);
+        i = 0;
+      }
+    }
+  }
+
+  function rebaseHist(hist, change) {
+    var from = change.from.line, to = change.to.line, diff = change.text.length - (to - from) - 1;
+    rebaseHistArray(hist.done, from, to, diff);
+    rebaseHistArray(hist.undone, from, to, diff);
+  }
+
+  // Utility for applying a change to a line by handle or number,
+  // returning the number and optionally registering the line as
+  // changed.
+  function changeLine(doc, handle, changeType, op) {
+    var no = handle, line = handle;
+    if (typeof handle == "number") { line = getLine(doc, clipLine(doc, handle)); }
+    else { no = lineNo(handle); }
+    if (no == null) { return null }
+    if (op(line, no) && doc.cm) { regLineChange(doc.cm, no, changeType); }
+    return line
+  }
+
+  // The document is represented as a BTree consisting of leaves, with
+  // chunk of lines in them, and branches, with up to ten leaves or
+  // other branch nodes below them. The top node is always a branch
+  // node, and is the document object itself (meaning it has
+  // additional methods and properties).
+  //
+  // All nodes have parent links. The tree is used both to go from
+  // line numbers to line objects, and to go from objects to numbers.
+  // It also indexes by height, and is used to convert between height
+  // and line object, and to find the total height of the document.
+  //
+  // See also http://marijnhaverbeke.nl/blog/codemirror-line-tree.html
+
+  function LeafChunk(lines) {
+    this.lines = lines;
+    this.parent = null;
+    var height = 0;
+    for (var i = 0; i < lines.length; ++i) {
+      lines[i].parent = this;
+      height += lines[i].height;
+    }
+    this.height = height;
+  }
+
+  LeafChunk.prototype = {
+    chunkSize: function() { return this.lines.length },
+
+    // Remove the n lines at offset 'at'.
+    removeInner: function(at, n) {
+      for (var i = at, e = at + n; i < e; ++i) {
+        var line = this.lines[i];
+        this.height -= line.height;
+        cleanUpLine(line);
+        signalLater(line, "delete");
+      }
+      this.lines.splice(at, n);
+    },
+
+    // Helper used to collapse a small branch into a single leaf.
+    collapse: function(lines) {
+      lines.push.apply(lines, this.lines);
+    },
+
+    // Insert the given array of lines at offset 'at', count them as
+    // having the given height.
+    insertInner: function(at, lines, height) {
+      this.height += height;
+      this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at));
+      for (var i = 0; i < lines.length; ++i) { lines[i].parent = this; }
+    },
+
+    // Used to iterate over a part of the tree.
+    iterN: function(at, n, op) {
+      for (var e = at + n; at < e; ++at)
+        { if (op(this.lines[at])) { return true } }
+    }
+  };
+
+  function BranchChunk(children) {
+    this.children = children;
+    var size = 0, height = 0;
+    for (var i = 0; i < children.length; ++i) {
+      var ch = children[i];
+      size += ch.chunkSize(); height += ch.height;
+      ch.parent = this;
+    }
+    this.size = size;
+    this.height = height;
+    this.parent = null;
+  }
+
+  BranchChunk.prototype = {
+    chunkSize: function() { return this.size },
+
+    removeInner: function(at, n) {
+      this.size -= n;
+      for (var i = 0; i < this.children.length; ++i) {
+        var child = this.children[i], sz = child.chunkSize();
+        if (at < sz) {
+          var rm = Math.min(n, sz - at), oldHeight = child.height;
+          child.removeInner(at, rm);
+          this.height -= oldHeight - child.height;
+          if (sz == rm) { this.children.splice(i--, 1); child.parent = null; }
+          if ((n -= rm) == 0) { break }
+          at = 0;
+        } else { at -= sz; }
+      }
+      // If the result is smaller than 25 lines, ensure that it is a
+      // single leaf node.
+      if (this.size - n < 25 &&
+          (this.children.length > 1 || !(this.children[0] instanceof LeafChunk))) {
+        var lines = [];
+        this.collapse(lines);
+        this.children = [new LeafChunk(lines)];
+        this.children[0].parent = this;
+      }
+    },
+
+    collapse: function(lines) {
+      for (var i = 0; i < this.children.length; ++i) { this.children[i].collapse(lines); }
+    },
+
+    insertInner: function(at, lines, height) {
+      this.size += lines.length;
+      this.height += height;
+      for (var i = 0; i < this.children.length; ++i) {
+        var child = this.children[i], sz = child.chunkSize();
+        if (at <= sz) {
+          child.insertInner(at, lines, height);
+          if (child.lines && child.lines.length > 50) {
+            // To avoid memory thrashing when child.lines is huge (e.g. first view of a large file), it's never spliced.
+            // Instead, small slices are taken. They're taken in order because sequential memory accesses are fastest.
+            var remaining = child.lines.length % 25 + 25;
+            for (var pos = remaining; pos < child.lines.length;) {
+              var leaf = new LeafChunk(child.lines.slice(pos, pos += 25));
+              child.height -= leaf.height;
+              this.children.splice(++i, 0, leaf);
+              leaf.parent = this;
+            }
+            child.lines = child.lines.slice(0, remaining);
+            this.maybeSpill();
+          }
+          break
+        }
+        at -= sz;
+      }
+    },
+
+    // When a node has grown, check whether it should be split.
+    maybeSpill: function() {
+      if (this.children.length <= 10) { return }
+      var me = this;
+      do {
+        var spilled = me.children.splice(me.children.length - 5, 5);
+        var sibling = new BranchChunk(spilled);
+        if (!me.parent) { // Become the parent node
+          var copy = new BranchChunk(me.children);
+          copy.parent = me;
+          me.children = [copy, sibling];
+          me = copy;
+       } else {
+          me.size -= sibling.size;
+          me.height -= sibling.height;
+          var myIndex = indexOf(me.parent.children, me);
+          me.parent.children.splice(myIndex + 1, 0, sibling);
+        }
+        sibling.parent = me.parent;
+      } while (me.children.length > 10)
+      me.parent.maybeSpill();
+    },
+
+    iterN: function(at, n, op) {
+      for (var i = 0; i < this.children.length; ++i) {
+        var child = this.children[i], sz = child.chunkSize();
+        if (at < sz) {
+          var used = Math.min(n, sz - at);
+          if (child.iterN(at, used, op)) { return true }
+          if ((n -= used) == 0) { break }
+          at = 0;
+        } else { at -= sz; }
+      }
+    }
+  };
+
+  // Line widgets are block elements displayed above or below a line.
+
+  var LineWidget = function(doc, node, options) {
+    if (options) { for (var opt in options) { if (options.hasOwnProperty(opt))
+      { this[opt] = options[opt]; } } }
+    this.doc = doc;
+    this.node = node;
+  };
+
+  LineWidget.prototype.clear = function () {
+    var cm = this.doc.cm, ws = this.line.widgets, line = this.line, no = lineNo(line);
+    if (no == null || !ws) { return }
+    for (var i = 0; i < ws.length; ++i) { if (ws[i] == this) { ws.splice(i--, 1); } }
+    if (!ws.length) { line.widgets = null; }
+    var height = widgetHeight(this);
+    updateLineHeight(line, Math.max(0, line.height - height));
+    if (cm) {
+      runInOp(cm, function () {
+        adjustScrollWhenAboveVisible(cm, line, -height);
+        regLineChange(cm, no, "widget");
+      });
+      signalLater(cm, "lineWidgetCleared", cm, this, no);
+    }
+  };
+
+  LineWidget.prototype.changed = function () {
+      var this$1 = this;
+
+    var oldH = this.height, cm = this.doc.cm, line = this.line;
+    this.height = null;
+    var diff = widgetHeight(this) - oldH;
+    if (!diff) { return }
+    if (!lineIsHidden(this.doc, line)) { updateLineHeight(line, line.height + diff); }
+    if (cm) {
+      runInOp(cm, function () {
+        cm.curOp.forceUpdate = true;
+        adjustScrollWhenAboveVisible(cm, line, diff);
+        signalLater(cm, "lineWidgetChanged", cm, this$1, lineNo(line));
+      });
+    }
+  };
+  eventMixin(LineWidget);
+
+  function adjustScrollWhenAboveVisible(cm, line, diff) {
+    if (heightAtLine(line) < ((cm.curOp && cm.curOp.scrollTop) || cm.doc.scrollTop))
+      { addToScrollTop(cm, diff); }
+  }
+
+  function addLineWidget(doc, handle, node, options) {
+    var widget = new LineWidget(doc, node, options);
+    var cm = doc.cm;
+    if (cm && widget.noHScroll) { cm.display.alignWidgets = true; }
+    changeLine(doc, handle, "widget", function (line) {
+      var widgets = line.widgets || (line.widgets = []);
+      if (widget.insertAt == null) { widgets.push(widget); }
+      else { widgets.splice(Math.min(widgets.length, Math.max(0, widget.insertAt)), 0, widget); }
+      widget.line = line;
+      if (cm && !lineIsHidden(doc, line)) {
+        var aboveVisible = heightAtLine(line) < doc.scrollTop;
+        updateLineHeight(line, line.height + widgetHeight(widget));
+        if (aboveVisible) { addToScrollTop(cm, widget.height); }
+        cm.curOp.forceUpdate = true;
+      }
+      return true
+    });
+    if (cm) { signalLater(cm, "lineWidgetAdded", cm, widget, typeof handle == "number" ? handle : lineNo(handle)); }
+    return widget
+  }
+
+  // TEXTMARKERS
+
+  // Created with markText and setBookmark methods. A TextMarker is a
+  // handle that can be used to clear or find a marked position in the
+  // document. Line objects hold arrays (markedSpans) containing
+  // {from, to, marker} object pointing to such marker objects, and
+  // indicating that such a marker is present on that line. Multiple
+  // lines may point to the same marker when it spans across lines.
+  // The spans will have null for their from/to properties when the
+  // marker continues beyond the start/end of the line. Markers have
+  // links back to the lines they currently touch.
+
+  // Collapsed markers have unique ids, in order to be able to order
+  // them, which is needed for uniquely determining an outer marker
+  // when they overlap (they may nest, but not partially overlap).
+  var nextMarkerId = 0;
+
+  var TextMarker = function(doc, type) {
+    this.lines = [];
+    this.type = type;
+    this.doc = doc;
+    this.id = ++nextMarkerId;
+  };
+
+  // Clear the marker.
+  TextMarker.prototype.clear = function () {
+    if (this.explicitlyCleared) { return }
+    var cm = this.doc.cm, withOp = cm && !cm.curOp;
+    if (withOp) { startOperation(cm); }
+    if (hasHandler(this, "clear")) {
+      var found = this.find();
+      if (found) { signalLater(this, "clear", found.from, found.to); }
+    }
+    var min = null, max = null;
+    for (var i = 0; i < this.lines.length; ++i) {
+      var line = this.lines[i];
+      var span = getMarkedSpanFor(line.markedSpans, this);
+      if (cm && !this.collapsed) { regLineChange(cm, lineNo(line), "text"); }
+      else if (cm) {
+        if (span.to != null) { max = lineNo(line); }
+        if (span.from != null) { min = lineNo(line); }
+      }
+      line.markedSpans = removeMarkedSpan(line.markedSpans, span);
+      if (span.from == null && this.collapsed && !lineIsHidden(this.doc, line) && cm)
+        { updateLineHeight(line, textHeight(cm.display)); }
+    }
+    if (cm && this.collapsed && !cm.options.lineWrapping) { for (var i$1 = 0; i$1 < this.lines.length; ++i$1) {
+      var visual = visualLine(this.lines[i$1]), len = lineLength(visual);
+      if (len > cm.display.maxLineLength) {
+        cm.display.maxLine = visual;
+        cm.display.maxLineLength = len;
+        cm.display.maxLineChanged = true;
+      }
+    } }
+
+    if (min != null && cm && this.collapsed) { regChange(cm, min, max + 1); }
+    this.lines.length = 0;
+    this.explicitlyCleared = true;
+    if (this.atomic && this.doc.cantEdit) {
+      this.doc.cantEdit = false;
+      if (cm) { reCheckSelection(cm.doc); }
+    }
+    if (cm) { signalLater(cm, "markerCleared", cm, this, min, max); }
+    if (withOp) { endOperation(cm); }
+    if (this.parent) { this.parent.clear(); }
+  };
+
+  // Find the position of the marker in the document. Returns a {from,
+  // to} object by default. Side can be passed to get a specific side
+  // -- 0 (both), -1 (left), or 1 (right). When lineObj is true, the
+  // Pos objects returned contain a line object, rather than a line
+  // number (used to prevent looking up the same line twice).
+  TextMarker.prototype.find = function (side, lineObj) {
+    if (side == null && this.type == "bookmark") { side = 1; }
+    var from, to;
+    for (var i = 0; i < this.lines.length; ++i) {
+      var line = this.lines[i];
+      var span = getMarkedSpanFor(line.markedSpans, this);
+      if (span.from != null) {
+        from = Pos(lineObj ? line : lineNo(line), span.from);
+        if (side == -1) { return from }
+      }
+      if (span.to != null) {
+        to = Pos(lineObj ? line : lineNo(line), span.to);
+        if (side == 1) { return to }
+      }
+    }
+    return from && {from: from, to: to}
+  };
+
+  // Signals that the marker's widget changed, and surrounding layout
+  // should be recomputed.
+  TextMarker.prototype.changed = function () {
+      var this$1 = this;
+
+    var pos = this.find(-1, true), widget = this, cm = this.doc.cm;
+    if (!pos || !cm) { return }
+    runInOp(cm, function () {
+      var line = pos.line, lineN = lineNo(pos.line);
+      var view = findViewForLine(cm, lineN);
+      if (view) {
+        clearLineMeasurementCacheFor(view);
+        cm.curOp.selectionChanged = cm.curOp.forceUpdate = true;
+      }
+      cm.curOp.updateMaxLine = true;
+      if (!lineIsHidden(widget.doc, line) && widget.height != null) {
+        var oldHeight = widget.height;
+        widget.height = null;
+        var dHeight = widgetHeight(widget) - oldHeight;
+        if (dHeight)
+          { updateLineHeight(line, line.height + dHeight); }
+      }
+      signalLater(cm, "markerChanged", cm, this$1);
+    });
+  };
+
+  TextMarker.prototype.attachLine = function (line) {
+    if (!this.lines.length && this.doc.cm) {
+      var op = this.doc.cm.curOp;
+      if (!op.maybeHiddenMarkers || indexOf(op.maybeHiddenMarkers, this) == -1)
+        { (op.maybeUnhiddenMarkers || (op.maybeUnhiddenMarkers = [])).push(this); }
+    }
+    this.lines.push(line);
+  };
+
+  TextMarker.prototype.detachLine = function (line) {
+    this.lines.splice(indexOf(this.lines, line), 1);
+    if (!this.lines.length && this.doc.cm) {
+      var op = this.doc.cm.curOp
+      ;(op.maybeHiddenMarkers || (op.maybeHiddenMarkers = [])).push(this);
+    }
+  };
+  eventMixin(TextMarker);
+
+  // Create a marker, wire it up to the right lines, and
+  function markText(doc, from, to, options, type) {
+    // Shared markers (across linked documents) are handled separately
+    // (markTextShared will call out to this again, once per
+    // document).
+    if (options && options.shared) { return markTextShared(doc, from, to, options, type) }
+    // Ensure we are in an operation.
+    if (doc.cm && !doc.cm.curOp) { return operation(doc.cm, markText)(doc, from, to, options, type) }
+
+    var marker = new TextMarker(doc, type), diff = cmp(from, to);
+    if (options) { copyObj(options, marker, false); }
+    // Don't connect empty markers unless clearWhenEmpty is false
+    if (diff > 0 || diff == 0 && marker.clearWhenEmpty !== false)
+      { return marker }
+    if (marker.replacedWith) {
+      // Showing up as a widget implies collapsed (widget replaces text)
+      marker.collapsed = true;
+      marker.widgetNode = eltP("span", [marker.replacedWith], "CodeMirror-widget");
+      if (!options.handleMouseEvents) { marker.widgetNode.setAttribute("cm-ignore-events", "true"); }
+      if (options.insertLeft) { marker.widgetNode.insertLeft = true; }
+    }
+    if (marker.collapsed) {
+      if (conflictingCollapsedRange(doc, from.line, from, to, marker) ||
+          from.line != to.line && conflictingCollapsedRange(doc, to.line, from, to, marker))
+        { throw new Error("Inserting collapsed marker partially overlapping an existing one") }
+      seeCollapsedSpans();
+    }
+
+    if (marker.addToHistory)
+      { addChangeToHistory(doc, {from: from, to: to, origin: "markText"}, doc.sel, NaN); }
+
+    var curLine = from.line, cm = doc.cm, updateMaxLine;
+    doc.iter(curLine, to.line + 1, function (line) {
+      if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(line) == cm.display.maxLine)
+        { updateMaxLine = true; }
+      if (marker.collapsed && curLine != from.line) { updateLineHeight(line, 0); }
+      addMarkedSpan(line, new MarkedSpan(marker,
+                                         curLine == from.line ? from.ch : null,
+                                         curLine == to.line ? to.ch : null));
+      ++curLine;
+    });
+    // lineIsHidden depends on the presence of the spans, so needs a second pass
+    if (marker.collapsed) { doc.iter(from.line, to.line + 1, function (line) {
+      if (lineIsHidden(doc, line)) { updateLineHeight(line, 0); }
+    }); }
+
+    if (marker.clearOnEnter) { on(marker, "beforeCursorEnter", function () { return marker.clear(); }); }
+
+    if (marker.readOnly) {
+      seeReadOnlySpans();
+      if (doc.history.done.length || doc.history.undone.length)
+        { doc.clearHistory(); }
+    }
+    if (marker.collapsed) {
+      marker.id = ++nextMarkerId;
+      marker.atomic = true;
+    }
+    if (cm) {
+      // Sync editor state
+      if (updateMaxLine) { cm.curOp.updateMaxLine = true; }
+      if (marker.collapsed)
+        { regChange(cm, from.line, to.line + 1); }
+      else if (marker.className || marker.startStyle || marker.endStyle || marker.css ||
+               marker.attributes || marker.title)
+        { for (var i = from.line; i <= to.line; i++) { regLineChange(cm, i, "text"); } }
+      if (marker.atomic) { reCheckSelection(cm.doc); }
+      signalLater(cm, "markerAdded", cm, marker);
+    }
+    return marker
+  }
+
+  // SHARED TEXTMARKERS
+
+  // A shared marker spans multiple linked documents. It is
+  // implemented as a meta-marker-object controlling multiple normal
+  // markers.
+  var SharedTextMarker = function(markers, primary) {
+    this.markers = markers;
+    this.primary = primary;
+    for (var i = 0; i < markers.length; ++i)
+      { markers[i].parent = this; }
+  };
+
+  SharedTextMarker.prototype.clear = function () {
+    if (this.explicitlyCleared) { return }
+    this.explicitlyCleared = true;
+    for (var i = 0; i < this.markers.length; ++i)
+      { this.markers[i].clear(); }
+    signalLater(this, "clear");
+  };
+
+  SharedTextMarker.prototype.find = function (side, lineObj) {
+    return this.primary.find(side, lineObj)
+  };
+  eventMixin(SharedTextMarker);
+
+  function markTextShared(doc, from, to, options, type) {
+    options = copyObj(options);
+    options.shared = false;
+    var markers = [markText(doc, from, to, options, type)], primary = markers[0];
+    var widget = options.widgetNode;
+    linkedDocs(doc, function (doc) {
+      if (widget) { options.widgetNode = widget.cloneNode(true); }
+      markers.push(markText(doc, clipPos(doc, from), clipPos(doc, to), options, type));
+      for (var i = 0; i < doc.linked.length; ++i)
+        { if (doc.linked[i].isParent) { return } }
+      primary = lst(markers);
+    });
+    return new SharedTextMarker(markers, primary)
+  }
+
+  function findSharedMarkers(doc) {
+    return doc.findMarks(Pos(doc.first, 0), doc.clipPos(Pos(doc.lastLine())), function (m) { return m.parent; })
+  }
+
+  function copySharedMarkers(doc, markers) {
+    for (var i = 0; i < markers.length; i++) {
+      var marker = markers[i], pos = marker.find();
+      var mFrom = doc.clipPos(pos.from), mTo = doc.clipPos(pos.to);
+      if (cmp(mFrom, mTo)) {
+        var subMark = markText(doc, mFrom, mTo, marker.primary, marker.primary.type);
+        marker.markers.push(subMark);
+        subMark.parent = marker;
+      }
+    }
+  }
+
+  function detachSharedMarkers(markers) {
+    var loop = function ( i ) {
+      var marker = markers[i], linked = [marker.primary.doc];
+      linkedDocs(marker.primary.doc, function (d) { return linked.push(d); });
+      for (var j = 0; j < marker.markers.length; j++) {
+        var subMarker = marker.markers[j];
+        if (indexOf(linked, subMarker.doc) == -1) {
+          subMarker.parent = null;
+          marker.markers.splice(j--, 1);
+        }
+      }
+    };
+
+    for (var i = 0; i < markers.length; i++) loop( i );
+  }
+
+  var nextDocId = 0;
+  var Doc = function(text, mode, firstLine, lineSep, direction) {
+    if (!(this instanceof Doc)) { return new Doc(text, mode, firstLine, lineSep, direction) }
+    if (firstLine == null) { firstLine = 0; }
+
+    BranchChunk.call(this, [new LeafChunk([new Line("", null)])]);
+    this.first = firstLine;
+    this.scrollTop = this.scrollLeft = 0;
+    this.cantEdit = false;
+    this.cleanGeneration = 1;
+    this.modeFrontier = this.highlightFrontier = firstLine;
+    var start = Pos(firstLine, 0);
+    this.sel = simpleSelection(start);
+    this.history = new History(null);
+    this.id = ++nextDocId;
+    this.modeOption = mode;
+    this.lineSep = lineSep;
+    this.direction = (direction == "rtl") ? "rtl" : "ltr";
+    this.extend = false;
+
+    if (typeof text == "string") { text = this.splitLines(text); }
+    updateDoc(this, {from: start, to: start, text: text});
+    setSelection(this, simpleSelection(start), sel_dontScroll);
+  };
+
+  Doc.prototype = createObj(BranchChunk.prototype, {
+    constructor: Doc,
+    // Iterate over the document. Supports two forms -- with only one
+    // argument, it calls that for each line in the document. With
+    // three, it iterates over the range given by the first two (with
+    // the second being non-inclusive).
+    iter: function(from, to, op) {
+      if (op) { this.iterN(from - this.first, to - from, op); }
+      else { this.iterN(this.first, this.first + this.size, from); }
+    },
+
+    // Non-public interface for adding and removing lines.
+    insert: function(at, lines) {
+      var height = 0;
+      for (var i = 0; i < lines.length; ++i) { height += lines[i].height; }
+      this.insertInner(at - this.first, lines, height);
+    },
+    remove: function(at, n) { this.removeInner(at - this.first, n); },
+
+    // From here, the methods are part of the public interface. Most
+    // are also available from CodeMirror (editor) instances.
+
+    getValue: function(lineSep) {
+      var lines = getLines(this, this.first, this.first + this.size);
+      if (lineSep === false) { return lines }
+      return lines.join(lineSep || this.lineSeparator())
+    },
+    setValue: docMethodOp(function(code) {
+      var top = Pos(this.first, 0), last = this.first + this.size - 1;
+      makeChange(this, {from: top, to: Pos(last, getLine(this, last).text.length),
+                        text: this.splitLines(code), origin: "setValue", full: true}, true);
+      if (this.cm) { scrollToCoords(this.cm, 0, 0); }
+      setSelection(this, simpleSelection(top), sel_dontScroll);
+    }),
+    replaceRange: function(code, from, to, origin) {
+      from = clipPos(this, from);
+      to = to ? clipPos(this, to) : from;
+      replaceRange(this, code, from, to, origin);
+    },
+    getRange: function(from, to, lineSep) {
+      var lines = getBetween(this, clipPos(this, from), clipPos(this, to));
+      if (lineSep === false) { return lines }
+      return lines.join(lineSep || this.lineSeparator())
+    },
+
+    getLine: function(line) {var l = this.getLineHandle(line); return l && l.text},
+
+    getLineHandle: function(line) {if (isLine(this, line)) { return getLine(this, line) }},
+    getLineNumber: function(line) {return lineNo(line)},
+
+    getLineHandleVisualStart: function(line) {
+      if (typeof line == "number") { line = getLine(this, line); }
+      return visualLine(line)
+    },
+
+    lineCount: function() {return this.size},
+    firstLine: function() {return this.first},
+    lastLine: function() {return this.first + this.size - 1},
+
+    clipPos: function(pos) {return clipPos(this, pos)},
+
+    getCursor: function(start) {
+      var range = this.sel.primary(), pos;
+      if (start == null || start == "head") { pos = range.head; }
+      else if (start == "anchor") { pos = range.anchor; }
+      else if (start == "end" || start == "to" || start === false) { pos = range.to(); }
+      else { pos = range.from(); }
+      return pos
+    },
+    listSelections: function() { return this.sel.ranges },
+    somethingSelected: function() {return this.sel.somethingSelected()},
+
+    setCursor: docMethodOp(function(line, ch, options) {
+      setSimpleSelection(this, clipPos(this, typeof line == "number" ? Pos(line, ch || 0) : line), null, options);
+    }),
+    setSelection: docMethodOp(function(anchor, head, options) {
+      setSimpleSelection(this, clipPos(this, anchor), clipPos(this, head || anchor), options);
+    }),
+    extendSelection: docMethodOp(function(head, other, options) {
+      extendSelection(this, clipPos(this, head), other && clipPos(this, other), options);
+    }),
+    extendSelections: docMethodOp(function(heads, options) {
+      extendSelections(this, clipPosArray(this, heads), options);
+    }),
+    extendSelectionsBy: docMethodOp(function(f, options) {
+      var heads = map(this.sel.ranges, f);
+      extendSelections(this, clipPosArray(this, heads), options);
+    }),
+    setSelections: docMethodOp(function(ranges, primary, options) {
+      if (!ranges.length) { return }
+      var out = [];
+      for (var i = 0; i < ranges.length; i++)
+        { out[i] = new Range(clipPos(this, ranges[i].anchor),
+                           clipPos(this, ranges[i].head || ranges[i].anchor)); }
+      if (primary == null) { primary = Math.min(ranges.length - 1, this.sel.primIndex); }
+      setSelection(this, normalizeSelection(this.cm, out, primary), options);
+    }),
+    addSelection: docMethodOp(function(anchor, head, options) {
+      var ranges = this.sel.ranges.slice(0);
+      ranges.push(new Range(clipPos(this, anchor), clipPos(this, head || anchor)));
+      setSelection(this, normalizeSelection(this.cm, ranges, ranges.length - 1), options);
+    }),
+
+    getSelection: function(lineSep) {
+      var ranges = this.sel.ranges, lines;
+      for (var i = 0; i < ranges.length; i++) {
+        var sel = getBetween(this, ranges[i].from(), ranges[i].to());
+        lines = lines ? lines.concat(sel) : sel;
+      }
+      if (lineSep === false) { return lines }
+      else { return lines.join(lineSep || this.lineSeparator()) }
+    },
+    getSelections: function(lineSep) {
+      var parts = [], ranges = this.sel.ranges;
+      for (var i = 0; i < ranges.length; i++) {
+        var sel = getBetween(this, ranges[i].from(), ranges[i].to());
+        if (lineSep !== false) { sel = sel.join(lineSep || this.lineSeparator()); }
+        parts[i] = sel;
+      }
+      return parts
+    },
+    replaceSelection: function(code, collapse, origin) {
+      var dup = [];
+      for (var i = 0; i < this.sel.ranges.length; i++)
+        { dup[i] = code; }
+      this.replaceSelections(dup, collapse, origin || "+input");
+    },
+    replaceSelections: docMethodOp(function(code, collapse, origin) {
+      var changes = [], sel = this.sel;
+      for (var i = 0; i < sel.ranges.length; i++) {
+        var range = sel.ranges[i];
+        changes[i] = {from: range.from(), to: range.to(), text: this.splitLines(code[i]), origin: origin};
+      }
+      var newSel = collapse && collapse != "end" && computeReplacedSel(this, changes, collapse);
+      for (var i$1 = changes.length - 1; i$1 >= 0; i$1--)
+        { makeChange(this, changes[i$1]); }
+      if (newSel) { setSelectionReplaceHistory(this, newSel); }
+      else if (this.cm) { ensureCursorVisible(this.cm); }
+    }),
+    undo: docMethodOp(function() {makeChangeFromHistory(this, "undo");}),
+    redo: docMethodOp(function() {makeChangeFromHistory(this, "redo");}),
+    undoSelection: docMethodOp(function() {makeChangeFromHistory(this, "undo", true);}),
+    redoSelection: docMethodOp(function() {makeChangeFromHistory(this, "redo", true);}),
+
+    setExtending: function(val) {this.extend = val;},
+    getExtending: function() {return this.extend},
+
+    historySize: function() {
+      var hist = this.history, done = 0, undone = 0;
+      for (var i = 0; i < hist.done.length; i++) { if (!hist.done[i].ranges) { ++done; } }
+      for (var i$1 = 0; i$1 < hist.undone.length; i$1++) { if (!hist.undone[i$1].ranges) { ++undone; } }
+      return {undo: done, redo: undone}
+    },
+    clearHistory: function() {
+      var this$1 = this;
+
+      this.history = new History(this.history);
+      linkedDocs(this, function (doc) { return doc.history = this$1.history; }, true);
+    },
+
+    markClean: function() {
+      this.cleanGeneration = this.changeGeneration(true);
+    },
+    changeGeneration: function(forceSplit) {
+      if (forceSplit)
+        { this.history.lastOp = this.history.lastSelOp = this.history.lastOrigin = null; }
+      return this.history.generation
+    },
+    isClean: function (gen) {
+      return this.history.generation == (gen || this.cleanGeneration)
+    },
+
+    getHistory: function() {
+      return {done: copyHistoryArray(this.history.done),
+              undone: copyHistoryArray(this.history.undone)}
+    },
+    setHistory: function(histData) {
+      var hist = this.history = new History(this.history);
+      hist.done = copyHistoryArray(histData.done.slice(0), null, true);
+      hist.undone = copyHistoryArray(histData.undone.slice(0), null, true);
+    },
+
+    setGutterMarker: docMethodOp(function(line, gutterID, value) {
+      return changeLine(this, line, "gutter", function (line) {
+        var markers = line.gutterMarkers || (line.gutterMarkers = {});
+        markers[gutterID] = value;
+        if (!value && isEmpty(markers)) { line.gutterMarkers = null; }
+        return true
+      })
+    }),
+
+    clearGutter: docMethodOp(function(gutterID) {
+      var this$1 = this;
+
+      this.iter(function (line) {
+        if (line.gutterMarkers && line.gutterMarkers[gutterID]) {
+          changeLine(this$1, line, "gutter", function () {
+            line.gutterMarkers[gutterID] = null;
+            if (isEmpty(line.gutterMarkers)) { line.gutterMarkers = null; }
+            return true
+          });
+        }
+      });
+    }),
+
+    lineInfo: function(line) {
+      var n;
+      if (typeof line == "number") {
+        if (!isLine(this, line)) { return null }
+        n = line;
+        line = getLine(this, line);
+        if (!line) { return null }
+      } else {
+        n = lineNo(line);
+        if (n == null) { return null }
+      }
+      return {line: n, handle: line, text: line.text, gutterMarkers: line.gutterMarkers,
+              textClass: line.textClass, bgClass: line.bgClass, wrapClass: line.wrapClass,
+              widgets: line.widgets}
+    },
+
+    addLineClass: docMethodOp(function(handle, where, cls) {
+      return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function (line) {
+        var prop = where == "text" ? "textClass"
+                 : where == "background" ? "bgClass"
+                 : where == "gutter" ? "gutterClass" : "wrapClass";
+        if (!line[prop]) { line[prop] = cls; }
+        else if (classTest(cls).test(line[prop])) { return false }
+        else { line[prop] += " " + cls; }
+        return true
+      })
+    }),
+    removeLineClass: docMethodOp(function(handle, where, cls) {
+      return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function (line) {
+        var prop = where == "text" ? "textClass"
+                 : where == "background" ? "bgClass"
+                 : where == "gutter" ? "gutterClass" : "wrapClass";
+        var cur = line[prop];
+        if (!cur) { return false }
+        else if (cls == null) { line[prop] = null; }
+        else {
+          var found = cur.match(classTest(cls));
+          if (!found) { return false }
+          var end = found.index + found[0].length;
+          line[prop] = cur.slice(0, found.index) + (!found.index || end == cur.length ? "" : " ") + cur.slice(end) || null;
+        }
+        return true
+      })
+    }),
+
+    addLineWidget: docMethodOp(function(handle, node, options) {
+      return addLineWidget(this, handle, node, options)
+    }),
+    removeLineWidget: function(widget) { widget.clear(); },
+
+    markText: function(from, to, options) {
+      return markText(this, clipPos(this, from), clipPos(this, to), options, options && options.type || "range")
+    },
+    setBookmark: function(pos, options) {
+      var realOpts = {replacedWith: options && (options.nodeType == null ? options.widget : options),
+                      insertLeft: options && options.insertLeft,
+                      clearWhenEmpty: false, shared: options && options.shared,
+                      handleMouseEvents: options && options.handleMouseEvents};
+      pos = clipPos(this, pos);
+      return markText(this, pos, pos, realOpts, "bookmark")
+    },
+    findMarksAt: function(pos) {
+      pos = clipPos(this, pos);
+      var markers = [], spans = getLine(this, pos.line).markedSpans;
+      if (spans) { for (var i = 0; i < spans.length; ++i) {
+        var span = spans[i];
+        if ((span.from == null || span.from <= pos.ch) &&
+            (span.to == null || span.to >= pos.ch))
+          { markers.push(span.marker.parent || span.marker); }
+      } }
+      return markers
+    },
+    findMarks: function(from, to, filter) {
+      from = clipPos(this, from); to = clipPos(this, to);
+      var found = [], lineNo = from.line;
+      this.iter(from.line, to.line + 1, function (line) {
+        var spans = line.markedSpans;
+        if (spans) { for (var i = 0; i < spans.length; i++) {
+          var span = spans[i];
+          if (!(span.to != null && lineNo == from.line && from.ch >= span.to ||
+                span.from == null && lineNo != from.line ||
+                span.from != null && lineNo == to.line && span.from >= to.ch) &&
+              (!filter || filter(span.marker)))
+            { found.push(span.marker.parent || span.marker); }
+        } }
+        ++lineNo;
+      });
+      return found
+    },
+    getAllMarks: function() {
+      var markers = [];
+      this.iter(function (line) {
+        var sps = line.markedSpans;
+        if (sps) { for (var i = 0; i < sps.length; ++i)
+          { if (sps[i].from != null) { markers.push(sps[i].marker); } } }
+      });
+      return markers
+    },
+
+    posFromIndex: function(off) {
+      var ch, lineNo = this.first, sepSize = this.lineSeparator().length;
+      this.iter(function (line) {
+        var sz = line.text.length + sepSize;
+        if (sz > off) { ch = off; return true }
+        off -= sz;
+        ++lineNo;
+      });
+      return clipPos(this, Pos(lineNo, ch))
+    },
+    indexFromPos: function (coords) {
+      coords = clipPos(this, coords);
+      var index = coords.ch;
+      if (coords.line < this.first || coords.ch < 0) { return 0 }
+      var sepSize = this.lineSeparator().length;
+      this.iter(this.first, coords.line, function (line) { // iter aborts when callback returns a truthy value
+        index += line.text.length + sepSize;
+      });
+      return index
+    },
+
+    copy: function(copyHistory) {
+      var doc = new Doc(getLines(this, this.first, this.first + this.size),
+                        this.modeOption, this.first, this.lineSep, this.direction);
+      doc.scrollTop = this.scrollTop; doc.scrollLeft = this.scrollLeft;
+      doc.sel = this.sel;
+      doc.extend = false;
+      if (copyHistory) {
+        doc.history.undoDepth = this.history.undoDepth;
+        doc.setHistory(this.getHistory());
+      }
+      return doc
+    },
+
+    linkedDoc: function(options) {
+      if (!options) { options = {}; }
+      var from = this.first, to = this.first + this.size;
+      if (options.from != null && options.from > from) { from = options.from; }
+      if (options.to != null && options.to < to) { to = options.to; }
+      var copy = new Doc(getLines(this, from, to), options.mode || this.modeOption, from, this.lineSep, this.direction);
+      if (options.sharedHist) { copy.history = this.history
+      ; }(this.linked || (this.linked = [])).push({doc: copy, sharedHist: options.sharedHist});
+      copy.linked = [{doc: this, isParent: true, sharedHist: options.sharedHist}];
+      copySharedMarkers(copy, findSharedMarkers(this));
+      return copy
+    },
+    unlinkDoc: function(other) {
+      if (other instanceof CodeMirror) { other = other.doc; }
+      if (this.linked) { for (var i = 0; i < this.linked.length; ++i) {
+        var link = this.linked[i];
+        if (link.doc != other) { continue }
+        this.linked.splice(i, 1);
+        other.unlinkDoc(this);
+        detachSharedMarkers(findSharedMarkers(this));
+        break
+      } }
+      // If the histories were shared, split them again
+      if (other.history == this.history) {
+        var splitIds = [other.id];
+        linkedDocs(other, function (doc) { return splitIds.push(doc.id); }, true);
+        other.history = new History(null);
+        other.history.done = copyHistoryArray(this.history.done, splitIds);
+        other.history.undone = copyHistoryArray(this.history.undone, splitIds);
+      }
+    },
+    iterLinkedDocs: function(f) {linkedDocs(this, f);},
+
+    getMode: function() {return this.mode},
+    getEditor: function() {return this.cm},
+
+    splitLines: function(str) {
+      if (this.lineSep) { return str.split(this.lineSep) }
+      return splitLinesAuto(str)
+    },
+    lineSeparator: function() { return this.lineSep || "\n" },
+
+    setDirection: docMethodOp(function (dir) {
+      if (dir != "rtl") { dir = "ltr"; }
+      if (dir == this.direction) { return }
+      this.direction = dir;
+      this.iter(function (line) { return line.order = null; });
+      if (this.cm) { directionChanged(this.cm); }
+    })
+  });
+
+  // Public alias.
+  Doc.prototype.eachLine = Doc.prototype.iter;
+
+  // Kludge to work around strange IE behavior where it'll sometimes
+  // re-fire a series of drag-related events right after the drop (#1551)
+  var lastDrop = 0;
+
+  function onDrop(e) {
+    var cm = this;
+    clearDragCursor(cm);
+    if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e))
+      { return }
+    e_preventDefault(e);
+    if (ie) { lastDrop = +new Date; }
+    var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files;
+    if (!pos || cm.isReadOnly()) { return }
+    // Might be a file drop, in which case we simply extract the text
+    // and insert it.
+    if (files && files.length && window.FileReader && window.File) {
+      var n = files.length, text = Array(n), read = 0;
+      var markAsReadAndPasteIfAllFilesAreRead = function () {
+        if (++read == n) {
+          operation(cm, function () {
+            pos = clipPos(cm.doc, pos);
+            var change = {from: pos, to: pos,
+                          text: cm.doc.splitLines(
+                              text.filter(function (t) { return t != null; }).join(cm.doc.lineSeparator())),
+                          origin: "paste"};
+            makeChange(cm.doc, change);
+            setSelectionReplaceHistory(cm.doc, simpleSelection(clipPos(cm.doc, pos), clipPos(cm.doc, changeEnd(change))));
+          })();
+        }
+      };
+      var readTextFromFile = function (file, i) {
+        if (cm.options.allowDropFileTypes &&
+            indexOf(cm.options.allowDropFileTypes, file.type) == -1) {
+          markAsReadAndPasteIfAllFilesAreRead();
+          return
+        }
+        var reader = new FileReader;
+        reader.onerror = function () { return markAsReadAndPasteIfAllFilesAreRead(); };
+        reader.onload = function () {
+          var content = reader.result;
+          if (/[\x00-\x08\x0e-\x1f]{2}/.test(content)) {
+            markAsReadAndPasteIfAllFilesAreRead();
+            return
+          }
+          text[i] = content;
+          markAsReadAndPasteIfAllFilesAreRead();
+        };
+        reader.readAsText(file);
+      };
+      for (var i = 0; i < files.length; i++) { readTextFromFile(files[i], i); }
+    } else { // Normal drop
+      // Don't do a replace if the drop happened inside of the selected text.
+      if (cm.state.draggingText && cm.doc.sel.contains(pos) > -1) {
+        cm.state.draggingText(e);
+        // Ensure the editor is re-focused
+        setTimeout(function () { return cm.display.input.focus(); }, 20);
+        return
+      }
+      try {
+        var text$1 = e.dataTransfer.getData("Text");
+        if (text$1) {
+          var selected;
+          if (cm.state.draggingText && !cm.state.draggingText.copy)
+            { selected = cm.listSelections(); }
+          setSelectionNoUndo(cm.doc, simpleSelection(pos, pos));
+          if (selected) { for (var i$1 = 0; i$1 < selected.length; ++i$1)
+            { replaceRange(cm.doc, "", selected[i$1].anchor, selected[i$1].head, "drag"); } }
+          cm.replaceSelection(text$1, "around", "paste");
+          cm.display.input.focus();
+        }
+      }
+      catch(e$1){}
+    }
+  }
+
+  function onDragStart(cm, e) {
+    if (ie && (!cm.state.draggingText || +new Date - lastDrop < 100)) { e_stop(e); return }
+    if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) { return }
+
+    e.dataTransfer.setData("Text", cm.getSelection());
+    e.dataTransfer.effectAllowed = "copyMove";
+
+    // Use dummy image instead of default browsers image.
+    // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there.
+    if (e.dataTransfer.setDragImage && !safari) {
+      var img = elt("img", null, null, "position: fixed; left: 0; top: 0;");
+      img.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==";
+      if (presto) {
+        img.width = img.height = 1;
+        cm.display.wrapper.appendChild(img);
+        // Force a relayout, or Opera won't use our image for some obscure reason
+        img._top = img.offsetTop;
+      }
+      e.dataTransfer.setDragImage(img, 0, 0);
+      if (presto) { img.parentNode.removeChild(img); }
+    }
+  }
+
+  function onDragOver(cm, e) {
+    var pos = posFromMouse(cm, e);
+    if (!pos) { return }
+    var frag = document.createDocumentFragment();
+    drawSelectionCursor(cm, pos, frag);
+    if (!cm.display.dragCursor) {
+      cm.display.dragCursor = elt("div", null, "CodeMirror-cursors CodeMirror-dragcursors");
+      cm.display.lineSpace.insertBefore(cm.display.dragCursor, cm.display.cursorDiv);
+    }
+    removeChildrenAndAdd(cm.display.dragCursor, frag);
+  }
+
+  function clearDragCursor(cm) {
+    if (cm.display.dragCursor) {
+      cm.display.lineSpace.removeChild(cm.display.dragCursor);
+      cm.display.dragCursor = null;
+    }
+  }
+
+  // These must be handled carefully, because naively registering a
+  // handler for each editor will cause the editors to never be
+  // garbage collected.
+
+  function forEachCodeMirror(f) {
+    if (!document.getElementsByClassName) { return }
+    var byClass = document.getElementsByClassName("CodeMirror"), editors = [];
+    for (var i = 0; i < byClass.length; i++) {
+      var cm = byClass[i].CodeMirror;
+      if (cm) { editors.push(cm); }
+    }
+    if (editors.length) { editors[0].operation(function () {
+      for (var i = 0; i < editors.length; i++) { f(editors[i]); }
+    }); }
+  }
+
+  var globalsRegistered = false;
+  function ensureGlobalHandlers() {
+    if (globalsRegistered) { return }
+    registerGlobalHandlers();
+    globalsRegistered = true;
+  }
+  function registerGlobalHandlers() {
+    // When the window resizes, we need to refresh active editors.
+    var resizeTimer;
+    on(window, "resize", function () {
+      if (resizeTimer == null) { resizeTimer = setTimeout(function () {
+        resizeTimer = null;
+        forEachCodeMirror(onResize);
+      }, 100); }
+    });
+    // When the window loses focus, we want to show the editor as blurred
+    on(window, "blur", function () { return forEachCodeMirror(onBlur); });
+  }
+  // Called when the window resizes
+  function onResize(cm) {
+    var d = cm.display;
+    // Might be a text scaling operation, clear size caches.
+    d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null;
+    d.scrollbarsClipped = false;
+    cm.setSize();
+  }
+
+  var keyNames = {
+    3: "Pause", 8: "Backspace", 9: "Tab", 13: "Enter", 16: "Shift", 17: "Ctrl", 18: "Alt",
+    19: "Pause", 20: "CapsLock", 27: "Esc", 32: "Space", 33: "PageUp", 34: "PageDown", 35: "End",
+    36: "Home", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 44: "PrintScrn", 45: "Insert",
+    46: "Delete", 59: ";", 61: "=", 91: "Mod", 92: "Mod", 93: "Mod",
+    106: "*", 107: "=", 109: "-", 110: ".", 111: "/", 145: "ScrollLock",
+    173: "-", 186: ";", 187: "=", 188: ",", 189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\\",
+    221: "]", 222: "'", 224: "Mod", 63232: "Up", 63233: "Down", 63234: "Left", 63235: "Right", 63272: "Delete",
+    63273: "Home", 63275: "End", 63276: "PageUp", 63277: "PageDown", 63302: "Insert"
+  };
+
+  // Number keys
+  for (var i = 0; i < 10; i++) { keyNames[i + 48] = keyNames[i + 96] = String(i); }
+  // Alphabetic keys
+  for (var i$1 = 65; i$1 <= 90; i$1++) { keyNames[i$1] = String.fromCharCode(i$1); }
+  // Function keys
+  for (var i$2 = 1; i$2 <= 12; i$2++) { keyNames[i$2 + 111] = keyNames[i$2 + 63235] = "F" + i$2; }
+
+  var keyMap = {};
+
+  keyMap.basic = {
+    "Left": "goCharLeft", "Right": "goCharRight", "Up": "goLineUp", "Down": "goLineDown",
+    "End": "goLineEnd", "Home": "goLineStartSmart", "PageUp": "goPageUp", "PageDown": "goPageDown",
+    "Delete": "delCharAfter", "Backspace": "delCharBefore", "Shift-Backspace": "delCharBefore",
+    "Tab": "defaultTab", "Shift-Tab": "indentAuto",
+    "Enter": "newlineAndIndent", "Insert": "toggleOverwrite",
+    "Esc": "singleSelection"
+  };
+  // Note that the save and find-related commands aren't defined by
+  // default. User code or addons can define them. Unknown commands
+  // are simply ignored.
+  keyMap.pcDefault = {
+    "Ctrl-A": "selectAll", "Ctrl-D": "deleteLine", "Ctrl-Z": "undo", "Shift-Ctrl-Z": "redo", "Ctrl-Y": "redo",
+    "Ctrl-Home": "goDocStart", "Ctrl-End": "goDocEnd", "Ctrl-Up": "goLineUp", "Ctrl-Down": "goLineDown",
+    "Ctrl-Left": "goGroupLeft", "Ctrl-Right": "goGroupRight", "Alt-Left": "goLineStart", "Alt-Right": "goLineEnd",
+    "Ctrl-Backspace": "delGroupBefore", "Ctrl-Delete": "delGroupAfter", "Ctrl-S": "save", "Ctrl-F": "find",
+    "Ctrl-G": "findNext", "Shift-Ctrl-G": "findPrev", "Shift-Ctrl-F": "replace", "Shift-Ctrl-R": "replaceAll",
+    "Ctrl-[": "indentLess", "Ctrl-]": "indentMore",
+    "Ctrl-U": "undoSelection", "Shift-Ctrl-U": "redoSelection", "Alt-U": "redoSelection",
+    "fallthrough": "basic"
+  };
+  // Very basic readline/emacs-style bindings, which are standard on Mac.
+  keyMap.emacsy = {
+    "Ctrl-F": "goCharRight", "Ctrl-B": "goCharLeft", "Ctrl-P": "goLineUp", "Ctrl-N": "goLineDown",
+    "Ctrl-A": "goLineStart", "Ctrl-E": "goLineEnd", "Ctrl-V": "goPageDown", "Shift-Ctrl-V": "goPageUp",
+    "Ctrl-D": "delCharAfter", "Ctrl-H": "delCharBefore", "Alt-Backspace": "delWordBefore", "Ctrl-K": "killLine",
+    "Ctrl-T": "transposeChars", "Ctrl-O": "openLine"
+  };
+  keyMap.macDefault = {
+    "Cmd-A": "selectAll", "Cmd-D": "deleteLine", "Cmd-Z": "undo", "Shift-Cmd-Z": "redo", "Cmd-Y": "redo",
+    "Cmd-Home": "goDocStart", "Cmd-Up": "goDocStart", "Cmd-End": "goDocEnd", "Cmd-Down": "goDocEnd", "Alt-Left": "goGroupLeft",
+    "Alt-Right": "goGroupRight", "Cmd-Left": "goLineLeft", "Cmd-Right": "goLineRight", "Alt-Backspace": "delGroupBefore",
+    "Ctrl-Alt-Backspace": "delGroupAfter", "Alt-Delete": "delGroupAfter", "Cmd-S": "save", "Cmd-F": "find",
+    "Cmd-G": "findNext", "Shift-Cmd-G": "findPrev", "Cmd-Alt-F": "replace", "Shift-Cmd-Alt-F": "replaceAll",
+    "Cmd-[": "indentLess", "Cmd-]": "indentMore", "Cmd-Backspace": "delWrappedLineLeft", "Cmd-Delete": "delWrappedLineRight",
+    "Cmd-U": "undoSelection", "Shift-Cmd-U": "redoSelection", "Ctrl-Up": "goDocStart", "Ctrl-Down": "goDocEnd",
+    "fallthrough": ["basic", "emacsy"]
+  };
+  keyMap["default"] = mac ? keyMap.macDefault : keyMap.pcDefault;
+
+  // KEYMAP DISPATCH
+
+  function normalizeKeyName(name) {
+    var parts = name.split(/-(?!$)/);
+    name = parts[parts.length - 1];
+    var alt, ctrl, shift, cmd;
+    for (var i = 0; i < parts.length - 1; i++) {
+      var mod = parts[i];
+      if (/^(cmd|meta|m)$/i.test(mod)) { cmd = true; }
+      else if (/^a(lt)?$/i.test(mod)) { alt = true; }
+      else if (/^(c|ctrl|control)$/i.test(mod)) { ctrl = true; }
+      else if (/^s(hift)?$/i.test(mod)) { shift = true; }
+      else { throw new Error("Unrecognized modifier name: " + mod) }
+    }
+    if (alt) { name = "Alt-" + name; }
+    if (ctrl) { name = "Ctrl-" + name; }
+    if (cmd) { name = "Cmd-" + name; }
+    if (shift) { name = "Shift-" + name; }
+    return name
+  }
+
+  // This is a kludge to keep keymaps mostly working as raw objects
+  // (backwards compatibility) while at the same time support features
+  // like normalization and multi-stroke key bindings. It compiles a
+  // new normalized keymap, and then updates the old object to reflect
+  // this.
+  function normalizeKeyMap(keymap) {
+    var copy = {};
+    for (var keyname in keymap) { if (keymap.hasOwnProperty(keyname)) {
+      var value = keymap[keyname];
+      if (/^(name|fallthrough|(de|at)tach)$/.test(keyname)) { continue }
+      if (value == "...") { delete keymap[keyname]; continue }
+
+      var keys = map(keyname.split(" "), normalizeKeyName);
+      for (var i = 0; i < keys.length; i++) {
+        var val = (void 0), name = (void 0);
+        if (i == keys.length - 1) {
+          name = keys.join(" ");
+          val = value;
+        } else {
+          name = keys.slice(0, i + 1).join(" ");
+          val = "...";
+        }
+        var prev = copy[name];
+        if (!prev) { copy[name] = val; }
+        else if (prev != val) { throw new Error("Inconsistent bindings for " + name) }
+      }
+      delete keymap[keyname];
+    } }
+    for (var prop in copy) { keymap[prop] = copy[prop]; }
+    return keymap
+  }
+
+  function lookupKey(key, map, handle, context) {
+    map = getKeyMap(map);
+    var found = map.call ? map.call(key, context) : map[key];
+    if (found === false) { return "nothing" }
+    if (found === "...") { return "multi" }
+    if (found != null && handle(found)) { return "handled" }
+
+    if (map.fallthrough) {
+      if (Object.prototype.toString.call(map.fallthrough) != "[object Array]")
+        { return lookupKey(key, map.fallthrough, handle, context) }
+      for (var i = 0; i < map.fallthrough.length; i++) {
+        var result = lookupKey(key, map.fallthrough[i], handle, context);
+        if (result) { return result }
+      }
+    }
+  }
+
+  // Modifier key presses don't count as 'real' key presses for the
+  // purpose of keymap fallthrough.
+  function isModifierKey(value) {
+    var name = typeof value == "string" ? value : keyNames[value.keyCode];
+    return name == "Ctrl" || name == "Alt" || name == "Shift" || name == "Mod"
+  }
+
+  function addModifierNames(name, event, noShift) {
+    var base = name;
+    if (event.altKey && base != "Alt") { name = "Alt-" + name; }
+    if ((flipCtrlCmd ? event.metaKey : event.ctrlKey) && base != "Ctrl") { name = "Ctrl-" + name; }
+    if ((flipCtrlCmd ? event.ctrlKey : event.metaKey) && base != "Mod") { name = "Cmd-" + name; }
+    if (!noShift && event.shiftKey && base != "Shift") { name = "Shift-" + name; }
+    return name
+  }
+
+  // Look up the name of a key as indicated by an event object.
+  function keyName(event, noShift) {
+    if (presto && event.keyCode == 34 && event["char"]) { return false }
+    var name = keyNames[event.keyCode];
+    if (name == null || event.altGraphKey) { return false }
+    // Ctrl-ScrollLock has keyCode 3, same as Ctrl-Pause,
+    // so we'll use event.code when available (Chrome 48+, FF 38+, Safari 10.1+)
+    if (event.keyCode == 3 && event.code) { name = event.code; }
+    return addModifierNames(name, event, noShift)
+  }
+
+  function getKeyMap(val) {
+    return typeof val == "string" ? keyMap[val] : val
+  }
+
+  // Helper for deleting text near the selection(s), used to implement
+  // backspace, delete, and similar functionality.
+  function deleteNearSelection(cm, compute) {
+    var ranges = cm.doc.sel.ranges, kill = [];
+    // Build up a set of ranges to kill first, merging overlapping
+    // ranges.
+    for (var i = 0; i < ranges.length; i++) {
+      var toKill = compute(ranges[i]);
+      while (kill.length && cmp(toKill.from, lst(kill).to) <= 0) {
+        var replaced = kill.pop();
+        if (cmp(replaced.from, toKill.from) < 0) {
+          toKill.from = replaced.from;
+          break
+        }
+      }
+      kill.push(toKill);
+    }
+    // Next, remove those actual ranges.
+    runInOp(cm, function () {
+      for (var i = kill.length - 1; i >= 0; i--)
+        { replaceRange(cm.doc, "", kill[i].from, kill[i].to, "+delete"); }
+      ensureCursorVisible(cm);
+    });
+  }
+
+  function moveCharLogically(line, ch, dir) {
+    var target = skipExtendingChars(line.text, ch + dir, dir);
+    return target < 0 || target > line.text.length ? null : target
+  }
+
+  function moveLogically(line, start, dir) {
+    var ch = moveCharLogically(line, start.ch, dir);
+    return ch == null ? null : new Pos(start.line, ch, dir < 0 ? "after" : "before")
+  }
+
+  function endOfLine(visually, cm, lineObj, lineNo, dir) {
+    if (visually) {
+      if (cm.doc.direction == "rtl") { dir = -dir; }
+      var order = getOrder(lineObj, cm.doc.direction);
+      if (order) {
+        var part = dir < 0 ? lst(order) : order[0];
+        var moveInStorageOrder = (dir < 0) == (part.level == 1);
+        var sticky = moveInStorageOrder ? "after" : "before";
+        var ch;
+        // With a wrapped rtl chunk (possibly spanning multiple bidi parts),
+        // it could be that the last bidi part is not on the last visual line,
+        // since visual lines contain content order-consecutive chunks.
+        // Thus, in rtl, we are looking for the first (content-order) character
+        // in the rtl chunk that is on the last line (that is, the same line
+        // as the last (content-order) character).
+        if (part.level > 0 || cm.doc.direction == "rtl") {
+          var prep = prepareMeasureForLine(cm, lineObj);
+          ch = dir < 0 ? lineObj.text.length - 1 : 0;
+          var targetTop = measureCharPrepared(cm, prep, ch).top;
+          ch = findFirst(function (ch) { return measureCharPrepared(cm, prep, ch).top == targetTop; }, (dir < 0) == (part.level == 1) ? part.from : part.to - 1, ch);
+          if (sticky == "before") { ch = moveCharLogically(lineObj, ch, 1); }
+        } else { ch = dir < 0 ? part.to : part.from; }
+        return new Pos(lineNo, ch, sticky)
+      }
+    }
+    return new Pos(lineNo, dir < 0 ? lineObj.text.length : 0, dir < 0 ? "before" : "after")
+  }
+
+  function moveVisually(cm, line, start, dir) {
+    var bidi = getOrder(line, cm.doc.direction);
+    if (!bidi) { return moveLogically(line, start, dir) }
+    if (start.ch >= line.text.length) {
+      start.ch = line.text.length;
+      start.sticky = "before";
+    } else if (start.ch <= 0) {
+      start.ch = 0;
+      start.sticky = "after";
+    }
+    var partPos = getBidiPartAt(bidi, start.ch, start.sticky), part = bidi[partPos];
+    if (cm.doc.direction == "ltr" && part.level % 2 == 0 && (dir > 0 ? part.to > start.ch : part.from < start.ch)) {
+      // Case 1: We move within an ltr part in an ltr editor. Even with wrapped lines,
+      // nothing interesting happens.
+      return moveLogically(line, start, dir)
+    }
+
+    var mv = function (pos, dir) { return moveCharLogically(line, pos instanceof Pos ? pos.ch : pos, dir); };
+    var prep;
+    var getWrappedLineExtent = function (ch) {
+      if (!cm.options.lineWrapping) { return {begin: 0, end: line.text.length} }
+      prep = prep || prepareMeasureForLine(cm, line);
+      return wrappedLineExtentChar(cm, line, prep, ch)
+    };
+    var wrappedLineExtent = getWrappedLineExtent(start.sticky == "before" ? mv(start, -1) : start.ch);
+
+    if (cm.doc.direction == "rtl" || part.level == 1) {
+      var moveInStorageOrder = (part.level == 1) == (dir < 0);
+      var ch = mv(start, moveInStorageOrder ? 1 : -1);
+      if (ch != null && (!moveInStorageOrder ? ch >= part.from && ch >= wrappedLineExtent.begin : ch <= part.to && ch <= wrappedLineExtent.end)) {
+        // Case 2: We move within an rtl part or in an rtl editor on the same visual line
+        var sticky = moveInStorageOrder ? "before" : "after";
+        return new Pos(start.line, ch, sticky)
+      }
+    }
+
+    // Case 3: Could not move within this bidi part in this visual line, so leave
+    // the current bidi part
+
+    var searchInVisualLine = function (partPos, dir, wrappedLineExtent) {
+      var getRes = function (ch, moveInStorageOrder) { return moveInStorageOrder
+        ? new Pos(start.line, mv(ch, 1), "before")
+        : new Pos(start.line, ch, "after"); };
+
+      for (; partPos >= 0 && partPos < bidi.length; partPos += dir) {
+        var part = bidi[partPos];
+        var moveInStorageOrder = (dir > 0) == (part.level != 1);
+        var ch = moveInStorageOrder ? wrappedLineExtent.begin : mv(wrappedLineExtent.end, -1);
+        if (part.from <= ch && ch < part.to) { return getRes(ch, moveInStorageOrder) }
+        ch = moveInStorageOrder ? part.from : mv(part.to, -1);
+        if (wrappedLineExtent.begin <= ch && ch < wrappedLineExtent.end) { return getRes(ch, moveInStorageOrder) }
+      }
+    };
+
+    // Case 3a: Look for other bidi parts on the same visual line
+    var res = searchInVisualLine(partPos + dir, dir, wrappedLineExtent);
+    if (res) { return res }
+
+    // Case 3b: Look for other bidi parts on the next visual line
+    var nextCh = dir > 0 ? wrappedLineExtent.end : mv(wrappedLineExtent.begin, -1);
+    if (nextCh != null && !(dir > 0 && nextCh == line.text.length)) {
+      res = searchInVisualLine(dir > 0 ? 0 : bidi.length - 1, dir, getWrappedLineExtent(nextCh));
+      if (res) { return res }
+    }
+
+    // Case 4: Nowhere to move
+    return null
+  }
+
+  // Commands are parameter-less actions that can be performed on an
+  // editor, mostly used for keybindings.
+  var commands = {
+    selectAll: selectAll,
+    singleSelection: function (cm) { return cm.setSelection(cm.getCursor("anchor"), cm.getCursor("head"), sel_dontScroll); },
+    killLine: function (cm) { return deleteNearSelection(cm, function (range) {
+      if (range.empty()) {
+        var len = getLine(cm.doc, range.head.line).text.length;
+        if (range.head.ch == len && range.head.line < cm.lastLine())
+          { return {from: range.head, to: Pos(range.head.line + 1, 0)} }
+        else
+          { return {from: range.head, to: Pos(range.head.line, len)} }
+      } else {
+        return {from: range.from(), to: range.to()}
+      }
+    }); },
+    deleteLine: function (cm) { return deleteNearSelection(cm, function (range) { return ({
+      from: Pos(range.from().line, 0),
+      to: clipPos(cm.doc, Pos(range.to().line + 1, 0))
+    }); }); },
+    delLineLeft: function (cm) { return deleteNearSelection(cm, function (range) { return ({
+      from: Pos(range.from().line, 0), to: range.from()
+    }); }); },
+    delWrappedLineLeft: function (cm) { return deleteNearSelection(cm, function (range) {
+      var top = cm.charCoords(range.head, "div").top + 5;
+      var leftPos = cm.coordsChar({left: 0, top: top}, "div");
+      return {from: leftPos, to: range.from()}
+    }); },
+    delWrappedLineRight: function (cm) { return deleteNearSelection(cm, function (range) {
+      var top = cm.charCoords(range.head, "div").top + 5;
+      var rightPos = cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div");
+      return {from: range.from(), to: rightPos }
+    }); },
+    undo: function (cm) { return cm.undo(); },
+    redo: function (cm) { return cm.redo(); },
+    undoSelection: function (cm) { return cm.undoSelection(); },
+    redoSelection: function (cm) { return cm.redoSelection(); },
+    goDocStart: function (cm) { return cm.extendSelection(Pos(cm.firstLine(), 0)); },
+    goDocEnd: function (cm) { return cm.extendSelection(Pos(cm.lastLine())); },
+    goLineStart: function (cm) { return cm.extendSelectionsBy(function (range) { return lineStart(cm, range.head.line); },
+      {origin: "+move", bias: 1}
+    ); },
+    goLineStartSmart: function (cm) { return cm.extendSelectionsBy(function (range) { return lineStartSmart(cm, range.head); },
+      {origin: "+move", bias: 1}
+    ); },
+    goLineEnd: function (cm) { return cm.extendSelectionsBy(function (range) { return lineEnd(cm, range.head.line); },
+      {origin: "+move", bias: -1}
+    ); },
+    goLineRight: function (cm) { return cm.extendSelectionsBy(function (range) {
+      var top = cm.cursorCoords(range.head, "div").top + 5;
+      return cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div")
+    }, sel_move); },
+    goLineLeft: function (cm) { return cm.extendSelectionsBy(function (range) {
+      var top = cm.cursorCoords(range.head, "div").top + 5;
+      return cm.coordsChar({left: 0, top: top}, "div")
+    }, sel_move); },
+    goLineLeftSmart: function (cm) { return cm.extendSelectionsBy(function (range) {
+      var top = cm.cursorCoords(range.head, "div").top + 5;
+      var pos = cm.coordsChar({left: 0, top: top}, "div");
+      if (pos.ch < cm.getLine(pos.line).search(/\S/)) { return lineStartSmart(cm, range.head) }
+      return pos
+    }, sel_move); },
+    goLineUp: function (cm) { return cm.moveV(-1, "line"); },
+    goLineDown: function (cm) { return cm.moveV(1, "line"); },
+    goPageUp: function (cm) { return cm.moveV(-1, "page"); },
+    goPageDown: function (cm) { return cm.moveV(1, "page"); },
+    goCharLeft: function (cm) { return cm.moveH(-1, "char"); },
+    goCharRight: function (cm) { return cm.moveH(1, "char"); },
+    goColumnLeft: function (cm) { return cm.moveH(-1, "column"); },
+    goColumnRight: function (cm) { return cm.moveH(1, "column"); },
+    goWordLeft: function (cm) { return cm.moveH(-1, "word"); },
+    goGroupRight: function (cm) { return cm.moveH(1, "group"); },
+    goGroupLeft: function (cm) { return cm.moveH(-1, "group"); },
+    goWordRight: function (cm) { return cm.moveH(1, "word"); },
+    delCharBefore: function (cm) { return cm.deleteH(-1, "codepoint"); },
+    delCharAfter: function (cm) { return cm.deleteH(1, "char"); },
+    delWordBefore: function (cm) { return cm.deleteH(-1, "word"); },
+    delWordAfter: function (cm) { return cm.deleteH(1, "word"); },
+    delGroupBefore: function (cm) { return cm.deleteH(-1, "group"); },
+    delGroupAfter: function (cm) { return cm.deleteH(1, "group"); },
+    indentAuto: function (cm) { return cm.indentSelection("smart"); },
+    indentMore: function (cm) { return cm.indentSelection("add"); },
+    indentLess: function (cm) { return cm.indentSelection("subtract"); },
+    insertTab: function (cm) { return cm.replaceSelection("\t"); },
+    insertSoftTab: function (cm) {
+      var spaces = [], ranges = cm.listSelections(), tabSize = cm.options.tabSize;
+      for (var i = 0; i < ranges.length; i++) {
+        var pos = ranges[i].from();
+        var col = countColumn(cm.getLine(pos.line), pos.ch, tabSize);
+        spaces.push(spaceStr(tabSize - col % tabSize));
+      }
+      cm.replaceSelections(spaces);
+    },
+    defaultTab: function (cm) {
+      if (cm.somethingSelected()) { cm.indentSelection("add"); }
+      else { cm.execCommand("insertTab"); }
+    },
+    // Swap the two chars left and right of each selection's head.
+    // Move cursor behind the two swapped characters afterwards.
+    //
+    // Doesn't consider line feeds a character.
+    // Doesn't scan more than one line above to find a character.
+    // Doesn't do anything on an empty line.
+    // Doesn't do anything with non-empty selections.
+    transposeChars: function (cm) { return runInOp(cm, function () {
+      var ranges = cm.listSelections(), newSel = [];
+      for (var i = 0; i < ranges.length; i++) {
+        if (!ranges[i].empty()) { continue }
+        var cur = ranges[i].head, line = getLine(cm.doc, cur.line).text;
+        if (line) {
+          if (cur.ch == line.length) { cur = new Pos(cur.line, cur.ch - 1); }
+          if (cur.ch > 0) {
+            cur = new Pos(cur.line, cur.ch + 1);
+            cm.replaceRange(line.charAt(cur.ch - 1) + line.charAt(cur.ch - 2),
+                            Pos(cur.line, cur.ch - 2), cur, "+transpose");
+          } else if (cur.line > cm.doc.first) {
+            var prev = getLine(cm.doc, cur.line - 1).text;
+            if (prev) {
+              cur = new Pos(cur.line, 1);
+              cm.replaceRange(line.charAt(0) + cm.doc.lineSeparator() +
+                              prev.charAt(prev.length - 1),
+                              Pos(cur.line - 1, prev.length - 1), cur, "+transpose");
+            }
+          }
+        }
+        newSel.push(new Range(cur, cur));
+      }
+      cm.setSelections(newSel);
+    }); },
+    newlineAndIndent: function (cm) { return runInOp(cm, function () {
+      var sels = cm.listSelections();
+      for (var i = sels.length - 1; i >= 0; i--)
+        { cm.replaceRange(cm.doc.lineSeparator(), sels[i].anchor, sels[i].head, "+input"); }
+      sels = cm.listSelections();
+      for (var i$1 = 0; i$1 < sels.length; i$1++)
+        { cm.indentLine(sels[i$1].from().line, null, true); }
+      ensureCursorVisible(cm);
+    }); },
+    openLine: function (cm) { return cm.replaceSelection("\n", "start"); },
+    toggleOverwrite: function (cm) { return cm.toggleOverwrite(); }
+  };
+
+
+  function lineStart(cm, lineN) {
+    var line = getLine(cm.doc, lineN);
+    var visual = visualLine(line);
+    if (visual != line) { lineN = lineNo(visual); }
+    return endOfLine(true, cm, visual, lineN, 1)
+  }
+  function lineEnd(cm, lineN) {
+    var line = getLine(cm.doc, lineN);
+    var visual = visualLineEnd(line);
+    if (visual != line) { lineN = lineNo(visual); }
+    return endOfLine(true, cm, line, lineN, -1)
+  }
+  function lineStartSmart(cm, pos) {
+    var start = lineStart(cm, pos.line);
+    var line = getLine(cm.doc, start.line);
+    var order = getOrder(line, cm.doc.direction);
+    if (!order || order[0].level == 0) {
+      var firstNonWS = Math.max(start.ch, line.text.search(/\S/));
+      var inWS = pos.line == start.line && pos.ch <= firstNonWS && pos.ch;
+      return Pos(start.line, inWS ? 0 : firstNonWS, start.sticky)
+    }
+    return start
+  }
+
+  // Run a handler that was bound to a key.
+  function doHandleBinding(cm, bound, dropShift) {
+    if (typeof bound == "string") {
+      bound = commands[bound];
+      if (!bound) { return false }
+    }
+    // Ensure previous input has been read, so that the handler sees a
+    // consistent view of the document
+    cm.display.input.ensurePolled();
+    var prevShift = cm.display.shift, done = false;
+    try {
+      if (cm.isReadOnly()) { cm.state.suppressEdits = true; }
+      if (dropShift) { cm.display.shift = false; }
+      done = bound(cm) != Pass;
+    } finally {
+      cm.display.shift = prevShift;
+      cm.state.suppressEdits = false;
+    }
+    return done
+  }
+
+  function lookupKeyForEditor(cm, name, handle) {
+    for (var i = 0; i < cm.state.keyMaps.length; i++) {
+      var result = lookupKey(name, cm.state.keyMaps[i], handle, cm);
+      if (result) { return result }
+    }
+    return (cm.options.extraKeys && lookupKey(name, cm.options.extraKeys, handle, cm))
+      || lookupKey(name, cm.options.keyMap, handle, cm)
+  }
+
+  // Note that, despite the name, this function is also used to check
+  // for bound mouse clicks.
+
+  var stopSeq = new Delayed;
+
+  function dispatchKey(cm, name, e, handle) {
+    var seq = cm.state.keySeq;
+    if (seq) {
+      if (isModifierKey(name)) { return "handled" }
+      if (/\'$/.test(name))
+        { cm.state.keySeq = null; }
+      else
+        { stopSeq.set(50, function () {
+          if (cm.state.keySeq == seq) {
+            cm.state.keySeq = null;
+            cm.display.input.reset();
+          }
+        }); }
+      if (dispatchKeyInner(cm, seq + " " + name, e, handle)) { return true }
+    }
+    return dispatchKeyInner(cm, name, e, handle)
+  }
+
+  function dispatchKeyInner(cm, name, e, handle) {
+    var result = lookupKeyForEditor(cm, name, handle);
+
+    if (result == "multi")
+      { cm.state.keySeq = name; }
+    if (result == "handled")
+      { signalLater(cm, "keyHandled", cm, name, e); }
+
+    if (result == "handled" || result == "multi") {
+      e_preventDefault(e);
+      restartBlink(cm);
+    }
+
+    return !!result
+  }
+
+  // Handle a key from the keydown event.
+  function handleKeyBinding(cm, e) {
+    var name = keyName(e, true);
+    if (!name) { return false }
+
+    if (e.shiftKey && !cm.state.keySeq) {
+      // First try to resolve full name (including 'Shift-'). Failing
+      // that, see if there is a cursor-motion command (starting with
+      // 'go') bound to the keyname without 'Shift-'.
+      return dispatchKey(cm, "Shift-" + name, e, function (b) { return doHandleBinding(cm, b, true); })
+          || dispatchKey(cm, name, e, function (b) {
+               if (typeof b == "string" ? /^go[A-Z]/.test(b) : b.motion)
+                 { return doHandleBinding(cm, b) }
+             })
+    } else {
+      return dispatchKey(cm, name, e, function (b) { return doHandleBinding(cm, b); })
+    }
+  }
+
+  // Handle a key from the keypress event
+  function handleCharBinding(cm, e, ch) {
+    return dispatchKey(cm, "'" + ch + "'", e, function (b) { return doHandleBinding(cm, b, true); })
+  }
+
+  var lastStoppedKey = null;
+  function onKeyDown(e) {
+    var cm = this;
+    if (e.target && e.target != cm.display.input.getField()) { return }
+    cm.curOp.focus = activeElt();
+    if (signalDOMEvent(cm, e)) { return }
+    // IE does strange things with escape.
+    if (ie && ie_version < 11 && e.keyCode == 27) { e.returnValue = false; }
+    var code = e.keyCode;
+    cm.display.shift = code == 16 || e.shiftKey;
+    var handled = handleKeyBinding(cm, e);
+    if (presto) {
+      lastStoppedKey = handled ? code : null;
+      // Opera has no cut event... we try to at least catch the key combo
+      if (!handled && code == 88 && !hasCopyEvent && (mac ? e.metaKey : e.ctrlKey))
+        { cm.replaceSelection("", null, "cut"); }
+    }
+    if (gecko && !mac && !handled && code == 46 && e.shiftKey && !e.ctrlKey && document.execCommand)
+      { document.execCommand("cut"); }
+
+    // Turn mouse into crosshair when Alt is held on Mac.
+    if (code == 18 && !/\bCodeMirror-crosshair\b/.test(cm.display.lineDiv.className))
+      { showCrossHair(cm); }
+  }
+
+  function showCrossHair(cm) {
+    var lineDiv = cm.display.lineDiv;
+    addClass(lineDiv, "CodeMirror-crosshair");
+
+    function up(e) {
+      if (e.keyCode == 18 || !e.altKey) {
+        rmClass(lineDiv, "CodeMirror-crosshair");
+        off(document, "keyup", up);
+        off(document, "mouseover", up);
+      }
+    }
+    on(document, "keyup", up);
+    on(document, "mouseover", up);
+  }
+
+  function onKeyUp(e) {
+    if (e.keyCode == 16) { this.doc.sel.shift = false; }
+    signalDOMEvent(this, e);
+  }
+
+  function onKeyPress(e) {
+    var cm = this;
+    if (e.target && e.target != cm.display.input.getField()) { return }
+    if (eventInWidget(cm.display, e) || signalDOMEvent(cm, e) || e.ctrlKey && !e.altKey || mac && e.metaKey) { return }
+    var keyCode = e.keyCode, charCode = e.charCode;
+    if (presto && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return}
+    if ((presto && (!e.which || e.which < 10)) && handleKeyBinding(cm, e)) { return }
+    var ch = String.fromCharCode(charCode == null ? keyCode : charCode);
+    // Some browsers fire keypress events for backspace
+    if (ch == "\x08") { return }
+    if (handleCharBinding(cm, e, ch)) { return }
+    cm.display.input.onKeyPress(e);
+  }
+
+  var DOUBLECLICK_DELAY = 400;
+
+  var PastClick = function(time, pos, button) {
+    this.time = time;
+    this.pos = pos;
+    this.button = button;
+  };
+
+  PastClick.prototype.compare = function (time, pos, button) {
+    return this.time + DOUBLECLICK_DELAY > time &&
+      cmp(pos, this.pos) == 0 && button == this.button
+  };
+
+  var lastClick, lastDoubleClick;
+  function clickRepeat(pos, button) {
+    var now = +new Date;
+    if (lastDoubleClick && lastDoubleClick.compare(now, pos, button)) {
+      lastClick = lastDoubleClick = null;
+      return "triple"
+    } else if (lastClick && lastClick.compare(now, pos, button)) {
+      lastDoubleClick = new PastClick(now, pos, button);
+      lastClick = null;
+      return "double"
+    } else {
+      lastClick = new PastClick(now, pos, button);
+      lastDoubleClick = null;
+      return "single"
+    }
+  }
+
+  // A mouse down can be a single click, double click, triple click,
+  // start of selection drag, start of text drag, new cursor
+  // (ctrl-click), rectangle drag (alt-drag), or xwin
+  // middle-click-paste. Or it might be a click on something we should
+  // not interfere with, such as a scrollbar or widget.
+  function onMouseDown(e) {
+    var cm = this, display = cm.display;
+    if (signalDOMEvent(cm, e) || display.activeTouch && display.input.supportsTouch()) { return }
+    display.input.ensurePolled();
+    display.shift = e.shiftKey;
+
+    if (eventInWidget(display, e)) {
+      if (!webkit) {
+        // Briefly turn off draggability, to allow widgets to do
+        // normal dragging things.
+        display.scroller.draggable = false;
+        setTimeout(function () { return display.scroller.draggable = true; }, 100);
+      }
+      return
+    }
+    if (clickInGutter(cm, e)) { return }
+    var pos = posFromMouse(cm, e), button = e_button(e), repeat = pos ? clickRepeat(pos, button) : "single";
+    window.focus();
+
+    // #3261: make sure, that we're not starting a second selection
+    if (button == 1 && cm.state.selectingText)
+      { cm.state.selectingText(e); }
+
+    if (pos && handleMappedButton(cm, button, pos, repeat, e)) { return }
+
+    if (button == 1) {
+      if (pos) { leftButtonDown(cm, pos, repeat, e); }
+      else if (e_target(e) == display.scroller) { e_preventDefault(e); }
+    } else if (button == 2) {
+      if (pos) { extendSelection(cm.doc, pos); }
+      setTimeout(function () { return display.input.focus(); }, 20);
+    } else if (button == 3) {
+      if (captureRightClick) { cm.display.input.onContextMenu(e); }
+      else { delayBlurEvent(cm); }
+    }
+  }
+
+  function handleMappedButton(cm, button, pos, repeat, event) {
+    var name = "Click";
+    if (repeat == "double") { name = "Double" + name; }
+    else if (repeat == "triple") { name = "Triple" + name; }
+    name = (button == 1 ? "Left" : button == 2 ? "Middle" : "Right") + name;
+
+    return dispatchKey(cm,  addModifierNames(name, event), event, function (bound) {
+      if (typeof bound == "string") { bound = commands[bound]; }
+      if (!bound) { return false }
+      var done = false;
+      try {
+        if (cm.isReadOnly()) { cm.state.suppressEdits = true; }
+        done = bound(cm, pos) != Pass;
+      } finally {
+        cm.state.suppressEdits = false;
+      }
+      return done
+    })
+  }
+
+  function configureMouse(cm, repeat, event) {
+    var option = cm.getOption("configureMouse");
+    var value = option ? option(cm, repeat, event) : {};
+    if (value.unit == null) {
+      var rect = chromeOS ? event.shiftKey && event.metaKey : event.altKey;
+      value.unit = rect ? "rectangle" : repeat == "single" ? "char" : repeat == "double" ? "word" : "line";
+    }
+    if (value.extend == null || cm.doc.extend) { value.extend = cm.doc.extend || event.shiftKey; }
+    if (value.addNew == null) { value.addNew = mac ? event.metaKey : event.ctrlKey; }
+    if (value.moveOnDrag == null) { value.moveOnDrag = !(mac ? event.altKey : event.ctrlKey); }
+    return value
+  }
+
+  function leftButtonDown(cm, pos, repeat, event) {
+    if (ie) { setTimeout(bind(ensureFocus, cm), 0); }
+    else { cm.curOp.focus = activeElt(); }
+
+    var behavior = configureMouse(cm, repeat, event);
+
+    var sel = cm.doc.sel, contained;
+    if (cm.options.dragDrop && dragAndDrop && !cm.isReadOnly() &&
+        repeat == "single" && (contained = sel.contains(pos)) > -1 &&
+        (cmp((contained = sel.ranges[contained]).from(), pos) < 0 || pos.xRel > 0) &&
+        (cmp(contained.to(), pos) > 0 || pos.xRel < 0))
+      { leftButtonStartDrag(cm, event, pos, behavior); }
+    else
+      { leftButtonSelect(cm, event, pos, behavior); }
+  }
+
+  // Start a text drag. When it ends, see if any dragging actually
+  // happen, and treat as a click if it didn't.
+  function leftButtonStartDrag(cm, event, pos, behavior) {
+    var display = cm.display, moved = false;
+    var dragEnd = operation(cm, function (e) {
+      if (webkit) { display.scroller.draggable = false; }
+      cm.state.draggingText = false;
+      if (cm.state.delayingBlurEvent) {
+        if (cm.hasFocus()) { cm.state.delayingBlurEvent = false; }
+        else { delayBlurEvent(cm); }
+      }
+      off(display.wrapper.ownerDocument, "mouseup", dragEnd);
+      off(display.wrapper.ownerDocument, "mousemove", mouseMove);
+      off(display.scroller, "dragstart", dragStart);
+      off(display.scroller, "drop", dragEnd);
+      if (!moved) {
+        e_preventDefault(e);
+        if (!behavior.addNew)
+          { extendSelection(cm.doc, pos, null, null, behavior.extend); }
+        // Work around unexplainable focus problem in IE9 (#2127) and Chrome (#3081)
+        if ((webkit && !safari) || ie && ie_version == 9)
+          { setTimeout(function () {display.wrapper.ownerDocument.body.focus({preventScroll: true}); display.input.focus();}, 20); }
+        else
+          { display.input.focus(); }
+      }
+    });
+    var mouseMove = function(e2) {
+      moved = moved || Math.abs(event.clientX - e2.clientX) + Math.abs(event.clientY - e2.clientY) >= 10;
+    };
+    var dragStart = function () { return moved = true; };
+    // Let the drag handler handle this.
+    if (webkit) { display.scroller.draggable = true; }
+    cm.state.draggingText = dragEnd;
+    dragEnd.copy = !behavior.moveOnDrag;
+    on(display.wrapper.ownerDocument, "mouseup", dragEnd);
+    on(display.wrapper.ownerDocument, "mousemove", mouseMove);
+    on(display.scroller, "dragstart", dragStart);
+    on(display.scroller, "drop", dragEnd);
+
+    cm.state.delayingBlurEvent = true;
+    setTimeout(function () { return display.input.focus(); }, 20);
+    // IE's approach to draggable
+    if (display.scroller.dragDrop) { display.scroller.dragDrop(); }
+  }
+
+  function rangeForUnit(cm, pos, unit) {
+    if (unit == "char") { return new Range(pos, pos) }
+    if (unit == "word") { return cm.findWordAt(pos) }
+    if (unit == "line") { return new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))) }
+    var result = unit(cm, pos);
+    return new Range(result.from, result.to)
+  }
+
+  // Normal selection, as opposed to text dragging.
+  function leftButtonSelect(cm, event, start, behavior) {
+    if (ie) { delayBlurEvent(cm); }
+    var display = cm.display, doc = cm.doc;
+    e_preventDefault(event);
+
+    var ourRange, ourIndex, startSel = doc.sel, ranges = startSel.ranges;
+    if (behavior.addNew && !behavior.extend) {
+      ourIndex = doc.sel.contains(start);
+      if (ourIndex > -1)
+        { ourRange = ranges[ourIndex]; }
+      else
+        { ourRange = new Range(start, start); }
+    } else {
+      ourRange = doc.sel.primary();
+      ourIndex = doc.sel.primIndex;
+    }
+
+    if (behavior.unit == "rectangle") {
+      if (!behavior.addNew) { ourRange = new Range(start, start); }
+      start = posFromMouse(cm, event, true, true);
+      ourIndex = -1;
+    } else {
+      var range = rangeForUnit(cm, start, behavior.unit);
+      if (behavior.extend)
+        { ourRange = extendRange(ourRange, range.anchor, range.head, behavior.extend); }
+      else
+        { ourRange = range; }
+    }
+
+    if (!behavior.addNew) {
+      ourIndex = 0;
+      setSelection(doc, new Selection([ourRange], 0), sel_mouse);
+      startSel = doc.sel;
+    } else if (ourIndex == -1) {
+      ourIndex = ranges.length;
+      setSelection(doc, normalizeSelection(cm, ranges.concat([ourRange]), ourIndex),
+                   {scroll: false, origin: "*mouse"});
+    } else if (ranges.length > 1 && ranges[ourIndex].empty() && behavior.unit == "char" && !behavior.extend) {
+      setSelection(doc, normalizeSelection(cm, ranges.slice(0, ourIndex).concat(ranges.slice(ourIndex + 1)), 0),
+                   {scroll: false, origin: "*mouse"});
+      startSel = doc.sel;
+    } else {
+      replaceOneSelection(doc, ourIndex, ourRange, sel_mouse);
+    }
+
+    var lastPos = start;
+    function extendTo(pos) {
+      if (cmp(lastPos, pos) == 0) { return }
+      lastPos = pos;
+
+      if (behavior.unit == "rectangle") {
+        var ranges = [], tabSize = cm.options.tabSize;
+        var startCol = countColumn(getLine(doc, start.line).text, start.ch, tabSize);
+        var posCol = countColumn(getLine(doc, pos.line).text, pos.ch, tabSize);
+        var left = Math.min(startCol, posCol), right = Math.max(startCol, posCol);
+        for (var line = Math.min(start.line, pos.line), end = Math.min(cm.lastLine(), Math.max(start.line, pos.line));
+             line <= end; line++) {
+          var text = getLine(doc, line).text, leftPos = findColumn(text, left, tabSize);
+          if (left == right)
+            { ranges.push(new Range(Pos(line, leftPos), Pos(line, leftPos))); }
+          else if (text.length > leftPos)
+            { ranges.push(new Range(Pos(line, leftPos), Pos(line, findColumn(text, right, tabSize)))); }
+        }
+        if (!ranges.length) { ranges.push(new Range(start, start)); }
+        setSelection(doc, normalizeSelection(cm, startSel.ranges.slice(0, ourIndex).concat(ranges), ourIndex),
+                     {origin: "*mouse", scroll: false});
+        cm.scrollIntoView(pos);
+      } else {
+        var oldRange = ourRange;
+        var range = rangeForUnit(cm, pos, behavior.unit);
+        var anchor = oldRange.anchor, head;
+        if (cmp(range.anchor, anchor) > 0) {
+          head = range.head;
+          anchor = minPos(oldRange.from(), range.anchor);
+        } else {
+          head = range.anchor;
+          anchor = maxPos(oldRange.to(), range.head);
+        }
+        var ranges$1 = startSel.ranges.slice(0);
+        ranges$1[ourIndex] = bidiSimplify(cm, new Range(clipPos(doc, anchor), head));
+        setSelection(doc, normalizeSelection(cm, ranges$1, ourIndex), sel_mouse);
+      }
+    }
+
+    var editorSize = display.wrapper.getBoundingClientRect();
+    // Used to ensure timeout re-tries don't fire when another extend
+    // happened in the meantime (clearTimeout isn't reliable -- at
+    // least on Chrome, the timeouts still happen even when cleared,
+    // if the clear happens after their scheduled firing time).
+    var counter = 0;
+
+    function extend(e) {
+      var curCount = ++counter;
+      var cur = posFromMouse(cm, e, true, behavior.unit == "rectangle");
+      if (!cur) { return }
+      if (cmp(cur, lastPos) != 0) {
+        cm.curOp.focus = activeElt();
+        extendTo(cur);
+        var visible = visibleLines(display, doc);
+        if (cur.line >= visible.to || cur.line < visible.from)
+          { setTimeout(operation(cm, function () {if (counter == curCount) { extend(e); }}), 150); }
+      } else {
+        var outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0;
+        if (outside) { setTimeout(operation(cm, function () {
+          if (counter != curCount) { return }
+          display.scroller.scrollTop += outside;
+          extend(e);
+        }), 50); }
+      }
+    }
+
+    function done(e) {
+      cm.state.selectingText = false;
+      counter = Infinity;
+      // If e is null or undefined we interpret this as someone trying
+      // to explicitly cancel the selection rather than the user
+      // letting go of the mouse button.
+      if (e) {
+        e_preventDefault(e);
+        display.input.focus();
+      }
+      off(display.wrapper.ownerDocument, "mousemove", move);
+      off(display.wrapper.ownerDocument, "mouseup", up);
+      doc.history.lastSelOrigin = null;
+    }
+
+    var move = operation(cm, function (e) {
+      if (e.buttons === 0 || !e_button(e)) { done(e); }
+      else { extend(e); }
+    });
+    var up = operation(cm, done);
+    cm.state.selectingText = up;
+    on(display.wrapper.ownerDocument, "mousemove", move);
+    on(display.wrapper.ownerDocument, "mouseup", up);
+  }
+
+  // Used when mouse-selecting to adjust the anchor to the proper side
+  // of a bidi jump depending on the visual position of the head.
+  function bidiSimplify(cm, range) {
+    var anchor = range.anchor;
+    var head = range.head;
+    var anchorLine = getLine(cm.doc, anchor.line);
+    if (cmp(anchor, head) == 0 && anchor.sticky == head.sticky) { return range }
+    var order = getOrder(anchorLine);
+    if (!order) { return range }
+    var index = getBidiPartAt(order, anchor.ch, anchor.sticky), part = order[index];
+    if (part.from != anchor.ch && part.to != anchor.ch) { return range }
+    var boundary = index + ((part.from == anchor.ch) == (part.level != 1) ? 0 : 1);
+    if (boundary == 0 || boundary == order.length) { return range }
+
+    // Compute the relative visual position of the head compared to the
+    // anchor (<0 is to the left, >0 to the right)
+    var leftSide;
+    if (head.line != anchor.line) {
+      leftSide = (head.line - anchor.line) * (cm.doc.direction == "ltr" ? 1 : -1) > 0;
+    } else {
+      var headIndex = getBidiPartAt(order, head.ch, head.sticky);
+      var dir = headIndex - index || (head.ch - anchor.ch) * (part.level == 1 ? -1 : 1);
+      if (headIndex == boundary - 1 || headIndex == boundary)
+        { leftSide = dir < 0; }
+      else
+        { leftSide = dir > 0; }
+    }
+
+    var usePart = order[boundary + (leftSide ? -1 : 0)];
+    var from = leftSide == (usePart.level == 1);
+    var ch = from ? usePart.from : usePart.to, sticky = from ? "after" : "before";
+    return anchor.ch == ch && anchor.sticky == sticky ? range : new Range(new Pos(anchor.line, ch, sticky), head)
+  }
+
+
+  // Determines whether an event happened in the gutter, and fires the
+  // handlers for the corresponding event.
+  function gutterEvent(cm, e, type, prevent) {
+    var mX, mY;
+    if (e.touches) {
+      mX = e.touches[0].clientX;
+      mY = e.touches[0].clientY;
+    } else {
+      try { mX = e.clientX; mY = e.clientY; }
+      catch(e$1) { return false }
+    }
+    if (mX >= Math.floor(cm.display.gutters.getBoundingClientRect().right)) { return false }
+    if (prevent) { e_preventDefault(e); }
+
+    var display = cm.display;
+    var lineBox = display.lineDiv.getBoundingClientRect();
+
+    if (mY > lineBox.bottom || !hasHandler(cm, type)) { return e_defaultPrevented(e) }
+    mY -= lineBox.top - display.viewOffset;
+
+    for (var i = 0; i < cm.display.gutterSpecs.length; ++i) {
+      var g = display.gutters.childNodes[i];
+      if (g && g.getBoundingClientRect().right >= mX) {
+        var line = lineAtHeight(cm.doc, mY);
+        var gutter = cm.display.gutterSpecs[i];
+        signal(cm, type, cm, line, gutter.className, e);
+        return e_defaultPrevented(e)
+      }
+    }
+  }
+
+  function clickInGutter(cm, e) {
+    return gutterEvent(cm, e, "gutterClick", true)
+  }
+
+  // CONTEXT MENU HANDLING
+
+  // To make the context menu work, we need to briefly unhide the
+  // textarea (making it as unobtrusive as possible) to let the
+  // right-click take effect on it.
+  function onContextMenu(cm, e) {
+    if (eventInWidget(cm.display, e) || contextMenuInGutter(cm, e)) { return }
+    if (signalDOMEvent(cm, e, "contextmenu")) { return }
+    if (!captureRightClick) { cm.display.input.onContextMenu(e); }
+  }
+
+  function contextMenuInGutter(cm, e) {
+    if (!hasHandler(cm, "gutterContextMenu")) { return false }
+    return gutterEvent(cm, e, "gutterContextMenu", false)
+  }
+
+  function themeChanged(cm) {
+    cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-s-\S+/g, "") +
+      cm.options.theme.replace(/(^|\s)\s*/g, " cm-s-");
+    clearCaches(cm);
+  }
+
+  var Init = {toString: function(){return "CodeMirror.Init"}};
+
+  var defaults = {};
+  var optionHandlers = {};
+
+  function defineOptions(CodeMirror) {
+    var optionHandlers = CodeMirror.optionHandlers;
+
+    function option(name, deflt, handle, notOnInit) {
+      CodeMirror.defaults[name] = deflt;
+      if (handle) { optionHandlers[name] =
+        notOnInit ? function (cm, val, old) {if (old != Init) { handle(cm, val, old); }} : handle; }
+    }
+
+    CodeMirror.defineOption = option;
+
+    // Passed to option handlers when there is no old value.
+    CodeMirror.Init = Init;
+
+    // These two are, on init, called from the constructor because they
+    // have to be initialized before the editor can start at all.
+    option("value", "", function (cm, val) { return cm.setValue(val); }, true);
+    option("mode", null, function (cm, val) {
+      cm.doc.modeOption = val;
+      loadMode(cm);
+    }, true);
+
+    option("indentUnit", 2, loadMode, true);
+    option("indentWithTabs", false);
+    option("smartIndent", true);
+    option("tabSize", 4, function (cm) {
+      resetModeState(cm);
+      clearCaches(cm);
+      regChange(cm);
+    }, true);
+
+    option("lineSeparator", null, function (cm, val) {
+      cm.doc.lineSep = val;
+      if (!val) { return }
+      var newBreaks = [], lineNo = cm.doc.first;
+      cm.doc.iter(function (line) {
+        for (var pos = 0;;) {
+          var found = line.text.indexOf(val, pos);
+          if (found == -1) { break }
+          pos = found + val.length;
+          newBreaks.push(Pos(lineNo, found));
+        }
+        lineNo++;
+      });
+      for (var i = newBreaks.length - 1; i >= 0; i--)
+        { replaceRange(cm.doc, val, newBreaks[i], Pos(newBreaks[i].line, newBreaks[i].ch + val.length)); }
+    });
+    option("specialChars", /[\u0000-\u001f\u007f-\u009f\u00ad\u061c\u200b\u200e\u200f\u2028\u2029\ufeff\ufff9-\ufffc]/g, function (cm, val, old) {
+      cm.state.specialChars = new RegExp(val.source + (val.test("\t") ? "" : "|\t"), "g");
+      if (old != Init) { cm.refresh(); }
+    });
+    option("specialCharPlaceholder", defaultSpecialCharPlaceholder, function (cm) { return cm.refresh(); }, true);
+    option("electricChars", true);
+    option("inputStyle", mobile ? "contenteditable" : "textarea", function () {
+      throw new Error("inputStyle can not (yet) be changed in a running editor") // FIXME
+    }, true);
+    option("spellcheck", false, function (cm, val) { return cm.getInputField().spellcheck = val; }, true);
+    option("autocorrect", false, function (cm, val) { return cm.getInputField().autocorrect = val; }, true);
+    option("autocapitalize", false, function (cm, val) { return cm.getInputField().autocapitalize = val; }, true);
+    option("rtlMoveVisually", !windows);
+    option("wholeLineUpdateBefore", true);
+
+    option("theme", "default", function (cm) {
+      themeChanged(cm);
+      updateGutters(cm);
+    }, true);
+    option("keyMap", "default", function (cm, val, old) {
+      var next = getKeyMap(val);
+      var prev = old != Init && getKeyMap(old);
+      if (prev && prev.detach) { prev.detach(cm, next); }
+      if (next.attach) { next.attach(cm, prev || null); }
+    });
+    option("extraKeys", null);
+    option("configureMouse", null);
+
+    option("lineWrapping", false, wrappingChanged, true);
+    option("gutters", [], function (cm, val) {
+      cm.display.gutterSpecs = getGutters(val, cm.options.lineNumbers);
+      updateGutters(cm);
+    }, true);
+    option("fixedGutter", true, function (cm, val) {
+      cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + "px" : "0";
+      cm.refresh();
+    }, true);
+    option("coverGutterNextToScrollbar", false, function (cm) { return updateScrollbars(cm); }, true);
+    option("scrollbarStyle", "native", function (cm) {
+      initScrollbars(cm);
+      updateScrollbars(cm);
+      cm.display.scrollbars.setScrollTop(cm.doc.scrollTop);
+      cm.display.scrollbars.setScrollLeft(cm.doc.scrollLeft);
+    }, true);
+    option("lineNumbers", false, function (cm, val) {
+      cm.display.gutterSpecs = getGutters(cm.options.gutters, val);
+      updateGutters(cm);
+    }, true);
+    option("firstLineNumber", 1, updateGutters, true);
+    option("lineNumberFormatter", function (integer) { return integer; }, updateGutters, true);
+    option("showCursorWhenSelecting", false, updateSelection, true);
+
+    option("resetSelectionOnContextMenu", true);
+    option("lineWiseCopyCut", true);
+    option("pasteLinesPerSelection", true);
+    option("selectionsMayTouch", false);
+
+    option("readOnly", false, function (cm, val) {
+      if (val == "nocursor") {
+        onBlur(cm);
+        cm.display.input.blur();
+      }
+      cm.display.input.readOnlyChanged(val);
+    });
+
+    option("screenReaderLabel", null, function (cm, val) {
+      val = (val === '') ? null : val;
+      cm.display.input.screenReaderLabelChanged(val);
+    });
+
+    option("disableInput", false, function (cm, val) {if (!val) { cm.display.input.reset(); }}, true);
+    option("dragDrop", true, dragDropChanged);
+    option("allowDropFileTypes", null);
+
+    option("cursorBlinkRate", 530);
+    option("cursorScrollMargin", 0);
+    option("cursorHeight", 1, updateSelection, true);
+    option("singleCursorHeightPerLine", true, updateSelection, true);
+    option("workTime", 100);
+    option("workDelay", 100);
+    option("flattenSpans", true, resetModeState, true);
+    option("addModeClass", false, resetModeState, true);
+    option("pollInterval", 100);
+    option("undoDepth", 200, function (cm, val) { return cm.doc.history.undoDepth = val; });
+    option("historyEventDelay", 1250);
+    option("viewportMargin", 10, function (cm) { return cm.refresh(); }, true);
+    option("maxHighlightLength", 10000, resetModeState, true);
+    option("moveInputWithCursor", true, function (cm, val) {
+      if (!val) { cm.display.input.resetPosition(); }
+    });
+
+    option("tabindex", null, function (cm, val) { return cm.display.input.getField().tabIndex = val || ""; });
+    option("autofocus", null);
+    option("direction", "ltr", function (cm, val) { return cm.doc.setDirection(val); }, true);
+    option("phrases", null);
+  }
+
+  function dragDropChanged(cm, value, old) {
+    var wasOn = old && old != Init;
+    if (!value != !wasOn) {
+      var funcs = cm.display.dragFunctions;
+      var toggle = value ? on : off;
+      toggle(cm.display.scroller, "dragstart", funcs.start);
+      toggle(cm.display.scroller, "dragenter", funcs.enter);
+      toggle(cm.display.scroller, "dragover", funcs.over);
+      toggle(cm.display.scroller, "dragleave", funcs.leave);
+      toggle(cm.display.scroller, "drop", funcs.drop);
+    }
+  }
+
+  function wrappingChanged(cm) {
+    if (cm.options.lineWrapping) {
+      addClass(cm.display.wrapper, "CodeMirror-wrap");
+      cm.display.sizer.style.minWidth = "";
+      cm.display.sizerWidth = null;
+    } else {
+      rmClass(cm.display.wrapper, "CodeMirror-wrap");
+      findMaxLine(cm);
+    }
+    estimateLineHeights(cm);
+    regChange(cm);
+    clearCaches(cm);
+    setTimeout(function () { return updateScrollbars(cm); }, 100);
+  }
+
+  // A CodeMirror instance represents an editor. This is the object
+  // that user code is usually dealing with.
+
+  function CodeMirror(place, options) {
+    var this$1 = this;
+
+    if (!(this instanceof CodeMirror)) { return new CodeMirror(place, options) }
+
+    this.options = options = options ? copyObj(options) : {};
+    // Determine effective options based on given values and defaults.
+    copyObj(defaults, options, false);
+
+    var doc = options.value;
+    if (typeof doc == "string") { doc = new Doc(doc, options.mode, null, options.lineSeparator, options.direction); }
+    else if (options.mode) { doc.modeOption = options.mode; }
+    this.doc = doc;
+
+    var input = new CodeMirror.inputStyles[options.inputStyle](this);
+    var display = this.display = new Display(place, doc, input, options);
+    display.wrapper.CodeMirror = this;
+    themeChanged(this);
+    if (options.lineWrapping)
+      { this.display.wrapper.className += " CodeMirror-wrap"; }
+    initScrollbars(this);
+
+    this.state = {
+      keyMaps: [],  // stores maps added by addKeyMap
+      overlays: [], // highlighting overlays, as added by addOverlay
+      modeGen: 0,   // bumped when mode/overlay changes, used to invalidate highlighting info
+      overwrite: false,
+      delayingBlurEvent: false,
+      focused: false,
+      suppressEdits: false, // used to disable editing during key handlers when in readOnly mode
+      pasteIncoming: -1, cutIncoming: -1, // help recognize paste/cut edits in input.poll
+      selectingText: false,
+      draggingText: false,
+      highlight: new Delayed(), // stores highlight worker timeout
+      keySeq: null,  // Unfinished key sequence
+      specialChars: null
+    };
+
+    if (options.autofocus && !mobile) { display.input.focus(); }
+
+    // Override magic textarea content restore that IE sometimes does
+    // on our hidden textarea on reload
+    if (ie && ie_version < 11) { setTimeout(function () { return this$1.display.input.reset(true); }, 20); }
+
+    registerEventHandlers(this);
+    ensureGlobalHandlers();
+
+    startOperation(this);
+    this.curOp.forceUpdate = true;
+    attachDoc(this, doc);
+
+    if ((options.autofocus && !mobile) || this.hasFocus())
+      { setTimeout(function () {
+        if (this$1.hasFocus() && !this$1.state.focused) { onFocus(this$1); }
+      }, 20); }
+    else
+      { onBlur(this); }
+
+    for (var opt in optionHandlers) { if (optionHandlers.hasOwnProperty(opt))
+      { optionHandlers[opt](this, options[opt], Init); } }
+    maybeUpdateLineNumberWidth(this);
+    if (options.finishInit) { options.finishInit(this); }
+    for (var i = 0; i < initHooks.length; ++i) { initHooks[i](this); }
+    endOperation(this);
+    // Suppress optimizelegibility in Webkit, since it breaks text
+    // measuring on line wrapping boundaries.
+    if (webkit && options.lineWrapping &&
+        getComputedStyle(display.lineDiv).textRendering == "optimizelegibility")
+      { display.lineDiv.style.textRendering = "auto"; }
+  }
+
+  // The default configuration options.
+  CodeMirror.defaults = defaults;
+  // Functions to run when options are changed.
+  CodeMirror.optionHandlers = optionHandlers;
+
+  // Attach the necessary event handlers when initializing the editor
+  function registerEventHandlers(cm) {
+    var d = cm.display;
+    on(d.scroller, "mousedown", operation(cm, onMouseDown));
+    // Older IE's will not fire a second mousedown for a double click
+    if (ie && ie_version < 11)
+      { on(d.scroller, "dblclick", operation(cm, function (e) {
+        if (signalDOMEvent(cm, e)) { return }
+        var pos = posFromMouse(cm, e);
+        if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) { return }
+        e_preventDefault(e);
+        var word = cm.findWordAt(pos);
+        extendSelection(cm.doc, word.anchor, word.head);
+      })); }
+    else
+      { on(d.scroller, "dblclick", function (e) { return signalDOMEvent(cm, e) || e_preventDefault(e); }); }
+    // Some browsers fire contextmenu *after* opening the menu, at
+    // which point we can't mess with it anymore. Context menu is
+    // handled in onMouseDown for these browsers.
+    on(d.scroller, "contextmenu", function (e) { return onContextMenu(cm, e); });
+    on(d.input.getField(), "contextmenu", function (e) {
+      if (!d.scroller.contains(e.target)) { onContextMenu(cm, e); }
+    });
+
+    // Used to suppress mouse event handling when a touch happens
+    var touchFinished, prevTouch = {end: 0};
+    function finishTouch() {
+      if (d.activeTouch) {
+        touchFinished = setTimeout(function () { return d.activeTouch = null; }, 1000);
+        prevTouch = d.activeTouch;
+        prevTouch.end = +new Date;
+      }
+    }
+    function isMouseLikeTouchEvent(e) {
+      if (e.touches.length != 1) { return false }
+      var touch = e.touches[0];
+      return touch.radiusX <= 1 && touch.radiusY <= 1
+    }
+    function farAway(touch, other) {
+      if (other.left == null) { return true }
+      var dx = other.left - touch.left, dy = other.top - touch.top;
+      return dx * dx + dy * dy > 20 * 20
+    }
+    on(d.scroller, "touchstart", function (e) {
+      if (!signalDOMEvent(cm, e) && !isMouseLikeTouchEvent(e) && !clickInGutter(cm, e)) {
+        d.input.ensurePolled();
+        clearTimeout(touchFinished);
+        var now = +new Date;
+        d.activeTouch = {start: now, moved: false,
+                         prev: now - prevTouch.end <= 300 ? prevTouch : null};
+        if (e.touches.length == 1) {
+          d.activeTouch.left = e.touches[0].pageX;
+          d.activeTouch.top = e.touches[0].pageY;
+        }
+      }
+    });
+    on(d.scroller, "touchmove", function () {
+      if (d.activeTouch) { d.activeTouch.moved = true; }
+    });
+    on(d.scroller, "touchend", function (e) {
+      var touch = d.activeTouch;
+      if (touch && !eventInWidget(d, e) && touch.left != null &&
+          !touch.moved && new Date - touch.start < 300) {
+        var pos = cm.coordsChar(d.activeTouch, "page"), range;
+        if (!touch.prev || farAway(touch, touch.prev)) // Single tap
+          { range = new Range(pos, pos); }
+        else if (!touch.prev.prev || farAway(touch, touch.prev.prev)) // Double tap
+          { range = cm.findWordAt(pos); }
+        else // Triple tap
+          { range = new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))); }
+        cm.setSelection(range.anchor, range.head);
+        cm.focus();
+        e_preventDefault(e);
+      }
+      finishTouch();
+    });
+    on(d.scroller, "touchcancel", finishTouch);
+
+    // Sync scrolling between fake scrollbars and real scrollable
+    // area, ensure viewport is updated when scrolling.
+    on(d.scroller, "scroll", function () {
+      if (d.scroller.clientHeight) {
+        updateScrollTop(cm, d.scroller.scrollTop);
+        setScrollLeft(cm, d.scroller.scrollLeft, true);
+        signal(cm, "scroll", cm);
+      }
+    });
+
+    // Listen to wheel events in order to try and update the viewport on time.
+    on(d.scroller, "mousewheel", function (e) { return onScrollWheel(cm, e); });
+    on(d.scroller, "DOMMouseScroll", function (e) { return onScrollWheel(cm, e); });
+
+    // Prevent wrapper from ever scrolling
+    on(d.wrapper, "scroll", function () { return d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; });
+
+    d.dragFunctions = {
+      enter: function (e) {if (!signalDOMEvent(cm, e)) { e_stop(e); }},
+      over: function (e) {if (!signalDOMEvent(cm, e)) { onDragOver(cm, e); e_stop(e); }},
+      start: function (e) { return onDragStart(cm, e); },
+      drop: operation(cm, onDrop),
+      leave: function (e) {if (!signalDOMEvent(cm, e)) { clearDragCursor(cm); }}
+    };
+
+    var inp = d.input.getField();
+    on(inp, "keyup", function (e) { return onKeyUp.call(cm, e); });
+    on(inp, "keydown", operation(cm, onKeyDown));
+    on(inp, "keypress", operation(cm, onKeyPress));
+    on(inp, "focus", function (e) { return onFocus(cm, e); });
+    on(inp, "blur", function (e) { return onBlur(cm, e); });
+  }
+
+  var initHooks = [];
+  CodeMirror.defineInitHook = function (f) { return initHooks.push(f); };
+
+  // Indent the given line. The how parameter can be "smart",
+  // "add"/null, "subtract", or "prev". When aggressive is false
+  // (typically set to true for forced single-line indents), empty
+  // lines are not indented, and places where the mode returns Pass
+  // are left alone.
+  function indentLine(cm, n, how, aggressive) {
+    var doc = cm.doc, state;
+    if (how == null) { how = "add"; }
+    if (how == "smart") {
+      // Fall back to "prev" when the mode doesn't have an indentation
+      // method.
+      if (!doc.mode.indent) { how = "prev"; }
+      else { state = getContextBefore(cm, n).state; }
+    }
+
+    var tabSize = cm.options.tabSize;
+    var line = getLine(doc, n), curSpace = countColumn(line.text, null, tabSize);
+    if (line.stateAfter) { line.stateAfter = null; }
+    var curSpaceString = line.text.match(/^\s*/)[0], indentation;
+    if (!aggressive && !/\S/.test(line.text)) {
+      indentation = 0;
+      how = "not";
+    } else if (how == "smart") {
+      indentation = doc.mode.indent(state, line.text.slice(curSpaceString.length), line.text);
+      if (indentation == Pass || indentation > 150) {
+        if (!aggressive) { return }
+        how = "prev";
+      }
+    }
+    if (how == "prev") {
+      if (n > doc.first) { indentation = countColumn(getLine(doc, n-1).text, null, tabSize); }
+      else { indentation = 0; }
+    } else if (how == "add") {
+      indentation = curSpace + cm.options.indentUnit;
+    } else if (how == "subtract") {
+      indentation = curSpace - cm.options.indentUnit;
+    } else if (typeof how == "number") {
+      indentation = curSpace + how;
+    }
+    indentation = Math.max(0, indentation);
+
+    var indentString = "", pos = 0;
+    if (cm.options.indentWithTabs)
+      { for (var i = Math.floor(indentation / tabSize); i; --i) {pos += tabSize; indentString += "\t";} }
+    if (pos < indentation) { indentString += spaceStr(indentation - pos); }
+
+    if (indentString != curSpaceString) {
+      replaceRange(doc, indentString, Pos(n, 0), Pos(n, curSpaceString.length), "+input");
+      line.stateAfter = null;
+      return true
+    } else {
+      // Ensure that, if the cursor was in the whitespace at the start
+      // of the line, it is moved to the end of that space.
+      for (var i$1 = 0; i$1 < doc.sel.ranges.length; i$1++) {
+        var range = doc.sel.ranges[i$1];
+        if (range.head.line == n && range.head.ch < curSpaceString.length) {
+          var pos$1 = Pos(n, curSpaceString.length);
+          replaceOneSelection(doc, i$1, new Range(pos$1, pos$1));
+          break
+        }
+      }
+    }
+  }
+
+  // This will be set to a {lineWise: bool, text: [string]} object, so
+  // that, when pasting, we know what kind of selections the copied
+  // text was made out of.
+  var lastCopied = null;
+
+  function setLastCopied(newLastCopied) {
+    lastCopied = newLastCopied;
+  }
+
+  function applyTextInput(cm, inserted, deleted, sel, origin) {
+    var doc = cm.doc;
+    cm.display.shift = false;
+    if (!sel) { sel = doc.sel; }
+
+    var recent = +new Date - 200;
+    var paste = origin == "paste" || cm.state.pasteIncoming > recent;
+    var textLines = splitLinesAuto(inserted), multiPaste = null;
+    // When pasting N lines into N selections, insert one line per selection
+    if (paste && sel.ranges.length > 1) {
+      if (lastCopied && lastCopied.text.join("\n") == inserted) {
+        if (sel.ranges.length % lastCopied.text.length == 0) {
+          multiPaste = [];
+          for (var i = 0; i < lastCopied.text.length; i++)
+            { multiPaste.push(doc.splitLines(lastCopied.text[i])); }
+        }
+      } else if (textLines.length == sel.ranges.length && cm.options.pasteLinesPerSelection) {
+        multiPaste = map(textLines, function (l) { return [l]; });
+      }
+    }
+
+    var updateInput = cm.curOp.updateInput;
+    // Normal behavior is to insert the new text into every selection
+    for (var i$1 = sel.ranges.length - 1; i$1 >= 0; i$1--) {
+      var range = sel.ranges[i$1];
+      var from = range.from(), to = range.to();
+      if (range.empty()) {
+        if (deleted && deleted > 0) // Handle deletion
+          { from = Pos(from.line, from.ch - deleted); }
+        else if (cm.state.overwrite && !paste) // Handle overwrite
+          { to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + lst(textLines).length)); }
+        else if (paste && lastCopied && lastCopied.lineWise && lastCopied.text.join("\n") == textLines.join("\n"))
+          { from = to = Pos(from.line, 0); }
+      }
+      var changeEvent = {from: from, to: to, text: multiPaste ? multiPaste[i$1 % multiPaste.length] : textLines,
+                         origin: origin || (paste ? "paste" : cm.state.cutIncoming > recent ? "cut" : "+input")};
+      makeChange(cm.doc, changeEvent);
+      signalLater(cm, "inputRead", cm, changeEvent);
+    }
+    if (inserted && !paste)
+      { triggerElectric(cm, inserted); }
+
+    ensureCursorVisible(cm);
+    if (cm.curOp.updateInput < 2) { cm.curOp.updateInput = updateInput; }
+    cm.curOp.typing = true;
+    cm.state.pasteIncoming = cm.state.cutIncoming = -1;
+  }
+
+  function handlePaste(e, cm) {
+    var pasted = e.clipboardData && e.clipboardData.getData("Text");
+    if (pasted) {
+      e.preventDefault();
+      if (!cm.isReadOnly() && !cm.options.disableInput)
+        { runInOp(cm, function () { return applyTextInput(cm, pasted, 0, null, "paste"); }); }
+      return true
+    }
+  }
+
+  function triggerElectric(cm, inserted) {
+    // When an 'electric' character is inserted, immediately trigger a reindent
+    if (!cm.options.electricChars || !cm.options.smartIndent) { return }
+    var sel = cm.doc.sel;
+
+    for (var i = sel.ranges.length - 1; i >= 0; i--) {
+      var range = sel.ranges[i];
+      if (range.head.ch > 100 || (i && sel.ranges[i - 1].head.line == range.head.line)) { continue }
+      var mode = cm.getModeAt(range.head);
+      var indented = false;
+      if (mode.electricChars) {
+        for (var j = 0; j < mode.electricChars.length; j++)
+          { if (inserted.indexOf(mode.electricChars.charAt(j)) > -1) {
+            indented = indentLine(cm, range.head.line, "smart");
+            break
+          } }
+      } else if (mode.electricInput) {
+        if (mode.electricInput.test(getLine(cm.doc, range.head.line).text.slice(0, range.head.ch)))
+          { indented = indentLine(cm, range.head.line, "smart"); }
+      }
+      if (indented) { signalLater(cm, "electricInput", cm, range.head.line); }
+    }
+  }
+
+  function copyableRanges(cm) {
+    var text = [], ranges = [];
+    for (var i = 0; i < cm.doc.sel.ranges.length; i++) {
+      var line = cm.doc.sel.ranges[i].head.line;
+      var lineRange = {anchor: Pos(line, 0), head: Pos(line + 1, 0)};
+      ranges.push(lineRange);
+      text.push(cm.getRange(lineRange.anchor, lineRange.head));
+    }
+    return {text: text, ranges: ranges}
+  }
+
+  function disableBrowserMagic(field, spellcheck, autocorrect, autocapitalize) {
+    field.setAttribute("autocorrect", autocorrect ? "" : "off");
+    field.setAttribute("autocapitalize", autocapitalize ? "" : "off");
+    field.setAttribute("spellcheck", !!spellcheck);
+  }
+
+  function hiddenTextarea() {
+    var te = elt("textarea", null, null, "position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; outline: none");
+    var div = elt("div", [te], null, "overflow: hidden; position: relative; width: 3px; height: 0px;");
+    // The textarea is kept positioned near the cursor to prevent the
+    // fact that it'll be scrolled into view on input from scrolling
+    // our fake cursor out of view. On webkit, when wrap=off, paste is
+    // very slow. So make the area wide instead.
+    if (webkit) { te.style.width = "1000px"; }
+    else { te.setAttribute("wrap", "off"); }
+    // If border: 0; -- iOS fails to open keyboard (issue #1287)
+    if (ios) { te.style.border = "1px solid black"; }
+    disableBrowserMagic(te);
+    return div
+  }
+
+  // The publicly visible API. Note that methodOp(f) means
+  // 'wrap f in an operation, performed on its `this` parameter'.
+
+  // This is not the complete set of editor methods. Most of the
+  // methods defined on the Doc type are also injected into
+  // CodeMirror.prototype, for backwards compatibility and
+  // convenience.
+
+  function addEditorMethods(CodeMirror) {
+    var optionHandlers = CodeMirror.optionHandlers;
+
+    var helpers = CodeMirror.helpers = {};
+
+    CodeMirror.prototype = {
+      constructor: CodeMirror,
+      focus: function(){window.focus(); this.display.input.focus();},
+
+      setOption: function(option, value) {
+        var options = this.options, old = options[option];
+        if (options[option] == value && option != "mode") { return }
+        options[option] = value;
+        if (optionHandlers.hasOwnProperty(option))
+          { operation(this, optionHandlers[option])(this, value, old); }
+        signal(this, "optionChange", this, option);
+      },
+
+      getOption: function(option) {return this.options[option]},
+      getDoc: function() {return this.doc},
+
+      addKeyMap: function(map, bottom) {
+        this.state.keyMaps[bottom ? "push" : "unshift"](getKeyMap(map));
+      },
+      removeKeyMap: function(map) {
+        var maps = this.state.keyMaps;
+        for (var i = 0; i < maps.length; ++i)
+          { if (maps[i] == map || maps[i].name == map) {
+            maps.splice(i, 1);
+            return true
+          } }
+      },
+
+      addOverlay: methodOp(function(spec, options) {
+        var mode = spec.token ? spec : CodeMirror.getMode(this.options, spec);
+        if (mode.startState) { throw new Error("Overlays may not be stateful.") }
+        insertSorted(this.state.overlays,
+                     {mode: mode, modeSpec: spec, opaque: options && options.opaque,
+                      priority: (options && options.priority) || 0},
+                     function (overlay) { return overlay.priority; });
+        this.state.modeGen++;
+        regChange(this);
+      }),
+      removeOverlay: methodOp(function(spec) {
+        var overlays = this.state.overlays;
+        for (var i = 0; i < overlays.length; ++i) {
+          var cur = overlays[i].modeSpec;
+          if (cur == spec || typeof spec == "string" && cur.name == spec) {
+            overlays.splice(i, 1);
+            this.state.modeGen++;
+            regChange(this);
+            return
+          }
+        }
+      }),
+
+      indentLine: methodOp(function(n, dir, aggressive) {
+        if (typeof dir != "string" && typeof dir != "number") {
+          if (dir == null) { dir = this.options.smartIndent ? "smart" : "prev"; }
+          else { dir = dir ? "add" : "subtract"; }
+        }
+        if (isLine(this.doc, n)) { indentLine(this, n, dir, aggressive); }
+      }),
+      indentSelection: methodOp(function(how) {
+        var ranges = this.doc.sel.ranges, end = -1;
+        for (var i = 0; i < ranges.length; i++) {
+          var range = ranges[i];
+          if (!range.empty()) {
+            var from = range.from(), to = range.to();
+            var start = Math.max(end, from.line);
+            end = Math.min(this.lastLine(), to.line - (to.ch ? 0 : 1)) + 1;
+            for (var j = start; j < end; ++j)
+              { indentLine(this, j, how); }
+            var newRanges = this.doc.sel.ranges;
+            if (from.ch == 0 && ranges.length == newRanges.length && newRanges[i].from().ch > 0)
+              { replaceOneSelection(this.doc, i, new Range(from, newRanges[i].to()), sel_dontScroll); }
+          } else if (range.head.line > end) {
+            indentLine(this, range.head.line, how, true);
+            end = range.head.line;
+            if (i == this.doc.sel.primIndex) { ensureCursorVisible(this); }
+          }
+        }
+      }),
+
+      // Fetch the parser token for a given character. Useful for hacks
+      // that want to inspect the mode state (say, for completion).
+      getTokenAt: function(pos, precise) {
+        return takeToken(this, pos, precise)
+      },
+
+      getLineTokens: function(line, precise) {
+        return takeToken(this, Pos(line), precise, true)
+      },
+
+      getTokenTypeAt: function(pos) {
+        pos = clipPos(this.doc, pos);
+        var styles = getLineStyles(this, getLine(this.doc, pos.line));
+        var before = 0, after = (styles.length - 1) / 2, ch = pos.ch;
+        var type;
+        if (ch == 0) { type = styles[2]; }
+        else { for (;;) {
+          var mid = (before + after) >> 1;
+          if ((mid ? styles[mid * 2 - 1] : 0) >= ch) { after = mid; }
+          else if (styles[mid * 2 + 1] < ch) { before = mid + 1; }
+          else { type = styles[mid * 2 + 2]; break }
+        } }
+        var cut = type ? type.indexOf("overlay ") : -1;
+        return cut < 0 ? type : cut == 0 ? null : type.slice(0, cut - 1)
+      },
+
+      getModeAt: function(pos) {
+        var mode = this.doc.mode;
+        if (!mode.innerMode) { return mode }
+        return CodeMirror.innerMode(mode, this.getTokenAt(pos).state).mode
+      },
+
+      getHelper: function(pos, type) {
+        return this.getHelpers(pos, type)[0]
+      },
+
+      getHelpers: function(pos, type) {
+        var found = [];
+        if (!helpers.hasOwnProperty(type)) { return found }
+        var help = helpers[type], mode = this.getModeAt(pos);
+        if (typeof mode[type] == "string") {
+          if (help[mode[type]]) { found.push(help[mode[type]]); }
+        } else if (mode[type]) {
+          for (var i = 0; i < mode[type].length; i++) {
+            var val = help[mode[type][i]];
+            if (val) { found.push(val); }
+          }
+        } else if (mode.helperType && help[mode.helperType]) {
+          found.push(help[mode.helperType]);
+        } else if (help[mode.name]) {
+          found.push(help[mode.name]);
+        }
+        for (var i$1 = 0; i$1 < help._global.length; i$1++) {
+          var cur = help._global[i$1];
+          if (cur.pred(mode, this) && indexOf(found, cur.val) == -1)
+            { found.push(cur.val); }
+        }
+        return found
+      },
+
+      getStateAfter: function(line, precise) {
+        var doc = this.doc;
+        line = clipLine(doc, line == null ? doc.first + doc.size - 1: line);
+        return getContextBefore(this, line + 1, precise).state
+      },
+
+      cursorCoords: function(start, mode) {
+        var pos, range = this.doc.sel.primary();
+        if (start == null) { pos = range.head; }
+        else if (typeof start == "object") { pos = clipPos(this.doc, start); }
+        else { pos = start ? range.from() : range.to(); }
+        return cursorCoords(this, pos, mode || "page")
+      },
+
+      charCoords: function(pos, mode) {
+        return charCoords(this, clipPos(this.doc, pos), mode || "page")
+      },
+
+      coordsChar: function(coords, mode) {
+        coords = fromCoordSystem(this, coords, mode || "page");
+        return coordsChar(this, coords.left, coords.top)
+      },
+
+      lineAtHeight: function(height, mode) {
+        height = fromCoordSystem(this, {top: height, left: 0}, mode || "page").top;
+        return lineAtHeight(this.doc, height + this.display.viewOffset)
+      },
+      heightAtLine: function(line, mode, includeWidgets) {
+        var end = false, lineObj;
+        if (typeof line == "number") {
+          var last = this.doc.first + this.doc.size - 1;
+          if (line < this.doc.first) { line = this.doc.first; }
+          else if (line > last) { line = last; end = true; }
+          lineObj = getLine(this.doc, line);
+        } else {
+          lineObj = line;
+        }
+        return intoCoordSystem(this, lineObj, {top: 0, left: 0}, mode || "page", includeWidgets || end).top +
+          (end ? this.doc.height - heightAtLine(lineObj) : 0)
+      },
+
+      defaultTextHeight: function() { return textHeight(this.display) },
+      defaultCharWidth: function() { return charWidth(this.display) },
+
+      getViewport: function() { return {from: this.display.viewFrom, to: this.display.viewTo}},
+
+      addWidget: function(pos, node, scroll, vert, horiz) {
+        var display = this.display;
+        pos = cursorCoords(this, clipPos(this.doc, pos));
+        var top = pos.bottom, left = pos.left;
+        node.style.position = "absolute";
+        node.setAttribute("cm-ignore-events", "true");
+        this.display.input.setUneditable(node);
+        display.sizer.appendChild(node);
+        if (vert == "over") {
+          top = pos.top;
+        } else if (vert == "above" || vert == "near") {
+          var vspace = Math.max(display.wrapper.clientHeight, this.doc.height),
+          hspace = Math.max(display.sizer.clientWidth, display.lineSpace.clientWidth);
+          // Default to positioning above (if specified and possible); otherwise default to positioning below
+          if ((vert == 'above' || pos.bottom + node.offsetHeight > vspace) && pos.top > node.offsetHeight)
+            { top = pos.top - node.offsetHeight; }
+          else if (pos.bottom + node.offsetHeight <= vspace)
+            { top = pos.bottom; }
+          if (left + node.offsetWidth > hspace)
+            { left = hspace - node.offsetWidth; }
+        }
+        node.style.top = top + "px";
+        node.style.left = node.style.right = "";
+        if (horiz == "right") {
+          left = display.sizer.clientWidth - node.offsetWidth;
+          node.style.right = "0px";
+        } else {
+          if (horiz == "left") { left = 0; }
+          else if (horiz == "middle") { left = (display.sizer.clientWidth - node.offsetWidth) / 2; }
+          node.style.left = left + "px";
+        }
+        if (scroll)
+          { scrollIntoView(this, {left: left, top: top, right: left + node.offsetWidth, bottom: top + node.offsetHeight}); }
+      },
+
+      triggerOnKeyDown: methodOp(onKeyDown),
+      triggerOnKeyPress: methodOp(onKeyPress),
+      triggerOnKeyUp: onKeyUp,
+      triggerOnMouseDown: methodOp(onMouseDown),
+
+      execCommand: function(cmd) {
+        if (commands.hasOwnProperty(cmd))
+          { return commands[cmd].call(null, this) }
+      },
+
+      triggerElectric: methodOp(function(text) { triggerElectric(this, text); }),
+
+      findPosH: function(from, amount, unit, visually) {
+        var dir = 1;
+        if (amount < 0) { dir = -1; amount = -amount; }
+        var cur = clipPos(this.doc, from);
+        for (var i = 0; i < amount; ++i) {
+          cur = findPosH(this.doc, cur, dir, unit, visually);
+          if (cur.hitSide) { break }
+        }
+        return cur
+      },
+
+      moveH: methodOp(function(dir, unit) {
+        var this$1 = this;
+
+        this.extendSelectionsBy(function (range) {
+          if (this$1.display.shift || this$1.doc.extend || range.empty())
+            { return findPosH(this$1.doc, range.head, dir, unit, this$1.options.rtlMoveVisually) }
+          else
+            { return dir < 0 ? range.from() : range.to() }
+        }, sel_move);
+      }),
+
+      deleteH: methodOp(function(dir, unit) {
+        var sel = this.doc.sel, doc = this.doc;
+        if (sel.somethingSelected())
+          { doc.replaceSelection("", null, "+delete"); }
+        else
+          { deleteNearSelection(this, function (range) {
+            var other = findPosH(doc, range.head, dir, unit, false);
+            return dir < 0 ? {from: other, to: range.head} : {from: range.head, to: other}
+          }); }
+      }),
+
+      findPosV: function(from, amount, unit, goalColumn) {
+        var dir = 1, x = goalColumn;
+        if (amount < 0) { dir = -1; amount = -amount; }
+        var cur = clipPos(this.doc, from);
+        for (var i = 0; i < amount; ++i) {
+          var coords = cursorCoords(this, cur, "div");
+          if (x == null) { x = coords.left; }
+          else { coords.left = x; }
+          cur = findPosV(this, coords, dir, unit);
+          if (cur.hitSide) { break }
+        }
+        return cur
+      },
+
+      moveV: methodOp(function(dir, unit) {
+        var this$1 = this;
+
+        var doc = this.doc, goals = [];
+        var collapse = !this.display.shift && !doc.extend && doc.sel.somethingSelected();
+        doc.extendSelectionsBy(function (range) {
+          if (collapse)
+            { return dir < 0 ? range.from() : range.to() }
+          var headPos = cursorCoords(this$1, range.head, "div");
+          if (range.goalColumn != null) { headPos.left = range.goalColumn; }
+          goals.push(headPos.left);
+          var pos = findPosV(this$1, headPos, dir, unit);
+          if (unit == "page" && range == doc.sel.primary())
+            { addToScrollTop(this$1, charCoords(this$1, pos, "div").top - headPos.top); }
+          return pos
+        }, sel_move);
+        if (goals.length) { for (var i = 0; i < doc.sel.ranges.length; i++)
+          { doc.sel.ranges[i].goalColumn = goals[i]; } }
+      }),
+
+      // Find the word at the given position (as returned by coordsChar).
+      findWordAt: function(pos) {
+        var doc = this.doc, line = getLine(doc, pos.line).text;
+        var start = pos.ch, end = pos.ch;
+        if (line) {
+          var helper = this.getHelper(pos, "wordChars");
+          if ((pos.sticky == "before" || end == line.length) && start) { --start; } else { ++end; }
+          var startChar = line.charAt(start);
+          var check = isWordChar(startChar, helper)
+            ? function (ch) { return isWordChar(ch, helper); }
+            : /\s/.test(startChar) ? function (ch) { return /\s/.test(ch); }
+            : function (ch) { return (!/\s/.test(ch) && !isWordChar(ch)); };
+          while (start > 0 && check(line.charAt(start - 1))) { --start; }
+          while (end < line.length && check(line.charAt(end))) { ++end; }
+        }
+        return new Range(Pos(pos.line, start), Pos(pos.line, end))
+      },
+
+      toggleOverwrite: function(value) {
+        if (value != null && value == this.state.overwrite) { return }
+        if (this.state.overwrite = !this.state.overwrite)
+          { addClass(this.display.cursorDiv, "CodeMirror-overwrite"); }
+        else
+          { rmClass(this.display.cursorDiv, "CodeMirror-overwrite"); }
+
+        signal(this, "overwriteToggle", this, this.state.overwrite);
+      },
+      hasFocus: function() { return this.display.input.getField() == activeElt() },
+      isReadOnly: function() { return !!(this.options.readOnly || this.doc.cantEdit) },
+
+      scrollTo: methodOp(function (x, y) { scrollToCoords(this, x, y); }),
+      getScrollInfo: function() {
+        var scroller = this.display.scroller;
+        return {left: scroller.scrollLeft, top: scroller.scrollTop,
+                height: scroller.scrollHeight - scrollGap(this) - this.display.barHeight,
+                width: scroller.scrollWidth - scrollGap(this) - this.display.barWidth,
+                clientHeight: displayHeight(this), clientWidth: displayWidth(this)}
+      },
+
+      scrollIntoView: methodOp(function(range, margin) {
+        if (range == null) {
+          range = {from: this.doc.sel.primary().head, to: null};
+          if (margin == null) { margin = this.options.cursorScrollMargin; }
+        } else if (typeof range == "number") {
+          range = {from: Pos(range, 0), to: null};
+        } else if (range.from == null) {
+          range = {from: range, to: null};
+        }
+        if (!range.to) { range.to = range.from; }
+        range.margin = margin || 0;
+
+        if (range.from.line != null) {
+          scrollToRange(this, range);
+        } else {
+          scrollToCoordsRange(this, range.from, range.to, range.margin);
+        }
+      }),
+
+      setSize: methodOp(function(width, height) {
+        var this$1 = this;
+
+        var interpret = function (val) { return typeof val == "number" || /^\d+$/.test(String(val)) ? val + "px" : val; };
+        if (width != null) { this.display.wrapper.style.width = interpret(width); }
+        if (height != null) { this.display.wrapper.style.height = interpret(height); }
+        if (this.options.lineWrapping) { clearLineMeasurementCache(this); }
+        var lineNo = this.display.viewFrom;
+        this.doc.iter(lineNo, this.display.viewTo, function (line) {
+          if (line.widgets) { for (var i = 0; i < line.widgets.length; i++)
+            { if (line.widgets[i].noHScroll) { regLineChange(this$1, lineNo, "widget"); break } } }
+          ++lineNo;
+        });
+        this.curOp.forceUpdate = true;
+        signal(this, "refresh", this);
+      }),
+
+      operation: function(f){return runInOp(this, f)},
+      startOperation: function(){return startOperation(this)},
+      endOperation: function(){return endOperation(this)},
+
+      refresh: methodOp(function() {
+        var oldHeight = this.display.cachedTextHeight;
+        regChange(this);
+        this.curOp.forceUpdate = true;
+        clearCaches(this);
+        scrollToCoords(this, this.doc.scrollLeft, this.doc.scrollTop);
+        updateGutterSpace(this.display);
+        if (oldHeight == null || Math.abs(oldHeight - textHeight(this.display)) > .5 || this.options.lineWrapping)
+          { estimateLineHeights(this); }
+        signal(this, "refresh", this);
+      }),
+
+      swapDoc: methodOp(function(doc) {
+        var old = this.doc;
+        old.cm = null;
+        // Cancel the current text selection if any (#5821)
+        if (this.state.selectingText) { this.state.selectingText(); }
+        attachDoc(this, doc);
+        clearCaches(this);
+        this.display.input.reset();
+        scrollToCoords(this, doc.scrollLeft, doc.scrollTop);
+        this.curOp.forceScroll = true;
+        signalLater(this, "swapDoc", this, old);
+        return old
+      }),
+
+      phrase: function(phraseText) {
+        var phrases = this.options.phrases;
+        return phrases && Object.prototype.hasOwnProperty.call(phrases, phraseText) ? phrases[phraseText] : phraseText
+      },
+
+      getInputField: function(){return this.display.input.getField()},
+      getWrapperElement: function(){return this.display.wrapper},
+      getScrollerElement: function(){return this.display.scroller},
+      getGutterElement: function(){return this.display.gutters}
+    };
+    eventMixin(CodeMirror);
+
+    CodeMirror.registerHelper = function(type, name, value) {
+      if (!helpers.hasOwnProperty(type)) { helpers[type] = CodeMirror[type] = {_global: []}; }
+      helpers[type][name] = value;
+    };
+    CodeMirror.registerGlobalHelper = function(type, name, predicate, value) {
+      CodeMirror.registerHelper(type, name, value);
+      helpers[type]._global.push({pred: predicate, val: value});
+    };
+  }
+
+  // Used for horizontal relative motion. Dir is -1 or 1 (left or
+  // right), unit can be "codepoint", "char", "column" (like char, but
+  // doesn't cross line boundaries), "word" (across next word), or
+  // "group" (to the start of next group of word or
+  // non-word-non-whitespace chars). The visually param controls
+  // whether, in right-to-left text, direction 1 means to move towards
+  // the next index in the string, or towards the character to the right
+  // of the current position. The resulting position will have a
+  // hitSide=true property if it reached the end of the document.
+  function findPosH(doc, pos, dir, unit, visually) {
+    var oldPos = pos;
+    var origDir = dir;
+    var lineObj = getLine(doc, pos.line);
+    var lineDir = visually && doc.direction == "rtl" ? -dir : dir;
+    function findNextLine() {
+      var l = pos.line + lineDir;
+      if (l < doc.first || l >= doc.first + doc.size) { return false }
+      pos = new Pos(l, pos.ch, pos.sticky);
+      return lineObj = getLine(doc, l)
+    }
+    function moveOnce(boundToLine) {
+      var next;
+      if (unit == "codepoint") {
+        var ch = lineObj.text.charCodeAt(pos.ch + (dir > 0 ? 0 : -1));
+        if (isNaN(ch)) {
+          next = null;
+        } else {
+          var astral = dir > 0 ? ch >= 0xD800 && ch < 0xDC00 : ch >= 0xDC00 && ch < 0xDFFF;
+          next = new Pos(pos.line, Math.max(0, Math.min(lineObj.text.length, pos.ch + dir * (astral ? 2 : 1))), -dir);
+        }
+      } else if (visually) {
+        next = moveVisually(doc.cm, lineObj, pos, dir);
+      } else {
+        next = moveLogically(lineObj, pos, dir);
+      }
+      if (next == null) {
+        if (!boundToLine && findNextLine())
+          { pos = endOfLine(visually, doc.cm, lineObj, pos.line, lineDir); }
+        else
+          { return false }
+      } else {
+        pos = next;
+      }
+      return true
+    }
+
+    if (unit == "char" || unit == "codepoint") {
+      moveOnce();
+    } else if (unit == "column") {
+      moveOnce(true);
+    } else if (unit == "word" || unit == "group") {
+      var sawType = null, group = unit == "group";
+      var helper = doc.cm && doc.cm.getHelper(pos, "wordChars");
+      for (var first = true;; first = false) {
+        if (dir < 0 && !moveOnce(!first)) { break }
+        var cur = lineObj.text.charAt(pos.ch) || "\n";
+        var type = isWordChar(cur, helper) ? "w"
+          : group && cur == "\n" ? "n"
+          : !group || /\s/.test(cur) ? null
+          : "p";
+        if (group && !first && !type) { type = "s"; }
+        if (sawType && sawType != type) {
+          if (dir < 0) {dir = 1; moveOnce(); pos.sticky = "after";}
+          break
+        }
+
+        if (type) { sawType = type; }
+        if (dir > 0 && !moveOnce(!first)) { break }
+      }
+    }
+    var result = skipAtomic(doc, pos, oldPos, origDir, true);
+    if (equalCursorPos(oldPos, result)) { result.hitSide = true; }
+    return result
+  }
+
+  // For relative vertical movement. Dir may be -1 or 1. Unit can be
+  // "page" or "line". The resulting position will have a hitSide=true
+  // property if it reached the end of the document.
+  function findPosV(cm, pos, dir, unit) {
+    var doc = cm.doc, x = pos.left, y;
+    if (unit == "page") {
+      var pageSize = Math.min(cm.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight);
+      var moveAmount = Math.max(pageSize - .5 * textHeight(cm.display), 3);
+      y = (dir > 0 ? pos.bottom : pos.top) + dir * moveAmount;
+
+    } else if (unit == "line") {
+      y = dir > 0 ? pos.bottom + 3 : pos.top - 3;
+    }
+    var target;
+    for (;;) {
+      target = coordsChar(cm, x, y);
+      if (!target.outside) { break }
+      if (dir < 0 ? y <= 0 : y >= doc.height) { target.hitSide = true; break }
+      y += dir * 5;
+    }
+    return target
+  }
+
+  // CONTENTEDITABLE INPUT STYLE
+
+  var ContentEditableInput = function(cm) {
+    this.cm = cm;
+    this.lastAnchorNode = this.lastAnchorOffset = this.lastFocusNode = this.lastFocusOffset = null;
+    this.polling = new Delayed();
+    this.composing = null;
+    this.gracePeriod = false;
+    this.readDOMTimeout = null;
+  };
+
+  ContentEditableInput.prototype.init = function (display) {
+      var this$1 = this;
+
+    var input = this, cm = input.cm;
+    var div = input.div = display.lineDiv;
+    div.contentEditable = true;
+    disableBrowserMagic(div, cm.options.spellcheck, cm.options.autocorrect, cm.options.autocapitalize);
+
+    function belongsToInput(e) {
+      for (var t = e.target; t; t = t.parentNode) {
+        if (t == div) { return true }
+        if (/\bCodeMirror-(?:line)?widget\b/.test(t.className)) { break }
+      }
+      return false
+    }
+
+    on(div, "paste", function (e) {
+      if (!belongsToInput(e) || signalDOMEvent(cm, e) || handlePaste(e, cm)) { return }
+      // IE doesn't fire input events, so we schedule a read for the pasted content in this way
+      if (ie_version <= 11) { setTimeout(operation(cm, function () { return this$1.updateFromDOM(); }), 20); }
+    });
+
+    on(div, "compositionstart", function (e) {
+      this$1.composing = {data: e.data, done: false};
+    });
+    on(div, "compositionupdate", function (e) {
+      if (!this$1.composing) { this$1.composing = {data: e.data, done: false}; }
+    });
+    on(div, "compositionend", function (e) {
+      if (this$1.composing) {
+        if (e.data != this$1.composing.data) { this$1.readFromDOMSoon(); }
+        this$1.composing.done = true;
+      }
+    });
+
+    on(div, "touchstart", function () { return input.forceCompositionEnd(); });
+
+    on(div, "input", function () {
+      if (!this$1.composing) { this$1.readFromDOMSoon(); }
+    });
+
+    function onCopyCut(e) {
+      if (!belongsToInput(e) || signalDOMEvent(cm, e)) { return }
+      if (cm.somethingSelected()) {
+        setLastCopied({lineWise: false, text: cm.getSelections()});
+        if (e.type == "cut") { cm.replaceSelection("", null, "cut"); }
+      } else if (!cm.options.lineWiseCopyCut) {
+        return
+      } else {
+        var ranges = copyableRanges(cm);
+        setLastCopied({lineWise: true, text: ranges.text});
+        if (e.type == "cut") {
+          cm.operation(function () {
+            cm.setSelections(ranges.ranges, 0, sel_dontScroll);
+            cm.replaceSelection("", null, "cut");
+          });
+        }
+      }
+      if (e.clipboardData) {
+        e.clipboardData.clearData();
+        var content = lastCopied.text.join("\n");
+        // iOS exposes the clipboard API, but seems to discard content inserted into it
+        e.clipboardData.setData("Text", content);
+        if (e.clipboardData.getData("Text") == content) {
+          e.preventDefault();
+          return
+        }
+      }
+      // Old-fashioned briefly-focus-a-textarea hack
+      var kludge = hiddenTextarea(), te = kludge.firstChild;
+      cm.display.lineSpace.insertBefore(kludge, cm.display.lineSpace.firstChild);
+      te.value = lastCopied.text.join("\n");
+      var hadFocus = activeElt();
+      selectInput(te);
+      setTimeout(function () {
+        cm.display.lineSpace.removeChild(kludge);
+        hadFocus.focus();
+        if (hadFocus == div) { input.showPrimarySelection(); }
+      }, 50);
+    }
+    on(div, "copy", onCopyCut);
+    on(div, "cut", onCopyCut);
+  };
+
+  ContentEditableInput.prototype.screenReaderLabelChanged = function (label) {
+    // Label for screenreaders, accessibility
+    if(label) {
+      this.div.setAttribute('aria-label', label);
+    } else {
+      this.div.removeAttribute('aria-label');
+    }
+  };
+
+  ContentEditableInput.prototype.prepareSelection = function () {
+    var result = prepareSelection(this.cm, false);
+    result.focus = activeElt() == this.div;
+    return result
+  };
+
+  ContentEditableInput.prototype.showSelection = function (info, takeFocus) {
+    if (!info || !this.cm.display.view.length) { return }
+    if (info.focus || takeFocus) { this.showPrimarySelection(); }
+    this.showMultipleSelections(info);
+  };
+
+  ContentEditableInput.prototype.getSelection = function () {
+    return this.cm.display.wrapper.ownerDocument.getSelection()
+  };
+
+  ContentEditableInput.prototype.showPrimarySelection = function () {
+    var sel = this.getSelection(), cm = this.cm, prim = cm.doc.sel.primary();
+    var from = prim.from(), to = prim.to();
+
+    if (cm.display.viewTo == cm.display.viewFrom || from.line >= cm.display.viewTo || to.line < cm.display.viewFrom) {
+      sel.removeAllRanges();
+      return
+    }
+
+    var curAnchor = domToPos(cm, sel.anchorNode, sel.anchorOffset);
+    var curFocus = domToPos(cm, sel.focusNode, sel.focusOffset);
+    if (curAnchor && !curAnchor.bad && curFocus && !curFocus.bad &&
+        cmp(minPos(curAnchor, curFocus), from) == 0 &&
+        cmp(maxPos(curAnchor, curFocus), to) == 0)
+      { return }
+
+    var view = cm.display.view;
+    var start = (from.line >= cm.display.viewFrom && posToDOM(cm, from)) ||
+        {node: view[0].measure.map[2], offset: 0};
+    var end = to.line < cm.display.viewTo && posToDOM(cm, to);
+    if (!end) {
+      var measure = view[view.length - 1].measure;
+      var map = measure.maps ? measure.maps[measure.maps.length - 1] : measure.map;
+      end = {node: map[map.length - 1], offset: map[map.length - 2] - map[map.length - 3]};
+    }
+
+    if (!start || !end) {
+      sel.removeAllRanges();
+      return
+    }
+
+    var old = sel.rangeCount && sel.getRangeAt(0), rng;
+    try { rng = range(start.node, start.offset, end.offset, end.node); }
+    catch(e) {} // Our model of the DOM might be outdated, in which case the range we try to set can be impossible
+    if (rng) {
+      if (!gecko && cm.state.focused) {
+        sel.collapse(start.node, start.offset);
+        if (!rng.collapsed) {
+          sel.removeAllRanges();
+          sel.addRange(rng);
+        }
+      } else {
+        sel.removeAllRanges();
+        sel.addRange(rng);
+      }
+      if (old && sel.anchorNode == null) { sel.addRange(old); }
+      else if (gecko) { this.startGracePeriod(); }
+    }
+    this.rememberSelection();
+  };
+
+  ContentEditableInput.prototype.startGracePeriod = function () {
+      var this$1 = this;
+
+    clearTimeout(this.gracePeriod);
+    this.gracePeriod = setTimeout(function () {
+      this$1.gracePeriod = false;
+      if (this$1.selectionChanged())
+        { this$1.cm.operation(function () { return this$1.cm.curOp.selectionChanged = true; }); }
+    }, 20);
+  };
+
+  ContentEditableInput.prototype.showMultipleSelections = function (info) {
+    removeChildrenAndAdd(this.cm.display.cursorDiv, info.cursors);
+    removeChildrenAndAdd(this.cm.display.selectionDiv, info.selection);
+  };
+
+  ContentEditableInput.prototype.rememberSelection = function () {
+    var sel = this.getSelection();
+    this.lastAnchorNode = sel.anchorNode; this.lastAnchorOffset = sel.anchorOffset;
+    this.lastFocusNode = sel.focusNode; this.lastFocusOffset = sel.focusOffset;
+  };
+
+  ContentEditableInput.prototype.selectionInEditor = function () {
+    var sel = this.getSelection();
+    if (!sel.rangeCount) { return false }
+    var node = sel.getRangeAt(0).commonAncestorContainer;
+    return contains(this.div, node)
+  };
+
+  ContentEditableInput.prototype.focus = function () {
+    if (this.cm.options.readOnly != "nocursor") {
+      if (!this.selectionInEditor() || activeElt() != this.div)
+        { this.showSelection(this.prepareSelection(), true); }
+      this.div.focus();
+    }
+  };
+  ContentEditableInput.prototype.blur = function () { this.div.blur(); };
+  ContentEditableInput.prototype.getField = function () { return this.div };
+
+  ContentEditableInput.prototype.supportsTouch = function () { return true };
+
+  ContentEditableInput.prototype.receivedFocus = function () {
+    var input = this;
+    if (this.selectionInEditor())
+      { this.pollSelection(); }
+    else
+      { runInOp(this.cm, function () { return input.cm.curOp.selectionChanged = true; }); }
+
+    function poll() {
+      if (input.cm.state.focused) {
+        input.pollSelection();
+        input.polling.set(input.cm.options.pollInterval, poll);
+      }
+    }
+    this.polling.set(this.cm.options.pollInterval, poll);
+  };
+
+  ContentEditableInput.prototype.selectionChanged = function () {
+    var sel = this.getSelection();
+    return sel.anchorNode != this.lastAnchorNode || sel.anchorOffset != this.lastAnchorOffset ||
+      sel.focusNode != this.lastFocusNode || sel.focusOffset != this.lastFocusOffset
+  };
+
+  ContentEditableInput.prototype.pollSelection = function () {
+    if (this.readDOMTimeout != null || this.gracePeriod || !this.selectionChanged()) { return }
+    var sel = this.getSelection(), cm = this.cm;
+    // On Android Chrome (version 56, at least), backspacing into an
+    // uneditable block element will put the cursor in that element,
+    // and then, because it's not editable, hide the virtual keyboard.
+    // Because Android doesn't allow us to actually detect backspace
+    // presses in a sane way, this code checks for when that happens
+    // and simulates a backspace press in this case.
+    if (android && chrome && this.cm.display.gutterSpecs.length && isInGutter(sel.anchorNode)) {
+      this.cm.triggerOnKeyDown({type: "keydown", keyCode: 8, preventDefault: Math.abs});
+      this.blur();
+      this.focus();
+      return
+    }
+    if (this.composing) { return }
+    this.rememberSelection();
+    var anchor = domToPos(cm, sel.anchorNode, sel.anchorOffset);
+    var head = domToPos(cm, sel.focusNode, sel.focusOffset);
+    if (anchor && head) { runInOp(cm, function () {
+      setSelection(cm.doc, simpleSelection(anchor, head), sel_dontScroll);
+      if (anchor.bad || head.bad) { cm.curOp.selectionChanged = true; }
+    }); }
+  };
+
+  ContentEditableInput.prototype.pollContent = function () {
+    if (this.readDOMTimeout != null) {
+      clearTimeout(this.readDOMTimeout);
+      this.readDOMTimeout = null;
+    }
+
+    var cm = this.cm, display = cm.display, sel = cm.doc.sel.primary();
+    var from = sel.from(), to = sel.to();
+    if (from.ch == 0 && from.line > cm.firstLine())
+      { from = Pos(from.line - 1, getLine(cm.doc, from.line - 1).length); }
+    if (to.ch == getLine(cm.doc, to.line).text.length && to.line < cm.lastLine())
+      { to = Pos(to.line + 1, 0); }
+    if (from.line < display.viewFrom || to.line > display.viewTo - 1) { return false }
+
+    var fromIndex, fromLine, fromNode;
+    if (from.line == display.viewFrom || (fromIndex = findViewIndex(cm, from.line)) == 0) {
+      fromLine = lineNo(display.view[0].line);
+      fromNode = display.view[0].node;
+    } else {
+      fromLine = lineNo(display.view[fromIndex].line);
+      fromNode = display.view[fromIndex - 1].node.nextSibling;
+    }
+    var toIndex = findViewIndex(cm, to.line);
+    var toLine, toNode;
+    if (toIndex == display.view.length - 1) {
+      toLine = display.viewTo - 1;
+      toNode = display.lineDiv.lastChild;
+    } else {
+      toLine = lineNo(display.view[toIndex + 1].line) - 1;
+      toNode = display.view[toIndex + 1].node.previousSibling;
+    }
+
+    if (!fromNode) { return false }
+    var newText = cm.doc.splitLines(domTextBetween(cm, fromNode, toNode, fromLine, toLine));
+    var oldText = getBetween(cm.doc, Pos(fromLine, 0), Pos(toLine, getLine(cm.doc, toLine).text.length));
+    while (newText.length > 1 && oldText.length > 1) {
+      if (lst(newText) == lst(oldText)) { newText.pop(); oldText.pop(); toLine--; }
+      else if (newText[0] == oldText[0]) { newText.shift(); oldText.shift(); fromLine++; }
+      else { break }
+    }
+
+    var cutFront = 0, cutEnd = 0;
+    var newTop = newText[0], oldTop = oldText[0], maxCutFront = Math.min(newTop.length, oldTop.length);
+    while (cutFront < maxCutFront && newTop.charCodeAt(cutFront) == oldTop.charCodeAt(cutFront))
+      { ++cutFront; }
+    var newBot = lst(newText), oldBot = lst(oldText);
+    var maxCutEnd = Math.min(newBot.length - (newText.length == 1 ? cutFront : 0),
+                             oldBot.length - (oldText.length == 1 ? cutFront : 0));
+    while (cutEnd < maxCutEnd &&
+           newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1))
+      { ++cutEnd; }
+    // Try to move start of change to start of selection if ambiguous
+    if (newText.length == 1 && oldText.length == 1 && fromLine == from.line) {
+      while (cutFront && cutFront > from.ch &&
+             newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1)) {
+        cutFront--;
+        cutEnd++;
+      }
+    }
+
+    newText[newText.length - 1] = newBot.slice(0, newBot.length - cutEnd).replace(/^\u200b+/, "");
+    newText[0] = newText[0].slice(cutFront).replace(/\u200b+$/, "");
+
+    var chFrom = Pos(fromLine, cutFront);
+    var chTo = Pos(toLine, oldText.length ? lst(oldText).length - cutEnd : 0);
+    if (newText.length > 1 || newText[0] || cmp(chFrom, chTo)) {
+      replaceRange(cm.doc, newText, chFrom, chTo, "+input");
+      return true
+    }
+  };
+
+  ContentEditableInput.prototype.ensurePolled = function () {
+    this.forceCompositionEnd();
+  };
+  ContentEditableInput.prototype.reset = function () {
+    this.forceCompositionEnd();
+  };
+  ContentEditableInput.prototype.forceCompositionEnd = function () {
+    if (!this.composing) { return }
+    clearTimeout(this.readDOMTimeout);
+    this.composing = null;
+    this.updateFromDOM();
+    this.div.blur();
+    this.div.focus();
+  };
+  ContentEditableInput.prototype.readFromDOMSoon = function () {
+      var this$1 = this;
+
+    if (this.readDOMTimeout != null) { return }
+    this.readDOMTimeout = setTimeout(function () {
+      this$1.readDOMTimeout = null;
+      if (this$1.composing) {
+        if (this$1.composing.done) { this$1.composing = null; }
+        else { return }
+      }
+      this$1.updateFromDOM();
+    }, 80);
+  };
+
+  ContentEditableInput.prototype.updateFromDOM = function () {
+      var this$1 = this;
+
+    if (this.cm.isReadOnly() || !this.pollContent())
+      { runInOp(this.cm, function () { return regChange(this$1.cm); }); }
+  };
+
+  ContentEditableInput.prototype.setUneditable = function (node) {
+    node.contentEditable = "false";
+  };
+
+  ContentEditableInput.prototype.onKeyPress = function (e) {
+    if (e.charCode == 0 || this.composing) { return }
+    e.preventDefault();
+    if (!this.cm.isReadOnly())
+      { operation(this.cm, applyTextInput)(this.cm, String.fromCharCode(e.charCode == null ? e.keyCode : e.charCode), 0); }
+  };
+
+  ContentEditableInput.prototype.readOnlyChanged = function (val) {
+    this.div.contentEditable = String(val != "nocursor");
+  };
+
+  ContentEditableInput.prototype.onContextMenu = function () {};
+  ContentEditableInput.prototype.resetPosition = function () {};
+
+  ContentEditableInput.prototype.needsContentAttribute = true;
+
+  function posToDOM(cm, pos) {
+    var view = findViewForLine(cm, pos.line);
+    if (!view || view.hidden) { return null }
+    var line = getLine(cm.doc, pos.line);
+    var info = mapFromLineView(view, line, pos.line);
+
+    var order = getOrder(line, cm.doc.direction), side = "left";
+    if (order) {
+      var partPos = getBidiPartAt(order, pos.ch);
+      side = partPos % 2 ? "right" : "left";
+    }
+    var result = nodeAndOffsetInLineMap(info.map, pos.ch, side);
+    result.offset = result.collapse == "right" ? result.end : result.start;
+    return result
+  }
+
+  function isInGutter(node) {
+    for (var scan = node; scan; scan = scan.parentNode)
+      { if (/CodeMirror-gutter-wrapper/.test(scan.className)) { return true } }
+    return false
+  }
+
+  function badPos(pos, bad) { if (bad) { pos.bad = true; } return pos }
+
+  function domTextBetween(cm, from, to, fromLine, toLine) {
+    var text = "", closing = false, lineSep = cm.doc.lineSeparator(), extraLinebreak = false;
+    function recognizeMarker(id) { return function (marker) { return marker.id == id; } }
+    function close() {
+      if (closing) {
+        text += lineSep;
+        if (extraLinebreak) { text += lineSep; }
+        closing = extraLinebreak = false;
+      }
+    }
+    function addText(str) {
+      if (str) {
+        close();
+        text += str;
+      }
+    }
+    function walk(node) {
+      if (node.nodeType == 1) {
+        var cmText = node.getAttribute("cm-text");
+        if (cmText) {
+          addText(cmText);
+          return
+        }
+        var markerID = node.getAttribute("cm-marker"), range;
+        if (markerID) {
+          var found = cm.findMarks(Pos(fromLine, 0), Pos(toLine + 1, 0), recognizeMarker(+markerID));
+          if (found.length && (range = found[0].find(0)))
+            { addText(getBetween(cm.doc, range.from, range.to).join(lineSep)); }
+          return
+        }
+        if (node.getAttribute("contenteditable") == "false") { return }
+        var isBlock = /^(pre|div|p|li|table|br)$/i.test(node.nodeName);
+        if (!/^br$/i.test(node.nodeName) && node.textContent.length == 0) { return }
+
+        if (isBlock) { close(); }
+        for (var i = 0; i < node.childNodes.length; i++)
+          { walk(node.childNodes[i]); }
+
+        if (/^(pre|p)$/i.test(node.nodeName)) { extraLinebreak = true; }
+        if (isBlock) { closing = true; }
+      } else if (node.nodeType == 3) {
+        addText(node.nodeValue.replace(/\u200b/g, "").replace(/\u00a0/g, " "));
+      }
+    }
+    for (;;) {
+      walk(from);
+      if (from == to) { break }
+      from = from.nextSibling;
+      extraLinebreak = false;
+    }
+    return text
+  }
+
+  function domToPos(cm, node, offset) {
+    var lineNode;
+    if (node == cm.display.lineDiv) {
+      lineNode = cm.display.lineDiv.childNodes[offset];
+      if (!lineNode) { return badPos(cm.clipPos(Pos(cm.display.viewTo - 1)), true) }
+      node = null; offset = 0;
+    } else {
+      for (lineNode = node;; lineNode = lineNode.parentNode) {
+        if (!lineNode || lineNode == cm.display.lineDiv) { return null }
+        if (lineNode.parentNode && lineNode.parentNode == cm.display.lineDiv) { break }
+      }
+    }
+    for (var i = 0; i < cm.display.view.length; i++) {
+      var lineView = cm.display.view[i];
+      if (lineView.node == lineNode)
+        { return locateNodeInLineView(lineView, node, offset) }
+    }
+  }
+
+  function locateNodeInLineView(lineView, node, offset) {
+    var wrapper = lineView.text.firstChild, bad = false;
+    if (!node || !contains(wrapper, node)) { return badPos(Pos(lineNo(lineView.line), 0), true) }
+    if (node == wrapper) {
+      bad = true;
+      node = wrapper.childNodes[offset];
+      offset = 0;
+      if (!node) {
+        var line = lineView.rest ? lst(lineView.rest) : lineView.line;
+        return badPos(Pos(lineNo(line), line.text.length), bad)
+      }
+    }
+
+    var textNode = node.nodeType == 3 ? node : null, topNode = node;
+    if (!textNode && node.childNodes.length == 1 && node.firstChild.nodeType == 3) {
+      textNode = node.firstChild;
+      if (offset) { offset = textNode.nodeValue.length; }
+    }
+    while (topNode.parentNode != wrapper) { topNode = topNode.parentNode; }
+    var measure = lineView.measure, maps = measure.maps;
+
+    function find(textNode, topNode, offset) {
+      for (var i = -1; i < (maps ? maps.length : 0); i++) {
+        var map = i < 0 ? measure.map : maps[i];
+        for (var j = 0; j < map.length; j += 3) {
+          var curNode = map[j + 2];
+          if (curNode == textNode || curNode == topNode) {
+            var line = lineNo(i < 0 ? lineView.line : lineView.rest[i]);
+            var ch = map[j] + offset;
+            if (offset < 0 || curNode != textNode) { ch = map[j + (offset ? 1 : 0)]; }
+            return Pos(line, ch)
+          }
+        }
+      }
+    }
+    var found = find(textNode, topNode, offset);
+    if (found) { return badPos(found, bad) }
+
+    // FIXME this is all really shaky. might handle the few cases it needs to handle, but likely to cause problems
+    for (var after = topNode.nextSibling, dist = textNode ? textNode.nodeValue.length - offset : 0; after; after = after.nextSibling) {
+      found = find(after, after.firstChild, 0);
+      if (found)
+        { return badPos(Pos(found.line, found.ch - dist), bad) }
+      else
+        { dist += after.textContent.length; }
+    }
+    for (var before = topNode.previousSibling, dist$1 = offset; before; before = before.previousSibling) {
+      found = find(before, before.firstChild, -1);
+      if (found)
+        { return badPos(Pos(found.line, found.ch + dist$1), bad) }
+      else
+        { dist$1 += before.textContent.length; }
+    }
+  }
+
+  // TEXTAREA INPUT STYLE
+
+  var TextareaInput = function(cm) {
+    this.cm = cm;
+    // See input.poll and input.reset
+    this.prevInput = "";
+
+    // Flag that indicates whether we expect input to appear real soon
+    // now (after some event like 'keypress' or 'input') and are
+    // polling intensively.
+    this.pollingFast = false;
+    // Self-resetting timeout for the poller
+    this.polling = new Delayed();
+    // Used to work around IE issue with selection being forgotten when focus moves away from textarea
+    this.hasSelection = false;
+    this.composing = null;
+  };
+
+  TextareaInput.prototype.init = function (display) {
+      var this$1 = this;
+
+    var input = this, cm = this.cm;
+    this.createField(display);
+    var te = this.textarea;
+
+    display.wrapper.insertBefore(this.wrapper, display.wrapper.firstChild);
+
+    // Needed to hide big blue blinking cursor on Mobile Safari (doesn't seem to work in iOS 8 anymore)
+    if (ios) { te.style.width = "0px"; }
+
+    on(te, "input", function () {
+      if (ie && ie_version >= 9 && this$1.hasSelection) { this$1.hasSelection = null; }
+      input.poll();
+    });
+
+    on(te, "paste", function (e) {
+      if (signalDOMEvent(cm, e) || handlePaste(e, cm)) { return }
+
+      cm.state.pasteIncoming = +new Date;
+      input.fastPoll();
+    });
+
+    function prepareCopyCut(e) {
+      if (signalDOMEvent(cm, e)) { return }
+      if (cm.somethingSelected()) {
+        setLastCopied({lineWise: false, text: cm.getSelections()});
+      } else if (!cm.options.lineWiseCopyCut) {
+        return
+      } else {
+        var ranges = copyableRanges(cm);
+        setLastCopied({lineWise: true, text: ranges.text});
+        if (e.type == "cut") {
+          cm.setSelections(ranges.ranges, null, sel_dontScroll);
+        } else {
+          input.prevInput = "";
+          te.value = ranges.text.join("\n");
+          selectInput(te);
+        }
+      }
+      if (e.type == "cut") { cm.state.cutIncoming = +new Date; }
+    }
+    on(te, "cut", prepareCopyCut);
+    on(te, "copy", prepareCopyCut);
+
+    on(display.scroller, "paste", function (e) {
+      if (eventInWidget(display, e) || signalDOMEvent(cm, e)) { return }
+      if (!te.dispatchEvent) {
+        cm.state.pasteIncoming = +new Date;
+        input.focus();
+        return
+      }
+
+      // Pass the `paste` event to the textarea so it's handled by its event listener.
+      var event = new Event("paste");
+      event.clipboardData = e.clipboardData;
+      te.dispatchEvent(event);
+    });
+
+    // Prevent normal selection in the editor (we handle our own)
+    on(display.lineSpace, "selectstart", function (e) {
+      if (!eventInWidget(display, e)) { e_preventDefault(e); }
+    });
+
+    on(te, "compositionstart", function () {
+      var start = cm.getCursor("from");
+      if (input.composing) { input.composing.range.clear(); }
+      input.composing = {
+        start: start,
+        range: cm.markText(start, cm.getCursor("to"), {className: "CodeMirror-composing"})
+      };
+    });
+    on(te, "compositionend", function () {
+      if (input.composing) {
+        input.poll();
+        input.composing.range.clear();
+        input.composing = null;
+      }
+    });
+  };
+
+  TextareaInput.prototype.createField = function (_display) {
+    // Wraps and hides input textarea
+    this.wrapper = hiddenTextarea();
+    // The semihidden textarea that is focused when the editor is
+    // focused, and receives input.
+    this.textarea = this.wrapper.firstChild;
+  };
+
+  TextareaInput.prototype.screenReaderLabelChanged = function (label) {
+    // Label for screenreaders, accessibility
+    if(label) {
+      this.textarea.setAttribute('aria-label', label);
+    } else {
+      this.textarea.removeAttribute('aria-label');
+    }
+  };
+
+  TextareaInput.prototype.prepareSelection = function () {
+    // Redraw the selection and/or cursor
+    var cm = this.cm, display = cm.display, doc = cm.doc;
+    var result = prepareSelection(cm);
+
+    // Move the hidden textarea near the cursor to prevent scrolling artifacts
+    if (cm.options.moveInputWithCursor) {
+      var headPos = cursorCoords(cm, doc.sel.primary().head, "div");
+      var wrapOff = display.wrapper.getBoundingClientRect(), lineOff = display.lineDiv.getBoundingClientRect();
+      result.teTop = Math.max(0, Math.min(display.wrapper.clientHeight - 10,
+                                          headPos.top + lineOff.top - wrapOff.top));
+      result.teLeft = Math.max(0, Math.min(display.wrapper.clientWidth - 10,
+                                           headPos.left + lineOff.left - wrapOff.left));
+    }
+
+    return result
+  };
+
+  TextareaInput.prototype.showSelection = function (drawn) {
+    var cm = this.cm, display = cm.display;
+    removeChildrenAndAdd(display.cursorDiv, drawn.cursors);
+    removeChildrenAndAdd(display.selectionDiv, drawn.selection);
+    if (drawn.teTop != null) {
+      this.wrapper.style.top = drawn.teTop + "px";
+      this.wrapper.style.left = drawn.teLeft + "px";
+    }
+  };
+
+  // Reset the input to correspond to the selection (or to be empty,
+  // when not typing and nothing is selected)
+  TextareaInput.prototype.reset = function (typing) {
+    if (this.contextMenuPending || this.composing) { return }
+    var cm = this.cm;
+    if (cm.somethingSelected()) {
+      this.prevInput = "";
+      var content = cm.getSelection();
+      this.textarea.value = content;
+      if (cm.state.focused) { selectInput(this.textarea); }
+      if (ie && ie_version >= 9) { this.hasSelection = content; }
+    } else if (!typing) {
+      this.prevInput = this.textarea.value = "";
+      if (ie && ie_version >= 9) { this.hasSelection = null; }
+    }
+  };
+
+  TextareaInput.prototype.getField = function () { return this.textarea };
+
+  TextareaInput.prototype.supportsTouch = function () { return false };
+
+  TextareaInput.prototype.focus = function () {
+    if (this.cm.options.readOnly != "nocursor" && (!mobile || activeElt() != this.textarea)) {
+      try { this.textarea.focus(); }
+      catch (e) {} // IE8 will throw if the textarea is display: none or not in DOM
+    }
+  };
+
+  TextareaInput.prototype.blur = function () { this.textarea.blur(); };
+
+  TextareaInput.prototype.resetPosition = function () {
+    this.wrapper.style.top = this.wrapper.style.left = 0;
+  };
+
+  TextareaInput.prototype.receivedFocus = function () { this.slowPoll(); };
+
+  // Poll for input changes, using the normal rate of polling. This
+  // runs as long as the editor is focused.
+  TextareaInput.prototype.slowPoll = function () {
+      var this$1 = this;
+
+    if (this.pollingFast) { return }
+    this.polling.set(this.cm.options.pollInterval, function () {
+      this$1.poll();
+      if (this$1.cm.state.focused) { this$1.slowPoll(); }
+    });
+  };
+
+  // When an event has just come in that is likely to add or change
+  // something in the input textarea, we poll faster, to ensure that
+  // the change appears on the screen quickly.
+  TextareaInput.prototype.fastPoll = function () {
+    var missed = false, input = this;
+    input.pollingFast = true;
+    function p() {
+      var changed = input.poll();
+      if (!changed && !missed) {missed = true; input.polling.set(60, p);}
+      else {input.pollingFast = false; input.slowPoll();}
+    }
+    input.polling.set(20, p);
+  };
+
+  // Read input from the textarea, and update the document to match.
+  // When something is selected, it is present in the textarea, and
+  // selected (unless it is huge, in which case a placeholder is
+  // used). When nothing is selected, the cursor sits after previously
+  // seen text (can be empty), which is stored in prevInput (we must
+  // not reset the textarea when typing, because that breaks IME).
+  TextareaInput.prototype.poll = function () {
+      var this$1 = this;
+
+    var cm = this.cm, input = this.textarea, prevInput = this.prevInput;
+    // Since this is called a *lot*, try to bail out as cheaply as
+    // possible when it is clear that nothing happened. hasSelection
+    // will be the case when there is a lot of text in the textarea,
+    // in which case reading its value would be expensive.
+    if (this.contextMenuPending || !cm.state.focused ||
+        (hasSelection(input) && !prevInput && !this.composing) ||
+        cm.isReadOnly() || cm.options.disableInput || cm.state.keySeq)
+      { return false }
+
+    var text = input.value;
+    // If nothing changed, bail.
+    if (text == prevInput && !cm.somethingSelected()) { return false }
+    // Work around nonsensical selection resetting in IE9/10, and
+    // inexplicable appearance of private area unicode characters on
+    // some key combos in Mac (#2689).
+    if (ie && ie_version >= 9 && this.hasSelection === text ||
+        mac && /[\uf700-\uf7ff]/.test(text)) {
+      cm.display.input.reset();
+      return false
+    }
+
+    if (cm.doc.sel == cm.display.selForContextMenu) {
+      var first = text.charCodeAt(0);
+      if (first == 0x200b && !prevInput) { prevInput = "\u200b"; }
+      if (first == 0x21da) { this.reset(); return this.cm.execCommand("undo") }
+    }
+    // Find the part of the input that is actually new
+    var same = 0, l = Math.min(prevInput.length, text.length);
+    while (same < l && prevInput.charCodeAt(same) == text.charCodeAt(same)) { ++same; }
+
+    runInOp(cm, function () {
+      applyTextInput(cm, text.slice(same), prevInput.length - same,
+                     null, this$1.composing ? "*compose" : null);
+
+      // Don't leave long text in the textarea, since it makes further polling slow
+      if (text.length > 1000 || text.indexOf("\n") > -1) { input.value = this$1.prevInput = ""; }
+      else { this$1.prevInput = text; }
+
+      if (this$1.composing) {
+        this$1.composing.range.clear();
+        this$1.composing.range = cm.markText(this$1.composing.start, cm.getCursor("to"),
+                                           {className: "CodeMirror-composing"});
+      }
+    });
+    return true
+  };
+
+  TextareaInput.prototype.ensurePolled = function () {
+    if (this.pollingFast && this.poll()) { this.pollingFast = false; }
+  };
+
+  TextareaInput.prototype.onKeyPress = function () {
+    if (ie && ie_version >= 9) { this.hasSelection = null; }
+    this.fastPoll();
+  };
+
+  TextareaInput.prototype.onContextMenu = function (e) {
+    var input = this, cm = input.cm, display = cm.display, te = input.textarea;
+    if (input.contextMenuPending) { input.contextMenuPending(); }
+    var pos = posFromMouse(cm, e), scrollPos = display.scroller.scrollTop;
+    if (!pos || presto) { return } // Opera is difficult.
+
+    // Reset the current text selection only if the click is done outside of the selection
+    // and 'resetSelectionOnContextMenu' option is true.
+    var reset = cm.options.resetSelectionOnContextMenu;
+    if (reset && cm.doc.sel.contains(pos) == -1)
+      { operation(cm, setSelection)(cm.doc, simpleSelection(pos), sel_dontScroll); }
+
+    var oldCSS = te.style.cssText, oldWrapperCSS = input.wrapper.style.cssText;
+    var wrapperBox = input.wrapper.offsetParent.getBoundingClientRect();
+    input.wrapper.style.cssText = "position: static";
+    te.style.cssText = "position: absolute; width: 30px; height: 30px;\n      top: " + (e.clientY - wrapperBox.top - 5) + "px; left: " + (e.clientX - wrapperBox.left - 5) + "px;\n      z-index: 1000; background: " + (ie ? "rgba(255, 255, 255, .05)" : "transparent") + ";\n      outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);";
+    var oldScrollY;
+    if (webkit) { oldScrollY = window.scrollY; } // Work around Chrome issue (#2712)
+    display.input.focus();
+    if (webkit) { window.scrollTo(null, oldScrollY); }
+    display.input.reset();
+    // Adds "Select all" to context menu in FF
+    if (!cm.somethingSelected()) { te.value = input.prevInput = " "; }
+    input.contextMenuPending = rehide;
+    display.selForContextMenu = cm.doc.sel;
+    clearTimeout(display.detectingSelectAll);
+
+    // Select-all will be greyed out if there's nothing to select, so
+    // this adds a zero-width space so that we can later check whether
+    // it got selected.
+    function prepareSelectAllHack() {
+      if (te.selectionStart != null) {
+        var selected = cm.somethingSelected();
+        var extval = "\u200b" + (selected ? te.value : "");
+        te.value = "\u21da"; // Used to catch context-menu undo
+        te.value = extval;
+        input.prevInput = selected ? "" : "\u200b";
+        te.selectionStart = 1; te.selectionEnd = extval.length;
+        // Re-set this, in case some other handler touched the
+        // selection in the meantime.
+        display.selForContextMenu = cm.doc.sel;
+      }
+    }
+    function rehide() {
+      if (input.contextMenuPending != rehide) { return }
+      input.contextMenuPending = false;
+      input.wrapper.style.cssText = oldWrapperCSS;
+      te.style.cssText = oldCSS;
+      if (ie && ie_version < 9) { display.scrollbars.setScrollTop(display.scroller.scrollTop = scrollPos); }
+
+      // Try to detect the user choosing select-all
+      if (te.selectionStart != null) {
+        if (!ie || (ie && ie_version < 9)) { prepareSelectAllHack(); }
+        var i = 0, poll = function () {
+          if (display.selForContextMenu == cm.doc.sel && te.selectionStart == 0 &&
+              te.selectionEnd > 0 && input.prevInput == "\u200b") {
+            operation(cm, selectAll)(cm);
+          } else if (i++ < 10) {
+            display.detectingSelectAll = setTimeout(poll, 500);
+          } else {
+            display.selForContextMenu = null;
+            display.input.reset();
+          }
+        };
+        display.detectingSelectAll = setTimeout(poll, 200);
+      }
+    }
+
+    if (ie && ie_version >= 9) { prepareSelectAllHack(); }
+    if (captureRightClick) {
+      e_stop(e);
+      var mouseup = function () {
+        off(window, "mouseup", mouseup);
+        setTimeout(rehide, 20);
+      };
+      on(window, "mouseup", mouseup);
+    } else {
+      setTimeout(rehide, 50);
+    }
+  };
+
+  TextareaInput.prototype.readOnlyChanged = function (val) {
+    if (!val) { this.reset(); }
+    this.textarea.disabled = val == "nocursor";
+    this.textarea.readOnly = !!val;
+  };
+
+  TextareaInput.prototype.setUneditable = function () {};
+
+  TextareaInput.prototype.needsContentAttribute = false;
+
+  function fromTextArea(textarea, options) {
+    options = options ? copyObj(options) : {};
+    options.value = textarea.value;
+    if (!options.tabindex && textarea.tabIndex)
+      { options.tabindex = textarea.tabIndex; }
+    if (!options.placeholder && textarea.placeholder)
+      { options.placeholder = textarea.placeholder; }
+    // Set autofocus to true if this textarea is focused, or if it has
+    // autofocus and no other element is focused.
+    if (options.autofocus == null) {
+      var hasFocus = activeElt();
+      options.autofocus = hasFocus == textarea ||
+        textarea.getAttribute("autofocus") != null && hasFocus == document.body;
+    }
+
+    function save() {textarea.value = cm.getValue();}
+
+    var realSubmit;
+    if (textarea.form) {
+      on(textarea.form, "submit", save);
+      // Deplorable hack to make the submit method do the right thing.
+      if (!options.leaveSubmitMethodAlone) {
+        var form = textarea.form;
+        realSubmit = form.submit;
+        try {
+          var wrappedSubmit = form.submit = function () {
+            save();
+            form.submit = realSubmit;
+            form.submit();
+            form.submit = wrappedSubmit;
+          };
+        } catch(e) {}
+      }
+    }
+
+    options.finishInit = function (cm) {
+      cm.save = save;
+      cm.getTextArea = function () { return textarea; };
+      cm.toTextArea = function () {
+        cm.toTextArea = isNaN; // Prevent this from being ran twice
+        save();
+        textarea.parentNode.removeChild(cm.getWrapperElement());
+        textarea.style.display = "";
+        if (textarea.form) {
+          off(textarea.form, "submit", save);
+          if (!options.leaveSubmitMethodAlone && typeof textarea.form.submit == "function")
+            { textarea.form.submit = realSubmit; }
+        }
+      };
+    };
+
+    textarea.style.display = "none";
+    var cm = CodeMirror(function (node) { return textarea.parentNode.insertBefore(node, textarea.nextSibling); },
+      options);
+    return cm
+  }
+
+  function addLegacyProps(CodeMirror) {
+    CodeMirror.off = off;
+    CodeMirror.on = on;
+    CodeMirror.wheelEventPixels = wheelEventPixels;
+    CodeMirror.Doc = Doc;
+    CodeMirror.splitLines = splitLinesAuto;
+    CodeMirror.countColumn = countColumn;
+    CodeMirror.findColumn = findColumn;
+    CodeMirror.isWordChar = isWordCharBasic;
+    CodeMirror.Pass = Pass;
+    CodeMirror.signal = signal;
+    CodeMirror.Line = Line;
+    CodeMirror.changeEnd = changeEnd;
+    CodeMirror.scrollbarModel = scrollbarModel;
+    CodeMirror.Pos = Pos;
+    CodeMirror.cmpPos = cmp;
+    CodeMirror.modes = modes;
+    CodeMirror.mimeModes = mimeModes;
+    CodeMirror.resolveMode = resolveMode;
+    CodeMirror.getMode = getMode;
+    CodeMirror.modeExtensions = modeExtensions;
+    CodeMirror.extendMode = extendMode;
+    CodeMirror.copyState = copyState;
+    CodeMirror.startState = startState;
+    CodeMirror.innerMode = innerMode;
+    CodeMirror.commands = commands;
+    CodeMirror.keyMap = keyMap;
+    CodeMirror.keyName = keyName;
+    CodeMirror.isModifierKey = isModifierKey;
+    CodeMirror.lookupKey = lookupKey;
+    CodeMirror.normalizeKeyMap = normalizeKeyMap;
+    CodeMirror.StringStream = StringStream;
+    CodeMirror.SharedTextMarker = SharedTextMarker;
+    CodeMirror.TextMarker = TextMarker;
+    CodeMirror.LineWidget = LineWidget;
+    CodeMirror.e_preventDefault = e_preventDefault;
+    CodeMirror.e_stopPropagation = e_stopPropagation;
+    CodeMirror.e_stop = e_stop;
+    CodeMirror.addClass = addClass;
+    CodeMirror.contains = contains;
+    CodeMirror.rmClass = rmClass;
+    CodeMirror.keyNames = keyNames;
+  }
+
+  // EDITOR CONSTRUCTOR
+
+  defineOptions(CodeMirror);
+
+  addEditorMethods(CodeMirror);
+
+  // Set up methods on CodeMirror's prototype to redirect to the editor's document.
+  var dontDelegate = "iter insert remove copy getEditor constructor".split(" ");
+  for (var prop in Doc.prototype) { if (Doc.prototype.hasOwnProperty(prop) && indexOf(dontDelegate, prop) < 0)
+    { CodeMirror.prototype[prop] = (function(method) {
+      return function() {return method.apply(this.doc, arguments)}
+    })(Doc.prototype[prop]); } }
+
+  eventMixin(Doc);
+  CodeMirror.inputStyles = {"textarea": TextareaInput, "contenteditable": ContentEditableInput};
+
+  // Extra arguments are stored as the mode's dependencies, which is
+  // used by (legacy) mechanisms like loadmode.js to automatically
+  // load a mode. (Preferred mechanism is the require/define calls.)
+  CodeMirror.defineMode = function(name/*, mode, 鈥�*/) {
+    if (!CodeMirror.defaults.mode && name != "null") { CodeMirror.defaults.mode = name; }
+    defineMode.apply(this, arguments);
+  };
+
+  CodeMirror.defineMIME = defineMIME;
+
+  // Minimal default mode.
+  CodeMirror.defineMode("null", function () { return ({token: function (stream) { return stream.skipToEnd(); }}); });
+  CodeMirror.defineMIME("text/plain", "null");
+
+  // EXTENSIONS
+
+  CodeMirror.defineExtension = function (name, func) {
+    CodeMirror.prototype[name] = func;
+  };
+  CodeMirror.defineDocExtension = function (name, func) {
+    Doc.prototype[name] = func;
+  };
+
+  CodeMirror.fromTextArea = fromTextArea;
+
+  addLegacyProps(CodeMirror);
+
+  CodeMirror.version = "5.60.0";
+
+  return CodeMirror;
+
+})));
diff --git a/Source/platformProject/platform2022UI/jslib/yaml/js/js-yaml.js b/Source/platformProject/platform2022UI/jslib/yaml/js/js-yaml.js
new file mode 100644
index 0000000..2ae2f9e
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/yaml/js/js-yaml.js
@@ -0,0 +1,3854 @@
+
+/*! js-yaml 4.0.0 https://github.com/nodeca/js-yaml @license MIT */
+(function (global, factory) {
+  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
+      typeof define === 'function' && define.amd ? define(['exports'], factory) :
+          (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.jsyaml = {}));
+}(this, (function (exports) { 'use strict';
+
+  function isNothing(subject) {
+    return (typeof subject === 'undefined') || (subject === null);
+  }
+
+
+  function isObject(subject) {
+    return (typeof subject === 'object') && (subject !== null);
+  }
+
+
+  function toArray(sequence) {
+    if (Array.isArray(sequence)) return sequence;
+    else if (isNothing(sequence)) return [];
+
+    return [ sequence ];
+  }
+
+
+  function extend(target, source) {
+    var index, length, key, sourceKeys;
+
+    if (source) {
+      sourceKeys = Object.keys(source);
+
+      for (index = 0, length = sourceKeys.length; index < length; index += 1) {
+        key = sourceKeys[index];
+        target[key] = source[key];
+      }
+    }
+
+    return target;
+  }
+
+
+  function repeat(string, count) {
+    var result = '', cycle;
+
+    for (cycle = 0; cycle < count; cycle += 1) {
+      result += string;
+    }
+
+    return result;
+  }
+
+
+  function isNegativeZero(number) {
+    return (number === 0) && (Number.NEGATIVE_INFINITY === 1 / number);
+  }
+
+
+  var isNothing_1      = isNothing;
+  var isObject_1       = isObject;
+  var toArray_1        = toArray;
+  var repeat_1         = repeat;
+  var isNegativeZero_1 = isNegativeZero;
+  var extend_1         = extend;
+
+  var common = {
+    isNothing: isNothing_1,
+    isObject: isObject_1,
+    toArray: toArray_1,
+    repeat: repeat_1,
+    isNegativeZero: isNegativeZero_1,
+    extend: extend_1
+  };
+
+  // YAML error class. http://stackoverflow.com/questions/8458984
+
+
+  function formatError(exception, compact) {
+    var where = '', message = exception.reason || '(unknown reason)';
+
+    if (!exception.mark) return message;
+
+    if (exception.mark.name) {
+      where += 'in "' + exception.mark.name + '" ';
+    }
+
+    where += '(' + (exception.mark.line + 1) + ':' + (exception.mark.column + 1) + ')';
+
+    if (!compact && exception.mark.snippet) {
+      where += '\n\n' + exception.mark.snippet;
+    }
+
+    return message + ' ' + where;
+  }
+
+
+  function YAMLException(reason, mark) {
+    // Super constructor
+    Error.call(this);
+
+    this.name = 'YAMLException';
+    this.reason = reason;
+    this.mark = mark;
+    this.message = formatError(this, false);
+
+    // Include stack trace in error object
+    if (Error.captureStackTrace) {
+      // Chrome and NodeJS
+      Error.captureStackTrace(this, this.constructor);
+    } else {
+      // FF, IE 10+ and Safari 6+. Fallback for others
+      this.stack = (new Error()).stack || '';
+    }
+  }
+
+
+  // Inherit from Error
+  YAMLException.prototype = Object.create(Error.prototype);
+  YAMLException.prototype.constructor = YAMLException;
+
+
+  YAMLException.prototype.toString = function toString(compact) {
+    return this.name + ': ' + formatError(this, compact);
+  };
+
+
+  var exception = YAMLException;
+
+  // get snippet for a single line, respecting maxLength
+  function getLine(buffer, lineStart, lineEnd, position, maxLineLength) {
+    var head = '';
+    var tail = '';
+    var maxHalfLength = Math.floor(maxLineLength / 2) - 1;
+
+    if (position - lineStart > maxHalfLength) {
+      head = ' ... ';
+      lineStart = position - maxHalfLength + head.length;
+    }
+
+    if (lineEnd - position > maxHalfLength) {
+      tail = ' ...';
+      lineEnd = position + maxHalfLength - tail.length;
+    }
+
+    return {
+      str: head + buffer.slice(lineStart, lineEnd).replace(/\t/g, '鈫�') + tail,
+      pos: position - lineStart + head.length // relative position
+    };
+  }
+
+
+  function padStart(string, max) {
+    return common.repeat(' ', max - string.length) + string;
+  }
+
+
+  function makeSnippet(mark, options) {
+    options = Object.create(options || null);
+
+    if (!mark.buffer) return null;
+
+    if (!options.maxLength) options.maxLength = 79;
+    if (typeof options.indent      !== 'number') options.indent      = 1;
+    if (typeof options.linesBefore !== 'number') options.linesBefore = 3;
+    if (typeof options.linesAfter  !== 'number') options.linesAfter  = 2;
+
+    var re = /\r?\n|\r|\0/g;
+    var lineStarts = [ 0 ];
+    var lineEnds = [];
+    var match;
+    var foundLineNo = -1;
+
+    while ((match = re.exec(mark.buffer))) {
+      lineEnds.push(match.index);
+      lineStarts.push(match.index + match[0].length);
+
+      if (mark.position <= match.index && foundLineNo < 0) {
+        foundLineNo = lineStarts.length - 2;
+      }
+    }
+
+    if (foundLineNo < 0) foundLineNo = lineStarts.length - 1;
+
+    var result = '', i, line;
+    var lineNoLength = Math.min(mark.line + options.linesAfter, lineEnds.length).toString().length;
+    var maxLineLength = options.maxLength - (options.indent + lineNoLength + 3);
+
+    for (i = 1; i <= options.linesBefore; i++) {
+      if (foundLineNo - i < 0) break;
+      line = getLine(
+          mark.buffer,
+          lineStarts[foundLineNo - i],
+          lineEnds[foundLineNo - i],
+          mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo - i]),
+          maxLineLength
+      );
+      result = common.repeat(' ', options.indent) + padStart((mark.line - i + 1).toString(), lineNoLength) +
+          ' | ' + line.str + '\n' + result;
+    }
+
+    line = getLine(mark.buffer, lineStarts[foundLineNo], lineEnds[foundLineNo], mark.position, maxLineLength);
+    result += common.repeat(' ', options.indent) + padStart((mark.line + 1).toString(), lineNoLength) +
+        ' | ' + line.str + '\n';
+    result += common.repeat('-', options.indent + lineNoLength + 3 + line.pos) + '^' + '\n';
+
+    for (i = 1; i <= options.linesAfter; i++) {
+      if (foundLineNo + i >= lineEnds.length) break;
+      line = getLine(
+          mark.buffer,
+          lineStarts[foundLineNo + i],
+          lineEnds[foundLineNo + i],
+          mark.position - (lineStarts[foundLineNo] - lineStarts[foundLineNo + i]),
+          maxLineLength
+      );
+      result += common.repeat(' ', options.indent) + padStart((mark.line + i + 1).toString(), lineNoLength) +
+          ' | ' + line.str + '\n';
+    }
+
+    return result.replace(/\n$/, '');
+  }
+
+
+  var snippet = makeSnippet;
+
+  var TYPE_CONSTRUCTOR_OPTIONS = [
+    'kind',
+    'multi',
+    'resolve',
+    'construct',
+    'instanceOf',
+    'predicate',
+    'represent',
+    'representName',
+    'defaultStyle',
+    'styleAliases'
+  ];
+
+  var YAML_NODE_KINDS = [
+    'scalar',
+    'sequence',
+    'mapping'
+  ];
+
+  function compileStyleAliases(map) {
+    var result = {};
+
+    if (map !== null) {
+      Object.keys(map).forEach(function (style) {
+        map[style].forEach(function (alias) {
+          result[String(alias)] = style;
+        });
+      });
+    }
+
+    return result;
+  }
+
+  function Type(tag, options) {
+    options = options || {};
+
+    Object.keys(options).forEach(function (name) {
+      if (TYPE_CONSTRUCTOR_OPTIONS.indexOf(name) === -1) {
+        throw new exception('Unknown option "' + name + '" is met in definition of "' + tag + '" YAML type.');
+      }
+    });
+
+    // TODO: Add tag format check.
+    this.tag           = tag;
+    this.kind          = options['kind']          || null;
+    this.resolve       = options['resolve']       || function () { return true; };
+    this.construct     = options['construct']     || function (data) { return data; };
+    this.instanceOf    = options['instanceOf']    || null;
+    this.predicate     = options['predicate']     || null;
+    this.represent     = options['represent']     || null;
+    this.representName = options['representName'] || null;
+    this.defaultStyle  = options['defaultStyle']  || null;
+    this.multi         = options['multi']         || false;
+    this.styleAliases  = compileStyleAliases(options['styleAliases'] || null);
+
+    if (YAML_NODE_KINDS.indexOf(this.kind) === -1) {
+      throw new exception('Unknown kind "' + this.kind + '" is specified for "' + tag + '" YAML type.');
+    }
+  }
+
+  var type = Type;
+
+  /*eslint-disable max-len*/
+
+
+
+
+
+  function compileList(schema, name, result) {
+    var exclude = [];
+
+    schema[name].forEach(function (currentType) {
+      result.forEach(function (previousType, previousIndex) {
+        if (previousType.tag === currentType.tag &&
+            previousType.kind === currentType.kind &&
+            previousType.multi === currentType.multi) {
+
+          exclude.push(previousIndex);
+        }
+      });
+
+      result.push(currentType);
+    });
+
+    return result.filter(function (type, index) {
+      return exclude.indexOf(index) === -1;
+    });
+  }
+
+
+  function compileMap(/* lists... */) {
+    var result = {
+      scalar: {},
+      sequence: {},
+      mapping: {},
+      fallback: {},
+      multi: {
+        scalar: [],
+        sequence: [],
+        mapping: [],
+        fallback: []
+      }
+    }, index, length;
+
+    function collectType(type) {
+      if (type.multi) {
+        result.multi[type.kind].push(type);
+        result.multi['fallback'].push(type);
+      } else {
+        result[type.kind][type.tag] = result['fallback'][type.tag] = type;
+      }
+    }
+
+    for (index = 0, length = arguments.length; index < length; index += 1) {
+      arguments[index].forEach(collectType);
+    }
+    return result;
+  }
+
+
+  function Schema(definition) {
+    return this.extend(definition);
+  }
+
+
+  Schema.prototype.extend = function extend(definition) {
+    var implicit = [];
+    var explicit = [];
+
+    if (definition instanceof type) {
+      // Schema.extend(type)
+      explicit.push(definition);
+
+    } else if (Array.isArray(definition)) {
+      // Schema.extend([ type1, type2, ... ])
+      explicit = explicit.concat(definition);
+
+    } else if (definition && (Array.isArray(definition.implicit) || Array.isArray(definition.explicit))) {
+      // Schema.extend({ explicit: [ type1, type2, ... ], implicit: [ type1, type2, ... ] })
+      if (definition.implicit) implicit = implicit.concat(definition.implicit);
+      if (definition.explicit) explicit = explicit.concat(definition.explicit);
+
+    } else {
+      throw new exception('Schema.extend argument should be a Type, [ Type ], ' +
+          'or a schema definition ({ implicit: [...], explicit: [...] })');
+    }
+
+    implicit.forEach(function (type$1) {
+      if (!(type$1 instanceof type)) {
+        throw new exception('Specified list of YAML types (or a single Type object) contains a non-Type object.');
+      }
+
+      if (type$1.loadKind && type$1.loadKind !== 'scalar') {
+        throw new exception('There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.');
+      }
+
+      if (type$1.multi) {
+        throw new exception('There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.');
+      }
+    });
+
+    explicit.forEach(function (type$1) {
+      if (!(type$1 instanceof type)) {
+        throw new exception('Specified list of YAML types (or a single Type object) contains a non-Type object.');
+      }
+    });
+
+    var result = Object.create(Schema.prototype);
+
+    result.implicit = (this.implicit || []).concat(implicit);
+    result.explicit = (this.explicit || []).concat(explicit);
+
+    result.compiledImplicit = compileList(result, 'implicit', []);
+    result.compiledExplicit = compileList(result, 'explicit', []);
+    result.compiledTypeMap  = compileMap(result.compiledImplicit, result.compiledExplicit);
+
+    return result;
+  };
+
+
+  var schema = Schema;
+
+  var str = new type('tag:yaml.org,2002:str', {
+    kind: 'scalar',
+    construct: function (data) { return data !== null ? data : ''; }
+  });
+
+  var seq = new type('tag:yaml.org,2002:seq', {
+    kind: 'sequence',
+    construct: function (data) { return data !== null ? data : []; }
+  });
+
+  var map = new type('tag:yaml.org,2002:map', {
+    kind: 'mapping',
+    construct: function (data) { return data !== null ? data : {}; }
+  });
+
+  var failsafe = new schema({
+    explicit: [
+      str,
+      seq,
+      map
+    ]
+  });
+
+  function resolveYamlNull(data) {
+    if (data === null) return true;
+
+    var max = data.length;
+
+    return (max === 1 && data === '~') ||
+        (max === 4 && (data === 'null' || data === 'Null' || data === 'NULL'));
+  }
+
+  function constructYamlNull() {
+    return null;
+  }
+
+  function isNull(object) {
+    return object === null;
+  }
+
+  var _null = new type('tag:yaml.org,2002:null', {
+    kind: 'scalar',
+    resolve: resolveYamlNull,
+    construct: constructYamlNull,
+    predicate: isNull,
+    represent: {
+      canonical: function () { return '~';    },
+      lowercase: function () { return 'null'; },
+      uppercase: function () { return 'NULL'; },
+      camelcase: function () { return 'Null'; },
+      empty:     function () { return '';     }
+    },
+    defaultStyle: 'lowercase'
+  });
+
+  function resolveYamlBoolean(data) {
+    if (data === null) return false;
+
+    var max = data.length;
+
+    return (max === 4 && (data === 'true' || data === 'True' || data === 'TRUE')) ||
+        (max === 5 && (data === 'false' || data === 'False' || data === 'FALSE'));
+  }
+
+  function constructYamlBoolean(data) {
+    return data === 'true' ||
+        data === 'True' ||
+        data === 'TRUE';
+  }
+
+  function isBoolean(object) {
+    return Object.prototype.toString.call(object) === '[object Boolean]';
+  }
+
+  var bool = new type('tag:yaml.org,2002:bool', {
+    kind: 'scalar',
+    resolve: resolveYamlBoolean,
+    construct: constructYamlBoolean,
+    predicate: isBoolean,
+    represent: {
+      lowercase: function (object) { return object ? 'true' : 'false'; },
+      uppercase: function (object) { return object ? 'TRUE' : 'FALSE'; },
+      camelcase: function (object) { return object ? 'True' : 'False'; }
+    },
+    defaultStyle: 'lowercase'
+  });
+
+  function isHexCode(c) {
+    return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) ||
+        ((0x41/* A */ <= c) && (c <= 0x46/* F */)) ||
+        ((0x61/* a */ <= c) && (c <= 0x66/* f */));
+  }
+
+  function isOctCode(c) {
+    return ((0x30/* 0 */ <= c) && (c <= 0x37/* 7 */));
+  }
+
+  function isDecCode(c) {
+    return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */));
+  }
+
+  function resolveYamlInteger(data) {
+    if (data === null) return false;
+
+    var max = data.length,
+        index = 0,
+        hasDigits = false,
+        ch;
+
+    if (!max) return false;
+
+    ch = data[index];
+
+    // sign
+    if (ch === '-' || ch === '+') {
+      ch = data[++index];
+    }
+
+    if (ch === '0') {
+      // 0
+      if (index + 1 === max) return true;
+      ch = data[++index];
+
+      // base 2, base 8, base 16
+
+      if (ch === 'b') {
+        // base 2
+        index++;
+
+        for (; index < max; index++) {
+          ch = data[index];
+          if (ch === '_') continue;
+          if (ch !== '0' && ch !== '1') return false;
+          hasDigits = true;
+        }
+        return hasDigits && ch !== '_';
+      }
+
+
+      if (ch === 'x') {
+        // base 16
+        index++;
+
+        for (; index < max; index++) {
+          ch = data[index];
+          if (ch === '_') continue;
+          if (!isHexCode(data.charCodeAt(index))) return false;
+          hasDigits = true;
+        }
+        return hasDigits && ch !== '_';
+      }
+
+
+      if (ch === 'o') {
+        // base 8
+        index++;
+
+        for (; index < max; index++) {
+          ch = data[index];
+          if (ch === '_') continue;
+          if (!isOctCode(data.charCodeAt(index))) return false;
+          hasDigits = true;
+        }
+        return hasDigits && ch !== '_';
+      }
+    }
+
+    // base 10 (except 0)
+
+    // value should not start with `_`;
+    if (ch === '_') return false;
+
+    for (; index < max; index++) {
+      ch = data[index];
+      if (ch === '_') continue;
+      if (!isDecCode(data.charCodeAt(index))) {
+        return false;
+      }
+      hasDigits = true;
+    }
+
+    // Should have digits and should not end with `_`
+    if (!hasDigits || ch === '_') return false;
+
+    return true;
+  }
+
+  function constructYamlInteger(data) {
+    var value = data, sign = 1, ch;
+
+    if (value.indexOf('_') !== -1) {
+      value = value.replace(/_/g, '');
+    }
+
+    ch = value[0];
+
+    if (ch === '-' || ch === '+') {
+      if (ch === '-') sign = -1;
+      value = value.slice(1);
+      ch = value[0];
+    }
+
+    if (value === '0') return 0;
+
+    if (ch === '0') {
+      if (value[1] === 'b') return sign * parseInt(value.slice(2), 2);
+      if (value[1] === 'x') return sign * parseInt(value.slice(2), 16);
+      if (value[1] === 'o') return sign * parseInt(value.slice(2), 8);
+    }
+
+    return sign * parseInt(value, 10);
+  }
+
+  function isInteger(object) {
+    return (Object.prototype.toString.call(object)) === '[object Number]' &&
+        (object % 1 === 0 && !common.isNegativeZero(object));
+  }
+
+  var int = new type('tag:yaml.org,2002:int', {
+    kind: 'scalar',
+    resolve: resolveYamlInteger,
+    construct: constructYamlInteger,
+    predicate: isInteger,
+    represent: {
+      binary:      function (obj) { return obj >= 0 ? '0b' + obj.toString(2) : '-0b' + obj.toString(2).slice(1); },
+      octal:       function (obj) { return obj >= 0 ? '0o'  + obj.toString(8) : '-0o'  + obj.toString(8).slice(1); },
+      decimal:     function (obj) { return obj.toString(10); },
+      /* eslint-disable max-len */
+      hexadecimal: function (obj) { return obj >= 0 ? '0x' + obj.toString(16).toUpperCase() :  '-0x' + obj.toString(16).toUpperCase().slice(1); }
+    },
+    defaultStyle: 'decimal',
+    styleAliases: {
+      binary:      [ 2,  'bin' ],
+      octal:       [ 8,  'oct' ],
+      decimal:     [ 10, 'dec' ],
+      hexadecimal: [ 16, 'hex' ]
+    }
+  });
+
+  var YAML_FLOAT_PATTERN = new RegExp(
+      // 2.5e4, 2.5 and integers
+      '^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?' +
+      // .2e4, .2
+      // special case, seems not from spec
+      '|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?' +
+      // .inf
+      '|[-+]?\\.(?:inf|Inf|INF)' +
+      // .nan
+      '|\\.(?:nan|NaN|NAN))$');
+
+  function resolveYamlFloat(data) {
+    if (data === null) return false;
+
+    if (!YAML_FLOAT_PATTERN.test(data) ||
+        // Quick hack to not allow integers end with `_`
+        // Probably should update regexp & check speed
+        data[data.length - 1] === '_') {
+      return false;
+    }
+
+    return true;
+  }
+
+  function constructYamlFloat(data) {
+    var value, sign;
+
+    value  = data.replace(/_/g, '').toLowerCase();
+    sign   = value[0] === '-' ? -1 : 1;
+
+    if ('+-'.indexOf(value[0]) >= 0) {
+      value = value.slice(1);
+    }
+
+    if (value === '.inf') {
+      return (sign === 1) ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY;
+
+    } else if (value === '.nan') {
+      return NaN;
+    }
+    return sign * parseFloat(value, 10);
+  }
+
+
+  var SCIENTIFIC_WITHOUT_DOT = /^[-+]?[0-9]+e/;
+
+  function representYamlFloat(object, style) {
+    var res;
+
+    if (isNaN(object)) {
+      switch (style) {
+        case 'lowercase': return '.nan';
+        case 'uppercase': return '.NAN';
+        case 'camelcase': return '.NaN';
+      }
+    } else if (Number.POSITIVE_INFINITY === object) {
+      switch (style) {
+        case 'lowercase': return '.inf';
+        case 'uppercase': return '.INF';
+        case 'camelcase': return '.Inf';
+      }
+    } else if (Number.NEGATIVE_INFINITY === object) {
+      switch (style) {
+        case 'lowercase': return '-.inf';
+        case 'uppercase': return '-.INF';
+        case 'camelcase': return '-.Inf';
+      }
+    } else if (common.isNegativeZero(object)) {
+      return '-0.0';
+    }
+
+    res = object.toString(10);
+
+    // JS stringifier can build scientific format without dots: 5e-100,
+    // while YAML requres dot: 5.e-100. Fix it with simple hack
+
+    return SCIENTIFIC_WITHOUT_DOT.test(res) ? res.replace('e', '.e') : res;
+  }
+
+  function isFloat(object) {
+    return (Object.prototype.toString.call(object) === '[object Number]') &&
+        (object % 1 !== 0 || common.isNegativeZero(object));
+  }
+
+  var float = new type('tag:yaml.org,2002:float', {
+    kind: 'scalar',
+    resolve: resolveYamlFloat,
+    construct: constructYamlFloat,
+    predicate: isFloat,
+    represent: representYamlFloat,
+    defaultStyle: 'lowercase'
+  });
+
+  var json = failsafe.extend({
+    implicit: [
+      _null,
+      bool,
+      int,
+      float
+    ]
+  });
+
+  var core = json;
+
+  var YAML_DATE_REGEXP = new RegExp(
+      '^([0-9][0-9][0-9][0-9])'          + // [1] year
+      '-([0-9][0-9])'                    + // [2] month
+      '-([0-9][0-9])$');                   // [3] day
+
+  var YAML_TIMESTAMP_REGEXP = new RegExp(
+      '^([0-9][0-9][0-9][0-9])'          + // [1] year
+      '-([0-9][0-9]?)'                   + // [2] month
+      '-([0-9][0-9]?)'                   + // [3] day
+      '(?:[Tt]|[ \\t]+)'                 + // ...
+      '([0-9][0-9]?)'                    + // [4] hour
+      ':([0-9][0-9])'                    + // [5] minute
+      ':([0-9][0-9])'                    + // [6] second
+      '(?:\\.([0-9]*))?'                 + // [7] fraction
+      '(?:[ \\t]*(Z|([-+])([0-9][0-9]?)' + // [8] tz [9] tz_sign [10] tz_hour
+      '(?::([0-9][0-9]))?))?$');           // [11] tz_minute
+
+  function resolveYamlTimestamp(data) {
+    if (data === null) return false;
+    if (YAML_DATE_REGEXP.exec(data) !== null) return true;
+    if (YAML_TIMESTAMP_REGEXP.exec(data) !== null) return true;
+    return false;
+  }
+
+  function constructYamlTimestamp(data) {
+    var match, year, month, day, hour, minute, second, fraction = 0,
+        delta = null, tz_hour, tz_minute, date;
+
+    match = YAML_DATE_REGEXP.exec(data);
+    if (match === null) match = YAML_TIMESTAMP_REGEXP.exec(data);
+
+    if (match === null) throw new Error('Date resolve error');
+
+    // match: [1] year [2] month [3] day
+
+    year = +(match[1]);
+    month = +(match[2]) - 1; // JS month starts with 0
+    day = +(match[3]);
+
+    if (!match[4]) { // no hour
+      return new Date(Date.UTC(year, month, day));
+    }
+
+    // match: [4] hour [5] minute [6] second [7] fraction
+
+    hour = +(match[4]);
+    minute = +(match[5]);
+    second = +(match[6]);
+
+    if (match[7]) {
+      fraction = match[7].slice(0, 3);
+      while (fraction.length < 3) { // milli-seconds
+        fraction += '0';
+      }
+      fraction = +fraction;
+    }
+
+    // match: [8] tz [9] tz_sign [10] tz_hour [11] tz_minute
+
+    if (match[9]) {
+      tz_hour = +(match[10]);
+      tz_minute = +(match[11] || 0);
+      delta = (tz_hour * 60 + tz_minute) * 60000; // delta in mili-seconds
+      if (match[9] === '-') delta = -delta;
+    }
+
+    date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction));
+
+    if (delta) date.setTime(date.getTime() - delta);
+
+    return date;
+  }
+
+  function representYamlTimestamp(object /*, style*/) {
+    return object.toISOString();
+  }
+
+  var timestamp = new type('tag:yaml.org,2002:timestamp', {
+    kind: 'scalar',
+    resolve: resolveYamlTimestamp,
+    construct: constructYamlTimestamp,
+    instanceOf: Date,
+    represent: representYamlTimestamp
+  });
+
+  function resolveYamlMerge(data) {
+    return data === '<<' || data === null;
+  }
+
+  var merge = new type('tag:yaml.org,2002:merge', {
+    kind: 'scalar',
+    resolve: resolveYamlMerge
+  });
+
+  /*eslint-disable no-bitwise*/
+
+
+
+
+
+  // [ 64, 65, 66 ] -> [ padding, CR, LF ]
+  var BASE64_MAP = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r';
+
+
+  function resolveYamlBinary(data) {
+    if (data === null) return false;
+
+    var code, idx, bitlen = 0, max = data.length, map = BASE64_MAP;
+
+    // Convert one by one.
+    for (idx = 0; idx < max; idx++) {
+      code = map.indexOf(data.charAt(idx));
+
+      // Skip CR/LF
+      if (code > 64) continue;
+
+      // Fail on illegal characters
+      if (code < 0) return false;
+
+      bitlen += 6;
+    }
+
+    // If there are any bits left, source was corrupted
+    return (bitlen % 8) === 0;
+  }
+
+  function constructYamlBinary(data) {
+    var idx, tailbits,
+        input = data.replace(/[\r\n=]/g, ''), // remove CR/LF & padding to simplify scan
+        max = input.length,
+        map = BASE64_MAP,
+        bits = 0,
+        result = [];
+
+    // Collect by 6*4 bits (3 bytes)
+
+    for (idx = 0; idx < max; idx++) {
+      if ((idx % 4 === 0) && idx) {
+        result.push((bits >> 16) & 0xFF);
+        result.push((bits >> 8) & 0xFF);
+        result.push(bits & 0xFF);
+      }
+
+      bits = (bits << 6) | map.indexOf(input.charAt(idx));
+    }
+
+    // Dump tail
+
+    tailbits = (max % 4) * 6;
+
+    if (tailbits === 0) {
+      result.push((bits >> 16) & 0xFF);
+      result.push((bits >> 8) & 0xFF);
+      result.push(bits & 0xFF);
+    } else if (tailbits === 18) {
+      result.push((bits >> 10) & 0xFF);
+      result.push((bits >> 2) & 0xFF);
+    } else if (tailbits === 12) {
+      result.push((bits >> 4) & 0xFF);
+    }
+
+    return new Uint8Array(result);
+  }
+
+  function representYamlBinary(object /*, style*/) {
+    var result = '', bits = 0, idx, tail,
+        max = object.length,
+        map = BASE64_MAP;
+
+    // Convert every three bytes to 4 ASCII characters.
+
+    for (idx = 0; idx < max; idx++) {
+      if ((idx % 3 === 0) && idx) {
+        result += map[(bits >> 18) & 0x3F];
+        result += map[(bits >> 12) & 0x3F];
+        result += map[(bits >> 6) & 0x3F];
+        result += map[bits & 0x3F];
+      }
+
+      bits = (bits << 8) + object[idx];
+    }
+
+    // Dump tail
+
+    tail = max % 3;
+
+    if (tail === 0) {
+      result += map[(bits >> 18) & 0x3F];
+      result += map[(bits >> 12) & 0x3F];
+      result += map[(bits >> 6) & 0x3F];
+      result += map[bits & 0x3F];
+    } else if (tail === 2) {
+      result += map[(bits >> 10) & 0x3F];
+      result += map[(bits >> 4) & 0x3F];
+      result += map[(bits << 2) & 0x3F];
+      result += map[64];
+    } else if (tail === 1) {
+      result += map[(bits >> 2) & 0x3F];
+      result += map[(bits << 4) & 0x3F];
+      result += map[64];
+      result += map[64];
+    }
+
+    return result;
+  }
+
+  function isBinary(obj) {
+    return Object.prototype.toString.call(obj) ===  '[object Uint8Array]';
+  }
+
+  var binary = new type('tag:yaml.org,2002:binary', {
+    kind: 'scalar',
+    resolve: resolveYamlBinary,
+    construct: constructYamlBinary,
+    predicate: isBinary,
+    represent: representYamlBinary
+  });
+
+  var _hasOwnProperty = Object.prototype.hasOwnProperty;
+  var _toString       = Object.prototype.toString;
+
+  function resolveYamlOmap(data) {
+    if (data === null) return true;
+
+    var objectKeys = [], index, length, pair, pairKey, pairHasKey,
+        object = data;
+
+    for (index = 0, length = object.length; index < length; index += 1) {
+      pair = object[index];
+      pairHasKey = false;
+
+      if (_toString.call(pair) !== '[object Object]') return false;
+
+      for (pairKey in pair) {
+        if (_hasOwnProperty.call(pair, pairKey)) {
+          if (!pairHasKey) pairHasKey = true;
+          else return false;
+        }
+      }
+
+      if (!pairHasKey) return false;
+
+      if (objectKeys.indexOf(pairKey) === -1) objectKeys.push(pairKey);
+      else return false;
+    }
+
+    return true;
+  }
+
+  function constructYamlOmap(data) {
+    return data !== null ? data : [];
+  }
+
+  var omap = new type('tag:yaml.org,2002:omap', {
+    kind: 'sequence',
+    resolve: resolveYamlOmap,
+    construct: constructYamlOmap
+  });
+
+  var _toString$1 = Object.prototype.toString;
+
+  function resolveYamlPairs(data) {
+    if (data === null) return true;
+
+    var index, length, pair, keys, result,
+        object = data;
+
+    result = new Array(object.length);
+
+    for (index = 0, length = object.length; index < length; index += 1) {
+      pair = object[index];
+
+      if (_toString$1.call(pair) !== '[object Object]') return false;
+
+      keys = Object.keys(pair);
+
+      if (keys.length !== 1) return false;
+
+      result[index] = [ keys[0], pair[keys[0]] ];
+    }
+
+    return true;
+  }
+
+  function constructYamlPairs(data) {
+    if (data === null) return [];
+
+    var index, length, pair, keys, result,
+        object = data;
+
+    result = new Array(object.length);
+
+    for (index = 0, length = object.length; index < length; index += 1) {
+      pair = object[index];
+
+      keys = Object.keys(pair);
+
+      result[index] = [ keys[0], pair[keys[0]] ];
+    }
+
+    return result;
+  }
+
+  var pairs = new type('tag:yaml.org,2002:pairs', {
+    kind: 'sequence',
+    resolve: resolveYamlPairs,
+    construct: constructYamlPairs
+  });
+
+  var _hasOwnProperty$1 = Object.prototype.hasOwnProperty;
+
+  function resolveYamlSet(data) {
+    if (data === null) return true;
+
+    var key, object = data;
+
+    for (key in object) {
+      if (_hasOwnProperty$1.call(object, key)) {
+        if (object[key] !== null) return false;
+      }
+    }
+
+    return true;
+  }
+
+  function constructYamlSet(data) {
+    return data !== null ? data : {};
+  }
+
+  var set = new type('tag:yaml.org,2002:set', {
+    kind: 'mapping',
+    resolve: resolveYamlSet,
+    construct: constructYamlSet
+  });
+
+  var _default = core.extend({
+    implicit: [
+      timestamp,
+      merge
+    ],
+    explicit: [
+      binary,
+      omap,
+      pairs,
+      set
+    ]
+  });
+
+  /*eslint-disable max-len,no-use-before-define*/
+
+
+
+
+
+
+
+  var _hasOwnProperty$2 = Object.prototype.hasOwnProperty;
+
+
+  var CONTEXT_FLOW_IN   = 1;
+  var CONTEXT_FLOW_OUT  = 2;
+  var CONTEXT_BLOCK_IN  = 3;
+  var CONTEXT_BLOCK_OUT = 4;
+
+
+  var CHOMPING_CLIP  = 1;
+  var CHOMPING_STRIP = 2;
+  var CHOMPING_KEEP  = 3;
+
+
+  var PATTERN_NON_PRINTABLE         = /[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/;
+  var PATTERN_NON_ASCII_LINE_BREAKS = /[\x85\u2028\u2029]/;
+  var PATTERN_FLOW_INDICATORS       = /[,\[\]\{\}]/;
+  var PATTERN_TAG_HANDLE            = /^(?:!|!!|![a-z\-]+!)$/i;
+  var PATTERN_TAG_URI               = /^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;
+
+
+  function _class(obj) { return Object.prototype.toString.call(obj); }
+
+  function is_EOL(c) {
+    return (c === 0x0A/* LF */) || (c === 0x0D/* CR */);
+  }
+
+  function is_WHITE_SPACE(c) {
+    return (c === 0x09/* Tab */) || (c === 0x20/* Space */);
+  }
+
+  function is_WS_OR_EOL(c) {
+    return (c === 0x09/* Tab */) ||
+        (c === 0x20/* Space */) ||
+        (c === 0x0A/* LF */) ||
+        (c === 0x0D/* CR */);
+  }
+
+  function is_FLOW_INDICATOR(c) {
+    return c === 0x2C/* , */ ||
+        c === 0x5B/* [ */ ||
+        c === 0x5D/* ] */ ||
+        c === 0x7B/* { */ ||
+        c === 0x7D/* } */;
+  }
+
+  function fromHexCode(c) {
+    var lc;
+
+    if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) {
+      return c - 0x30;
+    }
+
+    /*eslint-disable no-bitwise*/
+    lc = c | 0x20;
+
+    if ((0x61/* a */ <= lc) && (lc <= 0x66/* f */)) {
+      return lc - 0x61 + 10;
+    }
+
+    return -1;
+  }
+
+  function escapedHexLen(c) {
+    if (c === 0x78/* x */) { return 2; }
+    if (c === 0x75/* u */) { return 4; }
+    if (c === 0x55/* U */) { return 8; }
+    return 0;
+  }
+
+  function fromDecimalCode(c) {
+    if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) {
+      return c - 0x30;
+    }
+
+    return -1;
+  }
+
+  function simpleEscapeSequence(c) {
+    /* eslint-disable indent */
+    return (c === 0x30/* 0 */) ? '\x00' :
+        (c === 0x61/* a */) ? '\x07' :
+            (c === 0x62/* b */) ? '\x08' :
+                (c === 0x74/* t */) ? '\x09' :
+                    (c === 0x09/* Tab */) ? '\x09' :
+                        (c === 0x6E/* n */) ? '\x0A' :
+                            (c === 0x76/* v */) ? '\x0B' :
+                                (c === 0x66/* f */) ? '\x0C' :
+                                    (c === 0x72/* r */) ? '\x0D' :
+                                        (c === 0x65/* e */) ? '\x1B' :
+                                            (c === 0x20/* Space */) ? ' ' :
+                                                (c === 0x22/* " */) ? '\x22' :
+                                                    (c === 0x2F/* / */) ? '/' :
+                                                        (c === 0x5C/* \ */) ? '\x5C' :
+                                                            (c === 0x4E/* N */) ? '\x85' :
+                                                                (c === 0x5F/* _ */) ? '\xA0' :
+                                                                    (c === 0x4C/* L */) ? '\u2028' :
+                                                                        (c === 0x50/* P */) ? '\u2029' : '';
+  }
+
+  function charFromCodepoint(c) {
+    if (c <= 0xFFFF) {
+      return String.fromCharCode(c);
+    }
+    // Encode UTF-16 surrogate pair
+    // https://en.wikipedia.org/wiki/UTF-16#Code_points_U.2B010000_to_U.2B10FFFF
+    return String.fromCharCode(
+        ((c - 0x010000) >> 10) + 0xD800,
+        ((c - 0x010000) & 0x03FF) + 0xDC00
+    );
+  }
+
+  var simpleEscapeCheck = new Array(256); // integer, for fast access
+  var simpleEscapeMap = new Array(256);
+  for (var i = 0; i < 256; i++) {
+    simpleEscapeCheck[i] = simpleEscapeSequence(i) ? 1 : 0;
+    simpleEscapeMap[i] = simpleEscapeSequence(i);
+  }
+
+
+  function State(input, options) {
+    this.input = input;
+
+    this.filename  = options['filename']  || null;
+    this.schema    = options['schema']    || _default;
+    this.onWarning = options['onWarning'] || null;
+    // (Hidden) Remove? makes the loader to expect YAML 1.1 documents
+    // if such documents have no explicit %YAML directive
+    this.legacy    = options['legacy']    || false;
+
+    this.json      = options['json']      || false;
+    this.listener  = options['listener']  || null;
+
+    this.implicitTypes = this.schema.compiledImplicit;
+    this.typeMap       = this.schema.compiledTypeMap;
+
+    this.length     = input.length;
+    this.position   = 0;
+    this.line       = 0;
+    this.lineStart  = 0;
+    this.lineIndent = 0;
+
+    // position of first leading tab in the current line,
+    // used to make sure there are no tabs in the indentation
+    this.firstTabInLine = -1;
+
+    this.documents = [];
+
+    /*
+    this.version;
+    this.checkLineBreaks;
+    this.tagMap;
+    this.anchorMap;
+    this.tag;
+    this.anchor;
+    this.kind;
+    this.result;*/
+
+  }
+
+
+  function generateError(state, message) {
+    var mark = {
+      name:     state.filename,
+      buffer:   state.input.slice(0, -1), // omit trailing \0
+      position: state.position,
+      line:     state.line,
+      column:   state.position - state.lineStart
+    };
+
+    mark.snippet = snippet(mark);
+
+    return new exception(message, mark);
+  }
+
+  function throwError(state, message) {
+    throw generateError(state, message);
+  }
+
+  function throwWarning(state, message) {
+    if (state.onWarning) {
+      state.onWarning.call(null, generateError(state, message));
+    }
+  }
+
+
+  var directiveHandlers = {
+
+    YAML: function handleYamlDirective(state, name, args) {
+
+      var match, major, minor;
+
+      if (state.version !== null) {
+        throwError(state, 'duplication of %YAML directive');
+      }
+
+      if (args.length !== 1) {
+        throwError(state, 'YAML directive accepts exactly one argument');
+      }
+
+      match = /^([0-9]+)\.([0-9]+)$/.exec(args[0]);
+
+      if (match === null) {
+        throwError(state, 'ill-formed argument of the YAML directive');
+      }
+
+      major = parseInt(match[1], 10);
+      minor = parseInt(match[2], 10);
+
+      if (major !== 1) {
+        throwError(state, 'unacceptable YAML version of the document');
+      }
+
+      state.version = args[0];
+      state.checkLineBreaks = (minor < 2);
+
+      if (minor !== 1 && minor !== 2) {
+        throwWarning(state, 'unsupported YAML version of the document');
+      }
+    },
+
+    TAG: function handleTagDirective(state, name, args) {
+
+      var handle, prefix;
+
+      if (args.length !== 2) {
+        throwError(state, 'TAG directive accepts exactly two arguments');
+      }
+
+      handle = args[0];
+      prefix = args[1];
+
+      if (!PATTERN_TAG_HANDLE.test(handle)) {
+        throwError(state, 'ill-formed tag handle (first argument) of the TAG directive');
+      }
+
+      if (_hasOwnProperty$2.call(state.tagMap, handle)) {
+        throwError(state, 'there is a previously declared suffix for "' + handle + '" tag handle');
+      }
+
+      if (!PATTERN_TAG_URI.test(prefix)) {
+        throwError(state, 'ill-formed tag prefix (second argument) of the TAG directive');
+      }
+
+      try {
+        prefix = decodeURIComponent(prefix);
+      } catch (err) {
+        throwError(state, 'tag prefix is malformed: ' + prefix);
+      }
+
+      state.tagMap[handle] = prefix;
+    }
+  };
+
+
+  function captureSegment(state, start, end, checkJson) {
+    var _position, _length, _character, _result;
+
+    if (start < end) {
+      _result = state.input.slice(start, end);
+
+      if (checkJson) {
+        for (_position = 0, _length = _result.length; _position < _length; _position += 1) {
+          _character = _result.charCodeAt(_position);
+          if (!(_character === 0x09 ||
+              (0x20 <= _character && _character <= 0x10FFFF))) {
+            throwError(state, 'expected valid JSON character');
+          }
+        }
+      } else if (PATTERN_NON_PRINTABLE.test(_result)) {
+        throwError(state, 'the stream contains non-printable characters');
+      }
+
+      state.result += _result;
+    }
+  }
+
+  function mergeMappings(state, destination, source, overridableKeys) {
+    var sourceKeys, key, index, quantity;
+
+    if (!common.isObject(source)) {
+      throwError(state, 'cannot merge mappings; the provided source object is unacceptable');
+    }
+
+    sourceKeys = Object.keys(source);
+
+    for (index = 0, quantity = sourceKeys.length; index < quantity; index += 1) {
+      key = sourceKeys[index];
+
+      if (!_hasOwnProperty$2.call(destination, key)) {
+        destination[key] = source[key];
+        overridableKeys[key] = true;
+      }
+    }
+  }
+
+  function storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode,
+                            startLine, startLineStart, startPos) {
+
+    var index, quantity;
+
+    // The output is a plain object here, so keys can only be strings.
+    // We need to convert keyNode to a string, but doing so can hang the process
+    // (deeply nested arrays that explode exponentially using aliases).
+    if (Array.isArray(keyNode)) {
+      keyNode = Array.prototype.slice.call(keyNode);
+
+      for (index = 0, quantity = keyNode.length; index < quantity; index += 1) {
+        if (Array.isArray(keyNode[index])) {
+          throwError(state, 'nested arrays are not supported inside keys');
+        }
+
+        if (typeof keyNode === 'object' && _class(keyNode[index]) === '[object Object]') {
+          keyNode[index] = '[object Object]';
+        }
+      }
+    }
+
+    // Avoid code execution in load() via toString property
+    // (still use its own toString for arrays, timestamps,
+    // and whatever user schema extensions happen to have @@toStringTag)
+    if (typeof keyNode === 'object' && _class(keyNode) === '[object Object]') {
+      keyNode = '[object Object]';
+    }
+
+
+    keyNode = String(keyNode);
+
+    if (_result === null) {
+      _result = {};
+    }
+
+    if (keyTag === 'tag:yaml.org,2002:merge') {
+      if (Array.isArray(valueNode)) {
+        for (index = 0, quantity = valueNode.length; index < quantity; index += 1) {
+          mergeMappings(state, _result, valueNode[index], overridableKeys);
+        }
+      } else {
+        mergeMappings(state, _result, valueNode, overridableKeys);
+      }
+    } else {
+      if (!state.json &&
+          !_hasOwnProperty$2.call(overridableKeys, keyNode) &&
+          _hasOwnProperty$2.call(_result, keyNode)) {
+        state.line = startLine || state.line;
+        state.lineStart = startLineStart || state.lineStart;
+        state.position = startPos || state.position;
+        throwError(state, 'duplicated mapping key');
+      }
+
+      // used for this specific key only because Object.defineProperty is slow
+      if (keyNode === '__proto__') {
+        Object.defineProperty(_result, keyNode, {
+          configurable: true,
+          enumerable: true,
+          writable: true,
+          value: valueNode
+        });
+      } else {
+        _result[keyNode] = valueNode;
+      }
+      delete overridableKeys[keyNode];
+    }
+
+    return _result;
+  }
+
+  function readLineBreak(state) {
+    var ch;
+
+    ch = state.input.charCodeAt(state.position);
+
+    if (ch === 0x0A/* LF */) {
+      state.position++;
+    } else if (ch === 0x0D/* CR */) {
+      state.position++;
+      if (state.input.charCodeAt(state.position) === 0x0A/* LF */) {
+        state.position++;
+      }
+    } else {
+      throwError(state, 'a line break is expected');
+    }
+
+    state.line += 1;
+    state.lineStart = state.position;
+    state.firstTabInLine = -1;
+  }
+
+  function skipSeparationSpace(state, allowComments, checkIndent) {
+    var lineBreaks = 0,
+        ch = state.input.charCodeAt(state.position);
+
+    while (ch !== 0) {
+      while (is_WHITE_SPACE(ch)) {
+        if (ch === 0x09/* Tab */ && state.firstTabInLine === -1) {
+          state.firstTabInLine = state.position;
+        }
+        ch = state.input.charCodeAt(++state.position);
+      }
+
+      if (allowComments && ch === 0x23/* # */) {
+        do {
+          ch = state.input.charCodeAt(++state.position);
+        } while (ch !== 0x0A/* LF */ && ch !== 0x0D/* CR */ && ch !== 0);
+      }
+
+      if (is_EOL(ch)) {
+        readLineBreak(state);
+
+        ch = state.input.charCodeAt(state.position);
+        lineBreaks++;
+        state.lineIndent = 0;
+
+        while (ch === 0x20/* Space */) {
+          state.lineIndent++;
+          ch = state.input.charCodeAt(++state.position);
+        }
+      } else {
+        break;
+      }
+    }
+
+    if (checkIndent !== -1 && lineBreaks !== 0 && state.lineIndent < checkIndent) {
+      throwWarning(state, 'deficient indentation');
+    }
+
+    return lineBreaks;
+  }
+
+  function testDocumentSeparator(state) {
+    var _position = state.position,
+        ch;
+
+    ch = state.input.charCodeAt(_position);
+
+    // Condition state.position === state.lineStart is tested
+    // in parent on each call, for efficiency. No needs to test here again.
+    if ((ch === 0x2D/* - */ || ch === 0x2E/* . */) &&
+        ch === state.input.charCodeAt(_position + 1) &&
+        ch === state.input.charCodeAt(_position + 2)) {
+
+      _position += 3;
+
+      ch = state.input.charCodeAt(_position);
+
+      if (ch === 0 || is_WS_OR_EOL(ch)) {
+        return true;
+      }
+    }
+
+    return false;
+  }
+
+  function writeFoldedLines(state, count) {
+    if (count === 1) {
+      state.result += ' ';
+    } else if (count > 1) {
+      state.result += common.repeat('\n', count - 1);
+    }
+  }
+
+
+  function readPlainScalar(state, nodeIndent, withinFlowCollection) {
+    var preceding,
+        following,
+        captureStart,
+        captureEnd,
+        hasPendingContent,
+        _line,
+        _lineStart,
+        _lineIndent,
+        _kind = state.kind,
+        _result = state.result,
+        ch;
+
+    ch = state.input.charCodeAt(state.position);
+
+    if (is_WS_OR_EOL(ch)      ||
+        is_FLOW_INDICATOR(ch) ||
+        ch === 0x23/* # */    ||
+        ch === 0x26/* & */    ||
+        ch === 0x2A/* * */    ||
+        ch === 0x21/* ! */    ||
+        ch === 0x7C/* | */    ||
+        ch === 0x3E/* > */    ||
+        ch === 0x27/* ' */    ||
+        ch === 0x22/* " */    ||
+        ch === 0x25/* % */    ||
+        ch === 0x40/* @ */    ||
+        ch === 0x60/* ` */) {
+      return false;
+    }
+
+    if (ch === 0x3F/* ? */ || ch === 0x2D/* - */) {
+      following = state.input.charCodeAt(state.position + 1);
+
+      if (is_WS_OR_EOL(following) ||
+          withinFlowCollection && is_FLOW_INDICATOR(following)) {
+        return false;
+      }
+    }
+
+    state.kind = 'scalar';
+    state.result = '';
+    captureStart = captureEnd = state.position;
+    hasPendingContent = false;
+
+    while (ch !== 0) {
+      if (ch === 0x3A/* : */) {
+        following = state.input.charCodeAt(state.position + 1);
+
+        if (is_WS_OR_EOL(following) ||
+            withinFlowCollection && is_FLOW_INDICATOR(following)) {
+          break;
+        }
+
+      } else if (ch === 0x23/* # */) {
+        preceding = state.input.charCodeAt(state.position - 1);
+
+        if (is_WS_OR_EOL(preceding)) {
+          break;
+        }
+
+      } else if ((state.position === state.lineStart && testDocumentSeparator(state)) ||
+          withinFlowCollection && is_FLOW_INDICATOR(ch)) {
+        break;
+
+      } else if (is_EOL(ch)) {
+        _line = state.line;
+        _lineStart = state.lineStart;
+        _lineIndent = state.lineIndent;
+        skipSeparationSpace(state, false, -1);
+
+        if (state.lineIndent >= nodeIndent) {
+          hasPendingContent = true;
+          ch = state.input.charCodeAt(state.position);
+          continue;
+        } else {
+          state.position = captureEnd;
+          state.line = _line;
+          state.lineStart = _lineStart;
+          state.lineIndent = _lineIndent;
+          break;
+        }
+      }
+
+      if (hasPendingContent) {
+        captureSegment(state, captureStart, captureEnd, false);
+        writeFoldedLines(state, state.line - _line);
+        captureStart = captureEnd = state.position;
+        hasPendingContent = false;
+      }
+
+      if (!is_WHITE_SPACE(ch)) {
+        captureEnd = state.position + 1;
+      }
+
+      ch = state.input.charCodeAt(++state.position);
+    }
+
+    captureSegment(state, captureStart, captureEnd, false);
+
+    if (state.result) {
+      return true;
+    }
+
+    state.kind = _kind;
+    state.result = _result;
+    return false;
+  }
+
+  function readSingleQuotedScalar(state, nodeIndent) {
+    var ch,
+        captureStart, captureEnd;
+
+    ch = state.input.charCodeAt(state.position);
+
+    if (ch !== 0x27/* ' */) {
+      return false;
+    }
+
+    state.kind = 'scalar';
+    state.result = '';
+    state.position++;
+    captureStart = captureEnd = state.position;
+
+    while ((ch = state.input.charCodeAt(state.position)) !== 0) {
+      if (ch === 0x27/* ' */) {
+        captureSegment(state, captureStart, state.position, true);
+        ch = state.input.charCodeAt(++state.position);
+
+        if (ch === 0x27/* ' */) {
+          captureStart = state.position;
+          state.position++;
+          captureEnd = state.position;
+        } else {
+          return true;
+        }
+
+      } else if (is_EOL(ch)) {
+        captureSegment(state, captureStart, captureEnd, true);
+        writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));
+        captureStart = captureEnd = state.position;
+
+      } else if (state.position === state.lineStart && testDocumentSeparator(state)) {
+        throwError(state, 'unexpected end of the document within a single quoted scalar');
+
+      } else {
+        state.position++;
+        captureEnd = state.position;
+      }
+    }
+
+    throwError(state, 'unexpected end of the stream within a single quoted scalar');
+  }
+
+  function readDoubleQuotedScalar(state, nodeIndent) {
+    var captureStart,
+        captureEnd,
+        hexLength,
+        hexResult,
+        tmp,
+        ch;
+
+    ch = state.input.charCodeAt(state.position);
+
+    if (ch !== 0x22/* " */) {
+      return false;
+    }
+
+    state.kind = 'scalar';
+    state.result = '';
+    state.position++;
+    captureStart = captureEnd = state.position;
+
+    while ((ch = state.input.charCodeAt(state.position)) !== 0) {
+      if (ch === 0x22/* " */) {
+        captureSegment(state, captureStart, state.position, true);
+        state.position++;
+        return true;
+
+      } else if (ch === 0x5C/* \ */) {
+        captureSegment(state, captureStart, state.position, true);
+        ch = state.input.charCodeAt(++state.position);
+
+        if (is_EOL(ch)) {
+          skipSeparationSpace(state, false, nodeIndent);
+
+          // TODO: rework to inline fn with no type cast?
+        } else if (ch < 256 && simpleEscapeCheck[ch]) {
+          state.result += simpleEscapeMap[ch];
+          state.position++;
+
+        } else if ((tmp = escapedHexLen(ch)) > 0) {
+          hexLength = tmp;
+          hexResult = 0;
+
+          for (; hexLength > 0; hexLength--) {
+            ch = state.input.charCodeAt(++state.position);
+
+            if ((tmp = fromHexCode(ch)) >= 0) {
+              hexResult = (hexResult << 4) + tmp;
+
+            } else {
+              throwError(state, 'expected hexadecimal character');
+            }
+          }
+
+          state.result += charFromCodepoint(hexResult);
+
+          state.position++;
+
+        } else {
+          throwError(state, 'unknown escape sequence');
+        }
+
+        captureStart = captureEnd = state.position;
+
+      } else if (is_EOL(ch)) {
+        captureSegment(state, captureStart, captureEnd, true);
+        writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));
+        captureStart = captureEnd = state.position;
+
+      } else if (state.position === state.lineStart && testDocumentSeparator(state)) {
+        throwError(state, 'unexpected end of the document within a double quoted scalar');
+
+      } else {
+        state.position++;
+        captureEnd = state.position;
+      }
+    }
+
+    throwError(state, 'unexpected end of the stream within a double quoted scalar');
+  }
+
+  function readFlowCollection(state, nodeIndent) {
+    var readNext = true,
+        _line,
+        _lineStart,
+        _pos,
+        _tag     = state.tag,
+        _result,
+        _anchor  = state.anchor,
+        following,
+        terminator,
+        isPair,
+        isExplicitPair,
+        isMapping,
+        overridableKeys = Object.create(null),
+        keyNode,
+        keyTag,
+        valueNode,
+        ch;
+
+    ch = state.input.charCodeAt(state.position);
+
+    if (ch === 0x5B/* [ */) {
+      terminator = 0x5D;/* ] */
+      isMapping = false;
+      _result = [];
+    } else if (ch === 0x7B/* { */) {
+      terminator = 0x7D;/* } */
+      isMapping = true;
+      _result = {};
+    } else {
+      return false;
+    }
+
+    if (state.anchor !== null) {
+      state.anchorMap[state.anchor] = _result;
+    }
+
+    ch = state.input.charCodeAt(++state.position);
+
+    while (ch !== 0) {
+      skipSeparationSpace(state, true, nodeIndent);
+
+      ch = state.input.charCodeAt(state.position);
+
+      if (ch === terminator) {
+        state.position++;
+        state.tag = _tag;
+        state.anchor = _anchor;
+        state.kind = isMapping ? 'mapping' : 'sequence';
+        state.result = _result;
+        return true;
+      } else if (!readNext) {
+        throwError(state, 'missed comma between flow collection entries');
+      } else if (ch === 0x2C/* , */) {
+        // "flow collection entries can never be completely empty", as per YAML 1.2, section 7.4
+        throwError(state, "expected the node content, but found ','");
+      }
+
+      keyTag = keyNode = valueNode = null;
+      isPair = isExplicitPair = false;
+
+      if (ch === 0x3F/* ? */) {
+        following = state.input.charCodeAt(state.position + 1);
+
+        if (is_WS_OR_EOL(following)) {
+          isPair = isExplicitPair = true;
+          state.position++;
+          skipSeparationSpace(state, true, nodeIndent);
+        }
+      }
+
+      _line = state.line; // Save the current line.
+      _lineStart = state.lineStart;
+      _pos = state.position;
+      composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);
+      keyTag = state.tag;
+      keyNode = state.result;
+      skipSeparationSpace(state, true, nodeIndent);
+
+      ch = state.input.charCodeAt(state.position);
+
+      if ((isExplicitPair || state.line === _line) && ch === 0x3A/* : */) {
+        isPair = true;
+        ch = state.input.charCodeAt(++state.position);
+        skipSeparationSpace(state, true, nodeIndent);
+        composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);
+        valueNode = state.result;
+      }
+
+      if (isMapping) {
+        storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _line, _lineStart, _pos);
+      } else if (isPair) {
+        _result.push(storeMappingPair(state, null, overridableKeys, keyTag, keyNode, valueNode, _line, _lineStart, _pos));
+      } else {
+        _result.push(keyNode);
+      }
+
+      skipSeparationSpace(state, true, nodeIndent);
+
+      ch = state.input.charCodeAt(state.position);
+
+      if (ch === 0x2C/* , */) {
+        readNext = true;
+        ch = state.input.charCodeAt(++state.position);
+      } else {
+        readNext = false;
+      }
+    }
+
+    throwError(state, 'unexpected end of the stream within a flow collection');
+  }
+
+  function readBlockScalar(state, nodeIndent) {
+    var captureStart,
+        folding,
+        chomping       = CHOMPING_CLIP,
+        didReadContent = false,
+        detectedIndent = false,
+        textIndent     = nodeIndent,
+        emptyLines     = 0,
+        atMoreIndented = false,
+        tmp,
+        ch;
+
+    ch = state.input.charCodeAt(state.position);
+
+    if (ch === 0x7C/* | */) {
+      folding = false;
+    } else if (ch === 0x3E/* > */) {
+      folding = true;
+    } else {
+      return false;
+    }
+
+    state.kind = 'scalar';
+    state.result = '';
+
+    while (ch !== 0) {
+      ch = state.input.charCodeAt(++state.position);
+
+      if (ch === 0x2B/* + */ || ch === 0x2D/* - */) {
+        if (CHOMPING_CLIP === chomping) {
+          chomping = (ch === 0x2B/* + */) ? CHOMPING_KEEP : CHOMPING_STRIP;
+        } else {
+          throwError(state, 'repeat of a chomping mode identifier');
+        }
+
+      } else if ((tmp = fromDecimalCode(ch)) >= 0) {
+        if (tmp === 0) {
+          throwError(state, 'bad explicit indentation width of a block scalar; it cannot be less than one');
+        } else if (!detectedIndent) {
+          textIndent = nodeIndent + tmp - 1;
+          detectedIndent = true;
+        } else {
+          throwError(state, 'repeat of an indentation width identifier');
+        }
+
+      } else {
+        break;
+      }
+    }
+
+    if (is_WHITE_SPACE(ch)) {
+      do { ch = state.input.charCodeAt(++state.position); }
+      while (is_WHITE_SPACE(ch));
+
+      if (ch === 0x23/* # */) {
+        do { ch = state.input.charCodeAt(++state.position); }
+        while (!is_EOL(ch) && (ch !== 0));
+      }
+    }
+
+    while (ch !== 0) {
+      readLineBreak(state);
+      state.lineIndent = 0;
+
+      ch = state.input.charCodeAt(state.position);
+
+      while ((!detectedIndent || state.lineIndent < textIndent) &&
+      (ch === 0x20/* Space */)) {
+        state.lineIndent++;
+        ch = state.input.charCodeAt(++state.position);
+      }
+
+      if (!detectedIndent && state.lineIndent > textIndent) {
+        textIndent = state.lineIndent;
+      }
+
+      if (is_EOL(ch)) {
+        emptyLines++;
+        continue;
+      }
+
+      // End of the scalar.
+      if (state.lineIndent < textIndent) {
+
+        // Perform the chomping.
+        if (chomping === CHOMPING_KEEP) {
+          state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines);
+        } else if (chomping === CHOMPING_CLIP) {
+          if (didReadContent) { // i.e. only if the scalar is not empty.
+            state.result += '\n';
+          }
+        }
+
+        // Break this `while` cycle and go to the funciton's epilogue.
+        break;
+      }
+
+      // Folded style: use fancy rules to handle line breaks.
+      if (folding) {
+
+        // Lines starting with white space characters (more-indented lines) are not folded.
+        if (is_WHITE_SPACE(ch)) {
+          atMoreIndented = true;
+          // except for the first content line (cf. Example 8.1)
+          state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines);
+
+          // End of more-indented block.
+        } else if (atMoreIndented) {
+          atMoreIndented = false;
+          state.result += common.repeat('\n', emptyLines + 1);
+
+          // Just one line break - perceive as the same line.
+        } else if (emptyLines === 0) {
+          if (didReadContent) { // i.e. only if we have already read some scalar content.
+            state.result += ' ';
+          }
+
+          // Several line breaks - perceive as different lines.
+        } else {
+          state.result += common.repeat('\n', emptyLines);
+        }
+
+        // Literal style: just add exact number of line breaks between content lines.
+      } else {
+        // Keep all line breaks except the header line break.
+        state.result += common.repeat('\n', didReadContent ? 1 + emptyLines : emptyLines);
+      }
+
+      didReadContent = true;
+      detectedIndent = true;
+      emptyLines = 0;
+      captureStart = state.position;
+
+      while (!is_EOL(ch) && (ch !== 0)) {
+        ch = state.input.charCodeAt(++state.position);
+      }
+
+      captureSegment(state, captureStart, state.position, false);
+    }
+
+    return true;
+  }
+
+  function readBlockSequence(state, nodeIndent) {
+    var _line,
+        _tag      = state.tag,
+        _anchor   = state.anchor,
+        _result   = [],
+        following,
+        detected  = false,
+        ch;
+
+    // there is a leading tab before this token, so it can't be a block sequence/mapping;
+    // it can still be flow sequence/mapping or a scalar
+    if (state.firstTabInLine !== -1) return false;
+
+    if (state.anchor !== null) {
+      state.anchorMap[state.anchor] = _result;
+    }
+
+    ch = state.input.charCodeAt(state.position);
+
+    while (ch !== 0) {
+      if (state.firstTabInLine !== -1) {
+        state.position = state.firstTabInLine;
+        throwError(state, 'tab characters must not be used in indentation');
+      }
+
+      if (ch !== 0x2D/* - */) {
+        break;
+      }
+
+      following = state.input.charCodeAt(state.position + 1);
+
+      if (!is_WS_OR_EOL(following)) {
+        break;
+      }
+
+      detected = true;
+      state.position++;
+
+      if (skipSeparationSpace(state, true, -1)) {
+        if (state.lineIndent <= nodeIndent) {
+          _result.push(null);
+          ch = state.input.charCodeAt(state.position);
+          continue;
+        }
+      }
+
+      _line = state.line;
+      composeNode(state, nodeIndent, CONTEXT_BLOCK_IN, false, true);
+      _result.push(state.result);
+      skipSeparationSpace(state, true, -1);
+
+      ch = state.input.charCodeAt(state.position);
+
+      if ((state.line === _line || state.lineIndent > nodeIndent) && (ch !== 0)) {
+        throwError(state, 'bad indentation of a sequence entry');
+      } else if (state.lineIndent < nodeIndent) {
+        break;
+      }
+    }
+
+    if (detected) {
+      state.tag = _tag;
+      state.anchor = _anchor;
+      state.kind = 'sequence';
+      state.result = _result;
+      return true;
+    }
+    return false;
+  }
+
+  function readBlockMapping(state, nodeIndent, flowIndent) {
+    var following,
+        allowCompact,
+        _line,
+        _keyLine,
+        _keyLineStart,
+        _keyPos,
+        _tag          = state.tag,
+        _anchor       = state.anchor,
+        _result       = {},
+        overridableKeys = Object.create(null),
+        keyTag        = null,
+        keyNode       = null,
+        valueNode     = null,
+        atExplicitKey = false,
+        detected      = false,
+        ch;
+
+    // there is a leading tab before this token, so it can't be a block sequence/mapping;
+    // it can still be flow sequence/mapping or a scalar
+    if (state.firstTabInLine !== -1) return false;
+
+    if (state.anchor !== null) {
+      state.anchorMap[state.anchor] = _result;
+    }
+
+    ch = state.input.charCodeAt(state.position);
+
+    while (ch !== 0) {
+      if (!atExplicitKey && state.firstTabInLine !== -1) {
+        state.position = state.firstTabInLine;
+        throwError(state, 'tab characters must not be used in indentation');
+      }
+
+      following = state.input.charCodeAt(state.position + 1);
+      _line = state.line; // Save the current line.
+
+      //
+      // Explicit notation case. There are two separate blocks:
+      // first for the key (denoted by "?") and second for the value (denoted by ":")
+      //
+      if ((ch === 0x3F/* ? */ || ch === 0x3A/* : */) && is_WS_OR_EOL(following)) {
+
+        if (ch === 0x3F/* ? */) {
+          if (atExplicitKey) {
+            storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos);
+            keyTag = keyNode = valueNode = null;
+          }
+
+          detected = true;
+          atExplicitKey = true;
+          allowCompact = true;
+
+        } else if (atExplicitKey) {
+          // i.e. 0x3A/* : */ === character after the explicit key.
+          atExplicitKey = false;
+          allowCompact = true;
+
+        } else {
+          throwError(state, 'incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line');
+        }
+
+        state.position += 1;
+        ch = following;
+
+        //
+        // Implicit notation case. Flow-style node as the key first, then ":", and the value.
+        //
+      } else {
+        _keyLine = state.line;
+        _keyLineStart = state.lineStart;
+        _keyPos = state.position;
+
+        if (!composeNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) {
+          // Neither implicit nor explicit notation.
+          // Reading is done. Go to the epilogue.
+          break;
+        }
+
+        if (state.line === _line) {
+          ch = state.input.charCodeAt(state.position);
+
+          while (is_WHITE_SPACE(ch)) {
+            ch = state.input.charCodeAt(++state.position);
+          }
+
+          if (ch === 0x3A/* : */) {
+            ch = state.input.charCodeAt(++state.position);
+
+            if (!is_WS_OR_EOL(ch)) {
+              throwError(state, 'a whitespace character is expected after the key-value separator within a block mapping');
+            }
+
+            if (atExplicitKey) {
+              storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos);
+              keyTag = keyNode = valueNode = null;
+            }
+
+            detected = true;
+            atExplicitKey = false;
+            allowCompact = false;
+            keyTag = state.tag;
+            keyNode = state.result;
+
+          } else if (detected) {
+            throwError(state, 'can not read an implicit mapping pair; a colon is missed');
+
+          } else {
+            state.tag = _tag;
+            state.anchor = _anchor;
+            return true; // Keep the result of `composeNode`.
+          }
+
+        } else if (detected) {
+          throwError(state, 'can not read a block mapping entry; a multiline key may not be an implicit key');
+
+        } else {
+          state.tag = _tag;
+          state.anchor = _anchor;
+          return true; // Keep the result of `composeNode`.
+        }
+      }
+
+      //
+      // Common reading code for both explicit and implicit notations.
+      //
+      if (state.line === _line || state.lineIndent > nodeIndent) {
+        if (atExplicitKey) {
+          _keyLine = state.line;
+          _keyLineStart = state.lineStart;
+          _keyPos = state.position;
+        }
+
+        if (composeNode(state, nodeIndent, CONTEXT_BLOCK_OUT, true, allowCompact)) {
+          if (atExplicitKey) {
+            keyNode = state.result;
+          } else {
+            valueNode = state.result;
+          }
+        }
+
+        if (!atExplicitKey) {
+          storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _keyLine, _keyLineStart, _keyPos);
+          keyTag = keyNode = valueNode = null;
+        }
+
+        skipSeparationSpace(state, true, -1);
+        ch = state.input.charCodeAt(state.position);
+      }
+
+      if ((state.line === _line || state.lineIndent > nodeIndent) && (ch !== 0)) {
+        throwError(state, 'bad indentation of a mapping entry');
+      } else if (state.lineIndent < nodeIndent) {
+        break;
+      }
+    }
+
+    //
+    // Epilogue.
+    //
+
+    // Special case: last mapping's node contains only the key in explicit notation.
+    if (atExplicitKey) {
+      storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null, _keyLine, _keyLineStart, _keyPos);
+    }
+
+    // Expose the resulting mapping.
+    if (detected) {
+      state.tag = _tag;
+      state.anchor = _anchor;
+      state.kind = 'mapping';
+      state.result = _result;
+    }
+
+    return detected;
+  }
+
+  function readTagProperty(state) {
+    var _position,
+        isVerbatim = false,
+        isNamed    = false,
+        tagHandle,
+        tagName,
+        ch;
+
+    ch = state.input.charCodeAt(state.position);
+
+    if (ch !== 0x21/* ! */) return false;
+
+    if (state.tag !== null) {
+      throwError(state, 'duplication of a tag property');
+    }
+
+    ch = state.input.charCodeAt(++state.position);
+
+    if (ch === 0x3C/* < */) {
+      isVerbatim = true;
+      ch = state.input.charCodeAt(++state.position);
+
+    } else if (ch === 0x21/* ! */) {
+      isNamed = true;
+      tagHandle = '!!';
+      ch = state.input.charCodeAt(++state.position);
+
+    } else {
+      tagHandle = '!';
+    }
+
+    _position = state.position;
+
+    if (isVerbatim) {
+      do { ch = state.input.charCodeAt(++state.position); }
+      while (ch !== 0 && ch !== 0x3E/* > */);
+
+      if (state.position < state.length) {
+        tagName = state.input.slice(_position, state.position);
+        ch = state.input.charCodeAt(++state.position);
+      } else {
+        throwError(state, 'unexpected end of the stream within a verbatim tag');
+      }
+    } else {
+      while (ch !== 0 && !is_WS_OR_EOL(ch)) {
+
+        if (ch === 0x21/* ! */) {
+          if (!isNamed) {
+            tagHandle = state.input.slice(_position - 1, state.position + 1);
+
+            if (!PATTERN_TAG_HANDLE.test(tagHandle)) {
+              throwError(state, 'named tag handle cannot contain such characters');
+            }
+
+            isNamed = true;
+            _position = state.position + 1;
+          } else {
+            throwError(state, 'tag suffix cannot contain exclamation marks');
+          }
+        }
+
+        ch = state.input.charCodeAt(++state.position);
+      }
+
+      tagName = state.input.slice(_position, state.position);
+
+      if (PATTERN_FLOW_INDICATORS.test(tagName)) {
+        throwError(state, 'tag suffix cannot contain flow indicator characters');
+      }
+    }
+
+    if (tagName && !PATTERN_TAG_URI.test(tagName)) {
+      throwError(state, 'tag name cannot contain such characters: ' + tagName);
+    }
+
+    try {
+      tagName = decodeURIComponent(tagName);
+    } catch (err) {
+      throwError(state, 'tag name is malformed: ' + tagName);
+    }
+
+    if (isVerbatim) {
+      state.tag = tagName;
+
+    } else if (_hasOwnProperty$2.call(state.tagMap, tagHandle)) {
+      state.tag = state.tagMap[tagHandle] + tagName;
+
+    } else if (tagHandle === '!') {
+      state.tag = '!' + tagName;
+
+    } else if (tagHandle === '!!') {
+      state.tag = 'tag:yaml.org,2002:' + tagName;
+
+    } else {
+      throwError(state, 'undeclared tag handle "' + tagHandle + '"');
+    }
+
+    return true;
+  }
+
+  function readAnchorProperty(state) {
+    var _position,
+        ch;
+
+    ch = state.input.charCodeAt(state.position);
+
+    if (ch !== 0x26/* & */) return false;
+
+    if (state.anchor !== null) {
+      throwError(state, 'duplication of an anchor property');
+    }
+
+    ch = state.input.charCodeAt(++state.position);
+    _position = state.position;
+
+    while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {
+      ch = state.input.charCodeAt(++state.position);
+    }
+
+    if (state.position === _position) {
+      throwError(state, 'name of an anchor node must contain at least one character');
+    }
+
+    state.anchor = state.input.slice(_position, state.position);
+    return true;
+  }
+
+  function readAlias(state) {
+    var _position, alias,
+        ch;
+
+    ch = state.input.charCodeAt(state.position);
+
+    if (ch !== 0x2A/* * */) return false;
+
+    ch = state.input.charCodeAt(++state.position);
+    _position = state.position;
+
+    while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {
+      ch = state.input.charCodeAt(++state.position);
+    }
+
+    if (state.position === _position) {
+      throwError(state, 'name of an alias node must contain at least one character');
+    }
+
+    alias = state.input.slice(_position, state.position);
+
+    if (!_hasOwnProperty$2.call(state.anchorMap, alias)) {
+      throwError(state, 'unidentified alias "' + alias + '"');
+    }
+
+    state.result = state.anchorMap[alias];
+    skipSeparationSpace(state, true, -1);
+    return true;
+  }
+
+  function composeNode(state, parentIndent, nodeContext, allowToSeek, allowCompact) {
+    var allowBlockStyles,
+        allowBlockScalars,
+        allowBlockCollections,
+        indentStatus = 1, // 1: this>parent, 0: this=parent, -1: this<parent
+        atNewLine  = false,
+        hasContent = false,
+        typeIndex,
+        typeQuantity,
+        typeList,
+        type,
+        flowIndent,
+        blockIndent;
+
+    if (state.listener !== null) {
+      state.listener('open', state);
+    }
+
+    state.tag    = null;
+    state.anchor = null;
+    state.kind   = null;
+    state.result = null;
+
+    allowBlockStyles = allowBlockScalars = allowBlockCollections =
+        CONTEXT_BLOCK_OUT === nodeContext ||
+        CONTEXT_BLOCK_IN  === nodeContext;
+
+    if (allowToSeek) {
+      if (skipSeparationSpace(state, true, -1)) {
+        atNewLine = true;
+
+        if (state.lineIndent > parentIndent) {
+          indentStatus = 1;
+        } else if (state.lineIndent === parentIndent) {
+          indentStatus = 0;
+        } else if (state.lineIndent < parentIndent) {
+          indentStatus = -1;
+        }
+      }
+    }
+
+    if (indentStatus === 1) {
+      while (readTagProperty(state) || readAnchorProperty(state)) {
+        if (skipSeparationSpace(state, true, -1)) {
+          atNewLine = true;
+          allowBlockCollections = allowBlockStyles;
+
+          if (state.lineIndent > parentIndent) {
+            indentStatus = 1;
+          } else if (state.lineIndent === parentIndent) {
+            indentStatus = 0;
+          } else if (state.lineIndent < parentIndent) {
+            indentStatus = -1;
+          }
+        } else {
+          allowBlockCollections = false;
+        }
+      }
+    }
+
+    if (allowBlockCollections) {
+      allowBlockCollections = atNewLine || allowCompact;
+    }
+
+    if (indentStatus === 1 || CONTEXT_BLOCK_OUT === nodeContext) {
+      if (CONTEXT_FLOW_IN === nodeContext || CONTEXT_FLOW_OUT === nodeContext) {
+        flowIndent = parentIndent;
+      } else {
+        flowIndent = parentIndent + 1;
+      }
+
+      blockIndent = state.position - state.lineStart;
+
+      if (indentStatus === 1) {
+        if (allowBlockCollections &&
+            (readBlockSequence(state, blockIndent) ||
+                readBlockMapping(state, blockIndent, flowIndent)) ||
+            readFlowCollection(state, flowIndent)) {
+          hasContent = true;
+        } else {
+          if ((allowBlockScalars && readBlockScalar(state, flowIndent)) ||
+              readSingleQuotedScalar(state, flowIndent) ||
+              readDoubleQuotedScalar(state, flowIndent)) {
+            hasContent = true;
+
+          } else if (readAlias(state)) {
+            hasContent = true;
+
+            if (state.tag !== null || state.anchor !== null) {
+              throwError(state, 'alias node should not have any properties');
+            }
+
+          } else if (readPlainScalar(state, flowIndent, CONTEXT_FLOW_IN === nodeContext)) {
+            hasContent = true;
+
+            if (state.tag === null) {
+              state.tag = '?';
+            }
+          }
+
+          if (state.anchor !== null) {
+            state.anchorMap[state.anchor] = state.result;
+          }
+        }
+      } else if (indentStatus === 0) {
+        // Special case: block sequences are allowed to have same indentation level as the parent.
+        // http://www.yaml.org/spec/1.2/spec.html#id2799784
+        hasContent = allowBlockCollections && readBlockSequence(state, blockIndent);
+      }
+    }
+
+    if (state.tag === null) {
+      if (state.anchor !== null) {
+        state.anchorMap[state.anchor] = state.result;
+      }
+
+    } else if (state.tag === '?') {
+      // Implicit resolving is not allowed for non-scalar types, and '?'
+      // non-specific tag is only automatically assigned to plain scalars.
+      //
+      // We only need to check kind conformity in case user explicitly assigns '?'
+      // tag, for example like this: "!<?> [0]"
+      //
+      if (state.result !== null && state.kind !== 'scalar') {
+        throwError(state, 'unacceptable node kind for !<?> tag; it should be "scalar", not "' + state.kind + '"');
+      }
+
+      for (typeIndex = 0, typeQuantity = state.implicitTypes.length; typeIndex < typeQuantity; typeIndex += 1) {
+        type = state.implicitTypes[typeIndex];
+
+        if (type.resolve(state.result)) { // `state.result` updated in resolver if matched
+          state.result = type.construct(state.result);
+          state.tag = type.tag;
+          if (state.anchor !== null) {
+            state.anchorMap[state.anchor] = state.result;
+          }
+          break;
+        }
+      }
+    } else if (state.tag !== '!') {
+      if (_hasOwnProperty$2.call(state.typeMap[state.kind || 'fallback'], state.tag)) {
+        type = state.typeMap[state.kind || 'fallback'][state.tag];
+      } else {
+        // looking for multi type
+        type = null;
+        typeList = state.typeMap.multi[state.kind || 'fallback'];
+
+        for (typeIndex = 0, typeQuantity = typeList.length; typeIndex < typeQuantity; typeIndex += 1) {
+          if (state.tag.slice(0, typeList[typeIndex].tag.length) === typeList[typeIndex].tag) {
+            type = typeList[typeIndex];
+            break;
+          }
+        }
+      }
+
+      if (!type) {
+        throwError(state, 'unknown tag !<' + state.tag + '>');
+      }
+
+      if (state.result !== null && type.kind !== state.kind) {
+        throwError(state, 'unacceptable node kind for !<' + state.tag + '> tag; it should be "' + type.kind + '", not "' + state.kind + '"');
+      }
+
+      if (!type.resolve(state.result, state.tag)) { // `state.result` updated in resolver if matched
+        throwError(state, 'cannot resolve a node with !<' + state.tag + '> explicit tag');
+      } else {
+        state.result = type.construct(state.result, state.tag);
+        if (state.anchor !== null) {
+          state.anchorMap[state.anchor] = state.result;
+        }
+      }
+    }
+
+    if (state.listener !== null) {
+      state.listener('close', state);
+    }
+    return state.tag !== null ||  state.anchor !== null || hasContent;
+  }
+
+  function readDocument(state) {
+    var documentStart = state.position,
+        _position,
+        directiveName,
+        directiveArgs,
+        hasDirectives = false,
+        ch;
+
+    state.version = null;
+    state.checkLineBreaks = state.legacy;
+    state.tagMap = Object.create(null);
+    state.anchorMap = Object.create(null);
+
+    while ((ch = state.input.charCodeAt(state.position)) !== 0) {
+      skipSeparationSpace(state, true, -1);
+
+      ch = state.input.charCodeAt(state.position);
+
+      if (state.lineIndent > 0 || ch !== 0x25/* % */) {
+        break;
+      }
+
+      hasDirectives = true;
+      ch = state.input.charCodeAt(++state.position);
+      _position = state.position;
+
+      while (ch !== 0 && !is_WS_OR_EOL(ch)) {
+        ch = state.input.charCodeAt(++state.position);
+      }
+
+      directiveName = state.input.slice(_position, state.position);
+      directiveArgs = [];
+
+      if (directiveName.length < 1) {
+        throwError(state, 'directive name must not be less than one character in length');
+      }
+
+      while (ch !== 0) {
+        while (is_WHITE_SPACE(ch)) {
+          ch = state.input.charCodeAt(++state.position);
+        }
+
+        if (ch === 0x23/* # */) {
+          do { ch = state.input.charCodeAt(++state.position); }
+          while (ch !== 0 && !is_EOL(ch));
+          break;
+        }
+
+        if (is_EOL(ch)) break;
+
+        _position = state.position;
+
+        while (ch !== 0 && !is_WS_OR_EOL(ch)) {
+          ch = state.input.charCodeAt(++state.position);
+        }
+
+        directiveArgs.push(state.input.slice(_position, state.position));
+      }
+
+      if (ch !== 0) readLineBreak(state);
+
+      if (_hasOwnProperty$2.call(directiveHandlers, directiveName)) {
+        directiveHandlers[directiveName](state, directiveName, directiveArgs);
+      } else {
+        throwWarning(state, 'unknown document directive "' + directiveName + '"');
+      }
+    }
+
+    skipSeparationSpace(state, true, -1);
+
+    if (state.lineIndent === 0 &&
+        state.input.charCodeAt(state.position)     === 0x2D/* - */ &&
+        state.input.charCodeAt(state.position + 1) === 0x2D/* - */ &&
+        state.input.charCodeAt(state.position + 2) === 0x2D/* - */) {
+      state.position += 3;
+      skipSeparationSpace(state, true, -1);
+
+    } else if (hasDirectives) {
+      throwError(state, 'directives end mark is expected');
+    }
+
+    composeNode(state, state.lineIndent - 1, CONTEXT_BLOCK_OUT, false, true);
+    skipSeparationSpace(state, true, -1);
+
+    if (state.checkLineBreaks &&
+        PATTERN_NON_ASCII_LINE_BREAKS.test(state.input.slice(documentStart, state.position))) {
+      throwWarning(state, 'non-ASCII line breaks are interpreted as content');
+    }
+
+    state.documents.push(state.result);
+
+    if (state.position === state.lineStart && testDocumentSeparator(state)) {
+
+      if (state.input.charCodeAt(state.position) === 0x2E/* . */) {
+        state.position += 3;
+        skipSeparationSpace(state, true, -1);
+      }
+      return;
+    }
+
+    if (state.position < (state.length - 1)) {
+      throwError(state, 'end of the stream or a document separator is expected');
+    } else {
+      return;
+    }
+  }
+
+
+  function loadDocuments(input, options) {
+    input = String(input);
+    options = options || {};
+
+    if (input.length !== 0) {
+
+      // Add tailing `\n` if not exists
+      if (input.charCodeAt(input.length - 1) !== 0x0A/* LF */ &&
+          input.charCodeAt(input.length - 1) !== 0x0D/* CR */) {
+        input += '\n';
+      }
+
+      // Strip BOM
+      if (input.charCodeAt(0) === 0xFEFF) {
+        input = input.slice(1);
+      }
+    }
+
+    var state = new State(input, options);
+
+    var nullpos = input.indexOf('\0');
+
+    if (nullpos !== -1) {
+      state.position = nullpos;
+      throwError(state, 'null byte is not allowed in input');
+    }
+
+    // Use 0 as string terminator. That significantly simplifies bounds check.
+    state.input += '\0';
+
+    while (state.input.charCodeAt(state.position) === 0x20/* Space */) {
+      state.lineIndent += 1;
+      state.position += 1;
+    }
+
+    while (state.position < (state.length - 1)) {
+      readDocument(state);
+    }
+
+    return state.documents;
+  }
+
+
+  function loadAll(input, iterator, options) {
+    if (iterator !== null && typeof iterator === 'object' && typeof options === 'undefined') {
+      options = iterator;
+      iterator = null;
+    }
+
+    var documents = loadDocuments(input, options);
+
+    if (typeof iterator !== 'function') {
+      return documents;
+    }
+
+    for (var index = 0, length = documents.length; index < length; index += 1) {
+      iterator(documents[index]);
+    }
+  }
+
+
+  function load(input, options) {
+    var documents = loadDocuments(input, options);
+
+    if (documents.length === 0) {
+      /*eslint-disable no-undefined*/
+      return undefined;
+    } else if (documents.length === 1) {
+      return documents[0];
+    }
+    throw new exception('expected a single document in the stream, but found more');
+  }
+
+
+  var loadAll_1 = loadAll;
+  var load_1    = load;
+
+  var loader = {
+    loadAll: loadAll_1,
+    load: load_1
+  };
+
+  /*eslint-disable no-use-before-define*/
+
+
+
+
+
+  var _toString$2       = Object.prototype.toString;
+  var _hasOwnProperty$3 = Object.prototype.hasOwnProperty;
+
+  var CHAR_BOM                  = 0xFEFF;
+  var CHAR_TAB                  = 0x09; /* Tab */
+  var CHAR_LINE_FEED            = 0x0A; /* LF */
+  var CHAR_CARRIAGE_RETURN      = 0x0D; /* CR */
+  var CHAR_SPACE                = 0x20; /* Space */
+  var CHAR_EXCLAMATION          = 0x21; /* ! */
+  var CHAR_DOUBLE_QUOTE         = 0x22; /* " */
+  var CHAR_SHARP                = 0x23; /* # */
+  var CHAR_PERCENT              = 0x25; /* % */
+  var CHAR_AMPERSAND            = 0x26; /* & */
+  var CHAR_SINGLE_QUOTE         = 0x27; /* ' */
+  var CHAR_ASTERISK             = 0x2A; /* * */
+  var CHAR_COMMA                = 0x2C; /* , */
+  var CHAR_MINUS                = 0x2D; /* - */
+  var CHAR_COLON                = 0x3A; /* : */
+  var CHAR_EQUALS               = 0x3D; /* = */
+  var CHAR_GREATER_THAN         = 0x3E; /* > */
+  var CHAR_QUESTION             = 0x3F; /* ? */
+  var CHAR_COMMERCIAL_AT        = 0x40; /* @ */
+  var CHAR_LEFT_SQUARE_BRACKET  = 0x5B; /* [ */
+  var CHAR_RIGHT_SQUARE_BRACKET = 0x5D; /* ] */
+  var CHAR_GRAVE_ACCENT         = 0x60; /* ` */
+  var CHAR_LEFT_CURLY_BRACKET   = 0x7B; /* { */
+  var CHAR_VERTICAL_LINE        = 0x7C; /* | */
+  var CHAR_RIGHT_CURLY_BRACKET  = 0x7D; /* } */
+
+  var ESCAPE_SEQUENCES = {};
+
+  ESCAPE_SEQUENCES[0x00]   = '\\0';
+  ESCAPE_SEQUENCES[0x07]   = '\\a';
+  ESCAPE_SEQUENCES[0x08]   = '\\b';
+  ESCAPE_SEQUENCES[0x09]   = '\\t';
+  ESCAPE_SEQUENCES[0x0A]   = '\\n';
+  ESCAPE_SEQUENCES[0x0B]   = '\\v';
+  ESCAPE_SEQUENCES[0x0C]   = '\\f';
+  ESCAPE_SEQUENCES[0x0D]   = '\\r';
+  ESCAPE_SEQUENCES[0x1B]   = '\\e';
+  ESCAPE_SEQUENCES[0x22]   = '\\"';
+  ESCAPE_SEQUENCES[0x5C]   = '\\\\';
+  ESCAPE_SEQUENCES[0x85]   = '\\N';
+  ESCAPE_SEQUENCES[0xA0]   = '\\_';
+  ESCAPE_SEQUENCES[0x2028] = '\\L';
+  ESCAPE_SEQUENCES[0x2029] = '\\P';
+
+  var DEPRECATED_BOOLEANS_SYNTAX = [
+    'y', 'Y', 'yes', 'Yes', 'YES', 'on', 'On', 'ON',
+    'n', 'N', 'no', 'No', 'NO', 'off', 'Off', 'OFF'
+  ];
+
+  var DEPRECATED_BASE60_SYNTAX = /^[-+]?[0-9_]+(?::[0-9_]+)+(?:\.[0-9_]*)?$/;
+
+  function compileStyleMap(schema, map) {
+    var result, keys, index, length, tag, style, type;
+
+    if (map === null) return {};
+
+    result = {};
+    keys = Object.keys(map);
+
+    for (index = 0, length = keys.length; index < length; index += 1) {
+      tag = keys[index];
+      style = String(map[tag]);
+
+      if (tag.slice(0, 2) === '!!') {
+        tag = 'tag:yaml.org,2002:' + tag.slice(2);
+      }
+      type = schema.compiledTypeMap['fallback'][tag];
+
+      if (type && _hasOwnProperty$3.call(type.styleAliases, style)) {
+        style = type.styleAliases[style];
+      }
+
+      result[tag] = style;
+    }
+
+    return result;
+  }
+
+  function encodeHex(character) {
+    var string, handle, length;
+
+    string = character.toString(16).toUpperCase();
+
+    if (character <= 0xFF) {
+      handle = 'x';
+      length = 2;
+    } else if (character <= 0xFFFF) {
+      handle = 'u';
+      length = 4;
+    } else if (character <= 0xFFFFFFFF) {
+      handle = 'U';
+      length = 8;
+    } else {
+      throw new exception('code point within a string may not be greater than 0xFFFFFFFF');
+    }
+
+    return '\\' + handle + common.repeat('0', length - string.length) + string;
+  }
+
+
+  var QUOTING_TYPE_SINGLE = 1,
+      QUOTING_TYPE_DOUBLE = 2;
+
+  function State$1(options) {
+    this.schema        = options['schema'] || _default;
+    this.indent        = Math.max(1, (options['indent'] || 2));
+    this.noArrayIndent = options['noArrayIndent'] || false;
+    this.skipInvalid   = options['skipInvalid'] || false;
+    this.flowLevel     = (common.isNothing(options['flowLevel']) ? -1 : options['flowLevel']);
+    this.styleMap      = compileStyleMap(this.schema, options['styles'] || null);
+    this.sortKeys      = options['sortKeys'] || false;
+    this.lineWidth     = options['lineWidth'] || 80;
+    this.noRefs        = options['noRefs'] || false;
+    this.noCompatMode  = options['noCompatMode'] || false;
+    this.condenseFlow  = options['condenseFlow'] || false;
+    this.quotingType   = options['quotingType'] === '"' ? QUOTING_TYPE_DOUBLE : QUOTING_TYPE_SINGLE;
+    this.forceQuotes   = options['forceQuotes'] || false;
+    this.replacer      = typeof options['replacer'] === 'function' ? options['replacer'] : null;
+
+    this.implicitTypes = this.schema.compiledImplicit;
+    this.explicitTypes = this.schema.compiledExplicit;
+
+    this.tag = null;
+    this.result = '';
+
+    this.duplicates = [];
+    this.usedDuplicates = null;
+  }
+
+  // Indents every line in a string. Empty lines (\n only) are not indented.
+  function indentString(string, spaces) {
+    var ind = common.repeat(' ', spaces),
+        position = 0,
+        next = -1,
+        result = '',
+        line,
+        length = string.length;
+
+    while (position < length) {
+      next = string.indexOf('\n', position);
+      if (next === -1) {
+        line = string.slice(position);
+        position = length;
+      } else {
+        line = string.slice(position, next + 1);
+        position = next + 1;
+      }
+
+      if (line.length && line !== '\n') result += ind;
+
+      result += line;
+    }
+
+    return result;
+  }
+
+  function generateNextLine(state, level) {
+    return '\n' + common.repeat(' ', state.indent * level);
+  }
+
+  function testImplicitResolving(state, str) {
+    var index, length, type;
+
+    for (index = 0, length = state.implicitTypes.length; index < length; index += 1) {
+      type = state.implicitTypes[index];
+
+      if (type.resolve(str)) {
+        return true;
+      }
+    }
+
+    return false;
+  }
+
+  // [33] s-white ::= s-space | s-tab
+  function isWhitespace(c) {
+    return c === CHAR_SPACE || c === CHAR_TAB;
+  }
+
+  // Returns true if the character can be printed without escaping.
+  // From YAML 1.2: "any allowed characters known to be non-printable
+  // should also be escaped. [However,] This isn鈥檛 mandatory"
+  // Derived from nb-char - \t - #x85 - #xA0 - #x2028 - #x2029.
+  function isPrintable(c) {
+    return  (0x00020 <= c && c <= 0x00007E)
+        || ((0x000A1 <= c && c <= 0x00D7FF) && c !== 0x2028 && c !== 0x2029)
+        || ((0x0E000 <= c && c <= 0x00FFFD) && c !== CHAR_BOM)
+        ||  (0x10000 <= c && c <= 0x10FFFF);
+  }
+
+  // [34] ns-char ::= nb-char - s-white
+  // [27] nb-char ::= c-printable - b-char - c-byte-order-mark
+  // [26] b-char  ::= b-line-feed | b-carriage-return
+  // Including s-white (for some reason, examples doesn't match specs in this aspect)
+  // ns-char ::= c-printable - b-line-feed - b-carriage-return - c-byte-order-mark
+  function isNsCharOrWhitespace(c) {
+    return isPrintable(c)
+        && c !== CHAR_BOM
+        // - b-char
+        && c !== CHAR_CARRIAGE_RETURN
+        && c !== CHAR_LINE_FEED;
+  }
+
+  // [127]  ns-plain-safe(c) ::= c = flow-out  鈬� ns-plain-safe-out
+  //                             c = flow-in   鈬� ns-plain-safe-in
+  //                             c = block-key 鈬� ns-plain-safe-out
+  //                             c = flow-key  鈬� ns-plain-safe-in
+  // [128] ns-plain-safe-out ::= ns-char
+  // [129]  ns-plain-safe-in ::= ns-char - c-flow-indicator
+  // [130]  ns-plain-char(c) ::=  ( ns-plain-safe(c) - 鈥�:鈥� - 鈥�#鈥� )
+  //                            | ( /* An ns-char preceding */ 鈥�#鈥� )
+  //                            | ( 鈥�:鈥� /* Followed by an ns-plain-safe(c) */ )
+  function isPlainSafe(c, prev, inblock) {
+    var cIsNsCharOrWhitespace = isNsCharOrWhitespace(c);
+    var cIsNsChar = cIsNsCharOrWhitespace && !isWhitespace(c);
+    return (
+            // ns-plain-safe
+            inblock ? // c = flow-in
+                cIsNsCharOrWhitespace
+                : cIsNsCharOrWhitespace
+                // - c-flow-indicator
+                && c !== CHAR_COMMA
+                && c !== CHAR_LEFT_SQUARE_BRACKET
+                && c !== CHAR_RIGHT_SQUARE_BRACKET
+                && c !== CHAR_LEFT_CURLY_BRACKET
+                && c !== CHAR_RIGHT_CURLY_BRACKET
+        )
+        // ns-plain-char
+        && c !== CHAR_SHARP // false on '#'
+        && !(prev === CHAR_COLON && !cIsNsChar) // false on ': '
+        || (isNsCharOrWhitespace(prev) && !isWhitespace(prev) && c === CHAR_SHARP) // change to true on '[^ ]#'
+        || (prev === CHAR_COLON && cIsNsChar); // change to true on ':[^ ]'
+  }
+
+  // Simplified test for values allowed as the first character in plain style.
+  function isPlainSafeFirst(c) {
+    // Uses a subset of ns-char - c-indicator
+    // where ns-char = nb-char - s-white.
+    // No support of ( ( 鈥�?鈥� | 鈥�:鈥� | 鈥�-鈥� ) /* Followed by an ns-plain-safe(c)) */ ) part
+    return isPrintable(c) && c !== CHAR_BOM
+        && !isWhitespace(c) // - s-white
+        // - (c-indicator ::=
+        // 鈥�-鈥� | 鈥�?鈥� | 鈥�:鈥� | 鈥�,鈥� | 鈥淸鈥� | 鈥淽鈥� | 鈥渰鈥� | 鈥渳鈥�
+        && c !== CHAR_MINUS
+        && c !== CHAR_QUESTION
+        && c !== CHAR_COLON
+        && c !== CHAR_COMMA
+        && c !== CHAR_LEFT_SQUARE_BRACKET
+        && c !== CHAR_RIGHT_SQUARE_BRACKET
+        && c !== CHAR_LEFT_CURLY_BRACKET
+        && c !== CHAR_RIGHT_CURLY_BRACKET
+        // | 鈥�#鈥� | 鈥�&鈥� | 鈥�*鈥� | 鈥�!鈥� | 鈥渱鈥� | 鈥�=鈥� | 鈥�>鈥� | 鈥�'鈥� | 鈥�"鈥�
+        && c !== CHAR_SHARP
+        && c !== CHAR_AMPERSAND
+        && c !== CHAR_ASTERISK
+        && c !== CHAR_EXCLAMATION
+        && c !== CHAR_VERTICAL_LINE
+        && c !== CHAR_EQUALS
+        && c !== CHAR_GREATER_THAN
+        && c !== CHAR_SINGLE_QUOTE
+        && c !== CHAR_DOUBLE_QUOTE
+        // | 鈥�%鈥� | 鈥淍鈥� | 鈥渀鈥�)
+        && c !== CHAR_PERCENT
+        && c !== CHAR_COMMERCIAL_AT
+        && c !== CHAR_GRAVE_ACCENT;
+  }
+
+  // Simplified test for values allowed as the last character in plain style.
+  function isPlainSafeLast(c) {
+    // just not whitespace or colon, it will be checked to be plain character later
+    return !isWhitespace(c) && c !== CHAR_COLON;
+  }
+
+  // Same as 'string'.codePointAt(pos), but works in older browsers.
+  function codePointAt(string, pos) {
+    var first = string.charCodeAt(pos), second;
+    if (first >= 0xD800 && first <= 0xDBFF && pos + 1 < string.length) {
+      second = string.charCodeAt(pos + 1);
+      if (second >= 0xDC00 && second <= 0xDFFF) {
+        // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae
+        return (first - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;
+      }
+    }
+    return first;
+  }
+
+  // Determines whether block indentation indicator is required.
+  function needIndentIndicator(string) {
+    var leadingSpaceRe = /^\n* /;
+    return leadingSpaceRe.test(string);
+  }
+
+  var STYLE_PLAIN   = 1,
+      STYLE_SINGLE  = 2,
+      STYLE_LITERAL = 3,
+      STYLE_FOLDED  = 4,
+      STYLE_DOUBLE  = 5;
+
+  // Determines which scalar styles are possible and returns the preferred style.
+  // lineWidth = -1 => no limit.
+  // Pre-conditions: str.length > 0.
+  // Post-conditions:
+  //    STYLE_PLAIN or STYLE_SINGLE => no \n are in the string.
+  //    STYLE_LITERAL => no lines are suitable for folding (or lineWidth is -1).
+  //    STYLE_FOLDED => a line > lineWidth and can be folded (and lineWidth != -1).
+  function chooseScalarStyle(string, singleLineOnly, indentPerLevel, lineWidth,
+                             testAmbiguousType, quotingType, forceQuotes, inblock) {
+
+    var i;
+    var char = 0;
+    var prevChar = null;
+    var hasLineBreak = false;
+    var hasFoldableLine = false; // only checked if shouldTrackWidth
+    var shouldTrackWidth = lineWidth !== -1;
+    var previousLineBreak = -1; // count the first line correctly
+    var plain = isPlainSafeFirst(codePointAt(string, 0))
+        && isPlainSafeLast(codePointAt(string, string.length - 1));
+
+    if (singleLineOnly || forceQuotes) {
+      // Case: no block styles.
+      // Check for disallowed characters to rule out plain and single.
+      for (i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) {
+        char = codePointAt(string, i);
+        if (!isPrintable(char)) {
+          return STYLE_DOUBLE;
+        }
+        plain = plain && isPlainSafe(char, prevChar, inblock);
+        prevChar = char;
+      }
+    } else {
+      // Case: block styles permitted.
+      for (i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) {
+        char = codePointAt(string, i);
+        if (char === CHAR_LINE_FEED) {
+          hasLineBreak = true;
+          // Check if any line can be folded.
+          if (shouldTrackWidth) {
+            hasFoldableLine = hasFoldableLine ||
+                // Foldable line = too long, and not more-indented.
+                (i - previousLineBreak - 1 > lineWidth &&
+                    string[previousLineBreak + 1] !== ' ');
+            previousLineBreak = i;
+          }
+        } else if (!isPrintable(char)) {
+          return STYLE_DOUBLE;
+        }
+        plain = plain && isPlainSafe(char, prevChar, inblock);
+        prevChar = char;
+      }
+      // in case the end is missing a \n
+      hasFoldableLine = hasFoldableLine || (shouldTrackWidth &&
+          (i - previousLineBreak - 1 > lineWidth &&
+              string[previousLineBreak + 1] !== ' '));
+    }
+    // Although every style can represent \n without escaping, prefer block styles
+    // for multiline, since they're more readable and they don't add empty lines.
+    // Also prefer folding a super-long line.
+    if (!hasLineBreak && !hasFoldableLine) {
+      // Strings interpretable as another type have to be quoted;
+      // e.g. the string 'true' vs. the boolean true.
+      if (plain && !forceQuotes && !testAmbiguousType(string)) {
+        return STYLE_PLAIN;
+      }
+      return quotingType === QUOTING_TYPE_DOUBLE ? STYLE_DOUBLE : STYLE_SINGLE;
+    }
+    // Edge case: block indentation indicator can only have one digit.
+    if (indentPerLevel > 9 && needIndentIndicator(string)) {
+      return STYLE_DOUBLE;
+    }
+    // At this point we know block styles are valid.
+    // Prefer literal style unless we want to fold.
+    if (!forceQuotes) {
+      return hasFoldableLine ? STYLE_FOLDED : STYLE_LITERAL;
+    }
+    return quotingType === QUOTING_TYPE_DOUBLE ? STYLE_DOUBLE : STYLE_SINGLE;
+  }
+
+  // Note: line breaking/folding is implemented for only the folded style.
+  // NB. We drop the last trailing newline (if any) of a returned block scalar
+  //  since the dumper adds its own newline. This always works:
+  //    鈥� No ending newline => unaffected; already using strip "-" chomping.
+  //    鈥� Ending newline    => removed then restored.
+  //  Importantly, this keeps the "+" chomp indicator from gaining an extra line.
+  function writeScalar(state, string, level, iskey, inblock) {
+    state.dump = (function () {
+      if (string.length === 0) {
+        return state.quotingType === QUOTING_TYPE_DOUBLE ? '""' : "''";
+      }
+      if (!state.noCompatMode) {
+        if (DEPRECATED_BOOLEANS_SYNTAX.indexOf(string) !== -1 || DEPRECATED_BASE60_SYNTAX.test(string)) {
+          return state.quotingType === QUOTING_TYPE_DOUBLE ? ('"' + string + '"') : ("'" + string + "'");
+        }
+      }
+
+      var indent = state.indent * Math.max(1, level); // no 0-indent scalars
+      // As indentation gets deeper, let the width decrease monotonically
+      // to the lower bound min(state.lineWidth, 40).
+      // Note that this implies
+      //  state.lineWidth 鈮� 40 + state.indent: width is fixed at the lower bound.
+      //  state.lineWidth > 40 + state.indent: width decreases until the lower bound.
+      // This behaves better than a constant minimum width which disallows narrower options,
+      // or an indent threshold which causes the width to suddenly increase.
+      var lineWidth = state.lineWidth === -1
+          ? -1 : Math.max(Math.min(state.lineWidth, 40), state.lineWidth - indent);
+
+      // Without knowing if keys are implicit/explicit, assume implicit for safety.
+      var singleLineOnly = iskey
+          // No block styles in flow mode.
+          || (state.flowLevel > -1 && level >= state.flowLevel);
+      function testAmbiguity(string) {
+        return testImplicitResolving(state, string);
+      }
+
+      switch (chooseScalarStyle(string, singleLineOnly, state.indent, lineWidth,
+          testAmbiguity, state.quotingType, state.forceQuotes && !iskey, inblock)) {
+
+        case STYLE_PLAIN:
+          return string;
+        case STYLE_SINGLE:
+          return "'" + string.replace(/'/g, "''") + "'";
+        case STYLE_LITERAL:
+          return '|' + blockHeader(string, state.indent)
+              + dropEndingNewline(indentString(string, indent));
+        case STYLE_FOLDED:
+          return '>' + blockHeader(string, state.indent)
+              + dropEndingNewline(indentString(foldString(string, lineWidth), indent));
+        case STYLE_DOUBLE:
+          return '"' + escapeString(string) + '"';
+        default:
+          throw new exception('impossible error: invalid scalar style');
+      }
+    }());
+  }
+
+  // Pre-conditions: string is valid for a block scalar, 1 <= indentPerLevel <= 9.
+  function blockHeader(string, indentPerLevel) {
+    var indentIndicator = needIndentIndicator(string) ? String(indentPerLevel) : '';
+
+    // note the special case: the string '\n' counts as a "trailing" empty line.
+    var clip =          string[string.length - 1] === '\n';
+    var keep = clip && (string[string.length - 2] === '\n' || string === '\n');
+    var chomp = keep ? '+' : (clip ? '' : '-');
+
+    return indentIndicator + chomp + '\n';
+  }
+
+  // (See the note for writeScalar.)
+  function dropEndingNewline(string) {
+    return string[string.length - 1] === '\n' ? string.slice(0, -1) : string;
+  }
+
+  // Note: a long line without a suitable break point will exceed the width limit.
+  // Pre-conditions: every char in str isPrintable, str.length > 0, width > 0.
+  function foldString(string, width) {
+    // In folded style, $k$ consecutive newlines output as $k+1$ newlines鈥�
+    // unless they're before or after a more-indented line, or at the very
+    // beginning or end, in which case $k$ maps to $k$.
+    // Therefore, parse each chunk as newline(s) followed by a content line.
+    var lineRe = /(\n+)([^\n]*)/g;
+
+    // first line (possibly an empty line)
+    var result = (function () {
+      var nextLF = string.indexOf('\n');
+      nextLF = nextLF !== -1 ? nextLF : string.length;
+      lineRe.lastIndex = nextLF;
+      return foldLine(string.slice(0, nextLF), width);
+    }());
+    // If we haven't reached the first content line yet, don't add an extra \n.
+    var prevMoreIndented = string[0] === '\n' || string[0] === ' ';
+    var moreIndented;
+
+    // rest of the lines
+    var match;
+    while ((match = lineRe.exec(string))) {
+      var prefix = match[1], line = match[2];
+      moreIndented = (line[0] === ' ');
+      result += prefix
+          + (!prevMoreIndented && !moreIndented && line !== ''
+              ? '\n' : '')
+          + foldLine(line, width);
+      prevMoreIndented = moreIndented;
+    }
+
+    return result;
+  }
+
+  // Greedy line breaking.
+  // Picks the longest line under the limit each time,
+  // otherwise settles for the shortest line over the limit.
+  // NB. More-indented lines *cannot* be folded, as that would add an extra \n.
+  function foldLine(line, width) {
+    if (line === '' || line[0] === ' ') return line;
+
+    // Since a more-indented line adds a \n, breaks can't be followed by a space.
+    var breakRe = / [^ ]/g; // note: the match index will always be <= length-2.
+    var match;
+    // start is an inclusive index. end, curr, and next are exclusive.
+    var start = 0, end, curr = 0, next = 0;
+    var result = '';
+
+    // Invariants: 0 <= start <= length-1.
+    //   0 <= curr <= next <= max(0, length-2). curr - start <= width.
+    // Inside the loop:
+    //   A match implies length >= 2, so curr and next are <= length-2.
+    while ((match = breakRe.exec(line))) {
+      next = match.index;
+      // maintain invariant: curr - start <= width
+      if (next - start > width) {
+        end = (curr > start) ? curr : next; // derive end <= length-2
+        result += '\n' + line.slice(start, end);
+        // skip the space that was output as \n
+        start = end + 1;                    // derive start <= length-1
+      }
+      curr = next;
+    }
+
+    // By the invariants, start <= length-1, so there is something left over.
+    // It is either the whole string or a part starting from non-whitespace.
+    result += '\n';
+    // Insert a break if the remainder is too long and there is a break available.
+    if (line.length - start > width && curr > start) {
+      result += line.slice(start, curr) + '\n' + line.slice(curr + 1);
+    } else {
+      result += line.slice(start);
+    }
+
+    return result.slice(1); // drop extra \n joiner
+  }
+
+  // Escapes a double-quoted string.
+  function escapeString(string) {
+    var result = '';
+    var char = 0;
+    var escapeSeq;
+
+    for (var i = 0; i < string.length; char >= 0x10000 ? i += 2 : i++) {
+      char = codePointAt(string, i);
+      escapeSeq = ESCAPE_SEQUENCES[char];
+
+      if (!escapeSeq && isPrintable(char)) {
+        result += string[i];
+        if (char >= 0x10000) result += string[i + 1];
+      } else {
+        result += escapeSeq || encodeHex(char);
+      }
+    }
+
+    return result;
+  }
+
+  function writeFlowSequence(state, level, object) {
+    var _result = '',
+        _tag    = state.tag,
+        index,
+        length,
+        value;
+
+    for (index = 0, length = object.length; index < length; index += 1) {
+      value = object[index];
+
+      if (state.replacer) {
+        value = state.replacer.call(object, String(index), value);
+      }
+
+      // Write only valid elements, put null instead of invalid elements.
+      if (writeNode(state, level, value, false, false) ||
+          (typeof value === 'undefined' &&
+              writeNode(state, level, null, false, false))) {
+
+        if (_result !== '') _result += ',' + (!state.condenseFlow ? ' ' : '');
+        _result += state.dump;
+      }
+    }
+
+    state.tag = _tag;
+    state.dump = '[' + _result + ']';
+  }
+
+  function writeBlockSequence(state, level, object, compact) {
+    var _result = '',
+        _tag    = state.tag,
+        index,
+        length,
+        value;
+
+    for (index = 0, length = object.length; index < length; index += 1) {
+      value = object[index];
+
+      if (state.replacer) {
+        value = state.replacer.call(object, String(index), value);
+      }
+
+      // Write only valid elements, put null instead of invalid elements.
+      if (writeNode(state, level + 1, value, true, true, false, true) ||
+          (typeof value === 'undefined' &&
+              writeNode(state, level + 1, null, true, true, false, true))) {
+
+        if (!compact || _result !== '') {
+          _result += generateNextLine(state, level);
+        }
+
+        if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {
+          _result += '-';
+        } else {
+          _result += '- ';
+        }
+
+        _result += state.dump;
+      }
+    }
+
+    state.tag = _tag;
+    state.dump = _result || '[]'; // Empty sequence if no valid values.
+  }
+
+  function writeFlowMapping(state, level, object) {
+    var _result       = '',
+        _tag          = state.tag,
+        objectKeyList = Object.keys(object),
+        index,
+        length,
+        objectKey,
+        objectValue,
+        pairBuffer;
+
+    for (index = 0, length = objectKeyList.length; index < length; index += 1) {
+
+      pairBuffer = '';
+      if (_result !== '') pairBuffer += ', ';
+
+      if (state.condenseFlow) pairBuffer += '"';
+
+      objectKey = objectKeyList[index];
+      objectValue = object[objectKey];
+
+      if (state.replacer) {
+        objectValue = state.replacer.call(object, objectKey, objectValue);
+      }
+
+      if (!writeNode(state, level, objectKey, false, false)) {
+        continue; // Skip this pair because of invalid key;
+      }
+
+      if (state.dump.length > 1024) pairBuffer += '? ';
+
+      pairBuffer += state.dump + (state.condenseFlow ? '"' : '') + ':' + (state.condenseFlow ? '' : ' ');
+
+      if (!writeNode(state, level, objectValue, false, false)) {
+        continue; // Skip this pair because of invalid value.
+      }
+
+      pairBuffer += state.dump;
+
+      // Both key and value are valid.
+      _result += pairBuffer;
+    }
+
+    state.tag = _tag;
+    state.dump = '{' + _result + '}';
+  }
+
+  function writeBlockMapping(state, level, object, compact) {
+    var _result       = '',
+        _tag          = state.tag,
+        objectKeyList = Object.keys(object),
+        index,
+        length,
+        objectKey,
+        objectValue,
+        explicitPair,
+        pairBuffer;
+
+    // Allow sorting keys so that the output file is deterministic
+    if (state.sortKeys === true) {
+      // Default sorting
+      objectKeyList.sort();
+    } else if (typeof state.sortKeys === 'function') {
+      // Custom sort function
+      objectKeyList.sort(state.sortKeys);
+    } else if (state.sortKeys) {
+      // Something is wrong
+      throw new exception('sortKeys must be a boolean or a function');
+    }
+
+    for (index = 0, length = objectKeyList.length; index < length; index += 1) {
+      pairBuffer = '';
+
+      if (!compact || _result !== '') {
+        pairBuffer += generateNextLine(state, level);
+      }
+
+      objectKey = objectKeyList[index];
+      objectValue = object[objectKey];
+
+      if (state.replacer) {
+        objectValue = state.replacer.call(object, objectKey, objectValue);
+      }
+
+      if (!writeNode(state, level + 1, objectKey, true, true, true)) {
+        continue; // Skip this pair because of invalid key.
+      }
+
+      explicitPair = (state.tag !== null && state.tag !== '?') ||
+          (state.dump && state.dump.length > 1024);
+
+      if (explicitPair) {
+        if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {
+          pairBuffer += '?';
+        } else {
+          pairBuffer += '? ';
+        }
+      }
+
+      pairBuffer += state.dump;
+
+      if (explicitPair) {
+        pairBuffer += generateNextLine(state, level);
+      }
+
+      if (!writeNode(state, level + 1, objectValue, true, explicitPair)) {
+        continue; // Skip this pair because of invalid value.
+      }
+
+      if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {
+        pairBuffer += ':';
+      } else {
+        pairBuffer += ': ';
+      }
+
+      pairBuffer += state.dump;
+
+      // Both key and value are valid.
+      _result += pairBuffer;
+    }
+
+    state.tag = _tag;
+    state.dump = _result || '{}'; // Empty mapping if no valid pairs.
+  }
+
+  function detectType(state, object, explicit) {
+    var _result, typeList, index, length, type, style;
+
+    typeList = explicit ? state.explicitTypes : state.implicitTypes;
+
+    for (index = 0, length = typeList.length; index < length; index += 1) {
+      type = typeList[index];
+
+      if ((type.instanceOf  || type.predicate) &&
+          (!type.instanceOf || ((typeof object === 'object') && (object instanceof type.instanceOf))) &&
+          (!type.predicate  || type.predicate(object))) {
+
+        if (explicit) {
+          if (type.multi && type.representName) {
+            state.tag = type.representName(object);
+          } else {
+            state.tag = type.tag;
+          }
+        } else {
+          state.tag = '?';
+        }
+
+        if (type.represent) {
+          style = state.styleMap[type.tag] || type.defaultStyle;
+
+          if (_toString$2.call(type.represent) === '[object Function]') {
+            _result = type.represent(object, style);
+          } else if (_hasOwnProperty$3.call(type.represent, style)) {
+            _result = type.represent[style](object, style);
+          } else {
+            throw new exception('!<' + type.tag + '> tag resolver accepts not "' + style + '" style');
+          }
+
+          state.dump = _result;
+        }
+
+        return true;
+      }
+    }
+
+    return false;
+  }
+
+  // Serializes `object` and writes it to global `result`.
+  // Returns true on success, or false on invalid object.
+  //
+  function writeNode(state, level, object, block, compact, iskey, isblockseq) {
+    state.tag = null;
+    state.dump = object;
+
+    if (!detectType(state, object, false)) {
+      detectType(state, object, true);
+    }
+
+    var type = _toString$2.call(state.dump);
+    var inblock = block;
+    var tagStr;
+
+    if (block) {
+      block = (state.flowLevel < 0 || state.flowLevel > level);
+    }
+
+    var objectOrArray = type === '[object Object]' || type === '[object Array]',
+        duplicateIndex,
+        duplicate;
+
+    if (objectOrArray) {
+      duplicateIndex = state.duplicates.indexOf(object);
+      duplicate = duplicateIndex !== -1;
+    }
+
+    if ((state.tag !== null && state.tag !== '?') || duplicate || (state.indent !== 2 && level > 0)) {
+      compact = false;
+    }
+
+    if (duplicate && state.usedDuplicates[duplicateIndex]) {
+      state.dump = '*ref_' + duplicateIndex;
+    } else {
+      if (objectOrArray && duplicate && !state.usedDuplicates[duplicateIndex]) {
+        state.usedDuplicates[duplicateIndex] = true;
+      }
+      if (type === '[object Object]') {
+        if (block && (Object.keys(state.dump).length !== 0)) {
+          writeBlockMapping(state, level, state.dump, compact);
+          if (duplicate) {
+            state.dump = '&ref_' + duplicateIndex + state.dump;
+          }
+        } else {
+          writeFlowMapping(state, level, state.dump);
+          if (duplicate) {
+            state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;
+          }
+        }
+      } else if (type === '[object Array]') {
+        if (block && (state.dump.length !== 0)) {
+          if (state.noArrayIndent && !isblockseq && level > 0) {
+            writeBlockSequence(state, level - 1, state.dump, compact);
+          } else {
+            writeBlockSequence(state, level, state.dump, compact);
+          }
+          if (duplicate) {
+            state.dump = '&ref_' + duplicateIndex + state.dump;
+          }
+        } else {
+          writeFlowSequence(state, level, state.dump);
+          if (duplicate) {
+            state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;
+          }
+        }
+      } else if (type === '[object String]') {
+        if (state.tag !== '?') {
+          writeScalar(state, state.dump, level, iskey, inblock);
+        }
+      } else if (type === '[object Undefined]') {
+        return false;
+      } else {
+        if (state.skipInvalid) return false;
+        throw new exception('unacceptable kind of an object to dump ' + type);
+      }
+
+      if (state.tag !== null && state.tag !== '?') {
+        // Need to encode all characters except those allowed by the spec:
+        //
+        // [35] ns-dec-digit    ::=  [#x30-#x39] /* 0-9 */
+        // [36] ns-hex-digit    ::=  ns-dec-digit
+        //                         | [#x41-#x46] /* A-F */ | [#x61-#x66] /* a-f */
+        // [37] ns-ascii-letter ::=  [#x41-#x5A] /* A-Z */ | [#x61-#x7A] /* a-z */
+        // [38] ns-word-char    ::=  ns-dec-digit | ns-ascii-letter | 鈥�-鈥�
+        // [39] ns-uri-char     ::=  鈥�%鈥� ns-hex-digit ns-hex-digit | ns-word-char | 鈥�#鈥�
+        //                         | 鈥�;鈥� | 鈥�/鈥� | 鈥�?鈥� | 鈥�:鈥� | 鈥淍鈥� | 鈥�&鈥� | 鈥�=鈥� | 鈥�+鈥� | 鈥�$鈥� | 鈥�,鈥�
+        //                         | 鈥淿鈥� | 鈥�.鈥� | 鈥�!鈥� | 鈥渵鈥� | 鈥�*鈥� | 鈥�'鈥� | 鈥�(鈥� | 鈥�)鈥� | 鈥淸鈥� | 鈥淽鈥�
+        //
+        // Also need to encode '!' because it has special meaning (end of tag prefix).
+        //
+        tagStr = encodeURI(
+            state.tag[0] === '!' ? state.tag.slice(1) : state.tag
+        ).replace(/!/g, '%21');
+
+        if (state.tag[0] === '!') {
+          tagStr = '!' + tagStr;
+        } else if (tagStr.slice(0, 18) === 'tag:yaml.org,2002:') {
+          tagStr = '!!' + tagStr.slice(18);
+        } else {
+          tagStr = '!<' + tagStr + '>';
+        }
+
+        state.dump = tagStr + ' ' + state.dump;
+      }
+    }
+
+    return true;
+  }
+
+  function getDuplicateReferences(object, state) {
+    var objects = [],
+        duplicatesIndexes = [],
+        index,
+        length;
+
+    inspectNode(object, objects, duplicatesIndexes);
+
+    for (index = 0, length = duplicatesIndexes.length; index < length; index += 1) {
+      state.duplicates.push(objects[duplicatesIndexes[index]]);
+    }
+    state.usedDuplicates = new Array(length);
+  }
+
+  function inspectNode(object, objects, duplicatesIndexes) {
+    var objectKeyList,
+        index,
+        length;
+
+    if (object !== null && typeof object === 'object') {
+      index = objects.indexOf(object);
+      if (index !== -1) {
+        if (duplicatesIndexes.indexOf(index) === -1) {
+          duplicatesIndexes.push(index);
+        }
+      } else {
+        objects.push(object);
+
+        if (Array.isArray(object)) {
+          for (index = 0, length = object.length; index < length; index += 1) {
+            inspectNode(object[index], objects, duplicatesIndexes);
+          }
+        } else {
+          objectKeyList = Object.keys(object);
+
+          for (index = 0, length = objectKeyList.length; index < length; index += 1) {
+            inspectNode(object[objectKeyList[index]], objects, duplicatesIndexes);
+          }
+        }
+      }
+    }
+  }
+
+  function dump(input, options) {
+    options = options || {};
+
+    var state = new State$1(options);
+
+    if (!state.noRefs) getDuplicateReferences(input, state);
+
+    var value = input;
+
+    if (state.replacer) {
+      value = state.replacer.call({ '': value }, '', value);
+    }
+
+    if (writeNode(state, 0, value, true, true)) return state.dump + '\n';
+
+    return '';
+  }
+
+  var dump_1 = dump;
+
+  var dumper = {
+    dump: dump_1
+  };
+
+  function renamed(from, to) {
+    return function () {
+      throw new Error('Function yaml.' + from + ' is removed in js-yaml 4. ' +
+          'Use yaml.' + to + ' instead, which is now safe by default.');
+    };
+  }
+
+
+  var Type$1                = type;
+  var Schema$1              = schema;
+  var FAILSAFE_SCHEMA     = failsafe;
+  var JSON_SCHEMA         = json;
+  var CORE_SCHEMA         = core;
+  var DEFAULT_SCHEMA      = _default;
+  var load$1                = loader.load;
+  var loadAll$1             = loader.loadAll;
+  var dump$1                = dumper.dump;
+  var YAMLException$1       = exception;
+
+  // Removed functions from JS-YAML 3.0.x
+  var safeLoad            = renamed('safeLoad', 'load');
+  var safeLoadAll         = renamed('safeLoadAll', 'loadAll');
+  var safeDump            = renamed('safeDump', 'dump');
+
+  var jsYaml = {
+    Type: Type$1,
+    Schema: Schema$1,
+    FAILSAFE_SCHEMA: FAILSAFE_SCHEMA,
+    JSON_SCHEMA: JSON_SCHEMA,
+    CORE_SCHEMA: CORE_SCHEMA,
+    DEFAULT_SCHEMA: DEFAULT_SCHEMA,
+    load: load$1,
+    loadAll: loadAll$1,
+    dump: dump$1,
+    YAMLException: YAMLException$1,
+    safeLoad: safeLoad,
+    safeLoadAll: safeLoadAll,
+    safeDump: safeDump
+  };
+
+  exports.CORE_SCHEMA = CORE_SCHEMA;
+  exports.DEFAULT_SCHEMA = DEFAULT_SCHEMA;
+  exports.FAILSAFE_SCHEMA = FAILSAFE_SCHEMA;
+  exports.JSON_SCHEMA = JSON_SCHEMA;
+  exports.Schema = Schema$1;
+  exports.Type = Type$1;
+  exports.YAMLException = YAMLException$1;
+  exports.default = jsYaml;
+  exports.dump = dump$1;
+  exports.load = load$1;
+  exports.loadAll = loadAll$1;
+  exports.safeDump = safeDump;
+  exports.safeLoad = safeLoad;
+  exports.safeLoadAll = safeLoadAll;
+
+  Object.defineProperty(exports, '__esModule', { value: true });
+
+})));
diff --git a/Source/platformProject/platform2022UI/jslib/yaml/js/js-yaml.min.js b/Source/platformProject/platform2022UI/jslib/yaml/js/js-yaml.min.js
new file mode 100644
index 0000000..6a46952
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/yaml/js/js-yaml.min.js
@@ -0,0 +1,2 @@
+/*! js-yaml 4.0.0 https://github.com/nodeca/js-yaml @license MIT */
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).jsyaml={})}(this,(function(e){"use strict";function t(e){return null==e}var n={isNothing:t,isObject:function(e){return"object"==typeof e&&null!==e},toArray:function(e){return Array.isArray(e)?e:t(e)?[]:[e]},repeat:function(e,t){var n,i="";for(n=0;n<t;n+=1)i+=e;return i},isNegativeZero:function(e){return 0===e&&Number.NEGATIVE_INFINITY===1/e},extend:function(e,t){var n,i,r,o;if(t)for(n=0,i=(o=Object.keys(t)).length;n<i;n+=1)e[r=o[n]]=t[r];return e}};function i(e,t){var n="",i=e.reason||"(unknown reason)";return e.mark?(e.mark.name&&(n+='in "'+e.mark.name+'" '),n+="("+(e.mark.line+1)+":"+(e.mark.column+1)+")",!t&&e.mark.snippet&&(n+="\n\n"+e.mark.snippet),i+" "+n):i}function r(e,t){Error.call(this),this.name="YAMLException",this.reason=e,this.mark=t,this.message=i(this,!1),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack||""}r.prototype=Object.create(Error.prototype),r.prototype.constructor=r,r.prototype.toString=function(e){return this.name+": "+i(this,e)};var o=r;function a(e,t,n,i,r){var o="",a="",l=Math.floor(r/2)-1;return i-t>l&&(t=i-l+(o=" ... ").length),n-i>l&&(n=i+l-(a=" ...").length),{str:o+e.slice(t,n).replace(/\t/g,"鈫�")+a,pos:i-t+o.length}}function l(e,t){return n.repeat(" ",t-e.length)+e}var c=function(e,t){if(t=Object.create(t||null),!e.buffer)return null;t.maxLength||(t.maxLength=79),"number"!=typeof t.indent&&(t.indent=1),"number"!=typeof t.linesBefore&&(t.linesBefore=3),"number"!=typeof t.linesAfter&&(t.linesAfter=2);for(var i,r=/\r?\n|\r|\0/g,o=[0],c=[],s=-1;i=r.exec(e.buffer);)c.push(i.index),o.push(i.index+i[0].length),e.position<=i.index&&s<0&&(s=o.length-2);s<0&&(s=o.length-1);var u,p,f="",d=Math.min(e.line+t.linesAfter,c.length).toString().length,h=t.maxLength-(t.indent+d+3);for(u=1;u<=t.linesBefore&&!(s-u<0);u++)p=a(e.buffer,o[s-u],c[s-u],e.position-(o[s]-o[s-u]),h),f=n.repeat(" ",t.indent)+l((e.line-u+1).toString(),d)+" | "+p.str+"\n"+f;for(p=a(e.buffer,o[s],c[s],e.position,h),f+=n.repeat(" ",t.indent)+l((e.line+1).toString(),d)+" | "+p.str+"\n",f+=n.repeat("-",t.indent+d+3+p.pos)+"^\n",u=1;u<=t.linesAfter&&!(s+u>=c.length);u++)p=a(e.buffer,o[s+u],c[s+u],e.position-(o[s]-o[s+u]),h),f+=n.repeat(" ",t.indent)+l((e.line+u+1).toString(),d)+" | "+p.str+"\n";return f.replace(/\n$/,"")},s=["kind","multi","resolve","construct","instanceOf","predicate","represent","representName","defaultStyle","styleAliases"],u=["scalar","sequence","mapping"];var p=function(e,t){if(t=t||{},Object.keys(t).forEach((function(t){if(-1===s.indexOf(t))throw new o('Unknown option "'+t+'" is met in definition of "'+e+'" YAML type.')})),this.tag=e,this.kind=t.kind||null,this.resolve=t.resolve||function(){return!0},this.construct=t.construct||function(e){return e},this.instanceOf=t.instanceOf||null,this.predicate=t.predicate||null,this.represent=t.represent||null,this.representName=t.representName||null,this.defaultStyle=t.defaultStyle||null,this.multi=t.multi||!1,this.styleAliases=function(e){var t={};return null!==e&&Object.keys(e).forEach((function(n){e[n].forEach((function(e){t[String(e)]=n}))})),t}(t.styleAliases||null),-1===u.indexOf(this.kind))throw new o('Unknown kind "'+this.kind+'" is specified for "'+e+'" YAML type.')};function f(e,t,n){var i=[];return e[t].forEach((function(e){n.forEach((function(t,n){t.tag===e.tag&&t.kind===e.kind&&t.multi===e.multi&&i.push(n)})),n.push(e)})),n.filter((function(e,t){return-1===i.indexOf(t)}))}function d(e){return this.extend(e)}d.prototype.extend=function(e){var t=[],n=[];if(e instanceof p)n.push(e);else if(Array.isArray(e))n=n.concat(e);else{if(!e||!Array.isArray(e.implicit)&&!Array.isArray(e.explicit))throw new o("Schema.extend argument should be a Type, [ Type ], or a schema definition ({ implicit: [...], explicit: [...] })");e.implicit&&(t=t.concat(e.implicit)),e.explicit&&(n=n.concat(e.explicit))}t.forEach((function(e){if(!(e instanceof p))throw new o("Specified list of YAML types (or a single Type object) contains a non-Type object.");if(e.loadKind&&"scalar"!==e.loadKind)throw new o("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.");if(e.multi)throw new o("There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.")})),n.forEach((function(e){if(!(e instanceof p))throw new o("Specified list of YAML types (or a single Type object) contains a non-Type object.")}));var i=Object.create(d.prototype);return i.implicit=(this.implicit||[]).concat(t),i.explicit=(this.explicit||[]).concat(n),i.compiledImplicit=f(i,"implicit",[]),i.compiledExplicit=f(i,"explicit",[]),i.compiledTypeMap=function(){var e,t,n={scalar:{},sequence:{},mapping:{},fallback:{},multi:{scalar:[],sequence:[],mapping:[],fallback:[]}};function i(e){e.multi?(n.multi[e.kind].push(e),n.multi.fallback.push(e)):n[e.kind][e.tag]=n.fallback[e.tag]=e}for(e=0,t=arguments.length;e<t;e+=1)arguments[e].forEach(i);return n}(i.compiledImplicit,i.compiledExplicit),i};var h=d,g=new h({explicit:[new p("tag:yaml.org,2002:str",{kind:"scalar",construct:function(e){return null!==e?e:""}}),new p("tag:yaml.org,2002:seq",{kind:"sequence",construct:function(e){return null!==e?e:[]}}),new p("tag:yaml.org,2002:map",{kind:"mapping",construct:function(e){return null!==e?e:{}}})]});var m=new p("tag:yaml.org,2002:null",{kind:"scalar",resolve:function(e){if(null===e)return!0;var t=e.length;return 1===t&&"~"===e||4===t&&("null"===e||"Null"===e||"NULL"===e)},construct:function(){return null},predicate:function(e){return null===e},represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"},empty:function(){return""}},defaultStyle:"lowercase"});var y=new p("tag:yaml.org,2002:bool",{kind:"scalar",resolve:function(e){if(null===e)return!1;var t=e.length;return 4===t&&("true"===e||"True"===e||"TRUE"===e)||5===t&&("false"===e||"False"===e||"FALSE"===e)},construct:function(e){return"true"===e||"True"===e||"TRUE"===e},predicate:function(e){return"[object Boolean]"===Object.prototype.toString.call(e)},represent:{lowercase:function(e){return e?"true":"false"},uppercase:function(e){return e?"TRUE":"FALSE"},camelcase:function(e){return e?"True":"False"}},defaultStyle:"lowercase"});function b(e){return 48<=e&&e<=55}function A(e){return 48<=e&&e<=57}var v=new p("tag:yaml.org,2002:int",{kind:"scalar",resolve:function(e){if(null===e)return!1;var t,n,i=e.length,r=0,o=!1;if(!i)return!1;if("-"!==(t=e[r])&&"+"!==t||(t=e[++r]),"0"===t){if(r+1===i)return!0;if("b"===(t=e[++r])){for(r++;r<i;r++)if("_"!==(t=e[r])){if("0"!==t&&"1"!==t)return!1;o=!0}return o&&"_"!==t}if("x"===t){for(r++;r<i;r++)if("_"!==(t=e[r])){if(!(48<=(n=e.charCodeAt(r))&&n<=57||65<=n&&n<=70||97<=n&&n<=102))return!1;o=!0}return o&&"_"!==t}if("o"===t){for(r++;r<i;r++)if("_"!==(t=e[r])){if(!b(e.charCodeAt(r)))return!1;o=!0}return o&&"_"!==t}}if("_"===t)return!1;for(;r<i;r++)if("_"!==(t=e[r])){if(!A(e.charCodeAt(r)))return!1;o=!0}return!(!o||"_"===t)},construct:function(e){var t,n=e,i=1;if(-1!==n.indexOf("_")&&(n=n.replace(/_/g,"")),"-"!==(t=n[0])&&"+"!==t||("-"===t&&(i=-1),t=(n=n.slice(1))[0]),"0"===n)return 0;if("0"===t){if("b"===n[1])return i*parseInt(n.slice(2),2);if("x"===n[1])return i*parseInt(n.slice(2),16);if("o"===n[1])return i*parseInt(n.slice(2),8)}return i*parseInt(n,10)},predicate:function(e){return"[object Number]"===Object.prototype.toString.call(e)&&e%1==0&&!n.isNegativeZero(e)},represent:{binary:function(e){return e>=0?"0b"+e.toString(2):"-0b"+e.toString(2).slice(1)},octal:function(e){return e>=0?"0o"+e.toString(8):"-0o"+e.toString(8).slice(1)},decimal:function(e){return e.toString(10)},hexadecimal:function(e){return e>=0?"0x"+e.toString(16).toUpperCase():"-0x"+e.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}}),w=new RegExp("^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");var k=/^[-+]?[0-9]+e/;var C=new p("tag:yaml.org,2002:float",{kind:"scalar",resolve:function(e){return null!==e&&!(!w.test(e)||"_"===e[e.length-1])},construct:function(e){var t,n;return n="-"===(t=e.replace(/_/g,"").toLowerCase())[0]?-1:1,"+-".indexOf(t[0])>=0&&(t=t.slice(1)),".inf"===t?1===n?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:".nan"===t?NaN:n*parseFloat(t,10)},predicate:function(e){return"[object Number]"===Object.prototype.toString.call(e)&&(e%1!=0||n.isNegativeZero(e))},represent:function(e,t){var i;if(isNaN(e))switch(t){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===e)switch(t){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===e)switch(t){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(n.isNegativeZero(e))return"-0.0";return i=e.toString(10),k.test(i)?i.replace("e",".e"):i},defaultStyle:"lowercase"}),x=g.extend({implicit:[m,y,v,C]}),I=x,S=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),O=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");var j=new p("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:function(e){return null!==e&&(null!==S.exec(e)||null!==O.exec(e))},construct:function(e){var t,n,i,r,o,a,l,c,s=0,u=null;if(null===(t=S.exec(e))&&(t=O.exec(e)),null===t)throw new Error("Date resolve error");if(n=+t[1],i=+t[2]-1,r=+t[3],!t[4])return new Date(Date.UTC(n,i,r));if(o=+t[4],a=+t[5],l=+t[6],t[7]){for(s=t[7].slice(0,3);s.length<3;)s+="0";s=+s}return t[9]&&(u=6e4*(60*+t[10]+ +(t[11]||0)),"-"===t[9]&&(u=-u)),c=new Date(Date.UTC(n,i,r,o,a,l,s)),u&&c.setTime(c.getTime()-u),c},instanceOf:Date,represent:function(e){return e.toISOString()}});var T=new p("tag:yaml.org,2002:merge",{kind:"scalar",resolve:function(e){return"<<"===e||null===e}}),N="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r";var F=new p("tag:yaml.org,2002:binary",{kind:"scalar",resolve:function(e){if(null===e)return!1;var t,n,i=0,r=e.length,o=N;for(n=0;n<r;n++)if(!((t=o.indexOf(e.charAt(n)))>64)){if(t<0)return!1;i+=6}return i%8==0},construct:function(e){var t,n,i=e.replace(/[\r\n=]/g,""),r=i.length,o=N,a=0,l=[];for(t=0;t<r;t++)t%4==0&&t&&(l.push(a>>16&255),l.push(a>>8&255),l.push(255&a)),a=a<<6|o.indexOf(i.charAt(t));return 0===(n=r%4*6)?(l.push(a>>16&255),l.push(a>>8&255),l.push(255&a)):18===n?(l.push(a>>10&255),l.push(a>>2&255)):12===n&&l.push(a>>4&255),new Uint8Array(l)},predicate:function(e){return"[object Uint8Array]"===Object.prototype.toString.call(e)},represent:function(e){var t,n,i="",r=0,o=e.length,a=N;for(t=0;t<o;t++)t%3==0&&t&&(i+=a[r>>18&63],i+=a[r>>12&63],i+=a[r>>6&63],i+=a[63&r]),r=(r<<8)+e[t];return 0===(n=o%3)?(i+=a[r>>18&63],i+=a[r>>12&63],i+=a[r>>6&63],i+=a[63&r]):2===n?(i+=a[r>>10&63],i+=a[r>>4&63],i+=a[r<<2&63],i+=a[64]):1===n&&(i+=a[r>>2&63],i+=a[r<<4&63],i+=a[64],i+=a[64]),i}}),E=Object.prototype.hasOwnProperty,M=Object.prototype.toString;var L=new p("tag:yaml.org,2002:omap",{kind:"sequence",resolve:function(e){if(null===e)return!0;var t,n,i,r,o,a=[],l=e;for(t=0,n=l.length;t<n;t+=1){if(i=l[t],o=!1,"[object Object]"!==M.call(i))return!1;for(r in i)if(E.call(i,r)){if(o)return!1;o=!0}if(!o)return!1;if(-1!==a.indexOf(r))return!1;a.push(r)}return!0},construct:function(e){return null!==e?e:[]}}),_=Object.prototype.toString;var D=new p("tag:yaml.org,2002:pairs",{kind:"sequence",resolve:function(e){if(null===e)return!0;var t,n,i,r,o,a=e;for(o=new Array(a.length),t=0,n=a.length;t<n;t+=1){if(i=a[t],"[object Object]"!==_.call(i))return!1;if(1!==(r=Object.keys(i)).length)return!1;o[t]=[r[0],i[r[0]]]}return!0},construct:function(e){if(null===e)return[];var t,n,i,r,o,a=e;for(o=new Array(a.length),t=0,n=a.length;t<n;t+=1)i=a[t],r=Object.keys(i),o[t]=[r[0],i[r[0]]];return o}}),U=Object.prototype.hasOwnProperty;var Y=new p("tag:yaml.org,2002:set",{kind:"mapping",resolve:function(e){if(null===e)return!0;var t,n=e;for(t in n)if(U.call(n,t)&&null!==n[t])return!1;return!0},construct:function(e){return null!==e?e:{}}}),q=I.extend({implicit:[j,T],explicit:[F,L,D,Y]}),R=Object.prototype.hasOwnProperty,B=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,K=/[\x85\u2028\u2029]/,P=/[,\[\]\{\}]/,W=/^(?:!|!!|![a-z\-]+!)$/i,H=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;function $(e){return Object.prototype.toString.call(e)}function G(e){return 10===e||13===e}function V(e){return 9===e||32===e}function Z(e){return 9===e||32===e||10===e||13===e}function J(e){return 44===e||91===e||93===e||123===e||125===e}function Q(e){var t;return 48<=e&&e<=57?e-48:97<=(t=32|e)&&t<=102?t-97+10:-1}function z(e){return 48===e?"\0":97===e?"":98===e?"\b":116===e||9===e?"\t":110===e?"\n":118===e?"\v":102===e?"\f":114===e?"\r":101===e?"":32===e?" ":34===e?'"':47===e?"/":92===e?"\\":78===e?"聟":95===e?"聽":76===e?"\u2028":80===e?"\u2029":""}function X(e){return e<=65535?String.fromCharCode(e):String.fromCharCode(55296+(e-65536>>10),56320+(e-65536&1023))}for(var ee=new Array(256),te=new Array(256),ne=0;ne<256;ne++)ee[ne]=z(ne)?1:0,te[ne]=z(ne);function ie(e,t){this.input=e,this.filename=t.filename||null,this.schema=t.schema||q,this.onWarning=t.onWarning||null,this.legacy=t.legacy||!1,this.json=t.json||!1,this.listener=t.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=e.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.firstTabInLine=-1,this.documents=[]}function re(e,t){var n={name:e.filename,buffer:e.input.slice(0,-1),position:e.position,line:e.line,column:e.position-e.lineStart};return n.snippet=c(n),new o(t,n)}function oe(e,t){throw re(e,t)}function ae(e,t){e.onWarning&&e.onWarning.call(null,re(e,t))}var le={YAML:function(e,t,n){var i,r,o;null!==e.version&&oe(e,"duplication of %YAML directive"),1!==n.length&&oe(e,"YAML directive accepts exactly one argument"),null===(i=/^([0-9]+)\.([0-9]+)$/.exec(n[0]))&&oe(e,"ill-formed argument of the YAML directive"),r=parseInt(i[1],10),o=parseInt(i[2],10),1!==r&&oe(e,"unacceptable YAML version of the document"),e.version=n[0],e.checkLineBreaks=o<2,1!==o&&2!==o&&ae(e,"unsupported YAML version of the document")},TAG:function(e,t,n){var i,r;2!==n.length&&oe(e,"TAG directive accepts exactly two arguments"),i=n[0],r=n[1],W.test(i)||oe(e,"ill-formed tag handle (first argument) of the TAG directive"),R.call(e.tagMap,i)&&oe(e,'there is a previously declared suffix for "'+i+'" tag handle'),H.test(r)||oe(e,"ill-formed tag prefix (second argument) of the TAG directive");try{r=decodeURIComponent(r)}catch(t){oe(e,"tag prefix is malformed: "+r)}e.tagMap[i]=r}};function ce(e,t,n,i){var r,o,a,l;if(t<n){if(l=e.input.slice(t,n),i)for(r=0,o=l.length;r<o;r+=1)9===(a=l.charCodeAt(r))||32<=a&&a<=1114111||oe(e,"expected valid JSON character");else B.test(l)&&oe(e,"the stream contains non-printable characters");e.result+=l}}function se(e,t,i,r){var o,a,l,c;for(n.isObject(i)||oe(e,"cannot merge mappings; the provided source object is unacceptable"),l=0,c=(o=Object.keys(i)).length;l<c;l+=1)a=o[l],R.call(t,a)||(t[a]=i[a],r[a]=!0)}function ue(e,t,n,i,r,o,a,l,c){var s,u;if(Array.isArray(r))for(s=0,u=(r=Array.prototype.slice.call(r)).length;s<u;s+=1)Array.isArray(r[s])&&oe(e,"nested arrays are not supported inside keys"),"object"==typeof r&&"[object Object]"===$(r[s])&&(r[s]="[object Object]");if("object"==typeof r&&"[object Object]"===$(r)&&(r="[object Object]"),r=String(r),null===t&&(t={}),"tag:yaml.org,2002:merge"===i)if(Array.isArray(o))for(s=0,u=o.length;s<u;s+=1)se(e,t,o[s],n);else se(e,t,o,n);else e.json||R.call(n,r)||!R.call(t,r)||(e.line=a||e.line,e.lineStart=l||e.lineStart,e.position=c||e.position,oe(e,"duplicated mapping key")),"__proto__"===r?Object.defineProperty(t,r,{configurable:!0,enumerable:!0,writable:!0,value:o}):t[r]=o,delete n[r];return t}function pe(e){var t;10===(t=e.input.charCodeAt(e.position))?e.position++:13===t?(e.position++,10===e.input.charCodeAt(e.position)&&e.position++):oe(e,"a line break is expected"),e.line+=1,e.lineStart=e.position,e.firstTabInLine=-1}function fe(e,t,n){for(var i=0,r=e.input.charCodeAt(e.position);0!==r;){for(;V(r);)9===r&&-1===e.firstTabInLine&&(e.firstTabInLine=e.position),r=e.input.charCodeAt(++e.position);if(t&&35===r)do{r=e.input.charCodeAt(++e.position)}while(10!==r&&13!==r&&0!==r);if(!G(r))break;for(pe(e),r=e.input.charCodeAt(e.position),i++,e.lineIndent=0;32===r;)e.lineIndent++,r=e.input.charCodeAt(++e.position)}return-1!==n&&0!==i&&e.lineIndent<n&&ae(e,"deficient indentation"),i}function de(e){var t,n=e.position;return!(45!==(t=e.input.charCodeAt(n))&&46!==t||t!==e.input.charCodeAt(n+1)||t!==e.input.charCodeAt(n+2)||(n+=3,0!==(t=e.input.charCodeAt(n))&&!Z(t)))}function he(e,t){1===t?e.result+=" ":t>1&&(e.result+=n.repeat("\n",t-1))}function ge(e,t){var n,i,r=e.tag,o=e.anchor,a=[],l=!1;if(-1!==e.firstTabInLine)return!1;for(null!==e.anchor&&(e.anchorMap[e.anchor]=a),i=e.input.charCodeAt(e.position);0!==i&&(-1!==e.firstTabInLine&&(e.position=e.firstTabInLine,oe(e,"tab characters must not be used in indentation")),45===i)&&Z(e.input.charCodeAt(e.position+1));)if(l=!0,e.position++,fe(e,!0,-1)&&e.lineIndent<=t)a.push(null),i=e.input.charCodeAt(e.position);else if(n=e.line,be(e,t,3,!1,!0),a.push(e.result),fe(e,!0,-1),i=e.input.charCodeAt(e.position),(e.line===n||e.lineIndent>t)&&0!==i)oe(e,"bad indentation of a sequence entry");else if(e.lineIndent<t)break;return!!l&&(e.tag=r,e.anchor=o,e.kind="sequence",e.result=a,!0)}function me(e){var t,n,i,r,o=!1,a=!1;if(33!==(r=e.input.charCodeAt(e.position)))return!1;if(null!==e.tag&&oe(e,"duplication of a tag property"),60===(r=e.input.charCodeAt(++e.position))?(o=!0,r=e.input.charCodeAt(++e.position)):33===r?(a=!0,n="!!",r=e.input.charCodeAt(++e.position)):n="!",t=e.position,o){do{r=e.input.charCodeAt(++e.position)}while(0!==r&&62!==r);e.position<e.length?(i=e.input.slice(t,e.position),r=e.input.charCodeAt(++e.position)):oe(e,"unexpected end of the stream within a verbatim tag")}else{for(;0!==r&&!Z(r);)33===r&&(a?oe(e,"tag suffix cannot contain exclamation marks"):(n=e.input.slice(t-1,e.position+1),W.test(n)||oe(e,"named tag handle cannot contain such characters"),a=!0,t=e.position+1)),r=e.input.charCodeAt(++e.position);i=e.input.slice(t,e.position),P.test(i)&&oe(e,"tag suffix cannot contain flow indicator characters")}i&&!H.test(i)&&oe(e,"tag name cannot contain such characters: "+i);try{i=decodeURIComponent(i)}catch(t){oe(e,"tag name is malformed: "+i)}return o?e.tag=i:R.call(e.tagMap,n)?e.tag=e.tagMap[n]+i:"!"===n?e.tag="!"+i:"!!"===n?e.tag="tag:yaml.org,2002:"+i:oe(e,'undeclared tag handle "'+n+'"'),!0}function ye(e){var t,n;if(38!==(n=e.input.charCodeAt(e.position)))return!1;for(null!==e.anchor&&oe(e,"duplication of an anchor property"),n=e.input.charCodeAt(++e.position),t=e.position;0!==n&&!Z(n)&&!J(n);)n=e.input.charCodeAt(++e.position);return e.position===t&&oe(e,"name of an anchor node must contain at least one character"),e.anchor=e.input.slice(t,e.position),!0}function be(e,t,i,r,o){var a,l,c,s,u,p,f,d,h,g=1,m=!1,y=!1;if(null!==e.listener&&e.listener("open",e),e.tag=null,e.anchor=null,e.kind=null,e.result=null,a=l=c=4===i||3===i,r&&fe(e,!0,-1)&&(m=!0,e.lineIndent>t?g=1:e.lineIndent===t?g=0:e.lineIndent<t&&(g=-1)),1===g)for(;me(e)||ye(e);)fe(e,!0,-1)?(m=!0,c=a,e.lineIndent>t?g=1:e.lineIndent===t?g=0:e.lineIndent<t&&(g=-1)):c=!1;if(c&&(c=m||o),1!==g&&4!==i||(d=1===i||2===i?t:t+1,h=e.position-e.lineStart,1===g?c&&(ge(e,h)||function(e,t,n){var i,r,o,a,l,c,s,u=e.tag,p=e.anchor,f={},d=Object.create(null),h=null,g=null,m=null,y=!1,b=!1;if(-1!==e.firstTabInLine)return!1;for(null!==e.anchor&&(e.anchorMap[e.anchor]=f),s=e.input.charCodeAt(e.position);0!==s;){if(y||-1===e.firstTabInLine||(e.position=e.firstTabInLine,oe(e,"tab characters must not be used in indentation")),i=e.input.charCodeAt(e.position+1),o=e.line,63!==s&&58!==s||!Z(i)){if(a=e.line,l=e.lineStart,c=e.position,!be(e,n,2,!1,!0))break;if(e.line===o){for(s=e.input.charCodeAt(e.position);V(s);)s=e.input.charCodeAt(++e.position);if(58===s)Z(s=e.input.charCodeAt(++e.position))||oe(e,"a whitespace character is expected after the key-value separator within a block mapping"),y&&(ue(e,f,d,h,g,null,a,l,c),h=g=m=null),b=!0,y=!1,r=!1,h=e.tag,g=e.result;else{if(!b)return e.tag=u,e.anchor=p,!0;oe(e,"can not read an implicit mapping pair; a colon is missed")}}else{if(!b)return e.tag=u,e.anchor=p,!0;oe(e,"can not read a block mapping entry; a multiline key may not be an implicit key")}}else 63===s?(y&&(ue(e,f,d,h,g,null,a,l,c),h=g=m=null),b=!0,y=!0,r=!0):y?(y=!1,r=!0):oe(e,"incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line"),e.position+=1,s=i;if((e.line===o||e.lineIndent>t)&&(y&&(a=e.line,l=e.lineStart,c=e.position),be(e,t,4,!0,r)&&(y?g=e.result:m=e.result),y||(ue(e,f,d,h,g,m,a,l,c),h=g=m=null),fe(e,!0,-1),s=e.input.charCodeAt(e.position)),(e.line===o||e.lineIndent>t)&&0!==s)oe(e,"bad indentation of a mapping entry");else if(e.lineIndent<t)break}return y&&ue(e,f,d,h,g,null,a,l,c),b&&(e.tag=u,e.anchor=p,e.kind="mapping",e.result=f),b}(e,h,d))||function(e,t){var n,i,r,o,a,l,c,s,u,p,f,d,h=!0,g=e.tag,m=e.anchor,y=Object.create(null);if(91===(d=e.input.charCodeAt(e.position)))a=93,s=!1,o=[];else{if(123!==d)return!1;a=125,s=!0,o={}}for(null!==e.anchor&&(e.anchorMap[e.anchor]=o),d=e.input.charCodeAt(++e.position);0!==d;){if(fe(e,!0,t),(d=e.input.charCodeAt(e.position))===a)return e.position++,e.tag=g,e.anchor=m,e.kind=s?"mapping":"sequence",e.result=o,!0;h?44===d&&oe(e,"expected the node content, but found ','"):oe(e,"missed comma between flow collection entries"),f=null,l=c=!1,63===d&&Z(e.input.charCodeAt(e.position+1))&&(l=c=!0,e.position++,fe(e,!0,t)),n=e.line,i=e.lineStart,r=e.position,be(e,t,1,!1,!0),p=e.tag,u=e.result,fe(e,!0,t),d=e.input.charCodeAt(e.position),!c&&e.line!==n||58!==d||(l=!0,d=e.input.charCodeAt(++e.position),fe(e,!0,t),be(e,t,1,!1,!0),f=e.result),s?ue(e,o,y,p,u,f,n,i,r):l?o.push(ue(e,null,y,p,u,f,n,i,r)):o.push(u),fe(e,!0,t),44===(d=e.input.charCodeAt(e.position))?(h=!0,d=e.input.charCodeAt(++e.position)):h=!1}oe(e,"unexpected end of the stream within a flow collection")}(e,d)?y=!0:(l&&function(e,t){var i,r,o,a,l,c=1,s=!1,u=!1,p=t,f=0,d=!1;if(124===(a=e.input.charCodeAt(e.position)))r=!1;else{if(62!==a)return!1;r=!0}for(e.kind="scalar",e.result="";0!==a;)if(43===(a=e.input.charCodeAt(++e.position))||45===a)1===c?c=43===a?3:2:oe(e,"repeat of a chomping mode identifier");else{if(!((o=48<=(l=a)&&l<=57?l-48:-1)>=0))break;0===o?oe(e,"bad explicit indentation width of a block scalar; it cannot be less than one"):u?oe(e,"repeat of an indentation width identifier"):(p=t+o-1,u=!0)}if(V(a)){do{a=e.input.charCodeAt(++e.position)}while(V(a));if(35===a)do{a=e.input.charCodeAt(++e.position)}while(!G(a)&&0!==a)}for(;0!==a;){for(pe(e),e.lineIndent=0,a=e.input.charCodeAt(e.position);(!u||e.lineIndent<p)&&32===a;)e.lineIndent++,a=e.input.charCodeAt(++e.position);if(!u&&e.lineIndent>p&&(p=e.lineIndent),G(a))f++;else{if(e.lineIndent<p){3===c?e.result+=n.repeat("\n",s?1+f:f):1===c&&s&&(e.result+="\n");break}for(r?V(a)?(d=!0,e.result+=n.repeat("\n",s?1+f:f)):d?(d=!1,e.result+=n.repeat("\n",f+1)):0===f?s&&(e.result+=" "):e.result+=n.repeat("\n",f):e.result+=n.repeat("\n",s?1+f:f),s=!0,u=!0,f=0,i=e.position;!G(a)&&0!==a;)a=e.input.charCodeAt(++e.position);ce(e,i,e.position,!1)}}return!0}(e,d)||function(e,t){var n,i,r;if(39!==(n=e.input.charCodeAt(e.position)))return!1;for(e.kind="scalar",e.result="",e.position++,i=r=e.position;0!==(n=e.input.charCodeAt(e.position));)if(39===n){if(ce(e,i,e.position,!0),39!==(n=e.input.charCodeAt(++e.position)))return!0;i=e.position,e.position++,r=e.position}else G(n)?(ce(e,i,r,!0),he(e,fe(e,!1,t)),i=r=e.position):e.position===e.lineStart&&de(e)?oe(e,"unexpected end of the document within a single quoted scalar"):(e.position++,r=e.position);oe(e,"unexpected end of the stream within a single quoted scalar")}(e,d)||function(e,t){var n,i,r,o,a,l,c;if(34!==(l=e.input.charCodeAt(e.position)))return!1;for(e.kind="scalar",e.result="",e.position++,n=i=e.position;0!==(l=e.input.charCodeAt(e.position));){if(34===l)return ce(e,n,e.position,!0),e.position++,!0;if(92===l){if(ce(e,n,e.position,!0),G(l=e.input.charCodeAt(++e.position)))fe(e,!1,t);else if(l<256&&ee[l])e.result+=te[l],e.position++;else if((a=120===(c=l)?2:117===c?4:85===c?8:0)>0){for(r=a,o=0;r>0;r--)(a=Q(l=e.input.charCodeAt(++e.position)))>=0?o=(o<<4)+a:oe(e,"expected hexadecimal character");e.result+=X(o),e.position++}else oe(e,"unknown escape sequence");n=i=e.position}else G(l)?(ce(e,n,i,!0),he(e,fe(e,!1,t)),n=i=e.position):e.position===e.lineStart&&de(e)?oe(e,"unexpected end of the document within a double quoted scalar"):(e.position++,i=e.position)}oe(e,"unexpected end of the stream within a double quoted scalar")}(e,d)?y=!0:!function(e){var t,n,i;if(42!==(i=e.input.charCodeAt(e.position)))return!1;for(i=e.input.charCodeAt(++e.position),t=e.position;0!==i&&!Z(i)&&!J(i);)i=e.input.charCodeAt(++e.position);return e.position===t&&oe(e,"name of an alias node must contain at least one character"),n=e.input.slice(t,e.position),R.call(e.anchorMap,n)||oe(e,'unidentified alias "'+n+'"'),e.result=e.anchorMap[n],fe(e,!0,-1),!0}(e)?function(e,t,n){var i,r,o,a,l,c,s,u,p=e.kind,f=e.result;if(Z(u=e.input.charCodeAt(e.position))||J(u)||35===u||38===u||42===u||33===u||124===u||62===u||39===u||34===u||37===u||64===u||96===u)return!1;if((63===u||45===u)&&(Z(i=e.input.charCodeAt(e.position+1))||n&&J(i)))return!1;for(e.kind="scalar",e.result="",r=o=e.position,a=!1;0!==u;){if(58===u){if(Z(i=e.input.charCodeAt(e.position+1))||n&&J(i))break}else if(35===u){if(Z(e.input.charCodeAt(e.position-1)))break}else{if(e.position===e.lineStart&&de(e)||n&&J(u))break;if(G(u)){if(l=e.line,c=e.lineStart,s=e.lineIndent,fe(e,!1,-1),e.lineIndent>=t){a=!0,u=e.input.charCodeAt(e.position);continue}e.position=o,e.line=l,e.lineStart=c,e.lineIndent=s;break}}a&&(ce(e,r,o,!1),he(e,e.line-l),r=o=e.position,a=!1),V(u)||(o=e.position+1),u=e.input.charCodeAt(++e.position)}return ce(e,r,o,!1),!!e.result||(e.kind=p,e.result=f,!1)}(e,d,1===i)&&(y=!0,null===e.tag&&(e.tag="?")):(y=!0,null===e.tag&&null===e.anchor||oe(e,"alias node should not have any properties")),null!==e.anchor&&(e.anchorMap[e.anchor]=e.result)):0===g&&(y=c&&ge(e,h))),null===e.tag)null!==e.anchor&&(e.anchorMap[e.anchor]=e.result);else if("?"===e.tag){for(null!==e.result&&"scalar"!==e.kind&&oe(e,'unacceptable node kind for !<?> tag; it should be "scalar", not "'+e.kind+'"'),s=0,u=e.implicitTypes.length;s<u;s+=1)if((f=e.implicitTypes[s]).resolve(e.result)){e.result=f.construct(e.result),e.tag=f.tag,null!==e.anchor&&(e.anchorMap[e.anchor]=e.result);break}}else if("!"!==e.tag){if(R.call(e.typeMap[e.kind||"fallback"],e.tag))f=e.typeMap[e.kind||"fallback"][e.tag];else for(f=null,s=0,u=(p=e.typeMap.multi[e.kind||"fallback"]).length;s<u;s+=1)if(e.tag.slice(0,p[s].tag.length)===p[s].tag){f=p[s];break}f||oe(e,"unknown tag !<"+e.tag+">"),null!==e.result&&f.kind!==e.kind&&oe(e,"unacceptable node kind for !<"+e.tag+'> tag; it should be "'+f.kind+'", not "'+e.kind+'"'),f.resolve(e.result,e.tag)?(e.result=f.construct(e.result,e.tag),null!==e.anchor&&(e.anchorMap[e.anchor]=e.result)):oe(e,"cannot resolve a node with !<"+e.tag+"> explicit tag")}return null!==e.listener&&e.listener("close",e),null!==e.tag||null!==e.anchor||y}function Ae(e){var t,n,i,r,o=e.position,a=!1;for(e.version=null,e.checkLineBreaks=e.legacy,e.tagMap=Object.create(null),e.anchorMap=Object.create(null);0!==(r=e.input.charCodeAt(e.position))&&(fe(e,!0,-1),r=e.input.charCodeAt(e.position),!(e.lineIndent>0||37!==r));){for(a=!0,r=e.input.charCodeAt(++e.position),t=e.position;0!==r&&!Z(r);)r=e.input.charCodeAt(++e.position);for(i=[],(n=e.input.slice(t,e.position)).length<1&&oe(e,"directive name must not be less than one character in length");0!==r;){for(;V(r);)r=e.input.charCodeAt(++e.position);if(35===r){do{r=e.input.charCodeAt(++e.position)}while(0!==r&&!G(r));break}if(G(r))break;for(t=e.position;0!==r&&!Z(r);)r=e.input.charCodeAt(++e.position);i.push(e.input.slice(t,e.position))}0!==r&&pe(e),R.call(le,n)?le[n](e,n,i):ae(e,'unknown document directive "'+n+'"')}fe(e,!0,-1),0===e.lineIndent&&45===e.input.charCodeAt(e.position)&&45===e.input.charCodeAt(e.position+1)&&45===e.input.charCodeAt(e.position+2)?(e.position+=3,fe(e,!0,-1)):a&&oe(e,"directives end mark is expected"),be(e,e.lineIndent-1,4,!1,!0),fe(e,!0,-1),e.checkLineBreaks&&K.test(e.input.slice(o,e.position))&&ae(e,"non-ASCII line breaks are interpreted as content"),e.documents.push(e.result),e.position===e.lineStart&&de(e)?46===e.input.charCodeAt(e.position)&&(e.position+=3,fe(e,!0,-1)):e.position<e.length-1&&oe(e,"end of the stream or a document separator is expected")}function ve(e,t){t=t||{},0!==(e=String(e)).length&&(10!==e.charCodeAt(e.length-1)&&13!==e.charCodeAt(e.length-1)&&(e+="\n"),65279===e.charCodeAt(0)&&(e=e.slice(1)));var n=new ie(e,t),i=e.indexOf("\0");for(-1!==i&&(n.position=i,oe(n,"null byte is not allowed in input")),n.input+="\0";32===n.input.charCodeAt(n.position);)n.lineIndent+=1,n.position+=1;for(;n.position<n.length-1;)Ae(n);return n.documents}var we={loadAll:function(e,t,n){null!==t&&"object"==typeof t&&void 0===n&&(n=t,t=null);var i=ve(e,n);if("function"!=typeof t)return i;for(var r=0,o=i.length;r<o;r+=1)t(i[r])},load:function(e,t){var n=ve(e,t);if(0!==n.length){if(1===n.length)return n[0];throw new o("expected a single document in the stream, but found more")}}},ke=Object.prototype.toString,Ce=Object.prototype.hasOwnProperty,xe=65279,Ie={0:"\\0",7:"\\a",8:"\\b",9:"\\t",10:"\\n",11:"\\v",12:"\\f",13:"\\r",27:"\\e",34:'\\"',92:"\\\\",133:"\\N",160:"\\_",8232:"\\L",8233:"\\P"},Se=["y","Y","yes","Yes","YES","on","On","ON","n","N","no","No","NO","off","Off","OFF"],Oe=/^[-+]?[0-9_]+(?::[0-9_]+)+(?:\.[0-9_]*)?$/;function je(e){var t,i,r;if(t=e.toString(16).toUpperCase(),e<=255)i="x",r=2;else if(e<=65535)i="u",r=4;else{if(!(e<=4294967295))throw new o("code point within a string may not be greater than 0xFFFFFFFF");i="U",r=8}return"\\"+i+n.repeat("0",r-t.length)+t}function Te(e){this.schema=e.schema||q,this.indent=Math.max(1,e.indent||2),this.noArrayIndent=e.noArrayIndent||!1,this.skipInvalid=e.skipInvalid||!1,this.flowLevel=n.isNothing(e.flowLevel)?-1:e.flowLevel,this.styleMap=function(e,t){var n,i,r,o,a,l,c;if(null===t)return{};for(n={},r=0,o=(i=Object.keys(t)).length;r<o;r+=1)a=i[r],l=String(t[a]),"!!"===a.slice(0,2)&&(a="tag:yaml.org,2002:"+a.slice(2)),(c=e.compiledTypeMap.fallback[a])&&Ce.call(c.styleAliases,l)&&(l=c.styleAliases[l]),n[a]=l;return n}(this.schema,e.styles||null),this.sortKeys=e.sortKeys||!1,this.lineWidth=e.lineWidth||80,this.noRefs=e.noRefs||!1,this.noCompatMode=e.noCompatMode||!1,this.condenseFlow=e.condenseFlow||!1,this.quotingType='"'===e.quotingType?2:1,this.forceQuotes=e.forceQuotes||!1,this.replacer="function"==typeof e.replacer?e.replacer:null,this.implicitTypes=this.schema.compiledImplicit,this.explicitTypes=this.schema.compiledExplicit,this.tag=null,this.result="",this.duplicates=[],this.usedDuplicates=null}function Ne(e,t){for(var i,r=n.repeat(" ",t),o=0,a=-1,l="",c=e.length;o<c;)-1===(a=e.indexOf("\n",o))?(i=e.slice(o),o=c):(i=e.slice(o,a+1),o=a+1),i.length&&"\n"!==i&&(l+=r),l+=i;return l}function Fe(e,t){return"\n"+n.repeat(" ",e.indent*t)}function Ee(e){return 32===e||9===e}function Me(e){return 32<=e&&e<=126||161<=e&&e<=55295&&8232!==e&&8233!==e||57344<=e&&e<=65533&&e!==xe||65536<=e&&e<=1114111}function Le(e){return Me(e)&&e!==xe&&13!==e&&10!==e}function _e(e,t,n){var i=Le(e),r=i&&!Ee(e);return(n?i:i&&44!==e&&91!==e&&93!==e&&123!==e&&125!==e)&&35!==e&&!(58===t&&!r)||Le(t)&&!Ee(t)&&35===e||58===t&&r}function De(e,t){var n,i=e.charCodeAt(t);return i>=55296&&i<=56319&&t+1<e.length&&(n=e.charCodeAt(t+1))>=56320&&n<=57343?1024*(i-55296)+n-56320+65536:i}function Ue(e){return/^\n* /.test(e)}function Ye(e,t,n,i,r,o,a,l){var c,s,u=0,p=null,f=!1,d=!1,h=-1!==i,g=-1,m=Me(s=De(e,0))&&s!==xe&&!Ee(s)&&45!==s&&63!==s&&58!==s&&44!==s&&91!==s&&93!==s&&123!==s&&125!==s&&35!==s&&38!==s&&42!==s&&33!==s&&124!==s&&61!==s&&62!==s&&39!==s&&34!==s&&37!==s&&64!==s&&96!==s&&function(e){return!Ee(e)&&58!==e}(De(e,e.length-1));if(t||a)for(c=0;c<e.length;u>=65536?c+=2:c++){if(!Me(u=De(e,c)))return 5;m=m&&_e(u,p,l),p=u}else{for(c=0;c<e.length;u>=65536?c+=2:c++){if(10===(u=De(e,c)))f=!0,h&&(d=d||c-g-1>i&&" "!==e[g+1],g=c);else if(!Me(u))return 5;m=m&&_e(u,p,l),p=u}d=d||h&&c-g-1>i&&" "!==e[g+1]}return f||d?n>9&&Ue(e)?5:a?2===o?5:2:d?4:3:!m||a||r(e)?2===o?5:2:1}function qe(e,t,n,i,r){e.dump=function(){if(0===t.length)return 2===e.quotingType?'""':"''";if(!e.noCompatMode&&(-1!==Se.indexOf(t)||Oe.test(t)))return 2===e.quotingType?'"'+t+'"':"'"+t+"'";var a=e.indent*Math.max(1,n),l=-1===e.lineWidth?-1:Math.max(Math.min(e.lineWidth,40),e.lineWidth-a),c=i||e.flowLevel>-1&&n>=e.flowLevel;switch(Ye(t,c,e.indent,l,(function(t){return function(e,t){var n,i;for(n=0,i=e.implicitTypes.length;n<i;n+=1)if(e.implicitTypes[n].resolve(t))return!0;return!1}(e,t)}),e.quotingType,e.forceQuotes&&!i,r)){case 1:return t;case 2:return"'"+t.replace(/'/g,"''")+"'";case 3:return"|"+Re(t,e.indent)+Be(Ne(t,a));case 4:return">"+Re(t,e.indent)+Be(Ne(function(e,t){var n,i,r=/(\n+)([^\n]*)/g,o=(l=e.indexOf("\n"),l=-1!==l?l:e.length,r.lastIndex=l,Ke(e.slice(0,l),t)),a="\n"===e[0]||" "===e[0];var l;for(;i=r.exec(e);){var c=i[1],s=i[2];n=" "===s[0],o+=c+(a||n||""===s?"":"\n")+Ke(s,t),a=n}return o}(t,l),a));case 5:return'"'+function(e){for(var t,n="",i=0,r=0;r<e.length;i>=65536?r+=2:r++)i=De(e,r),!(t=Ie[i])&&Me(i)?(n+=e[r],i>=65536&&(n+=e[r+1])):n+=t||je(i);return n}(t)+'"';default:throw new o("impossible error: invalid scalar style")}}()}function Re(e,t){var n=Ue(e)?String(t):"",i="\n"===e[e.length-1];return n+(i&&("\n"===e[e.length-2]||"\n"===e)?"+":i?"":"-")+"\n"}function Be(e){return"\n"===e[e.length-1]?e.slice(0,-1):e}function Ke(e,t){if(""===e||" "===e[0])return e;for(var n,i,r=/ [^ ]/g,o=0,a=0,l=0,c="";n=r.exec(e);)(l=n.index)-o>t&&(i=a>o?a:l,c+="\n"+e.slice(o,i),o=i+1),a=l;return c+="\n",e.length-o>t&&a>o?c+=e.slice(o,a)+"\n"+e.slice(a+1):c+=e.slice(o),c.slice(1)}function Pe(e,t,n,i){var r,o,a,l="",c=e.tag;for(r=0,o=n.length;r<o;r+=1)a=n[r],e.replacer&&(a=e.replacer.call(n,String(r),a)),(He(e,t+1,a,!0,!0,!1,!0)||void 0===a&&He(e,t+1,null,!0,!0,!1,!0))&&(i&&""===l||(l+=Fe(e,t)),e.dump&&10===e.dump.charCodeAt(0)?l+="-":l+="- ",l+=e.dump);e.tag=c,e.dump=l||"[]"}function We(e,t,n){var i,r,a,l,c,s;for(a=0,l=(r=n?e.explicitTypes:e.implicitTypes).length;a<l;a+=1)if(((c=r[a]).instanceOf||c.predicate)&&(!c.instanceOf||"object"==typeof t&&t instanceof c.instanceOf)&&(!c.predicate||c.predicate(t))){if(n?c.multi&&c.representName?e.tag=c.representName(t):e.tag=c.tag:e.tag="?",c.represent){if(s=e.styleMap[c.tag]||c.defaultStyle,"[object Function]"===ke.call(c.represent))i=c.represent(t,s);else{if(!Ce.call(c.represent,s))throw new o("!<"+c.tag+'> tag resolver accepts not "'+s+'" style');i=c.represent[s](t,s)}e.dump=i}return!0}return!1}function He(e,t,n,i,r,a,l){e.tag=null,e.dump=n,We(e,n,!1)||We(e,n,!0);var c,s=ke.call(e.dump),u=i;i&&(i=e.flowLevel<0||e.flowLevel>t);var p,f,d="[object Object]"===s||"[object Array]"===s;if(d&&(f=-1!==(p=e.duplicates.indexOf(n))),(null!==e.tag&&"?"!==e.tag||f||2!==e.indent&&t>0)&&(r=!1),f&&e.usedDuplicates[p])e.dump="*ref_"+p;else{if(d&&f&&!e.usedDuplicates[p]&&(e.usedDuplicates[p]=!0),"[object Object]"===s)i&&0!==Object.keys(e.dump).length?(!function(e,t,n,i){var r,a,l,c,s,u,p="",f=e.tag,d=Object.keys(n);if(!0===e.sortKeys)d.sort();else if("function"==typeof e.sortKeys)d.sort(e.sortKeys);else if(e.sortKeys)throw new o("sortKeys must be a boolean or a function");for(r=0,a=d.length;r<a;r+=1)u="",i&&""===p||(u+=Fe(e,t)),c=n[l=d[r]],e.replacer&&(c=e.replacer.call(n,l,c)),He(e,t+1,l,!0,!0,!0)&&((s=null!==e.tag&&"?"!==e.tag||e.dump&&e.dump.length>1024)&&(e.dump&&10===e.dump.charCodeAt(0)?u+="?":u+="? "),u+=e.dump,s&&(u+=Fe(e,t)),He(e,t+1,c,!0,s)&&(e.dump&&10===e.dump.charCodeAt(0)?u+=":":u+=": ",p+=u+=e.dump));e.tag=f,e.dump=p||"{}"}(e,t,e.dump,r),f&&(e.dump="&ref_"+p+e.dump)):(!function(e,t,n){var i,r,o,a,l,c="",s=e.tag,u=Object.keys(n);for(i=0,r=u.length;i<r;i+=1)l="",""!==c&&(l+=", "),e.condenseFlow&&(l+='"'),a=n[o=u[i]],e.replacer&&(a=e.replacer.call(n,o,a)),He(e,t,o,!1,!1)&&(e.dump.length>1024&&(l+="? "),l+=e.dump+(e.condenseFlow?'"':"")+":"+(e.condenseFlow?"":" "),He(e,t,a,!1,!1)&&(c+=l+=e.dump));e.tag=s,e.dump="{"+c+"}"}(e,t,e.dump),f&&(e.dump="&ref_"+p+" "+e.dump));else if("[object Array]"===s)i&&0!==e.dump.length?(e.noArrayIndent&&!l&&t>0?Pe(e,t-1,e.dump,r):Pe(e,t,e.dump,r),f&&(e.dump="&ref_"+p+e.dump)):(!function(e,t,n){var i,r,o,a="",l=e.tag;for(i=0,r=n.length;i<r;i+=1)o=n[i],e.replacer&&(o=e.replacer.call(n,String(i),o)),(He(e,t,o,!1,!1)||void 0===o&&He(e,t,null,!1,!1))&&(""!==a&&(a+=","+(e.condenseFlow?"":" ")),a+=e.dump);e.tag=l,e.dump="["+a+"]"}(e,t,e.dump),f&&(e.dump="&ref_"+p+" "+e.dump));else{if("[object String]"!==s){if("[object Undefined]"===s)return!1;if(e.skipInvalid)return!1;throw new o("unacceptable kind of an object to dump "+s)}"?"!==e.tag&&qe(e,e.dump,t,a,u)}null!==e.tag&&"?"!==e.tag&&(c=encodeURI("!"===e.tag[0]?e.tag.slice(1):e.tag).replace(/!/g,"%21"),c="!"===e.tag[0]?"!"+c:"tag:yaml.org,2002:"===c.slice(0,18)?"!!"+c.slice(18):"!<"+c+">",e.dump=c+" "+e.dump)}return!0}function $e(e,t){var n,i,r=[],o=[];for(Ge(e,r,o),n=0,i=o.length;n<i;n+=1)t.duplicates.push(r[o[n]]);t.usedDuplicates=new Array(i)}function Ge(e,t,n){var i,r,o;if(null!==e&&"object"==typeof e)if(-1!==(r=t.indexOf(e)))-1===n.indexOf(r)&&n.push(r);else if(t.push(e),Array.isArray(e))for(r=0,o=e.length;r<o;r+=1)Ge(e[r],t,n);else for(r=0,o=(i=Object.keys(e)).length;r<o;r+=1)Ge(e[i[r]],t,n)}function Ve(e,t){return function(){throw new Error("Function yaml."+e+" is removed in js-yaml 4. Use yaml."+t+" instead, which is now safe by default.")}}var Ze=p,Je=h,Qe=g,ze=x,Xe=I,et=q,tt=we.load,nt=we.loadAll,it={dump:function(e,t){var n=new Te(t=t||{});n.noRefs||$e(e,n);var i=e;return n.replacer&&(i=n.replacer.call({"":i},"",i)),He(n,0,i,!0,!0)?n.dump+"\n":""}}.dump,rt=o,ot=Ve("safeLoad","load"),at=Ve("safeLoadAll","loadAll"),lt=Ve("safeDump","dump"),ct={Type:Ze,Schema:Je,FAILSAFE_SCHEMA:Qe,JSON_SCHEMA:ze,CORE_SCHEMA:Xe,DEFAULT_SCHEMA:et,load:tt,loadAll:nt,dump:it,YAMLException:rt,safeLoad:ot,safeLoadAll:at,safeDump:lt};e.CORE_SCHEMA=Xe,e.DEFAULT_SCHEMA=et,e.FAILSAFE_SCHEMA=Qe,e.JSON_SCHEMA=ze,e.Schema=Je,e.Type=Ze,e.YAMLException=rt,e.default=ct,e.dump=it,e.load=tt,e.loadAll=nt,e.safeDump=lt,e.safeLoad=ot,e.safeLoadAll=at,Object.defineProperty(e,"__esModule",{value:!0})}));
diff --git a/Source/platformProject/platform2022UI/jslib/yaml/js/yaml.js b/Source/platformProject/platform2022UI/jslib/yaml/js/yaml.js
new file mode 100644
index 0000000..7691469
--- /dev/null
+++ b/Source/platformProject/platform2022UI/jslib/yaml/js/yaml.js
@@ -0,0 +1,120 @@
+// CodeMirror, copyright (c) by Marijn Haverbeke and others
+// Distributed under an MIT license: https://codemirror.net/LICENSE
+
+(function(mod) {
+  if (typeof exports == "object" && typeof module == "object") // CommonJS
+    mod(require("codemirror"));
+  else if (typeof define == "function" && define.amd) // AMD
+    define(["codemirror"], mod);
+  else // Plain browser env
+    mod(CodeMirror);
+})(function(CodeMirror) {
+"use strict";
+
+CodeMirror.defineMode("yaml", function() {
+
+  var cons = ['true', 'false', 'on', 'off', 'yes', 'no'];
+  var keywordRegex = new RegExp("\\b(("+cons.join(")|(")+"))$", 'i');
+
+  return {
+    token: function(stream, state) {
+      var ch = stream.peek();
+      var esc = state.escaped;
+      state.escaped = false;
+      /* comments */
+      if (ch == "#" && (stream.pos == 0 || /\s/.test(stream.string.charAt(stream.pos - 1)))) {
+        stream.skipToEnd();
+        return "comment";
+      }
+
+      if (stream.match(/^('([^']|\\.)*'?|"([^"]|\\.)*"?)/))
+        return "string";
+
+      if (state.literal && stream.indentation() > state.keyCol) {
+        stream.skipToEnd(); return "string";
+      } else if (state.literal) { state.literal = false; }
+      if (stream.sol()) {
+        state.keyCol = 0;
+        state.pair = false;
+        state.pairStart = false;
+        /* document start */
+        if(stream.match('---')) { return "def"; }
+        /* document end */
+        if (stream.match('...')) { return "def"; }
+        /* array list item */
+        if (stream.match(/\s*-\s+/)) { return 'meta'; }
+      }
+      /* inline pairs/lists */
+      if (stream.match(/^(\{|\}|\[|\])/)) {
+        if (ch == '{')
+          state.inlinePairs++;
+        else if (ch == '}')
+          state.inlinePairs--;
+        else if (ch == '[')
+          state.inlineList++;
+        else
+          state.inlineList--;
+        return 'meta';
+      }
+
+      /* list separator */
+      if (state.inlineList > 0 && !esc && ch == ',') {
+        stream.next();
+        return 'meta';
+      }
+      /* pairs separator */
+      if (state.inlinePairs > 0 && !esc && ch == ',') {
+        state.keyCol = 0;
+        state.pair = false;
+        state.pairStart = false;
+        stream.next();
+        return 'meta';
+      }
+
+      /* start of value of a pair */
+      if (state.pairStart) {
+        /* block literals */
+        if (stream.match(/^\s*(\||\>)\s*/)) { state.literal = true; return 'meta'; };
+        /* references */
+        if (stream.match(/^\s*(\&|\*)[a-z0-9\._-]+\b/i)) { return 'variable-2'; }
+        /* numbers */
+        if (state.inlinePairs == 0 && stream.match(/^\s*-?[0-9\.\,]+\s?$/)) { return 'number'; }
+        if (state.inlinePairs > 0 && stream.match(/^\s*-?[0-9\.\,]+\s?(?=(,|}))/)) { return 'number'; }
+        /* keywords */
+        if (stream.match(keywordRegex)) { return 'keyword'; }
+      }
+
+      /* pairs (associative arrays) -> key */
+      if (!state.pair && stream.match(/^\s*(?:[,\[\]{}&*!|>'"%@`][^\s'":]|[^,\[\]{}#&*!|>'"%@`])[^#]*?(?=\s*:($|\s))/)) {
+        state.pair = true;
+        state.keyCol = stream.indentation();
+        return "atom";
+      }
+      if (state.pair && stream.match(/^:\s*/)) { state.pairStart = true; return 'meta'; }
+
+      /* nothing found, continue */
+      state.pairStart = false;
+      state.escaped = (ch == '\\');
+      stream.next();
+      return null;
+    },
+    startState: function() {
+      return {
+        pair: false,
+        pairStart: false,
+        keyCol: 0,
+        inlinePairs: 0,
+        inlineList: 0,
+        literal: false,
+        escaped: false
+      };
+    },
+    lineComment: "#",
+    fold: "indent"
+  };
+});
+
+CodeMirror.defineMIME("text/x-yaml", "yaml");
+CodeMirror.defineMIME("text/yaml", "yaml");
+
+});
diff --git a/Source/platformProject/platform2022UI/main.html b/Source/platformProject/platform2022UI/main.html
new file mode 100644
index 0000000..39e73d4
--- /dev/null
+++ b/Source/platformProject/platform2022UI/main.html
@@ -0,0 +1,153 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="UTF-8" />
+<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1">
+<meta http-equiv="X-UA-Compatible" content="IE=edge" />
+    <script src="jslib/jquery/jquery-1.8.2.min.js" type="text/javascript" charset="UTF-8"></script>
+    <script src="jslib/jquery/jquery.cookie.js" type="text/javascript" charset="UTF-8"></script>
+    <script src="jslib/jquery/jquery.fileDownload.js" type="text/javascript" charset="UTF-8"></script>
+    <!--璺ㄥ煙鏌ヨ-->    <!--鏀寔濯掍綋鏌ヨ鍜屾牸鏍� -->
+    <!--[if lt IE 9]>
+    <script src="jslib/corsforie8/jQuery.XDomainRequest.js" type="text/javascript" charset="UTF-8"></script>
+    <script src="jslib/corsforie8/jquery.xdomainrequest.min.js" type="text/javascript" charset="UTF-8"></script>
+    <script src="jslib/metaQueryForIe8/htm5.min.js" type="text/javascript" charset="UTF-8"></script>
+    <script src="jslib/metaQueryForIe8/respond.min.js" type="text/javascript" charset="UTF-8"></script>
+    <script type="text/javascript" >
+        (function() {
+            if (!0) return;
+            var e = "abbr, article, aside, audio, canvas, datalist, details, dialog, eventsource, figure, footer, header, hgroup, mark, menu, meter, nav, output, progress, section, time, video".split(', ');
+            var i= e.length;
+            while (i--){
+                document.createElement(e[i])
+            }
+        })()
+    </script>
+    <![endif]-->
+
+<script src="jslib/layui-2.2.5-debug/layui.js" type="text/javascript" charset="UTF-8"></script>
+<script src="jslib/vcijs/browserInfo.js" type="text/javascript" charset="UTF-8"></script>
+<script src="jslib/vcijs/vciWebUtil.js" type="text/javascript" charset="UTF-8"></script>
+    <script src="jslib/vcijs/json2.js" type="text/javascript" charset="UTF-8"></script>
+    <script src="jslib/vcijs/md5.js" type="text/javascript" charset="UTF-8"></script>
+<script src="jslib/vcijs/main.js" type="text/javascript" charset="UTF-8"></script>
+<script src="jslib/websocket/swfobject.js" type="text/javascript" charset="UTF-8"></script>
+
+    <link  href="jslib/layui-2.2.5-debug/css/layui.css" rel="stylesheet" type="text/css"/>
+<link  href="jslib/layui-2.2.5-debug/alicon/alicon.css" rel="stylesheet" type="text/css"/>
+<link href="style/css/layuimodify.css" rel="stylesheet" type="text/css"/>
+<link href="style/css/vciproject.css" rel="stylesheet" type="text/css"/>
+<link href="style/css/dc.css" rel="stylesheet" type="text/css"/>
+    <link id="layuicss-layer" href="jslib/layui-2.2.5-debug/css/modules/layer/default/layer.css" rel="stylesheet" type="text/css"/>
+    <link id="layuicss-laydate" href="jslib/layui-2.2.5-debug/css/modules/laydate/default/laydate.css" rel="stylesheet" type="text/css"/>
+    <script src="jslib/layui-2.2.5-debug/lay/filepreview/pdfobject.js" type="text/javascript" charset="UTF-8"></script>
+    <link href="style/css/easyui.css" rel="stylesheet" type="text/css"/>
+   <link href="style/css/layui-dojo-small.css" rel="stylesheet" type="text/css"/>
+    <script src="jslib/jquery/jquery.easyui.min.js" type="text/javascript" charset="UTF-8"></script>
+<title></title>
+</head>
+<body class="layui-layout-body">
+     <div id="clientSessionRemind_tips" class="layui-vci-sessionRemind" >
+         <span>
+             <img src="style/images/base/index/sessionRemind.png">
+             瀹夊叏鎻愮ず锛氱郴缁熼棽缃椂闂磋繃闀匡紝灏嗕簬<label>3</label>鍚庤嚜鍔ㄩ��鍑猴紝[绉诲姩榧犳爣鎴栬�呯偣鍑婚敭鐩樺彲瑙i櫎璀﹀憡]
+         </span>
+     </div>
+     <div id="portal" class="layui-layout layui-layout-admin" style="display:none">
+        <div class="side-hover"></div>
+        <div class="layui-header " style="height: 50px" id="portal_head">
+            <div class="bgcolor"></div>
+            <div class="content">
+                <div id="portal_logo" class="layui-logo">宸ヨ鍒堕�犳墽琛岀郴缁�</div>
+                <div class="layui-vci-portal-topbar">
+                    <ul id="portal_toolmenu" class="layui-nav layui-layout-left" ></ul>
+                    <ul id="portal_personArea" class="layui-nav layui-layout-right">
+                    </ul>
+                </div>
+            </div>
+        </div>
+         <div style="position: fixed;width: 100%;height: 100%;left: 0;top:0;padding: 55px 5px 5px">
+             <div id="mainEasyuiLayout" class="easyui-layout" data-options="fit:true">
+                 <div id="portal_menu" data-options="region:'west',split:true,minWidth:40,maxWidth:800" style="width: 220px;height:100%;position: relative;top:0;left: 0" class="layui-side layui-side-menu">
+                     <div class="layui-side-scroll">
+                         <ul id="portal_menu_tree"  class="layui-nav layui-nav-tree layui-nav-tree-menu" lay-filter="vciPortalMenu">
+                         </ul>
+                     </div>
+                 </div>
+                 <div class="layui-body" data-options="region:'center'"  id="portal_body"  style="position: relative;top:0;left:0;padding: 0" >
+                     <div class="layui-tab" lay-filter="vciPortalTab" style="margin:0" lay-allowClose="true">
+                         <ul class="layui-tab-title" lay-allowClose="false">
+                             <li class="layui-this" lay-id="vciPortalIndex" id="vciPortalIndex" lay-unAllowClose="true" style="min-width:30px;margin-left: 5px"><i class="layui-icon layui-icon-home" ></i> 棣栭〉 </li>
+                         </ul>
+                         <div  class="rightMenu" style="position:absolute;display:none;">
+                             <ul><li data-type="closeOther">鍏抽棴鍏朵粬</li><li data-type="closeAll">鍏抽棴鎵�鏈�</li></ul>
+                         </div>
+
+                         <div class="layui-tab-content" style="overflow: auto;border-top: 1px solid #b5bcc7;">
+                             <div class="layui-tab-item layui-show" id="vciPortalIndexContent" style="min-width: 1000px"></div>
+                         </div>
+                     </div>
+                 </div>
+             </div>
+         </div>
+
+        <div class="layui-footer"id="portal_footer" style="display:none;"></div>
+     </div>
+     <div  id="noLogin" style="display:none;vertical-align:middle;text-align: center;">
+           <div>
+               <img src="style/images/base/index/nosession.png"/>
+           </div>
+           <div>
+             <p id="noLoginInfo"></p>
+       		 <br/>
+       	     <p><a href="index.html" target="_top">鎴栬�呯偣鍑昏繖閲岃繑鍥炵櫥褰曢〉闈�</a></p>
+        	 <br/>
+           </div>
+     </div>
+	<span id="app-msg" style="display:none;"></span>
+</body>
+<script>
+    window.onload = function(){
+        $('#portal_body > .layui-tab > .layui-tab-title').on('DOMSubtreeModified',function(){//鐩戝惉tab椤电鍙樺寲
+            customRightClick();
+        });
+        var menu = $('.rightMenu');//鑷畾涔夎彍鍗�
+        var activeTabID;//鑾峰彇鐐瑰嚮鑿滃崟鐨処D
+        function customRightClick(){//鍙栨秷椤电鍙抽敭鐨勯粯璁や簨浠�
+            $('.layui-tab-title li').on('contextmenu' , function(e){
+                var e = event || window.event;
+                menu.css({"left":e.clientX-200+'px',"top": e.clientY-50+'px',"display":"block"});
+                activeTabID = $(this).attr('lay-id');
+                e.returnValue = false;
+                //return false;
+            });
+        }
+        $('.rightMenu li').click(function(){//鑷畾涔夎彍鍗曠殑鐐瑰嚮浜嬩欢
+            var tabTitle = $(".layui-tab-title li");//鎵�鏈塼ab
+            var allTabIDArr =[];//鎵�鏈塼ab鐨処D
+            $.each(tabTitle,function(i){
+                allTabIDArr[i] = $(this).attr("lay-id")
+            });
+            if($(this).attr("data-type")=="closeOther"){//鍏抽棴鍏朵粬椤电
+                $.each(allTabIDArr,function(i){
+                    var temTabID = allTabIDArr[i];
+                    if(activeTabID!=temTabID){
+                        $("li[lay-id="+temTabID+"]").children().click();
+                    }
+                })
+            }else if($(this).attr("data-type")=="closeAll"){//鍏抽棴鎵�鏈夐〉绛�
+                $.each(allTabIDArr,function(i){
+                    var temTabID = allTabIDArr[i];
+                    $("li[lay-id="+temTabID+"]").children().click();
+                })
+            }
+        });
+        document.onclick = function(){//鐐瑰嚮鍏朵粬鍦版柟鍏抽棴椤电
+            var e = event || window.event;
+            menu.css({"display":"none"});
+        }
+
+
+    }
+</script>
+</html>
diff --git a/Source/platformProject/platform2022UI/mainAdmin.html b/Source/platformProject/platform2022UI/mainAdmin.html
new file mode 100644
index 0000000..6cf65ce
--- /dev/null
+++ b/Source/platformProject/platform2022UI/mainAdmin.html
@@ -0,0 +1,108 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+    <meta charset="UTF-8" />
+    <meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+    <script src="jslib/jquery/jquery-1.8.2.min.js" type="text/javascript" charset="UTF-8"></script>
+    <script src="jslib/jquery/jquery.cookie.js" type="text/javascript" charset="UTF-8"></script>
+    <script src="jslib/jquery/jquery.fileDownload.js" type="text/javascript" charset="UTF-8"></script>
+    <!--璺ㄥ煙鏌ヨ-->
+    <!--鏀寔濯掍綋鏌ヨ鍜屾牸鏍� -->
+    <!--[if lt IE 9]>
+    <script src="jslib/corsforie8/jQuery.XDomainRequest.js" type="text/javascript" charset="UTF-8"></script>
+    <script src="jslib/corsforie8/jquery.xdomainrequest.min.js" type="text/javascript" charset="UTF-8"></script>
+    <script src="jslib/metaQueryForIe8/htm5.min.js" type="text/javascript" charset="UTF-8"></script>
+    <script src="jslib/metaQueryForIe8/respond.min.js" type="text/javascript" charset="UTF-8"></script>
+    <script type="text/javascript" >
+        (function() {
+            if (!0) return;
+            var e = "abbr, article, aside, audio, canvas, datalist, details, dialog, eventsource, figure, footer, header, hgroup, mark, menu, meter, nav, output, progress, section, time, video".split(', ');
+            var i= e.length;
+            while (i--){
+                document.createElement(e[i])
+            }
+        })()
+    </script>
+    <![endif]-->
+
+    <script src="jslib/layui-2.2.5-debug/layui.js" type="text/javascript" charset="UTF-8"></script>
+    <script src="jslib/vcijs/browserInfo.js" type="text/javascript" charset="UTF-8"></script>
+    <script src="jslib/vcijs/vciWebUtil.js" type="text/javascript" charset="UTF-8"></script>
+    <script src="jslib/vcijs/json2.js" type="text/javascript" charset="UTF-8"></script>
+    <script src="jslib/vcijs/md5.js" type="text/javascript" charset="UTF-8"></script>
+    <script src="jslib/vcijs/adminMain.js" type="text/javascript" charset="UTF-8"></script>
+<!--    <script src="jslib/echarts-4.2/echarts.min.js" type="text/javascript" charset="UTF-8"></script>-->
+
+    <script src="jslib/websocket/swfobject.js" type="text/javascript" charset="UTF-8"></script>
+    <link href="jslib/layui-2.2.5-debug/css/layui.css" rel="stylesheet" type="text/css" />
+    <link href="jslib/layui-2.2.5-debug/alicon/alicon.css" rel="stylesheet" type="text/css" />
+    <link href="style/css/layuimodify.css" rel="stylesheet" type="text/css" />
+    <link href="style/css/vciproject.css" rel="stylesheet" type="text/css" />
+    <link href="style/css/dc.css" rel="stylesheet" type="text/css" />
+    <script src="jslib/layui-2.2.5-debug/lay/filepreview/pdfobject.js" type="text/javascript" charset="UTF-8"></script>
+    <script src="jslib/markdown/marked2.1.3.js"></script>
+    <link href="jslib/markdown/monokai_sublime.min.css" rel="stylesheet">
+    <script src="jslib/markdown/highlight.min.js"></script>
+    <title></title>
+</head>
+
+<body class="layui-layout-body">
+    <div id="clientSessionRemind_tips" class="layui-vci-sessionRemind">
+        <span>
+            <img src="style/images/base/index/sessionRemind.png">
+            瀹夊叏鎻愮ず锛氱郴缁熼棽缃椂闂磋繃闀匡紝灏嗕簬<label>3</label>鍚庤嚜鍔ㄩ��鍑猴紝[绉诲姩榧犳爣鎴栬�呯偣鍑婚敭鐩樺彲瑙i櫎璀﹀憡]
+        </span>
+    </div>
+    <div id="portal" class="layui-layout layui-layout-admin" >
+        <div class="side-hover"></div>
+        <div class="layui-header " id="portal_head">
+            <div class="bgcolor"></div>
+            <div class="content">
+                <div id="portal_logo" class="layui-logo" >鐩戞帶鏈嶅姟涓績</div>
+                <div class="layui-vci-portal-topbar">
+                    <ul class="worker-head-icon">
+                        <li class="userName" style="padding-top: 5px;cursor: none;"></li>
+                        <li class="outLogin"><i class="layui-icon layui-icon-logout" style="font-size:16px;color:red;"></i></li>
+                    </ul>
+                </div>
+            </div>
+        </div>
+        <div id="portal_menu" class="layui-side layui-side-menu layui-bg-blue ">
+            <div class="layui-side-scroll">
+                <ul id="portal_menu_tree"  class="layui-nav layui-nav-tree layui-nav-tree-menu" lay-filter="vciPortalMenu"></ul>
+            </div>
+        </div>
+        <div class="layui-body" id="portal_body" style="margin:5px;" >
+            <div class="layui-tab" lay-filter="vciPortalTab" style="margin:5px 0" lay-allowClose="true">
+                <ul class="layui-tab-title" lay-allowClose="false">
+                    <li class="layui-this" lay-id="vciPortalIndex" id="vciPortalIndex" lay-unAllowClose="true" style="min-width:30px"><i class="layui-icon layui-icon-home" ></i></li>
+                </ul>
+                <div  class="rightMenu" style="position:absolute;display:none;">
+                    <ul><li data-type="closeOther">鍏抽棴鍏朵粬</li>
+                        <li data-type="closeAll">鍏抽棴鎵�鏈�</li></ul>
+
+                </div>
+
+                <div class="layui-tab-content" style="overflow: auto">
+                    <div class="layui-tab-item layui-show" id="vciPortalIndexContent" style="min-width: 1000px"></div>
+                </div>
+            </div>
+        </div>
+    </div>
+    <div id="noLogin" style="display:none;vertical-align:middle;text-align: center;">
+        <div>
+            <img src="style/images/base/index/nosession.png" />
+        </div>
+        <div>
+            <p id="noLoginInfo"></p>
+            <br />
+            <p><a href="indexAdmin.html" target="_top">鎴栬�呯偣鍑昏繖閲岃繑鍥炵櫥褰曢〉闈�</a></p>
+            <br />
+        </div>
+    </div>
+    <span id="app-msg" style="display:none;"></span>
+</body>
+
+</html>
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/platform2020UI.iml b/Source/platformProject/platform2022UI/platform2020UI.iml
new file mode 100644
index 0000000..80cc739
--- /dev/null
+++ b/Source/platformProject/platform2022UI/platform2020UI.iml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="WEB_MODULE" version="4">
+  <component name="NewModuleRootManager" inherit-compiler-output="true">
+    <exclude-output />
+    <content url="file://$MODULE_DIR$" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/style/css/common.css b/Source/platformProject/platform2022UI/style/css/common.css
new file mode 100644
index 0000000..1b9a1bf
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/css/common.css
@@ -0,0 +1,168 @@
+.threeSelect{
+	background-color:#009688;
+}
+.threeSelect a{
+	background-color:#009688;
+}
+
+.vciWebMenuLevel3{
+	background-color:#363A45;
+}
+
+.vciWebMenuLevel3 a{
+	background-color:#363A45;
+}
+
+.layui-bg-208{
+	background-color:#c2c2c2!important;
+	color: #0F0E0E!important;
+}
+
+.layui-bg-208 .logotitle{
+	color:#0F0E0E;
+	font-size:24px;
+	float:left;
+	margin-left:15px;
+}
+
+.layui-bg-208 .logoimg{
+	line-heigt:60px;
+	float:left;
+	margin-top:10px;
+}
+
+.layui-bg-208 i{
+	color:#0F0E0E;
+}
+.layui-bg-208 a{
+	color:#0F0E0E !important;
+}
+.layui-bg-208 .layui-nav-more{
+	border-top-color:#0F0E0E !important;
+}
+.layui-nav-tree-menu{
+	background-color: #535459;
+}
+/*涓婚〉涓殑閰嶇疆*/
+.layui-vci-mes208-index{
+	position: relative;
+	height:100%;
+	width:100%;
+	overflow:hidden;
+	overflow-y:auto;
+	background-color:#f2f2f2;
+}
+
+
+/*鏀惰棌鍔熻兘鎸備欢涓殑閰嶇疆*/
+.layui-vci-fav {
+	margin:0 ;
+	background-color: #fff;
+}
+.layui-vci-fav ul{
+	background-color: #fff!important;
+}
+.layui-vci-fav li{
+	text-align:center;
+	color:#666;
+}
+.layui-vci-fav a {
+	color:#333;
+	text-decoration: none;
+}
+.layui-vci-fav li .layui-icon {
+	display:inline-block;
+	width:100%;
+	height: 60px;
+	line-height: 60px;
+	text-align: center;
+	-webkit-border-radius: 2px;
+	-moz-border-radius: 2px;
+	border-radius: 2px;
+	color:#333;
+	background-color: #F8F8F8;
+	-webkit-transition: all .3s;
+}
+.layui-vci-fav li img{
+	display:inline-block;
+	width:100%;
+	height: 60px;
+	line-height: 60px;
+	text-align: center;
+	-webkit-border-radius: 2px;
+	-moz-border-radius: 2px;
+	border-radius: 2px;
+	color:#333;
+	background-color: #F8F8F8;
+	-webkit-transition: all .3s;
+}
+
+.layui-vci-fav li cite{
+	position: relative;
+	top: 2px;
+	display: block;
+	color: #666;
+	text-overflow: ellipsis;
+	overflow: hidden;
+	white-space: nowrap;
+	font-size: 14px;
+}
+
+/*寰呭姙浜嬮」*/
+.layui-vci-undotask {
+	margin:0 ;
+	background-color: #fff;
+}
+
+.layui-vci-undotask ul{
+	background-color: #fff!important;
+}
+.layui-vci-undotask li{
+	float: left;
+
+}
+.layui-vci-undotask a {
+	display: block;
+	padding: 10px 15px;
+	background-color: #f8f8f8;
+	color: #999;
+	border-radius: 2px;
+	transition: all .3s;
+	-webkit-transition: all .3s;
+}
+
+.layui-vci-undotask h3{
+	padding-bottom: 10px;
+	font-size: 12px;
+}
+
+.layui-vci-undotask cite{
+	font-style: normal;
+	font-size: 30px;
+	font-weight: 300;
+	color: #009688;
+}
+
+.layui-vci-undotask .vci-need-do{
+	color:#ff510f;
+}
+
+/*鎸備欢鐨勬渶鍙充晶淇℃伅鍥炬爣*/
+.layui-portal-home .layui-icon-tips{
+	line-height: initial;
+	position: absolute;
+	right: 10px;
+	top: 50%;
+	margin-top: -7px;
+	cursor: pointer;
+}
+
+/*鎸備欢涓婄殑杩涘叆涓績鐨勬寜閽�*/
+.layui-vci-mes208-index .layui-icon-logo{
+	line-height: initial;
+	position: absolute;
+	right: 35px;
+	top: 50%;
+	margin-top: -7px;
+	cursor: pointer;
+}
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/style/css/dc.css b/Source/platformProject/platform2022UI/style/css/dc.css
new file mode 100644
index 0000000..5cd7201
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/css/dc.css
@@ -0,0 +1,113 @@
+/***
+ * 鍏叡鏍峰紡
+ */
+
+.conditionRow .conditionField{
+	padding-right:5px;
+	width:140px; /**鏌ヨ鏉′欢瀛楁涓嬫媺妗嗗搴� */
+}
+.xpl-popup-query, .xpl-unpopup-query{
+	margin-left:10px;
+}
+.conditionField input{
+	text-align: right;
+}
+.xpl-dc-complex .conditionRow .conditionOption{
+	padding-right:5px;
+	width:100px; /**澶嶆潅妯″紡涓嬫煡璇㈡潯浠舵搷浣滀笅鎷夋瀹藉害 */
+}
+.xpl-dc-simple .conditionRow .conditionOption{
+	display: none;/**绠�鍗曟ā寮忎笅锛屾搷浣滀笅鎷夋闅愯棌 */
+}
+/***鍒犻櫎鏉′欢鏍峰紡"X" */
+.conditionRow .delRowBtn .layui-icon-close{
+	font-size: 20px; 
+	color: red;
+}
+
+.xpl-clear {clear:both;}
+.xpl-hide{
+	display: none;
+}
+
+
+/***
+* 闈炲脊绐楁ā寮�
+*/
+.xpl-dc-unpopup .layui-xpl-dc-top-btns{
+	display: none;
+}
+/**闈炲脊绐楁ā寮忔煡璇㈡潯浠舵诞鍔� */
+.xpl-dc-unpopup .conditionRow{
+	float:left;
+	padding-right: 20px;
+	margin-bottom:3px;
+}
+/**闈炲脊绐楁ā寮忔煡璇㈠�兼帶浠舵樉绀哄搴� */
+.xpl-dc-unpopup .conditionRow .conditionValue{
+	width:220px;
+}
+
+/**闈炲脊绐楁ā寮忛殣钘忋�怷銆戞寜閽� */
+.xpl-dc-unpopup .conditionRow .conditionDel{
+	display: none;
+}
+
+.xpl-dc-unpopup-btns{
+	float:left;
+}
+
+
+
+.xpl-dc-unpopup-btns .layui-btn{
+	margin-bottom:3px;
+}
+
+/***
+ * 寮圭獥妯″紡
+ */
+.xpl-dc-popup .conditionRow{
+	margin-bottom:15px;
+	margin-left: 10px;
+}
+.xpl-dc-popup .conditionRow .conditionValue{
+	width:303px;
+}
+.xpl-dc-popup-query-condition-div{
+	font-size:12px;
+	float:left;
+}
+.xpl-dc-popup-btns{
+	float:right;
+}
+.layui-xpl-dc-circle {
+	border-radius: 90px;
+	display:inline-block;
+	text-align:center;
+	height: 25px;
+	line-height: 25px;
+	background-color:#1E9FFF;
+	color:#fff;
+	margin:3px 5px;
+	padding-top:0px;
+	padding-bottom:0px;
+	padding-left:8px;
+	padding-right:18px;
+	position:relative;
+}
+.layui-xpl-dc-delete{ 
+	width:20px;
+	height:20px;
+	line-height: 20px;
+	cursor:pointer;
+	border-radius:60%;
+	position:absolute;
+	top:2px;
+	right:-1px;
+	color:#c2c2c2;
+}
+.layui-xpl-dc-delete:hover{
+	border-radius: 12px;
+	color: #fff;
+}
+
diff --git a/Source/platformProject/platform2022UI/style/css/dm-button.css b/Source/platformProject/platform2022UI/style/css/dm-button.css
new file mode 100644
index 0000000..f6f1da1
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/css/dm-button.css
@@ -0,0 +1,125 @@
+
+.info {
+    background-image:url(../images/base/button/information.png);
+}
+.table_add{
+	background-image:url(../images/base/button/table_add.png)!important;
+}
+.table_modify{
+	background-image:url(../images/base/button/table_modify.png)!important;
+}
+.table_delete{
+	background-image:url(../images/base/button/table_delete.png)!important;
+}
+.table_search{
+	background-image:url(../images/base/button/table_search.png)!important;
+}
+.table_clearref{
+	background-image:url(../images/base/button/table_cleanref.png)!important;
+}
+.table_disable{
+	background-image:url(../images/base/button/table_disabled.png)!important;
+}
+.table_enable{
+	background-image:url(../images/base/button/table_enable.png)!important;
+}
+.table_copy{
+	background-image:url(../images/base/button/table_copy.png)!important;
+}
+.tree_leaf{
+	background-image:url(../images/base/button/tree_leaf.gif)!important;
+}
+.pencil_add{
+	background-image:url(../images/base/button/pencil_add.png)!important;
+}
+.assignOrg{
+	background-image:url(../images/base/button/assignOrg.png)!important;
+}
+.assignUser{
+	background-image:url(../images/base/button/assignUser.png)!important;
+}
+.assignRole{
+	background-image:url(../images/base/button/assignRole.png)!important;
+}
+.schema_add{
+	background-image:url(../images/base/button/schema_add.png)!important;
+}
+.trash{
+	background-image: url(../images/base/button/trash.gif)!important;
+}
+.table_refresh{
+	background-image:url(../images/base/button/table_refresh.png)!important;
+}
+.table_update{
+	background-image:url(../images/base/button/table_edit.png)!important;
+}
+.save{
+	background-image: url(../images/base/button/disk.png)!important;
+}
+.down{
+	background-image: url(../images/base/button/down.gif)!important;
+}
+.preview{
+	background-image:url(../images/base/button/preview.png)!important;
+}
+.notAllow{
+	background-image: url(../images/base/button/notAllow.png)!important;
+}
+.comment_add{
+	background-image: url(../images/base/button/comment_add.png)!important;
+}
+.comment_delete{
+	background-image: url(../images/base/button/comment_delete.png)!important;
+}
+.comment{
+	background-image: url(../images/base/button/comment.png)!important;
+}
+.comments{
+	background-image: url(../images/base/button/comments.png)!important;
+}
+.attach{
+	background-image: url(../images/base/button/attach.png)!important;
+}
+.trans{
+	background-image: url(../images/base/button/trans.png)!important;
+}
+.up{
+	background-image: url(../images/base/button/up.gif)!important;
+}
+.cancel{
+	background-image: url(../images/base/button/cancel.gif)!important;
+}
+.basket_delete{
+	background-image: url(../images/base/button/basket_delete.png)!important;
+}
+.printer{
+	background-image: url(../images/base/button/printer.png)!important;
+}
+.importExcel{
+	background-image: url(../images/base/button/importExcel.png)!important;
+}
+.folder{
+	background-image: url(../images/base/button/folder.png)!important;
+}
+.table_sync{
+	background-image: url(../images/base/button/table_sync.png)!important;
+}
+.unReadMsg{
+	background-image: url(../images/base/button/unReadMsg.png)!important;
+}    
+.readedMsg{
+	background-image: url(../images/base/button/readmsg.png)!important;
+}
+.mail{
+	background-image: url(../images/base/button/mail.png)!important;
+}    
+.in{
+	background-image: url(../images/base/button/in.png)!important;
+}
+.out{
+	background-image: url(../images/base/button/out.png)!important;
+}
+.flow_bg{
+	background-image: url(../images/base/flow/painterBg)!important;
+	background-repeat:repeat
+}
diff --git a/Source/platformProject/platform2022UI/style/css/easyui.css b/Source/platformProject/platform2022UI/style/css/easyui.css
new file mode 100644
index 0000000..bd18303
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/css/easyui.css
@@ -0,0 +1,3706 @@
+.f-row {
+  display: -webkit-box;
+  display: -webkit-flex;
+  display: -moz-flex;
+  display: -ms-flexbox;
+  display: flex;
+  position: relative;
+}
+.f-column {
+  display: -webkit-box;
+  display: -webkit-flex;
+  display: -moz-flex;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-box-direction: normal;
+  -webkit-box-orient: vertical;
+  -webkit-flex-direction: column;
+  -moz-flex-direction: column;
+  -ms-flex-direction: column;
+  flex-direction: column;
+  position: relative;
+}
+.f-full {
+  -webkit-box-flex: 1 1 auto;
+  -ms-flex: 1 1 auto;
+  flex: 1 1 auto;
+}
+.f-noshrink {
+  -webkit-flex-shrink: 0;
+  -moz-flex-shrink: 0;
+  -ms-flex-negative: 0;
+  flex-shrink: 0;
+}
+.f-content-center {
+  -webkit-box-pack: center;
+  -ms-flex-pack: center;
+  -webkit-justify-content: center;
+  -moz-justify-content: center;
+  justify-content: center;
+  -webkit-box-align: center;
+  -ms-flex-align: center;
+  -webkit-align-items: center;
+  -moz-align-items: center;
+  align-items: center;
+}
+.f-vcenter {
+  -webkit-box-align: center;
+  -ms-flex-align: center;
+  -webkit-align-items: center;
+  -moz-align-items: center;
+  align-items: center;
+}
+* {
+  -moz-box-sizing: border-box;
+  -webkit-box-sizing: border-box;
+  -o-box-sizing: border-box;
+  -ms-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.panel {
+  overflow: hidden;
+  text-align: left;
+  margin: 0;
+  border: 0;
+  -moz-border-radius: 0 0 0 0;
+  -webkit-border-radius: 0 0 0 0;
+  border-radius: 0 0 0 0;
+}
+.panel-header,
+.panel-body {
+  border-width: 1px;
+  border-style: solid;
+}
+.panel-header {
+  padding: 5px;
+  position: relative;
+}
+.panel-title {
+  background: url('images/blank.gif') no-repeat;
+}
+.panel-header-noborder {
+  border-width: 0 0 1px 0;
+}
+.panel-body {
+  overflow: auto;
+  border-top-width: 0;
+  padding: 0;
+}
+.panel-body-noheader {
+  border-top-width: 1px;
+}
+.panel-body-noborder {
+  border-width: 0px;
+}
+.panel-body-nobottom {
+  border-bottom-width: 0;
+}
+.panel-with-icon {
+  padding-left: 18px;
+}
+.panel-icon,
+.panel-tool {
+  position: absolute;
+  top: 50%;
+  margin-top: -8px;
+  height: 16px;
+  overflow: hidden;
+}
+.panel-icon {
+  left: 5px;
+  width: 16px;
+}
+.panel-tool {
+  right: 5px;
+  width: auto;
+}
+.panel-tool a {
+  display: inline-block;
+  width: 16px;
+  height: 16px;
+  opacity: 0.6;
+  filter: alpha(opacity=60);
+  margin: 0 0 0 2px;
+  vertical-align: top;
+}
+.panel-tool a:hover {
+  opacity: 1;
+  filter: alpha(opacity=100);
+  background-color: #eaf2ff;
+  -moz-border-radius: 3px 3px 3px 3px;
+  -webkit-border-radius: 3px 3px 3px 3px;
+  border-radius: 3px 3px 3px 3px;
+}
+.panel-loading {
+  padding: 11px 0px 10px 30px;
+}
+.panel-noscroll {
+  overflow: hidden;
+}
+.panel-fit,
+.panel-fit body {
+  height: 100%;
+  margin: 0;
+  padding: 0;
+  border: 0;
+  overflow: hidden;
+}
+.panel-loading {
+  background: url('images/loading.gif') no-repeat 10px 10px;
+}
+.panel-tool-close {
+  background: url('images/panel_tools.png') no-repeat -16px 0px;
+}
+.panel-tool-min {
+  background: url('images/panel_tools.png') no-repeat 0px 0px;
+}
+.panel-tool-max {
+  background: url('images/panel_tools.png') no-repeat 0px -16px;
+}
+.panel-tool-restore {
+  background: url('images/panel_tools.png') no-repeat -16px -16px;
+}
+.panel-tool-collapse {
+  background: url('images/panel_tools.png') no-repeat -32px 0;
+}
+.panel-tool-expand {
+  background: url('images/panel_tools.png') no-repeat -32px -16px;
+}
+.panel-header,
+.panel-body {
+  border-color: #95B8E7;
+}
+.panel-header {
+  background-color: #E0ECFF;
+  background: -webkit-linear-gradient(top,#EFF5FF 0,#E0ECFF 100%);
+  background: -moz-linear-gradient(top,#EFF5FF 0,#E0ECFF 100%);
+  background: -o-linear-gradient(top,#EFF5FF 0,#E0ECFF 100%);
+  background: linear-gradient(to bottom,#EFF5FF 0,#E0ECFF 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#EFF5FF,endColorstr=#E0ECFF,GradientType=0);
+  color: #0E2D5F;
+}
+.panel-body {
+  background-color: #ffffff;
+  color: #000000;
+  font-size: 14px;
+}
+.panel-title {
+  font-size: 14px;
+  font-weight: bold;
+  color: #0E2D5F;
+  height: 20px;
+  line-height: 20px;
+}
+.panel-footer {
+  border: 1px solid #95B8E7;
+  overflow: hidden;
+  background: #F4F4F4;
+  color: #000000;
+}
+.panel-footer-noborder {
+  border-width: 1px 0 0 0;
+}
+.panel-hleft,
+.panel-hright {
+  position: relative;
+}
+.panel-hleft>.panel-body,
+.panel-hright>.panel-body {
+  position: absolute;
+}
+.panel-hleft>.panel-header {
+  float: left;
+}
+.panel-hright>.panel-header {
+  float: right;
+}
+.panel-hleft>.panel-body {
+  border-top-width: 1px;
+  border-left-width: 0;
+}
+.panel-hright>.panel-body {
+  border-top-width: 1px;
+  border-right-width: 0;
+}
+.panel-hleft>.panel-body-nobottom {
+  border-bottom-width: 1px;
+  border-right-width: 0;
+}
+.panel-hright>.panel-body-nobottom {
+  border-bottom-width: 1px;
+  border-left-width: 0;
+}
+.panel-hleft>.panel-footer {
+  position: absolute;
+  right: 0;
+}
+.panel-hright>.panel-footer {
+  position: absolute;
+  left: 0;
+}
+.panel-hleft>.panel-header-noborder {
+  border-width: 0 1px 0 0;
+}
+.panel-hright>.panel-header-noborder {
+  border-width: 0 0 0 1px;
+}
+.panel-hleft>.panel-body-noborder {
+  border-width: 0;
+}
+.panel-hright>.panel-body-noborder {
+  border-width: 0;
+}
+.panel-hleft>.panel-body-noheader {
+  border-left-width: 1px;
+}
+.panel-hright>.panel-body-noheader {
+  border-right-width: 1px;
+}
+.panel-hleft>.panel-footer-noborder {
+  border-width: 0 0 0 1px;
+}
+.panel-hright>.panel-footer-noborder {
+  border-width: 0 1px 0 0;
+}
+.panel-hleft>.panel-header .panel-icon,
+.panel-hright>.panel-header .panel-icon {
+  margin-top: 0;
+  top: 5px;
+  left: 50%;
+  margin-left: -8px;
+}
+.panel-hleft>.panel-header .panel-title,
+.panel-hright>.panel-header .panel-title {
+  position: absolute;
+  min-width: 16px;
+  left: 25px;
+  top: 5px;
+  bottom: auto;
+  white-space: nowrap;
+  word-wrap: normal;
+  -webkit-transform: rotate(90deg);
+  -webkit-transform-origin: 0 0;
+  -moz-transform: rotate(90deg);
+  -moz-transform-origin: 0 0;
+  -o-transform: rotate(90deg);
+  -o-transform-origin: 0 0;
+  transform: rotate(90deg);
+  transform-origin: 0 0;
+}
+.panel-hleft>.panel-header .panel-title-up,
+.panel-hright>.panel-header .panel-title-up {
+  position: absolute;
+  min-width: 16px;
+  left: 21px;
+  top: auto;
+  bottom: 0px;
+  text-align: right;
+  white-space: nowrap;
+  word-wrap: normal;
+  -webkit-transform: rotate(-90deg);
+  -webkit-transform-origin: 0 0;
+  -moz-transform: rotate(-90deg);
+  -moz-transform-origin: 0 0;
+  -o-transform: rotate(-90deg);
+  -o-transform-origin: 0 0;
+  transform: rotate(-90deg);
+  transform-origin: 0 16px;
+}
+.panel-hleft>.panel-header .panel-with-icon.panel-title-up,
+.panel-hright>.panel-header .panel-with-icon.panel-title-up {
+  padding-left: 0;
+  padding-right: 18px;
+}
+.panel-hleft>.panel-header .panel-tool,
+.panel-hright>.panel-header .panel-tool {
+  top: auto;
+  bottom: 5px;
+  width: 16px;
+  height: auto;
+  left: 50%;
+  margin-left: -8px;
+  margin-top: 0;
+}
+.panel-hleft>.panel-header .panel-tool a,
+.panel-hright>.panel-header .panel-tool a {
+  margin: 2px 0 0 0;
+}
+.accordion {
+  overflow: hidden;
+  border-width: 1px;
+  border-style: solid;
+}
+.accordion .accordion-header {
+  border-width: 0 0 1px;
+  cursor: pointer;
+}
+.accordion .accordion-body {
+  border-width: 0 0 1px;
+}
+.accordion-noborder {
+  border-width: 0;
+}
+.accordion-noborder .accordion-header {
+  border-width: 0 0 1px;
+}
+.accordion-noborder .accordion-body {
+  border-width: 0 0 1px;
+}
+.accordion-collapse {
+  background: url('images/accordion_arrows.png') no-repeat 0 0;
+}
+.accordion-expand {
+  background: url('images/accordion_arrows.png') no-repeat -16px 0;
+}
+.accordion {
+  background: #ffffff;
+  border-color: #95B8E7;
+}
+.accordion .accordion-header {
+  background: #E0ECFF;
+  filter: none;
+}
+.accordion .accordion-header-selected {
+  background: #ffe48d;
+}
+.accordion .accordion-header-selected .panel-title {
+  color: #000000;
+}
+.accordion .panel-last > .accordion-header {
+  border-bottom-color: #E0ECFF;
+}
+.accordion .panel-last > .accordion-body {
+  border-bottom-color: #ffffff;
+}
+.accordion .panel-last > .accordion-header-selected,
+.accordion .panel-last > .accordion-header-border {
+  border-bottom-color: #95B8E7;
+}
+.accordion> .panel-hleft {
+  float: left;
+}
+.accordion> .panel-hleft>.panel-header {
+  border-width: 0 1px 0 0;
+}
+.accordion> .panel-hleft> .panel-body {
+  border-width: 0 1px 0 0;
+}
+.accordion> .panel-hleft.panel-last > .accordion-header {
+  border-right-color: #E0ECFF;
+}
+.accordion> .panel-hleft.panel-last > .accordion-body {
+  border-right-color: #ffffff;
+}
+.accordion> .panel-hleft.panel-last > .accordion-header-selected,
+.accordion> .panel-hleft.panel-last > .accordion-header-border {
+  border-right-color: #95B8E7;
+}
+.accordion> .panel-hright {
+  float: right;
+}
+.accordion> .panel-hright>.panel-header {
+  border-width: 0 0 0 1px;
+}
+.accordion> .panel-hright> .panel-body {
+  border-width: 0 0 0 1px;
+}
+.accordion> .panel-hright.panel-last > .accordion-header {
+  border-left-color: #E0ECFF;
+}
+.accordion> .panel-hright.panel-last > .accordion-body {
+  border-left-color: #ffffff;
+}
+.accordion> .panel-hright.panel-last > .accordion-header-selected,
+.accordion> .panel-hright.panel-last > .accordion-header-border {
+  border-left-color: #95B8E7;
+}
+.window {
+  overflow: hidden;
+  padding: 5px;
+  border-width: 1px;
+  border-style: solid;
+}
+.window .window-header {
+  background: transparent;
+  padding: 0px 0px 6px 0px;
+}
+.window .window-body {
+  border-width: 1px;
+  border-style: solid;
+  border-top-width: 0px;
+}
+.window .window-body-noheader {
+  border-top-width: 1px;
+}
+.window .panel-body-nobottom {
+  border-bottom-width: 0;
+}
+.window .window-header .panel-icon,
+.window .window-header .panel-tool {
+  top: 50%;
+  margin-top: -11px;
+}
+.window .window-header .panel-icon {
+  left: 1px;
+}
+.window .window-header .panel-tool {
+  right: 1px;
+}
+.window .window-header .panel-with-icon {
+  padding-left: 18px;
+}
+.window-proxy {
+  position: absolute;
+  overflow: hidden;
+}
+.window-proxy-mask {
+  position: absolute;
+  filter: alpha(opacity=5);
+  opacity: 0.05;
+}
+.window-mask {
+  position: absolute;
+  left: 0;
+  top: 0;
+  width: 100%;
+  height: 100%;
+  filter: alpha(opacity=40);
+  opacity: 0.40;
+  font-size: 1px;
+  overflow: hidden;
+}
+.window,
+.window-shadow {
+  position: absolute;
+  -moz-border-radius: 5px 5px 5px 5px;
+  -webkit-border-radius: 5px 5px 5px 5px;
+  border-radius: 5px 5px 5px 5px;
+}
+.window-shadow {
+  background: #ccc;
+  -moz-box-shadow: 2px 2px 3px #cccccc;
+  -webkit-box-shadow: 2px 2px 3px #cccccc;
+  box-shadow: 2px 2px 3px #cccccc;
+  filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2);
+}
+.window,
+.window .window-body {
+  border-color: #95B8E7;
+}
+.window {
+  background-color: #E0ECFF;
+  background: -webkit-linear-gradient(top,#EFF5FF 0,#E0ECFF 20%);
+  background: -moz-linear-gradient(top,#EFF5FF 0,#E0ECFF 20%);
+  background: -o-linear-gradient(top,#EFF5FF 0,#E0ECFF 20%);
+  background: linear-gradient(to bottom,#EFF5FF 0,#E0ECFF 20%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#EFF5FF,endColorstr=#E0ECFF,GradientType=0);
+}
+.window-proxy {
+  border: 1px dashed #95B8E7;
+}
+.window-proxy-mask,
+.window-mask {
+  background: #ccc;
+}
+.window .panel-footer {
+  border: 1px solid #95B8E7;
+  position: relative;
+  top: -1px;
+}
+.window-thinborder {
+  padding: 0;
+}
+.window-thinborder .window-header {
+  padding: 5px 5px 6px 5px;
+}
+.window-thinborder .window-body {
+  border-width: 0px;
+}
+.window-thinborder .window-footer {
+  border-left: transparent;
+  border-right: transparent;
+  border-bottom: transparent;
+}
+.window-thinborder .window-header .panel-icon,
+.window-thinborder .window-header .panel-tool {
+  margin-top: -9px;
+  margin-left: 5px;
+  margin-right: 5px;
+}
+.window-noborder {
+  border: 0;
+}
+.window.panel-hleft .window-header {
+  padding: 0 6px 0 0;
+}
+.window.panel-hright .window-header {
+  padding: 0 0 0 6px;
+}
+.window.panel-hleft>.panel-header .panel-title {
+  top: auto;
+  left: 16px;
+}
+.window.panel-hright>.panel-header .panel-title {
+  top: auto;
+  right: 16px;
+}
+.window.panel-hleft>.panel-header .panel-title-up,
+.window.panel-hright>.panel-header .panel-title-up {
+  bottom: 0;
+}
+.window.panel-hleft .window-body {
+  border-width: 1px 1px 1px 0;
+}
+.window.panel-hright .window-body {
+  border-width: 1px 0 1px 1px;
+}
+.window.panel-hleft .window-header .panel-icon {
+  top: 1px;
+  margin-top: 0;
+  left: 0;
+}
+.window.panel-hright .window-header .panel-icon {
+  top: 1px;
+  margin-top: 0;
+  left: auto;
+  right: 1px;
+}
+.window.panel-hleft .window-header .panel-tool,
+.window.panel-hright .window-header .panel-tool {
+  margin-top: 0;
+  top: auto;
+  bottom: 1px;
+  right: auto;
+  margin-right: 0;
+  left: 50%;
+  margin-left: -11px;
+}
+.window.panel-hright .window-header .panel-tool {
+  left: auto;
+  right: 1px;
+}
+.window-thinborder.panel-hleft .window-header {
+  padding: 5px 6px 5px 5px;
+}
+.window-thinborder.panel-hright .window-header {
+  padding: 5px 5px 5px 6px;
+}
+.window-thinborder.panel-hleft>.panel-header .panel-title {
+  left: 21px;
+}
+.window-thinborder.panel-hleft>.panel-header .panel-title-up,
+.window-thinborder.panel-hright>.panel-header .panel-title-up {
+  bottom: 5px;
+}
+.window-thinborder.panel-hleft .window-header .panel-icon,
+.window-thinborder.panel-hright .window-header .panel-icon {
+  margin-top: 5px;
+}
+.window-thinborder.panel-hleft .window-header .panel-tool,
+.window-thinborder.panel-hright .window-header .panel-tool {
+  left: 16px;
+  bottom: 5px;
+}
+.dialog-content {
+  overflow: auto;
+}
+.dialog-toolbar {
+  position: relative;
+  padding: 2px 5px;
+}
+.dialog-tool-separator {
+  float: left;
+  height: 24px;
+  border-left: 1px solid #ccc;
+  border-right: 1px solid #fff;
+  margin: 2px 1px;
+}
+.dialog-button {
+  position: relative;
+  top: -1px;
+  padding: 5px;
+  text-align: right;
+}
+.dialog-button .l-btn {
+  margin-left: 5px;
+}
+.dialog-toolbar,
+.dialog-button {
+  background: #F4F4F4;
+  border-width: 1px;
+  border-style: solid;
+}
+.dialog-toolbar {
+  border-color: #95B8E7 #95B8E7 #dddddd #95B8E7;
+}
+.dialog-button {
+  border-color: #dddddd #95B8E7 #95B8E7 #95B8E7;
+}
+.window-thinborder .dialog-toolbar {
+  border-left: transparent;
+  border-right: transparent;
+  border-top-color: #F4F4F4;
+}
+.window-thinborder .dialog-button {
+  top: 0px;
+  padding: 5px 8px 8px 8px;
+  border-left: transparent;
+  border-right: transparent;
+  border-bottom: transparent;
+}
+.drawer.window-shadow {
+  box-shadow: 0 4px 12px #ccc;
+  border-radius: 0;
+  position: fixed;
+}
+.drawer.layout-collapsed {
+  box-shadow: none;
+}
+.drawer-mask.window-mask {
+  position: fixed;
+}
+.drawer.layout-panel-east,
+.drawer.layout-panel-west {
+  bottom: 0;
+}
+.l-btn {
+  text-decoration: none;
+  display: inline-block;
+  overflow: hidden;
+  margin: 0;
+  padding: 0;
+  cursor: pointer;
+  outline: none;
+  text-align: center;
+  vertical-align: middle;
+  line-height: normal;
+}
+.l-btn-plain {
+  border-width: 0;
+  padding: 1px;
+}
+.l-btn-left {
+  display: inline-block;
+  position: relative;
+  overflow: hidden;
+  margin: 0;
+  padding: 0;
+  vertical-align: top;
+}
+.l-btn-text {
+  display: inline-block;
+  vertical-align: top;
+  width: auto;
+  line-height: 28px;
+  font-size: 14px;
+  padding: 0;
+  margin: 0 6px;
+}
+.l-btn-icon {
+  display: inline-block;
+  width: 16px;
+  height: 16px;
+  line-height: 16px;
+  position: absolute;
+  top: 50%;
+  margin-top: -8px;
+  font-size: 1px;
+}
+.l-btn span span .l-btn-empty {
+  display: inline-block;
+  margin: 0;
+  width: 16px;
+  height: 24px;
+  font-size: 1px;
+  vertical-align: top;
+}
+.l-btn span .l-btn-icon-left {
+  padding: 0 0 0 20px;
+  background-position: left center;
+}
+.l-btn span .l-btn-icon-right {
+  padding: 0 20px 0 0;
+  background-position: right center;
+}
+.l-btn-icon-left .l-btn-text {
+  margin: 0 6px 0 26px;
+}
+.l-btn-icon-left .l-btn-icon {
+  left: 6px;
+}
+.l-btn-icon-right .l-btn-text {
+  margin: 0 26px 0 6px;
+}
+.l-btn-icon-right .l-btn-icon {
+  right: 6px;
+}
+.l-btn-icon-top .l-btn-text {
+  margin: 20px 4px 0 4px;
+}
+.l-btn-icon-top .l-btn-icon {
+  top: 4px;
+  left: 50%;
+  margin: 0 0 0 -8px;
+}
+.l-btn-icon-bottom .l-btn-text {
+  margin: 0 4px 20px 4px;
+}
+.l-btn-icon-bottom .l-btn-icon {
+  top: auto;
+  bottom: 4px;
+  left: 50%;
+  margin: 0 0 0 -8px;
+}
+.l-btn-left .l-btn-empty {
+  margin: 0 6px;
+  width: 16px;
+}
+.l-btn-plain:hover {
+  padding: 0;
+}
+.l-btn-focus {
+  outline: #0000FF dotted thin;
+}
+.l-btn-large .l-btn-text {
+  line-height: 44px;
+}
+.l-btn-large .l-btn-icon {
+  width: 32px;
+  height: 32px;
+  line-height: 32px;
+  margin-top: -16px;
+}
+.l-btn-large .l-btn-icon-left .l-btn-text {
+  margin-left: 40px;
+}
+.l-btn-large .l-btn-icon-right .l-btn-text {
+  margin-right: 40px;
+}
+.l-btn-large .l-btn-icon-top .l-btn-text {
+  margin-top: 36px;
+  line-height: 24px;
+  min-width: 32px;
+}
+.l-btn-large .l-btn-icon-top .l-btn-icon {
+  margin: 0 0 0 -16px;
+}
+.l-btn-large .l-btn-icon-bottom .l-btn-text {
+  margin-bottom: 36px;
+  line-height: 24px;
+  min-width: 32px;
+}
+.l-btn-large .l-btn-icon-bottom .l-btn-icon {
+  margin: 0 0 0 -16px;
+}
+.l-btn-large .l-btn-left .l-btn-empty {
+  margin: 0 6px;
+  width: 32px;
+}
+.l-btn {
+  color: #444;
+  background: #fafafa;
+  background-repeat: repeat-x;
+  border: 1px solid #bbb;
+  background: -webkit-linear-gradient(top,#ffffff 0,#eeeeee 100%);
+  background: -moz-linear-gradient(top,#ffffff 0,#eeeeee 100%);
+  background: -o-linear-gradient(top,#ffffff 0,#eeeeee 100%);
+  background: linear-gradient(to bottom,#ffffff 0,#eeeeee 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#eeeeee,GradientType=0);
+  -moz-border-radius: 5px 5px 5px 5px;
+  -webkit-border-radius: 5px 5px 5px 5px;
+  border-radius: 5px 5px 5px 5px;
+}
+.l-btn:hover {
+  background: #eaf2ff;
+  color: #000000;
+  border: 1px solid #b7d2ff;
+  filter: none;
+}
+.l-btn-plain {
+  background: transparent;
+  border-width: 0;
+  filter: none;
+}
+.l-btn-outline {
+  border-width: 1px;
+  border-color: #b7d2ff;
+  padding: 0;
+}
+.l-btn-plain:hover {
+  background: #eaf2ff;
+  color: #000000;
+  border: 1px solid #b7d2ff;
+  -moz-border-radius: 5px 5px 5px 5px;
+  -webkit-border-radius: 5px 5px 5px 5px;
+  border-radius: 5px 5px 5px 5px;
+}
+.l-btn-disabled,
+.l-btn-disabled:hover {
+  opacity: 0.5;
+  cursor: default;
+  background: #fafafa;
+  color: #444;
+  background: -webkit-linear-gradient(top,#ffffff 0,#eeeeee 100%);
+  background: -moz-linear-gradient(top,#ffffff 0,#eeeeee 100%);
+  background: -o-linear-gradient(top,#ffffff 0,#eeeeee 100%);
+  background: linear-gradient(to bottom,#ffffff 0,#eeeeee 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#eeeeee,GradientType=0);
+}
+.l-btn-disabled .l-btn-text,
+.l-btn-disabled .l-btn-icon {
+  filter: alpha(opacity=50);
+}
+.l-btn-plain-disabled,
+.l-btn-plain-disabled:hover {
+  background: transparent;
+  filter: alpha(opacity=50);
+}
+.l-btn-selected,
+.l-btn-selected:hover {
+  background: #ddd;
+  filter: none;
+}
+.l-btn-plain-selected,
+.l-btn-plain-selected:hover {
+  background: #ddd;
+}
+.textbox {
+  position: relative;
+  border: 1px solid #95B8E7;
+  background-color: #fff;
+  vertical-align: middle;
+  display: inline-block;
+  overflow: hidden;
+  white-space: nowrap;
+  margin: 0;
+  padding: 0;
+  -moz-border-radius: 5px 5px 5px 5px;
+  -webkit-border-radius: 5px 5px 5px 5px;
+  border-radius: 5px 5px 5px 5px;
+}
+.textbox .textbox-text {
+  font-size: 14px;
+  border: 0;
+  margin: 0;
+  padding: 0 4px;
+  white-space: normal;
+  vertical-align: top;
+  outline-style: none;
+  resize: none;
+  -moz-border-radius: 5px 5px 5px 5px;
+  -webkit-border-radius: 5px 5px 5px 5px;
+  border-radius: 5px 5px 5px 5px;
+  height: 28px;
+  line-height: 28px;
+}
+.textbox textarea.textbox-text {
+  line-height: normal;
+}
+.textbox.textbox-autoheight {
+  height: auto;
+}
+.textbox.textbox-autoheight textarea.textbox-text {
+  padding: 6px 4px;
+  overflow: hidden;
+  line-height: 16px;
+}
+.textbox .textbox-text::-ms-clear,
+.textbox .textbox-text::-ms-reveal {
+  display: none;
+}
+.textbox textarea.textbox-text {
+  white-space: pre-wrap;
+}
+.textbox .textbox-prompt {
+  font-size: 14px;
+  color: #aaa;
+}
+.textbox .textbox-bgicon {
+  background-position: 3px center;
+  padding-left: 21px;
+}
+.textbox .textbox-button,
+.textbox .textbox-button:hover {
+  position: absolute;
+  top: 0;
+  padding: 0;
+  vertical-align: top;
+  -moz-border-radius: 0 0 0 0;
+  -webkit-border-radius: 0 0 0 0;
+  border-radius: 0 0 0 0;
+}
+.textbox .textbox-button-right,
+.textbox .textbox-button-right:hover {
+  right: 0;
+  border-width: 0 0 0 1px;
+}
+.textbox .textbox-button-left,
+.textbox .textbox-button-left:hover {
+  left: 0;
+  border-width: 0 1px 0 0;
+}
+.textbox .textbox-button-top,
+.textbox .textbox-button-top:hover {
+  left: 0;
+  border-width: 0 0 1px 0;
+}
+.textbox .textbox-button-bottom,
+.textbox .textbox-button-bottom:hover {
+  top: auto;
+  bottom: 0;
+  left: 0;
+  border-width: 1px 0 0 0;
+}
+.textbox-addon {
+  position: absolute;
+  top: 0;
+}
+.textbox-label {
+  display: inline-block;
+  width: 80px;
+  height: 30px;
+  line-height: 30px;
+  vertical-align: middle;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  margin: 0;
+  padding-right: 5px;
+}
+.textbox-label-after {
+  padding-left: 5px;
+  padding-right: 0;
+}
+.textbox-label-top {
+  display: block;
+  width: auto;
+  padding: 0;
+}
+.textbox-disabled,
+.textbox-label-disabled {
+  opacity: 0.6;
+  filter: alpha(opacity=60);
+}
+.textbox-icon {
+  display: inline-block;
+  width: 18px;
+  height: 20px;
+  overflow: hidden;
+  vertical-align: top;
+  background-position: center center;
+  cursor: pointer;
+  opacity: 0.6;
+  filter: alpha(opacity=60);
+  text-decoration: none;
+  outline-style: none;
+}
+.textbox-icon-disabled,
+.textbox-icon-readonly {
+  cursor: default;
+}
+.textbox-icon:hover {
+  opacity: 1.0;
+  filter: alpha(opacity=100);
+}
+.textbox-icon-disabled:hover {
+  opacity: 0.6;
+  filter: alpha(opacity=60);
+}
+.textbox-focused {
+  border-color: #6b9cde;
+  -moz-box-shadow: 0 0 3px 0 #95B8E7;
+  -webkit-box-shadow: 0 0 3px 0 #95B8E7;
+  box-shadow: 0 0 3px 0 #95B8E7;
+}
+.textbox-invalid {
+  border-color: #ffa8a8;
+  background-color: #fff3f3;
+}
+.form-floating-label.form-field .textbox-text {
+  padding: 0;
+}
+.form-floating-label.form-field .textbox-label {
+  position: relative;
+  height: 20px;
+  line-height: 20px;
+  transition: all .3s;
+  font-size: 12px;
+  z-index: 9;
+}
+.form-floating-label.form-field-empty .textbox-label {
+  cursor: text;
+  font-size: 14px;
+  transform: translate(0,25px);
+}
+.form-floating-label.form-field-empty.form-field-focused .textbox-label {
+  cursor: default;
+  font-size: 12px;
+  transform: translate(0,0);
+}
+.passwordbox-open {
+  background: url('images/passwordbox_open.png') no-repeat center center;
+}
+.passwordbox-close {
+  background: url('images/passwordbox_close.png') no-repeat center center;
+}
+.filebox .textbox-value {
+  vertical-align: top;
+  position: absolute;
+  top: 0;
+  left: -5000px;
+}
+.filebox-label {
+  display: inline-block;
+  position: absolute;
+  width: 100%;
+  height: 100%;
+  cursor: pointer;
+  left: 0;
+  top: 0;
+  z-index: 10;
+  background: url('images/blank.gif') no-repeat;
+}
+.l-btn-disabled .filebox-label {
+  cursor: default;
+}
+.combo-arrow {
+  width: 18px;
+  height: 20px;
+  overflow: hidden;
+  display: inline-block;
+  vertical-align: top;
+  cursor: pointer;
+  opacity: 0.6;
+  filter: alpha(opacity=60);
+}
+.combo-arrow-hover {
+  opacity: 1.0;
+  filter: alpha(opacity=100);
+}
+.combo-panel {
+  overflow: auto;
+}
+.combo-arrow {
+  background: url('images/combo_arrow.png') no-repeat center center;
+}
+.combo-panel {
+  background-color: #ffffff;
+}
+.combo-arrow {
+  background-color: #E0ECFF;
+}
+.combo-arrow-hover {
+  background-color: #eaf2ff;
+}
+.combo-arrow:hover {
+  background-color: #eaf2ff;
+}
+.combo .textbox-icon-disabled:hover {
+  cursor: default;
+}
+.combobox-item,
+.combobox-group,
+.combobox-stick {
+  font-size: 14px;
+  padding: 6px 4px;
+  line-height: 20px;
+}
+.combobox-item-disabled {
+  opacity: 0.5;
+  filter: alpha(opacity=50);
+}
+.combobox-gitem {
+  padding-left: 10px;
+}
+.combobox-group,
+.combobox-stick {
+  font-weight: bold;
+}
+.combobox-stick {
+  position: absolute;
+  top: 1px;
+  left: 1px;
+  right: 1px;
+  background: inherit;
+}
+.combobox-item-hover {
+  background-color: #eaf2ff;
+  color: #000000;
+}
+.combobox-item-selected {
+  background-color: #ffe48d;
+  color: #000000;
+}
+.combobox-icon {
+  display: inline-block;
+  width: 16px;
+  height: 16px;
+  vertical-align: middle;
+  margin-right: 2px;
+}
+.tagbox {
+  cursor: text;
+}
+.tagbox .textbox-text {
+  float: left;
+}
+.tagbox-label {
+  position: relative;
+  display: block;
+  margin: 4px 0 0 4px;
+  padding: 0 20px 0 4px;
+  float: left;
+  vertical-align: top;
+  text-decoration: none;
+  -moz-border-radius: 5px 5px 5px 5px;
+  -webkit-border-radius: 5px 5px 5px 5px;
+  border-radius: 5px 5px 5px 5px;
+  background: #eaf2ff;
+  color: #000000;
+}
+.tagbox-remove {
+  background: url('images/tagbox_icons.png') no-repeat -16px center;
+  position: absolute;
+  display: block;
+  width: 16px;
+  height: 16px;
+  right: 2px;
+  top: 50%;
+  margin-top: -8px;
+  opacity: 0.6;
+  filter: alpha(opacity=60);
+}
+.tagbox-remove:hover {
+  opacity: 1;
+  filter: alpha(opacity=100);
+}
+.textbox-disabled .tagbox-label {
+  cursor: default;
+}
+.textbox-disabled .tagbox-remove:hover {
+  cursor: default;
+  opacity: 0.6;
+  filter: alpha(opacity=60);
+}
+.layout {
+  position: relative;
+  overflow: hidden;
+  margin: 0;
+  padding: 0;
+  z-index: 0;
+}
+.layout-panel {
+  position: absolute;
+  overflow: hidden;
+}
+.layout-body {
+  min-width: 1px;
+  min-height: 1px;
+}
+.layout-panel-east,
+.layout-panel-west {
+  z-index: 2;
+}
+.layout-panel-north,
+.layout-panel-south {
+  z-index: 3;
+}
+.layout-expand {
+  position: absolute;
+  padding: 0px;
+  font-size: 1px;
+  cursor: pointer;
+  z-index: 1;
+}
+.layout-expand .panel-header,
+.layout-expand .panel-body {
+  background: transparent;
+  filter: none;
+  overflow: hidden;
+}
+.layout-expand .panel-header {
+  border-bottom-width: 0px;
+}
+.layout-expand .panel-body {
+  position: relative;
+}
+.layout-expand .panel-body .panel-icon {
+  margin-top: 0;
+  top: 0;
+  left: 50%;
+  margin-left: -8px;
+}
+.layout-expand-west .panel-header .panel-icon,
+.layout-expand-east .panel-header .panel-icon {
+  display: none;
+}
+.layout-expand-title {
+  position: absolute;
+  top: 0;
+  left: 21px;
+  white-space: nowrap;
+  word-wrap: normal;
+  -webkit-transform: rotate(90deg);
+  -webkit-transform-origin: 0 0;
+  -moz-transform: rotate(90deg);
+  -moz-transform-origin: 0 0;
+  -o-transform: rotate(90deg);
+  -o-transform-origin: 0 0;
+  transform: rotate(90deg);
+  transform-origin: 0 0;
+}
+.layout-expand-title-up {
+  position: absolute;
+  top: 0;
+  left: 0;
+  text-align: right;
+  padding-left: 5px;
+  white-space: nowrap;
+  word-wrap: normal;
+  -webkit-transform: rotate(-90deg);
+  -webkit-transform-origin: 0 0;
+  -moz-transform: rotate(-90deg);
+  -moz-transform-origin: 0 0;
+  -o-transform: rotate(-90deg);
+  -o-transform-origin: 0 0;
+  transform: rotate(-90deg);
+  transform-origin: 0 0;
+}
+.layout-expand-with-icon {
+  top: 18px;
+}
+.layout-expand .panel-body-noheader .layout-expand-title,
+.layout-expand .panel-body-noheader .panel-icon {
+  top: 5px;
+}
+.layout-expand .panel-body-noheader .layout-expand-with-icon {
+  top: 23px;
+}
+.layout-split-proxy-h,
+.layout-split-proxy-v {
+  position: absolute;
+  font-size: 1px;
+  display: none;
+  z-index: 5;
+}
+.layout-split-proxy-h {
+  width: 5px;
+  cursor: e-resize;
+}
+.layout-split-proxy-v {
+  height: 5px;
+  cursor: n-resize;
+}
+.layout-mask {
+  position: absolute;
+  background: #fafafa;
+  filter: alpha(opacity=10);
+  opacity: 0.10;
+  z-index: 4;
+}
+.layout-button-up {
+  background: url('images/layout_arrows.png') no-repeat -16px -16px;
+}
+.layout-button-down {
+  background: url('images/layout_arrows.png') no-repeat -16px 0;
+}
+.layout-button-left {
+  background: url('images/layout_arrows.png') no-repeat 0 0;
+}
+.layout-button-right {
+  background: url('images/layout_arrows.png') no-repeat 0 -16px;
+}
+.layout-split-proxy-h,
+.layout-split-proxy-v {
+  background-color: #aac5e7;
+}
+.layout-split-north {
+  border-bottom: 5px solid #E6EEF8;
+}
+.layout-split-south {
+  border-top: 5px solid #E6EEF8;
+}
+.layout-split-east {
+  border-left: 5px solid #E6EEF8;
+}
+.layout-split-west {
+  border-right: 5px solid #E6EEF8;
+}
+.layout-expand {
+  background-color: #E0ECFF;
+}
+.layout-expand-over {
+  background-color: #E0ECFF;
+}
+.tabs-container {
+  overflow: hidden;
+}
+.tabs-header {
+  border-width: 1px;
+  border-style: solid;
+  border-bottom-width: 0;
+  position: relative;
+  padding: 0;
+  padding-top: 2px;
+  overflow: hidden;
+}
+.tabs-scroller-left,
+.tabs-scroller-right {
+  position: absolute;
+  top: auto;
+  bottom: 0;
+  width: 18px;
+  font-size: 1px;
+  display: none;
+  cursor: pointer;
+  border-width: 1px;
+  border-style: solid;
+}
+.tabs-scroller-left {
+  left: 0;
+}
+.tabs-scroller-right {
+  right: 0;
+}
+.tabs-tool {
+  position: absolute;
+  bottom: 0;
+  padding: 1px;
+  overflow: hidden;
+  border-width: 1px;
+  border-style: solid;
+}
+.tabs-header-plain .tabs-tool {
+  padding: 0 1px;
+}
+.tabs-wrap {
+  position: relative;
+  left: 0;
+  overflow: hidden;
+  width: 100%;
+  margin: 0;
+  padding: 0;
+}
+.tabs-scrolling {
+  margin-left: 18px;
+  margin-right: 18px;
+}
+.tabs-disabled {
+  opacity: 0.3;
+  filter: alpha(opacity=30);
+}
+.tabs {
+  list-style-type: none;
+  height: 26px;
+  margin: 0px;
+  padding: 0px;
+  padding-left: 4px;
+  width: 50000px;
+  border-style: solid;
+  border-width: 0 0 1px 0;
+}
+.tabs li {
+  float: left;
+  display: inline-block;
+  margin: 0 4px -1px 0;
+  padding: 0;
+  position: relative;
+  border: 0;
+}
+.tabs li .tabs-inner {
+  display: inline-block;
+  text-decoration: none;
+  cursor: hand;
+  cursor: pointer;
+  margin: 0;
+  padding: 0 10px;
+  height: 25px;
+  line-height: 25px;
+  text-align: center;
+  white-space: nowrap;
+  border-width: 1px;
+  border-style: solid;
+  -moz-border-radius: 5px 5px 0 0;
+  -webkit-border-radius: 5px 5px 0 0;
+  border-radius: 5px 5px 0 0;
+}
+.tabs li.tabs-selected .tabs-inner {
+  font-weight: bold;
+  outline: none;
+}
+.tabs li.tabs-selected .tabs-inner:hover {
+  cursor: default;
+  pointer: default;
+}
+.tabs li .tabs-close,
+.tabs-p-tool {
+  position: absolute;
+  font-size: 1px;
+  display: block;
+  height: 12px;
+  padding: 0;
+  top: 50%;
+  margin-top: -6px;
+  overflow: hidden;
+}
+.tabs li .tabs-close {
+  width: 12px;
+  right: 5px;
+  opacity: 0.6;
+  filter: alpha(opacity=60);
+}
+.tabs-p-tool {
+  right: 16px;
+}
+.tabs-p-tool a {
+  display: inline-block;
+  font-size: 1px;
+  width: 12px;
+  height: 12px;
+  margin: 0;
+  opacity: 0.6;
+  filter: alpha(opacity=60);
+}
+.tabs li .tabs-close:hover,
+.tabs-p-tool a:hover {
+  opacity: 1;
+  filter: alpha(opacity=100);
+  cursor: hand;
+  cursor: pointer;
+}
+.tabs-with-icon {
+  padding-left: 18px;
+}
+.tabs-icon {
+  position: absolute;
+  width: 16px;
+  height: 16px;
+  left: 10px;
+  top: 50%;
+  margin-top: -8px;
+}
+.tabs-title {
+  font-size: 14px;
+}
+.tabs-closable {
+  padding-right: 8px;
+}
+.tabs-panels {
+  margin: 0px;
+  padding: 0px;
+  border-width: 1px;
+  border-style: solid;
+  border-top-width: 0;
+  overflow: hidden;
+}
+.tabs-header-bottom {
+  border-width: 0 1px 1px 1px;
+  padding: 0 0 2px 0;
+}
+.tabs-header-bottom .tabs {
+  border-width: 1px 0 0 0;
+}
+.tabs-header-bottom .tabs li {
+  margin: -1px 4px 0 0;
+}
+.tabs-header-bottom .tabs li .tabs-inner {
+  -moz-border-radius: 0 0 5px 5px;
+  -webkit-border-radius: 0 0 5px 5px;
+  border-radius: 0 0 5px 5px;
+}
+.tabs-header-bottom .tabs-tool {
+  top: 0;
+}
+.tabs-header-bottom .tabs-scroller-left,
+.tabs-header-bottom .tabs-scroller-right {
+  top: 0;
+  bottom: auto;
+}
+.tabs-panels-top {
+  border-width: 1px 1px 0 1px;
+}
+.tabs-header-left {
+  float: left;
+  border-width: 1px 0 1px 1px;
+  padding: 0;
+}
+.tabs-header-right {
+  float: right;
+  border-width: 1px 1px 1px 0;
+  padding: 0;
+}
+.tabs-header-left .tabs-wrap,
+.tabs-header-right .tabs-wrap {
+  height: 100%;
+}
+.tabs-header-left .tabs {
+  height: 100%;
+  padding: 4px 0 0 2px;
+  border-width: 0 1px 0 0;
+}
+.tabs-header-right .tabs {
+  height: 100%;
+  padding: 4px 2px 0 0;
+  border-width: 0 0 0 1px;
+}
+.tabs-header-left .tabs li,
+.tabs-header-right .tabs li {
+  display: block;
+  width: 100%;
+  position: relative;
+}
+.tabs-header-left .tabs li {
+  left: auto;
+  right: 0;
+  margin: 0 -1px 4px 0;
+  float: right;
+}
+.tabs-header-right .tabs li {
+  left: 0;
+  right: auto;
+  margin: 0 0 4px -1px;
+  float: left;
+}
+.tabs-justified li .tabs-inner {
+  padding-left: 0;
+  padding-right: 0;
+}
+.tabs-header-left .tabs li .tabs-inner {
+  display: block;
+  text-align: left;
+  padding-left: 10px;
+  padding-right: 10px;
+  -moz-border-radius: 5px 0 0 5px;
+  -webkit-border-radius: 5px 0 0 5px;
+  border-radius: 5px 0 0 5px;
+}
+.tabs-header-right .tabs li .tabs-inner {
+  display: block;
+  text-align: left;
+  padding-left: 10px;
+  padding-right: 10px;
+  -moz-border-radius: 0 5px 5px 0;
+  -webkit-border-radius: 0 5px 5px 0;
+  border-radius: 0 5px 5px 0;
+}
+.tabs-panels-right {
+  float: right;
+  border-width: 1px 1px 1px 0;
+}
+.tabs-panels-left {
+  float: left;
+  border-width: 1px 0 1px 1px;
+}
+.tabs-header-noborder,
+.tabs-panels-noborder {
+  border: 0px;
+}
+.tabs-header-plain {
+  border: 0px;
+  background: transparent;
+}
+.tabs-pill {
+  padding-bottom: 3px;
+}
+.tabs-header-bottom .tabs-pill {
+  padding-top: 3px;
+  padding-bottom: 0;
+}
+.tabs-header-left .tabs-pill {
+  padding-right: 3px;
+}
+.tabs-header-right .tabs-pill {
+  padding-left: 3px;
+}
+.tabs-header .tabs-pill li .tabs-inner {
+  -moz-border-radius: 5px 5px 5px 5px;
+  -webkit-border-radius: 5px 5px 5px 5px;
+  border-radius: 5px 5px 5px 5px;
+}
+.tabs-header-narrow,
+.tabs-header-narrow .tabs-narrow {
+  padding: 0;
+}
+.tabs-narrow li,
+.tabs-header-bottom .tabs-narrow li {
+  margin-left: 0;
+  margin-right: -1px;
+}
+.tabs-narrow li.tabs-last,
+.tabs-header-bottom .tabs-narrow li.tabs-last {
+  margin-right: 0;
+}
+.tabs-header-left .tabs-narrow,
+.tabs-header-right .tabs-narrow {
+  padding-top: 0;
+}
+.tabs-header-left .tabs-narrow li {
+  margin-bottom: -1px;
+  margin-right: -1px;
+}
+.tabs-header-left .tabs-narrow li.tabs-last,
+.tabs-header-right .tabs-narrow li.tabs-last {
+  margin-bottom: 0;
+}
+.tabs-header-right .tabs-narrow li {
+  margin-bottom: -1px;
+  margin-left: -1px;
+}
+.tabs-scroller-left {
+  background: #E0ECFF url('images/tabs_icons.png') no-repeat 1px center;
+}
+.tabs-scroller-right {
+  background: #E0ECFF url('images/tabs_icons.png') no-repeat -15px center;
+}
+.tabs li .tabs-close {
+  background: url('images/tabs_icons.png') no-repeat -34px center;
+}
+.tabs li .tabs-inner:hover {
+  background: #eaf2ff;
+  color: #000000;
+  filter: none;
+}
+.tabs li.tabs-selected .tabs-inner {
+  background-color: #ffffff;
+  color: #0E2D5F;
+  background: -webkit-linear-gradient(top,#EFF5FF 0,#ffffff 100%);
+  background: -moz-linear-gradient(top,#EFF5FF 0,#ffffff 100%);
+  background: -o-linear-gradient(top,#EFF5FF 0,#ffffff 100%);
+  background: linear-gradient(to bottom,#EFF5FF 0,#ffffff 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#EFF5FF,endColorstr=#ffffff,GradientType=0);
+}
+.tabs-header-bottom .tabs li.tabs-selected .tabs-inner {
+  background: -webkit-linear-gradient(top,#ffffff 0,#EFF5FF 100%);
+  background: -moz-linear-gradient(top,#ffffff 0,#EFF5FF 100%);
+  background: -o-linear-gradient(top,#ffffff 0,#EFF5FF 100%);
+  background: linear-gradient(to bottom,#ffffff 0,#EFF5FF 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#EFF5FF,GradientType=0);
+}
+.tabs-header-left .tabs li.tabs-selected .tabs-inner {
+  background: -webkit-linear-gradient(left,#EFF5FF 0,#ffffff 100%);
+  background: -moz-linear-gradient(left,#EFF5FF 0,#ffffff 100%);
+  background: -o-linear-gradient(left,#EFF5FF 0,#ffffff 100%);
+  background: linear-gradient(to right,#EFF5FF 0,#ffffff 100%);
+  background-repeat: repeat-y;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#EFF5FF,endColorstr=#ffffff,GradientType=1);
+}
+.tabs-header-right .tabs li.tabs-selected .tabs-inner {
+  background: -webkit-linear-gradient(left,#ffffff 0,#EFF5FF 100%);
+  background: -moz-linear-gradient(left,#ffffff 0,#EFF5FF 100%);
+  background: -o-linear-gradient(left,#ffffff 0,#EFF5FF 100%);
+  background: linear-gradient(to right,#ffffff 0,#EFF5FF 100%);
+  background-repeat: repeat-y;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#EFF5FF,GradientType=1);
+}
+.tabs li .tabs-inner {
+  color: #0E2D5F;
+  background-color: #E0ECFF;
+  background: -webkit-linear-gradient(top,#EFF5FF 0,#E0ECFF 100%);
+  background: -moz-linear-gradient(top,#EFF5FF 0,#E0ECFF 100%);
+  background: -o-linear-gradient(top,#EFF5FF 0,#E0ECFF 100%);
+  background: linear-gradient(to bottom,#EFF5FF 0,#E0ECFF 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#EFF5FF,endColorstr=#E0ECFF,GradientType=0);
+}
+.tabs-header,
+.tabs-tool {
+  background-color: #E0ECFF;
+}
+.tabs-header-plain {
+  background: transparent;
+}
+.tabs-header,
+.tabs-scroller-left,
+.tabs-scroller-right,
+.tabs-tool,
+.tabs,
+.tabs-panels,
+.tabs li .tabs-inner,
+.tabs li.tabs-selected .tabs-inner,
+.tabs-header-bottom .tabs li.tabs-selected .tabs-inner,
+.tabs-header-left .tabs li.tabs-selected .tabs-inner,
+.tabs-header-right .tabs li.tabs-selected .tabs-inner {
+  border-color: #95B8E7;
+}
+.tabs-p-tool a:hover,
+.tabs li a:hover.tabs-close,
+.tabs-scroller-over {
+  background-color: #eaf2ff;
+}
+.tabs li.tabs-selected .tabs-inner {
+  border-bottom: 1px solid #ffffff;
+}
+.tabs-header-bottom .tabs li.tabs-selected .tabs-inner {
+  border-top: 1px solid #ffffff;
+}
+.tabs-header-left .tabs li.tabs-selected .tabs-inner {
+  border-right: 1px solid #ffffff;
+}
+.tabs-header-right .tabs li.tabs-selected .tabs-inner {
+  border-left: 1px solid #ffffff;
+}
+.tabs-header .tabs-pill li.tabs-selected .tabs-inner {
+  background: #ffe48d;
+  color: #000000;
+  filter: none;
+  border-color: #95B8E7;
+}
+.datagrid .panel-body {
+  overflow: hidden;
+  position: relative;
+}
+.datagrid-view {
+  position: relative;
+  overflow: hidden;
+}
+.datagrid-view1,
+.datagrid-view2 {
+  position: absolute;
+  overflow: hidden;
+  top: 0;
+}
+.datagrid-view1 {
+  left: 0;
+}
+.datagrid-view2 {
+  right: 0;
+}
+.datagrid-mask {
+  position: absolute;
+  left: 0;
+  top: 0;
+  width: 100%;
+  height: 100%;
+  opacity: 0.3;
+  filter: alpha(opacity=30);
+  display: none;
+}
+.datagrid-mask-msg {
+  position: absolute;
+  top: 50%;
+  margin-top: -20px;
+  padding: 10px 5px 10px 30px;
+  width: auto;
+  height: 16px;
+  border-width: 2px;
+  border-style: solid;
+  display: none;
+}
+.datagrid-empty {
+  position: absolute;
+  left: 0;
+  top: 0;
+  width: 100%;
+  height: 25px;
+  line-height: 25px;
+  text-align: center;
+}
+.datagrid-sort-icon {
+  padding: 0;
+  display: none;
+}
+.datagrid-toolbar {
+  height: auto;
+  padding: 1px 2px;
+  border-width: 0 0 1px 0;
+  border-style: solid;
+}
+.datagrid-btn-separator {
+  float: left;
+  height: 24px;
+  border-left: 1px solid #ccc;
+  border-right: 1px solid #fff;
+  margin: 2px 1px;
+}
+.datagrid .datagrid-pager {
+  display: block;
+  margin: 0;
+  border-width: 1px 0 0 0;
+  border-style: solid;
+}
+.datagrid .datagrid-pager-top {
+  border-width: 0 0 1px 0;
+}
+.datagrid-header {
+  overflow: hidden;
+  cursor: default;
+  border-width: 0 0 1px 0;
+  border-style: solid;
+}
+.datagrid-header-inner {
+  float: left;
+  width: 10000px;
+}
+.datagrid-header-row,
+.datagrid-row {
+  height: 32px;
+}
+.datagrid-header td,
+.datagrid-body td,
+.datagrid-footer td {
+  border-width: 0 1px 1px 0;
+  border-style: dotted;
+  margin: 0;
+  padding: 0;
+}
+.datagrid-cell,
+.datagrid-cell-group,
+.datagrid-header-rownumber,
+.datagrid-cell-rownumber {
+  margin: 0;
+  padding: 0 4px;
+  white-space: nowrap;
+  word-wrap: normal;
+  overflow: hidden;
+  height: 18px;
+  line-height: 18px;
+  font-size: 14px;
+}
+.datagrid-header .datagrid-cell {
+  height: auto;
+}
+.datagrid-header .datagrid-cell span {
+  font-size: 14px;
+}
+.datagrid-cell-group {
+  text-align: center;
+  text-overflow: ellipsis;
+}
+.datagrid-header-rownumber,
+.datagrid-cell-rownumber {
+  width: 30px;
+  text-align: center;
+  margin: 0;
+  padding: 0;
+}
+.datagrid-body {
+  margin: 0;
+  padding: 0;
+  overflow: auto;
+  zoom: 1;
+}
+.datagrid-view1 .datagrid-body-inner {
+  padding-bottom: 20px;
+}
+.datagrid-view1 .datagrid-body {
+  overflow: hidden;
+}
+.datagrid-footer {
+  overflow: hidden;
+}
+.datagrid-footer-inner {
+  border-width: 1px 0 0 0;
+  border-style: solid;
+  width: 10000px;
+  float: left;
+}
+.datagrid-row-editing .datagrid-cell {
+  height: auto;
+}
+.datagrid-header-check,
+.datagrid-cell-check {
+  padding: 0;
+  width: 27px;
+  height: 18px;
+  font-size: 1px;
+  text-align: center;
+  overflow: hidden;
+}
+.datagrid-header-check input,
+.datagrid-cell-check input {
+  margin: 0;
+  padding: 0;
+  width: 15px;
+  height: 18px;
+}
+.datagrid-resize-proxy {
+  position: absolute;
+  width: 1px;
+  height: 10000px;
+  top: 0;
+  cursor: e-resize;
+  display: none;
+}
+.datagrid-body .datagrid-editable {
+  margin: 0;
+  padding: 0;
+}
+.datagrid-body .datagrid-editable table {
+  width: 100%;
+  height: 100%;
+}
+.datagrid-body .datagrid-editable td {
+  border: 0;
+  margin: 0;
+  padding: 0;
+}
+.datagrid-view .datagrid-editable-input {
+  margin: 0;
+  padding: 2px 4px;
+  border: 1px solid #95B8E7;
+  font-size: 14px;
+  outline-style: none;
+  -moz-border-radius: 0 0 0 0;
+  -webkit-border-radius: 0 0 0 0;
+  border-radius: 0 0 0 0;
+}
+.datagrid-view .validatebox-invalid {
+  border-color: #ffa8a8;
+}
+.datagrid-sort .datagrid-sort-icon {
+  display: inline;
+  padding: 0 13px 0 0;
+  background: url('images/datagrid_icons.png') no-repeat -64px center;
+}
+.datagrid-sort-desc .datagrid-sort-icon {
+  display: inline;
+  padding: 0 13px 0 0;
+  background: url('images/datagrid_icons.png') no-repeat -16px center;
+}
+.datagrid-sort-asc .datagrid-sort-icon {
+  display: inline;
+  padding: 0 13px 0 0;
+  background: url('images/datagrid_icons.png') no-repeat 0px center;
+}
+.datagrid-row-collapse {
+  background: url('images/datagrid_icons.png') no-repeat -48px center;
+}
+.datagrid-row-expand {
+  background: url('images/datagrid_icons.png') no-repeat -32px center;
+}
+.datagrid-mask-msg {
+  background: #ffffff url('images/loading.gif') no-repeat scroll 5px center;
+}
+.datagrid-header,
+.datagrid-td-rownumber {
+  background-color: #efefef;
+  background: -webkit-linear-gradient(top,#F9F9F9 0,#efefef 100%);
+  background: -moz-linear-gradient(top,#F9F9F9 0,#efefef 100%);
+  background: -o-linear-gradient(top,#F9F9F9 0,#efefef 100%);
+  background: linear-gradient(to bottom,#F9F9F9 0,#efefef 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#F9F9F9,endColorstr=#efefef,GradientType=0);
+}
+.datagrid-cell-rownumber {
+  color: #000000;
+}
+.datagrid-resize-proxy {
+  background: #aac5e7;
+}
+.datagrid-mask {
+  background: #ccc;
+}
+.datagrid-mask-msg {
+  border-color: #95B8E7;
+}
+.datagrid-toolbar,
+.datagrid-pager {
+  background: #F4F4F4;
+}
+.datagrid-header,
+.datagrid-toolbar,
+.datagrid-pager,
+.datagrid-footer-inner {
+  border-color: #dddddd;
+}
+.datagrid-header td,
+.datagrid-body td,
+.datagrid-footer td {
+  border-color: #ccc;
+}
+.datagrid-htable,
+.datagrid-btable,
+.datagrid-ftable {
+  color: #000000;
+  border-collapse: separate;
+}
+.datagrid-row-alt {
+  background: #fafafa;
+}
+.datagrid-row-over,
+.datagrid-header td.datagrid-header-over {
+  background: #eaf2ff;
+  color: #000000;
+  cursor: default;
+}
+.datagrid-row-selected {
+  background: #ffe48d;
+  color: #000000;
+}
+.datagrid-row-editing .textbox,
+.datagrid-row-editing .textbox-text {
+  -moz-border-radius: 0 0 0 0;
+  -webkit-border-radius: 0 0 0 0;
+  border-radius: 0 0 0 0;
+}
+.datagrid-header .datagrid-filter-row td.datagrid-header-over {
+  background: inherit;
+}
+.datagrid-split-proxy {
+  position: absolute;
+  left: 0;
+  top: 0;
+  width: 1px;
+  height: 100%;
+  border-left: 1px solid #ffab3f;
+}
+.datagrid-moving-proxy {
+  border: 1px solid #ffab3f;
+  height: 32px;
+  line-height: 32px;
+  padding: 0 4px;
+}
+.propertygrid .datagrid-view1 .datagrid-body td {
+  padding-bottom: 1px;
+  border-width: 0 1px 0 0;
+}
+.propertygrid .datagrid-group {
+  overflow: hidden;
+  border-width: 0 0 1px 0;
+  border-style: solid;
+}
+.propertygrid .datagrid-group span {
+  font-weight: bold;
+}
+.propertygrid .datagrid-view1 .datagrid-body td {
+  border-color: #dddddd;
+}
+.propertygrid .datagrid-view1 .datagrid-group {
+  border-color: #E0ECFF;
+}
+.propertygrid .datagrid-view2 .datagrid-group {
+  border-color: #dddddd;
+}
+.propertygrid .datagrid-group,
+.propertygrid .datagrid-view1 .datagrid-body,
+.propertygrid .datagrid-view1 .datagrid-row-over,
+.propertygrid .datagrid-view1 .datagrid-row-selected {
+  background: #E0ECFF;
+}
+.datalist .datagrid-header {
+  border-width: 0;
+}
+.datalist .datagrid-group,
+.m-list .m-list-group {
+  height: 25px;
+  line-height: 25px;
+  font-weight: bold;
+  overflow: hidden;
+  background-color: #efefef;
+  border-style: solid;
+  border-width: 0 0 1px 0;
+  border-color: #ccc;
+}
+.datalist .datagrid-group-expander {
+  display: none;
+}
+.datalist .datagrid-group-title {
+  padding: 0 4px;
+}
+.datalist .datagrid-btable {
+  width: 100%;
+  table-layout: fixed;
+}
+.datalist .datagrid-row td {
+  border-style: solid;
+  border-left-color: transparent;
+  border-right-color: transparent;
+  border-bottom-width: 0;
+}
+.datalist-lines .datagrid-row td {
+  border-bottom-width: 1px;
+}
+.datalist .datagrid-cell,
+.m-list li {
+  width: auto;
+  height: auto;
+  padding: 2px 4px;
+  line-height: 18px;
+  position: relative;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  overflow: hidden;
+}
+.datalist-link,
+.m-list li>a {
+  display: block;
+  position: relative;
+  cursor: pointer;
+  color: #000000;
+  text-decoration: none;
+  overflow: hidden;
+  margin: -2px -4px;
+  padding: 2px 4px;
+  padding-right: 16px;
+  line-height: 18px;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  overflow: hidden;
+}
+.datalist-link::after,
+.m-list li>a::after {
+  position: absolute;
+  display: block;
+  width: 8px;
+  height: 8px;
+  content: '';
+  right: 6px;
+  top: 50%;
+  margin-top: -4px;
+  border-style: solid;
+  border-width: 1px 1px 0 0;
+  -ms-transform: rotate(45deg);
+  -moz-transform: rotate(45deg);
+  -webkit-transform: rotate(45deg);
+  -o-transform: rotate(45deg);
+  transform: rotate(45deg);
+}
+.m-list {
+  margin: 0;
+  padding: 0;
+  list-style: none;
+}
+.m-list li {
+  border-style: solid;
+  border-width: 0 0 1px 0;
+  border-color: #ccc;
+}
+.m-list li>a:hover {
+  background: #eaf2ff;
+  color: #000000;
+}
+.m-list .m-list-group {
+  padding: 0 4px;
+}
+.pagination {
+  zoom: 1;
+  padding: 2px;
+}
+.pagination table {
+  float: left;
+  height: 30px;
+}
+.pagination td {
+  border: 0;
+}
+.pagination-btn-separator {
+  float: left;
+  height: 24px;
+  border-left: 1px solid #ccc;
+  border-right: 1px solid #fff;
+  margin: 3px 1px;
+}
+.pagination .pagination-num {
+  border-width: 1px;
+  border-style: solid;
+  margin: 0 2px;
+  padding: 2px;
+  width: 3em;
+  height: auto;
+  text-align: center;
+  font-size: 14px;
+}
+.pagination-page-list {
+  margin: 0px 6px;
+  padding: 1px 2px;
+  width: auto;
+  height: auto;
+  border-width: 1px;
+  border-style: solid;
+}
+.pagination-info {
+  float: right;
+  margin: 0 6px;
+  padding: 0;
+  height: 30px;
+  line-height: 30px;
+  font-size: 14px;
+}
+.pagination span {
+  font-size: 14px;
+}
+.pagination-link .l-btn-text {
+  box-sizing: border-box;
+  text-align: center;
+  margin: 0;
+  padding: 0 .5em;
+  width: auto;
+  min-width: 28px;
+}
+.pagination-first {
+  background: url('images/pagination_icons.png') no-repeat 0 center;
+}
+.pagination-prev {
+  background: url('images/pagination_icons.png') no-repeat -16px center;
+}
+.pagination-next {
+  background: url('images/pagination_icons.png') no-repeat -32px center;
+}
+.pagination-last {
+  background: url('images/pagination_icons.png') no-repeat -48px center;
+}
+.pagination-load {
+  background: url('images/pagination_icons.png') no-repeat -64px center;
+}
+.pagination-loading {
+  background: url('images/loading.gif') no-repeat center center;
+}
+.pagination-page-list,
+.pagination .pagination-num {
+  border-color: #95B8E7;
+}
+.calendar {
+  border-width: 1px;
+  border-style: solid;
+  padding: 1px;
+  overflow: hidden;
+}
+.calendar table {
+  table-layout: fixed;
+  border-collapse: separate;
+  font-size: 14px;
+  width: 100%;
+  height: 100%;
+}
+.calendar table td,
+.calendar table th {
+  font-size: 14px;
+}
+.calendar-noborder {
+  border: 0;
+}
+.calendar-header {
+  position: relative;
+  height: 36px;
+}
+.calendar-title {
+  text-align: center;
+  height: 36px;
+  line-height: 36px;
+}
+.calendar-title span {
+  position: relative;
+  display: inline-block;
+  top: 0px;
+  padding: 0 3px;
+  height: 28px;
+  line-height: 28px;
+  font-size: 14px;
+  cursor: pointer;
+  -moz-border-radius: 5px 5px 5px 5px;
+  -webkit-border-radius: 5px 5px 5px 5px;
+  border-radius: 5px 5px 5px 5px;
+}
+.calendar-prevmonth,
+.calendar-nextmonth,
+.calendar-prevyear,
+.calendar-nextyear {
+  position: absolute;
+  top: 50%;
+  margin-top: -8px;
+  width: 16px;
+  height: 16px;
+  cursor: pointer;
+  font-size: 1px;
+  -moz-border-radius: 5px 5px 5px 5px;
+  -webkit-border-radius: 5px 5px 5px 5px;
+  border-radius: 5px 5px 5px 5px;
+}
+.calendar-prevmonth {
+  left: 30px;
+  background: url('images/calendar_arrows.png') no-repeat -16px 0;
+}
+.calendar-nextmonth {
+  right: 30px;
+  background: url('images/calendar_arrows.png') no-repeat -32px 0;
+}
+.calendar-prevyear {
+  left: 10px;
+  background: url('images/calendar_arrows.png') no-repeat 0px 0;
+}
+.calendar-nextyear {
+  right: 10px;
+  background: url('images/calendar_arrows.png') no-repeat -48px 0;
+}
+.calendar-body {
+  position: relative;
+}
+.calendar-body th,
+.calendar-body td {
+  text-align: center;
+}
+.calendar-day {
+  border: 0;
+  padding: 1px;
+  cursor: pointer;
+  -moz-border-radius: 5px 5px 5px 5px;
+  -webkit-border-radius: 5px 5px 5px 5px;
+  border-radius: 5px 5px 5px 5px;
+}
+.calendar-other-month {
+  opacity: 0.3;
+  filter: alpha(opacity=30);
+}
+.calendar-disabled {
+  opacity: 0.6;
+  filter: alpha(opacity=60);
+  cursor: default;
+}
+.calendar-menu {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 180px;
+  height: 150px;
+  padding: 5px;
+  font-size: 14px;
+  display: none;
+  overflow: hidden;
+}
+.calendar-menu-year-inner {
+  text-align: center;
+  padding-bottom: 5px;
+}
+.calendar-menu-year {
+  width: 80px;
+  line-height: 26px;
+  text-align: center;
+  border-width: 1px;
+  border-style: solid;
+  outline-style: none;
+  resize: none;
+  margin: 0;
+  padding: 0;
+  font-weight: bold;
+  font-size: 14px;
+  -moz-border-radius: 5px 5px 5px 5px;
+  -webkit-border-radius: 5px 5px 5px 5px;
+  border-radius: 5px 5px 5px 5px;
+}
+.calendar-menu-prev,
+.calendar-menu-next {
+  display: inline-block;
+  width: 25px;
+  height: 28px;
+  vertical-align: top;
+  cursor: pointer;
+  -moz-border-radius: 5px 5px 5px 5px;
+  -webkit-border-radius: 5px 5px 5px 5px;
+  border-radius: 5px 5px 5px 5px;
+}
+.calendar-menu-prev {
+  margin-right: 10px;
+  background: url('images/calendar_arrows.png') no-repeat 5px center;
+}
+.calendar-menu-next {
+  margin-left: 10px;
+  background: url('images/calendar_arrows.png') no-repeat -44px center;
+}
+.calendar-menu-month {
+  text-align: center;
+  cursor: pointer;
+  font-weight: bold;
+  -moz-border-radius: 5px 5px 5px 5px;
+  -webkit-border-radius: 5px 5px 5px 5px;
+  border-radius: 5px 5px 5px 5px;
+}
+.calendar-body th,
+.calendar-menu-month {
+  color: #4d4d4d;
+}
+.calendar-day {
+  color: #000000;
+}
+.calendar-sunday {
+  color: #CC2222;
+}
+.calendar-saturday {
+  color: #00ee00;
+}
+.calendar-today {
+  color: #0000ff;
+}
+.calendar-menu-year {
+  border-color: #95B8E7;
+}
+.calendar {
+  border-color: #95B8E7;
+}
+.calendar-header {
+  background: #E0ECFF;
+}
+.calendar-body,
+.calendar-menu {
+  background: #ffffff;
+}
+.calendar-body th {
+  background: #F4F4F4;
+  padding: 4px 0;
+}
+.calendar-hover,
+.calendar-nav-hover,
+.calendar-menu-hover {
+  background-color: #eaf2ff;
+  color: #000000;
+}
+.calendar-hover {
+  border: 1px solid #b7d2ff;
+  padding: 0;
+}
+.calendar-selected {
+  background-color: #ffe48d;
+  color: #000000;
+  border: 1px solid #ffab3f;
+  padding: 0;
+}
+.calendar-info {
+  background-color: #E0ECFF;
+  font-size: 28px;
+  height: 70px;
+  padding: 10px 20px;
+}
+.calendar-info .year {
+  font-size: 16px;
+}
+.datebox-calendar-inner {
+  height: 250px;
+}
+.datebox-button {
+  padding: 4px 0;
+  text-align: center;
+}
+.datebox-button a {
+  line-height: 22px;
+  font-size: 14px;
+  font-weight: bold;
+  text-decoration: none;
+  opacity: 0.6;
+  filter: alpha(opacity=60);
+}
+.datebox-button a:hover {
+  opacity: 1.0;
+  filter: alpha(opacity=100);
+}
+.datebox-current,
+.datebox-close {
+  float: left;
+}
+.datebox-close {
+  float: right;
+}
+.datebox .combo-arrow {
+  background-image: url('images/datebox_arrow.png');
+  background-position: center center;
+}
+.datebox-button {
+  background-color: #F4F4F4;
+}
+.datebox-button a {
+  color: #444;
+}
+.spinner-arrow {
+  display: inline-block;
+  overflow: hidden;
+  vertical-align: top;
+  margin: 0;
+  padding: 0;
+  opacity: 1.0;
+  filter: alpha(opacity=100);
+  width: 18px;
+}
+.spinner-arrow.spinner-button-top,
+.spinner-arrow.spinner-button-bottom,
+.spinner-arrow.spinner-button-left,
+.spinner-arrow.spinner-button-right {
+  background-color: #E0ECFF;
+}
+.spinner-arrow-up,
+.spinner-arrow-down {
+  opacity: 0.6;
+  filter: alpha(opacity=60);
+  display: block;
+  font-size: 1px;
+  width: 18px;
+  height: 10px;
+  width: 100%;
+  height: 50%;
+  color: #444;
+  outline-style: none;
+  background-color: #E0ECFF;
+}
+.spinner-button-updown {
+  opacity: 1.0;
+}
+.spinner-button-updown .spinner-button-top,
+.spinner-button-updown .spinner-button-bottom {
+  position: relative;
+  display: block;
+  width: 100%;
+  height: 50%;
+}
+.spinner-button-updown .spinner-arrow-up,
+.spinner-button-updown .spinner-arrow-down {
+  opacity: 1.0;
+  filter: alpha(opacity=100);
+  cursor: pointer;
+  width: 16px;
+  height: 16px;
+  top: 50%;
+  left: 50%;
+  margin-top: -8px;
+  margin-left: -8px;
+  position: absolute;
+}
+.spinner-button-updown .spinner-button-top,
+.spinner-button-updown .spinner-button-bottom {
+  cursor: pointer;
+  opacity: 0.6;
+  filter: alpha(opacity=60);
+}
+.spinner-button-updown .spinner-button-top:hover,
+.spinner-button-updown .spinner-button-bottom:hover {
+  opacity: 1.0;
+  filter: alpha(opacity=100);
+}
+.spinner-button-updown .spinner-arrow-up,
+.spinner-button-updown .spinner-arrow-down,
+.spinner-button-updown .spinner-arrow-up:hover,
+.spinner-button-updown .spinner-arrow-down:hover {
+  background-color: transparent;
+}
+.spinner-arrow-hover {
+  background-color: #eaf2ff;
+  opacity: 1.0;
+  filter: alpha(opacity=100);
+}
+.spinner-button-top:hover,
+.spinner-button-bottom:hover,
+.spinner-button-left:hover,
+.spinner-button-right:hover,
+.spinner-arrow-up:hover,
+.spinner-arrow-down:hover {
+  opacity: 1.0;
+  filter: alpha(opacity=100);
+  background-color: #eaf2ff;
+}
+.textbox-disabled .spinner-button-top:hover,
+.textbox-disabled .spinner-button-bottom:hover,
+.textbox-disabled .spinner-button-left:hover,
+.textbox-disabled .spinner-button-right:hover,
+.textbox-icon-disabled .spinner-arrow-up:hover,
+.textbox-icon-disabled .spinner-arrow-down:hover {
+  opacity: 0.6;
+  filter: alpha(opacity=60);
+  background-color: #E0ECFF;
+  cursor: default;
+}
+.spinner .textbox-icon-disabled {
+  opacity: 0.6;
+  filter: alpha(opacity=60);
+}
+.spinner-arrow-up {
+  background: url('images/spinner_arrows.png') no-repeat 1px center;
+  background-color: #E0ECFF;
+}
+.spinner-arrow-down {
+  background: url('images/spinner_arrows.png') no-repeat -15px center;
+  background-color: #E0ECFF;
+}
+.spinner-button-up {
+  background: url('images/spinner_arrows.png') no-repeat -32px center;
+}
+.spinner-button-down {
+  background: url('images/spinner_arrows.png') no-repeat -48px center;
+}
+.progressbar {
+  border-width: 1px;
+  border-style: solid;
+  -moz-border-radius: 5px 5px 5px 5px;
+  -webkit-border-radius: 5px 5px 5px 5px;
+  border-radius: 5px 5px 5px 5px;
+  overflow: hidden;
+  position: relative;
+}
+.progressbar-text {
+  text-align: center;
+  position: absolute;
+}
+.progressbar-value {
+  position: relative;
+  overflow: hidden;
+  width: 0;
+  -moz-border-radius: 5px 0 0 5px;
+  -webkit-border-radius: 5px 0 0 5px;
+  border-radius: 5px 0 0 5px;
+}
+.progressbar {
+  border-color: #95B8E7;
+}
+.progressbar-text {
+  color: #000000;
+  font-size: 14px;
+}
+.progressbar-value,
+.progressbar-value .progressbar-text {
+  background-color: #ffe48d;
+  color: #000000;
+}
+.searchbox-button {
+  width: 18px;
+  height: 20px;
+  overflow: hidden;
+  display: inline-block;
+  vertical-align: top;
+  cursor: pointer;
+  opacity: 0.6;
+  filter: alpha(opacity=60);
+}
+.searchbox-button-hover {
+  opacity: 1.0;
+  filter: alpha(opacity=100);
+}
+.searchbox .l-btn-plain {
+  border: 0;
+  padding: 0;
+  vertical-align: top;
+  opacity: 0.6;
+  filter: alpha(opacity=60);
+  -moz-border-radius: 0 0 0 0;
+  -webkit-border-radius: 0 0 0 0;
+  border-radius: 0 0 0 0;
+}
+.searchbox .l-btn-plain:hover {
+  border: 0;
+  padding: 0;
+  opacity: 1.0;
+  filter: alpha(opacity=100);
+  -moz-border-radius: 0 0 0 0;
+  -webkit-border-radius: 0 0 0 0;
+  border-radius: 0 0 0 0;
+}
+.searchbox a.m-btn-plain-active {
+  -moz-border-radius: 0 0 0 0;
+  -webkit-border-radius: 0 0 0 0;
+  border-radius: 0 0 0 0;
+}
+.searchbox .m-btn-active {
+  border-width: 0 1px 0 0;
+  -moz-border-radius: 0 0 0 0;
+  -webkit-border-radius: 0 0 0 0;
+  border-radius: 0 0 0 0;
+}
+.searchbox .textbox-button-right {
+  border-width: 0 0 0 1px;
+}
+.searchbox .textbox-button-left {
+  border-width: 0 1px 0 0;
+}
+.searchbox-button {
+  background: url('images/searchbox_button.png') no-repeat center center;
+}
+.searchbox .l-btn-plain {
+  background: #E0ECFF;
+}
+.searchbox .l-btn-plain-disabled,
+.searchbox .l-btn-plain-disabled:hover {
+  opacity: 0.5;
+  filter: alpha(opacity=50);
+}
+.slider-disabled {
+  opacity: 0.5;
+  filter: alpha(opacity=50);
+}
+.slider-h {
+  height: 22px;
+}
+.slider-v {
+  width: 22px;
+}
+.slider-inner {
+  position: relative;
+  height: 6px;
+  top: 7px;
+  border-width: 1px;
+  border-style: solid;
+  border-radius: 5px;
+}
+.slider-handle {
+  position: absolute;
+  display: block;
+  outline: none;
+  width: 20px;
+  height: 20px;
+  top: 50%;
+  margin-top: -10px;
+  margin-left: -10px;
+}
+.slider-tip {
+  position: absolute;
+  display: inline-block;
+  line-height: 12px;
+  font-size: 14px;
+  white-space: nowrap;
+  top: -22px;
+}
+.slider-rule {
+  position: relative;
+  top: 15px;
+}
+.slider-rule span {
+  position: absolute;
+  display: inline-block;
+  font-size: 0;
+  height: 5px;
+  border-width: 0 0 0 1px;
+  border-style: solid;
+}
+.slider-rulelabel {
+  position: relative;
+  top: 20px;
+}
+.slider-rulelabel span {
+  position: absolute;
+  display: inline-block;
+  font-size: 14px;
+}
+.slider-v .slider-inner {
+  width: 6px;
+  left: 7px;
+  top: 0;
+  float: left;
+}
+.slider-v .slider-handle {
+  left: 50%;
+  margin-top: -10px;
+}
+.slider-v .slider-tip {
+  left: -10px;
+  margin-top: -6px;
+}
+.slider-v .slider-rule {
+  float: left;
+  top: 0;
+  left: 16px;
+}
+.slider-v .slider-rule span {
+  width: 5px;
+  height: 'auto';
+  border-left: 0;
+  border-width: 1px 0 0 0;
+  border-style: solid;
+}
+.slider-v .slider-rulelabel {
+  float: left;
+  top: 0;
+  left: 23px;
+}
+.slider-handle {
+  background: url('images/slider_handle.png') no-repeat;
+}
+.slider-inner {
+  border-color: #95B8E7;
+  background: #E0ECFF;
+}
+.slider-rule span {
+  border-color: #95B8E7;
+}
+.slider-rulelabel span {
+  color: #000000;
+}
+.menu {
+  position: absolute;
+  margin: 0;
+  padding: 2px;
+  border-width: 1px;
+  border-style: solid;
+  overflow: hidden;
+}
+.menu-inline {
+  position: relative;
+}
+.menu-item {
+  position: relative;
+  margin: 0;
+  padding: 0;
+  overflow: hidden;
+  white-space: nowrap;
+  cursor: pointer;
+  border-width: 1px;
+  border-style: solid;
+}
+.menu-text {
+  height: 20px;
+  line-height: 20px;
+  float: left;
+  padding-left: 28px;
+}
+.menu-icon {
+  position: absolute;
+  width: 16px;
+  height: 16px;
+  left: 2px;
+  top: 50%;
+  margin-top: -8px;
+}
+.menu-rightarrow {
+  position: absolute;
+  width: 16px;
+  height: 16px;
+  right: 0;
+  top: 50%;
+  margin-top: -8px;
+}
+.menu-line {
+  position: absolute;
+  left: 26px;
+  top: 0;
+  height: 2000px;
+  font-size: 1px;
+}
+.menu-sep {
+  margin: 3px 0px 3px 25px;
+  font-size: 1px;
+}
+.menu-noline .menu-line {
+  display: none;
+}
+.menu-noline .menu-sep {
+  margin-left: 0;
+  margin-right: 0;
+}
+.menu-active {
+  -moz-border-radius: 5px 5px 5px 5px;
+  -webkit-border-radius: 5px 5px 5px 5px;
+  border-radius: 5px 5px 5px 5px;
+}
+.menu-item-disabled {
+  opacity: 0.5;
+  filter: alpha(opacity=50);
+  cursor: default;
+}
+.menu-text,
+.menu-text span {
+  font-size: 14px;
+}
+.menu-shadow {
+  position: absolute;
+  -moz-border-radius: 5px 5px 5px 5px;
+  -webkit-border-radius: 5px 5px 5px 5px;
+  border-radius: 5px 5px 5px 5px;
+  background: #ccc;
+  -moz-box-shadow: 2px 2px 3px #cccccc;
+  -webkit-box-shadow: 2px 2px 3px #cccccc;
+  box-shadow: 2px 2px 3px #cccccc;
+  filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2);
+}
+.menu-rightarrow {
+  background: url('images/menu_arrows.png') no-repeat -32px center;
+}
+.menu-line {
+  border-left: 1px solid #ccc;
+  border-right: 1px solid #fff;
+}
+.menu-sep {
+  border-top: 1px solid #ccc;
+  border-bottom: 1px solid #fff;
+}
+.menu {
+  background-color: #fafafa;
+  border-color: #ddd;
+  color: #444;
+}
+.menu-content {
+  background: #ffffff;
+}
+.menu-item {
+  border-color: transparent;
+  _border-color: #fafafa;
+}
+.menu-active {
+  border-color: #b7d2ff;
+  color: #000000;
+  background: #eaf2ff;
+}
+.menu-active-disabled {
+  border-color: transparent;
+  background: transparent;
+  color: #444;
+}
+.m-btn-downarrow,
+.s-btn-downarrow {
+  display: inline-block;
+  position: absolute;
+  width: 16px;
+  height: 16px;
+  font-size: 1px;
+  right: 0;
+  top: 50%;
+  margin-top: -8px;
+}
+.m-btn-active,
+.s-btn-active {
+  background: #eaf2ff;
+  color: #000000;
+  border: 1px solid #b7d2ff;
+  filter: none;
+}
+.m-btn-plain-active,
+.s-btn-plain-active {
+  background: transparent;
+  padding: 0;
+  border-width: 1px;
+  border-style: solid;
+  -moz-border-radius: 5px 5px 5px 5px;
+  -webkit-border-radius: 5px 5px 5px 5px;
+  border-radius: 5px 5px 5px 5px;
+}
+.m-btn .l-btn-left .l-btn-text {
+  margin-right: 20px;
+}
+.m-btn .l-btn-icon-right .l-btn-text {
+  margin-right: 40px;
+}
+.m-btn .l-btn-icon-right .l-btn-icon {
+  right: 20px;
+}
+.m-btn .l-btn-icon-top .l-btn-text {
+  margin-right: 4px;
+  margin-bottom: 14px;
+}
+.m-btn .l-btn-icon-bottom .l-btn-text {
+  margin-right: 4px;
+  margin-bottom: 34px;
+}
+.m-btn .l-btn-icon-bottom .l-btn-icon {
+  top: auto;
+  bottom: 20px;
+}
+.m-btn .l-btn-icon-top .m-btn-downarrow,
+.m-btn .l-btn-icon-bottom .m-btn-downarrow {
+  top: auto;
+  bottom: 0px;
+  left: 50%;
+  margin-left: -8px;
+}
+.m-btn-line {
+  display: inline-block;
+  position: absolute;
+  font-size: 1px;
+  display: none;
+}
+.m-btn .l-btn-left .m-btn-line {
+  right: 0;
+  width: 16px;
+  height: 500px;
+  border-style: solid;
+  border-color: #aac5e7;
+  border-width: 0 0 0 1px;
+}
+.m-btn .l-btn-icon-top .m-btn-line,
+.m-btn .l-btn-icon-bottom .m-btn-line {
+  left: 0;
+  bottom: 0;
+  width: 500px;
+  height: 16px;
+  border-width: 1px 0 0 0;
+}
+.m-btn-large .l-btn-icon-right .l-btn-text {
+  margin-right: 56px;
+}
+.m-btn-large .l-btn-icon-bottom .l-btn-text {
+  margin-bottom: 50px;
+}
+.m-btn-downarrow,
+.s-btn-downarrow {
+  background: url('images/menu_arrows.png') no-repeat 0 center;
+}
+.m-btn-plain-active,
+.s-btn-plain-active {
+  border-color: #b7d2ff;
+  background-color: #eaf2ff;
+  color: #000000;
+}
+.s-btn:hover .m-btn-line,
+.s-btn-active .m-btn-line,
+.s-btn-plain-active .m-btn-line {
+  display: inline-block;
+}
+.l-btn:hover .s-btn-downarrow,
+.s-btn-active .s-btn-downarrow,
+.s-btn-plain-active .s-btn-downarrow {
+  border-style: solid;
+  border-color: #aac5e7;
+  border-width: 0 0 0 1px;
+}
+.messager-body {
+  padding: 10px 10px 30px 10px;
+  overflow: auto;
+}
+.messager-button {
+  text-align: center;
+  padding: 5px;
+}
+.messager-button .l-btn {
+  width: 70px;
+}
+.messager-icon {
+  float: left;
+  width: 32px;
+  height: 32px;
+  margin: 0 10px 10px 0;
+}
+.messager-error {
+  background: url('images/messager_icons.png') no-repeat scroll -64px 0;
+}
+.messager-info {
+  background: url('images/messager_icons.png') no-repeat scroll 0 0;
+}
+.messager-question {
+  background: url('images/messager_icons.png') no-repeat scroll -32px 0;
+}
+.messager-warning {
+  background: url('images/messager_icons.png') no-repeat scroll -96px 0;
+}
+.messager-progress {
+  padding: 10px;
+}
+.messager-p-msg {
+  margin-bottom: 5px;
+}
+.messager-body .messager-input {
+  width: 100%;
+  padding: 4px 0;
+  outline-style: none;
+  border: 1px solid #95B8E7;
+}
+.window-thinborder .messager-button {
+  padding-bottom: 8px;
+}
+.messager-tip {
+  box-shadow: 0 1px 6px #ccc;
+  height: auto;
+}
+.messager-tip .messager-body {
+  margin: 0;
+  padding: 0 10px;
+  height: 40px;
+  line-height: 40px;
+}
+.messager-tip .messager-body>.f-row {
+  align-items: center;
+}
+.messager-tip .messager-icon {
+  width: 16px;
+  height: 16px;
+  margin: 0 10px 0 0;
+}
+.messager-tip .messager-info {
+  background: url('images/messager_icons16.png') no-repeat scroll 0 0;
+}
+.messager-tip .messager-question {
+  background: url('images/messager_icons16.png') no-repeat scroll -16px 0;
+}
+.messager-tip .messager-error {
+  background: url('images/messager_icons16.png') no-repeat scroll -32px 0;
+}
+.messager-tip .messager-warning {
+  background: url('images/messager_icons16.png') no-repeat scroll -48px 0;
+}
+.tree {
+  margin: 0;
+  padding: 0;
+  list-style-type: none;
+}
+.tree li {
+  white-space: nowrap;
+}
+.tree li ul {
+  list-style-type: none;
+  margin: 0;
+  padding: 0;
+}
+.tree-node {
+  height: 26px;
+  white-space: nowrap;
+  cursor: pointer;
+}
+.tree-hit {
+  cursor: pointer;
+}
+.tree-expanded,
+.tree-collapsed,
+.tree-folder,
+.tree-file,
+.tree-checkbox,
+.tree-indent {
+  display: inline-block;
+  width: 16px;
+  height: 18px;
+  margin: 4px 0;
+  vertical-align: middle;
+  overflow: hidden;
+}
+.tree-expanded {
+  background: url('images/tree_icons.png') no-repeat -18px 0px;
+}
+.tree-expanded-hover {
+  background: url('images/tree_icons.png') no-repeat -50px 0px;
+}
+.tree-collapsed {
+  background: url('images/tree_icons.png') no-repeat 0px 0px;
+}
+.tree-collapsed-hover {
+  background: url('images/tree_icons.png') no-repeat -32px 0px;
+}
+.tree-lines .tree-expanded,
+.tree-lines .tree-root-first .tree-expanded {
+  background: url('images/tree_icons.png') no-repeat -144px 0;
+}
+.tree-lines .tree-collapsed,
+.tree-lines .tree-root-first .tree-collapsed {
+  background: url('images/tree_icons.png') no-repeat -128px 0;
+}
+.tree-lines .tree-node-last .tree-expanded,
+.tree-lines .tree-root-one .tree-expanded {
+  background: url('images/tree_icons.png') no-repeat -80px 0;
+}
+.tree-lines .tree-node-last .tree-collapsed,
+.tree-lines .tree-root-one .tree-collapsed {
+  background: url('images/tree_icons.png') no-repeat -64px 0;
+}
+.tree-line {
+  background: url('images/tree_icons.png') no-repeat -176px 0;
+}
+.tree-join {
+  background: url('images/tree_icons.png') no-repeat -192px 0;
+}
+.tree-joinbottom {
+  background: url('images/tree_icons.png') no-repeat -160px 0;
+}
+.tree-folder {
+  background: url('images/tree_icons.png') no-repeat -208px 0;
+}
+.tree-folder-open {
+  background: url('images/tree_icons.png') no-repeat -224px 0;
+}
+.tree-file {
+  background: url('images/tree_icons.png') no-repeat -240px 0;
+}
+.tree-loading {
+  background: url('images/loading.gif') no-repeat center center;
+}
+.tree-checkbox0 {
+  background: url('images/tree_icons.png') no-repeat -208px -18px;
+}
+.tree-checkbox1 {
+  background: url('images/tree_icons.png') no-repeat -224px -18px;
+}
+.tree-checkbox2 {
+  background: url('images/tree_icons.png') no-repeat -240px -18px;
+}
+.tree-title {
+  font-size: 14px;
+  display: inline-block;
+  text-decoration: none;
+  vertical-align: middle;
+  white-space: nowrap;
+  padding: 0 2px;
+  margin: 4px 0;
+  height: 18px;
+  line-height: 18px;
+}
+.tree-node-proxy {
+  font-size: 14px;
+  line-height: 20px;
+  padding: 0 2px 0 20px;
+  border-width: 1px;
+  border-style: solid;
+  z-index: 9900000;
+}
+.tree-dnd-icon {
+  display: inline-block;
+  position: absolute;
+  width: 16px;
+  height: 18px;
+  left: 2px;
+  top: 50%;
+  margin-top: -9px;
+}
+.tree-dnd-yes {
+  background: url('images/tree_icons.png') no-repeat -256px 0;
+}
+.tree-dnd-no {
+  background: url('images/tree_icons.png') no-repeat -256px -18px;
+}
+.tree-node-top {
+  border-top: 1px dotted red;
+}
+.tree-node-bottom {
+  border-bottom: 1px dotted red;
+}
+.tree-node-append .tree-title {
+  border: 1px dotted red;
+}
+.tree-editor {
+  border: 1px solid #95B8E7;
+  font-size: 14px;
+  height: 26px;
+  line-height: 26px;
+  padding: 0 4px;
+  margin: 0;
+  width: 80px;
+  outline-style: none;
+  vertical-align: middle;
+  position: absolute;
+  top: 0;
+}
+.tree-node-proxy {
+  background-color: #ffffff;
+  color: #000000;
+  border-color: #95B8E7;
+}
+.tree-node-hover {
+  background: #eaf2ff;
+  color: #000000;
+}
+.tree-node-selected {
+  background: #ffe48d;
+  color: #000000;
+}
+.tree-node-disabled {
+  opacity: 0.5;
+  cursor: default;
+}
+.tree-node-hidden {
+  display: none;
+}
+.inputbox {
+  display: inline-block;
+  vertical-align: middle;
+  overflow: hidden;
+  white-space: nowrap;
+  margin: 0;
+  padding: 0;
+}
+.validatebox-invalid {
+  border-color: #ffa8a8;
+  background-color: #fff3f3;
+  color: #000;
+}
+.tooltip {
+  position: absolute;
+  display: none;
+  z-index: 9900000;
+  outline: none;
+  opacity: 1;
+  filter: alpha(opacity=100);
+  padding: 5px;
+  border-width: 1px;
+  border-style: solid;
+  border-radius: 5px;
+  -moz-border-radius: 5px 5px 5px 5px;
+  -webkit-border-radius: 5px 5px 5px 5px;
+  border-radius: 5px 5px 5px 5px;
+}
+.tooltip-content {
+  font-size: 14px;
+}
+.tooltip-arrow-outer,
+.tooltip-arrow {
+  position: absolute;
+  width: 0;
+  height: 0;
+  line-height: 0;
+  font-size: 0;
+  border-style: solid;
+  border-width: 6px;
+  border-color: transparent;
+}
+.tooltip-arrow {
+  display: none \9;
+}
+.tooltip-right .tooltip-arrow-outer {
+  left: 0;
+  top: 50%;
+  margin: -6px 0 0 -13px;
+}
+.tooltip-right .tooltip-arrow {
+  left: 0;
+  top: 50%;
+  margin: -6px 0 0 -12px;
+}
+.tooltip-left .tooltip-arrow-outer {
+  right: 0;
+  top: 50%;
+  margin: -6px -13px 0 0;
+}
+.tooltip-left .tooltip-arrow {
+  right: 0;
+  top: 50%;
+  margin: -6px -12px 0 0;
+}
+.tooltip-top .tooltip-arrow-outer {
+  bottom: 0;
+  left: 50%;
+  margin: 0 0 -13px -6px;
+}
+.tooltip-top .tooltip-arrow {
+  bottom: 0;
+  left: 50%;
+  margin: 0 0 -12px -6px;
+}
+.tooltip-bottom .tooltip-arrow-outer {
+  top: 0;
+  left: 50%;
+  margin: -13px 0 0 -6px;
+}
+.tooltip-bottom .tooltip-arrow {
+  top: 0;
+  left: 50%;
+  margin: -12px 0 0 -6px;
+}
+.tooltip {
+  background-color: #ffffff;
+  border-color: #95B8E7;
+  color: #000000;
+}
+.tooltip-right .tooltip-arrow-outer {
+  border-right-color: #95B8E7;
+}
+.tooltip-right .tooltip-arrow {
+  border-right-color: #ffffff;
+}
+.tooltip-left .tooltip-arrow-outer {
+  border-left-color: #95B8E7;
+}
+.tooltip-left .tooltip-arrow {
+  border-left-color: #ffffff;
+}
+.tooltip-top .tooltip-arrow-outer {
+  border-top-color: #95B8E7;
+}
+.tooltip-top .tooltip-arrow {
+  border-top-color: #ffffff;
+}
+.tooltip-bottom .tooltip-arrow-outer {
+  border-bottom-color: #95B8E7;
+}
+.tooltip-bottom .tooltip-arrow {
+  border-bottom-color: #ffffff;
+}
+.switchbutton {
+  text-decoration: none;
+  display: inline-block;
+  overflow: hidden;
+  vertical-align: middle;
+  margin: 0;
+  padding: 0;
+  cursor: pointer;
+  background: #bbb;
+  border: 1px solid #bbb;
+  -moz-border-radius: 5px 5px 5px 5px;
+  -webkit-border-radius: 5px 5px 5px 5px;
+  border-radius: 5px 5px 5px 5px;
+}
+.switchbutton-inner {
+  display: inline-block;
+  overflow: hidden;
+  position: relative;
+  top: -1px;
+  left: -1px;
+}
+.switchbutton-on,
+.switchbutton-off,
+.switchbutton-handle {
+  display: inline-block;
+  text-align: center;
+  height: 100%;
+  float: left;
+  font-size: 14px;
+  -moz-border-radius: 5px 5px 5px 5px;
+  -webkit-border-radius: 5px 5px 5px 5px;
+  border-radius: 5px 5px 5px 5px;
+}
+.switchbutton-on {
+  background: #ffe48d;
+  color: #000000;
+}
+.switchbutton-off {
+  background-color: #ffffff;
+  color: #000000;
+}
+.switchbutton-on,
+.switchbutton-reversed .switchbutton-off {
+  -moz-border-radius: 5px 0 0 5px;
+  -webkit-border-radius: 5px 0 0 5px;
+  border-radius: 5px 0 0 5px;
+}
+.switchbutton-off,
+.switchbutton-reversed .switchbutton-on {
+  -moz-border-radius: 0 5px 5px 0;
+  -webkit-border-radius: 0 5px 5px 0;
+  border-radius: 0 5px 5px 0;
+}
+.switchbutton-handle {
+  position: absolute;
+  top: 0;
+  left: 50%;
+  background-color: #ffffff;
+  color: #000000;
+  border: 1px solid #bbb;
+  -moz-box-shadow: 0 0 3px 0 #bbb;
+  -webkit-box-shadow: 0 0 3px 0 #bbb;
+  box-shadow: 0 0 3px 0 #bbb;
+}
+.switchbutton-value {
+  position: absolute;
+  top: 0;
+  left: -5000px;
+}
+.switchbutton-disabled {
+  opacity: 0.5;
+  filter: alpha(opacity=50);
+}
+.switchbutton-disabled,
+.switchbutton-readonly {
+  cursor: default;
+}
+.switchbutton:focus {
+  -moz-box-shadow: 0 0 3px 0 #bbb;
+  -webkit-box-shadow: 0 0 3px 0 #bbb;
+  box-shadow: 0 0 3px 0 #bbb;
+  outline: none;
+}
+.radiobutton {
+  position: relative;
+  border: 2px solid #ffab3f;
+  border-radius: 50%;
+}
+.radiobutton-inner {
+  position: absolute;
+  left: 0;
+  top: 0;
+  width: 100%;
+  height: 100%;
+  background: #ffab3f;
+  border-radius: 50%;
+  transform: scale(.6);
+}
+.radiobutton-disabled {
+  opacity: 0.6;
+}
+.radiobutton-value {
+  position: absolute;
+  overflow: hidden;
+  width: 1px;
+  height: 1px;
+  left: -100px;
+}
+.checkbox {
+  position: relative;
+  border: 2px solid #ffab3f;
+  -moz-border-radius: 5px 5px 5px 5px;
+  -webkit-border-radius: 5px 5px 5px 5px;
+  border-radius: 5px 5px 5px 5px;
+}
+.checkbox-checked {
+  border: 0;
+  background: #ffab3f;
+}
+.checkbox-inner {
+  position: absolute;
+  left: 0;
+  top: 0;
+  width: 100%;
+  height: 100%;
+}
+.checkbox path {
+  stroke-width: 2px;
+}
+.checkbox-disabled {
+  opacity: 0.6;
+}
+.checkbox-value {
+  position: absolute;
+  overflow: hidden;
+  width: 1px;
+  height: 1px;
+  left: -100px;
+}
+.sidemenu .tree-hit {
+  background-image: none;
+}
+.sidemenu-default-icon {
+  background-image: none;
+  width: 0;
+}
+.sidemenu .accordion .accordion-header,
+.sidemenu .accordion .accordion-body {
+  border-bottom-color: transparent;
+  background: transparent;
+}
+.sidemenu .accordion .accordion-header {
+  color: #0E2D5F;
+}
+.sidemenu .accordion-header .panel-title {
+  height: 30px;
+  line-height: 30px;
+  color: #0E2D5F;
+}
+.sidemenu .accordion-header:hover {
+  background: #eaf2ff;
+  color: #0E2D5F;
+}
+.sidemenu .tree-node-hover {
+  background: #eaf2ff;
+  color: #0E2D5F;
+}
+.sidemenu .tree-node-selected {
+  border-right: 2px solid #ffab3f;
+  color: #000000;
+  background: #ffe48d;
+}
+.sidemenu .tree-node {
+  height: 40px;
+}
+.sidemenu .tree-title {
+  margin: 11px 0;
+}
+.sidemenu .tree-node-nonleaf {
+  position: relative;
+}
+.sidemenu .tree-node-nonleaf::after {
+  display: inline-block;
+  content: '';
+  position: absolute;
+  top: 50%;
+  margin-top: -8px;
+  background: url('images/accordion_arrows.png') no-repeat 0 0;
+  width: 16px;
+  height: 16px;
+  right: 5px;
+}
+.sidemenu .tree-node-nonleaf-collapsed::after {
+  background: url('images/accordion_arrows.png') no-repeat -16px 0;
+}
+.sidemenu-collapsed .panel-icon {
+  left: 50%;
+  margin-left: -8px;
+}
+.sidemenu-collapsed .collapsed-icon {
+  position: relative;
+}
+.sidemenu-collapsed .collapsed-text {
+  text-align: center;
+}
+.sidemenu-tooltip {
+  padding: 0;
+  margin: 0 -12px;
+  border: 0;
+}
+.sidemenu-tooltip.tooltip-left {
+  margin: 0 12px;
+}
+.sidemenu-tooltip .tooltip-arrow-outer,
+.sidemenu-tooltip .tooltip-arrow {
+  display: none;
+}
+.timepicker-panel .clock-wrap {
+  position: relative;
+}
+.timepicker-panel .clock {
+  position: relative;
+  background: #E0ECFF;
+  color: #0E2D5F;
+  border-radius: 50%;
+  position: absolute;
+  left: 50%;
+  top: 50%;
+}
+.timepicker-panel .clock .item {
+  width: 32px;
+  height: 32px;
+  left: 50%;
+  top: 50%;
+  margin-left: -16px;
+  margin-top: -16px;
+  position: absolute;
+  user-select: none;
+  border-radius: 50%;
+  z-index: 9;
+  cursor: pointer;
+}
+.timepicker-panel .clock .item-selected {
+  background: #ffab3f;
+  color: #000000;
+}
+.timepicker-panel .clock .hand {
+  width: 2px;
+  bottom: 50%;
+  left: 50%;
+  margin-left: -1px;
+  top: 20px;
+  -webkit-transform-origin: center bottom;
+  transform-origin: center bottom;
+  position: absolute;
+  will-change: transform;
+  z-index: 1;
+  background-color: #ffab3f;
+}
+.timepicker-panel .clock .hand .drag {
+  top: -16px;
+  left: -15px;
+  width: 4px;
+  height: 4px;
+  border: 14px solid #ffab3f;
+  position: absolute;
+  box-sizing: content-box;
+  border-radius: 100%;
+  background-color: #000000;
+}
+.timepicker-panel .clock .center {
+  top: 50%;
+  left: 50%;
+  width: 6px;
+  height: 6px;
+  position: absolute;
+  transform: translate(-50%,-50%);
+  border-radius: 50%;
+  background-color: #ffab3f;
+}
+.timepicker-panel .panel-header {
+  height: 70px;
+  border: 0;
+  font-size: 36px;
+  position: relative;
+}
+.timepicker-panel .body {
+  position: relative;
+}
+.timepicker-panel .panel-header .ampm {
+  font-size: 16px;
+  padding-left: 10px;
+  position: absolute;
+  right: 20px;
+}
+.timepicker-panel .panel-header .sep {
+  opacity: 0.6;
+}
+.timepicker-panel .panel-header .title {
+  cursor: pointer;
+  opacity: 0.6;
+}
+.timepicker-panel .panel-header .title:hover {
+  opacity: 1.0;
+}
+.timepicker-panel .panel-header .title-selected,
+.timepicker-panel .panel-header .title-selected:hover {
+  cursor: default;
+  opacity: 1.0;
+}
diff --git a/Source/platformProject/platform2022UI/style/css/layui-dojo-small.css b/Source/platformProject/platform2022UI/style/css/layui-dojo-small.css
new file mode 100644
index 0000000..469e7b8
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/css/layui-dojo-small.css
@@ -0,0 +1,367 @@
+/**
+瑕嗙洊layui鏍峰紡锛屼笌dojo鏍峰紡淇濇寔涓�鑷�
+璇峰皢鎵�鏈変慨鏀筶ayui涓殑鏍峰紡鍔犲埌杩欎釜鏂囦欢涓紝鏂逛究layui鍗囩骇
+@autor wangting
+ */
+body{
+    background-color: #E9F4FE;
+}
+.layui-layer{
+    border: 1px solid #b5bcc7\0;
+}
+#portal_head dl{
+    background-image: none;
+    top:45px;
+    left: auto;
+    right: -25px;
+    filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#ffffff',GradientType=0 );
+}
+.panel-header, .panel-body{
+    border: 1px solid #b5bcc7;
+}
+.panel-header{
+    border-bottom: none;
+}
+.layout-split-proxy-h{
+    cursor: col-resize;
+    background: #E1EBFB;
+    border: 0;
+    border-top: 0 solid #d3d3d3;
+    border-bottom: 0 solid #d3d3d3;
+    z-index: 5000;
+}
+.layui-layout-body{
+    font-family: Verdana, Arial, Helvetica, sans-serif;
+    font-size: .688em;
+    color: #131313 !important;
+}
+.layui-layout-admin .layui-header{
+    background: none !important;
+}
+#portal_head{
+    background: none;
+    color: #131313 !important;
+    padding: 5px;
+}
+#portal_head .bgcolor{
+    border: 1px #b5bcc7 solid;
+    background: #ffffff;
+    width: auto;
+    filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#ffffff',GradientType=0 );
+}
+#portal_head .content{
+    position: absolute;
+    width:100%;
+    top:7px
+}
+#portal_logo{
+    color: #131313;
+    font-weight: bold;
+}
+.layui-vci-portal-topbar{
+    border-bottom: none !important;
+}
+#portal_head a{
+    color: #131313 !important;
+}
+.layui-nav-bar {
+    margin-top: -3px;
+    display: none;
+}
+.layui-nav .layui-this:after{
+    bottom: 2px;
+}
+.layui-layout-admin .layui-side{
+
+    border: 1px solid #b5bcc7;
+    background-color: #ffffff;
+}
+.layui-layout-admin .layui-body1{
+    position: relative;
+    left: 0;
+    top:0;
+}
+#portal_menu > .layui-side-scroll{
+    width: 100%;
+    font-size: 12px;
+}
+#portal_menu_tree .layui-nav-itemed>.layui-nav-child {
+    background-color: #ffffff !important;
+    background-image: none;
+}
+.layui-nav-itemed >a {
+    background:none !important;
+    background-color: #d4d8d8 !important;
+    background-image: linear-gradient(to right, #d4d8d8 , #fff) !important;
+    background-repeat: repeat-x;
+    color: #000000 !important;
+}
+#portal_menu_tree .layui-nav-child dd.layui-this{
+    background: transparent !important;
+}
+#portal_menu_tree .layui-nav-child dd.layui-this a{
+    background: #bcd8f4 !important;
+    background-image: linear-gradient(#ffffff 0px, rgba(255, 255, 255, 0) 3px, rgba(255, 255, 255, 0.75) 100%);
+}
+#portal_menu_tree .layui-nav-more{
+    right: 10px;
+}
+
+.layui-tab-title{
+    border: 0;
+    height: 32px;
+}
+.layui-tab-title li{
+    border: 1px solid #b5bcc7;
+    background-color: #efefef;
+    -webkit-transition-property: background-color, border;
+    -moz-transition-property: background-color, border;
+    transition-property: background-color, border;
+    -webkit-transition-duration: 0.35s;
+    -moz-transition-duration: 0.35s;
+    transition-duration: 0.35s;
+    color: #494949;
+    top: 3px;
+    margin-right: 1px;
+    padding: 3px 6px;
+    border-bottom-width: 0;
+    min-width: 60px;
+    text-align: center;
+    background-image: url("../images/base/tabTopUnselected.png");
+    background-repeat: repeat-x;
+    background-image: -moz-linear-gradient(top, #ffffff 0px, #ffffff 1px, rgba(255, 255, 255, 0.1) 2px, rgba(255, 255, 255, 0.6) 7px, rgba(255, 255, 255, 0) 100%);
+    background-image: -webkit-linear-gradient(top, #ffffff 0px, #ffffff 1px, rgba(255, 255, 255, 0.1) 2px, rgba(255, 255, 255, 0.6) 7px, rgba(255, 255, 255, 0) 100%);
+    background-image: -o-linear-gradient(top, #ffffff 0px, #ffffff 1px, rgba(255, 255, 255, 0.1) 2px, rgba(255, 255, 255, 0.6) 7px, rgba(255, 255, 255, 0) 100%);
+    background-image: linear-gradient(top, #ffffff 0px, #ffffff 1px, rgba(255, 255, 255, 0.1) 2px, rgba(255, 255, 255, 0.6) 7px, rgba(255, 255, 255, 0) 100%);
+    -webkit-box-shadow: 0 -1px 1px rgba(0, 0, 0, 0.04);
+    -moz-box-shadow: 0 -1px 1px rgba(0, 0, 0, 0.04);
+    box-shadow: 0 -1px 1px rgba(0, 0, 0, 0.04);
+    -moz-border-radius: 2px 2px 0 0;
+    border-radius: 2px 2px 0 0;
+    line-height: 18px;
+}
+.layui-tab-title li:hover{
+    border-color: #759dc0;
+    background-color: #abd6ff;
+    -webkit-transition-duration: 0.25s;
+    -moz-transition-duration: 0.25s;
+    transition-duration: 0.25s;
+    color: #000000;
+}
+.layui-tab-title li:active{
+    border-color: #759dc0;
+    background-color: #7dbdfa;
+    color: #000000;
+    -webkit-transition-duration: 0.1s;
+    -moz-transition-duration: 0.1s;
+    transition-duration: 0.1s;
+}
+.layui-tab-title li.layui-this{
+    padding-bottom: 2px;
+    padding-top: 9px;
+    border-color: #b5bcc7;
+    background-color: #cfe5fa;
+    color: #000000;
+    top:1px;
+    border-bottom: 0;
+    background-image: url("../images/base/tabTopSelected.png");
+    background-image: -moz-linear-gradient(top, #ffffff 0px, #ffffff 1px, rgba(255, 255, 255, 0) 2px, #ffffff 7px);
+    background-image: -webkit-linear-gradient(top, #ffffff 0px, #ffffff 1px, rgba(255, 255, 255, 0) 2px, #ffffff 7px);
+    background-image: -o-linear-gradient(top, #ffffff 0px, #ffffff 1px, rgba(255, 255, 255, 0) 2px, #ffffff 7px);
+    background-image: linear-gradient(top, #ffffff 0px, #ffffff 1px, rgba(255, 255, 255, 0) 2px, #ffffff 7px);
+    -webkit-box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.05);
+    -moz-box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.05);
+    box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.05);
+    z-index: 1;
+}
+.UIContentLayout .layui-tab-title li{
+    top:4px;
+}
+.UIContentLayout .layui-tab-title li.layui-this{
+    top:3px;
+}
+.layui-tab-content{
+    border-top: 1px solid #b5bcc7;
+    padding: 5px 0;
+}
+
+.layui-table-page {
+    padding: 3px 7px;
+    height: 32px;
+}
+.layui-table-page .layui-laypage a, .layui-table-page .layui-laypage span {
+    height: 24px;
+    line-height: 24px;
+}
+.layui-table-page .layui-laypage input, .layui-table-page .layui-laypage button {
+    height: 24px;
+    line-height: 24px;
+}
+.layui-laypage select {
+    padding: 2px 3px;
+}
+.layui-table {
+    color:#000;
+}
+.layui-table thead tr{
+    background-color:#C6E2FF
+}
+.layui-table th{
+    line-height:29px;
+    height:29px;
+    background: url(../images/base/tabBottomEnabledC.gif) #e9e9e9 repeat-x top !important;
+    background-size: auto 100%;
+    color: #000000;
+}
+.layui-table-header{
+    border-style: dotted;
+    border-color: rgb(213, 205, 181);
+}
+.layui-table-header .layui-table{
+    margin-bottom: 0;
+}
+.layui-table-view .layui-table th, .layui-table-view .layui-table td{
+    border-width: 1px;
+    border-style: dotted;
+    border-color: transparent rgb(213, 205, 181) rgb(213, 205, 181) transparent;
+    font-size: 12px;
+    padding: 0;
+    background-clip:padding-box !important;
+    position: relative;
+}
+.layui-table-view .layui-table th{
+    padding-bottom: 0px;
+    border-color: transparent #ACA899 #919191 transparent;
+    background-color: #ffffff !important;
+}
+.layui-table-view .layui-table[lay-even] tr:nth-child(even) td{
+    background-color:#F0F8FF
+}
+.layui-table-view .layui-table .tr_even td{
+    background-color:#F0F8FF
+}
+.layui-table-select td{
+    background-color: #aec7e3 !important;
+}
+.layui-table-cell,.layui-upload-list .layui-table td{
+    height: auto;
+    padding: 4px 5px;
+    position:relative;
+}
+.layui-table-view .layui-table td .layui-table-cell,.layui-upload-list .layui-table td{
+    /*overflow: auto;
+    text-overflow: inherit;
+    white-space: inherit;*/
+}
+button.layui-btn{
+    border: 1px solid #8ba0bd;
+    border-bottom: 1px solid #657c9c;
+    padding: 0.05em 0.3em 0.2em 0.2em;
+    background: #bcd5f0 url(../images/base/buttonEnabled.png) repeat-x top left;
+    color: #000000;
+}
+button.layui-btn:hover{
+    color:#243C5F;
+    opacity: 1;
+    filter: alpha(opacity=100);
+    background:#acc5e2 url("../images/base/buttonHover.png") repeat-x top left;
+}
+button.layui-btn-disabled, button.layui-btn-disabled:active, button.layui-btn-disabled:hover {
+    border-color: #eee!important;
+    background: #FBFBFB!important;
+    color: #d2d2d2!important;
+    cursor: not-allowed!important;
+    opacity: 1;
+}
+
+.layui-transfer-active button.layui-btn{
+    color: #333333;
+    border: 1px solid #8ba0bd;
+}
+.layui-transfer-active button.layui-btn-disabled {
+    color: #C9C9C9;
+}
+.layui-layer .layui-layer-btn {
+    padding: 5px 10px 10px;
+    border-top: 1px solid #E9E7E7;
+}
+.layui-btn-group .layui-btn:first-child{
+    border-left: 1px solid #8ba0bd;
+}
+
+.layui-laydate, .layui-laydate-hint {
+    background-color: #cfe5fa;
+    color: #333;
+    border: solid 1px #b5bcc7;
+    border-collapse: separate;
+    -moz-border-radius: 4px;
+    border-radius: 4px;
+}
+.layui-laydate-header {
+    border-bottom: 1px solid #b5bcc7;
+    padding-top: 5px;
+}
+.layui-laydate-header i{
+    font-size: 14px;
+    top:5px
+}
+.layui-laydate-content{
+    padding: 5px 10px 10px;
+}
+.layui-laydate-content .laydate-day-prev, .layui-laydate-content .laydate-day-next {
+    color: #759dc0;
+    background-color: #e5f2fe;
+}
+.layui-laydate-content table th{
+    background-color: #cfe5fa !important;
+    font-weight: bold;
+    color: #000000;
+}
+.layui-laydate-content td {
+    background-color: #ffffff;
+}
+.layui-laydate .layui-this {
+    background-color: #abd6ff !important;
+    color: #000 !important;
+}
+
+.layui-table-sort{
+    display: inline;
+}
+.layui-table-sort .layui-table-sort-asc{
+    top:1px;
+}
+.layui-table-sort .layui-table-sort-desc{
+    bottom: 1px;
+}
+
+.layout-button-up {
+    background: url('../images/base/layout_arrows.png') no-repeat -16px -16px;
+}
+.layout-button-down {
+    background: url('../images/base/layout_arrows.png') no-repeat -16px 0;
+}
+.layout-button-left {
+    background: url('../images/base/layout_arrows.png') no-repeat 0 0;
+}
+.layout-button-right {
+    background: url('../images/base/layout_arrows.png') no-repeat 0 -16px;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Source/platformProject/platform2022UI/style/css/layuimodify.css b/Source/platformProject/platform2022UI/style/css/layuimodify.css
new file mode 100644
index 0000000..6305899
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/css/layuimodify.css
@@ -0,0 +1,596 @@
+/**
+鐢ㄦ潵瑕嗙洊layui鏈韩鐨勬牱寮�
+璇峰皢鎵�鏈変慨鏀筶ayui涓殑鏍峰紡鍔犲埌杩欎釜鏂囦欢涓紝鏂逛究layui鍗囩骇
+@autor weidy
+ */
+
+
+/*棣栭〉鐨勫寳鍖洪珮搴︼紝浠�60淇敼涓�50*/
+.layui-layout-admin .layui-logo {
+	line-height:45px;
+	height:45px;
+	width: auto;
+} 
+
+/*鍏ㄦ枃妫�绱㈡*/
+.layui-layout-admin .layui-input-search{
+	display: inline-block;
+	vertical-align: middle;
+	height: 32px;
+	border: none;
+	cursor: text;
+}
+.layui-layout-admin .layui-header{
+	background-color:#FFF!important;
+	color:#000!important;
+	height:45px;
+}
+.layui-layout-admin .layui-header a{
+	color:#000!important;
+}
+.layui-layout-admin .layui-header .layui-nav-item {
+	line-height: 50px;
+}
+.layui-layout-admin .layui-side{
+	top:50px;
+}
+
+.layui-layout-admin .layui-body{
+	top:50px;
+	background-color:#f0f2f5!important;
+}
+.layui-layout-admin .layui-body .layui-tab-title{
+	background-color:#fff!important;
+	height: 32px;
+}
+.layui-col-space15{
+	margin:-5px;
+}
+.layui-col-space15>* {
+	padding: 8px;
+}
+.layui-tab-title{
+	height: 31px;
+}
+.layui-tab-title li {
+	line-height: 30px;
+
+}
+.layui-tab-title .layui-this{
+	color:#000;
+	border:1px solid #0e33d4;
+}
+.layui-tab-title .layui-this:after{
+	height: 31px;
+}
+/**
+棣栭〉杞挱涓嬫柟閫夋嫨鐐�
+ */
+.layui-carousel-ind li{
+	background-color: #4E5465;
+}
+
+.layui-carousel-ind li.layui-this{
+	background-color: RED;
+}
+
+/**
+淇敼琛ㄦ牸鐨勯棿璺�
+ */
+.layui-table-cell{
+	padding:  0 5px;
+}
+.layui-table-page{
+	padding: 3px 7px 0;
+	height: 35px;
+}
+/*
+鍙抽敭鑿滃崟鏍峰紡
+*/
+.rightMenu{
+	background: #ffffff;
+	z-index:999;
+}
+.rightMenu ul{
+	width:80px;
+	padding:2px;
+	color:#333;
+	border:1px solid #eeeeee;
+	cursor:pointer;
+}
+.rightMenu ul li{
+	text-align:center;
+	display:block;
+	height:25px;
+	line-height:25px;
+}
+/**澧炲姞缂栬緫鐨勬椂鍊欐樉绀鸿儗鏅壊*/
+.layui-table-edit_notsubmit{
+	background-color:rgb(223, 220, 71) !important;
+}
+.side-hover dd{
+	height: auto;
+}
+.side-hover span:nth-of-type(2){
+	top:4px;
+}
+.inputMargin10{
+	margin-left:10px;
+}
+
+fieldset {
+	border: none;
+	padding: 0;
+	margin-left: 50px;
+	margin-right: 50px;
+	border-top: 1px solid #d4d2d2;
+}
+fieldset legend{
+	margin-left: 50px;
+	padding: 0 10px;
+	font-size: 14px;
+}
+
+ fieldset legend a{
+	color: #898888;
+}
+
+.liucs .layui-layer-content {
+	overflow: hidden !important;
+}
+.layui-west {
+	width: 125px;
+	min-height: 800px;
+	background-color: #fff;
+	margin-bottom: 5px;
+	margin-right: 10px;
+}
+.layui-west fieldset {
+	width: 125px;
+	margin-bottom: 5px;
+}
+.layuiCenter {
+	overflow-y:auto;
+	background-color:#fff;
+}
+.layui-east {
+	width: 280px;
+	height: 815px;
+	background-color: #fff;
+	position: absolute;
+	top: 5px;
+	right: 0;
+	width: 280px;
+}
+
+.layui-btn-sm {
+	height: 28px;
+	line-height: 28px;
+	padding: 0 8px;
+}
+
+/* 琛ㄦ牸涓緱鎸夐挳 weidy@2018-05-03 */
+.layui-btn-intable{height:18px;line-height:18px;padding:0 5px; font-size:14px;background:none;color:#01AAED;text-decoration:underline;}
+.layui-btn-intable i{font-size:12px !important;}
+.layui-btn-intable:hover{color: #666666}
+
+.layui-upload-drag{
+	padding: 10px;
+}
+
+/* 宸ヨ鍒嗚Вcss */
+.pdm-label {
+  line-height:20px;
+  font-size:20px;
+  text-align:center;
+  width:100%;
+	font-weight:bold;
+	text-decoration: #96C7EA;
+}
+
+.layui-btn-pdm {
+	height:18px;
+	line-height:32px;
+	padding:0 5px; 
+	font-size:16px;
+	background:none;
+	color:#abedfc;
+	text-decoration:underline;
+}
+.layui-btn-pdm:hover {
+	color:#0e33d4;
+}
+.pdm-div {
+	font-size: 14px;
+}
+.pdm-div p {
+	display: inline-block;
+	width: 280px;
+	margin-bottom: 15px;
+}
+.pdm-div a {
+	color: #35a0fe;
+	font-size: 16px;
+}
+.pdm-refer {
+	margin: 0 5px;
+	position: relative;
+	float: left;
+}
+.pdm-refer input {
+	text-align: left;
+	width: 320px;
+	border-color: #FFB800;
+}
+.pdm-refer .layui-search {
+	position: absolute;
+	right: 11px;
+	top: 30%;
+	margin-top: 0px;
+	cursor: pointer;
+	font-family: "layui-icon" !important;
+	font-size: 16px;
+	font-style: normal;
+	-webkit-font-smoothing: antialiased;
+	-moz-osx-font-smoothing: grayscale;
+}
+.pdm-refer .layui-search::before {
+	content: "\e615";
+}
+
+
+
+/* 棣栭〉鏁翠綋淇敼 */
+.layui-layout-left {
+	left: 0px;
+}
+#portal_body {
+	padding: 3px;
+}
+#portal_head {
+	background-image: linear-gradient(to bottom, #4186ec , #0aa4de);
+	/* filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#4186ec', endColorstr='#0aa4de',GradientType=0 ); */
+	color: #fff !important;
+}
+#portal_head a {
+	color: #fff !important;
+	height: 45px !important;
+	line-height: 45px !important;
+}
+#portal_head dl {
+	background-image: linear-gradient(to bottom, #4186ec , #0aa4de);
+	filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#4186ec', endColorstr='#0aa4de',GradientType=0 );
+	color: #fff !important;
+}
+#portal_head .layui-nav-more {
+	right: -7px;
+}
+
+.bgcolor {
+	width: 100%;
+	height: 45px;
+	background-image: linear-gradient(to bottom, #4186ec , #0aa4de);
+	filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#4186ec', endColorstr='#0aa4de',GradientType=0 );
+}
+
+
+.layui-card{
+	border-radius: 10px;
+}
+.layui-card-header {
+	font-size: 14px;
+	border-bottom: 1px solid #96c7ea
+}
+.layui-nav .layui-nav-item a {
+	padding: 0 10px;
+	line-height: 35px;
+	height: 35px;
+}
+
+.layui-nav {
+	background: #fff;
+}
+.layui-nav a {
+	color: #000 !important;
+}
+
+#portal_menu_tree .layui-nav-more {
+	position: absolute;
+	top: 50%;
+	right: 3px;
+	margin-top: -3px;
+	border-width: 6px;
+	border-top-style: solid;
+	border-top-color: rgb(2, 0, 0) !important;
+	border-top-color: rgba(29, 25, 25, 0.7);
+}
+#portal_menu_tree .layui-nav-itemed .layui-nav-more {
+	border-top-color:#000;
+
+}
+.layui-nav-itemed >a  {
+	background: #00d2eb !important;
+	color: #fff !important;
+}
+
+
+#portal_menu_tree .layui-nav-child dd.layui-this {
+	background: #00d2eb !important;
+	background-image: linear-gradient(to right, #00d2eb , #4facfe);
+	filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#00d2eb', endColorstr='#4facfe',GradientType=1 );
+}
+#portal_menu_tree .layui-nav-child dd.layui-this a {
+	background: #00d2eb !important;
+	background-image: linear-gradient(to right, #00d2eb , #4facfe);
+	filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#00d2eb', endColorstr='#4facfe',GradientType=1 );
+	color: #fff !important;
+}
+/* .layui-nav-itemed .layui-this{
+	background: #00d2eb !important;
+	color: #fff !important;
+} */
+#portal_menu_tree .layui-nav li:hover{
+	background: #d4d8d8 !important;
+}
+#portal_menu_tree .layui-nav li a:hover{
+	background: #d4d8d8 !important;
+}
+
+#portal_menu_tree .layui-nav-itemed>.layui-nav-child {
+	background-color: #d4d8d8 !important;
+	background-image: linear-gradient(to right, #d4d8d8 , #fff);
+}
+
+#portal_menu_tree .layui-nav-item a:hover{
+	background: #d4d8d8 !important;
+}
+
+table th {
+	height: 35px;
+	background: #1a9ce2 !important;
+	color: #fff;
+}
+.layui-upload-list .layui-table th, .layui-upload-list .layui-table td{
+	padding: 5px 10px;
+	height: 20px;
+}
+
+table .layui-table-sort .layui-table-sort-asc {
+  border-bottom-color: #fff !important;
+}
+table .layui-table-sort .layui-table-sort-desc {
+  border-top-color: #fff !important;
+}
+table .layui-table-sort[lay-sort="asc"] .layui-table-sort-asc {
+  border-bottom-color: #b2b2b2 !important;
+}
+table .layui-table-sort[lay-sort="desc"] .layui-table-sort-desc {
+  border-top-color: #b2b2b2 !important;
+}
+
+table .layui-table-click {
+	background-color: #e6f7ff;
+}
+
+.layui-btn-container button {
+	/*background: #1a9ce2;*/
+}
+
+.layui-layer-btn0 {
+	background-color: #00d0f5 !important;
+}
+.layui-layer-btn1 {
+/*border: 1px solid #24d7f6 !important;
+color: #24d7f6 !important;*/
+}
+.layui-btn-intable i{font-size:12px !important;}
+.layui-btn-intable i{font-size:12px !important;}
+
+.layui-tree-head{
+cursor: pointer;
+}
+
+.layui-table td{
+font-size: 12px;
+min-height: 18px;
+line-height: 18px;
+}
+.layui-tree li a, .layui-tree li .layui-tree-spread {
+display: inline-block;
+vertical-align: middle;
+height: 26px;
+line-height: 26px;
+}
+.layui-tree li a cite {
+font-size: 12px;
+}
+
+.layui-form-label {
+font-size: 12px;
+	font-weight: 400;
+}
+
+#portal_logo {
+padding-left: 10px;
+color: #fff;
+font-size: 18px;
+left: 100px;
+}
+
+
+
+
+/* workerMain */
+#portal_worker {
+	position: relative;
+	padding: 10px;
+}
+.worker-page {
+	width: 100%;
+	height: 100%;
+	background-color: #fff;
+}
+
+.worker-head {
+	width: 100%;
+	height: 100px;
+	/* background-color: pink; */
+}
+.worker-head div:first-child {
+	/* display: inline-block; */
+}
+.worker-head .search {
+	margin-bottom: 20px;
+	display: inline-block;
+	width: 300px;
+	height: 35px;
+	line-height: 50px;
+	float: left;
+	/* position: relative; */
+}
+.worker-head .search:nth-child(2) {
+	margin-left: 155px;
+	margin-right: 90px;
+}
+.worker-head .search span:first-child {
+	width: 80px;
+	text-align: right;
+}
+.worker-head .search span:nth-child(2) {
+	width: 180px;
+	display: inline-block;
+	position: relative;
+}
+.worker-head .label {
+	float: left;
+    font-size: 20px;
+    line-height: 32px;
+    font-weight: bold;
+	color: #00a2ed;
+	margin-right: 5px;
+}
+.worker-head input {
+    float: left;
+    display: block;
+    padding: 9px 15px;
+    width: 180px;
+    font-weight: 400;
+    line-height: 20px;
+	text-align: left;
+	height: 30px;
+	border-color: #FFB800;
+}
+.worker-head .layui-search {
+    position: absolute;
+    right: 11px;
+    top: -10px;
+    margin-top: 0px;
+    cursor: pointer;
+    font-family: "layui-icon" !important;
+    font-size: 16px;
+    font-style: normal;
+    -webkit-font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
+}
+.worker-head .layui-search::before {
+	content: "\e615";
+}
+.worker-head .worker-btn  {
+	float: left;
+}
+.worker-head .worker-item  {
+	position: absolute;
+	right: 22px;
+	width: 140px;
+}
+.worker-head .worker-item p  {
+	margin-bottom: 5px;
+	height: 30px;
+	line-height: 30px;
+	text-align: center;
+}
+.worker-head .worker-item span {
+	display: inline-block;
+	background-color: #fff;
+	color: #000;
+	width: 20px;
+	height: 14px;
+	text-align: center;
+	vertical-align:middle;   
+	line-height: 14px;
+}
+.worker-head  {}
+.worker-head  {}
+
+
+
+.worker-main {
+	clear: both;
+}
+.worker-main .tableStatus {
+	width: 70px;
+}
+
+.worker-main td {
+	height: 30px;
+}
+
+.worker-footer {
+	height: 100px;
+}
+
+.worker-footer .worker-left {
+	float: left;
+	width: 220px;
+	height: 100px;
+	vertical-align:middle;   
+	padding-top: 5px;
+}
+
+.worker-footer .worker-right {
+	float: left;
+}
+
+.soild div {
+	width: 240px;
+	height: 100px;
+	padding-top: 5px;
+	float: left;
+	text-align: center;
+	background-color: #20c6a7;
+	background-image: linear-gradient(to bottom right, #20c6a7 , #28c260);
+	border-radius: 5px;
+	box-shadow: 2px 2px 5px #909090;
+}
+.soild-color {
+	color: #fff9ec;
+	font-size: 9px;
+	text-align: left;
+	padding-top:2px;
+}
+
+
+cite {
+	color: #000 !important;
+}
+
+.layui-none {
+	color: #000 !important;
+}
+
+.layui-card-header {
+	color: #000 !important;
+}
+#portal_menu_tree span {
+	color: #000 !important;
+}
+
+html{
+	-webkit-text-size-adjust:none;
+}
+
+.layui-table-tips-c{
+	line-height: 16px;
+	font-size: 12px;
+}
+
diff --git a/Source/platformProject/platform2022UI/style/css/login.css b/Source/platformProject/platform2022UI/style/css/login.css
new file mode 100644
index 0000000..9f7eb6c
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/css/login.css
@@ -0,0 +1,222 @@
+* {
+	margin: 0;
+	padding: 0;
+}
+
+body {
+	width: 100%;
+	overfloat: hidden;
+	width:100%;
+	height:100%;
+	margin:0px;
+	padding:0px;
+	/*background-repeat:no-repeat;*/
+	filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale')";
+	/*-moz-background-size: "100%聽100%";*/
+	聽聽聽background-size:cover
+}
+
+#background img{
+	width:100%;
+	position: fixed;right: 0;bottom: 0;
+	min-width: 100%;
+	min-height: 100%;
+	height: auto;
+	z-index: -100;
+	background-size: cover;
+}
+ul,ol,li {
+	list-style-type: none;
+}
+/*绯荤粺鍚嶇О*/
+.systemTitleImg{
+	position: fixed;
+	width: 800px;
+	height: 80px;
+	top: 45%;
+	left: 10%;
+	background-repeat:no-repeat;
+}
+
+.login {
+	position: fixed;
+	width: 400px;
+	top: 45%;
+	left: 50%;
+	background-color: #EAEAEA;
+	border-radius: 5px;
+	padding: 20px 20px 40px 20px;
+	margin-top: -120px;
+	margin-left: -220px;
+	color: red;
+}
+
+.dm_login {
+	text-align: center;
+	width: 100%;
+	position: relative;
+}
+
+.login_left{
+	float: left;
+}
+.login_right{
+	float: right;
+}
+.dm_login_user_pic {
+	width: 120px;
+	height: 120px;
+	padding-top: 20px;
+}
+
+
+.loginTabs {
+	background-color: #EAEAEA;
+	margin-right: 10px;
+}
+
+.loginTabs .content {
+	height: 130px;
+}
+
+
+.username {
+	margin-top: 20px;
+}
+
+.login_in_one {
+	width: 134%;
+	height: 31px;
+	border: none;
+	margin-bottom: 25px;
+}
+
+.login_in_one input {
+	color: #000;
+	float: left;
+	width: 228px;
+	height: 38px;
+	line-height: 38px;
+	border: none;
+	outline: none;
+	font-size: 13px;
+	background: #FFF;
+	border: 1px solid #aaa;
+	border-left: none;
+}
+
+
+
+.login_in_one_left {
+	background-color: white;
+	border: 1px solid #aaa;
+	border-right: none;
+	height: 38px;
+	float: left;
+	width: 30px;
+}
+
+.login_in_one_left_img1 {
+	width: 20px;
+	padding-top: 7px;
+	padding-right: 5px;
+}
+
+.login_in_one_left_img2 {
+	width: 16px;
+	padding-top: 6px;
+}
+
+
+.login_in_three img {
+	margin: 0 auto;
+	width: 60px;
+	height: 60px;
+	font-size: 12px;
+	line-height: 30px;
+}
+
+
+
+.login_in_three {
+	color: #ffffff;
+	font-size: 16px;
+	height: 38px;
+	line-height: 38px;
+	border: 1px solid #ccc;
+	background-color: #38adff;
+	width: 258px;
+	cursor: pointer;
+}
+
+
+
+.toolbar {
+	height: 30px;
+	padding-top: 20px;
+}
+
+
+.login_in_two_left {
+	float: left;
+	color: #616161;
+	font-size: 13px;
+	padding-right: 10px;
+}
+
+.login_in_two_right {
+	float: right;
+	color: #616161;
+	font-size: 13px;
+	padding-right: 10px;
+}
+
+.msg {
+	height: 16px;
+	line-height: 16px;
+	color: red;
+	float: left;
+}
+.loading{
+	display: none;
+	position: absolute;
+	top: 45%;
+	left: 50%;
+	z-index:1003;
+	width:320px;
+	height:25px;
+	border: 2px solid #ccc;
+	border-radius:5px;
+	margin-left: -160px;
+	margin-top: 130px;
+	text-indent: 18px;
+	line-height: 26px;
+}
+
+.processbar{
+	display: none;
+	position: absolute;
+	top: 0%;
+	left: 0%;
+	width:0px;
+	height:25px;
+	margin-bottom:2px;
+	border-radius:3px;
+	background-image:url(../images/base/login/progress-default-bg.gif);
+}
+.loadbg{
+	display: none;
+	position: absolute;
+	top: 0%;
+	left: 0%;
+	width: 100%;
+	height: 100%;
+	background-color: black;
+	z-index:1001;
+	-moz-opacity: 0.3;
+	opacity:.3;
+	filter: alpha(opacity=30);
+}
+
+
+
diff --git a/Source/platformProject/platform2022UI/style/css/markdown.min.css b/Source/platformProject/platform2022UI/style/css/markdown.min.css
new file mode 100644
index 0000000..7fff141
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/css/markdown.min.css
@@ -0,0 +1,230 @@
+.markdownDiv img {
+    max-width: 100%
+}
+
+.markdownDiv h1, .markdownDiv h2, .markdownDiv h3, .markdownDiv h4 {
+    color: #111;
+    font-weight: 400;
+    margin-top: 1em
+}
+
+.markdownDiv h1, .markdownDiv h2, .markdownDiv h3, .markdownDiv h4, .markdownDiv h5 {
+    font-family: Georgia, Palatino, serif
+}
+
+.markdownDiv dl, .markdownDiv h1, .markdownDiv h2, .markdownDiv h3, .markdownDiv h4, .markdownDiv h5 {
+    margin-bottom: 16px;
+    padding: 0
+}
+
+.markdownDiv p {
+    margin-top: 8px;
+    margin-bottom: 3px
+}
+
+.markdownDiv h1 {
+    font-size: 48px;
+    line-height: 54px
+}
+
+.markdownDiv h2 {
+    font-size: 36px;
+    line-height: 42px
+}
+
+.markdownDiv h1, .markdownDiv h2 {
+    border-bottom: 1px solid #EFEAEA;
+    padding-bottom: 10px
+}
+
+.markdownDiv h3 {
+    font-size: 24px;
+    line-height: 30px
+}
+
+.markdownDiv h4 {
+    font-size: 21px;
+    line-height: 26px
+}
+
+.markdownDiv h5 {
+    font-size: 18px;
+    line-height: 23px
+}
+
+.markdownDiv a {
+    color: #09f;
+    margin: 0 2px;
+    padding: 0;
+    vertical-align: baseline;
+    text-decoration: none
+}
+
+.markdownDiv a:hover {
+    text-decoration: none;
+    color: #f60
+}
+
+.markdownDiv ol, .markdownDiv ul {
+    padding: 0;
+    padding-left: 18px;
+    margin: 0
+}
+
+.markdownDiv li {
+    line-height: 24px
+}
+.markdownDiv li::marker {
+    unicode-bidi: isolate;
+    font-variant-numeric: tabular-nums;
+    text-transform: none;
+    text-indent: 0px !important;
+    text-align: start !important;
+    text-align-last: start !important;
+}
+.markdownDiv ol, .markdownDiv p, .markdownDiv ul {
+    font-size: 16px;
+    line-height: 24px
+}
+
+.markdownDiv ol ol, .markdownDiv ul ol {
+    list-style-type: lower-roman
+}
+
+.markdownDiv code, .markdownDiv pre {
+    font-family: Consolas, Monaco, Andale Mono, monospace;
+    background-color: #f7f7f7;
+    color: inherit
+}
+
+.markdownDiv code {
+    font-family: Consolas, Monaco, Andale Mono, monospace;
+    margin: 0 2px
+}
+
+.markdownDiv pre {
+    font-family: Consolas, Monaco, Andale Mono, monospace;
+    line-height: 1.7em;
+    overflow: auto;
+    padding: 6px 10px;
+    border-left: 5px solid #6CE26C
+}
+
+.markdownDiv pre > code {
+    font-family: Consolas, Monaco, Andale Mono, monospace;
+    border: 0;
+    display: inline;
+    max-width: initial;
+    padding: 0;
+    margin: 0;
+    overflow: initial;
+    line-height: 1.6em;
+    font-size: .95em;
+    white-space: pre;
+    background: 0 0
+}
+
+.markdownDiv code {
+    color: #666555
+}
+
+.markdownDiv aside {
+    display: block;
+    float: right;
+    width: 390px
+}
+
+.markdownDiv blockquote {
+    border-left: .5em solid #eee;
+    padding: 0 0 0 2em;
+    margin-left: 0
+}
+
+.markdownDiv blockquote cite {
+    font-size: 14px;
+    line-height: 20px;
+    color: #bfbfbf
+}
+
+.markdownDiv blockquote cite:before {
+    content: '\2014 \00A0'
+}
+
+.markdownDiv blockquote p {
+    color: #666
+}
+
+.markdownDiv hr {
+    text-align: left;
+    color: #999;
+    height: 2px;
+    padding: 0;
+    margin: 16px 0;
+    background-color: #e7e7e7;
+    border: 0 none
+}
+
+.markdownDiv dl {
+    padding: 0
+}
+
+.markdownDiv dl dt {
+    padding: 10px 0;
+    margin-top: 16px;
+    font-size: 1em;
+    font-style: italic;
+    font-weight: 700
+}
+
+.markdownDiv dl dd {
+    padding: 0 16px;
+    margin-bottom: 16px
+}
+
+.markdownDiv dd {
+    margin-left: 0
+}
+
+.markdownDiv table {
+    border-spacing: 0;
+    width: 100%
+}
+
+.markdownDiv table {
+    border: solid #01AAED 1px
+}
+
+.markdownDiv table thead {
+    background: #00d2eb;
+}
+
+.markdownDiv table thead tr:hover {
+    background: #f7f7f7
+}
+
+.markdownDiv table tr:hover {
+    background: #fbf8e9;
+    -o-transition: all .1s ease-in-out;
+    -webkit-transition: all .1s ease-in-out;
+    -moz-transition: all .1s ease-in-out;
+    -ms-transition: all .1s ease-in-out;
+    transition: all .1s ease-in-out
+}
+
+.markdownDiv .table th, .markdownDiv table td {
+    border-left: 1px solid #ccc;
+    border-top: 1px solid #ccc;
+    padding: 10px;
+    text-align: left
+}
+
+.markdownDiv table th {
+    border-top: none;
+    text-shadow: 0 1px 0 rgba(255, 255, 255, .5);
+    padding: 5px;
+    border-left: 1px solid #ccc
+}
+
+.markdownDiv table td:first-child, .markdownDiv table th:first-child {
+    border-left: none
+}
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/style/css/vciproject.css b/Source/platformProject/platform2022UI/style/css/vciproject.css
new file mode 100644
index 0000000..d9838b9
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/css/vciproject.css
@@ -0,0 +1,233 @@
+/**
+鍏徃鐨勯」鐩崟鐙殑鏍峰紡锛屽嵆涓巐ayui鏃犲叧锛岃�屾槸椤圭洰涓婇渶瑕佺殑鏍峰紡
+璇烽伒浠庢鏂囦欢鐨勮姹�
+@autor weidy
+ */
+
+.layui-bg-vcimenu{
+	background-color:#f5f5f5;
+	overflow-y:auto;
+}
+
+
+.layui-vci-portal-topbar{
+	border-bottom: 1px solid #9F9F9F !important;
+}
+.layui-bg-208 .layui-nav-more{
+	border-top-color:#0F0E0E !important;
+}
+/*涓婚〉涓殑閰嶇疆*/
+.layui-vci-mes208-index{
+	position: relative;
+	height:100%;
+	width:100%;
+	overflow:hidden;
+	overflow-y:auto;
+	background-color:#f2f2f2;
+}
+
+
+/*鏀惰棌鍔熻兘鎸備欢涓殑閰嶇疆*/
+.layui-vci-fav {
+	margin:0 ;
+	background-color: #fff;
+}
+.layui-vci-fav ul{
+	background-color: #fff!important;
+}
+.layui-vci-fav li{
+	text-align:center;
+	color:#666;
+}
+.layui-vci-fav a {
+	color:#333;
+	text-decoration: none;
+}
+.layui-vci-fav li .layui-icon {
+	display:inline-block;
+	width:100%;
+	height: 60px;
+	line-height: 60px;
+	text-align: center;
+	-webkit-border-radius: 2px;
+	-moz-border-radius: 2px;
+	border-radius: 2px;
+	color:#333;
+	background-color: #F8F8F8;
+	-webkit-transition: all .3s;
+}
+.layui-vci-fav li img{
+	display:inline-block;
+	width:100%;
+	height: 60px;
+	line-height: 60px;
+	text-align: center;
+	-webkit-border-radius: 2px;
+	-moz-border-radius: 2px;
+	border-radius: 2px;
+	color:#333;
+	background-color: #F8F8F8;
+	-webkit-transition: all .3s;
+}
+
+.layui-vci-fav li cite{
+	position: relative;
+	top: 2px;
+	display: block;
+	color: #666;
+	text-overflow: ellipsis;
+	overflow: hidden;
+	font-size: 8px;
+	word-wrap:break-word;
+}
+
+/*寰呭姙浜嬮」*/
+.layui-vci-undotask {
+	margin:0 ;
+	background-color: #fff;
+}
+
+.layui-vci-undotask ul{
+	background-color: #fff!important;
+}
+.layui-vci-undotask li{
+	float: left;
+
+}
+.layui-vci-undotask a {
+	display: block;
+	padding: 10px 5px 0;
+	background-color: #f8f8f8;
+	color: #999;
+	border-radius: 2px;
+	transition: all .3s;
+	-webkit-transition: all .3s;
+}
+
+.layui-vci-undotask h3{
+	padding-bottom: 5px;
+	font-size: 14px;
+	text-align:center;
+	white-space:nowrap;
+	-ms-text-overflow: ellipsis;
+	text-overflow: ellipsis;
+	overflow:hidden;
+}
+
+.layui-vci-undotask cite{
+	font-style: normal;
+	font-size: 30px;
+	font-weight: 300;
+	color: #009688;
+}
+
+.layui-vci-undotask .vci-need-do{
+	color:#ff510f;
+}
+
+/*鎸備欢鐨勬渶鍙充晶淇℃伅鍥炬爣*/
+.layui-portal-home .layui-icon-tips{
+	line-height: initial;
+	position: absolute;
+	right: 10px;
+	top: 50%;
+	margin-top: -7px;
+	cursor: pointer;
+}
+
+/*鎸備欢涓婄殑杩涘叆涓績鐨勬寜閽�*/
+.layui-vci-mes208-index .layui-icon-release{
+	line-height: initial;
+	position: absolute;
+	right: 35px;
+	top: 50%;
+	margin-top: -7px;
+	cursor: pointer;
+}
+
+/*浠诲姟瀹屾垚缁熻鎸備欢鍘婚櫎閲嶅彔*/
+.layui-vci-workfinishPortlet{
+	padding-top: 5px;
+}
+/*鏄剧ず鏂囨湰锛屽疄闄呭幓闄ら噸鍙犵殑鍦版柟*/
+.layui-vci-workfinishPortlet h3{
+	position: absolute;
+	right: 0;
+	top: -35px;
+	color: #999;
+	font-size: 14px;
+}
+.layui-vci-workfinishPortlet .layui-progress{
+	margin: 50px 0 60px;
+}
+.layui-vci-workfinishPortlet .layui-progress-bar{
+	text-align: left;
+}
+.layui-vci-workfinishPortlet .layui-progress-text{
+	top: -35px;
+	line-height: 26px;
+	font-size: 26px;
+}
+
+.layui-vci-sessionRemind{
+	position: fixed;
+	top: 0px;
+	left: 0px;
+	width: 100%;
+	height:50px;
+	line-height: 50px;
+	z-index: 100000;
+	background: #fff;
+	color: RED;
+	font-size: 28px;
+	display: none;
+	text-align: center;
+}
+.layui-vci-sessionRemind span{
+	display: inline-block;
+	padding-left: 20px;
+	margin-right:10px;
+}
+
+.layui-vci-sessionRemind span img{
+	width:34px;
+	height: 34px;
+}
+.layui-vci-warning{
+	position: fixed;
+	top: 0px;
+	left: 0px;
+	width: 100%;
+	height:50px;
+	line-height: 50px;
+	z-index: 100001;
+	background: #fff;
+	color: RED;
+	font-size: 28px;
+	display: none;
+	text-align: center;
+}
+.layui-vci-warning span{
+	display: inline-block;
+	padding-left: 20px;
+	margin-right:10px;
+}
+ [name=orderorgnamelink] {
+	text-decoration: underline;
+	color:blue;
+}
+
+
+.worker-head-icon {
+	position: absolute;
+	right: 15px;
+	top: 8px;
+}
+.worker-head-icon li {
+	float: left;
+	margin-left: 5px;
+	cursor: pointer;
+}
+.worker-head-icon li i::before {
+	font-size: 30px;
+}
\ No newline at end of file
diff --git a/Source/platformProject/platform2022UI/style/font/loginform-icon.eot b/Source/platformProject/platform2022UI/style/font/loginform-icon.eot
new file mode 100644
index 0000000..19a306e
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/font/loginform-icon.eot
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/font/loginform-icon.svg b/Source/platformProject/platform2022UI/style/font/loginform-icon.svg
new file mode 100644
index 0000000..5e19eea
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/font/loginform-icon.svg
@@ -0,0 +1,42 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata>
+Created by FontForge 20100429 at Wed Feb 20 10:42:27 2013
+ By root
+Copyright (C) 2012 by original authors @ fontello.com
+</metadata>
+<defs>
+<font id="loginform-icon" horiz-adv-x="364" >
+  <font-face 
+    font-family="loginform-icon"
+    font-weight="500"
+    font-stretch="normal"
+    units-per-em="1000"
+    panose-1="2 0 6 3 0 0 0 0 0 0"
+    ascent="850"
+    descent="-150"
+    x-height="779"
+    bbox="14.7143 -141.28 801 838.706"
+    underline-thickness="50"
+    underline-position="-100"
+    unicode-range="U+0063-0075"
+  />
+<missing-glyph 
+d="M33 0v666h265v-666h-265zM66 33h199v600h-199v-600z" />
+    <glyph glyph-name=".notdef" 
+d="M33 0v666h265v-666h-265zM66 33h199v600h-199v-600z" />
+    <glyph glyph-name=".null" horiz-adv-x="0" 
+ />
+    <glyph glyph-name="nonmarkingreturn" horiz-adv-x="333" 
+ />
+    <glyph glyph-name="c" unicode="c" horiz-adv-x="697" 
+d="M264 0q-34 0 -56 28l-180 236q-25 39 -2 78.5t67 33.5q29 -5 47 -28l118 -154l296 474q15 23 41 30t55 -8q23 -15 30 -41t-8 -55l-350 -560q-20 -32 -56 -32z" />
+    <glyph glyph-name="p" unicode="p" horiz-adv-x="810" 
+d="M761 397q-48 -99 -150 -117q-67 -12 -130 -2l-118 -194l-70 -12l-104 -166q-13 -27 -46 -32l-76 -14q-13 -4 -22.5 4.5t-11.5 21.5l-16 98q-8 30 12 56l258 386q-25 51 -38 120q-10 57 7 108t52.5 87t81.5 60t97 33q107 20 195 -45q89 -65 107 -177q20 -117 -28 -215z
+M663 536q30 49 20 100t-50 80q-53 37 -109 17.5t-75 -72.5q-4 -10 4 -36q4 -13 31 -32q12 -8 67 -49q6 -5 42 -28q13 -8 19 -8q32 0 51 28z" />
+    <glyph glyph-name="u" unicode="u" horiz-adv-x="816" 
+d="M164 -79q-67 0 -108 39.5t-41 105.5q0 199 83 279q43 41 110 41q6 0 24 -12q31 -20 50 -31t55 -23t71 -12q73 0 135 39l21 14l20 13q18 12 24 12q148 0 183 -201q10 -57 10 -119q0 -66 -41 -105.5t-108 -39.5h-488zM194 564q0 90 62 152q63 63 152 63q88 0 151 -63
+t63 -152q0 -88 -63 -151t-151 -63q-89 0 -152 63q-62 62 -62 151z" />
+  </font>
+</defs></svg>
diff --git a/Source/platformProject/platform2022UI/style/font/loginform-icon.ttf b/Source/platformProject/platform2022UI/style/font/loginform-icon.ttf
new file mode 100644
index 0000000..fe400d2
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/font/loginform-icon.ttf
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/font/loginform-icon.woff b/Source/platformProject/platform2022UI/style/font/loginform-icon.woff
new file mode 100644
index 0000000..4fb6aca
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/font/loginform-icon.woff
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/button/assignOrg.png b/Source/platformProject/platform2022UI/style/images/base/button/assignOrg.png
new file mode 100644
index 0000000..c32d25c
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/button/assignOrg.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/button/assignRole.png b/Source/platformProject/platform2022UI/style/images/base/button/assignRole.png
new file mode 100644
index 0000000..c77ed88
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/button/assignRole.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/button/assignUser.png b/Source/platformProject/platform2022UI/style/images/base/button/assignUser.png
new file mode 100644
index 0000000..b3454e1
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/button/assignUser.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/button/attach.png b/Source/platformProject/platform2022UI/style/images/base/button/attach.png
new file mode 100644
index 0000000..ea897cc
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/button/attach.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/button/cancel.gif b/Source/platformProject/platform2022UI/style/images/base/button/cancel.gif
new file mode 100644
index 0000000..c1019fe
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/button/cancel.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/button/comment.png b/Source/platformProject/platform2022UI/style/images/base/button/comment.png
new file mode 100644
index 0000000..7bc9233
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/button/comment.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/button/comment_add.png b/Source/platformProject/platform2022UI/style/images/base/button/comment_add.png
new file mode 100644
index 0000000..75e78de
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/button/comment_add.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/button/comment_delete.png b/Source/platformProject/platform2022UI/style/images/base/button/comment_delete.png
new file mode 100644
index 0000000..643fdbe
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/button/comment_delete.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/button/comments.png b/Source/platformProject/platform2022UI/style/images/base/button/comments.png
new file mode 100644
index 0000000..39433cf
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/button/comments.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/button/disk.png b/Source/platformProject/platform2022UI/style/images/base/button/disk.png
new file mode 100644
index 0000000..99d532e
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/button/disk.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/button/down.gif b/Source/platformProject/platform2022UI/style/images/base/button/down.gif
new file mode 100644
index 0000000..82a42e7
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/button/down.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/button/folder.png b/Source/platformProject/platform2022UI/style/images/base/button/folder.png
new file mode 100644
index 0000000..784e8fa
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/button/folder.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/button/importExcel.png b/Source/platformProject/platform2022UI/style/images/base/button/importExcel.png
new file mode 100644
index 0000000..eb6158e
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/button/importExcel.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/button/in.png b/Source/platformProject/platform2022UI/style/images/base/button/in.png
new file mode 100644
index 0000000..41676a0
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/button/in.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/button/information.png b/Source/platformProject/platform2022UI/style/images/base/button/information.png
new file mode 100644
index 0000000..12cd1ae
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/button/information.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/button/mail.png b/Source/platformProject/platform2022UI/style/images/base/button/mail.png
new file mode 100644
index 0000000..ca7af05
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/button/mail.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/button/notAllow.png b/Source/platformProject/platform2022UI/style/images/base/button/notAllow.png
new file mode 100644
index 0000000..5e3c907
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/button/notAllow.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/button/out.png b/Source/platformProject/platform2022UI/style/images/base/button/out.png
new file mode 100644
index 0000000..2541d2b
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/button/out.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/button/pencil_add.png b/Source/platformProject/platform2022UI/style/images/base/button/pencil_add.png
new file mode 100644
index 0000000..902bbe6
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/button/pencil_add.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/button/preview.png b/Source/platformProject/platform2022UI/style/images/base/button/preview.png
new file mode 100644
index 0000000..a9562c9
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/button/preview.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/button/printer.png b/Source/platformProject/platform2022UI/style/images/base/button/printer.png
new file mode 100644
index 0000000..a350d18
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/button/printer.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/button/schema_add.png b/Source/platformProject/platform2022UI/style/images/base/button/schema_add.png
new file mode 100644
index 0000000..31edfce
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/button/schema_add.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/button/table_add.png b/Source/platformProject/platform2022UI/style/images/base/button/table_add.png
new file mode 100644
index 0000000..6332fef
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/button/table_add.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/button/table_cleanref.png b/Source/platformProject/platform2022UI/style/images/base/button/table_cleanref.png
new file mode 100644
index 0000000..9b86030
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/button/table_cleanref.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/button/table_copy.png b/Source/platformProject/platform2022UI/style/images/base/button/table_copy.png
new file mode 100644
index 0000000..195dc6d
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/button/table_copy.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/button/table_delete.png b/Source/platformProject/platform2022UI/style/images/base/button/table_delete.png
new file mode 100644
index 0000000..08f2493
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/button/table_delete.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/button/table_disabled.png b/Source/platformProject/platform2022UI/style/images/base/button/table_disabled.png
new file mode 100644
index 0000000..f4f6be5
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/button/table_disabled.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/button/table_edit.png b/Source/platformProject/platform2022UI/style/images/base/button/table_edit.png
new file mode 100644
index 0000000..bfcb024
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/button/table_edit.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/button/table_enable.png b/Source/platformProject/platform2022UI/style/images/base/button/table_enable.png
new file mode 100644
index 0000000..6187b15
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/button/table_enable.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/button/table_modify.png b/Source/platformProject/platform2022UI/style/images/base/button/table_modify.png
new file mode 100644
index 0000000..046811e
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/button/table_modify.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/button/table_refresh.png b/Source/platformProject/platform2022UI/style/images/base/button/table_refresh.png
new file mode 100644
index 0000000..5cc2b0d
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/button/table_refresh.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/button/table_search.png b/Source/platformProject/platform2022UI/style/images/base/button/table_search.png
new file mode 100644
index 0000000..6dd1931
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/button/table_search.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/button/table_sync.png b/Source/platformProject/platform2022UI/style/images/base/button/table_sync.png
new file mode 100644
index 0000000..0de2656
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/button/table_sync.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/button/trans.png b/Source/platformProject/platform2022UI/style/images/base/button/trans.png
new file mode 100644
index 0000000..46c75aa
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/button/trans.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/button/trash.gif b/Source/platformProject/platform2022UI/style/images/base/button/trash.gif
new file mode 100644
index 0000000..4b07af8
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/button/trash.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/button/tree_leaf.gif b/Source/platformProject/platform2022UI/style/images/base/button/tree_leaf.gif
new file mode 100644
index 0000000..168798a
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/button/tree_leaf.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/button/unReadMsg.png b/Source/platformProject/platform2022UI/style/images/base/button/unReadMsg.png
new file mode 100644
index 0000000..ca7af05
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/button/unReadMsg.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/button/up.gif b/Source/platformProject/platform2022UI/style/images/base/button/up.gif
new file mode 100644
index 0000000..dc73647
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/button/up.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/buttonEnabled.png b/Source/platformProject/platform2022UI/style/images/base/buttonEnabled.png
new file mode 100644
index 0000000..51ac91e
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/buttonEnabled.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/buttonHover.png b/Source/platformProject/platform2022UI/style/images/base/buttonHover.png
new file mode 100644
index 0000000..61a6cd6
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/buttonHover.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/flow/end.png b/Source/platformProject/platform2022UI/style/images/base/flow/end.png
new file mode 100644
index 0000000..b461969
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/flow/end.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/flow/gateway.png b/Source/platformProject/platform2022UI/style/images/base/flow/gateway.png
new file mode 100644
index 0000000..f60f323
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/flow/gateway.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/flow/gatewayIn.png b/Source/platformProject/platform2022UI/style/images/base/flow/gatewayIn.png
new file mode 100644
index 0000000..e7c19b1
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/flow/gatewayIn.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/flow/mail.png b/Source/platformProject/platform2022UI/style/images/base/flow/mail.png
new file mode 100644
index 0000000..6c3ea15
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/flow/mail.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/flow/messages.png b/Source/platformProject/platform2022UI/style/images/base/flow/messages.png
new file mode 100644
index 0000000..8791e6c
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/flow/messages.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/flow/painterBg.png b/Source/platformProject/platform2022UI/style/images/base/flow/painterBg.png
new file mode 100644
index 0000000..bcfe401
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/flow/painterBg.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/flow/reference.png b/Source/platformProject/platform2022UI/style/images/base/flow/reference.png
new file mode 100644
index 0000000..19aedc3
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/flow/reference.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/flow/service.png b/Source/platformProject/platform2022UI/style/images/base/flow/service.png
new file mode 100644
index 0000000..f54b9d3
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/flow/service.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/flow/start.png b/Source/platformProject/platform2022UI/style/images/base/flow/start.png
new file mode 100644
index 0000000..a0fda52
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/flow/start.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/flow/timer.png b/Source/platformProject/platform2022UI/style/images/base/flow/timer.png
new file mode 100644
index 0000000..c498ec4
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/flow/timer.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/flow/userTask.png b/Source/platformProject/platform2022UI/style/images/base/flow/userTask.png
new file mode 100644
index 0000000..fc9abb6
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/flow/userTask.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/index/dm_index_exit.png b/Source/platformProject/platform2022UI/style/images/base/index/dm_index_exit.png
new file mode 100644
index 0000000..6f5b55c
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/index/dm_index_exit.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/index/dm_index_fav.png b/Source/platformProject/platform2022UI/style/images/base/index/dm_index_fav.png
new file mode 100644
index 0000000..1f4f3c8
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/index/dm_index_fav.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/index/dm_index_menu_bus.png b/Source/platformProject/platform2022UI/style/images/base/index/dm_index_menu_bus.png
new file mode 100644
index 0000000..d4b41c0
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/index/dm_index_menu_bus.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/index/dm_index_notification.png b/Source/platformProject/platform2022UI/style/images/base/index/dm_index_notification.png
new file mode 100644
index 0000000..a97d95c
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/index/dm_index_notification.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/index/dm_index_person.png b/Source/platformProject/platform2022UI/style/images/base/index/dm_index_person.png
new file mode 100644
index 0000000..c95d50e
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/index/dm_index_person.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/index/dm_index_system.png b/Source/platformProject/platform2022UI/style/images/base/index/dm_index_system.png
new file mode 100644
index 0000000..c61819a
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/index/dm_index_system.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/index/dm_index_unfav.png b/Source/platformProject/platform2022UI/style/images/base/index/dm_index_unfav.png
new file mode 100644
index 0000000..cf49bbc
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/index/dm_index_unfav.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/index/nosession.png b/Source/platformProject/platform2022UI/style/images/base/index/nosession.png
new file mode 100644
index 0000000..b40d1f7
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/index/nosession.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/index/sessionRemind.png b/Source/platformProject/platform2022UI/style/images/base/index/sessionRemind.png
new file mode 100644
index 0000000..9aebf19
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/index/sessionRemind.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/layout_arrows.png b/Source/platformProject/platform2022UI/style/images/base/layout_arrows.png
new file mode 100644
index 0000000..6f41654
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/layout_arrows.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/login/background-access.png b/Source/platformProject/platform2022UI/style/images/base/login/background-access.png
new file mode 100644
index 0000000..b7fb323
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/login/background-access.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/login/background-classic.png b/Source/platformProject/platform2022UI/style/images/base/login/background-classic.png
new file mode 100644
index 0000000..3f12ea9
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/login/background-classic.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/login/background-gray.png b/Source/platformProject/platform2022UI/style/images/base/login/background-gray.png
new file mode 100644
index 0000000..9872dac
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/login/background-gray.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/login/background-naptune.png b/Source/platformProject/platform2022UI/style/images/base/login/background-naptune.png
new file mode 100644
index 0000000..922a6cc
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/login/background-naptune.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/login/code.png b/Source/platformProject/platform2022UI/style/images/base/login/code.png
new file mode 100644
index 0000000..d71e20c
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/login/code.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/login/login_name.png b/Source/platformProject/platform2022UI/style/images/base/login/login_name.png
new file mode 100644
index 0000000..a397e72
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/login/login_name.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/login/login_pic.png b/Source/platformProject/platform2022UI/style/images/base/login/login_pic.png
new file mode 100644
index 0000000..59c7278
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/login/login_pic.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/login/login_pw.png b/Source/platformProject/platform2022UI/style/images/base/login/login_pw.png
new file mode 100644
index 0000000..dd6e60b
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/login/login_pw.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/login/progress-default-bg.gif b/Source/platformProject/platform2022UI/style/images/base/login/progress-default-bg.gif
new file mode 100644
index 0000000..d972de8
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/login/progress-default-bg.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/login/userphotoman.png b/Source/platformProject/platform2022UI/style/images/base/login/userphotoman.png
new file mode 100644
index 0000000..9d167c1
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/login/userphotoman.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/login/userphotowoman.png b/Source/platformProject/platform2022UI/style/images/base/login/userphotowoman.png
new file mode 100644
index 0000000..6df56d5
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/login/userphotowoman.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/menu/changeorg.png b/Source/platformProject/platform2022UI/style/images/base/menu/changeorg.png
new file mode 100644
index 0000000..14790be
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/menu/changeorg.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/menu/changepassword.png b/Source/platformProject/platform2022UI/style/images/base/menu/changepassword.png
new file mode 100644
index 0000000..c204198
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/menu/changepassword.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/menu/changetheme.png b/Source/platformProject/platform2022UI/style/images/base/menu/changetheme.png
new file mode 100644
index 0000000..eac9822
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/menu/changetheme.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/menu/lockwindow.png b/Source/platformProject/platform2022UI/style/images/base/menu/lockwindow.png
new file mode 100644
index 0000000..a5e34cb
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/menu/lockwindow.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/menu/standardGradient.png b/Source/platformProject/platform2022UI/style/images/base/menu/standardGradient.png
new file mode 100644
index 0000000..72241f1
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/menu/standardGradient.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/spriteRoundedIconsSmallBl.png b/Source/platformProject/platform2022UI/style/images/base/spriteRoundedIconsSmallBl.png
new file mode 100644
index 0000000..74b8c93
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/spriteRoundedIconsSmallBl.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/tabBottomEnabledC.gif b/Source/platformProject/platform2022UI/style/images/base/tabBottomEnabledC.gif
new file mode 100644
index 0000000..0a5f0f8
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/tabBottomEnabledC.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/tabContainerSprite.gif b/Source/platformProject/platform2022UI/style/images/base/tabContainerSprite.gif
new file mode 100644
index 0000000..f0b3842
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/tabContainerSprite.gif
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/tabTopSelected.png b/Source/platformProject/platform2022UI/style/images/base/tabTopSelected.png
new file mode 100644
index 0000000..f4d5772
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/tabTopSelected.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/base/tabTopUnselected.png b/Source/platformProject/platform2022UI/style/images/base/tabTopUnselected.png
new file mode 100644
index 0000000..8c34545
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/base/tabTopUnselected.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/ie.png b/Source/platformProject/platform2022UI/style/images/ie.png
new file mode 100644
index 0000000..7aa657d
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/ie.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/menuicons/2088211.png b/Source/platformProject/platform2022UI/style/images/menuicons/2088211.png
new file mode 100644
index 0000000..a81dc92
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/menuicons/2088211.png
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/music/message.mp3 b/Source/platformProject/platform2022UI/style/images/music/message.mp3
new file mode 100644
index 0000000..aa983a1
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/music/message.mp3
Binary files differ
diff --git a/Source/platformProject/platform2022UI/style/images/music/message.ogg b/Source/platformProject/platform2022UI/style/images/music/message.ogg
new file mode 100644
index 0000000..845eca1
--- /dev/null
+++ b/Source/platformProject/platform2022UI/style/images/music/message.ogg
Binary files differ
diff --git a/Source/platformProject/platform2022UI/vciweb/CreateAuditTask.js b/Source/platformProject/platform2022UI/vciweb/CreateAuditTask.js
new file mode 100644
index 0000000..b1b6073
--- /dev/null
+++ b/Source/platformProject/platform2022UI/vciweb/CreateAuditTask.js
@@ -0,0 +1,307 @@
+/**
+ * 鏍规嵁鎵�閫変汉鍒涘缓璇勫浠诲姟
+ * @author lihang
+ * @date 2022-1-20
+ */
+layui.define(['layer','element','BaseAction'],function(exports){
+    var webUtil = $webUtil;
+    var Class = function() {
+        this.MODELNAME = "CreateAuditTask";
+        this.moduleKey = "CreateAuditTask";
+        this.getContent = function (id, options) {
+            var that = this;
+            that.id = id;
+            var html = [
+                '<div class="CreateAuditTask" id="CreateAuditTask_', id, ' lay-filter="CreateAuditTask_', id, '" style="display:block; text-align: center"></div>'
+            ].join("");
+            return html;
+        };
+        this.doAction = function (options) {
+            var that = this;
+            webUtil.copyConfig(that, that.moduleKey);
+            that.id = options.id;
+            var paramVOS={
+                url:'auditTaskController/create',
+                backPath:configData.compatibility ? path : configData.objectServicePath,
+                method:'post',
+            }
+            $.extend(paramVOS,options.paramVOS);
+            options.paramVOS=paramVOS;
+
+            baseAction = layui['BaseAction'];
+            baseAction.callPreEvent(options, that, function (options) {
+                that.doAdd(options, function () {
+                    baseAction.callPostEvent(options, that, options.callback);
+                });
+            });
+        };
+
+        this.doAdd=function (options,callback){
+            var that = this;
+            var paramVOS=$webUtil.paramLow(options.paramVOS);
+            if (!paramVOS['form'] && !paramVOS['context']&& !paramVOS['content']) {
+                $webUtil.showErrorMsg("鎸夐挳閰嶇疆涓嶆纭�");
+                return false;
+            }
+            that.id=options.id;
+            var selectData=options.dataStore;
+            if(selectData.length<1){
+                $webUtil.showErrorMsg("璇烽�夋嫨涓�鏉¢渶瑕佷慨鏀圭殑鏁版嵁");
+                return false;
+            }
+            if(!paramVOS.multi && selectData.length > 1){
+                $webUtil.showErrorMsg("浠呰兘閫夋嫨涓�鏉℃暟鎹潵鎿嶄綔");
+                return false;
+            }
+            if (paramVOS.state && selectData[0].lcstatus != paramVOS.state){
+                $webUtil.showErrorMsg("鍙湁寰呰瘎瀹$姸鎬佺殑宸ヨ壓璇勫鎵嶅彲鍒涘缓浠诲姟");
+                return false;
+            }
+            if (!paramVOS.state && selectData[0].lcstatus != 'Editing'){
+                $webUtil.showErrorMsg("鍙湁寰呰瘎瀹$姸鎬佺殑宸ヨ壓璇勫鎵嶅彲鍒涘缓浠诲姟");
+                return false;
+            }
+            if(paramVOS.checknotoperation) {
+                var checknotedit=baseAction.checkNotOperation(paramVOS,options);
+                if (checknotedit) {
+                    $webUtil.showErrorMsg($webUtil.replaceFreeMarker(paramVOS.checknotopermsg,options.dataStore,options.sourceData,options.navData) || '褰撳墠鏁版嵁涓嶅厑璁镐慨鏀�');
+                    return false;
+                }
+            }
+            var table = layui.table;
+            if (paramVOS.form) {
+                var filter = "CreateAuditTask_" + that.id;
+                var form = layui.form;
+                var content = ['<form id="', filter, '" lay-filter="', filter, '" class="layui-form" style="margin:15px 30px 50px 0;" ></form>'
+                ].join('');
+                var addSaveIndex = layer.open({
+                    type: 1,
+                    title: $webUtil.replaceFreeMarker(paramVOS.title,options.dataStore,options.sourceData),
+                    btn: ['淇濆瓨', '鍙栨秷'],
+                    //skin: 'layui-layer-lan',
+                    content: content,
+                    //area: ['1860px', '200px'],
+                    maxWidth: $(window).width() - 100,
+                    maxHeight: $(window).height() - 100,
+                    closeBtn: 1,
+                    shade: true,
+                    shadeClose: true,
+                    resize: true,
+                    resizing: function (layero) {
+                        form.doResize(filter);
+                    },
+                    success: function (layero,layerIndex,classP) {
+                        $webUtil.get('webUIController/getFormDefineById', {
+                            btmType: paramVOS.type,
+                            id: paramVOS.form
+                        }, function (result) {
+                            if (result.success) {
+                                var formCallback = function () {
+                                    var baseAction = layui['BaseAction'];
+                                    if ($('#' + filter + ' .layui-upload-drag').length > 0) {
+                                        baseAction.renderUploadFile('#' + filter + ' .layui-upload-drag', paramVOS)
+                                    }
+                                    if (paramVOS.uploadattachment && paramVOS.uploadattachment == 'true') {
+                                        //鏄剧ず涓婁紶闄勪欢
+                                        baseAction.renderUploadAttach(filter, paramVOS)
+                                    }
+                                    if ($('#' + filter + ' .webeditor').length > 0) {
+                                        //缂栬緫鍣�
+                                        var editId='editor_'+$('#' + filter + ' .webeditor').attr('name')
+                                        baseAction.renderEditor(editId,'',paramVOS,function (){
+                                            baseAction.relocationOpen(classP)
+                                        });
+                                    }
+                                    baseAction.relocationOpen(classP)
+
+
+                                    //鑾峰彇閫変腑鐨勬暟鎹�
+                                    var sourceDataMap = {};
+                                    layui.each(options.sourceData, function (i, item) {
+                                        if(item.constructor === Object) return;
+                                        sourceDataMap['sourceData["' + i + '"]'] = item;
+                                    })
+                                    $webUtil.ajax(paramVOS.getdatamethod, paramVOS.getdataurl, $.extend({
+                                            btmname: paramVOS.type,
+                                            formDefineId: paramVOS.form,
+                                            oid: selectData[0].oid
+                                        }, sourceDataMap),
+                                        function (result) {
+                                            if (result.success) {
+                                                form.setValues(result.obj.data, filter);
+                                                //鏂囦欢
+                                                if (result.obj.filePathFieldMap) {
+                                                    var filepath = layui.$('#' + filter + ' .uploadDemoView input.uploadFileOid').attr('name');
+                                                    layui.$('#' + filter + ' .uploadDemoView').removeClass('layui-hide').find('img').attr('src', paramVOS.uploadfilebackpath + 'vciFileDownloadController/downloadByFileOid?fileOid=' + result.obj.filePathFieldMap[filepath].oid + '&' + TOKEN_KEY + '=' + $webUtil.getToken());
+                                                    layui.$('#' + filter + ' .uploadDemoView input.uploadFileOid').val(result.obj.filePathFieldMap[filepath].filePath);
+                                                }
+                                                //闄勪欢
+                                                if (result.obj.attachmentFileVOs && result.obj.attachmentFileVOs.length > 0) {
+                                                    var val = [];
+                                                    layui.each(result.obj.attachmentFileVOs, function (i, attachmentFile) {
+                                                        val.push(attachmentFile.oid)
+                                                    })
+                                                    $('#' + filter + ' [name="releaseFileOids"]').val(val.join(','))
+                                                }
+                                                if ($('#' + filter + ' .webeditor').length > 0) {
+                                                    //缂栬緫鍣�
+                                                    var initV=result.obj.data[$('#' + filter + ' .webeditor').attr('name')];
+                                                    editor.html(initV);
+                                                    $('#' + filter + ' .webeditor').val(initV);
+                                                }
+
+                                            }
+                                        }, function (xhr, error) {
+                                            $webUtil.showErrorMsg("鑾峰彇鏁版嵁鍑虹幇浜嗛敊璇紝鍙兘鏄枃浠舵湇鍔℃病鏈夊惎鍔�");
+                                        }, paramVOS.getdatabackpath)
+
+                                }
+
+                                form.addItems(filter, result.obj.items, formCallback, {}, {
+                                    defaultColumnOneRow: result.obj.columnOneRow
+                                });
+                            } else {
+                                $webUtil.showErrorMsg(result.msg||'鑾峰彇琛ㄥ崟澶辫触');
+                            }
+
+                        }, function (xhr, error) {
+                            $webUtil.showErrorMsg("鑾峰彇琛ㄥ崟鍑虹幇浜嗛敊璇紝鍙兘鏄枃浠舵湇鍔℃病鏈夊惎鍔�");
+                        }, paramVOS.backpath)
+                    },
+                    yes: function (layero) {
+                        if (form.validata(filter)) {
+
+                            var saveFn = function () {
+                                var formValues = form.getDefaultValues(filter, true);
+                                if (formValues.otherValue.releaseFileOids) {
+                                    formValues.otherValue.releaseFileOids = formValues.otherValue.releaseFileOids.split(',');
+                                }
+                                if (!formValues.defaultValues.btmname) {
+                                    formValues.defaultValues.btmname = paramVOS.type;
+                                }
+                                var datas = {
+                                    formDefineId: paramVOS.form,
+                                    preEvent: paramVOS.prepvent,
+                                    afterEvent: paramVOS.afterevent,
+                                    beforeServerEvent: paramVOS.beforeserverevent,
+                                    afterServerEvent: paramVOS.afterserverevent,
+                                    releaseFileOids: formValues.otherValue.releaseFileOids || [],
+                                    data: formValues.otherValue
+                                }
+                                $.extend(datas, formValues.defaultValues);
+                                datas.data.processreviewoid = selectData[0].oid;
+                                if(paramVOS.postsourcedata){
+                                    datas['sourceData']=options.sourceData
+                                }
+                                if(paramVOS.postselectdata){
+                                    datas['selectData']=options.dataStore
+                                }
+                                $webUtil.manualAjax(paramVOS.method, paramVOS.url, JSON.stringify(datas.data), function (result) {
+                                    if (result.success) {
+                                        $webUtil.showMsgFromResult(result, paramVOS.successMsg|| paramVOS.title + '鎴愬姛');
+                                        that.refresh();
+                                        if (options.callback) {
+                                            options.callback()
+                                        }
+                                        if (paramVOS.saveafterevent) {
+                                            var urlobj = $webUtil.getUrlParams(paramVOS.saveafterevent);
+                                            layui.use(urlobj.jsPath, function () {
+                                                var pathAction = layui[urlobj.jsPath];
+                                                var id = 'saveBeforeEvent_' + id;
+                                                pathAction[urlobj.methodName](paramVOS, id, selectData);
+                                            })
+                                        }
+                                        if(callback){
+                                            callback()
+                                        }
+                                        layer.close(addSaveIndex);
+                                    } else {
+                                        $webUtil.showErrorMsg(result.msg || paramVOS.title + '澶辫触');
+                                    }
+                                }, function (xhr, error) {
+                                    $webUtil.showErrorMsg("璁块棶鏈嶅姟鍣ㄥ嚭鐜颁簡閿欒锛屽彲鑳芥湇鍔″櫒娌℃湁寮�鍚紝鎴栬�呰繛鎺ュけ璐�");
+                                }, paramVOS.backpath);
+                            }
+
+                            if (paramVOS.savebeforeevent) {
+                                var urlobj = $webUtil.getUrlParams(paramVOS.savebeforeevent);
+                                layui.use(urlobj.jsPath, function () {
+                                    var pathAction = layui[urlobj.jsPath];
+                                    var id = 'saveBeforeEvent_' + id;
+                                    pathAction[urlobj.methodName]({
+                                        paramVOS: paramVOS,
+                                        id: id,
+                                        dataStore: selectData,
+                                        sourceData:options.sourceData,
+                                        callback: saveFn
+                                    });
+                                })
+                            } else {
+                                saveFn()
+                            }
+                        }
+                    },
+                    btn2: function (layero) {
+                        layer.close(addSaveIndex)
+                    }
+                });
+            } else if (paramVOS.context||paramVOS.content) {
+                layui.use('platform/objectService/VciUIContentViewer', function () {
+                    var newTabClass = layui['platform/objectService/VciUIContentViewer'];
+                    newTabClass.id = that.id;
+                    newTabClass.multiCompent = true;
+                    newTabClass.sourceData = {
+                        btmType: paramVOS.type,
+                        content: paramVOS.context,
+                        dataOid:options.dataStore[0].oid,
+                        actionData: {
+                            selectData: options.sourceData,
+                            dataStore:options.dataStore,
+                            navData:options.navData,
+                            isOpen: true,
+                            paramVOS: paramVOS
+                        }
+                    };
+
+                    var filter = "CreateAuditTask_" + that.id;
+                    var content = ['<div id="', filter, '" lay-filter="', filter, '" style="margin:5px;" >',newTabClass.getContent(that.id),'</div>']
+                    var addSaveIndex = layer.open({
+                        type: 1,
+                        title: $webUtil.replaceFreeMarker(paramVOS.title,options.dataStore,options.sourceData),
+                        //skin: 'layui-layer-lan',
+                        content: content.join(''),
+                        area: [$(window).width() - 100+'px', $(window).height() - 100+'px'],
+                        shade: true,
+                        shadeClose: true,
+                        resize: true,
+                        resizing: function (layero) {
+                        },
+                        success: function (layero,layerIndex,classP) {
+                            newTabClass.init(that.id, newTabClass.sourceData,function (){
+                                //layui['BaseAction'].relocationOpen(classP)
+                            })
+                        },
+                        cancel: function (layero) {
+                            if (options.callback) {
+                                options.callback()
+                            }
+                        }
+                    });
+                });
+            }
+        }
+
+        this.refresh = function () {
+            var that = this;
+
+        };
+
+        this.destory = function () {
+            var that = this;
+            var filter = "CreateAuditTask_" + that.id;
+            $('#'+filter).remove()
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/vciweb/bd/workUnit.js b/Source/platformProject/platform2022UI/vciweb/bd/workUnit.js
new file mode 100644
index 0000000..c9e3caf
--- /dev/null
+++ b/Source/platformProject/platform2022UI/vciweb/bd/workUnit.js
@@ -0,0 +1,385 @@
+/**
+ * 宸ヤ綔鍗曞厓椤甸潰
+ * @author weidy
+ * @date 2022-03-18
+ */
+layui.define(['layer','element','form','table','dynamicCondition' ],function(exports){
+        var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "bd/workUnit";
+        this.moduleKey = "BdWorkUnit";
+        this.backPath =  configData.compatibility? path:configData.basedocSerrvice;
+        this.url = {
+            controller:'workUnitController/',
+            dataGrid:'gridBdWorkUnit',
+            addSave:'addSave',
+            editSave:'editSave',
+            deleteUrl:'deleteData',
+            getObjectByOid:'getObjectByOid'
+        };
+        this.getContent=function(){
+            var that = this;
+            return '<div id="UIContent_' + that.id + '" style="overflow: auto;padding:0 5px"></div>';
+        };
+        this.showContent=function (){
+            var that = this;
+            var html = "";
+            html = [
+                        '<div class="layui-layout easyui-layout UIContentLayout"  id="easyuiLayout_',that.id,'" data-options="fit:true" style="display:block;overflow-y: hidden;margin:0 5px">',
+                            '<div data-options="region:\'center\'" style="padding-left: 10px;padding-right: 10px;" id="border_',that.id,'">',
+                                '<div class="layui-center" style="overflow-y:auto;">',
+                                    that.getToolbarHtml(),
+                                    '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                                '</div>',
+                            '</div>',
+                        '</div>'
+            ].join("");
+            $("#UIContent_"+that.id).html(html);
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.createSearchHtml({id:"缂栧彿",name:"鍚嶇О"} ,$("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+        };
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            //闇�瑕佸姞鍦ㄥ畾鏃朵腑锛屽惁鍒欐牱寮忎笉鑳芥纭睍绀猴紝涓嶇煡閬撳師鍥� wangting
+            setTimeout(function (){
+                that.showContent();
+                var easyuiLayout= $('#easyuiLayout_'+that.id)
+                easyuiLayout.css({height:$('#portal_body').height()-43,width:$('#portal_body').width()-15})
+                easyuiLayout.layout();
+
+                that.initMainTable();
+                that.createSearchHtml();
+
+            },1)
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var tableWidth = $("#border_" + that.id).width();
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                width:tableWidth,
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                method:'get',
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'EDIT'){
+                                that.addOrEdit(false,data.oid);
+                            }
+                        });
+                    }else{
+                        if(total>0) {
+                            table.selectRecord('table_' + that.id, {index:0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                }
+            };
+            if(parentFieldName){
+                options.treeConfig = {
+                    treepid:parentFieldName,
+                    treeid:'id',
+                    showField:'name'
+                };
+            }
+            table.render(options);
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),
+                    {
+                        title: '鍒嗙被绫诲埆',
+                        field: 'categorytypeText',
+                        sort:true,
+                        sortField:'categorytype',
+                        type:'combox',
+                        comboxKey:"EnumCategoryType",
+                        width: 150
+                    },
+                    {
+                        title: '鍘備唬鍙�',
+                        field: 'factoryid',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '鎵�灞炲垎绫�',
+                        field: 'folderoidName',
+                        sort:true,
+                        sortField:'folderoid',
+                        type:'refer',
+                        referConfig: {
+                            type:'default',
+                            referBo:'folder'
+                        },
+                        width: 150
+                    },
+                    {
+                        title: '浣嶇疆',
+                        field: 'location',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '鐢熶骇璐熻矗閮ㄩ棬',
+                        field: 'morgid',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '宸ヨ壓璐熻矗閮ㄩ棬',
+                        field: 'porgid',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '鐘舵�佽〃鍙�',
+                        field: 'state',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '鎺ュ彛绫诲瀷',
+                        field: 'type',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '宸ヤ綔鍗曞厓',
+                        field: 'workunitoidName',
+                        sort:true,
+                        sortField:'workunitoid',
+                        type:'refer',
+                        referConfig: {
+                            type:'default',
+                            referBo:'workunit'
+                        },
+                        width: 150
+                    },
+                    {
+                        field:'options',
+                        title:'鎿嶄綔',
+                        width:150,
+                        templet:function(d){
+                            return '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>';
+                        }
+                    }];
+            }
+        };
+
+        this.getFormItems = function(onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [
+                {
+                    field: 'categorytype',
+                    title: '鍒嗙被绫诲埆',
+                    type: 'combox',
+                    comboxKey: 'EnumCategoryType',
+                    defaultValue:"AO",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'factoryid',
+                    title: '鍘備唬鍙�',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'folderoid',
+                    title: '鎵�灞炲垎绫�',
+                    type: 'refer',
+                    showField: 'folderoidName',
+                    referConfig: {
+                        type:'default',
+                        referBo:'folder'
+                    },
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'location',
+                    title: '浣嶇疆',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'morgid',
+                    title: '鐢熶骇璐熻矗閮ㄩ棬',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'porgid',
+                    title: '宸ヨ壓璐熻矗閮ㄩ棬',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'state',
+                    title: '鐘舵�佽〃鍙�',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'type',
+                    title: '鎺ュ彛绫诲瀷',
+                    required: true,
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'workunitoid',
+                    title: '宸ヤ綔鍗曞厓',
+                    type: 'refer',
+                    showField: 'workunitoidName',
+                    referConfig: {
+                        type:'default',
+                        referBo:'workunit'
+                    },
+                    defaultValue:"",
+                    readOnly:onlyShow
+                }             ];
+        };
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            that.addOrEdit(false,oid);
+        };
+        this.addOrEdit = function(add,oid) {
+            var that = this;
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var addSaveIndex =webUtil.dialog({
+                title:add?'娣诲姞宸ヤ綔鍗曞厓':'淇敼宸ヤ綔鍗曞厓',
+                btn:['淇濆瓨','鍙栨秷'],
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getFormItems(false),
+                        function () {
+                            if(!add){
+                                form.load(filter,{
+                                    backPath:that.backPath,
+                                    url:that.url.controller + that.url.getObjectByOid,
+                                    method:'get',
+                                    params:{
+                                        oid:oid
+                                    }
+                                });
+                            }else{
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+                        }, {}, {defaultColumnOneRow: 2});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        var url = that.url.controller + (add?that.url.addSave:that.url.editSave);
+                        webUtil.manualAjax(add?'post':'put',url,JSON.stringify(values),function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts= webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+        this.refresh = function () {
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+        this.ADVQUERY = function () {
+            var that = this;
+            if(!that.serinorQueryInstance) {
+                var dynamicCondition = layui.dynamicCondition;
+                $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar' + that.id + '" class="layui-inline"></div>');
+                that.checkColumns();
+                var dataFields = [];
+                for(var i = 0 ; i < that.columns.length ; i ++){
+                    dataFields[i] = that.columns[i];
+                }
+                that.serinorQueryInstance = dynamicCondition.create({
+                    fields: dataFields//鏌ヨ瀛楁
+                    , tableId: "table_" + that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                    , type: "complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                    , queryCallBack: function (requestData) {//鏌ヨ涔嬪悗鐨刢allback
+
+                    }
+                });
+            }
+            that.serinorQueryInstance.open();
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/vciweb/mdm/CodeButton.js b/Source/platformProject/platform2022UI/vciweb/mdm/CodeButton.js
new file mode 100644
index 0000000..c38c667
--- /dev/null
+++ b/Source/platformProject/platform2022UI/vciweb/mdm/CodeButton.js
@@ -0,0 +1,345 @@
+/**
+ * 涓绘暟鎹腑鐨勬寜閽墿灞曢〉闈�
+ * @author weidy
+ * @date 2022-01-24
+ */
+layui.define(['layer','element','form','table','dynamicCondition' ],function(exports){
+        var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "mdm/CodeButton";
+        this.moduleKey = "CodeButton";
+        this.backPath =  configData.compatibility? path:configData.mdmService;
+        this.url = {
+            controller:'codeButtonController/',
+            dataGrid:'gridCodeButton',
+            addSave:'addSave',
+            editSave:'editSave',
+            deleteUrl:'deleteData',
+            getObjectByOid:'getObjectByOid',
+            enableData:'enableData',
+            disableData:'disableData'
+        };
+        this.getContent=function(){
+            var that = this;
+            var html = "";
+            html = [
+                '<div class="layui-layout" style="display:block;overflow-y: hidden">',
+                    '<div class="layui-layout-border" style="display:block;margin-top:0px; " id="border_',that.id,'">',
+                        '<div class="layui-center" style="overflow-y:auto;">',
+                            that.getToolbarHtml(),
+                            '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                        '</div>',
+                    '</div>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DISABLE"><i class="layui-icon layui-icon-404"></i>鍋滅敤</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ENABLE"><i class="layui-icon layui-icon-ok-circle"></i>鍚敤</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.createSearchHtml({id:"鎸夐挳缂栧彿",name:"鎸夐挳鍚嶇О"} ,$("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+        };
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            that.initMainTable();
+            that.createSearchHtml();
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var tableWidth = $("#border_" + that.id).width()-225;
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                width:tableWidth,
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                method:'get',
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'EDIT'){
+                                that.addOrEdit(false,data.oid);
+                            }
+                        });
+                    }else{
+                        if(total>0) {
+                            table.selectRecord('table_' + that.id, {index:0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                }
+            };
+            if(parentFieldName){
+                options.treeConfig = {
+                    treepid:parentFieldName,
+                    treeid:'id',
+                    showField:'name'
+                };
+            }
+            table.render(options);
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),{
+                    field: 'id',
+                    title: '鎸夐挳缂栧彿',
+                    sort: true,
+                    width: 150
+                },{
+                    field: 'name',
+                    title: '鎸夐挳鏄剧ず鍚嶇О',
+                    width: 200,
+                    sort: true
+                },{
+                    field: 'description',
+                    title: '鎻忚堪',
+                    width: 150,
+                    sort: true
+                },{
+                    field: 'lcStatusText',
+                    title: '鐘舵��',
+                    sort: true,
+                    sortField: 'lcstatus'
+                },{
+                        title: '鎸夐挳鐨勫浘鏍囨牱寮�',
+                        field: 'iconcls',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '鎵ц鐨刯s璺緞',
+                        field: 'executejs',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '鎸夐挳鐨勪綅缃�',
+                        field: 'usedpositiontypeText',
+                        sort:true,
+                        sortField:'usedpositiontype',
+                        type:'combox',
+                        comboxKey:"codeButtonPosition",
+                        width: 150
+                    },
+                    {
+                        field:'options',
+                        title:'鎿嶄綔',
+                        width: 80,
+                        templet:function(d){
+                            return '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>';
+                        }
+                    }];
+            }
+        };
+
+        this.getFormItems = function(onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [{
+                field: 'id',
+                title: '鎸夐挳缂栧彿',
+                readOnly:onlyShow,
+                required:true
+            },{
+                field: 'name',
+                title: '鎸夐挳鍚嶇О',
+                readOnly:onlyShow,
+                required:true
+            },{
+                field: 'description',
+                title: '鎻忚堪',
+                type: 'textarea',
+                inputWidth: 485
+            },
+                {
+                    field: 'iconcls',
+                    title: '鎸夐挳鐨勫浘鏍囨牱寮�',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                }  ,                {
+                    field: 'usedpositiontype',
+                    title: '鎸夐挳鐨勪綅缃�',
+                    type: 'combox',
+                    comboxKey: 'codeButtonPosition',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                }             ,                {
+                    field: 'executejs',
+                    title: '鎵ц鐨刯s璺緞',
+                    type: 'text',
+                    defaultValue:"USEJS:",
+                    inputWidth: 485,
+                    readOnly:onlyShow
+                }];
+        };
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            that.addOrEdit(false,oid);
+        };
+        this.addOrEdit = function(add,oid) {
+            var that = this;
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var addSaveIndex =webUtil.dialog({
+                title:add?'娣诲姞鎸夐挳':'淇敼鎸夐挳',
+                btn:['淇濆瓨','鍙栨秷'],
+                skin:'layui-layer-lan',
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getFormItems(false),
+                        function () {
+                            if(!add){
+                                form.load(filter,{
+                                    backPath:that.backPath,
+                                    url:that.url.controller + that.url.getObjectByOid,
+                                    method:'get',
+                                    params:{
+                                        oid:oid
+                                    }
+                                });
+                            }else{
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+                        }, {}, {defaultColumnOneRow: 2,labelWidth:110});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        var url = that.url.controller + (add?that.url.addSave:that.url.editSave);
+                        webUtil.manualAjax(add?'post':'put',url,JSON.stringify(values),function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts= webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+        this.DISABLE = function (){
+            this.changeStatus(true);
+        };
+        this.ENABLE = function (){
+            this.changeStatus(false);
+        };
+        this.changeStatus = function (disableFlag){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts= webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            $webUtil.showConfirmMsg('鏄惁' + (disableFlag?"鍋滅敤":"鍚敤") + '杩欐潯鏁版嵁?',function (r){
+                if(r){
+                    $webUtil.post(that.url.controller + (disableFlag?that.url.disableData:that.url.enableData),{oid:oid,ts:ts},function (result){
+                        if(result.success){
+                            webUtil.showMsgFromResult(result,(disableFlag?"鍋滅敤":"鍚敤") + "鎴愬姛");
+                            that.refresh();
+                        }else{
+                            webUtil.showErrorMsg(result.msg);
+                        }
+                    },function(xhr,err){
+                        webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                    },that.backPath)
+                }
+            });
+        };
+        this.refresh = function () {
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+        this.ADVQUERY = function () {
+            var that = this;
+            if(!that.serinorQueryInstance) {
+                var dynamicCondition = layui.dynamicCondition;
+                $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar' + that.id + '" class="layui-inline"></div>');
+                that.checkColumns();
+                var dataFields = [];
+                for(var i = 0 ; i < that.columns.length ; i ++){
+                    dataFields[i] = that.columns[i];
+                }
+                that.serinorQueryInstance = dynamicCondition.create({
+                    fields: dataFields//鏌ヨ瀛楁
+                    , tableId: "table_" + that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                    , type: "complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                    , queryCallBack: function (requestData) {//鏌ヨ涔嬪悗鐨刢allback
+
+                    }
+                });
+            }
+            that.serinorQueryInstance.open();
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/vciweb/mdm/CodeClassify.js b/Source/platformProject/platform2022UI/vciweb/mdm/CodeClassify.js
new file mode 100644
index 0000000..8e0ef08
--- /dev/null
+++ b/Source/platformProject/platform2022UI/vciweb/mdm/CodeClassify.js
@@ -0,0 +1,3247 @@
+/**
+ * 涓婚搴撳垎绫婚〉闈�
+ * @author weidy
+ * @date 2022-01-24
+ */
+layui.define(['layer','element','form','table','dynamicCondition' ,'tree','mdm/refer/CodeClassTemplateRefer','transferTable','mdm/MdmEngineForm'],function(exports) {
+    var webUtil = $webUtil;
+    var Class = function () {
+        this.MODELNAME = "mdm/CodeClassify";
+        this.moduleKey = "CodeClassify";
+        this.backPath = configData.compatibility ? path : configData.mdmService;
+        this.url = {
+            attrController: 'codeClassifyAttrController/',
+            controller: 'codeClassifyController/',
+            attrRefer: 'gridCodeClassifyAttribute',
+            tempController: 'codeClassifyTemplateController/',
+            tempDataGrid: 'gridCodeClassifyTemplate',
+            templateAttrController: 'codeClassifyTempAttrController/',
+            templateAttrDataGrid: 'gridCodeClassifyTemplateAttr',
+            processLinkController:'codeClsProcessTempController/',
+            processLinkDataGrid:'gridCodeClassifyProcessTemp',
+            processLinkAddSave:'addSave',
+            processLinkEditSave:'editSave',
+            processLinkDeleteUrl:'deleteData',
+            processLinkGetObjectByOid:'getObjectByOid',
+            phaseController:'codeTempPhaseController/',
+            phaseDataGrid:'gridCodeTemplatePhase',
+            phaseAddSave:'addSave',
+            phaseEditSave:'editSave',
+            phaseDeleteUrl:'deleteData',
+            phaseGetObjectByOid:'getObjectByOid',
+            phaseUnUsedAttribute:'gridUnUsedAttribute',
+            phaseUsedAttribute:'gridUsedAttribute',
+            buttonController:'codeClsTempButtonController/',
+            buttonDataGrid:'gridCodeClassifyTemplateButton',
+            buttonAddSave:'addSave',
+            buttonEditSave:'editSave',
+            buttonDeleteUrl:'deleteData',
+            buttonGetObjectByOid:'getObjectByOid',
+            tree: 'treeCodeClassify',
+            addSave: 'addSave',
+            editSave: 'editSave',
+            checkIsCanDelete: 'checkIsCanDelete',
+            referTree: 'referTree',
+            deleteUrl: 'deleteData',
+            enableData: 'enableData',
+            disableData: 'disableData',
+            getObjectByOid: 'getObjectByOid'
+        };
+        this.vciFieldTypeMap = {
+            VTBoolean: "甯冨皵鍨�",
+            VTClob: "闀挎枃鏈�",
+            VTDate: "鏃ユ湡",
+            VTDateTime: "鏃ユ湡鏃堕棿",
+            VTTime: "鏃堕棿",
+            VTLong: "闀挎暣鍨�",
+            VTDouble: "閲戦/鍙岀簿搴�",
+            VTInteger: "鏁村舰",
+            VTFilePath: "鏂囦欢",
+            VTString: "瀛楃涓�"
+        };
+        this.getContent = function () {
+            var that = this;
+            return '<div id="UIContent_' + that.id + '" style="overflow: auto;padding:0 5px"></div>';
+        };
+        this.showContent = function () {
+            var that = this;
+            var html = [
+                '<div class="layui-layout easyui-layout UIContentLayout"  id="easyuiLayout_', that.id, '" data-options="fit:true" style="display:block;overflow-y: hidden;">',
+                    '<div data-options="region:\'west\',split:true" style="width:270px;padding: 5px;">',
+                        that.getWestToolbarHtml(),
+                        '<div class="layui-vci-tree" style="overflow: auto;margin-top: 5px;">',
+                            '<ul layui-filter="tree_', that.id, '"></ul>',
+                        '</div>',
+                    '</div>',
+                    '<div data-options="region:\'center\'" style="padding-left: 5px;padding-right: 5px;" id="border_', that.id, '">',
+                        '<div class="layui-center" style="overflow-y:auto;">',
+                            '<div class="layui-layout-border layui-tab" style="display:block;margin:0px;">',
+                                '<ul class="layui-tab-title tabTitle tab_center_', that.id, '" lay-allowClose="false">',
+                                    '<li class="layui-this">鍩烘湰淇℃伅</li>',
+                                    '<li>妯℃澘绠$悊</li>',
+                                '</ul>',
+                                '<ul class="layui-tab-content tabContent">',
+                                    '<li class="layui-tab-item layui-show">',
+                                        '<form class="layui-form" lay-filter="form_info_', that.id, '"></form>',
+                                    '</li>',
+                                    '<li class="layui-tab-item">',
+                                        '<div id="easyuiLayoutCenter_', that.id, '" class="easyui-layout" data-options="fit:true">',
+                                            '<div data-options="region:\'north\',split:true" style="height: 300px;border-top: none;border-left: none;border-right: none;">',
+                                                that.getNorthToolbarHtml(),
+                                                '<table id="temp_', that.id, '" lay-filter="temp_', that.id, '" style="overflow-x:auto;"></table>',
+                                            '</div>',
+                                            '<div data-options="region:\'center\',split:true" style="" id="border_center_', that.id, '">',
+                                                '<div class="layui-center layui-tab" style="overflow-y:auto;">',
+                                                    '<ul class="layui-tab-title tabTitle" lay-allowClose="false">',
+                                                        '<li class="layui-this">妯℃澘灞炴��</li>',
+                                                        '<li>妯℃澘娴佺▼</li>',
+                                                        '<li>妯℃澘闃舵</li>',
+                                                        '<li>妯℃澘鎸夐挳鎵╁睍</li>',
+                                                    '</ul>',
+                                                    '<ul class="layui-tab-content tabContent">',
+                                                        '<li class="layui-tab-item layui-show">',
+                                                            that.getToolbarHtml(),
+                                                            '<div style="overflow-y: auto">',
+                                                                '<table id="tempAttr_', that.id, '" lay-filter="tempAttr_', that.id, '" style="overflow-x:auto;"></table>',
+                                                            '</div>',
+                                                        '</li>',
+                                                        '<li class="layui-tab-item">',
+                                                            that.getProcessToolbarHtml(),
+                                                            '<table id="process_', that.id, '" lay-filter="process_', that.id, '" style="overflow-x:auto;"></table>',
+                                                        '</li>',
+                                                        '<li class="layui-tab-item">',
+                                                            that.getPhaseToolbarHtml(),
+                                                            '<table id="phase_', that.id, '" lay-filter="phase_', that.id, '" style="overflow-x:auto;"></table>',
+                                                        '</li>',
+                                                        '<li class="layui-tab-item">',
+                                                            that.getButtonToolbarHtml(),
+                                                            '<table id="button_', that.id, '" lay-filter="button_', that.id, '" style="overflow-x:auto;"></table>',
+                                                        '</li>',
+                                                    '</ul>',
+                                                '</div>',
+                                            '</div>',
+                                        '</div>',
+                                    '</li>',
+                                '</ul>',
+                            '</div>',
+                        '</div>',
+                    '</div>',
+                '</div>'
+            ];
+            $("#UIContent_" + that.id).html(html.join(''));
+        };
+        this.getWestToolbarHtml = function () {
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_west_', that.id, '" class="layui-btn-container layui-buttons">',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_west_', that.id, '_ADDClassify"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_west_', that.id, '_EDITClassify"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_west_', that.id, '_DELClassify"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_west_', that.id, '_ENABLEClassify"><i class="layui-icon layui-icon-ok-circle"></i>鍚敤</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_west_', that.id, '_DISABLEClassify"><i class="layui-icon layui-icon-404"></i>鍋滅敤</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_west_', that.id, '_EXPORTClassify"><i class="layui-icon layui-icon-export"></i>瀵煎嚭</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_west_', that.id, '_IMPORTClassify"><i class="layui-icon layui-icon-upload"></i>瀵煎叆</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_west_', that.id, '_refreshClassify"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createWestSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, "west_" + that.id);
+        };
+        this.getNorthToolbarHtml = function () {
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_', that.id, '" class="layui-btn-container layui-buttons">',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_', that.id, '_ADDTEMP"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_', that.id, '_EDITTEMP"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_', that.id, '_DELTEMP"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_', that.id, '_ADVQUERYTEMP"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_', that.id, '_refreshTEMP"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_', that.id, '_cloneTEMP"><i class="layui-icon layui-icon-share"></i>浠庡叾浠栨ā鏉垮厠闅�</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml = function (isfull) {
+            var that = this;
+            var html = ['<div layui-filter="toolbar_attr_', that.id, '" class="layui-btn-container layui-buttons">'];
+            if (isfull) {
+                html.push('<div class="layui-btn-group">',
+                        '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_attr_', that.id, '_UNBATCHEDIT" isfull="'+(isfull?'true':'flase')+'"><i class="layui-icon layui-icon-screen-restore"></i>閫�鍑哄叏灞忕紪杈�</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_attr_', that.id, '_VERIFYUSER" isfull="'+(isfull?'true':'flase')+'"><i class="layui-icon layui-icon-auz"></i>楠岃瘉瑙勫垯</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_attr_', that.id, '_GROUPATTR" isfull="'+(isfull?'true':'flase')+'"><i class="layui-icon layui-icon-template-1"></i>灞炴�у垎缁�</button>',
+                    '</div>')
+            } else {
+                html.push('<div class="layui-btn-group">',
+                        '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_attr_', that.id, '_ADD" isfull="'+(isfull?'true':'flase')+'"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                        '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_attr_', that.id, '_BATCHEDIT" isfull="'+(isfull?'true':'flase')+'"><i class="layui-icon layui-icon-screen-full"></i>鍏ㄥ睆缂栬緫</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_attr_', that.id, '_VERIFYUSER" isfull="'+(isfull?'true':'flase')+'"><i class="layui-icon layui-icon-auz"></i>楠岃瘉瑙勫垯</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_attr_', that.id, '_GROUPATTR" isfull="'+(isfull?'true':'flase')+'"><i class="layui-icon layui-icon-template-1"></i>灞炴�у垎缁�</button>',
+                    '</div>')
+            }
+            html.push('<div class="layui-btn-group">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_attr_', that.id, '_CLASSIFYUSE" isfull="'+(isfull?'true':'flase')+'"><i class="layui-icon layui-icon-tree"></i>鍒嗙被娉ㄥ叆</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_attr_', that.id, '_COMPUSE" isfull="'+(isfull?'true':'flase')+'"><i class="layui-icon layui-icon-template"></i>缁勫悎瑙勫垯</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_attr_', that.id, '_ENUMUSE" isfull="'+(isfull?'true':'flase')+'"><i class="layui-icon layui-icon-rss"></i>鏋氫妇娉ㄥ叆</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_attr_', that.id, '_PARENTATTR" isfull="'+(isfull?'true':'flase')+'"><i class="layui-icon layui-icon-release"></i>绾ц仈灞炴��</button>',
+                    //'<button class="layui-btn layui-btn-sm" layui-filter="toolbar_attr_', that.id, '_UPSELECT" isfull="'+(isfull?'true':'flase')+'"><i class="layui-icon layui-icon-up"></i>涓婄Щ</button>',
+                    //'<button class="layui-btn layui-btn-sm" layui-filter="toolbar_attr_', that.id, '_DOWNSELECT" isfull="'+(isfull?'true':'flase')+'"><i class="layui-icon layui-icon-down"></i>涓嬬Щ</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_attr_', that.id, '_VIEWORDER" isfull="'+(isfull?'true':'flase')+'"><i class="layui-icon layui-icon-down"></i>棰勮鎺掑簭</button>',
+                '</div>',
+                '<div class="layui-btn-group">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_attr_', that.id, '_SAVE" isfull="'+(isfull?'true':'flase')+'"><i class="layui-icon layui-icon-ok"></i>淇濆瓨</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_attr_', that.id, '_DEL" isfull="'+(isfull?'true':'flase')+'"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_attr_', that.id, '_CANCEL" isfull="'+(isfull?'true':'flase')+'"><i class="layui-icon layui-icon-refresh-3"></i>閲嶇疆</button>',
+                    //'<button class="layui-btn layui-btn-sm" layui-filter="toolbar_attr_', that.id, '_ADVQUERY" isfull="'+(isfull?'true':'flase')+'"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_attr_', that.id, '_syncAttr" isfull="'+(isfull?'true':'flase')+'"><i class="layui-icon layui-icon-share"></i>鍚屾鍒板叾浠栨ā鏉�</button>',
+                '</div>')
+            html.push('<div class="layui-btn-group">',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_attr_', that.id, '_VIEWCODE" isfull="'+(isfull?'true':'flase')+'">缂栫爜鐢宠棰勮</button>',
+                '</div>')
+            html.push('<div class="layui-input-inline" style="position: relative;margin-left: 10px"><div id="selectWrapForIE" style="display:none"></div><select class="layui-btn layui-btn-sm layui-btn-primary" style="border:2px solid #C9C9C9;line-height: 18px;display: block;text-align: left" name="attr_switch_select'+(isfull?'_full':'')+'"></select></div>')
+            html.push('<div class="layui-form" lay-filter="form_selectattrflag'+(isfull?'_full':'')+'" style="display: inline-block;margin-top: 0;position: relative;top:7px"><input type="checkbox" name="selectattrflag'+(isfull?'full':'')+'" value="false" lay-skin="switch" lay-text="鏄瘄鍚�" lay-filter="selectattrflag'+(isfull?'full':'')+'"></div>')
+            html.push('</div>')
+            return html.join("");
+        };
+        this.getProcessToolbarHtml = function (){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_process_', that.id, '" class="layui-btn-container layui-buttons">',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_process_', that.id, '_ADDPROCESS"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_process_', that.id, '_EDITPROCESS"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_process_', that.id, '_DELPROCESS"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_process_', that.id, '_refreshPROCESS"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getPhaseToolbarHtml = function (){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_phase_', that.id, '" class="layui-btn-container layui-buttons">',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_phase_', that.id, '_ADDPHASE"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_phase_', that.id, '_EDITPHASE"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_phase_', that.id, '_DELPHASE"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_phase_', that.id, '_refreshPHASE"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getButtonToolbarHtml = function (){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_button_', that.id, '" class="layui-btn-container layui-buttons">',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_button_', that.id, '_ADDBUTTON"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_button_', that.id, '_EDITBUTTON"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_button_', that.id, '_DELBUTTON"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_button_', that.id, '_refreshBUTTON"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.createSearchHtml({id:"妯℃澘缂栧彿",name:"妯℃澘鍚嶇О"},$("[layui-filter='toolbar_" + that.id + "']"),'temp_'+that.id);
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.bindDefultButtonLisenter(that, 'attr_'+that.id);
+            that.createAttrSelect()
+        };
+        this.createAttrSelect=function (isfull){
+            var that=this;
+            var optionsHtml = ['<option value="keyattrflag">鍏抽敭灞炴��</option>','<option value="queryattrflag">鏌ヨ灞炴��</option>',
+                '<option value="seniorqueryattrflag">楂樼骇鏌ヨ灞炴��</option>','<option value="samerepeatattrflag">鐩镐技鏌ラ噸灞炴��</option>',
+                '<option value="barcodeflag">涓�缁寸爜</option>','<option value="qrcodeflag">浜岀淮鐮�</option>',
+                '<option value="requireflag">蹇呰緭</option>','<option value="formdisplayflag">琛ㄥ崟鏄剧ず</option>',
+                '<option value="tabledisplayflag">鍒楄〃鏄剧ず</option>','<option value="readonlyflag">鍙</option>',
+                '<option value="sortattrflag">鍒楄〃鎺掑簭</option>','<option value="textareaflag">澶氳鏂囨湰</option>',
+                '<option value="imageflag">棰勮鍥�</option>']
+            $('select[name="attr_switch_select'+(isfull?'_full':'')+'"]').append(optionsHtml.join(''))
+            layui.form.render('checkbox','form_selectattrflag'+(isfull?'_full':'')+'')
+            layui.form.on('switch(selectattrflag'+(isfull?'full':'')+')', function(obj){
+                var name=$('select[name="attr_switch_select'+(isfull?'_full':'')+'"]').val();
+                var tabledata=layui.table.checkStatus('tempAttr_'+(isfull?'fullScreen_':'')+that.id,true).data;
+                var alltrs=$('div[lay-id="tempAttr_'+(isfull?'fullScreen_':'')+that.id+'"] .layui-table-main tr')
+                layui.each(tabledata,function (i,item){
+                    item[name]=='' && (item[name]='false')
+                    if(item[name]!=obj.value){
+                        $('.layui-form-switch',alltrs.eq(item['LAY_TABLE_INDEX']).find('td[data-field="'+name+'"]')).trigger('click')
+                    }
+                })
+
+            });
+        }
+
+        this.init = function () {
+            var that = this;
+            webUtil.copyConfig(that, that.moduleKey);
+            //闇�瑕佸姞鍦ㄥ畾鏃朵腑锛屽惁鍒欐牱寮忎笉鑳芥纭睍绀猴紝涓嶇煡閬撳師鍥� wangting
+            setTimeout(function () {
+                that.showContent();
+                var easyuiLayout = $('#easyuiLayout_' + that.id)
+                easyuiLayout.css({height: $('#portal_body').height() - 43, width: $('#portal_body').width() - 15})
+                easyuiLayout.layout();
+                that.createWestSearchHtml();
+
+                that.initForm();
+                that.initTempTable();
+                that.initTempAttrTable();
+                that.initTree();
+
+                that.createProcessSearchHtml();
+                that.initProcessTable();
+
+                that.createPhaseSearchHtml();
+                that.initPhaseTable();
+
+                that.createButtonSearchHtml();
+                that.initButtonTable();
+
+                $('.tab_center_' + that.id + ' li').click(function () {
+                    if ($(this).text() == "妯℃澘绠$悊" && $(this).attr('isload') != 'true') {
+                        $(this).attr('isload', 'true')
+                        setTimeout(function () {
+                            var easyuiLayout = $('#easyuiLayoutCenter_' + that.id)
+                            easyuiLayout.css({
+                                height: $("#border_" + that.id).height() - 43,
+                                width: $("#border_" + that.id).width() - 10
+                            })
+                            easyuiLayout.layout();
+                            that.createSearchHtml();
+                        }, 1)
+
+                    }
+                });
+            }, 1)
+
+        };
+
+        this.initTree = function () {
+            var that = this;
+            var tree = layui.tree;
+            var treeUL = $('[layui-filter="tree_' + that.id + '"]');
+            var scrollHeight = treeUL.closest('.panel-body').height();
+            var treeHeight = scrollHeight - 100;
+            treeUL.parent().height(treeHeight);
+            tree.init("tree_" + that.id, treeUL, {
+                url: that.url.controller + that.url.tree,
+                backPath: that.backPath,
+                extraParams: {
+                    isMuti: false,
+                    isQueryAllColumn: true
+                },
+                templet: function (d) {
+                    if (d.attributes.lcStatus == 'Disable') {
+                        return d.name + '銆愬仠鐢ㄣ��'
+                    } else {
+                        return d.name
+                    }
+                },
+                showSearch: true,
+                click: function (item, elem, options) {
+                    that.currentItem = item;
+                    that.currentItemOid = item.oid;
+                    that.currentItemAttributes = item.attributes;
+                    that.setFormValues();
+                }
+            });
+        };
+        this.setFormValues = function () {
+            var that = this;
+            layui.form.load("form_info_" + that.id, {
+                url: that.url.controller + that.url.getObjectByOid,
+                method: 'get',
+                params: {
+                    "oid": that.currentItemAttributes.oid
+                },
+            });
+            //鍒楄〃
+            layui.table.reload('temp_' + that.id, {
+                where: {
+                    "conditionMap['codeclassifyoid']": that.currentItemAttributes.oid
+                }
+            })
+        };
+        this.getFormItems = function (onlyShow,isHidden,typeText) {
+            var that = this;
+            var table = layui.table;
+            return [{
+                field: 'id',
+                title: typeText + '缂栧彿',
+                required: true,
+                readOnly: onlyShow
+            }, {
+                field: 'name',
+                title: typeText + '鍚嶇О',
+                required: true,
+                readOnly: onlyShow
+            }, {
+                field: 'description',
+                title: '鎻忚堪',
+                useAllWidth: true,
+                inputWidth: 575,
+                readOnly: onlyShow
+            }, {
+                field: 'btmtypeid',
+                title: '瀛樺偍鐨勪笟鍔$被鍨�',
+                type: 'refer',
+                readOnly: onlyShow,
+                hidden:isHidden,
+                required: (!isHidden),
+                showField: 'btmtypename',
+                useAllWidth: true,
+                inputWidth: 575,
+                referConfig: {
+                    type:'platform/objectService/OsBtmTypeRefer'
+                }
+            }, {
+                field: 'coderuleoid',
+                title: '缂栫爜瑙勫垯',
+                type: 'refer',
+                useAllWidth: true,
+                inputWidth: 575,
+                showField: 'coderuleoidName',
+                referConfig: {
+                    type: 'default',
+                    referBo: 'coderule',
+                    where:{
+                        lcstatus:'Released'
+                    }
+                },
+                readOnly: onlyShow
+            }, {
+                field: 'codekeyattrrepeatoid',
+                title: '鍏抽敭灞炴�ф煡璇㈣鍒�',
+                type: 'refer',
+                useAllWidth: true,
+                inputWidth: 575,
+                showField: 'codekeyattrrepeatoidName',
+                referConfig: {
+                    type: 'default',
+                    referBo: 'codekeyattrrepeat',
+                    where:{
+                        lcstatus:'Enabled'
+                    }
+                },
+                readOnly: onlyShow
+            },{
+                field: 'codeResembleRuleOid',
+                title: '鐩镐技鏌ヨ瑙勫垯',
+                type:'refer',
+                useAllWidth: true,
+                showField: 'codeResembleRuleOidName',
+                inputWidth: 575,
+                referConfig: {
+                    type: 'default',
+                    referBo: 'coderesemblerule',
+                    where:{
+                        lcstatus:'Enabled'
+                    }
+                },
+                readOnly: onlyShow
+            }];
+        };
+        this.initForm = function () {
+            var that = this;
+            var form = layui.form;
+            form.addItems("form_info_" + that.id, that.getFormItems(true,false,'涓婚搴�/鍒嗙被'), function () {
+            }, {}, {
+                defaultColumnOneRow: 2,
+                labelWidth: 200
+            });
+        };
+        this.initTempAttrTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkTempAttrColumns();
+            //$('#tempAttr_' + that.id).parent().height($("#border_" + that.id).height()-442)
+            var options = {
+                elem: '#tempAttr_' + that.id,
+                id: 'tempAttr_' + that.id,
+                data:[],
+                limit:-1,
+                selectMode: table.selectMode.muti,
+                cols: [that.tempAttrColumns],
+                width:$("#border_center_" + that.id).width(),
+                height:Math.max($("#border_" + that.id).height()-450,160),
+                remoteSort:false,
+                done: function (res, cur, total) {
+                    table.on('tool(tempAttr_' + that.id + ')', function (obj) {
+                        var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                        var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                        if (layEvent == 'UP') {
+                            that.UPTempAttr(data,'tempAttr_' + that.id);
+                        } else if (layEvent == 'DOWN') {
+                            that.DOWNTempAttr(data,'tempAttr_' + that.id);
+                        } else if (layEvent == 'REM') {
+                            that.REMTempAttr(data,'tempAttr_' + that.id);
+                        }
+                    });
+                    that.bindSwitch('tempAttr_'+that.id)
+                }
+            };
+            if (parentFieldName) {
+                options.treeConfig = {
+                    treepid: parentFieldName,
+                    treeid: 'id',
+                    showField: 'name'
+                };
+            }
+            table.render(options);
+            that.getTempAttrData('tempAttr_' + that.id)
+        };
+        this.getTempAttrData=function (filter){
+            var that=this;
+            var params = {};
+            var sourceDataParams = {}
+            var options=layui.table.getConfig(filter)
+            params['page'] = 1;
+            params['limit'] = -1;
+            if (options.sourceDataParams) {
+                //璇存槑鏄墿灞曞睘鎬�
+                for (var key in options.sourceDataParams) {
+                    if (key && key.constructor === Object) return;
+                    sourceDataParams['sourceData["' + key + '"]'] = options.sourceDataParams[key];//鏂扮殑鏂瑰紡
+                }
+            }
+            //鍙傛暟
+            var where = $.extend(params, options.where, options.extraParams,options.queryParams, sourceDataParams);
+            $webUtil.ajax('get', that.url.templateAttrController + that.url.templateAttrDataGrid, where, function (res) {
+                layui.table.reload(filter, {
+                    data:res.data
+                })
+            }, function (e, msg) {
+                $webUtil.showDebugMsg('鏁版嵁鎺ュ彛璇锋眰寮傚父锛岄敊璇彁绀猴細' + msg);
+            }, that.backPath,true);
+        }
+        this.checkTempAttrColumns = function () {
+            var that = this;
+            var table = layui.table;
+            if (that.tempAttrColumns == null || that.tempAttrColumns.length == 0) {
+                that.tempAttrColumns = [{
+                    field: 'ordernum',
+                    title: '鎺掑簭鍙�',
+                    sort: true,
+                    edit: 'number',
+                    width: 60,
+                    fixed:'left'
+                }, table.getCheckColumn({fixed:'left'}), {
+                    field: 'id',
+                    title: '灞炴�ц嫳鏂囩紪鍙�',
+                    sort: true,
+                    width: 100,
+                    fixed:'left'
+                }, {
+                    field: 'name',
+                    title: '灞炴�т腑鏂囧悕绉�',
+                    sort: true,
+                    edit: 'text',
+                    width: 130,
+                    fixed:'left'
+                },
+                    {
+                        title: '灞炴�у垎缁�',
+                        field: 'attributegroup',
+                        sort: true,
+                        edit: 'text',
+                        width: 90
+                    },
+                    {
+                        title: '绫诲瀷',
+                        field: 'attributeDataTypeText',
+                        sort: true,
+                        width: 60
+                    },{
+                        title: '鍒楄〃瀹藉害',
+                        field: 'attrTableWidth',
+                        width: 80,
+                        edit:'number'
+                    },
+                    {
+                        title: '鍏抽敭灞炴��',
+                        field: 'keyattrflag',
+                        width: 65,
+                        data: [{key: "true", value: "鏄�"}, {key: "false", value: "鍚�"}],
+                        templet: function (d) {
+                            return '<input type="checkbox" name="keyattrflag" value="'+d.keyattrflag+'" lay-skin="switch" lay-text="鏄瘄鍚�" lay-filter="attrflag" '+(d.keyattrflag==true||d.keyattrflag=='true' ? 'checked' : '') +'>';
+                        }
+                    },
+                    {
+                        title: '鏌ヨ灞炴��',
+                        field: 'queryattrflag',
+                        width: 65,
+                        data: [{key: "true", value: "鏄�"}, {key: "false", value: "鍚�"}],
+                        templet: function (d) {
+                            return '<input type="checkbox" name="queryattrflag" value="'+d.queryattrflag+'" lay-skin="switch" lay-text="鏄瘄鍚�" lay-filter="attrflag" '+(d.queryattrflag==true||d.queryattrflag=='true' ? 'checked' : '') +'>';
+                        }
+                    },
+                    {
+                        title: '楂樼骇鏌ヨ灞炴��',
+                        field: 'seniorqueryattrflag',
+                        width: 85,
+                        data: [{key: "true", value: "鏄�"}, {key: "false", value: "鍚�"}],
+                        templet: function (d) {
+                            return '<input type="checkbox" name="seniorqueryattrflag" value="'+d.seniorqueryattrflag+'" lay-skin="switch" lay-text="鏄瘄鍚�" lay-filter="attrflag" '+(d.seniorqueryattrflag==true||d.seniorqueryattrflag=='true' ? 'checked' : '') +'>';
+                        }
+                    },
+                    {
+                        title: '鐩镐技鏌ラ噸灞炴��',
+                        field: 'samerepeatattrflag',
+                        width: 85,
+                        data: [{key: "true", value: "鏄�"}, {key: "false", value: "鍚�"}],
+                        templet: function (d) {
+                            return '<input type="checkbox" name="samerepeatattrflag" value="'+d.samerepeatattrflag+'" lay-skin="switch" lay-text="鏄瘄鍚�" lay-filter="attrflag" '+(d.samerepeatattrflag==true||d.samerepeatattrflag=='true' ? 'checked' : '') +'>';
+                        }
+                    },
+                    {
+                        title: '涓�缁寸爜',
+                        field: 'barcodeflag',
+                        width: 65,
+                        hidden:true,
+                        data: [{key: "true", value: "鏄�"}, {key: "false", value: "鍚�"}],
+                        templet: function (d) {
+                            return '<input type="checkbox" name="barcodeflag" value="'+d.barcodeflag+'" lay-skin="switch" lay-text="鏄瘄鍚�" lay-filter="attrflag" '+(d.barcodeflag==true||d.barcodeflag=='true' ? 'checked' : '') +'>';
+                        }
+                    },
+                    {
+                        title: '浜岀淮鐮�',
+                        field: 'qrcodeflag',
+                        width: 65,
+                        hidden:true,
+                        data: [{key: "true", value: "鏄�"}, {key: "false", value: "鍚�"}],
+                        templet: function (d) {
+                            return '<input type="checkbox" name="qrcodeflag" value="'+d.qrcodeflag+'" lay-skin="switch" lay-text="鏄瘄鍚�" lay-filter="attrflag" '+(d.qrcodeflag==true||d.qrcodeflag=='true' ? 'checked' : '') +'>';
+                        }
+                    },
+                    {
+                        title: '蹇呰緭',
+                        field: 'requireflag',
+                        width: 65,
+                        data: [{key: "true", value: "鏄�"}, {key: "false", value: "鍚�"}],
+                        templet: function (d) {
+                            return '<input type="checkbox" name="requireflag" value="'+d.requireflag+'" lay-skin="switch" lay-text="鏄瘄鍚�" lay-filter="attrflag" '+(d.requireflag==true||d.requireflag=='true' ? 'checked' : '') +'>';
+                        }
+                    },
+                    {
+                        title: '琛ㄥ崟鏄剧ず',
+                        field: 'formdisplayflag',
+                        width: 65,
+                        data: [{key: "true", value: "鏄�"}, {key: "false", value: "鍚�"}],
+                        templet: function (d) {
+                            return '<input type="checkbox" name="formdisplayflag" value="'+d.formdisplayflag+'" lay-skin="switch" lay-text="鏄瘄鍚�" lay-filter="attrflag" '+(d.formdisplayflag==true||d.formdisplayflag=='true' ? 'checked' : '') +'>';
+                        }
+                    },
+                    {
+                        title: '鍒楄〃鏄剧ず',
+                        field: 'tabledisplayflag',
+                        width: 65,
+                        data: [{key: "true", value: "鏄�"}, {key: "false", value: "鍚�"}],
+                        templet: function (d) {
+                            return '<input type="checkbox" name="tabledisplayflag" value="'+d.tabledisplayflag+'" lay-skin="switch" lay-text="鏄瘄鍚�" lay-filter="attrflag" '+(d.tabledisplayflag==true||d.tabledisplayflag=='true' ? 'checked' : '') +'>';
+                        }
+                    },
+                    {
+                        title: '鍙',
+                        field: 'readonlyflag',
+                        width: 65,
+                        data: [{key: "true", value: "鏄�"}, {key: "false", value: "鍚�"}],
+                        templet: function (d) {
+                            return '<input type="checkbox" name="readonlyflag" value="'+d.readonlyflag+'" lay-skin="switch" lay-text="鏄瘄鍚�" lay-filter="attrflag" '+(d.readonlyflag==true||d.readonlyflag=='true' ? 'checked' : '') +'>';
+                        }
+                    },
+                    {
+                        title: '鍒楄〃鎺掑簭',
+                        field: 'sortattrflag',
+                        width: 65,
+                        data: [{key: "true", value: "鏄�"}, {key: "false", value: "鍚�"}],
+                        templet: function (d) {
+                            return '<input type="checkbox" name="sortattrflag" value="'+d.sortattrflag+'" lay-skin="switch" lay-text="鏄瘄鍚�" lay-filter="attrflag" '+(d.sortattrflag==true||d.sortattrflag=='true' ? 'checked' : '') +'>';
+                        }
+                    },
+                    {
+                        title: '澶氳鏂囨湰',
+                        field: 'textareaflag',
+                        width: 65,
+                        data: [{key: "true", value: "鏄�"}, {key: "false", value: "鍚�"}],
+                        templet: function (d) {
+                            return '<input type="checkbox" name="textareaflag" value="'+d.textareaflag+'" lay-skin="switch" lay-text="鏄瘄鍚�" lay-filter="attrflag" '+(d.textareaflag==true||d.textareaflag=='true' ? 'checked' : '') +'>';
+                        }
+                    },
+                    {
+                        title: '棰勮鍥�',
+                        field: 'imageflag',
+                        width: 65,
+                        hidden:true,
+                        data: [{key: "true", value: "鏄�"}, {key: "false", value: "鍚�"}],
+                        templet: function (d) {
+                            //return webUtil.formateBoolean(d.imageflag);
+                            return '<input type="checkbox" name="imageflag" value="'+d.imageflag+'" lay-skin="switch" lay-text="鏄瘄鍚�" lay-filter="attrflag" '+(d.imageflag ==true||d.imageflag=='true'? 'checked' : '') +'>'
+                        }
+                    },
+                    {
+                        title: '榛樿鍊�',
+                        field: 'defaultvalue',
+                        sort: true,
+                        edit: 'text',
+                        width: 150
+                    },
+                    {
+                        title: '鍓嶇紑',
+                        field: 'prefixvalue',
+                        sort: true,
+                        edit: 'select',
+                        editConfig: {
+                            editable:true,
+                            comboxKey:'prefixvalue',
+                            comboxConfig:{
+                                url:"bdSelectInputController/listByFlag",
+                                backPath:that.backPath,
+                                extraParams:{
+                                    namespace:'codeclstempattr',
+                                    flag:'prefix'
+                                }
+                            }
+                        },
+                        width: 80
+                    },
+                    {
+                        title: '鍚庣紑',
+                        field: 'suffixvalue',
+                        sort: true,
+                        edit: 'select',
+                        editConfig: {
+                            editable:true,
+                            comboxKey: 'suffixvalue',
+                            comboxConfig:{
+                                url:"bdSelectInputController/listByFlag",
+                                backPath:that.backPath,
+                                extraParams:{
+                                    namespace:'codeclstempattr',
+                                    flag:'suffix'
+                                }
+                            }
+                        },
+                        width: 80
+                    },
+                    {
+                        title: '缁勫悎瑙勫垯',
+                        field: 'componentrule',
+                        sort: true,
+                        edit: 'refer',
+                        editConfig:{
+                            referConfig:{
+                                type:'formulaEditor',
+                                currentVarsUrl:'codeClassifyTempAttrController/gridCodeClassifyTemplateAttr',
+                                currentVarsParams: {
+                                    "conditionMap[\"classifyTemplateOid\"]":"${formValues.classifytemplateoid}",
+                                    "conditionMap[\"oid\"]":"!=${formValues.oid}"
+                                }
+                            }
+                        },
+                        width: 180
+                    },
+                    {
+                        title: '楠岃瘉瑙勫垯',
+                        field: 'verifyrule',
+                        sort: true,
+                        edit: 'refer',
+                        editConfig:{
+                            referConfig:{
+                                type:'mdm/CodeClassifyVerifyUser'
+                            }
+                        },
+                        width: 150
+                    },
+                    {
+                        title: '鏃堕棿鏍煎紡',
+                        field: 'codedateformat',
+                        sort: true,
+                        edit: 'select',
+                        editConfig: {
+                            editable:true,
+                            comboxKey: 'codedateformat',
+                            comboxConfig:{
+                                url:"bdSelectInputController/listByFlag",
+                                backPath:that.backPath,
+                                extraParams:{
+                                    namespace:'codeclstempattr',
+                                    flag:'dateFormates'
+                                }
+                            }
+                        },
+                        width: 150
+                    },
+                    {
+                        title: '鍒嗙被娉ㄥ叆(灞傜骇/鍚嶇О)',
+                        field: 'classifyinvokelevel',
+                        edit: 'refer',
+                        editConfig:{
+                            referConfig:{
+                                type:'mdm/CodeClassifyClassifyuse',
+                                setValue: 'layui.table.changeRecord(that.key, index, rawValue)'
+                            }
+                        },
+                        width: 200,
+                        templet: function (d) {
+                            if(d.classifyinvokeattr){
+                                var value='娉ㄥ叆绫诲瀷:'+d.classifyinvokeattr+';';
+                                if(d.classifyinvokeattr=='id'){
+                                    value+='娉ㄥ叆绫诲瀷鍚嶇О:鍒嗙被浠e彿;'
+                                }else{
+                                    value+='娉ㄥ叆绫诲瀷鍚嶇О:鍒嗙被鍚嶇О;'
+                                }
+                                value+='灞傜骇璁剧疆:'+d.classifyinvokelevel+';';
+                                value+='鏄惁鍙慨鏀�:'+webUtil.formateBoolean(d.classifyinvokeeditflag);
+                                return value;
+                            }else{
+                                return ''
+                            }
+                        }
+                    },
+                    {
+                        title: '鏋氫妇娉ㄥ叆',
+                        field: 'enumString',
+                        edit: 'refer',
+                        editConfig:{
+                            referConfig:{
+                                type:'mdm/CodeClassifyEnumUse'
+                            }
+                        },
+                        width: 150
+                    },
+                    {
+                        title: '绾ц仈灞炴��',
+                        field: 'parentCode',
+                        edit: 'refer',
+                        editConfig:{
+                            referConfig:{
+                                type:'mdm/CodeClassifyAttribute',
+                                setValue: 'layui.table.changeRecord(that.key, index, rawValue)'
+                            }
+                        },
+                        width: 150,
+                        templet: function (d) {
+                            return d.parentCode?(d.parentCode+'('+d.parentName+')'): '';
+                        }
+                    },
+                    {
+                        title: '鍙傜収閰嶇疆',
+                        field: 'referConfig',
+                        edit: 'refer',
+                        editConfig:{
+                            referConfig:{
+                                type:'referConfig'
+                            }
+                        },
+                        width: 150
+                    },
+                    {
+                        title: '绾ц仈鏌ヨ灞炴��',
+                        field: 'parentQueryAttr',
+                        edit: 'text',
+                        width: 150
+                    },
+                    {
+                        title: '閫夋嫨搴撴爣璇�',
+                        field: 'libraryIdentification',
+                        edit: 'text',
+                        width: 150
+                    },
+                    {
+                        title: '濉啓鎻愮ず',
+                        field: 'explain',
+                        edit: 'text',
+                        width: 150
+                    },
+                    {
+                        title: '琛ㄥ崟鏄剧ず鏍峰紡',
+                        field: 'formdisplaystyle',
+                        edit: 'text',
+                        width: 150
+                    },
+                    {
+                        title: '琛ㄦ牸鏄剧ず鏍峰紡',
+                        field: 'tabledisplaystyle',
+                        edit: 'text',
+                        width: 150
+                    },
+                    {
+                        title: '琛ㄥ崟瓒呴摼鎺�',
+                        field: 'formhref',
+                        edit: 'text',
+                        width: 150
+                    },
+                    {
+                        title: '琛ㄦ牸瓒呴摼鎺�',
+                        field: 'tablehref',
+                        edit: 'text',
+                        width: 150
+                    },
+                    {
+                        title: '琛ㄦ牸鏄剧ずjs',
+                        field: 'tabledisplayjs',
+                        edit: 'text',
+                        width: 150
+                    },
+                    {
+                        title: '闀垮害',
+                        field: 'controllength',
+                        width: 60
+                    },
+                    {
+                        title: '灏忔暟绮惧害(鍒诲害)',
+                        field: 'precisionlength',
+                        width: 100
+                    },
+                    {
+                        title: '鍙栧�艰寖鍥�',
+                        field: 'valuearea',
+                        sort: true,
+                        edit: 'text',
+                        width: 150
+                    },
+                    {
+                        field: 'options',
+                        title: '鎿嶄綔',
+                        width: 70,
+                        fixed:'right',
+                        templet: function (d) {
+                            return ['<a class="layui-btn layui-btn-intable" lay-event="REM">绉婚櫎</a>'].join('');
+                        }
+                    }];
+
+                that.tempAttrdataFields = [{
+                    field: 'id',
+                    title: '灞炴�ц嫳鏂囩紪鍙�'
+                }, {
+                    field: 'name',
+                    title: '灞炴�т腑鏂囧悕绉�'
+                },
+                    {
+                        title: '灞炴�у垎缁�',
+                        field: 'attributegroup'
+                    },
+                    {
+                        title: '绫诲瀷',
+                        field: 'attributedatatypeText',
+                        type: 'combox',
+                        data: []
+                    },
+                    {
+                        title: '鍏抽敭灞炴��',
+                        field: 'keyattrflag',
+                        type: 'combox',
+                        comboxKey: [{key: "true", value: "鏄�"}, {key: "false", value: "鍚�"}]
+                    },
+                    {
+                        title: '鏌ヨ灞炴��',
+                        field: 'queryattrflag',
+                        type: 'combox',
+                        comboxKey: [{key: "true", value: "鏄�"}, {key: "false", value: "鍚�"}]
+                    },
+                    {
+                        title: '楂樼骇鏌ヨ灞炴��',
+                        field: 'seniorqueryattrflag',
+                        type: 'combox',
+                        comboxKey: [{key: "true", value: "鏄�"}, {key: "false", value: "鍚�"}]
+                    },
+                    {
+                        title: '鐩镐技鏌ラ噸灞炴��',
+                        field: 'samerepeatattrflag',
+                        type: 'combox',
+                        comboxKey: [{key: "true", value: "鏄�"}, {key: "false", value: "鍚�"}]
+                    },
+                    /*{
+                        title: '涓�缁寸爜',
+                        field: 'barcodeflag',
+                        type: 'combox',
+                        comboxKey: [{key: "true", value: "鏄�"}, {key: "false", value: "鍚�"}]
+                    },
+                    {
+                        title: '浜岀淮鐮�',
+                        field: 'qrcodeflag',
+                        type: 'combox',
+                        comboxKey: [{key: "true", value: "鏄�"}, {key: "false", value: "鍚�"}]
+                    },*/
+                    {
+                        title: '蹇呰緭',
+                        field: 'requireflag',
+                        type: 'combox',
+                        comboxKey: [{key: "true", value: "鏄�"}, {key: "false", value: "鍚�"}]
+                    },
+                    {
+                        title: '琛ㄥ崟鏄剧ず',
+                        field: 'formdisplayflag',
+                        type: 'combox',
+                        comboxKey: [{key: "true", value: "鏄�"}, {key: "false", value: "鍚�"}]
+                    },
+                    {
+                        title: '鍒楄〃鏄剧ず',
+                        field: 'tabledisplayflag',
+                        type: 'combox',
+                        comboxKey: [{key: "true", value: "鏄�"}, {key: "false", value: "鍚�"}]
+                    },
+                    {
+                        title: '鍙',
+                        field: 'readonlyflag',
+                        type: 'combox',
+                        comboxKey: [{key: "true", value: "鏄�"}, {key: "false", value: "鍚�"}]
+                    },
+                    {
+                        title: '鍒楄〃鎺掑簭',
+                        field: 'sortattrflag',
+                        type: 'combox',
+                        comboxKey: [{key: "true", value: "鏄�"}, {key: "false", value: "鍚�"}]
+                    },
+                    {
+                        title: '闀垮害',
+                        field: 'controllength',
+                        type: 'number'
+                    },
+                    {
+                        title: '榛樿鍊�',
+                        field: 'defaultvalue'
+                    },
+                    {
+                        title: '鍓嶇紑',
+                        field: 'prefixvalue'
+                    },
+                    {
+                        title: '鍚庣紑',
+                        field: 'suffixvalue'
+                    },
+                    {
+                        title: '灏忔暟绮惧害(鍒诲害)',
+                        field: 'precisionlength',
+                        type: 'number'
+                    },
+                    {
+                        title: '缁勫悎瑙勫垯',
+                        field: 'componentrule'
+                    },
+                    {
+                        title: '楠岃瘉瑙勫垯',
+                        field: 'verifyrule'
+                    },
+                    {
+                        title: '鍙栧�艰寖鍥�',
+                        field: 'valuearea'
+                    },
+                    {
+                        title: '鏃堕棿鏍煎紡',
+                        field: 'codedateformat'
+                    },
+                    {
+                        title: '鍒嗙被娉ㄥ叆(灞傜骇/鍚嶇О)',
+                        field: 'classifyinvokelevel'
+                    },
+                    {
+                        title: '鏋氫妇娉ㄥ叆',
+                        field: 'enumid'
+                    },
+                    {
+                        title: '鍙傜収閰嶇疆',
+                        field: 'referConfig'
+                    },
+                    {
+                        title: '琛ㄥ崟鏄剧ず鏍峰紡',
+                        field: 'formdisplaystyle'
+                    },
+                    {
+                        title: '琛ㄦ牸鏄剧ず鏍峰紡',
+                        field: 'tabledisplaystyle'
+                    },
+                    {
+                        title: '琛ㄥ崟瓒呴摼鎺�',
+                        field: 'formhref'
+                    },
+                    {
+                        title: '琛ㄦ牸瓒呴摼鎺�',
+                        field: 'tablehref'
+                    },
+                    {
+                        title: '琛ㄦ牸鏄剧ずjs',
+                        field: 'tabledisplayjs'
+                    },
+                    {
+                        title: '澶氳鏂囨湰',
+                        field: 'textareaflag',
+                        type: 'combox',
+                        comboxKey: [{key: "true", value: "鏄�"}, {key: "false", value: "鍚�"}]
+                    }/*,
+                    {
+                        title: '棰勮鍥�',
+                        field: 'imageflag',
+                        type: 'combox',
+                        comboxKey: [{key: "true", value: "鏄�"}, {key: "false", value: "鍚�"}]
+                    }*/]
+            }
+        };
+        this.bindSwitch=function (tableId){
+            var that=this;
+            layui.form.on('switch(attrflag)', function(obj){
+                var tr=$(obj.othis).parents('tr');
+                var data= layui.table.getData(tableId)[tr.attr('data-index')]
+                data[this.name]=obj.elem.checked
+                //layui.table.changeRecord(tableId,tr.attr('data-index'),data);
+                $(obj.othis).parents('td').addClass('layui-table-edit_notsubmit')
+            });
+        }
+        this.initTempTable = function () {
+            var that = this;
+            var table = layui.table;
+            that.checkTempColumns();
+            var tableWidth = $("#border_" + that.id).width();
+            var options = {
+                elem: '#temp_' + that.id,
+                id: 'temp_' + that.id,
+                backPath: that.backPath,
+                url: that.url.tempController + that.url.tempDataGrid,
+                page: {
+                    limit: 10,
+                    page: 1
+                },
+                selectMode: table.selectMode.muti,
+                cols: [that.tempColumns],
+                method: 'get',
+                done: function (res, cur, total) {
+                    if (!that.fristMainLoad) {
+                        table.on('tool(temp_' + that.id + ')', function (obj) {
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if (layEvent == 'EDIT') {
+                                that.addOrEditTEMP(false,false, data);
+                            } else if (layEvent == 'UPREVSION') {
+                                that.doUPTEMP(data.oid, data.ts);
+                            }else if(layEvent=='DISABLE'){
+                                webUtil.showConfirmMsg("妯℃澘鍙湁鍙戝竷鐘舵�佹墠鑳借浣跨敤锛屾槸鍚︾‘瀹氬仠鐢紵", function () {
+                                    that.disableOrEnableTEMP(false, data.oid, data.ts);
+                                });
+                            }else if(layEvent=='ENABLE'){
+                                webUtil.showConfirmMsg("鏄惁纭畾鍚敤/鍙戝竷杩欎釜妯℃澘锛屾ā鏉垮彧鏈夊彂甯冪姸鎬佹墠鑳借浣跨敤锛屾槸鍚︾户缁紵", function () {
+                                    that.disableOrEnableTEMP(true, data.oid, data.ts);
+                                });
+                            }
+                        });
+                    } else {
+                        if (total > 0) {
+                            table.selectRecord('temp_' + that.id, {index: 0});
+                        }else {
+                            table.reload("tempAttr_" + that.id, {
+                                data:[]
+                            })
+                        }
+                    }
+                    that.fristMainLoad = true;
+                },
+                rowClick: function (thisTableFilter, record) {
+                    var options=layui.table.getConfig('tempAttr_' + that.id)
+                    options.extraParams={
+                        "conditionMap['classifyTemplateOid']": record.oid
+                    }
+                    table.setConfig(options)
+                    that.getTempAttrData('tempAttr_' + that.id)
+                    table.reload("process_" + that.id, {
+                        extraParams: {
+                            "conditionMap['classifyTemplateOid']": record.oid
+                        }
+                    })
+                    table.reload("phase_" + that.id,{
+                        extraParams: {
+                            "conditionMap['codeClassifyTemplateOid']": record.oid
+                        }
+                    })
+                    table.reload("button_" + that.id,{
+                        extraParams: {
+                            "conditionMap['classifyTemplateOid']": record.oid
+                        }
+                    })
+                }
+            };
+            table.render(options);
+        };
+        this.checkTempColumns = function () {
+            var that = this;
+            var table = layui.table;
+            if (that.tempColumns == null || that.tempColumns.length == 0) {
+                that.tempColumns = [table.getIndexColumn(), table.getCheckColumn(),
+                    {
+                        field: 'id',
+                        title: '妯℃澘缂栧彿',
+                        sort: true,
+                        width: 150
+                    }, {
+                        field: 'name',
+                        title: '妯℃澘鍚嶇О',
+                        sort: true,
+                        width: 200
+                    }, {
+                        field: 'description',
+                        title: '妯℃澘鎻忚堪',
+                        sort: true,
+                        width: 150
+                    }, {
+                        field: 'revisionValue',
+                        title: '鐗堟湰鍙�',
+                        sort: true,
+                        width: 70
+                    }, {
+                        field: 'lcStatusText',
+                        title: '鐘舵��',
+                        sortField: 'lcStatus',
+                        sort: true,
+                        width: 60
+                    },
+                    {
+                        field: 'options',
+                        title: '鎿嶄綔',
+                        width: 200,
+                        fixed:'right',
+                        templet: function (d) {
+                            var btns=[];
+                            if (d.lcStatus == 'Editing') {
+                                btns.push('<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a><a class="layui-btn layui-btn-intable" lay-event="ENABLE">鍚敤/鍙戝竷</a>')
+                            }else if(d.lcStatus=='Disabled'){
+                                btns.push('<a class="layui-btn layui-btn-intable" lay-event="ENABLE">鍚敤/鍙戝竷</a>');
+                            }else if(d.lcStatus=='Released' || d.lcStatus=='Enabled'){
+                                btns.push('<a class="layui-btn layui-btn-intable" lay-event="DISABLE">鍋滅敤/澶辨晥</a><a class="layui-btn layui-btn-intable" lay-event="UPREVSION">鍗囩増</a>');
+                            }
+                            return btns.join("");
+                        }
+                    }];
+                that.tempdataFields = [{
+                    field: 'id',
+                    title: '妯℃澘缂栧彿'
+                }, {
+                    field: 'name',
+                    title: '妯℃澘鍚嶇О'
+                }, {
+                    field: 'description',
+                    title: '妯℃澘鎻忚堪'
+                }, {
+                    field: 'revisionValue',
+                    title: '鐗堟湰鍙�'
+                }, {
+                    field: 'lcStatus',
+                    title: '鐘舵��',
+                    type: 'combox',
+                    comboxKey: [{key: "Editing", value: "缂栬緫涓�"}, {key: "Released", value: "宸叉挙閿�"}, {
+                        key: "Designing",
+                        value: "宸叉寕璧�"
+                    }, {key: "Finish", value: "宸插畬宸�"}, {key: "Scrap", value: "宸蹭綔搴�"}]
+                }]
+            }
+        };
+        this.createProcessSearchHtml = function (){
+            var that = this;
+            webUtil.createSearchHtml({name:"妯℃澘鍚嶇О"},$("[layui-filter='toolbar_process_" + that.id + "']"),'process_' + that.id);
+            webUtil.bindDefultButtonLisenter(that, "process_" + that.id);
+
+        };
+        this.initProcessTable = function () {
+            var that = this;
+            var table = layui.table;
+            that.checkProcessColumns();
+            var tableWidth = $("#border_" + that.id).width() - 15;
+            var options = {
+                elem: '#process_' + that.id,
+                id: 'process_' + that.id,
+                backPath: that.backPath,
+                url: that.url.processLinkController + that.url.processLinkDataGrid,
+                page: {
+                    limit: 15,
+                    page: 1
+                },
+                width: tableWidth,
+                selectMode: table.selectMode.muti,
+                cols: [that.processColumns],
+                method: 'get',
+                done: function (res, cur, total) {
+                    if (!that.fristProcessLoad) {
+                        table.on('tool(process_' + that.id + ')', function (obj) {
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if (layEvent == 'EDIT') {
+                                that.addOrEditProcess(false,data.classifyTemplateOid,data.oid);
+                            }
+                        });
+                    } else {
+                        if (total > 0) {
+                            table.selectRecord('process_' + that.id, {index: 0});
+                        }
+                    }
+                    that.fristProcessLoad = true;
+                }
+            };
+            table.render(options);
+        };
+        this.checkProcessColumns = function (){
+            var that = this;
+            var table = layui.table;
+            if(that.processColumns==null || that.processColumns.length==0){
+                that.processColumns = [table.getIndexColumn(),table.getCheckColumn(),
+                    {
+                        title: '妯℃澘key',
+                        field: 'id',
+                        sort:true,
+                        width: 150
+                    },{
+                        title: '妯℃澘鍚嶇О',
+                        field: 'name',
+                        sort:true,
+                        width: 200
+                    },{
+                        title: '妯℃澘鐗堟湰',
+                        field: 'processVersion',
+                        width: 70
+                    }, {
+                        title: '娴佺▼妯℃澘鐢ㄩ��',
+                        field: 'codeprocessuseText',
+                        sort:true,
+                        sortField:'codeprocessuse',
+                        type:'combox',
+                        comboxKey:"codeClassifyProcessUse",
+                        width: 150
+                    },{
+                        field: 'codeTempAttrOidArrName',
+                        title: '娴佺▼鏍戞樉绀哄睘鎬�',
+                        width: 200
+                    },
+                    {
+                        field:'options',
+                        title:'鎿嶄綔',
+                        width: 100,
+                        templet:function(d){
+                            return '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>';
+                        }
+                    }];
+            }
+        };
+
+        this.createPhaseSearchHtml = function (){
+            var that = this;
+            webUtil.createSearchHtml({name:"闃舵鍚嶇О"},$("[layui-filter='toolbar_phase_" + that.id + "']"),'phase_' + that.id);
+            webUtil.bindDefultButtonLisenter(that, "phase_" + that.id);
+        };
+        this.initPhaseTable = function (){
+            var that = this;
+            var table = layui.table;
+            that.checkPhaseColumns();
+            var tableWidth = $("#border_" + that.id).width() - 15;
+            var options = {
+                elem: '#phase_' + that.id,
+                id: 'phase_' + that.id,
+                backPath: that.backPath,
+                url: that.url.phaseController + that.url.phaseDataGrid,
+                page: {
+                    limit: 15,
+                    page: 1
+                },
+                width: tableWidth,
+                selectMode: table.selectMode.muti,
+                cols: [that.phaseColumns],
+                method: 'get',
+                done: function (res, cur, total) {
+                    if (!that.fristPhaseLoad) {
+                        table.on('tool(phase_' + that.id + ')', function (obj) {
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if (layEvent == 'EDITPHASE') {
+                                that.addOrEditPhase(false,data.oid);
+                            }
+                            if (layEvent == 'VIEWPHASE') {
+                                that.addOrEditPhase(false,data.oid,true);
+                            }
+                        });
+                    } else {
+                        if (total > 0) {
+                            table.selectRecord('phase_' + that.id, {index: 0});
+                        }
+                    }
+                    that.fristPhaseLoad = true;
+                }
+            };
+            table.render(options);
+        };
+        this.checkPhaseColumns = function (){
+            var that = this;
+            var table = layui.table;
+            if(that.phaseColumns==null || that.phaseColumns.length==0){
+                that.phaseColumns = [table.getIndexColumn(),table.getCheckColumn(),
+                    {
+                        field:'id',
+                        title: '闃舵缂栧彿',
+                        width: 150
+                    },{
+                        field: 'name',
+                        title: '闃舵鍚嶇О',
+                        width: 200
+                    },{
+                        field: 'description',
+                        title: '鎻忚堪',
+                        width: 150
+                    },
+                    {
+                        field:'options',
+                        title:'鎿嶄綔',
+                        width: 150,
+                        templet:function(d){
+                            return '<a class="layui-btn layui-btn-intable" lay-event="EDITPHASE">缂栬緫</a><a class="layui-btn layui-btn-intable" lay-event="VIEWPHASE">鏌ョ湅</a>';
+                        }
+                    }];
+            }
+        };
+        this.createButtonSearchHtml = function (){
+            var that = this;
+            webUtil.createSearchHtml({name:"鎸夐挳鍚嶇О"},$("[layui-filter='toolbar_button_" + that.id + "']"),'button_' + that.id);
+            webUtil.bindDefultButtonLisenter(that, "button_" + that.id);
+        };
+        this.initButtonTable = function (){
+            var that = this;
+            var table = layui.table;
+            that.checkButtonColumns();
+            var tableWidth = $("#border_" + that.id).width() - 15;
+            var options = {
+                elem: '#button_' + that.id,
+                id: 'button_' + that.id,
+                backPath: that.backPath,
+                url: that.url.buttonController + that.url.buttonDataGrid,
+                page: {
+                    limit: 15,
+                    page: 1
+                },
+                width: tableWidth,
+                selectMode: table.selectMode.muti,
+                cols: [that.buttonColumns],
+                method: 'get',
+                done: function (res, cur, total) {
+                    if (!that.fristButtonLoad) {
+                        table.on('tool(button_' + that.id + ')', function (obj) {
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if (layEvent == 'EDITBUTTON') {
+                                that.addOrEditButton(false,data.oid);
+                            }
+                        });
+                    } else {
+                        if (total > 0) {
+                            table.selectRecord('phase_' + that.id, {index: 0});
+                        }
+                    }
+                    that.fristButtonLoad = true;
+                }
+            };
+            table.render(options);
+        };
+        this.checkButtonColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.buttonColumns==null || that.buttonColumns.length==0){
+                that.buttonColumns = [table.getIndexColumn(),table.getCheckColumn(),
+                    {
+                        title: '鎸夐挳鏍囪瘑',
+                        field: 'id',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '鎸夐挳鍚嶇О',
+                        field: 'classifybuttonoidName',
+                        width: 150
+                    },
+                    {
+                        title: '鎸夐挳鐢ㄩ��',
+                        field: 'buttonUseText',
+                        sortField:'buttonuse',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '鎺掑簭鍙�',
+                        field: 'ordernum',
+                        type: 'number',
+                        width: 100
+                    }];
+            }
+        };
+        this.ADDClassify = function () {
+            var that = this;
+            that.addOrEditClassify(true);
+        };
+        this.EDITClassify = function () {
+            var that = this;
+            if (webUtil.isNull(that.currentItemOid)) {
+                webUtil.showErrorMsg("璇峰厛浠庢爲涓婇�夋嫨涓�鏉℃暟鎹�");
+                return false;
+            }
+            that.addOrEditClassify(false, that.currentItemOid);
+        };
+        //娣诲姞淇敼涓婚搴撳垎绫�
+        this.addOrEditClassify = function (add, oid) {
+            var that = this;
+            var form = layui.form;
+            var filter = "form_" + that.id;
+            var typeText = $webUtil.isNull(that.currentItemOid)?'涓婚搴�':'鍒嗙被';
+            var title =  (add ? '娣诲姞' : '淇敼') + typeText;
+            var addSaveIndex = webUtil.dialog({
+                title: title,
+                btn: ['淇濆瓨', '鍙栨秷'],
+                content: '<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin:10px 50px 10px 0" ></form>',
+                resizing: function (layero) {
+                    form.doResize(filter);
+                },
+                success: function (layero, layerIndex, classP) {
+                    var isHidden=false;
+                    if((add && that.currentItemOid) || (!add && webUtil.isNotNull(that.currentItemAttributes.parentcodeclassifyoid))){
+                        isHidden=true;
+                    }
+                    form.addItems(filter, that.getFormItems(false,isHidden,typeText),
+                        function () {
+                            if (!add) {
+                                form.load(filter, {
+                                    backPath: that.backPath,
+                                    url: that.url.controller + that.url.getObjectByOid,
+                                    method: 'get',
+                                    params: {
+                                        oid: oid
+                                    }
+                                });
+                            } else {
+                                var defaultValues = {};
+                                if (that.currentItemAttributes) {
+                                    defaultValues["parentcodeclassifyoid"] = that.currentItemOid;
+                                    defaultValues["parentcodeclassifyoidname"] = that.currentItemAttributes.name;
+                                }
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues, filter);
+                            }
+                            webUtil.relocationOpen(classP)
+                        }, {}, {defaultColumnOneRow: 3, labelWidth: 160});
+                },
+                yes: function (layero) {
+                    if (form.validata(filter)) {
+                        var values = form.getValues(filter, true);
+                        var url = that.url.controller + (add ? that.url.addSave : that.url.editSave);
+                        if ($webUtil.isNull(values.parentcodeclassifyoid)
+                            && $webUtil.isNull(values.btmtypeid)) {
+                            $webUtil.showErrorMsg('涓婚搴撳繀椤昏缃笟鍔$被鍨�');
+                            return false;
+                        }
+                        if($webUtil.isNotNull(values.parentcodeclassifyoid)){
+                            values.btmtypeid=''
+                            values.btmtypename=''
+                        }
+                        webUtil.manualAjax(add ? 'post' : 'put', url, JSON.stringify(values), function (result) {
+                            if (result.success) {
+                                webUtil.showMsgFromResult(result, (add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refreshClassify();
+                            } else {
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        }, function (xhr, err) {
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        }, that.backPath);
+                    }
+                },
+                btn2: function (layero) {
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DELClassify = function () {
+            var that = this;
+            if (webUtil.isNull(that.currentItemOid)) {
+                webUtil.showErrorMsg("璇峰厛浠庢爲涓婄殑鑺傜偣");
+                return false;
+            }
+            var ts = that.currentItemAttributes.ts;
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎褰撳墠閫夋嫨鐨勫垎绫伙紝灏嗕細鎶婂瓙鍒嗙被涓�骞跺垹闄わ紝濡傛灉瀛樺湪缂栫爜鏁版嵁灏嗕笉鑳借鍒犻櫎锛屾槸鍚︾户缁紵", function () {
+                var submitValue = {oid: that.currentItemOid, ts: ts};
+                webUtil.post(that.url.controller + that.url.checkIsCanDelete, submitValue, function (result) {
+                    if (result.success) {
+                        if ('true' == result.obj || true == result.obj) {
+                            webUtil.showConfirmMsg("褰撳墠鏁版嵁鍖呭惈鏈変笅绾ф暟鎹紝瑕佸垹闄ょ殑璇濅細鍜屼笅绾ф暟鎹竴璧峰垹闄わ紝浣犵‘璁ょ户缁�?", function () {
+                                that.doDeleteClassify(submitValue);
+                            });
+                        } else {
+                            //璇存槑鍙互鍒犻櫎
+                            that.doDeleteClassify(submitValue);
+                        }
+                    } else {
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                }, function (xhr, error) {
+                    webUtil.showErrorMsg("鏍¢獙鍒犻櫎鍑虹幇浜嗛敊璇紝鍙兘鏄湇鍔″櫒鏈惎鍔�")
+                }, that.backPath);
+            });
+        };
+        this.doDeleteClassify = function (submitValue) {
+            var that = this;
+            webUtil.deleteRequest( that.url.controller + that.url.deleteUrl, submitValue, function (result) {
+                if (result.success) {
+                    webUtil.showMsgFromResult(result, "鍒犻櫎鎴愬姛");
+                    that.currentItemOid=null;
+                    that.currentItemAttributes=null;
+                    that.currentItem=null;
+                    that.refreshClassify();
+                } else {
+                    webUtil.showErrorMsg(result.msg);
+                }
+            }, function (xhr, err) {
+                webUtil.showErrorMsg("鎵ц鍒犻櫎鐨勬椂鍊欏嚭閿欎簡閿欒锛屽彲鑳芥槸鏈嶅姟鍣ㄦ殏鏃舵棤娉曡闂�");
+            }, that.backPath);
+        };
+
+        this.DISABLEClassify = function () {
+            var that = this;
+            if (webUtil.isNull(that.currentItemOid)) {
+                webUtil.showErrorMsg("璇峰厛浠庢爲涓婇�夋嫨涓�鏉℃暟鎹�");
+                return false;
+            }
+            if(that.currentItemAttributes.lcStatus!='Enabled'){
+                webUtil.showErrorMsg("褰撳墠鍒嗙被涓嶆槸鍚敤鐘舵��");
+                return false;
+            }
+            webUtil.showConfirmMsg("鏄惁鍋滅敤褰撳墠鍒嗙被锛屽仠鐢ㄥ悗锛屽瓙鍒嗙被涔熷皢涓嶈兘琚娇鐢紝鏄惁缁х画锛�", function () {
+                that.disableOrEnableClassify(false);
+            });
+
+        };
+        this.ENABLEClassify = function () {
+            var that = this;
+            if (webUtil.isNull(that.currentItemOid)) {
+                webUtil.showErrorMsg("璇峰厛浠庢爲涓婇�夋嫨涓�鏉℃暟鎹�");
+                return false;
+            }
+            if(that.currentItemAttributes.lcStatus!='Disabled' && that.currentItemAttributes.lcStatus!='Editing' ){
+                webUtil.showErrorMsg("褰撳墠鍒嗙被涓嶆槸鍋滅敤鐘舵��");
+                return false;
+            }
+            var enableIndex = layer.open({
+                title: '闇�瑕佹偍纭',
+                btn: ['鏄�', '鍚�', '鍙栨秷'],
+                content: '<div style="padding: 0px 0px 0px 35px;text-align: left;"><i class="layui-layer-ico layui-layer-ico3"></i>鏄惁灏嗗瓙鍒嗙被涓�骞跺惎鐢紵</div>',
+                resizing: function (layero) {
+                },
+                success: function (layero, layerIndex, classP) {
+                    webUtil.relocationOpen(classP)
+                },
+                yes: function (layero) {
+                    that.disableOrEnableClassify(true, true);
+                },
+                btn2: function (layero) {
+                    that.disableOrEnableClassify(true, false);
+                },
+                btn3: function (layero) {
+                    layer.close(enableIndex);
+                }
+            })
+
+        };
+        //鍋滅敤鍚敤涓婚搴撳垎绫�
+        this.disableOrEnableClassify = function (enable, ablechildren) {
+            var that = this;
+            var oid;
+            var ts;
+            if (webUtil.isNull(that.currentItemOid)) {
+                webUtil.showErrorMsg("璇峰厛浠庢爲涓婇�夋嫨涓�鏉℃暟鎹�");
+                return false;
+            }
+            oid = that.currentItemOid;
+            ts = that.currentItemAttributes.ts;
+            webUtil.post(that.url.controller + (enable ? that.url.enableData : that.url.disableData), {
+                oid: oid,
+                ts: ts,
+                ablechildren: ablechildren
+            }, function (result) {
+                if (result.success) {
+                    webUtil.showMsgFromResult(result, (enable ? '鍚敤鎴愬姛' : '鍋滅敤鎴愬姛'));
+                    that.refreshClassify();
+                } else {
+                    webUtil.showErrorMsg(result.msg);
+                }
+            }, function (xhr, err) {
+                webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+            }, that.backPath);
+        };
+
+        this.refreshClassify = function (buttonid, ele) {
+            var that = this;
+            var tree = layui.tree;
+            if (that.currentItem && !buttonid) {
+                if (webUtil.isNotNull(that.currentItem.parentId)) {
+                    tree.reloadNode("tree_" + that.id, that.currentItem.parentId, function (filter, elem, data) {
+                        var currentelem = layui.tree.getElemByItem("tree_" + that.id, that.currentItemOid);
+                        if (currentelem.length > 0) {
+                            currentelem.children('a').trigger('click')
+                        } else {
+                            elem.children('a').trigger('click').trigger('click')
+                        }
+                    });
+                } else {
+                    tree.reload("tree_" + that.id, {
+                        loadCallback: function (filter, tempNode) {
+                            if (that.currentItemOid) {
+                                var currentelem = layui.tree.getElemByItem("tree_" + that.id, that.currentItemOid);
+                                if (currentelem.length > 0) {
+                                    currentelem.children('a').trigger('click')
+                                }
+                            }
+                        }
+                    });
+                }
+            }else{
+                tree.reload("tree_" + that.id, {
+                    loadCallback: function (filter, tempNode) {
+                    }
+                });
+                that.currentItemOid=null;
+                that.currentItemAttributes=null;
+                that.currentItem=null;
+            }
+        };
+        this.ADVQUERYClassify = function () {
+            var that = this;
+            if (!that.serinorQueryInstance) {
+                var dynamicCondition = layui.dynamicCondition;
+                $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar' + that.id + '" class="layui-inline"></div>');
+                that.checkColumns();
+                that.serinorQueryInstance = dynamicCondition.create({
+                    fields: that.dataFields//鏌ヨ瀛楁
+                    , tableId: "table_" + that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                    , type: "complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                    , queryCallBack: function (requestData) {//鏌ヨ涔嬪悗鐨刢allback
+
+                    }
+                });
+            }
+            that.serinorQueryInstance.open();
+        };
+
+        //鍒ゆ柇妯℃澘鏁版嵁鐘舵��
+        this.checkTEMPStatus = function (isStatus,statusMsg) {
+            var that = this;
+            var checkData = layui.table.checkStatus("temp_" + that.id).data;
+            if (checkData.length != 1) {
+                webUtil.showErrorMsg('璇烽�夋嫨涓�涓ā鏉�');
+                return false;
+            }
+            isStatus=false;
+            if (isStatus) {
+                if (checkData[0].lcStatus != 'Editing') {
+                    webUtil.showErrorMsg(statusMsg || '妯℃澘鐘舵�佷笉鏄�滅紪杈戜腑鈥�');
+                    return false;
+                }
+            }
+            return checkData[0];
+        };
+        //妯℃澘灞炴�ф坊鍔�
+        this.ADD = function (type,button) {
+            var that = this;
+            var tempData=that.checkTEMPStatus(true)
+            if (!tempData) {
+                return false;
+            }
+            var table = layui.table;
+            var filter = "add_attr_" + that.id;
+            var addSaveIndex = webUtil.dialog({
+                title: '浠庝笟鍔$被鍨嬩腑閫夋嫨灞炴��',
+                btn: ['纭畾閫夋嫨', '鍙栨秷'],
+                area: ['1280px', '600px'],
+                content: '<div class="layui-form-item" style="height:24px;margin:5px 5px 0 5px;display:inline-block"> ' +
+                            '<div class="layui-input-inline" style="height:24px;line-height:24px;width:120px;min-width: 120px">' +
+                                '<select name="searchAttr_' + filter + '" style="height:24px;width:120px;font-size:15px;">' +
+                                    '<option value="id">灞炴�ц嫳鏂囧悕绉�</option>' +
+                                    '<option value="name">灞炴�ц嫳鏂囧悕绉�</option>' +
+                                '</select>' +
+                            '</div>' +
+                            '<div class="layui-input-inline"><input type="text" style="height:24px;font-size:14px;" name="searchvalue_'+ filter + '" placeholder="杈撳叆鍊煎悗鍥炶溅杩涜妯$硦鏌ヨ" class="layui-input" ></div>'+
+                            '<div class="layui-input-inline" ><button class="layui-btn" style="height:24px;line-height:24px;margin: 0" name="searchbtn_'+ filter + '" >鏌ヨ</button></div>' +
+                        '</div>'+
+                        '<table id="table_' + filter + '" lay-filter="' + filter + '"  style="margin-top:5px" ></table>',
+                success: function (layero, layerIndex, classP) {
+                    var columns = [table.getIndexColumn(), table.getCheckColumn(), {
+                        field: 'id',
+                        title: '灞炴�ц嫳鏂囧悕绉�',
+                        width: 150
+                    }, {
+                        field: 'name',
+                        title: '灞炴�т腑鏂囧悕绉�',
+                        width: 200
+                    }, {
+                        field: 'attributeLength',
+                        title: '闀垮害',
+                        width: 80
+                    }, {
+                        field: 'attrDataType',
+                        title: '鏁版嵁绫诲瀷',
+                        width: 80,
+                        templet: function (d) {
+                            return that.vciFieldTypeMap[d.attrDataType];
+                        }
+                    }, {
+                        field: 'nullableFlag',
+                        title: '鍙┖',
+                        width: 60,
+                        templet: function (d) {
+                            return $webUtil.formateBoolean(d.nullableFlag);
+                        }
+                    }, {
+                        field: 'defaultValue',
+                        title: '榛樿鍊�',
+                        width: 80
+                    }, {
+                        field: 'precisionLength',
+                        title: '灏忔暟绮惧害',
+                        width: 80
+                    }, {
+                        field: 'scaleLength',
+                        title: '灏忔暟鍒诲害',
+                        width: 80
+                    }, {
+                        field: 'range',
+                        title: '鍙栧�艰寖鍥�',
+                        width: 100
+                    }, {
+                        field: 'referFlag',
+                        title: '鍙傜収',
+                        width: 130,
+                        templet: function (d) {
+                            if (!d.referFlag) {
+                                return '';
+                            } else {
+                                return d.referBtmTypeId
+                            }
+                        }
+                    }, {
+                        field: 'enumFlag',
+                        title: '鏋氫妇',
+                        width: 130,
+                        templet: function (d) {
+                            if (!d.enumFlag) {
+                                return '';
+                            } else {
+                                return d.enumId
+                            }
+                        }
+                    }]
+                    var options = {
+                        elem: '#table_' + filter,
+                        id: 'table_' + filter,
+                        backPath: that.backPath,
+                        url: that.url.templateAttrController + 'codeClassifyTemplateAttrByBtm',
+                        extraParams:{
+                            "conditionMap['oid']":tempData.oid
+                        },
+                        selectMode: table.selectMode.muti,
+                        limit: -1,
+                        cols: [columns]
+                    };
+                    table.render(options);
+
+                    $('[name="searchbtn_'+ filter +'"]').click(function(){
+                        var searchField = $(this).parent().parent().find('select').val();
+                        var searchValue = $(this).parent().parent().find('[name="searchvalue_' + filter + '"]').val();
+                        queryByCondition('table_' + filter,searchField,searchValue);
+                    });
+                    $('[name="searchvalue_'+ filter  +'"]').keydown(function(e){
+                        if(e.keyCode == 13) {
+                            var searchField = $(this).parent().parent().find('select').val();
+                            var searchValue = $(this).val();
+                            queryByCondition('table_' + filter, searchField,searchValue);
+                        }
+                    });
+
+                    queryByCondition = function(tableId,searchField,searchValue){
+                        if($webUtil.isNotNull(searchValue)){
+                            searchValue = "*" + searchValue + "*";
+                        }
+                        var requestData={}
+                        requestData['conditionMap["' + searchField + '"]'] = searchValue;
+                        requestData['page']= 1;
+                        var table = layui.table;
+                        table.reload(
+                            tableId, {
+                                where: requestData
+                            }
+                        );
+                    }
+                },
+                yes: function (layero) {
+                    var checkData = layui.table.checkStatus("table_" + filter).data;
+                    if (checkData.length < 1) {
+                        webUtil.showErrorMsg('璇烽�夋嫨灞炴�ч泦');
+                        return false;
+                    } else {
+                        var tempAttrData = layui.table.getData('tempAttr_' + that.id, true);
+                        var addData = [];
+                        var ordernum=tempAttrData.length
+                        $.each(checkData, function (ci, citem) {
+                            var isCopy=false;
+                            $.each(tempAttrData, function (i, item) {
+                                if(citem.id == item.id){
+                                    isCopy=true;
+                                    return false;
+                                }
+                            })
+                            if(!isCopy) {
+                                citem.oid=''
+                                addData.push($.extend({}, citem, {
+                                    ordernum:++ordernum,
+                                    attributedatatype:citem.attrDataType,
+                                    attributeDataTypeText:that.vciFieldTypeMap[citem.attrDataType],
+                                    controllength: citem.attributeLength,
+                                    valuearea:citem.range,
+                                    referbtmid:citem.referBtmTypeId,
+                                    referbtmname:citem.referBtmTypeName,
+                                    referConfig:'',
+                                    enumid:citem.enumId,
+                                    precisionlength:(citem.precisionLength?citem.precisionLength:'')+(citem.scaleLength?'('+citem.scaleLength+')':''),
+                                    classifyTemplateOid:tempData.oid,
+                                    formdisplayflag:true,
+                                    tabledisplayflag:true,
+                                    sortattrflag:true,
+                                    queryattrflag:true,
+                                    seniorqueryattrflag:true,
+                                    attrTableWidth:120
+                                }))
+                            }
+                        })
+                        layui.table.addData('tempAttr_' + that.id, addData);
+                        layer.close(addSaveIndex);
+                    }
+                },
+                btn2: function (layero) {
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.REMTempAttr = function (data,filter) {
+            var that = this;
+            layui.table.removeData(filter, data[layui.table.config.indexName]);
+        }
+        //妯℃澘灞炴�у垹闄�
+        this.DEL = function (type,button) {
+            var that = this;
+            if (!that.checkTEMPStatus(true)) {
+                return false;
+            }
+            var filter=$(button).attr('isfull')=='true'?'tempAttr_fullScreen_'+that.id:"tempAttr_" + that.id
+            var tempAttrData = layui.table.checkStatus(filter,true).data;
+            if (tempAttrData.length == 0) {
+                webUtil.showErrorMsg("璇烽�夋嫨闇�瑕佸垹闄ょ殑妯℃澘灞炴��");
+                return false;
+            }
+            $.each(tempAttrData, function (i, item) {
+                that.REMTempAttr(item,filter)
+            })
+
+        };
+        //妯℃澘灞炴�т繚瀛�
+        this.SAVE = function (type,button) {
+            var that = this;
+            if (!that.checkTEMPStatus(true)) {
+                return false;
+            }
+            var filter=$(button).attr('isfull')=='true'?'tempAttr_fullScreen_'+that.id:"tempAttr_" + that.id;
+            that.VIEWORDER(type,button)
+            var tempAttrData=layui.table.getData(filter,true);
+            var ischeck=true;
+            layui.each(tempAttrData,function (index,item){
+                tempAttrData[index].ordernum=index+1;
+                if((item.requireflag && item.requireflag.toString()=='true') && (item.readonlyflag && item.readonlyflag.toString()=='true')){
+                    webUtil.showErrorMsg(item.name+"("+item.id+")蹇呰緭鐨勫睘鎬т笉鑳芥槸鍙");
+                    ischeck=false;
+                    return;
+                }
+                var num=0;
+                if(webUtil.isNotNull(item.componentrule)){
+                    //缁勫悎瑙勫垯
+                    num++
+                }
+                if(webUtil.isNotNull(item.enumString) || webUtil.isNotNull(item.enumid)){
+                    //鏋氫妇
+                    num++
+                }
+                if(webUtil.isNotNull(item.referConfig) || webUtil.isNotNull(item.referbtmid)){
+                    //鍙傜収
+                    num++
+                }
+                if(webUtil.isNotNull(item.codedateformat)){
+                    //鏃堕棿鏍煎紡
+                    num++
+                }
+                if(webUtil.isNotNull(item.classifyinvokelevel)){
+                    //鍒嗙被娉ㄥ叆
+                    num++
+                }
+                /*if(item.barcodeflag=='true' || item.barcodeflag==true){
+                    //涓�缁寸爜
+                    num++
+                }
+                if(item.qrcodeflag=='true' || item.qrcodeflag==true){
+                    //浜岀淮鐮�
+                    num++
+                }
+                if(item.imageflag=='true' || item.imageflag==true){
+                    //缂╃暐鍥�
+                    num++
+                }*/
+                if(num>1){
+                    webUtil.showErrorMsg(item.name+"("+item.id+") 灞炴�у彧鑳芥槸缁勫悎瑙勫垯锛屾灇涓撅紝鍙傜収锛屾椂闂存牸寮忥紝鍒嗙被娉ㄥ叆涓殑涓�绉�");
+                    ischeck=false;
+                    return;
+                }
+            })
+            if(!ischeck){
+                return ;
+            }
+            webUtil.manualAjax('post', that.url.templateAttrController+'batchAddSave', JSON.stringify(tempAttrData), function (result) {
+                if (result.success) {
+                    webUtil.showMsgFromResult(result, ("淇濆瓨鎴愬姛"));
+                    that.refresh(type,button);
+                    if(filter=='tempAttr_fullScreen_'+that.id) that.getTempAttrData("tempAttr_" + that.id);
+                } else {
+                    webUtil.showErrorMsg(result.msg);
+                }
+            }, function (xhr, err) {
+                webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+            }, that.backPath);
+        }
+        //妯℃澘灞炴�ч噸缃�
+        this.CANCEL = function (type,button) {
+            var that = this;
+            if (!that.checkTEMPStatus(true)) {
+                return false;
+            }
+            that.refresh(type,button);
+        }
+        //妯℃澘灞炴�у叏灞忕紪杈�
+        this.BATCHEDIT = function (type,button) {
+            var that = this;
+            if (!that.checkTEMPStatus(false)) {
+                return false;
+            }
+            var filter = "fullScreen_" + that.id;
+            var table = layui.table;
+            that.BATCHEDITIndex = layer.open({
+                type: 1,
+                title: '妯℃澘灞炴��',
+                content: '<div id="' + filter + '" lay-filter="' + filter + '" style="margin:5px" >' + that.getToolbarHtml(true) + '<table id="tempAttr_' + filter + '" lay-filter="tempAttr_' + filter + '" style="overflow-x:auto;"></table></div>',
+                fullScreen: true,
+                closeBtn: 0,
+                shadeClose: false,
+                resizing: function (layero) {
+                    form.doResize(filter);
+                },
+                success: function (layero) {
+                    var options = table.getConfig('tempAttr_' + that.id);
+                    options.elem = '#tempAttr_' + filter
+                    options.id = 'tempAttr_' + filter;
+                    options.width = 'auto';
+                    options.maxHeight=layero.height()-110;
+                    if(options.data.length*33+45<options.maxHeight){
+                        options.height = 'auto';
+                    }else{
+                        options.height = options.maxHeight;
+                    }
+                    options.done= function (res, cur, total) {
+                        table.on('tool(tempAttr_' + filter + ')', function (obj) {
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if (layEvent == 'UP') {
+                                that.UPTempAttr(data,'tempAttr_' + filter);
+                            } else if (layEvent == 'DOWN') {
+                                that.DOWNTempAttr(data,'tempAttr_' +filter);
+                            } else if (layEvent == 'REM') {
+                                that.REMTempAttr(data,'tempAttr_' + filter);
+                            }
+                        });
+                        that.bindSwitch('tempAttr_'+filter)
+                    }
+                    table.render(options);
+                    webUtil.bindDefultButtonLisenter(that, 'attr_'+that.id);
+                    that.createAttrSelect(true)
+                }
+            });
+        }
+
+        this.UNBATCHEDIT = function () {
+            var that = this;
+            layer.close(that.BATCHEDITIndex)
+        }
+        //妯℃澘灞炴�у垎绫绘敞鍏�
+        this.CLASSIFYUSE=function (type,button){
+            var that = this;
+            if (!that.checkTEMPStatus(true)) {
+                return false;
+            }
+            var filter=$(button).attr('isfull')=='true'?'tempAttr_fullScreen_'+that.id:"tempAttr_" + that.id
+            var tempAttrData = layui.table.checkStatus(filter,true).data;
+            if (tempAttrData.length != 1) {
+                webUtil.showErrorMsg('璇烽�夋嫨涓�鏉℃ā鏉垮睘鎬ф暟鎹�');
+                return false;
+            }
+            layui.use('mdm/CodeClassifyClassifyuse', function () {
+                var CodeClassifyClassifyuse = layui['mdm/CodeClassifyClassifyuse'];
+                CodeClassifyClassifyuse.showReferDialog({
+                    formValues:tempAttrData[0],
+                    target: {
+                        setValue: function (thisfilter, name, value, rawValue, isClose, allSelectValues) {
+                            layui.table.changeRecord(filter, tempAttrData[0][layui.table.config.indexName], rawValue)
+                        }
+                    }
+                })
+            })
+        }
+        //妯℃澘灞炴�х粍鍚堣鍒�
+        this.COMPUSE = function (type,button) {
+            var that = this;
+            if (!that.checkTEMPStatus(true)) {
+                return false;
+            }
+            var filter=$(button).attr('isfull')=='true'?'tempAttr_fullScreen_'+that.id:"tempAttr_" + that.id
+            var tempAttrData = layui.table.checkStatus(filter, true).data;
+            if (tempAttrData.length != 1) {
+                webUtil.showErrorMsg("璇烽�夋嫨涓�鏉℃ā鏉垮睘鎬ф暟鎹�");
+                return false;
+            }
+            var allData=layui.table.getData(filter,true);
+            layui.use('formulaEditor', function () {
+                var editor = layui['formulaEditor'];
+                editor.showReferDialog({
+                    formValues:tempAttrData[0],
+                    value: tempAttrData[0].componentrule,
+                    currentVars:allData,
+                    target: {
+                        setValue: function (thisfilter, name, value, rawValue, isClose, allSelectValues) {
+                            tempAttrData[0].componentrule = value;
+                            layui.table.changeRecord(filter, tempAttrData[0][layui.table.config.indexName], tempAttrData[0])
+                        }
+                    }
+                })
+            })
+        }
+        //妯℃澘灞炴�ф晥楠岃鍒�
+        this.VERIFYUSER = function (type,button) {
+            var that = this;
+            if (!that.checkTEMPStatus(true)) {
+                return false;
+            }
+            var filter=$(button).attr('isfull')=='true'?'tempAttr_fullScreen_'+that.id:"tempAttr_" + that.id
+            var tempAttrData = layui.table.checkStatus(filter,true).data;
+            if (tempAttrData.length == 0) {
+                webUtil.showErrorMsg("璇烽�夋嫨妯℃澘灞炴�ф暟鎹�");
+                return false;
+            }
+            layui.use('mdm/CodeClassifyVerifyUser', function () {
+                var CodeClassifyVerifyUser = layui['mdm/CodeClassifyVerifyUser'];
+                CodeClassifyVerifyUser.showReferDialog({
+                    target: {
+                        setValue: function (thisfilter, name, value, rawValue, isClose, allSelectValues) {
+                            layui.each(tempAttrData,function (index,item){
+                                tempAttrData[index].verifyrule=value;
+                                layui.table.changeRecord(filter,item[layui.table.config.indexName],item)
+                            })
+                        }
+                    }
+                })
+            })
+        }
+
+        //妯℃澘灞炴�ф灇涓炬敞鍏�
+        this.ENUMUSE=function (type,button){
+            var that = this;
+            if (!that.checkTEMPStatus(true)) {
+                return false;
+            }
+            var filter=$(button).attr('isfull')=='true'?'tempAttr_fullScreen_'+that.id:"tempAttr_" + that.id
+            var tempAttrData = layui.table.checkStatus(filter,true).data;
+            if (tempAttrData.length != 1) {
+                webUtil.showErrorMsg('璇烽�夋嫨涓�鏉℃ā鏉垮睘鎬ф暟鎹�');
+                return false;
+            }
+            layui.use('mdm/CodeClassifyEnumUse', function () {
+                var CodeClassifyEnumUse = layui['mdm/CodeClassifyEnumUse'];
+
+                CodeClassifyEnumUse.showReferDialog({
+                    value: tempAttrData[0].enumString,
+                    formValues:tempAttrData[0],
+                    target: {
+                        setValue: function (thisfilter, name, value, rawValue, isClose, allSelectValues) {
+                            tempAttrData[0].enumString = value;
+                            layui.table.changeRecord(filter, tempAttrData[0][layui.table.config.indexName], tempAttrData[0])
+                        }
+                    }
+                })
+            })
+        }
+        //妯℃澘灞炴�у垎缁�
+        this.GROUPATTR=function (type,button){
+            var that = this;
+            if (!that.checkTEMPStatus(true)) {
+                return false;
+            }
+            var tablefilter=$(button).attr('isfull')=='true'?'tempAttr_fullScreen_'+that.id:"tempAttr_" + that.id
+            var tempAttrData = layui.table.checkStatus(tablefilter,true).data;
+            if (tempAttrData.length == 0) {
+                webUtil.showErrorMsg("璇烽�夋嫨妯℃澘灞炴�ф暟鎹�");
+                return false;
+            }
+            var filter = "groupattr_" + that.id;
+            var form = layui.form;
+            var content = ['<form id="form_' , filter ,'" lay-filter="' , filter , '" class="layui-form" style="margin-top:15px" ></form>'];
+            var addSaveIndex = $webUtil.dialog({
+                title: '杈撳叆鍒嗙粍鐨勫悕绉�',
+                btn: ['淇濆瓨', '鍙栨秷'],
+                content: content.join(''),
+                area: ['330px', '180px'],
+                targetObject:that,
+                resizing: function (layero) {
+                    form.doResize(filter);
+                },
+                success: function (layero) {
+                    form.addItems(filter,[{
+                            field: 'attributegroup',
+                            text: '灞炴�у垎缁�'
+                        }],
+                        function () {}
+                        , {}
+                        , {});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var formValues = form.getValues(filter,true);
+                        layui.each(tempAttrData,function (index,item){
+                            tempAttrData[index].attributegroup=formValues.attributegroup;
+                            layui.table.changeRecord(tablefilter,item[layui.table.config.indexName],item)
+                        })
+                        layer.close(addSaveIndex)
+                    }
+                }
+            });
+        }
+        //涓婄骇灞炴��
+        this.PARENTATTR=function (type,button){
+            var that = this;
+            if (!that.checkTEMPStatus(true)) {
+                return false;
+            }
+            var filter=$(button).attr('isfull')=='true'?'tempAttr_fullScreen_'+that.id:"tempAttr_" + that.id
+            var tempAttrData = layui.table.checkStatus(filter,true).data;
+            if (tempAttrData.length != 1) {
+                webUtil.showErrorMsg('璇烽�夋嫨涓�鏉℃ā鏉垮睘鎬ф暟鎹�');
+                return false;
+            }
+            layui.use('mdm/CodeClassifyAttribute', function () {
+                var CodeClassifyAttribute = layui['mdm/CodeClassifyAttribute'];
+                CodeClassifyAttribute.showReferDialog({
+                    formValues:tempAttrData[0],
+                    target: {
+                        setValue: function (thisfilter, name, value, rawValue, isClose, allSelectValues) {
+                            layui.table.changeRecord(filter, tempAttrData[0][layui.table.config.indexName], rawValue)
+                        }
+                    }
+                })
+            })
+        }
+        this.UPTempAttr=function (data,filter){
+            var that=this;
+            data.LAY_TABLE_INDEX!=0 && layui.table.moveData( filter,data.LAY_TABLE_INDEX,data.LAY_TABLE_INDEX-1)
+        }
+        this.DOWNTempAttr=function (data,filter){
+            var that=this;
+            data.LAY_TABLE_INDEX!=layui.table.getData(filter).length-1 && layui.table.moveData( filter,data.LAY_TABLE_INDEX,data.LAY_TABLE_INDEX+1)
+        }
+        this.VIEWORDER=function (type,button){
+            var that=this;
+            var filter=$(button).attr('isfull')=='true'?'tempAttr_fullScreen_'+that.id:"tempAttr_" + that.id
+            layui.table.sort(filter,'ordernum', 'asc',true);
+        }
+        this.UPSELECT=function (type,button) {
+            var that = this;
+            if (!that.checkTEMPStatus(true)) {
+                return false;
+            }
+            var filter=$(button).attr('isfull')=='true'?'tempAttr_fullScreen_'+that.id:"tempAttr_" + that.id
+            var tempAttrData = layui.table.checkStatus(filter,true).data;
+            if (tempAttrData.length != 1) {
+                webUtil.showErrorMsg('璇烽�夋嫨涓�鏉℃ā鏉垮睘鎬ф暟鎹�');
+                return false;
+            }
+            that.UPTempAttr(tempAttrData[0],filter);
+        }
+        this.DOWNSELECT=function (type,button){
+            var that=this;
+            if (!that.checkTEMPStatus(true)) {
+                return false;
+            }
+            var filter=$(button).attr('isfull')=='true'?'tempAttr_fullScreen_'+that.id:"tempAttr_" + that.id
+            var tempAttrData = layui.table.checkStatus(filter,true).data;
+            if(tempAttrData.length !=1){
+                webUtil.showErrorMsg('璇烽�夋嫨涓�鏉℃ā鏉垮睘鎬ф暟鎹�');
+                return false;
+            }
+            that.DOWNTempAttr(tempAttrData[0],filter);
+        }
+        //妯℃澘灞炴�у悓姝ュ埌鍏朵粬妯℃澘
+        this.syncAttr=function (type,button){
+            var that=this;
+            if (!that.checkTEMPStatus(true)) {
+                return false;
+            }
+            var filter=$(button).attr('isfull')=='true'?'tempAttr_fullScreen_'+that.id:"tempAttr_" + that.id
+            var tempAttrData = layui.table.checkStatus(filter,true).data;
+            if(tempAttrData.length !=1){
+                webUtil.showErrorMsg('璇烽�夋嫨涓�鏉℃ā鏉垮睘鎬ф暟鎹�');
+                return false;
+            }
+            webUtil.manualAjax('post',that.url.templateAttrController + 'copyto', JSON.stringify({oid: tempAttrData[0].oid}), function (result) {
+                if (result.success) {
+                    webUtil.showMsgFromResult(result, "鍚屾鎴愬姛");
+                } else {
+                    webUtil.showErrorMsg(result.msg);
+                }
+            }, function (xhr, err) {
+                webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+            }, that.backPath);
+        }
+        //缂栫爜鐢宠棰勮
+        this.VIEWCODE=function (type,button) {
+            var that = this;
+            var tempData=that.checkTEMPStatus(false);
+            if(!tempData){
+                return false;
+            }
+            var filter = $(button).attr('isfull') == 'true' ? 'tempAttr_fullScreen_' + that.id : "tempAttr_" + that.id
+            var MdmEngineForm = layui['mdm/MdmEngineForm'];
+            MdmEngineForm.getFormDefine(tempData.oid, that.currentItemOid, function (componentVO) {
+                var formDefineVO = componentVO.formDefineVO;
+                if (formDefineVO) {
+                    filter += "_view_form";
+                    var form = layui.form;
+                    var colCount = MdmEngineForm.getFormCol(formDefineVO);
+                    var items = MdmEngineForm.getFormItemsByVO(formDefineVO, false,colCount);
+                    var hasResemble = (componentVO.resembleTableVO && componentVO.resembleTableVO.cols && componentVO.resembleTableVO.cols.length > 0);
+
+                    var html = [
+                        '<div class="easyui-layout UIContentLayout"  id="easyuiLayout_', filter, '" data-options="fit:true" style="display:block;overflow-y: hidden;">',
+                        '<div data-options="region:\'center\'" style="padding: 5px;">',
+                            '<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form " style="margin-top:5px" ></form>',
+                        '</div>',
+                        '<div data-options="region:\'south\',split:true" style="height:270px;padding-left: 5px;padding-right: 5px;" id="border_', filter, '">',
+                            '<div class="layui-layout-border layui-tab" style="display:block;margin:5px;">',
+                                '<ul class="layui-tab-title tabTitle tab_center_', filter, '">',
+                                    '<li class="layui-this">鐩镐技椤规煡璇�</li>',
+                                '</ul>',
+                                '<ul class="layui-tab-content tabContent">',
+                                    '<li class="layui-tab-item layui-show"  lay-id="resemble">',
+                                        '<table id="resemble_', filter, '" lay-filter="resemble_', filter, '" style="overflow-x:auto;"></table>',
+                                    '</li>',
+                                '</ul>',
+                            '</div>',
+                        '</div>',
+                        '</div>'
+                    ]
+                    if(!hasResemble){
+                        html = ['<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form " style="margin-top:15px" ></form>']
+                    }
+                    var dialogIndex = webUtil.dialog({
+                        title: "缂栫爜鐢宠棰勮",
+                        btn: !hasResemble?['鏁堥獙', '鍙栨秷']:['鏁堥獙', '鍙栨秷', '鐩镐技椤规煡璇�'],
+                        fullScreen: true,
+                        content: html.join(''),
+                        resizing: function (layero) {
+                            form.doResize(filter);
+                        },
+                        success: function (layero) {
+                            if(!!hasResemble){
+                                var easyuiLayout = $('#easyuiLayout_' + filter)
+                                easyuiLayout.css({height: easyuiLayout.parents('.layui-layer-content').height()-10, width: easyuiLayout.parents('.layui-layer-content').width()-10})
+                                easyuiLayout.parent().parent().css({padding: '5px'})
+                                easyuiLayout.layout();
+                                MdmEngineForm.initResembleTable(componentVO, filter);
+                            }
+                            form.addItems(filter, items,
+                                function () {
+                                }, {}, {defaultColumnOneRow: colCount, labelWidth: 160});
+                        },
+                        yes: function (layero) {
+                            if (form.validata(filter)) {
+                                var values = form.getDefaultValues(filter, true);
+                                var datas = {
+                                    codeClassifyOid: that.currentItemOid,
+                                    templateOid: tempData.oid,
+                                    codeRuleOid: that.codeRuleOid,
+                                    data: values.otherValue
+                                }
+                                $.extend(datas, values.defaultValues);
+                                webUtil.manualAjax('post', 'mdmEngineController/previewCompRule', JSON.stringify(datas), function (res) {
+                                    if (res.success) {
+                                        form.setValues(res.obj, filter);
+                                        webUtil.showMsgFromResult(res, '鏁堥獙閫氳繃');
+                                    } else {
+                                        webUtil.showErrorMsg(res.msg);
+                                    }
+                                }, function (xhr, err) {
+                                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                                }, that.backPath);
+                            }
+                        },
+                        btn2: function (layero) {
+                            layer.close(dialogIndex);
+                        },
+                        btn3: function (layero) {
+                            if (form.validata(filter)) {
+                                webUtil.get('mdmEngineController/getCodeRuleByClassifyOid', {codeClassifyOid: that.currentItemOid}, function (result) {
+                                    if (!result.success) {
+                                        $webUtil.showErrorMsg(result.msg);
+                                    } else {
+                                        var values = form.getDefaultValues(filter, true);
+                                        that.codeRuleOid=result.obj.oid;
+                                        var datas = {
+                                            codeClassifyOid: that.currentItemOid,
+                                            templateOid: tempData.oid,
+                                            codeRuleOid: result.obj.oid,
+                                            data: values.otherValue
+                                        }
+                                        $.extend(datas, values.defaultValues);
+                                        webUtil.manualAjax('post', 'mdmEngineController/resembleQuery', JSON.stringify(datas), function (res) {
+                                            if (res.success) {
+                                                layui.table.reload("resemble_" + filter, {
+                                                    data: res.data
+                                                });
+                                            } else {
+                                                webUtil.showErrorMsg(res.msg);
+                                            }
+                                        }, function (xhr, err) {
+                                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                                        }, that.backPath);
+                                    }
+                                });
+                            }
+                            return false;
+                        }
+                    });
+                }
+            });
+        }
+        this.refresh = function (type,button) {
+            var that = this;
+            var filter=$(button).attr('isfull')=='true'?'tempAttr_fullScreen_'+that.id:"tempAttr_" + that.id
+            that.getTempAttrData(filter);
+
+        };
+
+        this.refreshTEMP = function () {
+            var that = this;
+            layui.table.reload("temp_" + that.id);
+        };
+        this.ADVQUERY = function () {
+            var that = this;
+            if (!that.serinorQueryInstance) {
+                var dynamicCondition = layui.dynamicCondition;
+                $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar' + that.id + '" class="layui-inline"></div>');
+                that.checkTempAttrColumns();
+                that.serinorQueryInstance = dynamicCondition.create({
+                    fields: that.tempAttrdataFields//鏌ヨ瀛楁
+                    , tableId: "tempAttr_" + that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                    , type: "complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                    , queryCallBack: function (requestData) {//鏌ヨ涔嬪悗鐨刢allback
+
+                    }
+                });
+            }
+            that.serinorQueryInstance.open();
+        };
+        this.ADVQUERYTEMP = function () {
+            var that = this;
+            if (!that.serinorQueryInstance) {
+                var dynamicCondition = layui.dynamicCondition;
+                $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar' + that.id + '" class="layui-inline"></div>');
+                that.checkTempColumns();
+                that.serinorQueryInstance = dynamicCondition.create({
+                    fields: that.tempdataFields//鏌ヨ瀛楁
+                    , tableId: "temp_" + that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                    , type: "complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                    , queryCallBack: function (requestData) {//鏌ヨ涔嬪悗鐨刢allback
+
+                    }
+                });
+            }
+            that.serinorQueryInstance.open();
+        };
+        this.ADDTEMP = function () {
+            var that = this;
+            if (webUtil.isNull(that.currentItemOid)) {
+                webUtil.showErrorMsg("璇峰厛浠庢爲涓婇�夋嫨涓�鏉℃暟鎹�");
+                return false;
+            }
+            that.addOrEditTEMP(true,false);
+        };
+        this.EDITTEMP = function () {
+            var that = this;
+            var tempData=that.checkTEMPStatus(true,'鍙兘淇敼缂栬緫涓殑鏁版嵁');
+            if(!tempData){
+                return false;
+            }
+            that.addOrEditTEMP(false,false, tempData);
+        };
+        this.addOrEditTEMP = function (add,clone, data) {
+            var that = this;
+
+            var form = layui.form;
+            var filter = "form_" + that.id;
+            var addSaveIndex = webUtil.dialog({
+                title: add ?  (clone?"鍏嬮殕妯℃澘":"娣诲姞妯℃澘") : '淇敼妯℃澘',
+                btn: ['淇濆瓨', '鍙栨秷'],
+                content: '<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                resizing: function (layero) {
+                    form.doResize(filter);
+                },
+                success: function (layero, layerIndex, classP) {
+                    form.addItems(filter, that.getFormTempItems(false),
+                        function () {
+                            if (!add) {
+                                form.setValues(data, filter);
+                            } else {
+                                var defaultValues = {};
+                                if (that.currentItemAttributes) {
+                                    defaultValues["codeClassifyOid"] = that.currentItemOid;
+                                    defaultValues["codeClassifyOidname"] = that.currentItemAttributes.name;
+                                }
+                                if(clone){
+                                    defaultValues=$.extend(data,defaultValues)
+                                    //defaultValues.oid='';
+                                    defaultValues["codeclassifyoid"] = that.currentItemOid;
+                                    defaultValues["codeclassifyoidName"] = that.currentItemAttributes.name;
+                                }
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues, filter);
+                            }
+
+                            webUtil.relocationOpen(classP)
+                        }, {}, {defaultColumnOneRow: 2});
+                },
+                yes: function (layero) {
+                    if (form.validata(filter)) {
+                        var values = form.getValues(filter, true);
+                        var url = that.url.tempController + (add ? (clone?'copy':that.url.addSave) : that.url.editSave);
+                        webUtil.manualAjax(add ? 'post' : 'put', url, JSON.stringify(values), function (result) {
+                            if (result.success) {
+                                webUtil.showMsgFromResult(result, (add ? (clone?"鍏嬮殕鎴愬姛":"娣诲姞鎴愬姛") : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refreshTEMP();
+                            } else {
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        }, function (xhr, err) {
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        }, that.backPath);
+                    }
+                },
+                btn2: function (layero) {
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+
+        this.getFormTempItems = function (onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [{
+                field: 'id',
+                title: '妯℃澘缂栧彿',
+                required: true
+            }, {
+                field: 'name',
+                title: '妯℃澘鍚嶇О',
+                required: true
+            }, {
+                field: 'description',
+                title: '鎻忚堪',
+                inputWidth: 475,
+                type: 'textarea'
+            }];
+        };
+
+        this.DELTEMP = function () {
+            var that = this;
+            var tempData=that.checkTEMPStatus(true,'鍙兘鍒犻櫎缂栬緫涓殑鏁版嵁');
+            if(!tempData){
+                return false;
+            }
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!", function () {
+                webUtil.deleteRequest(that.url.tempController + that.url.deleteUrl, {
+                    oid: tempData.oid,
+                    ts: tempData.ts
+                }, function (result) {
+                    if (result.success) {
+                        webUtil.showMsgFromResult(result, "鍒犻櫎鎴愬姛");
+                        that.refreshTEMP();
+                    } else {
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                }, function (xhr, err) {
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                }, that.backPath);
+            });
+        };
+        //妯℃澘鍗囩増
+        this.UPTEMP = function () {
+            var that = this;
+            var checkData = layui.table.checkStatus("temp_" + that.id).data;
+            if (checkData.length != 1) {
+                webUtil.showErrorMsg('璇烽�夋嫨涓�鏉℃暟鎹�');
+                return false;
+            }
+            that.doUPTEMP(checkData[0].oid, checkData[0].ts)
+        }
+        this.doUPTEMP = function (oid, ts) {
+            var that = this;
+            webUtil.showConfirmMsg("鏄惁杩涜鍗囩増锛�", function () {
+                webUtil.manualAjax('post',that.url.tempController + 'upgrade',JSON.stringify({oid: oid, ts: ts}) , function (result) {
+                    if (result.success) {
+                        webUtil.showMsgFromResult(result, "鍗囩増鎴愬姛");
+                        that.refreshTEMP();
+                    } else {
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                }, function (xhr, err) {
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                }, that.backPath);
+            });
+        }
+        //妯℃澘鍋滅敤
+        this.DISABLETEMP = function () {
+            var that = this;
+            var checkData = layui.table.checkStatus("temp_" + that.id).data;
+            if (checkData.length != 1) {
+                webUtil.showErrorMsg('璇烽�夋嫨涓�鏉℃暟鎹�');
+                return false;
+            }
+            webUtil.showConfirmMsg("妯℃澘鍙湁鍙戝竷鐘舵�佹墠鑳借浣跨敤锛屾槸鍚︾‘瀹氬仠鐢紵", function () {
+                that.disableOrEnableTEMP(false, checkData[0].oid, checkData[0].ts);
+            });
+
+        };
+        //妯℃澘鍚敤
+        this.ENABLETEMP = function () {
+            var that = this;
+            var checkData = layui.table.checkStatus("temp_" + that.id).data;
+            if (checkData.length != 1) {
+                webUtil.showErrorMsg('璇烽�夋嫨涓�鏉℃暟鎹�');
+                return false;
+            }
+            webUtil.showConfirmMsg("鏄惁纭畾鍚敤/鍙戝竷杩欎釜妯℃澘锛屾ā鏉垮彧鏈夊彂甯冪姸鎬佹墠鑳借浣跨敤锛屾槸鍚︾户缁紵", function () {
+                that.disableOrEnableTEMP(true, checkData[0].oid, checkData[0].ts);
+            });
+
+        };
+        //鍋滅敤鍚敤妯℃澘
+        this.disableOrEnableTEMP = function (enable, oid, ts) {
+            var that = this;
+            webUtil.post( that.url.tempController + (enable ? that.url.enableData : that.url.disableData), {
+                oid: oid,
+                ts: ts
+            }, function (result) {
+                if (result.success) {
+                    webUtil.showMsgFromResult(result, (enable ? '鍚敤鎴愬姛' : '鍋滅敤鎴愬姛'));
+                    that.refreshTEMP();
+                } else {
+                    webUtil.showErrorMsg(result.msg);
+                }
+            }, function (xhr, err) {
+                webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+            }, that.backPath);
+        };
+        //浠庡叾浠栨ā鏉垮厠闅�
+        this.cloneTEMP = function () {
+            var that=this;
+            if (webUtil.isNull(that.currentItemOid)) {
+                webUtil.showErrorMsg("璇峰厛浠嶽涓婚搴撳垎绫汇�戞爲涓婇�夋嫨涓�鏉℃暟鎹�");
+                return false;
+            }
+            var referConfig = {
+                filter: "clone_" + that.id,
+                name: 'temp',
+                title: '鍏嬮殕妯℃澘',
+                options: {
+                    isMuti: false
+                },
+                isMuti: false,
+                target: {
+                    setValue: function (filter, name, value, rawValue, isClose, allSelectValues) {
+                        that.addOrEditTEMP(true, true, allSelectValues[0])
+                    }
+                },
+                value: '',
+                text: ''
+            };
+            layui['mdm/refer/CodeClassTemplateRefer'].showReferDialog(referConfig);
+        };
+        this.ADDPROCESS = function (){
+            var that=this;
+            if (webUtil.isNull(that.currentItemOid)) {
+                webUtil.showErrorMsg("璇峰厛浠嶽涓婚搴撳垎绫汇�戞爲涓婇�夋嫨涓�鏉℃暟鎹�");
+                return false;
+            }
+            var tempData=that.checkTEMPStatus(true);
+            if(!tempData){
+                return false;
+            }
+            that.addOrEditProcess(true,tempData.oid,null);
+        };
+        this.addOrEditProcess = function (add,tempOid,oid){
+            var that = this;
+            var form = layui.form;
+            var filter ="form_process" + that.id;
+            var addSaveIndex =webUtil.dialog({
+                title:add?'娣诲姞浣跨敤鐨勬祦绋嬫ā鏉�':'淇敼浣跨敤鐨勬祦绋嬫ā鏉�',
+                btn:['淇濆瓨','鍙栨秷'],
+                area:['800px','400px'],
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getProcessFormItems(tempOid,false),
+                        function () {
+                            if(!add){
+                                form.load(filter,{
+                                    backPath:that.backPath,
+                                    url:that.url.processLinkController + that.url.processLinkGetObjectByOid,
+                                    method:'get',
+                                    params:{
+                                        oid:oid
+                                    }
+                                });
+                            }else{
+                                var defaultValues = {
+                                    codeClassifyOid:that.currentItemOid,
+                                    classifyTemplateOid:webUtil.getOidFromGrid("temp_" + that.id,false,false)
+                                };
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+                            form.on('select('+filter+')',function (data){
+                                if(data.name=='id'){
+                                    form.setValues({
+                                        processVersion: data.rowData[0].version
+                                    },filter,true);
+                                }
+                            })
+                        }, {}, {defaultColumnOneRow: 2,labelWidth:150});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        var url = that.url.processLinkController + (add?that.url.processLinkAddSave:that.url.processLinkEditSave);
+                        webUtil.manualAjax(add?'post':'put',url,JSON.stringify(values),function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "鍏宠仈娴佺▼妯℃澘鎴愬姛" : "淇敼鍏宠仈鐨勬祦绋嬫ā鏉挎垚鍔�"));
+                                layer.close(addSaveIndex);
+                                that.refreshPROCESS();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.getProcessFormItems = function (tempOid,onlyShow){
+            return [
+                {
+                    field: 'id',
+                    title: '娴佺▼妯℃澘',
+                    required: true,
+                    type: 'refer',
+                    showField: 'name',
+                    referConfig: {
+                        type:'refer/WfProcessTemplateRefer'
+                    },
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,{
+                    field: 'processVersion',
+                    title: '妯℃澘鐨勭増鏈�',
+                    required: true,
+                    readOnly: true
+                }, {
+                    field: 'codeprocessuse',
+                    title: '娴佺▼妯℃澘鐢ㄩ��',
+                    required: true,
+                    type: 'combox',
+                    comboxKey: 'codeClassifyProcessUse',
+                    defaultValue: "code_cls_flow_use_order",
+                    readOnly: onlyShow
+                }, {
+                    field: 'codeTempAttrOidArr',
+                    title: '娴佺▼鏍戞樉绀哄睘鎬�',
+                    required: true,
+                    showField: 'codeTempAttrOidArrName',
+                    type: 'refer',
+                    referConfig: {
+                        type:'mdm/refer/CodeClassTemplateAttrRefer',
+                        displayType:null,
+                        isMuti: true,
+                        valueField:'id',
+                        where:{'conditionMap["classifytemplateoid"]':tempOid}
+                    },
+                    defaultValue: ""
+                }];
+        };
+        this.EDITPROCESS = function (){
+            var that = this;
+            var tempData=that.checkTEMPStatus(true);
+            if(!tempData){
+                return false;
+            }
+            var oid = webUtil.getOidFromGrid("process_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var classifyTemplateOid = webUtil.getOidFromGrid("process_" + that.id,true,true,'classifyTemplateOid');
+            this.addOrEditProcess(false,classifyTemplateOid,oid);
+        };
+        this.DELPROCESS = function (){
+            var that = this;
+            var tempData=that.checkTEMPStatus(true);
+            if(!tempData){
+                return false;
+            }
+            var oid = webUtil.getOidFromGrid("process_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts= webUtil.getOidFromGrid("process_" +that.id,false,false,"ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                webUtil.deleteRequest(that.url.processLinkController + that.url.processLinkDeleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refreshPROCESS();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+        this.refreshPROCESS = function (){
+            var that = this;
+            layui.table.reload("process_" + that.id);
+        };
+        this.ADDPHASE = function (){
+            this.addOrEditPhase(true,null);
+        };
+        this.EDITPHASE = function (){
+            var that = this;
+            var oid = webUtil.getOidFromGrid('phase_' + that.id,true,true);
+            that.addOrEditPhase(false,oid,false);
+        };
+        this.DELPHASE = function (){
+            var that = this;
+            var tempData=that.checkTEMPStatus(true);
+            if(!tempData){
+                return false;
+            }
+            var oid = webUtil.getOidFromGrid('phase_' + that.id,true,true);
+            var ts= webUtil.getOidFromGrid("phase_" +that.id,false,false,"ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛�",function () {
+                webUtil.deleteRequest(that.url.phaseController + that.url.phaseDeleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refreshPHASE();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+        this.refreshPHASE = function (){
+            var that = this;
+            layui.table.reload("phase_" + that.id);
+        };
+        this.addOrEditPhase = function (add,oid,onlyView){
+            var that = this;
+            var form = layui.form;
+            var filter ="form_phase" + that.id;
+            var tempData=that.checkTEMPStatus(true);
+            if(!tempData){
+                return false;
+            }
+            var tempOid=tempData.oid;
+            var addSaveIndex =webUtil.dialog({
+                title:(add?'娣诲姞妯℃澘闃舵':(onlyView?'鏌ョ湅妯℃澘闃舵':'淇敼妯℃澘闃舵')),
+                btn:(onlyView?[]:['淇濆瓨','鍙栨秷']),
+               area:['1000px','700px'],
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form><hr class="layui-border-blue">' +
+                    '<div id="phase_used_'+filter+'" style="margin: 0 5px;"></div>',
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getPhaseFormItems(false),
+                        function () {
+                            if(!add){
+                                form.load(filter,{
+                                    backPath:that.backPath,
+                                    url:that.url.phaseController + that.url.phaseGetObjectByOid,
+                                    method:'get',
+                                    params:{
+                                        oid:oid
+                                    }
+                                });
+                            }else{
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+                            //琛ㄥ崟鎴愬姛鍚庡啀鍔犺浇涓嬮潰鐨勫唴瀹�
+                            layui.transferTable.render({
+                                elem:'#phase_used_'+filter,
+                                id:'phase_used_'+filter
+                                ,leftTable:{
+                                    backPath:that.backPath
+                                    ,url: that.url.phaseController + that.url.phaseUnUsedAttribute
+                                    ,cols: [[layui.table.getIndexColumn(),layui.table.getCheckColumn(),
+                                        {
+                                            field:'id',
+                                            title:'灞炴�х紪鍙�',
+                                            width:120,
+                                            sort:true
+                                        },{
+                                            field: 'name',
+                                            title: '灞炴�у悕绉�',
+                                            width: 150,
+                                            sort: true
+                                        },{
+                                            field:'attributegroup',
+                                            title: '灞炴�у垎缁�',
+                                            width: 90,
+                                            sort: true
+                                        }
+
+                                    ]]
+                                    ,limit:-1
+                                    ,id:'transferTable_1_1'
+                                    ,width:450
+                                    ,height:500
+                                    ,extraParams:{'conditionMap["classifyTemplateOid"]':tempOid,codePhaseOid:oid}
+                                }
+                                ,rightTable:{
+                                    backPath:that.backPath
+                                    ,url: that.url.phaseController + that.url.phaseUsedAttribute
+                                    ,cols: [[layui.table.getIndexColumn(),layui.table.getCheckColumn(),
+                                        {
+                                            field:'id',
+                                            title:'灞炴�х紪鍙�',
+                                            width:120
+                                        },{
+                                            field: 'name',
+                                            title: '灞炴�у悕绉�',
+                                            width: 150
+                                        },{
+                                            field:'attributegroup',
+                                            title: '灞炴�у垎缁�',
+                                            width: 90,
+                                            sort: true
+                                        }
+                                    ]]
+                                    ,id:'transferTable_2_2',
+                                    limit:-1
+                                    ,width:450
+                                    ,height:500
+                                    ,extraParams: {"conditionMap['codePhaseOid']":oid}
+                                }
+                            })
+                        }, {}, {defaultColumnOneRow: 3});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        var linkAttrs = layui.transferTable.getData('phase_used_'+filter);
+                        if(!linkAttrs || linkAttrs.length == 0){
+                            webUtil.showErrorMsg("璇烽�夋嫨闃舵涓墍闇�鐨勫睘鎬�");
+                            return false;
+                        }
+                        values.attributes = linkAttrs;
+                        values.codeClassifyTemplateOid = tempOid;
+                        var url = that.url.phaseController + (add?that.url.phaseAddSave:that.url.phaseEditSave);
+                        webUtil.manualAjax(add?'post':'put',url,JSON.stringify(values),function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refreshPHASE();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.getPhaseFormItems = function (onlyShow){
+            return [
+                {
+                    field: 'id',
+                    title: '闃舵缂栧彿',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,  {
+
+                    field: 'name',
+                    title: '闃舵鍚嶇О',
+                    defaultValue:"",
+                    required:true,
+                    readOnly:onlyShow
+                },    {
+                    field: 'description',
+                    title: '鎻忚堪',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                }];
+        };
+        this.refreshBUTTON = function () {
+            var that = this;
+            layui.table.reload("button_" + that.id);
+        };
+        this.ADDBUTTON = function (){
+            this.addOrEditButton(true,null);
+        };
+        this.EDITBUTTON = function (){
+            var that = this;
+            var oid = webUtil.getOidFromGrid('button_' + that.id,true,true);
+            that.addOrEditButton(false,oid);
+        };
+        this.DELBUTTON = function (){
+            var that = this;
+            var tempData=that.checkTEMPStatus(true);
+            if(!tempData){
+                return false;
+            }
+            var oid = webUtil.getOidFromGrid('button_' + that.id,true,true);
+            var ts= webUtil.getOidFromGrid("button_" +that.id,false,false,"ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛�",function () {
+                webUtil.deleteRequest(that.url.buttonController + that.url.buttonDeleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refreshBUTTON();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+        this.addOrEditButton = function (add,oid){
+            var that = this;
+            var form = layui.form;
+            var filter ="form_button" + that.id;
+            var tempData=that.checkTEMPStatus(true);
+            if(!tempData){
+                return false;
+            }
+            var tempOid=tempData.oid;
+            var addSaveIndex =webUtil.dialog({
+                title:(add?'娣诲姞鎵╁睍鎸夐挳':'淇敼鎵╁睍鎸夐挳'),
+                btn:['淇濆瓨','鍙栨秷'],
+                area:['800px','400px'],
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getButtonFormItems(false),
+                        function () {
+                            if(!add){
+                                form.load(filter,{
+                                    backPath:that.backPath,
+                                    url:that.url.buttonController + that.url.buttonGetObjectByOid,
+                                    method:'get',
+                                    params:{
+                                        oid:oid
+                                    }
+                                });
+                            }else{
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+                            form.on('select('+filter+')',function (data){
+                                if(data.name=='classifybuttonoid'){
+                                    form.setValues({
+                                        id: data.rowData[0].id,
+                                        name:data.rowData[0].name
+                                    },filter,true);
+                                }
+                            });
+                        }, {}, {defaultColumnOneRow: 2});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        values.classifyTemplateOid = tempOid;
+                        var url = that.url.buttonController + (add?that.url.buttonAddSave:that.url.buttonEditSave);
+                        webUtil.manualAjax(add?'post':'put',url,JSON.stringify(values),function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refreshBUTTON();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.getButtonFormItems = function (onlyShow){
+            return [ {
+                    field: 'classifybuttonoid',
+                    title: '鎵�灞炴寜閽�',
+                    required: true,
+                    type: 'refer',
+                    showField: 'classifybuttonoidName',
+                    referConfig: {
+                        type:'default',
+                        referBo:'codebutton'
+                    },
+                    defaultValue:"",
+                    readOnly:onlyShow
+                }, {
+                    field: 'id',
+                    title: '鎸夐挳鏍囪瘑',
+                    hidden: true
+                },{
+                    field: 'name',
+                    title: '鎸夐挳鍚嶇О',
+                    hidden: true
+                } ,{
+                    field: 'buttonuse',
+                    title: '鎸夐挳鐢ㄩ��',
+                    type: 'combox',
+                    defaultValue:"",
+                    comboxKey:'codeTemplateButtonUse',
+                    readOnly:onlyShow
+                } ];
+        };
+        this.EXPORTClassify = function (){
+            var that = this;
+            //瀵煎嚭鍒嗙被
+            if(!that.currentItemOid){
+                $webUtil.showErrorMsg("璇峰厛閫夋嫨瑕佸鍑虹殑涓婚搴撳垎绫�");
+                return false;
+            }
+            $webUtil.fileDownload(that.backPath + that.url.controller + "exportClassify?oid=" + that.currentItemOid);
+        };
+        this.IMPORTClassify=function (){
+            var that = this;
+            var filter = "classify_" + that.id;
+            var form = layui.form;
+            var content = ['<form id="', filter, '" lay-filter="', filter, '" class="layui-form" style="margin:15px 30px 15px 0;" >' +
+            '</form>',
+                '<button type="button" className="layui-btn" id="upload_button_' , filter ,
+                '" style="margin:5px 50px;display: block;float:left;"><i className="layui-icon layui-icon-upload"></i>娴忚鏂囦欢</button>'
+            ].join('');
+            var addSaveIndex = $webUtil.dialog({
+                title: '涓婚搴撳垎绫诲鍏�',
+                btn: ['涓嬭浇瀵煎叆妯℃澘', '鍏抽棴'],
+                content: content,
+                area: ['800px', '600px'],
+                success: function (layero) {
+                    //涓婚搴撳垎绫讳笉瀵艰鍒�
+                    var items = [{
+                        type: 'line',
+                        field: 'tips',
+                        text: '瀵煎叆鎻愮ず'
+                    }, {
+                        field: 'keyAttrTips',
+                        text: '1.绾㈣壊瀛椾綋琛ㄧず蹇呰緭椤�',
+                        type: 'label',
+                        labelWidth: 600,
+                        labelStyle: 'margin-left:50px',
+                        useAllWidth: true
+                    }, {
+                        field: 'classifyTips',
+                        text: '2.鍒嗙被鐨勮矾寰勯渶瑕佺敤#鍒嗛殧',
+                        type: 'label',
+                        labelWidth: 600,
+                        labelStyle: 'margin-left:50px',
+                        useAllWidth: true
+                    },{
+                        field: 'requiredTips',
+                        text:'3.姣忔浠呰兘鏈�澶氬鍏�10000鏉℃暟鎹�',
+                        type: 'label',
+                        labelWidth:600,
+                        labelStyle:'margin-left:50px',
+                        useAllWidth:true
+                    }, {
+                        type: 'line',
+                        field: 'excelFile',
+                        text: 'excel鏂囦欢锛岄�夋嫨鏂囦欢鍚庝細鑷姩涓婁紶'
+                    }];
+                    form.addItems(filter, items, function () {
+                    }, {}, {defaultColumnOneRow: 1, labelWidth: 160});
+                    var upload = layui.upload;
+                    //鎵ц瀹炰緥
+                    var uploadInst = upload.render({
+                        elem: '#upload_button_' + filter //缁戝畾鍏冪礌
+                        , accept: 'file'
+                        , acceptMime: 'file/*'
+                        , exts: 'xls|xlsx'
+                        , url: that.backPath + that.url.controller + 'importClassify'//涓婁紶鎺ュ彛
+                        , auto: true
+                        , before: function (obj) {
+                        }
+                        , done: function (result) {//涓嶉渶瑕佽緭鍏ュ唴瀹癸紝鍥犳娌℃湁before
+                            if (result.success) {
+                                layer.close(addSaveIndex);
+                                $webUtil.showMsgFromResult(result, "瀵煎叆鎴愬姛锛�");
+                                that.refreshClassify();
+                            }else{
+                                //闇�瑕佸幓涓嬭浇閿欒淇℃伅
+                                $webUtil.fileDownload(that.backPath + that.url.controller + "downloadErrorFile?uuid=" + result.obj,null,'瀵煎叆閿欒锛岃鏌ョ湅涓嬭浇鐨勩�愰敊璇俊鎭�戞枃浠�');
+                            }
+                        }
+                        , error: function () {
+                            //璇锋眰寮傚父鍥炶皟
+                            $webUtil.showErrorMsg("涓婁紶寮傚父,鏈嶅姟绔嚭閿欎簡");
+                        }
+                    });
+                },
+                yes: function (layero) {
+                    $webUtil.fileDownload(that.backPath + that.url.controller + "downloadImportExcel");
+                },
+                btn2: function (layero) {
+                    layer.close(addSaveIndex);
+                }
+            });
+        }
+    }
+
+    var cs = new Class();
+    exports(cs.MODELNAME, cs);
+});
diff --git a/Source/platformProject/platform2022UI/vciweb/mdm/CodeClassifyAttribute.js b/Source/platformProject/platform2022UI/vciweb/mdm/CodeClassifyAttribute.js
new file mode 100644
index 0000000..56ae9f2
--- /dev/null
+++ b/Source/platformProject/platform2022UI/vciweb/mdm/CodeClassifyAttribute.js
@@ -0,0 +1,572 @@
+/**
+ * 涓婚搴撳垎绫绘墍闇�灞炴�ч泦椤甸潰
+ * @author weidy
+ * @date 2022-01-24
+ */
+layui.define(['layer','element','form','table','dynamicCondition' ],function(exports){
+        var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "mdm/CodeClassifyAttribute";
+        this.moduleKey = "CodeClassifyAttribute";
+        this.backPath =  configData.compatibility? path:configData.mdmService;
+        this.url = {
+            controller:'codeClassifyAttrController/',
+            dataGrid:'gridCodeClassifyAttribute',
+            addSave:'addSave',
+            editSave:'editSave',
+            deleteUrl:'deleteData',
+            getObjectByOid:'getObjectByOid'
+        };
+        this.getContent=function(){
+            var that = this;
+            var html = "";
+            html = [
+                '<div class="layui-layout" style="display:block;overflow-y: hidden">',
+                    '<div class="layui-layout-border" style="display:block;margin-top:0px; " id="border_',that.id,'">',
+                        '<div class="layui-center" style="overflow-y:auto;">',
+                            that.getToolbarHtml(),
+                            '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                        '</div>',
+                    '</div>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.createSearchHtml({id:"缂栧彿",name:"鍚嶇О"} ,$("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+        };
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            that.initMainTable();
+            that.createSearchHtml();
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var tableWidth = $("#border_" + that.id).width()-225;
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                width:tableWidth,
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                method:'get',
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'EDIT'){
+                                that.addOrEdit(false,data.oid);
+                            }
+                        });
+                    }else{
+                        if(total>0) {
+                            table.selectRecord('table_' + that.id, {index:0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                }
+            };
+            if(parentFieldName){
+                options.treeConfig = {
+                    treepid:parentFieldName,
+                    treeid:'id',
+                    showField:'name'
+                };
+            }
+            table.render(options);
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),
+                    {
+                        title: '涓婚搴撳垎绫讳富閿�',
+                        field: 'codeclassifyoidName',
+                        sort:true,
+                        sortField:'codeclassifyoid',
+                        type:'refer',
+                        referConfig: {
+                            referBo:'codeclassify'
+                        },
+                        width: 150
+                    },
+                    {
+                        field:'options',
+                        title:'鎿嶄綔',
+                        templet:function(d){
+                            return '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>';
+                        }
+                    }];
+            }
+        };
+
+        this.getFormItems = function(onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [
+                {
+                    field: 'codeclassifyoid',
+                    title: '涓婚搴撳垎绫讳富閿�',
+                    required: true,
+                    type: 'refer',
+                    showField: 'codeclassifyoidName',
+                    referConfig: {
+                        referBo:'codeclassify'
+                    },
+                    defaultValue:"",
+                    readOnly:onlyShow
+                }             ];
+        };
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            that.addOrEdit(false,oid);
+        };
+        this.addOrEdit = function(add,oid) {
+            var that = this;
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var addSaveIndex =webUtil.dialog({
+                title:add?'娣诲姞涓婚搴撳垎绫绘墍闇�灞炴�ч泦':'淇敼涓婚搴撳垎绫绘墍闇�灞炴�ч泦',
+                btn:['淇濆瓨','鍙栨秷'],
+                skin:'layui-layer-lan',
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getFormItems(false),
+                        function () {
+                            if(!add){
+                                form.load(filter,{
+                                    backPath:that.backPath,
+                                    url:that.url.controller + that.url.getObjectByOid,
+                                    method:'get',
+                                    params:{
+                                        oid:oid
+                                    }
+                                });
+                            }else{
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+                        }, {}, {defaultColumnOneRow: 2});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        var url = that.url.controller + (add?that.url.addSave:that.url.editSave);
+                        webUtil.manualAjax(add?'post':'put',url,JSON.stringify(values),function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts= webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+        this.checkReferColumns=function (){
+            var that = this;
+            var table = layui.table;
+            if (that.tempAttrColumns == null || that.tempAttrColumns.length == 0) {
+                that.tempAttrColumns = [table.getIndexColumn(), table.getRadioColumn(), {
+                    field: 'id',
+                    title: '灞炴�ц嫳鏂囩紪鍙�',
+                    sort: true,
+                    width: 100
+                }, {
+                    field: 'name',
+                    title: '灞炴�т腑鏂囧悕绉�',
+                    sort: true,
+                    width: 130
+                },{
+                        title: '灞炴�у垎缁�',
+                        field: 'attributegroup',
+                        sort: true,
+                        width: 90
+                    },{
+                        title: '绫诲瀷',
+                        field: 'attributeDataTypeText',
+                        sort: true,
+                        width: 60
+                    },{
+                        title: '鍒楄〃瀹藉害',
+                        field: 'attrTableWidth',
+                        width: 80
+                    },
+                    {
+                        title: '鍏抽敭灞炴��',
+                        field: 'keyattrflag',
+                        width: 65,
+                        templet: function (d) {
+                            return webUtil.formateBoolean(d.keyattrflag)
+                        }
+                    },
+                    {
+                        title: '鏌ヨ灞炴��',
+                        field: 'queryattrflag',
+                        width: 65,
+                        templet: function (d) {
+                            return webUtil.formateBoolean(d.queryattrflag)
+                        }
+                    },
+                    {
+                        title: '楂樼骇鏌ヨ灞炴��',
+                        field: 'seniorqueryattrflag',
+                        width: 85,
+                        templet: function (d) {
+                            return webUtil.formateBoolean(d.seniorqueryattrflag)
+                        }
+                    },
+                    {
+                        title: '鐩镐技鏌ラ噸灞炴��',
+                        field: 'samerepeatattrflag',
+                        width: 85,
+                        templet: function (d) {
+                            return webUtil.formateBoolean(d.samerepeatattrflag)
+                        }
+                    },
+                    {
+                        title: '涓�缁寸爜',
+                        field: 'barcodeflag',
+                        width: 65,
+                        templet: function (d) {
+                            return webUtil.formateBoolean(d.barcodeflag)
+                        }
+                    },
+                    {
+                        title: '浜岀淮鐮�',
+                        field: 'qrcodeflag',
+                        width: 65,
+                        templet: function (d) {
+                            return webUtil.formateBoolean(d.qrcodeflag)
+                        }
+                    },
+                    {
+                        title: '蹇呰緭',
+                        field: 'requireflag',
+                        width: 65,
+                        templet: function (d) {
+                            return webUtil.formateBoolean(d.requireflag)
+                        }
+                    },
+                    {
+                        title: '琛ㄥ崟鏄剧ず',
+                        field: 'formdisplayflag',
+                        width: 65,
+                        templet: function (d) {
+                            return webUtil.formateBoolean(d.formdisplayflag)
+                        }
+                    },
+                    {
+                        title: '鍒楄〃鏄剧ず',
+                        field: 'tabledisplayflag',
+                        width: 65,
+                        templet: function (d) {
+                            return webUtil.formateBoolean(d.tabledisplayflag)
+                        }
+                    },
+                    {
+                        title: '鍙',
+                        field: 'readonlyflag',
+                        width: 65,
+                        templet: function (d) {
+                            return webUtil.formateBoolean(d.readonlyflag)
+                        }
+                    },
+                    {
+                        title: '鍒楄〃鎺掑簭',
+                        field: 'sortattrflag',
+                        width: 65,
+                        templet: function (d) {
+                            return webUtil.formateBoolean(d.sortattrflag)
+                        }
+                    },
+                    {
+                        title: '澶氳鏂囨湰',
+                        field: 'textareaflag',
+                        width: 65,
+                        templet: function (d) {
+                            return webUtil.formateBoolean(d.textareaflag)
+                        }
+                    },
+                    {
+                        title: '棰勮鍥�',
+                        field: 'imageflag',
+                        width: 65,
+                        templet: function (d) {
+                            return webUtil.formateBoolean(d.imageflag);
+                        }
+                    },
+                    {
+                        title: '榛樿鍊�',
+                        field: 'defaultvalue',
+                        sort: true,
+                        width: 150
+                    },
+                    {
+                        title: '鍓嶇紑',
+                        field: 'prefixvalue',
+                        sort: true,
+                        width: 80
+                    },
+                    {
+                        title: '鍚庣紑',
+                        field: 'suffixvalue',
+                        sort: true,
+                        width: 80
+                    },
+                    {
+                        title: '缁勫悎瑙勫垯',
+                        field: 'componentrule',
+                        sort: true,
+                        width: 180
+                    },
+                    {
+                        title: '楠岃瘉瑙勫垯',
+                        field: 'verifyrule',
+                        sort: true,
+                        width: 150
+                    },
+                    {
+                        title: '鏃堕棿鏍煎紡',
+                        field: 'codedateformat',
+                        sort: true,
+                        width: 150
+                    },
+                    {
+                        title: '鍒嗙被娉ㄥ叆(灞傜骇/鍚嶇О)',
+                        field: 'classifyinvokelevel',
+                        width: 200,
+                        templet: function (d) {
+                            if(d.classifyinvokeattr){
+                                var value='娉ㄥ叆绫诲瀷:'+d.classifyinvokeattr+';';
+                                if(d.classifyinvokeattr=='id'){
+                                    value+='娉ㄥ叆绫诲瀷鍚嶇О:鍒嗙被浠e彿;'
+                                }else{
+                                    value+='娉ㄥ叆绫诲瀷鍚嶇О:鍒嗙被鍚嶇О;'
+                                }
+                                value+='灞傜骇璁剧疆:'+d.classifyinvokelevel+';';
+                                value+='鏄惁鍙慨鏀�:'+webUtil.formateBoolean(d.classifyinvokeeditflag);
+                                return value;
+                            }else{
+                                return ''
+                            }
+                        }
+                    },
+                    {
+                        title: '鏋氫妇娉ㄥ叆',
+                        field: 'enumString',
+                        width: 150
+                    },
+                    {
+                        title: '涓婄骇灞炴��',
+                        field: 'parentTempAttr',
+                        width: 150
+                    },
+                    {
+                        title: '鍙傜収閰嶇疆',
+                        field: 'referConfig',
+                        width: 150
+                    },
+                    {
+                        title: '濉啓鎻愮ず',
+                        field: 'prompt',
+                        width: 150
+                    },
+                    {
+                        title: '琛ㄥ崟鏄剧ず鏍峰紡',
+                        field: 'formdisplaystyle',
+                        width: 150
+                    },
+                    {
+                        title: '琛ㄦ牸鏄剧ず鏍峰紡',
+                        field: 'tabledisplaystyle',
+                        width: 150
+                    },
+                    {
+                        title: '琛ㄥ崟瓒呴摼鎺�',
+                        field: 'formhref',
+                        width: 150
+                    },
+                    {
+                        title: '琛ㄦ牸瓒呴摼鎺�',
+                        field: 'tablehref',
+                        width: 150
+                    },
+                    {
+                        title: '琛ㄦ牸鏄剧ずjs',
+                        field: 'tabledisplayjs',
+                        width: 150
+                    },
+                    {
+                        title: '闀垮害',
+                        field: 'controllength',
+                        width: 60
+                    },
+                    {
+                        title: '灏忔暟绮惧害(鍒诲害)',
+                        field: 'precisionlength',
+                        width: 100
+                    },
+                    {
+                        title: '鍙栧�艰寖鍥�',
+                        field: 'valuearea',
+                        sort: true,
+                        width: 150
+                    }];
+            }
+        }
+        this.showReferDialog=function (options){
+            var that=this;
+            if(!options){
+                options={}
+            }
+            if(options.id){
+                that.id=options.id
+            }
+            var target = options.target;
+            var table = layui.table;
+            that.checkReferColumns()
+            var filter = "tempAttr_" + that.id;
+            var html=[
+                '<div style="margin: 5px">',
+                    '<table class="layui-table" lay-size="sm" lay-filter="table_' + filter + '" id="table_' + filter + '" ></table>',
+                '</div>'
+            ]
+            var dialogIndex = webUtil.dialog({
+                title: '閫夋嫨绾ц仈灞炴��',
+                btn: ['纭畾', '娓呯┖鍐呭','鍙栨秷'],
+                content: html.join(''),
+                area:['1000px','500px'],
+                resizing: function (layero) {
+                    form.doResize(filter);
+                },
+                success: function (layero, layerIndex, classP) {
+                    table.render({
+                        elem: '#table_' + filter,
+                        id: 'table_' + filter,
+                        url:'codeClassifyTempAttrController/gridCodeClassifyTemplateAttr',
+                        backPath: that.backPath,
+                        limit:-1,
+                        extraParams:{
+                            "conditionMap['classifyTemplateOid']": options.formValues.classifytemplateoid,
+                            "conditionMap['oid']": '!='+options.formValues.oid
+                        },
+                        cols: [that.tempAttrColumns]
+                    });
+                },
+                yes: function (layero) {
+                    var datas = table.checkStatus('table_' + filter,true).data;
+                    if(datas.length!=1){
+                        webUtil.showErrorMsg("璇烽�夋嫨1鏉$骇鑱斿睘鎬ф暟鎹�");
+                        return false;
+                    }
+                    options.formValues['parentCode']=datas[0].id;
+                    options.formValues['parentName']=datas[0].name;
+                    target.setValue(options.filter,options.name,'',options.formValues,true);
+                    layer.close(dialogIndex);
+                },
+                btn2: function (layero) {
+                    options.formValues['parentCode']='';
+                    options.formValues['parentName']='';
+                    target.setValue(options.filter,options.name,'',options.formValues,true);
+                    layer.close(dialogIndex);
+                },
+                btn3: function (layero) {
+                    layer.close(dialogIndex);
+                }
+            });
+        }
+        this.refresh = function () {
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+        this.ADVQUERY = function () {
+            var that = this;
+            if(!that.serinorQueryInstance) {
+                var dynamicCondition = layui.dynamicCondition;
+                $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar' + that.id + '" class="layui-inline"></div>');
+                that.checkColumns();
+                var dataFields = [];
+                for(var i = 0 ; i < that.columns.length ; i ++){
+                    dataFields[i] = that.columns[i];
+                }
+                that.serinorQueryInstance = dynamicCondition.create({
+                    fields: dataFields//鏌ヨ瀛楁
+                    , tableId: "table_" + that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                    , type: "complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                    , queryCallBack: function (requestData) {//鏌ヨ涔嬪悗鐨刢allback
+
+                    }
+                });
+            }
+            that.serinorQueryInstance.open();
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/vciweb/mdm/CodeClassifyClassifyuse.js b/Source/platformProject/platform2022UI/vciweb/mdm/CodeClassifyClassifyuse.js
new file mode 100644
index 0000000..a472053
--- /dev/null
+++ b/Source/platformProject/platform2022UI/vciweb/mdm/CodeClassifyClassifyuse.js
@@ -0,0 +1,150 @@
+/**
+ * 妯℃澘灞炴�у垎绫绘敞鍏�
+ * @author wangting
+ * @date 2022-2-21
+ */
+layui.define(['layer','element','form','table','dynamicCondition' ,'tree'],function(exports){
+    var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "mdm/CodeClassifyClassifyuse";
+        this.moduleKey = "CodeClassifyClassifyuse";
+        this.id = "CodeClassifyClassifyuse";
+        this.backPath =  configData.compatibility? path:configData.mdmService;
+        this.url = {
+            controller:'codeClassifyController/'
+        };
+        this.getContent=function(){
+            var that = this;
+            var filter = "classifyuse_" + that.id;
+            var html=[
+                '<div style="display:block;">',
+                    '<div style="color: #FF5722;margin: 15px 0 5px 20px">鍒嗙被灞傜骇鍏宠仈璇存槑锛�</div>',
+                    '<div style="color: #01AAED;margin: 0 10px 0 45px;line-height: 20px">1锛氫富瑕佹槸璁剧疆妯℃澘灞炴�у拰鍒嗙被鐨勫叧绯�<br/>2锛氬鍒嗙被灞傜骇璁剧疆涓�2<br/>3锛氬綍鍏ヨ祫婧愭暟鎹椂锛岃灞炴�у搴旂殑鍊兼牴鎹眰绾у叧绯诲幓瀵瑰簲鐨勫垎绫婚噷鍙�<br/>4锛氬眰绾у繀椤绘槸澶т簬0鐨勬暣鏁板��</div>',
+                    '<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                '</div>'
+            ]
+            return html.join('');
+        };
+        this.init=function(){
+        };
+
+        this.showReferDialog=function (options){
+            var that=this;
+            if(!options){
+                options={}
+            }
+            if(options.id){
+                that.id=options.id
+            }
+            var target = options.target;
+            var form = layui.form;
+            var table = layui.table;
+            var filter = "classifyuse_" + that.id;
+            var formValues=$.extend({},options.formValues)
+            var classifyuseIndex = webUtil.dialog({
+                title: '鍒嗙被娉ㄥ叆',
+                btn: ['纭畾', '娓呯┖鍐呭','鍙栨秷'],
+                content: that.getContent(),
+                area:['600px','400px'],
+                resizing: function (layero) {
+                    form.doResize(filter);
+                },
+                success: function (layero, layerIndex, classP) {
+                    form.addItems(filter, [{
+                            field: 'classifyinvokeattr',
+                            title: '娉ㄥ叆绫诲瀷',
+                            textWidth: 400,
+                            textStyle: 'margin-bottom: 5px;',
+                            type: 'radio',
+                            comboxKey: 'classifyinvokeattr',
+                            data: [{key: 'name', value: '鍒嗙被鍚嶇О&nbsp;&nbsp;&nbsp;&nbsp;'}, {key: 'id', value: '鍒嗙被浠e彿'}]
+                        }, {
+                            field: 'classifyinvokelevel',
+                            title: '灞傜骇璁剧疆',
+                            textWidth: 220,
+                            textStyle: 'margin-bottom: 5px;margin-right:0',
+                            type: 'radio',
+                            comboxKey: 'classifyinvokelevel',
+                            data: [{key: 'min', value: '鏈�灏忓眰&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'}, {
+                                key: 'other',
+                                value: '鎸囧畾灞�'
+                            }]
+                        }, {
+                            field: 'classifyinvokeeditflag',
+                            title: '鍙慨鏀�',
+                            textWidth: 400,
+                            textStyle: 'margin-bottom: 5px;',
+                            type: 'radio',
+                            comboxKey: 'classifyinvokeeditflag',
+                            data: [{key: 'false', value: '鍚�'}, {key: 'true', value: '鏄�'}]
+                        }],
+                        function () {
+                            if (formValues.classifyinvokeattr != '') {
+                                if (formValues.classifyinvokelevel != 'min') {
+                                    $('input[name="classifyinvokelevel"]').parents('.layui-form-item').append('<div class="layui-form-mid" style="padding: 0 !important"><input type="number" name="InvokeLevel" autofocus lay-verify="InvokeLevel" value="' + formValues.classifyinvokelevel + '" class="layui-input"></div>')
+
+                                    formValues.classifyinvokelevelnum = formValues.classifyinvokelevel;
+                                    formValues.classifyinvokelevel = 'other';
+                                }
+                                form.setValues(formValues, filter);
+                            }
+
+                            form.on('radio(classifyinvokelevel)', function (data) {
+                                var parentDiv = data.othis.parents('.layui-form-item');
+                                if (this.value == 'min') {
+                                    parentDiv.find('.layui-form-mid').remove();
+                                } else {
+                                    if (parentDiv.find('.layui-form-mid').length == 0) {
+                                        var inputDiv = $('<div class="layui-form-mid" style="padding: 0 !important"><input type="number" name="InvokeLevel" autofocus lay-verify="InvokeLevel" class="layui-input"></div>');
+                                        inputDiv.appendTo(parentDiv);
+                                    }
+                                }
+                            });
+                        }, {}, {labelWidth: 130});
+                },
+                yes: function (layero) {
+                    if (form.validata(filter)) {
+                        var values = form.getValues(filter, true);
+                        options.formValues['classifyinvokeattr']=values.classifyinvokeattr;
+                        if(values.classifyinvokeattr=='id'){
+                            options.formValues['classifyinvokeattrname']='鍒嗙被浠e彿';
+                        }else{
+                            options.formValues['classifyinvokeattrname']='鍒嗙被鍚嶇О';
+                        }
+                        if(values.classifyinvokelevel=='min'){
+                            options.formValues['classifyinvokelevel']=values.classifyinvokelevel;
+                        }else{
+                            var InvokeLevel=$('input[name="InvokeLevel"]').val();
+                            if(!/^[+]{0,1}(\d+)$/.test(InvokeLevel)){
+                                webUtil.showErrorMsg("灞傜骇璁剧疆鍙兘濉啓姝f暣鏁�");
+                                return false;
+                            }
+                            options.formValues['classifyinvokelevel']=InvokeLevel;
+                        }
+                        options.formValues['classifyinvokeeditflag']=values.classifyinvokeeditflag;
+                        target.setValue(options.filter,options.name,'',options.formValues,true);
+                        layer.close(classifyuseIndex);
+                    }
+                },
+                btn2: function (layero) {
+                    options.formValues['classifyinvokeattr']='';
+                    options.formValues['classifyinvokeattrname']='';
+                    options.formValues['classifyinvokelevel']='';
+                    options.formValues['classifyinvokeeditflag']=''
+                    target.setValue(options.filter,options.name,'',options.formValues,true);
+                    layer.close(classifyuseIndex);
+                },
+                btn3: function (layero) {
+                    layer.close(classifyuseIndex);
+                }
+            });
+        }
+        this.refresh = function (buttonid,ele) {
+        };
+        this.ADVQUERY = function () {
+            var that = this;
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/vciweb/mdm/CodeClassifyEnumUse.js b/Source/platformProject/platform2022UI/vciweb/mdm/CodeClassifyEnumUse.js
new file mode 100644
index 0000000..3067535
--- /dev/null
+++ b/Source/platformProject/platform2022UI/vciweb/mdm/CodeClassifyEnumUse.js
@@ -0,0 +1,138 @@
+/**
+ * 妯℃澘灞炴�ф灇涓炬敞鍏�
+ * @author wangting
+ * @date 2022-2-21
+ */
+layui.define(['layer','element','form','table','dynamicCondition'],function(exports){
+    var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "mdm/CodeClassifyEnumUse";
+        this.moduleKey = "CodeClassifyEnumUse";
+        this.id = "CodeClassifyEnumUse";
+        this.backPath =  configData.compatibility? path:configData.mdmService;
+        this.url = {
+            controller:'codeClassifyController/'
+        };
+        this.getContent=function(){
+            var that = this;
+            var filter = "enumuse_" + that.id;
+            var html=[
+                '<div style="margin: 5px">',
+                    '<button class="layui-btn layui-btn-sm toolbar_',filter,'_add"> 娣诲姞 </button>',
+                    '<button class="layui-btn layui-btn-sm toolbar_',filter,'_del"> 鍒犻櫎 </button>',
+                    '<table class="layui-table" lay-size="sm" lay-filter="table_' + filter + '" id="table_' + filter + '" ></table>',
+                '</div>'
+            ]
+            return html.join('');
+        };
+        this.init=function(){
+        };
+
+        this.showReferDialog=function (options){
+            var that=this;
+            if(!options){
+                options={}
+            }
+            if(options.id){
+                that.id=options.id
+            }
+            that.fristButtonLoad=false;
+            var target = options.target;
+            var table = layui.table;
+            var filter = "enumuse_" + that.id;
+            var tableData=[];
+            if(webUtil.isNotNull(options.value)){
+                tableData=JSON.parse(options.value)
+            }else if(options.formValues && options.formValues.enumFlag) {
+                $.each(options.formValues.enumItemMap, function (i, item) {
+                    tableData.push({key: i, value: item})
+                })
+            }
+
+            var classifyuseIndex = webUtil.dialog({
+                title: '鏋氫妇娉ㄥ叆',
+                btn: ['淇濆瓨', '鍙栨秷'],
+                content: that.getContent(),
+                area:['600px','450px'],
+                resizing: function (layero) {
+                },
+                success: function (layero, layerIndex, classP) {
+                    table.render({
+                        elem: '#table_' + filter,
+                        id: 'table_' + filter,
+                        limit: -1,
+                        cols: [[table.getIndexColumn(),table.getCheckColumn(),{
+                            field: 'key',
+                            title: '閫夐」鍊�',
+                            edit:'text',
+                            width: 150
+                        }, {
+                            field: 'value',
+                            title: '閫夐」涓枃鏍囩',
+                            edit:'text',
+                            width: 240
+                        }, {
+                            field: 'options',
+                            title: '鎿嶄綔',
+                            width: 80,
+                            templet: function (d) {
+                                return '<a class="layui-btn layui-btn-intable" lay-event="REM">绉婚櫎</a>';
+                            }
+                        }]],
+                        data: tableData,
+                        done: function (res, cur, total) {
+                            if (!that.fristButtonLoad) {
+                                table.on('tool(table_' + filter + ')', function (obj) {
+                                    var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                                    var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                                    if (layEvent == 'REM') {
+                                        table.removeData('table_' + filter, data);
+                                    }
+                                });
+                            }
+                            that.fristButtonLoad = true;
+                        }
+                    });
+                    $('.toolbar_'+filter+'_add').click(function (){
+                        table.addData('table_' + filter, {key:'',value:''});
+                    })
+                    $('.toolbar_'+filter+'_del').click(function (){
+                        var checkData = layui.table.checkStatus("table_" + filter).data;
+                        layui.each(checkData,function (i,item){
+                            table.removeData('table_' + filter, item);
+                        })
+                    })
+                },
+                yes: function (layero) {
+                    var datas = table.getData('table_' + filter,true);
+                    for (var i=0;i<datas.length;i++){
+                        if(webUtil.isNull(datas[i].key)){
+                            webUtil.showErrorMsg("璇疯緭鍏ラ�夐」鍊�");
+                            return false;
+                        }
+                        if(webUtil.isNull(datas[i].value)){
+                            webUtil.showErrorMsg("璇疯緭鍏ラ�夐」涓枃鏍囩");
+                            return false;
+                        }
+                    }
+                    var values=''
+                    if(datas.length>0){
+                        values=JSON.stringify(datas);
+                    }
+                    target.setValue(options.filter,options.name,values,values,true);
+                    layer.close(classifyuseIndex);
+                },
+                btn2: function (layero) {
+                    layer.close(classifyuseIndex);
+                }
+            });
+        }
+        this.refresh = function (buttonid,ele) {
+        };
+        this.ADVQUERY = function () {
+            var that = this;
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/vciweb/mdm/CodeClassifyProcessTemp.js b/Source/platformProject/platform2022UI/vciweb/mdm/CodeClassifyProcessTemp.js
new file mode 100644
index 0000000..71b4e34
--- /dev/null
+++ b/Source/platformProject/platform2022UI/vciweb/mdm/CodeClassifyProcessTemp.js
@@ -0,0 +1,276 @@
+/**
+ * 鍒嗙被浣跨敤鐨勬祦绋嬫ā鏉块〉闈�
+ * @author weidy
+ * @date 2022-01-24
+ */
+layui.define(['layer','element','form','table','dynamicCondition' ],function(exports){
+        var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "mdm/CodeClassifyProcessTemp";
+        this.moduleKey = "CodeClassifyProcessTemp";
+        this.backPath =  configData.compatibility? path:configData.mdmService;
+        this.url = {
+            controller:'codeClsProcessTempController/',
+            dataGrid:'gridCodeClassifyProcessTemp',
+            addSave:'addSave',
+            editSave:'editSave',
+            deleteUrl:'deleteData',
+            getObjectByOid:'getObjectByOid'
+        };
+        this.getContent=function(){
+            var that = this;
+            var html = "";
+            html = [
+                '<div class="layui-layout" style="display:block;overflow-y: hidden">',
+                    '<div class="layui-layout-border" style="display:block;margin-top:0px; " id="border_',that.id,'">',
+                        '<div class="layui-center" style="overflow-y:auto;">',
+                            that.getToolbarHtml(),
+                            '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                        '</div>',
+                    '</div>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.createSearchHtml({id:"缂栧彿",name:"鍚嶇О"} ,$("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+        };
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            that.initMainTable();
+            that.createSearchHtml();
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var tableWidth = $("#border_" + that.id).width()-225;
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                width:tableWidth,
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                method:'get',
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'EDIT'){
+                                that.addOrEdit(false,data.oid);
+                            }
+                        });
+                    }else{
+                        if(total>0) {
+                            table.selectRecord('table_' + that.id, {index:0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                }
+            };
+            if(parentFieldName){
+                options.treeConfig = {
+                    treepid:parentFieldName,
+                    treeid:'id',
+                    showField:'name'
+                };
+            }
+            table.render(options);
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),
+                    {
+                        title: '涓婚搴撳垎绫讳富閿�',
+                        field: 'codeclassifyoidName',
+                        sort:true,
+                        sortField:'codeclassifyoid',
+                        type:'refer',
+                        referConfig: {
+                            referBo:'codeclassify'
+                        },
+                        width: 150
+                    },
+                    {
+                        title: '娴佺▼妯℃澘鐢ㄩ��',
+                        field: '娴佺▼妯℃澘鐢ㄩ�擳ext',
+                        sort:true,
+                        sortField:'codeprocessuse',
+                        type:'combox',
+                        comboxKey:"codeClassifyProcessUse",
+                        width: 150
+                    },
+                    {
+                        field:'options',
+                        title:'鎿嶄綔',
+                        templet:function(d){
+                            return '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>';
+                        }
+                    }];
+            }
+        };
+
+        this.getFormItems = function(onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [
+                {
+                    field: 'codeclassifyoid',
+                    title: '涓婚搴撳垎绫讳富閿�',
+                    required: true,
+                    type: 'refer',
+                    showField: 'codeclassifyoidName',
+                    referConfig: {
+                        referBo:'codeclassify'
+                    },
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'codeprocessuse',
+                    title: '娴佺▼妯℃澘鐢ㄩ��',
+                    required: true,
+                    type: 'combox',
+                    comboxKey: 'codeClassifyProcessUse',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                }             ];
+        };
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            that.addOrEdit(false,oid);
+        };
+        this.addOrEdit = function(add,oid) {
+            var that = this;
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var addSaveIndex =webUtil.dialog({
+                title:add?'娣诲姞鍒嗙被浣跨敤鐨勬祦绋嬫ā鏉�':'淇敼鍒嗙被浣跨敤鐨勬祦绋嬫ā鏉�',
+                btn:['淇濆瓨','鍙栨秷'],
+                skin:'layui-layer-lan',
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getFormItems(false),
+                        function () {
+                            if(!add){
+                                form.load(filter,{
+                                    backPath:that.backPath,
+                                    url:that.url.controller + that.url.getObjectByOid,
+                                    method:'get',
+                                    params:{
+                                        oid:oid
+                                    }
+                                });
+                            }else{
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+                        }, {}, {defaultColumnOneRow: 2});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        var url = that.url.controller + (add?that.url.addSave:that.url.editSave);
+                        webUtil.manualAjax(add?'post':'put',url,JSON.stringify(values),function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts= webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+        this.refresh = function () {
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+        this.ADVQUERY = function () {
+            var that = this;
+            if(!that.serinorQueryInstance) {
+                var dynamicCondition = layui.dynamicCondition;
+                $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar' + that.id + '" class="layui-inline"></div>');
+                that.checkColumns();
+                var dataFields = [];
+                for(var i = 0 ; i < that.columns.length ; i ++){
+                    dataFields[i] = that.columns[i];
+                }
+                that.serinorQueryInstance = dynamicCondition.create({
+                    fields: dataFields//鏌ヨ瀛楁
+                    , tableId: "table_" + that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                    , type: "complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                    , queryCallBack: function (requestData) {//鏌ヨ涔嬪悗鐨刢allback
+
+                    }
+                });
+            }
+            that.serinorQueryInstance.open();
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/vciweb/mdm/CodeClassifyTempMapItem.js b/Source/platformProject/platform2022UI/vciweb/mdm/CodeClassifyTempMapItem.js
new file mode 100644
index 0000000..1159557
--- /dev/null
+++ b/Source/platformProject/platform2022UI/vciweb/mdm/CodeClassifyTempMapItem.js
@@ -0,0 +1,331 @@
+/**
+ * 鏄犲皠瑙勫垯鐨勬槑缁嗛〉闈�
+ * @author weidy
+ * @date 2022-01-24
+ */
+layui.define(['layer','element','form','table','dynamicCondition' ],function(exports){
+        var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "mdm/CodeClassifyTempMapItem";
+        this.moduleKey = "CodeClassifyTempMapItem";
+        this.backPath =  configData.compatibility? path:configData.mdmService;
+        this.url = {
+            controller:'codeClsTempMapItemController/',
+            dataGrid:'gridCodeClassifyTempMapItem',
+            addSave:'addSave',
+            editSave:'editSave',
+            deleteUrl:'deleteData',
+            getObjectByOid:'getObjectByOid'
+        };
+        this.getContent=function(){
+            var that = this;
+            var html = "";
+            html = [
+                '<div class="layui-layout" style="display:block;overflow-y: hidden">',
+                    '<div class="layui-layout-border" style="display:block;margin-top:0px; " id="border_',that.id,'">',
+                        '<div class="layui-center" style="overflow-y:auto;">',
+                            that.getToolbarHtml(),
+                            '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                        '</div>',
+                    '</div>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.createSearchHtml({id:"缂栧彿",name:"鍚嶇О"} ,$("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+        };
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            that.initMainTable();
+            that.createSearchHtml();
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var tableWidth = $("#border_" + that.id).width()-225;
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                width:tableWidth,
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                method:'get',
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'EDIT'){
+                                that.addOrEdit(false,data.oid);
+                            }
+                        });
+                    }else{
+                        if(total>0) {
+                            table.selectRecord('table_' + that.id, {index:0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                }
+            };
+            if(parentFieldName){
+                options.treeConfig = {
+                    treepid:parentFieldName,
+                    treeid:'id',
+                    showField:'name'
+                };
+            }
+            table.render(options);
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),
+                    {
+                        title: '鏄犲皠瑙勫垯',
+                        field: 'classifytemplatemapoidName',
+                        sort:true,
+                        sortField:'classifytemplatemapoid',
+                        type:'refer',
+                        referConfig: {
+                            referBo:'codetempmap'
+                        },
+                        width: 150
+                    },
+                    {
+                        title: '鏉ユ簮绔殑灞炴�ey',
+                        field: 'sourceattrkey',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '鐩爣绔殑灞炴�ey',
+                        field: 'targetattrkey',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '鐩爣绔殑鏃堕棿鏍煎紡',
+                        field: 'targetdateformat',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '杞崲鍏紡',
+                        field: 'switcheval',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '杞崲鐨勮嚜瀹氫箟绫�',
+                        field: 'switchclassname',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '鐮佸�煎簭鍙�',
+                        field: 'ordernum',
+                        type:'number',
+                        width: 100
+                    },
+                    {
+                        field:'options',
+                        title:'鎿嶄綔',
+                        templet:function(d){
+                            return '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>';
+                        }
+                    }];
+            }
+        };
+
+        this.getFormItems = function(onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [
+                {
+                    field: 'classifytemplatemapoid',
+                    title: '鏄犲皠瑙勫垯',
+                    required: true,
+                    type: 'refer',
+                    showField: 'classifytemplatemapoidName',
+                    referConfig: {
+                        referBo:'codetempmap'
+                    },
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'sourceattrkey',
+                    title: '鏉ユ簮绔殑灞炴�ey',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'targetattrkey',
+                    title: '鐩爣绔殑灞炴�ey',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'targetdateformat',
+                    title: '鐩爣绔殑鏃堕棿鏍煎紡',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'switcheval',
+                    title: '杞崲鍏紡',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'switchclassname',
+                    title: '杞崲鐨勮嚜瀹氫箟绫�',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'ordernum',
+                    title: '鐮佸�煎簭鍙�',
+                    verify: 'number',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                }             ];
+        };
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            that.addOrEdit(false,oid);
+        };
+        this.addOrEdit = function(add,oid) {
+            var that = this;
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var addSaveIndex =webUtil.dialog({
+                title:add?'娣诲姞鏄犲皠瑙勫垯鐨勬槑缁�':'淇敼鏄犲皠瑙勫垯鐨勬槑缁�',
+                btn:['淇濆瓨','鍙栨秷'],
+                skin:'layui-layer-lan',
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getFormItems(false),
+                        function () {
+                            if(!add){
+                                form.load(filter,{
+                                    backPath:that.backPath,
+                                    url:that.url.controller + that.url.getObjectByOid,
+                                    method:'get',
+                                    params:{
+                                        oid:oid
+                                    }
+                                });
+                            }else{
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+                        }, {}, {defaultColumnOneRow: 2});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        var url = that.url.controller + (add?that.url.addSave:that.url.editSave);
+                        webUtil.manualAjax(add?'post':'put',url,JSON.stringify(values),function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts= webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+        this.refresh = function () {
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+        this.ADVQUERY = function () {
+            var that = this;
+            if(!that.serinorQueryInstance) {
+                var dynamicCondition = layui.dynamicCondition;
+                $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar' + that.id + '" class="layui-inline"></div>');
+                that.checkColumns();
+                var dataFields = [];
+                for(var i = 0 ; i < that.columns.length ; i ++){
+                    dataFields[i] = that.columns[i];
+                }
+                that.serinorQueryInstance = dynamicCondition.create({
+                    fields: dataFields//鏌ヨ瀛楁
+                    , tableId: "table_" + that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                    , type: "complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                    , queryCallBack: function (requestData) {//鏌ヨ涔嬪悗鐨刢allback
+
+                    }
+                });
+            }
+            that.serinorQueryInstance.open();
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/vciweb/mdm/CodeClassifyTemplate.js b/Source/platformProject/platform2022UI/vciweb/mdm/CodeClassifyTemplate.js
new file mode 100644
index 0000000..db41125
--- /dev/null
+++ b/Source/platformProject/platform2022UI/vciweb/mdm/CodeClassifyTemplate.js
@@ -0,0 +1,342 @@
+/**
+ * 鍒嗙被妯℃澘瀵硅薄椤甸潰
+ * @author weidy
+ * @date 2022-01-24
+ */
+layui.define(['layer','element','form','table','dynamicCondition' ,'tree'],function(exports){
+        var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "mdm/CodeClassifyTemplate";
+        this.moduleKey = "CodeClassifyTemplate";
+        this.backPath =  configData.compatibility? path:configData.mdmService;
+        this.url = {
+            controller:'codeClassifyTemplateController/',
+            tree:'treeCodeClassifyTemplate',
+            addSave:'addSave',
+            editSave:'editSave',
+            checkIsCanDelete:'checkIsCanDelete',
+            referTree:'referTree' ,
+             deleteUrl:'deleteData',
+            getObjectByOid:'getObjectByOid'
+        };
+        this.getContent=function(){
+            var that = this;
+            var html = "";
+            html = [
+                '<div class="layui-layout" style="display:block;overflow-y: hidden">',
+                    that.getWestToolbarHtml(),
+                    '<div class="layui-vci-tree" style="width:250px;float: left;background-color:#ffffff;overflow-y: auto;">',
+                        '<label class="layui-icon layui-icon-tree" style="line-height: 20px;color:red;font-size:20px;">鍒嗙被妯℃澘瀵硅薄</label>',
+                        '<ul layui-filter="tree_',that.id,'"><ul>',
+                    '</div>',
+                    '<div class="layui-layout-border" style="display:block;margin-top:0px; margin-left:255px;" id="border_',that.id,'">',
+                        '<div class="layui-center" style="overflow-y:auto;">',
+                            that.getToolbarHtml(),
+                            '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                        '</div>',
+                    '</div>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getWestToolbarHtml = function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_west_',that.id,'" class="layui-btn-container layui-buttons">',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_west_',that.id,'_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_west_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createWestSearchHtml = function () {
+            var that = this;
+            webUtil.createSearchHtml({id:"鍒嗙被缂栧彿",name:"鍒嗙被鍚嶇О"},$("[layui-filter='toolbar_west_" + that.id + "']"),'west_' + that.id);
+            webUtil.bindDefultButtonLisenter(that,"west_" + that.id);
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.createSearchHtml({id:"缂栧彿",name:"鍚嶇О"} ,$("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+        };
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            that.initTree();
+            that.createWestSearchHtml();
+            that.initMainTable();
+            that.createSearchHtml();
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var tableWidth = $("#border_" + that.id).width()-225;
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                width:tableWidth,
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                method:'get',
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'EDIT'){
+                                that.addOrEdit(false,data.oid);
+                            }
+                        });
+                    }else{
+                        if(total>0) {
+                            table.selectRecord('table_' + that.id, {index:0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                }
+            };
+            if(parentFieldName){
+                options.treeConfig = {
+                    treepid:parentFieldName,
+                    treeid:'id',
+                    showField:'name'
+                };
+            }
+            table.render(options);
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),
+                    {
+                        title: '涓婚搴撳垎绫讳富閿�',
+                        field: 'codeclassifyoidName',
+                        sort:true,
+                        sortField:'codeclassifyoid',
+                        type:'refer',
+                        referConfig: {
+                            referBo:'codeclassify'
+                        },
+                        width: 150
+                    },
+                    {
+                        field:'options',
+                        title:'鎿嶄綔',
+                        templet:function(d){
+                            return '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>';
+                        }
+                    }];
+            }
+        };
+
+        this.initTree = function () {
+            var that = this;
+            var tree = layui.tree;
+            var scrollHeight =  window.innerHeight;
+            var treeUL = $('[layui-filter="tree_' + that.id + '"]');
+            var treeHeight = scrollHeight - 200;
+            treeUL.parent().height(treeHeight);
+            tree.init("tree_" + that.id, treeUL, {
+                url: that.url.controller + that.url.tree,
+                backPath: that.backPath,
+                extraParams: {
+                    isMuti: false,
+                    isQueryAllColumn: true
+                },
+                showSearch:true,
+                click: function (item, elem, options) {
+                    that.currentItemOid = item.oid;
+                    that.currentItemAttributes = item.attributes;
+                    layui.table.reload('table_' + that.id,{
+                        extraParams:{
+                            "codeClassifyOid":that.currentItemAttributes.oid
+                        }
+                    });
+                }
+            });
+        };
+        this.setFormValues = function () {
+            var that = this;
+            layui.form.setValues({"oid":that.currentItemAttributes.oid},"form_" + that.id);
+        };
+        this.getFormItems = function(onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [
+                {
+                    field: 'codeclassifyoid',
+                    title: '涓婚搴撳垎绫讳富閿�',
+                    required: true,
+                    type: 'refer',
+                    showField: 'codeclassifyoidName',
+                    referConfig: {
+                        referBo:'codeclassify'
+                    },
+                    defaultValue:"",
+                    readOnly:onlyShow
+                }             ];
+        };
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            if(webUtil.isNull(that.currentItemOid)){
+                webUtil.showErrorMsg("璇峰厛浠庢爲涓婇�夋嫨涓�鏉℃暟鎹�");
+                return false;
+            }
+            that.addOrEdit(false,that.currentItemOid);
+        };
+        this.addOrEdit = function(add,oid) {
+            var that = this;
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var addSaveIndex =webUtil.dialog({
+                title:add?'娣诲姞鍒嗙被妯℃澘瀵硅薄':'淇敼鍒嗙被妯℃澘瀵硅薄',
+                btn:['淇濆瓨','鍙栨秷'],
+                skin:'layui-layer-lan',
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getFormItems(false),
+                        function () {
+                            if(!add){
+                                form.load(filter,{
+                                    backPath:that.backPath,
+                                    url:that.url.controller + that.url.getObjectByOid,
+                                    method:'get',
+                                    params:{
+                                        oid:oid
+                                    }
+                                });
+                            }else{
+                                var defaultValues = {};
+                                if(that.currentItemAttributes) {
+                                    defaultValues["codeClassifyOid"] = that.currentItemOid;
+                                    defaultValues["codeClassifyOid" + "name"] = that.currentItemAttributes.name;
+                                }
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+                        }, {}, {defaultColumnOneRow: 2});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        var url = that.url.controller + (add?that.url.addSave:that.url.editSave);
+                        webUtil.manualAjax(add?'post':'put',url,JSON.stringify(values),function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function(){
+            var that = this;
+            if(webUtil.isNull(that.currentItemOid)){
+                webUtil.showErrorMsg("璇峰厛浠庢爲涓婄殑鑺傜偣");
+                return false;
+            }
+            var ts =  that.currentItemAttributes.ts;
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                var submitValue = {oid:that.currentItemOid,ts:ts};
+                webUtil.deleteRequest(that.url.controller + that.url.checkIsDelete,submitValue,function(result){
+                    if(result.success) {
+                        if ('true' == result.obj || true == result.obj) {
+                        webUtil.showConfirmMsg("褰撳墠鏁版嵁鍖呭惈鏈変笅绾ф暟鎹紝瑕佸垹闄ょ殑璇濅細鍜屼笅绾ф暟鎹竴璧峰垹闄わ紝浣犵‘璁ょ户缁�?", function () {
+                                that.doDelete(submitValue);
+                            });
+                        } else {
+                            //璇存槑鍙互鍒犻櫎
+                            that.doDelete(submitValue);
+                        }
+                    }else {
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function (xhr,error) {
+                    webUtil.showErrorMsg("鏍¢獙鍒犻櫎鍑虹幇浜嗛敊璇紝鍙兘鏄湇鍔″櫒鏈惎鍔�")
+                },that.backPath);
+            });
+        };
+        this.doDelete = function (submitValue) {
+            var that = this;
+            webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,submitValue,function(result){
+                if(result.success){
+                    webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                    that.refresh();
+                }else{
+                    webUtil.showErrorMsg(result.msg);
+                }
+            },function (xhr,err) {
+                webUtil.showErrorMsg("鎵ц鍒犻櫎鐨勬椂鍊欏嚭閿欎簡閿欒锛屽彲鑳芥槸鏈嶅姟鍣ㄦ殏鏃舵棤娉曡闂�");
+            },that.backPath);
+        };
+        this.refresh = function (buttonid,parentNodeOid) {
+            var that = this;
+            var tree = layui.tree;
+            if(webUtil.isNotNull(parentNodeOid)){
+                tree.reloadNode("tree_" + that.id,parentNodeOid);
+            }else {
+                tree.reload("tree_" + that.id);
+            }
+        };
+        this.ADVQUERY = function () {
+            var that = this;
+            if(!that.serinorQueryInstance) {
+                var dynamicCondition = layui.dynamicCondition;
+                $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar' + that.id + '" class="layui-inline"></div>');
+                that.checkColumns();
+                var dataFields = [];
+                for(var i = 0 ; i < that.columns.length ; i ++){
+                    dataFields[i] = that.columns[i];
+                }
+                that.serinorQueryInstance = dynamicCondition.create({
+                    fields: dataFields//鏌ヨ瀛楁
+                    , tableId: "table_" + that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                    , type: "complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                    , queryCallBack: function (requestData) {//鏌ヨ涔嬪悗鐨刢allback
+
+                    }
+                });
+            }
+            that.serinorQueryInstance.open();
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/vciweb/mdm/CodeClassifyTemplateAttr.js b/Source/platformProject/platform2022UI/vciweb/mdm/CodeClassifyTemplateAttr.js
new file mode 100644
index 0000000..c76e94f
--- /dev/null
+++ b/Source/platformProject/platform2022UI/vciweb/mdm/CodeClassifyTemplateAttr.js
@@ -0,0 +1,1332 @@
+/**
+ * 涓婚搴撳垎绫荤殑妯℃澘灞炴�ч〉闈�
+ * @author weidy
+ * @date 2022-01-24
+ */
+layui.define(['layer','element','form','table','dynamicCondition' ],function(exports){
+        var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "mdm/CodeClassifyTemplateAttr";
+        this.moduleKey = "CodeClassifyTemplateAttr";
+        this.backPath =  configData.compatibility? path:configData.mdmService;
+        this.url = {
+            attrController:'codeClassifyAttrController/',
+            classifyController:'codeClassifyController/',
+            classifyTree:'referTree',
+            attrRefer:'gridCodeClassifyAttribute',
+            controller:'codeClassifyTempAttrController/',
+            dataGrid:'gridCodeClassifyTemplateAttr',
+            tree:'treeCodeClassifyTemplate',
+            addSave:'addSave',
+            editSave:'editSave',
+            deleteUrl:'deleteData',
+            getObjectByOid:'getObjectByOid',
+            tempController:'codeClassifyTemplateController/',
+            tempDataGrid:'gridCodeClassifyTemplate',
+            addSaveTemp:'addSave',
+            editSaveTemp:'editSave',
+            deleteUrlTemp:'deleteData',
+        };
+        this.getContent=function() {
+            var that = this;
+            return '<div id="UIContent_' + that.id + '" style="overflow: auto;padding:0 5px"></div>';
+        };
+        this.showContent = function (){
+            var that = this;
+            var html=[
+                '<div class="layui-layout easyui-layout UIContentLayout" id="easyuiLayout_',that.id,'" data-options="fit:true" style="display:block;overflow-y: hidden">',
+                    '<div data-options="region:\'west\',split:true" title="涓婚搴撳垎绫�" style="width:270px;padding: 5px;">',
+                        that.getWestToolbarHtml(),
+                        '<div class="layui-vci-tree" style="overflow: auto">',
+                            '<ul layui-filter="tree_',that.id,'"><ul>',
+                        '</div>',
+                    '</div>',
+                    '<div data-options="region:\'center\'" style="border:0; " id="border_',that.id,'">',
+                        '<div id="easyuiLayoutCenter_',that.id,'" class="easyui-layout" data-options="fit:true">',
+                            '<div data-options="region:\'north\',split:true" title="妯℃澘绠$悊"  style="height: 300px;padding: 5px">',
+                                that.getNorthToolbarHtml(),
+                                '<table id="temp_', that.id , '" lay-filter="temp',that.id , '" style="overflow-x:auto;"></table>',
+                            '</div>',
+                            '<div data-options="region:\'center\',split:true" title="妯℃澘灞炴��" style="padding-left: 5px;padding-right: 5px;" id="border_center_',that.id,'">',
+                                '<div class="layui-center" style="overflow-y:auto;">',
+                                    that.getToolbarHtml(),
+                                    '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                                '</div>',
+                            '</div>',
+                        '</div>',
+                    '</div>',
+                '</div>'
+            ];
+            $("#UIContent_"+that.id).html(html.join(''));
+        };
+        this.getWestToolbarHtml = function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_west_',that.id,'" class="layui-btn-container layui-buttons">',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_west_',that.id,'_ADVQUERYCLF"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_west_',that.id,'_refreshCLF"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getNorthToolbarHtml = function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADDTEMP"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDITTEMP"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DELTEMP"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_UPTEMP"><i class="layui-icon layui-icon-upload-circle"></i>鍗囩増</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_west_',that.id,'_ENABLETEMP"><i class="layui-icon layui-icon-ok-circle"></i>鍚敤/鍙戝竷</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_west_',that.id,'_DISABLETEMP"><i class="layui-icon layui-icon-404"></i>鍋滅敤/澶辨晥</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADVQUERYTEMP"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refreshTEMP"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_cloneTEMP"><i class="layui-icon layui-icon-share"></i>浠庡叾浠栨ā鏉垮厠闅�</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml =function(isFull){
+            var that = this;
+            var html = ['<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">'];
+            if(isFull){
+                html.push('<div class="layui-btn-group">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-ok"></i>淇濆瓨</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_CANCEL"><i class="layui-icon layui-icon-refresh-3"></i>閲嶇疆</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_UNBATCHEDIT"><i class="layui-icon layui-icon-screen-restore"></i>閫�鍑哄叏灞忕紪杈�</button>',
+                    '</div>')
+            }else {
+                html.push('<div class="layui-btn-group">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                    '</div>',
+                    '<div class="layui-btn-group">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-ok"></i>淇濆瓨</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_CANCEL"><i class="layui-icon layui-icon-refresh-3"></i>閲嶇疆</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_BATCHEDIT"><i class="layui-icon layui-icon-screen-full"></i>鍏ㄥ睆缂栬緫</button>',
+                    '</div>')
+            }
+            html.push('<div class="layui-btn-group">',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_CLASSIFYUSE"><i class="layui-icon layui-icon-tree"></i>鍒嗙被娉ㄥ叆</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_COMPUSE"><i class="layui-icon layui-icon-template"></i>缁勫悎瑙勫垯</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_VERIFYUSER"><i class="layui-icon layui-icon-auz"></i>楠岃瘉瑙勫垯</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ENUMUSE"><i class="layui-icon layui-icon-rss"></i>鏋氫妇娉ㄥ叆</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_GROUPATTR"><i class="layui-icon layui-icon-template-1"></i>灞炴�у垎缁�</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_UPSELECT"><i class="layui-icon layui-icon-up"></i>涓婄Щ</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DOWNSELECT"><i class="layui-icon layui-icon-down"></i>涓嬬Щ</button>',
+                '</div>',
+                '<div class="layui-btn-group">',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_syncAttr"><i class="layui-icon layui-icon-share"></i>鍚屾鍒板叾浠栨ā鏉�</button>',
+                '</div>',
+                '</div>')
+            return html.join("");
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+        };
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            setTimeout(function () {
+                that.showContent();
+                that.createWestSearchHtml();
+                that.createSearchHtml();
+                var easyuiLayout = $('#easyuiLayout_' + that.id)
+                easyuiLayout.css({height: $('#portal_body').height() - 43, width: $('#portal_body').width() - 15})
+                easyuiLayout.layout();
+                $('#easyuiLayoutCenter_'+that.id).layout();
+                that.initMainTable();
+                that.initTempTable();
+                that.initTree();
+            },1)
+        };
+        this.initTree = function () {
+            var that = this;
+            var tree = layui.tree;
+            var treeUL = $('[layui-filter="tree_' + that.id + '"]');
+            var scrollHeight =  treeUL.closest('.panel-body').height();
+            var treeHeight = scrollHeight - 100;
+            treeUL.parent().height(treeHeight);
+            tree.init("tree_" + that.id, treeUL, {
+                url: that.url.classifyController + that.url.classifyTree,
+                backPath: that.backPath,
+                extraParams: {
+                    isMuti: false,
+                    isQueryAllColumn: true
+                },
+                showSearch:true,
+                click: function (item, elem, options) {
+                    that.currentItemOid = item.oid;
+                    that.currentItemAttributes = item.attributes;
+                    that.setFormValues();
+                }
+            });
+        };
+        this.setFormValues = function () {
+            var that = this;
+            //鍒楄〃
+            layui.table.reload('temp_' + that.id,{
+                where:{
+                    codeclassifyoid:that.currentItemAttributes.oid
+                }
+            })
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var tableWidth = $("#border_" + that.id).width();
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                width:tableWidth,
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                method:'get',
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'EDIT'){
+                                that.addOrEdit(false,data.oid);
+                            }
+                        });
+                    }else{
+                        if(total>0) {
+                            table.selectRecord('table_' + that.id, {index:0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                }
+            };
+            if(parentFieldName){
+                options.treeConfig = {
+                    treepid:parentFieldName,
+                    treeid:'id',
+                    showField:'name'
+                };
+            }
+            table.render(options);
+        };
+        this.initTempTable = function (){
+            var that = this;
+            var table = layui.table;
+            that.checkTempColumns();
+            var tableWidth = $("#border_" + that.id).width()-10;
+            var options = {
+                elem: '#temp_' + that.id,
+                id: 'temp_' + that.id,
+                backPath:that.backPath,
+                url: that.url.tempController + that.url.tempDataGrid,
+                page: {
+                    limit: 10,
+                    page: 1
+                },
+                width:tableWidth,
+                selectMode:table.selectMode.muti,
+                cols: [that.tempColumns],
+                method:'get',
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'EDIT'){
+                                that.addOrEdit(false,data.oid);
+                            }
+                        });
+                    }else{
+                        if(total>0) {
+                            table.selectRecord('temp_' + that.id, {index:0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                }
+            };
+            table.render(options);
+        };
+        this.checkTempColumns = function (){
+            var that = this;
+            var table = layui.table;
+            if(that.tempColumns==null || that.tempColumns.length==0){
+                that.tempColumns = [table.getIndexColumn(),table.getCheckColumn(),
+                    {
+                        field: 'id',
+                        title: '妯℃澘缂栧彿',
+                        sort:true,
+                        width: 150
+                    },{
+                        field: 'name',
+                        title: '妯℃澘鍚嶇О',
+                        sort:true,
+                        width: 200
+                    },{
+                        field: 'description',
+                        title: '妯℃澘鎻忚堪',
+                        sort:true,
+                        width: 150
+                    },{
+                        field: 'revisionValue',
+                        title: '鐗堟湰鍙�',
+                        sort: true,
+                        width: 70
+                    },{
+                        field: 'lcStatusText',
+                        title: '鐘舵��',
+                        sortField:'lcStatus',
+                        sort:true,
+                        width: 60
+                    },
+                    {
+                        field:'options',
+                        title:'鎿嶄綔',
+                        width: 150,
+                        templet:function(d){
+                            return ['<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>','<a class="layui-btn layui-btn-intable" lay-event="UPREVSION">鍗囩増</a>'].join("");
+                        }
+                    }];
+            }
+        };
+        this.createWestSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that,"west_" + that.id);
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),{
+                    field: 'id',
+                    title: '灞炴�ц嫳鏂囩紪鍙�',
+                    sort: true,
+                    width: 150
+                },{
+                    field: 'name',
+                    title: '灞炴�т腑鏂囧悕绉�',
+                    sort: true,
+                    width: 150
+                },
+                    {
+                        title: '灞炴�у垎缁�',
+                        field: 'attributegroup',
+                        sort:true,
+                        width: 90
+                    },
+                    {
+                        title: '绫诲瀷',
+                        field: 'attributedatatypeText',
+                        sort:true,
+                        type: 'combox',
+                        data:[],
+                        width: 60
+                    },
+                    {
+                        title: '鍏抽敭灞炴��',
+                        field: 'keyattrflag',
+                        width: 60,
+                        type:'combox',
+                        data:[{key:"true",value:"鏄�"},{key:"false",value:"鍚�"}],
+                        templet: function (d) {
+                            return webUtil.formateBoolean(d.keyattrflag);
+                        }
+                    },
+                    {
+                        title: '鏌ヨ灞炴��',
+                        field: 'queryattrflag',
+                        width: 60,
+                        type:'combox',
+                        data:[{key:"true",value:"鏄�"},{key:"false",value:"鍚�"}],
+                        templet: function (d) {
+                            return webUtil.formateBoolean(d.queryattrflag);
+                        }
+                    },
+                    {
+                        title: '楂樼骇鏌ヨ灞炴��',
+                        field: 'seniorqueryattrflag',
+                        width: 90,
+                        type:'combox',
+                        data:[{key:"true",value:"鏄�"},{key:"false",value:"鍚�"}],
+                        templet: function (d) {
+                            return webUtil.formateBoolean(d.seniorqueryattrflag);
+                        }
+                    },
+                    {
+                        title: '鐩镐技鏌ラ噸灞炴��',
+                        field: 'samerepeatattrflag',
+                        width: 90,
+                        type:'combox',
+                        data:[{key:"true",value:"鏄�"},{key:"false",value:"鍚�"}],
+                        templet: function (d) {
+                            return webUtil.formateBoolean(d.samerepeatattrflag);
+                        }
+                    },
+                    {
+                        title: '涓�缁寸爜',
+                        field: 'barcodeflag',
+                        width: 60,
+                        type:'combox',
+                        data:[{key:"true",value:"鏄�"},{key:"false",value:"鍚�"}],
+                        templet: function (d) {
+                            return webUtil.formateBoolean(d.barcodeflag);
+                        }
+                    },
+                    {
+                        title: '浜岀淮鐮�',
+                        field: 'qrcodeflag',
+                        width: 60,
+                        type:'combox',
+                        data:[{key:"true",value:"鏄�"},{key:"false",value:"鍚�"}],
+                        templet: function (d) {
+                            return webUtil.formateBoolean(d.qrcodeflag);
+                        }
+                    },
+                    {
+                        title: '蹇呰緭',
+                        field: 'requireflag',
+                        width: 60,
+                        type:'combox',
+                        data:[{key:"true",value:"鏄�"},{key:"false",value:"鍚�"}],
+                        templet: function (d) {
+                            return webUtil.formateBoolean(d.requireflag);
+                        }
+                    },
+                    {
+                        title: '琛ㄥ崟鏄剧ず',
+                        field: 'formdisplayflag',
+                        width: 60,
+                        type:'combox',
+                        data:[{key:"true",value:"鏄�"},{key:"false",value:"鍚�"}],
+                        templet: function (d) {
+                            return webUtil.formateBoolean(d.formdisplayflag);
+                        }
+                    },
+                    {
+                        title: '鍒楄〃鏄剧ず',
+                        field: 'tabledisplayflag',
+                        width: 60,
+                        type:'combox',
+                        data:[{key:"true",value:"鏄�"},{key:"false",value:"鍚�"}],
+                        templet: function (d) {
+                            return webUtil.formateBoolean(d.tabledisplayflag);
+                        }
+                    },
+                    {
+                        title: '鍙',
+                        field: 'readonlyflag',
+                        width: 60,
+                        type:'combox',
+                        data:[{key:"true",value:"鏄�"},{key:"false",value:"鍚�"}],
+                        templet: function (d) {
+                            return webUtil.formateBoolean(d.readonlyflag);
+                        }
+                    },
+                    {
+                        title: '鍒楄〃鎺掑簭',
+                        field: 'sortattrflag',
+                        width: 60,
+                        type:'combox',
+                        data:[{key:"true",value:"鏄�"},{key:"false",value:"鍚�"}],
+                        templet: function (d) {
+                            return webUtil.formateBoolean(d.sortattrflag);
+                        }
+                    },
+                    {
+                        title: '闀垮害',
+                        field: 'controllength',
+                        type:'number',
+                        width: 60
+                    },
+                    {
+                        title: '榛樿鍊�',
+                        field: 'defaultvalue',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '鍓嶇紑',
+                        field: 'prefixvalue',
+                        sort:true,
+                        width: 60
+                    },
+                    {
+                        title: '鍚庣紑',
+                        field: 'suffixvalue',
+                        sort:true,
+                        width: 60
+                    },
+                    {
+                        title: '灏忔暟绮惧害(鍒诲害)',
+                        field: 'precisionlength',
+                        type:'number',
+                        width: 100
+                    },
+                    {
+                        title: '缁勫悎瑙勫垯',
+                        field: 'componentrule',
+                        sort:true,
+                        width: 180
+                    },
+                    {
+                        title: '楠岃瘉瑙勫垯',
+                        field: 'verifyrule',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '鍙栧�艰寖鍥�',
+                        field: 'valuearea',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '鏃堕棿鏍煎紡',
+                        field: 'codedateformat',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '鍒嗙被娉ㄥ叆(灞傜骇/鍚嶇О)',
+                        field: 'classifyinvokelevel',
+                        sort:true,
+                        width: 200
+                    },
+                    {
+                        title: '鏋氫妇娉ㄥ叆',
+                        field: 'enumid',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '鍙傜収閰嶇疆',
+                        field: 'referbtmid',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '琛ㄥ崟鏄剧ず鏍峰紡',
+                        field: 'formdisplaystyle',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '琛ㄦ牸鏄剧ず鏍峰紡',
+                        field: 'tabledisplaystyle',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '琛ㄥ崟瓒呴摼鎺�',
+                        field: 'formhref',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '琛ㄦ牸瓒呴摼鎺�',
+                        field: 'tablehref',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '琛ㄦ牸鏄剧ずjs',
+                        field: 'tabledisplayjs',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '澶氳鏂囨湰',
+                        field: 'textareaflag',
+                        width: 60,
+                        type:'combox',
+                        data:[{key:"true",value:"鏄�"},{key:"false",value:"鍚�"}],
+                        templet: function (d) {
+                            return webUtil.formateBoolean(d.textareaflag);
+                        }
+                    },
+                    {
+                        title: '棰勮鍥�',
+                        field: 'imageflag',
+                        width: 60,
+                        type:'combox',
+                        data:[{key:"true",value:"鏄�"},{key:"false",value:"鍚�"}],
+                        templet: function (d) {
+                            return webUtil.formateBoolean(d.imageflag);
+                        }
+                    },
+                    {
+                        field:'options',
+                        title:'鎿嶄綔',
+                        width: 150,
+                        templet:function(d){
+                            return ['<a class="layui-btn layui-btn-intable" lay-event="UP">涓婄Щ</a>','<a class="layui-btn layui-btn-intable" lay-event="DOWN">涓嬬Щ</a>','<a class="layui-btn layui-btn-intable" lay-event="REM">绉婚櫎</a>'];
+                        }
+                    }];
+            }
+        };
+
+        this.getFormItems = function(onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [
+                {
+                    field: 'classifytemplateoid',
+                    title: '鎵�灞炴ā鏉�',
+                    required: true,
+                    type: 'refer',
+                    showField: 'classifytemplateoidName',
+                    referConfig: {
+                        referBo:'codeclstemplate'
+                    },
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'classifyattributeoid',
+                    title: '鎵�灞炲垎绫讳腑鐨勫睘鎬т富閿�',
+                    required: true,
+                    type: 'refer',
+                    showField: 'classifyattributeoidName',
+                    referConfig: {
+                        referBo:'codeclsattr'
+                    },
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'attributedatatype',
+                    title: '灞炴�х殑绫诲瀷',
+                    required: true,
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'keyattrflag',
+                    title: '鏄惁鍏抽敭灞炴��',
+                    type: 'truefalse',
+                    defaultValue:"false",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'queryattrflag',
+                    title: '鏄惁蹇�熸煡璇㈠睘鎬�',
+                    type: 'truefalse',
+                    defaultValue:"false",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'seniorqueryattrflag',
+                    title: '鏄惁楂樼骇鏌ヨ灞炴��',
+                    type: 'truefalse',
+                    defaultValue:"false",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'samerepeatattrflag',
+                    title: '鐩镐技鏌ラ噸灞炴��',
+                    type: 'truefalse',
+                    defaultValue:"false",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'sortattrflag',
+                    title: '鏄惁鎺掑簭',
+                    type: 'truefalse',
+                    defaultValue:"true",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'qrcodeflag',
+                    title: '鏄惁鐢熸垚浜岀淮鐮�',
+                    type: 'truefalse',
+                    defaultValue:"false",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'barcodeflag',
+                    title: '鏄惁鐢熸垚涓�缁寸爜',
+                    type: 'truefalse',
+                    defaultValue:"false",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'componentrule',
+                    title: '缁勫悎瑙勫垯',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'verifyrule',
+                    title: '楠岃瘉瑙勫垯',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'classifyinvokelevel',
+                    title: '鍒嗙被娉ㄥ叆灞傜骇',
+                    type: 'text',
+                    defaultValue:"none",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'classifyinvokeattr',
+                    title: '鍒嗙被娉ㄥ叆鐨勫睘鎬ц嫳鏂囧悕绉�',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'classifyinvokeattrname',
+                    title: '鍒嗙被娉ㄥ叆鐨勫睘鎬т腑鏂囧悕绉�',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'classifyinvokeeditflag',
+                    title: '鍒嗙被娉ㄥ叆鏄惁鍙互缂栬緫',
+                    type: 'truefalse',
+                    defaultValue:"false",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'ordernum',
+                    title: '鐮佸�煎簭鍙�',
+                    verify: 'number',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'formdisplayflag',
+                    title: '琛ㄥ崟閲屾槸鍚︽樉绀�',
+                    type: 'truefalse',
+                    defaultValue:"true",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'tabledisplayflag',
+                    title: '鍒楄〃閲屾槸鍚︽樉绀�',
+                    type: 'truefalse',
+                    defaultValue:"true",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'attributegroup',
+                    title: '鎵�灞炲睘鎬у垎缁�',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'enumid',
+                    title: '浣跨敤鏋氫妇鑻辨枃缂栧彿',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'enumname',
+                    title: '浣跨敤鏋氫妇涓枃鍚嶇О',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'enumeditflag',
+                    title: '鏋氫妇鏄惁鍙互缂栬緫',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'referbtmid',
+                    title: '鍙傜収鐨勪笟鍔$被鍨嬭嫳鏂囧悕绉�',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'referbtmname',
+                    title: '鍙傜収鐨勪笟鍔$被鍨嬩腑鏂囧悕绉�',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'referconfig',
+                    title: '鍙傜収绐楀彛閰嶇疆',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'requireflag',
+                    title: '鏄惁蹇呰緭',
+                    type: 'truefalse',
+                    defaultValue:"false",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'readonlyflag',
+                    title: '鏄惁鍙',
+                    type: 'truefalse',
+                    defaultValue:"false",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'controllength',
+                    title: '灞炴�ф帶鍒惰緭鍏ョ殑闀垮害',
+                    required: true,
+                    verify: 'number',
+                    defaultValue:"254",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'formdisplaystyle',
+                    title: '琛ㄥ崟閲屾樉绀虹殑鏍峰紡',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'tabledisplaystyle',
+                    title: '琛ㄦ牸閲屾樉绀虹殑鏍峰紡',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'formhref',
+                    title: '琛ㄥ崟涓秴閾炬帴鍐呭',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'tablehref',
+                    title: '琛ㄦ牸涓秴閾炬帴鍐呭',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'precisionlength',
+                    title: '灏忔暟绮惧害',
+                    verify: 'number',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'scalelength',
+                    title: '灏忔暟鍒诲害',
+                    verify: 'number',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'valuearea',
+                    title: '鍙栧�艰寖鍥�',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'codedateformat',
+                    title: '鏃堕棿鏍煎紡',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'tabledisplayjs',
+                    title: '琛ㄦ牸閲屾樉绀鸿皟鐢ㄧ殑js',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'textareaflag',
+                    title: '鏄惁鏄剧ず澶氳鏂囨湰',
+                    type: 'truefalse',
+                    defaultValue:"false",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'imageflag',
+                    title: '棰勮鍥�',
+                    type: 'truefalse',
+                    defaultValue:"false",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'defaultvalue',
+                    title: '榛樿鍊�',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'prefixvalue',
+                    title: '鍓嶇紑',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'suffixvalue',
+                    title: '鍚庣紑',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'filtersourceattr',
+                    title: '閫夋嫨鏁版嵁鏃惰繃婊ょ殑灞炴��',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'filtersourceattrname',
+                    title: '閫夋嫨鏁版嵁鏃惰繃婊ょ殑灞炴�у悕绉�',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                }             ];
+        };
+        this.ADD = function () {
+            var that = this;
+            var table =layui.table;
+            var filter ="refer_attr_" + that.id;
+            var addSaveIndex =webUtil.dialog({
+                title:'浠庡睘鎬ч泦涓�夋嫨',
+                btn:['纭畾閫夋嫨','鍙栨秷'],
+                content:'<table id="table_' + filter + '" lay-filter="' + filter + '"  style="margin-top:5px" ></table>',
+                success:function(layero,layerIndex,classP) {
+                    layui.use('mdm/CodeClassify',function (){
+                        var codeClassify = layui['mdm/CodeClassify'];
+                        codeClassify.checkColumns(true);
+                        var options = {
+                            elem: '#table_' + filter,
+                            id: 'table_' + filter,
+                            backPath:that.backPath,
+                            url: that.url.attrController + that.url.attrRefer,
+                            selectMode:table.selectMode.muti,
+                            cols: [codeClassify.columns]
+                        };
+                        table.render(options);
+                        webUtil.relocationOpen(classP)
+                    });
+                },
+                yes:function(layero){
+
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.EDIT = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            that.addOrEdit(false,oid);
+        };
+        this.addOrEdit = function(add,oid) {
+            var that = this;
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var addSaveIndex =webUtil.dialog({
+                title:add?'娣诲姞涓婚搴撳垎绫荤殑妯℃澘灞炴��':'淇敼涓婚搴撳垎绫荤殑妯℃澘灞炴��',
+                btn:['淇濆瓨','鍙栨秷'],
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getFormItems(false),
+                        function () {
+                            if(!add){
+                                form.load(filter,{
+                                    backPath:that.backPath,
+                                    url:that.url.controller + that.url.getObjectByOid,
+                                    method:'get',
+                                    params:{
+                                        oid:oid
+                                    }
+                                });
+                            }else{
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+                        }, {}, {defaultColumnOneRow: 2, labelWidth: 200});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        var url = that.url.controller + (add?that.url.addSave:that.url.editSave);
+                        webUtil.manualAjax(add?'post':'put',url,JSON.stringify(values),function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts= webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+        this.BATCHEDIT=function (){
+            var that=this;
+            var filter ="fullScreen_" + that.id;
+            var table=layui.table;
+            that.BATCHEDITIndex =layer.open({
+                type:1,
+                title:'妯℃澘灞炴��',
+                content:'<div id="' + filter + '" lay-filter="' + filter + '" style="margin:5px" >'+that.getToolbarHtml(true)+'<table id="table_'+filter+ '" lay-filter="table_'+filter+'" style="overflow-x:auto;"></table></div>',
+                fullScreen:true,
+                closeBtn:0,
+                shadeClose: false,
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    var options = table.getConfig('table_' + that.id);
+                    options.elem = '#table_' + filter
+                    options.id = 'table_' + filter;
+                    options.width='auto';
+                    table.render(options);
+                    webUtil.bindDefultButtonLisenter(that, that.id);
+                }
+            });
+        }
+        this.UNBATCHEDIT=function (){
+            var that=this;
+            layer.close(that.BATCHEDITIndex)
+        }
+        //缁勫悎瑙勫垯
+        this.COMPUSE=function (){
+            layui.use('mdm/CodeClassifyCompuse',function (){
+                var CodeClassifyCompuse=layui['mdm/CodeClassifyCompuse'];
+                CodeClassifyCompuse.showDialog()
+            })
+        }
+        //鏁堥獙瑙勫垯
+        this.VERIFYUSER=function (){
+            var that=this;
+            var form = layui.form;
+            var table = layui.table;
+            var filter ="verifyuser_" + that.id;
+            var html=[
+                '<div class="easyui-layout UIContentLayout"  id="easyuiLayout_',filter,'" data-options="fit:true" style="display:block;overflow-y: hidden;">',
+                    '<div data-options="region:\'west\',split:true" style="width:400px;padding: 5px;">',
+                        '<div>',
+                            '<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                            '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',filter,'" style="margin:0 0 0 110px"><i class="layui-icon layui-icon-ok"></i>妫�鏌�</button>',
+                        '</div>',
+                    '</div>',
+                    '<div data-options="region:\'center\'" style="padding-left: 5px;padding-right: 5px;" id="border_',filter,'">',
+                        '<div class="layui-center" style="overflow-y:auto;">',
+                            '<table class="layui-table" lay-size="sm" lay-even layui-filter="table_' + filter + '" id="table_' + filter + '" ></table>',
+                        '</div>',
+                    '</div>',
+                '</div>'
+            ];
+
+            var verifyuserIndex =webUtil.dialog({
+                title:'灞炴�ф晥楠岃鍒�',
+                btn:['淇濆瓨','鍙栨秷'],
+                content:html.join(''),
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero,layerIndex,classP) {
+                    var easyuiLayout = $('#easyuiLayout_' + filter)
+                    easyuiLayout.css({height: 600, width: 1050})
+                    easyuiLayout.parent().parent().css({margin: '5px'})
+                    easyuiLayout.layout();
+                    form.addItems(filter, [{
+                            field: 'regexp',
+                            title: '姝e垯琛ㄨ揪寮�',
+                            required: true,
+                            type: 'textarea',
+                            textWidth: 240,
+                            textStyle:'height:200px;'
+                        }, {
+                            field: 'content',
+                            title: '娴嬭瘯鍐呭',
+                            type: 'textarea',
+                            textWidth: 240,
+                            textStyle:'height:200px;'
+                        }],
+                        function () {
+                            webUtil.relocationOpen(classP)
+                        }, {}, {labelWidth: 110});
+                    var tableData=[{name:'[\u3000\uff01-\uff5f]+',description:'鍏ㄨ绗﹀彿'},
+                        {name:'[^\u3000\uff01-\uff5f]+',description: '鍗婅绗﹀彿'},
+                        {name:'(([-|+]{1}[\\d]+鈩冿綖[-|+]{1}[\\d]+鈩�)|鏃�)',description: '娓╁害鑼冨洿锛岀ず渚� -55鈩冿綖+125鈩�'},
+                        {name:'[\\d]{15}|[\\d]{18}|[\\d]{17}X',description: '韬唤璇佸彿鐮�(15鎴�18浣嶆暟瀛椼��17浣嶆暟瀛梄) '},
+                        {name:'鐢穦濂硘鐢锋�濂虫��',description: '涓枃鎬у埆'},
+                        {name:'[\\d]+',description: '鏁板瓧'},
+                        {name:'[a-zA-Z]+',description: '瀛楁瘝'},
+                        {name:'[A-Z]+',description: '澶у啓瀛楁瘝'},
+                        {name:'[a-z]+',description: '灏忓啓瀛楁瘝'},
+                        {name:'[0-9a-zA-Z]+',description: '瀛楁瘝銆佹暟瀛楃粍鍚�'},
+                        {name:'((0[\\d]{3}-[\\d]{7})|(0[\\d]{2}-[\\d]{8})|([\\d]{7,8}))',description: '鐢佃瘽鍙风爜'},
+                        {name:'-?[1-9]\\d*',description: '鏁存暟'},
+                        {name:'[1-9]\\d*',description: '姝f暣鏁�'},
+                        {name:'-[1-9]\\d*',description: '璐熸暣鏁�'},
+                        {name:'-[1-9]\\d*|0',description: '闈炴鏁存暟(璐熸暣鏁�+0)'},
+                        {name:'[1-9]\\d*|0',description: '闈炶礋鏁存暟(姝f暣鏁�+0)'},
+                        {name:'-?([1-9]\\d*\\.\\d*|0\\.\\d*[1-9]\\d*|0?\\.0+|0)',description: '娴偣鏁�'},
+                        {name:'[1-9]\\d*\\.\\d*|0\\.\\d*[1-9]\\d*',description: '姝f诞鐐规暟'},
+                        {name:'-[1-9]\\d*\\.\\d*|0\\.\\d*[1-9]\\d*',description: '璐熸诞鐐规暟'},
+                        {name:'[(-([1-9]\\d*\\.\\d*|0\\.\\d*[1-9]\\d*))|0?\\.0+|0',description: '闈炴娴偣鏁帮紙璐熸诞鐐规暟 + 0锛�'},
+                        {name:'[1-9]\\d*\\.\\d*|0\\.\\d*[1-9]\\d*|0?\\.0+|0',description: '闈炶礋娴偣鏁帮紙姝f诞鐐规暟 + 0锛�'},
+                        {name:'x',description: '瀛楃 x'},
+                        {name:'\\\\',description: '鍙嶆枩绾垮瓧绗�'},
+                        {name:'\\0n',description: '甯︽湁鍏繘鍒跺�� 0 鐨勫瓧绗� n (0 <= n <= 7)'},
+                        {name:'\\0nn',description: '甯︽湁鍏繘鍒跺�� 0 鐨勫瓧绗� nn (0 <= n <= 7)'},
+                        {name:'\\0mnn',description: '甯︽湁鍏繘鍒跺�� 0 鐨勫瓧绗� mnn锛�0 <= m <= 3銆�0 <= n <= 7锛�'},
+                        {name:'\\xhh',description: '甯︽湁鍗佸叚杩涘埗鍊� 0x 鐨勫瓧绗� hh'},
+                        {name:'\\uhhhh',description: '甯︽湁鍗佸叚杩涘埗鍊� 0x 鐨勫瓧绗� hhhh'},
+                        {name:'\\t',description: '鍒惰〃绗� (\'\u0009\')'},
+                        {name:'\\n',description: '鏂拌锛堟崲琛岋級绗� (\'\u000A\')'},
+                        {name:'\\r',description: '鍥炶溅绗� (\'\u000D\')'},
+                        {name:'\\f',description: '鎹㈤〉绗� (\'\u000C\')'},
+                        {name:'\\a',description: '鎶ヨ (bell) 绗� (\'\u0007\')'},
+                        {name:'\\e',description: '杞箟绗� (\'\u001B\')'},
+                        {name:'\\cx',description: '瀵瑰簲浜� x 鐨勬帶鍒剁'},
+                        {name:'[abc]',description: 'a銆乥 鎴� c锛堢畝鍗曠被锛�'},
+                        {name:'[^abc]',description: '浠讳綍瀛楃锛岄櫎浜� a銆乥 鎴� c锛堝惁瀹氾級'},
+                        {name:'[a-zA-Z]',description: 'a 鍒� z 鎴� A 鍒� Z锛屼袱澶寸殑瀛楁瘝鍖呮嫭鍦ㄥ唴锛堣寖鍥达級'},
+                        {name:'[a-d[m-p]]',description: 'a 鍒� d 鎴� m 鍒� p锛歔a-dm-p]锛堝苟闆嗭級'},
+                        {name:'[a-z&&[def]]',description: '\td銆乪 鎴� f锛堜氦闆嗭級'},
+                        {name:'[a-z&&[^bc]]',description: 'a 鍒� z锛岄櫎浜� b 鍜� c锛歔ad-z]锛堝噺鍘伙級'},
+                        {name:'[a-z&&[^m-p]]',description: 'a 鍒� z锛岃�岄潪 m 鍒� p锛歔a-lq-z]锛堝噺鍘伙級'},
+                        {name:'.',description: '浠讳綍瀛楃锛堜笌琛岀粨鏉熺鍙兘鍖归厤涔熷彲鑳戒笉鍖归厤锛�'},
+                        {name:'\\d',description: '鏁板瓧锛歔0-9]'},
+                        {name:'\\D',description: '闈炴暟瀛楋細 [^0-9]'},
+                        {name:'\\s',description: '绌虹櫧瀛楃锛歔 \\t\\n\x0B\\f\\r]'},
+                        {name:'\\S',description: '闈炵┖鐧藉瓧绗︼細[^\\s]'},
+                        {name:'\\w',description: '鍗曡瘝瀛楃锛歔a-zA-Z_0-9]'},
+                        {name:'\\W',description: '闈炲崟璇嶅瓧绗︼細[^\\w]'},
+                        {name:'\\p{Lower}',description: '灏忓啓瀛楁瘝瀛楃锛歔a-z]'},
+                        {name:'\\p{Upper}',description: '澶у啓瀛楁瘝瀛楃锛歔A-Z]'},
+                        {name:'\\p{ASCII}',description: '鎵�鏈� ASCII锛歔\x00-\x7F]'},
+                        {name:'\\p{Alpha}',description: '瀛楁瘝瀛楃锛歔\\p{Lower}\\p{Upper}]'},
+                        {name:'\\p{Digit}',description: '鍗佽繘鍒舵暟瀛楋細[0-9]'},
+                        {name:'\\p{Alnum}',description: '瀛楁瘝鏁板瓧瀛楃锛歔\\p{Alpha}\\p{Digit}]'},
+                        {name:'\\p{Punct}',description: '鏍囩偣绗﹀彿锛�!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'},
+                        {name:'\\p{Graph}',description: '鍙瀛楃锛歔\\p{Alnum}\\p{Punct}]'},
+                        {name:'\\p{Print}',description: '鍙墦鍗板瓧绗︼細[\\p{Graph}\x20]'},
+                        {name:'\\p{Blank}',description: '绌烘牸鎴栧埗琛ㄧ锛歔 \\t]'},
+                        {name:'\\p{Cntrl}',description: '鎺у埗瀛楃锛歔\x00-\x1F\x7F]'},
+                        {name:'\\p{XDigit}',description: '鍗佸叚杩涘埗鏁板瓧锛歔0-9a-fA-F]'},
+                        {name:'\\p{Space}',description: '绌虹櫧瀛楃锛歔 \\t\\n\x0B\\f\\r]'},
+                        {name:'\\p{javaLowerCase}',description: '绛夋晥浜� java.lang.Character.isLowerCase()'},
+                        {name:'\\p{javaUpperCase}',description: '绛夋晥浜� java.lang.Character.isUpperCase()'},
+                        {name:'\\p{javaWhitespace}',description: '绛夋晥浜� java.lang.Character.isWhitespace()'},
+                        {name:'\\p{javaMirrored}',description: '绛夋晥浜� java.lang.Character.isMirrored()'},
+                        {name:'\\p{InGreek}',description: 'Greek 鍧楋紙绠�鍗曞潡锛変腑鐨勫瓧绗�'},
+                        {name:'\\p{Lu}',description: '澶у啓瀛楁瘝锛堢畝鍗曠被鍒級'},
+                        {name:'\\p{Sc}',description: '璐у竵绗﹀彿'},
+                        {name:'\\P{InGreek}',description: '鎵�鏈夊瓧绗︼紝Greek 鍧椾腑鐨勯櫎澶栵紙鍚﹀畾锛�'},
+                        {name:'[\\p{L}&&[^\\p{Lu}]]',description: '鎵�鏈夊瓧姣嶏紝澶у啓瀛楁瘝闄ゅ锛堝噺鍘伙級'},
+                        {name:'^',description: '琛岀殑寮�澶�'},
+                        {name:'$',description: '琛岀殑缁撳熬'},
+                        {name:'\\b',description: '鍗曡瘝杈圭晫'},
+                        {name:'\\B',description: '闈炲崟璇嶈竟鐣�'},
+                        {name:'\\A',description: '杈撳叆鐨勫紑澶�'},
+                        {name:'\\G',description: '涓婁竴涓尮閰嶇殑缁撳熬'},
+                        {name:'\\Z',description: '杈撳叆鐨勭粨灏撅紝浠呯敤浜庢渶鍚庣殑缁撴潫绗︼紙濡傛灉鏈夌殑璇濓級'},
+                        {name:'\\z',description: '杈撳叆鐨勭粨灏�'},
+                        {name:'X ?',description: 'X锛屼竴娆℃垨涓�娆′篃娌℃湁'},
+                        {name:'X *',description: 'X锛岄浂娆℃垨澶氭'},
+                        {name:'X +',description: 'X锛屼竴娆℃垨澶氭'},
+                        {name:'X {n }',description: 'X锛屾伆濂� n 娆�'},
+                        {name:'X {n ,}',description: 'X锛岃嚦灏� n 娆�'},
+                        {name:'X {n ,m }',description: 'X锛岃嚦灏� n 娆★紝浣嗘槸涓嶈秴杩� m 娆�'},
+                        {name:'X ??',description: 'X锛屼竴娆℃垨涓�娆′篃娌℃湁'},
+                        {name:'X *?',description: 'X锛岄浂娆℃垨澶氭'},
+                        {name:'X +?',description: 'X锛屼竴娆℃垨澶氭'},
+                        {name:'X {n }?',description: 'X锛屾伆濂� n 娆�'},
+                        {name:'X {n ,}?',description: 'X锛岃嚦灏� n 娆�'},
+                        {name:'X {n ,m }?',description: 'X锛岃嚦灏� n 娆★紝浣嗘槸涓嶈秴杩� m 娆�'},
+                        {name:'X ?+',description: 'X锛屼竴娆℃垨涓�娆′篃娌℃湁'},
+                        {name:'X *+',description: 'X锛岄浂娆℃垨澶氭'},
+                        {name:'X ++',description: 'X锛屼竴娆℃垨澶氭'},
+                        {name:'X {n }+',description: 'X锛屾伆濂� n 娆�'},
+                        {name:'X {n ,}+',description: 'X锛岃嚦灏� n 娆�'},
+                        {name:'X {n ,m }+',description: 'X锛岃嚦灏� n 娆★紝浣嗘槸涓嶈秴杩� m 娆�'},
+                        {name:'XY',description: 'X 鍚庤窡 Y'},
+                        {name:'X |Y',description: 'X 鎴� Y'},
+                        {name:'(X )',description: 'X锛屼綔涓烘崟鑾风粍'},
+                        {name:'\\n',description: '浠讳綍鍖归厤鐨� n<sup>th</sup> 鎹曡幏缁�'},
+                        {name:'\\',description: 'Nothing锛屼絾鏄紩鐢ㄤ互涓嬪瓧绗�'},
+                        {name:'\\Q',description: 'Nothing锛屼絾鏄紩鐢ㄦ墍鏈夊瓧绗︼紝鐩村埌 \\E'},
+                        {name:'\\E',description: 'Nothing锛屼絾鏄粨鏉熶粠 \\Q 寮�濮嬬殑寮曠敤'},
+                        {name:'(?:X )',description: 'X锛屼綔涓洪潪鎹曡幏缁�'},
+                        {name:'(?idmsux-idmsux)',description: 'Nothing锛屼絾鏄皢鍖归厤鏍囧織鐢� on 杞负 off'},
+                        {name:'(?idmsux-idmsux:X )',description: 'X锛屼綔涓哄甫鏈夌粰瀹氭爣蹇� on - off 鐨勯潪鎹曡幏缁�'},
+                        {name:'(?=X )',description: 'X锛岄�氳繃闆跺搴︾殑姝� lookahead'},
+                        {name:'(?!X )',description: 'X锛岄�氳繃闆跺搴︾殑璐� lookahead'},
+                        {name:'(?<=X )',description: 'X锛岄�氳繃闆跺搴︾殑姝� lookbehind'},
+                        {name:'(?<!X )',description: 'X锛岄�氳繃闆跺搴︾殑璐� lookbehind'},
+                        {name:'(?>X )',description: 'X锛屼綔涓虹嫭绔嬬殑闈炴崟鑾风粍'}
+                    ]
+                    table.render({
+                        elem: '#table_' + filter,
+                        id: 'table_' + filter,
+                        height:585,
+                        limit: -1,
+                        cols: [[{
+                            field: 'name',
+                            title: '琛ㄨ揪寮�',
+                            width: 300
+                        },{
+                            field: 'description',
+                            title: '浣跨敤璇存槑',
+                            width: 310
+                        }]],
+                        data:tableData,
+                        done:function(res,cur,total){
+                        },
+                        rowDBLClick:function (thisTableFilter, record) {
+                            var regexpValue=form.getValues(filter).regexp;
+                            regexpValue+=record.name
+                            form.setValues({regexp:regexpValue},filter);
+                        }
+                    });
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        layer.close(verifyuserIndex);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(verifyuserIndex);
+                }
+            });
+        }
+        this.refreshCLF = function () {
+            var that = this;
+            var tree = layui.tree;
+            tree.reload("tree_" + that.id);
+        };
+        this.refresh = function () {
+            var that = this;
+            layui.table.reload("table_" + that.id);
+            layui.table.reload("table_fullScreen_" + that.id);
+        };
+
+        this.refreshTEMP = function () {
+            var that = this;
+            layui.table.reload("temp_" + that.id);
+        };
+        this.ADVQUERY = function () {
+            var that = this;
+            if(!that.serinorQueryInstance) {
+                var dynamicCondition = layui.dynamicCondition;
+                $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar' + that.id + '" class="layui-inline"></div>');
+                that.checkColumns();
+                var dataFields = [];
+                for(var i = 0 ; i < that.columns.length ; i ++){
+                    dataFields[i] = that.columns[i];
+                }
+                that.serinorQueryInstance = dynamicCondition.create({
+                    fields: dataFields//鏌ヨ瀛楁
+                    , tableId: "table_" + that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                    , type: "complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                    , queryCallBack: function (requestData) {//鏌ヨ涔嬪悗鐨刢allback
+
+                    }
+                });
+            }
+            that.serinorQueryInstance.open();
+        };
+        this.ADDTEMP = function () {
+            var that = this;
+            that.addOrEditTEMP(true);
+        };
+        this.EDITTEMP = function(){
+            var that = this;
+            if(webUtil.isNull(that.currentItemOid)){
+                webUtil.showErrorMsg("璇峰厛浠庢爲涓婇�夋嫨涓�鏉℃暟鎹�");
+                return false;
+            }
+            that.addOrEditTEMP(false,that.currentItemOid);
+        };
+        this.addOrEditTEMP = function(add,oid) {
+            var that = this;
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var addSaveIndex =webUtil.dialog({
+                title:add?'娣诲姞妯℃澘':'淇敼妯℃澘',
+                btn:['淇濆瓨','鍙栨秷'],
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero,layerIndex,classP) {
+                    form.addItems(filter,that.getFormTempItems(false),
+                        function () {
+                            if(!add){
+                                form.load(filter,{
+                                    backPath:that.backPath,
+                                    url:that.url.tempController + that.url.getObjectByOidTemp,
+                                    method:'get',
+                                    params:{
+                                        oid:oid
+                                    }
+                                });
+                            }else{
+                                var defaultValues = {};
+                                if(that.currentItemAttributes) {
+                                    defaultValues["codeClassifyOid"] = that.currentItemOid;
+                                    defaultValues["codeClassifyOid" + "name"] = that.currentItemAttributes.name;
+                                }
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+
+                            webUtil.relocationOpen(classP)
+                        }, {}, {defaultColumnOneRow: 2});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        var url = that.url.tempController + (add?that.url.addSaveTemp:that.url.editSaveTemp);
+                        webUtil.manualAjax(add?'post':'put',url,JSON.stringify(values),function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.getFormTempItems = function(onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [{
+                field: 'id',
+                title: '妯℃澘缂栧彿',
+                required: true
+            },{
+                field: 'name',
+                title: '妯℃澘鍚嶇О',
+                required: true
+            },{
+                field: 'description',
+                title: '鎻忚堪',
+                inputWidth:475,
+                type:'textarea'
+            }];
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/vciweb/mdm/CodeClassifyTemplateButton.js b/Source/platformProject/platform2022UI/vciweb/mdm/CodeClassifyTemplateButton.js
new file mode 100644
index 0000000..fec882e
--- /dev/null
+++ b/Source/platformProject/platform2022UI/vciweb/mdm/CodeClassifyTemplateButton.js
@@ -0,0 +1,305 @@
+/**
+ * 涓婚搴撻噷妯℃澘鍖呭惈鐨勬寜閽〉闈�
+ * @author weidy
+ * @date 2022-01-24
+ */
+layui.define(['layer','element','form','table','dynamicCondition' ],function(exports){
+        var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "mdm/CodeClassifyTemplateButton";
+        this.moduleKey = "CodeClassifyTemplateButton";
+        this.backPath =  configData.compatibility? path:configData.mdmService;
+        this.url = {
+            controller:'codeClsTempButtonController/',
+            dataGrid:'gridCodeClassifyTemplateButton',
+            addSave:'addSave',
+            editSave:'editSave',
+            deleteUrl:'deleteData',
+            getObjectByOid:'getObjectByOid'
+        };
+        this.getContent=function(){
+            var that = this;
+            var html = "";
+            html = [
+                '<div class="layui-layout" style="display:block;overflow-y: hidden">',
+                    '<div class="layui-layout-border" style="display:block;margin-top:0px; " id="border_',that.id,'">',
+                        '<div class="layui-center" style="overflow-y:auto;">',
+                            that.getToolbarHtml(),
+                            '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                        '</div>',
+                    '</div>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.createSearchHtml({id:"缂栧彿",name:"鍚嶇О"} ,$("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+        };
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            that.initMainTable();
+            that.createSearchHtml();
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var tableWidth = $("#border_" + that.id).width()-225;
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                width:tableWidth,
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                method:'get',
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'EDIT'){
+                                that.addOrEdit(false,data.oid);
+                            }
+                        });
+                    }else{
+                        if(total>0) {
+                            table.selectRecord('table_' + that.id, {index:0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                }
+            };
+            if(parentFieldName){
+                options.treeConfig = {
+                    treepid:parentFieldName,
+                    treeid:'id',
+                    showField:'name'
+                };
+            }
+            table.render(options);
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),
+                    {
+                        title: '鎵�灞炴ā鏉�',
+                        field: 'classifytemplateoidName',
+                        sort:true,
+                        sortField:'classifytemplateoid',
+                        type:'refer',
+                        referConfig: {
+                            referBo:'codeclstemplate'
+                        },
+                        width: 150
+                    },
+                    {
+                        title: '鎸夐挳鐨勪富閿�',
+                        field: 'classifybuttonoidName',
+                        sort:true,
+                        sortField:'classifybuttonoid',
+                        type:'refer',
+                        referConfig: {
+                            referBo:'codebutton'
+                        },
+                        width: 150
+                    },
+                    {
+                        title: '鎸夐挳鐢ㄩ��',
+                        field: 'buttonuse',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '鐮佸�煎簭鍙�',
+                        field: 'ordernum',
+                        type:'number',
+                        width: 100
+                    },
+                    {
+                        field:'options',
+                        title:'鎿嶄綔',
+                        templet:function(d){
+                            return '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>';
+                        }
+                    }];
+            }
+        };
+
+        this.getFormItems = function(onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [
+                {
+                    field: 'classifytemplateoid',
+                    title: '鎵�灞炴ā鏉�',
+                    required: true,
+                    type: 'refer',
+                    showField: 'classifytemplateoidName',
+                    referConfig: {
+                        referBo:'codeclstemplate'
+                    },
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'classifybuttonoid',
+                    title: '鎸夐挳鐨勪富閿�',
+                    required: true,
+                    type: 'refer',
+                    showField: 'classifybuttonoidName',
+                    referConfig: {
+                        referBo:'codebutton'
+                    },
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'buttonuse',
+                    title: '鎸夐挳鐢ㄩ��',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'ordernum',
+                    title: '鐮佸�煎簭鍙�',
+                    verify: 'number',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                }             ];
+        };
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            that.addOrEdit(false,oid);
+        };
+        this.addOrEdit = function(add,oid) {
+            var that = this;
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var addSaveIndex =webUtil.dialog({
+                title:add?'娣诲姞涓婚搴撻噷妯℃澘鍖呭惈鐨勬寜閽�':'淇敼涓婚搴撻噷妯℃澘鍖呭惈鐨勬寜閽�',
+                btn:['淇濆瓨','鍙栨秷'],
+                skin:'layui-layer-lan',
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getFormItems(false),
+                        function () {
+                            if(!add){
+                                form.load(filter,{
+                                    backPath:that.backPath,
+                                    url:that.url.controller + that.url.getObjectByOid,
+                                    method:'get',
+                                    params:{
+                                        oid:oid
+                                    }
+                                });
+                            }else{
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+                        }, {}, {defaultColumnOneRow: 2});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        var url = that.url.controller + (add?that.url.addSave:that.url.editSave);
+                        webUtil.manualAjax(add?'post':'put',url,JSON.stringify(values),function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts= webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+        this.refresh = function () {
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+        this.ADVQUERY = function () {
+            var that = this;
+            if(!that.serinorQueryInstance) {
+                var dynamicCondition = layui.dynamicCondition;
+                $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar' + that.id + '" class="layui-inline"></div>');
+                that.checkColumns();
+                var dataFields = [];
+                for(var i = 0 ; i < that.columns.length ; i ++){
+                    dataFields[i] = that.columns[i];
+                }
+                that.serinorQueryInstance = dynamicCondition.create({
+                    fields: dataFields//鏌ヨ瀛楁
+                    , tableId: "table_" + that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                    , type: "complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                    , queryCallBack: function (requestData) {//鏌ヨ涔嬪悗鐨刢allback
+
+                    }
+                });
+            }
+            that.serinorQueryInstance.open();
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/vciweb/mdm/CodeClassifyVerifyUser.js b/Source/platformProject/platform2022UI/vciweb/mdm/CodeClassifyVerifyUser.js
new file mode 100644
index 0000000..3f4db16
--- /dev/null
+++ b/Source/platformProject/platform2022UI/vciweb/mdm/CodeClassifyVerifyUser.js
@@ -0,0 +1,265 @@
+/**
+ * 妯℃澘灞炴�ф晥楠岃鍒�
+ * @author wangting
+ * @date 2022-2-21
+ */
+layui.define(['layer','element','form','table','dynamicCondition' ,'tree'],function(exports){
+    var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "mdm/CodeClassifyVerifyUser";
+        this.moduleKey = "CodeClassifyVerifyUser";
+        this.id = "CodeClassifyVerifyUser";
+        this.backPath =  configData.compatibility? path:configData.mdmService;
+        this.url = {
+            controller:'codeClassifyController/'
+        };
+        this.getContent=function(){
+            var that = this;
+            var filter = "verifyuser_" + that.id;
+            var html=[
+                '<div class="easyui-layout UIContentLayout"  id="easyuiLayout_', filter, '" data-options="fit:true" style="display:block;overflow-y: hidden;">',
+                    '<div data-options="region:\'west\',split:true" style="width:400px;padding: 5px;">',
+                        '<div>',
+                            '<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                            '<div class="checkMsg_', filter, '" style="margin:-10px 0 10px 110px"></div>',
+                                '<button class="layui-btn layui-btn-sm toolbar_', filter, '_check" style="margin:0 0 0 110px"><i class="layui-icon layui-icon-ok"></i>妫�鏌�</button>',
+                                '<button class="layui-btn layui-btn-sm toolbar_', filter, '_chear">娓呯┖鍐呭</button>',
+                                '<button class="layui-btn layui-btn-sm toolbar_',filter,'_add">&nbsp;纭畾&nbsp;</button>',
+                            '</div>',
+                        '</div>',
+                    '<div data-options="region:\'center\'" style="padding-left: 5px;padding-right: 5px;" id="border_', filter, '">',
+                        '<div class="layui-center" style="overflow-y:auto;">',
+                            '<table class="layui-table" lay-size="sm" lay-even lay-filter="table_' + filter + '" id="table_' + filter + '" ></table>',
+                        '</div>',
+                    '</div>',
+                '</div>'
+            ]
+            return html.join('');
+        };
+        this.init=function(){
+        };
+
+        this.showReferDialog=function (options){
+            var that=this;
+            if(!options){
+                options={}
+            }
+            if(options.id){
+                that.id=options.id
+            }
+            var target = options.target;
+            var form = layui.form;
+            var table = layui.table;
+            var filter = "verifyuser_" + that.id;
+            var verifyuserIndex = webUtil.dialog({
+                title: '灞炴�ч獙璇佽鍒�',
+                btn: [],
+                content: that.getContent(),
+                resizing: function (layero) {
+                    form.doResize(filter);
+                },
+                success: function (layero, layerIndex, classP) {
+                    var easyuiLayout = $('#easyuiLayout_' + filter)
+                    easyuiLayout.css({height: 600, width: 1050})
+                    easyuiLayout.parent().parent().css({margin: '5px'})
+                    easyuiLayout.layout();
+                    form.addItems(filter, [{
+                            field: 'regexp',
+                            title: '姝e垯琛ㄨ揪寮�',
+                            type: 'textarea',
+                            textWidth: 240,
+                            textStyle: 'height:200px;'
+                        }, {
+                            field: 'content',
+                            title: '娴嬭瘯鍐呭',
+                            type: 'textarea',
+                            textWidth: 240,
+                            textStyle: 'height:200px;'
+                        }],
+                        function () {
+                            form.setValues({regexp: options.value}, filter)
+                            webUtil.relocationOpen(classP)
+                        }, {}, {labelWidth: 110});
+                    var tableData = that.getTableData()
+                    table.render({
+                        elem: '#table_' + filter,
+                        id: 'table_' + filter,
+                        height: 585,
+                        limit: -1,
+                        cols: [[{
+                            field: 'name',
+                            title: '琛ㄨ揪寮�',
+                            width: 300
+                        }, {
+                            field: 'description',
+                            title: '浣跨敤璇存槑',
+                            width: 310
+                        }]],
+                        data: tableData,
+                        done: function (res, cur, total) {
+                        },
+                        rowDBLClick: function (thisTableFilter, record) {
+                            var regexpValue = form.getValues(filter).regexp;
+                            regexpValue += record.name
+                            form.setValues({regexp: regexpValue}, filter);
+                        }
+                    });
+
+                    //娓呴櫎鍐呭
+                    $('.toolbar_' + filter + '_chear').click(function () {
+                        form.setValues({content: '',regexp:''}, filter);
+                        $('.checkMsg_' + filter).text('')
+                    })
+                    //楠岃瘉
+                    $('.toolbar_' + filter + '_check').click(function () {
+                        var values = form.getValues(filter);
+                        if (values.regexp == '') {
+                            $('.checkMsg_' + filter).text('姝e垯琛ㄨ揪寮忎负绌�').css({color: 'red'})
+                            return;
+                        }
+                        if(values.content=='') {
+                            $('.checkMsg_' + filter).text('娴嬭瘯鍐呭涓虹┖').css({color: 'red'})
+                            return;
+                        }
+                        var reg = new RegExp(values.regexp);
+                        if (reg.test(values.content)) {
+                            $('.checkMsg_' + filter).text('妫�鏌ラ�氳繃').css({color: 'green'})
+                        } else {
+                            $('.checkMsg_' + filter).text('鏁堥獙澶辫触').css({color: 'red'})
+                        }
+                    })
+                    //纭畾
+                    $('.toolbar_'+filter+'_add').click(function (){
+                        if (form.validata(filter)) {
+                            var values = form.getValues(filter, true);
+                            target.setValue(options.filter,options.name,values.regexp,values.regexp,true);
+                            layer.close(verifyuserIndex);
+                        }
+                    })
+                }
+            });
+        }
+        this.getTableData=function (){
+            return [{name: '[\u3000\uff01-\uff5f]+', description: '鍏ㄨ绗﹀彿'},
+                {name: '[^\u3000\uff01-\uff5f]+', description: '鍗婅绗﹀彿'},
+                {name: '(([-|+]{1}[\\d]+鈩冿綖[-|+]{1}[\\d]+鈩�)|鏃�)', description: '娓╁害鑼冨洿锛岀ず渚� -55鈩冿綖+125鈩�'},
+                {name: '[\\d]{15}|[\\d]{18}|[\\d]{17}X', description: '韬唤璇佸彿鐮�(15鎴�18浣嶆暟瀛椼��17浣嶆暟瀛梄) '},
+                {name: '鐢穦濂硘鐢锋�濂虫��', description: '涓枃鎬у埆'},
+                {name: '[\\d]+', description: '鏁板瓧'},
+                {name: '[a-zA-Z]+', description: '瀛楁瘝'},
+                {name: '[A-Z]+', description: '澶у啓瀛楁瘝'},
+                {name: '[a-z]+', description: '灏忓啓瀛楁瘝'},
+                {name: '[0-9a-zA-Z]+', description: '瀛楁瘝銆佹暟瀛楃粍鍚�'},
+                {name: '((0[\\d]{3}-[\\d]{7})|(0[\\d]{2}-[\\d]{8})|([\\d]{7,8}))', description: '鐢佃瘽鍙风爜'},
+                {name: '-?[1-9]\\d*', description: '鏁存暟'},
+                {name: '[1-9]\\d*', description: '姝f暣鏁�'},
+                {name: '-[1-9]\\d*', description: '璐熸暣鏁�'},
+                {name: '-[1-9]\\d*|0', description: '闈炴鏁存暟(璐熸暣鏁�+0)'},
+                {name: '[1-9]\\d*|0', description: '闈炶礋鏁存暟(姝f暣鏁�+0)'},
+                {name: '-?([1-9]\\d*\\.\\d*|0\\.\\d*[1-9]\\d*|0?\\.0+|0)', description: '娴偣鏁�'},
+                {name: '[1-9]\\d*\\.\\d*|0\\.\\d*[1-9]\\d*', description: '姝f诞鐐规暟'},
+                {name: '-[1-9]\\d*\\.\\d*|0\\.\\d*[1-9]\\d*', description: '璐熸诞鐐规暟'},
+                {name: '[(-([1-9]\\d*\\.\\d*|0\\.\\d*[1-9]\\d*))|0?\\.0+|0', description: '闈炴娴偣鏁帮紙璐熸诞鐐规暟 + 0锛�'},
+                {name: '[1-9]\\d*\\.\\d*|0\\.\\d*[1-9]\\d*|0?\\.0+|0', description: '闈炶礋娴偣鏁帮紙姝f诞鐐规暟 + 0锛�'},
+                {name: 'x', description: '瀛楃 x'},
+                {name: '\\\\', description: '鍙嶆枩绾垮瓧绗�'},
+                {name: '\\0n', description: '甯︽湁鍏繘鍒跺�� 0 鐨勫瓧绗� n (0 <= n <= 7)'},
+                {name: '\\0nn', description: '甯︽湁鍏繘鍒跺�� 0 鐨勫瓧绗� nn (0 <= n <= 7)'},
+                {name: '\\0mnn', description: '甯︽湁鍏繘鍒跺�� 0 鐨勫瓧绗� mnn锛�0 <= m <= 3銆�0 <= n <= 7锛�'},
+                {name: '\\xhh', description: '甯︽湁鍗佸叚杩涘埗鍊� 0x 鐨勫瓧绗� hh'},
+                {name: '\\uhhhh', description: '甯︽湁鍗佸叚杩涘埗鍊� 0x 鐨勫瓧绗� hhhh'},
+                {name: '\\t', description: '鍒惰〃绗� (\'\u0009\')'},
+                {name: '\\n', description: '鏂拌锛堟崲琛岋級绗� (\'\u000A\')'},
+                {name: '\\r', description: '鍥炶溅绗� (\'\u000D\')'},
+                {name: '\\f', description: '鎹㈤〉绗� (\'\u000C\')'},
+                {name: '\\a', description: '鎶ヨ (bell) 绗� (\'\u0007\')'},
+                {name: '\\e', description: '杞箟绗� (\'\u001B\')'},
+                {name: '\\cx', description: '瀵瑰簲浜� x 鐨勬帶鍒剁'},
+                {name: '[abc]', description: 'a銆乥 鎴� c锛堢畝鍗曠被锛�'},
+                {name: '[^abc]', description: '浠讳綍瀛楃锛岄櫎浜� a銆乥 鎴� c锛堝惁瀹氾級'},
+                {name: '[a-zA-Z]', description: 'a 鍒� z 鎴� A 鍒� Z锛屼袱澶寸殑瀛楁瘝鍖呮嫭鍦ㄥ唴锛堣寖鍥达級'},
+                {name: '[a-d[m-p]]', description: 'a 鍒� d 鎴� m 鍒� p锛歔a-dm-p]锛堝苟闆嗭級'},
+                {name: '[a-z&&[def]]', description: '\td銆乪 鎴� f锛堜氦闆嗭級'},
+                {name: '[a-z&&[^bc]]', description: 'a 鍒� z锛岄櫎浜� b 鍜� c锛歔ad-z]锛堝噺鍘伙級'},
+                {name: '[a-z&&[^m-p]]', description: 'a 鍒� z锛岃�岄潪 m 鍒� p锛歔a-lq-z]锛堝噺鍘伙級'},
+                {name: '.', description: '浠讳綍瀛楃锛堜笌琛岀粨鏉熺鍙兘鍖归厤涔熷彲鑳戒笉鍖归厤锛�'},
+                {name: '\\d', description: '鏁板瓧锛歔0-9]'},
+                {name: '\\D', description: '闈炴暟瀛楋細 [^0-9]'},
+                {name: '\\s', description: '绌虹櫧瀛楃锛歔 \\t\\n\x0B\\f\\r]'},
+                {name: '\\S', description: '闈炵┖鐧藉瓧绗︼細[^\\s]'},
+                {name: '\\w', description: '鍗曡瘝瀛楃锛歔a-zA-Z_0-9]'},
+                {name: '\\W', description: '闈炲崟璇嶅瓧绗︼細[^\\w]'},
+                {name: '\\p{Lower}', description: '灏忓啓瀛楁瘝瀛楃锛歔a-z]'},
+                {name: '\\p{Upper}', description: '澶у啓瀛楁瘝瀛楃锛歔A-Z]'},
+                {name: '\\p{ASCII}', description: '鎵�鏈� ASCII锛歔\x00-\x7F]'},
+                {name: '\\p{Alpha}', description: '瀛楁瘝瀛楃锛歔\\p{Lower}\\p{Upper}]'},
+                {name: '\\p{Digit}', description: '鍗佽繘鍒舵暟瀛楋細[0-9]'},
+                {name: '\\p{Alnum}', description: '瀛楁瘝鏁板瓧瀛楃锛歔\\p{Alpha}\\p{Digit}]'},
+                {name: '\\p{Punct}', description: '鏍囩偣绗﹀彿锛�!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'},
+                {name: '\\p{Graph}', description: '鍙瀛楃锛歔\\p{Alnum}\\p{Punct}]'},
+                {name: '\\p{Print}', description: '鍙墦鍗板瓧绗︼細[\\p{Graph}\x20]'},
+                {name: '\\p{Blank}', description: '绌烘牸鎴栧埗琛ㄧ锛歔 \\t]'},
+                {name: '\\p{Cntrl}', description: '鎺у埗瀛楃锛歔\x00-\x1F\x7F]'},
+                {name: '\\p{XDigit}', description: '鍗佸叚杩涘埗鏁板瓧锛歔0-9a-fA-F]'},
+                {name: '\\p{Space}', description: '绌虹櫧瀛楃锛歔 \\t\\n\x0B\\f\\r]'},
+                {name: '\\p{javaLowerCase}', description: '绛夋晥浜� java.lang.Character.isLowerCase()'},
+                {name: '\\p{javaUpperCase}', description: '绛夋晥浜� java.lang.Character.isUpperCase()'},
+                {name: '\\p{javaWhitespace}', description: '绛夋晥浜� java.lang.Character.isWhitespace()'},
+                {name: '\\p{javaMirrored}', description: '绛夋晥浜� java.lang.Character.isMirrored()'},
+                {name: '\\p{InGreek}', description: 'Greek 鍧楋紙绠�鍗曞潡锛変腑鐨勫瓧绗�'},
+                {name: '\\p{Lu}', description: '澶у啓瀛楁瘝锛堢畝鍗曠被鍒級'},
+                {name: '\\p{Sc}', description: '璐у竵绗﹀彿'},
+                {name: '\\P{InGreek}', description: '鎵�鏈夊瓧绗︼紝Greek 鍧椾腑鐨勯櫎澶栵紙鍚﹀畾锛�'},
+                {name: '[\\p{L}&&[^\\p{Lu}]]', description: '鎵�鏈夊瓧姣嶏紝澶у啓瀛楁瘝闄ゅ锛堝噺鍘伙級'},
+                {name: '^', description: '琛岀殑寮�澶�'},
+                {name: '$', description: '琛岀殑缁撳熬'},
+                {name: '\\b', description: '鍗曡瘝杈圭晫'},
+                {name: '\\B', description: '闈炲崟璇嶈竟鐣�'},
+                {name: '\\A', description: '杈撳叆鐨勫紑澶�'},
+                {name: '\\G', description: '涓婁竴涓尮閰嶇殑缁撳熬'},
+                {name: '\\Z', description: '杈撳叆鐨勭粨灏撅紝浠呯敤浜庢渶鍚庣殑缁撴潫绗︼紙濡傛灉鏈夌殑璇濓級'},
+                {name: '\\z', description: '杈撳叆鐨勭粨灏�'},
+                {name: 'X ?', description: 'X锛屼竴娆℃垨涓�娆′篃娌℃湁'},
+                {name: 'X *', description: 'X锛岄浂娆℃垨澶氭'},
+                {name: 'X +', description: 'X锛屼竴娆℃垨澶氭'},
+                {name: 'X {n }', description: 'X锛屾伆濂� n 娆�'},
+                {name: 'X {n ,}', description: 'X锛岃嚦灏� n 娆�'},
+                {name: 'X {n ,m }', description: 'X锛岃嚦灏� n 娆★紝浣嗘槸涓嶈秴杩� m 娆�'},
+                {name: 'X ??', description: 'X锛屼竴娆℃垨涓�娆′篃娌℃湁'},
+                {name: 'X *?', description: 'X锛岄浂娆℃垨澶氭'},
+                {name: 'X +?', description: 'X锛屼竴娆℃垨澶氭'},
+                {name: 'X {n }?', description: 'X锛屾伆濂� n 娆�'},
+                {name: 'X {n ,}?', description: 'X锛岃嚦灏� n 娆�'},
+                {name: 'X {n ,m }?', description: 'X锛岃嚦灏� n 娆★紝浣嗘槸涓嶈秴杩� m 娆�'},
+                {name: 'X ?+', description: 'X锛屼竴娆℃垨涓�娆′篃娌℃湁'},
+                {name: 'X *+', description: 'X锛岄浂娆℃垨澶氭'},
+                {name: 'X ++', description: 'X锛屼竴娆℃垨澶氭'},
+                {name: 'X {n }+', description: 'X锛屾伆濂� n 娆�'},
+                {name: 'X {n ,}+', description: 'X锛岃嚦灏� n 娆�'},
+                {name: 'X {n ,m }+', description: 'X锛岃嚦灏� n 娆★紝浣嗘槸涓嶈秴杩� m 娆�'},
+                {name: 'XY', description: 'X 鍚庤窡 Y'},
+                {name: 'X |Y', description: 'X 鎴� Y'},
+                {name: '(X )', description: 'X锛屼綔涓烘崟鑾风粍'},
+                {name: '\\n', description: '浠讳綍鍖归厤鐨� n<sup>th</sup> 鎹曡幏缁�'},
+                {name: '\\', description: 'Nothing锛屼絾鏄紩鐢ㄤ互涓嬪瓧绗�'},
+                {name: '\\Q', description: 'Nothing锛屼絾鏄紩鐢ㄦ墍鏈夊瓧绗︼紝鐩村埌 \\E'},
+                {name: '\\E', description: 'Nothing锛屼絾鏄粨鏉熶粠 \\Q 寮�濮嬬殑寮曠敤'},
+                {name: '(?:X )', description: 'X锛屼綔涓洪潪鎹曡幏缁�'},
+                {name: '(?idmsux-idmsux)', description: 'Nothing锛屼絾鏄皢鍖归厤鏍囧織鐢� on 杞负 off'},
+                {name: '(?idmsux-idmsux:X )', description: 'X锛屼綔涓哄甫鏈夌粰瀹氭爣蹇� on - off 鐨勯潪鎹曡幏缁�'},
+                {name: '(?=X )', description: 'X锛岄�氳繃闆跺搴︾殑姝� lookahead'},
+                {name: '(?!X )', description: 'X锛岄�氳繃闆跺搴︾殑璐� lookahead'},
+                {name: '(?<=X )', description: 'X锛岄�氳繃闆跺搴︾殑姝� lookbehind'},
+                {name: '(?<!X )', description: 'X锛岄�氳繃闆跺搴︾殑璐� lookbehind'},
+                {name: '(?>X )', description: 'X锛屼綔涓虹嫭绔嬬殑闈炴崟鑾风粍'}
+            ]
+        }
+        this.refresh = function (buttonid,ele) {
+        };
+        this.ADVQUERY = function () {
+            var that = this;
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/vciweb/mdm/CodeGroupExportRule.js b/Source/platformProject/platform2022UI/vciweb/mdm/CodeGroupExportRule.js
new file mode 100644
index 0000000..cdff4b3
--- /dev/null
+++ b/Source/platformProject/platform2022UI/vciweb/mdm/CodeGroupExportRule.js
@@ -0,0 +1,618 @@
+/**
+ * 闆嗗洟鐮佸鍏ユ槧灏勯〉闈�
+ * @author lihang
+ * @date 2022-03-10
+ */
+layui.define(['layer', 'element', 'form', 'table', 'dynamicCondition'], function (exports) {
+    var webUtil = $webUtil;
+    var Class = function () {
+        this.MODELNAME = "mdm/CodeGroupExportRule";
+        this.moduleKey = "CodeGroupExportRule";
+        this.backPath = configData.compatibility ? path : configData.mdmService;
+        this.url = {
+            map: {
+                controller: 'codeClassifyTempMapController/',
+                dataGrid: 'gridCodeClassifyTemplateMap',
+                addSave: 'addSave',
+                editSave: 'editSave',
+                deleteUrl: 'deleteData',
+                getObjectByOid: 'getObjectByOid',
+                listDataByOids: 'listDataByOids'
+            },
+            mapItem: {
+                controller: 'codeClsTempMapItemController/',
+                dataGrid: 'gridCodeClassifyTempMapItem',
+                addSave: 'addSave',
+                editSave: 'editSave',
+                deleteUrl: 'deleteData',
+                getObjectByOid: 'getObjectByOid',
+                listDataByOids: 'listDataByOids'
+            }
+        };
+        this.getContent = function () {
+            var that = this;
+            return '<div id="UIContent_' + that.id + '" style="overflow: auto;padding:0 5px"></div>';
+        };
+        this.showContent = function () {
+            var that = this;
+            var html = "";
+            html = [
+                '<div class="layui-layout easyui-layout UIContentLayout "  id="easyuiLayout_', that.id, '" data-options="fit:true" style="display:block;overflow-y: hidden">',
+                '<div data-options="region:\'north\',split:true" title="鏄犲皠瑙勫垯" style="height:360px;display:block;margin-top:0px;padding:0 5px" id="border_', that.id, '">',
+                '<div style="">',
+                that.getToolbarHtml(),
+                '<table id="table_', that.id, '" lay-filter="', that.id, '" style="overflow-x:auto;"></table>',
+                '</div>',
+                '</div>',
+                '<div data-options="region:\'center\'" title="鏄犲皠鏄庣粏" style="display:block;margin-top:0px;padding:0 5px " >',
+                '<div style="overflow-y:auto;">',
+                that.getSecToolbarHtml(),
+                '<table id="sec_', that.id, '" lay-filter="sec_', that.id, '" style="overflow-x:auto;"></table>',
+                '</div>',
+                '</div>',
+                '</div>'
+            ].join("");
+            $("#UIContent_" + that.id).html(html);
+        };
+        this.getToolbarHtml = function () {
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_', that.id, '" class="layui-btn-container layui-buttons">',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_', that.id, '_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_', that.id, '_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_', that.id, '_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                // '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_', that.id, '_ENABLE"><i class="layui-icon layui-icon-ok-circle"></i>鍚敤</button>',
+                // '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_', that.id, '_DISABLE"><i class="layui-icon layui-icon-404"></i>鍋滅敤</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_', that.id, '_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_', that.id, '_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getSecToolbarHtml = function () {
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_', that.id, '" class="layui-btn-container layui-buttons">',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_sec_', that.id, '_ADDSEC"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_sec_', that.id, '_EDITSEC"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_sec_', that.id, '_DELSEC"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_sec_', that.id, '_refreshSEC"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_sec_', that.id, '_ADVQUERYSEC"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.bindDefultButtonLisenter(that, "sec_" + that.id);
+            webUtil.createSearchHtml({
+                id: "缂栧彿",
+                name: "鍚嶇О"
+            }, $("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+
+        };
+        this.init = function () {
+            var that = this;
+            webUtil.copyConfig(that, that.moduleKey);
+            setTimeout(function () {
+                that.showContent();
+                var easyuiLayout = $('#easyuiLayout_' + that.id)
+                easyuiLayout.css({height: $('#portal_body').height() - 43, width: $('#portal_body').width() - 15})
+                easyuiLayout.layout();
+
+                that.initMainTable();
+                that.createSearchHtml();
+                that.initSecTable();
+            }, 1);
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath: that.backPath,
+                url: that.url.map.controller + that.url.map.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                extraParams: {
+                    "conditionMap['codeMapRuleType']": 'code_map_group_export'
+                },
+                selectMode: table.selectMode.muti,
+                cols: [that.columns],
+                method: 'get',
+                done: function (res, cur, total) {
+                    if (!that.fristMainLoad) {
+                        table.on('tool(' + that.id + ')', function (obj) {
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if (layEvent == 'EDIT') {
+                                that.addOrEdit(false, data.oid);
+                            }
+                        });
+                    } else {
+                        if (total > 0) {
+                            table.selectRecord('table_' + that.id, {index: 0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                },
+                rowClick: function (thisTableFilter, record) {
+                    table.reload("sec_" + that.id, {
+                        extraParams: {
+                            "conditionMap['classifyTemplateMapOid']": record.oid
+                        }
+                    });
+                }
+            };
+            if (parentFieldName) {
+                options.treeConfig = {
+                    treepid: parentFieldName,
+                    treeid: 'id',
+                    showField: 'name'
+                };
+            }
+            table.render(options);
+        };
+        this.initSecTable = function () {
+            var that = this;
+            var table = layui.table;
+            that.checkSecColumns();
+            var tableWidth = $("#border_" + that.id).width();
+            var options = {
+                elem: '#sec_' + that.id,
+                id: 'sec_' + that.id,
+                backPath: that.backPath,
+                url: that.url.mapItem.controller + that.url.mapItem.dataGrid,
+                limit: -1,
+                width: tableWidth,
+                selectMode: table.selectMode.muti,
+                cols: [that.secColumns],
+                method: 'get',
+                done: function (res, cur, total) {
+                    table.on('tool(sec_' + that.id + ')', function (obj) {
+                        var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                        var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                        if (layEvent == 'EDIT') {
+                            that.addOrEditSec(false, data);
+                        } else if (layEvent == 'UP') {
+                            obj.index != 0 && layui.table.moveData('sec_' + that.id, obj.index, obj.index - 1)
+                        } else if (layEvent == 'DOWN') {
+                            obj.index != layui.table.getData('sec_' + that.id).length - 1 && layui.table.moveData(filter, obj.index, obj.index + 1)
+                        } else if (layEvent == 'SECVALUE') {
+                            that.SECVALUE(data)
+                        }
+                    });
+                }
+            };
+            table.render(options);
+        };
+        this.checkColumns = function () {
+            var that = this;
+            var table = layui.table;
+            if (that.columns == null || that.columns.length == 0) {
+                that.columns = [table.getIndexColumn(), table.getCheckColumn(), {
+                    field: 'id',
+                    title: '缂栧彿',
+                    width: 150,
+                    sort: true
+                }, {
+                    field: 'name',
+                    title: '鍚嶇О',
+                    width: 200,
+                    sort: true
+                },{
+                    field: 'classifyTemplateName',
+                    title: '鎵�灞炴ā鏉�',
+                    width: 160,
+                    sort: true
+                }, {
+                    field: 'description',
+                    title: '鎻忚堪',
+                    width: 160,
+                    sort: true
+                }, {
+                    field: 'lcStatusText',
+                    title: '鐘舵��',
+                    width: 90,
+                    sortField: 'lcstatus',
+                    sort: true
+                },{
+                    field: 'codemapruletypeText',
+                    title: '鏄犲皠绫诲瀷',
+                    width: 90
+                }, {
+                    field: 'options',
+                    title: '鎿嶄綔',
+                    width: 80,
+                    templet: function (d) {
+                        return '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>';
+                    }
+                }];
+            }
+        };
+        this.checkSecColumns = function () {
+            var that = this;
+            var table = layui.table;
+            if (that.secColumns == null || that.secColumns.length == 0) {
+                that.secColumns = [table.getIndexColumn(), table.getCheckColumn(),
+                    {
+                        field: 'groupcodeattrid',
+                        title: '闆嗗洟鐮佸睘鎬ey',
+                        width: 200,
+                        sort: true
+                    }, {
+                        field: 'groupcodeattrname',
+                        title: '闆嗗洟鐮佸睘鎬ey',
+                        width: 200,
+                        sort: true
+                    }, {
+                        field: 'classifyAttrId',
+                        title: '鍒嗙被妯℃澘灞炴�ey',
+                        width: 200,
+                        sort: true
+                    }, {
+                        field: 'classifyAttrName',
+                        title: '鍒嗙被妯℃澘灞炴�у悕绉�',
+                        width: 200,
+                        sort: true
+                    }, {
+                        field: 'targetdateformat',
+                        title: '鏃堕棿鏍煎紡',
+                        width: 200,
+                        sort: true
+                    }, {
+                        field: 'switcheval',
+                        title: '杞崲鍏紡',
+                        width: 200,
+                        sort: true
+                    }, {
+                        field: 'switchclassname',
+                        title: '杞崲鐨勮嚜瀹氫箟绫�',
+                        width: 200,
+                        sort: true
+                    }, {
+                        field: 'options',
+                        title: '鎿嶄綔',
+                        width: 150,
+                        templet: function (d) {
+                            if (d.sectype == 'codeclassifysec' || d.sectype == 'codefixedsec') {
+                                return '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a><a class="layui-btn layui-btn-intable" lay-event="SECVALUE">鐮佸�肩鐞�</a>';
+                            } else {
+                                return '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>';
+                            }
+
+                        }
+                    }];
+            }
+        };
+        this.getFormItems = function (onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [
+                {
+                    field: 'id',
+                    title: '缂栧彿',
+                    required: true
+                }, {
+                    field: 'name',
+                    title: '鍚嶇О',
+                    required: true
+                },{
+                    field: 'classifyTemplateOid',
+                    title: '鎵�灞炴ā鏉�',
+                    width: 160,
+                    type: 'refer',
+                    showField:'classifyTemplateName',
+                    referConfig: {
+                        type:'mdm/refer/CodeClassTemplateRefer',
+                        valueField: 'oid',
+                        textField: 'name'
+                    },
+                    defaultValue: "",
+                    readOnly: onlyShow
+                },
+                {
+                    field: 'description',
+                    title: '鎻忚堪',
+                    type: 'textarea',
+                    inputWidth: 475
+                }
+            ];
+        };
+        this.getSecFormItems = function (onlyShow,templateOid) {
+            var that = this;
+            var table = layui.table;
+            return [
+                {
+                    field: 'classifytemplateattroid',
+                    title: '鍒嗙被妯℃澘灞炴��',
+                    required: true,
+                    type: 'refer',
+                    showField: 'classifyAttrName',
+                    referConfig: {
+                        type:'grid',
+                        referBo:'codeclstempattr',
+                        url: "codeClassifyTempAttrController/gridCodeClassifyTemplateAttr",
+                        backPath:that.backPath,
+                        textField:'name',
+                        valueField:'oid',
+                        extraParams:{
+                            conditionMap:{classifyTemplateOid:templateOid}
+                        },
+                        isMuti:false,
+                        tableConfig:{
+                            page:{
+                                limit:15,
+                                page:1
+                            },
+                            cols:[table.getIndexColumn(),table.getCheckColumn(),{
+                                field:'id',
+                                title:'鍒嗙被妯℃澘灞炴�ey',
+                            },{
+                                field:'name',
+                                title:'鍒嗙被妯℃澘灞炴�у悕绉�',
+                            }],
+                            queryColumns:[{
+                                field:'id',
+                                title:'鍒嗙被妯℃澘灞炴�ey'
+                            }]
+                        }
+                    },
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'groupcodeattrid',
+                    title: '闆嗗洟鐮佸睘鎬ey',
+                    type: 'text',
+                    defaultValue:"",
+                    required: true,
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'groupcodeattrname',
+                    title: '闆嗗洟鐮佸睘鎬у悕绉�',
+                    type: 'text',
+                    defaultValue:"",
+                    required: true,
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'switchclassname',
+                    title: '杞崲鐨勮嚜瀹氫箟绫�',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'switcheval',
+                    title: '杞崲鍏紡',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'targetdateformat',
+                    title: '鐩爣绔殑鏃堕棿鏍煎紡',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                }             ];
+        };
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function () {
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id, true, true);
+            if (!oid) {
+                return false;
+            }
+            that.addOrEdit(false, oid);
+        };
+        this.addOrEdit = function (add, oid) {
+            var that = this;
+            var form = layui.form;
+            var filter = "form_" + that.id;
+            var addSaveIndex = webUtil.dialog({
+                title: add ?  "娣诲姞鏄犲皠瑙勫垯" : '淇敼鏄犲皠瑙勫垯',
+                btn: ['淇濆瓨', '鍙栨秷'],
+                content: '<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                resizing: function (layero) {
+                    form.doResize(filter);
+                },
+                success: function (layero, layerIndex, classP) {
+                    form.addItems(filter, that.getFormItems(false),
+                        function () {
+                            if (add) {
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues, filter);
+                            } else {
+                                form.load(filter, {
+                                    backPath: that.backPath,
+                                    url: that.url.map.controller + that.url.map.getObjectByOid,
+                                    method: 'get',
+                                    params: {
+                                        oid: oid
+                                    }
+                                });
+                            }
+                            webUtil.relocationOpen(classP)
+                        }, {}, {defaultColumnOneRow: 2});
+                },
+                yes: function (layero) {
+                    if (form.validata(filter)) {
+                        var values = form.getValues(filter, true);
+                        if (!add){
+                            values.oid = oid;
+                        }else {
+                            values.codeMapRuleType ='code_map_group_export';
+                        }
+                        var url = that.url.map.controller + (add ? that.url.map.addSave : that.url.map.editSave);
+                        webUtil.manualAjax(add ? 'post' : 'put', url, JSON.stringify(values), function (result) {
+                            if (result.success) {
+                                webUtil.showMsgFromResult(result, (add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            } else {
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        }, function (xhr, err) {
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        }, that.backPath);
+                    }
+                },
+                btn2: function (layero) {
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function () {
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id, true, true);
+            if (!oid) {
+                return false;
+            }
+            var ts = webUtil.getOidFromGrid("table_" + that.id, false, false, "ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!", function () {
+                webUtil.deleteRequest(that.url.map.controller + that.url.map.deleteUrl, {oid: oid, ts: ts}, function (result) {
+                    if (result.success) {
+                        webUtil.showMsgFromResult(result, "鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    } else {
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                }, function (xhr, err) {
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                }, that.backPath);
+            });
+        };
+        this.refresh = function () {
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+        this.ADVQUERY = function () {
+            var that = this;
+            if (!that.serinorQueryInstance) {
+                var dynamicCondition = layui.dynamicCondition;
+                $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar' + that.id + '" class="layui-inline"></div>');
+                that.checkColumns();
+                var dataFields = [];
+                for (var i = 0; i < that.columns.length; i++) {
+                    dataFields[i] = that.columns[i];
+                }
+                that.serinorQueryInstance = dynamicCondition.create({
+                    fields: dataFields//鏌ヨ瀛楁
+                    , tableId: "table_" + that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                    , type: "complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                    , queryCallBack: function (requestData) {//鏌ヨ涔嬪悗鐨刢allback
+
+                    }
+                });
+            }
+            that.serinorQueryInstance.open();
+        };
+        this.ADDSEC = function () {
+            this.addOrEditSec(true)
+        };
+        this.EDITSEC = function () {
+            var that = this;
+            var secData = layui.table.checkStatus("sec_" + that.id).data;
+            if (secData.length != 1) {
+                webUtil.showErrorMsg('璇烽�夋嫨涓�鏉℃槧灏勬槑缁嗘暟鎹�');
+                return false;
+            }
+            this.addOrEditSec(false,secData[0])
+        };
+        this.DELSEC = function () {
+            var that = this;
+            var oid = webUtil.getOidFromGrid("sec_" + that.id, true, true);
+            if (!oid) {
+                return false;
+            }
+            var ts = webUtil.getOidFromGrid("sec_" + that.id, false, false, "ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!", function () {
+                webUtil.deleteRequest(that.url.mapItem.controller + that.url.mapItem.deleteUrl, {oid: oid, ts: ts}, function (result) {
+                    if (result.success) {
+                        webUtil.showMsgFromResult(result, "鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    } else {
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                }, function (xhr, err) {
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                }, that.backPath);
+            });
+        };
+        this.addOrEditSec = function (add,codeData) {
+            var that = this;
+            var checkData = layui.table.checkStatus("table_" + that.id).data;
+            if (checkData.length != 1) {
+                webUtil.showErrorMsg('璇烽�夋嫨涓�鏉℃槧灏勮鍒欐暟鎹�');
+                return false;
+            }
+            var oid=codeData?codeData.oid:'';
+            var templateOid = checkData[0].classifyTemplateOid? checkData[0].classifyTemplateOid : '';
+            var form = layui.form;
+            var filter = "form_" + that.id;
+            var addSaveIndex = webUtil.dialog({
+                title: add ? '娣诲姞鏄犲皠鏄庣粏' : '淇敼鏄犲皠鏄庣粏',
+                btn: ['淇濆瓨', '鍙栨秷'],
+                area:['500px','580px'],
+                content: '<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                resizing: function (layero) {
+                    form.doResize(filter);
+                },
+                success: function (layero, layerIndex, classP) {
+                    form.addItems(filter, that.getSecFormItems(false,templateOid),
+                        function () {
+                            if (!add){
+                                form.setValues(codeData)
+                            }else {
+                                var defaultValues = {};
+                                form.setValues(defaultValues,filter);
+                            }
+                        }, {}, {defaultColumnOneRow: 1, labelWidth: 130});
+
+                },
+                yes: function (layero) {
+                    if (form.validata(filter) && form.validata("sec_" + filter)) {
+                        var values = form.getValues(filter, true);
+                        console.log(values);
+                        var secvalues = form.getValues("sec_" + filter, true);
+                        console.log(secvalues);
+                        var newvalues = $.extend({}, values, secvalues);
+                        console.log(checkData[0].oid);
+                        newvalues.classifytemplatemapoid = checkData[0].oid;
+                        if (!add) {
+                            newvalues.oid = codeData.oid;
+                        }
+                        var url = that.url.mapItem.controller + (add ? that.url.mapItem.addSave : that.url.mapItem.editSave);
+                        webUtil.manualAjax(add ? 'post' : 'put', url, JSON.stringify(newvalues), function (result) {
+                            if (result.success) {
+                                webUtil.showMsgFromResult(result, (add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refreshSEC();
+                            } else {
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        }, function (xhr, err) {
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        }, that.backPath);
+                    }
+                },
+                btn2: function (layero) {
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.refreshSEC = function (){
+            var that = this;
+            layui.table.reload("sec_" + that.id);
+        }
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME, cs);
+});
diff --git a/Source/platformProject/platform2022UI/vciweb/mdm/CodeGroupImportRule.js b/Source/platformProject/platform2022UI/vciweb/mdm/CodeGroupImportRule.js
new file mode 100644
index 0000000..3922dd4
--- /dev/null
+++ b/Source/platformProject/platform2022UI/vciweb/mdm/CodeGroupImportRule.js
@@ -0,0 +1,620 @@
+/**
+ * 闆嗗洟鐮佸鍏ユ槧灏勯〉闈�
+ * @author lihang
+ * @date 2022-03-10
+ */
+layui.define(['layer', 'element', 'form', 'table', 'dynamicCondition'], function (exports) {
+    var webUtil = $webUtil;
+    var Class = function () {
+        this.MODELNAME = "mdm/CodeGroupImportRule";
+        this.moduleKey = "CodeGroupImportRule";
+        this.backPath = configData.compatibility ? path : configData.mdmService;
+        this.url = {
+            map: {
+                controller: 'codeClassifyTempMapController/',
+                dataGrid: 'gridCodeClassifyTemplateMap',
+                addSave: 'addSave',
+                editSave: 'editSave',
+                deleteUrl: 'deleteData',
+                getObjectByOid: 'getObjectByOid',
+                listDataByOids: 'listDataByOids'
+            },
+            mapItem: {
+                controller: 'codeClsTempMapItemController/',
+                dataGrid: 'gridCodeClassifyTempMapItem',
+                addSave: 'addSave',
+                editSave: 'editSave',
+                deleteUrl: 'deleteData',
+                getObjectByOid: 'getObjectByOid',
+                listDataByOids: 'listDataByOids'
+            }
+        };
+        this.getContent = function () {
+            var that = this;
+            return '<div id="UIContent_' + that.id + '" style="overflow: auto;padding:0 5px"></div>';
+        };
+        this.showContent = function () {
+            var that = this;
+            var html = "";
+            html = [
+                '<div class="layui-layout easyui-layout UIContentLayout "  id="easyuiLayout_', that.id, '" data-options="fit:true" style="display:block;overflow-y: hidden">',
+                '<div data-options="region:\'north\',split:true" title="鏄犲皠瑙勫垯" style="height:360px;display:block;margin-top:0px;padding:0 5px" id="border_', that.id, '">',
+                '<div style="">',
+                that.getToolbarHtml(),
+                '<table id="table_', that.id, '" lay-filter="', that.id, '" style="overflow-x:auto;"></table>',
+                '</div>',
+                '</div>',
+                '<div data-options="region:\'center\'" title="鏄犲皠鏄庣粏" style="display:block;margin-top:0px;padding:0 5px " >',
+                '<div style="overflow-y:auto;">',
+                that.getSecToolbarHtml(),
+                '<table id="sec_', that.id, '" lay-filter="sec_', that.id, '" style="overflow-x:auto;"></table>',
+                '</div>',
+                '</div>',
+                '</div>'
+            ].join("");
+            $("#UIContent_" + that.id).html(html);
+        };
+        this.getToolbarHtml = function () {
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_', that.id, '" class="layui-btn-container layui-buttons">',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_', that.id, '_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_', that.id, '_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_', that.id, '_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                // '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_', that.id, '_ENABLE"><i class="layui-icon layui-icon-ok-circle"></i>鍚敤</button>',
+                // '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_', that.id, '_DISABLE"><i class="layui-icon layui-icon-404"></i>鍋滅敤</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_', that.id, '_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_', that.id, '_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getSecToolbarHtml = function () {
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_', that.id, '" class="layui-btn-container layui-buttons">',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_sec_', that.id, '_ADDSEC"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_sec_', that.id, '_EDITSEC"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_sec_', that.id, '_DELSEC"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_sec_', that.id, '_refreshSEC"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_sec_', that.id, '_ADVQUERYSEC"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.bindDefultButtonLisenter(that, "sec_" + that.id);
+            webUtil.createSearchHtml({
+                id: "缂栧彿",
+                name: "鍚嶇О"
+            }, $("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+
+        };
+        this.init = function () {
+            var that = this;
+            webUtil.copyConfig(that, that.moduleKey);
+            setTimeout(function () {
+                that.showContent();
+                var easyuiLayout = $('#easyuiLayout_' + that.id)
+                easyuiLayout.css({height: $('#portal_body').height() - 43, width: $('#portal_body').width() - 15})
+                easyuiLayout.layout();
+
+                that.initMainTable();
+                that.createSearchHtml();
+                that.initSecTable();
+            }, 1);
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath: that.backPath,
+                url: that.url.map.controller + that.url.map.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                extraParams: {
+                    "conditionMap['codeMapRuleType']": 'code_map_group_import'
+                },
+                selectMode: table.selectMode.muti,
+                cols: [that.columns],
+                method: 'get',
+                done: function (res, cur, total) {
+                    if (!that.fristMainLoad) {
+                        table.on('tool(' + that.id + ')', function (obj) {
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if (layEvent == 'EDIT') {
+                                that.addOrEdit(false, data.oid);
+                            }
+                        });
+                    } else {
+                        if (total > 0) {
+                            table.selectRecord('table_' + that.id, {index: 0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                },
+                rowClick: function (thisTableFilter, record) {
+                    table.reload("sec_" + that.id, {
+                        extraParams: {
+                            "conditionMap['classifyTemplateMapOid']": record.oid
+                        }
+                    });
+                }
+            };
+            if (parentFieldName) {
+                options.treeConfig = {
+                    treepid: parentFieldName,
+                    treeid: 'id',
+                    showField: 'name'
+                };
+            }
+            table.render(options);
+        };
+        this.initSecTable = function () {
+            var that = this;
+            var table = layui.table;
+            that.checkSecColumns();
+            var tableWidth = $("#border_" + that.id).width();
+            var options = {
+                elem: '#sec_' + that.id,
+                id: 'sec_' + that.id,
+                backPath: that.backPath,
+                url: that.url.mapItem.controller + that.url.mapItem.dataGrid,
+                limit: -1,
+                width: tableWidth,
+                selectMode: table.selectMode.muti,
+                cols: [that.secColumns],
+                method: 'get',
+                done: function (res, cur, total) {
+                    table.on('tool(sec_' + that.id + ')', function (obj) {
+                        var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                        var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                        if (layEvent == 'EDIT') {
+                            that.addOrEditSec(false, data);
+                        } else if (layEvent == 'UP') {
+                            obj.index != 0 && layui.table.moveData('sec_' + that.id, obj.index, obj.index - 1)
+                        } else if (layEvent == 'DOWN') {
+                            obj.index != layui.table.getData('sec_' + that.id).length - 1 && layui.table.moveData(filter, obj.index, obj.index + 1)
+                        } else if (layEvent == 'SECVALUE') {
+                            that.SECVALUE(data)
+                        }
+                    });
+                }
+            };
+            table.render(options);
+        };
+        this.checkColumns = function () {
+            var that = this;
+            var table = layui.table;
+            if (that.columns == null || that.columns.length == 0) {
+                that.columns = [table.getIndexColumn(), table.getCheckColumn(), {
+                    field: 'id',
+                    title: '缂栧彿',
+                    width: 150,
+                    sort: true
+                }, {
+                    field: 'name',
+                    title: '鍚嶇О',
+                    width: 200,
+                    sort: true
+                },{
+                    field: 'classifyTemplateName',
+                    title: '鎵�灞炴ā鏉�',
+                    width: 160,
+                    sort: true
+                }, {
+                    field: 'description',
+                    title: '鎻忚堪',
+                    width: 160,
+                    sort: true
+                }, {
+                    field: 'lcStatusText',
+                    title: '鐘舵��',
+                    width: 90,
+                    sortField: 'lcstatus',
+                    sort: true
+                },{
+                    field: 'codemapruletypeText',
+                    title: '鏄犲皠绫诲瀷',
+                    width: 90
+                }, {
+                    field: 'options',
+                    title: '鎿嶄綔',
+                    width: 80,
+                    templet: function (d) {
+                        return '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>';
+                    }
+                }];
+            }
+        };
+        this.checkSecColumns = function () {
+            var that = this;
+            var table = layui.table;
+            if (that.secColumns == null || that.secColumns.length == 0) {
+                that.secColumns = [table.getIndexColumn(), table.getCheckColumn(),
+                    {
+                    field: 'groupcodeattrid',
+                    title: '闆嗗洟鐮佸睘鎬ey',
+                    width: 200,
+                    sort: true
+                }, {
+                    field: 'groupcodeattrname',
+                    title: '闆嗗洟鐮佸睘鎬ey',
+                    width: 200,
+                    sort: true
+                }, {
+                    field: 'classifyAttrId',
+                    title: '鍒嗙被妯℃澘灞炴�ey',
+                    width: 200,
+                    sort: true
+                }, {
+                    field: 'classifyAttrName',
+                    title: '鍒嗙被妯℃澘灞炴�у悕绉�',
+                    width: 200,
+                    sort: true
+                }, {
+                    field: 'targetdateformat',
+                    title: '鏃堕棿鏍煎紡',
+                    width: 200,
+                    sort: true
+                }, {
+                    field: 'switcheval',
+                    title: '杞崲鍏紡',
+                    width: 200,
+                    sort: true
+                }, {
+                    field: 'switchclassname',
+                    title: '杞崲鐨勮嚜瀹氫箟绫�',
+                    width: 200,
+                    sort: true
+                }, {
+                    field: 'options',
+                    title: '鎿嶄綔',
+                    width: 150,
+                    templet: function (d) {
+                        if (d.sectype == 'codeclassifysec' || d.sectype == 'codefixedsec') {
+                            return '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a><a class="layui-btn layui-btn-intable" lay-event="SECVALUE">鐮佸�肩鐞�</a>';
+                        } else {
+                            return '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>';
+                        }
+
+                    }
+                    }];
+            }
+        };
+        this.getFormItems = function (onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [
+                {
+                    field: 'id',
+                    title: '缂栧彿',
+                    required: true
+                }, {
+                    field: 'name',
+                    title: '鍚嶇О',
+                    required: true
+                },{
+                    field: 'classifyTemplateOid',
+                    title: '鎵�灞炴ā鏉�',
+                    width: 160,
+                    type: 'refer',
+                    showField:'classifyTemplateName',
+                    referConfig: {
+                        type:'mdm/refer/CodeClassTemplateRefer',
+                        valueField: 'oid',
+                        textField: 'name'
+                    },
+                    defaultValue: "",
+                    readOnly: onlyShow
+                },
+                {
+                    field: 'description',
+                    title: '鎻忚堪',
+                    type: 'textarea',
+                    inputWidth: 475
+                }
+            ];
+        };
+        this.getSecFormItems = function (onlyShow,templateOid) {
+            var that = this;
+            var table = layui.table;
+            return [
+                 {
+                    field: 'classifytemplateattroid',
+                    title: '鍒嗙被妯℃澘灞炴��',
+                    required: true,
+                    type: 'refer',
+                    showField: 'classifyAttrName',
+                    referConfig: {
+                        type:'grid',
+                        referBo:'codeclstempattr',
+                        url: "codeClassifyTempAttrController/gridCodeClassifyTemplateAttr",
+                        backPath:that.backPath,
+                        textField:'name',
+                        valueField:'oid',
+                        extraParams:{
+                            conditionMap:{classifyTemplateOid:templateOid}
+                        },
+                        isMuti:false,
+                        tableConfig:{
+                            page:{
+                                limit:15,
+                                page:1
+                            },
+                            cols:[table.getIndexColumn(),table.getCheckColumn(),{
+                                field:'id',
+                                title:'鍒嗙被妯℃澘灞炴�ey',
+                            },{
+                                field:'name',
+                                title:'鍒嗙被妯℃澘灞炴�у悕绉�',
+                            }],
+                            queryColumns:[{
+                                field:'id',
+                                title:'鍒嗙被妯℃澘灞炴�ey'
+                            }]
+                        }
+                    },
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'groupcodeattrid',
+                    title: '闆嗗洟鐮佸睘鎬ey',
+                    type: 'text',
+                    defaultValue:"",
+                    required: true,
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'groupcodeattrname',
+                    title: '闆嗗洟鐮佸睘鎬у悕绉�',
+                    type: 'text',
+                    defaultValue:"",
+                    required: true,
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'switchclassname',
+                    title: '杞崲鐨勮嚜瀹氫箟绫�',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'switcheval',
+                    title: '杞崲鍏紡',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'targetdateformat',
+                    title: '鐩爣绔殑鏃堕棿鏍煎紡',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                }             ];
+        };
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function () {
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id, true, true);
+            if (!oid) {
+                return false;
+            }
+            that.addOrEdit(false, oid);
+        };
+        this.addOrEdit = function (add, oid) {
+            var that = this;
+            var form = layui.form;
+            var filter = "form_" + that.id;
+            var addSaveIndex = webUtil.dialog({
+                title: add ?  "娣诲姞鏄犲皠瑙勫垯" : '淇敼鏄犲皠瑙勫垯',
+                btn: ['淇濆瓨', '鍙栨秷'],
+                content: '<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                resizing: function (layero) {
+                    form.doResize(filter);
+                },
+                success: function (layero, layerIndex, classP) {
+                    form.addItems(filter, that.getFormItems(false),
+                        function () {
+                            if (add) {
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues, filter);
+                            } else {
+                                form.load(filter, {
+                                    backPath: that.backPath,
+                                    url: that.url.map.controller + that.url.map.getObjectByOid,
+                                    method: 'get',
+                                    params: {
+                                        oid: oid
+                                    }
+                                });
+                            }
+                            webUtil.relocationOpen(classP)
+                        }, {}, {defaultColumnOneRow: 2});
+                },
+                yes: function (layero) {
+                    if (form.validata(filter)) {
+                        var values = form.getValues(filter, true);
+                        if (!add){
+                            values.oid = oid;
+                        }else {
+                            values.codeMapRuleType ='code_map_group_import';
+                        }
+                        var url = that.url.map.controller + (add ? that.url.map.addSave : that.url.map.editSave);
+                        webUtil.manualAjax(add ? 'post' : 'put', url, JSON.stringify(values), function (result) {
+                            if (result.success) {
+                                webUtil.showMsgFromResult(result, (add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            } else {
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        }, function (xhr, err) {
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        }, that.backPath);
+                    }
+                },
+                btn2: function (layero) {
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function () {
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id, true, true);
+            if (!oid) {
+                return false;
+            }
+            var ts = webUtil.getOidFromGrid("table_" + that.id, false, false, "ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!", function () {
+                webUtil.deleteRequest(that.url.map.controller + that.url.map.deleteUrl, {oid: oid, ts: ts}, function (result) {
+                    if (result.success) {
+                        webUtil.showMsgFromResult(result, "鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    } else {
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                }, function (xhr, err) {
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                }, that.backPath);
+            });
+        };
+        this.refresh = function () {
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+        this.ADVQUERY = function () {
+            var that = this;
+            if (!that.serinorQueryInstance) {
+                var dynamicCondition = layui.dynamicCondition;
+                $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar' + that.id + '" class="layui-inline"></div>');
+                that.checkColumns();
+                var dataFields = [];
+                for (var i = 0; i < that.columns.length; i++) {
+                    dataFields[i] = that.columns[i];
+                }
+                that.serinorQueryInstance = dynamicCondition.create({
+                    fields: dataFields//鏌ヨ瀛楁
+                    , tableId: "table_" + that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                    , type: "complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                    , queryCallBack: function (requestData) {//鏌ヨ涔嬪悗鐨刢allback
+
+                    }
+                });
+            }
+            that.serinorQueryInstance.open();
+        };
+        this.ADDSEC = function () {
+            this.addOrEditSec(true)
+        };
+        this.EDITSEC = function () {
+            var that = this;
+            var secData = layui.table.checkStatus("sec_" + that.id).data;
+            if (secData.length != 1) {
+                webUtil.showErrorMsg('璇烽�夋嫨涓�鏉℃槧灏勬槑缁嗘暟鎹�');
+                return false;
+            }
+            console.log("secdata:");
+            console.log(secData);
+            this.addOrEditSec(false,secData[0])
+        };
+        this.DELSEC = function () {
+            var that = this;
+            var oid = webUtil.getOidFromGrid("sec_" + that.id, true, true);
+            if (!oid) {
+                return false;
+            }
+            var ts = webUtil.getOidFromGrid("sec_" + that.id, false, false, "ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!", function () {
+                webUtil.deleteRequest(that.url.mapItem.controller + that.url.mapItem.deleteUrl, {oid: oid, ts: ts}, function (result) {
+                    if (result.success) {
+                        webUtil.showMsgFromResult(result, "鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    } else {
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                }, function (xhr, err) {
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                }, that.backPath);
+            });
+        };
+        this.addOrEditSec = function (add,codeData) {
+            var that = this;
+            var checkData = layui.table.checkStatus("table_" + that.id).data;
+            if (checkData.length != 1) {
+                webUtil.showErrorMsg('璇烽�夋嫨涓�鏉℃槧灏勮鍒欐暟鎹�');
+                return false;
+            }
+            console.log(checkData);
+            var oid=codeData?codeData.oid:'';
+            var templateOid = checkData[0].classifyTemplateOid? checkData[0].classifyTemplateOid : '';
+            var form = layui.form;
+            var filter = "form_" + that.id;
+            var addSaveIndex = webUtil.dialog({
+                title: add ? '娣诲姞鏄犲皠鏄庣粏' : '淇敼鏄犲皠鏄庣粏',
+                btn: ['淇濆瓨', '鍙栨秷'],
+                area:['500px','580px'],
+                content: '<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                resizing: function (layero) {
+                    form.doResize(filter);
+                },
+                success: function (layero, layerIndex, classP) {
+                    form.addItems(filter, that.getSecFormItems(false,templateOid),
+                        function () {
+                        if (!add){
+                            form.setValues(codeData)
+                        }else {
+                            var defaultValues = {};
+                            form.setValues(defaultValues,filter);
+                        }
+                        }, {}, {defaultColumnOneRow: 1, labelWidth: 130});
+
+                },
+                yes: function (layero) {
+                    if (form.validata(filter) && form.validata("sec_" + filter)) {
+                        var values = form.getValues(filter, true);
+                        console.log(values);
+                        var secvalues = form.getValues("sec_" + filter, true);
+                        console.log(secvalues);
+                        var newvalues = $.extend({}, values, secvalues);
+                        newvalues.classifytemplatemapoid = checkData[0].oid;
+                        if (!add) {
+                            newvalues.oid = codeData.oid;
+                        }
+                        var url = that.url.mapItem.controller + (add ? that.url.mapItem.addSave : that.url.mapItem.editSave);
+                        webUtil.manualAjax(add ? 'post' : 'put', url, JSON.stringify(newvalues), function (result) {
+                            if (result.success) {
+                                webUtil.showMsgFromResult(result, (add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refreshSEC();
+                            } else {
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        }, function (xhr, err) {
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        }, that.backPath);
+                    }
+                },
+                btn2: function (layero) {
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.refreshSEC = function (){
+            var that = this;
+            layui.table.reload("sec_" + that.id);
+        }
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME, cs);
+});
diff --git a/Source/platformProject/platform2022UI/vciweb/mdm/CodeKeyAttrRepeatRule.js b/Source/platformProject/platform2022UI/vciweb/mdm/CodeKeyAttrRepeatRule.js
new file mode 100644
index 0000000..3d2e983
--- /dev/null
+++ b/Source/platformProject/platform2022UI/vciweb/mdm/CodeKeyAttrRepeatRule.js
@@ -0,0 +1,354 @@
+/**
+ * 鍏抽敭鏁版嵁鏌ラ噸瑙勫垯椤甸潰
+ * @author weidy
+ * @date 2022-01-24
+ */
+layui.define(['layer','element','form','table','dynamicCondition' ],function(exports){
+        var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "mdm/CodeKeyAttrRepeatRule";
+        this.moduleKey = "CodeKeyAttrRepeatRule";
+        this.backPath =  configData.compatibility? path:configData.mdmService;
+        this.url = {
+            controller:'codeKeyAttrRepeatController/',
+            dataGrid:'gridCodeKeyAttrRepeatRule',
+            addSave:'addSave',
+            editSave:'editSave',
+            deleteUrl:'deleteData',
+            getObjectByOid:'getObjectByOid'
+        };
+        this.getContent=function(){
+            var that = this;
+            var html = "";
+            html = [
+                '<div class="layui-layout" style="display:block;overflow-y: hidden">',
+                    '<div class="layui-layout-border" style="display:block;margin-top:0px; " id="border_',that.id,'">',
+                        '<div class="layui-center" style="overflow-y:auto;">',
+                            that.getToolbarHtml(),
+                            '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                        '</div>',
+                    '</div>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.createSearchHtml({id:"缂栧彿",name:"鍚嶇О"} ,$("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+        };
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            that.initMainTable();
+            that.createSearchHtml();
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var tableWidth = $("#border_" + that.id).width()-225;
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                width:tableWidth,
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                method:'get',
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'EDIT'){
+                                that.addOrEdit(false,data.oid);
+                            }
+                        });
+                    }else{
+                        if(total>0) {
+                            table.selectRecord('table_' + that.id, {index:0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                }
+            };
+            if(parentFieldName){
+                options.treeConfig = {
+                    treepid:parentFieldName,
+                    treeid:'id',
+                    showField:'name'
+                };
+            }
+            table.render(options);
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0) {
+                that.columns = [table.getIndexColumn(), table.getCheckColumn(), {
+                    field: 'id',
+                    title: '瑙勫垯缂栧彿',
+                    sort: true,
+                    width: 150
+                }, {
+                    field: 'name',
+                    title: '瑙勫垯鍚嶇О',
+                    width: 200,
+                    sort: true
+                }, {
+                    field: 'description',
+                    title: '鎻忚堪',
+                    width: 150,
+                    sort: true
+                },
+                    {
+                        title: '蹇界暐澶у皬鍐�',
+                        field: 'ignorecaseflag',
+                        sort: true,
+                        width: 100,
+                        templet: function (d) {
+                            return webUtil.formateBoolean(d.ignorecaseflag);
+                        }
+                    },
+                    {
+                        title: '蹇界暐绌烘牸',
+                        field: 'ignorespaceflag',
+                        sort: true,
+                        width: 80,
+                        templet: function (d) {
+                            return webUtil.formateBoolean(d.ignorespaceflag);
+                        }
+                    },
+                    {
+                        title: '蹇界暐鍏ㄩ儴绌烘牸',
+                        field: 'ignoreallspaceflag',
+                        sort: true,
+                        width: 110,
+                        templet: function (d) {
+                            return webUtil.formateBoolean(d.ignoreallspaceflag);
+                        }
+                    },{
+                        title: '蹇界暐鍏ㄥ崐瑙�',
+                        field: 'ignorewidthflag',
+                        sort: true,
+                        width: 110,
+                        templet:function (d){
+                            return webUtil.formateBoolean(d.ignorewidthflag);
+                        }
+                    },
+                    {
+                        field: 'options',
+                        title: '鎿嶄綔',
+                        width: 150,
+                        templet: function (d) {
+                            return '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>';
+                        }
+                    }];
+                that.dataFields = [{
+                    field: 'id',
+                    title: '瑙勫垯缂栧彿'
+                }, {
+                    field: 'name',
+                    title: '瑙勫垯鍚嶇О'
+                }, {
+                    field: 'description',
+                    title: '鎻忚堪'
+                },
+                    {
+                        title: '蹇界暐澶у皬鍐�',
+                        field: 'ignorecaseflag',
+                        type: 'combox',
+                        comboxKey: [{key: "true", value: "鏄�"}, {key: "false", value: "鍚�"}]
+                    },
+                    {
+                        title: '蹇界暐绌烘牸',
+                        field: 'ignorespaceflag',
+                        type: 'combox',
+                        comboxKey: [{key: "true", value: "鏄�"}, {key: "false", value: "鍚�"}]
+                    },
+                    {
+                        title: '蹇界暐鍏ㄩ儴绌烘牸',
+                        field: 'ignoreallspaceflag',
+                        type: 'combox',
+                        comboxKey: [{key: "true", value: "鏄�"}, {key: "false", value: "鍚�"}]
+                    },{
+                        title: '蹇界暐鍏ㄥ崐瑙�',
+                        field: 'ignorewidthflag',
+                        type: 'combox',
+                        comboxKey: [{key: "true", value: "鏄�"}, {key: "false", value: "鍚�"}]
+                    }]
+            }
+        };
+
+        this.getFormItems = function(onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [{
+                field: 'id',
+                title: '瑙勫垯缂栧彿',
+                readOnly:onlyShow
+            },{
+                field: 'name',
+                title: '瑙勫垯鍚嶇О',
+                readOnly:onlyShow,
+                required:true
+            },{
+                field: 'description',
+                title: '鎻忚堪',
+                type: 'textarea',
+                inputWidth: 485
+            }, {
+                field: 'ignorecaseflag',
+                title: '蹇界暐澶у皬鍐�',
+                type: 'truefalse',
+                defaultValue: "",
+                readOnly: onlyShow
+            } , {
+                field: 'ignorespaceflag',
+                title: '蹇界暐绌烘牸',
+                type: 'truefalse',
+                defaultValue:"",
+                readOnly:onlyShow
+            } , {
+                field: 'ignoreallspaceflag',
+                title: '蹇界暐鍏ㄩ儴绌烘牸',
+                type: 'truefalse',
+                defaultValue: "",
+                readOnly: onlyShow
+            } , {
+                field: 'ignorewidthflag',
+                title: '蹇界暐鍏ㄥ崐瑙�',
+                type: 'truefalse',
+                defaultValue: "",
+                readOnly: onlyShow
+            }];
+        };
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            that.addOrEdit(false,oid);
+        };
+        this.addOrEdit = function(add,oid) {
+            var that = this;
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var addSaveIndex =webUtil.dialog({
+                title:add?'娣诲姞鍏抽敭鏁版嵁鏌ラ噸瑙勫垯':'淇敼鍏抽敭鏁版嵁鏌ラ噸瑙勫垯',
+                btn:['淇濆瓨','鍙栨秷'],
+                skin:'layui-layer-lan',
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getFormItems(false),
+                        function () {
+                            if(!add){
+                                form.load(filter,{
+                                    backPath:that.backPath,
+                                    url:that.url.controller + that.url.getObjectByOid,
+                                    method:'get',
+                                    params:{
+                                        oid:oid
+                                    }
+                                });
+                            }else{
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+                        }, {}, {defaultColumnOneRow: 2,labelWidth:110});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        var url = that.url.controller + (add?that.url.addSave:that.url.editSave);
+                        webUtil.manualAjax(add?'post':'put',url,JSON.stringify(values),function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts= webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+        this.refresh = function () {
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+        this.ADVQUERY = function () {
+            var that = this;
+            if(!that.serinorQueryInstance) {
+                var dynamicCondition = layui.dynamicCondition;
+                $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar' + that.id + '" class="layui-inline"></div>');
+                that.checkColumns();
+                that.serinorQueryInstance = dynamicCondition.create({
+                    fields: that.dataFields//鏌ヨ瀛楁
+                    , tableId: "table_" + that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                    , type: "complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                    , queryCallBack: function (requestData) {//鏌ヨ涔嬪悗鐨刢allback
+
+                    }
+                });
+            }
+            that.serinorQueryInstance.open();
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/vciweb/mdm/CodeResembleRule.js b/Source/platformProject/platform2022UI/vciweb/mdm/CodeResembleRule.js
new file mode 100644
index 0000000..111eb48
--- /dev/null
+++ b/Source/platformProject/platform2022UI/vciweb/mdm/CodeResembleRule.js
@@ -0,0 +1,354 @@
+/**
+ * 鐩镐技鏌ヨ瑙勫垯椤甸潰
+ * @author weidy
+ * @date 2022-04-10
+ */
+layui.define(['layer','element','form','table','dynamicCondition' ],function(exports){
+        var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "mdm/CodeResembleRule";
+        this.moduleKey = "CodeResembleRule";
+        this.backPath =  configData.compatibility? path:configData.mdmService;
+        this.url = {
+            controller:'resembleRuleController/',
+            dataGrid:'gridCodeResembleRule',
+            addSave:'addSave',
+            editSave:'editSave',
+            deleteUrl:'deleteData',
+            getObjectByOid:'getObjectByOid'
+        };
+        this.getContent=function(){
+            var that = this;
+            return '<div id="UIContent_' + that.id + '" style="overflow: auto;padding:0 5px"></div>';
+        };
+        this.showContent=function (){
+            var that = this;
+            var html = "";
+            html = [
+                        '<div class="layui-layout easyui-layout UIContentLayout"  id="easyuiLayout_',that.id,'" data-options="fit:true" style="display:block;overflow-y: hidden;margin:0 5px">',
+                            '<div data-options="region:\'center\'" style="padding-left: 10px;padding-right: 10px;" id="border_',that.id,'">',
+                                '<div class="layui-center" style="overflow-y:auto;">',
+                                    that.getToolbarHtml(),
+                                    '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                                '</div>',
+                            '</div>',
+                        '</div>'
+            ].join("");
+            $("#UIContent_"+that.id).html(html);
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.createSearchHtml({id:"缂栧彿",name:"鍚嶇О"} ,$("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+        };
+        this.defaultAttrList = [
+        'ignoreallspaceflag',
+        'ignorecaseflag',
+        'ignorespaceflag',
+        'ignorewidthflag',
+            ''
+        ];
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            //闇�瑕佸姞鍦ㄥ畾鏃朵腑锛屽惁鍒欐牱寮忎笉鑳芥纭睍绀猴紝涓嶇煡閬撳師鍥� wangting
+            setTimeout(function (){
+                that.showContent();
+                var easyuiLayout= $('#easyuiLayout_'+that.id)
+                easyuiLayout.css({height:$('#portal_body').height()-43,width:$('#portal_body').width()-15})
+                easyuiLayout.layout();
+
+                that.initMainTable();
+                that.createSearchHtml();
+
+            },1)
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var tableWidth = $("#border_" + that.id).width();
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                width:tableWidth,
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                method:'get',
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'EDIT'){
+                                that.addOrEdit(false,data.oid);
+                            }
+                        });
+                    }else{
+                        if(total>0) {
+                            table.selectRecord('table_' + that.id, {index:0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                }
+            };
+            if(parentFieldName){
+                options.treeConfig = {
+                    treepid:parentFieldName,
+                    treeid:'id',
+                    showField:'name'
+                };
+            }
+            table.render(options);
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),
+                    {
+                        field:'id',
+                        title: '缂栧彿',
+                        width: 110,
+                        sort: true
+                    },{
+                        field:'name',
+                        title: '鍚嶇О',
+                        width: 150,
+                        sort: true
+                    },
+                    {
+                        title: '蹇界暐鍏ㄩ儴绌烘牸',
+                        field: 'ignoreallspaceflag',
+                        sort:true,
+                        width: 110,
+                        templet:function (d){
+                            return $webUtil.formateBoolean(d.ignoreallspaceflag);
+                        }
+                    },
+                    {
+                        title: '蹇界暐澶у皬鍐�',
+                        field: 'ignorecaseflag',
+                        sort:true,
+                        width: 110,
+                        templet:function (d){
+                            return $webUtil.formateBoolean(d.ignorecaseflag);
+                        }
+                    },
+                    {
+                        title: '蹇界暐绌烘牸',
+                        field: 'ignorespaceflag',
+                        sort:true,
+                        width: 110,
+                        templet:function (d){
+                            return $webUtil.formateBoolean(d.ignorespaceflag);
+                        }
+                    },
+                    {
+                        title: '蹇界暐鍏ㄥ崐瑙�',
+                        field: 'ignorewidthflag',
+                        sort:true,
+                        width: 110,
+                        templet:function (d){
+                            return $webUtil.formateBoolean(d.ignorewidthflag);
+                        }
+                    },{
+                        field: 'linkCharacter',
+                        title: '蹇界暐杩炴帴瀛楃',
+                        width: 350
+                    },
+                    {
+                        field:'options',
+                        title:'鎿嶄綔',
+                        width:150,
+                        templet:function(d){
+                            return '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>';
+                        }
+                    }];
+            }
+        };
+
+        this.getFormItems = function(onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [{
+                    field: 'id',
+                    title: '缂栧彿',
+                    type: 'text',
+                    required:true,
+                    defaultValue:"",
+                    readOnly:onlyShow
+                },{
+                    field: 'name',
+                    title: '鍚嶇О',
+                    type: 'text',
+                    required:true,
+                    defaultValue:"",
+                    readOnly:onlyShow
+                },
+                {
+                    field: 'ignoreallspaceflag',
+                    title: '蹇界暐鍏ㄩ儴绌烘牸',
+                    type: 'truefalse',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'ignorecaseflag',
+                    title: '蹇界暐澶у皬鍐�',
+                    type: 'truefalse',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'ignorespaceflag',
+                    title: '蹇界暐绌烘牸',
+                    type: 'truefalse',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'ignorewidthflag',
+                    title: '蹇界暐鍏ㄥ崐瑙�',
+                    type: 'truefalse',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                }    , {
+                    field: 'linkCharacter',
+                    title: '蹇界暐杩炴帴瀛楃',
+                    type: 'textarea',
+                    defaultValue: "",
+                    tooltips: '浣跨敤鑻辨枃閫楀彿鍒嗗壊杩炴帴绗︼紝濡�-,/',
+                    inputWidth: 520,
+                    readOnly: onlyShow
+                }             ];
+        };
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            that.addOrEdit(false,oid);
+        };
+        this.addOrEdit = function(add,oid) {
+            var that = this;
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var addSaveIndex =webUtil.dialog({
+                title:add?'娣诲姞鐩镐技鏌ヨ瑙勫垯':'淇敼鐩镐技鏌ヨ瑙勫垯',
+                btn:['淇濆瓨','鍙栨秷'],
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getFormItems(false),
+                        function () {
+                            if(!add){
+                                form.load(filter,{
+                                    backPath:that.backPath,
+                                    url:that.url.controller + that.url.getObjectByOid,
+                                    method:'get',
+                                    params:{
+                                        oid:oid
+                                    }
+                                });
+                            }else{
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+                        }, {}, {defaultColumnOneRow: 2,labelWidth: 130});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        var url = that.url.controller + (add?that.url.addSave:that.url.editSave);
+                        webUtil.manualAjax(add?'post':'put',url,JSON.stringify(values),function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts= webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+        this.refresh = function () {
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+        this.ADVQUERY = function () {
+            var that = this;
+            if(!that.serinorQueryInstance) {
+                var dynamicCondition = layui.dynamicCondition;
+                $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar' + that.id + '" class="layui-inline"></div>');
+                that.checkColumns();
+                var dataFields = [];
+                for(var i = 0 ; i < that.columns.length ; i ++){
+                    dataFields[i] = that.columns[i];
+                }
+                that.serinorQueryInstance = dynamicCondition.create({
+                    fields: dataFields//鏌ヨ瀛楁
+                    , tableId: "table_" + that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                    , type: "complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                    , queryCallBack: function (requestData) {//鏌ヨ涔嬪悗鐨刢allback
+
+                    }
+                });
+            }
+            that.serinorQueryInstance.open();
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/vciweb/mdm/CodeRule.js b/Source/platformProject/platform2022UI/vciweb/mdm/CodeRule.js
new file mode 100644
index 0000000..fad35d9
--- /dev/null
+++ b/Source/platformProject/platform2022UI/vciweb/mdm/CodeRule.js
@@ -0,0 +1,1779 @@
+/**
+ * 涓绘暟鎹紪鐮佽鍒欓〉闈�
+ * @author weidy
+ * @date 2022-01-24
+ */
+layui.define(['layer', 'element', 'form', 'table', 'dynamicCondition'], function (exports) {
+    var webUtil = $webUtil;
+    var Class = function () {
+        this.MODELNAME = "mdm/CodeRule";
+        this.moduleKey = "CodeRule";
+        this.backPath = configData.compatibility ? path : configData.mdmService;
+        this.url = {
+            controller: 'mdmRuleController/',
+            dataGrid: 'gridCodeRule',
+            addSave: 'addSave',
+            editSave: 'editSave',
+            deleteUrl: 'deleteData',
+            updateStatusUrl: 'updateStatus',
+            listUseRangeUrl: 'listUseRange',
+            getObjectByOid: 'getObjectByOid',
+            secController: 'codeBasicSecController/',
+            secDataGrid: 'gridCodeBasicSec',
+            secAddSave: 'addSave',
+            secEditSave: 'editSave',
+            secDeleteUrl: 'deleteData',
+            secGetObjectByOid: 'getObjectByOid',
+            codeFixedValueController:'codeFixedValueController/',
+            codeClassifyValueController:'codeClassifyValueController/',
+            clearCode:'clearAllCode'
+        };
+        this.getContent = function () {
+            var that = this;
+            return '<div id="UIContent_' + that.id + '" style="overflow: auto;padding:0 5px"></div>';
+        };
+        this.showContent = function () {
+            var that = this;
+            var html = "";
+            html = [
+                '<div class="layui-layout easyui-layout UIContentLayout "  id="easyuiLayout_', that.id, '" data-options="fit:true" style="display:block;overflow-y: hidden">',
+                '<div data-options="region:\'north\',split:true" title="缂栫爜瑙勫垯" style="height:360px;display:block;margin-top:0px;padding:0 5px" id="border_', that.id, '">',
+                '<div style="">',
+                that.getToolbarHtml(),
+                '<table id="table_', that.id, '" lay-filter="', that.id, '" style="overflow-x:auto;"></table>',
+                '</div>',
+                '</div>',
+                '<div data-options="region:\'center\'" title="鐮佹绠$悊" style="display:block;margin-top:0px;padding:0 5px " >',
+                '<div style="overflow-y:auto;">',
+                that.getSecToolbarHtml(),
+                '<table id="sec_', that.id, '" lay-filter="sec_', that.id, '" style="overflow-x:auto;"></table>',
+                '</div>',
+                '</div>',
+                '</div>'
+            ].join("");
+            $("#UIContent_" + that.id).html(html);
+        };
+        this.getToolbarHtml = function () {
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_', that.id, '" class="layui-btn-container layui-buttons">',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_', that.id, '_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_', that.id, '_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_', that.id, '_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_', that.id, '_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_', that.id, '_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_', that.id, '_clone"><i class="layui-icon layui-icon-share"></i>鍏嬮殕</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_', that.id, '_cloneSec"><i class="layui-icon layui-icon-share"></i>浠庡叾浠栬鍒欎腑鍏嬮殕鐮佹</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_', that.id, '_usedInfo"><i class="layui-icon layui-icon-template-1"></i>浣跨敤鑼冨洿</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_', that.id, '_CLEARCODE"><i class="layui-icon layui-icon-template-1"></i>娓呯┖鐮佸��</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getSecToolbarHtml = function () {
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_', that.id, '" class="layui-btn-container layui-buttons">',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_sec_', that.id, '_ADDSEC"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_sec_', that.id, '_EDITSEC"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_sec_', that.id, '_DELSEC"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_sec_', that.id, '_refreshSEC"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_sec_', that.id, '_ADVQUERYSEC"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.bindDefultButtonLisenter(that, "sec_" + that.id);
+            webUtil.createSearchHtml({
+                id: "缂栧彿",
+                name: "鍚嶇О"
+            }, $("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+
+        };
+        this.init = function () {
+            var that = this;
+            webUtil.copyConfig(that, that.moduleKey);
+            setTimeout(function () {
+                that.showContent();
+                var easyuiLayout = $('#easyuiLayout_' + that.id)
+                easyuiLayout.css({height: $('#portal_body').height() - 43, width: $('#portal_body').width() - 15})
+                easyuiLayout.layout();
+
+                that.initMainTable();
+                that.createSearchHtml();
+                that.initSecTable();
+            }, 1);
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath: that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                selectMode: table.selectMode.muti,
+                cols: [that.columns],
+                method: 'get',
+                done: function (res, cur, total) {
+                    if (!that.fristMainLoad) {
+                        table.on('tool(' + that.id + ')', function (obj) {
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if (layEvent == 'EDIT') {
+                                that.addOrEdit(false, data.oid);
+                            }else if(layEvent=='DISABLE'){
+                                that.updateStatus("disable",data.oid);
+                            }else if(layEvent=='ENABLE'){
+                                that.updateStatus("enable",data.oid);
+                            }else if(layEvent=='RELEASE'){
+                                that.updateStatus("release",data.oid);
+                            }
+                        });
+                    } else {
+                        if (total > 0) {
+                            table.selectRecord('table_' + that.id, {index: 0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                },
+                rowClick:function(thisTableFilter,record){
+                    that.codeRuleData=record;
+                    table.reload("sec_" + that.id, {
+                        extraParams: {
+                            "conditionMap['pkCodeRule']": record.oid
+                        }
+                    });
+                }
+            };
+            if (parentFieldName) {
+                options.treeConfig = {
+                    treepid: parentFieldName,
+                    treeid: 'id',
+                    showField: 'name'
+                };
+            }
+            table.render(options);
+        };
+        this.initSecTable = function () {
+            var that = this;
+            var table = layui.table;
+            that.checkSecColumns();
+            var tableWidth = $("#border_" + that.id).width();
+            var options = {
+                elem: '#sec_' + that.id,
+                id: 'sec_' + that.id,
+                backPath: that.backPath,
+                url: that.url.secController + that.url.secDataGrid,
+                limit: -1,
+                width: tableWidth,
+                selectMode: table.selectMode.muti,
+                cols: [that.secColumns],
+                method: 'get',
+                done: function (res, cur, total) {
+                    table.on('tool(sec_' + that.id + ')', function (obj) {
+                        var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                        var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                        if (layEvent == 'EDIT') {
+                            that.addOrEditSec(false, data);
+                        }else if (layEvent == 'VIEW') {
+                            that.viewSec(data);
+                        }else if (layEvent == 'UP') {
+                            that.upOrDown(data.oid,false);
+                        } else if (layEvent == 'DOWN') {
+                            that.upOrDown(data.oid,true);
+                        }else if(layEvent=='SECVALUE'){
+                            that.SECVALUE(data)
+                        }
+                    });
+                }
+            };
+            table.render(options);
+        };
+        this.checkColumns = function () {
+            var that = this;
+            var table = layui.table;
+            if (that.columns == null || that.columns.length == 0) {
+                that.columns = [table.getIndexColumn(), table.getCheckColumn(), {
+                    field: 'id',
+                    title: '缂栧彿',
+                    width: 150,
+                    sort: true
+                }, {
+                    field: 'name',
+                    title: '鍚嶇О',
+                    width: 200,
+                    sort: true
+                }, {
+                    field: 'description',
+                    title: '鎻忚堪',
+                    width: 160,
+                    sort: true
+                }, {
+                    field: 'lcStatusText',
+                    title: '鐘舵��',
+                    width: 90,
+                    sortField: 'lcstatus',
+                    sort: true
+                }, {
+                    field: 'options',
+                    title: '鎿嶄綔',
+                    width:150,
+                    templet: function (d) {
+                        if(d.lcStatus=='Disabled'){
+                            return '<a class="layui-btn layui-btn-intable" lay-event="ENABLE">鍚敤</a>';
+                        }else if(d.lcStatus=='Released'){
+                            return '<a class="layui-btn layui-btn-intable" lay-event="DISABLE">鍋滅敤</a>';
+                        }else if(d.lcStatus=='Editing'){
+                            return '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a> <a class="layui-btn layui-btn-intable" lay-event="RELEASE">鍙戝竷</a>';
+                        }else{
+                            return ''
+                        }
+                    }
+                }];
+            }
+        };
+        this.checkSecColumns = function () {
+            var that = this;
+            var table = layui.table;
+            if (that.secColumns == null || that.secColumns.length == 0) {
+                that.secColumns = [table.getIndexColumn(), table.getCheckColumn(), {
+                    field: 'id',
+                    title: '鐮佹缂栧彿',
+                    width: 150,
+                    sort: true
+                }, {
+                    field: 'name',
+                    title: '鐮佹鍚嶇О',
+                    width: 200,
+                    sort: true
+                }, {
+                    field: 'description',
+                    title: '鐮佹鎻忚堪',
+                    width: 180,
+                    sort: true
+                },
+                    {
+                        title: '鐮佹绫诲瀷',
+                        field: 'sectypeText',
+                        sort: true,
+                        sortField: 'sectype',
+                        type: 'combox',
+                        comboxKey: "codeSecType",
+                        width: 150
+                    },
+                    {
+                        field: 'options',
+                        title: '鎿嶄綔',
+                        width: 240,
+                        templet: function (d) {
+                            var up = (d.orderNum && d.orderNum>1)?'<a class="layui-btn layui-btn-intable" lay-event="UP">涓婄Щ</a>':'';
+                            var down = '<a class="layui-btn layui-btn-intable" lay-event="DOWN">涓嬬Щ</a>';
+                            var edit='<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>'
+                            if (that.codeRuleData.lcStatus != 'Editing'){
+                                edit='<a class="layui-btn layui-btn-intable" lay-event="VIEW">鏌ョ湅</a>'
+                            }
+                            if(d.sectype=='codeclassifysec' || d.sectype=='codefixedsec'){
+                                return edit+'<a class="layui-btn layui-btn-intable" lay-event="SECVALUE">鐮佸�肩鐞�</a>' +up + down;
+                            }else{
+                                return edit+up + down;
+                            }
+
+                        }
+                    }];
+            }
+        };
+
+        this.getFormItems = function (onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [
+                {
+                    field: 'id',
+                    title: '缂栧彿',
+                    required: true
+                }, {
+                    field: 'name',
+                    title: '鍚嶇О',
+                    required: true
+                }, {
+                    field: 'description',
+                    title: '鎻忚堪',
+                    type: 'textarea',
+                    inputWidth: 485
+                }
+            ];
+        };
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function () {
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id, true, true);
+            if (!oid) {
+                return false;
+            }
+            var lcStatus = webUtil.getOidFromGrid("table_" + that.id, true, true,lcStatus);
+            if (lcStatus != 'Editing') {
+                webUtil.showErrorMsg('鍙兘淇敼缂栬緫涓殑鏁版嵁');
+                return false;
+            }
+            that.addOrEdit(false, oid);
+        };
+        this.addOrEdit = function (add, oid) {
+            var that = this;
+            var form = layui.form;
+            var filter = "form_" + that.id;
+            var addSaveIndex = webUtil.dialog({
+                title: add ?  "娣诲姞缂栫爜瑙勫垯" : '淇敼缂栫爜瑙勫垯',
+                btn: ['淇濆瓨', '鍙栨秷'],
+                content: '<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin:5px 20px 0 0" ></form>',
+                resizing: function (layero) {
+                    form.doResize(filter);
+                },
+                success: function (layero, layerIndex, classP) {
+                    form.addItems(filter, that.getFormItems(false),
+                        function () {
+                            if (add) {
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues, filter);
+                            } else {
+                                form.load(filter, {
+                                    backPath: that.backPath,
+                                    url: that.url.controller + that.url.getObjectByOid,
+                                    method: 'get',
+                                    params: {
+                                        oid: oid
+                                    }
+                                });
+                            }
+                            webUtil.relocationOpen(classP)
+                        }, {}, {defaultColumnOneRow: 2});
+                },
+                yes: function (layero) {
+                    if (form.validata(filter)) {
+                        var values = form.getValues(filter, true);
+                        var url = that.url.controller + (add ? that.url.addSave : that.url.editSave);
+                        webUtil.manualAjax(add ? 'post' : 'put', url, JSON.stringify(values), function (result) {
+                            if (result.success) {
+                                webUtil.showMsgFromResult(result, (add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            } else {
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        }, function (xhr, err) {
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        }, that.backPath);
+                    }
+                },
+                btn2: function (layero) {
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function () {
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id, true, true);
+            if (!oid) {
+                return false;
+            }
+            var ts = webUtil.getOidFromGrid("table_" + that.id, false, false, "ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!", function () {
+                webUtil.deleteRequest(that.url.controller + that.url.deleteUrl, {oid: oid, ts: ts}, function (result) {
+                    if (result.success) {
+                        webUtil.showMsgFromResult(result, "鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    } else {
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                }, function (xhr, err) {
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                }, that.backPath);
+            });
+        };
+        this.refresh = function () {
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+        this.ENABLE = function (){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id, true, true);
+            if (!oid) {
+                return false;
+            }
+            that.updateStatus("enable",oid);
+        };
+        this.RELEASE = function (){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id, true, true);
+            if (!oid) {
+                return false;
+            }
+            that.updateStatus("release",oid);
+        }
+        this.DISABLE = function (){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id, true, true);
+            if (!oid) {
+                return false;
+            }
+            that.updateStatus("disable",oid);
+        };
+        this.updateStatus = function (able,oid){
+            var that = this;
+            var ts = webUtil.getOidFromGrid("table_" + that.id,false,false,"ts");
+            var paramTemp = JSON.stringify({
+                update:able,
+                oid:oid,
+                ts:ts
+            });
+            var url = that.url.controller + that.url.updateStatusUrl;
+            webUtil.showConfirmMsg("鏄惁瑕�"+ (able == "enbale" ? "鍚敤" : (able == "disable" ? "鍋滅敤": "鍙戝竷")) +"杩欐潯鏁版嵁锛�",function (){
+                webUtil.manualAjax('post',url, paramTemp, function (result) {
+                    if (result.success) {
+                        webUtil.showMsgFromResult(result, (able == "enbale" ? "鍚敤鎴愬姛" : (able == "disable" ? "鍋滅敤鎴愬姛": "鍙戝竷鎴愬姛")));
+                        that.refresh();
+                    } else {
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function (xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        }
+        this.clone=function (){
+            var that=this;
+            var tableData = layui.table.checkStatus("table_" + that.id).data;
+            if (tableData.length != 1) {
+                webUtil.showErrorMsg('璇烽�夋嫨涓�鏉$紪鐮佽鍒欐暟鎹�');
+                return false;
+            }
+            var that = this;
+            var form = layui.form;
+            var table = layui.table;
+            var filter = "form_" + that.id;
+            var addSaveIndex = webUtil.dialog({
+                title: "鍏嬮殕缂栫爜瑙勫垯",
+                btn: ['淇濆瓨', '鍙栨秷'],
+                area:['860px','600px'],
+                content: '<div style="margin: 0 5px"><form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form><div style="text-align: center">鐮佹绠$悊鏄庣粏</div><table id="tableFrom_'+ filter+'" lay-filter="tableFrom_'+filter+ '" style="overflow-x:auto;"></table></div>',
+                resizing: function (layero) {
+                    form.doResize(filter);
+                },
+                success: function (layero, layerIndex, classP) {
+                    form.addItems(filter, that.getFormItems(false),
+                        function () {
+                            form.setValues(tableData[0], filter)
+                        }, {}, {defaultColumnOneRow: 2});
+                    var secData = layui.table.getData('sec_' + that.id)
+                    var cols = that.secColumns.slice(2, 6)
+                    cols.push({
+                        field: 'options',
+                        title: '鎿嶄綔',
+                        width: 100,
+                        templet: function (d) {
+                            return '<a class="layui-btn layui-btn-intable" lay-event="UP">涓婄Щ</a><a class="layui-btn layui-btn-intable" lay-event="DOWN">涓嬬Щ</a>';
+                        }
+                    })
+                    cols.unshift(table.getIndexColumn())
+                    table.render({
+                        elem: '#tableFrom_' + filter,
+                        id: 'tableFrom_' + filter,
+                        cols: [cols],
+                        limit: -1,
+                        data: secData,
+                        done: function (res, cur, total) {
+                            table.on('tool(tableFrom_' + filter + ')', function (obj) {
+                                var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                                var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                                debugger;
+                                if (layEvent == 'UP') {
+                                    obj.index != 0 && layui.table.moveData('tableFrom_' + filter, obj.index, obj.index - 1)
+                                } else if (layEvent == 'DOWN') {
+                                    obj.index != secData.length - 1 && layui.table.moveData('tableFrom_' + filter, obj.index, obj.index + 1)
+                                }
+                            });
+                        }
+                    });
+                },
+                yes: function (layero) {
+                    if (form.validata(filter)) {
+                        var values = form.getValues(filter, true);
+                        values.oid=''
+                        var tableitems=layui.table.getData('tableFrom_' + filter);
+                        layui.each(tableitems,function (index,item){
+                            item.orderNum=index+1;
+                        })
+                        values.elements=tableitems;
+                        var url = that.url.controller + 'clone';
+                        webUtil.manualAjax('post', url, JSON.stringify(values), function (result) {
+                            if (result.success) {
+                                webUtil.showMsgFromResult(result, "鍏嬮殕鎴愬姛");
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            } else {
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        }, function (xhr, err) {
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        }, that.backPath);
+                    }
+                },
+                btn2: function (layero) {
+                    layer.close(addSaveIndex);
+                }
+            });
+        }
+        this.ADVQUERY = function () {
+            var that = this;
+            if (!that.serinorQueryInstance) {
+                var dynamicCondition = layui.dynamicCondition;
+                $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar' + that.id + '" class="layui-inline"></div>');
+                that.checkColumns();
+                var dataFields = [];
+                for (var i = 0; i < that.columns.length; i++) {
+                    dataFields[i] = that.columns[i];
+                }
+                that.serinorQueryInstance = dynamicCondition.create({
+                    fields: dataFields//鏌ヨ瀛楁
+                    , tableId: "table_" + that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                    , type: "complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                    , queryCallBack: function (requestData) {//鏌ヨ涔嬪悗鐨刢allback
+
+                    }
+                });
+            }
+            that.serinorQueryInstance.open();
+        };
+        this.CLEARCODE = function (){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id, true, true);
+            if (!oid) {
+                return false;
+            }
+            var ts = webUtil.getOidFromGrid("table_" + that.id, false, false, "ts");
+            webUtil.showConfirmMsg("纭畾瑕佹竻绌虹爜鍊硷紵濡傛灉娓呯┖灏嗕笉鑳借鎭㈠锛岃璋ㄦ厧!", function () {
+                webUtil.deleteRequest(that.url.controller + that.url.clearCode, {oid: oid, ts: ts}, function (result) {
+                    if (result.success) {
+                        webUtil.showMsgFromResult(result, "鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    } else {
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                }, function (xhr, err) {
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                }, that.backPath);
+            });
+        };
+
+        this.usedInfo = function (){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id, true, true);
+            if (!oid) {
+                return false;
+            }
+            var ts = webUtil.getOidFromGrid("table_" + that.id,false,false,"ts");
+            var table = layui.table;
+            var filter = "usedInfo_" + that.id;
+            var usedInfoTable = webUtil.dialog({
+                title: '缂栫爜瑙勫垯浣跨敤鑼冨洿',
+                area:['500px','600px'],
+                content: '<div style="margin: 0 5px"><table id="table_' + filter + '" lay-filter="table_' + filter +'" class="layui-table" style="overflow-x: auto" ></table></div>',
+                success: function (layero, layerIndex, classP) {
+                    table.render({
+                        elem: '#table_' + filter,
+                        id: 'table_' + filter,
+                        backPath: that.backPath,
+                        url: that.url.controller + 'listUseRange',
+                        extraParams: {
+                            oid: oid,
+                            ts: ts
+                        },
+                        page: {
+                            limit: 20,
+                            page: 1
+                        },
+                        cols: [[table.getIndexColumn(),{
+                            field: 'id',
+                            title: '鍒嗙被缂栧彿',
+                            width: 170,
+                            sort: true
+                        }, {
+                            field: 'name',
+                            title: '鍒嗙被鍚嶇О',
+                            width: 250,
+                            sort: true
+                        }]],
+                        method: 'get'
+                    });
+                }
+            })
+        };
+
+        this.ADDSEC = function () {
+            this.addOrEditSec(true)
+        };
+        this.EDITSEC = function () {
+            var that = this;
+            var secData = layui.table.checkStatus("sec_" + that.id).data;
+            if (secData.length != 1) {
+                webUtil.showErrorMsg('璇烽�夋嫨涓�鏉$爜娈电鐞嗘暟鎹�');
+                return false;
+            }
+            this.addOrEditSec(false,secData[0])
+        };
+        this.DELSEC = function () {
+            var that = this;
+            var oid = webUtil.getOidFromGrid("sec_" + that.id, true, true);
+            if (!oid) {
+                return false;
+            }
+            var ts = webUtil.getOidFromGrid("sec_" + that.id, false, false, "ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!", function () {
+                webUtil.deleteRequest(that.url.secController + that.url.secDeleteUrl, {oid: oid, ts: ts}, function (result) {
+                    if (result.success) {
+                        webUtil.showMsgFromResult(result, "鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    } else {
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                }, function (xhr, err) {
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                }, that.backPath);
+            });
+        };
+        this.cloneSec=function(){
+            var that = this;
+            var checkData = layui.table.checkStatus("table_" + that.id).data;
+            if (checkData.length != 1) {
+                webUtil.showErrorMsg('璇烽�夋嫨涓�鏉$紪鐮佽鍒欐暟鎹�');
+                return false;
+            }
+            var filter = "clone_" + that.id;
+            var table=layui.table;
+            var cloneIndex = webUtil.dialog({
+                title: '鍏嬮殕缂栫爜瑙勫垯鐨勫熀纭�淇℃伅',
+                btn: ['淇濆瓨', '鍙栨秷'],
+                area:['800px','660px'],
+                content: ['<div style="margin:5px">',
+                    '<div class="easyui-layout UIContentLayout"  id="easyuiLayout_',filter,'" data-options="fit:true" style="display:block;overflow-y: hidden;">',
+                        '<div data-options="region:\'north\',split:true" title="缂栫爜瑙勫垯" style="padding: 5px;height:300px;">',
+                            '<table id="table_'+ filter+'" lay-filter="table_'+filter+ '" style="overflow-x:auto;"></table>',
+                        '</div>',
+                        '<div data-options="region:\'center\',split:true" title="鐮佹淇℃伅" style="padding: 5px">',
+                            '<table id="tableSec_'+ filter+'" lay-filter="tableSec_'+filter+ '" style="overflow-x:auto;"></table>',
+                        '</div>',
+                    '</div></div>'].join(''),
+                resizing: function (layero) {
+                },
+                success: function (layero, layerIndex, classP) {
+                    var easyuiLayout = $('#easyuiLayout_' + filter)
+                    easyuiLayout.css({height: 550, width: 800})
+                    easyuiLayout.layout();
+                    var cols = that.columns.slice(0, 6)
+                    table.render({
+                        elem: '#table_' + filter,
+                        id: 'table_' + filter,
+                        backPath: that.backPath,
+                        url: that.url.controller + that.url.dataGrid,
+                        page: {
+                            limit: 20,
+                            page: 1
+                        },
+                        cols: [cols],
+                        method: 'get',
+                        done: function (res, cur, total) {
+                            if (total > 0) {
+                                table.selectRecord('table_' + filter, {index: 0});
+                                that.pkCodeRuleCloneOid = res.data[0].oid;
+                            }
+                        },
+                        rowClick:function(thisTableFilter,record){
+                            table.reload("tableSec_" + filter, {
+                                extraParams: {
+                                    "conditionMap['pkCodeRule']": record.oid
+                                }
+                            });
+                            that.pkCodeRuleCloneOid=record.oid;
+                        }
+                    });
+                    var seccols = that.secColumns.slice(0, 6)
+                    table.render({
+                        elem: '#tableSec_' + filter,
+                        id: 'tableSec_' + filter,
+                        backPath: that.backPath,
+                        url: that.url.secController + that.url.secDataGrid,
+                        limit: -1,
+                        selectMode: table.selectMode.muti,
+                        cols: [seccols],
+                        method: 'get'
+                    });
+                },
+                yes: function (layero) {
+                    var secData = layui.table.checkStatus("tableSec_" +filter).data;
+                    if (secData.length < 1) {
+                        webUtil.showErrorMsg('璇烽�夋嫨鐮佹鏁版嵁');
+                        return false;
+                    }
+                    if(that.pkCodeRuleCloneOid==checkData[0].oid){
+                        webUtil.showErrorMsg('闇�瑕佸厠闅嗙殑缂栫爜瑙勫垯涓庤鍏嬮殕鐨勭紪鐮佽鍒欑浉鍚�');
+                        return false;
+                    }
+                    var oids=[];
+                    layui.each(secData,function (i,item){
+                        oids.push(item.oid)
+                    })
+                    var url = that.url.secController + 'clone';
+                    webUtil.manualAjax('post', url, JSON.stringify({pkCodeRule:checkData[0].oid,oidArr:oids.join(',')}), function (result) {
+                        if (result.success) {
+                            webUtil.showMsgFromResult(result, "鍏嬮殕鎴愬姛");
+                            layer.close(cloneIndex);
+                            that.refreshSEC();
+                        } else {
+                            webUtil.showErrorMsg(result.msg);
+                        }
+                    }, function (xhr, err) {
+                        webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                    }, that.backPath);
+                },
+                btn2: function (layero) {
+                    layer.close(cloneIndex);
+                }
+            });
+        }
+        this.refreshSEC = function (){
+            var that = this;
+            layui.table.reload("sec_" + that.id);
+        }
+        //鐮佸�肩鐞�
+        this.SECVALUE =function (data){
+            var that =this;
+            if(data.sectype=='codeclassifysec'){
+                that.codeclassifyValue(data)
+            }else  if(data.sectype=='codefixedsec'){
+                that.codefixedValue(data)
+            }
+        }
+        //鍒嗙被鐮佹
+        this.codeclassifyValue=function (data){
+            var that = this;
+            var form = layui.form;
+            var tree=layui.tree;
+            var filter = "codeclassify_" + that.id;
+            var html=[
+                '<div class="easyui-layout UIContentLayout"  id="easyuiLayout_', filter, '" data-options="fit:true" style="display:block;overflow-y: hidden;">',
+                    '<div data-options="region:\'west\',split:true" style="width:350px;padding: 5px;">',
+                        '<div style="height: 465px;border: 1px solid #e6e6e6;padding: 5px;margin-bottom:5px;overflow-y: auto">',
+                            '<ul layui-filter="tree_', filter, '"></ul>',
+                        '</div>',
+                        '<button class="layui-btn layui-btn-sm toolbar_', filter, '_up"><i class="layui-icon layui-icon-up"></i>涓婄Щ</button>',
+                        '<button class="layui-btn layui-btn-sm toolbar_', filter, '_down"><i class="layui-icon layui-icon-down"></i>涓嬬Щ</button>',
+                    '</div>',
+                    '<div data-options="region:\'center\'" style="padding-left: 5px;padding-right: 5px;" id="border_', filter, '">',
+                        '<div class="layui-center">',
+                            '<form id="form_' + filter + '" lay-filter="form_' + filter + '" class="layui-form" ></form>',
+                            '<div style="text-align: center">',
+                                '<button class="layui-btn layui-btn-sm toolbar_', filter, '_add"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                                '<button disabled class="layui-btn layui-btn-sm layui-btn-disabled toolbar_', filter, '_edit"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                                '<button disabled class="layui-btn layui-btn-sm layui-btn-disabled toolbar_', filter, '_del"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                                '<button class="layui-btn layui-btn-sm toolbar_', filter, '_cancel"><i class="layui-icon layui-icon-close"></i>鍙栨秷</button>',
+                            '</div>',
+                        '</div>',
+                    '</div>',
+                '</div>'
+            ]
+            var addSaveIndex = webUtil.dialog({
+                title: '鐮佹鐮佸�肩鐞�',
+                btn: [],
+                area:['700px','580px'],
+                content: html.join(''),
+                resizing: function (layero) {
+                    form.doResize(filter);
+                },
+                success: function (layero, layerIndex, classP) {
+                    var easyuiLayout = $('#easyuiLayout_' + filter)
+                    easyuiLayout.css({height: 513, width: 700})
+                    easyuiLayout.parent().parent().css({margin: '5px'})
+                    easyuiLayout.layout();
+                    var treeUL = $('[layui-filter="tree_' + filter + '"]');
+                    tree.init("tree_" + filter, treeUL, {
+                        url: that.url.codeClassifyValueController + 'treeCodeClassifyValue',
+                        backPath: that.backPath,
+                        loadType:tree.loadType.all,
+                        extraParams: {
+                            isMuti: false,
+                            isQueryAllColumn: true,
+                            "conditionMap['codeclassifysecoid']": data.oid
+                        },
+                        showSearch: true,
+                        click: function (item, elem, options) {
+                            that.currentCodeItem = item;
+                            that.currentCodeItemOid = item.oid;
+                            that.currentCodeItemAttributes = item.attributes;
+                            form.setValues(item.attributes, 'form_' + filter);
+                            $('.toolbar_' + filter + '_add').removeAttr('disabled','disabled').removeClass('layui-btn-disabled')
+                            $('.toolbar_' + filter + '_edit').removeAttr('disabled').removeClass('layui-btn-disabled')
+                            $('.toolbar_' + filter + '_del').removeAttr('disabled').removeClass('layui-btn-disabled')
+                        }
+                    });
+
+                    var refreshTree=function (){
+                        /*if (that.currentCodeItem) {
+                            if (webUtil.isNotNull(that.currentCodeItem.parentId)) {
+                                tree.reloadNode("tree_" + filter, that.currentCodeItem.parentId, function (fil, elem, data) {
+                                    var currentelem = layui.tree.getElemByItem("tree_" + filter, that.currentCodeItemOid);
+                                    if (currentelem.length > 0) {
+                                        currentelem.children('a').trigger('click')
+                                    } else {
+                                        elem.children('a').trigger('click').trigger('click')
+                                    }
+                                });
+                            } else {
+                                tree.reload("tree_" + filter, {
+                                    loadCallback: function (fil, tempNode) {
+                                        if (that.currentCodeItemOid) {
+                                            var currentelem = layui.tree.getElemByItem("tree_" + filter, that.currentItemOid);
+                                            if (currentelem.length > 0) {
+                                                currentelem.children('a').trigger('click')
+                                            }
+                                        }
+                                    }
+                                });
+                            }
+                        }else{*/
+                            tree.reload("tree_" + filter, {
+                                loadCallback: function (fil, tempNode) {
+                                }
+                            });
+                        //}
+                    }
+                    form.addItems('form_' + filter, [{
+                            field: 'id',
+                            title: '鐮佸��',
+                            required: true
+                        }, {
+                            field: 'name',
+                            title: '鍚嶇О',
+                            required: true
+                        }],
+                        function () {
+                        }, {}, {labelWidth: 80, textWidth: 220});
+                    $('.toolbar_' + filter + '_up').click(function () {
+                        if(that.currentCodeItemAttributes.ordernum==0){
+                            return;
+                        }
+                        that.currentCodeItemAttributes.ordernum=parseInt(that.currentCodeItemAttributes.ordernum)-1;
+
+                        var currentelem = layui.tree.getElemByItem("tree_" + filter, that.currentCodeItemOid)
+                        var prevData=tree.getDataByOid("tree_" + filter,tree.getOidByElem("tree_" + filter,currentelem.prev()));
+                        prevData.attributes.ordernum=parseInt(prevData.attributes.ordernum)+1;
+                        webUtil.manualAjax('post', 'codeClassifyValueController/saveOrder', JSON.stringify({
+                            dtoList: [that.currentCodeItemAttributes, prevData.attributes],
+                            codeclassifysecoid: data.oid
+                        }), function (result) {
+                            if (result.success) {
+                                webUtil.showMsgFromResult(result, "淇濆瓨鎴愬姛");
+                                refreshTree()
+                            } else {
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        }, function (xhr, err) {
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        }, that.backPath);
+                    })
+                    $('.toolbar_' + filter + '_down').click(function () {
+                        var currentelem = layui.tree.getElemByItem("tree_" + filter, that.currentCodeItemOid);
+                        if(webUtil.isNull(currentelem.next()[0])){
+                            return;
+                        }
+                        that.currentCodeItemAttributes.ordernum=parseInt(that.currentCodeItemAttributes.ordernum)+1;
+                        var nextData=tree.getDataByOid("tree_" + filter,tree.getOidByElem("tree_" + filter,currentelem.next()));
+                        nextData.attributes.ordernum=parseInt(nextData.attributes.ordernum)-1;
+                        webUtil.manualAjax('post', 'codeClassifyValueController/saveOrder', JSON.stringify({
+                            dtoList: [that.currentCodeItemAttributes,nextData.attributes],
+                            codeclassifysecoid: data.oid
+                        }), function (result) {
+                            if (result.success) {
+                                webUtil.showMsgFromResult(result, "淇濆瓨鎴愬姛");
+                                refreshTree()
+                            } else {
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        }, function (xhr, err) {
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        }, that.backPath);
+                    })
+                    $('.toolbar_' + filter + '_add').click(function () {
+                        if (form.validata('form_' + filter)) {
+                            var values = form.getValues('form_' + filter, true);
+                            values.codeclassifysecoid=data.oid;
+                            values.oid=''
+                            if(that.currentCodeItemOid){
+                                values.parentclassifyvalueoid=that.currentCodeItemOid
+                            }
+                            if(values.id.length>data.codeSecLength){
+                                webUtil.showErrorMsg('鐮佸�奸暱搴︿笉鑳藉ぇ浜�'+data.codeSecLength);
+                                return;
+                            }
+                            webUtil.manualAjax('post', that.url.codeClassifyValueController +that.url.addSave, JSON.stringify(values), function (result) {
+                                if (result.success) {
+                                    webUtil.showMsgFromResult(result, "娣诲姞鎴愬姛");
+                                    refreshTree()
+                                    form.setValues({oid:'',name:'',id:''},'form_' + filter);
+                                    $('.toolbar_' + filter + '_add').removeAttr('disabled').removeClass('layui-btn-disabled')
+                                    $('.toolbar_' + filter + '_edit').attr('disabled','disabled').addClass('layui-btn-disabled')
+                                    $('.toolbar_' + filter + '_del').attr('disabled','disabled').addClass('layui-btn-disabled')
+                                } else {
+                                    webUtil.showErrorMsg(result.msg);
+                                }
+                            }, function (xhr, err) {
+                                webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                            }, that.backPath);
+                        }
+                    })
+                    $('.toolbar_' + filter + '_edit').click(function () {
+                        if (form.validata('form_' + filter)) {
+                            var values = form.getValues('form_' + filter, true);
+                            if(values.id.length>data.codeSecLength){
+                                webUtil.showErrorMsg('鐮佸�奸暱搴︿笉鑳藉ぇ浜�'+data.codeSecLength);
+                                return;
+                            }
+                            webUtil.manualAjax('put', that.url.codeClassifyValueController +that.url.editSave, JSON.stringify(values), function (result) {
+                                if (result.success) {
+                                    webUtil.showMsgFromResult(result, "淇敼鎴愬姛");
+                                    refreshTree()
+                                } else {
+                                    webUtil.showErrorMsg(result.msg);
+                                }
+                            }, function (xhr, err) {
+                                webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                            }, that.backPath);
+                        }
+                    })
+                    $('.toolbar_' + filter + '_del').click(function () {
+                        var values = form.getValues('form_' + filter, true);
+                        webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!", function () {
+                            webUtil.deleteRequest(that.url.codeClassifyValueController +that.url.deleteUrl, {oid: values.oid, ts: values.ts}, function (result) {
+                                if (result.success) {
+                                    webUtil.showMsgFromResult(result, "鍒犻櫎鎴愬姛");
+                                    refreshTree()
+                                    form.setValues({oid:'',name:'',id:''},'form_' + filter)
+                                    $('.toolbar_' + filter + '_add').removeAttr('disabled').removeClass('layui-btn-disabled')
+                                    $('.toolbar_' + filter + '_edit').attr('disabled','disabled').addClass('layui-btn-disabled')
+                                    $('.toolbar_' + filter + '_del').attr('disabled','disabled').addClass('layui-btn-disabled')
+                                } else {
+                                    webUtil.showErrorMsg(result.msg);
+                                }
+                            }, function (xhr, err) {
+                                webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                            }, that.backPath);
+                        });
+                    })
+                    $('.toolbar_' + filter + '_cancel').click(function () {
+                        form.setValues({oid:'',name:'',id:''},'form_' + filter)
+                        $('.toolbar_' + filter + '_add').removeAttr('disabled').removeClass('layui-btn-disabled')
+                        $('.toolbar_' + filter + '_edit').attr('disabled','disabled').addClass('layui-btn-disabled')
+                        $('.toolbar_' + filter + '_del').attr('disabled','disabled').addClass('layui-btn-disabled')
+                    })
+                }
+            });
+        }
+        //鍥哄畾鐮佹
+        this.codefixedValue=function (data){
+            var that = this;
+            var form = layui.form;
+            var table = layui.table;
+            var filter = "codefixed_" + that.id;
+            var html=[
+                '<div class="easyui-layout UIContentLayout"  id="easyuiLayout_', filter, '" data-options="fit:true" style="display:block;overflow-y: hidden;">',
+                    '<div data-options="region:\'west\',split:true" style="width:510px;padding: 0 5px 5px;">',
+                        '<div>',
+                            '<table class="layui-table" lay-size="sm" lay-even lay-filter="table_' + filter + '" id="table_' + filter + '" ></table>',
+                            '<button class="layui-btn layui-btn-sm toolbar_', filter, '_save"><i class="layui-icon layui-icon-ok"></i>淇濆瓨</button>',
+                        '</div>',
+                    '</div>',
+                    '<div data-options="region:\'center\'" style="padding-left: 5px;padding-right: 5px;" id="border_', filter, '">',
+                        '<div class="layui-center">',
+                            '<form id="form_' + filter + '" lay-filter="form_' + filter + '" class="layui-form" ></form>',
+                            '<div style="text-align: center">',
+                                '<button class="layui-btn layui-btn-sm toolbar_', filter, '_add" style=""><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                                '<button disabled class="layui-btn layui-btn-sm layui-btn-disabled toolbar_', filter, '_edit"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                                '<button disabled class="layui-btn layui-btn-sm layui-btn-disabled toolbar_', filter, '_del"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                                '<button class="layui-btn layui-btn-sm toolbar_', filter, '_cancel"><i class="layui-icon layui-icon-close"></i>鍙栨秷</button>',
+                            '</div>',
+                        '</div>',
+                    '</div>',
+                '</div>'
+            ]
+            var addSaveIndex = webUtil.dialog({
+                title: '鐮佹鐮佸�肩鐞�',
+                btn: [],
+                area:['900px','580px'],
+                content: html.join(''),
+                resizing: function (layero) {
+                    form.doResize(filter);
+                },
+                success: function (layero, layerIndex, classP) {
+                    var easyuiLayout = $('#easyuiLayout_' + filter)
+                    easyuiLayout.css({height: 513, width: 900})
+                    easyuiLayout.parent().parent().css({margin: '5px'})
+                    easyuiLayout.layout();
+                    that.delcodefixedOids=[]
+                    var getfirstData=true;
+                    var getTableData = function (filter) {
+                        var params = {};
+                        var sourceDataParams = {}
+                        var options = layui.table.getConfig(filter)
+                        params['page'] = 1;
+                        params['limit'] = -1;
+                        if (options.sourceDataParams) {
+                            //璇存槑鏄墿灞曞睘鎬�
+                            for (var key in options.sourceDataParams) {
+                                if (key && key.constructor === Object) return;
+                                sourceDataParams['sourceData["' + key + '"]'] = options.sourceDataParams[key];//鏂扮殑鏂瑰紡
+                            }
+                        }
+                        //鍙傛暟
+                        var where = $.extend(params, options.where, options.extraParams, options.queryParams, sourceDataParams);
+                        $webUtil.ajax('get', that.url.codeFixedValueController + 'gridCodeFixedValue', where, function (res) {
+                            layui.table.reload(filter, {
+                                data: res.data
+                            })
+                        }, function (e, msg) {
+                            $webUtil.showDebugMsg('鏁版嵁鎺ュ彛璇锋眰寮傚父锛岄敊璇彁绀猴細' + msg);
+                        }, that.backPath, true);
+                    }
+                    table.render({
+                        elem: '#table_' + filter,
+                        id: 'table_' + filter,
+                        data: [],
+                        limit: -1,
+                        height:460,
+                        extraParams:{
+                            "conditionMap['codefixedsecoid']": data.oid
+                        },
+                        cols: [[table.getIndexColumn(), {
+                            field: 'id',
+                            title: '鐮佸��',
+                            width: 150
+                        }, {
+                            field: 'description',
+                            title: '鎻忚堪',
+                            width: 120
+                        }, {
+                            field: 'options',
+                            title: '鎿嶄綔',
+                            width: 150,
+                            templet: function (d) {
+                                return ['<a class="layui-btn layui-btn-intable" lay-event="UP">涓婄Щ</a>', '<a class="layui-btn layui-btn-intable" lay-event="DOWN">涓嬬Щ</a>', '<a class="layui-btn layui-btn-intable" lay-event="REM">绉婚櫎</a>'].join('');
+                            }
+                        }]],
+                        method: 'get',
+                        done: function (res, cur, total) {
+                            if(getfirstData){
+                                getTableData('table_' + filter)
+                                table.on('tool(table_' + filter + ')', function (obj) {
+                                    var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                                    var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                                    if (layEvent == 'UP') {
+                                        obj.index != 0 && table.moveData('table_' + filter, obj.index, obj.index - 1)
+                                        that.UPTempAttr(data, 'table_' + filter);
+                                    } else if (layEvent == 'DOWN') {
+                                        obj.index != table.getData('table_' + filter).length - 1 && table.moveData('table_' + filter, obj.index, obj.index + 1)
+                                    } else if (layEvent == 'REM') {
+                                        that.delcodefixedOids.push(data.oid)
+                                        table.removeData('table_' + filter, data[table.config.indexName]);
+                                    }
+                                });
+                                getfirstData=false;
+                            }
+                        },
+                        rowClick: function (thisTableFilter, record) {
+                            form.setValues(record, 'form_' + filter);
+                            $('.toolbar_' + filter + '_add').attr('disabled','disabled').addClass('layui-btn-disabled')
+                            $('.toolbar_' + filter + '_edit').removeAttr('disabled').removeClass('layui-btn-disabled')
+                            $('.toolbar_' + filter + '_del').removeAttr('disabled').removeClass('layui-btn-disabled')
+                        }
+                    });
+
+                    form.addItems('form_' + filter, [{
+                            field: 'id',
+                            title: '鐮佸��',
+                            required: true
+                        }, {
+                            field: 'description',
+                            title: '鎻忚堪',
+                            type: 'textarea'
+                        }],
+                        function () {
+                        }, {}, {labelWidth: 100, textWidth: 240});
+                    $('.toolbar_' + filter + '_save').click(function () {
+                        var tabledata = table.getData('table_' + filter);
+                        var dtoList=[];
+                        layui.each(tabledata,function (i,item){
+                            item.ordernum=i;
+                            dtoList.push(item);
+                        })
+                        webUtil.manualAjax('post', 'codeFixedValueController/saveOrder', JSON.stringify({
+                            dtoList: dtoList,
+                            codefixedsecoid: data.oid
+                        }), function (result) {
+                            if (result.success) {
+                                that.delcodefixedOids=[]
+                                webUtil.showMsgFromResult(result, "淇濆瓨鎴愬姛");
+                            } else {
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        }, function (xhr, err) {
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        }, that.backPath);
+                    })
+                    $('.toolbar_' + filter + '_add').click(function () {
+                        if (form.validata('form_' + filter)) {
+                            var values = form.getValues('form_' + filter, true);
+                            values.codefixedsecoid=data.oid;
+                            if(values.id.length>data.codeSecLength){
+                                webUtil.showErrorMsg('鐮佸�奸暱搴︿笉鑳藉ぇ浜�'+data.codeSecLength);
+                                return;
+                            }
+                            webUtil.manualAjax('post', that.url.codeFixedValueController +that.url.addSave, JSON.stringify(values), function (result) {
+                                if (result.success) {
+                                    webUtil.showMsgFromResult(result, "娣诲姞鎴愬姛");
+                                    getTableData('table_' + filter);
+                                    form.setValues({oid:'',name:'',description:''},'form_' + filter);
+                                    $('.toolbar_' + filter + '_add').removeAttr('disabled').removeClass('layui-btn-disabled')
+                                    $('.toolbar_' + filter + '_edit').attr('disabled','disabled').addClass('layui-btn-disabled')
+                                    $('.toolbar_' + filter + '_del').attr('disabled','disabled').addClass('layui-btn-disabled')
+                                } else {
+                                    webUtil.showErrorMsg(result.msg);
+                                }
+                            }, function (xhr, err) {
+                                webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                            }, that.backPath);
+                        }
+                    })
+                    $('.toolbar_' + filter + '_edit').click(function () {
+                        if (form.validata('form_' + filter)) {
+                            var values = form.getValues('form_' + filter, true);
+                            if(values.id.length>data.codeSecLength){
+                                webUtil.showErrorMsg('鐮佸�奸暱搴︿笉鑳藉ぇ浜�'+data.codeSecLength);
+                                return;
+                            }
+                            webUtil.manualAjax('put', that.url.codeFixedValueController +that.url.editSave, JSON.stringify(values), function (result) {
+                                if (result.success) {
+                                    webUtil.showMsgFromResult(result, "淇敼鎴愬姛");
+                                    getTableData('table_' + filter)
+                                } else {
+                                    webUtil.showErrorMsg(result.msg);
+                                }
+                            }, function (xhr, err) {
+                                webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                            }, that.backPath);
+                        }
+                    })
+                    $('.toolbar_' + filter + '_del').click(function () {
+                        var values = form.getValues('form_' + filter, true);
+                        webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!", function () {
+                            webUtil.deleteRequest(that.url.codeFixedValueController + that.url.deleteUrl, {oid: values.oid, ts: values.ts}, function (result) {
+                                if (result.success) {
+                                    webUtil.showMsgFromResult(result, "鍒犻櫎鎴愬姛");
+                                    getTableData('table_' + filter)
+                                    form.setValues({oid:'',name:'',description:''},'form_' + filter)
+                                    $('.toolbar_' + filter + '_add').removeAttr('disabled').removeClass('layui-btn-disabled')
+                                    $('.toolbar_' + filter + '_edit').attr('disabled','disabled').addClass('layui-btn-disabled')
+                                    $('.toolbar_' + filter + '_del').attr('disabled','disabled').addClass('layui-btn-disabled')
+                                } else {
+                                    webUtil.showErrorMsg(result.msg);
+                                }
+                            }, function (xhr, err) {
+                                webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                            }, that.backPath);
+                        });
+                    })
+                    $('.toolbar_' + filter + '_cancel').click(function () {
+                        form.setValues({oid:'',name:'',description:''},'form_' + filter)
+                        $('.toolbar_' + filter + '_add').removeAttr('disabled').removeClass('layui-btn-disabled')
+                        $('.toolbar_' + filter + '_edit').attr('disabled','disabled').addClass('layui-btn-disabled')
+                        $('.toolbar_' + filter + '_del').attr('disabled','disabled').addClass('layui-btn-disabled')
+                    })
+                }
+            });
+        }
+        this.viewSec =function (codeData){
+            var that=this;
+            var form = layui.form;
+            var filter = "form_" + that.id;
+            var viewIndex = webUtil.dialog({
+                title: '鏌ョ湅鐮佹淇℃伅',
+                btn: [],
+                area:['775px','580px'],
+                content: '<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin:10px 0px 10px 10px;padding-right:30px;height:460px;border-right: 2px #E9E7E7 solid;display: inline-block" ></form>' +
+                    '<form id="sec_' + filter + '" lay-filter="sec_' + filter + '" class="layui-form" style="margin:10px 25px 40px -2px;display: inline-block;float:right"></form>',
+                resizing: function (layero) {
+                    form.doResize(filter);
+                },
+                success: function (layero, layerIndex, classP) {
+                    form.addItems(filter, that.getSecFormItems(true),
+                        function () {
+                            form.setValues(codeData, filter);
+                            that.sectype = codeData.sectype;
+                            var ishidden=true;
+                            if(codeData.sectype=='codelevelsec'){
+                                ishidden=codeData.valueCutType=='code_cut_none';
+                            }else{
+                                ishidden=webUtil.isNull(codeData.referCodeClassifyOid)
+                            }
+                            form.addItems("sec_" + filter, that.getSecItemFormItems(codeData.pkCodeRule,codeData.oid,that.sectype,true,ishidden), function () {
+                                form.setValues(codeData, "sec_" + filter);
+                            }, {}, {defaultColumnOneRow: 1, labelWidth: 150});
+                        }, {}, {defaultColumnOneRow: 1, labelWidth: 130});
+
+                }
+            });
+        }
+        this.addOrEditSec = function (add,codeData) {
+            var that = this;
+            var checkData = layui.table.checkStatus("table_" + that.id).data;
+            if (checkData.length != 1) {
+                webUtil.showErrorMsg('璇烽�夋嫨涓�鏉$紪鐮佽鍒欐暟鎹�');
+                return false;
+            }
+            if (checkData[0].lcStatus != 'Editing') {
+                webUtil.showErrorMsg('缂栫爜瑙勫垯鐘舵�佷笉鏄�"缂栬緫涓�"锛屼笉鍏佽缂栬緫鐮佹');
+                return false;
+            }
+            var oid=codeData?codeData.oid:'';
+            var form = layui.form;
+            var filter = "form_" + that.id;
+            var addSaveIndex = webUtil.dialog({
+                title: add ? '娣诲姞鐮佹淇℃伅' : '淇敼鍩虹淇℃伅',
+                btn: ['淇濆瓨', '鍙栨秷'],
+                area:['775px','580px'],
+                content: '<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin:10px 0px 10px 10px;padding-right:30px;height:460px;border-right: 2px #E9E7E7 solid;display: inline-block" ></form>' +
+                    '<form id="sec_' + filter + '" lay-filter="sec_' + filter + '" class="layui-form" style="margin:10px 25px 40px -2px;display: inline-block;float:right"></form>',
+                resizing: function (layero) {
+                    form.doResize(filter);
+                },
+                success: function (layero, layerIndex, classP) {
+                    form.addItems(filter, that.getSecFormItems(false),
+                        function () {
+                            if (!add) {
+                                /*form.load(filter, {
+                                    backPath: that.backPath,
+                                    url: that.url.secController + that.url.secGetObjectByOid,
+                                    method: 'get',
+                                    params: {
+                                        oid: oid
+                                    }
+                                });*/
+                                form.setValues(codeData, filter);
+                            } else {
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues, filter);
+                            }
+
+                            $('.layui-form-switch').css({display:'inline-block'})
+                            form.on('switch(serialDependFlag)', function (data) {
+                                var parentDiv = data.othis.parents('.layui-input-inline');
+                                if (this.value == 'false') {
+                                    parentDiv.find('input[name="serialDependOrder"]').remove();
+                                } else {
+                                    if (parentDiv.find('input[name="serialDependOrder"]').length == 0) {
+                                        var inputDiv = $('<input type="number" name="serialDependOrder" autofocus lay-verify="serialDependOrder" class="layui-input" style="width: 100px;display: inline-block;margin-left:10px">');
+                                        inputDiv.appendTo(parentDiv);
+                                    }
+                                }
+                            });
+
+                            that.sectype='codefixedsec';
+                            var ishidden=true;
+                            if(!add){
+                                that.sectype = codeData.sectype;
+                                if(codeData.sectype=='codelevelsec'){
+                                    ishidden=codeData.valueCutType=='code_cut_none';
+                                }else{
+                                    ishidden=webUtil.isNull(codeData.referCodeClassifyOid)
+                                }
+                            }
+                            form.addItems("sec_" + filter, that.getSecItemFormItems(checkData[0].oid,oid,that.sectype,false,ishidden), function () {
+                                if (!add) {
+                                    form.setValues(codeData, "sec_" + filter);
+                                } else {
+                                    var defaultValues = {valueCutType:'code_cut_none'};
+                                    //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                    form.setValues(defaultValues, "sec_" + filter);
+                                }
+                                form.on('select(valueCutType)',function (data){
+                                    if(data.value=='code_cut_none') {
+                                        //涓嶆埅鍙�
+                                        form.changeItems("sec_" + filter, that.getSecItemFormItems(checkData[0].oid,oid,that.sectype, false, true));
+                                    }else{
+                                        form.changeItems("sec_" + filter,that.getSecItemFormItems(checkData[0].oid,oid,that.sectype,false,false));
+                                    }
+                                })
+                            }, {}, {defaultColumnOneRow: 1, labelWidth: 150});
+
+                            form.on('select(sectype)',function (data){
+                                that.sectype=data.value;
+                                ishidden=true;
+                                form.removeItems("sec_" + filter,[],true)
+                                form.addItems("sec_" + filter, that.getSecItemFormItems(checkData[0].oid,oid,data.value,false,ishidden), function () {
+                                    form.setValues(data, "sec_" + filter);
+                                }, {}, {labelWidth: 150})
+                            })
+
+                            form.on('select(sec_'+filter+')',function (data){
+                                if(data.name=='referBtmId'){
+                                    form.setValues({referConfig:'',referValueInfo:''}, "sec_" + filter);
+                                }
+                                if(data.name=='referConfig'){
+                                    debugger;
+                                    form.setValues({referBtmId:data.rowData.referType,referBtmName:data.rowData.referTypeName}, "sec_" + filter);
+                                }
+                                if(data.name=='referAttributeId'){
+                                    var selectData = data.rowData;
+                                    form.setValues({
+                                        referCodeClassifyOid:selectData[0]['currentItem'].oid,
+                                        referCodeClassifyOidName:selectData[0]['currentItem'].text
+                                    },"sec_" + filter)
+                                }
+                            })
+
+
+                        }, {}, {defaultColumnOneRow: 1, labelWidth: 130});
+
+                },
+                yes: function (layero) {
+                    if (form.validata(filter) && form.validata("sec_" + filter)) {
+                        var values = form.getValues(filter, true);
+                        console.log(values);
+                        var secvalues = form.getValues("sec_" + filter, true);
+                        console.log(secvalues);
+                        var newvalues = $.extend({}, values, secvalues);
+                        var serialDependOrder=$('input[name="serialDependOrder"]').val();
+                        if(webUtil.isNotNull(serialDependOrder) && !/^[+]{0,1}(\d+)$/.test(serialDependOrder)){
+                            webUtil.showErrorMsg("娴佹按渚濊禆椤哄簭鍙兘濉啓姝f暣鏁�");
+                            return false;
+                        }else{
+                            newvalues.serialDependOrder=serialDependOrder;
+                        }
+                        if(add) {
+                            newvalues.pkCodeRule = checkData[0].oid;
+                            newvalues.orderNum = layui.table.getData("table_" + that.id).length;
+                        }
+                        var url = that.url.secController + (add ? that.url.secAddSave : that.url.secEditSave);
+                        webUtil.manualAjax(add ? 'post' : 'put', url, JSON.stringify(newvalues), function (result) {
+                            if (result.success) {
+                                webUtil.showMsgFromResult(result, (add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refreshSEC();
+                            } else {
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        }, function (xhr, err) {
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        }, that.backPath);
+                    }
+                },
+                btn2: function (layero) {
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.getSecFormItems = function (onlyShow) {
+            return [{
+                field: 'id',
+                title: '鐮佹缂栧彿',
+                required: true
+            }, {
+                field: 'name',
+                title: '鐮佹鍚嶇О',
+                required: true
+            }, {
+                field: 'sectype',
+                title: '鐮佹绫诲瀷',
+                required: true,
+                type: 'combox',
+                comboxKey: 'codeSecType',
+                search:true,
+                defaultValue: "codefixedsec",
+                readOnly: onlyShow
+            }, {
+                field: 'description',
+                title: '鎻忚堪',
+                type: 'textarea'
+            }, {
+                field: 'serialDependFlag',
+                title: '鏄惁娴佹按渚濊禆',
+                type: 'truefalse',
+                defaultValue: "false",
+                readOnly: onlyShow
+            }, {
+                field: 'componentCodeFlag',
+                title: '鏄惁鍙備笌缂栫爜',
+                type: 'truefalse',
+                defaultValue: "false",
+                readOnly: onlyShow,
+                hidden:true
+            }, {
+                field: 'nullableFlag',
+                title: '鏄惁涓虹┖',
+                type: 'truefalse',
+                defaultValue: "false",
+                readOnly: onlyShow
+            }, {
+                field: 'displayFlag',
+                title: '鏄惁鏄剧ず',
+                type: 'truefalse',
+                defaultValue: "false",
+                readOnly: onlyShow,
+                hidden:true
+            }];
+        };
+        this.upOrDown = function (oid,down){
+            var that = this;
+            ///瑕佸垽鏂姸鎬�
+            var lcstatus = $webUtil.getOidFromGrid("table_" + that.id,true,true,'lcStatus');
+            if(!lcstatus){
+                return false;
+            }
+            if (lcstatus !='Editing') {
+                webUtil.showErrorMsg('鍙湁缂栫爜瑙勫垯鐨勭姸鎬佹槸銆愮紪杈戜腑銆戠殑鏃跺�欙紝鎵嶈兘璋冩暣鐮佹鐨勯『搴�');
+                return false;
+            }
+            $webUtil.post(that.url.secController + (down?"downOrderNum":"upOrderNum"),{oid:oid},function (result){
+                if(result.success){
+                    $webUtil.showMsgFromResult(result,down?"涓嬬Щ鎴愬姛":"涓婄Щ鎴愬姛");
+                    that.refreshSEC();
+                }else{
+                    $webUtil.showErrorMsg(result.msg);
+                }
+            },function (error,xhr){
+                $webUtil.showErrorMsg("閾炬帴鏈嶅姟鍑洪敊锛岃绋嶅悗鍐嶈瘯")
+            },that.backPath);
+        };
+        this.getSecItemFormItems = function (codeRuleOid,codeOid,type, onlyShow,ishidden) {
+            var that=this;
+            if (type == 'codefixedsec') {
+                return [
+                    {
+                        field: 'codeSecLengthType',
+                        title: '鐮佹闀垮害绫诲瀷',
+                        required: true,
+                        type: 'combox',
+                        comboxKey: 'codeSecLength',
+                        defaultValue: "",
+                        readOnly: onlyShow
+                    }, {
+                        field: 'codeSecLength',
+                        title: '鐮佹鐨勯暱搴�',
+                        required: true,
+                        verify: 'number',
+                        defaultValue: "",
+                        readOnly: onlyShow
+                    }];
+            } else if (type == 'codevariablesec') {
+                //鍙彉鐮佹
+                return [
+                    {
+                        field: 'codeSecLength',
+                        title: '鐮佹鐨勯暱搴�',
+                        required: true,
+                        verify: 'number',
+                        defaultValue: "",
+                        readOnly: onlyShow
+                    }, {
+                        field: 'codeFillType',
+                        title: '缂栫爜琛ヤ綅鏂瑰紡',
+                        required: true,
+                        type: 'combox',
+                        comboxKey: 'codeFillType',
+                        defaultValue: "",
+                        readOnly: onlyShow
+                    }, {
+                        field: 'codeFillSeparatorSelect',
+                        comboxTextField:'codeFillSeparator',
+                        title: '琛ヤ綅鏃剁殑瀛楃',
+                        type: 'combox',
+                        comboxKey: 'codeFillSeparator',
+                        editable:true,
+                        search:true,
+                        url:"bdSelectInputController/listByFlag",
+                        backPath:that.backPath,
+                        extraParams:{
+                            namespace:'codebasicsec',
+                            flag:'codefileseparator'
+                        },
+                        defaultValue: "",
+                        readOnly: onlyShow
+                    }]
+            } else if (type == 'codedatasec') {
+                //鏃ユ湡鐮佹
+                return [
+                    {
+                        field: 'codeDateFormatStr',
+                        title: '鏃ユ湡鏍煎紡',
+                        required: true,
+                        type: 'text',
+                        defaultValue: "",
+                        readOnly: onlyShow
+                    }];
+            } else if (type == 'codeclassifysec') {
+                //鍒嗙被鐮佹
+                return [
+                    {
+                        field: 'codeSecLengthType',
+                        title: '鐮佹闀垮害绫诲瀷',
+                        required: true,
+                        type: 'combox',
+                        comboxKey: 'codeSecLength',
+                        defaultValue: "",
+                        readOnly: onlyShow
+                    }, {
+                        field: 'codeSecLength',
+                        title: '鐮佹鐨勯暱搴�',
+                        required: true,
+                        verify: 'number',
+                        defaultValue: "",
+                        readOnly: onlyShow
+                    }, {
+                        field: 'matchClassifyValueFlag',
+                        title: '鏄惁鑷姩鍖归厤鍒嗙被鍊�',
+                        type: 'truefalse',
+                        defaultValue: "false",
+                        readOnly: onlyShow
+                    }, {
+                        field: 'parentClassifySecOid',
+                        title: '鐖跺垎绫荤爜娈�',
+                        type: 'refer',
+                        showField: 'parentClassifySecText',
+                        referConfig: {
+                            backPath: that.backPath,
+                            isMuti: false,
+                            type: 'grid',
+                            width:680,
+                            tableConfig:{
+                                page:{
+                                    limit:15,
+                                    page:1
+                                },
+                                cols:[layui.table.getIndexColumn(), layui.table.getCheckColumn(), {
+                                    field: 'id',
+                                    title: '鑻辨枃鍚嶇О',
+                                    sort:true,
+                                    width: 150
+                                }, {
+                                    field: 'name',
+                                    title: '涓枃鍚嶇О',
+                                    sort:true,
+                                    width: 150
+                                },{
+                                    field: 'description',
+                                    title: '鎻忚堪',
+                                    width: 250
+                                }],
+                                queryColumns: [
+                                    {
+                                        field: 'id',
+                                        title: '鑻辨枃鍚嶇О'
+                                    }, {
+                                        field: 'name',
+                                        title: '涓枃鍚嶇О'
+                                    }
+                                ]
+                            },
+                            url: 'codeBasicSecController/refDataGridClassifySec',
+                            where:{
+                                pkCodeRule:codeRuleOid,
+                                oid:'!='+codeOid
+                            }
+                        },
+                        defaultValue: "",
+                        readOnly: onlyShow
+                    }];
+            } else if (type == 'codeattrsec') {
+                //灞炴�х爜娈�
+                return [{
+                        field: 'referAttributeId',
+                        title: '灞炴��',
+                        type: 'refer',
+                        showField: 'referAttributeName',
+                        referConfig: {
+                            type:'mdm/refer/CodeClassifyAttrRefer'
+                        },
+                        defaultValue: "",
+                        required: true,
+                        readOnly: onlyShow
+                    }, {
+                        field: 'referCodeClassifyOidName',
+                        title: '灞炴�ф墍鍦ㄥ垎绫�',
+                        readOnly: true
+                    }, {
+                        field: 'getValueClass',
+                        title: '鍙栧�艰鍒�',
+                        type: 'refer',
+                        defaultValue: "",
+                        showField: 'getValueClass',
+                        referConfig: {
+                            type:'formulaEditor',
+                            useFormKey: 'referAttributeId',
+                            textFormKey:'referAttributeName'
+                        },
+                        readOnly: onlyShow
+                    }];
+            } else if (type == 'codeserialsec') {
+                //娴佹按鐮佹
+                return [
+                    {
+                        field: 'codeSecLength',
+                        title: '鐮佹鐨勯暱搴�',
+                        required: true,
+                        verify: 'number',
+                        defaultValue: "",
+                        readOnly: onlyShow
+                    }, {
+                        field: 'serialStart',
+                        title: '娴佹按鍙疯捣濮嬪��',
+                        type: 'text',
+                        defaultValue: "1",
+                        readOnly: onlyShow
+                    }, {
+                        field: 'serialStep',
+                        title: '娴佹按鐨勬闀�',
+                        verify: 'number',
+                        defaultValue: "1",
+                        readOnly: onlyShow
+                    }, {
+                        field: 'codeFillType',
+                        title: '缂栫爜琛ヤ綅鏂瑰紡',
+                        required: true,
+                        type: 'combox',
+                        comboxKey: 'codeFillType',
+                        defaultValue: "",
+                        readOnly: onlyShow
+                    }, {
+                        field: 'codeFillSeparatorSelect',
+                        comboxTextField:'codeFillSeparator',
+                        title: '琛ヤ綅鏃剁殑瀛楃',
+                        type: 'combox',
+                        comboxKey: 'codeFillSeparator',
+                        editable:true,
+                        search:true,
+                        url:"bdSelectInputController/listByFlag",
+                        backPath:that.backPath,
+                        extraParams:{
+                            namespace:'codebasicsec',
+                            flag:'codefileseparator'
+                        },
+                        defaultValue: "0",
+                        readOnly: onlyShow
+                    }, {
+                        field: 'codeFillLength',
+                        title: '濉厖闀垮害',
+                        type: 'text',
+                        defaultValue: "",
+                        readOnly: onlyShow
+                    }, {
+                        field: 'codeFillLimit',
+                        title: '娴佹按涓婇檺',
+                        required: true,
+                        verify: 'number',
+                        defaultValue: "",
+                        readOnly: onlyShow
+                    }, {
+                        field: 'codeFillFlag',
+                        title: '娴佹按鏄惁琛ョ爜',
+                        required: true,
+                        type: 'truefalse',
+                        defaultValue: "false",
+                        readOnly: onlyShow
+                    }, {
+                        field: 'customCodeSerialClass',
+                        title: '鑷畾涔夌殑娴佹按绠楁硶',
+                        type: 'text',
+                        defaultValue: "",
+                        readOnly: onlyShow
+                    }];
+            } else if (type == 'codelevelsec') {
+                //灞傜骇鐮佹
+                return [
+                    {
+                        field: 'codeLevelType',
+                        title: '灞傜骇绫诲瀷',
+                        required: true,
+                        type: 'combox',
+                        comboxKey: 'codeLevelType',
+                        defaultValue: "",
+                        readOnly: onlyShow
+                    }, {
+                        field: 'codeLevelValue',
+                        title: '灞傜骇鐨勫��',
+                        verify: 'number',
+                        defaultValue: "",
+                        readOnly: onlyShow
+                    }, {
+                        field: 'valueCutType',
+                        title: '瀛楃鎴彇绫诲瀷',
+                        required: true,
+                        type: 'combox',
+                        comboxKey: 'codeCutType',
+                        defaultValue: "",
+                        readOnly: onlyShow
+                    }, {
+                        field: 'valueCutLength',
+                        title: '鍊兼埅鍙栭暱搴�',
+                        verify: ishidden?'':'numbernotzero',
+                        defaultValue: "1",
+                        readOnly: onlyShow,
+                        hidden:ishidden
+                    }, {
+                        field: 'codeGetValueType',
+                        title: '鍙栧�肩被鍨�',
+                        type: 'combox',
+                        comboxKey: 'codeGetValueType',
+                        defaultValue: "",
+                        readOnly: onlyShow
+                    }];
+            } else if (type == 'coderefersec') {
+                //寮曠敤鐮佹
+                return [
+                     {
+                        field: 'referBtmId',
+                        title: '鍙傜収寮曠敤鐨勪笟鍔$被鍨�',
+                        type:'refer',
+                        showField: 'referBtmName',
+                        readOnly: onlyShow,
+                         required: true,
+                        referConfig:{
+                            type:'platform/objectService/OsBtmTypeRefer'
+                        }
+                    },{
+                        field: 'referConfig',
+                        title: '鍙傜収閰嶇疆',
+                        type:'refer',
+                        required: true,
+                        showField: 'referValueInfo',
+                        referConfig: {
+                            type:'referConfig',
+                            useFormKey:'referBtmId',
+                            useFormText:'referBtmName'
+                        }
+                    }];
+            }
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME, cs);
+});
diff --git a/Source/platformProject/platform2022UI/vciweb/mdm/CodeSelectInputChar.js b/Source/platformProject/platform2022UI/vciweb/mdm/CodeSelectInputChar.js
new file mode 100644
index 0000000..e2537d2
--- /dev/null
+++ b/Source/platformProject/platform2022UI/vciweb/mdm/CodeSelectInputChar.js
@@ -0,0 +1,271 @@
+/**
+ * 琛ヤ綅瀛楃/鏃堕棿鏍煎紡绛夊唴瀹归〉闈�
+ * @author weidy
+ * @date 2022-01-24
+ */
+layui.define(['layer','element','form','table','dynamicCondition' ],function(exports){
+        var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "mdm/CodeSelectInputChar";
+        this.moduleKey = "CodeSelectInputChar";
+        this.backPath =  configData.compatibility? path:configData.mdmService;
+        this.url = {
+            controller:'codeSelectInputCharController/',
+            dataGrid:'gridCodeSelectInputChar',
+            addSave:'addSave',
+            editSave:'editSave',
+            deleteUrl:'deleteData',
+            getObjectByOid:'getObjectByOid'
+        };
+        this.getContent=function(){
+            var that = this;
+            var html = "";
+            html = [
+                '<div class="layui-layout" style="display:block;overflow-y: hidden">',
+                    '<div class="layui-layout-border" style="display:block;margin-top:0px; " id="border_',that.id,'">',
+                        '<div class="layui-center" style="overflow-y:auto;">',
+                            that.getToolbarHtml(),
+                            '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                        '</div>',
+                    '</div>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.createSearchHtml({id:"缂栧彿",name:"鍚嶇О"} ,$("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+        };
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            that.initMainTable();
+            that.createSearchHtml();
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var tableWidth = $("#border_" + that.id).width()-225;
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                width:tableWidth,
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                method:'get',
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'EDIT'){
+                                that.addOrEdit(false,data.oid);
+                            }
+                        });
+                    }else{
+                        if(total>0) {
+                            table.selectRecord('table_' + that.id, {index:0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                }
+            };
+            if(parentFieldName){
+                options.treeConfig = {
+                    treepid:parentFieldName,
+                    treeid:'id',
+                    showField:'name'
+                };
+            }
+            table.render(options);
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),
+                    {
+                        title: '涓婚搴撳垎绫讳富閿�',
+                        field: 'codeclassifyoidName',
+                        sort:true,
+                        sortField:'codeclassifyoid',
+                        type:'refer',
+                        referConfig: {
+                            referBo:'codeclassify'
+                        },
+                        width: 150
+                    },
+                    {
+                        title: '杈撳叆鏉ユ簮',
+                        field: 'sourceinputflag',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        field:'options',
+                        title:'鎿嶄綔',
+                        templet:function(d){
+                            return '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>';
+                        }
+                    }];
+            }
+        };
+
+        this.getFormItems = function(onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [
+                {
+                    field: 'codeclassifyoid',
+                    title: '涓婚搴撳垎绫讳富閿�',
+                    required: true,
+                    type: 'refer',
+                    showField: 'codeclassifyoidName',
+                    referConfig: {
+                        referBo:'codeclassify'
+                    },
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'sourceinputflag',
+                    title: '杈撳叆鏉ユ簮',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                }             ];
+        };
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            that.addOrEdit(false,oid);
+        };
+        this.addOrEdit = function(add,oid) {
+            var that = this;
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var addSaveIndex =webUtil.dialog({
+                title:add?'娣诲姞琛ヤ綅瀛楃/鏃堕棿鏍煎紡绛夊唴瀹�':'淇敼琛ヤ綅瀛楃/鏃堕棿鏍煎紡绛夊唴瀹�',
+                btn:['淇濆瓨','鍙栨秷'],
+                skin:'layui-layer-lan',
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getFormItems(false),
+                        function () {
+                            if(!add){
+                                form.load(filter,{
+                                    backPath:that.backPath,
+                                    url:that.url.controller + that.url.getObjectByOid,
+                                    method:'get',
+                                    params:{
+                                        oid:oid
+                                    }
+                                });
+                            }else{
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+                        }, {}, {defaultColumnOneRow: 2});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        var url = that.url.controller + (add?that.url.addSave:that.url.editSave);
+                        webUtil.manualAjax(add?'post':'put',url,JSON.stringify(values),function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts= webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+        this.refresh = function () {
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+        this.ADVQUERY = function () {
+            var that = this;
+            if(!that.serinorQueryInstance) {
+                var dynamicCondition = layui.dynamicCondition;
+                $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar' + that.id + '" class="layui-inline"></div>');
+                that.checkColumns();
+                var dataFields = [];
+                for(var i = 0 ; i < that.columns.length ; i ++){
+                    dataFields[i] = that.columns[i];
+                }
+                that.serinorQueryInstance = dynamicCondition.create({
+                    fields: dataFields//鏌ヨ瀛楁
+                    , tableId: "table_" + that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                    , type: "complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                    , queryCallBack: function (requestData) {//鏌ヨ涔嬪悗鐨刢allback
+
+                    }
+                });
+            }
+            that.serinorQueryInstance.open();
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/vciweb/mdm/CodeSerialAlgorithm.js b/Source/platformProject/platform2022UI/vciweb/mdm/CodeSerialAlgorithm.js
new file mode 100644
index 0000000..0e107f4
--- /dev/null
+++ b/Source/platformProject/platform2022UI/vciweb/mdm/CodeSerialAlgorithm.js
@@ -0,0 +1,86 @@
+/**
+ * 娴佹按绠楁硶椤甸潰
+ * @author weidy
+ * @date 2022-01-24
+ */
+layui.define(['layer','element','form','table','dynamicCondition' ],function(exports){
+        var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "mdm/CodeSerialAlgorithm";
+        this.moduleKey = "CodeSerialAlgorithm";
+        this.backPath =  configData.compatibility? path:configData.mdmService;
+        this.url = {
+            controller:'codeSerialAlgorithmController/',
+            dataGrid:'gridCodeSerialAlgorithm'
+        };
+        this.getContent=function(){
+            var that = this;
+            var html = "";
+            html = [
+                '<div class="layui-layout" style="display:block;overflow-y: hidden">',
+                    '<div class="layui-layout-border" style="display:block;margin-top:0px; " id="border_',that.id,'">',
+                        '<div class="layui-center" style="overflow-y:auto;">',
+                            '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                        '</div>',
+                    '</div>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            that.initMainTable();
+        };
+        this.initMainTable = function () {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var tableWidth = $("#border_" + that.id).width()-225;
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                limit: -1,
+                width:tableWidth,
+                selectMode:table.selectMode.muti,
+                cols: [that.columns]
+            };
+            table.render(options);
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),
+                    {
+                        title: '绠楁硶缂栧彿',
+                        field: 'id',
+                        width: 200
+                    },
+                    {
+                        title: '绠楁硶鍚嶇О',
+                        field: 'name',
+                        width: 150
+                    },
+                    {
+                        title: '绫诲叏璺緞',
+                        field: 'classFullName',
+                        width: 300
+                    },
+                    {
+                        title: '鎻忚堪',
+                        field: 'description',
+                        width: 150
+                    }];
+            }
+        };
+        this.refresh = function () {
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/vciweb/mdm/CodeSynonym.js b/Source/platformProject/platform2022UI/vciweb/mdm/CodeSynonym.js
new file mode 100644
index 0000000..6364531
--- /dev/null
+++ b/Source/platformProject/platform2022UI/vciweb/mdm/CodeSynonym.js
@@ -0,0 +1,371 @@
+/**
+ * 鍚屼箟璇嶉厤缃〉闈�
+ * @author weidy
+ * @date 2022-02-17
+ */
+layui.define(['layer','element','form','table','dynamicCondition' ],function(exports){
+        var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "mdm/CodeSynonym";
+        this.moduleKey = "CodeSynonym";
+        this.backPath =  configData.compatibility? path:configData.mdmService;
+        this.url = {
+            controller:'codeSynonymController/',
+            dataGrid:'gridCodeSynonym',
+            addSave:'addSave',
+            editSave:'editSave',
+            deleteUrl:'deleteData',
+            getObjectByOid:'getObjectByOid'
+        };
+        this.getContent=function(){
+            var that = this;
+            return '<div id="UIContent_' + that.id + '" style="overflow: auto;padding:0 5px"></div>';
+        };
+        this.showContent=function (){
+            var that = this;
+            var html = "";
+            html = [
+                        '<div class="layui-layout easyui-layout UIContentLayout"  id="easyuiLayout_',that.id,'" data-options="fit:true" style="display:block;overflow-y: hidden;margin:0 5px">',
+                            '<div data-options="region:\'center\'" style="padding-left: 10px;padding-right: 10px;" id="border_',that.id,'">',
+                                '<div class="layui-center" style="overflow-y:auto;">',
+                                    that.getToolbarHtml(),
+                                    '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                                '</div>',
+                            '</div>',
+                        '</div>'
+            ].join("");
+            $("#UIContent_"+that.id).html(html);
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.createSearchHtml({id:"缂栧彿",name:"鍚嶇О"} ,$("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+        };
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            //闇�瑕佸姞鍦ㄥ畾鏃朵腑锛屽惁鍒欐牱寮忎笉鑳芥纭睍绀猴紝涓嶇煡閬撳師鍥� wangting
+            setTimeout(function (){
+                that.showContent();
+                var easyuiLayout= $('#easyuiLayout_'+that.id)
+                easyuiLayout.css({height:$('#portal_body').height()-43,width:$('#portal_body').width()-15})
+                easyuiLayout.layout();
+
+                that.initMainTable();
+                that.createSearchHtml();
+
+            },1)
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var tableWidth = $("#border_" + that.id).width();
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                width:tableWidth,
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                method:'get',
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'EDIT'){
+                                that.addOrEdit(false,data.oid);
+                            }
+                        });
+                    }else{
+                        if(total>0) {
+                            table.selectRecord('table_' + that.id, {index:0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                }
+            };
+            if(parentFieldName){
+                options.treeConfig = {
+                    treepid:parentFieldName,
+                    treeid:'id',
+                    showField:'name'
+                };
+            }
+            table.render(options);
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),
+                    {
+                        title: '鎵�灞炴ā鏉�',
+                        field: 'codeclassifytemplateoidName',
+                        sort:true,
+                        sortField:'codeclassifytemplateoid',
+                        type:'refer',
+                        referConfig: {
+                            type:'mdm/refer/CodeClassTemplateRefer'
+                        },
+                        width: 150
+                    },{
+                        field:'id',
+                        title: '鎵�灞炲睘鎬�',
+                        width: 250,
+                        sort: true,
+                        sortField: 'id',
+                        type:'refer',
+                        referConfig: {
+                            type:'grid',
+                            referBo:'codeclstemplate',
+                            useFormKey:'codeclassifytemplateoid',
+                            url:"codeClassifyTempAttrController/gridCodeClassifyTemplateAttr",
+                            paramForFormKey:'classifyTemplateOid',
+                            backPath:that.backPath ,
+                            tableConfig:{
+                                method:'get',
+                                cols:[table.getIndexColumn(),table.getCheckColumn(),{
+                                    field:'id',
+                                    title:'灞炴�ц嫳鏂囧悕绉�',
+                                    width:150
+                                },{
+                                    field: 'name',
+                                    title: '灞炴�т腑鏂囧悕绉�',
+                                    width: 150
+                                }],
+                                queryColumns:[{
+                                    field:'id',
+                                    title:'灞炴�ц嫳鏂囧悕绉�'
+                                },{
+                                    field: 'name',
+                                    title: '灞炴�т腑鏂囧悕绉�'
+                                }]
+                            }
+                        },
+                        templet:function (d){
+                            return d.id + " " + d.name;
+                        }
+                    },
+                    {
+                        title: '婧愬��',
+                        field: 'sourcevalue',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '鍚屼箟璇�',
+                        field: 'synonymvalue',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        field:'options',
+                        title:'鎿嶄綔',
+                        width:150,
+                        templet:function(d){
+                            return '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>';
+                        }
+                    }];
+            }
+        };
+
+        this.getFormItems = function(onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [
+                {
+                    field: 'codeclassifytemplateoid',
+                    title: '鎵�灞炴ā鏉�',
+                    required: true,
+                    type: 'refer',
+                    showField: 'codeclassifytemplateoidName',
+                    referConfig: {
+                        type:'mdm/refer/CodeClassTemplateRefer'
+                    },
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,              {
+                    field: 'id',
+                    title: '鎵�灞炲睘鎬�',
+                    required: true,
+                    showField: 'name',
+                    type:'refer',
+                    referConfig: {
+                        type:'grid',
+                        valueField:'id',
+                        referBo:'codeclstemplate',
+                        useFormKey:'codeclassifytemplateoid',
+                        url:"codeClassifyTempAttrController/gridCodeClassifyTemplateAttr",
+                        paramForFormKey:'classifyTemplateOid',
+                        backPath:that.backPath,
+                        tableConfig:{
+                            method:'get',
+                            cols:[table.getIndexColumn(),table.getCheckColumn(),{
+                                field:'id',
+                                title:'灞炴�ц嫳鏂囧悕绉�',
+                                width:150
+                            },{
+                                field: 'name',
+                                title: '灞炴�т腑鏂囧悕绉�',
+                                width: 150
+                            }],
+                            queryColumns:[{
+                                field:'id',
+                                title:'灞炴�ц嫳鏂囧悕绉�'
+                            },{
+                                field: 'name',
+                                title: '灞炴�т腑鏂囧悕绉�'
+                            }]
+                        }
+                    },
+                    readOnly:onlyShow
+                },  {
+                    field: 'sourcevalue',
+                    title: '婧愬��',
+                    required: true,
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'synonymvalue',
+                    title: '鍚屼箟璇�',
+                    required: true,
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                }             ];
+        };
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            that.addOrEdit(false,oid);
+        };
+        this.addOrEdit = function(add,oid) {
+            var that = this;
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var addSaveIndex =webUtil.dialog({
+                title:add?'娣诲姞鍚屼箟璇嶉厤缃�':'淇敼鍚屼箟璇嶉厤缃�',
+                btn:['淇濆瓨','鍙栨秷'],
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin:5px 20px 0 0" ></form>',
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero, layerIndex, classP) {
+                    form.addItems(filter,that.getFormItems(false),
+                        function () {
+                            if(!add){
+                                form.load(filter,{
+                                    backPath:that.backPath,
+                                    url:that.url.controller + that.url.getObjectByOid,
+                                    method:'get',
+                                    params:{
+                                        oid:oid
+                                    }
+                                });
+                            }else{
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+                            webUtil.relocationOpen(classP)
+                        }, {}, {defaultColumnOneRow: 2,labelWidth:120});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        var url = that.url.controller + (add?that.url.addSave:that.url.editSave);
+                        webUtil.manualAjax(add?'post':'put',url,JSON.stringify(values),function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts= webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+        this.refresh = function () {
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+        this.ADVQUERY = function () {
+            var that = this;
+            if(!that.serinorQueryInstance) {
+                var dynamicCondition = layui.dynamicCondition;
+                $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar' + that.id + '" class="layui-inline"></div>');
+                that.checkColumns();
+                var dataFields = [];
+                for(var i = 0 ; i < that.columns.length ; i ++){
+                    dataFields[i] = that.columns[i];
+                }
+                that.serinorQueryInstance = dynamicCondition.create({
+                    fields: dataFields//鏌ヨ瀛楁
+                    , tableId: "table_" + that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                    , type: "complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                    , queryCallBack: function (requestData) {//鏌ヨ涔嬪悗鐨刢allback
+
+                    }
+                });
+            }
+            that.serinorQueryInstance.open();
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/vciweb/mdm/MdmApply.js b/Source/platformProject/platform2022UI/vciweb/mdm/MdmApply.js
new file mode 100644
index 0000000..2084e13
--- /dev/null
+++ b/Source/platformProject/platform2022UI/vciweb/mdm/MdmApply.js
@@ -0,0 +1,218 @@
+/**
+ * 涓绘暟鎹敵璇峰鐞�
+ * @author wangting
+ * @date 2022-4-15
+ */
+layui.define(['layer','element','form','table','dynamicCondition' ,'tree','transfer','mdm/MdmEngineForm'],function(exports){
+    var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "mdm/MdmApply";
+        this.moduleKey = "MdmApply";
+        this.backPath =  configData.compatibility? path:configData.mdmService;
+        this.url = {
+            controller:'ducking/',
+            gridPreDataFinish:'gridPreDataFinish',
+            gridPreDataUnFinish:'gridPreDataUnFinish',
+            editSave:'editSave'
+        };
+        this.getContent = function (){
+            var that = this;
+            if(that.sourceData && "page" in that.sourceData){
+                that.id = that.id + "_" + that.sourceData.page;
+            }
+            return '<div id="UIContent_' + that.id + '" style="overflow: auto;padding:0 5px"></div>';
+        };
+        this.showContent=function(){
+            var html = "";
+            var that = this;
+            html = [
+                '<div class="layui-center">',
+                that.getToolbarHtml(),
+                '<table id="table_', that.id , '" lay-filter="table_',that.id , '" style="overflow-x:auto;"></table>',
+                '</div>',
+            ].join("");
+            $("#UIContent_" + that.id).html(html);
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+                    (that.sourceData.page=='executing'?'<button class="layui-btn layui-btn-sm" layui-filter="toolbar_'+ that.id+ '_SETCLASS"><i class="layui-icon layui-icon-delete"></i>缁存姢鍒嗙被</button>':''),
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_', that.id, '_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_', that.id, '_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'];
+            return html.join('');
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.createSearchHtml({id:"妯℃澘缂栧彿",name:"妯℃澘鍚嶇О"},$("[layui-filter='toolbar_" + that.id + "']"),'table_'+that.id);
+            webUtil.bindDefultButtonLisenter(that, that.id);
+
+        };
+        this.config={}
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            this.config[that.id] = {
+                sourceData:that.sourceData
+            };
+            that.showContent();
+            that.initTable(that.id)
+            this.createSearchHtml()
+        };
+        this.initTable=function (configId){
+            var that = this;
+            var table=layui.table;
+            that.checkColumns(configId);
+            table.render({
+                elem: '#table_' + configId,
+                id: 'table_'+configId,
+                url:that.url.controller+(that.config[configId].sourceData.page=='executing'?that.url.gridPreDataUnFinish:that.url.gridPreDataFinish),
+                backPath: that.backPath,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                selectMode: table.selectMode.single,
+                cols: [that.columns],
+                done: function (res, cur, total) {
+                }
+            });
+        }
+        this.checkColumns=function (configId) {
+            var that = this;
+            var table = layui.table;
+            if (that.columns == null || that.columns.length == 0) {
+                that.columns = [table.getIndexColumn(), table.getCheckColumn(),
+                    {
+                        field: 'unique',
+                        title: '鍥惧彿',
+                        sort: true,
+                        width: 120
+                    }, {
+                        field: 'num',
+                        title: '缂栫爜',
+                        sort: true,
+                        width: 120
+                    }, {
+                        field: 'model',
+                        title: '瑙勬牸鍨嬪彿',
+                        width: 120
+                    }, {
+                        field: 'parttype',
+                        title: '闆朵欢绫诲瀷',
+                        width: 100
+                    }, {
+                        field: 'unit',
+                        title: '璁¢噺鍗曚綅',
+                        width: 60
+                    }, {
+                        field: 'type',
+                        title: '涓婚搴撶紪鍙�',
+                        width: 100
+                    }, {
+                        field: 'classifyname',
+                        title: '鍒嗙被鍚嶇О',
+                        width: 100
+                    }, {
+                        field: 'datacode',
+                        title: '鏁版嵁杩斿洖鐘舵��',
+                        width: 90
+                    }, {
+                        field: 'datamsg',
+                        title: '鏁版嵁杩斿洖鎻愮ず',
+                        width: 150
+                    }];
+                that.dataFields = [{
+                    field: 'unique',
+                    title: '鍥惧彿'
+                }, {
+                    field: 'num',
+                    title: '缂栫爜'
+                }, {
+                    field: 'model',
+                    title: '瑙勬牸鍨嬪彿'
+                }, {
+                    field: 'parttype',
+                    title: '闆朵欢绫诲瀷'
+                }, {
+                    field: 'type',
+                    title: '涓婚搴撶紪鍙�'
+                }, {
+                    field: 'classifyname',
+                    title: '鍒嗙被鍚嶇О'
+                }, {
+                    field: 'datacode',
+                    title: '鏁版嵁杩斿洖鐘舵��',
+                    type: 'combox',
+                    comboxKey: [{key: "200", value: "200"}, {key: "400", value: "400"}, {key: "500", value: "500"}]
+                }]
+            }
+        }
+        this.refresh = function (type,button){
+            var that = this;
+            var configId=$(button).attr('layui-filter').split('_')[1]
+            layui.table.reload('table_' + configId);
+        };
+        this.ADVQUERY = function (type,button) {
+            var that = this;
+            var configId=$(button).attr('layui-filter').split('_')[1]
+            if (!that.config[configId].serinorQueryInstance) {
+                var dynamicCondition = layui.dynamicCondition;
+                $('[layui-filter="toolbar_' + configId + '"]').append('<div  id="toolbar' + configId + '" class="layui-inline"></div>');
+                that.checkColumns(configId);
+                that.config[configId].serinorQueryInstance = dynamicCondition.create({
+                    fields: that.dataFields//鏌ヨ瀛楁
+                    , tableId: "table_" + configId//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                    , type: "complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                    , queryCallBack: function (requestData) {//鏌ヨ涔嬪悗鐨刢allback
+
+                    }
+                });
+            }
+            that.config[configId].serinorQueryInstance.open();
+        };
+        this.SETCLASS=function (type,button) {
+            var that = this;
+            var configId = $(button).attr('layui-filter').split('_')[1];
+            var oid = webUtil.getOidFromGrid('table_' + configId,true,true);
+            if(!oid){
+                return;
+            }
+            layui.use('vciWebReferTree',function (){
+                var treeRefer = layui['vciWebReferTree'];
+                treeRefer.showReferDialog({
+                    filter:configId+"_classify",
+                    name:"wupin",
+                    title:'閫夋嫨鍒嗙被',
+                    target: {
+                        setValue: function (filter,name,value,rawValue,closeDialog,allValues){
+                            webUtil.manualAjax('put', that.url.controller+that.url.editSave, JSON.stringify({oid:oid,classifyoid:value}), function (result) {
+                                if (result.success) {
+                                    webUtil.showMsgFromResult(result, "鍒嗙被璁剧疆鎴愬姛");
+                                    that.refresh(null,button);
+                                } else {
+                                    webUtil.showErrorMsg(result.msg);
+                                }
+                            }, function (xhr, err) {
+                                webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                            }, that.backPath);
+                        }
+                    },
+                    options: {
+                        backPath:that.backPath,
+                        url:'codeClassifyController/referTree',
+                        isMuti:false,
+                        isQueryAllColumn: true,
+                        onlyLeaf:true,
+                        rootParams:{
+                            "conditionMap['id']":'wupin'
+                        },
+                    }
+                });
+            });
+        }
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/vciweb/mdm/MdmEngine.js b/Source/platformProject/platform2022UI/vciweb/mdm/MdmEngine.js
new file mode 100644
index 0000000..fd001a6
--- /dev/null
+++ b/Source/platformProject/platform2022UI/vciweb/mdm/MdmEngine.js
@@ -0,0 +1,1387 @@
+/**
+ * 涓绘暟鎹紩鎿�
+ * @author weidy
+ * @date 2022-2-23
+ */
+layui.define(['layer','element','form','table','dynamicCondition' ,'tree','transfer','mdm/MdmEngineForm'],function(exports){
+        var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "mdm/MdmEngine";
+        this.moduleKey = "MdmEngine";
+        this.backPath =  configData.compatibility? path:configData.mdmService;
+        this.url = {
+            classifyController: 'codeClassifyController/',
+            classifyTree:'referTree',
+            controller:'mdmEngineController/',
+            tableUI:'getUIInfoByClassifyOid',
+            formUI:'getFormDefineByTemplateOid',
+            tableData:'gridTableDataByClassifyOid',
+            getDataByOid:'getDataByOid',
+            export:'exportCode',
+            downloadImportExcel:'downloadImportExcel',
+            downloadImportExcelHistory:'downloadImportExcelHistory',
+            batchImportCode:'batchImportCode',
+            importHistoryData:'batchImportHistoryData',
+            processTemplateController:'codeClsProcessTempController/',
+            listProcessTemplate:'listProcessTemplate'
+        };
+        this.getContent = function (){
+            var that = this;
+            return '<div id="UIContent_' + that.id + '" style="overflow: auto;padding:0 5px"></div>';
+        };
+        this.showContent=function(){
+            var html = "";
+            var that = this;
+            html = [
+                '<div class="layui-layout easyui-layout UIContentLayout" id="easyuiLayout_',that.id,'" data-options="fit:true" style="display:block;overflow-y: hidden">',
+                    '<div data-options="region:\'west\',split:true,tools:\'#refresh_',that.id,'\'" title="涓婚搴撳垎绫�" style="width:270px;padding: 5px;">',
+                        '<div class="layui-vci-tree" style="overflow: auto">',
+                            '<ul layui-filter="tree_',that.id,'"><ul>',
+                        '</div>',
+                        '</div>',
+                            '<div data-options="region:\'center\',split:true" style="border:0;" id="border_',that.id,'">',
+                                '<div id="easyuiLayoutCenter_',that.id,'" class="easyui-layout" data-options="fit:true">',
+                                    '<div class="layui-layout" data-options="region:\'center\',minHeight:50" title="鍒嗙被鏁版嵁" style="padding-left:5px;padding-right:5px;">',
+                                        '<div class="layui-center">',
+                                            that.getToolbarHtml(),
+                                            '<table id="table_', that.id , '" lay-filter="table_',that.id , '" style="overflow-x:auto;"></table>',
+                                        '</div>',
+                                    '</div>',
+                                    '<div class="layui-south" data-options="region:\'south\',split:true,collapsed:true" title="闄勪欢鍒楄〃" style="padding:5px;height: 260px;">',
+                                        '<div layui-filter="toolbar_south_',that.id,'" class="layui-btn-container layui-buttons">',
+                                         '</div>',
+                                        '<table id="table_attach_', that.id , '" lay-filter="table_attach_',that.id , '" style="overflow-x:auto;"></table>',
+                                    '</div>',
+                                '</div>',
+                            '</div>',
+                        '</div>',
+                    '</div>',
+                '</div>',
+                '<div id="refresh_',that.id,'" style="position: absolute;top:0"><a href="javascript:void(0);" id="refresh_tree_',that.id,'"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</a></div>'
+            ].join("");
+            $("#UIContent_" + that.id).html(html);
+        };
+        this.getWestToolbarHtml = function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_west_',that.id,'" class="layui-btn-container layui-buttons">',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_west_',that.id,'_refreshTree"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>'
+            ];
+            html.push('</div>');
+            return html.join("");
+        };
+        this.createWestSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that,"west_" + that.id);
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+                '</div>'];
+            return html.join('');
+        };
+        this.createSearchHtml = function (queryColumns) {
+            var that = this;
+            var queryD = {};
+            layui.each(queryColumns,function (i,item){
+                var type =  item.fieldType || item.type || "text";
+                if(type == 'text'){
+                    queryD[(item.queryField||item.field)]=item.title
+                }
+            })
+            //瑕佺Щ闄や互鍓嶇殑
+            var toolbarDiv =$("[layui-filter='toolbar_" + that.id + "']");
+            var search =  toolbarDiv.find("select[name='fast_search_select']");
+            if(search && search.length>0){
+                var div = $(search[0]).parent();
+                div.next().remove();
+                div.remove();
+            }
+            webUtil.createSearchHtml(queryD ,toolbarDiv, "table_" + that.id);
+
+        };
+        this.buttonIconMap = {
+            CODEADD:'layui-icon-add-1',
+            CODEBATCHADD:'layui-icon-list',
+            CODEEDIT:'layui-icon-edit',
+            CODEDELETE:'layui-icon-delete',
+            CODEIMPORTHISTORY:'layui-icon-up',
+            CODEEXPORT:'layui-icon-export',
+            CODESTARTPROCESS:'layui-icon-read',
+            CODEQUERY:'layui-icon-search',
+            UPLOADFILE:'layui-icon-upload-circle',
+            DOWNLOADFILE:'layui-icon-download-circle',
+            revisefile:'layui-icon-edit',
+            DELETEFILE:'layui-icon-delete',
+            refreshTable:'layui-icon-refresh',
+            refreshAttachTable:'layui-icon-refresh'
+        };
+        this.config={}
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            this.config[that.id] = {
+                executeJsMap:{},
+                sourceData:that.sourceData
+            };
+            that.MdmEngineForm = layui['mdm/MdmEngineForm'];
+            setTimeout(function () {
+                that.showContent();
+                var easyuiLayout = $('#easyuiLayout_' + that.id)
+                easyuiLayout.css({height: $('#portal_body').height() - 43, width: $('#portal_body').width() - 15})
+                $('#easyuiLayoutCenter_'+that.id).layout();
+                easyuiLayout.layout();
+
+                that.initTree();
+                that.createWestSearchHtml();
+                $('#refresh_tree_' + that.id).click(function (){
+                    var id=$(this).attr('id').replace('refresh_tree_','')
+                    that.refresh(id);
+                });
+                that.initAttachTable(that.id)
+
+            },1);
+        };
+        this.initTree = function () {
+            var that = this;
+            var tree = layui.tree;
+            var scrollHeight =  window.innerHeight;
+            var treeUL = $('[layui-filter="tree_' + that.id + '"]');
+            var treeHeight = scrollHeight - 160;
+            treeUL.parent().height(treeHeight);
+            var rootParams = {};
+            if(that.config[that.id].sourceData){
+                for(var key in that.config[that.id].sourceData){
+                    rootParams["conditionMap['" + key + "']"] = that.config[that.id].sourceData[key];
+                }
+            }
+            tree.init("tree_" + that.id, treeUL, {
+                url: that.url.classifyController + that.url.classifyTree,
+                backPath: that.backPath,
+                extraParams: {
+                    isMuti: false,
+                    isQueryAllColumn: true
+                },
+                rootParams:rootParams,
+                showSearch:true,
+                click: function (item, elem, options) {
+                    that.config[options.rootParams["conditionMap['functionId']"]].currentItemOid = item.oid;
+                    that.config[options.rootParams["conditionMap['functionId']"]].currentItemAttributes = item.attributes;
+                    that.showTableByClassifyOid(item.oid,options.rootParams["conditionMap['functionId']"]);
+                },
+                done:function (filter,children,elem) {
+                    var options=tree.getConfig(filter).options
+                    that.config[options.rootParams["conditionMap['functionId']"]].rootItemName= children[0].attributes.name;
+                    that.config[options.rootParams["conditionMap['functionId']"]].rootItemAttributes= children[0].attributes;
+                }
+            });
+        };
+        this.showTableByClassifyOid = function (codeClassifyOid,functionId){
+            var that = this;
+            that.config[functionId].componentVO = null;
+            webUtil.get(that.url.controller + that.url.tableUI,{codeClassifyOid:codeClassifyOid,functionId:functionId},function (result){
+                if(!result.success){
+                    $webUtil.showAutoMsg(result.msg);
+                    that.config[functionId].componentVO = null;
+                    var  table = layui.table;
+                    if(that.config[functionId].currentTableId){
+                        table.destory(that.config[functionId].currentTableId);
+                    }
+                    $("[layui-filter='toolbar_" + functionId + "']").html('');
+                }else{
+                    //鏄剧ず琛ㄦ牸鍜屽揩閫熸煡璇�
+                    that.showTableByDefine(result.obj,functionId);
+                    that.config[functionId].componentVO = result.obj;
+                }
+            });
+        };
+
+        this.showTableByDefine = function (componentVO,configId){
+            var that = this;
+            var  table = layui.table;
+            if(that.config[configId].currentTableId){
+                table.destory(that.config[configId].currentTableId);
+            }
+            that.initButtonByComponent(componentVO,configId);
+
+            //澶勭悊鍒楄〃
+            var cols = [];
+            var filter = 'table_' + configId;
+            var eventMap = {};
+            for (var i = 0; i < componentVO.tableDefineVO.cols.length; i++) {
+                if (i == 0) {
+                    componentVO.tableDefineVO.cols[i].unshift({
+                        field: table.config.indexName,
+                        type: 'numbers',
+                        title: '搴忓彿',
+                        rowspan: componentVO.tableDefineVO.cols.length,
+                        width: 40
+                    }, {
+                        field: table.config.checkName,
+                        type: 'checkbox',
+                        rowspan: componentVO.tableDefineVO.cols.length,
+                        width: 30
+                    })
+                }
+                //姣忎釜瀛楁閮介渶瑕佹壂鎻忎竴涓嬫槸鍚︽湁浜嬩欢
+                for (var j = 0; j < componentVO.tableDefineVO.cols[i].length; j++) {
+                    var record =  componentVO.tableDefineVO.cols[i][j];
+                    if(record.optionJsMap){
+                        for(var key in record.optionJsMap){
+                            eventMap[key] =  record.optionJsMap[key];
+                        }
+                    }
+                    if(record.field == 'id' && $webUtil.isNull(record.templet)){
+                        //浼佷笟缂栫爜鐨勯粯璁ゆ坊鍔犺秴閾炬帴
+                        record.templet = '<div><a name="code" href="javascript:;" dataIndex="{{d.LAY_INDEX}}" lay-event="VIEWDETAIL" data-oid="{{d.oid}}" data-template="{{d.codetemplateoid}}" style="text-decoration:underline;color:blue;" >{{d.id}}</a></div>';
+                    }else {
+                        if (record.templet && typeof (record.templet) == 'string' && $webUtil.isNotNull(record.templet) && record.templet.indexOf("function(d)")>-1) {
+                            record.templet = eval("(" + record.templet + ")");
+                        }
+                    }
+                }
+
+                cols.push(componentVO.tableDefineVO.cols[i]);
+            }
+
+            //鎵惧垎椤电殑鏁伴噺
+            var centerHeight = $("#border_" + configId).height()-100;
+            var limit = (centerHeight-centerHeight%28)/28;
+
+            var tableParams={
+                templateOid:componentVO.templateVO.oid,
+                codeClassifyOid: that.config[configId].currentItemOid,
+                queryTemplate:that.config[configId].sourceData['queryTemplate']
+            }
+            that.config[configId].currentTableLoad = false;
+            that.config[configId].componentVO = componentVO;
+            table.render({
+                elem: '#' + filter,
+                id: filter,
+                url:that.url.controller + that.url.tableData,
+                backPath: that.backPath,
+                page: {
+                    limit: limit,
+                    page: 1
+                },
+                limits: limit,
+                where: tableParams,
+                selectMode: table.selectMode.muti,
+                cols: cols,
+                done: function (res, cur, total) {
+                    table.on('tool(' + filter + ')', function (obj) {
+                        var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                        var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+
+                        if (layEvent == 'VIEWDETAIL') {
+                            that.MdmEngineForm.VIEWDETAIL(data.oid,data.codetemplateoid,that.config[configId].currentItemOid);
+                        } else {
+                            if (layEvent in eventMap) {
+                                that.callEvent(eventMap[layEvent], data);
+                            }
+                        }
+                    });
+                    that.config[configId].currentTableId = filter;
+                },
+                rowClick: function (tablefifter, record, options) {
+                    table.reload("table_attach_" + configId, {
+                        extraParams: {
+                            ownbizOid: record.oid,
+                            ownbizBtm: record.btmname
+                        }
+                    })
+                }
+            });
+            if (componentVO.tableDefineVO.queryColumns && componentVO.tableDefineVO.queryColumns.length > 0) {
+                that.createSearchHtml(componentVO.tableDefineVO.queryColumns)
+            }
+        };
+        this.initButtonByComponent = function (componentVO,configId){
+            var that = this;
+            var toolbar = $("[layui-filter='toolbar_" + configId + "']");
+            var toolbarSouth=$("[layui-filter='toolbar_south_" + configId + "']");
+            toolbarSouth.empty();
+            var buttons= toolbar.find('button');
+            if(buttons){
+                layui.each(buttons,function (_index,_item){
+                    _item.remove();
+                });
+            }
+            var buttonInfos = componentVO.buttons;
+            if(!buttonInfos){
+                buttonInfos = [];
+            }
+            buttonInfos.push({
+                uniqueFlag: 'refreshTable',
+                alias: '鍒锋柊'
+            });
+            var buttonHtml = [];
+            that.config[configId].executeJsMap = {};
+            layui.each(buttonInfos,function (_index,_item) {
+                var filter = _item.uniqueFlag;
+                if ($webUtil.endWith(filter, "VIEW")){
+                    return;
+                }
+                if ($webUtil.endWith(filter, "CODEQUERY")
+                    || $webUtil.endWith(filter, "refreshTable") || $webUtil.endWith(filter, "CODEIMPORTHISTORY")
+                    || $webUtil.endWith(filter, "CODEEXPORT") || componentVO.leaf) {
+                    if($webUtil.isNotNull(_item.iconCls)){
+                        that.buttonIconMap[_item.uniqueFlag] = _item.iconCls;
+                    }
+                    if($webUtil.endWith(filter, "FILE") || $webUtil.endWith(filter, "file")){
+                        toolbarSouth.append($webUtil.getButtonHtmlFromBtnObject(_item, configId, that.buttonIconMap));
+                    }else {
+                        buttonHtml.push($webUtil.getButtonHtmlFromBtnObject(_item, configId, that.buttonIconMap));
+                    }
+
+                }
+            });
+            $(buttonHtml.join('')).prependTo(toolbar)
+            toolbarSouth.append($webUtil.getButtonHtmlFromBtnObject({
+                uniqueFlag: 'refreshAttachTable',
+                alias: '鍒锋柊'
+            }, configId, that.buttonIconMap));
+            webUtil.bindDefultButtonLisenter(that, configId);
+            webUtil.bindDefultButtonLisenter(that, 'south_'+configId);
+        };
+        this.initAttachTable=function (configId){
+            var that = this;
+            var table=layui.table;
+            var cols=[table.getIndexColumn(), table.getCheckColumn(),{
+                field: 'name',
+                title: '鍚嶇О',
+                width: 260,
+                templet: function (d) {
+                    return '<a class="layui-btn layui-btn-intable"  lay-event="VIEWFILE">'+d.name+'</a>';
+                }
+            },{
+                field: 'fileSize',
+                title: '鏂囦欢澶у皬',
+                width: 100
+            },{
+                field: 'creator',
+                title: '鍒涘缓鑰�',
+                width: 100
+            },{
+                field: 'createTime',
+                title: '鍒涘缓鏃堕棿',
+                width: 200
+            }]
+            table.render({
+                elem: '#table_attach_' + configId,
+                id: 'table_attach_'+configId,
+                url:'vciFileQueryController/gridFiles',
+                backPath: that.backPath,
+                page: {
+                    limit: 10,
+                    page: 1
+                },
+                extraParams: {
+                    ownbizOid:'1',
+                    ownbizBtm: '1',
+                    fileDocClassify:'!=processAuditSuggest'
+                },
+                selectMode: table.selectMode.muti,
+                cols: [cols],
+                done: function (res, cur, total) {
+                    table.on('tool(table_attach_' + configId + ')', function (obj) {
+                        var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                        var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+
+                        if (layEvent == 'VIEWFILE') {
+                            that.VIEWFILE(data,configId);
+                        }
+                    });
+                }
+            });
+        }
+        this.refresh = function (configId) {
+            var that=this;
+            var tree = layui.tree;
+            tree.reload("tree_" + configId,{rootNodeLoaded:false});
+        };
+        this.refreshTable = function (type,button){
+            var that = this;
+            var configId=$(button).attr('layui-filter').split('_')[1]
+            layui.table.reload('table_' + configId);
+        };
+        this.refreshAttachTable = function (type,button){
+            var that = this;
+            var configId=$(button).attr('layui-filter').split('_')[1]
+            layui.table.reload('table_attach_' + configId);
+        };
+        this.checkComponentVO = function (configId){
+            var that = this;
+            if(!that.config[configId].componentVO || that.config[configId].componentVO == null){
+                $webUtil.showErrorMsg("璇峰厛閫夋嫨涓婚搴撳垎绫伙紝骞朵笖淇濊瘉鍒嗙被鏈夊叧鑱旂殑妯℃澘");
+                return false;
+            }
+            return true;
+        };
+        this.CODEQUERY = function (type,button) {
+            var that = this;
+            var configId=$(button).attr('layui-filter').split('_')[1]
+            if(!that.checkComponentVO(configId)){
+                return false;
+            }
+            if(!that.config[configId].serinorQueryInstance && that.config[configId].componentVO.tableDefineVO.seniorQueryColumns) {
+                var dynamicCondition = layui.dynamicCondition;
+                $('[layui-filter="toolbar_' + configId + '"]').append('<div  id="toolbar' + configId + '" class="layui-inline"></div>');
+                that.config[configId].serinorQueryInstance = dynamicCondition.create({
+                    fields: that.config[configId].componentVO.tableDefineVO.seniorQueryColumns//鏌ヨ瀛楁
+                    , tableId: "table_" + configId//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                    , type: "complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                    , queryCallBack: function (requestData) {//鏌ヨ涔嬪悗鐨刢allback
+
+                    }
+                });
+            }
+            that.config[configId].serinorQueryInstance.open();
+        };
+        this.callEvent = function (jsPath,data){
+            var that = this;
+            if(jsPath && data){
+                if($webUtil.startWith(jsPath.toLowerCase(),"usejs:")||$webUtil.startWith(jsPath.toLowerCase(),"js:")){
+                    //鏄墽琛宩s
+                    if($webUtil.startWith(jsPath.toLowerCase(),"usejs:")){
+                        jsPath = jsPath.substr(6);
+                    }else {
+                        jsPath = jsPath.substr(3);
+                    }
+                    layui.use(jsPath,function (){
+                        layui[jsPath].doEvent(data,that);
+                    });
+                }else if($webUtil.startWith(jsPath.toLowerCase(),"https://") || $webUtil.startWith(jsPath.toLowerCase(),"http://")){
+                    var tabId = (data.oid || jsPath) + "_link";
+                    portal.showTabByMenu(data.oid || jsPath,{
+                        id:data.oid || jsPath,
+                        text:'鏌ョ湅閾炬帴',
+                        url:jsPath
+                    });
+                }else if(that[jsPath]){
+                    that[jsPath](data);
+                }else{
+                    //鐩存帴鏄痡s鐨勬殏鏃惰繕涓嶆敮鎸�
+                }
+            }
+        };
+        this.CODEADD = function (type,button){
+            var that = this;
+            var configId=$(button).attr('layui-filter').split('_')[1]
+            that.codeAddOrEdit(button,configId,true);
+        };
+        this.codeAddOrEdit = function (button,configId,add,oid,up){
+            var that = this;
+            if(!that.checkComponentVO(configId)){
+                return false;
+            }
+            that.MdmEngineForm.getFormDefine(that.config[configId].componentVO.templateVO.oid,that.config[configId].currentItemOid,function (componentVO){
+                var formDefineVO= componentVO.formDefineVO;
+                if(formDefineVO) {
+                    var filter = (oid||configId) + "_add_form";
+                    var form = layui.form;
+                    var colCount = that.MdmEngineForm.getFormCol(formDefineVO);
+                    var items = that.MdmEngineForm.getFormItemsByVO(formDefineVO, false,colCount,add);
+                    var html = [
+                        '<div class="easyui-layout UIContentLayout"  id="easyuiLayout_', filter, '" data-options="fit:true" style="display:block;overflow-y: hidden;">',
+                            '<div data-options="region:\'center\'" style="padding: 5px;">',
+                                '<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form " style="margin-top:5px" ></form>',
+                            '</div>',
+                            '<div data-options="region:\'south\',split:true" style="height:270px;padding-left: 5px;padding-right: 5px;" id="border_', filter, '">',
+                                '<div class="layui-layout-border layui-tab" lay-filter="tab_',filter ,'" style="display:block;margin:5px;">',
+                                        '<ul class="layui-tab-title tabTitle tab_center_', filter, '" lay-allowClose="false">',
+                                            '<li lay-id="codeorder" class="',(add?'layui-this':''),'" style="',(add?'':'display:none;'),'">鐮佸�肩敵璇�</li>',
+                                            '<li lay-id="resemble">鐩镐技椤规煡璇�</li>',
+                                        '</ul>',
+                                        '<ul class="layui-tab-content tabContent">',
+                                            '<li lay-id="codeorder" class="layui-tab-item ',(add?'layui-show':''),'" style="',(add?'':'display:none;'),'">',
+                                                '<form class="layui-form" lay-filter="form_codevlaue_', filter, '" style="height:100%;"></form>',
+                                            '</li>',
+                                            '<li class="layui-tab-item"  lay-id="resemble">',
+                                                '<table id="resemble_', filter , '" lay-filter="resemble_',filter , '" style="overflow-x:auto;"></table>',
+                                            '</li>',
+                                        '</ul>',
+                                '</div>',
+                            '</div>',
+                        '</div>'
+                    ]
+                    var hasResemble =  (componentVO.resembleTableVO && componentVO.resembleTableVO.cols && componentVO.resembleTableVO.cols.length > 0);
+                    var dialogIndex = webUtil.dialog({
+                        title: (add ? "缂栫爜鐢宠" : (up?"鏁版嵁鏇存敼":'淇敼缂栫爜淇℃伅')),
+                        btn: !hasResemble?['淇濆瓨', '鍙栨秷']:['淇濆瓨', '鍙栨秷', '鐩镐技椤规煡璇�'],
+                        fullScreen: true,
+                        content: html.join(''),
+                        resizing: function (layero) {
+                            form.doResize(filter);
+                        },
+                        success: function (layero) {
+                            var easyuiLayout = $('#easyuiLayout_' + filter)
+                            easyuiLayout.css({height: easyuiLayout.parents('.layui-layer-content').height()-10, width: easyuiLayout.parents('.layui-layer-content').width()-10})
+                            easyuiLayout.parent().parent().css({padding: '5px'})
+                            easyuiLayout.layout();
+                            that.MdmEngineForm.initResembleTable(componentVO,filter);
+                            form.addItems(filter, items,
+                                function () {
+                                    //鍙紶閫掍簡鏁版嵁鐨勪富閿紝鎵�浠ユ垜浠渶瑕佷粠鍚庡彴鑾峰彇涓�涓�
+                                    if (!add) {
+                                        form.load(filter, {
+                                            backPath: that.backPath,
+                                            url: that.url.controller + that.url.getDataByOid,
+                                            method: 'get',
+                                            params: {
+                                                oid: oid,
+                                                templateOid: that.config[configId].componentVO.templateVO.oid
+                                            }
+                                        });
+                                    }
+
+                                    if(add){
+                                        webUtil.get(that.url.controller + 'getCodeRuleByClassifyOid', {codeClassifyOid: that.config[configId].currentItemOid}, function (result) {
+                                            if (!result.success) {
+                                                $webUtil.showErrorMsg(result.msg);
+                                            } else {
+                                                that.config[configId].codeRuleOid=result.obj.oid;
+                                                var codeValueItems=that.MdmEngineForm.getCodeValueItems(result.obj.secVOList,'form_codevlaue_'+filter);
+                                                if(codeValueItems.length==0 && !hasResemble){
+                                                    easyuiLayout.layout('remove','south');
+                                                    return;
+                                                }
+                                                if(codeValueItems.length == 0 && hasResemble){
+                                                    //闅愯棌褰撳墠鐨勯�夐」鍗�
+                                                    layui.element.tabDelete("tab_" + filter, "codeorder");
+                                                    return;
+                                                }
+                                                var height=Math.ceil(codeValueItems.length/colCount)*53+70;
+                                                if(hasResemble && height<270){
+                                                    height =270;
+                                                }
+                                                var top=easyuiLayout.height()-height-5;
+                                                $('#border_'+ filter).height(height-5).parent().css({top:top+'px'}).prev().find('.layout-body').height(top-12);
+                                                form.addItems('form_codevlaue_'+filter, codeValueItems,function (){}, {}, {defaultColumnOneRow: colCount, labelWidth: 160});
+                                            }
+                                        });
+                                    }else{
+                                        if(!hasResemble){
+                                            easyuiLayout.layout('remove','south');
+                                            return;
+                                        }else{
+                                            //闅愯棌鐮佸�肩敵璇烽�夐」鍗�
+                                            layui.element.tabDelete("tab_" + filter, "codeorder");
+                                            return;
+                                        }
+                                    }
+
+                                }, {}, {defaultColumnOneRow: colCount, labelWidth: 160});
+
+                        },
+                        yes: function (layero) {
+                            if (form.validata(filter) && form.validata("form_codevlaue_" + filter)) {
+                                var values = form.getDefaultValues(filter, true);
+                                if(up){
+                                    values.defaultValues['copyfromversion'] = values.defaultValues.oid;
+                                    values.defaultValues.oid = '';
+                                }
+                                var codevalues = form.getValues("form_codevlaue_" + filter, true);
+                                var secDTOList=[];
+                                layui.each(codevalues,function (i,item){
+                                    secDTOList.push({secOid:i,secValue:item})
+                                })
+                                var datas = {
+                                    codeClassifyOid:that.config[configId].currentItemOid,
+                                    templateOid:that.config[configId].componentVO.templateVO.oid,
+                                    codeRuleOid:that.config[configId].codeRuleOid,
+                                    data: values.otherValue,
+                                    secDTOList:secDTOList
+                                }
+                                $.extend(datas, values.defaultValues);
+                                webUtil.manualAjax((add||up)?'post':'put', that.url.controller+(add?'addSaveCode':(up?'upSaveCode':'editSaveCode')), JSON.stringify(datas), function (result) {
+                                    if (result.success) {
+                                        webUtil.showMsgFromResult(result, (add?"娣诲姞鎴愬姛":(up?'鏁版嵁鏇存敼鎴愬姛':"淇敼鎴愬姛")));
+                                        layer.close(dialogIndex);
+                                        that.refreshTable(null,button)
+                                    } else {
+                                        webUtil.showErrorMsg(result.msg);
+                                    }
+                                }, function (xhr, err) {
+                                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                                }, that.backPath);
+                            }
+                        },
+                        btn3:function (layero){
+                            if(form.validata(filter)){
+                                var values = form.getDefaultValues(filter, true);
+                                if(up){
+                                    values.defaultValues['copyfromversion'] = values.defaultValues.oid;
+                                    values.defaultValues.oid = '';
+                                }
+                                var datas = {
+                                    codeClassifyOid:that.config[configId].currentItemOid,
+                                    templateOid:that.config[configId].componentVO.templateVO.oid,
+                                    codeRuleOid:that.config[configId].codeRuleOid,
+                                    data: values.otherValue
+                                }
+                                $.extend(datas, values.defaultValues);
+                                webUtil.manualAjax('post', that.url.controller+'resembleQuery', JSON.stringify(datas), function (result) {
+                                    if (result.success) {
+                                        layui.table.reload("resemble_" + filter, {
+                                            data: result.data
+                                        });
+                                        layui.element.tabChange("tab_" + filter, 'resemble');
+                                    } else {
+                                        webUtil.showErrorMsg(result.msg);
+                                    }
+                                }, function (xhr, err) {
+                                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                                }, that.backPath);
+                            }
+                            return false;
+                        },
+                        btn2: function (layero) {
+                            layer.close(dialogIndex);
+                        }
+                    });
+                }
+            });
+        };
+        this.CODEEDIT=function (type,button){
+            var that = this;
+            var configId=$(button).attr('layui-filter').split('_')[1]
+            var oid = webUtil.getOidFromGrid('table_' + configId,true,true);
+            if(!oid){
+                return;
+            }
+            var lcStatus = webUtil.getOidFromGrid('table_' + configId,true,true,'lcstatus');
+            if (lcStatus != 'Editing') {
+                webUtil.showErrorMsg('缂栫爜鐘舵�佷笉鏄�滅紪杈戜腑鈥�,涓嶅彲缂栬緫');
+                return false;
+            }
+            that.codeAddOrEdit(button,configId,false,oid,null);
+        }
+        this.CODEDELETE=function (type,button){
+            var that = this;
+            var configId=$(button).attr('layui-filter').split('_')[1]
+            if(!that.checkComponentVO(configId)){
+                return false;
+            }
+            var oid = webUtil.getOidFromGrid('table_' + configId,true,false);
+            if(!oid){
+                return false;
+            }
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎閫変腑鏁版嵁锛�",function () {
+                var submitData = {
+                    oidList:oid.split(","),
+                    codeClassifyOid:that.config[configId].currentItemOid
+                }
+                webUtil.manualAjax("delete",that.url.controller + 'deleteCode',JSON.stringify(submitData),function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refreshTable(null,button);
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        }
+
+        this.CODEEXPORT = function (type,button){
+            //瀵煎嚭
+            var that = this;
+            var configId=$(button).attr('layui-filter').split('_')[1]
+            var form=layui.form;
+            var filter = "codeexport_" + configId;
+            var content =['<div style="display:block;">',
+                    '<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                    '<div id="transfer_'+filter+'" style="margin: 0 15px;display: inline-block"></div>',
+                    '<div id="tool_'+filter+'" style="display: inline-block">',
+                        '<button disabled class="layui-btn layui-btn-sm layui-btn-disabled toolbar_', filter, '_UPSELECT" style="display:block"><i class="layui-icon layui-icon-up"></i>涓婄Щ</button>',
+                        '<button disabled class="layui-btn layui-btn-sm layui-btn-disabled toolbar_', filter, '_DOWNSELECT" style="margin:10px 0 0 0"><i class="layui-icon layui-icon-down"></i>涓嬬Щ</button>',
+                    '</div>',
+                '</div>'];
+            var dialogndex = $webUtil.dialog({
+                title: '鏁版嵁瀵煎嚭灞炴�ч�夋嫨绐楀彛',
+                btn: ['纭畾', '鍙栨秷'],
+                content: content.join(''),
+                area: ['800px', '670px'],
+                success: function (layero) {
+                    form.addItems(filter, [{
+                            field: 'type',
+                            title: '瀵煎嚭鏂瑰紡',
+                            textWidth: 275,
+                            textStyle: 'margin-bottom: 5px;',
+                            type: 'radio',
+                            comboxKey: 'type',
+                            data: [{key: 'check', value: '閫夋嫨&nbsp;&nbsp;&nbsp;&nbsp;'}, {key: 'all', value: '鍏ㄩ儴&nbsp;&nbsp;&nbsp;&nbsp;'}, {key: 'page', value: '椤电爜'}]
+                        }],
+                        function () {
+                            form.on('radio(type)', function (data) {
+                                var parentDiv = data.othis.parents('.layui-form-item');
+                                if (this.value != 'page') {
+                                    parentDiv.find('.layui-form-mid').remove();
+                                } else {
+                                    if (parentDiv.find('.layui-form-mid').length == 0) {
+                                        var inputDiv = $('<div class="layui-form-mid" style="padding: 0 !important"><input type="text" name="exportPage" autofocus lay-verify="exportPage" class="layui-input" style="width: 100px;display: inline-block"> (杈撳叆椤电爜鎴栬�呴〉闈㈣寖鍥达紝濡傦細1-10)</div>');
+                                        inputDiv.appendTo(parentDiv);
+                                    }
+                                }
+                            });
+                        }, {}, {});
+                    var datas=[];
+                    for (var i = 0; i < that.config[configId].componentVO.templateVO.attributes.length; i++) {
+                        if(that.config[configId].componentVO.templateVO.attributes[i].formdisplayflag=='true' || that.config[configId].componentVO.templateVO.attributes[i].tabledisplayflag=='true'){
+                            datas.push(that.config[configId].componentVO.templateVO.attributes[i])
+                        }
+                    }
+                    layui.transfer.render({
+                        elem: '#transfer_'+filter
+                        ,data: datas
+                        ,width:310
+                        ,height:500
+                        ,id:'transfer_'+filter//绱㈠紩
+                        ,parseData: function(res){
+                            return {
+                                "value": res.id //鏁版嵁鍊�
+                                ,"title": res.name//鏁版嵁鏍囬
+                            }
+                        }
+                        ,title: ['鏈�夊睘鎬�', '宸查�夊睘鎬�']
+                        ,showSearch: true
+                        ,done:function (d,laybox) {
+                            laybox.eq(1).on('click', 'input[lay-filter="layTransferCheckbox"]+', function () {
+                                var checkbox = laybox.eq(1).find('input[name="layTransferLeftCheck"]:checked');
+                                if (checkbox.length > 0) {
+                                    $('.toolbar_' + filter + '_UPSELECT').removeAttr('disabled').removeClass('layui-btn-disabled')
+                                    $('.toolbar_' + filter + '_DOWNSELECT').removeAttr('disabled').removeClass('layui-btn-disabled')
+                                } else {
+                                    $('.toolbar_' + filter + '_UPSELECT').attr('disabled', 'disabled').addClass('layui-btn-disabled')
+                                    $('.toolbar_' + filter + '_DOWNSELECT').attr('disabled', 'disabled').addClass('layui-btn-disabled')
+                                }
+                            })
+                            $('.toolbar_' + filter + '_UPSELECT').click(function () {
+                                var checkbox = laybox.eq(1).find('input[name="layTransferLeftCheck"]:checked');
+                                if (checkbox.length > 1) {
+                                    $webUtil.showErrorMsg("璇烽�夋嫨涓�鏉¢渶瑕佺Щ鍔ㄧ殑鏁版嵁");
+                                    return;
+                                }
+                                var index=checkbox.eq(0).parent().index()
+                                index!=0 && layui.transfer.moveData('transfer_' + filter,1,index,index-1);
+                            })
+                            $('.toolbar_' + filter + '_DOWNSELECT').click(function () {
+                                var data = layui.transfer.getData('transfer_' + filter);
+                                var checkbox = laybox.eq(1).find('input[name="layTransferLeftCheck"]:checked');
+                                if (checkbox.length > 1) {
+                                    $webUtil.showErrorMsg("璇烽�夋嫨涓�鏉¢渶瑕佺Щ鍔ㄧ殑鏁版嵁");
+                                    return;
+                                }
+                                var index=checkbox.eq(0).parent().index()
+                                index!=data.length-1 && layui.transfer.moveData('transfer_' + filter,1,index,index+1);
+                            })
+                        }
+                    })
+
+
+                },
+                yes: function (layero) {
+                    var data={
+                        codeClassifyOid:that.config[configId].currentItemOid
+                    }
+                    var getData = layui.transfer.getData('transfer_'+filter);
+                    $.each(getData,function (i,item){
+                        data['attrIdIndexMap["' + i + '"]']=item.value
+                    })
+
+                    var requestData={};
+                    var queryValue = $('[layui-filter="toolbar_' + configId + '"] input[name="fast_search_select_value"]').val();
+                    var queryKey = $('[layui-filter="toolbar_' + configId + '"] select[name="fast_search_select"]').val();
+                    if($webUtil.isNotNull(queryKey)){
+                        requestData['conditionMap["' + queryKey + '"]'] = ($webUtil.isNull(queryValue)?"":("*" + queryValue + "*"));
+                        var lastQueryKeyInput = $('[layui-filter="toolbar_' + configId + '"] input[name="fast_search_select_value"]').next();
+                        var lastQueryKey =lastQueryKeyInput.val();
+                        if($webUtil.isNotNull(lastQueryKey) && lastQueryKey != queryKey){
+                            requestData['conditionMap["' + lastQueryKey + '"]'] = "";
+                        }
+                    }
+                    if(that.config[configId].serinorQueryInstance && that.config[configId].serinorQueryInstance.requestData){
+                        $.extend(requestData,that.config[configId].serinorQueryInstance.requestData);
+                    }
+                    $.each(requestData,function (i,item){
+                        data[i]=item
+                    })
+
+                    var type = form.getValues(filter, true).type;
+                    if(type=='check'){
+                        var selectData = layui.table.checkStatus("table_" +configId).data;
+                        if(selectData.length == 0){
+                            $webUtil.showErrorMsg("璇烽�夋嫨瑕佸鍑虹殑鏁版嵁");
+                            return false;
+                        }
+                        var oids=[];
+                        layui.each(selectData,function (i,item){
+                            oids.push(item.oid);
+                        });
+                        data['conditionMap["oid"]']=oids.join(',')
+                    }else if (type=='page'){
+                        data.limit=$("div.layui-table-view[lay-id='table_" +configId+"'] .layui-laypage-limits select").val();
+                        var exportPage=$('input[name="exportPage"]').val();
+                        if(webUtil.isNull(exportPage)){
+                            $webUtil.showErrorMsg("璇烽�夋嫨瑕佸鍑虹殑椤电爜");
+                            return false;
+                        }
+                        if(exportPage.indexOf('-')!=-1){
+                            if(!/^[1-9]\d*$/.test(exportPage.split('-')[0]) || !/^[1-9]\d*$/.test(exportPage.split('-')[1])){
+                                $webUtil.showErrorMsg("璇疯緭鍏ユ纭殑椤甸潰鑼冨洿");
+                                return false;
+                            }
+                            data.page=exportPage.split('-')[0];
+                            data.endPage=exportPage.split('-')[1];
+                        }else {
+                            if(!/^[1-9]\d*$/.test(exportPage)){
+                                $webUtil.showErrorMsg("璇疯緭鍏ユ纭殑椤电爜");
+                                return false;
+                            }
+                            data.page=exportPage;
+                            data.endPage=exportPage;
+                        }
+
+                    }else{
+                        data.limit=-1;
+                    }
+                    $webUtil.fileDownloadPost(that.backPath + that.url.controller + that.url.export, data,function (){ layer.close(dialogndex);});
+                },
+                btn2: function (layero) {
+                    layer.close(dialogndex);
+                }
+            })
+
+        };
+
+        this.CODEBATCHADD = function (type,button) {
+            // 鍏堟妸妯℃澘涓嬭浇涓嬫潵
+            var that = this;
+            var configId=$(button).attr('layui-filter').split('_')[1]
+            var filter = "batchAdd" + configId;
+            var form = layui.form;
+            var content = ['<form id="', filter, '" lay-filter="', filter, '" class="layui-form" style="margin:15px 30px 15px 0;" >' +
+            '</form>',
+                '<button type="button" className="layui-btn" id="upload_button_' , filter ,
+                '" style="margin:5px 50px;display: block;float:left;"><i className="layui-icon layui-icon-upload"></i>娴忚鏂囦欢</button>'
+            ].join('');
+            var addSaveIndex = $webUtil.dialog({
+                title: '鎵归噺鐢宠缂栫爜',
+                btn: ['涓嬭浇瀵煎叆妯℃澘', '鍏抽棴'],
+                content: content,
+                area: ['800px', '600px'],
+                success: function (layero) {
+                    //娣诲姞缂栫爜瑙勫垯鐨勫瓧娈�
+                    webUtil.get(that.url.controller + 'getCodeRuleByClassifyOid', {codeClassifyOid: that.config[configId].currentItemOid}, function (result) {
+                        if (!result.success) {
+                            $webUtil.showErrorMsg(result.msg);
+                        } else {
+                            var items = [{
+                                type:'line',
+                                field:'tips',
+                                text:'瀵煎叆鎻愮ず'
+                            },{
+                                field: 'keyAttrTips',
+                                text:'1.鏍囬甯︿簲瑙掓槦鐨勮〃绀哄叧閿睘鎬э紝甯︽槦鍙疯〃绀哄繀杈撻」',
+                                type: 'label',
+                                labelWidth:475,
+                                labelStyle:'margin-left:50px',
+                                useAllWidth:true
+                            },{
+                                field: 'requiredTips',
+                                text:'2.璇蜂竴瀹氬厛閫夋嫨/杈撳叆缂栫爜瑙勫垯鐨勭爜娈靛�煎悗鍐嶉�夋嫨excel鏂囦欢',
+                                type: 'label',
+                                labelWidth:475,
+                                labelStyle:'margin-left:50px',
+                                useAllWidth:true
+                            },{
+                                field: 'totalTooltips',
+                                text:'3.姣忔浠呰兘鏈�澶氬鍏�10000鏉℃暟鎹紝濡傛灉鍑洪敊浼氳繑鍥為敊璇殑鏁版嵁鍜屽師鍥狅紝浣嗘槸姝g‘鐨勬暟鎹細淇濆瓨',
+                                type: 'label',
+                                labelWidth:475,
+                                labelStyle:'margin-left:50px',
+                                useAllWidth:true
+                            }, {
+                                field: 'classifyTips',
+                                text: '4.濡傛灉灞炴�т负鍙傜収锛屽湪鍙傜収閰嶇疆涓缃涓睘鎬ф椂锛屼紭鍏堜娇鐢╪ame灞炴�х殑鍊硷紝鍚﹀垯濉啓绗竴涓睘鎬х殑鍊笺��',
+                                type: 'label',
+                                labelWidth: 600,
+                                labelStyle: 'margin-left:50px',
+                                useAllWidth: true
+                            },{
+                                type:'line',
+                                field:'codeValues',
+                                text:'缂栫爜瑙勫垯鐨勭爜娈典俊鎭紝璇峰厛閫夋嫨鍚庡啀瀵煎叆'
+                            }];
+                            var codeValueItems=that.MdmEngineForm.getCodeValueItems(result.obj.secVOList);
+                            //鎴戜滑鎶婃彁绀虹殑淇℃伅涔熷姞杩涘幓
+                            if(codeValueItems){
+                                layui.each(codeValueItems,function (_index,_item){
+                                    items.push(_item);
+                                });
+                            }
+                            items.push({
+                                type:'line',
+                                field:'excelFile',
+                                text:'excel鏂囦欢锛岄�夋嫨鏂囦欢鍚庝細鑷姩涓婁紶'
+                            })
+                            form.addItems(filter, items,function (){}, {}, {defaultColumnOneRow: that.MdmEngineForm.getFormCol({items:[], labelWidth: 160}), labelWidth: 160});
+                            var upload = layui.upload;
+                            //鎵ц瀹炰緥
+                            var uploadInst = upload.render({
+                                elem: '#upload_button_' + filter //缁戝畾鍏冪礌
+                                ,accept:'file'
+                                ,acceptMime:'file/*'
+                                ,exts:'xls|xlsx'
+                                ,url: that.backPath+ that.url.controller + that.url.batchImportCode//涓婁紶鎺ュ彛
+                                ,auto:true
+                                ,before:function(obj){
+                                    if(!form.validata(filter)){
+                                        return false;
+                                    }
+                                    var values = form.getValues(filter, true);
+                                    var secDTOList=[];
+                                    layui.each(values,function (i,item){
+                                        secDTOList.push({secOid:i,secValue:item})
+                                    })
+                                    values['secDTOList'] = JSON.stringify(secDTOList);
+                                    values['codeClassifyOid'] = that.config[configId].currentItemOid;
+                                    obj.setData(values);
+                                    return true;
+                                }
+                                ,done: function(result){//涓嶉渶瑕佽緭鍏ュ唴瀹癸紝鍥犳娌℃湁before
+                                    if(result.success){
+                                        layer.close(addSaveIndex);
+                                        $webUtil.showMsgFromResult(result,"鎵归噺鐢宠鎴愬姛锛�");
+                                        that.refreshTable(null,button);
+                                    }else{
+                                        //闇�瑕佸幓涓嬭浇閿欒淇℃伅
+                                        $webUtil.fileDownload(that.backPath + that.url.controller + "downloadErrorFile?uuid=" + result.obj,null,'瀵煎叆閿欒锛岃鏌ョ湅涓嬭浇鐨勩�愰敊璇俊鎭�戞枃浠�');
+                                    }
+                                }
+                                ,error: function(){
+                                    //璇锋眰寮傚父鍥炶皟
+                                    $webUtil.showErrorMsg("涓婁紶寮傚父,鏈嶅姟绔嚭閿欎簡");
+                                }
+                            });
+                        }
+                    });
+                },
+                yes: function (layero) {
+                    $webUtil.fileDownload(that.backPath + that.url.controller + that.url.downloadImportExcel + "?codeClassifyOid=" + that.config[configId].currentItemOid);
+                },
+                btn2: function (layero) {
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.CODEIMPORTHISTORY = function (type,button){
+            // 鍏堟妸妯℃澘涓嬭浇涓嬫潵
+            var that = this;
+            var configId=$(button).attr('layui-filter').split('_')[1]
+            var filter = "history" + configId;
+            var form = layui.form;
+            var content = ['<form id="', filter, '" lay-filter="', filter, '" class="layui-form" style="margin:15px 30px 15px 0;" >' +
+            '</form>',
+                '<button type="button" className="layui-btn" id="upload_button_' , filter ,
+                '" style="margin:5px 50px;display: block;float:left;"><i className="layui-icon layui-icon-upload"></i>娴忚鏂囦欢</button>'
+            ].join('');
+            var addSaveIndex = $webUtil.dialog({
+                title: '鍘嗗彶鏁版嵁瀵煎叆',
+                btn: ['涓嬭浇瀵煎叆妯℃澘', '鍏抽棴'],
+                content: content,
+                area: ['800px', '600px'],
+                success: function (layero) {
+                    //鍘嗗彶鏁版嵁涓嶅瑙勫垯
+                    var items = [{
+                        type: 'line',
+                        field: 'tips',
+                        text: '瀵煎叆鎻愮ず'
+                    }, {
+                        field: 'keyAttrTips',
+                        text: '1.鏍囬甯︿簲瑙掓槦鐨勮〃绀哄叧閿睘鎬э紝甯︽槦鍙疯〃绀哄繀杈撻」',
+                        type: 'label',
+                        labelWidth: 600,
+                        labelStyle: 'margin-left:50px',
+                        useAllWidth: true
+                    }, {
+                        field: 'requiredTips',
+                        text: '2.浼佷笟缂栫爜锛岄泦鍥㈢爜鍜岀姸鎬侀兘闇�瑕佸鍏�',
+                        type: 'label',
+                        labelWidth: 600,
+                        labelStyle: 'margin-left:50px',
+                        useAllWidth: true
+                    },{
+                        field: 'requiredTips',
+                        text:'3.姣忔浠呰兘鏈�澶氬鍏�10000鏉℃暟鎹紝濡傛灉鍑洪敊浼氳繑鍥為敊璇殑鏁版嵁鍜屽師鍥狅紝浣嗘槸姝g‘鐨勬暟鎹細淇濆瓨',
+                        type: 'label',
+                        labelWidth:600,
+                        labelStyle:'margin-left:50px',
+                        useAllWidth:true
+                    }, {
+                        field: 'classifyTips',
+                        text: '4.鍒嗙被鐨勮矾寰勯渶瑕佺敤#鍒嗛殧銆備粎濉啓褰撳墠閫夌殑鍒嗙被鏍戜笂鐨勪笅绾у垎绫荤殑璺緞锛屽鏋滃綋鍓嶅垎绫诲凡缁忔槸鍙跺瓙鑺傜偣锛屽垯涓嶅~鍐�',
+                        type: 'label',
+                        labelWidth: 600,
+                        labelStyle: 'margin-left:50px',
+                        useAllWidth: true
+                    },{
+                        field: 'classifyAttr',
+                        title: '鍒嗙被鐨勮矾寰勪娇鐢ㄧ殑灞炴��',
+                        textWidth: 350,
+                        labelWidth: 200,
+                        textStyle: 'margin-bottom: 15px;',
+                        type: 'radio',
+                        comboxKey: 'classifyAttr',
+                        data: [{key: 'id', value: '鍒嗙被缂栧彿'}, {key: 'name', value: '鍒嗙被鍚嶇О'}]
+                    }, {
+                        type: 'line',
+                        field: 'excelFile',
+                        text: 'excel鏂囦欢锛岄�夋嫨鏂囦欢鍚庝細鑷姩涓婁紶'
+                    }];
+                    form.addItems(filter, items, function () {
+                    }, {}, {defaultColumnOneRow: that.MdmEngineForm.getFormCol({items: [], labelWidth: 160}), labelWidth: 160});
+                    var upload = layui.upload;
+                    //鎵ц瀹炰緥
+                    var uploadInst = upload.render({
+                        elem: '#upload_button_' + filter //缁戝畾鍏冪礌
+                        , accept: 'file'
+                        , acceptMime: 'file/*'
+                        , exts: 'xls|xlsx'
+                        , url: that.backPath + that.url.controller + that.url.importHistoryData//涓婁紶鎺ュ彛
+                        , auto: true
+                        , before: function (obj) {
+                            if (!form.validata(filter)) {
+                                return false;
+                            }
+                            var values = form.getValues(filter, true);
+                            values['codeClassifyOid'] = that.config[configId].currentItemOid;
+
+                            obj.setData(values);
+                            return true;
+                        }
+                        , done: function (result) {//涓嶉渶瑕佽緭鍏ュ唴瀹癸紝鍥犳娌℃湁before
+                            if (result.success) {
+                                layer.close(addSaveIndex);
+                                $webUtil.showMsgFromResult(result, "瀵煎叆鍘嗗彶鏁版嵁鎴愬姛锛�");
+                                that.refreshTable(null,button);
+                            }else{
+                                //闇�瑕佸幓涓嬭浇閿欒淇℃伅
+                                $webUtil.fileDownload(that.backPath + that.url.controller + "downloadErrorFile?uuid=" + result.obj,null,'瀵煎叆閿欒锛岃鏌ョ湅涓嬭浇鐨勩�愰敊璇俊鎭�戞枃浠�');
+                            }
+                        }
+                        , error: function () {
+                            //璇锋眰寮傚父鍥炶皟
+                            $webUtil.showErrorMsg("涓婁紶寮傚父,鏈嶅姟绔嚭閿欎簡");
+                        }
+                    });
+                },
+                yes: function (layero) {
+                    $webUtil.fileDownload(that.backPath + that.url.controller + that.url.downloadImportExcelHistory + "?codeClassifyOid=" + that.config[configId].currentItemOid);
+                },
+                btn2: function (layero) {
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.CODESTARTPROCESS = function (type,button){
+            var configId=$(button).attr('layui-filter').split('_')[1]
+            var options = {
+                processUse:'code_cls_flow_use_order',
+                processUseText:'鐢宠',
+                allowStatus:'Editing',
+                allowStatusText:'宸茬紪杈�',
+                startStatus:'Auditing',
+                resetStatus:'Editing',
+                batchTitle:'鎵归噺鎻愪氦缂栫爜鏁版嵁鍒版祦绋嬪鎵�',
+                title:'鎻愪氦缂栫爜鏁版嵁鍒版祦绋嬪鎵�'
+            }
+            var that = this;
+            that.checkStatusAndSubmitProcess(options,'Released',configId,button);
+        };
+        this.CODEDISABLE = function (type,button){
+            var configId=$(button).attr('layui-filter').split('_')[1]
+            var options = {
+                processUse:'code_cls_flow_use_freeze',
+                processUseText:'鍋滅敤',
+                allowStatus:'Released',
+                allowStatusText:'宸插彂甯�',
+                resetStatus:'Released',
+                batchTitle:'鎵归噺鍋滅敤(鍐荤粨)鐨勭紪鐮佹暟鎹�',
+                title:'鍋滅敤(鍐荤粨)缂栫爜鏁版嵁',
+                confirmMsg:'鏄惁瑕佸仠鐢ㄨ繖浜涙暟鎹�',
+            }
+            var that = this;
+            that.checkStatusAndSubmitProcess(options,'Disabled',configId,button);
+        };
+        this.CODERECYCLE = function (type,button){
+            var configId=$(button).attr('layui-filter').split('_')[1]
+            var options = {
+                processUse:'code_cls_flow_use_delete',
+                processUseText:'鍥炴敹',
+                allowStatus:'Released,Disabled',
+                allowStatusText:'宸插彂甯�,宸插仠鐢�',
+                batchTitle:'鎵归噺鍥炴敹鐨勭紪鐮佹暟鎹�',
+                title:'鍥炴敹缂栫爜鏁版嵁',
+                confirmMsg:'鏄惁瑕佸洖鏀惰繖浜涙暟鎹�',
+            }
+            var that = this;
+            that.checkStatusAndSubmitProcess(options,'TakeBack',configId,button);
+        };
+        this.CODEENABLE = function (type,button){
+            var configId=$(button).attr('layui-filter').split('_')[1]
+            var options = {
+                processUse:'code_cls_flow_use_unfreeze',
+                processUseText:'鍚敤',
+                allowStatus:'Disabled',
+                allowStatusText:'宸插仠鐢�',
+                resetStatus:'Disabled',
+                batchTitle:'鎵归噺鍚敤(瑙e喕)鐨勭紪鐮佹暟鎹�',
+                title:'鍚敤(瑙e喕)缂栫爜鏁版嵁',
+                confirmMsg:'鏄惁瑕佸惎鐢�(瑙e喕)杩欎簺鏁版嵁',
+            }
+            var that = this;
+            that.checkStatusAndSubmitProcess(options,'Released',configId,button);
+        };
+        this.CODEUPREVISION = function (type,button){
+            //鍗囩増
+            var that = this;
+            var configId=$(button).attr('layui-filter').split('_')[1]
+            var oid = webUtil.getOidFromGrid('table_' + configId,true,true);
+            if(!oid){
+                return;
+            }
+            var lcstatus = webUtil.getOidFromGrid('table_' + configId,false,false,'lcstatus');
+            if(lcstatus != 'Released'){
+                $webUtil.showErrorMsg('鍙湁鐘舵�佷负宸插彂甯冪殑鏁版嵁鎵嶈兘杩涜鏁版嵁鏇存敼');
+                return false;
+            }
+            that.codeAddOrEdit(button,configId,false,oid,true);
+        };
+        this.checkStatusAndSubmitProcess = function (options,targetLcstatus,configId,button){
+            var that = this;
+            if(!that.checkComponentVO(configId)){
+                return false;
+            }
+            var oids = $webUtil.getOidFromGrid("table_" + configId,true,false);
+            if(!oids){
+                return false;
+            }
+            var selectData = layui.table.checkStatus("table_" + configId).data;
+            if(selectData.length > 1000){
+                $webUtil.showErrorMsg("姣忔鎻愪氦鍒版祦绋嬬殑鏁伴噺璇蜂笉瑕佽秴杩�1000鏉�");
+                return false;
+            }
+            //瀹℃壒鐨勬暟鎹殑鐘舵�佸繀椤荤浉鍚�
+            var lcstatus = selectData[0].lcstatus;
+            var same = true;
+            layui.each(selectData,function (_index,_item){
+                if(_item.lcstatus != lcstatus){
+                    same =false;
+                    return true;
+                }
+            });
+            if(!same){
+                $webUtil.showErrorMsg("鎮ㄩ�夋嫨鐨勬暟鎹殑鐘舵�佷笉鐩稿悓");
+                return false;
+            }
+            var sameStatus = false;
+            layui.each(selectData,function (_index,_item){
+                if(_item.lcstatus== targetLcstatus){
+                    sameStatus =true;
+                    return true;
+                }
+            });
+            if(sameStatus){
+                $webUtil.showErrorMsg("閫夋嫨鐨勬暟鎹腑鐘舵�佹棤闇�鍐嶆墽琛屽綋鍓嶆搷浣�");
+                return false;
+            }
+            if(options.processUseText=='鐢宠' && webUtil.isNotNull(selectData[0].copyfromversion)){
+                options.processUseText='淇敼'
+                options.processUse='code_cls_flow_use_modify'
+            }
+            //鍘诲悗鍙拌幏鍙栨ā鏉�
+            $webUtil.get(that.url.processTemplateController + that.url.listProcessTemplate,{codeTemplateOid:that.config[configId].componentVO.templateVO.oid,processUse:options.processUse},function (result){
+                if(!result.success || !result.data || result.data.length == 0){
+                     that.changeStatus(targetLcstatus,oids,selectData[0].btmname,configId);
+                    return false;
+                }else{
+                    var canUseTemplate = [];
+                    layui.each(result.data,function (_index,_item){
+                        canUseTemplate.push(_item.id);
+                    });
+                    //$webUtil.showConfirmMsg(options.confirmMsg || "鏄惁灏嗚繖浜涙暟鎹彁浜ゅ鎵�?",function (r){
+                        //if(r){
+                            layui.use(["process/vciWebStartProcess"], function () {
+                                var startProcess = layui['process/vciWebStartProcess'];
+                                startProcess.init();
+                                startProcess.showStartWindow(that.config[configId].componentVO.templateVO.btmTypeId, selectData, {
+                                    title: ((selectData.length>1?options.batchTitle:options.title) || '娴佺▼瀹℃壒'),
+                                    checkAllowAttributeValues:options.allowStatus,
+                                    allowAttributesMsg:'鍙湁鐘舵�佹槸銆�' + options.allowStatusText + '銆戠殑鏁版嵁鎵嶅彲浠ュ彂璧锋祦绋�',
+                                    startStatus: options.startStatus,
+                                    resetStatus: (options.allowStatus.indexOf(",")>-1?lcstatus:options.resetStatus),
+                                    isMutiProcess:false,
+                                    canUseTemplate:canUseTemplate.join(","),
+                                    variablesInfo:{
+                                        codeClassifyOid:that.config[configId].currentItemOid,
+                                        processUse:options.processUse
+                                    },
+                                    processName:webUtil.getSystemVar(webUtil.sessionInfoKey.userName)+'-'+options.processUseText+'['+that.config[configId].rootItemName+'-'+selectData[0].name+']',
+                                    detailUrl:"USEJS:mdm/MdmEngineInProcess#",
+                                }, function (result) {
+                                    that.refreshTable(null,button);
+                                });
+                            });
+                        //}
+                    //});
+                }
+            },function (error,xhr){
+                $webUtil.showErrorMsg("鑾峰彇鍙敤鐨勬祦绋嬫ā鏉垮嚭閿欙紝鍙兘鏄湇鍔℃病鏈夊惎鍔紝鍙互涓�浼氬啀璇�")
+            },that.backPath);
+        }
+        this.VIEWFILE=function (rowData,configId){
+            //鏂囦欢棰勮
+            layui.use('BaseFileDownloadAction', function () {
+                var vciWebFilePreview = layui['BaseFileDownloadAction'];
+                vciWebFilePreview.PREVIEW(rowData.oid,{fileOid:rowData.oid},function (){
+                    $webUtil.showErrorMsg("鏂囦欢棰勮澶辫触锛岃鑱旂郴绠$悊鍛�")
+                })
+            })
+        }
+        this.UPLOADFILE=function (type,button){
+            var that=this;
+            var configId=$(button).attr('layui-filter').split('_')[1]
+            layui.use('BaseFileUploadAction', function () {
+                var BaseAction = layui['BaseFileUploadAction'];
+                var viewid = 'uploadfile_' + configId;
+                var callback = function () {
+                    that.refreshAttachTable(null,button)
+                }
+                var sourceData = layui.table.checkStatus("table_" + configId).data;
+                if(sourceData.length!=1){
+                    $webUtil.showErrorMsg("璇烽�夋嫨涓�鏉″垎绫绘暟鎹�")
+                    return;
+                }
+                var dataStore = layui.table.checkStatus("table_attach_" + configId).data;
+                BaseAction['doAction']({
+                    paramVOS: {
+                        title: "涓婁紶闄勪欢鍒楄〃",
+                        type: "fileobject"
+                    },
+                    id: viewid,
+                    dataStore: dataStore,
+                    sourceData: sourceData[0],
+                    callback: callback
+                });
+            })
+        }
+        this.DOWNLOADFILE=function (type,button){
+            var that=this;
+            var configId=$(button).attr('layui-filter').split('_')[1]
+            layui.use('BaseFileDownloadAction', function () {
+                var BaseAction = layui['BaseFileDownloadAction'];
+                var viewid = 'downloadfile_' + configId;
+                var callback = function () {
+                    that.refreshAttachTable(null,button)
+                }
+                var sourceData = layui.table.checkStatus("table_" + configId).data;
+                var dataStore = layui.table.checkStatus("table_attach_" + configId).data;
+                BaseAction['doAction']({
+                    paramVOS: {
+                        title: "涓嬭浇闄勪欢鍒楄〃",
+                        type: "fileobject"
+                    },
+                    id: viewid,
+                    dataStore: dataStore,
+                    sourceData: sourceData[0],
+                    callback: callback
+                });
+            })
+
+        }
+        this.revisefile=function (type,button){
+            var that=this;
+            var configId=$(button).attr('layui-filter').split('_')[1]
+            layui.use('BaseFileUploadAction', function () {
+                var BaseAction = layui['BaseFileUploadAction'];
+                var viewid = 'uploadfile_' + configId;
+                var callback = function () {
+                    that.refreshAttachTable(null,button)
+                }
+                var sourceData = layui.table.checkStatus("table_" + configId).data;
+                if(sourceData.length!=1){
+                    $webUtil.showErrorMsg("璇烽�夋嫨涓�鏉″垎绫绘暟鎹�")
+                    return;
+                }
+                var dataStore = layui.table.checkStatus("table_attach_" + configId).data;
+                if(dataStore.length!=1){
+                    $webUtil.showErrorMsg("璇烽�夋嫨涓�鏉¢渶瑕佷慨鏀圭殑鏁版嵁")
+                    return;
+                }
+                BaseAction['doAction']({
+                    paramVOS: {
+                        title: "淇敼闄勪欢鍒楄〃",
+                        type: "fileobject",
+                        updatefileflag:'true'
+                    },
+                    id: viewid,
+                    dataStore: dataStore,
+                    sourceData: sourceData[0],
+                    callback: callback
+                });
+            })
+        }
+        this.DELETEFILE=function (type,button){
+            var that=this;
+            var configId=$(button).attr('layui-filter').split('_')[1]
+            layui.use('BaseDeleteAction', function () {
+                var BaseAction = layui['BaseDeleteAction'];
+                var viewid = 'uploadfile_' +configId;
+                var callback = function () {
+                    that.refreshAttachTable(null,button)
+                }
+                var sourceData = layui.table.checkStatus("table_" + configId).data;
+                var dataStore = layui.table.checkStatus("table_attach_" + configId).data;
+                BaseAction['doAction']({
+                    paramVOS: {
+                        owner: "true",
+                        title: "鍒犻櫎闄勪欢鍒楄〃",
+                        type: "fileobject",
+                        multi:true
+                    },
+                    id: viewid,
+                    dataStore: dataStore,
+                    sourceData: sourceData[0],
+                    callback: callback
+                });
+            })
+        };
+        this.changeStatus = function (lcstatus,oids,btmname,configId){
+            var that = this;
+            $webUtil.showConfirmMsg("褰撳墠鍒嗙被娌℃湁娣诲姞娴佺▼妯℃澘锛屾槸鍚︿笉鐢ㄦ祦绋嬪鎵圭洿鎺ユ墽琛�",function (r) {
+                if (r) {
+                    $webUtil.post(that.url.controller + "/changeStatus", {
+                        oid: oids,
+                        btmname: btmname,
+                        lcStatus: lcstatus
+                    }, function (result) {
+                        if (result.success) {
+                            $webUtil.showMsgFromResult(result, "鎵ц鎴愬姛");
+                            layui.table.reload('table_' + configId);
+                        } else {
+                            $webUtil.showErrorMsg(result.msg);
+                        }
+                    }, function (error, xhr) {
+                        $webUtil.showErrorMsg("閾炬帴鏈夎锛屽彲浠ヤ竴浼氬啀璇�");
+                    }, that.backPath);
+                }
+            });
+        }
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/vciweb/mdm/MdmEngineForm.js b/Source/platformProject/platform2022UI/vciweb/mdm/MdmEngineForm.js
new file mode 100644
index 0000000..d7f9c78
--- /dev/null
+++ b/Source/platformProject/platform2022UI/vciweb/mdm/MdmEngineForm.js
@@ -0,0 +1,368 @@
+/**
+ * 涓绘暟鎹紪鐮佽〃鍗�
+ * @author wangting
+ * @date 2022-4-12
+ */
+layui.define(['layer','element','form','table','dynamicCondition' ,'tree','transfer'],function(exports){
+    var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "mdm/MdmEngineForm";
+        this.moduleKey = "MdmEngineForm";
+        this.backPath =  configData.compatibility? path:configData.mdmService;
+        this.url = {
+            classifyController: 'codeClassifyController/',
+            classifyTree:'referTree',
+            controller:'mdmEngineController/',
+            tableUI:'getUIInfoByClassifyOid',
+            formUI:'getFormDefineByTemplateOid',
+            tableData:'gridTableDataByClassifyOid',
+            getDataByOid:'getDataByOid'
+        };
+        this.config={}
+        this.getContent = function (){
+            var that = this;
+            return '<div id="UIContent_' + that.id + '" style="overflow: auto;padding:0 5px"></div>';
+        };
+        this.showContent=function(){
+            var html = "";
+            $("#UIContent_" + this.id).html(html);
+        };
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            this.config[that.id] = {
+                sourceData:that.sourceData
+            };
+        };
+        this.getFormDefine = function (codetemplateoid,codeClassifyOid,callback){
+            var that = this;
+            webUtil.get(that.url.controller + that.url.formUI,{templateOid: codetemplateoid,codeClassifyOid:codeClassifyOid},function (result){
+                if(!result.success) {
+                    $webUtil.showErrorMsg(result.msg);
+                }else{
+                    if(callback){
+                        callback(result.obj);
+                    }
+                }
+            });
+        };
+        this.getFormCol = function (formDefineVO,options) {
+            var screenWidth = webUtil.getDialogScreenWidth(options||{fullScreen:true});
+            var hasPrefix = false;
+            var hasSuffix = false;
+            layui.each(formDefineVO.items, function (_index, _item) {
+                if ($webUtil.isNotNull(_item.prefix)) {
+                    hasPrefix = true;
+                }
+                if ($webUtil.isNotNull(_item.suffix)) {
+                    hasSuffix = true;
+                }
+            });
+            var preWidth = 430;
+            if (hasPrefix) {
+                preWidth += 40;
+            }
+            if (hasSuffix) {
+                preWidth += 40;
+            }
+            //蹇樿form閲岄潰涓哄暐瑕佸噺鍘�1浜嗭紝涓嶆暍鏀�
+            return (screenWidth - screenWidth % preWidth) / preWidth  ;
+        };
+        this.getFormItemsByVO = function (formDefineVO,readOnly,colCount,add){
+            var that=this;
+            layui.each(formDefineVO.items, function (_index, _item) {
+                //鍥犱负琛ㄥ崟涓婄殑瀛楁涓婂凡缁忚缃簡readOnly锛屽湪榛樿涓婅缃殑readOnly涓嶄細鐢熸晥锛屾垜浠渶瑕佽嚜琛岃浆鎹竴涓�
+                if(_item.field == 'id' || _item.field == 'lcstatus'){
+                    if(!add &&_item.field == 'id' && _item.hidden ){
+                        _item.hidden= false;
+                    }
+                    _item.readOnly = true;
+                }else {
+                    _item.readOnly = readOnly?readOnly:_item.readOnly;
+                    if(_item.field=='lcstatus' && _item.readOnly){
+                        _item.field='lcstatus_text';
+                        _item.type='text';
+                    }
+                }
+                _item.inputWidth = 250;
+                if(_item.type=="textarea"){
+                    _item.useAllWidth=true;
+                    _item.inputWidth = 415 * colCount - 160;
+                }
+                if(_item.type=="combox"){
+                    _item.search = true;
+                }
+                if(webUtil.isNotNull(_item.selectLibFlag)) {
+                    _item.type = 'combox';
+                    _item.comboxTextField=_item.field;
+                    _item.field= _item.comboxTextField+'Select';
+                    _item.comboxKey = formDefineVO.oid+'_'+_item.field;
+                    _item.editable = true;
+                    _item.search = true;
+                    _item.url = "bdSelectInputController/listByFlag";
+                    _item.backPath = that.backPath;
+                    _item.extraParams = {
+                        namespace: formDefineVO.btmType,
+                        flag: _item.field
+                    }
+                }
+            });
+            return formDefineVO.items;
+        };
+        //鐮佸�艰〃鍗曢」
+        this.getCodeValueItems=function (data,formfilter) {
+            var that=this;
+            var items = [];
+            layui.each(data, function (i, item) {
+                if(item.sectype=="codefixedsec"){
+                    //鍥哄畾鐮佹
+                    var fixedValueVOList=[];
+                    layui.each(item.fixedValueVOList,function (valueIndex,valueItem){
+                        fixedValueVOList.push({key:valueItem.id,value: valueItem.id})
+                    })
+                    items.push({
+                        field: item.oid,
+                        title: item.name,
+                        required: item.nullableFlag!='true',
+                        type: 'combox',
+                        data:fixedValueVOList,
+                        search:true
+                    })
+                }else if(item.sectype=="codeclassifysec") {
+                    //鍒嗙被鐮佹
+                    var classifyitem = {
+                        field: item.oid,
+                        title: item.name,
+                        required: item.nullableFlag != 'true',
+                        type: 'refer',
+                        showField: item.name,
+                        readOnly:webUtil.isNull(item.parentClassifySecOid)?false:true,
+                        parentClassifySecOid:item.parentClassifySecOid,
+                        referConfig: {
+                            backPath: that.backPath,
+                            isMuti: false,
+                            type: 'grid',
+                            width: 680,
+                            tableConfig: {
+                                limit:-1,
+                                cols: [layui.table.getIndexColumn(), layui.table.getCheckColumn(), {
+                                    field: 'id',
+                                    title: '鑻辨枃鍚嶇О',
+                                    sort: true,
+                                    width: 150
+                                }, {
+                                    field: 'name',
+                                    title: '涓枃鍚嶇О',
+                                    sort: true,
+                                    width: 150
+                                }, {
+                                    field: 'description',
+                                    title: '鎻忚堪',
+                                    width: 250
+                                }],
+                                queryColumns: [
+                                    {
+                                        field: 'id',
+                                        title: '鑻辨枃鍚嶇О'
+                                    }, {
+                                        field: 'name',
+                                        title: '涓枃鍚嶇О'
+                                    }
+                                ]
+                            },
+                            url: that.url.controller + '/listCodeClassifyValueBySecOid',
+                            extraParams: {
+                                classifySecOid: item.oid,
+                                parentClassifyValueOid: ''
+                            }
+                        }
+                    }
+                    items.push(classifyitem);
+                    if(item.parentClassifySecOid){
+                        layui.form.on('select('+formfilter+')',function (data){
+                            if(data.name==item.parentClassifySecOid){
+                                var parentClassifyValueOid=data.value;
+                                var allItems=layui.form.getFormItems(formfilter);
+                                var childItems=[];
+                                layui.each(allItems,function (i,item){
+                                    if(item.parentClassifySecOid==data.name){
+                                        item.readOnly=false;
+                                        item.referConfig.extraParams.parentClassifyValueOid=parentClassifyValueOid
+                                        childItems.push(item)
+                                    }
+                                })
+                                layui.form.changeItems(formfilter,childItems)
+                            }
+                        })
+                    }
+
+                }else if(item.sectype=="codevariablesec"){
+                    //鍙彉鐮佹
+                    items.push({
+                        field: item.oid,
+                        title: item.name,
+                        required: item.nullableFlag!='true'
+                    })
+                }else if(item.sectype=="coderefersec"){
+                    //寮曠敤鐮佹
+                    var referConfig=JSON.parse(item.referValueInfo)
+                    if(referConfig && referConfig.tableConfig && referConfig.tableConfig.cols.length>0){
+                        referConfig.tableConfig.cols.unshift(layui.table.getIndexColumn(), layui.table.getCheckColumn());
+                        layui.each(referConfig.tableConfig.cols,function (i,item){
+                            if(item.templet!=''){
+                                referConfig.tableConfig.cols[i].templet=eval("(" + item.templet + ")")
+                            }
+                        })
+                    }
+                    items.push({
+                        field: item.oid,
+                        title: item.name,
+                        required: item.nullableFlag!='true',
+                        type: 'refer',
+                        showField: item.name,
+                        referConfig: referConfig
+                    })
+                }
+            })
+            return items;
+        }
+
+        //鐩镐技椤�
+        this.initResembleTable = function (componentVO,filter){
+            var that = this;
+            var table = layui.table;
+            if(componentVO.resembleTableVO && componentVO.resembleTableVO.cols && componentVO.resembleTableVO.cols.length>0){
+                //澶勭悊鍒楄〃
+                var cols = [];
+                var eventMap = {};
+                for (var i = 0; i < componentVO.resembleTableVO.cols.length; i++) {
+                    if (i == 0) {
+                        componentVO.resembleTableVO.cols[i].unshift({
+                            field: table.config.indexName,
+                            type: 'numbers',
+                            title: '搴忓彿',
+                            rowspan: componentVO.resembleTableVO.cols.length,
+                            width: 40
+                        }, {
+                            field: table.config.checkName,
+                            type: 'checkbox',
+                            rowspan: componentVO.resembleTableVO.cols.length,
+                            width: 30
+                        })
+                    }
+                    //姣忎釜瀛楁閮介渶瑕佹壂鎻忎竴涓嬫槸鍚︽湁浜嬩欢
+                    for (var j = 0; j < componentVO.resembleTableVO.cols[i].length; j++) {
+                        var record =  componentVO.resembleTableVO.cols[i][j];
+                        if(record.optionJsMap){
+                            for(var key in record.optionJsMap){
+                                eventMap[key] =  record.optionJsMap[key];
+                            }
+                        }
+                        if(record.field == 'id' && $webUtil.isNull(record.templet)){
+                            //浼佷笟缂栫爜鐨勯粯璁ゆ坊鍔犺秴閾炬帴
+                            record.templet = '<div><a name="code" href="javascript:;" dataIndex="{{d.LAY_INDEX}}" lay-event="VIEWDETAIL" data-oid="{{d.oid}}" data-template="{{d.codetemplateoid}}" style="text-decoration:underline;color:blue;" >{{d.id}}</a></div>';
+                        }
+                    }
+
+                    cols.push(componentVO.resembleTableVO.cols[i]);
+                }
+                table.render({
+                    elem: '#resemble_' + filter,
+                    id: "resemble_" + filter,
+                    data:[],
+                    limits: -1,
+                    selectMode: table.selectMode.muti,
+                    cols: cols,
+                    done: function (res, cur, total) {
+                        table.on('tool(resemble_' + filter + ')', function (obj) {
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+
+                            if (layEvent == 'VIEWDETAIL') {
+                                that.VIEWDETAIL(data.oid,data.codetemplateoid);
+                            } else {
+                                if (layEvent in eventMap) {
+                                    that.callEvent(eventMap[layEvent], data);
+                                }
+                            }
+                        });
+                    }
+                });
+            }else{
+                layui.element.tabDelete("tab_" + filter, "resemble");
+            }
+        };
+
+        this.callEvent = function (jsPath,data){
+            var that = this;
+            if(jsPath && data){
+                if($webUtil.startWith(jsPath.toLowerCase(),"usejs:")||$webUtil.startWith(jsPath.toLowerCase(),"js:")){
+                    //鏄墽琛宩s
+                    if($webUtil.startWith(jsPath.toLowerCase(),"usejs:")){
+                        jsPath = jsPath.substr(6);
+                    }else {
+                        jsPath = jsPath.substr(3);
+                    }
+                    layui.use(jsPath,function (){
+                        layui[jsPath].doEvent(data,that);
+                    });
+                }else if($webUtil.startWith(jsPath.toLowerCase(),"https://") || $webUtil.startWith(jsPath.toLowerCase(),"http://")){
+                    var tabId = (data.oid || jsPath) + "_link";
+                    portal.showTabByMenu(data.oid || jsPath,{
+                        id:data.oid || jsPath,
+                        text:'鏌ョ湅閾炬帴',
+                        url:jsPath
+                    });
+                }else if(that[jsPath]){
+                    that[jsPath](data);
+                }else{
+                    //鐩存帴鏄痡s鐨勬殏鏃惰繕涓嶆敮鎸�
+                }
+            }
+        };
+        this.VIEWDETAIL = function (oid,codetemplateoid,codeClassifyOid){
+            //琛ㄥ崟璇︽儏
+            var that = this;
+            if(!oid){
+                return false;
+            }
+            if(!codetemplateoid){
+                return false;
+            }
+            that.getFormDefine(codetemplateoid,codeClassifyOid,function (componentVO){
+                var formDefineVO= componentVO.formDefineVO;
+                if(formDefineVO){
+                    var filter=oid + "_detail_form";
+                    var form = layui.form;
+                    var colCount = that.getFormCol(formDefineVO);
+                    var items = that.getFormItemsByVO(formDefineVO,true,colCount,false);
+                    webUtil.dialog({
+                        title: '鏌ョ湅璇︾粏淇℃伅',
+                        fullScreen:true,
+                        content: '<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form " style="margin-top:5px" ></form>',
+                        resizing: function (layero) {
+                            form.doResize(filter);
+                        },
+                        success: function (layero) {
+                            form.addItems(filter, items,
+                                function () {
+                                    //鍙紶閫掍簡鏁版嵁鐨勪富閿紝鎵�浠ユ垜浠渶瑕佷粠鍚庡彴鑾峰彇涓�涓�
+                                    form.load(filter,{
+                                        backPath:that.backPath,
+                                        url:that.url.controller + that.url.getDataByOid,
+                                        method:'get',
+                                        params:{
+                                            oid:oid,
+                                            templateOid:codetemplateoid
+                                        }
+                                    });
+                                }, {}, {defaultColumnOneRow:colCount,labelWidth:150});
+                        }
+                    });
+                }
+            });
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/vciweb/mdm/MdmEngineInProcess.js b/Source/platformProject/platform2022UI/vciweb/mdm/MdmEngineInProcess.js
new file mode 100644
index 0000000..2ff0e81
--- /dev/null
+++ b/Source/platformProject/platform2022UI/vciweb/mdm/MdmEngineInProcess.js
@@ -0,0 +1,463 @@
+/**
+ * 涓绘暟鎹紩鎿庡湪娴佺▼涓樉绀虹殑鍐呭
+ * @author weidy
+ * @date 2022-2-23
+ */
+layui.define(['layer','element','form','table','dynamicCondition' ,'tree','mdm/MdmEngineForm'],function(exports){
+    var webUtil = $webUtil;
+    var Class = function() {
+        this.MODELNAME = "mdm/MdmEngineInProcess";
+        this.moduleKey = "MdmEngineInProcess";
+        this.id = "MdmEngineInProcess";
+        this.backPath = configData.compatibility ? path : configData.mdmService;
+        this.url = {
+            controller: 'mdmEngineController/',
+            tableUI: 'getUIInfoByClassifyOid',
+            formUI: 'getFormDefineByClassifyOid',
+            tableData: 'gridTableDataByClassifyOid',
+            getDataByOid: 'getDataByOid',
+            getPhaseByClassifyOid: 'listPhaseAttrByClassifyOid',
+            markpass:'markPass'
+        };
+        this.sourceData = {};
+        this.config={}
+        this.getContent = function () {
+            var that = this;
+            return '<div id="UIContent_' + that.id + '" style="overflow: auto;padding:0 5px"></div>';
+        };
+        this.showContent = function () {
+            var html = "";
+            var that = this;
+            html = [
+                '<div class="layui-layout easyui-layout UIContentLayout" id="easyuiLayout_', that.id, '" data-options="fit:true" style="display:block;overflow-y: hidden">',
+                    '<div data-options="region:\'west\',split:true" title="缂栫爜" style="width:210px;padding: 5px;">',
+                        '<div class="layui-vci-tree" style="overflow: auto">',
+                            '<ul layui-filter="tree_', that.id, '"><ul>',
+                        '</div>',
+                    '</div>',
+                    '<div data-options="region:\'center\'" title="缂栫爜璇︾粏淇℃伅" style="" id="border_', that.id, '">',
+                        '<div class="layui-center">',
+                            that.getToolbarHtml(),
+                            '<div class="easyui-layout"  id="easyuiLayoutCenter_', that.id, '" data-options="fit:true" style="display:block;overflow-y: hidden;">',
+                                '<div data-options="region:\'center\'" style="padding: 5px;border: 0;">',
+                                    '<form id="form_' + that.id + '" lay-filter="form_' + that.id + '" class="layui-form " style="margin-top:5px" ></form>',
+                                '</div>',
+                                '<div data-options="region:\'south\',split:true,collapsed:true" style="height:270px;padding-left: 5px;padding-right: 5px;border-left: 0;border-right: 0;border-bottom: 0;" id="border_center_', that.id, '">',
+                                    '<div class="layui-layout-border layui-tab" lay-filter="tab_',that.id ,'" style="display:block;margin:5px;">',
+                                        '<ul class="layui-tab-title tabTitle tab_center_', that.id, '" lay-allowClose="false">',
+                                            '<li class="layui-this" lay-id="resemble">鐩镐技椤规煡璇�</li>',
+                                        '</ul>',
+                                        '<ul class="layui-tab-content tabContent">',
+                                            '<li class="layui-tab-item layui-show"  lay-id="resemble">',
+                                                '<table id="resemble_', that.id , '" lay-filter="resemble_',that.id , '" style="overflow-x:auto;"></table>',
+                                            '</li>',
+                                        '</ul>',
+                                    '</div>',
+                                '</div>',
+                            '</div>'
+                            ,
+                        '</div>',
+                    '</div>',
+                '</div>',
+            ].join("");
+            $("#UIContent_" + that.id).html(html);
+        };
+        this.init = function () {
+            var that = this;
+            this.config[that.id] = {
+                id:that.id,
+                sourceData:that.sourceData
+            };
+            if(that.config[that.id].sourceData.maxHeight && that.config[that.id].sourceData.maxHeight<250){
+                that.config[that.id].sourceData.maxHeight=250
+            }else {
+                that.config[that.id].sourceData.maxHeight=$('#portal_body').height() - 102
+            }
+            var dateStore = that.sourceData['dataStore'];
+            that.config[that.id].codeClassifyOid = dateStore[0]['codeclsfid'];
+            webUtil.copyConfig(that, that.moduleKey);
+            if ($webUtil.isNull(that.config[that.id].codeClassifyOid)) {
+                $webUtil.showErrorMsg("鏁版嵁涓病鏈変富棰樺簱鍒嗙被涓婚敭");
+                return false;
+            }
+            that.MdmEngineForm = layui['mdm/MdmEngineForm'];
+            that.config[that.id].componentVO = null;
+            setTimeout(function () {
+                that.showContent();
+                var easyuiLayout = $('#easyuiLayout_' + that.id)
+                easyuiLayout.css({height:that.config[that.id].sourceData.maxHeight-10, width: $('#portal_body').width() - 360})
+                easyuiLayout.layout();
+                var easyuiLayoutCenter = $('#easyuiLayoutCenter_' + that.id)
+                easyuiLayoutCenter.css({
+                    height: $("#border_" + that.id).height() - 68,
+                    width: $("#border_" + that.id).width() - 20
+                })
+                easyuiLayoutCenter.layout();
+                that.showForm(that.id);
+                that.initTree(dateStore);
+            }, 1);
+        };
+        this.getToolbarHtml = function () {
+            var that = this;
+            return ['<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons" style="margin:0 5px">',
+                        that.sourceData.noEdit?'':('<button class="layui-btn layui-btn-sm" id="toolbar_'+that.id+'_SAVEDATA" style="display:none;"><i class="layui-icon layui-icon-star"></i>淇濆瓨</button>'),
+                        '<button class="layui-btn layui-btn-sm" id="toolbar_',that.id,'_resembleDATA" style="display:none;"><i class="layui-icon layui-icon-star"></i>鐩镐技椤规煡璇�</button>',
+                    '</div>'].join('');
+        };
+        this.refresh = function (configId){
+            var that= this;
+            that.setValueForForm(configId);
+        };
+        this.initTree = function (dateStore) {
+            var that = this;
+            var tree = layui.tree;
+            var scrollHeight = that.config[that.id].sourceData.maxHeight || (window.innerHeight-210);
+            var treeUL = $('[layui-filter="tree_' + that.id + '"]');
+            var treeHeight = scrollHeight-100;
+            treeUL.parent().height(treeHeight);
+            $webUtil.post("processDefineController/getVariableByKey", {
+                executionId: that.config[that.id].sourceData['executionid'],
+                keys: 'processUse'
+            }, function (result) {
+                if (result.success) {
+                    var processUse = result.obj['processUse'];
+                    webUtil.get('mdmEngineController/getFieldByProcessTemplate', {templateOid: dateStore[0].codetemplateoid,executionId:that.config[that.id].sourceData['executionid'],processUse:processUse}, function (result) {
+                        if (!result.success) {
+                            $webUtil.showErrorMsg(result.msg);
+                        } else {
+                            var treeData = [];
+                            layui.each(dateStore,function(_index,_item){
+                                var text=[]
+                                if(result.obj && result.obj.length>0){
+                                    for (var i=0;i<result.obj.length;i++){
+                                        var record = result.obj[i];
+                                        text.push(_item[record] || '');
+                                    }
+                                }else{
+                                    text.push(_item['name'] || ('绗�' + (_index + 1) + "琛屾暟鎹�"));
+                                }
+
+                                var tree = {
+                                    oid: _item.oid,
+                                    text: text.join(' '),
+                                    leaf: true,
+                                    attributes: _item
+                                }
+                                treeData.push(tree);
+                            });
+                            tree.init("tree_" + that.id, treeUL, {
+                                data: treeData,
+                                showSearch: true,
+                                configId:that.id,
+                                templet:function (d) {
+                                    if (d.attributes.passing === false || d.attributes.passing === 'false') {
+                                        return '<span style="color: red;">' + d.name + '</span>' + '<i class="layui-icon layui-icon-ok" style="margin-left:10px;font-size:14px;display: inline-block;padding: 0 5px 0 10px;color: red"></i> '
+                                    }if (d.attributes.passing === true || d.attributes.passing === 'true') {
+                                        return '<span style="color: green;">' + d.name + '</span>' + '<i class="layui-icon layui-icon-edit" style="margin-left:10px;font-size:14px;display: inline-block;padding: 0 5px 0 10px;color: green"></i> '
+                                    } else {
+                                        return d.name + '<i class="layui-icon layui-icon-edit" style="margin-left:10px;font-size:14px;display: inline-block;padding: 0 5px 0 10px;"></i>'
+                                    }
+                                },
+                                click: function (item, elem, options,event) {
+                                    that.config[options.configId].currentItemOid = item.oid;
+                                    that.config[options.configId].currentItemAttributes = item.attributes;
+                                    that.setValueForForm(options.configId);
+                                    if (event.target.className == 'layui-icon layui-icon-ok') {
+                                        that.setMarkPass(options.configId,item.oid,item.attributes.btmname,true)
+                                        return false;
+                                    }
+                                    if (event.target.className == 'layui-icon layui-icon-edit') {
+                                        that.setMarkPass(options.configId,item.oid,item.attributes.btmname,false)
+                                        return false;
+                                    }
+                                },
+                                done:function (filter,children,elem){
+                                    var currentelem=layui.tree.getElemByItem(filter, children[0].oid);
+                                    if(currentelem.length>0){
+                                        currentelem.children('a').trigger('click')
+                                    }
+                                }
+                            });
+                        }
+                    }, function (xhr, err) {
+                    }, that.backPath,true);
+                }else{
+                    var treeData = [];
+                    layui.each(dateStore,function (_index,_item){
+                        var tree = {
+                            oid: _item.oid,
+                            text: (_item.name || ('绗�' + (_index + 1) + "琛屾暟鎹�")),
+                            leaf: true,
+                            attributes: _item
+                        }
+                        treeData.push(tree);
+                    });
+                    tree.init("tree_" + that.id, treeUL, {
+                        data: treeData,
+                        showSearch: true,
+                        configId:that.id,
+                        templet:function (d) {
+                            if (d.attributes.passing === false || d.attributes.passing === 'false') {
+                                return '<span style="color: red;">' + d.name + '</span>' + '<i class="layui-icon layui-icon-ok" style="margin-left:10px;font-size:14px;display: inline-block;padding: 0 5px 0 10px;color: red"></i> '
+                            }if (d.attributes.passing === true || d.attributes.passing === 'true') {
+                                return '<span style="color: green;">' + d.name + '</span>' + '<i class="layui-icon layui-icon-edit" style="margin-left:10px;font-size:14px;display: inline-block;padding: 0 5px 0 10px;color: green"></i> '
+                            } else {
+                                return d.name + '<i class="layui-icon layui-icon-edit" style="margin-left:10px;font-size:14px;display: inline-block;padding: 0 5px 0 10px;"></i>'
+                            }
+                        },
+                        click: function (item, elem, options,event) {
+                            that.config[options.configId].currentItemOid = item.oid;
+                            that.config[options.configId].currentItemAttributes = item.attributes;
+                            that.setValueForForm(options.configId);
+                            if (event.target.className == 'layui-icon layui-icon-ok') {
+                                that.setMarkPass(options.configId,item.oid,item.attributes.btmname,true)
+                                return false;
+                            }
+                            if (event.target.className == 'layui-icon layui-icon-edit') {
+                                that.setMarkPass(options.configId,item.oid,item.attributes.btmname,false)
+                                return false;
+                            }
+                        },
+                        done:function (filter,children,elem){
+                            var currentelem=layui.tree.getElemByItem(filter, children[0].oid);
+                            if(currentelem.length>0){
+                                currentelem.children('a').trigger('click')
+                            }
+                        }
+                    });
+                }
+            },function (error,xhr){
+                $webUtil.showErrorMsg("鑾峰彇鍙紪杈戦」鍑洪敊")
+            },that.backPath,true);
+
+        };
+
+        this.setMarkPass = function (configId,oid,btmname,pass){
+            var that=this
+            webUtil.ajax('post', that.url.controller+that.url.markpass, {oid:oid,btmName:btmname,pass:pass}, function (result) {
+                if (result.success) {
+                    webUtil.showMsgFromResult(result, "鏍囪鎴愬姛");
+                    var options=layui.tree.getOptions("tree_" +configId)
+                    layui.each(options.data,function (i,item){
+                        if(item.oid==oid){
+                            options.data[i].attributes.passing=pass;
+                        }
+                    })
+                    layui.tree.setOptions("tree_" +configId,options)
+                    layui.tree.reload("tree_" +configId,options)
+                } else {
+                    webUtil.showErrorMsg(result.msg);
+                }
+            }, function (xhr, err) {
+                webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+            }, that.backPath);
+        }
+        this.setValueForForm = function (configId) {
+            var that = this;
+            //鍙紶閫掍簡鏁版嵁鐨勪富閿紝鎵�浠ユ垜浠渶瑕佷粠鍚庡彴鑾峰彇涓�涓�
+            var filter = "form_" + that.config[configId].id;
+            //鍏堜粠
+            var lables = $("#form_" + that.config[configId].id + " label");
+            if(lables && lables.length>0){
+                layui.each(lables,function (_index,_item){
+                    var itemEL = $(_item);
+                    if(itemEL.attr("class").indexOf("label-name-" + filter + "-")>-1) {
+                        itemEL.css("color", "#000");
+                    }
+                });
+            }
+
+            if(that.config[configId].currentItemOid && that.config[configId].componentVO) {
+                $webUtil.get(that.url.controller + that.url.getDataByOid, {
+                    oid: that.config[configId].currentItemOid,
+                    templateOid: that.config[configId].componentVO.templateVO.oid
+                }, function (result) {
+                    if (result.success) {
+                        layui.form.setValues(result.obj, filter);
+                        if (result.data && result.data.length > 0) {
+                            var difFields = result.data[0];
+                            if (difFields) {
+                                for (var key in difFields) {
+                                    var nameEl = $("#form_" + that.config[configId].id + " .label-name-" + filter + "-" + key);
+                                    if (nameEl) {
+                                        nameEl.css("color", "red");
+                                    }
+                                }
+                            }
+                        }
+                    } else {
+                        $webUtil.showErrorMsg(result.msg);
+                    }
+                }, function (err, xhr) {
+                    $webUtil.showErrorMsg("鑾峰彇鏁版嵁鍑洪敊浜嗭紝璇风◢鍚庡啀璇�");
+                }, that.backPath);
+            }
+        };
+
+        this.showForm = function (configId) {
+            //鎴戜滑闇�瑕佸厛鑾峰彇鍙橀噺閲岃褰曠殑闃舵鏄粈涔�
+            var that = this;
+            //绉婚櫎浠ュ墠鐨勫唴瀹�
+            $("#form_" + that.config[configId].id).html('');
+            $webUtil.post("processDefineController/getVariableByKey", {
+                executionId: that.config[configId].sourceData['executionid'],
+                keys: 'phase,processUse'
+            }, function (result) {
+                if (result.success) {
+                    var phase = result.obj['phase'];
+                    //鏍规嵁闃舵鑾峰彇鏈鍙互缂栬緫鐨勫瓧娈�
+                    $webUtil.get(that.url.controller + that.url.getPhaseByClassifyOid, {
+                        codeClassifyOid: that.config[configId].codeClassifyOid,
+                        phase: phase
+                    }, function (pharseResult) {
+                        that.getFormDefine(configId,function (componentVO) {
+                            that.config[configId].componentVO = componentVO;
+                            var formDefineVO = componentVO.formDefineVO;
+                            if (formDefineVO) {
+                                var filter = "form_" + that.config[configId].id;
+                                var form = layui.form;
+                                var colCount = that.MdmEngineForm.getFormCol(formDefineVO,{width:$('#border_'+that.config[configId].id).width()});
+                                var items = that.getFormItemsByVO(formDefineVO, pharseResult.obj,phase,colCount);
+
+                                form.addItems(filter, items,
+                                    function () {
+                                        that.setValueForForm(configId);
+                                        if((pharseResult.obj && pharseResult.obj.length>0) || phase == 'all'){
+                                            var saveBtn = $("#toolbar_" + that.config[configId].id +"_SAVEDATA");
+                                            saveBtn.show();
+                                            saveBtn.unbind('click').click(function (){
+                                                //鎵ц淇濆瓨
+                                                that.saveData(configId);
+                                            });
+                                        }
+
+                                        var hasResemble =  (componentVO.resembleTableVO && componentVO.resembleTableVO.cols && componentVO.resembleTableVO.cols.length > 0);
+                                        if(!hasResemble){
+                                            $('#easyuiLayoutCenter_' + that.config[configId].id).layout('remove','south');
+                                            return;
+                                        }else {
+                                            $('#easyuiLayoutCenter_' + that.config[configId].id).layout('expand','south');
+                                            that.MdmEngineForm.initResembleTable(componentVO, that.config[configId].id);
+                                            var resembleBtn = $("#toolbar_" + that.config[configId].id + "_resembleDATA");
+                                            resembleBtn.show();
+                                            resembleBtn.unbind('click').click(function () {
+                                                if (form.validata(filter)) {
+                                                    webUtil.get('mdmEngineController/getCodeRuleByClassifyOid', {codeClassifyOid: that.config[configId].codeClassifyOid}, function (result) {
+                                                        if (!result.success) {
+                                                            $webUtil.showErrorMsg(result.msg);
+                                                        } else {
+                                                            var values = form.getDefaultValues(filter, true);
+                                                            that.config[configId].codeRuleOid = result.obj.oid;
+                                                            var datas = {
+                                                                codeClassifyOid: that.config[configId].codeClassifyOid,
+                                                                templateOid: componentVO.templateVO.oid,
+                                                                codeRuleOid: result.obj.oid,
+                                                                data: values.otherValue
+                                                            }
+                                                            $.extend(datas, values.defaultValues);
+                                                            webUtil.manualAjax('post', 'mdmEngineController/resembleQuery', JSON.stringify(datas), function (res) {
+                                                                if (res.success) {
+                                                                    layui.table.reload("resemble_" + that.config[configId].id, {
+                                                                        data: res.data
+                                                                    });
+                                                                } else {
+                                                                    webUtil.showErrorMsg(res.msg);
+                                                                }
+                                                            }, function (xhr, err) {
+                                                                webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                                                            }, that.backPath);
+                                                        }
+                                                    });
+                                                }
+                                            });
+                                        }
+                                    }, {}, {defaultColumnOneRow: colCount, labelWidth: 160,useLabelFlag:true});
+                            }
+                        });
+                    }, function (error, xhr) {
+                        $webUtil.showErrorMsg("涓绘暟鎹湇鍔″彲鑳芥病鏈夊惎鍔�")
+                    }, that.backPath,true);
+                } else {
+                    $webUtil.showErrorMsg(result.msg);
+                }
+            }, function (error, xhr) {
+                $webUtil.showErrorMsg("娴佺▼鐨勬湇鍔″彲鑳芥病鏈夊惎鍔�");
+            }, configData.compatibility ? path : configData.processServicePath,true)
+        };
+        this.saveData = function (configId){
+            var that = this;
+            if(!that.config[configId].currentItemOid){
+                $webUtil.showErrorMsg("璇烽�夋嫨缂栫爜");
+                return false;
+            }
+            var form = layui.form;
+            var filter = "form_" + that.config[configId].id;
+            if (form.validata(filter)) {
+                var values = form.getDefaultValues(filter, true);
+                var datas = {
+                    codeClassifyOid:that.config[configId].codeClassifyOid,
+                    templateOid:that.config[configId].componentVO.templateVO.oid,
+                    editInProcess:true,
+                    oid:that.config[configId].currentItemOid,
+                    data: values.otherValue
+                }
+                $.extend(datas, values.defaultValues);
+                webUtil.manualAjax('put', that.url.controller+'editSaveCode', JSON.stringify(datas), function (result) {
+                    if (result.success) {
+                        webUtil.showMsgFromResult(result, "淇敼鎴愬姛");
+                        that.refresh(configId)
+                    } else {
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                }, function (xhr, err) {
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                }, that.backPath);
+            }
+        };
+        this.getFormDefine = function (configId,callback) {
+            var that = this;
+            webUtil.get(that.url.controller + that.url.formUI, {codeClassifyOid: that.config[configId].codeClassifyOid}, function (result) {
+                if (!result.success) {
+                    $webUtil.showErrorMsg(result.msg);
+                } else {
+                    if (callback) {
+                        callback(result.obj);
+                    }
+                }
+            }, function (xhr, err) {
+                webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+            }, that.backPath,true);
+        };
+        this.getFormItemsByVO = function (formDefineVO, showFields,phase,colCount) {
+            layui.each(formDefineVO.items, function (_index, _item) {
+                //鍥犱负琛ㄥ崟涓婄殑瀛楁涓婂凡缁忚缃簡readOnly锛屽湪榛樿涓婅缃殑readOnly涓嶄細鐢熸晥锛屾垜浠渶瑕佽嚜琛岃浆鎹竴涓�
+                if (_item.field == 'id' || _item.field == 'lcstatus' ) {
+                    _item.readOnly = true;
+                } else {
+                    if(showFields && showFields.length>0) {
+                        var finded = false;
+                        layui.each(showFields, function (fieldIndex, field) {
+                            if (_item.field == field) {
+                                finded = true;
+                                return true;
+                            }
+                        });
+                        _item.readOnly = !finded;
+                    }else{
+                        if(phase!='all'){
+                            _item.readOnly = true;
+                        }
+                    }
+                }
+                _item.inputWidth = 250;
+                if(_item.type=="textarea"){
+                    _item.useAllWidth=true;
+                    _item.inputWidth = 415 * colCount - 160;
+                }
+            });
+            return formDefineVO.items;
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/vciweb/mdm/SysIntAuthority.js b/Source/platformProject/platform2022UI/vciweb/mdm/SysIntAuthority.js
new file mode 100644
index 0000000..2a5be05
--- /dev/null
+++ b/Source/platformProject/platform2022UI/vciweb/mdm/SysIntAuthority.js
@@ -0,0 +1,344 @@
+/**
+ * 绯荤粺闆嗘垚鎺ュ彛鐨勮璇侀〉闈�
+ * @author lihang
+ * @date 2022-03-07
+ */
+layui.define(['layer', 'element', 'form', 'table', 'dynamicCondition'], function (exports) {
+    var webUtil = $webUtil;
+    var Class = function () {
+        this.MODELNAME = "mdm/SysIntAuthority";
+        this.moduleKey = "SysIntAuthority";
+        this.backPath = configData.compatibility ? path : configData.mdmService;
+        this.url = {
+            controller: 'sysIntAuthority/',
+            dataGrid: 'gridSysIntAuthority',
+            addSave: 'addSave',
+            editSave: 'editSave',
+            deleteUrl: 'deleteData',
+            getObjectByOid: 'getObjectByOid'
+        };
+        this.getContent = function () {
+            var that = this;
+            return '<div id="UIContent_' + that.id + '" style="overflow: auto;padding:0 5px"></div>';
+        };
+        this.showContent = function () {
+            var that = this;
+            var html = "";
+            html = [
+                '<div class="layui-layout easyui-layout UIContentLayout"  id="easyuiLayout_', that.id, '" data-options="fit:true" style="display:block;overflow-y: hidden;margin:0 5px">',
+                '<div data-options="region:\'center\'" style="padding-left: 10px;padding-right: 10px;" id="border_', that.id, '">',
+                '<div class="layui-center" style="overflow-y:auto;">',
+                that.getToolbarHtml(),
+                '<table id="table_', that.id, '" lay-filter="', that.id, '" style="overflow-x:auto;"></table>',
+                '</div>',
+                '</div>',
+                '</div>'
+            ].join("");
+            $("#UIContent_" + that.id).html(html);
+        };
+        this.getToolbarHtml = function () {
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_', that.id, '" class="layui-btn-container layui-buttons">',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_', that.id, '_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_', that.id, '_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_', that.id, '_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_', that.id, '_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_', that.id, '_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.createSearchHtml({
+                id: "缂栧彿",
+                name: "鍚嶇О"
+            }, $("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+        };
+        this.init = function () {
+            var that = this;
+            webUtil.copyConfig(that, that.moduleKey);
+            //闇�瑕佸姞鍦ㄥ畾鏃朵腑锛屽惁鍒欐牱寮忎笉鑳芥纭睍绀猴紝涓嶇煡閬撳師鍥� wangting
+            setTimeout(function () {
+                that.showContent();
+                var easyuiLayout = $('#easyuiLayout_' + that.id)
+                easyuiLayout.css({height: $('#portal_body').height() - 43, width: $('#portal_body').width() - 15})
+                easyuiLayout.layout();
+
+                that.initMainTable();
+                that.createSearchHtml();
+
+            }, 1)
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var tableWidth = $("#border_" + that.id).width();
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath: that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                width: tableWidth,
+                selectMode: table.selectMode.muti,
+                cols: [that.columns],
+                method: 'get',
+                done: function (res, cur, total) {
+                    if (!that.fristMainLoad) {
+                        table.on('tool(' + that.id + ')', function (obj) {
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if (layEvent == 'EDIT') {
+                                that.addOrEdit(false, data);
+                            }
+                        });
+                    } else {
+                        if (total > 0) {
+                            table.selectRecord('table_' + that.id, {index: 0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                }
+            };
+            if (parentFieldName) {
+                options.treeConfig = {
+                    treepid: parentFieldName,
+                    treeid: 'id',
+                    showField: 'name'
+                };
+            }
+            table.render(options);
+        };
+        this.checkColumns = function () {
+            var that = this;
+            var table = layui.table;
+            if (that.columns == null || that.columns.length == 0) {
+                that.columns = [table.getIndexColumn(), table.getCheckColumn(),
+                    {
+                        title: '楠岃瘉浠ょ墝',
+                        field: 'token',
+                        sort: true,
+                        width: 150
+                    },
+                    {
+                        title: '璁よ瘉鏂瑰紡',
+                        field: 'typeText',
+                        sort: true,
+                        sortField: 'type',
+                        type: 'combox',
+                        comboxKey: "sysIntegrationAuthorityType",
+                        width: 150
+                    },
+                    {
+                        title: '楠岃瘉鐢ㄦ埛',
+                        field: 'useraccount',
+                        sort: true,
+                        width: 150
+                    },
+                    {
+                        title: '楠岃瘉瀵嗙爜',
+                        field: 'usercode',
+                        sort: true,
+                        width: 150
+                    },
+                    {
+                        field: 'options',
+                        title: '鎿嶄綔',
+                        width: 150,
+                        templet: function (d) {
+                            return '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>';
+                        }
+                    }];
+            }
+        };
+
+        this.getFormItems = function (onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [
+                {
+                    field: 'type',
+                    title: '璁よ瘉鏂瑰紡',
+                    required: true,
+                    type: 'combox',
+                    comboxKey: 'sysIntegrationAuthorityType',
+                    defaultValue: "",
+                    readOnly: onlyShow
+                }
+            ];
+        };
+        this.getFormItemsOnCondition = function (type, onlyShow, isHidden) {
+            var that = this;
+            if (type == 'login') {
+                return [
+                    {
+                        field: 'useraccount',
+                        title: '楠岃瘉鐢ㄦ埛',
+                        type: 'text',
+                        defaultValue: "",
+                        required: true,
+                        readOnly: onlyShow
+                    }, {
+                        field: 'usercode',
+                        title: '楠岃瘉瀵嗙爜',
+                        type: 'text',
+                        defaultValue: "",
+                        required: true,
+                        readOnly: onlyShow
+                    }
+                ]
+            } else if (type == 'token') {
+                return [
+                    {
+                        field: 'token',
+                        title: '楠岃瘉浠ょ墝',
+                        type: 'text',
+                        defaultValue: "",
+                        required: true,
+                        readOnly: onlyShow
+                    }
+                ]
+            }
+        }
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function () {
+            var that = this;
+            var data = layui.table.checkStatus("table_" + that.id).data;
+            if (data.length != 1){
+                webUtil.showErrorMsg('璇烽�夋嫨涓�鏉℃暟鎹�');
+                return false;
+            }
+            that.addOrEdit(false, data[0]);
+        };
+        this.addOrEdit = function (add, authData) {
+            var that = this;
+            var form = layui.form;
+            var filter = "form_" + that.id;
+            console.log(authData);
+            var addSaveIndex = webUtil.dialog({
+                title: add ? '娣诲姞绯荤粺闆嗘垚鎺ュ彛鐨勮璇�' : '淇敼绯荤粺闆嗘垚鎺ュ彛鐨勮璇�',
+                btn: ['淇濆瓨', '鍙栨秷'],
+                content: '<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>' +
+                    '<form id="sec_' + filter + '" lay-filter="sec_' + filter + '" class="layui-form" style="margin:10px 25px 40px -2px;display: inline-block;float:right"></form>',
+                resizing: function (layero) {
+                    form.doResize(filter);
+                },
+                success: function (layero, layerIndex, classP) {
+                    form.addItems(filter, that.getFormItems(false),
+                        function () {
+                            if (!add) {
+                                form.setValues(authData);
+                            } else {
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues, filter);
+                            }
+
+                            that.sectype = 'login';
+                            var hidden = true;
+                            if (!add){
+                                that.sectype = authData.type;
+                            }
+                            form.addItems("sec_" + filter,that.getFormItemsOnCondition(that.sectype,false,hidden),function (){
+                                if (!add){
+                                    form.setValues(authData,"sec_" + filter);
+                                }else{
+                                    var defaultValues = {};
+                                    form.setValues(defaultValues,"sec_"+ filter);
+                                }
+                            },{},{defaultColumnOneRow: 1});
+
+
+                            form.on('select(type)',function (data){
+                                var sectype = data.value;
+                                var isHidden = true;
+                                form.removeItems("sec_" + filter ,[],true);
+                                form.addItems("sec_" + filter,that.getFormItemsOnCondition(sectype,false,isHidden),function (){
+                                    form.setValues(data,"sec_" + filter);
+                                },{},{lableWidth:150});
+                            })
+                        }, {}, {defaultColumnOneRow: 1});
+                },
+                yes: function (layero) {
+                    if (form.validata(filter)) {
+                        var values = form.getValues(filter, true);
+                        var secvalues = form.getValues("sec_" + filter,true);
+                        var newvalues = $.extend({},values,secvalues);
+                        var url = that.url.controller + (add ? that.url.addSave : that.url.editSave);
+                        webUtil.manualAjax(add ? 'post' : 'put', url, JSON.stringify(newvalues), function (result) {
+                            if (result.success) {
+                                webUtil.showMsgFromResult(result, (add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            } else {
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        }, function (xhr, err) {
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        }, that.backPath);
+                    }
+                },
+                btn2: function (layero) {
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function () {
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id, true, true);
+            if (!oid) {
+                return false;
+            }
+            var ts = webUtil.getOidFromGrid("table_" + that.id, false, false, "ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!", function () {
+                webUtil.deleteRequest(that.url.controller + that.url.deleteUrl, {oid: oid, ts: ts}, function (result) {
+                    if (result.success) {
+                        webUtil.showMsgFromResult(result, "鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    } else {
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                }, function (xhr, err) {
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                }, that.backPath);
+            });
+        };
+        this.refresh = function () {
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+        this.ADVQUERY = function () {
+            var that = this;
+            if (!that.serinorQueryInstance) {
+                var dynamicCondition = layui.dynamicCondition;
+                $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar' + that.id + '" class="layui-inline"></div>');
+                that.checkColumns();
+                var dataFields = [];
+                for (var i = 0; i < that.columns.length; i++) {
+                    dataFields[i] = that.columns[i];
+                }
+                that.serinorQueryInstance = dynamicCondition.create({
+                    fields: dataFields//鏌ヨ瀛楁
+                    , tableId: "table_" + that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                    , type: "complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                    , queryCallBack: function (requestData) {//鏌ヨ涔嬪悗鐨刢allback
+
+                    }
+                });
+            }
+            that.serinorQueryInstance.open();
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME, cs);
+});
diff --git a/Source/platformProject/platform2022UI/vciweb/mdm/SysIntBase.js b/Source/platformProject/platform2022UI/vciweb/mdm/SysIntBase.js
new file mode 100644
index 0000000..e3b6046
--- /dev/null
+++ b/Source/platformProject/platform2022UI/vciweb/mdm/SysIntBase.js
@@ -0,0 +1,281 @@
+/**
+ * 绯荤粺闆嗘垚鐨勭郴缁熶俊鎭〉闈�
+ * @author lihang
+ * @date 2022-03-08
+ */
+layui.define(['layer','element','form','table','dynamicCondition' ],function(exports){
+        var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "mdm/SysIntBase";
+        this.moduleKey = "SysIntBase";
+        this.backPath =  configData.compatibility? path:configData.mdmService;
+        this.url = {
+            controller:'sysIntBase/',
+            dataGrid:'gridSysIntBase',
+            addSave:'addSave',
+            editSave:'editSave',
+            deleteUrl:'deleteData',
+            getObjectByOid:'getObjectByOid'
+        };
+        this.getContent=function(){
+            var that = this;
+            return '<div id="UIContent_' + that.id + '" style="overflow: auto;padding:0 5px"></div>';
+        };
+        this.showContent=function (){
+            var that = this;
+            var html = "";
+            html = [
+                        '<div class="layui-layout easyui-layout UIContentLayout"  id="easyuiLayout_',that.id,'" data-options="fit:true" style="display:block;overflow-y: hidden;margin:0 5px">',
+                            '<div data-options="region:\'center\'" style="padding-left: 10px;padding-right: 10px;" id="border_',that.id,'">',
+                                '<div class="layui-center" style="overflow-y:auto;">',
+                                    that.getToolbarHtml(),
+                                    '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                                '</div>',
+                            '</div>',
+                        '</div>'
+            ].join("");
+            $("#UIContent_"+that.id).html(html);
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.createSearchHtml({id:"缂栧彿",name:"鍚嶇О"} ,$("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+        };
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            setTimeout(function (){
+                that.showContent();
+                var easyuiLayout= $('#easyuiLayout_'+that.id)
+                easyuiLayout.css({height:$('#portal_body').height()-43,width:$('#portal_body').width()-15})
+                easyuiLayout.layout();
+
+                that.initMainTable();
+                that.createSearchHtml();
+
+            },1)
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                method:'get',
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'EDIT'){
+                                that.addOrEdit(false,data.oid);
+                            }
+                        });
+                    }else{
+                        if(total>0) {
+                            table.selectRecord('table_' + that.id, {index:0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                }
+            };
+            if(parentFieldName){
+                options.treeConfig = {
+                    treepid:parentFieldName,
+                    treeid:'id',
+                    showField:'name'
+                };
+            }
+            table.render(options);
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),
+                    {
+                        title: '绯荤粺缂栧彿',
+                        field: 'id',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '绯荤粺鍚嶇О',
+                        field: 'name',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '绯荤粺鎻忚堪',
+                        field: 'description',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        field:'options',
+                        title:'鎿嶄綔',
+                        width:150,
+                        templet:function(d){
+                            return '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>';
+                        }
+                    }];
+            }
+        };
+
+        this.getFormItems = function(onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [
+                {
+                    field: 'id',
+                    title: '绯荤粺缂栧彿',
+                    required: true
+                },
+                {
+                    field: 'name',
+                    title: '绯荤粺鍚嶇О',
+                    required: true
+                },
+                {
+                    field: 'description',
+                    title: '绯荤粺鎻忚堪',
+                    type: 'textarea',
+                    inputWidth: 475
+                }
+            ];
+        };
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            that.addOrEdit(false,oid);
+        };
+        this.addOrEdit = function(add,oid) {
+            var that = this;
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var addSaveIndex =webUtil.dialog({
+                title:add?'娣诲姞绯荤粺闆嗘垚鐨勭郴缁熶俊鎭�':'淇敼绯荤粺闆嗘垚鐨勭郴缁熶俊鎭�',
+                btn:['淇濆瓨','鍙栨秷'],
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero,layerIndex,classP) {
+                    form.addItems(filter,that.getFormItems(false),
+                        function () {
+                            if(!add){
+                                var defaultValues = {};
+                                form.setValues(defaultValues,filter);
+                            }else{
+                                form.load(filter,{
+                                    backPath: that.backPath,
+                                    url: that.url.controller + that.url.getObjectByOid,
+                                    method: 'get',
+                                    params: {
+                                        oid: oid
+                                    }
+                                })
+                               webUtil.relocationOpen(classP)
+                            }
+                        }, {}, {defaultColumnOneRow: 1});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        var url = that.url.controller + (add?that.url.addSave:that.url.editSave);
+                        webUtil.manualAjax(add?'post':'put',url,JSON.stringify(values),function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts= webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+        this.refresh = function () {
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+        this.ADVQUERY = function () {
+            var that = this;
+            if(!that.serinorQueryInstance) {
+                var dynamicCondition = layui.dynamicCondition;
+                $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar' + that.id + '" class="layui-inline"></div>');
+                that.checkColumns();
+                var dataFields = [];
+                for(var i = 0 ; i < that.columns.length ; i ++){
+                    dataFields[i] = that.columns[i];
+                }
+                that.serinorQueryInstance = dynamicCondition.create({
+                    fields: dataFields//鏌ヨ瀛楁
+                    , tableId: "table_" + that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                    , type: "complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                    , queryCallBack: function (requestData) {//鏌ヨ涔嬪悗鐨刢allback
+
+                    }
+                });
+            }
+            that.serinorQueryInstance.open();
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/vciweb/mdm/SysIntInfo.js b/Source/platformProject/platform2022UI/vciweb/mdm/SysIntInfo.js
new file mode 100644
index 0000000..5b1d88d
--- /dev/null
+++ b/Source/platformProject/platform2022UI/vciweb/mdm/SysIntInfo.js
@@ -0,0 +1,524 @@
+/**
+ * 绯荤粺闆嗘垚鍩虹淇℃伅椤甸潰
+ * @author lihang
+ * @date 2022-03-07
+ */
+layui.define(['layer', 'element', 'form', 'table', 'dynamicCondition'], function (exports) {
+    var webUtil = $webUtil;
+    var Class = function () {
+        this.MODELNAME = "mdm/SysIntInfo";
+        this.moduleKey = "SysIntInfo";
+        this.backPath = configData.compatibility ? path : configData.mdmService;
+        this.url = {
+            controller: 'sysIntInfo/',
+            dataGrid: 'gridSysIntInfo',
+            addSave: 'addSave',
+            editSave: 'editSave',
+            deleteUrl: 'deleteData',
+            getObjectByOid: 'getObjectByOid',
+            authorityController: 'sysIntAuthority/',
+            authorityDataGrid: 'gridSysIntAuthority'
+        };
+        this.getContent = function () {
+            var that = this;
+            return '<div id="UIContent_' + that.id + '" style="overflow: auto;padding:0 5px"></div>';
+        };
+        this.showContent = function () {
+            var that = this;
+            var html = "";
+            html = [
+                '<div class="layui-layout easyui-layout UIContentLayout"  id="easyuiLayout_', that.id, '" data-options="fit:true" style="display:block;overflow-y: hidden;margin:0 5px">',
+                '<div data-options="region:\'center\'" style="padding-left: 10px;padding-right: 10px;" id="border_', that.id, '">',
+                '<div class="layui-center" style="overflow-y:auto;">',
+                that.getToolbarHtml(),
+                '<table id="table_', that.id, '" lay-filter="', that.id, '" style="overflow-x:auto;"></table>',
+                '</div>',
+                '</div>',
+                '</div>'
+            ].join("");
+            $("#UIContent_" + that.id).html(html);
+        };
+        this.getToolbarHtml = function () {
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_', that.id, '" class="layui-btn-container layui-buttons">',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_', that.id, '_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_', that.id, '_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_', that.id, '_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_', that.id, '_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_', that.id, '_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.createSearchHtml({
+                id: "缂栧彿",
+                name: "鍚嶇О"
+            }, $("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+        };
+        this.init = function () {
+            var that = this;
+            webUtil.copyConfig(that, that.moduleKey);
+            //闇�瑕佸姞鍦ㄥ畾鏃朵腑锛屽惁鍒欐牱寮忎笉鑳芥纭睍绀猴紝涓嶇煡閬撳師鍥� wangting
+            setTimeout(function () {
+                that.showContent();
+                var easyuiLayout = $('#easyuiLayout_' + that.id)
+                easyuiLayout.css({height: $('#portal_body').height() - 43, width: $('#portal_body').width() - 15})
+                easyuiLayout.layout();
+
+                that.initMainTable();
+                that.createSearchHtml();
+
+            }, 1)
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            //var tableWidth = $("#border_" + that.id).width();
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath: that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                //width: tableWidth,
+                selectMode: table.selectMode.muti,
+                cols: [that.columns],
+                method: 'get',
+                done: function (res, cur, total) {
+                    if (!that.fristMainLoad) {
+                        table.on('tool(' + that.id + ')', function (obj) {
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if (layEvent == 'EDIT') {
+                                that.addOrEdit(false, data);
+                            }
+                        });
+                    } else {
+                        if (total > 0) {
+                            table.selectRecord('table_' + that.id, {index: 0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                }
+            };
+            if (parentFieldName) {
+                options.treeConfig = {
+                    treepid: parentFieldName,
+                    treeid: 'id',
+                    showField: 'name'
+                };
+            }
+            table.render(options);
+        };
+        this.checkColumns = function () {
+            var that = this;
+            var table = layui.table;
+            if (that.columns == null || that.columns.length == 0) {
+                that.columns = [table.getIndexColumn(), table.getCheckColumn(),
+                    {
+                        title: '鏉ユ簮绯荤粺鍚嶇О',
+                        field: 'sourceSysName',
+                        sort: true,
+                        width: 150
+                    },
+                    {
+                        title: '鏉ユ簮绯荤粺鏍囪瘑',
+                        field: 'sourceSysId',
+                        sort: true,
+                        width: 150
+                    },
+                    {
+                        title: '鐩爣绯荤粺鍚嶇О',
+                        field: 'targetSysName',
+                        sort: true,
+                        width: 150
+                    }, {
+                        title: '鐩爣绯荤粺鏍囪瘑',
+                        field: 'targetSysId',
+                        sort: true,
+                        width: 150
+                    },
+                    {
+                        title: '鎺ュ彛绫诲瀷',
+                        field: 'interfacetypeText',
+                        sort: true,
+                        sortField: 'interfacetype',
+                        type: 'combox',
+                        comboxKey: "sysIntegrationRequestType",
+                        width: 150
+                    },
+                    {
+                        title: '鎺ュ彛鍑芥暟',
+                        field: 'interfaceFunction',
+                        sort: true,
+                        width: 150
+                    },
+                    {
+                        title: '璇锋眰鍦板潃',
+                        field: 'requesturl',
+                        sort: true,
+                        width: 150
+                    },
+                    {
+                        title: '璇锋眰鏂瑰紡',
+                        field: 'requestmethodText',
+                        sort: true,
+                        sortField: 'requestmethod',
+                        type: 'combox',
+                        comboxKey: "sysIntegrationRequestMethodType",
+                        width: 150
+                    },
+                    {
+                        title: '鍙傛暟绫诲瀷',
+                        field: 'paramtypeText',
+                        sort: true,
+                        sortField: 'paramtype',
+                        type: 'combox',
+                        comboxKey: "sysIntegrationParamAndReturnType",
+                        width: 150
+                    },
+                    {
+                        title: '杩斿洖鍊肩被鍨�',
+                        field: 'returntypeText',
+                        sort: true,
+                        sortField: 'returntype',
+                        type: 'combox',
+                        comboxKey: "sysIntegrationParamAndReturnType",
+                        width: 150
+                    },
+                    {
+                        title: '璁よ瘉鏂瑰紡',
+                        field: 'authorityTypeText',
+                        sort: true,
+                        sortField: 'authorityType',
+                        width: 150
+                    },{
+                        title: '鏁版嵁娴佸悜鏂瑰紡',
+                        field: 'dataFlowTypeText',
+                        sort: true,
+                        sortField: 'dataFlowType',
+                        width: 90
+                    },
+                    {
+                        field: 'options',
+                        title: '鎿嶄綔',
+                        width: 150,
+                        templet: function (d) {
+                            return '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>';
+                        }
+                    }];
+            }
+        };
+
+        this.getFormItems = function (onlyShow) {
+            var that = this;
+            var filter = this.filter;
+            var table = layui.table;
+            return [
+                {
+                    field: 'authorityoid',
+                    title: '璁よ瘉鏂瑰紡',
+                    required: true,
+                    type: 'refer',
+                    showField: 'authorityType',
+                    referConfig: {
+                        type: 'grid',
+                        width: 680,
+                        isMuti: false,
+                        tableConfig: {
+                            page: {
+                                limit: 15,
+                                page: 1
+                            },
+                            cols: [layui.table.getIndexColumn(), layui.table.getCheckColumn(),
+                                {
+                                    field: 'typeText',
+                                    title: '璁よ瘉鏂瑰紡',
+                                    sort: true,
+                                    width: 150
+                                }, {
+                                    field: 'useraccount',
+                                    title: '楠岃瘉鐢ㄦ埛',
+                                    sort: true,
+                                    width: 150
+                                }, {
+                                    field: 'usercode',
+                                    title: '楠岃瘉瀵嗙爜',
+                                    width: 250
+                                }, {
+                                    field: 'token',
+                                    title: '浠ょ墝',
+                                    width: 250
+                                }],
+                            queryColumns: [
+                                {
+                                    field: 'useraccount',
+                                    title: '楠岃瘉鐢ㄦ埛'
+                                }, {
+                                    field: 'token',
+                                    title: '浠ょ墝'
+                                }
+                            ]
+                        },
+                        backPath: that.backPath,
+                        url: 'sysIntAuthority/gridSysIntAuthority',
+                        textField: 'typeText',
+                        valueFiled: 'oid'
+                    },
+                    defaultValue: "",
+                    readOnly: onlyShow
+                }, {
+                    field: 'interfacetype',
+                    title: '鎺ュ彛绫诲瀷',
+                    type: 'combox',
+                    comboxKey: 'sysIntegrationRequestType',
+                    defaultValue: "",
+                    readOnly: onlyShow
+                }, {
+                    field: 'paramtype',
+                    title: '鍙傛暟绫诲瀷',
+                    required: true,
+                    type: 'combox',
+                    comboxKey: 'sysIntegrationParamAndReturnType',
+                    defaultValue: "",
+                    readOnly: onlyShow
+                }, {
+                    field: 'returntype',
+                    title: '杩斿洖鍊肩被鍨�',
+                    required: true,
+                    type: 'combox',
+                    comboxKey: 'sysIntegrationParamAndReturnType',
+                    defaultValue: "",
+                    readOnly: onlyShow
+                }, {
+                    field: 'sourcesystemoid',
+                    title: '鏉ユ簮绯荤粺',
+                    required: true,
+                    type: 'refer',
+                    showField: 'sourceSysName',
+                    referConfig: {
+                        type: 'default',
+                        referBo: 'sysintbase',
+                        textField: 'name',
+                        valueFiled: 'oid'
+                    },
+                    defaultValue: "",
+                    readOnly: onlyShow
+                }, {
+                    field: 'targetsystemoid',
+                    title: '鐩爣绯荤粺',
+                    required: true,
+                    type: 'refer',
+                    showField: 'targetSysName',
+                    referConfig: {
+                        type: 'default',
+                        referBo: 'sysintbase',
+                        textField: 'name',
+                        valueFiled: 'oid'
+                    },
+                    defaultValue: "",
+                    readOnly: onlyShow
+                },{
+                    field: 'dataFlowTypeText',
+                    title: '鏁版嵁娴佸悜鏂瑰紡',
+                    type: 'combox',
+                    comboxKey: 'sysIntegrationDataFlowType',
+                    defaultValue: "",
+                    readOnly: onlyShow
+                },
+                {
+                    field: 'description',
+                    title: '绯荤粺鎻忚堪',
+                    type: 'textarea',
+                    inputWidth: 475
+                }
+            ];
+        };
+
+        this.getFormSecItems = function (type, onlyShow, isHidden) {
+            if (type == 'http') {
+                return [
+                    {
+                        field: 'requestmethod',
+                        title: '璇锋眰鏂瑰紡',
+                        type: 'combox',
+                        comboxKey: 'sysIntegrationRequestMethodType',
+                        defaultValue: "",
+                        required: true,
+                        readOnly: onlyShow
+                    }, {
+                        field: 'requesturl',
+                        title: '璇锋眰鍦板潃',
+                        type: 'text',
+                        defaultValue: "",
+                        required: true,
+                        readOnly: onlyShow
+                    },
+                ]
+            } else if (type == 'webService') {
+                return [
+                    {
+                        field: 'interfaceFunction',
+                        title: '鎺ュ彛鍑芥暟',
+                        type: 'text',
+                        defaultValue: "",
+                        required: true,
+                        readOnly: onlyShow
+                    },]
+            } else if (type == 'classPath') {
+                return [
+                    {
+                        field: 'classPath',
+                        title: '绫昏矾寰�',
+                        type: 'text',
+                        defaultValue: "",
+                        required: true,
+                        readOnly: onlyShow
+                    }
+                ]
+            }
+        }
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function () {
+            var that = this;
+            var data = layui.table.checkStatus("table_" + that.id).data;
+            if (data.length != 1) {
+                webUtil.showErrorMsg('璇烽�夋嫨涓�鏉℃暟鎹�');
+                return false;
+            }
+            console.log(data[0]);
+            that.addOrEdit(false, data[0]);
+        };
+        this.addOrEdit = function (add, infoData) {
+            var that = this;
+            var form = layui.form;
+            var filter = "form_" + that.id;
+            var addSaveIndex = webUtil.dialog({
+                title: add ? '娣诲姞绯荤粺闆嗘垚鍩虹淇℃伅' : '淇敼绯荤粺闆嗘垚鍩虹淇℃伅',
+                btn: ['淇濆瓨', '鍙栨秷'],
+                content: '<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>' +
+                    '<form id="sec_' + filter + '" lay-filter="sec_' + filter + '" class="layui-form" style="margin:10px 25px 40px -2px;display: inline-block;float:left"></form>',
+                resizing: function (layero) {
+                    form.doResize(filter);
+                },
+                success: function (layero) {
+                    form.addItems(filter, that.getFormItems(false),
+                        function () {
+                            if (!add) {
+                                form.setValues(infoData);
+                            } else {
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues, filter);
+                            }
+
+                            that.sectype = 'webService';
+                            var hidden = true;
+                            if (!add) {
+                                that.sectype = infoData.interfacetype;
+                            }
+                            form.addItems("sec_" + filter, that.getFormSecItems(that.sectype, false, hidden), function () {
+                                if (!add) {
+                                    form.setValues(infoData, "sec_" + filter);
+                                } else {
+                                    var defaultValues = {};
+                                    form.setValues(defaultValues, "sec_" + filter);
+                                }
+                            }, {}, {defaultColumnOneRow: 1});
+
+                            form.on('select(interfacetype)', function (data) {
+                                var datatype = data.value;
+                                var isHidden = true;
+                                form.removeItems("sec_" + filter, [], true);
+                                form.addItems("sec_" + filter, that.getFormSecItems(datatype, false, isHidden), function () {
+                                    form.setValues(data, "sec_" + filter);
+                                })
+                            });
+                        }, {}, {defaultColumnOneRow: 1});
+                },
+                yes: function (layero) {
+                    if (form.validata(filter)) {
+                        var values = form.getValues(filter, true);
+                        console.log(values);
+                        var secvalues = form.getValues("sec_" + filter, true);
+                        var newvalues = $.extend({}, values, secvalues);
+                        console.log(newvalues);
+                        var url = that.url.controller + (add ? that.url.addSave : that.url.editSave);
+                        webUtil.manualAjax(add ? 'post' : 'put', url, JSON.stringify(newvalues), function (result) {
+                            if (result.success) {
+                                webUtil.showMsgFromResult(result, (add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            } else {
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        }, function (xhr, err) {
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        }, that.backPath);
+                    }
+                },
+                btn2: function (layero) {
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function () {
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id, true, true);
+            if (!oid) {
+                return false;
+            }
+            var ts = webUtil.getOidFromGrid("table_" + that.id, false, false, "ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!", function () {
+                webUtil.deleteRequest(that.url.controller + that.url.deleteUrl, {oid: oid, ts: ts}, function (result) {
+                    if (result.success) {
+                        webUtil.showMsgFromResult(result, "鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    } else {
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                }, function (xhr, err) {
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                }, that.backPath);
+            });
+        };
+        this.refresh = function () {
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+        this.ADVQUERY = function () {
+            var that = this;
+            if (!that.serinorQueryInstance) {
+                var dynamicCondition = layui.dynamicCondition;
+                $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar' + that.id + '" class="layui-inline"></div>');
+                that.checkColumns();
+                var dataFields = [];
+                for (var i = 0; i < that.columns.length; i++) {
+                    dataFields[i] = that.columns[i];
+                }
+                that.serinorQueryInstance = dynamicCondition.create({
+                    fields: dataFields//鏌ヨ瀛楁
+                    , tableId: "table_" + that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                    , type: "complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                    , queryCallBack: function (requestData) {//鏌ヨ涔嬪悗鐨刢allback
+
+                    }
+                });
+            }
+            that.serinorQueryInstance.open();
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME, cs);
+});
diff --git a/Source/platformProject/platform2022UI/vciweb/mdm/refer/CodeClassTemplateAttrRefer.js b/Source/platformProject/platform2022UI/vciweb/mdm/refer/CodeClassTemplateAttrRefer.js
new file mode 100644
index 0000000..a1a38bc
--- /dev/null
+++ b/Source/platformProject/platform2022UI/vciweb/mdm/refer/CodeClassTemplateAttrRefer.js
@@ -0,0 +1,344 @@
+/**
+ * 妯℃澘灞炴�у弬鐓х殑鍩虹椤甸潰
+ * @author weidy
+ * @date 2022-4-4
+ */
+layui.define(['layer','element','form','table'],function(exports){
+    var Class = function(){
+        this.MODELNAME = "mdm/refer/CodeClassTemplateAttrRefer";
+        this.moduleKey = "CodeClassTemplateAttrRefer";
+        this.backPath =  (configData.compatibility?path:configData.mdmService);
+        this.url = {
+            tempController:'codeClassifyTemplateController/',
+            tempReferTree:'codeClassifyTemplateController/referTree',
+            attrController:'codeClassifyTempAttrController/',
+            attrReferDataGrid:'codeClassifyTempAttrController/refDataGrid'
+        };
+        this.displayType = {
+            template:'template'
+        };
+        this.displayTypeTitle = {
+            template:{
+                title:'鍒嗙被妯℃澘',
+                url:'codeClassifyTemplateController/referTree',
+                queryField:'conditionMap["classifytemplateoid"]',
+                queryGridUrl:'codeClassifyTempAttrController/refDataGrid'
+            }
+        };
+        this.defaultConfig = {
+            displayType:[this.displayType.template],//榛樿鏄剧ず鐨勬槸閮ㄩ棬鍜岃鑹蹭笌鐢ㄦ埛
+            textField:'name',
+            valueField:'id'
+        };
+        this.showReferDialog = function (referConfig){
+            var filter = referConfig.filter,
+                name = referConfig.name,
+                title = referConfig.title,
+                target = referConfig.target,
+                value = referConfig.value,
+                text = referConfig.text;
+            var options = referConfig.options;
+            var baseOptions = {};
+            for(var key in options){
+                baseOptions[key] = options[key];
+            }
+            baseOptions.filter = filter;
+            baseOptions.name = name;
+            baseOptions.value = value;
+            baseOptions.text = text;
+            baseOptions.title = title;
+            baseOptions.setValue = function (filter,name,value,rawValue,isClose,selectRecords){
+                target.setValue(filter,name,value,rawValue,isClose,selectRecords);
+            }
+            this.viewUserInDialog(baseOptions);
+        };
+
+        /**
+         * 鐩存帴鏄剧ず閫夋嫨鐨勫璇濇锛岃繖涓粡甯稿湪鐐瑰嚮鎸夐挳鍚庣殑鍔熻兘閲屼娇鐢�
+         * @param options 閰嶇疆鐨勪俊鎭紝鍖呭惈濡備笅灞炴��
+         *    filter 锛屾爣璇�
+         *    name 锛屾爣璇嗗悕绉�
+         *   setValue:function (filter,name,value,rawValue,isClose,allSelectValues) {}   璁剧疆鍊肩殑鍥炶皟
+         * @returns 绐楀彛鐨勭储寮曞彿
+         */
+        this.viewUserInDialog = function (options) {
+            //鍦ㄥ璇濇涓�夋嫨鐢ㄦ埛
+            var that = this;
+            options = $.extend(that.defaultConfig,options);
+            options.queryGridUrl = $webUtil.getValueFromObj(options,['url','referUrl'],that.url.attrReferDataGrid);
+            options.textField = $webUtil.getValueFromObj(options,['textField'],that.defaultConfig.textField);
+            options.valueField = $webUtil.getValueFromObj(options,['valueField'],that.defaultConfig.valueField);
+            var filter = options.filter;
+            var name = options.name;
+            var valueInfo = ($webUtil.isNotNull(options.text)?("宸茶缃殑鍊间负[" +options.text +"]"):'鏈缃��');
+            var referIndex = $webUtil.dialog({
+                title:(options.title?options.title:'璇烽�夋嫨鍒嗙被妯℃澘鐨勫睘鎬�'),
+                btn:['纭畾','鍙栨秷'],
+                content:'<div id="referGrid_toolbar_' + filter + '" layui-filter="referGrid_toolbar_' + filter + '" class="layui-table-toolbar referGrid_toolbar_'+filter+'" style="height:560px;"></div>',
+                area:[(($webUtil.isNotNull(options.width) && options.width*1>1) ?options.width*1 : 1050) +'px',
+                    (($webUtil.isNotNull(options.height) && options.height*1>1) ?options.height*1 : 670) + 'px'],
+                btnBefore:valueInfo,
+                yes:function(index,layero){
+                    var selectValue = that.getSelectValue(filter,name);
+                    if(selectValue){
+                        options.setValue(filter,name,selectValue.value,selectValue.rawValue,true,selectValue.allValues);
+                        layer.close(referIndex);
+                    }
+                },
+                success:function(layero){
+                    that.showGrid(filter,name,options);
+                }
+            });
+            return referIndex;
+        };
+        this.setConfig=function(filter,name,options){
+            var that = this;
+            if(!that.referConfig){
+                that.referConfig = {};
+            }
+            that.referConfig[filter + "_" + name] = options;
+        };
+        this.getConfig=function(filter,name){
+            var that = this;
+            if(!that.referConfig){
+                that.referConfig = {};
+            }
+            if((filter + "_" + name) in that.referConfig){
+                return that.referConfig[filter + "_" + name];
+            }
+        };
+        this.showGrid =function (filter,name,options) {
+            //鏄剧ず
+            var that = this;
+            that.setConfig(filter,name,options);
+            var contentFilter = filter + "_" + name;
+            var typeHtml=['<div data-options="region:\'west\',split:true,minWidth:40,maxWidth:600" style="width:350px;background-color:#ffffff;display:',options.onlyTable?'none':'block','">',
+                        '<div lay-filter="referTree_' + contentFilter + '" class="layui-tab layui-tab-card" lay-allowClose="false" style="margin-top: 0">',
+                            '<ul class="layui-tab-title" lay-allowClose="false">'];
+            var tabHtml = [];
+            var tabContentHtml = [];
+            if(options.displayType) {
+                layui.each(options.displayType, function (_index, _item) {
+                    tabHtml.push('<li ' + ((!options.favUser&&_index == 0)?' class="layui-this" ':'') + '>' +  that.displayTypeTitle[_item].title + '</li>');
+                    tabContentHtml.push([
+                        '<div class="layui-tab-item layui-show">',
+                        '<ul layui-filter="', _item, '_', contentFilter, '" style="border:0px solid #6886ff;overflow-x:auto"></ul>',
+                        '</div>'].join(''));
+                });
+            }
+            typeHtml.push(tabHtml.join(''));
+            typeHtml.push('</ul>');
+            typeHtml.push('<div class="layui-tab-content">');
+            typeHtml.push(tabContentHtml.join(''));
+            typeHtml.push( '</div>');
+            typeHtml.push(    '</div>');
+            typeHtml.push('</div>');
+            var content= [
+                '<div class="layui-layout-border vciWebReferGridInDojo easyui-layout" data-options="fit:true" style="">',
+                    typeHtml.join(''),
+                    '<div class="layui-layout" data-options="region:\'center\'">',
+                         '<div layui-filter="referGrid_toolbar_',contentFilter, '" class="layui-btn-container">',//涓诲垪琛ㄧ殑鎸夐挳
+                    '</div>',
+                    '<div class="layui-center">',
+                        '<table class="layui-table layui-referGrid" lay-size="sm" lay-even layui-filter="referGrid_' + contentFilter + '" id="referGrid_' + contentFilter + '" ></table>',//涓诲垪琛�
+                    '</div>',
+                '</div>',
+            ];
+            $("#referGrid_toolbar_"+ filter ).html(content.join(''));
+            $('.vciWebReferGridInDojo').css({'width':$("#referGrid_toolbar_"+ filter ).parent().width()-10}).layout();
+            if(options.displayType) {
+                layui.each(options.displayType, function (_index, _item) {
+                    that.showTree(_item ,filter,name);
+                });
+            }else {
+                $('.vciWebReferGridInDojo').layout('remove','west');
+            }
+            var tableId = 'referGrid_' + filter + '_' + name;
+            var table = layui.table;
+            var isMuti = options.isMuti;
+            var requestData = options.where || {};
+            //鍙互瀹氫箟琛ㄦ牸浜�
+            table.render({
+                elem:'#referGrid_' + filter + '_' + name,
+                id:tableId,
+                url:(options.queryGridUrl?options.queryGridUrl:that.url.attrReferDataGrid),
+                page:{
+                    limit: 15,
+                    page: 1
+                },
+                backPath:(options.backPath?options.backPath:that.backPath),
+                height: '475px',
+                where:requestData,
+                method:'get',
+                selectMode:(isMuti?table.selectMode.muti:table.selectMode.single),
+                cols:[[table.getIndexColumn(),table.getCheckColumn(),
+                    {
+                        field: 'id',
+                        title: '灞炴�ц嫳鏂囩紪鍙�',
+                        sort:true,
+                        width: 150
+                    }, {
+                        field: 'name',
+                        title: '灞炴�т腑鏂囧悕绉�',
+                        sort:true,
+                        width: 200
+                    },{
+                        field: 'revisionValue',
+                        title: '鐗堟湰',
+                        sort: true,
+                        width: 90
+                    },{
+                        field:'description',
+                        title:'鎻忚堪',
+                        sort:true,
+                        width:150
+                    }]]
+            });
+            var queryColumns = [ {
+                field: 'id',
+                title: '灞炴�ц嫳鏂囧悕绉�'
+            }, {
+                field: 'name',
+                title: '灞炴�т腑鏂囧悕绉�'
+            }];
+            that.showSearchHtml(queryColumns,tableId,filter,name,requestData);
+        };
+        this.showTree = function (displayType,filter,name) {
+            var that = this;
+            var tree = layui.tree;
+            var requestData = {};
+            var options = that.getConfig(filter,name);
+            var url = that.displayTypeTitle[displayType].url;
+            //鏄剧ずtree
+            var treeOptions = {
+                url:url,
+                extraParams:requestData,
+                treeFilter:filter,
+                treeName:name,
+                showSearch:true,
+                loadType:layui.tree.loadType.all,
+                backPath:(options.backPath?options.backPath:that.backPath),
+                click:function(item,elem,treeOptions){
+                    that.treeDoClick(item,elem,treeOptions,displayType,filter,name);
+                    return false;
+                }
+            };
+            tree.init(displayType + "_" + filter+'_'+name,$('[layui-filter="'+ displayType + "_" + filter+'_'+name + '"]'),treeOptions);
+        };
+        this.treeDoClick = function (item,elem,option,displayType,filter,name) {
+            var that = this;
+            var tableId = 'referGrid_' + filter + '_' + name;
+            var where = {};
+            where[that.displayTypeTitle[displayType].queryField] = item.oid;
+            var tableUrl = that.displayTypeTitle[displayType].queryGridUrl;
+            layui.table.reload(tableId,{
+                url:tableUrl,
+                where:where
+            });
+        };
+        this.showSearchHtml = function (queryColumns,tableId,filter,name,requestData) {
+            var that = this;
+            var table = layui.table;
+            var toolbarElem = $('[layui-filter="referGrid_toolbar_' + filter + '_' + name +'"]');
+            if(queryColumns){
+                var toolbarHtml = '<div class="layui-form-item" style="height:24px;margin:5px 5px 0 5px;display:inline-block"> '
+                    + '<div class="layui-input-inline" style="height:24px;line-height:24px;width:120px;min-width: 120px"><select name="referGrid_search_'+ filter + '_' + name +'" style="height:24px;width:120px;font-size:15px;">';
+                layui.each(queryColumns,function(_index,queryRecord){
+                    toolbarHtml += '<option value="' + queryRecord.field + '" >' + queryRecord.title + '</option>';
+                });
+                toolbarHtml += '</select></div>';
+                toolbarHtml += '<div class="layui-input-inline"><input type="text" style="height:24px;font-size:14px;" name="referGrid_searchvalue_'+ filter + '_' + name +'" placeholder="杈撳叆鍊煎悗鍥炶溅杩涜妯$硦鏌ヨ" class="layui-input" ></div>';
+                toolbarHtml += '<div class="layui-input-inline" ><button class="layui-btn" style="height:24px;line-height:24px;margin: 0" name="referGrid_searchbtn_'+ filter + '_' + name +'" >鏌ヨ</button></div>';
+                toolbarHtml += '</div>';
+                toolbarElem.html(toolbarHtml);
+                layui.form.render('select');
+                $('[name="referGrid_searchvalue_' + filter + "_" + name + '"]').keydown(function (e){
+                    if(e.keyCode == 13){
+                        var searchField = $(this).parent().parent().find('select').val();
+                        var searchValue = $(this).val();
+                        searchValue = "*" + searchValue + "*";
+                        requestData['conditionMap["' + searchField + '"]'] = searchValue;
+                        table.reload(
+                            tableId, {
+                                where: requestData
+                            }
+                        );
+                    }
+                });
+                $('[name="referGrid_searchbtn_'+ filter + '_' + name +'"]').click(function(){
+                    var searchField = $(this).parent().parent().find('select').val();
+                    var searchValue = $(this).parent().parent().find('[name="referGrid_searchvalue_' + filter + '_' + name + '"]').val();
+                    searchValue = "*" + searchValue + "*";
+                    requestData['conditionMap["' + searchField + '"]'] = searchValue;
+                    table.reload(
+                        tableId, {
+                            where: requestData
+                        }
+                    );
+                });
+            }
+        };
+        this.destory = function (filter,name) {
+            //閿�姣�
+            var that = this;
+            if($('#referGrid_' + filter + '_' + name)){
+                $('#referGrid_' + filter + '_' + name).remove();
+            }
+        };
+        this.getSelectValue = function (filter,name) {
+             var that = this;
+             var table = layui.table;
+             var selectValue = {};
+             var checkStatus = table.checkStatus('referGrid_' + filter + "_" + name);
+             var options = that.getConfig(filter,name);
+             if(checkStatus.data.length>0){
+                 if(!options.isMuti && checkStatus.data.length > 1){
+                     $webUtil.showErrorMsg("鍙兘閫夋嫨涓�鏉℃暟鎹�");
+                     return false;
+                 }
+                 var value = "";
+                 var rawValue = "";
+                 options.valueField = options.valueField?options.valueField:that.defaultConfig.valueField;
+                 options.textField = options.textField?options.textField:that.defaultConfig.textField;
+                 var isMutiValue = (options.valueField.indexOf(",")>-1);
+                 var isMutiRaw = (options.textField.indexOf(",")>-1);
+                 layui.each(checkStatus.data,function(_index,item){
+                     if(isMutiValue){
+                         var valueFieldArray = options.valueField.split(",");
+                         layui.each(valueFieldArray,function(_indexField,_itemField){
+                             value += item[_itemField] + (options.valueSep?options.valueSep:' ');
+                         });
+                         value+= ",";
+                     }else {
+                         value += item[options.valueField] + ",";
+                     }
+                     if(isMutiRaw) {
+                         var rawFieldArray = options.textField.split(",");
+                         layui.each(rawFieldArray,function(_indexField,_itemField){
+                             rawValue += item[_itemField] + (options.textSep?options.textSep:' ');
+                         });
+                         rawValue+= ",";
+                     }else{
+                         rawValue += item[options.textField] + ",";
+                     }
+                 });
+                 if($webUtil.endWith(value,",")){
+                     value = value.substring(0,value.length - 1);
+                 }
+                 if($webUtil.endWith(rawValue,",")){
+                    rawValue = rawValue.substring(0,rawValue.length -1);
+                 }
+                 selectValue = {
+                    value : value,
+                    rawValue : rawValue,
+                    allValues: checkStatus.data
+                 };
+                 return selectValue;
+             }else{
+                 return false;
+             }
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/vciweb/mdm/refer/CodeClassTemplateRefer.js b/Source/platformProject/platform2022UI/vciweb/mdm/refer/CodeClassTemplateRefer.js
new file mode 100644
index 0000000..60934e9
--- /dev/null
+++ b/Source/platformProject/platform2022UI/vciweb/mdm/refer/CodeClassTemplateRefer.js
@@ -0,0 +1,341 @@
+/**
+ * 涓绘暟鎹殑妯℃澘鍙傜収鐨勫熀纭�椤甸潰
+ * @author weidy
+ * @date 2022-2-17
+ */
+layui.define(['layer','element','form','table'],function(exports){
+    var Class = function(){
+        this.MODELNAME = "mdm/refer/CodeClassTemplateRefer";
+        this.moduleKey = "CodeClassTemplateRefer";
+        this.backPath =  (configData.compatibility?path:configData.mdmService);
+        this.url = {
+            classController:'codeClassifyController/',
+            classTree:'referTree',
+            tempController:'codeClassifyTemplateController/',
+            tempReferDataGrid:'codeClassifyTemplateController/gridCodeClassifyTemplate'
+        };
+        this.displayType = {
+            codeClassify:'codeClassify'
+        };
+        this.displayTypeTitle = {
+            codeClassify:{
+                title:'涓婚搴撳垎绫�',
+                url:'codeClassifyController/referTree',
+                queryField:'conditionMap["codeClassifyOid"]',
+                queryGridUrl:'codeClassifyTemplateController/gridCodeClassifyTemplate'
+            }
+        };
+        this.defaultConfig = {
+            displayType:[this.displayType.codeClassify],//榛樿鏄剧ず鐨勬槸閮ㄩ棬鍜岃鑹蹭笌鐢ㄦ埛
+            textField:'name',
+            valueField:'oid'
+        };
+        this.showReferDialog = function (referConfig){
+            var filter = referConfig.filter,
+                name = referConfig.name,
+                title = referConfig.title,
+                target = referConfig.target,
+                value = referConfig.value,
+                text = referConfig.text;
+            var options = referConfig.options;
+            var baseOptions = {};
+            for(var key in options){
+                baseOptions[key] = options[key];
+            }
+            baseOptions.filter = filter;
+            baseOptions.name = name;
+            baseOptions.value = value;
+            baseOptions.text = text;
+            baseOptions.title = title;
+            baseOptions.setValue = function (filter,name,value,rawValue,isClose,selectRecords){
+                target.setValue(filter,name,value,rawValue,isClose,selectRecords);
+            }
+            this.viewUserInDialog(baseOptions);
+        };
+
+        /**
+         * 鐩存帴鏄剧ず閫夋嫨鐨勫璇濇锛岃繖涓粡甯稿湪鐐瑰嚮鎸夐挳鍚庣殑鍔熻兘閲屼娇鐢�
+         * @param options 閰嶇疆鐨勪俊鎭紝鍖呭惈濡備笅灞炴��
+         *    filter 锛屾爣璇�
+         *    name 锛屾爣璇嗗悕绉�
+         *   setValue:function (filter,name,value,rawValue,isClose,allSelectValues) {}   璁剧疆鍊肩殑鍥炶皟
+         * @returns 绐楀彛鐨勭储寮曞彿
+         */
+        this.viewUserInDialog = function (options) {
+            //鍦ㄥ璇濇涓�夋嫨鐢ㄦ埛
+            var that = this;
+            options = $.extend(that.defaultConfig,options);
+            options.queryGridUrl = $webUtil.getValueFromObj(options,['url','referUrl'],that.url.tempReferDataGrid);
+            options.textField = $webUtil.getValueFromObj(options,['textField'],that.defaultConfig.textField);
+            options.valueField = $webUtil.getValueFromObj(options,['valueField'],that.defaultConfig.valueField);
+            var filter = options.filter;
+            var name = options.name;
+            var valueInfo = ($webUtil.isNotNull(options.text)?("宸茶缃殑鍊间负[" +options.text +"]"):'鏈缃��');
+            var referIndex = $webUtil.dialog({
+                title:(options.title?options.title:'璇烽�夋嫨涓婚搴撳垎绫绘ā鏉�'),
+                btn:['纭畾','鍙栨秷'],
+                content:'<div id="referGrid_toolbar_' + filter + '" layui-filter="referGrid_toolbar_' + filter + '" class="layui-table-toolbar referGrid_toolbar_'+filter+'" style="height:560px;"></div>',
+                area:[(($webUtil.isNotNull(options.width) && options.width*1>1) ?options.width*1 : 1050) +'px',
+                    (($webUtil.isNotNull(options.height) && options.height*1>1) ?options.height*1 : 670) + 'px'],
+                btnBefore:valueInfo,
+                yes:function(index,layero){
+                    var selectValue = that.getSelectValue(filter,name);
+                    if(selectValue){
+                        options.setValue(filter,name,selectValue.value,selectValue.rawValue,true,selectValue.allValues);
+                        layer.close(referIndex);
+                    }
+                },
+                success:function(layero){
+                    that.showGrid(filter,name,options);
+                }
+            });
+            return referIndex;
+        };
+        this.setConfig=function(filter,name,options){
+            var that = this;
+            if(!that.referConfig){
+                that.referConfig = {};
+            }
+            that.referConfig[filter + "_" + name] = options;
+        };
+        this.getConfig=function(filter,name){
+            var that = this;
+            if(!that.referConfig){
+                that.referConfig = {};
+            }
+            if((filter + "_" + name) in that.referConfig){
+                return that.referConfig[filter + "_" + name];
+            }
+        };
+        this.showGrid =function (filter,name,options) {
+            //鏄剧ず
+            var that = this;
+            that.setConfig(filter,name,options);
+            var contentFilter = filter + "_" + name;
+            var typeHtml=['<div data-options="region:\'west\',split:true,minWidth:40,maxWidth:600" style="width:350px;background-color:#ffffff;display:',options.onlyTable?'none':'block','">',
+                        '<div lay-filter="referTree_' + contentFilter + '" class="layui-tab layui-tab-card" lay-allowClose="false" style="margin-top: 0">',
+                            '<ul class="layui-tab-title" lay-allowClose="false">'];
+            var tabHtml = [];
+            var tabContentHtml = [];
+            if(options.displayType) {
+                layui.each(options.displayType, function (_index, _item) {
+                    tabHtml.push('<li ' + ((!options.favUser&&_index == 0)?' class="layui-this" ':'') + '>' +  that.displayTypeTitle[_item].title + '</li>');
+                    tabContentHtml.push([
+                        '<div class="layui-tab-item layui-show">',
+                        '<ul layui-filter="', _item, '_', contentFilter, '" style="border:0px solid #6886ff;overflow-x:auto"></ul>',
+                        '</div>'].join(''));
+                });
+            }
+            typeHtml.push(tabHtml.join(''));
+            typeHtml.push('</ul>');
+            typeHtml.push('<div class="layui-tab-content">');
+            typeHtml.push(tabContentHtml.join(''));
+            typeHtml.push( '</div>');
+            typeHtml.push(    '</div>');
+            typeHtml.push('</div>');
+            var content= [
+                '<div class="layui-layout-border vciWebReferGridInDojo easyui-layout" data-options="fit:true" style="">',
+                    typeHtml.join(''),
+                    '<div class="layui-layout" data-options="region:\'center\'">',
+                         '<div layui-filter="referGrid_toolbar_',contentFilter, '" class="layui-btn-container">',//涓诲垪琛ㄧ殑鎸夐挳
+                    '</div>',
+                    '<div class="layui-center">',
+                        '<table class="layui-table layui-referGrid" lay-size="sm" lay-even layui-filter="referGrid_' + contentFilter + '" id="referGrid_' + contentFilter + '" ></table>',//涓诲垪琛�
+                    '</div>',
+                '</div>',
+            ];
+            $("#referGrid_toolbar_"+ filter ).html(content.join(''));
+            $('.vciWebReferGridInDojo').css({'width':$("#referGrid_toolbar_"+ filter ).parent().width()-10}).layout();
+            if(options.displayType) {
+                layui.each(options.displayType, function (_index, _item) {
+                    that.showTree(_item ,filter,name);
+                });
+            }
+            var tableId = 'referGrid_' + filter + '_' + name;
+            var table = layui.table;
+            var isMuti = options.isMuti;
+            var requestData = options.where || {};
+            //鍙互瀹氫箟琛ㄦ牸浜�
+            table.render({
+                elem:'#referGrid_' + filter + '_' + name,
+                id:tableId,
+                url:(options.queryGridUrl?options.queryGridUrl:that.url.tempReferDataGrid),
+                page:{
+                    limit: 15,
+                    page: 1
+                },
+                backPath:(options.backPath?options.backPath:that.backPath),
+                height: '475px',
+                where:requestData,
+                method:'get',
+                selectMode:(isMuti?table.selectMode.muti:table.selectMode.single),
+                cols:[[table.getIndexColumn(),table.getCheckColumn(),
+                    {
+                        field: 'id',
+                        title: '妯℃澘缂栧彿',
+                        sort:true,
+                        width: 150
+                    }, {
+                        field: 'name',
+                        title: '妯℃澘鍚嶇О',
+                        sort:true,
+                        width: 200
+                    },{
+                        field: 'revisionValue',
+                        title: '鐗堟湰',
+                        sort: true,
+                        width: 90
+                    },{
+                        field:'description',
+                        title:'鎻忚堪',
+                        sort:true,
+                        width:150
+                    }]]
+            });
+            var queryColumns = [ {
+                field: 'id',
+                title: '妯℃澘缂栧彿'
+            }, {
+                field: 'name',
+                title: '妯℃澘鍚嶇О'
+            }];
+            that.showSearchHtml(queryColumns,tableId,filter,name,requestData);
+        };
+        this.showTree = function (displayType,filter,name) {
+            var that = this;
+            var tree = layui.tree;
+            var requestData = {};
+            var options = that.getConfig(filter,name);
+            var url = that.displayTypeTitle[displayType].url;
+            //鏄剧ずtree
+            var treeOptions = {
+                url:url,
+                extraParams:requestData,
+                treeFilter:filter,
+                treeName:name,
+                showSearch:true,
+                backPath:(options.backPath?options.backPath:that.backPath),
+                click:function(item,elem,treeOptions){
+                    that.treeDoClick(item,elem,treeOptions,displayType,filter,name);
+                    return false;
+                }
+            };
+            tree.init(displayType + "_" + filter+'_'+name,$('[layui-filter="'+ displayType + "_" + filter+'_'+name + '"]'),treeOptions);
+        };
+        this.treeDoClick = function (item,elem,option,displayType,filter,name) {
+            var that = this;
+            var tableId = 'referGrid_' + filter + '_' + name;
+            var where = {};
+            where[that.displayTypeTitle[displayType].queryField] = item.oid;
+            var tableUrl = that.displayTypeTitle[displayType].queryGridUrl;
+            layui.table.reload(tableId,{
+                url:tableUrl,
+                where:where
+            });
+        };
+        this.showSearchHtml = function (queryColumns,tableId,filter,name,requestData) {
+            var that = this;
+            var table = layui.table;
+            var toolbarElem = $('[layui-filter="referGrid_toolbar_' + filter + '_' + name +'"]');
+            if(queryColumns){
+                var toolbarHtml = '<div class="layui-form-item" style="height:24px;margin:5px 5px 0 5px;display:inline-block"> '
+                    + '<div class="layui-input-inline" style="height:24px;line-height:24px;width:120px;min-width: 120px"><select name="referGrid_search_'+ filter + '_' + name +'" style="height:24px;width:120px;padding-right:30px;font-size:15px;">';
+                layui.each(queryColumns,function(_index,queryRecord){
+                    toolbarHtml += '<option value="' + queryRecord.field + '" >' + queryRecord.title + '</option>';
+                });
+                toolbarHtml += '</select></div>';
+                toolbarHtml += '<div class="layui-input-inline"><input type="text" style="height:24px;font-size:14px;" name="referGrid_searchvalue_'+ filter + '_' + name +'" placeholder="杈撳叆鍊煎悗鍥炶溅杩涜妯$硦鏌ヨ" class="layui-input" ></div>';
+                toolbarHtml += '<div class="layui-input-inline" ><button class="layui-btn" style="height:24px;line-height:24px;margin: 0" name="referGrid_searchbtn_'+ filter + '_' + name +'" >鏌ヨ</button></div>';
+                toolbarHtml += '</div>';
+                toolbarElem.html(toolbarHtml);
+                layui.form.render('select');
+                $('[name="referGrid_searchvalue_' + filter + "_" + name + '"]').keydown(function (e){
+                    if(e.keyCode == 13){
+                        var searchField = $(this).parent().parent().find('select').val();
+                        var searchValue = $(this).val();
+                        searchValue = "*" + searchValue + "*";
+                        requestData['conditionMap["' + searchField + '"]'] = searchValue;
+                        table.reload(
+                            tableId, {
+                                where: requestData
+                            }
+                        );
+                    }
+                });
+                $('[name="referGrid_searchbtn_'+ filter + '_' + name +'"]').click(function(){
+                    var searchField = $(this).parent().parent().find('select').val();
+                    var searchValue = $(this).parent().parent().find('[name="referGrid_searchvalue_' + filter + '_' + name + '"]').val();
+                    searchValue = "*" + searchValue + "*";
+                    requestData['conditionMap["' + searchField + '"]'] = searchValue;
+                    table.reload(
+                        tableId, {
+                            where: requestData
+                        }
+                    );
+                });
+            }
+        };
+        this.destory = function (filter,name) {
+            //閿�姣�
+            var that = this;
+            if($('#referGrid_' + filter + '_' + name)){
+                $('#referGrid_' + filter + '_' + name).remove();
+            }
+        };
+        this.getSelectValue = function (filter,name) {
+             var that = this;
+             var table = layui.table;
+             var selectValue = {};
+             var checkStatus = table.checkStatus('referGrid_' + filter + "_" + name);
+             var options = that.getConfig(filter,name);
+             if(checkStatus.data.length>0){
+                 if(!options.isMuti && checkStatus.data.length > 1){
+                     $webUtil.showErrorMsg("鍙兘閫夋嫨涓�鏉℃暟鎹�");
+                     return false;
+                 }
+                 var value = "";
+                 var rawValue = "";
+                 options.valueField = options.valueField?options.valueField:that.defaultConfig.valueField;
+                 options.textField = options.textField?options.textField:that.defaultConfig.textField;
+                 var isMutiValue = (options.valueField.indexOf(",")>-1);
+                 var isMutiRaw = (options.textField.indexOf(",")>-1);
+                 layui.each(checkStatus.data,function(_index,item){
+                     if(isMutiValue){
+                         var valueFieldArray = options.valueField.split(",");
+                         layui.each(valueFieldArray,function(_indexField,_itemField){
+                             value += item[_itemField] + (options.valueSep?options.valueSep:' ');
+                         });
+                         value+= ",";
+                     }else {
+                         value += item[options.valueField] + ",";
+                     }
+                     if(isMutiRaw) {
+                         var rawFieldArray = options.textField.split(",");
+                         layui.each(rawFieldArray,function(_indexField,_itemField){
+                             rawValue += item[_itemField] + (options.textSep?options.textSep:' ');
+                         });
+                         rawValue+= ",";
+                     }else{
+                         rawValue += item[options.textField] + ",";
+                     }
+                 });
+                 if($webUtil.endWith(value,",")){
+                     value = value.substring(0,value.length - 1);
+                 }
+                 if($webUtil.endWith(rawValue,",")){
+                    rawValue = rawValue.substring(0,rawValue.length -1);
+                 }
+                 selectValue = {
+                    value : value,
+                    rawValue : rawValue,
+                    allValues: checkStatus.data
+                 };
+                 return selectValue;
+             }else{
+                 return false;
+             }
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/vciweb/mdm/refer/CodeClassifyAttrRefer.js b/Source/platformProject/platform2022UI/vciweb/mdm/refer/CodeClassifyAttrRefer.js
new file mode 100644
index 0000000..b9e88f2
--- /dev/null
+++ b/Source/platformProject/platform2022UI/vciweb/mdm/refer/CodeClassifyAttrRefer.js
@@ -0,0 +1,354 @@
+/**
+ * 涓婚搴撶殑灞炴�х殑鍙傜収椤甸潰
+ * @author weidy
+ * @date 2022-4-6
+ */
+layui.define(['layer','element','form','table'],function(exports){
+    var Class = function(){
+        this.MODELNAME = "mdm/refer/CodeClassifyAttrRefer";
+        this.moduleKey = "CodeClassifyAttrRefer";
+        this.backPath =  (configData.compatibility?path:configData.mdmService);
+        this.url = {
+        };
+        this.displayType = {
+            codeClassify:'codeClassify'
+        };
+        this.displayTypeTitle = {
+            codeClassify:{
+                title:'涓婚搴撳垎绫�',
+                url:'codeClassifyController/treeTopCodeClassify',
+                queryField:'conditionMap["codeClassifyOid"]',
+                queryGridUrl:'codeClassifyController/listClassifyLinkAttr'
+            }
+        };
+        this.defaultConfig = {
+            displayType:[this.displayType.codeClassify],//榛樿鏄剧ず鐨勬槸閮ㄩ棬鍜岃鑹蹭笌鐢ㄦ埛
+            textField:'name',
+            valueField:'id'
+        };
+        this.vciFieldTypeMap = {
+            VTBoolean: "甯冨皵鍨�",
+            VTClob: "闀挎枃鏈�",
+            VTDate: "鏃ユ湡",
+            VTDateTime: "鏃ユ湡鏃堕棿",
+            VTTime: "鏃堕棿",
+            VTLong: "闀挎暣鍨�",
+            VTDouble: "閲戦/鍙岀簿搴�",
+            VTInteger: "鏁村舰",
+            VTFilePath: "鏂囦欢",
+            VTString: "瀛楃涓�"
+        };
+        this.showReferDialog = function (referConfig){
+            var filter = referConfig.filter,
+                name = referConfig.name,
+                title = referConfig.title,
+                target = referConfig.target,
+                value = referConfig.value,
+                text = referConfig.text;
+            var options = referConfig.options;
+            var baseOptions = {};
+            for(var key in options){
+                baseOptions[key] = options[key];
+            }
+            baseOptions.filter = filter;
+            baseOptions.name = name;
+            baseOptions.value = value;
+            baseOptions.text = text;
+            baseOptions.title = title;
+            baseOptions.setValue = function (filter,name,value,rawValue,isClose,selectRecords){
+                target.setValue(filter,name,value,rawValue,isClose,selectRecords);
+            }
+            this.viewUserInDialog(baseOptions);
+        };
+
+        /**
+         * 鐩存帴鏄剧ず閫夋嫨鐨勫璇濇锛岃繖涓粡甯稿湪鐐瑰嚮鎸夐挳鍚庣殑鍔熻兘閲屼娇鐢�
+         * @param options 閰嶇疆鐨勪俊鎭紝鍖呭惈濡備笅灞炴��
+         *    filter 锛屾爣璇�
+         *    name 锛屾爣璇嗗悕绉�
+         *   setValue:function (filter,name,value,rawValue,isClose,allSelectValues) {}   璁剧疆鍊肩殑鍥炶皟
+         * @returns 绐楀彛鐨勭储寮曞彿
+         */
+        this.viewUserInDialog = function (options) {
+            //鍦ㄥ璇濇涓�夋嫨鐢ㄦ埛
+            var that = this;
+            options = $.extend(that.defaultConfig,options);
+            options.queryGridUrl = $webUtil.getValueFromObj(options,['url','referUrl'],"codeClassifyController/listClassifyLinkAttr");
+            options.textField = $webUtil.getValueFromObj(options,['textField'],that.defaultConfig.textField);
+            options.valueField = $webUtil.getValueFromObj(options,['valueField'],that.defaultConfig.valueField);
+            var filter = options.filter;
+            var name = options.name;
+            var valueInfo = ($webUtil.isNotNull(options.text)?("宸茶缃殑鍊间负[" +options.text +"]"):'鏈缃��');
+            var referIndex = $webUtil.dialog({
+                title:(options.title?options.title:'璇烽�夋嫨涓婚搴撳垎绫绘ā鏉�'),
+                btn:['纭畾','鍙栨秷'],
+                content:'<div id="referGrid_toolbar_' + filter + '" layui-filter="referGrid_toolbar_' + filter + '" class="layui-table-toolbar referGrid_toolbar_'+filter+'" style="height:560px;"></div>',
+                area:[(($webUtil.isNotNull(options.width) && options.width*1>1) ?options.width*1 : 1050) +'px',
+                    (($webUtil.isNotNull(options.height) && options.height*1>1) ?options.height*1 : 670) + 'px'],
+                btnBefore:valueInfo,
+                yes:function(index,layero){
+                    var selectValue = that.getSelectValue(filter,name);
+                    if(selectValue){
+                        options.setValue(filter,name,selectValue.value,selectValue.rawValue,true,selectValue.allValues);
+                        layer.close(referIndex);
+                    }
+                },
+                success:function(layero){
+                    that.showGrid(filter,name,options);
+                }
+            });
+            return referIndex;
+        };
+        this.setConfig=function(filter,name,options){
+            var that = this;
+            if(!that.referConfig){
+                that.referConfig = {};
+            }
+            that.referConfig[filter + "_" + name] = options;
+        };
+        this.getConfig=function(filter,name){
+            var that = this;
+            if(!that.referConfig){
+                that.referConfig = {};
+            }
+            if((filter + "_" + name) in that.referConfig){
+                return that.referConfig[filter + "_" + name];
+            }
+        };
+        this.showGrid =function (filter,name,options) {
+            //鏄剧ず
+            var that = this;
+            that.setConfig(filter,name,options);
+            var contentFilter = filter + "_" + name;
+            var typeHtml=['<div data-options="region:\'west\',split:true,minWidth:40,maxWidth:600" style="width:350px;background-color:#ffffff;display:',options.onlyTable?'none':'block','">',
+                        '<div lay-filter="referTree_' + contentFilter + '" class="layui-tab layui-tab-card" lay-allowClose="false" style="margin-top: 0">',
+                            '<ul class="layui-tab-title" lay-allowClose="false">'];
+            var tabHtml = [];
+            var tabContentHtml = [];
+            if(options.displayType) {
+                layui.each(options.displayType, function (_index, _item) {
+                    tabHtml.push('<li ' + ((!options.favUser&&_index == 0)?' class="layui-this" ':'') + '>' +  that.displayTypeTitle[_item].title + '</li>');
+                    tabContentHtml.push([
+                        '<div class="layui-tab-item layui-show">',
+                        '<ul layui-filter="', _item, '_', contentFilter, '" style="border:0px solid #6886ff;overflow-x:auto"></ul>',
+                        '</div>'].join(''));
+                });
+            }
+            typeHtml.push(tabHtml.join(''));
+            typeHtml.push('</ul>');
+            typeHtml.push('<div class="layui-tab-content">');
+            typeHtml.push(tabContentHtml.join(''));
+            typeHtml.push( '</div>');
+            typeHtml.push(    '</div>');
+            typeHtml.push('</div>');
+            var content= [
+                '<div class="layui-layout-border vciWebReferGridInDojo easyui-layout" data-options="fit:true" style="">',
+                    typeHtml.join(''),
+                    '<div class="layui-layout" data-options="region:\'center\'">',
+                         '<div layui-filter="referGrid_toolbar_',contentFilter, '" class="layui-btn-container">',//涓诲垪琛ㄧ殑鎸夐挳
+                    '</div>',
+                    '<div class="layui-center">',
+                        '<table class="layui-table layui-referGrid" lay-size="sm" lay-even layui-filter="referGrid_' + contentFilter + '" id="referGrid_' + contentFilter + '" ></table>',//涓诲垪琛�
+                    '</div>',
+                '</div>',
+            ];
+            $("#referGrid_toolbar_"+ filter ).html(content.join(''));
+            $('.vciWebReferGridInDojo').css({'width':$("#referGrid_toolbar_"+ filter ).parent().width()-10}).layout();
+            if(options.displayType) {
+                layui.each(options.displayType, function (_index, _item) {
+                    that.showTree(_item ,filter,name);
+                });
+            }
+            var tableId = 'referGrid_' + filter + '_' + name;
+            var table = layui.table;
+            var isMuti = options.isMuti;
+            var requestData = options.where || {};
+            //鍙互瀹氫箟琛ㄦ牸浜�
+            table.render({
+                elem:'#referGrid_' + filter + '_' + name,
+                id:tableId,
+                url:(options.queryGridUrl?options.queryGridUrl:that.url.tempReferDataGrid),
+                backPath:(options.backPath?options.backPath:that.backPath),
+                height: '475px',
+                where:requestData,
+                method:'get',
+                selectMode:(isMuti?table.selectMode.muti:table.selectMode.single),
+                cols:[[table.getIndexColumn(),table.getCheckColumn(),
+                    {
+                        field: 'id',
+                        title: '灞炴�ц嫳鏂囧悕绉�',
+                        sort:true,
+                        width: 150
+                    }, {
+                        field: 'name',
+                        title: '灞炴�т腑鏂囧悕绉�',
+                        sort:true,
+                        width: 200
+                    },{
+                        field: 'attrLength',
+                        title: '灞炴�ч暱搴�',
+                        sort: true,
+                        width: 90
+                    },{
+                        field:'attributeDataType',
+                        title:'灞炴�х被鍨�',
+                        sort:true,
+                        width:150,
+                        templet:function (d){
+                            return that.vciFieldTypeMap[d.attributeDataType];
+                        }
+                    }]]
+            });
+            var queryColumns = [ {
+                field: 'id',
+                title: '灞炴�ц嫳鏂囧悕绉�'
+            }, {
+                field: 'name',
+                title: '灞炴�т腑鏂囧悕绉�'
+            }];
+            that.showSearchHtml(queryColumns,tableId,filter,name,requestData);
+        };
+        this.showTree = function (displayType,filter,name) {
+            var that = this;
+            var tree = layui.tree;
+            var requestData = {};
+            var options = that.getConfig(filter,name);
+            var url = that.displayTypeTitle[displayType].url;
+            //鏄剧ずtree
+            var treeOptions = {
+                url:url,
+                extraParams:requestData,
+                treeFilter:filter,
+                treeName:name,
+                showSearch:true,
+                loadType:tree.loadType.all,
+                backPath:(options.backPath?options.backPath:that.backPath),
+                click:function(item,elem,treeOptions){
+                    that.treeDoClick(item,elem,treeOptions,displayType,filter,name);
+                    return false;
+                }
+            };
+            tree.init(displayType + "_" + filter+'_'+name,$('[layui-filter="'+ displayType + "_" + filter+'_'+name + '"]'),treeOptions);
+        };
+        this.treeDoClick = function (item,elem,option,displayType,filter,name) {
+            var that = this;
+            var tableId = 'referGrid_' + filter + '_' + name;
+            var where = {};
+            where[that.displayTypeTitle[displayType].queryField] = item.oid;
+            where.page=1;
+            var tableUrl = that.displayTypeTitle[displayType].queryGridUrl;
+            that.currentItem = item;
+            layui.table.reload(tableId,{
+                url:tableUrl,
+                where:where
+            });
+        };
+        this.showSearchHtml = function (queryColumns,tableId,filter,name,requestData) {
+            var that = this;
+            var table = layui.table;
+            var toolbarElem = $('[layui-filter="referGrid_toolbar_' + filter + '_' + name +'"]');
+            if(queryColumns){
+                var toolbarHtml = '<div class="layui-form-item" style="height:24px;margin:5px 5px 0 5px;display:inline-block"> '
+                    + '<div class="layui-input-inline" style="height:24px;line-height:24px;width:120px;min-width: 120px"><select name="referGrid_search_'+ filter + '_' + name +'" style="height:24px;width:120px;padding-right:30px;font-size:15px;">';
+                layui.each(queryColumns,function(_index,queryRecord){
+                    toolbarHtml += '<option value="' + queryRecord.field + '" >' + queryRecord.title + '</option>';
+                });
+                toolbarHtml += '</select></div>';
+                toolbarHtml += '<div class="layui-input-inline"><input type="text" style="height:24px;font-size:14px;" name="referGrid_searchvalue_'+ filter + '_' + name +'" placeholder="杈撳叆鍊煎悗鍥炶溅杩涜妯$硦鏌ヨ" class="layui-input" ></div>';
+                toolbarHtml += '<div class="layui-input-inline" ><button class="layui-btn" style="height:24px;line-height:24px;margin: 0" name="referGrid_searchbtn_'+ filter + '_' + name +'" >鏌ヨ</button></div>';
+                toolbarHtml += '</div>';
+                toolbarElem.html(toolbarHtml);
+                layui.form.render('select');
+                $('[name="referGrid_searchvalue_' + filter + "_" + name + '"]').keydown(function (e){
+                    if(e.keyCode == 13){
+                        var searchField = $(this).parent().parent().find('select').val();
+                        var searchValue = $(this).val();
+                        searchValue = "*" + searchValue + "*";
+                        requestData['conditionMap["' + searchField + '"]'] = searchValue;
+                        table.reload(
+                            tableId, {
+                                where: requestData
+                            }
+                        );
+                    }
+                });
+                $('[name="referGrid_searchbtn_'+ filter + '_' + name +'"]').click(function(){
+                    var searchField = $(this).parent().parent().find('select').val();
+                    var searchValue = $(this).parent().parent().find('[name="referGrid_searchvalue_' + filter + '_' + name + '"]').val();
+                    searchValue = "*" + searchValue + "*";
+                    requestData['conditionMap["' + searchField + '"]'] = searchValue;
+                    table.reload(
+                        tableId, {
+                            where: requestData
+                        }
+                    );
+                });
+            }
+        };
+        this.destory = function (filter,name) {
+            //閿�姣�
+            var that = this;
+            if($('#referGrid_' + filter + '_' + name)){
+                $('#referGrid_' + filter + '_' + name).remove();
+            }
+        };
+        this.getSelectValue = function (filter,name) {
+             var that = this;
+             var table = layui.table;
+             var selectValue = {};
+             var checkStatus = table.checkStatus('referGrid_' + filter + "_" + name);
+             var options = that.getConfig(filter,name);
+            var allValues = checkStatus.data;
+             if(allValues.length>0){
+                 if(!options.isMuti && allValues.length > 1){
+                     $webUtil.showErrorMsg("鍙兘閫夋嫨涓�鏉℃暟鎹�");
+                     return false;
+                 }
+                 var value = "";
+                 var rawValue = "";
+                 options.valueField = options.valueField?options.valueField:that.defaultConfig.valueField;
+                 options.textField = options.textField?options.textField:that.defaultConfig.textField;
+                 var isMutiValue = (options.valueField.indexOf(",")>-1);
+                 var isMutiRaw = (options.textField.indexOf(",")>-1);
+                 layui.each(allValues,function(_index,item){
+                     if(isMutiValue){
+                         var valueFieldArray = options.valueField.split(",");
+                         layui.each(valueFieldArray,function(_indexField,_itemField){
+                             value += item[_itemField] + (options.valueSep?options.valueSep:' ');
+                         });
+                         value+= ",";
+                     }else {
+                         value += item[options.valueField] + ",";
+                     }
+                     if(isMutiRaw) {
+                         var rawFieldArray = options.textField.split(",");
+                         layui.each(rawFieldArray,function(_indexField,_itemField){
+                             rawValue += item[_itemField] + (options.textSep?options.textSep:' ');
+                         });
+                         rawValue+= ",";
+                     }else{
+                         rawValue += item[options.textField] + ",";
+                     }
+                     item['currentItem'] = that.currentItem;
+                 });
+                 if($webUtil.endWith(value,",")){
+                     value = value.substring(0,value.length - 1);
+                 }
+                 if($webUtil.endWith(rawValue,",")){
+                    rawValue = rawValue.substring(0,rawValue.length -1);
+                 }
+
+                 selectValue = {
+                    value : value,
+                    rawValue : rawValue,
+                    allValues: allValues
+                 };
+                 return selectValue;
+             }else{
+                 return false;
+             }
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/vciweb/mes/wrj/PmAlonePlan.js b/Source/platformProject/platform2022UI/vciweb/mes/wrj/PmAlonePlan.js
new file mode 100644
index 0000000..0f90ec7
--- /dev/null
+++ b/Source/platformProject/platform2022UI/vciweb/mes/wrj/PmAlonePlan.js
@@ -0,0 +1,441 @@
+/**
+ * 鏋舵璁″垝椤甸潰
+ * @author weidy
+ * @date 2022-03-19
+ */
+layui.define(['layer','element','form','table','dynamicCondition' ],function(exports){
+        var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "mes/wrj/PmAlonePlan";
+        this.moduleKey = "PmAlonePlan";
+        this.backPath =  configData.compatibility? path:configData.mesWrjService;
+        this.url = {
+            controller:'alonePlanController/',
+            dataGrid:'gridPmAlonePlan',
+            addSave:'addSave',
+            editSave:'editSave',
+            deleteUrl:'deleteData',
+            getObjectByOid:'getObjectByOid'
+        };
+        this.getContent=function(){
+            var that = this;
+            return '<div id="UIContent_' + that.id + '" style="overflow: auto;padding:0 5px"></div>';
+        };
+        this.showContent=function (){
+            var that = this;
+            var html = "";
+            html = [
+                        '<div class="layui-layout easyui-layout UIContentLayout"  id="easyuiLayout_',that.id,'" data-options="fit:true" style="display:block;overflow-y: hidden;margin:0 5px">',
+                            '<div data-options="region:\'center\'" style="padding-left: 10px;padding-right: 10px;" id="border_',that.id,'">',
+                                '<div class="layui-center" style="overflow-y:auto;">',
+                                    that.getToolbarHtml(),
+                                    '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                                '</div>',
+                            '</div>',
+                        '</div>'
+            ].join("");
+            $("#UIContent_"+that.id).html(html);
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.createSearchHtml({id:"缂栧彿",name:"鍚嶇О"} ,$("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+        };
+        this.defaultAttrList = [
+        'captain',
+        'captainname',
+        'currentpercent',
+        'pdmmodel',
+        'pdmmodelname',
+        'plandelivertime',
+        'pmplaneplan',
+        'pmplaneplanname',
+        'pmsaleplantarget',
+        'pmsaleplantargetname',
+            'id',
+            'name',
+            'description',
+            'oid',
+            'nameoid',
+            'revisionoid',
+            'btmname',
+            'islastr',
+            'isfirstr',
+            'islastv',
+            'isfirstv',
+            'creator',
+            'createtime',
+            'lastmodifier',
+            'lastmodifytime',
+            'revisionrule',
+            'revisionseq',
+            'revisionvalue',
+            'versionrule',
+            'versionseq',
+            'versionvalue',
+            'lctid',
+            'lcstatus',
+            'ts',
+            'owner',
+            'checkinby',
+            'checkintime',
+            'checkoutby',
+            'checkouttime',
+            'copyfromversion',
+            'secretgrade'
+        ];
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            //闇�瑕佸姞鍦ㄥ畾鏃朵腑锛屽惁鍒欐牱寮忎笉鑳芥纭睍绀猴紝涓嶇煡閬撳師鍥� wangting
+            setTimeout(function (){
+                that.showContent();
+                var easyuiLayout= $('#easyuiLayout_'+that.id)
+                easyuiLayout.css({height:$('#portal_body').height()-43,width:$('#portal_body').width()-15})
+                easyuiLayout.layout();
+
+                that.initMainTable();
+                that.createSearchHtml();
+
+            },1)
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var tableWidth = $("#border_" + that.id).width();
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                width:tableWidth,
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                method:'get',
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'EDIT'){
+                                that.addOrEdit(false,data.oid);
+                            }
+                        });
+                    }else{
+                        if(total>0) {
+                            table.selectRecord('table_' + that.id, {index:0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                }
+            };
+            if(parentFieldName){
+                options.treeConfig = {
+                    treepid:parentFieldName,
+                    treeid:'id',
+                    showField:'name'
+                };
+            }
+            table.render(options);
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),
+                    {
+                        title: '鏈洪暱',
+                        field: 'captain',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '鏈洪暱濮撳悕',
+                        field: 'captainname',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '褰撳墠杩涘害',
+                        field: 'currentpercent',
+                        type:'number',
+                        width: 100
+                    },
+                    {
+                        title: '鏈哄瀷',
+                        field: 'pdmmodelName',
+                        sort:true,
+                        sortField:'pdmmodel',
+                        type:'refer',
+                        referConfig: {
+                            type:'default',
+                            referBo:'workcontext'
+                        },
+                        width: 150
+                    },
+                    {
+                        title: '鏈哄瀷缂栧彿',
+                        field: 'pdmmodelname',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '浜や粯鑺傜偣',
+                        field: 'plandelivertime',
+                        width: 130,
+                        type:'datetime',
+                        templet: function (d) {
+                            return webUtil.formateDateTimeNoSecond(d.plandelivertime);
+                        }
+                    },
+                    {
+                        title: '鏈轰綋璁″垝',
+                        field: 'pmplaneplanName',
+                        sort:true,
+                        sortField:'pmplaneplan',
+                        type:'refer',
+                        referConfig: {
+                            type:'default',
+                            referBo:'pmplaneplan'
+                        },
+                        width: 150
+                    },
+                    {
+                        title: 'pmPlanePlanName',
+                        field: 'pmplaneplanname',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '绉戠爺鐢熶骇椤圭洰涓婚敭',
+                        field: 'pmsaleplantarget',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '绉戠爺鐢熶骇椤圭洰缂栧彿',
+                        field: 'pmsaleplantargetname',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        field:'options',
+                        title:'鎿嶄綔',
+                        width:150,
+                        templet:function(d){
+                            return '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>';
+                        }
+                    }];
+            }
+        };
+
+        this.getFormItems = function(onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [
+                {
+                    field: 'captain',
+                    title: '鏈洪暱',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'captainname',
+                    title: '鏈洪暱濮撳悕',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'currentpercent',
+                    title: '褰撳墠杩涘害',
+                    verify: 'number',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'pdmmodel',
+                    title: '鏈哄瀷',
+                    required: true,
+                    type: 'refer',
+                    showField: 'pdmmodelName',
+                    referConfig: {
+                        type:'default',
+                        referBo:'workcontext'
+                    },
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'pdmmodelname',
+                    title: '鏈哄瀷缂栧彿',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'plandelivertime',
+                    title: '浜や粯鑺傜偣',
+                    type: 'datetime',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'pmplaneplan',
+                    title: '鏈轰綋璁″垝',
+                    required: true,
+                    type: 'refer',
+                    showField: 'pmplaneplanName',
+                    referConfig: {
+                        type:'default',
+                        referBo:'pmplaneplan'
+                    },
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'pmplaneplanname',
+                    title: 'pmPlanePlanName',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'pmsaleplantarget',
+                    title: '绉戠爺鐢熶骇椤圭洰涓婚敭',
+                    required: true,
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'pmsaleplantargetname',
+                    title: '绉戠爺鐢熶骇椤圭洰缂栧彿',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                }             ];
+        };
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            that.addOrEdit(false,oid);
+        };
+        this.addOrEdit = function(add,oid) {
+            var that = this;
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var addSaveIndex =webUtil.dialog({
+                title:add?'娣诲姞鏋舵璁″垝':'淇敼鏋舵璁″垝',
+                btn:['淇濆瓨','鍙栨秷'],
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getFormItems(false),
+                        function () {
+                            if(!add){
+                                form.load(filter,{
+                                    backPath:that.backPath,
+                                    url:that.url.controller + that.url.getObjectByOid,
+                                    method:'get',
+                                    params:{
+                                        oid:oid
+                                    }
+                                });
+                            }else{
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+                        }, {}, {defaultColumnOneRow: 2});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        var url = that.url.controller + (add?that.url.addSave:that.url.editSave);
+                        webUtil.manualAjax(add?'post':'put',url,JSON.stringify(values),function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts= webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+        this.refresh = function () {
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+        this.ADVQUERY = function () {
+            var that = this;
+            if(!that.serinorQueryInstance) {
+                var dynamicCondition = layui.dynamicCondition;
+                $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar' + that.id + '" class="layui-inline"></div>');
+                that.checkColumns();
+                var dataFields = [];
+                for(var i = 0 ; i < that.columns.length ; i ++){
+                    dataFields[i] = that.columns[i];
+                }
+                that.serinorQueryInstance = dynamicCondition.create({
+                    fields: dataFields//鏌ヨ瀛楁
+                    , tableId: "table_" + that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                    , type: "complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                    , queryCallBack: function (requestData) {//鏌ヨ涔嬪悗鐨刢allback
+
+                    }
+                });
+            }
+            that.serinorQueryInstance.open();
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/vciweb/mes/wrj/PmGroundPlan.js b/Source/platformProject/platform2022UI/vciweb/mes/wrj/PmGroundPlan.js
new file mode 100644
index 0000000..ad94595
--- /dev/null
+++ b/Source/platformProject/platform2022UI/vciweb/mes/wrj/PmGroundPlan.js
@@ -0,0 +1,388 @@
+/**
+ * 鍦伴潰绔欒鍒掗〉闈�
+ * @author weidy
+ * @date 2022-03-19
+ */
+layui.define(['layer','element','form','table','dynamicCondition' ],function(exports){
+        var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "mes/wrj/PmGroundPlan";
+        this.moduleKey = "PmGroundPlan";
+        this.backPath =  configData.compatibility? path:configData.mesWrjService;
+        this.url = {
+            controller:'groundPlanController/',
+            dataGrid:'gridPmGroundPlan',
+            addSave:'addSave',
+            editSave:'editSave',
+            deleteUrl:'deleteData',
+            getObjectByOid:'getObjectByOid'
+        };
+        this.getContent=function(){
+            var that = this;
+            return '<div id="UIContent_' + that.id + '" style="overflow: auto;padding:0 5px"></div>';
+        };
+        this.showContent=function (){
+            var that = this;
+            var html = "";
+            html = [
+                        '<div class="layui-layout easyui-layout UIContentLayout"  id="easyuiLayout_',that.id,'" data-options="fit:true" style="display:block;overflow-y: hidden;margin:0 5px">',
+                            '<div data-options="region:\'center\'" style="padding-left: 10px;padding-right: 10px;" id="border_',that.id,'">',
+                                '<div class="layui-center" style="overflow-y:auto;">',
+                                    that.getToolbarHtml(),
+                                    '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                                '</div>',
+                            '</div>',
+                        '</div>'
+            ].join("");
+            $("#UIContent_"+that.id).html(html);
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.createSearchHtml({id:"缂栧彿",name:"鍚嶇О"} ,$("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+        };
+        this.defaultAttrList = [
+        'actualdeliverdate',
+        'groundstationname',
+        'plandeliverdate',
+        'plandelivertime',
+        'pmsaleplantarget',
+        'pmsaleplantargetname',
+        'requirementdate',
+            'id',
+            'name',
+            'description',
+            'oid',
+            'nameoid',
+            'revisionoid',
+            'btmname',
+            'islastr',
+            'isfirstr',
+            'islastv',
+            'isfirstv',
+            'creator',
+            'createtime',
+            'lastmodifier',
+            'lastmodifytime',
+            'revisionrule',
+            'revisionseq',
+            'revisionvalue',
+            'versionrule',
+            'versionseq',
+            'versionvalue',
+            'lctid',
+            'lcstatus',
+            'ts',
+            'owner',
+            'checkinby',
+            'checkintime',
+            'checkoutby',
+            'checkouttime',
+            'copyfromversion',
+            'secretgrade'
+        ];
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            //闇�瑕佸姞鍦ㄥ畾鏃朵腑锛屽惁鍒欐牱寮忎笉鑳芥纭睍绀猴紝涓嶇煡閬撳師鍥� wangting
+            setTimeout(function (){
+                that.showContent();
+                var easyuiLayout= $('#easyuiLayout_'+that.id)
+                easyuiLayout.css({height:$('#portal_body').height()-43,width:$('#portal_body').width()-15})
+                easyuiLayout.layout();
+
+                that.initMainTable();
+                that.createSearchHtml();
+
+            },1)
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var tableWidth = $("#border_" + that.id).width();
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                width:tableWidth,
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                method:'get',
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'EDIT'){
+                                that.addOrEdit(false,data.oid);
+                            }
+                        });
+                    }else{
+                        if(total>0) {
+                            table.selectRecord('table_' + that.id, {index:0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                }
+            };
+            if(parentFieldName){
+                options.treeConfig = {
+                    treepid:parentFieldName,
+                    treeid:'id',
+                    showField:'name'
+                };
+            }
+            table.render(options);
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),
+                    {
+                        title: '瀹為檯浜や粯鏃ユ湡',
+                        field: 'actualdeliverdate',
+                        width: 130,
+                        type:'datetime',
+                        templet: function (d) {
+                            return webUtil.formateDateTimeNoSecond(d.actualdeliverdate);
+                        }
+                    },
+                    {
+                        title: '鍦伴潰绔欏悕绉�',
+                        field: 'groundstationname',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '璁″垝浜や粯鏃ユ湡',
+                        field: 'plandeliverdate',
+                        width: 130,
+                        type:'datetime',
+                        templet: function (d) {
+                            return webUtil.formateDateTimeNoSecond(d.plandeliverdate);
+                        }
+                    },
+                    {
+                        title: '浜や粯鑺傜偣',
+                        field: 'plandelivertime',
+                        width: 130,
+                        type:'datetime',
+                        templet: function (d) {
+                            return webUtil.formateDateTimeNoSecond(d.plandelivertime);
+                        }
+                    },
+                    {
+                        title: '绉戠爺鐢熶骇椤圭洰涓婚敭',
+                        field: 'pmsaleplantarget',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '绉戠爺鐢熶骇椤圭洰缂栧彿',
+                        field: 'pmsaleplantargetname',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '闇�姹傛棩鏈�',
+                        field: 'requirementdate',
+                        width: 130,
+                        type:'datetime',
+                        templet: function (d) {
+                            return webUtil.formateDateTimeNoSecond(d.requirementdate);
+                        }
+                    },
+                    {
+                        field:'options',
+                        title:'鎿嶄綔',
+                        width:150,
+                        templet:function(d){
+                            return '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>';
+                        }
+                    }];
+            }
+        };
+
+        this.getFormItems = function(onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [
+                {
+                    field: 'actualdeliverdate',
+                    title: '瀹為檯浜や粯鏃ユ湡',
+                    type: 'datetime',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'groundstationname',
+                    title: '鍦伴潰绔欏悕绉�',
+                    required: true,
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'plandeliverdate',
+                    title: '璁″垝浜や粯鏃ユ湡',
+                    type: 'datetime',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'plandelivertime',
+                    title: '浜や粯鑺傜偣',
+                    type: 'datetime',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'pmsaleplantarget',
+                    title: '绉戠爺鐢熶骇椤圭洰涓婚敭',
+                    required: true,
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'pmsaleplantargetname',
+                    title: '绉戠爺鐢熶骇椤圭洰缂栧彿',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'requirementdate',
+                    title: '闇�姹傛棩鏈�',
+                    type: 'datetime',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                }             ];
+        };
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            that.addOrEdit(false,oid);
+        };
+        this.addOrEdit = function(add,oid) {
+            var that = this;
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var addSaveIndex =webUtil.dialog({
+                title:add?'娣诲姞鍦伴潰绔欒鍒�':'淇敼鍦伴潰绔欒鍒�',
+                btn:['淇濆瓨','鍙栨秷'],
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getFormItems(false),
+                        function () {
+                            if(!add){
+                                form.load(filter,{
+                                    backPath:that.backPath,
+                                    url:that.url.controller + that.url.getObjectByOid,
+                                    method:'get',
+                                    params:{
+                                        oid:oid
+                                    }
+                                });
+                            }else{
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+                        }, {}, {defaultColumnOneRow: 2});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        var url = that.url.controller + (add?that.url.addSave:that.url.editSave);
+                        webUtil.manualAjax(add?'post':'put',url,JSON.stringify(values),function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts= webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+        this.refresh = function () {
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+        this.ADVQUERY = function () {
+            var that = this;
+            if(!that.serinorQueryInstance) {
+                var dynamicCondition = layui.dynamicCondition;
+                $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar' + that.id + '" class="layui-inline"></div>');
+                that.checkColumns();
+                var dataFields = [];
+                for(var i = 0 ; i < that.columns.length ; i ++){
+                    dataFields[i] = that.columns[i];
+                }
+                that.serinorQueryInstance = dynamicCondition.create({
+                    fields: dataFields//鏌ヨ瀛楁
+                    , tableId: "table_" + that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                    , type: "complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                    , queryCallBack: function (requestData) {//鏌ヨ涔嬪悗鐨刢allback
+
+                    }
+                });
+            }
+            that.serinorQueryInstance.open();
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/vciweb/mes/wrj/PmPlanCalulate.js b/Source/platformProject/platform2022UI/vciweb/mes/wrj/PmPlanCalulate.js
new file mode 100644
index 0000000..27949b1
--- /dev/null
+++ b/Source/platformProject/platform2022UI/vciweb/mes/wrj/PmPlanCalulate.js
@@ -0,0 +1,348 @@
+/**
+ * 璁″垝鐨勮绠楀叕寮忛〉闈�
+ * @author weidy
+ * @date 2022-03-19
+ */
+layui.define(['layer','element','form','table','dynamicCondition' ],function(exports){
+        var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "mes/wrj/PmPlanCalulate";
+        this.moduleKey = "PmPlanCalulate";
+        this.backPath =  configData.compatibility? path:configData.mesWrjService;
+        this.url = {
+            controller:'planCalulateController/',
+            dataGrid:'gridPmPlanCalulate',
+            addSave:'addSave',
+            editSave:'editSave',
+            deleteUrl:'deleteData',
+            getObjectByOid:'getObjectByOid'
+        };
+        this.getContent=function(){
+            var that = this;
+            return '<div id="UIContent_' + that.id + '" style="overflow: auto;padding:0 5px"></div>';
+        };
+        this.showContent=function (){
+            var that = this;
+            var html = "";
+            html = [
+                        '<div class="layui-layout easyui-layout UIContentLayout"  id="easyuiLayout_',that.id,'" data-options="fit:true" style="display:block;overflow-y: hidden;margin:0 5px">',
+                            '<div data-options="region:\'center\'" style="padding-left: 10px;padding-right: 10px;" id="border_',that.id,'">',
+                                '<div class="layui-center" style="overflow-y:auto;">',
+                                    that.getToolbarHtml(),
+                                    '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                                '</div>',
+                            '</div>',
+                        '</div>'
+            ].join("");
+            $("#UIContent_"+that.id).html(html);
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.createSearchHtml({id:"缂栧彿",name:"鍚嶇О"} ,$("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+        };
+        this.defaultAttrList = [
+        'calculateinfo',
+        'usedattribute',
+        'usedattributename',
+        'usedbtmtype',
+        'usedbtmtypename',
+            'id',
+            'name',
+            'description',
+            'oid',
+            'nameoid',
+            'revisionoid',
+            'btmname',
+            'islastr',
+            'isfirstr',
+            'islastv',
+            'isfirstv',
+            'creator',
+            'createtime',
+            'lastmodifier',
+            'lastmodifytime',
+            'revisionrule',
+            'revisionseq',
+            'revisionvalue',
+            'versionrule',
+            'versionseq',
+            'versionvalue',
+            'lctid',
+            'lcstatus',
+            'ts',
+            'owner',
+            'checkinby',
+            'checkintime',
+            'checkoutby',
+            'checkouttime',
+            'copyfromversion',
+            'secretgrade'
+        ];
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            //闇�瑕佸姞鍦ㄥ畾鏃朵腑锛屽惁鍒欐牱寮忎笉鑳芥纭睍绀猴紝涓嶇煡閬撳師鍥� wangting
+            setTimeout(function (){
+                that.showContent();
+                var easyuiLayout= $('#easyuiLayout_'+that.id)
+                easyuiLayout.css({height:$('#portal_body').height()-43,width:$('#portal_body').width()-15})
+                easyuiLayout.layout();
+
+                that.initMainTable();
+                that.createSearchHtml();
+
+            },1)
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var tableWidth = $("#border_" + that.id).width();
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                width:tableWidth,
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                method:'get',
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'EDIT'){
+                                that.addOrEdit(false,data.oid);
+                            }
+                        });
+                    }else{
+                        if(total>0) {
+                            table.selectRecord('table_' + that.id, {index:0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                }
+            };
+            if(parentFieldName){
+                options.treeConfig = {
+                    treepid:parentFieldName,
+                    treeid:'id',
+                    showField:'name'
+                };
+            }
+            table.render(options);
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),
+                    {
+                        title: '鍏紡鐨勫唴瀹�',
+                        field: 'calculateinfo',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '浣跨敤鐨勫睘鎬�',
+                        field: 'usedattribute',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '浣跨敤鐨勫睘鎬у悕绉�',
+                        field: 'usedattributename',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '浣跨敤鐨勪笟鍔$被鍨�',
+                        field: 'usedbtmtype',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '浣跨敤鐨勪笟鍔$被鍨嬬殑鍚嶅瓧',
+                        field: 'usedbtmtypename',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        field:'options',
+                        title:'鎿嶄綔',
+                        width:150,
+                        templet:function(d){
+                            return '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>';
+                        }
+                    }];
+            }
+        };
+
+        this.getFormItems = function(onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [
+                {
+                    field: 'calculateinfo',
+                    title: '鍏紡鐨勫唴瀹�',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'usedattribute',
+                    title: '浣跨敤鐨勫睘鎬�',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'usedattributename',
+                    title: '浣跨敤鐨勫睘鎬у悕绉�',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'usedbtmtype',
+                    title: '浣跨敤鐨勪笟鍔$被鍨�',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'usedbtmtypename',
+                    title: '浣跨敤鐨勪笟鍔$被鍨嬬殑鍚嶅瓧',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                }             ];
+        };
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            that.addOrEdit(false,oid);
+        };
+        this.addOrEdit = function(add,oid) {
+            var that = this;
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var addSaveIndex =webUtil.dialog({
+                title:add?'娣诲姞璁″垝鐨勮绠楀叕寮�':'淇敼璁″垝鐨勮绠楀叕寮�',
+                btn:['淇濆瓨','鍙栨秷'],
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getFormItems(false),
+                        function () {
+                            if(!add){
+                                form.load(filter,{
+                                    backPath:that.backPath,
+                                    url:that.url.controller + that.url.getObjectByOid,
+                                    method:'get',
+                                    params:{
+                                        oid:oid
+                                    }
+                                });
+                            }else{
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+                        }, {}, {defaultColumnOneRow: 2});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        var url = that.url.controller + (add?that.url.addSave:that.url.editSave);
+                        webUtil.manualAjax(add?'post':'put',url,JSON.stringify(values),function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts= webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+        this.refresh = function () {
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+        this.ADVQUERY = function () {
+            var that = this;
+            if(!that.serinorQueryInstance) {
+                var dynamicCondition = layui.dynamicCondition;
+                $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar' + that.id + '" class="layui-inline"></div>');
+                that.checkColumns();
+                var dataFields = [];
+                for(var i = 0 ; i < that.columns.length ; i ++){
+                    dataFields[i] = that.columns[i];
+                }
+                that.serinorQueryInstance = dynamicCondition.create({
+                    fields: dataFields//鏌ヨ瀛楁
+                    , tableId: "table_" + that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                    , type: "complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                    , queryCallBack: function (requestData) {//鏌ヨ涔嬪悗鐨刢allback
+
+                    }
+                });
+            }
+            that.serinorQueryInstance.open();
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/vciweb/mes/wrj/PmPlaneItem.js b/Source/platformProject/platform2022UI/vciweb/mes/wrj/PmPlaneItem.js
new file mode 100644
index 0000000..9b9ef0e
--- /dev/null
+++ b/Source/platformProject/platform2022UI/vciweb/mes/wrj/PmPlaneItem.js
@@ -0,0 +1,359 @@
+/**
+ * 鏈轰綋璁″垝鏄庣粏椤甸潰
+ * @author weidy
+ * @date 2022-03-19
+ */
+layui.define(['layer','element','form','table','dynamicCondition' ],function(exports){
+        var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "mes/wrj/PmPlaneItem";
+        this.moduleKey = "PmPlaneItem";
+        this.backPath =  configData.compatibility? path:configData.mesWrjService;
+        this.url = {
+            controller:'planItemController/',
+            dataGrid:'gridPmPlaneItem',
+            addSave:'addSave',
+            editSave:'editSave',
+            deleteUrl:'deleteData',
+            getObjectByOid:'getObjectByOid'
+        };
+        this.getContent=function(){
+            var that = this;
+            return '<div id="UIContent_' + that.id + '" style="overflow: auto;padding:0 5px"></div>';
+        };
+        this.showContent=function (){
+            var that = this;
+            var html = "";
+            html = [
+                        '<div class="layui-layout easyui-layout UIContentLayout"  id="easyuiLayout_',that.id,'" data-options="fit:true" style="display:block;overflow-y: hidden;margin:0 5px">',
+                            '<div data-options="region:\'center\'" style="padding-left: 10px;padding-right: 10px;" id="border_',that.id,'">',
+                                '<div class="layui-center" style="overflow-y:auto;">',
+                                    that.getToolbarHtml(),
+                                    '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                                '</div>',
+                            '</div>',
+                        '</div>'
+            ].join("");
+            $("#UIContent_"+that.id).html(html);
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.createSearchHtml({id:"缂栧彿",name:"鍚嶇О"} ,$("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+        };
+        this.defaultAttrList = [
+        'partactualdelivertime',
+        'partdelivertime',
+        'planeparttype',
+        'pmplaneplan',
+            'id',
+            'name',
+            'description',
+            'oid',
+            'nameoid',
+            'revisionoid',
+            'btmname',
+            'islastr',
+            'isfirstr',
+            'islastv',
+            'isfirstv',
+            'creator',
+            'createtime',
+            'lastmodifier',
+            'lastmodifytime',
+            'revisionrule',
+            'revisionseq',
+            'revisionvalue',
+            'versionrule',
+            'versionseq',
+            'versionvalue',
+            'lctid',
+            'lcstatus',
+            'ts',
+            'owner',
+            'checkinby',
+            'checkintime',
+            'checkoutby',
+            'checkouttime',
+            'copyfromversion',
+            'secretgrade'
+        ];
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            //闇�瑕佸姞鍦ㄥ畾鏃朵腑锛屽惁鍒欐牱寮忎笉鑳芥纭睍绀猴紝涓嶇煡閬撳師鍥� wangting
+            setTimeout(function (){
+                that.showContent();
+                var easyuiLayout= $('#easyuiLayout_'+that.id)
+                easyuiLayout.css({height:$('#portal_body').height()-43,width:$('#portal_body').width()-15})
+                easyuiLayout.layout();
+
+                that.initMainTable();
+                that.createSearchHtml();
+
+            },1)
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var tableWidth = $("#border_" + that.id).width();
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                width:tableWidth,
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                method:'get',
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'EDIT'){
+                                that.addOrEdit(false,data.oid);
+                            }
+                        });
+                    }else{
+                        if(total>0) {
+                            table.selectRecord('table_' + that.id, {index:0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                }
+            };
+            if(parentFieldName){
+                options.treeConfig = {
+                    treepid:parentFieldName,
+                    treeid:'id',
+                    showField:'name'
+                };
+            }
+            table.render(options);
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),
+                    {
+                        title: '瀹為檯浜や粯鏃ユ湡',
+                        field: 'partactualdelivertime',
+                        width: 130,
+                        type:'datetime',
+                        templet: function (d) {
+                            return webUtil.formateDateTimeNoSecond(d.partactualdelivertime);
+                        }
+                    },
+                    {
+                        title: '璁″垝浜や粯鏃ユ湡',
+                        field: 'partdelivertime',
+                        width: 130,
+                        type:'datetime',
+                        templet: function (d) {
+                            return webUtil.formateDateTimeNoSecond(d.partdelivertime);
+                        }
+                    },
+                    {
+                        title: '椋炴満缁勪欢绫诲瀷',
+                        field: 'planeparttypeText',
+                        sort:true,
+                        sortField:'planeparttype',
+                        type:'combox',
+                        comboxKey:"planePartType",
+                        width: 150
+                    },
+                    {
+                        title: '鏈轰綋璁″垝',
+                        field: 'pmplaneplanName',
+                        sort:true,
+                        sortField:'pmplaneplan',
+                        type:'refer',
+                        referConfig: {
+                            type:'default',
+                            referBo:'pmplaneplan'
+                        },
+                        width: 150
+                    },
+                    {
+                        field:'options',
+                        title:'鎿嶄綔',
+                        width:150,
+                        templet:function(d){
+                            return '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>';
+                        }
+                    }];
+            }
+        };
+
+        this.getFormItems = function(onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [
+                {
+                    field: 'partactualdelivertime',
+                    title: '瀹為檯浜や粯鏃ユ湡',
+                    type: 'datetime',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'partdelivertime',
+                    title: '璁″垝浜や粯鏃ユ湡',
+                    required: true,
+                    type: 'datetime',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'planeparttype',
+                    title: '椋炴満缁勪欢绫诲瀷',
+                    required: true,
+                    type: 'combox',
+                    comboxKey: 'planePartType',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'pmplaneplan',
+                    title: '鏈轰綋璁″垝',
+                    required: true,
+                    type: 'refer',
+                    showField: 'pmplaneplanName',
+                    referConfig: {
+                        type:'default',
+                        referBo:'pmplaneplan'
+                    },
+                    defaultValue:"",
+                    readOnly:onlyShow
+                }             ];
+        };
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            that.addOrEdit(false,oid);
+        };
+        this.addOrEdit = function(add,oid) {
+            var that = this;
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var addSaveIndex =webUtil.dialog({
+                title:add?'娣诲姞鏈轰綋璁″垝鏄庣粏':'淇敼鏈轰綋璁″垝鏄庣粏',
+                btn:['淇濆瓨','鍙栨秷'],
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getFormItems(false),
+                        function () {
+                            if(!add){
+                                form.load(filter,{
+                                    backPath:that.backPath,
+                                    url:that.url.controller + that.url.getObjectByOid,
+                                    method:'get',
+                                    params:{
+                                        oid:oid
+                                    }
+                                });
+                            }else{
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+                        }, {}, {defaultColumnOneRow: 2});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        var url = that.url.controller + (add?that.url.addSave:that.url.editSave);
+                        webUtil.manualAjax(add?'post':'put',url,JSON.stringify(values),function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts= webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+        this.refresh = function () {
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+        this.ADVQUERY = function () {
+            var that = this;
+            if(!that.serinorQueryInstance) {
+                var dynamicCondition = layui.dynamicCondition;
+                $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar' + that.id + '" class="layui-inline"></div>');
+                that.checkColumns();
+                var dataFields = [];
+                for(var i = 0 ; i < that.columns.length ; i ++){
+                    dataFields[i] = that.columns[i];
+                }
+                that.serinorQueryInstance = dynamicCondition.create({
+                    fields: dataFields//鏌ヨ瀛楁
+                    , tableId: "table_" + that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                    , type: "complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                    , queryCallBack: function (requestData) {//鏌ヨ涔嬪悗鐨刢allback
+
+                    }
+                });
+            }
+            that.serinorQueryInstance.open();
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/vciweb/mes/wrj/PmPlanePlan.js b/Source/platformProject/platform2022UI/vciweb/mes/wrj/PmPlanePlan.js
new file mode 100644
index 0000000..2dbd880
--- /dev/null
+++ b/Source/platformProject/platform2022UI/vciweb/mes/wrj/PmPlanePlan.js
@@ -0,0 +1,315 @@
+/**
+ * 鏈轰綋璁″垝椤甸潰
+ * @author weidy
+ * @date 2022-03-19
+ */
+layui.define(['layer','element','form','table','dynamicCondition' ],function(exports){
+        var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "mes/wrj/PmPlanePlan";
+        this.moduleKey = "PmPlanePlan";
+        this.backPath =  configData.compatibility? path:configData.mesWrjService;
+        this.url = {
+            controller:'planePlanController/',
+            dataGrid:'gridPmPlanePlan',
+            addSave:'addSave',
+            editSave:'editSave',
+            deleteUrl:'deleteData',
+            getObjectByOid:'getObjectByOid'
+        };
+        this.getContent=function(){
+            var that = this;
+            return '<div id="UIContent_' + that.id + '" style="overflow: auto;padding:0 5px"></div>';
+        };
+        this.showContent=function (){
+            var that = this;
+            var html = "";
+            html = [
+                        '<div class="layui-layout easyui-layout UIContentLayout"  id="easyuiLayout_',that.id,'" data-options="fit:true" style="display:block;overflow-y: hidden;margin:0 5px">',
+                            '<div data-options="region:\'center\'" style="padding-left: 10px;padding-right: 10px;" id="border_',that.id,'">',
+                                '<div class="layui-center" style="overflow-y:auto;">',
+                                    that.getToolbarHtml(),
+                                    '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                                '</div>',
+                            '</div>',
+                        '</div>'
+            ].join("");
+            $("#UIContent_"+that.id).html(html);
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.createSearchHtml({id:"缂栧彿",name:"鍚嶇О"} ,$("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+        };
+        this.defaultAttrList = [
+        'bodyactualdelivertime',
+        'bodydelivertime',
+            'id',
+            'name',
+            'description',
+            'oid',
+            'nameoid',
+            'revisionoid',
+            'btmname',
+            'islastr',
+            'isfirstr',
+            'islastv',
+            'isfirstv',
+            'creator',
+            'createtime',
+            'lastmodifier',
+            'lastmodifytime',
+            'revisionrule',
+            'revisionseq',
+            'revisionvalue',
+            'versionrule',
+            'versionseq',
+            'versionvalue',
+            'lctid',
+            'lcstatus',
+            'ts',
+            'owner',
+            'checkinby',
+            'checkintime',
+            'checkoutby',
+            'checkouttime',
+            'copyfromversion',
+            'secretgrade'
+        ];
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            //闇�瑕佸姞鍦ㄥ畾鏃朵腑锛屽惁鍒欐牱寮忎笉鑳芥纭睍绀猴紝涓嶇煡閬撳師鍥� wangting
+            setTimeout(function (){
+                that.showContent();
+                var easyuiLayout= $('#easyuiLayout_'+that.id)
+                easyuiLayout.css({height:$('#portal_body').height()-43,width:$('#portal_body').width()-15})
+                easyuiLayout.layout();
+
+                that.initMainTable();
+                that.createSearchHtml();
+
+            },1)
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var tableWidth = $("#border_" + that.id).width();
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                width:tableWidth,
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                method:'get',
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'EDIT'){
+                                that.addOrEdit(false,data.oid);
+                            }
+                        });
+                    }else{
+                        if(total>0) {
+                            table.selectRecord('table_' + that.id, {index:0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                }
+            };
+            if(parentFieldName){
+                options.treeConfig = {
+                    treepid:parentFieldName,
+                    treeid:'id',
+                    showField:'name'
+                };
+            }
+            table.render(options);
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),
+                    {
+                        title: '鏈鸿韩瀹為檯浜や粯鏃ユ湡',
+                        field: 'bodyactualdelivertime',
+                        width: 130,
+                        type:'datetime',
+                        templet: function (d) {
+                            return webUtil.formateDateTimeNoSecond(d.bodyactualdelivertime);
+                        }
+                    },
+                    {
+                        title: 'bodyDeliverTime',
+                        field: 'bodydelivertime',
+                        width: 130,
+                        type:'datetime',
+                        templet: function (d) {
+                            return webUtil.formateDateTimeNoSecond(d.bodydelivertime);
+                        }
+                    },
+                    {
+                        field:'options',
+                        title:'鎿嶄綔',
+                        width:150,
+                        templet:function(d){
+                            return '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>';
+                        }
+                    }];
+            }
+        };
+
+        this.getFormItems = function(onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [
+                {
+                    field: 'bodyactualdelivertime',
+                    title: '鏈鸿韩瀹為檯浜や粯鏃ユ湡',
+                    type: 'datetime',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'bodydelivertime',
+                    title: 'bodyDeliverTime',
+                    type: 'datetime',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                }             ];
+        };
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            that.addOrEdit(false,oid);
+        };
+        this.addOrEdit = function(add,oid) {
+            var that = this;
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var addSaveIndex =webUtil.dialog({
+                title:add?'娣诲姞鏈轰綋璁″垝':'淇敼鏈轰綋璁″垝',
+                btn:['淇濆瓨','鍙栨秷'],
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getFormItems(false),
+                        function () {
+                            if(!add){
+                                form.load(filter,{
+                                    backPath:that.backPath,
+                                    url:that.url.controller + that.url.getObjectByOid,
+                                    method:'get',
+                                    params:{
+                                        oid:oid
+                                    }
+                                });
+                            }else{
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+                        }, {}, {defaultColumnOneRow: 2});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        var url = that.url.controller + (add?that.url.addSave:that.url.editSave);
+                        webUtil.manualAjax(add?'post':'put',url,JSON.stringify(values),function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts= webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+        this.refresh = function () {
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+        this.ADVQUERY = function () {
+            var that = this;
+            if(!that.serinorQueryInstance) {
+                var dynamicCondition = layui.dynamicCondition;
+                $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar' + that.id + '" class="layui-inline"></div>');
+                that.checkColumns();
+                var dataFields = [];
+                for(var i = 0 ; i < that.columns.length ; i ++){
+                    dataFields[i] = that.columns[i];
+                }
+                that.serinorQueryInstance = dynamicCondition.create({
+                    fields: dataFields//鏌ヨ瀛楁
+                    , tableId: "table_" + that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                    , type: "complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                    , queryCallBack: function (requestData) {//鏌ヨ涔嬪悗鐨刢allback
+
+                    }
+                });
+            }
+            that.serinorQueryInstance.open();
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/vciweb/mes/wrj/PmSalePlan.js b/Source/platformProject/platform2022UI/vciweb/mes/wrj/PmSalePlan.js
new file mode 100644
index 0000000..38f49b4
--- /dev/null
+++ b/Source/platformProject/platform2022UI/vciweb/mes/wrj/PmSalePlan.js
@@ -0,0 +1,379 @@
+/**
+ * 绉戠爺鐢熶骇璁″垝椤甸潰
+ * @author weidy
+ * @date 2022-03-19
+ */
+layui.define(['layer','element','form','table','dynamicCondition' ],function(exports){
+        var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "mes/wrj/PmSalePlan";
+        this.moduleKey = "PmSalePlan";
+        this.backPath =  configData.compatibility? path:configData.mesWrjService;
+        this.url = {
+            controller:'salePlanController/',
+            dataGrid:'gridPmSalePlan',
+            addSave:'addSave',
+            editSave:'editSave',
+            deleteUrl:'deleteData',
+            getObjectByOid:'getObjectByOid'
+        };
+        this.getContent=function(){
+            var that = this;
+            return '<div id="UIContent_' + that.id + '" style="overflow: auto;padding:0 5px"></div>';
+        };
+        this.showContent=function (){
+            var that = this;
+            var html = "";
+            html = [
+                        '<div class="layui-layout easyui-layout UIContentLayout"  id="easyuiLayout_',that.id,'" data-options="fit:true" style="display:block;overflow-y: hidden;margin:0 5px">',
+                            '<div data-options="region:\'center\'" style="padding-left: 10px;padding-right: 10px;" id="border_',that.id,'">',
+                                '<div class="layui-center" style="overflow-y:auto;">',
+                                    that.getToolbarHtml(),
+                                    '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                                '</div>',
+                            '</div>',
+                        '</div>'
+            ].join("");
+            $("#UIContent_"+that.id).html(html);
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.createSearchHtml({id:"缂栧彿",name:"鍚嶇О"} ,$("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+        };
+        this.defaultAttrList = [
+        'orderdept',
+        'orderdeptname',
+        'pdmmodel',
+        'pdmsaleplantype',
+        'planenum',
+        'stationnum',
+            'id',
+            'name',
+            'description',
+            'oid',
+            'nameoid',
+            'revisionoid',
+            'btmname',
+            'islastr',
+            'isfirstr',
+            'islastv',
+            'isfirstv',
+            'creator',
+            'createtime',
+            'lastmodifier',
+            'lastmodifytime',
+            'revisionrule',
+            'revisionseq',
+            'revisionvalue',
+            'versionrule',
+            'versionseq',
+            'versionvalue',
+            'lctid',
+            'lcstatus',
+            'ts',
+            'owner',
+            'checkinby',
+            'checkintime',
+            'checkoutby',
+            'checkouttime',
+            'copyfromversion',
+            'secretgrade'
+        ];
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            //闇�瑕佸姞鍦ㄥ畾鏃朵腑锛屽惁鍒欐牱寮忎笉鑳芥纭睍绀猴紝涓嶇煡閬撳師鍥� wangting
+            setTimeout(function (){
+                that.showContent();
+                var easyuiLayout= $('#easyuiLayout_'+that.id)
+                easyuiLayout.css({height:$('#portal_body').height()-43,width:$('#portal_body').width()-15})
+                easyuiLayout.layout();
+
+                that.initMainTable();
+                that.createSearchHtml();
+
+            },1)
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var tableWidth = $("#border_" + that.id).width();
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                width:tableWidth,
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                method:'get',
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'EDIT'){
+                                that.addOrEdit(false,data.oid);
+                            }
+                        });
+                    }else{
+                        if(total>0) {
+                            table.selectRecord('table_' + that.id, {index:0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                }
+            };
+            if(parentFieldName){
+                options.treeConfig = {
+                    treepid:parentFieldName,
+                    treeid:'id',
+                    showField:'name'
+                };
+            }
+            table.render(options);
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),
+                    {
+                        title: '鎻愬嚭閮ㄩ棬',
+                        field: 'orderdept',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '鎻愬嚭閮ㄩ棬鍚嶇О',
+                        field: 'orderdeptname',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '鏈哄瀷',
+                        field: 'pdmmodelName',
+                        sort:true,
+                        sortField:'pdmmodel',
+                        type:'refer',
+                        referConfig: {
+                            type:'default',
+                            referBo:'workcontext'
+                        },
+                        width: 150
+                    },
+                    {
+                        title: '椤圭洰鎬ц川',
+                        field: 'pdmsaleplantypeText',
+                        sort:true,
+                        sortField:'pdmsaleplantype',
+                        type:'combox',
+                        comboxKey:"salePlanType",
+                        width: 150
+                    },
+                    {
+                        title: '椋炴満闇�姹傛暟閲�',
+                        field: 'planenum',
+                        type:'number',
+                        width: 100
+                    },
+                    {
+                        title: '鍦伴潰绔欓渶姹傛暟閲�',
+                        field: 'stationnum',
+                        type:'number',
+                        width: 100
+                    },
+                    {
+                        field:'options',
+                        title:'鎿嶄綔',
+                        width:150,
+                        templet:function(d){
+                            return '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>';
+                        }
+                    }];
+            }
+        };
+
+        this.getFormItems = function(onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [
+                {
+                    field: 'orderdept',
+                    title: '鎻愬嚭閮ㄩ棬',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'orderdeptname',
+                    title: '鎻愬嚭閮ㄩ棬鍚嶇О',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'pdmmodel',
+                    title: '鏈哄瀷',
+                    required: true,
+                    type: 'refer',
+                    showField: 'pdmmodelName',
+                    referConfig: {
+                        type:'default',
+                        referBo:'workcontext'
+                    },
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'pdmsaleplantype',
+                    title: '椤圭洰鎬ц川',
+                    type: 'combox',
+                    comboxKey: 'salePlanType',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'planenum',
+                    title: '椋炴満闇�姹傛暟閲�',
+                    required: true,
+                    verify: 'number',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'stationnum',
+                    title: '鍦伴潰绔欓渶姹傛暟閲�',
+                    required: true,
+                    verify: 'number',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                }             ];
+        };
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            that.addOrEdit(false,oid);
+        };
+        this.addOrEdit = function(add,oid) {
+            var that = this;
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var addSaveIndex =webUtil.dialog({
+                title:add?'娣诲姞绉戠爺鐢熶骇璁″垝':'淇敼绉戠爺鐢熶骇璁″垝',
+                btn:['淇濆瓨','鍙栨秷'],
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getFormItems(false),
+                        function () {
+                            if(!add){
+                                form.load(filter,{
+                                    backPath:that.backPath,
+                                    url:that.url.controller + that.url.getObjectByOid,
+                                    method:'get',
+                                    params:{
+                                        oid:oid
+                                    }
+                                });
+                            }else{
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+                        }, {}, {defaultColumnOneRow: 2});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        var url = that.url.controller + (add?that.url.addSave:that.url.editSave);
+                        webUtil.manualAjax(add?'post':'put',url,JSON.stringify(values),function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts= webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+        this.refresh = function () {
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+        this.ADVQUERY = function () {
+            var that = this;
+            if(!that.serinorQueryInstance) {
+                var dynamicCondition = layui.dynamicCondition;
+                $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar' + that.id + '" class="layui-inline"></div>');
+                that.checkColumns();
+                var dataFields = [];
+                for(var i = 0 ; i < that.columns.length ; i ++){
+                    dataFields[i] = that.columns[i];
+                }
+                that.serinorQueryInstance = dynamicCondition.create({
+                    fields: dataFields//鏌ヨ瀛楁
+                    , tableId: "table_" + that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                    , type: "complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                    , queryCallBack: function (requestData) {//鏌ヨ涔嬪悗鐨刢allback
+
+                    }
+                });
+            }
+            that.serinorQueryInstance.open();
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/vciweb/mes/wrj/PmSalePlanAccord.js b/Source/platformProject/platform2022UI/vciweb/mes/wrj/PmSalePlanAccord.js
new file mode 100644
index 0000000..690cf7c
--- /dev/null
+++ b/Source/platformProject/platform2022UI/vciweb/mes/wrj/PmSalePlanAccord.js
@@ -0,0 +1,323 @@
+/**
+ * 绉戠爺鐢熶骇璁″垝渚濇嵁椤甸潰
+ * @author weidy
+ * @date 2022-03-19
+ */
+layui.define(['layer','element','form','table','dynamicCondition' ],function(exports){
+        var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "mes/wrj/PmSalePlanAccord";
+        this.moduleKey = "PmSalePlanAccord";
+        this.backPath =  configData.compatibility? path:configData.mesWrjService;
+        this.url = {
+            controller:'salePlanAccordController/',
+            dataGrid:'gridPmSalePlanAccord',
+            addSave:'addSave',
+            editSave:'editSave',
+            deleteUrl:'deleteData',
+            getObjectByOid:'getObjectByOid'
+        };
+        this.getContent=function(){
+            var that = this;
+            return '<div id="UIContent_' + that.id + '" style="overflow: auto;padding:0 5px"></div>';
+        };
+        this.showContent=function (){
+            var that = this;
+            var html = "";
+            html = [
+                        '<div class="layui-layout easyui-layout UIContentLayout"  id="easyuiLayout_',that.id,'" data-options="fit:true" style="display:block;overflow-y: hidden;margin:0 5px">',
+                            '<div data-options="region:\'center\'" style="padding-left: 10px;padding-right: 10px;" id="border_',that.id,'">',
+                                '<div class="layui-center" style="overflow-y:auto;">',
+                                    that.getToolbarHtml(),
+                                    '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                                '</div>',
+                            '</div>',
+                        '</div>'
+            ].join("");
+            $("#UIContent_"+that.id).html(html);
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.createSearchHtml({id:"缂栧彿",name:"鍚嶇О"} ,$("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+        };
+        this.defaultAttrList = [
+        'issueddate',
+        'pmsaleplan',
+            'id',
+            'name',
+            'description',
+            'oid',
+            'nameoid',
+            'revisionoid',
+            'btmname',
+            'islastr',
+            'isfirstr',
+            'islastv',
+            'isfirstv',
+            'creator',
+            'createtime',
+            'lastmodifier',
+            'lastmodifytime',
+            'revisionrule',
+            'revisionseq',
+            'revisionvalue',
+            'versionrule',
+            'versionseq',
+            'versionvalue',
+            'lctid',
+            'lcstatus',
+            'ts',
+            'owner',
+            'checkinby',
+            'checkintime',
+            'checkoutby',
+            'checkouttime',
+            'copyfromversion',
+            'secretgrade'
+        ];
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            //闇�瑕佸姞鍦ㄥ畾鏃朵腑锛屽惁鍒欐牱寮忎笉鑳芥纭睍绀猴紝涓嶇煡閬撳師鍥� wangting
+            setTimeout(function (){
+                that.showContent();
+                var easyuiLayout= $('#easyuiLayout_'+that.id)
+                easyuiLayout.css({height:$('#portal_body').height()-43,width:$('#portal_body').width()-15})
+                easyuiLayout.layout();
+
+                that.initMainTable();
+                that.createSearchHtml();
+
+            },1)
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var tableWidth = $("#border_" + that.id).width();
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                width:tableWidth,
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                method:'get',
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'EDIT'){
+                                that.addOrEdit(false,data.oid);
+                            }
+                        });
+                    }else{
+                        if(total>0) {
+                            table.selectRecord('table_' + that.id, {index:0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                }
+            };
+            if(parentFieldName){
+                options.treeConfig = {
+                    treepid:parentFieldName,
+                    treeid:'id',
+                    showField:'name'
+                };
+            }
+            table.render(options);
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),
+                    {
+                        title: '涓嬪彂鏃ユ湡',
+                        field: 'issueddate',
+                        width: 110,
+                        type:'date',
+                        templet: function (d) {
+                            return webUtil.formateDate(d.issueddate);
+                        }
+                    },
+                    {
+                        title: '鎵�灞炵鐮旂敓浜ц鍒�',
+                        field: 'pmsaleplanName',
+                        sort:true,
+                        sortField:'pmsaleplan',
+                        type:'refer',
+                        referConfig: {
+                            type:'default',
+                            referBo:'pmsaleplan'
+                        },
+                        width: 150
+                    },
+                    {
+                        field:'options',
+                        title:'鎿嶄綔',
+                        width:150,
+                        templet:function(d){
+                            return '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>';
+                        }
+                    }];
+            }
+        };
+
+        this.getFormItems = function(onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [
+                {
+                    field: 'issueddate',
+                    title: '涓嬪彂鏃ユ湡',
+                    type: 'date',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'pmsaleplan',
+                    title: '鎵�灞炵鐮旂敓浜ц鍒�',
+                    type: 'refer',
+                    showField: 'pmsaleplanName',
+                    referConfig: {
+                        type:'default',
+                        referBo:'pmsaleplan'
+                    },
+                    defaultValue:"",
+                    readOnly:onlyShow
+                }             ];
+        };
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            that.addOrEdit(false,oid);
+        };
+        this.addOrEdit = function(add,oid) {
+            var that = this;
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var addSaveIndex =webUtil.dialog({
+                title:add?'娣诲姞绉戠爺鐢熶骇璁″垝渚濇嵁':'淇敼绉戠爺鐢熶骇璁″垝渚濇嵁',
+                btn:['淇濆瓨','鍙栨秷'],
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getFormItems(false),
+                        function () {
+                            if(!add){
+                                form.load(filter,{
+                                    backPath:that.backPath,
+                                    url:that.url.controller + that.url.getObjectByOid,
+                                    method:'get',
+                                    params:{
+                                        oid:oid
+                                    }
+                                });
+                            }else{
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+                        }, {}, {defaultColumnOneRow: 2});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        var url = that.url.controller + (add?that.url.addSave:that.url.editSave);
+                        webUtil.manualAjax(add?'post':'put',url,JSON.stringify(values),function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts= webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+        this.refresh = function () {
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+        this.ADVQUERY = function () {
+            var that = this;
+            if(!that.serinorQueryInstance) {
+                var dynamicCondition = layui.dynamicCondition;
+                $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar' + that.id + '" class="layui-inline"></div>');
+                that.checkColumns();
+                var dataFields = [];
+                for(var i = 0 ; i < that.columns.length ; i ++){
+                    dataFields[i] = that.columns[i];
+                }
+                that.serinorQueryInstance = dynamicCondition.create({
+                    fields: dataFields//鏌ヨ瀛楁
+                    , tableId: "table_" + that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                    , type: "complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                    , queryCallBack: function (requestData) {//鏌ヨ涔嬪悗鐨刢allback
+
+                    }
+                });
+            }
+            that.serinorQueryInstance.open();
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/vciweb/mes/wrj/PmSalePlanRecord.js b/Source/platformProject/platform2022UI/vciweb/mes/wrj/PmSalePlanRecord.js
new file mode 100644
index 0000000..415a4a7
--- /dev/null
+++ b/Source/platformProject/platform2022UI/vciweb/mes/wrj/PmSalePlanRecord.js
@@ -0,0 +1,336 @@
+/**
+ * 绉戠爺鐢熶骇璁″垝鎶曚骇闇�姹傞〉闈�
+ * @author weidy
+ * @date 2022-03-19
+ */
+layui.define(['layer','element','form','table','dynamicCondition' ],function(exports){
+        var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "mes/wrj/PmSalePlanRecord";
+        this.moduleKey = "PmSalePlanRecord";
+        this.backPath =  configData.compatibility? path:configData.mesWrjService;
+        this.url = {
+            controller:'salePlanRecordController/',
+            dataGrid:'gridPmSalePlanRecord',
+            addSave:'addSave',
+            editSave:'editSave',
+            deleteUrl:'deleteData',
+            getObjectByOid:'getObjectByOid'
+        };
+        this.getContent=function(){
+            var that = this;
+            return '<div id="UIContent_' + that.id + '" style="overflow: auto;padding:0 5px"></div>';
+        };
+        this.showContent=function (){
+            var that = this;
+            var html = "";
+            html = [
+                        '<div class="layui-layout easyui-layout UIContentLayout"  id="easyuiLayout_',that.id,'" data-options="fit:true" style="display:block;overflow-y: hidden;margin:0 5px">',
+                            '<div data-options="region:\'center\'" style="padding-left: 10px;padding-right: 10px;" id="border_',that.id,'">',
+                                '<div class="layui-center" style="overflow-y:auto;">',
+                                    that.getToolbarHtml(),
+                                    '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                                '</div>',
+                            '</div>',
+                        '</div>'
+            ].join("");
+            $("#UIContent_"+that.id).html(html);
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.createSearchHtml({id:"缂栧彿",name:"鍚嶇О"} ,$("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+        };
+        this.defaultAttrList = [
+        'acceptancetime',
+        'makerequirement',
+        'pmsaleplan',
+            'id',
+            'name',
+            'description',
+            'oid',
+            'nameoid',
+            'revisionoid',
+            'btmname',
+            'islastr',
+            'isfirstr',
+            'islastv',
+            'isfirstv',
+            'creator',
+            'createtime',
+            'lastmodifier',
+            'lastmodifytime',
+            'revisionrule',
+            'revisionseq',
+            'revisionvalue',
+            'versionrule',
+            'versionseq',
+            'versionvalue',
+            'lctid',
+            'lcstatus',
+            'ts',
+            'owner',
+            'checkinby',
+            'checkintime',
+            'checkoutby',
+            'checkouttime',
+            'copyfromversion',
+            'secretgrade'
+        ];
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            //闇�瑕佸姞鍦ㄥ畾鏃朵腑锛屽惁鍒欐牱寮忎笉鑳芥纭睍绀猴紝涓嶇煡閬撳師鍥� wangting
+            setTimeout(function (){
+                that.showContent();
+                var easyuiLayout= $('#easyuiLayout_'+that.id)
+                easyuiLayout.css({height:$('#portal_body').height()-43,width:$('#portal_body').width()-15})
+                easyuiLayout.layout();
+
+                that.initMainTable();
+                that.createSearchHtml();
+
+            },1)
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var tableWidth = $("#border_" + that.id).width();
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                width:tableWidth,
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                method:'get',
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'EDIT'){
+                                that.addOrEdit(false,data.oid);
+                            }
+                        });
+                    }else{
+                        if(total>0) {
+                            table.selectRecord('table_' + that.id, {index:0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                }
+            };
+            if(parentFieldName){
+                options.treeConfig = {
+                    treepid:parentFieldName,
+                    treeid:'id',
+                    showField:'name'
+                };
+            }
+            table.render(options);
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),
+                    {
+                        title: '杈惧埌楠屾敹鐘舵�佹棩鏈�',
+                        field: 'acceptancetime',
+                        width: 130,
+                        type:'datetime',
+                        templet: function (d) {
+                            return webUtil.formateDateTimeNoSecond(d.acceptancetime);
+                        }
+                    },
+                    {
+                        title: '鎶曚骇闇�姹�',
+                        field: 'makerequirement',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '鎵�灞炵鐮旂敓浜ц鍒�',
+                        field: 'pmsaleplanName',
+                        sort:true,
+                        sortField:'pmsaleplan',
+                        type:'refer',
+                        referConfig: {
+                            type:'default',
+                            referBo:'pmsaleplan'
+                        },
+                        width: 150
+                    },
+                    {
+                        field:'options',
+                        title:'鎿嶄綔',
+                        width:150,
+                        templet:function(d){
+                            return '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>';
+                        }
+                    }];
+            }
+        };
+
+        this.getFormItems = function(onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [
+                {
+                    field: 'acceptancetime',
+                    title: '杈惧埌楠屾敹鐘舵�佹棩鏈�',
+                    type: 'datetime',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'makerequirement',
+                    title: '鎶曚骇闇�姹�',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'pmsaleplan',
+                    title: '鎵�灞炵鐮旂敓浜ц鍒�',
+                    type: 'refer',
+                    showField: 'pmsaleplanName',
+                    referConfig: {
+                        type:'default',
+                        referBo:'pmsaleplan'
+                    },
+                    defaultValue:"",
+                    readOnly:onlyShow
+                }             ];
+        };
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            that.addOrEdit(false,oid);
+        };
+        this.addOrEdit = function(add,oid) {
+            var that = this;
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var addSaveIndex =webUtil.dialog({
+                title:add?'娣诲姞绉戠爺鐢熶骇璁″垝鎶曚骇闇�姹�':'淇敼绉戠爺鐢熶骇璁″垝鎶曚骇闇�姹�',
+                btn:['淇濆瓨','鍙栨秷'],
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getFormItems(false),
+                        function () {
+                            if(!add){
+                                form.load(filter,{
+                                    backPath:that.backPath,
+                                    url:that.url.controller + that.url.getObjectByOid,
+                                    method:'get',
+                                    params:{
+                                        oid:oid
+                                    }
+                                });
+                            }else{
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+                        }, {}, {defaultColumnOneRow: 2});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        var url = that.url.controller + (add?that.url.addSave:that.url.editSave);
+                        webUtil.manualAjax(add?'post':'put',url,JSON.stringify(values),function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts= webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+        this.refresh = function () {
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+        this.ADVQUERY = function () {
+            var that = this;
+            if(!that.serinorQueryInstance) {
+                var dynamicCondition = layui.dynamicCondition;
+                $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar' + that.id + '" class="layui-inline"></div>');
+                that.checkColumns();
+                var dataFields = [];
+                for(var i = 0 ; i < that.columns.length ; i ++){
+                    dataFields[i] = that.columns[i];
+                }
+                that.serinorQueryInstance = dynamicCondition.create({
+                    fields: dataFields//鏌ヨ瀛楁
+                    , tableId: "table_" + that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                    , type: "complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                    , queryCallBack: function (requestData) {//鏌ヨ涔嬪悗鐨刢allback
+
+                    }
+                });
+            }
+            that.serinorQueryInstance.open();
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/vciweb/mes/wrj/PmSalePlanTarget.js b/Source/platformProject/platform2022UI/vciweb/mes/wrj/PmSalePlanTarget.js
new file mode 100644
index 0000000..3948cb8
--- /dev/null
+++ b/Source/platformProject/platform2022UI/vciweb/mes/wrj/PmSalePlanTarget.js
@@ -0,0 +1,395 @@
+/**
+ * 绉戠爺鐢熶骇椤圭洰椤甸潰
+ * @author weidy
+ * @date 2022-03-19
+ */
+layui.define(['layer','element','form','table','dynamicCondition' ],function(exports){
+        var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "mes/wrj/PmSalePlanTarget";
+        this.moduleKey = "PmSalePlanTarget";
+        this.backPath =  configData.compatibility? path:configData.mesWrjService;
+        this.url = {
+            controller:'salePlanTargetController/',
+            dataGrid:'gridPmSalePlanTarget',
+            addSave:'addSave',
+            editSave:'editSave',
+            deleteUrl:'deleteData',
+            getObjectByOid:'getObjectByOid'
+        };
+        this.getContent=function(){
+            var that = this;
+            return '<div id="UIContent_' + that.id + '" style="overflow: auto;padding:0 5px"></div>';
+        };
+        this.showContent=function (){
+            var that = this;
+            var html = "";
+            html = [
+                        '<div class="layui-layout easyui-layout UIContentLayout"  id="easyuiLayout_',that.id,'" data-options="fit:true" style="display:block;overflow-y: hidden;margin:0 5px">',
+                            '<div data-options="region:\'center\'" style="padding-left: 10px;padding-right: 10px;" id="border_',that.id,'">',
+                                '<div class="layui-center" style="overflow-y:auto;">',
+                                    that.getToolbarHtml(),
+                                    '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                                '</div>',
+                            '</div>',
+                        '</div>'
+            ].join("");
+            $("#UIContent_"+that.id).html(html);
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.createSearchHtml({id:"缂栧彿",name:"鍚嶇О"} ,$("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+        };
+        this.defaultAttrList = [
+        'pdmmodel',
+        'plandelivertime',
+        'pmsaleplan',
+        'targettype',
+        'targetusetype',
+        'vcsno',
+            'id',
+            'name',
+            'description',
+            'oid',
+            'nameoid',
+            'revisionoid',
+            'btmname',
+            'islastr',
+            'isfirstr',
+            'islastv',
+            'isfirstv',
+            'creator',
+            'createtime',
+            'lastmodifier',
+            'lastmodifytime',
+            'revisionrule',
+            'revisionseq',
+            'revisionvalue',
+            'versionrule',
+            'versionseq',
+            'versionvalue',
+            'lctid',
+            'lcstatus',
+            'ts',
+            'owner',
+            'checkinby',
+            'checkintime',
+            'checkoutby',
+            'checkouttime',
+            'copyfromversion',
+            'secretgrade'
+        ];
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            //闇�瑕佸姞鍦ㄥ畾鏃朵腑锛屽惁鍒欐牱寮忎笉鑳芥纭睍绀猴紝涓嶇煡閬撳師鍥� wangting
+            setTimeout(function (){
+                that.showContent();
+                var easyuiLayout= $('#easyuiLayout_'+that.id)
+                easyuiLayout.css({height:$('#portal_body').height()-43,width:$('#portal_body').width()-15})
+                easyuiLayout.layout();
+
+                that.initMainTable();
+                that.createSearchHtml();
+
+            },1)
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var tableWidth = $("#border_" + that.id).width();
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                width:tableWidth,
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                method:'get',
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'EDIT'){
+                                that.addOrEdit(false,data.oid);
+                            }
+                        });
+                    }else{
+                        if(total>0) {
+                            table.selectRecord('table_' + that.id, {index:0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                }
+            };
+            if(parentFieldName){
+                options.treeConfig = {
+                    treepid:parentFieldName,
+                    treeid:'id',
+                    showField:'name'
+                };
+            }
+            table.render(options);
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),
+                    {
+                        title: '鏈哄瀷',
+                        field: 'pdmmodelName',
+                        sort:true,
+                        sortField:'pdmmodel',
+                        type:'refer',
+                        referConfig: {
+                            type:'default',
+                            referBo:'workcontext'
+                        },
+                        width: 150
+                    },
+                    {
+                        title: '浜や粯鑺傜偣',
+                        field: 'plandelivertime',
+                        width: 130,
+                        type:'datetime',
+                        templet: function (d) {
+                            return webUtil.formateDateTimeNoSecond(d.plandelivertime);
+                        }
+                    },
+                    {
+                        title: '鎵�灞炵鐮旂敓浜ц鍒�',
+                        field: 'pmsaleplanName',
+                        sort:true,
+                        sortField:'pmsaleplan',
+                        type:'refer',
+                        referConfig: {
+                            type:'default',
+                            referBo:'pmsaleplan'
+                        },
+                        width: 150
+                    },
+                    {
+                        title: '鐩爣绫诲瀷',
+                        field: 'targettypeText',
+                        sort:true,
+                        sortField:'targettype',
+                        type:'combox',
+                        comboxKey:"salePlanTargetType",
+                        width: 150
+                    },
+                    {
+                        title: '鐢ㄩ�旂被鍨�',
+                        field: 'targetusetypeText',
+                        sort:true,
+                        sortField:'targetusetype',
+                        type:'combox',
+                        comboxKey:"saleTargetUseType",
+                        width: 150
+                    },
+                    {
+                        title: '椋庢姇鍙�',
+                        field: 'vcsno',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        field:'options',
+                        title:'鎿嶄綔',
+                        width:150,
+                        templet:function(d){
+                            return '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>';
+                        }
+                    }];
+            }
+        };
+
+        this.getFormItems = function(onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [
+                {
+                    field: 'pdmmodel',
+                    title: '鏈哄瀷',
+                    required: true,
+                    type: 'refer',
+                    showField: 'pdmmodelName',
+                    referConfig: {
+                        type:'default',
+                        referBo:'workcontext'
+                    },
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'plandelivertime',
+                    title: '浜や粯鑺傜偣',
+                    type: 'datetime',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'pmsaleplan',
+                    title: '鎵�灞炵鐮旂敓浜ц鍒�',
+                    type: 'refer',
+                    showField: 'pmsaleplanName',
+                    referConfig: {
+                        type:'default',
+                        referBo:'pmsaleplan'
+                    },
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'targettype',
+                    title: '鐩爣绫诲瀷',
+                    type: 'combox',
+                    comboxKey: 'salePlanTargetType',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'targetusetype',
+                    title: '鐢ㄩ�旂被鍨�',
+                    type: 'combox',
+                    comboxKey: 'saleTargetUseType',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'vcsno',
+                    title: '椋庢姇鍙�',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                }             ];
+        };
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            that.addOrEdit(false,oid);
+        };
+        this.addOrEdit = function(add,oid) {
+            var that = this;
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var addSaveIndex =webUtil.dialog({
+                title:add?'娣诲姞绉戠爺鐢熶骇椤圭洰':'淇敼绉戠爺鐢熶骇椤圭洰',
+                btn:['淇濆瓨','鍙栨秷'],
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getFormItems(false),
+                        function () {
+                            if(!add){
+                                form.load(filter,{
+                                    backPath:that.backPath,
+                                    url:that.url.controller + that.url.getObjectByOid,
+                                    method:'get',
+                                    params:{
+                                        oid:oid
+                                    }
+                                });
+                            }else{
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+                        }, {}, {defaultColumnOneRow: 2});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        var url = that.url.controller + (add?that.url.addSave:that.url.editSave);
+                        webUtil.manualAjax(add?'post':'put',url,JSON.stringify(values),function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts= webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+        this.refresh = function () {
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+        this.ADVQUERY = function () {
+            var that = this;
+            if(!that.serinorQueryInstance) {
+                var dynamicCondition = layui.dynamicCondition;
+                $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar' + that.id + '" class="layui-inline"></div>');
+                that.checkColumns();
+                var dataFields = [];
+                for(var i = 0 ; i < that.columns.length ; i ++){
+                    dataFields[i] = that.columns[i];
+                }
+                that.serinorQueryInstance = dynamicCondition.create({
+                    fields: dataFields//鏌ヨ瀛楁
+                    , tableId: "table_" + that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                    , type: "complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                    , queryCallBack: function (requestData) {//鏌ヨ涔嬪悗鐨刢allback
+
+                    }
+                });
+            }
+            that.serinorQueryInstance.open();
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/vciweb/mes/wrj/PmStationPlan.js b/Source/platformProject/platform2022UI/vciweb/mes/wrj/PmStationPlan.js
new file mode 100644
index 0000000..8d71123
--- /dev/null
+++ b/Source/platformProject/platform2022UI/vciweb/mes/wrj/PmStationPlan.js
@@ -0,0 +1,482 @@
+/**
+ * 绔欎綅璁″垝椤甸潰
+ * @author weidy
+ * @date 2022-03-19
+ */
+layui.define(['layer','element','form','table','dynamicCondition' ],function(exports){
+        var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "mes/wrj/PmStationPlan";
+        this.moduleKey = "PmStationPlan";
+        this.backPath =  configData.compatibility? path:configData.mesWrjService;
+        this.url = {
+            controller:'stationPlanController/',
+            dataGrid:'gridPmStationPlan',
+            addSave:'addSave',
+            editSave:'editSave',
+            deleteUrl:'deleteData',
+            getObjectByOid:'getObjectByOid'
+        };
+        this.getContent=function(){
+            var that = this;
+            return '<div id="UIContent_' + that.id + '" style="overflow: auto;padding:0 5px"></div>';
+        };
+        this.showContent=function (){
+            var that = this;
+            var html = "";
+            html = [
+                        '<div class="layui-layout easyui-layout UIContentLayout"  id="easyuiLayout_',that.id,'" data-options="fit:true" style="display:block;overflow-y: hidden;margin:0 5px">',
+                            '<div data-options="region:\'center\'" style="padding-left: 10px;padding-right: 10px;" id="border_',that.id,'">',
+                                '<div class="layui-center" style="overflow-y:auto;">',
+                                    that.getToolbarHtml(),
+                                    '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                                '</div>',
+                            '</div>',
+                        '</div>'
+            ].join("");
+            $("#UIContent_"+that.id).html(html);
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.createSearchHtml({id:"缂栧彿",name:"鍚嶇О"} ,$("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+        };
+        this.defaultAttrList = [
+        'actualenddate',
+        'actualstartdate',
+        'adjustenddate',
+        'adjuststartdate',
+        'currentpercent',
+        'pdmmodel',
+        'pdmmodelname',
+        'pdmstation',
+        'pdmstationname',
+        'planenddate',
+        'planstartdate',
+        'pmaloneplan',
+            'id',
+            'name',
+            'description',
+            'oid',
+            'nameoid',
+            'revisionoid',
+            'btmname',
+            'islastr',
+            'isfirstr',
+            'islastv',
+            'isfirstv',
+            'creator',
+            'createtime',
+            'lastmodifier',
+            'lastmodifytime',
+            'revisionrule',
+            'revisionseq',
+            'revisionvalue',
+            'versionrule',
+            'versionseq',
+            'versionvalue',
+            'lctid',
+            'lcstatus',
+            'ts',
+            'owner',
+            'checkinby',
+            'checkintime',
+            'checkoutby',
+            'checkouttime',
+            'copyfromversion',
+            'secretgrade'
+        ];
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            //闇�瑕佸姞鍦ㄥ畾鏃朵腑锛屽惁鍒欐牱寮忎笉鑳芥纭睍绀猴紝涓嶇煡閬撳師鍥� wangting
+            setTimeout(function (){
+                that.showContent();
+                var easyuiLayout= $('#easyuiLayout_'+that.id)
+                easyuiLayout.css({height:$('#portal_body').height()-43,width:$('#portal_body').width()-15})
+                easyuiLayout.layout();
+
+                that.initMainTable();
+                that.createSearchHtml();
+
+            },1)
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var tableWidth = $("#border_" + that.id).width();
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                width:tableWidth,
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                method:'get',
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'EDIT'){
+                                that.addOrEdit(false,data.oid);
+                            }
+                        });
+                    }else{
+                        if(total>0) {
+                            table.selectRecord('table_' + that.id, {index:0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                }
+            };
+            if(parentFieldName){
+                options.treeConfig = {
+                    treepid:parentFieldName,
+                    treeid:'id',
+                    showField:'name'
+                };
+            }
+            table.render(options);
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),
+                    {
+                        title: '瀹為檯缁撴潫鏃堕棿',
+                        field: 'actualenddate',
+                        width: 130,
+                        type:'datetime',
+                        templet: function (d) {
+                            return webUtil.formateDateTimeNoSecond(d.actualenddate);
+                        }
+                    },
+                    {
+                        title: '瀹為檯寮�濮嬫椂闂�',
+                        field: 'actualstartdate',
+                        width: 130,
+                        type:'datetime',
+                        templet: function (d) {
+                            return webUtil.formateDateTimeNoSecond(d.actualstartdate);
+                        }
+                    },
+                    {
+                        title: '璋冩暣缁撴潫鏃堕棿',
+                        field: 'adjustenddate',
+                        width: 130,
+                        type:'datetime',
+                        templet: function (d) {
+                            return webUtil.formateDateTimeNoSecond(d.adjustenddate);
+                        }
+                    },
+                    {
+                        title: '璋冩暣鍚庡紑濮嬫椂闂�',
+                        field: 'adjuststartdate',
+                        width: 130,
+                        type:'datetime',
+                        templet: function (d) {
+                            return webUtil.formateDateTimeNoSecond(d.adjuststartdate);
+                        }
+                    },
+                    {
+                        title: '褰撳墠杩涘害',
+                        field: 'currentpercent',
+                        type:'number',
+                        width: 100
+                    },
+                    {
+                        title: '鏈哄瀷',
+                        field: 'pdmmodelName',
+                        sort:true,
+                        sortField:'pdmmodel',
+                        type:'refer',
+                        referConfig: {
+                            type:'default',
+                            referBo:'workcontext'
+                        },
+                        width: 150
+                    },
+                    {
+                        title: '鏈哄瀷缂栧彿',
+                        field: 'pdmmodelname',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '绔欎綅涓婚敭',
+                        field: 'pdmstationName',
+                        sort:true,
+                        sortField:'pdmstation',
+                        type:'refer',
+                        referConfig: {
+                            type:'default',
+                            referBo:'mbomnode'
+                        },
+                        width: 150
+                    },
+                    {
+                        title: '绔欎綅鍚嶇О',
+                        field: 'pdmstationname',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '璁″垝瀹屾垚鏃堕棿',
+                        field: 'planenddate',
+                        width: 130,
+                        type:'datetime',
+                        templet: function (d) {
+                            return webUtil.formateDateTimeNoSecond(d.planenddate);
+                        }
+                    },
+                    {
+                        title: '璁″垝寮�濮嬫椂闂�',
+                        field: 'planstartdate',
+                        width: 130,
+                        type:'datetime',
+                        templet: function (d) {
+                            return webUtil.formateDateTimeNoSecond(d.planstartdate);
+                        }
+                    },
+                    {
+                        title: '鎵�灞炴灦娆¤鍒�',
+                        field: 'pmaloneplan',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        field:'options',
+                        title:'鎿嶄綔',
+                        width:150,
+                        templet:function(d){
+                            return '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>';
+                        }
+                    }];
+            }
+        };
+
+        this.getFormItems = function(onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [
+                {
+                    field: 'actualenddate',
+                    title: '瀹為檯缁撴潫鏃堕棿',
+                    type: 'datetime',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'actualstartdate',
+                    title: '瀹為檯寮�濮嬫椂闂�',
+                    type: 'datetime',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'adjustenddate',
+                    title: '璋冩暣缁撴潫鏃堕棿',
+                    type: 'datetime',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'adjuststartdate',
+                    title: '璋冩暣鍚庡紑濮嬫椂闂�',
+                    type: 'datetime',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'currentpercent',
+                    title: '褰撳墠杩涘害',
+                    verify: 'number',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'pdmmodel',
+                    title: '鏈哄瀷',
+                    required: true,
+                    type: 'refer',
+                    showField: 'pdmmodelName',
+                    referConfig: {
+                        type:'default',
+                        referBo:'workcontext'
+                    },
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'pdmmodelname',
+                    title: '鏈哄瀷缂栧彿',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'pdmstation',
+                    title: '绔欎綅涓婚敭',
+                    type: 'refer',
+                    showField: 'pdmstationName',
+                    referConfig: {
+                        type:'default',
+                        referBo:'mbomnode'
+                    },
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'pdmstationname',
+                    title: '绔欎綅鍚嶇О',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'planenddate',
+                    title: '璁″垝瀹屾垚鏃堕棿',
+                    type: 'datetime',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'planstartdate',
+                    title: '璁″垝寮�濮嬫椂闂�',
+                    required: true,
+                    type: 'datetime',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'pmaloneplan',
+                    title: '鎵�灞炴灦娆¤鍒�',
+                    required: true,
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                }             ];
+        };
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            that.addOrEdit(false,oid);
+        };
+        this.addOrEdit = function(add,oid) {
+            var that = this;
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var addSaveIndex =webUtil.dialog({
+                title:add?'娣诲姞绔欎綅璁″垝':'淇敼绔欎綅璁″垝',
+                btn:['淇濆瓨','鍙栨秷'],
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getFormItems(false),
+                        function () {
+                            if(!add){
+                                form.load(filter,{
+                                    backPath:that.backPath,
+                                    url:that.url.controller + that.url.getObjectByOid,
+                                    method:'get',
+                                    params:{
+                                        oid:oid
+                                    }
+                                });
+                            }else{
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+                        }, {}, {defaultColumnOneRow: 2});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        var url = that.url.controller + (add?that.url.addSave:that.url.editSave);
+                        webUtil.manualAjax(add?'post':'put',url,JSON.stringify(values),function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts= webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+        this.refresh = function () {
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+        this.ADVQUERY = function () {
+            var that = this;
+            if(!that.serinorQueryInstance) {
+                var dynamicCondition = layui.dynamicCondition;
+                $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar' + that.id + '" class="layui-inline"></div>');
+                that.checkColumns();
+                var dataFields = [];
+                for(var i = 0 ; i < that.columns.length ; i ++){
+                    dataFields[i] = that.columns[i];
+                }
+                that.serinorQueryInstance = dynamicCondition.create({
+                    fields: dataFields//鏌ヨ瀛楁
+                    , tableId: "table_" + that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                    , type: "complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                    , queryCallBack: function (requestData) {//鏌ヨ涔嬪悗鐨刢allback
+
+                    }
+                });
+            }
+            that.serinorQueryInstance.open();
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/vciweb/mes/wrj/PmYearPlan.js b/Source/platformProject/platform2022UI/vciweb/mes/wrj/PmYearPlan.js
new file mode 100644
index 0000000..9b3716f
--- /dev/null
+++ b/Source/platformProject/platform2022UI/vciweb/mes/wrj/PmYearPlan.js
@@ -0,0 +1,529 @@
+/**
+ * 骞村害鐢熶骇璁″垝椤甸潰
+ * @author weidy
+ * @date 2022-03-19
+ */
+layui.define(['layer','element','form','table','dynamicCondition' ],function(exports){
+        var webUtil = $webUtil;
+    var Class = function(){
+        this.MODELNAME = "mes/wrj/PmYearPlan";
+        this.moduleKey = "PmYearPlan";
+        this.backPath =  configData.compatibility? path:configData.mesWrjService;
+        this.url = {
+            controller:'yearMakePlanController/',
+            dataGrid:'gridPmYearPlan',
+            addSave:'addSave',
+            editSave:'editSave',
+            deleteUrl:'deleteData',
+            getObjectByOid:'getObjectByOid'
+        };
+        this.getContent=function(){
+            var that = this;
+            return '<div id="UIContent_' + that.id + '" style="overflow: auto;padding:0 5px"></div>';
+        };
+        this.showContent=function (){
+            var that = this;
+            var html = "";
+            html = [
+                        '<div class="layui-layout easyui-layout UIContentLayout"  id="easyuiLayout_',that.id,'" data-options="fit:true" style="display:block;overflow-y: hidden;margin:0 5px">',
+                            '<div data-options="region:\'center\'" style="padding-left: 10px;padding-right: 10px;" id="border_',that.id,'">',
+                                '<div class="layui-center" style="overflow-y:auto;">',
+                                    that.getToolbarHtml(),
+                                    '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+                                '</div>',
+                            '</div>',
+                        '</div>'
+            ].join("");
+            $("#UIContent_"+that.id).html(html);
+        };
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADD"><i class="layui-icon layui-icon-add-1"></i>娣诲姞</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_ADVQUERY"><i class="layui-icon layui-icon-search"></i>鏌ヨ</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_DEL"><i class="layui-icon layui-icon-delete"></i>鍒犻櫎</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_EDIT"><i class="layui-icon layui-icon-edit"></i>淇敼</button>',
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_refresh"><i class="layui-icon layui-icon-refresh"></i>鍒锋柊</button>',
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+            webUtil.createSearchHtml({id:"缂栧彿",name:"鍚嶇О"} ,$("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+        };
+        this.defaultAttrList = [
+        'actualenddate',
+        'actualstartdate',
+        'adjustenddate',
+        'adjuststartdate',
+        'bodydelivertime',
+        'currentpercent',
+        'pdmmodel',
+        'plandelivertime',
+        'planstartdate',
+        'pmplaneplan',
+        'pmplaneplanname',
+        'pmsaleplantarget',
+        'pmsaleplantargetname',
+        'targetusetype',
+        'vcsno',
+            'id',
+            'name',
+            'description',
+            'oid',
+            'nameoid',
+            'revisionoid',
+            'btmname',
+            'islastr',
+            'isfirstr',
+            'islastv',
+            'isfirstv',
+            'creator',
+            'createtime',
+            'lastmodifier',
+            'lastmodifytime',
+            'revisionrule',
+            'revisionseq',
+            'revisionvalue',
+            'versionrule',
+            'versionseq',
+            'versionvalue',
+            'lctid',
+            'lcstatus',
+            'ts',
+            'owner',
+            'checkinby',
+            'checkintime',
+            'checkoutby',
+            'checkouttime',
+            'copyfromversion',
+            'secretgrade'
+        ];
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            //闇�瑕佸姞鍦ㄥ畾鏃朵腑锛屽惁鍒欐牱寮忎笉鑳芥纭睍绀猴紝涓嶇煡閬撳師鍥� wangting
+            setTimeout(function (){
+                that.showContent();
+                var easyuiLayout= $('#easyuiLayout_'+that.id)
+                easyuiLayout.css({height:$('#portal_body').height()-43,width:$('#portal_body').width()-15})
+                easyuiLayout.layout();
+
+                that.initMainTable();
+                that.createSearchHtml();
+
+            },1)
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var tableWidth = $("#border_" + that.id).width();
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                width:tableWidth,
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                method:'get',
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'EDIT'){
+                                that.addOrEdit(false,data.oid);
+                            }
+                        });
+                    }else{
+                        if(total>0) {
+                            table.selectRecord('table_' + that.id, {index:0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                }
+            };
+            if(parentFieldName){
+                options.treeConfig = {
+                    treepid:parentFieldName,
+                    treeid:'id',
+                    showField:'name'
+                };
+            }
+            table.render(options);
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),
+                    {
+                        title: '瀹為檯缁撴潫鏃堕棿',
+                        field: 'actualenddate',
+                        width: 130,
+                        type:'datetime',
+                        templet: function (d) {
+                            return webUtil.formateDateTimeNoSecond(d.actualenddate);
+                        }
+                    },
+                    {
+                        title: '瀹為檯寮�濮嬫椂闂�',
+                        field: 'actualstartdate',
+                        width: 130,
+                        type:'datetime',
+                        templet: function (d) {
+                            return webUtil.formateDateTimeNoSecond(d.actualstartdate);
+                        }
+                    },
+                    {
+                        title: '璋冩暣缁撴潫鏃堕棿',
+                        field: 'adjustenddate',
+                        width: 130,
+                        type:'datetime',
+                        templet: function (d) {
+                            return webUtil.formateDateTimeNoSecond(d.adjustenddate);
+                        }
+                    },
+                    {
+                        title: '璋冩暣鍚庡紑濮嬫椂闂�',
+                        field: 'adjuststartdate',
+                        width: 130,
+                        type:'datetime',
+                        templet: function (d) {
+                            return webUtil.formateDateTimeNoSecond(d.adjuststartdate);
+                        }
+                    },
+                    {
+                        title: 'bodyDeliverTime',
+                        field: 'bodydelivertime',
+                        width: 130,
+                        type:'datetime',
+                        templet: function (d) {
+                            return webUtil.formateDateTimeNoSecond(d.bodydelivertime);
+                        }
+                    },
+                    {
+                        title: '褰撳墠杩涘害',
+                        field: 'currentpercent',
+                        type:'number',
+                        width: 100
+                    },
+                    {
+                        title: '鏈哄瀷',
+                        field: 'pdmmodelName',
+                        sort:true,
+                        sortField:'pdmmodel',
+                        type:'refer',
+                        referConfig: {
+                            type:'default',
+                            referBo:'workcontext'
+                        },
+                        width: 150
+                    },
+                    {
+                        title: '浜や粯鑺傜偣',
+                        field: 'plandelivertime',
+                        width: 130,
+                        type:'datetime',
+                        templet: function (d) {
+                            return webUtil.formateDateTimeNoSecond(d.plandelivertime);
+                        }
+                    },
+                    {
+                        title: '璁″垝寮�濮嬫椂闂�',
+                        field: 'planstartdate',
+                        width: 130,
+                        type:'datetime',
+                        templet: function (d) {
+                            return webUtil.formateDateTimeNoSecond(d.planstartdate);
+                        }
+                    },
+                    {
+                        title: '鏈轰綋璁″垝',
+                        field: 'pmplaneplanName',
+                        sort:true,
+                        sortField:'pmplaneplan',
+                        type:'refer',
+                        referConfig: {
+                            type:'default',
+                            referBo:'pmplaneplan'
+                        },
+                        width: 150
+                    },
+                    {
+                        title: 'pmPlanePlanName',
+                        field: 'pmplaneplanname',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '绉戠爺鐢熶骇椤圭洰涓婚敭',
+                        field: 'pmsaleplantarget',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '绉戠爺鐢熶骇椤圭洰缂栧彿',
+                        field: 'pmsaleplantargetname',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        title: '鐢ㄩ�旂被鍨�',
+                        field: 'targetusetypeText',
+                        sort:true,
+                        sortField:'targetusetype',
+                        type:'combox',
+                        comboxKey:"saleTargetUseType",
+                        width: 150
+                    },
+                    {
+                        title: '椋庢姇鍙�',
+                        field: 'vcsno',
+                        sort:true,
+                        width: 150
+                    },
+                    {
+                        field:'options',
+                        title:'鎿嶄綔',
+                        width:150,
+                        templet:function(d){
+                            return '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>';
+                        }
+                    }];
+            }
+        };
+
+        this.getFormItems = function(onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [
+                {
+                    field: 'actualenddate',
+                    title: '瀹為檯缁撴潫鏃堕棿',
+                    type: 'datetime',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'actualstartdate',
+                    title: '瀹為檯寮�濮嬫椂闂�',
+                    type: 'datetime',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'adjustenddate',
+                    title: '璋冩暣缁撴潫鏃堕棿',
+                    type: 'datetime',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'adjuststartdate',
+                    title: '璋冩暣鍚庡紑濮嬫椂闂�',
+                    type: 'datetime',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'bodydelivertime',
+                    title: 'bodyDeliverTime',
+                    type: 'datetime',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'currentpercent',
+                    title: '褰撳墠杩涘害',
+                    verify: 'number',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'pdmmodel',
+                    title: '鏈哄瀷',
+                    required: true,
+                    type: 'refer',
+                    showField: 'pdmmodelName',
+                    referConfig: {
+                        type:'default',
+                        referBo:'workcontext'
+                    },
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'plandelivertime',
+                    title: '浜や粯鑺傜偣',
+                    type: 'datetime',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'planstartdate',
+                    title: '璁″垝寮�濮嬫椂闂�',
+                    required: true,
+                    type: 'datetime',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'pmplaneplan',
+                    title: '鏈轰綋璁″垝',
+                    required: true,
+                    type: 'refer',
+                    showField: 'pmplaneplanName',
+                    referConfig: {
+                        type:'default',
+                        referBo:'pmplaneplan'
+                    },
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'pmplaneplanname',
+                    title: 'pmPlanePlanName',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'pmsaleplantarget',
+                    title: '绉戠爺鐢熶骇椤圭洰涓婚敭',
+                    required: true,
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'pmsaleplantargetname',
+                    title: '绉戠爺鐢熶骇椤圭洰缂栧彿',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'targetusetype',
+                    title: '鐢ㄩ�旂被鍨�',
+                    type: 'combox',
+                    comboxKey: 'saleTargetUseType',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                } ,                {
+                    field: 'vcsno',
+                    title: '椋庢姇鍙�',
+                    type: 'text',
+                    defaultValue:"",
+                    readOnly:onlyShow
+                }             ];
+        };
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            that.addOrEdit(false,oid);
+        };
+        this.addOrEdit = function(add,oid) {
+            var that = this;
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var addSaveIndex =webUtil.dialog({
+                title:add?'娣诲姞骞村害鐢熶骇璁″垝':'淇敼骞村害鐢熶骇璁″垝',
+                btn:['淇濆瓨','鍙栨秷'],
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getFormItems(false),
+                        function () {
+                            if(!add){
+                                form.load(filter,{
+                                    backPath:that.backPath,
+                                    url:that.url.controller + that.url.getObjectByOid,
+                                    method:'get',
+                                    params:{
+                                        oid:oid
+                                    }
+                                });
+                            }else{
+                                var defaultValues = {};
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+                        }, {}, {defaultColumnOneRow: 2});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        var url = that.url.controller + (add?that.url.addSave:that.url.editSave);
+                        webUtil.manualAjax(add?'post':'put',url,JSON.stringify(values),function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function(){
+            var that = this;
+            var oid = webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts= webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+        };
+        this.refresh = function () {
+            var that = this;
+            layui.table.reload("table_" + that.id);
+        };
+        this.ADVQUERY = function () {
+            var that = this;
+            if(!that.serinorQueryInstance) {
+                var dynamicCondition = layui.dynamicCondition;
+                $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar' + that.id + '" class="layui-inline"></div>');
+                that.checkColumns();
+                var dataFields = [];
+                for(var i = 0 ; i < that.columns.length ; i ++){
+                    dataFields[i] = that.columns[i];
+                }
+                that.serinorQueryInstance = dynamicCondition.create({
+                    fields: dataFields//鏌ヨ瀛楁
+                    , tableId: "table_" + that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                    , type: "complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                    , queryCallBack: function (requestData) {//鏌ヨ涔嬪悗鐨刢allback
+
+                    }
+                });
+            }
+            that.serinorQueryInstance.open();
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/platform2022UI/vciweb/vciAlias.js b/Source/platformProject/platform2022UI/vciweb/vciAlias.js
new file mode 100644
index 0000000..59233a1
--- /dev/null
+++ b/Source/platformProject/platform2022UI/vciweb/vciAlias.js
@@ -0,0 +1,102 @@
+/**
+ * Created by weidy on 2018/5/4.
+ * 鍒悕锛屽鏋滈渶瑕佺殑閮藉彲浠ュ湪杩欓噷瀹氫箟   ----鐗瑰埆娉ㄦ剰锛屽畾涔夌殑鍐呭涓笉鑳藉惊鐜紩鐢�
+ */
+layui.define([],function(exports){
+    var VciAlias = function() {
+        this.alias = {
+        };
+    };
+    VciAlias.prototype.configAlias = function(){
+        var that = this;
+        layui.extend(that.alias);
+        layui.use('vciWebRefer',function (){
+            layui.vciWebRefer.initReferRegister(that.platformRefer);
+            layui.vciWebRefer.initReferRegister(that.scmRefer);
+            layui.vciWebRefer.initReferRegister(that.crmRefer);
+            layui.vciWebRefer.initReferRegister(that.invmRefer);
+            layui.vciWebRefer.initReferRegister(that.pdmRefer);
+            layui.vciWebRefer.initReferRegister(that.mpmRefer);
+            layui.vciWebRefer.initReferRegister(that.mdmRefer);
+            layui.vciWebRefer.initReferRegister(that.referRegister);
+            if( layui.vciWebRefer.defaultRefer){
+                for(var key in layui.vciWebRefer.defaultRefer){
+                    that.referRegister[key] = layui.vciWebRefer.defaultRefer[key];
+                }
+            }
+        });
+    };
+    VciAlias.prototype.baseRefer = {
+        //骞冲彴鍩虹鐨勫弬鐓э紝鏀惧湪杩欎富瑕佹柟渚挎煡鐪�
+        /**
+         * 閮ㄩ棬鏍�
+         */
+        departmentRefer:'refer/OrgDepartmentRefer',
+        /**
+         * 閮ㄩ棬鍒楄〃
+         */
+        departmentGridRefer:'refer/OrgDepartmentGridRefer',
+        /**
+         * 鐢ㄦ埛,榛樿鏄樉绀哄父鐢紝瑙掕壊锛岄儴闂ㄥ拰鐢ㄦ埛銆傚彲浠ラ厤缃槸鍚︽樉绀哄伐绉嶇瓑閫夐」鍗�
+         */
+        userRefer:'refer/SmUserRefer',
+        /**
+         * 浠呬粎鐢ㄦ埛鐨勫垪琛�
+         */
+        onlyUserRefer:'refer/SmUserGridRefer',
+        /**
+         * 瑙掕壊鍒楄〃
+         */
+        roleRefer:'refer/SmRoleRefer',
+        /**
+         * 鑱屽姟
+         */
+        dutyRefer:'refer/OrgDutyRefer',
+
+        /**
+         * 宀椾綅
+         */
+        jobRefer:(configData.compatibility?'':'refer/OrgJobRefer'),
+
+        /**
+         * 宸ョ
+         */
+        workTypeRefer:(configData.compatibility?'':'refer/SmWorkTypeRefer'),
+        /**
+         * 娴佺▼妯℃澘
+         */
+        processTempRefer:(configData.compatibility?"refer/WfProcessTemplateRefer":'')
+    };
+    VciAlias.prototype.platformRefer = {
+        //骞冲彴鐩稿叧鐨勫叾浠栫殑鍙傜収閰嶇疆
+        /**
+         * 渚涘簲鍟�
+         */
+        supplier:'platform/basedoc/BdSupplierRefer'
+    };
+    VciAlias.prototype.scmRefer = {
+        //渚涘簲閾剧浉鍏崇殑鍙傜収閰嶇疆
+
+    };
+    VciAlias.prototype.crmRefer = {
+        //瀹㈡埛鐩稿叧鐨勫弬鐓ч厤缃�
+    };
+    VciAlias.prototype.invmRefer = {
+        //搴撳瓨鐩稿叧鐨勫弬鐓ч厤缃�
+    };
+    VciAlias.prototype.pdmRefer = {
+        //pdm鐩稿叧鐨勫弬鐓ч厤缃�
+    };
+    VciAlias.prototype.mpmRefer = {
+        //mpm鐩稿叧鐨勫弬鐓ч厤缃�
+    };
+    VciAlias.prototype.mdmRefer = {
+
+    };
+    VciAlias.prototype.referRegister = {
+        //杩欓噷闈㈠彧鏀捐嚜宸遍」鐩殑鍙傜収閰嶇疆
+        //濡傛灉鑷繁椤圭洰鍙兘琚叾浠栫殑浣跨敤锛岃鏀惧埌涓�涓叕鍏辩殑灞炴�ч噷锛岀劧鍚庡湪configAlias鐨勬椂鍊欒皟鐢�
+    };
+    var va = new VciAlias();
+    exports("vciAlias",va);
+});
diff --git a/Source/platformProject/platform2022UI/vciweb/view/showDetail.js b/Source/platformProject/platform2022UI/vciweb/view/showDetail.js
new file mode 100644
index 0000000..cb083a4
--- /dev/null
+++ b/Source/platformProject/platform2022UI/vciweb/view/showDetail.js
@@ -0,0 +1,75 @@
+/**
+ * 鑷畾涔夐〉闈㈠睍绀�
+ * @author wangting
+ * @date 2021-6-1
+ */
+layui.define(['layer','element','flow'],function(exports){
+    var webUtil = $webUtil;
+    var Class = function() {
+        this.MODELNAME = "view/showDetail";
+        this.moduleKey = "showDetail";
+        this.backPath = configData.compatibility?path:configData.objectServicePath;
+        this.url = {
+        };
+        //蹇呮湁
+        this.getContent = function (id,options) {
+            var that = this;
+            that.id=id;
+            var html = [
+                '<div class="showDetail" id="showDetail_',id,'" lay-filter="showDetail_',id,'" style="display:block;"></div>'
+            ].join("");
+            return html;
+        };
+        //蹇呮湁
+        this.init = function (id, options) {
+            var that = this;
+            webUtil.copyConfig(that, that.moduleKey);
+            that.id=id;
+
+            $.extend(that.sourceData,options);
+
+            that.options=options;
+        };
+
+        //蹇呮湁锛屽睍绀篣I鍐呭
+        this.loadForUI=function (sourceData) {
+            if (!sourceData) {
+                return;
+            }
+            var that = this;
+            var baseAction = layui['BaseAction'];
+            baseAction.callPreEvent(that.options, that, function (options) {
+                that.doLoad(sourceData, function () {
+                    baseAction.callPostEvent(that.options, that, that.options.callback);
+                });
+            });
+        }
+
+        this.doLoad=function (sourceData,callback){
+            var that = this;
+            $("#showDetail_"+that.id).empty();
+            var html=''
+            for (var i in sourceData){
+                html+=i+'锛� '+sourceData[i]+'<hr/>'
+            }
+            $("#showDetail_"+that.id).html(html)
+            if(callback){
+                callback()
+            }
+        }
+
+
+        this.refresh = function(){
+            var that = this;
+
+        };
+
+        this.destory = function(){
+            var that = this;
+            var filter = "showDetail_" + that.id;
+            $('#'+filter).remove()
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/pom.xml b/Source/platformProject/pom.xml
new file mode 100644
index 0000000..f740a56
--- /dev/null
+++ b/Source/platformProject/pom.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <modules>
+        <module>vci-platform-web</module>
+        <module>vci-platform-starter</module>
+        <module>vci-platform-server-starter</module>
+    </modules>
+    <groupId>com.vci</groupId>
+    <artifactId>platform-parent</artifactId>
+    <version>2022.1-SNAPSHOT</version>
+    <packaging>pom</packaging>
+    <properties>
+        <vciplt.version>2022.RELEASE</vciplt.version>
+        <old.spring.version>3.2.0.RELEASE</old.spring.version>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <java.version>1.8</java.version>
+    </properties>
+    <distributionManagement>
+        <repository>
+            <id>rdc-releases</id>
+            <url>http://nexus.vci-tech.com:9000/repository/maven-releases/</url>
+        </repository>
+        <snapshotRepository>
+            <id>rdc-snapshots</id>
+            <url>http://nexus.vci-tech.com:9000/repository/maven-snapshots/</url>
+        </snapshotRepository>
+    </distributionManagement>
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>com.vci</groupId>
+                <artifactId>vci-platform-starter</artifactId>
+                <version>2022.1-SNAPSHOT</version>
+            </dependency>
+            <dependency>
+                <groupId>com.vci</groupId>
+                <artifactId>vci-platform-server-starter</artifactId>
+                <version>2022.1-SNAPSHOT</version>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.2</version>
+                <configuration>
+                    <encoding>${project.build.sourceEncoding}</encoding>
+                    <source>${java.version}</source>
+                    <target>${java.version}</target>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-source-plugin</artifactId>
+                <version>2.4</version>
+                <executions>
+                    <execution>
+                        <id>attach-sources</id>
+                        <goals>
+                            <goal>jar</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+</project>
\ No newline at end of file
diff --git a/Source/platformProject/vci-platform-server-starter/pom.xml b/Source/platformProject/vci-platform-server-starter/pom.xml
new file mode 100644
index 0000000..037d784
--- /dev/null
+++ b/Source/platformProject/vci-platform-server-starter/pom.xml
@@ -0,0 +1,585 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>platform-parent</artifactId>
+        <groupId>com.vci</groupId>
+        <version>2022.1-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>vci-platform-server-starter</artifactId>
+    <version>2022.1-SNAPSHOT</version>
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+    </properties>
+    <dependencies>
+        <dependency><!--灞炴��-->
+            <groupId>com.vci.platform</groupId>
+            <artifactId>plm-omd-server</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+
+        <dependency><!--鐘舵�佹睜-->
+            <groupId>com.vci.platform</groupId>
+            <artifactId>plm-statePool-server</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency><!--鐢熷懡鍛ㄦ湡-->
+            <groupId>com.vci.platform</groupId>
+            <artifactId>plm-lifeCycle-server</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency><!--鐗堟湰瑙勫垯-->
+            <groupId>com.vci.platform</groupId>
+            <artifactId>plm-versionRule-server</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency><!--涓氬姟绫诲瀷-->
+            <groupId>com.vci.platform</groupId>
+            <artifactId>plm-btm-server</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency><!--閾炬帴绫诲瀷-->
+            <groupId>com.vci.platform</groupId>
+            <artifactId>plm-ltm-server</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency><!--鏋氫妇-->
+            <groupId>com.vci.platform</groupId>
+            <artifactId>plm-enum-server</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+
+        <dependency><!--鏌ヨ妯℃澘-->
+            <groupId>com.vci.platform</groupId>
+            <artifactId>plm-oq-server</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+
+        <dependency><!--鍏宠仈鏌ヨ锛屾煡璇㈡ā鏉块渶瑕佷娇鐢ㄥ叧鑱旀煡璇�-->
+            <groupId>com.vci.platform</groupId>
+            <artifactId>RefQuery_server</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+
+<!--        <dependency>&lt;!&ndash;鏉冮檺绠$悊锛屾巿鏉冩帶鍒�,鍔熻兘鏉冮檺锛屾暟鎹潈闄愶紝UI鏉冮檺&ndash;&gt;-->
+<!--            <groupId>com.vci.platform</groupId>-->
+<!--            <artifactId>GrandPermission_server</artifactId>-->
+<!--            <version>${vciplt.version}</version>-->
+<!--        </dependency>-->
+        <dependency><!--VciBase鍩虹鍖�-->
+            <groupId>com.vci.platform</groupId>
+            <artifactId>VCIBase-server</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency><!--骞冲彴涓昏鏈嶅姟-->
+            <groupId>com.vci.platform</groupId>
+            <artifactId>rmip-system-server</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency><!--瀹氭椂鍣�-->
+            <groupId>com.vci.platform</groupId>
+            <artifactId>vci-timer-server</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency><!--涓氬姟绫诲瀷宸ュ巶锛屼富瑕佹槸鐢ㄤ簬瀵逛笟鍔$被鍨嬬殑鏁版嵁鎿嶄綔锛堝尯鍒笟鍔$被鍨嬬殑鍖咃紝涓氬姟绫诲瀷鐨勫寘涓昏鏄畾涔変笟鍔$被鍨嬶級-->
+            <groupId>com.vci.platform</groupId>
+            <artifactId>BOFactory-server</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency><!--澶氳宸ュ叿-->
+            <groupId>com.vci.platform</groupId>
+            <artifactId>Authentication_server</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+<!--        <dependency>&lt;!&ndash;UI鏈嶅姟&ndash;&gt;-->
+<!--            <groupId>com.vci.platform</groupId>-->
+<!--            <artifactId>UIService-server</artifactId>-->
+<!--            <version>${vciplt.version}</version>-->
+<!--        </dependency>-->
+        <dependency>
+            <groupId>com.vci.platform</groupId>
+            <artifactId>UIService-server</artifactId>
+            <version>2024.RELEASE</version>
+            <scope>system</scope>
+            <systemPath>D:/work/newplatform/Bin/lib/service/UIService.jar</systemPath>
+        </dependency>
+        <dependency><!--UI宸ュ巶锛岄儴鍒唈ar寮曠敤-->
+            <groupId>com.vci.platform</groupId>
+            <artifactId>UIF-server</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.vci.platform</groupId>
+            <artifactId>ddlTool-server</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.vci.platform</groupId>
+            <artifactId>ddlTool-client</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.vci.platform</groupId>
+            <artifactId>ddlTool-common</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.vci.platform</groupId>
+            <artifactId>Report-server</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.vci.platform</groupId>
+            <artifactId>VCIPLM_FileObjects_server</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.vci.platform</groupId>
+            <artifactId>VCIPLM_VersionObjects_server</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.vci.platform</groupId>
+            <artifactId>VCICache-server</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.vci.platform</groupId>
+            <artifactId>VCICache-client</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.vci.platform</groupId>
+            <artifactId>VCICache-common</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.vci.platform</groupId>
+            <artifactId>PlatformOptions_server</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+
+        <dependency><!--娴佺▼鏈嶅姟-->
+            <groupId>com.vci.platform</groupId>
+            <artifactId>vciwf-common</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.vci.platform</groupId>
+            <artifactId>vciwf-workitem</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.vci.platform</groupId>
+            <artifactId>vciwf-client</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.vci.platform</groupId>
+            <artifactId>vciwf-server</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency><!--hibernate-->
+            <groupId>org.hibernate</groupId>
+            <artifactId>hibernate-core</artifactId>
+            <version>3.6.1.Final</version>
+        </dependency>
+        <dependency>
+            <groupId>org.hibernate</groupId>
+            <artifactId>hibernate-jpa-api</artifactId>
+            <version>1.0.Final</version>
+        </dependency>
+        <dependency>
+            <groupId>org.javassist</groupId>
+            <artifactId>javassist</artifactId>
+            <version>3.20.0-GA</version>
+        </dependency>
+        <dependency>
+            <groupId>org.glassfish.web</groupId>
+            <artifactId>javax.el</artifactId>
+            <version>2.2.6</version>
+        </dependency>
+        <!--oracle椹卞姩鐩稿叧-->
+        <dependency>
+            <groupId>com.oracle</groupId>
+            <artifactId>ojdbc6</artifactId>
+            <version>11.2.0.4.0-atlassian-hosted</version>
+        </dependency>
+        <dependency>
+            <groupId>cn.easyproject</groupId>
+            <artifactId>xdb6</artifactId>
+            <version>11.2.0.4</version>
+        </dependency>
+        <dependency>
+            <groupId>cn.easyproject</groupId>
+            <artifactId>orai18n</artifactId>
+            <version>11.2.0.4</version>
+        </dependency>
+        <dependency>
+            <groupId>javax.transation</groupId>
+            <artifactId>jta</artifactId>
+            <version>1.1</version>
+        </dependency>
+        <dependency>
+            <groupId>c3p0</groupId>
+            <artifactId>c3p0</artifactId>
+            <version>0.9.1</version>
+        </dependency>
+        <dependency>
+            <groupId>com.mchange</groupId>
+            <artifactId>mchange-commons-java</artifactId>
+            <version>0.2.3.4</version>
+        </dependency>
+
+        <!--鍏朵粬寮曞叆鐨刯ar-->
+        <dependency>
+            <groupId>com.vci.three</groupId>
+            <artifactId>avalon-framework</artifactId>
+            <version>4.2.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.vci.three</groupId>
+            <artifactId>barcode4j</artifactId>
+            <version>1.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.vci.three</groupId>
+            <artifactId>jbarcode</artifactId>
+            <version>0.2.8</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.vci.three</groupId>
+            <artifactId>JBarcode-Recognition_Source</artifactId>
+            <version>0.2</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.vci.three</groupId>
+            <artifactId>quartz-all</artifactId>
+            <version>1.8.6</version>
+        </dependency>
+        <dependency>
+            <groupId>com.belerweb</groupId>
+            <artifactId>pinyin4j</artifactId>
+            <version>2.5.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.vci.three</groupId>
+            <artifactId>jgraph</artifactId>
+            <version>1.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.vci.three</groupId>
+            <artifactId>jgraphx</artifactId>
+            <version>1.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.vci.three</groupId>
+            <artifactId>AntExt</artifactId>
+            <version>1.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.vci.three</groupId>
+            <artifactId>antlr</artifactId>
+            <version>2.7.6</version>
+        </dependency>
+        <dependency>
+            <groupId>com.vci.three</groupId>
+            <artifactId>wsdl4j</artifactId>
+            <version>1.5.1</version>
+        </dependency>
+        <dependency>
+            <groupId>com.vci.three</groupId>
+            <artifactId>xerces</artifactId>
+            <version>2.9.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.vci.three</groupId>
+            <artifactId>xercesSamples</artifactId>
+            <version>1.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.vci.three</groupId>
+            <artifactId>XmlSchema</artifactId>
+            <version>1.1</version>
+        </dependency>
+        <dependency>
+            <groupId>com.vci.three</groupId>
+            <artifactId>xmlsec</artifactId>
+            <version>1.3.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.vci.three</groupId>
+            <artifactId>xwork-core</artifactId>
+            <version>2.3.20</version>
+        </dependency>
+
+        <!--绗笁鏂筳ar-->
+        <dependency>
+            <groupId>aopalliance</groupId>
+            <artifactId>aopalliance</artifactId>
+            <version>1.0</version>
+        </dependency>
+
+        <dependency><!--娉ㄨВ-->
+            <groupId>javax.annotation</groupId>
+            <artifactId>javax.annotation-api</artifactId>
+            <version>1.2</version>
+        </dependency>
+        <dependency>
+            <groupId>wsdl4j</groupId>
+            <artifactId>wsdl4j</artifactId>
+            <version>1.6.3</version>
+        </dependency>
+        <dependency>
+            <groupId>org.quartz-scheduler</groupId>
+            <artifactId>quartz</artifactId>
+            <version>2.1.3</version>
+        </dependency>
+        <dependency><!--娴佺▼閭d釜涓嶇煡閬撲负鍟ヨ鐢╝xis閲岀殑springUtils-->
+            <groupId>org.apache.axis</groupId>
+            <artifactId>axis</artifactId>
+            <version>1.4</version>
+        </dependency>
+        <!-- spring3 -->
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-core</artifactId>
+            <version>${old.spring.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-context</artifactId>
+            <version>${old.spring.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-jdbc</artifactId>
+            <version>${old.spring.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-beans</artifactId>
+            <version>${old.spring.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-expression</artifactId>
+            <version>${old.spring.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-orm</artifactId>
+            <version>${old.spring.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-test</artifactId>
+            <version>${old.spring.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.9</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.aspectj</groupId>
+            <artifactId>aspectjrt</artifactId>
+            <version>1.7.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.aspectj</groupId>
+            <artifactId>aspectjweaver</artifactId>
+            <version>1.8.9</version>
+        </dependency>
+        <dependency>
+            <groupId>cglib</groupId>
+            <artifactId>cglib</artifactId>
+            <version>2.2.2</version>
+        </dependency>
+
+
+        <dependency><!--鎿嶄綔xml闇�瑕�-->
+            <groupId>dom4j</groupId>
+            <artifactId>dom4j</artifactId>
+            <version>1.6.1</version>
+        </dependency>
+        <!--commons鐨勫嚑涓粍浠�-->
+        <dependency>
+            <groupId>commons-net</groupId>
+            <artifactId>commons-net</artifactId>
+            <version>1.4.1</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>2.5</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-fileupload</groupId>
+            <artifactId>commons-fileupload</artifactId>
+            <version>1.3.1</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-beanutils</groupId>
+            <artifactId>commons-beanutils</artifactId>
+            <version>1.7.0</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-codec</groupId>
+            <artifactId>commons-codec</artifactId>
+            <version>1.3</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-collections</groupId>
+            <artifactId>commons-collections</artifactId>
+            <version>3.1</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-dbcp</groupId>
+            <artifactId>commons-dbcp</artifactId>
+            <version>1.1</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-discovery</groupId>
+            <artifactId>commons-discovery</artifactId>
+            <version>0.2</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-httpclient</groupId>
+            <artifactId>commons-httpclient</artifactId>
+            <version>3.0</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-lang</groupId>
+            <artifactId>commons-lang</artifactId>
+            <version>2.3</version>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-pool</groupId>
+            <artifactId>commons-pool</artifactId>
+            <version>1.1</version>
+        </dependency>
+        <dependency><!---zip鍘嬬缉 鏇挎崲antzip-->
+            <groupId>net.lingala.zip4j</groupId>
+            <artifactId>zip4j</artifactId>
+            <version>1.3.2</version>
+        </dependency>
+        <dependency><!--zip鍘嬬缉鎵�闇�瑕佺殑jar-->
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-compress</artifactId>
+            <version>1.9</version>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.54</version>
+        </dependency>
+
+        <dependency><!--java bean 鍜寈ml杞崲-->
+            <groupId>com.thoughtworks.xstream</groupId>
+            <artifactId>xstream</artifactId>
+            <version>1.4.10</version>
+        </dependency>
+        <!---corba-->
+        <dependency>
+            <groupId>org.jacorb</groupId>
+            <artifactId>jacorb</artifactId>
+            <version>2.3.1-full</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>picocontainer</groupId>
+                    <artifactId>picocontainer</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>picocontainer</groupId>
+                    <artifactId>picocontainer-tck</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>picocontainer</groupId>
+                    <artifactId>picocontainer-gems</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>nanocontainer</groupId>
+                    <artifactId>nanocontainer</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>picocontainer</groupId>
+            <artifactId>picocontainer</artifactId>
+            <version>1.2</version>
+        </dependency>
+        <dependency>
+            <groupId>org.jacorb</groupId>
+            <artifactId>jacorb-idl-compiler</artifactId>
+            <version>2.3.1</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache</groupId>
+            <artifactId>logkit</artifactId>
+            <version>1.2</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-logging</groupId>
+            <artifactId>commons-logging</artifactId>
+            <version>1.2</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>3.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-log4j12</artifactId>
+            <version>1.7.25</version>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-jdk14</artifactId>
+            <version>1.6.4</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.swinglabs</groupId>
+            <artifactId>swingx</artifactId>
+            <version>1.6.1</version>
+        </dependency>
+
+        <!--jbpm-->
+        <dependency>
+            <groupId>org.jbpm</groupId>
+            <artifactId>jbpm-core</artifactId>
+            <version>4.3.2</version>
+        </dependency>
+        <dependency>
+            <groupId>de.odysseus.juel</groupId>
+            <artifactId>juel</artifactId>
+            <version>2.1.0</version>
+        </dependency>
+        <dependency>
+            <groupId>de.odysseus.juel</groupId>
+            <artifactId>juel-engine</artifactId>
+            <version>2.1.0</version>
+        </dependency>
+        <dependency>
+            <groupId>de.odysseus.juel</groupId>
+            <artifactId>juel-impl</artifactId>
+            <version>2.1.0</version>
+        </dependency>
+    </dependencies>
+</project>
\ No newline at end of file
diff --git a/Source/platformProject/vci-platform-starter/pom.xml b/Source/platformProject/vci-platform-starter/pom.xml
new file mode 100644
index 0000000..7785717
--- /dev/null
+++ b/Source/platformProject/vci-platform-starter/pom.xml
@@ -0,0 +1,256 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>platform-parent</artifactId>
+        <groupId>com.vci</groupId>
+        <version>2022.1-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <version>2022.1-SNAPSHOT</version>
+    <artifactId>vci-platform-starter</artifactId>
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+    </properties>
+    <dependencies>
+        <!--- 鑰佸钩鍙版墍闇�瑕佺殑鍖咃紝2020鐗堟湰鐨勫钩鍙�-->
+        <dependency><!--灞炴��-->
+            <groupId>com.vci.platform</groupId>
+            <artifactId>plm-omd-client</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.vci.platform</groupId>
+            <artifactId>plm-omd-common</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency><!--鐘舵�佹睜-->
+            <groupId>com.vci.platform</groupId>
+            <artifactId>plm-statePool-client</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.vci.platform</groupId>
+            <artifactId>plm-statePool-common</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency><!--鐢熷懡鍛ㄦ湡-->
+            <groupId>com.vci.platform</groupId>
+            <artifactId>plm-lifeCycle-client</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.vci.platform</groupId>
+            <artifactId>plm-lifeCycle-common</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency><!--鐗堟湰瑙勫垯-->
+            <groupId>com.vci.platform</groupId>
+            <artifactId>plm-versionRule-client</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.vci.platform</groupId>
+            <artifactId>plm-versionRule-common</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency><!--涓氬姟绫诲瀷-->
+            <groupId>com.vci.platform</groupId>
+            <artifactId>plm-btm-client</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.vci.platform</groupId>
+            <artifactId>plm-btm-common</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency><!--閾炬帴绫诲瀷-->
+            <groupId>com.vci.platform</groupId>
+            <artifactId>plm-ltm-client</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.vci.platform</groupId>
+            <artifactId>plm-ltm-common</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency><!--鏋氫妇-->
+            <groupId>com.vci.platform</groupId>
+            <artifactId>plm-enum-client</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.vci.platform</groupId>
+            <artifactId>plm-enum-common</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency><!--鏌ヨ妯℃澘-->
+            <groupId>com.vci.platform</groupId>
+            <artifactId>plm-oq-client</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.vci.platform</groupId>
+            <artifactId>plm-oq-common</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency><!--鍏宠仈鏌ヨ锛屾煡璇㈡ā鏉块渶瑕佷娇鐢ㄥ叧鑱旀煡璇�-->
+            <groupId>com.vci.platform</groupId>
+            <artifactId>RefQuery_client</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.vci.platform</groupId>
+            <artifactId>RefQuery_common</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency><!--鏉冮檺绠$悊锛屾巿鏉冩帶鍒�,鍔熻兘鏉冮檺锛屾暟鎹潈闄愶紝UI鏉冮檺-->
+            <groupId>com.vci.platform</groupId>
+            <artifactId>Authentication_client</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.vci.platform</groupId>
+            <artifactId>Authentication_common</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency><!--VciBase鍩虹鍖�-->
+            <groupId>com.vci.platform</groupId>
+            <artifactId>VCIBase-client</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.vci.platform</groupId>
+            <artifactId>VCIBase-common</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency><!--骞冲彴涓昏鏈嶅姟-->
+            <groupId>com.vci.platform</groupId>
+            <artifactId>rmip-system-client</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.vci.platform</groupId>
+            <artifactId>rmip-system-common</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency><!--瀹氭椂鍣�-->
+            <groupId>com.vci.platform</groupId>
+            <artifactId>vci-timer-client</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.vci.platform</groupId>
+            <artifactId>vci-timer-common</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.vci.platform</groupId>
+            <artifactId>vci-botimer-client</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency><!--娴佺▼鏈嶅姟-->
+            <groupId>com.vci.platform</groupId>
+            <artifactId>vciwf-common</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.vci.platform</groupId>
+            <artifactId>vciwf-workitem</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.vci.platform</groupId>
+            <artifactId>vciwf-client</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.vci.platform</groupId>
+            <artifactId>vciwf-server</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency><!--涓氬姟绫诲瀷宸ュ巶锛屼富瑕佹槸鐢ㄤ簬瀵逛笟鍔$被鍨嬬殑鏁版嵁鎿嶄綔锛堝尯鍒笟鍔$被鍨嬬殑鍖咃紝涓氬姟绫诲瀷鐨勫寘涓昏鏄畾涔変笟鍔$被鍨嬶級-->
+            <groupId>com.vci.platform</groupId>
+            <artifactId>BOFactory-client</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.vci.platform</groupId>
+            <artifactId>BOFactory-common</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+<!--        <dependency>&lt;!&ndash;澶氳宸ュ叿&ndash;&gt;-->
+<!--            <groupId>com.vci.platform</groupId>-->
+<!--            <artifactId>I18N-client</artifactId>-->
+<!--            <version>${vciplt.version}</version>-->
+<!--        </dependency>-->
+<!--        <dependency>-->
+<!--            <groupId>com.vci.platform</groupId>-->
+<!--            <artifactId>I18N-common</artifactId>-->
+<!--            <version>${vciplt.version}</version>-->
+<!--        </dependency>-->
+        <dependency><!--UI鏈嶅姟-->
+            <groupId>com.vci.platform</groupId>
+            <artifactId>UIService-client</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.vci.platform</groupId>
+            <artifactId>UIService-common</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency><!--UI宸ュ巶锛岄儴鍒唈ar寮曠敤-->
+            <groupId>com.vci.platform</groupId>
+            <artifactId>UIF-client</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.vci.platform</groupId>
+            <artifactId>UIF-common</artifactId>
+            <version>${vciplt.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.jbpm</groupId>
+            <artifactId>jbpm-core</artifactId>
+            <version>4.3.2</version>
+        </dependency>
+        <dependency>
+            <groupId>javax.mail</groupId>
+            <artifactId>mail</artifactId>
+            <version>1.4</version>
+        </dependency>
+        <dependency><!--鎿嶄綔xml闇�瑕�-->
+            <groupId>dom4j</groupId>
+            <artifactId>dom4j</artifactId>
+            <version>1.6.1</version>
+        </dependency>
+        <!--commons鐨勫嚑涓粍浠�-->
+        <dependency>
+            <groupId>commons-net</groupId>
+            <artifactId>commons-net</artifactId>
+            <version>1.4.1</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>2.5</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-fileupload</groupId>
+            <artifactId>commons-fileupload</artifactId>
+            <version>1.3.1</version>
+        </dependency>
+        <dependency><!---zip鍘嬬缉 鏇挎崲antzip-->
+            <groupId>net.lingala.zip4j</groupId>
+            <artifactId>zip4j</artifactId>
+            <version>1.3.2</version>
+        </dependency>
+        <dependency><!--zip鍘嬬缉鎵�闇�瑕佺殑jar-->
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-compress</artifactId>
+            <version>1.9</version>
+        </dependency>
+    </dependencies>
+</project>
\ No newline at end of file
diff --git a/Source/platformProject/vci-platform-web/README.md b/Source/platformProject/vci-platform-web/README.md
new file mode 100644
index 0000000..23f6fd9
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/README.md
@@ -0,0 +1,96 @@
+1.鑿滃崟閰嶇疆鍙互鏄互鍓嶇殑鏂瑰紡锛屼篃鍙互鎸夋柊鐨勬柟寮忛厤缃�
+  - 浣跨敤UI涓婁笅鏂囩殑鍙互鏄疷I://type#content?param=xxx杩欑鏂瑰紡锛孶I涓嶅尯鍒嗗ぇ灏忓啓锛屼絾鏄笂涓嬫枃鐨刢ontent鍖哄垎澶у皬鍐�
+  - 浣跨敤鑷畾涔夌殑椤甸潰锛屽彲浠ヤ娇鐢║SEJS://xxxx杩欑鏂瑰紡锛寀sejs涓嶅尯鍒嗗ぇ灏忓啓锛屼絾鏄�:鍚庨潰鐨勫唴瀹瑰尯鍒嗗ぇ灏忓啓
+  - 鎵撳紑鍒殑椤甸潰锛屽疄闄呬娇鐢╥frame鎵撳紑锛屼娇鐢╤ttp://xxx鎴栬�卙ttps://xxx
+  - 浣跨敤寮瑰嚭娴忚鍣ㄧ獥鍙o紝浣跨敤open:,鍏朵腑open涓嶅尯鍒嗗ぇ灏忓啓
+ 
+2.椤圭洰璇存槑
+  - 鏈」鐩槸鍩轰簬骞冲彴2020鐗堟湰鐨勫熀纭�涓婃瀯寤虹殑锛岀Щ闄や簡浠ュ墠鐨刣ojo锛屽紩鍏ユ湭鏉�2021鐗堟湰鐨刲ayui
+  - 鏈」鐩渶浣庨噰鐢╦ava8,tomcat8杩愯  
+  
+3.鍖呭悕瑙勮寖
+  - 鍏ㄩ儴鍦╟om.vci涓�
+  - com.vci.framerworkcore鏄钩鍙�2021鐗堟湰涓殑閮ㄩ棬瑙掕壊鐢ㄦ埛绛夊吋瀹圭殑鍖咃紝鍙兘淇bug锛屼笉鑳藉啀鍏朵腑娣诲姞涓庡钩鍙版棤鍏充笟鍔�
+  - com.vci.web鏄湰椤圭洰鐨剋eb绔牳蹇冨鐞嗙殑鍐呭锛岃嚜宸辩殑涓氬姟闇�瑕佹柊鍒涘缓鍖咃紝鍖呯殑瑙勮寖涓轰骇鍝佸悕瀛�+瀹㈡埛浠e彿锛屾瘮濡俶es112,mdm420绛�
+  - 鑷繁鐨勪笟鍔$殑鍖呭悕瑙勮寖涓�
+  ```
+    controller 鎺у埗鍣紝鍗虫帴鏀跺墠绔紶閫掔殑鏁版嵁
+    model 涓氬姟绫诲瀷鏄犲皠鐨勫璞℃枃浠讹紝閲岄潰鍙兘鏄睘鎬э紝getter鍜宻etter锛岀姝娇鐢ㄧ骇鑱旀柟寮忓垱寤篻etter
+    pagemodel 鏄剧ず瀵硅薄锛屽嵆鍚庡彴杩斿洖缁欏墠绔樉绀虹殑鍐呭
+    dto 鏁版嵁浼犺緭瀵硅薄锛屽墠绔紶閫掔粰鍚庡彴鐨勫璞★紝涓昏鍦╟ontroller涓帴鏀跺墠绔帴鏀剁殑鏁版嵁浣跨敤
+    enumpck 鏋氫妇鐨勫璞★紝瑕佺户鎵緽aseEnum
+    lcstatuspck 鎴栬�卨ifeCycle 閮芥槸鐢熷懡鍛ㄦ湡鐨勫璞★紝涔熸槸缁ф壙BaseEnum
+    dao 鏁版嵁鎿嶄綔锛屽鏋滈渶瑕佽皟鐢ㄥ钩鍙扮殑鎺ュ彛锛屼篃鏄埌杩欎釜涓嬭竟
+    service 鏈嶅姟鍖咃紝涓昏鐨勪笟鍔¢�昏緫鍐欏埌杩欎釜鍖呬笅
+    constant 甯搁噺姹囨�伙紝璇蜂緷鐓ava寮�鍙戣鑼�
+    properties 閰嶇疆椤癸紝涓氬姟閲屽紩鐢ㄩ厤缃椂閮藉紩鐢ㄨ繖涓寘涓嬬殑
+    config 鑷姩閰嶇疆锛屽嵆properties鐨勯粯璁ゅ�奸兘鏄粠config閲岀殑璁剧疆鐨�
+    bo 涓氬姟澶勭悊鐨勫璞★紝鍙湪service灞備腑浣跨敤
+  ```
+
+4.SpringMvc寮�鍙戞寚鍗�
+  - 鎺ュ彛瑙勮寖锛岄噰鐢╮estFul鐨勮鑼�,浣嗕笉鏄己鍒惰姹�
+  ```
+  GET 鑾峰彇璧勬簮锛屾瘮濡傚垪琛紝鏍戯紝琛ㄥ崟鐨勮幏鍙栨暟鎹�
+  POST 鍒涘缓璧勬簮锛屾瘮濡傛柊寤虹殑淇濆瓨绛�
+  PUT 鏇存柊璧勬簮锛屾瘮濡備慨鏀规暟鎹紝杩欎釜鏄箓绛夌殑
+  DELETE 鍒犻櫎璧勬簮锛屾瘮濡傚垹闄ゆ暟鎹�
+  ```
+ - 娉ㄨВ鐨勪娇鐢�
+  ```
+
+    @Controller 琛ㄧず褰撳墠杩欎釜绫绘槸涓�涓帶鍒跺櫒锛岃繖涓被涓嬬殑鏂规硶瑕佽繑鍥濲SON鐨勬柟寮忔椂锛岄渶瑕佸湪鏂规硶涓夽ResponeBody娉ㄨВ锛屽惁鍒欐槸鏌ヨ杩斿洖鍊�.html杩欎釜鏂囦欢
+    @RestController 琛ㄧず褰撳墠杩欎釜绫绘槸rest鎺у埗鍣紝杩欎釜绫讳笅鐨勬柟娉曚笉闇�瑕佸姞@ResponeBody鐨勬敞瑙�. 
+    鎺ㄨ崘浣跨敤RestController娉ㄨВ锛岃�屼笉浣跨敤@Controller
+
+    @RequestMapping 璁块棶鐨勮矾寰勶紝鍗冲墠绔闂悗鍙扮殑璺緞锛屽彲浠ヤ娇鐢ㄥ叾涓殑method灞炴�ф潵璁剧疆restFul鐨勭被鍨�
+    @GetMapping get鏂瑰紡鐨勮闂矾寰勶紝鍗崇瓑浜嶡RequestMapping  + method=GET
+    @PostMapping post鏂瑰紡鐨勮闂矾寰勶紝鍗崇瓑浜嶡RequestMapping + method=POST
+    @PutMapping put鏂瑰紡鐨勮闂矾寰勶紝鍗崇瓑浜嶡RequestMapping + method=PUT
+    @DeleteMapping delete鏂瑰紡鐨勮闂矾寰勶紝鍗崇瓑浜嶡RequestMapping + method=DELETE
+
+    @RequestBody 琛ㄧず鍓嶇浣跨敤json鏂瑰紡鎻愪氦锛岃繖涓敞瑙e姞浜嗗悗锛岃繖涓柟娉曢噷鍙兘鏈夎繖涓�涓弬鏁�
+    @RequestParam 瀹氫箟鍙傛暟
+    ...杩樻湁鍏朵粬涓嶅父鐢ㄧ殑娉ㄨВ銆�
+    鎺ㄨ崘浣跨敤鏄庣‘鐨勮闂矾寰勶紝涓嶆帹鑽愪娇鐢≧equestMapping
+    <!------------娉ㄦ剰------------->
+    <!------------娉ㄦ剰------------->
+    <!------------娉ㄦ剰------------->
+     绂佹鍏ㄩ儴閮戒娇鐢╣et鏂瑰紡锛岀壒鍒槸娣诲姞鍜屼慨鏀圭瓑鏁版嵁闀垮害寰堝ぇ鐨勫満鏅�
+    
+    @VciBusinessLog 鏄搷浣滄棩蹇楃殑娉ㄨВ锛屾槸鍒╃敤aop鐨勫疄鐜扮殑锛屽彲浠ョ敤浜庡埌Class涓婏紝涔熷彲浠ョ敤浜庢柟娉曚笂锛涙柟娉曚笂鐨勪紭鍏堢骇澶т簬class銆傜郴缁熶細鑷姩璁板綍鎿嶄綔鏃ュ織.杩欎釜娉ㄨВ鍙互浣跨敤controller閲岀殑鍙傛暟鐨勫��
+
+    @VciPermission 璁块棶鏉冮檺锛屽嵆杩欎釜璁块棶鍦板潃鏄惁鏈夋潈闄愯璁块棶锛岃繖涓富瑕佺粦瀹氳彍鍗曠殑缂栧彿锛屽嵆鏌愪釜鑿滃崟琚巿鏉冧簡缁欏綋鍓嶇敤鎴凤紝灏卞彲浠ヨ璁块棶銆傚鏋滄槸寮�鏀剧殑鍒欒缃甤ontrolMethodPermission涓簍rue
+    @VciReferPermission 琛ㄧず杩欎釜璁块棶璺緞鏄弬鐓э紝瀹冪殑鏉冮檺鍙栧喅浜庝娇鐢ㄥ弬鐓х殑鍦版柟锛屼娇鐢ㄥ弬鐓х殑鍦版柟瀵瑰簲浣跨敤@VciUseReferMethod
+    鏉冮檺涓昏鏄嚜缂栧啓鐨勪唬鐮佺殑鏃跺�欐墠杩欐牱鍐欐敞瑙o紝浣跨敤骞冲彴UI瀹氫箟鐨勬帴鍙o紝渚濈劧鏄敱UI鏉冮檺鎺у埗鐨�
+
+  ```
+ - 璇锋眰鐨勬柟寮�
+     * 琛ㄥ崟鎻愪氦鏂瑰紡锛屽嵆key=value杩欑鏂瑰紡銆俛pplication/x-www-form-urlencoded銆� controller閲岄潰鐩存帴浣跨敤瀵硅薄鏉ユ帴鏀讹紝鎴栬�卌ontroller閲屼娇鐢ㄥ弬鏁版帴鏀�
+       濡傛灉鏄彁浜ゅ垪琛紝闇�瑕丆ontroller閲岀殑鍙傛暟鏄璞★紝瀵硅薄鐨勫睘鎬ф槸鍒楄〃銆傚墠绔殑鏁版嵁鎻愪氦鏂瑰紡鏄�  "xxx[0].yyy":"value" xxx鏄璞¢噷鐨勫睘鎬у悕瀛楋紝yyy鏄垪琛ㄥ璞¢噷鐨勫睘鎬�
+       濡傛灉鏄彁浜ap锛岄渶瑕丆ontroller閲岀殑鍙傛暟鏄璞★紝瀵硅薄鐨勫睘鎬ф槸Map銆傚墠绔殑鏁版嵁鎻愪氦鏂瑰紡鏄�   "xxx['yyy']":"value"  xxx鏄璞¢噷鐨勪功搴忓悕绉帮紝yyy鏄痬ap閲岀殑key銆� 姣斿BaseQueryObject
+     * JSON鎻愪氦鏂瑰紡锛屽嵆json鏍煎紡鐨勫瓧绗︿覆.application/json銆� controller閲岄潰鐩存帴浣跨敤瀵硅薄鏉ユ帴鏀讹紝骞朵笖娣诲姞@RequestBody,鑰屼笖鍙兘涓�涓弬鏁帮紝鍚屾椂璁块棶鐨勭被鍨嬫槸post鎴栬�卲ut
+     * 鏂囦欢涓婁紶锛屽悗鍙癱ontroller涓娇鐢∕ultipartFile鏉ユ帴鏀讹紝杩欎釜鍙傛暟鐨勫悕瀛楀拰鍓嶇鎻愪氦鐨勬枃浠剁殑name灞炴�х浉鍚屻�傞粯璁や负file
+     * 鏂囦欢涓嬭浇锛宑ontroller杩斿洖鍊兼槸void銆傛枃浠跺厛鏀惧埌涓存椂鏂囦欢澶逛笅锛岀劧鍚庤皟鐢–ontrollerUtil閲岀殑鏂规硶杩斿洖鍓嶇
+ - 杩斿洖鍊�
+   * 鍒嗛〉鍒楄〃锛孌ataGrid
+   * 鏍� List<Tree>
+   * 鍏朵粬 BaseResult.鍗充娇浣犳柟娉曟槸鍏朵粬鐨勮繑鍥炲�硷紝鏈�缁堜篃浼氱粺涓�涓築aseResult
+ - 缁熶竴鐨勫紓甯�     
+   绯荤粺浼氱粺涓�澶勭悊寮傚父锛屼笟鍔′唬鐮侀噷鍙互涓峜atch锛屽洜涓轰簨鍔℃槸鐢卞钩鍙版帶鍒剁殑锛屾墍浠ヤ笟鍔¢噷鐨勫紓甯镐笉鑰冭檻浜嬪姟鐨勫奖鍝嶃�備絾鏄渶瑕佽�冭檻涓氬姟閲岄潰鐨勫洜涓轰簨鍔$殑瀹屾暣鎬�    
+
+5.韪╁潙鎸囧崡
+  - 涓嶈鍦ㄩ潪Controller閲屼娇鐢╮equest鍜孯espone銆傚洜涓洪噰鐢ㄤ簡鍓嶅悗鍒嗙妯″紡锛屾斁鍦╯ession鍜宺equest閲岀殑鏁版嵁宸茬粡涓嶈兘璇诲彇
+  - 澶勭悊涓氬姟鐨勬椂鍊欎竴瀹氳娉ㄦ剰鏁版嵁鐨勫畬鏁存�э紝寤鸿浣跨敤WebBoServiceImpl閲屽皝瑁呯殑澧炲垹鏀规煡鏂规硶锛岀劧鍚庡湪鏈�鍚庝竴娆℃�ф彁浜�
+  - 浠ュ墠鐨勫钩鍙扮殑corba閾炬帴鍦╟onf.properties閲岋紝鏆傛椂鏃犳硶鍘婚櫎锛屼絾鏄湪鎵撳寘鐨勬椂鍊欎笉瑕佸寘鍚繖涓厤缃枃浠讹紝缁熶竴浣跨敤rmip-system-common閲岀殑conf鏂囦欢銆傝繖涓湪鍚姩鐨刡at鏂囦欢涓婂凡缁忓姞鍏ュ埌classpath浜�
+  - model,pageModel鍜宒to寤鸿浣跨敤浠g爜鐢熸垚鍣ㄧ敓鎴愩�傞槻姝唬鐮佹墜鏁插嚭閿�
+  - 濡傛灉椤甸潰鏄疷I涓婁笅鏂囬厤缃殑锛屼絾鏄寜閽殑涓氬姟鍔熻兘鏄崟鐙紪鍐欑殑锛屼笉瑕佹妸涓氬姟鍙啓鍒癱ontroller閲岋紝鑰屾槸缁熶竴鍒皊ervice閲岋紝鍚﹀垯鍙堟帀鍏ユ棤闄愬姞鍙傛暟鐨勬�湀涓紝鍚庣画缁存姢鏃惰浜哄懡
+  - 娉ㄩ噴涓�瀹氳鍏ㄩ潰锛屾敞閲婁竴瀹氳鍏ㄩ潰锛屾敞閲婁竴瀹氳鍏ㄩ潰
+  - 鍓嶇疆浜嬩欢鍙兘鐢ㄤ簬鏌ヨ锛屼笉瑕佸湪鍏朵腑娣诲姞鍜屼慨鏀规暟鎹�
+  - 涓氬姟涓敖閲忛伩鍏嶇洿鎺ユ搷浣淐lientBussinessObject鎴栬�匔lientLinkObject锛岃�屾槸鏀圭敤涓氬姟瀵硅薄鐨勬柟寮忥紝涓嶇劧鍔犱竴娆″睘鎬э紝瑕佸叏灞�鎵惧彈褰卞搷鐨勬枃浠�
+  - 杩愯鐜閲屽璇け鏁堢殑闂锛岄渶瑕佸湪bat鏂囦欢璁剧疆澶氳鐨勮矾寰勪负BOOT-INF/classes/xxxx
+6.maven浠撳簱
+  - 璇蜂娇鐢ㄦ湰椤圭洰閲岀殑settings.xml  
+  - 骞冲彴jar浣跨敤鐨勬槸ant缂栬瘧鐨勶紝鍙互鍦ㄧ紪璇戝悗锛屼娇鐢╲ci-platform-web宸ョ▼閲岀殑BatchRedeployJar2Maven閲屾墽琛屼竴涓嬶紝鎶婃柊鐨凧ar浼犻�掔粰maven绉佹湇銆傜劧鍚庡湪鏈湴浠撳簱閲屽垹闄om.vci.platform涓嬬殑渚濊禆锛屾渶鍚庡啀閲嶆柊涓嬭浇渚濊禆
+
+        
diff --git a/Source/platformProject/vci-platform-web/pom.xml b/Source/platformProject/vci-platform-web/pom.xml
new file mode 100644
index 0000000..11b3900
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/pom.xml
@@ -0,0 +1,253 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>platform-parent</artifactId>
+        <groupId>com.vci</groupId>
+        <version>2022.1-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>vci-platform-web</artifactId>
+
+   <dependencies>
+       <dependency>
+           <groupId>com.vci</groupId>
+           <artifactId>vci-starter-parent</artifactId>
+           <version>1.0-SNAPSHOT</version>
+           <type>pom</type>
+       </dependency>
+       <dependency>
+           <groupId>com.vci.corba</groupId>
+           <artifactId>plt-slice</artifactId>
+           <version>1.0</version>
+           <scope>system</scope>
+           <systemPath>D:/work/newplatform/Bin/lib/common/plt-slice.jar</systemPath>
+       </dependency>
+
+       <dependency>
+           <groupId>com.vci</groupId>
+           <artifactId>vci-starter-web</artifactId>
+           <version>1.0-SNAPSHOT</version>
+           <exclusions>
+               <exclusion>
+                   <groupId>org.springframework.boot</groupId>
+                   <artifactId>spring-boot-starter-thymeleaf</artifactId>
+               </exclusion>
+               <exclusion>
+                   <groupId>org.apache.logging.log4j</groupId>
+                   <artifactId>*</artifactId>
+               </exclusion>
+               <exclusion>
+                   <groupId>com.google.guava</groupId>
+                   <artifactId>guava</artifactId>
+               </exclusion>
+           </exclusions>
+       </dependency>
+       <dependency>
+           <groupId>com.vci</groupId>
+           <artifactId>vci-starter-corba</artifactId>
+           <version>1.0-SNAPSHOT</version>
+           <exclusions>
+               <exclusion>
+                   <groupId>org.springframework.boot</groupId>
+                   <artifactId>spring-boot-starter-thymeleaf</artifactId>
+               </exclusion>
+           </exclusions>
+       </dependency>
+       <dependency><!--鏂囦欢鐨勪俊鎭�-->
+           <groupId>com.vci</groupId>
+           <artifactId>vci-file-api</artifactId>
+           <version>1.0-SNAPSHOT</version>
+           <exclusions>
+               <exclusion>
+                   <groupId>org.springframework.boot</groupId>
+                   <artifactId>spring-boot-starter-thymeleaf</artifactId>
+               </exclusion>
+               <exclusion>
+                   <groupId>org.apache.logging.log4j</groupId>
+                   <artifactId>*</artifactId>
+               </exclusion>
+           </exclusions>
+       </dependency>
+       <dependency>
+           <groupId>com.vci</groupId>
+           <artifactId>vci-file-integration</artifactId>
+           <version>1.0-SNAPSHOT</version>
+           <exclusions>
+               <exclusion>
+                   <groupId>org.springframework.boot</groupId>
+                   <artifactId>spring-boot-starter-thymeleaf</artifactId>
+               </exclusion>
+           </exclusions>
+       </dependency>
+       <dependency>
+           <groupId>com.vci</groupId>
+           <artifactId>vci-starter-word</artifactId>
+           <version>1.0-SNAPSHOT</version>
+           <exclusions>
+               <exclusion>
+                   <groupId>org.springframework.boot</groupId>
+                   <artifactId>spring-boot-starter-thymeleaf</artifactId>
+               </exclusion>
+               <exclusion>
+                   <groupId>com.vci</groupId>
+                   <artifactId>vci-starter-web</artifactId>
+               </exclusion>
+           </exclusions>
+       </dependency>
+       <dependency>
+           <groupId>com.vci</groupId>
+           <artifactId>vci-starter-poi</artifactId>
+           <version>1.0-SNAPSHOT</version>
+           <exclusions>
+               <exclusion>
+                   <groupId>org.springframework.boot</groupId>
+                   <artifactId>spring-boot-starter-thymeleaf</artifactId>
+               </exclusion>
+               <exclusion>
+                   <groupId>com.vci</groupId>
+                   <artifactId>vci-starter-web</artifactId>
+               </exclusion>
+           </exclusions>
+       </dependency>
+       <dependency>
+           <groupId>eu.bitwalker</groupId>
+           <artifactId>UserAgentUtils</artifactId>
+           <version>1.20</version>
+       </dependency>
+       <!--寮�鍚� cache 缂撳瓨 -->
+       <dependency>
+           <groupId>org.springframework.boot</groupId>
+           <artifactId>spring-boot-starter-cache</artifactId>
+           <version>2.1.3.RELEASE</version>
+       </dependency>
+
+       <!-- ehcache缂撳瓨 -->
+       <dependency>
+           <groupId>net.sf.ehcache</groupId>
+           <artifactId>ehcache</artifactId>
+           <version>2.9.1</version><!--$NO-MVN-MAN-VER$ -->
+       </dependency>
+
+       <dependency><!--java bean 鍜寈ml杞崲-->
+           <groupId>com.thoughtworks.xstream</groupId>
+           <artifactId>xstream</artifactId>
+           <version>1.4.10</version>
+       </dependency>
+       <dependency><!--浠g爜鐢熸垚鍣ㄦ墍闇�妯℃澘-->
+           <artifactId>velocity</artifactId>
+           <groupId>org.apache.velocity</groupId>
+           <version>1.7</version>
+       </dependency>
+       <dependency><!--鏁版嵁搴撴搷浣滃伐鍏�-->
+           <groupId>com.vci.platform</groupId>
+           <artifactId>ddlTool-client</artifactId>
+           <version>${vciplt.version}</version>
+       </dependency>
+       <dependency><!--鏁版嵁搴撴搷浣滃伐鍏�-->
+           <groupId>com.vci.platform</groupId>
+           <artifactId>ddlTool-common</artifactId>
+           <version>${vciplt.version}</version>
+       </dependency>
+       <dependency>
+           <groupId>com.vci.client</groupId>
+           <artifactId>plt-clientbase</artifactId>
+           <version>1.0</version>
+           <scope>system</scope>
+           <systemPath>D:/work/newplatform/Bin/lib/client/plt-clientbase.jar</systemPath>
+       </dependency>
+       <dependency>
+           <groupId>com.zeroc</groupId>
+           <artifactId>icegridgui.jar</artifactId>
+           <version>1.0</version>
+           <scope>system</scope>
+           <systemPath>D:/work/newplatform/Bin/lib/common/icegridgui.jar</systemPath>
+       </dependency>
+       <dependency>
+           <groupId>com.vci.common</groupId>
+           <artifactId>plt-common.jar</artifactId>
+           <version>1.0</version>
+           <scope>system</scope>
+           <systemPath>D:/work/newplatform/Bin/lib/common/plt-common.jar</systemPath>
+       </dependency>
+       <dependency>
+           <groupId>com.vci</groupId>
+           <artifactId>vci-platform-starter</artifactId>
+           <version>2022.1-SNAPSHOT</version>
+       </dependency>
+
+       <dependency>
+           <groupId>org.reflections</groupId>
+           <artifactId>reflections</artifactId>
+           <version>0.9.11</version>
+       </dependency>
+
+       <!--redis start-->
+       <dependency>
+           <groupId>org.springframework.data</groupId>
+           <artifactId>spring-data-redis</artifactId>
+           <version>2.1.5.RELEASE</version>
+       </dependency>
+       <dependency>
+           <groupId>redis.clients</groupId>
+           <artifactId>jedis</artifactId>
+           <version>2.9.0</version>
+       </dependency>
+       <!--redis end-->
+   </dependencies>
+
+    <build>
+        <finalName>vci-platform-web</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+                <configuration>
+                    <archive>
+                        <manifest>
+                            <addClasspath>false</addClasspath>
+                            <classpathPrefix>lib/</classpathPrefix>
+                            <useUniqueVersions>false</useUniqueVersions>
+                        </manifest>
+                    </archive>
+                    <excludes>
+                        <exclude>application-prod.yml</exclude>
+                        <exclude>application-db.yml</exclude>
+                        <exclude>properties/conf.properties</exclude>
+                    </excludes>
+                </configuration>
+            </plugin>
+<!--            <plugin>-->
+<!--                <groupId>org.springframework.boot</groupId>-->
+<!--                <artifactId>spring-boot-maven-plugin</artifactId>-->
+<!--                <configuration>-->
+<!--                    &lt;!&ndash;閲嶅啓鍖呭惈渚濊禆锛屽寘鍚笉瀛樺湪鐨勪緷璧栵紝jar閲屾病鏈塸om閲岀殑渚濊禆&ndash;&gt;-->
+<!--                    <includes>-->
+<!--                        <include>-->
+<!--                            <groupId>null</groupId>-->
+<!--                            <artifactId>null</artifactId>-->
+<!--                        </include>-->
+<!--                    </includes>-->
+<!--                    <layout>ZIP</layout>-->
+<!--                    &lt;!&ndash;浣跨敤澶栭儴閰嶇疆鏂囦欢锛宩ar鍖呴噷娌℃湁璧勬簮鏂囦欢&ndash;&gt;-->
+<!--                    <addResources>true</addResources>-->
+<!--                </configuration>-->
+<!--                <executions>-->
+<!--                    <execution>-->
+<!--                        <goals>-->
+<!--                            <goal>repackage</goal>-->
+<!--                        </goals>-->
+<!--                        <configuration>-->
+<!--                            &lt;!&ndash;閰嶇疆jar鍖呯壒娈婃爣璇� 閰嶇疆鍚庯紝淇濈暀鍘熸枃浠讹紝鐢熸垚鏂版枃浠� *-run.jar &ndash;&gt;-->
+<!--                            &lt;!&ndash;閰嶇疆jar鍖呯壒娈婃爣璇� 涓嶉厤缃紝鍘熸枃浠跺懡鍚嶄负 *.jar.original锛岀敓鎴愭柊鏂囦欢 *.jar &ndash;&gt;-->
+<!--                            &lt;!&ndash;<classifier>run</classifier>&ndash;&gt;-->
+<!--                        </configuration>-->
+<!--                    </execution>-->
+<!--                </executions>-->
+<!--            </plugin>-->
+
+        </plugins>
+    </build>
+</project>
\ No newline at end of file
diff --git a/Source/platformProject/vci-platform-web/settings.xml b/Source/platformProject/vci-platform-web/settings.xml
new file mode 100644
index 0000000..4ebcef3
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/settings.xml
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
+          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
+    <mirrors>
+        <mirror>
+            <id>mirror</id>
+            <mirrorOf>!rdc-releases,!rdc-snapshots,!jeecg,!jeecg-snapshots</mirrorOf>
+            <name>mirror</name>
+            <url>http://nexus.vci-tech.com:9000/repository/maven-public/</url>
+        </mirror>
+
+    </mirrors>
+    <servers>
+         <server>
+            <id>central</id>
+            <username>admin</username>
+            <password>vcitest</password>
+        </server>
+        <server>
+            <id>rdc-releases</id>
+            <username>admin</username>
+            <password>vcitest</password>
+        </server>
+        <server>
+            <id>rdc-snapshots</id>
+            <username>admin</username>
+            <password>vcitest</password>
+        </server>
+    </servers>
+    <profiles>
+        <profile>
+            <id>nexus</id>
+            <repositories>
+                <repository>
+                    <id>central</id>
+                    <url>http://nexus.vci-tech.com:9000/repository/maven-public/</url>
+                    <releases>
+                        <enabled>true</enabled>
+                    </releases>
+                    <snapshots>
+                        <enabled>true</enabled>
+                    </snapshots>
+                </repository>
+                <repository>
+                    <id>rdc-releases</id>
+                    <url>http://nexus.vci-tech.com:9000/repository/maven-releases/</url>
+                    <releases>
+                        <enabled>true</enabled>
+                    </releases>
+                    <snapshots>
+                        <enabled>true</enabled>
+                    </snapshots>
+                </repository>
+                <repository>
+                    <id>rdc-snapshots</id>
+                    <url>http://nexus.vci-tech.com:9000/repository/maven-snapshots/</url>
+                    <releases>
+                        <enabled>true</enabled>
+                    </releases>
+                    <snapshots>
+                        <enabled>true</enabled>
+                    </snapshots>
+                </repository>
+            </repositories>
+           <pluginRepositories>
+                <pluginRepository>
+                    <id>central</id>
+                    <url>http://nexus.vci-tech.com:9000/repository/maven-public/</url>
+                    <releases>
+                        <enabled>true</enabled>
+                    </releases>
+                    <snapshots>
+                        <enabled>true</enabled>
+                    </snapshots>
+                </pluginRepository>
+                <pluginRepository>
+                    <id>snapshots</id>
+                    <url>http://nexus.vci-tech.com:9000/repository/maven-snapshots/</url>
+                    <releases>
+                        <enabled>true</enabled>
+                    </releases>
+                    <snapshots>
+                        <enabled>true</enabled>
+                    </snapshots>
+                </pluginRepository>
+                <pluginRepository>
+                    <id>rdc-releases</id>
+                    <url>http://nexus.vci-tech.com:9000/repository/maven-releases/</url>
+                    <releases>
+                        <enabled>true</enabled>
+                    </releases>
+                    <snapshots>
+                        <enabled>true</enabled>
+                    </snapshots>
+                </pluginRepository>
+                <pluginRepository>
+                    <id>rdc-snapshots</id>
+                    <url>http://nexus.vci-tech.com:9000/repository/maven-snapshots/</url>
+                    <releases>
+                        <enabled>true</enabled>
+                    </releases>
+                    <snapshots>
+                        <enabled>true</enabled>
+                    </snapshots>
+                </pluginRepository>
+            </pluginRepositories>
+        </profile>
+
+    </profiles>
+
+    <activeProfiles>
+        <activeProfile>nexus</activeProfile>
+
+    </activeProfiles>
+
+
+</settings>
\ No newline at end of file
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/BatchRedeployJar2Maven.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/BatchRedeployJar2Maven.java
new file mode 100644
index 0000000..265dc37
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/BatchRedeployJar2Maven.java
@@ -0,0 +1,107 @@
+package com.vci;
+
+import java.io.*;
+
+/**
+ * 鎵归噺涓婁紶鏂囦欢鍒癿aven绉佹湇
+ * @author weidy
+ * @date 2021/6/2
+ */
+public class BatchRedeployJar2Maven {
+
+    public static final String MAVEN_PATH = "C:\\developer\\apache-maven-3.8.1\\bin";
+
+    public static final String JAR_CLIENT_PATH = "C:\\developer\\platform2020\\platform-runtime-2022\\libs\\modules\\client";
+
+    public static final String JAR_COMMON_PATH = "C:\\developer\\platform2020\\platform-runtime-2022\\libs\\modules\\common";
+
+    public static final String JAR_SERVER_PATH = "C:\\developer\\platform2020\\platform-runtime-2022\\libs\\modules\\server";
+
+    public static final String JAR_BASE_PATH = "C:\\developer\\platform2020\\platform-runtime-2022\\libs\\base";
+
+    public static final String SETTINGS = "${user.home}\\.m2";
+
+    public static final String GROUP_ID = "com.vci.platform";
+
+    public static final String VERSION = "2022.RELEASE";
+
+    public static final String URL = "http://nexus.vci-tech.com:9000/repository/maven-releases";
+    public static void main(String[] args) {
+
+        /**
+         * 浣跨敤涔嬪墠璇峰厛瀹夎maven锛屾垨鑰呯洿鎺ヤ娇鐢╥dea鐨勬彃浠�
+         * 鐒跺悗淇敼涓婃柟鐨刯ar_xxx_path锛屽鏋滄湁澧炲姞璺緞鍙互鑷娣诲姞
+         */
+        BatchRedeployJar2Maven redeploy = new BatchRedeployJar2Maven();
+        redeploy.redeploy(JAR_CLIENT_PATH);
+        redeploy.redeploy(JAR_COMMON_PATH);
+        redeploy.redeploy(JAR_SERVER_PATH);
+        redeploy.redeploy(JAR_BASE_PATH);
+    }
+
+    public void redeploy(String path){
+        File folder = new File(path);
+        if(folder.exists()) {
+            File[] files = folder.listFiles();
+            if (files != null) {
+                System.out.println("鎵弿鏂囦欢澶�" + path);
+                for (File jarFile : files) {
+                    String name = jarFile.getName();
+                    String nameNotExtension = name;
+                    if (name.contains(".")) {
+                        nameNotExtension = name.substring(0, name.lastIndexOf("."));
+                    }
+                    String cmd = "mvn deploy:deploy-file \"-DgroupId=" + GROUP_ID +
+                            "\" \"-DartifactId=" + nameNotExtension + "\" \"-Dversion=" + VERSION + "\" \"-Dpackaging=jar\" \"-Durl=" + URL + "\" \"-Dfile=" + jarFile.getAbsolutePath() + "\" \"-DrepositoryId=rdc-releases\"";
+
+                    Process proc = null;
+                    try {
+                        proc = Runtime.getRuntime().exec(new String[]{"cmd", "/C", cmd}, null, new File(MAVEN_PATH));
+                        printMessage(proc.getInputStream());
+                        printMessage(proc.getErrorStream());
+                        proc.waitFor();
+                    } catch (IOException | InterruptedException e) {
+                        e.printStackTrace();
+                    } finally {
+                        if (proc != null) {
+                            proc.destroy();
+                        }
+                    }
+                    System.out.println("瀹屾垚" + name);
+                }
+                System.out.println("瀹屾垚鎵弿鏂囦欢澶�" + path);
+            }
+        }
+
+    }
+
+    private static void printMessage( final InputStream input) {
+        new Thread(new Runnable() {
+            public void run() {
+                Reader reader =null;
+                BufferedReader bf=null;
+                String line = null;
+                try {
+                    reader= new InputStreamReader(input);
+                    bf = new BufferedReader(reader);
+                    while((line=bf.readLine())!=null) {
+                        System.out.println(line);
+                    }
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }finally {
+                    try {
+                        if (reader != null) {
+                            reader.close();
+                        }
+                        if (bf != null) {
+                            bf.close();
+                        }
+                    }catch (Throwable e){
+
+                    }
+                }
+            }
+        }).start();
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/PlatformWebApplication.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/PlatformWebApplication.java
new file mode 100644
index 0000000..6680265
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/PlatformWebApplication.java
@@ -0,0 +1,44 @@
+package com.vci;
+
+import com.vci.starter.web.util.LocalFileUtil;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.context.ApplicationPidFileWriter;
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import javax.annotation.PreDestroy;
+import java.io.File;
+
+/**
+ * 鏈」鐩殑鍚姩绫�
+ * @author weidy
+ */
+@SpringBootApplication
+@ComponentScan({"com.vci.*"})
+@EnableFeignClients(basePackages = {"com.vci.*"})
+@EnableScheduling
+@EnableCaching
+public class PlatformWebApplication {
+
+    /**
+     * 涓绘柟娉�
+     * @param args 鍚姩鐨勫弬鏁�
+     */
+    public static void main(String[] args) {
+        LocalFileUtil.mainClass = PlatformWebApplication.class;
+        SpringApplication application = new SpringApplication(PlatformWebApplication.class);
+        application.addListeners(new ApplicationPidFileWriter(LocalFileUtil.getProjectFolder() + File.separator + "app.pid"));
+        application.run(args);
+        System.out.println("web--start--finish-------");
+    }
+
+    /**
+     * 鍋滄鏈嶅姟鍚�
+     */
+    @PreDestroy
+    public void preDestroy(){
+        System.out.println("鍋滀簡骞冲彴web瀹㈡埛绔殑鏈嶅姟");
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/ajaxTask/SmUserUnLockTask.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/ajaxTask/SmUserUnLockTask.java
new file mode 100644
index 0000000..7840018
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/ajaxTask/SmUserUnLockTask.java
@@ -0,0 +1,128 @@
+package com.vci.frameworkcore.ajaxTask;
+
+import com.vci.frameworkcore.compatibility.SmUserQueryServiceI;
+
+import java.util.concurrent.Delayed;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 瑙i攣鐢ㄦ埛鐨勫欢鏃朵换鍔�
+ * 姣忎釜浠诲姟鐨勬墽琛屾椂闂村彲鑳戒細涓嶄竴鏍�
+ * @author weidy
+ * @date 2020/2/5
+ */
+public class SmUserUnLockTask implements Delayed {
+
+    /**
+     * 鐢ㄦ埛鏈嶅姟
+    **/
+    final private SmUserQueryServiceI userService;
+
+    /**
+     * 鐢ㄦ埛鐨勪富閿�
+     */
+    final private String userId ;
+
+    /**
+     * 寤舵椂鏃堕棿
+     */
+    final private Long delayTime;
+
+    public SmUserUnLockTask(SmUserQueryServiceI userService, String userId, Long delayTime) {
+        super();
+        this.userService = userService;
+        this.userId = userId;
+        this.delayTime = delayTime + System.currentTimeMillis();
+    }
+
+    public SmUserQueryServiceI getUserService() {
+        return userService;
+    }
+
+    public String getUserId() {
+        return userId;
+    }
+
+    public Long getDelayTime() {
+        return delayTime;
+    }
+
+    /**
+     * Returns the remaining delay associated with this object, in the
+     * given time unit.
+     *
+     * @param unit the time unit
+     * @return the remaining delay; zero or negative values indicate
+     * that the delay has already elapsed
+     */
+    @Override
+    public long getDelay(TimeUnit unit) {
+        return unit.convert(this.delayTime - System.currentTimeMillis(), unit);
+    }
+
+    /**
+     * Compares this object with the specified object for order.  Returns a
+     * negative integer, zero, or a positive integer as this object is less
+     * than, equal to, or greater than the specified object.
+     *
+     * <p>The implementor must ensure <tt>sgn(x.compareTo(y)) ==
+     * -sgn(y.compareTo(x))</tt> for all <tt>x</tt> and <tt>y</tt>.  (This
+     * implies that <tt>x.compareTo(y)</tt> must throw an exception iff
+     * <tt>y.compareTo(x)</tt> throws an exception.)
+     *
+     * <p>The implementor must also ensure that the relation is transitive:
+     * <tt>(x.compareTo(y)&gt;0 &amp;&amp; y.compareTo(z)&gt;0)</tt> implies
+     * <tt>x.compareTo(z)&gt;0</tt>.
+     *
+     * <p>Finally, the implementor must ensure that <tt>x.compareTo(y)==0</tt>
+     * implies that <tt>sgn(x.compareTo(z)) == sgn(y.compareTo(z))</tt>, for
+     * all <tt>z</tt>.
+     *
+     * <p>It is strongly recommended, but <i>not</i> strictly required that
+     * <tt>(x.compareTo(y)==0) == (x.equals(y))</tt>.  Generally speaking, any
+     * class that implements the <tt>Comparable</tt> interface and violates
+     * this condition should clearly indicate this fact.  The recommended
+     * language is "Note: this class has a natural ordering that is
+     * inconsistent with equals."
+     *
+     * <p>In the foregoing description, the notation
+     * <tt>sgn(</tt><i>expression</i><tt>)</tt> designates the mathematical
+     * <i>signum</i> function, which is defined to return one of <tt>-1</tt>,
+     * <tt>0</tt>, or <tt>1</tt> according to whether the value of
+     * <i>expression</i> is negative, zero or positive.
+     *
+     * @param o the object to be compared.
+     * @return a negative integer, zero, or a positive integer as this object
+     * is less than, equal to, or greater than the specified object.
+     * @throws NullPointerException if the specified object is null
+     * @throws ClassCastException   if the specified object's type prevents it
+     *                              from being compared to this object.
+     */
+    @Override
+    public int compareTo(Delayed o) {
+        long delta = getDelay(TimeUnit.NANOSECONDS) - o.getDelay(TimeUnit.NANOSECONDS);
+        return (int) delta;
+    }
+
+    /**
+     * 瀵规瘮
+     * @param obj
+     * @return
+     */
+    @Override
+    public boolean equals(Object obj) {
+        if (obj instanceof String) {
+            return this.userId.equals(((String) obj));
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return "SmUserUnLockTask{" +
+                "userService=" + userService +
+                ", userId='" + userId + '\'' +
+                ", delayTime=" + delayTime +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/ajaxTask/SmUserUnLockTaskManager.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/ajaxTask/SmUserUnLockTaskManager.java
new file mode 100644
index 0000000..f985238
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/ajaxTask/SmUserUnLockTaskManager.java
@@ -0,0 +1,79 @@
+package com.vci.frameworkcore.ajaxTask;
+
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.util.VciDateUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+import java.util.concurrent.DelayQueue;
+import java.util.concurrent.Executors;
+
+/**
+ * 瑙i攣鐨勫欢鏃朵换鍔$鐞�
+ * @author weidy
+ * @date 2020/2/5
+ */
+@Component
+public class SmUserUnLockTaskManager{
+    /**
+     * 鏃ュ織瀵硅薄
+     */
+    private final Logger logger = LoggerFactory.getLogger(SmUserUnLockTaskManager.class);
+    /**
+     * 寤舵椂闃熷垪
+     */
+    private DelayQueue<SmUserUnLockTask> delayQueue = new DelayQueue<>();
+
+    /**
+     * 娣诲姞鏂扮殑浠诲姟
+     * @param task 浠诲姟瀵硅薄
+     */
+    public void put(SmUserUnLockTask task){
+        if(logger.isInfoEnabled()){
+            logger.info("鐢ㄦ埛{}鍦▄}鏃跺姞鍏ヨВ閿侀槦鍒�",task.getUserId(), VciDateUtil.getNowString());
+        }
+        delayQueue.put(task);
+    }
+
+    /**
+     * 鍙栨秷寤舵椂浠诲姟
+     * @param userUnLockTask 鐢ㄦ埛浠诲姟
+     * @return true琛ㄧず鎵ц鎴愬姛
+     */
+    public boolean remove(SmUserUnLockTask userUnLockTask){
+        if(logger.isInfoEnabled() && userUnLockTask!=null){
+            logger.info("鍙栨秷瑙i攣鐢ㄦ埛{}",userUnLockTask.getUserId());
+        }
+        return delayQueue.remove(userUnLockTask);
+    }
+
+    /**
+     * 浠诲姟鎵ц鐨勭嚎绋�
+     * @param args 鍙傛暟
+     * @throws Exception
+     */
+    public void run(String... args) throws Exception {
+        Executors.newSingleThreadExecutor().execute(new Thread(this::excuteThread));
+    }
+
+    /**
+     * 寤舵椂浠诲姟鎵ц绾跨▼
+     */
+    private void excuteThread() {
+        while (true) {
+            try {
+                SmUserUnLockTask task = delayQueue.take();
+                if(task!=null && StringUtils.isBlank(task.getUserId())){
+                    task.getUserService().unLockUser(task.getUserId());
+                }
+            } catch (VciBaseException | InterruptedException e) {
+                if(logger.isErrorEnabled()){
+                    logger.error("瑙i攣鐢ㄦ埛鍑虹幇浜嗛敊璇�",e);
+                }
+                break;
+            }
+        }
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/compatibility/ISmFunctionQueryService.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/compatibility/ISmFunctionQueryService.java
new file mode 100644
index 0000000..4596704
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/compatibility/ISmFunctionQueryService.java
@@ -0,0 +1,144 @@
+package com.vci.frameworkcore.compatibility;
+
+import com.vci.corba.common.VCIError;
+import com.vci.frameworkcore.enumpck.ResourceControlTypeEnum;
+import com.vci.frameworkcore.pagemodel.MenuVO;
+import com.vci.frameworkcore.pagemodel.SmFunctionVO;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.starter.web.pagemodel.Tree;
+import com.vci.starter.web.pagemodel.TreeQueryObject;
+import com.vci.web.pageModel.UIContentVO;
+import com.vci.web.service.OsBaseServiceI;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 鍔熻兘鑿滃崟鐨勬煡璇㈡湇鍔★紝杩欎釜鍏煎鑰佸钩鍙� 璇蜂笉鏄痜ramework鐨勬湇鍔′笉瑕佺洿鎺ユ敞鍏ヨ繖涓湇鍔�
+ * @author weidy
+ * @date 2020/3/1
+ */
+public interface ISmFunctionQueryService extends OsBaseServiceI {
+
+    /**
+     * 鏌ヨ鎵�鏈夌殑鍔熻兘
+     * @return 鍔熻兘鐨勬樉绀哄璞�
+     */
+    List<SmFunctionVO> selectAllFunction();
+
+    /**
+     * 鏌ヨ鎵�鏈夌殑鍔熻兘鏄犲皠
+     * @return 鍔熻兘鐨勬樉绀哄璞�
+     */
+    Map<String,SmFunctionVO> selectAllFunctionMap();
+
+    /**
+     * 鏍规嵁鐢ㄦ埛鏌ヨ鍏宠仈鐨勬潈闄�
+     * @param userOid 鐢ㄦ埛鐨勪富閿�
+     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滆鐢ㄧ敤鎴风殑灞炴�ф煡璇紝鍙互浣跨敤pkUser.xxx
+     * @param resourceControlTypeEnum 瑙掕壊鎺у埗鍖哄煙锛屼篃鏄姛鑳芥帶鍒剁殑鍖哄煙
+     * @return 鏉冮檺鐨勬樉绀哄璞★紝鏈浆鍖栦负涓婁笅绾у叧绯�
+     */
+    List<SmFunctionVO> listFunctionByUserOid(String userOid, Map<String, String> queryMap, ResourceControlTypeEnum resourceControlTypeEnum);
+
+    /**
+     * 鑾峰彇褰撳墠瑙掕壊鐨勮彍鍗�
+     * @param treeQueryObject 灞炴�ф煡璇㈠璞�
+     * @param resourceControlTypeEnum 瑙掕壊鎺у埗鍖哄煙锛屼篃鏄姛鑳芥帶鍒剁殑鍖哄煙
+     * @return 鑿滃崟锛屽寘鍚笂涓嬬骇
+     */
+    List<MenuVO> treeCurrentUserMenu(TreeQueryObject treeQueryObject, ResourceControlTypeEnum resourceControlTypeEnum) throws VCIError;
+
+    /**
+     * 鑾峰彇鎵�鏈夌殑鍔熻兘鑿滃崟
+     * @param treeQueryObject 鏍戞煡璇㈠璞�
+     * @param resourceControlTypeEnum 瑙掕壊鎺у埗鍖哄煙锛屼篃鏄姛鑳芥帶鍒剁殑鍖哄煙
+     * @return  鏍戣妭鐐癸紝鍑虹幇閿欒浼氬湪寮傚父澶勭悊鍣ㄤ腑缁熶竴杩斿洖Json
+     */
+     List<Tree> treeAllMenu(TreeQueryObject treeQueryObject, ResourceControlTypeEnum resourceControlTypeEnum);
+
+
+    /**
+     * 閫氳繃涓婄骇鑺傜偣鑾峰彇涓嬬骇鐨勬墍鏈夌殑鑿滃崟鑺傜偣
+     *  @param treeQueryObject 鏍戞煡璇㈠璞�
+     *  @param resourceControlTypeEnum 瑙掕壊鎺у埗鍖哄煙锛屼篃鏄姛鑳芥帶鍒剁殑鍖哄煙
+     * @return  鏍戣妭鐐癸紝鍑虹幇閿欒浼氬湪寮傚父澶勭悊鍣ㄤ腑缁熶竴杩斿洖Json
+     */
+     List<Tree> treeFunctionByParent(TreeQueryObject treeQueryObject, ResourceControlTypeEnum resourceControlTypeEnum);
+
+    /**
+     * 閫氳繃涓婄骇鑺傜偣鑾峰彇褰撳墠瑙掕壊鏈夋潈闄愮殑涓嬬骇鐨勬墍鏈夌殑鑿滃崟鑺傜偣
+     *  @param treeQueryObject 鏍戞煡璇㈠璞�
+     *  @param resourceControlTypeEnum 瑙掕壊鎺у埗鍖哄煙锛屼篃鏄姛鑳芥帶鍒剁殑鍖哄煙
+     * @return 鏍戣妭鐐癸紝鍑虹幇閿欒浼氬湪寮傚父澶勭悊鍣ㄤ腑缁熶竴杩斿洖Json
+     */
+     List<Tree> treeCurrentFunctionByParent(TreeQueryObject treeQueryObject, ResourceControlTypeEnum resourceControlTypeEnum) ;
+
+    /**
+     * 鑾峰彇绯荤粺鍔熻兘鍒楄〃
+     * @param queryMap 鏌ヨ鏉′欢
+     * @param pageHelper 鎺掑簭鍜屽垎椤靛璞�
+     * @return DataGrid 绯荤粺鍔熻兘鍒楄〃
+     */
+    DataGrid<SmFunctionVO> dataGrid(Map<String, String> queryMap, PageHelper pageHelper);
+
+    /**
+     * 鏍规嵁瑙掕壊涓婚敭鑾峰彇鍏宠仈鐨勬潈闄�
+     * @param roleOid 瑙掕壊涓婚敭
+     * @param resourceControlTypeEnum 瑙掕壊鎺у埗鍖哄煙锛屼篃鏄姛鑳芥帶鍒剁殑鍖哄煙
+     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滈渶瑕佷娇鐢ㄨ鑹茬殑灞炴�ф潵鏌ヨ鍙互浣跨敤pkUser.xxxx
+     * @return 鏉冮檺鐨勬樉绀哄璞�
+     */
+    List<SmFunctionVO> listFunctionByRoleOid(String roleOid, Map<String, String> queryMap, ResourceControlTypeEnum resourceControlTypeEnum);
+
+    /**
+     * 鑾峰彇鏈叧鑱旀煇涓鑹茬殑鏉冮檺
+     * @param roleOid 瑙掕壊涓婚敭
+     * @param resourceControlTypeEnum 瑙掕壊鎺у埗鍖哄煙锛屼篃鏄姛鑳芥帶鍒剁殑鍖哄煙
+     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滈渶瑕佷娇鐢ㄨ鑹茬殑灞炴�ф潵鏌ヨ鍙互浣跨敤pkUser.xxxx
+     * @return 鏉冮檺鐨勬樉绀哄璞�
+     */
+    List<SmFunctionVO> listFunctionUnInRoleOid(String roleOid, Map<String, String> queryMap, ResourceControlTypeEnum resourceControlTypeEnum);
+
+    /**
+     * 鑾峰彇鏈叧鑱旀煇涓鑹茬殑鏉冮檺
+     * @param roleOid 瑙掕壊涓婚敭
+     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滈渶瑕佷娇鐢ㄨ鑹茬殑灞炴�ф潵鏌ヨ鍙互浣跨敤pkUser.xxxx
+     * @param resourceControlTypeEnum 瑙掕壊鎺у埗鍖哄煙锛屼篃鏄姛鑳芥帶鍒剁殑鍖哄煙
+     * @param pageHelper 鍒嗛〉鍜屾帓搴忓璞★紝鑰佸钩鍙颁笉鏀寔浣跨敤鏉冮檺缂栧彿鏉ユ帓搴�
+     * @return 鏉冮檺鐨勬樉绀哄璞�
+     */
+    DataGrid<SmFunctionVO> gridFunctionUninRoleOid(String roleOid, Map<String, String> queryMap, PageHelper pageHelper, ResourceControlTypeEnum resourceControlTypeEnum);
+
+    /**
+     * 鎵归噺鏍规嵁瑙掕壊鐨勪富閿潵鑾峰彇鏉冮檺
+     * @param roleOidCollection 瑙掕壊涓婚敭闆嗗悎
+     * @param resourceControlTypeEnum 瑙掕壊鎺у埗鍖哄煙锛屼篃鏄姛鑳芥帶鍒剁殑鍖哄煙
+     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滈渶瑕佷娇鐢ㄨ鑹茬殑灞炴�ф潵鏌ヨ鍙互浣跨敤pkRole.xxxx
+     * @return 鏉冮檺鐨勬樉绀哄璞★紝key鏄鑹蹭富閿�,value鏄繖涓鑹插叧鑱旂殑鏉冮檺
+     */
+    Map<String,List<SmFunctionVO>> batchListFunctionByRoleOids(Collection<String> roleOidCollection, Map<String, String> queryMap, ResourceControlTypeEnum resourceControlTypeEnum);
+
+    /**
+     * 鎵归噺鏍规嵁瑙掕壊鐨勪富閿幏鍙栧叧鑱旂殑鏉冮檺
+     * @param roleOidCollection 瑙掕壊鐨勪富閿泦鍚�
+     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滈渶瑕佷娇鐢ㄨ鑹茬殑灞炴�ф潵鏌ヨ鍙互浣跨敤pkRole.xxxx
+     * @param resourceControlTypeEnum 瑙掕壊鎺у埗鍖哄煙锛屼篃鏄姛鑳芥帶鍒剁殑鍖哄煙
+     * @return 鏉冮檺鐨勬樉绀哄璞�,浼氬幓闄ら噸澶嶇殑椤�
+     */
+    List<SmFunctionVO> listFunctionByRoleOids(Collection<String> roleOidCollection, Map<String, String> queryMap, ResourceControlTypeEnum resourceControlTypeEnum);
+
+    /**
+     * 鎵归噺鏍规嵁瑙掕壊鐨勪富閿幏鍙栧叧鑱旂殑鏉冮檺
+     * @param roleOidCollection 瑙掕壊鐨勪富閿泦鍚�
+     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滈渶瑕佷娇鐢ㄨ鑹茬殑灞炴�ф潵鏌ヨ鍙互浣跨敤pkRole.xxxx
+     * @param resourceControlTypeEnum 瑙掕壊鎺у埗鍖哄煙锛屼篃鏄姛鑳芥帶鍒剁殑鍖哄煙
+     * @param pageHelper 鍒嗛〉瀵硅薄
+     * @return 鏉冮檺鐨勬樉绀哄璞�,浼氬幓闄ら噸澶嶇殑椤�
+     */
+    DataGrid<SmFunctionVO> gridFunctionByRoleOids(Collection<String> roleOidCollection, Map<String, String> queryMap, PageHelper pageHelper, ResourceControlTypeEnum resourceControlTypeEnum);
+
+    UIContentVO getUIContentByBtmTypeAndId(TreeQueryObject treeQueryObject, ResourceControlTypeEnum bs) throws VCIError;
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/compatibility/OrgDeptQueryServiceI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/compatibility/OrgDeptQueryServiceI.java
new file mode 100644
index 0000000..5805af3
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/compatibility/OrgDeptQueryServiceI.java
@@ -0,0 +1,117 @@
+package com.vci.frameworkcore.compatibility;
+
+import com.vci.frameworkcore.pagemodel.OrgDepartmentVO;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.starter.web.pagemodel.Tree;
+import com.vci.starter.web.pagemodel.TreeQueryObject;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 閮ㄩ棬鐨勬煡璇㈡湇鍔★紝鍏煎鑰佸钩鍙�
+ * @author weidy
+ * @date 2020/3/1
+ */
+public interface OrgDeptQueryServiceI {
+
+    /**
+     * 鏍规嵁閮ㄩ棬涓婚敭鑾峰彇閮ㄩ棬鐨勪俊鎭�
+     * @param deptOid 閮ㄩ棬涓婚敭
+     * @return 閮ㄩ棬鐨勬樉绀哄璞★紝濡傛灉閮ㄩ棬涓嶅瓨鍦ㄥ垯杩斿洖null锛屼笉浼氭姏鍑哄紓甯�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮暟鎹簱瀛樺湪闂鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    OrgDepartmentVO getDeptByDeptOid(String deptOid) throws VciBaseException;
+
+    /**
+     * 鎵归噺鑾峰彇閮ㄩ棬鐨勪俊鎭� 锛堟牴鎹儴闂ㄤ富閿級
+     * @param deptOidCollections 閮ㄩ棬涓婚敭鐨勯泦鍚堬紝鍙互瓒呰繃1000涓�
+     * @return 閮ㄩ棬鐨勬樉绀哄璞★紝濡傛灉閮ㄩ棬涓嶅瓨鍦ㄥ垯杩斿洖绌虹殑鍒楄〃锛屼笉浼氭姏鍑哄紓甯�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮暟鎹簱瀛樺湪闂鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    List<OrgDepartmentVO> listDeptByDeptOids(Collection<String> deptOidCollections) throws VciBaseException;
+
+    /**
+     * 鑾峰彇閮ㄩ棬鐨勫垪琛紝榛樿浼氫互閮ㄩ棬鍚嶇О鍗囧簭鎺掑垪锛岄儴闂ㄧ殑缂栬緫椤甸潰鍒楄〃涓嶈浣跨敤杩欎釜鎺ュ彛
+     * @param queryMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉鍜屾帓搴忕殑淇℃伅锛屽湪鍏煎鑰佸钩鍙扮殑鏃跺�欎細鑷姩鍏煎锛屽鏋滃睘鎬т笉瀛樺湪浼氳嚜鍔ㄥ拷鐣�
+     * @return 閮ㄩ棬鐨勬樉绀哄璞″垪琛�
+     * @throws VciBaseException 鍙傛暟涓虹┖鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    DataGrid<OrgDepartmentVO> gridDepts(Map<String, String> queryMap, PageHelper pageHelper) throws VciBaseException;
+
+    /**
+     * 鏍规嵁閮ㄩ棬涓婚敭鑾峰彇閮ㄩ棬鐨勫鍚�
+     * @param deptOid 閮ㄩ棬涓婚敭
+     * @return 閮ㄩ棬濮撳悕锛屽鏋滀笉瀛樺湪浼氳繑鍥瀗ull
+     */
+    String getDeptNameByDeptOid(String deptOid);
+
+    /**
+     * 鏍规嵁鐢ㄦ埛涓婚敭鑾峰彇鍏宠仈鐨勯儴闂�
+     * @param userOid 鐢ㄦ埛涓婚敭
+     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滈渶瑕佷娇鐢ㄧ敤鎴风殑灞炴�ф潵鏌ヨ鍙互浣跨敤pkUser.xxxx
+     * @return 閮ㄩ棬鐨勬樉绀哄璞�
+     */
+    OrgDepartmentVO listDeptByUserOid(String userOid, Map<String, String> queryMap);
+
+
+    /**
+     * 鑾峰彇鏈叧鑱旀煇涓敤鎴风殑閮ㄩ棬
+     * @param userOid 鐢ㄦ埛涓婚敭
+     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滈渶瑕佷娇鐢ㄧ敤鎴风殑灞炴�ф潵鏌ヨ鍙互浣跨敤pkUser.xxxx
+     * @return 閮ㄩ棬鐨勬樉绀哄璞�
+     */
+    List<OrgDepartmentVO> listDeptUnInUserOid(String userOid, Map<String, String> queryMap);
+
+    /**
+     * 鑾峰彇鏈叧鑱旀煇涓敤鎴风殑閮ㄩ棬
+     * @param userOid 鐢ㄦ埛涓婚敭
+     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滈渶瑕佷娇鐢ㄧ敤鎴风殑灞炴�ф潵鏌ヨ鍙互浣跨敤pkUser.xxxx
+     * @param pageHelper 鍒嗛〉鍜屾帓搴忓璞★紝鑰佸钩鍙颁笉鏀寔浣跨敤閮ㄩ棬缂栧彿鏉ユ帓搴�
+     * @return 閮ㄩ棬鐨勬樉绀哄璞�
+     */
+    DataGrid<OrgDepartmentVO>  gridDeptUninUserOid(String userOid, Map<String, String> queryMap, PageHelper pageHelper);
+
+    /**
+     * 鎵归噺鏍规嵁鐢ㄦ埛鐨勪富閿潵鑾峰彇閮ㄩ棬
+     * @param userOidCollection 鐢ㄦ埛涓婚敭闆嗗悎
+     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滈渶瑕佷娇鐢ㄧ敤鎴风殑灞炴�ф潵鏌ヨ鍙互浣跨敤pkUser.xxxx
+     * @return 閮ㄩ棬鐨勬樉绀哄璞★紝key鏄敤鎴蜂富閿�,value鏄繖涓敤鎴峰叧鑱旂殑閮ㄩ棬
+     */
+    Map<String,List<OrgDepartmentVO>> batchListDeptByUserOids(Collection<String> userOidCollection, Map<String, String> queryMap);
+
+    /**
+     * 鑾峰彇鏌愪釜閮ㄩ棬鐨勭洿灞炰笅绾ч儴闂�
+     * @param pkFatherDepartmment 閮ㄩ棬鐨勪富閿�
+     * @param queryMap 鏌ヨ鏉′欢
+     * @return 閮ㄩ棬鏄剧ず瀵硅薄
+     */
+    List<OrgDepartmentVO> listChildrenDeptByParentOid(String pkFatherDepartmment, Map<String, String> queryMap);
+
+    /**
+     * 鑾峰彇鏌愪釜閮ㄩ棬鐨勬墍鏈夋浘缁忕殑涓嬬骇閮ㄩ棬
+     * @param pkFatherDepartmment 閮ㄩ棬鐨勪富閿�
+     * @param queryMap 鏌ヨ鏉′欢
+     * @return 閮ㄩ棬鏄剧ず瀵硅薄
+     */
+    List<OrgDepartmentVO> listAllLevelChildrenDeptByParentOid(String pkFatherDepartmment, Map<String, String> queryMap);
+
+    /**
+     * 鍙傜収鏍戝舰鏁版嵁鐨勯儴闂ㄤ俊鎭�
+     * @param treeQueryObject 鏍戝舰鏌ヨ鐨勬潯浠�
+     * @return 鏍戣妭鐐�
+     */
+    List<Tree> refTreeDept(TreeQueryObject treeQueryObject);
+
+    /**
+     * 鍙傜収鏍戝舰琛ㄦ牸鐨勯儴闂ㄤ俊鎭紝涓婄骇閮ㄩ棬鐨勬槸琛ㄦ牸涓殑鏍戝舰鍒�
+     * @param treeQueryObject 鏍戝舰鏌ヨ鐨勬潯浠�
+     * @return 閮ㄩ棬鐨勬爲琛ㄤ俊鎭�
+     */
+    DataGrid refTreeGridDept(TreeQueryObject treeQueryObject);
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/compatibility/OrgDutyQueryServiceI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/compatibility/OrgDutyQueryServiceI.java
new file mode 100644
index 0000000..703a24d
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/compatibility/OrgDutyQueryServiceI.java
@@ -0,0 +1,102 @@
+package com.vci.frameworkcore.compatibility;
+
+import com.vci.frameworkcore.pagemodel.OrgDutyVO;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.starter.web.pagemodel.Tree;
+import com.vci.starter.web.pagemodel.TreeQueryObject;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 鑱屽姟鏌ヨ鐨勬湇鍔★紝鍏煎鑰佺殑骞冲彴
+ * @author weidy
+ * @date 2020/3/1
+ */
+public interface OrgDutyQueryServiceI {
+    /**
+     * 鏍规嵁鑱屽姟涓婚敭鑾峰彇鑱屽姟鐨勪俊鎭�
+     * @param dutyOid 鑱屽姟涓婚敭
+     * @return 鑱屽姟鐨勬樉绀哄璞★紝濡傛灉鑱屽姟涓嶅瓨鍦ㄥ垯杩斿洖null锛屼笉浼氭姏鍑哄紓甯�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮暟鎹簱瀛樺湪闂鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    OrgDutyVO getDutyByDutyOid(String dutyOid) throws VciBaseException;
+
+    /**
+     * 鎵归噺鑾峰彇鑱屽姟鐨勪俊鎭� 锛堟牴鎹亴鍔′富閿級
+     * @param dutyOidCollections 鑱屽姟涓婚敭鐨勯泦鍚堬紝鍙互瓒呰繃1000涓�
+     * @return 鑱屽姟鐨勬樉绀哄璞★紝濡傛灉鑱屽姟涓嶅瓨鍦ㄥ垯杩斿洖绌虹殑鍒楄〃锛屼笉浼氭姏鍑哄紓甯�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮暟鎹簱瀛樺湪闂鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    List<OrgDutyVO> listDutyByDutyOids(Collection<String> dutyOidCollections) throws VciBaseException;
+
+    /**
+     * 鑾峰彇鑱屽姟鐨勫垪琛紝榛樿浼氫互鑱屽姟鍚嶇О鍗囧簭鎺掑垪锛岃亴鍔$殑缂栬緫椤甸潰鍒楄〃涓嶈浣跨敤杩欎釜鎺ュ彛
+     * @param queryMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉鍜屾帓搴忕殑淇℃伅锛屽湪鍏煎鑰佸钩鍙扮殑鏃跺�欎細鑷姩鍏煎锛屽鏋滃睘鎬т笉瀛樺湪浼氳嚜鍔ㄥ拷鐣�
+     * @return 鑱屽姟鐨勬樉绀哄璞″垪琛�
+     * @throws VciBaseException 鍙傛暟涓虹┖鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    DataGrid<OrgDutyVO> gridDutys(Map<String, String> queryMap, PageHelper pageHelper) throws VciBaseException;
+
+    /**
+     * 鏍规嵁鑱屽姟涓婚敭鑾峰彇鑱屽姟鐨勫鍚�
+     * @param dutyOid 鑱屽姟涓婚敭
+     * @return 鑱屽姟濮撳悕锛屽鏋滀笉瀛樺湪浼氳繑鍥瀗ull
+     */
+    String getDutyNameByDutyOid(String dutyOid);
+
+    /**
+     * 鏍规嵁鐢ㄦ埛涓婚敭鑾峰彇鍏宠仈鐨勮亴鍔�
+     * @param userOid 鐢ㄦ埛涓婚敭
+     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滈渶瑕佷娇鐢ㄧ敤鎴风殑灞炴�ф潵鏌ヨ鍙互浣跨敤pkUser.xxxx
+     * @return 鑱屽姟鐨勬樉绀哄璞�
+     */
+    OrgDutyVO listDutyByUserOid(String userOid, Map<String, String> queryMap);
+
+    /**
+     * 鑾峰彇鏈叧鑱旀煇涓敤鎴风殑鑱屽姟
+     * @param userOid 鐢ㄦ埛涓婚敭
+     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滈渶瑕佷娇鐢ㄧ敤鎴风殑灞炴�ф潵鏌ヨ鍙互浣跨敤pkUser.xxxx
+     * @return 鑱屽姟鐨勬樉绀哄璞�
+     */
+    List<OrgDutyVO> listDutyUnInUserOid(String userOid, Map<String, String> queryMap);
+
+    /**
+     * 鑾峰彇鏈叧鑱旀煇涓敤鎴风殑鑱屽姟
+     * @param userOid 鐢ㄦ埛涓婚敭
+     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滈渶瑕佷娇鐢ㄧ敤鎴风殑灞炴�ф潵鏌ヨ鍙互浣跨敤pkUser.xxxx
+     * @param pageHelper 鍒嗛〉鍜屾帓搴忓璞★紝鑰佸钩鍙颁笉鏀寔浣跨敤鑱屽姟缂栧彿鏉ユ帓搴�
+     * @return 鑱屽姟鐨勬樉绀哄璞�
+     */
+    DataGrid<OrgDutyVO>  gridDutyUninUserOid(String userOid, Map<String, String> queryMap, PageHelper pageHelper);
+
+    /**
+     * 鎵归噺鏍规嵁鐢ㄦ埛鐨勪富閿潵鑾峰彇鑱屽姟
+     * @param userOidCollection 鐢ㄦ埛涓婚敭闆嗗悎
+     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滈渶瑕佷娇鐢ㄧ敤鎴风殑灞炴�ф潵鏌ヨ鍙互浣跨敤pkUser.xxxx
+     * @return 鑱屽姟鐨勬樉绀哄璞★紝key鏄敤鎴蜂富閿�,value鏄繖涓敤鎴峰叧鑱旂殑鑱屽姟
+     */
+    Map<String,List<OrgDutyVO>> batchListDutyByUserOids(Collection<String> userOidCollection, Map<String, String> queryMap);
+
+    /**
+     * 鍙傜収鑱屽姟鐨勫垪琛紝榛樿浼氫互鑱屽姟鍚嶇О鍗囧簭鎺掑垪锛屽彧鏄剧ず鍚敤鐨勮亴鍔�
+     * @param queryMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉鍜屾帓搴忕殑淇℃伅锛屽湪鍏煎鑰佸钩鍙扮殑鏃跺�欎細鑷姩鍏煎锛屽鏋滃睘鎬т笉瀛樺湪浼氳嚜鍔ㄥ拷鐣�
+     * @return 鑱屽姟鐨勬樉绀哄璞″垪琛�
+     * @throws VciBaseException 鍙傛暟涓虹┖鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    DataGrid<OrgDutyVO> refGridDutys(Map<String, String> queryMap, PageHelper pageHelper) throws VciBaseException;
+
+    /**
+     * 鑱屽姟鐨勫弬鐓ф爲
+     * @param treeQueryObject 鏍戝舰鐨勬煡璇㈠璞�
+     * @return 鑱屽姟鏍戯紝浼氬寘鍚亴鍔$殑鎵�鏈夊睘鎬�
+     * @throws VciBaseException
+     */
+    List<Tree> refTreeDutys(TreeQueryObject treeQueryObject) throws VciBaseException;
+    
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/compatibility/SmRoleQueryServiceI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/compatibility/SmRoleQueryServiceI.java
new file mode 100644
index 0000000..5531242
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/compatibility/SmRoleQueryServiceI.java
@@ -0,0 +1,153 @@
+package com.vci.frameworkcore.compatibility;
+
+import com.vci.frameworkcore.pagemodel.SmRoleVO;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.starter.web.pagemodel.Tree;
+import com.vci.starter.web.pagemodel.TreeQueryObject;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 瑙掕壊鐨勬煡璇㈡湇鍔★紝鍏煎鏉ュ钩鍙帮紝鎵�鏈夌殑鎺ュ彛閮借繑鍥炴柊鐨勮鑹叉樉绀哄璞�
+ * @author weidy
+ * @date 2020/3/1
+ */
+public interface SmRoleQueryServiceI {
+
+    /**
+     * 鏍规嵁瑙掕壊涓婚敭鑾峰彇瑙掕壊鐨勪俊鎭�
+     * @param roleOid 瑙掕壊涓婚敭
+     * @return 瑙掕壊鐨勬樉绀哄璞★紝濡傛灉瑙掕壊涓嶅瓨鍦ㄥ垯杩斿洖null锛屼笉浼氭姏鍑哄紓甯�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮暟鎹簱瀛樺湪闂鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    SmRoleVO getRoleByRoleOid(String roleOid) throws VciBaseException;
+
+    /**
+     * 鎵归噺鑾峰彇瑙掕壊鐨勪俊鎭� 锛堟牴鎹鑹蹭富閿級
+     * @param roleOidCollections 瑙掕壊涓婚敭鐨勯泦鍚堬紝鍙互瓒呰繃1000涓�
+     * @return 瑙掕壊鐨勬樉绀哄璞★紝濡傛灉瑙掕壊涓嶅瓨鍦ㄥ垯杩斿洖绌虹殑鍒楄〃锛屼笉浼氭姏鍑哄紓甯�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮暟鎹簱瀛樺湪闂鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    List<SmRoleVO> listRoleByRoleOids(Collection<String> roleOidCollections) throws VciBaseException;
+
+    /**
+     * 鑾峰彇瑙掕壊鐨勫垪琛紝榛樿浼氫互瑙掕壊鍚嶅崌搴忔帓鍒楋紝瑙掕壊鐨勭紪杈戦〉闈㈠垪琛ㄤ笉瑕佷娇鐢ㄨ繖涓帴鍙�
+     * @param queryMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉鍜屾帓搴忕殑淇℃伅锛屽湪鍏煎鑰佸钩鍙扮殑鏃跺�欎細鑷姩鍏煎锛屽鏋滃睘鎬т笉瀛樺湪浼氳嚜鍔ㄥ拷鐣�
+     * @return 瑙掕壊鐨勬樉绀哄璞″垪琛�
+     * @throws VciBaseException 鍙傛暟涓虹┖鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    DataGrid<SmRoleVO> gridRoles(Map<String, String> queryMap, PageHelper pageHelper) throws VciBaseException;
+
+    /**
+     * 鏍规嵁瑙掕壊涓婚敭鑾峰彇瑙掕壊鐨勫鍚�
+     * @param roleOid 瑙掕壊涓婚敭
+     * @return 瑙掕壊濮撳悕锛屽鏋滀笉瀛樺湪浼氳繑鍥瀗ull
+     */
+    String getRoleNameByRoleOid(String roleOid);
+
+    /**
+     * 鏍规嵁鐢ㄦ埛涓婚敭鑾峰彇鍏宠仈鐨勮鑹�
+     * @param userOid 鐢ㄦ埛涓婚敭
+     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滈渶瑕佷娇鐢ㄧ敤鎴风殑灞炴�ф潵鏌ヨ鍙互浣跨敤pkUser.xxxx
+     * @return 瑙掕壊鐨勬樉绀哄璞�
+     */
+    List<SmRoleVO> listRoleByUserOid(String userOid, Map<String, String> queryMap);
+
+    /**
+     * 鏍规嵁鐢ㄦ埛涓婚敭鑾峰彇鍏宠仈鐨勮鑹�
+     * @param userOid 鐢ㄦ埛涓婚敭
+     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滈渶瑕佷娇鐢ㄧ敤鎴风殑灞炴�ф潵鏌ヨ鍙互浣跨敤pkUser.xxxx
+     * @param pageHelper 鍒嗛〉鍜屾帓搴忓璞★紝鑰佸钩鍙颁笉鏀寔浣跨敤瑙掕壊缂栧彿鏉ユ帓搴�
+     * @return 瑙掕壊鐨勬樉绀哄璞�
+     */
+    DataGrid<SmRoleVO>  gridRoleByUserOid(String userOid, Map<String, String> queryMap, PageHelper pageHelper);
+
+    /**
+     * 鑾峰彇鏈叧鑱旀煇涓敤鎴风殑瑙掕壊
+     * @param userOid 鐢ㄦ埛涓婚敭
+     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滈渶瑕佷娇鐢ㄧ敤鎴风殑灞炴�ф潵鏌ヨ鍙互浣跨敤pkUser.xxxx
+     * @return 瑙掕壊鐨勬樉绀哄璞�
+     */
+    List<SmRoleVO> listRoleUnInUserOid(String userOid, Map<String, String> queryMap);
+
+    /**
+     * 鑾峰彇鏈叧鑱旀煇涓敤鎴风殑瑙掕壊
+     * @param userOid 鐢ㄦ埛涓婚敭
+     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滈渶瑕佷娇鐢ㄧ敤鎴风殑灞炴�ф潵鏌ヨ鍙互浣跨敤pkUser.xxxx
+     * @param pageHelper 鍒嗛〉鍜屾帓搴忓璞★紝鑰佸钩鍙颁笉鏀寔浣跨敤瑙掕壊缂栧彿鏉ユ帓搴�
+     * @return 瑙掕壊鐨勬樉绀哄璞�
+     */
+    DataGrid<SmRoleVO> gridRoleUninUserOid(String userOid, Map<String, String> queryMap, PageHelper pageHelper);
+
+    /**
+     * 鎵归噺鏍规嵁鐢ㄦ埛鐨勪富閿潵鑾峰彇瑙掕壊
+     * @param userOidCollection 鐢ㄦ埛涓婚敭闆嗗悎
+     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滈渶瑕佷娇鐢ㄧ敤鎴风殑灞炴�ф潵鏌ヨ鍙互浣跨敤pkUser.xxxx
+     * @return 瑙掕壊鐨勬樉绀哄璞★紝key鏄敤鎴蜂富閿�,value鏄繖涓敤鎴峰叧鑱旂殑瑙掕壊
+     */
+    Map<String,List<SmRoleVO>> batchListRoleByUserOids(Collection<String> userOidCollection, Map<String, String> queryMap);
+
+    /**
+     * 鏍规嵁鏉冮檺涓婚敭鑾峰彇鍏宠仈鐨勮鑹�
+     * @param functionOid 鏉冮檺涓婚敭
+     * @param queryMap 鏌ヨ鏉′欢
+     * @return 瑙掕壊鐨勬樉绀哄璞�
+     */
+    List<SmRoleVO> listRoleByFunctionOid(String functionOid, Map<String, String> queryMap);
+
+    /**
+     * 鑾峰彇鏈叧鑱旀煇涓潈闄愮殑瑙掕壊
+     * @param functionOid 鏉冮檺涓婚敭
+     * @param queryMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉鍜屾帓搴忓璞★紝鑰佸钩鍙颁笉鏀寔浣跨敤瑙掕壊缂栧彿鏉ユ帓搴�
+     * @return 瑙掕壊鐨勬樉绀哄璞�
+     */
+    DataGrid<SmRoleVO>  gridRoleByFunctionOid(String functionOid, Map<String, String> queryMap, PageHelper pageHelper);
+
+    /**
+     * 鑾峰彇鏈叧鑱旀煇涓潈闄愮殑瑙掕壊
+     * @param functionOid 鏉冮檺涓婚敭
+     * @param queryMap 鏌ヨ鏉′欢
+     * @return 瑙掕壊鐨勬樉绀哄璞�
+     */
+    List<SmRoleVO> listRoleUnInFunctionOid(String functionOid, Map<String, String> queryMap);
+
+    /**
+     * 鏍规嵁鏉冮檺涓婚敭鑾峰彇鍏宠仈鐨勮鑹�
+     * @param functionOid 鏉冮檺涓婚敭
+     * @param queryMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉鍜屾帓搴忓璞★紝鑰佸钩鍙颁笉鏀寔浣跨敤瑙掕壊缂栧彿鏉ユ帓搴�
+     * @return 瑙掕壊鐨勬樉绀哄璞�
+     */
+    DataGrid<SmRoleVO>  gridRoleUnInFunctionOid(String functionOid, Map<String, String> queryMap, PageHelper pageHelper);
+
+    /**
+     * 鎵归噺鏍规嵁鏉冮檺鐨勪富閿潵鑾峰彇瑙掕壊
+     * @param functionOidCollection 鏉冮檺涓婚敭闆嗗悎
+     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滈渶瑕佷娇鐢ㄧ敤鎴风殑灞炴�ф潵鏌ヨ鍙互浣跨敤pkUser.xxxx
+     * @return 瑙掕壊鐨勬樉绀哄璞★紝key鏄潈闄愪富閿�,value鏄繖涓潈闄愬叧鑱旂殑瑙掕壊
+     */
+    Map<String,List<SmRoleVO>> batchListRoleByFunctionOids(Collection<String> functionOidCollection, Map<String, String> queryMap);
+
+    /**
+     * 鍙傜収瑙掕壊鐨勫垪琛紝涓夊憳绠$悊鐨勪笁涓鑹蹭笉浼氭樉绀�
+     * @param queryMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉鍜屾帓搴忕殑淇℃伅锛屽湪鍏煎鑰佸钩鍙扮殑鏃跺�欎細鑷姩鍏煎锛屽鏋滃睘鎬т笉瀛樺湪浼氳嚜鍔ㄥ拷鐣�
+     * @return 瑙掕壊鐨勬樉绀哄璞″垪琛�
+     * @throws VciBaseException 鍙傛暟涓虹┖鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    DataGrid<SmRoleVO> refGridRoles(Map<String, String> queryMap, PageHelper pageHelper) throws VciBaseException;
+
+    /**
+     * 瑙掕壊鐨勬爲褰㈠睍绀猴紝甯哥敤浜庤鑹查�夋嫨鐢ㄦ埛鐨勯〉闈娇鐢�
+     * @param treeQueryObject 鏍戞煡璇㈠璞�
+     * @return 鏍戠殑鑺傜偣
+     * @throws VciBaseException 鍙傛暟涓虹┖鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    List<Tree> refTreeRoles(TreeQueryObject treeQueryObject) throws VciBaseException;
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/compatibility/SmUserQueryServiceI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/compatibility/SmUserQueryServiceI.java
new file mode 100644
index 0000000..22c3431
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/compatibility/SmUserQueryServiceI.java
@@ -0,0 +1,246 @@
+package com.vci.frameworkcore.compatibility;
+
+import com.vci.frameworkcore.pagemodel.SmPasswordStrategyVO;
+import com.vci.frameworkcore.pagemodel.SmUserVO;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.starter.web.pagemodel.Tree;
+import com.vci.starter.web.pagemodel.TreeQueryObject;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 鐢ㄦ埛鐨勬煡璇㈢浉鍏崇殑鏈嶅姟锛屽彲浠ュ吋瀹硅�佸钩鍙板拰鑰佺殑pdm
+ * 鍏朵腑鍖呭惈鐧诲綍鐩稿叧鐨勬帴鍙e拰鍙傜収锛屾牴鎹富閿煡璇㈢瓑鎺ュ彛
+ * 鎵�鏈夌殑鏁版嵁鍏ㄩ儴杞崲涓烘柊骞冲彴鐨勫璞�
+ * @author weidy
+ * @date 2020/3/1
+ */
+public interface SmUserQueryServiceI{
+
+    /**
+     *  鏍规嵁鐢ㄦ埛鍚嶈幏鍙栫敤鎴风殑瀵硅薄锛屼笉鍖哄垎澶у皬鍐�
+     * @param userId 鐢ㄦ埛鍚�
+     * @return 鐢ㄦ埛鐨勬樉绀哄璞★紝濡傛灉鐢ㄦ埛涓嶅瓨鍦ㄥ垯杩斿洖null锛屼笉浼氭姏鍑哄紓甯�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮暟鎹簱瀛樺湪闂鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    SmUserVO getUserByUserId(String userId) throws VciBaseException;
+
+    /**
+     * 鎵归噺鑾峰彇鐢ㄦ埛鐨勪俊鎭紙鏍规嵁鐢ㄦ埛鍚嶏級
+     * @param userIdCollections 鐢ㄦ埛鍚嶇殑闆嗗悎,鍙互瓒呰繃1000涓�
+     * @return 鐢ㄦ埛鐨勬樉绀哄璞★紝濡傛灉鐢ㄦ埛涓嶅瓨鍦ㄥ垯杩斿洖绌虹殑鍒楄〃锛屼笉浼氭姏鍑哄紓甯�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮暟鎹簱瀛樺湪闂鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    List<SmUserVO> listUserByUserIds(Collection<String> userIdCollections) throws VciBaseException;
+
+    /**
+     * 鏍规嵁鐢ㄦ埛涓婚敭鑾峰彇鐢ㄦ埛鐨勪俊鎭�
+     * @param userOid 鐢ㄦ埛涓婚敭
+     * @return 鐢ㄦ埛鐨勬樉绀哄璞★紝濡傛灉鐢ㄦ埛涓嶅瓨鍦ㄥ垯杩斿洖null锛屼笉浼氭姏鍑哄紓甯�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮暟鎹簱瀛樺湪闂鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    SmUserVO getUserByUserOid(String userOid) throws VciBaseException;
+
+    /**
+     * 鎵归噺鑾峰彇鐢ㄦ埛鐨勪俊鎭� 锛堟牴鎹敤鎴蜂富閿級
+     * @param userOidCollections 鐢ㄦ埛涓婚敭鐨勯泦鍚堬紝鍙互瓒呰繃1000涓�
+     * @return 鐢ㄦ埛鐨勬樉绀哄璞★紝濡傛灉鐢ㄦ埛涓嶅瓨鍦ㄥ垯杩斿洖绌虹殑鍒楄〃锛屼笉浼氭姏鍑哄紓甯�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮暟鎹簱瀛樺湪闂鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    List<SmUserVO> listUserByUserOids(Collection<String> userOidCollections) throws VciBaseException;
+
+    /**
+     * 鑾峰彇鐢ㄦ埛鐨勫垪琛紝榛樿浼氫互鐢ㄦ埛鍚嶅崌搴忔帓鍒楋紝鐢ㄦ埛鐨勭紪杈戦〉闈㈠垪琛ㄤ笉瑕佷娇鐢ㄨ繖涓帴鍙�
+     * @param queryMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉鍜屾帓搴忕殑淇℃伅锛屽湪鍏煎鑰佸钩鍙扮殑鏃跺�欎細鑷姩鍏煎锛屽鏋滃睘鎬т笉瀛樺湪浼氳嚜鍔ㄥ拷鐣�
+     * @return 鐢ㄦ埛鐨勬樉绀哄璞″垪琛�
+     * @throws VciBaseException 鍙傛暟涓虹┖鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    DataGrid<SmUserVO> gridUsers(Map<String, String> queryMap, PageHelper pageHelper) throws VciBaseException;
+
+    /**
+     * 鏍规嵁鐢ㄦ埛鍚嶈幏鍙栫敤鎴风殑濮撳悕
+     * @param userId 鐢ㄦ埛鍚�
+     * @return 鐢ㄦ埛濮撳悕锛屽鏋滀笉瀛樺湪浼氳繑鍥濶ull
+     */
+    String getUserNameByUserId(String userId);
+
+    /**
+     * 鏍规嵁鐢ㄦ埛涓婚敭鑾峰彇鐢ㄦ埛鐨勫鍚�
+     * @param userOid 鐢ㄦ埛涓婚敭
+     * @return 鐢ㄦ埛濮撳悕锛屽鏋滀笉瀛樺湪浼氳繑鍥瀗ull
+     */
+    String getUserNameByUserOid(String userOid);
+
+    /**
+     * 鏌ヨ鏌愪釜閮ㄩ棬涓嬬殑鐢ㄦ埛瀵硅薄
+     * @param deptOid 閮ㄩ棬鐨勪富閿�
+     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滄槸閮ㄩ棬鐨勬煇涓睘鎬т綔涓烘煡璇㈡潯浠讹紝鍒欏彲浠ヤ娇鐢╬kDepartment.xxx杩欐牱鐨勬柟寮�
+     * @return 鐢ㄦ埛鐨勬樉绀哄璞″垪琛�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    List<SmUserVO> listUserByDeptOid(String deptOid, Map<String, String> queryMap) throws VciBaseException;
+
+    /**
+     * 鏌ヨ鏌愪釜閮ㄩ棬涓嬬殑鐢ㄦ埛瀵硅薄鍒楄〃
+     * @param deptOid 閮ㄩ棬鐨勪富閿�
+     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滄槸閮ㄩ棬鐨勬煇涓睘鎬т綔涓烘煡璇㈡潯浠讹紝鍒欏彲浠ヤ娇鐢╬kDepartment.xxx杩欐牱鐨勬柟寮�
+     * @param pageHelper 鍒嗛〉鍜屾帓搴忎俊鎭紝榛樿浣跨敤鐢ㄦ埛鍚嶅崌搴忔帓鍒�
+     * @return 鐢ㄦ埛鐨勬樉绀哄璞″垪琛紝榛樿浣跨敤鐢ㄦ埛鍚嶅崌搴忔帓鍒�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    DataGrid<SmUserVO> gridUserByDeptOid(String deptOid, Map<String, String> queryMap, PageHelper pageHelper) throws VciBaseException;
+
+    /**
+     * 鎵归噺鏍规嵁閮ㄩ棬鐨勪富閿幏鍙栫敤鎴�
+     * @param deptOidCollection 閮ㄩ棬鐨勪富閿泦鍚�
+     * @return 閮ㄩ棬涓婚敭鍜屽搴旂殑鐢ㄦ埛鏄剧ず瀵硅薄鍒楄〃鐨勬槧灏勶紝key閮ㄩ棬鐨勪富閿紝value鏄繖涓儴闂ㄤ笅鐨勭敤鎴�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    Map<String,List<SmUserVO>> batchListUserByDeptOids(Collection<String> deptOidCollection) throws VciBaseException;
+
+    /**
+     * 鏌ヨ涓嶅湪鏌愪釜閮ㄩ棬涓嬬殑鐢ㄦ埛瀵硅薄鍒楄〃
+     * @param deptOid 閮ㄩ棬鐨勪富閿�
+     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滄槸閮ㄩ棬鐨勬煇涓睘鎬т綔涓烘煡璇㈡潯浠讹紝鍒欏彲浠ヤ娇鐢╬kDepartment.xxx杩欐牱鐨勬柟寮�
+     * @return 鐢ㄦ埛鐨勬樉绀哄璞″垪琛紝榛樿浣跨敤鐢ㄦ埛鍚嶅崌搴忔帓鍒�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    List<SmUserVO> listUserUnInDeptOid(String deptOid, Map<String, String> queryMap) throws VciBaseException;
+
+    /**
+     * 鏌ヨ涓嶅湪鏌愪釜閮ㄩ棬涓嬬殑鐢ㄦ埛瀵硅薄鍒楄〃
+     * @param deptOid 閮ㄩ棬鐨勪富閿�
+     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滄槸閮ㄩ棬鐨勬煇涓睘鎬т綔涓烘煡璇㈡潯浠讹紝鍒欏彲浠ヤ娇鐢╬kDepartment.xxx杩欐牱鐨勬柟寮�
+     * @param pageHelper 鍒嗛〉鍜屾帓搴忎俊鎭紝榛樿浣跨敤鐢ㄦ埛鍚嶅崌搴忔帓鍒�
+     * @return 鐢ㄦ埛鐨勬樉绀哄璞″垪琛紝榛樿浣跨敤鐢ㄦ埛鍚嶅崌搴忔帓鍒�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    DataGrid<SmUserVO> gridUserUnInDeptOid(String deptOid, Map<String, String> queryMap, PageHelper pageHelper) throws VciBaseException;
+
+    /**
+     * 鏌ヨ鏌愪釜瑙掕壊涓嬬殑鐢ㄦ埛瀵硅薄
+     * @param roleOid 瑙掕壊鐨勪富閿�
+     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滄槸瑙掕壊鐨勬煇涓睘鎬т綔涓烘煡璇㈡潯浠讹紝鍒欏彲浠ヤ娇鐢╬kRole.xxx杩欐牱鐨勬柟寮�
+     * @return 鐢ㄦ埛鐨勬樉绀哄璞″垪琛�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    List<SmUserVO> listUserByRoleOid(String roleOid, Map<String, String> queryMap) throws VciBaseException;
+
+    /**
+     * 鏌ヨ鏌愪釜瑙掕壊涓嬬殑鐢ㄦ埛瀵硅薄鍒楄〃
+     * @param roleOid 瑙掕壊鐨勪富閿�
+     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滄槸瑙掕壊鐨勬煇涓睘鎬т綔涓烘煡璇㈡潯浠讹紝鍒欏彲浠ヤ娇鐢╬kRole.xxx杩欐牱鐨勬柟寮�
+     * @param pageHelper 鍒嗛〉鍜屾帓搴忎俊鎭紝榛樿浣跨敤鐢ㄦ埛鍚嶅崌搴忔帓鍒�
+     * @return 鐢ㄦ埛鐨勬樉绀哄璞″垪琛紝榛樿浣跨敤鐢ㄦ埛鍚嶅崌搴忔帓鍒�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    DataGrid<SmUserVO> gridUserByRoleOid(String roleOid, Map<String, String> queryMap, PageHelper pageHelper) throws VciBaseException;
+
+    /**
+     * 鏌ヨ涓嶅湪鏌愪釜瑙掕壊涓嬬殑鐢ㄦ埛瀵硅薄鍒楄〃
+     * @param roleOid 瑙掕壊鐨勪富閿�
+     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滄槸瑙掕壊鐨勬煇涓睘鎬т綔涓烘煡璇㈡潯浠讹紝鍒欏彲浠ヤ娇鐢╬kRole.xxx杩欐牱鐨勬柟寮�
+     * @return 鐢ㄦ埛鐨勬樉绀哄璞″垪琛紝榛樿浣跨敤鐢ㄦ埛鍚嶅崌搴忔帓鍒�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    List<SmUserVO> listUserUnInRoleOid(String roleOid, Map<String, String> queryMap) throws VciBaseException;
+
+    /**
+     * 鏌ヨ涓嶅湪鏌愪釜瑙掕壊涓嬬殑鐢ㄦ埛瀵硅薄鍒楄〃
+     * @param roleOid 瑙掕壊鐨勪富閿�
+     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滄槸瑙掕壊鐨勬煇涓睘鎬т綔涓烘煡璇㈡潯浠讹紝鍒欏彲浠ヤ娇鐢╬kRole.xxx杩欐牱鐨勬柟寮�
+     * @param pageHelper 鍒嗛〉鍜屾帓搴忎俊鎭紝榛樿浣跨敤鐢ㄦ埛鍚嶅崌搴忔帓鍒�
+     * @return 鐢ㄦ埛鐨勬樉绀哄璞″垪琛紝榛樿浣跨敤鐢ㄦ埛鍚嶅崌搴忔帓鍒�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    DataGrid<SmUserVO> gridUserUnInRoleOid(String roleOid, Map<String, String> queryMap, PageHelper pageHelper) throws VciBaseException;
+
+    /**
+     * 鎵归噺鏍规嵁瑙掕壊鐨勪富閿幏鍙栫敤鎴�
+     * @param roleOidCollection 瑙掕壊鐨勪富閿泦鍚�
+     * @return 瑙掕壊涓婚敭鍜屽搴旂殑鐢ㄦ埛鏄剧ず瀵硅薄鍒楄〃鐨勬槧灏勶紝key瑙掕壊鐨勪富閿紝value鏄繖涓鑹蹭笅鐨勭敤鎴�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    Map<String,List<SmUserVO>> batchListUserByRoleOids(Collection<String> roleOidCollection) throws VciBaseException;
+
+    /**
+     * 鍙傜収鐢熸晥鐨勭敤鎴�
+     * @param queryMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉瀵硅薄
+     * @return 鐢ㄦ埛鐨勬樉绀哄璞★紝榛樿浣跨敤鐢ㄦ埛鍚嶅崌搴忔帓鍒�
+     * @throws VciBaseException 鏌ヨ鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    DataGrid<SmUserVO> refGridUsers(Map<String, String> queryMap, PageHelper pageHelper) throws VciBaseException;
+
+    /**
+     * 鍙傜収鐢ㄦ埛鐨勬爲褰㈡樉绀�
+     * @param treeQueryObject 鏍戝瀷鎺ュ彛鏌ヨ瀵硅薄
+     * @return 鐢ㄦ埛鐨勬爲褰俊鎭紝閲岄潰浼氬寘鍚敤鎴峰璞¢噷鐨勬墍鏈夊睘鎬�
+     * @throws VciBaseException 鏌ヨ鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    List<Tree> refTreeUsers(TreeQueryObject treeQueryObject) throws VciBaseException;
+    /**
+     * 鏍¢獙瀵嗙爜鏄惁鐩稿悓锛屽湪鏂板钩鍙颁腑瀛樺偍鐨勫瘑鐮佹槸涓ゆmd5
+     * @param userOid 鐢ㄦ埛涓婚敭
+     * @param md5Password 宸茬粡md5鍔犲瘑涓�娆$殑瀵嗙爜
+     * @return true 琛ㄧず鐩哥瓑锛宖alse琛ㄧず涓嶇浉绛�
+     */
+    boolean checkPasswordEqual(String md5Password, String userOid);
+
+    /**
+     * 鏍¢獙鐢ㄦ埛鏄惁閿佸畾
+     * @param smUserVO 鐢ㄦ埛瀵硅薄
+     * @param wrongCount 瀵嗙爜閿欒娆℃暟,濡傛灉wrongCount涓虹┖鏃讹紝浼氭牎楠岀敤鎴锋湰韬槸鍚﹀凡缁忛攣瀹氫簡
+     * @return true琛ㄧず宸茬粡閿佸畾
+     */
+    boolean checkUserLock(SmUserVO smUserVO, Integer wrongCount);
+
+    /**
+     * 鏍规嵁鐢ㄦ埛鐨勪富閿紝鑾峰彇鐢ㄦ埛鐨勫瘑鐮佸畨鍏ㄧ瓥鐣�
+     * @param userOid 鐢ㄦ埛鐨勪富閿�
+     * @return 瀵嗙爜瀹夊叏绛栫暐鐨勬樉绀哄璞★紝濡傛灉涓嶅瓨鍦ㄥ垯浼氳繑鍥濶ull
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮暟鎹簱鏌ヨ鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    SmPasswordStrategyVO getPasswordStrategyVOByUserOid(String userOid) throws VciBaseException;
+
+    /**
+     * 璁剧疆鏌愪釜鐢ㄦ埛鏄攣瀹氱姸鎬�
+     * @param userId 鐢ㄦ埛鍚�
+     */
+    void lockUser(String userId);
+
+    /**
+     * 璁剧疆鏌愪釜鐢ㄦ埛涓嶆槸閿佸畾鐘舵��
+     * @param userId 鐢ㄦ埛鍚�
+     */
+    void unLockUser(String userId);
+
+    /**
+     * 淇敼瀵嗙爜
+     * @param userOid 鐢ㄦ埛涓婚敭
+     * @param password 鏂扮殑瀵嗙爜
+     * @param confirmPassword 纭瀵嗙爜
+     */
+    void changePassword(String userOid, String password, String confirmPassword) throws VciBaseException;
+
+    /**
+     * 鏇存柊鐢ㄦ埛鐨勫瘑鐮侀敊璇鏁�
+     * @param userOid 鐢ㄦ埛鐨勪富閿�
+     * @param wrongCount 瀵嗙爜鐨勯敊璇鏁�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呭瓨鍌ㄥ埌鏁版嵁搴撲腑鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    void updateUserPwdWrongCount(String userOid, int wrongCount) throws VciBaseException;
+
+    /**
+     * 鏇存柊鐢ㄦ埛鐨勬渶鍚庣櫥褰曟椂闂�
+     * @param userOid 鐢ㄦ埛鐨勪富閿�
+     * @throws VciBaseException 鍙傛暟涓虹┖鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    void updateUserLoginTime(String userOid) throws VciBaseException;
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/compatibility/impl/OrgDeptQueryServiceImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/compatibility/impl/OrgDeptQueryServiceImpl.java
new file mode 100644
index 0000000..ca8524d
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/compatibility/impl/OrgDeptQueryServiceImpl.java
@@ -0,0 +1,401 @@
+package com.vci.frameworkcore.compatibility.impl;
+
+import com.vci.frameworkcore.compatibility.OrgDeptQueryServiceI;
+import com.vci.frameworkcore.lcstatuspck.FrameworkDataLCStatus;
+import com.vci.frameworkcore.model.OrgDeptForPlatform1;
+import com.vci.frameworkcore.model.SmRoleForPlatform1;
+import com.vci.frameworkcore.pagemodel.OrgDepartmentVO;
+import com.vci.frameworkcore.pagemodel.SmRoleVO;
+import com.vci.starter.revision.bo.TreeWrapperOptions;
+import com.vci.starter.revision.service.RevisionModelUtil;
+import com.vci.starter.web.constant.QueryOptionConstant;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.starter.web.pagemodel.Tree;
+import com.vci.starter.web.pagemodel.TreeQueryObject;
+import com.vci.starter.web.util.BeanUtil;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.starter.web.wrapper.VciQueryWrapperForDO;
+import com.vci.web.service.WebBoServiceI;
+import com.vci.web.util.WebUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import plm.bs.bom.clientobject.ClientBusinessObject;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 閮ㄩ棬鐨勬煡璇㈡湇鍔★紝鍏煎鑰佸钩鍙�
+ * @author 璋㈠啗
+ * @date 2020/3/10
+ */
+@Service
+public class OrgDeptQueryServiceImpl implements OrgDeptQueryServiceI{
+
+	/**
+	 * 涓氬姟鏁版嵁鏈嶅姟
+	 */
+	@Autowired
+	private WebBoServiceI boService;
+
+	/**
+	 * 瀵硅薄鎿嶄綔宸ュ叿绫�
+	 */
+	@Autowired
+	private RevisionModelUtil revisionModelUtil;
+
+	/**
+     * 鏍规嵁閮ㄩ棬涓婚敭鑾峰彇閮ㄩ棬鐨勪俊鎭�
+     * @param deptOid 閮ㄩ棬涓婚敭
+     * @return 閮ㄩ棬鐨勬樉绀哄璞★紝濡傛灉閮ㄩ棬涓嶅瓨鍦ㄥ垯杩斿洖null锛屼笉浼氭姏鍑哄紓甯�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮暟鎹簱瀛樺湪闂鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+	@Override
+	public OrgDepartmentVO getDeptByDeptOid(String deptOid)
+			throws VciBaseException {
+		if(StringUtils.isBlank(deptOid)){
+			return null;
+		}
+		OrgDeptForPlatform1 deptForPlatform1 = boService.selectByOid(deptOid, OrgDeptForPlatform1.class);
+		return deptDO2VO(deptForPlatform1);
+	}
+
+	/**
+	 * 閮ㄩ棬鐨勬暟鎹璞¤浆鎹负鏄剧ず瀵硅薄
+	 * @param depts 鏁版嵁瀵硅薄
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	public List<OrgDepartmentVO> deptDO2VOs(Collection<OrgDeptForPlatform1> depts){
+		List<OrgDepartmentVO> departmentVOS = new ArrayList<>();
+		Optional.ofNullable(depts).orElseGet(()->new ArrayList<>()).stream().forEach(dept->{
+			departmentVOS.add(deptDO2VO(dept));
+		});
+		return departmentVOS;
+	}
+
+	/**
+	 * 閮ㄩ棬鐨勬暟鎹璞¤浆鎹负鏄剧ず瀵硅薄
+	 * @param deptForPlatform1 鏁版嵁瀵硅薄
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	public OrgDepartmentVO deptDO2VO(OrgDeptForPlatform1 deptForPlatform1){
+		OrgDepartmentVO departmentVO = new OrgDepartmentVO();
+		if(deptForPlatform1!=null){
+			departmentVO.setOid(deptForPlatform1.getPluid());
+			departmentVO.setId(deptForPlatform1.getPlnum());
+			departmentVO.setName(deptForPlatform1.getPlname());
+			if(0 == deptForPlatform1.getPlstatus()){
+				departmentVO.setLcStatus(FrameworkDataLCStatus.ENABLED.getValue());
+			}else{
+				departmentVO.setLcStatus(FrameworkDataLCStatus.DISABLED.getValue());
+			}
+			departmentVO.setPkFatherDepartment(deptForPlatform1.getPlparentuid());
+			departmentVO.setDescription(deptForPlatform1.getPldesc());
+			departmentVO.setCheckInTime(deptForPlatform1.getPlcreatetime());
+			departmentVO.setCreator(deptForPlatform1.getPlcreateuser());
+			departmentVO.setLastModifyTime(deptForPlatform1.getPlupdatetime());
+			departmentVO.setLastModifier(deptForPlatform1.getPlupdateuser());
+		}
+		return departmentVO;
+	}
+	/**
+     * 鎵归噺鑾峰彇閮ㄩ棬鐨勪俊鎭� 锛堟牴鎹儴闂ㄤ富閿級
+     * @param deptOidCollections 閮ㄩ棬涓婚敭鐨勯泦鍚堬紝鍙互瓒呰繃1000涓�
+     * @return 閮ㄩ棬鐨勬樉绀哄璞★紝濡傛灉閮ㄩ棬涓嶅瓨鍦ㄥ垯杩斿洖绌虹殑鍒楄〃锛屼笉浼氭姏鍑哄紓甯�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮暟鎹簱瀛樺湪闂鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+	@Override
+	public List<OrgDepartmentVO> listDeptByDeptOids(
+			Collection<String> deptOidCollections) throws VciBaseException {
+		if(CollectionUtils.isEmpty(deptOidCollections)){
+			return new ArrayList<>();
+		}
+		List<OrgDeptForPlatform1> depts = new ArrayList<>();
+		WebUtil.switchCollectionForOracleIn(deptOidCollections).stream().forEach(roleOids->{
+			Map<String,String> conditionMap=new HashMap<String, String>();
+			conditionMap.put("pluid", QueryOptionConstant.IN + VciBaseUtil.toInSql(roleOids.toArray(new String[0])));
+			VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(conditionMap,OrgDeptForPlatform1.class);
+			List<OrgDeptForPlatform1> roleForPlatform1s = boService.selectByQueryWrapper(queryWrapper, OrgDeptForPlatform1.class);
+			if(!CollectionUtils.isEmpty(roleForPlatform1s)){
+				depts.addAll(roleForPlatform1s);
+			}
+		});
+		return 	deptDO2VOs(depts);
+	}
+	/**
+     * 鑾峰彇閮ㄩ棬鐨勫垪琛紝榛樿浼氫互閮ㄩ棬鍚嶇О鍗囧簭鎺掑垪锛岄儴闂ㄧ殑缂栬緫椤甸潰鍒楄〃涓嶈浣跨敤杩欎釜鎺ュ彛
+     * @param queryMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉鍜屾帓搴忕殑淇℃伅锛屽湪鍏煎鑰佸钩鍙扮殑鏃跺�欎細鑷姩鍏煎锛屽鏋滃睘鎬т笉瀛樺湪浼氳嚜鍔ㄥ拷鐣�
+     * @return 閮ㄩ棬鐨勬樉绀哄璞″垪琛�
+     * @throws VciBaseException 鍙傛暟涓虹┖鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+	@Override
+	public DataGrid<OrgDepartmentVO> gridDepts(Map<String, String> queryMap,
+											   PageHelper pageHelper) throws VciBaseException {
+		if(pageHelper == null){
+			pageHelper = new PageHelper(-1);
+		}
+		pageHelper.addDefaultAsc("plnum");
+		VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(queryMap,OrgDeptForPlatform1.class,pageHelper);
+		List<OrgDeptForPlatform1> deptForPlatform1s = boService.selectByQueryWrapper(queryWrapper, OrgDeptForPlatform1.class);
+		DataGrid<OrgDepartmentVO> dataGrid = new DataGrid<>();
+		if(!CollectionUtils.isEmpty(deptForPlatform1s)){
+			dataGrid.setData(deptDO2VOs(deptForPlatform1s));
+			dataGrid.setTotal(boService.countByQueryWrapper(queryWrapper,OrgDeptForPlatform1.class));
+		}
+		return dataGrid;
+	}
+	 /**
+     * 鏍规嵁閮ㄩ棬涓婚敭鑾峰彇閮ㄩ棬鐨勫鍚�
+     * @param deptOid 閮ㄩ棬涓婚敭
+     * @return 閮ㄩ棬濮撳悕锛屽鏋滀笉瀛樺湪浼氳繑鍥瀗ull
+     */
+	@Override
+	public String getDeptNameByDeptOid(String deptOid) {
+		WebUtil.alertNotNull(deptOid,"閮ㄩ棬鐨勪富閿�");
+		return getDeptByDeptOid(deptOid).getName();
+	}
+
+	/**
+	 * 浣跨敤鐢ㄦ埛涓婚敭鏌ヨ閮ㄩ棬
+	 * @param userOid 鐢ㄦ埛涓婚敭
+	 * @param queryMap 鏌ヨ鏉′欢
+	 * @param notIn 鏄惁涓轰笉鍖呭惈
+	 * @return 瑙掕壊鐨勬樉绀哄璞�
+	 */
+	private List<OrgDepartmentVO> listDeptByUserOid(String userOid,Map<String,String> queryMap,boolean notIn){
+		if(StringUtils.isBlank(userOid)){
+			return new ArrayList<>();
+		}
+		if(queryMap == null){
+			queryMap = new HashMap<>();
+		}
+		List<OrgDeptForPlatform1> roles = new ArrayList<>();
+		if(userOid.contains(",")){
+			Map<String, String> finalQueryMap = queryMap;
+			WebUtil.switchCollectionForOracleIn(WebUtil.str2List(userOid)).stream().forEach(userOids->{
+				Map<String,String> conditionMap = new HashMap<>();
+				finalQueryMap.forEach((key,value)->{
+					conditionMap.put(key,value);
+				});
+				conditionMap.put("pluid", notIn ? QueryOptionConstant.NOTIN : QueryOptionConstant.IN + "select pldeptuid from PLUSERDEPT where pluseruid in (" + WebUtil.toInSql(userOids.toArray(new String[0])) + ")");
+				VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(conditionMap,OrgDeptForPlatform1.class);
+				List<OrgDeptForPlatform1> roleForPlatform1s = boService.selectByQueryWrapper(queryWrapper, OrgDeptForPlatform1.class);
+				if(!CollectionUtils.isEmpty(roleForPlatform1s)){
+					roles.addAll(roleForPlatform1s);
+				}
+			});
+		}else {
+			queryMap.put("pluid", notIn ? QueryOptionConstant.NOTIN : QueryOptionConstant.IN + "select pldeptuid from PLUSERDEPT where pluseruid ='" + userOid.trim() + "'");
+		}
+		VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(queryMap,OrgDeptForPlatform1.class);
+		List<OrgDeptForPlatform1> roleForPlatform1s = boService.selectByQueryWrapper(queryWrapper, OrgDeptForPlatform1.class);
+		if(!CollectionUtils.isEmpty(roleForPlatform1s)){
+			roles.addAll(roleForPlatform1s);
+		}
+		return deptDO2VOs(roles);
+	}
+	 /**
+     * 鏍规嵁鐢ㄦ埛涓婚敭鑾峰彇鍏宠仈鐨勯儴闂�
+     * @param userOid 鐢ㄦ埛涓婚敭
+     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滈渶瑕佷娇鐢ㄧ敤鎴风殑灞炴�ф潵鏌ヨ鍙互浣跨敤pkUser.xxxx
+     * @return 閮ㄩ棬鐨勬樉绀哄璞�
+     */
+	@Override
+	public OrgDepartmentVO listDeptByUserOid(String userOid,
+			Map<String, String> queryMap) {
+		List<OrgDepartmentVO> departmentVOS = listDeptByUserOid(userOid, queryMap, false);
+		if(CollectionUtils.isEmpty(departmentVOS)){
+			return null;
+		}
+		return departmentVOS.get(0);
+	}
+	/**
+     * 鑾峰彇鏈叧鑱旀煇涓敤鎴风殑閮ㄩ棬
+     * @param userOid 鐢ㄦ埛涓婚敭
+     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滈渶瑕佷娇鐢ㄧ敤鎴风殑灞炴�ф潵鏌ヨ鍙互浣跨敤pkUser.xxxx
+     * @return 閮ㄩ棬鐨勬樉绀哄璞�
+     */
+	@Override
+	public List<OrgDepartmentVO> listDeptUnInUserOid(String userOid,
+			Map<String, String> queryMap) {
+		return listDeptByUserOid(userOid, queryMap, true);
+	}
+
+    /**
+     * 鑾峰彇鏈叧鑱旀煇涓敤鎴风殑閮ㄩ棬
+     * @param userOid 鐢ㄦ埛涓婚敭
+     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滈渶瑕佷娇鐢ㄧ敤鎴风殑灞炴�ф潵鏌ヨ鍙互浣跨敤pkUser.xxxx
+     * @param pageHelper 鍒嗛〉鍜屾帓搴忓璞★紝鑰佸钩鍙颁笉鏀寔浣跨敤閮ㄩ棬缂栧彿鏉ユ帓搴�
+     * @return 閮ㄩ棬鐨勬樉绀哄璞�
+     */
+	@Override
+	public DataGrid<OrgDepartmentVO> gridDeptUninUserOid(String userOid,
+			Map<String, String> queryMap, PageHelper pageHelper) {
+		return gridDeptByUserOid(userOid,queryMap,pageHelper,true);
+	}
+
+	/**
+	 * 浣跨敤鐢ㄦ埛鏌ヨ閮ㄩ棬鍒楄〃
+	 * @param userOid 鐢ㄦ埛涓婚敭
+	 * @param queryMap 鏌ヨ鏉′欢
+	 * @param pageHelper 鍒嗛〉瀵硅薄
+	 * @param notIn 涓嶅寘鍚�
+	 * @return 鍒楄〃鏁版嵁
+	 */
+	private DataGrid<OrgDepartmentVO> gridDeptByUserOid(String userOid,Map<String,String> queryMap,PageHelper pageHelper,boolean notIn){
+		if(queryMap == null){
+			queryMap = new HashMap<>();
+		}
+		if(StringUtils.isBlank(userOid)){
+			return new DataGrid<>();
+		}
+		if(userOid.contains(",")){
+			String[] userOids = userOid.trim().split(",");
+			if(userOids.length>1000){
+				//杩欎釜鏂规硶涓嶆敮鎸佽秴杩�1000涓殑鐢ㄦ埛鏌ヨ
+				throw new VciBaseException("杩欎釜鏂规硶涓嶆敮鎸佽秴杩�1000涓敤鎴风殑涓婚敭鏉ユ煡璇�");
+			}
+			queryMap.put("pluid", notIn ? QueryOptionConstant.NOTIN : QueryOptionConstant.IN + "select pldeptuid from PLUSERDEPT where pluseruid in (" + WebUtil.toInSql(userOids) + ")");
+		}else {
+			queryMap.put("pluid", notIn ? QueryOptionConstant.NOTIN : QueryOptionConstant.IN + "select pldeptuid from PLUSERDEPT where pluseruid ='" + userOid.trim() + "'");
+		}
+		return gridDepts(queryMap,pageHelper);
+	}
+
+    /**
+     * 鎵归噺鏍规嵁鐢ㄦ埛鐨勪富閿潵鑾峰彇閮ㄩ棬
+     * @param userOidCollection 鐢ㄦ埛涓婚敭闆嗗悎
+     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滈渶瑕佷娇鐢ㄧ敤鎴风殑灞炴�ф潵鏌ヨ鍙互浣跨敤pkUser.xxxx
+     * @return 閮ㄩ棬鐨勬樉绀哄璞★紝key鏄敤鎴蜂富閿�,value鏄繖涓敤鎴峰叧鑱旂殑閮ㄩ棬
+     */
+	@Override
+	public Map<String, List<OrgDepartmentVO>> batchListDeptByUserOids(
+			Collection<String> userOidCollection, Map<String, String> queryMap) {
+		if(CollectionUtils.isEmpty(userOidCollection)){
+			return new HashMap<>();
+		}
+		List<OrgDepartmentVO> deptVOList = new ArrayList<>();
+		Map<String,List<String>> userDeptOidMap = new HashMap<>();
+		WebUtil.switchCollectionForOracleIn(userOidCollection).stream().forEach(userOids->{
+			List<OrgDepartmentVO> deptVOs = listDeptByUserOid(userOids.stream().collect(Collectors.joining(",")), queryMap, false);
+			if(!CollectionUtils.isEmpty(deptVOs)){
+				deptVOList.addAll(deptVOs);
+				String sql = "select pluseruid,pldeptuid from pluserdept where pluseruid in (" + WebUtil.toInSql(userOids.toArray(new String[0])) + ")";
+				List<ClientBusinessObject> cbos = boService.queryBySql(sql, null);
+				if(!CollectionUtils.isEmpty(cbos)){
+					cbos.stream().forEach(cbo->{
+						String userOid = cbo.getAttributeValue("pluseruid");
+						List<String> deptOids = userDeptOidMap.getOrDefault(userOid,new ArrayList<>());
+						deptOids.add(cbo.getAttributeValue("pldeptuid"));
+						userDeptOidMap.put(userOid,deptOids);
+					});
+				}
+			}
+		});
+		if(!CollectionUtils.isEmpty(deptVOList)){
+			Map<String, OrgDepartmentVO> deptVOMap = deptVOList.stream().collect(Collectors.toMap(s -> s.getOid(), t -> t));
+			Map<String, List<OrgDepartmentVO>> userDeptVOMap = new HashMap<>();
+			userDeptOidMap.forEach((userOid,deptOids)->{
+				List<OrgDepartmentVO> deptVOS = new ArrayList<>();
+				deptOids.forEach(deptOid->{
+					if(deptVOMap.containsKey(deptOid)){
+						deptVOS.add(deptVOMap.get(deptOid));
+					}
+				});
+				userDeptVOMap.put(userOid,deptVOS);
+			});
+			return userDeptVOMap;
+		}
+		return new HashMap<>();
+	}
+	 /**
+     * 鑾峰彇鏌愪釜閮ㄩ棬鐨勭洿灞炰笅绾ч儴闂�
+     * @param pkFatherDepartmment 閮ㄩ棬鐨勪富閿�
+     * @param queryMap 鏌ヨ鏉′欢
+     * @return 閮ㄩ棬鏄剧ず瀵硅薄
+     */
+	@Override
+	public List<OrgDepartmentVO> listChildrenDeptByParentOid(
+			String pkFatherDepartmment, Map<String, String> queryMap) {
+		VciQueryWrapperForDO queryWrapperForDO = new VciQueryWrapperForDO(queryMap,OrgDeptForPlatform1.class);
+		if(StringUtils.isBlank(pkFatherDepartmment)){
+			queryWrapperForDO.isNull("plparentuid");
+		}else{
+			queryWrapperForDO.eq("plparentuid",pkFatherDepartmment.trim());
+		}
+		List<OrgDeptForPlatform1> depts = boService.selectByQueryWrapper(queryWrapperForDO, OrgDeptForPlatform1.class);
+		return deptDO2VOs(depts);
+	}
+	 /**
+     * 鑾峰彇鏌愪釜閮ㄩ棬鐨勬墍鏈夊眰绾х殑涓嬬骇閮ㄩ棬
+     * @param pkFatherDepartmment 閮ㄩ棬鐨勪富閿�
+     * @param queryMap 鏌ヨ鏉′欢
+     * @return 閮ㄩ棬鏄剧ず瀵硅薄
+     */
+	@Override
+	public List<OrgDepartmentVO> listAllLevelChildrenDeptByParentOid(
+			String pkFatherDepartmment, Map<String, String> queryMap) {
+		VciQueryWrapperForDO queryWrapperForDO = new VciQueryWrapperForDO(queryMap,OrgDeptForPlatform1.class);
+		queryWrapperForDO.in("pluid","select pluid from pldept start with " + (StringUtils.isBlank(pkFatherDepartmment)?" (plparentuid is null or plparentuid = '') ":"plparentuid = '" + pkFatherDepartmment.trim() + "'") +  "connect by PRIOR pluid=plparentuid");
+		return deptDO2VOs(boService.selectByQueryWrapper(queryWrapperForDO, OrgDeptForPlatform1.class));
+	}
+	/**
+     * 鍙傜収鏍戝舰鏁版嵁鐨勯儴闂ㄤ俊鎭�
+     * @param treeQueryObject 鏍戝舰鏌ヨ鐨勬潯浠�
+     * @return 鏍戣妭鐐�
+     */
+	@Override
+	public List<Tree> refTreeDept(TreeQueryObject treeQueryObject) {
+		String pkFatherDepartmment=treeQueryObject.getParentOid();
+		Map<String, String> conditionMap = treeQueryObject.getConditionMap();
+		if(conditionMap==null){
+			conditionMap=new HashMap<String, String>();
+		}
+		List<OrgDepartmentVO> orgDepartmentVOList=new ArrayList<OrgDepartmentVO>();
+		if(treeQueryObject.isQueryAllLevel()){
+			orgDepartmentVOList = listAllLevelChildrenDeptByParentOid(pkFatherDepartmment, conditionMap);
+		}else{
+			conditionMap.put("plparentuid", pkFatherDepartmment);
+			VciQueryWrapperForDO queryWrapperForDO = new VciQueryWrapperForDO(conditionMap,OrgDeptForPlatform1.class);
+			orgDepartmentVOList = deptDO2VOs(boService.selectByQueryWrapper(queryWrapperForDO,OrgDeptForPlatform1.class));
+		}
+		TreeWrapperOptions treeWrapperOptions = new TreeWrapperOptions("pkFatherDepartment");
+		BeanUtil.convert(treeQueryObject,treeWrapperOptions);
+		return revisionModelUtil.doList2Trees(orgDepartmentVOList,treeWrapperOptions,dept->{
+			return dept.getId() + " " + dept.getName() + (FrameworkDataLCStatus.DISABLED.getValue().equals(dept.getLcStatus())?"銆愬仠鐢ㄣ��":"");
+		});
+	}
+	  /**
+     * 鍙傜収鏍戝舰琛ㄦ牸鐨勯儴闂ㄤ俊鎭紝涓婄骇閮ㄩ棬鐨勬槸琛ㄦ牸涓殑鏍戝舰鍒�
+     * @param treeQueryObject 鏍戝舰鏌ヨ鐨勬潯浠�
+     * @return 閮ㄩ棬鐨勬爲琛ㄤ俊鎭�
+     */
+	@Override
+	public DataGrid refTreeGridDept(TreeQueryObject treeQueryObject) {
+		String pkFatherDepartmment=treeQueryObject.getParentOid();
+		Map<String, String> conditionMap = treeQueryObject.getConditionMap();
+		if(conditionMap==null){
+			conditionMap=new HashMap<String, String>();
+		}
+		List<OrgDepartmentVO> orgDepartmentVOList=new ArrayList<OrgDepartmentVO>();
+		if(treeQueryObject.isQueryAllLevel()){
+			orgDepartmentVOList = listAllLevelChildrenDeptByParentOid(pkFatherDepartmment, conditionMap);
+		}else{
+			conditionMap.put("plparentuid", pkFatherDepartmment);
+			VciQueryWrapperForDO queryWrapperForDO = new VciQueryWrapperForDO(conditionMap,OrgDeptForPlatform1.class);
+			orgDepartmentVOList = deptDO2VOs(boService.selectByQueryWrapper(queryWrapperForDO,OrgDeptForPlatform1.class));
+		}
+		DataGrid dataGrid = new DataGrid();
+		dataGrid.setData(orgDepartmentVOList);
+		if(!CollectionUtils.isEmpty(orgDepartmentVOList)){
+			dataGrid.setTotal(orgDepartmentVOList.size());
+		}
+		return dataGrid;
+	}
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/compatibility/impl/OrgDutyQueryServiceImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/compatibility/impl/OrgDutyQueryServiceImpl.java
new file mode 100644
index 0000000..cb5b244
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/compatibility/impl/OrgDutyQueryServiceImpl.java
@@ -0,0 +1,147 @@
+package com.vci.frameworkcore.compatibility.impl;
+
+import com.vci.frameworkcore.compatibility.OrgDutyQueryServiceI;
+import com.vci.frameworkcore.pagemodel.OrgDutyVO;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.starter.web.pagemodel.Tree;
+import com.vci.starter.web.pagemodel.TreeQueryObject;
+import org.springframework.stereotype.Service;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 鑱屽姟鏌ヨ鐨勬湇鍔★紝鍏煎鑰佺殑骞冲彴
+ * @author xiejun
+ * @date 2020/3/10
+ */
+@Service
+public class OrgDutyQueryServiceImpl implements OrgDutyQueryServiceI {
+	 /**
+     * 鏍规嵁鑱屽姟涓婚敭鑾峰彇鑱屽姟鐨勪俊鎭�
+     * @param dutyOid 鑱屽姟涓婚敭
+     * @return 鑱屽姟鐨勬樉绀哄璞★紝濡傛灉鑱屽姟涓嶅瓨鍦ㄥ垯杩斿洖null锛屼笉浼氭姏鍑哄紓甯�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮暟鎹簱瀛樺湪闂鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+	@Override
+	public OrgDutyVO getDutyByDutyOid(String dutyOid) throws VciBaseException {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+    /**
+     * 鎵归噺鑾峰彇鑱屽姟鐨勪俊鎭� 锛堟牴鎹亴鍔′富閿級
+     * @param dutyOidCollections 鑱屽姟涓婚敭鐨勯泦鍚堬紝鍙互瓒呰繃1000涓�
+     * @return 鑱屽姟鐨勬樉绀哄璞★紝濡傛灉鑱屽姟涓嶅瓨鍦ㄥ垯杩斿洖绌虹殑鍒楄〃锛屼笉浼氭姏鍑哄紓甯�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮暟鎹簱瀛樺湪闂鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+	@Override
+	public List<OrgDutyVO> listDutyByDutyOids(
+			Collection<String> dutyOidCollections) throws VciBaseException {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+    /**
+     * 鑾峰彇鑱屽姟鐨勫垪琛紝榛樿浼氫互鑱屽姟鍚嶇О鍗囧簭鎺掑垪锛岃亴鍔$殑缂栬緫椤甸潰鍒楄〃涓嶈浣跨敤杩欎釜鎺ュ彛
+     * @param queryMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉鍜屾帓搴忕殑淇℃伅锛屽湪鍏煎鑰佸钩鍙扮殑鏃跺�欎細鑷姩鍏煎锛屽鏋滃睘鎬т笉瀛樺湪浼氳嚜鍔ㄥ拷鐣�
+     * @return 鑱屽姟鐨勬樉绀哄璞″垪琛�
+     * @throws VciBaseException 鍙傛暟涓虹┖鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+	@Override
+	public DataGrid<OrgDutyVO> gridDutys(Map<String, String> queryMap,
+										 PageHelper pageHelper) throws VciBaseException {
+		// TODO Auto-generated method stub
+		return null;
+	}
+	 /**
+     * 鏍规嵁鑱屽姟涓婚敭鑾峰彇鑱屽姟鐨勫鍚�
+     * @param dutyOid 鑱屽姟涓婚敭
+     * @return 鑱屽姟濮撳悕锛屽鏋滀笉瀛樺湪浼氳繑鍥瀗ull
+     */
+	@Override
+	public String getDutyNameByDutyOid(String dutyOid) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+	/**
+     * 鏍规嵁鐢ㄦ埛涓婚敭鑾峰彇鍏宠仈鐨勮亴鍔�
+     * @param userOid 鐢ㄦ埛涓婚敭
+     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滈渶瑕佷娇鐢ㄧ敤鎴风殑灞炴�ф潵鏌ヨ鍙互浣跨敤pkUser.xxxx
+     * @return 鑱屽姟鐨勬樉绀哄璞�
+     */
+	@Override
+	public OrgDutyVO listDutyByUserOid(String userOid,
+			Map<String, String> queryMap) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+	/**
+     * 鑾峰彇鏈叧鑱旀煇涓敤鎴风殑鑱屽姟
+     * @param userOid 鐢ㄦ埛涓婚敭
+     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滈渶瑕佷娇鐢ㄧ敤鎴风殑灞炴�ф潵鏌ヨ鍙互浣跨敤pkUser.xxxx
+     * @return 鑱屽姟鐨勬樉绀哄璞�
+     */
+	@Override
+	public List<OrgDutyVO> listDutyUnInUserOid(String userOid,
+			Map<String, String> queryMap) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+	/**
+     * 鑾峰彇鏈叧鑱旀煇涓敤鎴风殑鑱屽姟
+     * @param userOid 鐢ㄦ埛涓婚敭
+     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滈渶瑕佷娇鐢ㄧ敤鎴风殑灞炴�ф潵鏌ヨ鍙互浣跨敤pkUser.xxxx
+     * @param pageHelper 鍒嗛〉鍜屾帓搴忓璞★紝鑰佸钩鍙颁笉鏀寔浣跨敤鑱屽姟缂栧彿鏉ユ帓搴�
+     * @return 鑱屽姟鐨勬樉绀哄璞�
+     */
+	@Override
+	public DataGrid<OrgDutyVO> gridDutyUninUserOid(String userOid,
+			Map<String, String> queryMap, PageHelper pageHelper) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+	/**
+     * 鎵归噺鏍规嵁鐢ㄦ埛鐨勪富閿潵鑾峰彇鑱屽姟
+     * @param userOidCollection 鐢ㄦ埛涓婚敭闆嗗悎
+     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滈渶瑕佷娇鐢ㄧ敤鎴风殑灞炴�ф潵鏌ヨ鍙互浣跨敤pkUser.xxxx
+     * @return 鑱屽姟鐨勬樉绀哄璞★紝key鏄敤鎴蜂富閿�,value鏄繖涓敤鎴峰叧鑱旂殑鑱屽姟
+     */
+	@Override
+	public Map<String, List<OrgDutyVO>> batchListDutyByUserOids(
+			Collection<String> userOidCollection, Map<String, String> queryMap) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+	 /**
+     * 鍙傜収鑱屽姟鐨勫垪琛紝榛樿浼氫互鑱屽姟鍚嶇О鍗囧簭鎺掑垪锛屽彧鏄剧ず鍚敤鐨勮亴鍔�
+     * @param queryMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉鍜屾帓搴忕殑淇℃伅锛屽湪鍏煎鑰佸钩鍙扮殑鏃跺�欎細鑷姩鍏煎锛屽鏋滃睘鎬т笉瀛樺湪浼氳嚜鍔ㄥ拷鐣�
+     * @return 鑱屽姟鐨勬樉绀哄璞″垪琛�
+     * @throws VciBaseException 鍙傛暟涓虹┖鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+	@Override
+	public DataGrid<OrgDutyVO> refGridDutys(Map<String, String> queryMap,
+			PageHelper pageHelper) throws VciBaseException {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+    /**
+     * 鑱屽姟鐨勫弬鐓ф爲
+     * @param treeQueryObject 鏍戝舰鐨勬煡璇㈠璞�
+     * @return 鑱屽姟鏍戯紝浼氬寘鍚亴鍔$殑鎵�鏈夊睘鎬�
+     * @throws VciBaseException
+     */
+	@Override
+	public List<Tree> refTreeDutys(TreeQueryObject treeQueryObject)
+			throws VciBaseException {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmFunctionQueryServicePlatformImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmFunctionQueryServicePlatformImpl.java
new file mode 100644
index 0000000..eeb450e
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmFunctionQueryServicePlatformImpl.java
@@ -0,0 +1,688 @@
+package com.vci.frameworkcore.compatibility.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.vci.client.common.providers.ServiceProvider;
+import com.vci.corba.common.VCIError;
+import com.vci.corba.framework.data.FunctionInfo;
+import com.vci.corba.portal.data.PLTabPage;
+import com.vci.corba.portal.data.PLUILayout;
+import com.vci.frameworkcore.compatibility.ISmFunctionQueryService;
+import com.vci.frameworkcore.enumpck.ResourceControlTypeEnum;
+import com.vci.frameworkcore.model.SmFunctionForPlatform1;
+import com.vci.frameworkcore.model.SmRoleForPlatform1;
+import com.vci.frameworkcore.pagemodel.MenuVO;
+import com.vci.frameworkcore.pagemodel.SmFunctionVO;
+import com.vci.starter.web.constant.QueryOptionConstant;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.*;
+import com.vci.starter.web.wrapper.VciQueryWrapperForDO;
+import com.vci.web.pageModel.UIContentVO;
+import com.vci.web.service.UIEngineServiceI;
+import com.vci.web.service.WebBoServiceI;
+import com.vci.web.util.WebUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import plm.bs.bom.clientobject.ClientBusinessObject;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static com.vci.web.constant.CacheKeyConstant.ALL_FUNCTION;
+import static com.vci.web.constant.CacheNameConstant.VCI_OBJECT_SERVICE;
+
+/**
+ * 鑰佸钩鍙扮殑鏉冮檺鏈嶅姟
+ * @author weidy
+ * @date 2020/3/1
+ */
+@Service
+public class SmFunctionQueryServicePlatformImpl implements ISmFunctionQueryService {
+
+    /**
+     * 鏃ュ織
+     */
+    private Logger logger = LoggerFactory.getLogger(getClass());
+
+    /**
+     * 鑿滃崟鐨勬牴鑺傜偣涓婚敭锛岃繖涓槸骞冲彴瀹氫箟鐨�
+     */
+	private final String ROOT_MENU_Id  = "modelManagmentNode";
+
+
+
+    /**
+     * 浣跨敤鐢ㄦ埛鏌ヨ
+     */
+	public static final String QUERY_BY_USER = "select r.PLFUNCOID from plroleright r left join pluserrole u on r.PLROLEOID = u.PLROLEUID ";
+
+    /**
+     * 涓氬姟鏁版嵁鏈嶅姟
+     */
+	@Autowired
+	private WebBoServiceI boService;
+
+    /**
+     * 鍔犺浇鑷韩
+     */
+    @Autowired(required = false)
+    @Lazy
+	private ISmFunctionQueryService self;
+
+    @Autowired
+    private  UIEngineServiceI uiEngineServiceI;
+
+    /**
+     * 鏌ヨ鎵�鏈夌殑鍔熻兘
+     *
+     * @return 鍔熻兘鐨勬樉绀哄璞�
+     */
+    @Override
+    public List<SmFunctionVO> selectAllFunction() {
+        VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(null, SmFunctionForPlatform1.class);
+        List<SmFunctionForPlatform1> functions = boService.selectByQueryWrapper(queryWrapper, SmFunctionForPlatform1.class);
+        return functionForPlatform1ToFunctionDOs(functions);
+    }
+
+    /**
+     * 鏌ヨ鎵�鏈夌殑鍔熻兘鏄犲皠
+     *
+     * @return 鍔熻兘鐨勬樉绀哄璞�
+     */
+    @Override
+    @Cacheable(value = VCI_OBJECT_SERVICE,key = ALL_FUNCTION,unless = "#result == null")
+    public Map<String, SmFunctionVO> selectAllFunctionMap() {
+        return Optional.ofNullable(self.selectAllFunction()).orElseGet(()->new ArrayList<>()).stream().collect(Collectors.toMap(s->s.getOid(),t->t));
+    }
+
+    /**
+     * 鏍规嵁鐢ㄦ埛鏌ヨ鍏宠仈鐨勬潈闄�
+     *
+     * @param userOid             鐢ㄦ埛鐨勪富閿�
+     * @param queryMap            鏌ヨ鏉′欢锛屽鏋滆鐢ㄧ敤鎴风殑灞炴�ф煡璇紝鍙互浣跨敤pkUser.xxx
+     * @param resourceControlTypeEnum 瑙掕壊鎺у埗鍖哄煙锛屼篃鏄姛鑳芥帶鍒剁殑鍖哄煙
+     * @return 鏉冮檺鐨勬樉绀哄璞★紝鏈浆鍖栦负涓婁笅绾у叧绯�
+     */
+    @Override
+    public List<SmFunctionVO> listFunctionByUserOid(String userOid, Map<String, String> queryMap, ResourceControlTypeEnum resourceControlTypeEnum) {
+        if(StringUtils.isBlank(userOid)){
+            return new ArrayList<>();
+        }
+        VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(queryMap,SmFunctionForPlatform1.class);
+        queryWrapper.in("ploid",QUERY_BY_USER + " where u.pluseruid = '" + userOid.trim() + "'");
+        List<SmFunctionForPlatform1> functions = boService.selectByQueryWrapper(queryWrapper, SmFunctionForPlatform1.class);
+        if(CollectionUtils.isEmpty(functions)){
+            return new ArrayList<>();
+        }
+        //TODO 瀵嗙骇鐨勬帶鍒�
+        //瓒呯骇绠$悊鍛橈紝涓�鑸笉璁╃櫥褰曪紝鐧诲綍鍚庡彲浠ョ湅涓氬姟鐨勫姛鑳斤紝涔熷彲浠ョ湅绠$悊鍔熻兘
+        //涓夊憳鐨勶紝鍙湅绠$悊鐨�
+        //鏅�氱殑鍙湅涓氬姟鐨�
+
+        if(resourceControlTypeEnum == null){
+            resourceControlTypeEnum = ResourceControlTypeEnum.BS;
+        }
+        String controlType = resourceControlTypeEnum.getValue();
+        List<SmFunctionVO> functionVOS = functionForPlatform1ToFunctionDOs(functions);
+        return functionVOS.stream().filter(s->controlType.equalsIgnoreCase(s.getResourceControlType())).collect(Collectors.toList());
+    }
+
+    /**
+     * 鍘熷钩鍙板姛鑳借浆鎹负鏂板钩鍙扮殑鍔熻兘
+     * @param functionForPlatform1List 鍘熷钩鍙板姛鑳藉璞″垪琛�
+     * @return 鏂板钩鍙板姛鑳藉璞�
+     */
+    private List<SmFunctionVO> functionForPlatform1ToFunctionDOs(List<SmFunctionForPlatform1> functionForPlatform1List){
+        List<SmFunctionVO> functionVOList = new ArrayList<SmFunctionVO>();
+        if(!CollectionUtils.isEmpty(functionForPlatform1List)){
+            for(int i = 0 ; i < functionForPlatform1List.size(); i ++ ) {
+                functionVOList.add(functionForPlatform1ToFunctionVO(functionForPlatform1List.get(i)));
+            }
+        }
+        return functionVOList;
+    }
+
+    /**
+     * 鍘熷钩鍙板姛鑳借浆鎹负鏂板钩鍙扮殑鍔熻兘
+     *
+     * @param functionForPlatform1 鍘熷钩鍙板姛鑳藉璞�
+     * @return 鏂板钩鍙板姛鑳藉璞�
+     */
+    private SmFunctionVO functionForPlatform1ToFunctionVO(SmFunctionForPlatform1 functionForPlatform1){
+        SmFunctionVO functionVO = new SmFunctionVO();
+        functionVO.setOid(functionForPlatform1.getPloid());
+        functionVO.setId(String.valueOf(functionForPlatform1.getPlmoduleno()));
+        functionVO.setName(functionForPlatform1.getPlname());
+        functionVO.setLogName(functionForPlatform1.getPlaliasname());
+        if(StringUtils.isNotBlank(functionForPlatform1.getPlresourceb())){
+            functionVO.setResourceControlType(ResourceControlTypeEnum.BS.getValue());
+            functionVO.setUrl(functionForPlatform1.getPlresourceb());
+        }else if(StringUtils.isNotBlank(functionForPlatform1.getPlresourcedotnet())) {
+        	functionVO.setResourceControlType(ResourceControlTypeEnum.DOTNET.getValue());
+            functionVO.setUrl(functionForPlatform1.getPlresourcedotnet());
+        }else if(StringUtils.isNotBlank(functionForPlatform1.getPlresourcemobil())) {
+        	functionVO.setResourceControlType(ResourceControlTypeEnum.MOBILE.getValue());
+            functionVO.setUrl(functionForPlatform1.getPlresourcemobil());
+        }else {
+            functionVO.setResourceControlType(ResourceControlTypeEnum.CS.getValue());
+            functionVO.setUrl(functionForPlatform1.getPlresourcec());
+        }
+        functionVO.setResourceControlTypeText(ResourceControlTypeEnum.getTextByValue(functionVO.getResourceControlType()));
+        functionVO.setDisplayFlag((functionForPlatform1.getPlisvalid() !=null&& 1 == functionForPlatform1.getPlisvalid())? true:false);
+        functionVO.setControlRightFlag(true);
+        functionVO.setParentFunctionId(functionForPlatform1.getPlparentid());
+        functionVO.setOrderNum(functionForPlatform1.getPlmodulesequence());
+        if(StringUtils.isNotBlank(functionForPlatform1.getPlimage())) {
+        	functionVO.setIconCss(functionForPlatform1.getPlimage());
+        }
+        //浠ュ墠鐨勮�佸浘鏍囨病鍔炴硶杞崲浜嗭紝浣嗘槸鏀寔layui鐨勫浘鏍�
+        if(StringUtils.isNotBlank(functionForPlatform1.getPldesc())){
+            //闇�瑕佸湪骞冲彴涓缃彍鍗曠殑鍥炬爣璺緞锛屽湪鎻忚堪瀛楁涓坊鍔�
+            //{iconSrc:xxxx,desc:yyyy}
+            try{
+                JSONObject jo = JSONObject.parseObject(functionForPlatform1.getPldesc());
+                if(jo!=null&&jo.containsKey("iconSrc")){
+                    functionVO.setIconCss(jo.getString("iconSrc"));
+                }
+                if(jo!=null&&jo.containsKey("desc")){
+                    functionVO.setDescription(jo.getString("desc"));
+                }
+            }catch(Exception e){
+                functionVO.setDescription(functionForPlatform1.getPldesc());
+            }
+        }
+        
+        functionVO.setBtmname("function");
+        //鑰佺殑鏁版嵁閲屽垱寤轰汉锛屾渶鍚庝慨鏀逛汉绛夐兘娌℃湁
+        return functionVO;
+    }
+
+//    /**
+//     * 鑾峰彇褰撳墠瑙掕壊鐨勮彍鍗�
+//     *
+//     * @param treeQueryObject     灞炴�ф煡璇㈠璞�
+//     * @param resourceControlTypeEnum 瑙掕壊鎺у埗鍖哄煙锛屼篃鏄姛鑳芥帶鍒剁殑鍖哄煙
+//     * @return 鑿滃崟锛屽寘鍚笂涓嬬骇
+//     */
+//    @Override
+//    public List<Tree> treeCurrentUserMenu(TreeQueryObject treeQueryObject, ResourceControlTypeEnum resourceControlTypeEnum) {
+//        SessionInfo sessionInfo = WebUtil.getCurrentUserSessionInfoNotException();
+//        if(sessionInfo == null || CollectionUtils.isEmpty(sessionInfo.getFunctionOids())){
+//            return new ArrayList<Tree>();
+//        }
+//        if(resourceControlTypeEnum == null){
+//            resourceControlTypeEnum = ResourceControlTypeEnum.BS;
+//        }
+//        Map<String, SmFunctionVO> functionVOMap = selectAllFunctionMap();
+//        List<SmFunctionVO> functionVOList = new ArrayList<>();
+//        for(String oid : sessionInfo.getFunctionOids()) {
+//        	SmFunctionVO functionVO = functionVOMap.get(oid);
+//        	if(functionVO !=null && resourceControlTypeEnum.getValue().equals(functionVO.getResourceControlType())  &&  functionVO.isDisplayFlag()) {
+//        		functionVOList.add(functionVO);
+//        	}
+//        }
+//        return dos2Trees(functionVOList.stream().sorted(Comparator.comparing(s -> s.getOrderNum())).collect(Collectors.toList()),treeQueryObject == null?null:treeQueryObject.getParentOid());
+//    }
+
+    /**
+     * 鑾峰彇褰撳墠瑙掕壊鐨勮彍鍗�
+     *
+     * @param treeQueryObject     灞炴�ф煡璇㈠璞�
+     * @param resourceControlTypeEnum 瑙掕壊鎺у埗鍖哄煙锛屼篃鏄姛鑳芥帶鍒剁殑鍖哄煙
+     * @return 鑿滃崟锛屽寘鍚笂涓嬬骇
+     */
+    @Override
+    public List<MenuVO> treeCurrentUserMenu(TreeQueryObject treeQueryObject, ResourceControlTypeEnum resourceControlTypeEnum) throws VCIError {
+        SessionInfo sessionInfo = WebUtil.getCurrentUserSessionInfoNotException();
+//        if(sessionInfo == null || CollectionUtils.isEmpty(sessionInfo.getFunctionOids())){
+//            return new ArrayList<Tree>();
+//        }
+        if(resourceControlTypeEnum == null){
+            resourceControlTypeEnum = ResourceControlTypeEnum.BS;
+        }
+//        PortalServicePrx uiService = ServiceProvider.getUIService();
+//        FrameworkServicePrx frameService = ServiceProvider.getFrameService();
+        FunctionInfo[] menus = ServiceProvider.getFrameService().getModuleListByParentId("modelManagmentNode", true);
+
+//        PLAction[] allPLAction = uiService.getAllPLAction();
+        List<MenuVO> functionVOList = new ArrayList<>();
+//        Map<String, SmFunctionVO> functionVOMap = selectAllFunctionMap();
+        for (FunctionInfo menu : menus) {
+            if(!menu.isValid){
+                continue;
+            }
+            MenuVO functionVO = new MenuVO();
+            functionVO.setId(menu.id);
+            functionVO.setSource(menu.image);
+            if(StringUtils.isBlank(menu.resourceB) || !(menu.resourceB.length()>2 && "bs=".equals(menu.resourceB.substring(0,3)))){
+                continue;
+            }
+            if(menu.resourceB.contains("type=") || menu.resourceB.contains("context=")){
+                String[] split = menu.resourceB.split("\\?")[0].split("=");
+                functionVO.setPath((split.length>1 && split[1].equals("test") ? "/custom-ui/" :"/base/UIContentViewer") + menu.resourceB.substring(3));
+            }else{
+                functionVO.setPath("/views/" + menu.id);
+//                functionVO.setPath("/" + menu.resourceB + menu.aliasName);
+            }
+            functionVO.setParentId(menu.parentId);
+            functionVO.setCode(menu.aliasName);
+            functionVO.setAlias(menu.aliasName);
+            functionVO.setName(menu.name);
+            functionVO.getMeta().put("keepAlive",false);
+            functionVO.setSort((int) menu.seq);
+            functionVO.setChildren(findChildFunctionVO(menu.id));
+            if(functionVO.getChildren().size() > 0){
+                functionVO.setHasChildren(true);
+            }else {
+                functionVO.setHasChildren(false);
+            }
+            functionVOList.add(functionVO);
+        }
+//        return dos2Trees(functionVOList.stream().sorted(Comparator.comparing(s -> s.getSort())).collect(Collectors.toList()),treeQueryObject == null?null:treeQueryObject.getParentOid());
+        return functionVOList.stream().sorted(Comparator.comparing(s -> s.getSort())).collect(Collectors.toList());
+    }
+
+    public List<MenuVO> findChildFunctionVO(String parentOid) throws VCIError {
+        FunctionInfo[] menus = ServiceProvider.getFrameService().getModuleListByParentId(parentOid, true);
+        List<MenuVO> functionVOList = new ArrayList<>();
+        for (FunctionInfo menu : menus) {
+            if(!menu.isValid){
+                continue;
+            }
+            MenuVO functionVO = new MenuVO();
+            functionVO.setId(menu.id);
+            functionVO.setSource(menu.image);
+            if(StringUtils.isBlank(menu.resourceB) || !(menu.resourceB.length()>2 && "bs=".equals(menu.resourceB.substring(0,3)))){
+                continue;
+            }
+            if(menu.resourceB.contains("type=") || menu.resourceB.contains("context=")){
+                String[] split = menu.resourceB.split("\\?")[0].split("=");
+                functionVO.setPath((split.length>1 && split[1].equals("test") ? "/custom-ui/" :"/base/UIContentViewer") + menu.resourceB.substring(3));
+            }else{
+                functionVO.setPath("/views/" + menu.id);
+//                functionVO.setPath("/" + menu.resourceB + menu.aliasName);
+            }
+            functionVO.setCode(menu.aliasName);
+            functionVO.setAlias(menu.aliasName);
+            functionVO.setParentId(menu.parentId);
+            functionVO.setName(menu.name);
+            functionVO.getMeta().put("keepAlive",false);
+            functionVO.setSort((int) menu.seq);
+            functionVO.setChildren(findChildFunctionVO(menu.id));
+            if(functionVO.getChildren().size() > 0){
+                functionVO.setHasChildren(true);
+            }else {
+                functionVO.setHasChildren(false);
+            }
+            functionVOList.add(functionVO);
+        }
+        return functionVOList.stream().sorted(Comparator.comparing(s -> s.getSort())).collect(Collectors.toList());
+    }
+
+
+    @Override
+    public UIContentVO getUIContentByBtmTypeAndId(TreeQueryObject treeQueryObject, ResourceControlTypeEnum resourceControlTypeEnum) throws VCIError {
+        SessionInfo sessionInfo = WebUtil.getCurrentUserSessionInfoNotException();
+//        if(sessionInfo == null || CollectionUtils.isEmpty(sessionInfo.getFunctionOids())){
+//            return new ArrayList<Tree>();
+//        }
+        if(resourceControlTypeEnum == null){
+            resourceControlTypeEnum = ResourceControlTypeEnum.BS;
+        }
+//        PortalServicePrx uiService = ServiceProvider.getUIService();
+//        FrameworkServicePrx frameService = ServiceProvider.getFrameService();
+//        FunctionInfo[] menus = ServiceProvider.getFrameService().getModuleListByParentId("modelManagmentNode", true);
+        for (PLUILayout allPLUILayout : ServiceProvider.getUIService().getAllPLUILayouts()) {
+            if("folder".equals(allPLUILayout.plRelatedType) && "cardtemplatemanager".equals(allPLUILayout.plCode)){
+//            if("workflowinstance".equals(allPLUILayout.plRelatedType)){
+//                System.out.printf("");
+                return uiEngineServiceI.UIContentDO2VO(allPLUILayout,true);
+            }
+        }
+        return null;
+    }
+
+
+
+
+    /**
+     * 鑾峰彇鎵�鏈夌殑鍔熻兘鑿滃崟
+     *
+     * @param treeQueryObject     鏍戞煡璇㈠璞�
+     * @param resourceControlTypeEnum 瑙掕壊鎺у埗鍖哄煙锛屼篃鏄姛鑳芥帶鍒剁殑鍖哄煙
+     * @return 鏍戣妭鐐癸紝鍑虹幇閿欒浼氬湪寮傚父澶勭悊鍣ㄤ腑缁熶竴杩斿洖Json
+     */
+    @Override
+    public List<Tree> treeAllMenu(TreeQueryObject treeQueryObject, ResourceControlTypeEnum resourceControlTypeEnum) {
+        List<SmFunctionVO> functionVOList = self.selectAllFunction().stream().filter(s -> s.isDisplayFlag() && resourceControlTypeEnum.getValue().equalsIgnoreCase(s.getResourceControlType())).collect(Collectors.toList());
+        if(!treeQueryObject.isQueryAllLevel() && StringUtils.isNotBlank(treeQueryObject.getParentOid())){
+        	functionVOList = functionVOList.stream().filter(s->treeQueryObject.getParentOid().equalsIgnoreCase(s.getParentFunctionId())).collect(Collectors.toList());  
+        }
+        return dos2Trees(functionVOList.stream().sorted(Comparator.comparing(s -> s.getOrderNum())).collect(Collectors.toList()),treeQueryObject == null?null:treeQueryObject.getParentOid());
+    }
+
+    /**
+     * 鎵归噺灏嗘暟鎹璞¤浆鎹负鏍戣妭鐐�
+     * @param functionVOList 鏁版嵁瀵硅薄鍒楄〃
+     * @param rootId 鏍硅妭鐐圭殑涓婚敭锛屾渶椤跺眰浣跨敤null鎴栬��""
+     * @return 鏍戣妭鐐瑰垪琛紝涓嶅瓨鍦ㄦ暟鎹椂杩斿洖绌哄垪琛�
+     */
+    public List<Tree> dos2Trees(List<SmFunctionVO> functionVOList,String rootId){
+        if(!CollectionUtils.isEmpty(functionVOList)) {
+            List<Tree> rootList = new ArrayList<>();
+            List<Tree> childList = new ArrayList<>();
+            functionVOList.stream().forEach(s -> {
+                Tree tree = DO2Tree(s);
+                if (tree.getParentId() == null || tree.getParentId().equals(rootId) || ROOT_MENU_Id.equalsIgnoreCase(tree.getParentId())) {
+                    rootList.add(tree);
+                } else {
+                    childList.add(tree);
+                }
+            });
+            return Tree.getChildList(rootList, childList);
+        }else{
+            return  new ArrayList<>();
+        }
+    }
+
+    /**
+     * 鏁版嵁瀵硅薄杞崲涓烘爲鑺傜偣
+     * @param functionVO 鏁版嵁鏄剧ず瀵硅薄
+     * @return 鏍戣妭鐐瑰璞�
+     */
+    public Tree DO2Tree(SmFunctionVO functionVO){
+        Tree tree = new Tree();
+        tree.setOid(functionVO.getOid());
+        tree.setText(functionVO.getName());
+        tree.setIndex(functionVO.getOrderNum() + "");
+        tree.setParentId(functionVO.getParentFunctionId());
+        tree.setIconCls(functionVO.getIconCss());
+        tree.setHref(functionVO.getUrl());
+        try {
+			tree.setAttributes(WebUtil.objectToMapString(functionVO));
+		} catch (Throwable e) {
+			logger.error("鎷疯礉淇℃伅",e);
+		}
+        return tree;
+    }
+
+    /**
+     * 閫氳繃涓婄骇鑺傜偣鑾峰彇涓嬬骇鐨勬墍鏈夌殑鑿滃崟鑺傜偣
+     *
+     * @param treeQueryObject     鏍戞煡璇㈠璞�
+     * @param resourceControlTypeEnum 瑙掕壊鎺у埗鍖哄煙锛屼篃鏄姛鑳芥帶鍒剁殑鍖哄煙
+     * @return 鏍戣妭鐐癸紝鍑虹幇閿欒浼氬湪寮傚父澶勭悊鍣ㄤ腑缁熶竴杩斿洖Json
+     */
+    @Override
+    public List<Tree> treeFunctionByParent(TreeQueryObject treeQueryObject, ResourceControlTypeEnum resourceControlTypeEnum) {
+    	 List<SmFunctionVO> functionVOList = self.selectAllFunction().stream().filter(s -> s.isDisplayFlag() && resourceControlTypeEnum.getValue().equalsIgnoreCase(s.getResourceControlType())).collect(Collectors.toList());
+         if(!treeQueryObject.isQueryAllLevel() && StringUtils.isNotBlank(treeQueryObject.getParentOid())){
+         	functionVOList = functionVOList.stream().filter(s->treeQueryObject.getParentOid().equalsIgnoreCase(s.getParentFunctionId())).collect(Collectors.toList());  
+         }
+         return dos2Trees(functionVOList,treeQueryObject == null?null:treeQueryObject.getParentOid());
+    }
+
+    /**
+     * 閫氳繃涓婄骇鑺傜偣鑾峰彇褰撳墠瑙掕壊鏈夋潈闄愮殑涓嬬骇鐨勬墍鏈夌殑鑿滃崟鑺傜偣
+     *
+     * @param treeQueryObject     鏍戞煡璇㈠璞�
+     * @param resourceControlTypeEnum 瑙掕壊鎺у埗鍖哄煙锛屼篃鏄姛鑳芥帶鍒剁殑鍖哄煙
+     * @return 鏍戣妭鐐癸紝鍑虹幇閿欒浼氬湪寮傚父澶勭悊鍣ㄤ腑缁熶竴杩斿洖Json
+     */
+    @Override
+    public List<Tree> treeCurrentFunctionByParent(TreeQueryObject treeQueryObject, ResourceControlTypeEnum resourceControlTypeEnum) {
+    	SessionInfo sessionInfo = WebUtil.getCurrentUserSessionInfo();
+    	 List<SmFunctionVO> functionVOList =self.selectAllFunction().stream().filter(s -> s.isDisplayFlag()
+    			 && resourceControlTypeEnum.getValue().equalsIgnoreCase(s.getResourceControlType()) 
+    			 && !CollectionUtils.isEmpty(sessionInfo.getFunctionOids())
+    			 && sessionInfo.getFunctionOids().contains(s.getOid())
+    			 ).collect(Collectors.toList());
+         if(!treeQueryObject.isQueryAllLevel() && StringUtils.isNotBlank(treeQueryObject.getParentOid())){
+         	functionVOList = functionVOList.stream().filter(s->treeQueryObject.getParentOid().equalsIgnoreCase(s.getParentFunctionId())).collect(Collectors.toList());  
+         }
+         return dos2Trees(functionVOList,treeQueryObject == null?null:treeQueryObject.getParentOid());
+    }
+
+    /**
+     * 鑾峰彇绯荤粺鍔熻兘鍒楄〃
+     *
+     * @param queryMap   鏌ヨ鏉′欢
+     * @param pageHelper 鎺掑簭鍜屽垎椤靛璞�
+     * @return DataGrid 绯荤粺鍔熻兘鍒楄〃
+     */
+    @Override
+    public DataGrid<SmFunctionVO> dataGrid(Map<String, String> queryMap, PageHelper pageHelper) {
+    	VciQueryWrapperForDO queryWrapperForDO = new VciQueryWrapperForDO(queryMap,SmFunctionForPlatform1.class,pageHelper);
+        List<SmFunctionForPlatform1> functionForPlatform1s = boService.selectByQueryWrapper(queryWrapperForDO, SmFunctionForPlatform1.class);
+        List<SmFunctionVO> functionVOS = functionForPlatform1ToFunctionDOs(functionForPlatform1s);
+        DataGrid dataGrid = new DataGrid();
+        dataGrid.setData(functionVOS);
+        if(!CollectionUtils.isEmpty(functionVOS)){
+            dataGrid.setTotal(boService.countByQueryWrapper(queryWrapperForDO,SmFunctionForPlatform1.class));
+        }
+        return dataGrid;
+    }
+
+    /**
+     * 鏍规嵁瑙掕壊涓婚敭鑾峰彇鍏宠仈鐨勬潈闄�
+     *
+     * @param roleOid             瑙掕壊涓婚敭
+     * @param queryMap            鏌ヨ鏉′欢锛屽鏋滈渶瑕佷娇鐢ㄨ鑹茬殑灞炴�ф潵鏌ヨ鍙互浣跨敤pkUser.xxxx
+     * @param resourceControlTypeEnum 瑙掕壊鎺у埗鍖哄煙锛屼篃鏄姛鑳芥帶鍒剁殑鍖哄煙
+     * @return 鏉冮檺鐨勬樉绀哄璞�
+     */
+    @Override
+    public List<SmFunctionVO> listFunctionByRoleOid(String roleOid, Map<String, String> queryMap, ResourceControlTypeEnum resourceControlTypeEnum) {
+        String controlType = resourceControlTypeEnum == null? ResourceControlTypeEnum.BS.getValue(): resourceControlTypeEnum.getValue();
+        return Optional.ofNullable(listFunctionByRoleOid(roleOid,queryMap,false)).orElseGet(()->new ArrayList<>()).stream().filter(s->controlType.equalsIgnoreCase(s.getResourceControlType())).collect(Collectors.toList());
+    }
+
+    /**
+     * 鑾峰彇鏈叧鑱旀煇涓鑹茬殑鏉冮檺
+     *
+     * @param roleOid             瑙掕壊涓婚敭
+     * @param queryMap            鏌ヨ鏉′欢锛屽鏋滈渶瑕佷娇鐢ㄨ鑹茬殑灞炴�ф潵鏌ヨ鍙互浣跨敤pkUser.xxxx
+     * @param resourceControlTypeEnum 瑙掕壊鎺у埗鍖哄煙锛屼篃鏄姛鑳芥帶鍒剁殑鍖哄煙
+     * @return 鏉冮檺鐨勬樉绀哄璞�
+     */
+    @Override
+    public List<SmFunctionVO> listFunctionUnInRoleOid(String roleOid, Map<String, String> queryMap, ResourceControlTypeEnum resourceControlTypeEnum) {
+        String controlType = resourceControlTypeEnum == null? ResourceControlTypeEnum.BS.getValue(): resourceControlTypeEnum.getValue();
+        return Optional.ofNullable(listFunctionByRoleOid(roleOid,queryMap,true)).orElseGet(()->new ArrayList<>()).stream().filter(s->controlType.equalsIgnoreCase(s.getResourceControlType())).collect(Collectors.toList());
+    }
+
+    /**
+     * 浣跨敤瑙掕壊涓婚敭鏌ヨ鏉冮檺
+     * @param roleOid 鐢ㄦ埛涓婚敭
+     * @param queryMap 鏌ヨ鏉′欢
+     * @param notIn 鏄惁涓轰笉鍖呭惈
+     * @return 瑙掕壊鐨勬樉绀哄璞�
+     */
+    private List<SmFunctionVO> listFunctionByRoleOid(String roleOid, Map<String,String> queryMap, boolean notIn){
+        if(StringUtils.isBlank(roleOid)){
+            return new ArrayList<>();
+        }
+        if(queryMap == null){
+            queryMap = new HashMap<>();
+        }
+        List<SmFunctionForPlatform1> functions = new ArrayList<>();
+        if(roleOid.contains(",")){
+            Map<String, String> finalQueryMap = queryMap;
+            WebUtil.switchCollectionForOracleIn(WebUtil.str2List(roleOid)).stream().forEach(roleOids->{
+                Map<String,String> conditionMap = new HashMap<>();
+                finalQueryMap.forEach((key,value)->{
+                    conditionMap.put(key,value);
+                });
+                conditionMap.put("ploid", notIn ? QueryOptionConstant.NOTIN : QueryOptionConstant.IN + "select plfuncoid from plroleright where plroleoid in (" + WebUtil.toInSql(roleOids.toArray(new String[0])) + ")");
+                VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(conditionMap,SmRoleForPlatform1.class);
+                List<SmFunctionForPlatform1> functionForPlatform1s = boService.selectByQueryWrapper(queryWrapper, SmFunctionForPlatform1.class);
+                if(!CollectionUtils.isEmpty(functionForPlatform1s)){
+                    functions.addAll(functionForPlatform1s);
+                }
+            });
+        }else {
+            queryMap.put("ploid", notIn ? QueryOptionConstant.NOTIN : QueryOptionConstant.IN + "select plfuncoid from plroleright where plroleoid ='" + roleOid.trim() + "'");
+        }
+        VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(queryMap,SmRoleForPlatform1.class);
+        List<SmFunctionForPlatform1> roleForPlatform1s = boService.selectByQueryWrapper(queryWrapper, SmFunctionForPlatform1.class);
+        if(!CollectionUtils.isEmpty(roleForPlatform1s)){
+            functions.addAll(roleForPlatform1s);
+        }
+        return functionForPlatform1ToFunctionDOs(functions);
+    }
+
+    /**
+     * 鑾峰彇鏈叧鑱旀煇涓鑹茬殑鏉冮檺
+     *
+     * @param roleOid             瑙掕壊涓婚敭
+     * @param queryMap            鏌ヨ鏉′欢锛屽鏋滈渶瑕佷娇鐢ㄨ鑹茬殑灞炴�ф潵鏌ヨ鍙互浣跨敤pkUser.xxxx
+     * @param pageHelper          鍒嗛〉鍜屾帓搴忓璞★紝鑰佸钩鍙颁笉鏀寔浣跨敤鏉冮檺缂栧彿鏉ユ帓搴�
+     * @param resourceControlTypeEnum 瑙掕壊鎺у埗鍖哄煙锛屼篃鏄姛鑳芥帶鍒剁殑鍖哄煙
+     * @return 鏉冮檺鐨勬樉绀哄璞�
+     */
+    @Override
+    public DataGrid<SmFunctionVO> gridFunctionUninRoleOid(String roleOid, Map<String, String> queryMap, PageHelper pageHelper, ResourceControlTypeEnum resourceControlTypeEnum) {
+        return gridFunctionByRoleOid(roleOid,queryMap,pageHelper,resourceControlTypeEnum,true);
+    }
+
+    /**
+     * 鎵归噺鏍规嵁瑙掕壊鐨勪富閿潵鑾峰彇鏉冮檺
+     *
+     * @param roleOidCollection   瑙掕壊涓婚敭闆嗗悎
+     * @param queryMap            鏌ヨ鏉′欢锛屽鏋滈渶瑕佷娇鐢ㄨ鑹茬殑灞炴�ф潵鏌ヨ鍙互浣跨敤pkRole.xxxx
+     * @param resourceControlTypeEnum 瑙掕壊鎺у埗鍖哄煙锛屼篃鏄姛鑳芥帶鍒剁殑鍖哄煙
+     * @return 鏉冮檺鐨勬樉绀哄璞★紝key鏄鑹蹭富閿�,value鏄繖涓鑹插叧鑱旂殑鏉冮檺
+     */
+    @Override
+    public Map<String, List<SmFunctionVO>> batchListFunctionByRoleOids(Collection<String> roleOidCollection, Map<String, String> queryMap, ResourceControlTypeEnum resourceControlTypeEnum) {
+        if(CollectionUtils.isEmpty(roleOidCollection)){
+            return new HashMap<>();
+        }
+        List<SmFunctionVO> functionVOList = new ArrayList<>();
+        Map<String,List<String>>  roleFunctionOidMap = new HashMap<>();
+        String roleContoll = resourceControlTypeEnum == null?ResourceControlTypeEnum.BS.getValue():resourceControlTypeEnum.getValue();
+        WebUtil.switchCollectionForOracleIn(roleOidCollection).stream().forEach(roleOids->{
+            List<SmFunctionVO> functionVOS = Optional.ofNullable(listFunctionByRoleOid(roleOids.stream().collect(Collectors.joining(",")), queryMap, false)).orElseGet(()->new ArrayList<>()).stream().filter(s->roleContoll.equalsIgnoreCase(s.getResourceControlType())).collect(Collectors.toList());
+            if(!CollectionUtils.isEmpty(functionVOS)){
+                functionVOList.addAll(functionVOS);
+                String sql = "select plfuncoid,plroleoid from plroleright where plroleoid in (" + WebUtil.toInSql(roleOids.toArray(new String[0])) + ")";
+                List<ClientBusinessObject> cbos = boService.queryBySql(sql, null);
+                if(!CollectionUtils.isEmpty(cbos)){
+                    cbos.stream().forEach(cbo->{
+                        String roleOid = cbo.getAttributeValue("plroleoid");
+                        List<String> functionOids = roleFunctionOidMap.getOrDefault(roleOid,new ArrayList<>());
+                        functionOids.add(cbo.getAttributeValue("plfuncoid"));
+                        roleFunctionOidMap.put(roleOid,functionOids);
+                    });
+                }
+            }
+        });
+        if(!CollectionUtils.isEmpty(functionVOList)){
+            Map<String, SmFunctionVO> functionVOMap = functionVOList.stream().collect(Collectors.toMap(s -> s.getOid(), t -> t));
+            Map<String, List<SmFunctionVO>> roleFunctionVOMap = new HashMap<>();
+            roleFunctionOidMap.forEach((roleOid,functionOids)->{
+                List<SmFunctionVO> functionVOS = new ArrayList<>();
+                functionOids.forEach(functionOid->{
+                    if(functionVOMap.containsKey(functionOid)){
+                        functionVOS.add(functionVOMap.get(functionOid));
+                    }
+                });
+                roleFunctionVOMap.put(roleOid,functionVOS);
+            });
+            return roleFunctionVOMap;
+        }
+        return  new HashMap<>();
+    }
+
+    /**
+     * 浣跨敤瑙掕壊鏌ヨ鏉冮檺琛�
+     * @param roleOid 瑙掕壊鐨勪富閿�
+     * @param queryMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉瀵硅薄
+     * @param notIn 涓嶅寘鍚�
+     * @return 鍒楄〃鏁版嵁
+     */
+    private DataGrid<SmFunctionVO> gridFunctionByRoleOid(String roleOid,Map<String,String> queryMap,PageHelper pageHelper,ResourceControlTypeEnum resourceControlTypeEnum,boolean notIn){
+        if(queryMap == null){
+            queryMap = new HashMap<>();
+        }
+        if(StringUtils.isBlank(roleOid)){
+            return new DataGrid<>();
+        }
+        if(roleOid.contains(",")){
+            String[] roleOids = roleOid.trim().split(",");
+            if(roleOids.length>1000){
+                //杩欎釜鏂规硶涓嶆敮鎸佽秴杩�1000涓殑鐢ㄦ埛鏌ヨ
+                throw new VciBaseException("杩欎釜鏂规硶涓嶆敮鎸佽秴杩�1000涓鑹茬殑涓婚敭鏉ユ煡璇�");
+            }
+            queryMap.put("ploid", notIn ? QueryOptionConstant.NOTIN : QueryOptionConstant.IN + "select plfuncoid from plroleright where plroleoid in (" + WebUtil.toInSql(roleOid) + ")");
+        }else {
+            queryMap.put("ploid", notIn ? QueryOptionConstant.NOTIN : QueryOptionConstant.IN + "select plfuncoid from plroleright where plroleoid ='" + roleOid.trim() + "'");
+        }
+        if(resourceControlTypeEnum == null){
+            resourceControlTypeEnum = ResourceControlTypeEnum.BS;
+        }
+        switch (resourceControlTypeEnum){
+            case BS:
+                queryMap.put("plresourceb",QueryOptionConstant.ISNOTNULL);
+                break;
+            case DOTNET:
+                queryMap.put("plresourcedotnet",QueryOptionConstant.ISNOTNULL);
+                break;
+            case MOBILE:
+                queryMap.put("plresourcemobil",QueryOptionConstant.ISNOTNULL);
+                break;
+            default:
+                queryMap.put("plsuffixc",QueryOptionConstant.ISNOTNULL);
+        }
+        return dataGrid(queryMap,pageHelper);
+    }
+    /**
+     * 鎵归噺鏍规嵁瑙掕壊鐨勪富閿幏鍙栧叧鑱旂殑鏉冮檺
+     *
+     * @param roleOidCollection   瑙掕壊鐨勪富閿泦鍚�
+     * @param queryMap            鏌ヨ鏉′欢锛屽鏋滈渶瑕佷娇鐢ㄨ鑹茬殑灞炴�ф潵鏌ヨ鍙互浣跨敤pkRole.xxxx
+     * @param resourceControlTypeEnum 瑙掕壊鎺у埗鍖哄煙锛屼篃鏄姛鑳芥帶鍒剁殑鍖哄煙
+     * @return 鏉冮檺鐨勬樉绀哄璞�, 浼氬幓闄ら噸澶嶇殑椤�
+     */
+    @Override
+    public List<SmFunctionVO> listFunctionByRoleOids(Collection<String> roleOidCollection, Map<String, String> queryMap, ResourceControlTypeEnum resourceControlTypeEnum) {
+        if(CollectionUtils.isEmpty(roleOidCollection)){
+            return new ArrayList<>();
+        }
+        return listFunctionByRoleOid(roleOidCollection.stream().collect(Collectors.joining(",")),queryMap,false);
+    }
+
+    /**
+     * 鎵归噺鏍规嵁瑙掕壊鐨勪富閿幏鍙栧叧鑱旂殑鏉冮檺
+     *
+     * @param roleOidCollection   瑙掕壊鐨勪富閿泦鍚�
+     * @param queryMap            鏌ヨ鏉′欢锛屽鏋滈渶瑕佷娇鐢ㄨ鑹茬殑灞炴�ф潵鏌ヨ鍙互浣跨敤pkRole.xxxx
+     * @param pageHelper          鍒嗛〉瀵硅薄
+     * @param resourceControlTypeEnum 瑙掕壊鎺у埗鍖哄煙锛屼篃鏄姛鑳芥帶鍒剁殑鍖哄煙
+     * @return 鏉冮檺鐨勬樉绀哄璞�, 浼氬幓闄ら噸澶嶇殑椤�
+     */
+    @Override
+    public DataGrid<SmFunctionVO> gridFunctionByRoleOids(Collection<String> roleOidCollection, Map<String, String> queryMap, PageHelper pageHelper, ResourceControlTypeEnum resourceControlTypeEnum) {
+        if(CollectionUtils.isEmpty(roleOidCollection)){
+            return new DataGrid<>();
+        }
+        return gridFunctionByRoleOid(roleOidCollection.stream().collect(Collectors.joining(",")), queryMap,pageHelper,resourceControlTypeEnum,false);
+    }
+
+
+    /**
+     * 娓呴櫎缂撳瓨
+     */
+    @Override
+    @CacheEvict(value = VCI_OBJECT_SERVICE,key = ALL_FUNCTION)
+    public void clearCache() {
+
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmRoleQueryServiceImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmRoleQueryServiceImpl.java
new file mode 100644
index 0000000..d8e0821
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmRoleQueryServiceImpl.java
@@ -0,0 +1,532 @@
+package com.vci.frameworkcore.compatibility.impl;
+
+import com.vci.frameworkcore.compatibility.SmRoleQueryServiceI;
+import com.vci.frameworkcore.constant.FrameWorkBtmTypeConstant;
+import com.vci.frameworkcore.enumpck.RoleClassifyEnum;
+import com.vci.frameworkcore.enumpck.RoleControlAreaEnum;
+import com.vci.frameworkcore.model.SmRoleForPlatform1;
+import com.vci.frameworkcore.pagemodel.SmRoleVO;
+import com.vci.starter.web.constant.QueryOptionConstant;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.starter.web.pagemodel.Tree;
+import com.vci.starter.web.pagemodel.TreeQueryObject;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.starter.web.wrapper.VciQueryWrapperForDO;
+import com.vci.web.properties.WebProperties;
+import com.vci.web.service.WebBoServiceI;
+import com.vci.web.util.PlatformClientUtil;
+import com.vci.web.util.WebUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import plm.bs.bom.clientobject.ClientBusinessObject;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static com.vci.frameworkcore.constant.FrameWorkBusLangCodeConstant.DATA_OID_NOT_EXIST;
+
+/**
+ * 瑙掕壊鐨勬煡璇㈡湇鍔★紝鍏煎鏉ュ钩鍙帮紝绱犳湁鐨勬帴鍙i兘杩斿洖鏂扮殑瑙掕壊鏄剧ず瀵硅薄
+ * @author xiejun
+ * @date 2020/3/10
+ */
+@Service
+public class SmRoleQueryServiceImpl implements SmRoleQueryServiceI {
+
+	/**
+	 * 涓氬姟鏁版嵁鏈嶅姟
+	 */
+	@Autowired
+	private WebBoServiceI boService;
+
+	/**
+     * 鏍规嵁瑙掕壊涓婚敭鑾峰彇瑙掕壊鐨勪俊鎭�
+     * @param roleOid 瑙掕壊涓婚敭
+     * @return 瑙掕壊鐨勬樉绀哄璞★紝濡傛灉瑙掕壊涓嶅瓨鍦ㄥ垯杩斿洖null锛屼笉浼氭姏鍑哄紓甯�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮暟鎹簱瀛樺湪闂鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+	@Override
+	public SmRoleVO getRoleByRoleOid(String roleOid) throws VciBaseException {
+		if(StringUtils.isBlank(roleOid)){
+			return null;
+		}
+		SmRoleForPlatform1 role = boService.selectByOid(roleOid, SmRoleForPlatform1.class);
+		if(role == null || StringUtils.isBlank(role.getPluid())){
+			throw new VciBaseException(DATA_OID_NOT_EXIST);
+		}
+		return platformRole2SmRoleVO(role);
+	}
+	/**
+     * 鎵归噺鑾峰彇瑙掕壊鐨勪俊鎭� 锛堟牴鎹鑹蹭富閿級
+     * @param roleOidCollections 瑙掕壊涓婚敭鐨勯泦鍚堬紝鍙互瓒呰繃1000涓�
+     * @return 瑙掕壊鐨勬樉绀哄璞★紝濡傛灉瑙掕壊涓嶅瓨鍦ㄥ垯杩斿洖绌虹殑鍒楄〃锛屼笉浼氭姏鍑哄紓甯�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮暟鎹簱瀛樺湪闂鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+	@Override
+	public List<SmRoleVO> listRoleByRoleOids(
+			Collection<String> roleOidCollections) throws VciBaseException {
+		if(CollectionUtils.isEmpty(roleOidCollections)){
+			return new ArrayList<>();
+		}
+		List<SmRoleForPlatform1> roles = new ArrayList<>();
+		WebUtil.switchCollectionForOracleIn(roleOidCollections).stream().forEach(roleOids->{
+			VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(null,SmRoleForPlatform1.class);
+			queryWrapper.in("pluid", VciBaseUtil.toInSql(roleOids.toArray(new String[0])));
+			List<SmRoleForPlatform1> roleForPlatform1s = boService.selectByQueryWrapper(queryWrapper, SmRoleForPlatform1.class);
+			if(!CollectionUtils.isEmpty(roleForPlatform1s)){
+				roles.addAll(roleForPlatform1s);
+			}
+		});
+		return 	platformRole2SmRoleVOs(roles);
+	}
+	/**
+     * 鑾峰彇瑙掕壊鐨勫垪琛紝榛樿浼氫互瑙掕壊鍚嶅崌搴忔帓鍒楋紝瑙掕壊鐨勭紪杈戦〉闈㈠垪琛ㄤ笉瑕佷娇鐢ㄨ繖涓帴鍙�
+     * @param queryMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉鍜屾帓搴忕殑淇℃伅锛屽湪鍏煎鑰佸钩鍙扮殑鏃跺�欎細鑷姩鍏煎锛屽鏋滃睘鎬т笉瀛樺湪浼氳嚜鍔ㄥ拷鐣�
+     * @return 瑙掕壊鐨勬樉绀哄璞″垪琛�
+     * @throws VciBaseException 鍙傛暟涓虹┖鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+	@Override
+	public DataGrid<SmRoleVO> gridRoles(Map<String, String> queryMap,
+										PageHelper pageHelper) throws VciBaseException {
+		if(pageHelper == null){
+			pageHelper = new PageHelper(-1);
+		}
+		pageHelper.addDefaultAsc("plname");
+		VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(queryMap,SmRoleForPlatform1.class,pageHelper);
+		//鎴戜滑涓嶈兘鏄剧ず涓夊憳鍜岀鐞嗗憳鐨勮鑹�
+		queryWrapper.eq("pltype","2");
+		List<SmRoleForPlatform1> roleForPlatform1s = boService.selectByQueryWrapper(queryWrapper, SmRoleForPlatform1.class);
+		DataGrid<SmRoleVO> dataGrid = new DataGrid<>();
+		if(!CollectionUtils.isEmpty(roleForPlatform1s)){
+			dataGrid.setData(platformRole2SmRoleVOs(roleForPlatform1s));
+			dataGrid.setTotal(boService.countByQueryWrapper(queryWrapper,SmRoleForPlatform1.class));
+		}
+		return dataGrid;
+	}
+	 /**
+     * 鏍规嵁瑙掕壊涓婚敭鑾峰彇瑙掕壊鐨勫鍚�
+     * @param roleOid 瑙掕壊涓婚敭
+     * @return 瑙掕壊濮撳悕锛屽鏋滀笉瀛樺湪浼氳繑鍥瀗ull
+     */
+	@Override
+	public String getRoleNameByRoleOid(String roleOid) {
+		WebUtil.alertNotNull(roleOid,"瑙掕壊涓婚敭");
+		return getRoleByRoleOid(roleOid).getName();
+	}
+	 /**
+     * 鏍规嵁鐢ㄦ埛涓婚敭鑾峰彇鍏宠仈鐨勮鑹�
+     * @param userOid 鐢ㄦ埛涓婚敭
+     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滈渶瑕佷娇鐢ㄧ敤鎴风殑灞炴�ф潵鏌ヨ鍙互浣跨敤pkUser.xxxx
+     * @return 瑙掕壊鐨勬樉绀哄璞�
+     */
+	@Override
+	public List<SmRoleVO> listRoleByUserOid(String userOid,
+			Map<String, String> queryMap) {
+		return listRoleByUserOid(userOid,queryMap,false);
+	}
+
+	/**
+	 * 浣跨敤鐢ㄦ埛涓婚敭鏌ヨ瑙掕壊
+	 * @param userOid 鐢ㄦ埛涓婚敭
+	 * @param queryMap 鏌ヨ鏉′欢
+	 * @param notIn 鏄惁涓轰笉鍖呭惈
+	 * @return 瑙掕壊鐨勬樉绀哄璞�
+	 */
+	private List<SmRoleVO> listRoleByUserOid(String userOid,Map<String,String> queryMap,boolean notIn){
+		if(StringUtils.isBlank(userOid)){
+			return new ArrayList<>();
+		}
+		if(queryMap == null){
+			queryMap = new HashMap<>();
+		}
+		List<SmRoleForPlatform1> roles = new ArrayList<>();
+		if(userOid.contains(",")){
+			Map<String, String> finalQueryMap = queryMap;
+			WebUtil.switchCollectionForOracleIn(WebUtil.str2List(userOid)).stream().forEach(userOids->{
+				Map<String,String> conditionMap = new HashMap<>();
+				finalQueryMap.forEach((key,value)->{
+					conditionMap.put(key,value);
+				});
+				conditionMap.put("pluid", notIn ? QueryOptionConstant.NOTIN : QueryOptionConstant.IN + "select plroleuid from pluserrole where pluseruid in (" + WebUtil.toInSql(userOids.toArray(new String[0])) + ")");
+				VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(conditionMap,SmRoleForPlatform1.class);
+				List<SmRoleForPlatform1> roleForPlatform1s = boService.selectByQueryWrapper(queryWrapper, SmRoleForPlatform1.class);
+				if(!CollectionUtils.isEmpty(roleForPlatform1s)){
+					roles.addAll(roleForPlatform1s);
+				}
+			});
+		}else {
+			queryMap.put("pluid", notIn ? QueryOptionConstant.NOTIN : QueryOptionConstant.IN + "select plroleuid from pluserrole where pluseruid ='" + userOid.trim() + "'");
+		}
+		VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(queryMap,SmRoleForPlatform1.class);
+		List<SmRoleForPlatform1> roleForPlatform1s = boService.selectByQueryWrapper(queryWrapper, SmRoleForPlatform1.class);
+		if(!CollectionUtils.isEmpty(roleForPlatform1s)){
+			roles.addAll(roleForPlatform1s);
+		}
+		return platformRole2SmRoleVOs(roles);
+	}
+	  /**
+     * 鏍规嵁鐢ㄦ埛涓婚敭鑾峰彇鍏宠仈鐨勮鑹�
+     * @param userOid 鐢ㄦ埛涓婚敭
+     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滈渶瑕佷娇鐢ㄧ敤鎴风殑灞炴�ф潵鏌ヨ鍙互浣跨敤pkUser.xxxx
+     * @param pageHelper 鍒嗛〉鍜屾帓搴忓璞★紝鑰佸钩鍙颁笉鏀寔浣跨敤瑙掕壊缂栧彿鏉ユ帓搴�
+     * @return 瑙掕壊鐨勬樉绀哄璞�
+     */
+	@Override
+	public DataGrid<SmRoleVO> gridRoleByUserOid(String userOid,
+			Map<String, String> queryMap, PageHelper pageHelper) {
+		return gridRoleByUserOid(userOid,queryMap,pageHelper,false);
+	}
+
+	/**
+	 * 浣跨敤鐢ㄦ埛鏌ヨ瑙掕壊鍒楄〃
+	 * @param userOid 鐢ㄦ埛涓婚敭
+	 * @param queryMap 鏌ヨ鏉′欢
+	 * @param pageHelper 鍒嗛〉瀵硅薄
+	 * @param notIn 涓嶅寘鍚�
+	 * @return 鍒楄〃鏁版嵁
+	 */
+	private DataGrid<SmRoleVO> gridRoleByUserOid(String userOid,Map<String,String> queryMap,PageHelper pageHelper,boolean notIn){
+		if(queryMap == null){
+			queryMap = new HashMap<>();
+		}
+		if(StringUtils.isBlank(userOid)){
+			return new DataGrid<>();
+		}
+		if(userOid.contains(",")){
+			String[] userOids = userOid.trim().split(",");
+			if(userOids.length>1000){
+				//杩欎釜鏂规硶涓嶆敮鎸佽秴杩�1000涓殑鐢ㄦ埛鏌ヨ
+				throw new VciBaseException("杩欎釜鏂规硶涓嶆敮鎸佽秴杩�1000涓敤鎴风殑涓婚敭鏉ユ煡璇�");
+			}
+			queryMap.put("pluid", notIn ? QueryOptionConstant.NOTIN : QueryOptionConstant.IN + "select plroleuid from pluserrole where pluseruid in (" + WebUtil.toInSql(userOids) + ")");
+		}else {
+			queryMap.put("pluid", notIn ? QueryOptionConstant.NOTIN : QueryOptionConstant.IN + "select plroleuid from pluserrole where pluseruid ='" + userOid.trim() + "'");
+		}
+		return gridRoles(queryMap,pageHelper);
+	}
+	 /**
+     * 鑾峰彇鏈叧鑱旀煇涓敤鎴风殑瑙掕壊
+     * @param userOid 鐢ㄦ埛涓婚敭
+     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滈渶瑕佷娇鐢ㄧ敤鎴风殑灞炴�ф潵鏌ヨ鍙互浣跨敤pkUser.xxxx
+     * @return 瑙掕壊鐨勬樉绀哄璞�
+     */
+	@Override
+	public List<SmRoleVO> listRoleUnInUserOid(String userOid,
+			Map<String, String> queryMap) {
+		return listRoleByUserOid(userOid,queryMap,true);
+	}
+	/**
+     * 鑾峰彇鏈叧鑱旀煇涓敤鎴风殑瑙掕壊
+     * @param userOid 鐢ㄦ埛涓婚敭
+     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滈渶瑕佷娇鐢ㄧ敤鎴风殑灞炴�ф潵鏌ヨ鍙互浣跨敤pkUser.xxxx
+     * @param pageHelper 鍒嗛〉鍜屾帓搴忓璞★紝鑰佸钩鍙颁笉鏀寔浣跨敤瑙掕壊缂栧彿鏉ユ帓搴�
+     * @return 瑙掕壊鐨勬樉绀哄璞�
+     */
+	@Override
+	public DataGrid<SmRoleVO> gridRoleUninUserOid(String userOid,
+			Map<String, String> queryMap, PageHelper pageHelper) {
+		return gridRoleByUserOid(userOid,queryMap,pageHelper,true);
+	}
+	  /**
+     * 鎵归噺鏍规嵁鐢ㄦ埛鐨勪富閿潵鑾峰彇瑙掕壊
+     * @param userOidCollection 鐢ㄦ埛涓婚敭闆嗗悎
+     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滈渶瑕佷娇鐢ㄧ敤鎴风殑灞炴�ф潵鏌ヨ鍙互浣跨敤pkUser.xxxx
+     * @return 瑙掕壊鐨勬樉绀哄璞★紝key鏄敤鎴蜂富閿�,value鏄繖涓敤鎴峰叧鑱旂殑瑙掕壊
+     */
+	@Override
+	public Map<String, List<SmRoleVO>> batchListRoleByUserOids(
+			Collection<String> userOidCollection, Map<String, String> queryMap) {
+		if(CollectionUtils.isEmpty(userOidCollection)){
+			return new HashMap<>();
+		}
+		List<SmRoleVO> roleVOList = new ArrayList<>();
+		Map<String,List<String>> userRoleOidMap = new HashMap<>();
+		WebUtil.switchCollectionForOracleIn(userOidCollection).stream().forEach(userOids->{
+			List<SmRoleVO> roleVOS = listRoleByUserOid(userOids.stream().collect(Collectors.joining(",")), queryMap, false);
+			if(!CollectionUtils.isEmpty(roleVOS)){
+				roleVOList.addAll(roleVOS);
+				String sql = "select pluseruid,plroleuid from pluserrole where pluseruid in (" + WebUtil.toInSql(userOids.toArray(new String[0])) + ")";
+				List<ClientBusinessObject> cbos = boService.queryBySql(sql, null);
+				if(!CollectionUtils.isEmpty(cbos)){
+					cbos.stream().forEach(cbo->{
+						String userOid = cbo.getAttributeValue("pluseruid");
+						List<String> roleOids = userRoleOidMap.getOrDefault(userOid,new ArrayList<>());
+						roleOids.add(cbo.getAttributeValue("plroleuid"));
+						userRoleOidMap.put(userOid,roleOids);
+					});
+				}
+			}
+		});
+		if(!CollectionUtils.isEmpty(roleVOList)){
+			Map<String, SmRoleVO> roleVOMap = roleVOList.stream().collect(Collectors.toMap(s -> s.getOid(), t -> t));
+			Map<String, List<SmRoleVO>> userRoleVOMap = new HashMap<>();
+			userRoleOidMap.forEach((userOid,roleOids)->{
+				List<SmRoleVO> roleVOS = new ArrayList<>();
+				roleOids.forEach(roleOid->{
+					if(roleVOMap.containsKey(roleOid)){
+						roleVOS.add(roleVOMap.get(roleOid));
+					}
+				});
+				userRoleVOMap.put(userOid,roleVOS);
+			});
+			return userRoleVOMap;
+		}
+		return new HashMap<>();
+	}
+	 /**
+     * 鏍规嵁鏉冮檺涓婚敭鑾峰彇鍏宠仈鐨勮鑹�
+     * @param functionOid 鏉冮檺涓婚敭
+     * @param queryMap 鏌ヨ鏉′欢
+     * @return 瑙掕壊鐨勬樉绀哄璞�
+     */
+	@Override
+	public List<SmRoleVO> listRoleByFunctionOid(String functionOid,
+			Map<String, String> queryMap) {
+		return listRoleByFunctionOid(functionOid,queryMap,false);
+	}
+
+	/**
+	 * 浣跨敤鐢ㄦ埛涓婚敭鏌ヨ瑙掕壊
+	 * @param functionOid 鐢ㄦ埛涓婚敭
+	 * @param queryMap 鏌ヨ鏉′欢
+	 * @param notIn 鏄惁涓轰笉鍖呭惈
+	 * @return 瑙掕壊鐨勬樉绀哄璞�
+	 */
+	private List<SmRoleVO> listRoleByFunctionOid(String functionOid,Map<String,String> queryMap,boolean notIn){
+		if(StringUtils.isBlank(functionOid)){
+			return new ArrayList<>();
+		}
+		if(queryMap == null){
+			queryMap = new HashMap<>();
+		}
+		List<SmRoleForPlatform1> roles = new ArrayList<>();
+		if(functionOid.contains(",")){
+			Map<String, String> finalQueryMap = queryMap;
+			WebUtil.switchCollectionForOracleIn(WebUtil.str2List(functionOid)).stream().forEach(functionOids->{
+				Map<String,String> conditionMap = new HashMap<>();
+				finalQueryMap.forEach((key,value)->{
+					conditionMap.put(key,value);
+				});
+				conditionMap.put("pluid", notIn ? QueryOptionConstant.NOTIN : QueryOptionConstant.IN + "select plroleoid from plroleright where plfuncoid in (" + WebUtil.toInSql(functionOids.toArray(new String[0])) + ")");
+				VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(conditionMap,SmRoleForPlatform1.class);
+				List<SmRoleForPlatform1> roleForPlatform1s = boService.selectByQueryWrapper(queryWrapper, SmRoleForPlatform1.class);
+				if(!CollectionUtils.isEmpty(roleForPlatform1s)){
+					roles.addAll(roleForPlatform1s);
+				}
+			});
+		}else {
+			queryMap.put("pluid", notIn ? QueryOptionConstant.NOTIN : QueryOptionConstant.IN + "select plroleoid from plroleright where plfuncoid ='" + functionOid.trim() + "'");
+			VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(queryMap,SmRoleForPlatform1.class);
+			List<SmRoleForPlatform1> roleForPlatform1s = boService.selectByQueryWrapper(queryWrapper, SmRoleForPlatform1.class);
+			if(!CollectionUtils.isEmpty(roleForPlatform1s)){
+				roles.addAll(roleForPlatform1s);
+			}
+		}
+		return platformRole2SmRoleVOs(roles);
+	}
+
+	/**
+	 * 鑾峰彇鏈叧鑱旀煇涓潈闄愮殑瑙掕壊
+	 * @param functionOid 鏉冮檺涓婚敭
+	 * @param queryMap 鏌ヨ鏉′欢
+	 * @param pageHelper 鍒嗛〉鍜屾帓搴忓璞★紝鑰佸钩鍙颁笉鏀寔浣跨敤瑙掕壊缂栧彿鏉ユ帓搴�
+	 * @return 瑙掕壊鐨勬樉绀哄璞�
+	 */
+	@Override
+	public DataGrid<SmRoleVO> gridRoleByFunctionOid(String functionOid,
+			Map<String, String> queryMap, PageHelper pageHelper) {
+		return gridRoleByFunctionOid(functionOid,queryMap,pageHelper,false);
+	}
+
+	/**
+	 * 浣跨敤鏉冮檺鏌ヨ瑙掕壊鍒楄〃
+	 * @param functionOid 鏉冮檺涓婚敭
+	 * @param queryMap 鏌ヨ鏉′欢
+	 * @param pageHelper 鍒嗛〉瀵硅薄
+	 * @param notIn 涓嶅寘鍚�
+	 * @return 鍒楄〃鏁版嵁
+	 */
+	private DataGrid<SmRoleVO> gridRoleByFunctionOid(String functionOid,Map<String,String> queryMap,PageHelper pageHelper,boolean notIn){
+		if(queryMap == null){
+			queryMap = new HashMap<>();
+		}
+		if(StringUtils.isBlank(functionOid)){
+			return new DataGrid<>();
+		}
+		if(functionOid.contains(",")){
+			String[] functionOids= functionOid.trim().split(",");
+			if(functionOids.length>1000){
+				//杩欎釜鏂规硶涓嶆敮鎸佽秴杩�1000涓殑鐢ㄦ埛鏌ヨ
+				throw new VciBaseException("杩欎釜鏂规硶涓嶆敮鎸佽秴杩�1000涓潈闄愮殑涓婚敭鏉ユ煡璇�");
+			}
+			queryMap.put("pluid", notIn ? QueryOptionConstant.NOTIN : QueryOptionConstant.IN + "select plroleoid from plroleright where plfuncoid in (" + WebUtil.toInSql(functionOids) + ")");
+		}else {
+			queryMap.put("pluid", notIn ? QueryOptionConstant.NOTIN : QueryOptionConstant.IN + "select plroleoid from plroleright where plfuncoid ='" + functionOid.trim() + "'");
+		}
+		return gridRoles(queryMap,pageHelper);
+	}
+
+	/**
+	 * 鑾峰彇鏈叧鑱旀煇涓潈闄愮殑瑙掕壊
+	 * @param functionOid 鏉冮檺涓婚敭
+	 * @param queryMap 鏌ヨ鏉′欢
+	 * @return 瑙掕壊鐨勬樉绀哄璞�
+	 */
+	@Override
+	public List<SmRoleVO> listRoleUnInFunctionOid(String functionOid,
+			Map<String, String> queryMap) {
+		return listRoleByFunctionOid(functionOid,queryMap,true);
+	}
+
+	/**
+	 * 鏍规嵁鏉冮檺涓婚敭鑾峰彇鍏宠仈鐨勮鑹�
+	 * @param functionOid 鏉冮檺涓婚敭
+	 * @param queryMap 鏌ヨ鏉′欢
+	 * @param pageHelper 鍒嗛〉鍜屾帓搴忓璞★紝鑰佸钩鍙颁笉鏀寔浣跨敤瑙掕壊缂栧彿鏉ユ帓搴�
+	 * @return 瑙掕壊鐨勬樉绀哄璞�
+	 */
+	@Override
+	public DataGrid<SmRoleVO> gridRoleUnInFunctionOid(String functionOid,
+			Map<String, String> queryMap, PageHelper pageHelper) {
+		return gridRoleByFunctionOid(functionOid,queryMap,pageHelper,true);
+	}
+
+	/**
+	 * 鎵归噺鏍规嵁鏉冮檺鐨勪富閿潵鑾峰彇瑙掕壊
+	 * @param functionOidCollection 鏉冮檺涓婚敭闆嗗悎
+	 * @param queryMap 鏌ヨ鏉′欢锛屽鏋滈渶瑕佷娇鐢ㄧ敤鎴风殑灞炴�ф潵鏌ヨ鍙互浣跨敤pkUser.xxxx
+	 * @return 瑙掕壊鐨勬樉绀哄璞★紝key鏄潈闄愪富閿�,value鏄繖涓潈闄愬叧鑱旂殑瑙掕壊
+	 */
+	@Override
+	public Map<String, List<SmRoleVO>> batchListRoleByFunctionOids(
+			Collection<String> functionOidCollection,
+			Map<String, String> queryMap) {
+		if(CollectionUtils.isEmpty(functionOidCollection)){
+			return new HashMap<>();
+		}
+		List<SmRoleVO> roleVOList = new ArrayList<>();
+		Map<String,List<String>> funcRoleOidMap = new HashMap<>();
+		WebUtil.switchCollectionForOracleIn(functionOidCollection).stream().forEach(userOids->{
+			List<SmRoleVO> roleVOS = listRoleByFunctionOid(userOids.stream().collect(Collectors.joining(",")), queryMap, false);
+			if(!CollectionUtils.isEmpty(roleVOS)){
+				roleVOList.addAll(roleVOS);
+				String sql = "select plroleoid,plfuncoid from plroleright where plfuncoid in (" + WebUtil.toInSql(userOids.toArray(new String[0])) + ")";
+				List<ClientBusinessObject> cbos = boService.queryBySql(sql, null);
+				if(!CollectionUtils.isEmpty(cbos)){
+					cbos.stream().forEach(cbo->{
+						String funcOid = cbo.getAttributeValue("plfuncoid");
+						List<String> roleOids = funcRoleOidMap.getOrDefault(funcOid,new ArrayList<>());
+						roleOids.add(cbo.getAttributeValue("plroleoid"));
+						funcRoleOidMap.put(funcOid,roleOids);
+					});
+				}
+			}
+		});
+		if(!CollectionUtils.isEmpty(roleVOList)){
+			Map<String, SmRoleVO> roleVOMap = roleVOList.stream().collect(Collectors.toMap(s -> s.getOid(), t -> t));
+			Map<String, List<SmRoleVO>> userRoleVOMap = new HashMap<>();
+			funcRoleOidMap.forEach((funcOid,roleOids)->{
+				List<SmRoleVO> roleVOS = new ArrayList<>();
+				roleOids.forEach(roleOid->{
+					if(roleVOMap.containsKey(roleOid)){
+						roleVOS.add(roleVOMap.get(roleOid));
+					}
+				});
+				userRoleVOMap.put(funcOid,roleVOS);
+			});
+			return userRoleVOMap;
+		}
+		return new HashMap<>();
+	}
+	 /**
+     * 鍙傜収瑙掕壊鐨勫垪琛紝涓夊憳绠$悊鐨勪笁涓鑹蹭笉浼氭樉绀�
+     * @param queryMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉鍜屾帓搴忕殑淇℃伅锛屽湪鍏煎鑰佸钩鍙扮殑鏃跺�欎細鑷姩鍏煎锛屽鏋滃睘鎬т笉瀛樺湪浼氳嚜鍔ㄥ拷鐣�
+     * @return 瑙掕壊鐨勬樉绀哄璞″垪琛�
+     * @throws VciBaseException 鍙傛暟涓虹┖鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+	@Override
+	public DataGrid<SmRoleVO> refGridRoles(Map<String, String> queryMap,
+			PageHelper pageHelper) throws VciBaseException {
+		//鑰佸钩鍙版病鏈夌敓鏁堢姸鎬�
+		return gridRoles(queryMap, pageHelper);
+	}
+	  /**
+     * 瑙掕壊鐨勬爲褰㈠睍绀猴紝甯哥敤浜庤鑹查�夋嫨鐢ㄦ埛鐨勯〉闈娇鐢�
+     * @param treeQueryObject 鏍戞煡璇㈠璞�
+     * @return 鏍戠殑鑺傜偣
+     * @throws VciBaseException 鍙傛暟涓虹┖鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+	@Override
+	public List<Tree> refTreeRoles(TreeQueryObject treeQueryObject)
+			throws VciBaseException {
+		VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(treeQueryObject.getConditionMap(),SmRoleForPlatform1.class);
+		queryWrapper.eq("pltype","2");
+		List<SmRoleForPlatform1> roleForPlatform1s = boService.selectByQueryWrapper(queryWrapper, SmRoleForPlatform1.class);
+		List<SmRoleVO> roleVOList = platformRole2SmRoleVOs(roleForPlatform1s);
+		List<Tree> list=new ArrayList<Tree>();
+		if(!CollectionUtils.isEmpty(roleVOList)){
+			for (SmRoleVO smRoleVO : roleVOList) {
+				 String name=smRoleVO.getName();
+				 Tree tree=new Tree(smRoleVO.getOid(),name);
+				 tree.setShowCheckbox(treeQueryObject.isShowCheckBox());
+				 try {
+					 tree.setAttributes(WebUtil.objectToMapString(smRoleVO));
+				 } catch (Throwable e) {
+					 e.printStackTrace();
+				 }
+				 list.add(tree);
+			}
+		}
+		return list;
+	}
+
+	/**
+	 * 瑙掕壊鐨勮浆鎹紝榛樿鍏ㄩ儴鏄痓s鎺у埗鐨勮鑹�
+	 * @param roleForPlatform1List 鍘熷钩鍙扮殑瑙掕壊
+	 * @return 瑙掕壊鐨勬樉绀哄璞�
+	 */
+	private List<SmRoleVO> platformRole2SmRoleVOs(List<SmRoleForPlatform1> roleForPlatform1List){
+		List<SmRoleVO> roleVOList = new ArrayList<>();
+		if(!CollectionUtils.isEmpty(roleForPlatform1List)){
+			roleForPlatform1List.stream().forEach(s -> {
+				roleVOList.add( platformRole2SmRoleVO(s));
+			});
+		}
+		return roleVOList;
+	}
+
+	/**
+	 * 瑙掕壊鐨勮浆鎹�
+	 * @param roleForPlatform1 鍘熷钩鍙扮殑瑙掕壊
+	 * @return 鏂扮殑瑙掕壊瀵硅薄
+	 */
+	private SmRoleVO platformRole2SmRoleVO(SmRoleForPlatform1 roleForPlatform1){
+		SmRoleVO roleVO = new SmRoleVO();
+		roleVO.setOid(roleForPlatform1.getPluid());
+		roleVO.setId("");
+		roleVO.setName(roleForPlatform1.getPlname());
+		if(roleForPlatform1.getPltype() == 1){
+			roleVO.setRoleClassify(RoleClassifyEnum.MANAGE.getValue());
+		}else{
+			roleVO.setRoleClassify(RoleClassifyEnum.BUSINESS.getValue());
+		}
+		roleVO.setRoleClassifyText(RoleClassifyEnum.getTextByValue(roleVO.getRoleClassify()));
+		roleVO.setRoleControlArea(RoleControlAreaEnum.BS.getValue());
+		roleVO.setRoleClassifyText(RoleControlAreaEnum.BS.getText());
+		roleVO.setCreateTime(roleForPlatform1.getPlcreatetime());
+		roleVO.setCreator(roleForPlatform1.getPlcreateuser());
+		roleVO.setLastModifier(roleForPlatform1.getPlupdateuser());
+		roleVO.setLastModifyTime(roleForPlatform1.getPlupdatetime());
+		roleVO.setBtmname(FrameWorkBtmTypeConstant.SM_ROLE_BTM_TYPE);
+		roleVO.setOwner(roleVO.getCreator());
+		roleVO.setTs(roleVO.getLastModifyTime());
+		return roleVO;
+	}
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmSessionForLoginImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmSessionForLoginImpl.java
new file mode 100644
index 0000000..ea72fe1
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmSessionForLoginImpl.java
@@ -0,0 +1,239 @@
+package com.vci.frameworkcore.compatibility.impl;
+
+import com.vci.corba.common.VCIError;
+import com.vci.starter.web.annotation.log.VciUnLog;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.interceptor.VciSessionForLoginI;
+import com.vci.starter.web.pagemodel.SessionInfo;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.web.properties.WebProperties;
+import com.vci.web.service.WebBoServiceI;
+import com.vci.web.util.PlatformClientUtil;
+import com.vci.web.util.WebUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.CachePut;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import plm.bs.bom.common.AttributeValue;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static com.vci.web.constant.CacheNameConstant.VCI_SESSION;
+
+/**
+ * 浼氳瘽瀛樺偍鐨勬湇鍔�
+ * @author weidy
+ * @date 2021/2/18
+ */
+@Service
+@VciUnLog
+public class SmSessionForLoginImpl implements VciSessionForLoginI {
+
+    /**
+     * 鏃ュ織
+     */
+    private Logger logger = LoggerFactory.getLogger(getClass());
+
+    /**
+     * 閰嶇疆淇℃伅
+     */
+    @Autowired
+    private WebProperties webProperties;
+
+    /**
+     * 涓氬姟绫诲瀷鏈嶅姟
+     */
+    @Autowired
+    private WebBoServiceI boService;
+
+    /**
+     * 骞冲彴鐨勮皟鐢ㄧ被
+     */
+    @Autowired
+    private PlatformClientUtil platformClientUtil;
+
+    /**
+     * 妫�鏌ョ敤鎴锋槸鍚︾櫥褰�
+     *
+     * @param userId 鐢ㄦ埛鍚�
+     * @return 涓虹┖琛ㄧず娌℃湁鐧诲綍
+     */
+    @Override
+    public String checkIsLogined(String userId) {
+        WebUtil.alertNotNull(userId,"鐢ㄦ埛鍚�");
+        List<Map> dataList = boService.queryBySqlForMap("select JSONSTRING as JSONSTRING from VCI_SESSIONINFO where userid ='" + userId.trim() + "'", new HashMap<>());
+        if(!CollectionUtils.isEmpty(dataList)) {
+            Map data = dataList.get(0);
+            SessionInfo sessionInfo = WebUtil.jsonString2JavaBean((String)data.getOrDefault("JSONSTRING",""),SessionInfo.class);
+            return "鍦╥p涓�" + sessionInfo.getIp() + "鐨勫湴鏂瑰凡缁忕櫥褰�";
+        }
+        return "";
+    }
+
+    /**
+     * 寮哄埗鐢ㄦ埛涓嬬嚎
+     *
+     * @param userId 鐢ㄦ埛鍚�
+     */
+    @Override
+    public void popUser(String userId) {
+        WebUtil.alertNotNull(userId,"鐢ㄦ埛鍚�");
+        try{
+            platformClientUtil.getBOFactoryService().executeUpdateSql("delete from VCI_SESSIONINFO where userid ='" + userId.trim() + "'");
+        }catch (VCIError e){
+            throw WebUtil.getVciBaseException(e);
+        }
+    }
+
+    /**
+     * 灏嗕細璇濅俊鎭瓨鍌ㄥ埌鏁版嵁搴撲腑------
+     *
+     * @param sessionInfo 浼氳瘽淇℃伅
+     */
+    @Override
+    @Deprecated
+    public void saveSessionInfo(SessionInfo sessionInfo) {
+        WebUtil.alertNotNull(sessionInfo,"浼氳瘽淇℃伅");
+        try {
+            AttributeValue[] attrs = new AttributeValue[3];
+            attrs[0] = new AttributeValue("0", sessionInfo.getUserId());
+            attrs[1] = new AttributeValue("1", sessionInfo.getToken());
+            attrs[2] = new AttributeValue("2", WebUtil.getJSONStringWithDateFormat(sessionInfo));
+            platformClientUtil.getBOFactoryService().executeUpdateSqlByParams("    insert into VCI_SESSIONINFO (USERID, TOKEN, JSONSTRING,lastRequestTime\n" +
+                    "      )\n" +
+                    " VALUES (?,?,?," + System.currentTimeMillis() + " )", attrs);
+        }catch (VCIError e){
+            throw WebUtil.getVciBaseException(e);
+        }
+    }
+
+    /**
+     * 鏍¢獙璇锋眰鏄惁绗﹀悎鏉冮檺楠岃瘉
+     * 鍖呭惈1锛岀郴缁熸槸鍚﹀彲浠ヨ闂綋鍓嶆湇鍔℃垨鑰呮帴鍙�
+     * 2, 鐢ㄦ埛鏄惁鏈夋潈闄愯闂綋鍓嶆湇鍔�
+     * 3, 鐢ㄦ埛鏄惁鏈夋潈闄愯闂綋鍓嶆暟鎹�
+     *
+     * @param request            璇锋眰瀵硅薄
+     * @param systemPrivateToken 绯荤粺鐨勮鍙爜
+     * @param sessionInfo        褰撳墠鐢ㄦ埛浼氳瘽瀵硅薄
+     * @param handler            鎵ц瀵硅薄
+     * @return true琛ㄧず鏈夋潈闄愶紝false琛ㄧず娌℃潈闄�
+     * @throws VciBaseException 娌℃湁鏉冮檺鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public boolean checkRequestRights(HttpServletRequest request, String systemPrivateToken, SessionInfo sessionInfo, Object handler) throws VciBaseException {
+        return true;
+    }
+
+    /**
+     * 鏇存柊璇锋眰鏃堕棿
+     *
+     * @param userToken 鐢ㄦ埛token
+     */
+    @Override
+    public void updateRequestTime(String userToken) {
+        WebUtil.alertNotNull(userToken,"浼氳瘽璁稿彲鐮�");
+        try{
+            platformClientUtil.getBOFactoryService().executeUpdateSql("update VCI_SESSIONINFO set lastRequestTime = " + String.valueOf(System.currentTimeMillis()) + " where TOKEN ='" + userToken.trim() + "'");
+        }catch (VCIError e){
+            throw WebUtil.getVciBaseException(e);
+        }
+    }
+
+    /**
+     * 鏍规嵁token鑾峰彇鐢ㄦ埛鐨勫璞�
+     *
+     * @param userToken 鐢ㄦ埛token
+     * @return 鐢ㄦ埛浼氳瘽瀵硅薄
+     */
+    @Override
+    @Cacheable(value = VCI_SESSION,key = "#p0",unless = "#target == null")
+    public SessionInfo getSessionInfoByToken(String userToken) {
+        WebUtil.alertNotNull(userToken,"璁稿彲鐨勪俊鎭�");
+        List<Map> dataList = boService.queryBySqlForMap("select JSONSTRING as JSONSTRING from VCI_SESSIONINFO where TOKEN ='" + userToken.trim() + "'", new HashMap<>());
+//        List<Map> dataList = null;
+//        Map map= new HashMap<>();
+//        map.put("JSONSTRING","{\"browser\":\"122.0.0.0\",\"deptName\":\"涓�杞﹂棿\",\"deptOid\":\"002151D0-13B9-DB23-7006-34DCAC76B3BE\",\"deviceInfo\":[],\"email\":\"\",\"functionOids\":[\"2339F262-1715-F5EE-7E50-4DD6A42B8668\",\"2EC65569-17C7-84C2-A7A6-737E1B021DC4\",\"32037B20-2F95-F4E8-6077-C0B5226B033D\",\"ADB513D3-397E-07DA-7456-992916FF12D9\",\"5D2FDBCA-E04D-B611-8311-8F06E031BF95\",\"56186AEE-80D7-2CDB-CB80-09E87CB9125F\",\"536FD86E-779E-397D-2945-69AAA942A578\",\"FDB26577-596F-CA6F-1A1F-7D68C0E0A3B9\",\"E612DAB4-B3EC-8D08-46CA-8905AC82EF2D\",\"893E5778-481C-A04E-2742-ADFDF0CE3A15\",\"297C9ED8-DF76-9D91-B041-45F1DE161FD8\",\"63A98B92-5DA8-3F23-390E-2A389C714BC1\",\"931C3199-3CA8-733B-1CF3-FE88F0258E16\",\"AC04E222-F14B-F4FF-11BB-DFE8917A2756\",\"64C6BFFD-95B2-995A-73FD-DEE8212DAA56\",\"CC5F364D-E299-81CF-0B20-4BF09956FDA3\",\"B5985BFB-F31D-05A1-9943-D43704F35EDB\",\"86BD9541-8F9B-395F-A73D-B856635EE91C\",\"72ACFF87-05B6-3D8F-4CC4-C559FE9AD372\",\"ECFA5263-AB30-78CB-6F5B-DF11BC054616\",\"88AC00BE-54CC-DE68-F31E-C3D9FAEDD902\",\"F2B19983-15EF-4DC8-0A26-AF322EC8B9D0\",\"D8C8AE63-AD0B-D567-BFBE-AE4BF302C241\",\"D0715569-0F88-5CAB-E9DB-2B93567FC610\",\"2C5FABD2-535F-8568-8E61-C643BA7D77A1\",\"E6E963E7-2DF6-80EE-2A61-FA86E0F3D5F2\",\"BDBD6CFA-2F4C-EEF7-C380-5E9BBF6A37B3\",\"7FE9306A-2659-4E62-1C2B-A09A600A1010\",\"B3EC1413-1A33-61E3-DDD1-CB4D0CFD0C6E\",\"23B65414-A7F9-21B4-A5A9-4F963B8C4ED9\",\"E1A8FA2E-6102-F4C6-209F-C589CD2149F2\",\"077A25D8-09D8-D5DE-42BC-A777BE3327D5\",\"0C8E0C13-A0C1-A4FC-F957-F595DA54E355\",\"BFB9E279-DD28-7172-4A52-2A1767AD7663\",\"CEEAE20E-D93E-2D04-13C6-B8BD5B336374\",\"E84E06C3-60AE-42B8-88BD-1BE52531C1FF\",\"CB5C52F0-5D84-0738-0DA6-0721B76AADB8\",\"C755CC24-7194-BAC4-A3C2-D79E1E3CC594\",\"D8084EB8-AAB0-75A8-7BDD-3DC075D1D919\",\"6C538322-CCFC-ABA2-3BC6-7048C9711ADF\",\"5CEEDD16-4467-2798-245F-57E63CFD7753\",\"A4853E63-0044-52F2-5420-E34B28387C9C\",\"8239D998-F8DF-10B0-24CF-4525FE03E760\",\"D0FCC667-4182-8F03-801E-22E11553B39E\",\"3CB2A1CD-83CA-C155-2675-7B7681E7B03F\",\"C15B77F2-7F7F-2385-BD1F-8A241FF7C1A3\",\"B98ABE87-00DA-4BCA-A3B3-3EB7DF9BE8D9\",\"D25A0998-D315-97F8-36DB-6951E981E54C\",\"2841A478-8E99-7A89-4879-309DFFE5DD61\",\"25C58C8A-D28B-DA99-97A3-F6544B4B8E8D\",\"2AA1BD3D-9318-431F-AB55-ECF4318BDC9F\",\"AC4084E2-06E3-FDD6-7F50-8C1E8090358C\",\"4B919471-E62F-F717-6AC8-DE2B10A2A1DC\",\"D38C457D-FC45-C068-5322-457E522651DC\",\"2DCB5CF2-8127-3826-CCAE-1C40C6746EE8\",\"21766DD3-0B62-C577-FB84-940C1B84711C\",\"ABF503E5-9741-C2BE-31B0-6E15AB50E2D6\",\"B203DE0A-EDD0-4295-1257-79A76917BE85\",\"65A88CCC-220E-3CBF-0D31-E0DF5BDD9C6F\",\"8B7DBACB-C18A-CA11-B0B8-3C481E76E30F\",\"45FB1520-F571-9E97-2EA3-B9C78AF89BEC\",\"E34E1E0D-55F8-3C19-8E7B-E42D8A3FEEB9\"],\"globalAttributeMap\":{},\"ip\":\"127.0.0.1\",\"mustChangePassword\":false,\"os\":\"Windows 10\",\"portalId\":\"1\",\"rolesName\":{\"44044800-B0EB-1003-55B5-954C3FFEA3B8\":\"EBOM瀵煎叆浜哄憳\",\"38FC5CC2-D880-A1C5-5DA0-C2F8B5082B52\":\"鏍″\",\"BA272199-5FF5-C513-F4FA-37F13A733FE8\":\"宸ヨ壓浜哄憳\",\"2761C8F4-6442-A53C-9F40-A1D5978E0799\":\"瀹℃牳\",\"DCF4961B-44DE-BA5B-F73C-8AA1EF1F1DB4\":\"gy1\",\"DA2608CC-07CB-A3FF-528B-CBE040BD7353\":\"缂栧埗\",\"A70A10D5-ED69-0CF5-8491-33D955569550\":\"浼氱\",\"CE4A351B-3669-9722-01AC-2E472B2900A5\":\"涓�鑸敤鎴穃",\"F5E11DDB-88E5-40F8-61B9-3F9E9ADAFFBF\":\"宸ヨ壓缁勯暱\",\"2DFA4811-B391-6727-33C6-697BF4E9A77D\":\"鎵瑰噯\",\"785F8459-DDEA-33D1-40D5-C3F6A42FABB1\":\"涓绘暟鎹甛",\"398B28CE-B1EE-FDEA-5B11-42908B8A3076\":\"PBOM绠$悊宀椾汉鍛榎"},\"sso\":false,\"token\":\"8b9f42164c6b7fd3ca532acf375626cd\",\"userId\":\"1\",\"userName\":\"娴嬭瘯\",\"userOid\":\"921D71F8-C2BB-3BCE-B744-AD0C3812F41A\",\"userSecret\":\"2\",\"usertype\":\"2\"}");
+        if(!CollectionUtils.isEmpty(dataList)) {
+            Map data = dataList.get(0);
+            SessionInfo sessionInfo = WebUtil.jsonString2JavaBean((String)data.getOrDefault("JSONSTRING",""),SessionInfo.class);
+            return  sessionInfo;
+        }
+        return null;
+    }
+
+    /**
+     * 閫�鍑虹櫥褰�
+     *
+     * @param userToken 鐢ㄦ埛鐨勪細璇濊鍙�
+     */
+    @Override
+    public void logout(String userToken) {
+        WebUtil.alertNotNull(userToken,"鐢ㄦ埛璁稿彲");
+        try{
+            platformClientUtil.getBOFactoryService().executeUpdateSql("delete from VCI_SESSIONINFO where TOKEN ='" + userToken.trim() + "'");
+        }catch (VCIError e){
+            throw WebUtil.getVciBaseException(e);
+        }
+    }
+
+    /**
+     * 鏍规嵁token鑾峰彇鐢ㄦ埛鍦ㄧ郴缁熶腑杩樺彲浠ュ瓨鍦ㄧ殑鏃堕棿
+     * @param userToken userToken 鐢ㄦ埛鐨勪細璇濊鍙�
+     * @return 鐢ㄦ埛鍦ㄧ郴缁熶腑杩樺彲浠ュ瓨鍦ㄧ殑鏃堕棿(姣)
+     */
+    @Override
+    public long getCanAliveTime(String userToken) {
+        VciBaseUtil.alertNotNull(userToken,"鐢ㄦ埛浼氳瘽璁稿彲锛堜护鐗�)");
+        List<Map> dataList = boService.queryBySqlForMap("select lastRequestTime as LASTREQUESTTIME from VCI_SESSIONINFO where TOKEN ='" + userToken.trim() + "'", new HashMap<>());
+        if(!CollectionUtils.isEmpty(dataList)) {
+            Map data = dataList.get(0);
+            long lastTime = WebUtil.getLong(data.get("LASTREQUESTTIME").toString());
+            long currentTime = System.currentTimeMillis();
+            long canAliveTime = lastTime + (webProperties.getClientSessionAliveMax()*60*1000) - currentTime;
+            return canAliveTime;
+        }
+        return 0;
+    }
+
+    /**
+     * 鍒犻櫎瓒呮椂鐨勪細璇濈殑淇℃伅
+     */
+    @Scheduled(fixedDelay=60000)
+    public void deleteTimeoutSession(){
+        long now = System.currentTimeMillis();
+        if(webProperties.getClientSessionAliveMax() > 0) {
+            long lastValidTime = now - webProperties.getClientSessionAliveMax() * 60000;
+            if (logger.isDebugEnabled()) {
+                logger.debug("寮�濮嬫墽琛屾壂鎻忚秴鏃剁殑浼氳瘽淇℃伅,鍏朵腑褰撳墠鏃堕棿涓簕},浼氳瘽鏈�鍚庤闂殑鏈夋晥鏃堕棿搴旇涓簕}", now, lastValidTime);
+            }
+            List<Map> invalidSessionList = boService.queryBySqlForMap("select token as TOKEN from  VCI_SESSIONINFO where lastRequestTime<= " + lastValidTime, null);
+            if (!CollectionUtils.isEmpty(invalidSessionList)) {
+                List<String> tokenList = new ArrayList<>();
+                invalidSessionList.stream().forEach(map -> {
+                    tokenList.add(map.get("TOKEN").toString());
+                });
+                WebUtil.switchCollectionForOracleIn(tokenList).stream().forEach(tokens -> {
+                    try {
+                        platformClientUtil.getBOFactoryService().executeUpdateSql("delete from VCI_SESSIONINFO where TOKEN in (" + WebUtil.toInSql(tokens.toArray(new String[0])) + ")");
+                    } catch (VCIError e) {
+                        if (logger.isErrorEnabled()) {
+                            logger.error("鍒犻櫎浼氳瘽淇℃伅", e);
+                        }
+                    }
+                });
+            }
+            if (logger.isDebugEnabled()) {
+                logger.debug("寮�濮嬫墽琛屾壂鎻忚秴鏃剁殑浼氳瘽淇℃伅瀹屾垚锛屽垹闄や簡{}鏉℃暟鎹�", invalidSessionList == null ? 0 : invalidSessionList.size());
+            }
+        }
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmUserQueryServiceImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmUserQueryServiceImpl.java
new file mode 100644
index 0000000..6abf11a
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmUserQueryServiceImpl.java
@@ -0,0 +1,810 @@
+package com.vci.frameworkcore.compatibility.impl;
+
+import com.vci.corba.common.VCIError;
+import com.vci.frameworkcore.compatibility.SmUserQueryServiceI;
+import com.vci.frameworkcore.pagemodel.SmPasswordStrategyVO;
+import com.vci.frameworkcore.pagemodel.SmUserVO;
+import com.vci.rmip.allcommon.ThreeDES;
+import com.vci.starter.web.enumpck.BooleanEnum;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.starter.web.pagemodel.Tree;
+import com.vci.starter.web.pagemodel.TreeQueryObject;
+import com.vci.starter.web.util.BeanUtil;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.starter.web.wrapper.VciQueryWrapperForDO;
+import com.vci.web.model.SmPasswordStrategyDO;
+import com.vci.web.model.SmUserDO;
+import com.vci.web.service.WebBoServiceI;
+import com.vci.web.util.PlatformClientUtil;
+import com.vci.web.util.WebUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.cache.annotation.CachePut;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import plm.bs.bom.clientobject.ClientBusinessObject;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static com.vci.frameworkcore.constant.FrameWorkBusLangCodeConstant.DATA_OID_NOT_EXIST;
+import static com.vci.web.constant.CacheNameConstant.VCI_OBJECT_SERVICE;
+import static com.vci.web.constant.CacheNameConstant.VCI_USER;
+
+/**
+ * 鐢ㄦ埛鐨勬煡璇㈢浉鍏崇殑鏈嶅姟锛屽彲浠ュ吋瀹硅�佸钩鍙板拰鑰佺殑pdm
+ * 鍏朵腑鍖呭惈鐧诲綍鐩稿叧鐨勬帴鍙e拰鍙傜収锛屾牴鎹富閿煡璇㈢瓑鎺ュ彛
+ * 鎵�鏈夌殑鏁版嵁鍏ㄩ儴杞崲涓烘柊骞冲彴鐨勫璞�
+ * @author xiejun
+ * @date 2020/3/10
+ */
+@Service
+public class SmUserQueryServiceImpl implements SmUserQueryServiceI {
+
+	/**
+	 * 骞冲彴璋冪敤瀹㈡埛绔�
+	 */
+	@Autowired
+	private PlatformClientUtil platformClientUtil;
+
+	/**
+	 * 涓氬姟鏁版嵁鏈嶅姟
+	 */
+	@Autowired
+	private WebBoServiceI boService;
+
+	/**
+	 * 浣跨敤瑙掕壊鐨勫睘鎬ф煡璇㈢敤鎴锋椂
+	 */
+	private final static String QUERY_BY_ROLE_KEY_PREFIX = "pkrole.";
+
+	/**
+	 * 瑙掕壊鐨勮〃鏍兼樀绉�
+	 */
+	public static final String NICK_BY_ROLE = "pkrole";
+
+	/**
+	 * 浣跨敤閮ㄩ棬鏌ヨ鐨勬椂鍊欑殑鏌ヨ瀛楁
+	 */
+	public static final String QUERY_FIELD_DEPARTMENT = "up.pldeptuid";
+
+	/**
+	 * 浣跨敤鑱屽姟鏌ヨ鐨勬椂鍊欑殑鏌ヨ瀛楁
+	 */
+	public static final String QUERY_FIELD_DUTY = "pkDuty";
+
+	/**
+	 * 浣跨敤瑙掕壊鏌ヨ鐨勬椂鍊欑殑鏌ヨ瀛楁
+	 */
+	public static final String QUERY_FIELD_ROLE = "roleUser.plroleuid";
+
+	/**
+	 * 鑷紩鐢�
+	 */
+	@Autowired(required = false)
+	@Lazy
+	private SmUserQueryServiceI self;
+	
+	/**
+     *  鏍规嵁鐢ㄦ埛鍚嶈幏鍙栫敤鎴风殑瀵硅薄锛屼笉鍖哄垎澶у皬鍐�
+     * @param userId 鐢ㄦ埛鍚�
+     * @return 鐢ㄦ埛鐨勬樉绀哄璞★紝濡傛灉鐢ㄦ埛涓嶅瓨鍦ㄥ垯杩斿洖null锛屼笉浼氭姏鍑哄紓甯�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮暟鎹簱瀛樺湪闂鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+	@Override
+	@Cacheable(value = VCI_USER,key = "#p0",unless = "#result == null")
+	public SmUserVO getUserByUserId(String userId) throws VciBaseException {
+		WebUtil.alertNotNull(userId,"鐢ㄦ埛鍚�");
+		return getUserByField("plusername",userId);
+	}
+
+	/**
+	 * 浣跨敤瀛楁鑾峰彇鐢ㄦ埛鐨勪俊鎭�
+	 * @param queryField 瀛楁
+	 * @param queryValue 鏌ヨ鍊�
+	 * @return 鐢ㄦ埛鐨勪俊鎭�
+	 * @throws VciBaseException 鏌ヨ鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+	 */
+	private SmUserVO getUserByField(String queryField,String queryValue) throws VciBaseException{
+		VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(null,SmUserDO.class,null,true);
+		queryWrapper.eq(queryWrapper.getTableNick() + "." +queryField,queryValue);
+		queryWrapper.setDistinct(true);
+		queryWrapper.wrapperSql();
+		addRoleQuerySql(queryWrapper);
+		String sql =  queryWrapper.getSelectFieldSql();
+		String fromSql = " from pluser " + queryWrapper.getTableNick()
+				+ " left join pluserdept up on " + queryWrapper.getTableNick() + ".pluid = up.pluseruid left join pldept pkDepartment on  up.pldeptuid = pkDepartment.pluid " +
+				" left join PLUSERPASSWORDSTRATEGY pkUserPassword on  " +queryWrapper.getTableNick() + ".pluid = pkUserPassword.pluseruid " +
+				queryWrapper.getLinkTableSql() + (StringUtils.isNotBlank(queryWrapper.getWhereSql())?(" where " + queryWrapper.getWhereSql()):"");
+		List<ClientBusinessObject> dataList = boService.queryBySql(sql + fromSql, null);
+		if(!CollectionUtils.isEmpty(dataList)){
+			ClientBusinessObject cbo = dataList.get(0);
+			return cbo2VO(cbo);
+		}
+		return null;
+	}
+
+	/**
+	 * 浣跨敤灞炴�ч泦鍚堟煡璇㈢敤鎴�
+	 * @param queryField 鏌ヨ鐨勫瓧娈�
+	 * @param queryValues 鏌ヨ鐨勫�奸泦鍚�
+	 * @return 鐢ㄦ埛鐨勬樉绀哄璞�
+	 * @throws VciBaseException 鏌ヨ鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+	 */
+	private List<SmUserVO> listUserByField(String queryField,Collection<String> queryValues) throws VciBaseException{
+		List<SmUserVO> userVOList = new ArrayList<>();
+		WebUtil.switchCollectionForOracleIn(queryValues).forEach(values->{
+			VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(null,SmUserDO.class,null,true);
+			queryWrapper.in(queryWrapper.getTableNick() + "." + queryField,WebUtil.toInSql(values.toArray(new String[0])));
+			queryWrapper.setDistinct(true);
+			queryWrapper.wrapperSql();
+			String sql = queryWrapper.getSelectFieldSql();
+			String fromSql = " from pluser " + queryWrapper.getTableNick()
+					+ " left join pluserdept up on " + queryWrapper.getTableNick() + ".pluid = up.pluseruid left join pldept pkDepartment on  up.pldeptuid = pkDepartment.pluid " +
+					" left join PLUSERPASSWORDSTRATEGY pkUserPassword on  " +queryWrapper.getTableNick() + ".pluid = pkUserPassword.pluseruid " +
+					queryWrapper.getLinkTableSql() + (StringUtils.isNotBlank(queryWrapper.getWhereSql())?(" where " + queryWrapper.getWhereSql()):"");
+			List<ClientBusinessObject> dataList = boService.queryBySql(sql + fromSql, null);
+			if(!CollectionUtils.isEmpty(dataList)){
+				dataList.stream().forEach(cbo->{
+					userVOList.add(cbo2VO(cbo));
+				});
+			}
+		});
+		return userVOList;
+	}
+
+	/**
+     * 鎵归噺鑾峰彇鐢ㄦ埛鐨勪俊鎭紙鏍规嵁鐢ㄦ埛鍚嶏級
+     * @param userIdCollections 鐢ㄦ埛鍚嶇殑闆嗗悎,鍙互瓒呰繃1000涓�
+     * @return 鐢ㄦ埛鐨勬樉绀哄璞★紝濡傛灉鐢ㄦ埛涓嶅瓨鍦ㄥ垯杩斿洖绌虹殑鍒楄〃锛屼笉浼氭姏鍑哄紓甯�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮暟鎹簱瀛樺湪闂鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+	@Override
+	public List<SmUserVO> listUserByUserIds(Collection<String> userIdCollections)throws VciBaseException {
+		WebUtil.alertNotNull(userIdCollections,"鐢ㄦ埛鍚嶉泦鍚�");
+		return listUserByField("plusername",userIdCollections);
+	}
+	/**
+     * 鏍规嵁鐢ㄦ埛涓婚敭鑾峰彇鐢ㄦ埛鐨勪俊鎭�
+     * @param userOid 鐢ㄦ埛涓婚敭
+     * @return 鐢ㄦ埛鐨勬樉绀哄璞★紝濡傛灉鐢ㄦ埛涓嶅瓨鍦ㄥ垯杩斿洖null锛屼笉浼氭姏鍑哄紓甯�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮暟鎹簱瀛樺湪闂鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+	@Override
+	public SmUserVO getUserByUserOid(String userOid) throws VciBaseException {
+		WebUtil.alertNotNull(userOid,"鐢ㄦ埛涓婚敭");
+		return getUserByField("pluid",userOid);
+	}
+	 /**
+     * 鎵归噺鑾峰彇鐢ㄦ埛鐨勪俊鎭� 锛堟牴鎹敤鎴蜂富閿級
+     * @param userOidCollections 鐢ㄦ埛涓婚敭鐨勯泦鍚堬紝鍙互瓒呰繃1000涓�
+     * @return 鐢ㄦ埛鐨勬樉绀哄璞★紝濡傛灉鐢ㄦ埛涓嶅瓨鍦ㄥ垯杩斿洖绌虹殑鍒楄〃锛屼笉浼氭姏鍑哄紓甯�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮暟鎹簱瀛樺湪闂鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+	@Override
+	public List<SmUserVO> listUserByUserOids(
+			Collection<String> userOidCollections) throws VciBaseException {
+		WebUtil.alertNotNull(userOidCollections,"鐢ㄦ埛涓婚敭闆嗗悎");
+		return listUserByField("pluid",userOidCollections);
+	}
+
+	/**
+	 * 鐢ㄦ埛鐨勬暟鎹璞¤浆鎹负鏄剧ず瀵硅薄
+	 * @param userDOS 鐢ㄦ埛
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	private List<SmUserVO> smUserDO2VOs(List<SmUserDO> userDOS){
+		List<SmUserVO> userVOList = new ArrayList<>();
+		Optional.ofNullable(userDOS).orElseGet(()->new ArrayList<>()).stream().forEach(userDO->{
+			SmUserVO userVO = new SmUserVO();
+			BeanUtil.convert(userDO,userVO);
+			userVOList.add(userVO);
+		});
+		return userVOList;
+	}
+
+	/**
+	 * 浣跨敤灞炴�ф潵鐨勬煡璇㈢敤鎴风殑淇℃伅
+	 * @param queryField 鏌ヨ鐨勫睘鎬�
+	 * @param queryValue 鏌ヨ鐨勫��
+	 * @param queryMap 鏌ヨ鐨勬潯浠讹紝濡傛灉鏄鑹茬殑灞炴�э紝闇�瑕佷娇鐢╬krole.xxx
+	 * @param notIn 鏄惁涓轰笉鍖呭惈
+	 * @return 鐢ㄦ埛鐨勫璞�
+	 */
+	private List<SmUserVO> listUserByQueryField(String queryField,String queryValue,Map<String,String> queryMap,boolean notIn){
+		if(StringUtils.isBlank(queryValue)){
+			return new ArrayList<>();
+		}
+		VciQueryWrapperForDO queryWrapper = getQueryWrapper(queryField, queryValue, queryMap, null, notIn);
+		List<SmUserVO> userVOList = new ArrayList<>();
+		queryWrapper.wrapperSql();
+		String sql = queryWrapper.getSelectFieldSql();
+		String roleSql = " left join pluserrole roleuser on " + queryWrapper.getTableNick() + ".pluid = roleuser.pluseruid ";
+		String fromSql = " from pluser " + queryWrapper.getTableNick()
+				+ " left join pluserdept up on " + queryWrapper.getTableNick() + ".pluid = up.pluseruid left join pldept pkDepartment on  up.pldeptuid = pkDepartment.pluid " +
+				" left join PLUSERPASSWORDSTRATEGY pkUserPassword on  " +queryWrapper.getTableNick() + ".pluid = pkUserPassword.pluseruid " + (QUERY_FIELD_ROLE.equalsIgnoreCase(queryField)?roleSql:"") +
+				queryWrapper.getLinkTableSql() + (StringUtils.isNotBlank(queryWrapper.getWhereSql())?(" where " + queryWrapper.getWhereSql()):"");
+		List<ClientBusinessObject> dataList = boService.queryBySql(sql + fromSql, null);
+		if(!CollectionUtils.isEmpty(dataList)){
+			dataList.stream().forEach(cbo->{
+				userVOList.add(cbo2VO(cbo));
+			});
+		}
+		return userVOList;
+	}
+
+	/**
+	 * 涓氬姟鏁版嵁杞崲涓烘樉绀哄璞�
+	 * @param cbo 涓氬姟鏁版嵁
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	private SmUserVO cbo2VO(ClientBusinessObject cbo){
+		SmUserDO userDO = new SmUserDO();
+		SmUserVO userVO = new SmUserVO();
+		WebUtil.copyValueToObjectFromCbos(cbo,userDO);
+		if("0".equals(userDO.getLockFlag())){
+			userDO.setLockFlag(BooleanEnum.FASLE.getValue());
+		}else{
+			userDO.setLockFlag(BooleanEnum.TRUE.getValue());
+		}
+		BeanUtil.convert(userDO,userVO);
+		return userVO;
+	}
+
+	/**
+	 * 浣跨敤鏌愪釜灞炴�ф潵鏌ヨ鐢ㄦ埛鐨勪俊鎭�
+	 * @param queryField 鏌ヨ鐨勫睘鎬у悕绉�
+	 * @param queryValue 鏌ヨ鐨勫��
+	 * @param queryMap 鍏朵粬鏌ヨ鏉′欢锛屽鏋滄槸瑙掕壊鐨勫睘鎬э紝闇�瑕佷娇鐢╬krole.xxx
+	 * @param pageHelper 鍒嗛〉瀵硅薄
+	 * @param notIn 鏄惁涓轰笉鍖呭惈
+	 * @return 鐢ㄦ埛鐨勬樉绀哄璞$殑鍒楄〃
+	 */
+	private DataGrid<SmUserVO> gridUserByQueryField(String queryField,String queryValue, Map<String, String> queryMap, PageHelper pageHelper,boolean notIn){
+		if(StringUtils.isBlank(queryValue)){
+			return new DataGrid<>();
+		}
+		PageHelper newPageHelper = new PageHelper(-1);
+		newPageHelper.setSort(pageHelper.getSort());
+		newPageHelper.setOrder(pageHelper.getOrder());
+		VciQueryWrapperForDO queryWrapper = getQueryWrapper(queryField, queryValue, queryMap, newPageHelper, notIn);
+
+		List<SmUserVO> userVOList = new ArrayList<>();
+		queryWrapper.wrapperSql();
+		String sql = queryWrapper.getSelectFieldSql();
+		String fromSql = " from pluser " + queryWrapper.getTableNick()
+				+ " left join pluserdept up on " + queryWrapper.getTableNick() + ".pluid = up.pluseruid left join pldept pkDepartment on  up.pldeptuid = pkDepartment.pluid " +
+				" left join PLUSERPASSWORDSTRATEGY pkUserPassword on  " +queryWrapper.getTableNick() + ".pluid = pkUserPassword.pluseruid " +
+				" left join PLUSERROLE roleuser on roleuser.PLUSERUID = "+queryWrapper.getTableNick() +".PLUID"+
+				queryWrapper.getLinkTableSql() + (StringUtils.isNotBlank(queryWrapper.getWhereSql())?(" where " + queryWrapper.getWhereSql()):"");
+		boolean isPage = pageHelper != null && pageHelper.getLimit() > 0;
+		String pageSubfix = " ) A where rownum < " + (pageHelper.getLimit() * pageHelper.getPage() + 1) + ") where RN >= " + (pageHelper.getLimit() * (pageHelper.getPage() - 1) + 1);
+		List<String> pageSelectList = new ArrayList<>();
+		String temp = queryWrapper.getSelectFieldSql();
+		if(StringUtils.isNotBlank(temp)){
+			String[] split = temp.split(",");
+			if(split!=null&&split.length>0){
+				for (int i = 0; i < split.length; i++) {
+					String s = split[i];
+					if(s.contains(" as ")){
+						pageSelectList.add(s.split(" as ")[1]);
+					}
+				}
+			}
+		}
+		List<ClientBusinessObject> dataList = boService.queryBySql((isPage?("select " + pageSelectList.stream().collect(Collectors.joining(","))+ " from (select A.*,rownum RN from ( "):"") + sql + fromSql + (isPage?pageSubfix:""), null);
+		if(!CollectionUtils.isEmpty(dataList)){
+			dataList.stream().forEach(cbo->{
+				userVOList.add(cbo2VO(cbo));
+			});
+		}
+		DataGrid<SmUserVO> dataGrid = new DataGrid<>();
+		if(!CollectionUtils.isEmpty(dataList)){
+			dataGrid.setData(userVOList);
+			queryWrapper.clearPage();
+			dataGrid.setTotal(boService.queryCountBySql("select count(*) as count " + fromSql,null));
+		}
+		return dataGrid;
+	}
+	/**
+     * 鑾峰彇鐢ㄦ埛鐨勫垪琛紝榛樿浼氫互鐢ㄦ埛鍚嶅崌搴忔帓鍒楋紝鐢ㄦ埛鐨勭紪杈戦〉闈㈠垪琛ㄤ笉瑕佷娇鐢ㄨ繖涓帴鍙�
+     * @param queryMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉鍜屾帓搴忕殑淇℃伅锛屽湪鍏煎鑰佸钩鍙扮殑鏃跺�欎細鑷姩鍏煎锛屽鏋滃睘鎬т笉瀛樺湪浼氳嚜鍔ㄥ拷鐣�
+     * @return 鐢ㄦ埛鐨勬樉绀哄璞″垪琛�
+     * @throws VciBaseException 鍙傛暟涓虹┖鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+	@Override
+	public DataGrid<SmUserVO> gridUsers(Map<String, String> queryMap,
+										PageHelper pageHelper) throws VciBaseException {
+		return gridUserByQueryField(null,null,queryMap,pageHelper,false);
+	}
+
+	/**
+	 * 娣诲姞瑙掕壊鐨勬煡璇㈢殑sql, 鑷姩鍒ゆ柇鏄惁闇�瑕佹煡璇㈣鑹�
+	 * @param queryMap 鏌ヨ鏉′欢
+	 * @param queryWrapper 鏌ヨ灏佽鍣�
+	 */
+	private void addRoleQuerySql(Map<String,String> queryMap,VciQueryWrapperForDO queryWrapper){
+		if((queryMap !=null&& (queryMap.keySet().stream().anyMatch(s->s.toLowerCase().startsWith(QUERY_BY_ROLE_KEY_PREFIX)) || queryMap.containsKey(QUERY_FIELD_ROLE)))
+				|| (queryWrapper.getConditionMap() !=null && queryWrapper.getConditionMap().containsKey(QUERY_FIELD_ROLE))){
+			addRoleQuerySql(queryWrapper);
+		}
+	}
+
+	/**
+	 * 娣诲姞瑙掕壊鐨勬煡璇㈢殑sql
+	 * @param queryWrapper 鏌ヨ灏佽鍣�
+	 */
+	private void addRoleQuerySql(VciQueryWrapperForDO queryWrapper){
+		String nick = queryWrapper.getTableNick();
+		queryWrapper.addLinkTableSql("  left join pluserrole roleUser on " + nick + ".pluid = roleUser.pluseruid left join plrole " + NICK_BY_ROLE + " on roleUser.plroleuid = " + NICK_BY_ROLE + ".pluid ");
+	}
+
+	/**
+     * 鏍规嵁鐢ㄦ埛鍚嶈幏鍙栫敤鎴风殑濮撳悕
+     * @param userId 鐢ㄦ埛鍚�
+     * @return 鐢ㄦ埛濮撳悕锛屽鏋滀笉瀛樺湪浼氳繑鍥濶ull
+     */
+	@Override
+	public String getUserNameByUserId(String userId) {
+		SmUserVO userVO = self.getUserByUserId(userId);
+		return userVO == null?"":userVO.getName();
+	}
+	 /**
+     * 鏍规嵁鐢ㄦ埛涓婚敭鑾峰彇鐢ㄦ埛鐨勫鍚�
+     * @param userOid 鐢ㄦ埛涓婚敭
+     * @return 鐢ㄦ埛濮撳悕锛屽鏋滀笉瀛樺湪浼氳繑鍥瀗ull
+     */
+	@Override
+	public String getUserNameByUserOid(String userOid) {
+		SmUserVO userVO = self.getUserByUserOid(userOid);
+		return userVO.getName();
+	}
+
+
+
+	 /**
+     * 鏌ヨ鏌愪釜閮ㄩ棬涓嬬殑鐢ㄦ埛瀵硅薄
+     * @param deptOid 閮ㄩ棬鐨勪富閿�
+     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滄槸閮ㄩ棬鐨勬煇涓睘鎬т綔涓烘煡璇㈡潯浠讹紝鍒欏彲浠ヤ娇鐢╬kDepartment.xxx杩欐牱鐨勬柟寮�
+     * @return 鐢ㄦ埛鐨勬樉绀哄璞″垪琛�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+	@Override
+	public List<SmUserVO> listUserByDeptOid(String deptOid,
+			Map<String, String> queryMap) throws VciBaseException {
+		if(StringUtils.isBlank(deptOid)){
+			return new ArrayList<>();
+		}
+		return listUserByQueryField(QUERY_FIELD_DEPARTMENT,deptOid,queryMap,false);
+	}
+
+	/**
+	 * 鑾峰彇
+	 * @param queryField 鏌ヨ灞炴��
+	 * @param queryValue 鏌ヨ鐨勫��
+	 * @param queryMap  鏌ヨ鏉′欢锛屽鏋滄槸瑙掕壊鐨勫睘鎬э紝闇�瑕佷娇鐢╬krole.xxx
+	 * @param pageHelper 鍒嗛〉瀵硅薄
+	 * @param notIn 鏄惁涓轰笉鍖呭惈
+	 * @return 鏌ヨ灏佽鍣�
+	 */
+	private VciQueryWrapperForDO getQueryWrapper(String queryField,String queryValue,Map<String,String> queryMap,PageHelper pageHelper,boolean notIn){
+		if(pageHelper == null){
+			pageHelper = new PageHelper(-1);
+		}
+		pageHelper.addDefaultAsc("plusername");
+		VciQueryWrapperForDO queryWrapperForDO = new VciQueryWrapperForDO(queryMap,SmUserDO.class,pageHelper);
+		if(StringUtils.isNotBlank(queryField)) {
+			if (queryValue.contains(",")) {
+				if (notIn) {
+					queryWrapperForDO.notIn(queryField, VciBaseUtil.toInSql(VciBaseUtil.str2List(queryValue).toArray(new String[0])));
+				} else {
+					queryWrapperForDO.in(queryField, VciBaseUtil.toInSql(VciBaseUtil.str2List(queryValue).toArray(new String[0])));
+				}
+			} else {
+				if (notIn) {
+					queryWrapperForDO.neq(queryField, queryValue);
+				} else {
+					queryWrapperForDO.eq(queryField, queryValue);
+				}
+			}
+		}
+		addRoleQuerySql(queryMap,queryWrapperForDO);
+		queryWrapperForDO.eq("plstatus", "0");
+		queryWrapperForDO.eq("plusertype", "2");
+		queryWrapperForDO.setDistinct(true);
+		return queryWrapperForDO;
+	}
+	/**
+     * 鏌ヨ鏌愪釜閮ㄩ棬涓嬬殑鐢ㄦ埛瀵硅薄鍒楄〃
+     * @param deptOid 閮ㄩ棬鐨勪富閿�
+     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滄槸閮ㄩ棬鐨勬煇涓睘鎬т綔涓烘煡璇㈡潯浠讹紝鍒欏彲浠ヤ娇鐢╬kDepartment.xxx杩欐牱鐨勬柟寮�
+     * @param pageHelper 鍒嗛〉鍜屾帓搴忎俊鎭紝榛樿浣跨敤鐢ㄦ埛鍚嶅崌搴忔帓鍒�
+     * @return 鐢ㄦ埛鐨勬樉绀哄璞″垪琛紝榛樿浣跨敤鐢ㄦ埛鍚嶅崌搴忔帓鍒�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+	@Override
+	public DataGrid<SmUserVO> gridUserByDeptOid(String deptOid,
+			Map<String, String> queryMap, PageHelper pageHelper)
+			throws VciBaseException {
+		return gridUserByQueryField(QUERY_FIELD_DEPARTMENT,deptOid,queryMap,pageHelper,false);
+	}
+	 /**
+     * 鎵归噺鏍规嵁閮ㄩ棬鐨勪富閿幏鍙栫敤鎴�
+     * @param deptOidCollection 閮ㄩ棬鐨勪富閿泦鍚�
+     * @return 閮ㄩ棬涓婚敭鍜屽搴旂殑鐢ㄦ埛鏄剧ず瀵硅薄鍒楄〃鐨勬槧灏勶紝key閮ㄩ棬鐨勪富閿紝value鏄繖涓儴闂ㄤ笅鐨勭敤鎴�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+	@Override
+	public Map<String, List<SmUserVO>> batchListUserByDeptOids(
+			Collection<String> deptOidCollection) throws VciBaseException {
+		if(CollectionUtils.isEmpty(deptOidCollection)){
+			return new HashMap<>();
+		}
+		List<SmUserVO> userVOList = listUserByQueryField(QUERY_FIELD_DEPARTMENT,deptOidCollection.stream().collect(Collectors.joining(",")),null,false );
+		if(!CollectionUtils.isEmpty(userVOList)){
+			return userVOList.stream().filter(s->StringUtils.isNotBlank(s.getPkDepartment())).collect(Collectors.groupingBy(SmUserVO::getPkDepartment));
+		}
+		return new HashMap<>();
+	}
+	/**
+     * 鏌ヨ涓嶅湪鏌愪釜閮ㄩ棬涓嬬殑鐢ㄦ埛瀵硅薄鍒楄〃
+     * @param deptOid 閮ㄩ棬鐨勪富閿�
+     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滄槸閮ㄩ棬鐨勬煇涓睘鎬т綔涓烘煡璇㈡潯浠讹紝鍒欏彲浠ヤ娇鐢╬kDepartment.xxx杩欐牱鐨勬柟寮�
+     * @return 鐢ㄦ埛鐨勬樉绀哄璞″垪琛紝榛樿浣跨敤鐢ㄦ埛鍚嶅崌搴忔帓鍒�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+	@Override
+	public List<SmUserVO> listUserUnInDeptOid(String deptOid,
+			Map<String, String> queryMap) throws VciBaseException {
+		if(StringUtils.isBlank(deptOid)){
+			return new ArrayList<>();
+		}
+		return listUserByQueryField(QUERY_FIELD_DEPARTMENT,deptOid,queryMap,true);
+	}
+	/**
+     * 鏌ヨ涓嶅湪鏌愪釜閮ㄩ棬涓嬬殑鐢ㄦ埛瀵硅薄鍒楄〃
+     * @param deptOid 閮ㄩ棬鐨勪富閿�
+     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滄槸閮ㄩ棬鐨勬煇涓睘鎬т綔涓烘煡璇㈡潯浠讹紝鍒欏彲浠ヤ娇鐢╬kDepartment.xxx杩欐牱鐨勬柟寮�
+     * @param pageHelper 鍒嗛〉鍜屾帓搴忎俊鎭紝榛樿浣跨敤鐢ㄦ埛鍚嶅崌搴忔帓鍒�
+     * @return 鐢ㄦ埛鐨勬樉绀哄璞″垪琛紝榛樿浣跨敤鐢ㄦ埛鍚嶅崌搴忔帓鍒�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+	@Override
+	public DataGrid<SmUserVO> gridUserUnInDeptOid(String deptOid,
+			Map<String, String> queryMap, PageHelper pageHelper)
+			throws VciBaseException {
+		return gridUserByQueryField(QUERY_FIELD_DEPARTMENT,deptOid,queryMap,pageHelper,true);
+	}
+	 /**
+     * 鏌ヨ鏌愪釜瑙掕壊涓嬬殑鐢ㄦ埛瀵硅薄
+     * @param roleOid 瑙掕壊鐨勪富閿�
+     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滄槸瑙掕壊鐨勬煇涓睘鎬т綔涓烘煡璇㈡潯浠讹紝鍒欏彲浠ヤ娇鐢╬kRole.xxx杩欐牱鐨勬柟寮�
+     * @return 鐢ㄦ埛鐨勬樉绀哄璞″垪琛�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+	@Override
+	public List<SmUserVO> listUserByRoleOid(String roleOid,
+			Map<String, String> queryMap) throws VciBaseException {
+		if(StringUtils.isBlank(roleOid)){
+			return new ArrayList<>();
+		}
+		return listUserByQueryField(QUERY_FIELD_ROLE,roleOid,queryMap,false);
+
+	}
+	/**
+     * 鏌ヨ鏌愪釜瑙掕壊涓嬬殑鐢ㄦ埛瀵硅薄鍒楄〃
+     * @param roleOid 瑙掕壊鐨勪富閿�
+     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滄槸瑙掕壊鐨勬煇涓睘鎬т綔涓烘煡璇㈡潯浠讹紝鍒欏彲浠ヤ娇鐢╬kRole.xxx杩欐牱鐨勬柟寮�
+     * @param pageHelper 鍒嗛〉鍜屾帓搴忎俊鎭紝榛樿浣跨敤鐢ㄦ埛鍚嶅崌搴忔帓鍒�
+     * @return 鐢ㄦ埛鐨勬樉绀哄璞″垪琛紝榛樿浣跨敤鐢ㄦ埛鍚嶅崌搴忔帓鍒�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+	@Override
+	public DataGrid<SmUserVO> gridUserByRoleOid(String roleOid,
+			Map<String, String> queryMap, PageHelper pageHelper)
+			throws VciBaseException {
+		return gridUserByQueryField(QUERY_FIELD_ROLE,roleOid,queryMap,pageHelper,false);
+	}
+	/**
+     * 鏌ヨ涓嶅湪鏌愪釜瑙掕壊涓嬬殑鐢ㄦ埛瀵硅薄鍒楄〃
+     * @param roleOid 瑙掕壊鐨勪富閿�
+     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滄槸瑙掕壊鐨勬煇涓睘鎬т綔涓烘煡璇㈡潯浠讹紝鍒欏彲浠ヤ娇鐢╬kRole.xxx杩欐牱鐨勬柟寮�
+     * @return 鐢ㄦ埛鐨勬樉绀哄璞″垪琛紝榛樿浣跨敤鐢ㄦ埛鍚嶅崌搴忔帓鍒�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+	@Override
+	public List<SmUserVO> listUserUnInRoleOid(String roleOid,
+			Map<String, String> queryMap) throws VciBaseException {
+		if(StringUtils.isBlank(roleOid)){
+			return new ArrayList<>();
+		}
+		return listUserByQueryField(QUERY_FIELD_ROLE,roleOid,queryMap,true);
+	}
+	 /**
+     * 鏌ヨ涓嶅湪鏌愪釜瑙掕壊涓嬬殑鐢ㄦ埛瀵硅薄鍒楄〃
+     * @param roleOid 瑙掕壊鐨勪富閿�
+     * @param queryMap 鏌ヨ鏉′欢锛屽鏋滄槸瑙掕壊鐨勬煇涓睘鎬т綔涓烘煡璇㈡潯浠讹紝鍒欏彲浠ヤ娇鐢╬kRole.xxx杩欐牱鐨勬柟寮�
+     * @param pageHelper 鍒嗛〉鍜屾帓搴忎俊鎭紝榛樿浣跨敤鐢ㄦ埛鍚嶅崌搴忔帓鍒�
+     * @return 鐢ㄦ埛鐨勬樉绀哄璞″垪琛紝榛樿浣跨敤鐢ㄦ埛鍚嶅崌搴忔帓鍒�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+	@Override
+	public DataGrid<SmUserVO> gridUserUnInRoleOid(String roleOid,
+			Map<String, String> queryMap, PageHelper pageHelper)
+			throws VciBaseException {
+		return gridUserByQueryField(QUERY_FIELD_ROLE,roleOid,queryMap,pageHelper,true);
+	}
+	/**
+     * 鎵归噺鏍规嵁瑙掕壊鐨勪富閿幏鍙栫敤鎴�
+     * @param roleOidCollection 瑙掕壊鐨勪富閿泦鍚�
+     * @return 瑙掕壊涓婚敭鍜屽搴旂殑鐢ㄦ埛鏄剧ず瀵硅薄鍒楄〃鐨勬槧灏勶紝key瑙掕壊鐨勪富閿紝value鏄繖涓鑹蹭笅鐨勭敤鎴�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+	@Override
+	public Map<String, List<SmUserVO>> batchListUserByRoleOids(
+			Collection<String> roleOidCollection) throws VciBaseException {
+		if(CollectionUtils.isEmpty(roleOidCollection)){
+			return new HashMap<>();
+		}
+		List<SmUserVO> userVOList = listUserByQueryField(QUERY_FIELD_ROLE,roleOidCollection.stream().collect(Collectors.joining(",")),null,false );
+		//闇�瑕佹煡璇㈡瘡涓鑹插拰鐢ㄦ埛鐨勫叧鑱斾俊鎭�
+		Map<String,List<String>> roleHasUserOids = new HashMap<>();
+		VciBaseUtil.switchCollectionForOracleIn(roleOidCollection).stream().forEach(roleOids->{
+			String sql = " select plroleuid,pluseruid from pluserrole where plroleuid in (" + VciBaseUtil.toInSql(roleOids.toArray(new String[0])) + ")";
+			List<Map> dataMap = boService.queryBySqlForMap(sql, null);
+			if(!CollectionUtils.isEmpty(dataMap)){
+				dataMap.stream().forEach(data->{
+					String roleOid = (String)data.get("plroleuid");
+					List<String> userOids = roleHasUserOids.getOrDefault(roleOid,new ArrayList<>());
+					userOids.add((String)data.get("pluseruid"));
+					roleHasUserOids.put(roleOid,userOids);
+				});
+			}
+		});
+		if(!CollectionUtils.isEmpty(userVOList)){
+			//闇�瑕佹煡璇㈡瘡涓鑹插拰鐢ㄦ埛鐨勫叧鑱斾俊鎭�
+			Map<String, SmUserVO> userVOMap = userVOList.stream().collect(Collectors.toMap(s -> s.getOid(), t -> t));
+			Map<String,List<SmUserVO>> roleHasUserVOMap = new HashMap<>();
+			roleHasUserOids.forEach((roleOid,userOids)->{
+				List<SmUserVO> userVOS = new ArrayList<>();
+				userOids.stream().forEach(userOid->{
+					if(userVOMap.containsKey(userOid)){
+						userVOS.add(userVOMap.get(userOid));
+					}
+				});
+				roleHasUserVOMap.put(roleOid,userVOS);
+			});
+			return roleHasUserVOMap;
+		}
+		return new HashMap<>();
+	}
+
+	/**
+     * 鍙傜収鐢熸晥鐨勭敤鎴�
+     * @param queryMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉瀵硅薄
+     * @return 鐢ㄦ埛鐨勬樉绀哄璞★紝榛樿浣跨敤鐢ㄦ埛鍚嶅崌搴忔帓鍒�
+     * @throws VciBaseException 鏌ヨ鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+	@Override
+	public DataGrid<SmUserVO> refGridUsers(Map<String, String> queryMap,
+			PageHelper pageHelper) throws VciBaseException {
+		return gridUserByQueryField(null,null,queryMap,pageHelper,false);
+	}
+	/**
+     * 鍙傜収鐢ㄦ埛鐨勬爲褰㈡樉绀�
+     * @param treeQueryObject 鏍戝瀷鎺ュ彛鏌ヨ瀵硅薄
+     * @return 鐢ㄦ埛鐨勬爲褰俊鎭紝閲岄潰浼氬寘鍚敤鎴峰璞¢噷鐨勬墍鏈夊睘鎬�
+     * @throws VciBaseException 鏌ヨ鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+	@Override
+	public List<Tree> refTreeUsers(TreeQueryObject treeQueryObject)
+			throws VciBaseException {
+		VciQueryWrapperForDO queryWrapper = getQueryWrapper(null, null, treeQueryObject.getConditionMap(), null, false);
+		queryWrapper.wrapperSql();
+		String sql =  queryWrapper.getSelectFieldSql();
+		String fromSql = " from pluser " + queryWrapper.getTableNick()
+				+ " left join pluserdept up on " + queryWrapper.getTableNick() + ".pluid = up.pluseruid left join pldept pkDepartment on  up.pldeptuid = pkDepartment.pluid " +
+				" left join PLUSERPASSWORDSTRATEGY pkUserPassword on  " +queryWrapper.getTableNick() + ".pluid = pkUserPassword.pluseruid " +
+				queryWrapper.getLinkTableSql() + (StringUtils.isNotBlank(queryWrapper.getWhereSql())?(" where " + queryWrapper.getWhereSql()):"");
+		List<ClientBusinessObject> dataList = boService.queryBySql(sql + fromSql, null);
+		List<Tree> treeList = new ArrayList<>();
+		if(!CollectionUtils.isEmpty(dataList)){
+			dataList.stream().forEach(cbo->{
+				Tree tree = new Tree();
+				tree.setOid(cbo.getOid());
+				tree.setText(cbo.getId() + " " + cbo.getName());
+				Map<String,String> attributeMap = new HashMap<>();
+				WebUtil.copyValueToCboFromMap(cbo,attributeMap);
+				tree.setAttributes(attributeMap);
+				tree.setLeaf(true);
+				treeList.add(tree);
+			});
+		}
+		return treeList;
+	}
+	 /**
+     * 鏍¢獙瀵嗙爜鏄惁鐩稿悓锛屽湪鏂板钩鍙颁腑瀛樺偍鐨勫瘑鐮佹槸涓ゆmd5
+     * @param userOid 鐢ㄦ埛涓婚敭
+     * @param md5Password 宸茬粡md5鍔犲瘑涓�娆$殑瀵嗙爜--鑰佺殑骞冲彴閲屼笉鑳藉姞瀵�
+     * @return true 琛ㄧず鐩哥瓑锛宖alse琛ㄧず涓嶇浉绛�
+     */
+	@Override
+	public boolean checkPasswordEqual(String md5Password, String userOid) {
+		if(StringUtils.isBlank(md5Password) || StringUtils.isBlank(userOid)){
+			return false;
+		}
+		String sql = " select plpassword from pluser where pluid = :userOid";
+		Map<String,String> conditionMap = new HashMap<>();
+		conditionMap.put("userOid",userOid.trim());
+		List<ClientBusinessObject> clientBusinessObjectList = boService.queryBySql(sql, conditionMap);
+		if(CollectionUtils.isEmpty(clientBusinessObjectList)){
+			return  false;
+		}
+
+		ThreeDES des = new ThreeDES();// 瀹炰緥鍖栦竴涓锟�?
+		des.getKey("daliantan0v0");// 鐢熸垚瀵嗗寵
+		md5Password = des.getEncString(md5Password);
+		if(md5Password.equals(clientBusinessObjectList.get(0).getAttributeValue("plpassword"))){
+			return true;
+		}
+		return false;
+	}
+	/**
+     * 鏍¢獙鐢ㄦ埛鏄惁閿佸畾
+     * @param smUserVO 鐢ㄦ埛瀵硅薄
+     * @param wrongCount 瀵嗙爜閿欒娆℃暟,濡傛灉wrongCount涓虹┖鏃讹紝浼氭牎楠岀敤鎴锋湰韬槸鍚﹀凡缁忛攣瀹氫簡
+     * @return true琛ㄧず宸茬粡閿佸畾
+     */
+	@Override
+	public boolean checkUserLock(SmUserVO smUserVO, Integer wrongCount) {
+		if(wrongCount == null || wrongCount == 0){
+			return smUserVO.isLockFlag();
+		}
+		//鏌ヨ瀵嗙爜绛栫暐
+		SmPasswordStrategyVO passwordStrategyVO = getPasswordStrategyVOByOid(smUserVO.getPkPasswordStrategy());
+		if(passwordStrategyVO == null){
+			throw new VciBaseException("绯荤粺閲屾病鏈夊瘑鐮佸畨鍏ㄧ瓥鐣�");
+		}
+		if(wrongCount >= passwordStrategyVO.getRetryTime()){
+			return  true;
+		}
+		return false;
+	}
+
+	/**
+	 * 浣跨敤涓婚敭鑾峰彇瀵嗙爜绛栫暐
+	 * @param oid 涓婚敭
+	 * @return 瀵嗙爜绛栫暐鏄剧ず瀵硅薄
+	 */
+	public SmPasswordStrategyVO getPasswordStrategyVOByOid(String oid){
+		VciQueryWrapperForDO queryWrapperForDO = new VciQueryWrapperForDO(null, SmPasswordStrategyDO.class);
+		queryWrapperForDO.eq("oid",oid.trim());
+		List<ClientBusinessObject> cboList = boService.queryBySql(queryWrapperForDO.getSelectFieldSql() + " from plpasswordstrategy " +
+				queryWrapperForDO.getTableNick() + queryWrapperForDO.getLinkTableSql() +
+				(StringUtils.isBlank(queryWrapperForDO.getWhereSql()) ? "" : (" where " + queryWrapperForDO.getWhereSql())), null);
+		if(!CollectionUtils.isEmpty(cboList)){
+			SmPasswordStrategyDO passwordStrategyDO = new SmPasswordStrategyDO();
+			WebUtil.copyValueToObjectFromCbos(cboList.get(0),passwordStrategyDO);
+			SmPasswordStrategyVO passwordStrategyVO = new SmPasswordStrategyVO();
+			BeanUtil.convert(passwordStrategyDO,passwordStrategyVO);
+			return passwordStrategyVO;
+		}else{
+			//鑾峰彇榛樿鐨�
+			queryWrapperForDO = new VciQueryWrapperForDO(null, SmPasswordStrategyDO.class);
+			queryWrapperForDO.eq("plisdefault","1");
+			cboList = boService.queryBySql(queryWrapperForDO.getSelectFieldSql() + " from plpasswordstrategy " +
+					queryWrapperForDO.getTableNick() + queryWrapperForDO.getLinkTableSql() +
+					(StringUtils.isBlank(queryWrapperForDO.getWhereSql()) ? "" : (" where " + queryWrapperForDO.getWhereSql())), null);
+			if(!CollectionUtils.isEmpty(cboList)){
+				SmPasswordStrategyDO passwordStrategyDO = new SmPasswordStrategyDO();
+				WebUtil.copyValueToObjectFromCbos(cboList.get(0),passwordStrategyDO);
+				SmPasswordStrategyVO passwordStrategyVO = new SmPasswordStrategyVO();
+				BeanUtil.convert(passwordStrategyDO,passwordStrategyVO);
+				return passwordStrategyVO;
+			}
+		}
+		return null;
+	}
+
+    /**
+     * 鏍规嵁鐢ㄦ埛鐨勪富閿紝鑾峰彇鐢ㄦ埛鐨勫瘑鐮佸畨鍏ㄧ瓥鐣�
+     * @param userOid 鐢ㄦ埛鐨勪富閿�
+     * @return 瀵嗙爜瀹夊叏绛栫暐鐨勬樉绀哄璞★紝濡傛灉涓嶅瓨鍦ㄥ垯浼氳繑鍥濶ull
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮暟鎹簱鏌ヨ鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+	@Override
+	public SmPasswordStrategyVO getPasswordStrategyVOByUserOid(String userOid)
+			throws VciBaseException {
+		WebUtil.alertNotNull(userOid,"鐢ㄦ埛鐨勪富閿�");
+		SmUserVO userVO = getUserByUserOid(userOid);
+		if(userVO == null || StringUtils.isBlank(userVO.getOid())){
+			throw new VciBaseException(DATA_OID_NOT_EXIST);
+		}
+		return getPasswordStrategyVOByOid(userVO.getPkPasswordStrategy());
+	}
+
+    /**
+     * 璁剧疆鏌愪釜鐢ㄦ埛鏄攣瀹氱姸鎬�
+     * @param userId 鐢ㄦ埛鍚�
+     */
+	@Override
+	public void lockUser(String userId) {
+		//鑰佺殑杩欎釜骞冲彴锛屾槸渚濋潬閿佸畾娆℃暟鏉ュ垽鏂殑锛屾墍浠ヨ繖閲屾病鍔炴硶鐩存帴璁剧疆
+	}
+	 /**
+     * 璁剧疆鏌愪釜鐢ㄦ埛涓嶆槸閿佸畾鐘舵��
+     * @param userId 鐢ㄦ埛鍚�
+     */
+	@Override
+	public void unLockUser(String userId) {
+		WebUtil.alertNotNull(userId,"鐢ㄦ埛鍚�");
+		String sql = "update pllogoninfo set plwrongnum = 0 where pluserid in (select pluid from pluser where plusername='" + userId + "')";
+		try {
+			platformClientUtil.getBOFactoryService().executeUpdateSql(sql);
+		} catch (VCIError vciError) {
+			throw WebUtil.getVciBaseException(vciError);
+		}
+	}
+	 /**
+     * 淇敼瀵嗙爜
+     * @param userOid 鐢ㄦ埛涓婚敭
+     * @param password 鏂扮殑瀵嗙爜
+     * @param confirmPassword 纭瀵嗙爜
+     */
+	@Override
+	public void changePassword(String userOid, String password,
+			String confirmPassword) throws VciBaseException {
+		WebUtil.alertNotNull(userOid,"鐢ㄦ埛涓婚敭",password,"瀵嗙爜",confirmPassword,"纭瀵嗙爜");
+		if(!password.equals(confirmPassword)){
+			throw new VciBaseException("瀵嗙爜鍜岀‘璁ゅ瘑鐮佷笉鐩哥瓑");
+		}
+		ThreeDES des = new ThreeDES();// 瀹炰緥鍖栦竴涓锟�?
+		des.getKey("daliantan0v0");// 鐢熸垚瀵嗗寵
+		String encPassword = des.getEncString(password);
+		String sql = "update pluser set plpassword = '" + encPassword + "' where pluid = '" + userOid.trim() + "'";
+		try {
+			platformClientUtil.getBOFactoryService().executeUpdateSql(sql);
+		} catch (VCIError vciError) {
+			throw WebUtil.getVciBaseException(vciError);
+		}
+	}
+	/**
+     * 鏇存柊鐢ㄦ埛鐨勫瘑鐮侀敊璇鏁�
+     * @param userOid 鐢ㄦ埛鐨勪富閿�
+     * @param wrongCount 瀵嗙爜鐨勯敊璇鏁�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呭瓨鍌ㄥ埌鏁版嵁搴撲腑鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+	@Override
+	public void updateUserPwdWrongCount(String userOid, int wrongCount)
+			throws VciBaseException {
+		WebUtil.alertNotNull(userOid,"鐢ㄦ埛涓婚敭");
+		String sql = "update pllogoninfo set plwrongnum = " + wrongCount +" where pluserid ='" + userOid + "'";
+		try {
+			platformClientUtil.getBOFactoryService().executeUpdateSql(sql);
+		} catch (VCIError vciError) {
+			throw WebUtil.getVciBaseException(vciError);
+		}
+	}
+	 /**
+     * 鏇存柊鐢ㄦ埛鐨勬渶鍚庣櫥褰曟椂闂�
+     * @param userOid 鐢ㄦ埛鐨勪富閿�
+     * @throws VciBaseException 鍙傛暟涓虹┖鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+	@Override
+	public void updateUserLoginTime(String userOid) throws VciBaseException {
+		WebUtil.alertNotNull(userOid,"鐢ㄦ埛涓婚敭");
+		String sql = "update pllogoninfo set pllogontime = sysdate where pluserid ='" + userOid + "'";
+		try {
+			platformClientUtil.getBOFactoryService().executeUpdateSql(sql);
+		} catch (VCIError vciError) {
+			throw WebUtil.getVciBaseException(vciError);
+		}
+	}
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/constant/FrameWorkBtmTypeConstant.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/constant/FrameWorkBtmTypeConstant.java
new file mode 100644
index 0000000..782ba1a
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/constant/FrameWorkBtmTypeConstant.java
@@ -0,0 +1,215 @@
+package com.vci.frameworkcore.constant;
+
+/**
+ * 骞冲彴妗嗘灦鐨勪笟鍔$被鍨嬪悕绉�
+ * @author weidy
+ * @date 2019/11/26 6:15 PM
+ */
+public class FrameWorkBtmTypeConstant {
+
+    /**
+     * 缁勭粐鐨勪笟鍔$被鍨嬪悕绉�
+     */
+    public static final String ORG_ORGANIZATION_BTM_TYPE = "organization";
+
+    /**
+     * 閮ㄩ棬鐨勪笟鍔$被鍨嬪悕绉�
+     */
+    public static final String ORG_DEPARTMENT_BTM_TYPE = "department";
+
+    /**
+     * 閮ㄩ棬棰嗗鐨勪笟鍔$被鍨嬪悕绉�
+     */
+    public static final String ORG_DEPARTMENT_LEADER_BTM_TYPE = "departmentLeader";
+
+    /**
+     * 鑱屽姟 鐨勪笟鍔$被鍨嬪悕绉�
+     */
+    public static final String ORG_DUTY_BTM_TYPE = "duty";
+
+    /**
+     * 鑱岀骇鐨勪笟鍔$被鍨嬪悕绉�
+     */
+    public static final String ORG_JOB_GRADE_BTM_TYPE = "jobGrade";
+
+    /**
+     * 宀椾綅鐨勪笟鍔$被鍨嬪悕绉�
+     */
+    public static final String ORG_POSITION_BTM_TYPE = "position";
+
+    /**
+     * 鎺ュ彛鐨勪笟鍔$被鍨嬪悕绉�
+     */
+    public static final String SM_API_BTM_TYPE = "api";
+    /**
+     * 鎸夐挳鐨勪笟鍔$被鍨嬪悕绉�
+     */
+    public static final String SM_BUTTON_BTM_TYPE = "button";
+
+    /**
+     * 绯荤粺鍔熻兘鑿滃崟鐨勪笟鍔$被鍨嬪悕绉�
+     */
+    public static final String SM_FUNCTION_BTM_TYPE = "function";
+
+    /**
+     * 绯荤粺鍔熻兘鑿滃崟鍏宠仈鐨勬寜閽�
+     */
+    public static final String SM_FUNCTION_BUTTON_LINK_TYPE = "functionButtonLK";
+
+    /**
+     * 瑙掕壊鐨勪笟鍔$被鍨嬪悕绉�
+     */
+    public static final String SM_ROLE_BTM_TYPE = "role";
+
+    /**
+     * 瑙掕壊鍜屽姛鑳界殑鍏宠仈鐨勮繛鎺ョ被鍨嬪悕绉�
+     */
+    public static final String SM_ROLE_FUNCTION_LINK_TYPE = "roleFunction";
+
+    /**
+     * 瑙掕壊鐢ㄦ埛杩炴帴绫诲瀷鍚嶇О
+     */
+    public static final String SM_ROLE_USER_LINK_TYPE = "roleUser";
+
+    /**
+     * 鐢ㄦ埛涓氬姟绫诲瀷鍚嶇О
+     */
+    public static final String SM_USER_BTM_TYPE = "user";
+
+    /**
+     * 瀵嗙爜瀹夊叏绛栫暐锛岀姝㈠湪鍏煎骞冲彴鐨勬椂鍊欒繖涓笟鍔$被鍨嬩綔涓哄弬鐓у唴瀹�
+     */
+    public static final String SM_PASSWORD_STRATEGY = "passwordstrategy";
+
+    /**
+     * 搴撴埧鍒嗙被鐨勪笟鍔$被鍨嬪悕绉�
+     */
+    public static final String BD_WAREHOUSE_CLASSIFY_BTM_TYPE = "warehouseClassify";
+
+    /**
+     * 浠撳簱鐨勪笟鍔$被鍨嬪悕绉�
+     */
+    public static final String BD_WAREHOUSE_BTM_TYPE = "wareHouse";
+
+    /**
+     * 浠撳簱绠$悊鍛樼殑涓氬姟绫诲瀷鍚嶇О
+     */
+    public static final String BD_WAREHOUSE_ADMIN_LINK_TYPE = "wareHouseAdmin";
+
+    /**
+     * 璐т綅鐨勪笟鍔$被鍨嬪悕绉�
+     */
+    public static final String BD_GOODS_LOCATION_BTM_TYPE = "goodsLocation";
+
+    /**
+     * 涓氬姟鏂囨。鐨勮仈绯讳汉鐨勪笟鍔$被鍨嬪悕绉�
+     */
+    public static final String BD_DOC_CONTACTOR_BTM_TYPE = "bdDocContactor";
+
+    /**
+     * 渚涘簲鍟嗗垎绫�
+     */
+    public static final String BD_SUPPLIER_CLASSIFY_BTM_TYPE = "supplierClassify";
+
+    /**
+     * 渚涘簲鍟�
+     */
+    public static final String BD_SUPPLIER_BTM_TYPE = "supplier";
+
+    /**
+     * 渚涘簲鍟嗘湇鍔¢」鐩�
+     */
+    public static final String BD_SUPPLIER_MATERIAL_BTM_TYPE = "supplierMaterial";
+
+    /**
+     * 渚涘簲鍟嗗噯鍏ョ姸鎬�
+     */
+    public static final String BD_SUPPLIER_ADMITTANCE_CLASSIFY_BTM_TYPE = "supplierAdmittance";
+
+    /**
+     * 渚涘簲鍟嗛噸瑕佸害鍒嗙被
+     */
+    public static final String BD_SUPPLIER_IMPORTTANCE_CLASSIFY_BTM_TYPE = "supplierImporttanc";
+
+    /**
+     * 瀹㈡埛鍩烘湰鍒嗙被
+     */
+    public static final String BD_CUSTOMER_CLASSIFY_BTM_TYPE = "customerClassify";
+
+    /**
+     * 瀹㈡埛閿�鍞垎绫�
+     */
+    public static final String BD_CUSTOMER_SALE_CLASSIFY_BTM_TYPE = "customerSaleCly";
+
+    /**
+     * 瀹㈡埛鍩烘湰淇℃伅
+     */
+    public static final String BD_CUSTOMER_BTM_TYPE = "customer";
+
+
+    /**
+     * 浜哄憳鐨勪笟鍔$被鍨嬪悕绉�
+     */
+    public static final String BD_PERSON_BTM_TYPE = "person";
+
+    /**
+     * 璁¢噺鍗曚綅
+     */
+    public static final String BD_UNIT_OF_MEASUREMENT_BTM_TYPE = "unitOfMeasure";
+
+    /**
+     * 鍦板尯鍒嗙被
+     */
+    public static final String BD_AREA_CLASSIFY_BTM_TYPE = "areaClassify";
+
+    /**
+     * 鐗╂枡鐨勪笟鍔$被鍨嬪悕绉�
+     */
+    public static final String BD_MATERIAL_BTM_TYPE = "material";
+
+    /**
+     * 鐗╂枡鍩烘湰鍒嗙被
+     */
+    public static final String BD_MATERIAL_CLASSIFY_BTM_TYPE = "materialClassify";
+
+    /**
+     * 宸插彂甯冪殑鏁版嵁
+     * 鍏ㄧ郴缁熶娇鐢�
+     */
+    public static final String PUB_RELEASED_OBJ_TABLE_NAME = "vcibt_releasedobj";
+
+    /**
+     * 宸ョ
+     */
+    public static final String SM_WORK_TYPE_BTM_TYPE = "worktype";
+
+    /**
+     * 鏀惰棌鐨勫姛鑳�
+     */
+    public static final String SM_FAV_FUNCTION = "favFunction";
+
+    /**
+     * 鐗╂枡/宸ュ叿鍩烘湰淇℃伅瀹氭瑙勫垯
+     */
+    public static final String BD_MATERIAL_CHECK = "materialCheck";
+
+    /**
+     * 绯荤粺棣栭〉
+     */
+    public static final String SYSTEM_MAIN_BTM_TYPE = "systemMain";
+
+    /**
+     * 绯荤粺棣栭〉鎸備欢
+     */
+    public static final String SYSTEM_PENDANT_BTM_TYPE= "systemPendant";
+
+    /**
+     * 绯荤粺棣栭〉鎸備欢鍏宠仈
+     */
+    public static final String SYSTEM_MAIN_PENDANT_BTM_TYPE = "mainPendant";
+
+    /**
+     * 绯荤粺瑙掕壊棣栭〉鍏宠仈
+     */
+    public static final String SYSTEM_ROLE_MAIN_BTM_TYPE = "roleMain";
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/constant/FrameWorkBusLangCodeConstant.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/constant/FrameWorkBusLangCodeConstant.java
new file mode 100644
index 0000000..313de53
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/constant/FrameWorkBusLangCodeConstant.java
@@ -0,0 +1,519 @@
+package com.vci.frameworkcore.constant;
+
+/**
+ * 鍩虹妗嗘灦涓笟鍔¢儴鍒嗙殑澶氳瑷�浠g爜
+ * @author weidy
+ * @date 2020/4/25
+ */
+public class FrameWorkBusLangCodeConstant {
+
+    //鐧婚檰閮ㄥ垎鐨�
+    /**
+     * 鐢ㄦ埛宸茬粡鐧诲綍
+     */
+    public static final String USER_IS_LOGINED = "userIsLogined";
+
+    /**
+     * 鐢ㄦ埛娌℃湁鎵惧埌
+     */
+    public static final String USER_NOT_FOUND = "userNotFound";
+
+    /**
+     * 鐢ㄦ埛宸茬粡鍋滅敤
+     */
+    public static final String USER_IS_DISABLED = "userIsDisabled";
+
+    /**
+     * 鐢ㄦ埛宸茬粡琚攣瀹�
+     */
+    public static final String USER_IS_LOCK = "userIsLocked";
+
+    /**
+     * 鐢ㄦ埛宸茬粡瓒呰繃澶辨晥鏃堕棿
+     */
+    public static final String USER_MORE_THAN_DISABLE_DATE = "moreDisableDate";
+
+    /**
+     * 鐢ㄦ埛瀵嗙爜閿欒琚攣瀹�
+     */
+    public static final String USER_PWD_LOCK = "userPwdErrorLock";
+
+    /**
+     * 鐢ㄦ埛瀵嗙爜涓嶇浉绛�
+     */
+    public static final String USER_PWD_NOT_EQUAL = "userPwdNotEqual";
+
+
+    //瀵嗙爜鐩稿叧
+
+    /**
+     * 纭瀵嗙爜涓嶇浉鍚�
+     */
+    public static final String CHANGE_PWD_NOT_EQUAL="changePwdNotEqual";
+
+    /**
+     * 娌℃湁瀵嗙爜绛栫暐
+     */
+    public static final String HAS_NOT_PWD_STRATEGY="hasNotPasswordStrategy";
+
+    /**
+     * 瀵嗙爜瀹夊叏绛栫暐鏈壘鍒�
+     */
+    public static final String PASSWORD_STRATEGY_NOT_FOUND = "passwordStrategyNotFound";
+
+    /**
+     * 瀵嗙爜鎵�闇�瀛楃绫诲瀷涓虹┖
+     */
+    public static final String REQUIRE_CHAR_TYPE_NULL = "requireCharTypeNull";
+
+    /**
+     * 瀵嗙爜鐨勫瓧绗︾被鍨嬩笉绗﹀悎瑕佹眰
+     */
+    public static final String REQUIRE_CHAR_TYPE_NOT_EXIST = "requireCharTypeNotExist";
+
+    /**
+     * 瀵嗙爜澶嶆潅搴︿笉绗﹀悎瑕佹眰
+     */
+    public static final String LESS_CHAR_TYPE = "lessCharType";
+
+    /**
+     * 瀵嗙爜涓嶅寘鍚皬鍐欏瓧姣�
+     */
+    public static final String NOT_HAS_LOW_LETTER= "notHasLowLetter";
+
+    /**
+     * 瀵嗙爜涓嶅寘鍚暟瀛�
+     */
+    public static final String NOT_HAS_NUMBER = "notHasNumber";
+
+    /**
+     * 瀵嗙爜涓嶅寘鍚壒娈婂瓧姣�
+     */
+    public static final String NOT_HAS_SPECIAL ="notHasSpecial";
+
+    /**
+     * 瀵嗙爜涓嶇鍚堟渶灏忛暱搴﹁姹�
+     */
+    public static final String LESS_MIN_LENGTH = "lessMinLength";
+
+    /**
+     * 瀵嗙爜涓嶇鍚堟渶澶ч暱搴﹁姹�
+     */
+    public static final String MORE_MAX_lENGTH ="moreMaxLength";
+    /**
+     * 瀵嗙爜鍗冲皢杩囨湡
+     */
+    public static final String PASSWORD_REMAIN_DAY = "passwordRemainDay";
+
+    //缁勭粐
+
+
+    //閮ㄩ棬
+
+    //鑱屽姟
+
+
+    //鑱岀骇
+
+    //鐢ㄦ埛
+
+    //瑙掕壊
+
+    //鏉冮檺
+
+    //鍦板尯鍒嗙被
+
+    //鍦扮偣
+
+    //鑱旂郴浜�
+
+    //鐗╂枡鍩烘湰淇℃伅
+
+    //鐗╂枡
+
+    /**
+     * 鐗╂枡鐨勫簭鍒楀彿
+     */
+    public static final String BD_MATERIAL_SERIAL_NUMBER_REPEAT = "materialSerialNumberRepeat";
+
+    //搴撴埧绫诲瀷
+
+    /**
+     * 搴撴埧鍒嗙被鐨勫唴閮ㄦ爣璇嗕笉鍏ㄦ槸鑻辨枃
+     */
+    public static final String BD_WAREHOUSE_CLASSIFY_ID_NOT_LETTER = "warehouseClassifyIdNotLetter";
+
+    /**
+     * 鍥犱负宸茬粡鏈夊瓨鍦ㄤ娇鐢ㄥ綋鍓嶅垎绫荤殑搴撴埧锛屾墍浠ュ彧鏄慨鏀瑰悕绉帮紝鎻忚堪鍜屼笂绾у垎绫�
+     */
+    public static final String BD_WAREHOUSE_CLASSIFY_LINK_BY_WAREHOUSE ="warehouseClassifyLinkByWarehouse" ;
+
+    /**
+     * 涓庝笂绾у簱鎴垮熀鏈垎绫荤殑搴撴埧绫诲瀷涓嶇浉鍚�
+     */
+    public static final String BD_WAREHOUSE_CLASSIFY_TYPE_NOT_EQUAL_PARENT = "warehouseClassifyParentNotEqualType";
+
+    //搴撴埧绠$悊
+
+    /**
+     * 涓庝笂绾у簱鎴跨殑搴撴埧鍒嗙被涓嶇浉鍚�
+     */
+    public static final String BD_WAREHOUSE_PARENT_WAREHOUSE_NOT_EQUAL_CLASSIFY = "warehouseParentNotEqualClassify";
+
+    /**
+     * 鏈夋暟鎹笉鑳戒慨鏀瑰簱鎴跨殑鎵�灞炲熀鏈垎绫�
+     */
+    public static final String BD_WAREHOUSE_HAS_DATA_NOT_EDIT_CLASSIFY = "warehouseHasDataNotEditClassify";
+
+    /**
+     * 娌℃湁浼犻�掔敤鎴风殑涓婚敭锛屼笉鑳借缃鐞嗗憳
+     */
+    public static final String BD_WAREHOUSE_ADMIN_USEROID_NOT_HAS = "warehouseAdminUserOidNotHas";
+
+    /**
+     * 涓哄簱鎴胯缃鐞嗗憳鎴愬姛
+     */
+    public static final String BD_WAREHOUSE_ADMIN_LINK_SUCCESS = "warehouseAdminLinkSuccess";
+
+    /**
+     * 搴撴埧鍒嗙被鐨勪富閿笉瀛樺湪
+     */
+    public static final String BD_WAREHOUSE_CLASSIFY_OID_NOT_EXIST = "warehouseClassifyOidNotExsit";
+
+    /**
+     * 褰撳墠鐢ㄦ埛娌℃湁搴撴埧鐨勬潈闄�
+     */
+    public static final String BD_WAREHOUSE_NOT_RIGHT = "warehouseNotRight";
+
+
+    //璐т綅
+
+    /**
+     * 涓婄骇涓嶆槸涓�涓揣鏋�
+     */
+    public static final String BD_GOODS_LOCATION_PARENT_NOT_SHELF = "goodsLocationParentNotShelf";
+
+    //Feign
+
+    /**
+     * 褰撳墠鐢ㄦ埛娌℃湁瀵硅搴撴埧鐨勬搷浣滄潈闄�
+     */
+    public static final String BD_FEIGN_WAREHOUSEADMIN_NOT_PERMISSION = "feignCheckWareHouseAdminPermissions";
+
+    //璁¢噺鍗曚綅
+    /**
+     * 璁¢噺鍗曚綅涓嶅瓨鍦�
+     */
+    public static final String UNIT_NOT_EXIST_BY_IDS = "unitNotExistByIds";
+
+    /**
+     * 娣诲姞鎴愬姛
+     */
+    public static final String ADD_SUCCESS ="addSuccess";
+
+    /**
+     * 娣诲姞澶辫触
+     */
+    public static final String ADD_FAIL = "addFailInDB";
+
+    /**
+     * 淇敼鎴愬姛
+     */
+    public static final String EDIT_SUCCESS = "editSuccess";
+
+    /**
+     * 淇敼澶辫触
+     */
+    public static final String EDIT_FAIL = "editFail";
+
+    /**
+     * 鍒犻櫎鎴愬姛
+     */
+    public static final String DELETE_SUCCESS = "deleteSuccess";
+
+    /**
+     * 绾ц仈鍒犻櫎鎴愬姛
+     */
+    public static final String DELETE_SUCCESS_CASCADE = "deleteSuccessCascade";
+
+    /**
+     * 鍒犻櫎澶辫触
+     */
+    public static final String DELETE_FAIL = "deleteFail";
+
+    /**
+     * 鍚敤鎴愬姛
+     */
+    public static final String ENABLE_SUCCESS ="enableSuccess";
+
+    /**
+     * 閿佸畾鎴愬姛
+     */
+    public static final String LOCK_SUCCESS = "lockSuccess";
+
+    /**
+     * 閿佸畾澶辫触
+     */
+    public static final String LOCK_FAIL = "lockFail";
+
+    /**
+     * 瑙i攣鎴愬姛
+     */
+    public static final String UNLOCK_SUCCESS = "unlockSuccess";
+
+    /**
+     * 瑙i攣澶辫触
+     */
+    public static final String UNLOCK_FAIL = "unlockFail";
+
+    /**
+     * 绾ц仈鍚敤鎴愬姛
+     */
+    public static final String ENABLE_SUCCESS_CASCADE = "enableSuccessCascade";
+
+    /**
+     * 鍚敤澶辫触
+     */
+    public static final String ENABLE_FAIL = "enableFail";
+
+    /**
+     * 鍋滅敤鎴愬姛
+     */
+    public static final String DISABLE_SUCCESS = "disableSuccess";
+
+    /**
+     * 绾ц仈鍋滅敤鎴愬姛
+     */
+    public static final String DISABLE_SUCCESS_CASCADE = "disableSuccessCascade";
+
+    /**
+     * 鍋滅敤澶辫触
+     */
+    public static final String DISABLE_FAIL = "disableFail";
+
+    /**
+     * 鍗囩増鏈彿鎴愬姛
+     */
+    public static final String UP_REVISION_SUCCESS = "dataUpRevisionSuccess";
+
+    /**
+     * 鍗囩増鏈彿澶辫触
+     */
+    public static final String UP_REVISION_FAIL = "dataUpRevisionFail";
+
+    /**
+     * 鍗囩増娆℃垚鍔�
+     */
+    public static final String UP_VERSION_SUCCESS = "dataUpVersionSuccess";
+
+    /**
+     * 鍗囩増娆″け璐�
+     */
+    public static final String UP_VERSION_FAIL = "dataUpVersionFail";
+
+    /**
+     * 鎻愪氦鎴愬姛
+     */
+    public static final String SUBMIT_SUCCESS= "submitSuccess";
+
+    /**
+     * 鎻愪氦澶辫触
+     */
+    public static final String SUBMIR_FAIL = "submitFail";
+
+    /**
+     * 鍙戝竷鎴愬姛
+     */
+    public static final String RELEASE_SUCCESS = "releaseSuccess";
+
+    /**
+     * 鍙戝竷澶辫触
+     */
+    public static final String RELEASE_FAIL = "releaseFail";
+
+    /**
+     * 鐗堟湰鍙烽噸澶�
+     */
+    public static final String REVISION_REPEAT = "revisionRepeat";
+
+    /**
+     * 鐗堟鍙烽噸澶�
+     */
+    public static final String VERSION_REPEAT= "versionRepeat";
+
+    /**
+     * 鏍规嵁涓婚敭鏌ヨ鏁版嵁涓嶅瓨鍦�
+     */
+    public static final String DATA_OID_NOT_EXIST = "dataOidNotExist";
+
+    /**
+     * 鏍规嵁涓婚敭鏌ヨ鐨勬暟鎹笉瀛樺湪
+     */
+    public static final String DATA_ID_NOT_EXIST = "dataIdNotExist";
+
+    /**
+     * 鏍规嵁鍚嶇О鏌ヨ鐨勬暟鎹笉瀛樺湪
+     */
+    public static final String DATA_NAME_NOT_EXIST = "dataNameNotExist";
+
+    /**
+     * 灞炴�у�奸噸澶�
+     */
+    public static final String DATA_ATTR_REPEAT = "dataRepeat";
+
+    /**
+     * 鑰佺増鏈殑鏁版嵁涓嶅瓨鍦�
+     */
+    public static final String OLD_REVISION_DATA_NOT_EXIST = "oldRevsionDataNotExist";
+
+    /**
+     * 涓婄骇涓婚敭瀹為檯鏄綋鍓嶈妭鐐圭殑涓嬬骇鑺傜偣锛屼細寮曡捣姝诲惊鐜�
+     */
+    public static final String PARENT_OID_IS_CHILD ="parentIsChild";
+
+    /**
+     * 鏁版嵁琚紩鐢紝涓嶅厑璁稿垹闄�
+     */
+    public static final String DATA_LINKED_NOT_DELETE = "dataLinkedNotDelete";
+
+    /**
+     * 鏁版嵁鐨勫瓙鑺傜偣涔熻寮曠敤锛屼笉鍏佽鍒犻櫎
+     */
+    public static final String DATA_CASCADE_LINKED_NOT_DELETE = "dataCascadeLinkedNotDelete";
+
+    /**
+     * 鏁版嵁琚紩鐢紝涓嶅厑璁镐慨鏀�
+     */
+    public static final String DATA_LINKED_NOT_EDIT ="dataLinkedNotEdit";
+
+    /**
+     * 鏁版嵁涓嶅紩鐢紝涓嶅厑璁镐慨鏀规煇涓睘鎬�
+     */
+    public static final String DATA_LINKED_NOT_EDIT_ATTR="dataLinkedNotEditAttr";
+
+    /**
+     * 涓婄骇妗f涓嶅瓨鍦�
+     */
+    public static final String DATA_PARENT_NOT_EXIST = "parentNotExist";
+
+    /**
+     * 鍒嗙被鏁版嵁涓嶅瓨鍦�
+     */
+    public static final String DATA_CLASSIFY_NOT_EXIST = "classifyNotExist";
+
+    /**
+     * 褰撳墠鐘舵�佷笅涓嶅厑璁镐慨鏀规暟鎹�
+     */
+    public static final String LCSTATUS_CAN_NOT_EDIT = "lcStatusCannotEditData";
+
+    /**
+     * 褰撳墠鐘舵�佷笅涓嶅厑璁稿垹闄ゆ暟鎹�
+     */
+    public static final String LCSTATUS_CAN_NOT_DELETE = "lcStatusCannotDeleteData";
+
+    /**
+     * 瀵煎叆鎴愬姛
+     */
+    public static final String IMPORT_SUCCESS = "importSuccess";
+
+    /**
+     * 瀵煎叆澶辫触
+     */
+    public static final String IMPORT_FAIL = "importFail";
+
+    /**
+     * 瀵煎叆鐨勬ā鏉挎枃浠朵笉瀛樺湪
+     */
+    public static final String IMPORT_TEMPLATE_FILE_NOT_FOUND = "importTemplateFileNotFound";
+
+    /**
+     * 瀵煎嚭鎴愬姛
+     */
+    public static final String EXPORT_SUCCESS = "exportSuccess";
+
+    /**
+     * 瀵煎嚭澶辫触
+     */
+    public static final String EXPORT_FAIL = "exportFail";
+
+    /**
+     * 涓婁紶鎴愬姛
+     */
+    public static final String UPLOAD_SUCCESS = "uploadSuccess";
+
+    /**
+     * 涓婁紶澶辫触
+     */
+    public static final String UPLOAD_FAIL = "uploadFail";
+
+    /**
+     * 涓嬭浇鎴愬姛
+     */
+    public static final String DOWNLOAD_SUCCESS = "downloadSuccess";
+
+    /**
+     * 涓嬭浇澶辫触
+     */
+    public static final String DOWNLOAD_FAIL = "downloadFail";
+
+    /**
+     * 鏂囦欢涓嶅瓨鍦�
+     */
+    public static final String FILE_NOT_EXIST = "fileNotExist";
+
+    /**
+     * 瀹℃壒鎴愬姛
+     */
+    public static final String AUDIT_SUCCESS = "auditSuccess";
+
+    /**
+     * 瀹℃壒澶辫触
+     */
+    public static final String AUDIT_FAIL = "auditFail";
+
+    /**
+     * 涓嬪彂鎴愬姛
+     */
+    public static final String ISSUED_SUCCESS = "issuedSuccess";
+
+    /**
+     * 涓嬪彂澶辫触
+     */
+    public static final String ISSUED_FAIL = "issuedFail";
+
+    /**
+     * 鎺ユ敹鎴愬姛
+     */
+    public static final String RECEIVE_SUCCESS = "receiveSuccess";
+
+    /**
+     * 鎺ユ敹澶辫触
+     */
+    public static final String RECEIVE_FAIL = "receiveFail";
+
+    /**
+     * 璁″垝鐨勫埗閫犱緷鎹笉瀛樺湪
+     */
+    public static final String PLAN_SOURCE_NOT_EXIST = "planSourceNotExist";
+
+    /**
+     * 璁″垝鐨勫埗閫犵洰鏍囦笉瀛樺湪
+     */
+    public static final String PLAN_TARGET_NOT_EXIST = "planTargetNotExist";
+
+    /**
+     * 娲惧彂鎴愬姛
+     */
+    public static final String DISPATCH_SUCCESS = "dispatchSuccess";
+
+    /**
+     * 娲惧彂澶辫触
+     */
+    public static final String DISPATCH_FAIL = "dispatchFail";
+
+    /**
+     * 璇ヨ鍒掍笅涓嶅瓨鍦ㄦ淳鍙戣繃鐨勪换鍔�
+     */
+    public static final String DISPATCH_TASK_NOT_EXIST_BY_PLAN = "dispatchTaskNotExistByPlan";
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/constant/FrameWorkDefaultValueConstant.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/constant/FrameWorkDefaultValueConstant.java
new file mode 100644
index 0000000..529ff12
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/constant/FrameWorkDefaultValueConstant.java
@@ -0,0 +1,169 @@
+package com.vci.frameworkcore.constant;
+
+/**
+ * 骞冲彴妗嗘灦鐨勪竴浜涢粯璁ゅ�硷紝鍦ㄤ竴浜涘鎴蜂笉闇�瑕佺鐞嗘煇浜涙。妗堟椂锛岄粯璁や竴涓��
+ * @author weidy
+ * @date 2019/12/30
+ */
+public class FrameWorkDefaultValueConstant {
+
+    /**
+     * 榛樿鐨勭粍缁囦富閿�
+     */
+    public static final String DEFAULT_ORGANIZATION_OID = "defaultOrg";
+
+    /**
+     * 榛樿鐨勭粍缁囧悕绉�
+     */
+    public static final String DEFAULT_ORGANIZATION_NAME = "榛樿缁勭粐";
+
+    /**
+     * 榛樿鐨勫簱鎴夸富閿�
+     */
+    public static final String DEFAULT_WAREHOUSE_OID = "defaultWarehouse";
+
+    /**
+     * 榛樿鐨勫簱鎴垮悕绉�
+     */
+    public static final String DEFAULT_WAREHOUSE_NAME ="榛樿搴撴埧";
+
+    /**
+     * 榛樿鐨勮揣浣嶄富閿�
+     */
+    public static final String DEFAULT_GOODS_LOCATION_OID = "defaultGoodsLocation";
+
+    /**
+     * 榛樿鐨勮揣浣嶅悕绉�
+     */
+    public static final String DEFAULT_GOODS_LOCATION_NAME = "榛樿璐т綅";
+
+    /**
+     * 榛樿鐨勫簱鎴跨鐞嗗憳
+     */
+    public static final String DEFAULT_WAREHOUSE_ADMIN_OID = "defaultWarehouseAdmin";
+
+    /**
+     * 榛樿鐨勫簱鎴跨鐞嗗憳鍚嶇О
+     */
+    public static final String DEFAULT_WAREHOUSE_ADMIN_NAME = "榛樿搴撴埧绠$悊鍛�";
+
+    /**
+     * 榛樿鐢ㄦ埛
+     */
+    public static final String DEFAULT_USER_OID = "defaultUser";
+
+    /**
+     * 榛樿鐢ㄦ埛鍚嶇О
+     */
+    public static final String DEFAULT_USER_NAME = "榛樿鐢ㄦ埛";
+
+    /**
+     * 榛樿閮ㄩ棬
+     */
+    public static final String DEFAULT_DEPARTMENT_OID = "defaultDepartment";
+
+    /**
+     * 榛樿閮ㄩ棬鍚嶇О
+     */
+    public static final String DEFAULT_DEPARTMENT_NAME = "榛樿閮ㄩ棬";
+
+    /**
+     * 榛樿token
+     */
+    public static final String DEFAULT_TOKEN = "51b3df0f-e769-40a5-bf3a-a8143ef0262f";
+
+    /**
+     * 鍚敤鐨勬暟鎹�
+     */
+    public static final String FRAMEWORK_DATA_ENABLED = "Enabled";
+
+    /**
+     * 鍋滅敤鐨勬暟鎹�
+     */
+    public static final String FRAMEWORK_DATA_DISABLED = "Disabled";
+
+    /**
+     * 缂栬緫鐨勬暟鎹�
+     */
+    public static final String FRAMEWORK_RELEASE_EDITING = "Editing";
+
+    /**
+     * 瀹℃牳涓殑鏁版嵁
+     */
+    public static final String FRAMEWORK_RELEASE_AUDITING = "Auditing";
+
+    /**
+     * 宸叉彁浜�
+     */
+    public static final String FRAMEWORK_RELEASE_SUBMIT = "Submit";
+
+    /**
+     * 鍙戝竷鐨勬暟鎹�
+     */
+    public static final String FRAMEWORK_RELEASE_RELEASED = "Released";
+
+    /**
+     * 鍦ㄦ爲涓婃樉绀衡�滄墍鏈塜XX鈥濊繖涓妭鐐圭殑涓婚敭
+     */
+    public static final String ALL_DATA_TREE_NODE_OID = "${all}";
+
+    /**
+     * 鏌ヨ鎵�鏈夌殑鐗堟湰
+     */
+    public static final String QUERY_ALL_REVISION = "${queryAllRevision}";
+
+    /**
+     * 鍙傜収鐨勬椂鍊欙紝鏄剧ず宸插仠鐢ㄧ殑鏁版嵁鐨勬煡璇㈠弬鏁�
+     */
+    public static final String REFER_SHOW_DISABLED_QUERY_KEY ="referAllLcStatus";
+
+    /**
+     * 瀹屾垚
+     */
+    public static final String FRAMEWORK_RELEASE_FINISH = "Finish";
+
+    /**
+     * 宸叉寕璧�
+     */
+    public static final String FRAMEWORK_RELEASE_SUSPENDED = "Suspended";
+
+    /**
+     * 宸蹭綔搴�
+     */
+    public static final String FRAMEWORK_RELEASE_OBSOLETED = "Obsoleted";
+
+    /**
+     * 鎵ц涓�
+     */
+    public static final String FRAMEWORK_RELEASE_EXECUTING = "Executing";
+
+    /**
+     * 宸查��鍥�
+     */
+    public static final String FRAMEWORK_RELEASE_SENDBACK = "SendBack";
+
+    /**
+     * 宸叉敹鍥�
+     */
+    public static final String FRAMEWORK_RELEASE_TAKEBACK = "TakeBack";
+
+    /**
+     * 榛樿鐨勫瘑鐮佺瓥鐣ヤ富閿�
+     */
+    public static final String DEFAULT_PASSWORD_STRATEGY = "defaultPasswordStrategy";
+
+    /**
+     * 鐘舵�佸瓧娈�
+     */
+    public static final String LC_STATUS = "lcStatus";
+
+    /**
+     * 瀛楁瘝鍗囩増鐨勭増鏈鍒�
+     */
+    public static final String CHAR_REVISION = "characterversionrule";
+
+    /**
+     * 鏁板瓧鍗囩増鐨勭増鏈鍒�
+     */
+    public static final String NUMBER_REVISION  = "numberversionrule";
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/controller/OrgDepartmentQueryController.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/controller/OrgDepartmentQueryController.java
new file mode 100644
index 0000000..33278b6
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/controller/OrgDepartmentQueryController.java
@@ -0,0 +1,50 @@
+package com.vci.frameworkcore.controller;
+
+import com.vci.frameworkcore.compatibility.OrgDeptQueryServiceI;
+import com.vci.frameworkcore.pagemodel.OrgDepartmentVO;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.List;
+
+/**
+ * 閮ㄩ棬鐨勬煡璇㈡帶鍒跺櫒
+ * @author weidy
+ * @date 2020/3/4
+ */
+@Controller
+@RequestMapping("/departmentQueryController")
+public class OrgDepartmentQueryController {
+
+    /**
+     * 閮ㄩ棬鐨勬煡璇㈡湇鍔�
+     */
+    @Autowired
+    private OrgDeptQueryServiceI deptQueryService;
+
+    /**
+     * 閮ㄩ棬鐨勬爲褰㈠弬鐓�
+     * @param treeQueryObject 鏍戝舰鏁版嵁鐨勬煡璇㈠璞★紝鍖呮嫭鏌ヨ鏉′欢锛屼笂绾т富閿紝鏄惁澶氶�夌瓑锛岋紙extandParamsMap涓坊鍔�"showAllDepartmentNode"涓�"true"鏃�,骞朵笖parentOid涓虹┖锛岃繑鍥炵粨鏋滀腑浼氬寘鍚�滄墍鏈夐儴闂ㄢ�濊繖涓妭鐐癸級
+     * @return 閮ㄩ棬鐨勬爲褰㈠弬鐓э紝宸茬粡杞崲浜嗕笂涓嬬骇鍏崇郴
+     * @throws VciBaseException 鏌ヨ鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父锛屽鏋滄槸鑰佺殑椤圭洰閲屼笉鎶涘嚭寮傚父
+     */
+    @RequestMapping(value = "/refTree",method = RequestMethod.GET)
+    @ResponseBody
+    public BaseResult<Tree> refTree(TreeQueryObject treeQueryObject) throws VciBaseException{
+        List<Tree> deptTreeList = deptQueryService.refTreeDept(treeQueryObject);
+        return  BaseResult.tree(deptTreeList);
+        //鑰佺殑椤圭洰渚濈劧鏄坊鍔爐ry catch锛屾柟娉曢噷涓嶆姏鍑哄紓甯�
+        //BaseResult.fail("杩欓噷杩斿洖鍓嶇鐨勯敊璇俊鎭�");
+    }
+    @RequestMapping(value = "/refDataGrid",method = RequestMethod.GET)
+    @ResponseBody
+    public BaseResult<OrgDepartmentVO> refDataGrid(BaseQueryObject queryObject){
+    	DataGrid<OrgDepartmentVO> dataGrid=deptQueryService.gridDepts(queryObject.getConditionMap(), queryObject.getPageHelper());
+    	return BaseResult.dataGrid(dataGrid);
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/controller/OrgDutyQueryController.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/controller/OrgDutyQueryController.java
new file mode 100644
index 0000000..d917205
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/controller/OrgDutyQueryController.java
@@ -0,0 +1,63 @@
+package com.vci.frameworkcore.controller;
+
+import com.vci.frameworkcore.compatibility.OrgDutyQueryServiceI;
+import com.vci.frameworkcore.pagemodel.OrgDutyVO;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.*;
+import com.vci.web.pageModel.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.List;
+
+/**
+ * 鑱屽姟鏌ヨ鐨勬帶鍒跺櫒
+ * @author weidy
+ * @date 2020/3/4
+ */
+@Controller
+@RequestMapping("/dutyQueryController")
+public class OrgDutyQueryController {
+
+    /**
+     * 鑱屽姟鏌ヨ鏈嶅姟
+     */
+    @Autowired
+    private OrgDutyQueryServiceI dutyQueryService;
+
+    /**
+     * 鑱屽姟鐨勫垪琛ㄥ弬鐓�
+     * @param queryObject 鏌ヨ瀵硅薄锛屽寘鍚簡鏌ヨ鏉′欢锛屽垎椤碉紝鎺掑簭绛�,鍗冲厑璁镐娇鐢∣rgDutyVO閲岀殑鎵�鏈夊睘鎬т綔涓烘煡璇㈡潯浠�
+     * @return 鑱屽姟鐨勬樉绀哄璞″垪琛ㄦ暟鎹紝璇疯幏鍙栧叾涓殑data灞炴��
+     * @throws VciBaseException 鏌ヨ鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父锛屽鏋滄槸鑰佺殑椤圭洰閲屼笉鎶涘嚭寮傚父
+     */
+    @RequestMapping(value = "/refDataGrid",method = RequestMethod.GET)
+    @ResponseBody
+    public BaseResult<OrgDutyVO> refDataGrid(BaseQueryObject queryObject) throws VciBaseException {
+        if(queryObject == null){
+            queryObject = new BaseQueryObject();
+        }
+        DataGrid<OrgDutyVO> dutyVODataGrid =  dutyQueryService.refGridDutys(queryObject.getConditionMap(),queryObject.getPageHelper());
+        return BaseResult.dataGrid(dutyVODataGrid);
+        //濡傛灉鏄�佺殑椤圭洰锛屽簲璇ュ湪refGridDutys涓婃坊鍔爐ry锛宑atch锛岀劧鍚巆atch閲屽簲璇ヤ娇鐢ㄤ笅闈㈢殑浠g爜
+        //BaseResult.fail("杩欓噷杩斿洖鍓嶇鐨勯敊璇俊鎭�");
+    }
+
+    /**
+     * 鑱屽姟鐨勬爲褰㈠弬鐓�
+     * @param treeQueryObject 鏍戝舰鏁版嵁鐨勬煡璇㈠璞★紝鍖呮嫭鏌ヨ鏉′欢锛屼笂绾т富閿紝鏄惁澶氶�夌瓑锛宔xtandParamsMap涓坊鍔�"showAllDutyNode"涓�"true"鏃讹紝杩斿洖缁撴灉涓細鍖呭惈鈥滄墍鏈夎亴鍔♀�濊繖涓妭鐐�
+     * @return 瑙掕壊鐨勬爲褰㈠弬鐓э紝鏃犱笂涓嬬骇鍏崇郴
+     * @throws VciBaseException 鏌ヨ鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父锛屽鏋滄槸鑰佺殑椤圭洰閲屼笉鎶涘嚭寮傚父
+     */
+    @RequestMapping(value = "/refTree",method = RequestMethod.GET)
+    @ResponseBody
+    public BaseResult<Tree> refTree(TreeQueryObject treeQueryObject) throws VciBaseException{
+        List<Tree> dutyTreeList = dutyQueryService.refTreeDutys(treeQueryObject);
+        return  BaseResult.tree(dutyTreeList);
+        //鑰佺殑椤圭洰渚濈劧鏄坊鍔爐ry catch锛屾柟娉曢噷涓嶆姏鍑哄紓甯�
+        //BaseResult.fail("杩欓噷杩斿洖鍓嶇鐨勯敊璇俊鎭�");
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/controller/SmRoleQueryController.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/controller/SmRoleQueryController.java
new file mode 100644
index 0000000..3d36af9
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/controller/SmRoleQueryController.java
@@ -0,0 +1,64 @@
+package com.vci.frameworkcore.controller;
+
+import com.vci.frameworkcore.compatibility.SmRoleQueryServiceI;
+import com.vci.frameworkcore.pagemodel.SmRoleVO;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.*;
+import com.vci.web.pageModel.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.List;
+
+/**
+ * 瑙掕壊鏌ヨ鎺у埗鍣�
+ * @author weidy
+ * @date 2020/3/4
+ */
+@Controller
+@RequestMapping("/roleQueryController")
+public class SmRoleQueryController {
+
+    /**
+     * 瑙掕壊鐨勬煡璇㈡湇鍔�
+     */
+    @Autowired
+    private SmRoleQueryServiceI roleQueryService;
+
+    /**
+     * 瑙掕壊鐨勫垪琛ㄥ弬鐓�
+     * @param queryObject 鏌ヨ瀵硅薄锛屽寘鍚簡鏌ヨ鏉′欢锛屽垎椤碉紝鎺掑簭绛�,鍗冲厑璁镐娇鐢⊿mRoleVO閲岀殑鎵�鏈夊睘鎬т綔涓烘煡璇㈡潯浠�
+     * @return 鏅�氳鑹诧紙涓嶅寘鍚笁鍛樼殑瑙掕壊锛夌殑鏄剧ず瀵硅薄鍒楄〃鏁版嵁锛岃鑾峰彇鍏朵腑鐨刣ata灞炴��
+     * @throws VciBaseException 鏌ヨ鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父锛屽鏋滄槸鑰佺殑椤圭洰閲屼笉鎶涘嚭寮傚父
+     */
+    @RequestMapping(value = "/refDataGrid",method = RequestMethod.GET)
+    @ResponseBody
+    public BaseResult<SmRoleVO> refDataGrid(BaseQueryObject queryObject) throws VciBaseException {
+        if(queryObject == null){
+            queryObject = new BaseQueryObject();
+        }
+        DataGrid<SmRoleVO> roleVODataGrid =  roleQueryService.refGridRoles(queryObject.getConditionMap(),queryObject.getPageHelper());
+        return BaseResult.dataGrid(roleVODataGrid);
+        //濡傛灉鏄�佺殑椤圭洰锛屽簲璇ュ湪refGridRoles涓婃坊鍔爐ry锛宑atch锛岀劧鍚巆atch閲屽簲璇ヤ娇鐢ㄤ笅闈㈢殑浠g爜
+        //BaseResult.fail("杩欓噷杩斿洖鍓嶇鐨勯敊璇俊鎭�");
+    }
+
+    /**
+     * 瑙掕壊鐨勬爲褰㈠弬鐓�
+     * @param treeQueryObject 鏍戝舰鏁版嵁鐨勬煡璇㈠璞★紝鍖呮嫭鏌ヨ鏉′欢锛屼笂绾т富閿紝鏄惁澶氶�夌瓑锛宔xtandParamsMap涓坊鍔�"showAllRoleNode"涓�"true"鏃讹紝杩斿洖缁撴灉涓細鍖呭惈鈥滄墍鏈夎鑹测�濊繖涓妭鐐�
+     * @return 瑙掕壊鐨勬爲褰㈠弬鐓э紝鏃犱笂涓嬬骇鍏崇郴
+     * @throws VciBaseException 鏌ヨ鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父锛屽鏋滄槸鑰佺殑椤圭洰閲屼笉鎶涘嚭寮傚父
+     */
+    @RequestMapping(value = "/refTree",method = RequestMethod.GET)
+    @ResponseBody
+    public BaseResult<Tree> refTree(TreeQueryObject treeQueryObject) throws VciBaseException{
+        List<Tree> roleTreeList = roleQueryService.refTreeRoles(treeQueryObject);
+        return  BaseResult.tree(roleTreeList);
+        //鑰佺殑椤圭洰渚濈劧鏄坊鍔爐ry catch锛屾柟娉曢噷涓嶆姏鍑哄紓甯�
+        //BaseResult.fail("杩欓噷杩斿洖鍓嶇鐨勯敊璇俊鎭�");
+    }
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/controller/SmUserQueryController.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/controller/SmUserQueryController.java
new file mode 100644
index 0000000..b931b04
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/controller/SmUserQueryController.java
@@ -0,0 +1,121 @@
+package com.vci.frameworkcore.controller;
+
+import com.vci.frameworkcore.compatibility.SmUserQueryServiceI;
+import com.vci.frameworkcore.pagemodel.SmUserVO;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.*;
+import com.vci.web.pageModel.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.List;
+
+/**
+ * 鐢ㄦ埛鐨勬煡璇㈡帶鍒跺櫒
+ * @author weidy
+ * @date 2020/3/4
+ */
+@Controller
+@RequestMapping("/userQueryController")
+public class SmUserQueryController {
+
+    /**
+     * 鐢ㄦ埛鏌ヨ鏈嶅姟
+     */
+    @Autowired
+    private SmUserQueryServiceI userQueryService;
+
+    /**
+     * 鐢ㄦ埛鐨勫垪琛ㄥ弬鐓э紝
+     * @param queryObject 鏌ヨ瀵硅薄锛屽寘鍚簡鏌ヨ鏉′欢锛屽垎椤碉紝鎺掑簭绛�,鍗冲厑璁镐娇鐢⊿mUserVO閲岀殑鎵�鏈夊睘鎬т綔涓烘煡璇㈡潯浠讹紝涔熷彲浠ヤ娇鐢╬kRole.xxx锛宲kDepartment.xxx,pkDuty.xxx杩欐牱鏉ユ煡璇�
+     * @return 鏅�氱敤鎴凤紙涓嶅寘鍚笁鍛橈紝涔熶笉鍖呭惈鍋滅敤鐨勶級鐨勬樉绀哄璞″垪琛ㄦ暟鎹紝璇疯幏鍙栧叾涓殑data灞炴��
+     * @throws VciBaseException 鏌ヨ鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父锛屽鏋滄槸鑰佺殑椤圭洰閲屼笉鎶涘嚭寮傚父
+     */
+    @RequestMapping(value = "/refDataGrid",method = RequestMethod.GET)
+    @ResponseBody
+    public BaseResult<SmUserVO> refDataGrid(BaseQueryObject queryObject) throws VciBaseException {
+        //浠g爜绀轰緥
+        if(queryObject == null){
+            queryObject = new BaseQueryObject();
+        }
+        DataGrid<SmUserVO> userVODataGrid =  userQueryService.refGridUsers(queryObject.getConditionMap(),queryObject.getPageHelper());
+        return BaseResult.dataGrid(userVODataGrid);
+        //濡傛灉鏄�佺殑椤圭洰锛屽簲璇ュ湪refGridUsers涓婃坊鍔爐ry锛宑atch锛岀劧鍚巆atch閲屽簲璇ヤ娇鐢ㄤ笅闈㈢殑浠g爜
+        //BaseResult.fail("杩欓噷杩斿洖鍓嶇鐨勯敊璇俊鎭�");
+    }
+
+    /**
+     * 鐢ㄦ埛鐨勬爲褰㈠弬鐓�
+     * @param treeQueryObject 鏍戝舰鏁版嵁鐨勬煡璇㈠璞★紝鍖呮嫭鏌ヨ鏉′欢锛屼笂绾т富閿紝鏄惁澶氶�夌瓑锛屽嵆鍏佽浣跨敤SmUserVO閲岀殑鎵�鏈夊睘鎬т綔涓烘煡璇㈡潯浠讹紝涔熷彲浠ヤ娇鐢╬kRole.xxx锛宲kDepartment.xxx,pkDuty.xxx杩欐牱鏉ユ煡璇�
+     * @return 鏅�氱敤鎴凤紙涓嶅寘鍚笁鍛橈紝涔熶笉鍖呭惈鍋滅敤鐨勶級鐨勬爲褰㈡暟鎹紝宸茬粡杞崲杩囦笂涓嬬骇鍏崇郴锛岃鑾峰彇鍏朵腑鐨則reeData灞炴��
+     * @throws VciBaseException 鏌ヨ鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父锛屽鏋滄槸鑰佺殑椤圭洰閲屼笉鎶涘嚭寮傚父
+     */
+    @RequestMapping(value = "/refTree",method = RequestMethod.GET)
+    @ResponseBody
+    public BaseResult<Tree> refTree(TreeQueryObject treeQueryObject) throws VciBaseException{
+        List<Tree> userTreeList = userQueryService.refTreeUsers(treeQueryObject);
+        return  BaseResult.tree(userTreeList);
+        //鑰佺殑椤圭洰渚濈劧鏄坊鍔爐ry catch锛屾柟娉曢噷涓嶆姏鍑哄紓甯�
+        //BaseResult.fail("杩欓噷杩斿洖鍓嶇鐨勯敊璇俊鎭�");
+    }
+
+    /**
+     * 浣跨敤閮ㄩ棬鏉ヨ幏鍙栫敤鎴风殑鍙傜収鍒楄〃
+     * @param pkDepartment 閮ㄩ棬鐨勪富閿紝涓嶈兘涓虹┖
+     * @param queryObject 鏌ヨ瀵硅薄锛屽寘鍚煡璇㈡潯浠讹紝鍒嗛〉锛屾帓搴忕瓑,鍗冲厑璁镐娇鐢⊿mUserVO閲岀殑鎵�鏈夊睘鎬т綔涓烘煡璇㈡潯浠讹紝涔熷彲浠ヤ娇鐢╬kRole.xxx锛宲kDepartment.xxx,pkDuty.xxx杩欐牱鏉ユ煡璇�
+     * @return 鏅�氱敤鎴凤紙涓嶅寘鍚笁鍛橈紝涔熶笉鍖呭惈鍋滅敤鐨勶級鐨勬樉绀哄璞″垪琛ㄦ暟鎹紝璇疯幏鍙栧叾涓殑data灞炴��
+     * @throws VciBaseException 閮ㄩ棬涓婚敭涓虹┖銆佹煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父锛屽鏋滄槸鑰佺殑椤圭洰閲屼笉鎶涘嚭寮傚父
+     */
+    @RequestMapping(value = "/refDataGridByPkDepartment",method = RequestMethod.GET)
+    @ResponseBody
+    public BaseResult<SmUserVO> refDataGridByPkDepartment(String pkDepartment,BaseQueryObject queryObject) throws VciBaseException{
+        if(queryObject == null){
+            queryObject = new BaseQueryObject();
+        }
+        DataGrid<SmUserVO> userVODataGrid = userQueryService.gridUserByDeptOid(pkDepartment, queryObject.getConditionMap(), queryObject.getPageHelper());
+        return  BaseResult.dataGrid(userVODataGrid);
+        //濡傛灉鏄�佺殑椤圭洰锛屽簲璇ュ湪gridUserByDeptOid涓婃坊鍔爐ry锛宑atch锛岀劧鍚巆atch閲屽簲璇ヤ娇鐢ㄤ笅闈㈢殑浠g爜
+        //BaseResult.fail("杩欓噷杩斿洖鍓嶇鐨勯敊璇俊鎭�");
+    }
+
+    /**
+     * 浣跨敤瑙掕壊鏉ヨ幏鍙栫敤鎴风殑鍙傜収鍒楄〃
+     * @param pkRole 瑙掕壊鐨勪富閿紝涓嶈兘涓虹┖
+     * @param queryObject 鏌ヨ瀵硅薄锛屽寘鍚煡璇㈡潯浠讹紝鍒嗛〉锛屾帓搴忕瓑,鍗冲厑璁镐娇鐢⊿mUserVO閲岀殑鎵�鏈夊睘鎬т綔涓烘煡璇㈡潯浠讹紝涔熷彲浠ヤ娇鐢╬kRole.xxx锛宲kDepartment.xxx,pkDuty.xxx杩欐牱鏉ユ煡璇�
+     * @return 鏅�氱敤鎴凤紙涓嶅寘鍚笁鍛橈紝涔熶笉鍖呭惈鍋滅敤鐨勶級鐨勬樉绀哄璞″垪琛ㄦ暟鎹紝璇疯幏鍙栧叾涓殑data灞炴��
+     * @throws VciBaseException 瑙掕壊鐨勪富閿负绌恒�佹煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父锛屽鏋滄槸鑰佺殑椤圭洰閲屼笉鎶涘嚭寮傚父
+     */
+    @RequestMapping(value = "/refDataGridByPkRole",method = RequestMethod.GET)
+    @ResponseBody
+    public BaseResult<SmUserVO> refDataGridByPkRole(String pkRole,BaseQueryObject queryObject) throws VciBaseException{
+        if(queryObject == null){
+            queryObject = new BaseQueryObject();
+        }
+        DataGrid<SmUserVO> userVODataGrid = userQueryService.gridUserByRoleOid(pkRole, queryObject.getConditionMap(), queryObject.getPageHelper());
+        return  BaseResult.dataGrid(userVODataGrid);
+        //濡傛灉鏄�佺殑椤圭洰锛屽簲璇ュ湪gridUserByRoleOid涓婃坊鍔爐ry锛宑atch锛岀劧鍚巆atch閲屽簲璇ヤ娇鐢ㄤ笅闈㈢殑浠g爜
+        //BaseResult.fail("杩欓噷杩斿洖鍓嶇鐨勯敊璇俊鎭�");
+    }
+
+    /**
+     * 淇敼瀵嗙爜
+     * @param userOid 鐢ㄦ埛涓婚敭
+     * @param password 鏂板瘑鐮�
+     * @param confirmPassword 纭瀵嗙爜
+     */
+    @RequestMapping(value = "/changePassword",method = RequestMethod.POST)
+    @ResponseBody
+    public BaseResult changePassword(String userOid, String password, String confirmPassword) {
+        userQueryService.changePassword(userOid, password, confirmPassword);
+        return BaseResult.success("淇敼瀵嗙爜鎴愬姛");
+    }
+
+
+
+
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/enumpck/DataObjectEnum.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/enumpck/DataObjectEnum.java
new file mode 100644
index 0000000..e8769f2
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/enumpck/DataObjectEnum.java
@@ -0,0 +1,152 @@
+package com.vci.frameworkcore.enumpck;
+
+import com.alibaba.fastjson.JSONObject;
+import com.vci.frameworkcore.pagemodel.OrgDepartmentVO;
+import com.vci.frameworkcore.pagemodel.SmRoleVO;
+import com.vci.frameworkcore.pagemodel.SmUserVO;
+import com.vci.rmip.framework.client.systemConfig.object.DeptObject;
+import com.vci.rmip.framework.client.systemConfig.object.RoleObject;
+import com.vci.rmip.framework.client.systemConfig.object.UserObject;
+
+import java.text.ParsePosition;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * @author lenovo
+ *
+ */
+public enum DataObjectEnum {
+	USER_FIELD_MAP("user-table-field-map"),
+	DEPT_FIELD_MAP("dept-table-field-map"),
+	ROLE_FIELD_MAP("role-table-field-map"),
+	FUNCTION_FIELD_MAP("function-table-field-map");
+	public JSONObject jsonObject;
+	
+	
+	private DataObjectEnum(String key) {
+		Object parse = JSONObject.parse(this.jsonObjecttr);
+		if(parse instanceof  JSONObject){
+			JSONObject tt=(JSONObject)parse;
+			Object object = tt.get("compatibility");
+			if(object instanceof  JSONObject){
+				JSONObject jsonObject2=(JSONObject)object;
+				if(jsonObject2 instanceof JSONObject){
+				this.jsonObject=(JSONObject)jsonObject2.get(key);
+				}
+			}
+		}
+		
+	}
+	
+	private String jsonObjecttr="{'compatibility':{" +
+ 		    "'user-table-field-map':{'oid':'pluid','id':'plusername','name':'pltruename','password':'plpassword','usertype':'plusertype','email':'plemail','description':'pldesc','creator':'plcreateuser','createtime':'plcreatetime','lastmodifier':'plupdateuser','lastmodifytime':'plupdatetime','secretgrade':'plsecretgrade'},"+
+ 		    "'role-table-field-map':{'oid':'pluid','name':'plname','description':'pldesc','creator':'plcreateuser','createtime':'plcreatetime','lastmodifier':'plupdateuser','lastmodifytime':'plupdatetime'},"+
+ 		   "'dept-table-field-map':{'oid':'pluid','id':'plnum','name':'plname','pkfatherdepartment':'plparentuid','description':'pldesc','creator':'plcreateuser','createtime':'plcreatetime','lastmodifier':'plupdateuser','lastmodifytime':'plupdatetime'},"+
+ 		   "'function-table-field-map':{'oid':'ploid','id':'plmoduleno','name':'plname','logname':'plaliasname','parentfunctionid':'plparentid'}" +
+ 		   "}}";
+		
+	
+	public SmUserVO[] changeUserObjectToSmUserVOs(UserObject[] userObjects){
+		SmUserVO[] smUserVOs=new SmUserVO[userObjects.length];
+		for (int i=0; i<userObjects.length;i++) {
+			smUserVOs[i]=changeUserObjectToSmUserVO(userObjects[i]);
+		}
+		return smUserVOs;
+	}
+	public SmUserVO changeUserObjectToSmUserVO(UserObject userObject){
+		SmUserVO smUserVO=new SmUserVO();
+		smUserVO.setBtmname("user");
+		smUserVO.setOid(userObject.getId());//鐢ㄦ埛涓婚敭
+		smUserVO.setId(userObject.getUserName());//鐢ㄦ埛璐﹀彿
+		smUserVO.setName(userObject.getTrueName());//鐢ㄦ埛濮撳悕
+		smUserVO.setUserType(userObject.getUserType()+"");//鐢ㄦ埛绫诲瀷锛�
+		if(userObject.getUserType()==1){//绠$悊鍛樼敤鎴�
+			smUserVO.setUserTypeText("绠$悊鍛樼敤鎴�");//鐢ㄦ埛绫诲瀷鏄剧ず鏂囨湰
+		}else{
+			smUserVO.setUserTypeText("鏅�氱敤鎴�");//鐢ㄦ埛绫诲瀷鏄剧ず鏂囨湰
+		}
+		smUserVO.setPkPersonName("");//鎵�灞炰汉鍛樺悕绉�
+		smUserVO.setPkPerson("");//鎵�灞炰汉鍛�
+		smUserVO.setDisabledate(null);//澶辨晥鏃ユ湡
+		smUserVO.setEmail(userObject.getEmail());//閭
+		smUserVO.setDescription(userObject.getDesc());//鎻忚堪
+		smUserVO.setTel(null);//鐢佃瘽
+		smUserVO.setRtxNo(null);//RTX鑱旂郴鍙�
+		smUserVO.setIMNo(null);// 瀹炴椂閫氳杞欢璐﹀彿
+		smUserVO.setPkDepartment(null);//鎵�灞為儴闂紱
+		smUserVO.setPkDepartmentName(null);//鎵�灞為儴闂ㄥ悕绉帮紱
+		smUserVO.setPkDuty(null);//鎵�灞炶亴鍔�
+		smUserVO.setPkDutyName(null);//鎵�灞炶亴鍔″悕绉�
+		smUserVO.setPkPasswordStrategy(null);//鎵�灞炲瘑鐮佸畨鍏ㄧ瓥鐣�
+		smUserVO.setPkPasswordStrategyName(null);//鎵�灞炲瘑鐮佸畨鍏ㄧ瓥鐣�
+		smUserVO.setLastLoginTime(null);//鏈�鍚庣櫥褰曟椂闂�
+		smUserVO.setLastModifyPasswordTime(ChangeStrToDate(userObject.getPwdUpdateTime()));//鏈�鍚庝慨鏀瑰瘑鐮佹槸鍑�
+		smUserVO.setPwdWrongCount(0);//瀵嗙爜閿欒娆℃暟
+		smUserVO.setSex(null);//鎬у埆
+		smUserVO.setSexText(null);//鎬у埆鏄剧ず鍚嶇О
+		smUserVO.setLangCode(null);//榛樿鐨勮瑷�缂栫爜
+		smUserVO.setLangCodeText(null);//榛樿鐨勮瑷�鍚嶇О
+		smUserVO.setLockFlag(userObject.getStatus()==1?true:false);//鏄惁閿佸畾;
+		smUserVO.setPhoto(null);//澶村儚
+		//smUserVO.setSecretGrade(userObject.getSecretGrade());
+		smUserVO.setCreator(userObject.getCreateUser());//鍒涘缓鑰�
+		smUserVO.setCreateTime(ChangeStrToDate(userObject.getCreateTime()));//鍒涘缓鏃堕棿
+		smUserVO.setLastModifier(userObject.getUpdateUser());//淇敼鑰�
+		smUserVO.setLastModifyTime(ChangeStrToDate(userObject.getUpdateTime()));//淇敼鏃堕棿
+		return smUserVO;
+	}
+	public OrgDepartmentVO[] changeDeptObjectToOrgDepartmentVOs(DeptObject[] deptObjects){
+		OrgDepartmentVO[] departmentVOs=new OrgDepartmentVO[deptObjects.length];
+		for (int i = 0; i < deptObjects.length; i++) {
+			departmentVOs[i]=changeDeptObjectToOrgDepartmentVO(deptObjects[i]);
+		}
+		return departmentVOs;
+		
+	}
+	public OrgDepartmentVO changeDeptObjectToOrgDepartmentVO(
+			DeptObject deptObject) {
+		// TODO Auto-generated method stub
+		OrgDepartmentVO departmentVOs=new OrgDepartmentVO();
+		departmentVOs.setBtmname("pldept");
+		departmentVOs.setOid(deptObject.getId());
+		departmentVOs.setId(deptObject.getNum());
+		departmentVOs.setName(deptObject.getName());
+		departmentVOs.setPkFatherDepartment(deptObject.getParentId());
+		departmentVOs.setDescription(deptObject.getDescription());
+		departmentVOs.setCreator(deptObject.getCreateUser());
+		departmentVOs.setCreateTime(ChangeStrToDate(deptObject.getCreateTime()));
+		departmentVOs.setLastModifier(deptObject.getUpdateUser());
+		departmentVOs.setLastModifyTime(ChangeStrToDate(deptObject.getUpdateTime()));
+		departmentVOs.setLcStatus(deptObject.getStatus()+"");
+		return departmentVOs;
+	}
+	public SmRoleVO[]	changeRoleObjectToSmRoleVOs(RoleObject[] objects){
+		SmRoleVO[] smRoleVOs=new SmRoleVO[objects.length];
+		
+		for (int i=0;i<objects.length;i++) {
+			smRoleVOs[i]=changeRoleObjectToSmRoleVO(objects[i]);
+		}
+		return smRoleVOs;
+	}
+	public SmRoleVO	changeRoleObjectToSmRoleVO(RoleObject object){
+		SmRoleVO smRoleVO=new SmRoleVO();
+		smRoleVO.setOid(object.getId());
+		smRoleVO.setName(object.getName());
+		smRoleVO.setDescription(object.getDescription());
+		smRoleVO.setCreator(object.getCreateUser());
+		smRoleVO.setCreateTime(ChangeStrToDate(object.getCreateTime()));
+		smRoleVO.setLastModifier(object.getUpdateUser());
+		smRoleVO.setBtmname("plrole");
+		smRoleVO.setLastModifyTime(ChangeStrToDate(object.getUpdateTime()));
+		return smRoleVO;
+	}
+	
+	private Date ChangeStrToDate(String strDate) {
+		    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		    ParsePosition pos = new ParsePosition(0);
+		    Date strtodate = formatter.parse(strDate, pos);
+		    return strtodate;
+		  }
+
+	}
\ No newline at end of file
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/enumpck/ResourceControlTypeEnum.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/enumpck/ResourceControlTypeEnum.java
new file mode 100644
index 0000000..34309f8
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/enumpck/ResourceControlTypeEnum.java
@@ -0,0 +1,100 @@
+package com.vci.frameworkcore.enumpck;
+
+//import com.vci.frameworkcore.constant.FrameWorkEnumConstant;
+//import com.vci.starter.web.annotation.VciEnum;
+
+import com.vci.starter.web.annotation.VciEnum;
+import com.vci.starter.web.enumpck.BaseEnum;
+
+/**
+ * 鍔熻兘鑿滃崟浣滅敤鍩�
+ * @author weidy
+ * @date 2019/9/25
+ */
+@VciEnum(name = "resourceControlType",text = "鍔熻兘鎺у埗鍖哄煙",description = "鐢佃剳绔疊S,CS,绉诲姩绔�,闆嗘垚,寰湇鍔�")
+public enum ResourceControlTypeEnum implements BaseEnum {
+    /**
+     * 鐢佃剳绔疊/S
+     */
+    BS("resourceControlType_bs","B/S"),
+    /**
+     * 鐢佃剳绔疌/S
+     */
+    CS("resourceControlType_cs","C/S"),
+
+    /**
+     * .net
+     */
+    DOTNET("dotnet","C#"),
+    /**
+     * 绉诲姩绔�
+     */
+    MOBILE("resourceControlType_mobile","绉诲姩绔�");
+
+    /**
+     * 鏋氫妇鐨勫��
+     */
+    private String value;
+
+    /**
+     * 鏋氫妇鏄剧ず鏂囨湰
+     */
+    private String text;
+
+    /**
+     * 鑾峰彇鏋氫妇鍊�
+     * @return 鏋氫妇鍊�
+     */
+    @Override
+    public String getValue() {
+        return value;
+    }
+
+    /**
+     * 鑾峰彇鏋氫妇鏄剧ず鏂囨湰
+     * @return  鏄剧ず鏂囨湰
+     */
+    @Override
+    public String getText() {
+        return text;
+    }
+
+    /**
+     * 鏋勯�犲嚱鏁�
+     * @param value 鍊�
+     * @param text 鏄剧ず鏂囨湰
+     */
+    private ResourceControlTypeEnum(String value, String text){
+        this.value = value;
+        this.text = text;
+    }
+
+    /**
+     * 鏍规嵁鍚嶇О鑾峰彇瀵瑰簲鐨勬灇涓惧��
+     * @param text 鍚嶇О
+     * @return 鏋氫妇鍊�
+     */
+    public static String getValueByText(String text){
+        for(ResourceControlTypeEnum wenum : ResourceControlTypeEnum.values()){
+            if(wenum.getText().equalsIgnoreCase(text)){
+                return wenum.getValue();
+            }
+        }
+        return "";
+    }
+
+    /**
+     * 鏍规嵁鏋氫妇鍊艰幏鍙栧悕绉�
+     * @param value 鏋氫妇鍊�
+     * @return 鍚嶇О
+     */
+    public static String getTextByValue(String value){
+        for(ResourceControlTypeEnum wenum : ResourceControlTypeEnum.values()){
+            if(wenum.getValue().equalsIgnoreCase(value)){
+                return wenum.getText();
+            }
+        }
+        return "";
+    }
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/enumpck/RoleClassifyEnum.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/enumpck/RoleClassifyEnum.java
new file mode 100644
index 0000000..2696393
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/enumpck/RoleClassifyEnum.java
@@ -0,0 +1,104 @@
+package com.vci.frameworkcore.enumpck;
+import com.vci.starter.web.annotation.VciEnum;
+import com.vci.starter.web.enumpck.BaseEnum;
+
+/**
+ * 瑙掕壊绫诲瀷
+ * @author weidy
+ * @date 2019/7/16 8:56 AM
+ */
+@VciEnum(name = "roleclassify",text = "瑙掕壊绫诲瀷",description = "绠$悊瑙掕壊锛屼笟鍔¤鑹�")
+public enum RoleClassifyEnum implements BaseEnum {
+    /**
+     * 涓氬姟瑙掕壊
+     */
+    BUSINESS("roleclassify_business","涓氬姟瑙掕壊"),
+    /**
+     * 绠$悊瑙掕壊
+     */
+    MANAGE("roleclassify_manage","绠$悊瑙掕壊");
+
+    //roleclassify_securitymanage 鏄笁鍛樼鐞嗙殑瑙掕壊锛屽湪浠讳綍鐨勯〉闈㈤兘涓嶆樉绀�
+    /**
+     * 鏋氫妇鐨勫��
+     */
+    private String value;
+
+    /**
+     * 鏋氫妇鏄剧ず鏂囨湰
+     */
+    private String text;
+
+    /**
+     * 鑾峰彇鏋氫妇鍊�
+     * @return 鏋氫妇鍊�
+     */
+    @Override
+    public String getValue() {
+        return value;
+    }
+
+    /**
+     * 璁剧疆鏋氫妇鍊�
+     * @param value 鏋氫妇鍊�
+     */
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    /**
+     * 鑾峰彇鏋氫妇鏄剧ず鏂囨湰
+     * @return  鏄剧ず鏂囨湰
+     */
+    @Override
+    public String getText() {
+        return text;
+    }
+
+    /**
+     * 璁剧疆鏄剧ず鏂囨湰
+     * @param text 鏄剧ず鏂囨湰
+     */
+    public void setText(String text) {
+        this.text = text;
+    }
+
+    /**
+     * 鏋勯�犲嚱鏁�
+     * @param value 鍊�
+     * @param text 鏄剧ず鏂囨湰
+     */
+    private RoleClassifyEnum(String value, String text){
+        this.value = value;
+        this.text = text;
+    }
+
+    /**
+     * 鏍规嵁鍚嶇О鑾峰彇瀵瑰簲鐨勬灇涓惧��
+     * @param text 鍚嶇О
+     * @return 鏋氫妇鍊�
+     */
+    public static String getValueByText(String text){
+        for(RoleClassifyEnum wenum : RoleClassifyEnum.values()){
+            if(wenum.getText().equalsIgnoreCase(text)){
+                return wenum.getValue();
+            }
+        }
+        return "";
+    }
+
+    /**
+     * 鏍规嵁鏋氫妇鍊艰幏鍙栧悕绉�
+     * @param value 鏋氫妇鍊�
+     * @return 鍚嶇О
+     */
+    public static String getTextByValue(String value){
+        for(RoleClassifyEnum wenum : RoleClassifyEnum.values()){
+            if(wenum.getValue().equalsIgnoreCase(value)){
+                return wenum.getText();
+            }
+        }
+        return "";
+    }
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/enumpck/RoleControlAreaEnum.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/enumpck/RoleControlAreaEnum.java
new file mode 100644
index 0000000..f09fc71
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/enumpck/RoleControlAreaEnum.java
@@ -0,0 +1,109 @@
+package com.vci.frameworkcore.enumpck;
+
+//import com.vci.frameworkcore.constant.FrameWorkEnumConstant;
+
+import com.vci.starter.web.enumpck.BaseEnum;
+
+/**
+ * 瑙掕壊鎺у埗鍖哄煙
+ * @author weidy
+ * @date 2019/9/25
+ */
+//@VciEnum(name = FrameWorkEnumConstant.ROLE_CONTROL_AREA,text = "瑙掕壊鎺у埗鍖哄煙",description = "鐢佃剳绔疊S,CS,绉诲姩绔�,闆嗘垚,寰湇鍔�")
+public enum RoleControlAreaEnum implements BaseEnum {
+    /**
+     * 鐢佃剳绔疊/S
+     */
+    BS("role_bs","鐢佃剳绔疊/S"),
+    /**
+     * 鐢佃剳绔疌/S
+     */
+    CS("role_cs","鐢佃剳绔疌/S"),
+    /**
+     * 绉诲姩绔�
+     */
+    MOBILE("role_mobile","绉诲姩绔�");
+
+    /**
+     * 鏋氫妇鐨勫��
+     */
+    private String value;
+
+    /**
+     * 鏋氫妇鏄剧ず鏂囨湰
+     */
+    private String text;
+
+    /**
+     * 鑾峰彇鏋氫妇鍊�
+     * @return 鏋氫妇鍊�
+     */
+    @Override
+    public String getValue() {
+        return value;
+    }
+
+    /**
+     * 璁剧疆鏋氫妇鍊�
+     * @param value 鏋氫妇鍊�
+     */
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    /**
+     * 鑾峰彇鏋氫妇鏄剧ず鏂囨湰
+     * @return  鏄剧ず鏂囨湰
+     */
+    @Override
+    public String getText() {
+        return text;
+    }
+
+    /**
+     * 璁剧疆鏄剧ず鏂囨湰
+     * @param text 鏄剧ず鏂囨湰
+     */
+    public void setText(String text) {
+        this.text = text;
+    }
+
+    /**
+     * 鏋勯�犲嚱鏁�
+     * @param value 鍊�
+     * @param text 鏄剧ず鏂囨湰
+     */
+    private RoleControlAreaEnum(String value, String text){
+        this.value = value;
+        this.text = text;
+    }
+
+    /**
+     * 鏍规嵁鍚嶇О鑾峰彇瀵瑰簲鐨勬灇涓惧��
+     * @param text 鍚嶇О
+     * @return 鏋氫妇鍊�
+     */
+    public static String getValueByText(String text){
+        for(RoleControlAreaEnum wenum : RoleControlAreaEnum.values()){
+            if(wenum.getText().equalsIgnoreCase(text)){
+                return wenum.getValue();
+            }
+        }
+        return "";
+    }
+
+    /**
+     * 鏍规嵁鏋氫妇鍊艰幏鍙栧悕绉�
+     * @param value 鏋氫妇鍊�
+     * @return 鍚嶇О
+     */
+    public static String getTextByValue(String value){
+        for(RoleControlAreaEnum wenum : RoleControlAreaEnum.values()){
+            if(wenum.getValue().equalsIgnoreCase(value)){
+                return wenum.getText();
+            }
+        }
+        return "";
+    }
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/lcstatuspck/FrameworkDataLCStatus.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/lcstatuspck/FrameworkDataLCStatus.java
new file mode 100644
index 0000000..0578a94
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/lcstatuspck/FrameworkDataLCStatus.java
@@ -0,0 +1,115 @@
+package com.vci.frameworkcore.lcstatuspck;
+
+
+import com.vci.starter.web.annotation.VciLifeCycle;
+import com.vci.starter.web.annotation.VciLifeCycleTrans;
+import com.vci.starter.web.constant.FrameWorkLcStatusConstant;
+import com.vci.starter.web.enumpck.BaseEnum;
+
+import static com.vci.frameworkcore.constant.FrameWorkDefaultValueConstant.FRAMEWORK_DATA_DISABLED;
+import static com.vci.frameworkcore.constant.FrameWorkDefaultValueConstant.FRAMEWORK_DATA_ENABLED;
+
+/**
+ * 鐢ㄦ埛锛岃鑹诧紝閮ㄩ棬锛岃亴鍔★紝宀椾綅锛岃亴绾�
+ * @author weidy
+ */
+@VciLifeCycle(name= FrameWorkLcStatusConstant.FRAME_WORK_LIFE_CYCLE_NAME,text = "骞冲彴鍩虹鏁版嵁閫氱敤鐢熷懡鍛ㄦ湡",startStatus = FRAMEWORK_DATA_ENABLED,
+        translations = {
+                @VciLifeCycleTrans(source = FRAMEWORK_DATA_ENABLED, target = FRAMEWORK_DATA_DISABLED,name="鍋滅敤"),
+                @VciLifeCycleTrans(source = FRAMEWORK_DATA_DISABLED, target =FRAMEWORK_DATA_ENABLED,name="鍚敤")
+        })
+public enum FrameworkDataLCStatus implements BaseEnum {
+
+
+    /**
+     * 鍚敤
+     */
+    ENABLED(FRAMEWORK_DATA_ENABLED,"鍚敤"),
+
+    /**
+     * 鍋滅敤
+     */
+    DISABLED(FRAMEWORK_DATA_DISABLED,"鍋滅敤");
+
+    /**
+     * 鏋氫妇鍊�
+     */
+    private String value;
+
+    /**
+     * 鏋氫妇鏄剧ず鍊�
+     */
+    private String text;
+    /**
+     * 鑾峰彇鏋氫妇鍊�
+     * @return 鏋氫妇鍊�
+     */
+    @Override
+    public String getValue() {
+        return value;
+    }
+
+    /**
+     * 璁剧疆鏋氫妇鍊�
+     * @param value 鏋氫妇鍊�
+     */
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    /**
+     * 鑾峰彇鏄剧ず鏂囨湰
+     * @return 鏄剧ず鏂囨湰
+     */
+    @Override
+    public String getText() {
+        return text;
+    }
+
+    /**
+     * 璁剧疆鏄剧ず鏂囨湰
+     * @param text 鏄剧ず鏂囨湰
+     */
+    public void setText(String text) {
+        this.text = text;
+    }
+
+    /**
+     * 鏋氫妇鍐呴儴鏋勯�犳柟娉�
+     * @param value 鏋氫妇鍊�
+     * @param text 鏄剧ず鏂囨湰
+     */
+    private FrameworkDataLCStatus(String value, String text){
+        this.value = value;
+        this.text = text;
+    }
+
+    /**
+     * 鏍规嵁鏋氫妇鐨勫�艰幏鍙栨樉绀烘枃鏈�
+     * @param value 鏋氫妇鍊�
+     * @return 鏄剧ず鏂囨湰
+     */
+    public static String getTextByValue(String value){
+        for(FrameworkDataLCStatus eu:FrameworkDataLCStatus.values()){
+            if(eu.value.equalsIgnoreCase(value)){
+                return eu.text;
+            }
+        }
+        return "";
+    }
+
+    /**
+     * 鏍规嵁鏋氫妇鏄剧ず鏂囨湰鑾峰彇鏋氫妇鍊�
+     * @param text 鏄剧ず鏂囨湰
+     * @return 鏋氫妇鍊�
+     */
+    public static String getValueByText(String text){
+        for(FrameworkDataLCStatus eu:FrameworkDataLCStatus.values()){
+            if(eu.text.equalsIgnoreCase(text)){
+                return eu.value;
+            }
+        }
+        return "";
+    }
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/lcstatuspck/ReleaseDataLCStatus.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/lcstatuspck/ReleaseDataLCStatus.java
new file mode 100644
index 0000000..ef00645
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/lcstatuspck/ReleaseDataLCStatus.java
@@ -0,0 +1,118 @@
+package com.vci.frameworkcore.lcstatuspck;
+
+
+import com.vci.starter.web.annotation.VciLifeCycle;
+import com.vci.starter.web.annotation.VciLifeCycleTrans;
+import com.vci.starter.web.constant.FrameWorkLcStatusConstant;
+import com.vci.starter.web.enumpck.BaseEnum;
+
+import static com.vci.frameworkcore.constant.FrameWorkDefaultValueConstant.*;
+
+/**
+ * 鍙戝竷鐢熷懡鍛ㄦ湡
+ * @author weidy
+ * @date 2020/1/2
+ */
+@VciLifeCycle(name= FrameWorkLcStatusConstant.RELEASE_LIFE_CYCLE,text = "鍙戝竷閫氱敤鐢熷懡鍛ㄦ湡",startStatus = FRAMEWORK_RELEASE_EDITING,
+        translations = {
+                @VciLifeCycleTrans(source = FRAMEWORK_RELEASE_EDITING, target = FRAMEWORK_RELEASE_AUDITING,name="鎻愪氦瀹℃壒"),
+                @VciLifeCycleTrans(source = FRAMEWORK_RELEASE_AUDITING, target =FRAMEWORK_RELEASE_RELEASED,name="瀹℃壒閫氳繃"),
+                @VciLifeCycleTrans(source =FRAMEWORK_RELEASE_EDITING, target = FRAMEWORK_RELEASE_RELEASED,name="鐩存帴鍙戝竷")
+        })
+public enum ReleaseDataLCStatus implements BaseEnum {
+    /**
+     * 缂栬緫涓�
+     */
+    EDITING(FRAMEWORK_RELEASE_EDITING,"缂栬緫涓�"),
+
+    /**
+     * 瀹℃壒涓�
+     */
+    AUDITING(FRAMEWORK_RELEASE_AUDITING,"瀹℃壒涓�"),
+
+    /**
+     * 宸插彂甯�
+     */
+    RELEASED(FRAMEWORK_RELEASE_RELEASED,"宸插彂甯�");
+
+    /**
+     * 鏋氫妇鍊�
+     */
+    private String value;
+
+    /**
+     * 鏋氫妇鏄剧ず鍊�
+     */
+    private String text;
+    /**
+     * 鑾峰彇鏋氫妇鍊�
+     * @return 鏋氫妇鍊�
+     */
+    @Override
+    public String getValue() {
+        return value;
+    }
+
+    /**
+     * 璁剧疆鏋氫妇鍊�
+     * @param value 鏋氫妇鍊�
+     */
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    /**
+     * 鑾峰彇鏄剧ず鏂囨湰
+     * @return 鏄剧ず鏂囨湰
+     */
+    @Override
+    public String getText() {
+        return text;
+    }
+
+    /**
+     * 璁剧疆鏄剧ず鏂囨湰
+     * @param text 鏄剧ず鏂囨湰
+     */
+    public void setText(String text) {
+        this.text = text;
+    }
+
+    /**
+     * 鏋氫妇鍐呴儴鏋勯�犳柟娉�
+     * @param value 鏋氫妇鍊�
+     * @param text 鏄剧ず鏂囨湰
+     */
+    private ReleaseDataLCStatus(String value, String text){
+        this.value = value;
+        this.text = text;
+    }
+
+    /**
+     * 鏍规嵁鏋氫妇鐨勫�艰幏鍙栨樉绀烘枃鏈�
+     * @param value 鏋氫妇鍊�
+     * @return 鏄剧ず鏂囨湰
+     */
+    public static String getTextByValue(String value){
+        for(ReleaseDataLCStatus eu:ReleaseDataLCStatus.values()){
+            if(eu.value.equalsIgnoreCase(value)){
+                return eu.text;
+            }
+        }
+        return "";
+    }
+
+    /**
+     * 鏍规嵁鏋氫妇鏄剧ず鏂囨湰鑾峰彇鏋氫妇鍊�
+     * @param text 鏄剧ず鏂囨湰
+     * @return 鏋氫妇鍊�
+     */
+    public static String getValueByText(String text){
+        for(ReleaseDataLCStatus eu:ReleaseDataLCStatus.values()){
+            if(eu.text.equalsIgnoreCase(text)){
+                return eu.value;
+            }
+        }
+        return "";
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/model/OrgDeptForPlatform1.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/model/OrgDeptForPlatform1.java
new file mode 100644
index 0000000..569307b
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/model/OrgDeptForPlatform1.java
@@ -0,0 +1,177 @@
+package com.vci.frameworkcore.model;
+
+import com.vci.frameworkcore.constant.FrameWorkBtmTypeConstant;
+import com.vci.starter.web.annotation.Id;
+import com.vci.starter.web.annotation.VciBtmType;
+import com.vci.starter.web.constant.FrameWorkLcStatusConstant;
+
+import java.util.Date;
+
+/**
+ * 鍘熷钩鍙扮殑閮ㄩ棬
+ * @author weidy
+ * @date 2020/2/27
+ */
+@VciBtmType(name = FrameWorkBtmTypeConstant.ORG_DEPARTMENT_BTM_TYPE,tableName = "pldept",lifeCycle = FrameWorkLcStatusConstant.EMTYPE_LIFE_CYCLE)
+public class OrgDeptForPlatform1 implements java.io.Serializable{
+    /**
+     * 涓婚敭
+     */
+    @Id
+    private String pluid;
+
+    /**
+     * 閮ㄩ棬鍚嶇О
+     */
+    private String plname;
+
+    /**
+     * 閮ㄩ棬缂栧彿
+     */
+    private String plnum;
+
+    /**
+     * 鍋滅敤鍚敤鐘舵��
+     */
+    private Short plstatus;
+
+    /**
+     * 涓婄骇閮ㄩ棬
+     */
+    private String plparentuid;
+
+    /**
+     * 鎻忚堪
+     */
+    private String pldesc;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    private Date plcreatetime;
+
+    /**
+     * 鍒涘缓浜�
+     */
+    private String plcreateuser;
+
+    /**
+     * 鏈�鍚庝慨鏀规椂闂�
+     */
+    private Date plupdatetime;
+
+    /**
+     * 鏈�鍚庝慨鏀逛汉
+     */
+    private String plupdateuser;
+
+    /**
+     * 涓嶇煡閬撳仛鍟ョ殑
+     */
+    private String pllicensors;
+
+    public String getPluid() {
+        return pluid;
+    }
+
+    public void setPluid(String pluid) {
+        this.pluid = pluid == null ? null : pluid.trim();
+    }
+
+    public String getPlname() {
+        return plname;
+    }
+
+    public void setPlname(String plname) {
+        this.plname = plname == null ? null : plname.trim();
+    }
+
+    public String getPlnum() {
+        return plnum;
+    }
+
+    public void setPlnum(String plnum) {
+        this.plnum = plnum == null ? null : plnum.trim();
+    }
+
+    public Short getPlstatus() {
+        return plstatus;
+    }
+
+    public void setPlstatus(Short plstatus) {
+        this.plstatus = plstatus;
+    }
+
+    public String getPlparentuid() {
+        return plparentuid;
+    }
+
+    public void setPlparentuid(String plparentuid) {
+        this.plparentuid = plparentuid == null ? null : plparentuid.trim();
+    }
+
+    public String getPldesc() {
+        return pldesc;
+    }
+
+    public void setPldesc(String pldesc) {
+        this.pldesc = pldesc == null ? null : pldesc.trim();
+    }
+
+    public Date getPlcreatetime() {
+        return plcreatetime;
+    }
+
+    public void setPlcreatetime(Date plcreatetime) {
+        this.plcreatetime = plcreatetime;
+    }
+
+    public String getPlcreateuser() {
+        return plcreateuser;
+    }
+
+    public void setPlcreateuser(String plcreateuser) {
+        this.plcreateuser = plcreateuser == null ? null : plcreateuser.trim();
+    }
+
+    public Date getPlupdatetime() {
+        return plupdatetime;
+    }
+
+    public void setPlupdatetime(Date plupdatetime) {
+        this.plupdatetime = plupdatetime;
+    }
+
+    public String getPlupdateuser() {
+        return plupdateuser;
+    }
+
+    public void setPlupdateuser(String plupdateuser) {
+        this.plupdateuser = plupdateuser == null ? null : plupdateuser.trim();
+    }
+
+    public String getPllicensors() {
+        return pllicensors;
+    }
+
+    public void setPllicensors(String pllicensors) {
+        this.pllicensors = pllicensors == null ? null : pllicensors.trim();
+    }
+
+    @Override
+    public String toString() {
+        return "OrgDeptForPlatform1{" +
+                "pluid='" + pluid + '\'' +
+                ", plname='" + plname + '\'' +
+                ", plnum='" + plnum + '\'' +
+                ", plstatus=" + plstatus +
+                ", plparentuid='" + plparentuid + '\'' +
+                ", pldesc='" + pldesc + '\'' +
+                ", plcreatetime=" + plcreatetime +
+                ", plcreateuser='" + plcreateuser + '\'' +
+                ", plupdatetime=" + plupdatetime +
+                ", plupdateuser='" + plupdateuser + '\'' +
+                ", pllicensors='" + pllicensors + '\'' +
+                '}';
+    }
+}
\ No newline at end of file
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/model/SmFunctionForPlatform1.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/model/SmFunctionForPlatform1.java
new file mode 100644
index 0000000..b0934fe
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/model/SmFunctionForPlatform1.java
@@ -0,0 +1,247 @@
+package com.vci.frameworkcore.model;
+
+import com.vci.starter.web.annotation.VciBtmType;
+import com.vci.starter.web.constant.FrameWorkLcStatusConstant;
+
+/**
+ * 鍘熷钩鍙扮殑鑿滃崟鍔熻兘 v1.0銆乿1.1鍜寁1.2
+ * @author weidy
+ * @date 2020/2/27
+ */
+@VciBtmType(name = "function",text = "绯荤粺鍔熻兘鑿滃崟",tableName = "PLFUNCTION",lifeCycle = FrameWorkLcStatusConstant.EMTYPE_LIFE_CYCLE)
+public class SmFunctionForPlatform1 implements java.io.Serializable{
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = -139562478789030648L;
+
+    /**
+     * 涓婚敭
+     */
+    private String ploid;
+
+    /**
+     * 鍚嶇О
+     */
+    private String plname;
+
+    /**
+     * 涓婄骇涓婚敭
+     */
+    private String plparentid;
+
+    /**
+     * C/s绔矾寰�
+     */
+    private String plresourcec;
+
+    /**
+     * C/s鍚庣紑
+     */
+    private String plsuffixc;
+
+    /**
+     * B/s绔矾寰�
+     */
+    private String plresourceb;
+
+    /**
+     * b/s绔悗缂�
+     */
+    private String plsuffixb;
+
+    /**
+     * 鍔熻兘缂栧彿
+     */
+    private Integer plmoduleno;
+
+    /**
+     * 鎻忚堪
+     */
+    private String pldesc;
+
+    /**
+     * 鐢熸晥鐘舵��
+     */
+    private Short plisvalid;
+
+    /**
+     * 鍥炬爣
+     */
+    private String plimage;
+
+    /**
+     * 鎺掑簭鍙�
+     */
+    private Integer plmodulesequence;
+
+    /**
+     * 鏃ュ織涓殑鍚嶇О
+     */
+    private String plaliasname;
+
+    /**
+     * 妯″潡鍚嶇О
+     */
+    private String plmodulename;
+
+    /**
+     * C#鐨勮矾寰�
+     */
+    private String plresourcedotnet;
+
+    /**
+     * 绉诲姩鐨勮矾寰�
+     */
+    private String plresourcemobil;
+
+    public String getPloid() {
+        return ploid;
+    }
+
+    public void setPloid(String ploid) {
+        this.ploid = ploid == null ? null : ploid.trim();
+    }
+
+    public String getPlname() {
+        return plname;
+    }
+
+    public void setPlname(String plname) {
+        this.plname = plname == null ? null : plname.trim();
+    }
+
+    public String getPlparentid() {
+        return plparentid;
+    }
+
+    public void setPlparentid(String plparentid) {
+        this.plparentid = plparentid == null ? null : plparentid.trim();
+    }
+
+    public String getPlresourcec() {
+        return plresourcec;
+    }
+
+    public void setPlresourcec(String plresourcec) {
+        this.plresourcec = plresourcec == null ? null : plresourcec.trim();
+    }
+
+    public String getPlsuffixc() {
+        return plsuffixc;
+    }
+
+    public void setPlsuffixc(String plsuffixc) {
+        this.plsuffixc = plsuffixc == null ? null : plsuffixc.trim();
+    }
+
+    public String getPlresourceb() {
+        return plresourceb;
+    }
+
+    public void setPlresourceb(String plresourceb) {
+        this.plresourceb = plresourceb == null ? null : plresourceb.trim();
+    }
+
+    public String getPlsuffixb() {
+        return plsuffixb;
+    }
+
+    public void setPlsuffixb(String plsuffixb) {
+        this.plsuffixb = plsuffixb == null ? null : plsuffixb.trim();
+    }
+
+    public Integer getPlmoduleno() {
+        return plmoduleno;
+    }
+
+    public void setPlmoduleno(Integer plmoduleno) {
+        this.plmoduleno = plmoduleno;
+    }
+
+    public String getPldesc() {
+        return pldesc;
+    }
+
+    public void setPldesc(String pldesc) {
+        this.pldesc = pldesc == null ? null : pldesc.trim();
+    }
+
+    public Short getPlisvalid() {
+        return plisvalid;
+    }
+
+    public void setPlisvalid(Short plisvalid) {
+        this.plisvalid = plisvalid;
+    }
+
+    public String getPlimage() {
+        return plimage;
+    }
+
+    public void setPlimage(String plimage) {
+        this.plimage = plimage == null ? null : plimage.trim();
+    }
+
+    public Integer getPlmodulesequence() {
+        return plmodulesequence;
+    }
+
+    public void setPlmodulesequence(Integer plmodulesequence) {
+        this.plmodulesequence = plmodulesequence;
+    }
+
+    public String getPlaliasname() {
+        return plaliasname;
+    }
+
+    public void setPlaliasname(String plaliasname) {
+        this.plaliasname = plaliasname == null ? null : plaliasname.trim();
+    }
+
+    public String getPlmodulename() {
+        return plmodulename;
+    }
+
+    public void setPlmodulename(String plmodulename) {
+        this.plmodulename = plmodulename == null ? null : plmodulename.trim();
+    }
+
+    public String getPlresourcedotnet() {
+        return plresourcedotnet;
+    }
+
+    public void setPlresourcedotnet(String plresourcedotnet) {
+        this.plresourcedotnet = plresourcedotnet == null ? null : plresourcedotnet.trim();
+    }
+
+    public String getPlresourcemobil() {
+        return plresourcemobil;
+    }
+
+    public void setPlresourcemobil(String plresourcemobil) {
+        this.plresourcemobil = plresourcemobil == null ? null : plresourcemobil.trim();
+    }
+
+    @Override
+    public String toString() {
+        return "SmFunctionForPlatform1{" +
+                "ploid='" + ploid + '\'' +
+                ", plname='" + plname + '\'' +
+                ", plparentid='" + plparentid + '\'' +
+                ", plresourcec='" + plresourcec + '\'' +
+                ", plsuffixc='" + plsuffixc + '\'' +
+                ", plresourceb='" + plresourceb + '\'' +
+                ", plsuffixb='" + plsuffixb + '\'' +
+                ", plmoduleno=" + plmoduleno +
+                ", pldesc='" + pldesc + '\'' +
+                ", plisvalid=" + plisvalid +
+                ", plimage='" + plimage + '\'' +
+                ", plmodulesequence=" + plmodulesequence +
+                ", plaliasname='" + plaliasname + '\'' +
+                ", plmodulename='" + plmodulename + '\'' +
+                ", plresourcedotnet='" + plresourcedotnet + '\'' +
+                ", plresourcemobil='" + plresourcemobil + '\'' +
+                '}';
+    }
+}
\ No newline at end of file
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/model/SmPasswordStrategyForPlatform1.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/model/SmPasswordStrategyForPlatform1.java
new file mode 100644
index 0000000..6d8d369
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/model/SmPasswordStrategyForPlatform1.java
@@ -0,0 +1,252 @@
+package com.vci.frameworkcore.model;
+
+import java.util.Date;
+
+/**
+ * 鍘熷钩鍙扮殑瀵嗙爜瀹夊叏绛栫暐
+ */
+public class SmPasswordStrategyForPlatform1 {
+    /**
+     * 涓婚敭
+     */
+    private String pluid;
+
+    /**
+     * 鍚嶇О
+     */
+    private String pname;
+
+    /**
+     * 闀垮害
+     */
+    private Integer plength;
+
+    /**
+     *
+     */
+    private Integer poverdueday;
+
+    /**
+     * 鎻愰啋澶╂暟
+     */
+    private Integer premindday;
+
+    /**
+     * 瀵嗙爜閲嶈瘯娆℃暟
+     */
+    private Integer pretrytime;
+
+    /**
+     * 閿佸畾鏃堕棿
+     */
+    private Integer plocktime;
+
+    /**
+     * 鏄惁榛樿
+     */
+    private Integer plisdefault;
+
+    /**
+     * 鎻忚堪
+     */
+    private String pldesc;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    private Date plcreatetime;
+
+    /**
+     * 鍒涘缓浜�
+     */
+    private String plcreateuser;
+
+    /**
+     * 鏈�鍚庝慨鏀规椂闂�
+     */
+    private Date plupdatetime;
+
+    /**
+     * 鏈�鍚庝慨鏀逛汉
+     */
+    private String plupdateuser;
+
+    /**
+     * 瀵嗙爜鎵�闇�瀛楃绫诲瀷
+     */
+    private Integer pcharspecies;
+
+    /**
+     * 璁稿彲
+     */
+    private String pllicensors;
+
+    /**
+     * 鏈�澶ч暱搴�
+     */
+    private Integer plmaxlength;
+
+    /**
+     * 闇�瑕佺殑绫诲瀷
+     */
+    private Integer plrequiredtype;
+
+    public String getPluid() {
+        return pluid;
+    }
+
+    public void setPluid(String pluid) {
+        this.pluid = pluid == null ? null : pluid.trim();
+    }
+
+    public String getPname() {
+        return pname;
+    }
+
+    public void setPname(String pname) {
+        this.pname = pname == null ? null : pname.trim();
+    }
+
+    public Integer getPlength() {
+        return plength;
+    }
+
+    public void setPlength(Integer plength) {
+        this.plength = plength;
+    }
+
+    public Integer getPoverdueday() {
+        return poverdueday;
+    }
+
+    public void setPoverdueday(Integer poverdueday) {
+        this.poverdueday = poverdueday;
+    }
+
+    public Integer getPremindday() {
+        return premindday;
+    }
+
+    public void setPremindday(Integer premindday) {
+        this.premindday = premindday;
+    }
+
+    public Integer getPretrytime() {
+        return pretrytime;
+    }
+
+    public void setPretrytime(Integer pretrytime) {
+        this.pretrytime = pretrytime;
+    }
+
+    public Integer getPlocktime() {
+        return plocktime;
+    }
+
+    public void setPlocktime(Integer plocktime) {
+        this.plocktime = plocktime;
+    }
+
+    public Integer getPlisdefault() {
+        return plisdefault;
+    }
+
+    public void setPlisdefault(Integer plisdefault) {
+        this.plisdefault = plisdefault;
+    }
+
+    public String getPldesc() {
+        return pldesc;
+    }
+
+    public void setPldesc(String pldesc) {
+        this.pldesc = pldesc == null ? null : pldesc.trim();
+    }
+
+    public Date getPlcreatetime() {
+        return plcreatetime;
+    }
+
+    public void setPlcreatetime(Date plcreatetime) {
+        this.plcreatetime = plcreatetime;
+    }
+
+    public String getPlcreateuser() {
+        return plcreateuser;
+    }
+
+    public void setPlcreateuser(String plcreateuser) {
+        this.plcreateuser = plcreateuser == null ? null : plcreateuser.trim();
+    }
+
+    public Date getPlupdatetime() {
+        return plupdatetime;
+    }
+
+    public void setPlupdatetime(Date plupdatetime) {
+        this.plupdatetime = plupdatetime;
+    }
+
+    public String getPlupdateuser() {
+        return plupdateuser;
+    }
+
+    public void setPlupdateuser(String plupdateuser) {
+        this.plupdateuser = plupdateuser == null ? null : plupdateuser.trim();
+    }
+
+    public Integer getPcharspecies() {
+        return pcharspecies;
+    }
+
+    public void setPcharspecies(Integer pcharspecies) {
+        this.pcharspecies = pcharspecies;
+    }
+
+    public String getPllicensors() {
+        return pllicensors;
+    }
+
+    public void setPllicensors(String pllicensors) {
+        this.pllicensors = pllicensors == null ? null : pllicensors.trim();
+    }
+
+    public Integer getPlmaxlength() {
+        return plmaxlength;
+    }
+
+    public void setPlmaxlength(Integer plmaxlength) {
+        this.plmaxlength = plmaxlength;
+    }
+
+    public Integer getPlrequiredtype() {
+        return plrequiredtype;
+    }
+
+    public void setPlrequiredtype(Integer plrequiredtype) {
+        this.plrequiredtype = plrequiredtype;
+    }
+
+    @Override
+    public String toString() {
+        return "SmPasswordStrategyForPlatform1{" +
+                "pluid='" + pluid + '\'' +
+                ", pname='" + pname + '\'' +
+                ", plength=" + plength +
+                ", poverdueday=" + poverdueday +
+                ", premindday=" + premindday +
+                ", pretrytime=" + pretrytime +
+                ", plocktime=" + plocktime +
+                ", plisdefault=" + plisdefault +
+                ", pldesc='" + pldesc + '\'' +
+                ", plcreatetime=" + plcreatetime +
+                ", plcreateuser='" + plcreateuser + '\'' +
+                ", plupdatetime=" + plupdatetime +
+                ", plupdateuser='" + plupdateuser + '\'' +
+                ", pcharspecies=" + pcharspecies +
+                ", pllicensors='" + pllicensors + '\'' +
+                ", plmaxlength=" + plmaxlength +
+                ", plrequiredtype=" + plrequiredtype +
+                '}';
+    }
+}
\ No newline at end of file
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/model/SmRoleForPlatform1.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/model/SmRoleForPlatform1.java
new file mode 100644
index 0000000..0fd7445
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/model/SmRoleForPlatform1.java
@@ -0,0 +1,152 @@
+package com.vci.frameworkcore.model;
+
+import com.vci.frameworkcore.constant.FrameWorkDefaultValueConstant;
+import com.vci.starter.web.annotation.VciBtmType;
+import com.vci.starter.web.constant.FrameWorkLcStatusConstant;
+
+import java.util.Date;
+
+/**
+ * 鍘熷钩鍙扮殑瑙掕壊绠$悊锛寁1.0銆乿1.1鍜寁1.2
+ * @author weidy
+ * @date 2020/2/27
+ */
+@VciBtmType(name = "role",text = "瑙掕壊",tableName = "plrole",lifeCycle = FrameWorkLcStatusConstant.EMTYPE_LIFE_CYCLE)
+public class SmRoleForPlatform1 implements java.io.Serializable{
+
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = 7774496751646107381L;
+    /**
+     * 涓婚敭
+     */
+    private String pluid;
+
+    /**
+     * 鍚嶇О
+     */
+    private String plname;
+
+    /**
+     * 鎻忚堪
+     */
+    private String pldesc;
+
+    /**
+     * 瑙掕壊绫诲瀷
+     */
+    private Short pltype;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    private Date plcreatetime;
+
+    /**
+     * 鍒涘缓浜�
+     */
+    private String plcreateuser;
+
+    /**
+     * 鏈�鍚庝慨鏀规椂闂�
+     */
+    private Date plupdatetime;
+
+    /**
+     * 鏈�鍚庝慨鏀逛汉
+     */
+    private String plupdateuser;
+
+    /**
+     * 涓嶇煡閬撹繖涓瓧娈电殑浣滅敤
+     */
+    private String pllicensors;
+
+    public String getPluid() {
+        return pluid;
+    }
+
+    public void setPluid(String pluid) {
+        this.pluid = pluid == null ? null : pluid.trim();
+    }
+
+    public String getPlname() {
+        return plname;
+    }
+
+    public void setPlname(String plname) {
+        this.plname = plname == null ? null : plname.trim();
+    }
+
+    public String getPldesc() {
+        return pldesc;
+    }
+
+    public void setPldesc(String pldesc) {
+        this.pldesc = pldesc == null ? null : pldesc.trim();
+    }
+
+    public Short getPltype() {
+        return pltype;
+    }
+
+    public void setPltype(Short pltype) {
+        this.pltype = pltype;
+    }
+
+    public Date getPlcreatetime() {
+        return plcreatetime;
+    }
+
+    public void setPlcreatetime(Date plcreatetime) {
+        this.plcreatetime = plcreatetime;
+    }
+
+    public String getPlcreateuser() {
+        return plcreateuser;
+    }
+
+    public void setPlcreateuser(String plcreateuser) {
+        this.plcreateuser = plcreateuser == null ? null : plcreateuser.trim();
+    }
+
+    public Date getPlupdatetime() {
+        return plupdatetime;
+    }
+
+    public void setPlupdatetime(Date plupdatetime) {
+        this.plupdatetime = plupdatetime;
+    }
+
+    public String getPlupdateuser() {
+        return plupdateuser;
+    }
+
+    public void setPlupdateuser(String plupdateuser) {
+        this.plupdateuser = plupdateuser == null ? null : plupdateuser.trim();
+    }
+
+    public String getPllicensors() {
+        return pllicensors;
+    }
+
+    public void setPllicensors(String pllicensors) {
+        this.pllicensors = pllicensors == null ? null : pllicensors.trim();
+    }
+
+    @Override
+    public String toString() {
+        return "SmRoleForPlatform1{" +
+                "pluid='" + pluid + '\'' +
+                ", plname='" + plname + '\'' +
+                ", pldesc='" + pldesc + '\'' +
+                ", pltype=" + pltype +
+                ", plcreatetime=" + plcreatetime +
+                ", plcreateuser='" + plcreateuser + '\'' +
+                ", plupdatetime=" + plupdatetime +
+                ", plupdateuser='" + plupdateuser + '\'' +
+                ", pllicensors='" + pllicensors + '\'' +
+                '}';
+    }
+}
\ No newline at end of file
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/pagemodel/MenuVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/pagemodel/MenuVO.java
new file mode 100644
index 0000000..275262d
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/pagemodel/MenuVO.java
@@ -0,0 +1,262 @@
+
+package com.vci.frameworkcore.pagemodel;
+
+
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * 瑙嗗浘瀹炰綋绫�
+ *
+ * @author Chill
+ */
+public class MenuVO  {
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 涓婚敭ID
+	 */
+	private String id;
+
+	/**
+	 * 鐖惰妭鐐笽D
+	 */
+	private String parentId;
+
+	/**
+	 * 瀛愬瓩鑺傜偣
+	 */
+	private List<MenuVO> children;
+
+	/**
+	 * 鏄惁鏈夊瓙瀛欒妭鐐�
+	 */
+	private Boolean hasChildren;
+
+
+	/**
+	 * 鑿滃崟缂栧彿
+	 */
+	private String code;
+
+	/**
+	 * 鑿滃崟鍚嶇О
+	 */
+	private String name;
+
+	/**
+	 * 鑿滃崟鍒悕
+	 */
+	private String alias;
+
+	/**
+	 * 璇锋眰鍦板潃
+	 */
+	private String path;
+
+	/**
+	 * 鑿滃崟璧勬簮
+	 */
+	private String source;
+
+	/**
+	 * 鎺掑簭
+	 */
+	private Integer sort;
+
+	/**
+	 * 鑿滃崟绫诲瀷
+	 */
+	private Integer category;
+
+	/**
+	 * 鎿嶄綔鎸夐挳绫诲瀷
+	 */
+	private Integer action;
+
+	/**
+	 * 鏄惁鎵撳紑鏂伴〉闈�
+	 */
+	private Integer isOpen;
+
+	/**
+	 * 澶囨敞
+	 */
+	private String remark;
+
+	/**
+	 * 涓婄骇鑿滃崟
+	 */
+	private String parentName;
+
+	/**
+	 * 鑿滃崟绫诲瀷
+	 */
+	private String categoryName;
+
+	/**
+	 * 鎸夐挳鍔熻兘
+	 */
+	private String actionName;
+
+	/**
+	 * 鏄惁鏂扮獥鍙f墦寮�
+	 */
+	private String isOpenName;
+	/**
+	 * 鍓嶇鏄惁闅愯棌
+	 */
+	private HashMap<String,Boolean> meta = new HashMap<>();
+
+	public String getId() {
+		return id;
+	}
+
+	public void setId(String id) {
+		this.id = id;
+	}
+
+	public String getParentId() {
+		return parentId;
+	}
+
+	public void setParentId(String parentId) {
+		this.parentId = parentId;
+	}
+
+	public List<MenuVO> getChildren() {
+		return children;
+	}
+
+	public void setChildren(List<MenuVO> children) {
+		this.children = children;
+	}
+
+	public Boolean getHasChildren() {
+		return hasChildren;
+	}
+
+	public void setHasChildren(Boolean hasChildren) {
+		this.hasChildren = hasChildren;
+	}
+
+	public String getCode() {
+		return code;
+	}
+
+	public void setCode(String code) {
+		this.code = code;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getAlias() {
+		return alias;
+	}
+
+	public void setAlias(String alias) {
+		this.alias = alias;
+	}
+
+	public String getPath() {
+		return path;
+	}
+
+	public void setPath(String path) {
+		this.path = path;
+	}
+
+	public String getSource() {
+		return source;
+	}
+
+	public void setSource(String source) {
+		this.source = source;
+	}
+
+	public Integer getSort() {
+		return sort;
+	}
+
+	public void setSort(Integer sort) {
+		this.sort = sort;
+	}
+
+	public Integer getCategory() {
+		return category;
+	}
+
+	public void setCategory(Integer category) {
+		this.category = category;
+	}
+
+	public Integer getAction() {
+		return action;
+	}
+
+	public void setAction(Integer action) {
+		this.action = action;
+	}
+
+	public Integer getIsOpen() {
+		return isOpen;
+	}
+
+	public void setIsOpen(Integer isOpen) {
+		this.isOpen = isOpen;
+	}
+
+	public String getRemark() {
+		return remark;
+	}
+
+	public void setRemark(String remark) {
+		this.remark = remark;
+	}
+
+	public String getParentName() {
+		return parentName;
+	}
+
+	public void setParentName(String parentName) {
+		this.parentName = parentName;
+	}
+
+	public String getCategoryName() {
+		return categoryName;
+	}
+
+	public void setCategoryName(String categoryName) {
+		this.categoryName = categoryName;
+	}
+
+	public String getActionName() {
+		return actionName;
+	}
+
+	public void setActionName(String actionName) {
+		this.actionName = actionName;
+	}
+
+	public String getIsOpenName() {
+		return isOpenName;
+	}
+
+	public void setIsOpenName(String isOpenName) {
+		this.isOpenName = isOpenName;
+	}
+
+	public HashMap<String, Boolean> getMeta() {
+		return meta;
+	}
+
+	public void setMeta(HashMap<String, Boolean> meta) {
+		this.meta = meta;
+	}
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/pagemodel/OrgDepartmentVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/pagemodel/OrgDepartmentVO.java
new file mode 100644
index 0000000..9895d7f
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/pagemodel/OrgDepartmentVO.java
@@ -0,0 +1,201 @@
+package com.vci.frameworkcore.pagemodel;
+
+
+import com.vci.starter.web.pagemodel.BaseModelVO;
+
+/**
+ * 閮ㄩ棬鐨勬樉绀哄璞�
+ * @author weidy
+ * @date 2020/3/1
+ */
+public class OrgDepartmentVO extends BaseModelVO {
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = -5784298106204891902L;
+
+    /**
+     * 閮ㄩ棬缂栧彿
+     */
+    private String id;
+
+    /**
+     * 閮ㄩ棬鍚嶇О
+     */
+    private String name;
+
+    /**
+     * 閮ㄩ棬绾у埆
+     */
+    private String departmentLevel;
+
+    /**
+     * 涓婄骇閮ㄩ棬
+     */
+    private String pkFatherDepartment;
+
+    /**
+     * 涓婄骇閮ㄩ棬
+     */
+    private String pkFatherDepartmentName;
+
+    /**
+     * 鎵�灞炵粍缁�
+     */
+    private String pkOrganization;
+
+    /**
+     * 鎵�灞炵粍缁囧悕绉�
+     */
+    private String pkOrganizationName;
+
+    /**
+     * 鎺掑簭鍙�
+     */
+    private Integer orderNum;
+
+    /**
+     * 閮ㄩ棬涓荤棰嗗
+     */
+    private String pkLeader;
+
+    /**
+     * 閮ㄩ棬涓荤棰嗗濮撳悕
+     */
+    private String pkLeaderName;
+
+    /**
+     * 閮ㄩ棬浣嶇疆
+     */
+    private String address;
+
+    /**
+     * 閮ㄩ棬鑱旂郴鐢佃瘽
+     */
+    private String tel;
+     private int treelevel;
+    @Override
+    public String getId() {
+        return id;
+    }
+
+    @Override
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDepartmentLevel() {
+        return departmentLevel;
+    }
+
+    public void setDepartmentLevel(String departmentLevel) {
+        this.departmentLevel = departmentLevel;
+    }
+
+    public String getPkFatherDepartment() {
+        return pkFatherDepartment;
+    }
+
+    public void setPkFatherDepartment(String pkFatherDepartment) {
+        this.pkFatherDepartment = pkFatherDepartment;
+    }
+
+    public String getPkFatherDepartmentName() {
+        return pkFatherDepartmentName;
+    }
+
+    public void setPkFatherDepartmentName(String pkFatherDepartmentName) {
+        this.pkFatherDepartmentName = pkFatherDepartmentName;
+    }
+
+    public String getPkOrganization() {
+        return pkOrganization;
+    }
+
+    public void setPkOrganization(String pkOrganization) {
+        this.pkOrganization = pkOrganization;
+    }
+
+    public String getPkOrganizationName() {
+        return pkOrganizationName;
+    }
+
+    public void setPkOrganizationName(String pkOrganizationName) {
+        this.pkOrganizationName = pkOrganizationName;
+    }
+
+    public Integer getOrderNum() {
+        return orderNum;
+    }
+
+    public void setOrderNum(Integer orderNum) {
+        this.orderNum = orderNum;
+    }
+
+    public String getPkLeader() {
+        return pkLeader;
+    }
+
+    public void setPkLeader(String pkLeader) {
+        this.pkLeader = pkLeader;
+    }
+
+    public String getPkLeaderName() {
+        return pkLeaderName;
+    }
+
+    public void setPkLeaderName(String pkLeaderName) {
+        this.pkLeaderName = pkLeaderName;
+    }
+
+    public String getAddress() {
+        return address;
+    }
+
+    public void setAddress(String address) {
+        this.address = address;
+    }
+
+    public String getTel() {
+        return tel;
+    }
+
+    public void setTel(String tel) {
+        this.tel = tel;
+    }
+    public int getTreelevel() {
+		return treelevel;
+	}
+
+	public void setTreelevel(int treelevel) {
+		this.treelevel = treelevel;
+	}
+
+	@Override
+    public String toString() {
+        return "OrgDepartmentVO{" +
+                "id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", departmentLevel='" + departmentLevel + '\'' +
+                ", pkFatherDepartment='" + pkFatherDepartment + '\'' +
+                ", pkFatherDepartmentName='" + pkFatherDepartmentName + '\'' +
+                ", pkOrganization='" + pkOrganization + '\'' +
+                ", pkOrganizationName='" + pkOrganizationName + '\'' +
+                ", orderNum=" + orderNum +
+                ", pkLeader='" + pkLeader + '\'' +
+                ", pkLeaderName='" + pkLeaderName + '\'' +
+                ", address='" + address + '\'' +
+                ", tel='" + tel + '\'' +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/pagemodel/OrgDutyVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/pagemodel/OrgDutyVO.java
new file mode 100644
index 0000000..9a37401
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/pagemodel/OrgDutyVO.java
@@ -0,0 +1,68 @@
+package com.vci.frameworkcore.pagemodel;
+
+
+import com.vci.starter.web.pagemodel.BaseModelVO;
+
+/**
+ * 鑱屽姟鐨勬樉绀哄璞�
+ * @author weidy
+ * @date 2020/3/1
+ */
+public class OrgDutyVO extends BaseModelVO {
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = -3147667126998425076L;
+
+    /**
+     * 鑱屽姟缂栧彿
+     */
+    private String id;
+
+    /**
+     * 鑱屽姟鍚嶇О
+     */
+    private String name;
+
+    /**
+     * 鑱屽姟绫诲埆
+     */
+    private String dutyClassify;
+
+    @Override
+    public String getId() {
+        return id;
+    }
+
+    @Override
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDutyClassify() {
+        return dutyClassify;
+    }
+
+    public void setDutyClassify(String dutyClassify) {
+        this.dutyClassify = dutyClassify;
+    }
+
+    @Override
+    public String toString() {
+        return "OrgDutyVO{" +
+                "id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", dutyClassify='" + dutyClassify + '\'' +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/pagemodel/SmFunctionVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/pagemodel/SmFunctionVO.java
new file mode 100644
index 0000000..a7048f4
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/pagemodel/SmFunctionVO.java
@@ -0,0 +1,223 @@
+package com.vci.frameworkcore.pagemodel;
+
+
+import com.vci.starter.web.pagemodel.BaseModelVO;
+
+/**
+ * 绯荤粺鍔熻兘鐨勬樉绀哄璞�
+ * @author weidy
+ * @date 2019/11/21
+ */
+public class SmFunctionVO extends BaseModelVO {
+
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = -6545374853062563612L;
+
+    /**
+     * 鑿滃崟缂栧彿
+     */
+    private String id;
+
+    /**
+     * 鑿滃崟鍚嶇О
+     */
+    private String name;
+
+    /**
+     * 鏃ュ織鍚嶇О
+     */
+    private String logName;
+
+    /**
+     * 璧勬簮鎺у埗绫诲瀷
+     */
+    private String resourceControlType;
+
+    /**
+     * 璧勬簮鎺у埗绫诲瀷鏄剧ず鏂囨湰
+     */
+    private String resourceControlTypeText;
+
+    /**
+     * 閾炬帴鍦板潃
+     */
+    private String url;
+
+    /**
+     * 甯姪鏂囨。鍚嶇О
+     */
+    private String helpName;
+
+    /**
+     * 鏄惁鏄剧ず
+     */
+    private boolean displayFlag;
+
+    /**
+     * 鏄惁鎺у埗鏉冮檺
+     */
+    private boolean controlRightFlag;
+
+    /**
+     * 涓婄骇鑿滃崟
+     */
+    private String parentFunctionId;
+
+    /**
+     * 涓婄骇鑿滃崟鍚嶇О
+     */
+    private String parentFunctionIdName;
+
+    /**
+     * 鎺掑簭鍙�
+     */
+    private Integer orderNum;
+
+    /**
+     * 鏄剧ず鍥炬爣
+     */
+    private String iconCss;
+
+    /**
+     * 鎸囧畾璁块棶鐨勮鑹�
+     */
+    private String usedBySpecifyRole;
+
+    @Override
+    public String getId() {
+        return id;
+    }
+
+    @Override
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getLogName() {
+        return logName;
+    }
+
+    public void setLogName(String logName) {
+        this.logName = logName;
+    }
+
+    public String getResourceControlType() {
+        return resourceControlType;
+    }
+
+    public void setResourceControlType(String resourceControlType) {
+        this.resourceControlType = resourceControlType;
+    }
+
+    public String getResourceControlTypeText() {
+        return resourceControlTypeText;
+    }
+
+    public void setResourceControlTypeText(String resourceControlTypeText) {
+        this.resourceControlTypeText = resourceControlTypeText;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public String getHelpName() {
+        return helpName;
+    }
+
+    public void setHelpName(String helpName) {
+        this.helpName = helpName;
+    }
+
+    public boolean isDisplayFlag() {
+        return displayFlag;
+    }
+
+    public void setDisplayFlag(boolean displayFlag) {
+        this.displayFlag = displayFlag;
+    }
+
+    public boolean isControlRightFlag() {
+        return controlRightFlag;
+    }
+
+    public void setControlRightFlag(boolean controlRightFlag) {
+        this.controlRightFlag = controlRightFlag;
+    }
+
+    public String getParentFunctionId() {
+        return parentFunctionId;
+    }
+
+    public void setParentFunctionId(String parentFunctionId) {
+        this.parentFunctionId = parentFunctionId;
+    }
+
+    public Integer getOrderNum() {
+        return orderNum;
+    }
+
+    public void setOrderNum(Integer orderNum) {
+        this.orderNum = orderNum;
+    }
+
+    public String getIconCss() {
+        return iconCss;
+    }
+
+    public void setIconCss(String iconCss) {
+        this.iconCss = iconCss;
+    }
+
+    public String getUsedBySpecifyRole() {
+        return usedBySpecifyRole;
+    }
+
+    public void setUsedBySpecifyRole(String usedBySpecifyRole) {
+        this.usedBySpecifyRole = usedBySpecifyRole;
+    }
+
+    public String getParentFunctionIdName() {
+        return parentFunctionIdName;
+    }
+
+    public void setParentFunctionIdName(String parentFunctionIdName) {
+        this.parentFunctionIdName = parentFunctionIdName;
+    }
+
+    @Override
+    public String toString() {
+        return "SmFunctionVO{" +
+                "id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", logName='" + logName + '\'' +
+                ", resourceControlType='" + resourceControlType + '\'' +
+                ", resourceControlTypeText='" + resourceControlTypeText + '\'' +
+                ", url='" + url + '\'' +
+                ", helpName='" + helpName + '\'' +
+                ", displayFlag=" + displayFlag +
+                ", controlRightFlag=" + controlRightFlag +
+                ", parentFunctionId='" + parentFunctionId + '\'' +
+                ", parentFunctionIdName='" + parentFunctionIdName + '\'' +
+                ", orderNum=" + orderNum +
+                ", iconCss='" + iconCss + '\'' +
+                ", usedBySpecifyRole='" + usedBySpecifyRole + '\'' +
+                "} " + super.toString();
+    }
+}
\ No newline at end of file
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/pagemodel/SmPasswordStrategyVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/pagemodel/SmPasswordStrategyVO.java
new file mode 100644
index 0000000..be33d9e
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/pagemodel/SmPasswordStrategyVO.java
@@ -0,0 +1,149 @@
+package com.vci.frameworkcore.pagemodel;
+
+import com.vci.starter.web.pagemodel.BaseModelVO;
+
+/**
+ * 瀵嗙爜瀹夊叏绛栫暐鏄剧ず瀵硅薄
+ * @author weidy
+ * @date 2020/3/1
+ */
+public class SmPasswordStrategyVO  extends BaseModelVO {
+
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = -389835469056130052L;
+
+    /**
+     * 鏈�灏忛暱搴�
+     */
+    private Integer minLength;
+
+    /**
+     * 鏈夋晥澶╂暟
+     */
+    private Integer validDay;
+
+    /**
+     * 鎻愰啋澶╂暟
+     */
+    private Integer remindDay;
+
+    /**
+     * 鍙互閲嶈瘯鐨勬鏁�
+     */
+    private Integer retryTime;
+
+    /**
+     * 閿佸畾鏃堕棿
+     */
+    private Integer lockTime;
+
+    /**
+     * 鏄惁涓洪粯璁�
+     */
+    private boolean defaultFlag;
+
+    /**
+     * 瀵嗙爜鐨勬渶澶ч暱搴�
+     */
+    private Integer maxLength;
+
+    /**
+     * 瀵嗙爜瀛楃鎵�闇�绫诲瀷
+     */
+    private String requireCharType;
+
+    /**
+     * 瀵嗙爜鎵�闇�瀛楃绉嶇被涓暟
+     */
+    private Integer requireCharCount;
+
+
+    public Integer getRequireCharCount() {
+        return requireCharCount;
+    }
+
+    public void setRequireCharCount(Integer requireCharCount) {
+        this.requireCharCount = requireCharCount;
+    }
+
+    public Integer getMinLength() {
+        return minLength;
+    }
+
+    public void setMinLength(Integer minLength) {
+        this.minLength = minLength;
+    }
+
+    public Integer getValidDay() {
+        return validDay;
+    }
+
+    public void setValidDay(Integer validDay) {
+        this.validDay = validDay;
+    }
+
+    public Integer getRemindDay() {
+        return remindDay;
+    }
+
+    public void setRemindDay(Integer remindDay) {
+        this.remindDay = remindDay;
+    }
+
+    public Integer getRetryTime() {
+        return retryTime;
+    }
+
+    public void setRetryTime(Integer retryTime) {
+        this.retryTime = retryTime;
+    }
+
+    public Integer getLockTime() {
+        return lockTime;
+    }
+
+    public void setLockTime(Integer lockTime) {
+        this.lockTime = lockTime;
+    }
+
+    public boolean isDefaultFlag() {
+        return defaultFlag;
+    }
+
+    public void setDefaultFlag(boolean defaultFlag) {
+        this.defaultFlag = defaultFlag;
+    }
+
+    public Integer getMaxLength() {
+        return maxLength;
+    }
+
+    public void setMaxLength(Integer maxLength) {
+        this.maxLength = maxLength;
+    }
+
+    public String getRequireCharType() {
+        return requireCharType;
+    }
+
+    public void setRequireCharType(String requireCharType) {
+        this.requireCharType = requireCharType;
+    }
+
+    @Override
+    public String toString() {
+        return "SmPasswordStrategyVO{" +
+                "minLength=" + minLength +
+                ", validDay=" + validDay +
+                ", remindDay=" + remindDay +
+                ", retryTime=" + retryTime +
+                ", lockTime=" + lockTime +
+                ", defaultFlag=" + defaultFlag +
+                ", maxLength=" + maxLength +
+                ", requireCharType='" + requireCharType + '\'' +
+                ", requireCharCount=" + requireCharCount +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/pagemodel/SmRoleVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/pagemodel/SmRoleVO.java
new file mode 100644
index 0000000..ec7533f
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/pagemodel/SmRoleVO.java
@@ -0,0 +1,113 @@
+package com.vci.frameworkcore.pagemodel;
+
+
+import com.vci.starter.web.pagemodel.BaseModelVO;
+
+/**
+ * 瑙掕壊鏄剧ず瀵硅薄
+ * @author weidy
+ * @date 2020/2/2
+ */
+public class SmRoleVO extends BaseModelVO {
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = 8387796743619665258L;
+
+    /**
+     * 瑙掕壊缂栧彿
+     */
+    private String id;
+
+    /**
+     * 瑙掕壊鍚嶇О
+     */
+    private String name;
+
+    /**
+     * 瑙掕壊绫诲瀷
+     */
+    private String roleClassify;
+
+
+    /**
+     * 瑙掕壊绫诲瀷鏄剧ず鏂囨湰
+     */
+    private String roleClassifyText;
+
+    /**
+     * 瑙掕壊绠$悊鑼冨洿
+     */
+    private String roleControlArea;
+
+    /**
+     * 瑙掕壊绠$悊鑼冨洿鏄剧ず鏂囨湰
+     */
+    private String roleControlAreaText;
+
+    @Override
+    public String getId() {
+        return id;
+    }
+
+    @Override
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getRoleClassify() {
+        return roleClassify;
+    }
+
+    public void setRoleClassify(String roleClassify) {
+        this.roleClassify = roleClassify;
+    }
+
+    public String getRoleClassifyText() {
+        return roleClassifyText;
+    }
+
+    public void setRoleClassifyText(String roleClassifyText) {
+        this.roleClassifyText = roleClassifyText;
+    }
+
+    public String getRoleControlArea() {
+        return roleControlArea;
+    }
+
+    public void setRoleControlArea(String roleControlArea) {
+        this.roleControlArea = roleControlArea;
+    }
+
+    public String getRoleControlAreaText() {
+        return roleControlAreaText;
+    }
+
+    public void setRoleControlAreaText(String roleControlAreaText) {
+        this.roleControlAreaText = roleControlAreaText;
+    }
+
+    @Override
+    public String toString() {
+        return "SmRoleVO{" +
+        		 "oid='" + getOid() + '\'' +
+                ",id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", roleClassify='" + roleClassify + '\'' +
+                ", roleClassifyText='" + roleClassifyText + '\'' +
+                ", roleControlArea='" + roleControlArea + '\'' +
+                ", roleControlAreaText='" + roleControlAreaText + '\'' +
+                 ",description='" + getDescription() + '\'' +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/pagemodel/SmUserVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/pagemodel/SmUserVO.java
new file mode 100644
index 0000000..dc5249f
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/pagemodel/SmUserVO.java
@@ -0,0 +1,393 @@
+package com.vci.frameworkcore.pagemodel;
+import com.vci.starter.web.pagemodel.BaseModelVO;
+
+import java.util.Date;
+
+/**
+ * 鐢ㄦ埛鏄剧ず瀵硅薄锛屾敞鎰忓拰杩欎釜涓嶅寘鍚瘑鐮佸瓧娈�
+ * @author weidy
+ * @date 2020/1/29
+ */
+public class SmUserVO extends BaseModelVO {
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = -8583106405033336802L;
+
+    /**
+     * 鐢ㄦ埛鍚�
+     */
+    private String id;
+
+    /**
+     * 鐢ㄦ埛濮撳悕
+     */
+    private String name;
+
+
+    /**
+     * 鐢ㄦ埛绫诲瀷
+     */
+    private String userType;
+
+    /**
+     * 鐢ㄦ埛绫诲瀷鏄剧ず鏂囨湰
+     */
+    private String userTypeText;
+
+    /**
+     * 鎵�灞炰汉鍛�
+     */
+    private String pkPerson;
+
+    /**
+     * 鎵�灞炰汉鍛樺悕绉�
+     */
+    private String pkPersonName;
+
+    /**
+     * 澶辨晥鏃ユ湡
+     */
+    private Date disabledate;
+
+    /**
+     * 閭欢鍦板潃
+     */
+    private String email;
+
+    /**
+     * 鐢佃瘽
+     */
+    private String tel;
+
+    /**
+     * RTX鑱旂郴鍙�
+     */
+    private String rtxNo;
+
+    /**
+     * 瀹炴椂閫氳杞欢璐﹀彿
+     */
+    private String IMNo;
+
+    /**
+     * 鎵�灞為儴闂�
+     */
+    private String pkDepartment;
+
+    /**
+     * 鎵�灞為儴闂ㄥ悕绉�
+     */
+    private String pkDepartmentName;
+
+    /**
+     * 鎵�灞炶亴鍔�
+     */
+    private String pkDuty;
+
+    /**
+     * 鎵�灞炶亴鍔″悕绉�
+     */
+    private String pkDutyName;
+
+    /**
+     * 鎵�灞炲瘑鐮佸畨鍏ㄧ瓥鐣�
+     */
+    private String pkPasswordStrategy;
+
+    /**
+     * 鎵�灞炲瘑鐮佸畨鍏ㄧ瓥鐣�
+     */
+    private String pkPasswordStrategyName;
+
+    /**
+     * 鏈�鍚庣櫥褰曟椂闂�
+     */
+    private Date lastLoginTime;
+
+    /**
+     * 鏈�鍚庝慨鏀瑰瘑鐮佹椂闂�
+     */
+    private Date lastModifyPasswordTime;
+
+    /**
+     * 瀵嗙爜閿欒娆℃暟
+     */
+    private Integer pwdWrongCount;
+
+    /**
+     * 鎬у埆
+     */
+
+    private String sex;
+
+    /**
+     * 鎬у埆鏄剧ず鍚嶇О
+     */
+    private String sexText;
+
+    /**
+     * 榛樿鐨勮瑷�缂栫爜
+     */
+    private String langCode;
+
+    /**
+     * 榛樿鐨勮瑷�鍚嶇О
+     */
+    private String langCodeText;
+
+    /**
+     * 鏄惁閿佸畾
+     */
+    private boolean lockFlag;
+
+    /**
+     * 澶村儚
+     */
+    private String photo;
+
+    @Override
+    public String getId() {
+        return id;
+    }
+
+    @Override
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getUserType() {
+        return userType;
+    }
+
+    public void setUserType(String userType) {
+        this.userType = userType;
+    }
+
+    public String getUserTypeText() {
+        return userTypeText;
+    }
+
+    public void setUserTypeText(String userTypeText) {
+        this.userTypeText = userTypeText;
+    }
+
+    public String getPkPerson() {
+        return pkPerson;
+    }
+
+    public void setPkPerson(String pkPerson) {
+        this.pkPerson = pkPerson;
+    }
+
+    public String getPkPersonName() {
+        return pkPersonName;
+    }
+
+    public void setPkPersonName(String pkPersonName) {
+        this.pkPersonName = pkPersonName;
+    }
+
+    public Date getDisabledate() {
+        return disabledate;
+    }
+
+    public void setDisabledate(Date disabledate) {
+        this.disabledate = disabledate;
+    }
+
+    public String getEmail() {
+        return email;
+    }
+
+    public void setEmail(String email) {
+        this.email = email;
+    }
+
+    public String getTel() {
+        return tel;
+    }
+
+    public void setTel(String tel) {
+        this.tel = tel;
+    }
+
+    public String getRtxNo() {
+        return rtxNo;
+    }
+
+    public void setRtxNo(String rtxNo) {
+        this.rtxNo = rtxNo;
+    }
+
+    public String getIMNo() {
+        return IMNo;
+    }
+
+    public void setIMNo(String IMNo) {
+        this.IMNo = IMNo;
+    }
+
+    public String getPkDepartment() {
+        return pkDepartment;
+    }
+
+    public void setPkDepartment(String pkDepartment) {
+        this.pkDepartment = pkDepartment;
+    }
+
+    public String getPkDepartmentName() {
+        return pkDepartmentName;
+    }
+
+    public void setPkDepartmentName(String pkDepartmentName) {
+        this.pkDepartmentName = pkDepartmentName;
+    }
+
+    public String getPkDuty() {
+        return pkDuty;
+    }
+
+    public void setPkDuty(String pkDuty) {
+        this.pkDuty = pkDuty;
+    }
+
+    public String getPkDutyName() {
+        return pkDutyName;
+    }
+
+    public void setPkDutyName(String pkDutyName) {
+        this.pkDutyName = pkDutyName;
+    }
+
+    public String getPkPasswordStrategy() {
+        return pkPasswordStrategy;
+    }
+
+    public void setPkPasswordStrategy(String pkPasswordStrategy) {
+        this.pkPasswordStrategy = pkPasswordStrategy;
+    }
+
+    public String getPkPasswordStrategyName() {
+        return pkPasswordStrategyName;
+    }
+
+    public void setPkPasswordStrategyName(String pkPasswordStrategyName) {
+        this.pkPasswordStrategyName = pkPasswordStrategyName;
+    }
+
+    public Date getLastLoginTime() {
+        return lastLoginTime;
+    }
+
+    public void setLastLoginTime(Date lastLoginTime) {
+        this.lastLoginTime = lastLoginTime;
+    }
+
+    public Date getLastModifyPasswordTime() {
+        return lastModifyPasswordTime;
+    }
+
+    public void setLastModifyPasswordTime(Date lastModifyPasswordTime) {
+        this.lastModifyPasswordTime = lastModifyPasswordTime;
+    }
+
+    public Integer getPwdWrongCount() {
+        return pwdWrongCount;
+    }
+
+    public void setPwdWrongCount(Integer pwdWrongCount) {
+        this.pwdWrongCount = pwdWrongCount;
+    }
+
+    public String getSex() {
+        return sex;
+    }
+
+    public void setSex(String sex) {
+        this.sex = sex;
+    }
+
+    public String getSexText() {
+        return sexText;
+    }
+
+    public void setSexText(String sexText) {
+        this.sexText = sexText;
+    }
+
+    public String getLangCode() {
+        return langCode;
+    }
+
+    public void setLangCode(String langCode) {
+        this.langCode = langCode;
+    }
+
+    public String getLangCodeText() {
+        return langCodeText;
+    }
+
+    public void setLangCodeText(String langCodeText) {
+        this.langCodeText = langCodeText;
+    }
+
+    public boolean isLockFlag() {
+        return lockFlag;
+    }
+
+    public void setLockFlag(boolean lockFlag) {
+        this.lockFlag = lockFlag;
+    }
+    public String getPhoto() {
+        return photo;
+    }
+
+    public void setPhoto(String photo) {
+        this.photo = photo;
+    }
+
+    @Override
+    public String toString() {
+        return "SmUserVO{" +
+        		"oid='" + getOid() + '\'' +
+                ",id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", userType='" + userType + '\'' +
+                ", userTypeText='" + userTypeText + '\'' +
+                ", pkPerson='" + pkPerson + '\'' +
+                ", pkPersonName='" + pkPersonName + '\'' +
+                ", disabledate=" + disabledate +
+                ", email='" + email + '\'' +
+                ", tel='" + tel + '\'' +
+                ", rtxNo='" + rtxNo + '\'' +
+                ", IMNo='" + IMNo + '\'' +
+                ", pkDepartment='" + pkDepartment + '\'' +
+                ", pkDepartmentName='" + pkDepartmentName + '\'' +
+                ", pkDuty='" + pkDuty + '\'' +
+                ", pkDutyName='" + pkDutyName + '\'' +
+                ", pkPasswordStrategy='" + pkPasswordStrategy + '\'' +
+                ", pkPasswordStrategyName='" + pkPasswordStrategyName + '\'' +
+                ", lastLoginTime=" + lastLoginTime +
+                ", lastModifyPasswordTime=" + lastModifyPasswordTime +
+                ", pwdWrongCount=" + pwdWrongCount +
+                ", sex='" + sex + '\'' +
+                ", sexText='" + sexText + '\'' +
+                ", langCode='" + langCode + '\'' +
+                ", langCodeText='" + langCodeText + '\'' +
+                ", lockFlag='" + lockFlag + '\'' +
+                ", photo='" + photo + '\'' +
+                 ",description='" + getDescription() + '\'' +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/properties/VciFramworkCompatibilityProperties.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/properties/VciFramworkCompatibilityProperties.java
new file mode 100644
index 0000000..ae39106
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/properties/VciFramworkCompatibilityProperties.java
@@ -0,0 +1,80 @@
+package com.vci.frameworkcore.properties;
+
+import com.vci.starter.web.yml.YamlPropertySourceFactory;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.PropertySource;
+
+import java.util.Map;
+
+/**
+ * 骞冲彴鍏煎鎬х殑閰嶇疆
+ * @author weidy
+ * @date 2020/3/13
+ */
+@PropertySource(value = "classpath:compatibility_field_map.yml",factory = YamlPropertySourceFactory.class)
+@Configuration
+@ConfigurationProperties(prefix = "compatibility")
+public class VciFramworkCompatibilityProperties {
+    /**
+     * 鐢ㄦ埛鐨勫瓧娈垫槧灏�
+     */
+    private Map<String,String> userTableFieldMap;
+
+    /**
+     * 瑙掕壊鐨勫瓧娈垫槧灏�
+     */
+    private Map<String,String> roleTableFieldMap;
+
+    /**
+     * 閮ㄩ棬鐨勫瓧娈垫槧灏�
+     */
+    private Map<String,String> deptTableFieldMap;
+
+    /**
+     * 鍔熻兘鐨勫瓧娈垫槧灏�
+     */
+    private Map<String,String> functionTableFieldMap;
+
+    public Map<String, String> getUserTableFieldMap() {
+        return userTableFieldMap;
+    }
+
+    public void setUserTableFieldMap(Map<String, String> userTableFieldMap) {
+        this.userTableFieldMap = userTableFieldMap;
+    }
+
+    public Map<String, String> getRoleTableFieldMap() {
+        return roleTableFieldMap;
+    }
+
+    public void setRoleTableFieldMap(Map<String, String> roleTableFieldMap) {
+        this.roleTableFieldMap = roleTableFieldMap;
+    }
+
+    public Map<String, String> getDeptTableFieldMap() {
+        return deptTableFieldMap;
+    }
+
+    public void setDeptTableFieldMap(Map<String, String> deptTableFieldMap) {
+        this.deptTableFieldMap = deptTableFieldMap;
+    }
+
+    public Map<String, String> getFunctionTableFieldMap() {
+        return functionTableFieldMap;
+    }
+
+    public void setFunctionTableFieldMap(Map<String, String> functionTableFieldMap) {
+        this.functionTableFieldMap = functionTableFieldMap;
+    }
+
+    @Override
+    public String toString() {
+        return "VciFramworkCompatibilityProperties{" +
+                "userTableFieldMap=" + userTableFieldMap +
+                ", roleTableFieldMap=" + roleTableFieldMap +
+                ", deptTableFieldMap=" + deptTableFieldMap +
+                ", functionTableFieldMap=" + functionTableFieldMap +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/properties/VciSecurityManageProperties.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/properties/VciSecurityManageProperties.java
new file mode 100644
index 0000000..4b718e3
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/frameworkcore/properties/VciSecurityManageProperties.java
@@ -0,0 +1,59 @@
+package com.vci.frameworkcore.properties;
+
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * 鏉冮檺绠$悊鐩稿叧鐨勯厤缃�
+ * @author weidy
+ * @date 2020/2/5
+ */
+@Configuration
+public class VciSecurityManageProperties {
+
+    /**
+     * 鐧诲綍鐨勬椂鍊欐槸鍚︽煡璇㈢敤鎴峰ご鍍�
+     */
+    private boolean manageUserPhotoOnLogin = false;
+
+    /**
+     * 鐢ㄦ埛鍙兘涓�澶勭櫥褰�
+     */
+    private boolean userOneLogin = false;
+
+    /**
+     * 榛樿鐨勭敤鎴风殑瀵嗙爜锛屽嵆鍦ㄧ敤鎴烽娆″垱寤虹殑鏃跺�欏瘑鐮�
+     */
+    private String defaultUserPassword = "vci";
+
+    public boolean isManageUserPhotoOnLogin() {
+        return manageUserPhotoOnLogin;
+    }
+
+    public void setManageUserPhotoOnLogin(boolean manageUserPhotoOnLogin) {
+        this.manageUserPhotoOnLogin = manageUserPhotoOnLogin;
+    }
+    public boolean isUserOneLogin() {
+        return userOneLogin;
+    }
+
+    public void setUserOneLogin(boolean userOneLogin) {
+        this.userOneLogin = userOneLogin;
+    }
+
+    public String getDefaultUserPassword() {
+        return defaultUserPassword;
+    }
+
+    public void setDefaultUserPassword(String defaultUserPassword) {
+        this.defaultUserPassword = defaultUserPassword;
+    }
+
+    @Override
+    public String toString() {
+        return "VciSecurityManageProperties{" +
+                "manageUserPhotoOnLogin=" + manageUserPhotoOnLogin +
+                ", userOneLogin=" + userOneLogin +
+                ", defaultUserPassword='" + defaultUserPassword + '\'' +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/plugins/controller/AuditTaskController.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/plugins/controller/AuditTaskController.java
new file mode 100644
index 0000000..78aff9b
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/plugins/controller/AuditTaskController.java
@@ -0,0 +1,119 @@
+package com.vci.plugins.controller;
+
+import com.vci.corba.common.VCIError;
+import com.vci.plugins.dto.AuditTaskDTO;
+import com.vci.starter.web.pagemodel.BaseResult;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.starter.web.util.VciDateUtil;
+import com.vci.web.util.PlatformClientUtil;
+import com.vci.web.util.WebUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import plm.bs.bom.clientobject.ClientBusinessObject;
+import plm.bs.bom.clientobject.ClientBusinessObjectOperation;
+import plm.corba.qt.KV;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Locale;
+
+/**
+ * Description: 璇勫浠诲姟鎺у埗鍣�
+ *
+ * @author: LiHang
+ * @date: Created on 2022/2/22
+ */
+@RestController()
+@RequestMapping("/auditTaskController")
+public class AuditTaskController {
+    /**
+     * 骞冲彴鐨勫鎴风璋冪敤宸ュ叿绫�
+     */
+    @Autowired
+    private PlatformClientUtil platformClientUtil;
+
+    /**
+     * 鎸夋瘡涓礋璐d汉鍒嗗埆鍒涘缓璇勫浠诲姟
+     *
+     * @param auditTaskDTO 璇勫浠诲姟椤甸潰浼犺緭瀵硅薄
+     * @return 鎵ц缁撴灉
+     */
+    @PostMapping("/create")
+    public BaseResult createByPrincipal(@RequestBody AuditTaskDTO auditTaskDTO) {
+        VciBaseUtil.alertNotNull(auditTaskDTO.getProcessreviewoid(), "宸ヨ壓璇勫涓婚敭", auditTaskDTO.getPrincipal(), "璐熻矗浜�");
+        ClientBusinessObjectOperation operation = new ClientBusinessObjectOperation();
+        List<ClientBusinessObject> createList = new ArrayList<>();
+        List<String> principalList = VciBaseUtil.str2List(auditTaskDTO.getPrincipal());
+        List<List<String>> oracleIn = WebUtil.switchListForOracleIn(principalList);
+        try {
+            oracleIn.forEach(list -> {
+                try {
+                    String principalStr = Arrays.toString(list.toArray()).replaceAll(",", "','")
+                            .replaceAll("\\[","")
+                            .replaceAll("\\]","")
+                            .replaceAll(" ","");
+                    principalStr = "('" + principalStr + "')";
+                    String sql = "select us.PLUSERNAME, dept.PLNAME\n" +
+                            "from PLUSER us\n" +
+                            "         left join PLUSERDEPT ud on us.PLUID = ud.PLUSERUID\n" +
+                            "         left join PLDEPT dept on dept.PLUID = ud.PLDEPTUID\n" +
+                            "where us.pluid in " + principalStr;
+                    KV[][] kvs = platformClientUtil.getQueryService().queryBySql(sql);
+                    for (int index = 0; index < kvs.length; index++) {
+                        ClientBusinessObject cbo = operation.initBusinessObject("audittask");
+                        copyAttribute(cbo, auditTaskDTO);
+                        cbo.setAttributeValue("principal", "PLUSERNAME".equals(kvs[index][0].key.toUpperCase(Locale.ROOT)) ? kvs[index][0].value : kvs[index][1].value);
+                        cbo.setAttributeValue("departmentname","PLNAME".equals(kvs[index][0].key.toUpperCase(Locale.ROOT)) ? kvs[index][0].value : kvs[index][1].value);
+                        createList.add(cbo);
+                    }
+                } catch (VCIError vciError) {
+                    vciError.printStackTrace();
+                }
+            });
+            operation.batchSaveCreateBuinessObject(createList.toArray(new ClientBusinessObject[0]));
+        } catch (VCIError vciError) {
+            vciError.printStackTrace();
+            return BaseResult.fail("鍒涘缓璇勫浠诲姟澶辫触");
+        }
+        return BaseResult.success();
+    }
+
+    /**
+     * 澶嶅埗璇勫浠诲姟瀛楁
+     *
+     * @param cbo          璇勫浠诲姟涓氬姟绫诲瀷瀵硅薄
+     * @param auditTaskDTO 璇勫浠诲姟椤甸潰浼犺緭瀵硅薄
+     */
+    private void copyAttribute(ClientBusinessObject cbo, AuditTaskDTO auditTaskDTO) {
+        setAttribute(cbo, "assigner", StringUtils.isBlank(auditTaskDTO.getAssigner())? WebUtil.getCurrentUserId(): auditTaskDTO.getAssigner());
+        setAttribute(cbo, "principal", auditTaskDTO.getPrincipal());
+        setAttribute(cbo, "departmentName", auditTaskDTO.getDepartmentname());
+        setAttribute(cbo, "content", auditTaskDTO.getContent());
+        setAttribute(cbo, "type", auditTaskDTO.getType());
+        setAttribute(cbo, "processReviewOid", auditTaskDTO.getProcessreviewoid());
+        setAttribute(cbo, "planedStartDate", VciDateUtil.date2Str(auditTaskDTO.getPlanedstartdate(), "yyyy-MM-dd HH:mm:ss"));
+        setAttribute(cbo, "place", auditTaskDTO.getPlace());
+    }
+
+    /**
+     * 涓氬姟绫诲瀷璁剧疆瀛楁鍊�
+     *
+     * @param cbo            涓氬姟绫诲瀷
+     * @param attributeName  瀛楁鍚�
+     * @param attributeValue 瀛楁鍊�
+     */
+    private void setAttribute(ClientBusinessObject cbo, String attributeName, String attributeValue) {
+        try {
+            if (StringUtils.isNotBlank(attributeValue)) {
+                cbo.setAttributeValue(attributeName, attributeValue);
+            }
+        } catch (VCIError vciError) {
+            vciError.printStackTrace();
+        }
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/plugins/controller/ImageViewerController.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/plugins/controller/ImageViewerController.java
new file mode 100644
index 0000000..ed139ba
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/plugins/controller/ImageViewerController.java
@@ -0,0 +1,53 @@
+package com.vci.plugins.controller;
+
+import com.vci.file.constant.VciFileBtmTypeConstant;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.util.ControllerUtil;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.web.query.FileImageViewerQuery;
+import com.vci.web.service.VciFileDownloadServiceI;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+/**
+ * 鏂囦欢棰勮鐨勬帶鍒跺櫒
+ * @author weidy
+ * @date 2021/3/11
+ */
+@RestController()
+@RequestMapping("/imageViewerController")
+public class ImageViewerController {
+
+    /**
+     * 鏂囦欢涓嬭浇鏈嶅姟
+     */
+    @Autowired
+    private VciFileDownloadServiceI vciFileDownloadServiceI;
+
+
+    /**
+     * 涓嬭浇鍥剧墖鏂囦欢
+     * @param response 鍝嶅簲瀵硅薄
+     * @param imageViewerQuery 鏌ヨ瀵硅薄
+     */
+    @GetMapping("/downloadImage")
+    public void downloadImage(HttpServletResponse response,FileImageViewerQuery imageViewerQuery){
+        VciBaseUtil.alertNotNull(imageViewerQuery,"鍥剧墖娴忚绫诲瀷");
+        String filePath = null;
+        if(VciFileBtmTypeConstant.FILE_OBJECT.equalsIgnoreCase(imageViewerQuery.getImageType())){
+            filePath = vciFileDownloadServiceI.downloadFileByOid(imageViewerQuery.getFileOid());
+        }else{
+            filePath = vciFileDownloadServiceI.downloadFileByPath(imageViewerQuery.getFilePath());
+        }
+        try {
+            ControllerUtil.writeFileToResponse(response,filePath);
+        } catch (IOException e) {
+            throw new VciBaseException(e.getMessage(),new String[0],e);
+        }
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/plugins/controller/Sql2TableController.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/plugins/controller/Sql2TableController.java
new file mode 100644
index 0000000..f306f5b
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/plugins/controller/Sql2TableController.java
@@ -0,0 +1,97 @@
+package com.vci.plugins.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.vci.corba.common.VCIError;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.BaseResult;
+import com.vci.web.util.PlatformClientUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import plm.bs.bom.clientobject.ClientBusinessObjectOperation;
+import plm.corba.qt.KV;
+import plm.corba.qt.QTServiceOperations;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * Description:鍒╃敤sql杞寲琛ㄦ牸鐨勬帶鍒跺櫒
+ *
+ * @author: LiHang
+ * @date: Created on 2022/1/20
+ */
+@RestController()
+@RequestMapping("/sqlController")
+public class Sql2TableController {
+    @Autowired
+    private PlatformClientUtil platformClientUtil;
+
+    @GetMapping("/excute")
+    public BaseResult excute(String sql,String oid){
+        //杩斿洖缁撴灉闆嗭紝鍒嗕负key鍜寁alue銆俴ey鏄垪鍚嶃��
+        if (sql == null){
+            throw  new VciBaseException("鏌ヨ璇彞涓虹┖锛岃妫�鏌ュ悗鍐嶈瘯");
+        }else if (sql.contains("sql:")){
+            sql = sql.replace("sql:","");
+        }
+
+        if (oid == null && sql.contains("?")){
+            throw new VciBaseException("where璇彞娌℃湁璧嬪�硷紝璇锋鏌ュ悗閲嶈瘯");
+        }else if (oid != null && sql.contains("?")){
+            sql = sql.replace("?","'" + oid + "'");
+        }
+        Set<TableDisplay> columns = new HashSet<>();
+        List<JSONObject> valueList = new ArrayList<>();
+        KV[][] keyValues = new KV[0][0];
+        try {
+            keyValues =  platformClientUtil.getQueryService().queryBySql(sql);
+        } catch (VCIError vciError) {
+            vciError.printStackTrace();
+            return BaseResult.fail("sql璇彞鏈夐棶棰橈紝璇锋鏌ュ悗閲嶈瘯");
+        }
+        if (keyValues.length > 0){
+            //1.绗竴灞傛暟缁勬槸璇ql鐨勬煡璇㈢粨鏋滄湁澶氬皯鏉�
+            for (KV kv : keyValues[0]) {
+                TableDisplay column = new TableDisplay();
+                column.setField(kv.key);
+                column.setTitle(kv.key);
+                columns.add(column);
+            }
+            for (KV[] kvs : keyValues) {
+                //2.绗簩灞傛暟缁勬槸璇ヨ鏁版嵁鐨勫叿浣撳垪鍚嶅拰鏁版嵁銆�
+                Map<String, Object> dataMap = Arrays.stream(kvs).collect(Collectors.toMap(k -> k.key, v -> v.value));
+                JSONObject json = new JSONObject(dataMap);
+                valueList.add(json);
+            }
+        }
+        BaseResult baseResult = new BaseResult();
+        baseResult.setSuccess(true);
+        baseResult.setData(valueList);
+        baseResult.setObj(columns);
+        return baseResult;
+    }
+
+    class TableDisplay  {
+        private String field;
+        private String title;
+
+        public String getField() {
+            return field;
+        }
+
+        public void setField(String field) {
+            this.field = field;
+        }
+
+        public String getTitle() {
+            return title;
+        }
+
+        public void setTitle(String title) {
+            this.title = title;
+        }
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/plugins/dto/AuditTaskDTO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/plugins/dto/AuditTaskDTO.java
new file mode 100644
index 0000000..361bb34
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/plugins/dto/AuditTaskDTO.java
@@ -0,0 +1,137 @@
+package com.vci.plugins.dto;
+
+import com.vci.web.dto.BaseModelDTO;
+
+import java.util.Date;
+
+/**
+ * Description: 璇勫浠诲姟椤甸潰浼犺緭瀵硅薄
+ *
+ * @author: LiHang
+ * @date: Created on 2022/2/22
+ */
+public class AuditTaskDTO extends BaseModelDTO implements java.io.Serializable {
+
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = 693218797706717186L;
+    /**
+     * 鎸囨淳浜�
+     */
+    private String assigner;
+
+    /**
+     * 璐d换浜�
+     */
+    private String principal;
+
+    /**
+     * 閮ㄩ棬鍚�
+     */
+    private String departmentname;
+
+    /**
+     *
+     */
+    private String content;
+
+    /**
+     * 绫诲瀷
+     */
+    private String type;
+
+    /**
+     * 宸ヨ壓璇勫涓婚敭
+     */
+    private String processreviewoid;
+
+    /**
+     * 璁″垝寮�濮嬫椂闂� - 榛樿褰撳墠鏃堕棿
+     */
+    private Date planedstartdate = new Date();
+
+    /**
+     * 鍦烘墍
+     */
+    private String place;
+
+    public String getAssigner() {
+        return assigner;
+    }
+
+    public void setAssigner(String assigner) {
+        this.assigner = assigner;
+    }
+
+    public String getPrincipal() {
+        return principal;
+    }
+
+    public void setPrincipal(String principal) {
+        this.principal = principal;
+    }
+
+    public String getDepartmentname() {
+        return departmentname;
+    }
+
+    public void setDepartmentname(String departmentname) {
+        this.departmentname = departmentname;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getProcessreviewoid() {
+        return processreviewoid;
+    }
+
+    public void setProcessreviewoid(String processreviewoid) {
+        this.processreviewoid = processreviewoid;
+    }
+
+    public Date getPlanedstartdate() {
+        return planedstartdate;
+    }
+
+    public void setPlanedstartdate(Date planedstartdate) {
+        this.planedstartdate = planedstartdate;
+    }
+
+    public String getPlace() {
+        return place;
+    }
+
+    public void setPlace(String place) {
+        this.place = place;
+    }
+
+    @Override
+    public String toString() {
+        return "AuditTaskDTO{" +
+                "assigner='" + assigner + '\'' +
+                ", principal='" + principal + '\'' +
+                ", departmentname='" + departmentname + '\'' +
+                ", content='" + content + '\'' +
+                ", type='" + type + '\'' +
+                ", processreviewoid='" + processreviewoid + '\'' +
+                ", planedstartdate=" + planedstartdate +
+                ", place='" + place + '\'' +
+                '}';
+    }
+}
+
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/annotation/BdSelectInput.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/annotation/BdSelectInput.java
new file mode 100644
index 0000000..ba9c547
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/annotation/BdSelectInput.java
@@ -0,0 +1,37 @@
+package com.vci.web.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 杈撳叆鍜岄�夋嫨瀛楃鑷姩璁板綍
+ * 姣斿璁¢噺鍗曚綅锛屾椂闂存牸寮忥紝鍒嗛殧绗�
+ * @author weidy
+ * @date 2021-1-19
+ */
+@Target({ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface BdSelectInput {
+
+    /**
+     * 鍐呭鏍囪
+     * @return 鍐呭鏍囪
+     */
+    String flag();
+
+    /**
+     * 棰嗗煙
+     * @return 棰嗗煙鐨勫��
+     */
+    String namespace();
+
+    /**
+     * 鑾峰彇瀵硅薄鐨勫睘鎬�
+     * @return 瀵硅薄鐨勫睘鎬�
+     */
+    String value();
+
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/annotation/FlowNotifyAfter.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/annotation/FlowNotifyAfter.java
new file mode 100644
index 0000000..1a6b1ec
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/annotation/FlowNotifyAfter.java
@@ -0,0 +1,18 @@
+package com.vci.web.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 娴佺▼閫氱煡娉ㄨВ
+ * @author weidy
+ * @date 2022-04-21
+ */
+@Target({ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface FlowNotifyAfter {
+
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/annotation/FlowNotifyBefore.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/annotation/FlowNotifyBefore.java
new file mode 100644
index 0000000..a2209de
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/annotation/FlowNotifyBefore.java
@@ -0,0 +1,18 @@
+package com.vci.web.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 娴佺▼閫氱煡娉ㄨВ
+ * @author weidy
+ * @date 2022-04-21
+ */
+@Target({ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface FlowNotifyBefore {
+
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/annotation/FlowNotifyWeb.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/annotation/FlowNotifyWeb.java
new file mode 100644
index 0000000..3064c02
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/annotation/FlowNotifyWeb.java
@@ -0,0 +1,30 @@
+package com.vci.web.annotation;
+
+import org.springframework.core.annotation.AliasFor;
+import org.springframework.stereotype.Component;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 娴佺▼閫氱煡娉ㄨВ
+ * @author weidy
+ * @date 2022-04-21
+ */
+@Target({ElementType.TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+@Component
+public @interface FlowNotifyWeb {
+
+    /**
+     * bean鐨勫悕绉�
+     * @return
+     */
+    @AliasFor(
+            annotation = Component.class
+    )
+    String value() default "";
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/annotation/VciTransactional.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/annotation/VciTransactional.java
new file mode 100644
index 0000000..053a1eb
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/annotation/VciTransactional.java
@@ -0,0 +1,19 @@
+package com.vci.web.annotation;
+
+/**
+ * 鍥犱负web绔殑鏈嶅姟涓嶈杩炴暟鎹簱锛屾墍浠ユ秹鍙婂埌浜嬪姟鐨勯棶棰樹笉鑳借В鍐筹紝鍙兘鍩轰簬浜嬪姟鐨勬�濊矾鏉ュ鐞�
+ * 涓嶈杩炴暟鎹簱
+ * 涓嶈杩炴暟鎹簱
+ * 涓嶈杩炴暟鎹簱
+ * @author weidy
+ * @date 2022-1-20
+ */
+public @interface VciTransactional {
+
+    /**
+     * 瑙﹀彂鍥炶皟鐨勫紓甯�
+     * @return 寮傚父绫诲瀷
+     */
+    Class<? extends Throwable>[] rollbackFor() default {};
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/bo/BtmOrLinkProcessAttributeInfo.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/bo/BtmOrLinkProcessAttributeInfo.java
new file mode 100644
index 0000000..2e0b384
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/bo/BtmOrLinkProcessAttributeInfo.java
@@ -0,0 +1,99 @@
+package com.vci.web.bo;
+
+/**
+ * 涓氬姟绫诲瀷鎴栬�呴摼鎺ョ被鍨嬫壂鎻忓睘鎬х殑鏃跺�欎娇鐢ㄧ殑浼犺緭瀵硅薄
+ * @author weidy
+ * @date 2019/12/11 11:13 AM
+ */
+public class BtmOrLinkProcessAttributeInfo {
+
+    /**
+     * 绫荤殑鍚嶇О
+     */
+    private String id;
+
+    /**
+     * 绫荤殑鏄剧ず鍚嶇О
+     */
+    private String name;
+
+    /**
+     * 鏄惁閾炬帴绫诲瀷
+     */
+    private boolean linkType = false;
+
+    /**
+     * 鏄惁鎺у埗鐗堟湰
+     */
+    private boolean revision;
+
+    /**
+     * 鏄惁鎺у埗鐢熷懡鍛ㄦ湡
+     */
+    private boolean lifeCycle;
+
+    /**
+     * 鏄惁鎺у埗瀵嗙骇
+     */
+    private boolean secret;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public boolean isLinkType() {
+        return linkType;
+    }
+
+    public void setLinkType(boolean linkType) {
+        this.linkType = linkType;
+    }
+
+    public boolean isRevision() {
+        return revision;
+    }
+
+    public void setRevision(boolean revision) {
+        this.revision = revision;
+    }
+
+    public boolean isLifeCycle() {
+        return lifeCycle;
+    }
+
+    public void setLifeCycle(boolean lifeCycle) {
+        this.lifeCycle = lifeCycle;
+    }
+
+    public boolean isSecret() {
+        return secret;
+    }
+
+    public void setSecret(boolean secret) {
+        this.secret = secret;
+    }
+
+    @Override
+    public String toString() {
+        return "BtmOrLinkProcessAttributeInfo{" +
+                "id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", linkType=" + linkType +
+                ", revision=" + revision +
+                ", lifeCycle=" + lifeCycle +
+                ", secret=" + secret +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/bo/FlowNoticeInfo.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/bo/FlowNoticeInfo.java
new file mode 100644
index 0000000..e0f2408
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/bo/FlowNoticeInfo.java
@@ -0,0 +1,137 @@
+package com.vci.web.bo;
+
+import com.vci.web.dto.ProcessStartConfigDTO;
+import com.vci.web.pageModel.ProcessTemplateVO;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 娴佺▼閫氱煡鐩稿叧鐨勪俊鎭�
+ * @author weidy
+ * @date 2022-04-22
+ */
+public class FlowNoticeInfo implements java.io.Serializable{
+
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = -8836620685919060656L;
+    /**
+     * 鏂板浠诲姟
+     */
+    private List<Map> newItemList;
+
+    /**
+     * 瀹屾垚浠诲姟
+     */
+    private List<Map> finishItemList;
+
+    /**
+     * 璺敱
+     */
+    private String outcome;
+
+    /**
+     * 瀹℃壒鎰忚
+     */
+    private String note;
+
+    /**
+     * 鎵ц涔嬪墠鐨勬湇鍔℃椂闂�
+     */
+    private long serverTime;
+
+    /**
+     * 寮�鍚祦绋嬬殑淇℃伅
+     */
+    private ProcessStartConfigDTO startConfigDTO;
+
+    /**
+     * 娴佺▼鍙橀噺
+     */
+    private Map<String, String> variablesInfo ;
+
+    /**
+     * 娴佺▼妯℃澘鐨勪俊鎭�
+     */
+    private ProcessTemplateVO processTemplateVO;
+
+    public List<Map> getNewItemList() {
+        return newItemList;
+    }
+
+    public void setNewItemList(List<Map> newItemList) {
+        this.newItemList = newItemList;
+    }
+
+    public List<Map> getFinishItemList() {
+        return finishItemList;
+    }
+
+    public void setFinishItemList(List<Map> finishItemList) {
+        this.finishItemList = finishItemList;
+    }
+
+    public String getOutcome() {
+        return outcome;
+    }
+
+    public void setOutcome(String outcome) {
+        this.outcome = outcome;
+    }
+
+    public String getNote() {
+        return note;
+    }
+
+    public void setNote(String note) {
+        this.note = note;
+    }
+
+    public long getServerTime() {
+        return serverTime;
+    }
+
+    public void setServerTime(long serverTime) {
+        this.serverTime = serverTime;
+    }
+
+    public ProcessStartConfigDTO getStartConfigDTO() {
+        return startConfigDTO;
+    }
+
+    public void setStartConfigDTO(ProcessStartConfigDTO startConfigDTO) {
+        this.startConfigDTO = startConfigDTO;
+    }
+
+    public Map<String, String> getVariablesInfo() {
+        return variablesInfo;
+    }
+
+    public void setVariablesInfo(Map<String, String> variablesInfo) {
+        this.variablesInfo = variablesInfo;
+    }
+
+    public ProcessTemplateVO getProcessTemplateVO() {
+        return processTemplateVO;
+    }
+
+    public void setProcessTemplateVO(ProcessTemplateVO processTemplateVO) {
+        this.processTemplateVO = processTemplateVO;
+    }
+
+    @Override
+    public String toString() {
+        return "FlowNoticeInfo{" +
+                "newItemList=" + newItemList +
+                ", finishItemList=" + finishItemList +
+                ", outcome='" + outcome + '\'' +
+                ", note='" + note + '\'' +
+                ", serverTime=" + serverTime +
+                ", startConfigDTO=" + startConfigDTO +
+                ", variablesInfo=" + variablesInfo +
+                ", processTemplateVO=" + processTemplateVO +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/bo/LoginResultBO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/bo/LoginResultBO.java
new file mode 100644
index 0000000..08973cb
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/bo/LoginResultBO.java
@@ -0,0 +1,136 @@
+package com.vci.web.bo;
+
+import com.vci.starter.web.pagemodel.SessionInfo;
+
+import java.util.Arrays;
+import java.util.Map;
+
+/**
+ * 鐢ㄦ埛鐧诲綍鍚庣殑缁撴灉
+ * @author weidy
+ * @date 2020/2/5
+ */
+public class LoginResultBO implements java.io.Serializable{
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = 4550789634135427717L;
+
+    /**
+     * 鏄惁鎴愬姛
+     */
+    private boolean success;
+
+    /**
+     * 澶辫触浠e彿
+     */
+    private String failCode;
+
+    /**
+     * 澶辫触鐨勪俊鎭�
+     */
+    private String failMsg;
+
+    /**
+     * 澶辫触淇℃伅鐨勭浉鍏冲璞�
+     */
+    private String[] failMsgArray;
+
+    /**
+     * 鏄惁闇�瑕佺珛鍗充慨鏀瑰瘑鐮�
+     */
+    private boolean mustChangePassword;
+
+    /**
+     * 瀵嗙爜鎻愮ず淇℃伅
+     */
+    private String passwordInfo;
+
+    /**
+     * 浼氳瘽淇℃伅
+     */
+    private SessionInfo sessionInfo;
+
+    /**
+     * 璇锋眰鐨勭浉鍏崇殑鍙傛暟
+     */
+    private Map<String,String[]> requestParams;
+
+    public boolean isSuccess() {
+        return success;
+    }
+
+    public void setSuccess(boolean success) {
+        this.success = success;
+    }
+
+    public String getFailCode() {
+        return failCode;
+    }
+
+    public void setFailCode(String failCode) {
+        this.failCode = failCode;
+    }
+
+    public String getFailMsg() {
+        return failMsg;
+    }
+
+    public void setFailMsg(String failMsg) {
+        this.failMsg = failMsg;
+    }
+
+    public String[] getFailMsgArray() {
+        return failMsgArray;
+    }
+
+    public void setFailMsgArray(String[] failMsgArray) {
+        this.failMsgArray = failMsgArray;
+    }
+
+    public boolean isMustChangePassword() {
+        return mustChangePassword;
+    }
+
+    public void setMustChangePassword(boolean mustChangePassword) {
+        this.mustChangePassword = mustChangePassword;
+    }
+
+    public String getPasswordInfo() {
+        return passwordInfo;
+    }
+
+    public void setPasswordInfo(String passwordInfo) {
+        this.passwordInfo = passwordInfo;
+    }
+
+    public SessionInfo getSessionInfo() {
+        return sessionInfo;
+    }
+
+    public void setSessionInfo(SessionInfo sessionInfo) {
+        this.sessionInfo = sessionInfo;
+    }
+
+    public Map<String, String[]> getRequestParams() {
+        return requestParams;
+    }
+
+    public void setRequestParams(Map<String, String[]> requestParams) {
+        this.requestParams = requestParams;
+    }
+
+    @Override
+    public String toString() {
+        return "LoginResultBO{" +
+                "success=" + success +
+                ", failCode='" + failCode + '\'' +
+                ", failMsg='" + failMsg + '\'' +
+                ", failMsgArray=" + Arrays.toString(failMsgArray) +
+                ", mustChangePassword=" + mustChangePassword +
+                ", passwordInfo='" + passwordInfo + '\'' +
+                ", sessionInfo=" + sessionInfo +
+                ", requestParams=" + requestParams +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/bo/OsAttrOtherInfoBO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/bo/OsAttrOtherInfoBO.java
new file mode 100644
index 0000000..221829e
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/bo/OsAttrOtherInfoBO.java
@@ -0,0 +1,89 @@
+package com.vci.web.bo;
+
+/**
+ * 鑰佸钩鍙颁腑灞炴�х殑鍏朵粬淇℃伅
+ * @author weidy
+ * @date 2021/8/23
+ */
+public class OsAttrOtherInfoBO implements java.io.Serializable {
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = 237050158928429469L;
+
+    /**
+     * 鍏佽绌�
+     */
+    private boolean allowNull = true;
+
+    /**
+     * 闀垮害
+     */
+    private Integer length =50;
+
+    /**
+     * 绮惧害
+     */
+    private Integer accuracy=2;
+
+    /**
+     * 鏋氫妇
+     */
+    private String enumId;
+
+    /**
+     * 涓氬姟绫诲瀷
+     */
+    private String btmId;
+
+    public boolean isAllowNull() {
+        return allowNull;
+    }
+
+    public void setAllowNull(boolean allowNull) {
+        this.allowNull = allowNull;
+    }
+
+    public Integer getLength() {
+        return length;
+    }
+
+    public void setLength(Integer length) {
+        this.length = length;
+    }
+
+    public Integer getAccuracy() {
+        return accuracy;
+    }
+
+    public void setAccuracy(Integer accuracy) {
+        this.accuracy = accuracy;
+    }
+
+    public String getEnumId() {
+        return enumId;
+    }
+
+    public void setEnumId(String enumId) {
+        this.enumId = enumId;
+    }
+
+    public String getBtmId() {
+        return btmId;
+    }
+
+    public void setBtmId(String btmId) {
+        this.btmId = btmId;
+    }
+
+    @Override
+    public String toString() {
+        return "OsAttrOtherInfoBO{" +
+                "allowNull=" + allowNull +
+                ", length=" + length +
+                ", accuracy=" + accuracy +
+                ", enumId='" + enumId + '\'' +
+                ", btmId='" + btmId + '\'' +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/bo/OsCodeGenAttributeBO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/bo/OsCodeGenAttributeBO.java
new file mode 100644
index 0000000..719f11e
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/bo/OsCodeGenAttributeBO.java
@@ -0,0 +1,506 @@
+package com.vci.web.bo;
+
+/**
+ * 浠g爜鐢熸垚鏃剁殑灞炴�у璞�
+ * @author weidy
+ * @date 2020/8/2 22:38
+ */
+public class OsCodeGenAttributeBO {
+
+    /**
+     * 灞炴�х殑澶у啓
+     */
+    private String idUpper;
+
+    /**
+     * 灞炴�х殑瀛楁鍚嶇О
+     */
+    private String id;
+
+    /**
+     * 灞炴�х殑涓枃鍚嶇О
+     */
+    private String name;
+
+    /**
+     * 灞炴�х殑闀垮害
+     */
+    private Integer attributeLength;
+
+    /**
+     * 灞炴�у湪鏈笟鍔$被鍨嬩腑鐨勬弿杩�
+     */
+    private String description;
+
+    /**
+     * java鏁版嵁绫诲瀷
+     */
+    private String attrDataType;
+
+    /**
+     * vci骞冲彴鐨勫睘鎬х被
+     */
+    private String vciAttrDataType;
+
+    /**
+     * vo鍜宒to閲岀殑灞炴�х被
+     */
+    private String voJavaDataType;
+
+    /**
+     * mybatis閲岀殑绫诲瀷
+     */
+    private String jdbcType;
+
+    /**
+     * 鏄惁鍙互涓虹┖
+     */
+    private String nullable = "true";
+
+    /**
+     * 榛樿鍊�
+     */
+    private String defaultValue;
+
+
+    /**
+     * 灏忔暟绮惧害浣嶆暟
+     */
+    private Integer precisionLength;
+
+    /**
+     * 灏忔暟鍒诲害浣嶆暟
+     */
+    private Integer scaleLength;
+
+    /**
+     * 鍙栧�艰寖鍥�
+     */
+    private String range;
+
+    /**
+     * 鏄惁鍙傜収
+     */
+    private boolean referFlag;
+
+    /**
+     * 鍙傜収鐨勫悕绉板瓧娈垫槸鍚﹀瓨鍦�
+     */
+    private boolean referNameExist;
+
+    /**
+     * 鍙傜収涓氬姟绫诲瀷
+     */
+    private String referBtmTypeId;
+
+    /**
+     * 鍙傜収涓氬姟绫诲瀷鍚嶇О
+     */
+    private String referBtmTypeName;
+
+    /**
+     * 鍙傜収鏄剧ず鍊肩殑瀛楁灞炴��
+     */
+    private String referBtmTypeShowField;
+
+    /**
+     * 鍙傜収鏄剧ず鍊肩殑get鏂规硶
+     */
+    private String referBtmTypeShowFieldGetter;
+
+    /**
+     * 鍙傜収鏄剧ず鍊肩殑set鏂规硶
+     */
+    private String referBtmTypeShowFieldSetter;
+
+    /**
+     * 鍙傜収鍦ㄦ暟鎹簱閲岀殑琛ㄨ揪寮�
+     */
+    private String referDBField;
+
+    /**
+     * 榛樿涓哄垪琛ㄧ殑鍙傜収鏂瑰紡
+     */
+    private String referType = "grid";
+
+    /**
+     * 鍙傜収鐨勮矾寰�
+     */
+    private String referControlUrl ;
+
+    /**
+     * 鏋氫妇缂栧彿
+     */
+    private String enumId;
+
+    /**
+     * 鏋氫妇鍚嶇О
+     */
+    private String enumName;
+
+    /**
+     * 鏄惁鏋氫妇
+     */
+    private boolean enumFlag;
+
+    /**
+     * 鏄剧ず鏋氫妇鐨勬枃鏈殑灞炴��
+     */
+    private String enumShowField;
+
+    /**
+     * 鏋氫妇鏄剧ず鍊肩殑get鏂规硶
+     */
+    private String enumShowFieldGetter;
+
+    /**
+     * 鏋氫妇鏄剧ず鍊肩殑set鏂规硶
+     */
+    private String enumShowFieldSetter;
+
+    /**
+     * 鏋氫妇绫诲瀷鐨勬暟鎹簱鏌ヨ瀛楁
+     */
+    private String enumDBField;
+
+    /**
+     * get鏂规硶鐨勫悕绉�
+     */
+    private String getter;
+
+    /**
+     * set鏂规硶鐨勫悕绉�
+     */
+    private String setter;
+
+    /**
+     * 鍦╲o閲岀殑鑾峰彇鏂规硶
+     */
+    private String voGetter;
+
+    /**
+     * 鍦╲o閲岀殑璁剧疆鏂规硶
+     */
+    private String voSetter;
+
+    public boolean isReferNameExist() {
+        return referNameExist;
+    }
+
+    public void setReferNameExist(boolean referNameExist) {
+        this.referNameExist = referNameExist;
+    }
+
+    public String getReferDBField() {
+        return referDBField;
+    }
+
+    public void setReferDBField(String referDBField) {
+        this.referDBField = referDBField;
+    }
+
+    public String getIdUpper() {
+        return idUpper;
+    }
+
+    public void setIdUpper(String idUpper) {
+        this.idUpper = idUpper;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Integer getAttributeLength() {
+        return attributeLength;
+    }
+
+    public void setAttributeLength(Integer attributeLength) {
+        this.attributeLength = attributeLength;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getAttrDataType() {
+        return attrDataType;
+    }
+
+    public void setAttrDataType(String attrDataType) {
+        this.attrDataType = attrDataType;
+    }
+
+    public String getVciAttrDataType() {
+        return vciAttrDataType;
+    }
+
+    public void setVciAttrDataType(String vciAttrDataType) {
+        this.vciAttrDataType = vciAttrDataType;
+    }
+
+    public String getJdbcType() {
+        return jdbcType;
+    }
+
+    public void setJdbcType(String jdbcType) {
+        this.jdbcType = jdbcType;
+    }
+
+    public String getNullable() {
+        return nullable;
+    }
+
+    public void setNullable(String nullable) {
+        this.nullable = nullable;
+    }
+
+    public String getDefaultValue() {
+        return defaultValue;
+    }
+
+    public void setDefaultValue(String defaultValue) {
+        this.defaultValue = defaultValue;
+    }
+
+    public Integer getPrecisionLength() {
+        return precisionLength;
+    }
+
+    public void setPrecisionLength(Integer precisionLength) {
+        this.precisionLength = precisionLength;
+    }
+
+    public Integer getScaleLength() {
+        return scaleLength;
+    }
+
+    public void setScaleLength(Integer scaleLength) {
+        this.scaleLength = scaleLength;
+    }
+
+    public String getRange() {
+        return range;
+    }
+
+    public void setRange(String range) {
+        this.range = range;
+    }
+
+    public boolean isReferFlag() {
+        return referFlag;
+    }
+
+    public void setReferFlag(boolean referFlag) {
+        this.referFlag = referFlag;
+    }
+
+    public String getReferBtmTypeId() {
+        return referBtmTypeId;
+    }
+
+    public void setReferBtmTypeId(String referBtmTypeId) {
+        this.referBtmTypeId = referBtmTypeId;
+    }
+
+    public String getReferBtmTypeName() {
+        return referBtmTypeName;
+    }
+
+    public void setReferBtmTypeName(String referBtmTypeName) {
+        this.referBtmTypeName = referBtmTypeName;
+    }
+
+    public String getReferBtmTypeShowField() {
+        return referBtmTypeShowField;
+    }
+
+    public void setReferBtmTypeShowField(String referBtmTypeShowField) {
+        this.referBtmTypeShowField = referBtmTypeShowField;
+    }
+
+    public String getReferBtmTypeShowFieldGetter() {
+        return referBtmTypeShowFieldGetter;
+    }
+
+    public void setReferBtmTypeShowFieldGetter(String referBtmTypeShowFieldGetter) {
+        this.referBtmTypeShowFieldGetter = referBtmTypeShowFieldGetter;
+    }
+
+    public String getReferBtmTypeShowFieldSetter() {
+        return referBtmTypeShowFieldSetter;
+    }
+
+    public void setReferBtmTypeShowFieldSetter(String referBtmTypeShowFieldSetter) {
+        this.referBtmTypeShowFieldSetter = referBtmTypeShowFieldSetter;
+    }
+
+    public String getEnumId() {
+        return enumId;
+    }
+
+    public void setEnumId(String enumId) {
+        this.enumId = enumId;
+    }
+
+    public String getEnumName() {
+        return enumName;
+    }
+
+    public void setEnumName(String enumName) {
+        this.enumName = enumName;
+    }
+
+    public boolean isEnumFlag() {
+        return enumFlag;
+    }
+
+    public void setEnumFlag(boolean enumFlag) {
+        this.enumFlag = enumFlag;
+    }
+
+    public String getEnumShowField() {
+        return enumShowField;
+    }
+
+    public void setEnumShowField(String enumShowField) {
+        this.enumShowField = enumShowField;
+    }
+
+    public String getEnumShowFieldGetter() {
+        return enumShowFieldGetter;
+    }
+
+    public void setEnumShowFieldGetter(String enumShowFieldGetter) {
+        this.enumShowFieldGetter = enumShowFieldGetter;
+    }
+
+    public String getEnumShowFieldSetter() {
+        return enumShowFieldSetter;
+    }
+
+    public void setEnumShowFieldSetter(String enumShowFieldSetter) {
+        this.enumShowFieldSetter = enumShowFieldSetter;
+    }
+
+    public String getGetter() {
+        return getter;
+    }
+
+    public void setGetter(String getter) {
+        this.getter = getter;
+    }
+
+    public String getSetter() {
+        return setter;
+    }
+
+    public void setSetter(String setter) {
+        this.setter = setter;
+    }
+
+    public String getVoJavaDataType() {
+        return voJavaDataType;
+    }
+
+    public void setVoJavaDataType(String voJavaDataType) {
+        this.voJavaDataType = voJavaDataType;
+    }
+
+    public String getVoGetter() {
+        return voGetter;
+    }
+
+    public void setVoGetter(String voGetter) {
+        this.voGetter = voGetter;
+    }
+
+    public String getVoSetter() {
+        return voSetter;
+    }
+
+    public void setVoSetter(String voSetter) {
+        this.voSetter = voSetter;
+    }
+
+    public String getEnumDBField() {
+        return enumDBField;
+    }
+
+    public void setEnumDBField(String enumDBField) {
+        this.enumDBField = enumDBField;
+    }
+
+    public String getReferType() {
+        return referType;
+    }
+
+    public void setReferType(String referType) {
+        this.referType = referType;
+    }
+
+    public String getReferControlUrl() {
+        return referControlUrl;
+    }
+
+    public void setReferControlUrl(String referControlUrl) {
+        this.referControlUrl = referControlUrl;
+    }
+
+    @Override
+    public String toString() {
+        return "OsCodeGenAttributeBO{" +
+                "idUpper='" + idUpper + '\'' +
+                ", id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", attributeLength=" + attributeLength +
+                ", description='" + description + '\'' +
+                ", attrDataType='" + attrDataType + '\'' +
+                ", vciAttrDataType='" + vciAttrDataType + '\'' +
+                ", voJavaDataType='" + voJavaDataType + '\'' +
+                ", jdbcType='" + jdbcType + '\'' +
+                ", nullable='" + nullable + '\'' +
+                ", defaultValue='" + defaultValue + '\'' +
+                ", precisionLength=" + precisionLength +
+                ", scaleLength=" + scaleLength +
+                ", range='" + range + '\'' +
+                ", referFlag=" + referFlag +
+                ", referNameExist=" + referNameExist +
+                ", referBtmTypeId='" + referBtmTypeId + '\'' +
+                ", referBtmTypeName='" + referBtmTypeName + '\'' +
+                ", referBtmTypeShowField='" + referBtmTypeShowField + '\'' +
+                ", referBtmTypeShowFieldGetter='" + referBtmTypeShowFieldGetter + '\'' +
+                ", referBtmTypeShowFieldSetter='" + referBtmTypeShowFieldSetter + '\'' +
+                ", referDBField='" + referDBField + '\'' +
+                ", referType='" + referType + '\'' +
+                ", referControlUrl='" + referControlUrl + '\'' +
+                ", enumId='" + enumId + '\'' +
+                ", enumName='" + enumName + '\'' +
+                ", enumFlag=" + enumFlag +
+                ", enumShowField='" + enumShowField + '\'' +
+                ", enumShowFieldGetter='" + enumShowFieldGetter + '\'' +
+                ", enumShowFieldSetter='" + enumShowFieldSetter + '\'' +
+                ", enumDBField='" + enumDBField + '\'' +
+                ", getter='" + getter + '\'' +
+                ", setter='" + setter + '\'' +
+                ", voGetter='" + voGetter + '\'' +
+                ", voSetter='" + voSetter + '\'' +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/bo/OsCodeGenButtonBO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/bo/OsCodeGenButtonBO.java
new file mode 100644
index 0000000..d4aec5a
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/bo/OsCodeGenButtonBO.java
@@ -0,0 +1,57 @@
+package com.vci.web.bo;
+
+/**
+ * 浠g爜鐢熸垚鐨勬椂鍊欑殑鎸夐挳
+ * @author weidy
+ * @date 2020/8/3 8:08
+ */
+public class OsCodeGenButtonBO {
+
+    /**
+     * 鎸夐挳鏍囪瘑
+     */
+    private String id;
+
+    /**
+     * 鎸夐挳鍚嶇О
+     */
+    private String text;
+
+    /**
+     * 鎸夐挳鍥炬爣鏍峰紡
+     */
+    private String iconCls;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getText() {
+        return text;
+    }
+
+    public void setText(String text) {
+        this.text = text;
+    }
+
+    public String getIconCls() {
+        return iconCls;
+    }
+
+    public void setIconCls(String iconCls) {
+        this.iconCls = iconCls;
+    }
+
+    @Override
+    public String toString() {
+        return "OsCodeGenButtonBO{" +
+                "id='" + id + '\'' +
+                ", text='" + text + '\'' +
+                ", iconCls='" + iconCls + '\'' +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/bo/OsCodeGenQueryBO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/bo/OsCodeGenQueryBO.java
new file mode 100644
index 0000000..9ec5c8c
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/bo/OsCodeGenQueryBO.java
@@ -0,0 +1,44 @@
+package com.vci.web.bo;
+
+/**
+ * 浠g爜鐢熸垚鐨勬椂鍊欑殑鏌ヨ鍖哄煙
+ * @author weidy
+ * @date 2020/8/3 8:08
+ */
+public class OsCodeGenQueryBO {
+
+    /**
+     * 鏌ヨ灞炴��
+     */
+    private String id;
+
+    /**
+     * 灞炴�х殑鏄剧ず鍚�
+     */
+    private String text;
+
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getText() {
+        return text;
+    }
+
+    public void setText(String text) {
+        this.text = text;
+    }
+
+    @Override
+    public String toString() {
+        return "OsCodeGenQueryBO{" +
+                "id='" + id + '\'' +
+                ", text='" + text + '\'' +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/bo/OsCodeSerialBuildBO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/bo/OsCodeSerialBuildBO.java
new file mode 100644
index 0000000..d823226
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/bo/OsCodeSerialBuildBO.java
@@ -0,0 +1,64 @@
+package com.vci.web.bo;
+
+import java.util.List;
+
+/**
+ * 搴忓垪鍙风殑鍒涘缓涓氬姟瀵硅薄
+ * @author weidy
+ * @date 2021-10-28
+ */
+public class OsCodeSerialBuildBO implements java.io.Serializable{
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = -4648596724469437099L;
+
+    /**
+     * 娴佹按渚濇嵁
+     */
+    private String serialUnit;
+
+    /**
+     * 娴佹按鍙�
+     */
+    private List<String> serialNoList;
+
+    /**
+     * 娴佹按鐮侊紙鐢熸垚鍚庣殑锛�
+     */
+    private List<String> serialCodeList;
+
+
+    public String getSerialUnit() {
+        return serialUnit;
+    }
+
+    public void setSerialUnit(String serialUnit) {
+        this.serialUnit = serialUnit;
+    }
+
+    public List<String> getSerialNoList() {
+        return serialNoList;
+    }
+
+    public void setSerialNoList(List<String> serialNoList) {
+        this.serialNoList = serialNoList;
+    }
+
+    public List<String> getSerialCodeList() {
+        return serialCodeList;
+    }
+
+    public void setSerialCodeList(List<String> serialCodeList) {
+        this.serialCodeList = serialCodeList;
+    }
+
+    @Override
+    public String toString() {
+        return "OsCodeSerialBuildBO{" +
+                "serialUnit='" + serialUnit + '\'' +
+                ", serialNoList=" + serialNoList +
+                ", serialCodeList=" + serialCodeList +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/bo/VciLogObjectBO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/bo/VciLogObjectBO.java
new file mode 100644
index 0000000..6f9ddc9
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/bo/VciLogObjectBO.java
@@ -0,0 +1,183 @@
+package com.vci.web.bo;
+
+/**
+ * 鏃ュ織鐨勪笟鍔″璞�
+ * @author weidy
+ * @date 2021-2-13
+ */
+public class VciLogObjectBO implements java.io.Serializable{
+
+	/**
+	 * 搴忓垪鍖�
+	 */
+	private static final long serialVersionUID = 6271617513568876798L;
+
+	/**
+	 * 涓嶆槸鏈�缁堟寔涔呭寲鍒版暟鎹簱閲岀殑涓婚敭锛屽彧鏄棩蹇楁湇鍔¢噷鎵�闇�瑕佺殑鍞竴璇嗗埆鐮�
+	 */
+	private String oid;
+
+	/**
+	 * 妯″潡鍚嶇О
+	 */
+	private String modelName;
+
+	/**
+	 * 鎿嶄綔鍚嶇О
+	 */
+	private String operateName;
+
+	/**
+	 * 寮�濮嬫椂闂�
+	 */
+	private long startTime;
+
+	/**
+	 * 缁撴潫鏃堕棿
+	 */
+	private long endTime;
+
+	/**
+	 * 鎻忚堪
+	 */
+	private String description;
+
+	/**
+	 * 鏄惁涓鸿皟璇�
+	 */
+	private boolean debug;
+
+	/**
+	 * 鎺у埗鍣�
+	 */
+	private String controller;
+
+	/**
+	 * 鏂规硶
+	 */
+	private String method;
+
+	/**
+	 * 鐢ㄦ埛鍚�
+	 */
+	private String userId;
+
+	/**
+	 * 濮撳悕
+	 */
+	private String userName;
+
+	/**
+	 * 鐢ㄦ埛涓婚敭
+	 */
+	private String userOid;
+
+	/**
+	 * ip鍦板潃
+	 */
+	private String ip;
+
+	public String getModelName() {
+		return modelName;
+	}
+
+	public void setModelName(String modelName) {
+		this.modelName = modelName;
+	}
+
+	public String getOperateName() {
+		return operateName;
+	}
+
+	public void setOperateName(String operateName) {
+		this.operateName = operateName;
+	}
+
+	public long getStartTime() {
+		return startTime;
+	}
+
+	public void setStartTime(long startTime) {
+		this.startTime = startTime;
+	}
+
+	public long getEndTime() {
+		return endTime;
+	}
+
+	public void setEndTime(long endTime) {
+		this.endTime = endTime;
+	}
+
+	public String getDescription() {
+		return description;
+	}
+
+	public void setDescription(String description) {
+		this.description = description;
+	}
+
+	public String getController() {
+		return controller;
+	}
+
+	public void setController(String controller) {
+		this.controller = controller;
+	}
+
+	public String getMethod() {
+		return method;
+	}
+
+	public void setMethod(String method) {
+		this.method = method;
+	}
+
+	public String getUserId() {
+		return userId;
+	}
+
+	public void setUserId(String userId) {
+		this.userId = userId;
+	}
+
+	public String getUserName() {
+		return userName;
+	}
+
+	public void setUserName(String userName) {
+		this.userName = userName;
+	}
+
+	public String getUserOid() {
+		return userOid;
+	}
+
+	public void setUserOid(String userOid) {
+		this.userOid = userOid;
+	}
+
+	public String getIp() {
+		return ip;
+	}
+
+	public void setIp(String ip) {
+		this.ip = ip;
+	}
+
+	public String getOid() {
+		return oid;
+	}
+
+	public void setOid(String oid) {
+		this.oid = oid;
+	}
+
+	public boolean isDebug() {
+		return debug;
+	}
+
+	public void setDebug(boolean debug) {
+		this.debug = debug;
+	}
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/config/WebFilePreviewAutoConfig.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/config/WebFilePreviewAutoConfig.java
new file mode 100644
index 0000000..111b767
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/config/WebFilePreviewAutoConfig.java
@@ -0,0 +1,66 @@
+package com.vci.web.config;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * 鏂囦欢棰勮鐨勯厤缃�.
+ * @author weidy
+ * @date 2021/5/20
+ */
+@Configuration
+@ConfigurationProperties(prefix = "file-preview")
+public class WebFilePreviewAutoConfig {
+
+    /**
+     * 棰勮鏈嶅姟鐨勮矾寰�
+     */
+    private String previewServiceUrl;
+
+    /**
+     * 棰勮鐨勫唴閮╧ey,涓庨瑙堟湇鍔″櫒閲屽搴�
+     */
+    private String previewSystemKey;
+
+    /**
+     * 澶辨晥鏃堕棿锛屽崟浣嶄负鍒嗛挓锛岄粯璁や负5
+     */
+    private Long invalidTime = 5L;
+
+    /***
+     * app閲岄厤缃殑 private-token-key灏嗕細鐢ㄤ簬閰嶇疆  previewSystemKey銆� 闇�瑕佸悓鏃跺湪棰勮鏈嶅姟閲岄厤缃�
+     */
+
+    public String getPreviewServiceUrl() {
+        return previewServiceUrl;
+    }
+
+    public void setPreviewServiceUrl(String previewServiceUrl) {
+        this.previewServiceUrl = previewServiceUrl;
+    }
+
+    public String getPreviewSystemKey() {
+        return previewSystemKey;
+    }
+
+    public void setPreviewSystemKey(String previewSystemKey) {
+        this.previewSystemKey = previewSystemKey;
+    }
+
+    public Long getInvalidTime() {
+        return invalidTime;
+    }
+
+    public void setInvalidTime(Long invalidTime) {
+        this.invalidTime = invalidTime;
+    }
+
+    @Override
+    public String toString() {
+        return "WebFilePreviewAutoConfig{" +
+                "previewServiceUrl='" + previewServiceUrl + '\'' +
+                ", previewSystemKey='" + previewSystemKey + '\'' +
+                ", invalidTime=" + invalidTime +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/constant/BtmIdConstant.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/constant/BtmIdConstant.java
new file mode 100644
index 0000000..d41164d
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/constant/BtmIdConstant.java
@@ -0,0 +1,43 @@
+package com.vci.web.constant;
+
+/**
+ * 涓氬姟绫诲瀷鐨勫畾涔�
+ * @author weidy
+ * @date 2022-1-12
+ */
+public class BtmIdConstant {
+
+    /**
+     * 缂栫爜瑙勫垯 鐨勪笟鍔$被鍨嬪悕绉�
+     */
+    public static final String OS_CODE_RULE_BTM_TYPE = "osCodeRule";
+
+    /**
+     * 缂栫爜瑙勫垯鍏冪礌鐨勪笟鍔$被鍨嬪悕绉�
+     */
+    public static final String OS_CODE_RULE_ELEMENT_BTM_TYPE = "osCodeRuleElement";
+
+    /**
+     * 缂栫爜瑙勫垯涓殑鏋氫妇鍊兼槧灏�
+     */
+    public static final String OS_CODE_ENUM_BTM_TYPE = "osCodeEnum";
+
+    /**
+     * 缂栫爜鐨勬柇鍙�
+     */
+    public static final String OS_CODE_BREAK_CODE_BTM_TYPE = "osCodeBreakCode";
+
+    /**
+     * 缂栫爜鐨勬祦姘村彿
+     */
+    public static final String OS_CODE_SERIAL_NUMBER_BTM_TYPE = "osCodeSerialNumber";
+
+    /**
+     * 浠g爜鐢熸垚鏂规
+     */
+    public static final String OS_CODE_GEN_SCHEMA_BTM_TYPE =  "codegenschema";
+    /**
+     * 鍙緭鍙�夊唴瀹�
+     */
+    public static final String BD_SELECT_INPUT = "bdselectinput" ;
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/constant/CacheKeyConstant.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/constant/CacheKeyConstant.java
new file mode 100644
index 0000000..93f855f
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/constant/CacheKeyConstant.java
@@ -0,0 +1,80 @@
+package com.vci.web.constant;
+
+/**
+ * 缂撳瓨鐨刱ey鐨勫父閲�
+ * @author weidy
+ * @date 2021/2/20
+ */
+public class CacheKeyConstant {
+
+    /**
+     * 鎵�鏈夌殑灞炴��
+     */
+    public static final String ALL_STATUS = "'allStatus'";
+
+    /**
+     * 鎵�鏈夌殑涓氬姟绫诲瀷
+     */
+    public static final String ALL_BTM = "'allBtm'";
+
+    /**
+     * 鎵�鏈夌殑鏋氫妇
+     */
+    public static final String ALL_ENUM = "'allEnum'";
+
+    /**
+     * 鎵�鏈夌敓鍛藉懆鏈�
+     */
+    public static final String ALL_LIFE_CYCLE = "'allLife'";
+
+    /**
+     * 鎵�鏈夌殑閾炬帴鍏崇郴
+     */
+    public static final String ALL_Link = "'allLink'";
+
+    /**
+     * 鎵�鏈夌殑鐗堟湰瑙勫垯
+     */
+    public static final String ALL_REVISION = "'allRevisionRule'";
+
+    /**
+     * 鎵�鏈夌殑鍔熻兘
+     */
+    public static final String ALL_FUNCTION = "'allFunction'";
+
+    /**
+     * 鎵�鏈夌殑灞炴��
+     */
+    public static final String ALL_ATTRIBUTE = "'allAttribute'";
+    /**
+     * 鎵�鏈夌殑UI鍖哄煙
+     */
+    public static final String ALL_LAYOUT = "'allLayout'" ;
+
+    /**
+     * 鎵�鏈夌殑琛ㄥ崟鍜岃〃鏍�
+     */
+    public static final String ALL_FORM_AND_TABLE = "'allFormAndTable'";
+    /**
+     * 鎵�鏈夌殑琛ㄥ崟
+     */
+    public static final String ALL_FORM = "'allForm'";
+
+    /**
+     * 鎵�鏈夌殑琛ㄦ牸
+     */
+    public static final String ALL_TABLE = "'allTable'";
+    /**
+     * 鎵�鏈夌殑action
+     */
+    public static final String ALL_ACTION = "'allAction'";
+    /**
+     * 鎵�鏈夌殑UI
+     */
+    public static final String ALL_UI = "'allUI'";
+
+    /**
+     * 鎵�鏈夌殑缁勪欢
+     */
+    public static final String ALL_COMP = "'allComp'";
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/constant/CacheNameConstant.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/constant/CacheNameConstant.java
new file mode 100644
index 0000000..673f586
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/constant/CacheNameConstant.java
@@ -0,0 +1,24 @@
+package com.vci.web.constant;
+
+/**
+ * 缂撳瓨鐨勫悕绉�
+ * @author weidy
+ * @date 2021-2-14
+ */
+public class CacheNameConstant {
+
+    /**
+     * 浼氳瘽鐨勪俊鎭�
+     */
+    public static final String VCI_SESSION = "vci_session_cache";
+
+    /**
+     * 瀵硅薄鏈嶅姟
+     */
+    public static final String VCI_OBJECT_SERVICE = "vci_object_service";
+
+    /**
+     * 鐢ㄦ埛
+     */
+    public static final String VCI_USER = "VCI_USER";
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/constant/EnumIdConstant.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/constant/EnumIdConstant.java
new file mode 100644
index 0000000..d154c6f
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/constant/EnumIdConstant.java
@@ -0,0 +1,60 @@
+package com.vci.web.constant;
+
+/**
+ * 鏋氫妇鐨勪笟鍔$被鍨�
+ * @author weidy
+ * @dat2 2021-2-15
+ */
+public class EnumIdConstant {
+
+    /**
+     * 鐢ㄦ埛鏋氫妇
+     */
+    public static final String USERSECRET_ENUMNAME = "usersecurityenum";
+
+    /**
+     * 鏁版嵁鏋氫妇
+     */
+    public static final String DATASECRET_ENUMNAME="Enumsecretgrade";
+
+    /**
+     * IP瀵嗙骇
+     */
+    public static final String IPSECRET_ENUMNAME = "ipsecurityenum";
+
+    /**
+     * ip鏋氫妇鐨勪笟鍔$被鍨�
+     */
+    public static final String IPSECRET_BTMNAME = "ipsecurity";
+
+    /**
+     * 鐢熷懡鍛ㄦ湡浣滀负鏋氫妇鐨勫悗缂�
+     */
+    public static final String LC_STATUS_SUBFIX = "${lcstatus}";
+
+    /**
+     * 浠g爜鐢熸垚鐨刄I闈㈡澘绫诲瀷
+     */
+    public static final String OS_CODE_GEN_PANEL_TYPE = "codeGenPanelType" ;
+
+    /**
+     * 缂栫爜鐢熸垚鏂瑰紡
+     */
+    public static final String CODE_PRODUCT_TYPE = "codeProductType";
+
+    /**
+     * 缂栫爜鐨勫厓绱犵被鍨�
+     */
+    public static final String CODE_ELEMENT_TYPE = "codeElementType";
+
+    /**
+     * 缂栫爜琛ヤ綅鏂瑰紡
+     */
+    public static final String CODE_FILL_TYPE = "codeFillType";
+
+    /**
+     * 缂栫爜鐨勬椂闂村彇鍊肩被鍨�
+     */
+    public static final String CODE_DATE_VALUE_TYPE = "codeDateValueType";
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/constant/FieldConstant.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/constant/FieldConstant.java
new file mode 100644
index 0000000..a4402c1
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/constant/FieldConstant.java
@@ -0,0 +1,107 @@
+package com.vci.web.constant;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 骞冲彴鐨勫睘鎬�
+ * @author weidy
+ * @date 2021/8/21
+ */
+public class FieldConstant {
+
+
+    /**
+     * 鐗堟湰绠$悊鐩稿叧鐨勫瓧娈靛拰鏄剧ず鍚嶇О鏄犲皠
+     */
+    public static final Map<String,String> REVISION_MANAGE_FIELD_MAP = new HashMap(){{
+        put("nameoid","瀵硅薄涓婚敭");
+        put("revisionoid","鐗堟湰涓婚敭");
+        put("lastr","鏄惁鏈�鏂扮増鏈�");
+        put("firstr","鏄惁鏈�鑰佺増鏈�");
+        put("lastv","鏄惁鏈�鏂扮増娆�");
+        put("firstv","鏄惁鏈�鑰佺増娆�");
+        put("revisionrule","鐗堟湰瑙勫垯");
+        put("revisionseq","鐗堟湰鎺掑簭鍙�");
+        put("revisionvalue","鐗堟湰鍊�");
+        put("versionrule","鐗堟瑙勫垯");
+        put("versionseq","鐗堟鎺掑簭鍙�");
+        put("versionvalue","鐗堟鍊�");
+        put("checkinby","绛惧叆浜�");
+        put("checkintime","绛惧叆鏃堕棿");
+        put("checkoutby","绛惧嚭浜�");
+        put("checkouttime","绛惧嚭鏃堕棿");
+        put("copyfromversion","鎷疯礉鐗堟湰鏉ユ簮");
+    }} ;
+
+    /**
+     * 鍩虹鐨勫睘鎬у瓧娈垫暟缁�
+     */
+    public static final Map<String,String> BASIC_FIELD_MAP = new HashMap(){{
+        put("oid","涓婚敭");
+        put("btmname","涓氬姟绫诲瀷鐨勫悕绉�");
+        put("id","缂栧彿");
+        put("name","鍚嶇О");
+        put("description","鎻忚堪");
+        put("creator","鍒涘缓浜�");
+        put("createtime","鍒涘缓鏃堕棿");
+        put("lastmodifier","鏈�鍚庢椂闂翠汉");
+        put("lastmodifytime","鏈�鍚庝慨鏀规椂闂�");
+        put("ts","鏃堕棿鎴�");
+        put("owner","鎷ユ湁鑰�");
+    }};
+
+    /**
+     * 鍏煎鐨勬椂鍊欙紝鍩虹妯″瀷鐨勫睘鎬ф槧灏�
+     */
+    public static final Map<String,String> BASE_MODEL_COMPATIBILITY_MAP = new HashMap(){{
+        put("lastr","islastr");
+        put("firstr","isfirstr");
+        put("lastv","islastv");
+        put("firstv","isfirstv");
+    }};
+
+    /**
+     * 鐢熷懡鍛ㄦ湡鐨勫睘鎬�
+     */
+    public static final String LC_STATUS_FIELD = "lcstatus";
+
+    /**
+     * 鐢熷懡鍛ㄦ湡鐨勬樉绀烘枃鏈�
+     */
+    public static final String LC_STATUS_FIELD_TEXT = "lcStatus_text";
+
+    /**
+     * 鐢熷懡鍛ㄦ湡绠$悊鐩稿叧鐨勫瓧娈�
+     */
+    public static final Map<String,String>  LIFECYCLE_MANAGE_FIELD_MAP = new HashMap(){{
+        put(LC_STATUS_FIELD,"鐢熷懡鍛ㄦ湡鍊�");
+    }};
+
+    /**
+     * 瀵嗙骇绠$悊鐩稿叧鐨勫瓧娈�
+     */
+    public static final Map<String,String> SECRET_MANAGE_FIELD_MAP = new HashMap(){{
+        put("secretgrade","瀵嗙骇鍊�");
+    }};
+
+    /**
+     * 閾炬帴绫诲瀷鐨勫瓧娈祄ap
+     */
+    public static final Map<String,String> LINK_TYPE_FIELD_MAP = new HashMap(){{
+        put("oid","涓婚敭");
+        put("creator","鍒涘缓浜�");
+        put("createtime","鍒涘缓鏃堕棿");
+        put("lastmodifier","鏈�鍚庢椂闂翠汉");
+        put("lastmodifytime","鏈�鍚庝慨鏀规椂闂�");
+        put("f_oid","from绔富閿�");
+        put("f_revisionoid","from绔増鏈富閿�");
+        put("f_nameoid","from绔璞′富閿�");
+        put("f_btwname","from绔笟鍔$被鍨�");
+        put("t_oid","to绔富閿�");
+        put("t_revisionoid","to绔増鏈富閿�");
+        put("t_nameoid","to绔璞′富閿�");
+        put("t_btwname","to绔笟鍔$被鍨�");
+        put("ts","鏃堕棿鎴�");
+    }};
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/constant/FileTypeConstants.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/constant/FileTypeConstants.java
new file mode 100644
index 0000000..2f366b3
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/constant/FileTypeConstants.java
@@ -0,0 +1,12 @@
+package com.vci.web.constant;
+
+public class FileTypeConstants {
+
+	public static String SELECT_FILEPATH = "filepath";
+	public static String SELECT_FILETYPE = "filetype";
+	public static String SELECT_REVISIONLIMIT = "revisionlimit";
+	public static String SELECT_DOCUMENT_ID = "documentoid";
+	public static String FILE_DATA_TABLE = "fileobject";
+
+	public static String VOLUMENAME_SEP_FILEPATH = ":";
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/constant/LinkTypeIdConstant.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/constant/LinkTypeIdConstant.java
new file mode 100644
index 0000000..8090229
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/constant/LinkTypeIdConstant.java
@@ -0,0 +1,14 @@
+package com.vci.web.constant;
+
+/**
+ * 閾炬帴绫诲瀷鐨勫畾涔�
+ * @author weidy
+ * @date 2022-1-12
+ */
+public class LinkTypeIdConstant {
+
+    /**
+     * 娴佺▼鐨勫叧绯�
+     */
+    public static final String INPUT = "input";
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/constant/TokenKeyConstant.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/constant/TokenKeyConstant.java
new file mode 100644
index 0000000..6f7bd08
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/constant/TokenKeyConstant.java
@@ -0,0 +1,40 @@
+package com.vci.web.constant;
+
+/**
+ * token鐨勭浉鍏砶ey
+ * @author weidy
+ * @date 2019/11/7 10:10 AM
+ */
+public class TokenKeyConstant {
+
+    /**
+     * 鐢ㄦ埛鐨則oken浼犺緭鏃朵娇鐢ㄧ殑鍚嶇О
+     */
+    public static final String USER_TOKEN_KEY ="AuthorizationToken";
+
+    /**
+     * 绯荤粺鐨則oken浼犺緭鏃朵娇鐢ㄧ殑鍚嶇О
+     */
+    public static final String SYSTEM_PRIVATE_KEY = "AuthorizationSystemToken";
+
+    /**
+     * 绯荤粺鐨勬棩蹇楅摼璺富閿紶杈撴椂浣跨敤鐨勫悕绉�
+     */
+    public static final String LOG_TRACE_ID_KEY = "AuthorizationLogTraceId";
+
+    /**
+     * 鏃ュ織鐨勮拷韪富閿殑鍚嶇О
+     */
+    public static final String TRACE_ID = "logTraceId";
+
+    /**
+     * 绯荤粺鐨勫璇弬鏁板悕绉�
+     */
+    public static final String LANGUAGE_KEY = "vciLanguageCode";
+
+    /**
+     * 璇锋眰鐨勬椂闂村弬鏁�
+     */
+    public static final String REQUEST_TIMESTAMP = "vciHttpStartRequestTime";
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/constant/WFVariablesKeyConstant.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/constant/WFVariablesKeyConstant.java
new file mode 100644
index 0000000..a3a332a
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/constant/WFVariablesKeyConstant.java
@@ -0,0 +1,94 @@
+package com.vci.web.constant;
+
+/**
+ * 甯哥敤鐨勫彉閲忓悕绉�
+ * @author weidy
+ * @date 2020/10/19 15:37
+ */
+public class WFVariablesKeyConstant {
+
+    /**
+     * 涓婚敭--鍏煎浠ュ墠鐨勫唴瀹�
+     */
+    public static final String OIDS_OLD = "objId";
+
+    /**
+     * 涓氬姟绫诲瀷--鍏煎浠ュ墠鐨勫唴瀹�
+     */
+    public static final String BTMTYPE_OLD = "boType";
+
+    /**
+     * 鏄剧ず鐨勭晫闈�
+     */
+    public static final String UI_DETAIL_URL = "detailUrl";
+
+    /**
+     * 鏄剧ず鐨勮〃鏍�
+     */
+    public static final String UI_TABLE_CODE = "uiTableCode";
+
+    /**
+     * 鏄剧ず鐨刄I涓婁笅鏂�
+     */
+    public static final String UI_CONTENT_CODE = "uiContentCode";
+
+    /**
+     * 鏄剧ず鐨勯〉闈㈡墍灞炵殑涓氬姟绫诲瀷
+     */
+    public static final String UI_TYPE = "uiType";
+
+    /**
+     * 鍚姩鍚庣殑鐘舵��
+     */
+    public static final String START_STATUS = "startLCStatus";
+
+    /**
+     * 閲嶇疆鍚庣殑鐘舵��
+     */
+    public static final String RESET_STATUS = "resetLCStatus";
+
+    /**
+     * 鍙戝竷鐨勬椂鍊欑姸鎬�
+     */
+    public static final String RELEASE_STATUS = "releaseStatus";
+
+    /**
+     * 鍙戝竷鐨勬椂鍊欒繙绋嬭皟鐢ㄧ殑鍦板潃
+     */
+    public static final String RELEASE_REMOTE_METHOD = "releaseRemoteMethod";
+
+    /**
+     * 缁堟鐨勬椂鍊欒繙绋嬭皟鐢ㄧ殑鍦板潃
+     */
+    public static final String RESET_REMOTE_METHOD = "resetRemoteMethod";
+
+    /**
+     * 褰撳墠鐢ㄦ埛鐨刯son淇℃伅
+     */
+    public static final String CURRENT_USER_JSON = "currentUserJsonString";
+
+    /**
+     * 鍐荤粨鏃堕棿
+     */
+    public static final String SUSPEND_TIME = "SUSPEND_TIME";
+
+    /**
+     * 璇诲彇瓒呮椂
+     */
+    public static final String READ_TIMEOUT = "readTimeout";
+
+    /**
+     * 璇锋眰瓒呮椂
+     */
+    public static final String REQUEST_TIMEOUT = "requestTimeout";
+
+    /**
+     * 閾炬帴瓒呮椂
+     */
+    public static final String CONNECT_TIMEOUT = "connectTimeout";
+
+    /**
+     * 鏁版嵁鐨勬渶澶у瘑绾�
+     */
+    public static final String DATA_MAX_SECRET = "dataMaxSecret";
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/constant/WebLangCodeConstant.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/constant/WebLangCodeConstant.java
new file mode 100644
index 0000000..2a5fbc0
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/constant/WebLangCodeConstant.java
@@ -0,0 +1,33 @@
+package com.vci.web.constant;
+
+/**
+ * web鐨勫璇紪鐮�
+ */
+public class WebLangCodeConstant {
+
+    /**
+     * 鐢熷懡鍛ㄦ湡缂哄皯浜嬩欢
+     */
+    public static final String LIFE_CYCLE_ROUTER_NULL = "lifeCycleRouteNull";
+
+    /**
+     * 璺冭縼澶辫触
+     */
+    public static final String LIFE_CYCLE_TRANS_ERROR = "lifeCycleTransError";
+
+    /**
+     * 鏂囦欢涓婁紶瓒呰繃浜嗗瘑绾ц姹�
+     */
+    public static final String FILE_UPLOAD_SECRET_ERROR = "fileUploadSecretError";
+
+    /**
+     * 鏂囦欢涓婁紶鏃讹紝瀵嗙骇瓒呰繃浜嗘暟鎹殑瀵嗙骇
+     */
+    public static final String FILE_UPLOAD_DATA_SECRET_ERROR = "fileUploadDataSecretError";
+
+    /**
+     * 鏂囦欢鍚嶇О閲嶅
+     */
+    public static final String FILE_NAME_REPEAT = "fileNameRepeat";
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/BdSelectInputCharController.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/BdSelectInputCharController.java
new file mode 100644
index 0000000..7150e4d
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/BdSelectInputCharController.java
@@ -0,0 +1,128 @@
+package com.vci.web.controller;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.List;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.web.pageModel.KeyValue;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import com.vci.starter.web.pagemodel.*;
+import com.vci.starter.web.annotation.*;
+import com.vci.web.pageModel.BdSelectInputCharVO;
+import com.vci.web.dto.BdSelectInputCharDTO;
+import com.vci.web.service.BdSelectInputCharServiceI;
+import org.springframework.stereotype.Controller;
+import com.vci.starter.web.util.*;
+
+
+/**
+ * 鍙緭鍙�夊唴瀹规帶鍒跺櫒
+ *
+ * @author weidy
+ * @date 2022-03-09
+ */
+@RestController
+@RequestMapping("/bdSelectInputController")
+public class BdSelectInputCharController {
+    /**
+    * 鍙緭鍙�夊唴瀹� 鏈嶅姟
+    */
+    @Autowired
+    private BdSelectInputCharServiceI bdSelectInputCharService;
+
+    /**
+     * 鍙緭鍙�夊唴瀹瑰垪琛�
+     * @param baseQueryObject 鍩虹鏌ヨ瀵硅薄锛屽寘鍚煡璇㈡潯浠讹紝鍒嗛〉锛屾帓搴忕瓑
+     * @return 鍙緭鍙�夊唴瀹规樉绀哄璞″垪琛�
+     */
+    @GetMapping("/gridBdSelectInputChar")
+    public DataGrid<BdSelectInputCharVO> gridBdSelectInputChar(BaseQueryObject baseQueryObject){
+        if(baseQueryObject == null){
+            baseQueryObject = new BaseQueryObject();
+        }
+        return bdSelectInputCharService.gridBdSelectInputChar(baseQueryObject.getConditionMap(),baseQueryObject.getPageHelper());
+    }
+    /**
+     * 澧炲姞 鍙緭鍙�夊唴瀹�
+     * @param bdSelectInputCharDTO 鍙緭鍙�夊唴瀹规暟鎹紶杈撳璞�
+     * @return 鎵ц缁撴灉锛宻uccess涓簍rue琛ㄧず鎴愬姛锛宮sg鏄け璐ョ殑鎻愮ず淇℃伅锛宱bj鏄坊鍔犲畬鎴愬悗鐨勬樉绀哄璞�
+     */
+    @PostMapping( "/addSave")
+    public BaseResult<BdSelectInputCharVO> addSave(@RequestBody BdSelectInputCharDTO bdSelectInputCharDTO){
+         BdSelectInputCharVO bdSelectInputCharVO = bdSelectInputCharService.addSave(bdSelectInputCharDTO);
+         return BaseResult.success(bdSelectInputCharVO);
+    }
+
+    /**
+     * 淇敼 鍙緭鍙�夊唴瀹�
+     * @param bdSelectInputCharDTO 鍙緭鍙�夊唴瀹规暟鎹紶杈撳璞�
+     * @return 鎵ц缁撴灉锛宻uccess涓簍rue琛ㄧず鎴愬姛锛宮sg鏄け璐ョ殑鎻愮ず淇℃伅锛宱bj鏄坊鍔犲畬鎴愬悗鐨勬樉绀哄璞�
+     */
+    @PutMapping("/editSave")
+    public BaseResult<BdSelectInputCharVO> editSave(@RequestBody BdSelectInputCharDTO bdSelectInputCharDTO){
+        BdSelectInputCharVO bdSelectInputCharVO = bdSelectInputCharService.editSave(bdSelectInputCharDTO);
+        return BaseResult.success(bdSelectInputCharVO);
+    }
+
+
+    /**
+     * 鍒犻櫎鍙緭鍙�夊唴瀹�
+     * @param bdSelectInputCharDTO 鍙緭鍙�夊唴瀹规暟鎹紶杈撳璞★紝oid鍜宼s闇�瑕佷紶杈�
+     * @return 鍒犻櫎缁撴灉鍙嶉锛氾細success锛氭垚鍔燂紝fail锛氬け璐�
+     */
+    @DeleteMapping( "/deleteData")
+    public BaseResult delBdSelectInputChar( BdSelectInputCharDTO bdSelectInputCharDTO) {
+        return bdSelectInputCharService.deleteBdSelectInputChar(bdSelectInputCharDTO);
+    }
+
+    /**
+    * 涓婚敭鑾峰彇鍙緭鍙�夊唴瀹�
+    * @param oid 涓婚敭
+    * @return 鍙緭鍙�夊唴瀹规樉绀哄璞�
+    */
+    @GetMapping("/getObjectByOid")
+    public BaseResult<BdSelectInputCharVO> getObjectByOid(String oid){
+        BdSelectInputCharVO bdSelectInputCharVO = bdSelectInputCharService.getObjectByOid(oid);
+        return BaseResult.success(bdSelectInputCharVO);
+    }
+
+    /**
+     * 涓婚敭鎵归噺鑾峰彇鍙緭鍙�夊唴瀹�
+     * @param oids 涓婚敭锛屽涓互閫楀彿鍒嗛殧锛屼絾鏄彈鎬ц兘褰卞搷锛屽缓璁竴娆℃煡璇笉瓒呰繃10000涓�
+     * @return 鍙緭鍙�夊唴瀹规樉绀哄璞�
+     */
+    @GetMapping("/listDataByOids")
+    public BaseResult<BdSelectInputCharVO> listBdSelectInputCharByOids(String oids){
+        Collection<BdSelectInputCharVO> voCollection =  bdSelectInputCharService.listBdSelectInputCharByOids(VciBaseUtil.str2List(oids));
+        BaseResult baseResult = BaseResult.success();
+        baseResult.setData(voCollection);
+        return  baseResult;
+    }
+
+
+
+    /**
+     * 鍙傜収鍙緭鍙�夊唴瀹瑰垪琛�
+     * @param baseQueryObject 鍩虹鏌ヨ瀵硅薄锛屽寘鍚煡璇㈡潯浠讹紝鍒嗛〉锛屾帓搴忕瓑
+     * @return 鍙緭鍙�夊唴瀹规樉绀哄璞″垪琛紝鐢熸晥鐨勫唴瀹�
+     */
+    @GetMapping("/refDataGrid")
+    public DataGrid<BdSelectInputCharVO> refDataGridBdSelectInputChar(BaseQueryObject baseQueryObject){
+        if(baseQueryObject == null){
+            baseQueryObject = new BaseQueryObject();
+        }
+        return bdSelectInputCharService.refDataGridBdSelectInputChar(baseQueryObject.getConditionMap(),baseQueryObject.getPageHelper());
+    }
+
+    /**
+     * 鑾峰彇鍙�夋嫨鐨勫垪琛�
+     * @param flag 鏍囪
+     * @param namespace 鍛藉悕绌洪棿
+     * @return 鍖呭惈鐨勫唴瀹�
+     */
+    @GetMapping("/listByFlag")
+    public BaseResult<List<KeyValue>> listByFlag(String namespace,String flag){
+        return BaseResult.success(bdSelectInputCharService.listByFlag(namespace,flag));
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/HomeTaskController.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/HomeTaskController.java
new file mode 100644
index 0000000..0d35be0
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/HomeTaskController.java
@@ -0,0 +1,99 @@
+package com.vci.web.controller;
+
+
+import com.vci.starter.web.annotation.controller.VciUnCheckRight;
+import com.vci.starter.web.annotation.log.VciBusinessLog;
+import com.vci.starter.web.annotation.permission.VciPermission;
+import com.vci.starter.web.annotation.permission.VciUseReferMethod;
+import com.vci.starter.web.pagemodel.BaseQueryObject;
+import com.vci.starter.web.pagemodel.BaseResult;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.web.dto.WebHomeTaskActionDTO;
+import com.vci.web.pageModel.WebHomeTaskActionVO;
+import com.vci.web.service.WebHomeTaskServiceI;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 棣栭〉鐨勫緟鍔炰簨椤�
+ * @author weidy
+ * @since 208mes椤圭洰
+ */
+@RestController
+@RequestMapping("/homeTaskController")
+@VciBusinessLog(modelName = "棣栭〉鐨勫緟鍔炰簨椤�")
+@VciUnCheckRight
+public class HomeTaskController  {
+
+    /**
+     * 寰呭姙浜嬮」姹囨�绘湇鍔�
+     */
+    @Autowired
+    private WebHomeTaskServiceI homeTaskService;
+
+    /**
+     * 鏌ヨ褰撳墠鐢ㄦ埛鐨勫緟鍔炰换鍔℃暟閲� 锛屼笉浣跨敤鍔熻兘鏉冮檺锛屽洜涓哄叾鍐呭浼氭牴鎹姛鑳芥潈闄愬拰鏁版嵁鏉冮檺鏉ユ煡璇紝
+     * @return 浠诲姟鐨勬樉绀哄璞�
+     */
+    @GetMapping("/listMyHomeTask")
+    @VciBusinessLog(operateName = "鏌ヨ褰撳墠鐢ㄦ埛鐨勫緟鍔炰换鍔℃暟閲�",notStore = true)
+    public List<WebHomeTaskActionVO> listMyHomeTask(){
+        return homeTaskService.listMyHomeTask();
+    }
+
+    /**
+     * 棣栭〉寰呭姙浠诲姟
+     * @param queryObject 鏌ヨ瀵硅薄
+     * @return 鍒楄〃鐨勪俊鎭�
+     */
+    @GetMapping("/dataGrid")
+    @VciBusinessLog(operateName = "鏌ョ湅棣栭〉寰呭姙浠诲姟鍔ㄤ綔瀹氫箟")
+    @VciPermission(methodName = "鏌ョ湅",methodKey = "VIEW",methodAlias = "鏌ョ湅",methodOrder = 1)
+    public DataGrid dataGrid(BaseQueryObject queryObject) {
+        return homeTaskService.dataGrid(queryObject.getConditionMap(),queryObject.getPageHelper());
+    }
+
+    /**
+     * 娣诲姞寰呭姙浜嬮」
+     * @param action 鏁版嵁鏄剧ず瀵硅薄
+     * @return 鎵ц缁撴灉
+     */
+    @PostMapping("/addSave")
+    @VciBusinessLog(operateName = "娣诲姞棣栭〉寰呭姙浠诲姟鍔ㄤ綔瀹氫箟")
+    @VciPermission(methodName = "澧炲姞",methodKey = "ADD",methodAlias = "娣诲姞",methodOrder = 2)
+    @VciUseReferMethod(useReferKey = "menu")
+    public BaseResult addSave(WebHomeTaskActionDTO action) {
+        homeTaskService.addAction(action);
+        return BaseResult.success();
+    }
+
+    /**
+     * 淇敼寰呭姙浜嬮」
+     * @param action 鏁版嵁鏄剧ず瀵硅薄
+     * @return 鎵ц缁撴灉
+     */
+    @PutMapping("/editSave")
+    @VciBusinessLog(operateName = "淇敼棣栭〉寰呭姙浠诲姟鍔ㄤ綔瀹氫箟")
+    @VciPermission(methodName = "淇敼",methodKey = "EDIT",methodAlias = "淇敼",methodOrder = 3)
+    @VciUseReferMethod(useReferKey = "menu")
+    public BaseResult editSave(WebHomeTaskActionDTO action) {
+        homeTaskService.editAction(action);
+        return BaseResult.success();
+    }
+
+    /**
+     * 鍒犻櫎寰呭姙浜嬮」
+     * @param action 鏁版嵁鏄剧ず瀵硅薄
+     * @return 鎵ц缁撴灉
+     */
+    @DeleteMapping("/delete")
+    @VciBusinessLog(operateName = "鍒犻櫎棣栭〉寰呭姙浠诲姟鍔ㄤ綔瀹氫箟")
+    @VciPermission(methodName = "鍒犻櫎",methodKey = "DELETE",methodAlias = "鍒犻櫎",methodOrder = 4)
+    public BaseResult delete(WebHomeTaskActionDTO action) {
+        homeTaskService.deleteAction(action);
+        return BaseResult.success();
+    }
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/LoginController.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/LoginController.java
new file mode 100644
index 0000000..87d292d
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/LoginController.java
@@ -0,0 +1,320 @@
+package com.vci.web.controller;
+
+import com.vci.starter.web.annotation.controller.VciUnCheckRight;
+import com.vci.starter.web.annotation.log.VciBusinessLog;
+import com.vci.starter.web.constant.TokenKeyConstant;
+import com.vci.starter.web.pagemodel.BaseResult;
+import com.vci.starter.web.pagemodel.RequestClientInfo;
+import com.vci.starter.web.pagemodel.SessionInfo;
+import com.vci.starter.web.util.LangBaseUtil;
+import com.vci.starter.web.util.MessageUtils;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.starter.web.util.WebThreadLocalUtil;
+import com.vci.web.bo.LoginResultBO;
+import com.vci.web.dto.LoginUserDTO;
+import com.vci.web.service.LoginServiceI;
+import eu.bitwalker.useragentutils.*;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.security.Principal;
+import java.util.*;
+
+/**
+ * 鐧诲綍鎺у埗鍣�
+ * @author weidy
+ * @date 2021-1-28
+ */
+@Controller
+@RequestMapping("/framework/loginController")
+@VciBusinessLog(modelName="鐧诲綍鏈嶅姟")
+public class LoginController{
+
+	/**
+	 * 鐧诲綍鏈嶅姟
+	 */
+	@Autowired
+	private LoginServiceI loginService;
+
+	/**
+	 * 鐧诲綍锛岃繖涓湴鏂逛富瑕佹槸涓轰簡鐧诲綍鍚庡崟鐙殑涓氬姟
+	 * @param userDTO 鐢ㄦ埛鐨勫璞�
+	 * @param request 璇锋眰瀵硅薄
+	 * @param clientInfo 瀹㈡埛绔殑淇℃伅
+	 * @return 鎵ц缁撴灉
+	 */
+	@VciBusinessLog(operateName="鐧诲綍")
+	@PostMapping(value = "/login")
+	@ResponseBody
+	@VciUnCheckRight()
+	public BaseResult login(LoginUserDTO userDTO, HttpServletRequest request, RequestClientInfo clientInfo){
+		VciBaseUtil.alertNotNull(userDTO,"鐢ㄦ埛瀵硅薄",clientInfo,"璇锋眰瀹㈡埛绔俊鎭�");
+		wrapperBrowserInfo(clientInfo,request);
+		LoginResultBO loginResultBO = loginService.login(userDTO,clientInfo);
+		if(loginResultBO.isSuccess()){
+			return BaseResult.success(loginResultBO);
+		}else{
+			BaseResult result = BaseResult.fail(loginResultBO.getFailMsg());
+			if(StringUtils.isBlank(loginResultBO.getFailMsg())){
+				result.setMsg(MessageUtils.get(loginResultBO.getFailCode(),loginResultBO.getFailMsgArray()));
+			}
+			result.setObj(loginResultBO);
+			return result;
+		}
+	}
+	
+	/**
+	 *  CAS鐨勫崟鐐圭櫥褰�
+	 *  1. cas鍗曠偣鐧诲綍锛屽垯浠巙serPrincipal閲岃幏鍙�
+	 *  2. 鍦ㄥご閲岄潰鍔爄v-user
+	 *  3. 鍦╮equest閲岄潰鏀剧敤鎴�
+	 * @param request 璇锋眰鐨勫璞�
+	 * @param response 鍝嶅簲瀵硅薄
+	 * @return html鐨勫悕瀛楃殑鍓嶇紑锛屽叿浣撴槸Jsp杩樻槸html锛屾槸spring-mvc閲岄厤缃殑
+	 */
+	@VciBusinessLog(operateName="鍗曠偣鐧诲綍")
+	@RequestMapping("/singleLoginCas")
+	@VciUnCheckRight()
+	public ModelAndView singleLoginCas(HttpServletRequest request,HttpServletResponse response){
+		return doSingleLogin(request,response,"");
+	}
+
+	/**
+	 * 鎵ц鍗曠偣鐧诲綍
+	 * @param request 璇锋眰鐨勪俊鎭�
+	 * @param userParam 鐢ㄦ埛鐨勫弬鏁板悕瀛�
+	 * @return 杩斿洖main.html
+	 */
+	private ModelAndView doSingleLogin(HttpServletRequest request, HttpServletResponse response,String userParam){
+		String msg = "";
+		String token = "";
+		if(request.getSession() == null){
+			msg = "session宸茬粡杩囨湡鎴栦笉瀛樺湪,浣犲彲鑳介渶瑕侀噸鏂版墽琛屽崟鐐圭櫥褰�";
+		}else {
+			String username = "";
+			Principal principal = request.getUserPrincipal();
+			if(principal!=null){
+				Object ivUser = principal.getName();
+				if (ivUser != null ) {
+					username = ivUser.toString();
+				}
+			}
+			//鐢ㄦ埛鐨勫弬鏁�
+			if(StringUtils.isBlank(userParam)){
+				userParam = request.getParameter("userParam");
+			}
+			userParam = StringUtils.isBlank(userParam)?"iv-user":userParam;
+			if(StringUtils.isBlank(username)){
+				//涓嶆槸cas鐨勬柟寮忥紝鑰屾槸澶寸殑鏂瑰紡
+				username = request.getHeader(userParam);
+			}
+			if(StringUtils.isBlank(username)){
+				//鐪嬬湅鏄笉鍙傛暟
+				username = request.getParameter(userParam);
+			}
+			if(StringUtils.isBlank(username)){
+				msg = "娌℃湁鑾峰彇鍒扮敤鎴风殑淇℃伅";
+			}else{
+				RequestClientInfo clientInfo =new RequestClientInfo();
+				wrapperBrowserInfo(clientInfo,request);
+				LoginUserDTO userDTO = new LoginUserDTO();
+				userDTO.setUserId(username);
+				try {
+					LoginResultBO loginResultBO = loginService.singleLogin(userDTO, clientInfo);
+					if(!loginResultBO.isSuccess()){
+						msg = loginResultBO.getFailMsg();
+					}else {
+						token = loginResultBO.getSessionInfo().getToken();
+					}
+				}catch (Throwable e){
+					msg = LangBaseUtil.getErrorMsg(e);
+				}
+			}
+		}
+		Enumeration<?> parameterNames = request.getParameterNames();
+		Map<String,String> paramMap = new HashMap<>();
+		while (parameterNames.hasMoreElements()){
+			String paramName = (String)parameterNames.nextElement();
+			String value  = request.getParameter(paramName);
+			if(!userParam.equalsIgnoreCase(paramName)) {
+				paramMap.put(paramName, value);
+			}
+			//sb.append("&" + paramName + "=" + value);
+		}
+		String html = request.getParameter("html");
+		if(StringUtils.isBlank(html)){
+			html = "main";
+		}
+		ModelAndView view = new ModelAndView();
+		Cookie cookie = new Cookie("msg", msg);
+		cookie.setPath("/");
+		response.addCookie(cookie);
+		Cookie cookie1 = new Cookie(TokenKeyConstant.USER_TOKEN_KEY, token);
+		cookie1.setPath("/");
+		response.addCookie(cookie1);
+		view.addAllObjects(paramMap);
+		view.setViewName("redirect:/" + html + ".html");
+
+		return view;
+		//鐗瑰埆娉ㄦ剰锛屽崟鐐圭櫥褰曚竴瀹氬湪杩愯鐜閲岃皟璇曪紝寮�鍙戠幆澧冩病鏈夎繖涓枃浠�
+	}
+
+	/**
+	 * 鎵ц鍗曠偣鐧诲綍,鏍规嵁username
+	 * @param request 璇锋眰鐨勪俊鎭�
+	 * @param username 鐢ㄦ埛鐨勫弬鏁板悕瀛�
+	 * @return 杩斿洖main.html
+	 */
+	public BaseResult doSingleLoginByUsername(HttpServletRequest request, HttpServletResponse response,String username){
+		String msg = "";
+		String token = "";
+		if(request.getSession() == null){
+			msg = "session宸茬粡杩囨湡鎴栦笉瀛樺湪,浣犲彲鑳介渶瑕侀噸鏂版墽琛屽崟鐐圭櫥褰�";
+			return BaseResult.fail(msg);
+		}else {
+
+			if(StringUtils.isBlank(username)){
+				msg = "娌℃湁鑾峰彇鍒扮敤鎴风殑淇℃伅";
+				return BaseResult.fail(msg);
+			}else{
+				RequestClientInfo clientInfo =new RequestClientInfo();
+				wrapperBrowserInfo(clientInfo,request);
+				LoginUserDTO userDTO = new LoginUserDTO();
+				userDTO.setUserId(username);
+				try {
+					LoginResultBO loginResultBO = loginService.singleLogin(userDTO, clientInfo);
+					if(!loginResultBO.isSuccess()){
+						msg = loginResultBO.getFailMsg();
+						return BaseResult.fail(msg);
+					}else {
+						token = loginResultBO.getSessionInfo().getToken();
+						msg="鐧诲綍鎴愬姛锛�";
+					}
+				}catch (Throwable e){
+					msg = LangBaseUtil.getErrorMsg(e);
+				}
+			}
+		}
+
+
+		return BaseResult.success(msg);
+		//鐗瑰埆娉ㄦ剰锛屽崟鐐圭櫥褰曚竴瀹氬湪杩愯鐜閲岃皟璇曪紝寮�鍙戠幆澧冩病鏈夎繖涓枃浠�
+	}
+
+	/**
+	 * 浣跨敤鐢ㄦ埛鍚嶆潵鎵ц鍗曠偣鐧诲綍
+	 * @param request 璇锋眰瀵硅薄
+	 * @param response 鍝嶅簲瀵硅薄
+	 * @return main.html
+	 */
+	@RequestMapping("/singleLoginByUsername")
+	@VciUnCheckRight
+	@VciBusinessLog(operateName="鍗曠偣鐧诲綍")
+	public ModelAndView singleLoginByUsername(HttpServletRequest request,HttpServletResponse response){
+		return doSingleLogin(request,response,"username");
+	}
+
+
+
+	/**
+	 * 鑾峰彇瀹㈡埛绔姹備俊鎭�,涓轰簡闅旂粷鍦╯erver灞備娇鐢╮equest
+	 * @param request 璇锋眰瀵硅薄
+	 * @param clientInfo 瀹㈡埛绔俊鎭�
+	 */
+	private void wrapperBrowserInfo(RequestClientInfo clientInfo,HttpServletRequest request) {
+		UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("User-Agent"));
+		if(StringUtils.isBlank(clientInfo.getIpaddress())){
+			//鎵綢P鍦板潃
+			clientInfo.setIpaddress(getIpAddressFromRequest(request));
+		}
+		if(userAgent !=null) {
+			Browser browser = userAgent.getBrowser();
+			OperatingSystem os = userAgent.getOperatingSystem();
+
+			clientInfo.setOsversion(os != null ? os.getName() : "");
+			clientInfo.setBrowser(browser != null ? browser.getName() : "IE");
+			String version = "";
+			if (browser != null) {
+				Version version1 = browser.getVersion(request.getHeader("User-Agent"));
+				if (version1 != null) {
+					version = version1.getVersion();
+				}
+			}
+			clientInfo.setBrowserversion(version);
+			if (os != null) {
+				clientInfo.setRequestType(os.getDeviceType().getName());
+				if (DeviceType.COMPUTER.getName().equals(clientInfo.getRequestType())) {
+					clientInfo.setRequestType("browser");
+				}
+			}
+		}
+	}
+
+	/**
+	 * 浠庤姹備腑鑾峰彇ip鍦板潃锛屼负浜嗛殧缁濆湪server灞備娇鐢╮equest
+	 * @param request 璇锋眰瀵硅薄
+	 * @return ip鍦板潃锛屾病鏈夋壘鍒伴粯璁や负127.0.0.1
+	 */
+	private String getIpAddressFromRequest(HttpServletRequest request){
+		String ip = request.getHeader("X-Forwarded-For");
+		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+			ip = request.getHeader("Proxy-Client-IP");
+		}
+		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+			ip = request.getHeader("WL-Proxy-Client-IP");
+		}
+		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+			ip = request.getHeader("HTTP_CLIENT_IP");
+		}
+		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+			ip = request.getHeader("HTTP_X_FORWARDED_FOR");
+		}
+		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+			ip = request.getRemoteAddr();
+		}
+		if (ip == null || ip.length() == 0 || ip.indexOf("0:0:0:0:0:0:0:1") >-1) {
+			//0:0:0:0:0:0:0:1鏄湰鏈哄湪璁块棶
+			ip = "127.0.0.1";
+		}
+		return ip;
+	}
+
+	/**
+	 * 鑾峰彇鐢ㄦ埛鐨勪細璇濅俊鎭�
+	 * @return success涓簍rue琛ㄧず鑾峰彇鎴愬姛锛屽惁鍒檓sg鏄敊璇俊鎭紝obj灞炴�ф槸鑾峰彇鐨勪細璇濆璞′俊鎭�
+	 */
+	@VciUnCheckRight
+	@PostMapping("/getSessionInfo")
+	@ResponseBody
+	public BaseResult getSessionInfo(){
+		BaseResult<SessionInfo> json = new BaseResult<>();
+		json.setObj(WebThreadLocalUtil.getCurrentUserSessionInfoInThread().get());
+		if(json.getObj()!=null){
+			json.setSuccess(true);
+		}
+		return json;
+	}
+
+	/**
+	 * 鎵ц閫�鍑�
+	 * @param request 璇锋眰瀵硅薄
+	 * @return success涓簍rue琛ㄧず閫�鍑烘垚鍔燂紝鍓嶇涓嶉渶瑕佸垽鏂粨鏋�
+	 */
+	@VciUnCheckRight
+	@PostMapping("/logout")
+	@ResponseBody
+	public BaseResult logout(HttpServletRequest request){
+		String userToken = request.getHeader(TokenKeyConstant.USER_TOKEN_KEY);
+		loginService.logout(userToken);
+		return BaseResult.success();
+	}
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/OsAttributeController.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/OsAttributeController.java
new file mode 100644
index 0000000..9900bb4
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/OsAttributeController.java
@@ -0,0 +1,37 @@
+package com.vci.web.controller;
+
+import com.vci.starter.web.pagemodel.BaseQueryObject;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.web.pageModel.OsAttributeVO;
+import com.vci.web.pageModel.OsStatusVO;
+import com.vci.web.service.OsAttributeServiceI;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 灞炴�ф帶鍒跺櫒
+ * @author weidy
+ * @date 2022-3-26
+ */
+@RequestMapping("/attributeController")
+@RestController
+public class OsAttributeController {
+
+    /**
+     * 灞炴��
+     */
+    @Autowired
+    private OsAttributeServiceI attributeService;
+
+    /**
+     * 灞炴�у垪琛�
+     * @param baseQueryObject 鏌ヨ瀵硅薄
+     * @return 灞炴�х殑鏄剧ず瀵硅薄
+     */
+    @GetMapping("/gridAttribute")
+    public DataGrid<OsAttributeVO> gridAttribute(BaseQueryObject baseQueryObject){
+       return attributeService.gridAttribute(baseQueryObject);
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/OsLifeCycleController.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/OsLifeCycleController.java
new file mode 100644
index 0000000..323a196
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/OsLifeCycleController.java
@@ -0,0 +1,48 @@
+package com.vci.web.controller;
+
+import com.vci.starter.web.pagemodel.BaseQueryObject;
+import com.vci.starter.web.pagemodel.BaseResult;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.web.pageModel.OsERVO;
+import com.vci.web.pageModel.OsLifeCycleVO;
+import com.vci.web.service.OsLifeCycleServiceI;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 鐢熷懡鍛ㄦ湡鐨勬帶鍒跺櫒
+ * @author weidy
+ * @date 2022-3-26
+ */
+@RequestMapping("/lifeCycleController")
+@RestController
+public class OsLifeCycleController {
+
+    /**
+     * 鐢熷懡鍛ㄦ湡鐨勬湇鍔�
+     */
+    @Autowired
+    private OsLifeCycleServiceI lifeCycleService;
+
+    /**
+     * 鐢熷懡鍛ㄦ湡鍒楄〃
+     * @param baseQueryObject 鍩虹鏌ヨ瀵硅薄锛屽寘鍚垎椤靛拰鏌ヨ
+     * @return 鐢熷懡鍛ㄦ湡鐨勫璞�
+     */
+    @GetMapping("/gridLifeCycle")
+    public DataGrid<OsLifeCycleVO> gridLifeCycle(BaseQueryObject baseQueryObject){
+        return lifeCycleService.gridLifeCycle(baseQueryObject);
+    }
+
+    /**
+     * 鐢熷懡鍛ㄦ湡鐨勯摼鎺ョ嚎
+     * @param id 缂栧彿
+     * @return ER鍥惧唴瀹�
+     */
+    @GetMapping("/listLinesPic")
+    public BaseResult<OsERVO> listLinesPic(String id){
+        return BaseResult.success(lifeCycleService.listLinesPic(id));
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/OsLinkTypeController.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/OsLinkTypeController.java
new file mode 100644
index 0000000..3b6691a
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/OsLinkTypeController.java
@@ -0,0 +1,94 @@
+package com.vci.web.controller;
+
+import com.vci.starter.web.pagemodel.BaseQueryObject;
+import com.vci.starter.web.pagemodel.BaseResult;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.web.pageModel.*;
+import com.vci.web.service.OsLinkTypeServiceI;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 閾炬帴绫诲瀷鐨勬帶鍒跺櫒
+ * @author weidy
+ * @date 2022-3-26
+ */
+@RequestMapping("/linkTypeController")
+@RestController
+public class OsLinkTypeController {
+
+    /**
+     * 閾炬帴绫诲瀷
+     */
+    @Autowired
+    private OsLinkTypeServiceI linkTypeService;
+
+    /**
+     * 閾炬帴绫诲瀷鐨勫垪琛�
+     * @param baseQueryObject 鏌ヨ瀵硅薄
+     * @return 閾炬帴绫诲瀷鐨勬樉绀哄璞�
+     */
+    @GetMapping("/gridLinkType")
+    public DataGrid<OsLinkTypeVO> gridLinkType(BaseQueryObject baseQueryObject){
+        return linkTypeService.gridLinkType(baseQueryObject);
+    }
+
+    /**
+     * 鑾峰彇閾炬帴绫诲瀷鍖呭惈鐨勫睘鎬�
+     * @param linkTypeOid 閾炬帴绫诲瀷鐨勪富閿�
+     * @param baseQueryObject 鏌ヨ瀵硅薄
+     * @return 灞炴�х殑淇℃伅
+     */
+    @GetMapping("/gridAttributeByLinkTypeOid")
+    public DataGrid<OsLinkTypeAttributeVO> gridAttributeByLinkTypeOid(String linkTypeOid, BaseQueryObject baseQueryObject){
+        if(StringUtils.isBlank(linkTypeOid)){
+            return new DataGrid<OsLinkTypeAttributeVO>();
+        }
+        String attrId = baseQueryObject.getConditionMap().containsKey("name")?baseQueryObject.getConditionMap().get("name").replace("*",""):"";
+        String attrName = baseQueryObject.getConditionMap().containsKey("label") ? baseQueryObject.getConditionMap().get("label").replace("*","") : "";
+        OsLinkTypeVO linkTypeVO = linkTypeService.selectByOid(linkTypeOid);
+        List<OsLinkTypeAttributeVO> boAttrs = linkTypeService.listAttributeByLinkId(linkTypeVO.getId());
+        List<OsLinkTypeAttributeVO> attrList = boAttrs.stream().filter(s->{
+            boolean usedFlag = true;
+            if(StringUtils.isNotBlank(attrId) && !s.getId().contains(attrId)){
+                usedFlag = false;
+            }
+            if(StringUtils.isNotBlank(attrName) && !s.getName().contains(attrName)){
+                usedFlag = false;
+            }
+            return usedFlag;
+        }).collect(Collectors.toList());
+        DataGrid<OsLinkTypeAttributeVO> dataGrid = new DataGrid<OsLinkTypeAttributeVO>();
+        dataGrid.setTotal(attrList.size());;
+        dataGrid.setData(attrList);
+        return dataGrid;
+    }
+
+    /**
+     * 妫�鏌ラ摼鎺ョ被鍨嬩腑鍏宠仈鐨勪笟鍔$被鍨嬬殑灞炴�ф湁涓嶅悓鐨勫唴瀹�
+     * @param linkTypeOid 閾炬帴绫诲瀷鐨勪富閿�
+     * @return 宸紓鐨勫睘鎬�
+     */
+    @PostMapping("/checkAttributeTypeDifferent")
+    public BaseResult<OsBtmTypeAttributeVO> checkAttributeTypeDifferent(String linkTypeOid){
+        if(StringUtils.isBlank(linkTypeOid)){
+            return BaseResult.success();
+        }
+        List<OsBtmTypeAttributeVO> attributeVOList = linkTypeService.checkAttributeTypeDifferent(linkTypeOid);
+        if(!CollectionUtils.isEmpty(attributeVOList)) {
+            BaseResult result = BaseResult.fail("鏈変笉鍚�");
+            result.setData(attributeVOList);
+            return result;
+        }else{
+            return BaseResult.success();
+        }
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/SmFavFunctionController.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/SmFavFunctionController.java
new file mode 100644
index 0000000..3f6ccde
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/SmFavFunctionController.java
@@ -0,0 +1,62 @@
+package com.vci.web.controller;
+
+
+import com.vci.frameworkcore.pagemodel.SmFunctionVO;
+import com.vci.starter.web.pagemodel.BaseResult;
+import com.vci.web.service.SmFavFunctionServiceI;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 鏀惰棌鍔熻兘
+ * @author weidy
+ * @date 2020/7/12
+ */
+@RestController
+@RequestMapping("/favFunctionController")
+public class SmFavFunctionController {
+
+    /**
+     * 鏀惰棌鍔熻兘鏈嶅姟
+     */
+    @Autowired
+    private SmFavFunctionServiceI favFunctionService;
+
+    /**
+     * 鏀惰棌鍔熻兘
+     * @param functionId 鍔熻兘缂栧彿
+     * @return 鎵ц缁撴灉
+     */
+    @PostMapping("/addFav")
+    public BaseResult addFav(String functionId){
+        favFunctionService.addFav(functionId);
+        return BaseResult.success();
+    }
+
+    /**
+     * 绉婚櫎鏀惰棌
+     * @param functionId 鍔熻兘缂栧彿
+     * @return 鎵ц缁撴灉
+     */
+    @PostMapping("/removeFav")
+    public BaseResult removeFav(String functionId){
+        favFunctionService.removeFav(functionId);
+        return BaseResult.success();
+    }
+
+    /**
+     * 褰撳墠鐢ㄦ埛鎵�鏈夋敹钘忓姛鑳�
+     * @return 鍔熻兘鐨勬樉绀哄璞�
+     */
+    @GetMapping("/listFavFunction")
+    public List<SmFunctionVO> listFavFunction(){
+       return favFunctionService.listFavFunction();
+    }
+
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/SmFunctionController.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/SmFunctionController.java
new file mode 100644
index 0000000..e573d4e
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/SmFunctionController.java
@@ -0,0 +1,98 @@
+package com.vci.web.controller;
+
+import com.vci.corba.common.VCIError;
+import com.vci.frameworkcore.compatibility.ISmFunctionQueryService;
+import com.vci.frameworkcore.enumpck.ResourceControlTypeEnum;
+import com.vci.frameworkcore.pagemodel.MenuVO;
+import com.vci.frameworkcore.pagemodel.SmFunctionVO;
+import com.vci.starter.web.annotation.controller.VciUnCheckRight;
+import com.vci.starter.web.pagemodel.*;
+import com.vci.web.pageModel.UIContentVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+/**
+ * 绯荤粺鍔熻兘鎺у埗鍣�
+ * @author weidy
+ */
+@RestController
+@RequestMapping("/smFunctionController")
+public class SmFunctionController {
+
+	/**
+	 * 鍔熻兘鏌ヨ鏈嶅姟
+	 */
+	@Autowired
+	private ISmFunctionQueryService functionQueryService;
+
+
+   /**
+    * 鑾峰彇褰撳墠鐢ㄦ埛鐨勮彍鍗�
+    * @param treeQueryObject 鏍戞煡璇㈠璞�
+    * @return  鏍戣妭鐐癸紝鍑虹幇閿欒浼氬湪寮傚父澶勭悊鍣ㄤ腑缁熶竴杩斿洖Json
+    */
+    @VciUnCheckRight
+	@GetMapping("/treeMyMenu")
+	public List<MenuVO> treeMyMenu(TreeQueryObject treeQueryObject) throws VCIError {
+		return functionQueryService.treeCurrentUserMenu(treeQueryObject, ResourceControlTypeEnum.BS);
+	}
+
+	/**
+	 * 鑾峰彇褰撳墠鐢ㄦ埛鐨勮彍鍗�
+	 * @param treeQueryObject 鏍戞煡璇㈠璞�
+	 * @return  鏍戣妭鐐癸紝鍑虹幇閿欒浼氬湪寮傚父澶勭悊鍣ㄤ腑缁熶竴杩斿洖Json
+	 */
+	@VciUnCheckRight
+	@GetMapping("/getUIContentByBtmTypeAndId")
+	public UIContentVO getUIContentByBtmTypeAndId(TreeQueryObject treeQueryObject) throws VCIError {
+		return functionQueryService.getUIContentByBtmTypeAndId(treeQueryObject, ResourceControlTypeEnum.BS);
+	}
+	
+	/**
+	* 鑾峰彇鎵�鏈夌殑鍔熻兘鑿滃崟
+	 * @param treeQueryObject 鏍戞煡璇㈠璞�
+	* @return  鏍戣妭鐐癸紝鍑虹幇閿欒浼氬湪寮傚父澶勭悊鍣ㄤ腑缁熶竴杩斿洖Json
+	*/
+	@GetMapping("/treeAllMenu")
+	public List<Tree> treeAllMenu(TreeQueryObject treeQueryObject){
+		return functionQueryService.treeAllMenu(treeQueryObject, ResourceControlTypeEnum.BS);
+	}
+
+	/**
+	 * 閫氳繃涓婄骇鑺傜偣鑾峰彇涓嬬骇鐨勬墍鏈夌殑鑿滃崟鑺傜偣
+	 *  @param treeQueryObject 鏍戞煡璇㈠璞�
+	 * @return  鏍戣妭鐐癸紝鍑虹幇閿欒浼氬湪寮傚父澶勭悊鍣ㄤ腑缁熶竴杩斿洖Json
+	 */
+	@GetMapping("/treeFunctionByParent")
+	public List<Tree> treeFunctionByParent(TreeQueryObject treeQueryObject) {
+		return new ArrayList<Tree>();
+	}
+
+	/**
+	 * 閫氳繃涓婄骇鑺傜偣鑾峰彇褰撳墠鐢ㄦ埛鏈夋潈闄愮殑涓嬬骇鐨勬墍鏈夌殑鑿滃崟鑺傜偣
+	 *  @param treeQueryObject 鏍戞煡璇㈠璞�
+	 * @return List<Tree>锛屽叾涓璽reeList灞炴�ф墠鏄爲鑺傜偣
+	 */
+	@GetMapping("/treeMyFunctionByParent")
+	public List<Tree> treeMyFunctionByParent(TreeQueryObject treeQueryObject) {
+		return new ArrayList<Tree>();
+	}
+
+	/**
+	 * 鑾峰彇绯荤粺鍔熻兘鍒楄〃
+	 * @param queryObject 鏌ヨ銆佹帓搴忓拰鍒嗛〉瀵硅薄
+	 * @return DataGrid 绯荤粺鍔熻兘鍒楄〃
+	 */
+	@GetMapping("/dataGrid")
+	public DataGrid<SmFunctionVO> dataGrid(BaseQueryObject queryObject){
+		return new DataGrid<>();
+	}
+
+
+
+	
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/SmMenuController.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/SmMenuController.java
new file mode 100644
index 0000000..198fc7f
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/SmMenuController.java
@@ -0,0 +1,37 @@
+package com.vci.web.controller;
+
+import com.vci.web.pageModel.SmOperationVO;
+import com.vci.web.service.SmOperationServiceI;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 鑿滃崟鐩稿叧鐨勬寜閽帶鍒跺櫒(涓轰簡鍏煎锛�
+ * @author weidy
+ * @date 2022-2-23
+ */
+@RestController
+@RequestMapping("/webMenuController")
+public class SmMenuController {
+
+    /**
+     * 鎿嶄綔鎸夐挳鐨勬湇鍔�
+     */
+    @Autowired
+    private SmOperationServiceI operationService;
+
+
+    /**
+     * 浣跨敤鍔熻兘缂栧彿鑾峰彇鎸夐挳鐨勪俊鎭�
+     * @param functionId 鍔熻兘鐨勭紪鍙�
+     * @return 鎸夐挳鐨勪俊鎭�
+     */
+    @PostMapping("/getButtonsByFunctionId")
+    public List<SmOperationVO> listButtonByFunctionId(String functionId){
+        return operationService.listButtonByFunctionId(functionId);
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/StmFunctionController.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/StmFunctionController.java
new file mode 100644
index 0000000..d002ebd
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/StmFunctionController.java
@@ -0,0 +1,52 @@
+package com.vci.web.controller;
+
+import com.vci.corba.common.VCIError;
+import com.vci.frameworkcore.compatibility.ISmFunctionQueryService;
+import com.vci.frameworkcore.enumpck.ResourceControlTypeEnum;
+import com.vci.frameworkcore.pagemodel.MenuVO;
+import com.vci.starter.web.annotation.controller.VciUnCheckRight;
+import com.vci.starter.web.pagemodel.BaseResult;
+import com.vci.starter.web.pagemodel.Tree;
+import com.vci.starter.web.pagemodel.TreeQueryObject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.List;
+
+/**
+ * 鐧诲綍鎺у埗鍣�
+ * @author weidy
+ * @date 2021-1-28
+ */
+@Controller
+@RequestMapping("/stmFunctionController")
+public class StmFunctionController {
+
+	/**
+	 * 鍔熻兘鏌ヨ鏈嶅姟
+	 */
+	@Autowired
+	private ISmFunctionQueryService functionQueryService;
+	@VciUnCheckRight
+	@PostMapping("/test")
+	@ResponseBody
+	public BaseResult logout(){
+		System.out.printf("hhhh");
+		return BaseResult.success();
+	}
+	/**
+	 * 鑾峰彇褰撳墠鐢ㄦ埛鐨勮彍鍗�
+	 * @param treeQueryObject 鏍戞煡璇㈠璞�
+	 * @return  鏍戣妭鐐癸紝鍑虹幇閿欒浼氬湪寮傚父澶勭悊鍣ㄤ腑缁熶竴杩斿洖Json
+	 */
+	@VciUnCheckRight
+	@GetMapping("/getTreeMyMenu")
+	@ResponseBody
+	public List<MenuVO> getTreeMyMenu(TreeQueryObject treeQueryObject) throws VCIError {
+		return functionQueryService.treeCurrentUserMenu(treeQueryObject, ResourceControlTypeEnum.BS);
+	}
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/VciFileDownloadController.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/VciFileDownloadController.java
new file mode 100644
index 0000000..648348a
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/VciFileDownloadController.java
@@ -0,0 +1,88 @@
+package com.vci.web.controller;
+
+import com.vci.starter.web.pagemodel.BaseResult;
+import com.vci.starter.web.util.ControllerUtil;
+import com.vci.starter.web.util.LangBaseUtil;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.web.service.VciFileDownloadServiceI;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * 鏂囦欢涓嬭浇鎺у埗鍣�
+ * @author dangsn
+ * @date 2020/08/11
+ */
+@RestController()
+@RequestMapping("/vciFileDownloadController")
+public class VciFileDownloadController {
+
+    /**
+     * 鏂囦欢涓嬭浇鏈嶅姟
+     */
+    @Autowired
+    private VciFileDownloadServiceI vciFileDownloadServiceI;
+
+    /**
+     * 鏍规嵁鏂囦欢涓婚敭涓嬭浇鏂囦欢
+     * @param fileOid 鏂囦欢鐨勪富閿�,涓嶈秴杩噂et鐨勯檺鍒堕暱搴�
+     * @param downloadUUID 涓嬭浇璁稿彲鐮�
+     * @param response 鍝嶅簲鐨勫璞�
+     * @return 鎵ц缁撴灉锛屽彧鏈変笅杞藉け璐ョ殑鏃跺�欐墠浼氳繖鏍�
+     */
+    @GetMapping("/downloadByFileOid")
+    public void downloadByFileOid(String fileOid, String downloadUUID, HttpServletResponse response){
+        String filePath = vciFileDownloadServiceI.downloadFileByOid(fileOid);
+        try {
+            ControllerUtil.writeFileToResponse(response,filePath);
+        } catch (IOException e) {
+            String msg = LangBaseUtil.getErrorMsg(e);
+            try {
+                ControllerUtil.writeDataToResponse(response,StringUtils.isNotBlank(msg)?msg.getBytes():new byte[0],null);
+            } catch (IOException ioException) {
+                ioException.printStackTrace();
+            }
+        }
+    }
+
+    /**
+     * 鏍规嵁鏂囦欢涓婚敭涓嬭浇鏂囦欢
+     * @param fileOid 鏂囦欢鐨勪富閿紝涓嶉檺鍒堕暱搴�
+     * @param downloadUUID 涓嬭浇璁稿彲鐮�
+     * @param response 鍝嶅簲鐨勫璞�
+     * @return 鎵ц缁撴灉锛屽彧鏈変笅杞藉け璐ョ殑鏃跺�欐墠浼氳繖鏍�
+     */
+    @PostMapping("/downloadByFileOidPost")
+    public void downloadByFileOidPost(String fileOid, String downloadUUID, HttpServletResponse response){
+        downloadByFileOid(fileOid,downloadUUID,response);
+    }
+
+    /**
+     * 鍒嗙墖涓嬭浇鏂囦欢
+     * @param fileOid 鏂囦欢涓婚敭
+     * @param offSet 鍋忕Щ閲�
+     * @return 鏂囦欢鍐呭
+     */
+    @PostMapping("/sectionDownloadByFileOid")
+    public BaseResult sectionDownloadByFileOid(String fileOid, long offSet){
+        BaseResult<byte[]> baseResult = vciFileDownloadServiceI.sectionDownloadByFileOid(fileOid, offSet);
+        return baseResult;
+    }
+
+    /**
+     * 鏂囦欢鍒犻櫎
+     * @param fileOids 鏂囦欢涓婚敭
+     * @return 鏂囦欢鍐呭
+     */
+    @DeleteMapping("/deleteFile")
+    public BaseResult deleteFile(String fileOids){
+        List<String> fileOidCollection = VciBaseUtil.str2List(fileOids);
+        return vciFileDownloadServiceI.deleteFile(fileOidCollection);
+    }
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/VciFileQueryController.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/VciFileQueryController.java
new file mode 100644
index 0000000..d95e12b
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/VciFileQueryController.java
@@ -0,0 +1,215 @@
+package com.vci.web.controller;
+
+import com.vci.file.pagemodel.VciFileObjectVO;
+import com.vci.starter.web.autoconfigure.AppAutoConfigure;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.BaseQueryObject;
+import com.vci.starter.web.pagemodel.BaseResult;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.starter.web.util.Md5;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.web.config.WebFilePreviewAutoConfig;
+import com.vci.web.pageModel.VciFilePreviewConfigVO;
+import com.vci.web.service.VciFileObjectServiceI;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 鏂囦欢鏌ヨ鏈嶅姟
+ * @author weidy
+ * @date 2020/8/11
+ */
+@RestController
+@RequestMapping("/vciFileQueryController")
+public class VciFileQueryController {
+
+    /**
+     * 鏂囨。鐨勭被鍨� 鏈嶅姟
+     */
+    @Autowired
+    private VciFileObjectServiceI fileObjectService;
+
+    /**
+     * 棰勮鐨勯厤缃�
+     */
+    @Autowired(required = false)
+    private WebFilePreviewAutoConfig filePreviewAutoConfig;
+
+    /**
+     * 搴旂敤鐨勯厤缃�
+     */
+    @Autowired
+    private AppAutoConfigure app;
+
+    /**
+     * 浣跨敤涓氬姟绫诲瀷鏌ヨ鏂囦欢鐨勪俊鎭紝鎻愪緵缁欓〉闈㈣皟鐢�
+     * @param baseQueryObject 鍩烘湰鏌ヨ瀵硅薄锛屽垎椤靛拰鎺掑簭
+     * @param ownbizOid 涓氬姟绫诲瀷鏁版嵁涓婚敭
+     * @param ownbizBtm 涓氬姟绫诲瀷鍚嶇О
+     * @return 鏂囦欢鐨勬樉绀哄璞�
+     */
+    @GetMapping("/gridFiles")
+    public DataGrid<VciFileObjectVO> gridFilesByOwnbiz(BaseQueryObject baseQueryObject, String ownbizOid, String ownbizBtm,String fileDocClassify){
+        if(baseQueryObject == null){
+            baseQueryObject = new BaseQueryObject();
+        }
+        return fileObjectService.gridFilesByOwnbiz(baseQueryObject.getConditionMap(),baseQueryObject.getPageHelper(),ownbizOid,ownbizBtm,fileDocClassify);
+    }
+
+    /**
+     * 浣跨敤涓氬姟鏁版嵁鑾峰彇鏂囦欢
+     * @param ownbizOid 涓氬姟绫诲瀷鏁版嵁
+     * @param ownbizBtm 涓氬姟绫诲瀷鐨勫悕绉�
+     * @return 鏂囦欢鐨勬樉绀哄璞�
+     */
+    @GetMapping("/listFilesByOwnbiz")
+    public BaseResult<VciFileObjectVO> listFilesByOwnbiz(String ownbizOid, String ownbizBtm){
+        return listFilesByOwnbizAndClassify(ownbizOid,ownbizBtm,"");
+    }
+
+    /**
+     * 浣跨敤涓氬姟鏁版嵁 鍜屾枃妗g被鍨� 鑾峰彇鏂囦欢
+     * @param ownbizOid 涓氬姟绫诲瀷鏁版嵁
+     * @param ownbizBtm 涓氬姟绫诲瀷鐨勫悕绉�
+     * @param docClassifyId 鏂囨。绫诲瀷缂栧彿
+     * @return 鏂囦欢鐨勬樉绀哄璞�,璇蜂粠data灞炴�т腑鑾峰彇
+     */
+    @GetMapping("/listFilesByOwnbizAndClassify")
+    public BaseResult<VciFileObjectVO> listFilesByOwnbizAndClassify(String ownbizOid, String ownbizBtm, String docClassifyId){
+        List<VciFileObjectVO> fileObjectVOS = fileObjectService.listFilesByOwnbiz(ownbizOid,ownbizBtm,docClassifyId);
+        BaseResult baseResult = BaseResult.success();
+        baseResult.setData(fileObjectVOS);
+        return baseResult;
+    }
+
+    /**
+     * 鎵归噺浣跨敤涓氬姟鏁版嵁 鍜屾枃妗g被鍨� 鑾峰彇鏂囦欢
+     * @param ownbizOids 涓氬姟绫诲瀷鏁版嵁鐨勪富閿紝浠ラ�楀彿鍒嗛殧锛岃�冭檻鎬ц兘鐨勫奖鍝嶏紝寤鸿涓嶈瓒呰繃10000涓�
+     * @param ownbizBtm 涓氬姟绫诲瀷鐨勫悕绉�
+     * @param docClassifyId 鏂囨。绫诲瀷缂栧彿
+     * @return 鏂囦欢鐨勬樉绀哄璞�,璇蜂粠data灞炴�т腑鑾峰彇
+     */
+    @GetMapping("/batchListFilesByOwnbizAndClassify")
+    public BaseResult<VciFileObjectVO> batchListFilesByOwnbizAndClassify(String ownbizOids, String ownbizBtm, String docClassifyId){
+        List<VciFileObjectVO> fileObjectVOS = fileObjectService.batchListFilesByOwnbizs(VciBaseUtil.str2List(ownbizOids),ownbizBtm,docClassifyId);
+        BaseResult baseResult = BaseResult.success();
+        baseResult.setData(fileObjectVOS);
+        return baseResult;
+    }
+
+    /**
+     * 浣跨敤鏂囦欢涓婚敭鑾峰彇瀵硅薄
+     * @param oid 涓婚敭
+     * @return 鏂囦欢鏄剧ず瀵硅薄
+     */
+    @GetMapping("/getFileObjectByOid")
+    public VciFileObjectVO getFileObjectByOid(String oid){
+        return fileObjectService.getObjectByOid(oid);
+    }
+
+    /**
+     * 鎵归噺浣跨敤涓婚敭鑾峰彇鏂囦欢瀵硅薄
+     * @param oids 涓婚敭锛屼互閫楀彿鍒嗛殧锛岃�冭檻鎬ц兘鐨勫奖鍝嶏紝寤鸿涓嶈瓒呰繃10000涓�
+     * @return 鏂囦欢鏄剧ず瀵硅薄鍒楄〃
+     */
+    @GetMapping("/batchListFilesByOids")
+    public BaseResult<VciFileObjectVO> batchListFilesByOids(String oids){
+        Collection<VciFileObjectVO> fileObjectVOS = fileObjectService.listVciFileObjectByOids(VciBaseUtil.str2List(oids));
+        BaseResult baseResult = BaseResult.success();
+        baseResult.setData(fileObjectVOS);
+        return baseResult;
+    }
+
+    /**
+     * 鏂囦欢鐢熸晥
+     * @param fileOids 鏂囦欢鐨勪富閿�
+     * @return 鎵ц缁撴灉
+     */
+    @PutMapping("/releasedFileByOid")
+    public BaseResult releasedFile(String fileOids){
+        List<String> fileOidList = VciBaseUtil.str2List(fileOids);
+        return fileObjectService.releasedFile(fileOidList);
+    }
+
+    /**
+     * 鏍规嵁鍏抽敭淇℃伅鑾峰彇鏂囦欢淇℃伅
+     * @param keyInfo 鏂囦欢淇℃伅
+     * @param docClassifyId 鏂囦欢鍒嗙被缂栧彿
+     * @return 鏂囦欢鏄剧ず瀵硅薄锛屽彇data灞炴��
+     */
+    @GetMapping("/listFileObjectByKeyInfo")
+    public BaseResult<VciFileObjectVO> listFileObjectByKeyInfo(String keyInfo, String docClassifyId){
+        return fileObjectService.listFileObjectByKeyInfo(VciBaseUtil.str2List(keyInfo),docClassifyId);
+    }
+
+    /**
+     * 棰勮鏂囦欢
+     * @param ownbizOid 涓氬姟绫诲瀷涓婚敭
+     * @param ownbizBtm 涓氬姟绫诲瀷鍚嶇О
+     * @param fileOid 鏂囦欢鐨勪富閿�
+     * @return 鏄惁鍙互棰勮
+     */
+    @PostMapping("/previewFile")
+    public BaseResult previewFile(String ownbizOid, String ownbizBtm, String fileOid){
+        //鏆傛椂閮藉彲浠ラ瑙�
+        return BaseResult.success();
+    }
+
+    /**
+     * 棰勮鏂囦欢--鑰佺増鏈殑
+     * @param ownbizOid 涓氬姟绫诲瀷涓婚敭
+     * @param ownbizBtm 涓氬姟绫诲瀷鍚嶇О
+     * @param fileOid 鏂囦欢鐨勪富閿�
+     * @return 鏄惁鍙互棰勮
+     */
+    @PostMapping("/previewFileOld")
+    public BaseResult<VciFilePreviewConfigVO> previewFileOld(String ownbizOid,String ownbizBtm,String fileOid){
+        //杩欎釜鏄�佺殑鐗堟湰鐨勯瑙堜娇鐢ㄧ殑锛岃繖閲屽氨鐩存帴鍐欏埌controller閲屼簡锛�
+        //闇�瑕佹牴鎹厤缃殑淇℃伅锛岀敓鎴恔ey
+        VciBaseUtil.alertNotNull(fileOid,"鏂囦欢鐨勪富閿�");
+        if(fileOid.contains(",")){
+            throw new VciBaseException("姣忔鍙兘閽堝涓�涓枃浠惰繘琛岄瑙�");
+        }
+        VciFileObjectVO fileObjectVO = fileObjectService.getObjectByOid(fileOid);
+        if(fileObjectVO == null || StringUtils.isBlank(fileObjectVO.getOid())){
+            throw new VciBaseException("杩欎釜鏂囦欢涓嶅瓨鍦紝鏃犳硶棰勮");
+        }
+
+        if(filePreviewAutoConfig == null || StringUtils.isBlank(filePreviewAutoConfig.getPreviewServiceUrl())) {
+            throw new VciBaseException("鏂囦欢棰勮鏈嶅姟骞舵病鏈夐厤缃紝涓嶆敮鎸侀瑙堬紝璇疯仈绯荤鐞嗗憳鎴栬�呬笅杞芥枃浠跺悗鏌ョ湅");
+        }
+        if(StringUtils.isBlank(app.getPrivateTokenKey())) {
+            throw new VciBaseException("閰嶇疆涓嶆纭紝璇疯仈绯荤鐞嗗憳妫�鏌pp.private-token-key鐨勫�硷紝娉ㄦ剰杩欎釜鍊间笌鏂囦欢棰勮鏈嶅姟閲岄厤缃殑瑕佸搴�");
+        }
+        Long invalidTime = filePreviewAutoConfig.getInvalidTime();
+        if(invalidTime == null || invalidTime<0){
+            invalidTime = 5L;
+        }
+        invalidTime = System.currentTimeMillis() + invalidTime*60*1000;
+        String previewKey = Md5.md5(fileObjectVO.getOid().trim() + "#" + filePreviewAutoConfig.getPreviewSystemKey() + "#" + app.getPrivateTokenKey() + "#" + invalidTime);
+        VciFilePreviewConfigVO configVO = new VciFilePreviewConfigVO();
+        configVO.setPreviewKey(previewKey);
+        configVO.setSystemKey(filePreviewAutoConfig.getPreviewSystemKey());
+        configVO.setFileOids(fileOid);
+        configVO.setPreviewSystemUrl(filePreviewAutoConfig.getPreviewServiceUrl());
+        configVO.setInvalidTime(invalidTime);
+        return BaseResult.success(configVO);
+    }
+
+    /**
+     * 浣跨敤鍏抽敭淇℃伅缁熻涓暟
+     * @param keyInfo 鍏抽敭淇℃伅锛屽涓互閫楀彿鍒嗛殧锛�
+     * @param docClassifyId 鏂囨。鍒嗙被缂栧彿
+     * @return 涓暟
+     */
+    @GetMapping("/countByKeyInfo")
+    public BaseResult<Long> countByKeyInfo(@RequestParam("keyInfo") String keyInfo, @RequestParam("docClassifyId")String docClassifyId){
+        return BaseResult.success(fileObjectService.countByKeyInfo(VciBaseUtil.str2List(keyInfo),docClassifyId));
+    }
+
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/VciFileUploadController.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/VciFileUploadController.java
new file mode 100644
index 0000000..deacc41
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/VciFileUploadController.java
@@ -0,0 +1,152 @@
+package com.vci.web.controller;
+
+import com.vci.file.dto.VciFileObjectDTO;
+import com.vci.file.pagemodel.VciFileObjectVO;
+import com.vci.frameworkcore.constant.FrameWorkLangCodeConstant;
+import com.vci.starter.web.annotation.controller.VciUnCheckRight;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.BaseResult;
+import com.vci.starter.web.util.LangBaseUtil;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.web.service.VciFileObjectServiceI;
+import com.vci.web.service.VciFileUploadServiceI;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+
+import static org.apache.commons.compress.utils.Charsets.UTF_8;
+
+/**
+ * 鏂囨。涓婁紶鎺у埗鍣�
+ *
+ * @author dangsn
+ * @date 2020-08-04
+ */
+@RestController
+@RequestMapping("/vciFileUploadController")
+public class VciFileUploadController {
+
+    /**
+     * 鏂囦欢涓婁紶涓氬姟灞�
+     */
+    @Autowired
+    private VciFileUploadServiceI vciFileUploadServiceI;
+
+    /**
+     * 鏂囦欢鐨勫璞℃湇鍔�
+     */
+    @Autowired
+    private VciFileObjectServiceI fileObjectService;
+
+    /**
+     * 鍓嶇椤甸潰鍗曟枃浠朵笂浼犮��(鍏堟暟鎹紝鍚庢枃浠舵ā寮忎笂浼�)
+     * @param file 涓婁紶鐨勬枃浠�
+     * @param fileObjectDTO 鏂囦欢淇℃伅浼犺緭瀵硅薄
+     * @return 鏂囦欢淇℃伅鏄剧ず瀵硅薄
+     */
+    @PostMapping("/uploadFile")
+    public BaseResult<VciFileObjectVO> uploadFile(MultipartFile file, VciFileObjectDTO fileObjectDTO){
+        try {
+            if (file != null ) {
+                return vciFileUploadServiceI.uploadFile(file, fileObjectDTO);
+            } else {
+                return BaseResult.fail(FrameWorkLangCodeConstant.UPLOAD_FAIL, new String[]{"鏃犱笂浼犵殑鏂囦欢"});
+            }
+        }catch (Throwable e) {
+            throw new VciBaseException(e.getMessage(),new String[0],e);
+        }
+    }
+
+    /**
+     * 渚涘叾浠栨湇鍔¤皟鐢ㄧ殑鏂囦欢涓婁紶鎺ュ彛銆�(鍒嗙墖涓婁紶)
+     * @param multipartFile 鐗囨枃浠�
+     * @param offSet 鏂囦欢鍋忕Щ浣嶇疆
+     * @param fileOid 鏂囦欢涓婚敭
+     * @return 鏂囦欢淇℃伅鏄剧ず瀵硅薄
+     */
+    @PostMapping(value = "/uploadFileForOtherService",consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    public BaseResult<VciFileObjectVO> uploadFileForOtherService(@RequestPart("file") MultipartFile multipartFile,
+                                                                 @RequestParam("offSet") long offSet,
+                                                                 @RequestParam("fileOid") String fileOid){
+        return vciFileUploadServiceI.uploadFileForOtherService(multipartFile, offSet, fileOid);
+    }
+
+    /**
+     * 鍏朵粬鏈嶅姟涓婁紶鏂囦欢涔嬪墠鍒濆鍖栨枃浠朵俊鎭�
+     * @param vciFileObjectDTOList 鏂囦欢淇℃伅浼犺緭瀵硅薄闆嗗悎鎵�鍦ㄥ璞�
+     * @return 鏂囦欢淇℃伅鏄剧ず瀵硅薄
+     */
+    @PostMapping("/initUploadFileInfo")
+    public BaseResult<VciFileObjectVO> initUploadFileInfo(@RequestBody VciFileObjectDTO vciFileObjectDTOList){
+        return vciFileUploadServiceI.initUploadFileInfo(vciFileObjectDTOList.getVciFileObjectDTOList());
+    }
+
+    /**
+     * 灏嗗師涓氬姟鏁版嵁涓嬬殑鎵�鏈夋枃浠跺叡浜埌鍏朵粬鐨勪笟鍔$被鍨嬩笅
+     * @param sourceBtmName 鍘熶笟鍔$被鍨�
+     * @param sourceBusinessOid 鍘熶笟鍔℃暟鎹富閿�
+     * @param btmName 涓氬姟绫诲瀷
+     * @param businessOid 涓氬姟鏁版嵁涓婚敭
+     * @return 鏂囦欢淇℃伅鏄剧ず瀵硅薄
+     */
+    @PostMapping("/shareFilesFromBO")
+    public BaseResult<VciFileObjectVO> shareFilesToBO(String sourceBtmName, String sourceBusinessOid,
+                                                      String btmName, String businessOid){
+        return vciFileUploadServiceI.shareFilesToBO(sourceBtmName, sourceBusinessOid, btmName, businessOid);
+    }
+
+    /**
+     * 灏嗘枃浠跺叡浜埌鍏朵粬鐨勪笟鍔$被鍨嬩笅
+     * @param fileOids 鏂囦欢涓婚敭
+     * @param btmName 涓氬姟绫诲瀷
+     * @param businessOid 涓氬姟鏁版嵁涓婚敭
+     * @return 鍏变韩鍚庣殑鏂囦欢鏄剧ず瀵硅薄
+     */
+    @PostMapping("/shareFileFromFile")
+    public BaseResult shareFilesToBO(String fileOids, String btmName, String businessOid){
+        return vciFileUploadServiceI.shareFilesToBO(VciBaseUtil.str2List(fileOids), btmName, businessOid);
+    }
+
+    /**
+     * 灏嗗師涓氬姟鏁版嵁涓嬬殑闈炶〃鍗曠浉鍏虫枃浠跺叡浜埌鍏朵粬鐨勪笟鍔$被鍨嬩笅
+     * @param sourceBtmName 鍘熶笟鍔$被鍨�
+     * @param sourceBusinessOid 鍘熶笟鍔℃暟鎹富閿�
+     * @param btmName 涓氬姟绫诲瀷
+     * @param businessOid 涓氬姟鏁版嵁涓婚敭
+     * @return 鏂囦欢淇℃伅鏄剧ず瀵硅薄
+     */
+    @PostMapping("/shareAnnexFilesToBO")
+    public BaseResult<VciFileObjectVO> shareAnnexFilesToBO(String sourceBtmName, String sourceBusinessOid,
+                                                           String btmName, String businessOid){
+        return vciFileUploadServiceI.shareAnnexFilesToBO(sourceBtmName, sourceBusinessOid, btmName, businessOid);
+    }
+
+    /**
+     * 鍒犻櫎鏂囦欢
+     * @param oids 鏂囦欢鐨勪富閿�
+     * @return 鎵ц缁撴灉
+     */
+    @DeleteMapping("/deleteFiles")
+    public BaseResult deleteFiles(String oids){
+        return fileObjectService.deleteFiles(VciBaseUtil.str2List(oids));
+    }
+
+    /**
+     * 璇诲彇涓婁紶鏂囦欢鐨勫唴瀹�
+     * @param file 鏂囦欢鐨勫璞�
+     * @return 鍐呭
+     */
+    @PostMapping("/readUploadFile")
+    @VciUnCheckRight
+    public BaseResult<String> readUploadFile(MultipartFile file){
+        try {
+            return BaseResult.success(new String(file.getBytes(),UTF_8));
+        } catch (IOException e) {
+            return BaseResult.fail(LangBaseUtil.getErrorMsg(e));
+        }
+    }
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/VciMdController.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/VciMdController.java
new file mode 100644
index 0000000..dcf5c08
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/VciMdController.java
@@ -0,0 +1,37 @@
+package com.vci.web.controller;
+
+import com.vci.starter.web.annotation.controller.VciUnCheckRight;
+import com.vci.starter.web.pagemodel.Tree;
+import com.vci.web.service.VciMdServiceI;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * markdown鐨勬帶鍒跺櫒
+ * @author weidy
+ * @date 2021/3/16
+ */
+@RestController
+@RequestMapping("/mdController")
+public class VciMdController {
+
+    /**
+     * md鐨勬湇鍔�
+     */
+    @Autowired
+    private VciMdServiceI mdService;
+
+    /**
+     * 鎵�鏈夌殑甯姪鏂囨。鐨勫悕绉�
+     * @return 鍚嶇О鐨勬爲
+     */
+    @GetMapping("/treeAllMD")
+    @VciUnCheckRight
+    public List<Tree> treeAllMD(){
+        return  mdService.treeAllMD();
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/VciOsCodeRuleController.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/VciOsCodeRuleController.java
new file mode 100644
index 0000000..26feb50
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/VciOsCodeRuleController.java
@@ -0,0 +1,164 @@
+package com.vci.web.controller;
+
+import com.vci.starter.web.annotation.log.VciBusinessLog;
+import com.vci.starter.web.pagemodel.BaseQueryObject;
+import com.vci.starter.web.pagemodel.BaseResult;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.web.dto.OsCodeRuleDTO;
+import com.vci.web.dto.OsCodeRuleProduceDTO;
+import com.vci.web.pageModel.OsCodeResultVO;
+import com.vci.web.pageModel.OsCodeRuleElementVO;
+import com.vci.web.pageModel.OsCodeRuleVO;
+import com.vci.web.service.OsCodeRuleServiceI;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 缂栫爜瑙勫垯鐨勬帶鍒跺櫒
+ * @author weidy
+ * @date 2020/9/2 23:20
+ */
+@RestController
+@VciBusinessLog(modelName="宸ヨ搴忓垪鍙�")
+@RequestMapping("/codeRuleController")
+public class VciOsCodeRuleController  {
+
+    /**
+     * 缂栫爜瑙勫垯鐨勬湇鍔�
+     */
+    @Autowired
+    private OsCodeRuleServiceI codeRuleService;
+
+    /**
+     * 鐢熸垚缂栫爜
+     * @param codeRuleProduceDTO 缂栫爜瑙勫垯鐨勬暟鎹紶杈撳璞★紝闇�瑕佹湁涓氬姟鏁版嵁鐨勫唴瀹癸紝缂栫爜瑙勫垯鐨勭紪鍙锋垨鑰呬富閿�
+     * @return obj鏄敓鎴愮殑缂栫爜鐨勫��
+     */
+    @PostMapping( "/produceCode")
+    @VciBusinessLog(operateName = "鐢熸垚缂栫爜")
+    public BaseResult<String> produceCode(OsCodeRuleProduceDTO codeRuleProduceDTO){
+        return BaseResult.success(codeRuleService.produceCode(codeRuleProduceDTO));
+    }
+
+    /**
+     * 鎵归噺鐢熸垚缂栫爜
+     * @param codeRuleProduceDTO 缂栫爜瑙勫垯鐨勬暟鎹紶杈撳璞★紝闇�瑕佹湁涓氬姟鏁版嵁鐨勫唴瀹癸紝缂栫爜瑙勫垯鐨勭紪鍙锋垨鑰呬富閿�
+     * @return obj鏄敓鎴愮殑缂栫爜鐨勫��
+     */
+    @PostMapping( "/batchProduceCode")
+    @VciBusinessLog(operateName = "鎵归噺鐢熸垚缂栫爜")
+    public BaseResult<List<OsCodeResultVO>> batchProduceCode(OsCodeRuleProduceDTO codeRuleProduceDTO, Integer needAddQuantity){
+        return BaseResult.success(codeRuleService.batchProduceCode(codeRuleProduceDTO,needAddQuantity));
+    }
+    /**
+     * 缂栫爜瑙勫垯鐨勫垪琛ㄦ樉绀�
+     * @param queryObject 鏌ヨ鏉′欢
+     * @return 鏁版嵁鐨勬樉绀哄璞�
+     */
+    @GetMapping( "/dataGrid")
+    @VciBusinessLog(operateName = "缂栫爜瑙勫垯鍒楄〃")
+    public DataGrid<OsCodeRuleVO> dataGrid(BaseQueryObject queryObject){
+        if(queryObject == null){
+            queryObject = new BaseQueryObject();
+        }
+        return codeRuleService.dataGrid(queryObject.getConditionMap(),queryObject.getPageHelper());
+    }
+
+    /**
+     * 缂栫爜瑙勫垯鐨勬槑缁嗗垪琛�
+     * @param pkRule 瑙勫垯鐨勪富閿�
+     * @param queryObject 鏌ヨ鏉′欢锛屽垎椤�
+     * @return 鏁版嵁鐨勬樉绀哄璞�
+     */
+    @GetMapping( "/dataGridElement")
+    @VciBusinessLog(operateName = "缂栫爜瑙勫垯鏄庣粏鍒楄〃")
+    public DataGrid<OsCodeRuleElementVO> dataGridElement(String pkRule, BaseQueryObject queryObject){
+        if(queryObject == null){
+            queryObject = new BaseQueryObject();
+        }
+        if(StringUtils.isBlank(pkRule)){
+            return new DataGrid<OsCodeRuleElementVO>();
+        }
+        return codeRuleService.dataGridElement(pkRule,queryObject.getConditionMap(),queryObject.getPageHelper());
+    }
+
+    /**
+     * 娣诲姞缂栫爜瑙勫垯
+     * @param ruleDTO 瑙勫垯鐨勫唴瀹�
+     * @return 鎵ц缁撴灉
+     */
+    @PostMapping("/addRule")
+    @VciBusinessLog(operateName = "娣诲姞缂栫爜瑙勫垯")
+    public BaseResult addRule(@RequestBody OsCodeRuleDTO ruleDTO){
+        return BaseResult.success(codeRuleService.addRule(ruleDTO));
+    }
+
+    /**
+     * 淇敼缂栫爜瑙勫垯
+     * @param ruleDTO 瑙勫垯鐨勫唴瀹�
+     * @return 鎵ц缁撴灉
+     */
+    @VciBusinessLog(operateName = "娣诲姞缂栫爜瑙勫垯")
+    @PostMapping( "/editRule")
+    public BaseResult editRule(@RequestBody  OsCodeRuleDTO ruleDTO){
+        return BaseResult.success(codeRuleService.editRule(ruleDTO));
+    }
+
+    /**
+     * 鍒犻櫎缂栫爜瑙勫垯锛屽鏋滀骇鐢熶簡娴佹按鍙峰氨涓嶈兘鍒犻櫎
+     * @param ruleDTO 瑙勫垯鐨勫唴瀹�,蹇呴』鏈塐id鍜孴s鐨勫睘鎬�
+     * @return 鎵ц缁撴灉
+     */
+    @DeleteMapping("/deleteRule")
+    public BaseResult deleteRule( OsCodeRuleDTO ruleDTO){
+        codeRuleService.deleteRule(ruleDTO);
+        return BaseResult.success();
+    }
+
+    /**
+     * 鍋滅敤缂栫爜瑙勫垯
+     * @param ruleDTO 瑙勫垯鐨勫唴瀹�,蹇呴』鏈塐id鍜孴s鐨勫睘鎬�
+     * @return 鎵ц缁撴灉
+     */
+    @PostMapping( "/disableRule")
+    public BaseResult disableRule( OsCodeRuleDTO ruleDTO){
+        codeRuleService.disableRule(ruleDTO);
+        return BaseResult.success();
+    }
+
+    /**
+     * 鍚敤缂栫爜瑙勫垯
+     * @param ruleDTO 瑙勫垯鐨勫唴瀹癸紝蹇呴』鏈塷id鍜宼s鐨勫睘鎬�
+     * @return 鎵ц缁撴灉
+     */
+    @PostMapping("/enableRule")
+    public BaseResult enableRule( OsCodeRuleDTO ruleDTO){
+        codeRuleService.enableRule(ruleDTO);
+        return BaseResult.success();
+    }
+
+    /**
+     * 涓婄Щ
+     * @param codeRuleElementOid 鍏冪礌鐨勪富閿�
+     * @return 鎵ц缁撴灉
+     */
+    @PostMapping("/upIndex")
+    public BaseResult upIndex(String codeRuleElementOid){
+        codeRuleService.upIndex(codeRuleElementOid);
+        return BaseResult.success();
+    }
+
+    /**
+     * 涓嬬Щ
+     * @param codeRuleElementOid 鍏冪礌鐨勪富閿�
+     * @return 鎵ц缁撴灉
+     */
+    @PostMapping("/downIndex")
+    public BaseResult downIndex(String codeRuleElementOid){
+        codeRuleService.downIndex(codeRuleElementOid);
+        return BaseResult.success();
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/VciOsStatusController.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/VciOsStatusController.java
new file mode 100644
index 0000000..36029e9
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/VciOsStatusController.java
@@ -0,0 +1,102 @@
+package com.vci.web.controller;
+
+import com.vci.starter.web.annotation.log.VciBusinessLog;
+import com.vci.starter.web.annotation.permission.VciPermission;
+import com.vci.starter.web.pagemodel.BaseQueryObject;
+import com.vci.starter.web.pagemodel.BaseResult;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.web.dto.OsStatusDTO;
+import com.vci.web.pageModel.OsLifeCycleVO;
+import com.vci.web.pageModel.OsStatusVO;
+import com.vci.web.service.OsLifeCycleServiceI;
+import com.vci.web.service.OsStatusServiceI;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 鐘舵�佺殑鎺у埗鍣�
+ * @author weidy
+ * @date 2022-2-15
+ */
+@RestController
+@RequestMapping("/statusController")
+@VciBusinessLog(modelName = "瀵硅薄寤烘ā-鐘舵�佹睜")
+public class VciOsStatusController {
+
+    /**
+     * 鐘舵�佺殑鏈嶅姟
+     */
+    @Autowired
+    private OsStatusServiceI statusService;
+
+    /**
+     * 鐢熷懡鍛ㄦ湡鐨勬湇鍔�
+     */
+    @Autowired
+    private OsLifeCycleServiceI lifeCycleService;
+
+    /**
+     * 鐘舵�佺殑鍒楄〃
+     * @param queryObject 鏌ヨ瀵硅薄
+     * @return 鏄剧ず瀵硅薄
+     */
+    @GetMapping("/gridStatus")
+    @VciBusinessLog(operateName = "鏌ョ湅鐘舵�佸垪琛�")
+    public DataGrid<OsStatusVO> gridStatus(BaseQueryObject queryObject){
+        return statusService.gridStatus(queryObject.getConditionMap(),queryObject.getPageHelper());
+    }
+
+    /**
+     * 鏌ヨ鐘舵�佹睜鐨勫簲鐢ㄨ寖鍥�
+     * @param oid 鐘舵�佺殑涓婚敭
+     * @return 浣跨敤鐨勭敓鍛藉懆鏈熺殑瀵硅薄
+     */
+    @GetMapping("/listUsed")
+    public DataGrid<OsLifeCycleVO> listUsed(String oid){
+        return lifeCycleService.listStatusUsed(oid);
+    }
+
+    /**
+     * 娣诲姞鐘舵��
+     * @param statusDTO 鐘舵�佺殑鏁版嵁浼犺緭瀵硅薄
+     * @return 鎵ц缁撴灉
+     */
+    @PostMapping("/addSave")
+    public BaseResult addSave(OsStatusDTO statusDTO){
+        statusService.addSave(statusDTO);
+        return BaseResult.success();
+    }
+
+    /**
+     * 淇敼鐘舵��
+     * @param statusDTO 鐘舵�佺殑鏁版嵁浼犺緭瀵硅薄
+     * @return 鎵ц缁撴灉
+     */
+    @PutMapping("/editSave")
+    public BaseResult editSave(OsStatusDTO statusDTO){
+        statusService.editSave(statusDTO);
+        return BaseResult.success();
+    }
+
+    /**
+     * 鍒犻櫎鐘舵��
+     * @param oids 鐘舵�佺殑涓婚敭
+     * @return 鎵ц缁撴灉
+     */
+    @DeleteMapping("/delete")
+    public BaseResult delete(String oids){
+        statusService.delete(oids);
+        return BaseResult.success();
+    }
+
+    /**
+     * 浣跨敤涓婚敭鏉ヨ幏鍙栧璞�
+     * @param oid 涓婚敭
+     * @return 瀵硅薄鐨勪俊鎭�
+     */
+    @GetMapping("/getObjectByOid")
+    public BaseResult<OsStatusVO> getObjectByOid(String oid){
+        return BaseResult.success(statusService.getObjectByOid(oid));
+    }
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WFWorkflowNodeFavController.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WFWorkflowNodeFavController.java
new file mode 100644
index 0000000..1bfca0f
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WFWorkflowNodeFavController.java
@@ -0,0 +1,149 @@
+package com.vci.web.controller;
+
+import com.vci.starter.web.pagemodel.BaseQueryObject;
+import com.vci.starter.web.pagemodel.BaseResult;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.web.dto.WFWorkflowNodeFavDTO;
+import com.vci.web.pageModel.WFWorkflowNodeFavItemVO;
+import com.vci.web.pageModel.WFWorkflowNodeFavVO;
+import com.vci.web.service.WFWorkflowNodeFavServiceI;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 娴佺▼璐熻矗浜烘敹钘忔帶鍒跺櫒
+ *
+ * @author weidy
+ * @date 2021-06-08
+ */
+@RestController
+@RequestMapping("/wFWorkflowNodeFavController")
+public class WFWorkflowNodeFavController {
+
+    /**
+     * 娴佺▼璐熻矗浜烘敹钘忕殑鏈嶅姟
+     */
+    @Autowired
+    private WFWorkflowNodeFavServiceI wFWorkflowNodeFavService;
+
+    /**
+     * 褰撳墠鐢ㄦ埛鐨勬祦绋嬫敹钘忔柟妗�
+     * @param templateOid 娴佺▼鐨勬ā鏉�
+     * @param templateRevision 娴佺▼妯℃澘鐨勭増鏈彿
+     * @return 鏂规鐨勬暟鎹�
+     */
+    @GetMapping("/listNodeFavByWorkflowTemplate")
+    public DataGrid<WFWorkflowNodeFavVO> listNodeFavByWorkflowTemplate(String templateOid, String templateRevision){
+        if(StringUtils.isBlank(templateOid) || StringUtils.isBlank(templateRevision)){
+            return new DataGrid<>();
+        }
+        Map<String,String> conditionMap= new HashMap<>();
+        conditionMap.put("id",templateOid);
+        conditionMap.put("wfTemplateRev",templateRevision);
+        conditionMap.put("userId", VciBaseUtil.getCurrentUserId());
+
+        return wFWorkflowNodeFavService.gridWFWorkflowNodeFav(conditionMap,new PageHelper(-1));
+    }
+
+    /**
+     * 娴佺▼璐熻矗浜烘敹钘忓垪琛�
+     * @param baseQueryObject 鍩虹鏌ヨ瀵硅薄锛屽寘鍚煡璇㈡潯浠讹紝鍒嗛〉锛屾帓搴忕瓑
+     * @return 娴佺▼璐熻矗浜烘敹钘忔樉绀哄璞″垪琛�
+     */
+    @GetMapping("/gridWFWorkflowNodeFav")
+    public DataGrid<WFWorkflowNodeFavVO> gridWFWorkflowNodeFav(BaseQueryObject baseQueryObject){
+        if(baseQueryObject == null){
+            baseQueryObject = new BaseQueryObject();
+        }
+        return wFWorkflowNodeFavService.gridWFWorkflowNodeFav(baseQueryObject.getConditionMap(),baseQueryObject.getPageHelper());
+    }
+    /**
+     * 澧炲姞 娴佺▼璐熻矗浜烘敹钘�
+     * @param wFWorkflowNodeFavDTO 娴佺▼璐熻矗浜烘敹钘忔暟鎹紶杈撳璞�
+     * @return 鎵ц缁撴灉锛宻uccess涓簍rue琛ㄧず鎴愬姛锛宮sg鏄け璐ョ殑鎻愮ず淇℃伅锛宱bj鏄坊鍔犲畬鎴愬悗鐨勬樉绀哄璞�
+     */
+    @PostMapping("/addSave")
+    public BaseResult<WFWorkflowNodeFavVO> addSave(@RequestBody WFWorkflowNodeFavDTO wFWorkflowNodeFavDTO){
+        //鍏堝垽鏂柟妗堝悕绉版槸鍚︿竴鏍凤紝涓�鏍峰氨鐩存帴鍋氭浛鎹慨鏀�,涓嶄竴鏍峰氨鏂板
+        return BaseResult.success(wFWorkflowNodeFavService.addSave(wFWorkflowNodeFavDTO));
+    }
+
+    /**
+     * 淇敼 娴佺▼璐熻矗浜烘敹钘�
+     * @param wFWorkflowNodeFavDTO 娴佺▼璐熻矗浜烘敹钘忔暟鎹紶杈撳璞�
+     * @return 鎵ц缁撴灉锛宻uccess涓簍rue琛ㄧず鎴愬姛锛宮sg鏄け璐ョ殑鎻愮ず淇℃伅锛宱bj鏄坊鍔犲畬鎴愬悗鐨勬樉绀哄璞�
+     */
+    @PutMapping("/editSave")
+    public BaseResult<WFWorkflowNodeFavVO> editSave(@RequestBody WFWorkflowNodeFavDTO wFWorkflowNodeFavDTO){
+        WFWorkflowNodeFavVO wFWorkflowNodeFavVO = wFWorkflowNodeFavService.editSave(wFWorkflowNodeFavDTO);
+        return BaseResult.success(wFWorkflowNodeFavVO);
+    }
+
+
+    /**
+     * 鍒犻櫎娴佺▼璐熻矗浜烘敹钘�
+     * @param wFWorkflowNodeFavDTO 娴佺▼璐熻矗浜烘敹钘忔暟鎹紶杈撳璞★紝oid鍜宼s闇�瑕佷紶杈�
+     * @return 鍒犻櫎缁撴灉鍙嶉锛氾細success锛氭垚鍔燂紝fail锛氬け璐�
+     */
+    @DeleteMapping("/deleteData")
+    public BaseResult delWFWorkflowNodeFav(WFWorkflowNodeFavDTO wFWorkflowNodeFavDTO) {
+        return wFWorkflowNodeFavService.deleteWFWorkflowNodeFav(wFWorkflowNodeFavDTO);
+    }
+
+
+    /**
+     * 浣跨敤涓婚敭鑾峰彇瀵硅薄
+     * @param oid 涓婚敭
+     * @return 瀵硅薄
+     */
+    @GetMapping("/getObjectByOid")
+    public BaseResult<WFWorkflowNodeFavVO> getObjectByOid(String oid){
+        WFWorkflowNodeFavVO wFWorkflowNodeFavVO = wFWorkflowNodeFavService.getObjectByOid(oid);
+        return BaseResult.success(wFWorkflowNodeFavVO);
+    }
+
+    /**
+     * 涓婚敭鎵归噺鑾峰彇娴佺▼璐熻矗浜烘敹钘�
+     * @param oids 涓婚敭锛屽涓互閫楀彿鍒嗛殧锛屼絾鏄彈鎬ц兘褰卞搷锛屽缓璁竴娆℃煡璇笉瓒呰繃10000涓�
+     * @return 娴佺▼璐熻矗浜烘敹钘忔樉绀哄璞�
+     */
+    @PostMapping("/listDataByOids")
+    public BaseResult<WFWorkflowNodeFavVO> listWFWorkflowNodeFavByOids(String oids){
+        Collection<WFWorkflowNodeFavVO> voCollection =  wFWorkflowNodeFavService.listWFWorkflowNodeFavByOids(VciBaseUtil.str2List(oids));
+        BaseResult baseResult = BaseResult.success();
+        baseResult.setData(voCollection);
+        return  baseResult;
+    }
+
+    /**
+     * 鍙傜収娴佺▼璐熻矗浜烘敹钘忓垪琛�
+     * @param baseQueryObject 鍩虹鏌ヨ瀵硅薄锛屽寘鍚煡璇㈡潯浠讹紝鍒嗛〉锛屾帓搴忕瓑
+     * @return 娴佺▼璐熻矗浜烘敹钘忔樉绀哄璞″垪琛紝鐢熸晥鐨勫唴瀹�
+     */
+    @GetMapping("/refDataGrid")
+    public DataGrid<WFWorkflowNodeFavVO> refDataGridWFWorkflowNodeFav(BaseQueryObject baseQueryObject){
+        if(baseQueryObject == null){
+            baseQueryObject = new BaseQueryObject();
+        }
+        return wFWorkflowNodeFavService.refDataGridWFWorkflowNodeFav(baseQueryObject.getConditionMap(),baseQueryObject.getPageHelper());
+    }
+
+    /**
+     * 鏍规嵁鏂规鐨勪富閿幏鍙栨槑缁�
+     * @param schemaOid 鏂规鐨勪富閿�
+     * @return 鏄庣粏鐨勫唴瀹�
+     */
+    @GetMapping("/listNodeFavItemVOBySchema")
+    public List<WFWorkflowNodeFavItemVO> listNodeFavItemVOBySchema(String schemaOid){
+        return wFWorkflowNodeFavService.listNodeFavItemVOBySchema(schemaOid);
+    }
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebActionController.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebActionController.java
new file mode 100644
index 0000000..a4dc923
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebActionController.java
@@ -0,0 +1,33 @@
+package com.vci.web.controller;
+
+import com.vci.starter.web.pagemodel.BaseResult;
+import com.vci.web.service.WebActionServiceI;
+import com.vci.web.util.WebUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+/**
+ * 骞冲彴瀹氫箟鐨刟ction
+ * @author weidy
+ * @date 2019/9/9 9:39
+ */
+@Controller
+@RequestMapping("/webActionController")
+public class WebActionController  {
+
+    @Autowired
+    private WebActionServiceI actionService;
+
+
+    @RequestMapping("/getActionByOid")
+    @ResponseBody
+    public BaseResult getActionByOid(String oid){
+        try{
+            return BaseResult.success(actionService.getActionByOid(oid));
+        }catch (Exception e){
+            return BaseResult.fail(WebUtil.getErrorMsg(e));
+        }
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebBtmTypeController.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebBtmTypeController.java
new file mode 100644
index 0000000..6801931
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebBtmTypeController.java
@@ -0,0 +1,253 @@
+package com.vci.web.controller;
+
+import com.vci.starter.web.annotation.controller.VciUnCheckRight;
+import com.vci.starter.web.annotation.log.VciBusinessLog;
+import com.vci.starter.web.enumpck.BooleanEnum;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.BaseQueryObject;
+import com.vci.starter.web.pagemodel.BaseResult;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.starter.web.util.BeanUtil;
+import com.vci.starter.web.util.ControllerUtil;
+import com.vci.starter.web.util.LangBaseUtil;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.web.pageModel.OsBtmTypeAttributeVO;
+import com.vci.web.pageModel.OsBtmTypeVO;
+import com.vci.web.pageModel.OsERVO;
+import com.vci.web.service.OsAttributeServiceI;
+import com.vci.web.service.OsBtmServiceI;
+import com.vci.web.service.WebBtmIOServiceI;
+import com.vci.web.service.impl.OsAttributeServiceImpl;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static com.vci.frameworkcore.constant.FrameWorkBusLangCodeConstant.DATA_OID_NOT_EXIST;
+
+/**
+ * 涓氬姟绫诲瀷鐨勬帶鍒跺櫒
+ * @author weidy
+ * @date 2021/8/23
+ */
+@RequestMapping("/btmTypeController")
+@VciBusinessLog(modelName="涓氬姟绫诲瀷")
+@RestController
+public class WebBtmTypeController {
+
+    /**
+     * 涓氬姟绫诲瀷鐨勬湇鍔�
+     */
+    @Autowired
+    private OsBtmServiceI btmService;
+
+    /**
+     * 涓氬姟绫诲瀷瀵煎叆瀵煎嚭鏈嶅姟
+     */
+    @Autowired
+    private WebBtmIOServiceI btmIOService;
+
+    /**
+     * 灞炴�х殑鏈嶅姟
+     */
+    @Lazy
+    @Autowired(required = false)
+    private OsAttributeServiceI attributeService;
+
+    /**
+     * 涓氬姟绫诲瀷鍒楄〃
+     * @param baseQueryObject 鏌ヨ鏉′欢
+     * @return 鍒楄〃鐨勫唴瀹�
+     */
+    @GetMapping( "/gridBtmType")
+    @VciBusinessLog(operateName = "涓氬姟绫诲瀷鍒楄〃")
+    public DataGrid<OsBtmTypeVO> gridBtmType(BaseQueryObject baseQueryObject){
+        return btmService.referDataGrid(baseQueryObject.getConditionMap(),baseQueryObject.getPageHelper());
+    }
+
+
+    /**
+     * 鍙傜収鐨勪笟鍔$被鍨�
+     * @param baseQueryObject 鏌ヨ鏉′欢
+     * @return 鍒楄〃鐨勫唴瀹�
+     */
+    @GetMapping( "/referDataGrid")
+    @VciBusinessLog(operateName = "鍙傜収涓氬姟绫诲瀷")
+    public DataGrid<OsBtmTypeVO> referDataGrid(BaseQueryObject baseQueryObject){
+        return btmService.referDataGrid(baseQueryObject.getConditionMap(),baseQueryObject.getPageHelper());
+    }
+
+    /**
+     * 鑾峰彇涓氬姟绫诲瀷鍖呭惈鐨勫睘鎬э紝涓嶅垎椤�
+     * @param baseQueryObject 鏌ヨ瀵硅薄
+     * @return 灞炴�х殑淇℃伅
+     */
+    @GetMapping(value = "/gridAttributesByBtmId")
+    @VciBusinessLog(operateName = "鏌ョ湅涓氬姟绫诲瀷鐨勫睘鎬�")
+    public DataGrid<OsBtmTypeAttributeVO> gridAttributesByBtmId(BaseQueryObject baseQueryObject){
+        String btmTypeId = baseQueryObject.getConditionMap().containsKey("btmTypeId")?baseQueryObject.getConditionMap().get("btmTypeId"):"";
+        if(StringUtils.isBlank(btmTypeId)){
+            return new DataGrid<OsBtmTypeAttributeVO>();
+        }
+        String hasDefaultAttr = baseQueryObject.getConditionMap().getOrDefault("hasDefaultAttr","false");
+        String attrId = baseQueryObject.getConditionMap().containsKey("name")?baseQueryObject.getConditionMap().get("name").replace("*",""):"";
+        String attrName = baseQueryObject.getConditionMap().containsKey("label") ? baseQueryObject.getConditionMap().get("label").replace("*","") : "";
+        List<OsBtmTypeAttributeVO> boAttrs = btmService.listAttributeByBtmId(btmTypeId);
+        if(boAttrs == null){
+            boAttrs = new ArrayList<>();
+        }
+        if(BooleanEnum.TRUE.getValue().equalsIgnoreCase(hasDefaultAttr)){
+            //鍔犻粯璁ょ殑灞炴��
+            List<OsBtmTypeAttributeVO> finalBoAttrs = boAttrs;
+            attributeService.getDefaultAttributeVOs().stream().forEach(attr->{
+                OsBtmTypeAttributeVO attributeVO = new OsBtmTypeAttributeVO();
+                BeanUtil.convert(attr,attributeVO);
+                attributeVO.setAttributeLength(attr.getAttrLength());
+                attributeVO.setAttrDataType(attr.getAttributeDataType());
+                attributeVO.setReferBtmTypeId(attr.getBtmTypeId());
+                attributeVO.setReferBtmTypeName(attr.getBtmTypeName());
+                finalBoAttrs.add(attributeVO);
+            });
+            boAttrs = finalBoAttrs;
+        }
+        List<OsBtmTypeAttributeVO> attrList = boAttrs.stream().filter(s->{
+            boolean usedFlag = true;
+            if(StringUtils.isNotBlank(attrId) && !s.getId().contains(attrId.replace("*",""))){
+                usedFlag = false;
+            }
+            if(StringUtils.isNotBlank(attrName) && !s.getName().contains(attrName.replace("*",""))){
+                usedFlag = false;
+            }
+            return usedFlag;
+        }).collect(Collectors.toList());
+        DataGrid<OsBtmTypeAttributeVO> dataGrid = new DataGrid<OsBtmTypeAttributeVO>();
+        dataGrid.setTotal(attrList.size());;
+        dataGrid.setData(attrList);
+        return dataGrid;
+    }
+
+
+    /**
+     * 浣跨敤涓婚敭鑾峰彇涓氬姟绫诲瀷鍖呭惈鐨勫睘鎬э紝涓嶅垎椤�
+     * @param baseQueryObject 鏌ヨ瀵硅薄
+     * @return 灞炴�х殑淇℃伅
+     */
+    @GetMapping(value = "/gridAttributeByBtmTypeOid")
+    @VciBusinessLog(operateName = "浣跨敤涓氬姟绫诲瀷涓婚敭鏌ョ湅鍖呭惈鐨勫睘鎬�")
+    public DataGrid<OsBtmTypeAttributeVO> gridAttributesByBtmTypeOid(String btmTypeOid,BaseQueryObject baseQueryObject){
+        if(StringUtils.isBlank(btmTypeOid)){
+            return new DataGrid<OsBtmTypeAttributeVO>();
+        }
+        String attrId = baseQueryObject.getConditionMap().containsKey("name")?baseQueryObject.getConditionMap().get("name").replace("*",""):"";
+        String attrName = baseQueryObject.getConditionMap().containsKey("label") ? baseQueryObject.getConditionMap().get("label").replace("*","") : "";
+        OsBtmTypeVO btmTypeVO = btmService.selectByOid(btmTypeOid);
+        List<OsBtmTypeAttributeVO> boAttrs = btmService.listAttributeByBtmId(btmTypeVO.getId());
+        List<OsBtmTypeAttributeVO> attrList = boAttrs.stream().filter(s->{
+            boolean usedFlag = true;
+            if(StringUtils.isNotBlank(attrId) && !s.getId().contains(attrId)){
+                usedFlag = false;
+            }
+            if(StringUtils.isNotBlank(attrName) && !s.getName().contains(attrName)){
+                usedFlag = false;
+            }
+            return usedFlag;
+        }).collect(Collectors.toList());
+        DataGrid<OsBtmTypeAttributeVO> dataGrid = new DataGrid<OsBtmTypeAttributeVO>();
+        dataGrid.setTotal(attrList.size());;
+        dataGrid.setData(attrList);
+        return dataGrid;
+    }
+
+
+    /**
+     * 浣跨敤涓婚敭鑾峰彇涓氬姟绫诲瀷鐨勫璞�
+     * @param oid 涓婚敭
+     * @return 涓氬姟绫诲瀷鐨勫璞�
+     */
+    @GetMapping("/getBtmTypeByOid")
+    public BaseResult<OsBtmTypeVO> getBtmTypeByOid(String oid){
+        OsBtmTypeVO btmTypeVO = btmService.selectByOid(oid);
+        if(btmTypeVO == null){
+            return BaseResult.fail(DATA_OID_NOT_EXIST);
+        }
+        return BaseResult.success(btmTypeVO);
+    }
+    /**
+     * 瀵煎嚭涓氬姟绫诲瀷鐨勪俊鎭埌word涓�
+     * @param btmTypeIds 涓氬姟绫诲瀷鐨勭紪鍙凤紝鐢ㄩ�楀彿鍒嗗壊
+     * @param response 鍝嶅簲瀵硅薄
+     * @return 鎵ц缁撴灉
+     */
+    @PostMapping("/exportBtmType2Word")
+    @VciBusinessLog(operateName = "瀵煎嚭涓氬姟绫诲瀷鍒皐ord涓�")
+    public void exportDataBaseToWord(String btmTypeIds, HttpServletResponse response) throws FileNotFoundException, VciBaseException {
+        String exportWordFileName = btmIOService.exportBtmTypesToWord(VciBaseUtil.str2List(btmTypeIds));
+        if(StringUtils.isNotBlank(exportWordFileName)){
+            try {
+                ControllerUtil.writeFileToResponse(response, exportWordFileName);
+            }catch (FileNotFoundException e){
+                try {
+                    ControllerUtil.writeDataToResponse(response,LangBaseUtil.getErrorMsg(e).getBytes(StandardCharsets.UTF_8),null);
+                } catch (IOException ex) {
+                    ex.printStackTrace();
+                }
+            } catch (IOException e) {
+                try {
+                    ControllerUtil.writeDataToResponse(response,LangBaseUtil.getErrorMsg(e).getBytes(StandardCharsets.UTF_8),null);
+                } catch (IOException ex) {
+                    ex.printStackTrace();
+                }
+            }
+        }
+    }
+
+    /**
+     * 瀵煎嚭鏁版嵁搴撶殑琛ㄤ俊鎭埌excel
+     * @param response 鍝嶅簲瀵硅薄
+     * @param btmTypeIds 涓氬姟绫诲瀷鐨勭紪鍙凤紝鐢ㄩ�楀彿鍒嗗壊
+     */
+    @PostMapping("/exportBtmType2Excel")
+    @VciBusinessLog(operateName = "瀵煎嚭涓氬姟绫诲瀷鍒癳xcel涓�")
+    public void exportAllTableToExcel(String btmTypeIds,HttpServletResponse response){
+        String excelFileName = btmIOService.exportBtmTypesToExcel(VciBaseUtil.str2List(btmTypeIds));
+        try {
+            ControllerUtil.writeFileToResponse(response,excelFileName);
+        } catch (IOException e) {
+            try {
+                ControllerUtil.writeDataToResponse(response,LangBaseUtil.getErrorMsg(e).getBytes(StandardCharsets.UTF_8),null);
+            } catch (IOException ex) {
+                ex.printStackTrace();
+            }
+        }
+    }
+
+    /**
+     * 鏍规嵁涓氬姟绫诲瀷鐢熸垚涓氬姟绫诲瀷浣跨敤鐨凟R鍥�
+     * @param id 涓氬姟绫诲瀷ID
+     * @return 鎵ц缁撴灉
+     */
+    @GetMapping("/createERDiagram")
+    public BaseResult createERDiagram(String id){
+        OsERVO osERVO = btmService.createERDiagram(id);
+        return BaseResult.success(osERVO);
+    }
+
+    /**
+     * 鑾峰彇浣跨敤杩欎釜涓氬姟绫诲瀷鐨凟-R鍥�
+     * @param id 涓氬姟绫诲瀷缂栧彿
+     * @return 鎵ц缁撴灉
+     */
+    @GetMapping("/createERUsed")
+    public BaseResult createERUsed(String id){
+        return BaseResult.success(btmService.createERUsed(id));
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebCodeGenSchemaController.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebCodeGenSchemaController.java
new file mode 100644
index 0000000..6e05fe5
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebCodeGenSchemaController.java
@@ -0,0 +1,118 @@
+package com.vci.web.controller;
+
+import com.vci.starter.web.pagemodel.BaseQueryObject;
+import com.vci.starter.web.pagemodel.BaseResult;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.starter.web.util.ControllerUtil;
+import com.vci.starter.web.util.LangBaseUtil;
+import com.vci.web.dto.OsCodeGenSchemaDTO;
+import com.vci.web.pageModel.OsCodeGenSchemaVO;
+import com.vci.web.service.OsCodeGenSchemaServiceI;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+/**
+ * 浠g爜鐢熸垚鍣�
+ * @author weidy
+ * @date 2020/7/30 15:56
+ */
+@RestController
+@RequestMapping("/codeGenSchemaController")
+public class WebCodeGenSchemaController {
+
+    /**
+     * 浠g爜鐢熸垚鏈嶅姟
+     */
+    @Autowired
+    private OsCodeGenSchemaServiceI codeGenSchemaService;
+
+    /**
+     * 浠g爜鐢熸垚鏂规鍒楄〃
+     * @param baseQueryObject 鍩烘湰鏌ヨ瀵硅薄锛屽寘鍚垎椤靛拰鎺掑簭
+     * @return 鏂规鍒楄〃
+     */
+    @GetMapping(value = "/gridSchema")
+    public DataGrid<OsCodeGenSchemaVO> gridSchema(BaseQueryObject baseQueryObject){
+        if(baseQueryObject == null){
+            baseQueryObject = new BaseQueryObject();
+        }
+        return codeGenSchemaService.gridSchema(baseQueryObject.getConditionMap(),baseQueryObject.getPageHelper());
+    }
+
+    /**
+     * 娣诲姞鏂规
+     * @param codeGenSchemaDTO 鏂规浼犺緭瀵硅薄
+     * @return 鎵ц缁撴灉锛宻uccess涓簍rue琛ㄧず鎴愬姛
+     */
+    @PostMapping(value = "/addSchema")
+    public BaseResult<OsCodeGenSchemaVO> addSchema(OsCodeGenSchemaDTO codeGenSchemaDTO){
+        OsCodeGenSchemaVO  schemaVO = codeGenSchemaService.addSchema(codeGenSchemaDTO);
+        return BaseResult.success(schemaVO);
+    }
+
+    /**
+     * 淇敼鏂规
+     * @param codeGenSchemaDTO 鏂规浼犺緭瀵硅薄
+     * @return 鎵ц缁撴灉锛宻uccess涓簍rue琛ㄧず鎴愬姛
+     */
+    @PutMapping(value = "/editSchema")
+    public BaseResult<OsCodeGenSchemaVO> editSchema(OsCodeGenSchemaDTO codeGenSchemaDTO){
+        OsCodeGenSchemaVO  schemaVO = codeGenSchemaService.editSchema(codeGenSchemaDTO);
+        return BaseResult.success();
+    }
+
+    /**
+     * 鐢熸垚浠g爜鏂囦欢
+     * @param oid 鏂规鐨勪富閿�
+     * @return 鎵ц缁撴灉
+     */
+    @PostMapping(value = "/productCodeFile")
+    public BaseResult productCodeFile(String oid){
+        codeGenSchemaService.productCodeFile(oid);
+        return BaseResult.success();
+    }
+
+    /**
+     * 棰勮浠g爜鏂囦欢
+     * @param oid 鏂规鐨勪富閿�
+     * @return key鏄枃浠剁殑绫诲瀷锛寁alue鏄枃浠剁殑鍚嶇О
+     */
+    @PostMapping(value = "/previewCodeFile")
+    public BaseResult previewCodeFile(String oid){
+        return BaseResult.success(codeGenSchemaService.previewCodeFile(oid));
+    }
+
+    /**
+     * 涓嬭浇浠g爜鏂囦欢
+     * @param oid 鏂规鐨勪富閿�
+     * @param downloadUUID 涓嬭浇璁稿彲鐮�
+     * @param response 鍝嶅簲鐨勫璞�
+     * @return 鎵ц缁撴灉锛屽彧鏈変笅杞藉け璐ョ殑鏃跺�欐墠浼氳繖鏍�
+     */
+    @GetMapping(value = "/downloadCodeFile")
+    public BaseResult downloadCodeFile(String oid, String downloadUUID, HttpServletResponse response){
+        String codeZipFile = codeGenSchemaService.downloadCodeFile(oid);
+        try {
+            ControllerUtil.writeFileToResponse(response,codeZipFile);
+        } catch (IOException e) {
+            return BaseResult.fail(LangBaseUtil.getErrorMsg(e));
+        }
+        return BaseResult.success();
+    }
+
+    /**
+     * 鏍规嵁涓婚敭鑾峰彇鏂规瀵硅薄
+     * @param oid 涓婚敭
+     * @return obj灞炴�ф槸鏂规瀵硅薄锛岄渶瑕佸厛鍒ゆ柇success
+     */
+    @GetMapping(value = "/getObjectByOid")
+    public BaseResult getObjectByOid(String oid){
+        OsCodeGenSchemaVO codeGenSchemaVO = codeGenSchemaService.getObjectByOid(oid);
+        BaseResult baseResult = BaseResult.success();
+        baseResult.setObj(codeGenSchemaVO);
+        return baseResult;
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebDataRightController.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebDataRightController.java
new file mode 100644
index 0000000..cc36218
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebDataRightController.java
@@ -0,0 +1,145 @@
+package com.vci.web.controller;
+
+import com.vci.corba.common.VCIError;
+import com.vci.starter.web.enumpck.DataBaseEnum;
+import com.vci.starter.web.enumpck.DataSecretEnum;
+import com.vci.starter.web.enumpck.UserSecretEnum;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.BaseResult;
+import com.vci.starter.web.pagemodel.SessionInfo;
+import com.vci.web.dto.BaseModelDTO;
+import com.vci.web.dto.BaseModelDTOList;
+import com.vci.web.properties.WebProperties;
+import com.vci.web.service.WebSecretServiceI;
+import com.vci.web.util.WebUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import plm.bs.bom.clientobject.ClientBusinessObject;
+import plm.bs.bom.clientobject.ClientLinkObject;
+import plm.uif.actions.client.DataRightUtil;
+import plm.uif.actions.client.RightCheckConstants;
+import plm.uif.engine.common.DefaultTableNode;
+import plm.uif.engine.common.IDataNode;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
+
+/**
+ * 鏁版嵁鏉冮檺鎺у埗
+ * @author weidy
+ */
+@Controller
+@RequestMapping("/webDataRightController")
+public class WebDataRightController {
+
+    /**
+     * 鏃ュ織
+     */
+    private Logger logger = LoggerFactory.getLogger(getClass());
+
+    /**
+     * 閰嶇疆淇℃伅
+     */
+    @Autowired
+    private WebProperties webProperties;
+
+    /**
+     * 瀵嗙骇鐨勪俊鎭�
+     */
+    @Autowired
+    private WebSecretServiceI secretService;
+
+    /**
+     * 鑾峰彇鏁版嵁鏉冮檺鏍¢獙鐨勫紑鍏�
+     * @return Json
+     */
+    @ResponseBody
+    @RequestMapping("/getDataRightSwitch")
+    public BaseResult getDataRightSwitch(){
+        return BaseResult.success(webProperties.isDataRight());
+    }
+
+    /**
+     * 瀵逛笟鍔℃暟鎹牎楠屾暟鎹潈闄�
+     * @param methodKey 鎸夐挳鐨勬爣璇�
+     * @param sourceData 涓氬姟鏁版嵁
+     * @return Json
+     */
+    @ResponseBody
+    @RequestMapping("/checkDataRightForBO")
+    public BaseResult checkDataRightForBO(String methodKey, BaseModelDTOList sourceData, HttpServletRequest request){
+        if(!webProperties.isDataRight()){
+           return BaseResult.success(true);
+        }else{
+            if(sourceData == null ){
+                return BaseResult.fail("娌℃湁浼犻�掍笟鍔$被鍨嬬殑鏁版嵁锛屾棤娉曟牎楠�");
+            }else if (StringUtils.isBlank(methodKey)){
+                return BaseResult.fail("娌℃湁浼犻�掓寜閽爣璇嗙锛屾棤娉曟牎楠�");
+            }else{
+                //鍏堝垽鏂瘑绾�
+                //weidy淇敼锛屾崲鎴愪粠绾跨▼閲岃幏鍙栧綋鍓嶇敤鎴蜂俊鎭�
+                SessionInfo si = WebUtil.getCurrentUserSessionInfo();
+                DataRightUtil dataRightUtil = new DataRightUtil(new HashMap());
+                StringBuilder sb = new StringBuilder();
+                  return BaseResult.fail("");
+            }
+        }
+    }
+
+    /**
+     * 鍥炲幓閫夋嫨鐨勬暟鎹�
+     * @param boData 涓氬姟鏁版嵁鐨勪俊鎭�
+     * @return 閫夋嫨鐨勬暟鎹�
+     * @throws VCIError 缂哄皯鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    protected Object getSelectedObject(BaseModelDTO boData) throws VCIError{
+        IDataNode selectedObject = new DefaultTableNode();
+        ClientBusinessObject cbo = new ClientBusinessObject();
+        if(StringUtils.isBlank(boData.getOid())){
+            throw new VCIError("娌℃湁鑾峰彇鍒版暟鎹殑涓婚敭",new String[0]);
+        }
+        if(StringUtils.isBlank(boData.getRevisionOid())){
+            throw new VCIError("娌℃湁鑾峰彇鍒版暟鎹殑鐗堟湰涓婚敭",new String[0]);
+        }
+        if(StringUtils.isBlank(boData.getNameOid())){
+            throw new VCIError("娌℃湁鑾峰彇鍒版暟鎹殑椤逛富閿�",new String[0]);
+        }
+        if(StringUtils.isBlank(boData.getBtmname())){
+            throw new VCIError("娌℃湁鑾峰彇鍒版暟鎹殑涓氬姟绫诲瀷",new String[0]);
+        }
+        cbo.setOid(boData.getOid());
+        cbo.setRevisionid(boData.getRevisionOid());
+        cbo.setNameoid(boData.getNameOid());
+        cbo.setBtmName(boData.getBtmname());
+        selectedObject.setMasterObject(cbo);
+        return selectedObject;
+    }
+
+
+    /**
+     * 鍒ゆ柇褰撳墠鐢ㄦ埛鐨勫瘑绾ф槸鍚︽湁鏉冮檺鏉ヨ闂暟鎹殑瀵嗙骇
+     * @param dataSecret 鏁版嵁鐨勫瘑绾�
+     * @return 鍒ゆ柇缁撴灉
+     */
+    @RequestMapping("/checkDataSecret")
+    @ResponseBody
+    public BaseResult checkDataSecret(int dataSecret){
+        //weidy淇敼锛屾崲鎴愪粠绾跨▼閲岃幏鍙栧綋鍓嶇敤鎴蜂俊鎭�
+        SessionInfo si = WebUtil.getCurrentUserSessionInfo();
+        if(webProperties.isSecretRight() && dataSecret > -1){
+            int userSecret = WebUtil.getInt(si.getUserSecret());
+            if (!secretService.checkDataSecret(dataSecret, userSecret) ){
+                 return BaseResult.fail("鎮ㄧ殑瀵嗙骇涓嶈兘鎿嶄綔杩欐潯鏁版嵁锛屾偍鐨勫瘑绾т负" + UserSecretEnum.getSecretText(userSecret)
+                         + ",鏁版嵁鐨勫瘑绾т负" + DataSecretEnum.getSecretText(dataSecret));
+            }
+        }
+        return BaseResult.success();
+    }
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebEnumController.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebEnumController.java
new file mode 100644
index 0000000..5b49745
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebEnumController.java
@@ -0,0 +1,84 @@
+package com.vci.web.controller;
+
+import com.vci.starter.web.annotation.log.VciBusinessLog;
+import com.vci.starter.web.pagemodel.BaseQueryObject;
+import com.vci.starter.web.pagemodel.BaseResult;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.web.pageModel.KeyValue;
+import com.vci.web.pageModel.OsBtmTypeVO;
+import com.vci.web.pageModel.OsEnumItemVO;
+import com.vci.web.pageModel.OsEnumVO;
+import com.vci.web.service.OsEnumServiceI;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+
+/**
+ * 鏋氫妇鏈嶅姟
+ * @author weidy
+ * @date 2021-1-10
+ */
+@VciBusinessLog(modelName="鏋氫妇鏈嶅姟")
+@RestController
+@RequestMapping("/webEnumController")
+public class WebEnumController {
+
+	/**
+	 * 娉ㄥ叆鏋氫妇鏈嶅姟
+	 */
+	@Autowired
+	private OsEnumServiceI enumService;
+
+	/**
+	 * 鑾峰彇鏋氫妇鐨勪笅鎷夋
+	 * @param comboxKey 鏋氫妇鐨勫悕绉�
+	 * @return 鏋氫妇鐨勪笅鎷夊��
+	 */
+	@VciBusinessLog(notStore=true,operateName="鑾峰彇鏋氫妇")
+	@GetMapping("/getEnum")
+	public BaseResult<List<KeyValue>> getEnum(String comboxKey){
+		return BaseResult.success(enumService.getEnum(comboxKey));
+	}
+
+
+	/**
+	 * 鑾峰彇鏁版嵁鐨勫瘑绾�
+	 * @param oid 涓婚敭
+	 * @param btmname 涓氬姟绫诲瀷
+	 * @return 杩欎釜鏁版嵁鍖呭惈鐨勫瘑绾х殑淇℃伅
+	 */
+	@VciBusinessLog(notStore = true,operateName = "鑾峰彇鏁版嵁鐨勫瘑绾х殑涓嬫媺妗�")
+	@GetMapping("/getDataEnum")
+	public BaseResult<List<KeyValue>> getDataEnum(String oid,String btmname){
+		return BaseResult.success(enumService.getDataEnum(oid,btmname));
+	}
+
+	/**
+	 * 鏋氫妇鍒楄〃
+	 * @param baseQueryObject 鏌ヨ鏉′欢
+	 * @return 鍒楄〃鐨勫唴瀹�
+	 */
+	@GetMapping( "/gridEnum")
+	@VciBusinessLog(operateName = "鏋氫妇鍒楄〃")
+	public DataGrid<OsEnumVO> gridEnum(BaseQueryObject baseQueryObject){
+		return enumService.referDataGrid(baseQueryObject.getConditionMap(),baseQueryObject.getPageHelper());
+	}
+
+	/**
+	 * 鑾峰彇鏋氫妇鐨勬槑缁�
+	 * @param pkEnum 鏋氫妇鐨勪富閿�
+	 * @return 鏋氫妇鐨勯�夐」
+	 */
+	@GetMapping("/gridEnumItemByOid")
+	@VciBusinessLog(operateName = "鑾峰彇鏋氫妇鐨勬槑缁�")
+	public DataGrid<OsEnumItemVO> gridEnumItemByOid(String pkEnum){
+		return enumService.gridEnumItemByOid(pkEnum);
+	}
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebFormulaController.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebFormulaController.java
new file mode 100644
index 0000000..b8fab19
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebFormulaController.java
@@ -0,0 +1,37 @@
+package com.vci.web.controller;
+
+import com.vci.starter.web.pagemodel.BaseResult;
+import com.vci.web.service.impl.FormulaServiceImpl;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.util.HtmlUtils;
+
+/**
+ * 鍏紡鎺у埗鍣�
+ * @author weidy
+ * @date 2022-2-11
+ */
+@RestController
+@RequestMapping("/formulaController")
+public class WebFormulaController {
+
+    /**
+     * 鍏紡鐨勬湇鍔�
+     */
+    @Autowired
+    private FormulaServiceImpl formulaService;
+
+    /**
+     * 瑙f瀽鍏紡
+     * @param formula 鍏紡鐨勫唴瀹�
+     * @return 鎵ц鍚庣殑缁撴灉
+     */
+    @PostMapping("/doFormula")
+    public BaseResult doFormula(String formula){
+        formula = StringUtils.isBlank(formula)?"": HtmlUtils.htmlUnescape(formula);
+        return BaseResult.success(formulaService.calculate(formula));
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebOnlineUserController.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebOnlineUserController.java
new file mode 100644
index 0000000..66a88e0
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebOnlineUserController.java
@@ -0,0 +1,29 @@
+package com.vci.web.controller;
+
+import com.vci.starter.web.pagemodel.BaseQueryObject;
+import com.vci.starter.web.pagemodel.DataGrid;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.annotation.Resource;
+
+/**
+ * 鍦ㄧ嚎鐢ㄦ埛鎺у埗
+ * @author weidy
+ */
+@Controller
+@RequestMapping("/webOnlineUserController")
+public class WebOnlineUserController{
+
+    /**
+     *  鍦ㄧ嚎鐢ㄦ埛鍒楄〃
+     * @return Json
+     */
+    @RequestMapping("/dataGrid")
+    @ResponseBody
+    public DataGrid dataGrid(BaseQueryObject baseQueryObject){
+        return new DataGrid();
+        //return userDao.dataGridOnline(baseQueryObject.getConditionMap(), baseQueryObject.getPageHelper());
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebProcessCommandController.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebProcessCommandController.java
new file mode 100644
index 0000000..ccbc2f7
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebProcessCommandController.java
@@ -0,0 +1,178 @@
+package com.vci.web.controller;
+
+import com.vci.rmip.workflow.server.template.TasksAssigned;
+import com.vci.starter.web.annotation.log.VciBusinessLog;
+import com.vci.starter.web.pagemodel.BaseResult;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.web.dto.BaseModelDTO;
+import com.vci.web.dto.ProcessNodeUseDTO;
+import com.vci.web.dto.ProcessStartConfigDTO;
+import com.vci.web.pageModel.*;
+import com.vci.web.service.WebProcessCommandServiceI;
+import com.vci.web.util.WebUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.*;
+
+/**
+ * 娴佺▼鎵ц鎺у埗
+ * @author weidy
+ */
+@VciBusinessLog(modelName="娴佺▼鎵ц鏈嶅姟")
+@Controller
+@RequestMapping("/webProcessCommandController")
+public class WebProcessCommandController{
+
+	private Logger logger = LoggerFactory.getLogger(getClass());
+	
+	@Autowired
+	private WebProcessCommandServiceI proCmdService;
+	
+	@VciBusinessLog(operateName="鎵ц娴佺▼")
+	@RequestMapping("/completeTasks")
+	@ResponseBody
+	public BaseResult completeTasks(String taskOids, String outCome, String note, String  nextTaskUserIds){
+		try{
+			proCmdService.completeTasks(taskOids, outCome, note, getProcessUserByIds(nextTaskUserIds));
+			return BaseResult.success(taskOids);
+		}catch(Exception e){
+			BaseResult result = BaseResult.fail(WebUtil.getErrorMsg(e));
+			result.setObj(taskOids);
+			return result;
+		}
+	}
+
+	/**
+	 * 灏嗙敤鎴峰悕杞负娴佺▼鐢ㄦ埛瀵硅薄
+	 * @param userIds 鐢ㄦ埛鍚�
+	 * @return
+	 */
+	private List<ProcessUserVO> getProcessUserByIds(String userIds){
+		List<ProcessUserVO> users = new ArrayList<ProcessUserVO>();
+		if(WebUtil.isNotNull(userIds)){
+			for(String s : userIds.split(",")){
+				if(WebUtil.isNotNull(s)){
+					ProcessUserVO pu = new ProcessUserVO();
+					pu.setId(s);
+					pu.setType("user");
+					users.add(pu);
+				}
+			}
+		}
+		return users;
+	}
+	
+	
+	@VciBusinessLog(operateName="寮�濮嬫祦绋�")
+	@RequestMapping("/startProcess")
+	@ResponseBody
+	public BaseResult startProcess(ProcessStartConfigDTO config, ProcessNodeUseDTO processNodeUseDTO, BaseModelDTO variablesInfo){
+		try {
+			Map<String,List<ProcessUserVO>> inProcessUsers = new HashMap<String, List<ProcessUserVO>>();
+			if(processNodeUseDTO != null && processNodeUseDTO.getNodeUsers()!=null){
+				for(String nodeName : processNodeUseDTO.getNodeUsers().keySet()){
+					String userIds = processNodeUseDTO.getNodeUsers().get(nodeName);
+					inProcessUsers.put(nodeName, getProcessUserByIds(userIds));
+				}
+			}
+			proCmdService.startProcess(config, inProcessUsers, variablesInfo.getData());
+			return BaseResult.successMsg("鍙戣捣娴佺▼鎴愬姛");
+		} catch (Exception e) {
+			return BaseResult.fail(WebUtil.getErrorMsg(e));
+		}
+	}
+
+	@VciBusinessLog(operateName="鍙戣捣娴佺▼鏃舵牎楠屾暟鎹殑灞炴�ф槸鍚︾鍚堣姹�")
+	@RequestMapping("/checkAttributesOnStartProcess")
+	@ResponseBody
+	public BaseResult checkAttributesOnStartProcess(String oids,String btmType,String attributes,String attributeValues,String primaryKeyName){
+		try{
+			proCmdService.checkAttributesOnStartProcess(oids,btmType,attributes,attributeValues,primaryKeyName);
+			return BaseResult.successMsg("灞炴�ф牎楠屾垚鍔�");
+		}catch (Throwable e){
+			return BaseResult.fail(WebUtil.getErrorMsg(e));
+		}
+	}
+	
+	@VciBusinessLog(operateName="缁堟娴佺▼")
+	@RequestMapping("/endProcess")
+	@ResponseBody
+	public BaseResult endProcess(String processOids,String note){
+		proCmdService.endProcess(processOids,note);
+		return BaseResult.success();
+	}
+	
+	@VciBusinessLog(operateName="鎸傝捣娴佺▼")
+	@RequestMapping("/suspendProcess")
+	@ResponseBody
+	public BaseResult suspendProcess(String processOids,String note){
+		proCmdService.suspendProcess(processOids,note);
+		return BaseResult.success();
+	}
+	
+	@VciBusinessLog(operateName="鎭㈠娴佺▼")
+	@RequestMapping("/resumeProcess")
+	@ResponseBody
+	public BaseResult resumeProcess(String processOids){
+		proCmdService.resumeProcess(processOids);
+		return BaseResult.success();
+	}
+	
+	@VciBusinessLog(operateName="鏌ョ湅浠g悊淇℃伅")
+	@RequestMapping("/getProxy")
+	@ResponseBody
+	public DataGrid getProxy(){
+		DataGrid dg = new DataGrid();
+		TasksAssigned taskAss = proCmdService.getProxy();
+		if(taskAss!=null){
+			dg.getData().add(taskAss);
+			dg.setLimit(1);
+			dg.setTotal(1);
+		}
+		return dg;
+	}
+	
+	@VciBusinessLog(operateName="寮�鍚唬鐞�")
+	@RequestMapping("/startProxy")
+	@ResponseBody
+	public BaseResult startProxy(String userId,Date startTime,Date endTime) {
+		proCmdService.beginProxy(userId, startTime, endTime,true);
+		return BaseResult.successMsg("娣诲姞娴佺▼浠g悊浜烘垚鍔�");
+	}
+	
+	@VciBusinessLog(operateName="鍏抽棴浠g悊")
+	@RequestMapping("/endProxy")
+	@ResponseBody
+	public BaseResult endProxy() {
+		proCmdService.endProxy();
+		return BaseResult.successMsg("鍋滄浠g悊鎴愬姛锛屽湪浠g悊鏈熼棿琚浆绉诲埌浠g悊浜虹殑浠诲姟涓嶄細鑷姩鍥炶浆");
+	}
+	
+	@VciBusinessLog(operateName="璁剧疆璐熻矗浜�")
+	@RequestMapping("/setPrincipal")
+	@ResponseBody
+	public BaseResult setPrincipal(String taskOids,String userIds){
+		proCmdService.setPrincipal(taskOids, userIds);
+		return BaseResult.successMsg("璁剧疆璐熻矗浜烘垚鍔�");
+	}
+
+	@VciBusinessLog(operateName="涓婁紶娴佺▼瀹℃壒鎰忚")
+	@RequestMapping("/uploadAuditSuggestFile")
+	@ResponseBody
+	public BaseResult uploadAuditSuggestFile(String taskOids, MultipartFile file) throws IOException {
+		if(file != null){
+			proCmdService.uploadAuditSuggestFile(taskOids, file,file.getOriginalFilename());
+			return BaseResult.successMsg("涓婁紶娴佺▼瀹℃壒鎰忚鎴愬姛");
+		}else{
+			return BaseResult.successMsg("涓婁紶鐨勬枃浠舵槸绌虹殑");
+		}
+	}
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebProcessDefineController.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebProcessDefineController.java
new file mode 100644
index 0000000..ef3ad70
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebProcessDefineController.java
@@ -0,0 +1,324 @@
+package com.vci.web.controller;
+
+import com.vci.file.pagemodel.VciFileObjectVO;
+import com.vci.starter.web.annotation.bus.VciNoUseBaseResult;
+import com.vci.starter.web.annotation.controller.VciUnCheckRight;
+import com.vci.starter.web.annotation.log.VciBusinessLog;
+import com.vci.starter.web.annotation.permission.VciReferPermission;
+import com.vci.starter.web.pagemodel.*;
+import com.vci.starter.web.util.ControllerUtil;
+import com.vci.web.pageModel.*;
+import com.vci.web.pageModel.KeyValue;
+import com.vci.web.service.WebProcessDefineServiceI;
+import com.vci.web.util.WebUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@VciBusinessLog(modelName="娴佺▼鏌ヨ鏈嶅姟")
+@Controller
+@RequestMapping("/processDefineController")
+public class WebProcessDefineController {
+	
+	@Autowired
+	private WebProcessDefineServiceI proDefineService;
+	
+	@VciBusinessLog(operateName="鑾峰彇寰呭姙浜嬮」")
+	@RequestMapping("/getMyUndoTask")
+	@ResponseBody
+	public DataGrid getMyUndoTask(BaseQueryObject baseQueryObject){
+		return proDefineService.getMyUndoProcessTask(baseQueryObject.getConditionMap(), baseQueryObject.getPageHelper());
+	}
+
+
+	@VciBusinessLog(operateName="鏌ヨ褰撳墠鐢ㄦ埛鍙戣捣鐨勬祦绋嬩腑姝e湪鎵ц涓殑娴佺▼")
+	@RequestMapping("/getMyExecutingProcess")
+	@ResponseBody
+	public DataGrid getMyExecutingProcess(BaseQueryObject baseQueryObject){
+		return proDefineService.getMyExecutingProcess(baseQueryObject.getConditionMap(), baseQueryObject.getPageHelper());
+	}
+
+	@VciBusinessLog(operateName="鏌ヨ鎵�鏈夋鍦ㄦ墽琛屼腑鐨勬祦绋�")
+	@RequestMapping("/getAllExecutingProcess")
+	@ResponseBody
+	public DataGrid getAllExecutingProcess(BaseQueryObject baseQueryObject){
+		return proDefineService.getAllExecutingProcess(baseQueryObject.getConditionMap(), baseQueryObject.getPageHelper());
+	}
+
+	@VciBusinessLog(operateName="鏌ヨ褰撳墠鐢ㄦ埛鍙戣捣鐨勬祦绋嬩腑宸茬粡瀹屾垚鐨勬祦绋�")
+	@RequestMapping("/getMyFinishProcess")
+	@ResponseBody
+	public DataGrid getFinishProcess(BaseQueryObject baseQueryObject){
+		return proDefineService.getMyCompletedProcess(baseQueryObject.getConditionMap(), baseQueryObject.getPageHelper());
+	}
+
+	@VciBusinessLog(operateName="鏌ヨ鎵�鏈夊凡缁忓畬鎴愮殑娴佺▼")
+	@RequestMapping("/getAllFinishProcess")
+	@ResponseBody
+	public DataGrid getAllFinishProcess(BaseQueryObject baseQueryObject){
+		return proDefineService.getAllCompletedProcess(baseQueryObject.getConditionMap(), baseQueryObject.getPageHelper());
+	}
+
+	@VciBusinessLog(operateName="鏌ヨ褰撳墠鐢ㄦ埛鍙戣捣鐨勬祦绋嬩腑宸茬粡缁堟鐨勬祦绋�")
+	@RequestMapping("/getMyEndProcess")
+	@ResponseBody
+	public DataGrid getEndProcess(BaseQueryObject baseQueryObject){
+		return proDefineService.getMyObsoledtedProcess(baseQueryObject.getConditionMap(), baseQueryObject.getPageHelper());
+	}
+
+	@VciBusinessLog(operateName="鏌ヨ鎵�鏈夊凡缁堟鐨勬祦绋�")
+	@RequestMapping("/getAllEndProcess")
+	@ResponseBody
+	public DataGrid getAllEndProcess(BaseQueryObject baseQueryObject){
+			return proDefineService.getAllObsoledtedProcess(baseQueryObject.getConditionMap(),baseQueryObject.getPageHelper());
+	}
+
+	@VciBusinessLog(operateName="鏌ヨ褰撳墠鐢ㄦ埛鍙戣捣鐨勬祦绋嬩腑宸茬粡鎸傝捣鐨勬祦绋�")
+	@RequestMapping("/getMySuspendedProcess")
+	@ResponseBody
+	public DataGrid getMySuspendedProcess(BaseQueryObject baseQueryObject){
+		return proDefineService.getMySuspendedProcess(baseQueryObject.getConditionMap(),baseQueryObject.getPageHelper());
+	}
+
+	@VciBusinessLog(operateName="鏌ヨ褰撳墠鐢ㄦ埛鍙戣捣鐨勬祦绋嬩腑宸茬粡鎸傝捣鐨勬祦绋�")
+	@RequestMapping("/getAllSuspendedProcess")
+	@ResponseBody
+	public DataGrid getAllSuspendedProcess(BaseQueryObject baseQueryObject){
+		return proDefineService.getAllSuspendedProcess(baseQueryObject.getConditionMap(),baseQueryObject.getPageHelper());
+	}
+
+	@VciBusinessLog(operateName="鏌ヨ褰撳墠鐢ㄦ埛宸茬粡澶勭悊鐨勬祦绋嬩换鍔�")
+	@RequestMapping("/getMyDoneProcessTask")
+	@ResponseBody
+	public DataGrid getMyDoneProcessTask(BaseQueryObject baseQueryObject){
+		return proDefineService.getMyDoneProcessTask(baseQueryObject.getConditionMap(),baseQueryObject.getPageHelper());
+	}
+	
+	@VciBusinessLog(operateName="鑾峰彇鏁版嵁灞曠ず鎵�闇�琛ㄦ牸鐨勫畾涔�",notStore=true)
+	@RequestMapping("/getDataDefine")
+	@ResponseBody
+	public BaseResult getDataDefine(String executionid, String taskOid, HttpServletRequest request) {
+		if(StringUtils.isNotBlank(executionid)){
+
+		}
+		Map<String, Object> map =  proDefineService.getDataTableDefine(executionid,taskOid);
+		if(!map.isEmpty()) {
+			return BaseResult.success(map);
+		}else {
+			return BaseResult.fail("娌℃湁鎵惧埌瀹氫箟");
+		}
+	}
+
+	@VciBusinessLog(operateName="鏍规嵁浠诲姟涓婚敭鑾峰彇浠诲姟瀵硅薄",notStore=true)
+	@RequestMapping("/getTaskByOid")
+	@ResponseBody
+	public BaseResult getTaskByOid(String taskOid){
+		return BaseResult.success(proDefineService.getTaskByOid(taskOid));
+	}
+	
+	@VciBusinessLog(operateName="鑾峰彇浠诲姟鍏宠仈鐨勬暟鎹�",notStore=true)
+	@RequestMapping("/getDataByTask")
+	@ResponseBody
+	public DataGrid getDataByTask(BaseQueryObject baseQueryObject,String referColumn){
+		if(baseQueryObject == null || baseQueryObject.getConditionMap() == null ||
+				(!baseQueryObject.getConditionMap().containsKey("taskOid") && !baseQueryObject.getConditionMap().containsKey("processOid"))){
+			return new DataGrid();
+		}
+		String taskOid = "";
+		if(baseQueryObject.getConditionMap().containsKey("taskOid")){
+			taskOid = baseQueryObject.getConditionMap().get("taskOid");
+		}
+		String processOid = "";
+		if(baseQueryObject.getConditionMap().containsKey("processOid")){
+			processOid = baseQueryObject.getConditionMap().get("processOid");
+		}
+		return proDefineService.getDataInProcess(taskOid,processOid,referColumn);
+	}
+
+	@VciBusinessLog(operateName="鑾峰彇娴佺▼涓笟鍔℃暟鎹叧鑱旀枃浠�",notStore=true)
+	@RequestMapping("/dataGridFileInProcess")
+	@ResponseBody
+	public DataGrid dataGridFileInProcess(BaseQueryObject baseQueryObject,String dataOid,String executionid){
+		return proDefineService.getFilesInProcess((baseQueryObject != null ? baseQueryObject.getConditionMap() : (new HashMap<String, String>())), dataOid, executionid,baseQueryObject.getPageHelper());
+	}
+	
+	@VciBusinessLog(operateName="鑾峰彇鍘嗗彶璁板綍",notStore=true)
+	@RequestMapping("/getHistory")
+	@ResponseBody
+	public DataGrid getHistory(String executionId,boolean showCurrentNode){
+		return proDefineService.getHistory(executionId, showCurrentNode);
+	}
+	//搴旇浣跨敤ResonseEntity锛屼絾鏄笉鐭ヤ负浣曞墠鍙版病鏈夎幏鍙栧埌鍊硷紝鏆傛椂浣跨敤娴佽緭鍑虹殑鏂瑰紡
+	@VciBusinessLog(operateName="鑾峰彇娴佺▼鍥剧墖",notStore=true)
+	@GetMapping("/getProcessPic")
+	public void getProcessPic(String executionId,String taskOid,HttpServletResponse response){
+		try {
+			byte[] picData = proDefineService.getProcessPicture(executionId, taskOid);
+			if(picData!=null&& picData.length>0){
+				response.setContentType(MediaType.IMAGE_PNG.toString());
+				OutputStream os = response.getOutputStream();
+				os.write(picData);
+				os.flush();
+				os.close();
+				return;
+			}
+		} catch (Exception e) {
+			try {
+				ControllerUtil.writeDataToResponse(response,WebUtil.getErrorMsg(e).getBytes(),null);
+			} catch (IOException ioException) {
+				ioException.printStackTrace();
+			}
+		}
+	}
+	
+	@VciBusinessLog(operateName="鏍¢獙娴佺▼浠诲姟鏄惁浣跨敤鐩稿悓鐨勬ā鏉�",notStore=true)
+	@RequestMapping("/checkUseSameTemplate")
+	@ResponseBody
+	public BaseResult checkUseSameTemplate(String taskOids){
+		try {
+			 return BaseResult.success(proDefineService.checkUseSameTemplate(taskOids));
+		} catch (Exception e) {
+			return BaseResult.fail(WebUtil.getErrorMsg(e));
+		}
+	}
+	
+	@VciBusinessLog(operateName="鑾峰彇浠诲姟鐨勮矾鐢�",notStore=true)
+	@RequestMapping("/getOutcomes")
+	@ResponseBody
+	public BaseResult getOutcomes(String taskOid){
+		 List<ProcessOutcomeVO> allOutcomes = proDefineService.getOutCome(taskOid, true);
+		BaseResult result = BaseResult.success();
+		result.setObj(allOutcomes);
+		 if(allOutcomes !=null && allOutcomes.size()>0){
+			 result.setSuccess(true);
+		 }else{
+			 result.setSuccess(false);
+			 result.setMsg("鑾峰彇鐨勮矾鐢变负绌�");
+		 }
+		 return result;
+	}
+	
+	@ResponseBody
+	@RequestMapping("/getTemplateByType")
+	@VciBusinessLog(operateName="鑾峰彇娴佺▼妯℃澘",notStore=true)
+	public BaseResult getTemplateByType(String type,String filterTemplate){
+		List<ProcessTemplateVO> myTemplate = proDefineService.getMyTemplates(type, filterTemplate,false);
+		List<KeyValue> allCombox = new ArrayList<KeyValue>();
+		if(myTemplate!=null && myTemplate.size()>0){
+			for(ProcessTemplateVO pt : myTemplate){
+				KeyValue kv = new KeyValue();
+				kv.setKey(pt.getOid());
+				kv.setValue(pt.getName() + "-" + pt.getVersion());
+				kv.setAttributes(WebUtil.objectToMap(pt));
+				allCombox.add(kv);
+			}
+			BaseResult result = BaseResult.success();
+			result.setData(allCombox);
+			return result;
+		}else{
+			return BaseResult.fail("娌℃湁鍙敤鐨勭増鏈�");
+		}
+	}
+	
+	@ResponseBody
+	@RequestMapping("/getAllProcessNode")
+	@VciBusinessLog(operateName="鑾峰彇娴佺▼鐨勮妭鐐�",notStore=true)
+	public BaseResult getAllProcessNode(String processOid,int maxSecret){
+		try{
+			List<ProcessNodeVO> allNode = proDefineService.getAllProcessNode(processOid, true,maxSecret);
+			if(allNode!=null && allNode.size()>0){
+				return BaseResult.success(allNode);
+			}else{
+				return BaseResult.fail("鏁版嵁鏈夎锛屾病鎵惧埌娴佺▼鐨勮妭鐐�");
+			}
+		}catch(Exception e){
+			return BaseResult.fail(WebUtil.getErrorMsg(e));
+		}
+	}
+
+	@ResponseBody
+	@RequestMapping("/getVariableByKey")
+	@VciBusinessLog(operateName="鑾峰彇娴佺▼涓弬鏁�",notStore=true)
+	@VciReferPermission(referedKey = "getVariableByKeyInProcess")
+	public BaseResult getVariableByKey(String executionId,String keys){
+		if(StringUtils.isBlank(executionId) || StringUtils.isBlank(keys)){
+			return BaseResult.fail("娌℃湁鑾峰彇鍒版祦绋嬬殑淇℃伅锛屾棤娉曟煡璇㈠彉閲�");
+		}
+		return BaseResult.success(proDefineService.getVariablesInProcess(executionId, keys));
+	}
+
+	@ResponseBody
+	@RequestMapping("/listAuditSuggestFile")
+	@VciBusinessLog(operateName = "鑾峰彇娴佺▼涓殑瀹℃壒鎰忚",notStore = true)
+	public DataGrid<VciFileObjectVO> listAuditSuggestFile(String taskOids){
+		return proDefineService.listAuditSuggestFile(taskOids);
+	}
+
+
+	/**
+	 * 鍙傜収娴佺▼鍒嗙被鍒楄〃
+	 * @param queryObject 鏌ヨ瀵硅薄
+	 * @return 鍒嗙被鐨勪俊鎭�
+	 */
+	@ResponseBody
+	@RequestMapping(value = "/referGridProcessClassify",method = RequestMethod.GET)
+	@VciBusinessLog(operateName = "鍙傜収娴佺▼鍒嗙被")
+	public DataGrid<ProcessClassifyVO> referGridProcessClassify(BaseQueryObject queryObject){
+		return proDefineService.referGridProcessClassify(queryObject.getConditionMap(),queryObject.getPageHelper());
+	}
+
+	/**
+	 * 鍙傜収娴佺▼鍒嗙被鏍�
+	 * @param queryObject 鏌ヨ瀵硅薄
+	 * @return 鍒嗙被鐨勪俊鎭�
+	 */
+	@ResponseBody
+	@RequestMapping(value = "/referTreeProcessClassify",method = RequestMethod.GET)
+	@VciBusinessLog(operateName = "鍙傜収娴佺▼鍒嗙被鏍�")
+	public List<Tree> referTreeProcessClassify(TreeQueryObject queryObject){
+		return proDefineService.referTreeProcessClassify(queryObject);
+	}
+
+	/**
+	 * 鍙傜収娴佺▼鐨勬ā鏉垮垪琛�
+	 * @param processClassifyId 娴佺▼鍒嗙被鐨勫悕绉�
+	 * @param name 妯℃澘鍚嶇О
+	 * @return 妯℃澘鐨勪俊鎭�
+	 */
+	@ResponseBody
+	@RequestMapping(value = "/referGridProcessTemplate",method = RequestMethod.GET)
+	@VciBusinessLog(operateName = "鍙傜収娴佺▼妯℃澘")
+	public DataGrid<ProcessTemplateVO> referGridProcessTemplate(String processClassifyId,String name){
+		return proDefineService.referGridProcessTemplate(processClassifyId,name);
+	}
+
+	@VciNoUseBaseResult
+	@RequestMapping("/getUndoTaskCount")
+	@VciUnCheckRight
+	@VciBusinessLog(operateName = "澶栭儴绯荤粺鏌ヨ寰呭姙鐨勬�绘暟")
+	public void getUndoTaskCount(String username,HttpServletResponse response){
+		String count =  String.valueOf(proDefineService.getUndoTaskCount(username));
+		try {
+			ControllerUtil.writeDataToResponse(response,count.getBytes(StandardCharsets.UTF_8),"text/html");
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebScanAnnotationController.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebScanAnnotationController.java
new file mode 100644
index 0000000..4e138d2
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebScanAnnotationController.java
@@ -0,0 +1,59 @@
+package com.vci.web.controller;
+
+
+import com.vci.starter.web.pagemodel.BaseResult;
+import com.vci.starter.web.util.LangBaseUtil;
+import com.vci.web.service.impl.WebInitServiceImpl;
+import com.vci.web.util.OsScanAnnotationTool;
+import com.vci.web.util.WebUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 鎵弿琛ㄧ殑鎺у埗鍣�
+ * @author weidy
+ * @date 2021/8/21
+ */
+@RequestMapping("/scanAnnotationController")
+@RestController
+public class WebScanAnnotationController {
+
+    /**
+     * 鎵弿鐨勫伐鍏�
+     */
+    @Autowired
+    private OsScanAnnotationTool scanAnnotationTool;
+
+    /**
+     * 鍒濆鍖栨湇鍔�
+     */
+    @Autowired
+    private WebInitServiceImpl initService;
+
+    /**
+     * 浣跨敤鍖呭悕鎵弿娉ㄨВ
+     * @param packName 鍖呭悕
+     * @return 鎵ц缁撴灉
+     */
+    @PostMapping(value = "/scanAnnotation")
+    public synchronized BaseResult scanAnnotation(String packName){
+        try {
+            initService.clearAllCache();
+            initService.initServerCache();
+            List<String> packageList = WebUtil.str2List(packName);
+            List<String> entityList = new ArrayList();
+            List<String> unScanEntityList = new ArrayList<String>();
+            scanAnnotationTool.doScanAnnotation2OSServer(packageList, entityList,unScanEntityList);
+            initService.clearAllCache();
+            initService.initServerCache();
+        }catch (Throwable e){
+            return BaseResult.fail(LangBaseUtil.getErrorMsg(e));
+        }
+        return BaseResult.success();
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebUIController.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebUIController.java
new file mode 100644
index 0000000..04b1109
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebUIController.java
@@ -0,0 +1,83 @@
+package com.vci.web.controller;
+
+import com.vci.starter.web.annotation.log.VciBusinessLog;
+import com.vci.starter.web.pagemodel.BaseResult;
+import com.vci.web.pageModel.UIContentVO;
+import com.vci.web.pageModel.UIFormDefineVO;
+import com.vci.web.pageModel.UITableDefineVO;
+import com.vci.web.service.UIEngineServiceI;
+import com.vci.web.service.impl.WebInitServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 鐣岄潰鎺у埗鍣�
+ * @author weidy
+ * @date 2021-3-1
+ */
+@VciBusinessLog(modelName="鐣岄潰鎺у埗鍣�",notStore=true)
+@RestController
+@RequestMapping("/webUIController")
+public class WebUIController {
+
+	/**
+	 * 鐣岄潰鐨勬湇鍔�
+	 */
+	@Autowired
+	private UIEngineServiceI uiService;
+
+	/**
+	 * 鍒濆鍖�
+	 */
+	@Autowired
+	private WebInitServiceImpl initService;
+
+	/**
+	 * 鑾峰彇UI涓婁笅鏂囩殑瀹氫箟
+	 * @param btmType 涓氬姟绫诲瀷
+	 * @param id 缂栧彿
+	 * @return UI涓婁笅鏂�
+	 */
+	@GetMapping("/getUIContentByBtmTypeAndId")
+	public UIContentVO getUIContentByBtmTypeAndId(String btmType,String id){
+		return uiService.getUIContentByBtmTypeAndId(btmType,id);
+	}
+
+	/**
+	 * 浣跨敤琛ㄥ崟鐨勭紪鍙疯幏鍙栧畾涔夌殑瀵硅薄
+	 * @param btmType 涓氬姟绫诲瀷
+	 * @param id 琛ㄥ崟鐨勭紪鍙�
+	 * @return 琛ㄥ崟鐨勫畾涔�
+	 */
+	@GetMapping("/getFormDefineById")
+	public UIFormDefineVO getFormDefineById(String btmType,String id){
+		return uiService.getFormById(btmType,id);
+	}
+
+	/**
+	 * 浣跨敤琛ㄦ牸鐨勭紪鍙疯幏鍙栧畾涔夌殑瀵硅薄
+	 * @param btmType 涓氬姟绫诲瀷
+	 * @param id 琛ㄥ崟鐨勭紪鍙�
+	 * @return 琛ㄥ崟鐨勫畾涔�
+	 */
+	@GetMapping("/getTableDefineById")
+	public UITableDefineVO getTableDefineById(String btmType,String id){
+		return uiService.getTableById(btmType,id);
+	}
+
+	/**
+	 * 娓呴櫎缂撳瓨
+	 * @return 鎵ц缁撴灉
+	 */
+	@GetMapping("/clearCache")
+	public BaseResult clearCache(){
+		//鏈嶅姟绔偅涓紝涓�瑷�闅惧敖
+		initService.clearAllCache();
+		initService.initServerCache();
+		return BaseResult.success();
+	}
+	
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebUIDataController.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebUIDataController.java
new file mode 100644
index 0000000..9e8b57d
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebUIDataController.java
@@ -0,0 +1,188 @@
+package com.vci.web.controller;
+
+import com.vci.starter.web.annotation.log.VciBusinessLog;
+import com.vci.starter.web.pagemodel.*;
+import com.vci.web.dto.*;
+import com.vci.web.pageModel.ReferConfigVO;
+import com.vci.web.pageModel.UIFormDataVO;
+import com.vci.web.query.UIDataGridQuery;
+import com.vci.web.query.UIFormQuery;
+import com.vci.web.query.UITreeQuery;
+import com.vci.web.query.UITreeRootQuery;
+import com.vci.web.service.UIDataServiceI;
+import org.omg.CORBA.PUBLIC_MEMBER;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.bind.annotation.*;
+import plm.bs.bom.clientobject.ClientBusinessObject;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * ui瀹氫箟鐨勬暟鎹煡璇�
+ * @author weidy
+ * @date 2021/3/3
+ */
+@RestController
+@RequestMapping("/uiDataController")
+@VciBusinessLog(modelName="UI涓婁笅鏂�")
+public class WebUIDataController {
+
+    /**
+     * 鐣岄潰鐨勬暟鎹湇鍔�
+     */
+    @Autowired
+    private UIDataServiceI uiDataService;
+
+    /**
+     * 鍒楄〃鏌ヨ
+     * @param dataGridQuery 鏌ヨ瀵硅薄
+     * @return 鍒楄〃鏁版嵁
+     */
+    @PostMapping("/dataGridQuery")
+    @VciBusinessLog(operateName = "鍒楄〃鏁版嵁鐨勬煡璇�",description = "${param.btmname}閲岀殑${param.tableDefineId}")
+    public DataGrid dataGrid(UIDataGridQuery dataGridQuery){
+        return uiDataService.getDataForGrid(dataGridQuery);
+    }
+
+    /**
+     * 琛ㄥ崟鐨勬暟鎹煡璇�
+     * @param formQuery 琛ㄥ崟鏌ヨ瀵硅薄
+     * @return 琛ㄥ崟鐨勬暟鎹�
+     */
+    @PostMapping("/dataFormQuery")
+    @VciBusinessLog(operateName = "琛ㄥ崟鐨勬煡璇�",description = "${param.btmname}閲岀殑${param.formDefineId}")
+    public BaseResult<UIFormDataVO> getDataForForm(UIFormQuery formQuery){
+        return BaseResult.success(uiDataService.getDataForForm(formQuery));
+    }
+
+    /**
+     * 鏍戠殑鏁版嵁鏌ヨ
+     * @param treeQuery 鏍戞煡璇㈠璞�
+     * @return 鏍戠殑鏁版嵁
+     */
+    @PostMapping("/getDataForTree")
+    @VciBusinessLog(operateName = "鏍戠殑鏌ヨ",description = "${param.btmname}")
+    public List<Tree> getDataForTree(UITreeQuery treeQuery){
+        return uiDataService.getDataForTree(treeQuery);
+    }
+
+    /**
+     * 娣诲姞鏁版嵁銆傚墠绔娇鐢↗SON鎻愪氦
+     * @param formDataDTO 琛ㄥ崟
+     * @return 鎵ц鐨勭粨鏋�
+     */
+    @PostMapping("/addSave")
+    @VciBusinessLog(operateName = "娣诲姞鏁版嵁",description = "${param.btmname}")
+    public BaseResult<Map<String,Object>> addSave(@RequestBody FormDataDTO formDataDTO){
+        return uiDataService.addSave(formDataDTO);
+    }
+
+    /**
+     * 娣诲姞閾炬帴绫诲瀷鏁版嵁銆傚墠绔娇鐢↗SON鎻愪氦
+     * @param formLinkDataDTO 琛ㄥ崟鏁版嵁
+     * @return 鎵ц鐨勭粨鏋�
+     */
+    @PostMapping("/linkAddSave")
+    @VciBusinessLog(operateName = "娣诲姞閾炬帴鏁版嵁",description = "${param.linkType}")
+    public BaseResult<String> linkAddSave(@RequestBody FormLinkDataDTO formLinkDataDTO){
+        return uiDataService.linkAddSave(formLinkDataDTO);
+    }
+
+    /**
+     * 淇敼鏁版嵁锛屽墠绔娇鐢↗SON鎻愪氦
+     * @param formDataDTO 琛ㄥ崟
+     * @return 鎵ц鐨勭粨鏋�
+     */
+    @PutMapping("/editSave")
+    @VciBusinessLog(operateName = "淇敼鏁版嵁",description = "${param.btmname}閲岀殑${param.oid}")
+    public BaseResult<Map<String,Object>> editSave(@RequestBody FormDataDTO formDataDTO){
+        return uiDataService.editSave(formDataDTO);
+    }
+
+    /**
+     * 淇敼閾炬帴绫诲瀷鐨勬暟鎹紝鍓嶇浣跨敤JSON鎻愪氦
+     * @param formLinkDataDTO 琛ㄥ崟鐨勬暟鎹璞�
+     * @return 鎵ц缁撴灉
+     */
+    @VciBusinessLog(operateName = "淇敼閾炬帴绫诲瀷鏁版嵁",description = "${param.linkType}閲岀殑${param.oid}")
+    @PutMapping("/linkEditSave")
+    public BaseResult linkEditSave(@RequestBody FormLinkDataDTO formLinkDataDTO){
+        return uiDataService.linkEditSave(formLinkDataDTO);
+    }
+
+    /**
+     * 鏁版嵁鍗囩増锛屽墠绔娇鐢↗SON鎻愪氦
+     * @param formDataDTO 琛ㄥ崟鏁版嵁
+     * @return 鎵ц鐨勭粨鏋�
+     */
+    @PutMapping("/upRevision")
+    @VciBusinessLog(operateName = "鏁版嵁鍗囩増",description = "${param.btmname}閲岀殑${param.copyFromVersion}")
+    public BaseResult<Map<String,Object>> upRevision(@RequestBody FormDataDTO formDataDTO){
+        return uiDataService.upRevision(formDataDTO);
+    }
+
+    /**
+     * 鍒犻櫎鏁版嵁
+     * @param deleteDataDTO 鍒犻櫎鐨勬暟鎹紝闇�瑕佹湁oid鍜宼s
+     * @return 鎵ц鐨勭粨鏋�
+     */
+    @DeleteMapping("/deleteData")
+    @VciBusinessLog(operateName = "鍒犻櫎鏁版嵁",description = "${param.dataList.0.btmname}鐨�${param.dataList.${join}.oid}")
+    public BaseResult deleteData(@RequestBody DeleteDataDTO deleteDataDTO){
+        return uiDataService.batchDelete(deleteDataDTO);
+    }
+
+    /**
+     * 鍒犻櫎閾炬帴绫诲瀷鏁版嵁
+     * @param deleteLinkDataDTO 鍒犻櫎鐨勬暟鎹�
+     * @return 鎵ц鐨勭粨鏋�
+     */
+    @DeleteMapping("/linkDeleteData")
+    @VciBusinessLog(operateName = "鍒犻櫎鏁版嵁",description = "${param.dataList.0.linkType}鐨�${param.dataList.${join}.oid}")
+    public BaseResult linkDeleteData(@RequestBody DeleteLinkDataDTO deleteLinkDataDTO){
+        return uiDataService.batchLinkDelete(deleteLinkDataDTO);
+    }
+
+    /**
+     * 榛樿鐨勫弬鐓у垪琛�
+     * @param referConfigVO 鍙傜収鐨勯厤缃俊鎭�
+     * @return 鎵ц鐨勭粨鏋�
+     */
+    @GetMapping("/defaultReferDataGrid")
+    @VciBusinessLog(operateName = "鑾峰彇鍙傜収鐨勫垪琛ㄦ暟鎹�",description = "")
+    public DataGrid defaultReferDataGrid(ReferConfigVO referConfigVO,PageHelper pageHelper){
+        return uiDataService.referDataGrid(referConfigVO,pageHelper);
+    }
+
+    /**
+     * 榛樿鐨勬爲褰㈠弬鐓у垪琛�
+     * @param referConfigVO 鍙傜収鐨勯厤缃俊鎭�
+     * @return 鎵ц鐨勭粨鏋�
+     */
+    @VciBusinessLog(operateName = "鑾峰彇鍙傜収鐨勬爲褰㈡暟鎹�",description = "")
+    @GetMapping("/defaultReferTree")
+    public List<Tree> defaultReferTree(ReferConfigVO referConfigVO){
+        return uiDataService.referTree(referConfigVO);
+    }
+
+    /**
+     * 琛ㄥ崟鐨勬暟鎹煡璇�
+     * @param btmname 涓氬姟绫诲瀷鐨勪俊鎭�
+     * @param oid 涓氬姟鏁版嵁鐨勪富閿�
+     * @return 涓氬姟鏁版嵁鐨勫睘鎬т俊鎭�
+     */
+    @GetMapping("/getDataAttr")
+    @VciBusinessLog(operateName = "鑾峰彇褰撳墠涓氬姟鏁版嵁鐨勫叏閮ㄥ睘鎬�",description = "")
+    public BaseResult getDataAttr(String btmname , String oid){
+        List<Map<String,String>> dataMapList = uiDataService.getDataAttr(btmname, oid);
+        if (CollectionUtils.isEmpty(dataMapList)){
+            return BaseResult.fail("鏌ヨ鏁版嵁涓虹┖");
+        }
+        BaseResult re = BaseResult.success();
+        re.setData(dataMapList);
+        return re;
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/BdSelectInputCharDaoI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/BdSelectInputCharDaoI.java
new file mode 100644
index 0000000..17f2970
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/BdSelectInputCharDaoI.java
@@ -0,0 +1,127 @@
+package com.vci.web.dao;
+
+import com.vci.web.model.BdSelectInputCharDO;
+
+import com.vci.starter.web.pagemodel.*;
+import com.vci.starter.web.wrapper.VciQueryWrapperForDO;
+import com.vci.web.pageModel.BatchCBO;
+
+import java.util.Collection;
+import java.util.*;
+
+/**
+ * 鍙緭鍙�夊唴瀹规暟鎹搷浣滃眰
+ * 
+ * @author weidy
+ * @date 2022-03-09
+ */
+public interface  BdSelectInputCharDaoI {
+
+	/**
+     * 浣跨敤涓婚敭鍒犻櫎
+     * @param oid 鏁版嵁涓婚敭
+     * @return 鎵ц缁撴灉
+     */
+	BatchCBO deleteByPrimaryKey(String oid);
+
+	/**
+     * 娣诲姞鏁版嵁
+     * @param record 鍙緭鍙�夊唴瀹规暟鎹璞�
+     * @return 鎵ц缁撴灉
+     */
+	BatchCBO insert(BdSelectInputCharDO record);
+
+	/**
+	* 鎵归噺娣诲姞鏁版嵁
+	* @param records 鍙緭鍙�夊唴瀹规暟鎹璞¢泦鍚�
+	* @return 鎵ц缁撴灉鏁�
+	*/
+	BatchCBO batchInsert(List<BdSelectInputCharDO> records);
+
+	/**
+     * 鏍规嵁涓婚敭鏌ヨ
+     * @param oid 鏁版嵁涓婚敭
+     * @return 鏁版嵁瀵硅薄
+     */
+	BdSelectInputCharDO selectByPrimaryKey(String oid);
+
+	/**
+     * 鏍规嵁涓婚敭鎵归噺鑾峰彇瀵硅薄
+     * @param oids 涓婚敭锛屽寘鍚崟寮曞彿,浣嗘槸涓嶈兘瓒呰繃1000
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+	List<BdSelectInputCharDO> selectByPrimaryKeys(String oids);
+
+	/**
+     * 鏍规嵁涓婚敭鎵归噺鏌ヨ瀵硅薄
+     * @param oids 瀵硅薄涓婚敭,浣跨敤閫楀彿鍒嗛殧锛屼絾鏄笉鑳借秴杩�1000
+     * @return 涓氬姟瀵硅薄
+     */
+	List<BdSelectInputCharDO> selectByPrimaryKeyCollection(Collection<String> oids);
+
+	/**
+     * 鏌ヨ鎵�鏈夊垎绫�
+     * @return 鏌ヨ缁撴灉
+     */
+	List<BdSelectInputCharDO> selectAll();
+
+	/**
+     * 鏇存柊瀵硅薄
+     * @param record 鍙緭鍙�夊唴瀹规暟鎹璞�
+     * @return 鎵ц缁撴灉
+     */
+	BatchCBO updateByPrimaryKey(BdSelectInputCharDO record);
+
+	/**
+	* 鎵归噺鏇存柊
+	* @param records 鍙緭鍙�夊唴瀹规暟鎹璞¢泦鍚�
+	* @return 鎵ц缁撴灉琛屾暟
+	*/
+	BatchCBO batchUpdate(List<BdSelectInputCharDO> records);
+
+	/**
+     * 鏍规嵁鏌ヨ鏉′欢鏌ヨ鏁版嵁
+     * @param conditionMap 鏌ヨ鏉′欢锛�
+     * @param pageHelper 鍖呮嫭鍒嗛〉锛屾帓搴�
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+	List<BdSelectInputCharDO> selectByCondition(Map<String,String> conditionMap, PageHelper pageHelper);
+
+	/**
+     * 鏍规嵁鏌ヨ鏉′欢鏉ユ煡璇㈡�绘暟
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @return 鎬绘暟
+     */
+	Long countByCondition(Map<String,String> conditionMap);
+
+	/**
+     * 浣跨敤鏌ヨ灏佽鍣ㄦ潵鏌ヨ
+     * @param queryWrapper 鏌ヨ灏佽鍣�
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+	List<BdSelectInputCharDO> selectByWrapper(VciQueryWrapperForDO queryWrapper);
+
+	/**
+     * 鏍规嵁鏌ヨ灏佽鍣ㄦ潵鏌ヨ鎬绘暟
+     * @param queryWrapper 鏌ヨ灏佽鍣�
+     * @return 鎬绘暟
+     */
+	Long countByWrapper(VciQueryWrapperForDO queryWrapper);
+
+	/**
+     * 鏍规嵁涓婚敭鑾峰彇鍚嶇О
+     * @param oid 涓婚敭
+     * @return 涓枃鍚嶇О
+     */
+	String selectNameByOid(String oid);
+
+
+
+	/**
+     * 鎵归噺鍒犻櫎瀵硅薄
+     * @param oids 瀵硅薄鐨勪富閿泦鍚�
+     * @return 鍙楀奖鍝嶇殑琛屾暟
+     */
+	BatchCBO batchDeleteByOids(Collection<String> oids);
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/OsCodeBreakCodeDaoI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/OsCodeBreakCodeDaoI.java
new file mode 100644
index 0000000..2757cd2
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/OsCodeBreakCodeDaoI.java
@@ -0,0 +1,101 @@
+package com.vci.web.dao;
+
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.web.model.OsCodeBreakCodeDO;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 鏂爜鍐呭鏁版嵁鎿嶄綔灞�
+ * 
+ * @author weidy
+ * @date 2020-09-01
+ */
+public interface OsCodeBreakCodeDaoI {
+
+	/**
+     * 浣跨敤涓婚敭鍒犻櫎
+     * @param oid 鏁版嵁涓婚敭
+     * @return 鎵ц缁撴灉
+     */
+	int deleteByPrimaryKey(String oid);
+
+	/**
+     * 娣诲姞鏁版嵁
+     * @param record 鏂爜鍐呭鏁版嵁瀵硅薄
+     * @return 鎵ц缁撴灉
+     */
+	int insert(OsCodeBreakCodeDO record);
+
+	/**
+     * 鏍规嵁涓婚敭鏌ヨ
+     * @param oid 鏁版嵁涓婚敭
+     * @return 鏁版嵁瀵硅薄
+     */
+	OsCodeBreakCodeDO selectByPrimaryKey(String oid);
+
+	/**
+     * 鏍规嵁涓婚敭鎵归噺鑾峰彇瀵硅薄
+     * @param oids 涓婚敭锛屽寘鍚崟寮曞彿,浣嗘槸涓嶈兘瓒呰繃1000
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+	List<OsCodeBreakCodeDO> selectByPrimaryKeys(String oids);
+
+	/**
+     * 鏍规嵁涓婚敭鎵归噺鏌ヨ瀵硅薄
+     * @param oids 瀵硅薄涓婚敭,浣跨敤閫楀彿鍒嗛殧锛屼絾鏄笉鑳借秴杩�1000
+     * @return 涓氬姟瀵硅薄
+     */
+	List<OsCodeBreakCodeDO> selectByPrimaryKeyCollection(Collection<String> oids);
+
+	/**
+     * 鏌ヨ鎵�鏈夊垎绫�
+     * @return 鏌ヨ缁撴灉
+     */
+	List<OsCodeBreakCodeDO> selectAll();
+
+	/**
+     * 鏇存柊鐗╂枡銆佸伐鍏峰熀鏈垎绫�
+     * @param record 鐗╂枡銆佸伐鍏峰熀鏈垎绫绘暟鎹璞�
+     * @return 鎵ц缁撴灉
+     */
+	int updateByPrimaryKey(OsCodeBreakCodeDO record);
+
+	/**
+     * 鏍规嵁鏌ヨ鏉′欢鏌ヨ鏁版嵁
+     * @param condition 鏌ヨ鏉′欢锛屽寘鎷垎椤碉紝鎺掑簭
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+	List<OsCodeBreakCodeDO> selectByCondition(Map<String,String> condition, PageHelper pageHelper);
+
+	/**
+     * 鏍规嵁鏌ヨ鏉′欢鏉ユ煡璇㈡�绘暟
+     * @param condition 鏌ヨ鏉′欢
+     * @return 鎬绘暟
+     */
+	Long countByCondition(Map<String,String> condition);
+
+	/**
+     * 鏍规嵁涓婚敭鑾峰彇鍚嶇О
+     * @param oid 涓婚敭
+     * @return 涓枃鍚嶇О
+     */
+	String selectNameByOid(String oid);
+
+	/**
+     * 鎵归噺鍒犻櫎瀵硅薄
+     * @param oids 瀵硅薄鐨勪富閿泦鍚�
+     * @return 鍙楀奖鍝嶇殑琛屾暟
+     */
+	long batchDeleteByOids(Collection<String> oids);
+
+	/**
+	 * 鏌ヨ鏂爜鐨勫��
+	 * @param ruleOid 缂栫爜瑙勫垯涓婚敭
+	 * @param serialAccord 娴佹按渚濇嵁
+	 * @return 鏂爜鐨勫�硷紝鍙栫涓�涓�
+	 */
+	OsCodeBreakCodeDO selectByAccordingAndRuleOid(String ruleOid, String serialAccord);
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/OsCodeEnumDaoI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/OsCodeEnumDaoI.java
new file mode 100644
index 0000000..9961da0
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/OsCodeEnumDaoI.java
@@ -0,0 +1,121 @@
+package com.vci.web.dao;
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.web.model.OsCodeEnumDO;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 缂栫爜涓殑鏋氫妇鏄犲皠鏁版嵁鎿嶄綔灞�
+ * 
+ * @author weidy
+ * @date 2020-09-01
+ */
+public interface OsCodeEnumDaoI {
+
+	/**
+     * 浣跨敤涓婚敭鍒犻櫎
+     * @param oid 鏁版嵁涓婚敭
+     * @return 鎵ц缁撴灉
+     */
+	int deleteByPrimaryKey(String oid);
+
+	/**
+     * 娣诲姞鏁版嵁
+     * @param record 缂栫爜涓殑鏋氫妇鏄犲皠鏁版嵁瀵硅薄
+     * @return 鎵ц缁撴灉
+     */
+	int insert(OsCodeEnumDO record);
+
+	/**
+     * 鏍规嵁涓婚敭鏌ヨ
+     * @param oid 鏁版嵁涓婚敭
+     * @return 鏁版嵁瀵硅薄
+     */
+	OsCodeEnumDO selectByPrimaryKey(String oid);
+
+	/**
+     * 鏍规嵁涓婚敭鎵归噺鑾峰彇瀵硅薄
+     * @param oids 涓婚敭锛屽寘鍚崟寮曞彿,浣嗘槸涓嶈兘瓒呰繃1000
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+	List<OsCodeEnumDO> selectByPrimaryKeys(String oids);
+
+	/**
+     * 鏍规嵁涓婚敭鎵归噺鏌ヨ瀵硅薄
+     * @param oids 瀵硅薄涓婚敭,浣跨敤閫楀彿鍒嗛殧锛屼絾鏄笉鑳借秴杩�1000
+     * @return 涓氬姟瀵硅薄
+     */
+	List<OsCodeEnumDO> selectByPrimaryKeyCollection(Collection<String> oids);
+
+	/**
+     * 鏌ヨ鎵�鏈夊垎绫�
+     * @return 鏌ヨ缁撴灉
+     */
+	List<OsCodeEnumDO> selectAll();
+
+	/**
+     * 鏇存柊鐗╂枡銆佸伐鍏峰熀鏈垎绫�
+     * @param record 鐗╂枡銆佸伐鍏峰熀鏈垎绫绘暟鎹璞�
+     * @return 鎵ц缁撴灉
+     */
+	int updateByPrimaryKey(OsCodeEnumDO record);
+
+	/**
+     * 鏍规嵁鏌ヨ鏉′欢鏌ヨ鏁版嵁
+     * @param condition 鏌ヨ鏉′欢锛屽寘鎷垎椤碉紝鎺掑簭
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+	List<OsCodeEnumDO> selectByWrapper(Map<String,String> condition, PageHelper pageHelper);
+
+	/**
+     * 鏍规嵁鏌ヨ鏉′欢鏉ユ煡璇㈡�绘暟
+     * @param condition 鏌ヨ鏉′欢
+     * @return 鎬绘暟
+     */
+	Long countByWrapper(Map<String,String> condition);
+
+	/**
+     * 鏍规嵁涓婚敭鑾峰彇鍚嶇О
+     * @param oid 涓婚敭
+     * @return 涓枃鍚嶇О
+     */
+	String selectNameByOid(String oid);
+
+	/**
+     * 鎵归噺鍒犻櫎瀵硅薄
+     * @param oids 瀵硅薄鐨勪富閿泦鍚�
+     * @return 鍙楀奖鍝嶇殑琛屾暟
+     */
+	long batchDeleteByOids(Collection<String> oids);
+
+	/**
+	 * 鑾峰彇鏋氫妇鐨勬槧灏勭殑鍊�
+	 * @param ruleElementOid 缂栫爜瑙勫垯鍏冪礌鐨勪富閿�
+	 * @param enumValue 鏋氫妇鐨勫��
+	 * @return 鏌ヨ鏋氫妇鐨勬槧灏勭殑鍊�
+	 */
+	String selectMapValueByRuleOidAndValue( String ruleElementOid, String enumValue);
+
+	/**
+	 * 鎵归噺鎻掑叆鏋氫妇鐨勬槧灏�
+	 * @param enumDOs 鏄犲皠鍐呭
+	 * @return 鎴愬姛鏉℃暟
+	 */
+    int batchInsert(List<OsCodeEnumDO> enumDOs);
+
+	/**
+	 * 浣跨敤瑙勫垯鏌ヨ
+	 * @param ruleOid 瑙勫垯鐨勪富閿殑鍐呭
+	 * @return 鏋氫妇鏄犲皠淇℃伅
+	 */
+	List<OsCodeEnumDO> selectByRuleOid(String ruleOid);
+
+	/**
+	 * 鏍规嵁鍏冪礌鐨勪富閿幏鍙栨灇涓炬槧灏勭殑淇℃伅
+	 * @param oidList 鍏冪礌涓婚敭鐨勫垪琛�
+	 * @return 鏋氫妇鏄犲皠鐨勪俊鎭�
+	 */
+    List<OsCodeEnumDO> selectByElementOidCollection(Collection<String> oidList);
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/OsCodeGenSchemaDaoI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/OsCodeGenSchemaDaoI.java
new file mode 100644
index 0000000..cf99f21
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/OsCodeGenSchemaDaoI.java
@@ -0,0 +1,64 @@
+package com.vci.web.dao;
+
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.web.model.OsCodeGenSchemaDO;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 浠g爜鐢熸垚鍣ㄧ殑鏁版嵁鎿嶄綔灞�
+ * @author weidy
+ * @date 2021-08-22
+ */
+public interface OsCodeGenSchemaDaoI {
+    /**
+     * 浣跨敤涓婚敭鍒犻櫎
+     * @param oid 涓婚敭
+     * @return 鍙楀奖鍝嶇殑涓暟
+     */
+    int deleteByPrimaryKey(String oid);
+
+    /**
+     * 鎻掑叆鏁版嵁
+     * @param record 鏁版嵁鐨勫璞�
+     * @return 鍙楀奖鍝嶇殑涓暟
+     */
+    int insert(OsCodeGenSchemaDO record);
+
+    /**
+     * 浣跨敤涓婚敭鏌ヨ
+     * @param oid 涓婚敭
+     * @return 鏁版嵁瀵硅薄
+     */
+    OsCodeGenSchemaDO selectByPrimaryKey(String oid);
+
+    /**
+     * 鏌ヨ鍏ㄩ儴
+     * @return 鏁版嵁瀵硅薄
+     */
+    List<OsCodeGenSchemaDO> selectAll();
+
+    /**
+     * 浣跨敤涓婚敭鏇存柊
+     * @param record 鏁版嵁瀵硅薄
+     * @return 鍙楀奖鍝嶇殑琛屾暟
+     */
+    int updateByPrimaryKey(OsCodeGenSchemaDO record);
+
+    /**
+     * 鏍规嵁鏌ヨ鏉′欢鏌ヨ鏁版嵁
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉瀵硅薄
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+    List<OsCodeGenSchemaDO> selectByWrapper(Map<String,String> conditionMap, PageHelper pageHelper);
+
+    /**
+     * 鏍规嵁鏌ヨ鏉′欢鏉ユ煡璇㈡�绘暟
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @return 鎬绘暟
+     */
+    Integer countByWrapper(Map<String,String> conditionMap);
+
+}
\ No newline at end of file
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/OsCodeRuleDaoI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/OsCodeRuleDaoI.java
new file mode 100644
index 0000000..45ebae6
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/OsCodeRuleDaoI.java
@@ -0,0 +1,125 @@
+package com.vci.web.dao;
+
+
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.web.model.OsCodeRuleDO;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 缂栫爜瑙勫垯鏁版嵁鎿嶄綔灞�
+ * 
+ * @author weidy
+ * @date 2020-09-01
+ */
+public interface OsCodeRuleDaoI {
+
+	/**
+     * 浣跨敤涓婚敭鍒犻櫎
+     * @param oid 鏁版嵁涓婚敭
+     * @return 鎵ц缁撴灉
+     */
+	int deleteByPrimaryKey(String oid);
+
+	/**
+     * 娣诲姞鏁版嵁
+     * @param record 缂栫爜瑙勫垯鏁版嵁瀵硅薄
+     * @return 鎵ц缁撴灉
+     */
+	int insert(OsCodeRuleDO record);
+
+	/**
+     * 鏍规嵁涓婚敭鏌ヨ
+     * @param oid 鏁版嵁涓婚敭
+     * @return 鏁版嵁瀵硅薄
+     */
+	OsCodeRuleDO selectByPrimaryKey(String oid);
+
+	/**
+     * 鏍规嵁涓婚敭鎵归噺鑾峰彇瀵硅薄
+     * @param oids 涓婚敭锛屽寘鍚崟寮曞彿,浣嗘槸涓嶈兘瓒呰繃1000
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+	List<OsCodeRuleDO> selectByPrimaryKeys(String oids);
+
+	/**
+     * 鏍规嵁涓婚敭鎵归噺鏌ヨ瀵硅薄
+     * @param oids 瀵硅薄涓婚敭,浣跨敤閫楀彿鍒嗛殧锛屼絾鏄笉鑳借秴杩�1000
+     * @return 涓氬姟瀵硅薄
+     */
+	List<OsCodeRuleDO> selectByPrimaryKeyCollection(Collection<String> oids);
+
+	/**
+     * 鏌ヨ鎵�鏈夊垎绫�
+     * @return 鏌ヨ缁撴灉
+     */
+	List<OsCodeRuleDO> selectAll();
+
+	/**
+     * 鏇存柊鐗╂枡銆佸伐鍏峰熀鏈垎绫�
+     * @param record 鐗╂枡銆佸伐鍏峰熀鏈垎绫绘暟鎹璞�
+     * @return 鎵ц缁撴灉
+     */
+	int updateByPrimaryKey(OsCodeRuleDO record);
+
+	/**
+     * 鏍规嵁鏌ヨ鏉′欢鏌ヨ鏁版嵁
+     * @param condition 鏌ヨ鏉′欢锛屽寘鎷垎椤碉紝鎺掑簭
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+	List<OsCodeRuleDO> selectByWrapper(Map<String,String> condition, PageHelper pageHelper);
+
+	/**
+     * 鏍规嵁鏌ヨ鏉′欢鏉ユ煡璇㈡�绘暟
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @return 鎬绘暟
+     */
+	String countByWrapper(Map<String, String> conditionMap);
+
+	/**
+     * 鏍规嵁涓婚敭鑾峰彇鍚嶇О
+     * @param oid 涓婚敭
+     * @return 涓枃鍚嶇О
+     */
+	String selectNameByOid(String oid);
+
+
+	/**
+	 * 鎵归噺淇敼鐢熷懡鍛ㄦ湡鐨勭姸鎬�
+	 * @param oids 涓婚敭闆嗗悎锛屼笉鑳藉ぇ浜�1000
+	 * @param lcStatus 鐢熷懡鍛ㄦ湡鐨勫��
+	 * @return 鎵ц鐨勭粨鏋�
+	 */
+	long batchUpdateLcStatus(Collection<String> oids, String lcStatus);
+	/**
+	 * 鏍规嵁涓婚敭鏇存柊鐘舵��
+	 * @param oid 涓婚敭
+	 * @param lcStatus 鐢熷懡鍛ㄦ湡鐘舵��
+	 * @return 鍙楀奖鍝嶇殑琛屾暟
+	 */
+	int updateLcStatus(String oid, String lcStatus);
+
+	/**
+     * 鎵归噺鍒犻櫎瀵硅薄
+     * @param oids 瀵硅薄鐨勪富閿泦鍚�
+     * @return 鍙楀奖鍝嶇殑琛屾暟
+     */
+	long batchDeleteByOids(Collection<String> oids);
+
+	/**
+	 * 浣跨敤缂栧彿鏌ヨ
+	 * @param id 缂栧彿
+	 * @return 鏁版嵁瀵硅薄
+	 */
+	OsCodeRuleDO selectById(String id);
+
+	/**
+	 * 浣跨敤瑙勫垯鐨勬爣璇嗘煡璇�
+	 * @param ownbizBtm 涓氬姟绫诲瀷
+	 * @param useRuleFlag 瑙勫垯鐨勬爣璇�
+	 * @return 鏁版嵁瀵硅薄
+	 */
+    OsCodeRuleDO selectByRuleFlag( String ownbizBtm, String useRuleFlag);
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/OsCodeRuleElementDaoI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/OsCodeRuleElementDaoI.java
new file mode 100644
index 0000000..e5d71cc
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/OsCodeRuleElementDaoI.java
@@ -0,0 +1,125 @@
+package com.vci.web.dao;
+
+
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.web.model.OsCodeRuleElementDO;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 缂栫爜瑙勫垯鏄庣粏鏁版嵁鎿嶄綔灞�
+ * 
+ * @author weidy
+ * @date 2020-09-01
+ */
+public interface OsCodeRuleElementDaoI {
+
+	/**
+     * 浣跨敤涓婚敭鍒犻櫎
+     * @param oid 鏁版嵁涓婚敭
+     * @return 鎵ц缁撴灉
+     */
+	int deleteByPrimaryKey(String oid);
+
+	/**
+     * 娣诲姞鏁版嵁
+     * @param record 缂栫爜瑙勫垯鏄庣粏鏁版嵁瀵硅薄
+     * @return 鎵ц缁撴灉
+     */
+	int insert(OsCodeRuleElementDO record);
+
+	/**
+     * 鏍规嵁涓婚敭鏌ヨ
+     * @param oid 鏁版嵁涓婚敭
+     * @return 鏁版嵁瀵硅薄
+     */
+	OsCodeRuleElementDO selectByPrimaryKey(String oid);
+
+	/**
+     * 鏍规嵁涓婚敭鎵归噺鑾峰彇瀵硅薄
+     * @param oids 涓婚敭锛屽寘鍚崟寮曞彿,浣嗘槸涓嶈兘瓒呰繃1000
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+	List<OsCodeRuleElementDO> selectByPrimaryKeys(String oids);
+
+	/**
+     * 鏍规嵁涓婚敭鎵归噺鏌ヨ瀵硅薄
+     * @param oids 瀵硅薄涓婚敭,浣跨敤閫楀彿鍒嗛殧锛屼絾鏄笉鑳借秴杩�1000
+     * @return 涓氬姟瀵硅薄
+     */
+	List<OsCodeRuleElementDO> selectByPrimaryKeyCollection(Collection<String> oids);
+
+	/**
+     * 鏌ヨ鎵�鏈夊垎绫�
+     * @return 鏌ヨ缁撴灉
+     */
+	List<OsCodeRuleElementDO> selectAll();
+
+	/**
+     * 鏇存柊鐗╂枡銆佸伐鍏峰熀鏈垎绫�
+     * @param record 鐗╂枡銆佸伐鍏峰熀鏈垎绫绘暟鎹璞�
+     * @return 鎵ц缁撴灉
+     */
+	int updateByPrimaryKey(OsCodeRuleElementDO record);
+
+	/**
+     * 鏍规嵁鏌ヨ鏉′欢鏌ヨ鏁版嵁
+     * @param condition 鏌ヨ鏉′欢锛屽寘鎷垎椤碉紝鎺掑簭
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+	List<OsCodeRuleElementDO> selectByWrapper(Map<String,String> condition, PageHelper pageHelper);
+
+	/**
+     * 鏍规嵁鏌ヨ鏉′欢鏉ユ煡璇㈡�绘暟
+     * @param condition 鏌ヨ鏉′欢
+     * @return 鎬绘暟
+     */
+	String countByWrapper(Map<String,String> condition);
+
+	/**
+     * 鏍规嵁涓婚敭鑾峰彇鍚嶇О
+     * @param oid 涓婚敭
+     * @return 涓枃鍚嶇О
+     */
+	String selectNameByOid(String oid);
+
+
+
+	/**
+     * 鎵归噺鍒犻櫎瀵硅薄
+     * @param oids 瀵硅薄鐨勪富閿泦鍚�
+     * @return 鍙楀嵃璞$殑琛屾暟
+     */
+	long batchDeleteByOids(Collection<String> oids);
+
+	/**
+	 * 浣跨敤瑙勫垯鏌ヨ鏄庣粏锛屼細鎸夌収搴忓彿鎺掑簭
+	 * @param ruleOid 瑙勫垯鐨勪富閿�
+	 * @return 鏄庣粏鏁版嵁瀵硅薄
+	 */
+	List<OsCodeRuleElementDO> selectByRuleOid(String ruleOid);
+
+	/**
+	 * 鎵归噺娣诲姞
+	 * @param elementDOS 鍏冪礌鐨勬暟鎹璞�
+	 * @return 鍙楀奖鍝嶇殑琛屾暟
+	 */
+    int batchInsert(List<OsCodeRuleElementDO> elementDOS);
+
+	/**
+	 * 浣跨敤缂栫爜瑙勫垯鍜屾帓搴忓彿鑾峰彇
+	 * @param pkCodeRule 瑙勫垯
+	 * @param orderIndex 鎺掑簭鍙�
+	 * @return 鍐呭
+	 */
+    List<OsCodeRuleElementDO> selectByRuleOidAndIndex(String pkCodeRule, int orderIndex);
+
+	/**
+	 * 浣跨敤缂栫爜瑙勫垯鑾峰彇鏄庣粏瀵硅薄骞舵寜鐓ф帓搴忓彿杩涜鎺掑簭
+	 * @param ruleOid 瑙勫垯鐨勫唴瀹�
+	 * @return 鎺掑簭鍚庣殑鏄庣粏
+	 */
+	List<OsCodeRuleElementDO> selectByRuleOidOrderByRuleOrderNumber(String ruleOid);
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/OsCodeSerialNumberDaoI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/OsCodeSerialNumberDaoI.java
new file mode 100644
index 0000000..760a2ed
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/OsCodeSerialNumberDaoI.java
@@ -0,0 +1,108 @@
+package com.vci.web.dao;
+
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.web.model.OsCodeSerialNumberDO;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 缂栫爜娴佹按鍙锋暟鎹搷浣滃眰
+ * 
+ * @author weidy
+ * @date 2020-09-01
+ */
+public interface OsCodeSerialNumberDaoI {
+
+	/**
+     * 浣跨敤涓婚敭鍒犻櫎
+     * @param oid 鏁版嵁涓婚敭
+     * @return 鎵ц缁撴灉
+     */
+	int deleteByPrimaryKey(String oid);
+
+	/**
+     * 娣诲姞鏁版嵁
+     * @param record 缂栫爜娴佹按鍙锋暟鎹璞�
+     * @return 鎵ц缁撴灉
+     */
+	int insert(OsCodeSerialNumberDO record);
+
+	/**
+     * 鏍规嵁涓婚敭鏌ヨ
+     * @param oid 鏁版嵁涓婚敭
+     * @return 鏁版嵁瀵硅薄
+     */
+	OsCodeSerialNumberDO selectByPrimaryKey(String oid);
+
+	/**
+     * 鏍规嵁涓婚敭鎵归噺鑾峰彇瀵硅薄
+     * @param oids 涓婚敭锛屽寘鍚崟寮曞彿,浣嗘槸涓嶈兘瓒呰繃1000
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+	List<OsCodeSerialNumberDO> selectByPrimaryKeys(String oids);
+
+	/**
+     * 鏍规嵁涓婚敭鎵归噺鏌ヨ瀵硅薄
+     * @param oids 瀵硅薄涓婚敭,浣跨敤閫楀彿鍒嗛殧锛屼絾鏄笉鑳借秴杩�1000
+     * @return 涓氬姟瀵硅薄
+     */
+	List<OsCodeSerialNumberDO> selectByPrimaryKeyCollection(Collection<String> oids);
+
+	/**
+     * 鏌ヨ鎵�鏈夊垎绫�
+     * @return 鏌ヨ缁撴灉
+     */
+	List<OsCodeSerialNumberDO> selectAll();
+
+	/**
+     * 鏇存柊鐗╂枡銆佸伐鍏峰熀鏈垎绫�
+     * @param record 鐗╂枡銆佸伐鍏峰熀鏈垎绫绘暟鎹璞�
+     * @return 鎵ц缁撴灉
+     */
+	int updateByPrimaryKey(OsCodeSerialNumberDO record);
+
+	/**
+     * 鏍规嵁鏌ヨ鏉′欢鏌ヨ鏁版嵁
+     * @param condition 鏌ヨ鏉′欢锛屽寘鎷垎椤碉紝鎺掑簭
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+	List<OsCodeSerialNumberDO> selectByWrapper(Map<String,String> condition, PageHelper pageHelper);
+
+	/**
+     * 鏍规嵁鏌ヨ鏉′欢鏉ユ煡璇㈡�绘暟
+     * @param condition 鏌ヨ鏉′欢
+     * @return 鎬绘暟
+     */
+	Long countByWrapper(Map<String,String> condition);
+
+	/**
+     * 鏍规嵁涓婚敭鑾峰彇鍚嶇О
+     * @param oid 涓婚敭
+     * @return 涓枃鍚嶇О
+     */
+	String selectNameByOid(String oid);
+
+	/**
+     * 鎵归噺鍒犻櫎瀵硅薄
+     * @param oids 瀵硅薄鐨勪富閿泦鍚�
+     * @return 鍙楀奖鍝嶇殑琛屾暟
+     */
+	long batchDeleteByOids( Collection<String> oids);
+
+	/**
+	 * 瑙勫垯涓婚敭鍜屾祦姘翠緷鎹煡璇㈡渶澶ф祦姘村彿
+	 * @param ruleOid 瑙勫垯鐨勪富閿�
+	 * @param serialAccord 娴佹按渚濇嵁
+	 * @return 鏁版嵁瀵硅薄
+	 */
+	OsCodeSerialNumberDO selectByAccordingAndRuleOid(String ruleOid, String serialAccord);
+
+	/**
+	 * 浣跨敤瑙勫垯鐨勪富閿煡璇釜鏁�
+	 * @param ruleOid 瑙勫垯鐨勪富閿�
+	 * @return 鍖呭惈鐨勬暟閲�
+	 */
+    long countByRuleOid(String ruleOid);
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/VciFileDocClassifyDaoI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/VciFileDocClassifyDaoI.java
new file mode 100644
index 0000000..7124048
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/VciFileDocClassifyDaoI.java
@@ -0,0 +1,108 @@
+package com.vci.web.dao;
+
+import com.vci.starter.web.wrapper.VciQueryWrapperForDO;
+import com.vci.web.model.VciFileDocClassifyDO;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 鏂囨。鐨勭被鍨嬫暟鎹搷浣滃眰
+ * 
+ * @author weidy
+ * @date 2020-08-04
+ */
+public interface VciFileDocClassifyDaoI {
+
+	/**
+     * 浣跨敤涓婚敭鍒犻櫎
+     * @param oid 鏁版嵁涓婚敭
+     * @return 鎵ц缁撴灉
+     */
+	int deleteByPrimaryKey(String oid);
+
+	/**
+     * 娣诲姞鏁版嵁
+     * @param record 鏂囨。鐨勭被鍨嬫暟鎹璞�
+     * @return 鎵ц缁撴灉
+     */
+	int insert(VciFileDocClassifyDO record);
+
+	/**
+     * 鏍规嵁涓婚敭鏌ヨ
+     * @param oid 鏁版嵁涓婚敭
+     * @return 鏁版嵁瀵硅薄
+     */
+	VciFileDocClassifyDO selectByPrimaryKey(String oid);
+
+	/**
+     * 鏍规嵁涓婚敭鎵归噺鑾峰彇瀵硅薄
+     * @param oids 涓婚敭锛屽寘鍚崟寮曞彿,浣嗘槸涓嶈兘瓒呰繃1000
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+	List<VciFileDocClassifyDO> selectByPrimaryKeys(String oids);
+
+	/**
+     * 鏍规嵁涓婚敭鎵归噺鏌ヨ瀵硅薄
+     * @param oids 瀵硅薄涓婚敭,浣跨敤閫楀彿鍒嗛殧锛屼絾鏄笉鑳借秴杩�1000
+     * @return 涓氬姟瀵硅薄
+     */
+	List<VciFileDocClassifyDO> selectByPrimaryKeyCollection(Collection<String> oids);
+
+	/**
+     * 鏌ヨ鎵�鏈夊垎绫�
+     * @return 鏌ヨ缁撴灉
+     */
+	List<VciFileDocClassifyDO> selectAll();
+
+	/**
+     * 鏇存柊鐗╂枡銆佸伐鍏峰熀鏈垎绫�
+     * @param record 鐗╂枡銆佸伐鍏峰熀鏈垎绫绘暟鎹璞�
+     * @return 鎵ц缁撴灉
+     */
+	int updateByPrimaryKey(VciFileDocClassifyDO record);
+
+	/**
+     * 鏍规嵁鏌ヨ鏉′欢鏌ヨ鏁版嵁
+     * @param wrapper 鏌ヨ鏉′欢锛屽寘鎷垎椤碉紝鎺掑簭
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+	List<VciFileDocClassifyDO> selectByWrapper(VciQueryWrapperForDO wrapper);
+
+	/**
+     * 鏍规嵁鏌ヨ鏉′欢鏉ユ煡璇㈡�绘暟
+     * @param wrapper 鏌ヨ鏉′欢
+     * @return 鎬绘暟
+     */
+	Long countByWrapper( VciQueryWrapperForDO wrapper);
+
+	/**
+     * 鏍规嵁涓婚敭鑾峰彇鍚嶇О
+     * @param oid 涓婚敭
+     * @return 涓枃鍚嶇О
+     */
+	String selectNameByOid(String oid);
+
+
+	/**
+     * 鎵归噺鍒犻櫎瀵硅薄
+     * @param oids 瀵硅薄鐨勪富閿泦鍚�
+     * @return 鍙楀嵃璞$殑琛屾暟
+     */
+	long batchDeleteByOids( Collection<String> oids);
+
+	/**
+	 * 浣跨敤缂栧彿鏌ヨ
+	 * @param ids 缂栧彿
+	 * @return 鏌ヨ缁撴灉
+	 */
+	List<VciFileDocClassifyDO> selectByIdCollection(Collection<String> ids);
+
+	/**
+	 * 浣跨敤缂栧彿鏌ヨ瀵硅薄
+	 * @param id 缂栧彿
+	 * @return 鏁版嵁瀵硅薄
+	 */
+	VciFileDocClassifyDO selectById(String id);
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/VciFileObjectDaoI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/VciFileObjectDaoI.java
new file mode 100644
index 0000000..d5df621
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/VciFileObjectDaoI.java
@@ -0,0 +1,132 @@
+package com.vci.web.dao;
+
+import com.vci.starter.web.wrapper.VciQueryWrapperForDO;
+import com.vci.web.model.VciFileObjectDO;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 鏂囦欢瀵硅薄鏁版嵁鎿嶄綔灞�
+ * 
+ * @author weidy
+ * @date 2020-08-04
+ */
+public interface VciFileObjectDaoI {
+
+	/**
+     * 浣跨敤涓婚敭鍒犻櫎
+     * @param oid 鏁版嵁涓婚敭
+     * @return 鎵ц缁撴灉
+     */
+	int deleteByPrimaryKey(String oid);
+
+	/**
+     * 娣诲姞鏁版嵁
+     * @param record 鏂囦欢瀵硅薄鏁版嵁瀵硅薄
+     * @return 鎵ц缁撴灉
+     */
+	int insert(VciFileObjectDO record);
+
+	/**
+     * 鏍规嵁涓婚敭鏌ヨ
+     * @param oid 鏁版嵁涓婚敭
+     * @return 鏁版嵁瀵硅薄
+     */
+	VciFileObjectDO selectByPrimaryKey(String oid);
+
+	/**
+     * 鏍规嵁涓婚敭鎵归噺鑾峰彇瀵硅薄
+     * @param oids 涓婚敭锛屽寘鍚崟寮曞彿,浣嗘槸涓嶈兘瓒呰繃1000
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+	List<VciFileObjectDO> selectByPrimaryKeys(String oids);
+
+	/**
+     * 鏍规嵁涓婚敭鎵归噺鏌ヨ瀵硅薄
+     * @param oids 瀵硅薄涓婚敭,浣跨敤閫楀彿鍒嗛殧锛屼絾鏄笉鑳借秴杩�1000
+     * @return 涓氬姟瀵硅薄
+     */
+	List<VciFileObjectDO> selectByPrimaryKeyCollection(Collection<String> oids);
+
+	/**
+     * 鏌ヨ鎵�鏈夊垎绫�
+     * @return 鏌ヨ缁撴灉
+     */
+	List<VciFileObjectDO> selectAll();
+
+	/**
+     * 鏇存柊鐗╂枡銆佸伐鍏峰熀鏈垎绫�
+     * @param record 鐗╂枡銆佸伐鍏峰熀鏈垎绫绘暟鎹璞�
+     * @return 鎵ц缁撴灉
+     */
+	int updateByPrimaryKey(VciFileObjectDO record);
+
+	/**
+     * 鏍规嵁鏌ヨ鏉′欢鏌ヨ鏁版嵁
+     * @param wrapper 鏌ヨ鏉′欢锛屽寘鎷垎椤碉紝鎺掑簭
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+	List<VciFileObjectDO> selectByWrapper(VciQueryWrapperForDO wrapper);
+
+	/**
+     * 鏍规嵁鏌ヨ鏉′欢鏉ユ煡璇㈡�绘暟
+     * @param wrapper 鏌ヨ鏉′欢
+     * @return 鎬绘暟
+     */
+	Long countByWrapper( VciQueryWrapperForDO wrapper);
+
+	/**
+     * 鏍规嵁涓婚敭鑾峰彇鍚嶇О
+     * @param oid 涓婚敭
+     * @return 涓枃鍚嶇О
+     */
+	String selectNameByOid(String oid);
+
+	/**
+     * 鎵归噺鍒犻櫎瀵硅薄
+     * @param oids 瀵硅薄鐨勪富閿泦鍚�
+     * @return 鍙楀嵃璞$殑琛屾暟
+     */
+	long batchDeleteByOids (Collection<String> oids);
+
+	/**
+	 * 鎵归噺鎻掑叆
+	 * @param resultList 淇濆瓨瀵硅薄闆嗗悎
+	 * @return 鍙楀奖鍝嶇殑琛屾暟
+	 */
+    int batchInsert(Collection<VciFileObjectDO> resultList);
+
+	/**
+	 * 鎵归噺鏇存柊
+	 * @param updateList 鏇存柊瀵硅薄闆嗗悎
+	 * @return 鍙楀奖鍝嶇殑琛屾暟
+	 */
+	int batchUpdateByPrimaryKey(Collection<VciFileObjectDO> updateList);
+
+	/**
+	 * 鏍规嵁鍏抽敭淇℃伅鑾峰彇鏂囦欢淇℃伅
+	 * @param keyInfo 鍏抽敭淇℃伅
+	 * @return 鏁版嵁瀵硅薄
+	 */
+	List<VciFileObjectDO> selectByKeyInfo(String keyInfo);
+
+	/**
+	 * 璁$畻鏂囦欢鐨勫悕绉扮殑涓暟
+	 * @param fileNameNoExtension 鏂囦欢鍚嶇О锛屼笉鍖呭惈鍚庣紑鍚�
+	 * @param fileExtension 鏂囦欢鐨勫悗缂�鍚�
+	 * @param ownbizOid 涓氬姟鏁版嵁涓婚敭
+	 * @param updateFileFlag 鏄惁涓轰慨鏀癸紙淇敼鐨勬椂闇�瑕佹姏鍑哄綋鍓嶄富閿�)
+	 * @param oid 淇敼鐨勬椂鍊欐枃浠朵富閿�
+	 * @return 鍖呭惈鐨勪釜鏁�
+	 */
+	int countSameName(String fileNameNoExtension, String fileExtension, String ownbizOid, boolean updateFileFlag,String oid);
+
+	/**
+	 * 鑾峰彇鏁版嵁鐨勫瘑绾�
+	 * @param ownbizOid 涓氬姟鏁版嵁鐨勪富閿�
+	 * @param ownbizBtm 涓氬姟绫诲瀷鍚嶇О
+	 * @return 瀵嗙骇鐨勫��
+	 */
+	String selectSecret(String ownbizOid,String ownbizBtm);
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/VciFileVolumeDaoI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/VciFileVolumeDaoI.java
new file mode 100644
index 0000000..9defaee
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/VciFileVolumeDaoI.java
@@ -0,0 +1,100 @@
+package com.vci.web.dao;
+
+import com.vci.starter.web.wrapper.VciQueryWrapperForDO;
+import com.vci.web.model.VciFileVolumeDO;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 鏂囦粨绠$悊鏁版嵁鎿嶄綔灞�
+ * 
+ * @author weidy
+ * @date 2020-08-04
+ */
+public interface VciFileVolumeDaoI {
+
+	/**
+     * 浣跨敤涓婚敭鍒犻櫎
+     * @param oid 鏁版嵁涓婚敭
+     * @return 鎵ц缁撴灉
+     */
+	int deleteByPrimaryKey(String oid);
+
+	/**
+     * 娣诲姞鏁版嵁
+     * @param record 鏂囦粨绠$悊鏁版嵁瀵硅薄
+     * @return 鎵ц缁撴灉
+     */
+	int insert(VciFileVolumeDO record);
+
+	/**
+     * 鏍规嵁涓婚敭鏌ヨ
+     * @param oid 鏁版嵁涓婚敭
+     * @return 鏁版嵁瀵硅薄
+     */
+	VciFileVolumeDO selectByPrimaryKey(String oid);
+
+	/**
+     * 鏍规嵁涓婚敭鎵归噺鑾峰彇瀵硅薄
+     * @param oids 涓婚敭锛屽寘鍚崟寮曞彿,浣嗘槸涓嶈兘瓒呰繃1000
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+	List<VciFileVolumeDO> selectByPrimaryKeys(String oids);
+
+	/**
+     * 鏍规嵁涓婚敭鎵归噺鏌ヨ瀵硅薄
+     * @param oids 瀵硅薄涓婚敭,浣跨敤閫楀彿鍒嗛殧锛屼絾鏄笉鑳借秴杩�1000
+     * @return 涓氬姟瀵硅薄
+     */
+	List<VciFileVolumeDO> selectByPrimaryKeyCollection(Collection<String> oids);
+
+	/**
+     * 鏌ヨ鎵�鏈夊垎绫�
+     * @return 鏌ヨ缁撴灉
+     */
+	List<VciFileVolumeDO> selectAll();
+
+	/**
+     * 鏇存柊鐗╂枡銆佸伐鍏峰熀鏈垎绫�
+     * @param record 鐗╂枡銆佸伐鍏峰熀鏈垎绫绘暟鎹璞�
+     * @return 鎵ц缁撴灉
+     */
+	int updateByPrimaryKey(VciFileVolumeDO record);
+
+	/**
+     * 鏍规嵁鏌ヨ鏉′欢鏌ヨ鏁版嵁
+     * @param wrapper 鏌ヨ鏉′欢锛屽寘鎷垎椤碉紝鎺掑簭
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+	List<VciFileVolumeDO> selectByWrapper(VciQueryWrapperForDO wrapper);
+
+	/**
+     * 鏍规嵁鏌ヨ鏉′欢鏉ユ煡璇㈡�绘暟
+     * @param wrapper 鏌ヨ鏉′欢
+     * @return 鎬绘暟
+     */
+	Long countByWrapper(VciQueryWrapperForDO wrapper);
+
+	/**
+     * 鏍规嵁涓婚敭鑾峰彇鍚嶇О
+     * @param oid 涓婚敭
+     * @return 涓枃鍚嶇О
+     */
+	String selectNameByOid(String oid);
+
+	/**
+     * 鎵归噺鍒犻櫎瀵硅薄
+     * @param oids 瀵硅薄鐨勪富閿泦鍚�
+     * @return 鍙楀嵃璞$殑琛屾暟
+     */
+	long batchDeleteByOids( Collection<String> oids);
+
+	/**
+	 * 鏇存柊浣跨敤鐨勫閲�
+	 * @param oid 涓婚敭
+	 * @param usedVolume 浣跨敤鐨勫閲�
+	 * @return 鍙楀奖鍝嶇殑琛屾暟
+	 */
+    int updateUsedVolume(String oid,  String usedVolume);
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/WFWorkflowNodeFavDaoI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/WFWorkflowNodeFavDaoI.java
new file mode 100644
index 0000000..78068f2
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/WFWorkflowNodeFavDaoI.java
@@ -0,0 +1,119 @@
+package com.vci.web.dao;
+
+
+import com.vci.starter.web.wrapper.VciQueryWrapperForDO;
+import com.vci.web.model.WFWorkflowNodeFavDO;
+import com.vci.web.pageModel.BatchCBO;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 娴佺▼璐熻矗浜烘敹钘忔暟鎹搷浣滃眰
+ *
+ * @author weidy
+ * @date 2021-06-08
+ */
+public interface WFWorkflowNodeFavDaoI {
+
+    /**
+     * 浣跨敤涓婚敭鍒犻櫎
+     * @param oid 鏁版嵁涓婚敭
+     * @return 鎵ц缁撴灉
+     */
+    BatchCBO deleteByPrimaryKey(String oid);
+
+    /**
+     * 娣诲姞鏁版嵁
+     * @param record 娴佺▼璐熻矗浜烘敹钘忔暟鎹璞�
+     * @return 鎵ц缁撴灉
+     */
+    BatchCBO insert(WFWorkflowNodeFavDO record);
+
+    /**
+     * 鎵归噺娣诲姞鏁版嵁
+     * @param records 娴佺▼璐熻矗浜烘敹钘忔暟鎹璞¢泦鍚�
+     * @return 鎵ц缁撴灉鏁�
+     */
+    BatchCBO batchInsert(List<WFWorkflowNodeFavDO> records);
+
+    /**
+     * 鏍规嵁涓婚敭鏌ヨ
+     * @param oid 鏁版嵁涓婚敭
+     * @return 鏁版嵁瀵硅薄
+     */
+    WFWorkflowNodeFavDO selectByPrimaryKey(String oid);
+
+    /**
+     * 鏍规嵁涓婚敭鎵归噺鑾峰彇瀵硅薄
+     * @param oids 涓婚敭锛屽寘鍚崟寮曞彿,浣嗘槸涓嶈兘瓒呰繃1000
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+    List<WFWorkflowNodeFavDO> selectByPrimaryKeys(String oids);
+
+    /**
+     * 鏍规嵁涓婚敭鎵归噺鏌ヨ瀵硅薄
+     * @param oids 瀵硅薄涓婚敭,浣跨敤閫楀彿鍒嗛殧锛屼絾鏄笉鑳借秴杩�1000
+     * @return 涓氬姟瀵硅薄
+     */
+    List<WFWorkflowNodeFavDO> selectByPrimaryKeyCollection(Collection<String> oids);
+
+    /**
+     * 鏌ヨ鎵�鏈夊垎绫�
+     * @return 鏌ヨ缁撴灉
+     */
+    List<WFWorkflowNodeFavDO> selectAll();
+
+    /**
+     * 鏇存柊瀵硅薄
+     * @param record 娴佺▼璐熻矗浜烘敹钘忔暟鎹璞�
+     * @return 鎵ц缁撴灉
+     */
+    BatchCBO updateByPrimaryKey(WFWorkflowNodeFavDO record);
+
+    /**
+     * 鎵归噺鏇存柊
+     * @param records 娴佺▼璐熻矗浜烘敹钘忔暟鎹璞¢泦鍚�
+     * @return 鎵ц缁撴灉琛屾暟
+     */
+    BatchCBO batchUpdate(List<WFWorkflowNodeFavDO> records);
+
+    /**
+     * 鏍规嵁鏌ヨ鏉′欢鏌ヨ鏁版嵁
+     * @param wrapper 鏌ヨ鏉′欢锛屽寘鎷垎椤碉紝鎺掑簭
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+    List<WFWorkflowNodeFavDO> selectByWrapper(VciQueryWrapperForDO wrapper);
+
+    /**
+     * 鏍规嵁鏌ヨ鏉′欢鏉ユ煡璇㈡�绘暟
+     * @param wrapper 鏌ヨ鏉′欢
+     * @return 鎬绘暟
+     */
+    Long countByWrapper(VciQueryWrapperForDO wrapper);
+
+    /**
+     * 鏍规嵁涓婚敭鑾峰彇鍚嶇О
+     * @param oid 涓婚敭
+     * @return 涓枃鍚嶇О
+     */
+    String selectNameByOid(String oid);
+
+
+    /**
+     * 鎵归噺鍒犻櫎瀵硅薄
+     * @param oids 瀵硅薄鐨勪富閿泦鍚�
+     * @return 鍙楀奖鍝嶇殑琛屾暟
+     */
+    BatchCBO batchDeleteByOids(Collection<String> oids);
+
+    /**
+     * 浣跨敤鍚嶇О鏌ヨ
+     * @param name 鏂规鐨勫悕绉�
+     * @param userId 鐢ㄦ埛鍚�
+     * @param templateRev 妯℃澘鐨勭増鏈�
+     * @param id 妯℃澘鐨勪富閿�
+     * @return 鏁版嵁瀵硅薄
+     */
+    WFWorkflowNodeFavDO selectByName(String name,String userId,String id,String templateRev);
+}
\ No newline at end of file
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/WFWorkflowNodeFavItemDaoI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/WFWorkflowNodeFavItemDaoI.java
new file mode 100644
index 0000000..39903ba
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/WFWorkflowNodeFavItemDaoI.java
@@ -0,0 +1,114 @@
+package com.vci.web.dao;
+
+import com.vci.starter.web.wrapper.VciQueryWrapperForDO;
+import com.vci.web.model.WFWorkflowNodeFavItemDO;
+import com.vci.web.pageModel.BatchCBO;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 娴佺▼鏀惰棌鑺傜偣鏄庣粏鏁版嵁鎿嶄綔灞�
+ *
+ * @author weidy
+ * @date 2021-06-08
+ */
+public interface WFWorkflowNodeFavItemDaoI {
+
+    /**
+     * 浣跨敤涓婚敭鍒犻櫎
+     * @param oid 鏁版嵁涓婚敭
+     * @return 鎵ц缁撴灉
+     */
+    BatchCBO deleteByPrimaryKey(String oid);
+
+    /**
+     * 娣诲姞鏁版嵁
+     * @param record 娴佺▼鏀惰棌鑺傜偣鏄庣粏鏁版嵁瀵硅薄
+     * @return 鎵ц缁撴灉
+     */
+    BatchCBO insert(WFWorkflowNodeFavItemDO record);
+
+    /**
+     * 鎵归噺娣诲姞鏁版嵁
+     * @param records 娴佺▼鏀惰棌鑺傜偣鏄庣粏鏁版嵁瀵硅薄闆嗗悎
+     * @return 鎵ц缁撴灉鏁�
+     */
+    BatchCBO batchInsert(List<WFWorkflowNodeFavItemDO> records);
+
+    /**
+     * 鏍规嵁涓婚敭鏌ヨ
+     * @param oid 鏁版嵁涓婚敭
+     * @return 鏁版嵁瀵硅薄
+     */
+    WFWorkflowNodeFavItemDO selectByPrimaryKey(String oid);
+
+    /**
+     * 鏍规嵁涓婚敭鎵归噺鑾峰彇瀵硅薄
+     * @param oids 涓婚敭锛屽寘鍚崟寮曞彿,浣嗘槸涓嶈兘瓒呰繃1000
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+    List<WFWorkflowNodeFavItemDO> selectByPrimaryKeys(String oids);
+
+    /**
+     * 鏍规嵁涓婚敭鎵归噺鏌ヨ瀵硅薄
+     * @param oids 瀵硅薄涓婚敭,浣跨敤閫楀彿鍒嗛殧锛屼絾鏄笉鑳借秴杩�1000
+     * @return 涓氬姟瀵硅薄
+     */
+    List<WFWorkflowNodeFavItemDO> selectByPrimaryKeyCollection(Collection<String> oids);
+
+    /**
+     * 鏌ヨ鎵�鏈夊垎绫�
+     * @return 鏌ヨ缁撴灉
+     */
+    List<WFWorkflowNodeFavItemDO> selectAll();
+
+    /**
+     * 鏇存柊瀵硅薄
+     * @param record 娴佺▼鏀惰棌鑺傜偣鏄庣粏鏁版嵁瀵硅薄
+     * @return 鎵ц缁撴灉
+     */
+    BatchCBO updateByPrimaryKey(WFWorkflowNodeFavItemDO record);
+
+    /**
+     * 鎵归噺鏇存柊
+     * @param records 娴佺▼鏀惰棌鑺傜偣鏄庣粏鏁版嵁瀵硅薄闆嗗悎
+     * @return 鎵ц缁撴灉琛屾暟
+     */
+    BatchCBO batchUpdate(List<WFWorkflowNodeFavItemDO> records);
+
+    /**
+     * 鏍规嵁鏌ヨ鏉′欢鏌ヨ鏁版嵁
+     * @param wrapper 鏌ヨ鏉′欢锛屽寘鎷垎椤碉紝鎺掑簭
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+    List<WFWorkflowNodeFavItemDO> selectByWrapper(VciQueryWrapperForDO wrapper);
+
+    /**
+     * 鏍规嵁鏌ヨ鏉′欢鏉ユ煡璇㈡�绘暟
+     * @param wrapper 鏌ヨ鏉′欢
+     * @return 鎬绘暟
+     */
+    Long countByWrapper(VciQueryWrapperForDO wrapper);
+
+    /**
+     * 鏍规嵁涓婚敭鑾峰彇鍚嶇О
+     * @param oid 涓婚敭
+     * @return 涓枃鍚嶇О
+     */
+    String selectNameByOid(String oid);
+
+    /**
+     * 鎵归噺鍒犻櫎瀵硅薄
+     * @param oids 瀵硅薄鐨勪富閿泦鍚�
+     * @return 鍙楀奖鍝嶇殑琛屾暟
+     */
+    BatchCBO batchDeleteByOids(Collection<String> oids);
+
+    /**
+     * 鏍规嵁鏂规
+     * @param schemaOid 鏂规鐨勪富閿�
+     * @return 鏄庣粏鐨勫唴瀹�
+     */
+    List<WFWorkflowNodeFavItemDO> selectBySchemaOid(String schemaOid);
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/WebProcessDaoI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/WebProcessDaoI.java
new file mode 100644
index 0000000..fa90624
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/WebProcessDaoI.java
@@ -0,0 +1,405 @@
+package com.vci.web.dao;
+
+import com.vci.corba.workflow.method.WorkflowService;
+import com.vci.rmip.workflow.server.template.TasksAssigned;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.web.model.WFProcessClassifyDO;
+import com.vci.web.model.WFProcessTemplateDO;
+import com.vci.web.pageModel.*;
+import plm.bs.bom.clientobject.ClientBusinessObject;
+import plm.bs.bom.clientobject.ClientLinkObject;
+
+import java.util.Collection;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+public interface WebProcessDaoI {
+
+     /**
+      * 鑾峰彇娴佺▼鍒嗙被涓嬬殑娴佺▼妯℃澘
+      * @param type 娴佺▼鍒嗙被鐨勫悕绉�
+	  * @param filterTemplate 杩囨护妯℃澘
+      * @param showAll 鏄惁鏌ヨ鍏ㄩ儴鐗堟湰锛堝寘鍚仠鐢級
+      * @return
+      * @throws VciBaseException
+      */
+	  List<ProcessTemplateVO> getTemplatesByType(String type, String filterTemplate,boolean showAll) throws VciBaseException;
+
+	 /**
+	  * 鑾峰彇娴佺▼妯℃澘涓嬬殑浠诲姟鑺傜偣锛屼互鍙婁换鍔¤妭鐐逛笂閰嶇疆鐨勮矗浠讳汉
+	  * @param processOid 娴佺▼妯℃澘
+	  * @return
+	  * @throws VciBaseException
+	  */
+	  List<ProcessNodeVO> getAllProcessNode(String processOid)  throws VciBaseException;
+	 
+	 /**
+	  * 鑾峰彇娴佺▼涓殑绗竴涓妭鐐圭殑鍚嶇О
+	  * @param deployId 閮ㄧ讲涓婚敭
+	  * @return
+	  * @throws VciBaseException
+	  */
+	  String getFirstNodeName(String deployId) throws VciBaseException;
+	 /**
+	  * 鑾峰彇娴佺▼妯℃澘瀵瑰簲鐨勬祦绋嬪紩鎿庨噷鐨勯儴缃蹭富閿�
+	  * @param processOid 娴佺▼妯℃澘涓婚敭
+	  * @return 
+	  * @throws VciBaseException
+	  */
+	  String getJbpmDeploymentId(String processOid) throws VciBaseException;
+	 
+	 /**
+	  * 鑾峰彇娴佺▼妯℃澘瀵瑰簲鐨勫紩鎿庨噷鐨勯儴缃蹭富閿�
+	  * @param executionId
+	  * @return
+	  * @throws VciBaseException
+	  */
+	  String getJbpmDeploymentIdByExecutionId(String executionId)
+				throws VciBaseException;
+	  
+	  /**
+	   * 鑾峰彇娴佺▼妯℃澘鐨剎ml鐨勫唴瀹�
+	   * @param jbpmDeploymentId 娴佺▼鐨勯儴缃蹭富閿�
+	   * @return xml鐨勪簩杩涘埗鍐呭
+	   */
+	  byte[] getProcessXmlContent(String jbpmDeploymentId) throws VciBaseException;
+
+	 /**
+	  * 鑾峰彇娴佺▼妯℃澘涓墍鏈夌殑鑺傜偣鍚嶇О
+	  * @param processOid 娴佺▼妯℃澘涓婚敭
+	  * @return
+	  * @throws VciBaseException
+	  */
+	  String[] getAllProcessNodeName(String processOid) throws VciBaseException;
+
+	 /**
+	  * 鏍规嵁娴佺▼寮曟搸涓殑閮ㄧ讲涓婚敭鏉ヨ幏鍙栨墍鏈夌殑浠诲姟鑺傜偣
+	  * @param deploymentId
+	  * @return
+	  * @throws VciBaseException
+	  */
+	  String[] getAllProcessNodeNameByDeploy(String deploymentId)
+			throws VciBaseException;
+
+	 /**
+	  * 鑾峰彇妯℃澘涓妭鐐硅缃殑璐熻矗浜�
+	  * @param deploymentId 寮曟搸涓殑閮ㄧ讲涓婚敭
+	  * @param taskName 浠诲姟鑺傜偣鍚嶇О
+	  * @return
+	  * @throws VciBaseException
+	  */
+	 ProcessNodeVO getNodePresideUsersByDeploy(String deploymentId, String taskName)
+			throws VciBaseException;
+
+	/**
+	 * 鑾峰彇妯℃澘涓殑鑺傜偣璁剧疆鐨勮礋璐d汉
+	 * @param processOid 娴佺▼涓婚敭
+	 * @param taskName 浠诲姟鑺傜偣
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 ProcessNodeVO getNodePresideUsers(String processOid, String taskName)
+			throws VciBaseException;
+	/**
+	 * 鑾峰彇浠诲姟鐨勫鐞嗕汉
+	 * @param executionid 鎵ц涓婚敭
+	 * @param taskName 浠诲姟鍚嶇О
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 List<ProcessUserVO> getNodePresideUsersByTask(String executionid, String taskName) throws VciBaseException;
+
+	/**
+	 * 鑾峰彇鏌愪釜鐢ㄦ埛鐨勫緟鍔炲疄鐜�
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @param ph
+	 * @param userId 鐢ㄦ埛鍚�-涓嶈兘涓虹┖
+	 * @return 
+	 * @throws VciBaseException
+	 */
+	 DataGrid getUndoTask(
+			 Map<String, String> conditionMap, PageHelper ph, String userId) throws VciBaseException;
+
+	/**
+	 * 浣跨敤娴佺▼瀹炰緥鑾峰彇鎵�鏈夌殑寰呭姙淇℃伅
+	 * @param processInstanceId 娴佺▼鐨勫疄渚嬩富閿�
+	 * @param mill 鏃堕棿
+	 * @return 寰呭姙鐨勪换鍔�
+	 */
+	DataGrid getUndoTaskByInstanceId(String processInstanceId,long mill);
+
+	/**
+	 * 鑾峰彇鏌愪釜鐢ㄦ埛宸茬粡澶勭悊鐨勪换鍔�
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @param ph
+	 * @param userId 鐢ㄦ埛鍚�-涓嶈兘涓虹┖
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 DataGrid getDoneProcess(Map<String, String> conditionMap, PageHelper ph, String userId)  throws VciBaseException;
+
+	/**
+	 * 鑾峰彇宸茬粡瀹屾垚鐨勬祦绋�
+	 * @param conditionMap
+	 * @param ph
+	 * @param userId 鐢ㄦ埛鍚嶏紝涓虹┖琛ㄧず鎵�鏈変汉
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 DataGrid getCompletedProcess(Map<String, String> conditionMap, PageHelper ph, String userId) throws VciBaseException;
+	
+	/**
+	 * 鑾峰彇缁堟鐨勬祦绋�
+	 * @param conditionMap
+	 * @param ph
+	 * @param userId
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 DataGrid getObsoledtedProcess(Map<String, String> conditionMap, PageHelper ph, String userId) throws VciBaseException;
+	
+	/**
+	 * 鑾峰彇鎸傝捣鐨勬祦绋�
+	 * @param conditionMap
+	 * @param ph
+	 * @param userId
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 DataGrid getSuspendedProcess(Map<String, String> conditionMap, PageHelper ph, String userId) throws VciBaseException;
+	
+	/**
+	 * 鑾峰彇姝e湪鎵ц鐨勬祦绋�
+	 * @param conditionMap
+	 * @param ph
+	 * @param userId
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 DataGrid getExecutingProcess(Map<String, String> conditionMap, PageHelper ph, String userId) throws VciBaseException;
+	
+	/**
+	 * 鑾峰彇鏌愪釜鐢ㄦ埛鍙戣捣鐨勬墍鏈夋祦绋嬩俊鎭�
+	 * @param conditionMap 
+	 * @param ph
+	 * @param userId 鐢ㄦ埛鍚嶏紝涓嶈兘涓虹┖
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 DataGrid getCreateProcess(Map<String, String> conditionMap, PageHelper ph, String userId) throws VciBaseException;
+
+	/**
+	 * 鏍规嵁寰呭姙浠诲姟鐨勪富閿潵鑾峰彇寰呭姙浠诲姟瀵硅薄
+	 * @param oid
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 List<ProcessTaskVO> getTaskByOid(String oid) throws VciBaseException;
+
+	/**
+	 * 杩樻湁浠诲姟鐨勪富閿幏鍙栦换鍔BO瀵硅薄
+	 * @param oid 涓婚敭
+	 * @return CBO瀵硅薄
+	 * @throws VciBaseException 鏌ヨ鍑洪敊浼氭姏鍑哄紓甯�
+	 */
+	List<Map> getTaskCBOByOid(String oid) throws VciBaseException;
+
+	/**
+	 * 鏍规嵁娴佺▼鐨勪富閿潵鑾峰彇娴佺▼鐨勫璞�
+	 * @param oid
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 ProcessInstanceVO getProcessByOid(String oid) throws VciBaseException;
+
+	/**
+	 * 鑾峰彇娴佺▼涓殑鍙橀噺锛屽钩鍙板彧鏀寔瀛楃涓�.....
+	 * @param executionId
+	 * @param key
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 String getVariablesInProcess(String executionId, String key)
+			throws VciBaseException;
+
+	/**
+	 * 鑾峰彇浠诲姟涓叧鑱旂殑鎵�鏈夋暟鎹�
+	 * @param taskOid 浠诲姟鐨勪富閿�
+	 * @param processOid 娴佺▼鐨勪富閿�
+	 * @param referColumns 寮曠敤鐨勫垪
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 DataGrid getDataByTask(String taskOid, String processOid, String referColumns) throws VciBaseException;
+
+	/**
+	 * 鑾峰彇浠诲姟鍏宠仈鐨勯摼鎺ョ被鍨�
+	 * @param taskOid 浠诲姟涓婚敭
+	 * @param executionId 娴佺▼鎵ц涓婚敭
+	 * @return
+	 * @throws VciBaseException
+	 */
+    List<ClientLinkObject> getDataCloInTask(String taskOid, String executionId) throws VciBaseException;
+
+    /**
+	 * 鑾峰彇娴佺▼涓寘鍚殑鎵�鏈夋暟鎹�
+	 * @param executionId 娴佺▼鎵цID
+	 * @param referColumns 鍙傜収鐨勫垪
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 DataGrid getDataByProcess(String executionId, String referColumns) throws VciBaseException;
+
+	/**
+	 * 鑾峰彇娴佺▼鍘嗗彶
+	 * @param executionId
+	 * @return
+	 * @throws VciBaseException 
+	 */
+	 List<ProcessHistoryVO> getHistory(String executionId) throws VciBaseException;
+
+	/**
+	 * 鑾峰彇娴佺▼鍥剧殑浜岃繘鍒舵暟鎹�
+	 * @param executionId 娴佺▼鎵ц涓婚敭
+	 * @param taskName 浠诲姟鍚嶇О
+	 * @return
+	 */
+	 byte[] getProcessPicture(String executionId, String taskName)  throws VciBaseException;
+
+	/**
+	 * 鑾峰彇娴佺▼妯℃澘涓婄殑娴佺▼鍥剧殑浜岃繘鍒舵暟鎹�
+	 * @param deployId
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 byte[] getProcessTemplatePicture(String deployId)  throws VciBaseException;
+
+	/**
+	 * 鑾峰彇浠诲姟鐨勮矾鐢�
+	 * @param taskoid jbpm涓殑浠诲姟涓婚敭
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 String[] getAllOutComes(String taskoid) throws VciBaseException;
+
+	/**
+	 * 鑾峰彇涓嬩竴姝ョ殑浠诲姟
+	 * @param executionid 娴佺▼鎵ц涓婚敭
+	 * @param taskName 褰撳墠浠诲姟鐨勫悕绉�
+	 * @param outCome 璺敱鍚嶇О
+	 * @return 鍥犱负鏈夊垎鏀殑鎯呭喌锛屾墍浠ヤ笅涓�姝ヤ换鍔′細鏈夊涓�
+	 */
+	 String getNextTaskName(String executionid, String taskName, String outCome) throws VciBaseException;
+
+	/**
+	 * 鑾峰彇骞冲彴鐨勬祦绋嬫湇鍔�
+	 * @return
+	 */
+	 WorkflowService getWorkService() throws VciBaseException;
+
+	/**
+	 * 浠诲姟涓庢暟鎹叧鑱旂殑閾炬帴绫诲瀷
+	 * @return
+	 */
+	 String getTaskDataLink();
+
+	/**
+	 * 浠诲姟鐨勪笟鍔$被鍨�
+	 * @return
+	 */
+	 String getWorkitemBtmType();
+
+	/**
+	 * 鏍规嵁閮ㄧ讲涓婚敭锛岃幏鍙栨祦绋嬫ā鏉垮璞�
+	 * @param deployId 閮ㄧ讲涓婚敭
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 ProcessTemplateVO getTemplateByDeployId(String deployId) throws VciBaseException;
+
+	String getWorkIntanceBtmType();
+
+	/**
+	 * 娣诲姞娴佺▼浠g悊--鍙互璁剧疆鐜板湪鐢熸晥杩樻槸鍚庣画鐢熸晥
+	 * @param userId 浠g悊浜虹殑鐢ㄦ埛鍚�
+	 * @param startDate 寮�濮嬫棩鏈�
+	 * @param endDate 缁撴潫鏃ユ湡
+	 * @param isNowEnable 鏄惁绔嬪嵆鐢熸晥 ----杩欎釜鍙傛暟鍏堥兘璁剧疆涓簍rue
+	 * @throws VciBaseException
+	 */
+	 void beginProxy(String userId, Date startDate, Date endDate, boolean isNowEnable) throws VciBaseException;
+
+	/**
+	 * 鍋滄娴佺▼浠g悊
+	 * @throws VciBaseException
+	 */
+	 void endProxy() throws VciBaseException;
+
+	/**
+	 * 鑾峰彇娴佺▼浠g悊淇℃伅
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 TasksAssigned getProxy() throws VciBaseException;
+
+	/**
+	 * 缁撴潫娴佺▼
+	 * @param executionId
+	 * @throws VciBaseException
+	 */
+	void endProcess(String executionId) throws VciBaseException;
+
+	/**
+	 * 鏍规嵁涓氬姟绫诲瀷鏌ヨ姝e湪鎵ц鐨勬祦绋�
+	 * @param bussinessOid 涓氬姟绫诲瀷鏁版嵁
+	 * @param btmName 涓氬姟绫诲瀷鍚嶇О
+	 * @return
+	 * @throws VciBaseException
+	 */
+    List<ProcessInstanceVO> listExecutingProcessByBussinessOid(String bussinessOid, String btmName) throws VciBaseException;
+
+	/**
+	 * 鎵归噺缁堟娴佺▼锛�
+	 * @param executionIds 娴佺▼鐨勬墽琛屼富閿�
+	 * @param note 缁堟鍘熷洜
+	 * @throws VciBaseException
+	 */
+    void batchEndProcess(Collection<String> executionIds, String note) throws VciBaseException;
+
+	/**
+	 * 娴佺▼鍒嗙被鐨勬暟鎹璞¤浆鎹负鏄剧ず瀵硅薄
+	 * @param doCollection 鏁版嵁瀵硅薄鐨勯泦鍚�
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	List<ProcessClassifyVO>  processClassifyDO2VOs(Collection<WFProcessClassifyDO> doCollection);
+
+	/**
+	 * 娴佺▼鍒嗙被鐨勬暟鎹璞¤浆鎹负鏄剧ず瀵硅薄
+	 * @param classifyDO 鏁版嵁瀵硅薄
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	ProcessClassifyVO processClassifyDO2VO(WFProcessClassifyDO classifyDO);
+	/**
+	 * 娴佺▼妯℃澘鐨勬暟鎹璞¤浆鎹负鏄剧ず瀵硅薄
+	 * @param doCollection 鏁版嵁瀵硅薄闆嗗悎
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	List<ProcessTemplateVO> processTemplateDO2VOs(Collection<WFProcessTemplateDO> doCollection);
+
+	/**
+	 * 娴佺▼妯℃澘鐨勬暟鎹璞¤浆鎹负鏄剧ず瀵硅薄
+	 * @param templateDO 鏁版嵁瀵硅薄
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	ProcessTemplateVO processTemplateDO2VO(WFProcessTemplateDO templateDO);
+
+	/**
+	 * 浣跨敤鐢ㄦ埛鍚嶆煡璇㈠緟鍔炰换鍔$殑涓暟
+	 * @param username 鐢ㄦ埛鍚�
+	 * @return 涓暟
+	 */
+    int countUndoTaskByUsername(String username);
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/BdSelectInputCharDaoImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/BdSelectInputCharDaoImpl.java
new file mode 100644
index 0000000..9dd86ff
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/BdSelectInputCharDaoImpl.java
@@ -0,0 +1,219 @@
+package com.vci.web.dao.impl;
+
+import com.vci.web.model.BdSelectInputCharDO;
+
+import com.vci.starter.web.wrapper.VciQueryWrapperForDO;
+import com.vci.web.pageModel.KeyValue;
+import org.apache.commons.lang3.StringUtils;
+import com.vci.starter.web.util.*;
+import com.vci.web.dao.BdSelectInputCharDaoI;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.*;
+import com.vci.web.service.WebBoServiceI;
+import com.vci.web.service.OsLifeCycleServiceI;
+import com.vci.web.pageModel.BatchCBO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+import org.springframework.util.CollectionUtils;
+import plm.bs.bom.clientobject.ClientBusinessObject;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.ArrayList;
+
+import static com.vci.frameworkcore.constant.FrameWorkBusLangCodeConstant.DATA_OID_NOT_EXIST;
+
+
+/**
+ * 鍙緭鍙�夊唴瀹规暟鎹搷浣滃眰瀹炵幇绫�
+ * 
+ * @author weidy
+ * @date 2022-03-09
+ */
+@Repository
+public class  BdSelectInputCharDaoImpl implements BdSelectInputCharDaoI{
+
+	/**
+	* 涓氬姟绫诲瀷鎿嶄綔鐨勬湇鍔�
+	*/
+	@Autowired
+	private WebBoServiceI boService;
+
+	/**
+	* 鐢熷懡鍛ㄦ湡鐨勬湇鍔�
+	*/
+	@Autowired
+	private OsLifeCycleServiceI lifeCycleService;
+
+	/**
+     * 浣跨敤涓婚敭鍒犻櫎
+     * @param oid 鏁版嵁涓婚敭
+     * @return 鎵ц缁撴灉
+     */
+	@Override
+	public BatchCBO deleteByPrimaryKey(String oid){
+		VciBaseUtil.alertNotNull(oid,"涓婚敭");
+        BdSelectInputCharDO bdSelectInputCharDO = selectByPrimaryKey(oid);
+		return boService.delete(bdSelectInputCharDO);
+	}
+
+	/**
+     * 娣诲姞鏁版嵁
+     * @param record 鍙緭鍙�夊唴瀹规暟鎹璞�
+     * @return 鎵ц缁撴灉
+     */
+	@Override
+	public BatchCBO insert(BdSelectInputCharDO record){
+		VciBaseUtil.alertNotNull(record,"瑕佹坊鍔犵殑鏁版嵁");
+		return boService.addSave(record);
+	}
+
+	/**
+	* 鎵归噺娣诲姞鏁版嵁
+	* @param records 鍙緭鍙�夊唴瀹规暟鎹璞¢泦鍚�
+	* @return 鎵ц缁撴灉鏁�
+	*/
+	@Override
+	public BatchCBO batchInsert(List<BdSelectInputCharDO> records){
+		VciBaseUtil.alertNotNull(records,"瑕佹坊鍔犵殑鏁版嵁");
+		BatchCBO batchCBO = boService.batchAddSave(records);
+		return batchCBO;
+	}
+
+	/**
+     * 鏍规嵁涓婚敭鏌ヨ
+     * @param oid 鏁版嵁涓婚敭
+     * @return 鏁版嵁瀵硅薄
+     */
+	@Override
+	public BdSelectInputCharDO selectByPrimaryKey(String oid){
+		VciBaseUtil.alertNotNull(oid,"涓婚敭");
+		BdSelectInputCharDO record = boService.selectByOid(oid, BdSelectInputCharDO.class);
+		if(record == null || StringUtils.isBlank(record.getOid())){
+			throw new VciBaseException(DATA_OID_NOT_EXIST);
+		}
+		return record;
+	}
+
+	/**
+     * 鏍规嵁涓婚敭鎵归噺鑾峰彇瀵硅薄
+     * @param oids 涓婚敭锛屽寘鍚崟寮曞彿,浣嗘槸涓嶈兘瓒呰繃1000
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+	@Override
+	public List<BdSelectInputCharDO> selectByPrimaryKeys(String oids){
+		VciBaseUtil.alertNotNull(oids,"涓婚敭闆嗗悎");
+		return boService.selectByOidCollection(VciBaseUtil.str2List(oids), BdSelectInputCharDO.class);
+	}
+
+	/**
+     * 鏍规嵁涓婚敭鎵归噺鏌ヨ瀵硅薄
+     * @param oids 瀵硅薄涓婚敭,浣跨敤閫楀彿鍒嗛殧锛屼絾鏄笉鑳借秴杩�1000
+     * @return 涓氬姟瀵硅薄
+     */
+	@Override
+	public List<BdSelectInputCharDO> selectByPrimaryKeyCollection(Collection<String> oids){
+		VciBaseUtil.alertNotNull(oids,"涓婚敭闆嗗悎");
+		return boService.selectByOidCollection(oids, BdSelectInputCharDO.class);
+	}
+
+	/**
+     * 鏌ヨ鎵�鏈夊垎绫�
+     * @return 鏌ヨ缁撴灉
+     */
+	@Override
+	public List<BdSelectInputCharDO> selectAll(){
+		return boService.queryObject(BdSelectInputCharDO.class,null);
+	}
+
+	/**
+     * 鏇存柊瀵硅薄
+     * @param record 鍙緭鍙�夊唴瀹规暟鎹璞�
+     * @return 鎵ц缁撴灉
+     */
+	@Override
+	public BatchCBO updateByPrimaryKey(BdSelectInputCharDO record){
+		VciBaseUtil.alertNotNull(record,"瑕佷慨鏀圭殑瀵硅薄",record.getOid(),"涓婚敭");
+		return boService.editSave(record);
+    }
+	/**
+	* 鎵归噺鏇存柊
+	* @param records 鍙緭鍙�夊唴瀹规暟鎹璞¢泦鍚�
+	* @return 鎵ц缁撴灉琛屾暟
+	*/
+	@Override
+	public BatchCBO batchUpdate(List<BdSelectInputCharDO> records){
+		VciBaseUtil.alertNotNull(records,"瑕佷慨鏀圭殑瀵硅薄");
+		BatchCBO batchCBO = boService.batchEditSave(records);
+		return batchCBO;
+	}
+
+	/**
+     * 鏍规嵁鏌ヨ鏉′欢鏌ヨ鏁版嵁
+     * @param conditionMap 鏌ヨ鏉′欢锛�
+     * @param pageHelper 鍖呮嫭鍒嗛〉锛屾帓搴�
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+	@Override
+	public List<BdSelectInputCharDO> selectByCondition(Map< String,String> conditionMap, PageHelper pageHelper){
+		return boService.queryObject(BdSelectInputCharDO.class,conditionMap,pageHelper);
+	}
+
+	/**
+     * 鏍规嵁鏌ヨ鏉′欢鏉ユ煡璇㈡�绘暟
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @return 鎬绘暟
+     */
+	@Override
+	public Long countByCondition(Map< String,String> conditionMap){
+		return VciBaseUtil.getLong(String.valueOf(boService.queryCount(BdSelectInputCharDO.class,conditionMap)));
+	}
+
+	/**
+	 * 鏍规嵁鏌ヨ灏佽鍣ㄦ潵鏌ヨ鏁版嵁
+	 * @param queryWrapper 鏌ヨ灏佽鍣�
+	 * @return 鏁版嵁瀵硅薄鍒楄〃
+	 */
+	@Override
+	public List<BdSelectInputCharDO> selectByWrapper(VciQueryWrapperForDO queryWrapper){
+		return boService.selectByQueryWrapper(queryWrapper,BdSelectInputCharDO.class);
+	}
+
+	/**
+     * 鏍规嵁鏌ヨ灏佽鍣ㄦ潵鏌ヨ鎬绘暟
+     * @param queryWrapper 鏌ヨ灏佽鍣�
+     * @return 鎬绘暟
+     */
+	@Override
+	public Long countByWrapper(VciQueryWrapperForDO queryWrapper){
+		return VciBaseUtil.getLong(String.valueOf(boService.countByQueryWrapper(queryWrapper,BdSelectInputCharDO.class)));
+	}
+
+	/**
+     * 鏍规嵁涓婚敭鑾峰彇鍚嶇О
+     * @param oid 涓婚敭
+     * @return 涓枃鍚嶇О
+     */
+	@Override
+	public String selectNameByOid(String oid){
+		return selectByPrimaryKey(oid).getName();
+	}
+
+
+
+	/**
+     * 鎵归噺鍒犻櫎瀵硅薄
+     * @param oids 瀵硅薄鐨勪富閿泦鍚�
+     * @return 鍙楀奖鍝嶇殑琛屾暟
+     */
+	@Override
+	public BatchCBO batchDeleteByOids(Collection<String> oids){
+		List<BdSelectInputCharDO> dos = boService.selectByOidCollection(oids, BdSelectInputCharDO.class);
+		BatchCBO batchCBO = boService.batchDelete(dos);
+		return batchCBO;
+	}
+
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/OsCodeBreakCodeDaoImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/OsCodeBreakCodeDaoImpl.java
new file mode 100644
index 0000000..10d917c
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/OsCodeBreakCodeDaoImpl.java
@@ -0,0 +1,195 @@
+package com.vci.web.dao.impl;
+
+import com.vci.starter.web.constant.QueryOptionConstant;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.starter.web.wrapper.VciQueryWrapperForDO;
+import com.vci.web.dao.OsCodeBreakCodeDaoI;
+import com.vci.web.model.OsCodeBreakCodeDO;
+import com.vci.web.pageModel.BatchCBO;
+import com.vci.web.service.WebBoServiceI;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+import org.springframework.util.CollectionUtils;
+import plm.bs.bom.clientobject.ClientBusinessObject;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static com.vci.frameworkcore.constant.FrameWorkBusLangCodeConstant.DATA_OID_NOT_EXIST;
+
+/**
+ * Description:鏂爜鍐呭鏁版嵁鎿嶄綔灞傚疄鐜扮被
+ *
+ * @author Lihang
+ * @date 2021/10/15 11:49
+ */
+@Repository
+public class OsCodeBreakCodeDaoImpl implements OsCodeBreakCodeDaoI {
+    /**
+     * 涓氬姟绫诲瀷鐨勬湇鍔�
+     */
+    @Autowired
+    private WebBoServiceI boService;
+
+    /**
+     * 浣跨敤涓婚敭鍒犻櫎
+     * @param oid 鏁版嵁涓婚敭
+     * @return 鎵ц缁撴灉
+     */
+    @Override
+    public int deleteByPrimaryKey(String oid) {
+        VciBaseUtil.alertNotNull(oid,"涓婚敭");
+        OsCodeBreakCodeDO codeBreakCodeDO = selectByPrimaryKey(oid);
+        this.boService.delete(codeBreakCodeDO);
+        return 1;
+    }
+
+    /**
+     * 娣诲姞鏁版嵁
+     * @param record 缂栫爜瑙勫垯鏁版嵁瀵硅薄
+     * @return 鎵ц缁撴灉
+     */
+    @Override
+    public int insert(OsCodeBreakCodeDO record) {
+        VciBaseUtil.alertNotNull(record,"瑕佹坊鍔犵殑鏁版嵁");
+        boService.addSave(record);
+        return 1;
+    }
+
+    /**
+     * 鏍规嵁涓婚敭鏌ヨ
+     * @param oid 鏁版嵁涓婚敭
+     * @return 鏁版嵁瀵硅薄
+     */
+    @Override
+    public OsCodeBreakCodeDO selectByPrimaryKey(String oid) {
+        VciBaseUtil.alertNotNull(oid,"涓婚敭");
+        OsCodeBreakCodeDO record = boService.selectByOid(oid, OsCodeBreakCodeDO.class);
+        if(record == null || StringUtils.isBlank(record.getOid())){
+            throw new VciBaseException(DATA_OID_NOT_EXIST);
+        }
+        return record;
+    }
+
+    /**
+     * 鏍规嵁涓婚敭鎵归噺鑾峰彇瀵硅薄
+     * @param oids 涓婚敭锛屽寘鍚崟寮曞彿,浣嗘槸涓嶈兘瓒呰繃1000
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+    @Override
+    public List<OsCodeBreakCodeDO> selectByPrimaryKeys(String oids) {
+        VciBaseUtil.alertNotNull(oids,"涓婚敭闆嗗悎");
+        return boService.selectByOidCollection(VciBaseUtil.str2List(oids), OsCodeBreakCodeDO.class);
+    }
+
+    /**
+     * 鏍规嵁涓婚敭鎵归噺鏌ヨ瀵硅薄
+     * @param oids 瀵硅薄涓婚敭,浣跨敤閫楀彿鍒嗛殧锛屼絾鏄笉鑳借秴杩�1000
+     * @return 涓氬姟瀵硅薄
+     */
+    @Override
+    public List<OsCodeBreakCodeDO> selectByPrimaryKeyCollection(Collection<String> oids) {
+        VciBaseUtil.alertNotNull(oids,"涓婚敭闆嗗悎");
+        return boService.selectByOidCollection(oids, OsCodeBreakCodeDO.class);
+    }
+
+    /**
+     * 鏌ヨ鎵�鏈夊垎绫�
+     * @return 鏌ヨ缁撴灉
+     */
+    @Override
+    public List<OsCodeBreakCodeDO> selectAll() {
+        return boService.queryObject(OsCodeBreakCodeDO.class,null);
+    }
+
+    /**
+     * 鏇存柊瀵硅薄
+     * @param record 缂栫爜瑙勫垯鏁版嵁瀵硅薄
+     * @return 鎵ц缁撴灉
+     */
+    @Override
+    public int updateByPrimaryKey(OsCodeBreakCodeDO record) {
+        VciBaseUtil.alertNotNull(record,"瑕佷慨鏀圭殑瀵硅薄",record.getOid(),"涓婚敭");
+        boService.editSave(record);
+        return 1;
+    }
+
+    /**
+     * 鏍规嵁鏌ヨ鏉′欢鏌ヨ鏁版嵁
+     * @param condition 鏌ヨ鏉′欢锛�
+     * @param pageHelper 鍖呮嫭鍒嗛〉锛屾帓搴�
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+    @Override
+    public List<OsCodeBreakCodeDO> selectByCondition(Map<String, String> condition, PageHelper pageHelper) {
+        return boService.queryObject(OsCodeBreakCodeDO.class,condition,pageHelper);
+    }
+
+    /**
+     * 鏍规嵁鏌ヨ鏉′欢鏉ユ煡璇㈡�绘暟
+     * @param condition 鏌ヨ鏉′欢
+     * @return 鎬绘暟
+     */
+    @Override
+    public Long countByCondition(Map<String, String> condition) {
+        return VciBaseUtil.getLong(String.valueOf(boService.queryCount(OsCodeBreakCodeDO.class,condition)));
+    }
+
+    /**
+     * 鏍规嵁涓婚敭鑾峰彇鍚嶇О
+     * @param oid 涓婚敭
+     * @return 涓枃鍚嶇О
+     */
+    @Override
+    public String selectNameByOid(String oid) {
+        return selectByPrimaryKey(oid).getName();
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎瀵硅薄
+     * @param oids 瀵硅薄鐨勪富閿泦鍚�
+     * @return 鍙楀奖鍝嶇殑琛屾暟
+     */
+    @Override
+    public long batchDeleteByOids(Collection<String> oids) {
+        List<OsCodeBreakCodeDO> dos = boService.selectByOidCollection(oids, OsCodeBreakCodeDO.class);
+        BatchCBO batchCBO = boService.batchDelete(dos);
+        return batchCBO.getDeleteCbos().size();
+    }
+
+    /**
+     * 鏌ヨ鏂爜鐨勫��
+     * @param ruleOid 缂栫爜瑙勫垯涓婚敭
+     * @param serialAccord 娴佹按渚濇嵁
+     * @return 鏂爜鐨勫�硷紝鍙栫涓�涓�
+     */
+    @Override
+    public OsCodeBreakCodeDO selectByAccordingAndRuleOid(String ruleOid, String serialAccord) {
+        VciBaseUtil.alertNotNull(ruleOid,"瑙勫垯鍒嗙被",serialAccord,"娴佹按渚濇嵁");
+        Map<String,String> conditionMap = new HashMap<String, String>();
+        conditionMap.put("pkcoderule",ruleOid);
+        List<ClientBusinessObject> queryList = this.boService.queryCBO("codebreakcode", conditionMap);
+        if (CollectionUtils.isEmpty(queryList)){
+            throw new VciBaseException("瑙勫垯鍒嗙被[{0}]鍦ㄧ郴缁熶腑涓嶅瓨鍦�",new String[]{ruleOid});
+        }
+        conditionMap.clear();
+        String oid = "";
+        for (ClientBusinessObject object : queryList) {
+            oid += object.getOid() + ",";
+        }
+        oid = "(" + oid.substring(0,oid.length() -1) + ")";
+        conditionMap.put("oid", QueryOptionConstant.IN + oid);
+        conditionMap.put("serialunit",serialAccord);
+        conditionMap.put("rownum","1");
+        List<OsCodeBreakCodeDO> codeDOList = this.boService.queryObject(OsCodeBreakCodeDO.class, conditionMap);
+        if (CollectionUtils.isEmpty(codeDOList)){
+            throw new VciBaseException("瑙勫垯鍒嗙被[{0}]涓嬫病鏈夋壘鍒扮紪鍙蜂负{1}鐨勬祦姘翠緷鎹�",new String[]{ruleOid,serialAccord});
+        }
+        return codeDOList.get(0);
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/OsCodeEnumDaoImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/OsCodeEnumDaoImpl.java
new file mode 100644
index 0000000..1cf977e
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/OsCodeEnumDaoImpl.java
@@ -0,0 +1,235 @@
+package com.vci.web.dao.impl;
+
+import com.vci.starter.web.constant.QueryOptionConstant;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.web.constant.BtmIdConstant;
+import com.vci.web.dao.OsCodeEnumDaoI;
+import com.vci.web.model.OsCodeEnumDO;
+import com.vci.web.pageModel.BatchCBO;
+import com.vci.web.service.WebBoServiceI;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+import org.springframework.util.CollectionUtils;
+import plm.bs.bom.clientobject.ClientBusinessObject;
+import plm.vo.omd.btm.common.BtmProvider;
+
+import java.util.*;
+
+import static com.vci.frameworkcore.constant.FrameWorkBusLangCodeConstant.DATA_OID_NOT_EXIST;
+
+/**
+ * Description:缂栫爜涓殑鏋氫妇鏄犲皠鏁版嵁鎿嶄綔灞傚疄鐜扮被
+ *
+ * @author Lihang
+ * @date 2021/10/15 11:50
+ */
+@Repository
+public class OsCodeEnumDaoImpl implements OsCodeEnumDaoI {
+    /**
+     * 涓氬姟绫诲瀷鐨勬湇鍔�
+     */
+    @Autowired
+    private WebBoServiceI boService;
+
+    /**
+     * 浣跨敤涓婚敭鍒犻櫎
+     * @param oid 鏁版嵁涓婚敭
+     * @return 鎵ц缁撴灉
+     */
+    @Override
+    public int deleteByPrimaryKey(String oid) {
+        VciBaseUtil.alertNotNull(oid,"涓婚敭");
+        OsCodeEnumDO osCodeEnumDO = selectByPrimaryKey(oid);
+        this.boService.delete(osCodeEnumDO);
+        return 1;
+    }
+    
+    /**
+     * 娣诲姞鏁版嵁
+     * @param record 缂栫爜瑙勫垯鏁版嵁瀵硅薄
+     * @return 鎵ц缁撴灉
+     */
+    @Override
+    public int insert(OsCodeEnumDO record) {
+        VciBaseUtil.alertNotNull(record,"瑕佹坊鍔犵殑鏁版嵁");
+        boService.addSave(record);
+        return 1;
+    }
+
+    /**
+     * 鏍规嵁涓婚敭鏌ヨ
+     * @param oid 鏁版嵁涓婚敭
+     * @return 鏁版嵁瀵硅薄
+     */
+    @Override
+    public OsCodeEnumDO selectByPrimaryKey(String oid) {
+        VciBaseUtil.alertNotNull(oid,"涓婚敭");
+        OsCodeEnumDO record = boService.selectByOid(oid, OsCodeEnumDO.class);
+        if(record == null || StringUtils.isBlank(record.getOid())){
+            throw new VciBaseException(DATA_OID_NOT_EXIST);
+        }
+        return record;
+    }
+
+    /**
+     * 鏍规嵁涓婚敭鎵归噺鑾峰彇瀵硅薄
+     * @param oids 涓婚敭锛屽寘鍚崟寮曞彿,浣嗘槸涓嶈兘瓒呰繃1000
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+    @Override
+    public List<OsCodeEnumDO> selectByPrimaryKeys(String oids) {
+        VciBaseUtil.alertNotNull(oids,"涓婚敭闆嗗悎");
+        return boService.selectByOidCollection(VciBaseUtil.str2List(oids), OsCodeEnumDO.class);
+    }
+
+    /**
+     * 鏍规嵁涓婚敭鎵归噺鏌ヨ瀵硅薄
+     * @param oids 瀵硅薄涓婚敭,浣跨敤閫楀彿鍒嗛殧锛屼絾鏄笉鑳借秴杩�1000
+     * @return 涓氬姟瀵硅薄
+     */
+    @Override
+    public List<OsCodeEnumDO> selectByPrimaryKeyCollection(Collection<String> oids) {
+        VciBaseUtil.alertNotNull(oids,"涓婚敭闆嗗悎");
+        return boService.selectByOidCollection(oids, OsCodeEnumDO.class);
+    }
+
+    /**
+     * 鏌ヨ鎵�鏈夊垎绫�
+     * @return 鏌ヨ缁撴灉
+     */
+    @Override
+    public List<OsCodeEnumDO> selectAll() {
+        return boService.queryObject(OsCodeEnumDO.class,null);
+    }
+
+    /**
+     * 鏇存柊瀵硅薄
+     * @param record 缂栫爜瑙勫垯鏁版嵁瀵硅薄
+     * @return 鎵ц缁撴灉
+     */
+    @Override
+    public int updateByPrimaryKey(OsCodeEnumDO record) {
+        VciBaseUtil.alertNotNull(record,"瑕佷慨鏀圭殑瀵硅薄",record.getOid(),"涓婚敭");
+        boService.editSave(record);
+        return 1;
+    }
+
+    /**
+     * 鏍规嵁鏌ヨ鏉′欢鏌ヨ鏁版嵁
+     * @param condition 鏌ヨ鏉′欢锛�
+     * @param pageHelper 鍖呮嫭鍒嗛〉锛屾帓搴�
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+    @Override
+    public List<OsCodeEnumDO> selectByWrapper(Map<String, String> condition, PageHelper pageHelper) {
+        return boService.queryObject(OsCodeEnumDO.class,condition,pageHelper);
+    }
+
+    /**
+     * 鏍规嵁鏌ヨ鏉′欢鏉ユ煡璇㈡�绘暟
+     * @param condition 鏌ヨ鏉′欢
+     * @return 鎬绘暟
+     */
+    @Override
+    public Long countByWrapper(Map<String, String> condition) {
+        return VciBaseUtil.getLong(String.valueOf(boService.queryCount(OsCodeEnumDO.class,condition)));
+    }
+
+    /**
+     * 鏍规嵁涓婚敭鑾峰彇鍚嶇О
+     * @param oid 涓婚敭
+     * @return 涓枃鍚嶇О
+     */
+    @Override
+    public String selectNameByOid(String oid) {
+        return selectByPrimaryKey(oid).getName();
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎瀵硅薄
+     * @param oids 瀵硅薄鐨勪富閿泦鍚�
+     * @return 鍙楀奖鍝嶇殑琛屾暟
+     */
+    @Override
+    public long batchDeleteByOids(Collection<String> oids) {
+        List<OsCodeEnumDO> dos = boService.selectByOidCollection(oids, OsCodeEnumDO.class);
+        BatchCBO batchCBO = boService.batchDelete(dos);
+        return batchCBO.getDeleteCbos().size();
+    }
+
+    /**
+     * 鑾峰彇鏋氫妇鐨勬槧灏勭殑鍊�
+     * @param ruleElementOid 缂栫爜瑙勫垯鍏冪礌鐨勪富閿�
+     * @param enumValue 鏋氫妇鐨勫��
+     * @return 鏌ヨ鏋氫妇鐨勬槧灏勭殑鍊�
+     */
+    @Override
+    public String selectMapValueByRuleOidAndValue(String ruleElementOid, String enumValue) {
+        VciBaseUtil.alertNotNull(ruleElementOid,"瑙勫垯鍏冪礌涓婚敭",enumValue,"鏋氫妇鐨勫��");
+        Map<String,String> conditionMap = new HashMap<String, String>();
+        conditionMap.put("pkCodeRuleElement",ruleElementOid);
+        conditionMap.put("enumitemvalue",enumValue);
+        List<OsCodeEnumDO> codeEnumDOS = this.boService.queryObject(OsCodeEnumDO.class, conditionMap);
+        if (CollectionUtils.isEmpty(codeEnumDOS)){
+            throw new VciBaseException("缂栫爜瑙勫垯鏄庣粏涓嬫病鏈夋壘鍒扮紪鍙蜂负{1}鐨勬灇涓惧��",new String[]{enumValue});
+        }
+        return codeEnumDOS.get(0).getCodeMapValue();
+    }
+
+    /**
+     * 鎵归噺鎻掑叆鏋氫妇鐨勬槧灏�
+     *
+     * @param enumDOs 鏄犲皠鍐呭
+     * @return 鎴愬姛鏉℃暟
+     */
+    @Override
+    public int batchInsert(List<OsCodeEnumDO> enumDOs) {
+        VciBaseUtil.alertNotNull(enumDOs,"瑕佹坊鍔犵殑鏁版嵁");
+        BatchCBO batchCBO = this.boService.batchAddSave(enumDOs);
+        return batchCBO.getCreateCbos().size();
+    }
+
+    /**
+     * 浣跨敤瑙勫垯鏌ヨ
+     *
+     * @param ruleOid 瑙勫垯鐨勪富閿殑鍐呭
+     * @return 鏋氫妇鏄犲皠淇℃伅
+     */
+    @Override
+    public List<OsCodeEnumDO> selectByRuleOid(String ruleOid) {
+        VciBaseUtil.alertNotNull(ruleOid,"瑙勫垯鐨勪富閿�");
+        //鍏堟煡璇㈡槑缁嗭紝鏄庣粏搴旇涓嶄細鏈�1000鏉�
+        Map<String,String> conditionMap = new HashMap<String, String>();
+        conditionMap.put("ruleOid",ruleOid);
+        String sql = " select a.oid as oid from " + BtmProvider.getInstance().getBTMTableName(BtmIdConstant.OS_CODE_ENUM_BTM_TYPE) + " a left join  "
+                + BtmProvider.getInstance().getBTMTableName(BtmIdConstant.OS_CODE_RULE_ELEMENT_BTM_TYPE) + " b on a.pkCodeRuleElement = b.oid where b.pkCodeRule = :ruleOid";
+        List<ClientBusinessObject> enumCbos = boService.queryBySql(sql, conditionMap);
+        if(CollectionUtils.isEmpty(enumCbos)){
+            return  new ArrayList<OsCodeEnumDO>();
+        }
+        List<String> oidList = new ArrayList<String>();
+        for(ClientBusinessObject cbo : enumCbos){
+            oidList.add(cbo.getOid());
+        }
+
+        return boService.selectByOidCollection(oidList,OsCodeEnumDO.class);
+    }
+
+    /**
+     * 鏍规嵁鍏冪礌鐨勪富閿幏鍙栨灇涓炬槧灏勭殑淇℃伅
+     *
+     * @param oidList 鍏冪礌涓婚敭鐨勫垪琛�
+     * @return 鏋氫妇鏄犲皠鐨勪俊鎭�
+     */
+    @Override
+    public List<OsCodeEnumDO> selectByElementOidCollection(Collection<String> oidList) {
+        VciBaseUtil.alertNotNull(oidList,"鏄庣粏鐨勪富閿泦鍚�");
+        //涓嶆壘杩�1000涓殑
+        Map<String,String> conditionMap = new HashMap<String, String>();
+    conditionMap.put("pkCodeRuleElement", QueryOptionConstant.IN + "(" +  VciBaseUtil.toInSql(oidList.toArray(new String[0])) + ")");
+        return boService.queryObject(OsCodeEnumDO.class,conditionMap);
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/OsCodeGenSchemaDaoImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/OsCodeGenSchemaDaoImpl.java
new file mode 100644
index 0000000..7a8e7f8
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/OsCodeGenSchemaDaoImpl.java
@@ -0,0 +1,128 @@
+package com.vci.web.dao.impl;
+
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.web.dao.OsCodeGenSchemaDaoI;
+import com.vci.web.model.OsCodeGenSchemaDO;
+import com.vci.web.service.OsLinkTypeServiceI;
+import com.vci.web.service.WebBoServiceI;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.Map;
+
+import static com.vci.frameworkcore.constant.FrameWorkBusLangCodeConstant.DATA_OID_NOT_EXIST;
+
+
+/**
+ * 浠g爜鐢熸垚鍣ㄧ殑鍐呭
+ * @author weidy
+ * @date 2021/8/23
+ */
+@Repository
+public class OsCodeGenSchemaDaoImpl implements OsCodeGenSchemaDaoI {
+
+    /**
+     * 涓氬姟绫诲瀷鎿嶄綔鐨勬湇鍔�
+     */
+    @Autowired
+    private WebBoServiceI boService;
+
+    /**
+     * 鐢熷懡鍛ㄦ湡鐨勬湇鍔�
+     */
+    @Autowired
+    private OsLinkTypeServiceI lifeCycleService;
+    /**
+     * 浣跨敤涓婚敭鍒犻櫎
+     *
+     * @param oid 涓婚敭
+     * @return 鍙楀奖鍝嶇殑涓暟
+     */
+    @Override
+    public int deleteByPrimaryKey(String oid) {
+        VciBaseUtil.alertNotNull(oid,"涓婚敭");
+        OsCodeGenSchemaDO osCodeGenSchemaDO = selectByPrimaryKey(oid);
+        boService.delete(osCodeGenSchemaDO);
+        return 1;
+    }
+
+    /**
+     * 鎻掑叆鏁版嵁
+     *
+     * @param record 鏁版嵁鐨勫璞�
+     * @return 鍙楀奖鍝嶇殑涓暟
+     */
+    @Override
+    public int insert(OsCodeGenSchemaDO record) {
+        VciBaseUtil.alertNotNull(record,"瑕佹坊鍔犵殑鏁版嵁");
+        boService.addSave(record);
+        return 1;
+    }
+
+    /**
+     * 浣跨敤涓婚敭鏌ヨ
+     *
+     * @param oid 涓婚敭
+     * @return 鏁版嵁瀵硅薄
+     */
+    @Override
+    public OsCodeGenSchemaDO selectByPrimaryKey(String oid) {
+        VciBaseUtil.alertNotNull(oid,"涓婚敭");
+        OsCodeGenSchemaDO schemaDO = boService.selectByOid(oid, OsCodeGenSchemaDO.class);
+        if(schemaDO == null || StringUtils.isBlank(schemaDO.getOid())){
+            throw new VciBaseException(DATA_OID_NOT_EXIST);
+        }
+        return schemaDO;
+    }
+
+    /**
+     * 鏌ヨ鍏ㄩ儴
+     *
+     * @return 鏁版嵁瀵硅薄
+     */
+    @Override
+    public List<OsCodeGenSchemaDO> selectAll() {
+        return boService.queryObject(OsCodeGenSchemaDO.class,null);
+    }
+
+    /**
+     * 浣跨敤涓婚敭鏇存柊
+     *
+     * @param record 鏁版嵁瀵硅薄
+     * @return 鍙楀奖鍝嶇殑琛屾暟
+     */
+    @Override
+    public int updateByPrimaryKey(OsCodeGenSchemaDO record) {
+        VciBaseUtil.alertNotNull(record,"瑕佷慨鏀圭殑瀵硅薄",record.getOid(),"涓婚敭");
+        boService.editSave(record);
+        return 1;
+    }
+
+    /**
+     * 鏍规嵁鏌ヨ鏉′欢鏌ヨ鏁版嵁
+     *
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param pageHelper   鍒嗛〉瀵硅薄
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+    @Override
+    public List<OsCodeGenSchemaDO> selectByWrapper(Map< String, String> conditionMap, PageHelper pageHelper) {
+        return boService.queryObject(OsCodeGenSchemaDO.class,conditionMap,pageHelper);
+    }
+
+    /**
+     * 鏍规嵁鏌ヨ鏉′欢鏉ユ煡璇㈡�绘暟
+     *
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @return 鎬绘暟
+     */
+    @Override
+    public Integer countByWrapper(Map<String, String> conditionMap) {
+        return boService.queryCount(OsCodeGenSchemaDO.class,conditionMap);
+    }
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/OsCodeRuleDaoImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/OsCodeRuleDaoImpl.java
new file mode 100644
index 0000000..806b8c3
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/OsCodeRuleDaoImpl.java
@@ -0,0 +1,238 @@
+package com.vci.web.dao.impl;
+
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.web.dao.OsCodeRuleDaoI;
+import com.vci.web.model.OsCodeRuleDO;
+import com.vci.web.pageModel.BatchCBO;
+import com.vci.web.service.OsLifeCycleServiceI;
+import com.vci.web.service.WebBoServiceI;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+import org.springframework.util.CollectionUtils;
+import plm.bs.bom.clientobject.ClientBusinessObject;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static com.vci.frameworkcore.constant.FrameWorkBusLangCodeConstant.DATA_OID_NOT_EXIST;
+
+
+/**
+ * Description:缂栫爜瑙勫垯鏁版嵁鎿嶄綔灞傚疄鐜扮被
+ *
+ * @author Lihang
+ * @date 2021/10/15 11:50
+ */
+@Repository
+public class OsCodeRuleDaoImpl implements OsCodeRuleDaoI {
+    /**
+     * 涓氬姟绫诲瀷鐨勬湇鍔�
+     */
+    @Autowired
+    private WebBoServiceI boService;
+
+    /**
+     * 鐢熷懡鍛ㄦ湡鐨勬湇鍔�
+     */
+    @Autowired
+    private OsLifeCycleServiceI lifeCycleService;
+    
+    /**
+     * 浣跨敤涓婚敭鍒犻櫎
+     * @param oid 鏁版嵁涓婚敭
+     * @return 鎵ц缁撴灉
+     */
+    @Override
+    public int deleteByPrimaryKey(String oid) {
+        VciBaseUtil.alertNotNull(oid,"涓婚敭");
+        OsCodeRuleDO codeBreakCodeDO = selectByPrimaryKey(oid);
+        this.boService.delete(codeBreakCodeDO);
+        return 1;
+    }
+
+    /**
+     * 娣诲姞鏁版嵁
+     * @param record 缂栫爜瑙勫垯鏁版嵁瀵硅薄
+     * @return 鎵ц缁撴灉
+     */
+    @Override
+    public int insert(OsCodeRuleDO record) {
+        VciBaseUtil.alertNotNull(record,"瑕佹坊鍔犵殑鏁版嵁");
+        boService.addSave(record);
+        return 1;
+    }
+
+    /**
+     * 鏍规嵁涓婚敭鏌ヨ
+     * @param oid 鏁版嵁涓婚敭
+     * @return 鏁版嵁瀵硅薄
+     */
+    @Override
+    public OsCodeRuleDO selectByPrimaryKey(String oid) {
+        VciBaseUtil.alertNotNull(oid,"涓婚敭");
+        OsCodeRuleDO record = boService.selectByOid(oid, OsCodeRuleDO.class);
+        if(record == null || StringUtils.isBlank(record.getOid())){
+            throw new VciBaseException(DATA_OID_NOT_EXIST);
+        }
+        return record;
+    }
+
+    /**
+     * 鏍规嵁涓婚敭鎵归噺鑾峰彇瀵硅薄
+     * @param oids 涓婚敭锛屽寘鍚崟寮曞彿,浣嗘槸涓嶈兘瓒呰繃1000
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+    @Override
+    public List<OsCodeRuleDO> selectByPrimaryKeys(String oids) {
+        VciBaseUtil.alertNotNull(oids,"涓婚敭闆嗗悎");
+        return boService.selectByOidCollection(VciBaseUtil.str2List(oids), OsCodeRuleDO.class);
+    }
+
+    /**
+     * 鏍规嵁涓婚敭鎵归噺鏌ヨ瀵硅薄
+     * @param oids 瀵硅薄涓婚敭,浣跨敤閫楀彿鍒嗛殧锛屼絾鏄笉鑳借秴杩�1000
+     * @return 涓氬姟瀵硅薄
+     */
+    @Override
+    public List<OsCodeRuleDO> selectByPrimaryKeyCollection(Collection<String> oids) {
+        VciBaseUtil.alertNotNull(oids,"涓婚敭闆嗗悎");
+        return boService.selectByOidCollection(oids, OsCodeRuleDO.class);
+    }
+
+    /**
+     * 鏌ヨ鎵�鏈夊垎绫�
+     * @return 鏌ヨ缁撴灉
+     */
+    @Override
+    public List<OsCodeRuleDO> selectAll() {
+        return boService.queryObject(OsCodeRuleDO.class,null);
+    }
+
+    /**
+     * 鏇存柊瀵硅薄
+     * @param record 缂栫爜瑙勫垯鏁版嵁瀵硅薄
+     * @return 鎵ц缁撴灉
+     */
+    @Override
+    public int updateByPrimaryKey(OsCodeRuleDO record) {
+        VciBaseUtil.alertNotNull(record,"瑕佷慨鏀圭殑瀵硅薄",record.getOid(),"涓婚敭");
+        boService.editSave(record);
+        return 1;
+    }
+
+    /**
+     * 鏍规嵁鏌ヨ鏉′欢鏌ヨ鏁版嵁
+     * @param condition 鏌ヨ鏉′欢锛�
+     * @param pageHelper 鍖呮嫭鍒嗛〉锛屾帓搴�
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+    @Override
+    public List<OsCodeRuleDO> selectByWrapper(Map<String, String> condition, PageHelper pageHelper) {
+        return boService.queryObject(OsCodeRuleDO.class,condition,pageHelper);
+    }
+
+    /**
+     * 鏍规嵁鏌ヨ鏉′欢鏉ユ煡璇㈡�绘暟
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @return 鎬绘暟
+     */
+    @Override
+    public String countByWrapper(Map<String, String> conditionMap) {
+        return VciBaseUtil.getLong(String.valueOf(boService.queryCount(OsCodeRuleDO.class,conditionMap)))+"";
+    }
+
+    /**
+     * 鏍规嵁涓婚敭鑾峰彇鍚嶇О
+     * @param oid 涓婚敭
+     * @return 涓枃鍚嶇О
+     */
+    @Override
+    public String selectNameByOid(String oid) {
+        return selectByPrimaryKey(oid).getName();
+    }
+
+    /**
+     * 鎵归噺淇敼鐢熷懡鍛ㄦ湡鐨勭姸鎬�
+     * @param oids 涓婚敭闆嗗悎锛屼笉鑳藉ぇ浜�1000
+     * @param lcStatus 鐢熷懡鍛ㄦ湡鐨勫��
+     * @return 鎵ц鐨勭粨鏋�
+     */
+    @Override
+    public long batchUpdateLcStatus(Collection<String> oids, String lcStatus) {
+        List<ClientBusinessObject> cbos = boService.selectCBOByOidCollection(oids, "oscoderule");
+        if(CollectionUtils.isEmpty(cbos)){
+            return 0;
+        }
+        lifeCycleService.transCboStatus(cbos,lcStatus);
+        return cbos.size();
+    }
+
+    /**
+     * 鏍规嵁涓婚敭鏇存柊鐘舵��
+     * @param oid 涓婚敭
+     * @param lcStatus 鐢熷懡鍛ㄦ湡鐘舵��
+     * @return 鍙楀奖鍝嶇殑琛屾暟
+     */
+    @Override
+    public int updateLcStatus(String oid, String lcStatus) {
+        ClientBusinessObject cbo = boService.selectCBOByOid(oid, "oscoderule");
+        if(cbo == null || StringUtils.isBlank(cbo.getOid())){
+            return 0;
+        }
+        lifeCycleService.transStatus(cbo.getBusinessObject(),lcStatus);
+        return 1;
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎瀵硅薄
+     * @param oids 瀵硅薄鐨勪富閿泦鍚�
+     * @return 鍙楀奖鍝嶇殑琛屾暟
+     */
+    @Override
+    public long batchDeleteByOids(Collection<String> oids) {
+        List<OsCodeRuleDO> dos = boService.selectByOidCollection(oids, OsCodeRuleDO.class);
+        BatchCBO batchCBO = boService.batchDelete(dos);
+        return batchCBO.getDeleteCbos().size();
+    }
+
+    /**
+     * 浣跨敤缂栧彿鏌ヨ
+     * @param id 缂栧彿
+     * @return 鏁版嵁瀵硅薄
+     */
+    @Override
+    public OsCodeRuleDO selectById(String id) {
+        VciBaseUtil.alertNotNull(id,"缂栧彿");
+        Map<String,String> condition = new HashMap<String, String>();
+        condition.put("id",id);
+        List<OsCodeRuleDO> codeRuleDOS = this.boService.queryObject(OsCodeRuleDO.class, condition);
+        if (CollectionUtils.isEmpty(codeRuleDOS)){
+            throw new VciBaseException("缂栫爜[{0}]鍦ㄧ郴缁熶腑涓嶅瓨鍦�",new String[]{id});
+        }
+        return codeRuleDOS.get(0);
+    }
+
+    /**
+     * 浣跨敤瑙勫垯鐨勬爣璇嗘煡璇�
+     * @param ownbizBtm 涓氬姟绫诲瀷
+     * @param useRuleFlag 瑙勫垯鐨勬爣璇�
+     * @return 鏁版嵁瀵硅薄
+     */
+    @Override
+    public OsCodeRuleDO selectByRuleFlag(String ownbizBtm, String useRuleFlag) {
+        VciBaseUtil.alertNotNull(ownbizBtm,"涓氬姟绫诲瀷",useRuleFlag,"瑙勫垯鏍囪瘑");
+        Map<String,String> conditionMap = new HashMap<String, String>();
+        conditionMap.put("ownbizbtm",ownbizBtm);
+        conditionMap.put("useruleflag",useRuleFlag);
+        List<OsCodeRuleDO> codeRuleDOS = this.boService.queryObject(OsCodeRuleDO.class, conditionMap);
+        if (CollectionUtils.isEmpty(codeRuleDOS)){
+            throw new VciBaseException("涓氬姟绫诲瀷[{0}]涓嬫病鏈夋壘鍒拌鍒欐爣璇嗕负[{1}]鐨勭紪鐮佽鍒�",new String[]{ownbizBtm,useRuleFlag});
+        }
+        return codeRuleDOS.get(0);
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/OsCodeRuleElementDaoImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/OsCodeRuleElementDaoImpl.java
new file mode 100644
index 0000000..9cb0c38
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/OsCodeRuleElementDaoImpl.java
@@ -0,0 +1,224 @@
+package com.vci.web.dao.impl;
+
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.web.dao.OsCodeRuleElementDaoI;
+import com.vci.web.model.OsCodeRuleElementDO;
+import com.vci.web.pageModel.BatchCBO;
+import com.vci.web.service.WebBoServiceI;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+import org.springframework.util.CollectionUtils;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static com.vci.frameworkcore.constant.FrameWorkBusLangCodeConstant.DATA_OID_NOT_EXIST;
+
+/**
+ * Description:缂栫爜瑙勫垯鏄庣粏鏁版嵁鎿嶄綔灞傚疄鐜扮被
+ *
+ * @author KangDong
+ * @date 2021/10/15 11:51
+ */
+@Repository
+public class OsCodeRuleElementDaoImpl implements OsCodeRuleElementDaoI {
+    /**
+     * 涓氬姟绫诲瀷鐨勬湇鍔�
+     */
+    @Autowired
+    private WebBoServiceI boService;
+
+    /**
+     * 浣跨敤涓婚敭鍒犻櫎
+     * @param oid 鏁版嵁涓婚敭
+     * @return 鎵ц缁撴灉
+     */
+    @Override
+    public int deleteByPrimaryKey(String oid) {
+        VciBaseUtil.alertNotNull(oid,"涓婚敭");
+        OsCodeRuleElementDO codeRuleElementDO = selectByPrimaryKey(oid);
+        this.boService.delete(codeRuleElementDO);
+        return 1;
+    }
+
+    /**
+     * 娣诲姞鏁版嵁
+     * @param record 缂栫爜瑙勫垯鏄庣粏鏁版嵁瀵硅薄
+     * @return 鎵ц缁撴灉
+     */
+    @Override
+    public int insert(OsCodeRuleElementDO record) {
+        VciBaseUtil.alertNotNull(record,"瑕佹坊鍔犵殑鏁版嵁");
+        this.boService.addSave(record);
+        return 1;
+    }
+
+    /**
+     * 鏍规嵁涓婚敭鏌ヨ
+     * @param oid 鏁版嵁涓婚敭
+     * @return 鏁版嵁瀵硅薄
+     */
+    @Override
+    public OsCodeRuleElementDO selectByPrimaryKey(String oid) {
+        VciBaseUtil.alertNotNull(oid,"涓婚敭");
+        OsCodeRuleElementDO record = this.boService.selectByOid(oid,OsCodeRuleElementDO.class);
+        if (record == null || StringUtils.isBlank(record.getOid())){
+            throw new VciBaseException(DATA_OID_NOT_EXIST);
+        }
+        return record;
+    }
+
+    /**
+     * 鏍规嵁涓婚敭鎵归噺鑾峰彇瀵硅薄
+     * @param oids 涓婚敭锛屽寘鍚崟寮曞彿,浣嗘槸涓嶈兘瓒呰繃1000
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+    @Override
+    public List<OsCodeRuleElementDO> selectByPrimaryKeys(String oids) {
+        VciBaseUtil.alertNotNull(oids,"涓婚敭闆嗗悎");
+        return this.boService.selectByOidCollection(VciBaseUtil.str2List(oids),OsCodeRuleElementDO.class);
+    }
+
+    /**
+     * 鏍规嵁涓婚敭鎵归噺鏌ヨ瀵硅薄
+     * @param oids 瀵硅薄涓婚敭,浣跨敤閫楀彿鍒嗛殧锛屼絾鏄笉鑳借秴杩�1000
+     * @return 涓氬姟瀵硅薄
+     */
+    @Override
+    public List<OsCodeRuleElementDO> selectByPrimaryKeyCollection(Collection<String> oids) {
+        VciBaseUtil.alertNotNull(oids,"涓婚敭闆嗗悎");
+        return this.boService.selectByOidCollection(oids,OsCodeRuleElementDO.class);
+    }
+
+    /**
+     * 鏌ヨ鎵�鏈夊垎绫�
+     * @return 鎵ц缁撴灉
+     */
+    @Override
+    public List<OsCodeRuleElementDO> selectAll() {
+        return this.boService.queryObject(OsCodeRuleElementDO.class,null);
+    }
+
+    /**
+     * 鏇存柊瀵硅薄
+     * @param record 鐗╂枡銆佸伐鍏峰熀鏈垎绫绘暟鎹璞�
+     * @return 鎵ц缁撴灉
+     */
+    @Override
+    public int updateByPrimaryKey(OsCodeRuleElementDO record) {
+        VciBaseUtil.alertNotNull(record,"瑕佷慨鏀圭殑瀵硅薄",record.getOid(),"涓婚敭");
+        this.boService.editSave(record);
+        return 1;
+    }
+
+    /**
+     * 鏍规嵁鏌ヨ鏉′欢鏌ヨ鏁版嵁
+     * @param condition 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉锛屾帓搴�
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+    @Override
+    public List<OsCodeRuleElementDO> selectByWrapper(Map<String, String> condition, PageHelper pageHelper) {
+        return this.boService.queryObject(OsCodeRuleElementDO.class,condition,pageHelper);
+    }
+
+    /**
+     * 鏍规嵁鏌ヨ鏉′欢鏉ユ煡璇㈡�绘暟
+     * @param condition 鏌ヨ鏉′欢
+     * @return 鎬绘暟
+     */
+    @Override
+    public String countByWrapper(Map<String, String> condition) {
+        return VciBaseUtil.getLong(String.valueOf(this.boService.queryCount(OsCodeRuleElementDO.class,condition))) + "";
+    }
+
+    /**
+     * 鏍规嵁涓婚敭鑾峰彇鍚嶇О
+     * @param oid 涓婚敭
+     * @return 涓枃鍚嶇О
+     */
+    @Override
+    public String selectNameByOid(String oid) {
+        return selectByPrimaryKey(oid).getName();
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎瀵硅薄
+     * @param oids 瀵硅薄鐨勪富閿泦鍚�
+     * @return 鍙楀奖鍝嶇殑琛屾暟
+     */
+    @Override
+    public long batchDeleteByOids(Collection<String> oids) {
+        List<OsCodeRuleElementDO> dos = this.boService.selectByOidCollection(oids, OsCodeRuleElementDO.class);
+        BatchCBO batchCBO = this.boService.batchDelete(dos);
+        return batchCBO.getDeleteCbos().size();
+    }
+
+    /**
+     * 浣跨敤瑙勫垯鏌ヨ鏄庣粏锛屼細鎸夌収搴忓彿鎺掑簭
+     * @param ruleOid 瑙勫垯鐨勪富閿�
+     * @return 鏄庣粏鏁版嵁瀵硅薄
+     */
+    @Override
+    public List<OsCodeRuleElementDO> selectByRuleOid(String ruleOid) {
+        VciBaseUtil.alertNotNull(ruleOid,"瑙勫垯涓婚敭");
+        Map<String,String> conditionMap = new HashMap<String, String>();
+        conditionMap.put("pkcoderule",ruleOid);
+        List<OsCodeRuleElementDO> dos = this.boService.queryObject(OsCodeRuleElementDO.class, conditionMap);
+        if (CollectionUtils.isEmpty(dos)){
+            return null;
+        }
+        return dos;
+    }
+
+    /**
+     * 鎵归噺娣诲姞鏁版嵁
+     * @param elementDOS 鍏冪礌鐨勬暟鎹璞�
+     * @return 鎵ц缁撴灉鏁�
+     */
+    @Override
+    public int batchInsert(List<OsCodeRuleElementDO> elementDOS) {
+        VciBaseUtil.alertNotNull(elementDOS,"瑕佹坊鍔犵殑鏁版嵁");
+        for (OsCodeRuleElementDO elementDO : elementDOS) {
+            elementDO.setCodeDateFormat(elementDO.getCodeDateFormat() == null ? "" : elementDO.getCodeDateFormat());
+            elementDO.setCodeElementType(elementDO.getCodeElementType() == null ? "" : elementDO.getCodeElementType());
+        }
+        BatchCBO batchCBO = this.boService.batchAddSave(elementDOS);
+        return batchCBO.getCreateCbos().size();
+    }
+
+    /**
+     * 浣跨敤缂栫爜瑙勫垯鍜屾帓搴忓彿鑾峰彇
+     *
+     * @param pkCodeRule 瑙勫垯
+     * @param orderIndex 鎺掑簭鍙�
+     * @return 鍐呭
+     */
+    @Override
+    public List<OsCodeRuleElementDO> selectByRuleOidAndIndex(String pkCodeRule, int orderIndex) {
+        Map<String,String> conditionMap = new HashMap<String, String>();
+        conditionMap.put("pkCodeRule",pkCodeRule);
+        conditionMap.put("ruleOrderNumber",orderIndex+"");
+        return boService.queryObject(OsCodeRuleElementDO.class,conditionMap);
+    }
+
+    /**
+     * 鑾峰彇缂栫爜瑙勫垯鏄庣粏瀵硅薄锛屽苟鎸夌収鎺掑簭鍙疯繘琛屾帓搴�
+     * @param pkCodeRule 瑙勫垯鐨勪富閿�
+     * @return 鎺掑簭鍚庣殑鏄庣粏瀵硅薄
+     */
+    @Override
+    public List<OsCodeRuleElementDO> selectByRuleOidOrderByRuleOrderNumber(String pkCodeRule) {
+        Map<String,String> conditionMap = new HashMap<String, String>();
+        conditionMap.put("pkCodeRule",pkCodeRule);
+        PageHelper ph = new PageHelper(-1);
+        ph.setSort("ruleordernumber");
+        ph.setOrder("asc");
+        return boService.queryObject(OsCodeRuleElementDO.class,conditionMap,ph);
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/OsCodeSerialNumberDaoImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/OsCodeSerialNumberDaoImpl.java
new file mode 100644
index 0000000..24eeb18
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/OsCodeSerialNumberDaoImpl.java
@@ -0,0 +1,194 @@
+package com.vci.web.dao.impl;
+
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.web.dao.OsCodeSerialNumberDaoI;
+import com.vci.web.model.OsCodeSerialNumberDO;
+import com.vci.web.pageModel.BatchCBO;
+import com.vci.web.service.WebBoServiceI;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+import org.springframework.util.CollectionUtils;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static com.vci.frameworkcore.constant.FrameWorkBusLangCodeConstant.DATA_OID_NOT_EXIST;
+
+/**
+ * Description:缂栫爜娴佹按鍙锋暟鎹搷浣滃眰瀹炵幇绫�
+ *
+ * @author Lihang
+ * @date 2021/10/15 11:51
+ */
+@Repository
+public class OsCodeSerialNumberDaoImpl implements OsCodeSerialNumberDaoI {
+    /**
+     * 涓氬姟绫诲瀷鐨勬湇鍔�
+     */
+    @Autowired
+    private WebBoServiceI boService;
+
+    /**
+     * 浣跨敤涓婚敭鍒犻櫎
+     * @param oid 鏁版嵁涓婚敭
+     * @return 鎵ц缁撴灉
+     */
+    @Override
+    public int deleteByPrimaryKey(String oid) {
+        VciBaseUtil.alertNotNull(oid,"涓婚敭");
+        OsCodeSerialNumberDO osCodeSerialNumberDO = selectByPrimaryKey(oid);
+        this.boService.delete(osCodeSerialNumberDO);
+        return 1;
+    }
+
+    /**
+     * 娣诲姞鏁版嵁
+     * @param record 缂栫爜瑙勫垯鏄庣粏鏁版嵁瀵硅薄
+     * @return 鎵ц缁撴灉
+     */
+    @Override
+    public int insert(OsCodeSerialNumberDO record) {
+        VciBaseUtil.alertNotNull(record,"瑕佹坊鍔犵殑鏁版嵁");
+        this.boService.addSave(record);
+        return 1;
+    }
+
+    /**
+     * 鏍规嵁涓婚敭鏌ヨ
+     * @param oid 鏁版嵁涓婚敭
+     * @return 鏁版嵁瀵硅薄
+     */
+    @Override
+    public OsCodeSerialNumberDO selectByPrimaryKey(String oid) {
+        VciBaseUtil.alertNotNull(oid,"涓婚敭");
+        OsCodeSerialNumberDO record = this.boService.selectByOid(oid, OsCodeSerialNumberDO.class);
+        if (record == null || StringUtils.isBlank(record.getOid())){
+            throw new VciBaseException(DATA_OID_NOT_EXIST);
+        }
+        return record;
+    }
+
+    /**
+     * 鏍规嵁涓婚敭鎵归噺鑾峰彇瀵硅薄
+     * @param oids 涓婚敭锛屽寘鍚崟寮曞彿,浣嗘槸涓嶈兘瓒呰繃1000
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+    @Override
+    public List<OsCodeSerialNumberDO> selectByPrimaryKeys(String oids) {
+        VciBaseUtil.alertNotNull(oids,"涓婚敭闆嗗悎");
+        return this.boService.selectByOidCollection(VciBaseUtil.str2List(oids),OsCodeSerialNumberDO.class);
+    }
+
+    /**
+     * 鏍规嵁涓婚敭鎵归噺鏌ヨ瀵硅薄
+     * @param oids 瀵硅薄涓婚敭,浣跨敤閫楀彿鍒嗛殧锛屼絾鏄笉鑳借秴杩�1000
+     * @return 涓氬姟瀵硅薄
+     */
+    @Override
+    public List<OsCodeSerialNumberDO> selectByPrimaryKeyCollection(Collection<String> oids) {
+        VciBaseUtil.alertNotNull(oids,"涓婚敭闆嗗悎");
+        return this.boService.selectByOidCollection(oids,OsCodeSerialNumberDO.class);
+    }
+
+    /**
+     * 鏌ヨ鎵�鏈夊垎绫�
+     * @return 鎵ц缁撴灉
+     */
+    @Override
+    public List<OsCodeSerialNumberDO> selectAll() {
+        return this.boService.queryObject(OsCodeSerialNumberDO.class,null);
+    }
+
+    /**
+     * 鏇存柊瀵硅薄
+     * @param record 鐗╂枡銆佸伐鍏峰熀鏈垎绫绘暟鎹璞�
+     * @return 鎵ц缁撴灉
+     */
+    @Override
+    public int updateByPrimaryKey(OsCodeSerialNumberDO record) {
+        VciBaseUtil.alertNotNull(record,"瑕佷慨鏀圭殑瀵硅薄",record.getOid(),"涓婚敭");
+        this.boService.editSave(record);
+        return 1;
+    }
+
+    /**
+     * 鏍规嵁鏌ヨ鏉′欢鏌ヨ鏁版嵁
+     * @param condition 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉锛屾帓搴�
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+    @Override
+    public List<OsCodeSerialNumberDO> selectByWrapper(Map<String, String> condition, PageHelper pageHelper) {
+        return this.boService.queryObject(OsCodeSerialNumberDO.class,condition,pageHelper);
+    }
+
+    /**
+     * 鏍规嵁鏌ヨ鏉′欢鏉ユ煡璇㈡�绘暟
+     * @param condition 鏌ヨ鏉′欢
+     * @return 鎬绘暟
+     */
+    @Override
+    public Long countByWrapper(Map<String, String> condition) {
+        return VciBaseUtil.getLong(String.valueOf(this.boService.queryCount(OsCodeSerialNumberDO.class,condition)));
+    }
+
+    /**
+     * 鏍规嵁涓婚敭鑾峰彇鍚嶇О
+     * @param oid 涓婚敭
+     * @return 涓枃鍚嶇О
+     */
+    @Override
+    public String selectNameByOid(String oid) {
+        return this.selectByPrimaryKey(oid).getName();
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎瀵硅薄
+     * @param oids 瀵硅薄鐨勪富閿泦鍚�
+     * @return 鍙楀奖鍝嶇殑琛屾暟
+     */
+    @Override
+    public long batchDeleteByOids(Collection<String> oids) {
+        List<OsCodeSerialNumberDO> dos = this.boService.selectByOidCollection(oids,OsCodeSerialNumberDO.class);
+        BatchCBO batchCBO = this.boService.batchDelete(dos);
+        return batchCBO.getDeleteCbos().size();
+    }
+
+    /**
+     * 瑙勫垯涓婚敭鍜屾祦姘翠緷鎹煡璇㈡渶澶ф祦姘村彿
+     * @param ruleOid 瑙勫垯鐨勪富閿�
+     * @param serialAccord 娴佹按渚濇嵁
+     * @return 鏁版嵁瀵硅薄
+     */
+    @Override
+    public OsCodeSerialNumberDO selectByAccordingAndRuleOid(String ruleOid, String serialAccord) {
+        VciBaseUtil.alertNotNull(ruleOid,"瑙勫垯涓婚敭",serialAccord,"娴佹按渚濇嵁");
+        Map<String,String> conditionMap = new HashMap<String, String>();
+        conditionMap.put("pkcoderule",ruleOid);
+        conditionMap.put("serialunit",serialAccord);
+        List<OsCodeSerialNumberDO> dos = this.boService.queryObject(OsCodeSerialNumberDO.class, conditionMap);
+        if (CollectionUtils.isEmpty(dos)){
+            return null;
+        }
+        return dos.get(0);
+    }
+
+    /**
+     * 浣跨敤瑙勫垯鐨勪富閿煡璇釜鏁�
+     * @param ruleOid 瑙勫垯鐨勪富閿�
+     * @return 鍖呭惈鐨勬暟閲�
+     */
+    @Override
+    public long countByRuleOid(String ruleOid) {
+        VciBaseUtil.alertNotNull(ruleOid,"瑙勫垯涓婚敭");
+        Map<String,String> conditionMap = new HashMap<String, String>();
+        conditionMap.put("pkcoderule",ruleOid);
+        List<OsCodeSerialNumberDO> dos = this.boService.queryObject(OsCodeSerialNumberDO.class, conditionMap);
+        return dos.size();
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/VciFileDocClassifyDaoImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/VciFileDocClassifyDaoImpl.java
new file mode 100644
index 0000000..bdbd9f3
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/VciFileDocClassifyDaoImpl.java
@@ -0,0 +1,206 @@
+package com.vci.web.dao.impl;
+
+import com.vci.file.constant.VciFileBtmTypeConstant;
+import com.vci.starter.web.constant.QueryOptionConstant;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.starter.web.wrapper.VciQueryWrapperForDO;
+import com.vci.web.dao.VciFileDocClassifyDaoI;
+import com.vci.web.model.VciFileDocClassifyDO;
+import com.vci.web.model.VciFileObjectDO;
+import com.vci.web.service.WebBoServiceI;
+import com.vci.web.util.WebUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+import org.springframework.util.CollectionUtils;
+
+import java.util.*;
+
+/**
+ * 鏂囨。鐨勭被鍨�
+ * @author weidy
+ * @date 2021/3/11
+ */
+@Repository
+public class VciFileDocClassifyDaoImpl implements VciFileDocClassifyDaoI {
+
+    /**
+     * 涓氬姟鏁版嵁瀵硅薄鐨勬湇鍔�
+     */
+    @Autowired
+    private WebBoServiceI boService;
+
+    /**
+     * 浣跨敤涓婚敭鍒犻櫎
+     *
+     * @param oid 鏁版嵁涓婚敭
+     * @return 鎵ц缁撴灉
+     */
+    @Override
+    public int deleteByPrimaryKey(String oid) {
+        VciBaseUtil.alertNotNull(oid,"鏂囨。绫诲瀷鐨勪富閿�");
+        boService.deleteByCondition(VciFileBtmTypeConstant.FILE_DOC_CLASSIFY, WebUtil.getOidQuery(oid));
+        return StringUtils.countMatches(oid,",") + 1;
+    }
+
+    /**
+     * 娣诲姞鏁版嵁
+     *
+     * @param record 鏂囨。鐨勭被鍨嬫暟鎹璞�
+     * @return 鎵ц缁撴灉
+     */
+    @Override
+    public int insert(VciFileDocClassifyDO record) {
+        VciBaseUtil.alertNotNull(record,"瑕佹坊鍔犵殑鍐呭");
+        if(StringUtils.isBlank(record.getOid())){
+            record.setOid(VciBaseUtil.getPk());
+        }
+        boService.addSave(record);
+        return 1;
+    }
+
+    /**
+     * 鏍规嵁涓婚敭鏌ヨ
+     *
+     * @param oid 鏁版嵁涓婚敭
+     * @return 鏁版嵁瀵硅薄
+     */
+    @Override
+    public VciFileDocClassifyDO selectByPrimaryKey(String oid) {
+        return boService.selectByOid(oid, VciFileDocClassifyDO.class);
+    }
+
+    /**
+     * 鏍规嵁涓婚敭鎵归噺鑾峰彇瀵硅薄
+     *
+     * @param oids 涓婚敭锛屽寘鍚崟寮曞彿,浣嗘槸涓嶈兘瓒呰繃1000
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+    @Override
+    public List<VciFileDocClassifyDO> selectByPrimaryKeys(String oids) {
+        return boService.selectByOidCollection(VciBaseUtil.str2List(oids),VciFileDocClassifyDO.class);
+    }
+
+    /**
+     * 鏍规嵁涓婚敭鎵归噺鏌ヨ瀵硅薄
+     *
+     * @param oids 瀵硅薄涓婚敭,浣跨敤閫楀彿鍒嗛殧锛屼絾鏄笉鑳借秴杩�1000
+     * @return 涓氬姟瀵硅薄
+     */
+    @Override
+    public List<VciFileDocClassifyDO> selectByPrimaryKeyCollection(Collection<String> oids) {
+        return boService.selectByOidCollection(oids,VciFileDocClassifyDO.class);
+    }
+
+    /**
+     * 鏌ヨ鎵�鏈夊垎绫�
+     *
+     * @return 鏌ヨ缁撴灉
+     */
+    @Override
+    public List<VciFileDocClassifyDO> selectAll() {
+        return boService.queryObject(VciFileDocClassifyDO.class,null);
+    }
+
+    /**
+     * 鏇存柊鐗╂枡銆佸伐鍏峰熀鏈垎绫�
+     *
+     * @param record 鐗╂枡銆佸伐鍏峰熀鏈垎绫绘暟鎹璞�
+     * @return 鎵ц缁撴灉
+     */
+    @Override
+    public int updateByPrimaryKey(VciFileDocClassifyDO record) {
+        VciBaseUtil.alertNotNull(record,"瑕佷慨鏀圭殑鍐呭",record.getOid(),"涓婚敭");
+        boService.editSave(record);
+        return 1;
+    }
+
+    /**
+     * 鏍规嵁鏌ヨ鏉′欢鏌ヨ鏁版嵁
+     *
+     * @param wrapper 鏌ヨ鏉′欢锛屽寘鎷垎椤碉紝鎺掑簭
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+    @Override
+    public List<VciFileDocClassifyDO> selectByWrapper(VciQueryWrapperForDO wrapper) {
+        return boService.selectByQueryWrapper(wrapper,VciFileDocClassifyDO.class);
+    }
+
+    /**
+     * 鏍规嵁鏌ヨ鏉′欢鏉ユ煡璇㈡�绘暟
+     *
+     * @param wrapper 鏌ヨ鏉′欢
+     * @return 鎬绘暟
+     */
+    @Override
+    public Long countByWrapper(VciQueryWrapperForDO wrapper) {
+        return Long.valueOf(boService.countByQueryWrapper(wrapper,VciFileDocClassifyDO.class));
+    }
+
+    /**
+     * 鏍规嵁涓婚敭鑾峰彇鍚嶇О
+     *
+     * @param oid 涓婚敭
+     * @return 涓枃鍚嶇О
+     */
+    @Override
+    public String selectNameByOid(String oid) {
+        VciFileDocClassifyDO fileObjectDO = selectByPrimaryKey(oid);
+        return fileObjectDO!=null?fileObjectDO.getName():"";
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎瀵硅薄
+     *
+     * @param oids 瀵硅薄鐨勪富閿泦鍚�
+     * @return 鍙楀嵃璞$殑琛屾暟
+     */
+    @Override
+    public long batchDeleteByOids(Collection<String> oids) {
+        VciBaseUtil.switchCollectionForOracleIn(oids).forEach(oidList->{
+            Map<String,String> conditionMap = new HashMap<>();
+            conditionMap.put("oid", QueryOptionConstant.IN + "(" + VciBaseUtil.toInSql(oidList.toArray(new String[0])) + ")");
+            boService.deleteByCondition(VciFileBtmTypeConstant.FILE_DOC_CLASSIFY,conditionMap);
+        });
+        return oids.size();
+    }
+
+    /**
+     * 浣跨敤缂栧彿鏌ヨ
+     *
+     * @param ids 缂栧彿
+     * @return 鏌ヨ缁撴灉
+     */
+    @Override
+    public List<VciFileDocClassifyDO> selectByIdCollection(Collection<String> ids) {
+        VciBaseUtil.alertNotNull(ids,"鏂囨。绫诲瀷鐨勭紪鍙�");
+        List<VciFileDocClassifyDO> doList = new ArrayList<>();
+        VciBaseUtil.switchCollectionForOracleIn(ids).stream().forEach(idList-> {
+            Map<String, String> conditionMap = new HashMap<>();
+            conditionMap.put("id", QueryOptionConstant.IN + "(" + VciBaseUtil.toInSql(idList.toArray(new String[0])) + ")");
+            List<VciFileDocClassifyDO> tempDOs = boService.queryObject(VciFileDocClassifyDO.class, conditionMap);
+            if(!CollectionUtils.isEmpty(tempDOs)){
+                doList.addAll(tempDOs);
+            }
+        });
+        return doList;
+    }
+
+    /**
+     * 浣跨敤缂栧彿鏌ヨ瀵硅薄
+     *
+     * @param id 缂栧彿
+     * @return 鏁版嵁瀵硅薄
+     */
+    @Override
+    public VciFileDocClassifyDO selectById(String id) {
+        VciBaseUtil.alertNotNull(id,"缂栧彿");
+        Map<String, String> conditionMap = new HashMap<>();
+        conditionMap.put("id", id);
+        List<VciFileDocClassifyDO> classifyDOS = boService.queryObject(VciFileDocClassifyDO.class, conditionMap);
+        if(!CollectionUtils.isEmpty(classifyDOS)){
+            return classifyDOS.get(0);
+        }
+        return null;
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/VciFileObjectDaoImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/VciFileObjectDaoImpl.java
new file mode 100644
index 0000000..ee7ece4
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/VciFileObjectDaoImpl.java
@@ -0,0 +1,255 @@
+package com.vci.web.dao.impl;
+
+import com.vci.file.constant.VciFileBtmTypeConstant;
+import com.vci.starter.web.constant.QueryOptionConstant;
+import com.vci.starter.web.enumpck.DataSecretEnum;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.starter.web.wrapper.VciQueryWrapperForDO;
+import com.vci.web.constant.WebLangCodeConstant;
+import com.vci.web.dao.VciFileObjectDaoI;
+import com.vci.web.model.VciFileObjectDO;
+import com.vci.web.service.WebBoServiceI;
+import com.vci.web.util.PlatformClientUtil;
+import com.vci.web.util.WebUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+import plm.bs.bom.clientobject.ClientBusinessObject;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 鏂囦欢瀵硅薄鐨勬暟鎹搷浣滅被
+ * @author weidy
+ * @date 2021/3/11
+ */
+@Repository
+public class VciFileObjectDaoImpl implements VciFileObjectDaoI {
+
+    /**
+     * 涓氬姟鏁版嵁瀵硅薄鐨勬湇鍔�
+     */
+    @Autowired
+    private WebBoServiceI boService;
+
+    /**
+     * 浣跨敤涓婚敭鍒犻櫎
+     *
+     * @param oid 鏁版嵁涓婚敭
+     * @return 鎵ц缁撴灉
+     */
+    @Override
+    public int deleteByPrimaryKey(String oid) {
+        VciBaseUtil.alertNotNull(oid,"鏂囦欢鐨勪富閿�");
+        boService.deleteByCondition(VciFileBtmTypeConstant.FILE_OBJECT, WebUtil.getOidQuery(oid));
+        return StringUtils.countMatches(oid,",") + 1;
+    }
+
+    /**
+     * 娣诲姞鏁版嵁
+     *
+     * @param record 鏂囦欢瀵硅薄鏁版嵁瀵硅薄
+     * @return 鎵ц缁撴灉
+     */
+    @Override
+    public int insert(VciFileObjectDO record) {
+        VciBaseUtil.alertNotNull(record,"瑕佹坊鍔犵殑鍐呭");
+        if(StringUtils.isBlank(record.getOid())){
+            record.setOid(VciBaseUtil.getPk());
+        }
+        boService.addSave(record);
+        return 1;
+    }
+
+    /**
+     * 鏍规嵁涓婚敭鏌ヨ
+     *
+     * @param oid 鏁版嵁涓婚敭
+     * @return 鏁版嵁瀵硅薄
+     */
+    @Override
+    public VciFileObjectDO selectByPrimaryKey(String oid) {
+        return boService.selectByOid(oid,VciFileObjectDO.class);
+    }
+
+    /**
+     * 鏍规嵁涓婚敭鎵归噺鑾峰彇瀵硅薄
+     *
+     * @param oids 涓婚敭锛屽寘鍚崟寮曞彿,浣嗘槸涓嶈兘瓒呰繃1000
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+    @Override
+    public List<VciFileObjectDO> selectByPrimaryKeys(String oids) {
+        return boService.selectByOidCollection(VciBaseUtil.str2List(oids),VciFileObjectDO.class);
+    }
+
+    /**
+     * 鏍规嵁涓婚敭鎵归噺鏌ヨ瀵硅薄
+     *
+     * @param oids 瀵硅薄涓婚敭,浣跨敤閫楀彿鍒嗛殧锛屼絾鏄笉鑳借秴杩�1000
+     * @return 涓氬姟瀵硅薄
+     */
+    @Override
+    public List<VciFileObjectDO> selectByPrimaryKeyCollection(Collection<String> oids) {
+        return boService.selectByOidCollection(oids,VciFileObjectDO.class);
+    }
+
+    /**
+     * 鏌ヨ鎵�鏈夊垎绫�
+     *
+     * @return 鏌ヨ缁撴灉
+     */
+    @Override
+    public List<VciFileObjectDO> selectAll() {
+        return boService.queryObject(VciFileObjectDO.class,null);
+    }
+
+    /**
+     * 鏇存柊鐗╂枡銆佸伐鍏峰熀鏈垎绫�
+     *
+     * @param record 鐗╂枡銆佸伐鍏峰熀鏈垎绫绘暟鎹璞�
+     * @return 鎵ц缁撴灉
+     */
+    @Override
+    public int updateByPrimaryKey(VciFileObjectDO record) {
+        VciBaseUtil.alertNotNull(record,"瑕佷慨鏀圭殑鍐呭",record.getOid(),"涓婚敭");
+        boService.editSave(record);
+        return 1;
+    }
+
+    /**
+     * 鏍规嵁鏌ヨ鏉′欢鏌ヨ鏁版嵁
+     *
+     * @param wrapper 鏌ヨ鏉′欢锛屽寘鎷垎椤碉紝鎺掑簭
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+    @Override
+    public List<VciFileObjectDO> selectByWrapper(VciQueryWrapperForDO wrapper) {
+        return boService.selectByQueryWrapper(wrapper,VciFileObjectDO.class);
+    }
+
+    /**
+     * 鏍规嵁鏌ヨ鏉′欢鏉ユ煡璇㈡�绘暟
+     *
+     * @param wrapper 鏌ヨ鏉′欢
+     * @return 鎬绘暟
+     */
+    @Override
+    public Long countByWrapper(VciQueryWrapperForDO wrapper) {
+        return Long.valueOf(boService.countByQueryWrapper(wrapper,VciFileObjectDO.class));
+    }
+
+    /**
+     * 鏍规嵁涓婚敭鑾峰彇鍚嶇О
+     *
+     * @param oid 涓婚敭
+     * @return 涓枃鍚嶇О
+     */
+    @Override
+    public String selectNameByOid(String oid) {
+        VciFileObjectDO fileObjectDO = selectByPrimaryKey(oid);
+        return fileObjectDO!=null?fileObjectDO.getName():"";
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎瀵硅薄
+     *
+     * @param oids 瀵硅薄鐨勪富閿泦鍚�
+     * @return 鍙楀嵃璞$殑琛屾暟
+     */
+    @Override
+    public long batchDeleteByOids(Collection<String> oids) {
+        VciBaseUtil.switchCollectionForOracleIn(oids).forEach(oidList->{
+            Map<String,String> conditionMap = new HashMap<>();
+            conditionMap.put("oid", QueryOptionConstant.IN + "(" + VciBaseUtil.toInSql(oidList.toArray(new String[0])) + ")");
+            boService.deleteByCondition(VciFileBtmTypeConstant.FILE_OBJECT,conditionMap);
+        });
+        return oids.size();
+    }
+
+    /**
+     * 鎵归噺鎻掑叆
+     *
+     * @param resultList 淇濆瓨瀵硅薄闆嗗悎
+     * @return 鍙楀奖鍝嶇殑琛屾暟
+     */
+    @Override
+    public int batchInsert(Collection<VciFileObjectDO> resultList) {
+        VciBaseUtil.alertNotNull(resultList,"鎵归噺鎻掑叆鐨�");
+        boService.batchAddSave(resultList.stream().collect(Collectors.toList()));
+        return resultList.size();
+    }
+
+    /**
+     * 鎵归噺鏇存柊
+     *
+     * @param updateList 鏇存柊瀵硅薄闆嗗悎
+     * @return 鍙楀奖鍝嶇殑琛屾暟
+     */
+    @Override
+    public int batchUpdateByPrimaryKey(Collection<VciFileObjectDO> updateList) {
+        VciBaseUtil.alertNotNull(updateList,"鎵归噺淇敼鐨�");
+        boService.batchEditSave(updateList.stream().collect(Collectors.toList()));
+        return updateList.size();
+    }
+
+    /**
+     * 鏍规嵁鍏抽敭淇℃伅鑾峰彇鏂囦欢淇℃伅
+     *
+     * @param keyInfo 鍏抽敭淇℃伅
+     * @return 鏁版嵁瀵硅薄
+     */
+    @Override
+    public List<VciFileObjectDO> selectByKeyInfo(String keyInfo) {
+        Map<String,String> conditionMap = new HashMap<>();
+        conditionMap.put("keyinfo", keyInfo);
+        return boService.queryObject(VciFileObjectDO.class,conditionMap);
+    }
+
+    /**
+     * 璁$畻鏂囦欢鐨勫悕绉扮殑涓暟
+     *
+     * @param fileNameNoExtension 鏂囦欢鍚嶇О锛屼笉鍖呭惈鍚庣紑鍚�
+     * @param fileExtension       鏂囦欢鐨勫悗缂�鍚�
+     * @param ownbizOid           涓氬姟鏁版嵁涓婚敭
+     * @param updateFileFlag      鏄惁涓轰慨鏀癸紙淇敼鐨勬椂闇�瑕佹姏鍑哄綋鍓嶄富閿�)
+     * @param oid                 淇敼鐨勬椂鍊欐枃浠朵富閿�
+     * @return 鍖呭惈鐨勪釜鏁�
+     */
+    @Override
+    public int countSameName(String fileNameNoExtension, String fileExtension, String ownbizOid, boolean updateFileFlag, String oid) {
+        Map<String,String> conditionMap = new HashMap<>();
+        conditionMap.put("ownbizOid", ownbizOid);
+        conditionMap.put("name", fileNameNoExtension);
+        conditionMap.put("fileExtension", fileExtension);
+        if(updateFileFlag && StringUtils.isNotBlank(oid)){
+            conditionMap.put("oid", QueryOptionConstant.NOTEQUAL + oid);
+        }
+        return boService.queryCount( VciFileBtmTypeConstant.FILE_OBJECT,conditionMap);
+    }
+
+    /**
+     * 鑾峰彇鏁版嵁鐨勫瘑绾�
+     *
+     * @param ownbizOid 涓氬姟鏁版嵁鐨勪富閿�
+     * @param ownbizBtm 涓氬姟绫诲瀷鍚嶇О
+     * @return 瀵嗙骇鐨勫��
+     */
+    @Override
+    public String selectSecret(String ownbizOid, String ownbizBtm) {
+        if(StringUtils.isNotBlank(ownbizOid) && StringUtils.isNotBlank(ownbizBtm)){
+            //鏍¢獙鏁版嵁鐨勫瘑绾�
+            ClientBusinessObject cbo = boService.selectCBOByOid(ownbizOid, ownbizBtm);
+            if(cbo !=null && StringUtils.isNotBlank(cbo.getOid())){
+                //鏈夊彲鑳芥槸鍏堜笂浼犳枃浠讹紝鎵�浠ユ垜浠繖涓笉鍒ゆ柇鏄惁瀛樺湪
+                return  cbo.getAttributeValue("secretgrade");
+            }
+        }
+        return null;
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/VciFileVolumeDaoImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/VciFileVolumeDaoImpl.java
new file mode 100644
index 0000000..4bd99c0
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/VciFileVolumeDaoImpl.java
@@ -0,0 +1,182 @@
+package com.vci.web.dao.impl;
+
+import com.vci.file.constant.VciFileBtmTypeConstant;
+import com.vci.starter.web.constant.QueryOptionConstant;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.starter.web.wrapper.VciQueryWrapperForDO;
+import com.vci.web.dao.VciFileVolumeDaoI;
+import com.vci.web.model.VciFileObjectDO;
+import com.vci.web.model.VciFileVolumeDO;
+import com.vci.web.service.WebBoServiceI;
+import com.vci.web.util.WebUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+import org.springframework.util.CollectionUtils;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 鏂囦欢鏌滅殑鏁版嵁鎿嶄綔灞�
+ * @author weidy
+ * @date 2021/3/11
+ */
+@Repository
+public class VciFileVolumeDaoImpl implements VciFileVolumeDaoI {
+
+    /**
+     * 涓氬姟鏁版嵁瀵硅薄鐨勬湇鍔�
+     */
+    @Autowired
+    private WebBoServiceI boService;
+    /**
+     * 浣跨敤涓婚敭鍒犻櫎
+     *
+     * @param oid 鏁版嵁涓婚敭
+     * @return 鎵ц缁撴灉
+     */
+    @Override
+    public int deleteByPrimaryKey(String oid) {
+        VciBaseUtil.alertNotNull(oid,"鏂囦欢鐨勪富閿�");
+        boService.deleteByCondition(VciFileBtmTypeConstant.FILE_VOLUME, WebUtil.getOidQuery(oid));
+        return StringUtils.countMatches(oid,",") + 1;
+    }
+
+    /**
+     * 娣诲姞鏁版嵁
+     *
+     * @param record 鏂囦粨绠$悊鏁版嵁瀵硅薄
+     * @return 鎵ц缁撴灉
+     */
+    @Override
+    public int insert(VciFileVolumeDO record) {
+        VciBaseUtil.alertNotNull(record,"瑕佹坊鍔犵殑鍐呭");
+        if(StringUtils.isBlank(record.getOid())){
+            record.setOid(VciBaseUtil.getPk());
+        }
+        boService.addSave(record);
+        return 1;
+    }
+
+    /**
+     * 鏍规嵁涓婚敭鏌ヨ
+     *
+     * @param oid 鏁版嵁涓婚敭
+     * @return 鏁版嵁瀵硅薄
+     */
+    @Override
+    public VciFileVolumeDO selectByPrimaryKey(String oid) {
+        return boService.selectByOid(oid, VciFileVolumeDO.class);
+    }
+
+    /**
+     * 鏍规嵁涓婚敭鎵归噺鑾峰彇瀵硅薄
+     *
+     * @param oids 涓婚敭锛屽寘鍚崟寮曞彿,浣嗘槸涓嶈兘瓒呰繃1000
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+    @Override
+    public List<VciFileVolumeDO> selectByPrimaryKeys(String oids) {
+        return boService.selectByOidCollection(VciBaseUtil.str2List(oids),VciFileVolumeDO.class);
+    }
+
+    /**
+     * 鏍规嵁涓婚敭鎵归噺鏌ヨ瀵硅薄
+     *
+     * @param oids 瀵硅薄涓婚敭,浣跨敤閫楀彿鍒嗛殧锛屼絾鏄笉鑳借秴杩�1000
+     * @return 涓氬姟瀵硅薄
+     */
+    @Override
+    public List<VciFileVolumeDO> selectByPrimaryKeyCollection(Collection<String> oids) {
+        return boService.selectByOidCollection(oids,VciFileVolumeDO.class);
+    }
+
+    /**
+     * 鏌ヨ鎵�鏈夊垎绫�
+     *
+     * @return 鏌ヨ缁撴灉
+     */
+    @Override
+    public List<VciFileVolumeDO> selectAll() {
+        return boService.queryObject(VciFileVolumeDO.class,null);
+    }
+
+    /**
+     * 鏇存柊鐗╂枡銆佸伐鍏峰熀鏈垎绫�
+     *
+     * @param record 鐗╂枡銆佸伐鍏峰熀鏈垎绫绘暟鎹璞�
+     * @return 鎵ц缁撴灉
+     */
+    @Override
+    public int updateByPrimaryKey(VciFileVolumeDO record) {
+        VciBaseUtil.alertNotNull(record,"瑕佷慨鏀圭殑鍐呭",record.getOid(),"涓婚敭");
+        boService.editSave(record);
+        return 1;
+    }
+
+    /**
+     * 鏍规嵁鏌ヨ鏉′欢鏌ヨ鏁版嵁
+     *
+     * @param wrapper 鏌ヨ鏉′欢锛屽寘鎷垎椤碉紝鎺掑簭
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+    @Override
+    public List<VciFileVolumeDO> selectByWrapper(VciQueryWrapperForDO wrapper) {
+        return boService.selectByQueryWrapper(wrapper,VciFileVolumeDO.class);
+    }
+
+    /**
+     * 鏍规嵁鏌ヨ鏉′欢鏉ユ煡璇㈡�绘暟
+     *
+     * @param wrapper 鏌ヨ鏉′欢
+     * @return 鎬绘暟
+     */
+    @Override
+    public Long countByWrapper(VciQueryWrapperForDO wrapper) {
+        return Long.valueOf(boService.countByQueryWrapper(wrapper,VciFileVolumeDO.class));
+    }
+
+    /**
+     * 鏍规嵁涓婚敭鑾峰彇鍚嶇О
+     *
+     * @param oid 涓婚敭
+     * @return 涓枃鍚嶇О
+     */
+    @Override
+    public String selectNameByOid(String oid) {
+        VciFileVolumeDO fileObjectDO = selectByPrimaryKey(oid);
+        return fileObjectDO!=null?fileObjectDO.getName():"";
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎瀵硅薄
+     *
+     * @param oids 瀵硅薄鐨勪富閿泦鍚�
+     * @return 鍙楀嵃璞$殑琛屾暟
+     */
+    @Override
+    public long batchDeleteByOids(Collection<String> oids) {
+        VciBaseUtil.switchCollectionForOracleIn(oids).forEach(oidList->{
+            Map<String,String> conditionMap = new HashMap<>();
+            conditionMap.put("oid", QueryOptionConstant.IN + "(" + VciBaseUtil.toInSql(oidList.toArray(new String[0])) + ")");
+            boService.deleteByCondition(VciFileBtmTypeConstant.FILE_VOLUME,conditionMap);
+        });
+        return oids.size();
+    }
+
+    /**
+     * 鏇存柊浣跨敤鐨勫閲�
+     *
+     * @param oid        涓婚敭
+     * @param usedVolume 浣跨敤鐨勫閲�
+     * @return 鍙楀奖鍝嶇殑琛屾暟
+     */
+    @Override
+    public int updateUsedVolume(String oid, String usedVolume) {
+        //杩欎釜鏆傛椂娌℃湁
+        return 0;
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/WFWorkflowNodeFavDaoImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/WFWorkflowNodeFavDaoImpl.java
new file mode 100644
index 0000000..a520234
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/WFWorkflowNodeFavDaoImpl.java
@@ -0,0 +1,223 @@
+package com.vci.web.dao.impl;
+
+import com.vci.frameworkcore.constant.FrameWorkBusLangCodeConstant;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.starter.web.wrapper.VciQueryWrapperForDO;
+import com.vci.web.dao.WFWorkflowNodeFavDaoI;
+import com.vci.web.model.WFWorkflowNodeFavDO;
+import com.vci.web.pageModel.BatchCBO;
+import com.vci.web.service.OsLifeCycleServiceI;
+import com.vci.web.service.WebBoServiceI;
+import com.vci.web.util.PlatformClientUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 娴佺▼璐熻矗浜烘敹钘忔暟鎹搷浣滃眰瀹炵幇绫�
+ *
+ * @author: KangDong
+ * @date: Created on 2022/4/29
+ */
+@Repository
+public class WFWorkflowNodeFavDaoImpl implements WFWorkflowNodeFavDaoI {
+
+    /**
+     * 涓氬姟绫诲瀷鎿嶄綔鐨勬湇鍔�
+     */
+    @Autowired
+    private WebBoServiceI boService;
+
+    /**
+     * 鐢熷懡鍛ㄦ湡鐨勬湇鍔�
+     */
+    @Autowired
+    private OsLifeCycleServiceI lifeCycleService;
+
+    /**
+     * 骞冲彴鐨勫鎴风
+     */
+    @Autowired
+    private PlatformClientUtil platformClientUtil;
+
+
+    /**
+     * 浣跨敤涓婚敭鍒犻櫎
+     * @param oid 鏁版嵁涓婚敭
+     * @return 鎵ц缁撴灉
+     */
+    @Override
+    public BatchCBO deleteByPrimaryKey(String oid) {
+        VciBaseUtil.alertNotNull(oid,"涓婚敭");
+        WFWorkflowNodeFavDO wfWorkflowNodeFavDO = selectByPrimaryKey(oid);
+        return boService.delete(wfWorkflowNodeFavDO);
+    }
+
+    /**
+     * 娣诲姞鏁版嵁
+     * @param record 娴佺▼璐熻矗浜烘敹钘忔暟鎹璞�
+     * @return 鎵ц缁撴灉
+     */
+    @Override
+    public BatchCBO insert(WFWorkflowNodeFavDO record) {
+        VciBaseUtil.alertNotNull(record,"瑕佹坊鍔犵殑鏁版嵁");
+        return boService.addSave(record);
+    }
+
+    /**
+     * 鎵归噺娣诲姞鏁版嵁
+     * @param records 娴佺▼璐熻矗浜烘敹钘忔暟鎹璞¢泦鍚�
+     * @return 鎵ц缁撴灉鏁�
+     */
+    @Override
+    public BatchCBO batchInsert(List<WFWorkflowNodeFavDO> records) {
+        VciBaseUtil.alertNotNull(records,"瑕佹坊鍔犵殑鏁版嵁");
+        BatchCBO batchCBO = boService.batchAddSave(records);
+        return batchCBO;
+    }
+
+    /**
+     * 鏍规嵁涓婚敭鏌ヨ
+     * @param oid 鏁版嵁涓婚敭
+     * @return 鏁版嵁瀵硅薄
+     */
+    @Override
+    public WFWorkflowNodeFavDO selectByPrimaryKey(String oid) {
+        VciBaseUtil.alertNotNull(oid,"涓婚敭");
+        WFWorkflowNodeFavDO record = boService.selectByOid(oid, WFWorkflowNodeFavDO.class);
+        if (record == null || StringUtils.isBlank(record.getOid())){
+            throw new VciBaseException(FrameWorkBusLangCodeConstant.DATA_OID_NOT_EXIST);
+        }
+        return record;
+    }
+
+    /**
+     * 鏍规嵁涓婚敭鎵归噺鑾峰彇瀵硅薄
+     * @param oids 涓婚敭锛屽寘鍚崟寮曞彿,浣嗘槸涓嶈兘瓒呰繃1000
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+    @Override
+    public List<WFWorkflowNodeFavDO> selectByPrimaryKeys(String oids) {
+        VciBaseUtil.alertNotNull(oids,"涓婚敭闆嗗悎");
+        return boService.selectByOidCollection(VciBaseUtil.str2List(oids),WFWorkflowNodeFavDO.class);
+    }
+
+    /**
+     * 鏍规嵁涓婚敭鎵归噺鏌ヨ瀵硅薄
+     * @param oids 瀵硅薄涓婚敭,浣跨敤閫楀彿鍒嗛殧锛屼絾鏄笉鑳借秴杩�1000
+     * @return 涓氬姟瀵硅薄
+     */
+    @Override
+    public List<WFWorkflowNodeFavDO> selectByPrimaryKeyCollection(Collection<String> oids) {
+        VciBaseUtil.alertNotNull(oids,"涓婚敭闆嗗悎");
+        return boService.selectByOidCollection(oids,WFWorkflowNodeFavDO.class);
+    }
+
+    /**
+     * 鏌ヨ鎵�鏈夊垎绫�
+     * @return 鏌ヨ缁撴灉
+     */
+    @Override
+    public List<WFWorkflowNodeFavDO> selectAll() {
+        return boService.queryObject(WFWorkflowNodeFavDO.class,null);
+    }
+
+    /**
+     * 鏇存柊瀵硅薄
+     * @param record 娴佺▼璐熻矗浜烘敹钘忔暟鎹璞�
+     * @return 鎵ц缁撴灉
+     */
+    @Override
+    public BatchCBO updateByPrimaryKey(WFWorkflowNodeFavDO record) {
+        VciBaseUtil.alertNotNull(record,"瑕佷慨鏀圭殑瀵硅薄",record.getOid(),"涓婚敭");
+        return boService.editSave(record);
+    }
+
+    /**
+     * 鎵归噺鏇存柊
+     * @param records 娴佺▼璐熻矗浜烘敹钘忔暟鎹璞¢泦鍚�
+     * @return 鎵ц缁撴灉琛屾暟
+     */
+    @Override
+    public BatchCBO batchUpdate(List<WFWorkflowNodeFavDO> records) {
+        VciBaseUtil.alertNotNull(records,"瑕佷慨鏀圭殑瀵硅薄");
+        BatchCBO batchCBO = boService.batchEditSave(records);
+        return batchCBO;
+    }
+
+    /**
+     * 鏍规嵁鏌ヨ鏉′欢鏌ヨ鏁版嵁
+     * @param wrapper 鏌ヨ鏉′欢锛屽寘鎷垎椤碉紝鎺掑簭
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+    @Override
+    public List<WFWorkflowNodeFavDO> selectByWrapper(VciQueryWrapperForDO wrapper) {
+        return boService.selectByQueryWrapper(wrapper,WFWorkflowNodeFavDO.class);
+    }
+
+    /**
+     * 鏍规嵁鏌ヨ鏉′欢鏉ユ煡璇㈡�绘暟
+     * @param wrapper 鏌ヨ鏉′欢
+     * @return 鎬绘暟
+     */
+    @Override
+    public Long countByWrapper(VciQueryWrapperForDO wrapper) {
+        return VciBaseUtil.getLong(String.valueOf(boService.countByQueryWrapper(wrapper,WFWorkflowNodeFavDO.class)));
+    }
+
+    /**
+     * 鏍规嵁涓婚敭鑾峰彇鍚嶇О
+     * @param oid 涓婚敭
+     * @return 涓枃鍚嶇О
+     */
+    @Override
+    public String selectNameByOid(String oid) {
+        return selectByPrimaryKey(oid).getName();
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎瀵硅薄
+     * @param oids 瀵硅薄鐨勪富閿泦鍚�
+     * @return 鍙楀奖鍝嶇殑琛屾暟
+     */
+    @Override
+    public BatchCBO batchDeleteByOids(Collection<String> oids) {
+        VciBaseUtil.alertNotNull(oids,"涓婚敭");
+        List<WFWorkflowNodeFavDO> dos = boService.selectByOidCollection(oids, WFWorkflowNodeFavDO.class);
+        BatchCBO batchCBO = boService.batchDelete(dos);
+        return batchCBO;
+    }
+
+    /**
+     * 浣跨敤鍚嶇О鏌ヨ
+     * @param name 鏂规鐨勫悕绉�
+     * @param userId 鐢ㄦ埛鍚�
+     * @param templateRev 妯℃澘鐨勭増鏈�
+     * @param id 妯℃澘鐨勪富閿�
+     * @return 鏁版嵁瀵硅薄
+     */
+    @Override
+    public WFWorkflowNodeFavDO selectByName(String name, String userId, String id, String templateRev) {
+        VciBaseUtil.alertNotNull(name,"鏂规鍚嶇О",userId,"鐢ㄦ埛鍚�");
+        Map<String,String> conditionMap = new HashMap<>();
+        conditionMap.put("name",name);
+        conditionMap.put("userid",userId);
+        if (StringUtils.isNotBlank(id)){
+            conditionMap.put("id",id);
+        }
+        if (StringUtils.isNotBlank(templateRev)) {
+            conditionMap.put("wfTemplateRev", templateRev);
+        }
+        List<WFWorkflowNodeFavDO> dos = boService.queryObject(WFWorkflowNodeFavDO.class, conditionMap);
+        if (dos.size() == 0){
+            return null;
+        }
+        return dos.get(0);
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/WFWorkflowNodeFavItemDaoImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/WFWorkflowNodeFavItemDaoImpl.java
new file mode 100644
index 0000000..b433fc5
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/WFWorkflowNodeFavItemDaoImpl.java
@@ -0,0 +1,206 @@
+package com.vci.web.dao.impl;
+
+import com.vci.frameworkcore.constant.FrameWorkBusLangCodeConstant;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.starter.web.wrapper.VciQueryWrapperForDO;
+import com.vci.web.dao.WFWorkflowNodeFavItemDaoI;
+import com.vci.web.model.WFWorkflowNodeFavItemDO;
+import com.vci.web.pageModel.BatchCBO;
+import com.vci.web.service.OsLifeCycleServiceI;
+import com.vci.web.service.WebBoServiceI;
+import com.vci.web.util.PlatformClientUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Description:娴佺▼鏀惰棌鑺傜偣鏄庣粏鏁版嵁鎿嶄綔灞傚疄鐜扮被
+ *
+ * @author: KangDong
+ * @date: Created on 2022/4/29
+ */
+@Repository
+public class WFWorkflowNodeFavItemDaoImpl implements WFWorkflowNodeFavItemDaoI {
+    /**
+     * 涓氬姟绫诲瀷鎿嶄綔鐨勬湇鍔�
+     */
+    @Autowired
+    private WebBoServiceI boService;
+
+    /**
+     * 鐢熷懡鍛ㄦ湡鐨勬湇鍔�
+     */
+    @Autowired
+    private OsLifeCycleServiceI lifeCycleService;
+
+    /**
+     * 骞冲彴鐨勫鎴风
+     */
+    @Autowired
+    private PlatformClientUtil platformClientUtil;
+
+    /**
+     * 浣跨敤涓婚敭鍒犻櫎
+     * @param oid 鏁版嵁涓婚敭
+     * @return 鎵ц缁撴灉
+     */
+    @Override
+    public BatchCBO deleteByPrimaryKey(String oid){
+        VciBaseUtil.alertNotNull(oid,"涓婚敭");
+        WFWorkflowNodeFavItemDO wfWorkflowNodeFavItemDO = selectByPrimaryKey(oid);
+        return boService.delete(wfWorkflowNodeFavItemDO);
+    }
+
+    /**
+     * 娣诲姞鏁版嵁
+     * @param record 娴佺▼鏀惰棌鑺傜偣鏄庣粏鏁版嵁瀵硅薄
+     * @return 鎵ц缁撴灉
+     */
+    @Override
+    public BatchCBO insert(WFWorkflowNodeFavItemDO record){
+        VciBaseUtil.alertNotNull(record,"瑕佹坊鍔犵殑鏁版嵁");
+        return boService.addSave(record);
+    }
+
+    /**
+     * 鎵归噺娣诲姞鏁版嵁
+     * @param records 娴佺▼鏀惰棌鑺傜偣鏄庣粏鏁版嵁瀵硅薄闆嗗悎
+     * @return 鎵ц缁撴灉鏁�
+     */
+    @Override
+    public BatchCBO batchInsert(List<WFWorkflowNodeFavItemDO> records){
+        VciBaseUtil.alertNotNull(records,"瑕佹坊鍔犵殑鏁版嵁");
+        BatchCBO batchCBO = boService.batchAddSave(records);
+        return batchCBO;
+    }
+
+    /**
+     * 鏍规嵁涓婚敭鏌ヨ
+     * @param oid 鏁版嵁涓婚敭
+     * @return 鏁版嵁瀵硅薄
+     */
+    @Override
+    public WFWorkflowNodeFavItemDO selectByPrimaryKey(String oid){
+        VciBaseUtil.alertNotNull(oid,"涓婚敭");
+        WFWorkflowNodeFavItemDO record = boService.selectByOid(oid, WFWorkflowNodeFavItemDO.class);
+        if (record == null || StringUtils.isBlank(record.getOid())){
+            throw new VciBaseException(FrameWorkBusLangCodeConstant.DATA_OID_NOT_EXIST);
+        }
+        return record;
+    }
+
+    /**
+     * 鏍规嵁涓婚敭鎵归噺鑾峰彇瀵硅薄
+     * @param oids 涓婚敭锛屽寘鍚崟寮曞彿,浣嗘槸涓嶈兘瓒呰繃1000
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+    @Override
+    public List<WFWorkflowNodeFavItemDO> selectByPrimaryKeys(String oids){
+        VciBaseUtil.alertNotNull(oids,"涓婚敭");
+        return boService.selectByOidCollection(VciBaseUtil.str2List(oids),WFWorkflowNodeFavItemDO.class);
+    }
+
+    /**
+     * 鏍规嵁涓婚敭鎵归噺鏌ヨ瀵硅薄
+     * @param oids 瀵硅薄涓婚敭,浣跨敤閫楀彿鍒嗛殧锛屼絾鏄笉鑳借秴杩�1000
+     * @return 涓氬姟瀵硅薄
+     */
+    @Override
+    public  List<WFWorkflowNodeFavItemDO> selectByPrimaryKeyCollection(Collection<String> oids){
+        VciBaseUtil.alertNotNull(oids,"涓婚敭");
+        return boService.selectByOidCollection(oids,WFWorkflowNodeFavItemDO.class);
+    }
+
+    /**
+     * 鏌ヨ鎵�鏈夊垎绫�
+     * @return 鏌ヨ缁撴灉
+     */
+    @Override
+    public List<WFWorkflowNodeFavItemDO> selectAll(){
+        return boService.queryObject(WFWorkflowNodeFavItemDO.class,null);
+    }
+
+    /**
+     * 鏇存柊瀵硅薄
+     * @param record 娴佺▼鏀惰棌鑺傜偣鏄庣粏鏁版嵁瀵硅薄
+     * @return 鎵ц缁撴灉
+     */
+    @Override
+    public BatchCBO updateByPrimaryKey(WFWorkflowNodeFavItemDO record){
+        VciBaseUtil.alertNotNull(record,"瑕佷慨鏀圭殑瀵硅薄",record.getOid(),"涓婚敭");
+        return boService.editSave(record);
+    }
+
+    /**
+     * 鎵归噺鏇存柊
+     * @param records 娴佺▼鏀惰棌鑺傜偣鏄庣粏鏁版嵁瀵硅薄闆嗗悎
+     * @return 鎵ц缁撴灉琛屾暟
+     */
+    @Override
+    public BatchCBO batchUpdate(List<WFWorkflowNodeFavItemDO> records){
+        VciBaseUtil.alertNotNull(records,"瑕佷慨鏀圭殑瀵硅薄");
+        BatchCBO batchCBO = boService.batchEditSave(records);
+        return batchCBO;
+    }
+
+    /**
+     * 鏍规嵁鏌ヨ鏉′欢鏌ヨ鏁版嵁
+     * @param wrapper 鏌ヨ鏉′欢锛屽寘鎷垎椤碉紝鎺掑簭
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+    @Override
+    public List<WFWorkflowNodeFavItemDO> selectByWrapper(VciQueryWrapperForDO wrapper){
+        return boService.selectByQueryWrapper(wrapper,WFWorkflowNodeFavItemDO.class);
+    }
+
+    /**
+     * 鏍规嵁鏌ヨ鏉′欢鏉ユ煡璇㈡�绘暟
+     * @param wrapper 鏌ヨ鏉′欢
+     * @return 鎬绘暟
+     */
+    @Override
+    public Long countByWrapper(VciQueryWrapperForDO wrapper){
+        return VciBaseUtil.getLong(String.valueOf(boService.countByQueryWrapper(wrapper,WFWorkflowNodeFavItemDO.class)));
+    }
+
+    /**
+     * 鏍规嵁涓婚敭鑾峰彇鍚嶇О
+     * @param oid 涓婚敭
+     * @return 涓枃鍚嶇О
+     */
+    @Override
+    public String selectNameByOid(String oid){
+        return selectByPrimaryKey(oid).getName();
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎瀵硅薄
+     * @param oids 瀵硅薄鐨勪富閿泦鍚�
+     * @return 鍙楀奖鍝嶇殑琛屾暟
+     */
+    @Override
+    public BatchCBO batchDeleteByOids(Collection<String> oids){
+        List<WFWorkflowNodeFavItemDO> dos = boService.selectByOidCollection(oids, WFWorkflowNodeFavItemDO.class);
+        BatchCBO batchCBO = boService.batchDelete(dos);
+        return batchCBO;
+    }
+
+    /**
+     * 鏍规嵁鏂规
+     * @param schemaOid 鏂规鐨勪富閿�
+     * @return 鏄庣粏鐨勫唴瀹�
+     */
+    @Override
+    public List<WFWorkflowNodeFavItemDO> selectBySchemaOid(String schemaOid){
+        VciBaseUtil.alertNotNull(schemaOid,"鏂规涓婚敭");
+        Map<String,String> condition = new HashMap<>();
+        condition.put("workflowNodeFavOid",schemaOid);
+        return boService.queryObject(WFWorkflowNodeFavItemDO.class,condition);
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/WebProcessDaoImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/WebProcessDaoImpl.java
new file mode 100644
index 0000000..3bd376e
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dao/impl/WebProcessDaoImpl.java
@@ -0,0 +1,1103 @@
+package com.vci.web.dao.impl;
+
+import com.vci.base.common.utility.ObjectUtility;
+import com.vci.corba.common.VCIError;
+import com.vci.corba.framework.data.UserEntityInfo;
+import com.vci.corba.workflow.data.*;
+import com.vci.corba.workflow.method.WorkflowService;
+import com.vci.frameworkcore.compatibility.SmUserQueryServiceI;
+import com.vci.frameworkcore.pagemodel.SmUserVO;
+import com.vci.rmip.workflow.server.template.TasksAssigned;
+import com.vci.starter.web.constant.QueryOptionConstant;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.starter.web.pagemodel.SessionInfo;
+import com.vci.starter.web.util.BeanUtil;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.starter.web.util.VciDateUtil;
+import com.vci.web.constant.WFVariablesKeyConstant;
+import com.vci.web.dao.WebProcessDaoI;
+import com.vci.web.model.ProcessInstance;
+import com.vci.web.model.ProcessTask;
+import com.vci.web.model.WFProcessClassifyDO;
+import com.vci.web.model.WFProcessTemplateDO;
+import com.vci.web.pageModel.*;
+import com.vci.web.service.WebBoServiceI;
+import com.vci.web.service.OsLifeCycleServiceI;
+import com.vci.web.service.WebLoServiceI;
+import com.vci.web.util.PlatformClientUtil;
+import com.vci.web.util.WebUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+import org.springframework.util.CollectionUtils;
+import plm.bs.bom.clientobject.ClientBusinessObject;
+import plm.bs.bom.clientobject.ClientLinkObject;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static com.vci.frameworkcore.constant.FrameWorkBusLangCodeConstant.DATA_OID_NOT_EXIST;
+
+/**
+ * 娴佺▼鐨勬暟鎹眰
+ * @author weidy
+ */
+@Repository
+public class WebProcessDaoImpl implements WebProcessDaoI {
+	
+	@Autowired
+	private WebBoServiceI boService;
+	
+	@Autowired
+	private WebLoServiceI loService;
+
+	@Autowired
+	private OsLifeCycleServiceI lifeCycleService;
+
+	/**
+	 * 鐢ㄦ埛鏌ヨ鏈嶅姟
+	 */
+	@Autowired
+	private SmUserQueryServiceI userQueryService;
+
+	/**
+	 * 鏃ュ織
+	 */
+	private Logger logger = LoggerFactory.getLogger(getClass());
+
+	/**
+	 * 鏋勯�犳柟娉曪紝鍒濆鍖栧钩鍙扮殑娴佺▼鏈嶅姟
+	 */
+
+	/**
+	 * 澶氳瑷�鐨勫墠缂�
+	 */
+	private final String msgCodePrefix = "com.vci.web.flow.";
+
+	/**
+	 * 骞冲彴鐨勬祦绋嬫湇鍔�
+	 */
+	private WorkflowService workService = null;
+
+	/**
+	 * 骞冲彴璋冪敤瀹㈡埛绔�
+	 */
+	@Autowired
+	private PlatformClientUtil platformClientUtil;
+	/***
+	 * 娴佺▼鍒嗙被涓婚敭鍜岀被鍨嬬殑鏄犲皠
+	 */
+	private Map<String/*绫诲瀷*/,String/*涓婚敭*/> categoryMap = new HashMap<String, String>();
+	
+	private final String workitemBtmType = "workitem";
+	
+	private final String workIntanceBtmType = "workflowinstance";
+	
+	private final String processDataLink ="input";
+	
+	private final String taskDataLink = "input";
+
+	
+	/**
+	 * 鑾峰彇娴佺▼鍒嗙被鐨勬槧灏�
+	 * @throws VciBaseException
+	 */
+	private void getCategory() throws VciBaseException {
+//		try {
+//			ProcessCategoryInfo[] pcia = getWorkService().getProcessCategories("root");
+//			if(pcia!=null&&pcia.length>0){
+//				for(ProcessCategoryInfo pci : pcia){
+//					categoryMap.put(pci.name.toLowerCase(), pci.id);
+//				}
+//			}
+//		} catch (VCIError e) {
+//			WebUtil.getVciBaseException(e);
+//		}//骞冲彴娌℃湁鏍规嵁鍒嗙被鍚嶇О鑾峰彇娴佺▼鍒嗙被鐨勬帴鍙�
+	}
+	
+	/**
+	 * 鑾峰彇鏌愪釜鍒嗙被涓嬬殑鎵�鏈夋祦绋嬫ā鐗�
+	 * @param type 鍒嗙被淇℃伅
+	 * @param filterTemplate 鎸囧畾妯℃澘
+	 * @param showAll 鏄惁鏄剧ず鎵�鏈夌増鏈殑
+	 * @return 
+	 * @throws 
+	 */
+	@Override
+	public List<ProcessTemplateVO> getTemplatesByType(String type, String filterTemplate,boolean showAll)
+			throws VciBaseException {
+		WebUtil.alertNotNull(type,"妯℃澘鍒嗙被");
+		ProcessDefinitionInfo[] allFlowInType = null;
+		if(StringUtils.isBlank(filterTemplate)) {
+			type = type.toLowerCase();
+			if (categoryMap.isEmpty() || !categoryMap.containsKey(type)) {
+				getCategory();
+			}
+			String typeOid = "" ;
+			if (categoryMap.containsKey(type)) {
+				typeOid = categoryMap.get(type);
+			} else {
+				throw new VciBaseException(msgCodePrefix + "typeNotExist", new String[]{type});
+			}
+//			try {
+//				allFlowInType = getWorkService().getProcessDefinitions(typeOid);
+//			} catch (VCIError e) {
+//				throw WebUtil.getVciBaseException(e);
+//			}
+		}else{
+			List<ProcessDefinitionInfo> infoList = new ArrayList<>();
+			VciBaseUtil.str2List(filterTemplate).stream().forEach(name->{
+//				try {
+//					String nameUnRev = name;
+//					String revision = "";
+//					if(name.contains("-")){
+//						nameUnRev = name.substring(0,name.lastIndexOf("-"));
+//						revision = name.substring(name.lastIndexOf("-")+1);
+//					}
+//					ProcessDefinitionInfo[] definition = getWorkService().getProcessDefinitionByProcessDefinitionName(nameUnRev, "");
+//					if(definition!=null){
+//						if(StringUtils.isBlank(revision)) {
+//							Collections.addAll(infoList, definition);
+//						}else{
+//							//杩囨护鐗堟湰
+//							String finalRevision = revision;
+//							infoList.addAll(Arrays.stream(definition).filter(s -> finalRevision.equalsIgnoreCase(String.valueOf(s.version))).collect(Collectors.toList()));
+//						}
+//					}
+//				} catch (VCIError e) {
+//					throw WebUtil.getVciBaseException(e);
+//				}
+			});
+			allFlowInType = infoList.toArray(new ProcessDefinitionInfo[0]);
+		}
+	    return swapProcessTemplate(allFlowInType, type, showAll);
+	}
+	
+	@Override
+	public ProcessTemplateVO getTemplateByDeployId(String deployId) throws VciBaseException {
+		WebUtil.alertNotNull(deployId,"娴佺▼閮ㄧ讲涓婚敭");
+		ProcessDefinitionInfo pdi = null;
+//		try {
+//			pdi = getWorkService().getProcessDefinitionByDeployId(deployId.trim());
+//		} catch (VCIError e) {
+//			throw new VciBaseException(msgCodePrefix + "deployIdNotExist", new String[]{deployId});
+//		}
+		List<ProcessTemplateVO> proTemplates = swapProcessTemplate(new ProcessDefinitionInfo[]{pdi},"",false);
+		if(proTemplates == null || proTemplates.size() == 0){
+			throw new VciBaseException(msgCodePrefix + "deployIdNotExist", new String[]{deployId});
+		}
+		return proTemplates.get(0);
+	}
+	
+	private List<ProcessTemplateVO> swapProcessTemplate(ProcessDefinitionInfo[] allFlowInType, String type, boolean showAll){
+		List<ProcessTemplateVO> allTemplate = new ArrayList<ProcessTemplateVO>();
+		if(allFlowInType!=null&&allFlowInType.length>0){
+			for(ProcessDefinitionInfo pd : allFlowInType){
+				//status = 0 琛ㄧず鍋滅敤锛� status = 1琛ㄧず鍚敤
+				if("1".equalsIgnoreCase(pd.status) || showAll){
+					ProcessTemplateVO pt = new ProcessTemplateVO();
+					pt.setOid(pd.id);
+					pt.setCategroyOid(pd.categroyId);
+					pt.setDeploymentId(pd.jbpmDeploymentId);
+					pt.setKey(pd.key);
+					pt.setName(pd.name);
+					pt.setStatus(pd.status);
+					pt.setTaskType(type);
+//					pt.setVersion(pd.version);
+					allTemplate.add(pt);
+				}
+			}
+		}
+		return allTemplate;
+	}
+
+	/**
+	 * 鑾峰彇娴佺▼鐨勬墍鏈夎妭鐐�
+	 * @param processOid
+	 */
+	@Override
+	public List<ProcessNodeVO> getAllProcessNode(String processOid)
+			throws VciBaseException{
+		WebUtil.alertNotNull(processOid,"娴佺▼涓婚敭");
+	    String deploymentId = getJbpmDeploymentId(processOid);
+	    if(StringUtils.isBlank(deploymentId)){
+	    	throw new VciBaseException(msgCodePrefix + "processTemplateNotExist",new String[]{processOid});
+	    }
+	    String[] allTaskNames = getAllProcessNodeNameByDeploy(deploymentId);
+	    List<ProcessNodeVO> allNode = new ArrayList<ProcessNodeVO>();
+	    for(String taskName :  allTaskNames){
+	    	ProcessNodeVO pn = getNodePresideUsersByDeploy(deploymentId, taskName);
+	    	allNode.add(pn);
+	    }
+		return allNode;
+	}
+    @Override
+	public String getFirstNodeName(String deployId) throws VciBaseException {
+    	WebUtil.alertNotNull(deployId,"閮ㄧ讲涓婚敭");
+//    	try {
+//			ProcessTaskInfo firstProcessTask = getWorkService().getFirstProcessTask(deployId);
+//			if(firstProcessTask!=null){
+//				return firstProcessTask.taskName;
+//			}
+//		} catch (VCIError e) {
+//			throw WebUtil.getVciBaseException(e);
+//		}
+    	return null;
+	}
+	/**
+	 * 鑾峰彇娴佺▼鐨勬墍鏈夎妭鐐瑰悕绉�
+	 * @param processOid
+	 */
+	@Override
+	public String[] getAllProcessNodeName(String processOid) throws VciBaseException{
+		if(StringUtils.isEmpty(processOid)){
+			WebUtil.alertNotNull(processOid);
+	    }
+	    String deploymentId = getJbpmDeploymentId(processOid);
+	    if(StringUtils.isEmpty(deploymentId)){
+	    	throw new VciBaseException(msgCodePrefix + "processTemplateNotExist",new String[]{processOid});
+	    }
+	    return getAllProcessNodeNameByDeploy(deploymentId);
+	}
+	
+	/**
+	 * 鑾峰彇娴佺▼涓殑鎵�鏈夎妭鐐瑰悕绉�
+	 * @param deploymentId 娴佺▼寮曟搸涓殑閮ㄧ讲id
+	 * @return
+	 * @throws VciBaseException
+	 */
+	@Override
+	public String[] getAllProcessNodeNameByDeploy(String deploymentId) throws VciBaseException{
+		String[] allTaskNames = null;
+//	    try {
+//			allTaskNames = getWorkService().getAllTaskNames(deploymentId);
+//		} catch (VCIError e) {
+//			throw WebUtil.getVciBaseException(e);
+//		}
+	    return allTaskNames;
+	}
+
+	/**
+	 * 鑾峰彇娴佺▼妯℃澘鍦ㄦ祦绋嬪紩鎿庝腑鐨勯儴缃蹭富閿�
+	 * @param processOid
+	 */
+	@Override
+	public String getJbpmDeploymentId(String processOid) throws VciBaseException{
+//		WebUtil.alertNotNull(processOid,"娴佺▼妯℃澘涓婚敭");
+//		return getWorkService().getDeploymentID(processOid);
+		return null;
+	}
+	
+	@Override
+	public String getJbpmDeploymentIdByExecutionId(String executionId) throws VciBaseException{
+		WebUtil.alertNotNull(executionId,"娴佺▼鎵ц涓婚敭");
+//		try {
+//			return getWorkService().getDeploymentIdByExecutionId(executionId);
+//		} catch (VCIError e) {
+//			throw WebUtil.getVciBaseException(e);
+//		}
+		return null;
+	}
+	
+	@Override
+	public ProcessNodeVO getNodePresideUsersByDeploy(String deploymentId, String taskName) throws VciBaseException{
+		WebUtil.alertNotNull(taskName,"娴佺▼浠诲姟鍚嶇О",deploymentId,"娴佺▼寮曟搸涓殑閮ㄧ讲涓婚敭");
+		ProcessNodeVO pn = new ProcessNodeVO();
+//		pn.setName(taskName);
+//		try {
+//			String[] nodePresideUsers = getWorkService().getCurCandidates(deploymentId, taskName, "", "");
+//			if(nodePresideUsers!=null&& nodePresideUsers.length>0){
+//				for(String preUsers : nodePresideUsers){
+//					//骞冲彴瀛樺偍鐨勬柟寮忔槸鐢ㄦ埛;瑙掕壊;閮ㄩ棬;鑷畾涔�....
+//					if(StringUtils.isNotEmpty(preUsers)){
+//						String[] preUsersSplit = preUsers.split("\\;");
+//						if(preUsersSplit!=null && preUsersSplit.length>0){
+//							if(StringUtils.isNotEmpty(preUsersSplit[0])){
+//								pn.setUsers(preUsersSplit[0]);
+//							}
+//							if(preUsersSplit.length>1 && StringUtils.isNotEmpty(preUsersSplit[1])){
+//								pn.setRoles(preUsersSplit[1]);
+//							}
+//							if(preUsersSplit.length>2 && StringUtils.isNotEmpty(preUsersSplit[2])){
+//								pn.setDepts(preUsersSplit[2]);
+//							}
+//							if(preUsersSplit.length>3 && StringUtils.isNotEmpty(preUsersSplit[3])){
+//								pn.setCustomClass(preUsersSplit[3]);
+//							}
+//						}
+//					}
+//				}
+//			}
+//		} catch (VCIError e) {
+//			throw WebUtil.getVciBaseException(e);
+//		}
+		return pn;
+	}
+	
+	
+	/**
+	 * 鑾峰彇娴佺▼妯℃澘涓煇涓妭鐐圭殑澶勭悊浜�
+	 * @param processOid
+	 * @param taskName
+	 * @return
+	 * @throws VciBaseException
+	 */
+	@Override
+	public ProcessNodeVO getNodePresideUsers(String processOid, String taskName) throws VciBaseException{
+		WebUtil.alertNotNull(taskName,"娴佺▼浠诲姟鑺傜偣鍚嶇О",processOid,"娴佺▼涓婚敭");
+	    String deploymentId = getJbpmDeploymentId(processOid);
+	    if(StringUtils.isEmpty(deploymentId)){
+	    	throw new VciBaseException(msgCodePrefix + "processTemplateNotExist",new String[]{processOid});
+	    }
+	    return getNodePresideUsersByDeploy(deploymentId,taskName);
+	}
+	
+	@Override
+	public List<ProcessUserVO> getNodePresideUsersByTask(String executionid, String taskName)
+			throws VciBaseException{
+		WebUtil.alertNotNull(executionid,"娴佺▼鎵ц浠诲姟",taskName,"浠诲姟鍚嶇О");
+//		if("缁撴潫".equalsIgnoreCase(taskName)){
+//			return null;
+//		}
+		//涓嶈兘浣跨敤workitem鍘绘煡璇紝鍥犱负鍙兘浠诲姟杩樻病鍒�
+//		String users = getWorkService().getNextTaskAssigner(executionid, taskName);
+		List<ProcessUserVO> allProUser = new ArrayList<ProcessUserVO>();
+//		if(StringUtils.isNotEmpty(users)){
+//			String userIds = users.replace("user:", "");//鐜板湪鍙敮鎸佽缃敤鎴�
+//			List<SmUserVO> allUser = userQueryService.listUserByUserIds(WebUtil.str2List(userIds));
+//			if(allUser!=null && allUser.size()>0){
+//				for(SmUserVO user : allUser){
+//					ProcessUserVO pu = new ProcessUserVO();
+//					BeanUtils.copyProperties(user, pu);
+//					pu.setType("user");
+//					allProUser.add(pu);
+//				}
+//			}
+//		}
+		return allProUser;
+	}
+
+	/**
+	 * 鏌ヨ寰呭姙浠诲姟
+	 */
+	@Override
+	public DataGrid getUndoTask(
+			Map<String, String> conditionMap, PageHelper ph, String userId)
+			throws VciBaseException {
+		return getProcessTask(conditionMap,ph,userId,1);
+	}
+
+	/**
+	 * 浣跨敤娴佺▼瀹炰緥鑾峰彇鎵�鏈夌殑寰呭姙淇℃伅
+	 * @param processInstanceId 娴佺▼鐨勫疄渚嬩富閿�
+	 * @return 寰呭姙鐨勪换鍔�
+	 */
+	@Override
+	public DataGrid getUndoTaskByInstanceId(String processInstanceId, long mill){
+		Map<String,String> conditionMap = new HashMap<>();
+		conditionMap.put("executionid",processInstanceId+"*");
+		if(mill>0) {
+			conditionMap.put("ts", QueryOptionConstant.MORETHAN + VciDateUtil.date2Str(new Date(mill), VciDateUtil.DateTimeMillFormat));
+		}
+		return getProcessTask(conditionMap,new PageHelper(-1),null,8);
+	}
+
+	/**
+	 * 鏌ヨ娴佺▼浠诲姟
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @param ph 鍒嗛〉淇℃伅锛屾病鏈夋帓搴�
+	 * @param userId 鐢ㄦ埛鍚�
+	 * @param doTaskType 鐢ㄦ埛绫诲瀷锛�1-寰呭姙浠诲姟锛�2-宸插姙浠诲姟
+	 * @return
+	 * @throws VciBaseException
+	 */
+	private DataGrid getProcessTask(Map<String, String> conditionMap, PageHelper ph, String userId,int doTaskType) throws  VciBaseException,VciBaseException{
+		if(conditionMap == null) {
+			conditionMap = new HashMap<String, String>();
+		}
+		String btmType = "";
+		if(doTaskType== 1){//寰呭姙浠诲姟
+			WebUtil.alertNotNull(userId,"鐢ㄦ埛鍚�");
+			conditionMap.put("businesstype", "5");//鏈」鐩病鏈夊疄闄呯殑鎰忎箟
+			conditionMap.put("principal", userId);
+			conditionMap.put("lcstatus", "Executing");
+			btmType = workitemBtmType;
+			//ph.addSort("createtime",ph.desc);
+		}else if(doTaskType == 2){//宸插姙浠诲姟
+			WebUtil.alertNotNull(userId,"鐢ㄦ埛鍚�");
+			conditionMap.put("taskoid", QueryOptionConstant.IN +" ( select ht.DBID_ FROM JBPM4_HIST_TASK ht left join PLFLOWAPPROVEOPINION op on ht.DBID_ = op.PLTASKID where DECODE(op.plassgin, null, ht.ASSIGNEE_, op.plassgin) = '" + userId + "') ");
+			conditionMap.put("lcstatus","Completed");
+			btmType = workitemBtmType;
+		}else if(doTaskType == 3){//瀹屾垚鐨勬祦绋�
+			if(StringUtils.isNotEmpty(userId)) {//涓虹┖琛ㄧず鏌ヨ鎵�鏈夌殑
+				conditionMap.put("creator", userId);
+			}
+			conditionMap.put("lcstatus", "Completed");
+			btmType = workIntanceBtmType;
+		}else if(doTaskType == 4){//琚粓姝㈢殑娴佺▼
+			if(StringUtils.isNotEmpty(userId)) {
+				conditionMap.put("creator", userId);
+			}
+			conditionMap.put("lcstatus", "Obsoleted");
+			btmType = workIntanceBtmType;
+		}else if(doTaskType ==5){//琚寕璧风殑娴佺▼
+			if(StringUtils.isNotEmpty(userId)) {
+				conditionMap.put("creator", userId);
+			}
+			conditionMap.put("lcstatus", "Suspended");
+			btmType = workIntanceBtmType;
+		}else if(doTaskType == 6){//鎵ц涓殑娴佺▼
+			if(StringUtils.isNotEmpty(userId)) {
+				conditionMap.put("creator", userId);
+			}
+			conditionMap.put("lcstatus", "Executing");
+			btmType = workIntanceBtmType;
+		}else if(doTaskType ==7){
+			WebUtil.alertNotNull(userId,"鐢ㄦ埛鍚�");
+			conditionMap.put("creator", userId);
+		}else if(doTaskType ==8){
+			//娴佺▼鑾峰彇鎵�鏈夊緟澶勭悊鐨勪换鍔�
+			conditionMap.put("lcstatus", "Executing");
+			btmType = workitemBtmType;
+		}else{
+			throw new VciBaseException("msgCodePrefix",new String[]{doTaskType+""});
+		}
+		List<String> causeList = new ArrayList<String>();
+		causeList.add("*");
+		causeList.add("creator_name");
+		if(doTaskType!= 1){
+			ph.addSort("ts",ph.desc);
+		}
+		ph.addSort("createtime",ph.desc);
+		return boService.queryGridByBo(btmType, conditionMap, ph,causeList);
+		
+	}
+
+	@Override
+	public DataGrid getDoneProcess(Map<String, String> conditionMap, PageHelper ph, String userId) throws VciBaseException {
+		return getProcessTask(conditionMap,ph,userId,2);
+	}
+
+	@Override
+	public DataGrid getCompletedProcess(Map<String, String> conditionMap, PageHelper ph, String userId) throws VciBaseException {
+		return getProcessTask(conditionMap,ph,userId,3);
+	}
+
+	@Override
+	public DataGrid getObsoledtedProcess(Map<String, String> conditionMap,
+			PageHelper ph, String userId) throws VciBaseException {
+		return getProcessTask(conditionMap,ph,userId,4);
+	}
+
+	@Override
+	public DataGrid getSuspendedProcess(Map<String, String> conditionMap,
+			PageHelper ph, String userId) throws VciBaseException {
+		return getProcessTask(conditionMap,ph,userId,5);
+	}
+
+	@Override
+	public DataGrid getExecutingProcess(Map<String, String> conditionMap,
+			PageHelper ph, String userId) throws VciBaseException {
+		return getProcessTask(conditionMap,ph,userId,6);
+	}
+
+	@Override
+	public DataGrid getCreateProcess(Map<String, String> conditionMap,
+			PageHelper ph, String userId) throws VciBaseException {
+		return getProcessTask(conditionMap,ph,userId,7);
+	}
+	
+	@Override
+	public List<ProcessTaskVO>  getTaskByOid(String oid) throws VciBaseException{
+		WebUtil.alertNotNull(oid,"寰呭姙浠诲姟涓婚敭");
+		List<ProcessTask> tasks = boService.selectByOidCollection(VciBaseUtil.str2List(oid),ProcessTask.class);
+		return processTaskDO2VOs(tasks);
+	}
+
+	/**
+	 * 杩樻湁浠诲姟鐨勪富閿幏鍙栦换鍔BO瀵硅薄
+	 * @param oid 涓婚敭
+	 * @return CBO瀵硅薄
+	 * @throws VciBaseException 鏌ヨ鍑洪敊浼氭姏鍑哄紓甯�
+	 */
+	@Override
+	public List<Map> getTaskCBOByOid(String oid) throws VciBaseException{
+		WebUtil.alertNotNull(oid,"寰呭姙浠诲姟涓婚敭");
+		return (boService.cbos2Map(boService.selectCBOByOidCollection(VciBaseUtil.str2List(oid),getWorkitemBtmType())));
+	}
+
+	/**
+	 * 浠诲姟鐨勫璞¤浆鎹负鏄剧ず瀵硅薄
+	 * @param tasks 浠诲姟鐨勫璞�
+	 * @return 浠诲姟鐨勬樉绀哄璞�
+	 */
+	private List<ProcessTaskVO> processTaskDO2VOs(Collection<ProcessTask> tasks){
+		List<ProcessTaskVO> taskVOList = new ArrayList<>();
+		Optional.ofNullable(tasks).orElseGet(()->new ArrayList<>()).stream().forEach(task->{
+			ProcessTaskVO taskVO = new ProcessTaskVO();
+			BeanUtil.convert(task,taskVO);
+			taskVOList.add(taskVO);
+		});
+		return taskVOList;
+	}
+	
+	@Override
+	public ProcessInstanceVO getProcessByOid(String oid) throws VciBaseException{
+		WebUtil.alertNotNull(oid,"娴佺▼瀹炰緥涓婚敭");
+		ProcessInstance process = boService.selectByOid(oid,ProcessInstance.class);
+		ProcessInstanceVO processInstanceVO = new ProcessInstanceVO();
+		if(process == null || StringUtils.isBlank(process.getOid())){
+			throw new VciBaseException(DATA_OID_NOT_EXIST);
+		}
+		BeanUtil.convert(process,processInstanceVO);
+		return processInstanceVO;
+	}
+	
+	@Override
+	public String getVariablesInProcess(String executionId,String key) throws VciBaseException{
+		WebUtil.alertNotNull(executionId,"娴佺▼鎵ц涓婚敭",key,"鍙傛暟Key");
+		UserEntityInfo ueo = new UserEntityInfo();
+		SessionInfo si = WebUtil.getCurrentUserSessionInfo();
+		ueo.ip = si.getIp();
+		ueo.modules = "娴佺▼";
+		ueo.userName = si.getUserId();
+//		while(StringUtils.countMatches(executionId,".")>1){
+//			//璇存槑鏄瓙浠诲姟锛岀敤鐖朵换鍔¤幏鍙栦竴涓嬪彉閲�
+//			executionId = executionId.substring(0,executionId.lastIndexOf("."));
+//		}
+//		try {
+//			return getWorkService().getProcessVariable(executionId, key, ueo);
+//		} catch (VCIError e) {
+//			throw WebUtil.getVciBaseException(e);
+//		}
+		return null;
+	}
+
+	/**
+	 * 鑾峰彇娴佺▼涓叧鑱旂殑鏁版嵁
+	 * @param taskOid 浠诲姟鐨勪富閿�
+	 * @param processOid 娴佺▼鐨勪富閿�
+	 * @param referColumns 寮曠敤鐨勫垪
+	 * @return
+	 * @throws VciBaseException
+	 */
+	@Override
+	public DataGrid getDataByTask(String taskOid,String processOid,String referColumns) throws VciBaseException {
+		if(StringUtils.isBlank(taskOid) && StringUtils.isBlank(processOid)){
+			throw new VciBaseException(msgCodePrefix + "taskOidOrProcessOidNotNull");
+		}
+		Map<String,String> conditionMap = new HashMap<String, String>();
+		if(StringUtils.isNotBlank(taskOid)) {
+			conditionMap.put("f_oid", taskOid.trim());
+			conditionMap.put("f_btwname", workitemBtmType);
+		}else if(StringUtils.isNotBlank(processOid)){
+			//瀹為檯涓婁紶閫掔殑鏄痚xecutionid
+			conditionMap.put("f_oid", "\\IN(select oid from platformbtm_" + workIntanceBtmType + " where executionid = '" + processOid.trim() + "')");
+			conditionMap.put("f_btwname", workIntanceBtmType);
+		}
+		return getData(taskDataLink,conditionMap,referColumns);
+	}
+
+	/**
+	 * 鑾峰彇娴佺▼鍏宠仈鐨勪笟鍔℃暟鎹殑閲岄樋鏉扮被鍨�
+	 * @param taskOid 浠诲姟涓婚敭
+	 * @param executionid 娴佺▼鎵ц涓婚敭
+	 * @return
+	 * @throws VciBaseException
+	 */
+	@Override
+	public List<ClientLinkObject> getDataCloInTask(String taskOid,String executionid) throws VciBaseException {
+		Map<String,String> conditionMap = new HashMap<String, String>();
+		if(StringUtils.isNotBlank(taskOid)) {
+			conditionMap.put("f_oid", taskOid.trim());
+			conditionMap.put("f_btwname", getWorkitemBtmType());
+		}else if(StringUtils.isNotBlank(executionid)){
+			conditionMap.put("f_oid", "\\IN(select oid from platformbtm_" + getWorkIntanceBtmType() + " where executionid = '" + executionid.trim() + "')");
+			conditionMap.put("f_btwname", getWorkIntanceBtmType());
+		}
+		return loService.queryCLO(taskDataLink, conditionMap);
+	}
+	
+	private DataGrid getData(String linkType,Map<String,String> conditionMap,String referColumns) throws VciBaseException{
+		List<ClientLinkObject> clos = loService.queryCLO(taskDataLink, conditionMap);
+		Map<String,List<String>> btmOidMap = new HashMap<String, List<String>>();
+		if(clos!=null&&clos.size()>0){
+			for(ClientLinkObject clo : clos){
+				List<String> oids = null;
+				String btm = clo.getToBTMName().toLowerCase();
+				if(btmOidMap.containsKey(btm)){
+					oids = btmOidMap.get(btm);
+				}else{
+					oids = new ArrayList<String>();
+				}
+				oids.add(clo.getToOid());
+				btmOidMap.put(btm, oids);
+			}
+		}
+		List<Map> data = new ArrayList<Map>();
+		if(!btmOidMap.isEmpty()){
+			Iterator<String> it = btmOidMap.keySet().iterator();
+			while(it.hasNext()){
+				String btm = it.next();
+				List<String> oids  = btmOidMap.get(btm);
+				conditionMap.clear();
+				conditionMap.put("oid", QueryOptionConstant.IN + "(" + WebUtil.toInSql(oids.toArray(new String[0])) + ")");
+				List<String> caluesList = new ArrayList<String>();
+				if(StringUtils.isNotEmpty(referColumns)) {
+					caluesList = Arrays.asList(referColumns.split(","));
+				}else {
+					caluesList.add("*");
+				}
+				List<ClientBusinessObject> cbos = boService.queryCBO(btm, conditionMap,null,caluesList);
+				data.addAll(boService.cbos2Map(cbos));
+			}
+		}
+		DataGrid dg = new DataGrid();
+		dg.setData(data);
+		dg.setTotal(data.size());
+		dg.setLimit(-1);
+		dg.setPage(1);
+		return dg;
+	}
+
+	@Override
+	public DataGrid getDataByProcess(String executionId,String referColumns) throws VciBaseException{
+		WebUtil.alertNotNull(executionId,"娴佺▼鎵цID");
+		Map<String,String> conditionMap = new HashMap<String, String>();
+		conditionMap.put("f_oid","\\IN(select oid from platformbtm_" +getWorkIntanceBtmType() + " where executionid='" + executionId.trim() + "')");
+		conditionMap.put("f_btwname", getWorkIntanceBtmType());
+		return getData(processDataLink,conditionMap,referColumns);
+	}
+
+	@Override
+	public List<ProcessHistoryVO> getHistory(String executionId) throws VciBaseException{
+		WebUtil.alertNotNull(executionId,"娴佺▼鎵ц涓婚敭");
+		List<ProcessHistoryVO> hisList = new ArrayList<ProcessHistoryVO>();
+//		FlowApproveHistoryInfo[] historyActivitys = null;
+//		try {
+//			historyActivitys = getWorkService().getHistoryActivityByProInsIdbyPLM(executionId);
+//		} catch (VCIError e) {
+//			throw WebUtil.getVciBaseException(e);
+//		}
+//		//闇�瑕佸幓闄ゆ湭澶勭悊鐨勯噸澶嶉」
+//		for (int i = 0; i < historyActivitys.length; i++) {
+//			FlowApproveHistoryInfo historyActivity = historyActivitys[i];
+//			ProcessHistoryVO his = new ProcessHistoryVO();
+//			his.setTaskName(historyActivity.taskName);
+//			his.setOpinin(historyActivity.opinion);//杩欎釜鏄鐞嗘柟寮忥紝灏辨槸鍚屾剰杩樻槸涓嶅悓鎰�
+//			his.setCreateTime(historyActivity.createTime);
+//			his.setEndTime(historyActivity.endTime);
+//			his.setNode(historyActivity.note);
+//			his.setAssignee(historyActivity.assignee);
+//			his.setExecutionId(historyActivity.executionId);
+//			String userIdString = historyActivity.assignee;
+//			if(StringUtils.contains(userIdString,":")) {
+//				userIdString = userIdString.substring(userIdString.indexOf(":") + 1);
+//			}
+//			String userShowInfoString = "";
+//			SmUserVO user = userQueryService.getUserByUserId(userIdString);
+//			if(user != null){
+//				userShowInfoString = user.getName() + "(" + user.getId() + ")";
+//			}else{
+//				userShowInfoString = historyActivity.assignee;
+//			}
+//			his.setAssigneeName(userShowInfoString);
+//			if(StringUtils.isNotBlank(historyActivity.endTime)) {
+//				hisList.add(his);
+//			}
+//			//濡傛灉endTime涓虹┖琛ㄧず鏄緟鍔炵殑锛屼絾鏄湇鍔$鐨勬帴鍙d腑鏈変釜闂鏄紝浼氭妸浼氱鎴栬�呭瓙娴佺▼涓凡缁忓鐞嗙殑鍜屾湭澶勭悊鐨勬贩鍚堝湪涓�璧�
+//			//鐩存帴浠庡緟鍔炰换鍔¢噷鍘绘煡璇�
+//		}
+
+		Map<String,String> conditionMap = new HashMap<String, String>();
+		conditionMap.put("businesstype", "5");//鏈」鐩病鏈夊疄闄呯殑鎰忎箟
+		conditionMap.put("lcstatus", "Executing");
+		if(StringUtils.countMatches(executionId,".")>1){
+			String ex = executionId;
+			while(StringUtils.countMatches(ex,".")>1){
+				ex = ex.substring(0,ex.lastIndexOf("."));
+			}
+			conditionMap.put("executionid", ex + "*");
+		}else {
+			conditionMap.put("executionid", executionId + "*");
+		}
+		conditionMap.put(WebBoServiceI.QUERY_FILTER_SECRET,"false");
+		conditionMap.put(WebBoServiceI.QUERY_FILTER_DATARIGHT,"false");
+		PageHelper pageHelper = new PageHelper(-1);
+		pageHelper.setSort("endTime");
+		pageHelper.setOrder(pageHelper.asc);
+		List<ClientBusinessObject> undoTaskCbos= boService.queryCBO(workitemBtmType, conditionMap);
+		if(undoTaskCbos != null && undoTaskCbos.size() > 0) {
+			for(ClientBusinessObject cbo : undoTaskCbos) {
+				ProcessHistoryVO his = new ProcessHistoryVO();
+				String taskName = cbo.getName();
+				if(StringUtils.contains(taskName,"-")) {
+					taskName = taskName.substring(taskName.lastIndexOf("-") + 1);
+				}
+				his.setTaskName(taskName);
+				his.setCreateTime(cbo.getCreateTime());
+				String userIdString = cbo.getAttributeValue("principal");
+				if(StringUtils.contains(userIdString,":")) {
+					userIdString = userIdString.substring(userIdString.indexOf(":") + 1);
+				}
+				his.setAssignee(cbo.getAttributeValue("principal"));
+				String userShowInfoString = "";
+				SmUserVO user = userQueryService.getUserByUserId(userIdString);
+				if(user != null){
+					userShowInfoString = user.getName() + "(" + user.getId() + ")";
+				}else{
+					userShowInfoString = userIdString;
+				}
+				his.setAssigneeName(userShowInfoString);
+				his.setExecutionId(cbo.getAttributeValue("executionid"));
+				
+				hisList.add(his);
+			}
+		}
+		return hisList;
+	}
+
+	@Override
+	public byte[] getProcessPicture(String executionId, String taskName)
+			throws VciBaseException{
+		WebUtil.alertNotNull(executionId,"娴佺▼鎵ц涓婚敭",taskName,"娴佺▼浠诲姟鍚嶇О");
+//		try {
+//			byte[] processChart =  getWorkService().getExecutionImageByExecutionId(executionId, taskName);
+//			return processChart;
+//		} catch (Throwable e) {
+//			String msg = "鏈夊彲鑳借繖涓换鍔″叧鑱旂殑娴佺▼宸茬粡缁撴潫鎴栬�呰缁堟锛屼笉鑳藉啀鏌ョ湅鍏舵祦绋嬪浘浜�";
+//			logger.error(msg,e);
+//			throw new VciBaseException(msg);
+//		}
+		return null;
+	}
+
+	@Override
+	public byte[] getProcessTemplatePicture(String executionId)
+			throws VciBaseException{
+//		WebUtil.alertNotNull(executionId,"娴佺▼瀹炰緥涓婚敭");
+//		try {
+//			byte[] processChart =  getWorkService().getFlowImageByDeployID(executionId);
+//			return processChart;
+//		} catch (VCIError e) {
+//			throw WebUtil.getVciBaseException(e);
+//		}
+		return null;
+	}
+	
+	@Override
+	public String[] getAllOutComes(String taskOid) throws VciBaseException{
+//		try {
+//			return getWorkService().getAllOutComes(taskOid);
+//		} catch (VCIError e) {
+//			throw WebUtil.getVciBaseException(e);
+//		}
+		return null;
+	}
+	
+	@Override
+	public String getNextTaskName(String executionid, String taskName, String outCome) throws VciBaseException{
+//		WebUtil.alertNotNull(executionid,"娴佺▼鎵ц涓婚敭",taskName,"浠诲姟鍚嶇О");
+//		String deployId = getJbpmDeploymentIdByExecutionId(executionid);
+//		try {
+//			return getWorkService().getNextTaskNameByJbpmId(deployId, taskName, outCome);
+//		} catch (VCIError e) {
+//			throw WebUtil.getVciBaseException(e);
+//		}
+		return null;
+	}
+
+	@Override
+	public WorkflowService getWorkService() throws VciBaseException{
+		if(workService == null){
+			try {
+				this.workService = platformClientUtil.getLogonFactoryService().getWorkflowService();
+			} catch (VCIError e) {
+//				logger.error(e.error_code,e);
+				throw WebUtil.getVciBaseException(e);
+			}
+		}
+		return workService;
+	}
+
+	@Override
+	public String getTaskDataLink() {
+		return taskDataLink;
+	}
+
+	@Override
+	public String getWorkitemBtmType() {
+		return workitemBtmType;
+	}
+
+	@Override
+	public String getWorkIntanceBtmType(){
+		return workIntanceBtmType;
+	}
+
+	/**
+	 * 寮�鍚祦绋嬩唬鐞�------骞冲彴鍙敮鎸佹坊鍔犱竴涓唬鐞嗙敤鎴�
+	 */
+	@Override
+	public void beginProxy(String userId, Date startDate, Date endDate,
+			boolean isNowEnable) throws VciBaseException {
+		WebUtil.alertNotNull(userId,"浠g悊浜虹殑鐢ㄦ埛鍚�",startDate,"寮�濮嬫椂闂�");
+		TasksAssignedInfo taskAss = new TasksAssignedInfo();
+		taskAss.id = new ObjectUtility().getNewObjectID36();
+		SmUserVO user = userQueryService.getUserByUserId(userId);
+		if(user!=null){
+			taskAss.userName = user.getName();
+		}else{
+			taskAss.userName = "";
+		}
+		taskAss.TasksName = userId;
+//		taskAss.startTime = VciDateUtil.date2Str(startDate, VciDateUtil.DateFormat);
+		if(endDate == null){
+			endDate = VciDateUtil.getDateAddDay(startDate, 30);//榛樿鏈�澶氫唬鐞嗕竴涓湀
+		}
+//		taskAss.endTime = VciDateUtil.date2Str(endDate, VciDateUtil.DateFormat);
+//		taskAss.isTrue = isNowEnable?1:0;
+		taskAss.fromUser =WebUtil.getCurrentUserSessionInfo().getUserId();
+//		try {
+//			getWorkService().saveOrUpdateTasksAssigned(taskAss, WebUtil.getUserEntityInfo("娴佺▼"));
+//		} catch (VCIError e) {
+//			throw WebUtil.getVciBaseException(e);
+//		}
+	}
+	
+	
+
+	@Override
+	public void endProxy()
+			throws VciBaseException {
+		//骞冲彴涓嶆敮鎸佸仠鐢ㄥ惎鐢ㄤ唬鐞嗕俊鎭�..鍙互鏌ヨ鍑烘潵鍐嶉噸鏂版坊鍔犮��
+//		try {
+//			UserEntityInfo  uei = WebUtil.getUserEntityInfo( "娴佺▼");
+//			getWorkService().deleteTasksAssignedByUserName(new String[]{uei.userName}, uei);
+//		} catch (VCIError e) {
+//			throw WebUtil.getVciBaseException(e);
+//		}
+	}
+	
+	@Override
+	public TasksAssigned getProxy() throws VciBaseException{
+		TasksAssigned assign = null;
+//		try {
+//			TasksAssignedInfo taskAss = getWorkService().getTasksAssignedByUserName("", WebUtil.getUserEntityInfo( "娴佺▼"));
+//			if(taskAss!=null && StringUtils.isNotEmpty(taskAss.id)){
+//				assign = new TasksAssigned();
+//				assign.setId(taskAss.id);
+//				assign.setTasksName(taskAss.TasksName);
+//				assign.setStartTime(taskAss.startTime);
+//				assign.setEndTime(taskAss.endTime);
+//				assign.setFromUser(taskAss.fromUser);
+//				assign.setIsTrue(taskAss.isTrue);
+//				assign.setUserName(taskAss.userName);
+//			}
+//		} catch (VCIError e) {
+//			throw WebUtil.getVciBaseException(e);
+//		}
+		return assign;
+	}
+
+	/**
+	 * 缁撴潫娴佺▼
+	 *
+	 * @param executionId 娴佺▼鎵ц涓婚敭
+	 * @throws VciBaseException
+	 */
+	@Override
+	public void endProcess(String executionId) throws VciBaseException {
+//		try {
+			DataGrid dataGrid  = getDataByProcess(executionId,null);
+			//鍏堣幏鍙栦竴涓�
+			UserEntityInfo userEntityInfo = WebUtil.getUserEntityInfo("娴佺▼");
+			String resetStatus = null;
+//			try{
+//				resetStatus = getWorkService().getProcessVariable(executionId, WFVariablesKeyConstant.RESET_STATUS, userEntityInfo);
+//			}catch (Throwable e){
+//				logger.error("鑾峰彇娴佺▼鐨勫彉閲忓嚭閿�",e);
+//			}
+//			getWorkService().endProcessInstanceByplatform(executionId,userEntityInfo);
+			//骞冲彴娌℃湁鑷姩灏嗕笟鍔℃暟鎹仮澶嶅埌涔嬪墠鐨勭姸鎬�
+			if(StringUtils.isNotBlank(resetStatus)){
+				resetLcStatusForBusinessData(dataGrid.getData(),resetStatus);
+			}
+//		} catch (VCIError vciError) {
+//			throw WebUtil.getVciBaseException(vciError);
+//		}
+	}
+
+	private void  resetLcStatusForBusinessData(List<Map> bussinesDataList,String resetStatus) throws VciBaseException{
+		if(bussinesDataList!=null && bussinesDataList.size() > 0){
+			String btmType = "";
+			String lctId = "";
+			List<String> oidList = new ArrayList<String>();
+			//娴佺▼涓殑涓氬姟鏁版嵁閮芥槸鍦ㄥ悓涓�涓笟鍔$被鍨嬩笅鐨�
+			for(Map data : bussinesDataList){
+				btmType = (String)data.get("btmname");
+				String oid = (String)data.get("oid");
+				lctId = (String)data.get("lctid");
+				oidList.add(oid);
+			}
+			//杞崲鎴�500闀垮害鐨�
+			List<ClientBusinessObject> cboList = new ArrayList<ClientBusinessObject>();
+			if(oidList.size()>500){
+				List<List<String>> oidListForIn = WebUtil.switchListForOracleIn(oidList);
+				for(List<String> oidListForInRecord : oidListForIn){
+					Map<String,String> conditionMap = new HashMap<String, String>();
+					conditionMap.put("oid",QueryOptionConstant.IN + "(" + WebUtil.toInSql(oidListForInRecord.toArray(new String[0])) + ")" );
+					List<ClientBusinessObject> tempCbos = boService.queryCBO(btmType,conditionMap);
+					cboList.addAll(tempCbos);
+				}
+			}else{
+				Map<String,String> conditionMap = new HashMap<String, String>();
+				conditionMap.put("oid",QueryOptionConstant.IN + "(" + WebUtil.toInSql(oidList.toArray(new String[0])) + ")" );
+				List<ClientBusinessObject> tempCbos = boService.queryCBO(btmType,conditionMap);
+				cboList.addAll(tempCbos);
+			}
+			//鎵惧埌杩欎釜涓氬姟绫诲瀷鐨勮捣濮嬬姸鎬�
+			lifeCycleService.transCboStatus(cboList,resetStatus);//鎵ц閲嶇疆
+		}
+	}
+
+	/**
+	 * 鏍规嵁涓氬姟绫诲瀷鏌ヨ姝e湪鎵ц鐨勬祦绋�
+	 *
+	 * @param bussinessOid 涓氬姟绫诲瀷鏁版嵁
+	 * @param btmName      涓氬姟绫诲瀷鍚嶇О
+	 * @return
+	 * @throws VciBaseException
+	 */
+	@Override
+	public List<ProcessInstanceVO> listExecutingProcessByBussinessOid(String bussinessOid, String btmName) throws VciBaseException {
+		Map<String,String> conditionMap = new HashMap<String, String>();
+		conditionMap.put("oid",QueryOptionConstant.IN + "(select f_oid from platformlt_" + getTaskDataLink() + " where f_btwname='" + getWorkIntanceBtmType() + "' " +
+								" and t_btwname='" + btmName + "' and t_oid = '" + bussinessOid + "' )");
+		conditionMap.put("lcstatus","Executing");
+		List<ProcessInstance> processInstances = boService.queryObject(ProcessInstance.class,conditionMap);
+		List<ProcessInstanceVO> instanceVOS = new ArrayList<>();
+		Optional.ofNullable(processInstances).orElseGet(()->new ArrayList<>()).stream().forEach(instance->{
+			ProcessInstanceVO instanceVO = new ProcessInstanceVO();
+			BeanUtil.convert(instance,instanceVO);
+			instanceVOS.add(instanceVO);
+		});
+		return instanceVOS;
+	}
+
+	/**
+	 * 鎵归噺缁堟娴佺▼锛�
+	 *
+	 * @param executionIds  娴佺▼鐨勬墽琛屼富閿�
+	 * @param note          缁堟鍘熷洜
+	 * @throws VciBaseException
+	 */
+	@Override
+	public void batchEndProcess(Collection<String> executionIds, String note) throws VciBaseException {
+		WebUtil.alertNotNull(executionIds,"娴佺▼鎵ц涓婚敭淇℃伅");
+		for(String executionId : executionIds){
+			endProcess(executionId);
+		}
+	}
+
+	/**
+	 * 鑾峰彇娴佺▼xml鐨勪簩杩涘埗鍐呭
+	 * @param jbpmDeploymentId
+	 * @return 娴佺▼鐨勪簩杩涘埗鍐呭
+	 * @throws VciBaseException  
+	 */
+	@Override
+	public byte[] getProcessXmlContent(String jbpmDeploymentId) throws VciBaseException {
+		WebUtil.alertNotNull("娴佺▼鎵ц涓婚敭淇℃伅",jbpmDeploymentId);
+//		try {
+//			return getWorkService().getProcessResource(jbpmDeploymentId,".xml");
+//		} catch (VCIError e) {
+//			throw WebUtil.getVciBaseException(e);
+//		}
+		return null;
+	}
+
+	/**
+	 * 娴佺▼鍒嗙被鐨勬暟鎹璞¤浆鎹负鏄剧ず瀵硅薄
+	 * @param doCollection 鏁版嵁瀵硅薄鐨勯泦鍚�
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	@Override
+	public List<ProcessClassifyVO>  processClassifyDO2VOs(Collection<WFProcessClassifyDO> doCollection){
+		List<ProcessClassifyVO> voList = new ArrayList<>();
+		if(!CollectionUtils.isEmpty(doCollection)){
+			doCollection.stream().forEach(classifyDO->{
+				ProcessClassifyVO classifyVO = processClassifyDO2VO(classifyDO);
+				voList.add(classifyVO);
+			});
+		}
+		return voList;
+	}
+
+	/**
+	 * 娴佺▼鍒嗙被鐨勬暟鎹璞¤浆鎹负鏄剧ず瀵硅薄
+	 * @param classifyDO 鏁版嵁瀵硅薄
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	@Override
+	public ProcessClassifyVO processClassifyDO2VO(WFProcessClassifyDO classifyDO){
+		ProcessClassifyVO classifyVO = new ProcessClassifyVO();
+		if(classifyVO!=null){
+			BeanUtil.convert(classifyDO,classifyVO);
+		}
+		return classifyVO;
+	}
+
+	/**
+	 * 娴佺▼妯℃澘鐨勬暟鎹璞¤浆鎹负鏄剧ず瀵硅薄
+	 * @param doCollection 鏁版嵁瀵硅薄闆嗗悎
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	@Override
+	public List<ProcessTemplateVO> processTemplateDO2VOs(Collection<WFProcessTemplateDO> doCollection){
+		List<ProcessTemplateVO> voList = new ArrayList<>();
+		if(!CollectionUtils.isEmpty(doCollection)){
+			doCollection.stream().forEach(templateDO->{
+				ProcessTemplateVO templateVO = processTemplateDO2VO(templateDO);
+				voList.add(templateVO);
+			});
+		}
+		return voList;
+	}
+
+	/**
+	 * 娴佺▼妯℃澘鐨勬暟鎹璞¤浆鎹负鏄剧ず瀵硅薄
+	 * @param templateDO 鏁版嵁瀵硅薄
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	@Override
+	public ProcessTemplateVO processTemplateDO2VO(WFProcessTemplateDO templateDO){
+		ProcessTemplateVO templateVO = new ProcessTemplateVO();
+		if(templateVO!=null){
+			BeanUtil.convert(templateDO,templateVO);
+		}
+		return templateVO;
+	}
+
+	/**
+	 * 浣跨敤鐢ㄦ埛鍚嶆煡璇㈠緟鍔炰换鍔$殑涓暟
+	 *
+	 * @param username 鐢ㄦ埛鍚�
+	 * @return 涓暟
+	 */
+	@Override
+	public int countUndoTaskByUsername(String username) {
+		Map<String,String> conditionMap = new HashMap<String, String>();
+		conditionMap.put("businesstype", "5");//鏈」鐩病鏈夊疄闄呯殑鎰忎箟
+		conditionMap.put("principal", username);
+		conditionMap.put("lcstatus", "Executing");
+		return boService.queryCount(workitemBtmType,conditionMap);
+	}
+
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/BaseLinkModelDTO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/BaseLinkModelDTO.java
new file mode 100644
index 0000000..e4b9e4e
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/BaseLinkModelDTO.java
@@ -0,0 +1,325 @@
+package com.vci.web.dto;
+
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.vci.starter.web.annotation.Column;
+import com.vci.web.model.BaseLinkModel;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 閾炬帴绫诲瀷鐨勬暟鎹紶杈撳璞�
+ * @author weidy
+ * @date 2021/4/20
+ */
+public class BaseLinkModelDTO extends BaseLinkModel {
+
+    /**
+     * 鏁版嵁
+     */
+    private Map<String,String> data = new HashMap<>();
+
+    /**
+     * 閾炬帴绫诲瀷
+     */
+    private String linkType;
+
+    /**
+     * 鏄惁鍙嶅悜
+     */
+    private boolean direction;
+
+    /**
+     * 鍓嶇疆浜嬩欢
+     */
+    private String preEvent;
+
+    /**
+     * 鍚庣疆浜嬩欢
+     */
+    private String postEvent;
+
+    /**
+     * 瑕佸彂甯冪殑鏂囦欢鐨勪富閿�
+     */
+    private List<String> releaseFileOids = new ArrayList<>();
+
+    /**
+     * to绔崌鐗堟椂鐨勬暟鎹�
+     */
+    private String toCopyFromVersion;
+
+    /**
+     * to绔崌鐗堟
+     */
+    private boolean toUpVersion = false;
+
+    /**
+     * to绔崌鐗堟湰
+     */
+    private boolean toUpRevision = false;
+
+    /**
+     * 鏉ユ簮鏁版嵁
+     */
+    private List<Map<String,String>> sourceData = new ArrayList<>();
+
+    /**
+     * 閫夋嫨鏁版嵁
+     */
+    private List<Map<String,String>> selectData = new ArrayList<>();
+
+    /**
+     * from绔笟鍔$被鍨�
+     */
+    @Column(name="f_btwname",length = 30)
+    @JSONField(name = "f_btwname")
+    private String fbtmname;
+
+    /**
+     * to绔笟鍔$被鍨�
+     */
+    @Column(name="t_btwname",length = 30)
+    @JSONField(name = "t_btwname")
+    private String tbtmname;
+
+    /**
+     * from绔富閿�
+     */
+    @Column(name="f_oid",length = 50)
+    @JSONField(name = "f_oid")
+    private String foid;
+
+    /**
+     * from绔増鏈富閿�
+     */
+    @Column(name="f_revisionoid",length = 50)
+    @JSONField(name = "f_revisionoid")
+    private String frevisionoid;
+
+    /**
+     * from绔璞′富閿�
+     */
+    @Column(name="f_nameoid",length = 50)
+    @JSONField(name = "f_nameoid")
+    private String fnameoid;
+
+
+    /**
+     * to绔富閿�
+     */
+    @Column(name="t_oid",length = 50)
+    @JSONField(name = "t_oid")
+    private String toid;
+
+    /**
+     * to绔増鏈富閿�
+     */
+    @Column(name="t_revisionoid",length = 50)
+    @JSONField(name = "t_revisionoid")
+    private String trevisionoid;
+
+    /**
+     * to绔璞′富閿�
+     */
+    @Column(name="t_nameoid",length = 50)
+    @JSONField(name = "t_nameoid")
+    private String tnameoid;
+
+
+    public List<Map<String, String>> getSourceData() {
+        return sourceData;
+    }
+
+    public void setSourceData(List<Map<String, String>> sourceData) {
+        this.sourceData = sourceData;
+    }
+
+    public List<Map<String, String>> getSelectData() {
+        return selectData;
+    }
+
+    public void setSelectData(List<Map<String, String>> selectData) {
+        this.selectData = selectData;
+    }
+
+    public Map<String, String> getData() {
+        return data;
+    }
+
+    public void setData(Map<String, String> data) {
+        this.data = data;
+    }
+
+    public String getLinkType() {
+        return linkType;
+    }
+
+    public void setLinkType(String linkType) {
+        this.linkType = linkType;
+    }
+
+    public boolean isDirection() {
+        return direction;
+    }
+
+    public void setDirection(boolean direction) {
+        this.direction = direction;
+    }
+
+    public String getPreEvent() {
+        return preEvent;
+    }
+
+    public void setPreEvent(String preEvent) {
+        this.preEvent = preEvent;
+    }
+
+    public String getPostEvent() {
+        return postEvent;
+    }
+
+    public void setPostEvent(String postEvent) {
+        this.postEvent = postEvent;
+    }
+
+    public List<String> getReleaseFileOids() {
+        return releaseFileOids;
+    }
+
+    public void setReleaseFileOids(List<String> releaseFileOids) {
+        this.releaseFileOids = releaseFileOids;
+    }
+
+    public boolean isToUpVersion() {
+        return toUpVersion;
+    }
+
+    public void setToUpVersion(boolean toUpVersion) {
+        this.toUpVersion = toUpVersion;
+    }
+
+    public boolean isToUpRevision() {
+        return toUpRevision;
+    }
+
+    public void setToUpRevision(boolean toUpRevision) {
+        this.toUpRevision = toUpRevision;
+    }
+
+    public String getToCopyFromVersion() {
+        return toCopyFromVersion;
+    }
+
+    public void setToCopyFromVersion(String toCopyFromVersion) {
+        this.toCopyFromVersion = toCopyFromVersion;
+    }
+
+    @Override
+    public String getFbtmname() {
+        return fbtmname;
+    }
+
+    @Override
+    public void setFbtmname(String fbtmname) {
+        this.fbtmname = fbtmname;
+    }
+
+    @Override
+    public String getTbtmname() {
+        return tbtmname;
+    }
+
+    @Override
+    public void setTbtmname(String tbtmname) {
+        this.tbtmname = tbtmname;
+    }
+
+    @Override
+    public String getFoid() {
+        return foid;
+    }
+
+    @Override
+    public void setFoid(String foid) {
+        this.foid = foid;
+    }
+
+    @Override
+    public String getFrevisionoid() {
+        return frevisionoid;
+    }
+
+    @Override
+    public void setFrevisionoid(String frevisionoid) {
+        this.frevisionoid = frevisionoid;
+    }
+
+    @Override
+    public String getFnameoid() {
+        return fnameoid;
+    }
+
+    @Override
+    public void setFnameoid(String fnameoid) {
+        this.fnameoid = fnameoid;
+    }
+
+    @Override
+    public String getToid() {
+        return toid;
+    }
+
+    @Override
+    public void setToid(String toid) {
+        this.toid = toid;
+    }
+
+    @Override
+    public String getTrevisionoid() {
+        return trevisionoid;
+    }
+
+    @Override
+    public void setTrevisionoid(String trevisionoid) {
+        this.trevisionoid = trevisionoid;
+    }
+
+    @Override
+    public String getTnameoid() {
+        return tnameoid;
+    }
+
+    @Override
+    public void setTnameoid(String tnameoid) {
+        this.tnameoid = tnameoid;
+    }
+
+    @Override
+    public String toString() {
+        return "BaseLinkModelDTO{" +
+                "data=" + data +
+                ", linkType='" + linkType + '\'' +
+                ", direction=" + direction +
+                ", preEvent='" + preEvent + '\'' +
+                ", postEvent='" + postEvent + '\'' +
+                ", releaseFileOids=" + releaseFileOids +
+                ", toCopyFromVersion='" + toCopyFromVersion + '\'' +
+                ", toUpVersion=" + toUpVersion +
+                ", toUpRevision=" + toUpRevision +
+                ", sourceData=" + sourceData +
+                ", selectData=" + selectData +
+                ", fbtmname='" + fbtmname + '\'' +
+                ", tbtmname='" + tbtmname + '\'' +
+                ", foid='" + foid + '\'' +
+                ", frevisionoid='" + frevisionoid + '\'' +
+                ", fnameoid='" + fnameoid + '\'' +
+                ", toid='" + toid + '\'' +
+                ", trevisionoid='" + trevisionoid + '\'' +
+                ", tnameoid='" + tnameoid + '\'' +
+                "} " + super.toString();
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/BaseLinkModelDTOList.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/BaseLinkModelDTOList.java
new file mode 100644
index 0000000..9367c89
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/BaseLinkModelDTOList.java
@@ -0,0 +1,37 @@
+package com.vci.web.dto;
+
+import com.vci.starter.web.model.BaseLinkModel;
+
+import java.util.List;
+
+/**
+ * 閾炬帴绫诲瀷鐨勬暟鎹紶杈撳璞�-鎵归噺
+ * @author weidy
+ * @date 2021/4/20
+ */
+public class BaseLinkModelDTOList extends BaseLinkModel {
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = -1691542978255896564L;
+
+    /**
+     * 鏁版嵁鐨勫垪琛�
+     */
+    private List<BaseLinkModelDTO> dataList;
+
+    public List<BaseLinkModelDTO> getDataList() {
+        return dataList;
+    }
+
+    public void setDataList(List<BaseLinkModelDTO> dataList) {
+        this.dataList = dataList;
+    }
+
+    @Override
+    public String toString() {
+        return "BaseLinkModelDTOList{" +
+                "dataList=" + dataList +
+                "} " + super.toString();
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/BaseModelDTO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/BaseModelDTO.java
new file mode 100644
index 0000000..a977c02
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/BaseModelDTO.java
@@ -0,0 +1,150 @@
+package com.vci.web.dto;
+
+
+import com.vci.starter.web.model.BaseModel;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 缂栬緫鐨勬暟鎹�,鍦ㄥ崟鏉℃暟鎹鍔犲拰淇敼鐨勬椂鍊欎娇鐢�
+ * @author weidy
+ * @date 2021-2-12
+ */
+public class BaseModelDTO extends BaseModel {
+
+    /**
+     * 鏁版嵁
+     */
+    private Map<String,String> data = new HashMap<>();
+    /**
+     * 瀛愯〃鐨勪笟鍔$被鍨�
+     */
+    private String subBtmType;
+    
+    /**
+     * 瀛愯〃鐨勬暟鎹�
+     */
+    private List<Map<String,String>> subTableData = new ArrayList<Map<String,String>>();
+
+	/**
+	 * 鍓嶇疆浜嬩欢
+	 */
+	private String preEvent;
+
+	/**
+	 * 鍚庣疆浜嬩欢
+	 */
+	private String postEvent;
+
+	/**
+	 * 瑕佸彂甯冪殑鏂囦欢鐨勪富閿�
+	 */
+	private List<String> releaseFileOids = new ArrayList<>();
+
+	/**
+	 * 鍗囩増娆�
+	 */
+	private boolean upVersion = false;
+
+	/**
+	 * 鏉ユ簮鏁版嵁
+	 */
+	private List<Map<String,String>> sourceData = new ArrayList<>();
+
+	/**
+	 * 閫夋嫨鏁版嵁
+	 */
+	private List<Map<String,String>> selectData = new ArrayList<>();
+
+	public List<Map<String, String>> getSourceData() {
+		return sourceData;
+	}
+
+	public void setSourceData(List<Map<String, String>> sourceData) {
+		this.sourceData = sourceData;
+	}
+
+	public List<Map<String, String>> getSelectData() {
+		return selectData;
+	}
+
+	public void setSelectData(List<Map<String, String>> selectData) {
+		this.selectData = selectData;
+	}
+
+	public boolean isUpVersion() {
+		return upVersion;
+	}
+
+	public void setUpVersion(boolean upVersion) {
+		this.upVersion = upVersion;
+	}
+
+	public String getPreEvent() {
+		return preEvent;
+	}
+
+	public void setPreEvent(String preEvent) {
+		this.preEvent = preEvent;
+	}
+
+	public String getPostEvent() {
+		return postEvent;
+	}
+
+	public void setPostEvent(String postEvent) {
+		this.postEvent = postEvent;
+	}
+
+	@Override
+	public Map<String, String> getData() {
+		return data;
+	}
+
+	@Override
+    public void setData(Map<String, String> data) {
+		this.data = data;
+	}
+
+	public String getSubBtmType() {
+		return subBtmType;
+	}
+
+	public void setSubBtmType(String subBtmType) {
+		this.subBtmType = subBtmType;
+	}
+
+	public List<Map<String, String>> getSubTableData() {
+		return subTableData;
+	}
+
+	public void setSubTableData(List<Map<String, String>> subTableData) {
+		this.subTableData = subTableData;
+	}
+
+	public List<String> getReleaseFileOids() {
+		return releaseFileOids;
+	}
+
+	public void setReleaseFileOids(List<String> releaseFileOids) {
+		this.releaseFileOids = releaseFileOids;
+	}
+
+	@Override
+	public String toString() {
+		return "BaseModelDTO{" +
+				"data=" + data +
+				", subBtmType='" + subBtmType + '\'' +
+				", subTableData=" + subTableData +
+				", preEvent='" + preEvent + '\'' +
+				", postEvent='" + postEvent + '\'' +
+				", releaseFileOids=" + releaseFileOids +
+				", upVersion=" + upVersion +
+				", sourceData=" + sourceData +
+				", selectData=" + selectData +
+				"} " + super.toString();
+	}
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/BaseModelDTOList.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/BaseModelDTOList.java
new file mode 100644
index 0000000..f56c4c2
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/BaseModelDTOList.java
@@ -0,0 +1,35 @@
+package com.vci.web.dto;
+
+import java.util.List;
+
+/**
+ * 涓氬姟鏁版嵁鐨勪紶杈撳璞�
+ * @author weidy
+ * @date 2021-2-12
+ */
+public class BaseModelDTOList implements java.io.Serializable{
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = 3972916997547535999L;
+
+    /**
+     * 鍒楄〃鏁版嵁
+     */
+    private List<BaseModelDTO> dataList;
+
+    public List<BaseModelDTO> getDataList() {
+        return dataList;
+    }
+
+    public void setDataList(List<BaseModelDTO> dataList) {
+        this.dataList = dataList;
+    }
+
+    @Override
+    public String toString() {
+        return "BaseModelDTOList{" +
+                "dataList=" + dataList +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/BdSelectInputCharDTO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/BdSelectInputCharDTO.java
new file mode 100644
index 0000000..74072ef
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/BdSelectInputCharDTO.java
@@ -0,0 +1,69 @@
+package com.vci.web.dto;
+
+
+import java.util.Date;
+import java.lang.*;
+
+import com.vci.starter.web.pagemodel.BaseModelVO;
+
+/**
+ * 鍙緭鍙�夊唴瀹规暟鎹紶杈撳璞�
+ * 
+ * @author weidy
+ * @date 2022-03-09
+ */
+public class BdSelectInputCharDTO extends BaseModelVO {
+
+	/**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+	private static final long serialVersionUID = 4615707116825887142L;
+
+	/**
+	 * 杈撳叆鏉ユ簮
+	 */
+	private String sourceinputflag;
+
+	/**
+	 * 鏁版嵁鎵�灞為鍩�
+	 */
+	private String sourcenamespace;
+
+
+	/**
+	 * 鑾峰彇 杈撳叆鏉ユ簮
+	 */
+	public String getSourceinputflag (){
+		return sourceinputflag;
+	}
+
+	/**
+	 * 璁剧疆 杈撳叆鏉ユ簮
+	 */
+	public void setSourceinputflag (String sourceinputflag){
+		this.sourceinputflag = sourceinputflag;
+	}
+
+	/**
+	 * 鑾峰彇 鏁版嵁鎵�灞為鍩�
+	 */
+	public String getSourcenamespace (){
+		return sourcenamespace;
+	}
+
+	/**
+	 * 璁剧疆 鏁版嵁鎵�灞為鍩�
+	 */
+	public void setSourcenamespace (String sourcenamespace){
+		this.sourcenamespace = sourcenamespace;
+	}
+
+
+	@Override
+	public String toString() {
+		return "BdSelectInputCharDTO{" +
+		"sourceinputflag='" + sourceinputflag +"',"+
+		"sourcenamespace='" + sourcenamespace +"',"+
+		"}" + super.toString();
+	}
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/DeleteDataDTO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/DeleteDataDTO.java
new file mode 100644
index 0000000..5da7c81
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/DeleteDataDTO.java
@@ -0,0 +1,105 @@
+package com.vci.web.dto;
+
+import java.util.List;
+
+/**
+ * 鍒犻櫎鐨勬暟鎹殑涓氬姟浼犺緭瀵硅薄
+ * @author weidy
+ * @date 2021/3/19
+ */
+public class DeleteDataDTO implements java.io.Serializable{
+
+    /**
+     * 鍒楄〃鏁版嵁
+     */
+    private List<BaseModelDTO> dataList;
+
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = -7983807253912311472L;
+    /**
+     * 鏍¢獙鏄惁琚紩鐢ㄧ殑寮�鍏�
+     */
+    private boolean checkLinkedFlag = false;
+
+    /**
+     * 鏄惁绾ц仈鍒犻櫎鑷弬鐓�
+     */
+    private boolean cascade = false;
+
+    /**
+     * 楂樼骇绾ц仈鍒犻櫎锛屾寚瀹歛dmin鎵嶈兘鍒犻櫎
+     */
+    private boolean adminCascade = false;
+
+    /**
+     * 鏍¢獙涓嶈兘鍒犻櫎鏃剁殑灞炴�э紝鏍煎紡涓簒xx=yyy&zzz=aaa
+     */
+    private String checkNotDelete;
+    /**
+     * 涓嶈兘鍒犻櫎鐨勬彁绀鸿鍙�
+     */
+    private String checkNotDeleteMsg;
+
+    public boolean isCheckLinkedFlag() {
+        return checkLinkedFlag;
+    }
+
+    public void setCheckLinkedFlag(boolean checkLinkedFlag) {
+        this.checkLinkedFlag = checkLinkedFlag;
+    }
+
+    public boolean isCascade() {
+        return cascade;
+    }
+
+    public void setCascade(boolean cascade) {
+        this.cascade = cascade;
+    }
+
+    public boolean isAdminCascade() {
+        return adminCascade;
+    }
+
+    public void setAdminCascade(boolean adminCascade) {
+        this.adminCascade = adminCascade;
+    }
+
+    public String getCheckNotDelete() {
+        return checkNotDelete;
+    }
+
+    public void setCheckNotDelete(String checkNotDelete) {
+        this.checkNotDelete = checkNotDelete;
+    }
+
+    public String getCheckNotDeleteMsg() {
+        return checkNotDeleteMsg;
+    }
+
+    public void setCheckNotDeleteMsg(String checkNotDeleteMsg) {
+        this.checkNotDeleteMsg = checkNotDeleteMsg;
+    }
+
+    public List<BaseModelDTO> getDataList() {
+        return dataList;
+    }
+
+    public void setDataList(List<BaseModelDTO> dataList) {
+        this.dataList = dataList;
+    }
+
+
+    @Override
+    public String toString() {
+        return "DeleteDataDTO{" +
+                "dataList=" + dataList +
+                ", checkLinkedFlag=" + checkLinkedFlag +
+                ", cascade=" + cascade +
+                ", adminCascade=" + adminCascade +
+                ", checkNotDelete='" + checkNotDelete + '\'' +
+                ", checkNotDeleteMsg='" + checkNotDeleteMsg + '\'' +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/DeleteLinkDataDTO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/DeleteLinkDataDTO.java
new file mode 100644
index 0000000..6558dd1
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/DeleteLinkDataDTO.java
@@ -0,0 +1,131 @@
+package com.vci.web.dto;
+
+import java.util.List;
+
+/**
+ * 鍒犻櫎鐨勯摼鎺ョ被鍨嬩紶杈撳璞�
+ * @author weidy
+ * @date 2021/3/19
+ */
+public class DeleteLinkDataDTO implements java.io.Serializable{
+
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = 8997465469088479686L;
+    /**
+     * 鍒楄〃鏁版嵁
+     */
+    private List<BaseLinkModelDTO> dataList;
+    /**
+     * 鏍¢獙鏄惁琚紩鐢ㄧ殑寮�鍏�
+     */
+    private boolean checkLinkedFlag = false;
+
+    /**
+     * 鏄惁绾ц仈鍒犻櫎鑷弬鐓�
+     */
+    private boolean cascade = false;
+
+    /**
+     * 鏄惁鍒犻櫎鍏宠仈鐨則o鐨勬暟鎹�
+     */
+    private boolean deleteToData = true;
+
+    /**
+     * 鏄惁鍒犻櫎鍏宠仈鐨刦rom绔殑鏁版嵁
+     */
+    private boolean deleteFromData = false;
+
+    /**
+     * 楂樼骇绾ц仈鍒犻櫎锛屾寚瀹歛dmin鎵嶈兘鍒犻櫎
+     */
+    private boolean adminCascade = false;
+
+    /**
+     * 鏍¢獙涓嶈兘鍒犻櫎鏃剁殑灞炴�э紝鏍煎紡涓簒xx=yyy&zzz=aaa
+     */
+    private String checkNotDelete;
+    /**
+     * 涓嶈兘鍒犻櫎鐨勬彁绀鸿鍙�
+     */
+    private String checkNotDeleteMsg;
+
+    public boolean isCheckLinkedFlag() {
+        return checkLinkedFlag;
+    }
+
+    public void setCheckLinkedFlag(boolean checkLinkedFlag) {
+        this.checkLinkedFlag = checkLinkedFlag;
+    }
+
+    public boolean isCascade() {
+        return cascade;
+    }
+
+    public void setCascade(boolean cascade) {
+        this.cascade = cascade;
+    }
+
+    public boolean isAdminCascade() {
+        return adminCascade;
+    }
+
+    public void setAdminCascade(boolean adminCascade) {
+        this.adminCascade = adminCascade;
+    }
+
+    public String getCheckNotDelete() {
+        return checkNotDelete;
+    }
+
+    public void setCheckNotDelete(String checkNotDelete) {
+        this.checkNotDelete = checkNotDelete;
+    }
+
+    public String getCheckNotDeleteMsg() {
+        return checkNotDeleteMsg;
+    }
+
+    public void setCheckNotDeleteMsg(String checkNotDeleteMsg) {
+        this.checkNotDeleteMsg = checkNotDeleteMsg;
+    }
+
+    public List<BaseLinkModelDTO> getDataList() {
+        return dataList;
+    }
+
+    public void setDataList(List<BaseLinkModelDTO> dataList) {
+        this.dataList = dataList;
+    }
+
+    public boolean isDeleteToData() {
+        return deleteToData;
+    }
+
+    public void setDeleteToData(boolean deleteToData) {
+        this.deleteToData = deleteToData;
+    }
+
+    public boolean isDeleteFromData() {
+        return deleteFromData;
+    }
+
+    public void setDeleteFromData(boolean deleteFromData) {
+        this.deleteFromData = deleteFromData;
+    }
+
+    @Override
+    public String toString() {
+        return "DeleteLinkDataDTO{" +
+                "dataList=" + dataList +
+                ", checkLinkedFlag=" + checkLinkedFlag +
+                ", cascade=" + cascade +
+                ", deleteToData=" + deleteToData +
+                ", deleteFromData=" + deleteFromData +
+                ", adminCascade=" + adminCascade +
+                ", checkNotDelete='" + checkNotDelete + '\'' +
+                ", checkNotDeleteMsg='" + checkNotDeleteMsg + '\'' +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/FormDataDTO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/FormDataDTO.java
new file mode 100644
index 0000000..8e70d85
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/FormDataDTO.java
@@ -0,0 +1,31 @@
+package com.vci.web.dto;
+
+/**
+ * 琛ㄥ崟鏂板鍜屼慨鏀规暟鎹�
+ * @author weidy
+ * @date 2021/2/16
+ */
+public class FormDataDTO extends BaseModelDTO{
+
+    /**
+     * 琛ㄥ崟瀹氫箟
+     */
+    private String formDefineId;
+
+
+    public String getFormDefineId() {
+        return formDefineId;
+    }
+
+    public void setFormDefineId(String formDefineId) {
+        this.formDefineId = formDefineId;
+    }
+
+    @Override
+    public String toString() {
+        return "FormDataDTO{" +
+                "formDefineId='" + formDefineId + '\'' +
+                "} " + super.toString();
+    }
+    //榛樿鍊煎湪鍓嶇澶勭悊瀹�
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/FormDataDTOList.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/FormDataDTOList.java
new file mode 100644
index 0000000..06886d7
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/FormDataDTOList.java
@@ -0,0 +1,35 @@
+package com.vci.web.dto;
+
+import java.util.List;
+
+/**
+ * 琛ㄥ崟鏁版嵁鐨勯泦鍚�
+ * @author weidy
+ * @date 2021/2/16
+ */
+public class FormDataDTOList implements java.io.Serializable{
+
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = -178412998063175649L;
+    /**
+     * 琛ㄥ崟鐨勬暟鎹泦鍚�
+     */
+    private List<FormDataDTO> formDataDTOS;
+
+    public List<FormDataDTO> getFormDataDTOS() {
+        return formDataDTOS;
+    }
+
+    public void setFormDataDTOS(List<FormDataDTO> formDataDTOS) {
+        this.formDataDTOS = formDataDTOS;
+    }
+
+    @Override
+    public String toString() {
+        return "FormDataDTOList{" +
+                "formDataDTOS=" + formDataDTOS +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/FormLinkDataDTO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/FormLinkDataDTO.java
new file mode 100644
index 0000000..5e84392
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/FormLinkDataDTO.java
@@ -0,0 +1,29 @@
+package com.vci.web.dto;
+
+
+/**
+ * 閾炬帴绫诲瀷鐨勮〃鍗曢噷娣诲姞鎴栬�呬慨鏀�
+ * @author weidy
+ * @date 2021/4/20
+ */
+public class FormLinkDataDTO extends BaseLinkModelDTO {
+    /**
+     * 琛ㄥ崟瀹氫箟
+     */
+    private String formDefineId;
+
+    public String getFormDefineId() {
+        return formDefineId;
+    }
+
+    public void setFormDefineId(String formDefineId) {
+        this.formDefineId = formDefineId;
+    }
+
+    @Override
+    public String toString() {
+        return "FormLinkDataDTO{" +
+                "formDefineId='" + formDefineId + '\'' +
+                "} " + super.toString();
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/FormLinkDataDTOList.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/FormLinkDataDTOList.java
new file mode 100644
index 0000000..8d78417
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/FormLinkDataDTOList.java
@@ -0,0 +1,34 @@
+package com.vci.web.dto;
+
+import java.util.List;
+
+/**
+ * 閾炬帴绫诲瀷鐨勮〃鍗曟壒閲忓璞�
+ * @author weidy
+ * @date 2021/4/20
+ */
+public class FormLinkDataDTOList implements java.io.Serializable{
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = -7409760405677930876L;
+    /**
+     * 鏁版嵁浼犺緭瀵硅薄
+     */
+    private List<FormLinkDataDTO> dataDTOList;
+
+    public List<FormLinkDataDTO> getDataDTOList() {
+        return dataDTOList;
+    }
+
+    public void setDataDTOList(List<FormLinkDataDTO> dataDTOList) {
+        this.dataDTOList = dataDTOList;
+    }
+
+    @Override
+    public String toString() {
+        return "FormLinkDataDTOList{" +
+                "dataDTOList=" + dataDTOList +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/LoginUserDTO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/LoginUserDTO.java
new file mode 100644
index 0000000..9bfadab
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/LoginUserDTO.java
@@ -0,0 +1,66 @@
+package com.vci.web.dto;
+
+/**
+ * 鐢ㄤ簬鑾峰彇鐧诲綍鐨勬椂鍊欑殑璇锋眰淇℃伅鐨勭敤鎴�
+ * @author weidy
+ * @date 2021-2-12
+ *
+ */
+public class LoginUserDTO implements java.io.Serializable{
+
+	/**
+	 * 搴忓垪鍖�
+	 */
+	private static final long serialVersionUID = 1553405235730589679L;
+	/**
+	 * 鐢ㄦ埛鍚�
+	 */
+	private String userId;
+
+	/**
+	 * 瀵嗙爜,鍗曠偣鐧诲綍涓嶄紶閫�
+	 */
+	private String password;
+
+	/**
+	 * 鏄惁寮哄埗鐧诲綍锛屽崟鐐圭櫥褰曟椂寮哄埗涓簍rue
+	 */
+	private boolean forceLogin;
+
+	/**
+	 * 璇█浠g爜
+	 */
+	private String langCode;
+
+	public String getUserId() {
+		return userId;
+	}
+
+	public void setUserId(String userId) {
+		this.userId = userId;
+	}
+
+	public String getPassword() {
+		return password;
+	}
+
+	public void setPassword(String password) {
+		this.password = password;
+	}
+
+	public boolean isForceLogin() {
+		return forceLogin;
+	}
+
+	public void setForceLogin(boolean forceLogin) {
+		this.forceLogin = forceLogin;
+	}
+
+	public String getLangCode() {
+		return langCode;
+	}
+
+	public void setLangCode(String langCode) {
+		this.langCode = langCode;
+	}
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsAttributeDTO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsAttributeDTO.java
new file mode 100644
index 0000000..3636851
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsAttributeDTO.java
@@ -0,0 +1,249 @@
+package com.vci.web.dto;
+
+import java.util.Date;
+
+/**
+ * 灞炴�ф暟鎹紶杈撳璞�
+ * @author weidy
+ * @date 2019/10/14 17:50
+ */
+public class OsAttributeDTO implements java.io.Serializable {
+
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = 2492852474710986720L;
+
+    /**
+     * 涓婚敭
+     */
+    private String oid;
+
+    /**
+     * 灞炴�ц嫳鏂囧悕绉�
+     */
+    private String id;
+
+    /**
+     * 灞炴�т腑鏂囧悕绉�
+     */
+    private String name;
+
+    /**
+     * 鎻忚堪
+     */
+    private String description;
+
+    /**
+     * 灞炴�х被鍨嬶紝浣跨敤鏋氫妇VciFieldTypeEnum
+     */
+    private String attributeDataType;
+
+    /**
+     * 鏄惁鍙互涓虹┖
+     */
+    private boolean nullableFlag;
+
+    /**
+     * 榛樿鍊�
+     */
+    private String defaultValue;
+
+
+    /**
+     * 浣跨敤鏋氫妇鑻辨枃鍚嶇О
+     */
+    private String enumId;
+
+    /**
+     * 浣跨敤鏋氫妇鐨勪腑鏂囧悕绉�
+     */
+    private String enumName;
+
+    /**
+     * 鍙傜収鐨勪笟鍔$被鍨嬬紪鍙�
+     */
+    private String btmTypeId;
+
+    /**
+     * 鍙傜収鐨勪笟鍔$被鍨嬪悕绉�
+     */
+    private String btmTypeName;
+
+    /**
+     * 灞炴�х殑闀垮害
+     */
+    private Integer attrLength;
+
+    /**
+     * 灏忔暟绮惧害浣嶆暟
+     */
+    private Integer precisionLength;
+
+    /**
+     * 灏忔暟鍒诲害浣嶆暟
+     */
+    private Integer scaleLength;
+
+
+    /**
+     * 鍙栧�艰寖鍥�
+     */
+    private String range;
+
+    /**
+     * 鏃堕棿鎴筹紝鏍煎紡鏄痽yyy-MM-dd HH:mm:ss.SSS
+     */
+    private Date ts;
+
+    public String getOid() {
+        return oid;
+    }
+
+    public void setOid(String oid) {
+        this.oid = oid;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getAttributeDataType() {
+        return attributeDataType;
+    }
+
+    public void setAttributeDataType(String attributeDataType) {
+        this.attributeDataType = attributeDataType;
+    }
+
+
+    public boolean isNullableFlag() {
+        return nullableFlag;
+    }
+
+    public void setNullableFlag(boolean nullableFlag) {
+        this.nullableFlag = nullableFlag;
+    }
+
+    public String getDefaultValue() {
+        return defaultValue;
+    }
+
+    public void setDefaultValue(String defaultValue) {
+        this.defaultValue = defaultValue;
+    }
+
+    public String getEnumId() {
+        return enumId;
+    }
+
+    public void setEnumId(String enumId) {
+        this.enumId = enumId;
+    }
+
+    public String getEnumName() {
+        return enumName;
+    }
+
+    public void setEnumName(String enumName) {
+        this.enumName = enumName;
+    }
+
+    public String getBtmTypeId() {
+        return btmTypeId;
+    }
+
+    public void setBtmTypeId(String btmTypeId) {
+        this.btmTypeId = btmTypeId;
+    }
+
+    public String getBtmTypeName() {
+        return btmTypeName;
+    }
+
+    public void setBtmTypeName(String btmTypeName) {
+        this.btmTypeName = btmTypeName;
+    }
+
+    public Integer getAttrLength() {
+        return attrLength;
+    }
+
+    public void setAttrLength(Integer attrLength) {
+        this.attrLength = attrLength;
+    }
+
+    public Integer getPrecisionLength() {
+        return precisionLength;
+    }
+
+    public void setPrecisionLength(Integer precisionLength) {
+        this.precisionLength = precisionLength;
+    }
+
+    public String getRange() {
+        return range;
+    }
+
+    public void setRange(String range) {
+        this.range = range;
+    }
+
+    public Date getTs() {
+        return ts;
+    }
+
+    public void setTs(Date ts) {
+        this.ts = ts;
+    }
+
+    public Integer getScaleLength() {
+        return scaleLength;
+    }
+
+    public void setScaleLength(Integer scaleLength) {
+        this.scaleLength = scaleLength;
+    }
+
+    @Override
+    public String toString() {
+        return "OsAttributeDTO{" +
+                "oid='" + oid + '\'' +
+                ", id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", description='" + description + '\'' +
+                ", attributeDataType='" + attributeDataType + '\'' +
+                ", nullableFlag=" + nullableFlag +
+                ", defaultValue='" + defaultValue + '\'' +
+                ", enumId='" + enumId + '\'' +
+                ", enumName='" + enumName + '\'' +
+                ", btmTypeId='" + btmTypeId + '\'' +
+                ", btmTypeName='" + btmTypeName + '\'' +
+                ", attrLength=" + attrLength +
+                ", precisionLength=" + precisionLength +
+                ", scaleLength=" + scaleLength +
+                ", range='" + range + '\'' +
+                ", ts=" + ts +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsBtmTypeDTO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsBtmTypeDTO.java
new file mode 100644
index 0000000..9e42d07
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsBtmTypeDTO.java
@@ -0,0 +1,374 @@
+package com.vci.web.dto;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 涓氬姟绫诲瀷娣诲姞鎴栬�呬慨鏀规椂鐨勬暟鎹紶杈撳璞�
+ * @author weidy
+ * @date 2019/10/14 16:43
+ */
+public class OsBtmTypeDTO implements java.io.Serializable{
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = 2009350578651813260L;
+    /**
+     * 涓婚敭
+     */
+    private String oid;
+
+    /**
+     * 涓氬姟绫诲瀷鑻辨枃鍚嶇О
+     */
+    private String id;
+
+    /**
+     * 涓氬姟绫诲瀷涓枃鍚嶇О
+     */
+    private String name;
+
+    /**
+     * 鏁版嵁搴撹〃鐨勫悕绉�
+     */
+    private String tableName;
+
+    /**
+     * 鎻忚堪
+     */
+    private String description;
+
+
+    /**
+     * 鐗堟湰瑙勫垯鐨勭紪鍙�
+     */
+    private String revisionRuleId;
+
+    /**
+     * 鐗堟湰瑙勫垯鐨勫悕绉�
+     */
+    private String revisionRuleName;
+
+    /**
+     * 鍒嗛殧绗�
+     */
+    private String revisionSep;
+
+    /**
+     * 鏄惁鎵嬪姩杈撳叆鐗堟湰
+     */
+    private boolean inputRevisionFlag;
+
+    /**
+     * 鏄惁鎶借薄鍖�
+     */
+    private boolean abstractFlag;
+
+    /**
+     * 鏄惁鎺у埗鐗堟湰
+     */
+    private boolean revisionFlag;
+
+    /**
+     * 鏄惁鎺у埗鐢熷懡鍛ㄦ湡
+     */
+    private boolean lifeCycleFlag;
+
+    /**
+     * 鏄惁鎺у埗瀵嗙骇
+     */
+    private boolean secretFlag;
+
+
+    /**
+     * 瀹炰緥鍖栫被
+     */
+    private String implClass;
+
+    /**
+     * C#
+     */
+    private String shape;
+
+
+    /**
+     * 鐢熷懡鍛ㄦ湡鐨勮嫳鏂囧悕绉�
+     */
+    private String lifeCycleId;
+
+    /**
+     * 鐢熷懡鍛ㄦ湡鐨勪腑鏂囧悕绉�
+     */
+    private String lifeCycleName;
+
+    /**
+     * 鐗堟瑙勫垯
+     */
+    private String versionRule;
+
+    /**
+     * 澶囩敤鐢熷懡鍛ㄦ湡鑻辨枃鍚嶇О
+     */
+    private String subLifeCycleId;
+
+    /**
+     * 澶囩敤鐢熷懡鍛ㄦ湡涓枃鍚嶇О
+     */
+    private String subLifeCycleName;
+
+    /**
+     * 鏄惁涓鸿鍥�
+     */
+    private boolean viewFlag;
+
+    /**
+     * 瑙嗗浘鍒涘缓鐨剆ql璇彞
+     */
+    private String viewCreateSql;
+
+    /**
+     * 绫荤殑鍏ㄨ矾寰�
+     */
+    private String classFullName;
+
+    /**
+     * 娣诲姞鎴栬�呯Щ闄ょ殑灞炴�т俊鎭�
+     */
+    private List<OsBtmTypeLinkAttributesDTO> attributesDTOList;
+
+    /**
+     * 鏃堕棿鎴筹紝鐢ㄤ簬鏍¢獙鏄惁鏈�鏂版暟鎹�
+     */
+    private Date ts;
+
+    public String getOid() {
+        return oid;
+    }
+
+    public void setOid(String oid) {
+        this.oid = oid;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getRevisionRuleId() {
+        return revisionRuleId;
+    }
+
+    public void setRevisionRuleId(String revisionRuleId) {
+        this.revisionRuleId = revisionRuleId;
+    }
+
+    public String getRevisionRuleName() {
+        return revisionRuleName;
+    }
+
+    public void setRevisionRuleName(String revisionRuleName) {
+        this.revisionRuleName = revisionRuleName;
+    }
+
+    public String getRevisionSep() {
+        return revisionSep;
+    }
+
+    public void setRevisionSep(String revisionSep) {
+        this.revisionSep = revisionSep;
+    }
+
+    public boolean isInputRevisionFlag() {
+        return inputRevisionFlag;
+    }
+
+    public void setInputRevisionFlag(boolean inputRevisionFlag) {
+        this.inputRevisionFlag = inputRevisionFlag;
+    }
+
+    public boolean isAbstractFlag() {
+        return abstractFlag;
+    }
+
+    public void setAbstractFlag(boolean abstractFlag) {
+        this.abstractFlag = abstractFlag;
+    }
+
+    public boolean isRevisionFlag() {
+        return revisionFlag;
+    }
+
+    public void setRevisionFlag(boolean revisionFlag) {
+        this.revisionFlag = revisionFlag;
+    }
+
+    public boolean isLifeCycleFlag() {
+        return lifeCycleFlag;
+    }
+
+    public void setLifeCycleFlag(boolean lifeCycleFlag) {
+        this.lifeCycleFlag = lifeCycleFlag;
+    }
+
+    public boolean isSecretFlag() {
+        return secretFlag;
+    }
+
+    public void setSecretFlag(boolean secretFlag) {
+        this.secretFlag = secretFlag;
+    }
+
+    public String getImplClass() {
+        return implClass;
+    }
+
+    public void setImplClass(String implClass) {
+        this.implClass = implClass;
+    }
+
+    public String getShape() {
+        return shape;
+    }
+
+    public void setShape(String shape) {
+        this.shape = shape;
+    }
+
+    public String getVersionRule() {
+        return versionRule;
+    }
+
+    public void setVersionRule(String versionRule) {
+        this.versionRule = versionRule;
+    }
+
+    public List<OsBtmTypeLinkAttributesDTO> getAttributesDTOList() {
+        return attributesDTOList;
+    }
+
+    public void setAttributesDTOList(List<OsBtmTypeLinkAttributesDTO> attributesDTOList) {
+        this.attributesDTOList = attributesDTOList;
+    }
+
+    public Date getTs() {
+        return ts;
+    }
+
+    public void setTs(Date ts) {
+        this.ts = ts;
+    }
+
+    public String getTableName() {
+        return tableName;
+    }
+
+    public void setTableName(String tableName) {
+        this.tableName = tableName;
+    }
+
+    public boolean isViewFlag() {
+        return viewFlag;
+    }
+
+    public void setViewFlag(boolean viewFlag) {
+        this.viewFlag = viewFlag;
+    }
+
+    public String getViewCreateSql() {
+        return viewCreateSql;
+    }
+
+    public void setViewCreateSql(String viewCreateSql) {
+        this.viewCreateSql = viewCreateSql;
+    }
+
+    public String getLifeCycleId() {
+        return lifeCycleId;
+    }
+
+    public void setLifeCycleId(String lifeCycleId) {
+        this.lifeCycleId = lifeCycleId;
+    }
+
+    public String getLifeCycleName() {
+        return lifeCycleName;
+    }
+
+    public void setLifeCycleName(String lifeCycleName) {
+        this.lifeCycleName = lifeCycleName;
+    }
+
+    public String getSubLifeCycleId() {
+        return subLifeCycleId;
+    }
+
+    public void setSubLifeCycleId(String subLifeCycleId) {
+        this.subLifeCycleId = subLifeCycleId;
+    }
+
+    public String getSubLifeCycleName() {
+        return subLifeCycleName;
+    }
+
+    public void setSubLifeCycleName(String subLifeCycleName) {
+        this.subLifeCycleName = subLifeCycleName;
+    }
+
+    public String getClassFullName() {
+        return classFullName;
+    }
+
+    public void setClassFullName(String classFullName) {
+        this.classFullName = classFullName;
+    }
+
+    @Override
+    public String toString() {
+        return "OsBtmTypeDTO{" +
+                "oid='" + oid + '\'' +
+                ", id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", tableName='" + tableName + '\'' +
+                ", description='" + description + '\'' +
+                ", revisionRuleId='" + revisionRuleId + '\'' +
+                ", revisionRuleName='" + revisionRuleName + '\'' +
+                ", revisionSep='" + revisionSep + '\'' +
+                ", inputRevisionFlag=" + inputRevisionFlag +
+                ", abstractFlag=" + abstractFlag +
+                ", revisionFlag=" + revisionFlag +
+                ", lifeCycleFlag=" + lifeCycleFlag +
+                ", secretFlag=" + secretFlag +
+                ", implClass='" + implClass + '\'' +
+                ", shape='" + shape + '\'' +
+                ", lifeCycleId='" + lifeCycleId + '\'' +
+                ", lifeCycleName='" + lifeCycleName + '\'' +
+                ", versionRule='" + versionRule + '\'' +
+                ", subLifeCycleId='" + subLifeCycleId + '\'' +
+                ", subLifeCycleName='" + subLifeCycleName + '\'' +
+                ", viewFlag=" + viewFlag +
+                ", viewCreateSql='" + viewCreateSql + '\'' +
+                ", classFullName='" + classFullName + '\'' +
+                ", attributesDTOList=" + attributesDTOList +
+                ", ts=" + ts +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsBtmTypeExportDTO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsBtmTypeExportDTO.java
new file mode 100644
index 0000000..41106ca
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsBtmTypeExportDTO.java
@@ -0,0 +1,120 @@
+package com.vci.web.dto;
+
+import java.util.Collection;
+
+/**
+ * 瀵煎叆瀵煎嚭鐨勬暟鎹紶杈撳璞�
+ * 鍖呮嫭鏋氫妇锛岀姸鎬侊紝鐢熷懡鍛ㄦ湡锛岀増鏈鍒欙紝灞炴�э紝涓氬姟绫诲瀷锛岄摼鎺ョ被鍨嬬瓑
+ * @author weidy
+ * @date 2019/10/14 17:09
+ */
+public class OsBtmTypeExportDTO implements java.io.Serializable{
+
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = -5279288274756092398L;
+    /**
+     * 鐘舵�佹暟鎹紶杈撳璞�
+     */
+    private Collection<OsStatusDTO> statusDTOList;
+
+    /**
+     * 鐗堟湰瑙勫垯鏁版嵁浼犺緭瀵硅薄
+     */
+    private Collection<OsRevisionRuleDTO> revisionRuleDTOList;
+
+    /**
+     * 鏋氫妇鏁版嵁浼犺緭瀵硅薄
+     */
+    private Collection<OsEnumDTO> enumDTOList;
+
+    /**
+     * 鐢熷懡鍛ㄦ湡鏁版嵁浼犺緭瀵硅薄
+     */
+    private Collection<OsLifeCycleDTO> lifeCycleDTOList;
+
+    /**
+     * 灞炴�ф暟鎹紶杈撳璞�
+     */
+    private Collection<OsAttributeDTO> attributeDTOList;
+
+    /**
+     * 涓氬姟绫诲瀷鏁版嵁浼犺緭瀵硅薄
+     */
+    private Collection<OsBtmTypeDTO> btmTypeDTOList;
+
+    /**
+     * 閾炬帴绫诲瀷鏁版嵁浼犺緭瀵硅薄
+     */
+    private Collection<OsLinkTypeDTO> linkTypeDTOList;
+
+    public Collection<OsStatusDTO> getStatusDTOList() {
+        return statusDTOList;
+    }
+
+    public void setStatusDTOList(Collection<OsStatusDTO> statusDTOList) {
+        this.statusDTOList = statusDTOList;
+    }
+
+    public Collection<OsRevisionRuleDTO> getRevisionRuleDTOList() {
+        return revisionRuleDTOList;
+    }
+
+    public void setRevisionRuleDTOList(Collection<OsRevisionRuleDTO> revisionRuleDTOList) {
+        this.revisionRuleDTOList = revisionRuleDTOList;
+    }
+
+    public Collection<OsEnumDTO> getEnumDTOList() {
+        return enumDTOList;
+    }
+
+    public void setEnumDTOList(Collection<OsEnumDTO> enumDTOList) {
+        this.enumDTOList = enumDTOList;
+    }
+
+    public Collection<OsLifeCycleDTO> getLifeCycleDTOList() {
+        return lifeCycleDTOList;
+    }
+
+    public void setLifeCycleDTOList(Collection<OsLifeCycleDTO> lifeCycleDTOList) {
+        this.lifeCycleDTOList = lifeCycleDTOList;
+    }
+
+    public Collection<OsAttributeDTO> getAttributeDTOList() {
+        return attributeDTOList;
+    }
+
+    public void setAttributeDTOList(Collection<OsAttributeDTO> attributeDTOList) {
+        this.attributeDTOList = attributeDTOList;
+    }
+
+    public Collection<OsBtmTypeDTO> getBtmTypeDTOList() {
+        return btmTypeDTOList;
+    }
+
+    public void setBtmTypeDTOList(Collection<OsBtmTypeDTO> btmTypeDTOList) {
+        this.btmTypeDTOList = btmTypeDTOList;
+    }
+
+    public Collection<OsLinkTypeDTO> getLinkTypeDTOList() {
+        return linkTypeDTOList;
+    }
+
+    public void setLinkTypeDTOList(Collection<OsLinkTypeDTO> linkTypeDTOList) {
+        this.linkTypeDTOList = linkTypeDTOList;
+    }
+
+    @Override
+    public String toString() {
+        return "OsBtmTypeExportDTO{" +
+                "statusDTOList=" + statusDTOList +
+                ", revisionRuleDTOList=" + revisionRuleDTOList +
+                ", enumDTOList=" + enumDTOList +
+                ", lifeCycleDTOList=" + lifeCycleDTOList +
+                ", attributeDTOList=" + attributeDTOList +
+                ", btmTypeDTOList=" + btmTypeDTOList +
+                ", linkTypeDTOList=" + linkTypeDTOList +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsBtmTypeLinkAttributesDTO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsBtmTypeLinkAttributesDTO.java
new file mode 100644
index 0000000..04d5064
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsBtmTypeLinkAttributesDTO.java
@@ -0,0 +1,244 @@
+package com.vci.web.dto;
+
+/**
+ * 寰�涓氬姟绫诲瀷涓坊鍔�/绉婚櫎灞炴�х殑鏁版嵁浼犺緭瀵硅薄
+ * @author weidy
+ * @date 2019/10/14 16:17
+ */
+public class OsBtmTypeLinkAttributesDTO implements java.io.Serializable{
+
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = 7635248565930948807L;
+
+    /**
+     * 涓婚敭
+     */
+    private String oid;
+
+    /**
+     * 灞炴�х殑瀛楁鍚嶇О
+     */
+    private String id;
+
+    /**
+     * 灞炴�х殑涓枃鍚嶇О
+     */
+    private String name;
+
+    /**
+     * 灞炴�х殑闀垮害
+     */
+    private Integer attributeLength;
+
+    /**
+     * 鏄惁鍙互涓虹┖
+     */
+    private boolean nullableFlag;
+
+    /**
+     * 榛樿鍊�
+     */
+    private String defaultValue;
+
+    /**
+     * 灏忔暟绮惧害浣嶆暟
+     */
+    private Integer precisionLength;
+
+    /**
+     * 鍒诲害
+     */
+    private Integer scaleLength;
+
+    /**
+     * 鍙栧�艰寖鍥�
+     */
+    private String range;
+
+    /**
+     * 灞炴�у湪鏈笟鍔$被鍨嬩腑鐨勬弿杩�
+     */
+    private String description;
+
+    /**
+     * 鏁版嵁绫诲瀷
+     */
+    private String attrDataType;
+
+    /**
+     * 鍙傜収涓氬姟绫诲瀷
+     */
+    private String referBtmTypeId;
+
+    /**
+     * 鍙傜収涓氬姟绫诲瀷鍚嶇О
+     */
+    private String referBtmTypeName;
+
+    /**
+     * 鏋氫妇缂栧彿
+     */
+    private String enumId;
+
+    /**
+     * 鏋氫妇鍚嶇О
+     */
+    private String enumName;
+
+    /**
+     * 鏄惁涓哄垹闄ゅ睘鎬�
+     */
+    private boolean removeAttribute;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Integer getAttributeLength() {
+        return attributeLength;
+    }
+
+    public void setAttributeLength(Integer attributeLength) {
+        this.attributeLength = attributeLength;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public boolean isRemoveAttribute() {
+        return removeAttribute;
+    }
+
+    public void setRemoveAttribute(boolean removeAttribute) {
+        this.removeAttribute = removeAttribute;
+    }
+
+    public String getOid() {
+        return oid;
+    }
+
+    public void setOid(String oid) {
+        this.oid = oid;
+    }
+
+    public String getAttrDataType() {
+        return attrDataType;
+    }
+
+    public void setAttrDataType(String attrDataType) {
+        this.attrDataType = attrDataType;
+    }
+
+    public String getReferBtmTypeId() {
+        return referBtmTypeId;
+    }
+
+    public void setReferBtmTypeId(String referBtmTypeId) {
+        this.referBtmTypeId = referBtmTypeId;
+    }
+
+    public String getReferBtmTypeName() {
+        return referBtmTypeName;
+    }
+
+    public void setReferBtmTypeName(String referBtmTypeName) {
+        this.referBtmTypeName = referBtmTypeName;
+    }
+
+    public String getEnumId() {
+        return enumId;
+    }
+
+    public void setEnumId(String enumId) {
+        this.enumId = enumId;
+    }
+
+    public String getEnumName() {
+        return enumName;
+    }
+
+    public void setEnumName(String enumName) {
+        this.enumName = enumName;
+    }
+
+    public boolean isNullableFlag() {
+        return nullableFlag;
+    }
+
+    public void setNullableFlag(boolean nullableFlag) {
+        this.nullableFlag = nullableFlag;
+    }
+
+    public String getDefaultValue() {
+        return defaultValue;
+    }
+
+    public void setDefaultValue(String defaultValue) {
+        this.defaultValue = defaultValue;
+    }
+
+    public Integer getPrecisionLength() {
+        return precisionLength;
+    }
+
+    public void setPrecisionLength(Integer precisionLength) {
+        this.precisionLength = precisionLength;
+    }
+
+    public String getRange() {
+        return range;
+    }
+
+    public void setRange(String range) {
+        this.range = range;
+    }
+
+    public Integer getScaleLength() {
+        return scaleLength;
+    }
+
+    public void setScaleLength(Integer scaleLength) {
+        this.scaleLength = scaleLength;
+    }
+
+    @Override
+    public String toString() {
+        return "OsBtmTypeLinkAttributesDTO{" +
+                "oid='" + oid + '\'' +
+                ", id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", attributeLength=" + attributeLength +
+                ", nullableFlag=" + nullableFlag +
+                ", defaultValue='" + defaultValue + '\'' +
+                ", precisionLength=" + precisionLength +
+                ", scaleLength=" + scaleLength +
+                ", range='" + range + '\'' +
+                ", description='" + description + '\'' +
+                ", attrDataType='" + attrDataType + '\'' +
+                ", referBtmTypeId='" + referBtmTypeId + '\'' +
+                ", referBtmTypeName='" + referBtmTypeName + '\'' +
+                ", enumId='" + enumId + '\'' +
+                ", enumName='" + enumName + '\'' +
+                ", removeAttribute=" + removeAttribute +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsCodeEnumDTO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsCodeEnumDTO.java
new file mode 100644
index 0000000..4bfcda9
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsCodeEnumDTO.java
@@ -0,0 +1,75 @@
+package com.vci.web.dto;
+
+
+/**
+ * 鏋氫妇淇℃伅鐨勪紶杈撳璞�
+ * @author weidy
+ */
+public class OsCodeEnumDTO implements java.io.Serializable{
+
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = -5595493091553910303L;
+    /**
+     * 鎵�灞炶鍒欏厓绱�
+     */
+    private String pkCodeRuleElement;
+
+    /**
+     * 鏋氫妇椤圭殑key
+     */
+    private String enumItemKey;
+
+    /**
+     * 鏋氫妇椤圭殑鍊�
+     */
+    private String enumItemValue;
+
+    /**
+     * 鍦ㄧ紪鐮佽鍒欎腑鐨勬槧灏勫��
+     */
+    private String codeMapValue;
+
+    public String getPkCodeRuleElement() {
+        return pkCodeRuleElement;
+    }
+
+    public void setPkCodeRuleElement(String pkCodeRuleElement) {
+        this.pkCodeRuleElement = pkCodeRuleElement;
+    }
+
+    public String getEnumItemKey() {
+        return enumItemKey;
+    }
+
+    public void setEnumItemKey(String enumItemKey) {
+        this.enumItemKey = enumItemKey;
+    }
+
+    public String getEnumItemValue() {
+        return enumItemValue;
+    }
+
+    public void setEnumItemValue(String enumItemValue) {
+        this.enumItemValue = enumItemValue;
+    }
+
+    public String getCodeMapValue() {
+        return codeMapValue;
+    }
+
+    public void setCodeMapValue(String codeMapValue) {
+        this.codeMapValue = codeMapValue;
+    }
+
+    @Override
+    public String toString() {
+        return "OsCodeEnumDTO{" +
+                "pkCodeRuleElement='" + pkCodeRuleElement + '\'' +
+                ", enumItemKey='" + enumItemKey + '\'' +
+                ", enumItemValue='" + enumItemValue + '\'' +
+                ", codeMapValue='" + codeMapValue + '\'' +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsCodeGenSchemaDTO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsCodeGenSchemaDTO.java
new file mode 100644
index 0000000..232aa30
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsCodeGenSchemaDTO.java
@@ -0,0 +1,536 @@
+package com.vci.web.dto;
+
+
+
+import com.vci.starter.web.pagemodel.BaseModelVO;
+
+import java.util.Date;
+
+/**
+ * 浠g爜鐢熸垚鏂规
+ * @author weidy
+ * @date 2020/7/30 10:13
+ */
+public class OsCodeGenSchemaDTO extends BaseModelVO {
+
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = 4967540773383240320L;
+    /**
+     * 鎵�灞炰笟鍔$被鍨�
+     */
+    private String pkBtmType;
+
+    /**
+     * 涓氬姟绫诲瀷缂栧彿
+     */
+    private String id;
+
+    /**
+     * 涓氬姟绫诲瀷鍚嶇О
+     */
+    private String name;
+
+    /**
+     * 鎻忚堪
+     */
+    private String description;
+
+    /**
+     * 浣滆��
+     */
+    private String author;
+
+    /**
+     * 绫诲悕绉�
+     */
+    private String className;
+
+    /**
+     * 瀹炰綋鍖呭悕
+     */
+    private String doPackage;
+
+    /**
+     * 鏄惁鐢熸垚瀹炰綋瀵硅薄
+     */
+    private String genDOFlag;
+
+    /**
+     * 鏄剧ず瀵硅薄鐨勫寘鍚�
+     */
+    private String voPackage;
+
+    /**
+     * 鏄惁鐢熸垚鏄剧ず瀵硅薄
+     */
+    private String genVOFlag;
+
+    /**
+     * 鏁版嵁浼犺緭瀵硅薄
+     */
+    private String dtoPackage;
+
+    /**
+     * 鏄惁鐢熸垚鏁版嵁浼犺緭瀵硅薄
+     */
+    private String genDTOFlag;
+
+    /**
+     * 鎺у埗鍣ㄧ殑鍖呭悕
+     */
+    private String controllerPackage;
+
+    /**
+     * 鎺у埗鍣ㄧ殑璇锋眰鍦板潃
+     */
+    private String controllerRequestMap;
+
+    /**
+     * 鏈嶅姟鍖呭悕
+     */
+    private String servicePackage;
+
+    /**
+     * 鏁版嵁搴撴搷浣滃寘鍚�
+     */
+    private String mapperPackage;
+
+    /**
+     * 鏁版嵁搴搙ml鍖呭悕
+     */
+    private String mapperXmlPackage;
+
+    /**
+     * 鐣岄潰鐨勮矾寰�
+     */
+    private String jsPackage;
+
+    /**
+     * 鍚庡彴鏈嶅姟鐨勫墠缂�
+     */
+    private String backPath;
+
+    /**
+     * 鏈�鍚庣敓鎴愭椂闂�
+     */
+    private Date lastProductDate;
+
+    /**
+     * 鏂囦欢鐨勫瓧绗﹂泦缂栫爜锛岄粯璁TF-8
+     */
+    private String fileEncode ;
+
+
+    /**
+     * 浣跨敤甯冨眬鍖哄煙
+     */
+    private String useLayoutRegion;
+
+    /**
+     * 瑗垮尯鍩熺殑闈㈡澘绫诲瀷
+     */
+    private String westLayoutPanelType;
+
+    /**
+     * 瑗垮尯鍩熺殑闈㈡澘绫诲瀷鏄剧ず鏂囨湰
+     */
+    private String westLayoutPanelTypeText;
+
+
+    /**
+     * 瑗垮尯鏌ヨ鐨勯厤缃�
+     */
+    private String westQueryConfig;
+
+    /**
+     * 瑗垮尯鐐瑰嚮鍚庝笅涓�涓尯鍩熺殑
+     */
+    private String westNextRegionParam;
+
+    /**
+     * 瑗垮尯鎸夐挳
+     */
+    private String westButtons;
+
+    /**
+     * 涓績鍖哄煙鐨勯潰鏉跨被鍨�
+     */
+    private String centerLayoutPanelType;
+
+    /**
+     * 涓績鍖哄煙鐨勯潰鏉跨被鍨嬫樉绀烘枃鏈�
+     */
+    private String centerLayoutPanelTypeText;
+
+    /**
+     * 涓績鍖烘煡璇㈢殑閰嶇疆
+     */
+    private String centerQueryConfig;
+
+    /**
+     * 涓績鍖虹偣鍑诲悗涓嬩竴涓尯鍩熺殑
+     */
+    private String centerNextRegionParam;
+
+    /**
+     * 涓績鍖烘寜閽�
+     */
+    private String centerButtons;
+
+    /**
+     * 鍗楀尯鍩熺殑闈㈡澘绫诲瀷
+     */
+    private String southLayoutPanelType;
+
+    /**
+     * 鍗楀尯鍩熺殑闈㈡澘绫诲瀷鏄剧ず鏂囨湰
+     */
+    private String southLayoutPanelTypeText;
+
+    /**
+     * 鍗楀尯鏌ヨ鐨勯厤缃�
+     */
+    private String southQueryConfig;
+
+    /**
+     * 鍗楀尯鎸夐挳
+     */
+    private String southButtons;
+
+    public String getPkBtmType() {
+        return pkBtmType;
+    }
+
+    public void setPkBtmType(String pkBtmType) {
+        this.pkBtmType = pkBtmType;
+    }
+
+    @Override
+    public String getId() {
+        return id;
+    }
+
+    @Override
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    @Override
+    public String getDescription() {
+        return description;
+    }
+
+    @Override
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getAuthor() {
+        return author;
+    }
+
+    public void setAuthor(String author) {
+        this.author = author;
+    }
+
+    public String getDoPackage() {
+        return doPackage;
+    }
+
+    public void setDoPackage(String doPackage) {
+        this.doPackage = doPackage;
+    }
+
+    public String getVoPackage() {
+        return voPackage;
+    }
+
+    public void setVoPackage(String voPackage) {
+        this.voPackage = voPackage;
+    }
+
+    public String getDtoPackage() {
+        return dtoPackage;
+    }
+
+    public void setDtoPackage(String dtoPackage) {
+        this.dtoPackage = dtoPackage;
+    }
+
+    public String getControllerPackage() {
+        return controllerPackage;
+    }
+
+    public void setControllerPackage(String controllerPackage) {
+        this.controllerPackage = controllerPackage;
+    }
+
+    public String getServicePackage() {
+        return servicePackage;
+    }
+
+    public void setServicePackage(String servicePackage) {
+        this.servicePackage = servicePackage;
+    }
+
+    public String getMapperPackage() {
+        return mapperPackage;
+    }
+
+    public void setMapperPackage(String mapperPackage) {
+        this.mapperPackage = mapperPackage;
+    }
+
+    public String getMapperXmlPackage() {
+        return mapperXmlPackage;
+    }
+
+    public void setMapperXmlPackage(String mapperXmlPackage) {
+        this.mapperXmlPackage = mapperXmlPackage;
+    }
+
+    public String getJsPackage() {
+        return jsPackage;
+    }
+
+    public void setJsPackage(String jsPackage) {
+        this.jsPackage = jsPackage;
+    }
+
+    public Date getLastProductDate() {
+        return lastProductDate;
+    }
+
+    public void setLastProductDate(Date lastProductDate) {
+        this.lastProductDate = lastProductDate;
+    }
+
+    public String getGenDOFlag() {
+        return genDOFlag;
+    }
+
+    public void setGenDOFlag(String genDOFlag) {
+        this.genDOFlag = genDOFlag;
+    }
+
+    public String getGenVOFlag() {
+        return genVOFlag;
+    }
+
+    public void setGenVOFlag(String genVOFlag) {
+        this.genVOFlag = genVOFlag;
+    }
+
+    public String getGenDTOFlag() {
+        return genDTOFlag;
+    }
+
+    public void setGenDTOFlag(String genDTOFlag) {
+        this.genDTOFlag = genDTOFlag;
+    }
+
+    public String getFileEncode() {
+        return fileEncode;
+    }
+
+    public void setFileEncode(String fileEncode) {
+        this.fileEncode = fileEncode;
+    }
+
+    public String getControllerRequestMap() {
+        return controllerRequestMap;
+    }
+
+    public void setControllerRequestMap(String controllerRequestMap) {
+        this.controllerRequestMap = controllerRequestMap;
+    }
+
+    public String getBackPath() {
+        return backPath;
+    }
+
+    public void setBackPath(String backPath) {
+        this.backPath = backPath;
+    }
+
+    public String getUseLayoutRegion() {
+        return useLayoutRegion;
+    }
+
+    public void setUseLayoutRegion(String useLayoutRegion) {
+        this.useLayoutRegion = useLayoutRegion;
+    }
+
+    public String getWestLayoutPanelType() {
+        return westLayoutPanelType;
+    }
+
+    public void setWestLayoutPanelType(String westLayoutPanelType) {
+        this.westLayoutPanelType = westLayoutPanelType;
+    }
+
+    public String getWestLayoutPanelTypeText() {
+        return westLayoutPanelTypeText;
+    }
+
+    public void setWestLayoutPanelTypeText(String westLayoutPanelTypeText) {
+        this.westLayoutPanelTypeText = westLayoutPanelTypeText;
+    }
+
+    public String getWestQueryConfig() {
+        return westQueryConfig;
+    }
+
+    public void setWestQueryConfig(String westQueryConfig) {
+        this.westQueryConfig = westQueryConfig;
+    }
+
+    public String getWestNextRegionParam() {
+        return westNextRegionParam;
+    }
+
+    public void setWestNextRegionParam(String westNextRegionParam) {
+        this.westNextRegionParam = westNextRegionParam;
+    }
+
+    public String getWestButtons() {
+        return westButtons;
+    }
+
+    public void setWestButtons(String westButtons) {
+        this.westButtons = westButtons;
+    }
+
+    public String getCenterLayoutPanelType() {
+        return centerLayoutPanelType;
+    }
+
+    public void setCenterLayoutPanelType(String centerLayoutPanelType) {
+        this.centerLayoutPanelType = centerLayoutPanelType;
+    }
+
+    public String getCenterLayoutPanelTypeText() {
+        return centerLayoutPanelTypeText;
+    }
+
+    public void setCenterLayoutPanelTypeText(String centerLayoutPanelTypeText) {
+        this.centerLayoutPanelTypeText = centerLayoutPanelTypeText;
+    }
+
+    public String getCenterQueryConfig() {
+        return centerQueryConfig;
+    }
+
+    public void setCenterQueryConfig(String centerQueryConfig) {
+        this.centerQueryConfig = centerQueryConfig;
+    }
+
+    public String getCenterNextRegionParam() {
+        return centerNextRegionParam;
+    }
+
+    public void setCenterNextRegionParam(String centerNextRegionParam) {
+        this.centerNextRegionParam = centerNextRegionParam;
+    }
+
+    public String getCenterButtons() {
+        return centerButtons;
+    }
+
+    public void setCenterButtons(String centerButtons) {
+        this.centerButtons = centerButtons;
+    }
+
+    public String getSouthLayoutPanelType() {
+        return southLayoutPanelType;
+    }
+
+    public void setSouthLayoutPanelType(String southLayoutPanelType) {
+        this.southLayoutPanelType = southLayoutPanelType;
+    }
+
+    public String getSouthLayoutPanelTypeText() {
+        return southLayoutPanelTypeText;
+    }
+
+    public void setSouthLayoutPanelTypeText(String southLayoutPanelTypeText) {
+        this.southLayoutPanelTypeText = southLayoutPanelTypeText;
+    }
+
+    public String getSouthQueryConfig() {
+        return southQueryConfig;
+    }
+
+    public void setSouthQueryConfig(String southQueryConfig) {
+        this.southQueryConfig = southQueryConfig;
+    }
+
+    public String getSouthButtons() {
+        return southButtons;
+    }
+
+    public void setSouthButtons(String southButtons) {
+        this.southButtons = southButtons;
+    }
+
+    public String getClassName() {
+        return className;
+    }
+
+    public void setClassName(String className) {
+        this.className = className;
+    }
+
+    @Override
+    public String toString() {
+        return "OsCodeGenSchemaDTO{" +
+                "pkBtmType='" + pkBtmType + '\'' +
+                ", id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", description='" + description + '\'' +
+                ", author='" + author + '\'' +
+                ", doPackage='" + doPackage + '\'' +
+                ", genDOFlag=" + genDOFlag +
+                ", voPackage='" + voPackage + '\'' +
+                ", genVOFlag=" + genVOFlag +
+                ", dtoPackage='" + dtoPackage + '\'' +
+                ", genDTOFlag=" + genDTOFlag +
+                ", controllerPackage='" + controllerPackage + '\'' +
+                ", controllerRequestMap='" + controllerRequestMap + '\'' +
+                ", servicePackage='" + servicePackage + '\'' +
+                ", mapperPackage='" + mapperPackage + '\'' +
+                ", mapperXmlPackage='" + mapperXmlPackage + '\'' +
+                ", jsPackage='" + jsPackage + '\'' +
+                ", backPath='" + backPath + '\'' +
+                ", lastProductDate=" + lastProductDate +
+                ", fileEncode='" + fileEncode + '\'' +
+                ", useLayoutRegion='" + useLayoutRegion + '\'' +
+                ", westLayoutPanelType='" + westLayoutPanelType + '\'' +
+                ", westLayoutPanelTypeText='" + westLayoutPanelTypeText + '\'' +
+                ", westQueryConfig='" + westQueryConfig + '\'' +
+                ", westNextRegionParam='" + westNextRegionParam + '\'' +
+                ", westButtons='" + westButtons + '\'' +
+                ", centerLayoutPanelType='" + centerLayoutPanelType + '\'' +
+                ", centerLayoutPanelTypeText='" + centerLayoutPanelTypeText + '\'' +
+                ", centerQueryConfig='" + centerQueryConfig + '\'' +
+                ", centerNextRegionParam='" + centerNextRegionParam + '\'' +
+                ", centerButtons='" + centerButtons + '\'' +
+                ", southLayoutPanelType='" + southLayoutPanelType + '\'' +
+                ", southLayoutPanelTypeText='" + southLayoutPanelTypeText + '\'' +
+                ", southQueryConfig='" + southQueryConfig + '\'' +
+                ", southButtons='" + southButtons + '\'' +
+                "} " + super.toString();
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsCodeRuleDTO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsCodeRuleDTO.java
new file mode 100644
index 0000000..39e4030
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsCodeRuleDTO.java
@@ -0,0 +1,181 @@
+package com.vci.web.dto;
+
+
+
+import com.vci.starter.web.pagemodel.BaseModelVO;
+
+import java.util.List;
+
+/**
+ * 缂栫爜瑙勫垯鐨勬暟鎹紶杈撳璞�
+ * @author weidy
+ * @date 2021/7/19
+ */
+public class OsCodeRuleDTO extends BaseModelVO {
+
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = 3665434115372712633L;
+    /**
+     * 瑙勫垯缂栧彿
+     */
+    private String id;
+
+    /**
+     * 瑙勫垯鍚嶇О
+     */
+    private String name;
+
+    /**
+     * 鎬婚暱搴�
+     */
+    private Integer totalLength;
+
+    /**
+     * 缂栫爜鐢熸垚褰㈠紡
+     */
+    private String codeProductType;
+
+    /**
+     * 缂栫爜鐢熸垚鏂瑰紡鏄剧ず鏂囨湰
+     */
+    private String codeProductTypeText;
+
+    /**
+     * 缂栫爜鏄惁鍙互缂栬緫
+     */
+    private boolean codeEditFlag;
+
+    /**
+     * 鏄惁鏂爜琛ョ爜
+     */
+    private String breakReUseFlag;
+    /**
+     * 鎵�灞炰笟鍔$被鍨�
+     */
+    private String btmTypeId;
+
+    /**
+     * 鎵�灞炰笟鍔$被鍨嬪悕绉�
+     */
+    private String btmTypeName;
+
+    /**
+     * 浣跨敤瑙勫垯鏍囪锛屽鍦ㄦ煇涓笟鍔$被鍨嬩笅鐨勫涓満鏅娇鐢�
+     */
+    private String useRuleFlag;
+
+    /**
+     * 瑙勫垯鏄庣粏
+     */
+    private List<OsCodeRuleElementDTO> elements;
+
+    @Override
+    public String getId() {
+        return id;
+    }
+
+    @Override
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Integer getTotalLength() {
+        return totalLength;
+    }
+
+    public void setTotalLength(Integer totalLength) {
+        this.totalLength = totalLength;
+    }
+
+    public String getCodeProductType() {
+        return codeProductType;
+    }
+
+    public void setCodeProductType(String codeProductType) {
+        this.codeProductType = codeProductType;
+    }
+
+    public String getCodeProductTypeText() {
+        return codeProductTypeText;
+    }
+
+    public void setCodeProductTypeText(String codeProductTypeText) {
+        this.codeProductTypeText = codeProductTypeText;
+    }
+
+    public boolean isCodeEditFlag() {
+        return codeEditFlag;
+    }
+
+    public void setCodeEditFlag(boolean codeEditFlag) {
+        this.codeEditFlag = codeEditFlag;
+    }
+
+    public String getBreakReUseFlag() {
+        return breakReUseFlag;
+    }
+
+    public void setBreakReUseFlag(String breakReUseFlag) {
+        this.breakReUseFlag = breakReUseFlag;
+    }
+
+    public String getBtmTypeId() {
+        return btmTypeId;
+    }
+
+    public void setBtmTypeId(String btmTypeId) {
+        this.btmTypeId = btmTypeId;
+    }
+
+    public String getBtmTypeName() {
+        return btmTypeName;
+    }
+
+    public void setBtmTypeName(String btmTypeName) {
+        this.btmTypeName = btmTypeName;
+    }
+
+    public String getUseRuleFlag() {
+        return useRuleFlag;
+    }
+
+    public void setUseRuleFlag(String useRuleFlag) {
+        this.useRuleFlag = useRuleFlag;
+    }
+
+    public List<OsCodeRuleElementDTO> getElements() {
+        return elements;
+    }
+
+    public void setElements(List<OsCodeRuleElementDTO> elements) {
+        this.elements = elements;
+    }
+
+    @Override
+    public String toString() {
+        return "OsCodeRuleDTO{" +
+                "id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", totalLength=" + totalLength +
+                ", codeProductType='" + codeProductType + '\'' +
+                ", codeProductTypeText='" + codeProductTypeText + '\'' +
+                ", codeEditFlag=" + codeEditFlag +
+                ", breakReUseFlag='" + breakReUseFlag + '\'' +
+                ", btmTypeId='" + btmTypeId + '\'' +
+                ", btmTypeName='" + btmTypeName + '\'' +
+                ", useRuleFlag='" + useRuleFlag + '\'' +
+                "} " + super.toString();
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsCodeRuleElementDTO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsCodeRuleElementDTO.java
new file mode 100644
index 0000000..ba48969
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsCodeRuleElementDTO.java
@@ -0,0 +1,416 @@
+package com.vci.web.dto;
+
+
+import com.vci.starter.web.pagemodel.BaseModelVO;
+
+import java.util.List;
+
+/**
+ * 鏄庣粏鐨勬暟鎹紶杈撳璞�
+ * @author weidy
+ * @date 2021/7/19
+ */
+public class OsCodeRuleElementDTO extends BaseModelVO {
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = 7827220228316398240L;
+
+    /**
+     * 鎵�灞炶鍒�
+     */
+    private String pkCodeRule;
+
+    /**
+     * 鎺掑簭鍙�
+     */
+    private Integer ruleOrderNumber;
+
+    /**
+     * 缂栫爜瑙勫垯鐨勫厓绱犵被鍨�
+     */
+    private String codeElementType;
+
+    /**
+     * 缂栫爜瑙勫垯鐨勫厓绱犵被鍨嬫樉绀烘枃鏈�
+     */
+    private String codeElementTypeText;
+    /**
+     * 鍏冪礌鏄剧ず琛ㄨ揪寮�
+     */
+    private String id;
+
+    /**
+     * 鍏冪礌涓枃鍚嶇О
+     */
+    private String name;
+
+    /**
+     * 鏈�澶ч暱搴�
+     */
+    private Integer maxLength;
+
+    /**
+     * 鏈�灏忛暱搴�
+     */
+    private Integer minLength;
+    /**
+     * 缂栫爜琛ヤ綅鏂瑰紡
+     */
+    private String codeFillType;
+
+    /**
+     * 缂栫爜琛ヤ綅鏂瑰紡鏄剧ず鏂囨湰
+     */
+    private String codeFillTypeText;
+
+    /**
+     * 琛ヤ綅鏃剁殑瀛楃
+     */
+    private String codeFillSeparator;
+    /**
+     * 鎵嬪姩杈撳叆鏃剁殑鏍¢獙瑙勫垯
+     */
+    private String validateString;
+
+    /**
+     * 鏃ユ湡褰㈠紡鏃剁殑鏃堕棿鏍煎紡
+     */
+    private String codeDateFormat;
+    /**
+     * 鏃堕棿鍙栧�肩被鍨�
+     */
+    private String codeDateValueType;
+
+    /**
+     * 鏃堕棿鍙栧�肩被鍨嬬殑鍚嶇О
+     */
+    private String codeDateValueTypeText;
+
+    /**
+     * 鏃堕棿鍙栧�间娇鐢ㄤ笟鍔$被鍨嬬殑灞炴�ey
+     */
+    private String codeDateUseField;
+
+    /**
+     * 鏃堕棿鍙栧�间娇鐢ㄤ笟鍔$被鍨嬬殑灞炴�у悕绉�
+     */
+    private String codeDateUseFieldName;
+
+    /**
+     * 浣跨敤涓氬姟绫诲瀷鐨勫睘鎬ц嫳鏂囧悕绉�
+     */
+    private String codeUseField;
+
+    /**
+     * 浣跨敤涓氬姟绫诲瀷鐨勫睘鎬т腑鏂囧悕绉�
+     */
+    private String codeUseFieldName;
+
+    /**
+     * 鍏紡琛ㄨ揪寮�
+     */
+    private String codeExpression;
+
+    /**
+     * 鏄惁娴佹按鍙�
+     */
+    private String serialAccording;
+
+    /**
+     * 甯搁噺鐨勫��
+     */
+    private String staticCode;
+
+    /**
+     * 娴佹按鍙疯捣濮嬪��
+     */
+    private String serialStart;
+
+    /**
+     * 娴佹按鐨勬闀�
+     */
+    private Integer serialStep;
+
+    /**
+     * 娴佹按浼樺厛绾�
+     */
+    private Integer serialPriority;
+
+    /**
+     * 鏋氫妇鐨勭紪鍙�
+     */
+    private String enumId;
+
+    /**
+     * 鏋氫妇鐨勫悕绉�
+     */
+    private String enumName;
+
+    /**
+     * 鏋氫妇鍖呭惈鐨勬槧灏勫唴瀹�
+     */
+    private List<OsCodeEnumDTO> enumMapList;
+
+    public String getPkCodeRule() {
+        return pkCodeRule;
+    }
+
+    public void setPkCodeRule(String pkCodeRule) {
+        this.pkCodeRule = pkCodeRule;
+    }
+
+    public Integer getRuleOrderNumber() {
+        return ruleOrderNumber;
+    }
+
+    public void setRuleOrderNumber(Integer ruleOrderNumber) {
+        this.ruleOrderNumber = ruleOrderNumber;
+    }
+
+    public String getCodeElementType() {
+        return codeElementType;
+    }
+
+    public void setCodeElementType(String codeElementType) {
+        this.codeElementType = codeElementType;
+    }
+
+    public String getCodeElementTypeText() {
+        return codeElementTypeText;
+    }
+
+    public void setCodeElementTypeText(String codeElementTypeText) {
+        this.codeElementTypeText = codeElementTypeText;
+    }
+
+    @Override
+    public String getId() {
+        return id;
+    }
+
+    @Override
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Integer getMaxLength() {
+        return maxLength;
+    }
+
+    public void setMaxLength(Integer maxLength) {
+        this.maxLength = maxLength;
+    }
+
+    public Integer getMinLength() {
+        return minLength;
+    }
+
+    public void setMinLength(Integer minLength) {
+        this.minLength = minLength;
+    }
+
+    public String getCodeFillType() {
+        return codeFillType;
+    }
+
+    public void setCodeFillType(String codeFillType) {
+        this.codeFillType = codeFillType;
+    }
+
+    public String getCodeFillTypeText() {
+        return codeFillTypeText;
+    }
+
+    public void setCodeFillTypeText(String codeFillTypeText) {
+        this.codeFillTypeText = codeFillTypeText;
+    }
+
+    public String getCodeFillSeparator() {
+        return codeFillSeparator;
+    }
+
+    public void setCodeFillSeparator(String codeFillSeparator) {
+        this.codeFillSeparator = codeFillSeparator;
+    }
+
+    public String getValidateString() {
+        return validateString;
+    }
+
+    public void setValidateString(String validateString) {
+        this.validateString = validateString;
+    }
+
+    public String getCodeDateFormat() {
+        return codeDateFormat;
+    }
+
+    public void setCodeDateFormat(String codeDateFormat) {
+        this.codeDateFormat = codeDateFormat;
+    }
+
+    public String getCodeDateValueType() {
+        return codeDateValueType;
+    }
+
+    public void setCodeDateValueType(String codeDateValueType) {
+        this.codeDateValueType = codeDateValueType;
+    }
+
+    public String getCodeDateValueTypeText() {
+        return codeDateValueTypeText;
+    }
+
+    public void setCodeDateValueTypeText(String codeDateValueTypeText) {
+        this.codeDateValueTypeText = codeDateValueTypeText;
+    }
+
+    public String getCodeDateUseField() {
+        return codeDateUseField;
+    }
+
+    public void setCodeDateUseField(String codeDateUseField) {
+        this.codeDateUseField = codeDateUseField;
+    }
+
+    public String getCodeDateUseFieldName() {
+        return codeDateUseFieldName;
+    }
+
+    public void setCodeDateUseFieldName(String codeDateUseFieldName) {
+        this.codeDateUseFieldName = codeDateUseFieldName;
+    }
+
+    public String getCodeUseField() {
+        return codeUseField;
+    }
+
+    public void setCodeUseField(String codeUseField) {
+        this.codeUseField = codeUseField;
+    }
+
+    public String getCodeUseFieldName() {
+        return codeUseFieldName;
+    }
+
+    public void setCodeUseFieldName(String codeUseFieldName) {
+        this.codeUseFieldName = codeUseFieldName;
+    }
+
+    public String getCodeExpression() {
+        return codeExpression;
+    }
+
+    public void setCodeExpression(String codeExpression) {
+        this.codeExpression = codeExpression;
+    }
+
+    public String getSerialAccording() {
+        return serialAccording;
+    }
+
+    public void setSerialAccording(String serialAccording) {
+        this.serialAccording = serialAccording;
+    }
+
+    public String getStaticCode() {
+        return staticCode;
+    }
+
+    public void setStaticCode(String staticCode) {
+        this.staticCode = staticCode;
+    }
+
+    public String getSerialStart() {
+        return serialStart;
+    }
+
+    public void setSerialStart(String serialStart) {
+        this.serialStart = serialStart;
+    }
+
+    public Integer getSerialStep() {
+        return serialStep;
+    }
+
+    public void setSerialStep(Integer serialStep) {
+        this.serialStep = serialStep;
+    }
+
+    public Integer getSerialPriority() {
+        return serialPriority;
+    }
+
+    public void setSerialPriority(Integer serialPriority) {
+        this.serialPriority = serialPriority;
+    }
+
+    public String getEnumId() {
+        return enumId;
+    }
+
+    public void setEnumId(String enumId) {
+        this.enumId = enumId;
+    }
+
+    public String getEnumName() {
+        return enumName;
+    }
+
+    public void setEnumName(String enumName) {
+        this.enumName = enumName;
+    }
+
+    public List<OsCodeEnumDTO> getEnumMapList() {
+        return enumMapList;
+    }
+
+    public void setEnumMapList(List<OsCodeEnumDTO> enumMapList) {
+        this.enumMapList = enumMapList;
+    }
+
+    @Override
+    public String toString() {
+        return "OsCodeRuleElementDTO{" +
+                "pkCodeRule='" + pkCodeRule + '\'' +
+                ", ruleOrderNumber=" + ruleOrderNumber +
+                ", codeElementType='" + codeElementType + '\'' +
+                ", codeElementTypeText='" + codeElementTypeText + '\'' +
+                ", id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", maxLength=" + maxLength +
+                ", minLength=" + minLength +
+                ", codeFillType='" + codeFillType + '\'' +
+                ", codeFillTypeText='" + codeFillTypeText + '\'' +
+                ", codeFillSeparator='" + codeFillSeparator + '\'' +
+                ", validateString='" + validateString + '\'' +
+                ", codeDateFormat='" + codeDateFormat + '\'' +
+                ", codeDateValueType='" + codeDateValueType + '\'' +
+                ", codeDateValueTypeText='" + codeDateValueTypeText + '\'' +
+                ", codeDateUseField='" + codeDateUseField + '\'' +
+                ", codeDateUseFieldName='" + codeDateUseFieldName + '\'' +
+                ", codeUseField='" + codeUseField + '\'' +
+                ", codeUseFieldName='" + codeUseFieldName + '\'' +
+                ", codeExpression='" + codeExpression + '\'' +
+                ", serialAccording='" + serialAccording + '\'' +
+                ", staticCode='" + staticCode + '\'' +
+                ", serialStart='" + serialStart + '\'' +
+                ", serialStep=" + serialStep +
+                ", serialPriority=" + serialPriority +
+                ", enumId='" + enumId + '\'' +
+                ", enumName='" + enumName + '\'' +
+                ", enumMapList=" + enumMapList +
+                "} " + super.toString();
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsCodeRuleProduceDTO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsCodeRuleProduceDTO.java
new file mode 100644
index 0000000..5dc318d
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsCodeRuleProduceDTO.java
@@ -0,0 +1,105 @@
+package com.vci.web.dto;
+
+import java.util.Map;
+
+/**
+ * 缂栫爜瑙勫垯鍒涘缓鐨勬暟鎹紶杈撳璞�
+ * @author weidy
+ * @date 2020/9/1 19:50
+ */
+public class OsCodeRuleProduceDTO implements java.io.Serializable {
+
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = 8980977770052198671L;
+    /**
+     * 缂栫爜瑙勫垯鐨勭紪鍙凤紝浼樺厛绾уぇ浜庝富閿�
+     */
+    private String codeRuleId;
+
+    /**
+     * 缂栫爜瑙勫垯鐨勪富閿�
+     */
+    private String codeRuleOid;
+
+    /**
+     * 涓氬姟绫诲瀷
+     */
+    private String ownbizBtm;
+
+    /**
+     * 浣跨敤瑙勫垯鐨勬爣璇嗭紝鍜屼笟鍔$被鍨嬬粨鍚堜娇鐢紝浼樺厛绾ф渶楂�
+     */
+    private String useRuleFlag;
+
+    /**
+     * 涓氬姟鏁版嵁锛宬ey鏄睘鎬х殑鍚嶇О锛寁alue鏄睘鎬у��
+     */
+    private Map<String,Object> ownbizDataMap;
+
+    /**
+     * 鎵嬪姩杈撳叆鐨勫�硷紝key鏄厓绱犵殑鑻辨枃鍚嶇О锛寁alue鏄緭鍏ョ殑鍊�
+     */
+    private Map<String,String> inputValueMap;
+
+    public String getCodeRuleId() {
+        return codeRuleId;
+    }
+
+    public void setCodeRuleId(String codeRuleId) {
+        this.codeRuleId = codeRuleId;
+    }
+
+    public String getCodeRuleOid() {
+        return codeRuleOid;
+    }
+
+    public void setCodeRuleOid(String codeRuleOid) {
+        this.codeRuleOid = codeRuleOid;
+    }
+
+    public String getOwnbizBtm() {
+        return ownbizBtm;
+    }
+
+    public void setOwnbizBtm(String ownbizBtm) {
+        this.ownbizBtm = ownbizBtm;
+    }
+
+    public String getUseRuleFlag() {
+        return useRuleFlag;
+    }
+
+    public void setUseRuleFlag(String useRuleFlag) {
+        this.useRuleFlag = useRuleFlag;
+    }
+
+    public Map<String, Object> getOwnbizDataMap() {
+        return ownbizDataMap;
+    }
+
+    public void setOwnbizDataMap(Map<String, Object> ownbizDataMap) {
+        this.ownbizDataMap = ownbizDataMap;
+    }
+
+    public Map<String, String> getInputValueMap() {
+        return inputValueMap;
+    }
+
+    public void setInputValueMap(Map<String, String> inputValueMap) {
+        this.inputValueMap = inputValueMap;
+    }
+
+    @Override
+    public String toString() {
+        return "OsCodeRuleProduceDTO{" +
+                "codeRuleId='" + codeRuleId + '\'' +
+                ", codeRuleOid='" + codeRuleOid + '\'' +
+                ", ownbizBtm='" + ownbizBtm + '\'' +
+                ", useRuleFlag='" + useRuleFlag + '\'' +
+                ", ownbizDataMap=" + ownbizDataMap +
+                ", inputValueMap=" + inputValueMap +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsEnumDTO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsEnumDTO.java
new file mode 100644
index 0000000..e925d2d
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsEnumDTO.java
@@ -0,0 +1,163 @@
+package com.vci.web.dto;
+
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * 鏋氫妇鏁版嵁浼犺緭瀵硅薄
+ * @author weidy
+ * @date 2019/10/14 17:25
+ */
+public class OsEnumDTO implements java.io.Serializable{
+
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = 814342725285373312L;
+
+    /**
+     * 涓婚敭
+     */
+    private String oid;
+
+    /**
+     * 灞炴�ц嫳鏂囧悕绉�
+     */
+    private String id;
+
+    /**
+     * 灞炴�т腑鏂囧悕绉�
+     */
+    private String name;
+
+    /**
+     * 鎻忚堪
+     */
+    private String description;
+
+    /**
+     * 鏋氫妇鍊肩被鍨�
+     */
+    private String enumValueDataType;
+
+    /**
+     * 闀垮害
+     */
+    private Integer length;
+
+    /**
+     * 鏃堕棿鎴筹紝鏍煎紡鏄痽yyy-MM-dd HH:mm:ss.SSS
+     */
+    private Date ts;
+
+    /**
+     * 绫荤殑鍏ㄨ矾寰�
+     */
+    private String classFullName;
+
+    /**
+     * 鏋氫妇椤规槧灏勫��
+     */
+    private Map<String,String> itemMaps;
+
+    /**
+     * 鏋氫妇椤圭殑涓婚敭鏄犲皠锛宬ey鏄富閿紝value鏄灇涓鹃」鐨勮嫳鏂囧悕绉�
+     */
+    private Map<String,String> itemOidMaps;
+
+    public String getOid() {
+        return oid;
+    }
+
+    public void setOid(String oid) {
+        this.oid = oid;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getEnumValueDataType() {
+        return enumValueDataType;
+    }
+
+    public void setEnumValueDataType(String enumValueDataType) {
+        this.enumValueDataType = enumValueDataType;
+    }
+
+    public Integer getLength() {
+        return length;
+    }
+
+    public void setLength(Integer length) {
+        this.length = length;
+    }
+
+    public Date getTs() {
+        return ts;
+    }
+
+    public void setTs(Date ts) {
+        this.ts = ts;
+    }
+
+    public Map<String, String> getItemMaps() {
+        return itemMaps;
+    }
+
+    public void setItemMaps(Map<String, String> itemMaps) {
+        this.itemMaps = itemMaps;
+    }
+
+    public Map<String, String> getItemOidMaps() {
+        return itemOidMaps;
+    }
+
+    public void setItemOidMaps(Map<String, String> itemOidMaps) {
+        this.itemOidMaps = itemOidMaps;
+    }
+
+    public String getClassFullName() {
+        return classFullName;
+    }
+
+    public void setClassFullName(String classFullName) {
+        this.classFullName = classFullName;
+    }
+
+    @Override
+    public String toString() {
+        return "OsEnumDTO{" +
+                "oid='" + oid + '\'' +
+                ", id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", description='" + description + '\'' +
+                ", enumValueDataType='" + enumValueDataType + '\'' +
+                ", length=" + length +
+                ", ts=" + ts +
+                ", classFullName='" + classFullName + '\'' +
+                ", itemMaps=" + itemMaps +
+                ", itemOidMaps=" + itemOidMaps +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsLifeCycleDTO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsLifeCycleDTO.java
new file mode 100644
index 0000000..2e7f36d
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsLifeCycleDTO.java
@@ -0,0 +1,149 @@
+package com.vci.web.dto;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 鐢熷懡鍛ㄦ湡鏁版嵁浼犺緭瀵硅薄
+ * @author weidy
+ * @date 2019/10/14 17:28
+ */
+public class OsLifeCycleDTO implements java.io.Serializable {
+
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = -2896532706167604421L;
+
+    /**
+     * 涓婚敭
+     */
+    private String oid;
+
+    /**
+     * 鐢熷懡鍛ㄦ湡缂栧彿
+     */
+    private String id;
+
+    /**
+     * 鐢熷懡鍛ㄦ湡鍚嶇О
+     */
+    private String name;
+
+    /**
+     * 鎻忚堪
+     */
+    private String description;
+
+    /**
+     * 璧峰鐘舵��
+     */
+    private String startStatus;
+
+    /**
+     * 璧峰鐘舵�佸悕绉�
+     */
+    private String startStatusName;
+
+    /**
+     * 鍦ㄦ壂鎻忕殑鏃跺�欒褰曡繖涓敓鍛藉懆鏈熷搴旂殑绫诲叏璺緞
+     */
+    private String classFullName;
+
+    /**
+     * 鏃堕棿鎴筹紝鏍煎紡鏄痽yyy-MM-dd HH:mm:ss.SSS
+     */
+    private Date ts;
+
+    /**
+     * 鍖呭惈鐨勮繛鎺ョ嚎
+     */
+    private List<OsLifeCycleLineDTO> lineDTOList;
+
+    public String getOid() {
+        return oid;
+    }
+
+    public void setOid(String oid) {
+        this.oid = oid;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getStartStatus() {
+        return startStatus;
+    }
+
+    public void setStartStatus(String startStatus) {
+        this.startStatus = startStatus;
+    }
+
+    public String getStartStatusName() {
+        return startStatusName;
+    }
+
+    public void setStartStatusName(String startStatusName) {
+        this.startStatusName = startStatusName;
+    }
+
+    public Date getTs() {
+        return ts;
+    }
+
+    public void setTs(Date ts) {
+        this.ts = ts;
+    }
+
+    public List<OsLifeCycleLineDTO> getLineDTOList() {
+        return lineDTOList;
+    }
+
+    public void setLineDTOList(List<OsLifeCycleLineDTO> lineDTOList) {
+        this.lineDTOList = lineDTOList;
+    }
+
+    public String getClassFullName() {
+        return classFullName;
+    }
+
+    public void setClassFullName(String classFullName) {
+        this.classFullName = classFullName;
+    }
+
+    @Override
+    public String toString() {
+        return "OsLifeCycleDTO{" +
+                "oid='" + oid + '\'' +
+                ", id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", description='" + description + '\'' +
+                ", startStatus='" + startStatus + '\'' +
+                ", startStatusName='" + startStatusName + '\'' +
+                ", classFullName='" + classFullName + '\'' +
+                ", ts=" + ts +
+                ", lineDTOList=" + lineDTOList +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsLifeCycleLineDTO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsLifeCycleLineDTO.java
new file mode 100644
index 0000000..b721146
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsLifeCycleLineDTO.java
@@ -0,0 +1,191 @@
+package com.vci.web.dto;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 鐢熷懡鍛ㄦ湡杩炴帴绾挎暟鎹紶杈撳璞�
+ * @author weidy
+ * @date 2019/10/14 17:31
+ */
+public class OsLifeCycleLineDTO implements java.io.Serializable{
+
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = -7556637895235122903L;
+
+    /**
+     * 鎵�灞炵敓鍛藉懆鏈�
+     */
+    private String pkLifeCycle;
+
+    /**
+     * 婧愮姸鎬佷富閿�
+     */
+    private String sourceLifeStatusOid;
+
+    /**
+     * 婧愮姸鎬佷唬鍙�
+     */
+    private String sourceLifeStatus;
+
+    /**
+     * 婧愮姸鎬佸悕绉�
+     */
+    private String sourceLifeStatusName;
+
+    /**
+     * 鐩爣鐘舵�佷富閿�
+     */
+    private String targetLifeStatusOid;
+
+    /**
+     * 鐩爣鐘舵�佷唬鍙�
+     */
+    private String targetLifeStatus;
+
+    /**
+     * 鐩爣鐘舵�佸悕绉�
+     */
+    private String targetLifeStatusName;
+
+    /**
+     * 杩炴帴绾垮悕绉�
+     */
+    private String name;
+
+    /**
+     * 杩炴帴绾夸綅缃俊鎭�
+     */
+    private String transLineSiteInfo;
+
+    /**
+     * 涓婚敭
+     */
+    private String oid;
+
+    /**
+     * 鏃堕棿鎴筹紝鏍煎紡鏄痽yyy-MM-dd HH:mm:ss.SSS
+     */
+    private Date ts;
+
+    /**
+     * 鍖呭惈鐨勪簨浠�
+     */
+    private List<String> eventDTOList;
+
+    public String getPkLifeCycle() {
+        return pkLifeCycle;
+    }
+
+    public void setPkLifeCycle(String pkLifeCycle) {
+        this.pkLifeCycle = pkLifeCycle;
+    }
+
+    public String getSourceLifeStatusOid() {
+        return sourceLifeStatusOid;
+    }
+
+    public void setSourceLifeStatusOid(String sourceLifeStatusOid) {
+        this.sourceLifeStatusOid = sourceLifeStatusOid;
+    }
+
+    public String getSourceLifeStatus() {
+        return sourceLifeStatus;
+    }
+
+    public void setSourceLifeStatus(String sourceLifeStatus) {
+        this.sourceLifeStatus = sourceLifeStatus;
+    }
+
+    public String getSourceLifeStatusName() {
+        return sourceLifeStatusName;
+    }
+
+    public void setSourceLifeStatusName(String sourceLifeStatusName) {
+        this.sourceLifeStatusName = sourceLifeStatusName;
+    }
+
+    public String getTargetLifeStatusOid() {
+        return targetLifeStatusOid;
+    }
+
+    public void setTargetLifeStatusOid(String targetLifeStatusOid) {
+        this.targetLifeStatusOid = targetLifeStatusOid;
+    }
+
+    public String getTargetLifeStatus() {
+        return targetLifeStatus;
+    }
+
+    public void setTargetLifeStatus(String targetLifeStatus) {
+        this.targetLifeStatus = targetLifeStatus;
+    }
+
+    public String getTargetLifeStatusName() {
+        return targetLifeStatusName;
+    }
+
+    public void setTargetLifeStatusName(String targetLifeStatusName) {
+        this.targetLifeStatusName = targetLifeStatusName;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getTransLineSiteInfo() {
+        return transLineSiteInfo;
+    }
+
+    public void setTransLineSiteInfo(String transLineSiteInfo) {
+        this.transLineSiteInfo = transLineSiteInfo;
+    }
+
+    public String getOid() {
+        return oid;
+    }
+
+    public void setOid(String oid) {
+        this.oid = oid;
+    }
+
+    public Date getTs() {
+        return ts;
+    }
+
+    public void setTs(Date ts) {
+        this.ts = ts;
+    }
+
+    public List<String> getEventDTOList() {
+        return eventDTOList;
+    }
+
+    public void setEventDTOList(List<String> eventDTOList) {
+        this.eventDTOList = eventDTOList;
+    }
+
+    @Override
+    public String toString() {
+        return "OsLifeCycleLineDTO{" +
+                "pkLifeCycle='" + pkLifeCycle + '\'' +
+                ", sourceLifeStatusOid='" + sourceLifeStatusOid + '\'' +
+                ", sourceLifeStatus='" + sourceLifeStatus + '\'' +
+                ", sourceLifeStatusName='" + sourceLifeStatusName + '\'' +
+                ", targetLifeStatusOid='" + targetLifeStatusOid + '\'' +
+                ", targetLifeStatus='" + targetLifeStatus + '\'' +
+                ", targetLifeStatusName='" + targetLifeStatusName + '\'' +
+                ", name='" + name + '\'' +
+                ", transLineSiteInfo='" + transLineSiteInfo + '\'' +
+                ", oid='" + oid + '\'' +
+                ", ts=" + ts +
+                ", eventDTOList=" + eventDTOList +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsLifeCycleLineEventDTO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsLifeCycleLineEventDTO.java
new file mode 100644
index 0000000..01d3c59
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsLifeCycleLineEventDTO.java
@@ -0,0 +1,91 @@
+package com.vci.web.dto;
+
+import java.util.Date;
+
+/**
+ * 鐢熷懡鍛ㄦ湡浜嬩欢鏁版嵁浼犺緭瀵硅薄
+ * @author weidy
+ * @date 2019/10/14 17:47
+ */
+public class OsLifeCycleLineEventDTO implements java.io.Serializable{
+
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = 6860210157516359420L;
+    /**
+     * 涓婚敭
+     */
+    private String oid;
+
+    /**
+     * 鎵�灞炵敓鍛藉懆鏈熻繛鎺ョ嚎涓婚敭
+     */
+    private String pkLifeCycleLine;
+
+    /**
+     * 浜嬩欢鐨勫叏璺緞
+     */
+    private String eventFullName;
+
+    /**
+     * 浜嬩欢鐨勫悕绉�
+     */
+    private String eventShowName;
+
+    /**
+     * 鏃堕棿鎴筹紝鏍煎紡鏄痽yyy-MM-dd HH:mm:ss.SSS
+     */
+    private Date ts;
+
+    public String getOid() {
+        return oid;
+    }
+
+    public void setOid(String oid) {
+        this.oid = oid;
+    }
+
+    public String getPkLifeCycleLine() {
+        return pkLifeCycleLine;
+    }
+
+    public void setPkLifeCycleLine(String pkLifeCycleLine) {
+        this.pkLifeCycleLine = pkLifeCycleLine;
+    }
+
+    public String getEventFullName() {
+        return eventFullName;
+    }
+
+    public void setEventFullName(String eventFullName) {
+        this.eventFullName = eventFullName;
+    }
+
+    public String getEventShowName() {
+        return eventShowName;
+    }
+
+    public void setEventShowName(String eventShowName) {
+        this.eventShowName = eventShowName;
+    }
+
+    public Date getTs() {
+        return ts;
+    }
+
+    public void setTs(Date ts) {
+        this.ts = ts;
+    }
+
+    @Override
+    public String toString() {
+        return "OsLifeCycleLineEventDTO{" +
+                "oid='" + oid + '\'' +
+                ", pkLifeCycleLine='" + pkLifeCycleLine + '\'' +
+                ", eventFullName='" + eventFullName + '\'' +
+                ", eventShowName='" + eventShowName + '\'' +
+                ", ts=" + ts +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsLinkTypeDTO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsLinkTypeDTO.java
new file mode 100644
index 0000000..b7426e4
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsLinkTypeDTO.java
@@ -0,0 +1,205 @@
+package com.vci.web.dto;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 閾炬帴绫诲瀷鐨勬暟鎹紶杈撳璞�
+ * @author weidy
+ * @date 2019/10/14 17:53
+ */
+public class OsLinkTypeDTO implements java.io.Serializable {
+
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = 7723683851305095408L;
+
+    /**
+     * 涓婚敭
+     */
+    private String oid;
+
+    /**
+     * 閾炬帴绫诲瀷鑻辨枃鍚嶇О
+     */
+    private String id;
+
+    /**
+     * 閾炬帴绫诲瀷涓枃鍚嶇О
+     */
+    private String name;
+
+    /**
+     * 鎻忚堪
+     */
+    private String description;
+
+    /**
+     *
+     */
+    private String shape;
+
+    /**
+     * 瀹炵幇绫�
+     */
+    private String implClass;
+
+    /**
+     * from绔笟鍔$被鍨�
+     */
+    private String fromBtmType;
+
+    /**
+     * from绔笟鍔$被鍨嬪悕绉�
+     */
+    private String fromBtmTypeName;
+
+    /**
+     * to绔笟鍔$被鍨�
+     */
+    private String toBtmType;
+
+    /**
+     * to绔笟鍔$被鍨嬪悕绉�
+     */
+    private String toBtmTypeName;
+
+    /**
+     * 鏃堕棿鎴筹紝鏍煎紡鏄痽yyy-MM-dd HH:mm:ss.SSS
+     */
+    private Date ts;
+
+    /**
+     * 绫绘墍灞炵殑鍏ㄨ矾寰�
+     */
+    private String classFullName;
+
+    /**
+     * 鍖呭惈鐨勫睘鎬ф樉绀哄璞�
+     */
+    private List<OsBtmTypeLinkAttributesDTO> attributesDTOList;
+
+    public String getOid() {
+        return oid;
+    }
+
+    public void setOid(String oid) {
+        this.oid = oid;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getShape() {
+        return shape;
+    }
+
+    public void setShape(String shape) {
+        this.shape = shape;
+    }
+
+    public String getImplClass() {
+        return implClass;
+    }
+
+    public void setImplClass(String implClass) {
+        this.implClass = implClass;
+    }
+
+    public String getFromBtmType() {
+        return fromBtmType;
+    }
+
+    public void setFromBtmType(String fromBtmType) {
+        this.fromBtmType = fromBtmType;
+    }
+
+    public String getFromBtmTypeName() {
+        return fromBtmTypeName;
+    }
+
+    public void setFromBtmTypeName(String fromBtmTypeName) {
+        this.fromBtmTypeName = fromBtmTypeName;
+    }
+
+    public String getToBtmType() {
+        return toBtmType;
+    }
+
+    public void setToBtmType(String toBtmType) {
+        this.toBtmType = toBtmType;
+    }
+
+    public String getToBtmTypeName() {
+        return toBtmTypeName;
+    }
+
+    public void setToBtmTypeName(String toBtmTypeName) {
+        this.toBtmTypeName = toBtmTypeName;
+    }
+
+    public Date getTs() {
+        return ts;
+    }
+
+    public void setTs(Date ts) {
+        this.ts = ts;
+    }
+
+    public List<OsBtmTypeLinkAttributesDTO> getAttributesDTOList() {
+        return attributesDTOList;
+    }
+
+    public void setAttributesDTOList(List<OsBtmTypeLinkAttributesDTO> attributesDTOList) {
+        this.attributesDTOList = attributesDTOList;
+    }
+
+    public String getClassFullName() {
+        return classFullName;
+    }
+
+    public void setClassFullName(String classFullName) {
+        this.classFullName = classFullName;
+    }
+
+    @Override
+    public String toString() {
+        return "OsLinkTypeDTO{" +
+                "oid='" + oid + '\'' +
+                ", id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", description='" + description + '\'' +
+                ", shape='" + shape + '\'' +
+                ", implClass='" + implClass + '\'' +
+                ", fromBtmType='" + fromBtmType + '\'' +
+                ", fromBtmTypeName='" + fromBtmTypeName + '\'' +
+                ", toBtmType='" + toBtmType + '\'' +
+                ", toBtmTypeName='" + toBtmTypeName + '\'' +
+                ", ts=" + ts +
+                ", classFullName='" + classFullName + '\'' +
+                ", attributesDTOList=" + attributesDTOList +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsRevisionRuleDTO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsRevisionRuleDTO.java
new file mode 100644
index 0000000..d94a052
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsRevisionRuleDTO.java
@@ -0,0 +1,162 @@
+package com.vci.web.dto;
+
+import java.util.Date;
+
+/**
+ * 鐗堟湰瑙勫垯鐨勬暟鎹紶杈撳璞�
+ * @author weidy
+ * @date 2019/10/14 17:22
+ */
+public class OsRevisionRuleDTO implements java.io.Serializable{
+
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = -75866403471953492L;
+
+    /**
+     * 涓婚敭
+     */
+    private String oid;
+
+    /**
+     * 鑻辨枃鍚嶇О
+     */
+    private String id;
+
+    /**
+     * 涓枃鍚嶇О
+     */
+    private String name;
+
+    /**
+     * 璺宠穬瀛楃
+     */
+    private String skipCode;
+
+    /**
+     * 鍒濆鍊�
+     */
+    private String startCode;
+
+    /**
+     * 姝ラ暱
+     */
+    private Integer serialStep;
+
+    /**
+     * 鍓嶇紑
+     */
+    private String prefixCode;
+
+    /**
+     * 鍚庣紑
+     */
+    private String suffixCode;
+
+    /**
+     * 鎻忚堪
+     */
+    private String description;
+
+    /**
+     * 鏃堕棿鎴筹紝鏍煎紡鏄痽yyy-MM-dd HH:mm:ss.SSS
+     */
+    private Date ts;
+
+    public String getOid() {
+        return oid;
+    }
+
+    public void setOid(String oid) {
+        this.oid = oid;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getSkipCode() {
+        return skipCode;
+    }
+
+    public void setSkipCode(String skipCode) {
+        this.skipCode = skipCode;
+    }
+
+    public String getStartCode() {
+        return startCode;
+    }
+
+    public void setStartCode(String startCode) {
+        this.startCode = startCode;
+    }
+
+    public Integer getSerialStep() {
+        return serialStep;
+    }
+
+    public void setSerialStep(Integer serialStep) {
+        this.serialStep = serialStep;
+    }
+
+    public String getPrefixCode() {
+        return prefixCode;
+    }
+
+    public void setPrefixCode(String prefixCode) {
+        this.prefixCode = prefixCode;
+    }
+
+    public String getSuffixCode() {
+        return suffixCode;
+    }
+
+    public void setSuffixCode(String suffixCode) {
+        this.suffixCode = suffixCode;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public Date getTs() {
+        return ts;
+    }
+
+    public void setTs(Date ts) {
+        this.ts = ts;
+    }
+
+    @Override
+    public String toString() {
+        return "OsRevisionRuleDTO{" +
+                "oid='" + oid + '\'' +
+                ", id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", skipCode='" + skipCode + '\'' +
+                ", startCode='" + startCode + '\'' +
+                ", serialStep=" + serialStep +
+                ", prefixCode='" + prefixCode + '\'' +
+                ", suffixCode='" + suffixCode + '\'' +
+                ", description='" + description + '\'' +
+                ", ts=" + ts +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsStatusDTO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsStatusDTO.java
new file mode 100644
index 0000000..1e57871
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/OsStatusDTO.java
@@ -0,0 +1,90 @@
+package com.vci.web.dto;
+
+import java.util.Date;
+
+/**
+ * 鐘舵�佹暟鎹紶杈撳璞�
+ * @author weidy
+ * @date 2019/10/14 17:15
+ */
+public class OsStatusDTO implements java.io.Serializable{
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = 6832696922597736395L;
+    /**
+     * 涓婚敭
+     */
+    private String oid;
+
+    /**
+     * 鐘舵�佽嫳鏂囧悕绉�
+     */
+    private String id;
+
+    /**
+     * 鐘舵�佷腑鏂囧悕绉�
+     */
+    private String name;
+
+    /**
+     * 鎻忚堪
+     */
+    private String description;
+
+    /**
+     * 鏃堕棿鎴筹紝鐢ㄤ簬鏍¢獙鏄惁鏈�鏂版暟鎹�
+     */
+    private Date ts;
+
+    public String getOid() {
+        return oid;
+    }
+
+    public void setOid(String oid) {
+        this.oid = oid;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public Date getTs() {
+        return ts;
+    }
+
+    public void setTs(Date ts) {
+        this.ts = ts;
+    }
+
+    @Override
+    public String toString() {
+        return "OsStatusDTO{" +
+                "oid='" + oid + '\'' +
+                ", id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", description='" + description + '\'' +
+                ", ts=" + ts +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/ProcessNodeUseDTO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/ProcessNodeUseDTO.java
new file mode 100644
index 0000000..d3af0f6
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/ProcessNodeUseDTO.java
@@ -0,0 +1,37 @@
+package com.vci.web.dto;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 鐢ㄦ潵鑾峰彇鍓嶇浼犻�掕繃鏉ョ殑娴佺▼鐢ㄦ埛
+ * @author weidy
+ * @date 2021-2-12
+ */
+public class ProcessNodeUseDTO implements java.io.Serializable{
+
+	/**
+	 * 搴忓垪鍖�
+	 */
+	private static final long serialVersionUID = 885288291142233425L;
+
+	/**
+	 * 鑺傜偣鐨勭敤鎴�
+	 */
+	private Map<String,String> nodeUsers = new HashMap<String, String>();
+
+	public Map<String, String> getNodeUsers() {
+		return nodeUsers;
+	}
+
+	public void setNodeUsers(Map<String, String> nodeUsers) {
+		this.nodeUsers = nodeUsers;
+	}
+
+	@Override
+	public String toString() {
+		return "ProcessNodeUseDTO{" +
+				"nodeUsers=" + nodeUsers +
+				'}';
+	}
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/ProcessStartConfigDTO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/ProcessStartConfigDTO.java
new file mode 100644
index 0000000..c0b4608
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/ProcessStartConfigDTO.java
@@ -0,0 +1,261 @@
+package com.vci.web.dto;
+
+/**
+ * 娴佺▼鍚姩鐩稿叧鐨勯厤缃�
+ * @author weidy
+ * @date 2021-2-12
+ */
+public class ProcessStartConfigDTO implements java.io.Serializable{
+
+	/**
+	 * 搴忓垪鍖�
+	 */
+	private static final long serialVersionUID = 3749032313326035791L;
+	
+	/**
+	 * 娴佺▼閮ㄧ讲鐨刬d
+	 */
+	private String deployId;
+	
+	/**
+	 * 娴佺▼鐨勫悕绉�
+	 */
+	private String title;
+	
+	/**
+	 * 娴佺▼鎻忚堪
+	 */
+	private String description;
+	
+	/**
+	 * 鏁版嵁鎵�灞炰笟鍔$被鍨�
+	 */
+	private String btmType;
+	
+    /**
+     * 鏁版嵁鐨勪富閿�	
+     */
+	private String oids;
+
+	/**
+	 * 鎵�鏈夌殑鏁版嵁褰撲腑鐨勬渶澶у瘑绾э紝濡傛灉璇ヤ笟鍔℃暟鎹病鏈夊瘑绾у瓧娈碉紝鍒欏�间负-1
+	 */
+	private int maxSecret;
+	
+	/**
+	 * 鏄剧ず鏁版嵁鍒楄〃鐨勬柟寮�
+	 */
+	private String dataShowType;
+	
+	/**
+	 * 鑷畾涔夋樉绀鸿〃鏍肩殑瀹氫箟
+	 */
+	private String customTableDefine;
+	
+	/**
+	 * 鏄剧ず鏁版嵁鐨勮〃鏍肩紪鐮�
+	 */
+	private String tableDefineCode;
+
+	/**
+	 * 鏄剧ず娴佺▼璇︾粏淇℃伅鐨勮矾寰�
+	 */
+	private String detailInfoUrl;
+
+	/**
+	 * 椤甸潰鏄剧ず鐨勬墍灞炰笟鍔$被鍨嬶紝榛樿绛変簬鏁版嵁鐨勪笟鍔$被鍨�
+	 */
+	private String uiType;
+
+	/**
+	 * UI鐨勫睍绀轰笟鍔$被鍨�
+	 */
+	private String content;
+	
+	/**
+	 * 鏄惁鍙戣捣澶氫釜娴佺▼
+	 */
+	private boolean isMutiProcess = false;
+	
+	/**
+	 * 鏄惁鑷姩鎻愪氦绗竴涓妭鐐�
+	 */
+	private boolean autoSubmitFirst = true;
+
+	/**
+	 * 缁堟鐨勬椂鍊欒浆鎹㈣浆鎬�
+	 */
+	private String resetStatus;
+
+	/**
+	 * 寮�濮嬫祦绋嬪悗鐨勭姸鎬�
+	 */
+	private String startStatus;
+
+	/**
+	 * 娴佺▼鎵ц瀹屾瘯鍚庣殑鐘舵��
+	 */
+	private String releaseStatus;
+
+	public String getUiType() {
+		return uiType;
+	}
+
+	public void setUiType(String uiType) {
+		this.uiType = uiType;
+	}
+
+	public String getStartStatus() {
+		return startStatus;
+	}
+
+	public void setStartStatus(String startStatus) {
+		this.startStatus = startStatus;
+	}
+
+	public String getReleaseStatus() {
+		return releaseStatus;
+	}
+
+	public void setReleaseStatus(String releaseStatus) {
+		this.releaseStatus = releaseStatus;
+	}
+
+	public String getDeployId() {
+		return deployId;
+	}
+
+	public void setDeployId(String deployId) {
+		this.deployId = deployId;
+	}
+
+	public String getTitle() {
+		return title;
+	}
+
+	public void setTitle(String title) {
+		this.title = title;
+	}
+
+	public String getBtmType() {
+		return btmType;
+	}
+
+	public void setBtmType(String btmType) {
+		this.btmType = btmType;
+	}
+
+	public String getOids() {
+		return oids;
+	}
+
+	public void setOids(String oids) {
+		this.oids = oids;
+	}
+
+	public String getDataShowType() {
+		return dataShowType;
+	}
+
+	public void setDataShowType(String dataShowType) {
+		this.dataShowType = dataShowType;
+	}
+
+	public String getCustomTableDefine() {
+		return customTableDefine;
+	}
+
+	public void setCustomTableDefine(String customTableDefine) {
+		this.customTableDefine = customTableDefine;
+	}
+
+	public String getTableDefineCode() {
+		return tableDefineCode;
+	}
+
+	public void setTableDefineCode(String tableDefineCode) {
+		this.tableDefineCode = tableDefineCode;
+	}
+
+	public boolean isMutiProcess() {
+		return isMutiProcess;
+	}
+
+	public void setMutiProcess(boolean isMutiProcess) {
+		this.isMutiProcess = isMutiProcess;
+	}
+
+	public String getDescription() {
+		return description;
+	}
+
+	public void setDescription(String description) {
+		this.description = description;
+	}
+
+	public int getMaxSecret() {
+		return maxSecret;
+	}
+
+	public void setMaxSecret(int maxSecret) {
+		this.maxSecret = maxSecret;
+	}
+
+	public String getDetailInfoUrl() {
+		return detailInfoUrl;
+	}
+
+	public void setDetailInfoUrl(String detailInfoUrl) {
+		this.detailInfoUrl = detailInfoUrl;
+	}
+
+	public boolean isAutoSubmitFirst() {
+		return autoSubmitFirst;
+	}
+
+	public void setAutoSubmitFirst(boolean autoSubmitFirst) {
+		this.autoSubmitFirst = autoSubmitFirst;
+	}
+
+	public String getContent() {
+		return content;
+	}
+
+	public void setContent(String content) {
+		this.content = content;
+	}
+
+
+	public String getResetStatus() {
+		return resetStatus;
+	}
+
+	public void setResetStatus(String resetStatus) {
+		this.resetStatus = resetStatus;
+	}
+
+
+
+	@Override
+	public String toString() {
+		return "ProcessStartConfigDTO{" +
+				"deployId='" + deployId + '\'' +
+				", title='" + title + '\'' +
+				", description='" + description + '\'' +
+				", btmType='" + btmType + '\'' +
+				", oids='" + oids + '\'' +
+				", maxSecret=" + maxSecret +
+				", dataShowType='" + dataShowType + '\'' +
+				", customTableDefine='" + customTableDefine + '\'' +
+				", tableDefineCode='" + tableDefineCode + '\'' +
+				", detailInfoUrl='" + detailInfoUrl + '\'' +
+				", uiType='" + uiType + '\'' +
+				", content='" + content + '\'' +
+				", isMutiProcess=" + isMutiProcess +
+				", autoSubmitFirst=" + autoSubmitFirst +
+				", resetStatus='" + resetStatus + '\'' +
+				", startStatus='" + startStatus + '\'' +
+				", releaseStatus='" + releaseStatus + '\'' +
+				'}';
+	}
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/WFWorkflowNodeFavDTO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/WFWorkflowNodeFavDTO.java
new file mode 100644
index 0000000..24b4d56
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/WFWorkflowNodeFavDTO.java
@@ -0,0 +1,114 @@
+package com.vci.web.dto;
+
+import com.vci.starter.web.pagemodel.BaseModelVO;
+
+import java.util.List;
+
+/**
+ * Description: 娴佺▼璐熻矗浜烘敹钘忔暟鎹紶杈撳璞�
+ *
+ * @author: weidy
+ * @date: 2021-06-08
+ */
+public class WFWorkflowNodeFavDTO extends BaseModelVO {
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = -6207085488013756316L;
+
+    /**
+     * 鎻忚堪
+     */
+    private String description;
+
+    /**
+     * 娴佺▼妯℃澘鐨勪富閿�
+     */
+    private String id;
+
+    /**
+     * 鏀惰棌鏂规鐨勫悕绉�
+     */
+    private String name;
+
+    /**
+     * 娴佺▼妯℃澘鐨勫悕绉�
+     */
+    private String wfTemplateName;
+
+    /**
+     * 娴佺▼妯℃澘鐨勭増鏈�
+     */
+    private String wfTemplateRev;
+
+    /**
+     * 鏄庣粏鐨勫唴瀹�
+     */
+    List<WFWorkflowNodeFavItemDTO> items;
+
+    @Override
+    public String getDescription() {
+        return description;
+    }
+
+    @Override
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    @Override
+    public String getId() {
+        return id;
+    }
+
+    @Override
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getWfTemplateName() {
+        return wfTemplateName;
+    }
+
+    public void setWfTemplateName(String wfTemplateName) {
+        this.wfTemplateName = wfTemplateName;
+    }
+
+    public String getWfTemplateRev() {
+        return wfTemplateRev;
+    }
+
+    public void setWfTemplateRev(String wfTemplateRev) {
+        this.wfTemplateRev = wfTemplateRev;
+    }
+
+    public List<WFWorkflowNodeFavItemDTO> getItems() {
+        return items;
+    }
+
+    public void setItems(List<WFWorkflowNodeFavItemDTO> items) {
+        this.items = items;
+    }
+
+    @Override
+    public String toString() {
+        return "WFWorkflowNodeFavDTO{" +
+                "description='" + description + '\'' +
+                ", id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", wfTemplateName='" + wfTemplateName + '\'' +
+                ", wfTemplateRev='" + wfTemplateRev + '\'' +
+                ", items=" + items +
+                '}' + super.toString();
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/WFWorkflowNodeFavItemDTO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/WFWorkflowNodeFavItemDTO.java
new file mode 100644
index 0000000..df72528
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/WFWorkflowNodeFavItemDTO.java
@@ -0,0 +1,66 @@
+package com.vci.web.dto;
+
+import com.vci.starter.web.pagemodel.BaseModelVO;
+
+/**
+ * Description:娴佺▼鏀惰棌鑺傜偣鏄庣粏鏁版嵁浼犺緭瀵硅薄
+ *
+ * @author: weidy
+ * @date: 2021-06-08
+ */
+public class WFWorkflowNodeFavItemDTO extends BaseModelVO {
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = 497465037220641130L;
+
+    /**
+     * 鑺傜偣鐨勫悕绉�
+     */
+    private String name;
+
+    /**
+     * 鍖呭惈鐨勭敤鎴峰悕锛屽彲浠ュ涓紝浣嗘槸鎬荤殑涓嶈秴杩�4000闀垮害
+     */
+    private String nodeUserIds;
+
+    /**
+     * 鍖呭惈鐢ㄦ埛濮撳悕
+     */
+    private String nodeUserNames;
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getNodeUserIds() {
+        return nodeUserIds;
+    }
+
+    public void setNodeUserIds(String nodeUserIds) {
+        this.nodeUserIds = nodeUserIds;
+    }
+
+    public String getNodeUserNames() {
+        return nodeUserNames;
+    }
+
+    public void setNodeUserNames(String nodeUserNames) {
+        this.nodeUserNames = nodeUserNames;
+    }
+
+    @Override
+    public String toString() {
+        return "WFWorkflowNodeFavItemDTO{" +
+                "name='" + name + '\'' +
+                ", nodeUserIds='" + nodeUserIds + '\'' +
+                ", nodeUserNames='" + nodeUserNames + '\'' +
+                '}' + super.toString();
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/WebHomeTaskActionDTO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/WebHomeTaskActionDTO.java
new file mode 100644
index 0000000..bf4921f
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/dto/WebHomeTaskActionDTO.java
@@ -0,0 +1,95 @@
+package com.vci.web.dto;
+import com.vci.starter.web.model.BaseModel;
+
+/**
+ * 棣栭〉鐨勫緟鍔炰簨椤癸紝涓嶆槸娴佺▼
+ * @author weidy
+ * @date 2021-2-22
+ */
+public class WebHomeTaskActionDTO extends BaseModel  {
+
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = 3169989789942760265L;
+
+    /**
+     * 鍔熻兘缂栧彿锛岀敤浜庣‘瀹氬姛鑳芥潈闄�
+     */
+    private String id;
+
+    /**
+     * 鏄剧ず鏂囨湰
+     */
+    private String  name;
+
+    /**
+     * 鏈嶅姟鍚嶇О
+     */
+    private String serviceName;
+
+    /**
+     * 鑾峰彇鏁伴噺鐨刄rl
+     */
+    private String countUrl;
+
+    /**
+     * 鐐瑰嚮鍚庣殑閾炬帴鍦板潃
+     */
+    private String uiUrl;
+
+    @Override
+    public String getId() {
+        return id;
+    }
+
+    @Override
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getServiceName() {
+        return serviceName;
+    }
+
+    public void setServiceName(String serviceName) {
+        this.serviceName = serviceName;
+    }
+
+    public String getCountUrl() {
+        return countUrl;
+    }
+
+    public void setCountUrl(String countUrl) {
+        this.countUrl = countUrl;
+    }
+
+    public String getUiUrl() {
+        return uiUrl;
+    }
+
+    public void setUiUrl(String uiUrl) {
+        this.uiUrl = uiUrl;
+    }
+
+    @Override
+    public String toString() {
+        return "WebHomeTaskActionDTO{" +
+                "id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", serviceName='" + serviceName + '\'' +
+                ", countUrl='" + countUrl + '\'' +
+                ", uiUrl='" + uiUrl + '\'' +
+                "} " + super.toString();
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/enumpck/OsCodeDateValueTypeEnum.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/enumpck/OsCodeDateValueTypeEnum.java
new file mode 100644
index 0000000..0eb4cd8
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/enumpck/OsCodeDateValueTypeEnum.java
@@ -0,0 +1,129 @@
+package com.vci.web.enumpck;
+
+import com.vci.starter.web.annotation.VciEnum;
+import com.vci.starter.web.enumpck.BaseEnum;
+import com.vci.web.constant.EnumIdConstant;
+
+/**
+ * 缂栫爜鐨勬椂闂村彇鍊肩被鍨�
+ * @author weidy
+ * @date 2020/3/28
+ */
+@VciEnum(name = EnumIdConstant.CODE_DATE_VALUE_TYPE,text = "缂栫爜鏃堕棿鍙栧�肩被鍨�",description = "绯荤粺鏃堕棿鍜屼笟鍔℃椂闂达紝涓氬姟鏃堕棿闇�瑕佽幏鍙栦笟鍔$被鍨嬩腑鐨勬椂闂寸被鍨�")
+public enum OsCodeDateValueTypeEnum implements BaseEnum {
+
+    /**
+     * 绯荤粺鏃堕棿
+     */
+    SYSTEM("code_date_system","绯荤粺鏃堕棿"),
+
+    /**
+     * 涓氬姟鏃堕棿
+     */
+    BUSINESS("code_date_business","涓氬姟鏃堕棿");
+
+    /**
+     * 鏋氫妇鐨勫��
+     */
+    private String value;
+
+    /**
+     * 鏋氫妇鏄剧ず鏂囨湰
+     */
+    private String text;
+
+    /**
+     * 鑾峰彇鏋氫妇鍊�
+     *
+     * @return 鏋氫妇鍊�
+     */
+    @Override
+    public String getValue() {
+        return value;
+    }
+
+    /**
+     * 璁剧疆鏋氫妇鍊�
+     *
+     * @param value 鏋氫妇鍊�
+     */
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    /**
+     * 鑾峰彇鏋氫妇鏄剧ず鏂囨湰
+     *
+     * @return 鏄剧ず鏂囨湰
+     */
+    @Override
+    public String getText() {
+        return text;
+    }
+
+    /**
+     * 璁剧疆鏄剧ず鏂囨湰
+     *
+     * @param text 鏄剧ず鏂囨湰
+     */
+    public void setText(String text) {
+        this.text = text;
+    }
+
+    /**
+     * 鏋勯�犲嚱鏁�
+     *
+     * @param value 鍊�
+     * @param text  鏄剧ず鏂囨湰
+     */
+    private OsCodeDateValueTypeEnum(String value, String text) {
+        this.value = value;
+        this.text = text;
+    }
+
+    /**
+     * 鏍规嵁鍚嶇О鑾峰彇瀵瑰簲鐨勬灇涓惧��
+     *
+     * @param text 鍚嶇О
+     * @return 鏋氫妇鍊�
+     */
+    public static String getValueByText(String text) {
+        for (OsCodeDateValueTypeEnum wenum : OsCodeDateValueTypeEnum.values()) {
+            if (wenum.getText().equalsIgnoreCase(text)) {
+                return wenum.getValue();
+            }
+        }
+        return "";
+    }
+
+    /**
+     * 鏍规嵁鏋氫妇鍊艰幏鍙栧悕绉�
+     *
+     * @param value 鏋氫妇鍊�
+     * @return 鍚嶇О
+     */
+    public static String getTextByValue(String value) {
+        for (OsCodeDateValueTypeEnum wenum : OsCodeDateValueTypeEnum.values()) {
+            if (wenum.getValue().equalsIgnoreCase(value)) {
+                return wenum.getText();
+            }
+        }
+        return "";
+    }
+
+    /**
+     * 鏍规嵁鏋氫妇鍊艰幏鍙栨灇涓惧璞�
+     *
+     * @param value 鏋氫妇鍊�
+     * @return 鏋氫妇瀵硅薄锛屼笉瀛樺湪鏃跺�欒繑鍥瀗ull
+     */
+    public static OsCodeDateValueTypeEnum forValue(String value) {
+        for (OsCodeDateValueTypeEnum wenum : OsCodeDateValueTypeEnum.values()) {
+            if (wenum.getValue().equalsIgnoreCase(value)) {
+                return wenum;
+            }
+        }
+        return null;
+    }
+}
+
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/enumpck/OsCodeElementTypeEnum.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/enumpck/OsCodeElementTypeEnum.java
new file mode 100644
index 0000000..9621eb1
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/enumpck/OsCodeElementTypeEnum.java
@@ -0,0 +1,155 @@
+package com.vci.web.enumpck;
+
+
+import com.vci.starter.web.annotation.VciEnum;
+import com.vci.starter.web.enumpck.BaseEnum;
+import com.vci.web.constant.EnumIdConstant;
+
+/**
+ * 缂栫爜鍏冪礌绫诲瀷
+ * @author weidy
+ * @date 2020/3/28
+ */
+@VciEnum(name = EnumIdConstant.CODE_ELEMENT_TYPE,text = "缂栫爜鍏冪礌绫诲瀷",description = "鍖呮嫭甯搁噺锛屾灇涓炬槧灏勶紝鐗规畩鏄犲皠锛屾墜鍔ㄨ緭鍏ワ紝娴佹按鍙�")
+public enum OsCodeElementTypeEnum implements BaseEnum {
+
+    /**
+     * 鎵嬪姩杈撳叆
+     */
+    INPUT("code_element_input","鎵嬪姩杈撳叆"),
+
+    /**
+     * 甯搁噺
+     */
+    STATIC("code_element_static","甯搁噺"),
+
+    /**
+     * 鏃ユ湡
+     */
+    DATE("code_element_date","鏃ユ湡"),
+
+    /**
+     * 灞炴��
+     */
+    FIELD("code_element_field","灞炴��"),
+
+    /**
+     * 鏋氫妇灞炴�ф槧灏�
+     */
+    ENUM("code_element_enum","鏋氫妇灞炴�ф槧灏�"),
+
+    /**
+     * 鍏紡
+     */
+    EXPRESSION("code_element_expression","鍏紡"),
+
+    /**
+     * 娴佹按鍙�
+     */
+    SERIAL("code_element_serial","娴佹按鍙�");
+
+    /**
+     * 鏋氫妇鐨勫��
+     */
+    private String value;
+
+    /**
+     * 鏋氫妇鏄剧ず鏂囨湰
+     */
+    private String text;
+
+    /**
+     * 鑾峰彇鏋氫妇鍊�
+     *
+     * @return 鏋氫妇鍊�
+     */
+    @Override
+    public String getValue() {
+        return value;
+    }
+
+    /**
+     * 璁剧疆鏋氫妇鍊�
+     *
+     * @param value 鏋氫妇鍊�
+     */
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    /**
+     * 鑾峰彇鏋氫妇鏄剧ず鏂囨湰
+     *
+     * @return 鏄剧ず鏂囨湰
+     */
+    @Override
+    public String getText() {
+        return text;
+    }
+
+    /**
+     * 璁剧疆鏄剧ず鏂囨湰
+     *
+     * @param text 鏄剧ず鏂囨湰
+     */
+    public void setText(String text) {
+        this.text = text;
+    }
+
+    /**
+     * 鏋勯�犲嚱鏁�
+     *
+     * @param value 鍊�
+     * @param text  鏄剧ず鏂囨湰
+     */
+    private OsCodeElementTypeEnum(String value, String text) {
+        this.value = value;
+        this.text = text;
+    }
+
+    /**
+     * 鏍规嵁鍚嶇О鑾峰彇瀵瑰簲鐨勬灇涓惧��
+     *
+     * @param text 鍚嶇О
+     * @return 鏋氫妇鍊�
+     */
+    public static String getValueByText(String text) {
+        for (OsCodeElementTypeEnum wenum : OsCodeElementTypeEnum.values()) {
+            if (wenum.getText().equalsIgnoreCase(text)) {
+                return wenum.getValue();
+            }
+        }
+        return "";
+    }
+
+    /**
+     * 鏍规嵁鏋氫妇鍊艰幏鍙栧悕绉�
+     *
+     * @param value 鏋氫妇鍊�
+     * @return 鍚嶇О
+     */
+    public static String getTextByValue(String value) {
+        for (OsCodeElementTypeEnum wenum : OsCodeElementTypeEnum.values()) {
+            if (wenum.getValue().equalsIgnoreCase(value)) {
+                return wenum.getText();
+            }
+        }
+        return "";
+    }
+
+    /**
+     * 鏍规嵁鏋氫妇鍊艰幏鍙栨灇涓惧璞�
+     *
+     * @param value 鏋氫妇鍊�
+     * @return 鏋氫妇瀵硅薄锛屼笉瀛樺湪鏃跺�欒繑鍥瀗ull
+     */
+    public static OsCodeElementTypeEnum forValue(String value) {
+        for (OsCodeElementTypeEnum wenum : OsCodeElementTypeEnum.values()) {
+            if (wenum.getValue().equalsIgnoreCase(value)) {
+                return wenum;
+            }
+        }
+        return null;
+    }
+}
+
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/enumpck/OsCodeFillTypeEnum.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/enumpck/OsCodeFillTypeEnum.java
new file mode 100644
index 0000000..18841e0
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/enumpck/OsCodeFillTypeEnum.java
@@ -0,0 +1,135 @@
+package com.vci.web.enumpck;
+
+
+import com.vci.starter.web.annotation.VciEnum;
+import com.vci.starter.web.enumpck.BaseEnum;
+import com.vci.web.constant.EnumIdConstant;
+
+/**
+ * 缂栫爜鐨勮ˉ浣嶆柟寮�
+ * @author weidy
+ * @date 2020/3/28
+ */
+@VciEnum(name = EnumIdConstant.CODE_FILL_TYPE,text = "缂栫爜琛ヤ綅鏂瑰紡",description = "涓嶈ˉ浣嶏紝宸﹁ˉ浣嶏紝鍙宠ˉ浣�")
+public enum OsCodeFillTypeEnum implements BaseEnum {
+
+    /**
+     * 涓嶈ˉ浣�
+     */
+    NONE("code_fill_none","涓嶈ˉ浣�"),
+
+    /**
+     * 宸﹁ˉ浣�
+     */
+    LEFT("code_fill_left","宸﹁ˉ浣�"),
+
+    /**
+     * 鍙宠ˉ浣�
+     */
+    RIGHT("code_fill_right","鍙宠ˉ浣�");
+
+    /**
+     * 鏋氫妇鐨勫��
+     */
+    private String value;
+
+    /**
+     * 鏋氫妇鏄剧ず鏂囨湰
+     */
+    private String text;
+
+    /**
+     * 鑾峰彇鏋氫妇鍊�
+     *
+     * @return 鏋氫妇鍊�
+     */
+    @Override
+    public String getValue() {
+        return value;
+    }
+
+    /**
+     * 璁剧疆鏋氫妇鍊�
+     *
+     * @param value 鏋氫妇鍊�
+     */
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    /**
+     * 鑾峰彇鏋氫妇鏄剧ず鏂囨湰
+     *
+     * @return 鏄剧ず鏂囨湰
+     */
+    @Override
+    public String getText() {
+        return text;
+    }
+
+    /**
+     * 璁剧疆鏄剧ず鏂囨湰
+     *
+     * @param text 鏄剧ず鏂囨湰
+     */
+    public void setText(String text) {
+        this.text = text;
+    }
+
+    /**
+     * 鏋勯�犲嚱鏁�
+     *
+     * @param value 鍊�
+     * @param text  鏄剧ず鏂囨湰
+     */
+    private OsCodeFillTypeEnum(String value, String text) {
+        this.value = value;
+        this.text = text;
+    }
+
+    /**
+     * 鏍规嵁鍚嶇О鑾峰彇瀵瑰簲鐨勬灇涓惧��
+     *
+     * @param text 鍚嶇О
+     * @return 鏋氫妇鍊�
+     */
+    public static String getValueByText(String text) {
+        for (OsCodeFillTypeEnum wenum : OsCodeFillTypeEnum.values()) {
+            if (wenum.getText().equalsIgnoreCase(text)) {
+                return wenum.getValue();
+            }
+        }
+        return "";
+    }
+
+    /**
+     * 鏍规嵁鏋氫妇鍊艰幏鍙栧悕绉�
+     *
+     * @param value 鏋氫妇鍊�
+     * @return 鍚嶇О
+     */
+    public static String getTextByValue(String value) {
+        for (OsCodeFillTypeEnum wenum : OsCodeFillTypeEnum.values()) {
+            if (wenum.getValue().equalsIgnoreCase(value)) {
+                return wenum.getText();
+            }
+        }
+        return "";
+    }
+
+    /**
+     * 鏍规嵁鏋氫妇鍊艰幏鍙栨灇涓惧璞�
+     *
+     * @param value 鏋氫妇鍊�
+     * @return 鏋氫妇瀵硅薄锛屼笉瀛樺湪鏃跺�欒繑鍥瀗ull
+     */
+    public static OsCodeFillTypeEnum forValue(String value) {
+        for (OsCodeFillTypeEnum wenum : OsCodeFillTypeEnum.values()) {
+            if (wenum.getValue().equalsIgnoreCase(value)) {
+                return wenum;
+            }
+        }
+        return null;
+    }
+}
+
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/enumpck/OsCodeGenJsPanelTypeEnum.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/enumpck/OsCodeGenJsPanelTypeEnum.java
new file mode 100644
index 0000000..acb3952
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/enumpck/OsCodeGenJsPanelTypeEnum.java
@@ -0,0 +1,139 @@
+package com.vci.web.enumpck;
+
+import com.vci.starter.web.annotation.VciEnum;
+import com.vci.starter.web.enumpck.BaseEnum;
+import com.vci.web.constant.EnumIdConstant;
+
+/**
+ * 椤甸潰鐨勭被鍨�
+ * @author weidy
+ * @date 2020/7/30
+ */
+@VciEnum(name = EnumIdConstant.OS_CODE_GEN_PANEL_TYPE,text = "浠g爜鐢熸垚鐨勯潰鏉跨被鍨�")
+public enum OsCodeGenJsPanelTypeEnum implements BaseEnum {
+
+    /**
+     * 鏍戝舰
+     */
+    TREE("tree","鏍戝舰"),
+
+    /**
+     * 琛ㄦ牸
+     */
+    TABLE("table","琛ㄦ牸"),
+
+    /**
+     * 鏍戣〃
+     */
+    TABLE_TREE("table_tree","鏍戣〃"),
+
+    /**
+     * 琛ㄥ崟
+     */
+    FORM("form","琛ㄥ崟");
+
+    /**
+     * 鏋氫妇鐨勫��
+     */
+    private String value;
+
+    /**
+     * 鏋氫妇鏄剧ず鏂囨湰
+     */
+    private String text;
+
+    /**
+     * 鑾峰彇鏋氫妇鍊�
+     *
+     * @return 鏋氫妇鍊�
+     */
+    @Override
+    public String getValue() {
+        return value;
+    }
+
+    /**
+     * 璁剧疆鏋氫妇鍊�
+     *
+     * @param value 鏋氫妇鍊�
+     */
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    /**
+     * 鑾峰彇鏋氫妇鏄剧ず鏂囨湰
+     *
+     * @return 鏄剧ず鏂囨湰
+     */
+    @Override
+    public String getText() {
+        return text;
+    }
+
+    /**
+     * 璁剧疆鏄剧ず鏂囨湰
+     *
+     * @param text 鏄剧ず鏂囨湰
+     */
+    public void setText(String text) {
+        this.text = text;
+    }
+
+    /**
+     * 鏋勯�犲嚱鏁�
+     *
+     * @param value 鍊�
+     * @param text  鏄剧ず鏂囨湰
+     */
+    private OsCodeGenJsPanelTypeEnum(String value, String text) {
+        this.value = value;
+        this.text = text;
+    }
+
+    /**
+     * 鏍规嵁鍚嶇О鑾峰彇瀵瑰簲鐨勬灇涓惧��
+     *
+     * @param text 鍚嶇О
+     * @return 鏋氫妇鍊�
+     */
+    public static String getValueByText(String text) {
+        for (OsCodeGenJsPanelTypeEnum wenum : OsCodeGenJsPanelTypeEnum.values()) {
+            if (wenum.getText().equalsIgnoreCase(text)) {
+                return wenum.getValue();
+            }
+        }
+        return "";
+    }
+
+    /**
+     * 鏍规嵁鏋氫妇鍊艰幏鍙栧悕绉�
+     *
+     * @param value 鏋氫妇鍊�
+     * @return 鍚嶇О
+     */
+    public static String getTextByValue(String value) {
+        for (OsCodeGenJsPanelTypeEnum wenum : OsCodeGenJsPanelTypeEnum.values()) {
+            if (wenum.getValue().equalsIgnoreCase(value)) {
+                return wenum.getText();
+            }
+        }
+        return "";
+    }
+
+    /**
+     * 鏍规嵁鏋氫妇鍊艰幏鍙栨灇涓惧璞�
+     *
+     * @param value 鏋氫妇鍊�
+     * @return 鏋氫妇瀵硅薄锛屼笉瀛樺湪鏃跺�欒繑鍥瀗ull
+     */
+    public static OsCodeGenJsPanelTypeEnum forValue(String value) {
+        for (OsCodeGenJsPanelTypeEnum wenum : OsCodeGenJsPanelTypeEnum.values()) {
+            if (wenum.getValue().equalsIgnoreCase(value)) {
+                return wenum;
+            }
+        }
+        return null;
+    }
+}
+
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/enumpck/OsCodeProductTypeEnum.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/enumpck/OsCodeProductTypeEnum.java
new file mode 100644
index 0000000..4df67b4
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/enumpck/OsCodeProductTypeEnum.java
@@ -0,0 +1,130 @@
+package com.vci.web.enumpck;
+
+
+import com.vci.starter.web.annotation.VciEnum;
+import com.vci.starter.web.enumpck.BaseEnum;
+import com.vci.web.constant.EnumIdConstant;
+
+/**
+ * 缂栫爜鐢熸垚鏂瑰紡
+ * @author weidy
+ * @date 2020/3/28
+ */
+@VciEnum(name = EnumIdConstant.CODE_PRODUCT_TYPE,text = "妗f缂栧彿鐢熸垚鏂瑰紡",description = "鍓嶇紪鐮佹槸鎸囬〉闈㈡樉绀虹殑鏃跺�欑敓鎴�,鍚庣紪鐮佹槸椤甸潰鐨勬暟鎹繚瀛樼殑鏃跺�欑敓鎴�")
+public enum OsCodeProductTypeEnum implements BaseEnum {
+
+    /**
+     * 鍓嶇紪鐮侊紝鍦ㄩ〉闈㈡樉绀虹殑鏃跺�欏氨鐢熸垚
+     */
+    BEFORE("code_product_before","鍓嶇紪鐮�"),
+
+    /**
+     * 鍚庣紪鐮侊紝鍦ㄩ〉闈㈢殑鏁版嵁淇濆瓨鐨勬椂鍊欑敓鎴�
+     */
+    AFTER("code_product_after","鍚庣紪鐮�");
+
+    /**
+     * 鏋氫妇鐨勫��
+     */
+    private String value;
+
+    /**
+     * 鏋氫妇鏄剧ず鏂囨湰
+     */
+    private String text;
+
+    /**
+     * 鑾峰彇鏋氫妇鍊�
+     *
+     * @return 鏋氫妇鍊�
+     */
+    @Override
+    public String getValue() {
+        return value;
+    }
+
+    /**
+     * 璁剧疆鏋氫妇鍊�
+     *
+     * @param value 鏋氫妇鍊�
+     */
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    /**
+     * 鑾峰彇鏋氫妇鏄剧ず鏂囨湰
+     *
+     * @return 鏄剧ず鏂囨湰
+     */
+    @Override
+    public String getText() {
+        return text;
+    }
+
+    /**
+     * 璁剧疆鏄剧ず鏂囨湰
+     *
+     * @param text 鏄剧ず鏂囨湰
+     */
+    public void setText(String text) {
+        this.text = text;
+    }
+
+    /**
+     * 鏋勯�犲嚱鏁�
+     *
+     * @param value 鍊�
+     * @param text  鏄剧ず鏂囨湰
+     */
+    private OsCodeProductTypeEnum(String value, String text) {
+        this.value = value;
+        this.text = text;
+    }
+
+    /**
+     * 鏍规嵁鍚嶇О鑾峰彇瀵瑰簲鐨勬灇涓惧��
+     *
+     * @param text 鍚嶇О
+     * @return 鏋氫妇鍊�
+     */
+    public static String getValueByText(String text) {
+        for (OsCodeProductTypeEnum wenum : OsCodeProductTypeEnum.values()) {
+            if (wenum.getText().equalsIgnoreCase(text)) {
+                return wenum.getValue();
+            }
+        }
+        return "";
+    }
+
+    /**
+     * 鏍规嵁鏋氫妇鍊艰幏鍙栧悕绉�
+     *
+     * @param value 鏋氫妇鍊�
+     * @return 鍚嶇О
+     */
+    public static String getTextByValue(String value) {
+        for (OsCodeProductTypeEnum wenum : OsCodeProductTypeEnum.values()) {
+            if (wenum.getValue().equalsIgnoreCase(value)) {
+                return wenum.getText();
+            }
+        }
+        return "";
+    }
+
+    /**
+     * 鏍规嵁鏋氫妇鍊艰幏鍙栨灇涓惧璞�
+     *
+     * @param value 鏋氫妇鍊�
+     * @return 鏋氫妇瀵硅薄锛屼笉瀛樺湪鏃跺�欒繑鍥瀗ull
+     */
+    public static OsCodeProductTypeEnum forValue(String value) {
+        for (OsCodeProductTypeEnum wenum : OsCodeProductTypeEnum.values()) {
+            if (wenum.getValue().equalsIgnoreCase(value)) {
+                return wenum;
+            }
+        }
+        return null;
+    }
+}
+
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/enumpck/UIButtonDisplayModeEnum.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/enumpck/UIButtonDisplayModeEnum.java
new file mode 100644
index 0000000..9583bb5
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/enumpck/UIButtonDisplayModeEnum.java
@@ -0,0 +1,100 @@
+package com.vci.web.enumpck;
+
+import com.vci.starter.web.enumpck.BaseEnum;
+
+/**
+ * UI甯冨眬鐨勫尯鍩�
+ * @author weidy
+ * @date 2021-2-15
+ */
+public enum UIButtonDisplayModeEnum implements BaseEnum {
+    /**
+     * 鏂囧瓧鍜屽浘鏍�
+     */
+    TEXT_IMAGE("textandimage","鏂囧瓧鍜屽浘鏍�"),
+
+    /**
+     * 鏂囧瓧
+     */
+    TEXT("text","鏂囧瓧"),
+
+    /**
+     * 鍥炬爣
+     */
+    IMAGE("image","鍥炬爣");
+
+    /**
+     * 鍊�
+     */
+    private String value;
+
+    /**
+     * 鏄剧ず鏂囨湰
+     */
+    private String text;
+
+    @Override
+    public String getValue() {
+        return value;
+    }
+
+    @Override
+    public String getText() {
+        return text;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public void setText(String text) {
+        this.text = text;
+    }
+
+    private UIButtonDisplayModeEnum(String value, String text){
+        this.value = value;
+        this.text = text;
+    }
+
+    /**
+     * 鏍规嵁鍚嶇О鑾峰彇瀵瑰簲鐨勬灇涓惧��
+     * @param text 鍚嶇О
+     * @return 鏋氫妇鍊�
+     */
+    public static String getValueByText(String text){
+        for(UIButtonDisplayModeEnum wenum : UIButtonDisplayModeEnum.values()){
+            if(wenum.getText().equalsIgnoreCase(text)){
+                return wenum.getValue();
+            }
+        }
+        return "";
+    }
+
+    /**
+     * 鏍规嵁鏋氫妇鍊艰幏鍙栧悕绉�
+     * @param value 鏋氫妇鍊�
+     * @return 鍚嶇О
+     */
+    public static String getTextByValue(String value){
+        for(UIButtonDisplayModeEnum wenum : UIButtonDisplayModeEnum.values()){
+            if(wenum.getValue().equalsIgnoreCase(value)){
+                return wenum.getText();
+            }
+        }
+        return "";
+    }
+
+    /**
+     * 鍊艰浆鎹负鏋氫妇瀵硅薄
+     * @param value 鍊�
+     * @return 濡傛灉涓嶇鍚堣姹傝繑鍥濶ull
+     */
+    public static UIButtonDisplayModeEnum forValue(String value){
+        for(UIButtonDisplayModeEnum wenum : UIButtonDisplayModeEnum.values()){
+            if(wenum.getValue().equalsIgnoreCase(value)){
+                return wenum;
+            }
+        }
+        return UIButtonDisplayModeEnum.TEXT_IMAGE;
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/enumpck/UIComponentDisplayTypeEnum.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/enumpck/UIComponentDisplayTypeEnum.java
new file mode 100644
index 0000000..db5dba0
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/enumpck/UIComponentDisplayTypeEnum.java
@@ -0,0 +1,100 @@
+package com.vci.web.enumpck;
+
+import com.vci.starter.web.enumpck.BaseEnum;
+
+/**
+ * UI缁勪欢鐨勬樉绀虹被鍨嬶紵锛燂紵鐩墠涓嶇煡閬撶敤鏉ュ共鍟�
+ * @author weidy
+ * @date 2021-2-15
+ */
+public enum UIComponentDisplayTypeEnum implements BaseEnum {
+    /**
+     * 涓嶆樉绀�
+     */
+    NONE("none","涓嶆樉绀�"),
+
+    /**
+     * 鏄剧ず瑙掕壊
+     */
+    ROLE("role","鏄剧ず瑙掕壊"),
+
+    /**
+     * 鏄剧ず鏂囦欢澶�
+     */
+    FOLDER("folder","鏄剧ず鏂囦欢澶�");
+
+    /**
+     * 鍊�
+     */
+    private String value;
+
+    /**
+     * 鏄剧ず鏂囨湰
+     */
+    private String text;
+
+    @Override
+    public String getValue() {
+        return value;
+    }
+
+    @Override
+    public String getText() {
+        return text;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public void setText(String text) {
+        this.text = text;
+    }
+
+    private UIComponentDisplayTypeEnum(String value, String text){
+        this.value = value;
+        this.text = text;
+    }
+
+    /**
+     * 鏍规嵁鍚嶇О鑾峰彇瀵瑰簲鐨勬灇涓惧��
+     * @param text 鍚嶇О
+     * @return 鏋氫妇鍊�
+     */
+    public static String getValueByText(String text){
+        for(UIComponentDisplayTypeEnum wenum : UIComponentDisplayTypeEnum.values()){
+            if(wenum.getText().equalsIgnoreCase(text)){
+                return wenum.getValue();
+            }
+        }
+        return "";
+    }
+
+    /**
+     * 鏍规嵁鏋氫妇鍊艰幏鍙栧悕绉�
+     * @param value 鏋氫妇鍊�
+     * @return 鍚嶇О
+     */
+    public static String getTextByValue(String value){
+        for(UIComponentDisplayTypeEnum wenum : UIComponentDisplayTypeEnum.values()){
+            if(wenum.getValue().equalsIgnoreCase(value)){
+                return wenum.getText();
+            }
+        }
+        return "";
+    }
+
+    /**
+     * 鍊艰浆鎹负鏋氫妇瀵硅薄
+     * @param value 鍊�
+     * @return 濡傛灉涓嶇鍚堣姹傝繑鍥濶ull
+     */
+    public static UIComponentDisplayTypeEnum forValue(String value){
+        for(UIComponentDisplayTypeEnum wenum : UIComponentDisplayTypeEnum.values()){
+            if(wenum.getValue().equalsIgnoreCase(value)){
+                return wenum;
+            }
+        }
+        return UIComponentDisplayTypeEnum.NONE;
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/enumpck/UIComponentTypeEnum.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/enumpck/UIComponentTypeEnum.java
new file mode 100644
index 0000000..df88189
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/enumpck/UIComponentTypeEnum.java
@@ -0,0 +1,110 @@
+package com.vci.web.enumpck;
+
+import com.vci.starter.web.enumpck.BaseEnum;
+
+/**
+ * UI缁勪欢鐨勭被鍨�
+ * @author weidy
+ * @date 2021-2-15
+ */
+public enum UIComponentTypeEnum implements BaseEnum {
+    /**
+     * 琛ㄦ牸
+     */
+    TABLE("table","琛ㄦ牸"),
+
+    /**
+     * 鑷畾涔夋ā鏉�
+     */
+    CUSTOMER("customer","鑷畾涔夋ā鏉�"),
+
+    /**
+     * 鏍戣〃
+     */
+    TREE_GRID("treeGrid","鏍戣〃"),
+
+    /**
+     * 琛ㄥ崟
+     */
+    FORM("form","琛ㄥ崟"),
+
+    /**
+     * 鏍�
+     */
+    TREE("tree","鏍�");
+
+    /**
+     * 鍊�
+     */
+    private String value;
+
+    /**
+     * 鏄剧ず鏂囨湰
+     */
+    private String text;
+
+    @Override
+    public String getValue() {
+        return value;
+    }
+
+    @Override
+    public String getText() {
+        return text;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public void setText(String text) {
+        this.text = text;
+    }
+
+    private UIComponentTypeEnum(String value, String text){
+        this.value = value;
+        this.text = text;
+    }
+
+    /**
+     * 鏍规嵁鍚嶇О鑾峰彇瀵瑰簲鐨勬灇涓惧��
+     * @param text 鍚嶇О
+     * @return 鏋氫妇鍊�
+     */
+    public static String getValueByText(String text){
+        for(UIComponentTypeEnum wenum : UIComponentTypeEnum.values()){
+            if(wenum.getText().equalsIgnoreCase(text)){
+                return wenum.getValue();
+            }
+        }
+        return "";
+    }
+
+    /**
+     * 鏍规嵁鏋氫妇鍊艰幏鍙栧悕绉�
+     * @param value 鏋氫妇鍊�
+     * @return 鍚嶇О
+     */
+    public static String getTextByValue(String value){
+        for(UIComponentTypeEnum wenum : UIComponentTypeEnum.values()){
+            if(wenum.getValue().equalsIgnoreCase(value)){
+                return wenum.getText();
+            }
+        }
+        return "";
+    }
+
+    /**
+     * 鍊艰浆鎹负鏋氫妇瀵硅薄
+     * @param value 鍊�
+     * @return 濡傛灉涓嶇鍚堣姹傝繑鍥濶ull
+     */
+    public static UIComponentTypeEnum forValue(String value){
+        for(UIComponentTypeEnum wenum : UIComponentTypeEnum.values()){
+            if(wenum.getValue().equalsIgnoreCase(value)){
+                return wenum;
+            }
+        }
+        return UIComponentTypeEnum.TABLE;
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/enumpck/UIFieldTypeEnum.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/enumpck/UIFieldTypeEnum.java
new file mode 100644
index 0000000..1aa7d3f
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/enumpck/UIFieldTypeEnum.java
@@ -0,0 +1,156 @@
+package com.vci.web.enumpck;
+
+import com.vci.starter.web.enumpck.BaseEnum;
+
+/**
+ * UI甯冨眬鐨勫尯鍩�
+ * @author weidy
+ * @date 2021-2-15
+ */
+public enum UIFieldTypeEnum implements BaseEnum {
+    /**
+     * 鏂囨湰
+     */
+    TEXT("text","鏂囨湰"),
+
+    /**
+     * 鏂囨湰鍩�
+     */
+    TEXTAREA("textarea","鏂囨湰鍩�"),
+
+    /**
+     * 瀵嗙爜妗�
+     */
+    PASSWORD("password","瀵嗙爜妗�"),
+
+    /**
+     * 鍗楀尯
+     */
+    RADIO("radio","鍗曢��"),
+
+    /**
+     * 澶嶉�夋
+     */
+    CHECKBOX("checkbox","澶嶉�夋"),
+
+    /**
+     * 涓嬫媺
+     */
+    COMBOX("combox","涓嬫媺"),
+
+    /**
+     * 鍙傜収
+     */
+    REFER("refer","鍙傜収"),
+
+    /**
+     * WEB缂栬緫鍣�
+     */
+    WEBEDITOR("webeditor","WEB缂栬緫鍣�"),
+
+    /**
+     * 鏃ユ湡
+     */
+    DATE("date","鏃ユ湡"),
+    /**
+     * 鏃堕棿
+     */
+    TIME("time","鏃堕棿"),
+
+    /**
+     * 鏃ユ湡鏃堕棿
+     */
+    DATETIME("datetime","鏃ユ湡鏃堕棿"),
+
+    /**
+     * 闅愯棌
+     */
+    HIDDEN("hidden","闅愯棌"),
+    /**
+     * 鏂囦欢
+     */
+    FILE("file","鏂囦欢"),
+    /**
+     * 澶氫釜鏂囦欢
+     */
+    MULTI_FILE("multiFile","澶氫釜鏂囦欢"),
+    /**
+     * 鑷畾涔�
+     */
+    CUSTOM("custom","鑷畾涔�");
+
+    /**
+     * 鍊�
+     */
+    private String value;
+
+    /**
+     * 鏄剧ず鏂囨湰
+     */
+    private String text;
+
+    @Override
+    public String getValue() {
+        return value;
+    }
+
+    @Override
+    public String getText() {
+        return text;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public void setText(String text) {
+        this.text = text;
+    }
+
+    private UIFieldTypeEnum(String value, String text){
+        this.value = value;
+        this.text = text;
+    }
+
+    /**
+     * 鏍规嵁鍚嶇О鑾峰彇瀵瑰簲鐨勬灇涓惧��
+     * @param text 鍚嶇О
+     * @return 鏋氫妇鍊�
+     */
+    public static String getValueByText(String text){
+        for(UIFieldTypeEnum wenum : UIFieldTypeEnum.values()){
+            if(wenum.getText().equalsIgnoreCase(text)){
+                return wenum.getValue();
+            }
+        }
+        return "";
+    }
+
+    /**
+     * 鏍规嵁鏋氫妇鍊艰幏鍙栧悕绉�
+     * @param value 鏋氫妇鍊�
+     * @return 鍚嶇О
+     */
+    public static String getTextByValue(String value){
+        for(UIFieldTypeEnum wenum : UIFieldTypeEnum.values()){
+            if(wenum.getValue().equalsIgnoreCase(value)){
+                return wenum.getText();
+            }
+        }
+        return "";
+    }
+
+    /**
+     * 鍊艰浆鎹负鏋氫妇瀵硅薄
+     * @param value 鍊�
+     * @return 濡傛灉涓嶇鍚堣姹傝繑鍥濶ull
+     */
+    public static UIFieldTypeEnum forValue(String value){
+        for(UIFieldTypeEnum wenum : UIFieldTypeEnum.values()){
+            if(wenum.getValue().equalsIgnoreCase(value)){
+                return wenum;
+            }
+        }
+        return UIFieldTypeEnum.TEXT;
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/enumpck/UILayoutAreaTypeEnum.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/enumpck/UILayoutAreaTypeEnum.java
new file mode 100644
index 0000000..521abed
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/enumpck/UILayoutAreaTypeEnum.java
@@ -0,0 +1,105 @@
+package com.vci.web.enumpck;
+
+import com.vci.starter.web.enumpck.BaseEnum;
+
+/**
+ * UI甯冨眬鐨勫尯鍩�
+ * @author weidy
+ * @date 2021-2-15
+ */
+public enum UILayoutAreaTypeEnum implements BaseEnum {
+    /**
+     * 瑗垮尯/瀵艰埅鍖�
+     */
+    WEST("west","瑗垮尯/瀵艰埅鍖�"),
+
+    /**
+     * 鍖楀尯
+     */
+    NORTH("north","鍖楀尯/鎺у埗鍖�"),
+
+    /**
+     * 涓績鍖�
+     */
+    CENTER("center","涓績鍖�/鎿嶄綔鍖�"),
+
+    /**
+     * 鍗楀尯
+     */
+    SOUTH("south","鍗楀尯");
+
+    /**
+     * 鍊�
+     */
+    private String value;
+
+    /**
+     * 鏄剧ず鏂囨湰
+     */
+    private String text;
+
+    @Override
+    public String getValue() {
+        return value;
+    }
+
+    @Override
+    public String getText() {
+        return text;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public void setText(String text) {
+        this.text = text;
+    }
+
+    private UILayoutAreaTypeEnum(String value,String text){
+        this.value = value;
+        this.text = text;
+    }
+
+    /**
+     * 鏍规嵁鍚嶇О鑾峰彇瀵瑰簲鐨勬灇涓惧��
+     * @param text 鍚嶇О
+     * @return 鏋氫妇鍊�
+     */
+    public static String getValueByText(String text){
+        for(UILayoutAreaTypeEnum wenum : UILayoutAreaTypeEnum.values()){
+            if(wenum.getText().equalsIgnoreCase(text)){
+                return wenum.getValue();
+            }
+        }
+        return "";
+    }
+
+    /**
+     * 鏍规嵁鏋氫妇鍊艰幏鍙栧悕绉�
+     * @param value 鏋氫妇鍊�
+     * @return 鍚嶇О
+     */
+    public static String getTextByValue(String value){
+        for(UILayoutAreaTypeEnum wenum : UILayoutAreaTypeEnum.values()){
+            if(wenum.getValue().equalsIgnoreCase(value)){
+                return wenum.getText();
+            }
+        }
+        return "";
+    }
+
+    /**
+     * 鍊艰浆鎹负鏋氫妇瀵硅薄
+     * @param value 鍊�
+     * @return 濡傛灉涓嶇鍚堣姹傝繑鍥濶ull
+     */
+    public static UILayoutAreaTypeEnum forValue(String value){
+        for(UILayoutAreaTypeEnum wenum : UILayoutAreaTypeEnum.values()){
+            if(wenum.getValue().equalsIgnoreCase(value)){
+                return wenum;
+            }
+        }
+        return UILayoutAreaTypeEnum.CENTER;
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/enumpck/UITreeLoadTypeEnum.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/enumpck/UITreeLoadTypeEnum.java
new file mode 100644
index 0000000..70ea8f3
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/enumpck/UITreeLoadTypeEnum.java
@@ -0,0 +1,95 @@
+package com.vci.web.enumpck;
+
+import com.vci.starter.web.enumpck.BaseEnum;
+
+/**
+ * UI鏍戠殑鍔犺浇鏂瑰紡
+ * @author weidy
+ * @date 2021-2-15
+ */
+public enum UITreeLoadTypeEnum implements BaseEnum {
+    /**
+     * 鍏ㄩ儴灞曞紑
+     */
+    ALL("all","鍏ㄩ儴灞曞紑"),
+
+    /**
+     * 閫愮骇灞曞紑
+     */
+    NODE("node","閫愮骇灞曞紑");
+
+    /**
+     * 鍊�
+     */
+    private String value;
+
+    /**
+     * 鏄剧ず鏂囨湰
+     */
+    private String text;
+
+    @Override
+    public String getValue() {
+        return value;
+    }
+
+    @Override
+    public String getText() {
+        return text;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public void setText(String text) {
+        this.text = text;
+    }
+
+    private UITreeLoadTypeEnum(String value, String text){
+        this.value = value;
+        this.text = text;
+    }
+
+    /**
+     * 鏍规嵁鍚嶇О鑾峰彇瀵瑰簲鐨勬灇涓惧��
+     * @param text 鍚嶇О
+     * @return 鏋氫妇鍊�
+     */
+    public static String getValueByText(String text){
+        for(UITreeLoadTypeEnum wenum : UITreeLoadTypeEnum.values()){
+            if(wenum.getText().equalsIgnoreCase(text)){
+                return wenum.getValue();
+            }
+        }
+        return "";
+    }
+
+    /**
+     * 鏍规嵁鏋氫妇鍊艰幏鍙栧悕绉�
+     * @param value 鏋氫妇鍊�
+     * @return 鍚嶇О
+     */
+    public static String getTextByValue(String value){
+        for(UITreeLoadTypeEnum wenum : UITreeLoadTypeEnum.values()){
+            if(wenum.getValue().equalsIgnoreCase(value)){
+                return wenum.getText();
+            }
+        }
+        return "";
+    }
+
+    /**
+     * 鍊艰浆鎹负鏋氫妇瀵硅薄
+     * @param value 鍊�
+     * @return 濡傛灉涓嶇鍚堣姹傝繑鍥濶ull
+     */
+    public static UITreeLoadTypeEnum forValue(String value){
+        for(UITreeLoadTypeEnum wenum : UITreeLoadTypeEnum.values()){
+            if(wenum.getValue().equalsIgnoreCase(value)){
+                return wenum;
+            }
+        }
+        return UITreeLoadTypeEnum.NODE;
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/initTask/VciWebInitTaskComponent.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/initTask/VciWebInitTaskComponent.java
new file mode 100644
index 0000000..8cbffd3
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/initTask/VciWebInitTaskComponent.java
@@ -0,0 +1,373 @@
+package com.vci.web.initTask;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.vci.corba.common.VCIError;
+import com.vci.frameworkcore.compatibility.ISmFunctionQueryService;
+import com.vci.frameworkcore.constant.FrameWorkBtmTypeConstant;
+import com.vci.frameworkcore.properties.VciFramworkCompatibilityProperties;
+import com.vci.mw.client.ClientContextVariable;
+import com.vci.mw.client.InvocationUtility;
+import com.vci.mw.client.LaunchModeEnum;
+import com.vci.starter.corba.initializer.JacorbClientRequestInterceptor;
+import com.vci.starter.corba.properties.JacorbClientMapProperties;
+import com.vci.starter.web.annotation.config.VciConfigField;
+import com.vci.starter.web.annotation.config.VciConfigModule;
+import com.vci.starter.web.enumpck.DataSecretEnum;
+import com.vci.starter.web.enumpck.SessionStorageTypeEnum;
+import com.vci.starter.web.enumpck.UserSecretEnum;
+import com.vci.starter.web.interceptor.VciSessionForLoginI;
+import com.vci.starter.web.pagemodel.SessionInfo;
+import com.vci.starter.web.properties.VciSessionProperties;
+import com.vci.starter.web.util.ApplicationContextProvider;
+import com.vci.starter.web.util.LocalFileUtil;
+import com.vci.starter.web.wrapper.VciQueryWrapperForDO;
+import com.vci.web.pageModel.OsAttributeVO;
+import com.vci.web.properties.WebProperties;
+import com.vci.web.service.*;
+import com.vci.web.service.impl.OsAttributeServiceImpl;
+import com.vci.web.service.impl.UIEngineServiceImpl;
+import com.vci.web.service.impl.WebContextInfoFetcher;
+import com.vci.web.service.impl.WebInitServiceImpl;
+import com.vci.web.util.PlatformClientUtil;
+import com.vci.web.util.WebUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.ResourceUtils;
+import plm.bs.bom.common.AttributeValue;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.*;
+import java.util.stream.Collectors;
+
+
+/**
+ *  鏈嶅姟鍒濆鍖�
+ * @author weidy
+ * @date 2019/12/13
+ */
+@Component
+public class VciWebInitTaskComponent implements ApplicationRunner {
+
+
+    /**
+     * 鏃ュ織瀵硅薄
+     */
+    private Logger logger = LoggerFactory.getLogger(getClass());
+
+    /**
+     * 鍒濆鍖栫殑鏈嶅姟
+     */
+    @Autowired
+    private WebInitServiceImpl initService;
+
+    /**
+     * 鏄惁鍏煎
+     */
+    @Value("${user-table-compatibility:}")
+    private String compatibility;
+
+    /**
+     * 涓婁笅鏂囨敞鍐�
+     */
+    @Autowired
+    private WebContextInfoFetcher contextInfoFetcher;
+
+    /**
+     * 閰嶇疆瀵硅薄
+     */
+    @Autowired
+    private WebProperties webProperties;
+
+    /**
+     * 骞冲彴璋冪敤瀹㈡埛绔�
+     */
+    @Autowired
+    private PlatformClientUtil platformClientUtil;
+
+    /**
+     * 浼氳瘽鐨勯厤缃�
+     */
+    @Autowired(required = false)
+    private VciSessionProperties sessionProperties;
+
+    /**
+     * 浼氳瘽澶勭悊
+     */
+    @Autowired
+    private VciSessionForLoginI sessionForLogin;
+    /**
+     * 寮曞叆鍏煎鐨勯厤缃�
+     */
+    @Autowired(required = false)
+    private VciFramworkCompatibilityProperties compatibilityProperties;
+
+    /**
+     * 灞炴�х殑鏈嶅姟
+     */
+    @Autowired
+    private OsAttributeServiceI attributeService;
+
+    /**
+     * markdown鐨勬湇鍔�
+     */
+    @Autowired
+    private VciMdServiceI mdService;
+
+    /**
+     * 瀵嗙骇鏈嶅姟
+     */
+    @Autowired
+    private WebSecretServiceI secretService;
+
+    /**
+     * corba鐨勫鎴风
+     */
+    @Autowired(required = false)
+    private JacorbClientMapProperties jacorbClientMapProperties;
+
+    /**
+     * 鎵ц鍒濆鍖�
+     * @param args 鍚姩鐨勫弬鏁�
+     */
+    @Override
+    public void run(ApplicationArguments args) {
+        initCompatibility();
+        initCorbaFromConf();
+        initSysadmin();
+        initClearSession();
+        initSetting();
+//        secretService.getMinDataSecret();
+//        secretService.getMinIpSecret();
+//        secretService.getMinUserSecret();
+        initService.clearAllCache();
+//        initService.initServerCache();
+        mdService.scanAllMdFile();
+        initDefaultAttribute();
+    }
+
+    /**
+     * 鍒濆鍖栭粯璁ょ殑灞炴��
+     */
+    private void initDefaultAttribute() {
+        try {
+            String attrJson = LocalFileUtil.readContentForFileInJar("DefaultAttribute.json");
+            if (StringUtils.isBlank(attrJson)) {
+                logger.info("娌℃湁璇诲彇鍒癱lasspath*:DefaultAttribute.json鏂囦欢鐨勫唴瀹�");
+                return;
+            }
+            List<OsAttributeVO> attributeVOS = JSONObject.parseArray(attrJson, OsAttributeVO.class);
+            if(!CollectionUtils.isEmpty(attributeVOS)){
+                attributeService.setDefaultAttributeVOs(attributeVOS.stream().sorted(((o1, o2) -> o1.getId().compareTo(o2.getId()))).collect(Collectors.toList()));
+                attributeService.setDefaultAttributeVOMap(attributeVOS.stream().collect(Collectors.toMap(s->s.getId().toLowerCase(Locale.ROOT), t->t)));
+            }
+            logger.info("璇诲彇榛樿灞炴�у畬鎴�");
+        }catch (Throwable e){
+            logger.error("璇诲彇classpath*:DefaultAttribute.json鐨勫唴瀹瑰苟杞崲鐨勬椂鍊欏嚭閿欎簡",e);
+        }
+    }
+
+    /**
+     * 娓呴櫎浼氳瘽鐨勪俊鎭唴瀹�
+     */
+    public void initClearSession(){
+        if((sessionProperties != null && sessionProperties.isClearSessionOnStart() )&&
+                SessionStorageTypeEnum.DATABASE.equals(SessionStorageTypeEnum.forValue(sessionProperties.getSessionInfoStorageType()))){
+            try {
+                platformClientUtil.getBOFactoryService().executeUpdateSqlByParams(" delete from  VCI_SESSIONINFO ",new AttributeValue[0]);
+            }catch (Throwable e) {
+                if (logger.isErrorEnabled()) {
+                    logger.error("娓呴櫎浼氳瘽淇℃伅", e);
+                }
+            }
+        }
+    }
+
+
+    /**
+     * 鍒濆鍖栧吋瀹圭殑鍐呭
+     */
+    public void initCompatibility(){
+        //璁剧疆鍏煎鎬х殑琛ㄦ牸
+        VciQueryWrapperForDO.USER_TABLE_COMPATIBILITY = true;
+        String userBtmType = FrameWorkBtmTypeConstant.SM_USER_BTM_TYPE.toLowerCase();
+        String roleBtmType = FrameWorkBtmTypeConstant.SM_ROLE_BTM_TYPE.toLowerCase();
+        String deptBtmType = FrameWorkBtmTypeConstant.ORG_DEPARTMENT_BTM_TYPE.toLowerCase();
+        String functionBtmType = FrameWorkBtmTypeConstant.SM_FUNCTION_BTM_TYPE.toLowerCase();
+        VciQueryWrapperForDO.USER_TABLE_COMPATIBILITY_BTM_MAP.put(userBtmType, "pluser");
+        VciQueryWrapperForDO.USER_TABLE_COMPATIBILITY_BTM_MAP.put(roleBtmType, "plrole");
+        VciQueryWrapperForDO.USER_TABLE_COMPATIBILITY_BTM_MAP.put(deptBtmType, "pldept");
+        VciQueryWrapperForDO.USER_TABLE_COMPATIBILITY_BTM_MAP.put(functionBtmType, "plfunction");
+        //璇诲彇琛ㄦ牸鏄犲皠鐨勫瓧娈�
+        if (!CollectionUtils.isEmpty(compatibilityProperties.getUserTableFieldMap())) {
+            compatibilityProperties.getUserTableFieldMap().forEach((k, v) -> {
+                String key = userBtmType + VciQueryWrapperForDO.USER_TABLE_COMPATIBILITY_FIELD_SEP + k.toLowerCase();
+                VciQueryWrapperForDO.USER_TABLE_COMPATIBILITY_FIELD_MAP.put(key, v);
+            });
+        }
+        if (!CollectionUtils.isEmpty(compatibilityProperties.getRoleTableFieldMap())) {
+            compatibilityProperties.getRoleTableFieldMap().forEach((k, v) -> {
+                String key = roleBtmType + VciQueryWrapperForDO.USER_TABLE_COMPATIBILITY_FIELD_SEP + k.toLowerCase();
+                VciQueryWrapperForDO.USER_TABLE_COMPATIBILITY_FIELD_MAP.put(key, v);
+            });
+        }
+        if (!CollectionUtils.isEmpty(compatibilityProperties.getDeptTableFieldMap())) {
+            compatibilityProperties.getDeptTableFieldMap().forEach((k, v) -> {
+                String key = deptBtmType + VciQueryWrapperForDO.USER_TABLE_COMPATIBILITY_FIELD_SEP + k.toLowerCase();
+                VciQueryWrapperForDO.USER_TABLE_COMPATIBILITY_FIELD_MAP.put(key, v);
+            });
+        }
+        if (!CollectionUtils.isEmpty(compatibilityProperties.getFunctionTableFieldMap())) {
+            compatibilityProperties.getFunctionTableFieldMap().forEach((k, v) -> {
+                String key = functionBtmType + VciQueryWrapperForDO.USER_TABLE_COMPATIBILITY_FIELD_SEP + k.toLowerCase();
+                VciQueryWrapperForDO.USER_TABLE_COMPATIBILITY_FIELD_MAP.put(key, v);
+            });
+        }
+    }
+
+    /**
+     * 浠庡钩鍙扮殑閰嶇疆涓幏鍙朿onf鐨勪俊鎭�
+     */
+    public void initCorbaFromConf(){
+        File file = null;
+        try {
+            file = ResourceUtils.getFile("classpath:properties/corba.properties");
+        } catch (FileNotFoundException e) {
+            try {
+                file = ResourceUtils.getFile("classpath:corba.properties");
+            } catch (FileNotFoundException fileNotFoundException) {
+                logger.info("杩欎釜鐜閲屾病鏈夊瓨鏀惧钩鍙扮殑corba閰嶇疆鏂囦欢",fileNotFoundException);
+            }
+        }
+        try {
+            if (file.exists()) {
+                Properties properties = new Properties();
+                properties.load(new FileInputStream(file));
+                String url = properties.getProperty("NameService");
+                String name = properties.getProperty("InstanceIdentity");
+                if (StringUtils.isNotBlank(url)) {
+                    jacorbClientMapProperties.setUrl(url);
+                }
+                if (StringUtils.isNotBlank(name)) {
+                    jacorbClientMapProperties.setInstanceIdentity(name);
+                }
+            }
+        }catch (IOException e) {
+            logger.error("璇诲彇骞冲彴鐨刢orb閰嶇疆鏂囦欢鍑虹幇浜嗛敊璇�",e);
+        }
+    }
+
+    /**
+     * 鍒濆鍖栫敤鎴�
+     */
+    public void initSysadmin(){
+        SessionInfo sessionInfo = new SessionInfo();
+        sessionInfo.setUserId("sysAdmin");
+        sessionInfo.setUserName("绯荤粺绠$悊鍛�");
+        sessionInfo.setIp(WebUtil.getLocalIp());
+        sessionInfo.setUserOid("193C026F-7DB8-27B4-F383-4E8BE083FB07");
+        sessionInfo.setUserSecret(UserSecretEnum.PRIVACY.getValue()+"");
+        WebUtil.setSessionInfo(sessionInfo);
+    }
+    /**
+     * 鍒濆鍖栫浉鍏崇殑閰嶇疆淇℃伅
+     */
+    public void initSetting() {
+        System.out.println("----鍒濆鍖栫敤浜庢煡璇㈤厤缃殑鐢ㄦ埛----");
+        ClientContextVariable.setClientLanuchMode(LaunchModeEnum.WebApp);
+        InvocationUtility.registerIInvocationContext(contextInfoFetcher);
+        JacorbClientRequestInterceptor.sessionContext = contextInfoFetcher;
+        System.out.println("----鍒濆鍖栫敤浜庢煡璇㈤厤缃殑鐢ㄦ埛瀹屾垚----");
+        System.out.println("----寮�濮嬫壂鎻忔湁VciConfigModule娉ㄨВ鐨勭被----");
+        String[] namesForAnnotation = ApplicationContextProvider.getApplicationContext().getBeanNamesForAnnotation(VciConfigModule.class);
+        if(namesForAnnotation!=null && namesForAnnotation.length > 0){
+            for(String beanName : namesForAnnotation){
+                Object bean = ApplicationContextProvider.getApplicationContext().getBean(beanName);
+                List<Field> fields = WebUtil.getAllFieldForObj(bean.getClass());
+                Map<String,Field> configFieldMap = new HashMap<>();
+                List<Field> hasConfigFields = fields.stream().filter(s -> {
+                    s.setAccessible(true);
+                    return s.isAnnotationPresent(VciConfigField.class);
+                }).collect(Collectors.toList());
+                if(!CollectionUtils.isEmpty(hasConfigFields)){
+                    hasConfigFields.stream().forEach(field -> {
+                        field.setAccessible(true);
+                        VciConfigField vciConfigField = field.getAnnotation(VciConfigField.class);
+                        if(vciConfigField == null){
+                            vciConfigField = field.getDeclaredAnnotation(VciConfigField.class);
+                        }
+                        configFieldMap.put(vciConfigField.value(),field);
+                    });
+//                    configFieldMap.forEach((configField,field)->{
+//                        String configValue = null;
+//                        try {
+//                            configValue = platformClientUtil.getLogonFactoryService().getFrameworkService().getConfigValue("",configField);
+//                        } catch (VCIError vciError) {
+//                           if(logger.isErrorEnabled()){
+//                               logger.error(vciError.error_code,vciError);
+//                           }
+//                        }
+//                        Class<?> fieldType = field.getType();
+//                        Method method = WebUtil.getSetmethod(bean.getClass(), field);
+//                        Object value = null;
+//                        if(fieldType.equals(Boolean.class) || fieldType.equals(boolean.class)){
+//                            value = ("on".equalsIgnoreCase(configValue) || "true".equalsIgnoreCase(configValue))?true:false;
+//                        }else if(fieldType.equals(Double.class) || fieldType.equals(double.class)){
+//                            value = WebUtil.getDouble(configValue);
+//                        }else if(fieldType.equals(Long.class) || fieldType.equals(long.class)){
+//                            value = WebUtil.getLong(configValue);
+//                        }else if(fieldType.equals(Float.class) || fieldType.equals(float.class)){
+//                            value = WebUtil.getFloat(configValue);
+//                        }else if(fieldType.equals(Integer.class) || fieldType.equals(int.class)){
+//                            value = WebUtil.getInt(configValue);
+//                        }else{
+//                            value = configValue;
+//                        }
+//                        try {
+//                            method.invoke(bean,value);
+//                        } catch (IllegalAccessException e) {
+//                            if(logger.isErrorEnabled()){
+//                                logger.error(e.getMessage(),e);
+//                            }
+//                        } catch (InvocationTargetException e) {
+//                            if(logger.isErrorEnabled()){
+//                                logger.error(e.getMessage(),e);
+//                            }
+//                        }
+//                    });
+                }
+            }
+        }
+        //鍙湁褰撴暟鎹瘑绾ф帶鍒跺紑鍚殑鎯呭喌涓嬶紝鎵嶄細鎺у埗娴佺▼鍙戣捣鏃剁殑瀵嗙骇
+        webProperties.setCheckSecretOnProcessStart(webProperties.isCheckClientSessionTimeout()&&webProperties.isSecretRight());
+        if(webProperties.isDebug()){
+            UIEngineServiceImpl.QUERY_BY_CACHE = false;
+        }
+        System.out.println("---璇诲彇鏈嶅姟绔殑閰嶇疆鏂囦欢瀹屾垚---");
+    }
+
+
+
+
+
+    public String getCompatibility() {
+        return compatibility;
+    }
+
+    public void setCompatibility(String compatibility) {
+        this.compatibility = compatibility;
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/interceptor/MyMVCConfig.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/interceptor/MyMVCConfig.java
new file mode 100644
index 0000000..7eeb10a
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/interceptor/MyMVCConfig.java
@@ -0,0 +1,25 @@
+package com.vci.web.interceptor;
+
+
+import com.vci.starter.web.interceptor.VciSecurityInterceptor;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.EnableWebMvc;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Configuration
+@EnableWebMvc
+//@Order(100)
+public class MyMVCConfig implements WebMvcConfigurer {
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+//閰嶇疆鐧藉悕鍗�
+        List<String> patterns = new ArrayList<>();
+        patterns.add("/stmFunctionController/**");
+//        patterns.add("/smFunctionController/**");
+        registry.addInterceptor(new VciSecurityInterceptor()).excludePathPatterns(patterns);
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/lifeCycle/FileObjectLCStatus.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/lifeCycle/FileObjectLCStatus.java
new file mode 100644
index 0000000..8c96bb3
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/lifeCycle/FileObjectLCStatus.java
@@ -0,0 +1,125 @@
+package com.vci.web.lifeCycle;
+
+import com.vci.file.constant.VciFileLifeConstant;
+import com.vci.frameworkcore.constant.FrameWorkDefaultValueConstant;
+import com.vci.starter.web.annotation.Transient;
+import com.vci.starter.web.annotation.VciLifeCycle;
+import com.vci.starter.web.annotation.VciLifeCycleTrans;
+import com.vci.starter.web.constant.FrameWorkLcStatusConstant;
+import com.vci.starter.web.enumpck.BaseEnum;
+
+/**
+ * 鏂囦欢鐢熷懡鍛ㄦ湡
+ * @author weidy
+ * @date 2020/1/2
+ */
+@VciLifeCycle(name= VciFileLifeConstant.FILE_LC,text = "鏂囦欢鐢熷懡鍛ㄦ湡",startStatus = FrameWorkDefaultValueConstant.FRAMEWORK_RELEASE_EDITING,
+        translations = {
+                @VciLifeCycleTrans(source = FrameWorkDefaultValueConstant.FRAMEWORK_RELEASE_EDITING, target = FrameWorkDefaultValueConstant.FRAMEWORK_RELEASE_AUDITING,name="鎻愪氦瀹℃壒"),
+                @VciLifeCycleTrans(source = FrameWorkDefaultValueConstant.FRAMEWORK_RELEASE_AUDITING, target =FrameWorkDefaultValueConstant.FRAMEWORK_RELEASE_RELEASED,name="瀹℃壒閫氳繃"),
+                @VciLifeCycleTrans(source = FrameWorkDefaultValueConstant.FRAMEWORK_RELEASE_AUDITING, target =FrameWorkDefaultValueConstant.FRAMEWORK_RELEASE_EDITING,name="瀹℃壒涓嶉�氳繃"),
+                @VciLifeCycleTrans(source =FrameWorkDefaultValueConstant.FRAMEWORK_RELEASE_EDITING, target = FrameWorkDefaultValueConstant.FRAMEWORK_RELEASE_RELEASED,name="鐩存帴鐢熸晥"),
+                @VciLifeCycleTrans(source = FrameWorkDefaultValueConstant.FRAMEWORK_RELEASE_EDITING, target = FrameWorkDefaultValueConstant.FRAMEWORK_RELEASE_OBSOLETED,name="鐩存帴鎶ュ簾"),
+                @VciLifeCycleTrans(source = FrameWorkDefaultValueConstant.FRAMEWORK_RELEASE_RELEASED, target =FrameWorkDefaultValueConstant.FRAMEWORK_RELEASE_OBSOLETED,name="鍙戝竷鍚庢姤搴�"),
+                @VciLifeCycleTrans(source =FrameWorkDefaultValueConstant.FRAMEWORK_RELEASE_AUDITING, target = FrameWorkDefaultValueConstant.FRAMEWORK_RELEASE_OBSOLETED,name="瀹℃壒涓姤搴�")
+        })
+@Transient
+public enum FileObjectLCStatus implements BaseEnum {
+    /**
+     * 缂栬緫涓�
+     */
+    EDITING(FrameWorkDefaultValueConstant.FRAMEWORK_RELEASE_EDITING,"缂栬緫涓�"),
+    /**
+     * 瀹℃壒涓�
+     */
+    AUDITING(FrameWorkDefaultValueConstant.FRAMEWORK_RELEASE_AUDITING,"瀹℃壒涓�"),
+    /**
+     * 宸蹭綔搴�
+     */
+    OBSOLETED(FrameWorkDefaultValueConstant.FRAMEWORK_RELEASE_OBSOLETED,"宸蹭綔搴�"),
+    /**
+     * 宸插彂甯�
+     */
+    RELEASED(FrameWorkDefaultValueConstant.FRAMEWORK_RELEASE_RELEASED,"宸插彂甯�");
+
+    /**
+     * 鏋氫妇鍊�
+     */
+    private String value;
+
+    /**
+     * 鏋氫妇鏄剧ず鍊�
+     */
+    private String text;
+    /**
+     * 鑾峰彇鏋氫妇鍊�
+     * @return 鏋氫妇鍊�
+     */
+    @Override
+    public String getValue() {
+        return value;
+    }
+
+    /**
+     * 璁剧疆鏋氫妇鍊�
+     * @param value 鏋氫妇鍊�
+     */
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    /**
+     * 鑾峰彇鏄剧ず鏂囨湰
+     * @return 鏄剧ず鏂囨湰
+     */
+    @Override
+    public String getText() {
+        return text;
+    }
+
+    /**
+     * 璁剧疆鏄剧ず鏂囨湰
+     * @param text 鏄剧ず鏂囨湰
+     */
+    public void setText(String text) {
+        this.text = text;
+    }
+
+    /**
+     * 鏋氫妇鍐呴儴鏋勯�犳柟娉�
+     * @param value 鏋氫妇鍊�
+     * @param text 鏄剧ず鏂囨湰
+     */
+    private FileObjectLCStatus(String value, String text){
+        this.value = value;
+        this.text = text;
+    }
+
+    /**
+     * 鏍规嵁鏋氫妇鐨勫�艰幏鍙栨樉绀烘枃鏈�
+     * @param value 鏋氫妇鍊�
+     * @return 鏄剧ず鏂囨湰
+     */
+    public static String getTextByValue(String value){
+        for(FileObjectLCStatus eu: FileObjectLCStatus.values()){
+            if(eu.value.equalsIgnoreCase(value)){
+                return eu.text;
+            }
+        }
+        return "";
+    }
+
+    /**
+     * 鏍规嵁鏋氫妇鏄剧ず鏂囨湰鑾峰彇鏋氫妇鍊�
+     * @param text 鏄剧ず鏂囨湰
+     * @return 鏋氫妇鍊�
+     */
+    public static String getValueByText(String text){
+        for(FileObjectLCStatus eu: FileObjectLCStatus.values()){
+            if(eu.text.equalsIgnoreCase(text)){
+                return eu.value;
+            }
+        }
+        return "";
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/lifeCycle/ReleaseDataLCStatus.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/lifeCycle/ReleaseDataLCStatus.java
new file mode 100644
index 0000000..c55db6c
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/lifeCycle/ReleaseDataLCStatus.java
@@ -0,0 +1,115 @@
+package com.vci.web.lifeCycle;
+
+import com.vci.starter.web.annotation.VciLifeCycle;
+import com.vci.starter.web.annotation.VciLifeCycleTrans;
+import com.vci.starter.web.enumpck.BaseEnum;
+
+/**
+ * 鍙戝竷鐢熷懡鍛ㄦ湡
+ * @author weidy
+ * @date 2020/1/2
+ */
+@VciLifeCycle(name= "releaseLC",text = "鍙戝竷閫氱敤鐢熷懡鍛ㄦ湡",startStatus = "Editing",
+        translations = {
+                @VciLifeCycleTrans(source = "Editing", target = "Auditing",name="鎻愪氦瀹℃壒"),
+                @VciLifeCycleTrans(source = "Auditing", target ="Released",name="瀹℃壒閫氳繃"),
+                @VciLifeCycleTrans(source = "Auditing", target ="Editing",name="瀹℃壒涓嶉�氳繃"),
+                @VciLifeCycleTrans(source ="Editing", target = "Released",name="鐩存帴鐢熸晥")
+        })
+public enum ReleaseDataLCStatus implements BaseEnum {
+    /**
+     * 缂栬緫涓�
+     */
+    EDITING("Editing","缂栬緫涓�"),
+
+    /**
+     * 瀹℃壒涓�
+     */
+    AUDITING("Auditing","瀹℃壒涓�"),
+
+    /**
+     * 宸插彂甯�
+     */
+    RELEASED("Released","宸插彂甯�");
+
+    /**
+     * 鏋氫妇鍊�
+     */
+    private String value;
+
+    /**
+     * 鏋氫妇鏄剧ず鍊�
+     */
+    private String text;
+    /**
+     * 鑾峰彇鏋氫妇鍊�
+     * @return 鏋氫妇鍊�
+     */
+    @Override
+    public String getValue() {
+        return value;
+    }
+
+    /**
+     * 璁剧疆鏋氫妇鍊�
+     * @param value 鏋氫妇鍊�
+     */
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    /**
+     * 鑾峰彇鏄剧ず鏂囨湰
+     * @return 鏄剧ず鏂囨湰
+     */
+    @Override
+    public String getText() {
+        return text;
+    }
+
+    /**
+     * 璁剧疆鏄剧ず鏂囨湰
+     * @param text 鏄剧ず鏂囨湰
+     */
+    public void setText(String text) {
+        this.text = text;
+    }
+
+    /**
+     * 鏋氫妇鍐呴儴鏋勯�犳柟娉�
+     * @param value 鏋氫妇鍊�
+     * @param text 鏄剧ず鏂囨湰
+     */
+    private ReleaseDataLCStatus(String value, String text){
+        this.value = value;
+        this.text = text;
+    }
+
+    /**
+     * 鏍规嵁鏋氫妇鐨勫�艰幏鍙栨樉绀烘枃鏈�
+     * @param value 鏋氫妇鍊�
+     * @return 鏄剧ず鏂囨湰
+     */
+    public static String getTextByValue(String value){
+        for(ReleaseDataLCStatus eu:ReleaseDataLCStatus.values()){
+            if(eu.value.equalsIgnoreCase(value)){
+                return eu.text;
+            }
+        }
+        return "";
+    }
+
+    /**
+     * 鏍规嵁鏋氫妇鏄剧ず鏂囨湰鑾峰彇鏋氫妇鍊�
+     * @param text 鏄剧ず鏂囨湰
+     * @return 鏋氫妇鍊�
+     */
+    public static String getValueByText(String text){
+        for(ReleaseDataLCStatus eu:ReleaseDataLCStatus.values()){
+            if(eu.text.equalsIgnoreCase(text)){
+                return eu.value;
+            }
+        }
+        return "";
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/BaseLinkModel.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/BaseLinkModel.java
new file mode 100644
index 0000000..ccedbba
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/BaseLinkModel.java
@@ -0,0 +1,230 @@
+package com.vci.web.model;
+
+
+import com.vci.starter.web.annotation.Column;
+import com.vci.starter.web.annotation.VciFieldType;
+import com.vci.starter.web.enumpck.VciFieldTypeEnum;
+
+import java.util.Date;
+
+/**
+ * 榛樿鐨勯摼鎺ョ被鍨�---鍏煎鑰佺殑骞冲彴-璇峰嬁浣跨敤com.vci.starter.web.涓嬬殑BaseLinkModel
+ * @author weidy
+ */
+public class BaseLinkModel implements java.io.Serializable{
+    /**
+     * 涓婚敭
+     */
+    @Column(nullable = false)
+    private String oid;
+
+    /**
+     * 鍒涘缓浜�
+     */
+    @Column(length = 50)
+    private String creator;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    @VciFieldType(VciFieldTypeEnum.VTDateTime)
+    private Date createTime;
+
+    /**
+     * 鏈�鍚庝慨鏀逛汉
+     */
+    @Column(length = 50)
+    private String lastModifier;
+
+    /**
+     * 鏈�鍚庝慨鏀规椂闂�
+     */
+    @VciFieldType(VciFieldTypeEnum.VTDateTime)
+    private Date lastModifyTime;
+
+    /**
+     * from绔富閿�
+     */
+    @Column(name="f_oid",length = 50)
+    private String foid;
+
+    /**
+     * from绔増鏈富閿�
+     */
+    @Column(name="f_revisionoid",length = 50)
+    private String frevisionoid;
+
+    /**
+     * from绔璞′富閿�
+     */
+    @Column(name="f_nameoid",length = 50)
+    private String fnameoid;
+
+    /**
+     * from绔笟鍔$被鍨�
+     */
+    @Column(name="f_btwname",length = 30)
+    private String fbtmname;
+
+    /**
+     * to绔富閿�
+     */
+    @Column(name="t_oid",length = 50)
+    private String toid;
+
+    /**
+     * to绔増鏈富閿�
+     */
+    @Column(name="t_revisionoid",length = 50)
+    private String trevisionoid;
+
+    /**
+     * to绔璞′富閿�
+     */
+    @Column(name="t_nameoid",length = 50)
+    private String tnameoid;
+
+    /**
+     * to绔笟鍔$被鍨�
+     */
+    @Column(name="t_btwname",length = 30)
+    private String tbtmname;
+
+    /**
+     * 鏃堕棿鎴�
+     */
+    private Date ts;
+
+    public String getOid() {
+        return oid;
+    }
+
+    public void setOid(String oid) {
+        this.oid = oid;
+    }
+
+    public String getCreator() {
+        return creator;
+    }
+
+    public void setCreator(String creator) {
+        this.creator = creator;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getLastModifier() {
+        return lastModifier;
+    }
+
+    public void setLastModifier(String lastModifier) {
+        this.lastModifier = lastModifier;
+    }
+
+    public Date getLastModifytime() {
+        return lastModifyTime;
+    }
+
+    public void setLastModifytime(Date lastModifytime) {
+        this.lastModifyTime = lastModifytime;
+    }
+
+    public String getFoid() {
+        return foid;
+    }
+
+    public void setFoid(String foid) {
+        this.foid = foid;
+    }
+
+    public String getFrevisionoid() {
+        return frevisionoid;
+    }
+
+    public void setFrevisionoid(String frevisionoid) {
+        this.frevisionoid = frevisionoid;
+    }
+
+    public String getFnameoid() {
+        return fnameoid;
+    }
+
+    public void setFnameoid(String fnameoid) {
+        this.fnameoid = fnameoid;
+    }
+
+
+    public String getToid() {
+        return toid;
+    }
+
+    public void setToid(String toid) {
+        this.toid = toid;
+    }
+
+    public String getTrevisionoid() {
+        return trevisionoid;
+    }
+
+    public void setTrevisionoid(String trevisionoid) {
+        this.trevisionoid = trevisionoid;
+    }
+
+    public String getTnameoid() {
+        return tnameoid;
+    }
+
+    public void setTnameoid(String tnameoid) {
+        this.tnameoid = tnameoid;
+    }
+
+    public String getFbtmname() {
+        return fbtmname;
+    }
+
+    public void setFbtmname(String fbtmname) {
+        this.fbtmname = fbtmname;
+    }
+
+    public String getTbtmname() {
+        return tbtmname;
+    }
+
+    public void setTbtmname(String tbtmname) {
+        this.tbtmname = tbtmname;
+    }
+
+    public Date getTs() {
+        return ts;
+    }
+
+    public void setTs(Date ts) {
+        this.ts = ts;
+    }
+
+    @Override
+    public String toString() {
+        return "BaseLinkModel{" +
+                "oid='" + oid + '\'' +
+                ", creator='" + creator + '\'' +
+                ", createTime=" + createTime +
+                ", lastModifier='" + lastModifier + '\'' +
+                ", lastModifytime=" + lastModifyTime +
+                ", foid='" + foid + '\'' +
+                ", frevisionoid='" + frevisionoid + '\'' +
+                ", fnameoid='" + fnameoid + '\'' +
+                ", fbtmname='" + fbtmname + '\'' +
+                ", toid='" + toid + '\'' +
+                ", trevisionoid='" + trevisionoid + '\'' +
+                ", tnameoid='" + tnameoid + '\'' +
+                ", tbtmname='" + tbtmname + '\'' +
+                ", ts=" + ts +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/BdSelectInputCharDO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/BdSelectInputCharDO.java
new file mode 100644
index 0000000..f7751c1
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/BdSelectInputCharDO.java
@@ -0,0 +1,93 @@
+package com.vci.web.model;
+
+import com.vci.starter.web.annotation.Column;
+import com.vci.starter.web.annotation.VciBtmType;
+import com.vci.starter.web.constant.FrameWorkLcStatusConstant;
+import com.vci.starter.web.model.BaseModel;
+import com.vci.web.constant.BtmIdConstant;
+
+/**
+ * 鍙緭鍙�夊唴瀹�
+ * 鍙互鎵嬪姩杈撳叆锛屼篃鍙互涓嬫媺閫夋嫨
+ * @author weidy
+ * @date 2022-1-17
+ */
+@VciBtmType(name = BtmIdConstant.BD_SELECT_INPUT,text = "鍙緭鍙�夊唴瀹�",lifeCycle = FrameWorkLcStatusConstant.EMTYPE_LIFE_CYCLE)
+public class BdSelectInputCharDO extends BaseModel {
+
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = 1662220529797280362L;
+
+    /**
+     * 瀛楃鐨勫唴瀹�
+     */
+    @Column(nullable = false,columnDefinition = "瀛楃鐨勫唴瀹�")
+    private String id;
+
+    /**
+     * 瀛楃鐨勮鏄�
+     */
+    @Column(nullable = true,columnDefinition = "瀛楃鐨勮鏄�")
+    private String name;
+
+    /**
+     * 杈撳叆婧�
+     */
+    @Column(columnDefinition = "杈撳叆鏉ユ簮")
+    private String sourceInputFlag;
+
+    /**
+     * 鏁版嵁鎵�灞為鍩�
+     */
+    @Column(columnDefinition = "鏁版嵁鎵�灞為鍩�")
+    private String sourceNameSpace;
+
+    @Override
+    public String getId() {
+        return id;
+    }
+
+    @Override
+    public void setId(String id) {
+        this.id = id;
+    }
+
+
+    public String getSourceInputFlag() {
+        return sourceInputFlag;
+    }
+
+    public void setSourceInputFlag(String sourceInputFlag) {
+        this.sourceInputFlag = sourceInputFlag;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getSourceNameSpace() {
+        return sourceNameSpace;
+    }
+
+    public void setSourceNameSpace(String sourceNameSpace) {
+        this.sourceNameSpace = sourceNameSpace;
+    }
+
+    @Override
+    public String toString() {
+        return "BdSelectInputCharDO{" +
+                "id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", sourceInputFlag='" + sourceInputFlag + '\'' +
+                ", sourceNameSpace='" + sourceNameSpace + '\'' +
+                "} " + super.toString();
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/OsAttributeDO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/OsAttributeDO.java
new file mode 100644
index 0000000..42d1365
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/OsAttributeDO.java
@@ -0,0 +1,173 @@
+package com.vci.web.model;
+
+import com.vci.starter.web.annotation.*;
+import com.vci.starter.web.constant.FrameWorkLcStatusConstant;
+
+import java.util.Date;
+
+/**
+ * 灞炴�ф睜
+ * @author weidy
+ * @date 2022-3-26
+ */
+@VciBtmType(name="attribute",text = "灞炴�ф睜",tableName = "PLATTRIBUTE",lifeCycle = FrameWorkLcStatusConstant.EMTYPE_LIFE_CYCLE)
+@Transient
+public class OsAttributeDO implements java.io.Serializable{
+
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = -6569061452208023955L;
+
+    /**
+     * 涓婚敭
+     */
+    @Id
+    private String oid;
+
+    /**
+     * 鑻辨枃鍚嶇О
+     */
+    @Column(name = "name")
+    private String id;
+
+    /**
+     * 涓枃鍚嶇О
+     */
+    @Column(name = "label")
+    private String name;
+
+    /**
+     * 鎻忚堪
+     */
+    private String description;
+
+    /**
+     * 鏃堕棿鎴�
+     */
+    private Date ts;
+
+    /**
+     * 鍒涘缓浜�
+     */
+    private String creator;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    private Date createTime;
+
+    /**
+     * 鏈�鍚庝慨鏀逛汉
+     */
+    @Column(name = "modifier")
+    private String lastModifier;
+
+    /**
+     * 鏈�鍚庝慨鏀规椂闂�
+     */
+    @Column(name = "modifytime")
+    private Date lastModifyTime;
+
+    /**
+     * 鍐呭
+     */
+    @XmlType
+    private String content;
+
+    public String getOid() {
+        return oid;
+    }
+
+    public void setOid(String oid) {
+        this.oid = oid;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public Date getTs() {
+        return ts;
+    }
+
+    public void setTs(Date ts) {
+        this.ts = ts;
+    }
+
+    public String getCreator() {
+        return creator;
+    }
+
+    public void setCreator(String creator) {
+        this.creator = creator;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getLastModifier() {
+        return lastModifier;
+    }
+
+    public void setLastModifier(String lastModifier) {
+        this.lastModifier = lastModifier;
+    }
+
+    public Date getLastModifyTime() {
+        return lastModifyTime;
+    }
+
+    public void setLastModifyTime(Date lastModifyTime) {
+        this.lastModifyTime = lastModifyTime;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    @Override
+    public String toString() {
+        return "OsAttributeDO{" +
+                "oid='" + oid + '\'' +
+                ", id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", description='" + description + '\'' +
+                ", ts=" + ts +
+                ", creator='" + creator + '\'' +
+                ", createTime=" + createTime +
+                ", lastModifier='" + lastModifier + '\'' +
+                ", lastModifyTime=" + lastModifyTime +
+                ", content='" + content + '\'' +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/OsCodeBreakCodeDO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/OsCodeBreakCodeDO.java
new file mode 100644
index 0000000..14e748c
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/OsCodeBreakCodeDO.java
@@ -0,0 +1,90 @@
+package com.vci.web.model;
+
+
+import com.vci.starter.web.annotation.Column;
+import com.vci.starter.web.annotation.VciBtmType;
+import com.vci.starter.web.annotation.VciUseRefer;
+import com.vci.starter.web.constant.FrameWorkLcStatusConstant;
+import com.vci.starter.web.model.BaseModel;
+import com.vci.web.constant.BtmIdConstant;
+
+/**
+ * 鏂爜鐨勫唴瀹�
+ * @author weidy
+ * @date 2020/3/29
+ */
+@VciBtmType(name = BtmIdConstant.OS_CODE_BREAK_CODE_BTM_TYPE,text = "鏂爜鍐呭",lifeCycle = FrameWorkLcStatusConstant.EMTYPE_LIFE_CYCLE)
+public class OsCodeBreakCodeDO extends BaseModel {
+
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = 5427707670346428874L;
+
+    /**
+     * 鎵�灞炶鍒�
+     */
+    @VciUseRefer(BtmIdConstant.OS_CODE_RULE_BTM_TYPE)
+    @Column(nullable = false,columnDefinition = "鎵�灞炶鍒�")
+    private String pkCodeRule;
+
+    /**
+     * 娴佹按鍙锋爣璇�
+     */
+    @Column(nullable = false,length = 4000,columnDefinition = "娴佹按鍙锋爣璇�")
+    private String serialUnit;
+
+    /**
+     * 鏈�澶ф祦姘村彿
+     */
+    @Column(nullable = false,range = ">0",columnDefinition = "鏈�澶ф祦姘村彿")
+    private Integer breakSerial;
+
+    /**
+     * 鍘熸潵鐨勭紪鐮佸彿
+     */
+    @Column(columnDefinition = "鍘熸潵鐨勭紪鐮佸彿")
+    private String breakCode;
+
+    public String getPkCodeRule() {
+        return pkCodeRule;
+    }
+
+    public void setPkCodeRule(String pkCodeRule) {
+        this.pkCodeRule = pkCodeRule;
+    }
+
+    public String getSerialUnit() {
+        return serialUnit;
+    }
+
+    public void setSerialUnit(String serialUnit) {
+        this.serialUnit = serialUnit;
+    }
+
+    public Integer getBreakSerial() {
+        return breakSerial;
+    }
+
+    public void setBreakSerial(Integer breakSerial) {
+        this.breakSerial = breakSerial;
+    }
+
+    public String getBreakCode() {
+        return breakCode;
+    }
+
+    public void setBreakCode(String breakCode) {
+        this.breakCode = breakCode;
+    }
+
+    @Override
+    public String toString() {
+        return "OsCodeBreakCodeDO{" +
+                "pkCodeRule='" + pkCodeRule + '\'' +
+                ", serialUnit='" + serialUnit + '\'' +
+                ", breakSerial=" + breakSerial +
+                ", breakCode='" + breakCode + '\'' +
+                "} " + super.toString();
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/OsCodeEnumDO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/OsCodeEnumDO.java
new file mode 100644
index 0000000..c947b9f
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/OsCodeEnumDO.java
@@ -0,0 +1,91 @@
+package com.vci.web.model;
+
+import com.vci.starter.web.annotation.Column;
+import com.vci.starter.web.annotation.VciBtmType;
+import com.vci.starter.web.annotation.VciUseRefer;
+import com.vci.starter.web.model.BaseModel;
+import com.vci.web.constant.BtmIdConstant;
+
+/**
+ * 缂栫爜鐨勬灇涓炬槧灏�
+ * @author weidy
+ * @date 2020/3/29
+ */
+@VciBtmType(name= BtmIdConstant.OS_CODE_ENUM_BTM_TYPE,text = "缂栫爜涓殑鏋氫妇鏄犲皠",lifeCycle = "defaultLC")
+public class OsCodeEnumDO extends BaseModel {
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = -3651586939183373717L;
+
+    /**
+     * 鎵�灞炶鍒欑殑鏄庣粏
+     */
+    @VciUseRefer(BtmIdConstant.OS_CODE_RULE_ELEMENT_BTM_TYPE)
+    @Column(nullable = false,columnDefinition = "鎵�灞炶鍒欐槑缁�")
+    private String pkCodeRuleElement;
+
+
+
+    /**
+     * 鏋氫妇椤圭殑key
+     */
+    @Column(nullable = false,columnDefinition = "鏋氫妇椤圭殑key")
+    private String enumItemKey;
+
+    /**
+     * 鏋氫妇椤圭殑鍊�
+     */
+    @Column(columnDefinition = "鏋氫妇椤圭殑鍊�")
+    private String enumItemValue;
+
+    /**
+     * 鍦ㄧ紪鐮佽鍒欎腑鐨勬槧灏勫��
+     */
+    @Column(nullable = false,columnDefinition = "鍦ㄧ紪鐮佽鍒欎腑鐨勬槧灏勫��")
+    private String codeMapValue;
+
+
+
+    public String getEnumItemKey() {
+        return enumItemKey;
+    }
+
+    public void setEnumItemKey(String enumItemKey) {
+        this.enumItemKey = enumItemKey;
+    }
+
+    public String getEnumItemValue() {
+        return enumItemValue;
+    }
+
+    public void setEnumItemValue(String enumItemValue) {
+        this.enumItemValue = enumItemValue;
+    }
+
+    public String getCodeMapValue() {
+        return codeMapValue;
+    }
+
+    public void setCodeMapValue(String codeMapValue) {
+        this.codeMapValue = codeMapValue;
+    }
+
+    public String getPkCodeRuleElement() {
+        return pkCodeRuleElement;
+    }
+
+    public void setPkCodeRuleElement(String pkCodeRuleElement) {
+        this.pkCodeRuleElement = pkCodeRuleElement;
+    }
+
+    @Override
+    public String toString() {
+        return "OsCodeEnumDO{" +
+                "pkCodeRuleElement='" + pkCodeRuleElement + '\'' +
+                ", enumItemKey='" + enumItemKey + '\'' +
+                ", enumItemValue='" + enumItemValue + '\'' +
+                ", codeMapValue='" + codeMapValue + '\'' +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/OsCodeGenSchemaDO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/OsCodeGenSchemaDO.java
new file mode 100644
index 0000000..1a167e4
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/OsCodeGenSchemaDO.java
@@ -0,0 +1,583 @@
+package com.vci.web.model;
+
+import com.vci.starter.web.annotation.*;
+import com.vci.starter.web.enumpck.VciFieldTypeEnum;
+import com.vci.starter.web.model.BaseModel;
+import com.vci.web.constant.BtmIdConstant;
+import com.vci.web.constant.EnumIdConstant;
+
+import java.util.Date;
+
+
+/**
+ * 浠g爜鐢熸垚鏂规
+ * @author weidy
+ * @date 2020/7/30 10:13
+ */
+@VciBtmType(name = BtmIdConstant.OS_CODE_GEN_SCHEMA_BTM_TYPE,text = "浠g爜鐢熸垚鏂规",lifeCycle = "")
+public class OsCodeGenSchemaDO extends BaseModel {
+
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = 4615707118969888993L;
+    /**
+     * 鎵�灞炰笟鍔$被鍨�
+     */
+    @Column(nullable = false,unique = true,columnDefinition = "鎵�灞炰笟鍔$被鍨�")
+    private String pkBtmType;
+
+    /**
+     * 涓氬姟绫诲瀷缂栧彿
+     */
+    @Column(columnDefinition = "涓氬姟绫诲瀷缂栧彿")
+    private String id;
+
+    /**
+     * 涓氬姟绫诲瀷鍚嶇О
+     */
+    @Column(columnDefinition = "涓氬姟绫诲瀷鍚嶇О")
+    private String name;
+
+    /**
+     * 绫诲悕绉�
+     */
+    @Column(columnDefinition = "绫诲悕绉�")
+    private String className;
+
+    /**
+     * 鎻忚堪
+     */
+    @Column(columnDefinition = "鎻忚堪")
+    private String description;
+
+    /**
+     * 浣滆��
+     */
+    @Column(nullable = false,columnDefinition = "浣滆��")
+    private String author;
+
+    /**
+     * 瀹炰綋鍖呭悕
+     */
+    @Column(nullable = false,columnDefinition = "瀹炰綋鍖呭悕")
+    private String doPackage;
+
+    /**
+     * 鏄惁鐢熸垚瀹炰綋瀵硅薄
+     */
+    @Column(columnDefinition = "鏄惁鐢熸垚瀹炰綋瀵硅薄",defaultValue = "false")
+    @VciFieldType(VciFieldTypeEnum.VTBoolean)
+    private String genDOFlag;
+
+    /**
+     * 鏄剧ず瀵硅薄鐨勫寘鍚�
+     */
+    @Column(nullable = false,columnDefinition = "鏄剧ず瀵硅薄鐨勫寘鍚�")
+    private String voPackage;
+
+    /**
+     * 鏄惁鐢熸垚鏄剧ず瀵硅薄
+     */
+    @Column(columnDefinition = "鏄惁鐢熸垚鏄剧ず瀵硅薄",defaultValue = "true")
+    @VciFieldType(VciFieldTypeEnum.VTBoolean)
+    private String genVOFlag;
+
+    /**
+     * 鏁版嵁浼犺緭瀵硅薄
+     */
+    @Column(nullable = false,columnDefinition = "鏁版嵁浼犺緭瀵硅薄")
+    private String dtoPackage;
+
+    /**
+     * 鏄惁鐢熸垚鏁版嵁浼犺緭瀵硅薄
+     */
+    @Column(columnDefinition = "鏄惁鐢熸垚鏁版嵁浼犺緭瀵硅薄",defaultValue = "true")
+    @VciFieldType(VciFieldTypeEnum.VTBoolean)
+    private String genDTOFlag;
+
+    /**
+     * 鎺у埗鍣ㄧ殑鍖呭悕
+     */
+    @Column(nullable = false,columnDefinition = "鎺у埗鍣ㄧ殑鍖呭悕")
+    private String controllerPackage;
+
+    /**
+     * 鎺у埗鍣ㄧ殑璇锋眰鍦板潃
+     */
+    @Column(length = 1000,columnDefinition = "鎺у埗鍣ㄧ殑璇锋眰鍦板潃")
+    private String controllerRequestMap;
+
+    /**
+     * 鏈嶅姟鍖呭悕
+     */
+    @Column(nullable = false,columnDefinition = "鏈嶅姟鍖呭悕")
+    private String servicePackage;
+
+    /**
+     * 鏁版嵁搴撴搷浣滃寘鍚�
+     */
+    @Column(nullable = false,columnDefinition = "鏁版嵁搴撴搷浣滃寘鍚�")
+    private String mapperPackage;
+
+    /**
+     * 鏁版嵁搴搙ml鍖呭悕
+     */
+    @Column(nullable = false,columnDefinition = "鏁版嵁搴揦ML鍖呭悕")
+    private String mapperXmlPackage;
+
+    /**
+     * 鐣岄潰鐨勮矾寰�
+     */
+    @Column(nullable = false,columnDefinition = "鐣岄潰鐨勮矾寰�")
+    private String jsPackage;
+
+    /**
+     * 鍚庡彴鏈嶅姟鐨勫墠缂�
+     */
+    @Column(columnDefinition = "鍚庡彴鏈嶅姟鐨勫墠缂�")
+    private String backPath;
+
+    /**
+     * 鏈�鍚庣敓鎴愭椂闂�
+     */
+    @VciFieldType(VciFieldTypeEnum.VTDateTime)
+    @Column(columnDefinition = "鏈�鍚庣敓鎴愭椂闂�")
+    private Date lastProductDate;
+
+    /**
+     * 鏂囦欢鐨勫瓧绗﹂泦缂栫爜锛岄粯璁TF-8
+     */
+    @Column(columnDefinition = "鏂囦欢鐨勫瓧绗﹂泦缂栫爜")
+    private String fileEncode ;
+
+    /**
+     * 浣跨敤甯冨眬鍖哄煙
+     */
+    @Column(columnDefinition = "浣跨敤鐨勫竷灞�鍖哄煙")
+    private String useLayoutRegion;
+
+    /**
+     * 瑗垮尯鍩熺殑闈㈡澘绫诲瀷
+     */
+    @VciUseEnum(value = EnumIdConstant.OS_CODE_GEN_PANEL_TYPE,showTextField = "westLayoutPanelTypeText")
+    @Column(columnDefinition = "瑗垮尯鍩熺殑闈㈡澘绫诲瀷")
+    private String westLayoutPanelType;
+
+    /**
+     * 瑗垮尯鍩熺殑闈㈡澘绫诲瀷鏄剧ず鏂囨湰
+     */
+    @Transient(referColumn = "codeGenPanelType_westLayoutPanelType")
+    private String westLayoutPanelTypeText;
+
+
+    /**
+     * 瑗垮尯鏌ヨ鐨勯厤缃�
+     */
+    @Column(length = 4000,columnDefinition = "瑗垮尯鏌ヨ鐨勯厤缃�")
+    private String westQueryConfig;
+
+    /**
+     * 瑗垮尯鐐瑰嚮鍚庝笅涓�涓尯鍩熺殑
+     */
+    @Column(length = 4000,columnDefinition = "瑗垮尯鐐瑰嚮鍚庝笅涓�涓尯鍩熺殑鍙傛暟")
+    private String westNextRegionParam;
+
+    /**
+     * 瑗垮尯鎸夐挳
+     */
+    @Column(length = 4000,columnDefinition = "瑗垮尯鎸夐挳")
+    private String westButtons;
+
+    /**
+     * 涓績鍖哄煙鐨勯潰鏉跨被鍨�
+     */
+    @VciUseEnum(value = EnumIdConstant.OS_CODE_GEN_PANEL_TYPE,showTextField = "westLayoutPanelTypeText")
+    @Column(columnDefinition = "涓績鍖哄煙鐨勯潰鏉跨被鍨�")
+    private String centerLayoutPanelType;
+
+    /**
+     * 涓績鍖哄煙鐨勯潰鏉跨被鍨嬫樉绀烘枃鏈�
+     */
+    @Transient(referColumn = "codeGenPanelType_centerLayoutPanelType" )
+    private String centerLayoutPanelTypeText;
+
+    /**
+     * 涓績鍖烘煡璇㈢殑閰嶇疆
+     */
+    @Column(length = 4000,columnDefinition = "涓績鍖烘煡璇㈢殑閰嶇疆")
+    private String centerQueryConfig;
+
+    /**
+     * 涓績鍖虹偣鍑诲悗涓嬩竴涓尯鍩熺殑
+     */
+    @Column(length = 4000,columnDefinition = "涓績鍖虹偣鍑诲悗涓嬩竴涓尯鍩熺殑")
+    private String centerNextRegionParam;
+
+    /**
+     * 涓績鍖烘寜閽�
+     */
+    @Column(length = 4000,columnDefinition = "涓績鍖烘寜閽�")
+    private String centerButtons;
+
+    /**
+     * 鍗楀尯鍩熺殑闈㈡澘绫诲瀷
+     */
+    @VciUseEnum(value = EnumIdConstant.OS_CODE_GEN_PANEL_TYPE,showTextField = "westLayoutPanelTypeText")
+    @Column(columnDefinition = "鍗楀尯鍩熺殑闈㈡澘绫诲瀷")
+    private String southLayoutPanelType;
+
+    /**
+     * 鍗楀尯鍩熺殑闈㈡澘绫诲瀷鏄剧ず鏂囨湰
+     */
+    @Transient(referColumn = "codeGenPanelType_southLayoutPanelType")
+    private String southLayoutPanelTypeText;
+
+    /**
+     * 鍗楀尯鏌ヨ鐨勯厤缃�
+     */
+    @Column(length = 4000,columnDefinition = "鍗楀尯鏌ヨ鐨勯厤缃�")
+    private String southQueryConfig;
+
+    /**
+     * 鍗楀尯鎸夐挳
+     */
+    @Column(length = 4000,columnDefinition = "鍗楀尯鎸夐挳")
+    private String southButtons;
+
+    public String getPkBtmType() {
+        return pkBtmType;
+    }
+
+    public void setPkBtmType(String pkBtmType) {
+        this.pkBtmType = pkBtmType;
+    }
+
+    @Override
+    public String getId() {
+        return id;
+    }
+
+    @Override
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    @Override
+    public String getDescription() {
+        return description;
+    }
+
+    @Override
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getAuthor() {
+        return author;
+    }
+
+    public void setAuthor(String author) {
+        this.author = author;
+    }
+
+    public String getDoPackage() {
+        return doPackage;
+    }
+
+    public void setDoPackage(String doPackage) {
+        this.doPackage = doPackage;
+    }
+
+    public String getVoPackage() {
+        return voPackage;
+    }
+
+    public void setVoPackage(String voPackage) {
+        this.voPackage = voPackage;
+    }
+
+    public String getDtoPackage() {
+        return dtoPackage;
+    }
+
+    public void setDtoPackage(String dtoPackage) {
+        this.dtoPackage = dtoPackage;
+    }
+
+    public String getControllerPackage() {
+        return controllerPackage;
+    }
+
+    public void setControllerPackage(String controllerPackage) {
+        this.controllerPackage = controllerPackage;
+    }
+
+    public String getServicePackage() {
+        return servicePackage;
+    }
+
+    public void setServicePackage(String servicePackage) {
+        this.servicePackage = servicePackage;
+    }
+
+    public String getMapperPackage() {
+        return mapperPackage;
+    }
+
+    public void setMapperPackage(String mapperPackage) {
+        this.mapperPackage = mapperPackage;
+    }
+
+    public String getMapperXmlPackage() {
+        return mapperXmlPackage;
+    }
+
+    public void setMapperXmlPackage(String mapperXmlPackage) {
+        this.mapperXmlPackage = mapperXmlPackage;
+    }
+
+    public String getJsPackage() {
+        return jsPackage;
+    }
+
+    public void setJsPackage(String jsPackage) {
+        this.jsPackage = jsPackage;
+    }
+
+    public Date getLastProductDate() {
+        return lastProductDate;
+    }
+
+    public void setLastProductDate(Date lastProductDate) {
+        this.lastProductDate = lastProductDate;
+    }
+
+    public String getGenDOFlag() {
+        return genDOFlag;
+    }
+
+    public void setGenDOFlag(String genDOFlag) {
+        this.genDOFlag = genDOFlag;
+    }
+
+    public String getGenVOFlag() {
+        return genVOFlag;
+    }
+
+    public void setGenVOFlag(String genVOFlag) {
+        this.genVOFlag = genVOFlag;
+    }
+
+    public String getGenDTOFlag() {
+        return genDTOFlag;
+    }
+
+    public void setGenDTOFlag(String genDTOFlag) {
+        this.genDTOFlag = genDTOFlag;
+    }
+
+    public String getFileEncode() {
+        return fileEncode;
+    }
+
+    public void setFileEncode(String fileEncode) {
+        this.fileEncode = fileEncode;
+    }
+
+    public String getControllerRequestMap() {
+        return controllerRequestMap;
+    }
+
+    public void setControllerRequestMap(String controllerRequestMap) {
+        this.controllerRequestMap = controllerRequestMap;
+    }
+
+    public String getBackPath() {
+        return backPath;
+    }
+
+    public void setBackPath(String backPath) {
+        this.backPath = backPath;
+    }
+
+    public String getUseLayoutRegion() {
+        return useLayoutRegion;
+    }
+
+    public void setUseLayoutRegion(String useLayoutRegion) {
+        this.useLayoutRegion = useLayoutRegion;
+    }
+
+    public String getWestLayoutPanelType() {
+        return westLayoutPanelType;
+    }
+
+    public void setWestLayoutPanelType(String westLayoutPanelType) {
+        this.westLayoutPanelType = westLayoutPanelType;
+    }
+
+    public String getWestLayoutPanelTypeText() {
+        return westLayoutPanelTypeText;
+    }
+
+    public void setWestLayoutPanelTypeText(String westLayoutPanelTypeText) {
+        this.westLayoutPanelTypeText = westLayoutPanelTypeText;
+    }
+
+    public String getWestQueryConfig() {
+        return westQueryConfig;
+    }
+
+    public void setWestQueryConfig(String westQueryConfig) {
+        this.westQueryConfig = westQueryConfig;
+    }
+
+    public String getWestNextRegionParam() {
+        return westNextRegionParam;
+    }
+
+    public void setWestNextRegionParam(String westNextRegionParam) {
+        this.westNextRegionParam = westNextRegionParam;
+    }
+
+    public String getWestButtons() {
+        return westButtons;
+    }
+
+    public void setWestButtons(String westButtons) {
+        this.westButtons = westButtons;
+    }
+
+    public String getCenterLayoutPanelType() {
+        return centerLayoutPanelType;
+    }
+
+    public void setCenterLayoutPanelType(String centerLayoutPanelType) {
+        this.centerLayoutPanelType = centerLayoutPanelType;
+    }
+
+    public String getCenterLayoutPanelTypeText() {
+        return centerLayoutPanelTypeText;
+    }
+
+    public void setCenterLayoutPanelTypeText(String centerLayoutPanelTypeText) {
+        this.centerLayoutPanelTypeText = centerLayoutPanelTypeText;
+    }
+
+    public String getCenterQueryConfig() {
+        return centerQueryConfig;
+    }
+
+    public void setCenterQueryConfig(String centerQueryConfig) {
+        this.centerQueryConfig = centerQueryConfig;
+    }
+
+    public String getCenterNextRegionParam() {
+        return centerNextRegionParam;
+    }
+
+    public void setCenterNextRegionParam(String centerNextRegionParam) {
+        this.centerNextRegionParam = centerNextRegionParam;
+    }
+
+    public String getCenterButtons() {
+        return centerButtons;
+    }
+
+    public void setCenterButtons(String centerButtons) {
+        this.centerButtons = centerButtons;
+    }
+
+    public String getSouthLayoutPanelType() {
+        return southLayoutPanelType;
+    }
+
+    public void setSouthLayoutPanelType(String southLayoutPanelType) {
+        this.southLayoutPanelType = southLayoutPanelType;
+    }
+
+    public String getSouthLayoutPanelTypeText() {
+        return southLayoutPanelTypeText;
+    }
+
+    public void setSouthLayoutPanelTypeText(String southLayoutPanelTypeText) {
+        this.southLayoutPanelTypeText = southLayoutPanelTypeText;
+    }
+
+    public String getSouthQueryConfig() {
+        return southQueryConfig;
+    }
+
+    public void setSouthQueryConfig(String southQueryConfig) {
+        this.southQueryConfig = southQueryConfig;
+    }
+
+    public String getSouthButtons() {
+        return southButtons;
+    }
+
+    public void setSouthButtons(String southButtons) {
+        this.southButtons = southButtons;
+    }
+
+    public String getClassName() {
+        return className;
+    }
+
+    public void setClassName(String className) {
+        this.className = className;
+    }
+
+    @Override
+    public String toString() {
+        return "OsCodeGenSchemaDO{" +
+                "pkBtmType='" + pkBtmType + '\'' +
+                ", id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", className='" + className + '\'' +
+                ", description='" + description + '\'' +
+                ", author='" + author + '\'' +
+                ", doPackage='" + doPackage + '\'' +
+                ", genDOFlag='" + genDOFlag + '\'' +
+                ", voPackage='" + voPackage + '\'' +
+                ", genVOFlag='" + genVOFlag + '\'' +
+                ", dtoPackage='" + dtoPackage + '\'' +
+                ", genDTOFlag='" + genDTOFlag + '\'' +
+                ", controllerPackage='" + controllerPackage + '\'' +
+                ", controllerRequestMap='" + controllerRequestMap + '\'' +
+                ", servicePackage='" + servicePackage + '\'' +
+                ", mapperPackage='" + mapperPackage + '\'' +
+                ", mapperXmlPackage='" + mapperXmlPackage + '\'' +
+                ", jsPackage='" + jsPackage + '\'' +
+                ", backPath='" + backPath + '\'' +
+                ", lastProductDate=" + lastProductDate +
+                ", fileEncode='" + fileEncode + '\'' +
+                ", useLayoutRegion='" + useLayoutRegion + '\'' +
+                ", westLayoutPanelType='" + westLayoutPanelType + '\'' +
+                ", westLayoutPanelTypeText='" + westLayoutPanelTypeText + '\'' +
+                ", westQueryConfig='" + westQueryConfig + '\'' +
+                ", westNextRegionParam='" + westNextRegionParam + '\'' +
+                ", westButtons='" + westButtons + '\'' +
+                ", centerLayoutPanelType='" + centerLayoutPanelType + '\'' +
+                ", centerLayoutPanelTypeText='" + centerLayoutPanelTypeText + '\'' +
+                ", centerQueryConfig='" + centerQueryConfig + '\'' +
+                ", centerNextRegionParam='" + centerNextRegionParam + '\'' +
+                ", centerButtons='" + centerButtons + '\'' +
+                ", southLayoutPanelType='" + southLayoutPanelType + '\'' +
+                ", southLayoutPanelTypeText='" + southLayoutPanelTypeText + '\'' +
+                ", southQueryConfig='" + southQueryConfig + '\'' +
+                ", southButtons='" + southButtons + '\'' +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/OsCodeRuleDO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/OsCodeRuleDO.java
new file mode 100644
index 0000000..2401980
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/OsCodeRuleDO.java
@@ -0,0 +1,188 @@
+package com.vci.web.model;
+
+
+import com.vci.starter.web.annotation.Column;
+import com.vci.starter.web.annotation.VciBtmType;
+import com.vci.starter.web.annotation.VciFieldType;
+import com.vci.starter.web.annotation.VciUseEnum;
+import com.vci.starter.web.constant.FrameWorkLcStatusConstant;
+import com.vci.starter.web.enumpck.VciFieldTypeEnum;
+import com.vci.starter.web.model.BaseModel;
+import com.vci.web.constant.BtmIdConstant;
+import com.vci.web.constant.EnumIdConstant;
+
+/**
+ * 涓氬姟琛ㄥ崟缂栫爜瑙勫垯
+ * @author weidy
+ * @date 2019/10/11 4:08 PM
+ */
+@VciBtmType(name= BtmIdConstant.OS_CODE_RULE_BTM_TYPE,text = "缂栫爜瑙勫垯",lifeCycle = FrameWorkLcStatusConstant.EMTYPE_LIFE_CYCLE)
+public class OsCodeRuleDO extends BaseModel {
+
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = 5791977138538706880L;
+    /**
+     * 瑙勫垯缂栧彿
+     */
+    @Column(nullable = false,length = 50,unique = true,columnDefinition = "瑙勫垯缂栧彿")
+    private String id;
+
+    /**
+     * 瑙勫垯鍚嶇О
+     */
+    @Column(nullable = false,length = 200,columnDefinition = "瑙勫垯鍚嶇О")
+    private String name;
+
+    /**
+     * 鎬婚暱搴�
+     */
+    @Column(nullable = false,columnDefinition = "鎬婚暱搴�")
+    private Integer totalLength;
+
+    /**
+     * 缂栫爜鐢熸垚褰㈠紡
+     */
+    @Column(nullable = false,columnDefinition = "缂栫爜鐢熸垚褰㈠紡")
+    @VciUseEnum(value = EnumIdConstant.CODE_PRODUCT_TYPE,showTextField = "codeProductTypeText")
+    private String codeProductType;
+
+    /**
+     * 缂栫爜鐢熸垚鏂瑰紡鏄剧ず鏂囨湰
+     */
+    @Column(columnDefinition = "缂栫爜鐢熸垚鏂瑰紡鏄剧ず鏂囨湰")
+    private String codeProductTypeText;
+
+    /**
+     * 缂栫爜鏄惁鍙互缂栬緫
+     */
+    @Column(nullable = false,columnDefinition = "缂栫爜鏄惁鍙互缂栬緫")
+    @VciFieldType(VciFieldTypeEnum.VTBoolean)
+    private String codeEditFlag;
+
+    /**
+     * 鏄惁鏂爜琛ョ爜
+     */
+    @Column(nullable = false,columnDefinition = "鏄惁鏂爜琛ョ爜")
+    @VciFieldType(VciFieldTypeEnum.VTBoolean)
+    private String breakReUseFlag;
+
+    /**
+     * 鎵�灞炰笟鍔$被鍨�
+     */
+    @Column(nullable = false,columnDefinition = "鎵�灞炰笟鍔$被鍨�")
+    private String btmTypeId;
+
+    /**
+     * 鎵�灞炰笟鍔$被鍨嬪悕绉�
+     */
+    @Column(columnDefinition = "鎵�灞炰笟鍔$被鍨嬪悕绉�")
+    private String btmTypeName;
+
+    /**
+     * 浣跨敤瑙勫垯鏍囪锛屽鍦ㄦ煇涓笟鍔$被鍨嬩笅鐨勫涓満鏅娇鐢�
+     */
+    @Column(columnDefinition = "浣跨敤瑙勫垯鏍囪")
+    private String useRuleFlag;
+
+    @Override
+    public String getId() {
+        return id;
+    }
+
+    @Override
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Integer getTotalLength() {
+        return totalLength;
+    }
+
+    public void setTotalLength(Integer totalLength) {
+        this.totalLength = totalLength;
+    }
+
+    public String getCodeProductType() {
+        return codeProductType;
+    }
+
+    public void setCodeProductType(String codeProductType) {
+        this.codeProductType = codeProductType;
+    }
+
+    public String getCodeProductTypeText() {
+        return codeProductTypeText;
+    }
+
+    public void setCodeProductTypeText(String codeProductTypeText) {
+        this.codeProductTypeText = codeProductTypeText;
+    }
+
+    public String getCodeEditFlag() {
+        return codeEditFlag;
+    }
+
+    public void setCodeEditFlag(String codeEditFlag) {
+        this.codeEditFlag = codeEditFlag;
+    }
+
+    public String getBreakReUseFlag() {
+        return breakReUseFlag;
+    }
+
+    public void setBreakReUseFlag(String breakReUseFlag) {
+        this.breakReUseFlag = breakReUseFlag;
+    }
+
+    public String getBtmTypeId() {
+        return btmTypeId;
+    }
+
+    public void setBtmTypeId(String btmTypeId) {
+        this.btmTypeId = btmTypeId;
+    }
+
+    public String getBtmTypeName() {
+        return btmTypeName;
+    }
+
+    public void setBtmTypeName(String btmTypeName) {
+        this.btmTypeName = btmTypeName;
+    }
+
+    public String getUseRuleFlag() {
+        return useRuleFlag;
+    }
+
+    public void setUseRuleFlag(String useRuleFlag) {
+        this.useRuleFlag = useRuleFlag;
+    }
+
+    @Override
+    public String toString() {
+        return "OsCodeRuleDO{" +
+                "id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", totalLength=" + totalLength +
+                ", codeProductType='" + codeProductType + '\'' +
+                ", codeProductTypeText='" + codeProductTypeText + '\'' +
+                ", codeEditFlag='" + codeEditFlag + '\'' +
+                ", breakReUseFlag='" + breakReUseFlag + '\'' +
+                ", btmTypeId='" + btmTypeId + '\'' +
+                ", btmTypeName='" + btmTypeName + '\'' +
+                ", useRuleFlag='" + useRuleFlag + '\'' +
+                "} " + super.toString();
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/OsCodeRuleElementDO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/OsCodeRuleElementDO.java
new file mode 100644
index 0000000..a19e25c
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/OsCodeRuleElementDO.java
@@ -0,0 +1,443 @@
+package com.vci.web.model;
+
+
+import com.vci.starter.web.annotation.*;
+import com.vci.starter.web.constant.FrameWorkLcStatusConstant;
+import com.vci.starter.web.enumpck.VciFieldTypeEnum;
+import com.vci.starter.web.model.BaseModel;
+import com.vci.web.constant.BtmIdConstant;
+import com.vci.web.constant.EnumIdConstant;
+
+/**
+ * 缂栫爜瑙勫垯鐨勫厓绱�
+ * @author weidy
+ * @date 2020/3/29
+ */
+@VciBtmType(name = BtmIdConstant.OS_CODE_RULE_ELEMENT_BTM_TYPE,text = "缂栫爜瑙勫垯鏄庣粏",description = "缂栫爜瑙勫垯鏄庣粏",lifeCycle = FrameWorkLcStatusConstant.EMTYPE_LIFE_CYCLE)
+public class OsCodeRuleElementDO extends BaseModel {
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = -4842064738920873469L;
+
+    /**
+     * 鎵�灞炶鍒�
+     */
+    @VciUseRefer(BtmIdConstant.OS_CODE_RULE_BTM_TYPE)
+    @Column(nullable = false,columnDefinition = "鎵�灞炶鍒�")
+    private String pkCodeRule;
+
+    /**
+     * 鎺掑簭鍙�
+     */
+    @Column(nullable = false,columnDefinition = "鎺掑簭鍙�")
+    private Integer ruleOrderNumber;
+
+    /**
+     * 缂栫爜瑙勫垯鐨勫厓绱犵被鍨�
+     */
+    @Column(nullable = false,columnDefinition = "缂栫爜瑙勫垯鐨勫厓绱犵被鍨�")
+    private String codeElementType;
+
+    /**
+     * 缂栫爜瑙勫垯鐨勫厓绱犵被鍨嬫樉绀烘枃鏈�
+     */
+    @Column(columnDefinition = "缂栫爜瑙勫垯鐨勫厓绱犵被鍨嬫樉绀烘枃鏈�")
+    private String codeElementTypeText;
+
+
+    /**
+     * 鍏冪礌鏄剧ず琛ㄨ揪寮�
+     */
+    @Column(nullable = false,length=2000,columnDefinition = "鍏冪礌鏄剧ず琛ㄨ揪寮�")
+    private String id;
+
+    /**
+     * 鍏冪礌涓枃鍚嶇О
+     */
+    @Column(nullable = false,length=200,columnDefinition = "鍏冪礌涓枃鍚嶇О")
+    private String name;
+
+    /**
+     * 鏈�澶ч暱搴�
+     */
+    @Column(columnDefinition = "鏈�澶ч暱搴�")
+    private Integer maxLength;
+
+    /**
+     * 鏈�灏忛暱搴�
+     */
+    @Column(nullable = false,columnDefinition = "鏈�灏忛暱搴�")
+    private Integer minLength;
+
+    /**
+     * 缂栫爜琛ヤ綅鏂瑰紡
+     */
+    @VciUseEnum(value = EnumIdConstant.CODE_FILL_TYPE,showTextField = "codeFillTypeText")
+    @Column(nullable = false,columnDefinition = "缂栫爜琛ヤ綅鏂瑰紡")
+    private String codeFillType;
+
+    /**
+     * 缂栫爜琛ヤ綅鏂瑰紡鏄剧ず鏂囨湰
+     */
+    @Column(columnDefinition = "缂栫爜琛ヤ綅鏂瑰紡鏄剧ず鏂囨湰")
+    private String codeFillTypeText;
+
+    /**
+     * 琛ヤ綅鏃剁殑瀛楃
+     */
+    @Column(columnDefinition = "琛ヤ綅鏃剁殑瀛楃")
+    private String codeFillSeparator;
+
+    /**
+     * 鎵嬪姩杈撳叆鏃剁殑鏍¢獙瑙勫垯
+     */
+    @Column(length=4000,columnDefinition = "鎵嬪姩杈撳叆鏃剁殑鏍¢獙瑙勫垯")
+    private String validateString;
+
+    /**
+     * 鏃ユ湡褰㈠紡鏃剁殑鏃堕棿鏍煎紡
+     */
+    @Column(columnDefinition = "鏃ユ湡褰㈠紡鏃剁殑鏃堕棿鏍煎紡")
+    private String codeDateFormat;
+
+    /**
+     * 鏃堕棿鍙栧�肩被鍨�
+     */
+    @VciUseEnum(value = EnumIdConstant.CODE_DATE_VALUE_TYPE,showTextField = "codeDateValueTypeText")
+    @Column(columnDefinition = "鏃堕棿鍙栧�肩被鍨�")
+    private String codeDateValueType;
+
+    /**
+     * 鏃堕棿鍙栧�肩被鍨嬬殑鍚嶇О
+     */
+    @Column(columnDefinition = "鏃堕棿鍙栧�肩被鍨嬬殑鍚嶇О")
+    private String codeDateValueTypeText;
+
+    /**
+     * 鏃堕棿鍙栧�间娇鐢ㄤ笟鍔$被鍨嬬殑灞炴�ey
+     */
+    @Column(columnDefinition = "鏃堕棿鍙栧�间娇鐢ㄤ笟鍔$被鍨嬬殑灞炴�ey")
+    private String codeDateUseField;
+
+    /**
+     * 鏃堕棿鍙栧�间娇鐢ㄤ笟鍔$被鍨嬬殑灞炴�у悕绉�
+     */
+    @Column(columnDefinition = "鏃堕棿鍙栧�间娇鐢ㄤ笟鍔$被鍨嬬殑灞炴�у悕绉�")
+    private String codeDateUseFieldName;
+
+    /**
+     * 浣跨敤涓氬姟绫诲瀷鐨勫睘鎬ц嫳鏂囧悕绉�
+     */
+    @Column(columnDefinition = "浣跨敤涓氬姟绫诲瀷鐨勫睘鎬ц嫳鏂囧悕绉�")
+    private String codeUseField;
+
+    /**
+     * 浣跨敤涓氬姟绫诲瀷鐨勫睘鎬т腑鏂囧悕绉�
+     */
+    @Column(columnDefinition = "浣跨敤涓氬姟绫诲瀷鐨勫睘鎬т腑鏂囧悕绉�")
+    private String codeUseFieldName;
+
+    /**
+     * 鍏紡琛ㄨ揪寮�
+     */
+    @Column(columnDefinition = "鍏紡琛ㄨ揪寮�")
+    private String codeExpression;
+
+    /**
+     * 鏄惁娴佹按鍙�
+     */
+    @VciFieldType(VciFieldTypeEnum.VTBoolean)
+    @Column(nullable = false,columnDefinition = "鏄惁娴佹按鍙�")
+    private String serialAccording;
+
+    /**
+     * 甯搁噺鐨勫��
+     */
+    @Column(columnDefinition = "甯搁噺鐨勫��")
+    private String staticCode;
+
+    /**
+     * 娴佹按鍙疯捣濮嬪��
+     */
+    @Column(columnDefinition = "娴佹按鍙疯捣濮嬪��")
+    private String serialStart;
+
+    /**
+     * 娴佹按鐨勬闀�
+     */
+    @Column(columnDefinition = "娴佹按鐨勬闀�")
+    private Integer serialStep;
+
+    /**
+     * 娴佹按浼樺厛绾�
+     */
+    @Column(columnDefinition = "娴佹按浼樺厛绾�")
+    private Integer serialPriority;
+
+    /**
+     * 鏋氫妇鐨勭紪鍙�
+     */
+    @Column(columnDefinition = "鏋氫妇鐨勭紪鍙�")
+    private String enumId;
+
+    /**
+     * 鏋氫妇鐨勫悕绉�
+     */
+    @Column(columnDefinition = "鏋氫妇鐨勫悕绉�")
+    private String enumName;
+
+    public String getPkCodeRule() {
+        return pkCodeRule;
+    }
+
+    public void setPkCodeRule(String pkCodeRule) {
+        this.pkCodeRule = pkCodeRule;
+    }
+
+    public Integer getRuleOrderNumber() {
+        return ruleOrderNumber;
+    }
+
+    public void setRuleOrderNumber(Integer ruleOrderNumber) {
+        this.ruleOrderNumber = ruleOrderNumber;
+    }
+
+    public String getCodeElementType() {
+        return codeElementType;
+    }
+
+    public void setCodeElementType(String codeElementType) {
+        this.codeElementType = codeElementType;
+    }
+
+    public String getCodeElementTypeText() {
+        return codeElementTypeText;
+    }
+
+    public void setCodeElementTypeText(String codeElementTypeText) {
+        this.codeElementTypeText = codeElementTypeText;
+    }
+
+    @Override
+    public String getId() {
+        return id;
+    }
+
+    @Override
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Integer getMaxLength() {
+        return maxLength;
+    }
+
+    public void setMaxLength(Integer maxLength) {
+        this.maxLength = maxLength;
+    }
+
+    public Integer getMinLength() {
+        return minLength;
+    }
+
+    public void setMinLength(Integer minLength) {
+        this.minLength = minLength;
+    }
+
+    public String getCodeFillType() {
+        return codeFillType;
+    }
+
+    public void setCodeFillType(String codeFillType) {
+        this.codeFillType = codeFillType;
+    }
+
+    public String getCodeFillTypeText() {
+        return codeFillTypeText;
+    }
+
+    public void setCodeFillTypeText(String codeFillTypeText) {
+        this.codeFillTypeText = codeFillTypeText;
+    }
+
+    public String getCodeFillSeparator() {
+        return codeFillSeparator;
+    }
+
+    public void setCodeFillSeparator(String codeFillSeparator) {
+        this.codeFillSeparator = codeFillSeparator;
+    }
+
+    public String getValidateString() {
+        return validateString;
+    }
+
+    public void setValidateString(String validateString) {
+        this.validateString = validateString;
+    }
+
+    public String getCodeDateFormat() {
+        return codeDateFormat;
+    }
+
+    public void setCodeDateFormat(String codeDateFormat) {
+        this.codeDateFormat = codeDateFormat;
+    }
+
+    public String getCodeDateValueType() {
+        return codeDateValueType;
+    }
+
+    public void setCodeDateValueType(String codeDateValueType) {
+        this.codeDateValueType = codeDateValueType;
+    }
+
+    public String getCodeDateValueTypeText() {
+        return codeDateValueTypeText;
+    }
+
+    public void setCodeDateValueTypeText(String codeDateValueTypeText) {
+        this.codeDateValueTypeText = codeDateValueTypeText;
+    }
+
+    public String getCodeDateUseField() {
+        return codeDateUseField;
+    }
+
+    public void setCodeDateUseField(String codeDateUseField) {
+        this.codeDateUseField = codeDateUseField;
+    }
+
+    public String getCodeDateUseFieldName() {
+        return codeDateUseFieldName;
+    }
+
+    public void setCodeDateUseFieldName(String codeDateUseFieldName) {
+        this.codeDateUseFieldName = codeDateUseFieldName;
+    }
+
+    public String getCodeUseField() {
+        return codeUseField;
+    }
+
+    public void setCodeUseField(String codeUseField) {
+        this.codeUseField = codeUseField;
+    }
+
+    public String getCodeUseFieldName() {
+        return codeUseFieldName;
+    }
+
+    public void setCodeUseFieldName(String codeUseFieldName) {
+        this.codeUseFieldName = codeUseFieldName;
+    }
+
+
+    public String getCodeExpression() {
+        return codeExpression;
+    }
+
+    public void setCodeExpression(String codeExpression) {
+        this.codeExpression = codeExpression;
+    }
+
+    public String getSerialAccording() {
+        return serialAccording;
+    }
+
+    public void setSerialAccording(String serialAccording) {
+        this.serialAccording = serialAccording;
+    }
+
+    public String getStaticCode() {
+        return staticCode;
+    }
+
+    public void setStaticCode(String staticCode) {
+        this.staticCode = staticCode;
+    }
+
+    public String getSerialStart() {
+        return serialStart;
+    }
+
+    public void setSerialStart(String serialStart) {
+        this.serialStart = serialStart;
+    }
+
+    public Integer getSerialStep() {
+        return serialStep;
+    }
+
+    public void setSerialStep(Integer serialStep) {
+        this.serialStep = serialStep;
+    }
+
+    public Integer getSerialPriority() {
+        return serialPriority;
+    }
+
+    public void setSerialPriority(Integer serialPriority) {
+        this.serialPriority = serialPriority;
+    }
+
+    public String getEnumId() {
+        return enumId;
+    }
+
+    public void setEnumId(String enumId) {
+        this.enumId = enumId;
+    }
+
+    public String getEnumName() {
+        return enumName;
+    }
+
+    public void setEnumName(String enumName) {
+        this.enumName = enumName;
+    }
+
+    @Override
+    public String toString() {
+        return "OsCodeRuleElementDO{" +
+                "pkCodeRule='" + pkCodeRule + '\'' +
+                ", ruleOrderNumber=" + ruleOrderNumber +
+                ", codeElementType='" + codeElementType + '\'' +
+                ", codeElementTypeText='" + codeElementTypeText + '\'' +
+                ", id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", maxLength=" + maxLength +
+                ", minLength=" + minLength +
+                ", codeFillType='" + codeFillType + '\'' +
+                ", codeFillTypeText='" + codeFillTypeText + '\'' +
+                ", codeFillSeparator='" + codeFillSeparator + '\'' +
+                ", validateString='" + validateString + '\'' +
+                ", codeDateFormat='" + codeDateFormat + '\'' +
+                ", codeDateValueType='" + codeDateValueType + '\'' +
+                ", codeDateValueTypeText='" + codeDateValueTypeText + '\'' +
+                ", codeDateUseField='" + codeDateUseField + '\'' +
+                ", codeDateUseFieldName='" + codeDateUseFieldName + '\'' +
+                ", codeUseField='" + codeUseField + '\'' +
+                ", codeUseFieldName='" + codeUseFieldName + '\'' +
+                ", codeExpression='" + codeExpression + '\'' +
+                ", serialAccording='" + serialAccording + '\'' +
+                ", staticCode='" + staticCode + '\'' +
+                ", serialStart='" + serialStart + '\'' +
+                ", serialStep=" + serialStep +
+                ", serialPriority=" + serialPriority +
+                ", enumId='" + enumId + '\'' +
+                ", enumName='" + enumName + '\'' +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/OsCodeSerialNumberDO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/OsCodeSerialNumberDO.java
new file mode 100644
index 0000000..ca58c78
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/OsCodeSerialNumberDO.java
@@ -0,0 +1,75 @@
+package com.vci.web.model;
+
+
+import com.vci.starter.web.annotation.Column;
+import com.vci.starter.web.annotation.VciBtmType;
+import com.vci.starter.web.annotation.VciUseRefer;
+import com.vci.starter.web.constant.FrameWorkLcStatusConstant;
+import com.vci.starter.web.model.BaseModel;
+import com.vci.web.constant.BtmIdConstant;
+
+/**
+ * 缂栫爜娴佹按鍙风鐞�
+ * @author weidy
+ * @date 2020/3/29
+ */
+@VciBtmType(name = BtmIdConstant.OS_CODE_SERIAL_NUMBER_BTM_TYPE,text = "缂栫爜娴佹按鍙�",description = "姣忎釜瑙勫垯鐨勬瘡涓�涓祦姘翠緷鎹殑鐩墠娴佹按鍙�",lifeCycle = FrameWorkLcStatusConstant.EMTYPE_LIFE_CYCLE)
+public class OsCodeSerialNumberDO extends BaseModel {
+
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = 3745693368358482214L;
+
+    /**
+     * 鎵�灞炶鍒�
+     */
+    @VciUseRefer(BtmIdConstant.OS_CODE_RULE_BTM_TYPE)
+    @Column(nullable = false,columnDefinition = "鎵�灞炶鍒�")
+    private String pkCodeRule;
+
+    /**
+     * 娴佹按鍙锋爣璇�
+     */
+    @Column(nullable = false,length = 4000,columnDefinition = "娴佹按鍙锋爣璇�")
+    private String serialUnit;
+
+    /**
+     * 鏈�澶ф祦姘村彿
+     */
+    @Column(nullable = false,range = ">0",columnDefinition = "鏈�澶ф祦姘村彿")
+    private Integer maxSerial;
+
+    public String getPkCodeRule() {
+        return pkCodeRule;
+    }
+
+    public void setPkCodeRule(String pkCodeRule) {
+        this.pkCodeRule = pkCodeRule;
+    }
+
+    public String getSerialUnit() {
+        return serialUnit;
+    }
+
+    public void setSerialUnit(String serialUnit) {
+        this.serialUnit = serialUnit;
+    }
+
+    public Integer getMaxSerial() {
+        return maxSerial;
+    }
+
+    public void setMaxSerial(Integer maxSerial) {
+        this.maxSerial = maxSerial;
+    }
+
+    @Override
+    public String toString() {
+        return "OsCodeSerialNumberDO{" +
+                "pkCodeRule='" + pkCodeRule + '\'' +
+                ", serialUnit='" + serialUnit + '\'' +
+                ", maxSerial=" + maxSerial +
+                "} " + super.toString();
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/OsLifeCycleDO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/OsLifeCycleDO.java
new file mode 100644
index 0000000..49a83d5
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/OsLifeCycleDO.java
@@ -0,0 +1,172 @@
+package com.vci.web.model;
+
+import com.vci.starter.web.annotation.*;
+import com.vci.starter.web.constant.FrameWorkLcStatusConstant;
+
+import java.util.Date;
+
+/**
+ * 鐢熷懡鍛ㄦ湡
+ * @author weidy
+ * @date 2022-2-15
+ */
+@VciBtmType(name="lifecycle",text = "鐢熷懡鍛ㄦ湡",tableName = "PLLIFECYCLE",lifeCycle = FrameWorkLcStatusConstant.EMTYPE_LIFE_CYCLE)
+@Transient
+public class OsLifeCycleDO implements java.io.Serializable{
+
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = 3611845299140652023L;
+    /**
+     * 涓婚敭
+     */
+    @Id
+    private String oid;
+
+    /**
+     * 鑻辨枃鍚嶇О
+     */
+    @Column(name = "name")
+    private String id;
+
+    /**
+     * 涓枃鍚嶇О
+     */
+    @Column(name = "label")
+    private String name;
+
+    /**
+     * 鎻忚堪
+     */
+    private String description;
+
+    /**
+     * 鏃堕棿鎴�
+     */
+    private Date ts;
+
+    /**
+     * 鍒涘缓浜�
+     */
+    private String creator;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    private Date createTime;
+
+    /**
+     * 鏈�鍚庝慨鏀逛汉
+     */
+    @Column(name = "modifier")
+    private String lastModifier;
+
+    /**
+     * 鏈�鍚庝慨鏀规椂闂�
+     */
+    @Column(name = "modifytime")
+    private Date lastModifyTime;
+
+    /**
+     * 鍐呭
+     */
+    @XmlType
+    private String content;
+
+    public String getOid() {
+        return oid;
+    }
+
+    public void setOid(String oid) {
+        this.oid = oid;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public Date getTs() {
+        return ts;
+    }
+
+    public void setTs(Date ts) {
+        this.ts = ts;
+    }
+
+    public String getCreator() {
+        return creator;
+    }
+
+    public void setCreator(String creator) {
+        this.creator = creator;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getLastModifier() {
+        return lastModifier;
+    }
+
+    public void setLastModifier(String lastModifier) {
+        this.lastModifier = lastModifier;
+    }
+
+    public Date getLastModifyTime() {
+        return lastModifyTime;
+    }
+
+    public void setLastModifyTime(Date lastModifyTime) {
+        this.lastModifyTime = lastModifyTime;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    @Override
+    public String toString() {
+        return "OsLifeCycleDO{" +
+                "oid='" + oid + '\'' +
+                ", id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", description='" + description + '\'' +
+                ", ts=" + ts +
+                ", creator='" + creator + '\'' +
+                ", createTime=" + createTime +
+                ", lastModifier='" + lastModifier + '\'' +
+                ", lastModifyTime=" + lastModifyTime +
+                ", content='" + content + '\'' +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/OsLinkTypeDO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/OsLinkTypeDO.java
new file mode 100644
index 0000000..6dce040
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/OsLinkTypeDO.java
@@ -0,0 +1,172 @@
+package com.vci.web.model;
+
+import com.vci.starter.web.annotation.*;
+import com.vci.starter.web.constant.FrameWorkLcStatusConstant;
+
+import java.util.Date;
+
+/**
+ * 閾炬帴绫诲瀷
+ * @author weidy
+ * @date 2022-3-26
+ */
+@VciBtmType(name="linktype",text = "閾炬帴绫诲瀷",tableName = "PLlinktype",lifeCycle = FrameWorkLcStatusConstant.EMTYPE_LIFE_CYCLE)
+@Transient
+public class OsLinkTypeDO implements java.io.Serializable{
+
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = -5752043937706544919L;
+    /**
+     * 涓婚敭
+     */
+    @Id
+    private String oid;
+
+    /**
+     * 鑻辨枃鍚嶇О
+     */
+    @Column(name = "name")
+    private String id;
+
+    /**
+     * 涓枃鍚嶇О
+     */
+    @Column(name = "label")
+    private String name;
+
+    /**
+     * 鎻忚堪
+     */
+    private String description;
+
+    /**
+     * 鏃堕棿鎴�
+     */
+    private Date ts;
+
+    /**
+     * 鍒涘缓浜�
+     */
+    private String creator;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    private Date createTime;
+
+    /**
+     * 鏈�鍚庝慨鏀逛汉
+     */
+    @Column(name = "modifier")
+    private String lastModifier;
+
+    /**
+     * 鏈�鍚庝慨鏀规椂闂�
+     */
+    @Column(name = "modifytime")
+    private Date lastModifyTime;
+
+    /**
+     * 鍐呭
+     */
+    @XmlType
+    private String content;
+
+    public String getOid() {
+        return oid;
+    }
+
+    public void setOid(String oid) {
+        this.oid = oid;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public Date getTs() {
+        return ts;
+    }
+
+    public void setTs(Date ts) {
+        this.ts = ts;
+    }
+
+    public String getCreator() {
+        return creator;
+    }
+
+    public void setCreator(String creator) {
+        this.creator = creator;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getLastModifier() {
+        return lastModifier;
+    }
+
+    public void setLastModifier(String lastModifier) {
+        this.lastModifier = lastModifier;
+    }
+
+    public Date getLastModifyTime() {
+        return lastModifyTime;
+    }
+
+    public void setLastModifyTime(Date lastModifyTime) {
+        this.lastModifyTime = lastModifyTime;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    @Override
+    public String toString() {
+        return "OsLinkTypeDO{" +
+                "oid='" + oid + '\'' +
+                ", id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", description='" + description + '\'' +
+                ", ts=" + ts +
+                ", creator='" + creator + '\'' +
+                ", createTime=" + createTime +
+                ", lastModifier='" + lastModifier + '\'' +
+                ", lastModifyTime=" + lastModifyTime +
+                ", content='" + content + '\'' +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/OsStatusDO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/OsStatusDO.java
new file mode 100644
index 0000000..bd25fa0
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/OsStatusDO.java
@@ -0,0 +1,173 @@
+package com.vci.web.model;
+
+
+import com.vci.starter.web.annotation.*;
+import com.vci.starter.web.constant.FrameWorkLcStatusConstant;
+
+import java.util.Date;
+
+/**
+ * 鐘舵�佹睜
+ * @author weidy
+ * @date 2022-2-15
+ */
+@VciBtmType(name = "status",text = "鐘舵�佹睜",tableName = "PLSTATEPOOL",lifeCycle = FrameWorkLcStatusConstant.EMTYPE_LIFE_CYCLE)
+@Transient
+public class OsStatusDO implements java.io.Serializable {
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = 1994603426596105785L;
+
+    /**
+     * 涓婚敭
+     */
+    @Id
+    private String oid;
+
+    /**
+     * 鑻辨枃鍚嶇О
+     */
+    @Column(name = "name")
+    private String id;
+
+    /**
+     * 涓枃鍚嶇О
+     */
+    @Column(name = "label")
+    private String name;
+
+    /**
+     * 鎻忚堪
+     */
+    private String description;
+
+    /**
+     * 鏃堕棿鎴�
+     */
+    private Date ts;
+
+    /**
+     * 鍒涘缓浜�
+     */
+    private String creator;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    private Date createTime;
+
+    /**
+     * 鏈�鍚庝慨鏀逛汉
+     */
+    @Column(name = "modifier")
+    private String lastModifier;
+
+    /**
+     * 鏈�鍚庝慨鏀规椂闂�
+     */
+    @Column(name = "modifytime")
+    private Date lastModifyTime;
+
+    /**
+     * 鍐呭
+     */
+    @XmlType
+    private String content;
+
+    public String getOid() {
+        return oid;
+    }
+
+    public void setOid(String oid) {
+        this.oid = oid;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public Date getTs() {
+        return ts;
+    }
+
+    public void setTs(Date ts) {
+        this.ts = ts;
+    }
+
+    public String getCreator() {
+        return creator;
+    }
+
+    public void setCreator(String creator) {
+        this.creator = creator;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getLastModifier() {
+        return lastModifier;
+    }
+
+    public void setLastModifier(String lastModifier) {
+        this.lastModifier = lastModifier;
+    }
+
+    public Date getLastModifyTime() {
+        return lastModifyTime;
+    }
+
+    public void setLastModifyTime(Date lastModifyTime) {
+        this.lastModifyTime = lastModifyTime;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    @Override
+    public String toString() {
+        return "OsStatusDO{" +
+                "oid='" + oid + '\'' +
+                ", id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", description='" + description + '\'' +
+                ", ts=" + ts +
+                ", creator='" + creator + '\'' +
+                ", createTime=" + createTime +
+                ", lastModifier='" + lastModifier + '\'' +
+                ", lastModifyTime=" + lastModifyTime +
+                ", content='" + content + '\'' +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/ProcessInstance.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/ProcessInstance.java
new file mode 100644
index 0000000..aa7bb2f
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/ProcessInstance.java
@@ -0,0 +1,56 @@
+package com.vci.web.model;
+
+import com.vci.starter.web.annotation.Transient;
+import com.vci.starter.web.annotation.VciBtmType;
+import com.vci.starter.web.constant.FrameWorkLcStatusConstant;
+import com.vci.starter.web.model.BaseModel;
+
+/**
+ * 娴佺▼瀹炰緥鐨勬樉绀哄璞�
+ * @author weidy
+ * @date 2021-2-12
+ */
+@VciBtmType(name="WORKFLOWINSTANCE",text = "娴佺▼瀹炰緥",lifeCycle = FrameWorkLcStatusConstant.EMTYPE_LIFE_CYCLE)
+@Transient
+public class ProcessInstance extends BaseModel {
+
+
+	/**
+	 * 搴忓垪鍖�
+	 */
+	private static final long serialVersionUID = -1774737268073518164L;
+	
+	/**
+	 * 娴佺▼鐨勬墽琛孖D
+	 */
+	private String executionId;
+	
+	/**
+	 * 鍓嶇椤甸潰灞曠ずurl
+	 */
+	private String dataDetailDisplayUrl;
+
+	public String getExecutionId() {
+		return executionId;
+	}
+
+	public void setExecutionId(String executionId) {
+		this.executionId = executionId;
+	}
+
+	public String getDataDetailDisplayUrl() {
+		return dataDetailDisplayUrl;
+	}
+
+	public void setDataDetailDisplayUrl(String dataDetailDisplayUrl) {
+		this.dataDetailDisplayUrl = dataDetailDisplayUrl;
+	}
+
+	@Override
+	public String toString() {
+		return "ProcessInstanceVO{" +
+				"executionId='" + executionId + '\'' +
+				", dataDetailDisplayUrl='" + dataDetailDisplayUrl + '\'' +
+				'}';
+	}
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/ProcessTask.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/ProcessTask.java
new file mode 100644
index 0000000..725eeb4
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/ProcessTask.java
@@ -0,0 +1,211 @@
+package com.vci.web.model;
+
+import com.vci.starter.web.annotation.Transient;
+import com.vci.starter.web.annotation.VciBtmType;
+import com.vci.starter.web.constant.FrameWorkLcStatusConstant;
+import com.vci.starter.web.model.BaseModel;
+
+import java.util.Date;
+
+/**
+ * 娴佺▼浠诲姟
+ * @author weidy
+ * @date 2021-2-12
+ */
+@VciBtmType(name="workitem",text = "娴佺▼浠诲姟",lifeCycle = FrameWorkLcStatusConstant.EMTYPE_LIFE_CYCLE)
+@Transient
+public class ProcessTask extends BaseModel {
+
+
+	/**
+	 * 搴忓垪鍖�
+	 */
+	private static final long serialVersionUID = 1388614597393325112L;
+	/**
+	 * 璐熻矗浜�
+	 */
+	private String principal;
+
+	/**
+	 * 浠诲姟鐨勭被鍨�
+	 */
+	private int workType;
+
+	/**
+	 * 娴佺▼绫诲瀷
+	 */
+	private String processType;
+
+	/**
+	 * 娴佺▼瀹炰緥鍚嶇О
+	 */
+	private String processName;
+
+	/**
+	 * 寮曟搸涓祦绋嬪疄渚嬫墽琛屼富閿�
+	 */
+	private String executionId;
+
+	/**
+	 * 浠诲姟涓婚敭
+	 */
+	private String oid;
+
+	/**
+	 * 浠诲姟鍚嶇О
+	 */
+	private String name;
+
+	/**
+	 * 浠诲姟缁撴潫鏃堕棿
+	 */
+	private Date planedEndDate;
+
+	/**
+	 * 浠诲姟寮�濮嬫椂闂�--涓婁竴姝ュ鎵规椂闂�
+	 */
+	private Date planedStartDate;
+
+	/**
+	 * 涓婁竴姝ュ鎵规剰瑙�
+	 */
+	private String completeDes;
+
+	/**
+	 * 娴佺▼鍒涘缓浜�
+	 */
+	private String processCreator;
+
+	/**
+	 * 娴佺▼妯℃澘鍚嶇О
+	 */
+    private String templateName;
+
+	/**
+	 * jbpm浠诲姟鐨勪富閿�
+	 */
+	private String taskOid;
+
+	public String getPrincipal() {
+		return principal;
+	}
+
+	public void setPrincipal(String principal) {
+		this.principal = principal;
+	}
+
+	public int getWorkType() {
+		return workType;
+	}
+
+	public void setWorkType(int workType) {
+		this.workType = workType;
+	}
+
+	public String getProcessType() {
+		return processType;
+	}
+
+	public void setProcessType(String processType) {
+		this.processType = processType;
+	}
+
+	public String getProcessName() {
+		return processName;
+	}
+
+	public void setProcessName(String processName) {
+		this.processName = processName;
+	}
+
+	public String getExecutionId() {
+		return executionId;
+	}
+
+	public void setExecutionId(String executionId) {
+		this.executionId = executionId;
+	}
+
+	public String getOid() {
+		return oid;
+	}
+
+	public void setOid(String oid) {
+		this.oid = oid;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public Date getPlanedEndDate() {
+		return planedEndDate;
+	}
+
+	public void setPlanedEndDate(Date planedEndDate) {
+		this.planedEndDate = planedEndDate;
+	}
+
+	public Date getPlanedStartDate() {
+		return planedStartDate;
+	}
+
+	public void setPlanedStartDate(Date planedStartDate) {
+		this.planedStartDate = planedStartDate;
+	}
+
+	public String getCompleteDes() {
+		return completeDes;
+	}
+
+	public void setCompleteDes(String completeDes) {
+		this.completeDes = completeDes;
+	}
+
+	public String getProcessCreator() {
+		return processCreator;
+	}
+
+	public void setProcessCreator(String processCreator) {
+		this.processCreator = processCreator;
+	}
+
+	public String getTemplateName() {
+		return templateName;
+	}
+
+	public void setTemplateName(String templateName) {
+		this.templateName = templateName;
+	}
+
+	public String getTaskOid() {
+		return taskOid;
+	}
+
+	public void setTaskOid(String taskOid) {
+		this.taskOid = taskOid;
+	}
+
+	@Override
+	public String toString() {
+		return "ProcessTask{" +
+				"principal='" + principal + '\'' +
+				", workType=" + workType +
+				", processType='" + processType + '\'' +
+				", processName='" + processName + '\'' +
+				", executionId='" + executionId + '\'' +
+				", oid='" + oid + '\'' +
+				", name='" + name + '\'' +
+				", planedEndDate=" + planedEndDate +
+				", planedStartDate=" + planedStartDate +
+				", completeDes='" + completeDes + '\'' +
+				", processCreator='" + processCreator + '\'' +
+				", templateName='" + templateName + '\'' +
+				", taskOid='" + taskOid + '\'' +
+				"} " + super.toString();
+	}
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/SmFavFunctionDO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/SmFavFunctionDO.java
new file mode 100644
index 0000000..75e5fdc
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/SmFavFunctionDO.java
@@ -0,0 +1,57 @@
+package com.vci.web.model;
+
+import com.vci.frameworkcore.constant.FrameWorkBtmTypeConstant;
+import com.vci.starter.web.annotation.Column;
+import com.vci.starter.web.annotation.VciBtmType;
+import com.vci.starter.web.constant.FrameWorkLcStatusConstant;
+import com.vci.starter.web.model.BaseModel;
+
+/**
+ * 鏀惰棌鐨勫姛鑳�
+ * @author weidy
+ * @date 2020/7/12
+ */
+@VciBtmType(name = FrameWorkBtmTypeConstant.SM_FAV_FUNCTION,text = "鏀惰棌鐨勫姛鑳�",lifeCycle = FrameWorkLcStatusConstant.EMTYPE_LIFE_CYCLE)
+public class SmFavFunctionDO extends BaseModel {
+
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = 4406001810025558215L;
+    /**
+     * 鐢ㄦ埛鐨勪富閿�
+     */
+    @Column(nullable = false)
+    private String userOid;
+
+    /**
+     * 鎵�灞炲姛鑳界紪鍙�
+     */
+    @Column(nullable = false)
+    private String functionId;
+
+    public String getUserOid() {
+        return userOid;
+    }
+
+    public void setUserOid(String userOid) {
+        this.userOid = userOid;
+    }
+
+
+    public String getFunctionId() {
+        return functionId;
+    }
+
+    public void setFunctionId(String functionId) {
+        this.functionId = functionId;
+    }
+
+    @Override
+    public String toString() {
+        return "SmFavFunctionDO{" +
+                "userOid='" + userOid + '\'' +
+                ", functionId='" + functionId + '\'' +
+                "} " + super.toString();
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/SmPasswordStrategyDO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/SmPasswordStrategyDO.java
new file mode 100644
index 0000000..4ad0e4e
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/SmPasswordStrategyDO.java
@@ -0,0 +1,285 @@
+package com.vci.web.model;
+
+import com.vci.starter.web.annotation.Column;
+import com.vci.starter.web.annotation.Transient;
+import com.vci.starter.web.annotation.VciBtmType;
+import com.vci.starter.web.annotation.VciFieldType;
+import com.vci.starter.web.constant.FrameWorkLcStatusConstant;
+import com.vci.starter.web.enumpck.VciFieldTypeEnum;
+import com.vci.starter.web.model.BaseModel;
+
+import java.util.Date;
+
+/**
+ * 瀵嗙爜瀹夊叏绛栫暐
+ * @author weidy
+ * @date 2020/1/29
+ */
+@VciBtmType(name = "passwordstrategy",text = "瀵嗙爜瀹夊叏绛栫暐",tableName = "PLPASSWORDSTRATEGY",lifeCycle = FrameWorkLcStatusConstant.EMTYPE_LIFE_CYCLE)
+@Transient
+public class SmPasswordStrategyDO implements java.io.Serializable {
+
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = 1842086455967473167L;
+
+    /**
+     * 涓婚敭
+     */
+    @Column(name = "pluid")
+    private String oid;
+
+    /**
+     * 鍚嶇О
+     */
+    @Column(name = "pname")
+    private String name;
+
+    /**
+     * 鎻忚堪
+     */
+    @Column(name = "PLDESC")
+    private String description;
+
+    /**
+     * 鏈�灏忛暱搴�
+     */
+    @Column(range = ">0",name = "plength")
+    private Integer minLength;
+
+    /**
+     * 瀵嗙爜鐨勬渶澶ч暱搴�
+     */
+    @Column(range = ">0",name = "PLMAXLENGTH")
+    private Integer maxLength;
+
+    /**
+     * 鏈夋晥澶╂暟
+     */
+    @Column(range = ">0",name = "POVERDUEDAY")
+    private Integer validDay;
+
+    /**
+     * 鎻愰啋澶╂暟
+     */
+    @Column(range = ">0",name = "PREMINDDAY")
+    private Integer remindDay;
+
+    /**
+     * 鍙互閲嶈瘯鐨勬鏁�
+     */
+    @Column(range = ">0",name = "PRETRYTIME")
+    private Integer retryTime;
+
+    /**
+     * 閿佸畾鏃堕棿
+     */
+    @Column(range = ">0",name = "PLOCKTIME")
+    private Integer lockTime;
+
+    /**
+     * 鏄惁涓洪粯璁�
+     */
+    @Column(name = "PLISDEFAULT")
+    private String defaultFlag;
+
+    /**
+     * 瀵嗙爜瀛楃鎵�闇�绫诲瀷
+     */
+    @Transient
+    private String requireCharType;
+
+    /**
+     * 瀵嗙爜鎵�闇�瀛楃绉嶇被涓暟
+     */
+    @Column(name = "PLREQUIREDTYPE")
+    private Integer requireCharCount;
+
+    /**
+     * 鍒涘缓浜�
+     */
+    @Column(
+            length = 50,
+            nullable = false,
+            name = "plcreateuser"
+    )
+    private String creator;
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    @Column(
+            nullable = false,
+            name = "plcreatetime"
+    )
+    @VciFieldType(VciFieldTypeEnum.VTDateTime)
+    private Date createTime;
+
+    /**
+     * 鏈�鍚庝慨鏀逛汉
+     */
+    @Column(
+            length = 50,
+            nullable = false,
+            name = "plupdateuser"
+    )
+    private String lastModifier;
+    /**
+     * 鏈�鍚庝慨鏀规椂闂�
+     */
+    @VciFieldType(VciFieldTypeEnum.VTDateTime)
+    @Column(
+            name = "plupdatetime"
+    )
+    private Date lastModifyTime;
+
+    public Integer getRequireCharCount() {
+        return requireCharCount;
+    }
+
+    public void setRequireCharCount(Integer requireCharCount) {
+        this.requireCharCount = requireCharCount;
+    }
+
+    public Integer getMinLength() {
+        return minLength;
+    }
+
+    public void setMinLength(Integer minLength) {
+        this.minLength = minLength;
+    }
+
+    public Integer getValidDay() {
+        return validDay;
+    }
+
+    public void setValidDay(Integer validDay) {
+        this.validDay = validDay;
+    }
+
+    public Integer getRemindDay() {
+        return remindDay;
+    }
+
+    public void setRemindDay(Integer remindDay) {
+        this.remindDay = remindDay;
+    }
+
+    public Integer getRetryTime() {
+        return retryTime;
+    }
+
+    public void setRetryTime(Integer retryTime) {
+        this.retryTime = retryTime;
+    }
+
+    public Integer getLockTime() {
+        return lockTime;
+    }
+
+    public void setLockTime(Integer lockTime) {
+        this.lockTime = lockTime;
+    }
+
+    public String getDefaultFlag() {
+        return defaultFlag;
+    }
+
+    public void setDefaultFlag(String defaultFlag) {
+        this.defaultFlag = defaultFlag;
+    }
+
+    public Integer getMaxLength() {
+        return maxLength;
+    }
+
+    public void setMaxLength(Integer maxLength) {
+        this.maxLength = maxLength;
+    }
+
+    public String getRequireCharType() {
+        return requireCharType;
+    }
+
+    public void setRequireCharType(String requireCharType) {
+        this.requireCharType = requireCharType;
+    }
+
+    public String getOid() {
+        return oid;
+    }
+
+    public void setOid(String oid) {
+        this.oid = oid;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getCreator() {
+        return creator;
+    }
+
+    public void setCreator(String creator) {
+        this.creator = creator;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getLastModifier() {
+        return lastModifier;
+    }
+
+    public void setLastModifier(String lastModifier) {
+        this.lastModifier = lastModifier;
+    }
+
+    public Date getLastModifyTime() {
+        return lastModifyTime;
+    }
+
+    public void setLastModifyTime(Date lastModifyTime) {
+        this.lastModifyTime = lastModifyTime;
+    }
+
+    @Override
+    public String toString() {
+        return "SmPasswordStrategyDO{" +
+                "oid='" + oid + '\'' +
+                ", name='" + name + '\'' +
+                ", description='" + description + '\'' +
+                ", minLength=" + minLength +
+                ", maxLength=" + maxLength +
+                ", validDay=" + validDay +
+                ", remindDay=" + remindDay +
+                ", retryTime=" + retryTime +
+                ", lockTime=" + lockTime +
+                ", defaultFlag='" + defaultFlag + '\'' +
+                ", requireCharType='" + requireCharType + '\'' +
+                ", requireCharCount=" + requireCharCount +
+                ", creator='" + creator + '\'' +
+                ", createTime=" + createTime +
+                ", lastModifier='" + lastModifier + '\'' +
+                ", lastModifyTime=" + lastModifyTime +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/SmUserDO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/SmUserDO.java
new file mode 100644
index 0000000..4b05d52
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/SmUserDO.java
@@ -0,0 +1,331 @@
+package com.vci.web.model;
+
+import com.vci.starter.web.annotation.*;
+import com.vci.starter.web.constant.FrameWorkLcStatusConstant;
+import com.vci.starter.web.enumpck.VciFieldTypeEnum;
+
+import java.util.Date;
+
+/**
+ * 鐢ㄦ埛鐨勬暟鎹璞�
+ * @author weidy
+ * @date 2021/2/16
+ */
+@VciBtmType(name = "user",text = "鐢ㄦ埛鐨勪俊鎭�",tableName = "pluser",lifeCycle = FrameWorkLcStatusConstant.EMTYPE_LIFE_CYCLE)
+@Transient
+public class SmUserDO implements java.io.Serializable{
+
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = 4234300870159307084L;
+    /**
+     * 涓婚敭
+     */
+    @Column(name = "pluid",nullable = false)
+    @Id
+    private String oid;
+
+    /**
+     * 鐢ㄦ埛鍚�
+     */
+    @Column(nullable = false,unique = true,name = "plusername")
+    private String id;
+
+    /**
+     * 鐢ㄦ埛濮撳悕
+     */
+    @Column(nullable = false,name = "pltruename")
+    private String name;
+
+    /**
+     * 鐢ㄦ埛绫诲瀷
+     */
+    @VciUseEnum(value = "usertype",defaultValue = "2",showTextField = "userTypeText")
+    @Column(name = "plusertype")
+    private String userType;
+
+    /**
+     * 鐢ㄦ埛绫诲瀷鏄剧ず鏂囨湰
+     */
+    @Transient()
+    private String userTypeText;
+
+    /**
+     * 鐢ㄦ埛瀵嗙爜
+     */
+    @Column(name="plpassword")
+    private String password;
+
+    /**
+     * 閭欢鍦板潃
+     */
+    @Column(name = "plemail")
+    private String email;
+
+    /**
+     * 鏄惁閿佸畾
+     */
+    @Column(nullable = true,name = "plstatus")
+    private String lockFlag;
+
+    /**
+     * 鎻忚堪
+     */
+    @Column(name = "pldesc")
+    private String description;
+
+    /**
+     * 瀵嗙骇
+     */
+    @VciUseEnum(
+            value = "Enumsecretgrade",
+            showTextField = "secretGradeText"
+    )
+    @Column(name = "plsecretgrade")
+    private Integer secretGrade;
+
+    /**
+     * 瀵嗙骇
+     */
+    @Transient
+    private String secretGradeText;
+
+    /**
+     * 鍒涘缓浜�
+     */
+    @Column(
+            length = 50,
+            nullable = false,
+            name = "plcreateuser"
+    )
+    private String creator;
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    @Column(
+            nullable = false,
+            name = "plcreatetime"
+    )
+    @VciFieldType(VciFieldTypeEnum.VTDateTime)
+    private Date createTime;
+
+    /**
+     * 鏈�鍚庝慨鏀逛汉
+     */
+    @Column(
+            length = 50,
+            nullable = false,
+            name = "plupdateuser"
+    )
+    private String lastModifier;
+    /**
+     * 鏈�鍚庝慨鏀规椂闂�
+     */
+    @VciFieldType(VciFieldTypeEnum.VTDateTime)
+    @Column(
+            name = "plupdatetime"
+    )
+    private Date lastModifyTime;
+
+    /**
+     * 鎵�灞為儴闂�
+     */
+    @Transient(referColumn = "pkDepartment.pluid")
+    private String pkDepartment;
+
+    /**
+     * 鎵�灞為儴闂ㄧ紪鍙�
+     */
+    @Transient(referColumn = "pkDepartment.plnum")
+    private String pkDepartmentId;
+
+    /**
+     * 鎵�灞為儴闂ㄥ悕绉�
+     */
+    @Transient(referColumn = "pkDepartment.plname")
+    private String pkDepartmentName;
+
+    /**
+     * 鎵�灞炲瘑鐮佸畨鍏ㄧ瓥鐣�
+     */
+    @Transient(referColumn = "pkUserPassword.plpasswordstrategyuid")
+    private String pkPasswordStrategy;
+
+    public String getOid() {
+        return oid;
+    }
+
+    public void setOid(String oid) {
+        this.oid = oid;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getUserType() {
+        return userType;
+    }
+
+    public void setUserType(String userType) {
+        this.userType = userType;
+    }
+
+    public String getUserTypeText() {
+        return userTypeText;
+    }
+
+    public void setUserTypeText(String userTypeText) {
+        this.userTypeText = userTypeText;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getEmail() {
+        return email;
+    }
+
+    public void setEmail(String email) {
+        this.email = email;
+    }
+
+    public String getLockFlag() {
+        return lockFlag;
+    }
+
+    public void setLockFlag(String lockFlag) {
+        this.lockFlag = lockFlag;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public Integer getSecretGrade() {
+        return secretGrade;
+    }
+
+    public void setSecretGrade(Integer secretGrade) {
+        this.secretGrade = secretGrade;
+    }
+
+    public String getSecretGradeText() {
+        return secretGradeText;
+    }
+
+    public void setSecretGradeText(String secretGradeText) {
+        this.secretGradeText = secretGradeText;
+    }
+
+    public String getCreator() {
+        return creator;
+    }
+
+    public void setCreator(String creator) {
+        this.creator = creator;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getLastModifier() {
+        return lastModifier;
+    }
+
+    public void setLastModifier(String lastModifier) {
+        this.lastModifier = lastModifier;
+    }
+
+    public Date getLastModifyTime() {
+        return lastModifyTime;
+    }
+
+    public void setLastModifyTime(Date lastModifyTime) {
+        this.lastModifyTime = lastModifyTime;
+    }
+
+    public String getPkDepartment() {
+        return pkDepartment;
+    }
+
+    public void setPkDepartment(String pkDepartment) {
+        this.pkDepartment = pkDepartment;
+    }
+
+    public String getPkDepartmentId() {
+        return pkDepartmentId;
+    }
+
+    public void setPkDepartmentId(String pkDepartmentId) {
+        this.pkDepartmentId = pkDepartmentId;
+    }
+
+    public String getPkDepartmentName() {
+        return pkDepartmentName;
+    }
+
+    public void setPkDepartmentName(String pkDepartmentName) {
+        this.pkDepartmentName = pkDepartmentName;
+    }
+
+    public String getPkPasswordStrategy() {
+        return pkPasswordStrategy;
+    }
+
+    public void setPkPasswordStrategy(String pkPasswordStrategy) {
+        this.pkPasswordStrategy = pkPasswordStrategy;
+    }
+
+    @Override
+    public String toString() {
+        return "SmUserDO{" +
+                "oid='" + oid + '\'' +
+                ", id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", userType='" + userType + '\'' +
+                ", userTypeText='" + userTypeText + '\'' +
+                ", password='" + password + '\'' +
+                ", email='" + email + '\'' +
+                ", lockFlag='" + lockFlag + '\'' +
+                ", description='" + description + '\'' +
+                ", secretGrade=" + secretGrade +
+                ", secretGradeText='" + secretGradeText + '\'' +
+                ", creator='" + creator + '\'' +
+                ", createTime=" + createTime +
+                ", lastModifier='" + lastModifier + '\'' +
+                ", lastModifyTime=" + lastModifyTime +
+                ", pkDepartment='" + pkDepartment + '\'' +
+                ", pkDepartmentId='" + pkDepartmentId + '\'' +
+                ", pkDepartmentName='" + pkDepartmentName + '\'' +
+                ", pkPasswordStrategy='" + pkPasswordStrategy + '\'' +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/VciFileDocClassifyDO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/VciFileDocClassifyDO.java
new file mode 100644
index 0000000..c43ea66
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/VciFileDocClassifyDO.java
@@ -0,0 +1,75 @@
+package com.vci.web.model;
+
+import com.vci.file.constant.VciFileBtmTypeConstant;
+import com.vci.starter.web.annotation.Column;
+import com.vci.starter.web.annotation.Transient;
+import com.vci.starter.web.annotation.VciBtmType;
+import com.vci.starter.web.constant.FrameWorkLcStatusConstant;
+import com.vci.starter.web.model.BaseModel;
+
+/**
+ * 鏂囨。鐨勭被鍨�
+ * @author weidy
+ * @date 2020/8/4 8:30
+ */
+@VciBtmType(name = VciFileBtmTypeConstant.FILE_DOC_CLASSIFY,tableName = "platformbtm_"+ VciFileBtmTypeConstant.FILE_DOC_CLASSIFY,text = "鏂囨。鐨勭被鍨�",description = "鏂囨。鐨勭敤閫�",lifeCycle = FrameWorkLcStatusConstant.EMTYPE_LIFE_CYCLE)
+@Transient
+public class VciFileDocClassifyDO extends BaseModel {
+
+    /**
+     * 鏂囨。绫诲瀷缂栧彿
+     */
+    @Column(nullable = false,length = 50)
+    private String id;
+
+    /**
+     * 鏂囨。绫诲瀷鍚嶇О
+     */
+    @Column(nullable = false,length = 200)
+    private String name;
+
+    /**
+     * 鏂囨。绫诲瀷鎻忚堪
+     */
+    @Column(columnDefinition = "鎻忚堪")
+    private String description;
+
+    @Override
+    public String getId() {
+        return id;
+    }
+
+    @Override
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    @Override
+    public String getDescription() {
+        return description;
+    }
+
+    @Override
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    @Override
+    public String toString() {
+        return "VciFileDocClassifyDO{" +
+                "id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", description='" + description + '\'' +
+                "} " + super.toString();
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/VciFileObjectDO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/VciFileObjectDO.java
new file mode 100644
index 0000000..336b8b6
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/VciFileObjectDO.java
@@ -0,0 +1,291 @@
+package com.vci.web.model;
+
+import com.vci.file.constant.VciFileBtmTypeConstant;
+import com.vci.file.constant.VciFileDefaultValueConstant;
+import com.vci.file.constant.VciFileLifeConstant;
+import com.vci.starter.web.annotation.Column;
+import com.vci.starter.web.annotation.Transient;
+import com.vci.starter.web.annotation.VciBtmType;
+import com.vci.starter.web.model.BaseModel;
+
+/**
+ * 鏂囦欢瀵硅薄
+ * @author weidy
+ * @date 2020/3/12
+ */
+@VciBtmType(name = VciFileBtmTypeConstant.FILE_OBJECT,tableName = "platformbtm_"+ VciFileBtmTypeConstant.FILE_OBJECT,text = "鏂囦欢瀵硅薄",revisionRuleInput = true,secretAble = true,
+        lifeCycle = VciFileLifeConstant.FILE_LC,startStatus = VciFileDefaultValueConstant.FILE_LC_STATUS_INIT)
+@Transient
+public class VciFileObjectDO extends BaseModel {
+
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = 875418970876860484L;
+
+    /**
+     * 鏄剧ず鍚嶇О
+     */
+    @Column(nullable = false,length = 1000)
+    private String id;
+
+    /**
+     * 鏂囦欢瀹炰綋鍚嶇О
+     */
+    @Column(nullable = false,length = 1000)
+    private String name;
+
+    /**
+     * 鏂囦欢鐨勫悗缂�鍚�
+     */
+    private String fileExtension;
+
+    /**
+     * 鏂囨。绫诲瀷
+     */
+    @Column(name = "filetype")
+    private String fileDocClassify;
+
+    /**
+     * 鏂囨。绫诲瀷鏂囨湰
+     */
+    @Transient()
+    private String fileDocClassifyName;
+
+    /**
+     * 鏂囦欢澶у皬
+     */
+    private Long fileSize;
+
+    /**
+     * 鍏抽敭淇℃伅
+     */
+    private String keyInfos;
+
+    /**
+     * 鎵�灞炴暟鎹富閿�
+     */
+    private String ownbizOid;
+
+    /**
+     * 鎵�灞炴暟鎹殑涓氬姟绫诲瀷
+     */
+    private String ownBtmname;
+
+    /**
+     * 鎵�灞炴枃浠舵牸寮�
+     */
+    private String ownFormatOid;
+    /**
+     * 椤垫暟
+     */
+    private Integer pagesnum;
+
+    /**
+     * 鐗堟湰闄愬埗
+     */
+    private String revisionLimit;
+
+    /**
+     * 鏂囦欢鐨凪D5
+     */
+    private String mdcode;
+
+    /**
+     * 鏂囦欢澶圭殑涓婚敭
+     */
+    private String folderoid;
+
+    /**
+     * 鐩稿璺緞
+     */
+    private String relativePath;
+    /**
+     * 鎵�灞炲嵎
+     */
+    @Transient
+    private String pkFileVolume;
+
+    /**
+     * 涓嬭浇娆℃暟
+     */
+    @Transient
+    private Long downloadCount;
+
+    /**
+     * 鏂囦欢瀛樺偍璺緞
+     */
+    private String filePath;
+
+    public String getOwnFormatOid() {
+        return ownFormatOid;
+    }
+
+    public void setOwnFormatOid(String ownFormatOid) {
+        this.ownFormatOid = ownFormatOid;
+    }
+
+    public Integer getPagesnum() {
+        return pagesnum;
+    }
+
+    public void setPagesnum(Integer pagesnum) {
+        this.pagesnum = pagesnum;
+    }
+
+    public String getRevisionLimit() {
+        return revisionLimit;
+    }
+
+    public void setRevisionLimit(String revisionLimit) {
+        this.revisionLimit = revisionLimit;
+    }
+
+    public String getMdcode() {
+        return mdcode;
+    }
+
+    public void setMdcode(String mdcode) {
+        this.mdcode = mdcode;
+    }
+
+    public String getFolderoid() {
+        return folderoid;
+    }
+
+    public void setFolderoid(String folderoid) {
+        this.folderoid = folderoid;
+    }
+
+    public String getRelativePath() {
+        return relativePath;
+    }
+
+    public void setRelativePath(String relativePath) {
+        this.relativePath = relativePath;
+    }
+
+    @Override
+    public String getId() {
+        return id;
+    }
+
+    @Override
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getFileExtension() {
+        return fileExtension;
+    }
+
+    public void setFileExtension(String fileExtension) {
+        this.fileExtension = fileExtension;
+    }
+
+    public Long getFileSize() {
+        return fileSize;
+    }
+
+    public void setFileSize(Long fileSize) {
+        this.fileSize = fileSize;
+    }
+
+    public String getKeyInfos() {
+        return keyInfos;
+    }
+
+    public void setKeyInfos(String keyInfos) {
+        this.keyInfos = keyInfos;
+    }
+
+    public String getOwnbizOid() {
+        return ownbizOid;
+    }
+
+    public void setOwnbizOid(String ownbizOid) {
+        this.ownbizOid = ownbizOid;
+    }
+
+    public String getOwnBtmname() {
+        return ownBtmname;
+    }
+
+    public void setOwnBtmname(String ownBtmname) {
+        this.ownBtmname = ownBtmname;
+    }
+
+    public String getPkFileVolume() {
+        return pkFileVolume;
+    }
+
+    public void setPkFileVolume(String pkFileVolume) {
+        this.pkFileVolume = pkFileVolume;
+    }
+
+    public String getFileDocClassify() {
+        return fileDocClassify;
+    }
+
+    public void setFileDocClassify(String fileDocClassify) {
+        this.fileDocClassify = fileDocClassify;
+    }
+
+    public String getFileDocClassifyName() {
+        return fileDocClassifyName;
+    }
+
+    public void setFileDocClassifyName(String fileDocClassifyName) {
+        this.fileDocClassifyName = fileDocClassifyName;
+    }
+
+    public Long getDownloadCount() {
+        return downloadCount;
+    }
+
+    public void setDownloadCount(Long downloadCount) {
+        this.downloadCount = downloadCount;
+    }
+
+    public String getFilePath() {
+        return filePath;
+    }
+
+    public void setFilePath(String filePath) {
+        this.filePath = filePath;
+    }
+
+    @Override
+    public String toString() {
+        return "VciFileObjectDO{" +
+                "id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", fileExtension='" + fileExtension + '\'' +
+                ", fileDocClassify='" + fileDocClassify + '\'' +
+                ", fileDocClassifyName='" + fileDocClassifyName + '\'' +
+                ", fileSize=" + fileSize +
+                ", keyInfos='" + keyInfos + '\'' +
+                ", ownbizOid='" + ownbizOid + '\'' +
+                ", ownBtmname='" + ownBtmname + '\'' +
+                ", ownFormatOid='" + ownFormatOid + '\'' +
+                ", pagesnum=" + pagesnum +
+                ", revisionLimit='" + revisionLimit + '\'' +
+                ", mdcode='" + mdcode + '\'' +
+                ", folderoid='" + folderoid + '\'' +
+                ", relativePath='" + relativePath + '\'' +
+                ", pkFileVolume='" + pkFileVolume + '\'' +
+                ", downloadCount=" + downloadCount +
+                ", filePath='" + filePath + '\'' +
+                "} " + super.toString();
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/VciFileVolumeDO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/VciFileVolumeDO.java
new file mode 100644
index 0000000..0efebd6
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/VciFileVolumeDO.java
@@ -0,0 +1,260 @@
+package com.vci.web.model;
+
+import com.vci.file.constant.VciFileBtmTypeConstant;
+import com.vci.file.constant.VciFileEnumConstant;
+import com.vci.starter.web.annotation.Column;
+import com.vci.starter.web.annotation.Transient;
+import com.vci.starter.web.annotation.VciBtmType;
+import com.vci.starter.web.annotation.VciUseEnum;
+import com.vci.starter.web.constant.FrameWorkLcStatusConstant;
+import com.vci.starter.web.model.BaseModel;
+
+import static com.vci.frameworkcore.constant.FrameWorkDefaultValueConstant.FRAMEWORK_DATA_ENABLED;
+
+/**
+ * 鏂囦粨鍗�
+ * @author weidy
+ * @date 2020/3/12
+ */
+@VciBtmType(name = VciFileBtmTypeConstant.FILE_VOLUME,tableName = "plvolume",text = "鏂囦粨绠$悊",lifeCycle =
+        FrameWorkLcStatusConstant.FRAME_WORK_LIFE_CYCLE_NAME,startStatus = FRAMEWORK_DATA_ENABLED)
+@Transient
+public class VciFileVolumeDO implements java.io.Serializable{
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = -6603607708274363544L;
+
+    /**
+     * 涓婚敭
+     */
+    @Column(name = "ploid")
+    private String oid;
+
+    /**
+     * 鏂囦粨缂栧彿
+     */
+    @Column(nullable = false,length = 50,name = "plname")
+    private String id;
+
+    /**
+     * 鏂囦粨鍚嶇О
+     */
+    @Column(nullable = false,length = 200,name = "plip")
+    private String name;
+
+    /**
+     * 鏂囦粨鎻忚堪
+     */
+    @Transient
+    private String description;
+
+    /**
+     * 鏂囦粨鐨勮矾寰�
+     */
+    @Column(nullable = false,length = 2000,name = "plpathname")
+    private String volumePath;
+
+    /**
+     * 瀛樺偍绯荤粺绫诲瀷
+     */
+    @VciUseEnum(value = VciFileEnumConstant.FILE_SERVICE_OS_TYPE,showTextField = "serviceOsTypeText")
+    @Column(name="plmachinetype")
+    private String serviceOsType;
+
+    /**
+     * 瀛樺偍绯荤粺绫诲瀷鏂囨湰
+     */
+    @Transient
+    private String serviceOsTypeText;
+
+    /**
+     * 浼犺緭鍗忚
+     */
+    @Transient
+    private String transProtocol = "corba";
+
+    /**
+     * 浼犺緭鍗忚鏄剧ず鏂囨湰
+     */
+    @Transient
+    private String transProtocolText;
+
+    /**
+     * 杩滅▼鏂囦粨鐨勬湇鍔″湴鍧�
+     */
+    @Column(name = "plhost")
+    private String serviceUrl;
+
+    /**
+     * 杩滅▼鏂囦粨璁よ瘉鐢ㄦ埛
+     */
+    @Transient
+    private String transUser;
+
+    /**
+     * 杩滅▼鏂囦欢璁よ瘉鐢ㄦ埛瀵嗙爜
+     */
+    @Transient
+    private String transUserPwd;
+
+    /**
+     * 鏈�澶у閲�
+     */
+    @Transient
+    private String maxVolume;
+
+    /**
+     * 褰撳墠瀹归噺
+     */
+    @Transient
+    private String currentVolume;
+
+    /**
+     * 鏈�鍚庡悓姝ユ椂闂�
+     */
+    @Transient
+    private String lastSyncTimeLong;
+
+
+    public String getOid() {
+        return oid;
+    }
+
+    public void setOid(String oid) {
+        this.oid = oid;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getVolumePath() {
+        return volumePath;
+    }
+
+    public void setVolumePath(String volumePath) {
+        this.volumePath = volumePath;
+    }
+
+    public String getServiceOsType() {
+        return serviceOsType;
+    }
+
+    public void setServiceOsType(String serviceOsType) {
+        this.serviceOsType = serviceOsType;
+    }
+
+    public String getServiceOsTypeText() {
+        return serviceOsTypeText;
+    }
+
+    public void setServiceOsTypeText(String serviceOsTypeText) {
+        this.serviceOsTypeText = serviceOsTypeText;
+    }
+
+    public String getTransProtocol() {
+        return transProtocol;
+    }
+
+    public void setTransProtocol(String transProtocol) {
+        this.transProtocol = transProtocol;
+    }
+
+    public String getTransProtocolText() {
+        return transProtocolText;
+    }
+
+    public void setTransProtocolText(String transProtocolText) {
+        this.transProtocolText = transProtocolText;
+    }
+
+    public String getServiceUrl() {
+        return serviceUrl;
+    }
+
+    public void setServiceUrl(String serviceUrl) {
+        this.serviceUrl = serviceUrl;
+    }
+
+    public String getTransUser() {
+        return transUser;
+    }
+
+    public void setTransUser(String transUser) {
+        this.transUser = transUser;
+    }
+
+    public String getTransUserPwd() {
+        return transUserPwd;
+    }
+
+    public void setTransUserPwd(String transUserPwd) {
+        this.transUserPwd = transUserPwd;
+    }
+
+    public String getMaxVolume() {
+        return maxVolume;
+    }
+
+    public void setMaxVolume(String maxVolume) {
+        this.maxVolume = maxVolume;
+    }
+
+    public String getCurrentVolume() {
+        return currentVolume;
+    }
+
+    public void setCurrentVolume(String currentVolume) {
+        this.currentVolume = currentVolume;
+    }
+
+    public String getLastSyncTimeLong() {
+        return lastSyncTimeLong;
+    }
+
+    public void setLastSyncTimeLong(String lastSyncTimeLong) {
+        this.lastSyncTimeLong = lastSyncTimeLong;
+    }
+
+    @Override
+    public String toString() {
+        return "VciFileVolumeDO{" +
+                "oid='" + oid + '\'' +
+                ", id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", description='" + description + '\'' +
+                ", volumePath='" + volumePath + '\'' +
+                ", serviceOsType='" + serviceOsType + '\'' +
+                ", serviceOsTypeText='" + serviceOsTypeText + '\'' +
+                ", transProtocol='" + transProtocol + '\'' +
+                ", transProtocolText='" + transProtocolText + '\'' +
+                ", serviceUrl='" + serviceUrl + '\'' +
+                ", transUser='" + transUser + '\'' +
+                ", transUserPwd='" + transUserPwd + '\'' +
+                ", maxVolume='" + maxVolume + '\'' +
+                ", currentVolume='" + currentVolume + '\'' +
+                ", lastSyncTimeLong='" + lastSyncTimeLong + '\'' +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/WFProcessClassifyDO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/WFProcessClassifyDO.java
new file mode 100644
index 0000000..201c59a
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/WFProcessClassifyDO.java
@@ -0,0 +1,194 @@
+package com.vci.web.model;
+
+import com.vci.starter.web.annotation.Column;
+import com.vci.starter.web.annotation.Transient;
+import com.vci.starter.web.annotation.VciBtmType;
+import com.vci.starter.web.annotation.log.VciBusinessLog;
+import com.vci.starter.web.constant.FrameWorkLcStatusConstant;
+
+import java.util.Date;
+
+/**
+ * 娴佺▼鐨勫垎绫�
+ * @author weidy
+ * @date 2022-2-18
+ */
+@VciBtmType(name = "processclassify",text = "娴佺▼鍒嗙被",tableName = "PLPROCESSCATEGORY",lifeCycle = FrameWorkLcStatusConstant.EMTYPE_LIFE_CYCLE)
+@Transient
+public class WFProcessClassifyDO implements java.io.Serializable{
+
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = -2899063300698915616L;
+    /**
+     * 涓婚敭
+     */
+    @Column(name = "ploid")
+    private String oid;
+
+    /**
+     * 鍒嗙被鐨勫悕绉�
+     */
+    @Column(name = "plname",nullable = false)
+    private String name ;
+
+    /**
+     * 鎻忚堪
+     */
+    @Column(name = "pldesc")
+    private String description;
+
+    /**
+     * 鍥炬爣鐨勮矾寰�
+     */
+    @Column(name = "plicon")
+    private String iconUrl;
+
+    /**
+     * 涓婄骇娴佺▼鍒嗙被涓婚敭
+     */
+    @Column(name = "plparentoid")
+    private String parentFlowClsOid;
+
+    /**
+     * 鍒涘缓浜�
+     */
+    @Column(name = "plcreateuser")
+    private String creator;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    @Column(name = "plcreatetime")
+    private Date createTime;
+
+    /**
+     * 鏈�鍚庝慨鏀逛汉
+     */
+    @Column(name = "plmodifyuser")
+    private String lastModifier;
+
+    /**
+     * 鏈�鍚庝慨鏀规椂闂�
+     */
+    @Column(name = "plmodifytime")
+    private Date lastModifyTime;
+
+    /**
+     * 鏈�鍚庝慨鏀硅鑹�
+     */
+    @Column(name = "plmodifyrole")
+    private String modifyRole;
+
+    /**
+     * 鏈�鍚庝慨鏀圭殑缁勭粐
+     */
+    @Column(name = "plmodifyorg")
+    private String modifyOrg;
+
+    public String getOid() {
+        return oid;
+    }
+
+    public void setOid(String oid) {
+        this.oid = oid;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getIconUrl() {
+        return iconUrl;
+    }
+
+    public void setIconUrl(String iconUrl) {
+        this.iconUrl = iconUrl;
+    }
+
+    public String getParentFlowClsOid() {
+        return parentFlowClsOid;
+    }
+
+    public void setParentFlowClsOid(String parentFlowClsOid) {
+        this.parentFlowClsOid = parentFlowClsOid;
+    }
+
+    public String getCreator() {
+        return creator;
+    }
+
+    public void setCreator(String creator) {
+        this.creator = creator;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getLastModifier() {
+        return lastModifier;
+    }
+
+    public void setLastModifier(String lastModifier) {
+        this.lastModifier = lastModifier;
+    }
+
+    public Date getLastModifyTime() {
+        return lastModifyTime;
+    }
+
+    public void setLastModifyTime(Date lastModifyTime) {
+        this.lastModifyTime = lastModifyTime;
+    }
+
+    public String getModifyRole() {
+        return modifyRole;
+    }
+
+    public void setModifyRole(String modifyRole) {
+        this.modifyRole = modifyRole;
+    }
+
+    public String getModifyOrg() {
+        return modifyOrg;
+    }
+
+    public void setModifyOrg(String modifyOrg) {
+        this.modifyOrg = modifyOrg;
+    }
+
+    @Override
+    public String toString() {
+        return "WFProcessClassifyDO{" +
+                "oid='" + oid + '\'' +
+                ", name='" + name + '\'' +
+                ", description='" + description + '\'' +
+                ", iconUrl='" + iconUrl + '\'' +
+                ", parentFlowClsOid='" + parentFlowClsOid + '\'' +
+                ", creator='" + creator + '\'' +
+                ", createTime=" + createTime +
+                ", lastModifier='" + lastModifier + '\'' +
+                ", lastModifyTime=" + lastModifyTime +
+                ", modifyRole='" + modifyRole + '\'' +
+                ", modifyOrg='" + modifyOrg + '\'' +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/WFProcessTemplateDO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/WFProcessTemplateDO.java
new file mode 100644
index 0000000..82b6b88
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/WFProcessTemplateDO.java
@@ -0,0 +1,101 @@
+package com.vci.web.model;
+
+import com.vci.starter.web.annotation.Column;
+
+import java.util.Date;
+
+/**
+ * 娴佺▼妯℃澘
+ * @author weidy
+ * @date 2022-2-18
+ */
+public class WFProcessTemplateDO implements java.io.Serializable{
+
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = 5961354882770104122L;
+    /**
+     * 涓婚敭
+     */
+    @Column(name = "ploid")
+    private String oid;
+
+    /**
+     * 娴佺▼鍒嗙被
+     */
+    @Column(name = "plcategoryoid")
+    private String categroyOid;
+
+    /**
+     * jbpm閲岄潰閮ㄧ讲鐨勪富閿�
+     */
+    @Column(name = "pljbpmdeploymentid")
+    private String deploymentId;
+
+    /**
+     * 娴佺▼瀹氫箟鐨勭姸鎬�
+     */
+    @Column(name = "plstatus")
+    private String status ;
+
+    /**
+     * 鍒涘缓浜�
+     */
+    @Column(name = "plcreateuser")
+    private String creator;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    @Column(name = "plcreatetime")
+    private Date createTime;
+
+    public String getOid() {
+        return oid;
+    }
+
+    public void setOid(String oid) {
+        this.oid = oid;
+    }
+
+    public String getCategroyOid() {
+        return categroyOid;
+    }
+
+    public void setCategroyOid(String categroyOid) {
+        this.categroyOid = categroyOid;
+    }
+
+    public String getDeploymentId() {
+        return deploymentId;
+    }
+
+    public void setDeploymentId(String deploymentId) {
+        this.deploymentId = deploymentId;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public String getCreator() {
+        return creator;
+    }
+
+    public void setCreator(String creator) {
+        this.creator = creator;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/WFWorkflowNodeFavDO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/WFWorkflowNodeFavDO.java
new file mode 100644
index 0000000..b97fd3d
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/WFWorkflowNodeFavDO.java
@@ -0,0 +1,122 @@
+package com.vci.web.model;
+
+import com.vci.starter.web.annotation.Column;
+import com.vci.starter.web.annotation.VciBtmType;
+import com.vci.starter.web.constant.FrameWorkLcStatusConstant;
+import com.vci.starter.web.model.BaseModel;
+
+/**
+ * 娴佺▼鐨勮妭鐐规敹钘�
+ *
+ * @author weidy
+ * @date 2021/6/8
+ */
+@VciBtmType(name = "wfWorkflowNodeFav", text = "娴佺▼璐熻矗浜烘敹钘�", lifeCycle = FrameWorkLcStatusConstant.EMTYPE_LIFE_CYCLE)
+public class WFWorkflowNodeFavDO extends BaseModel {
+
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = 7998685704482234281L;
+    /**
+     * 娴佺▼妯℃澘鐨勪富閿�
+     */
+    @Column(nullable = false, columnDefinition = "娴佺▼妯℃澘鐨勪富閿�")
+    private String id;
+
+    /**
+     * 鏀惰棌鏂规鐨勫悕绉�
+     */
+    @Column(columnDefinition = "鏀惰棌鏂规鐨勫悕绉�")
+    private String name;
+
+    /**
+     * 娴佺▼妯℃澘鐨勫悕绉�
+     */
+    @Column(columnDefinition = "娴佺▼妯℃澘鐨勫悕绉�")
+    private String wfTemplateName;
+
+    /**
+     * 娴佺▼妯℃澘鐨勭増鏈�
+     */
+    @Column(columnDefinition = "娴佺▼妯℃澘鐨勭増鏈�")
+    private String wfTemplateRev;
+
+    /**
+     * 鐢ㄦ埛璐﹀彿
+     */
+    @Column(nullable = false, columnDefinition = "鐢ㄦ埛璐﹀彿")
+    private String userId;
+
+    /**
+     * 鎻忚堪
+     */
+    @Column(columnDefinition = "鎻忚堪")
+    private String description;
+
+    @Override
+    public String getId() {
+        return id;
+    }
+
+    @Override
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getWfTemplateName() {
+        return wfTemplateName;
+    }
+
+    public void setWfTemplateName(String wfTemplateName) {
+        this.wfTemplateName = wfTemplateName;
+    }
+
+    public String getWfTemplateRev() {
+        return wfTemplateRev;
+    }
+
+    public void setWfTemplateRev(String wfTemplateRev) {
+        this.wfTemplateRev = wfTemplateRev;
+    }
+
+    public String getUserId() {
+        return userId;
+    }
+
+    public void setUserId(String userId) {
+        this.userId = userId;
+    }
+
+    @Override
+    public String getDescription() {
+        return description;
+    }
+
+    @Override
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    @Override
+    public String toString() {
+        return "WFWorkflowNodeFavDO{" +
+                "id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", wfTemplateName='" + wfTemplateName + '\'' +
+                ", wfTempalteRev='" + wfTemplateRev + '\'' +
+                ", userId='" + userId + '\'' +
+                ", description='" + description + '\'' +
+                '}' + super.toString();
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/WFWorkflowNodeFavItemDO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/WFWorkflowNodeFavItemDO.java
new file mode 100644
index 0000000..dcb6ca6
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/WFWorkflowNodeFavItemDO.java
@@ -0,0 +1,89 @@
+package com.vci.web.model;
+
+import com.vci.frameworkcore.constant.FrameWorkBtmTypeConstant;
+import com.vci.starter.web.annotation.Column;
+import com.vci.starter.web.annotation.VciBtmType;
+import com.vci.starter.web.constant.FrameWorkLcStatusConstant;
+import com.vci.starter.web.model.BaseModel;
+
+/**
+ * 娴佺▼鏀惰棌鐨勮妭鐐逛俊鎭�
+ * @author weidy
+ * @date 2021/6/8
+ */
+@VciBtmType(name = "wfWorkflowNodeItem",text = "娴佺▼鏀惰棌鑺傜偣鏄庣粏",lifeCycle = FrameWorkLcStatusConstant.EMTYPE_LIFE_CYCLE)
+public class WFWorkflowNodeFavItemDO extends BaseModel {
+
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = -8237291049804864973L;
+
+    /**
+     * 娴佺▼鏀惰棌鑺傜偣鐨勬柟妗堜富閿�
+     */
+    @Column(nullable = false,columnDefinition = "娴佺▼鏀惰棌鑺傜偣鐨勬柟妗堜富閿�")
+    private String workflowNodeFavOid;
+
+    /**
+     * 鑺傜偣鍚嶇О
+     */
+    @Column(nullable = false,columnDefinition = "鑺傜偣鍚嶇О")
+    private String name;
+
+    /**
+     * 鍖呭惈鐨勭敤鎴峰悕锛屽彲浠ュ涓紝浣嗘槸鎬荤殑涓嶈秴杩�4000闀垮害
+     */
+    @Column(length = 4000,columnDefinition = "鍖呭惈鐨勭敤鎴峰悕")
+    private String nodeUserIds;
+
+    /**
+     * 鍖呭惈鐢ㄦ埛濮撳悕
+     */
+    @Column(length = 4000,columnDefinition = "鍖呭惈鐨勭敤鎴峰鍚�")
+    private String nodeUserNames;
+
+    public String getWorkflowNodeFavOid() {
+        return workflowNodeFavOid;
+    }
+
+    public void setWorkflowNodeFavOid(String workflowNodeFavOid) {
+        this.workflowNodeFavOid = workflowNodeFavOid;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getNodeUserIds() {
+        return nodeUserIds;
+    }
+
+    public void setNodeUserIds(String nodeUserIds) {
+        this.nodeUserIds = nodeUserIds;
+    }
+
+    public String getNodeUserNames() {
+        return nodeUserNames;
+    }
+
+    public void setNodeUserNames(String nodeUserNames) {
+        this.nodeUserNames = nodeUserNames;
+    }
+
+    @Override
+    public String toString() {
+        return "WFWorkflowNodeFavItemDO{" +
+                "workflowNodeFavOid='" + workflowNodeFavOid + '\'' +
+                ", name='" + name + '\'' +
+                ", nodeUserIds='" + nodeUserIds + '\'' +
+                ", nodeUserNames='" + nodeUserNames + '\'' +
+                '}' + super.toString();
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/WebHomeTaskActionDO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/WebHomeTaskActionDO.java
new file mode 100644
index 0000000..54e0ffb
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/model/WebHomeTaskActionDO.java
@@ -0,0 +1,106 @@
+package com.vci.web.model;
+
+
+import com.vci.starter.web.annotation.Column;
+import com.vci.starter.web.annotation.VciBtmType;
+import com.vci.starter.web.constant.FrameWorkLcStatusConstant;
+import com.vci.starter.web.model.BaseModel;
+
+/**
+ * 棣栭〉鐨勫緟鍔炰簨椤癸紝涓嶆槸娴佺▼
+ * @author weidy
+ * @date 2021-2-22
+ */
+@VciBtmType(name = "homeTask",text = "寰呭鐞嗙殑浜嬮」",lifeCycle = FrameWorkLcStatusConstant.EMTYPE_LIFE_CYCLE)
+public class WebHomeTaskActionDO extends BaseModel  {
+
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = 5565698130138366889L;
+
+    /**
+     * 鍔熻兘涓婚敭鐢ㄤ簬纭畾鍔熻兘鏉冮檺
+     */
+    @Column(nullable = false,unique = true)
+    private String id;
+
+    /**
+     * 鏄剧ず鏂囨湰
+     */
+    @Column(nullable = false)
+    private String name;
+
+    /**
+     * 鏈嶅姟鍚嶇О
+     */
+    @Column(nullable = false)
+    private String serviceName;
+
+    /**
+     * 鑾峰彇鏁伴噺鐨刄rl
+     */
+    @Column(nullable = false)
+    private String countUrl;
+
+    /**
+     * 鐐瑰嚮鍚庣殑閾炬帴鍦板潃
+     */
+    @Column(nullable = false)
+    private String uiUrl;
+
+    @Override
+    public String getId() {
+        return id;
+    }
+
+    @Override
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getServiceName() {
+        return serviceName;
+    }
+
+    public void setServiceName(String serviceName) {
+        this.serviceName = serviceName;
+    }
+
+    public String getCountUrl() {
+        return countUrl;
+    }
+
+    public void setCountUrl(String countUrl) {
+        this.countUrl = countUrl;
+    }
+
+    public String getUiUrl() {
+        return uiUrl;
+    }
+
+    public void setUiUrl(String uiUrl) {
+        this.uiUrl = uiUrl;
+    }
+
+    @Override
+    public String toString() {
+        return "WebHomeTaskActionDO{" +
+                "id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", serviceName='" + serviceName + '\'' +
+                ", countUrl='" + countUrl + '\'' +
+                ", uiUrl='" + uiUrl + '\'' +
+                "} " + super.toString();
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/other/BdSelectInputCharAspect.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/other/BdSelectInputCharAspect.java
new file mode 100644
index 0000000..16bff3c
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/other/BdSelectInputCharAspect.java
@@ -0,0 +1,182 @@
+package com.vci.web.other;
+
+import com.vci.web.annotation.BdSelectInput;
+import com.vci.web.dao.BdSelectInputCharDaoI;
+import com.vci.web.model.BdSelectInputCharDO;
+import com.vci.web.util.WebUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.After;
+import org.aspectj.lang.annotation.AfterReturning;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.core.DefaultParameterNameDiscoverer;
+import org.springframework.core.ParameterNameDiscoverer;
+import org.springframework.stereotype.Component;
+
+
+import javax.annotation.Resource;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 鍙互杈撳叆涔熷彲浠ラ�夋嫨鐨勫垏闈㈢▼搴�
+ * @author weidy
+ * @date 2022-3-16
+ */
+@Aspect
+@Component
+public class BdSelectInputCharAspect {
+
+    /**
+     * 褰撳墠绫荤殑鏃ュ織杈撳嚭
+     */
+    private Logger logger = LoggerFactory.getLogger(getClass());
+
+    /**
+     * 鏁版嵁鎿嶄綔绫�
+     */
+    @Resource
+    private BdSelectInputCharDaoI selectInputCharDao;
+
+    /**
+     * 鎵�鏈夌殑BdSelectInput娉ㄨВ鐨�
+     */
+    @Pointcut("execution(public * com.vci..*.*(..)) && @target(com.vci.web.annotation.BdSelectInput) ")
+    public void selectInputChar(){
+
+    }
+
+    /**
+     * 鎵ц瀹屾垚鍚庤褰�
+     * @param joinPoint 鍒囧叆鐐�
+     */
+    @AfterReturning(pointcut = "selectInputChar()",returning = "returnVal")
+    public void saveChar(JoinPoint joinPoint,Object returnVal){
+        try {
+            Method method = getMethod(joinPoint);
+            //鑾峰彇鏂规硶涓婄殑鍙傛暟
+            BdSelectInput selectInput = method.getAnnotation(BdSelectInput.class);
+            if (selectInput == null) {
+                method.getDeclaredAnnotation(BdSelectInput.class);
+            }
+            if (selectInput != null) {
+                String fieldString = selectInput.value();
+                ParameterNameDiscoverer pnd = new DefaultParameterNameDiscoverer();
+                String[] parameterNames = pnd.getParameterNames(method);
+                Object[] args = joinPoint.getArgs();
+                //浠庡弬鏁伴噷闈㈡壘鍒板搴旂殑鍊�
+                String value = getValueFromParam(fieldString, parameterNames, args);
+                String flag = selectInput.flag();
+                String namespace = selectInput.namespace();
+                if (flag == null) {
+                    flag = "default";
+                }
+                if (namespace == null) {
+                    namespace = "default";
+                }
+                if (StringUtils.isNotBlank(value)) {
+                    BdSelectInputCharDO sic = new BdSelectInputCharDO();
+                    sic.setSourceNameSpace(namespace);
+                    sic.setSourceInputFlag(flag);
+                    sic.setId(value);
+                    if (logger.isInfoEnabled()) {
+                        logger.info("鏈淇濆瓨鐨勫瓧绗﹀唴瀹�,{0}", sic.toString());
+                    }
+                    selectInputCharDao.insert(sic);
+                }
+            }
+        }catch (Throwable e){
+            logger.error("鍒囬潰璁板綍鍙�夊瓧绗︾殑鏃跺�欏嚭閿�",e);
+        }
+    }
+
+    /**
+     * 澶氫釜鍒嗛殧绗�
+     */
+    public static final String SEP = "${SEP}";
+
+    /**
+     * 浠庡弬鏁伴噷鑾峰彇鍊�
+     * @param fieldString 瀛楁鐨勮〃杈惧紡
+     * @param parameterNames 鍙傛暟鐨勫悕瀛�
+     * @param args 鍙傛暟鐨勫璞�
+     * @return 璁板綍鐨勫��
+     */
+    private String getValueFromParam(String fieldString, String[] parameterNames, Object[] args) {
+        String value = "";
+        String[] split = fieldString.split(".");
+        if(split.length>0) {
+            String paramName = split[0];
+            for (int i = 0; i < parameterNames.length; i++) {
+                if (paramName.equalsIgnoreCase(parameterNames[i])) {
+                    Object param = args[i];
+                    //鍦ㄧ湅鐪嬮噷闈㈢殑鍐呭
+                    if (split.length == 1) {
+                        //鍙湁涓�涓紝閭e氨鏄繖涓弬鏁颁簡
+                        if(param!=null){
+                            value = param.toString();
+                        }
+                    }else{
+                        //绗簩灞�
+                        Object fieldValue = WebUtil.getValueFromField(split[1],param);
+                        if(fieldValue instanceof Collection){
+                            List<String> values = new ArrayList<>();
+                            ((Collection)fieldValue).stream().forEach(fv ->{
+                                if (split.length > 2) {
+                                    //璇存槑杩樿寰�涓嬫壘
+                                    Object fromField = WebUtil.getValueFromField(split[2], fv);
+                                    values.add(WebUtil.getStringValueFromObject(fromField));
+                                } else {
+                                    values.add(WebUtil.getStringValueFromObject(fv));
+                                }
+                            });
+                            value = values.stream().collect(Collectors.joining(SEP));
+                        }else if(fieldValue instanceof Map){
+                            List<String> values = new ArrayList<>();
+                            ((Map)fieldValue).values().stream().forEach(fv ->{
+                                if (split.length > 2) {
+                                    //璇存槑杩樿寰�涓嬫壘
+                                    Object fromField = WebUtil.getValueFromField(split[2], fv);
+                                    values.add(WebUtil.getStringValueFromObject(fromField));
+                                } else {
+                                    values.add(WebUtil.getStringValueFromObject(fv));
+                                }
+                            });
+                            value = values.stream().collect(Collectors.joining(SEP));
+                        }else {
+                            if (split.length > 2) {
+                                //璇存槑杩樿寰�涓嬫壘
+                                fieldValue = WebUtil.getValueFromField(split[2], fieldValue);
+                                value = WebUtil.getStringValueFromObject(fieldValue);
+                            } else {
+                                value = WebUtil.getStringValueFromObject(fieldValue);
+                            }
+                        }
+                    }
+                    break;
+                }
+            }
+        }
+        return value;
+    }
+
+
+    /**
+     * 鑾峰彇琚皟鐢ㄧ殑鏂规硶
+     * @param joinPoint 鍒囧叆鐐�
+     * @return 璋冪敤鐨勬柟娉�
+     */
+    public Method getMethod(JoinPoint joinPoint){
+        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
+        Method method = signature.getMethod();
+        return method;
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/other/FlowNoticeExample.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/other/FlowNoticeExample.java
new file mode 100644
index 0000000..e3b85bf
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/other/FlowNoticeExample.java
@@ -0,0 +1,36 @@
+package com.vci.web.other;
+
+import com.vci.web.annotation.FlowNotifyAfter;
+import com.vci.web.annotation.FlowNotifyBefore;
+import com.vci.web.annotation.FlowNotifyWeb;
+import com.vci.web.bo.FlowNoticeInfo;
+
+/**
+ * 娴佺▼閫氱煡鐨勭ず渚�
+ * @author weidy
+ * @date 2022-04-22
+ */
+@FlowNotifyWeb
+public class FlowNoticeExample {
+    /**
+     * 鍙戣捣娴佺▼鍜屾墽琛屼换鍔′箣鍓�
+     * @param noticeInfo 閫氱煡鐨勪俊鎭�
+     */
+    @FlowNotifyBefore
+    public void callBefore(FlowNoticeInfo noticeInfo){
+        //涓嶈鎵ц娴佺▼灏辩洿鎺ユ姏鍑哄紓甯�
+        //鍙戣捣娴佺▼浼氭湁鍚姩鐩稿叧鐨勪俊鎭紝鍙互鎺у埗鏄惁鍙互鍙戣捣娴佺▼
+        //鎵ц浠诲姟鏈夎矾鐢辩殑淇℃伅
+        System.out.println(noticeInfo.toString());
+    }
+
+    /**
+     * 娴佺▼鍙戣捣涔嬪悗鍜屼换鍔℃墽琛屼箣鍚�
+     * @param noticeInfo 鏈夊緟鍔炰换鍔$瓑淇℃伅
+     */
+    @FlowNotifyAfter
+    public void callAfter(FlowNoticeInfo noticeInfo){
+        //鏈夊紓甯镐篃涓嶅奖鍝嶆祦绋嬫湰韬簡锛屾墍浠ュ缓璁嚜琛屽瓨鍌ㄥ唴瀹�
+        System.out.println(noticeInfo.toString());
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/other/OsMapToObjFunction.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/other/OsMapToObjFunction.java
new file mode 100644
index 0000000..b40ede2
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/other/OsMapToObjFunction.java
@@ -0,0 +1,21 @@
+package com.vci.web.other;
+
+import plm.bs.bom.clientobject.ClientBusinessObject;
+
+import java.util.Map;
+
+/**
+ * 瀵硅薄鏈嶅姟涓紝map杞垚VO鐨勫璞�
+ * @author weidy
+ * @date 2022-1-19
+ * @param <T> vo鐨勭被鍨�
+ */
+@FunctionalInterface
+public interface OsMapToObjFunction<T> {
+    /**
+     * 杞崲
+     * @param data 鏁版嵁鐨勬槧灏�
+     * @param obj 瀵硅薄
+     */
+    void convert(ClientBusinessObject data, T obj);
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/other/VciFileDownloadInfo.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/other/VciFileDownloadInfo.java
new file mode 100644
index 0000000..c0fcc74
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/other/VciFileDownloadInfo.java
@@ -0,0 +1,75 @@
+package com.vci.web.other;
+
+import com.vci.corba.common.VCIError;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 涓嬭浇鏂囦欢鐨勭嚎绋嬪瓨鍌ㄧ殑淇℃伅
+ */
+public class VciFileDownloadInfo {
+
+    static final Object syncObject = new Object();
+
+    private static Map<String,Map<String,String>> downloadFileInfo = new HashMap<String, Map<String,String>>();
+
+    /**
+     * 娣诲姞淇℃伅
+     * @param clientPath 涓存椂鏂囦欢澶圭殑淇℃伅
+     * @param fileOid 鏂囦欢涓婚敭
+     * @param errorInfo 閿欒淇℃伅
+     */
+    public  static void addDownloadFileInfo(String clientPath,String fileOid,String errorInfo){
+        synchronized (syncObject) {
+            Map<String,String> errorMap = new HashMap<String, String>();
+            if(downloadFileInfo.containsKey(clientPath)){
+                errorMap = downloadFileInfo.get(clientPath);
+            }
+            errorMap.put(fileOid,errorInfo);
+            downloadFileInfo.put(clientPath, errorMap);
+        }
+    }
+
+
+
+    /**
+     * 绉婚櫎閿欒淇℃伅
+     * @param clientPath 涓存椂鏂囦欢澶圭殑淇℃伅
+     */
+    public  static void removeDownloadFileInfo(String clientPath){
+        synchronized (syncObject){
+            downloadFileInfo.remove(clientPath);
+        }
+    }
+
+    /**
+     * 鑾峰彇閿欒淇℃伅
+     * @param clientPath 涓存椂鏂囦欢澶圭殑淇℃伅
+     * @return
+     */
+    public static Map<String,String> getDownloadFileInfo(String clientPath){
+        return downloadFileInfo.get(clientPath);
+    }
+
+    /**
+     * 鏄惁鏈夐敊璇俊鎭�
+     * @param clientPath
+     * @return
+     */
+    public static boolean isHasErrorInfo(String clientPath){
+        synchronized (syncObject){
+            return downloadFileInfo.containsKey(clientPath);
+        }
+    }
+
+    public static void getDownloadErrorInfo(String clientPath) throws VCIError{
+        Map<String,String> errorMap = getDownloadFileInfo(clientPath);
+        String errorMsg = "";
+        String[] errorArray = errorMap.values().toArray(new String[0]);
+        VciFileDownloadInfo.removeDownloadFileInfo(clientPath);
+        errorMsg = errorArray[0] +(errorArray.length>1?("锛涘彟鏈�" + errorArray.length + "涓枃浠朵篃鍑虹幇浜嗛敊璇�"):"");
+        throw new VCIError(errorMsg,errorArray);
+    }
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/other/WorkFlowEndedNotice.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/other/WorkFlowEndedNotice.java
new file mode 100644
index 0000000..2d038a1
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/other/WorkFlowEndedNotice.java
@@ -0,0 +1,81 @@
+package com.vci.web.other;
+
+import com.vci.corba.common.VCIError;
+import com.vci.starter.web.constant.QueryOptionConstant;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.web.annotation.FlowNotifyBefore;
+import com.vci.web.annotation.FlowNotifyWeb;
+import com.vci.web.bo.FlowNoticeInfo;
+import com.vci.web.service.WebBoServiceI;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import plm.bs.bom.clientobject.ClientBusinessObject;
+import plm.bs.bom.clientobject.ClientBusinessObjectOperation;
+
+import java.util.*;
+
+/**
+ * Description: 娴佺▼缁堟鏃讹紝鎭㈠CodeAllCode鐘舵��
+ *
+ * @author LiHang
+ * @date Created on 2022/5/6
+ */
+@FlowNotifyWeb
+public class WorkFlowEndedNotice {
+    /**
+     * 褰撳墠绫荤殑鏃ュ織杈撳嚭
+     */
+    private Logger logger = LoggerFactory.getLogger(getClass());
+
+    @Autowired
+    private WebBoServiceI boService;
+
+    @FlowNotifyBefore
+    public void callBefore(FlowNoticeInfo noticeInfo) {
+        try {
+            if ("end".equals(noticeInfo.getOutcome())) {
+                logger.info("褰撳墠鏄祦绋嬬粓姝㈡搷浣滐紝寮�濮嬫仮澶嶇紪鐮佺敓鍛藉懆鏈�");
+                List<Map> finishItemList = noticeInfo.getFinishItemList();
+                String wfOid = String.valueOf(finishItemList.get(finishItemList.size() - 1).get("oid"));
+                if (StringUtils.isBlank(wfOid)) {
+                    logger.info("娌℃湁鎵惧埌娴佺▼涓婚敭");
+                    return;
+                }
+
+                String sql = "SELECT T_OID,T_BTWNAME FROM PLATFORMLT_INPUT WHERE F_OID = '" + wfOid + "'";
+                ClientBusinessObjectOperation operation = new ClientBusinessObjectOperation();
+                List<ClientBusinessObject> queryResult = boService.queryBySql(sql, new HashMap<>());
+                if (queryResult.size() == 0) {
+                    logger.info("娌℃湁鎵惧埌涓氬姟鏁版嵁");
+                    return;
+                }
+                String btmName = queryResult.get(0).getAttributeValue("t_btwname");
+                String oid = queryResult.get(0).getAttributeValue("t_oid");
+                String querySql = "select cac.oid from PLATFORMBTM_CODEALLCODE cac\n" +
+                        " left join PLATFORMBTM_" + btmName + " wp on cac.CREATECODEOID = wp.OID\n" +
+                        " where wp.OID = '" + oid + "'";
+                Map<String, String> conditionMap = new HashMap<>();
+                conditionMap.put("oid", oid);
+                List<ClientBusinessObject> codeResult = boService.queryCBO(btmName, conditionMap);
+                conditionMap.clear();
+                conditionMap.put("createCodeOid", codeResult.get(0).getAttributeValue("oid"));
+                List<ClientBusinessObject> allCodeList = boService.queryCBO("codeAllCode", conditionMap);
+                if (allCodeList.size() == 0) {
+                    logger.info("娌℃湁鎵惧埌缂栫爜");
+                    return;
+                }
+                for (ClientBusinessObject codeAllCode : allCodeList) {
+                    codeAllCode.setLcStatus("Editing");
+                    codeAllCode.setAttributeValue("lcstatus", "Editing");
+                }
+                operation.batchUpdateBuinessObject(allCodeList.toArray(new ClientBusinessObject[0]));
+                logger.info("缂栫爜鐢熷懡鍛ㄦ湡鎭㈠瀹屾垚");
+            }
+        } catch (VCIError e) {
+            e.printStackTrace();
+        }
+    }
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/BatchCBO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/BatchCBO.java
new file mode 100644
index 0000000..7f49588
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/BatchCBO.java
@@ -0,0 +1,229 @@
+package com.vci.web.pageModel;
+
+import org.springframework.util.CollectionUtils;
+import plm.bs.bom.clientobject.ClientBusinessObject;
+import plm.bs.bom.clientobject.ClientLinkObject;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * 鎿嶄綔鐨勪笟鍔$被鍨嬪拰閾炬帴绫诲瀷鐨勬暟鎹�
+ * @author weidy
+ * @date 2021-12-2
+ */
+public class BatchCBO {
+
+	/**
+	 * 绌虹殑涓氬姟绫诲瀷鏁扮粍
+	 */
+	private ClientBusinessObject[] nullCboArray = new ClientBusinessObject[0];
+
+	/**
+	 * 绌虹殑閾炬帴绫诲瀷鏁扮粍
+	 */
+	private ClientLinkObject[] nullCloArray = new ClientLinkObject[0];
+
+	/**
+	 * 鍒涘缓鐨勪笟鍔$被鍨�
+	 */
+	private Set<ClientBusinessObject> createCbos = new HashSet<ClientBusinessObject>();
+
+	/**
+	 * 鍒涘缓鐨勯摼鎺ョ被鍨�
+	 */
+	private Set<ClientLinkObject> createClos = new HashSet<ClientLinkObject>();
+
+	/**
+	 * 鏇存柊鐨勪笟鍔$被鍨�
+	 */
+	private Set<ClientBusinessObject> updateCbos = new HashSet<ClientBusinessObject>();
+
+	/**
+	 * 鏇存柊鐨勯摼鎺ョ被鍨�
+	 */
+	private Set<ClientLinkObject> updateClos = new HashSet<ClientLinkObject>();
+
+	/**
+	 * 鍒犻櫎涓氬姟绫诲瀷
+	 */
+	private Set<ClientBusinessObject> deleteCbos = new HashSet<ClientBusinessObject>();
+
+	/**
+	 * 鍒犻櫎鐨勯摼鎺ョ被鍨�
+	 */
+	private Set<ClientLinkObject> deleteClos = new HashSet<ClientLinkObject>();
+
+	/**
+	 * 鏉ユ簮鏁版嵁闆嗗悎
+	 */
+	private Set<Object> sourceObjectList = new HashSet<Object>();
+
+	/**
+	 * 鏉ユ簮鏁版嵁
+	 */
+	private Object sourceObject = new HashSet<Object>();
+
+	/**
+	 * 浠庡叾浠栫殑鎷疯礉
+	 * @param otherCBO 鍏朵粬鐨勪俊鎭�
+	 */
+	public void copyFromOther(BatchCBO otherCBO){
+		if(otherCBO!=null){
+			if(!CollectionUtils.isEmpty(otherCBO.getCreateCbos())){
+				getCreateCbos().addAll(otherCBO.getCreateCbos());
+			}
+			if(!CollectionUtils.isEmpty(otherCBO.getUpdateCbos())){
+				getUpdateCbos().addAll(otherCBO.getUpdateCbos());
+			}
+			if(!CollectionUtils.isEmpty(otherCBO.getDeleteCbos())){
+				getDeleteCbos().addAll(otherCBO.getDeleteCbos());
+			}
+			if(!CollectionUtils.isEmpty(otherCBO.getCreateClos())){
+				getCreateClos().addAll(otherCBO.getCreateClos());
+			}
+			if(!CollectionUtils.isEmpty(otherCBO.getUpdateClos())){
+				getUpdateClos().addAll(otherCBO.getUpdateClos());
+			}
+			if(!CollectionUtils.isEmpty(otherCBO.getDeleteClos())){
+				getDeleteClos().addAll(otherCBO.getDeleteClos());
+			}
+		}
+	}
+	
+	public void addCreateCbo(ClientBusinessObject cbo){
+		this.createCbos.add(cbo);
+	}
+	
+	public void addCreateClo(ClientLinkObject clo){
+		this.createClos.add(clo);
+	}
+	
+	public void addUpdateCbo(ClientBusinessObject cbo){
+		this.updateCbos.add(cbo);
+	}
+	
+	public void addUpdateClo(ClientLinkObject clo){
+		this.updateClos.add(clo);
+	}
+	
+	public void addDeleteCbo(ClientBusinessObject cbo){
+		this.deleteCbos.add(cbo);
+	}
+	
+	public void addDeleteClo(ClientLinkObject clo){
+		this.deleteClos.add(clo);
+	}
+	
+	
+	public ClientBusinessObject[] getCreateCboArray(){
+		if( this.createCbos == null){
+			this.createCbos = new HashSet<ClientBusinessObject>();
+		}
+		return this.createCbos.stream().sorted(((o1, o2) -> o1.getCreateTime().compareTo(o2.getCreateTime()))).collect(Collectors.toList()).toArray(nullCboArray);
+	}
+	
+	public ClientLinkObject[] getCreateCloArray(){
+		if( this.createClos == null){
+			this.createClos = new HashSet<ClientLinkObject>();
+		}
+		return this.createClos.stream().sorted(((o1, o2) -> o1.getCreateTime().compareTo(o2.getCreateTime()))).collect(Collectors.toList()).toArray(nullCloArray);
+	}
+	
+
+	public ClientBusinessObject[] getUpdateCboArray(){
+		if( this.updateCbos == null){
+			this.updateCbos = new HashSet<ClientBusinessObject>();
+		}
+		return this.updateCbos.stream().sorted(((o1, o2) -> o1.getCreateTime().compareTo(o2.getCreateTime()))).collect(Collectors.toList()).toArray(nullCboArray);
+	}
+	
+	public ClientLinkObject[] getUpdateCloArray(){
+		if( this.updateClos == null){
+			this.updateClos = new HashSet<ClientLinkObject>();
+		}
+		return this.updateClos.stream().sorted(((o1, o2) -> o1.getCreateTime().compareTo(o2.getCreateTime()))).collect(Collectors.toList()).toArray(nullCloArray);
+	}
+
+	public ClientBusinessObject[] getDeleteCboArray(){
+		if( this.deleteCbos == null){
+			this.deleteCbos = new HashSet<ClientBusinessObject>();
+		}
+		return this.deleteCbos.toArray(nullCboArray);
+	}
+	
+	public ClientLinkObject[] getDeleteCloArray(){
+		if( this.deleteClos == null){
+			this.deleteClos = new HashSet<ClientLinkObject>();
+		}
+		return this.deleteClos.toArray(nullCloArray);
+	}
+
+	public Set<ClientBusinessObject> getCreateCbos() {
+		return createCbos;
+	}
+
+	public void setCreateCbos(Set<ClientBusinessObject> createCbos) {
+		this.createCbos = createCbos;
+	}
+
+	public Set<ClientLinkObject> getCreateClos() {
+		return createClos;
+	}
+
+	public void setCreateClos(Set<ClientLinkObject> createClos) {
+		this.createClos = createClos;
+	}
+
+	public Set<ClientBusinessObject> getUpdateCbos() {
+		return updateCbos;
+	}
+
+	public void setUpdateCbos(Set<ClientBusinessObject> updateCbos) {
+		this.updateCbos = updateCbos;
+	}
+
+	public Set<ClientLinkObject> getUpdateClos() {
+		return updateClos;
+	}
+
+	public void setUpdateClos(Set<ClientLinkObject> updateClos) {
+		this.updateClos = updateClos;
+	}
+
+	public Set<ClientBusinessObject> getDeleteCbos() {
+		return deleteCbos;
+	}
+
+	public void setDeleteCbos(Set<ClientBusinessObject> deleteCbos) {
+		this.deleteCbos = deleteCbos;
+	}
+
+	public Set<ClientLinkObject> getDeleteClos() {
+		return deleteClos;
+	}
+
+	public void setDeleteClos(Set<ClientLinkObject> deleteClos) {
+		this.deleteClos = deleteClos;
+	}
+
+	public Set<Object> getSourceObjectList() {
+		return sourceObjectList;
+	}
+
+	public void setSourceObjectList(Set<Object> sourceObjectList) {
+		this.sourceObjectList = sourceObjectList;
+	}
+
+	public Object getSourceObject() {
+		return sourceObject;
+	}
+
+	public void setSourceObject(Object sourceObject) {
+		this.sourceObject = sourceObject;
+	}
+	
+	
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/BdSelectInputCharVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/BdSelectInputCharVO.java
new file mode 100644
index 0000000..38d6257
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/BdSelectInputCharVO.java
@@ -0,0 +1,68 @@
+package com.vci.web.pageModel;
+
+import java.lang.*;
+import java.util.Date;
+
+import com.vci.starter.web.pagemodel.BaseModelVO;
+
+/**
+ * 鍙緭鍙�夊唴瀹规樉绀哄璞�
+ * 
+ * @author weidy
+ * @date 2022-03-09
+ */
+public class BdSelectInputCharVO extends BaseModelVO {
+
+	/**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+	private static final long serialVersionUID = 4615707120353995567L;
+
+	/**
+	* 杈撳叆鏉ユ簮
+	*/
+	private String sourceinputflag;
+
+
+	/**
+	* 鏁版嵁鎵�灞為鍩�
+	*/
+	private String sourcenamespace;
+
+
+
+	/**
+	 * 鑾峰彇 杈撳叆鏉ユ簮
+	 */
+	public String getSourceinputflag (){
+		return sourceinputflag;
+	}
+
+	/**
+	* 璁剧疆 杈撳叆鏉ユ簮
+	*/
+	public void setSourceinputflag (String sourceinputflag){
+		this.sourceinputflag = sourceinputflag;
+	}
+	/**
+	 * 鑾峰彇 鏁版嵁鎵�灞為鍩�
+	 */
+	public String getSourcenamespace (){
+		return sourcenamespace;
+	}
+
+	/**
+	* 璁剧疆 鏁版嵁鎵�灞為鍩�
+	*/
+	public void setSourcenamespace (String sourcenamespace){
+		this.sourcenamespace = sourcenamespace;
+	}
+
+	@Override
+	public String toString() {
+		return "BdSelectInputCharVO{" +
+		"sourceinputflag='" + sourceinputflag +"'," +
+		"sourcenamespace='" + sourcenamespace +"'," +
+		"}" + super.toString();
+	}
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/KeyValue.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/KeyValue.java
new file mode 100644
index 0000000..90a4946
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/KeyValue.java
@@ -0,0 +1,46 @@
+package com.vci.web.pageModel;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class KeyValue implements java.io.Serializable {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 7708882804529442626L;
+
+	private String key;
+	
+	private String value;
+	
+	private Map<String,Object> attributes = new HashMap<String, Object>();
+			
+	public String getKey() {
+		return key;
+	}
+
+	public void setKey(String key) {
+		this.key = key;
+	}
+
+	public String getValue() {
+		return value;
+	}
+
+	public void setValue(String value) {
+		this.value = value;
+	}
+
+	public Map<String, Object> getAttributes() {
+		return attributes;
+	}
+
+	public void setAttributes(Map<String, Object> attributes) {
+		this.attributes = attributes;
+	} 
+	
+	public void addAttr(String attr,Object attrValue){
+		this.attributes.put(attr, attrValue);
+	}
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/LinkTypeInfoVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/LinkTypeInfoVO.java
new file mode 100644
index 0000000..c8abc1e
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/LinkTypeInfoVO.java
@@ -0,0 +1,75 @@
+package com.vci.web.pageModel;
+
+/**
+ * 閾炬帴绫诲瀷鐨勪俊鎭�
+ * @author weidy
+ * @date 2021-2-12
+ */
+public class LinkTypeInfoVO implements java.io.Serializable{
+
+	/**
+	 * 搴忓垪鍖�
+	 */
+	private static final long serialVersionUID = -2562725555768039608L;
+	/**
+	 * 閾炬帴绫诲瀷鑻辨枃鍚嶇О
+	 */
+	private String name;
+
+	/**
+	 * 鏄惁鍙嶅悜
+	 */
+	private boolean direction;
+
+	/**
+	 * 灞傜骇
+	 */
+	private int level;
+
+	/**
+	 * to绔殑涓氬姟绫诲瀷
+	 */
+	private String toBtwname;
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public boolean isDirection() {
+		return direction;
+	}
+
+	public void setDirection(boolean direction) {
+		this.direction = direction;
+	}
+
+	public int getLevel() {
+		return level;
+	}
+
+	public void setLevel(int level) {
+		this.level = level;
+	}
+
+	public String getToBtwname() {
+		return toBtwname;
+	}
+
+	public void setToBtwname(String toBtwname) {
+		this.toBtwname = toBtwname;
+	}
+
+	@Override
+	public String toString() {
+		return "LinkTypeInfoVO{" +
+				"name='" + name + '\'' +
+				", direction=" + direction +
+				", level=" + level +
+				", toBtwname='" + toBtwname + '\'' +
+				'}';
+	}
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsAttributeVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsAttributeVO.java
new file mode 100644
index 0000000..96db0fc
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsAttributeVO.java
@@ -0,0 +1,346 @@
+package com.vci.web.pageModel;
+
+import java.util.Date;
+
+/**
+ * 灞炴�х殑鏄剧ず瀵硅薄
+ * @author weidy
+ * @date 2019/10/11 4:29 PM
+ */
+public class OsAttributeVO implements java.io.Serializable{
+
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = -7614130038164908555L;
+
+    /**
+     * 涓婚敭
+     */
+    private String oid;
+
+    /**
+     * 灞炴�ц嫳鏂囧悕绉�
+     */
+    private String id;
+
+    /**
+     * 灞炴�т腑鏂囧悕绉�
+     */
+    private String name;
+
+    /**
+     * 鎻忚堪
+     */
+    private String description;
+
+    /**
+     * 灞炴�х被鍨嬶紝浣跨敤鏋氫妇VciFieldTypeEnum
+     */
+    private String attributeDataType;
+
+    /**
+     * 灞炴�х被鍨嬫樉绀烘枃鏈�
+     */
+    private String attributeDataTypeText;
+
+    /**
+     * 鏄惁鍙互涓虹┖
+     */
+    private boolean nullableFlag;
+
+    /**
+     * 榛樿鍊�
+     */
+    private String defaultValue;
+
+    /**
+     * 浣跨敤鏋氫妇鑻辨枃鍚嶇О
+     */
+    private String enumId;
+
+    /**
+     * 浣跨敤鏋氫妇鐨勪腑鏂囧悕绉�
+     */
+    private String enumName;
+
+
+    /**
+     * 鍙傜収鐨勪笟鍔$被鍨嬬紪鍙�
+     */
+    private String btmTypeId;
+
+    /**
+     * 鍙傜収鐨勪笟鍔$被鍨嬪悕绉�
+     */
+    private String btmTypeName;
+
+    /**
+     * 灞炴�х殑闀垮害
+     */
+    private Integer attrLength;
+
+    /**
+     * 灏忔暟绮惧害浣嶆暟
+     */
+    private Integer precisionLength;
+
+    /**
+     * 灏忔暟鍒诲害浣嶆暟
+     */
+    private Integer scaleLength;
+
+    /**
+     * 鍙栧�艰寖鍥�
+     */
+    private String range;
+
+    /**
+     * 涓氬姟绫诲瀷鍚嶇О,鏄�艰繖鏉℃暟鎹殑涓氬姟绫诲瀷锛屼笉鏄睘鎬ф墍灞炵殑涓氬姟绫诲瀷
+     */
+    private String btmname;
+
+    /**
+     * 鎷ユ湁鑰�
+     */
+    private String owner;
+
+    /**
+     * 鍒涘缓浜�
+     */
+    private String creator;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    private Date createTime;
+
+    /**
+     * 鏈�鍚庝慨鏀逛汉
+     */
+    private String lastModifier;
+
+    /**
+     * 鏈�鍚庝慨鏀规椂闂达紝鏍煎紡鏄痽yyy-MM-dd HH:mm:ss.SSS
+     */
+    private Date lastModifyTime;
+
+    /**
+     * 鏃堕棿鎴筹紝鏍煎紡鏄痽yyy-MM-dd HH:mm:ss.SSS
+     */
+    private Date ts;
+
+    public String getOid() {
+        return oid;
+    }
+
+    public void setOid(String oid) {
+        this.oid = oid;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getAttributeDataType() {
+        return attributeDataType;
+    }
+
+    public void setAttributeDataType(String attributeDataType) {
+        this.attributeDataType = attributeDataType;
+    }
+
+    public String getAttributeDataTypeText() {
+        return attributeDataTypeText;
+    }
+
+    public void setAttributeDataTypeText(String attributeDataTypeText) {
+        this.attributeDataTypeText = attributeDataTypeText;
+    }
+
+    public boolean isNullableFlag() {
+        return nullableFlag;
+    }
+
+    public void setNullableFlag(boolean nullableFlag) {
+        this.nullableFlag = nullableFlag;
+    }
+
+    public String getDefaultValue() {
+        return defaultValue;
+    }
+
+    public void setDefaultValue(String defaultValue) {
+        this.defaultValue = defaultValue;
+    }
+
+    public String getEnumId() {
+        return enumId;
+    }
+
+    public void setEnumId(String enumId) {
+        this.enumId = enumId;
+    }
+
+    public String getEnumName() {
+        return enumName;
+    }
+
+    public void setEnumName(String enumName) {
+        this.enumName = enumName;
+    }
+
+    public String getBtmTypeId() {
+        return btmTypeId;
+    }
+
+    public void setBtmTypeId(String btmTypeId) {
+        this.btmTypeId = btmTypeId;
+    }
+
+    public String getBtmTypeName() {
+        return btmTypeName;
+    }
+
+    public void setBtmTypeName(String btmTypeName) {
+        this.btmTypeName = btmTypeName;
+    }
+
+    public Integer getAttrLength() {
+        return attrLength;
+    }
+
+    public void setAttrLength(Integer attrLength) {
+        this.attrLength = attrLength;
+    }
+
+    public Integer getPrecisionLength() {
+        return precisionLength;
+    }
+
+    public void setPrecisionLength(Integer precisionLength) {
+        this.precisionLength = precisionLength;
+    }
+
+    public String getRange() {
+        return range;
+    }
+
+    public void setRange(String range) {
+        this.range = range;
+    }
+
+    public String getCreator() {
+        return creator;
+    }
+
+    public void setCreator(String creator) {
+        this.creator = creator;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getLastModifier() {
+        return lastModifier;
+    }
+
+    public void setLastModifier(String lastModifier) {
+        this.lastModifier = lastModifier;
+    }
+
+    public Date getLastModifyTime() {
+        return lastModifyTime;
+    }
+
+    public void setLastModifyTime(Date lastModifyTime) {
+        this.lastModifyTime = lastModifyTime;
+    }
+
+    public Date getTs() {
+        return ts;
+    }
+
+    public void setTs(Date ts) {
+        this.ts = ts;
+    }
+
+
+    public String getBtmname() {
+        return btmname;
+    }
+
+    public void setBtmname(String btmname) {
+        this.btmname = btmname;
+    }
+
+    public String getOwner() {
+        return owner;
+    }
+
+    public void setOwner(String owner) {
+        this.owner = owner;
+    }
+
+    public Integer getScaleLength() {
+        return scaleLength;
+    }
+
+    public void setScaleLength(Integer scaleLength) {
+        this.scaleLength = scaleLength;
+    }
+
+    @Override
+    public String toString() {
+        return "OsAttributeVO{" +
+                "oid='" + oid + '\'' +
+                ", id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", description='" + description + '\'' +
+                ", attributeDataType='" + attributeDataType + '\'' +
+                ", attributeDataTypeText='" + attributeDataTypeText + '\'' +
+                ", nullableFlag=" + nullableFlag +
+                ", defaultValue='" + defaultValue + '\'' +
+                ", enumId='" + enumId + '\'' +
+                ", enumName='" + enumName + '\'' +
+                ", btmTypeId='" + btmTypeId + '\'' +
+                ", btmTypeName='" + btmTypeName + '\'' +
+                ", attrLength=" + attrLength +
+                ", precisionLength=" + precisionLength +
+                ", scaleLength=" + scaleLength +
+                ", range='" + range + '\'' +
+                ", btmname='" + btmname + '\'' +
+                ", owner='" + owner + '\'' +
+                ", creator='" + creator + '\'' +
+                ", createTime=" + createTime +
+                ", lastModifier='" + lastModifier + '\'' +
+                ", lastModifyTime=" + lastModifyTime +
+                ", ts=" + ts +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsBtmTypeAttributeVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsBtmTypeAttributeVO.java
new file mode 100644
index 0000000..ad5d080
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsBtmTypeAttributeVO.java
@@ -0,0 +1,404 @@
+package com.vci.web.pageModel;
+
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * 涓氬姟绫诲瀷鍖呭惈鐨勫睘鎬у璞�
+ * @author weidy
+ * @date 2019/10/11 5:33 PM
+ */
+public class OsBtmTypeAttributeVO implements java.io.Serializable{
+
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = 114224750717125698L;
+
+    /**
+     * 涓婚敭
+     */
+    private String oid;
+
+    /**
+     * 鎵�灞炰笟鍔$被鍨�
+     */
+    private String pkBtmType;
+
+    /**
+     * 涓氬姟绫诲瀷鐨勭紪鍙�
+     */
+    private String btmTypeId;
+
+    /**
+     * 灞炴�х殑瀛楁鍚嶇О
+     */
+    private String id;
+
+    /**
+     * 灞炴�х殑涓枃鍚嶇О
+     */
+    private String name;
+
+    /**
+     * 灞炴�х殑闀垮害
+     */
+    private Integer attributeLength;
+
+    /**
+     * 灞炴�у湪鏈笟鍔$被鍨嬩腑鐨勬弿杩�
+     */
+    private String description;
+
+    /**
+     * 鏁版嵁绫诲瀷
+     */
+    private String attrDataType;
+
+    /**
+     * 鏄惁鍙互涓虹┖
+     */
+    private boolean nullableFlag;
+
+    /**
+     * 榛樿鍊�
+     */
+    private String defaultValue;
+
+
+    /**
+     * 灏忔暟绮惧害浣嶆暟
+     */
+    private Integer precisionLength;
+
+    /**
+     * 灏忔暟鍒诲害浣嶆暟
+     */
+    private Integer scaleLength;
+
+    /**
+     * 鍙栧�艰寖鍥�
+     */
+    private String range;
+
+    /**
+     * 鏄惁鍙傜収
+     */
+    private boolean referFlag;
+
+    /**
+     * 鍙傜収涓氬姟绫诲瀷
+     */
+    private String referBtmTypeId;
+
+    /**
+     * 鍙傜収涓氬姟绫诲瀷鍚嶇О
+     */
+    private String referBtmTypeName;
+
+    /**
+     * 鏋氫妇缂栧彿
+     */
+    private String enumId;
+
+    /**
+     * 鏋氫妇鍚嶇О
+     */
+    private String enumName;
+
+    /**
+     * 鏄惁鏋氫妇
+     */
+    private boolean enumFlag;
+
+    /**
+z     * 鍖呭惈鏋氫妇鐨勫��
+     */
+    private Map<String,String> enumItemMap;
+
+    /**
+     * 涓氬姟绫诲瀷鍚嶇О
+     */
+    private String btmname;
+
+    /**
+     * 鎷ユ湁鑰�
+     */
+    private String owner;
+
+    /**
+     * 鍒涘缓浜�
+     */
+    private String creator;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    private Date createTime;
+
+    /**
+     * 鏈�鍚庝慨鏀逛汉
+     */
+    private String lastModifier;
+
+    /**
+     * 鏈�鍚庝慨鏀规椂闂达紝鏍煎紡鏄痽yyy-MM-dd HH:mm:ss
+     */
+    private Date lastModifyTime;
+
+    /**
+     * 鏃堕棿鎴筹紝鏍煎紡鏄痽yyy-MM-dd HH:mm:ss.SSS
+     */
+    private Date ts;
+
+    public String getOid() {
+        return oid;
+    }
+
+    public void setOid(String oid) {
+        this.oid = oid;
+    }
+
+    public String getPkBtmType() {
+        return pkBtmType;
+    }
+
+    public void setPkBtmType(String pkBtmType) {
+        this.pkBtmType = pkBtmType;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getAttrDataType() {
+        return attrDataType;
+    }
+
+    public void setAttrDataType(String attrDataType) {
+        this.attrDataType = attrDataType;
+    }
+
+    public boolean isReferFlag() {
+        return referFlag;
+    }
+
+    public void setReferFlag(boolean referFlag) {
+        this.referFlag = referFlag;
+    }
+
+    public String getReferBtmTypeId() {
+        return referBtmTypeId;
+    }
+
+    public void setReferBtmTypeId(String referBtmTypeId) {
+        this.referBtmTypeId = referBtmTypeId;
+    }
+
+    public String getReferBtmTypeName() {
+        return referBtmTypeName;
+    }
+
+    public void setReferBtmTypeName(String referBtmTypeName) {
+        this.referBtmTypeName = referBtmTypeName;
+    }
+
+    public String getEnumId() {
+        return enumId;
+    }
+
+    public void setEnumId(String enumId) {
+        this.enumId = enumId;
+    }
+
+    public String getEnumName() {
+        return enumName;
+    }
+
+    public void setEnumName(String enumName) {
+        this.enumName = enumName;
+    }
+
+    public boolean isEnumFlag() {
+        return enumFlag;
+    }
+
+    public void setEnumFlag(boolean enumFlag) {
+        this.enumFlag = enumFlag;
+    }
+
+    public Map<String, String> getEnumItemMap() {
+        return enumItemMap;
+    }
+
+    public void setEnumItemMap(Map<String, String> enumItemMap) {
+        this.enumItemMap = enumItemMap;
+    }
+
+    public String getCreator() {
+        return creator;
+    }
+
+    public void setCreator(String creator) {
+        this.creator = creator;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getLastModifier() {
+        return lastModifier;
+    }
+
+    public void setLastModifier(String lastModifier) {
+        this.lastModifier = lastModifier;
+    }
+
+    public Date getLastModifyTime() {
+        return lastModifyTime;
+    }
+
+    public void setLastModifyTime(Date lastModifyTime) {
+        this.lastModifyTime = lastModifyTime;
+    }
+
+    public Date getTs() {
+        return ts;
+    }
+
+    public void setTs(Date ts) {
+        this.ts = ts;
+    }
+
+    public boolean isNullableFlag() {
+        return nullableFlag;
+    }
+
+    public void setNullableFlag(boolean nullableFlag) {
+        this.nullableFlag = nullableFlag;
+    }
+
+    public String getDefaultValue() {
+        return defaultValue;
+    }
+
+    public void setDefaultValue(String defaultValue) {
+        this.defaultValue = defaultValue;
+    }
+
+    public Integer getPrecisionLength() {
+        return precisionLength;
+    }
+
+    public void setPrecisionLength(Integer precisionLength) {
+        this.precisionLength = precisionLength;
+    }
+
+    public String getRange() {
+        return range;
+    }
+
+    public void setRange(String range) {
+        this.range = range;
+    }
+
+
+    public Integer getAttributeLength() {
+        return attributeLength;
+    }
+
+    public void setAttributeLength(Integer attributeLength) {
+        this.attributeLength = attributeLength;
+    }
+
+
+    public String getBtmname() {
+        return btmname;
+    }
+
+    public void setBtmname(String btmname) {
+        this.btmname = btmname;
+    }
+
+    public String getOwner() {
+        return owner;
+    }
+
+    public void setOwner(String owner) {
+        this.owner = owner;
+    }
+
+    public Integer getScaleLength() {
+        return scaleLength;
+    }
+
+    public void setScaleLength(Integer scaleLength) {
+        this.scaleLength = scaleLength;
+    }
+
+    public String getBtmTypeId() {
+        return btmTypeId;
+    }
+
+    public void setBtmTypeId(String btmTypeId) {
+        this.btmTypeId = btmTypeId;
+    }
+
+    @Override
+    public String toString() {
+        return "OsBtmTypeAttributeVO{" +
+                "oid='" + oid + '\'' +
+                ", pkBtmType='" + pkBtmType + '\'' +
+                ", btmTypeId='" + btmTypeId + '\'' +
+                ", id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", attributeLength=" + attributeLength +
+                ", description='" + description + '\'' +
+                ", attrDataType='" + attrDataType + '\'' +
+                ", nullableFlag=" + nullableFlag +
+                ", defaultValue='" + defaultValue + '\'' +
+                ", precisionLength=" + precisionLength +
+                ", scaleLength=" + scaleLength +
+                ", range='" + range + '\'' +
+                ", referFlag=" + referFlag +
+                ", referBtmTypeId='" + referBtmTypeId + '\'' +
+                ", referBtmTypeName='" + referBtmTypeName + '\'' +
+                ", enumId='" + enumId + '\'' +
+                ", enumName='" + enumName + '\'' +
+                ", enumFlag=" + enumFlag +
+                ", enumItemMap=" + enumItemMap +
+                ", btmname='" + btmname + '\'' +
+                ", owner='" + owner + '\'' +
+                ", creator='" + creator + '\'' +
+                ", createTime=" + createTime +
+                ", lastModifier='" + lastModifier + '\'' +
+                ", lastModifyTime=" + lastModifyTime +
+                ", ts=" + ts +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsBtmTypeVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsBtmTypeVO.java
new file mode 100644
index 0000000..605e212
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsBtmTypeVO.java
@@ -0,0 +1,461 @@
+package com.vci.web.pageModel;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 涓氬姟绫诲瀷鏄剧ず瀵硅薄
+ * @author weidy
+ * @date 2019/10/11 5:24 PM
+ */
+public class OsBtmTypeVO implements java.io.Serializable{
+
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = 7683836259151573532L;
+
+    /**
+     * 涓婚敭
+     */
+    private String oid;
+
+    /**
+     * 涓氬姟绫诲瀷鑻辨枃鍚嶇О
+     */
+    private String id;
+
+    /**
+     * 涓氬姟绫诲瀷涓枃鍚嶇О
+     */
+    private String name;
+
+    /**
+     * 鏁版嵁搴撹〃鐨勫悕绉�
+     */
+    private String tableName;
+
+    /**
+     * 鎻忚堪
+     */
+    private String description;
+
+    /**
+     * 鐗堟湰瑙勫垯鐨勭紪鍙�
+     */
+    private String revisionRuleId;
+
+    /**
+     * 鐗堟湰瑙勫垯鐨勫悕绉�
+     */
+    private String revisionRuleName;
+
+    /**
+     * 鍒嗛殧绗�
+     */
+    private String revisionSep;
+
+    /**
+     * 鏄惁鎵嬪姩杈撳叆鐗堟湰
+     */
+    private boolean inputRevisionFlag;
+
+    /**
+     * 鐗堟湰瑙勫垯鏄剧ず瀵硅薄
+     */
+    private OsRevisionRuleVO revisionRuleVO;
+
+    /**
+     * 鏄惁鎶借薄鍖�
+     */
+    private boolean abstractFlag;
+
+    /**
+     * 鏄惁鎺у埗鐗堟湰
+     */
+    private boolean revisionFlag;
+
+    /**
+     * 鏄惁鎺у埗鐢熷懡鍛ㄦ湡
+     */
+    private boolean lifeCycleFlag;
+
+    /**
+     * 鏄惁鎺у埗瀵嗙骇
+     */
+    private boolean secretFlag;
+
+
+    /**
+     * 瀹炰緥鍖栫被
+     */
+    private String implClass;
+
+    /**
+     * C#
+     */
+    private String shape;
+
+
+    /**
+     * 鐢熷懡鍛ㄦ湡鐨勮嫳鏂囧悕绉�
+     */
+    private String lifeCycleId;
+
+    /**
+     * 鐢熷懡鍛ㄦ湡鐨勪腑鏂囧悕绉�
+     */
+    private String lifeCycleName;
+
+    /**
+     * 鐗堟瑙勫垯
+     */
+    private String versionRule;
+
+
+    /**
+     * 澶囩敤鐢熷懡鍛ㄦ湡鑻辨枃鍚嶇О
+     */
+    private String subLifeCycleId;
+
+    /**
+     * 澶囩敤鐢熷懡鍛ㄦ湡涓枃鍚嶇О
+     */
+    private String subLifeCycleName;
+
+    /**
+     * 鏄惁涓鸿鍥�
+     */
+    private boolean viewFlag;
+
+    /**
+     * 瑙嗗浘鍒涘缓鐨剆ql璇彞
+     */
+    private String viewCreateSql;
+
+    /**
+     * 涓氬姟绫诲瀷鍚嶇О
+     */
+    private String btmname;
+
+    /**
+     * 鎷ユ湁鑰�
+     */
+    private String owner;
+
+    /**
+     * 鍒涘缓浜�
+     */
+    private String creator;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    private Date createTime;
+
+    /**
+     * 鏈�鍚庝慨鏀逛汉
+     */
+    private String lastModifier;
+
+    /**
+     * 鏈�鍚庝慨鏀规椂闂达紝鏍煎紡鏄痽yyy-MM-dd HH:mm:ss
+     */
+    private Date lastModifyTime;
+
+    /**
+     * 鏃堕棿鎴筹紝鏍煎紡鏄痽yyy-MM-dd HH:mm:ss.SSS
+     */
+    private Date ts;
+
+    /**
+     * 鍖呭惈灞炴��
+     */
+    private List<OsBtmTypeAttributeVO> attributes;
+
+    public String getOid() {
+        return oid;
+    }
+
+    public void setOid(String oid) {
+        this.oid = oid;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getRevisionRuleId() {
+        return revisionRuleId;
+    }
+
+    public void setRevisionRuleId(String revisionRuleId) {
+        this.revisionRuleId = revisionRuleId;
+    }
+
+    public String getRevisionRuleName() {
+        return revisionRuleName;
+    }
+
+    public void setRevisionRuleName(String revisionRuleName) {
+        this.revisionRuleName = revisionRuleName;
+    }
+
+    public String getRevisionSep() {
+        return revisionSep;
+    }
+
+    public void setRevisionSep(String revisionSep) {
+        this.revisionSep = revisionSep;
+    }
+
+    public boolean isInputRevisionFlag() {
+        return inputRevisionFlag;
+    }
+
+    public void setInputRevisionFlag(boolean inputRevisionFlag) {
+        this.inputRevisionFlag = inputRevisionFlag;
+    }
+
+
+    public boolean isAbstractFlag() {
+        return abstractFlag;
+    }
+
+    public void setAbstractFlag(boolean abstractFlag) {
+        this.abstractFlag = abstractFlag;
+    }
+
+    public boolean isRevisionFlag() {
+        return revisionFlag;
+    }
+
+    public void setRevisionFlag(boolean revisionFlag) {
+        this.revisionFlag = revisionFlag;
+    }
+
+    public boolean isLifeCycleFlag() {
+        return lifeCycleFlag;
+    }
+
+    public void setLifeCycleFlag(boolean lifeCycleFlag) {
+        this.lifeCycleFlag = lifeCycleFlag;
+    }
+
+    public String getImplClass() {
+        return implClass;
+    }
+
+    public void setImplClass(String implClass) {
+        this.implClass = implClass;
+    }
+
+    public String getShape() {
+        return shape;
+    }
+
+    public void setShape(String shape) {
+        this.shape = shape;
+    }
+
+    public String getVersionRule() {
+        return versionRule;
+    }
+
+    public void setVersionRule(String versionRule) {
+        this.versionRule = versionRule;
+    }
+
+    public String getCreator() {
+        return creator;
+    }
+
+    public void setCreator(String creator) {
+        this.creator = creator;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getLastModifier() {
+        return lastModifier;
+    }
+
+    public void setLastModifier(String lastModifier) {
+        this.lastModifier = lastModifier;
+    }
+
+    public Date getLastModifyTime() {
+        return lastModifyTime;
+    }
+
+    public void setLastModifyTime(Date lastModifyTime) {
+        this.lastModifyTime = lastModifyTime;
+    }
+
+    public Date getTs() {
+        return ts;
+    }
+
+    public void setTs(Date ts) {
+        this.ts = ts;
+    }
+
+    public boolean isSecretFlag() {
+        return secretFlag;
+    }
+
+    public void setSecretFlag(boolean secretFlag) {
+        this.secretFlag = secretFlag;
+    }
+
+    public String getTableName() {
+        return tableName;
+    }
+
+    public void setTableName(String tableName) {
+        this.tableName = tableName;
+    }
+
+    public boolean isViewFlag() {
+        return viewFlag;
+    }
+
+    public void setViewFlag(boolean viewFlag) {
+        this.viewFlag = viewFlag;
+    }
+
+    public String getViewCreateSql() {
+        return viewCreateSql;
+    }
+
+    public void setViewCreateSql(String viewCreateSql) {
+        this.viewCreateSql = viewCreateSql;
+    }
+
+    public String getLifeCycleId() {
+        return lifeCycleId;
+    }
+
+    public void setLifeCycleId(String lifeCycleId) {
+        this.lifeCycleId = lifeCycleId;
+    }
+
+    public String getLifeCycleName() {
+        return lifeCycleName;
+    }
+
+    public void setLifeCycleName(String lifeCycleName) {
+        this.lifeCycleName = lifeCycleName;
+    }
+
+    public String getSubLifeCycleId() {
+        return subLifeCycleId;
+    }
+
+    public void setSubLifeCycleId(String subLifeCycleId) {
+        this.subLifeCycleId = subLifeCycleId;
+    }
+
+    public String getSubLifeCycleName() {
+        return subLifeCycleName;
+    }
+
+    public void setSubLifeCycleName(String subLifeCycleName) {
+        this.subLifeCycleName = subLifeCycleName;
+    }
+
+    public String getBtmname() {
+        return btmname;
+    }
+
+    public void setBtmname(String btmname) {
+        this.btmname = btmname;
+    }
+
+    public String getOwner() {
+        return owner;
+    }
+
+    public void setOwner(String owner) {
+        this.owner = owner;
+    }
+
+    public OsRevisionRuleVO getRevisionRuleVO() {
+        return revisionRuleVO;
+    }
+
+    public void setRevisionRuleVO(OsRevisionRuleVO revisionRuleVO) {
+        this.revisionRuleVO = revisionRuleVO;
+    }
+
+    public List<OsBtmTypeAttributeVO> getAttributes() {
+        return attributes;
+    }
+
+    public void setAttributes(List<OsBtmTypeAttributeVO> attributes) {
+        this.attributes = attributes;
+    }
+
+    @Override
+    public String toString() {
+        return "OsBtmTypeVO{" +
+                "oid='" + oid + '\'' +
+                ", id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", tableName='" + tableName + '\'' +
+                ", description='" + description + '\'' +
+                ", revisionRuleId='" + revisionRuleId + '\'' +
+                ", revisionRuleName='" + revisionRuleName + '\'' +
+                ", revisionSep='" + revisionSep + '\'' +
+                ", inputRevisionFlag=" + inputRevisionFlag +
+                ", revisionRuleVO=" + revisionRuleVO +
+                ", abstractFlag=" + abstractFlag +
+                ", revisionFlag=" + revisionFlag +
+                ", lifeCycleFlag=" + lifeCycleFlag +
+                ", secretFlag=" + secretFlag +
+                ", implClass='" + implClass + '\'' +
+                ", shape='" + shape + '\'' +
+                ", lifeCycleId='" + lifeCycleId + '\'' +
+                ", lifeCycleName='" + lifeCycleName + '\'' +
+                ", versionRule='" + versionRule + '\'' +
+                ", subLifeCycleId='" + subLifeCycleId + '\'' +
+                ", subLifeCycleName='" + subLifeCycleName + '\'' +
+                ", viewFlag=" + viewFlag +
+                ", viewCreateSql='" + viewCreateSql + '\'' +
+                ", btmname='" + btmname + '\'' +
+                ", owner='" + owner + '\'' +
+                ", creator='" + creator + '\'' +
+                ", createTime=" + createTime +
+                ", lastModifier='" + lastModifier + '\'' +
+                ", lastModifyTime=" + lastModifyTime +
+                ", ts=" + ts +
+                ", attributes=" + attributes +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsCodeEnumVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsCodeEnumVO.java
new file mode 100644
index 0000000..e7ed23b
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsCodeEnumVO.java
@@ -0,0 +1,75 @@
+package com.vci.web.pageModel;
+
+/**
+ * 缂栫爜瑙勫垯涓灇涓剧殑鏄犲皠淇℃伅
+ * @author weidy
+ * @date 2021-10-28
+ */
+public class OsCodeEnumVO implements java.io.Serializable{
+
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = 4921133751608058646L;
+    /**
+     * 鎵�灞炶鍒�
+     */
+    private String pkCodeRuleElement;
+
+    /**
+     * 鏋氫妇椤圭殑key
+     */
+    private String enumItemKey;
+
+    /**
+     * 鏋氫妇椤圭殑鍊�
+     */
+    private String enumItemValue;
+
+    /**
+     * 鍦ㄧ紪鐮佽鍒欎腑鐨勬槧灏勫��
+     */
+    private String codeMapValue;
+
+    public String getPkCodeRuleElement() {
+        return pkCodeRuleElement;
+    }
+
+    public void setPkCodeRuleElement(String pkCodeRuleElement) {
+        this.pkCodeRuleElement = pkCodeRuleElement;
+    }
+
+    public String getEnumItemKey() {
+        return enumItemKey;
+    }
+
+    public void setEnumItemKey(String enumItemKey) {
+        this.enumItemKey = enumItemKey;
+    }
+
+    public String getEnumItemValue() {
+        return enumItemValue;
+    }
+
+    public void setEnumItemValue(String enumItemValue) {
+        this.enumItemValue = enumItemValue;
+    }
+
+    public String getCodeMapValue() {
+        return codeMapValue;
+    }
+
+    public void setCodeMapValue(String codeMapValue) {
+        this.codeMapValue = codeMapValue;
+    }
+
+    @Override
+    public String toString() {
+        return "OsCodeEnumVO{" +
+                "pkCodeRuleElement='" + pkCodeRuleElement + '\'' +
+                ", enumItemKey='" + enumItemKey + '\'' +
+                ", enumItemValue='" + enumItemValue + '\'' +
+                ", codeMapValue='" + codeMapValue + '\'' +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsCodeGenSchemaVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsCodeGenSchemaVO.java
new file mode 100644
index 0000000..6e2a194
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsCodeGenSchemaVO.java
@@ -0,0 +1,535 @@
+package com.vci.web.pageModel;
+
+import com.vci.starter.web.pagemodel.BaseModelVO;
+
+import java.util.Date;
+
+/**
+ * 浠g爜鐢熸垚鏂规
+ * @author weidy
+ * @date 2020/7/30 10:13
+ */
+public class OsCodeGenSchemaVO extends BaseModelVO {
+
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = 4967540773383240320L;
+    /**
+     * 鎵�灞炰笟鍔$被鍨�
+     */
+    private String pkBtmType;
+
+    /**
+     * 涓氬姟绫诲瀷缂栧彿
+     */
+    private String id;
+
+    /**
+     * 涓氬姟绫诲瀷鍚嶇О
+     */
+    private String name;
+
+    /**
+     * 鎻忚堪
+     */
+    private String description;
+
+    /**
+     * 浣滆��
+     */
+    private String author;
+
+    /**
+     * 绫诲悕绉�
+     */
+    private String className;
+
+    /**
+     * 瀹炰綋鍖呭悕
+     */
+    private String doPackage;
+
+    /**
+     * 鏄惁鐢熸垚瀹炰綋瀵硅薄
+     */
+    private boolean genDOFlag;
+
+    /**
+     * 鏄剧ず瀵硅薄鐨勫寘鍚�
+     */
+    private String voPackage;
+
+    /**
+     * 鏄惁鐢熸垚鏄剧ず瀵硅薄
+     */
+    private boolean genVOFlag;
+
+    /**
+     * 鏁版嵁浼犺緭瀵硅薄
+     */
+    private String dtoPackage;
+
+    /**
+     * 鏄惁鐢熸垚鏁版嵁浼犺緭瀵硅薄
+     */
+    private boolean genDTOFlag;
+
+    /**
+     * 鎺у埗鍣ㄧ殑鍖呭悕
+     */
+    private String controllerPackage;
+
+    /**
+     * 鎺у埗鍣ㄧ殑璇锋眰鍦板潃
+     */
+    private String controllerRequestMap;
+
+    /**
+     * 鏈嶅姟鍖呭悕
+     */
+    private String servicePackage;
+
+    /**
+     * 鏁版嵁搴撴搷浣滃寘鍚�
+     */
+    private String mapperPackage;
+
+    /**
+     * 鏁版嵁搴搙ml鍖呭悕
+     */
+    private String mapperXmlPackage;
+
+    /**
+     * 鐣岄潰鐨勮矾寰�
+     */
+    private String jsPackage;
+
+    /**
+     * 鍚庡彴鏈嶅姟鐨勫墠缂�
+     */
+    private String backPath;
+
+    /**
+     * 鏈�鍚庣敓鎴愭椂闂�
+     */
+    private Date lastProductDate;
+
+    /**
+     * 鏂囦欢鐨勫瓧绗﹂泦缂栫爜锛岄粯璁TF-8
+     */
+    private String fileEncode ;
+
+
+    /**
+     * 浣跨敤甯冨眬鍖哄煙
+     */
+    private String useLayoutRegion;
+
+    /**
+     * 瑗垮尯鍩熺殑闈㈡澘绫诲瀷
+     */
+    private String westLayoutPanelType;
+
+    /**
+     * 瑗垮尯鍩熺殑闈㈡澘绫诲瀷鏄剧ず鏂囨湰
+     */
+    private String westLayoutPanelTypeText;
+
+
+    /**
+     * 瑗垮尯鏌ヨ鐨勯厤缃�
+     */
+    private String westQueryConfig;
+
+    /**
+     * 瑗垮尯鐐瑰嚮鍚庝笅涓�涓尯鍩熺殑
+     */
+    private String westNextRegionParam;
+
+    /**
+     * 瑗垮尯鎸夐挳
+     */
+    private String westButtons;
+
+    /**
+     * 涓績鍖哄煙鐨勯潰鏉跨被鍨�
+     */
+    private String centerLayoutPanelType;
+
+    /**
+     * 涓績鍖哄煙鐨勯潰鏉跨被鍨嬫樉绀烘枃鏈�
+     */
+    private String centerLayoutPanelTypeText;
+
+    /**
+     * 涓績鍖烘煡璇㈢殑閰嶇疆
+     */
+    private String centerQueryConfig;
+
+    /**
+     * 涓績鍖虹偣鍑诲悗涓嬩竴涓尯鍩熺殑
+     */
+    private String centerNextRegionParam;
+
+    /**
+     * 涓績鍖烘寜閽�
+     */
+    private String centerButtons;
+
+    /**
+     * 鍗楀尯鍩熺殑闈㈡澘绫诲瀷
+     */
+    private String southLayoutPanelType;
+
+    /**
+     * 鍗楀尯鍩熺殑闈㈡澘绫诲瀷鏄剧ず鏂囨湰
+     */
+    private String southLayoutPanelTypeText;
+
+    /**
+     * 鍗楀尯鏌ヨ鐨勯厤缃�
+     */
+    private String southQueryConfig;
+
+    /**
+     * 鍗楀尯鎸夐挳
+     */
+    private String southButtons;
+
+    public String getPkBtmType() {
+        return pkBtmType;
+    }
+
+    public void setPkBtmType(String pkBtmType) {
+        this.pkBtmType = pkBtmType;
+    }
+
+    @Override
+    public String getId() {
+        return id;
+    }
+
+    @Override
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    @Override
+    public String getDescription() {
+        return description;
+    }
+
+    @Override
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getAuthor() {
+        return author;
+    }
+
+    public void setAuthor(String author) {
+        this.author = author;
+    }
+
+    public String getDoPackage() {
+        return doPackage;
+    }
+
+    public void setDoPackage(String doPackage) {
+        this.doPackage = doPackage;
+    }
+
+    public String getVoPackage() {
+        return voPackage;
+    }
+
+    public void setVoPackage(String voPackage) {
+        this.voPackage = voPackage;
+    }
+
+    public String getDtoPackage() {
+        return dtoPackage;
+    }
+
+    public void setDtoPackage(String dtoPackage) {
+        this.dtoPackage = dtoPackage;
+    }
+
+    public String getControllerPackage() {
+        return controllerPackage;
+    }
+
+    public void setControllerPackage(String controllerPackage) {
+        this.controllerPackage = controllerPackage;
+    }
+
+    public String getServicePackage() {
+        return servicePackage;
+    }
+
+    public void setServicePackage(String servicePackage) {
+        this.servicePackage = servicePackage;
+    }
+
+    public String getMapperPackage() {
+        return mapperPackage;
+    }
+
+    public void setMapperPackage(String mapperPackage) {
+        this.mapperPackage = mapperPackage;
+    }
+
+    public String getMapperXmlPackage() {
+        return mapperXmlPackage;
+    }
+
+    public void setMapperXmlPackage(String mapperXmlPackage) {
+        this.mapperXmlPackage = mapperXmlPackage;
+    }
+
+    public String getJsPackage() {
+        return jsPackage;
+    }
+
+    public void setJsPackage(String jsPackage) {
+        this.jsPackage = jsPackage;
+    }
+
+    public Date getLastProductDate() {
+        return lastProductDate;
+    }
+
+    public void setLastProductDate(Date lastProductDate) {
+        this.lastProductDate = lastProductDate;
+    }
+
+    public boolean isGenDOFlag() {
+        return genDOFlag;
+    }
+
+    public void setGenDOFlag(boolean genDOFlag) {
+        this.genDOFlag = genDOFlag;
+    }
+
+    public boolean isGenVOFlag() {
+        return genVOFlag;
+    }
+
+    public void setGenVOFlag(boolean genVOFlag) {
+        this.genVOFlag = genVOFlag;
+    }
+
+    public boolean isGenDTOFlag() {
+        return genDTOFlag;
+    }
+
+    public void setGenDTOFlag(boolean genDTOFlag) {
+        this.genDTOFlag = genDTOFlag;
+    }
+
+    public String getFileEncode() {
+        return fileEncode;
+    }
+
+    public void setFileEncode(String fileEncode) {
+        this.fileEncode = fileEncode;
+    }
+
+    public String getControllerRequestMap() {
+        return controllerRequestMap;
+    }
+
+    public void setControllerRequestMap(String controllerRequestMap) {
+        this.controllerRequestMap = controllerRequestMap;
+    }
+
+    public String getBackPath() {
+        return backPath;
+    }
+
+    public void setBackPath(String backPath) {
+        this.backPath = backPath;
+    }
+
+    public String getUseLayoutRegion() {
+        return useLayoutRegion;
+    }
+
+    public void setUseLayoutRegion(String useLayoutRegion) {
+        this.useLayoutRegion = useLayoutRegion;
+    }
+
+    public String getWestLayoutPanelType() {
+        return westLayoutPanelType;
+    }
+
+    public void setWestLayoutPanelType(String westLayoutPanelType) {
+        this.westLayoutPanelType = westLayoutPanelType;
+    }
+
+    public String getWestLayoutPanelTypeText() {
+        return westLayoutPanelTypeText;
+    }
+
+    public void setWestLayoutPanelTypeText(String westLayoutPanelTypeText) {
+        this.westLayoutPanelTypeText = westLayoutPanelTypeText;
+    }
+
+    public String getWestQueryConfig() {
+        return westQueryConfig;
+    }
+
+    public void setWestQueryConfig(String westQueryConfig) {
+        this.westQueryConfig = westQueryConfig;
+    }
+
+    public String getWestNextRegionParam() {
+        return westNextRegionParam;
+    }
+
+    public void setWestNextRegionParam(String westNextRegionParam) {
+        this.westNextRegionParam = westNextRegionParam;
+    }
+
+    public String getWestButtons() {
+        return westButtons;
+    }
+
+    public void setWestButtons(String westButtons) {
+        this.westButtons = westButtons;
+    }
+
+    public String getCenterLayoutPanelType() {
+        return centerLayoutPanelType;
+    }
+
+    public void setCenterLayoutPanelType(String centerLayoutPanelType) {
+        this.centerLayoutPanelType = centerLayoutPanelType;
+    }
+
+    public String getCenterLayoutPanelTypeText() {
+        return centerLayoutPanelTypeText;
+    }
+
+    public void setCenterLayoutPanelTypeText(String centerLayoutPanelTypeText) {
+        this.centerLayoutPanelTypeText = centerLayoutPanelTypeText;
+    }
+
+    public String getCenterQueryConfig() {
+        return centerQueryConfig;
+    }
+
+    public void setCenterQueryConfig(String centerQueryConfig) {
+        this.centerQueryConfig = centerQueryConfig;
+    }
+
+    public String getCenterNextRegionParam() {
+        return centerNextRegionParam;
+    }
+
+    public void setCenterNextRegionParam(String centerNextRegionParam) {
+        this.centerNextRegionParam = centerNextRegionParam;
+    }
+
+    public String getCenterButtons() {
+        return centerButtons;
+    }
+
+    public void setCenterButtons(String centerButtons) {
+        this.centerButtons = centerButtons;
+    }
+
+    public String getSouthLayoutPanelType() {
+        return southLayoutPanelType;
+    }
+
+    public void setSouthLayoutPanelType(String southLayoutPanelType) {
+        this.southLayoutPanelType = southLayoutPanelType;
+    }
+
+    public String getSouthLayoutPanelTypeText() {
+        return southLayoutPanelTypeText;
+    }
+
+    public void setSouthLayoutPanelTypeText(String southLayoutPanelTypeText) {
+        this.southLayoutPanelTypeText = southLayoutPanelTypeText;
+    }
+
+    public String getSouthQueryConfig() {
+        return southQueryConfig;
+    }
+
+    public void setSouthQueryConfig(String southQueryConfig) {
+        this.southQueryConfig = southQueryConfig;
+    }
+
+    public String getSouthButtons() {
+        return southButtons;
+    }
+
+    public void setSouthButtons(String southButtons) {
+        this.southButtons = southButtons;
+    }
+
+    public String getClassName() {
+        return className;
+    }
+
+    public void setClassName(String className) {
+        this.className = className;
+    }
+
+    @Override
+    public String toString() {
+        return "OsCodeGenSchemaVO{" +
+                "pkBtmType='" + pkBtmType + '\'' +
+                ", id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", description='" + description + '\'' +
+                ", author='" + author + '\'' +
+                ", className='" + className + '\'' +
+                ", doPackage='" + doPackage + '\'' +
+                ", genDOFlag=" + genDOFlag +
+                ", voPackage='" + voPackage + '\'' +
+                ", genVOFlag=" + genVOFlag +
+                ", dtoPackage='" + dtoPackage + '\'' +
+                ", genDTOFlag=" + genDTOFlag +
+                ", controllerPackage='" + controllerPackage + '\'' +
+                ", controllerRequestMap='" + controllerRequestMap + '\'' +
+                ", servicePackage='" + servicePackage + '\'' +
+                ", mapperPackage='" + mapperPackage + '\'' +
+                ", mapperXmlPackage='" + mapperXmlPackage + '\'' +
+                ", jsPackage='" + jsPackage + '\'' +
+                ", backPath='" + backPath + '\'' +
+                ", lastProductDate=" + lastProductDate +
+                ", fileEncode='" + fileEncode + '\'' +
+                ", useLayoutRegion='" + useLayoutRegion + '\'' +
+                ", westLayoutPanelType='" + westLayoutPanelType + '\'' +
+                ", westLayoutPanelTypeText='" + westLayoutPanelTypeText + '\'' +
+                ", westQueryConfig='" + westQueryConfig + '\'' +
+                ", westNextRegionParam='" + westNextRegionParam + '\'' +
+                ", westButtons='" + westButtons + '\'' +
+                ", centerLayoutPanelType='" + centerLayoutPanelType + '\'' +
+                ", centerLayoutPanelTypeText='" + centerLayoutPanelTypeText + '\'' +
+                ", centerQueryConfig='" + centerQueryConfig + '\'' +
+                ", centerNextRegionParam='" + centerNextRegionParam + '\'' +
+                ", centerButtons='" + centerButtons + '\'' +
+                ", southLayoutPanelType='" + southLayoutPanelType + '\'' +
+                ", southLayoutPanelTypeText='" + southLayoutPanelTypeText + '\'' +
+                ", southQueryConfig='" + southQueryConfig + '\'' +
+                ", southButtons='" + southButtons + '\'' +
+                "} " + super.toString();
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsCodeResultVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsCodeResultVO.java
new file mode 100644
index 0000000..67793b1
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsCodeResultVO.java
@@ -0,0 +1,78 @@
+package com.vci.web.pageModel;
+
+/**
+ * 缂栫爜鐢熸垚鐨勭粨鏋滃璞�
+ * @author weidy
+ * @date 2021-10-28
+ */
+public class OsCodeResultVO implements java.io.Serializable{
+
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = 1798464120545678832L;
+
+
+    /**
+     * 缂栫爜
+     */
+    private String code;
+
+    /**
+     * 娴佹按渚濇嵁
+     */
+    private String serialUnit;
+
+    /**
+     * 娴佹按鍙�
+     */
+    private String serialNo;
+
+    /**
+     * 娴佹按鍙烽儴鍒嗙殑缂栫爜锛堣ˉ浣嶅悗锛�
+     */
+    private String serialCode;
+
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getSerialUnit() {
+        return serialUnit;
+    }
+
+    public void setSerialUnit(String serialUnit) {
+        this.serialUnit = serialUnit;
+    }
+
+    public String getSerialNo() {
+        return serialNo;
+    }
+
+    public void setSerialNo(String serialNo) {
+        this.serialNo = serialNo;
+    }
+
+    public String getSerialCode() {
+        return serialCode;
+    }
+
+    public void setSerialCode(String serialCode) {
+        this.serialCode = serialCode;
+    }
+
+
+    @Override
+    public String toString() {
+        return "OsCodeResultVO{" +
+                ", code='" + code + '\'' +
+                ", serialUnit='" + serialUnit + '\'' +
+                ", serialNo='" + serialNo + '\'' +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsCodeRuleElementVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsCodeRuleElementVO.java
new file mode 100644
index 0000000..0d7b68a
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsCodeRuleElementVO.java
@@ -0,0 +1,416 @@
+package com.vci.web.pageModel;
+
+
+import com.vci.starter.web.pagemodel.BaseModelVO;
+
+import java.util.List;
+
+/**
+ * 缂栫爜瑙勫垯鐨勫厓绱�
+ * @author weidy
+ * @date 2021/7/19
+ */
+public class OsCodeRuleElementVO extends BaseModelVO {
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = -3169847875502622042L;
+
+    /**
+     * 鎵�灞炶鍒�
+     */
+    private String pkCodeRule;
+
+    /**
+     * 鎺掑簭鍙�
+     */
+    private Integer ruleOrderNumber;
+
+    /**
+     * 缂栫爜瑙勫垯鐨勫厓绱犵被鍨�
+     */
+    private String codeElementType;
+
+    /**
+     * 缂栫爜瑙勫垯鐨勫厓绱犵被鍨嬫樉绀烘枃鏈�
+     */
+    private String codeElementTypeText;
+    /**
+     * 鍏冪礌鏄剧ず琛ㄨ揪寮�
+     */
+    private String id;
+
+    /**
+     * 鍏冪礌涓枃鍚嶇О
+     */
+    private String name;
+
+    /**
+     * 鏈�澶ч暱搴�
+     */
+    private Integer maxLength;
+
+    /**
+     * 鏈�灏忛暱搴�
+     */
+    private Integer minLength;
+    /**
+     * 缂栫爜琛ヤ綅鏂瑰紡
+     */
+    private String codeFillType;
+
+    /**
+     * 缂栫爜琛ヤ綅鏂瑰紡鏄剧ず鏂囨湰
+     */
+    private String codeFillTypeText;
+
+    /**
+     * 琛ヤ綅鏃剁殑瀛楃
+     */
+    private String codeFillSeparator;
+    /**
+     * 鎵嬪姩杈撳叆鏃剁殑鏍¢獙瑙勫垯
+     */
+    private String validateString;
+
+    /**
+     * 鏃ユ湡褰㈠紡鏃剁殑鏃堕棿鏍煎紡
+     */
+    private String codeDateFormat;
+    /**
+     * 鏃堕棿鍙栧�肩被鍨�
+     */
+    private String codeDateValueType;
+
+    /**
+     * 鏃堕棿鍙栧�肩被鍨嬬殑鍚嶇О
+     */
+    private String codeDateValueTypeText;
+
+    /**
+     * 鏃堕棿鍙栧�间娇鐢ㄤ笟鍔$被鍨嬬殑灞炴�ey
+     */
+    private String codeDateUseField;
+
+    /**
+     * 鏃堕棿鍙栧�间娇鐢ㄤ笟鍔$被鍨嬬殑灞炴�у悕绉�
+     */
+    private String codeDateUseFieldName;
+
+    /**
+     * 浣跨敤涓氬姟绫诲瀷鐨勫睘鎬ц嫳鏂囧悕绉�
+     */
+    private String codeUseField;
+
+    /**
+     * 浣跨敤涓氬姟绫诲瀷鐨勫睘鎬т腑鏂囧悕绉�
+     */
+    private String codeUseFieldName;
+
+    /**
+     * 鍏紡琛ㄨ揪寮�
+     */
+    private String codeExpression;
+
+    /**
+     * 鏄惁娴佹按鍙�
+     */
+    private boolean serialAccording;
+
+    /**
+     * 甯搁噺鐨勫��
+     */
+    private String staticCode;
+
+    /**
+     * 娴佹按鍙疯捣濮嬪��
+     */
+    private String serialStart;
+
+    /**
+     * 娴佹按鐨勬闀�
+     */
+    private Integer serialStep;
+
+    /**
+     * 娴佹按浼樺厛绾�
+     */
+    private Integer serialPriority;
+
+    /**
+     * 鏋氫妇鐨勭紪鍙�
+     */
+    private String enumId;
+
+    /**
+     * 鏋氫妇鐨勫悕绉�
+     */
+    private String enumName;
+
+    /**
+     * 鏄犲皠鐨勫唴瀹�
+     */
+    private List<OsCodeEnumVO> enumMapList;
+
+    public String getPkCodeRule() {
+        return pkCodeRule;
+    }
+
+    public void setPkCodeRule(String pkCodeRule) {
+        this.pkCodeRule = pkCodeRule;
+    }
+
+    public Integer getRuleOrderNumber() {
+        return ruleOrderNumber;
+    }
+
+    public void setRuleOrderNumber(Integer ruleOrderNumber) {
+        this.ruleOrderNumber = ruleOrderNumber;
+    }
+
+    public String getCodeElementType() {
+        return codeElementType;
+    }
+
+    public void setCodeElementType(String codeElementType) {
+        this.codeElementType = codeElementType;
+    }
+
+    public String getCodeElementTypeText() {
+        return codeElementTypeText;
+    }
+
+    public void setCodeElementTypeText(String codeElementTypeText) {
+        this.codeElementTypeText = codeElementTypeText;
+    }
+
+    @Override
+    public String getId() {
+        return id;
+    }
+
+    @Override
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Integer getMaxLength() {
+        return maxLength;
+    }
+
+    public void setMaxLength(Integer maxLength) {
+        this.maxLength = maxLength;
+    }
+
+    public Integer getMinLength() {
+        return minLength;
+    }
+
+    public void setMinLength(Integer minLength) {
+        this.minLength = minLength;
+    }
+
+    public String getCodeFillType() {
+        return codeFillType;
+    }
+
+    public void setCodeFillType(String codeFillType) {
+        this.codeFillType = codeFillType;
+    }
+
+    public String getCodeFillTypeText() {
+        return codeFillTypeText;
+    }
+
+    public void setCodeFillTypeText(String codeFillTypeText) {
+        this.codeFillTypeText = codeFillTypeText;
+    }
+
+    public String getCodeFillSeparator() {
+        return codeFillSeparator;
+    }
+
+    public void setCodeFillSeparator(String codeFillSeparator) {
+        this.codeFillSeparator = codeFillSeparator;
+    }
+
+    public String getValidateString() {
+        return validateString;
+    }
+
+    public void setValidateString(String validateString) {
+        this.validateString = validateString;
+    }
+
+    public String getCodeDateFormat() {
+        return codeDateFormat;
+    }
+
+    public void setCodeDateFormat(String codeDateFormat) {
+        this.codeDateFormat = codeDateFormat;
+    }
+
+    public String getCodeDateValueType() {
+        return codeDateValueType;
+    }
+
+    public void setCodeDateValueType(String codeDateValueType) {
+        this.codeDateValueType = codeDateValueType;
+    }
+
+    public String getCodeDateValueTypeText() {
+        return codeDateValueTypeText;
+    }
+
+    public void setCodeDateValueTypeText(String codeDateValueTypeText) {
+        this.codeDateValueTypeText = codeDateValueTypeText;
+    }
+
+    public String getCodeDateUseField() {
+        return codeDateUseField;
+    }
+
+    public void setCodeDateUseField(String codeDateUseField) {
+        this.codeDateUseField = codeDateUseField;
+    }
+
+    public String getCodeDateUseFieldName() {
+        return codeDateUseFieldName;
+    }
+
+    public void setCodeDateUseFieldName(String codeDateUseFieldName) {
+        this.codeDateUseFieldName = codeDateUseFieldName;
+    }
+
+    public String getCodeUseField() {
+        return codeUseField;
+    }
+
+    public void setCodeUseField(String codeUseField) {
+        this.codeUseField = codeUseField;
+    }
+
+    public String getCodeUseFieldName() {
+        return codeUseFieldName;
+    }
+
+    public void setCodeUseFieldName(String codeUseFieldName) {
+        this.codeUseFieldName = codeUseFieldName;
+    }
+
+    public String getCodeExpression() {
+        return codeExpression;
+    }
+
+    public void setCodeExpression(String codeExpression) {
+        this.codeExpression = codeExpression;
+    }
+
+    public boolean isSerialAccording() {
+        return serialAccording;
+    }
+
+    public void setSerialAccording(boolean serialAccording) {
+        this.serialAccording = serialAccording;
+    }
+
+    public String getStaticCode() {
+        return staticCode;
+    }
+
+    public void setStaticCode(String staticCode) {
+        this.staticCode = staticCode;
+    }
+
+    public String getSerialStart() {
+        return serialStart;
+    }
+
+    public void setSerialStart(String serialStart) {
+        this.serialStart = serialStart;
+    }
+
+    public Integer getSerialStep() {
+        return serialStep;
+    }
+
+    public void setSerialStep(Integer serialStep) {
+        this.serialStep = serialStep;
+    }
+
+    public Integer getSerialPriority() {
+        return serialPriority;
+    }
+
+    public void setSerialPriority(Integer serialPriority) {
+        this.serialPriority = serialPriority;
+    }
+
+    public String getEnumId() {
+        return enumId;
+    }
+
+    public void setEnumId(String enumId) {
+        this.enumId = enumId;
+    }
+
+    public String getEnumName() {
+        return enumName;
+    }
+
+    public void setEnumName(String enumName) {
+        this.enumName = enumName;
+    }
+
+    public List<OsCodeEnumVO> getEnumMapList() {
+        return enumMapList;
+    }
+
+    public void setEnumMapList(List<OsCodeEnumVO> enumMapList) {
+        this.enumMapList = enumMapList;
+    }
+
+    @Override
+    public String toString() {
+        return "OsCodeRuleElementVO{" +
+                "pkCodeRule='" + pkCodeRule + '\'' +
+                ", ruleOrderNumber=" + ruleOrderNumber +
+                ", codeElementType='" + codeElementType + '\'' +
+                ", codeElementTypeText='" + codeElementTypeText + '\'' +
+                ", id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", maxLength=" + maxLength +
+                ", minLength=" + minLength +
+                ", codeFillType='" + codeFillType + '\'' +
+                ", codeFillTypeText='" + codeFillTypeText + '\'' +
+                ", codeFillSeparator='" + codeFillSeparator + '\'' +
+                ", validateString='" + validateString + '\'' +
+                ", codeDateFormat='" + codeDateFormat + '\'' +
+                ", codeDateValueType='" + codeDateValueType + '\'' +
+                ", codeDateValueTypeText='" + codeDateValueTypeText + '\'' +
+                ", codeDateUseField='" + codeDateUseField + '\'' +
+                ", codeDateUseFieldName='" + codeDateUseFieldName + '\'' +
+                ", codeUseField='" + codeUseField + '\'' +
+                ", codeUseFieldName='" + codeUseFieldName + '\'' +
+                ", codeExpression='" + codeExpression + '\'' +
+                ", serialAccording=" + serialAccording +
+                ", staticCode='" + staticCode + '\'' +
+                ", serialStart='" + serialStart + '\'' +
+                ", serialStep=" + serialStep +
+                ", serialPriority=" + serialPriority +
+                ", enumId='" + enumId + '\'' +
+                ", enumName='" + enumName + '\'' +
+                ", enumMapList=" + enumMapList +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsCodeRuleVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsCodeRuleVO.java
new file mode 100644
index 0000000..380e591
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsCodeRuleVO.java
@@ -0,0 +1,164 @@
+package com.vci.web.pageModel;
+
+
+import com.vci.starter.web.pagemodel.BaseModelVO;
+
+/**
+ * 缂栫爜瑙勫垯鐨勬樉绀哄璞�
+ * @author weidy
+ * @date 2021/7/19
+ */
+public class OsCodeRuleVO extends BaseModelVO {
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = 4169793876107810797L;
+    /**
+     * 瑙勫垯缂栧彿
+     */
+    private String id;
+
+    /**
+     * 瑙勫垯鍚嶇О
+     */
+    private String name;
+
+    /**
+     * 鎬婚暱搴�
+     */
+    private Integer totalLength;
+
+    /**
+     * 缂栫爜鐢熸垚褰㈠紡
+     */
+    private String codeProductType;
+
+    /**
+     * 缂栫爜鐢熸垚鏂瑰紡鏄剧ず鏂囨湰
+     */
+    private String codeProductTypeText;
+
+    /**
+     * 缂栫爜鏄惁鍙互缂栬緫
+     */
+    private boolean codeEditFlag;
+
+    /**
+     * 鏄惁鏂爜琛ョ爜
+     */
+    private boolean breakReUseFlag;
+    /**
+     * 鎵�灞炰笟鍔$被鍨�
+     */
+    private String btmTypeId;
+
+    /**
+     * 鎵�灞炰笟鍔$被鍨嬪悕绉�
+     */
+    private String btmTypeName;
+
+    /**
+     * 浣跨敤瑙勫垯鏍囪锛屽鍦ㄦ煇涓笟鍔$被鍨嬩笅鐨勫涓満鏅娇鐢�
+     */
+    private String useRuleFlag;
+
+    @Override
+    public String getId() {
+        return id;
+    }
+
+    @Override
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Integer getTotalLength() {
+        return totalLength;
+    }
+
+    public void setTotalLength(Integer totalLength) {
+        this.totalLength = totalLength;
+    }
+
+    public String getCodeProductType() {
+        return codeProductType;
+    }
+
+    public void setCodeProductType(String codeProductType) {
+        this.codeProductType = codeProductType;
+    }
+
+    public String getCodeProductTypeText() {
+        return codeProductTypeText;
+    }
+
+    public void setCodeProductTypeText(String codeProductTypeText) {
+        this.codeProductTypeText = codeProductTypeText;
+    }
+
+    public boolean isCodeEditFlag() {
+        return codeEditFlag;
+    }
+
+    public void setCodeEditFlag(boolean codeEditFlag) {
+        this.codeEditFlag = codeEditFlag;
+    }
+
+    public boolean isBreakReUseFlag() {
+        return breakReUseFlag;
+    }
+
+    public void setBreakReUseFlag(boolean breakReUseFlag) {
+        this.breakReUseFlag = breakReUseFlag;
+    }
+
+    public String getBtmTypeId() {
+        return btmTypeId;
+    }
+
+    public void setBtmTypeId(String btmTypeId) {
+        this.btmTypeId = btmTypeId;
+    }
+
+    public String getBtmTypeName() {
+        return btmTypeName;
+    }
+
+    public void setBtmTypeName(String btmTypeName) {
+        this.btmTypeName = btmTypeName;
+    }
+
+    public String getUseRuleFlag() {
+        return useRuleFlag;
+    }
+
+    public void setUseRuleFlag(String useRuleFlag) {
+        this.useRuleFlag = useRuleFlag;
+    }
+
+    @Override
+    public String toString() {
+        return "OsCodeRuleVO{" +
+                "id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", totalLength=" + totalLength +
+                ", codeProductType='" + codeProductType + '\'' +
+                ", codeProductTypeText='" + codeProductTypeText + '\'' +
+                ", codeEditFlag=" + codeEditFlag +
+                ", breakReUseFlag=" + breakReUseFlag +
+                ", btmTypeId='" + btmTypeId + '\'' +
+                ", btmTypeName='" + btmTypeName + '\'' +
+                ", useRuleFlag='" + useRuleFlag + '\'' +
+                "} " + super.toString();
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsERNodePropertyVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsERNodePropertyVO.java
new file mode 100644
index 0000000..2b54139
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsERNodePropertyVO.java
@@ -0,0 +1,75 @@
+package com.vci.web.pageModel;
+
+/**
+ * E-R鍥剧殑鑺傜偣灞炴��
+ * @author weidy
+ * @date 2022-03-26
+ */
+public class OsERNodePropertyVO implements java.io.Serializable{
+
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = 3140638404223074181L;
+    /**
+     * 灞炴�у悕绉�
+     */
+    private String name;
+
+    /**
+     * 鏄惁涓婚敭
+     */
+    private boolean isKey;
+
+    /**
+     * 鏁板瓧
+     */
+    private String figure;
+
+    /**
+     * 棰滆壊
+     */
+    private String color = "#1c446f";
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public boolean isKey() {
+        return isKey;
+    }
+
+    public void setKey(boolean key) {
+        isKey = key;
+    }
+
+    public String getFigure() {
+        return figure;
+    }
+
+    public void setFigure(String figure) {
+        this.figure = figure;
+    }
+
+    public String getColor() {
+        return color;
+    }
+
+    public void setColor(String color) {
+        this.color = color;
+    }
+
+    @Override
+    public String toString() {
+        return "OsERNodePropertyVO{" +
+                "name='" + name + '\'' +
+                ", isKey=" + isKey +
+                ", figure='" + figure + '\'' +
+                ", color='" + color + '\'' +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsERNodeVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsERNodeVO.java
new file mode 100644
index 0000000..acf5ccc
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsERNodeVO.java
@@ -0,0 +1,49 @@
+package com.vci.web.pageModel;
+
+import java.util.List;
+
+/**
+ * E-R鍥剧殑鑺傜偣淇℃伅
+ * @author weidy
+ * @date 2022-3-26
+ */
+public class OsERNodeVO implements java.io.Serializable{
+
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = -7338626318712544252L;
+    /**
+     * 鑺傜偣鐨勬爣璇嗭紝鍞竴
+     */
+    private String key;
+
+    /**
+     * 灞炴�у唴瀹�
+     */
+    private List<OsERNodePropertyVO> items;
+
+    public String getKey() {
+        return key;
+    }
+
+    public void setKey(String key) {
+        this.key = key;
+    }
+
+    public List<OsERNodePropertyVO> getItems() {
+        return items;
+    }
+
+    public void setItems(List<OsERNodePropertyVO> items) {
+        this.items = items;
+    }
+
+    @Override
+    public String toString() {
+        return "OsERNodeVO{" +
+                "key='" + key + '\'' +
+                ", items=" + items +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsERRelationVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsERRelationVO.java
new file mode 100644
index 0000000..40d855c
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsERRelationVO.java
@@ -0,0 +1,75 @@
+package com.vci.web.pageModel;
+
+/**
+ * ER鍥剧殑浜嗛摼鎺ュ叧绯�
+ * @author weidy
+ * @date 2022-03-26
+ */
+public class OsERRelationVO implements java.io.Serializable{
+
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = 329481828801600065L;
+    /**
+     * 璧风偣
+     */
+    private String from;
+
+    /**
+     * 鐩爣鐐�
+     */
+    private String to;
+
+    /**
+     * 璧风偣鍏崇郴鏂囨湰
+     */
+    private String text;
+
+    /**
+     * 鐩爣鐐瑰叧绯绘枃鏈�
+     */
+    private String toText;
+
+    public String getFrom() {
+        return from;
+    }
+
+    public void setFrom(String from) {
+        this.from = from;
+    }
+
+    public String getTo() {
+        return to;
+    }
+
+    public void setTo(String to) {
+        this.to = to;
+    }
+
+    public String getText() {
+        return text;
+    }
+
+    public void setText(String text) {
+        this.text = text;
+    }
+
+    public String getToText() {
+        return toText;
+    }
+
+    public void setToText(String toText) {
+        this.toText = toText;
+    }
+
+    @Override
+    public String toString() {
+        return "OsERRelationVO{" +
+                "from='" + from + '\'' +
+                ", to='" + to + '\'' +
+                ", text='" + text + '\'' +
+                ", toText='" + toText + '\'' +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsERVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsERVO.java
new file mode 100644
index 0000000..fb9ebd4
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsERVO.java
@@ -0,0 +1,49 @@
+package com.vci.web.pageModel;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * E-R鍥剧殑鏄剧ず鍐呭
+ * @author lihang
+ * @date 2022-3-25
+ */
+public class OsERVO implements java.io.Serializable{
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = -8829843447205096913L;
+    /**
+     * 鑺傜偣淇℃伅
+     */
+    private List<OsERNodeVO> tabViewList;
+
+    /**
+     * 閾炬帴绫诲瀷鐨勬暟鎹泦鍚�
+     */
+    private List<OsERRelationVO> tabRelViewList;
+
+    public List<OsERNodeVO> getTabViewList() {
+        return tabViewList;
+    }
+
+    public void setTabViewList(List<OsERNodeVO> tabViewList) {
+        this.tabViewList = tabViewList;
+    }
+
+    public List<OsERRelationVO> getTabRelViewList() {
+        return tabRelViewList;
+    }
+
+    public void setTabRelViewList(List<OsERRelationVO> tabRelViewList) {
+        this.tabRelViewList = tabRelViewList;
+    }
+
+    @Override
+    public String toString() {
+        return "OsERVO{" +
+                "tabViewList=" + tabViewList +
+                ", tabRelViewList=" + tabRelViewList +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsEnumItemVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsEnumItemVO.java
new file mode 100644
index 0000000..12e051c
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsEnumItemVO.java
@@ -0,0 +1,196 @@
+package com.vci.web.pageModel;
+
+
+import java.util.Date;
+
+/**
+ *
+ * 鏋氫妇椤�
+ * @author weidy
+ * @date 2019/10/11 5:14 PM
+ */
+public class OsEnumItemVO implements java.io.Serializable {
+
+
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = -8490729816444166224L;
+
+
+    /**
+     * 涓婚敭
+     */
+    private String oid;
+
+    /**
+     * 鎵�灞炴灇涓�
+     */
+    private String pkEnum;
+
+    /**
+     * 鏋氫妇鍊�
+     */
+    private String id;
+
+    /**
+     * 鏋氫妇鏄剧ず鍚嶇О
+     */
+    private String name;
+
+    /**
+     * 鎻忚堪
+     */
+    private String description;
+
+    /**
+     * 涓氬姟绫诲瀷鍚嶇О
+     */
+    private String btmname;
+
+    /**
+     * 鎷ユ湁鑰�
+     */
+    private String owner;
+
+    /**
+     * 鍒涘缓浜�
+     */
+    private String creator;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    private Date createTime;
+
+    /**
+     * 鏈�鍚庝慨鏀逛汉
+     */
+    private String lastModifier;
+
+    /**
+     * 鏈�鍚庝慨鏀规椂闂达紝鏍煎紡鏄痽yyy-MM-dd HH:mm:ss
+     */
+    private Date lastModifyTime;
+
+    /**
+     * 鏃堕棿鎴筹紝鏍煎紡鏄痽yyy-MM-dd HH:mm:ss.SSS
+     */
+    private Date ts;
+
+
+    public String getOid() {
+        return oid;
+    }
+
+    public void setOid(String oid) {
+        this.oid = oid;
+    }
+
+    public String getPkEnum() {
+        return pkEnum;
+    }
+
+    public void setPkEnum(String pkEnum) {
+        this.pkEnum = pkEnum;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getCreator() {
+        return creator;
+    }
+
+    public void setCreator(String creator) {
+        this.creator = creator;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getLastModifier() {
+        return lastModifier;
+    }
+
+    public void setLastModifier(String lastModifier) {
+        this.lastModifier = lastModifier;
+    }
+
+    public Date getLastModifyTime() {
+        return lastModifyTime;
+    }
+
+    public void setLastModifyTime(Date lastModifyTime) {
+        this.lastModifyTime = lastModifyTime;
+    }
+
+    public Date getTs() {
+        return ts;
+    }
+
+    public void setTs(Date ts) {
+        this.ts = ts;
+    }
+
+
+    public String getBtmname() {
+        return btmname;
+    }
+
+    public void setBtmname(String btmname) {
+        this.btmname = btmname;
+    }
+
+    public String getOwner() {
+        return owner;
+    }
+
+    public void setOwner(String owner) {
+        this.owner = owner;
+    }
+
+    @Override
+    public String toString() {
+        return "OsEnumItemVO{" +
+                "oid='" + oid + '\'' +
+                ", pkEnum='" + pkEnum + '\'' +
+                ", id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", description='" + description + '\'' +
+                ", btmname='" + btmname + '\'' +
+                ", owner='" + owner + '\'' +
+                ", creator='" + creator + '\'' +
+                ", createTime=" + createTime +
+                ", lastModifier='" + lastModifier + '\'' +
+                ", lastModifyTime=" + lastModifyTime +
+                ", ts=" + ts +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsEnumVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsEnumVO.java
new file mode 100644
index 0000000..1e82fd8
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsEnumVO.java
@@ -0,0 +1,249 @@
+package com.vci.web.pageModel;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 鏋氫妇鏄剧ず瀵硅薄
+ * @author weidy
+ * @date 2019/10/11 5:05 PM
+ */
+public class OsEnumVO implements java.io.Serializable {
+
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = 3041129044926791734L;
+
+    /**
+     * 涓婚敭
+     */
+    private String oid;
+
+    /**
+     * 鏋氫妇鑻辨枃鍚嶇О
+     */
+    private String id;
+
+    /**
+     * 鏋氫妇涓枃鍚嶇О
+     */
+    private String name;
+
+    /**
+     * 鎻忚堪
+     */
+    private String description;
+
+    /**
+     * 鏋氫妇鍊肩被鍨�
+     */
+    private String enumValueDataType;
+
+    /**
+     * 鏋氫妇鍊肩被鍨嬫樉绀烘枃鏈�
+     */
+    private String enumValueDataTypeText;
+
+    /**
+     * 闀垮害
+     */
+    private Integer length;
+
+    /**
+     * 涓氬姟绫诲瀷鍚嶇О
+     */
+    private String btmname;
+
+    /**
+     * 鎷ユ湁鑰�
+     */
+    private String owner;
+
+    /**
+     * 鍒涘缓浜�
+     */
+    private String creator;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    private Date createTime;
+
+    /**
+     * 鏈�鍚庝慨鏀逛汉
+     */
+    private String lastModifier;
+
+    /**
+     * 鏈�鍚庝慨鏀规椂闂达紝鏍煎紡鏄痽yyy-MM-dd HH:mm:ss
+     */
+    private Date lastModifyTime;
+
+    /**
+     * 鏃堕棿鎴筹紝鏍煎紡鏄痽yyy-MM-dd HH:mm:ss.SSS
+     */
+    private Date ts;
+
+    /**
+     * 鍖呭惈鏋氫妇椤�
+     */
+    private List<OsEnumItemVO> items;
+
+    /**
+     * 鏋氫妇椤规槧灏勫��
+     */
+    private Map<String,String> itemMaps;
+
+    public String getOid() {
+        return oid;
+    }
+
+    public void setOid(String oid) {
+        this.oid = oid;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getEnumValueDataType() {
+        return enumValueDataType;
+    }
+
+    public void setEnumValueDataType(String enumValueDataType) {
+        this.enumValueDataType = enumValueDataType;
+    }
+
+    public String getEnumValueDataTypeText() {
+        return enumValueDataTypeText;
+    }
+
+    public void setEnumValueDataTypeText(String enumValueDataTypeText) {
+        this.enumValueDataTypeText = enumValueDataTypeText;
+    }
+
+    public Integer getLength() {
+        return length;
+    }
+
+    public void setLength(Integer length) {
+        this.length = length;
+    }
+
+    public String getCreator() {
+        return creator;
+    }
+
+    public void setCreator(String creator) {
+        this.creator = creator;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getLastModifier() {
+        return lastModifier;
+    }
+
+    public void setLastModifier(String lastModifier) {
+        this.lastModifier = lastModifier;
+    }
+
+    public Date getLastModifyTime() {
+        return lastModifyTime;
+    }
+
+    public void setLastModifyTime(Date lastModifyTime) {
+        this.lastModifyTime = lastModifyTime;
+    }
+
+    public Date getTs() {
+        return ts;
+    }
+
+    public void setTs(Date ts) {
+        this.ts = ts;
+    }
+
+    public List<OsEnumItemVO> getItems() {
+        return items;
+    }
+
+    public void setItems(List<OsEnumItemVO> items) {
+        this.items = items;
+    }
+
+    public Map<String, String> getItemMaps() {
+        return itemMaps;
+    }
+
+    public void setItemMaps(Map<String, String> itemMaps) {
+        this.itemMaps = itemMaps;
+    }
+
+
+    public String getBtmname() {
+        return btmname;
+    }
+
+    public void setBtmname(String btmname) {
+        this.btmname = btmname;
+    }
+
+    public String getOwner() {
+        return owner;
+    }
+
+    public void setOwner(String owner) {
+        this.owner = owner;
+    }
+
+    @Override
+    public String toString() {
+        return "OsEnumVO{" +
+                "oid='" + oid + '\'' +
+                ", id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", description='" + description + '\'' +
+                ", enumValueDataType='" + enumValueDataType + '\'' +
+                ", enumValueDataTypeText='" + enumValueDataTypeText + '\'' +
+                ", length=" + length +
+                ", btmname='" + btmname + '\'' +
+                ", owner='" + owner + '\'' +
+                ", creator='" + creator + '\'' +
+                ", createTime=" + createTime +
+                ", lastModifier='" + lastModifier + '\'' +
+                ", lastModifyTime=" + lastModifyTime +
+                ", ts=" + ts +
+                ", items=" + items +
+                ", itemMaps=" + itemMaps +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsLifeCycleLineBoundVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsLifeCycleLineBoundVO.java
new file mode 100644
index 0000000..f685b8e
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsLifeCycleLineBoundVO.java
@@ -0,0 +1,113 @@
+package com.vci.web.pageModel;
+
+/**
+ * 鐢熷懡鍛ㄦ湡鐨勮繛鎺ョ嚎
+ * @author weidy
+ * @date 2022-1-12
+ */
+public class OsLifeCycleLineBoundVO implements java.io.Serializable {
+
+    /**
+     * 涓婚敭
+     */
+    private String id;
+
+    /**
+     * 鍚嶇О
+     */
+    private String name;
+
+    /**
+     * 璧风偣x
+     */
+    private String cellx;
+
+    /**
+     * 璧风偣y
+     */
+    private String celly;
+
+    /**
+     * 瀹藉害
+     */
+    private String cellw;
+
+    /**
+     * 楂樺害
+     */
+    private String cellh;
+
+    /**
+     * 鍥炬爣
+     */
+    private String cellicon;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getCellx() {
+        return cellx;
+    }
+
+    public void setCellx(String cellx) {
+        this.cellx = cellx;
+    }
+
+    public String getCelly() {
+        return celly;
+    }
+
+    public void setCelly(String celly) {
+        this.celly = celly;
+    }
+
+    public String getCellw() {
+        return cellw;
+    }
+
+    public void setCellw(String cellw) {
+        this.cellw = cellw;
+    }
+
+    public String getCellh() {
+        return cellh;
+    }
+
+    public void setCellh(String cellh) {
+        this.cellh = cellh;
+    }
+
+    public String getCellicon() {
+        return cellicon;
+    }
+
+    public void setCellicon(String cellicon) {
+        this.cellicon = cellicon;
+    }
+
+    @Override
+    public String toString() {
+        return "OsLifeCycleLineBoundVO{" +
+                "id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", cellx='" + cellx + '\'' +
+                ", celly='" + celly + '\'' +
+                ", cellw='" + cellw + '\'' +
+                ", cellh='" + cellh + '\'' +
+                ", cellicon='" + cellicon + '\'' +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsLifeCycleLineEventVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsLifeCycleLineEventVO.java
new file mode 100644
index 0000000..ed039f1
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsLifeCycleLineEventVO.java
@@ -0,0 +1,192 @@
+package com.vci.web.pageModel;
+
+
+import java.util.Date;
+
+/**
+ * 鐢熷懡鍛ㄦ湡杩炴帴绾夸簨浠�
+ * @author weidy
+ * @date 2019/10/11 4:54 PM
+ */
+public class OsLifeCycleLineEventVO implements java.io.Serializable{
+
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = 216430078444875215L;
+
+    /**
+     * 涓婚敭
+     */
+    private String oid;
+
+    /**
+     * 鎵�灞炵敓鍛藉懆鏈熻繛鎺ョ嚎涓婚敭
+     */
+    private String pkLifeCycleLine;
+
+    /**
+     * 浜嬩欢鐨勫叏璺緞
+     */
+    private String eventFullName;
+
+    /**
+     * 浜嬩欢鐨勫悕绉�
+     */
+    private String eventShowName;
+
+    /**
+     * 鎺掑簭鍙�
+     */
+    private Integer orderNum;
+
+    /**
+     * 涓氬姟绫诲瀷鍚嶇О
+     */
+    private String btmname;
+
+    /**
+     * 鎷ユ湁鑰�
+     */
+    private String owner;
+
+    /**
+     * 鍒涘缓浜�
+     */
+    private String creator;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    private Date createTime;
+
+    /**
+     * 鏈�鍚庝慨鏀逛汉
+     */
+    private String lastModifier;
+
+    /**
+     * 鏈�鍚庝慨鏀规椂闂达紝鏍煎紡鏄痽yyy-MM-dd HH:mm:ss
+     */
+    private Date lastModifyTime;
+
+    /**
+     * 鏃堕棿鎴筹紝鏍煎紡鏄痽yyy-MM-dd HH:mm:ss.SSS
+     */
+    private Date ts;
+
+    public String getOid() {
+        return oid;
+    }
+
+    public void setOid(String oid) {
+        this.oid = oid;
+    }
+
+    public String getPkLifeCycleLine() {
+        return pkLifeCycleLine;
+    }
+
+    public void setPkLifeCycleLine(String pkLifeCycleLine) {
+        this.pkLifeCycleLine = pkLifeCycleLine;
+    }
+
+    public String getEventFullName() {
+        return eventFullName;
+    }
+
+    public void setEventFullName(String eventFullName) {
+        this.eventFullName = eventFullName;
+    }
+
+    public String getEventShowName() {
+        return eventShowName;
+    }
+
+    public void setEventShowName(String eventShowName) {
+        this.eventShowName = eventShowName;
+    }
+
+    public String getCreator() {
+        return creator;
+    }
+
+    public void setCreator(String creator) {
+        this.creator = creator;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getLastModifier() {
+        return lastModifier;
+    }
+
+    public void setLastModifier(String lastModifier) {
+        this.lastModifier = lastModifier;
+    }
+
+    public Date getLastModifyTime() {
+        return lastModifyTime;
+    }
+
+    public void setLastModifyTime(Date lastModifyTime) {
+        this.lastModifyTime = lastModifyTime;
+    }
+
+    public Date getTs() {
+        return ts;
+    }
+
+    public void setTs(Date ts) {
+        this.ts = ts;
+    }
+
+    public Integer getOrderNum() {
+        return orderNum;
+    }
+
+    public void setOrderNum(Integer orderNum) {
+        this.orderNum = orderNum;
+    }
+
+
+    public String getBtmname() {
+        return btmname;
+    }
+
+    public void setBtmname(String btmname) {
+        this.btmname = btmname;
+    }
+
+    public String getOwner() {
+        return owner;
+    }
+
+    public void setOwner(String owner) {
+        this.owner = owner;
+    }
+
+    @Override
+    public String toString() {
+        return "OsLifeCycleLineEventVO{" +
+                "oid='" + oid + '\'' +
+                ", pkLifeCycleLine='" + pkLifeCycleLine + '\'' +
+                ", eventFullName='" + eventFullName + '\'' +
+                ", eventShowName='" + eventShowName + '\'' +
+                ", orderNum=" + orderNum +
+                ", btmname='" + btmname + '\'' +
+                ", owner='" + owner + '\'' +
+                ", creator='" + creator + '\'' +
+                ", createTime=" + createTime +
+                ", lastModifier='" + lastModifier + '\'' +
+                ", lastModifyTime=" + lastModifyTime +
+                ", ts=" + ts +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsLifeCycleLineVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsLifeCycleLineVO.java
new file mode 100644
index 0000000..286bd25
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsLifeCycleLineVO.java
@@ -0,0 +1,247 @@
+package com.vci.web.pageModel;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 鐢熷懡鍛ㄦ湡杩炴帴绾�
+ * @author weidy
+ * @date 2019/10/11 4:48 PM
+ */
+public class OsLifeCycleLineVO implements java.io.Serializable {
+
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = 1429889911601940640L;
+
+    /**
+     * 鎵�灞炵敓鍛藉懆鏈�
+     */
+    private String pkLifeCycle;
+
+    /**
+     * 婧愮姸鎬佷唬鍙�
+     */
+    private String sourceLifeStatus;
+
+    /**
+     * 婧愮姸鎬佸悕绉�
+     */
+    private String sourceLifeStatusName;
+
+    /**
+     * 鐩爣鐘舵�佷唬鍙�
+     */
+    private String targetLifeStatus;
+
+    /**
+     * 鐩爣鐘舵�佸悕绉�
+     */
+    private String targetLifeStatusName;
+
+    /**
+     * 杩炴帴绾垮悕绉�
+     */
+    private String name;
+
+    /**
+     * 杩炴帴绾夸綅缃俊鎭�
+     */
+    private String transLineSiteInfo;
+
+    /**
+     * 涓婚敭
+     */
+    private String oid;
+
+    /**
+     * 涓氬姟绫诲瀷鍚嶇О
+     */
+    private String btmname;
+
+    /**
+     * 鎷ユ湁鑰�
+     */
+    private String owner;
+
+    /**
+     * 鍒涘缓浜�
+     */
+    private String creator;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    private Date createTime;
+
+    /**
+     * 鏈�鍚庝慨鏀逛汉
+     */
+    private String lastModifier;
+
+    /**
+     * 鏈�鍚庝慨鏀规椂闂达紝鏍煎紡鏄痽yyy-MM-dd HH:mm:ss
+     */
+    private Date lastModifyTime;
+
+    /**
+     * 鏃堕棿鎴筹紝鏍煎紡鏄痽yyy-MM-dd HH:mm:ss.SSS
+     */
+    private Date ts;
+
+    /**
+     * 鍖呭惈浜嬩欢
+     */
+    private OsLifeCycleLineEventVO[] events;
+
+    public String getPkLifeCycle() {
+        return pkLifeCycle;
+    }
+
+    public void setPkLifeCycle(String pkLifeCycle) {
+        this.pkLifeCycle = pkLifeCycle;
+    }
+
+    public String getSourceLifeStatus() {
+        return sourceLifeStatus;
+    }
+
+    public void setSourceLifeStatus(String sourceLifeStatus) {
+        this.sourceLifeStatus = sourceLifeStatus;
+    }
+
+    public String getSourceLifeStatusName() {
+        return sourceLifeStatusName;
+    }
+
+    public void setSourceLifeStatusName(String sourceLifeStatusName) {
+        this.sourceLifeStatusName = sourceLifeStatusName;
+    }
+
+    public String getTargetLifeStatus() {
+        return targetLifeStatus;
+    }
+
+    public void setTargetLifeStatus(String targetLifeStatus) {
+        this.targetLifeStatus = targetLifeStatus;
+    }
+
+    public String getTargetLifeStatusName() {
+        return targetLifeStatusName;
+    }
+
+    public void setTargetLifeStatusName(String targetLifeStatusName) {
+        this.targetLifeStatusName = targetLifeStatusName;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getTransLineSiteInfo() {
+        return transLineSiteInfo;
+    }
+
+    public void setTransLineSiteInfo(String transLineSiteInfo) {
+        this.transLineSiteInfo = transLineSiteInfo;
+    }
+
+    public String getOid() {
+        return oid;
+    }
+
+    public void setOid(String oid) {
+        this.oid = oid;
+    }
+
+    public String getCreator() {
+        return creator;
+    }
+
+    public void setCreator(String creator) {
+        this.creator = creator;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getLastModifier() {
+        return lastModifier;
+    }
+
+    public void setLastModifier(String lastModifier) {
+        this.lastModifier = lastModifier;
+    }
+
+    public Date getLastModifyTime() {
+        return lastModifyTime;
+    }
+
+    public void setLastModifyTime(Date lastModifyTime) {
+        this.lastModifyTime = lastModifyTime;
+    }
+
+    public Date getTs() {
+        return ts;
+    }
+
+    public void setTs(Date ts) {
+        this.ts = ts;
+    }
+
+    public OsLifeCycleLineEventVO[] getEvents() {
+        return events;
+    }
+
+    public void setEvents(OsLifeCycleLineEventVO[] events) {
+        this.events = events;
+    }
+
+    public String getBtmname() {
+        return btmname;
+    }
+
+    public void setBtmname(String btmname) {
+        this.btmname = btmname;
+    }
+
+    public String getOwner() {
+        return owner;
+    }
+
+    public void setOwner(String owner) {
+        this.owner = owner;
+    }
+
+    @Override
+    public String toString() {
+        return "OsLifeCycleLineVO{" +
+                "pkLifeCycle='" + pkLifeCycle + '\'' +
+                ", sourceLifeStatus='" + sourceLifeStatus + '\'' +
+                ", sourceLifeStatusName='" + sourceLifeStatusName + '\'' +
+                ", targetLifeStatus='" + targetLifeStatus + '\'' +
+                ", targetLifeStatusName='" + targetLifeStatusName + '\'' +
+                ", name='" + name + '\'' +
+                ", transLineSiteInfo='" + transLineSiteInfo + '\'' +
+                ", oid='" + oid + '\'' +
+                ", btmname='" + btmname + '\'' +
+                ", owner='" + owner + '\'' +
+                ", creator='" + creator + '\'' +
+                ", createTime=" + createTime +
+                ", lastModifier='" + lastModifier + '\'' +
+                ", lastModifyTime=" + lastModifyTime +
+                ", ts=" + ts +
+                ", events=" + events +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsLifeCycleVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsLifeCycleVO.java
new file mode 100644
index 0000000..c6d0f5b
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsLifeCycleVO.java
@@ -0,0 +1,248 @@
+package com.vci.web.pageModel;
+
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 鐢熷懡鍛ㄦ湡鏄剧ず瀵硅薄
+ * @author weidy
+ * @date 2019/10/11 4:45 PM
+ */
+public class OsLifeCycleVO implements java.io.Serializable{
+
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = 5567711696707791107L;
+
+    /**
+     * 涓婚敭
+     */
+    private String oid;
+
+    /**
+     * 鐢熷懡鍛ㄦ湡缂栧彿
+     */
+    private String id;
+
+    /**
+     * 鐢熷懡鍛ㄦ湡鍚嶇О
+     */
+    private String name;
+
+    /**
+     * 鎻忚堪
+     */
+    private String description;
+
+    /**
+     * 绫荤殑鍏ㄨ矾寰�
+     */
+    private String classFullName;
+
+    /**
+     * 璧峰鐘舵��
+     */
+    private String startStatus;
+
+    /**
+     * 璧峰鐘舵�佸悕绉�
+     */
+    private String startStatusName;
+
+    /**
+     * 涓氬姟绫诲瀷鍚嶇О
+     */
+    private String btmname;
+
+    /**
+     * 鎷ユ湁鑰�
+     */
+    private String owner;
+
+    /**
+     * 鍒涘缓浜�
+     */
+    private String creator;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    private Date createTime;
+
+    /**
+     * 鏈�鍚庝慨鏀逛汉
+     */
+    private String lastModifier;
+
+    /**
+     * 鏈�鍚庝慨鏀规椂闂达紝鏍煎紡鏄痽yyy-MM-dd HH:mm:ss
+     */
+    private Date lastModifyTime;
+
+    /**
+     * 鏃堕棿鎴筹紝鏍煎紡鏄痽yyy-MM-dd HH:mm:ss.SSS
+     */
+    private Date ts;
+
+    /**
+     * 鍖呭惈杩炴帴绾�
+     */
+    private List<OsLifeCycleLineVO> lines ;
+
+    /**
+     * 閾炬帴绾�
+     */
+    private OsLifeCycleLineBoundVO[] bounds;
+
+    public String getClassFullName() {
+        return classFullName;
+    }
+
+    public void setClassFullName(String classFullName) {
+        this.classFullName = classFullName;
+    }
+
+    public String getBtmname() {
+        return btmname;
+    }
+
+    public void setBtmname(String btmname) {
+        this.btmname = btmname;
+    }
+
+    public String getOwner() {
+        return owner;
+    }
+
+    public void setOwner(String owner) {
+        this.owner = owner;
+    }
+
+    public String getOid() {
+        return oid;
+    }
+
+    public void setOid(String oid) {
+        this.oid = oid;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getStartStatus() {
+        return startStatus;
+    }
+
+    public void setStartStatus(String startStatus) {
+        this.startStatus = startStatus;
+    }
+
+    public String getStartStatusName() {
+        return startStatusName;
+    }
+
+    public void setStartStatusName(String startStatusName) {
+        this.startStatusName = startStatusName;
+    }
+
+    public String getCreator() {
+        return creator;
+    }
+
+    public void setCreator(String creator) {
+        this.creator = creator;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getLastModifier() {
+        return lastModifier;
+    }
+
+    public void setLastModifier(String lastModifier) {
+        this.lastModifier = lastModifier;
+    }
+
+    public Date getLastModifyTime() {
+        return lastModifyTime;
+    }
+
+    public void setLastModifyTime(Date lastModifyTime) {
+        this.lastModifyTime = lastModifyTime;
+    }
+
+    public Date getTs() {
+        return ts;
+    }
+
+    public void setTs(Date ts) {
+        this.ts = ts;
+    }
+
+    public List<OsLifeCycleLineVO> getLines() {
+        return lines;
+    }
+
+    public void setLines(List<OsLifeCycleLineVO> lines) {
+        this.lines = lines;
+    }
+
+    public OsLifeCycleLineBoundVO[] getBounds() {
+        return bounds;
+    }
+
+    public void setBounds(OsLifeCycleLineBoundVO[] bounds) {
+        this.bounds = bounds;
+    }
+
+    @Override
+    public String toString() {
+        return "OsLifeCycleVO{" +
+                "oid='" + oid + '\'' +
+                ", id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", description='" + description + '\'' +
+                ", classFullName='" + classFullName + '\'' +
+                ", startStatus='" + startStatus + '\'' +
+                ", startStatusName='" + startStatusName + '\'' +
+                ", btmname='" + btmname + '\'' +
+                ", owner='" + owner + '\'' +
+                ", creator='" + creator + '\'' +
+                ", createTime=" + createTime +
+                ", lastModifier='" + lastModifier + '\'' +
+                ", lastModifyTime=" + lastModifyTime +
+                ", ts=" + ts +
+                ", lines=" + lines +
+                ", bounds=" + Arrays.toString(bounds) +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsLinkTypeAttributeVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsLinkTypeAttributeVO.java
new file mode 100644
index 0000000..1e8d74f
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsLinkTypeAttributeVO.java
@@ -0,0 +1,390 @@
+package com.vci.web.pageModel;
+
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * 閾炬帴绫诲瀷鍖呭惈鐨勫睘鎬�
+ * @author weidy
+ * @date 2019/10/11 6:16 PM
+ */
+public class OsLinkTypeAttributeVO implements java.io.Serializable{
+
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = 7591988478074135448L;
+
+    /**
+     * 涓婚敭
+     */
+    private String oid;
+
+    /**
+     * 鎵�灞炰笟鍔$被鍨�
+     */
+    private String pkLinkType;
+
+    /**
+     * 灞炴�х殑瀛楁鍚嶇О
+     */
+    private String id;
+
+    /**
+     * 灞炴�х殑涓枃鍚嶇О
+     */
+    private String name;
+
+    /**
+     * 灞炴�у湪鏈笟鍔$被鍨嬩腑鐨勬弿杩�
+     */
+    private String description;
+
+    /**
+     * 灞炴�х殑闀垮害
+     */
+    private Integer attributeLength;
+
+    /**
+     * 鏁版嵁绫诲瀷
+     */
+    private String attrDataType;
+
+    /**
+     * 鏄惁鍙互涓虹┖
+     */
+    private boolean nullableFlag;
+
+    /**
+     * 榛樿鍊�
+     */
+    private String defaultValue;
+
+    /**
+     * 灏忔暟绮惧害浣嶆暟
+     */
+    private Integer precisionLength;
+
+    /**
+     * 鍒诲害
+     */
+    private Integer scaleLength;
+
+    /**
+     * 鍙栧�艰寖鍥�
+     */
+    private String range;
+
+    /**
+     * 鍙傜収涓氬姟绫诲瀷
+     */
+    private String referBtmTypeId;
+
+    /**
+     * 鍙傜収涓氬姟绫诲瀷鍚嶇О
+     */
+    private String referBtmTypeName;
+
+    /**
+     * 鏄惁鍙傜収
+     */
+    private boolean referFlag;
+
+    /**
+     * 鏋氫妇缂栧彿
+     */
+    private String enumId;
+
+    /**
+     * 鏋氫妇鍚嶇О
+     */
+    private String enumName;
+
+    /**
+     * 鏄惁鏋氫妇
+     */
+    private boolean enumFlag;
+
+    /**
+     * 鍖呭惈鏋氫妇鐨勫��
+     */
+    private Map<String,String> enumItemMap;
+
+    /**
+     * 涓氬姟绫诲瀷鍚嶇О
+     */
+    private String btmname;
+
+    /**
+     * 鎷ユ湁鑰�
+     */
+    private String owner;
+
+    /**
+     * 鍒涘缓浜�
+     */
+    private String creator;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    private Date createTime;
+
+    /**
+     * 鏈�鍚庝慨鏀逛汉
+     */
+    private String lastModifier;
+
+    /**
+     * 鏈�鍚庝慨鏀规椂闂达紝鏍煎紡鏄痽yyy-MM-dd HH:mm:ss
+     */
+    private Date lastModifyTime;
+
+    /**
+     * 鏃堕棿鎴筹紝鏍煎紡鏄痽yyy-MM-dd HH:mm:ss.SSS
+     */
+    private Date ts;
+
+    public String getBtmname() {
+        return btmname;
+    }
+
+    public void setBtmname(String btmname) {
+        this.btmname = btmname;
+    }
+
+    public String getOwner() {
+        return owner;
+    }
+
+    public void setOwner(String owner) {
+        this.owner = owner;
+    }
+
+    public void setOid(String oid) {
+        this.oid = oid;
+    }
+
+    public void setPkLinkType(String pkLinkType) {
+        this.pkLinkType = pkLinkType;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public void setAttrDataType(String attrDataType) {
+        this.attrDataType = attrDataType;
+    }
+
+    public void setReferBtmTypeId(String referBtmTypeId) {
+        this.referBtmTypeId = referBtmTypeId;
+    }
+
+    public void setReferBtmTypeName(String referBtmTypeName) {
+        this.referBtmTypeName = referBtmTypeName;
+    }
+
+    public void setReferFlag(boolean referFlag) {
+        this.referFlag = referFlag;
+    }
+
+    public void setEnumId(String enumId) {
+        this.enumId = enumId;
+    }
+
+    public void setEnumName(String enumName) {
+        this.enumName = enumName;
+    }
+
+    public void setEnumFlag(boolean enumFlag) {
+        this.enumFlag = enumFlag;
+    }
+
+    public void setEnumItemMap(Map<String, String> enumItemMap) {
+        this.enumItemMap = enumItemMap;
+    }
+
+    public void setCreator(String creator) {
+        this.creator = creator;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public void setLastModifier(String lastModifier) {
+        this.lastModifier = lastModifier;
+    }
+
+    public void setLastModifyTime(Date lastModifyTime) {
+        this.lastModifyTime = lastModifyTime;
+    }
+
+    public void setTs(Date ts) {
+        this.ts = ts;
+    }
+
+    public void setNullableFlag(boolean nullableFlag) {
+        this.nullableFlag = nullableFlag;
+    }
+
+    public void setDefaultValue(String defaultValue) {
+        this.defaultValue = defaultValue;
+    }
+
+    public void setPrecisionLength(Integer precisionLength) {
+        this.precisionLength = precisionLength;
+    }
+
+
+    public String getOid() {
+        return oid;
+    }
+
+    public String getPkLinkType() {
+        return pkLinkType;
+    }
+
+
+    public String getDescription() {
+        return description;
+    }
+
+    public String getAttrDataType() {
+        return attrDataType;
+    }
+
+    public String getReferBtmTypeId() {
+        return referBtmTypeId;
+    }
+
+    public String getReferBtmTypeName() {
+        return referBtmTypeName;
+    }
+
+    public boolean isReferFlag() {
+        return referFlag;
+    }
+
+    public String getEnumId() {
+        return enumId;
+    }
+
+    public String getEnumName() {
+        return enumName;
+    }
+
+    public boolean isEnumFlag() {
+        return enumFlag;
+    }
+
+    public Map<String, String> getEnumItemMap() {
+        return enumItemMap;
+    }
+
+    public String getCreator() {
+        return creator;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public String getLastModifier() {
+        return lastModifier;
+    }
+
+    public Date getLastModifyTime() {
+        return lastModifyTime;
+    }
+
+    public Date getTs() {
+        return ts;
+    }
+
+    public boolean isNullableFlag() {
+        return nullableFlag;
+    }
+
+    public String getDefaultValue() {
+        return defaultValue;
+    }
+
+    public Integer getPrecisionLength() {
+        return precisionLength;
+    }
+
+    public String getRange() {
+        return range;
+    }
+
+    public void setRange(String range) {
+        this.range = range;
+    }
+
+    public Integer getAttributeLength() {
+        return attributeLength;
+    }
+
+    public void setAttributeLength(Integer attributeLength) {
+        this.attributeLength = attributeLength;
+    }
+
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Integer getScaleLength() {
+        return scaleLength;
+    }
+
+    public void setScaleLength(Integer scaleLength) {
+        this.scaleLength = scaleLength;
+    }
+
+    @Override
+    public String toString() {
+        return "OsLinkTypeAttributeVO{" +
+                "oid='" + oid + '\'' +
+                ", pkLinkType='" + pkLinkType + '\'' +
+                ", id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", description='" + description + '\'' +
+                ", attributeLength=" + attributeLength +
+                ", attrDataType='" + attrDataType + '\'' +
+                ", nullableFlag=" + nullableFlag +
+                ", defaultValue='" + defaultValue + '\'' +
+                ", precisionLength=" + precisionLength +
+                ", scaleLength=" + scaleLength +
+                ", range='" + range + '\'' +
+                ", referBtmTypeId='" + referBtmTypeId + '\'' +
+                ", referBtmTypeName='" + referBtmTypeName + '\'' +
+                ", referFlag=" + referFlag +
+                ", enumId='" + enumId + '\'' +
+                ", enumName='" + enumName + '\'' +
+                ", enumFlag=" + enumFlag +
+                ", enumItemMap=" + enumItemMap +
+                ", btmname='" + btmname + '\'' +
+                ", owner='" + owner + '\'' +
+                ", creator='" + creator + '\'' +
+                ", createTime=" + createTime +
+                ", lastModifier='" + lastModifier + '\'' +
+                ", lastModifyTime=" + lastModifyTime +
+                ", ts=" + ts +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsLinkTypeVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsLinkTypeVO.java
new file mode 100644
index 0000000..caa5416
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsLinkTypeVO.java
@@ -0,0 +1,305 @@
+package com.vci.web.pageModel;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ *
+ * 閾炬帴绫诲瀷鏄剧ず瀵硅薄
+ * @author weidy
+ * @date 2019/10/11 6:04 PM
+ */
+public class OsLinkTypeVO implements java.io.Serializable {
+
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = 2289872385854194102L;
+
+    /**
+     * 涓婚敭
+     */
+    private String oid;
+
+    /**
+     * 閾炬帴绫诲瀷鑻辨枃鍚嶇О
+     */
+    private String id;
+
+    /**
+     * 閾炬帴绫诲瀷涓枃鍚嶇О
+     */
+    private String name;
+
+    /**
+     * 鎻忚堪
+     */
+    private String description;
+
+    /**
+     * c#
+     */
+    private String shape;
+
+    /**
+     * 瀹炵幇绫�
+     */
+    private String implClass;
+
+    /**
+     * from绔笟鍔$被鍨�
+     */
+    private String fromBtmType;
+
+    /**
+     * from绔笟鍔$被鍨嬫樉绀哄璞�
+     */
+    private List<OsBtmTypeVO> fromBtmTypeVOS;
+
+    /**
+     * from绔笟鍔$被鍨嬪悕绉�
+     */
+    private String fromBtmTypeName;
+
+    /**
+     * to绔笟鍔$被鍨�
+     */
+    private String toBtmType;
+
+    /**
+     * to绔笟鍔$被鍨嬪悕绉�
+     */
+    private String toBtmTypeName;
+
+    /**
+     * to绔笟鍔$被鍨嬫樉绀哄璞�
+     */
+    private List<OsBtmTypeVO> toBtmTypeVOS;
+
+    /**
+     * 涓氬姟绫诲瀷鍚嶇О
+     */
+    private String btmname;
+
+    /**
+     * 鎷ユ湁鑰�
+     */
+    private String owner;
+
+    /**
+     * 鍒涘缓浜�
+     */
+    private String creator;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    private Date createTime;
+
+    /**
+     * 鏈�鍚庝慨鏀逛汉
+     */
+    private String lastModifier;
+
+    /**
+     * 鏈�鍚庝慨鏀规椂闂达紝鏍煎紡鏄痽yyy-MM-dd HH:mm:ss
+     */
+    private Date lastModifyTime;
+
+    /**
+     * 鏃堕棿鎴筹紝鏍煎紡鏄痽yyy-MM-dd HH:mm:ss.SSS
+     */
+    private Date ts;
+
+    /**
+     * 鍖呭惈灞炴��
+     */
+    private List<OsLinkTypeAttributeVO> attributes;
+
+    public String getOid() {
+        return oid;
+    }
+
+    public void setOid(String oid) {
+        this.oid = oid;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getShape() {
+        return shape;
+    }
+
+    public void setShape(String shape) {
+        this.shape = shape;
+    }
+
+    public String getImplClass() {
+        return implClass;
+    }
+
+    public void setImplClass(String implClass) {
+        this.implClass = implClass;
+    }
+
+    public String getFromBtmType() {
+        return fromBtmType;
+    }
+
+    public void setFromBtmType(String fromBtmType) {
+        this.fromBtmType = fromBtmType;
+    }
+
+    public List<OsBtmTypeVO> getFromBtmTypeVOS() {
+        return fromBtmTypeVOS;
+    }
+
+    public void setFromBtmTypeVOS(List<OsBtmTypeVO> fromBtmTypeVOS) {
+        this.fromBtmTypeVOS = fromBtmTypeVOS;
+    }
+
+    public String getFromBtmTypeName() {
+        return fromBtmTypeName;
+    }
+
+    public void setFromBtmTypeName(String fromBtmTypeName) {
+        this.fromBtmTypeName = fromBtmTypeName;
+    }
+
+    public String getToBtmType() {
+        return toBtmType;
+    }
+
+    public void setToBtmType(String toBtmType) {
+        this.toBtmType = toBtmType;
+    }
+
+    public String getToBtmTypeName() {
+        return toBtmTypeName;
+    }
+
+    public void setToBtmTypeName(String toBtmTypeName) {
+        this.toBtmTypeName = toBtmTypeName;
+    }
+
+    public List<OsBtmTypeVO> getToBtmTypeVOS() {
+        return toBtmTypeVOS;
+    }
+
+    public void setToBtmTypeVOS(List<OsBtmTypeVO> toBtmTypeVOS) {
+        this.toBtmTypeVOS = toBtmTypeVOS;
+    }
+
+    public String getCreator() {
+        return creator;
+    }
+
+    public void setCreator(String creator) {
+        this.creator = creator;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getLastModifier() {
+        return lastModifier;
+    }
+
+    public void setLastModifier(String lastModifier) {
+        this.lastModifier = lastModifier;
+    }
+
+    public Date getLastModifyTime() {
+        return lastModifyTime;
+    }
+
+    public void setLastModifyTime(Date lastModifyTime) {
+        this.lastModifyTime = lastModifyTime;
+    }
+
+    public Date getTs() {
+        return ts;
+    }
+
+    public void setTs(Date ts) {
+        this.ts = ts;
+    }
+
+    public List<OsLinkTypeAttributeVO> getAttributes() {
+        return attributes;
+    }
+
+    public void setAttributes(List<OsLinkTypeAttributeVO> attributes) {
+        this.attributes = attributes;
+    }
+
+
+    public String getBtmname() {
+        return btmname;
+    }
+
+    public void setBtmname(String btmname) {
+        this.btmname = btmname;
+    }
+
+    public String getOwner() {
+        return owner;
+    }
+
+    public void setOwner(String owner) {
+        this.owner = owner;
+    }
+
+    @Override
+    public String toString() {
+        return "OsLinkTypeVO{" +
+                "oid='" + oid + '\'' +
+                ", id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", description='" + description + '\'' +
+                ", shape='" + shape + '\'' +
+                ", implClass='" + implClass + '\'' +
+                ", fromBtmType='" + fromBtmType + '\'' +
+                ", fromBtmTypeVOS=" + fromBtmTypeVOS +
+                ", fromBtmTypeName='" + fromBtmTypeName + '\'' +
+                ", toBtmType='" + toBtmType + '\'' +
+                ", toBtmTypeName='" + toBtmTypeName + '\'' +
+                ", toBtmTypeVOS=" + toBtmTypeVOS +
+                ", btmname='" + btmname + '\'' +
+                ", owner='" + owner + '\'' +
+                ", creator='" + creator + '\'' +
+                ", createTime=" + createTime +
+                ", lastModifier='" + lastModifier + '\'' +
+                ", lastModifyTime=" + lastModifyTime +
+                ", ts=" + ts +
+                ", attributes=" + attributes +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsRevisionRuleVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsRevisionRuleVO.java
new file mode 100644
index 0000000..ac36ee3
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsRevisionRuleVO.java
@@ -0,0 +1,247 @@
+package com.vci.web.pageModel;
+
+import java.util.Date;
+
+/**
+ * 鐗堟湰瑙勫垯鏄剧ず瀵硅薄
+ * @author weidy
+ * @date 2019/10/11 5:19 PM
+ */
+public class OsRevisionRuleVO implements java.io.Serializable{
+
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = 3660658005636583687L;
+
+    /**
+     * 涓婚敭
+     */
+    private String oid;
+
+    /**
+     * 鑻辨枃鍚嶇О
+     */
+    private String id;
+
+    /**
+     * 涓枃鍚嶇О
+     */
+    private String name;
+
+    /**
+     * 璺宠穬瀛楃
+     */
+    private String skipCode;
+
+    /**
+     * 鍒濆鍊�
+     */
+    private String startCode;
+
+    /**
+     * 姝ラ暱
+     */
+    private Integer serialStep;
+
+    /**
+     * 鍓嶇紑
+     */
+    private String prefixCode;
+
+    /**
+     * 鍚庣紑
+     */
+    private String suffixCode;
+
+    /**
+     * 鎻忚堪
+     */
+    private String description;
+
+    /**
+     * 涓氬姟绫诲瀷鍚嶇О
+     */
+    private String btmname;
+
+    /**
+     * 鎷ユ湁鑰�
+     */
+    private String owner;
+
+    /**
+     * 鍒涘缓浜�
+     */
+    private String creator;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    private Date createTime;
+
+    /**
+     * 鏈�鍚庝慨鏀逛汉
+     */
+    private String lastModifier;
+
+    /**
+     * 鏈�鍚庝慨鏀规椂闂达紝鏍煎紡鏄痽yyy-MM-dd HH:mm:ss
+     */
+    private Date lastModifyTime;
+
+    /**
+     * 鏃堕棿鎴筹紝鏍煎紡鏄痽yyy-MM-dd HH:mm:ss.SSS
+     */
+    private Date ts;
+
+    public String getOid() {
+        return oid;
+    }
+
+    public void setOid(String oid) {
+        this.oid = oid;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getSkipCode() {
+        return skipCode;
+    }
+
+    public void setSkipCode(String skipCode) {
+        this.skipCode = skipCode;
+    }
+
+    public String getStartCode() {
+        return startCode;
+    }
+
+    public void setStartCode(String startCode) {
+        this.startCode = startCode;
+    }
+
+    public Integer getSerialStep() {
+        return serialStep;
+    }
+
+    public void setSerialStep(Integer serialStep) {
+        this.serialStep = serialStep;
+    }
+
+    public String getPrefixCode() {
+        return prefixCode;
+    }
+
+    public void setPrefixCode(String prefixCode) {
+        this.prefixCode = prefixCode;
+    }
+
+    public String getSuffixCode() {
+        return suffixCode;
+    }
+
+    public void setSuffixCode(String suffixCode) {
+        this.suffixCode = suffixCode;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getCreator() {
+        return creator;
+    }
+
+    public void setCreator(String creator) {
+        this.creator = creator;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getLastModifier() {
+        return lastModifier;
+    }
+
+    public void setLastModifier(String lastModifier) {
+        this.lastModifier = lastModifier;
+    }
+
+    public Date getLastModifyTime() {
+        return lastModifyTime;
+    }
+
+    public void setLastModifyTime(Date lastModifyTime) {
+        this.lastModifyTime = lastModifyTime;
+    }
+
+    public Date getTs() {
+        return ts;
+    }
+
+    public void setTs(Date ts) {
+        this.ts = ts;
+    }
+
+    public String getBtmname() {
+        return btmname;
+    }
+
+    public void setBtmname(String btmname) {
+        this.btmname = btmname;
+    }
+
+    public String getOwner() {
+        return owner;
+    }
+
+    public void setOwner(String owner) {
+        this.owner = owner;
+    }
+
+    @Override
+    public String toString() {
+        return "OsRevisionRuleVO{" +
+                "oid='" + oid + '\'' +
+                ", id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", skipCode='" + skipCode + '\'' +
+                ", startCode='" + startCode + '\'' +
+                ", serialStep=" + serialStep +
+                ", prefixCode='" + prefixCode + '\'' +
+                ", suffixCode='" + suffixCode + '\'' +
+                ", description='" + description + '\'' +
+                ", btmname='" + btmname + '\'' +
+                ", owner='" + owner + '\'' +
+                ", creator='" + creator + '\'' +
+                ", createTime=" + createTime +
+                ", lastModifier='" + lastModifier + '\'' +
+                ", lastModifyTime=" + lastModifyTime +
+                ", ts=" + ts +
+                '}';
+    }
+}
+
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsStatusVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsStatusVO.java
new file mode 100644
index 0000000..3847112
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsStatusVO.java
@@ -0,0 +1,178 @@
+package com.vci.web.pageModel;
+
+import java.util.Date;
+
+/**
+ * 鐘舵��
+ * @author weidy
+ * @date 2019/10/11 4:40 PM
+ */
+public class OsStatusVO implements java.io.Serializable {
+
+
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = 6084862289020441069L;
+
+    /**
+     * 涓婚敭
+     */
+    private String oid;
+
+    /**
+     * 鐘舵�佽嫳鏂囧悕绉�
+     */
+    private String id;
+
+    /**
+     * 鐘舵�佷腑鏂囧悕绉�
+     */
+    private String name;
+
+    /**
+     * 鎻忚堪
+     */
+    private String description;
+
+    /**
+     * 涓氬姟绫诲瀷鍚嶇О
+     */
+    private String btmname;
+
+    /**
+     * 鎷ユ湁鑰�
+     */
+    private String owner;
+
+    /**
+     * 鍒涘缓浜�
+     */
+    private String creator;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    private Date createTime;
+
+    /**
+     * 鏈�鍚庝慨鏀逛汉
+     */
+    private String lastModifier;
+
+    /**
+     * 鏈�鍚庝慨鏀规椂闂达紝鏍煎紡鏄痽yyy-MM-dd HH:mm:ss
+     */
+    private Date lastModifyTime;
+
+    /**
+     * 鏃堕棿鎴筹紝鏍煎紡鏄痽yyy-MM-dd HH:mm:ss.SSS
+     */
+    private Date ts;
+
+    public String getOid() {
+        return oid;
+    }
+
+    public void setOid(String oid) {
+        this.oid = oid;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getCreator() {
+        return creator;
+    }
+
+    public void setCreator(String creator) {
+        this.creator = creator;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getLastModifier() {
+        return lastModifier;
+    }
+
+    public void setLastModifier(String lastModifier) {
+        this.lastModifier = lastModifier;
+    }
+
+    public Date getLastModifyTime() {
+        return lastModifyTime;
+    }
+
+    public void setLastModifyTime(Date lastModifyTime) {
+        this.lastModifyTime = lastModifyTime;
+    }
+
+    public Date getTs() {
+        return ts;
+    }
+
+    public void setTs(Date ts) {
+        this.ts = ts;
+    }
+
+
+    public String getBtmname() {
+        return btmname;
+    }
+
+    public void setBtmname(String btmname) {
+        this.btmname = btmname;
+    }
+
+    public String getOwner() {
+        return owner;
+    }
+
+    public void setOwner(String owner) {
+        this.owner = owner;
+    }
+
+    @Override
+    public String toString() {
+        return "OsStatusVO{" +
+                "oid='" + oid + '\'' +
+                ", id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", description='" + description + '\'' +
+                ", btmname='" + btmname + '\'' +
+                ", owner='" + owner + '\'' +
+                ", creator='" + creator + '\'' +
+                ", createTime=" + createTime +
+                ", lastModifier='" + lastModifier + '\'' +
+                ", lastModifyTime=" + lastModifyTime +
+                ", ts=" + ts +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsUsedAttributeVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsUsedAttributeVO.java
new file mode 100644
index 0000000..ad3dc90
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/OsUsedAttributeVO.java
@@ -0,0 +1,90 @@
+package com.vci.web.pageModel;
+
+/**
+ * 寮曠敤灞炴�х殑涓氬姟绫诲瀷鎴栬�呴摼鎺ョ被鍨�
+ * @author weidy
+ * @date 2019/10/12 9:54 AM
+ */
+public class OsUsedAttributeVO implements java.io.Serializable{
+
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = 7681737944921711910L;
+
+    /**
+     * 鑻辨枃鍚嶇О
+     */
+    private String id;
+
+    /**
+     * 涓枃鍚嶇О
+     */
+    private String name;
+
+    /**
+     * 涓氬姟绫诲瀷涓婚敭
+     */
+    private String pkBtmType;
+
+    /**
+     * 閾炬帴绫诲瀷涓婚敭
+     */
+    private String pkLinkType;
+
+    /**
+     * 涓氬姟琛ㄧ被鍨�-涓氬姟绫诲瀷杩樻槸閾炬帴绫诲瀷
+     */
+    private String businessType;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getPkBtmType() {
+        return pkBtmType;
+    }
+
+    public void setPkBtmType(String pkBtmType) {
+        this.pkBtmType = pkBtmType;
+    }
+
+    public String getPkLinkType() {
+        return pkLinkType;
+    }
+
+    public void setPkLinkType(String pkLinkType) {
+        this.pkLinkType = pkLinkType;
+    }
+
+    public String getBusinessType() {
+        return businessType;
+    }
+
+    public void setBusinessType(String businessType) {
+        this.businessType = businessType;
+    }
+
+    @Override
+    public String toString() {
+        return "OsUsedAttributeVO{" +
+                "id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", pkBtmType='" + pkBtmType + '\'' +
+                ", pkLinkType='" + pkLinkType + '\'' +
+                ", businessType='" + businessType + '\'' +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/ProcessClassifyVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/ProcessClassifyVO.java
new file mode 100644
index 0000000..958a158
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/ProcessClassifyVO.java
@@ -0,0 +1,172 @@
+package com.vci.web.pageModel;
+
+import java.util.Date;
+
+/**
+ * 娴佺▼鍒嗙被鐨勬樉绀哄璞�
+ * @author weidy
+ * @date 2022-2-18
+ */
+public class ProcessClassifyVO implements java.io.Serializable {
+
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = -8798775629981856679L;
+    /**
+     * 娴佺▼鍒嗙被鐨勪富閿�
+     */
+    private String oid;
+
+    /**
+     * 鍒嗙被鍚嶇О
+     */
+    private String name;
+
+    /**
+     * 鎻忚堪
+     */
+    private String description;
+    /**
+     * 鍥炬爣鐨勮矾寰�
+     */
+    private String iconUrl;
+
+    /**
+     * 涓婄骇娴佺▼鍒嗙被涓婚敭
+     */
+    private String parentFlowClsOid;
+
+    /**
+     * 鍒涘缓浜�
+     */
+    private String creator;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    private Date createTime;
+
+    /**
+     * 鏈�鍚庝慨鏀逛汉
+     */
+    private String lastModifier;
+
+    /**
+     * 鏈�鍚庝慨鏀规椂闂�
+     */
+    private Date lastModifyTime;
+    /**
+     * 鏈�鍚庝慨鏀硅鑹�
+     */
+    private String modifyRole;
+    /**
+     * 鏈�鍚庝慨鏀圭殑缁勭粐
+     */
+    private String modifyOrg;
+
+    public String getOid() {
+        return oid;
+    }
+
+    public void setOid(String oid) {
+        this.oid = oid;
+    }
+
+    public String getIconUrl() {
+        return iconUrl;
+    }
+
+    public void setIconUrl(String iconUrl) {
+        this.iconUrl = iconUrl;
+    }
+
+    public String getParentFlowClsOid() {
+        return parentFlowClsOid;
+    }
+
+    public void setParentFlowClsOid(String parentFlowClsOid) {
+        this.parentFlowClsOid = parentFlowClsOid;
+    }
+
+    public String getCreator() {
+        return creator;
+    }
+
+    public void setCreator(String creator) {
+        this.creator = creator;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getLastModifier() {
+        return lastModifier;
+    }
+
+    public void setLastModifier(String lastModifier) {
+        this.lastModifier = lastModifier;
+    }
+
+    public Date getLastModifyTime() {
+        return lastModifyTime;
+    }
+
+    public void setLastModifyTime(Date lastModifyTime) {
+        this.lastModifyTime = lastModifyTime;
+    }
+
+    public String getModifyRole() {
+        return modifyRole;
+    }
+
+    public void setModifyRole(String modifyRole) {
+        this.modifyRole = modifyRole;
+    }
+
+    public String getModifyOrg() {
+        return modifyOrg;
+    }
+
+    public void setModifyOrg(String modifyOrg) {
+        this.modifyOrg = modifyOrg;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    @Override
+    public String toString() {
+        return "ProcessClassifyVO{" +
+                "oid='" + oid + '\'' +
+                ", name='" + name + '\'' +
+                ", description='" + description + '\'' +
+                ", iconUrl='" + iconUrl + '\'' +
+                ", parentFlowClsOid='" + parentFlowClsOid + '\'' +
+                ", creator='" + creator + '\'' +
+                ", createTime=" + createTime +
+                ", lastModifier='" + lastModifier + '\'' +
+                ", lastModifyTime=" + lastModifyTime +
+                ", modifyRole='" + modifyRole + '\'' +
+                ", modifyOrg='" + modifyOrg + '\'' +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/ProcessHistoryVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/ProcessHistoryVO.java
new file mode 100644
index 0000000..367f295
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/ProcessHistoryVO.java
@@ -0,0 +1,129 @@
+package com.vci.web.pageModel;
+
+/**
+ * 娴佺▼鍘嗗彶淇℃伅
+ * @author weidy
+ * @date 2021-2-12
+ */
+public class ProcessHistoryVO implements java.io.Serializable{
+
+	/**
+	 * 搴忓垪鍖�
+	 */
+	private static final long serialVersionUID = 3599413746826743191L;
+	
+	/**
+	 * 浠诲姟鍚嶇О
+	 */
+	private String taskName;
+	
+	/**
+	 * 鎵ц鎿嶄綔
+	 */
+	private String opinin;
+	
+	/**
+	 * 鍒涘缓鏃堕棿
+	 */
+	private String createTime;
+	
+	/**
+	 * 缁撴潫鏃堕棿
+	 */
+	private String endTime;
+	
+	/**
+	 * 瀹℃壒鎰忚
+	 */
+	private String node;
+
+	/**
+	 * 娴佺▼鎵цID
+	 */
+	private String executionId;
+	
+	/**
+	 * 鎵ц浜�
+	 */
+	private String assignee;
+	
+	/**
+	 * 鎵ц浜哄鍚�
+	 */
+	private String assigneeName;
+
+	public String getTaskName() {
+		return taskName;
+	}
+
+	public void setTaskName(String taskName) {
+		this.taskName = taskName;
+	}
+
+	public String getOpinin() {
+		return opinin;
+	}
+
+	public void setOpinin(String opinin) {
+		this.opinin = opinin;
+	}
+
+	public String getCreateTime() {
+		return createTime;
+	}
+
+	public void setCreateTime(String createTime) {
+		this.createTime = createTime;
+	}
+
+	public String getEndTime() {
+		return endTime;
+	}
+
+	public void setEndTime(String endTime) {
+		this.endTime = endTime;
+	}
+
+	public String getNode() {
+		return node;
+	}
+
+	public void setNode(String node) {
+		this.node = node;
+	}
+
+	public String getExecutionId() {
+		return executionId;
+	}
+
+	public void setExecutionId(String executionId) {
+		this.executionId = executionId;
+	}
+
+	public String getAssignee() {
+		return assignee;
+	}
+
+	public void setAssignee(String assignee) {
+		this.assignee = assignee;
+	}
+
+	public String getAssigneeName() {
+		return assigneeName;
+	}
+
+	public void setAssigneeName(String assigneeName) {
+		this.assigneeName = assigneeName;
+	}
+
+	@Override
+	public String toString() {
+		return "ProcessHistory [taskName=" + taskName + ", opinin=" + opinin
+				+ ", createTime=" + createTime + ", endTime=" + endTime
+				+ ", node=" + node + ", executionId=" + executionId
+				+ ", assignee=" + assignee + ", assigneeName=" + assigneeName
+				+ "]";
+	}
+	
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/ProcessInstanceVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/ProcessInstanceVO.java
new file mode 100644
index 0000000..da02172
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/ProcessInstanceVO.java
@@ -0,0 +1,50 @@
+package com.vci.web.pageModel;
+
+import com.vci.starter.web.pagemodel.BaseModelVO;
+
+/**
+ * 娴佺▼瀹炰緥鐨勬樉绀哄璞�
+ * @author weidy
+ * @date 2021-2-12
+ */
+public class ProcessInstanceVO extends BaseModelVO{
+
+	/**
+	 * 搴忓垪鍖�
+	 */
+	private static final long serialVersionUID = -4751909065306871740L;
+	
+	/**
+	 * 娴佺▼鐨勬墽琛孖D
+	 */
+	private String executionId;
+	
+	/**
+	 * 鍓嶇椤甸潰灞曠ずurl
+	 */
+	private String dataDetailDisplayUrl;
+
+	public String getExecutionId() {
+		return executionId;
+	}
+
+	public void setExecutionId(String executionId) {
+		this.executionId = executionId;
+	}
+
+	public String getDataDetailDisplayUrl() {
+		return dataDetailDisplayUrl;
+	}
+
+	public void setDataDetailDisplayUrl(String dataDetailDisplayUrl) {
+		this.dataDetailDisplayUrl = dataDetailDisplayUrl;
+	}
+
+	@Override
+	public String toString() {
+		return "ProcessInstanceVO{" +
+				"executionId='" + executionId + '\'' +
+				", dataDetailDisplayUrl='" + dataDetailDisplayUrl + '\'' +
+				'}';
+	}
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/ProcessNodeVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/ProcessNodeVO.java
new file mode 100644
index 0000000..4420b31
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/ProcessNodeVO.java
@@ -0,0 +1,109 @@
+package com.vci.web.pageModel;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 娴佺▼涓殑浠诲姟鑺傜偣
+ * @author weidy
+ * @date 2021-2-12
+ */
+public class ProcessNodeVO implements java.io.Serializable{
+
+	/**
+	 * 搴忓垪鍖�
+	 */
+	private static final long serialVersionUID = -4005702273457144329L;
+
+	/**
+	 * 鑺傜偣鐨勫悕绉�
+	 */
+	private String name;
+
+	/**
+	 * 鐢ㄦ埛鍚�
+	 */
+	private String users;
+
+	/**
+	 * 瑙掕壊
+	 */
+	private String roles;
+
+	/**
+	 * 閮ㄩ棬
+	 */
+	private String depts;
+
+	/**
+	 * 鑷畾涔�
+	 */
+	private String customClass;
+
+	/**
+	 * 鐢ㄦ埛鐨勪俊鎭�
+	 */
+	private List<ProcessUserVO> processUserVO = new ArrayList<ProcessUserVO>();
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+
+
+	public String getUsers() {
+		return users;
+	}
+
+	public void setUsers(String users) {
+		this.users = users;
+	}
+
+	public String getRoles() {
+		return roles;
+	}
+
+	public void setRoles(String roles) {
+		this.roles = roles;
+	}
+
+	public String getDepts() {
+		return depts;
+	}
+
+	public void setDepts(String depts) {
+		this.depts = depts;
+	}
+
+	public List<ProcessUserVO> getProcessUserVO() {
+		return processUserVO;
+	}
+
+	public void setProcessUserVO(List<ProcessUserVO> processUserVO) {
+		this.processUserVO = processUserVO;
+	}
+
+	public String getCustomClass() {
+		return customClass;
+	}
+
+	public void setCustomClass(String customClass) {
+		this.customClass = customClass;
+	}
+
+	@Override
+	public String toString() {
+		return "ProcessNodeVO{" +
+				"name='" + name + '\'' +
+				", users='" + users + '\'' +
+				", roles='" + roles + '\'' +
+				", depts='" + depts + '\'' +
+				", customClass='" + customClass + '\'' +
+				", processUserVO=" + processUserVO +
+				'}';
+	}
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/ProcessOutcomeVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/ProcessOutcomeVO.java
new file mode 100644
index 0000000..c660744
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/ProcessOutcomeVO.java
@@ -0,0 +1,120 @@
+package com.vci.web.pageModel;
+
+import java.util.*;
+
+/**
+ * 娴佺▼鐨勮矾鐢�
+ * @author weidy
+ * @date 2021-2-12
+ */
+public class ProcessOutcomeVO implements java.io.Serializable {
+
+	/**
+	 * 搴忓垪鍖�
+	 */
+	private static final long serialVersionUID = -7657370793500830007L;
+
+	/**
+	 * 璺敱鐨勫悕绉�
+	 */
+	private String name;
+	
+	/**
+	 * 褰撳墠浠诲姟閲屼笅涓�涓换鍔″凡缁忚缃殑璐熻矗浜�
+	 */
+	private List<ProcessUserVO> processUserVO = new ArrayList<ProcessUserVO>();
+	
+	/**
+	 * 褰撹礋璐d汉娌℃湁璁剧疆鏃讹紝杩欎釜浠h〃娴佺▼妯℃澘涓畾涔夌殑涓嬩竴涓换鍔¤妭鐐圭殑鍊欓�変汉
+	 */
+	private List<ProcessUserVO> nextNodeUser = new ArrayList<ProcessUserVO>();
+
+	/**
+	 * 涓嬩竴涓换鍔$殑鍚嶇О
+	 */
+	private String nextTaskName;
+
+	/**
+	 * 鏄惁鏈夊瓙娴佺▼
+	 */
+	private boolean isHasSubTask = false;
+
+	/**
+	 * 鎵�鏈夌殑涓嬩竴姝ヤ换鍔�
+	 */
+	private String[] nextTaskNames; //鏈夊垎鏀殑鎯呭喌
+
+	/**
+	 * 鑺傜偣鐨勬祦绋嬬敤鎴�
+	 */
+	private Map<String,List<ProcessUserVO> > processUsers = new HashMap<String, List<ProcessUserVO>>();
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public List<ProcessUserVO> getProcessUserVO() {
+		return processUserVO;
+	}
+
+	public void setProcessUserVO(List<ProcessUserVO> processUserVO) {
+		this.processUserVO = processUserVO;
+	}
+
+	public String getNextTaskName() {
+		return nextTaskName;
+	}
+
+	public void setNextTaskName(String nextTaskName) {
+		this.nextTaskName = nextTaskName;
+	}
+
+	public boolean isHasSubTask() {
+		return isHasSubTask;
+	}
+
+	public void setHasSubTask(boolean isHasSubTask) {
+		this.isHasSubTask = isHasSubTask;
+	}
+
+	public String[] getNextTaskNames() {
+		return nextTaskNames;
+	}
+
+	public void setNextTaskNames(String[] nextTaskNames) {
+		this.nextTaskNames = nextTaskNames;
+	}
+
+	public Map<String, List<ProcessUserVO>> getProcessUsers() {
+		return processUsers;
+	}
+
+	public void setProcessUsers(Map<String, List<ProcessUserVO>> processUsers) {
+		this.processUsers = processUsers;
+	}
+
+	public List<ProcessUserVO> getNextNodeUser() {
+		return nextNodeUser;
+	}
+
+	public void setNextNodeUser(List<ProcessUserVO> nextNodeUser) {
+		this.nextNodeUser = nextNodeUser;
+	}
+
+	@Override
+	public String toString() {
+		return "ProcessOutcome{" +
+				"name='" + name + '\'' +
+				", processUserVO=" + processUserVO +
+				", nextNodeUser=" + nextNodeUser +
+				", nextTaskName='" + nextTaskName + '\'' +
+				", isHasSubTask=" + isHasSubTask +
+				", nextTaskNames=" + Arrays.toString(nextTaskNames) +
+				", processUsers=" + processUsers +
+				'}';
+	}
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/ProcessTaskVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/ProcessTaskVO.java
new file mode 100644
index 0000000..83db027
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/ProcessTaskVO.java
@@ -0,0 +1,218 @@
+package com.vci.web.pageModel;
+
+import java.util.Date;
+
+/**
+ * 娴佺▼浠诲姟
+ * @author weidy
+ * @date 2021-2-12
+ */
+public class ProcessTaskVO implements java.io.Serializable{
+
+	/**
+	 * 搴忓垪鍖�
+	 */
+	private static final long serialVersionUID = -7115989834281366394L;
+
+	/**
+	 * 璐熻矗浜�
+	 */
+	private String principal;
+
+	/**
+	 * 瀵嗙骇
+	 */
+	private int secretGrade;
+
+	/**
+	 * 浠诲姟鐨勭被鍨�
+	 */
+	private int workType;
+
+	/**
+	 * 娴佺▼绫诲瀷
+	 */
+	private String processType;
+
+	/**
+	 * 娴佺▼瀹炰緥鍚嶇О
+	 */
+	private String processName;
+
+	/**
+	 * 寮曟搸涓祦绋嬪疄渚嬫墽琛屼富閿�
+	 */
+	private String executionId;
+
+	/**
+	 * 浠诲姟涓婚敭
+	 */
+	private String oid;
+
+	/**
+	 * 浠诲姟鍚嶇О
+	 */
+	private String name;
+
+	/**
+	 * 浠诲姟缁撴潫鏃堕棿
+	 */
+	private Date planedEndDate;
+
+	/**
+	 * 浠诲姟寮�濮嬫椂闂�--涓婁竴姝ュ鎵规椂闂�
+	 */
+	private Date planedStartDate;
+
+	/**
+	 * 涓婁竴姝ュ鎵规剰瑙�
+	 */
+	private String completeDes;
+
+	/**
+	 * 娴佺▼鍒涘缓浜�
+	 */
+	private String processCreator;
+
+	/**
+	 * 娴佺▼妯℃澘鍚嶇О
+	 */
+    private String templateName;
+
+	/**
+	 * jbpm閲岀殑浠诲姟涓婚敭
+	 */
+	private String taskOid;
+
+	public String getPrincipal() {
+		return principal;
+	}
+
+	public void setPrincipal(String principal) {
+		this.principal = principal;
+	}
+
+	public int getSecretGrade() {
+		return secretGrade;
+	}
+
+	public void setSecretGrade(int secretGrade) {
+		this.secretGrade = secretGrade;
+	}
+
+	public int getWorkType() {
+		return workType;
+	}
+
+	public void setWorkType(int workType) {
+		this.workType = workType;
+	}
+
+	public String getProcessType() {
+		return processType;
+	}
+
+	public void setProcessType(String processType) {
+		this.processType = processType;
+	}
+
+	public String getProcessName() {
+		return processName;
+	}
+
+	public void setProcessName(String processName) {
+		this.processName = processName;
+	}
+
+	public String getExecutionId() {
+		return executionId;
+	}
+
+	public void setExecutionId(String executionId) {
+		this.executionId = executionId;
+	}
+
+	public String getOid() {
+		return oid;
+	}
+
+	public void setOid(String oid) {
+		this.oid = oid;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public Date getPlanedEndDate() {
+		return planedEndDate;
+	}
+
+	public void setPlanedEndDate(Date planedEndDate) {
+		this.planedEndDate = planedEndDate;
+	}
+
+	public Date getPlanedStartDate() {
+		return planedStartDate;
+	}
+
+	public void setPlanedStartDate(Date planedStartDate) {
+		this.planedStartDate = planedStartDate;
+	}
+
+	public String getCompleteDes() {
+		return completeDes;
+	}
+
+	public void setCompleteDes(String completeDes) {
+		this.completeDes = completeDes;
+	}
+
+	public String getProcessCreator() {
+		return processCreator;
+	}
+
+	public void setProcessCreator(String processCreator) {
+		this.processCreator = processCreator;
+	}
+
+	public String getTemplateName() {
+		return templateName;
+	}
+
+	public void setTemplateName(String templateName) {
+		this.templateName = templateName;
+	}
+
+	public String getTaskOid() {
+		return taskOid;
+	}
+
+	public void setTaskOid(String taskOid) {
+		this.taskOid = taskOid;
+	}
+
+	@Override
+	public String toString() {
+		return "ProcessTaskVO{" +
+				"principal='" + principal + '\'' +
+				", secretGrade=" + secretGrade +
+				", workType=" + workType +
+				", processType='" + processType + '\'' +
+				", processName='" + processName + '\'' +
+				", executionId='" + executionId + '\'' +
+				", oid='" + oid + '\'' +
+				", name='" + name + '\'' +
+				", planedEndDate=" + planedEndDate +
+				", planedStartDate=" + planedStartDate +
+				", completeDes='" + completeDes + '\'' +
+				", processCreator='" + processCreator + '\'' +
+				", templateName='" + templateName + '\'' +
+				", taskOid='" + taskOid + '\'' +
+				'}';
+	}
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/ProcessTemplateVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/ProcessTemplateVO.java
new file mode 100644
index 0000000..9d83f68
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/ProcessTemplateVO.java
@@ -0,0 +1,133 @@
+package com.vci.web.pageModel;
+
+/**
+ * 娴佺▼妯℃澘瀵硅薄
+ * @author weidy
+ * @date 2021-2-12
+ */
+public class ProcessTemplateVO implements java.io.Serializable{
+	
+	/**
+	 * 搴忓垪鍖�
+	 */
+	private static final long serialVersionUID = 3009194108520576444L;
+
+	/**
+	 * 娴佺▼寮曟搸閲岀殑閮ㄧ讲涓婚敭
+	 */
+	private String deploymentId;
+	
+	/**
+	 * 娴佺▼鐨勪富閿�
+	 */
+	private String oid;
+	
+	/**
+	 * 娴佺▼鐨勫悕绉�
+	 */
+	private String name;
+	
+	/**
+	 * 娴佺▼鐨刱ey
+	 */
+	private String key;
+	
+	/**
+	 * 娴佺▼鐨勭増鏈�
+	 */
+	private int version;
+	
+	/**
+	 * 娴佺▼鍒嗙被鐨勪富閿�
+	 */
+	private String categroyOid ;
+
+	/**
+	 * 浠诲姟鐨勭被鍨�
+	 */
+	private String taskType ;
+	
+	/**
+	 * 娴佺▼瀹氫箟鐨勭姸鎬�
+	 */
+	private String status ;
+
+
+	public String getDeploymentId() {
+		return deploymentId;
+	}
+
+	public void setDeploymentId(String deploymentId) {
+		this.deploymentId = deploymentId;
+	}
+
+	public String getOid() {
+		return oid;
+	}
+
+	public void setOid(String oid) {
+		this.oid = oid;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getKey() {
+		return key;
+	}
+
+	public void setKey(String key) {
+		this.key = key;
+	}
+
+	public int getVersion() {
+		return version;
+	}
+
+	public void setVersion(int version) {
+		this.version = version;
+	}
+
+	public String getCategroyOid() {
+		return categroyOid;
+	}
+
+	public void setCategroyOid(String categroyOid) {
+		this.categroyOid = categroyOid;
+	}
+
+	public String getTaskType() {
+		return taskType;
+	}
+
+	public void setTaskType(String taskType) {
+		this.taskType = taskType;
+	}
+
+	public String getStatus() {
+		return status;
+	}
+
+	public void setStatus(String status) {
+		this.status = status;
+	}
+
+	@Override
+	public String toString() {
+		return "ProcessTemplateVO{" +
+				"deploymentId='" + deploymentId + '\'' +
+				", oid='" + oid + '\'' +
+				", name='" + name + '\'' +
+				", key='" + key + '\'' +
+				", version=" + version +
+				", categroyOid='" + categroyOid + '\'' +
+				", taskType='" + taskType + '\'' +
+				", status='" + status + '\'' +
+				'}';
+	}
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/ProcessUserVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/ProcessUserVO.java
new file mode 100644
index 0000000..7b27a5e
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/ProcessUserVO.java
@@ -0,0 +1,111 @@
+package com.vci.web.pageModel;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 娴佺▼涓彲浠ユ墽琛岀殑鐢ㄦ埛
+ * --濡傛灉鏈夊涓鑹插拰澶氫釜閮ㄩ棬鐨勬椂鍊欙紝绗竴灞傝妭鐐逛細鏄鑹叉垨鑰呴儴闂�
+ * @author weidy
+ *
+ */
+public class ProcessUserVO implements java.io.Serializable{
+	
+	public ProcessUserVO(){
+		
+	}
+	
+	public ProcessUserVO(String oid, String name, String id, String type){
+		this.oid = oid;
+		this.name = name;
+		this.id = id;
+		this.type = type;
+	}
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 9016814293362324477L;
+	
+	private String oid;
+	
+	private String name;
+	
+	private String id;
+	
+    private String type ="user";
+
+    private int secret = -1;
+
+    private String secretText = "";
+
+    private boolean leaf;
+
+
+    
+    private List<ProcessUserVO> children = new ArrayList<ProcessUserVO>();
+
+	public String getOid() {
+		return oid;
+	}
+
+	public void setOid(String oid) {
+		this.oid = oid;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getId() {
+		return id;
+	}
+
+	public void setId(String id) {
+		this.id = id;
+	}
+
+	public String getType() {
+		return type;
+	}
+
+	public void setType(String type) {
+		this.type = type;
+	}
+
+	public List<ProcessUserVO> getChildren() {
+		return children;
+	}
+
+	public void setChildren(List<ProcessUserVO> children) {
+		this.children = children;
+	}
+
+	public int getSecret() {
+		return secret;
+	}
+
+	public void setSecret(int secret) {
+		this.secret = secret;
+	}
+
+	public String getSecretText() {
+		return secretText;
+	}
+
+	public void setSecretText(String secretText) {
+		this.secretText = secretText;
+	}
+
+	public boolean isLeaf() {
+		return leaf;
+	}
+
+	public void setLeaf(boolean leaf) {
+		this.leaf = leaf;
+	}
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/ReferConfigVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/ReferConfigVO.java
new file mode 100644
index 0000000..c7d27ee
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/ReferConfigVO.java
@@ -0,0 +1,265 @@
+package com.vci.web.pageModel;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 鍙傜収鐨勯厤缃璞�
+ * 鏀寔涓夌绫诲瀷锛�
+ * 1. 鍙湁鍙傜収鐨勯偅涓睘鎬т俊鎭�
+ * 2. 鎸囧畾鐨勮〃鏍艰幏鍙栨寚瀹氱殑ui
+ * 3. 鎵嬪姩娣诲姞js锛岃繖绉嶆儏鍐典笅涓嶄娇鐢ㄩ粯璁ょ殑鏁版嵁鏌ヨ璺緞
+ * @author weidy
+ * @date 2021-2-12
+ */
+public class ReferConfigVO implements java.io.Serializable{
+	
+	/**
+	 * 搴忓垪鍖�
+	 */
+	private static final long serialVersionUID = -1794444521066634214L;
+
+	/**
+	 * 鍙傜収鐨勫睘鎬�
+	 */
+	private String referField;
+
+	/**
+	 * 鍙傜収鐨勪笟鍔$被鍨�
+	 */
+	private String referBo;
+
+	/**
+	 * 鏂囨湰鐨勫瓧娈�
+	 */
+	private String textField;
+
+	/**
+	 * 鍊肩殑瀛楁
+	 */
+	private String valueField;
+
+	/**
+	 * 鏄剧ず琛ㄦ牸
+	 */
+	private String displayTable;
+
+	/**
+	 * 涓婄骇涓氬姟鏁版嵁涓婚敭
+	 */
+	private String parentOid;
+
+	/**
+	 * 涓婄骇鐨勫瓧娈电殑琛ㄨ揪寮�
+	 */
+	private String parentFieldName;
+
+	/**
+	 * 涓婄骇瀛楁鐨勫唴瀹瑰搴斿睘鎬�
+	 */
+	private String parentUsedField;
+
+	/**
+	 * 鏄惁鏌ヨ鎵�鏈夌殑灞傜骇
+	 */
+	private boolean selectAllLevel;
+
+	/**
+	 * 鏄惁澶氶��
+	 */
+	private boolean isMuti;
+
+	/**
+	 * 鏌ヨ鏂规
+	 */
+	private String queryScheme;
+
+	/**
+	 * 鍙傜収绐楀彛鏄剧ず鐨勫垪
+	 */
+	private String referColumn;
+
+	/**
+	 * ui涓婁笅鏂�
+	 */
+	private String uiContext;
+
+	/**
+	 * 鏌ヨ鏉′欢
+	 */
+    private Map<String,String> conditionMap = new HashMap<String,String>();
+
+	/**
+	 * 鏇挎崲鐨勬槧灏�
+	 */
+	private Map<String,String> replaceMap = new HashMap<String, String>();
+
+	/**
+	 * 鎺掑簭瀛楁
+	 */
+	private String sort;
+
+	/**
+	 * 鎺掑簭鏂瑰紡
+	 */
+	private String order;
+
+	public String getReferField() {
+		return referField;
+	}
+
+	public void setReferField(String referField) {
+		this.referField = referField;
+	}
+
+	public String getReferBo() {
+		return referBo;
+	}
+
+	public void setReferBo(String referBo) {
+		this.referBo = referBo;
+	}
+
+	public String getTextField() {
+		return textField;
+	}
+
+	public void setTextField(String textField) {
+		this.textField = textField;
+	}
+
+	public String getValueField() {
+		return valueField;
+	}
+
+	public void setValueField(String valueField) {
+		this.valueField = valueField;
+	}
+
+	public String getDisplayTable() {
+		return displayTable;
+	}
+
+	public void setDisplayTable(String displayTable) {
+		this.displayTable = displayTable;
+	}
+
+	public String getParentOid() {
+		return parentOid;
+	}
+
+	public void setParentOid(String parentOid) {
+		this.parentOid = parentOid;
+	}
+
+	public String getParentFieldName() {
+		return parentFieldName;
+	}
+
+	public void setParentFieldName(String parentFieldName) {
+		this.parentFieldName = parentFieldName;
+	}
+
+	public boolean isMuti() {
+		return isMuti;
+	}
+
+	public void setMuti(boolean isMuti) {
+		this.isMuti = isMuti;
+	}
+
+	public String getQueryScheme() {
+		return queryScheme;
+	}
+
+	public void setQueryScheme(String queryScheme) {
+		this.queryScheme = queryScheme;
+	}
+
+	public String getUiContext() {
+		return uiContext;
+	}
+
+	public void setUiContext(String uiContext) {
+		this.uiContext = uiContext;
+	}
+
+	public Map<String, String> getConditionMap() {
+		return conditionMap;
+	}
+
+	public void setConditionMap(Map<String, String> conditionMap) {
+		this.conditionMap = conditionMap;
+	}
+
+	public Map<String, String> getReplaceMap() {
+		return replaceMap;
+	}
+
+	public void setReplaceMap(Map<String, String> replaceMap) {
+		this.replaceMap = replaceMap;
+	}
+
+	public String getReferColumn() {
+		return referColumn;
+	}
+
+	public void setReferColumn(String referColumn) {
+		this.referColumn = referColumn;
+	}
+
+	public String getParentUsedField() {
+		return parentUsedField;
+	}
+
+	public void setParentUsedField(String parentUsedField) {
+		this.parentUsedField = parentUsedField;
+	}
+
+	public boolean isSelectAllLevel() {
+		return selectAllLevel;
+	}
+
+	public void setSelectAllLevel(boolean selectAllLevel) {
+		this.selectAllLevel = selectAllLevel;
+	}
+
+	public String getSort() {
+		return sort;
+	}
+
+	public void setSort(String sort) {
+		this.sort = sort;
+	}
+
+	public String getOrder() {
+		return order;
+	}
+
+	public void setOrder(String order) {
+		this.order = order;
+	}
+
+	@Override
+	public String toString() {
+		return "ReferConfigVO{" +
+				"referField='" + referField + '\'' +
+				", referBo='" + referBo + '\'' +
+				", textField='" + textField + '\'' +
+				", valueField='" + valueField + '\'' +
+				", displayTable='" + displayTable + '\'' +
+				", parentOid='" + parentOid + '\'' +
+				", parentFieldName='" + parentFieldName + '\'' +
+				", parentUsedField='" + parentUsedField + '\'' +
+				", selectAllLevel=" + selectAllLevel +
+				", isMuti=" + isMuti +
+				", queryScheme='" + queryScheme + '\'' +
+				", referColumn='" + referColumn + '\'' +
+				", uiContext='" + uiContext + '\'' +
+				", conditionMap=" + conditionMap +
+				", replaceMap=" + replaceMap +
+				", sort='" + sort + '\'' +
+				", order='" + order + '\'' +
+				'}';
+	}
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/SmOperationVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/SmOperationVO.java
new file mode 100644
index 0000000..e851479
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/SmOperationVO.java
@@ -0,0 +1,160 @@
+package com.vci.web.pageModel;
+
+/**
+ * 鑿滃崟鐨勬寜閽璞�
+ * @author weidy
+ * @date 2022-2-23
+ */
+public class SmOperationVO implements java.io.Serializable{
+
+
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = 8193579608741643735L;
+    /**
+     * 鍔熻兘鐨勪富閿�
+     */
+    private String functionOid;
+
+    /**
+     * 鍔熻兘鐨勭紪鍙�
+     */
+    private String moduleNo;
+
+    /**
+     * 鍔熻兘鍜屾寜閽叧鑱旂殑涓婚敭
+     */
+    private String oid;
+
+    /**
+     * 鍞竴鏍囪瘑绗�
+     */
+    private String uniqueFlag;
+
+    /**
+     * 鎻忚堪
+     */
+    private String description;
+
+    /**
+     * 鍦ㄥ姛鑳戒腑鐨勬帓搴忓彿
+     */
+    private String orderNo;
+
+    /**
+     * 鎸夐挳鍚嶇О锛屾槸鎿嶄綔绫诲瀷鐨勫悕绉�
+     */
+    private String name;
+
+    /**
+     * 鎸夐挳鏄电О锛屾槸鍦ㄥ姛鑳藉拰鎸夐挳鐨勫叧鑱斾腑鐨勬樀绉帮紝鍓嶇浣跨敤杩欎釜鏉ユ樉绀烘寜閽�
+     */
+    private String alias;
+
+    /**
+     * 鎵ц鐨刯s鍐呭
+     */
+    private String executeJs;
+
+    /**
+     * 鍥炬爣鏍峰紡
+     */
+    private String iconCls;
+
+    public String getFunctionOid() {
+        return functionOid;
+    }
+
+    public void setFunctionOid(String functionOid) {
+        this.functionOid = functionOid;
+    }
+
+    public String getOid() {
+        return oid;
+    }
+
+    public void setOid(String oid) {
+        this.oid = oid;
+    }
+
+    public String getUniqueFlag() {
+        return uniqueFlag;
+    }
+
+    public void setUniqueFlag(String uniqueFlag) {
+        this.uniqueFlag = uniqueFlag;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getOrderNo() {
+        return orderNo;
+    }
+
+    public void setOrderNo(String orderNo) {
+        this.orderNo = orderNo;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getAlias() {
+        return alias;
+    }
+
+    public void setAlias(String alias) {
+        this.alias = alias;
+    }
+
+    public String getModuleNo() {
+        return moduleNo;
+    }
+
+    public void setModuleNo(String moduleNo) {
+        this.moduleNo = moduleNo;
+    }
+
+    public String getExecuteJs() {
+        return executeJs;
+    }
+
+    public void setExecuteJs(String executeJs) {
+        this.executeJs = executeJs;
+    }
+
+    public String getIconCls() {
+        return iconCls;
+    }
+
+    public void setIconCls(String iconCls) {
+        this.iconCls = iconCls;
+    }
+
+    @Override
+    public String toString() {
+        return "SmOperationVO{" +
+                "functionOid='" + functionOid + '\'' +
+                ", moduleNo='" + moduleNo + '\'' +
+                ", oid='" + oid + '\'' +
+                ", uniqueFlag='" + uniqueFlag + '\'' +
+                ", description='" + description + '\'' +
+                ", orderNo='" + orderNo + '\'' +
+                ", name='" + name + '\'' +
+                ", alias='" + alias + '\'' +
+                ", executeJs='" + executeJs + '\'' +
+                ", iconCls='" + iconCls + '\'' +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/TreeSettingVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/TreeSettingVO.java
new file mode 100644
index 0000000..c99774b
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/TreeSettingVO.java
@@ -0,0 +1,315 @@
+package com.vci.web.pageModel;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 鑾峰彇鏍戝舰淇℃伅鐨勯厤缃�
+ * @author weidy
+ * @date 2021-2-12
+ */
+public class TreeSettingVO implements java.io.Serializable{
+
+	/**
+	 * 搴忓垪鍖�
+	 */
+	private static final long serialVersionUID = 4059983984158087383L;
+
+	/**
+	 * 鏌ヨ涓氬姟绫诲瀷
+	 */
+	private String btmType;
+	
+	/**
+	 * 鏌ヨ閾炬帴绫诲瀷
+	 */
+	private String lnType;
+	
+	/**
+	 * 鏄惁鍙嶅悜
+	 */
+	private boolean isDirection = false;
+	
+	/**
+	 * 鏄惁鏌ヨ鏈�鍚庣殑鐗堟湰
+	 */
+	private boolean isLastReversion = true;
+	
+	/**
+	 * 鏄惁鏌ヨ鏈�鍚庣殑鐗堟
+	 */
+	private boolean isLastVersion = true;
+
+	/**
+	 * 鏌ヨ閾炬帴绫诲瀷鐨則o绔殑涓氬姟绫诲瀷锛屽涓互閫楀彿鍒嗛殧锛屾剰鎬濇槸鍙煡璇㈣缃殑涓氬姟绫诲瀷鐨勬暟鎹�
+	 */
+	private String toBtmType;
+	
+	/**
+	 * 鍊煎瓧娈�
+	 */
+	private String valueField = "oid";
+	
+	/**
+	 * 鏄剧ず瀛楁
+	 */
+	private String textField = "name";
+	
+	/**
+	 * 涓婄骇鐨勫��
+	 */
+	private String parentValue = "";
+	
+	/**
+	 * where璇彞
+	 */
+	private String whereSql;
+	
+	/**
+	 * 鏌ヨ鏉′欢
+	 */
+	private Map<String,String> conditionMap = new HashMap<String,String>();
+
+	/**
+	 * 鏌ヨ鏂规
+	 */
+	private String queryScheme;
+	
+	/**
+	 * 鏄惁澶氶��
+	 */
+	private boolean isMuti;
+	
+	/**
+	 * 鏄惁鏌ヨ鎵�鏈夌殑瀛楁
+	 */
+	private boolean isQueryAllColumn;
+	
+	/**
+	 * 鏌ヨ瀛楁锛屽彲浠ユ湁鍙傜収鍜屾灇涓惧瓧娈�
+	 */
+	private String queryColumn;
+
+	/**
+	 * 鏄剧ず鍒嗗壊绗�
+	 */
+	private String split = " ";
+	
+	/**
+	 * 鍔犺浇鏁版嵁鏂瑰紡锛宎ll琛ㄧず鍏ㄩ儴鍔犺浇锛宯ode琛ㄧず鎸夐�愮骇灞曞紑
+	 */
+	private String loadType = "all";
+
+	/**
+	 * 鑺傜偣鍔犺浇绫诲瀷--鍏ㄩ儴鑺傜偣
+	 */
+	public static final String loadType_all = "all";
+
+	/**
+	 * 鑺傜偣鍔犺浇绫诲瀷--閫愮骇
+	 */
+	public static final String loadType_node = "node";
+	
+	/**
+	 * 涓婁笅绾ц妭鐐圭殑鍏崇郴灞炴�э紝鍙兘鏄弬鐓х被鍨嬶紝濡傛灉鏄摼鎺ョ被鍨嬩笉鑳借繖鏍疯幏鍙�
+	 */
+	private String parentFieldName;
+
+	/**
+	 * 鎺掑簭瀛楁
+	 */
+	private String sort;
+
+	/**
+	 * 鎺掑簭绫诲瀷
+	 */
+	private String order;
+
+	public String getBtmType() {
+		return btmType;
+	}
+
+	public void setBtmType(String btmType) {
+		this.btmType = btmType;
+	}
+
+	public String getLnType() {
+		return lnType;
+	}
+
+	public void setLnType(String lnType) {
+		this.lnType = lnType;
+	}
+
+	public String getValueField() {
+		return valueField;
+	}
+
+	public void setValueField(String valueField) {
+		this.valueField = valueField;
+	}
+
+	public String getTextField() {
+		return textField;
+	}
+
+	public void setTextField(String textField) {
+		this.textField = textField;
+	}
+
+	public String getWhereSql() {
+		return whereSql;
+	}
+
+	public void setWhereSql(String whereSql) {
+		this.whereSql = whereSql;
+	}
+
+	public String getQueryScheme() {
+		return queryScheme;
+	}
+
+	public void setQueryScheme(String queryScheme) {
+		this.queryScheme = queryScheme;
+	}
+
+	public boolean isMuti() {
+		return isMuti;
+	}
+
+	public void setMuti(boolean isMuti) {
+		this.isMuti = isMuti;
+	}
+
+	public boolean isQueryAllColumn() {
+		return isQueryAllColumn;
+	}
+
+	public void setQueryAllColumn(boolean isQueryAllColumn) {
+		this.isQueryAllColumn = isQueryAllColumn;
+	}
+
+
+	public String getSplit() {
+		return split;
+	}
+
+	public void setSplit(String split) {
+		this.split = split;
+	}
+
+	public String getLoadType() {
+		return loadType;
+	}
+
+	public void setLoadType(String loadType) {
+		this.loadType = loadType;
+	}
+
+
+	public String getParentFieldName() {
+		return parentFieldName;
+	}
+
+	public void setParentFieldName(String parentFieldName) {
+		this.parentFieldName = parentFieldName;
+	}
+
+	public Map<String, String> getConditionMap() {
+		return conditionMap;
+	}
+
+	public void setConditionMap(Map<String, String> conditionMap) {
+		this.conditionMap = conditionMap;
+	}
+
+	public String getQueryColumn() {
+		return queryColumn;
+	}
+
+	public void setQueryColumn(String queryColumn) {
+		this.queryColumn = queryColumn;
+	}
+
+	public String getToBtmType() {
+		return toBtmType;
+	}
+
+	public void setToBtmType(String toBtmType) {
+		this.toBtmType = toBtmType;
+	}
+
+	public boolean isDirection() {
+		return isDirection;
+	}
+
+	public void setDirection(boolean isDirection) {
+		this.isDirection = isDirection;
+	}
+
+	public boolean isLastReversion() {
+		return isLastReversion;
+	}
+
+	public void setLastReversion(boolean isLastReversion) {
+		this.isLastReversion = isLastReversion;
+	}
+
+	public boolean isLastVersion() {
+		return isLastVersion;
+	}
+
+	public void setLastVersion(boolean isLastVersion) {
+		this.isLastVersion = isLastVersion;
+	}
+
+	public String getParentValue() {
+		return parentValue;
+	}
+
+	public void setParentValue(String parentValue) {
+		this.parentValue = parentValue;
+	}
+
+	public String getSort() {
+		return sort;
+	}
+
+	public void setSort(String sort) {
+		this.sort = sort;
+	}
+
+	public String getOrder() {
+		return order;
+	}
+
+	public void setOrder(String order) {
+		this.order = order;
+	}
+
+	@Override
+	public String toString() {
+		return "TreeSetting{" +
+				"btmType='" + btmType + '\'' +
+				", lnType='" + lnType + '\'' +
+				", isDirection=" + isDirection +
+				", isLastReversion=" + isLastReversion +
+				", isLastVersion=" + isLastVersion +
+				", toBtmType='" + toBtmType + '\'' +
+				", valueField='" + valueField + '\'' +
+				", textField='" + textField + '\'' +
+				", parentValue='" + parentValue + '\'' +
+				", whereSql='" + whereSql + '\'' +
+				", conditionMap=" + conditionMap +
+				", queryScheme='" + queryScheme + '\'' +
+				", isMuti=" + isMuti +
+				", isQueryAllColumn=" + isQueryAllColumn +
+				", queryColumn='" + queryColumn + '\'' +
+				", split='" + split + '\'' +
+				", loadType='" + loadType + '\'' +
+				", parentFieldName='" + parentFieldName + '\'' +
+				", sort='" + sort + '\'' +
+				", order='" + order + '\'' +
+				'}';
+	}
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UIActionVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UIActionVO.java
new file mode 100644
index 0000000..cb2ea06
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UIActionVO.java
@@ -0,0 +1,194 @@
+package com.vci.web.pageModel;
+
+import java.util.Date;
+
+/**
+ *
+ * 骞冲彴瀹氫箟鐨刟ction鐨勪俊鎭�
+ * @author weidy
+ * @date 2019/9/9 9:48
+ */
+public class UIActionVO implements java.io.Serializable {
+
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = 8336092855782478971L;
+
+    /**
+     * 涓婚敭
+     */
+    private String oid;
+    /**
+     * 缂栧彿
+     */
+    private String id;
+    /**
+     * 鍚嶇О
+     */
+    private String name;
+    /**
+     * BS鐨勮矾寰�
+     */
+    private String bsUrl;
+    /**
+     * c/s璺緞
+     */
+    private String csClass;
+    /**
+     * 鎻忚堪
+     */
+    private String description;
+    /**
+     * 鎵�灞炵被鍨嬶紝鏄笟鍔$被鍨嬭繕鏄摼鎺ョ被鍨�
+     */
+    private String actionUsedType;
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    private Date createTime;
+    /**
+     * 鍒涘缓浜�
+     */
+    private String creator;
+    /**
+     * 淇敼鏃堕棿
+     */
+    private Date lastModifyTime;
+    /**
+     * 淇敼浜�
+     */
+    private String lastModifier;
+    /**
+     * 鏈煡
+     */
+    private String licensors;
+    /**
+     * action鍒嗙被
+     */
+    private String actionCls;
+
+
+    public String getOid() {
+        return oid;
+    }
+
+    public void setOid(String oid) {
+        this.oid = oid;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getBsUrl() {
+        return bsUrl;
+    }
+
+    public void setBsUrl(String bsUrl) {
+        this.bsUrl = bsUrl;
+    }
+
+    public String getCsClass() {
+        return csClass;
+    }
+
+    public void setCsClass(String csClass) {
+        this.csClass = csClass;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getActionUsedType() {
+        return actionUsedType;
+    }
+
+    public void setActionUsedType(String actionUsedType) {
+        this.actionUsedType = actionUsedType;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getCreator() {
+        return creator;
+    }
+
+    public void setCreator(String creator) {
+        this.creator = creator;
+    }
+
+    public Date getLastModifyTime() {
+        return lastModifyTime;
+    }
+
+    public void setLastModifyTime(Date lastModifyTime) {
+        this.lastModifyTime = lastModifyTime;
+    }
+
+    public String getLastModifier() {
+        return lastModifier;
+    }
+
+    public void setLastModifier(String lastModifier) {
+        this.lastModifier = lastModifier;
+    }
+
+    public String getLicensors() {
+        return licensors;
+    }
+
+    public void setLicensors(String licensors) {
+        this.licensors = licensors;
+    }
+
+    public String getActionCls() {
+        return actionCls;
+    }
+
+    public void setActionCls(String actionCls) {
+        this.actionCls = actionCls;
+    }
+
+    @Override
+    public String toString() {
+        return "WebActionVO{" +
+                "oid='" + oid + '\'' +
+                ", id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", bsUrl='" + bsUrl + '\'' +
+                ", csClass='" + csClass + '\'' +
+                ", description='" + description + '\'' +
+                ", actionUsedType='" + actionUsedType + '\'' +
+                ", createTime=" + createTime +
+                ", creator='" + creator + '\'' +
+                ", lastModifyTime=" + lastModifyTime +
+                ", lastModifier='" + lastModifier + '\'' +
+                ", licensors='" + licensors + '\'' +
+                ", actionCls='" + actionCls + '\'' +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UIButtonDefineVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UIButtonDefineVO.java
new file mode 100644
index 0000000..dbe1917
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UIButtonDefineVO.java
@@ -0,0 +1,314 @@
+package com.vci.web.pageModel;
+
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 鎸夐挳鐨勫畾涔�
+ * @author weidy
+ * @date 2021/2/15
+ */
+public class UIButtonDefineVO implements java.io.Serializable{
+
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = -4667878021918596002L;
+    /**
+     * 涓婚敭
+     */
+    private String oid;
+
+    /**
+     * 鎵�灞炵粍浠�
+     */
+    private String pkComponent;
+
+    /**
+     * 鎸夐挳鐨勭紪鍙�
+     */
+    private String id;
+
+    /**
+     * 鎸夐挳鐨勫悕绉�
+     */
+    private String name;
+
+    /**
+     * 鎻忚堪
+     */
+    private String description;
+
+    /**
+     * 鎺掑簭鍙�
+     */
+    private Integer orderNum;
+
+    /**
+     * 鎵�鍦ㄥ尯鍩�
+     */
+    private String areaType;
+
+    /**
+     * 涓婄骇鐨勪富閿�
+     */
+    private String pkParentOid;
+
+    /**
+     * 鏄剧ず鏂瑰紡锛屽寘鍚枃瀛楋紝鍥炬爣锛屾枃瀛�+鍥炬爣銆傞粯璁や负鏂囧瓧+鍥炬爣
+     */
+    private String displayMode;
+
+    /**
+     * 鍥炬爣鐨勮矾寰勩�備富瑕佷竴瀹氳鍐檆ss鐨勭被鍚嶇О
+     */
+    private String iconPath;
+
+    /**
+     * 鏄惁鎺堟潈
+     */
+    private boolean authorization;
+
+    /**
+     * 鏄惁闅愯棌
+     */
+    private boolean hidden;
+
+    /**
+     * 鎵�灞炵殑action鐨勫璞★紝鍙傛暟涔熷湪鍏朵腑
+     */
+    private UIActionVO actionVO;
+
+    /**
+     * 鎸夐挳鎵ц鐨剈rl
+     */
+    private String url;
+
+    /**
+     * cs閲岃皟鐢ㄧ殑url
+     */
+    private String csUrl;
+
+    /**
+     * 鍖呭惈鐨勫弬鏁�
+     */
+    private Map<String,String> paramVOS;
+    /**
+     * 瀛愭寜閽�
+     */
+    private List<UIButtonDefineVO> children;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    private Date createTime;
+    /**
+     * 鍒涘缓浜�
+     */
+    private String creator;
+    /**
+     * 淇敼鏃堕棿
+     */
+    private Date lastModifyTime;
+    /**
+     * 淇敼浜�
+     */
+    private String lastModifier;
+
+    public String getOid() {
+        return oid;
+    }
+
+    public void setOid(String oid) {
+        this.oid = oid;
+    }
+
+    public String getPkComponent() {
+        return pkComponent;
+    }
+
+    public void setPkComponent(String pkComponent) {
+        this.pkComponent = pkComponent;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public Integer getOrderNum() {
+        return orderNum;
+    }
+
+    public void setOrderNum(Integer orderNum) {
+        this.orderNum = orderNum;
+    }
+
+    public String getAreaType() {
+        return areaType;
+    }
+
+    public void setAreaType(String areaType) {
+        this.areaType = areaType;
+    }
+
+    public String getPkParentOid() {
+        return pkParentOid;
+    }
+
+    public void setPkParentOid(String pkParentOid) {
+        this.pkParentOid = pkParentOid;
+    }
+
+    public String getDisplayMode() {
+        return displayMode;
+    }
+
+    public void setDisplayMode(String displayMode) {
+        this.displayMode = displayMode;
+    }
+
+    public String getIconPath() {
+        return iconPath;
+    }
+
+    public void setIconPath(String iconPath) {
+        this.iconPath = iconPath;
+    }
+
+    public boolean isAuthorization() {
+        return authorization;
+    }
+
+    public void setAuthorization(boolean authorization) {
+        this.authorization = authorization;
+    }
+
+    public boolean isHidden() {
+        return hidden;
+    }
+
+    public void setHidden(boolean hidden) {
+        this.hidden = hidden;
+    }
+
+    public UIActionVO getActionVO() {
+        return actionVO;
+    }
+
+    public void setActionVO(UIActionVO actionVO) {
+        this.actionVO = actionVO;
+    }
+
+    public List<UIButtonDefineVO> getChildren() {
+        return children;
+    }
+
+    public void setChildren(List<UIButtonDefineVO> children) {
+        this.children = children;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getCreator() {
+        return creator;
+    }
+
+    public void setCreator(String creator) {
+        this.creator = creator;
+    }
+
+    public Date getLastModifyTime() {
+        return lastModifyTime;
+    }
+
+    public void setLastModifyTime(Date lastModifyTime) {
+        this.lastModifyTime = lastModifyTime;
+    }
+
+    public String getLastModifier() {
+        return lastModifier;
+    }
+
+    public void setLastModifier(String lastModifier) {
+        this.lastModifier = lastModifier;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public String getCsUrl() {
+        return csUrl;
+    }
+
+    public void setCsUrl(String csUrl) {
+        this.csUrl = csUrl;
+    }
+
+    public Map<String, String> getParamVOS() {
+        return paramVOS;
+    }
+
+    public void setParamVOS(Map<String, String> paramVOS) {
+        this.paramVOS = paramVOS;
+    }
+
+    @Override
+    public String toString() {
+        return "UIButtonDefineVO{" +
+                "oid='" + oid + '\'' +
+                ", pkComponent='" + pkComponent + '\'' +
+                ", id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", description='" + description + '\'' +
+                ", orderNum=" + orderNum +
+                ", areaType='" + areaType + '\'' +
+                ", pkParentOid='" + pkParentOid + '\'' +
+                ", displayMode='" + displayMode + '\'' +
+                ", iconPath='" + iconPath + '\'' +
+                ", authorization=" + authorization +
+                ", hidden=" + hidden +
+                ", actionVO=" + actionVO +
+                ", url='" + url + '\'' +
+                ", csUrl='" + csUrl + '\'' +
+                ", paramVOS=" + paramVOS +
+                ", children=" + children +
+                ", createTime=" + createTime +
+                ", creator='" + creator + '\'' +
+                ", lastModifyTime=" + lastModifyTime +
+                ", lastModifier='" + lastModifier + '\'' +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UIComponentVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UIComponentVO.java
new file mode 100644
index 0000000..8491d06
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UIComponentVO.java
@@ -0,0 +1,224 @@
+package com.vci.web.pageModel;
+
+import com.vci.starter.web.pagemodel.BaseModelVO;
+
+import java.util.List;
+
+/**
+ * UI鐨勭粍浠�
+ * @author weidy
+ * @date 2021/2/15
+ */
+public class UIComponentVO extends BaseModelVO {
+
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = 6719096512744799787L;
+
+    /**
+     * 椤甸潰缂栧彿
+     */
+    private String id;
+
+    /**
+     * 椤甸潰鍚嶇О
+     */
+    private String name;
+
+    /**
+     * 鎵�灞炲尯鍩�
+     */
+    private String pkLayout;
+
+    /**
+     * 鎺掑簭鍙�
+     */
+    private Integer orderNum;
+
+    /**
+     * UI瑙f瀽绫�
+     */
+    private String uiParseClass;
+
+    /**
+     * 鎵╁睍灞炴��
+     */
+    private String extendAttr;
+
+    /**
+     * UI闈㈡澘鐨勭被鍨�
+     */
+    private String uiComponentType;
+
+    /**
+     * UI闈㈡澘鐨勬樉绀虹被鍨�
+     */
+    private String uiComponentTypeText;
+
+    /**
+     * 琛ㄥ崟鐨勯厤缃�
+     */
+    private UIFormDefineVO formDefineVO;
+
+    /**
+     * 琛ㄦ牸鐨勯厤缃�
+     */
+    private UITableDefineVO tableDefineVO;
+
+    /**
+     * 鏍戠殑閰嶇疆
+     */
+    private UITreeDefineVO treeDefineVO;
+
+    /**
+     * 鏍戣〃鐨勯厤缃�
+     */
+    private UITreeTableDefineVO treeTableDefineVO;
+
+    /**
+     * 鑷畾涔夌粍浠剁殑閰嶇疆
+     */
+    private String customClass;
+
+    /**
+     * 鎸夐挳鐨勯厤缃�
+     */
+    private List<UIButtonDefineVO> buttons;
+
+    @Override
+    public String getId() {
+        return id;
+    }
+
+    @Override
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getUiParseClass() {
+        return uiParseClass;
+    }
+
+    public void setUiParseClass(String uiParseClass) {
+        this.uiParseClass = uiParseClass;
+    }
+
+    public String getExtendAttr() {
+        return extendAttr;
+    }
+
+    public void setExtendAttr(String extendAttr) {
+        this.extendAttr = extendAttr;
+    }
+
+    public String getUiComponentType() {
+        return uiComponentType;
+    }
+
+    public void setUiComponentType(String uiComponentType) {
+        this.uiComponentType = uiComponentType;
+    }
+
+    public String getUiComponentTypeText() {
+        return uiComponentTypeText;
+    }
+
+    public void setUiComponentTypeText(String uiComponentTypeText) {
+        this.uiComponentTypeText = uiComponentTypeText;
+    }
+
+    public UIFormDefineVO getFormDefineVO() {
+        return formDefineVO;
+    }
+
+    public void setFormDefineVO(UIFormDefineVO formDefineVO) {
+        this.formDefineVO = formDefineVO;
+    }
+
+    public UITableDefineVO getTableDefineVO() {
+        return tableDefineVO;
+    }
+
+    public void setTableDefineVO(UITableDefineVO tableDefineVO) {
+        this.tableDefineVO = tableDefineVO;
+    }
+
+    public UITreeDefineVO getTreeDefineVO() {
+        return treeDefineVO;
+    }
+
+    public void setTreeDefineVO(UITreeDefineVO treeDefineVO) {
+        this.treeDefineVO = treeDefineVO;
+    }
+
+    public UITreeTableDefineVO getTreeTableDefineVO() {
+        return treeTableDefineVO;
+    }
+
+    public void setTreeTableDefineVO(UITreeTableDefineVO treeTableDefineVO) {
+        this.treeTableDefineVO = treeTableDefineVO;
+    }
+
+    public String getCustomClass() {
+        return customClass;
+    }
+
+    public void setCustomClass(String customClass) {
+        this.customClass = customClass;
+    }
+
+    public List<UIButtonDefineVO> getButtons() {
+        return buttons;
+    }
+
+    public void setButtons(List<UIButtonDefineVO> buttons) {
+        this.buttons = buttons;
+    }
+
+    public String getPkLayout() {
+        return pkLayout;
+    }
+
+    public void setPkLayout(String pkLayout) {
+        this.pkLayout = pkLayout;
+    }
+
+    public Integer getOrderNum() {
+        return orderNum;
+    }
+
+    public void setOrderNum(Integer orderNum) {
+        this.orderNum = orderNum;
+    }
+
+    @Override
+    public String toString() {
+        return "UIComponentVO{" +
+                "id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", pkLayout='" + pkLayout + '\'' +
+                ", orderNum=" + orderNum +
+                ", uiParseClass='" + uiParseClass + '\'' +
+                ", extendAttr='" + extendAttr + '\'' +
+                ", uiComponentType='" + uiComponentType + '\'' +
+                ", uiComponentTypeText='" + uiComponentTypeText + '\'' +
+                ", formDefineVO=" + formDefineVO +
+                ", tableDefineVO=" + tableDefineVO +
+                ", treeDefineVO=" + treeDefineVO +
+                ", treeTableDefineVO=" + treeTableDefineVO +
+                ", customClass='" + customClass + '\'' +
+                ", buttons=" + buttons +
+                "} " + super.toString();
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UIContentVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UIContentVO.java
new file mode 100644
index 0000000..da70827
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UIContentVO.java
@@ -0,0 +1,167 @@
+package com.vci.web.pageModel;
+
+import com.vci.starter.web.pagemodel.BaseModelVO;
+
+import java.util.List;
+
+/**
+ * ui涓婁笅鏂囩殑鏄剧ず瀵硅薄
+ * @author weidy
+ * @date 2021-2-15
+ */
+public class UIContentVO extends BaseModelVO {
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = 955817523919691774L;
+
+    /**
+     * 涓婁笅鏂囩紪鍙�
+     */
+    private String id;
+
+    /**
+     * 涓婁笅鏂囧悕绉�
+     */
+    private String name;
+
+    /**
+     * 涓氬姟绫诲瀷鑻辨枃鍚嶇О
+     */
+    private String btmTypeId;
+
+    /**
+     * 鏄惁涓洪摼鎺ョ被鍨�
+     */
+    private boolean linkTypeFlag;
+
+    /**
+     * 閾炬帴绫诲瀷鐨勮嫳鏂囧悕绉�
+     */
+    private String linkTypeId;
+
+    /**
+     * 瑗垮尯鐨勫竷灞�鍐呭
+     */
+    private List<UILayoutVO> westAreas;
+
+    /**
+     * 鍖楀尯鐨勫竷灞�鍐呭
+     */
+    private List<UILayoutVO> northAreas;
+
+    /**
+     * 涓績鍖虹殑甯冨眬鍐呭
+     */
+    private List<UILayoutVO> centerAreas;
+
+    /**
+     * 鍗楀尯鐨勫竷灞�鍐呭
+     */
+    private List<UILayoutVO> southAreas;
+
+    /**
+     * 鍖呭惈鐨勫竷灞�鐨勪俊鎭�
+     */
+    private List<UILayoutVO> eastAreas;
+
+    @Override
+    public String getId() {
+        return id;
+    }
+
+    @Override
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getBtmTypeId() {
+        return btmTypeId;
+    }
+
+    public void setBtmTypeId(String btmTypeId) {
+        this.btmTypeId = btmTypeId;
+    }
+
+    public boolean isLinkTypeFlag() {
+        return linkTypeFlag;
+    }
+
+    public void setLinkTypeFlag(boolean linkTypeFlag) {
+        this.linkTypeFlag = linkTypeFlag;
+    }
+
+    public String getLinkTypeId() {
+        return linkTypeId;
+    }
+
+    public void setLinkTypeId(String linkTypeId) {
+        this.linkTypeId = linkTypeId;
+    }
+
+    public List<UILayoutVO> getWestAreas() {
+        return westAreas;
+    }
+
+    public void setWestAreas(List<UILayoutVO> westAreas) {
+        this.westAreas = westAreas;
+    }
+
+    public List<UILayoutVO> getNorthAreas() {
+        return northAreas;
+    }
+
+    public void setNorthAreas(List<UILayoutVO> northAreas) {
+        this.northAreas = northAreas;
+    }
+
+    public List<UILayoutVO> getCenterAreas() {
+        return centerAreas;
+    }
+
+    public void setCenterAreas(List<UILayoutVO> centerAreas) {
+        this.centerAreas = centerAreas;
+    }
+
+    public List<UILayoutVO> getSouthAreas() {
+        return southAreas;
+    }
+
+    public void setSouthAreas(List<UILayoutVO> southAreas) {
+        this.southAreas = southAreas;
+    }
+
+    public List<UILayoutVO> getEastAreas() {
+        return eastAreas;
+    }
+
+    public void setEastAreas(List<UILayoutVO> eastAreas) {
+        this.eastAreas = eastAreas;
+    }
+
+    @Override
+    public String toString() {
+        return "UIContentVO{" +
+                "id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", btmTypeId='" + btmTypeId + '\'' +
+                ", linkTypeFlag=" + linkTypeFlag +
+                ", linkTypeId='" + linkTypeId + '\'' +
+                ", westAreas=" + westAreas +
+                ", northAreas=" + northAreas +
+                ", centerAreas=" + centerAreas +
+                ", southAreas=" + southAreas +
+                ", eastAreas=" + eastAreas +
+                "} " + super.toString();
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UIFieldSortVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UIFieldSortVO.java
new file mode 100644
index 0000000..0628976
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UIFieldSortVO.java
@@ -0,0 +1,48 @@
+package com.vci.web.pageModel;
+
+/**
+ * 瀛楁鐨勬帓搴�
+ * @author weidy
+ * @date 2022-04-21
+ */
+public class UIFieldSortVO implements java.io.Serializable{
+
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = 3364856602124197925L;
+
+    /**
+     * 鎺掑簭鐨勫瓧娈�
+     */
+    private String field;
+
+    /**
+     * 鎺掑簭鐨勭被鍨�
+     */
+    private String type;
+
+    public String getField() {
+        return field;
+    }
+
+    public void setField(String field) {
+        this.field = field;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    @Override
+    public String toString() {
+        return "UIFieldSortVO{" +
+                "field='" + field + '\'' +
+                ", type='" + type + '\'' +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UIFormDataVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UIFormDataVO.java
new file mode 100644
index 0000000..c2414a2
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UIFormDataVO.java
@@ -0,0 +1,61 @@
+package com.vci.web.pageModel;
+
+import com.vci.file.pagemodel.VciFileObjectVO;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 琛ㄥ崟鐨勬暟鎹�
+ * @author weidy
+ * @date 2021/3/17
+ */
+public class UIFormDataVO implements java.io.Serializable{
+    /**
+     * 涓氬姟鏁版嵁
+     */
+    private Map<String, Object> data;
+
+    /**
+     * 闄勪欢鐨勪俊鎭�
+     */
+    private List<VciFileObjectVO> attachmentFileVOs;
+
+    /**
+     * 鏂囦欢璺緞鐨勫瓧娈�
+     */
+    private Map<String,VciFileObjectVO> filePathFieldMap;
+
+    public Map<String, Object> getData() {
+        return data;
+    }
+
+    public void setData(Map<String, Object> data) {
+        this.data = data;
+    }
+
+    public List<VciFileObjectVO> getAttachmentFileVOs() {
+        return attachmentFileVOs;
+    }
+
+    public void setAttachmentFileVOs(List<VciFileObjectVO> attachmentFileVOs) {
+        this.attachmentFileVOs = attachmentFileVOs;
+    }
+
+    public Map<String, VciFileObjectVO> getFilePathFieldMap() {
+        return filePathFieldMap;
+    }
+
+    public void setFilePathFieldMap(Map<String, VciFileObjectVO> filePathFieldMap) {
+        this.filePathFieldMap = filePathFieldMap;
+    }
+
+    @Override
+    public String toString() {
+        return "UIFormDataVO{" +
+                "data=" + data +
+                ", attachmentFileVOs=" + attachmentFileVOs +
+                ", filePathFieldMap=" + filePathFieldMap +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UIFormDefineVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UIFormDefineVO.java
new file mode 100644
index 0000000..8d56687
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UIFormDefineVO.java
@@ -0,0 +1,134 @@
+package com.vci.web.pageModel;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 琛ㄥ崟鐨勫畾涔変俊鎭�
+ * @author weidy
+ * @date 2021/2/15
+ */
+public class UIFormDefineVO implements java.io.Serializable {
+
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = 4870957433172577436L;
+    /**
+     * 琛ㄥ崟鐨勪富閿�
+     */
+    private String oid;
+
+    /**
+     * 琛ㄥ崟鐨勭紪鍙�
+     */
+    private String id;
+
+    /**
+     * 涓氬姟绫诲瀷
+     */
+    private String btmType;
+
+    /**
+     * 鏄惁涓洪摼鎺ョ被鍨�
+     */
+    private boolean linkTypeFlag;
+
+    /**
+     * 姣忚鏄剧ず澶氬皯鍒�
+     */
+    private int columnOneRow;
+
+    /**
+     * 鏌ヨ妯℃澘鍚嶇О
+     */
+    private String queryTemplateName;
+
+    /**
+     * 鍖呭惈鐨勬槑缁�
+     */
+    private List<UIFormItemVO> items = new ArrayList();
+
+    /**
+     * freeMarker鐨勮〃杈惧紡鐨勫��
+     */
+    private List<String> freeMarkerEls = new ArrayList<>();
+
+    public String getOid() {
+        return oid;
+    }
+
+    public void setOid(String oid) {
+        this.oid = oid;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getBtmType() {
+        return btmType;
+    }
+
+    public void setBtmType(String btmType) {
+        this.btmType = btmType;
+    }
+
+    public int getColumnOneRow() {
+        return columnOneRow;
+    }
+
+    public void setColumnOneRow(int columnOneRow) {
+        this.columnOneRow = columnOneRow;
+    }
+
+    public String getQueryTemplateName() {
+        return queryTemplateName;
+    }
+
+    public void setQueryTemplateName(String queryTemplateName) {
+        this.queryTemplateName = queryTemplateName;
+    }
+
+    public List<UIFormItemVO> getItems() {
+        return items;
+    }
+
+    public void setItems(List<UIFormItemVO> items) {
+        this.items = items;
+    }
+
+    public boolean isLinkTypeFlag() {
+        return linkTypeFlag;
+    }
+
+    public void setLinkTypeFlag(boolean linkTypeFlag) {
+        this.linkTypeFlag = linkTypeFlag;
+    }
+
+    public List<String> getFreeMarkerEls() {
+        return freeMarkerEls;
+    }
+
+    public void setFreeMarkerEls(List<String> freeMarkerEls) {
+        this.freeMarkerEls = freeMarkerEls;
+    }
+
+    @Override
+    public String toString() {
+        return "UIFormDefineVO{" +
+                "oid='" + oid + '\'' +
+                ", id='" + id + '\'' +
+                ", btmType='" + btmType + '\'' +
+                ", linkTypeFlag=" + linkTypeFlag +
+                ", columnOneRow=" + columnOneRow +
+                ", queryTemplateName='" + queryTemplateName + '\'' +
+                ", items=" + items +
+                ", freeMarkerEls=" + freeMarkerEls +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UIFormItemVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UIFormItemVO.java
new file mode 100644
index 0000000..59771c3
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UIFormItemVO.java
@@ -0,0 +1,347 @@
+package com.vci.web.pageModel;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 琛ㄥ崟鐨勫瓧娈�
+ * @author weidy
+ * @date 2021/2/24
+ */
+public class UIFormItemVO implements java.io.Serializable {
+
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = 3589862839886943864L;
+
+    /**
+     * 瀛楁鍚�
+     */
+    private String field;
+
+    /**
+     * 鏄剧ず绫诲瀷
+     */
+    private String text;
+
+    /**
+     * 鍙
+     */
+    private boolean readOnly;
+
+    /**
+     * 蹇呭~
+     */
+    private boolean required;
+
+    /**
+     * 鍞竴
+     */
+    private boolean unique;
+
+    /**
+     * 鍏抽敭灞炴��
+     */
+    private boolean keyAttr;
+
+    /**
+     * 榛樿鍊�
+     */
+    private String defaultValue;
+
+    /**
+     * 绫诲瀷
+     */
+    private String type = "text";
+
+    /**
+     * 鏄剧ず琛ㄨ揪寮�
+     */
+    private String displayExtension;
+
+    /**
+     * 鏃堕棿鏍煎紡
+     */
+    private String dateFormate;
+
+    /**
+     * 鏄惁闅愯棌
+     */
+    private boolean hidden = false;
+
+    /**
+     * 鏍¢獙瑙勫垯
+     */
+    private String verify;
+
+    /**
+     * 鎻愮ず淇℃伅
+     */
+    private String tooltips;
+
+    /**
+     * 鑷畾涔夌被鍚嶇О
+     */
+    private String customClass;
+
+    /**
+     * 涓嬫媺鑿滃崟鐨勫悕绉�
+     */
+    private String comboxKey;
+
+    /**
+     * 涓嬫媺鑿滃崟鐨勯�夐」鍊�
+     */
+    private List<KeyValue> data = null;
+
+    /**
+     * 閫夋嫨搴撶殑鏍囪
+     */
+    private String selectLibFlag;
+
+    /**
+     * 鍙傜収鏄剧ず鐨勫瓧娈�
+     */
+    private String showField;
+
+    /**
+     * 鍙傜収鐨勪俊鎭�
+     */
+    private UIFormReferVO referConfig;
+
+    /**
+     * 闄勫姞灞炴��
+     */
+    private Map<String,String> extendAttrMap;
+
+    /**
+     * 鍘熸湰鐨勫睘鎬�
+     */
+    private String extendAttrString;
+
+    /**
+     * 鍓嶇紑
+     */
+    private String prefix;
+
+    /**
+     * 鍚庣紑
+     */
+    private String suffix;
+
+    public boolean isKeyAttr() {
+        return keyAttr;
+    }
+
+    public void setKeyAttr(boolean keyAttr) {
+        this.keyAttr = keyAttr;
+    }
+
+    public String getField() {
+        return field;
+    }
+
+    public void setField(String field) {
+        this.field = field;
+    }
+
+    public String getText() {
+        return text;
+    }
+
+    public void setText(String text) {
+        this.text = text;
+    }
+
+    public boolean isReadOnly() {
+        return readOnly;
+    }
+
+    public void setReadOnly(boolean readOnly) {
+        this.readOnly = readOnly;
+    }
+
+    public boolean isRequired() {
+        return required;
+    }
+
+    public void setRequired(boolean required) {
+        this.required = required;
+    }
+
+    public String getDefaultValue() {
+        return defaultValue;
+    }
+
+    public void setDefaultValue(String defaultValue) {
+        this.defaultValue = defaultValue;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getDisplayExtension() {
+        return displayExtension;
+    }
+
+    public void setDisplayExtension(String displayExtension) {
+        this.displayExtension = displayExtension;
+    }
+
+    public String getDateFormate() {
+        return dateFormate;
+    }
+
+    public void setDateFormate(String dateFormate) {
+        this.dateFormate = dateFormate;
+    }
+
+    public boolean isHidden() {
+        return hidden;
+    }
+
+    public void setHidden(boolean hidden) {
+        this.hidden = hidden;
+    }
+
+    public String getVerify() {
+        return verify;
+    }
+
+    public void setVerify(String verify) {
+        this.verify = verify;
+    }
+
+    public String getTooltips() {
+        return tooltips;
+    }
+
+    public void setTooltips(String tooltips) {
+        this.tooltips = tooltips;
+    }
+
+    public String getCustomClass() {
+        return customClass;
+    }
+
+    public void setCustomClass(String customClass) {
+        this.customClass = customClass;
+    }
+
+    public String getComboxKey() {
+        return comboxKey;
+    }
+
+    public void setComboxKey(String comboxKey) {
+        this.comboxKey = comboxKey;
+    }
+
+    public List<KeyValue> getData() {
+        return data;
+    }
+
+    public void setData(List<KeyValue> data) {
+        this.data = data;
+    }
+
+    public String getShowField() {
+        return showField;
+    }
+
+    public void setShowField(String showField) {
+        this.showField = showField;
+    }
+
+    public UIFormReferVO getReferConfig() {
+        return referConfig;
+    }
+
+    public void setReferConfig(UIFormReferVO referConfig) {
+        this.referConfig = referConfig;
+    }
+
+    public Map<String, String> getExtendAttrMap() {
+        return extendAttrMap;
+    }
+
+    public void setExtendAttrMap(Map<String, String> extendAttrMap) {
+        this.extendAttrMap = extendAttrMap;
+    }
+
+    public String getExtendAttrString() {
+        return extendAttrString;
+    }
+
+    public void setExtendAttrString(String extendAttrString) {
+        this.extendAttrString = extendAttrString;
+    }
+
+    public boolean isUnique() {
+        return unique;
+    }
+
+    public void setUnique(boolean unique) {
+        this.unique = unique;
+    }
+
+
+    public String getPrefix() {
+        return prefix;
+    }
+
+    public void setPrefix(String prefix) {
+        this.prefix = prefix;
+    }
+
+    public String getSuffix() {
+        return suffix;
+    }
+
+    public void setSuffix(String suffix) {
+        this.suffix = suffix;
+    }
+
+    public String getSelectLibFlag() {
+        return selectLibFlag;
+    }
+
+    public void setSelectLibFlag(String selectLibFlag) {
+        this.selectLibFlag = selectLibFlag;
+    }
+
+    @Override
+    public String toString() {
+        return "UIFormItemVO{" +
+                "field='" + field + '\'' +
+                ", text='" + text + '\'' +
+                ", readOnly=" + readOnly +
+                ", required=" + required +
+                ", unique=" + unique +
+                ", keyAttr=" + keyAttr +
+                ", defaultValue='" + defaultValue + '\'' +
+                ", type='" + type + '\'' +
+                ", displayExtension='" + displayExtension + '\'' +
+                ", dateFormate='" + dateFormate + '\'' +
+                ", hidden=" + hidden +
+                ", verify='" + verify + '\'' +
+                ", tooltips='" + tooltips + '\'' +
+                ", customClass='" + customClass + '\'' +
+                ", comboxKey='" + comboxKey + '\'' +
+                ", data=" + data +
+                ", selectLibFlag='" + selectLibFlag + '\'' +
+                ", showField='" + showField + '\'' +
+                ", referConfig=" + referConfig +
+                ", extendAttrMap=" + extendAttrMap +
+                ", extendAttrString='" + extendAttrString + '\'' +
+                ", prefix='" + prefix + '\'' +
+                ", suffix='" + suffix + '\'' +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UIFormReferVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UIFormReferVO.java
new file mode 100644
index 0000000..08c0967
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UIFormReferVO.java
@@ -0,0 +1,347 @@
+package com.vci.web.pageModel;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 鍙傜収鐨勯厤缃�
+ * @author weidy
+ * @date 2021/2/24
+ */
+public class UIFormReferVO implements java.io.Serializable{
+
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = 1459005348514757537L;
+    /**
+     * 鍙傜収鐨勭獥鍙g被鍨�
+     */
+    private String type;
+
+    /**
+     * 鏄剧ず鐨勫瓧娈靛睘鎬�
+     */
+    private String textField = "name";
+
+    /**
+     * 鍊肩殑灞炴��
+     */
+    private String valueField = "oid";
+
+    /**
+     * 鏄惁澶氶��
+     */
+    private boolean muti = false;
+
+    /**
+     * 鍚庡彴鍦板潃
+     */
+    private String url;
+
+    /**
+     * 鏈嶅姟鐨勫湴鍧�
+     */
+    private String backPath;
+
+    /**
+     * 璇锋眰鍚庡彴鐨勫舰寮�
+     */
+    private String method = "GET";
+
+    /**
+     * 楂樺害
+     */
+    private Integer height;
+
+    //閫氱敤鐨勫弬鐓�
+    /**
+     * 鍙傜収鐨勪笟鍔$被鍨�
+     */
+    private String referType;
+
+    /**
+     * 鍙傜収鐨刄I涓婁笅鏂�
+     */
+    private String referContent;
+
+    //鏍戝舰鐨勫弬鐓�
+    /**
+     * 涓婄骇瀛楁
+     */
+    private String parentFieldName;
+
+    /**
+     * 涓婄骇瀛楁鐨勫唴瀹瑰搴旂殑灞炴�х殑鍊�
+     */
+    private String parentUsedField;
+
+    /**
+     * 涓婄骇瀛楁鐨勫��
+     */
+    private String parentValue;
+
+    /**
+     * 鍔犺浇鏂瑰紡
+     */
+    private String loadType = "all";
+
+    /**
+     * 鏄惁鍙兘閫夋嫨鍙跺瓙鑺傜偣
+     */
+    private boolean onlyLeaf = false;
+
+    /**
+     * 杩囨护(绾ц仈)灞炴��
+     */
+    private String useFormKey;
+
+    /**
+     * 杩囨护灞炴�ц姹傚弬鏁�
+     */
+    private String paramForFormKey;
+
+    /**
+     * 鏄犲皠鍏朵粬灞炴��
+     */
+    private String mapFields;
+
+
+    //鍒楄〃鐨勫弬鐓�
+
+    /**
+     * 鏄剧ず鐨勫垪琛�
+     */
+    private String displayTable;
+
+    /**
+     * 琛ㄦ牸鐨勮嚜瀹氫箟瀹氫箟
+     */
+    private UITableCustomDefineVO tableConfig;
+
+    /**
+     * 绛涢�夋潯浠�
+     */
+    private Map<String,String> where;
+
+    /**
+     * 鍚庡彴鎺掑簭
+     */
+    private boolean remoteSort;
+
+    /**
+     * 鍒濆鍖栨帓搴�
+     */
+    private UIFieldSortVO initSort;
+
+    public boolean isRemoteSort() {
+        return remoteSort;
+    }
+
+    public void setRemoteSort(boolean remoteSort) {
+        this.remoteSort = remoteSort;
+    }
+
+
+    public UIFieldSortVO getInitSort() {
+        return initSort;
+    }
+
+    public void setInitSort(UIFieldSortVO initSort) {
+        this.initSort = initSort;
+    }
+
+    public String getParentUsedField() {
+        return parentUsedField;
+    }
+
+    public void setParentUsedField(String parentUsedField) {
+        this.parentUsedField = parentUsedField;
+    }
+
+    public Map<String, String> getWhere() {
+        return where;
+    }
+
+    public void setWhere(Map<String, String> where) {
+        this.where = where;
+    }
+
+    public String getUseFormKey() {
+        return useFormKey;
+    }
+
+    public void setUseFormKey(String useFormKey) {
+        this.useFormKey = useFormKey;
+    }
+
+    public String getParamForFormKey() {
+        return paramForFormKey;
+    }
+
+    public void setParamForFormKey(String paramForFormKey) {
+        this.paramForFormKey = paramForFormKey;
+    }
+
+    public String getMapFields() {
+        return mapFields;
+    }
+
+    public void setMapFields(String mapFields) {
+        this.mapFields = mapFields;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getTextField() {
+        return textField;
+    }
+
+    public void setTextField(String textField) {
+        this.textField = textField;
+    }
+
+    public String getValueField() {
+        return valueField;
+    }
+
+    public void setValueField(String valueField) {
+        this.valueField = valueField;
+    }
+
+    public boolean isMuti() {
+        return muti;
+    }
+
+    public void setMuti(boolean muti) {
+        this.muti = muti;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public String getBackPath() {
+        return backPath;
+    }
+
+    public void setBackPath(String backPath) {
+        this.backPath = backPath;
+    }
+
+    public String getMethod() {
+        return method;
+    }
+
+    public void setMethod(String method) {
+        this.method = method;
+    }
+
+    public Integer getHeight() {
+        return height;
+    }
+
+    public void setHeight(Integer height) {
+        this.height = height;
+    }
+
+    public String getReferType() {
+        return referType;
+    }
+
+    public void setReferType(String referType) {
+        this.referType = referType;
+    }
+
+    public String getReferContent() {
+        return referContent;
+    }
+
+    public void setReferContent(String referContent) {
+        this.referContent = referContent;
+    }
+
+    public String getParentFieldName() {
+        return parentFieldName;
+    }
+
+    public void setParentFieldName(String parentFieldName) {
+        this.parentFieldName = parentFieldName;
+    }
+
+    public String getParentValue() {
+        return parentValue;
+    }
+
+    public void setParentValue(String parentValue) {
+        this.parentValue = parentValue;
+    }
+
+    public String getLoadType() {
+        return loadType;
+    }
+
+    public void setLoadType(String loadType) {
+        this.loadType = loadType;
+    }
+
+    public boolean isOnlyLeaf() {
+        return onlyLeaf;
+    }
+
+    public void setOnlyLeaf(boolean onlyLeaf) {
+        this.onlyLeaf = onlyLeaf;
+    }
+
+    public String getDisplayTable() {
+        return displayTable;
+    }
+
+    public void setDisplayTable(String displayTable) {
+        this.displayTable = displayTable;
+    }
+
+    public UITableCustomDefineVO getTableConfig() {
+        return tableConfig;
+    }
+
+    public void setTableConfig(UITableCustomDefineVO tableConfig) {
+        this.tableConfig = tableConfig;
+    }
+
+    @Override
+    public String toString() {
+        return "UIFormReferVO{" +
+                "type='" + type + '\'' +
+                ", textField='" + textField + '\'' +
+                ", valueField='" + valueField + '\'' +
+                ", muti=" + muti +
+                ", url='" + url + '\'' +
+                ", backPath='" + backPath + '\'' +
+                ", method='" + method + '\'' +
+                ", height=" + height +
+                ", referType='" + referType + '\'' +
+                ", referContent='" + referContent + '\'' +
+                ", parentFieldName='" + parentFieldName + '\'' +
+                ", parentValue='" + parentValue + '\'' +
+                ", loadType='" + loadType + '\'' +
+                ", onlyLeaf=" + onlyLeaf +
+                ", useFormKey='" + useFormKey + '\'' +
+                ", paramForFormKey='" + paramForFormKey + '\'' +
+                ", mapFields='" + mapFields + '\'' +
+                ", displayTable='" + displayTable + '\'' +
+                ", tableConfig=" + tableConfig +
+                ", where=" + where +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UILayoutVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UILayoutVO.java
new file mode 100644
index 0000000..4e888d0
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UILayoutVO.java
@@ -0,0 +1,212 @@
+package com.vci.web.pageModel;
+
+import com.vci.starter.web.pagemodel.BaseModelVO;
+
+import java.util.List;
+
+/**
+ * UI涓婁笅鏂囩殑甯冨眬
+ * @author weidy
+ * @date 2021/2/15
+ */
+public class UILayoutVO extends BaseModelVO {
+
+
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = -2164112054686742831L;
+
+    /**
+     * 鎵�灞濽I涓婁笅鏂�
+     */
+    private String pkContent;
+
+    /**
+     * 鎵�灞炲尯鍩�
+     */
+    private String layoutAreaType;
+
+    /**
+     * 鎵�灞炲尯鍩熺殑鍚嶇О
+     */
+    private String layoutAreaTypeText;
+
+    /**
+     * 鎺掑簭鍙�
+     */
+    private int orderNum;
+
+    /**
+     * 椤甸潰缂栫爜
+     */
+    private String id;
+
+    /**
+     * 椤甸潰鍚嶇О
+     */
+    private String name;
+
+    /**
+     * 鏄剧ず鏍囬
+     */
+    private String title;
+
+    /**
+     * 鏄惁鍚敤
+     */
+    private boolean enableStatus;
+
+    /**
+     * 鏄剧ず琛ㄨ揪寮�
+     */
+    private String displayExpression;
+
+    /**
+     * 鍥介檯鍖栨爣鍑�
+     */
+    private String international;
+
+    /**
+     * UI瑙f瀽绫�
+     */
+    private String uiParseClass;
+
+    /**
+     * 鎵╁睍灞炴��
+     */
+    private String extendAttr;
+
+    /**
+     * 鍖呭惈鐨勭粍浠�
+     */
+    private List<UIComponentVO> componentVOs;
+
+    public String getPkContent() {
+        return pkContent;
+    }
+
+    public void setPkContent(String pkContent) {
+        this.pkContent = pkContent;
+    }
+
+    public String getLayoutAreaType() {
+        return layoutAreaType;
+    }
+
+    public void setLayoutAreaType(String layoutAreaType) {
+        this.layoutAreaType = layoutAreaType;
+    }
+
+    public String getLayoutAreaTypeText() {
+        return layoutAreaTypeText;
+    }
+
+    public void setLayoutAreaTypeText(String layoutAreaTypeText) {
+        this.layoutAreaTypeText = layoutAreaTypeText;
+    }
+
+    public int getOrderNum() {
+        return orderNum;
+    }
+
+    public void setOrderNum(int orderNum) {
+        this.orderNum = orderNum;
+    }
+
+    @Override
+    public String getId() {
+        return id;
+    }
+
+    @Override
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public boolean isEnableStatus() {
+        return enableStatus;
+    }
+
+    public void setEnableStatus(boolean enableStatus) {
+        this.enableStatus = enableStatus;
+    }
+
+    public String getDisplayExpression() {
+        return displayExpression;
+    }
+
+    public void setDisplayExpression(String displayExpression) {
+        this.displayExpression = displayExpression;
+    }
+
+    public String getInternational() {
+        return international;
+    }
+
+    public void setInternational(String international) {
+        this.international = international;
+    }
+
+    public String getUiParseClass() {
+        return uiParseClass;
+    }
+
+    public void setUiParseClass(String uiParseClass) {
+        this.uiParseClass = uiParseClass;
+    }
+
+    public String getExtendAttr() {
+        return extendAttr;
+    }
+
+    public void setExtendAttr(String extendAttr) {
+        this.extendAttr = extendAttr;
+    }
+
+    public List<UIComponentVO> getComponentVOs() {
+        return componentVOs;
+    }
+
+    public void setComponentVOs(List<UIComponentVO> componentVOs) {
+        this.componentVOs = componentVOs;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    @Override
+    public String toString() {
+        return "UILayoutVO{" +
+                "pkContent='" + pkContent + '\'' +
+                ", layoutAreaType='" + layoutAreaType + '\'' +
+                ", layoutAreaTypeText='" + layoutAreaTypeText + '\'' +
+                ", orderNum=" + orderNum +
+                ", id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", enableStatus=" + enableStatus +
+                ", displayExpression='" + displayExpression + '\'' +
+                ", international='" + international + '\'' +
+                ", uiParseClass='" + uiParseClass + '\'' +
+                ", extendAttr='" + extendAttr + '\'' +
+                ", componentVOs=" + componentVOs +
+                '}';
+    }
+
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UITableCustomDefineVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UITableCustomDefineVO.java
new file mode 100644
index 0000000..615258f
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UITableCustomDefineVO.java
@@ -0,0 +1,77 @@
+package com.vci.web.pageModel;
+
+import java.util.List;
+
+/**
+ * 琛ㄦ牸鐨勮嚜瀹氫箟
+ * @author weidy
+ * @date 2021/2/25
+ */
+public class UITableCustomDefineVO implements java.io.Serializable{
+
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = 431728683965836558L;
+    /**
+     * 涓婚敭
+     */
+    private String oid;
+
+    /**
+     * 鍒嗛〉鐨勫璞�
+     */
+    private UITablePageVO page;
+
+    /**
+     * 鏄剧ず鐨勫垪
+     */
+    private List<UITableFieldVO> cols;
+
+    /**
+     * 鏌ヨ鐨勫垪
+     */
+    private List<UITableFieldVO> queryColumns;
+
+    public String getOid() {
+        return oid;
+    }
+
+    public void setOid(String oid) {
+        this.oid = oid;
+    }
+
+    public UITablePageVO getPage() {
+        return page;
+    }
+
+    public void setPage(UITablePageVO page) {
+        this.page = page;
+    }
+
+    public List<UITableFieldVO> getCols() {
+        return cols;
+    }
+
+    public void setCols(List<UITableFieldVO> cols) {
+        this.cols = cols;
+    }
+
+    public List<UITableFieldVO> getQueryColumns() {
+        return queryColumns;
+    }
+
+    public void setQueryColumns(List<UITableFieldVO> queryColumns) {
+        this.queryColumns = queryColumns;
+    }
+
+    @Override
+    public String toString() {
+        return "UITableCustomDefineVO{" +
+                "oid='" + oid + '\'' +
+                ", page=" + page +
+                ", cols=" + cols +
+                ", queryColumns=" + queryColumns +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UITableDefineVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UITableDefineVO.java
new file mode 100644
index 0000000..f438bf0
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UITableDefineVO.java
@@ -0,0 +1,223 @@
+package com.vci.web.pageModel;
+
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 琛ㄦ牸瀹氫箟
+ * @author weidy
+ * @date 2021/2/15
+ */
+public class UITableDefineVO implements java.io.Serializable {
+
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = 1664618940805858993L;
+    /**
+     * 琛ㄦ牸鐨勪富閿�
+     */
+    private String oid;
+
+    /**
+     * 琛ㄥ崟鐨勭紪鍙�
+     */
+    private String id;
+
+    /**
+     * 涓氬姟绫诲瀷
+     */
+    private String btmType;
+
+    /**
+     * 鏄惁涓洪摼鎺ョ被鍨�
+     */
+    private boolean linkTypeFlag;
+
+    /**
+     * 鏌ヨ妯℃澘鍚嶇О
+     */
+    private String queryTemplateName;
+
+    /**
+     * 椤甸潰
+     */
+    private UITablePageVO pageVO;
+
+    /**
+     * 鍒嗛〉鐨勫唴瀹�
+     */
+    private Integer[] limits;
+
+    /**
+     * 闄勫姞鏉′欢
+     */
+    private String whereSql;
+
+    /**
+     * 鏄惁鏄剧ず鏌ヨ鍖哄煙
+     */
+    private boolean displayQueryArea;
+
+    /**
+     * 鏄剧ず鏂囦欢澶�
+     */
+    private boolean displayFolder ;
+
+    /**
+     * 鐖跺悕绉扮殑瀛楁
+     */
+    private String folderParentField;
+
+    /**
+     * 鍖呭惈鐨勫垪
+     */
+    private List<List<UITableFieldVO>> cols;
+
+    /**
+     * 楂樼骇鏌ヨ鐨勫垪
+     */
+    private List<UITableFieldVO> seniorQueryColumns;
+
+    /**
+     * 鏌ヨ鐨勫垪
+     */
+    private List<UITableFieldVO> queryColumns;
+    /**
+     * freeMarker鐨勮〃杈惧紡鐨勫��
+     */
+    private List<String> freeMarkerEls = new ArrayList<>();
+
+    public boolean isDisplayQueryArea() {
+        return displayQueryArea;
+    }
+
+    public void setDisplayQueryArea(boolean displayQueryArea) {
+        this.displayQueryArea = displayQueryArea;
+    }
+
+    public boolean isDisplayFolder() {
+        return displayFolder;
+    }
+
+    public void setDisplayFolder(boolean displayFolder) {
+        this.displayFolder = displayFolder;
+    }
+
+    public String getFolderParentField() {
+        return folderParentField;
+    }
+
+    public void setFolderParentField(String folderParentField) {
+        this.folderParentField = folderParentField;
+    }
+
+    public String getOid() {
+        return oid;
+    }
+
+    public void setOid(String oid) {
+        this.oid = oid;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getBtmType() {
+        return btmType;
+    }
+
+    public void setBtmType(String btmType) {
+        this.btmType = btmType;
+    }
+
+    public boolean isLinkTypeFlag() {
+        return linkTypeFlag;
+    }
+
+    public void setLinkTypeFlag(boolean linkTypeFlag) {
+        this.linkTypeFlag = linkTypeFlag;
+    }
+
+    public String getQueryTemplateName() {
+        return queryTemplateName;
+    }
+
+    public void setQueryTemplateName(String queryTemplateName) {
+        this.queryTemplateName = queryTemplateName;
+    }
+
+    public List<List<UITableFieldVO>> getCols() {
+        return cols;
+    }
+
+    public void setCols(List<List<UITableFieldVO>> cols) {
+        this.cols = cols;
+    }
+
+    public List<UITableFieldVO> getQueryColumns() {
+        return queryColumns;
+    }
+
+    public void setQueryColumns(List<UITableFieldVO> queryColumns) {
+        this.queryColumns = queryColumns;
+    }
+
+    public UITablePageVO getPageVO() {
+        return pageVO;
+    }
+
+    public void setPageVO(UITablePageVO pageVO) {
+        this.pageVO = pageVO;
+    }
+
+    public Integer[] getLimits() {
+        return limits;
+    }
+
+    public void setLimits(Integer[] limits) {
+        this.limits = limits;
+    }
+
+    public String getWhereSql() {
+        return whereSql;
+    }
+
+    public void setWhereSql(String whereSql) {
+        this.whereSql = whereSql;
+    }
+
+    public List<UITableFieldVO> getSeniorQueryColumns() {
+        return seniorQueryColumns;
+    }
+
+    public void setSeniorQueryColumns(List<UITableFieldVO> seniorQueryColumns) {
+        this.seniorQueryColumns = seniorQueryColumns;
+    }
+
+    @Override
+    public String toString() {
+        return "UITableDefineVO{" +
+                "oid='" + oid + '\'' +
+                ", id='" + id + '\'' +
+                ", btmType='" + btmType + '\'' +
+                ", linkTypeFlag=" + linkTypeFlag +
+                ", queryTemplateName='" + queryTemplateName + '\'' +
+                ", pageVO=" + pageVO +
+                ", limits=" + Arrays.toString(limits) +
+                ", whereSql='" + whereSql + '\'' +
+                ", displayQueryArea=" + displayQueryArea +
+                ", displayFolder=" + displayFolder +
+                ", folderParentField='" + folderParentField + '\'' +
+                ", cols=" + cols +
+                ", queryColumns=" + queryColumns +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UITableFieldVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UITableFieldVO.java
new file mode 100644
index 0000000..e797ef0
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UITableFieldVO.java
@@ -0,0 +1,397 @@
+package com.vci.web.pageModel;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 鍒楄〃鐨勫垪鐨勪俊鎭�
+ * @author weidy
+ * @date 2021/2/25
+ */
+public class UITableFieldVO implements java.io.Serializable{
+
+    /**
+     * 鍒楀悕
+     */
+    private String field;
+
+    /**
+     * 鏄剧ず鐨勫悕绉�
+     */
+    private String title;
+
+    /**
+     * 瀛楁绫诲瀷
+     */
+    private String fieldType;
+
+    /**
+     * 鏄惁鎺掑簭
+     */
+    private boolean sort = false;
+
+    /**
+     * 鎺掑簭瀛楁
+     */
+    private String sortField ;
+
+    /**
+     * 闅愯棌鐨勫瓧娈�
+     */
+    private boolean hidden = false;
+
+    /**
+     * 瀹藉害
+     */
+    private Integer width;
+
+    /**
+     * 鏈�灏忕殑瀹藉害
+     */
+    private Integer minWidth;
+
+    /**
+     * 鍥哄畾浣嶇疆锛屾敮鎸乺ight鍜宭eft
+     */
+    private String fixed;
+
+    /**
+     * 鎵�鍗犵殑鍒�
+     */
+    private Integer colspan = 1;
+
+    /**
+     * 鎵�绔欑殑琛�
+     */
+    private Integer rowspan = 1;
+
+    /**
+     * 妯℃澘鐨勭殑鍐呭
+     */
+    private String templet;
+
+    /**
+     * 鏃堕棿鏍煎紡
+     */
+    private String dateFormate;
+
+    /**
+     * 鏄惁鎿嶄綔鍒�
+     */
+    private boolean optionField = false;
+
+    /**
+     * 鎿嶄綔鍒楀寘鍚殑鎸夐挳
+     */
+    private List<KeyValue> optionButtons;
+
+    /**
+     * 浜嬩欢-鎵цjs鐨勬槧灏�
+     */
+    private Map<String,String> optionJsMap;
+
+    /**
+     * 鏄惁缂栬緫
+     */
+    private String edit;
+
+    /**
+     * 缂栬緫鐨勯厤缃�
+     */
+    private String editConfig ;
+
+    /**
+     * 瀵归綈鏂瑰紡
+     */
+    private String align = "left";
+
+    /**
+     * 鐗规畩鏍峰紡
+     */
+    private String style;
+
+    /**
+     * 鍗曞厓鏍肩偣鍑讳簨浠�
+     */
+    private String event;
+
+    /**
+     * 绂佺敤鎷栨嫿鍒楀
+     */
+    private boolean unresize = false;
+
+    /**
+     * 涓嬫媺鑿滃崟鐨勫悕绉�
+     */
+    private String comboxKey;
+
+    /**
+     * 涓嬫媺鑿滃崟鐨勯�夐」鍊�
+     */
+    private List<KeyValue> data = new ArrayList<>();
+
+    /**
+     * 鍙傜収鏄剧ず鐨勫瓧娈�
+     */
+    private String showField;
+
+    /**
+     * 鏌ヨ鐨勫瓧娈�
+     */
+    private String queryField;
+
+    /**
+     * 鍙傜収鐨勪俊鎭�
+     */
+    private UIFormReferVO referConfig;
+
+    public Map<String, String> getOptionJsMap() {
+        return optionJsMap;
+    }
+
+    public void setOptionJsMap(Map<String, String> optionJsMap) {
+        this.optionJsMap = optionJsMap;
+    }
+
+    public String getFieldType() {
+        return fieldType;
+    }
+
+    public void setFieldType(String fieldType) {
+        this.fieldType = fieldType;
+    }
+
+    public String getDateFormate() {
+        return dateFormate;
+    }
+
+    public void setDateFormate(String dateFormate) {
+        this.dateFormate = dateFormate;
+    }
+
+    public String getField() {
+        return field;
+    }
+
+    public void setField(String field) {
+        this.field = field;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public boolean isSort() {
+        return sort;
+    }
+
+    public void setSort(boolean sort) {
+        this.sort = sort;
+    }
+
+    public String getSortField() {
+        return sortField;
+    }
+
+    public void setSortField(String sortField) {
+        this.sortField = sortField;
+    }
+
+    public boolean isHidden() {
+        return hidden;
+    }
+
+    public void setHidden(boolean hidden) {
+        this.hidden = hidden;
+    }
+
+    public Integer getWidth() {
+        return width;
+    }
+
+    public void setWidth(Integer width) {
+        this.width = width;
+    }
+
+    public Integer getMinWidth() {
+        return minWidth;
+    }
+
+    public void setMinWidth(Integer minWidth) {
+        this.minWidth = minWidth;
+    }
+
+    public String getFixed() {
+        return fixed;
+    }
+
+    public void setFixed(String fixed) {
+        this.fixed = fixed;
+    }
+
+    public Integer getColspan() {
+        return colspan;
+    }
+
+    public void setColspan(Integer colspan) {
+        this.colspan = colspan;
+    }
+
+    public Integer getRowspan() {
+        return rowspan;
+    }
+
+    public void setRowspan(Integer rowspan) {
+        this.rowspan = rowspan;
+    }
+
+    public String getTemplet() {
+        return templet;
+    }
+
+    public void setTemplet(String templet) {
+        this.templet = templet;
+    }
+
+    public boolean isOptionField() {
+        return optionField;
+    }
+
+    public void setOptionField(boolean optionField) {
+        this.optionField = optionField;
+    }
+
+    public List<KeyValue> getOptionButtons() {
+        return optionButtons;
+    }
+
+    public void setOptionButtons(List<KeyValue> optionButtons) {
+        this.optionButtons = optionButtons;
+    }
+
+    public String getEdit() {
+        return edit;
+    }
+
+    public void setEdit(String edit) {
+        this.edit = edit;
+    }
+
+    public String getEditConfig() {
+        return editConfig;
+    }
+
+    public void setEditConfig(String editConfig) {
+        this.editConfig = editConfig;
+    }
+
+    public String getAlign() {
+        return align;
+    }
+
+    public void setAlign(String align) {
+        this.align = align;
+    }
+
+    public String getStyle() {
+        return style;
+    }
+
+    public void setStyle(String style) {
+        this.style = style;
+    }
+
+    public String getEvent() {
+        return event;
+    }
+
+    public void setEvent(String event) {
+        this.event = event;
+    }
+
+    public boolean isUnresize() {
+        return unresize;
+    }
+
+    public void setUnresize(boolean unresize) {
+        this.unresize = unresize;
+    }
+
+    public String getComboxKey() {
+        return comboxKey;
+    }
+
+    public void setComboxKey(String comboxKey) {
+        this.comboxKey = comboxKey;
+    }
+
+    public List<KeyValue> getData() {
+        return data;
+    }
+
+    public void setData(List<KeyValue> data) {
+        this.data = data;
+    }
+
+    public String getShowField() {
+        return showField;
+    }
+
+    public void setShowField(String showField) {
+        this.showField = showField;
+    }
+
+    public UIFormReferVO getReferConfig() {
+        return referConfig;
+    }
+
+    public void setReferConfig(UIFormReferVO referConfig) {
+        this.referConfig = referConfig;
+    }
+
+    public String getQueryField() {
+        return queryField;
+    }
+
+    public void setQueryField(String queryField) {
+        this.queryField = queryField;
+    }
+
+    @Override
+    public String toString() {
+        return "UITableFieldVO{" +
+                "field='" + field + '\'' +
+                ", title='" + title + '\'' +
+                ", fieldType='" + fieldType + '\'' +
+                ", sort=" + sort +
+                ", sortField='" + sortField + '\'' +
+                ", hidden=" + hidden +
+                ", width=" + width +
+                ", minWidth=" + minWidth +
+                ", fixed='" + fixed + '\'' +
+                ", colspan=" + colspan +
+                ", rowspan=" + rowspan +
+                ", templet='" + templet + '\'' +
+                ", dateFormate='" + dateFormate + '\'' +
+                ", optionField=" + optionField +
+                ", optionButtons=" + optionButtons +
+                ", optionJsMap=" + optionJsMap +
+                ", edit='" + edit + '\'' +
+                ", editConfig='" + editConfig + '\'' +
+                ", align='" + align + '\'' +
+                ", style='" + style + '\'' +
+                ", event='" + event + '\'' +
+                ", unresize=" + unresize +
+                ", comboxKey='" + comboxKey + '\'' +
+                ", data=" + data +
+                ", showField='" + showField + '\'' +
+                ", queryField='" + queryField + '\'' +
+                ", referConfig=" + referConfig +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UITablePageVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UITablePageVO.java
new file mode 100644
index 0000000..d129e59
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UITablePageVO.java
@@ -0,0 +1,47 @@
+package com.vci.web.pageModel;
+
+/**
+ * 琛ㄦ牸鐨勫垎椤靛璞�
+ * @author weidy
+ * @date 2021/2/25
+ */
+public class UITablePageVO implements java.io.Serializable{
+
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = -6338518925812603615L;
+    /**
+     * 姣忛〉鏄剧ず鏁伴噺
+     */
+    private Integer limit = -1;
+
+    /**
+     * 褰撳墠椤垫暟
+     */
+    private Integer page = 1;
+
+    public Integer getLimit() {
+        return limit;
+    }
+
+    public void setLimit(Integer limit) {
+        this.limit = limit;
+    }
+
+    public Integer getPage() {
+        return page;
+    }
+
+    public void setPage(Integer page) {
+        this.page = page;
+    }
+
+    @Override
+    public String toString() {
+        return "UITablePageVO{" +
+                "limit=" + limit +
+                ", page=" + page +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UITreeDefineVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UITreeDefineVO.java
new file mode 100644
index 0000000..c259c95
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UITreeDefineVO.java
@@ -0,0 +1,159 @@
+package com.vci.web.pageModel;
+
+/**
+ * 鏍戠殑閰嶇疆
+ * @author weidy
+ * @date 2021/2/15
+ */
+public class UITreeDefineVO implements java.io.Serializable {
+
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = -3615819063395124270L;
+    /**
+     * 涓氬姟绫诲瀷
+     */
+    private String btmType;
+
+    /**
+     * 鍔犺浇鏂瑰紡
+     */
+    private String loadType;
+
+    /**
+     * 鏄惁鍙嶅悜
+     */
+    private boolean orientation = false;
+
+    /**
+     * 鏄剧ず鍥炬爣
+     */
+    private boolean showImage = false;
+
+    /**
+     * 鏍硅妭鐐规樉绀鸿〃杈惧紡锛屾瘮濡� ${name} [${revisionvalue}.${versionvalue}]
+     */
+    private String rootContent;
+
+    /**
+     * 閾炬帴绫诲瀷
+     */
+    private String linkType;
+
+    /**
+     * 鍒嗛殧绗�
+     */
+    private String fieldSep = ",";
+
+    /**
+     * 鏌ヨ妯℃澘鐨勫悕绉�
+     */
+    private String queryTemplateName;
+
+    /**
+     * 鏍戣妭鐐硅〃杈惧紡锛屾瘮濡� ${t_oid.name} [${t_oid.revisionvalue}]
+     */
+    private String treeNodeExpression;
+
+    /**
+     * 鏄摼鎺�
+     */
+    private String showLinkAbs;
+
+    public String getBtmType() {
+        return btmType;
+    }
+
+    public void setBtmType(String btmType) {
+        this.btmType = btmType;
+    }
+
+    public String getLoadType() {
+        return loadType;
+    }
+
+    public void setLoadType(String loadType) {
+        this.loadType = loadType;
+    }
+
+    public boolean isOrientation() {
+        return orientation;
+    }
+
+    public void setOrientation(boolean orientation) {
+        this.orientation = orientation;
+    }
+
+    public boolean isShowImage() {
+        return showImage;
+    }
+
+    public void setShowImage(boolean showImage) {
+        this.showImage = showImage;
+    }
+
+    public String getRootContent() {
+        return rootContent;
+    }
+
+    public void setRootContent(String rootContent) {
+        this.rootContent = rootContent;
+    }
+
+    public String getLinkType() {
+        return linkType;
+    }
+
+    public void setLinkType(String linkType) {
+        this.linkType = linkType;
+    }
+
+    public String getFieldSep() {
+        return fieldSep;
+    }
+
+    public void setFieldSep(String fieldSep) {
+        this.fieldSep = fieldSep;
+    }
+
+    public String getQueryTemplateName() {
+        return queryTemplateName;
+    }
+
+    public void setQueryTemplateName(String queryTemplateName) {
+        this.queryTemplateName = queryTemplateName;
+    }
+
+    public String getTreeNodeExpression() {
+        return treeNodeExpression;
+    }
+
+    public void setTreeNodeExpression(String treeNodeExpression) {
+        this.treeNodeExpression = treeNodeExpression;
+    }
+
+    public String getShowLinkAbs() {
+        return showLinkAbs;
+    }
+
+    public void setShowLinkAbs(String showLinkAbs) {
+        this.showLinkAbs = showLinkAbs;
+    }
+
+    @Override
+    public String toString() {
+        return "UITreeDefineVO{" +
+                "btmType='" + btmType + '\'' +
+                ", loadType='" + loadType + '\'' +
+                ", orientation=" + orientation +
+                ", showImage=" + showImage +
+                ", rootContent='" + rootContent + '\'' +
+                ", linkType='" + linkType + '\'' +
+                ", fieldSep='" + fieldSep + '\'' +
+                ", queryTemplateName='" + queryTemplateName + '\'' +
+                ", treeNodeExpression='" + treeNodeExpression + '\'' +
+                ", showLinkAbs='" + showLinkAbs + '\'' +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UITreeTableDefineVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UITreeTableDefineVO.java
new file mode 100644
index 0000000..c128db1
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/UITreeTableDefineVO.java
@@ -0,0 +1,75 @@
+package com.vci.web.pageModel;
+
+/**
+ * 鏍戣〃瀹氫箟
+ * @author weidy
+ * @date 2021/2/15
+ */
+public class UITreeTableDefineVO extends UITableDefineVO{
+
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = -4334171123988489424L;
+    /**
+     * 鏍戝舰缁撴瀯灞曞紑鍒�
+     */
+    private String treeFieldName;
+
+    /**
+     * 鏈妭鐐圭殑灞炴��
+     */
+    private String treeCurrentField = "oid";
+
+    /**
+     * 鏈妭鐐圭殑
+     */
+    private String treeParentField = "";
+
+    /**
+     * 灞曞紑鏂瑰紡锛岀洰鍓嶈繖涓彧鑳芥敮鎸佸叏閮ㄥ睍寮�
+     */
+    private String loadType= "all";
+
+    public String getTreeFieldName() {
+        return treeFieldName;
+    }
+
+    public void setTreeFieldName(String treeFieldName) {
+        this.treeFieldName = treeFieldName;
+    }
+
+    public String getLoadType() {
+        return loadType;
+    }
+
+    public void setLoadType(String loadType) {
+        this.loadType = loadType;
+    }
+
+    public String getTreeCurrentField() {
+        return treeCurrentField;
+    }
+
+    public void setTreeCurrentField(String treeCurrentField) {
+        this.treeCurrentField = treeCurrentField;
+    }
+
+    public String getTreeParentField() {
+        return treeParentField;
+    }
+
+    public void setTreeParentField(String treeParentField) {
+        this.treeParentField = treeParentField;
+    }
+
+    @Override
+    public String toString() {
+        return "UITreeTableDefineVO{" +
+                "treeFieldName='" + treeFieldName + '\'' +
+                ", treeCurrentField='" + treeCurrentField + '\'' +
+                ", treeParentField='" + treeParentField + '\'' +
+                ", loadType='" + loadType + '\'' +
+                "} " + super.toString();
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/VciFilePreviewConfigVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/VciFilePreviewConfigVO.java
new file mode 100644
index 0000000..4aba605
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/VciFilePreviewConfigVO.java
@@ -0,0 +1,89 @@
+package com.vci.web.pageModel;
+
+/**
+ * 鏂囦欢棰勮鐨勯厤缃樉绀哄璞�
+ * @author weidy
+ * @date 2021/5/20
+ */
+public class VciFilePreviewConfigVO implements java.io.Serializable{
+
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = 4364575881794580548L;
+    /**
+     * 鏂囦欢鐨勪富閿�
+     */
+    private String fileOids;
+
+    /**
+     * 绯荤粺鐨勮鍙�
+     */
+    private String systemKey;
+
+    /**
+     * 棰勮鐨勮鍙紝鏍规嵁绯荤粺璁稿彲鍜屽唴缃鍙浆鎹�
+     */
+    private String previewKey;
+
+    /**
+     * 澶辨晥鏃堕棿
+     */
+    private Long invalidTime;
+
+    /**
+     * 棰勮鐨勮矾寰�
+     */
+    private String previewSystemUrl;
+
+    public String getFileOids() {
+        return fileOids;
+    }
+
+    public void setFileOids(String fileOids) {
+        this.fileOids = fileOids;
+    }
+
+    public String getSystemKey() {
+        return systemKey;
+    }
+
+    public void setSystemKey(String systemKey) {
+        this.systemKey = systemKey;
+    }
+
+    public String getPreviewKey() {
+        return previewKey;
+    }
+
+    public void setPreviewKey(String previewKey) {
+        this.previewKey = previewKey;
+    }
+
+    public Long getInvalidTime() {
+        return invalidTime;
+    }
+
+    public void setInvalidTime(Long invalidTime) {
+        this.invalidTime = invalidTime;
+    }
+
+    public String getPreviewSystemUrl() {
+        return previewSystemUrl;
+    }
+
+    public void setPreviewSystemUrl(String previewSystemUrl) {
+        this.previewSystemUrl = previewSystemUrl;
+    }
+
+    @Override
+    public String toString() {
+        return "VciFilePreviewConfigVO{" +
+                "fileOids='" + fileOids + '\'' +
+                ", systemKey='" + systemKey + '\'' +
+                ", previewKey='" + previewKey + '\'' +
+                ", invalidTime=" + invalidTime +
+                ", previewSystemUrl='" + previewSystemUrl + '\'' +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/WFWorkflowNodeFavItemVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/WFWorkflowNodeFavItemVO.java
new file mode 100644
index 0000000..e6c2cce
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/WFWorkflowNodeFavItemVO.java
@@ -0,0 +1,116 @@
+package com.vci.web.pageModel;
+
+import com.vci.starter.web.pagemodel.BaseModelVO;
+
+/**
+ * 娴佺▼鏀惰棌鑺傜偣鏄庣粏鏄剧ず瀵硅薄
+ *
+ * @author weidy
+ * @date 2021-06-08
+ */
+public class WFWorkflowNodeFavItemVO extends BaseModelVO {
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = 8952340100547833988L;
+
+    /**
+     * 缂栧彿
+     */
+    private String id;
+
+
+    /**
+     * 鍚嶇О
+     */
+    private String name;
+
+
+    /**
+     * 鍖呭惈鐨勭敤鎴峰悕锛屽彲浠ュ涓紝浣嗘槸鎬荤殑涓嶈秴杩�4000闀垮害
+     */
+    private String nodeUserIds;
+
+
+    /**
+     * 鍖呭惈鐢ㄦ埛濮撳悕
+     */
+    private String nodeUserNames;
+
+
+    /**
+     * 娴佺▼鏀惰棌鑺傜偣鐨勬柟妗堜富閿�
+     */
+    private String workflowNodeFavOid;
+
+    /**
+     * 鎻忚堪
+     */
+    private String description;
+
+    @Override
+    public String getId() {
+        return id;
+    }
+
+    @Override
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getNodeUserIds() {
+        return nodeUserIds;
+    }
+
+    public void setNodeUserIds(String nodeUserIds) {
+        this.nodeUserIds = nodeUserIds;
+    }
+
+    public String getNodeUserNames() {
+        return nodeUserNames;
+    }
+
+    public void setNodeUserNames(String nodeUserNames) {
+        this.nodeUserNames = nodeUserNames;
+    }
+
+    public String getWorkflowNodeFavOid() {
+        return workflowNodeFavOid;
+    }
+
+    public void setWorkflowNodeFavOid(String workflowNodeFavOid) {
+        this.workflowNodeFavOid = workflowNodeFavOid;
+    }
+
+    @Override
+    public String getDescription() {
+        return description;
+    }
+
+    @Override
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    @Override
+    public String toString() {
+        return "WFWorkflowNodeFavItemVO{" +
+                "id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", nodeUserIds='" + nodeUserIds + '\'' +
+                ", nodeUserNames='" + nodeUserNames + '\'' +
+                ", workflowNodeFavOid='" + workflowNodeFavOid + '\'' +
+                ", description='" + description + '\'' +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/WFWorkflowNodeFavVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/WFWorkflowNodeFavVO.java
new file mode 100644
index 0000000..2e8f524
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/WFWorkflowNodeFavVO.java
@@ -0,0 +1,113 @@
+package com.vci.web.pageModel;
+
+import com.vci.starter.web.pagemodel.BaseModelVO;
+
+/**
+ * 娴佺▼璐熻矗浜烘敹钘忔樉绀哄璞�
+ *
+ * @author weidy
+ * @date 2021-6-8
+ */
+public class WFWorkflowNodeFavVO extends BaseModelVO {
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = -6881391886837638314L;
+
+    /**
+     * 鎻忚堪
+     */
+    private String description;
+
+    /**
+     * 缂栧彿
+     */
+    private String id;
+
+    /**
+     * 鍚嶇О
+     */
+    private String name;
+
+    /**
+     * 鐢ㄦ埛璐﹀彿
+     */
+    private String userId;
+
+
+    /**
+     * 娴佺▼妯℃澘鐨勫悕绉�
+     */
+    private String wfTemplateName;
+
+    /**
+     * 娴佺▼妯℃澘鐨勭増鏈�
+     */
+    private String wfTemplateRev;
+
+    @Override
+    public String getDescription() {
+        return description;
+    }
+
+    @Override
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    @Override
+    public String getId() {
+        return id;
+    }
+
+    @Override
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getUserId() {
+        return userId;
+    }
+
+    public void setUserId(String userId) {
+        this.userId = userId;
+    }
+
+    public String getWfTemplateName() {
+        return wfTemplateName;
+    }
+
+    public void setWfTemplateName(String wfTemplateName) {
+        this.wfTemplateName = wfTemplateName;
+    }
+
+    public String getWfTemplateRev() {
+        return wfTemplateRev;
+    }
+
+    public void setWfTemplateRev(String wfTemplateRev) {
+        this.wfTemplateRev = wfTemplateRev;
+    }
+
+    @Override
+    public String toString() {
+        return "WFWorkflowNodeFavVO{" +
+                "description='" + description + '\'' +
+                ", id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", userId='" + userId + '\'' +
+                ", wfTemplateName='" + wfTemplateName + '\'' +
+                ", wfTemplateRev='" + wfTemplateRev + '\'' +
+                '}' + super.toString();
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/WebHomeTaskActionVO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/WebHomeTaskActionVO.java
new file mode 100644
index 0000000..0e74305
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/pageModel/WebHomeTaskActionVO.java
@@ -0,0 +1,94 @@
+package com.vci.web.pageModel;
+
+import com.vci.starter.web.model.BaseModel;
+
+/**
+ * 棣栭〉鐨勫緟鍔炰簨椤癸紝涓嶆槸娴佺▼
+ * @author weidy
+ * @date 2021-2-22
+ */
+public class WebHomeTaskActionVO extends BaseModel  {
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = -4032762462140459530L;
+    /**
+     * 鍔熻兘涓婚敭鐢ㄤ簬纭畾鍔熻兘鏉冮檺
+     */
+    private String id;
+
+    /**
+     * 鏄剧ず鏂囨湰
+     */
+    private String name;
+
+    /**
+     * 鏈嶅姟鍚嶇О
+     */
+    private String serviceName;
+
+    /**
+     * 鑾峰彇鏁伴噺鐨刄rl
+     */
+    private String countUrl;
+
+    /**
+     * 鐐瑰嚮鍚庣殑閾炬帴鍦板潃
+     */
+    private String uiUrl;
+
+    @Override
+    public String getId() {
+        return id;
+    }
+
+    @Override
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getServiceName() {
+        return serviceName;
+    }
+
+    public void setServiceName(String serviceName) {
+        this.serviceName = serviceName;
+    }
+
+    public String getCountUrl() {
+        return countUrl;
+    }
+
+    public void setCountUrl(String countUrl) {
+        this.countUrl = countUrl;
+    }
+
+    public String getUiUrl() {
+        return uiUrl;
+    }
+
+    public void setUiUrl(String uiUrl) {
+        this.uiUrl = uiUrl;
+    }
+
+    @Override
+    public String toString() {
+        return "WebHomeTaskActionVO{" +
+                "id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", serviceName='" + serviceName + '\'' +
+                ", countUrl='" + countUrl + '\'' +
+                ", uiUrl='" + uiUrl + '\'' +
+                "} " + super.toString();
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/properties/OsDDLExportWordFieldProperties.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/properties/OsDDLExportWordFieldProperties.java
new file mode 100644
index 0000000..54ee832
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/properties/OsDDLExportWordFieldProperties.java
@@ -0,0 +1,162 @@
+package com.vci.web.properties;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * 瀵煎嚭鍒皐ord鐨勫瓧娈垫槧灏�,闇�瑕佸拰妯℃澘涓殑鍩熷瓧娈靛搴�
+ * @author weidy
+ * @date 2020/2/20
+ */
+@Configuration
+@ConfigurationProperties(prefix = "vci.objectservice.ddl.exportword")
+public class OsDDLExportWordFieldProperties {
+
+
+    /**
+     * 琛ㄦ牸鐨勫悕绉�
+     */
+    private String tableName = "tableInfo";
+
+    /**
+     * 琛ㄦ牸鐨勫悕绉�
+     */
+    private String title = "tableTitle";
+
+    /**
+     * 琛ㄦ牸鐨勬灇涓惧弬鐓х敓鍛藉懆鏈熺瓑鎻忚堪
+     */
+    private String areaDesc = "tableAreaDesc";
+
+    /**
+     * 瀛楁琛ㄦ牸鐨勫悕绉帮紝闇�瑕佸搴旀ā鏉夸腑鐨勫煙瀛楁
+     */
+    private String columnTableName = "columnInfo";
+
+    /**
+     * 瀛楁琛ㄦ牸鐨勫簭鍙�
+     */
+    private String columnIndex = "tableColumnIndex";
+
+    /**
+     * 瀛楁鐨勮嫳鏂囧悕绉�
+     */
+    private String columnId = "columnId";
+
+    /**
+     *瀛楁鐨勬樉绀哄悕绉�
+     */
+    private String columnName = "columnName";
+
+    /**
+     * 瀛楁鐨勭被鍨�
+     */
+    private String columnType = "columnType";
+
+    /**
+     * 瀛楁鐨勭害鏉�
+     */
+    private String columnArea = "columnArea";
+
+    /**
+     * 瀛楁鐨勭壒娈婃弿杩�
+     */
+    private String columnDesc = "columnDesc";
+
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getAreaDesc() {
+        return areaDesc;
+    }
+
+    public void setAreaDesc(String areaDesc) {
+        this.areaDesc = areaDesc;
+    }
+
+    public String getColumnTableName() {
+        return columnTableName;
+    }
+
+    public void setColumnTableName(String columnTableName) {
+        this.columnTableName = columnTableName;
+    }
+
+    public String getColumnIndex() {
+        return columnIndex;
+    }
+
+    public void setColumnIndex(String columnIndex) {
+        this.columnIndex = columnIndex;
+    }
+
+    public String getColumnId() {
+        return columnId;
+    }
+
+    public void setColumnId(String columnId) {
+        this.columnId = columnId;
+    }
+
+    public String getColumnName() {
+        return columnName;
+    }
+
+    public void setColumnName(String columnName) {
+        this.columnName = columnName;
+    }
+
+    public String getColumnType() {
+        return columnType;
+    }
+
+    public void setColumnType(String columnType) {
+        this.columnType = columnType;
+    }
+
+    public String getColumnArea() {
+        return columnArea;
+    }
+
+    public void setColumnArea(String columnArea) {
+        this.columnArea = columnArea;
+    }
+
+    public String getColumnDesc() {
+        return columnDesc;
+    }
+
+    public void setColumnDesc(String columnDesc) {
+        this.columnDesc = columnDesc;
+    }
+
+    public String getTableName() {
+        return tableName;
+    }
+
+    public void setTableName(String tableName) {
+        this.tableName = tableName;
+    }
+
+    @Override
+    public String toString() {
+        return "OsDDLExportWordFieldProperties{" +
+                "tableName='" + tableName + '\'' +
+                ", title='" + title + '\'' +
+                ", areaDesc='" + areaDesc + '\'' +
+                ", columnTableName='" + columnTableName + '\'' +
+                ", columnIndex='" + columnIndex + '\'' +
+                ", columnId='" + columnId + '\'' +
+                ", columnName='" + columnName + '\'' +
+                ", columnType='" + columnType + '\'' +
+                ", columnArea='" + columnArea + '\'' +
+                ", columnDesc='" + columnDesc + '\'' +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/properties/WebProperties.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/properties/WebProperties.java
new file mode 100644
index 0000000..92a3d54
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/properties/WebProperties.java
@@ -0,0 +1,278 @@
+package com.vci.web.properties;
+
+
+import com.vci.starter.web.annotation.config.VciConfigField;
+import com.vci.starter.web.annotation.config.VciConfigModule;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * web鐩稿叧鐨勯厤缃�
+ * @author weidy
+ */
+@Configuration
+@ConfigurationProperties(prefix = "vciweb")
+@VciConfigModule(name = "platform1",title = "骞冲彴鍏ㄥ眬閫夐」")
+public class WebProperties {
+
+	/**
+	 * 鏄惁鎺у埗鍔熻兘鏉冮檺
+	 */
+	@VciConfigField(value = "function.right.swith",title = "鏄惁鎺у埗鍔熻兘鏉冮檺")
+	private boolean functionRight = true;
+
+	/**
+	 * 鏄惁鎺у埗UI鏉冮檺
+	 */
+	@VciConfigField(value = "ui.right.swith",title = "鏄惁UI鏉冮檺")
+	private boolean UIRight = false;
+
+	/**
+	 * 鏄惁鎺у埗鏁版嵁鏉冮檺
+	 */
+	@VciConfigField(value = "right.switch",title = "鏄惁鏁版嵁鏉冮檺")
+	private boolean dataRight = false;
+	//鏄惁鎺у埗鏁版嵁鏉冮檺
+
+	/**
+	 * 鏄惁鎺у埗瀵嗙骇
+	 */
+	@VciConfigField(value = "userSecuritySwith",title = "鏄惁鎺у埗瀵嗙骇")
+	private boolean secretRight = false;
+
+	/**
+	 * 鏄惁鎺у埗IP瀵嗙骇
+	 */
+	@VciConfigField(value = "ipSecuritySwitch",title = "鏄惁鎺у埗IP瀵嗙骇")
+	private boolean ipSecretRight = false;
+
+	/**
+	 * 鍙戣捣娴佺▼鏃舵槸鍚︽牎楠岀敤鎴峰瘑绾�
+	 */
+	private boolean checkSecretOnProcessStart = false;
+
+	/**
+	 * 鏄惁寮�鍚鎴风妫�鏌�
+	 */
+	@VciConfigField(value = "sessionTimeOutCheck",title = "鏄惁寮�鍚細璇濇鏌�")
+	private boolean checkClientSessionTimeout;
+
+	/**
+	 * 瀹㈡埛绔渶澶у瓨鍦ㄦ椂闂达紝鍗曚綅涓哄垎閽�
+	 */
+	@VciConfigField(value = "sessionAliveMax",title = "浼氳瘽鏈�澶ф椂闂�")
+	private int clientSessionAliveMax;
+
+	/**
+	 * 瓒呮椂鎻愰啋鏃堕棿锛屽崟浣嶄负鍒嗛挓
+	 */
+	@VciConfigField(value = "sessionAlertRemind",title = "浼氳瘽瓒呮椂鎻愰啋")
+	private int clientSessionRemind;
+
+	/**
+	 * 瀹㈡埛绔垽鏂秴鏃惰疆璇㈡椂闂达紝鍗曚綅涓虹
+	 */
+	@VciConfigField(value = "sessionTimeOutInterval",title = "瀹㈡埛绔疆璇㈡椂闂�")
+	private int clientSessionInterval = 15;
+
+	/**
+	 * 鍒濆鍖栫殑鏃跺�欑紦瀛楿I
+	 */
+	@VciConfigField(value = "cacheUIOnInit",title = "鍒濆鍖栫殑鏃跺�欑紦瀛楿I")
+	private boolean cacheUIOnInit = true;
+
+	/**
+	 * 鏄惁鑷姩鎵弿鍔熻兘鏉冮檺鐨勬敞瑙�
+	 */
+	private boolean scanFunctionAnnotation;
+
+	/**
+	 * 娴忚鏈嶅姟鐨勮矾寰�
+	 */
+	private String previewServiceUrl;
+
+	/**
+	 * 娴忚鏈嶅姟鐨勭閽�
+	 */
+	private String previewPrivateKey;
+
+	/**
+	 * 娴忚鏈嶅姟鐨勭郴缁焝ey
+	 */
+	private String previewSystemKey;
+
+	/**
+	 * 鏄惁debug
+	 */
+	private boolean debug;
+
+	/**
+	 * 鏂囦欢鍒嗙墖鐨勫ぇ灏�,鍗曚綅鏄疜B
+	 */
+	private int blockLength = 32;
+
+	public boolean isFunctionRight() {
+		return functionRight;
+	}
+
+	public void setFunctionRight(boolean functionRight) {
+		this.functionRight = functionRight;
+	}
+
+	public boolean isUIRight() {
+		return UIRight;
+	}
+
+	public void setUIRight(boolean UIRight) {
+		this.UIRight = UIRight;
+	}
+
+	public boolean isDataRight() {
+		return dataRight;
+	}
+
+	public void setDataRight(boolean dataRight) {
+		this.dataRight = dataRight;
+	}
+
+	public boolean isSecretRight() {
+		return secretRight;
+	}
+
+	public void setSecretRight(boolean secretRight) {
+		this.secretRight = secretRight;
+	}
+
+	public boolean isIpSecretRight() {
+		return ipSecretRight;
+	}
+
+	public void setIpSecretRight(boolean ipSecretRight) {
+		this.ipSecretRight = ipSecretRight;
+	}
+
+	public boolean isCheckSecretOnProcessStart() {
+		return checkSecretOnProcessStart;
+	}
+
+	public void setCheckSecretOnProcessStart(boolean checkSecretOnProcessStart) {
+		this.checkSecretOnProcessStart = checkSecretOnProcessStart;
+	}
+
+	public boolean isCheckClientSessionTimeout() {
+		return checkClientSessionTimeout;
+	}
+
+	public void setCheckClientSessionTimeout(boolean checkClientSessionTimeout) {
+		this.checkClientSessionTimeout = checkClientSessionTimeout;
+	}
+
+	public int getClientSessionAliveMax() {
+		return clientSessionAliveMax;
+	}
+
+	public void setClientSessionAliveMax(int clientSessionAliveMax) {
+		this.clientSessionAliveMax = clientSessionAliveMax;
+	}
+
+	public int getClientSessionRemind() {
+		return clientSessionRemind;
+	}
+
+	public void setClientSessionRemind(int clientSessionRemind) {
+		this.clientSessionRemind = clientSessionRemind;
+	}
+
+	public int getClientSessionInterval() {
+		return clientSessionInterval;
+	}
+
+	public void setClientSessionInterval(int clientSessionInterval) {
+		this.clientSessionInterval = clientSessionInterval;
+	}
+
+	public boolean isScanFunctionAnnotation() {
+		return scanFunctionAnnotation;
+	}
+
+	public void setScanFunctionAnnotation(boolean scanFunctionAnnotation) {
+		this.scanFunctionAnnotation = scanFunctionAnnotation;
+	}
+
+	public String getPreviewServiceUrl() {
+		return previewServiceUrl;
+	}
+
+	public void setPreviewServiceUrl(String previewServiceUrl) {
+		this.previewServiceUrl = previewServiceUrl;
+	}
+
+	public String getPreviewPrivateKey() {
+		return previewPrivateKey;
+	}
+
+	public void setPreviewPrivateKey(String previewPrivateKey) {
+		this.previewPrivateKey = previewPrivateKey;
+	}
+
+	public String getPreviewSystemKey() {
+		return previewSystemKey;
+	}
+
+	public void setPreviewSystemKey(String previewSystemKey) {
+		this.previewSystemKey = previewSystemKey;
+	}
+
+	public boolean isDebug() {
+		return debug;
+	}
+
+	public void setDebug(boolean debug) {
+		this.debug = debug;
+	}
+
+	public int getBlockLength() {
+		return blockLength;
+	}
+
+	public void setBlockLength(int blockLength) {
+		this.blockLength = blockLength;
+	}
+
+	public boolean isCacheUIOnInit() {
+		return cacheUIOnInit;
+	}
+
+	public void setCacheUIOnInit(boolean cacheUIOnInit) {
+		this.cacheUIOnInit = cacheUIOnInit;
+	}
+
+	@Override
+	public String toString() {
+		return "WebProperties{" +
+				"functionRight=" + functionRight +
+				", UIRight=" + UIRight +
+				", dataRight=" + dataRight +
+				", secretRight=" + secretRight +
+				", ipSecretRight=" + ipSecretRight +
+				", checkSecretOnProcessStart=" + checkSecretOnProcessStart +
+				", checkClientSessionTimeout=" + checkClientSessionTimeout +
+				", clientSessionAliveMax=" + clientSessionAliveMax +
+				", clientSessionRemind=" + clientSessionRemind +
+				", clientSessionInterval=" + clientSessionInterval +
+				", cacheUIOnInit=" + cacheUIOnInit +
+				", scanFunctionAnnotation=" + scanFunctionAnnotation +
+				", previewServiceUrl='" + previewServiceUrl + '\'' +
+				", previewPrivateKey='" + previewPrivateKey + '\'' +
+				", previewSystemKey='" + previewSystemKey + '\'' +
+				", debug=" + debug +
+				", blockLength=" + blockLength +
+				'}';
+	}
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/query/FileImageViewerQuery.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/query/FileImageViewerQuery.java
new file mode 100644
index 0000000..543c64e
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/query/FileImageViewerQuery.java
@@ -0,0 +1,75 @@
+package com.vci.web.query;
+
+/**
+ * 鍥剧墖缁勪欢鐨勬煡璇㈠璞�
+ * @author weidy
+ * @date 2021/3/11
+ */
+public class FileImageViewerQuery implements java.io.Serializable{
+
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = 876530566276018545L;
+    /**
+     * 涓氬姟绫诲瀷
+     */
+    private String btmType;
+
+    /**
+     * 鍥剧墖鏄剧ず鐨勬柟寮�
+     */
+    private String imageType;
+
+    /**
+     * 鏂囦欢鐨勪富閿�
+     */
+    private String fileOid;
+
+    /**
+     * 鏂囦欢鐨勮矾寰�
+     */
+    private String filePath;
+
+    public String getBtmType() {
+        return btmType;
+    }
+
+    public void setBtmType(String btmType) {
+        this.btmType = btmType;
+    }
+
+    public String getImageType() {
+        return imageType;
+    }
+
+    public void setImageType(String imageType) {
+        this.imageType = imageType;
+    }
+
+    public String getFileOid() {
+        return fileOid;
+    }
+
+    public void setFileOid(String fileOid) {
+        this.fileOid = fileOid;
+    }
+
+    public String getFilePath() {
+        return filePath;
+    }
+
+    public void setFilePath(String filePath) {
+        this.filePath = filePath;
+    }
+
+    @Override
+    public String toString() {
+        return "FileImageViewerQuery{" +
+                "btmType='" + btmType + '\'' +
+                ", imageType='" + imageType + '\'' +
+                ", fileOid='" + fileOid + '\'' +
+                ", filePath='" + filePath + '\'' +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/query/UIBaseQuery.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/query/UIBaseQuery.java
new file mode 100644
index 0000000..49ac8ce
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/query/UIBaseQuery.java
@@ -0,0 +1,48 @@
+package com.vci.web.query;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * UI鐨勫熀纭�鏌ヨ
+ * @author weidy
+ * @date 2021/4/26
+ */
+public class UIBaseQuery implements java.io.Serializable{
+
+    /**
+     * 鏉ユ簮鏁版嵁
+     */
+    private Map<String,String> sourceData = new HashMap<>();
+
+    /**
+     * 閫夋嫨鏁版嵁
+     */
+    private List<Map<String,String>> selectData = new ArrayList<>();
+
+    public Map<String, String> getSourceData() {
+        return sourceData;
+    }
+
+    public void setSourceData(Map<String, String> sourceData) {
+        this.sourceData = sourceData;
+    }
+
+    public List<Map<String, String>> getSelectData() {
+        return selectData;
+    }
+
+    public void setSelectData(List<Map<String, String>> selectData) {
+        this.selectData = selectData;
+    }
+
+    @Override
+    public String toString() {
+        return "UIBaseQuery{" +
+                "sourceData=" + sourceData +
+                ", selectData=" + selectData +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/query/UIDataGridQuery.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/query/UIDataGridQuery.java
new file mode 100644
index 0000000..57fea20
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/query/UIDataGridQuery.java
@@ -0,0 +1,135 @@
+package com.vci.web.query;
+
+import com.vci.starter.web.pagemodel.BaseQueryObject;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 鍒楄〃鐨勬煡璇�
+ * @author weidy
+ * @date 2021/2/16
+ */
+public class UIDataGridQuery extends BaseQueryObject {
+
+    /**
+     * 涓氬姟绫诲瀷缂栧彿锛屽繀杈�
+     */
+    private String btmname;
+
+    /**
+     * 琛ㄦ牸瀹氫箟鐨勮嫳鏂囧悕绉帮紝蹇呰緭
+     */
+    private String tableDefineId;
+
+    /**
+     * UI涓婁笅鏂囩殑涓婚敭
+     */
+    private String uiDefineId;
+
+    /**
+     * 缁勪欢鐨勪富閿�
+     */
+    private String componentOid;
+
+    /**
+     * 鏄惁涓洪摼鎺ョ被鍨�
+     */
+    private boolean linkTypeFlag;
+
+    /**
+     * 鏉ユ簮鏁版嵁
+     */
+    private Map<String,String> sourceData = new HashMap<>();
+
+    /**
+     * 閫夋嫨鏁版嵁
+     */
+    private List<Map<String,String>> selectData = new ArrayList<>();
+
+    /**
+     * 鏄惁鏍戣〃鐨勬煡璇�
+     */
+    private boolean treeTableFlag = false;
+
+    public Map<String, String> getSourceData() {
+        return sourceData;
+    }
+
+    public void setSourceData(Map<String, String> sourceData) {
+        this.sourceData = sourceData;
+    }
+
+    public List<Map<String, String>> getSelectData() {
+        return selectData;
+    }
+
+    public void setSelectData(List<Map<String, String>> selectData) {
+        this.selectData = selectData;
+    }
+
+    public String getBtmname() {
+        return btmname;
+    }
+
+    public void setBtmname(String btmname) {
+        this.btmname = btmname;
+    }
+
+    public String getTableDefineId() {
+        return tableDefineId;
+    }
+
+    public void setTableDefineId(String tableDefineId) {
+        this.tableDefineId = tableDefineId;
+    }
+
+
+    public String getUiDefineId() {
+        return uiDefineId;
+    }
+
+    public void setUiDefineId(String uiDefineId) {
+        this.uiDefineId = uiDefineId;
+    }
+
+    public String getComponentOid() {
+        return componentOid;
+    }
+
+    public void setComponentOid(String componentOid) {
+        this.componentOid = componentOid;
+    }
+
+    public boolean isLinkTypeFlag() {
+        return linkTypeFlag;
+    }
+
+    public void setLinkTypeFlag(boolean linkTypeFlag) {
+        this.linkTypeFlag = linkTypeFlag;
+    }
+
+    public boolean isTreeTableFlag() {
+        return treeTableFlag;
+    }
+
+    public void setTreeTableFlag(boolean treeTableFlag) {
+        this.treeTableFlag = treeTableFlag;
+    }
+
+    @Override
+    public String toString() {
+        return "UIDataGridQuery{" +
+                "btmname='" + btmname + '\'' +
+                ", tableDefineId='" + tableDefineId + '\'' +
+                ", uiDefineId='" + uiDefineId + '\'' +
+                ", componentOid='" + componentOid + '\'' +
+                ", linkTypeFlag=" + linkTypeFlag +
+                ", sourceData=" + sourceData +
+                ", selectData=" + selectData +
+                ", treeTableFlag=" + treeTableFlag +
+                "} " + super.toString();
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/query/UIFormQuery.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/query/UIFormQuery.java
new file mode 100644
index 0000000..55dd009
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/query/UIFormQuery.java
@@ -0,0 +1,78 @@
+package com.vci.web.query;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 琛ㄥ崟鐨勬煡璇�
+ * @author weidy
+ * @date 2021/2/16
+ */
+public class UIFormQuery extends UIBaseQuery{
+
+    /**
+     * 涓氬姟绫诲瀷缂栧彿锛屽繀杈�
+     */
+    private String btmname;
+
+    /**
+     * 涓婚敭
+     */
+    private String oid;
+
+    /**
+     * 琛ㄥ崟瀹氫箟鐨勮嫳鏂囧悕绉帮紝蹇呰緭
+     */
+    private String formDefineId;
+
+    /**
+     * 鏄惁涓洪摼鎺ョ被鍨�
+     */
+    private boolean linkTypeFlag;
+
+
+
+    public String getBtmname() {
+        return btmname;
+    }
+
+    public void setBtmname(String btmname) {
+        this.btmname = btmname;
+    }
+
+    public String getOid() {
+        return oid;
+    }
+
+    public void setOid(String oid) {
+        this.oid = oid;
+    }
+
+    public String getFormDefineId() {
+        return formDefineId;
+    }
+
+    public void setFormDefineId(String formDefineId) {
+        this.formDefineId = formDefineId;
+    }
+
+    public boolean isLinkTypeFlag() {
+        return linkTypeFlag;
+    }
+
+    public void setLinkTypeFlag(boolean linkTypeFlag) {
+        this.linkTypeFlag = linkTypeFlag;
+    }
+
+    @Override
+    public String toString() {
+        return "UIFormQuery{" +
+                "btmname='" + btmname + '\'' +
+                ", oid='" + oid + '\'' +
+                ", formDefineId='" + formDefineId + '\'' +
+                ", linkTypeFlag=" + linkTypeFlag +
+                "} " + super.toString();
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/query/UILinkTypeDataQuery.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/query/UILinkTypeDataQuery.java
new file mode 100644
index 0000000..7458727
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/query/UILinkTypeDataQuery.java
@@ -0,0 +1,175 @@
+package com.vci.web.query;
+
+import com.vci.starter.web.pagemodel.PageHelper;
+
+import java.util.Collection;
+import java.util.Map;
+
+/**
+ * 閾炬帴绫诲瀷鐨勬煡璇㈠璞�
+ * @author weidy
+ * @date 2021/3/10
+ */
+public class UILinkTypeDataQuery extends UIBaseQuery{
+
+    /**
+     * 鏌ヨ妯℃澘鐨勫悕绉�
+     */
+    private String queryTemplateName;
+
+    /**
+     * 閾炬帴绫诲瀷
+     */
+    private String linkType;
+
+    /**
+     * 璧峰鏌ヨ鐨勫��
+     */
+    private String parentOid;
+
+    /**
+     * 鏌ヨ鏉′欢
+     */
+    private Map<String,String> conditionMap;
+
+
+    /**
+     * 鍒嗛〉鍜屾帓搴忕殑瀵硅薄
+     */
+    private PageHelper pageHelper;
+
+    /**
+     * 鏌ヨ鐨勫瓧娈碉紝濡傛灉娌℃湁璁剧疆锛岄粯璁や负*
+     */
+    private Collection<String> clauseList;
+
+    /**
+     * 瑕佹煡璇㈢殑to绔殑涓氬姟绫诲瀷锛屼笉璁剧疆灏变細鏌ヨ鍏ㄩ儴
+     */
+    private String toBtmType;
+
+    /**
+     * 鏄惁鍙嶅悜锛宼rue琛ㄧず鏌ヨfrom绔殑淇℃伅
+     */
+    private boolean direction = false;
+
+    /**
+     * 鏄惁鏌ヨ鍏ㄩ儴锛宖alse琛ㄧず閫愮骇鏌ヨ
+     */
+    private boolean queryAllLevel = false;
+
+    /**
+     * 鏇挎崲鐨勫睘鎬т俊鎭�
+     */
+    private Map<String,String> replaceMap;
+
+    /**
+     * 鎸囧畾灞傜骇
+     */
+    private int level = 0 ;
+
+    public String getQueryTemplateName() {
+        return queryTemplateName;
+    }
+
+    public void setQueryTemplateName(String queryTemplateName) {
+        this.queryTemplateName = queryTemplateName;
+    }
+
+    public Map<String, String> getConditionMap() {
+        return conditionMap;
+    }
+
+    public void setConditionMap(Map<String, String> conditionMap) {
+        this.conditionMap = conditionMap;
+    }
+
+    public PageHelper getPageHelper() {
+        return pageHelper;
+    }
+
+    public void setPageHelper(PageHelper pageHelper) {
+        this.pageHelper = pageHelper;
+    }
+
+    public Collection<String> getClauseList() {
+        return clauseList;
+    }
+
+    public void setClauseList(Collection<String> clauseList) {
+        this.clauseList = clauseList;
+    }
+
+    public String getToBtmType() {
+        return toBtmType;
+    }
+
+    public void setToBtmType(String toBtmType) {
+        this.toBtmType = toBtmType;
+    }
+
+    public boolean isDirection() {
+        return direction;
+    }
+
+    public void setDirection(boolean direction) {
+        this.direction = direction;
+    }
+
+    public boolean isQueryAllLevel() {
+        return queryAllLevel;
+    }
+
+    public void setQueryAllLevel(boolean queryAllLevel) {
+        this.queryAllLevel = queryAllLevel;
+    }
+
+    public int getLevel() {
+        return level;
+    }
+
+    public void setLevel(int level) {
+        this.level = level;
+    }
+
+    public String getParentOid() {
+        return parentOid;
+    }
+
+    public void setParentOid(String parentOid) {
+        this.parentOid = parentOid;
+    }
+
+    public String getLinkType() {
+        return linkType;
+    }
+
+    public void setLinkType(String linkType) {
+        this.linkType = linkType;
+    }
+
+    public Map<String, String> getReplaceMap() {
+        return replaceMap;
+    }
+
+    public void setReplaceMap(Map<String, String> replaceMap) {
+        this.replaceMap = replaceMap;
+    }
+
+    @Override
+    public String toString() {
+        return "UILinkTypeDataQuery{" +
+                "queryTemplateName='" + queryTemplateName + '\'' +
+                ", linkType='" + linkType + '\'' +
+                ", parentOid='" + parentOid + '\'' +
+                ", conditionMap=" + conditionMap +
+                ", pageHelper=" + pageHelper +
+                ", clauseList=" + clauseList +
+                ", toBtmType='" + toBtmType + '\'' +
+                ", direction=" + direction +
+                ", queryAllLevel=" + queryAllLevel +
+                ", replaceMap=" + replaceMap +
+                ", level=" + level +
+                "} " + super.toString();
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/query/UITreeQuery.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/query/UITreeQuery.java
new file mode 100644
index 0000000..c4f6a3a
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/query/UITreeQuery.java
@@ -0,0 +1,163 @@
+package com.vci.web.query;
+
+import com.vci.starter.web.pagemodel.TreeQueryObject;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 鏍戠殑鏌ヨ
+ * @author weidy
+ * @date 2021/3-4
+ */
+public class UITreeQuery extends TreeQueryObject {
+
+    /**
+     * 涓氬姟绫诲瀷缂栧彿锛屽繀杈�
+     */
+    private String btmname;
+
+    /**
+     * UI涓婁笅鏂囩殑涓婚敭
+     */
+    private String uiDefineId;
+
+    /**
+     * 缁勪欢鐨勪富閿�
+     */
+    private String componentOid;
+
+    /**
+     * 鏍硅妭鐐圭殑琛ㄨ揪寮�
+     */
+    private String rootExpress;
+
+    /**
+     * 鏌ヨ妯℃澘
+     */
+    private String queryTemplate;
+
+    /**
+     * 鏄惁涓洪摼鎺ョ被鍨�
+     */
+    private boolean linkTypeFlag;
+
+    /**
+     * 涓氬姟绫诲瀷鎴栬�呴摼鎺ョ被鍨嬬殑鍚嶇О
+     */
+    private String toBtmType;
+
+    /**
+     * 鏄惁鏌ヨ鏍硅妭鐐�
+     */
+    private boolean queryRoot;
+
+    /**
+     * 鏉ユ簮鏁版嵁
+     */
+    private Map<String,String> sourceData = new HashMap<>();
+
+    /**
+     * 閫夋嫨鏁版嵁
+     */
+    private List<Map<String,String>> selectData = new ArrayList<>();
+
+    public Map<String, String> getSourceData() {
+        return sourceData;
+    }
+
+    public void setSourceData(Map<String, String> sourceData) {
+        this.sourceData = sourceData;
+    }
+
+    public List<Map<String, String>> getSelectData() {
+        return selectData;
+    }
+
+    public void setSelectData(List<Map<String, String>> selectData) {
+        this.selectData = selectData;
+    }
+
+
+    public String getBtmname() {
+        return btmname;
+    }
+
+    public void setBtmname(String btmname) {
+        this.btmname = btmname;
+    }
+
+    public String getUiDefineId() {
+        return uiDefineId;
+    }
+
+    public void setUiDefineId(String uiDefineId) {
+        this.uiDefineId = uiDefineId;
+    }
+
+    public String getComponentOid() {
+        return componentOid;
+    }
+
+    public void setComponentOid(String componentOid) {
+        this.componentOid = componentOid;
+    }
+
+    public String getRootExpress() {
+        return rootExpress;
+    }
+
+    public void setRootExpress(String rootExpress) {
+        this.rootExpress = rootExpress;
+    }
+
+    public String getQueryTemplate() {
+        return queryTemplate;
+    }
+
+    public void setQueryTemplate(String queryTemplate) {
+        this.queryTemplate = queryTemplate;
+    }
+
+    public boolean isLinkTypeFlag() {
+        return linkTypeFlag;
+    }
+
+    public void setLinkTypeFlag(boolean linkTypeFlag) {
+        this.linkTypeFlag = linkTypeFlag;
+    }
+
+    public String getToBtmType() {
+        return toBtmType;
+    }
+
+    public void setToBtmType(String toBtmType) {
+        this.toBtmType = toBtmType;
+    }
+
+    public boolean isQueryRoot() {
+        return queryRoot;
+    }
+
+    public void setQueryRoot(boolean queryRoot) {
+        this.queryRoot = queryRoot;
+    }
+
+    @Override
+    public String toString() {
+        return "UITreeQuery{" +
+                "btmname='" + btmname + '\'' +
+                ", uiDefineId='" + uiDefineId + '\'' +
+                ", componentOid='" + componentOid + '\'' +
+                ", rootExpress='" + rootExpress + '\'' +
+                ", queryTemplate='" + queryTemplate + '\'' +
+                ", linkTypeFlag=" + linkTypeFlag +
+                ", toBtmType='" + toBtmType + '\'' +
+                ", queryRoot=" + queryRoot +
+                ", sourceData=" + sourceData +
+                ", selectData=" + selectData +
+                "} " + super.toString();
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/query/UITreeRootQuery.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/query/UITreeRootQuery.java
new file mode 100644
index 0000000..4538023
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/query/UITreeRootQuery.java
@@ -0,0 +1,119 @@
+package com.vci.web.query;
+
+/**
+ * 鏍戠殑鏍硅妭鐐�
+ * @author weidy
+ * @date 2021/3/8
+ */
+public class UITreeRootQuery extends UIBaseQuery{
+
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = 3458887897345583879L;
+    /**
+     * 鏌ヨ妯℃澘
+     */
+    private String queryTemplate;
+
+    /**
+     * 鏄惁涓洪摼鎺ョ被鍨�
+     */
+    private boolean linkTypeFlag;
+
+    /**
+     * 涓氬姟绫诲瀷鎴栬�呴摼鎺ョ被鍨嬬殑鍚嶇О
+     */
+    private String btmType;
+
+    /**
+     * 鏍硅妭鐐圭殑琛ㄨ揪寮�
+     */
+    private String rootExpress;
+
+    /**
+     * 鍊肩殑瀛楁
+     */
+    private String valueField = "oid";
+
+    /**
+     * 鏌ヨ鐨勫��
+     */
+    private String rootQueryValue;
+
+    /**
+     * 鏌ヨ鐨勫瓧娈�
+     */
+    private String rootQueryField;
+
+
+
+    public String getRootQueryValue() {
+        return rootQueryValue;
+    }
+
+    public void setRootQueryValue(String rootQueryValue) {
+        this.rootQueryValue = rootQueryValue;
+    }
+
+    public String getRootQueryField() {
+        return rootQueryField;
+    }
+
+    public void setRootQueryField(String rootQueryField) {
+        this.rootQueryField = rootQueryField;
+    }
+
+    public String getRootExpress() {
+        return rootExpress;
+    }
+
+    public void setRootExpress(String rootExpress) {
+        this.rootExpress = rootExpress;
+    }
+
+    public String getValueField() {
+        return valueField;
+    }
+
+    public void setValueField(String valueField) {
+        this.valueField = valueField;
+    }
+
+    public String getQueryTemplate() {
+        return queryTemplate;
+    }
+
+    public void setQueryTemplate(String queryTemplate) {
+        this.queryTemplate = queryTemplate;
+    }
+
+    public boolean isLinkTypeFlag() {
+        return linkTypeFlag;
+    }
+
+    public void setLinkTypeFlag(boolean linkTypeFlag) {
+        this.linkTypeFlag = linkTypeFlag;
+    }
+
+    public String getBtmType() {
+        return btmType;
+    }
+
+    public void setBtmType(String btmType) {
+        this.btmType = btmType;
+    }
+
+    @Override
+    public String toString() {
+        return "UITreeRootQuery{" +
+                "queryTemplate='" + queryTemplate + '\'' +
+                ", linkTypeFlag=" + linkTypeFlag +
+                ", btmType='" + btmType + '\'' +
+                ", rootExpress='" + rootExpress + '\'' +
+                ", valueField='" + valueField + '\'' +
+                ", rootQueryValue='" + rootQueryValue + '\'' +
+                ", rootQueryField='" + rootQueryField + '\'' +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/redis/FastJson2JsonRedisSerializer.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/redis/FastJson2JsonRedisSerializer.java
new file mode 100644
index 0000000..2112c43
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/redis/FastJson2JsonRedisSerializer.java
@@ -0,0 +1,71 @@
+package com.vci.web.redis;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.type.TypeFactory;
+import org.springframework.data.redis.serializer.RedisSerializer;
+import org.springframework.data.redis.serializer.SerializationException;
+import com.alibaba.fastjson.parser.ParserConfig;
+import org.springframework.util.Assert;
+import java.nio.charset.Charset;
+
+/**
+ * Redis浣跨敤FastJson搴忓垪鍖�
+ * 
+ * @author wang1
+ */
+public class FastJson2JsonRedisSerializer<T> implements RedisSerializer<T>
+{
+    @SuppressWarnings("unused")
+    private ObjectMapper objectMapper = new ObjectMapper();
+
+    public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
+
+    private Class<T> clazz;
+
+    static
+    {
+        ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
+    }
+
+    public FastJson2JsonRedisSerializer(Class<T> clazz)
+    {
+        super();
+        this.clazz = clazz;
+    }
+
+    @Override
+    public byte[] serialize(T t) throws SerializationException
+    {
+        if (t == null)
+        {
+            return new byte[0];
+        }
+        return JSON.toJSONString(t, SerializerFeature.WriteClassName).getBytes(DEFAULT_CHARSET);
+    }
+
+    @Override
+    public T deserialize(byte[] bytes) throws SerializationException
+    {
+        if (bytes == null || bytes.length <= 0)
+        {
+            return null;
+        }
+        String str = new String(bytes, DEFAULT_CHARSET);
+
+        return JSON.parseObject(str, clazz);
+    }
+
+    public void setObjectMapper(ObjectMapper objectMapper)
+    {
+        Assert.notNull(objectMapper, "'objectMapper' must not be null");
+        this.objectMapper = objectMapper;
+    }
+
+    protected JavaType getJavaType(Class<?> clazz)
+    {
+        return TypeFactory.defaultInstance().constructType(clazz);
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/redis/RedisConfig.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/redis/RedisConfig.java
new file mode 100644
index 0000000..40b95ae
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/redis/RedisConfig.java
@@ -0,0 +1,51 @@
+package com.vci.web.redis;
+
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.cache.annotation.CachingConfigurerSupport;
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+
+/**
+ * redis閰嶇疆
+ *
+ * @author wang1
+ */
+@Configuration
+@ConditionalOnProperty(value = "spring.redis.enabled",havingValue = "true",matchIfMissing = false)
+@EnableCaching
+public class RedisConfig extends CachingConfigurerSupport
+{
+    @Bean
+    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
+        RedisTemplate<String, Object> template = new RedisTemplate<>();
+        // 杩炴帴宸ュ巶
+        template.setConnectionFactory(factory);
+        // 浣跨敤Jackson2JsonRedisSerializer
+        Jackson2JsonRedisSerializer<Object> jacksonSeial = new Jackson2JsonRedisSerializer<Object>(Object.class);
+        ObjectMapper om = new ObjectMapper();
+        // 鎸囧畾瑕佸簭鍒楀寲鐨勫煙
+        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
+        // 鎸囧畾搴忓垪鍖栬緭鍏ョ殑绫诲瀷
+        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
+        jacksonSeial.setObjectMapper(om);
+        // 鍊奸噰鐢╦son搴忓垪鍖�
+        template.setValueSerializer(jacksonSeial);
+        // 浣跨敤StringRedisSerializer
+        template.setKeySerializer(new StringRedisSerializer());
+        // 璁剧疆hash搴忓垪鍖栨ā寮�
+        template.setHashKeySerializer(new StringRedisSerializer());
+        template.setHashValueSerializer(jacksonSeial);
+        template.afterPropertiesSet();
+        return template;
+    }
+
+}
\ No newline at end of file
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/redis/RedisService.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/redis/RedisService.java
new file mode 100644
index 0000000..e7a5a8e
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/redis/RedisService.java
@@ -0,0 +1,307 @@
+package com.vci.web.redis;
+
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.BoundSetOperations;
+import org.springframework.data.redis.core.HashOperations;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.ValueOperations;
+import org.springframework.stereotype.Component;
+
+/**
+ * spring redis 宸ュ叿绫�
+ * 
+ * @author wang1
+ **/
+@SuppressWarnings(value = { "unchecked", "rawtypes" })
+@Component
+public class RedisService
+{
+    @Autowired(required = false)
+    public RedisTemplate redisTemplate;
+
+    /**
+     * 缂撳瓨鍩烘湰鐨勫璞★紝Integer銆丼tring銆佸疄浣撶被绛�
+     *
+     * @param key 缂撳瓨鐨勯敭鍊�
+     * @param value 缂撳瓨鐨勫��
+     */
+    public <T> void setCacheObject(final String key, final T value)
+    {
+        redisTemplate.opsForValue().set(key, value);
+    }
+
+    /**
+     * 缂撳瓨鍩烘湰鐨勫璞★紝Integer銆丼tring銆佸疄浣撶被绛�
+     *
+     * @param key 缂撳瓨鐨勯敭鍊�
+     * @param value 缂撳瓨鐨勫��
+     * @param timeout 鏃堕棿
+     * @param timeUnit 鏃堕棿棰楃矑搴�
+     */
+    public <T> void setCacheObject(final String key, final T value, final Long timeout, final TimeUnit timeUnit)
+    {
+        redisTemplate.opsForValue().set(key, value, timeout, timeUnit);
+    }
+
+    /**
+     * 璁剧疆鏈夋晥鏃堕棿
+     *
+     * @param key Redis閿�
+     * @param timeout 瓒呮椂鏃堕棿
+     * @return true=璁剧疆鎴愬姛锛沠alse=璁剧疆澶辫触
+     */
+    public boolean expire(final String key, final long timeout)
+    {
+        return expire(key, timeout, TimeUnit.SECONDS);
+    }
+
+    /**
+     * 璁剧疆鏈夋晥鏃堕棿
+     *
+     * @param key Redis閿�
+     * @param timeout 瓒呮椂鏃堕棿
+     * @param unit 鏃堕棿鍗曚綅
+     * @return true=璁剧疆鎴愬姛锛沠alse=璁剧疆澶辫触
+     */
+    public boolean expire(final String key, final long timeout, final TimeUnit unit)
+    {
+        return redisTemplate.expire(key, timeout, unit);
+    }
+
+    /**
+     * 鑾峰彇鏈夋晥鏃堕棿
+     *
+     * @param key Redis閿�
+     * @return 鏈夋晥鏃堕棿
+     */
+    public long getExpire(final String key)
+    {
+        return redisTemplate.getExpire(key);
+    }
+
+    /**
+     * 鍒ゆ柇 key鏄惁瀛樺湪
+     *
+     * @param key 閿�
+     * @return true 瀛樺湪 false涓嶅瓨鍦�
+     */
+    public Boolean hasKey(String key)
+    {
+        return redisTemplate.hasKey(key);
+    }
+
+    /**
+     * 鑾峰緱缂撳瓨鐨勫熀鏈璞°��
+     *
+     * @param key 缂撳瓨閿��
+     * @return 缂撳瓨閿�煎搴旂殑鏁版嵁
+     */
+    public <T> T getCacheObject(final String key)
+    {
+        ValueOperations<String, T> operation = redisTemplate.opsForValue();
+        return operation.get(key);
+    }
+
+    /**
+     * 鍒犻櫎鍗曚釜瀵硅薄
+     *
+     * @param key
+     */
+    public boolean deleteObject(final String key)
+    {
+        return redisTemplate.delete(key);
+    }
+
+    /**
+     * 鍒犻櫎闆嗗悎瀵硅薄
+     *
+     * @param collection 澶氫釜瀵硅薄
+     * @return
+     */
+    public long deleteObject(final Collection collection)
+    {
+        return redisTemplate.delete(collection);
+    }
+
+    /**
+     * list鐨勯暱搴�
+     *
+     * @param key 缂撳瓨鐨勯敭鍊�
+     * @return 缂撳瓨鐨勫璞�
+     */
+    public <T> Long listSize(final String key)
+    {
+        return redisTemplate.opsForList().size(key);
+    }
+
+    /**
+     * 浠庡乏杈瑰彇鍑轰竴涓猯ist鍏冪礌
+     *
+     * @param key 缂撳瓨鐨勯敭鍊�
+     * @return 缂撳瓨鐨勫璞�
+     */
+    public <T> Object leftPop(final String key)
+    {
+        return redisTemplate.opsForList().leftPop(key);
+    }
+
+    /**
+     * 浠庡彸杈圭紦瀛楲ist鏁版嵁
+     *
+     * @param key 缂撳瓨鐨勯敭鍊�
+     * @param dataList 寰呯紦瀛樼殑List鏁版嵁
+     * @return 缂撳瓨鐨勫璞�
+     */
+    public <T> long setCacheList(final String key, final List<T> dataList)
+    {
+        Long count = redisTemplate.opsForList().rightPushAll(key, dataList);
+        return count == null ? 0 : count;
+    }
+
+    /**
+     * 鍒犻櫎list涓厓绱爒alue
+     * @param key
+     * @param value
+     * @param <T>
+     * @return
+     */
+    public <T> long deleteCacheListByKeyAndValue(final String key, final T value)
+    {
+        Long count = redisTemplate.opsForList().remove(key,0,value);
+        return count == null ? 0 : count;
+    }
+
+    /**
+     * 鑾峰緱缂撳瓨鐨刲ist瀵硅薄
+     *
+     * @param key 缂撳瓨鐨勯敭鍊�
+     * @return 缂撳瓨閿�煎搴旂殑鏁版嵁
+     */
+    public <T> List<T> getCacheList(final String key)
+    {
+        return redisTemplate.opsForList().range(key, 0, -1);
+    }
+
+
+
+    /**
+     * 缂撳瓨Set
+     *
+     * @param key 缂撳瓨閿��
+     * @param dataSet 缂撳瓨鐨勬暟鎹�
+     * @return 缂撳瓨鏁版嵁鐨勫璞�
+     */
+    public <T> BoundSetOperations<String, T> setCacheSet(final String key, final Set<T> dataSet)
+    {
+        BoundSetOperations<String, T> setOperation = redisTemplate.boundSetOps(key);
+        Iterator<T> it = dataSet.iterator();
+        while (it.hasNext())
+        {
+            setOperation.add(it.next());
+        }
+        String i = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
+                "<Datas>\n" +
+                "\t<Data code=\"A1100012\" deptLevel=\"寮�鍙戦儴闂�#娴嬭瘯閮ㄩ棬\">\n" +
+                "\t\t<prop sName=\"渚涘簲鍟嗗悕绉癨" tName =\"渚涘簲鍟嗗悕绉�1\" >\n" +
+                "\t\t\t鍖椾含瀹忓崥杩滆揪绉戞妧鏈夐檺鍏徃2\n" +
+                "\t\t</prop>\n" +
+                "\t\t<prop sName=\"鎴峰ご\" tName =\"鎴峰ご1\">\n" +
+                "\t\t\t1111100012\n" +
+                "\t\t</prop>\n" +
+                "\t\t<prop sName=\"鑱旂郴浜篭" tName=\"鑱旂郴浜�1\">\n" +
+                "\t\t\t璋㈠啗2\n" +
+                "\t\t</prop>\n" +
+                "\t</Data>\n" +
+                "</Datas>";
+        return setOperation;
+    }
+
+    /**
+     * 鑾峰緱缂撳瓨鐨剆et
+     *
+     * @param key
+     * @return
+     */
+    public <T> Set<T> getCacheSet(final String key)
+    {
+        return redisTemplate.opsForSet().members(key);
+    }
+
+    /**
+     * 缂撳瓨Map
+     *
+     * @param key
+     * @param dataMap
+     */
+    public <T> void setCacheMap(final String key, final Map<String, T> dataMap)
+    {
+        if (dataMap != null) {
+            redisTemplate.opsForHash().putAll(key, dataMap);
+        }
+    }
+
+    /**
+     * 鑾峰緱缂撳瓨鐨凪ap
+     *
+     * @param key
+     * @return
+     */
+    public <T> Map<String, T> getCacheMap(final String key)
+    {
+        return redisTemplate.opsForHash().entries(key);
+    }
+
+    /**
+     * 寰�Hash涓瓨鍏ユ暟鎹�
+     *
+     * @param key Redis閿�
+     * @param hKey Hash閿�
+     * @param value 鍊�
+     */
+    public <T> void setCacheMapValue(final String key, final String hKey, final T value)
+    {
+        redisTemplate.opsForHash().put(key, hKey, value);
+    }
+
+    /**
+     * 鑾峰彇Hash涓殑鏁版嵁
+     *
+     * @param key Redis閿�
+     * @param hKey Hash閿�
+     * @return Hash涓殑瀵硅薄
+     */
+    public <T> T getCacheMapValue(final String key, final String hKey)
+    {
+        HashOperations<String, String, T> opsForHash = redisTemplate.opsForHash();
+        return opsForHash.get(key, hKey);
+    }
+
+    /**
+     * 鑾峰彇澶氫釜Hash涓殑鏁版嵁
+     *
+     * @param key Redis閿�
+     * @param hKeys Hash閿泦鍚�
+     * @return Hash瀵硅薄闆嗗悎
+     */
+    public <T> List<T> getMultiCacheMapValue(final String key, final Collection<Object> hKeys)
+    {
+        return redisTemplate.opsForHash().multiGet(key, hKeys);
+    }
+
+    /**
+     * 鑾峰緱缂撳瓨鐨勫熀鏈璞″垪琛�
+     * 
+     * @param pattern 瀛楃涓插墠缂�
+     * @return 瀵硅薄鍒楄〃
+     */
+    public Collection<String> keys(final String pattern)
+    {
+        return redisTemplate.keys(pattern);
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/BdSelectInputCharServiceI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/BdSelectInputCharServiceI.java
new file mode 100644
index 0000000..3d515da
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/BdSelectInputCharServiceI.java
@@ -0,0 +1,138 @@
+package com.vci.web.service;
+
+
+import com.vci.web.pageModel.BdSelectInputCharVO;
+import com.vci.web.dto.BdSelectInputCharDTO;
+import com.vci.web.model.BdSelectInputCharDO;
+import com.vci.web.dao.BdSelectInputCharDaoI;
+import com.vci.web.pageModel.KeyValue;
+import com.vci.web.service.BdSelectInputCharServiceI;
+    import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.*;
+import com.vci.starter.web.util.*;
+import com.vci.starter.web.wrapper.*;
+
+
+import java.util.*;
+
+import static com.vci.frameworkcore.constant.FrameWorkLangCodeConstant.*;
+/**
+ * 鍙緭鍙�夊唴瀹规湇鍔℃帴鍙�
+ *
+ * @author weidy
+ * @date 2022-03-09
+ */
+public interface BdSelectInputCharServiceI {
+    /**
+     * 鏌ヨ鎵�鏈夌殑鍙緭鍙�夊唴瀹�
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉鍜屾帓搴�
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 鏌ヨ鏉′欢鍜屽垎椤靛嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    DataGrid<BdSelectInputCharVO> gridBdSelectInputChar(Map<String, String> conditionMap, PageHelper pageHelper) throws VciBaseException;
+
+
+    /**
+     * 鎵归噺鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+     * @param bdSelectInputCharDOs 鏁版嵁瀵硅薄鍒楄〃
+     * @return 鏄剧ず瀵硅薄
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呬笉瀛樺湪鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    List<BdSelectInputCharVO> bdSelectInputCharDO2VOs(Collection<BdSelectInputCharDO>  bdSelectInputCharDOs) throws VciBaseException;
+
+    /**
+     * 鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+     * @param  bdSelectInputCharDO 鏁版嵁瀵硅薄
+     * @return 鏄剧ず瀵硅薄
+     * @throws VciBaseException 鎷疯礉灞炴�у嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    BdSelectInputCharVO bdSelectInputCharDO2VO(BdSelectInputCharDO bdSelectInputCharDO) throws VciBaseException;
+
+    /**
+     * 澧炲姞鍙緭鍙�夊唴瀹�
+     * @param bdSelectInputCharDTO 鍙緭鍙�夊唴瀹规暟鎹紶杈撳璞�
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屽敮涓�椤癸紝蹇呰緭椤逛笉閫氳繃鏃朵細鎶涘嚭寮傚父
+     */
+    BdSelectInputCharVO addSave(BdSelectInputCharDTO bdSelectInputCharDTO) throws VciBaseException;
+
+    /**
+     * 淇敼鍙緭鍙�夊唴瀹�
+     * @param bdSelectInputCharDTO 鍙緭鍙�夊唴瀹规暟鎹紶杈撳璞�
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屽敮涓�椤癸紝蹇呰緭椤逛笉閫氳繃鏃朵細鎶涘嚭寮傚父
+     */
+    BdSelectInputCharVO editSave(BdSelectInputCharDTO bdSelectInputCharDTO) throws VciBaseException;
+
+
+    /**
+     * 鍒犻櫎鍙緭鍙�夊唴瀹�
+     * @param bdSelectInputCharDTO 鍙緭鍙�夊唴瀹规暟鎹紶杈撳璞★紝oid鍜宼s闇�瑕佷紶杈�
+     * @return 鍒犻櫎缁撴灉鍙嶉锛氾細success锛氭垚鍔燂紝fail锛氬け璐�
+     * @throws VciBaseException 鍙傛暟涓虹┖锛岃寮曠敤鏃舵姏鍑哄紓甯�
+     */
+    BaseResult deleteBdSelectInputChar(BdSelectInputCharDTO bdSelectInputCharDTO) throws VciBaseException;
+
+    /**
+    * 涓婚敭鑾峰彇鍙緭鍙�夊唴瀹�
+    * @param oid 涓婚敭
+    * @return 鍙緭鍙�夊唴瀹规樉绀哄璞�
+    * @throws VciBaseException 鍙傛暟涓虹┖锛屾暟鎹笉瀛樺湪鏃朵細鎶涘嚭寮傚父
+    */
+    BdSelectInputCharVO getObjectByOid(String oid) throws VciBaseException;
+
+    /**
+     * 涓婚敭鎵归噺鑾峰彇鍙緭鍙�夊唴瀹�
+     * @param oidCollections 涓婚敭闆嗗悎锛屼絾鏄彈鎬ц兘褰卞搷锛屽缓璁竴娆℃煡璇笉瓒呰繃10000涓�
+     * @return 鍙緭鍙�夊唴瀹规樉绀哄璞�
+     * @throws VciBaseException 鏌ヨ鍑虹幇寮傚父鏃朵細鎶涘嚭
+     */
+    Collection<BdSelectInputCharVO> listBdSelectInputCharByOids(Collection<String> oidCollections) throws VciBaseException;
+
+
+
+    /**
+     * 鍙傜収鍙緭鍙�夊唴瀹瑰垪琛�
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉鍜屾帓搴�
+     * @return 鍙緭鍙�夊唴瀹规樉绀哄璞″垪琛紝鐢熸晥鐨勫唴瀹�
+     * @throws VciBaseException 鏌ヨ鏉′欢鍜屽垎椤靛嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+     DataGrid<BdSelectInputCharVO> refDataGridBdSelectInputChar(Map<String, String> conditionMap, PageHelper pageHelper) throws VciBaseException;
+
+    /**
+     * 鑾峰彇鍙�夋嫨鐨勫垪琛�
+     * @param flag 鏍囪
+     * @param namespace 鍛藉悕绌洪棿
+     * @return 鍖呭惈鐨勫唴瀹�
+     */
+    List<KeyValue> listByFlag(String namespace,String flag);
+
+    /**
+     * 瀛樺偍
+     * @param namespace 鍛藉悕绌洪棿
+     * @param flag 鏍囪瘑
+     * @param value 鍊�
+     * @param sessionInfo 浼氳瘽淇℃伅
+     */
+    void save(String namespace,String flag,String value,SessionInfo sessionInfo);
+
+    /**
+     * 鐩稿悓鍛藉悕绌洪棿鐨勫瓨鍌�
+     * @param namespace 鍛藉悕绌洪棿
+     * @param flagValueMap key鏄爣璇嗭紝value鏄��
+     * @param sessionInfo 浼氳瘽淇℃伅
+     */
+    void saveBySameNamespace(String namespace,Map<String/**flag**/,String/**鍊�**/> flagValueMap,SessionInfo sessionInfo);
+
+    /**
+     * 鐩稿悓鍛藉悕绌洪棿鍜岀浉鍚屾爣璇嗙殑瀛樺偍
+     * @param namespace 鍛藉悕绌洪棿
+     * @param flag 鏍囪
+     * @param values 鍊奸泦鍚�
+     * @param sessionInfo 浼氳瘽淇℃伅
+     */
+    void saveBySameNamespaceAndFlag(String namespace,String flag,Collection<String> values,SessionInfo sessionInfo);
+}
+
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/LoginServiceI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/LoginServiceI.java
new file mode 100644
index 0000000..95b9cac
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/LoginServiceI.java
@@ -0,0 +1,39 @@
+package com.vci.web.service;
+
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.RequestClientInfo;
+import com.vci.web.bo.LoginResultBO;
+import com.vci.web.dto.LoginUserDTO;
+
+/**
+ * 鐧诲綍鍜岄��鍑烘湇鍔�
+ * @author weidy
+ * @date 2020/1/29
+ */
+public interface LoginServiceI {
+
+    /**
+     * 鐧诲綍
+     * @param userDTO 鐧诲綍淇℃伅
+     * @param clientInfo 璇锋眰鐨勫鎴风鐨勪俊鎭�
+     * @return 鐧诲綍鐨勭粨鏋滃璞�
+     * @throws VciBaseException 鐧诲綍澶辫触鐨勬椂鍊欐姏鍑哄紓甯�
+     */
+    LoginResultBO login(LoginUserDTO userDTO, RequestClientInfo clientInfo) throws VciBaseException;
+
+    /**
+     * 鍗曠偣鐧诲綍
+     * @param userDTO 鐧诲綍淇℃伅
+     * @param clientInfo 璇锋眰鐨勫鎴风鐨勪俊鎭�
+     * @return 鐧诲綍鐨勭粨鏋滃璞�
+     * @throws VciBaseException 鐧诲綍澶辫触鐨勬椂鍊欐姏鍑哄紓甯�
+     */
+    LoginResultBO singleLogin(LoginUserDTO userDTO, RequestClientInfo clientInfo) throws VciBaseException;
+
+    /**
+     * 閫�鍑虹郴缁�
+     * @param userToken 鐢ㄦ埛鐨勮鍙爜
+     * @throws VciBaseException 鍒犻櫎浼氳瘽淇℃伅鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    void logout(String userToken) throws VciBaseException;
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/OsAttributeServiceI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/OsAttributeServiceI.java
new file mode 100644
index 0000000..43e2176
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/OsAttributeServiceI.java
@@ -0,0 +1,115 @@
+package com.vci.web.service;
+
+import com.vci.starter.web.pagemodel.BaseQueryObject;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.web.pageModel.OsAttributeVO;
+import com.vci.web.pageModel.OsUsedAttributeVO;
+import plm.corba.attribpool.AttribItem;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 灞炴�ф湇鍔�
+ * @author weidy
+ * @date 2021-2-15
+ */
+public interface OsAttributeServiceI extends OsBaseServiceI{
+	/**
+	 * 鑾峰彇榛樿鐨勫睘鎬�
+	 * @return 榛樿鐨勫睘鎬у垪琛�
+	 */
+	List<OsAttributeVO> getDefaultAttributeVOs();
+
+	/**
+	 * 璁剧疆榛樿鐨勫睘鎬�
+	 * @param defaultAttributeVOs 榛樿鐨勫睘鎬у垪琛�
+	 */
+	void setDefaultAttributeVOs(List<OsAttributeVO> defaultAttributeVOs);
+
+	/**
+	 * 鑾峰彇鐨勯粯璁ゅ睘鎬х殑鏄犲皠
+	 * @return 榛樿鐨勫睘鎬ф槧灏�
+	 */
+	Map<String, OsAttributeVO> getDefaultAttributeVOMap();
+	/**
+	 * 璁剧疆榛樿鐨勫睘鎬х殑鏄犲皠
+	 * @param defaultAttributeVOMap 榛樿鐨勫睘鎬ф槧灏�
+	 */
+	void setDefaultAttributeVOMap(Map<String, OsAttributeVO> defaultAttributeVOMap);
+
+	/**
+	 * 鏌ヨ鎵�鏈夌殑灞炴��
+	 * @return 灞炴�х殑鏄剧ず瀵硅薄
+	 */
+	List<OsAttributeVO> selectAllAttribute();
+
+	/**
+	 * 鏌ヨ鎵�鏈夌殑灞炴�ф槧灏�
+	 * @return key鏄睘鎬х殑鑻辨枃鍚嶇О灏忓啓锛寁alue鏄睘鎬х殑鏄剧ず瀵硅薄
+	 */
+	Map<String,OsAttributeVO> selectAllAttributeMap();
+
+	/**
+	 * 灞炴�х殑鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+	 * @param attribItems 鏁版嵁瀵硅薄
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	List<OsAttributeVO> attributeDO2VOs(Collection<AttribItem> attribItems);
+
+	/**
+	 * 灞炴�х殑鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+	 * @param attribItem 鏁版嵁瀵硅薄
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	OsAttributeVO attributeDO2VO(AttribItem attribItem);
+
+	/**
+	 * 灞炴�х殑鏄剧ず瀵硅薄杞崲涓烘暟鎹璞�
+	 * @param attributeVO 鏄剧ず瀵硅薄
+	 * @return 鏁版嵁瀵硅薄
+	 */
+	AttribItem attributeVO2DO(OsAttributeVO attributeVO);
+
+	/**
+	 * 浣跨敤灞炴�ц幏鍙栧璞�
+	 * @param attrCode 灞炴�х殑鑻辨枃鍚嶇О
+	 * @return 灞炴�х殑鏄剧ず瀵硅薄
+	 */
+	OsAttributeVO getAttr(String attrCode);
+
+	/**
+	 * 浣跨敤灞炴�х紪鍙疯幏鍙栧璞�--鎵归噺
+	 * @param attrCodes 灞炴�х殑鑻辨枃鍚嶇О
+	 * @return 灞炴�х殑鏄剧ず瀵硅薄
+	 */
+	List<OsAttributeVO> listAttrByIds(Collection<String> attrCodes);
+
+	/**
+	 * 鎵归噺娣诲姞灞炴��
+	 * @param attribItemList 灞炴�х殑鍒楄〃
+	 */
+	void batchAddAttribute(List<AttribItem> attribItemList);
+
+	/**
+	 * 鎵归噺缂栬緫灞炴��
+	 * @param editAttrList 灞炴�х殑鍒楄〃
+	 */
+	void batchEditAttribute(List<AttribItem> editAttrList);
+
+	/**
+	 * 灞炴�у垪琛�
+	 * @param baseQueryObject 鏌ヨ瀵硅薄
+	 * @return 灞炴�х殑鏄剧ず瀵硅薄
+	 */
+    DataGrid<OsAttributeVO> gridAttribute(BaseQueryObject baseQueryObject);
+
+
+	/**
+	 * 鏄惁榛樿鐨勫睘鎬�
+	 * @param attr 灞炴�х紪鍙�
+	 * @return true琛ㄧず鏄粯璁ゅ睘鎬�
+	 */
+	boolean isDefaultAttr(String attr);
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/OsBaseServiceI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/OsBaseServiceI.java
new file mode 100644
index 0000000..36854f2
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/OsBaseServiceI.java
@@ -0,0 +1,150 @@
+package com.vci.web.service;
+
+import com.vci.starter.web.pagemodel.BaseQueryObject;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.starter.web.util.ApplicationContextProvider;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.starter.web.wrapper.VciQueryWrapperForDO;
+import com.vci.web.model.OsLifeCycleDO;
+import com.vci.web.other.OsMapToObjFunction;
+import com.vci.web.pageModel.OsLifeCycleVO;
+import com.vci.web.util.WebUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.ss.formula.functions.T;
+import org.springframework.util.CollectionUtils;
+import plm.bs.bom.clientobject.ClientBusinessObject;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 瀵硅薄寤烘ā閮ㄥ垎鐨勫熀纭�鎺ュ彛
+ * @author weidy
+ */
+public interface OsBaseServiceI {
+
+    /**
+     * 娓呴櫎缂撳瓨
+     */
+    void clearCache();
+
+    /**
+     * 浣跨敤sql鏌ヨ骞冲彴寤烘ā閲岀殑鍐呭.娉ㄦ剰杩欎釜涓嶅寘鍚唴瀹�
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉
+     * @param tableName 琛ㄥ悕
+     * @param mapToObjFunction 瀵硅薄杞崲鐨勫嚱鏁�
+     * @return 涓氬姟绫诲瀷鍐呭
+     */
+    default <T> DataGrid<T> queryObjectServiceInfoBySql(Map<String, String> conditionMap, PageHelper pageHelper, String tableName, Class<T> doClass,OsMapToObjFunction<T> mapToObjFunction){
+        List<String> conditionSqlList = new ArrayList<String>();
+        if(!CollectionUtils.isEmpty(conditionMap)){
+            for(String key : conditionMap.keySet()){
+                String value = conditionMap.get(key);
+                if("id".equalsIgnoreCase(key) && !"".equalsIgnoreCase(value)){
+                    conditionSqlList.add(" name like '" + conditionMap.get(key).replace("*","%") + "' ");
+                }
+                if("name".equalsIgnoreCase(key) &&  !"".equalsIgnoreCase(value)){
+                    conditionSqlList.add(" label like '" + conditionMap.get(key).replace("*","%") + "' ");
+                }
+            }
+        }
+        String pageSql = "";
+        if(pageHelper!=null && pageHelper.getLimit()>-1){
+            pageSql = ") A where rownum < " + (pageHelper.getLimit()*pageHelper.getPage() + 1) + " ) where RN >= " + (pageHelper.getLimit()*(pageHelper.getPage()-1) + 1);
+        }
+        String whereSql = "";
+        if(!CollectionUtils.isEmpty(conditionSqlList)){
+            for(int i = 0 ; i < conditionSqlList.size() ; i++){
+                whereSql += conditionSqlList.get(i);
+                if(i != conditionSqlList.size()-1){
+                    whereSql += " and ";
+                }
+            }
+        }
+        String baseSql  = "select oid,to_char(ts,'yyyy-mm-dd hh24:mi:ss') as ts,creator,to_char(createTime,'yyyy-mm-dd hh24:mi:ss') as createTime,modifier,to_char(modifyTime,'yyyy-mm-dd hh24:mi:ss') as modifyTime,name,label," +
+                ("plenum".equalsIgnoreCase(tableName)?" '' as " :"") + "description from  " + tableName
+                + (StringUtils.isNotBlank(whereSql)?(" where " + whereSql):"");
+        baseSql += " order by lower(name) asc ";
+        String sql = (StringUtils.isNotBlank(pageSql)?" select oid,ts,creator,createTime,modifier,modifyTime,name,label,description  from (select A.* , rownum RN from (":"")
+                + baseSql+ pageSql ;
+        WebBoServiceI boService = ApplicationContextProvider.getApplicationContext().getBean(WebBoServiceI.class);
+        List<ClientBusinessObject> dataMap = boService.queryBySql(sql, null);
+        DataGrid<T> dataGrid = new DataGrid<>();
+        if(!CollectionUtils.isEmpty(dataMap)){
+            List<T> dataList = new ArrayList<>();
+            dataMap.stream().forEach(cbo -> {
+                T obj = null;
+                try {
+                    obj = doClass.newInstance();
+                } catch (InstantiationException e) {
+                    e.printStackTrace();
+                } catch (IllegalAccessException e) {
+                    e.printStackTrace();
+                }
+                Map<String/**cbo**/,String/**field**/> fieldMap = new HashMap<>();
+                fieldMap.put("oid","oid");
+                fieldMap.put("name","id");
+                fieldMap.put("label","name");
+                fieldMap.put("description","description");
+                fieldMap.put("creator","creator");
+                fieldMap.put("modifier","lastModifier");
+                fieldMap.put("createtime","createTime");
+                fieldMap.put("modifyTime","lastModifyTime");
+                fieldMap.put("ts","ts");
+                WebUtil.copyValueToObjectFromCbos(cbo,obj,fieldMap);
+                if(mapToObjFunction!=null) {
+                    mapToObjFunction.convert(cbo, obj);
+                }
+                dataList.add(obj);
+            });
+            dataGrid.setData(dataList);
+            List<Map> maps = boService.queryBySqlForMap("select count(oid) as total from plbtmtype " + (StringUtils.isNotBlank(whereSql)?(" where " + whereSql):""), null);
+            dataGrid.setTotal(VciBaseUtil.getInt(maps.get(0).get("total").toString()));
+        }
+        return dataGrid;
+    }
+
+    /**
+     * 鏌ヨ瀵硅薄寤烘ā閲岀殑鍒楄〃
+     * @param baseQueryObject 鍩虹鏌ヨ瀵硅薄锛屽寘鍚垎椤碉紝鎺掑簭锛屾煡璇㈡潯浠�
+     * @param tClass 鐩爣鐨勭被
+     * @param voMap 鏄剧ず瀵硅薄鐨勬槧灏�
+     * @param voClass 鏄剧ず瀵硅薄鐨勭被
+     * @return 鍒楄〃鐨勫唴瀹�
+     */
+    default DataGrid gridObject(BaseQueryObject baseQueryObject,Class<?> tClass,Map<String,?> voMap,Class<?> voClass){
+        if(baseQueryObject == null){
+            baseQueryObject = new BaseQueryObject();
+        }
+        PageHelper pageHelper = baseQueryObject.getPageHelper();
+        if (pageHelper == null) {
+            pageHelper = new PageHelper(-1);
+        }
+        //鏈夐渶瑕佽浆鎹㈢殑灞炴��
+        pageHelper.addDefaultAsc("name");
+        VciQueryWrapperForDO queryWrapperForDO = new VciQueryWrapperForDO(baseQueryObject.getConditionMap(), tClass,pageHelper);
+        queryWrapperForDO.setConditionMap(queryWrapperForDO.switchConditionMap());
+        queryWrapperForDO.wrapperSql();
+        WebBoServiceI boService = ApplicationContextProvider.getBean(WebBoServiceI.class);
+        List<?> doList = boService.selectByQueryWrapper(queryWrapperForDO,tClass);
+        DataGrid dataGrid=new DataGrid();
+        if (!CollectionUtils.isEmpty(doList)) {
+            List voList = new ArrayList<>();
+            doList.stream().forEach(obj->{
+                String id = VciBaseUtil.getStringValueFromObject(VciBaseUtil.getValueFromField("id", obj));
+                if(voMap.containsKey(id)){
+                    voList.add(voMap.get(id));
+                }
+            });
+            dataGrid.setData(voList);
+            dataGrid.setTotal(VciBaseUtil.getInt(String.valueOf(boService.countByQueryWrapper(queryWrapperForDO,tClass))));
+        }
+        return dataGrid;
+    }
+
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/OsBtmServiceI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/OsBtmServiceI.java
new file mode 100644
index 0000000..4d6b558
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/OsBtmServiceI.java
@@ -0,0 +1,125 @@
+package com.vci.web.service;
+
+import com.vci.starter.web.pagemodel.BaseResult;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.web.pageModel.*;
+import plm.corba.btm.BtmItem;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 涓氬姟绫诲瀷鏈嶅姟
+ * @author weidy
+ * @date 2021-2-15
+ */
+public interface OsBtmServiceI extends OsBaseServiceI{
+
+    /**
+     * 鏌ヨ鎵�鏈夌殑涓氬姟绫诲瀷
+     * @return 涓氬姟绫诲瀷瀵硅薄
+     */
+    List<OsBtmTypeVO> selectAllBtm();
+
+    /**
+     * 鏌ヨ鎵�鏈夌殑涓氬姟绫诲瀷鏄犲皠
+     * @return key 鏄笟鍔$殑鑻辨枃鍚嶇О鐨勫皬鍐�
+     */
+    Map<String,OsBtmTypeVO> selectAllBtmMap();
+
+    /**
+     * 鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+     * @param btmItems 鏁版嵁瀵硅薄
+     * @return 鏄剧ず瀵硅薄
+     */
+    List<OsBtmTypeVO> btmDO2VOs(Collection<BtmItem> btmItems);
+
+    /**
+     * 鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+     * @param btmItem 鏁版嵁瀵硅薄
+     * @return 鏄剧ず瀵硅薄
+     */
+    OsBtmTypeVO btmDO2VO(BtmItem btmItem);
+
+    /**
+     * 浣跨敤缂栧彿鑾峰彇涓氬姟绫诲瀷
+     * @param btmIds 缂栧彿
+     * @return 涓氬姟绫诲瀷
+     */
+    List<OsBtmTypeVO> listBtmByIds(Collection<String> btmIds);
+
+    /**
+     * 浣跨敤缂栧彿鑾峰彇涓氬姟绫诲瀷
+     * @param id 缂栧彿
+     * @return 涓氬姟绫诲瀷
+     */
+    OsBtmTypeVO getBtmById(String id);
+
+    /**
+     * 鑾峰彇涓氬姟绫诲瀷鐨勫湪鍝釜灞炴�т腑浣跨敤
+     * @param btmName 涓氬姟绫诲瀷
+     * @return 寮曠敤鐨勪俊鎭�
+     */
+    List<OsUsedAttributeVO> listBtmUsedInfo(String btmName);
+
+    /**
+     * 鑾峰彇涓氬姟绫诲瀷鐨勫湪鍝釜灞炴�т腑浣跨敤
+     *
+     * @param btmId 涓氬姟绫诲瀷
+     * @param hasLink 鏄惁鍖呭惈閾炬帴绫诲瀷涓�
+     * @return 寮曠敤鐨勪俊鎭�
+     */
+    List<OsUsedAttributeVO> listBtmUsedInfo(String btmId, boolean hasLink);
+
+    /**
+     * 鏍规嵁涓氬姟绫诲瀷鑾峰彇鍖呭惈鐨勫睘鎬�--涓嶅寘鍚熀纭�灞炴��
+     * @param btmId 涓氬姟绫诲瀷鐨勭紪鍙�
+     * @return 灞炴�х殑鍐呭
+     */
+    List<OsBtmTypeAttributeVO> listAttributeByBtmId(String btmId);
+
+    /**
+     * 鏍规嵁涓氬姟绫诲瀷鑾峰彇鍖呭惈鐨勫睘鎬�--鍖呭惈鍩虹灞炴��
+     * @param btmId 涓氬姟绫诲瀷鐨勭紪鍙�
+     * @return 灞炴�х殑鍐呭
+     */
+    List<OsBtmTypeAttributeVO> listAttributeByBtmIdHasDefault(String btmId);
+
+    /**
+     * 鍙傜収涓氬姟绫诲瀷
+     *
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param pageHelper   鍒嗛〉鐨勫璞�
+     * @return 涓氬姟绫诲瀷鐨勪俊鎭�
+     */
+    DataGrid<OsBtmTypeVO> referDataGrid(Map<String, String> conditionMap, PageHelper pageHelper);
+
+    /**
+     * 浣跨敤涓婚敭鏌ヨ
+     * @param oid 涓婚敭
+     * @return 涓氬姟绫诲瀷
+     */
+    OsBtmTypeVO selectByOid(String oid);
+
+    /**
+     * 浣跨敤缂栧彿鑾峰彇鏋氫妇鐨勫悕绉�
+     * @param id 鏋氫妇鐨勮嫳鏂�
+     * @return 鏋氫妇鐨勫悕绉�
+     */
+    String getNameById(String id);
+
+    /**
+     * 鏍规嵁涓氬姟绫诲瀷鍜岄摼鎺ョ被鍨嬬敓鎴怑R鍥�
+     * @param btmId 涓氬姟绫诲瀷涓婚敭
+     */
+    OsERVO createERDiagram(String btmId);
+
+
+     /**
+     * 鑾峰彇浣跨敤杩欎釜涓氬姟绫诲瀷鐨凟-R鍥�
+     * @param btmId 涓氬姟绫诲瀷缂栧彿
+     * @return 鎵ц缁撴灉
+     */
+    OsERVO createERUsed(String btmId);
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/OsCodeGenSchemaServiceI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/OsCodeGenSchemaServiceI.java
new file mode 100644
index 0000000..89bab70
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/OsCodeGenSchemaServiceI.java
@@ -0,0 +1,87 @@
+package com.vci.web.service;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.web.dto.OsCodeGenSchemaDTO;
+import com.vci.web.model.OsCodeGenSchemaDO;
+import com.vci.web.pageModel.OsCodeGenSchemaVO;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 浠g爜鐢熸垚鏂规鏈嶅姟
+ * @author weidy
+ */
+public interface OsCodeGenSchemaServiceI {
+
+    /**
+     * 浠g爜鐢熸垚鏂规鍒楄〃
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉瀵硅薄
+     * @return 鏂规鐨勬樉绀哄璞�
+     * @throws VciBaseException  鎵ц鍑洪敊鍙兘浼氭姏鍑哄紓甯�
+     */
+    DataGrid<OsCodeGenSchemaVO> gridSchema(Map<String, String> conditionMap, PageHelper pageHelper) throws VciBaseException;
+
+    /**
+     * 鏁版嵁瀵硅薄鍒楄〃杞负鏄剧ず瀵硅薄鍒楄〃
+     * @param schemaDOList 鏁版嵁瀵硅薄鍒楄〃
+     * @return 鏄剧ず瀵硅薄鍒楄〃
+     */
+    List<OsCodeGenSchemaVO> codeGenSchemaDO2VOs(List<OsCodeGenSchemaDO> schemaDOList);
+
+    /**
+     * 鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+     * @param schemaDO 鏁版嵁瀵硅薄
+     * @return 鏄剧ず瀵硅薄
+     */
+    OsCodeGenSchemaVO codeGenSchemaDO2VO(OsCodeGenSchemaDO schemaDO);
+
+    /**
+     * 娣诲姞浠g爜鐢熸垚鏂规
+     * @param codeGenSchemaDTO 鏂规鏁版嵁浼犺緭瀵硅薄
+     * @return 鏂规鏄剧ず瀵硅薄
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮墽琛屽嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    OsCodeGenSchemaVO addSchema(OsCodeGenSchemaDTO codeGenSchemaDTO) throws VciBaseException;
+
+    /**
+     * 淇敼浠g爜鐢熸垚鏂规
+     * @param codeGenSchemaDTO 鏂规鏁版嵁浼犺緭瀵硅薄
+     * @return 鏂规鏄剧ず瀵硅薄
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮墽琛屽嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    OsCodeGenSchemaVO editSchema(OsCodeGenSchemaDTO codeGenSchemaDTO) throws VciBaseException;
+
+    /**
+     * 鐢熸垚浠g爜鏂囦欢
+     * @param oid 鏂规鐨勪富閿�
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屾柟妗堜笉瀛樺湪浼氭姏鍑哄紓甯�
+     */
+    void productCodeFile(String oid) throws VciBaseException;
+
+    /**
+     * 棰勮浠g爜鏂囦欢
+     * @param oid 鏂规鐨勪富閿�
+     * @return key鏄枃浠剁被鍒紝value鏄枃浠剁殑鍐呭
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屾柟妗堜笉瀛樺湪浼氭姏鍑哄紓甯�
+     */
+    Map<String,String> previewCodeFile(String oid) throws VciBaseException;
+
+    /**
+     * 涓嬭浇浠g爜鏂囦欢
+     * @param oid 鏂规鐨勪富閿�
+     * @return zip鏂囦欢鐨勮矾寰�
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屾柟妗堜笉瀛樺湪浼氭姏鍑哄紓甯�
+     */
+    String downloadCodeFile(String oid) throws VciBaseException;
+
+    /**
+     * 鏍规嵁涓婚敭鑾峰彇鏄剧ず瀵硅薄
+     * @param oid 涓婚敭
+     * @return 鏂规鐨勬樉绀哄璞�
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屾柟妗堜笉瀛樺湪浼氭姏鍑哄紓甯�
+     */
+    OsCodeGenSchemaVO getObjectByOid(String oid) throws VciBaseException;
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/OsCodeRuleServiceI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/OsCodeRuleServiceI.java
new file mode 100644
index 0000000..b6d4944
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/OsCodeRuleServiceI.java
@@ -0,0 +1,150 @@
+package com.vci.web.service;
+
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.web.dto.OsCodeRuleDTO;
+import com.vci.web.dto.OsCodeRuleProduceDTO;
+import com.vci.web.model.OsCodeRuleDO;
+import com.vci.web.model.OsCodeRuleElementDO;
+import com.vci.web.pageModel.OsCodeResultVO;
+import com.vci.web.pageModel.OsCodeRuleElementVO;
+import com.vci.web.pageModel.OsCodeRuleVO;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 缂栫爜瑙勫垯鐨勬湇鍔℃帴鍙�
+ * @author weidy
+ * @date 2020/09/01
+ */
+public interface OsCodeRuleServiceI {
+
+    /**
+     * 浣跨敤缂栫爜瑙勫垯鐢熸垚缂栫爜
+     * @param codeRuleProduceDTO 缂栫爜鐢熸垚鎵�灞炴暟鎹紶杈撳璞★紝瑙勫垯缂栧彿浼樺厛绾уぇ浜庝富閿紝浼犻�掔殑鏁版嵁浼樺厛绾уぇ浜庝笟鍔℃暟鎹�
+     * @return 鐢熸垚鐨勭紪鐮佺殑鍊�
+     * @throws VciBaseException 鍙傛暟閿欒锛岃鍒欎笉瀛樺湪锛屾暟鎹笉鏀寔缂栫爜鐨勭敓鎴愮瓑浼氭姏鍑哄紓甯�
+     */
+    String produceCode(OsCodeRuleProduceDTO codeRuleProduceDTO) throws VciBaseException;
+
+    /**
+     * 鍒楄〃鏌ヨ
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉鐨勫璞�
+     * @return 鏁版嵁鏄剧ず瀵硅薄
+     */
+    DataGrid<OsCodeRuleVO> dataGrid(Map<String, String> conditionMap, PageHelper pageHelper);
+    /**
+     * 鏁版嵁瀵硅薄鎵归噺杞崲涓烘樉绀哄璞�
+     * @param ruleDOCollection 瑙勫垯鐨勬暟鎹璞�
+     * @return 瑙勫垯鐨勬樉绀哄璞�
+     */
+    List<OsCodeRuleVO> codeRuleDO2VOs(Collection<OsCodeRuleDO> ruleDOCollection);
+
+    /**
+     * 瑙勫垯鐨勫厓绱犵殑鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+     * @param elementDOCollection 鍏冪礌鐨勬暟鎹璞�
+     * @return 鍏冪礌鐨勬樉绀哄璞�
+     */
+    List<OsCodeRuleElementVO> codeRuleElementDO2VOs(Collection<OsCodeRuleElementDO> elementDOCollection);
+
+    /**
+     * 鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+     * @param ruleDO 瑙勫垯鐨勬暟鎹璞�
+     * @return 瑙勫垯鐨勬樉绀哄璞�
+     */
+    OsCodeRuleVO codeRuleDO2VO(OsCodeRuleDO ruleDO);
+
+    /**
+     * 鏄庣粏鐨勬暟鎹璞¤浆鎹负鏄剧ず瀵硅薄
+     * @param elementDO 鏄庣粏鐨勬暟鎹璞�
+     * @return 鏄剧ず瀵硅薄
+     */
+    OsCodeRuleElementVO codeRuleElementDO2VO(OsCodeRuleElementDO elementDO);
+
+    /**
+     * 鍒楄〃鐨勬槑缁嗘煡璇�
+     * @param pkRule 瑙勫垯鐨勪富閿�
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉鐨勫璞�
+     * @return 鏁版嵁鏄剧ず瀵硅薄
+     */
+    DataGrid<OsCodeRuleElementVO> dataGridElement(String pkRule, Map<String, String> conditionMap, PageHelper pageHelper);
+
+    /**
+     * 娣诲姞瑙勫垯
+     * @param ruleDTO 瑙勫垯鐨勬暟鎹紶杈撳璞★紝闇�瑕佸皢鏄庣粏涔熶紶閫�
+     * @return 鏄剧ず瀵硅薄
+     */
+    OsCodeRuleVO addRule(OsCodeRuleDTO ruleDTO);
+
+    /**
+     * 淇敼瑙勫垯
+     * @param ruleDTO 瑙勫垯鐨勬暟鎹紶杈撳璞★紝闇�瑕佸皢鏄庣粏涔熶紶閫�
+     * @return 鏄剧ず瀵硅薄
+     */
+    OsCodeRuleVO editRule(OsCodeRuleDTO ruleDTO);
+
+    /**
+     * 鍒犻櫎瑙勫垯锛屾湁娴佹按鍙风殑鏃跺�欎笉鑳藉垹闄�
+     * @param ruleDTO 瑙勫垯鐨勬暟鎹紶杈撳璞★紝蹇呴』鏈塼s鍜宱id
+     */
+    void deleteRule(OsCodeRuleDTO ruleDTO);
+
+    /**
+     * 鍋滅敤瑙勫垯
+     * @param ruleDTO 瑙勫垯鐨勬暟鎹紶杈撳璞★紝蹇呴』鏈塼s鍜宱id
+     */
+    void disableRule(OsCodeRuleDTO ruleDTO);
+
+    /**
+     * 鍚敤瑙勫垯
+     * @param ruleDTO 瑙勫垯鐨勬暟鎹紶杈撳璞★紝蹇呴』鏈塼s鍜宱id
+     */
+    void enableRule(OsCodeRuleDTO ruleDTO);
+
+    /**
+     * 浣跨敤缂栫爜瑙勫垯鐢熸垚缂栫爜
+     *
+     * @param codeRuleProduceDTO 缂栫爜鐢熸垚鎵�灞炴暟鎹紶杈撳璞★紝瑙勫垯缂栧彿浼樺厛绾уぇ浜庝富閿紝浼犻�掔殑鏁版嵁浼樺厛绾уぇ浜庝笟鍔℃暟鎹�
+     * @return 鐢熸垚鐨勭紪鐮佺殑鍊�
+     * @throws VciBaseException 鍙傛暟閿欒锛岃鍒欎笉瀛樺湪锛屾暟鎹笉鏀寔缂栫爜鐨勭敓鎴愮瓑浼氭姏鍑哄紓甯�
+     */
+    List<OsCodeResultVO> batchProduceCode(OsCodeRuleProduceDTO codeRuleProduceDTO, Integer needAddQuantity);
+
+    /**
+     * 鏄惁瀛樺湪缂栫爜瑙勫垯
+     * @param codeRuleProduceDTO 缂栫爜鐢熸垚鎵�灞炴暟鎹紶杈撳璞★紝瑙勫垯缂栧彿浼樺厛绾уぇ浜庝富閿紝浼犻�掔殑鏁版嵁浼樺厛绾уぇ浜庝笟鍔℃暟鎹�
+     * @return 鏄惁鍖呭惈
+     */
+    boolean existRule(OsCodeRuleProduceDTO codeRuleProduceDTO);
+
+    /**
+     * 涓婄Щ
+     * @param codeRuleElementOid 鍏冪礌鐨勪富閿�
+     */
+    void upIndex(String codeRuleElementOid);
+
+    /**
+     * 涓嬬Щ
+     * @param codeRuleElementOid 鍏冪礌鐨勪富閿�
+     */
+    void downIndex(String codeRuleElementOid);
+
+    /**
+     * 鑾峰彇娴佺▼渚濇嵁
+     * @param ruleDTO 鍒涘缓鍐呭鐨勬暟鎹紶杈撳璞�
+     * @return 娴佹按渚濇嵁
+     */
+    String getSerialUnit(OsCodeRuleProduceDTO ruleDTO);
+
+    /**
+     * 鏍规嵁浜у搧鍨嬪彿鏌ヨ缂栫爜瑙勫垯
+     * @param productmodel 浜у搧鍨嬪彿
+     * @return 缂栫爜瑙勫垯DO
+     */
+    OsCodeRuleDO selectById(String productmodel);
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/OsEnumServiceI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/OsEnumServiceI.java
new file mode 100644
index 0000000..9a7c1f1
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/OsEnumServiceI.java
@@ -0,0 +1,137 @@
+package com.vci.web.service;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.web.pageModel.KeyValue;
+import com.vci.web.pageModel.OsBtmTypeVO;
+import com.vci.web.pageModel.OsEnumItemVO;
+import com.vci.web.pageModel.OsEnumVO;
+import plm.corba.enumManager.EnumItem;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 鏋氫妇鏈嶅姟
+ * @author weidy
+ * @date 2021-2-14
+ */
+public interface OsEnumServiceI extends OsBaseServiceI{
+
+	/**
+	 * 鏍规嵁鏋氫妇鐨刱ey鑾峰彇鏋氫妇鐨勫璞�
+	 * @param enumCode 鏋氫妇鐨勭紪鍙�
+	 * @return 鏋氫妇鍖呭惈鐨勫��
+	 * @throws VciBaseException 鑾峰彇鏋氫妇鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+	 */
+	 List<KeyValue> getEnum(String enumCode) throws VciBaseException;
+
+	/**
+	 * 鏍规嵁鏋氫妇鐨勫�硷紝鑾峰彇瀵瑰簲鐨勬樉绀烘枃鏈�
+	 * @param enumCode 鏋氫妇鐨勭紪鍙�
+	 * @param enumKey 鏋氫妇鐨勫��
+	 * @return 鏋氫妇鐨勬枃鏈�
+	 * @throws VciBaseException 鑾峰彇鏋氫妇鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+	 */
+	 String getValue(String enumCode, String enumKey) throws VciBaseException;
+
+	/**
+	 * 鏍规嵁鏋氫妇鏄剧ず鏂囨湰鑾峰彇鏋氫妇鐨勫��
+	 * @param enumCode 鏋氫妇鐨勭紪鍙�
+	 * @param enumValue 鏋氫妇鐨勫��
+	 * @return 鏋氫妇鐨勬枃鏈�
+	 * @throws VciBaseException 鑾峰彇鏋氫妇鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+	 */
+	 String getKey(String enumCode, String enumValue) throws VciBaseException;
+
+	/**
+	 * 鑾峰彇鏋氫妇鐨勬槧灏�
+	 * @param enumCode 鏋氫妇鐨勭紪鍙�
+	 * @return 鏋氫妇鐨勫��
+	 * @throws VciBaseException 鑾峰彇鏋氫妇鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+	 */
+	Map<String,String> getEnumValueMap(String enumCode) throws VciBaseException;
+
+	/**
+	 * 鏌ヨ鎵�鏈夌殑鏋氫妇
+	 * @return 鏋氫妇鐨勬樉绀哄璞�
+	 */
+	List<OsEnumVO> selectAllEnum();
+
+	/**
+	 * 鏌ヨ鎵�鏈夌殑鏋氫妇鏄犲皠
+	 * @return key鏄灇涓剧殑鑻辨枃鍚嶇О
+	 */
+	Map<String,OsEnumVO> selectAllEnumMap();
+
+	/**
+	 * 鏋氫妇鐨勬暟鎹璞¤浆鎹负鏄剧ず瀵硅薄
+	 * @param enumItems 鏋氫妇鐨勫璞�
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	List<OsEnumVO> enumDO2VOs(Collection<EnumItem> enumItems);
+
+	/**
+	 * 鏋氫妇鐨勬暟鎹璞¤浆鎹负鏄剧ず瀵硅薄
+	 * @param enumItem 鏁版嵁瀵硅薄
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	OsEnumVO enumDO2VO(EnumItem enumItem);
+
+	/**
+	 * 鏋氫妇鏄庣粏杞崲涓篕V
+	 * @param enumItemVOS 鏋氫妇鏄庣粏鏄剧ず瀵硅薄
+	 * @return KV
+	 */
+	List<KeyValue> enumItem2KV(Collection<OsEnumItemVO> enumItemVOS);
+
+	/**
+	 * 鑾峰彇鏁版嵁鐨勫瘑绾э紝骞朵笖浼氱敤褰撳墠鐢ㄦ埛鐨勫瘑绾у啀鏍¢獙涓�涓�
+	 * @param oid 涓婚敭
+	 * @param btmname 涓氬姟绫诲瀷
+	 * @return 鏁版嵁鐨勫瘑绾�
+	 */
+	List<KeyValue> getDataEnum(String oid, String btmname);
+
+	/**
+	 * 鎵归噺娣诲姞鍐呭
+	 * @param enumItemList 鏋氫妇鐨勫唴瀹�
+	 */
+    void batchAddEnum(List<EnumItem> enumItemList);
+
+	/**
+	 * 鎵归噺淇敼鍐呭
+	 * @param enumItemList 鏋氫妇鐨勫唴瀹�
+	 */
+	void batchEditEnum(List<EnumItem> enumItemList);
+
+	/**
+	 * 浣跨敤缂栧彿鑾峰彇鏋氫妇鐨勫悕绉�
+	 * @param id 缂栧彿
+	 * @return 鏋氫妇鐨勪腑鏂囧悕绉�
+	 */
+    String getNameById(String id);
+
+	/**
+	 * 浣跨敤鏋氫妇鐨勮嫳鏂囧悕绉伴泦鍚堣幏鍙栧璞�
+	 * @param enumIdCollection 鑻辨枃鍚嶇О闆嗗悎锛屼笉鍖哄垎澶у皬鍐�
+	 * @return 鏋氫妇鐨勫璞�
+	 */
+	List<OsEnumVO> listEnumByIdCollection(Collection<String> enumIdCollection);
+
+	/**
+	 * 鍙傜収鏋氫妇鐨勪俊鎭�
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @param pageHelper 鍒嗛〉
+	 * @return 鏋氫妇鐨勪俊鎭�
+	 */
+    DataGrid<OsEnumVO> referDataGrid(Map<String, String> conditionMap, PageHelper pageHelper);
+
+	/**
+	 * 鏋氫妇閫夐」鍒楄〃
+	 * @param pkEnum 鏋氫妇鐨勪富閿�
+	 * @return 鏋氫妇閫夐」
+	 */
+	DataGrid<OsEnumItemVO> gridEnumItemByOid(String pkEnum);
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/OsLifeCycleServiceI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/OsLifeCycleServiceI.java
new file mode 100644
index 0000000..e8da723
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/OsLifeCycleServiceI.java
@@ -0,0 +1,190 @@
+package com.vci.web.service;
+
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.BaseQueryObject;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.web.pageModel.OsERVO;
+import com.vci.web.pageModel.OsLifeCycleLineVO;
+import com.vci.web.pageModel.OsLifeCycleVO;
+import com.vci.web.pageModel.OsStatusVO;
+import plm.bs.bom.clientobject.ClientBusinessObject;
+import plm.bs.bom.common.BusinessObject;
+import plm.corba.lifecycle.LifeCyle;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/***
+ * 鐢熷懡鍛ㄦ湡鏈嶅姟
+ * @author weidy
+ *
+ */
+public interface OsLifeCycleServiceI extends OsBaseServiceI{
+
+	
+	/***
+	 * 鑾峰彇鐢熷懡鍛ㄦ湡鐨勭姸鎬佸搴旂殑涓枃鍊�
+	 * @param status 鐘舵��
+	 * @return 鐘舵�佺殑鏄剧ず鍚嶇О
+	 * @throws VciBaseException 涓嶅瓨鍦ㄧ敓鍛藉懆鏈�
+	 */
+	 String getStatusText(String status) throws  VciBaseException;
+
+	 /**
+     * 璺冭縼鐢熷懡鍛ㄦ湡鐘舵�侊紝娉ㄦ剰璋冪敤姝ゆ柟娉曞氨浼氳鎸佷箙鍖栵紝涓嶅彈浜嬪姟鎺у埗
+     * @param bo 涓氬姟绫诲瀷鐨勬暟鎹璞�
+     * @param targetStatus 鐩爣鐨勭敓鍛藉懆鏈熺姸鎬侊紝涓嶅尯鍒嗗ぇ灏�
+     * @throws VciBaseException 濡傛灉鐩爣鐢熷懡鍛ㄦ湡鍜屽綋鍓嶇敓鍛藉懆鏈熺姸鎬佹病鏈夎繛鎺ョ嚎鏃舵姏鍑哄紓甯�
+     */
+    void transStatus(BusinessObject bo, String targetStatus) throws VciBaseException;
+    
+    /**
+     * 鎵归噺璺冭縼鐢熷懡鍛ㄦ湡鐘舵�侊紝杩欎簺鏁版嵁涓殑褰撳墠鐘舵�佸繀椤婚兘鏄竴鏍枫�傛垨鑰呮槸褰撳墠鐘舵�侀兘鍙互杩炴帴鍒扮洰鏍囩姸鎬�
+     * @param boList 涓氬姟绫诲瀷瀵硅薄鏁版嵁
+     * @param targetStatus 鐩爣鐘舵�侊紝涓嶅尯鍒嗗ぇ灏忓啓
+     * @throws VciBaseException 杞崲鐢熷懡鍛ㄦ湡鍑洪敊鐨勬椂鍊欐姏鍑哄紓甯�
+     */
+    void transStatus(List<BusinessObject> boList, String targetStatus) throws VciBaseException;
+    
+    /**
+     * 鎵归噺璺冭縼鐢熷懡鍛ㄦ湡鐘舵�侊紝杩欎簺鏁版嵁涓殑褰撳墠鐘舵�佸繀椤婚兘鏄竴鏍凤紝鎴栬�呮槸褰撳墠鐘舵�侀兘鍙互杩炴帴鍒扮洰鏍囩姸鎬�
+     * @param bos 涓氬姟绫诲瀷瀵硅薄鏁版嵁
+     * @param targetStatus  鐩爣鐘舵�侊紝涓嶅尯鍒嗗ぇ灏忓啓
+     * @throws VciBaseException 杞崲鐢熷懡鍛ㄦ湡鍑洪敊鐨勬椂鍊欐姏鍑哄紓甯�
+     */
+    void transStatus(BusinessObject[] bos, String targetStatus) throws VciBaseException;
+    
+    /**
+     * 鎵归噺璺冭縼鐢熷懡鍛ㄦ湡鐘舵�侊紝杩欎簺鏁版嵁涓殑褰撳墠鐘舵�佸繀椤婚兘鏄竴鏍凤紝鎴栬�呮槸褰撳墠鐘舵�侀兘鍙互杩炴帴鍒扮洰鏍囩姸鎬�
+     * @param cboList 涓氬姟绫诲瀷瀵硅薄鏁版嵁
+     * @param targetStatus  鐩爣鐘舵�侊紝涓嶅尯鍒嗗ぇ灏忓啓
+     * @throws VciBaseException 杞崲鐢熷懡鍛ㄦ湡鍑洪敊鐨勬椂鍊欐姏鍑哄紓甯�
+     */
+    void transCboStatus(List<ClientBusinessObject> cboList, String targetStatus) throws VciBaseException;
+
+    /**
+     * 閫氳繃缂栧彿鑾峰彇鐢熷懡鍛ㄦ湡鐘舵�佸璞★紝
+     * @param lctId 鐢熷懡鍛ㄦ湡缂栧彿
+     * @return 鐢熷懡鍛ㄦ湡鐨勬樉绀哄璞�
+     */
+    OsLifeCycleVO getLifeCycleById(String lctId) ;
+    /**
+     * 鐢熷懡鍛ㄦ湡鐨勬暟鎹璞¤浆鎹负鏄剧ず瀵硅薄
+     * @param lifeCycles 鏁版嵁瀵硅薄
+     * @return 鏄剧ず瀵硅薄
+     */
+    List<OsLifeCycleVO> lifeCycleDO2VOs(Collection<LifeCyle> lifeCycles);
+
+    /**
+     * 鐢熷懡鍛ㄦ湡鐨勬暟鎹璞¤浆鎹负鏄剧ず瀵硅薄
+     * @param lifeCyle 鏁版嵁瀵硅薄
+     * @return 鏄剧ず瀵硅薄
+     */
+    OsLifeCycleVO lifeCycleDO2VO(LifeCyle lifeCyle);
+
+    /**
+     * 鐢熷懡鍛ㄦ湡鏄剧ず瀵硅薄杞崲涓烘暟鎹璞�
+     * @param lifeCycleVO 鏄剧ず瀵硅薄
+     * @return 鏁版嵁瀵硅薄
+     */
+    LifeCyle lifeCycleVO2DO(OsLifeCycleVO lifeCycleVO);
+
+    /**
+     * 鏌ヨ鎵�鏈夌敓鍛藉懆鏈熺姸鎬�
+     * @return 鐢熷懡鍛ㄦ湡鐘舵�佺殑瀵硅薄
+     * @throws VciBaseException 鏌ヨ鐨勬椂鍊欏嚭閿欎細鎶涘嚭寮傚父
+     */
+    List<OsLifeCycleVO> selectAllLifeCycle() throws VciBaseException;
+
+    /**
+     * 鏌ヨ鎵�鏈夌敓鍛藉懆鏈熺姸鎬佺殑鏄犲皠
+     * @return key 鏄敓鍛藉懆鏈熺殑缂栧彿鐨勮嫳鏂囧皬鍐�
+     * @throws VciBaseException 鏌ヨ鐨勬椂鍊欏嚭閿欎細鎶涘嚭寮傚父
+     */
+    Map<String,OsLifeCycleVO> selectAllLifeCycleMap() throws VciBaseException;
+
+    /**
+     * 鑾峰彇杩炴帴绾�
+     * @param lcid 鐢熷懡鍛ㄦ湡鐨勭紪鍙�
+     * @param currentStatus 褰撳墠鐨勭姸鎬�
+     * @param targetStatus 鐩爣鐨勭姸鎬�
+     * @return 杩炴帴绾�
+     * @throws VciBaseException 璇诲彇鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    OsLifeCycleLineVO getTransVO(String lcid, String currentStatus, String targetStatus) throws VciBaseException;
+
+    /**
+     * 璺冭縼涓氬姟绫诲瀷鐨勭敓鍛藉懆鏈熺姸鎬�
+     * @param obj 涓氬姟绫诲瀷鏁版嵁瀵硅薄
+     * @param lineVO 璺冭縼璺敱
+     * @throws VciBaseException 璺冭縼鍑洪敊鐨勬槸浼氭姏鍑哄紓甯�
+     */
+    void doTransVO(BusinessObject obj, OsLifeCycleLineVO lineVO) throws VciBaseException;
+
+    /**
+     * 鎵归噺鎵ц璺冭縼鎿嶄綔锛岃姹傚繀椤绘槸鍚屼竴涓笟鍔$被鍨嬩笅鐨�
+     * @param bos 涓氬姟绫诲瀷鏁版嵁瀵硅薄
+     * @param lineVOs 璺冭縼瀵硅薄
+     * @param releaseStatus 鍙戝竷鐘舵�侊紝濡傛灉鐩爣鐘舵�佹槸鍙戝竷鐘舵�佹椂浼犻�掕繖涓��
+     * @throws VciBaseException  璺冭縼鍑洪敊鐨勬槸浼氭姏鍑哄紓甯�
+     */
+    void batchTransVo(BusinessObject[] bos, OsLifeCycleLineVO[] lineVOs,
+                      String[] releaseStatus) throws VciBaseException;
+
+    /**
+     * 鎵归噺鎵ц璺冭縼鎿嶄綔
+     * @param bos 涓氬姟绫诲瀷鏁版嵁
+     * @param vos 璺冭縼瀵硅薄
+     * @throws VciBaseException 璺冭縼鍑洪敊鐨勬槸浼氭姏鍑哄紓甯�
+     */
+    void batchTransVo(BusinessObject[] bos, OsLifeCycleLineVO[] vos)
+            throws VciBaseException;
+
+    /**
+     * 浣跨敤鐢熷懡鍛ㄦ湡鐨勭紪鍙疯幏鍙栧寘鍚殑鐘舵�佹樉绀哄璞�
+     * @param lifeCycleId 鐢熷懡鍛ㄦ湡鐨勭紪鍙�
+     * @return 鐘舵�佺殑鏄剧ず瀵硅薄
+     */
+    List<OsStatusVO> listStatusById(String lifeCycleId);
+
+    /**
+     * 鎵归噺娣诲姞鐢熷懡鍛ㄦ湡
+     * @param lifeCyleList 鐢熷懡鍛ㄦ湡鐨勫唴瀹�
+     */
+    void batchAddLifeCycle(List<LifeCyle> lifeCyleList);
+
+    /**
+     * 鎵归噺淇敼鐢熷懡鍛ㄦ湡
+     * @param lifeCycleList 鐢熷懡鍛ㄦ湡鐨勫唴瀹�
+     */
+    void batchEditLifeCycle(List<LifeCyle> lifeCycleList);
+
+    /**
+     * 鐘舵�佸湪鐢熷懡鍛ㄦ湡涓娇鐢ㄧ殑鍕ゅ揩
+     * @param statusOid 鐘舵�佺殑涓婚敭
+     * @return 鐢熷懡鍛ㄦ湡鐨勪俊鎭�
+     */
+    DataGrid<OsLifeCycleVO> listStatusUsed(String statusOid);
+
+    /**
+     * 鍒ゆ柇鐘舵�佹槸鍚﹁寮曠敤
+     * @param statusVO 鐘舵�佺殑鏄剧ず瀵硅薄
+     * @return true琛ㄧず琚紩鐢�
+     */
+    boolean checkStatusUsed(OsStatusVO statusVO);
+
+    /**
+     * 鐢熷懡鍛ㄦ湡鍒楄〃
+     * @param baseQueryObject 鏌ヨ瀵硅薄锛屽垎椤靛璞�
+     * @return 鐢熷懡鍛ㄦ湡鏄剧ず瀵硅薄
+     */
+    DataGrid<OsLifeCycleVO> gridLifeCycle(BaseQueryObject baseQueryObject);
+
+    /**
+     * 鐢熷懡鍛ㄦ湡鐨勯摼鎺ョ嚎
+     * @param id 缂栧彿
+     * @return ER鍥惧唴瀹�
+     */
+    OsERVO listLinesPic(String id);
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/OsLinkTypeServiceI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/OsLinkTypeServiceI.java
new file mode 100644
index 0000000..e499467
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/OsLinkTypeServiceI.java
@@ -0,0 +1,89 @@
+package com.vci.web.service;
+
+import com.vci.starter.web.pagemodel.BaseQueryObject;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.web.pageModel.OsAttributeVO;
+import com.vci.web.pageModel.OsBtmTypeAttributeVO;
+import com.vci.web.pageModel.OsLinkTypeAttributeVO;
+import com.vci.web.pageModel.OsLinkTypeVO;
+import plm.corba.linkTypeManager.LinkType;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 閾炬帴绫诲瀷鏈嶅姟
+ * @author weidy
+ * @date 2021-2-15
+ */
+public interface OsLinkTypeServiceI extends OsBaseServiceI{
+
+    /**
+     * 鏌ヨ鎵�鏈夌殑閾炬帴绫诲瀷
+     * @return 閾炬帴绫诲瀷瀵硅薄
+     */
+    List<OsLinkTypeVO> selectAllLink();
+
+    /**
+     * 鏌ヨ鎵�鏈夌殑閾炬帴绫诲瀷鏄犲皠
+     * @return key 鏄摼鎺ョ殑鑻辨枃鍚嶇О鐨勫皬鍐�
+     */
+    Map<String,OsLinkTypeVO> selectAllLinkMap();
+
+    /**
+     * 鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+     * @param linkTypes 鏁版嵁瀵硅薄
+     * @return 鏄剧ず瀵硅薄
+     */
+    List<OsLinkTypeVO> linkTypeDO2VOs(Collection<LinkType> linkTypes);
+
+    /**
+     * 鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+     * @param linkType 鏁版嵁瀵硅薄
+     * @return 鏄剧ず瀵硅薄
+     */
+    OsLinkTypeVO linkTypeDO2VO(LinkType linkType);
+
+    /**
+     * 浣跨敤缂栧彿鑾峰彇閾炬帴绫诲瀷
+     * @param linkIds 缂栧彿
+     * @return 閾炬帴绫诲瀷
+     */
+    List<OsLinkTypeVO> listLinkTypeIds(Collection<String> linkIds);
+
+    /**
+     * 浣跨敤缂栧彿鑾峰彇閾炬帴绫诲瀷
+     * @param id 缂栧彿
+     * @return 閾炬帴绫诲瀷
+     */
+    OsLinkTypeVO getLinkTypeById(String id);
+
+    /**
+     * 鑾峰彇閾炬帴绫诲瀷鐨勫睘鎬�
+     * @param linkTypeId 閾炬帴绫诲瀷鐨勭紪鍙�
+     * @return 閾炬帴绫诲瀷鐨勫睘鎬�
+     */
+    List<OsLinkTypeAttributeVO> listAttributeByLinkId(String linkTypeId);
+
+    /**
+     * 閾炬帴绫诲瀷鐨勫垪琛�
+     * @param baseQueryObject 鏌ヨ瀵硅薄
+     * @return 閾炬帴绫诲瀷鐨勬樉绀哄璞�
+     */
+    DataGrid<OsLinkTypeVO> gridLinkType(BaseQueryObject baseQueryObject);
+
+    /**
+     * 浣跨敤涓婚敭鑾峰彇鏄剧ず瀵硅薄
+     * @param linkTypeOid 閾炬帴绫诲瀷鐨勪富閿�
+     * @return 閾炬帴绫诲瀷鐨勬樉绀哄璞�
+     */
+    OsLinkTypeVO selectByOid(String linkTypeOid);
+
+    /**
+     * 鑾峰彇閾炬帴绫诲瀷鍏宠仈鐨勬墍鏈変笟鍔$被鍨嬩腑灞炴�х被鍨嬪樊寮傜殑淇℃伅
+     * @param linkTypeOid 閾炬帴绫诲瀷鐨勪富閿�
+     * @return 鏈夐敊璇殑灞炴��
+     */
+    List<OsBtmTypeAttributeVO> checkAttributeTypeDifferent(String linkTypeOid);
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/OsRevisionRuleServiceI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/OsRevisionRuleServiceI.java
new file mode 100644
index 0000000..15c30f5
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/OsRevisionRuleServiceI.java
@@ -0,0 +1,49 @@
+package com.vci.web.service;
+
+import com.vci.web.pageModel.OsRevisionRuleVO;
+import plm.corba.versionRuleManager.VersionRule;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 鐗堟湰瑙勫垯鏈嶅姟
+ * @author weidy
+ * @date 2021-2-15
+ */
+public interface OsRevisionRuleServiceI extends OsBaseServiceI{
+
+    /**
+     * 鏌ヨ鎵�鏈夌殑鐗堟湰瑙勫垯
+     * @return 鐗堟湰瀵硅薄
+     */
+    List<OsRevisionRuleVO> selectAllRevision();
+
+    /**
+     * 鏌ヨ鎵�鏈夌殑鐗堟湰瑙勫垯鏄犲皠
+     * @return key 鏄増鏈殑鑻辨枃鍚嶇О
+     */
+    Map<String,OsRevisionRuleVO> selectAllRevisionMap();
+
+    /**
+     * 鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+     * @param versionRules 鏁版嵁瀵硅薄
+     * @return 鏄剧ず瀵硅薄
+     */
+    List<OsRevisionRuleVO> revisionRuleDO2VOs(Collection<VersionRule> versionRules);
+
+    /**
+     * 鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+     * @param versionRule 鏁版嵁瀵硅薄
+     * @return 鏄剧ず瀵硅薄
+     */
+    OsRevisionRuleVO revisionRuleDO2VO(VersionRule versionRule);
+
+    /**
+     * 浣跨敤缂栧彿鑾峰彇瑙勫垯鐨勫��
+     * @param id 缂栧彿
+     * @return 鏄剧ず瀵硅薄
+     */
+    OsRevisionRuleVO getRevisionRuleById(String id);
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/OsStatusServiceI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/OsStatusServiceI.java
new file mode 100644
index 0000000..1d7d9fe
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/OsStatusServiceI.java
@@ -0,0 +1,112 @@
+package com.vci.web.service;
+
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.web.dto.OsStatusDTO;
+import com.vci.web.pageModel.OsLifeCycleVO;
+import com.vci.web.pageModel.OsStatusVO;
+import plm.corba.statePoolManager.StatePool;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 鐘舵�佺殑鏈嶅姟
+ * @author weidy
+ * @date 2021-2-14
+ */
+public interface OsStatusServiceI extends OsBaseServiceI{
+
+    /**
+     * 鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+     * @param statePool 鐘舵�佹睜鐨勬暟鎹璞�
+     * @return 鏄剧ず瀵硅薄
+     */
+    OsStatusVO statusDO2VO(StatePool statePool);
+
+    /**
+     * 鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+     * @param statePools 鐘舵�佹睜鐨勬暟鎹璞� 闆嗗悎
+     * @return 鏄剧ず瀵硅薄
+     */
+    List<OsStatusVO> statusDO2VOs(Collection<StatePool> statePools);
+
+    /**
+     * 鏌ヨ鎵�鏈夌殑鐘舵��
+     * @return 鐘舵�佺殑鏄剧ず瀵硅薄
+     */
+    List<OsStatusVO> selectAllStatus();
+
+    /**
+     * 鏌ヨ鍏ㄩ儴鐨勭姸鎬佹槧灏�
+     * @return key鏄姸鎬佺殑鑻辨枃鍚嶇О
+     */
+    Map<String,OsStatusVO> selectAllStatusMap();
+
+    /**
+     * 鐘舵�佽浆鎹负鏄剧ず鏂囨湰
+     * @param status 鐘舵��
+     * @return 鏄剧ず鏂囨湰
+     */
+    String getStatusTextByValue(String status);
+
+    /**
+     * 鎵归噺娣诲姞鐘舵��
+     * @param statePoolList 鐘舵�佸唴瀹�
+     */
+    void batchAddStatus(List<StatePool> statePoolList);
+
+    /**
+     * 鎵归噺淇敼鐘舵��
+     * @param statePoolList 鐘舵�佸唴瀹�
+     */
+    void batchEditSave(List<StatePool> statePoolList);
+
+    /**
+     * 鐘舵�佸垪琛�
+     * @param conditionMap 鏌ヨ瀵硅薄
+     * @param pageHelper 鍒嗛〉鍒楄〃
+     * @return 鏄剧ず瀵硅薄
+     */
+    DataGrid<OsStatusVO> gridStatus(Map<String, String> conditionMap, PageHelper pageHelper);
+
+    /**
+     * 浣跨敤涓婚敭鑾峰彇鏄剧ず瀵硅薄
+     * @param oid 涓婚敭
+     * @return 鐘舵�佺殑鏄剧ず瀵硅薄
+     */
+    OsStatusVO getObjectByOid(String oid);
+
+    /**
+     * 浣跨敤涓婚敭闆嗗悎鏌ヨ
+     * @param oidCollection 涓婚敭闆嗗悎
+     * @return 鐘舵�佺殑鍐呭
+     */
+    List<OsStatusVO> selectByOidCollection(Collection<String> oidCollection);
+
+    /**
+     * 娣诲姞鐘舵��
+     * @param statusDTO 鐘舵�佺殑鏁版嵁浼犺緭瀵硅薄
+     */
+    void addSave(OsStatusDTO statusDTO);
+
+    /**
+     * 缂栬緫鐘舵��
+     * @param statusDTO 鐘舵�佺殑鏁版嵁浼犺緭瀵硅薄
+     */
+    void editSave(OsStatusDTO statusDTO);
+
+    /**
+     * 鍒犻櫎鐘舵��
+     * @param oids 涓婚敭
+     */
+    void delete(String oids);
+
+    /**
+     * 鐘舵�佺殑鏁版嵁浼犺緭瀵硅薄杞崲涓烘暟鎹璞�
+     * @param statusDTO 鏁版嵁浼犺緭瀵硅薄
+     * @return 骞冲彴鐨勬暟鎹璞�
+     */
+    StatePool statusDTO2DO(OsStatusDTO statusDTO);
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/SmFavFunctionServiceI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/SmFavFunctionServiceI.java
new file mode 100644
index 0000000..395621e
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/SmFavFunctionServiceI.java
@@ -0,0 +1,35 @@
+package com.vci.web.service;
+
+import com.vci.frameworkcore.pagemodel.SmFunctionVO;
+import com.vci.starter.web.exception.VciBaseException;
+
+import java.util.List;
+
+/**
+ * 鏀惰棌鍔熻兘鏈嶅姟
+ * @author weidy
+ * @date 2020/7/12
+ */
+public interface SmFavFunctionServiceI {
+
+    /**
+     * 娣诲姞鏀惰棌
+     * @param functionId 鍔熻兘缂栧彿
+     * @throws VciBaseException 鍙傛暟涓虹┖浼氭姏鍑哄紓甯�
+     */
+    void addFav(String functionId) throws VciBaseException;
+
+    /**
+     * 绉婚櫎鏀惰棌
+     * @param functionId 鍔熻兘缂栧彿
+     * @throws VciBaseException 鍙傛暟涓虹┖浼氭姏鍑哄紓甯�
+     */
+    void removeFav(String functionId) throws VciBaseException;
+
+    /**
+     * 鑾峰彇褰撳墠鐢ㄦ埛鐨勬敹钘忓姛鑳�
+     * @return 鍔熻兘鐨勬樉绀哄璞�
+     * @throws VciBaseException 鏌ヨ鍑洪敊浼氭姏鍑哄紓甯�
+     */
+    List<SmFunctionVO> listFavFunction() throws VciBaseException;
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/SmOperationServiceI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/SmOperationServiceI.java
new file mode 100644
index 0000000..6cb448c
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/SmOperationServiceI.java
@@ -0,0 +1,20 @@
+package com.vci.web.service;
+
+import com.vci.web.pageModel.SmOperationVO;
+
+import java.util.List;
+
+/**
+ * 鍔熻兘鎿嶄綔鐨勬湇鍔�
+ * @author weidy
+ * @date 2022-2-23
+ */
+public interface SmOperationServiceI {
+
+    /**
+     * 浣跨敤鑿滃崟鐨勭紪鍙疯幏鍙栨寜閽殑鍐呭
+     * @param functionId 鍔熻兘鐨勭紪鍙�
+     * @return 鎿嶄綔鐨勪俊鎭�
+     */
+    List<SmOperationVO> listButtonByFunctionId(String functionId);
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/UIDataServiceI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/UIDataServiceI.java
new file mode 100644
index 0000000..5022151
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/UIDataServiceI.java
@@ -0,0 +1,252 @@
+package com.vci.web.service;
+
+import com.vci.starter.web.enumpck.VciChangeDocumentTypeEnum;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.model.BaseModel;
+import com.vci.starter.web.pagemodel.*;
+import com.vci.web.dto.*;
+import com.vci.web.pageModel.OsBtmTypeVO;
+import com.vci.web.pageModel.ReferConfigVO;
+import com.vci.web.pageModel.UIFormDataVO;
+import com.vci.web.query.UIDataGridQuery;
+import com.vci.web.query.UIFormQuery;
+import com.vci.web.query.UITreeQuery;
+import com.vci.web.query.UITreeRootQuery;
+import plm.bs.bom.clientobject.ClientBusinessObject;
+import plm.bs.bom.clientobject.ClientLinkObject;
+import plm.bs.bom.clientobject.RevisionValueObject;
+import plm.bs.bom.clientobject.VersionValueObject;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 閫氳繃UI瀹氫箟鐨勬暟鎹搷浣滄湇鍔★紝鍖呮嫭澧炲垹鏀规煡 ,鍗囩増锛岃穬杩佺瓑
+ * @author weidy
+ * @date 2021-2-16
+ */
+public interface UIDataServiceI {
+
+    /**
+     * 鑾峰彇琛ㄦ牸鐨勬暟鎹�
+     * @param dataGridQuery 琛ㄦ牸鏌ヨ锛屽繀椤绘湁涓氬姟绫诲瀷鍚嶇О鍜� 琛ㄦ牸鐨勭紪鍙�
+     * @return DataGrid涓璬ata涓篗ap<String,String>鏍煎紡
+     * @throws VciBaseException 鏌ヨ鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    DataGrid getDataForGrid(UIDataGridQuery dataGridQuery)  throws VciBaseException;
+
+    /**
+     * 鑾峰彇琛ㄥ崟鐨勬暟鎹�
+     * @param formQuery 琛ㄥ崟鐨勬煡璇㈡潯浠�
+     * @return 琛ㄥ崟鐨勬暟鎹�
+     * @throws VciBaseException 鏌ヨ鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    UIFormDataVO getDataForForm(UIFormQuery formQuery) throws VciBaseException;
+
+    /**
+     * 鑾峰彇鏍戝舰鏁版嵁
+     * @param treeQuery 鏍戝舰鏌ヨ鏉′欢
+     * @return 鏍戝舰鏁版嵁
+     * @throws VciBaseException 鏌ヨ鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    List<Tree> getDataForTree(UITreeQuery treeQuery) throws VciBaseException;
+
+    /**
+     * 璋冪敤鍓嶇疆浜嬩欢
+     * @param baseModelDTOList 涓氬姟鏁版嵁鐨勪俊鎭�
+     * @param baseLinkModelDTOList 閾炬帴绫诲瀷鐨勬暟鎹�
+     * @param preEvent 鍓嶇疆浜嬩欢鐨勫悕绉�
+     * @param businessType 璋冪敤鐨勭被鍨�
+     * @return 鎵ц缁撴灉锛岃鍒ゆ柇success灞炴�ф槸鍚︿负true
+     * @throws VciBaseException 閰嶇疆鎴栬�呮槸璋冪敤涓嶆垚鍔熺殑鏃跺�欙紝浼氭姏鍑哄紓甯�
+     */
+    BaseResult callPreEvent(BaseModelDTOList baseModelDTOList, BaseLinkModelDTOList baseLinkModelDTOList,String preEvent, VciChangeDocumentTypeEnum businessType) throws VciBaseException;
+
+    /**
+     * 鍚庣疆浜嬩欢
+     * @param cbos 娣诲姞瀹屾垚鍚庡唴瀹�
+     * @param clos 娣诲姞瀹岄摼鎺ョ被鍨嬬殑鍐呭
+     * @param postEvent 鍚庣疆浜嬩欢鐨勫悕绉帮紝濡傛灉涓虹┖浼氳嚜鍔ㄦ壂鎻忔槸鍚︽湁娉ㄨВ
+     * @param businessType 涓氬姟鎿嶄綔鐨勭被鍨�
+     * @return 鎵ц鐨勭粨鏋�
+     * @throws VciBaseException 鎵ц鍑洪敊鐨勪細鎶涘嚭寮傚父锛屾垨鑰呬簨浠剁洿鎺ヨ繑鍥炰簡寮傚父
+     */
+    BaseResult callPostEvent(Collection<ClientBusinessObject> cbos, Collection<ClientLinkObject> clos, String postEvent, VciChangeDocumentTypeEnum businessType) throws VciBaseException;
+
+    /**
+     * 琛ㄥ崟鏁版嵁杞崲涓哄熀纭�瀵硅薄
+     * @param formDataDTO 琛ㄥ崟鏁版嵁
+     * @return 鍩虹瀵硅薄鍒楄〃
+     */
+    BaseModelDTOList formData2DTOList(FormDataDTO formDataDTO);
+
+    /**
+     * 閾炬帴鏁版嵁 杞崲涓哄熀纭�瀵硅薄
+     * @param formLinkDataDTO 琛ㄥ崟鏁版嵁
+     * @return 鍩虹鏁版嵁鍒楄〃
+     */
+    BaseLinkModelDTOList formLinkData2DTOList(FormLinkDataDTO formLinkDataDTO);
+
+    /**
+     * 琛ㄥ崟鐨勬暟鎹浆鎹负
+     * @param formDataDTOList 琛ㄥ崟鏁版嵁
+     * @return 鍩虹瀵硅薄鍒楄〃
+     */
+    BaseModelDTOList formDataList2DTOList(FormDataDTOList formDataDTOList);
+
+    /**
+     * 閾炬帴绫诲瀷鎵归噺杞崲
+     * @param formLinkDataDTOList 琛ㄥ崟鐨勬暟鎹�
+     * @return 鍩虹瀵硅薄鍒楄〃
+     */
+    BaseLinkModelDTOList formLinkDataList2DTOList(FormLinkDataDTOList formLinkDataDTOList);
+
+    /**
+     * 娣诲姞鏁版嵁
+     * @param formDataDTO 鏁版嵁鐨勪紶杈撳璞�
+     * @return 鎵ц缁撴灉鍜屾樉绀哄悗鐨勫��
+     * @throws VciBaseException 淇濆瓨鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    BaseResult<Map<String,Object>> addSave(FormDataDTO formDataDTO) throws VciBaseException;
+
+    /**
+     * 涓氬姟绫诲瀷
+     * @param cbo 涓氬姟鏁版嵁瀵硅薄
+     * @return 鍩虹瀵硅薄
+     */
+    BaseModel cbo2BaseModel(ClientBusinessObject cbo);
+
+    /**
+     * 涓氬姟鏁版嵁琛ㄥ崟瀵硅薄杞崲涓哄熀纭�鐨勫睘鎬�
+     * @param formDataDTO 琛ㄧ殑鏁版嵁浼犺緭瀵硅薄
+     * @return 鏁版嵁鐨勬槧灏勫唴瀹�
+     */
+    Map<String,String> formDataDTO2MapLow(FormDataDTO formDataDTO);
+
+    /**
+     * 閾炬帴鏁版嵁琛ㄥ崟瀵硅薄杞崲涓哄熀纭�鐨勫睘鎬�
+     * @param formLinkDataDTO 琛ㄧ殑鏁版嵁浼犺緭瀵硅薄
+     * @return 鏁版嵁鐨勬槧灏勫唴瀹�
+     */
+    Map<String,String> formLinkDataDTO2MapLow(FormLinkDataDTO formLinkDataDTO);
+
+    /**
+     * 鑾峰彇涓嬩竴涓増鏈彿
+     * @param btmTypeVO 涓氬姟绫诲瀷鐨勬樉绀哄璞�
+     * @param baseModel 鍩虹瀵硅薄
+     * @return 鐗堟湰鐨勫璞�
+     */
+    RevisionValueObject getNextRevision(OsBtmTypeVO btmTypeVO, BaseModel baseModel);
+
+    /**
+     * 鑾峰彇涓嬩竴涓増娆$殑鍙�
+     * @param btmTypeVO 涓氬姟绫诲瀷鐨勬樉绀哄璞�
+     * @param baseModel 鍩虹瀵硅薄
+     * @return 鐗堟湰鐨勫�煎璞�
+     */
+    VersionValueObject getNextVersion(OsBtmTypeVO btmTypeVO, BaseModel baseModel);
+
+    /**
+     * 鑾峰彇绗竴涓増娆�
+     * @param versionRule 鐗堟鐨勮鍒�
+     * @return 绗竴涓増娆�
+     */
+    String getFirstVersion(String versionRule);
+
+    /**
+     * 鎵归噺娣诲姞鏁版嵁
+     * @param formDataDTOList 鏁版嵁鐨勪紶杈撳璞�
+     * @return 鎵ц缁撴灉鍜屼富閿�
+     * @throws VciBaseException 淇濆瓨鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    BaseResult<String> batchAddSave(FormDataDTOList formDataDTOList) throws VciBaseException;
+
+    /**
+     * 淇敼鏁版嵁銆傛敞鎰忚〃鍗曞畾涔夌殑瀛楁鎵嶄細琚慨鏀癸紝ts杩欑榛樿瀛楁闄ゅ
+     * @param formDataDTO 鏁版嵁鐨勪紶杈撳璞�
+     * @return 鎵ц缁撴灉鍜屾樉绀哄悗鐨勫��
+     * @throws VciBaseException 淇濆瓨鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    BaseResult<Map<String,Object>> editSave(FormDataDTO formDataDTO) throws VciBaseException;
+
+    /**
+     * 鏁版嵁鍗囩増
+     * @param formDataDTO 鏁版嵁鐨勪紶杈撳璞�
+     * @return 鎵ц缁撴灉鍜屾樉绀哄悗鐨勫��
+     * @throws VciBaseException 淇濆瓨鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    BaseResult<Map<String, Object>> upRevision(FormDataDTO formDataDTO) throws VciBaseException;
+
+    /**
+     * 鎵归噺淇敼锛屾敞鎰忚〃鍗曞畾涔夌殑瀛楁鎵嶄細琚慨鏀癸紝ts杩欑榛樿瀛楁闄ゅ
+     * @param formDataDTOList 鏁版嵁鐨勪紶杈撳璞�
+     * @return 鎵ц缁撴灉鍜屾樉绀哄悗鐨勫��
+     * @throws VciBaseException 淇濆瓨鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    BaseResult<String> batchEditSave(FormDataDTOList formDataDTOList) throws VciBaseException;
+
+    /**
+     * 鎵归噺鍒犻櫎
+     * @param deleteDataDTO 鏁版嵁鐨勪紶杈撳璞�
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 鏁版嵁琚紩鐢ㄧ殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    BaseResult batchDelete(DeleteDataDTO deleteDataDTO)  throws VciBaseException;
+
+    /**
+     * 閾炬帴绫诲瀷娣诲姞
+     * @param formLinkDataDTO 閾炬帴绫诲瀷鐨勮〃鍗曟暟鎹�
+     * @return 閾炬帴绫诲瀷鐨勪富閿�
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屽繀杈撻」缂哄け
+     */
+    BaseResult<String> linkAddSave(FormLinkDataDTO formLinkDataDTO) throws VciBaseException;
+
+    /**
+     * 璁剧疆鍊煎埌涓氬姟绫诲瀷鐨勫璞′笂
+     * @param dataLow 鏁版嵁锛坘ey灏忓啓锛�
+     * @param baseDataLow 鍩虹灞炴�х殑鏁版嵁锛坘ey灏忓啓)
+     * @param cbo 涓氬姟绫诲瀷鐨勫璞�
+     * @param editFlag 鏄惁涓虹紪杈�
+     */
+    void setValueToCbo(Map<String, String> dataLow, Map<String, String> baseDataLow, ClientBusinessObject cbo, boolean editFlag);
+
+    /**
+     * 閾炬帴绫诲瀷鐨勭紪杈戞暟鎹�
+     * @param formLinkDataDTO 鏁版嵁鐨勪紶杈撳璞�
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屽繀杈撻」缂哄け
+     */
+    BaseResult linkEditSave(FormLinkDataDTO formLinkDataDTO) throws VciBaseException;
+
+    /**
+     * 鍒犻櫎閾炬帴绫诲瀷
+     * @param deleteLinkDataDTO 鏁版嵁鐨勪紶杈撳璞�
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屽繀杈撻」缂哄け
+     */
+    BaseResult batchLinkDelete(DeleteLinkDataDTO deleteLinkDataDTO)throws VciBaseException;
+
+    /**
+     * 鑾峰彇鍙傜収鐨勪俊鎭�
+     * @param referConfigVO 鍙傜収鐨勯厤缃�
+     * @param pageHelper 鍒嗛〉鐨勫伐鍏�
+     * @return 鍒楄〃鏁版嵁
+     */
+    DataGrid referDataGrid(ReferConfigVO referConfigVO, PageHelper pageHelper);
+
+    /**
+     * 鑾峰彇鏍戝舰鐨勫弬鐓�
+     * @param referConfigVO 鍙傜収鐨勯厤缃�
+     * @return 鏍戝舰鐨勬暟鎹�
+     */
+    List<Tree> referTree(ReferConfigVO referConfigVO);
+
+    /**
+     * 琛ㄥ崟鐨勬暟鎹煡璇�
+     * @param btmName 涓氬姟绫诲瀷鐨勪俊鎭�
+     * @param oid 涓氬姟鏁版嵁鐨勪富閿�
+     * @return 涓氬姟鏁版嵁鐨勫睘鎬т俊鎭�
+     */
+    List<Map<String,String>>  getDataAttr(String btmName, String oid);
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/UIEngineServiceI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/UIEngineServiceI.java
new file mode 100644
index 0000000..dbce492
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/UIEngineServiceI.java
@@ -0,0 +1,215 @@
+package com.vci.web.service;
+
+
+import com.vci.corba.common.VCIError;
+import com.vci.corba.portal.data.PLAction;
+import com.vci.corba.portal.data.PLTabButton;
+import com.vci.corba.portal.data.PLUILayout;
+import com.vci.corba.portal.data.PortalVI;
+import com.vci.web.pageModel.*;
+import plm.corba.portal.PLPageLayoutDefination;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * UI涓婁笅鏂囨湇鍔�
+ * @author weidy
+ * @date 2021-2-15
+ */
+public interface UIEngineServiceI extends OsBaseServiceI{
+
+	/**
+	 * 妫�鏌ユ棤鏁堢殑xml
+	 */
+	void checkInvalidXmlVI();
+
+	/**
+	 * 鏌ヨ鎵�鏈夌殑琛ㄥ崟瀹氫箟
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	List<UIFormDefineVO> selectAllForm();
+
+	/**
+	 * 鏌ヨ鎵�鏈夌殑琛ㄥ崟瀹氫箟鐨勬槧灏�
+	 * @return key鏄〃鍗曡嫳鏂囧悕绉�
+	 */
+	Map<String,UIFormDefineVO> selectAllFormMap();
+
+	/**
+	 * 琛ㄥ崟鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+	 * @param prms 鏁版嵁瀵硅薄
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	List<UIFormDefineVO> formDO2VOs(Collection<PortalVI> prms);
+
+	/**
+	 * 琛ㄥ崟鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+	 * @param prm 鏁版嵁瀵硅薄
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	UIFormDefineVO formDO2VO(PortalVI prm);
+
+	/**
+	 * 浣跨敤琛ㄥ崟鐨勮嫳鏂囧悕绉拌幏鍙栬〃鍗�
+	 * @param id 琛ㄥ崟鐨勮嫳鏂囧悕绉�
+	 * @param btmId 涓氬姟绫诲瀷
+	 * @return 琛ㄥ崟鐨勫畾涔�
+	 */
+	UIFormDefineVO getFormById(String btmId,String id);
+
+	/**
+	 * 浣跨敤琛ㄥ崟鐨勮嫳鏂囧悕绉拌幏鍙栬〃鍗�
+	 * @param ids 琛ㄥ崟鐨勮嫳鏂囧悕绉�
+	 * @param btmId 涓氬姟绫诲瀷缂栧彿
+	 * @return 琛ㄥ崟鐨勫畾涔�
+	 */
+	List<UIFormDefineVO> listFormByIds(String btmId,Collection<String> ids);
+
+	/**
+	 * 鏌ヨ鎵�鏈夌殑琛ㄦ牸
+	 * @return 琛ㄦ牸鐨勫畾涔�
+	 */
+	List<UITableDefineVO> selectAllTable();
+
+	/**
+	 * 鏌ヨ鎵�鏈夌殑琛ㄦ牸
+	 * @return 琛ㄦ牸鐨勫畾涔夛紝key鏄〃鏍肩殑鑻辨枃鍚嶇О
+	 */
+	Map<String,UITableDefineVO> selectAllTableMap();
+
+	/**
+	 * 琛ㄦ牸鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+	 * @param prms 鏁版嵁瀵硅薄
+	 * @param queryDetail 鏌ヨ鏄庣粏
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	List<UITableDefineVO> tableDO2VOs(Collection<PortalVI> prms,boolean queryDetail);
+
+	/**
+	 * 琛ㄦ牸鐨勬暟鎹璞¤浆鎹负鏄剧ず瀵硅薄
+	 * @param prm 鏁版嵁瀵硅薄
+	 * @param queryDetail 鏌ヨ鏄庣粏
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	UITableDefineVO tableDO2VO(PortalVI prm,boolean queryDetail);
+
+	/**
+	 * 浣跨敤琛ㄦ牸鐨勮嫳鏂囧悕绉拌幏鍙栬〃鍗�
+	 * @param id 琛ㄦ牸鐨勮嫳鏂囧悕绉�
+	 * @param btmId 涓氬姟绫诲瀷
+	 * @return 琛ㄥ崟鐨勫畾涔�
+	 */
+	UITableDefineVO getTableById(String btmId,String id);
+
+	/**
+	 * 浣跨敤琛ㄦ牸鐨勮嫳鏂囧悕绉拌幏鍙栬〃鍗�
+	 * @param ids 琛ㄦ牸鐨勮嫳鏂囧悕绉�
+	 * @param btmId 涓氬姟绫诲瀷缂栧彿
+	 * @return 琛ㄥ崟鐨勫畾涔�
+	 */
+	List<UITableDefineVO> listTableByIds(String btmId,Collection<String> ids);
+
+	/**
+	 *鏌ヨ鎵�鏈夌殑action
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	List<UIActionVO> selectAllAction();
+
+	/**
+	 *鏌ヨ鎵�鏈夌殑action
+	 * @return 鏄剧ず瀵硅薄锛宬ey鏄痑ction鐨勮嫳鏂囩紪鍙�
+	 */
+	Map<String,UIActionVO> selectAllActionMap();
+
+	/**
+	 * action鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+	 * @param actions 鏁版嵁瀵硅薄
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	List<UIActionVO> actionDO2VOs(Collection<com.vci.corba.portal.data.PLAction> actions);
+
+	/**
+	 * action鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+	 * @param action 鏁版嵁瀵硅薄
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	UIActionVO actionDO2VO(com.vci.corba.portal.data.PLAction action);
+
+
+	/**
+	 * 鏌ヨ鎵�鏈夌殑UI涓婁笅鏂�
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	List<UIContentVO> selectAllUIContent();
+
+	/**
+	 * 鏌ヨ鎵�鏈夌殑UI涓婁笅鏂囩殑鏄犲皠
+	 * @return 鏄剧ず瀵硅薄锛宬ey涓氬姟绫诲瀷+${uiContent}+涓婁笅鏂囩殑Id
+	 */
+	Map<String,UIContentVO> selectAllUIContentMap();
+
+	/**
+	 * 鏌ヨ鎵�鏈夌殑涓婁笅鏂囩殑鍖哄煙
+	 * @return 鍖哄煙鐨勬樉绀哄璞�
+	 */
+	List<UILayoutVO> selectAllUILayout();
+
+	/**
+	 * 鏌ヨ鎵�鏈夌殑涓婁笅鏂囩殑鍖哄煙鐨勬槧灏�
+	 * @return 鍖哄煙鐨勬樉绀哄璞� ,key鏄墍灞濽I涓婁笅鏂囩殑涓婚敭
+	 */
+	Map<String,List<UILayoutVO>> selectAllUILayoutMap();
+
+	/**
+	 * 鏌ヨ鎵�鏈夌殑缁勪欢
+	 * @return UI缁勪欢
+	 */
+	List<UIComponentVO> selectAllUIComponent();
+
+	/**
+	 * 浣跨敤涓婚敭鑾峰彇
+	 * @param componentOid 缁勪欢鐨勪富閿�
+	 * @return 涓婚敭鐨勬樉绀哄璞�
+	 */
+	UIComponentVO getComponentByOid(String componentOid);
+
+	/**
+	 * 鑾峰彇鏌愪釜缁勪欢鐨勬寜閽�
+	 * @param pkComponent 缁勪欢鐨勪富閿�
+	 * @return 鎸夐挳鐨勪俊鎭�
+	 */
+	List<UIButtonDefineVO> listButtonByComponent(String pkComponent);
+
+	/**
+	 * 鎸夐挳鐨勬暟鎹璞¤浆鎹负鏄剧ず瀵硅薄
+	 * @param buttons 鎸夐挳鐨勬暟鎹璞�
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	List<UIButtonDefineVO> buttonDO2VOs(Collection<PLTabButton> buttons);
+
+	/**
+	 * 鎸夐挳鐨勬暟鎹璞¤浆鎹负鏄剧ず瀵硅薄
+	 * @param button 鎸夐挳鐨勬暟鎹璞�
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	UIButtonDefineVO buttonDO2VO(PLTabButton button) ;
+
+	/**
+	 * 鏌ヨ鎵�鏈夌殑缁勪欢
+	 * @return key鏄墍灞炵殑鍖哄煙锛�
+	 */
+	Map<String,List<UIComponentVO>> selectAllUIComponentMap();
+
+	/**
+	 * 浣跨敤涓氬姟绫诲瀷鎴栬�呴摼鎺ョ被鍨嬶紝宸茬粡UI涓婁笅鏂囩殑缂栧彿锛岃幏鍙栫浉搴旂殑淇℃伅
+	 * @param btmType 涓氬姟绫诲瀷
+	 * @param id 涓婚敭
+	 * @return UI涓婁笅鏂囩殑淇℃伅
+	 */
+    UIContentVO getUIContentByBtmTypeAndId(String btmType, String id);
+
+//	UIContentVO UIContentDO2VO(PLPageLayoutDefination pageLayoutDefination, boolean queryDetail);
+	UIContentVO UIContentDO2VO(PLUILayout pageLayoutDefination, boolean queryDetail);
+;
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/VciFileDocClassifyServiceI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/VciFileDocClassifyServiceI.java
new file mode 100644
index 0000000..d155813
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/VciFileDocClassifyServiceI.java
@@ -0,0 +1,135 @@
+package com.vci.web.service;
+
+import com.vci.file.dto.VciFileDocClassifyDTO;
+import com.vci.file.dto.VciFileDocClassifyDTOList;
+import com.vci.file.pagemodel.VciFileDocClassifyVO;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.BaseResult;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.starter.web.pagemodel.KeyValue;
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.web.model.VciFileDocClassifyDO;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 鏂囨。鐨勭被鍨嬫湇鍔℃帴鍙�
+ *
+ * @author weidy
+ * @date 2020-08-04
+ */
+public interface VciFileDocClassifyServiceI {
+    /**
+     * 鏌ヨ鎵�鏈夌殑鏂囨。鐨勭被鍨�
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉鍜屾帓搴�
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 鏌ヨ鏉′欢鍜屽垎椤靛嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    DataGrid<VciFileDocClassifyVO> gridVciFileDocClassify(Map<String, String> conditionMap, PageHelper pageHelper) throws VciBaseException;
+
+    /**
+     * 鎵归噺鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+     * @param vciFileDocClassifyDOs 鏁版嵁瀵硅薄鍒楄〃
+     * @return 鏄剧ず瀵硅薄
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呬笉瀛樺湪鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    List<VciFileDocClassifyVO> vciFileDocClassifyDO2VOs(Collection<VciFileDocClassifyDO>  vciFileDocClassifyDOs) throws VciBaseException;
+
+    /**
+     * 鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+     * @param  vciFileDocClassifyDO 鏁版嵁瀵硅薄
+     * @return 鏄剧ず瀵硅薄
+     * @throws VciBaseException 鎷疯礉灞炴�у嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    VciFileDocClassifyVO vciFileDocClassifyDO2VO(VciFileDocClassifyDO vciFileDocClassifyDO) throws VciBaseException;
+
+    /**
+     * 澧炲姞鏂囨。鐨勭被鍨�
+     * @param vciFileDocClassifyDTO 鏂囨。鐨勭被鍨嬫暟鎹紶杈撳璞�
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屽敮涓�椤癸紝蹇呰緭椤逛笉閫氳繃鏃朵細鎶涘嚭寮傚父
+     */
+    VciFileDocClassifyVO addSave(VciFileDocClassifyDTO vciFileDocClassifyDTO) throws VciBaseException;
+
+    /**
+     * 淇敼鏂囨。鐨勭被鍨�
+     * @param vciFileDocClassifyDTO 鏂囨。鐨勭被鍨嬫暟鎹紶杈撳璞�
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屽敮涓�椤癸紝蹇呰緭椤逛笉閫氳繃鏃朵細鎶涘嚭寮傚父
+     */
+    VciFileDocClassifyVO editSave(VciFileDocClassifyDTO vciFileDocClassifyDTO) throws VciBaseException;
+
+
+    /**
+     * 鍒犻櫎鏂囨。鐨勭被鍨�
+     * @param vciFileDocClassifyDTO 鏂囨。鐨勭被鍨嬫暟鎹紶杈撳璞★紝oid鍜宼s闇�瑕佷紶杈�
+     * @return 鍒犻櫎缁撴灉鍙嶉锛氾細success锛氭垚鍔燂紝fail锛氬け璐�
+     * @throws VciBaseException 鍙傛暟涓虹┖锛岃寮曠敤鏃舵姏鍑哄紓甯�
+     */
+    BaseResult deleteVciFileDocClassify(VciFileDocClassifyDTO vciFileDocClassifyDTO) throws VciBaseException;
+
+    /**
+    * 涓婚敭鑾峰彇鏂囨。鐨勭被鍨�
+    * @param oid 涓婚敭
+    * @return 鏂囨。鐨勭被鍨嬫樉绀哄璞�
+    * @throws VciBaseException 鍙傛暟涓虹┖锛屾暟鎹笉瀛樺湪鏃朵細鎶涘嚭寮傚父
+    */
+    VciFileDocClassifyVO getObjectByOid(String oid) throws VciBaseException;
+
+    /**
+     * 涓婚敭鎵归噺鑾峰彇鏂囨。鐨勭被鍨�
+     * @param oidCollections 涓婚敭闆嗗悎锛屼絾鏄彈鎬ц兘褰卞搷锛屽缓璁竴娆℃煡璇笉瓒呰繃10000涓�
+     * @return 鏂囨。鐨勭被鍨嬫樉绀哄璞�
+     * @throws VciBaseException 鏌ヨ鍑虹幇寮傚父鏃朵細鎶涘嚭
+     */
+    Collection<VciFileDocClassifyVO> listVciFileDocClassifyByOids(Collection<String> oidCollections) throws VciBaseException;
+
+    /**
+     * 鍙傜収鏂囨。鐨勭被鍨嬪垪琛�
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉鍜屾帓搴�
+     * @return 鏂囨。鐨勭被鍨嬫樉绀哄璞″垪琛紝鐢熸晥鐨勫唴瀹�
+     * @throws VciBaseException 鏌ヨ鏉′欢鍜屽垎椤靛嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    DataGrid<VciFileDocClassifyVO> refDataGridVciFileDocClassify(Map<String, String> conditionMap, PageHelper pageHelper) throws VciBaseException;
+
+    /**
+     * 鏍¢獙缂栧彿鏄惁瀛樺湪
+     * @param idCollections 缂栧彿鐨勯泦鍚�
+     * @return success涓簍rue琛ㄧず瀛樺湪锛屽惁鍒欏湪data涓幏鍙栦笉瀛樺湪鐨勫唴瀹�
+     */
+    BaseResult checkClassifyIdsExist(Collection<String> idCollections);
+
+    /**
+     * 鎵归噺娣诲姞鍒嗙被
+     * @param fileDocClassifyDTOList 鍒嗙被鐨勬暟鎹紶杈撳璞�
+     * @return success涓簍rue琛ㄧず鎵ц鎴愬姛
+     */
+    BaseResult batchAddSave(VciFileDocClassifyDTOList fileDocClassifyDTOList);
+
+    /**
+     * 浣跨敤缂栧彿鑾峰彇瀵硅薄
+     * @param id 缂栧彿
+     * @return 鏄剧ず瀵硅薄
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮墽琛屽嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    VciFileDocClassifyVO getObjectById(String id) throws VciBaseException;
+
+    /**
+     * 浣跨敤缂栧彿鎵归噺鑾峰彇绫诲瀷瀵硅薄
+     * @param idCollection 缂栧彿闆嗗悎
+     * @return 鏄剧ず瀵硅薄
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮墽琛屽嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    List<VciFileDocClassifyVO> listVciFileDocClassifyByIds(Collection<String> idCollection) throws VciBaseException;
+
+    /**
+     * 鏂囦欢绫诲瀷鐨勪笅鎷夎彍鍗�
+     * @return 涓嬫媺鑿滃崟鐨勫��
+     */
+    List<KeyValue> comboFileDocClassify();
+}
+
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/VciFileDownloadServiceI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/VciFileDownloadServiceI.java
new file mode 100644
index 0000000..a156053
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/VciFileDownloadServiceI.java
@@ -0,0 +1,189 @@
+package com.vci.web.service;
+
+import com.vci.file.pagemodel.VciFileObjectVO;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.BaseResult;
+import net.lingala.zip4j.core.ZipFile;
+import net.lingala.zip4j.io.ZipOutputStream;
+
+import java.util.Collection;
+import java.util.Map;
+
+/**
+ * 鏂囦欢涓嬭浇鐨勬湇鍔℃帴鍙�
+ * 鏄寚鎶婃枃浠朵粠鏂囦欢瀛樺偍鏈嶅姟涓婁笅杞斤紝涓嶆槸鐩存帴涓嬭浇鍒版祻瑙堝櫒
+ * @author weidy
+ * @date 2020/3/12
+ */
+public interface VciFileDownloadServiceI {
+
+    /**
+     * 鏍规嵁涓婚敭涓嬭浇鏂囦欢锛屼細涓嬭浇鍒伴粯璁ょ殑涓存椂鏂囦欢澶逛笅
+     * @param fileOid 鏂囦欢鐨勪富閿�
+     * @return 鏂囦欢鍦ㄦ湰鍦扮殑鍏ㄨ矾寰勶紝娉ㄦ剰浠ttp://鎴栬�呬互https://寮�澶寸殑涓嶄細涓嬭浇锛岄渶瑕佽嚜琛屽垽鏂�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮枃浠跺嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    String downloadFileByOid(String fileOid) throws VciBaseException;
+
+    /**
+     * 鏍规嵁涓婚敭涓嬭浇鏂囦欢
+     * @param clientPath 瀹㈡埛绔殑鏂囦欢澶�
+     * @param fileOid 鏂囦欢鐨勪富閿�
+     * @return 鏂囦欢鍦ㄦ湰鍦扮殑鍏ㄨ矾寰勶紝娉ㄦ剰浠ttp://鎴栬�呬互https://寮�澶寸殑涓嶄細涓嬭浇锛岄渶瑕佽嚜琛屽垽鏂�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮枃浠跺嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    String downloadFileByOid(String clientPath, String fileOid) throws VciBaseException;
+
+    /**
+     * 鏍规嵁涓婚敭鎵归噺涓嬭浇鏂囦欢,浼氫笅杞藉埌榛樿鐨勪复鏃舵枃浠跺す涓�
+     * @param fileOidCollection 鏂囦欢闆嗗悎
+     * @return  key鏄枃浠剁殑涓婚敭锛寁alue鏄枃浠跺湪鏈湴鐨勫叏璺緞锛屾敞鎰忎互http://鎴栬�呬互https://寮�澶寸殑涓嶄細涓嬭浇锛岄渶瑕佽嚜琛屽垽鏂�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮枃浠跺嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    Map<String,String> batchDownloadFileByOids(Collection<String> fileOidCollection) throws VciBaseException;
+
+    /**
+     * 鏍规嵁涓婚敭鎵归噺涓嬭浇鏂囦欢
+     * @param clientPath 瀹㈡埛绔殑鏂囦欢澶�
+     * @param fileOidCollection 鏂囦欢闆嗗悎
+     * @return  key鏄枃浠剁殑涓婚敭锛寁alue鏄枃浠跺湪鏈湴鐨勫叏璺緞锛屾敞鎰忎互http://鎴栬�呬互https://寮�澶寸殑涓嶄細涓嬭浇锛岄渶瑕佽嚜琛屽垽鏂�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮枃浠跺嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    Map<String,String> batchDownloadFileByOids(String clientPath, Collection<String> fileOidCollection) throws VciBaseException;
+
+    /**
+     * 鏍规嵁涓婚敭鎵归噺涓嬭浇鏂囦欢锛屼笅杞芥ā鍨嬫枃浠朵笉鑳界敤杩欎釜鏂规硶
+     * @param clientPath 瀹㈡埛绔殑鏂囦欢澶�
+     * @param fileOidCollection 鏂囦欢闆嗗悎
+     * @param sameFileUseOidFolder 褰撶浉鍚屾枃浠舵椂锛屼娇鐢ㄤ富閿潵鍋氭枃浠跺す鍖哄垎
+     * @return  key鏄枃浠剁殑涓婚敭锛寁alue鏄枃浠跺湪鏈湴鐨勫叏璺緞锛屾敞鎰忎互http://鎴栬�呬互https://寮�澶寸殑涓嶄細涓嬭浇锛岄渶瑕佽嚜琛屽垽鏂�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮枃浠跺嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    Map<String,String> batchDownloadFileByOids(String clientPath, Collection<String> fileOidCollection,boolean sameFileUseOidFolder) throws VciBaseException;
+
+    /**
+     * 鏍规嵁鏂囦欢瀵硅薄涓嬭浇鏂囦欢
+     * @param fileObjectVO 鏂囦欢鐨勬樉绀哄璞�
+     * @return 鏂囦欢鍦ㄦ湰鍦扮殑鍏ㄨ矾寰勶紝娉ㄦ剰浠ttp://鎴栬�呬互https://寮�澶寸殑涓嶄細涓嬭浇锛岄渶瑕佽嚜琛屽垽鏂�
+     * @throws VciBaseException  鍙傛暟涓虹┖鎴栬�呮枃浠跺嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    String downloadFileByFileObject(VciFileObjectVO fileObjectVO) throws VciBaseException;
+
+    /**
+     * 鏍规嵁鏂囦欢瀵硅薄涓嬭浇鏂囦欢
+     * @param clientPath 瀹㈡埛绔殑鏂囦欢澶�
+     * @param fileObjectVO 鏂囦欢鐨勬樉绀哄璞�
+     * @return 鏂囦欢鍦ㄦ湰鍦扮殑鍏ㄨ矾寰勶紝娉ㄦ剰浠ttp://鎴栬�呬互https://寮�澶寸殑涓嶄細涓嬭浇锛岄渶瑕佽嚜琛屽垽鏂�
+     * @throws VciBaseException  鍙傛暟涓虹┖鎴栬�呮枃浠跺嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    String downloadFileByFileObject(String clientPath,VciFileObjectVO fileObjectVO) throws VciBaseException;
+
+    /**
+     * 鏍规嵁涓婚敭鎵归噺涓嬭浇鏂囦欢锛屼細涓嬭浇鍒伴粯璁ょ殑鏂囦欢澶逛笅
+     * @param fileObjectVOCollection 鏂囦欢鏄剧ず瀵硅薄闆嗗悎
+     * @return  key鏄枃浠剁殑涓婚敭锛寁alue鏄枃浠跺湪鏈湴鐨勫叏璺緞锛屾敞鎰忎互http://鎴栬�呬互https://寮�澶寸殑涓嶄細涓嬭浇锛岄渶瑕佽嚜琛屽垽鏂�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮枃浠跺嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    Map<String,String> batchDownloadFileByFileObject( Collection<VciFileObjectVO> fileObjectVOCollection) throws VciBaseException;
+
+    /**
+     * 鏍规嵁涓婚敭鎵归噺涓嬭浇鏂囦欢
+     * @param clientPath 瀹㈡埛绔殑鏂囦欢澶�
+     * @param fileObjectVOCollection 鏂囦欢鏄剧ず瀵硅薄闆嗗悎
+     * @return  key鏄枃浠剁殑涓婚敭锛寁alue鏄枃浠跺湪鏈湴鐨勫叏璺緞锛屾敞鎰忎互http://鎴栬�呬互https://寮�澶寸殑涓嶄細涓嬭浇锛岄渶瑕佽嚜琛屽垽鏂�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮枃浠跺嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    Map<String,String> batchDownloadFileByFileObject(String clientPath, Collection<VciFileObjectVO> fileObjectVOCollection) throws VciBaseException;
+
+    /**
+     * 涓嬭浇鏂囦欢鍒皕ip鏂囦欢涓�
+     * @param zipFileName zip鏂囦欢鏂囦欢璺緞
+     * @param fileOid 鏂囦欢涓婚敭
+     * @throws VciBaseException 鏌ヨ鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    void downloadZipFileByOids(String zipFileName, String fileOid) throws VciBaseException;
+
+    /**
+     * 涓嬭浇鏂囦欢鍒皕ip鏂囦欢涓�
+     * @param zipFile zip鏂囦欢
+     * @param fileOid 鏂囦欢涓婚敭
+     * @throws VciBaseException 鏌ヨ鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    void downloadZipFileByOids(ZipFile zipFile, String fileOid) throws VciBaseException;
+
+    /**
+     * 涓嬭浇鏂囦欢鍒皕ip鏂囦欢涓�
+     * @param zipOutputStream zip鏂囦欢杈撳嚭娴�
+     * @param fileOid 鏂囦欢涓婚敭
+     * @throws VciBaseException 鏌ヨ鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    void downloadZipStreamByOids(ZipOutputStream zipOutputStream, String fileOid) throws VciBaseException;
+
+
+    /**
+     * 涓嬭浇鏂囦欢鍒皕ip鏂囦欢涓�
+     * @param zipFileName zip鏂囦欢鍚嶇О
+     * @param fileOidCollection 鏂囦欢涓婚敭闆嗗悎
+     * @throws VciBaseException 鏌ヨ鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    void downloadZipFileByOids(String zipFileName, Collection<String> fileOidCollection) throws VciBaseException;
+
+    /**
+     * 涓嬭浇鏂囦欢鍒皕ip鏂囦欢涓�
+     * @param zipFile zip鏂囦欢
+     * @param fileOidCollection 鏂囦欢涓婚敭闆嗗悎
+     * @throws VciBaseException 鏌ヨ鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    void downloadZipFileByOids(ZipFile zipFile, Collection<String> fileOidCollection) throws VciBaseException;
+
+    /**
+     * 涓嬭浇鏂囦欢鍒皕ip鏂囦欢涓�
+     * @param zipOutputStream zip鏂囦欢杈撳嚭娴�
+     * @param fileOidCollection 鏂囦欢涓婚敭闆嗗悎
+     * @throws VciBaseException 鏌ヨ鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    void downloadZipStreamByOids(ZipOutputStream zipOutputStream, Collection<String> fileOidCollection) throws VciBaseException;
+
+    /**
+     * 涓嬭浇鏂囦欢鍒皕ip鏂囦欢涓�,涓嬭浇妯″瀷鏂囦欢鍒囪涓嶈鐢ㄨ繖涓�
+     * @param zipFile zip鏂囦欢
+     * @param fileOidCollection 鏂囦欢涓婚敭闆嗗悎
+     * @param sameFileUseOidFolder 褰撶浉鍚屾枃浠舵椂锛屼娇鐢ㄤ富閿潵鍋氭枃浠跺す鍖哄垎
+     * @throws VciBaseException 鏌ヨ鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    void downloadZipFileByOids(ZipFile zipFile, Collection<String> fileOidCollection,boolean sameFileUseOidFolder) throws VciBaseException;
+
+    /**
+     * 涓嬭浇鏂囦欢鍒皕ip鏂囦欢涓�,涓嬭浇妯″瀷鏂囦欢鍒囪涓嶈鐢ㄨ繖涓�
+     * @param zipOutputStream zip鏂囦欢杈撳嚭娴�
+     * @param fileOidCollection 鏂囦欢涓婚敭闆嗗悎
+     * @param sameFileUseOidFolder 褰撶浉鍚屾枃浠舵椂锛屼娇鐢ㄤ富閿潵鍋氭枃浠跺す鍖哄垎
+     * @throws VciBaseException 鏌ヨ鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    void downloadZipStreamByOids(ZipOutputStream zipOutputStream, Collection<String> fileOidCollection,boolean sameFileUseOidFolder) throws VciBaseException;
+
+    /**
+     * 鍒嗙墖涓嬭浇鏂囦欢
+     * @param fileOid 鏂囦欢涓婚敭
+     * @param offSet 鍋忕Щ閲�
+     * @return 鏁版嵁鐨勪簩杩涘埗淇℃伅
+     * @throws VciBaseException 涓嬭浇鐨勬椂鍊欏嚭鐜伴敊璇殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    BaseResult<byte[]> sectionDownloadByFileOid(String fileOid, long offSet) throws VciBaseException;
+
+    /**
+     * 鍒犻櫎鏂囦欢
+     * @param fileOidCollection 鏂囦欢涓婚敭闆嗗悎
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 杞界殑鏃跺�欏嚭鐜伴敊璇殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    BaseResult deleteFile(Collection<String> fileOidCollection) throws VciBaseException;
+
+    /**
+     * 浣跨敤鍗锋湇鍔′笂鐨勬枃浠惰矾寰勬潵涓嬭浇
+     * @param filePath 鍗锋湇鍔¢噷鐨勮矾寰勶紝涓昏鏄痻xx:yyy鐨勬柟寮�
+     * @return 涓嬭浇鍚庣殑鍦板潃
+     * @throws VciBaseException 涓嬭浇鍑洪敊浼氭姏鍑哄紓甯�
+     */
+    String downloadFileByPath(String filePath) throws VciBaseException;
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/VciFileObjectServiceI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/VciFileObjectServiceI.java
new file mode 100644
index 0000000..a4329c0
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/VciFileObjectServiceI.java
@@ -0,0 +1,192 @@
+package com.vci.web.service;
+
+import com.vci.file.dto.VciFileObjectDTO;
+import com.vci.file.pagemodel.VciFileObjectVO;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.BaseResult;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.web.model.VciFileObjectDO;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 鏂囦欢瀵硅薄鏈嶅姟鎺ュ彛
+ *
+ * @author weidy
+ * @date 2020-08-04
+ */
+public interface VciFileObjectServiceI {
+    /**
+     * 鏌ヨ鎵�鏈夌殑鏂囦欢瀵硅薄
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉鍜屾帓搴�
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 鏌ヨ鏉′欢鍜屽垎椤靛嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    DataGrid<VciFileObjectVO> gridVciFileObject(Map<String, String> conditionMap, PageHelper pageHelper) throws VciBaseException;
+
+    /**
+     * 鎵归噺鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+     * @param vciFileObjectDOs 鏁版嵁瀵硅薄鍒楄〃
+     * @return 鏄剧ず瀵硅薄
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呬笉瀛樺湪鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    List<VciFileObjectVO> vciFileObjectDO2VOs(Collection<VciFileObjectDO>  vciFileObjectDOs) throws VciBaseException;
+
+    /**
+     * 鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+     * @param  vciFileObjectDO 鏁版嵁瀵硅薄
+     * @return 鏄剧ず瀵硅薄
+     * @throws VciBaseException 鎷疯礉灞炴�у嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    VciFileObjectVO vciFileObjectDO2VO(VciFileObjectDO vciFileObjectDO) throws VciBaseException;
+
+    /**
+     * 澧炲姞鏂囦欢瀵硅薄
+     * @param vciFileObjectDTO 鏂囦欢瀵硅薄鏁版嵁浼犺緭瀵硅薄
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屽敮涓�椤癸紝蹇呰緭椤逛笉閫氳繃鏃朵細鎶涘嚭寮傚父
+     */
+    VciFileObjectVO addSave(VciFileObjectDTO vciFileObjectDTO) throws VciBaseException;
+
+    /**
+     * 淇敼鏂囦欢瀵硅薄
+     * @param vciFileObjectDTO 鏂囦欢瀵硅薄鏁版嵁浼犺緭瀵硅薄
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屽敮涓�椤癸紝蹇呰緭椤逛笉閫氳繃鏃朵細鎶涘嚭寮傚父
+     */
+    VciFileObjectVO editSave(VciFileObjectDTO vciFileObjectDTO) throws VciBaseException;
+
+
+    /**
+     * 鍒犻櫎鏂囦欢瀵硅薄
+     * @param vciFileObjectDTO 鏂囦欢瀵硅薄鏁版嵁浼犺緭瀵硅薄锛宱id鍜宼s闇�瑕佷紶杈�
+     * @return 鍒犻櫎缁撴灉鍙嶉锛氾細success锛氭垚鍔燂紝fail锛氬け璐�
+     * @throws VciBaseException 鍙傛暟涓虹┖锛岃寮曠敤鏃舵姏鍑哄紓甯�
+     */
+    BaseResult deleteVciFileObject(VciFileObjectDTO vciFileObjectDTO) throws VciBaseException;
+
+    /**
+    * 涓婚敭鑾峰彇鏂囦欢瀵硅薄
+    * @param oid 涓婚敭
+    * @return 鏂囦欢瀵硅薄鏄剧ず瀵硅薄
+    * @throws VciBaseException 鍙傛暟涓虹┖锛屾暟鎹笉瀛樺湪鏃朵細鎶涘嚭寮傚父
+    */
+    VciFileObjectVO getObjectByOid(String oid) throws VciBaseException;
+
+    /**
+     * 涓婚敭鎵归噺鑾峰彇鏂囦欢瀵硅薄
+     * @param oidCollections 涓婚敭闆嗗悎锛屼絾鏄彈鎬ц兘褰卞搷锛屽缓璁竴娆℃煡璇笉瓒呰繃10000涓�
+     * @return 鏂囦欢瀵硅薄鏄剧ず瀵硅薄
+     * @throws VciBaseException 鏌ヨ鍑虹幇寮傚父鏃朵細鎶涘嚭
+     */
+    Collection<VciFileObjectVO> listVciFileObjectByOids(Collection<String> oidCollections) throws VciBaseException;
+
+    /**
+     * 鍙傜収鏂囦欢瀵硅薄鍒楄〃
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉鍜屾帓搴�
+     * @return 鏂囦欢瀵硅薄鏄剧ず瀵硅薄鍒楄〃锛岀敓鏁堢殑鍐呭
+     * @throws VciBaseException 鏌ヨ鏉′欢鍜屽垎椤靛嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+     DataGrid<VciFileObjectVO> refDataGridVciFileObject(Map<String, String> conditionMap, PageHelper pageHelper) throws VciBaseException;
+
+    /**
+     * 鏂囦欢鐢熸晥
+     * @param fileOidCollection 鏂囦欢涓婚敭闆嗗悎
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 鍙戝竷鐨勬椂鍊欏嚭鐜伴敊璇殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    BaseResult releasedFile(Collection<String> fileOidCollection) throws VciBaseException;
+
+    /**
+     * 鏂囦欢鐢熸晥
+     * @param btmName 涓氬姟绫诲瀷鐨勫悕瀛�
+     * @param businessOid 涓氬姟鏁版嵁鐨勪富閿�
+     * @param fileOidCollection 鏂囦欢鐨勪富閿�
+     * @return 鎵ц鐨勭粨鏋�
+     * @throws VciBaseException 鍙戝竷鐨勬椂鍊欏嚭鐜伴敊璇細鎶涘嚭寮傚父
+     */
+    BaseResult releasedFile(String btmName,String businessOid,Collection<String> fileOidCollection) throws VciBaseException;
+
+    /**
+     * 鏌ヨ涓氬姟绫诲瀷鐨勬枃浠�
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉鍜屾帓搴忓璞�
+     * @param ownbizOid 涓氬姟绫诲瀷鐨勪富閿�
+     * @param ownbizBtm 涓氬姟绫诲瀷鍚嶇О
+     * @return 鏂囦欢鏄剧ず瀵硅薄鐨勫垪琛�
+     * @throws VciBaseException 鍙傛暟涓虹┖鍜屾煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    DataGrid<VciFileObjectVO> gridFilesByOwnbiz(Map<String, String> conditionMap, PageHelper pageHelper, String ownbizOid, String ownbizBtm) throws VciBaseException;
+
+    /**
+     * 鏌ヨ涓氬姟绫诲瀷鐨勬枃浠�
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉鍜屾帓搴忓璞�
+     * @param ownbizOid 涓氬姟绫诲瀷鐨勪富閿�
+     * @param ownbizBtm 涓氬姟绫诲瀷鍚嶇О
+     * @param docClassifyId 鏂囨。鐨勭被鍨�
+     * @return 鏂囦欢鏄剧ず瀵硅薄鐨勫垪琛�
+     * @throws VciBaseException 鍙傛暟涓虹┖鍜屾煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    DataGrid<VciFileObjectVO> gridFilesByOwnbiz(Map<String, String> conditionMap, PageHelper pageHelper, String ownbizOid, String ownbizBtm,String docClassifyId) throws VciBaseException;
+
+    /**
+     * 璇诲彇涓氬姟鏁版嵁鐨勬枃浠�
+     * @param ownbizOid 涓氬姟绫诲瀷涓婚敭
+     * @param ownbizBtm 涓氬姟绫诲瀷鍚嶇О
+     * @param docClassifyId 鏂囨。绫诲瀷缂栧彿
+     * @return 鏂囦欢鏄剧ず瀵硅薄鐨勫垪琛�
+     * @throws VciBaseException 鍙傛暟涓虹┖鍜屾煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    List<VciFileObjectVO> listFilesByOwnbiz(String ownbizOid, String ownbizBtm, String docClassifyId) throws VciBaseException;
+
+    /**
+     * 鎵归噺璇诲彇涓氬姟绫绘暟鎹殑鏂囦欢
+     * @param ownbizOidCollection 涓氬姟绫诲瀷涓婚敭闆嗗悎
+     * @param ownbizBtm 涓氬姟绫诲瀷鍚嶇О
+     * @param docClassifyId 鏂囨。绫诲瀷缂栧彿
+     * @return 鏂囦欢鏄剧ず瀵硅薄鐨勫垪琛�
+     * @throws VciBaseException 鍙傛暟涓虹┖鍜屾煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    List<VciFileObjectVO> batchListFilesByOwnbizs(Collection<String> ownbizOidCollection, String ownbizBtm, String docClassifyId) throws VciBaseException;
+
+    /**
+     * 鏍规嵁鍏抽敭淇℃伅鑾峰彇鏂囦欢淇℃伅
+     * @param keyInfoCollection 鍏抽敭淇℃伅
+     * @param docClassifyId 鏂囦欢鍒嗙被鐨勭紪鍙�
+     * @return 鏂囦欢鏄剧ず瀵硅薄锛屽彇data灞炴��
+     * @throws VciBaseException 鍙傛暟涓虹┖鍜屾煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    BaseResult<VciFileObjectVO> listFileObjectByKeyInfo(Collection<String> keyInfoCollection, String docClassifyId) throws VciBaseException;
+
+    /**
+     * 浣跨敤鍏抽敭淇℃伅缁熻涓暟
+     * @param keyInfoCollection 鍏抽敭淇℃伅闆嗗悎
+     * @param docClassifyId 鏂囨。鍒嗙被缂栧彿
+     * @return 涓暟
+     * @throws VciBaseException 鍙傛暟涓虹┖鍜屾煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    Long countByKeyInfo(Collection<String> keyInfoCollection, String docClassifyId) throws VciBaseException;
+
+    /**
+     * 鍒犻櫎鏂囦欢
+     * @param fileOids 鏂囦欢鐨勪富閿�
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 涓嶈兘鍒犻櫎锛屾枃浠朵笉瀛樺湪绛変細鎶涘嚭寮傚父
+     */
+    BaseResult deleteFiles(Collection<String> fileOids) throws VciBaseException;
+
+    /**
+     * 浣跨敤鏂囦欢鐨勮矾寰勮幏鍙栧璞�
+     * @param filePathList 鏂囦欢璺緞
+     * @param docClassifyId 鏂囨。鐨勭被鍨嬬紪鍙�
+     * @return 鏂囦欢鐨勬樉绀哄璞�
+     */
+    List<VciFileObjectVO> listFileObjectByPath(Collection<String> filePathList, String docClassifyId) ;
+}
+
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/VciFileQueryServiceI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/VciFileQueryServiceI.java
new file mode 100644
index 0000000..51a20fb
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/VciFileQueryServiceI.java
@@ -0,0 +1,140 @@
+package com.vci.web.service;
+
+import com.vci.file.pagemodel.VciFileObjectVO;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.starter.web.pagemodel.PageHelper;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 鏂囦欢鏌ヨ鏈嶅姟
+ * 浠�208椤圭洰鎷疯礉杩囨潵鍚庝慨鏀�
+ * @author weidy
+ * @date 2020/3/11
+ */
+public interface VciFileQueryServiceI {
+
+    /**
+     * 鏍规嵁涓婚敭鑾峰彇鏂囦欢瀵硅薄锛屼笉杩囨护瀵嗙骇
+     * @param fileOid 鏂囦欢鐨勪富閿�
+     * @return 鏂囦欢鐨勬樉绀哄璞�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欐姏鍑鸿繖涓紓甯�
+     */
+    VciFileObjectVO getFileObjectByOid(String fileOid) throws VciBaseException;
+
+    /**
+     * 鏍规嵁涓婚敭鑾峰彇鏂囦欢瀵硅薄锛屼笉杩囨护瀵嗙骇
+     * @param fileOidCollection 鏂囦欢涓婚敭鐨勯泦鍚�
+     * @return 鏂囦欢鐨勬樉绀哄璞″垪琛�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欐姏鍑鸿繖涓紓甯�
+     */
+    List<VciFileObjectVO> listFileObjectByOids(Collection<String> fileOidCollection) throws VciBaseException;
+
+    /**
+     * 鏍规嵁涓婚敭鑾峰彇鏂囦欢瀵硅薄
+     * @param fileOidCollection 鏂囦欢涓婚敭鐨勯泦鍚�
+     * @param filterSecret 杩囨护鏂囦欢鐨勫瘑绾�
+     * @return 鏂囦欢鐨勬樉绀哄璞″垪琛�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欐姏鍑鸿繖涓紓甯�
+     */
+    List<VciFileObjectVO> listFileObjectByOids(Collection<String> fileOidCollection,boolean filterSecret) throws VciBaseException;
+
+    /**
+     * 鏍规嵁涓婚敭鑾峰彇鏂囦欢瀵硅薄锛屼笉杩囨护瀵嗙骇
+     * @param fileOidCollection 鏂囦欢涓婚敭鐨勯泦鍚�
+     * @param fileIdTypeCollection 杩囨护鏂囨。鐨勭被鍨�
+     * @return 鏂囦欢鐨勬樉绀哄璞″垪琛�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欐姏鍑鸿繖涓紓甯�
+     */
+    List<VciFileObjectVO> listFileObjectByOids(Collection<String> fileOidCollection,Collection<String> fileIdTypeCollection) throws VciBaseException;
+
+    /**
+     * 鏍规嵁涓婚敭鑾峰彇鏂囦欢瀵硅薄
+     * @param fileOidCollection 鏂囦欢涓婚敭鐨勯泦鍚�
+     * @param filterSecret 杩囨护鏂囦欢鐨勫瘑绾�
+     * @param fileIdTypeCollection 杩囨护鏂囦欢鐨勭被鍨�
+     * @return 鏂囦欢鐨勬樉绀哄璞″垪琛�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欐姏鍑鸿繖涓紓甯�
+     */
+    List<VciFileObjectVO> listFileObjectByOids(Collection<String> fileOidCollection,boolean filterSecret,Collection<String> fileIdTypeCollection) throws VciBaseException;
+
+    /**
+     * 閫氳繃涓氬姟鏁版嵁鏉ヨ幏鍙栧搴旂殑鏂囦欢
+     * @param ownBtmName 涓氬姟绫诲瀷
+     * @param ownBizoid 鏁版嵁涓婚敭
+     * @return 鏂囦欢鐨勬樉绀哄璞″垪琛�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欐姏鍑鸿繖涓紓甯�
+     */
+    List<VciFileObjectVO> listFileObjectByOwnData(String ownBtmName, String ownBizoid) throws VciBaseException;
+
+    /**
+     * 閫氳繃涓氬姟鏁版嵁鏉ヨ幏鍙栧搴旂殑鏂囦欢
+     * @param ownBtmName 涓氬姟绫诲瀷
+     * @param ownBizoid 涓氬姟鏁版嵁
+     * @param filterSecret 杩囨护鏂囦欢瀵嗙骇
+     * @return 鏂囦欢鐨勬樉绀哄璞″垪琛�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欐姏鍑鸿繖涓紓甯�
+     */
+    List<VciFileObjectVO> listFileObjectByOwnData(String ownBtmName, String ownBizoid,boolean filterSecret) throws VciBaseException;
+
+    /**
+     * 閫氳繃涓氬姟鏁版嵁鏉ヨ幏鍙栧搴旂殑鏂囦欢
+     * @param ownBtmName 涓氬姟绫诲瀷
+     * @param ownBizoid 涓氬姟鏁版嵁
+     * @param filterSecret 杩囨护鏂囦欢瀵嗙骇
+     * @param fileIdTypeCollection 杩囨护鏂囦欢鐨勭被鍨�
+     * @return 鏂囦欢鐨勬樉绀哄璞″垪琛�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欐姏鍑鸿繖涓紓甯�
+     */
+    List<VciFileObjectVO> listFileObjectByOwnData(String ownBtmName, String ownBizoid,boolean filterSecret,Collection<String> fileIdTypeCollection) throws VciBaseException;
+
+    /**
+     * 鎵归噺鑾峰彇涓氬姟鏁版嵁涓叧鑱旂殑鏂囦欢,涓嶈繃婊ゆ枃浠跺瘑绾�
+     * @param bizOidMapBtmName 涓氬姟鏁版嵁涓婚敭锛坘ey)鍜屼笟鍔$被鍨�(value)鐨勬槧灏�
+     * @return 鏂囦欢鐨勬樉绀哄璞″垪琛ㄦ槧灏�,key鏄笟鍔$被鍨嬬殑鍚嶇О锛寁alue鏄枃浠舵樉绀哄璞″垪琛�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欐姏鍑鸿繖涓紓甯�
+     */
+    Map<String,List<VciFileObjectVO>> batchListFileObjectByOwnData(Map<String, String> bizOidMapBtmName) throws VciBaseException;
+
+    /**
+     * 鎵归噺鑾峰彇涓氬姟鏁版嵁涓叧鑱旂殑鏂囦欢,涓嶈繃婊ゆ枃浠跺瘑绾�
+     * @param bizOidMapBtmName 涓氬姟鏁版嵁涓婚敭锛坘ey)鍜屼笟鍔$被鍨�(value)鐨勬槧灏�
+     * @param filterSecret 杩囨护鏂囦欢瀵嗙骇
+     * @return 鏂囦欢鐨勬樉绀哄璞″垪琛ㄦ槧灏�,key鏄笟鍔$被鍨嬬殑鍚嶇О锛寁alue鏄枃浠舵樉绀哄璞″垪琛�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欐姏鍑鸿繖涓紓甯�
+     */
+    Map<String,List<VciFileObjectVO>> batchListFileObjectByOwnData(Map<String, String> bizOidMapBtmName,boolean filterSecret) throws VciBaseException;
+
+    /**
+     * 鎵归噺鑾峰彇涓氬姟鏁版嵁涓叧鑱旂殑鏂囦欢,涓嶈繃婊ゆ枃浠跺瘑绾�
+     * @param bizOidMapBtmName 涓氬姟鏁版嵁涓婚敭锛坘ey)鍜屼笟鍔$被鍨�(value)鐨勬槧灏�
+     * @param filterSecret 杩囨护鏂囦欢瀵嗙骇
+     * @param fileIdTypeCollection 杩囨护鏂囦欢鐨勭被鍨�
+     * @return 鏂囦欢鐨勬樉绀哄璞″垪琛ㄦ槧灏�,key鏄笟鍔$被鍨嬬殑鍚嶇О锛寁alue鏄枃浠舵樉绀哄璞″垪琛�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欐姏鍑鸿繖涓紓甯�
+     */
+    Map<String,List<VciFileObjectVO>> batchListFileObjectByOwnData(Map<String, String> bizOidMapBtmName,boolean filterSecret,Collection<String> fileIdTypeCollection) throws VciBaseException;
+
+    /**
+     * 鏍¢獙涓氬姟鏁版嵁涓槸鍚﹀瓨鍦ㄦ寚瀹氱殑鏂囦欢涓婚敭
+     * @param ownBtmName 涓氬姟绫诲瀷
+     * @param ownBizOid 涓氬姟鏁版嵁涓婚敭
+     * @param oidLists 鏂囦欢鐨勪富閿� 闆嗗悎
+     * @return 鏂囦欢鏌愪釜涓婚敭涓嶅湪涓氬姟绫诲瀷涓氨浼氳繑鍥瀎alse锛屽惁鍒欒繑鍥瀟rue
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欐姏鍑鸿繖涓紓甯�
+     */
+    boolean checkFilesExistInOwnBiz(String ownBtmName, String ownBizOid, Collection<String> oidLists) throws VciBaseException;
+
+    /**
+     * 鑾峰彇鏂囦欢鐨勫垪琛ㄦ暟鎹�
+     * @param conditionMap 鏌ヨ鏁版嵁
+     * @param pageHelper 鍒嗛〉锛屾帓搴忎俊鎭�
+     * @return 鏂囦欢鏄剧ず瀵硅薄鍒楄〃
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭杩欎釜寮傚父
+     */
+    DataGrid<VciFileObjectVO> gridFileObject(Map<String,String> conditionMap, PageHelper pageHelper) throws VciBaseException;
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/VciFileUploadServiceI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/VciFileUploadServiceI.java
new file mode 100644
index 0000000..d4aa3a7
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/VciFileUploadServiceI.java
@@ -0,0 +1,87 @@
+package com.vci.web.service;
+
+import com.vci.file.dto.VciFileObjectDTO;
+import com.vci.file.pagemodel.VciFileObjectVO;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.BaseResult;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.Collection;
+
+/**
+ * 鏂囦欢涓婁紶鐨勬湇鍔�
+ * 鏄寚鎶婃枃浠朵笂浼犲埌鏂囦欢瀛樺偍鏈嶅姟锛屼笉鏄痺eb鎴栬�呭叾浠栧鎴风涓婁紶鍒板悗鍙版湇鍔�
+ * @author weidy
+ * @date 2020/3/11
+ */
+public interface VciFileUploadServiceI {
+
+    /**
+     * 涓婁紶鍗曚釜鏂囦欢銆�
+     * @param multipartFile 涓婁紶鐨勫獟浣撴枃浠�
+     * @param fileObjectDTO 鏂囦欢鐨勬暟鎹紶杈撳璞★紝鍏朵腑鏂囦欢鏀寔鏂囦欢瀵硅薄鎴栬�呬簩杩涘埗鏁扮粍锛岃皑鎱庝娇鐢ㄤ簩杩涘埗鏁扮粍锛屽洜涓哄崰鐢ㄥ唴瀛樺お澶�
+     * @return 鏂囦欢鐨勬樉绀哄璞�
+     * @throws VciBaseException 涓婁紶鏂囦欢鍑洪敊鐨勬椂鍊欐姏鍑哄紓甯�
+     */
+    BaseResult uploadFile(MultipartFile multipartFile, VciFileObjectDTO fileObjectDTO) throws VciBaseException;
+
+    /**
+     * 灏嗗師涓氬姟鏁版嵁涓嬬殑鎵�鏈夋枃浠跺叡浜埌鍏朵粬鐨勪笟鍔$被鍨嬩笅
+     * @param sourceBtmName 鍘熶笟鍔$被鍨�
+     * @param sourceBusinessOid 鍘熶笟鍔℃暟鎹富閿�
+     * @param btmName 涓氬姟绫诲瀷
+     * @param businessOid 涓氬姟鏁版嵁涓婚敭
+     * @return 鍏变韩鍚庣殑鏂囦欢鏄剧ず瀵硅薄
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呬繚瀛樺嚭閿欑殑鏃跺�欐姏鍑哄紓甯�
+     */
+    BaseResult<VciFileObjectVO> shareFilesToBO(String sourceBtmName, String sourceBusinessOid, String btmName, String businessOid) throws VciBaseException;
+
+    /**
+     * 灏嗘枃浠跺叡浜埌鍏朵粬鐨勪笟鍔$被鍨嬩笅
+     * @param fileOid 鏂囦欢涓婚敭
+     * @param btmName 涓氬姟绫诲瀷
+     * @param businessOid 涓氬姟鏁版嵁涓婚敭
+     * @return 鍏变韩鍚庣殑鏂囦欢鏄剧ず瀵硅薄
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呬繚瀛樺嚭閿欑殑鏃跺�欐姏鍑哄紓甯�
+     */
+    BaseResult<VciFileObjectVO> shareFilesToBO(String fileOid, String btmName, String businessOid) throws VciBaseException;
+
+    /**
+     * 鎵归噺灏嗘枃浠跺叡浜埌鍏朵粬鐨勪笟鍔$被鍨嬩笅
+     * @param fileOidCollection 鏂囦欢涓婚敭闆嗗悎
+     * @param btmName 涓氬姟绫诲瀷
+     * @param businessOid 涓氬姟鏁版嵁涓婚敭
+     * @return 鍏变韩鍚庣殑鏂囦欢鏄剧ず瀵硅薄鍒楄〃
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呬繚瀛樺嚭閿欑殑鏃跺�欐姏鍑哄紓甯�
+     */
+    BaseResult<VciFileObjectVO> shareFilesToBO(Collection<String> fileOidCollection, String btmName, String businessOid) throws VciBaseException;
+
+    /**
+     * 鍒嗙墖涓婁紶銆�
+     * @param multipartFile 鐗囨枃浠�
+     * @param offSet 鏂囦欢鍋忕Щ浣嶇疆
+     * @param fileOid 鏂囦欢涓婚敭
+     * @return
+     * @throws VciBaseException
+     */
+    BaseResult<VciFileObjectVO> uploadFileForOtherService(MultipartFile multipartFile, long offSet, String fileOid) throws VciBaseException;
+
+    /**
+     * 鍏朵粬鏈嶅姟涓婁紶鏂囦欢涔嬪墠鍒濆鍖栨枃浠朵俊鎭�
+     * @param vciFileObjectDTOS 鏂囦欢淇℃伅浼犺緭瀵硅薄瀵硅薄
+     * @return
+     * @throws VciBaseException
+     */
+    BaseResult initUploadFileInfo(Collection<VciFileObjectDTO> vciFileObjectDTOS) throws VciBaseException;
+
+    /**
+     * 灏嗗師涓氬姟鏁版嵁涓嬬殑闈炶〃鍗曠浉鍏虫枃浠跺叡浜埌鍏朵粬鐨勪笟鍔$被鍨嬩笅
+     * @param sourceBtmName 鍘熶笟鍔$被鍨�
+     * @param sourceBusinessOid 鍘熶笟鍔℃暟鎹富閿�
+     * @param btmName 涓氬姟绫诲瀷
+     * @param businessOid 涓氬姟鏁版嵁涓婚敭
+     * @return 鍏变韩鍚庣殑鏂囦欢鏄剧ず瀵硅薄
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呬繚瀛樺嚭閿欑殑鏃跺�欐姏鍑哄紓甯�
+     */
+    BaseResult<VciFileObjectVO> shareAnnexFilesToBO(String sourceBtmName, String sourceBusinessOid, String btmName, String businessOid) throws VciBaseException;
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/VciFileVolumeServiceI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/VciFileVolumeServiceI.java
new file mode 100644
index 0000000..1c4e3c8
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/VciFileVolumeServiceI.java
@@ -0,0 +1,143 @@
+package com.vci.web.service;
+
+import com.vci.file.dto.VciFileVolumeDTO;
+import com.vci.file.pagemodel.VciFileVolumeVO;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.BaseResult;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.web.model.VciFileVolumeDO;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 鏂囦粨绠$悊鏈嶅姟鎺ュ彛
+ *
+ * @author weidy
+ * @date 2020-08-04
+ */
+public interface VciFileVolumeServiceI {
+    /**
+     * 鏌ヨ鎵�鏈夌殑鏂囦粨绠$悊
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉鍜屾帓搴�
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 鏌ヨ鏉′欢鍜屽垎椤靛嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    DataGrid<VciFileVolumeVO> gridVciFileVolume(Map<String, String> conditionMap, PageHelper pageHelper) throws VciBaseException;
+
+    /**
+     * 鎵归噺鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+     * @param vciFileVolumeDOs 鏁版嵁瀵硅薄鍒楄〃
+     * @return 鏄剧ず瀵硅薄
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呬笉瀛樺湪鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    List<VciFileVolumeVO> vciFileVolumeDO2VOs(Collection<VciFileVolumeDO>  vciFileVolumeDOs) throws VciBaseException;
+
+    /**
+     * 鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+     * @param  vciFileVolumeDO 鏁版嵁瀵硅薄
+     * @return 鏄剧ず瀵硅薄
+     * @throws VciBaseException 鎷疯礉灞炴�у嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    VciFileVolumeVO vciFileVolumeDO2VO(VciFileVolumeDO vciFileVolumeDO) throws VciBaseException;
+
+    /**
+     * 澧炲姞鏂囦粨绠$悊
+     * @param vciFileVolumeDTO 鏂囦粨绠$悊鏁版嵁浼犺緭瀵硅薄
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屽敮涓�椤癸紝蹇呰緭椤逛笉閫氳繃鏃朵細鎶涘嚭寮傚父
+     */
+    VciFileVolumeVO addSave(VciFileVolumeDTO vciFileVolumeDTO) throws VciBaseException;
+
+    /**
+     * 淇敼鏂囦粨绠$悊
+     * @param vciFileVolumeDTO 鏂囦粨绠$悊鏁版嵁浼犺緭瀵硅薄
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屽敮涓�椤癸紝蹇呰緭椤逛笉閫氳繃鏃朵細鎶涘嚭寮傚父
+     */
+    VciFileVolumeVO editSave(VciFileVolumeDTO vciFileVolumeDTO) throws VciBaseException;
+
+
+    /**
+     * 鍒犻櫎鏂囦粨绠$悊
+     * @param vciFileVolumeDTO 鏂囦粨绠$悊鏁版嵁浼犺緭瀵硅薄锛宱id鍜宼s闇�瑕佷紶杈�
+     * @return 鍒犻櫎缁撴灉鍙嶉锛氾細success锛氭垚鍔燂紝fail锛氬け璐�
+     * @throws VciBaseException 鍙傛暟涓虹┖锛岃寮曠敤鏃舵姏鍑哄紓甯�
+     */
+    BaseResult deleteVciFileVolume(VciFileVolumeDTO vciFileVolumeDTO) throws VciBaseException;
+
+    /**
+    * 涓婚敭鑾峰彇鏂囦粨绠$悊
+    * @param oid 涓婚敭
+    * @return 鏂囦粨绠$悊鏄剧ず瀵硅薄
+    * @throws VciBaseException 鍙傛暟涓虹┖锛屾暟鎹笉瀛樺湪鏃朵細鎶涘嚭寮傚父
+    */
+    VciFileVolumeVO getObjectByOid(String oid) throws VciBaseException;
+
+    /**
+     * 缂栧彿鑾峰彇鏂囦粨绠$悊
+     * @param id 缂栧彿
+     * @return 鏂囦粨绠$悊鏄剧ず瀵硅薄
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屾暟鎹笉瀛樺湪鏃朵細鎶涘嚭寮傚父
+     */
+    VciFileVolumeVO getObjectById(String id)  throws VciBaseException;
+
+    /**
+     * 涓婚敭鎵归噺鑾峰彇鏂囦粨绠$悊
+     * @param oidCollections 涓婚敭闆嗗悎锛屼絾鏄彈鎬ц兘褰卞搷锛屽缓璁竴娆℃煡璇笉瓒呰繃10000涓�
+     * @return 鏂囦粨绠$悊鏄剧ず瀵硅薄
+     * @throws VciBaseException 鏌ヨ鍑虹幇寮傚父鏃朵細鎶涘嚭
+     */
+    Collection<VciFileVolumeVO> listVciFileVolumeByOids(Collection<String> oidCollections) throws VciBaseException;
+
+    /**
+     * 鍚敤鏂囦粨绠$悊
+     * @param vciFileVolumeDTO 鏂囦粨绠$悊鏁版嵁浼犺緭瀵硅薄锛宱id鍜宼s闇�瑕佷紶杈�
+     * @return 鍚敤缁撴灉鍙嶉锛氾細success锛氭垚鍔燂紝fail锛氬け璐�
+     * @throws VciBaseException 鎵ц鍑虹幇寮傚父鏃朵細鎶涘嚭
+     */
+    BaseResult enableVciFileVolume(VciFileVolumeDTO vciFileVolumeDTO) throws VciBaseException;
+
+    /**
+     * 鍋滅敤{comments}
+     * @param vciFileVolumeDTO 鏂囦粨绠$悊鏁版嵁浼犺緭瀵硅薄锛宱id鍜宼s闇�瑕佷紶杈�
+     * @return 鍋滅敤缁撴灉鍙嶉锛氾細success锛氭垚鍔燂紝fail锛氬け璐�
+     * @throws VciBaseException 鎵ц鍑虹幇寮傚父鏃朵細鎶涘嚭
+     */
+    BaseResult disableVciFileVolume(VciFileVolumeDTO vciFileVolumeDTO) throws VciBaseException;
+
+
+    /**
+     * 鍙傜収鏂囦粨绠$悊鍒楄〃
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉鍜屾帓搴�
+     * @return 鏂囦粨绠$悊鏄剧ず瀵硅薄鍒楄〃锛岀敓鏁堢殑鍐呭
+     * @throws VciBaseException 鏌ヨ鏉′欢鍜屽垎椤靛嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+     DataGrid<VciFileVolumeVO> refDataGridVciFileVolume(Map<String, String> conditionMap, PageHelper pageHelper) throws VciBaseException;
+
+    /**
+     * 鏌ヨ鍏ㄩ儴
+     * @return 鏂囦粨
+     * @throws VciBaseException 鏌ヨ浼氭姏鍑哄紓甯�
+     */
+     List<VciFileVolumeDO> selectAll() throws VciBaseException;
+
+    /**
+     * 鏇存柊鍗风殑浣跨敤瀹归噺
+     * @param oid 涓婚敭
+     * @param usedVolume 浣跨敤瀹归噺
+     * @return 鍙楀奖鍝嶇殑琛屾暟
+     */
+     int updateUsedVolume(String oid,  long usedVolume);
+
+    /**
+     * 鑾峰彇涓婁紶鐨勯粯璁ゅ嵎
+     * @return 鍗峰璞�
+     */
+    VciFileVolumeDO getUploadVolume();
+}
+
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/VciMdServiceI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/VciMdServiceI.java
new file mode 100644
index 0000000..1abf3f1
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/VciMdServiceI.java
@@ -0,0 +1,24 @@
+package com.vci.web.service;
+
+import com.vci.starter.web.pagemodel.Tree;
+
+import java.util.List;
+
+/**
+ * markdown鐨勬湇鍔�
+ * @author weidy
+ * @date 2021-3-16
+ */
+public interface VciMdServiceI {
+
+    /**
+     * 鎵弿鎵�鏈夌殑md鏂囦欢
+     */
+    void scanAllMdFile();
+
+    /**
+     * 鑾峰彇md鏂囦欢鐨勫悕瀛�
+     * @return 鍚嶇О鐨勬爲褰㈠睍绀�
+     */
+    List<Tree> treeAllMD();
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/WFWorkflowNodeFavItemServiceI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/WFWorkflowNodeFavItemServiceI.java
new file mode 100644
index 0000000..704cfb5
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/WFWorkflowNodeFavItemServiceI.java
@@ -0,0 +1,99 @@
+package com.vci.web.service;
+
+
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.BaseResult;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.web.dto.WFWorkflowNodeFavItemDTO;
+import com.vci.web.model.WFWorkflowNodeFavItemDO;
+import com.vci.web.pageModel.WFWorkflowNodeFavItemVO;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 娴佺▼鏀惰棌鑺傜偣鏄庣粏鏈嶅姟鎺ュ彛
+ *
+ * @author weidy
+ * @date 2021-06-08
+ */
+public interface WFWorkflowNodeFavItemServiceI {
+    /**
+     * 鏌ヨ鎵�鏈夌殑娴佺▼鏀惰棌鑺傜偣鏄庣粏
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉鍜屾帓搴�
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 鏌ヨ鏉′欢鍜屽垎椤靛嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    DataGrid<WFWorkflowNodeFavItemVO> gridWFWorkflowNodeFavItem(Map<String, String> conditionMap, PageHelper pageHelper) throws VciBaseException;
+
+    /**
+     * 鎵归噺鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+     * @param wFWorkflowNodeFavItemDOs 鏁版嵁瀵硅薄鍒楄〃
+     * @return 鏄剧ず瀵硅薄
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呬笉瀛樺湪鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    List<WFWorkflowNodeFavItemVO> wFWorkflowNodeFavItemDO2VOs(Collection<WFWorkflowNodeFavItemDO> wFWorkflowNodeFavItemDOs) throws VciBaseException;
+
+    /**
+     * 鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+     * @param  wFWorkflowNodeFavItemDO 鏁版嵁瀵硅薄
+     * @return 鏄剧ず瀵硅薄
+     * @throws VciBaseException 鎷疯礉灞炴�у嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    WFWorkflowNodeFavItemVO wFWorkflowNodeFavItemDO2VO(WFWorkflowNodeFavItemDO wFWorkflowNodeFavItemDO) throws VciBaseException;
+
+    /**
+     * 澧炲姞娴佺▼鏀惰棌鑺傜偣鏄庣粏
+     * @param wFWorkflowNodeFavItemDTO 娴佺▼鏀惰棌鑺傜偣鏄庣粏鏁版嵁浼犺緭瀵硅薄
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屽敮涓�椤癸紝蹇呰緭椤逛笉閫氳繃鏃朵細鎶涘嚭寮傚父
+     */
+    WFWorkflowNodeFavItemVO addSave(WFWorkflowNodeFavItemDTO wFWorkflowNodeFavItemDTO) throws VciBaseException;
+
+    /**
+     * 淇敼娴佺▼鏀惰棌鑺傜偣鏄庣粏
+     * @param wFWorkflowNodeFavItemDTO 娴佺▼鏀惰棌鑺傜偣鏄庣粏鏁版嵁浼犺緭瀵硅薄
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屽敮涓�椤癸紝蹇呰緭椤逛笉閫氳繃鏃朵細鎶涘嚭寮傚父
+     */
+    WFWorkflowNodeFavItemVO editSave(WFWorkflowNodeFavItemDTO wFWorkflowNodeFavItemDTO) throws VciBaseException;
+
+
+    /**
+     * 鍒犻櫎娴佺▼鏀惰棌鑺傜偣鏄庣粏
+     * @param wFWorkflowNodeFavItemDTO 娴佺▼鏀惰棌鑺傜偣鏄庣粏鏁版嵁浼犺緭瀵硅薄锛宱id鍜宼s闇�瑕佷紶杈�
+     * @return 鍒犻櫎缁撴灉鍙嶉锛氾細success锛氭垚鍔燂紝fail锛氬け璐�
+     * @throws VciBaseException 鍙傛暟涓虹┖锛岃寮曠敤鏃舵姏鍑哄紓甯�
+     */
+    BaseResult deleteWFWorkflowNodeFavItem(WFWorkflowNodeFavItemDTO wFWorkflowNodeFavItemDTO) throws VciBaseException;
+
+    /**
+     * 涓婚敭鑾峰彇娴佺▼鏀惰棌鑺傜偣鏄庣粏
+     * @param oid 涓婚敭
+     * @return 娴佺▼鏀惰棌鑺傜偣鏄庣粏鏄剧ず瀵硅薄
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屾暟鎹笉瀛樺湪鏃朵細鎶涘嚭寮傚父
+     */
+    WFWorkflowNodeFavItemVO getObjectByOid(String oid) throws VciBaseException;
+
+    /**
+     * 涓婚敭鎵归噺鑾峰彇娴佺▼鏀惰棌鑺傜偣鏄庣粏
+     * @param oidCollections 涓婚敭闆嗗悎锛屼絾鏄彈鎬ц兘褰卞搷锛屽缓璁竴娆℃煡璇笉瓒呰繃10000涓�
+     * @return 娴佺▼鏀惰棌鑺傜偣鏄庣粏鏄剧ず瀵硅薄
+     * @throws VciBaseException 鏌ヨ鍑虹幇寮傚父鏃朵細鎶涘嚭
+     */
+    Collection<WFWorkflowNodeFavItemVO> listWFWorkflowNodeFavItemByOids(Collection<String> oidCollections) throws VciBaseException;
+
+
+
+    /**
+     * 鍙傜収娴佺▼鏀惰棌鑺傜偣鏄庣粏鍒楄〃
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉鍜屾帓搴�
+     * @return 娴佺▼鏀惰棌鑺傜偣鏄庣粏鏄剧ず瀵硅薄鍒楄〃锛岀敓鏁堢殑鍐呭
+     * @throws VciBaseException 鏌ヨ鏉′欢鍜屽垎椤靛嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    DataGrid<WFWorkflowNodeFavItemVO> refDataGridWFWorkflowNodeFavItem(Map<String, String> conditionMap, PageHelper pageHelper) throws VciBaseException;
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/WFWorkflowNodeFavServiceI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/WFWorkflowNodeFavServiceI.java
new file mode 100644
index 0000000..3d69a06
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/WFWorkflowNodeFavServiceI.java
@@ -0,0 +1,106 @@
+package com.vci.web.service;
+
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.BaseResult;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.web.dto.WFWorkflowNodeFavDTO;
+import com.vci.web.model.WFWorkflowNodeFavDO;
+import com.vci.web.pageModel.WFWorkflowNodeFavItemVO;
+import com.vci.web.pageModel.WFWorkflowNodeFavVO;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 娴佺▼璐熻矗浜烘敹钘忔湇鍔℃帴鍙�
+ *
+ * @author weidy
+ * @date 2021-06-08
+ */
+public interface WFWorkflowNodeFavServiceI {
+
+    /**
+     * 鏌ヨ鎵�鏈夌殑娴佺▼璐熻矗浜烘敹钘�
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉鍜屾帓搴�
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 鏌ヨ鏉′欢鍜屽垎椤靛嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    DataGrid<WFWorkflowNodeFavVO> gridWFWorkflowNodeFav(Map<String, String> conditionMap, PageHelper pageHelper) throws VciBaseException;
+
+    /**
+     * 鎵归噺鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+     * @param wFWorkflowNodeFavDOs 鏁版嵁瀵硅薄鍒楄〃
+     * @return 鏄剧ず瀵硅薄
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呬笉瀛樺湪鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    List<WFWorkflowNodeFavVO> wFWorkflowNodeFavDO2VOs(Collection<WFWorkflowNodeFavDO> wFWorkflowNodeFavDOs) throws VciBaseException;
+
+    /**
+     * 鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+     * @param  wFWorkflowNodeFavDO 鏁版嵁瀵硅薄
+     * @return 鏄剧ず瀵硅薄
+     * @throws VciBaseException 鎷疯礉灞炴�у嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    WFWorkflowNodeFavVO wFWorkflowNodeFavDO2VO(WFWorkflowNodeFavDO wFWorkflowNodeFavDO) throws VciBaseException;
+
+    /**
+     * 澧炲姞娴佺▼璐熻矗浜烘敹钘�
+     * @param wFWorkflowNodeFavDTO 娴佺▼璐熻矗浜烘敹钘忔暟鎹紶杈撳璞�
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屽敮涓�椤癸紝蹇呰緭椤逛笉閫氳繃鏃朵細鎶涘嚭寮傚父
+     */
+    WFWorkflowNodeFavVO addSave(WFWorkflowNodeFavDTO wFWorkflowNodeFavDTO) throws VciBaseException;
+
+    /**
+     * 淇敼娴佺▼璐熻矗浜烘敹钘�
+     * @param wFWorkflowNodeFavDTO 娴佺▼璐熻矗浜烘敹钘忔暟鎹紶杈撳璞�
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屽敮涓�椤癸紝蹇呰緭椤逛笉閫氳繃鏃朵細鎶涘嚭寮傚父
+     */
+    WFWorkflowNodeFavVO editSave(WFWorkflowNodeFavDTO wFWorkflowNodeFavDTO) throws VciBaseException;
+
+
+    /**
+     * 鍒犻櫎娴佺▼璐熻矗浜烘敹钘�
+     * @param wFWorkflowNodeFavDTO 娴佺▼璐熻矗浜烘敹钘忔暟鎹紶杈撳璞★紝oid鍜宼s闇�瑕佷紶杈�
+     * @return 鍒犻櫎缁撴灉鍙嶉锛氾細success锛氭垚鍔燂紝fail锛氬け璐�
+     * @throws VciBaseException 鍙傛暟涓虹┖锛岃寮曠敤鏃舵姏鍑哄紓甯�
+     */
+    BaseResult deleteWFWorkflowNodeFav(WFWorkflowNodeFavDTO wFWorkflowNodeFavDTO) throws VciBaseException;
+
+    /**
+     * 涓婚敭鑾峰彇娴佺▼璐熻矗浜烘敹钘�
+     * @param oid 涓婚敭
+     * @return 娴佺▼璐熻矗浜烘敹钘忔樉绀哄璞�
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屾暟鎹笉瀛樺湪鏃朵細鎶涘嚭寮傚父
+     */
+    WFWorkflowNodeFavVO getObjectByOid(String oid) throws VciBaseException;
+
+    /**
+     * 涓婚敭鎵归噺鑾峰彇娴佺▼璐熻矗浜烘敹钘�
+     * @param oidCollections 涓婚敭闆嗗悎锛屼絾鏄彈鎬ц兘褰卞搷锛屽缓璁竴娆℃煡璇笉瓒呰繃10000涓�
+     * @return 娴佺▼璐熻矗浜烘敹钘忔樉绀哄璞�
+     * @throws VciBaseException 鏌ヨ鍑虹幇寮傚父鏃朵細鎶涘嚭
+     */
+    Collection<WFWorkflowNodeFavVO> listWFWorkflowNodeFavByOids(Collection<String> oidCollections) throws VciBaseException;
+
+    /**
+     * 鍙傜収娴佺▼璐熻矗浜烘敹钘忓垪琛�
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉鍜屾帓搴�
+     * @return 娴佺▼璐熻矗浜烘敹钘忔樉绀哄璞″垪琛紝鐢熸晥鐨勫唴瀹�
+     * @throws VciBaseException 鏌ヨ鏉′欢鍜屽垎椤靛嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    DataGrid<WFWorkflowNodeFavVO> refDataGridWFWorkflowNodeFav(Map<String, String> conditionMap, PageHelper pageHelper) throws VciBaseException;
+
+    /**
+     * 浣跨敤鏂规涓婚敭鏉ヨ幏鍙栨槑缁�
+     * @param schemaOid 鏂规鐨勪富閿�
+     * @return 鏄庣粏鐨勫唴瀹�
+     * @throws VciBaseException 鏌ヨ鏉′欢鍜屽垎椤靛嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    List<WFWorkflowNodeFavItemVO> listNodeFavItemVOBySchema(String schemaOid) throws VciBaseException;
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/WebActionServiceI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/WebActionServiceI.java
new file mode 100644
index 0000000..8b8a995
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/WebActionServiceI.java
@@ -0,0 +1,18 @@
+package com.vci.web.service;
+
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.web.pageModel.UIActionVO;
+
+/**
+ * 骞冲彴鐨刟ction鏈嶅姟
+ * @author weidy
+ * @date 2019/9/9 13:38
+ */
+public interface WebActionServiceI {
+    /**
+     * action瀵硅薄
+     * @param oid 涓婚敭
+     * @return
+     */
+    UIActionVO getActionByOid(String oid) throws VciBaseException;
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/WebBoServiceI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/WebBoServiceI.java
new file mode 100644
index 0000000..2da3df4
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/WebBoServiceI.java
@@ -0,0 +1,634 @@
+package com.vci.web.service;
+
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.starter.web.wrapper.VciQueryWrapperForDO;
+import com.vci.web.pageModel.BatchCBO;
+import plm.bs.bom.clientobject.ClientBusinessObject;
+import plm.bs.bom.clientobject.ClientBusinessObjectOperation;
+import plm.bs.bom.clientobject.ClientLinkObject;
+import plm.corba.qt.QTServiceOperations;
+import plm.oq.objectQuery.common.Condition;
+import plm.oq.objectQuery.common.QueryTemplate;
+
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 涓氬姟绫诲瀷鎿嶄綔鏈嶅姟---鍙兘鍦╠ao灞傝皟鐢紝鍏朵粬鐨勬湇鍔′笉鍏佽浣跨敤
+ * 鑷姩灏佽浜嗗钩鍙扮浉鍏崇殑鎿嶄綔
+ * @author weidy
+ */
+public interface WebBoServiceI {
+
+	/**
+	 * 鏄惁浣跨敤鏁版嵁鏉冮檺杩囨护
+	 * 鍦ㄦ煡璇腑conditonMap閲岄潰璁剧疆杩欎釜key鍗冲彲
+	 */
+	 final String QUERY_FILTER_DATARIGHT = "${QUERY_FILTER_DATARIGHT}";
+
+	/**
+	 * 鏄惁浣跨敤瀵嗙骇杩囨护
+	 */
+	 final String QUERY_FILTER_SECRET="${QUERY_FILTER_SECRET}";
+
+	/**
+	 * 鍒濆鍖栦笟鍔$被鍨�
+	 * --绗竴娆¤皟鐢ㄧ殑鏃跺�欎細鐩稿鎱竴涓嬶紝鍚庣画鑾峰彇灏卞緢蹇殑
+	 * --娉ㄦ剰鍦ㄦ湇鍔″惎鍔ㄦ椂鎵嶄細娓呴櫎缂撳瓨
+	 * --鍒涘缓浜洪粯璁や负褰撳墠鐢ㄦ埛锛屽鏋滈渶瑕佷慨鏀癸紝鍙互鍦ㄨ幏鍙栧悗鑷澶勭悊
+	 * @param btmName 涓氬姟绫诲瀷鐨勫悕绉帮紝浼氳嚜鍔ㄥ彉鎴愬皬鍐�
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 ClientBusinessObject createCBOByBtmName(String btmName) throws VciBaseException;
+	
+	/**
+	 * 鏍规嵁鏌ヨ鏉′欢鏉ユ煡璇笟鍔$被鍨嬩笅鐨勬暟鎹�
+	 * @param btmType 涓氬姟绫诲瀷鐨勫悕绉帮紝浼氳嚜鍔ㄥ彉鎴愬皬鍐�
+	 * @param conditionMap 鏌ヨ鏉′欢锛屾敞鎰忎粙浜�...涔嬮棿浣跨敤xxx_start鍜寈xx_end
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 List<ClientBusinessObject> queryCBO(String btmType, Map<String, String> conditionMap) throws VciBaseException;
+	
+	/**
+	 * 鏀寔鎺掑簭鍜屽垎椤电殑鏌ヨ涓氬姟绫诲瀷涓嬬殑鏁版嵁
+	 * @param btmType 涓氬姟绫诲瀷鐨勫悕绉�
+	 * @param conditionMap 鏌ヨ鏉′欢锛屾敞鎰忎粙浜�...涔嬮棿浣跨敤xxx_start鍜寈xx_end
+	 * @param ph 鎺掑簭鍜屽垎椤�
+	 * @return 
+	 * @throws VciBaseException
+	 */
+	 List<ClientBusinessObject> queryCBO(String btmType, Map<String, String> conditionMap, PageHelper ph) throws VciBaseException;
+	
+	/**
+	 * 鏀寔鑷畾涔夋煡璇㈠瓧娈碉紙鍖呮嫭鍙傜収銆佹灇涓惧拰鐢熷懡鍛ㄦ湡锛�
+	 * @param btmType 涓氬姟绫诲瀷
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @param ph 鍒嗛〉鍜屾帓搴�
+	 * @param clauseList 鏌ヨ瀛楁锛屽弬鐓у瓧娈典娇鐢▁xxx.yy;鏋氫妇瀛楁浣跨敤xxx_enumCode;鐢熷懡鍛ㄦ湡浼氳嚜鍔ㄥ鐞嗕负lcStatus_text
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 List<ClientBusinessObject> queryCBO(String btmType, Map<String, String> conditionMap, PageHelper ph, List<String> clauseList) throws VciBaseException;
+
+	/**
+	 * 鎷疯礉鍒嗛〉鍜屾帓搴忕殑璁剧疆鍒版煡璇㈡ā鏉�
+	 * @param qt 鏌ヨ锛屾ā鏉�
+	 * @param pageHelper 鍒嗛〉瀵硅薄
+	 */
+	void setPageAndOrderToQT(QueryTemplate qt, PageHelper pageHelper);
+
+	/**
+	 * 鏌ヨ鏋氫妇鐨勪俊鎭�
+	 * @param cbo 涓氬姟鏁版嵁
+	 * @param clo 閾炬帴灞炴��
+	 * @param enumAttrName 鏋氫妇鐨勫悕绉�
+	 * @throws VciBaseException 鏌ヨ鏋氫妇鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+	 */
+	void queryEnumText(ClientBusinessObject cbo, ClientLinkObject clo, List<String> enumAttrName) throws VciBaseException;
+
+	/**
+	 * 缁欓摼鎺ョ被鍨嬭缃睘鎬�
+	 * @param clo 閾炬帴绫诲瀷
+	 * @param attributeName 灞炴�х殑鍚嶇О
+	 * @param attributeValue 灞炴�х殑鍊�
+	 */
+     void setAttributeValueForClo(ClientLinkObject clo, String attributeName, String attributeValue);
+
+    /**
+	 * 浣跨敤鏌ヨ鏂规鏉ユ煡璇㈡暟鎹紝杩斿洖CBO
+	 * @param queryScheme 鏌ヨ鏂规
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @param replaceMap 鏇挎崲鏌ヨ鏂规閲岀殑鍙橀噺鍊�
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 List<ClientBusinessObject> queryCBOByScheme(String queryScheme, Map<String, String> conditionMap, Map<String, String> replaceMap) throws VciBaseException;
+	
+	/**
+	 * 浣跨敤鏌ヨ鏂规鏉ユ煡璇㈡暟鎹紝杩斿洖CBO锛屾敮鎸佸垎椤�
+	 * @param queryScheme 鏌ヨ鏂规
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @param replaceMap 鏇挎崲鏌ヨ鏂规閲岀殑鍙橀噺鍊�
+	 * @param ph 鍒嗛〉鍜屾帓搴�
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 List<ClientBusinessObject> queryCBOByScheme(String queryScheme, Map<String, String> conditionMap, Map<String, String> replaceMap, PageHelper ph) throws VciBaseException;
+
+	/**
+	 * 浣跨敤鍚嶅瓧鑾峰彇鏌ヨ妯℃澘
+	 * @param name 鍚嶇О
+	 * @param replaceMap 婧愭暟鎹�
+	 * @return 鏌ヨ妯℃澘
+	 * @throws VciBaseException 鏌ヨ鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+	 */
+	QueryTemplate getQtByName(String name, Map<String, String> replaceMap) throws VciBaseException;
+
+	/**
+	 *  浣跨敤鏌ヨ鏂规鏉ユ煡璇㈡暟鎹紝杩斿洖CBO锛屾敮鎸佽嚜瀹氫箟鏌ヨ瀛楁锛屽寘鎷弬鐓у拰鏋氫妇;鍙傜収瀛楁浣跨敤xxx.yy;鏋氫妇瀛楁浣跨敤xxx_enumCode
+	 * @param queryScheme 鏌ヨ鏂规
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @param replaceMap 鏇挎崲鏌ヨ鏂规閲岀殑鍙橀噺鍊�
+	 * @param ph 鍒嗛〉鍜屾帓搴�
+	 * @param clauseList 鏌ヨ瀛楁
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 List<ClientBusinessObject> queryCBOByScheme(String queryScheme, Map<String, String> conditionMap, Map<String, String> replaceMap, PageHelper ph, List<String> clauseList) throws VciBaseException;
+	
+	/**
+	 * 鏌ヨ鏁伴噺
+	 * @param btmType 涓氬姟绫诲瀷鍚嶇О
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @return
+	 * @throws VciBaseException
+	 */
+     int queryCount(String btmType, Map<String, String> conditionMap) throws VciBaseException;
+
+	/**
+	 * 浣跨敤sql鏌ヨ涓暟锛屾渶缁堢殑瀛楁蹇呴』鏄痗ount
+	 * @param sql 鏌ヨ鐨剆ql
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @return 涓暟锛�
+	 * @throws VciBaseException 鏌ヨ鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+	 */
+	int queryCountBySql(String sql,Map<String,String> conditionMap) throws VciBaseException;
+    
+    /**
+     * 浣跨敤鏌ヨ鏂规鏉ユ煡璇㈡暟閲�
+     * @param queryScheme 鏌ヨ鏂规
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param replaceMap 鏇挎崲鏌ヨ鏂规閲岀殑鍙橀噺鍊�
+     * @return
+     * @throws VciBaseException
+     */
+     int queryCountByScheme(String queryScheme, Map<String, String> conditionMap, Map<String, String> replaceMap) throws VciBaseException;
+    
+    /**
+     * 浣跨敤瀵硅薄鏉ユ煡璇㈡暟閲�
+     * @param c 瀵硅薄鎵�灞炵被
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @return
+     * @throws VciBaseException
+     */
+     int queryCount(Class c, Map<String, String> conditionMap) throws VciBaseException;
+
+    /**
+     * 鏍规嵁sql璇彞鏉ユ煡璇㈠唴瀹�
+     * @param sql 涓轰簡闃叉SQL娉ㄥ叆锛屽�煎繀椤诲湪sql璇彞閲屼互:xxx鏍煎紡锛屽 id =:idvalue锛岀劧鍚庡湪conditionMap涓坊鍔犲缓涓篿dvalue鐨勬牸寮�
+     * @param conditionMap 鏌ヨ鏉′欢锛屽繀椤讳笌sql閲屽搴�
+     * @return CBO
+     * @throws VciBaseException
+     */
+     List<ClientBusinessObject> queryBySql(String sql, Map<String, String> conditionMap) throws VciBaseException;
+
+	/**
+	 * 鍙敤sql璇彞鏌ヨ锛岃繖涓拰queryBySql鍖哄埆鏄紝鐗规畩鐨剆ql(濡傚寘鍚湁鍑芥暟鐨�)鍙互鐢ㄨ繖涓柟娉曪紝浣嗘槸鏈塻ql娉ㄥ叆椋庨櫓
+	 * @param sql sql璇彞锛屾煡璇㈡潯浠跺繀椤昏嚜琛屽湪鍏朵腑澶勭悊瀹屾垚
+	 * @return CBO
+	 * @throws VciBaseException 鏌ヨ鍑洪敊娲绘姏鍑哄紓甯�
+	 */
+	List<ClientBusinessObject> queryByOnlySql(String sql) throws VciBaseException;
+
+	/**
+	 * 鍙敤sql璇彞鏌ヨ锛岃繖涓拰queryBySqlForMap鍖哄埆鏄紝鐗规畩鐨剆ql(濡傚寘鍚湁鍑芥暟鐨�)鍙互鐢ㄨ繖涓柟娉曪紝浣嗘槸鏈塻ql娉ㄥ叆椋庨櫓
+	 * @param sql sql璇彞锛屾煡璇㈡潯浠跺繀椤昏嚜琛屽湪鍏朵腑澶勭悊瀹屾垚
+	 * @return 鏁版嵁鏄犲皠
+	 * @throws VciBaseException 鏌ヨ鍑洪敊娲绘姏鍑哄紓甯�
+	 */
+	List<Map> queryByOnlySqlForMap(String sql) throws VciBaseException;
+
+	/**
+	 * 浣跨敤sql璇彞鏌ヨ鍚庤浆鎹负瀵硅薄
+	 * @param sql sql璇彞
+	 * @param tClass 瀵硅薄鐨勭被
+	 * @param <T> 娉涘瀷
+	 * @return 鏁版嵁鐨勫垪琛�
+	 * @throws VciBaseException 鏌ヨ鍜岃浆鎹㈠嚭閿欎細鎶涘嚭寮傚父
+	 */
+	<T> List<T> queryByOnlySqlForObj(String sql, Class<T> tClass) throws VciBaseException;
+
+	/**
+     * 鏍规嵁sql璇彞鏉ユ煡璇㈠唴瀹癸紝杩斿洖Map
+     * @param sql 涓轰簡闃叉SQL娉ㄥ叆锛屽�煎繀椤诲湪sql璇彞閲屼互:xxx鏍煎紡锛屽 id =:idvalue锛岀劧鍚庡湪conditionMap涓坊鍔犲缓涓篿dvalue鐨勬牸寮�
+     * @param conditionMap  鏌ヨ鏉′欢锛屽繀椤讳笌sql閲屽搴�
+     * @return map鏁版嵁
+     * @throws VciBaseException
+     */
+     List<Map> queryBySqlForMap(String sql, Map<String, String> conditionMap) throws VciBaseException;
+	/**
+	 * 鏍规嵁sql璇彞鏉ユ煡璇㈠唴瀹癸紝杩斿洖Map
+	 * @param sql 涓轰簡闃叉SQL娉ㄥ叆锛屽�煎繀椤诲湪sql璇彞閲屼互:xxx鏍煎紡锛屽 id =:idvalue锛岀劧鍚庡湪conditionMap涓坊鍔犲缓涓篿dvalue鐨勬牸寮�
+	 * @param conditionMap  鏌ヨ鏉′欢锛屽繀椤讳笌sql閲屽搴�
+	 * @param selectKeys 鏌ヨ鐨勫瓧娈�
+	 * @return  map鏁版嵁
+	 * @throws VciBaseException
+	 */
+	List<Map> queryBySqlForMap(String sql, Map<String, String> conditionMap,  String[] selectKeys) throws VciBaseException;
+    
+    /**
+     * 鏌ヨ鏁版嵁锛岃繑鍥炲璞★紝瀵硅薄鐨勫瓧娈典笂鍙互璁剧疆鍙傜収鍜屾灇涓�
+     * @param c 瀵硅薄鎵�灞炵被
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @return
+     * @throws VciBaseException
+     */
+     <T> List<T> queryObject(Class<T> c, Map<String, String> conditionMap) throws VciBaseException;
+    
+    /**
+     * 鏌ヨ鏁版嵁锛岃繑鍥炲璞★紝鏀寔鍒嗛〉
+     * @param c 瀵硅薄鎵�灞炵被
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param ph 鍒嗛〉缁勪欢
+     * @return
+     * @throws VciBaseException
+     */
+     <T> List<T> queryObject(Class<T> c, Map<String, String> conditionMap, PageHelper ph) throws VciBaseException;
+    
+    /**
+     * 浣跨敤鏌ヨ鏂规鏉ユ煡璇㈡暟鎹紝杩斿洖瀵硅薄锛屾敮鎸佸垎椤�
+     * @param queryScheme 鏌ヨ鏂规
+     * @param c 瀵硅薄鎵�灞炵被
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param ph 鍒嗛〉缁勪欢
+     * @return
+     * @throws VciBaseException
+     */
+     <T> List<T> queryObjectByScheme(String queryScheme, Class<T> c, Map<String, String> conditionMap, PageHelper ph) throws VciBaseException;
+    
+    /**
+     * 浣跨敤鏌ヨ鏂规鏉ユ煡璇㈡暟鎹紝杩斿洖瀵硅薄锛屾敮鎸佸垎椤�
+     * @param queryScheme 鏌ヨ鏂规
+     * @param c 瀵硅薄鎵�灞炵被
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param ph 鍒嗛〉缁勪欢
+     * @param replaceMap 鏇挎崲鏌ヨ鏂规涓殑鍙橀噺鍊�
+     * @return
+     * @throws VciBaseException
+     */
+     <T> List<T> queryObjectByScheme(String queryScheme, Class<T> c, Map<String, String> conditionMap, PageHelper ph, Map<String, String> replaceMap) throws VciBaseException;
+
+	/**
+	 * 淇濆瓨鏁版嵁锛屽彲浠ュ湪request涓缃槸鍚︽寔涔呭寲
+	 * @param obj 瑕佷繚瀛樼殑瀵硅薄
+	 * @param <T>
+	 * @return 淇濆瓨鍚庡寘鍚殑鏁版嵁瀵硅薄
+	 * @throws VciBaseException
+	 */
+	<T> BatchCBO addSave(T obj) throws VciBaseException;
+
+	/**
+	 * 鎵归噺淇濆瓨鏁版嵁锛屽彲浠ュ湪request閲岃缃笉鎸佷箙鍖�
+	 * @param list 瑕佷繚瀛樼殑鏁版嵁瀵硅薄鍒楄〃
+	 * @return 闇�瑕佸垱寤虹殑CBO,CLO;闇�瑕佷慨鏀圭殑CBO,CLO;闇�瑕佸垹闄ょ殑CBO,CLO
+	 * @throws VciBaseException
+	 */
+	<T> BatchCBO batchAddSave(List<T> list) throws VciBaseException;
+
+
+	/**
+	 * 淇敼鏁版嵁锛屽彲浠ュ湪request閲岃缃笉鎸佷箙鍖�
+	 * @param obj 淇敼鏁版嵁瀵硅薄
+	 * @return 闇�瑕佸垱寤虹殑CBO,CLO;闇�瑕佷慨鏀圭殑CBO,CLO;闇�瑕佸垹闄ょ殑CBO,CLO
+	 * @throws VciBaseException
+	 */
+	<T> BatchCBO editSave(T obj) throws VciBaseException;
+
+	/**
+	 * 鎵归噺淇敼鏁版嵁锛屽彲浠ュ湪request閲岃缃笉鎸佷箙鍖�
+	 * @param list 瑕佷繚瀛樼殑鏁版嵁瀵硅薄鍒楄〃
+	 * @return 闇�瑕佸垱寤虹殑CBO,CLO;闇�瑕佷慨鏀圭殑CBO,CLO;闇�瑕佸垹闄ょ殑CBO,CLO
+	 * @throws VciBaseException
+	 */
+	<T> BatchCBO batchEditSave(List<T> list) throws VciBaseException;
+
+
+	/**
+	 * 鍒犻櫎鏁版嵁锛屽彲浠ュ湪request閲岃缃笉鎸佷箙鍖�
+	 * @param obj 鍒犻櫎鏁版嵁瀵硅薄
+	 * @return 闇�瑕佸垱寤虹殑CBO,CLO;闇�瑕佷慨鏀圭殑CBO,CLO;闇�瑕佸垹闄ょ殑CBO,CLO
+	 * @throws VciBaseException
+	 */
+	<T> BatchCBO delete(T obj,boolean checkRefered) throws VciBaseException;
+	<T> BatchCBO delete(T obj) throws VciBaseException;
+
+	/**
+	 * 鎵归噺鍒犻櫎鏁版嵁锛屽彲浠ュ湪request閲岃缃笉鎸佷箙鍖�
+	 * @param list 闇�瑕佸垹闄ゆ暟鎹璞″垪琛�
+	 * @return 闇�瑕佸垱寤虹殑CBO,CLO;闇�瑕佷慨鏀圭殑CBO,CLO;闇�瑕佸垹闄ょ殑CBO,CLO,checkRefered:[false/true]鏄惁妫�鏌ヨ寮曠敤锛岄粯璁や笉妫�鏌�
+	 * @throws VciBaseException
+	 */
+	<T> BatchCBO batchDelete(List<T> list,boolean checkRefered) throws VciBaseException;
+
+	<T> BatchCBO batchDelete(List<T> list) throws VciBaseException;
+
+
+    
+    /**
+     * 鏍规嵁鏌ヨ鏉′欢鏉ュ垹闄ゆ暟鎹�
+     * @param c 鍒犻櫎鏁版嵁瀵硅薄鎵�灞炵被
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @return 闇�瑕佸垱寤虹殑CBO,CLO;闇�瑕佷慨鏀圭殑CBO,CLO;闇�瑕佸垹闄ょ殑CBO,CLO
+     * @throws VciBaseException
+     */
+     <T> BatchCBO deleteByCondition(Class<T> c, Map<String, String> conditionMap) throws VciBaseException;
+    
+    /**
+     * 鏍规嵁鏌ヨ鏉′欢鏉ュ垹闄ゆ暟鎹�
+     * @param btmType 涓氬姟绫诲瀷鍚嶇О
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @return 闇�瑕佸垱寤虹殑CBO,CLO;闇�瑕佷慨鏀圭殑CBO,CLO;闇�瑕佸垹闄ょ殑CBO,CLO
+     * @throws VciBaseException
+     */
+     <T> BatchCBO deleteByCondition(String btmType, Map<String, String> conditionMap) throws VciBaseException;
+    
+    /**
+     * 閫氳繃sql璇彞鏉ュ垹闄�
+     * @param sql 闃叉SQL娉ㄥ叆锛屽�煎繀椤讳娇鐢�:xxx鏂瑰紡锛屽id=:idvalue锛屽苟鍦╟onditionMap閲屾斁缃甶dvalue涓簁ey鐨勬暟鎹�
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @return 鍒犻櫎鐨勬暟鎹噺
+     * @throws VciBaseException
+     */
+     BatchCBO deleteBySql(String sql, Map<String, String> conditionMap) throws VciBaseException;
+
+    /**
+     * 妫�楠屾槸鍚︿负鏈�鏂扮殑
+     * @param obj 鏁版嵁瀵硅薄锛岄噷闈㈠繀椤诲寘鎷富閿拰ts瀛楁
+     * @return 鐩哥瓑鏃朵负true
+     * @throws VciBaseException
+     */
+     boolean checkTs(Object obj) throws VciBaseException;
+    
+    /**
+     * 鏍规嵁涓氬姟绫诲瀷鏉ユ煡璇㈠垪琛ㄦ暟鎹紱
+     * @param btmType 涓氬姟绫诲瀷鍚嶇О
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @return 鍒楄〃鏁版嵁锛屾暟鎹槸Map褰㈠紡鐨勶紝鍖呭惈鍒嗛〉淇℃伅
+     * @throws VciBaseException
+     */
+     DataGrid queryGridByBo(String btmType, Map<String, String> conditionMap) throws VciBaseException;
+    
+    /**
+     * 鏍规嵁涓氬姟绫诲瀷鏉ユ煡璇㈠垪琛ㄦ暟鎹紱鍙互鍦╬ageHelper涓缃槸鍚︽煡璇㈡�绘暟
+     * @param btmType 涓氬姟绫诲瀷鍚嶇О
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param ph 鍒嗛〉鍜屾帓搴忕粍浠�
+     * @return 鍒楄〃鏁版嵁锛屾暟鎹槸Map褰㈠紡鐨勶紝鍖呭惈鍒嗛〉淇℃伅
+     * @throws VciBaseException
+     */
+     DataGrid queryGridByBo(String btmType, Map<String, String> conditionMap, PageHelper ph) throws VciBaseException;
+    
+    /**
+     * 鏍规嵁涓氬姟绫诲瀷鏉ユ煡璇㈠垪琛ㄦ暟鎹紱鍙互璁剧疆瑕佹煡璇㈢殑瀛楁锛屽寘鎷弬鐓у拰鏋氫妇瀛楁锛涘彲浠ュ湪pageHelper涓缃槸鍚︽煡璇㈡�绘暟
+     * @param btmType 涓氬姟绫诲瀷鍚嶇О
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param ph 鍒嗛〉鍜屾帓搴忕粍浠�
+     * @param clauseList 鍒楄〃鏁版嵁锛屾暟鎹槸Map褰㈠紡鐨勶紝
+     * @return 鍒楄〃鏁版嵁锛屾暟鎹槸Map褰㈠紡鐨勶紝鍖呭惈鍒嗛〉淇℃伅
+     * @throws VciBaseException
+     */
+     DataGrid queryGridByBo(String btmType, Map<String, String> conditionMap, PageHelper ph, List<String> clauseList) throws VciBaseException;
+    
+    /**
+     * 鏍规嵁鏌ヨ鏂规鏉ユ煡璇㈠垪琛ㄦ暟鎹紱
+     * @param queryScheme 鏌ヨ鏂规
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @return 鍒楄〃鏁版嵁锛屾暟鎹槸Map褰㈠紡鐨勶紝鍖呭惈鍒嗛〉淇℃伅
+     * @throws VciBaseException
+     */
+     DataGrid queryGridByScheme(String queryScheme, Map<String, String> conditionMap) throws VciBaseException;
+    
+    /**
+     * 鏍规嵁鏌ヨ鏂规鏉ユ煡璇㈠垪琛ㄦ暟鎹紱
+     * @param queryScheme 鏌ヨ鏂规
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param replaceMap 鏇挎崲鏌ヨ鏂规鐨勫彉閲忓��
+     * @return 鍒楄〃鏁版嵁锛屾暟鎹槸Map褰㈠紡鐨勶紝鍖呭惈鍒嗛〉淇℃伅
+     * @throws VciBaseException
+     */
+     DataGrid queryGridByScheme(String queryScheme, Map<String, String> conditionMap, Map<String, String> replaceMap) throws VciBaseException;
+    
+    /**
+     * 鏍规嵁鏌ヨ鏂规鏉ユ煡璇㈠垪琛ㄦ暟鎹紱鍙互鍦╬ageHelper涓缃槸鍚︽煡璇㈡�绘暟锛宲ageHelper鐨勪紭鍏堢骇鏈�澶э紱
+     * @param queryScheme 鏌ヨ鏂规
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param replaceMap 鏇挎崲鏌ヨ鏂规鐨勫彉閲忓��
+     * @param ph 鍒嗛〉鍜屾帓搴忓瓧娈�
+     * @return 鍒楄〃鏁版嵁锛屾暟鎹槸Map褰㈠紡鐨勶紝鍖呭惈鍒嗛〉淇℃伅
+     * @throws VciBaseException
+     */
+     DataGrid queryGridByScheme(String queryScheme, Map<String, String> conditionMap, Map<String, String> replaceMap, PageHelper ph) throws VciBaseException;
+    
+    /**
+     * 鏍规嵁鏌ヨ鏂规鏉ユ煡璇㈠垪琛ㄦ暟鎹紝鍙互鑷畾涔夋煡璇㈢殑鍒楋紝鍖呮嫭鍙傜収鍜屾灇涓�
+     * @param queryScheme 鏌ヨ鏂规
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param replaceMap 鏇挎崲鏌ヨ鏂规鐨勫彉閲忓��
+     * @param ph 鍒嗛〉鍜屾帓搴忓瓧娈�
+     * @param clauseList 鏌ヨ鐨勫垪锛屽弬鐓т娇鐢▁x.yy锛涙灇涓句娇鐢▁x_enumCode;
+     * @return 鍒楄〃鏁版嵁锛屾暟鎹槸Map褰㈠紡鐨勶紝鍖呭惈鍒嗛〉淇℃伅
+     * @throws VciBaseException
+     */
+     DataGrid queryGridByScheme(String queryScheme, Map<String, String> conditionMap, Map<String, String> replaceMap, PageHelper ph, List<String> clauseList) throws VciBaseException;
+    
+    /**
+     * 鏌ヨ瀵硅薄鐨勫垪琛ㄦ暟鎹� 
+     * @param c 鏌ヨ瀵硅薄鎵�灞炵被
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @return 鍒楄〃鏁版嵁锛屾暟鎹槸瀵硅薄褰㈠紡鐨勶紝鍖呭惈鍒嗛〉淇℃伅
+     * @throws VciBaseException
+     */
+     DataGrid queryGridClass(Class c, Map<String, String> conditionMap) throws VciBaseException;
+    
+    /**
+     * 鏌ヨ瀵硅薄鐨勫垪琛ㄦ暟鎹�
+     * @param c 鏌ヨ瀵硅薄鎵�灞炵被
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param ph 鍒嗛〉鍜屾帓搴忓瓧娈碉紝鍙互璁剧疆鏄惁鏌ヨ鎬绘暟
+     * @return 鍒楄〃鏁版嵁锛屾暟鎹槸瀵硅薄褰㈠紡鐨勶紝鍖呭惈鍒嗛〉淇℃伅
+     * @throws VciBaseException
+     */
+     DataGrid queryGridClass(Class c, Map<String, String> conditionMap, PageHelper ph) throws VciBaseException;
+    
+    /**
+     * 閫氳繃鏌ヨ鏂规鏌ヨ瀵硅薄鐨勫垪琛ㄦ暟鎹�
+     * @param queryScheme 鏌ヨ鏂规
+     * @param c 鏌ヨ瀵硅薄鎵�灞炵被
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @return 鍒楄〃鏁版嵁锛屾暟鎹槸瀵硅薄褰㈠紡鐨勶紝鍖呭惈鍒嗛〉淇℃伅
+     * @throws VciBaseException
+     */
+     DataGrid queryGridClassByScheme(String queryScheme, Class c, Map<String, String> conditionMap, Map<String, String> replaceMap) throws VciBaseException;
+    
+    /**
+     * 閫氳繃鏌ヨ鏂规鏌ヨ瀵硅薄鐨勫垪琛ㄦ暟鎹�
+     * @param queryScheme 鏌ヨ鏂规
+     * @param c 鏌ヨ瀵硅薄鎵�灞炵被
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param ph 鍒嗛〉鍜屾帓搴忓瓧娈碉紝鍙互璁剧疆鏄惁鏌ヨ鎬绘暟
+     * @return 鍒楄〃鏁版嵁锛屾暟鎹槸瀵硅薄褰㈠紡鐨勶紝鍖呭惈鍒嗛〉淇℃伅
+     * @throws VciBaseException
+     */
+     DataGrid queryGridClassByScheme(String queryScheme, Class c, Map<String, String> conditionMap, Map<String, String> replaceMap, PageHelper ph) throws VciBaseException;
+	
+    /**
+     * ClientBusinessObject 杞负HashMap
+     * @param cbos CBOS
+     * @return map
+     * @throws VciBaseException
+     */
+     List<Map> cbos2Map(List<ClientBusinessObject> cbos) throws VciBaseException;
+    
+    /**
+     * ClientBusinessObject 杞负HashMap
+     * @param cbo
+     * @return
+     * @throws VciBaseException
+     */
+     Map cbo2Map(ClientBusinessObject cbo) throws VciBaseException;
+    
+    /**
+     * map杞负clientBusinessObject
+     * @param map 
+     * @return
+     * @throws VciBaseException
+     */
+     List<ClientBusinessObject> map2Cbos(List<Map> map) throws VciBaseException;
+    
+    /**
+     * map杞负clientBusinessObject
+     * @param map
+     * @return
+     * @throws VciBaseException
+     */
+     ClientBusinessObject map2Cbo(Map map) throws VciBaseException;
+    
+    /**
+     * 鎵归噺淇濆瓨涓氬姟绫诲瀷鍜岄摼鎺ョ被鍨嬬殑淇℃伅
+     * @param batchCbos 鎵归噺鏁版嵁瀹瑰櫒
+     * @throws VciBaseException
+     */
+     void persistenceBatch(BatchCBO batchCbos) throws VciBaseException;
+    
+    /**
+     * 鎵归噺淇濆瓨涓氬姟绫诲瀷鍜岄摼鎺ョ被鍨嬬殑淇℃伅---鍙湁纭繚鏁版嵁瀹瑰櫒閲屾湁鍙傜収瀛楁锛屾灇涓惧瓧娈电瓑鍐呭鐨勬椂鍊欙紝鎵嶈皟鐢ㄨ繖涓柟娉曪紝鍥犱负杩欎釜鏂规硶鎬ц兘浣庝笅
+     * @param batchCbos 鎵归噺鏁版嵁瀹瑰櫒
+     * @param isCheckReferColumn 鏄惁鏍¢獙鏄惁鍚湁鍙傜収瀛楁
+     * @throws VciBaseException
+     */
+     void persistenceBatch(BatchCBO batchCbos, boolean isCheckReferColumn) throws VciBaseException;
+
+	/**
+	 * 鑾峰彇鏌ヨ鏉′欢锛�
+	 * @param conditionMap
+	 * @return
+	 */
+	Condition getConditionByMap(Map<String, String> conditionMap);
+
+	/**
+	 * 鏍规嵁灞炴�ф潵鏌ヨ涓婚敭
+	 * @param referInfo  涓氬姟绫诲瀷.灞炴�у悕
+	 * @param value 灞炴�х殑鍊�
+	 * @return
+	 * @throws VciBaseException
+	 */
+    Map<String,String> queryOidByPropertie(String referInfo, List<String> value) throws VciBaseException;
+
+	/**
+	 * 鏍¢獙鐗瑰畾灞炴�х殑鍊兼槸鍚﹀瓨鍦�
+	 * @param btmName 涓氬姟绫诲瀷
+	 * @param columnName 鍒楀悕绉�
+	 * @param columnValues 鍒楃殑鍊�
+	 * @return
+	 * @throws VciBaseException
+	 */
+    boolean checkDataExsitByColumn(String btmName, String columnName, Collection<String> columnValues) throws VciBaseException;
+
+	/**
+	 * 鏍¢獙鐗瑰畾灞炴�х殑鍊兼槸鍚﹀瓨鍦�
+	 * @param btmName 涓氬姟绫诲瀷
+	 * @param columnName 鍒楀悕绉�
+	 * @param columnValues 鍒楃殑鍊�
+	 * @return
+	 * @throws VciBaseException
+	 */
+    boolean checkDataExsitByColumn(String btmName, String columnName, String columnValues) throws VciBaseException;
+    
+    /**
+     * 浣跨敤涓婚敭鑾峰彇瀵硅薄
+     * @param oid 涓婚敭
+     * @param doClass 鏁版嵁瀵硅薄鐨勭被
+     * @return 鏁版嵁瀵硅薄
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屾暟鎹璞′笉瀛樺湪浼氭姏鍑哄紓甯�
+     */
+    <T> T selectByOid(String oid, Class<T> doClass) throws VciBaseException;
+
+	/**
+	 * 浣跨敤涓婚敭鑾峰彇瀵硅薄
+	 * @param oid 涓婚敭
+	 * @param btmName 涓氬姟绫诲瀷鐨勫悕绉�
+	 * @return cbo
+	 * @throws VciBaseException 鍙傛暟涓虹┖锛屾暟鎹笉瀛樺湪浼氭姏鍑哄紓甯�
+	 */
+	ClientBusinessObject selectCBOByOid(String oid,String btmName) throws VciBaseException;
+    
+    /**
+     * 浣跨敤涓婚敭闆嗗悎鑾峰彇瀵硅薄
+     * @param oidCollection 涓婚敭闆嗗悎
+     * @param doClass 鏁版嵁瀵硅薄鐨勭被
+     * @return 鏁版嵁瀵硅薄锛� 涓虹┖鐨勬椂鍊欏垪琛ㄤ负绌猴紝涓嶆槸Null
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屾煡璇㈠嚭閿欎細鎶涘嚭寮傚父
+     */
+    <T> List<T> selectByOidCollection(Collection<String> oidCollection, Class<T> doClass) throws VciBaseException;
+
+	/**
+	 * 浣跨敤涓婚敭闆嗗悎鑾峰彇瀵硅薄
+	 * @param oidCollection 涓婚敭闆嗗悎
+	 * @param btmName 涓氬姟绫诲瀷鐨勫悕绉�
+	 * @return 涓氬姟鏁版嵁鐨勯泦鍚�
+	 * @throws VciBaseException 鍙傛暟涓虹┖锛屾煡璇㈠嚭閿欎細鎶涘嚭寮傚父
+	 */
+	List<ClientBusinessObject> selectCBOByOidCollection(Collection<String> oidCollection,String btmName) throws VciBaseException;
+
+	/**
+	 * 浣跨敤鏂扮殑鏌ヨ灏佽鍣ㄦ潵鏌ヨ
+	 * @param queryWrapperForDO 鏌ヨ灏佽鍣�
+	 * @param doClass 瀵硅薄鐨勬墍灞炵被
+	 * @param <T> 娉涘瀷
+	 * @return 鏁版嵁
+	 * @throws VciBaseException 鏌ヨ鍑洪敊鐨勪細鎶涘嚭寮傚父
+	 */
+    <T> List<T> selectByQueryWrapper(VciQueryWrapperForDO queryWrapperForDO,Class<T> doClass) throws VciBaseException;
+
+	/**
+	 * 浣跨敤鏂扮殑鏌ヨ灏佽鍣ㄦ潵鏌ヨ鎬绘暟
+	 * @param queryWrapperForDO 鏌ヨ灏佽鍣�
+	 * @param doClass 瀵硅薄鐨勬墍灞炵被
+	 * @param <T> 娉涘瀷
+	 * @return 鏁版嵁
+	 * @throws VciBaseException 鏌ヨ鍑洪敊鐨勪細鎶涘嚭寮傚父
+	 */
+    <T> int countByQueryWrapper(VciQueryWrapperForDO queryWrapperForDO,Class<T> doClass) throws VciBaseException;
+
+	/**
+	 * 鏄惁涓轰慨鏀瑰拷鐣ョ殑灞炴��
+	 * @param attrName 灞炴�х殑鍚嶅瓧
+	 * @return true 琛ㄧず搴旇蹇界暐
+	 */
+	default boolean checkUnAttrUnEdit(String attrName){
+		return  (VciQueryWrapperForDO.OID_FIELD.equalsIgnoreCase(attrName)
+				||"ts".equalsIgnoreCase(attrName)
+				|| "lastmodifier".equalsIgnoreCase(attrName)
+				|| "lastmodifytime".equalsIgnoreCase(attrName)
+				|| "createtime".equalsIgnoreCase(attrName)
+				|| "checkintime".equalsIgnoreCase(attrName)
+				||"checkouttime".equalsIgnoreCase(attrName));
+	}
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/WebBtmIOServiceI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/WebBtmIOServiceI.java
new file mode 100644
index 0000000..0d3c01f
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/WebBtmIOServiceI.java
@@ -0,0 +1,50 @@
+package com.vci.web.service;
+
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.web.dto.OsBtmTypeExportDTO;
+import plm.corba.btm.BtmItem;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 瀵硅薄寤烘ā鐩稿叧鐨勫鍏�
+ * @author weidy
+ * @date 2021/8/13
+ */
+public interface WebBtmIOServiceI {
+
+
+    /**
+     * 瀵煎叆涓氬姟绫诲瀷鍜岄摼鎺ョ被鍨嬶紝鍖呭惈灞炴�э紝鏋氫妇锛岀姸鎬侊紝鐢熷懡鍛ㄦ湡锛岀増鏈鍒欑瓑鍏ㄥ鍐呭
+     *
+     * @param importBtmTypeDTO 闇�瑕佸鍏ョ殑涓氬姟绫诲瀷锛岄摼鎺ョ被鍨嬬瓑鍐呭
+     * @throws VciBaseException
+     */
+    void importBtmTypes(OsBtmTypeExportDTO importBtmTypeDTO) throws VciBaseException;
+
+    /**
+     * 鎵归噺娣诲姞涓氬姟绫诲瀷
+     * @param btmItems 涓氬姟绫诲瀷鐨勫璞�
+     */
+    void batchAddBtm(Collection<BtmItem> btmItems);
+
+    /**
+     * 鎵归噺娣诲姞涓氬姟绫诲瀷
+     * @param btmItems 涓氬姟绫诲瀷鐨勫璞�
+     */
+    void batchEditBtm(Collection<BtmItem> btmItems);
+
+    /**
+     * 瀵煎嚭涓氬姟绫诲瀷鐨勪俊鎭埌Word涓�
+     * @param btmTypeIdCollection 涓氬姟绫诲瀷鐨勭紪鍙烽泦鍚�
+     * @return word鐨勫叏璺緞
+     */
+    String exportBtmTypesToWord(Collection<String> btmTypeIdCollection);
+    /**
+     * 瀵煎嚭涓氬姟绫诲瀷鐨勪俊鎭埌Excel涓�
+     * @param btmTypeIdCollection 涓氬姟绫诲瀷鐨勭紪鍙烽泦鍚�
+     * @return excel鐨勫叏璺緞
+     */
+    String exportBtmTypesToExcel(Collection<String> btmTypeIdCollection);
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/WebHomeTaskServiceI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/WebHomeTaskServiceI.java
new file mode 100644
index 0000000..69f9b06
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/WebHomeTaskServiceI.java
@@ -0,0 +1,57 @@
+package com.vci.web.service;
+
+
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.web.dto.WebHomeTaskActionDTO;
+import com.vci.web.pageModel.WebHomeTaskActionVO;
+
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * 棣栭〉寰呭姙浠诲姟
+ * @author weidy
+ * @date 2021-2-22
+ */
+public interface WebHomeTaskServiceI {
+    /**
+     * 鑾峰彇褰撳墠鐢ㄦ埛鐨勯椤靛緟鍔炰换鍔$殑鏁伴噺
+     * @return 鏄剧ず瀵硅薄
+     * @throws VciBaseException
+     */
+    List<WebHomeTaskActionVO> listMyHomeTask() ;
+
+    /**
+     * 娣诲姞棣栭〉寰呭姙浠诲姟鐨刟ction
+     * @param action 鏁版嵁浼犺緭瀵硅薄
+     */
+    void addAction(WebHomeTaskActionDTO action);
+
+    /**
+     * 淇敼寰呭姙浠诲姟鐨刟ction淇℃伅
+     * @param action 鏁版嵁浼犺緭瀵硅薄
+     */
+    void editAction(WebHomeTaskActionDTO action);
+
+    /**
+     * 鍒犻櫎寰呭姙浠诲姟鐨刟ction淇℃伅
+     * @param action 鏁版嵁浼犺緭瀵硅薄
+     */
+    void deleteAction(WebHomeTaskActionDTO action);
+
+    /**
+     * 鏌ヨ鎵�鏈夌殑寰呭姙浠诲姟鍔ㄤ綔瀹氫箟
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉淇℃伅
+     */
+    DataGrid dataGrid(Map<String, String> conditionMap, PageHelper pageHelper) ;
+
+    /**
+     * 鑾峰彇褰撳墠鐢ㄦ埛锛岀敤浜庣紦瀛樹腑銆傘�傘�傚埆鐨勫湴鏂逛笉瑕佽皟鐢�
+     * @return 褰撳墠鐢ㄦ埛鐨勪富閿�
+     */
+    String getCurrentUserOid();
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/WebLoServiceI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/WebLoServiceI.java
new file mode 100644
index 0000000..a070f16
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/WebLoServiceI.java
@@ -0,0 +1,314 @@
+package com.vci.web.service;
+
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.web.query.UILinkTypeDataQuery;
+import plm.bs.bom.clientobject.ClientBusinessObject;
+import plm.bs.bom.clientobject.ClientLinkObject;
+import plm.bs.bom.clientobject.ClientLinkObjectOperation;
+import plm.bs.bom.common.AttributeValue;
+import plm.bs.bom.common.LinkObject;
+import plm.corba.qt.BOAndLO;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+public interface WebLoServiceI {
+
+
+	/**
+	 * 鑾峰彇骞冲彴鐨勯摼鎺ョ被鍨嬬殑鎿嶄綔绫�
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 ClientLinkObjectOperation getLoOption() throws VciBaseException;
+
+	/**
+	 * 鏍规嵁鏌ヨ鏉′欢鏉ユ煡璇㈤摼鎺ョ被鍨�
+	 * @param linkType 閾炬帴绫诲瀷
+	 * @param conditionMap
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 List<ClientLinkObject>  queryCLO(String linkType, Map<String, String> conditionMap) throws VciBaseException;
+
+	/**
+	 * 鏍规嵁鏌ヨ鏉′欢鏉ユ煡璇㈤摼鎺ョ被鍨�
+	 * @param linkType 閾炬帴绫诲瀷
+	 * @param toBtmname to绔殑涓氬姟绫诲瀷
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 List<ClientBusinessObject> queryLinkCbo(String linkType, String toBtmname, Map<String, String> conditionMap) throws VciBaseException;
+
+	/**
+	 * 鏌ヨ閾炬帴绫诲瀷
+	 * @param linkType 閾炬帴绫诲瀷
+	 * @param toBtmName to 绔殑涓氬姟绫诲瀷
+	 * @param level 鏌ヨ绾у埆
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 List<ClientLinkObject> queryCLO(String linkType, String toBtmName, int level, Map<String, String> conditionMap) throws VciBaseException;
+
+	/**
+	 * 鏌ヨto绔殑涓氬姟绫诲瀷
+	 * @param linkType 閾炬帴绫诲瀷
+	 * @param toBtmname to绔殑涓氬姟绫诲瀷
+	 * @param level 绾у埆
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 List<ClientBusinessObject> queryLinkCbo(String linkType, String toBtmname, int level, Map<String, String> conditionMap) throws VciBaseException;
+
+	/**
+	 * 鏌ヨ閾炬帴绫诲瀷
+	 * @param linkType 閾炬帴绫诲瀷
+	 * @param toBtmName to绔殑涓氬姟绫诲瀷
+	 * @param level 绾у埆
+	 * @param isDirection 鏄惁鍙嶅悜
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 List<ClientLinkObject> queryCLO(String linkType, String toBtmName,
+                                     int level, boolean isDirection, Map<String, String> conditionMap)
+			throws VciBaseException;
+
+	/**
+	 * 鏌ヨ閾炬帴绫诲瀷
+	 * @param linkType 閾炬帴绫诲瀷
+	 * @param toBtmName to绔殑涓氬姟绫诲瀷
+	 * @param level 绾у埆
+	 * @param isDirection 鏄惁鍙嶅悜
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @param ph 鍒嗛〉瀵硅薄
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 List<ClientLinkObject> queryCLO(String linkType, String toBtmName,
+                                     int level, boolean isDirection, Map<String, String> conditionMap, PageHelper ph)
+			throws VciBaseException;
+
+	/**
+	 * 鏌ヨto绔殑涓氬姟绫诲瀷
+	 * @param linkType 閾炬帴绫诲瀷
+	 * @param toBtmname to绔殑涓氬姟绫诲瀷
+	 * @param level 绾у埆
+	 * @param isDirection 鍙嶅悜
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 List<ClientBusinessObject> queryLinkCbo(String linkType, String toBtmname,
+                                             int level, boolean isDirection, Map<String, String> conditionMap)
+			throws VciBaseException;
+
+	/**
+	 * 鏌ヨ閾炬帴绫诲瀷鏌愮鐨勪笟鍔$被鍨�
+	 * @param lo 閾炬帴绫诲瀷瀵硅薄
+	 * @param isDirection 鏄惁鍙嶅悜
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 Map<String,ClientBusinessObject> queryLinkedCbo(LinkObject[] lo, boolean isDirection) throws VciBaseException;
+
+	/**
+	 *鏌ヨ閾炬帴绫诲瀷鏌愮鐨勪笟鍔$被鍨�
+	 * @param los 閾炬帴绫诲瀷瀵硅薄
+	 * @param isDirection 鏄惁鍙嶅悜
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 Map<String,ClientBusinessObject> queryLinkedCbo(List los, boolean isDirection) throws VciBaseException;
+
+	/**
+	 *鏌ヨ閾炬帴绫诲瀷鏌愮鐨勪笟鍔$被鍨�
+	 * @param clo 閾炬帴绫诲瀷瀵硅薄
+	 * @param isDirection 鏄惁鍙嶅悜
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 Map<String,ClientBusinessObject> queryLinkedCbo(ClientLinkObject[] clo, boolean isDirection) throws VciBaseException;
+
+	/**
+	 * 鏌ヨ閾炬帴绫诲瀷鏌愮鐨勪笟鍔$被鍨�
+	 * @param clol 閾炬帴绫诲瀷
+	 * @param isDirection 鏄惁鍙嶅悜
+	 * @param queryColumn 瑕佹煡璇㈢殑鍒�
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 Map<String, ClientBusinessObject> queryLinkedCbo(ClientLinkObject[] clol,
+                                                      boolean isDirection, List<String> queryColumn) throws VciBaseException;
+
+	/**
+	 * 鏌ヨ閾炬帴绫诲瀷鏌愮鐨勪笟鍔$被鍨�
+	 * @param los 閾炬帴绫诲瀷
+	 * @param isDirection 鏄惁鍙嶅悜
+	 * @param queryColumn 瑕佹煡璇㈢殑鍒�
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 Map<String, ClientBusinessObject> queryLinkedCbo(List los,
+                                                      boolean isDirection, List<String> queryColumn) throws VciBaseException;
+	
+	 /**
+     * ClientLinkObject 杞负HashMap
+     * @param clos clos
+     * @return map
+     * @throws VciBaseException
+     */
+     List<Map> clos2Map(List<ClientLinkObject> clos) throws VciBaseException;
+    
+    /**
+     * ClientLinkObject 杞负HashMap
+     * @param clo
+     * @return
+     * @throws VciBaseException
+     */
+     Map clo2Map(ClientLinkObject clo) throws VciBaseException;
+    
+    /**
+     * map杞负ClientLinkObject
+     * @param map 
+     * @return
+     * @throws VciBaseException
+     */
+     List<ClientLinkObject> map2Clos(List<Map> map) throws VciBaseException;
+    
+    /**
+     * map杞负ClientLinkObject
+     * @param map
+     * @return
+     * @throws VciBaseException
+     */
+     ClientLinkObject map2Clo(Map map) throws VciBaseException;
+
+	/**
+	 * 淇濆瓨閾炬帴绫诲瀷瀵硅薄
+	 * @param clos 淇濆瓨鐨勪笟鍔$被鍨嬪璞�
+	 * @return
+	 * @throws VciBaseException
+	 */
+	List<ClientLinkObject> saveClientLinkObjects(List<ClientLinkObject> clos) throws VciBaseException;
+
+	/**
+	 * 鍒涘缓杩炴帴绫诲瀷
+	 * @param loName
+	 * @return
+	 * @throws VciBaseException
+	 */
+	ClientLinkObject createClientLinkObject(String loName) throws VciBaseException;
+
+	/**
+	 * 鎷疯礉閾炬帴绫诲瀷
+	 * @param clo 閾炬帴绫诲瀷瀵硅薄
+	 * @return
+	 * @throws VciBaseException
+	 */
+	ClientLinkObject cloneClientLinkObject(ClientLinkObject clo) throws VciBaseException;
+
+	/**
+	 * 鍒犻櫎閾炬帴绫诲瀷
+	 * @param clos 閾炬帴绫诲瀷鐨勫唴瀹�
+	 * @throws VciBaseException
+	 */
+	void deleteClientLinkObjects(List<ClientLinkObject> clos) throws VciBaseException;
+
+	/**
+	 * 鏇存柊閾炬帴绫诲瀷
+	 * @param clos 閾炬帴绫诲瀷鐨勫璞�
+	 * @throws VciBaseException 鎵ц鍑洪敊浼氭姏鍑哄紓甯�
+	 */
+	void updateClientLinkObject(List<ClientLinkObject> clos) throws VciBaseException;
+
+	/**
+	 * 鏌ヨ閾炬帴绫诲瀷鍜屼笟鍔$被鍨�
+	 * @param linkTypeDataQuery 鏌ヨ瀵硅薄
+	 * @return 閾炬帴绫诲瀷鍜屽叧鑱旂殑to绔�
+	 */
+	List<BOAndLO> queryCLOAndBOBySchema(UILinkTypeDataQuery linkTypeDataQuery) ;
+
+	/**
+	 * 浣跨敤閾炬帴绫诲瀷鐨勫悕绉版煡璇� 閾炬帴绫诲瀷鐨則o绔殑涓氬姟绫诲瀷
+	 * @param linkTypeDataQuery 鏌ヨ鐨勫璞�
+	 * @return 閾炬帴瀵硅薄鍜宼o绔笟鍔″璞�
+	 */
+	List<BOAndLO> queryCLOAndBoByLinkType(UILinkTypeDataQuery linkTypeDataQuery);
+
+	/**
+	 * 鏌ヨ鍒楄〃
+	 * @param linkTypeDataQuery 鏌ヨ鐨勫璞�
+	 * @return 鍒楄〃鐨勬暟鎹�
+	 */
+    DataGrid queryGridByScheme(UILinkTypeDataQuery linkTypeDataQuery);
+
+	/**
+	 * 閾炬帴绫诲瀷鏌ヨ鏁伴噺
+	 * @param linkType 閾炬帴绫诲瀷
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @return 灞炴��
+	 */
+    Integer queryCount(String linkType, Map<String, String> conditionMap);
+
+	/**
+	 * 閾炬帴绫诲瀷鏌ヨ鏁伴噺
+	 *
+	 * @param linkType     閾炬帴绫诲瀷
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @param isDirection 鏄惁鍙嶅悜
+	 * @param level 灞傜骇
+	 * @return 涓暟
+	 */
+	Integer queryCount(String linkType, Map<String, String> conditionMap, boolean isDirection, Integer level);
+
+	/**
+	 * 閾炬帴绫诲瀷
+	 * @param clo 閾炬帴绫诲瀷
+	 * @param attributeName 灞炴�у悕绉�
+	 * @param attributeValue 灞炴�х殑鍊�
+	 */
+	public default void setAttribute(ClientLinkObject clo,String attributeName,String attributeValue){
+		AttributeValue[] attrValues =clo.getLinkObject().newAttrValList;
+		ArrayList<AttributeValue> attrValList = new ArrayList();
+		AttributeValue attrVal;
+		int i;
+		if (attrValues != null && attrValues.length > 0) {
+			AttributeValue[] var9 = attrValues;
+			i = attrValues.length;
+
+			for(int var7 = 0; var7 < i; ++var7) {
+				attrVal = var9[var7];
+				attrValList.add(attrVal);
+			}
+		}
+
+		attrVal = null;
+		boolean isExist = false;
+
+		for(i = 0; i < attrValList.size(); ++i) {
+			attrVal = (AttributeValue)attrValList.get(i);
+			if (attrVal.attrName.toUpperCase().equals(attributeName.toUpperCase())) {
+				attrVal.attrVal = attributeValue;
+				isExist = true;
+				break;
+			}
+		}
+
+		if (!isExist) {
+			attrVal = new AttributeValue();
+			attrVal.attrName = attributeName.toUpperCase();
+			attrVal.attrVal = attributeValue;
+			attrValList.add(attrVal);
+		}
+
+		clo.getLinkObject().newAttrValList = (AttributeValue[])attrValList.toArray(new AttributeValue[attrValList.size()]);
+	};
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/WebLogServiceI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/WebLogServiceI.java
new file mode 100644
index 0000000..42f4745
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/WebLogServiceI.java
@@ -0,0 +1,9 @@
+package com.vci.web.service;
+
+import com.vci.web.bo.VciLogObjectBO;
+
+public interface WebLogServiceI {
+	
+	 void addOperateLog(VciLogObjectBO logObject);
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/WebProcessCommandServiceI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/WebProcessCommandServiceI.java
new file mode 100644
index 0000000..fcb67d2
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/WebProcessCommandServiceI.java
@@ -0,0 +1,133 @@
+package com.vci.web.service;
+
+import com.vci.rmip.workflow.server.template.TasksAssigned;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.web.dto.ProcessStartConfigDTO;
+import com.vci.web.pageModel.ProcessUserVO;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.Collection;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 娴佺▼鎵ц鐩稿叧鏈嶅姟
+ * @author weidy
+ *
+ */
+public interface WebProcessCommandServiceI {
+
+	/**
+	 * 閮ㄧ讲娴佺▼
+	 * @param name 娴佺▼鍚嶇О
+	 * @param type 娴佺▼鍒嗙被
+	 * @param key 娴佺▼key
+	 * @param xmlContext xml鍐呭
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 boolean deploy(String name, String type, String key, String xmlContext) throws VciBaseException;
+	
+	/**
+	 * 鍚姩娴佺▼
+	 * @param config 鍚姩娴佺▼鐩稿叧閰嶇疆
+	 * @param processNodeUsers 鍚勪釜鑺傜偣鐨勮礋璐d汉淇℃伅
+	 * @param variablesInfo 鐩稿叧鍙橀噺
+	 * @throws VciBaseException
+	 */
+	 void startProcess(ProcessStartConfigDTO config, Map<String, List<ProcessUserVO>> processNodeUsers, Map<String, String> variablesInfo) throws VciBaseException;
+	
+	/**
+	 * 鎵ц娴佺▼浠诲姟 
+	 * @param taskIds 浠诲姟涓婚敭锛屽涓换鍔′娇鐢ㄩ�楀彿鍒嗛殧
+	 * @param outCome 璺敱
+	 * @param note 瀹℃壒鎰忚
+	 * @param nextTaskUser 涓嬩竴浠诲姟鐨勫鐞嗕汉锛屽鏋滃彂璧锋祦绋嬬殑鏃跺�欐病鏈夎缃鐞嗕汉鏃舵墠璁剧疆
+	 * @throws VciBaseException 
+	 */
+	 void completeTasks(String taskIds, String outCome, String note, List<ProcessUserVO> nextTaskUser) throws VciBaseException;
+	
+	/**
+	 * 杞淳浠诲姟
+	 * @param taskOids 浠诲姟涓婚敭
+	 * @param userIds 鏂扮殑鐢ㄦ埛鐨勭敤鎴峰悕锛屽彧鑳芥槸涓�涓敤鎴�
+	 * @throws VciBaseException 
+	 */
+	 void setPrincipal(String taskOids, String userIds) throws VciBaseException;
+	
+	
+	/**
+	 * 寮�濮嬩唬鐞�
+	 * @param userId 鐢ㄦ埛鍚�
+	 * @param startDate 寮�濮嬫椂闂达紝鍙互涓虹┖锛涢粯璁ゅ綋鍓嶆椂闂�
+	 * @param endDate 缁撴潫鏃堕棿锛屽彲浠ヤ负绌猴紱榛樿姘镐箙鐢熸晥
+	 * @param isNowEnable 鏄惁绔嬪嵆鐢熸晥---閮借缃负true
+	 * @throws VciBaseException
+	 */
+	 void beginProxy(String userId, Date startDate, Date endDate, boolean isNowEnable) throws VciBaseException;
+	
+	/**
+	 * 鍏抽棴浠g悊
+	 * @throws VciBaseException
+	 */
+	 void endProxy() throws VciBaseException;
+	
+	/**
+	 * 鑾峰彇褰撳墠鐢ㄦ埛鐨勬祦绋嬩唬鐞嗕汉
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 TasksAssigned getProxy() throws VciBaseException;
+
+
+	/**
+	 * 缁堟娴佺▼
+	 * @param executionId 娴佺▼鎵ц瀹炰緥id
+	 * @param note
+	 */
+	 void endProcess(String executionId, String note) throws VciBaseException;
+
+	/***
+	 * 鎸傝捣娴佺▼
+	 * @param executionId 娴佺▼鎵ц瀹炰緥
+	 * @param note
+	 * @throws VciBaseException
+	 */
+	 void suspendProcess(String executionId, String note) throws VciBaseException;
+
+	/**
+	 * 鎭㈠娴佺▼
+	 * @param executionId 娴佺▼涓婚敭
+	 * @throws VciBaseException
+	 */
+	 void resumeProcess(String executionId) throws VciBaseException;
+
+	/**
+	 * 鍙戣捣娴佺▼鏃舵牎楠屽睘鎬ф槸鍚︾鍚堣姹�
+	 * @param oids 涓婚敭
+	 * @param btmType 涓氬姟绫诲瀷
+	 * @param properties 灞炴�у悕锛岄�楀彿鍒嗛殧
+	 * @param propertieValues 灞炴�х殑鍊�
+	 * @param primaryKeyName 涓婚敭鐨勫睘鎬у悕绉�
+	 * @throws VciBaseException
+	 */
+    void checkAttributesOnStartProcess(String oids, String btmType, String properties, String propertieValues, String primaryKeyName) throws VciBaseException;
+
+	/**
+	 * 鎵归噺缁堟娴佺▼
+	 * @param executionIds 娴佺▼鐨勬墽琛屼富閿�
+	 * @param note 缁堟鍘熷洜
+	 * @throws VciBaseException
+	 */
+    void batchEndProcess(Collection<String> executionIds, String note) throws VciBaseException;
+
+	/**
+	 * 娣诲姞娴佺▼瀹℃壒鎰忚鏂囦欢
+	 * @param taskOids 娴佺▼浠诲姟鐨勪富閿�
+	 * @param file 鏂囦欢鐨勬暟鎹�
+	 * @param originalFilename 鏂囦欢鐨勫悕绉�
+	 * @throws VciBaseException 鍦ㄦ煡璇㈡祦绋嬩换鍔$殑淇℃伅鎴栬�呬笂浼犳枃浠堕敊璇椂浼氭姏鍑哄紓甯�
+	 */
+    void uploadAuditSuggestFile(String taskOids, MultipartFile file, String originalFilename) throws VciBaseException;
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/WebProcessDefineServiceI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/WebProcessDefineServiceI.java
new file mode 100644
index 0000000..4dfc55b
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/WebProcessDefineServiceI.java
@@ -0,0 +1,347 @@
+package com.vci.web.service;
+
+import com.vci.file.pagemodel.VciFileObjectVO;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.starter.web.pagemodel.Tree;
+import com.vci.starter.web.pagemodel.TreeQueryObject;
+import com.vci.web.pageModel.*;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 娴佺▼鐩稿叧瀹氫箟鏌ヨ鏈嶅姟
+ * @author weidy
+ */
+public interface WebProcessDefineServiceI {
+	
+	/**
+	 * 鑾峰彇鏌愪釜鍒嗙被涓嬬殑userid鍙互浣跨敤鐨勬祦绋嬫ā鏉�
+	 * @param type 娴佺▼鍒嗙被
+	 * @param filterTemplate 鎸囧畾妯℃澘
+	 * @param showAll 鏄惁鏄剧ず鎵�鏈夌増鏈紝false鏃跺彧鏄剧ず鍚敤鐨勭増鏈�
+	 * @return 鍙敤鐨勬祦绋嬫ā鐗�
+	 * @throws VciBaseException
+	 */
+	 List<ProcessTemplateVO> getMyTemplates(String type, String filterTemplate,boolean showAll) throws VciBaseException;
+	
+	
+	/**
+	 * 鑾峰彇鏌愪釜鍒嗙被涓嬬殑鎵�鏈夋祦绋嬫ā鏉�
+	 * @param type 娴佺▼鍒嗙被
+	 * @return 璇ュ垎绫讳笅鐨勬墍鏈夌殑娴佺▼妯℃澘
+	 * @throws VciBaseException
+	 */
+	 List<ProcessTemplateVO> getAllTemplates(String type) throws VciBaseException;
+	
+
+	/**
+	 * 鑾峰彇娴佺▼涓畾涔夌殑鎵�鏈変换鍔¤妭鐐�
+	 * @param processOid 娴佺▼妯$増鐨勪富閿�
+	 * @param  isQueryUser 鏄惁鏌ヨ鑺傜偣涓殑鐢ㄦ埛
+	 * @param maxSecret 鏁版嵁涓殑鏈�澶у瘑绾у��
+	 * @return 璇ユ祦绋嬫ā鐗堜腑鎵�鏈夌殑浠诲姟鑺傜偣,鍏朵腑鍖呭惈鎵�鏈夊彲浠ラ�夋嫨鐨勭敤鎴�
+	 * @throws VciBaseException
+	 */
+	 List<ProcessNodeVO> getAllProcessNode(String processOid, boolean isQueryUser, int maxSecret) throws VciBaseException;
+	
+	/**
+	 * 鑾峰彇娴佺▼涓畾涔夌殑鎵�鏈変换鍔¤妭鐐瑰悕绉�
+	 * @param  processTemplateOid 娴佺▼妯$増鐨勪富閿�
+	 * @return 杩斿洖浠诲姟鑺傜偣鍚嶇О
+	 * @throws VciBaseException
+	 */
+	 List<String> getAllProcessNodeName(String processTemplateOid) throws VciBaseException;
+	
+	/**
+	 * 鑾峰彇娴佺▼涓煇涓妭鐐圭殑鎵�鏈夊彲浠ラ�夋嫨鐨勭敤鎴�
+	 * @param  node 娴佺▼妯$増鐨勪富閿�
+	 * @return 鎵�鏈夊彲浠ラ�夋嫨鐨勭敤鎴�
+	 * @throws VciBaseException
+	 */
+	 List<ProcessUserVO> getProcessUsersByNode(ProcessNodeVO node, int maxSecret) throws VciBaseException;
+	
+	/**
+	 * 鑾峰彇娴佺▼妯℃澘涓墍鏈夎妭鐐圭殑璐熻矗浜�
+	 */
+	 List<ProcessUserVO> getAllProcessUsersInProcess(String processTemplateOid,
+													 String nodeName) throws VciBaseException;
+	/**
+	 * 鑾峰彇閮ㄧ讲id
+	 * @param executionId 鎵ц涓婚敭
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 String getDeployIdByExecutionId(String executionId) throws VciBaseException;
+	
+	/**
+	 * 鑾峰彇浠诲姟涓缃殑褰撳墠澶勭悊浜�
+	 * @param taskOid 浠诲姟涓婚敭
+	 * @return
+	 * @throws VciBaseException
+	 */
+	  List<ProcessUserVO> getProcessUserByTask(String taskOid) throws VciBaseException;
+	
+	/**
+	 * 鑾峰彇鎴戠殑寰呭姙浜嬮」--骞冲彴涓嶆敮鎸佹煡璇㈡暟鎹�绘潯鏁帮紝涓嶆竻妤氬湪杩欑鎯呭喌涓嬶紝start鍜宲agesize鏄敤鏉ュ仛浠�涔堢敤鐨�
+	 * @param conditionMap 鏉′欢鏌ヨ
+	 * @param ph 鍒嗛〉鍜屾帓搴�
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 DataGrid getMyUndoProcessTask(Map<String, String> conditionMap, PageHelper ph) throws VciBaseException;
+	
+	/**
+	 * 鑾峰彇鎴戝鐞嗕簡鐨勪换鍔�
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @param ph 鍒嗛〉淇℃伅
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 DataGrid getMyDoneProcessTask(Map<String, String> conditionMap, PageHelper ph) throws VciBaseException;
+	
+	/**
+	 * 鑾峰彇鎴戠殑宸茬粡瀹屾垚鐨勬祦绋�
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @param ph 鍒嗛〉淇℃伅
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 DataGrid getMyCompletedProcess(Map<String, String> conditionMap, PageHelper ph) throws VciBaseException;
+	
+	
+	/**
+	 * 鑾峰彇鎵�鏈夊凡缁忓畬鎴愮殑娴佺▼
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @param ph 鍒嗛〉淇℃伅
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 DataGrid getAllCompletedProcess(Map<String, String> conditionMap, PageHelper ph) throws VciBaseException;
+	
+	
+	/**
+	 * 鑾峰彇鎴戠殑缁堟鐨勬祦绋�
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @param ph 鍒嗛〉淇℃伅
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 DataGrid getMyObsoledtedProcess(Map<String, String> conditionMap, PageHelper ph) throws VciBaseException;
+	
+	
+	/**
+	 * 鑾峰彇鎵�鏈夌粓姝㈢殑娴佺▼
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @param ph 鍒嗛〉淇℃伅
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 DataGrid getAllObsoledtedProcess(Map<String, String> conditionMap, PageHelper ph) throws VciBaseException;
+	
+	
+	/**
+	 * 鑾峰彇鎴戠殑鎸傝捣鐨勬祦绋�
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @param ph 鍒嗛〉淇℃伅
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 DataGrid getMySuspendedProcess(Map<String, String> conditionMap, PageHelper ph) throws VciBaseException;
+	
+	
+	/**
+	 * 鑾峰彇鎵�鏈夋寕璧风殑娴佺▼
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @param ph 鍒嗛〉淇℃伅
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 DataGrid getAllSuspendedProcess(Map<String, String> conditionMap, PageHelper ph) throws VciBaseException;
+	
+	/**
+	 * 鑾峰彇鎴戝彂璧风殑鎵�鏈夋鍦ㄦ墽琛岀殑娴佺▼
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @param ph 鍒嗛〉淇℃伅
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 DataGrid getMyExecutingProcess(Map<String, String> conditionMap, PageHelper ph) throws VciBaseException;
+	
+	
+	/**
+	 * 鑾峰彇鎵�鏈夋鍦ㄦ墽琛岀殑娴佺▼
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @param ph 鍒嗛〉淇℃伅
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 DataGrid getAllExecutingProcess(Map<String, String> conditionMap, PageHelper ph) throws VciBaseException;
+	
+	/**
+	 * 鑾峰彇鎴戝彂璧风殑鎵�鏈夋祦绋�
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @param ph 鍒嗛〉淇℃伅
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 DataGrid getMyCreateProcess(Map<String, String> conditionMap, PageHelper ph) throws VciBaseException;
+
+	/**
+	 * 鑾峰彇鏁版嵁鍖哄煙鏄剧ず鐨勮〃鏍间俊鎭�--
+	 * @param executionid 娴佺▼鐨勬墽琛屼富閿紝executionid
+	 * @param taskOid 浠诲姟鐨勪富閿�
+	 * @return map,鍏朵腑btmType涓轰笟鍔$被鍨�,tableCode涓鸿〃鏍肩紪鍙�
+	 * @throws VciBaseException
+	 */
+	 Map<String, Object>  getDataTableDefine(String executionid, String taskOid) throws VciBaseException;
+
+	
+	/**
+	 * 鑾峰彇鏁版嵁鍖哄煙鏄剧ず鐨勬暟鎹�
+	 * @param taskOid 浠诲姟涓婚敭锛岀瓑浜巜orkitem閲岀殑oid
+	 * @param processOid 娴佺▼涓婚敭锛岀瓑浜巜orkflowinstance閲岀殑涓婚敭
+	 * @param referColumn 寮曠敤鐨勫垪
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 DataGrid getDataInProcess(String taskOid, String processOid, String referColumn) throws VciBaseException;
+	
+	/**
+	 * 鑾峰彇娴佺▼鐨勫巻鍙�
+	 * @param executionId 娴佺▼瀹炰緥鐨勪富閿�
+	 * @param showCurrentNode 鏄惁鏄剧ず褰撳墠鐨勮妭鐐�
+	 * @return 杩欎釜娴佺▼涓墍鏈夊巻鍙�
+	 * @throws VciBaseException
+	 */
+	 DataGrid getHistory(String executionId, boolean showCurrentNode) throws VciBaseException;
+	
+	/**
+	 * 鑾峰彇褰撳墠娴佺▼涓殑娴佺▼鍥�
+	 * @param executionId 褰撳墠娴佺▼鐨勬墽琛屽疄渚媔d
+	 * @param taskOid 褰撳墠浠诲姟鑺傜偣涓婚敭
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 byte[] getProcessPicture(String executionId, String taskOid) throws VciBaseException;
+	
+	
+	/**
+	 * 鑾峰彇娴佺▼妯$増涓殑娴佺▼鍥�
+	 * @param executionId  鎵цID锛�
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 byte[] getProcessTemplatePicture(String executionId) throws VciBaseException;
+	
+	/**
+	 * 鏍规嵁涓婚敭鑾峰彇浠诲姟淇℃伅
+	 * @param taskOid
+	 * @return
+	 * @throws VciBaseException
+	 */
+	 List<ProcessTaskVO> getTaskByOid(String taskOid) throws VciBaseException;
+	
+	/**
+	 * 鏌ヨ浠诲姟鐨勮矾鐢�
+	 * @param taskId 浠诲姟涓婚敭
+	 * @param isQueryNextNode 鏄惁鏌ヨ涓嬩竴涓换鍔¤妭鐐圭殑璐熻矗浜�
+	 * @return 鎵�鏈夌殑璺敱淇℃伅
+	 * @throws VciBaseException
+	 */
+	 List<ProcessOutcomeVO> getOutCome(String taskId, boolean isQueryNextNode) throws VciBaseException;
+	
+	
+	/**
+	 * 鑾峰彇鏍规嵁瑙勫垯浜х敓鐨勬祦绋嬪悕绉�
+	 * @param btmtype 涓氬姟绫诲瀷
+	 * @param data 鏁版嵁
+	 * @return
+	 * @throws VciBaseException
+	 */
+     String getNameFromRule(String btmtype, Map<String, String> data) throws VciBaseException;
+
+    /**
+     * 妫�楠屼换鍔℃槸鍚︿娇鐢ㄥ悓涓�涓祦绋嬫ā鏉匡紝鏄惁鍚屼竴涓换鍔¤妭鐐�
+     * @param taskOids 浠诲姟涓婚敭
+     * @return
+     * @throws VciBaseException
+     */
+	 boolean checkUseSameTemplate(String taskOids) throws VciBaseException;
+
+	/**
+	 * 鑾峰彇娴佺▼涓叧鑱旂殑鏁版嵁鍏宠仈鐨勬枃浠�
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @param taskOid 浠诲姟涓婚敭
+	 * @param executionId 娴佺▼鎵ц涓婚敭
+	 * @param pageHelper 鍒嗛〉淇℃伅
+	 * @return
+	 */
+    DataGrid getFilesInProcess(Map<String, String> conditionMap, String taskOid, String executionId, PageHelper pageHelper) throws VciBaseException;
+
+	/**
+	 * 鎵归噺鑾峰彇娴佺▼涓殑鍙橀噺淇℃伅
+	 * @param executionId 娴佺▼鏍囪瘑
+	 * @param keys 娴佺▼鍙橀噺
+	 * @return
+	 * @throws VciBaseException
+	 */
+    Map<String,String> getVariablesInProcess(String executionId, String keys) throws VciBaseException;
+
+
+	/**
+	 * 鏍规嵁涓氬姟鏁版嵁锛岃幏鍙栨鍦ㄦ墽琛岀殑娴佺▼
+	 * @param bussinessOid 涓氬姟绫诲瀷鏁版嵁
+	 * @param btmName 涓氬姟绫诲瀷鍚�
+	 * @return
+	 * @throws VciBaseException
+	 */
+    List<String> listExecutingProcessByBussinessOid(String bussinessOid, String btmName) throws VciBaseException;
+
+	/**
+	 * 鑾峰彇瀹℃壒鎰忚鏂囦欢
+	 * @param taskOids 浠诲姟鐨勪富閿�
+	 * @return 鏂囦欢鐨勪俊鎭�
+	 */
+	DataGrid<VciFileObjectVO> listAuditSuggestFile(String taskOids);
+
+	/**
+	 * 鍙傜収娴佺▼鍒嗙被
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @param pageHelper 鍒嗛〉瀵硅薄
+	 * @return 鍒嗙被鐨勪俊鎭�
+	 */
+    DataGrid<ProcessClassifyVO> referGridProcessClassify(Map<String, String> conditionMap, PageHelper pageHelper);
+
+	/**
+	 * 鍙傜収娴佺▼鐨勬ā鏉�
+	 * @param processClassifyId 娴佺▼鍒嗙被鐨勫悕绉�
+	 * @param name 妯℃澘鐨勫悕绉�
+	 * @return 妯℃澘鐨勬樉绀哄璞�
+	 */
+	DataGrid<ProcessTemplateVO> referGridProcessTemplate(String processClassifyId, String name);
+
+	/**
+	 * 鍙傜収娴佺▼鍒嗙被鏍�
+	 * @param queryObject 鏌ヨ瀵硅薄
+	 * @return 鏍戠殑淇℃伅
+	 */
+	List<Tree> referTreeProcessClassify(TreeQueryObject queryObject);
+
+	/**
+	 * 浣跨敤妯℃澘鐨勪富閿幏鍙�
+	 * @param id 妯℃澘鐨刱ey
+	 * @param revisionValue 鐗堟湰鐨勫��
+	 * @return 妯℃澘鐨勬樉绀哄璞�
+	 */
+	ProcessTemplateVO getTemplateById(String id,String revisionValue);
+
+	/**
+	 * 鑾峰彇鏌愪釜鐢ㄦ埛鐨勫緟鍔炰换鍔′釜鏁�
+	 * @param username 鐢ㄦ埛鐨勭紪鍙�
+	 * @return 鎬绘暟
+	 */
+    int getUndoTaskCount(String username);
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/WebSecretServiceI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/WebSecretServiceI.java
new file mode 100644
index 0000000..7eda033
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/WebSecretServiceI.java
@@ -0,0 +1,123 @@
+package com.vci.web.service;
+
+import com.vci.frameworkcore.pagemodel.SmUserVO;
+import com.vci.rmip.framework.client.systemConfig.object.UserObject;
+import com.vci.starter.web.exception.VciBaseException;
+
+import java.util.Map;
+
+/**
+ * web绔殑瀵嗙骇鏈嶅姟
+ */
+public interface WebSecretServiceI {
+
+
+    /**
+     * 鑾峰彇鐢ㄦ埛瀵嗙骇鐨勬渶灏忓��
+     * @return 瀵嗙骇鐨勫��
+     * @throws VciBaseException 鏌ヨ鍑洪敊浼氭姏鍑哄紓甯�
+     */
+    int getMinUserSecret() throws VciBaseException;
+
+    /**
+     * 鑾峰彇鏁版嵁瀵嗙骇鐨勯粯璁ゅ��
+     * @return 瀵嗙骇鐨勫��
+     * @throws VciBaseException 鏌ヨ鍑洪敊浼氭姏鍑哄紓甯�
+     */
+    int getMinDataSecret() throws VciBaseException;
+
+    /**
+     * 鑾峰彇IP瀵嗙骇鐨勯粯璁ゅ��
+     * @return 瀵嗙骇鐨勫��
+     * @throws VciBaseException 鏌ヨ鍑洪敊浼氭姏鍑哄紓甯�
+     */
+    int getMinIpSecret() throws VciBaseException;
+
+    /**
+     * 鑾峰彇鐢ㄦ埛瀵嗙骇
+     * @param userId 鐢ㄦ埛涓婚敭
+     * @return 鐢ㄦ埛鐨勫瘑绾�
+     * @throws VciBaseException 鍙傛暟閿欒锛岀敤鎴蜂笉瀛樺湪浼氭姏鍑哄紓甯�
+     */
+    int getUserSecret(String userId) throws VciBaseException ;
+
+    /**
+     * 鑾峰彇鐢ㄦ埛瀵嗙骇
+     * @param userVO 鐢ㄦ埛鐨勬樉绀哄璞�
+     * @return 鐢ㄦ埛鐨勫瘑绾�
+     * @throws VciBaseException 鍙傛暟閿欒锛岀敤鎴蜂笉瀛樺湪浼氭姏鍑哄紓甯�
+     */
+    int getUserSecret(SmUserVO userVO) throws VciBaseException;
+
+    /**
+     * 鏍¢獙褰撳墠鐢ㄦ埛鏄惁鏈夋潈闄愯闂暟鎹�
+     * @param secret 鏁版嵁鐨勫瘑绾�
+     * @return true琛ㄧず鍏佽璁块棶
+     */
+    boolean checkDataSecret(int secret);
+
+    /**
+     * 鏍¢獙鐢ㄦ埛鐨勫瘑绾ф槸鍚︽槸鍚︽湁鏉冮檺璁块棶鏁版嵁
+     * @param secret 鏁版嵁鐨勫瘑绾�
+     * @param userSecret 鐢ㄦ埛瀵嗙骇
+     * @return true琛ㄧず鍏佽璁块棶
+     */
+    boolean checkDataSecret(int secret, int userSecret) ;
+
+    /**
+     * 鏍规嵁鐢ㄦ埛鍚嶆潵鏍¢獙鏁版嵁瀵嗙骇
+     * @param secret 鏁版嵁鐨勫瘑绾�
+     * @param userId 鐢ㄦ埛鍚�
+     * @return true琛ㄧず鍏佽璁块棶
+     * @throws VciBaseException 鍙傛暟閿欒锛岀敤鎴蜂笉瀛樺湪浼氭姏鍑哄紓甯�
+     */
+    boolean checkDataSecret(int secret, String userId) throws VciBaseException;
+
+    /**
+     * 鏍规嵁鐢ㄦ埛瀵硅薄鏉ユ牎楠屾暟鎹瘑绾�
+     * @param secret  鏁版嵁鐨勫瘑绾�
+     * @param userVO 鐢ㄦ埛鐨勬樉绀哄璞�
+     * @return true琛ㄧず鍏佽璁块棶
+     */
+    boolean checkDataSecret(int secret, SmUserVO userVO) ;
+
+    /**
+     * 鑾峰彇IP鍦板潃鐨勫瘑绾�
+     * @param ip ip鍦板潃
+     * @return 瀵嗙骇鐨勫��
+     * @throws VciBaseException 鏌ヨ鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    int getIpSecret(String ip) throws VciBaseException;
+    /**
+     * 妫�鏌ユ満鍣ㄥ瘑绾�
+     * @param ipSecret 鏈哄櫒瀵嗙骇
+     * @param userSecret 鐢ㄦ埛鐨勫瘑绾�
+     * @return 瀵嗙骇鐨勫��
+     */
+    boolean checkIpSecret(int ipSecret, int userSecret);
+
+    /**
+     * 妫�鏌ュ綋鍓嶇敤鎴锋槸鍚︾鍚堟満鍣ㄥ瘑绾�
+     * @param ipSecret 鏈哄櫒瀵嗙骇
+     * @return true琛ㄧず鍏佽璁块棶
+     */
+    boolean checkIpSecret(int ipSecret) ;
+
+    /**
+     * 鏍¢獙鎸囧畾ip鍜岀敤鎴锋槸鍚︾鍚堟満鍣ㄥ瘑绾�
+     * @param ip ip鍦板潃
+     * @param userId 鐢ㄦ埛鍚�
+     * @return true琛ㄧず鍏佽璁块棶
+     * @throws VciBaseException 鍙傛暟閿欒锛岀敤鎴蜂笉瀛樺湪浼氭姏鍑哄紓甯�
+     */
+    boolean checkIpSecret(String ip, String userId) throws VciBaseException;
+
+    /**
+     * 鏍¢獙鎸囧畾IP鍜岀敤鎴峰璞$鍚堟満鍣ㄥ瘑绾�
+     * @param ip ip鍦板潃
+     * @param userVO 鐢ㄦ埛瀵硅薄
+     * @return  true琛ㄧず鍏佽璁块棶
+     */
+    boolean checkIpSecret(String ip, SmUserVO userVO) ;
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/BdSelectInputCharServiceImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/BdSelectInputCharServiceImpl.java
new file mode 100644
index 0000000..3e4c249
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/BdSelectInputCharServiceImpl.java
@@ -0,0 +1,437 @@
+package com.vci.web.service.impl;
+
+import com.vci.web.pageModel.BdSelectInputCharVO;
+import com.vci.web.dto.BdSelectInputCharDTO;
+import com.vci.web.model.BdSelectInputCharDO;
+import com.vci.web.dao.BdSelectInputCharDaoI;
+import com.vci.web.pageModel.KeyValue;
+import com.vci.web.service.BdSelectInputCharServiceI;
+import com.vci.frameworkcore.constant.FrameWorkDefaultValueConstant;
+import com.vci.starter.revision.service.RevisionModelUtil;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.*;
+import com.vci.starter.web.util.*;
+import com.vci.starter.web.wrapper.*;
+import com.vci.starter.revision.bo.TreeWrapperOptions;
+import com.vci.web.util.WebUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+import org.springframework.beans.factory.annotation.Autowired;
+import javax.annotation.Resource;
+import org.springframework.util.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import java.lang.reflect.Field;
+import java.util.*;
+import com.vci.web.service.WebBoServiceI;
+import com.vci.frameworkcore.lcstatuspck.*;
+import com.vci.web.pageModel.BatchCBO;
+import static com.vci.frameworkcore.constant.FrameWorkLangCodeConstant.*;
+import static com.vci.frameworkcore.constant.FrameWorkDefaultValueConstant.*;
+/**
+ * 鍙緭鍙�夊唴瀹规湇鍔�
+ * @author weidy
+ * @date 2022-03-09
+ */
+@Service
+public class BdSelectInputCharServiceImpl implements BdSelectInputCharServiceI{
+
+    /**
+    * 鏃ュ織
+    */
+    private Logger logger = LoggerFactory.getLogger(getClass());
+
+    /**
+    * 鏁版嵁鎿嶄綔灞�
+    */
+    @Resource
+    private BdSelectInputCharDaoI bdSelectInputCharMapper;
+
+    /**
+    * 涓氬姟绫诲瀷鎿嶄綔鐨勬湇鍔�
+    */
+    @Autowired
+    private WebBoServiceI boService;
+
+    /**
+    * 瀵硅薄鐨勬搷浣�
+    */
+    @Autowired
+    private RevisionModelUtil revisionModelUtil;
+
+
+    /**
+     * 鏌ヨ鎵�鏈夌殑鍙緭鍙�夊唴瀹�
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉鍜屾帓搴�
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 鏌ヨ鏉′欢鍜屽垎椤靛嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public DataGrid<BdSelectInputCharVO> gridBdSelectInputChar(Map<String, String> conditionMap, PageHelper pageHelper) throws VciBaseException{
+        if (pageHelper == null) {
+            pageHelper = new PageHelper(-1);
+        }
+        pageHelper.addDefaultDesc("createTime");
+        List<BdSelectInputCharDO> doList = bdSelectInputCharMapper.selectByCondition(conditionMap,pageHelper);
+        DataGrid<BdSelectInputCharVO> dataGrid=new DataGrid<BdSelectInputCharVO>();
+        if (!CollectionUtils.isEmpty(doList)) {
+            dataGrid.setData(bdSelectInputCharDO2VOs(doList));
+            dataGrid.setTotal(VciBaseUtil.getInt(String.valueOf(bdSelectInputCharMapper.countByCondition(conditionMap))));
+        }
+        return dataGrid;
+    }
+
+    /**
+     * 鎵归噺鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+     * @param bdSelectInputCharDOs 鏁版嵁瀵硅薄鍒楄〃
+     * @return 鏄剧ず瀵硅薄
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呬笉瀛樺湪鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public List<BdSelectInputCharVO> bdSelectInputCharDO2VOs(Collection<BdSelectInputCharDO>  bdSelectInputCharDOs) throws VciBaseException{
+        List<BdSelectInputCharVO> voList = new ArrayList<BdSelectInputCharVO>();
+        if(!CollectionUtils.isEmpty(bdSelectInputCharDOs)){
+           for(BdSelectInputCharDO s: bdSelectInputCharDOs){
+                BdSelectInputCharVO vo =  bdSelectInputCharDO2VO(s);
+                if(vo != null){
+                    voList.add(vo);
+                }
+            }
+        }
+        return voList;
+    }
+
+    /**
+     * 鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+     * @param  bdSelectInputCharDO 鏁版嵁瀵硅薄
+     * @return 鏄剧ず瀵硅薄
+     * @throws VciBaseException 鎷疯礉灞炴�у嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public  BdSelectInputCharVO bdSelectInputCharDO2VO(BdSelectInputCharDO bdSelectInputCharDO) throws VciBaseException{
+              BdSelectInputCharVO vo = new BdSelectInputCharVO();
+        if(bdSelectInputCharDO != null){
+            BeanUtilForVCI.copyPropertiesIgnoreCase(bdSelectInputCharDO,vo);
+            //濡傛灉鏈塴cstatus鐨勭被鐨勮瘽
+            
+        }
+        return vo;
+    }
+
+    /**
+     * 澧炲姞鍙緭鍙�夊唴瀹�
+     * @param bdSelectInputCharDTO 鍙緭鍙�夊唴瀹规暟鎹紶杈撳璞�
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屽敮涓�椤癸紝蹇呰緭椤逛笉閫氳繃鏃朵細鎶涘嚭寮傚父
+     */
+    @Override
+    public BdSelectInputCharVO addSave(BdSelectInputCharDTO bdSelectInputCharDTO) throws VciBaseException{
+        VciBaseUtil.alertNotNull(bdSelectInputCharDTO,"闇�瑕佹坊鍔犵殑鏁版嵁瀵硅薄");
+        if(StringUtils.isBlank(bdSelectInputCharDTO.getId())){
+            return null;
+        }
+        boolean persistence = WebUtil.isPersistence();
+        WebUtil.setPersistence(true);
+        //涓嶈鎴愬姛涓嶆垚鍔燂紝閮戒繚瀛樿繘鍘�
+        //灏咲TO杞崲涓篋O
+        BdSelectInputCharDO bdSelectInputCharDO = new BdSelectInputCharDO();
+        BeanUtilForVCI.copyPropertiesIgnoreCase(bdSelectInputCharDTO,bdSelectInputCharDO);
+        if(StringUtils.isBlank(bdSelectInputCharDO.getSourceNameSpace())){
+            bdSelectInputCharDO.setSourceNameSpace("default");
+        }
+        if(StringUtils.isBlank(bdSelectInputCharDO.getSourceInputFlag())){
+            bdSelectInputCharDO.setSourceInputFlag("default");
+        }
+        //闇�瑕佸垽鏂槸鍚﹀瓨鍦�
+        Map<String,String> conditionMap = new HashMap<>();
+        conditionMap.put("id",bdSelectInputCharDO.getId());
+        conditionMap.put("sourcenamespace",bdSelectInputCharDO.getSourceNameSpace());
+        conditionMap.put("sourceinputflag",bdSelectInputCharDO.getSourceInputFlag());
+        if(bdSelectInputCharMapper.countByCondition(conditionMap) == 0) {
+            bdSelectInputCharMapper.insert(bdSelectInputCharDO);
+        }else{
+            return null;
+        }
+        WebUtil.setPersistence(persistence);
+        return bdSelectInputCharDO2VO(bdSelectInputCharDO);
+    }
+
+    /**
+     * 淇敼鍙緭鍙�夊唴瀹�
+     * @param bdSelectInputCharDTO 鍙緭鍙�夊唴瀹规暟鎹紶杈撳璞�
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屽敮涓�椤癸紝蹇呰緭椤逛笉閫氳繃鏃朵細鎶涘嚭寮傚父
+     */
+     @Override
+     public BdSelectInputCharVO editSave(BdSelectInputCharDTO bdSelectInputCharDTO) throws VciBaseException{
+         VciBaseUtil.alertNotNull(bdSelectInputCharDTO,"鏁版嵁瀵硅薄",bdSelectInputCharDTO.getOid(),"鍙緭鍙�夊唴瀹逛富閿�");
+         //灏咲TO杞崲涓篋O
+         BdSelectInputCharDO bdSelectInputCharDO = selectByOid(bdSelectInputCharDTO.getOid());
+         revisionModelUtil.copyFromDTOIgnore(bdSelectInputCharDTO,bdSelectInputCharDO);
+         bdSelectInputCharMapper.updateByPrimaryKey(bdSelectInputCharDO);
+         return bdSelectInputCharDO2VO(bdSelectInputCharDO);
+     }
+
+
+    /**
+     * 鏍¢獙鏄惁鍙互鍒犻櫎锛屽鏋滃瓨鍦ㄤ笅绾э紝骞朵笖涓嬬骇鏈夋暟鎹紩鐢ㄥ垯涓嶈兘鍒犻櫎
+     * @param bdSelectInputCharDTO 鏁版嵁浼犺緭瀵硅薄
+     * @param bdSelectInputCharDO 鏁版嵁搴撲腑鐨勬暟鎹璞�
+     * @return success涓簍rue涓哄彲浠ュ垹闄わ紝false琛ㄧず鏈夋暟鎹紩鐢紝obj涓簍rue琛ㄧず鏈変笅绾�
+     */
+    private BaseResult checkIsCanDeleteForDO(BdSelectInputCharDTO bdSelectInputCharDTO, BdSelectInputCharDO bdSelectInputCharDO) {
+            BdSelectInputCharDO tsDO = new BdSelectInputCharDO();
+            BeanUtilForVCI.copyPropertiesIgnoreCase(bdSelectInputCharDTO,tsDO);
+        boService.checkTs(tsDO);
+        if(!checkIsLinked(bdSelectInputCharDO.getOid())) {
+            return BaseResult.success();
+        }else{
+            return BaseResult.fail(DATA_LINKED_NOT_DELETE,new String[]{""});
+        }
+    }
+
+    /**
+    * 鏍¢獙鏄惁琚紩鐢�
+    * @param oid 涓婚敭
+    * @throws VciBaseException 琚紩鐢ㄧ殑鏃跺�欎細鎶涘嚭寮傚父
+    */
+    private boolean checkIsLinked(String oid) throws VciBaseException{
+        //TODO 娣诲姞闇�瑕佹牎楠屽紩鐢ㄧ殑鍦版柟
+        return false;
+    }
+
+    /**
+     * 鍒犻櫎鍙緭鍙�夊唴瀹�
+     * @param bdSelectInputCharDTO 鍙緭鍙�夊唴瀹规暟鎹紶杈撳璞★紝oid鍜宼s闇�瑕佷紶杈�
+     * @return 鍒犻櫎缁撴灉鍙嶉锛氾細success锛氭垚鍔燂紝fail锛氬け璐�
+     * @throws VciBaseException 鍙傛暟涓虹┖锛岃寮曠敤鏃舵姏鍑哄紓甯�
+     */
+    @Override
+    public BaseResult deleteBdSelectInputChar(BdSelectInputCharDTO bdSelectInputCharDTO) throws VciBaseException{
+        VciBaseUtil.alertNotNull(bdSelectInputCharDTO,"鍙緭鍙�夊唴瀹规暟鎹璞�",bdSelectInputCharDTO.getOid(),"鍙緭鍙�夊唴瀹圭殑涓婚敭");
+        BdSelectInputCharDO bdSelectInputCharDO = selectByOid(bdSelectInputCharDTO.getOid());
+        BaseResult baseResult = checkIsCanDeleteForDO(bdSelectInputCharDTO,bdSelectInputCharDO);
+        if(baseResult.isSuccess()) {
+                    }else{
+            return baseResult;
+        }
+        //鎵ц鍒犻櫎鎿嶄綔
+        BatchCBO batchCBO = bdSelectInputCharMapper.deleteByPrimaryKey(bdSelectInputCharDO.getOid());
+        return (batchCBO!=null && batchCBO.getDeleteCbos() !=null &&batchCBO.getDeleteCbos().size() > 0)?BaseResult.successMsg(DELETE_SUCCESS):BaseResult.fail(DELETE_FAIL);
+    }
+
+    /**
+    * 涓婚敭鑾峰彇鍙緭鍙�夊唴瀹�
+    * @param oid 涓婚敭
+    * @return 鍙緭鍙�夊唴瀹规樉绀哄璞�
+    * @throws VciBaseException 鍙傛暟涓虹┖锛屾暟鎹笉瀛樺湪鏃朵細鎶涘嚭寮傚父
+    */
+    @Override
+    public  BdSelectInputCharVO getObjectByOid(String oid) throws VciBaseException{
+        return bdSelectInputCharDO2VO(selectByOid(oid));
+    }
+
+    /**
+    * 涓婚敭鏌ヨ鏁版嵁瀵硅薄
+    * @param oid 涓婚敭
+    * @return  鏁版嵁瀵硅薄
+    * @throws VciBaseException 鍙傛暟涓虹┖锛屽苟涓旀暟鎹笉瀛樺湪鐨勬椂鍊欎細鎶涘嚭寮傚父
+    */
+    private BdSelectInputCharDO selectByOid(String oid) throws VciBaseException{
+        VciBaseUtil.alertNotNull(oid,"涓婚敭");
+        BdSelectInputCharDO bdSelectInputCharDO = bdSelectInputCharMapper.selectByPrimaryKey(oid.trim());
+        if(bdSelectInputCharDO == null || StringUtils.isBlank(bdSelectInputCharDO.getOid())){
+            throw new VciBaseException(DATA_OID_NOT_EXIST);
+        }
+        return bdSelectInputCharDO;
+    }
+
+    /**
+     * 涓婚敭鎵归噺鑾峰彇鍙緭鍙�夊唴瀹�
+     * @param oidCollections 涓婚敭闆嗗悎锛屼絾鏄彈鎬ц兘褰卞搷锛屽缓璁竴娆℃煡璇笉瓒呰繃10000涓�
+     * @return 鍙緭鍙�夊唴瀹规樉绀哄璞�
+     * @throws VciBaseException 鏌ヨ鍑虹幇寮傚父鏃朵細鎶涘嚭
+     */
+    @Override
+    public Collection<BdSelectInputCharVO> listBdSelectInputCharByOids(Collection<String> oidCollections) throws VciBaseException{
+        VciBaseUtil.alertNotNull(oidCollections,"鏁版嵁瀵硅薄涓婚敭闆嗗悎");
+        List<BdSelectInputCharDO> bdSelectInputCharDOList = listBdSelectInputCharDOByOidCollections(oidCollections);
+        return bdSelectInputCharDO2VOs(bdSelectInputCharDOList);
+    }
+
+    /**
+    * 浣跨敤涓婚敭闆嗗悎鏌ヨ鏁版嵁瀵硅薄
+    * @param oidCollections 涓婚敭鐨勯泦鍚�
+    * @return 鏁版嵁瀵硅薄鍒楄〃
+    */
+    private List<BdSelectInputCharDO> listBdSelectInputCharDOByOidCollections(Collection<String> oidCollections){
+        List<BdSelectInputCharDO> bdSelectInputCharDOList = new ArrayList<BdSelectInputCharDO>();
+        if(!CollectionUtils.isEmpty(oidCollections)){
+            Collection<Collection<String>> oidCollectionsList = VciBaseUtil.switchCollectionForOracleIn(oidCollections);
+            for(Collection<String> oids: oidCollectionsList){
+                List<BdSelectInputCharDO> tempDOList =  bdSelectInputCharMapper.selectByPrimaryKeyCollection(oids);
+                if(!CollectionUtils.isEmpty(tempDOList)){
+                        bdSelectInputCharDOList.addAll(tempDOList);
+                }
+            }
+        }
+        return  bdSelectInputCharDOList;
+    }
+
+
+
+    /**
+     * 鍙傜収鍙緭鍙�夊唴瀹瑰垪琛�
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉鍜屾帓搴�
+     * @return 鍙緭鍙�夊唴瀹规樉绀哄璞″垪琛紝鐢熸晥鐨勫唴瀹�
+     * @throws VciBaseException 鏌ヨ鏉′欢鍜屽垎椤靛嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public DataGrid<BdSelectInputCharVO> refDataGridBdSelectInputChar(Map<String, String> conditionMap, PageHelper pageHelper) throws VciBaseException{
+        if(conditionMap == null){
+            conditionMap = new HashMap<String, String>();
+        }
+        return gridBdSelectInputChar(conditionMap,pageHelper);
+    }
+
+    /**
+     * 鑾峰彇鍙�夋嫨鐨勫垪琛�
+     *
+     * @param flag 鏍囪
+     * @param namespace 鍛藉悕绌洪棿
+     * @return 鍖呭惈鐨勫唴瀹�
+     */
+    @Override
+    public List<KeyValue> listByFlag(String namespace,String flag) {
+        if(StringUtils.isBlank(namespace)){
+            namespace = "default";
+        }
+        if(StringUtils.isBlank(flag)){
+            flag = "default";
+        }
+        Map<String,String> conditionMap = new HashMap<>();
+        conditionMap.put("sourceinputflag",flag);
+        conditionMap.put("sourceNameSpace",namespace);
+        PageHelper pageHelper = new PageHelper(-1);
+        pageHelper.addDefaultDesc("createTime");
+        List<BdSelectInputCharDO> charDOS = bdSelectInputCharMapper.selectByCondition(conditionMap, pageHelper);
+        if(CollectionUtils.isEmpty(charDOS)){
+            return new ArrayList<>();
+        }
+        List<KeyValue> keyValueList = new ArrayList<>();
+        charDOS.stream().forEach(charDO->{
+            KeyValue keyValue = new KeyValue();
+            keyValue.setKey(charDO.getId());
+            keyValue.setValue(StringUtils.isBlank(charDO.getName())?charDO.getId():(charDO.getId() + " " + charDO.getName()));
+            keyValueList.add(keyValue);
+        });
+        return keyValueList;
+    }
+
+    /**
+     * 瀛樺偍
+     *
+     * @param namespace 鍛藉悕绌洪棿
+     * @param flag      鏍囪瘑
+     * @param value     鍊�
+     */
+    @Override
+    @Async
+    public void save(String namespace, String flag, String value,SessionInfo sessionInfo) {
+        VciBaseUtil.setCurrentUserSessionInfo(sessionInfo);
+        BdSelectInputCharDTO sic = new BdSelectInputCharDTO();
+        sic.setSourcenamespace(namespace);
+        sic.setSourceinputflag(flag);
+        sic.setId(value);
+        addSave(sic);
+    }
+
+    /**
+     * 鐩稿悓鍛藉悕绌洪棿鐨勫瓨鍌�
+     *
+     * @param namespace    鍛藉悕绌洪棿
+     * @param flagValueMap key鏄爣璇嗭紝value鏄��
+     * @param sessionInfo 浼氳瘽淇℃伅
+     */
+    @Override
+    @Async
+    public void saveBySameNamespace(String namespace, Map<String, String> flagValueMap,SessionInfo sessionInfo) {
+        VciBaseUtil.alertNotNull(flagValueMap,"闇�瑕佹坊鍔犵殑鏁版嵁瀵硅薄");
+        VciBaseUtil.setCurrentUserSessionInfo(sessionInfo);
+        boolean persistence = WebUtil.isPersistence();
+        WebUtil.setPersistence(true);
+        //涓嶈鎴愬姛涓嶆垚鍔燂紝閮戒繚瀛樿繘鍘�
+        //灏咲TO杞崲涓篋O
+        List<BdSelectInputCharDO> charDOList = new ArrayList<>();
+        if(StringUtils.isBlank(namespace)){
+            namespace = "default";
+        }
+        String finalNamespace = namespace;
+        flagValueMap.forEach((flag, value)-> {
+            BdSelectInputCharDO sic = new BdSelectInputCharDO();
+            sic.setId(value);
+            sic.setSourceInputFlag(flag);
+            sic.setSourceNameSpace(finalNamespace);
+            Map<String, String> conditionMap = new HashMap<>();
+            conditionMap.put("id", sic.getId());
+            conditionMap.put("sourcenamespace", sic.getSourceNameSpace());
+            conditionMap.put("sourceinputflag", sic.getSourceInputFlag());
+            if (bdSelectInputCharMapper.countByCondition(conditionMap) == 0) {
+                charDOList.add(sic);
+            }
+        });
+        if(!CollectionUtils.isEmpty(charDOList)) {
+            bdSelectInputCharMapper.batchInsert(charDOList);
+        }
+        WebUtil.setPersistence(persistence);
+    }
+
+    /**
+     * 鐩稿悓鍛藉悕绌洪棿鍜岀浉鍚屾爣璇嗙殑瀛樺偍
+     *
+     * @param namespace 鍛藉悕绌洪棿
+     * @param flag      鏍囪
+     * @param values    鍊奸泦鍚�
+     * @param sessionInfo 浼氳瘽淇℃伅
+     */
+    @Override
+    @Async
+    public void saveBySameNamespaceAndFlag(String namespace, String flag, Collection<String> values,SessionInfo sessionInfo) {
+        VciBaseUtil.alertNotNull(values,"闇�瑕佹坊鍔犵殑鏁版嵁瀵硅薄");
+        boolean persistence = WebUtil.isPersistence();
+        WebUtil.setPersistence(true);
+        //涓嶈鎴愬姛涓嶆垚鍔燂紝閮戒繚瀛樿繘鍘�
+        //灏咲TO杞崲涓篋O
+        List<BdSelectInputCharDO> charDOList = new ArrayList<>();
+        if(StringUtils.isBlank(namespace)){
+            namespace = "default";
+        }
+        if(StringUtils.isBlank(flag)){
+            flag = "default";
+        }
+        String finalNamespace = namespace;
+        String finalFlag = flag;
+        values.stream().forEach(value->{
+            BdSelectInputCharDO sic = new BdSelectInputCharDO();
+            sic.setId(value);
+            sic.setSourceInputFlag(finalFlag);
+            sic.setSourceNameSpace(finalNamespace);
+            Map<String, String> conditionMap = new HashMap<>();
+            conditionMap.put("id", sic.getId());
+            conditionMap.put("sourcenamespace", sic.getSourceNameSpace());
+            conditionMap.put("sourceinputflag", sic.getSourceInputFlag());
+            if (bdSelectInputCharMapper.countByCondition(conditionMap) == 0) {
+                charDOList.add(sic);
+            }
+        });
+        if(!CollectionUtils.isEmpty(charDOList)) {
+            bdSelectInputCharMapper.batchInsert(charDOList);
+        }
+        WebUtil.setPersistence(persistence);
+    }
+}
+
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/FormulaServiceImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/FormulaServiceImpl.java
new file mode 100644
index 0000000..f267a2c
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/FormulaServiceImpl.java
@@ -0,0 +1,1163 @@
+package com.vci.web.service.impl;
+
+import com.vci.starter.web.constant.VciSystemVarConstants;
+import com.vci.starter.web.toolmodel.DateConverter;
+import com.vci.starter.web.util.Md5;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.starter.web.util.VciDateUtil;
+import com.vci.web.service.WebBoServiceI;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.lang.reflect.Method;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.Period;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+
+/**
+ * 鍏紡澶勭悊
+ * @author weidy
+ * @date 2022-02-11
+ *
+ */
+@Service
+public class FormulaServiceImpl {
+
+	/**
+	 * 鏃ュ織鏂囦欢
+	 */
+	private Logger logger = LoggerFactory.getLogger(getClass());
+
+	/**
+	 * 涓氬姟鏁版嵁鏈嶅姟
+	 */
+	@Autowired
+	private WebBoServiceI boService;
+
+	/**
+	 * 鏄惁杩愯瀹屾垚
+	 */
+	private Boolean formulaBlag = true;
+	/**
+	 * 杩愮畻绗�
+	 */
+	public static List<String> lc = new ArrayList<String>();
+
+	static {
+		lc.add("+");
+		lc.add("-");
+		lc.add("*");
+		lc.add("/");
+	}
+
+	/**
+	 * 閫昏緫杩愮畻绗�
+	 */
+	public static List<String> lj = new ArrayList<String>();
+	static {
+		lj.add(">");
+		lj.add("<");
+		lj.add("=");
+		lj.add("!");
+	}
+
+	/**
+	 * 鍑芥暟锛宨nt鏁扮粍娉ㄩ噴,绗竴涓爣璇�:0鑷甫鍑芥暟 1鑷畾涔夊嚱鏁�;绗簩涓爣璇�:鍙傛暟涓暟
+	 */
+	public static Map<String, int[]> funMap = new HashMap<String, int[]>();
+	// int鏁扮粍娉ㄩ噴,绗竴涓爣璇�:0鑷甫鍑芥暟 1鑷畾涔夊嚱鏁�;绗簩涓爣璇�:鍙傛暟涓暟
+	static {
+		// 鑷甫鍑芥暟,鍙埄鐢ㄥ弽灏勬満鍒�
+		funMap.put("abs", new int[] { 0, 1 });
+		funMap.put("acos", new int[] { 0, 1 });
+		funMap.put("asin", new int[] { 0, 1 });
+		funMap.put("atan", new int[] { 0, 1 });
+		funMap.put("cbrt", new int[] { 0, 1 });
+		funMap.put("ceil", new int[] { 0, 1 });
+		funMap.put("cos", new int[] { 0, 1 });
+		funMap.put("cosh", new int[] { 0, 1 });
+		funMap.put("exp", new int[] { 0, 1 });
+		funMap.put("expm1", new int[] { 0, 1 });
+		funMap.put("floor", new int[] { 0, 1 });
+		funMap.put("log", new int[] { 0, 1 });
+		funMap.put("log10", new int[] { 0, 1 });
+		funMap.put("log1p", new int[] { 0, 1 });
+		funMap.put("random", new int[] { 0, 0 });
+		funMap.put("rint", new int[] { 0, 1 });
+		funMap.put("round", new int[] { 0, 1 });
+		funMap.put("signum", new int[] { 0, 1 });
+		funMap.put("sin", new int[] { 0, 1 });
+		funMap.put("sinh", new int[] { 0, 1 });
+		funMap.put("sqrt", new int[] { 0, 1 });
+		funMap.put("tan", new int[] { 0, 1 });
+		funMap.put("tanh", new int[] { 0, 1 });
+		funMap.put("max", new int[] { 0, 2 });
+		funMap.put("min", new int[] { 0, 2 });
+
+		// 鑷畾涔夊嚱鏁�
+		funMap.put("if", new int[] { 1, 3 });
+		funMap.put("sum", new int[] { 1, 2 });
+		funMap.put("sub", new int[] { 1, 2 });
+		funMap.put("mul", new int[] { 1, 2 });
+		funMap.put("div", new int[] { 1, 2 });
+		funMap.put("mod", new int[] { 1, 2 });
+		funMap.put("toInt", new int[] { 1, 1 });
+		funMap.put("toDouble", new int[] { 1, 1 });
+		funMap.put("doubleRound", new int[] { 1, 2 });
+		funMap.put("zeroIfNull", new int[] { 1, 1 });
+		funMap.put("endsWith", new int[] { 1, 2 });
+		funMap.put("startsWith", new int[] { 1, 2 });
+		funMap.put("charAt", new int[] { 1, 2 });
+		funMap.put("equalsIgnoreCase", new int[] { 1, 2 });
+		funMap.put("indexOf", new int[] { 1, 2 });
+		funMap.put("isEmpty", new int[] { 1, 1 });
+		funMap.put("lastIndexOf", new int[] { 1, 2 });
+		funMap.put("leftStr", new int[] { 1, 2 });
+		funMap.put("length", new int[] { 1, 1 });
+		funMap.put("mid", new int[] { 1, 3 });
+		funMap.put("right", new int[] { 1, 2 });
+		funMap.put("rightStr", new int[] { 1, 2 });
+		funMap.put("tolowercase", new int[] { 1, 1 });
+		funMap.put("touppercase", new int[] { 1, 1 });
+		funMap.put("trimzero", new int[] { 1, 1 });
+		funMap.put("compareDate", new int[] { 1, 2 });
+		funMap.put("nowDate", new int[] { 1, 0 });
+		funMap.put("chinaDate", new int[] { 1, 1 });
+		funMap.put("dateDdd", new int[] { 1, 2 });
+		funMap.put("dateBalanceYear",new int[] {1,3});
+		funMap.put("dateBalanceDay",new int[] {1,2});
+		funMap.put("dateformat", new int[] { 1, 2 });
+		funMap.put("nowDatetime", new int[] { 1, 0 });
+		funMap.put("dayOf", new int[] { 1, 1 });
+		funMap.put("nowMon", new int[] { 1, 1 });
+		funMap.put("monOf", new int[] { 1, 1 });
+		funMap.put("nowTime", new int[] { 1, 0 });
+		funMap.put("nowYear", new int[] { 1, 0 });
+		funMap.put("yearOf", new int[] { 1, 1 });
+		funMap.put("getChineseCurrency", new int[] { 1, 1 });
+		funMap.put("setThmark", new int[] { 1, 1 });
+		funMap.put("toChinese", new int[] { 1, 1 });
+		funMap.put("getcolvalue", new int[] { 1, 5 });
+		funMap.put("MD5", new int[]{1,1});
+		funMap.put("getValueByMethod", new int[]{1,3});
+	}
+
+	/**
+	 * 鍏紡鍒濆鍖栬浆鎹�
+	 * 
+	 * @param str 鍏紡鐨勫唴瀹�
+	 * @return 杞崲鍚庣殑鍐呭
+	 */
+	private  String strCast(String str) {
+		// str = str.toLowerCase();// 鍘婚櫎绌烘牸锛屽彉灏忓啓
+		if (str == null ? true : str.length() == 0) {
+			return "0";
+		}
+		str = str.trim();
+		if (!checkFormula(str)) {
+			formulaError();
+			return str;
+		}
+		str = str.replaceAll("锛�", ",");
+		str = str.replaceAll("\\+-", "-");
+		str = str.replaceAll("-\\+", "-");
+		//str = str.replaceAll(" ", "");
+		return str;
+	}
+
+	/**
+	 * 妫�鏌ュ叕寮忎腑鎷彿鍑虹幇娆℃暟鏄惁姝g‘
+	 * 
+	 * @param formulaStr 鍏紡鐨勫唴瀹�
+	 * @return true 琛ㄧず鏍¢獙鎴愬姛
+	 */
+	private  boolean checkFormula(String formulaStr) {
+		formulaBlag = true;
+		int count = 0;
+		for (int i = 0; i < formulaStr.length(); i++) {
+			String s = String.valueOf(formulaStr.charAt(i));
+			if ("(".equals(s)) {
+				count++;
+			} else if (")".equals(s)) {
+				count--;
+			}
+			if (count < 0) {
+				formulaBlag = false;
+				break;
+			}
+		}
+		formulaBlag = count == 0;
+		return formulaBlag;
+	}
+
+	/**
+	 * 鍒嗗壊鍑芥暟
+	 * 
+	 * @param str 瀛楃涓�
+	 * @param bs 鍒嗗壊绗�
+	 * @return 杞崲鍚庣殑鍐呭
+	 */
+	private  String[] spliteFun(String str, String bs) {
+		List<String> list = new ArrayList<String>();
+		String bds = "";
+		int bracket = 0;
+		int len = str.length();
+		for (int i = 0; i < len; i++) {
+			String s = String.valueOf(str.charAt(i));
+			if ("(".equals(s)) {
+				bracket++;
+			} else if (")".equals(s)) {
+				bracket--;
+			}
+
+			if (bracket == 0 && bs.equals(s)) {
+				list.add(bds);
+				bds = "";
+				continue;
+			}
+
+			bds += s;
+		}
+
+		list.add(bds);
+
+		String[] ss = new String[list.size()];
+		for (int i = 0; i < list.size(); i++) {
+			ss[i] = list.get(i);
+		}
+
+		return ss;
+	}
+
+	/**
+	 * 鐢ㄦ埛鑷畾涔夊嚱鏁�
+	 * 
+	 * @param str 瀛楃涓�
+	 * @param funStr 鍑芥暟鐨勫唴瀹�
+	 * @return
+	 */
+	private  String customFun(String str, String funStr) {
+		String reval = "false";
+		String[] gss = spliteFun(str, ",");
+		//姣忎竴涓弬鏁帮紝鎴戦兘搴旇鍘荤湅鐪嬫槸鍚﹁繕鏈�()銆傝繖璇存槑閲岄潰鏄柟娉�
+		for (int i = 0; i < gss.length; i++) {
+			String record = gss[i];
+			if(StringUtils.isNotBlank(record) && record.contains("(") && record.contains(")")){
+				gss[i] = calculate(gss[i]);
+			}
+		}
+		if ("if".equals(funStr)) {
+			//logger.debug("绗竴涓弬鏁帮細" + gss[0]);
+			if (compare(gss[0])) {
+				reval = calculate(gss[1]);
+			} else {
+				reval = calculate(gss[2]);
+			}
+		} else if ("sum".equals(funStr)) {
+			BigDecimal ln = new BigDecimal(gss[0]);
+			BigDecimal rn = new BigDecimal(gss[1]);
+			reval = ln.add(rn).doubleValue() + "";
+		} else if ("sub".equals(funStr)) {
+			BigDecimal ln = new BigDecimal(gss[0]);
+			BigDecimal rn = new BigDecimal(gss[1]);
+			reval = ln.subtract(rn).doubleValue() + "";
+		} else if ("mul".equals(funStr)) {
+			BigDecimal ln = new BigDecimal(gss[0]);
+			BigDecimal rn = new BigDecimal(gss[1]);
+			reval = ln.multiply(rn).doubleValue() + "";
+		} else if ("div".equals(funStr)) {
+			BigDecimal ln = new BigDecimal(gss[0]);
+			BigDecimal rn = new BigDecimal(gss[1]);
+			if (rn.doubleValue() == 0) {
+				formulaError();
+				//reval = "0";
+				return reval;
+			} else {
+				reval = ln.divide(rn, 10, BigDecimal.ROUND_HALF_UP) + "";
+			}
+
+		} else if ("mod".equals(funStr)) {
+			int rn = Integer.parseInt(gss[1]);
+			if (rn == 0) {
+				formulaError();
+				
+				return reval;
+			}
+			int ln = Integer.parseInt(gss[0]);
+			reval = (ln % rn) + "";
+		} else if ("toInt".equals(funStr)) {
+			reval = (int) Math.floor(new Double(calculate(gss[0]))) + "";
+		} else if("toDouble".equals(funStr)){
+			reval = new Double(calculate(gss[0])) + "";
+		}else if("MD5".equals(funStr)){
+			reval = Md5.md5(calculate(gss[0]));
+		}else if ("doubleRound".equals(funStr)) {
+			try {
+				BigDecimal b = new BigDecimal(calculate(gss[0]));
+				reval = b.setScale(Integer.parseInt(gss[1]),
+						BigDecimal.ROUND_HALF_UP).doubleValue()
+						+ "";
+			} catch (Exception e) {
+				e.printStackTrace();
+				formulaError();
+			}
+
+		} else if ("zeroIfNull".equals(funStr)) {
+			logger.debug(gss[0]);
+			if ("null".equals(gss[0]) || gss[0].trim().length() == 0) {
+				reval = "0";
+				return reval;
+			}
+			reval = gss[0];
+		} else if ("endsWith".equals(funStr)) {
+			reval = "false";
+			if (gss[0].endsWith(gss[1])) {
+				reval = "true";
+			}
+
+		} else if ("startsWith".equals(funStr)) {
+			reval = "false";
+			if (gss[0].startsWith(gss[1])) {
+				reval = "true";
+			}
+		} else if ("charAt".equals(funStr)) {
+			try {
+				reval = String.valueOf(gss[0].charAt(Integer.parseInt(gss[1])));
+			} catch (Exception e) {
+				e.printStackTrace();
+				formulaError();
+				reval = "";
+			}
+
+		} else if ("equalsignoreCase".equals(funStr)) {
+			if (gss[0].equalsIgnoreCase(gss[1])) {
+				reval = "true";
+			}
+		} else if ("indexOf".equals(funStr)) {
+			reval = gss[0].indexOf(gss[1]) + "";
+		} else if ("isEmpty".equals(funStr)) {
+			if (gss[0].trim().length() == 0 || "".equals(gss[0])
+					|| "null".equals(gss[0])) {
+				reval = "true";
+			}
+		} else if ("lastIndexOf".equals(funStr)) {
+			reval = gss[0].lastIndexOf(gss[1]) + "";
+		} else if ("leftStr".equals(funStr)) {
+			reval = gss[0].substring(0, Integer.parseInt(gss[1]));
+		} else if ("length".equals(funStr)) {
+			reval = gss[0].length() + "";
+		} else if ("right".equals(funStr)) {
+			reval = String.valueOf(gss[0].charAt(gss[0].length()
+					- Integer.parseInt(gss[1])));
+
+		} else if ("rightStr".equals(funStr)) {
+			reval = gss[0]
+					.substring(gss[0].length() - Integer.parseInt(gss[1]));
+		} else if ("mid".equals(funStr)) {
+			try {
+				reval = gss[0].substring(Integer.parseInt(gss[1]),
+						Integer.parseInt(gss[2]));
+			}catch (Exception e) {
+				e.printStackTrace();
+				formulaError();
+				reval = "";
+			}
+					
+		} else if ("tolowercase".equals(funStr)) {
+			reval = gss[0].toLowerCase();
+		} else if ("touppercase".equals(funStr)) {
+			reval = gss[0].toUpperCase();
+		} else if ("trimZero".equals(funStr)) {
+			int len = gss[0].length() - 1;
+			for (int i = len; i >= 0; i--) {
+				if (gss[0].charAt(i) == '0') {
+					gss[0] = gss[0].substring(0, gss[0].length() - 1);
+				} else {
+					reval = gss[0];
+					break;
+				}
+			}
+		} else if ("compareDate".equals(funStr)) {
+			if (gss[0].indexOf("date") != -1) {
+				gss[0] = calculate(gss[0]);
+			}
+			if (gss[1].indexOf("date") != -1) {
+				gss[1] = calculate(gss[1]);
+			}
+			gss[0] = gss[0].replaceAll("`", "-");
+			gss[1] = gss[1].replaceAll("`", "-");
+			String result;
+			try {
+				result = VciDateUtil.compareDate(gss[0], gss[1]);
+				if ("=".equals(result)) {
+					reval = "true";
+				}
+				;
+			} catch (Exception e) {
+				e.printStackTrace();
+				formulaError();
+			}
+
+		} else if ("nowDate".equals(funStr)) {
+			reval = VciDateUtil.getNowString("yyyy-MM-dd");
+		} else if ("chinaDate".equals(funStr)) {
+			try {
+				if (gss[0].indexOf("date") != -1) {
+					gss[0] = calculate(gss[0]);
+				}
+				gss[0] = gss[0].replaceAll("`", "-");
+				reval = VciDateUtil.getChinaDate(gss[0]);
+				return reval;
+			} catch (Exception e) {
+				e.printStackTrace();
+				formulaError();
+			}
+		} else if ("dateAdd".equals(funStr)) {
+			try {
+				if (gss[0].indexOf("date") != -1) {
+					gss[0] = calculate(gss[0]);
+				}
+				gss[0] = gss[0].replaceAll("`", "-");
+				DateConverter dateConverter = new DateConverter();
+				dateConverter.setAsText(gss[0]);
+				Date date = VciDateUtil.getDateAddDay(dateConverter.getValue(),
+						Integer.parseInt(gss[1]));
+				reval = VciDateUtil.date2Str(date, VciDateUtil.DateTimeFormat);
+				return reval;
+			} catch (Exception e) {
+				e.printStackTrace();
+				formulaError();
+			}
+		} else if("dateBalanceYear".equals(funStr)) {
+			//姹傛椂闂寸殑宸
+			//3涓弬鏁帮紝瀵规瘮鐨勬簮鍊硷紝瀵规瘮鐨勭洰鏍囧��,鏄惁杩涗竴
+			String sourceDate = gss[0];
+			String targetDate = gss[1];
+			boolean remainderType = "true".equalsIgnoreCase(gss[2]) ? true : false;
+			DateConverter dateConverter = new DateConverter();
+			dateConverter.setAsText(sourceDate);
+			Date sDate = dateConverter.getValue();
+			Date tDate = new Date();
+			if (StringUtils.isBlank(targetDate)) {
+				dateConverter.setAsText(targetDate);
+				tDate = dateConverter.getValue();
+			}
+
+			Period p = Period.between(LocalDate.parse(VciDateUtil.date2Str(sDate, VciDateUtil.DateTimeMillFormat), DateTimeFormatter.ofPattern(VciDateUtil.DateTimeMillFormat)),
+					LocalDate.parse(VciDateUtil.date2Str(tDate, VciDateUtil.DateTimeMillFormat), DateTimeFormatter.ofPattern(VciDateUtil.DateTimeMillFormat)));
+			reval = String.valueOf((remainderType && (p.getMonths() > 0 || p.getDays() > 0)) ? (p.getYears() + 1) : p.getYears());
+			//鏈堜唤鐩稿樊鏄病鍔炴硶璁$畻
+		}else if("dateBalanceDay".equals(funStr)){
+			String sourceDate = gss[0];
+			String targetDate = gss[1];
+			DateConverter dateConverter = new DateConverter();
+			dateConverter.setAsText(sourceDate);
+			Date sDate = dateConverter.getValue();
+			Date tDate = new Date();
+			if (StringUtils.isNotBlank(targetDate)) {
+				dateConverter.setAsText(targetDate);
+				tDate = dateConverter.getValue();
+			}
+			reval = String.valueOf(TimeUnit.DAYS.convert(Math.abs(sDate.getTime()-tDate.getTime()),TimeUnit.MILLISECONDS));
+		}else if ("dateformat".equals(funStr)) {
+			if (gss[0].indexOf("date") != -1) {
+				gss[0] = calculate(gss[0]);
+			}
+			gss[0] = gss[0].replaceAll("`", "-");
+			gss[1] = gss[1].replaceAll("`", "-");
+			Date date;
+			try {
+				if("''".equalsIgnoreCase(gss[0])) {
+					gss[0] = VciDateUtil.getNowString();
+				}
+				DateConverter dateConverter =new DateConverter();
+				dateConverter.setAsText(gss[0]);
+				date = dateConverter.getValue();
+				reval = VciDateUtil.date2Str(date, gss[1].replace("&"," "));
+				return reval;
+			} catch (Exception e) {
+				e.printStackTrace();
+				formulaError();
+			}
+
+		} else if ("nowDatetime".equals(funStr)) {
+			reval = VciDateUtil.getNowString();
+		} else if ("dayOf".equals(funStr)) {
+			if (gss[0].indexOf("date") != -1) {
+				gss[0] = calculate(gss[0]);
+			}
+			gss[0] = gss[0].replaceAll("`", "-");
+			try {
+				Date date = VciDateUtil.str2Date(gss[0], "yyyy-MM-dd");
+				reval = date.getDate() + "";
+				return reval;
+			} catch (Exception e) {
+				e.printStackTrace();
+				formulaError();
+			}
+		} else if ("nowNon".equals(funStr)) {
+			try {
+				reval = VciDateUtil.getNowString("MM");
+				return reval;
+			} catch (Exception e) {
+				e.printStackTrace();
+				formulaError();
+			}
+		} else if ("monOf".equals(funStr)) {
+			if (gss[0].indexOf("date") != -1) {
+				gss[0] = calculate(gss[0]);
+			}
+			gss[0] = gss[0].replaceAll("`", "-");
+			try {
+				Date date = VciDateUtil.str2Date(gss[0], "yyyy-MM-dd");
+				reval = date.getMonth() + "";
+				return reval;
+			} catch (Exception e) {
+				e.printStackTrace();
+				formulaError();
+			}
+		} else if ("nowTime".equals(funStr)) {
+			reval = VciDateUtil.getNowString("HH:mm:ss");
+			return reval;
+		} else if ("nowYear".equals(funStr)) {
+			reval = VciDateUtil.getNowString("yyyy");
+			return reval;
+		} else if ("yearOf".equals(funStr)) {
+			if (gss[0].indexOf("date") != -1) {
+				gss[0] = calculate(gss[0]);
+			}
+			gss[0] = gss[0].replaceAll("`", "-");
+			try {
+				Date date = VciDateUtil.str2Date(gss[0], "yyyy-MM-dd");
+				reval = date.getYear() + 1900 + "";
+				return reval;
+			} catch (Exception e) {
+				e.printStackTrace();
+				formulaError();
+			}
+		} else if ("getChineseCurrency".equals(funStr)) {
+			gss[0] = calculate(gss[0]);
+			reval = toChineseCurrency(gss[0]);
+		} else if ("setThmark".equals(funStr)) {
+			String numstr = "";
+
+			String[] number = gss[0].split("\\.");
+			//logger.debug(number[0]);
+			for (int i = number[0].length() - 1; i >= 0; i--) {
+				if (i % 3 == 2 && i < number[0].length() - 1) {
+					numstr += ",";
+				}
+				numstr += number[0].charAt(i);
+			}
+			reval = "";
+			for (int i = numstr.toCharArray().length - 1; i >= 0; i--) {
+				reval += numstr.toCharArray()[i];
+			}
+			if (gss[0].indexOf(".") != -1) {
+				reval += "." + number[1];
+			}
+
+		} else if ("toChinese".equals(funStr)) {
+			gss[0] = calculate(gss[0]);
+			//logger.debug(gss[0]);
+			reval = toChinese(gss[0]);
+		} else if ("getcolvalue".equals(funStr)) {
+			if (gss[0].trim().length() == 0 || gss[1].trim().length() == 0
+					|| gss[2].trim().length() == 0
+					|| gss[3].trim().length() == 0
+					|| gss[4].trim().length() == 0) {
+				formulaError();
+				return reval;
+			}
+			reval = getColValue(gss[0], gss[1], gss[2], gss[3], gss[4]);
+		}else if("getValueByMethod".equalsIgnoreCase(funStr)){
+			if (gss[0].trim().length() == 0 || gss[1].trim().length() == 0
+					|| gss[2].trim().length() == 0) {
+				formulaError();
+				return reval;
+			}
+			reval = getValueByMethod(gss[0], gss[1], gss[2]);
+		}
+
+		return reval;
+	}
+
+	// 閫昏緫琛ㄨ揪寮忓垽鏂�
+	private  boolean compare(String str) {
+		if ("true".equals(calculate(str))) {
+			return true;
+		} else if ("false".equals(calculate(str))) {
+			return false;
+		}
+		boolean flag = false;
+		boolean bs = false;
+		int len = str.length();
+		int bracket = 0;
+		String ljbds = "";
+		double d_left = 0;
+		double d_right = 0;
+		for (int i = 0; i < len; i++) {
+			String s = String.valueOf(str.charAt(i));
+			if ("(".equals(s)) {
+				bracket++;
+			} else if (")".equals(s)) {
+				bracket--;
+			}
+
+			if (bracket == 0 && lj.contains(s)) {
+				for (int j = i; j < len; j++) {
+					String ts = String.valueOf(str.charAt(j));
+					if (lj.contains(ts)) {
+						ljbds += ts;
+					} else {
+						bs = true;
+						break;
+					}
+				}
+			}
+			if (bs) {
+				break;
+			}
+		}
+		//logger.debug("閫昏緫琛ㄨ揪寮忥細" + ljbds);
+		String[] s = str.split(ljbds);
+		//logger.debug("宸﹁竟锛�" + (s[0]));
+		//logger.debug("鍙宠竟锛�" + (s[1]));
+		if (isNumber(calculate(s[0])) && isNumber(calculate(s[1]))) {
+			d_left = new Double(calculate(s[0]));
+			d_right = new Double(calculate(s[1]));
+		} else {
+			formulaError();
+			return false;
+		}
+
+		if ("<".equals(ljbds)) {
+			if (d_left < d_right) {
+				return true;
+			}
+		} else if (">".equals(ljbds)) {
+			if (d_left > d_right) {
+				return true;
+			}
+		} else if ("=".equals(ljbds)) {
+			if (d_left == d_right) {
+				return true;
+			}
+		} else if (">=".equals(ljbds)) {
+			if (d_left >= d_right) {
+				return true;
+			}
+		} else if ("<=".equals(ljbds)) {
+			if (d_left <= d_right) {
+				return true;
+			}
+		} else if ("<>".equals(ljbds) || "!=".equals(ljbds)) {
+			if (d_left != d_right) {
+				return true;
+			}
+		} else {
+			formulaError();
+		}
+		return flag;
+	}
+
+	/**
+	 * 浣跨敤鍏紡璁$畻缁撴灉
+	 * @param dataMap 鏈満鏅彉閲忕殑鍊�
+	 * @param calculateString 鍏紡鐨勫唴瀹�
+	 * @return 鎵ц鍚庣殑鍊�
+	 */
+	public String getValueByFormula(Map<String,String> dataMap,String calculateString){
+		final String[] finalRule = new String[]{calculateString};
+		if(!CollectionUtils.isEmpty(dataMap)){
+			dataMap.forEach((key,value)->{
+				if(value == null){
+					value = "";
+				}
+				finalRule[0] = finalRule[0].replace("${" + key + "}",value);
+			});
+		}
+		return calculate(finalRule[0]);
+	}
+
+	/**
+	 * 閫掑綊璋冪敤杩愮畻锛屾敞鎰忓彉閲忛渶瑕佽嚜琛屾浛鎹�
+	 * 
+	 * @param str
+	 * @return
+	 */
+	public  String calculate(String str) {
+		str = this.strCast(str);
+		if (!formulaBlag) {
+			//logger.debug("鍏紡涓嶆纭�");
+			return str;
+		}
+		boolean onlyFunction = str.length()>2 && str.startsWith("->");
+		if(onlyFunction){
+			str = str.substring(2);
+		}
+		//闇�瑕佹浛鎹㈢郴缁熷彉閲�
+		Map<String, String> systemVarValueMap = VciSystemVarConstants.getSystemVarValueMap();
+		if(!CollectionUtils.isEmpty(systemVarValueMap)){
+			final String[] finalStr = new String[]{str};
+			systemVarValueMap.forEach((key,value)->{
+				if(value == null){
+					value = "";
+				}
+				finalStr[0] = finalStr[0].replace( key,value);
+			});
+			str = finalStr[0];
+		}
+		String reval = "";
+		String bds = "";
+		int bracket = 0;// 瀵瑰簲鎷彿涓暟
+		int pos = 0;
+		boolean title = false;
+		// 濡傛灉浠ヨ礋鏁板紑澶达紝鍏堝幓鎺夎礋鍙�
+		if (str.substring(0, 1).equals("-")) {
+			str = str.substring(1);
+			title = true;
+		}
+
+		int len = str.length();
+		for (int i = 0; i < len; i++) {
+			String s = String.valueOf(str.charAt(i));
+			pos = i;
+			bracket = 0;
+			if (!lc.contains(s)) {// 濡傛灉娌¢亣鍒拌繍绠楃
+				if ("(".equals(s)) {// 濡傛灉閬囧埌宸︽嫭鍙�
+					if (funMap.containsKey(bds)) {// 濡傛灉宸︽嫭鍙峰墠鏄嚱鏁�
+						for (int j = i + 1; j < len; j++) {// 浠庡乏鎷彿鍚庡紑濮嬪惊鐜�
+							pos++;// 绱绉诲姩瀛楃浣嶆暟
+							String ts = String.valueOf(str.charAt(j));// 鍗曚釜瀛楃
+							// reval+=ts;
+							if ("(".equals(ts))// 濡傛灉鏄乏鎷彿绱
+							{
+								bracket++;
+							} else if (")".equals(ts)) {// 濡傛灉鏄彸鎷彿杩涜鍑忓皯
+								bracket--;
+								if (bracket == -1) {// 濡傛灉鏄�-1,鏍囪瘑鎷彿缁撴潫
+									reval = reval.substring(0, reval.length()
+											- bds.length());// 閲嶆柊鑾峰緱鍘绘帀鍑芥暟澶寸殑琛ㄨ揪寮�
+									reval += this.funCalculate(
+											str.substring(i + 1, j), bds);// 琛ㄨ揪寮忓姞涓婂嚱鏁扮粨鏋�,褰㈡垚鏂拌〃杈惧紡
+									i = pos;// 璁℃暟鍣ㄥ鍔�
+									bds = "";// 鍑芥暟澶存竻绌�
+									break;// 閫�鍑烘湰娆″惊鐜�
+								}
+							}
+						}
+					} else if ("".equals(bds) || lc.contains(bds)) {// 濡傛灉鏄櫘閫氳繍绠�
+						//logger.debug("鏅�氳繍绠�");
+						for (int j = i + 1; j < len; j++) {
+							pos++;
+							String ts = String.valueOf(str.charAt(j));
+							if ("(".equals(ts)) {
+								bracket++;
+							} else if (")".equals(ts)) {
+								bracket--;
+								if (bracket == -1) {
+									logger.debug("褰撳墠璁$畻鐨勫瓧绗︿覆涓猴細"
+											+ str.substring(i + 1, pos));
+									reval += calculate(str
+											.substring(i + 1, pos));
+									i = pos;
+									bds = "";
+									break;
+								}
+							}
+						}
+					} else {
+						logger.debug("娌℃湁姝ゅ嚱鏁�");
+						formulaError();
+					}
+				} else {// 绱姞鎬昏〃杈惧紡鍜屾渶鍚庝竴涓繍绠楁暟(鎴栧嚱鏁�)
+					bds += s;
+					reval += s;
+				}
+			} else {// 閬囧埌杩愮畻绗︽渶鍚庝竴涓繍绠楁暟(鎴栧嚱鏁�)娓呯┖
+				bds = "";
+				reval += s;
+			}
+		}
+		// 濡傛灉涓鸿礋鏁� 鍦ㄥ墠闈㈠姞璐熷彿
+		if (title) {
+			reval = "0-" + reval;
+		}
+		if(onlyFunction){
+			
+			return reval;
+		}
+		String result =  basicOperation(reval);
+		logger.debug("璁$畻缁撴灉" + result);
+		return result;
+	}
+
+	/**
+	 * 鍑芥暟杩愮畻
+	 * 
+	 * @param gs
+	 * @param funStr
+	 * @return
+	 */
+	private  String funCalculate(String gs, String funStr) {
+		String rval = "0";
+		logger.debug("鍑芥暟鍚嶏細" + funStr);
+		if (funMap.containsKey(funStr)) {
+			int[] csi = funMap.get(funStr);
+			try {
+				if (csi[0] == 0) {// java鍐呴儴鍑芥暟,閫氳繃鍙嶅皠璋冪敤
+					Class[] cs = new Class[csi[1]];
+					Object[] objs = new Object[csi[1]];
+					String[] gss = splitParameter(gs);
+					for (int i = 0; i < csi[1]; i++) {
+						cs[i] = double.class;
+						objs[i] = new Double(calculate(gss[i]));
+					}
+					Class cls = Class.forName("java.lang.Math");
+					Method m = cls.getMethod(funStr, cs);
+					logger.debug("鏂规硶鍚嶏細" + m);
+					rval = String.valueOf(m.invoke(cls, objs));
+				} else if (csi[0] == 1) {// 鑷畾涔夊嚱鏁�
+					rval = customFun(gs, funStr);
+				}
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		}
+
+		return rval;
+	}
+
+	// 鍏紡閲岀殑鍙傛暟鍒嗗壊
+	public static String[] splitParameter(String str) {
+		int len = str.length();
+		boolean flag = true;
+		String tstr = "";
+
+		for (int i = 0; i < len; i++) {
+			String s = String.valueOf(str.charAt(i));
+			if ("(".equals(s)) {
+				flag = false;
+			} else if (")".equals(s)) {
+				flag = true;
+			}
+			if (flag && ",".equals(s)) {
+				tstr += "@";
+			} else {
+				tstr += s;
+			}
+		}
+		return tstr.split("@");
+
+	}
+
+	/**
+	 * 鍥涘垯杩愮畻琛ㄨ揪寮忓鐞�
+	 * 
+	 * @param gs
+	 * @return
+	 */
+	private  String basicOperation(String gs) {
+		gs = gs + "+0"; // 鍥犱负涓嬮潰鐨勮绠楁槸閬囧埌绗﹀彿鎵嶈繘琛�,鎵�浠ュ鍔犲叆涓�涓绠楃鍙�,涓嶅奖鍝嶅��.
+		if(gs.indexOf("-")>-1){//鍖呭惈鏈�-鍙锋垨鑰呮槸璐熸暟
+			if(gs.startsWith("-")) {
+				gs = "0" + gs;
+			}
+//			if(gs.indexOf("-")>0&&lc.contains(gs.substring(gs.indexOf("-")-1,gs.indexOf("-")))){//绱ф尐鐫�鏃佽竟灏辨槸杩愮畻绗�,鎬庝箞鍔炲晩
+//				//gs = gs.substring(0,gs.indexOf("-")-1) + "(0" + gs.substring(gs.indexOf("-"))
+//			}
+		}
+		String c1 = "";// 绗竴涓繍绠楃鍙�
+		String c2 = "";// 绗簩涓繍绠楃鍙�
+		String s1 = "";// 绗竴涓繍绠楁暟
+		String s2 = "";// 绗簩涓繍绠楁暟
+		String s3 = "";// 绗笁涓繍绠楁暟
+
+		int len = gs.length();
+		for (int i = 0; i < len; i++) {
+			String s = String.valueOf(gs.charAt(i));// 鑾峰緱璇ヤ綅缃瓧绗﹀苟杞崲鎴愬瓧绗︿覆鍋氭瘮杈�
+			if (lc.contains(s)) { // 濡傛灉鏄繍绠楃鍙�
+				if (c1.length() == 0)// 濡傛灉绗竴涓繍绠楃鍙蜂负绌�,鍔犲叆
+				{
+					c1 = s;
+				} else if (c2.length() == 0) {// 鍚﹀垯,濡傛灉绗簩涓繍绠楃鍙蜂负绌�,鍔犲叆
+					c2 = s;// 绗簩涓繍绠楃鍙�
+					if ("+".equals(c2) || "-".equals(c2)) {// 濡傛灉绗簩涓繍绠楃鍙风骇鍒綆,閭d箞杩涜璁$畻
+						if(s2.trim().length()>0){
+						    s1 = this.operation(s1, c1, s2);// 绗竴涓拰绗簩涓暟璁$畻
+						    c1 = c2;// 淇濆瓨绗簩涓繍绠楃,鍏朵粬涓虹┖
+						    c2 = "";
+						    s2 = "";
+						}else{//s2杩樻病鍑虹幇
+							s2=this.calculate(gs.substring(i));
+							s1 = this.operation(s1, c1, s2);
+							break;
+						}
+					}
+				} else {// 涓婅堪閮戒繚瀛樿繃
+					if ("+".equals(s) || "-".equals(s)) {// 濡傛灉绗笁涓繍绠楃绾у埆浣�,杩涜杩愮畻
+						s2 = this.operation(s2, c2, s3);// 鍏堢畻绗簩涓変釜鏁�,淇濆瓨鑷崇浜屼釜
+						s1 = this.operation(s1, c1, s2);// 鍐嶇畻绗竴浜屼釜,淇濆瓨鑷崇涓�涓�
+						c1 = s;// 淇濆瓨褰撳墠杩愮畻绗�,鍏朵粬涓虹┖
+						s2 = "";
+						c2 = "";
+						s3 = "";
+					} else {// 濡傛灉绗笁涓繍绠楃绾у埆楂�
+						s2 = this.operation(s2, c2, s3);// 鍏堢畻绗簩涓変釜鏁�,淇濆瓨鑷崇浜屼釜
+						c2 = s;// 鍓嶉潰涓嶅姩,淇濆瓨杩愮畻绗�
+						s3 = "";
+					}
+				}
+			} else if (s1.length() > 0 && c1.length() > 0 && c2.length() == 0) {// 濡傛灉绗竴涓暟,绗竴涓繍绠楃宸蹭繚瀛�,绗簩涓繍绠楃鏈繚瀛�,淇濆瓨绗簩鍝ユ暟
+				s2 += s;
+			} else if (c1.length() == 0) {// 濡傛灉娌℃湁杩愮畻绗�,淇濆瓨绗竴涓暟
+				s1 += s;
+			} else if (s1.length() > 0 && s2.length() > 0 && c1.length() > 0
+					&& c2.length() > 0) {// 濡傛灉绗竴浜屼釜鏁板拰杩愮畻绗﹂兘鏈�,淇濆瓨绗笁涓暟
+				s3 += s;
+			}
+		}
+		return s1;
+	}
+
+	/**
+	 * 鍩烘湰鍥涘垯杩愮畻
+	 * 
+	 * @param c1
+	 *            杩愮畻鏁�1
+	 * @param s1
+	 *            杩愮畻绗�(鍔犲噺涔橀櫎)
+	 * @param c2
+	 *            杩愮畻鏁�2
+	 * @return
+	 */
+	private  String operation(String c1, String s1, String c2) {
+		String reval = "0";
+		String c22 = "";
+		try {
+			for (int i = 0; i < c2.length(); i++) {
+				String s = String.valueOf(c2.charAt(i));
+				if (lj.contains(s)) {
+					break;
+				}
+				c22 += s;
+			}
+			if (isNumber(c1) && isNumber(c22)) {
+				BigDecimal ln = new BigDecimal(c1.trim());
+				BigDecimal rn = new BigDecimal(c2.trim());
+				if ("+".equals(s1)) {
+					return ln.add(rn).doubleValue() + "";
+				} else if ("-".equals(s1)) {
+					return ln.subtract(rn).doubleValue() + "";
+				} else if ("*".equals(s1)) {
+					return ln.multiply(rn).doubleValue() + "";
+				} else if ("/".equals(s1)) {
+					if (rn.doubleValue() == 0) {
+						return reval;
+					}
+					else {
+						return ln.divide(rn, 10, BigDecimal.ROUND_HALF_UP) + "";
+					}
+				}
+			} else {
+				this.formulaError();
+				return c1+s1+c2;
+			}
+
+		} catch (Exception e) {
+			this.formulaError();
+			e.printStackTrace();
+		} finally {
+		}
+
+		return reval;
+	}
+
+	private  Boolean isNumber(String str) {
+		return StringUtils.isNotBlank(str) && str.matches("(-)?([1-9]+[0-9]*|0)(\\.[\\d]+)?");
+	}
+
+	private  String formulaError() {
+		formulaBlag = false;
+		//logger.debug("鍏紡楠岃瘉澶辫触锛岃閲嶆柊杈撳叆");
+		return "fail";
+	}
+
+	public  String toChineseCurrency(String value) {
+		String doubleValue = this.calculate("doubleround(" + value + ",2)");
+		String fushu = "";
+		if (doubleValue.indexOf("-") == 0) {
+			fushu = "璐�";
+			doubleValue = doubleValue.substring(1);
+//			formulaError();
+//			return "";
+		}
+		char[] hunit = { '鎷�', '浣�', '浠�' }; // 娈靛唴浣嶇疆琛ㄧず
+		char[] vunit = { '涓�', '浜�' }; // 娈靛悕琛ㄧず
+		char[] digit = { '闆�', '澹�', '璐�', '鍙�', '鑲�', '浼�', '闄�', '鏌�', '鎹�', '鐜�' }; // 鏁板瓧琛ㄧず
+		//double midVal =  (Double.parseDouble(doubleValue) * 100); // 杞寲鎴愭暣褰�
+		//String valStr = String.valueOf(midVal); // 杞寲鎴愬瓧绗︿覆
+		//String head = valStr.substring(0, valStr.length() - 2); // 鍙栨暣鏁伴儴鍒�
+		//String rail = valStr.substring(valStr.length() - 2); // 鍙栧皬鏁伴儴鍒�
+		String head = "";
+		String rail = "00";
+		if(doubleValue.indexOf(".")>-1){
+			head = doubleValue.substring(0,doubleValue.indexOf("."));
+			rail = doubleValue.substring(doubleValue.indexOf(".")+1);
+			if(rail.trim().length() == 1) {
+				rail += "0";//蹇呴』瑕佷繚璇佹湁鍒�
+			}
+		}
+		else {
+			head = doubleValue;
+		}
+		String prefix = ""; // 鏁存暟閮ㄥ垎杞寲鐨勭粨鏋�
+		String suffix = ""; // 灏忔暟閮ㄥ垎杞寲鐨勭粨鏋�
+		// 澶勭悊灏忔暟鐐瑰悗闈㈢殑鏁�
+		if (rail.equals("00")) { // 濡傛灉灏忔暟閮ㄥ垎涓�0
+			suffix = "鏁�";
+		} else {
+			suffix = digit[rail.charAt(0) - '0'] + "瑙�"
+					+ digit[rail.charAt(1) - '0'] + "鍒�"; // 鍚﹀垯鎶婅鍒嗚浆鍖栧嚭鏉�
+		}
+		// 澶勭悊灏忔暟鐐瑰墠闈㈢殑鏁�
+		char[] chDig = head.toCharArray(); // 鎶婃暣鏁伴儴鍒嗚浆鍖栨垚瀛楃鏁扮粍
+		char zero = '0'; // 鏍囧織'0'琛ㄧず鍑虹幇杩�0
+		byte zeroSerNum = 0; // 杩炵画鍑虹幇0鐨勬鏁�
+		for (int i = 0; i < chDig.length; i++) { // 寰幆澶勭悊姣忎釜鏁板瓧
+			int idx = (chDig.length - i - 1) % 4; // 鍙栨鍐呬綅缃�
+			int vidx = (chDig.length - i - 1) / 4; // 鍙栨浣嶇疆
+			if (chDig[i] == '0') { // 濡傛灉褰撳墠瀛楃鏄�0
+				zeroSerNum++; // 杩炵画0娆℃暟閫掑
+				if (zero == '0') { // 鏍囧織
+					zero = digit[0];
+				} else if (idx == 0 && vidx > 0 && zeroSerNum < 4) {
+					prefix += vunit[vidx - 1];
+					zero = '0';
+				}
+				continue;
+			}
+			zeroSerNum = 0; // 杩炵画0娆℃暟娓呴浂
+			if (zero != '0') { // 濡傛灉鏍囧織涓嶄负0,鍒欏姞涓�,渚嬪涓�,浜夸粈涔堢殑
+				prefix += zero;
+				zero = '0';
+			}
+			prefix += digit[chDig[i] - '0']; // 杞寲璇ユ暟瀛楄〃绀�
+			if (idx > 0) {
+				prefix += hunit[idx - 1];
+			}
+			if (idx == 0 && vidx > 0) {
+				prefix += vunit[vidx - 1]; // 娈电粨鏉熶綅缃簲璇ュ姞涓婃鍚嶅涓�,浜�
+			}
+		}
+
+		if (prefix.length() > 0) {
+			prefix += '鍦�'; // 濡傛灉鏁存暟閮ㄥ垎瀛樺湪,鍒欐湁鍦嗙殑瀛楁牱
+		}
+		return fushu + prefix + suffix; // 杩斿洖姝g‘琛ㄧず
+	}
+
+	private String toChinese(String value) {
+		if (!isNumber(value)) {
+			this.formulaError();
+			return "";
+		}
+		String fu = "";
+		// 濡傛灉鏄礋鏁板墠闈㈠姞璐�
+		if (value.indexOf("-") == 0) {
+			value = value.substring(1);
+			fu += "璐�";
+		}
+		char[] hunit = { '鎷�', '浣�', '浠�' }; // 娈靛唴浣嶇疆琛ㄧず
+		char[] vunit = { '涓�', '浜�' }; // 娈靛悕琛ㄧず
+		char[] digit = { '闆�', '涓�', '浜�', '涓�', '鍥�', '浜�', '鍏�', '涓�', '鍏�', '涔�' }; // 鏁板瓧琛ㄧず
+		String head = "";
+		String rail = "";
+		String prefix = ""; // 鏁存暟閮ㄥ垎杞寲鐨勭粨鏋�
+		String suffix = ""; // 灏忔暟閮ㄥ垎杞寲鐨勭粨鏋�
+		if (value.indexOf(".") != -1 && value.indexOf(".") < value.length() - 1) {
+			String[] number = value.split("\\.");
+			head = number[0]; // 鍙栨暣鏁伴儴鍒�
+			rail = number[1];
+			suffix += "鐐�";
+		} else {
+			head = value;
+		}
+		// 澶勭悊灏忔暟鐐瑰悗闈㈢殑鏁�
+		for (int i = 0; i < rail.length(); i++) {
+			suffix += digit[rail.charAt(i) - '0'];
+		}
+
+		// 澶勭悊灏忔暟鐐瑰墠闈㈢殑鏁�
+		char[] chDig = head.toCharArray(); // 鎶婃暣鏁伴儴鍒嗚浆鍖栨垚瀛楃鏁扮粍
+		char zero = '0'; // 鏍囧織'0'琛ㄧず鍑虹幇杩�0
+		byte zeroSerNum = 0; // 杩炵画鍑虹幇0鐨勬鏁�
+		for (int i = 0; i < chDig.length; i++) { // 寰幆澶勭悊姣忎釜鏁板瓧
+			int idx = (chDig.length - i - 1) % 4; // 鍙栨鍐呬綅缃�
+			int vidx = (chDig.length - i - 1) / 4; // 鍙栨浣嶇疆
+			if (chDig[i] == '0') { // 濡傛灉褰撳墠瀛楃鏄�0
+				zeroSerNum++; // 杩炵画0娆℃暟閫掑
+				if (zero == '0') { // 鏍囧織
+					zero = digit[0];
+				} else if (idx == 0 && vidx > 0 && zeroSerNum < 4) {
+					prefix += vunit[vidx - 1];
+					zero = '0';
+				}
+				continue;
+			}
+			zeroSerNum = 0; // 杩炵画0娆℃暟娓呴浂
+			if (zero != '0') { // 濡傛灉鏍囧織涓嶄负0,鍒欏姞涓�,渚嬪涓�,浜夸粈涔堢殑
+				prefix += zero;
+				zero = '0';
+			}
+			prefix += digit[chDig[i] - '0']; // 杞寲璇ユ暟瀛楄〃绀�
+			if (idx > 0) {
+				prefix += hunit[idx - 1];
+			}
+			if (idx == 0 && vidx > 0) {
+				prefix += vunit[vidx - 1]; // 娈电粨鏉熶綅缃簲璇ュ姞涓婃鍚嶅涓�,浜�
+			}
+		}
+		return fu + prefix + suffix; // 杩斿洖姝g‘琛ㄧず
+	}
+
+	private  String getColValue(String servername, String tableName,
+			String fieldname, String pkfield, String pkvalue) {
+		//鏆傛椂涓嶆敮鎸乻erver鐨勬柟寮�
+			String sql = "select " + fieldname.trim() + " from " +  tableName.trim() + " where " + pkfield + " = :" + pkfield;
+			Map<String,String> param = new HashMap<String, String>();
+			param.put(pkfield, pkvalue);
+			String str = "";
+			try{
+			    List data = boService.queryBySqlForMap(sql, param);
+			    if(data != null || data.size() > 0) {
+					str = (String) ((HashMap) data.get(0)).get(fieldname.trim());
+				}
+			}catch(Exception e){
+				
+			}
+			return str;
+
+	}
+	
+	private String getValueByMethod(String serviceName,String methods,String paramsString){
+		//鏆傛椂涓嶆敮鎸侀�氳繃鏂规硶鏉ヨ幏鍙栧��
+		return paramsString;
+	}
+
+	public static void main(String[] args) {
+
+	}
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/LoginServiceImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/LoginServiceImpl.java
new file mode 100644
index 0000000..771c83d
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/LoginServiceImpl.java
@@ -0,0 +1,488 @@
+package com.vci.web.service.impl;
+
+import com.vci.frameworkcore.ajaxTask.SmUserUnLockTask;
+import com.vci.frameworkcore.ajaxTask.SmUserUnLockTaskManager;
+import com.vci.frameworkcore.compatibility.ISmFunctionQueryService;
+import com.vci.frameworkcore.compatibility.SmRoleQueryServiceI;
+import com.vci.frameworkcore.compatibility.SmUserQueryServiceI;
+import com.vci.frameworkcore.enumpck.ResourceControlTypeEnum;
+import com.vci.frameworkcore.lcstatuspck.FrameworkDataLCStatus;
+import com.vci.frameworkcore.pagemodel.SmFunctionVO;
+import com.vci.frameworkcore.pagemodel.SmPasswordStrategyVO;
+import com.vci.frameworkcore.pagemodel.SmRoleVO;
+import com.vci.frameworkcore.pagemodel.SmUserVO;
+import com.vci.starter.web.annotation.bus.*;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.interceptor.VciSessionForLoginI;
+import com.vci.starter.web.pagemodel.RequestClientInfo;
+import com.vci.starter.web.pagemodel.SessionInfo;
+import com.vci.starter.web.util.ApplicationContextProvider;
+import com.vci.starter.web.util.Md5;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.starter.web.util.VciDateUtil;
+import com.vci.web.bo.LoginResultBO;
+import com.vci.web.dto.LoginUserDTO;
+import com.vci.frameworkcore.properties.VciSecurityManageProperties;
+import com.vci.web.service.LoginServiceI;
+import com.vci.web.util.BusAnnotationUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.lang.reflect.Method;
+import java.text.MessageFormat;
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static com.vci.frameworkcore.constant.FrameWorkBusLangCodeConstant.*;
+
+/**
+ * 鐧诲綍鐨勬湇鍔�
+ * @author weidy
+ * @date 2020/1/29
+ */
+@Service
+public class LoginServiceImpl implements LoginServiceI {
+
+    /**
+     * 鏃ュ織
+     */
+    private Logger logger = LoggerFactory.getLogger(getClass());
+
+    /**
+     * 浼氳瘽澶勭悊
+     */
+    @Autowired
+    private VciSessionForLoginI sessionForLogin;
+
+    /**
+     * 瑙i攣浠诲姟
+     */
+    @Autowired
+    private SmUserUnLockTaskManager unLockTaskManager;
+
+    /**
+     * 鏉冮檺绠$悊鐨勭浉鍏抽厤缃�
+     */
+    @Autowired
+    private VciSecurityManageProperties securityManageProperties;
+
+    /**
+     * 鐢ㄦ埛鏌ヨ鏈嶅姟锛屽彲浠ュ吋瀹硅�佸钩鍙�
+     */
+    @Autowired()
+    private SmUserQueryServiceI userQueryService;
+
+    /**
+     * 瑙掕壊鐨勬煡璇㈡湇鍔★紝鍙互鍏煎鑰佸钩鍙�
+     */
+    @Autowired
+    private SmRoleQueryServiceI roleQueryService;
+
+    /**
+     * 鏉冮檺鐨勬煡璇㈡湇鍔★紝鍙互鍏煎鑰佸钩鍙�
+     */
+    @Autowired
+    private ISmFunctionQueryService functionQueryService;
+
+    /**
+     * 鎵ц鐧诲綍
+     * @param userDTO 鐧诲綍淇℃伅
+     * @param clientInfo 璇锋眰鐨勫鎴风鐨勪俊鎭�
+     * @throws VciBaseException 鐧诲綍鍙戠敓寮傚父鐨勬椂鍊欏嚭鐜颁簡閿欒
+     */
+    @Override
+    public LoginResultBO login(LoginUserDTO userDTO, RequestClientInfo clientInfo) throws VciBaseException {
+        return login(userDTO,clientInfo,true);
+    }
+
+    /**
+     * 鐧诲綍
+     * @param userDTO 鐢ㄦ埛鐨勬暟鎹紶杈撳璞�
+     * @param clientInfo 瀹㈡埛绔殑淇℃伅
+     * @param checkPassword 鏄惁鏍¢獙瀵嗙爜
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 鍙傛暟閿欒锛岀敤鎴蜂笉鑳界櫥褰曠瓑浼氭姏鍑哄紓甯�
+     */
+    private LoginResultBO login(LoginUserDTO userDTO, RequestClientInfo clientInfo, boolean checkPassword) throws VciBaseException {
+        LoginResultBO loginResult = new LoginResultBO();
+        loginResult.setSuccess(false);
+        //1.鍒ゆ柇鐢ㄦ埛鐨勫熀鏈俊鎭�
+//        VciBaseUtil.alertNotNull(userDTO, "鐧诲綍淇℃伅", userDTO.getUserId(), "鐢ㄦ埛璐﹀彿");
+//        if (checkPassword) {
+//            VciBaseUtil.alertNotNull(userDTO.getPassword(), "鐧诲綍瀵嗙爜");
+//        }
+        //鐧诲綍涔嬪墠璋冪敤鎻掍欢
+        BusAnnotationUtil.callForAnnotation(VciLoginPlugin.class,VciLoginBefore.class,userDTO,clientInfo);
+
+//        String loginInfo = checkIsLogined(userDTO.getUserId());
+//        if (!userDTO.isForceLogin() && securityManageProperties.isUserOneLogin()) {
+//            //闇�瑕佺湅鐪嬫槸鍚﹀凡缁忕櫥褰曚簡
+//            if (StringUtils.isNotBlank(loginInfo)) {
+//                loginResult.setFailCode(USER_IS_LOGINED);
+//                loginResult.setFailMsg(loginInfo);
+//                return loginResult;
+//            }
+//        }
+        //2.鑾峰彇鐢ㄦ埛鐨勫璞�.杩欓噷闇�瑕佸吋瀹硅�佸钩鍙板拰鑰乸dm锛岃�佺紪鐮佸拰鑰佸钩鍙版槸涓�涓〃
+//        SmUserVO user = userQueryService.getUserByUserId(userDTO.getUserId().trim());
+//        if (user == null || StringUtils.isEmpty(user.getOid())) {
+//            loginResult.setFailCode(USER_NOT_FOUND);
+//            loginResult.setFailMsgArray(new String[]{userDTO.getUserId()});
+//            return loginResult;
+//        }
+        //濡傛灉鐢ㄦ埛宸茬粡琚仠鐢ㄥ拰閿佸畾锛屼笉鑳界櫥褰�
+        //濡傛灉鐢ㄦ埛鐨勫け鏁堟棩鏈熷凡缁忚秴杩囦簡褰撳墠鏃堕棿锛屼笉鑳界櫥褰�
+        //鍙湁鏂板钩鍙扮殑鐢ㄦ埛鎵嶅垽鏂け鏁�
+//        if (FrameworkDataLCStatus.DISABLED.getValue().equals(user.getLcStatus())) {
+//            loginResult.setFailCode(USER_IS_DISABLED);
+//            loginResult.setFailMsgArray(new String[]{userDTO.getUserId()});
+//            return loginResult;
+//        }
+//        if (userQueryService.checkUserLock(user, user.getPwdWrongCount())) {
+//            loginResult.setFailCode(USER_IS_LOCK);
+//            loginResult.setFailMsgArray(new String[]{userDTO.getUserId()});
+//            return loginResult;
+//        }
+//        if (user.getDisabledate() != null) {
+//            //2021鐗堟湰鎵嶆湁杩欎釜灞炴�х殑鍊硷紝褰撳墠杩欎釜娌℃湁杩欎釜鍊�
+//            Date disableDate = VciDateUtil.addOrSubDate(user.getDisabledate(), Calendar.DATE, 1);
+//            if (disableDate != null && disableDate.getTime() < System.currentTimeMillis()) {
+//                loginResult.setFailCode(USER_MORE_THAN_DISABLE_DATE);
+//                loginResult.setFailMsgArray(new String[]{userDTO.getUserId()});
+//                return loginResult;
+//            }
+//        }
+//        if (user.getPwdWrongCount() == null) {
+//            user.setPwdWrongCount(0);
+//        }
+//        SmPasswordStrategyVO passwordStrategyVO = userQueryService.getPasswordStrategyVOByUserOid(user.getOid());
+//        if (checkPassword) {
+//            boolean passwordIsEqual = userQueryService.checkPasswordEqual(userDTO.getPassword(), user.getOid());
+//            //3.鍒ゆ柇鐢ㄦ埛鐨勫瘑鐮佹槸鍚︽纭�
+//            if (!passwordIsEqual) {
+//                //鍓嶇闇�瑕佸厛md5涓�娆★紝鐒跺悗鍚庡彴鍐峂D5涓�娆★紝
+//                if (logger.isDebugEnabled()) {
+//                    logger.debug("{}瀵嗙爜涓嶆纭�", user.getId());
+//                }
+//                if (passwordStrategyVO == null) {
+//                    //鍙兘鏁版嵁闂娌℃湁璁剧疆瀵嗙爜绛栫暐
+//                    passwordStrategyVO = new SmPasswordStrategyVO();
+//                    passwordStrategyVO.setRetryTime(6);
+//                    passwordStrategyVO.setLockTime(30);
+//                }
+//                if (passwordStrategyVO.getRetryTime() <= (user.getPwdWrongCount() + 1)) {
+//                    user.setLockFlag(true);
+//                    updateUserPwdWrongCount(user.getOid(), user.getPwdWrongCount() + 1);
+//                    addUserToUnLock(userDTO.getUserId(), passwordStrategyVO.getLockTime());
+//                    updateUserPwdWrongCount(user.getOid(), user.getPwdWrongCount() + 1);
+//                    loginResult.setFailCode(USER_PWD_LOCK);
+//                    loginResult.setFailMsgArray(new String[]{userDTO.getUserId(), passwordStrategyVO.getLockTime() + ""});
+//                    return loginResult;
+//                } else {
+//                    //杩樻病鏈夊埌閿佸畾鐨勬鏁�
+//                    updateUserPwdWrongCount(user.getOid(), user.getPwdWrongCount() + 1);
+//                    //5, 杩欐槸绗竴娆¢敊璇紝鍓╀笅鐨勬槸 5- 锛�0+1锛�
+//                    loginResult.setFailCode(USER_PWD_NOT_EQUAL);
+//                    loginResult.setFailMsgArray(new String[]{userDTO.getUserId(), (passwordStrategyVO.getRetryTime() - (user.getPwdWrongCount() + 1)) + ""});
+//                    return loginResult;
+//                }
+//            }
+//        }
+        //璇存槑瀵嗙爜姝g‘鐨�
+//        if (logger.isDebugEnabled()) {
+//            logger.debug("{}鐨勫瘑鐮佹纭�", user.getId());
+//        }
+//        user.setLastLoginTime(new Date());
+//        user.setPwdWrongCount(0);
+        SmUserVO user = new SmUserVO();
+        user.setId("1");
+        user.setName("1");
+        user.setOid("1");
+        user.setUserType("1");
+        user.setUserTypeText("1");
+        user.setSecretGrade(1);
+        user.setSecretGradeText("1");
+        user.setSex("1");
+        user.setSexText("1");
+        user.setPkPerson("1");
+        user.setPkPersonName("1");
+        user.setPkDepartment("1");
+        user.setPkDepartmentName("1");
+        user.setPkDuty("1");
+        user.setPkDutyName("1");
+        user.setEmail("1");
+        user.setTel("1");
+        user.setRtxNo("1");
+        user.setIMNo("1");
+
+
+
+
+        SessionInfo sessionInfo = new SessionInfo();
+        //鎷疯礉鐢ㄦ埛鐨勬柊鍒皊ession浼氳瘽涓�
+        copyUser2SessionInfo(user, sessionInfo, userDTO.getLangCode());
+        //鎷疯礉璇锋眰淇℃伅鍒皊ession浼氳瘽涓�
+        copyRequest2SessionInfo(clientInfo, sessionInfo);
+        //鏌ヨ鎵�鏈夌殑瑙掕壊
+//        List<SmRoleVO> roleVOList = roleQueryService.listRoleByUserOid(user.getOid(), null);
+//        if (!CollectionUtils.isEmpty(roleVOList)) {
+//            Map<String, String> roleOidNameMap = roleVOList.stream().collect(Collectors.toMap(s -> s.getOid(), t -> t.getName()));
+//            sessionInfo.setRolesName(roleOidNameMap);
+//        } else {
+//            sessionInfo.setRolesName(new HashMap());
+//        }
+        //鏌ヨ鎵�鏈夌殑鏉冮檺
+//        List<SmFunctionVO> functionVOList = functionQueryService.listFunctionByUserOid(user.getOid(), null, ResourceControlTypeEnum.BS);
+//        if (!CollectionUtils.isEmpty(functionVOList)) {
+//            List<String> functionOidList = functionVOList.stream().map(s -> s.getOid()).collect(Collectors.toList());
+//            sessionInfo.setFunctionOids(functionOidList);
+//        } else {
+//            sessionInfo.setFunctionOids(new ArrayList());
+//        }
+
+        loginResult.setSuccess(true);
+        //妫�鏌ユ槸鍚﹁淇敼瀵嗙爜
+//        if (!clientInfo.isSso() && checkPassword) {
+//            //鏈�鍚庝慨鏀规椂闂�+ 澶辨晥鏃堕棿锛屽ぇ浜庣瓑浜庡綋鍓嶆棩鏈燂紝鍒欓渶瑕侀┈涓婁慨鏀瑰瘑鐮�
+//            Date currentDay = null;
+//            try {
+//                currentDay = VciDateUtil.getNow(VciDateUtil.DateFormat);
+//            } catch (Throwable e) {
+//                if (logger.isErrorEnabled()) {
+//                    logger.error("鑾峰彇褰撳墠鏃ユ湡", e);
+//                }
+//            }
+//            if (currentDay != null && passwordStrategyVO != null && passwordStrategyVO.getValidDay() != null) {
+//                Date inValidDay = null;
+//                if (user.getLastModifyPasswordTime() == null) {
+//                    //閲嶆潵娌℃湁鐧诲綍杩�
+//                    loginResult.setMustChangePassword(true);
+//                } else {
+//                    inValidDay = VciDateUtil.addOrSubDate(user.getLastModifyPasswordTime(), Calendar.DATE, passwordStrategyVO.getValidDay());
+//                    if (inValidDay.getTime() <= (currentDay).getTime()) {
+//                        loginResult.setMustChangePassword(true);
+//                    }
+//                }
+//                if (!loginResult.isMustChangePassword()) {
+//                    if (VciDateUtil.addOrSubDate(inValidDay, Calendar.DATE, -(passwordStrategyVO.getRemindDay())).getTime()
+//                            <= (currentDay).getTime()) {
+//                        //鎮ㄧ殑瀵嗙爜杩樻湁{0}澶╄繃鏈燂紝璇峰強鏃朵慨鏀瑰瘑鐮�
+//                        long remainDay = VciDateUtil.getDaySub(inValidDay, currentDay);
+//                        loginResult.setPasswordInfo(MessageFormat.format(PASSWORD_REMAIN_DAY, new String[]{String.valueOf(remainDay)}));
+//                    }
+//                }
+//            }
+//        }
+
+        //鍘熸湰鎯充娇鐢╦wt鏉ョ敓鎴恡oken锛屼絾鏄湁浠ヤ笅闂
+        //1.jwt涓嶈兘澶勭悊娉ㄩ攢鐨勯棶棰�
+        //2.jwt鐢熸垚鐨則oken澶暱浜�
+        //3.鍥犱负鏈钩鍙颁笉鏄簰鑱旂綉绯荤粺锛屽彧闇�瑕佽В鍐冲垎甯冨紡鐢ㄦ埛淇℃伅鐨勮幏鍙栧拰鏉冮檺鐨勬牎楠屽嵆鍙��
+        //4.骞冲彴寮曠敤浜唕edis鍜屾暟鎹簱鏉ュ瓨鍌ㄤ細璇濈殑淇℃伅锛屽彧闇�瑕佷繚璇佹牴鎹畉oken鑳借幏鍙栧埌浼氳瘽淇℃伅鍗冲彲
+        //5.鍦ㄦ湇鍔″惎鍔ㄧ殑鏃跺�欙紝灏嗕細璇濅俊鎭竻闄わ紝鍦ㄦ敞閿�鐨勬椂鍊欏皢浼氳瘽淇℃伅娓呴櫎
+        //uuid鍦ㄩ珮骞跺彂鐨勬儏鍐典笅浼氶噸澶嶏紝浣嗘槸浼犵粺杞欢骞跺彂寰堝皬锛屾墍浠ュ嚭鐜扮殑閲嶅鐨勬鐜囧緢灏�
+
+        sessionInfo.setToken(Md5.md5(VciBaseUtil.getPk() + "_" + user.getId()));
+        loginResult.setSessionInfo(sessionInfo);
+//        updateUserForLoginSuccess(user.getOid());
+//        if (StringUtils.isNotBlank(loginInfo) && userDTO.isForceLogin() && securityManageProperties.isUserOneLogin()) {
+//            //璇存槑宸茬粡鐧诲綍浜嗭紝閭e簲璇ュ彇娑堝師鏉ョ殑鐧诲綍
+//            popUser(userDTO.getUserId());
+//        }
+
+        //娣诲姞鍒颁細璇濅俊鎭�
+//        saveSessionInfo(sessionInfo);
+
+        //鐧诲綍鍚庢墽琛�
+//        BusAnnotationUtil.callForAnnotation(VciLoginPlugin.class,VciLoginAfter.class,userDTO,clientInfo,loginResult);
+        return loginResult;
+    }
+
+
+    /**
+     * 鍗曠偣鐧诲綍
+     *
+     * @param userDTO    鐧诲綍淇℃伅
+     * @param clientInfo 璇锋眰鐨勫鎴风鐨勪俊鎭�
+     * @return 鐧诲綍鐨勭粨鏋滃璞�
+     * @throws VciBaseException 鐧诲綍澶辫触鐨勬椂鍊欐姏鍑哄紓甯�
+     */
+    @Override
+    public LoginResultBO singleLogin(LoginUserDTO userDTO, RequestClientInfo clientInfo) throws VciBaseException {
+        return login(userDTO,clientInfo,false);
+    }
+
+    /**
+     * 閫�鍑虹郴缁�
+     *
+     * @param userToken 鐢ㄦ埛鐨勮鍙爜
+     * @throws VciBaseException 鍒犻櫎浼氳瘽淇℃伅鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public void logout(String userToken) throws VciBaseException {
+        VciBaseUtil.alertNotNull(userToken,"鐢ㄦ埛鐨勪細璇濊鍙�");
+        Map<String, Object> logoutpluginBeanMap =ApplicationContextProvider.getApplicationContext().getBeansWithAnnotation(VciLogoutPlugin.class);
+        if(!CollectionUtils.isEmpty(logoutpluginBeanMap)){
+            logoutpluginBeanMap.forEach((k,v) -> {
+                Method[] methods = v.getClass().getDeclaredMethods();
+                if(methods!=null&& methods.length>0){
+                    for(Method method:methods){
+                        if(method.isAnnotationPresent(VciLogoutBefore.class)){
+                            try {
+                                method.invoke(v,userToken);
+                            } catch(Throwable e){
+                                if(logger.isErrorEnabled()){
+                                    logger.error("璋冪敤閫�鍑轰箣鍓嶇殑鎻掍欢鍑洪敊",e);
+                                }
+                                throw new VciBaseException("璋冪敤閫�鍑轰箣鍓嶇殑鎻掍欢鍑洪敊,{0},{1}",new String[]{v.getClass().getName(),method.getName()},e);
+                            }
+                        }
+                    }
+                }
+            });
+        }
+        sessionForLogin.logout(userToken);
+        if(!CollectionUtils.isEmpty(logoutpluginBeanMap)){
+            logoutpluginBeanMap.forEach((k,v) -> {
+                Method[] methods = v.getClass().getDeclaredMethods();
+                if(methods!=null&& methods.length>0){
+                    for(Method method:methods){
+                        if(method.isAnnotationPresent(VciLoginAfter.class)){
+                            try {
+                                method.invoke(v,userToken);
+                            } catch(Throwable e){
+                                if(logger.isErrorEnabled()){
+                                    logger.error("璋冪敤閫�鍑虹櫥褰曚箣鍚庣殑鎻掍欢鍑洪敊",e);
+                                }
+                                throw new VciBaseException("璋冪敤閫�鍑虹櫥褰曚箣鍚庢彃浠跺嚭閿�,{0},{1}",new String[]{v.getClass().getName(),method.getName()},e);
+                            }
+                        }
+                    }
+                }
+            });
+        }
+    }
+
+    /**
+     * 鏍¢獙鏄惁鐧诲綍
+     * @param userId 鐢ㄦ埛鍚�
+     * @return 宸茬粡鐧诲綍鏃讹紝
+     */
+    private String checkIsLogined(String userId) {
+        if(sessionForLogin == null){
+            throw new VciBaseException("娌℃湁閰嶇疆浼氳瘽瀛樺偍鐨勬湇鍔�");
+        }
+        return sessionForLogin.checkIsLogined(userId);
+    }
+
+    /**
+     * 鎶婁互鍓嶇殑鐧诲綍淇℃伅绉婚櫎
+     * @param userId 鐢ㄦ埛鍚�
+     */
+    private void popUser(String userId){
+        if(sessionForLogin == null){
+            throw new VciBaseException("娌℃湁閰嶇疆浼氳瘽瀛樺偍鐨勬湇鍔�");
+        }
+        sessionForLogin.popUser(userId);
+    }
+
+    /**
+     * 淇濆瓨浼氳瘽淇℃伅
+     * @param sessionInfo 浼氳瘽淇℃伅
+     */
+    private void saveSessionInfo(SessionInfo sessionInfo){
+        if(sessionForLogin == null){
+            throw new VciBaseException("娌℃湁閰嶇疆浼氳瘽瀛樺偍鐨勬湇鍔�");
+        }
+        sessionForLogin.saveSessionInfo(sessionInfo);
+    }
+
+    /**
+     * 鎷疯礉璇锋眰鐨勪俊鎭埌浼氳瘽淇℃伅涓�
+     * @param clientInfo 璇锋眰淇℃伅
+     * @param sessionInfo 浼氳瘽淇℃伅
+     */
+    private void copyRequest2SessionInfo(RequestClientInfo clientInfo, SessionInfo sessionInfo) {
+        sessionInfo.setIp(clientInfo.getIpaddress());
+        //ip鐨勫湴鍧�鍦╟ontroller閲岃缃�
+        sessionInfo.setOs(clientInfo.getOsversion());
+        sessionInfo.setBrowser(clientInfo.getBrowserversion());
+        sessionInfo.setSso(clientInfo.isSso());
+        sessionInfo.setSsoServiceName(clientInfo.getSsoSystemName());
+    }
+
+    /**
+     * 鎷疯礉鐢ㄦ埛鐨勪俊鎭埌 浼氳瘽淇℃伅
+     * @param user 鐢ㄦ埛瀵硅薄
+     * @param sessionInfo  浼氳瘽瀵硅薄
+     * @param langCode 璇█缂栫爜
+     */
+    private void copyUser2SessionInfo(SmUserVO user, SessionInfo sessionInfo, String langCode){
+        sessionInfo.setUserOid(user.getOid());
+        sessionInfo.setUserId(user.getId());
+        sessionInfo.setUserName(user.getName());
+        sessionInfo.setUsertype(user.getUserType());
+        sessionInfo.setUsertypeText(user.getUserTypeText());
+        sessionInfo.setUserSecret(user.getSecretGrade()==null?"":(user.getSecretGrade()+ ""));
+        sessionInfo.setUserSecretText(user.getSecretGradeText());
+        sessionInfo.setSex(user.getSex());
+        sessionInfo.setSexText(user.getSexText());
+        //sessionInfo.setPhotoUrl(user.getPhoto());
+        sessionInfo.setLanguage(user.getLangCode());
+        if(StringUtils.isNotBlank(langCode)){
+            //浼犻�掍簡瑕佹樉绀虹殑璇█
+            sessionInfo.setLanguage(langCode);
+        }
+        sessionInfo.setPersonOid(user.getPkPerson());
+        sessionInfo.setPersonName(user.getPkPersonName());
+        sessionInfo.setDeptOid(user.getPkDepartment());
+        sessionInfo.setDeptName(user.getPkDepartmentName());
+        sessionInfo.setDutyOid(user.getPkDuty());
+        sessionInfo.setDutyName(user.getPkDutyName());
+        sessionInfo.setEmail(user.getEmail());
+        sessionInfo.setPhoneNo(user.getTel());
+        sessionInfo.setRtxNo(user.getRtxNo());
+        sessionInfo.setIMId(user.getIMNo());
+        sessionInfo.setPortalId(user.getId());
+
+//        sessionInfo.setWorkNo(user.getWorkNo());
+//        sessionInfo.setWorkTypeOid(user.getPkWorkType());
+//        sessionInfo.setWorkTypeName(user.getPkWorkTypeText());
+    }
+
+    /**
+     * 鏇存柊鐢ㄦ埛鐨勯敊璇鏁�
+     * @param userOid 鐢ㄦ埛涓婚敭
+     * @param wrongCount 閿欒娆℃暟
+     */
+    private void updateUserPwdWrongCount(String userOid,Integer wrongCount){
+        userQueryService.updateUserPwdWrongCount(userOid,wrongCount);
+    }
+
+    /**
+     * 娣诲姞鐢ㄦ埛鍒拌В閿侀槦鍒椾腑
+     * @param userId 鐢ㄦ埛鐨勮处鍙�
+     * @param lockTime 閿佸畾鏃堕棿锛屽崟浣嶆槸鍒�
+     */
+    public void addUserToUnLock(String userId,Integer lockTime){
+        //鏄洜涓鸿閿佸畾锛岄渶瑕佹坊鍔犺嚜鍔ㄨВ閿�
+        if(lockTime == null){
+            //闃叉鏁版嵁鍑洪敊锛屾病鏈塴ockTime
+            lockTime = 30;
+        }
+        userQueryService.lockUser(userId);
+        unLockTaskManager.put(new SmUserUnLockTask(userQueryService,userId,(long)lockTime*60*1000));
+    }
+
+    /**
+     * 鐧诲綍鎴愬姛鍚庢洿鏂扮敤鎴蜂俊鎭�
+     * @param userOid 鐢ㄦ埛涓婚敭
+     */
+    private void updateUserForLoginSuccess(String userOid){
+        userQueryService.updateUserLoginTime(userOid);
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/OsAttributeServiceImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/OsAttributeServiceImpl.java
new file mode 100644
index 0000000..7f1354a
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/OsAttributeServiceImpl.java
@@ -0,0 +1,437 @@
+package com.vci.web.service.impl;
+
+import com.vci.client.common.providers.ServiceProvider;
+import com.vci.corba.common.VCIError;
+import com.vci.starter.web.annotation.log.VciUnLog;
+import com.vci.starter.web.enumpck.VciFieldTypeEnum;
+import com.vci.starter.web.pagemodel.BaseQueryObject;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.starter.web.util.VciDateUtil;
+import com.vci.web.constant.CacheKeyConstant;
+import com.vci.web.model.OsAttributeDO;
+import com.vci.web.pageModel.OsAttributeVO;
+import com.vci.web.service.OsAttributeServiceI;
+import com.vci.web.util.PlatformClientUtil;
+import com.vci.web.util.WebUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.cache.annotation.CachePut;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import plm.corba.attribpool.AttribItem;
+import plm.corba.attribpool.AttribItemFilter;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static com.vci.web.constant.CacheNameConstant.VCI_OBJECT_SERVICE;
+import static plm.vo.omd.attribpool.ui.VTDataTypePanel.*;
+
+/**
+ * 灞炴�ф睜鏈嶅姟  --宸茬粡璋冪敤浜嗗钩鍙扮殑鏈嶅姟锛屽洜姝や笉鍦ㄦ彁渚汥ao灞�
+ * @author weidy
+ * @date 2021-2-15
+ */
+@Service
+public class OsAttributeServiceImpl implements OsAttributeServiceI {
+
+	/**
+	 * 鏃ュ織
+	 */
+	private Logger logger = LoggerFactory.getLogger(getClass());
+
+	/**
+	 * 骞冲彴鐨勮皟鐢ㄥ伐鍏风被
+	 */
+	@Autowired
+	private PlatformClientUtil platformClientUtil;
+
+	/**
+	 * 鍔犺浇鑷韩
+	 */
+	@Autowired(required = false)
+	@Lazy
+	private OsAttributeServiceI self;
+
+	/**
+	 * 榛樿鐨勫睘鎬�
+	 */
+	private static List<OsAttributeVO> defaultAttributeVOs = new ArrayList<>();
+
+	/**
+	 * 榛樿灞炴�х殑鏄犲皠锛宬ey鏄皬鍐�
+	 */
+	private static Map<String,OsAttributeVO> defaultAttributeVOMap = new HashMap<>();
+
+	/**
+	 * 鑾峰彇榛樿鐨勫睘鎬�
+	 * @return 榛樿鐨勫睘鎬у垪琛�
+	 */
+	@Override
+	public List<OsAttributeVO> getDefaultAttributeVOs() {
+		return OsAttributeServiceImpl.defaultAttributeVOs;
+	}
+
+	/**
+	 * 璁剧疆榛樿鐨勫睘鎬�
+	 * @param defaultAttributeVOs 榛樿鐨勫睘鎬у垪琛�
+	 */
+	@Override
+	public void setDefaultAttributeVOs(List<OsAttributeVO> defaultAttributeVOs) {
+		OsAttributeServiceImpl.defaultAttributeVOs = defaultAttributeVOs;
+	}
+
+	/**
+	 * 鑾峰彇鐨勯粯璁ゅ睘鎬х殑鏄犲皠
+	 * @return 榛樿鐨勫睘鎬ф槧灏�
+	 */
+	@Override
+	public Map<String, OsAttributeVO> getDefaultAttributeVOMap() {
+		return OsAttributeServiceImpl.defaultAttributeVOMap;
+	}
+
+	/**
+	 * 璁剧疆榛樿鐨勫睘鎬х殑鏄犲皠
+	 * @param defaultAttributeVOMap 榛樿鐨勫睘鎬ф槧灏�
+	 */
+	@Override
+	public void setDefaultAttributeVOMap(Map<String, OsAttributeVO> defaultAttributeVOMap) {
+		OsAttributeServiceImpl.defaultAttributeVOMap = defaultAttributeVOMap;
+	}
+
+	/**
+	 * 鏌ヨ鎵�鏈夌殑灞炴��
+	 *
+	 * @return 灞炴�х殑鏄剧ず瀵硅薄
+	 */
+	@Override
+	public List<OsAttributeVO> selectAllAttribute() {
+		AttribItemFilter abFilter = new AttribItemFilter();
+		//鍚庨潰涓や釜鍒嗛〉鏁帮紝瀹屽叏娌℃湁鐢�
+		try {
+			return attributeDO2VOs(Arrays.stream(platformClientUtil.getAttributeService().getAttribItems(abFilter,1,1)).collect(Collectors.toList()));
+//			return attributeDO2VOs(Arrays.stream(ServiceProvider.getOMDService().getAttributeService().getAttribItems(abFilter,1,1)).collect(Collectors.toList()));
+		} catch (VCIError vciError) {
+			throw WebUtil.getVciBaseException(vciError);
+		}
+	}
+
+	/**
+	 * 鏌ヨ鎵�鏈夌殑灞炴�ф槧灏�
+	 *
+	 * @return key鏄睘鎬х殑鑻辨枃鍚嶇О灏忓啓锛寁alue鏄睘鎬х殑鏄剧ず瀵硅薄
+	 */
+	@Override
+	@Cacheable(value = VCI_OBJECT_SERVICE,key = CacheKeyConstant.ALL_ATTRIBUTE,unless = "#result == null")
+	@VciUnLog
+	public Map<String, OsAttributeVO> selectAllAttributeMap() {
+		return Optional.ofNullable(self.selectAllAttribute()).orElseGet(()->new ArrayList<>()).stream().collect(Collectors.toMap(s->s.getId().toLowerCase(),t->t,(o1,o2)->o1));
+	}
+
+	/**
+	 * 灞炴�х殑鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+	 *
+	 * @param attribItems 鏁版嵁瀵硅薄
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	@Override
+	public List<OsAttributeVO> attributeDO2VOs(Collection<AttribItem> attribItems) {
+		List<OsAttributeVO> vos = new ArrayList<>();
+		Optional.ofNullable(attribItems).orElseGet(()->new ArrayList<>()).stream().forEach(attribItem -> {
+			vos.add(attributeDO2VO(attribItem));
+		});
+		return vos;
+	}
+
+	/**
+	 * 灞炴�х殑鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+	 *
+	 * @param attribItem 鏁版嵁瀵硅薄
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	@Override
+	public OsAttributeVO attributeDO2VO(AttribItem attribItem) {
+		OsAttributeVO attributeVO = new OsAttributeVO();
+		if(attribItem!=null){
+			attributeVO.setOid(attribItem.oid);
+			attributeVO.setId(attribItem.name);
+			attributeVO.setCreator(attribItem.creator);
+			try {
+				attributeVO.setCreateTime(VciDateUtil.str2Date(attribItem.createTime,VciDateUtil.DateTimeFormat));
+				attributeVO.setLastModifyTime(VciDateUtil.str2Date(attribItem.modifyTime,VciDateUtil.DateTimeFormat));
+				attributeVO.setTs(VciDateUtil.str2Date(attribItem.ts,VciDateUtil.DateTimeMillFormat));
+			}catch (Throwable e){
+
+			}
+			attributeVO.setLastModifier(attribItem.modifier);
+			attributeVO.setName(attribItem.label);
+			attributeVO.setDescription(attribItem.description);
+			attributeVO.setAttributeDataType(attribItem.vtDataType);
+			attributeVO.setAttributeDataTypeText(VciFieldTypeEnum.getTextByValue(attribItem.vtDataType));
+			attributeVO.setDefaultValue(attribItem.defValue);
+			attributeVO.setRange(attribItem.rage);
+			if(StringUtils.isNotBlank(attribItem.other)) {
+				if (isReferAttr(attribItem.other)) {
+					//璇存槑杩欎釜鐨勭‘鏄弬鐓у瓧娈�
+					String[] others = attribItem.other.split(";");
+					for (String s : others) {
+						if (s.toLowerCase().contains("btm") && s.split("=").length > 1) {//蹇呴』瑕佸垽鏂暱搴︼紝鍥犱负鏋氫妇鐨勬椂鍊欎篃鏄寘鍚繖涓猙tm鐨�
+							attributeVO.setBtmTypeId(s.split("=")[1].trim());
+						}
+						//閾炬帴绫诲瀷涓嶆敮鎸�
+					}
+				}
+				//蹇呰緭鍜岄暱搴�
+				String[] others = attribItem.other.split(";");
+				for (String s : others) {
+					if (s.toLowerCase().contains("allownull") && s.split("=").length > 1) {//蹇呴』瑕佸垽鏂暱搴︼紝鍥犱负鏋氫妇鐨勬椂鍊欎篃鏄寘鍚繖涓猙tm鐨�
+						boolean allownull = false;
+						if (s.split("=")[1].trim().toLowerCase().equals("yes")) {
+							allownull = true;
+						}
+						attributeVO.setNullableFlag(allownull);
+					}
+					if (s.toLowerCase().indexOf("length") > -1 && s.split("=").length > 1) {
+						int length = WebUtil.getInt(s.split("=")[1].trim());
+						if (length > 0) {
+							attributeVO.setAttrLength(length);
+						}
+					}
+				}
+				//鏋氫妇
+				if(isEnumAttr(attribItem.other)){
+					for (String s : others) {
+						if(s.contains("enumName") && s.split("=").length>1) {
+							attributeVO.setEnumId(s.split("=")[1].trim());
+						}
+					}
+				}
+			}
+		}
+		return attributeVO;
+	}
+
+	/**
+	 * 灞炴�х殑鏄剧ず瀵硅薄杞崲涓烘暟鎹璞�
+	 *
+	 * @param attributeVO 鏄剧ず瀵硅薄
+	 * @return 鏁版嵁瀵硅薄
+	 */
+	@Override
+	public AttribItem attributeVO2DO(OsAttributeVO attributeVO) {
+		AttribItem attribItem = new AttribItem();
+		attribItem.oid = attributeVO.getOid();
+		attribItem.ts = VciDateUtil.date2Str(attributeVO.getTs(),VciDateUtil.DateTimeFormat);
+		attribItem.creator = attributeVO.getCreator();
+		attribItem.createTime = VciDateUtil.date2Str(attributeVO.getCreateTime(),VciDateUtil.DateTimeFormat);
+		attribItem.modifier = attributeVO.getLastModifier();
+		attribItem.modifyTime = VciDateUtil.date2Str(attributeVO.getLastModifyTime(),VciDateUtil.DateTimeFormat);
+		attribItem.name = attributeVO.getId();
+		attribItem.label = attributeVO.getName();
+		attribItem.description = attributeVO.getDescription() == null ?"":attributeVO.getDescription();
+		attribItem.vtDataType = attributeVO.getAttributeDataType() == null ? VciFieldTypeEnum.VTString.name() : attributeVO.getAttributeDataType();
+		attribItem.defValue = attributeVO.getDefaultValue() == null?"":attributeVO.getDefaultValue();
+		attribItem.rage = attributeVO.getRange() == null ? "" : attributeVO.getRange();
+		//other闇�瑕佽嚜琛屽鐞�
+		StringBuffer sb = new StringBuffer();
+		sb.append(ALLOWNULL).append(" = ").append(attributeVO.isNullableFlag() ? "yes" : "no").append(";");
+		VciFieldTypeEnum fieldTypeEnum = VciFieldTypeEnum.valueOf(attributeVO.getAttributeDataType());
+		String[] otherInfos = attribItem.other.split(";");
+		int length = 0;
+		if(otherInfos!=null&& otherInfos.length > 0){
+			for(String s : otherInfos){
+				if(s.contains(LENGTH+" =") || s.contains(LENGTH+"=")){
+					length = VciBaseUtil.getInt(s.split("=")[1]);
+					break;
+				}
+			}
+		}
+		switch (fieldTypeEnum) {
+			case VTDouble:
+				if(attributeVO.getAttrLength() == null){
+					attributeVO.setAttrLength(20);
+				}
+				if(attributeVO.getPrecisionLength() == null){
+					attributeVO.setPrecisionLength(2);
+				}
+				sb.append(ACCURACY).append(" = ").append(attributeVO.getPrecisionLength()).append(";");
+				sb.append(LENGTH).append(" = ").append(length > attributeVO.getAttrLength()?length:attributeVO.getAttrLength()).append(";");
+
+				break;
+			case VTInteger:
+				if (StringUtils.isNotBlank(attributeVO.getEnumId())) {
+					sb.append(ENUMNAME).append(" = ").append(attributeVO.getEnumId()).append(";");
+				}
+				break;
+			case VTString:
+				if (StringUtils.isNotBlank(attributeVO.getBtmTypeId())) {
+					//鍙傜収
+					sb.append(BTM).append(" = ").append(attributeVO.getBtmTypeId()).append(";");
+					//閾炬帴绫诲瀷鏆傛椂涓嶆敮鎸�
+				}
+				sb.append(LENGTH).append(" = ").append(length > attributeVO.getAttrLength()?length:attributeVO.getAttrLength()).append(";");
+				if (StringUtils.isNotBlank(attributeVO.getEnumId())) {
+					sb.append(ENUMNAME).append(" = ").append(attributeVO.getEnumId()).append(";");
+				}
+				break;
+			default:
+				//涓嶉渶瑕佸鐞�
+				break;
+		}
+		attribItem.other = sb.toString();
+		if (attribItem.other.endsWith(";")) {
+			attribItem.other = attribItem.other.substring(0, attribItem.other.length() - 1);
+		}
+		return attribItem;
+	}
+
+	/**
+	 * 鏍规嵁灞炴�х殑鍚嶇О鑾峰彇灞炴�у璞�
+	 * @param attrCode 灞炴�ц嫳鏂囧悕绉�
+	 * @return 灞炴�х殑鍩烘湰淇℃伅
+	 */
+	@Override
+	public OsAttributeVO getAttr(String attrCode) {
+		if(StringUtils.isBlank(attrCode)){
+			return null;
+		}
+		return self.selectAllAttributeMap().getOrDefault(attrCode.toLowerCase(),null);
+	}
+
+	/**
+	 * 浣跨敤灞炴�х紪鍙疯幏鍙栧璞�--鎵归噺
+	 *
+	 * @param attrCodes 灞炴�х殑鑻辨枃鍚嶇О
+	 * @return 灞炴�х殑鏄剧ず瀵硅薄
+	 */
+	@Override
+	public List<OsAttributeVO> listAttrByIds(Collection<String> attrCodes) {
+		if(CollectionUtils.isEmpty(attrCodes)){
+			return null;
+		}
+		Map<String, OsAttributeVO> attributeVOMap = self.selectAllAttributeMap();
+		List<OsAttributeVO> attributeVOS = new ArrayList<>();
+		attrCodes.stream().forEach(attrCode->{
+			OsAttributeVO attributeVO = attributeVOMap.getOrDefault(attrCode.toLowerCase(),null);
+			if(attributeVO!=null){
+				attributeVOS.add(attributeVO);
+			}
+		});
+		return attributeVOS;
+	}
+
+	/**
+	 * 鎵归噺娣诲姞灞炴��
+	 *
+	 * @param attribItemList 灞炴�х殑鍒楄〃
+	 */
+	@Override
+	public void batchAddAttribute(List<AttribItem> attribItemList) {
+		if(!CollectionUtils.isEmpty(attribItemList)){
+			attribItemList.stream().forEach(attribItem -> {
+				try {
+					platformClientUtil.getAttributeService().addAttribItem(attribItem);
+				} catch (VCIError e) {
+					throw WebUtil.getVciBaseException(e);
+				}
+			});
+		}
+	}
+
+	/**
+	 * 鎵归噺缂栬緫灞炴��
+	 * @param editAttrList 灞炴�х殑鍒楄〃
+	 */
+	@Override
+	public void batchEditAttribute(List<AttribItem> editAttrList) {
+		if(!CollectionUtils.isEmpty(editAttrList)){
+			editAttrList.stream().forEach(attribItem -> {
+				try {
+					platformClientUtil.getAttributeService().modifyAbItem(attribItem);
+				} catch (VCIError e) {
+					throw WebUtil.getVciBaseException(e);
+				}
+			});
+		}
+	}
+
+	/**
+	 * 灞炴�у垪琛�
+	 *
+	 * @param baseQueryObject 鏌ヨ瀵硅薄
+	 * @return 灞炴�х殑鏄剧ず瀵硅薄
+	 */
+	@Override
+	public DataGrid<OsAttributeVO> gridAttribute(BaseQueryObject baseQueryObject) {
+		return gridObject(baseQueryObject, OsAttributeDO.class,self.selectAllAttributeMap(),OsAttributeVO.class);
+	}
+
+	/**
+	 * 鏄惁榛樿鐨勫睘鎬�
+	 *
+	 * @param attr 灞炴�х紪鍙�
+	 * @return true琛ㄧず鏄粯璁ゅ睘鎬�
+	 */
+	@Override
+	public boolean isDefaultAttr(String attr) {
+		if(StringUtils.isBlank(attr)){
+			return  false;
+		}
+		return getDefaultAttributeVOMap().containsKey(attr.toLowerCase(Locale.ROOT));
+	}
+
+	/**
+	 * 鏄惁涓哄弬鐓у睘鎬�
+	 * @param other 閰嶇疆鐨勫叾浠�
+	 * @return true 鏄弬鐓�
+	 */
+	private boolean isReferAttr(String other){
+		if(StringUtils.isNotBlank(other)
+				&& (other.toLowerCase().contains("btm") || other.toLowerCase().contains("ltm"))){
+			//杩樹笉鑳界‘瀹氾紝鍥犱负鏋氫妇鐨勬椂鍊欎篃浼氳缃産tm
+			String[] temp = other.split(";");
+			for(String s : temp){
+				if((s.contains("btm") || s.contains("ltm")) && s.split("=").length>1){
+					return true;
+				}
+			}
+		}
+		return false;
+	}
+
+
+	/**
+	 * 鏄惁涓烘灇涓剧殑灞炴��
+	 * @param other 閰嶇疆鐨勫唴瀹�
+	 * @return true 鏄灇涓�
+	 */
+	private boolean isEnumAttr(String other){
+		if(StringUtils.isNotBlank(other)
+				&& other.contains("enumName")){
+			//杩樹笉鑳界‘瀹氾紝鍥犱负鏋氫妇鐨勬椂鍊欎篃浼氳缃産tm
+			String[] temp = other.split(";");
+			for(String s : temp){
+				if(s.contains("enumName")&& s.split("=").length>1){
+					return true;
+				}
+			}
+		}
+		return false;
+	}
+
+
+	/**
+	 * 娓呴櫎缂撳瓨
+	 */
+	@Override
+	@CacheEvict(value = VCI_OBJECT_SERVICE,key = CacheKeyConstant.ALL_ATTRIBUTE)
+	public void clearCache() {
+
+	}
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/OsBtmServiceImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/OsBtmServiceImpl.java
new file mode 100644
index 0000000..a5f1944
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/OsBtmServiceImpl.java
@@ -0,0 +1,678 @@
+package com.vci.web.service.impl;
+
+import com.vci.corba.common.VCIError;
+import com.vci.starter.web.annotation.log.VciUnLog;
+import com.vci.starter.web.enumpck.BooleanEnum;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.starter.web.util.BeanUtil;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.starter.web.util.VciDateUtil;
+import com.vci.web.constant.CacheKeyConstant;
+import com.vci.web.pageModel.*;
+import com.vci.web.service.*;
+import com.vci.web.util.PlatformClientUtil;
+import com.vci.web.util.WebUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.cache.annotation.CachePut;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import plm.corba.btm.BtmItem;
+
+import java.util.*;
+import java.util.function.Supplier;
+import java.util.stream.Collectors;
+
+import static com.vci.web.constant.CacheNameConstant.VCI_OBJECT_SERVICE;
+
+/**
+ * 涓氬姟绫诲瀷鏈嶅姟
+ * @author weidy
+ * @date 2021-2-15
+ */
+@Service
+public class OsBtmServiceImpl implements OsBtmServiceI {
+
+    /**
+     * 鏃ュ織
+     */
+    private Logger logger = LoggerFactory.getLogger(getClass());
+
+    /**
+     * 骞冲彴鐨勮皟鐢ㄥ伐鍏风被
+     */
+    @Autowired
+    private PlatformClientUtil platformClientUtil;
+
+    /**
+     * 灞炴�х殑鏈嶅姟
+     */
+    @Autowired
+    private OsAttributeServiceI attributeService;
+
+    /**
+     * 鏋氫妇鐨勬湇鍔�
+     */
+    @Autowired
+    private OsEnumServiceI enumService;
+
+    /**
+     * 涓氬姟鏁版嵁鎿嶄綔鏈嶅姟
+     */
+    @Autowired
+    private WebBoServiceI boService;
+
+    /**
+     * 閾炬帴绫诲瀷鐨勬湇鍔�
+     */
+    @Autowired(required = false)
+    @Lazy
+    private OsLinkTypeServiceI linkTypeService;
+
+    /**
+     * 鍔犺浇鑷韩
+     */
+    @Autowired(required = false)
+    @Lazy
+    private OsBtmServiceI self;
+    /**
+     * 鏌ヨ鎵�鏈夌殑涓氬姟绫诲瀷
+     *
+     * @return 涓氬姟绫诲瀷瀵硅薄
+     */
+    @Override
+    @VciUnLog
+    public List<OsBtmTypeVO> selectAllBtm() {
+        try {
+            return btmDO2VOs(Arrays.stream(platformClientUtil.getBtmService().getAllBtmItem("")).collect(Collectors.toList()));
+        } catch (VCIError vciError) {
+           throw WebUtil.getVciBaseException(vciError);
+        }
+    }
+
+    /**
+     * 鏌ヨ鎵�鏈夌殑涓氬姟绫诲瀷鏄犲皠
+     *
+     * @return key 鏄笟鍔$殑鑻辨枃鍚嶇О鐨勫皬鍐�
+     */
+    @Override
+    @VciUnLog
+    @Cacheable(value = VCI_OBJECT_SERVICE,key = CacheKeyConstant.ALL_BTM,unless = "#result == null")
+    public Map<String, OsBtmTypeVO> selectAllBtmMap() {
+        return Optional.ofNullable(self.selectAllBtm()).orElseGet(()->new ArrayList<OsBtmTypeVO>()).stream().collect(Collectors.toMap(s->s.getId().toLowerCase(), t->t,(o1,o2)->o1));
+    }
+
+    /**
+     * 鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+     *
+     * @param btmItems 鏁版嵁瀵硅薄
+     * @return 鏄剧ず瀵硅薄
+     */
+    @Override
+    public List<OsBtmTypeVO> btmDO2VOs(Collection<BtmItem> btmItems) {
+        List<OsBtmTypeVO> VOS = new ArrayList<>();
+        Optional.ofNullable(btmItems).orElseGet(()->new ArrayList<>()).stream().forEach(btmItem -> {
+            OsBtmTypeVO vo = btmDO2VO(btmItem);
+            VOS.add(vo);
+        });
+        return VOS;
+    }
+
+    /**
+     * 鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+     *
+     * @param btmItem 鏁版嵁瀵硅薄
+     * @return 鏄剧ず瀵硅薄
+     */
+    @Override
+    public OsBtmTypeVO btmDO2VO(BtmItem btmItem) {
+        OsBtmTypeVO vo = new OsBtmTypeVO();
+        if(btmItem !=null){
+            vo.setOid(btmItem.oid);
+            vo.setCreator(btmItem.creator);
+            vo.setLastModifier(btmItem.modifier);
+            try {
+                vo.setCreateTime(VciDateUtil.str2Date(btmItem.createTime,VciDateUtil.DateTimeFormat));
+                vo.setLastModifyTime(VciDateUtil.str2Date(btmItem.modifyTime,VciDateUtil.DateTimeFormat));
+                vo.setTs(VciDateUtil.str2Date(btmItem.ts,VciDateUtil.DateTimeMillFormat));
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            vo.setDescription(btmItem.description);
+            vo.setId(btmItem.name);
+            vo.setName(btmItem.label);
+            vo.setLifeCycleId(btmItem.lifeCycle);
+            vo.setAbstractFlag(btmItem.isAbstract);
+            vo.setImplClass(btmItem.implClass);
+            vo.setShape(btmItem.shape);
+            vo.setRevisionRuleId(btmItem.revRuleName);
+            vo.setTableName(VciBaseUtil.getTableName(vo.getId()));
+            vo.setInputRevisionFlag(btmItem.revInput);
+            if(StringUtils.isNotBlank(vo.getRevisionRuleId()) || vo.isInputRevisionFlag()){
+                vo.setRevisionFlag(true);
+            }
+            vo.setVersionRule(String.valueOf(btmItem.verRuleName));
+            vo.setSubLifeCycleId(Arrays.stream(btmItem.lifeCycles).collect(Collectors.joining(",")));
+            List<OsAttributeVO> attributeVOS = attributeService.listAttrByIds(Arrays.stream(btmItem.apNameArray).collect(Collectors.toList()));
+            List<OsBtmTypeAttributeVO> btmTypeAttributeVOS = new ArrayList<>();
+            Optional.ofNullable(attributeVOS).orElseGet(()->new ArrayList<>()).stream().forEach(attributeVO->{
+                OsBtmTypeAttributeVO btmTypeAttributeVO = new OsBtmTypeAttributeVO();
+                BeanUtil.convert(attributeVO,btmTypeAttributeVO);
+                btmTypeAttributeVO.setPkBtmType(vo.getOid());
+                btmTypeAttributeVO.setBtmTypeId(vo.getId());
+                btmTypeAttributeVO.setAttrDataType(attributeVO.getAttributeDataType());
+                btmTypeAttributeVO.setAttributeLength(attributeVO.getAttrLength());
+                btmTypeAttributeVO.setDefaultValue(attributeVO.getDefaultValue());
+                if("secretgrade".equalsIgnoreCase(attributeVO.getId())){
+                    vo.setSecretFlag(true);
+                }
+                if(StringUtils.isNotBlank(attributeVO.getBtmTypeId())){
+                    btmTypeAttributeVO.setReferFlag(true);
+                    btmTypeAttributeVO.setReferBtmTypeId(attributeVO.getBtmTypeId());
+                }
+                if(StringUtils.isNotBlank(attributeVO.getEnumId())){
+                    btmTypeAttributeVO.setEnumFlag(true);
+                    btmTypeAttributeVO.setEnumItemMap(enumService.getEnumValueMap(btmTypeAttributeVO.getEnumId()));
+                }
+                btmTypeAttributeVOS.add(btmTypeAttributeVO);
+            });
+            vo.setAttributes(btmTypeAttributeVOS);
+        }
+        return vo;
+    }
+
+    /**
+     * 浣跨敤缂栧彿鑾峰彇涓氬姟绫诲瀷
+     *
+     * @param btmIds 缂栧彿
+     * @return 涓氬姟绫诲瀷
+     */
+    @Override
+    public List<OsBtmTypeVO> listBtmByIds(Collection<String> btmIds) {
+        if(CollectionUtils.isEmpty(btmIds)){
+            return null;
+        }
+        Map<String, OsBtmTypeVO> btmTypeVOMap = self.selectAllBtmMap();
+        List<OsBtmTypeVO> btmTypeVOS = new ArrayList<>();
+        btmIds.stream().forEach(id->{
+            if(btmTypeVOMap.containsKey(id.toLowerCase())){
+                btmTypeVOS.add(btmTypeVOMap.get(id.toLowerCase()));
+            }
+        });
+        return btmTypeVOS;
+    }
+
+    /**
+     * 浣跨敤缂栧彿鑾峰彇涓氬姟绫诲瀷
+     *
+     * @param id 缂栧彿
+     * @return 涓氬姟绫诲瀷
+     */
+    @Override
+    public OsBtmTypeVO getBtmById(String id) {
+        if(StringUtils.isBlank(id)){
+            return null;
+        }
+        return self.selectAllBtmMap().getOrDefault(id.toLowerCase(),null);
+    }
+
+    /**
+     * 鑾峰彇涓氬姟绫诲瀷鐨勫湪鍝釜灞炴�т腑浣跨敤
+     *
+     * @param btmName 涓氬姟绫诲瀷
+     * @return 寮曠敤鐨勪俊鎭�
+     */
+    @Override
+    public List<OsUsedAttributeVO> listBtmUsedInfo(String btmName) {
+        return listBtmUsedInfo(btmName,false);
+    }
+
+    /**
+     * 鑾峰彇涓氬姟绫诲瀷鐨勫湪鍝釜灞炴�т腑浣跨敤
+     *
+     * @param btmId 涓氬姟绫诲瀷
+     * @param hasLink 鏄惁鍖呭惈閾炬帴绫诲瀷涓�
+     * @return 寮曠敤鐨勪俊鎭�
+     */
+    @Override
+    public List<OsUsedAttributeVO> listBtmUsedInfo(String btmId, boolean hasLink){
+        VciBaseUtil.alertNotNull(btmId,"涓氬姟绫诲瀷鐨勫悕绉�");
+        List<OsAttributeVO> allReferThisBtmAttributes = Optional.ofNullable(attributeService.selectAllAttribute()).orElseGet(()->new ArrayList<>()).stream().filter(s->btmId.equalsIgnoreCase(s.getBtmTypeId())).collect(Collectors.toList());
+        if(CollectionUtils.isEmpty(allReferThisBtmAttributes)){
+            return null;
+        }
+        //鏍规嵁杩欎簺灞炴�э紝鎵惧畠浣跨敤鐨勪笟鍔$被鍨�
+        List<OsUsedAttributeVO> usedInfos= new ArrayList<>();
+        List<OsBtmTypeVO> btmTypeVOMap = self.selectAllBtmMap().values().stream().collect(Collectors.toList());
+        List<OsLinkTypeVO> linkTypeVOS = linkTypeService.selectAllLinkMap().values().stream().collect(Collectors.toList());
+        allReferThisBtmAttributes.stream().forEach(attribute->{
+            //鍏朵粬鐨勪笟鍔$被鍨嬪寘鍚簡杩欎釜灞炴�х殑
+            List<OsBtmTypeVO> usedBtms = btmTypeVOMap.stream().filter(btmTypeVO -> !CollectionUtils.isEmpty(btmTypeVO.getAttributes()) && btmTypeVO.getAttributes().stream().anyMatch(s -> attribute.getId().equalsIgnoreCase(s.getId()))).collect(Collectors.toList());
+            if(!CollectionUtils.isEmpty(usedBtms)){
+                usedBtms.stream().forEach(btm->{
+                    btm.getAttributes().stream().filter(s->attribute.getId().equalsIgnoreCase(s.getId())).forEach(attrInBtm->{
+                        OsUsedAttributeVO usedAttributeVO = new OsUsedAttributeVO();
+                        usedAttributeVO.setId(attrInBtm.getId());
+                        usedAttributeVO.setName(attrInBtm.getName());
+                        usedAttributeVO.setPkBtmType(btm.getId());
+                        usedAttributeVO.setBusinessType(BooleanEnum.TRUE.getValue());
+                        usedInfos.add(usedAttributeVO);
+                    });
+                });
+            }
+            if(hasLink){
+                List<OsLinkTypeVO> usedLinks = linkTypeVOS.stream().filter(linkTypeVO -> !CollectionUtils.isEmpty(linkTypeVO.getAttributes()) &&linkTypeVO.getAttributes().stream().anyMatch(s->attribute.getId().equalsIgnoreCase(s.getId())) ).collect(Collectors.toList());
+                if(!CollectionUtils.isEmpty(usedLinks)){
+                    usedLinks.stream().forEach(link->{
+                        link.getAttributes().stream().filter(s->attribute.getId().equalsIgnoreCase(s.getId())).forEach(attrInBtm->{
+                            OsUsedAttributeVO usedAttributeVO = new OsUsedAttributeVO();
+                            usedAttributeVO.setId(attrInBtm.getId());
+                            usedAttributeVO.setName(attrInBtm.getName());
+                            usedAttributeVO.setPkBtmType(link.getId());
+                            usedAttributeVO.setBusinessType(BooleanEnum.FASLE.getValue());
+                            usedInfos.add(usedAttributeVO);
+                        });
+                    });
+                }
+            }
+        });
+        return usedInfos;
+    }
+
+    /**
+     * 鏍规嵁涓氬姟绫诲瀷鑾峰彇鍖呭惈鐨勫睘鎬�--涓嶅寘鍚熀纭�灞炴��
+     *
+     * @param btmId 涓氬姟绫诲瀷鐨勭紪鍙�
+     * @return 灞炴�х殑鍐呭
+     */
+    @Override
+    public List<OsBtmTypeAttributeVO> listAttributeByBtmId(String btmId) {
+        VciBaseUtil.alertNotNull(btmId,"涓氬姟绫诲瀷鐨勭紪鍙�");
+        OsBtmTypeVO btmTypeVO = getBtmById(btmId);
+        List<OsBtmTypeAttributeVO> attributes = btmTypeVO.getAttributes();
+        if(attributes == null){
+            attributes = new ArrayList<>();
+        }
+        return attributes.stream().sorted(((o1, o2) -> o1.getId().toLowerCase(Locale.ROOT).compareTo(o2.getId().toLowerCase(Locale.ROOT)))).collect(Collectors.toList());
+    }
+
+    /**
+     * 鏍规嵁涓氬姟绫诲瀷鑾峰彇鍖呭惈鐨勫睘鎬�--鍖呭惈鍩虹灞炴��
+     *
+     * @param btmId 涓氬姟绫诲瀷鐨勭紪鍙�
+     * @return 灞炴�х殑鍐呭
+     */
+    @Override
+    public List<OsBtmTypeAttributeVO> listAttributeByBtmIdHasDefault(String btmId) {
+        List<OsBtmTypeAttributeVO> attrVOs = listAttributeByBtmId(btmId);
+        if(attrVOs == null){
+            attrVOs = new ArrayList<>();
+        }
+        if(!CollectionUtils.isEmpty(attributeService.getDefaultAttributeVOs())) {
+            List<OsBtmTypeAttributeVO> finalAttrVOs = attrVOs;
+            attributeService.getDefaultAttributeVOs().stream().forEach(attr->{
+                OsBtmTypeAttributeVO attributeVO = new OsBtmTypeAttributeVO();
+                BeanUtil.convert(attr, attributeVO);
+                attributeVO.setAttrDataType(attr.getAttributeDataType());
+                attributeVO.setAttributeLength(attr.getAttrLength());
+                attributeVO.setReferBtmTypeId(attr.getBtmTypeId());
+                attributeVO.setReferBtmTypeName(attr.getBtmTypeName());
+                finalAttrVOs.add(attributeVO);
+            });
+            attrVOs = finalAttrVOs;
+        }
+        return attrVOs;
+    }
+
+    /**
+     * 娓呴櫎缂撳瓨
+     */
+    @Override
+    @CacheEvict(value = VCI_OBJECT_SERVICE,key = CacheKeyConstant.ALL_BTM)
+    public void clearCache() {
+
+    }
+
+    /**
+     * 鍙傜収涓氬姟绫诲瀷
+     *
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param pageHelper   鍒嗛〉鐨勫璞�
+     * @return 涓氬姟绫诲瀷鐨勪俊鎭�
+     */
+    @Override
+    public DataGrid<OsBtmTypeVO> referDataGrid(Map<String, String> conditionMap, PageHelper pageHelper) {
+        DataGrid<OsBtmTypeVO> dataGrid = queryObjectServiceInfoBySql(conditionMap, pageHelper, "plbtmtype",OsBtmTypeVO.class,((data, obj) -> {
+            obj.setTableName(VciBaseUtil.getTableName(obj.getId()));
+        }));
+        return dataGrid;
+    }
+
+    /**
+     * 浣跨敤涓婚敭鏌ヨ
+     *
+     * @param oid 涓婚敭
+     * @return 涓氬姟绫诲瀷
+     */
+    @Override
+    public OsBtmTypeVO selectByOid(String oid) {
+        List<OsBtmTypeVO> btmTypeVOS = self.selectAllBtmMap().values().stream().collect(Collectors.toList());
+        return Optional.ofNullable(btmTypeVOS).orElseGet(()->new ArrayList<>()).stream().filter(s->s.getOid().equalsIgnoreCase(oid)).findFirst().orElseGet(()->null);
+    }
+
+    /**
+     * 浣跨敤缂栧彿鑾峰彇鏋氫妇鐨勫悕绉�
+     *
+     * @param id 鏋氫妇鐨勮嫳鏂�
+     * @return 鏋氫妇鐨勫悕绉�
+     */
+    @Override
+    public String getNameById(String id) {
+        OsBtmTypeVO btmTypeVO = getBtmById(id);
+        if(btmTypeVO == null){
+            throw new VciBaseException("涓氬姟绫诲瀷[{0}]鍦ㄧ郴缁熼噷涓嶅瓨鍦�",new String[]{id});
+        }
+        return btmTypeVO.getName();
+    }
+
+    /**
+     * 鏍规嵁涓氬姟绫诲瀷鍜岄摼鎺ョ被鍨嬬敓鎴怑R鍥�
+     *
+     * @param btmId 涓氬姟绫诲瀷涓婚敭
+     */
+    @Override
+    public OsERVO createERDiagram(String btmId) {
+        VciBaseUtil.alertNotNull(btmId, "涓氬姟绫诲瀷缂栧彿");
+        OsBtmTypeVO btmTypeVO = getBtmById(btmId);
+        List<OsERNodeVO> nodeVOList = new ArrayList<>();
+        List<OsERRelationVO> relationVOList = new ArrayList<>();
+        //鐪嬪綋鍓嶈繖涓笟鍔$被鍨嬶紝鍙傜収浜嗗叾浠栫殑鍝簺涓氬姟绫诲瀷 .鎴戜滑涓嶆樉绀哄紩鐢ㄥ綋鍓嶄笟鍔$被鍨嬬殑涓氬姟绫诲瀷
+        splicingBtmType2Json(nodeVOList, relationVOList, btmTypeVO,true);
+        loadAllLinkTypeByBtmType(nodeVOList, relationVOList, btmTypeVO);
+        OsERVO osERVO = new OsERVO();
+        osERVO.setTabViewList(nodeVOList);
+        osERVO.setTabRelViewList(relationVOList);
+        return osERVO;
+    }
+
+    /**
+     * 鑾峰彇浣跨敤杩欎釜涓氬姟绫诲瀷鐨凟-R鍥�
+     *
+     * @param btmId 涓氬姟绫诲瀷缂栧彿
+     * @return 鎵ц缁撴灉
+     */
+    @Override
+    public OsERVO createERUsed(String btmId) {
+        VciBaseUtil.alertNotNull(btmId, "涓氬姟绫诲瀷缂栧彿");
+        OsBtmTypeVO btmTypeVO = getBtmById(btmId);
+        //鑾峰彇浣跨敤褰撳墠绫诲瀷鐨勫睘鎬�
+        List<OsUsedAttributeVO> usedAttributeVOS = listBtmUsedInfo(btmTypeVO.getId());
+        List<OsERNodeVO> nodeVOList = new ArrayList<>();
+        List<OsERRelationVO> relationVOList = new ArrayList<>();
+        splicingBtmType2Json(nodeVOList, relationVOList, btmTypeVO,false);
+        if(!CollectionUtils.isEmpty(usedAttributeVOS)){
+            usedAttributeVOS.stream().forEach(usedAttr->{
+                //涓氬姟绫诲瀷鍜岄摼鎺ョ被鍨嬮兘鏈夊彲鑳�
+                if(BooleanEnum.TRUE.getValue().equalsIgnoreCase(usedAttr.getBusinessType())){
+                    //涓氬姟绫诲瀷
+                    OsBtmTypeVO linkBtmVO = self.selectAllBtmMap().get(usedAttr.getPkBtmType().toLowerCase(Locale.ROOT));
+                    splicingBtmType2Json(nodeVOList, relationVOList, linkBtmVO,false);
+                    OsERRelationVO relationVO = new OsERRelationVO();
+                    relationVO.setTo(btmTypeVO.getId() + " " + btmTypeVO.getName());
+                    relationVO.setFrom(linkBtmVO.getId() + " " + linkBtmVO.getName());
+                    relationVO.setToText("寮曠敤");
+                    relationVOList.add(relationVO);
+                }else{
+                    //鏄摼鎺ョ被鍨�
+                    OsLinkTypeVO linkTypeVO = linkTypeService.selectAllLinkMap().get(usedAttr.getPkBtmType().toLowerCase(Locale.ROOT));
+                    List<OsLinkTypeVO> linkTypeVOList = new ArrayList<>();
+                    linkTypeVOList.add(linkTypeVO);
+                    splicingLinkType2Json(nodeVOList, relationVOList,linkTypeVOList,btmTypeVO,true);
+                }
+            });
+        }
+        OsERVO ervo = new OsERVO();
+        ervo.setTabViewList(nodeVOList);
+        ervo.setTabRelViewList(relationVOList);
+        return ervo;
+    }
+
+    /**
+     * 灏嗕笟鍔$被鍨嬫嫾鎺son
+     *
+     * @param nodeVOList  瀵硅薄鑺傜偣鐨勪俊鎭�
+     * @param relationVOList  鍏崇郴鐨勪俊鎭�
+     * @param btmTypeVO 涓氬姟绫诲瀷鏄剧ず瀵硅薄
+     * @param hasRefer 鍖呭惈鍙傜収
+     */
+    private void splicingBtmType2Json(List<OsERNodeVO> nodeVOList, List<OsERRelationVO> relationVOList, OsBtmTypeVO btmTypeVO,boolean hasRefer) {
+        OsERNodeVO nodeVO = new OsERNodeVO();
+        nodeVO.setKey(btmTypeVO.getId() + " " + btmTypeVO.getName());
+        List<OsERNodePropertyVO> itemList = new ArrayList<>();
+        btmTypeVO.getAttributes().forEach(attribute -> {
+            OsERNodePropertyVO nodePropertyVO = new OsERNodePropertyVO();
+            nodePropertyVO.setName(attribute.getId() + " " + attribute.getName());
+            nodePropertyVO.setKey("oid".equals(attribute.getId().toLowerCase()));
+            if(StringUtils.isNotBlank(attribute.getReferBtmTypeId())){
+                //鍙傜収鐨勫睘鎬э紝璁剧疆涓洪粍鑹�
+                nodePropertyVO.setColor("#FEDD32FF");
+            }else{
+                nodePropertyVO.setColor("#000");
+            }
+            itemList.add(nodePropertyVO);
+            //鍒ゆ柇鍙傜収
+            if(hasRefer) {
+                selectReferenceBtmType(attribute, btmTypeVO, nodeVOList, relationVOList);
+            }
+        });
+        nodeVO.setItems(itemList);
+        nodeVOList.add(nodeVO);
+    }
+
+    /**
+     * 鍒ゆ柇涓氬姟绫诲瀷鐨勫睘鎬ф槸涓嶆槸鍙傜収绫诲瀷锛屽苟灏嗗弬鐓ф坊鍔犲埌ER鍥句腑
+     *
+     * @param attribute     涓氬姟绫诲瀷灞炴��
+     * @param nodeVOList  鑺傜偣淇℃伅
+     * @param btmTypeVO 涓氬姟绫诲瀷
+     * @param relationVOList 鍏崇郴淇℃伅
+     */
+    private void selectReferenceBtmType(OsBtmTypeAttributeVO attribute, OsBtmTypeVO btmTypeVO,
+                                        List<OsERNodeVO> nodeVOList, List<OsERRelationVO> relationVOList) {
+        if (StringUtils.isNotBlank(attribute.getReferBtmTypeId())) {
+            //鏄弬鐓х被鍨嬬殑
+            OsBtmTypeVO referenceBtmType = getBtmById(attribute.getReferBtmTypeId());
+            List<OsBtmTypeAttributeVO> referenceBtmAttributes = referenceBtmType.getAttributes();
+            //鍚戣〃json涓坊鍔�
+            OsERNodeVO nodeVO = new OsERNodeVO();
+            nodeVO.setKey(referenceBtmType.getId() + " " + referenceBtmType.getName());
+
+            List<OsERNodePropertyVO> items = new ArrayList<>();
+            if(referenceBtmType.getId().equalsIgnoreCase(btmTypeVO.getId())){
+                //鍙傜収鑷繁鐨勫唴瀹�
+                OsERRelationVO relationVO = new OsERRelationVO();
+                relationVO.setTo(referenceBtmType.getId() + " " + referenceBtmType.getName());
+                relationVO.setFrom(btmTypeVO.getId() + " " + btmTypeVO.getName());
+                relationVO.setToText("鑷弬鐓�");
+                relationVOList.add(relationVO);
+            }else {
+                referenceBtmAttributes.forEach(attr -> {
+                    OsERNodePropertyVO nodePropertyVO = new OsERNodePropertyVO();
+                    nodePropertyVO.setName(attr.getId() + " " + attr.getName());
+                    nodePropertyVO.setKey("oid".equals(attr.getId().toLowerCase()));
+                    nodePropertyVO.setColor("#000");
+                    items.add(nodePropertyVO);
+                });
+                nodeVO.setItems(items);
+                nodeVOList.add(nodeVO);
+                //鍏崇郴
+                OsERRelationVO relationVO = new OsERRelationVO();
+                relationVO.setTo(referenceBtmType.getId() + " " + referenceBtmType.getName());
+                relationVO.setFrom(btmTypeVO.getId() + " " + btmTypeVO.getName());
+                relationVO.setToText("鍙傜収");
+                relationVOList.add(relationVO);
+            }
+        }
+    }
+
+    /**
+     * 鍔犺浇涓氬姟绫诲瀷鎵�鍏宠仈鐨勯摼鎺ョ被鍨�
+     *
+     * @param nodeVOList  鑺傜偣淇℃伅
+     * @param relationVOList 鍏崇郴鐨勪俊鎭�
+     * @param btmTypeVO    涓氬姟绫诲瀷
+     */
+    private void loadAllLinkTypeByBtmType(List<OsERNodeVO> nodeVOList, List<OsERRelationVO> relationVOList, OsBtmTypeVO btmTypeVO) {
+        Map<String, OsLinkTypeVO> linkTypeVOMap = linkTypeService.selectAllLinkMap();
+        Collection<OsLinkTypeVO> linkTypeVOS = linkTypeVOMap.values();
+        Set<OsLinkTypeVO> fromLinkTypeVOList = linkTypeVOS.stream().filter(link ->
+            Arrays.stream(link.getFromBtmType().split(",")).anyMatch(s->s.equalsIgnoreCase(btmTypeVO.getId()))
+        ).collect(Collectors.toSet());
+        Set<OsLinkTypeVO> toLinkTypeList = linkTypeVOS.stream().filter(link ->
+                Arrays.stream(link.getToBtmType().split(",")).anyMatch(s->s.equalsIgnoreCase(btmTypeVO.getId()))).collect(Collectors.toSet());
+        List<OsLinkTypeVO> linkTypeVOList = new ArrayList<>();
+        linkTypeVOList.addAll(fromLinkTypeVOList);
+        linkTypeVOList.addAll(toLinkTypeList);
+        if (!CollectionUtils.isEmpty(linkTypeVOList)) {
+            splicingLinkType2Json(nodeVOList, relationVOList,linkTypeVOList,btmTypeVO,false);
+        }
+
+    }
+
+    /**
+     * 灏嗛摼鎺ョ被鍨嬫嫾鎺ユ垚json
+     *
+     * @param nodeVOList  鑺傜偣淇℃伅
+     * @param relationVOList  鍏崇郴淇℃伅
+     * @param linkTypeVOs 閾炬帴绫诲瀷
+     * @param btmTypeVO 涓氬姟绫诲瀷鐨勬樉绀哄璞�
+     * @param used 鏄惁涓鸿浣跨敤
+     */
+    private void splicingLinkType2Json(List<OsERNodeVO> nodeVOList, List<OsERRelationVO> relationVOList,
+                                       List<OsLinkTypeVO> linkTypeVOs,OsBtmTypeVO btmTypeVO,boolean used) {
+        linkTypeVOs.forEach(link -> {
+            List<OsLinkTypeAttributeVO> attributeList = link.getAttributes();
+            OsERNodeVO nodeVO= new OsERNodeVO();
+            nodeVO.setKey(link.getId() + " " + link.getName());
+            List<OsERNodePropertyVO> items = new ArrayList<>();
+            attributeList.forEach(attr -> {
+                OsERNodePropertyVO nodePropertyVO = new OsERNodePropertyVO();
+                nodePropertyVO.setName(attr.getId() + " " + attr.getName());
+                nodePropertyVO.setKey("oid".equals(attr.getId().toLowerCase()));
+                if(StringUtils.isNotBlank(attr.getReferBtmTypeId())) {
+                    nodePropertyVO.setColor("#FEDD32FF");
+                }else {
+                    nodePropertyVO.setColor("#1c446f");
+                }
+                items.add(nodePropertyVO);
+                //鍒ゆ柇鍙傜収
+                if(!used) {
+                    selectReferenceLinkType(attr, link, nodeVOList, relationVOList);
+                }
+            });
+            nodeVO.setItems(items);
+            //閾炬帴绫诲瀷鍜屼笟鍔$被鍨嬪姞鍏崇郴
+            OsERRelationVO relationVO = new OsERRelationVO();
+            relationVO.setFrom(link.getId() + " " + link.getName());
+            relationVO.setTo(btmTypeVO.getId() + " " + btmTypeVO.getName());
+
+            nodeVOList.add(nodeVO);
+
+            if(used){
+                relationVO.setText("琚紩鐢�");
+            }
+            //濡傛灉褰撳墠鐨刦rom绔紝閭d箞灏辨樉绀簍o绔殑
+            //濡傛灉褰撳墠鐨勬槸to绔殑锛岄偅涔堝氨鏄剧ずfrom绔殑鍐呭
+            if(Arrays.stream(link.getFromBtmType().split(",")).anyMatch(s->s.equalsIgnoreCase(btmTypeVO.getId()))){
+                //杩欎釜鏄痜rom绔�
+               if(!used) {
+                   relationVO.setToText("from绔�");
+               }
+                //鎵捐繖涓摼鎺ョ被鍨嬬殑to绔殑涓氬姟绫诲瀷
+               link.getToBtmTypeVOS().stream().forEach(toBtm->{
+                    splicingBtmType2JsonForLink(nodeVOList,relationVOList,link,toBtm,true);
+               });
+            }else{
+                if(!used) {
+                    relationVO.setToText("to绔�");
+                }
+                link.getFromBtmTypeVOS().stream().forEach(fromBtm->{
+                    splicingBtmType2JsonForLink(nodeVOList,relationVOList,link,fromBtm,false);
+                });
+            }
+            relationVOList.add(relationVO);
+        });
+    }
+
+    /**
+     * 閾炬帴绫诲瀷鍏抽敭鐨勪笟鍔$被鍨�
+     * @param nodeVOList 瀵硅薄鍒楄〃
+     * @param relationVOList 鍏宠仈鍏崇郴鍒楄〃
+     * @param link 閾炬帴绫诲瀷
+     * @param btmTypeVO 涓氬姟绫诲瀷
+     * @param to 鏄惁涓簍o绔�
+     */
+    private void splicingBtmType2JsonForLink(List<OsERNodeVO> nodeVOList, List<OsERRelationVO> relationVOList, OsLinkTypeVO link, OsBtmTypeVO btmTypeVO, boolean to) {
+        OsERNodeVO nodeVO = new OsERNodeVO();
+        nodeVO.setKey(btmTypeVO.getId() + " " + btmTypeVO.getName());
+        List<OsERNodePropertyVO> itemList = new ArrayList<>();
+        btmTypeVO.getAttributes().forEach(attribute -> {
+            OsERNodePropertyVO items = new OsERNodePropertyVO();
+            items.setName(attribute.getId() + " " + attribute.getName());
+            items.setKey("oid".equals(attribute.getId().toLowerCase()));
+            items.setColor("#000");
+            itemList.add(items);
+            //涓嶅姞鍙傜収鍒ゆ柇浜�
+        });
+        nodeVO.setItems(itemList);
+        OsERRelationVO relationVO = new OsERRelationVO();
+        relationVO.setFrom(link.getId() + " " + link.getName());
+        relationVO.setTo(btmTypeVO.getId() + " " + btmTypeVO.getName());
+        relationVO.setToText(to?"to绔�":"from绔�");
+        relationVOList.add(relationVO);
+        nodeVOList.add(nodeVO);
+    }
+
+    /**
+     * 鍒ゆ柇閾炬帴绫诲瀷鐨勫睘鎬ф槸涓嶆槸鍙傜収绫诲瀷锛屽苟灏嗗弬鐓ф坊鍔犲埌ER鍥句腑
+     *
+     * @param attr          閾炬帴绫诲瀷鐨勫睘鎬�
+     * @param linkTypeVO 閾炬帴绫诲瀷鐨勫唴瀹�
+     * @param nodeVOList 鑺傜偣瀵硅薄
+     * @param relationVOList 鍏崇郴瀵硅薄
+     */
+    private void selectReferenceLinkType(OsLinkTypeAttributeVO attr, OsLinkTypeVO linkTypeVO,List<OsERNodeVO> nodeVOList, List<OsERRelationVO> relationVOList) {
+        if (StringUtils.isNotBlank(attr.getReferBtmTypeId())) {
+            //鏄弬鐓х被鍨嬬殑
+            OsBtmTypeVO referenceBtmType = getBtmById(attr.getReferBtmTypeId());
+            List<OsBtmTypeAttributeVO> attributeList = referenceBtmType.getAttributes();
+            //鍚戣〃json涓坊鍔�
+            OsERNodeVO nodeVO = new OsERNodeVO();
+            nodeVO.setKey(referenceBtmType.getId() + " " + referenceBtmType.getName());
+            List<OsERNodePropertyVO> items = new ArrayList<>();
+            attributeList.forEach(attribute -> {
+                OsERNodePropertyVO item = new OsERNodePropertyVO();
+                item.setName(attribute.getId() + " " + attribute.getName());
+                item.setKey("oid".equals(attribute.getId().toLowerCase()));
+                item.setColor("#000");
+                items.add(item);
+            });
+            nodeVO.setItems(items);
+            nodeVOList.add(nodeVO);
+            //鍚戝叧绯籮son涓坊鍔�
+            OsERRelationVO relationVO = new OsERRelationVO();
+            relationVO.setTo(referenceBtmType.getId() + " " + referenceBtmType.getName());
+            relationVO.setFrom(linkTypeVO.getId() + " " + linkTypeVO.getName());
+            relationVO.setToText("鍙傜収");
+            relationVOList.add(relationVO);
+        }
+    }
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/OsCodeGenSchemaServiceImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/OsCodeGenSchemaServiceImpl.java
new file mode 100644
index 0000000..e684778
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/OsCodeGenSchemaServiceImpl.java
@@ -0,0 +1,919 @@
+package com.vci.web.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.vci.file.util.VciZipUtil;
+import com.vci.frameworkcore.lcstatuspck.FrameworkDataLCStatus;
+import com.vci.starter.revision.service.RevisionModelUtil;
+import com.vci.starter.web.annotation.Column;
+import com.vci.starter.web.constant.FrameWorkLcStatusConstant;
+import com.vci.starter.web.enumpck.BooleanEnum;
+import com.vci.starter.web.enumpck.VciFieldTypeEnum;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.starter.web.util.BeanUtil;
+import com.vci.starter.web.util.LocalFileUtil;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.starter.web.util.VciDateUtil;
+import com.vci.starter.web.wrapper.VciQueryWrapperForDO;
+import com.vci.web.bo.OsCodeGenAttributeBO;
+import com.vci.web.bo.OsCodeGenButtonBO;
+import com.vci.web.dao.OsCodeGenSchemaDaoI;
+import com.vci.web.dto.OsCodeGenSchemaDTO;
+import com.vci.web.enumpck.OsCodeGenJsPanelTypeEnum;
+import com.vci.web.model.OsCodeGenSchemaDO;
+import com.vci.web.pageModel.OsBtmTypeAttributeVO;
+import com.vci.web.pageModel.OsBtmTypeVO;
+import com.vci.web.pageModel.OsCodeGenSchemaVO;
+import com.vci.web.service.OsAttributeServiceI;
+import com.vci.web.service.OsBtmServiceI;
+import com.vci.web.service.OsCodeGenSchemaServiceI;
+import com.vci.web.service.WebBtmIOServiceI;
+import com.vci.web.util.WebUtil;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.velocity.Template;
+import org.apache.velocity.VelocityContext;
+import org.apache.velocity.app.Velocity;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.util.HtmlUtils;
+import plm.vo.omd.btm.common.BtmProvider;
+
+import javax.annotation.Resource;
+import java.io.*;
+import java.lang.reflect.Field;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 鐢熸垚鏂规鏈嶅姟
+ * @author weidy
+ * @date 2020/7/30
+ */
+@Service
+public class OsCodeGenSchemaServiceImpl implements OsCodeGenSchemaServiceI {
+
+    /**
+     * zip鎿嶄綔绫�
+     */
+    @Autowired
+    private VciZipUtil zipUtil;
+
+    /**
+     * 鏃ュ織
+     */
+    private Logger logger = LoggerFactory.getLogger(getClass());
+
+    /**
+     * 鐢熸垚鏂规鏁版嵁搴撴搷浣滅被
+     */
+    @Resource
+    private OsCodeGenSchemaDaoI codeGenSchemaDOMapper;
+
+    /**
+     * 涓氬姟绫诲瀷
+     */
+    @Autowired
+    private WebBtmIOServiceI btmIOService;
+
+    /**
+     * 涓氬姟绫诲瀷鐩稿叧鐨勬搷浣�
+     */
+    @Autowired
+    private OsBtmServiceI btmService;
+
+    /**
+     * 灞炴�х殑鏈嶅姟
+     */
+    @Autowired
+    private OsAttributeServiceI attrServiceI;
+
+    /**
+     * 浠g爜鐢熸垚鐨勬枃浠跺す
+     */
+    private static final String CODE_FOLDER = "codes";
+
+    /**
+     * 瀵硅薄鎿嶄綔宸ュ叿绫�
+     */
+    @Autowired
+    private RevisionModelUtil revisionModelUtil;
+
+    /**
+     * 浠g爜鐢熸垚鏂规鍒楄〃
+     *
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param pageHelper   鍒嗛〉瀵硅薄
+     * @return 鏂规鐨勬樉绀哄璞�
+     * @throws VciBaseException 鎵ц鍑洪敊鍙兘浼氭姏鍑哄紓甯�
+     */
+    @Override
+    public DataGrid<OsCodeGenSchemaVO> gridSchema(Map<String, String> conditionMap, PageHelper pageHelper) throws VciBaseException {
+        if(pageHelper == null){
+            pageHelper = new PageHelper(-1);
+        }
+        //榛樿浣跨敤ID灞炴�ф帓搴�
+        pageHelper.addSort("createTime",pageHelper.desc);
+        List<OsCodeGenSchemaDO> schemaDOList = codeGenSchemaDOMapper.selectByWrapper(conditionMap,pageHelper);
+        DataGrid<OsCodeGenSchemaVO> dataGrid = new DataGrid<OsCodeGenSchemaVO>();
+        List<OsCodeGenSchemaVO> schemaVOList = codeGenSchemaDO2VOs(schemaDOList);
+        dataGrid.setData(schemaVOList);
+        if(!CollectionUtils.isEmpty(schemaVOList) && schemaVOList.size()>0){
+            Integer total = codeGenSchemaDOMapper.countByWrapper(conditionMap);
+            dataGrid.setTotal(total);
+        }else{
+            dataGrid.setTotal(0);
+        }
+        return dataGrid;
+    }
+
+    /**
+     * 鏁版嵁瀵硅薄鍒楄〃杞负鏄剧ず瀵硅薄鍒楄〃
+     * @param schemaDOList 鏁版嵁瀵硅薄鍒楄〃
+     * @return 鏄剧ず瀵硅薄鍒楄〃
+     */
+    @Override
+    public List<OsCodeGenSchemaVO> codeGenSchemaDO2VOs(List<OsCodeGenSchemaDO> schemaDOList) {
+        List<OsCodeGenSchemaVO> schemaVOList = new ArrayList<OsCodeGenSchemaVO>();
+        if(!CollectionUtils.isEmpty(schemaDOList)){
+           for(OsCodeGenSchemaDO schemaDO :schemaDOList){
+                OsCodeGenSchemaVO schemaVO = codeGenSchemaDO2VO(schemaDO);
+                if(schemaVO != null){
+                    schemaVOList.add(schemaVO);
+                }
+            }
+        }
+        return schemaVOList;
+    }
+
+    /**
+     * 鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+     * @param schemaDO 鏁版嵁瀵硅薄
+     * @return 鏄剧ず瀵硅薄
+     */
+    @Override
+    public OsCodeGenSchemaVO codeGenSchemaDO2VO(OsCodeGenSchemaDO schemaDO) {
+        OsCodeGenSchemaVO schemaVO = new OsCodeGenSchemaVO();
+        if(schemaDO!=null){
+            BeanUtil.convert(schemaDO,schemaVO);
+            schemaVO.setWestLayoutPanelTypeText(OsCodeGenJsPanelTypeEnum.getTextByValue(schemaVO.getWestLayoutPanelType()));
+            schemaVO.setCenterLayoutPanelTypeText(OsCodeGenJsPanelTypeEnum.getTextByValue(schemaVO.getCenterLayoutPanelType()));
+            schemaVO.setSouthLayoutPanelTypeText(OsCodeGenJsPanelTypeEnum.getTextByValue(schemaVO.getSouthLayoutPanelType()));
+        }
+        return  schemaVO;
+    }
+
+    /**
+     * 娣诲姞浠g爜鐢熸垚鏂规
+     *
+     * @param codeGenSchemaDTO 鏂规鏁版嵁浼犺緭瀵硅薄
+     * @return 鏂规鏄剧ず瀵硅薄
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮墽琛屽嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public OsCodeGenSchemaVO addSchema(OsCodeGenSchemaDTO codeGenSchemaDTO) throws VciBaseException {
+        VciBaseUtil.alertNotNull(codeGenSchemaDTO,"瑕佹坊鍔犵殑鏂规");
+        OsCodeGenSchemaDO codeGenSchemaDO = new OsCodeGenSchemaDO();
+        BeanUtil.convert(codeGenSchemaDTO,codeGenSchemaDO);
+        checkJsonFormate(codeGenSchemaDO);
+        //瀹炵幇绫绘槸鍓嶇鐩存帴濉啓
+        codeGenSchemaDOMapper.insert(codeGenSchemaDO);
+        return codeGenSchemaDO2VO(codeGenSchemaDO);
+    }
+
+    /**
+     * 鏍¢獙鐗规畩灞炴�ф槸鍚︿负json鏍煎紡
+     * @param codeGenSchemaDO 鏁版嵁瀵硅薄
+     */
+    private void checkJsonFormate(OsCodeGenSchemaDO codeGenSchemaDO){
+        Map<String,String> checkAttrsMap = new HashMap<String,String>();
+
+        codeGenSchemaDO.setCenterQueryConfig(StringUtils.isBlank(codeGenSchemaDO.getCenterQueryConfig())?"":HtmlUtils.htmlUnescape(codeGenSchemaDO.getCenterQueryConfig()));
+        codeGenSchemaDO.setCenterButtons(StringUtils.isBlank(codeGenSchemaDO.getCenterButtons())?"":HtmlUtils.htmlUnescape(codeGenSchemaDO.getCenterButtons()));
+        codeGenSchemaDO.setWestQueryConfig(StringUtils.isBlank(codeGenSchemaDO.getWestQueryConfig())?"":HtmlUtils.htmlUnescape(codeGenSchemaDO.getWestQueryConfig()));
+        codeGenSchemaDO.setWestButtons(StringUtils.isBlank(codeGenSchemaDO.getWestButtons())?"":HtmlUtils.htmlUnescape(codeGenSchemaDO.getWestButtons()));
+        codeGenSchemaDO.setSouthButtons(StringUtils.isBlank(codeGenSchemaDO.getSouthButtons())?"":HtmlUtils.htmlUnescape(codeGenSchemaDO.getSouthButtons()));
+        codeGenSchemaDO.setSouthQueryConfig(StringUtils.isBlank(codeGenSchemaDO.getSouthQueryConfig())?"":HtmlUtils.htmlUnescape(codeGenSchemaDO.getSouthQueryConfig()));
+        checkAttrsMap.put(codeGenSchemaDO.getWestQueryConfig(),"瑗垮尯鏌ヨ鏉′欢");
+        checkAttrsMap.put(codeGenSchemaDO.getCenterQueryConfig(),"涓績鍖烘煡璇㈡潯浠�");
+        checkAttrsMap.put(codeGenSchemaDO.getSouthQueryConfig(),"鍗楀尯鏌ヨ鏉′欢");
+        checkAttrsMap.put(codeGenSchemaDO.getWestButtons(),"瑗垮尯鎸夐挳");
+        checkAttrsMap.put(codeGenSchemaDO.getCenterButtons(),"涓績鍖烘寜閽�");
+        checkAttrsMap.put(codeGenSchemaDO.getSouthButtons(),"鍗楀尯鎸夐挳");
+        for(String attr:checkAttrsMap.keySet()){
+            String msg = checkAttrsMap.get(attr);
+            checkStringIsJson(attr,msg);
+        }
+    }
+
+    /**
+     * 妫�楠屽瓧绗︿覆鏄笉鏄负json鏍煎紡
+     * @param s 瀛楃涓�
+     * @param msg 涓嶆槸json鏃剁殑鎻愮ず淇℃伅
+     */
+    private void checkStringIsJson(String s, String msg){
+        if(StringUtils.isNotBlank(s)) {
+            try {
+                JSONObject.parseObject(s);
+            } catch (Throwable e) {
+                throw new VciBaseException(msg + "涓嶆槸鏈夋晥鐨刯son鏍煎紡");
+            }
+        }
+    }
+
+    /**
+     * 淇敼浠g爜鐢熸垚鏂规
+     *
+     * @param codeGenSchemaDTO 鏂规鏁版嵁浼犺緭瀵硅薄
+     * @return 鏂规鏄剧ず瀵硅薄
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮墽琛屽嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public OsCodeGenSchemaVO editSchema(OsCodeGenSchemaDTO codeGenSchemaDTO) throws VciBaseException {
+        VciBaseUtil.alertNotNull(codeGenSchemaDTO,"瑕佷慨鏀圭殑鏂规",codeGenSchemaDTO.getOid(),"鏂规鐨勪富閿�");
+        OsCodeGenSchemaDO codeGenSchemaDO = selectByOid(codeGenSchemaDTO.getOid());
+        revisionModelUtil.copyFromDTO(codeGenSchemaDTO,codeGenSchemaDO);
+        checkJsonFormate(codeGenSchemaDO);
+
+        codeGenSchemaDOMapper.updateByPrimaryKey(codeGenSchemaDO);
+        return codeGenSchemaDO2VO(codeGenSchemaDO);
+    }
+
+    /**
+     * 閫夋嫨涓婚敭
+     * @param oid 涓婚敭
+     * @return 鏂规鐨勬暟鎹璞�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮暟鎹笉瀛樺湪浼氭姏鍑哄紓甯�
+     */
+    private OsCodeGenSchemaDO selectByOid(String oid) throws VciBaseException{
+        VciBaseUtil.alertNotNull(oid,"鏂规鐨勪富閿�");
+        OsCodeGenSchemaDO codeGenSchemaDO = codeGenSchemaDOMapper.selectByPrimaryKey(oid);
+        if(codeGenSchemaDO == null || StringUtils.isBlank(codeGenSchemaDO.getOid())){
+            throw new VciBaseException("浠g爜鐢熸垚鏂规涓嶅瓨鍦�");
+        }
+        return codeGenSchemaDO;
+    }
+
+    /**
+     * 浠g爜妯℃澘璺緞
+     */
+    private static final String CODE_TEMPLATE_FOLDER = "/codeTemplate";
+
+    /**
+     * 鐢熸垚浠g爜鏂囦欢
+     *
+     * @param oid 鏂规鐨勪富閿�
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屾柟妗堜笉瀛樺湪浼氭姏鍑哄紓甯�
+     */
+    @Override
+    public void productCodeFile(String oid) throws VciBaseException {
+        OsCodeGenSchemaDO codeGenSchemaDO = selectByOid(oid);
+        //澶勭悊涓存椂鏂囦欢澶癸紝鍦ㄤ复鏃舵枃浠跺す涓坊鍔燾odes/{涓氬姟绫诲瀷鐨勮嫳鏂囧悕绉皚
+        String tempFolder =LocalFileUtil.getProjectFolder();
+        tempFolder = tempFolder + File.separator + CODE_FOLDER + File.separator+ codeGenSchemaDO.getId();
+        File folder = new File(tempFolder);
+        if(!folder.exists()){
+            folder.mkdirs();
+        }
+        if(logger.isDebugEnabled()){
+            logger.debug("鐢熸垚浠g爜锛屼复鏃舵枃浠跺す{}",tempFolder);
+        }
+        //鏌ヨ涓氬姟绫诲瀷鐨勬墍鏈夌殑灞炴��.getBtmTypeByOid閲屽氨鍖呭惈灞炴�у拰灞炴�х敤鐨勬灇涓炬槧灏勭殑鍊�
+
+        String classFullName = codeGenSchemaDO.getClassName();
+        VciBaseUtil.alertNotNull(classFullName,"涓氬姟绫诲瀷鐨勫疄浣撶被鐨勫悕绉�");
+        String className = classFullName;
+        String packageName = "";
+        if(className.indexOf(".")>-1){
+            packageName = classFullName.substring(0,classFullName.lastIndexOf("."));
+            if(packageName.indexOf(".")>-1){
+                 packageName = packageName.substring(0,packageName.lastIndexOf("."));
+            }
+            className = className.substring(className.lastIndexOf(".")+1 );
+
+        }
+
+
+        //灏佽鎵�鏈夐渶瑕佺殑灞炴��
+        //1.鍏堝皝瑁呮墍鏈夌殑鍏叡鐨勫睘鎬�
+        Map<String,Object> mainDataMap = new HashMap<String,Object>();
+        //浣跨敤鏂规閲岀殑鍚嶇О
+        mainDataMap.put("comments",codeGenSchemaDO.getName());
+        String doClassName = className;
+        mainDataMap.put("doClassName",doClassName);
+        if(className.endsWith("DO")){
+            className = className.substring(0,className.length()-2);
+        }
+        //绫荤殑鍚嶇О
+        mainDataMap.put("className",className);
+        //绫诲悕绉扮殑棣栧瓧姣嶅皬鍐�
+        mainDataMap.put("classNameFristLowwer",VciBaseUtil.toLowForFirst(className));
+        //浣滆��
+        String author = codeGenSchemaDO.getAuthor();
+        if(StringUtils.isBlank(author)){
+            author = WebUtil.getCurrentUserId();
+        }
+        mainDataMap.put("author",author);
+        mainDataMap.put("datetime", VciDateUtil.getNowString(VciDateUtil.DateFormat));
+        ObjectStreamClass os = ObjectStreamClass.lookup(OsCodeGenSchemaDO.class);
+        long serialVersionUID = os.getSerialVersionUID();
+        //do涓嶇敓鎴愶紝do鏄墍鏈夌殑婧愬ご
+        String doPackage = (StringUtils.isBlank(codeGenSchemaDO.getDoPackage())?(packageName + ".model"):codeGenSchemaDO.getDoPackage());
+        mainDataMap.put("doPackage",doPackage);
+        mainDataMap.put("doSerialVersionUID",String.valueOf((serialVersionUID + (doPackage + "." + className + "DO").hashCode())) + "L");
+        //vo鐨勫寘鍚�
+        String voPackage = (StringUtils.isBlank(codeGenSchemaDO.getVoPackage())?(packageName + ".pageModel"):codeGenSchemaDO.getVoPackage());
+        mainDataMap.put("voPackage",voPackage);
+        mainDataMap.put("voSerialVersionUID", String.valueOf((serialVersionUID + (voPackage + "." + className + "VO").hashCode())) + "L");
+        //dto鐨勫寘鍚�
+        String dtoPackage = (StringUtils.isBlank(codeGenSchemaDO.getDtoPackage())?(packageName + ".dto"):codeGenSchemaDO.getDtoPackage());
+        mainDataMap.put("dtoPackage",dtoPackage);
+        mainDataMap.put("dtoSerialVersionUID", String.valueOf((serialVersionUID + (dtoPackage + "." + className + "DTO").hashCode())) + "L");
+
+        //po鐨勫寘鍚�
+        String poPackage  = packageName + ".po";
+        mainDataMap.put("poPackage",poPackage);
+
+        //鏆傛椂涓嶅紑鏀炬潈闄�
+        mainDataMap.put("hasPermisssion",false);
+        //鐪嬬湅鏄惁鏈夌敓鍛藉懆鏈�
+        String lcStatusClassName = "";
+        String lcStatusFullClassName = "";
+        Map<String, OsBtmTypeVO> allBtmMap = btmService.selectAllBtmMap();
+        String btmId = codeGenSchemaDO.getId();
+        if(!allBtmMap.containsKey(btmId)){
+            throw new VciBaseException("涓氬姟绫诲瀷{0}鍦ㄧ郴缁熼噷涓嶅瓨鍦�",new String[]{btmId});
+        }
+        mainDataMap.put("lcStatusClassName",lcStatusClassName);
+        mainDataMap.put("lcStatusFullClassName",lcStatusFullClassName);
+
+        //鐪嬬湅鏄惁鏈夊惎鐢ㄥ拰鍋滅敤
+        boolean hasEnable = false;
+        boolean hasExcel = false;
+        mainDataMap.put("hasEnable",hasEnable);
+        mainDataMap.put("hasExcel",hasExcel);
+
+        OsBtmTypeVO btmItem = allBtmMap.get(btmId);
+        if(StringUtils.isNotBlank(btmItem.getLifeCycleId()) && !FrameWorkLcStatusConstant.EMTYPE_LIFE_CYCLE.equalsIgnoreCase(btmItem.getLifeCycleId())){
+            mainDataMap.put("hasStatus",true);
+        }else{
+            mainDataMap.put("hasStatus",false);
+        }
+        //鐪嬫湁娌℃湁涓婄骇灞炴��
+        boolean hasParentField = false;
+        String parentFieldName = "";
+        if(BooleanEnum.TRUE.getValue().equalsIgnoreCase(codeGenSchemaDO.getUseLayoutRegion())){
+            parentFieldName = codeGenSchemaDO.getWestNextRegionParam();
+            if(StringUtils.isNotBlank(parentFieldName)){
+                hasParentField = true;
+            }
+        }
+
+        mainDataMap.put("hasParentField",hasParentField);
+        mainDataMap.put("parentFieldName",parentFieldName);
+        mainDataMap.put("parentFieldNameLow",parentFieldName.toLowerCase(Locale.ROOT));
+        //杞崲鎵�鏈夌殑灞炴��
+        List<OsCodeGenAttributeBO> attributes = new ArrayList<OsCodeGenAttributeBO>();
+        List<OsCodeGenAttributeBO> uiAttributes = new ArrayList<OsCodeGenAttributeBO>();
+        List<OsCodeGenAttributeBO> referAttributes = new ArrayList<OsCodeGenAttributeBO>();
+        String booleanClass = Boolean.class.getSimpleName();
+        String stringClass = String.class.getSimpleName();
+        List<OsBtmTypeAttributeVO> attributeVOS = btmService.listAttributeByBtmId(btmId);
+        if(CollectionUtils.isEmpty(attributeVOS)){
+            attributeVOS = new ArrayList<>();
+        }
+        //澶勭悊id,name鍜宒escription鐨勫唴瀹�
+        Map<String,OsBtmTypeAttributeVO> defaultAttrMap = new HashMap<>();
+        if(StringUtils.isNotBlank(classFullName)){
+            try {
+                Class<?> aClass = Class.forName(classFullName);
+                OsBtmTypeAttributeVO idAttr = fieldToAttrVO(aClass, "id");
+                if(idAttr!=null){
+                    defaultAttrMap.put("id",idAttr);
+                }
+                OsBtmTypeAttributeVO nameAttr = fieldToAttrVO(aClass, "name");
+                if(nameAttr!=null){
+                    defaultAttrMap.put("name",idAttr);
+                }
+                OsBtmTypeAttributeVO descAttr = fieldToAttrVO(aClass, "description");
+                if(descAttr!=null){
+                    defaultAttrMap.put("desc",descAttr);
+                }
+            } catch (Throwable e) {
+                e.printStackTrace();
+            }
+        }
+        OsBtmTypeAttributeVO idAttr = new OsBtmTypeAttributeVO();
+        if(defaultAttrMap.containsKey("id")){
+            BeanUtil.convert(defaultAttrMap.get("id"),idAttr);
+            idAttr.setId("id");
+            if(StringUtils.isBlank(idAttr.getName())){
+                idAttr.setName("缂栧彿");
+            }
+            idAttr.setAttrDataType(VciFieldTypeEnum.VTString.name());
+            if(idAttr.getAttributeLength() == null || idAttr.getAttributeLength() <= 0){
+                idAttr.setAttributeLength(50);
+            }
+            attributeVOS.add(idAttr);
+        }
+
+        OsBtmTypeAttributeVO nameAttr = new OsBtmTypeAttributeVO();
+        if(defaultAttrMap.containsKey("name")){
+            BeanUtil.convert(defaultAttrMap.get("name"),nameAttr);
+            nameAttr.setId("name");
+            if(StringUtils.isBlank(nameAttr.getName())){
+                nameAttr.setName("鍚嶇О");
+            }
+            nameAttr.setAttrDataType(VciFieldTypeEnum.VTString.name());
+            if(nameAttr.getAttributeLength() == null || nameAttr.getAttributeLength() <= 0){
+                nameAttr.setAttributeLength(150);
+            }
+            attributeVOS.add(nameAttr);
+        }
+
+        OsBtmTypeAttributeVO descAttr = new OsBtmTypeAttributeVO();
+        if(defaultAttrMap.containsKey("desc")){
+            BeanUtil.convert(defaultAttrMap.get("desc"),descAttr);
+            descAttr.setId("description");
+            if(StringUtils.isBlank(descAttr.getName())){
+                descAttr.setName("鎻忚堪");
+            }
+            descAttr.setAttrDataType(VciFieldTypeEnum.VTString.name());
+            if(descAttr.getAttributeLength() == null || descAttr.getAttributeLength() <= 0){
+                descAttr.setAttributeLength(250);
+            }
+            attributeVOS.add(descAttr);
+        }
+        Set<String> attrIdSet = attributeVOS.stream().map(s->s.getId().toLowerCase(Locale.ROOT)).collect(Collectors.toSet());
+        if(!CollectionUtils.isEmpty(attributeVOS)){
+            attributeVOS.stream().forEach(attr->{
+                OsCodeGenAttributeBO attributeBO = new OsCodeGenAttributeBO();
+                BeanUtil.convert(attr, attributeBO);
+                attributeBO.setIdUpper(attr.getId().toUpperCase());
+                if(VciQueryWrapperForDO.LC_STATUS_FIELD.equalsIgnoreCase(attributeBO.getId())){
+                    attributeBO.setName("鐘舵��");
+                }
+                attributeBO.setVciAttrDataType(attr.getAttrDataType());
+                attributeBO.setNullable(String.valueOf(attr.isNullableFlag()));
+                attributeBO.setAttrDataType(getAttrDateTypeFromVci(attributeBO.getVciAttrDataType()));
+                attributeBO.setJdbcType(getJdbcTypeFromVci(attributeBO.getVciAttrDataType()));
+                attributeBO.setSetter(getSetter(attributeBO.getId(), attributeBO.getAttrDataType()));
+                attributeBO.setGetter(getGetter(attributeBO.getId(), attributeBO.getAttrDataType()));
+                //VTBoolean锛屽湪vo鍜宒to閲岃浣跨敤boolean绫诲瀷
+                if (VciFieldTypeEnum.VTBoolean.name().equalsIgnoreCase(attributeBO.getAttrDataType())) {
+                    attributeBO.setVoJavaDataType(booleanClass);
+                    attributeBO.setVoGetter(getGetter(attributeBO.getId(), attributeBO.getVoJavaDataType()));
+                    attributeBO.setVoSetter(getSetter(attributeBO.getId(), attributeBO.getVoJavaDataType()));
+                } else {
+                    attributeBO.setVoJavaDataType(attributeBO.getAttrDataType());
+                    attributeBO.setVoGetter(attributeBO.getGetter());
+                    attributeBO.setVoSetter(attributeBO.getSetter());
+                }
+                if (StringUtils.isNotBlank(attr.getReferBtmTypeId())) {
+                    //鏄弬鐓х殑
+                    attributeBO.setReferFlag(true);
+                    attributeBO.setReferDBField(attributeBO.getId() + ".name");
+                    attributeBO.setReferBtmTypeId(attributeBO.getReferBtmTypeId());
+                    attributeBO.setReferBtmTypeShowField(attr.getId() + "Name");
+                    attributeBO.setReferBtmTypeShowFieldGetter(getGetter(attributeBO.getReferBtmTypeShowField(), stringClass));
+                    attributeBO.setReferBtmTypeShowFieldSetter(getSetter(attributeBO.getReferBtmTypeShowField(), stringClass));
+                    //澶勭悊鍙傜収鐨勫瓧娈�
+                    OsCodeGenAttributeBO referAttrBO = new OsCodeGenAttributeBO();
+                    referAttrBO.setId(attributeBO.getReferBtmTypeShowField());
+                    referAttrBO.setIdUpper(referAttrBO.getId().toUpperCase());
+                    referAttrBO.setJdbcType("VARCHAR");
+                    if("grid".equalsIgnoreCase(attributeBO.getReferType())){
+                        attributeBO.setReferControlUrl("uiDataController/defaultReferDataGrid");
+                    }else{
+                        attributeBO.setReferControlUrl("uiDataController/defaultReferTree");
+                    }
+                    if(!attrIdSet.contains(referAttrBO.getId().toLowerCase(Locale.ROOT))) {
+                        attributeBO.setReferNameExist(false);
+                        referAttributes.add(referAttrBO);
+                    }
+                }
+                if (StringUtils.isNotBlank(attr.getEnumId())) {
+                    attributeBO.setEnumFlag(true);
+                    attributeBO.setEnumId(attributeBO.getEnumId().trim());
+                    attributeBO.setEnumShowField(attr.getId() + "Text");
+                    attributeBO.setEnumDBField(attributeBO.getEnumId().trim() + "_" + attributeBO.getId().toLowerCase());
+                    attributeBO.setEnumShowFieldGetter(getGetter(attributeBO.getEnumShowField(), stringClass));
+                    attributeBO.setEnumShowFieldSetter(getSetter(attributeBO.getEnumShowField(), stringClass));
+                }
+                attributes.add(attributeBO);
+                uiAttributes.add(attributeBO);
+            });
+        }
+        mainDataMap.put("attributes",attributes);
+        mainDataMap.put("uiAttributes",uiAttributes);
+        mainDataMap.put("referAttributes",referAttributes);
+
+        //controller鐩稿叧鐨�
+        String requestMap = codeGenSchemaDO.getControllerRequestMap();
+        String controllerUrl = requestMap;
+        if(!requestMap.startsWith("/")){
+            requestMap = "/" + requestMap;
+        }
+        if(requestMap.endsWith("/")){
+            requestMap = requestMap.substring(0,requestMap.length()-1);
+        }
+        if(controllerUrl.startsWith("/")){
+            controllerUrl = controllerUrl.substring(1);
+        }
+        if(!controllerUrl.endsWith("/")){
+            controllerUrl = controllerUrl + "/";
+        }
+        //controller閲岄潰瑕佷娇鐢�/寮�澶达紝鍦║i閲屽紑澶翠笉鑳芥湁/锛屽洜涓篵ackPath閲屽凡缁忓寘鍚簡
+        mainDataMap.put("controllerRequestMap",requestMap);
+        mainDataMap.put("controllerUrl",controllerUrl);
+        mainDataMap.put("controllerPackage",codeGenSchemaDO.getControllerPackage());
+        mainDataMap.put("backPath",codeGenSchemaDO.getBackPath());
+
+        boolean useWest = BooleanEnum.TRUE.getValue().equalsIgnoreCase(codeGenSchemaDO.getUseLayoutRegion());
+        mainDataMap.put("useWest",useWest);
+        if(useWest ){
+            //澶勭悊鎸夐挳
+            List<OsCodeGenButtonBO> buttonBOS = switchButtons(codeGenSchemaDO.getWestButtons(),"瑗垮尯鎸夐挳涓嶆槸鏈夋晥鐨刯son瀵硅薄锛寋0}");
+            mainDataMap.put("westButtons",buttonBOS);
+            //澶勭悊鏌ヨ鏉′欢
+            checkQueryIsJson(codeGenSchemaDO.getWestQueryConfig(),"瑗垮尯鐨勬煡璇㈡潯浠朵笉鏄湁鏁堢殑json瀵硅薄锛寋0}");
+            mainDataMap.put("westQuerys", StringUtils.isBlank(codeGenSchemaDO.getWestQueryConfig())?"":codeGenSchemaDO.getWestQueryConfig());
+            mainDataMap.put("westLayoutPanelType",codeGenSchemaDO.getWestLayoutPanelType());
+            mainDataMap.put("westNextRegionParam",codeGenSchemaDO.getWestNextRegionParam());
+        }
+
+        //澶勭悊涓績鍖�
+        //澶勭悊鎸夐挳
+        List<OsCodeGenButtonBO> buttonBOS = switchButtons(codeGenSchemaDO.getCenterButtons(),"涓績鍖烘寜閽笉鏄湁鏁堢殑json瀵硅薄锛寋0}");
+        mainDataMap.put("centerButtons",buttonBOS);
+        //澶勭悊鏌ヨ鏉′欢
+        checkQueryIsJson(codeGenSchemaDO.getCenterQueryConfig(),"涓績鍖虹殑鏌ヨ鏉′欢涓嶆槸鏈夋晥鐨刯son瀵硅薄锛寋0}");
+        mainDataMap.put("centerQuerys", StringUtils.isBlank(codeGenSchemaDO.getCenterQueryConfig())?"":codeGenSchemaDO.getCenterQueryConfig());
+        mainDataMap.put("centerLayoutPanelType",codeGenSchemaDO.getCenterLayoutPanelType());
+
+        //澶勭悊service鐩稿叧鐨�
+        String servicePackage = (StringUtils.isBlank(codeGenSchemaDO.getServicePackage())?(packageName + ".service"):codeGenSchemaDO.getServicePackage());
+        mainDataMap.put("servicePackage",servicePackage);
+        mainDataMap.put("btmTypeId",btmId);
+        mainDataMap.put("btmTypeIdLow",btmId.toLowerCase());
+
+        //澶勭悊mapper鍜寈ml鐨�
+        String mapperPackage = (StringUtils.isBlank(codeGenSchemaDO.getMapperPackage())?(packageName + ".dao"):codeGenSchemaDO.getMapperPackage());
+        mainDataMap.put("mapperPackage",mapperPackage);
+        mainDataMap.put("mapperImplPackage",mapperPackage + ".impl");
+        mainDataMap.put("tableName", VciBaseUtil.getTableName(btmId));
+
+        //璁剧疆velocity璧勬簮鍔犺浇鍣�
+        Properties prop = new Properties();
+        prop.put("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
+        Velocity.init(prop);
+        VelocityContext context = new VelocityContext(mainDataMap);
+        String finalTempFolder = tempFolder;
+
+        String finalClassName = className;
+        String xmlPackage = (StringUtils.isBlank(codeGenSchemaDO.getMapperXmlPackage())?(mapperPackage + ".impl"):codeGenSchemaDO.getMapperXmlPackage());
+        String jsPackage = codeGenSchemaDO.getJsPackage();
+        mainDataMap.put("jsPackage",jsPackage);
+        for(String template : TEMPLATE_NAME_LIST){
+            //鍏堟嫹璐濇枃浠�
+            String templateFile = finalTempFolder + File.separator;
+            if(!CollectionUtils.isEmpty(defaultAttrMap) && template.startsWith("DO.")){
+                //璇存槑鏈塂O鐨勫璞★紝閭d箞杩欎釜灏变笉鐢熸垚
+                continue;
+            }
+            if(template.startsWith("Controller.")){
+                templateFile += codeGenSchemaDO.getControllerPackage().replace(".", File.separator) + File.separator + finalClassName + "Controller.java";
+            }else if(template.startsWith("DO.")){
+                templateFile += doPackage.replace(".", File.separator) + File.separator + finalClassName + "DO.java";
+            }else if(template.startsWith("VO.")){
+                templateFile += voPackage.replace(".", File.separator) + File.separator + finalClassName + "VO.java";
+            }else if(template.startsWith("DTO.")){
+                templateFile += dtoPackage.replace(".", File.separator) + File.separator + finalClassName + "DTO.java";
+            }else if(template.startsWith("PO.")){
+                templateFile += poPackage.replace(".", File.separator) + File.separator + finalClassName + "PO.java";
+            }else if(template.startsWith("DO.")){
+                templateFile += doPackage.replace(".", File.separator) + File.separator + doClassName + ".java";
+            }else if(template.startsWith("Mapper.java")){
+                templateFile += mapperPackage.replace(".", File.separator) + File.separator + finalClassName + "DaoI.java";
+            }else if(template.startsWith("Mapper.impl")){
+                templateFile += xmlPackage.replace(".",File.separator) + File.separator + finalClassName + "DaoImpl.java";
+            }else if(template.startsWith("Service.java")){
+                templateFile += servicePackage.replace(".", File.separator) + File.separator + finalClassName + "ServiceI.java";
+            }else if(template.startsWith("Service.impl")){
+                templateFile += servicePackage.replace(".", File.separator) + File.separator + "impl" + File.separator +  finalClassName + "ServiceImpl.java";
+            }else if(template.startsWith("ui.js")){
+                templateFile += jsPackage.replace(".", File.separator) + ".js";
+            }
+            File tempFile = new File(templateFile);
+            if(tempFile.exists()){
+                tempFile.delete();
+            }
+            LocalFileUtil.copyFileInJar(CODE_TEMPLATE_FOLDER + "/" + template,templateFile);
+            StringWriter sw = new StringWriter();
+            Template tpl = Velocity.getTemplate(CODE_TEMPLATE_FOLDER + "/" + template, "UTF-8");
+            tpl.merge(context, sw);
+            OutputStream outs ;
+            try{
+                outs = new FileOutputStream(templateFile);
+            }catch (FileNotFoundException e){
+                throw new VciBaseException("浠庢ā鏉夸腑鎷疯礉鏂囦欢娌℃湁鎴愬姛",new String[]{},e);
+            }catch (Throwable e){
+                throw new VciBaseException("浠庢ā鏉夸腑鎷疯礉鏂囦欢娌℃湁鎴愬姛",new String[]{},e);
+            }
+            try {
+                IOUtils.write(sw.toString(), outs, "UTF-8" );
+            } catch (IOException e) {
+                throw new VciBaseException("鍐欏叆鏁版嵁鍒版ā鏉挎病鏈夋垚鍔�",new String[]{},e);
+            }finally {
+                IOUtils.closeQuietly(sw);
+                IOUtils.closeQuietly(outs);
+            }
+        }
+        codeGenSchemaDO.setLastProductDate(new Date());
+        codeGenSchemaDOMapper.updateByPrimaryKey(codeGenSchemaDO);
+    }
+
+
+    /**
+     * 鏍¢獙鏌ヨ閰嶇疆鏄惁鏈夋晥鐨刯son鏍煎紡
+     * @param queryJson 鏌ヨ鏉′欢鐨刯son瀛楃涓�
+     * @param errorMsg 閿欒淇℃伅
+     * @throws VciBaseException 涓嶆槸鏈夋晥鐨刯son瀛楃涓茬殑鏃跺�欙紝浼氭姏鍑哄紓甯�
+     */
+    private void checkQueryIsJson(String queryJson, String errorMsg) throws VciBaseException{
+        if(StringUtils.isNotBlank(queryJson)){
+            try {
+                JSONObject queryJsonObj = JSONObject.parseObject(queryJson);
+            }catch (Throwable e){
+                throw new VciBaseException(errorMsg,new String[]{queryJson});
+            }
+        }
+    }
+
+    /**
+     * 瀛楁杞崲涓哄睘鎬ф樉绀哄璞�
+     * @param aClass 瀵硅薄绫�
+     * @param fieldName 瀛楁鍚嶇О
+     * @return 灞炴�х殑淇℃伅锛屾病鏈夊瓧娈垫弿杩扮殑鏃跺�欎細杩斿洖null
+     */
+    private OsBtmTypeAttributeVO fieldToAttrVO(Class<?> aClass,String fieldName){
+        //鎴戜滑鍘昏幏鍙栧畠鐨勫睘鎬�
+        Field idField = VciBaseUtil.getFieldForObject(fieldName, aClass);
+        if(idField!=null){
+            idField.setAccessible(true);
+            if(idField.isAnnotationPresent(Column.class)){
+                Column column = idField.getAnnotation(Column.class);
+                if(StringUtils.isNotBlank(column.columnDefinition())){
+                    OsBtmTypeAttributeVO idAttr = new OsBtmTypeAttributeVO();
+                    idAttr.setName(column.columnDefinition());
+                    idAttr.setNullableFlag(column.nullable());
+                    if(column.length()>0) {
+                        idAttr.setAttributeLength(column.length());
+                    }
+                    idAttr.setDefaultValue(column.defaultValue());
+                    return idAttr;
+                }
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 鑾峰彇鎸夐挳鐨勫璞�
+     * @param buttonsJson 鎸夐挳鐨刯son瀛楃涓�
+     * @param errorMsg 閿欒鐨勪俊鎭�
+     * @return 鎸夐挳瀵硅薄
+     * @throws VciBaseException json鏍煎紡鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    private List<OsCodeGenButtonBO> switchButtons(String buttonsJson, String errorMsg) throws VciBaseException{
+        List<OsCodeGenButtonBO> buttonBOS = new ArrayList<OsCodeGenButtonBO>();
+        if(StringUtils.isNotBlank(buttonsJson)){
+            try {
+                JSONObject buttons = JSONObject.parseObject(buttonsJson);
+                buttons.keySet().stream().sorted(((o1, o2) -> o1.compareTo(o2))).forEach(id->{
+                    String text = (String)buttons.get(id);
+                    String iconCls = BUTTON_ICONCLS_MAP.getOrDefault(id,"layui-icon-app");
+                    OsCodeGenButtonBO buttonBO = new OsCodeGenButtonBO();
+                    buttonBO.setId(id);
+                    buttonBO.setText(text);
+                    buttonBO.setIconCls(iconCls);
+                    buttonBOS.add(buttonBO);
+                });
+            }catch (Throwable e){
+                throw new VciBaseException(errorMsg,new String[]{buttonsJson});
+            }
+        }
+        return buttonBOS;
+    }
+
+    /**
+     * 鎸夐挳鐨勫浘鏍�
+     */
+    private static final Map<String,String> BUTTON_ICONCLS_MAP = new HashMap<String,String>(){{
+        put("ADD","layui-icon-add-1");
+        put("EDIT","layui-icon-edit");
+        put("DEL","layui-icon-delete");
+        put("DEL","layui-icon-delete");
+        put("ENABLE","layui-icon-ok-circle");
+        put("DISABLE","layui-icon-404");
+        put("refresh","layui-icon-refresh");
+        put("ADVQUERY","layui-icon-search");
+        put("EXPORT","layui-icon-export");
+        put("IMPORT","layui-icon-upload-drag");
+        put("RELEASE","layui-icon-release");
+    }};
+
+    /**
+     * 妯℃澘鐨勫悕绉�
+     */
+    public static final List<String> TEMPLATE_NAME_LIST = new ArrayList<String>(){{
+         add("Controller.java.vm");
+         add("DTO.java.vm");
+         add("VO.java.vm");
+         add("PO.java.vm");
+         add("Service.java.vm");
+         add("Service.impl.java.vm");
+         add("ui.js.vm");
+
+         add("Mapper.java.vm");
+         add("Mapper.impl.java.vm");
+    }};
+
+    /**
+     * 鑾峰彇set鏂规硶
+     * @param id 灞炴�х殑鍚嶇О
+     * @param attrDataType 灞炴�х殑java绫诲瀷
+     * @return set鏂规硶
+     */
+    private String getSetter(String id, String attrDataType) {
+       return "set" + VciBaseUtil.toUpForFirst(id);
+    }
+
+    /**
+     * 鑾峰彇get鏂规硶
+     * @param id 灞炴�х殑鍚嶇О
+     * @param attrDataType 灞炴�х殑java绫诲瀷
+     * @return get鏂规硶
+     */
+    private String getGetter(String id, String attrDataType){
+        if(Boolean.class.getSimpleName().equalsIgnoreCase(attrDataType)){
+            return "is" + VciBaseUtil.toUpForFirst(id);
+        }
+        return "get" + VciBaseUtil.toUpForFirst(id);
+    }
+
+    /**
+     * 鎶婂钩鍙扮殑灞炴�х被鍨嬭浆鎹负jdbc鐨勭被鍨�
+     * @param vciAttrDataType 骞冲彴鐨勫睘鎬х被鍨�
+     * @return jdbc鐨勭被鍨�
+     */
+    private String getJdbcTypeFromVci(String vciAttrDataType) {
+        VciFieldTypeEnum typeEnum = VciFieldTypeEnum.valueOf(vciAttrDataType);
+        if(typeEnum == null){
+            typeEnum = VciFieldTypeEnum.VTString;
+        }
+        switch (typeEnum){
+            case VTDate:
+            case VTDateTime:
+            case VTTime:
+                return "TIMESTAMP";
+            case VTInteger:
+            case VTLong:
+            case VTDouble:
+                return "DECIMAL";
+            default:
+                return "VARCHAR";
+        }
+    }
+
+    /**
+     * 鎶婂钩鍙扮殑灞炴�х被鍨嬭浆鎹负java鐨勭被鍨�
+     * @param vciAttrDataType 骞冲彴鐨勫睘鎬х被鍨�
+     * @return java鐨勭被鍨嬶紝娉ㄦ剰vo鍜宒to闇�瑕佸崟鐙鐞�
+     */
+    private String getAttrDateTypeFromVci(String vciAttrDataType) {
+        VciFieldTypeEnum typeEnum = VciFieldTypeEnum.valueOf(vciAttrDataType);
+        if(typeEnum == null){
+            typeEnum = VciFieldTypeEnum.VTString;
+        }
+        switch (typeEnum){
+            case VTDate:
+            case VTDateTime:
+            case VTTime:
+                return Date.class.getSimpleName();
+            case VTInteger:
+                return Integer.class.getSimpleName();
+            case VTLong:
+                return Long.class.getSimpleName();
+            case VTDouble:
+                return Double.class.getSimpleName();
+            default:
+                return String.class.getSimpleName();
+        }
+    }
+
+    /**
+     * 棰勮浠g爜鏂囦欢
+     *
+     * @param oid 鏂规鐨勪富閿�
+     * @return key鏄枃浠剁被鍒紝value鏄枃浠剁殑鍐呭
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屾柟妗堜笉瀛樺湪浼氭姏鍑哄紓甯�
+     */
+    @Override
+    public Map<String, String> previewCodeFile(String oid) throws VciBaseException {
+        OsCodeGenSchemaDO codeGenSchemaDO = selectByOid(oid);
+        String tempFolder = LocalFileUtil.getProjectFolder();
+        tempFolder = tempFolder + File.separator + CODE_FOLDER + File.separator+ codeGenSchemaDO.getId() + File.separator ;
+        String classFullName = codeGenSchemaDO.getClassName();
+        String className = classFullName;
+        String packageName = "";
+        if(className.indexOf(".")>-1){
+            packageName = classFullName.substring(0,classFullName.lastIndexOf("."));
+            if(packageName.indexOf(".")>-1){
+                packageName = packageName.substring(0,packageName.lastIndexOf("."));
+            }
+            className = className.substring(className.lastIndexOf(".")+1 );
+
+        }
+        if(className.endsWith("DO")){
+            className = className.substring(0,className.length()-2);
+        }
+        Map<String,String> fileContentMap = new HashMap<String,String>();
+
+        //VO
+        String voFileName = tempFolder + codeGenSchemaDO.getVoPackage().replace(".", File.separator) + File.separator + className + "VO.java";
+        fileContentMap.put("VO",LocalFileUtil.readContentForFile(voFileName));
+        //dto
+        String dtoFileName = tempFolder + codeGenSchemaDO.getDtoPackage().replace(".", File.separator) + File.separator + className + "DTO.java";
+        fileContentMap.put("DTO",LocalFileUtil.readContentForFile(dtoFileName));
+
+        //mapper
+        String mapperFileName = tempFolder + codeGenSchemaDO.getMapperPackage().replace(".", File.separator) + File.separator + className + "Mapper.java";
+        fileContentMap.put("Mapper",LocalFileUtil.readContentForFile(mapperFileName));
+
+        //mapper.xml
+        String mapperXmlFileName = tempFolder + codeGenSchemaDO.getMapperXmlPackage() + File.separator + className + "Mapper.xml";
+        fileContentMap.put("Mapperxml",LocalFileUtil.readContentForFile(mapperXmlFileName));
+
+        //controller
+        String controllerFileName = tempFolder + codeGenSchemaDO.getControllerPackage().replace(".", File.separator) + File.separator + className + "Controller.java";
+        fileContentMap.put("Controller",LocalFileUtil.readContentForFile(controllerFileName));
+
+        //Service
+        String serviceFileName = tempFolder + codeGenSchemaDO.getServicePackage().replace(".", File.separator) + File.separator + className + "ServiceI.java";
+        fileContentMap.put("Service",LocalFileUtil.readContentForFile(serviceFileName));
+
+        //Service.impl
+        String serviceImplFileName = tempFolder + codeGenSchemaDO.getServicePackage().replace(".", File.separator) + File.separator + "impl" + File.separator + className + "ServiceImpl.java";
+        fileContentMap.put("ServiceImpl",LocalFileUtil.readContentForFile(serviceImplFileName));
+
+        //js
+        String jsFileName = tempFolder + codeGenSchemaDO.getJsPackage()  + ".js";
+        fileContentMap.put("UI",LocalFileUtil.readContentForFile(jsFileName));
+
+        //Service
+        String poFileName = tempFolder + packageName.replace(".", File.separator) + File.separator + "po" + File.separator + className + "PO.java";
+        File poFile = new File(poFileName);
+        if(poFile.exists()) {
+           fileContentMap.put("PO", LocalFileUtil.readContentForFile(serviceFileName));
+        }
+        return fileContentMap;
+    }
+
+    /**
+     * 涓嬭浇浠g爜鏂囦欢
+     *
+     * @param oid 鏂规鐨勪富閿�
+     * @return zip鏂囦欢鐨勮矾寰�
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屾柟妗堜笉瀛樺湪浼氭姏鍑哄紓甯�
+     */
+    @Override
+    public String downloadCodeFile(String oid) throws VciBaseException {
+        OsCodeGenSchemaDO codeGenSchemaDO = selectByOid(oid);
+        String codeFolder = LocalFileUtil.getProjectFolder();
+        codeFolder = codeFolder + File.separator + CODE_FOLDER + File.separator+ codeGenSchemaDO.getId() ;
+        String tempZipFileName = LocalFileUtil.getDefaultTempFolder() + File.separator + codeGenSchemaDO.getId() + ".zip";
+        File folder = new File(codeFolder);
+        if(!folder.exists()){
+            throw new VciBaseException("浠g爜鍙兘娌℃湁鐢熸垚锛屾病鏈夊湪{0}鎵惧埌浠g爜鏂囦欢",new String[]{codeFolder});
+        }
+        zipUtil.folderToZipFile(codeFolder,tempZipFileName);
+        return tempZipFileName;
+    }
+
+    /**
+     * 鏍规嵁涓婚敭鑾峰彇鏄剧ず瀵硅薄
+     *
+     * @param oid 涓婚敭
+     * @return 鏂规鐨勬樉绀哄璞�
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屾柟妗堜笉瀛樺湪浼氭姏鍑哄紓甯�
+     */
+    @Override
+    public OsCodeGenSchemaVO getObjectByOid(String oid) throws VciBaseException {
+        return codeGenSchemaDO2VO(selectByOid(oid));
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/OsCodeRuleServiceImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/OsCodeRuleServiceImpl.java
new file mode 100644
index 0000000..ba4a692
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/OsCodeRuleServiceImpl.java
@@ -0,0 +1,949 @@
+package com.vci.web.service.impl;
+
+import com.vci.frameworkcore.constant.FrameWorkDefaultValueConstant;
+import com.vci.frameworkcore.lcstatuspck.FrameworkDataLCStatus;
+import com.vci.starter.web.enumpck.BooleanEnum;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.starter.web.util.BeanUtil;
+import com.vci.starter.web.util.LangBaseUtil;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.starter.web.util.VciDateUtil;
+import com.vci.web.bo.OsCodeSerialBuildBO;
+import com.vci.web.dao.*;
+import com.vci.web.dto.OsCodeEnumDTO;
+import com.vci.web.dto.OsCodeRuleDTO;
+import com.vci.web.dto.OsCodeRuleElementDTO;
+import com.vci.web.dto.OsCodeRuleProduceDTO;
+import com.vci.web.enumpck.OsCodeDateValueTypeEnum;
+import com.vci.web.enumpck.OsCodeElementTypeEnum;
+import com.vci.web.enumpck.OsCodeFillTypeEnum;
+import com.vci.web.enumpck.OsCodeProductTypeEnum;
+import com.vci.web.model.*;
+import com.vci.web.pageModel.OsCodeEnumVO;
+import com.vci.web.pageModel.OsCodeResultVO;
+import com.vci.web.pageModel.OsCodeRuleElementVO;
+import com.vci.web.pageModel.OsCodeRuleVO;
+import com.vci.web.service.OsCodeRuleServiceI;
+import com.vci.web.util.WebUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import javax.annotation.Resource;
+import java.util.*;
+
+import static com.vci.frameworkcore.constant.FrameWorkBusLangCodeConstant.DATA_ID_NOT_EXIST;
+import static com.vci.frameworkcore.constant.FrameWorkBusLangCodeConstant.DATA_OID_NOT_EXIST;
+
+/**
+ * 缂栫爜瑙勫垯鐨勬湇鍔�
+ *
+ * @author weidy
+ * @date 2020/9/2 14:28
+ */
+@Service
+public class OsCodeRuleServiceImpl implements OsCodeRuleServiceI {
+
+    /**
+     * 缂栫爜瑙勫垯鐨勬暟鎹搷浣滃眰
+     */
+    @Resource
+    private OsCodeRuleDaoI codeRuleDao;
+
+    /**
+     * 缂栫爜瑙勫垯鏄庣粏鐨勬暟鎹搷浣滃眰
+     */
+    @Resource
+    private OsCodeRuleElementDaoI codeRuleElementDao;
+
+    /**
+     * 鏋氫妇鐨勬槧灏勬暟鎹搷浣滃眰
+     */
+    @Resource
+    private OsCodeEnumDaoI codeEnumDao;
+
+    /**
+     * 娴佹按鍙峰瓨鍌ㄧ殑淇℃伅
+     */
+    @Resource
+    private OsCodeSerialNumberDaoI serialNumberDao;
+
+    /**
+     * 鏂爜鐨勬暟鎹搷浣滃眰
+     */
+    @Resource
+    private OsCodeBreakCodeDaoI breakCodeDao;
+
+    /**
+     * 鏋氫妇鏄┖鐨勬椂鍊欑殑鏄犲皠鍊�
+     */
+    public static final String EMPTY = "${empty}";
+
+    /**
+     * 绌虹殑娴佹按渚濇嵁
+     */
+    public static final String EMPTY_SERIAL_ACCORDING = "${nullSerialAccordingString}";
+
+    /**
+     * 浣跨敤鏁版嵁浼犺緭瀵硅薄鑾峰彇瑙勫垯鐨勫璞�
+     * @param codeRuleProduceDTO 鐢熸垚缂栫爜鐨勬暟鎹紶杈撳璞�
+     * @return 瑙勫垯鐨勫唴瀹�
+     */
+    private OsCodeRuleDO getRuleByDTO(OsCodeRuleProduceDTO codeRuleProduceDTO){
+        //鏌ヨ缂栫爜瑙勫垯锛屽拰鐩稿簲鐨勬槑缁嗗唴瀹�
+        OsCodeRuleDO ruleDO = null;
+        if (StringUtils.isNotBlank(codeRuleProduceDTO.getOwnbizBtm()) && StringUtils.isNotBlank(codeRuleProduceDTO.getUseRuleFlag())) {
+            ruleDO = selectByRuleFlag(codeRuleProduceDTO.getOwnbizBtm(), codeRuleProduceDTO.getUseRuleFlag());
+        } else if (StringUtils.isNotBlank(codeRuleProduceDTO.getCodeRuleId())) {
+            ruleDO = selectById(codeRuleProduceDTO.getCodeRuleId());
+        } else {
+            ruleDO = selectByOid(codeRuleProduceDTO.getCodeRuleOid());
+        }
+        return ruleDO;
+    }
+
+    /**
+     * 浣跨敤缂栫爜瑙勫垯鐢熸垚缂栫爜
+     *
+     * @param codeRuleProduceDTO 缂栫爜鐢熸垚鎵�灞炴暟鎹紶杈撳璞★紝瑙勫垯缂栧彿浼樺厛绾уぇ浜庝富閿紝浼犻�掔殑鏁版嵁浼樺厛绾уぇ浜庝笟鍔℃暟鎹�
+     * @return 鐢熸垚鐨勭紪鐮佺殑鍊�
+     * @throws VciBaseException 鍙傛暟閿欒锛岃鍒欎笉瀛樺湪锛屾暟鎹笉鏀寔缂栫爜鐨勭敓鎴愮瓑浼氭姏鍑哄紓甯�
+     */
+    @Override
+    public String produceCode(OsCodeRuleProduceDTO codeRuleProduceDTO) throws VciBaseException {
+        //鍒ゆ柇瑙勫垯鐨勭紪鍙锋垨鑰呰鍒欑殑涓婚敭
+        VciBaseUtil.alertNotNull(codeRuleProduceDTO, "缂栫爜鐢熸垚鏉ユ簮鏁版嵁");
+        if (StringUtils.isBlank(codeRuleProduceDTO.getCodeRuleId())
+                && StringUtils.isBlank(codeRuleProduceDTO.getCodeRuleOid())
+                && (StringUtils.isBlank(codeRuleProduceDTO.getUseRuleFlag()) || StringUtils.isBlank(codeRuleProduceDTO.getOwnbizBtm()))) {
+            throw new VciBaseException("缂栫爜瑙勫垯涓婚敭鍜岀紪鍙蜂负绌猴紝鏃犳硶鐢熸垚缂栫爜");
+        }
+        OsCodeRuleDO ruleDO = getRuleByDTO(codeRuleProduceDTO);
+        List<OsCodeRuleElementDO> ruleItemDOs = listItemsByRuleOidOrderByRuleOrderNubmer(ruleDO.getOid());
+        VciBaseUtil.alertNotNull(ruleItemDOs,"瑙勫垯鐨勬槑缁�");
+        //鏌ヨ鐢熸垚缂栫爜鐨勬暟鎹�
+        Map<String, Object> businessDataMap = codeRuleProduceDTO.getOwnbizDataMap();
+        //姣忎竴涓厓绱犱骇鐢熺殑鍐呭
+        List<String> tempCode = new ArrayList<String>();
+        //娴佹按鍙风殑鍏冪礌
+        Map<Integer, OsCodeRuleElementDO> serialItemMap = new HashMap<Integer, OsCodeRuleElementDO>();
+        Map<Integer, String> serialAccordingMap = new HashMap<Integer, String>();
+
+        wrapperRuleElement(ruleItemDOs,codeRuleProduceDTO,tempCode,businessDataMap,serialItemMap,serialAccordingMap);
+
+        if (!CollectionUtils.isEmpty(serialItemMap)) {
+            //鐢熸垚涓�鏉℃祦姘村彿
+            wrapperSerial(serialItemMap, serialAccordingMap, tempCode, ruleDO.getBreakReUseFlag());
+        }
+
+        String resultCode = "";
+        for (String code : tempCode) {
+            resultCode += code;
+        }
+        return resultCode;
+    }
+
+    /**
+     * 灏佽鍝嶅簲鐨勫唴瀹�
+     * @param ruleItemDOs 瑙勫垯鐨勬槑缁�
+     * @param codeRuleProduceDTO 鍒涘缓缂栫爜鐨勬暟鎹紶杈撳璞�
+     * @param tempCode 涓存椂鐨勭爜娈靛唴瀹�
+     * @param businessDataMap 涓氬姟鏁版嵁鐨勬槧灏�
+     * @param serialItemMap 搴忓垪鍙风殑鏄庣粏
+     * @param serialAccordingMap 娴佹按渚濇嵁鐨勫唴瀹�
+     */
+    private void wrapperRuleElement(List<OsCodeRuleElementDO> ruleItemDOs,OsCodeRuleProduceDTO codeRuleProduceDTO,
+                                    List<String> tempCode,Map<String, Object> businessDataMap, Map<Integer, OsCodeRuleElementDO> serialItemMap, Map<Integer, String> serialAccordingMap){
+        for (int i = 0; i < ruleItemDOs.size(); i++) {
+            OsCodeRuleElementDO item = ruleItemDOs.get(i);
+            OsCodeElementTypeEnum elementTypeEnum = OsCodeElementTypeEnum.forValue(item.getCodeElementType());
+            switch (elementTypeEnum) {
+                case INPUT:
+                    if (CollectionUtils.isEmpty(codeRuleProduceDTO.getInputValueMap()) && !codeRuleProduceDTO.getInputValueMap().containsKey(item.getId())) {
+                        throw new VciBaseException("鎵嬪姩杈撳叆鐨勫��");
+                    }
+                    String inputValue = codeRuleProduceDTO.getInputValueMap().get(item.getId());
+                    if (inputValue.trim().length() < item.getMinLength()
+                            && OsCodeFillTypeEnum.NONE.getValue().equalsIgnoreCase(item.getCodeFillType())) {
+                        throw new VciBaseException("銆恵0}銆戣緭鍏ョ殑鍐呭闀垮害灏忎簬浜唟1},瀹為檯涓簕2}", new String[]{item.getName(), item.getMinLength() + "", inputValue.length() + ""});
+                    }
+                    tempCode.add(i, fillCode(item, inputValue));
+                    break;
+                case STATIC:
+                    tempCode.add(i, item.getStaticCode() == null ? "" : item.getStaticCode());
+                    break;
+                case DATE:
+                    Date date = null;
+                    OsCodeDateValueTypeEnum codeDateValueTypeEnum = OsCodeDateValueTypeEnum.forValue(item.getCodeDateValueType());
+                    switch (codeDateValueTypeEnum) {
+                        case BUSINESS:
+                            if (CollectionUtils.isEmpty(businessDataMap) || !businessDataMap.containsKey(item.getCodeDateUseField())) {
+                                throw new VciBaseException("[{0}]闇�瑕佷笟鍔℃暟鎹腑鐨勬椂闂村睘鎬э紝浣嗘槸鏈煡璇㈠埌涓氬姟鏁版嵁鐨勪俊鎭�", new String[]{item.getName()});
+                            }
+                            try {
+                                date = VciDateUtil.str2Date(businessDataMap.get(item.getCodeDateUseField()).toString(), VciDateUtil.DateTimeMillFormat);
+                            } catch (Exception e) {
+                                throw new VciBaseException(LangBaseUtil.getErrorMsg(e), new String[0], e);
+                            }
+                        default:
+                            date = new Date();
+                            break;
+                    }
+                    tempCode.add(i, VciDateUtil.date2Str(date, item.getCodeDateFormat()));
+                    break;
+                case FIELD:
+                    if (CollectionUtils.isEmpty(businessDataMap) || !businessDataMap.containsKey(item.getCodeUseField())) {
+                        throw new VciBaseException("[{0}]闇�瑕佷笟鍔℃暟鎹腑鐨勫睘鎬т俊鎭紝浣嗘槸鏈煡璇㈠埌涓氬姟鏁版嵁鐨勪俊鎭�", new String[]{item.getName()});
+                    }
+                    String fieldValue = businessDataMap.get(item.getCodeUseField()).toString();
+                    tempCode.add(i, fillCode(item, fieldValue));
+                    break;
+                case ENUM:
+                    VciBaseUtil.alertNotNull(item.getCodeUseField(), "浣跨敤涓氬姟鏁版嵁鐨勫睘鎬у悕绉�");
+                    if (CollectionUtils.isEmpty(businessDataMap) || !businessDataMap.containsKey(item.getCodeUseField())) {
+                        throw new VciBaseException("[{0}]闇�瑕佷笟鍔℃暟鎹腑鐨勫睘鎬т俊鎭紝浣嗘槸鏈煡璇㈠埌涓氬姟鏁版嵁鐨勪俊鎭�", new String[]{item.getName()});
+                    }
+                    String enumValue = businessDataMap.get(item.getCodeUseField()).toString();
+                    if (StringUtils.isBlank(enumValue)) {
+                        enumValue = EMPTY;
+                    }
+                    String enumMapValue = codeEnumDao.selectMapValueByRuleOidAndValue(item.getOid(), enumValue);
+                    if (EMPTY.equalsIgnoreCase(enumMapValue)) {
+                        enumMapValue = "";
+                    }
+                    tempCode.add(i, fillCode(item, enumMapValue));
+                    break;
+                case EXPRESSION:
+                    VciBaseUtil.alertNotNull(item.getCodeExpression(), "鍏紡琛ㄨ揪寮�");
+                    String expressionValue = "";
+                    //TODO 绛夊緟娣诲姞鍏紡鐨勫唴瀹�
+                    tempCode.add(i, fillCode(item, expressionValue));
+                    break;
+                case SERIAL:
+                    // 娴佹按鍙�
+                    tempCode.add(i, "");
+                    serialItemMap.put(i, item);
+                default:
+                    //闃叉鍚庨潰鍔犲埆鐨勫唴瀹�
+                    break;
+            }
+            if (BooleanEnum.TRUE.getValue().equalsIgnoreCase(item.getSerialAccording())) {
+                serialAccordingMap.put(i, tempCode.get(i));
+            }
+        }
+    }
+
+
+    /**
+     * 浣跨敤缂栫爜瑙勫垯鐢熸垚缂栫爜
+     *
+     * @param codeRuleProduceDTO 缂栫爜鐢熸垚鎵�灞炴暟鎹紶杈撳璞★紝瑙勫垯缂栧彿浼樺厛绾уぇ浜庝富閿紝浼犻�掔殑鏁版嵁浼樺厛绾уぇ浜庝笟鍔℃暟鎹�
+     * @return 鐢熸垚鐨勭紪鐮佺殑鍊�
+     * @throws VciBaseException 鍙傛暟閿欒锛岃鍒欎笉瀛樺湪锛屾暟鎹笉鏀寔缂栫爜鐨勭敓鎴愮瓑浼氭姏鍑哄紓甯�
+     */
+    @Override
+    public List<OsCodeResultVO> batchProduceCode(OsCodeRuleProduceDTO codeRuleProduceDTO, Integer needAddQuantity) {
+        //鍒ゆ柇瑙勫垯鐨勭紪鍙锋垨鑰呰鍒欑殑涓婚敭
+        VciBaseUtil.alertNotNull(codeRuleProduceDTO, "缂栫爜鐢熸垚鏉ユ簮鏁版嵁");
+        if (StringUtils.isBlank(codeRuleProduceDTO.getCodeRuleId())
+                && StringUtils.isBlank(codeRuleProduceDTO.getCodeRuleOid())
+                && (StringUtils.isBlank(codeRuleProduceDTO.getUseRuleFlag()) || StringUtils.isBlank(codeRuleProduceDTO.getOwnbizBtm()))) {
+            throw new VciBaseException("缂栫爜瑙勫垯涓婚敭鍜岀紪鍙蜂负绌猴紝鏃犳硶鐢熸垚缂栫爜");
+        }
+        //鏌ヨ缂栫爜瑙勫垯锛屽拰鐩稿簲鐨勬槑缁嗗唴瀹�
+        OsCodeRuleDO ruleDO =getRuleByDTO(codeRuleProduceDTO);
+        List<OsCodeRuleElementDO> ruleItemDOs = listItemsByRuleOidOrderByRuleOrderNubmer(ruleDO.getOid());
+        VciBaseUtil.alertNotNull(ruleItemDOs,"瑙勫垯鐨勬槑缁�");
+        //鏌ヨ鐢熸垚缂栫爜鐨勬暟鎹�
+        Map<String, Object> businessDataMap = codeRuleProduceDTO.getOwnbizDataMap();
+        //姣忎竴涓厓绱犱骇鐢熺殑鍐呭
+        List<String> tempCode = new ArrayList<String>();
+
+        //鐢ㄦ潵瀛樺偍娴佹按鍙风殑鍏冪礌
+        Map<Integer/**娴佹按鍙锋墍鍦ㄧ殑浣嶇疆**/, OsCodeRuleElementDO> serialItemMap = new HashMap<Integer, OsCodeRuleElementDO>();
+        //鐢ㄦ潵瀛樺偍娴佹按渚濇嵁鐨勫厓绱�
+        Map<Integer/**娴佹按渚濇嵁鍦ㄧ殑浣嶇疆**/, String> serialAccordingMap = new HashMap<Integer, String>();
+
+        wrapperRuleElement(ruleItemDOs,codeRuleProduceDTO,tempCode,businessDataMap,serialItemMap,serialAccordingMap);
+        List<OsCodeResultVO> resultVOList = new ArrayList<OsCodeResultVO>();
+        if (!CollectionUtils.isEmpty(serialItemMap)) {
+            //鐢熸垚澶氭潯娴佹按鍙�
+            Map<Integer/**娴佹按鍙锋墍鍦ㄧ殑浣嶇疆**/, OsCodeSerialBuildBO> serialReturnMap = batchWrapperSerial(serialItemMap, serialAccordingMap,  ruleDO.getBreakReUseFlag(), needAddQuantity);
+            for (Integer i = 0; i < needAddQuantity; i++) {
+                OsCodeResultVO resultVO = new OsCodeResultVO();
+                List<String> codeCopy = new ArrayList<String>(tempCode);
+                OsCodeSerialBuildBO serialBuildBO= null;
+                for(Integer serialIndex : serialReturnMap.keySet()){
+                    serialBuildBO = serialReturnMap.get(serialIndex);
+                    if(!CollectionUtils.isEmpty(serialBuildBO.getSerialCodeList()) && serialBuildBO.getSerialCodeList().size()>i){
+                        codeCopy.set(serialIndex,serialBuildBO.getSerialCodeList().get(i));
+                    }
+                }
+                resultVO.setSerialNo(serialBuildBO.getSerialNoList().get(i));
+                resultVO.setSerialCode(serialBuildBO.getSerialCodeList().get(i));
+                resultVO.setSerialUnit(serialBuildBO.getSerialUnit());
+                StringBuilder sb = new StringBuilder();
+                for(int j = 0 ; j < codeCopy.size(); j++){
+                    String s = codeCopy.get(j);
+                    if(s == null){
+                        s = "";
+                    }
+                    sb.append(s);
+                }
+                resultVO.setCode(sb.toString());
+                resultVOList.add(resultVO);
+            }
+
+        }
+        return resultVOList;
+    }
+
+
+    /**
+     * 浣跨敤瑙勫垯涓婚敭鑾峰彇鏄庣粏锛屽苟涓旀寜鐓ф帓搴忓彿杩涜鎺掑簭
+     * @param ruleOid 瑙勫垯鐨勪富閿�
+     * @return 鍏冪礌鐨勫唴瀹�
+     */
+    private List<OsCodeRuleElementDO> listItemsByRuleOidOrderByRuleOrderNubmer(String ruleOid) {
+        VciBaseUtil.alertNotNull(ruleOid, "瑙勫垯鐨勪富閿�");
+        List<OsCodeRuleElementDO> codeRuleElementDOS = codeRuleElementDao.selectByRuleOidOrderByRuleOrderNumber(ruleOid.trim());
+        return codeRuleElementDOS;
+    }
+
+    /**
+     * 鏄惁瀛樺湪缂栫爜瑙勫垯
+     *
+     * @param codeRuleProduceDTO 缂栫爜鐢熸垚鎵�灞炴暟鎹紶杈撳璞★紝瑙勫垯缂栧彿浼樺厛绾уぇ浜庝富閿紝浼犻�掔殑鏁版嵁浼樺厛绾уぇ浜庝笟鍔℃暟鎹�
+     * @return 鏄惁鍖呭惈
+     */
+    @Override
+    public boolean existRule(OsCodeRuleProduceDTO codeRuleProduceDTO) {
+        VciBaseUtil.alertNotNull(codeRuleProduceDTO, "缂栫爜鐢熸垚鏉ユ簮鏁版嵁");
+        if (StringUtils.isBlank(codeRuleProduceDTO.getCodeRuleId())
+                && StringUtils.isBlank(codeRuleProduceDTO.getCodeRuleOid())
+                && (StringUtils.isBlank(codeRuleProduceDTO.getUseRuleFlag()) || StringUtils.isBlank(codeRuleProduceDTO.getOwnbizBtm()))) {
+            throw new VciBaseException("缂栫爜瑙勫垯涓婚敭鍜岀紪鍙蜂负绌猴紝鏃犳硶鐢熸垚缂栫爜");
+        }
+        //鏌ヨ缂栫爜瑙勫垯锛屽拰鐩稿簲鐨勬槑缁嗗唴瀹�
+        try {
+            OsCodeRuleDO ruleDO = getRuleByDTO(codeRuleProduceDTO);
+            return ruleDO!=null&&StringUtils.isNotBlank(ruleDO.getOid());
+        }catch (Throwable e){
+            return  false;
+        }
+    }
+
+    /**
+     * 涓婄Щ
+     *
+     * @param codeRuleElementOid 鍏冪礌鐨勪富閿�
+     */
+    @Override
+    public void upIndex(String codeRuleElementOid) {
+        VciBaseUtil.alertNotNull(codeRuleElementOid,"鍏冪礌鐨勪富閿�");
+        OsCodeRuleElementDO elementDO = codeRuleElementDao.selectByPrimaryKey(codeRuleElementOid);
+        if(elementDO == null || StringUtils.isBlank(elementDO.getOid())){
+            throw new VciBaseException(DATA_OID_NOT_EXIST,new String[]{codeRuleElementOid});
+        }
+        //鏌ヨ姣斿畠灏忎竴涓殑
+        if(elementDO.getRuleOrderNumber() ==0){
+            return;//宸茬粡鍒板ご浜�
+        }
+        List<OsCodeRuleElementDO> lastElementDOList = codeRuleElementDao.selectByRuleOidAndIndex(elementDO.getPkCodeRule(),elementDO.getRuleOrderNumber()-1);
+        if(!CollectionUtils.isEmpty(lastElementDOList)){
+            OsCodeRuleElementDO elementDO1 = lastElementDOList.get(0);
+            Integer index = elementDO1.getRuleOrderNumber();
+            elementDO1.setRuleOrderNumber(elementDO.getRuleOrderNumber());
+            elementDO.setRuleOrderNumber(index);
+            codeRuleElementDao.updateByPrimaryKey(elementDO1);
+            codeRuleElementDao.updateByPrimaryKey(elementDO);
+        }
+    }
+
+    /**
+     * 涓嬬Щ
+     *
+     * @param codeRuleElementOid 鍏冪礌鐨勪富閿�
+     */
+    @Override
+    public void downIndex(String codeRuleElementOid) {
+        VciBaseUtil.alertNotNull(codeRuleElementOid,"鍏冪礌鐨勪富閿�");
+        OsCodeRuleElementDO elementDO = codeRuleElementDao.selectByPrimaryKey(codeRuleElementOid);
+        if(elementDO == null || StringUtils.isBlank(elementDO.getOid())){
+            throw new VciBaseException(DATA_OID_NOT_EXIST,new String[]{codeRuleElementOid});
+        }
+        List<OsCodeRuleElementDO> lastElementDOList = codeRuleElementDao.selectByRuleOidAndIndex(elementDO.getPkCodeRule(),elementDO.getRuleOrderNumber()+1);
+        if(!CollectionUtils.isEmpty(lastElementDOList)){
+            OsCodeRuleElementDO elementDO1 = lastElementDOList.get(0);
+            Integer index = elementDO1.getRuleOrderNumber();
+            elementDO1.setRuleOrderNumber(elementDO.getRuleOrderNumber());
+            elementDO.setRuleOrderNumber(index);
+            codeRuleElementDao.updateByPrimaryKey(elementDO1);
+            codeRuleElementDao.updateByPrimaryKey(elementDO);
+        }
+    }
+
+    /**
+     * 鑾峰彇娴佺▼渚濇嵁
+     *
+     * @param ruleDTO 鍒涘缓鍐呭鐨勬暟鎹紶杈撳璞�
+     * @return 娴佹按渚濇嵁
+     */
+    @Override
+    public String getSerialUnit(OsCodeRuleProduceDTO ruleDTO) {
+        //鍒ゆ柇瑙勫垯鐨勭紪鍙锋垨鑰呰鍒欑殑涓婚敭
+        VciBaseUtil.alertNotNull(ruleDTO, "缂栫爜鐢熸垚鏉ユ簮鏁版嵁");
+        if (StringUtils.isBlank(ruleDTO.getCodeRuleId())
+                && StringUtils.isBlank(ruleDTO.getCodeRuleOid())
+                && (StringUtils.isBlank(ruleDTO.getUseRuleFlag()) || StringUtils.isBlank(ruleDTO.getOwnbizBtm()))) {
+            throw new VciBaseException("缂栫爜瑙勫垯涓婚敭鍜岀紪鍙蜂负绌猴紝鏃犳硶鐢熸垚缂栫爜");
+        }
+        //鏌ヨ缂栫爜瑙勫垯锛屽拰鐩稿簲鐨勬槑缁嗗唴瀹�
+        OsCodeRuleDO ruleDO =getRuleByDTO(ruleDTO);
+        List<OsCodeRuleElementDO> ruleItemDOs = listItemsByRuleOidOrderByRuleOrderNubmer(ruleDO.getOid());
+        VciBaseUtil.alertNotNull(ruleItemDOs,"瑙勫垯鐨勬槑缁�");
+        //鏌ヨ鐢熸垚缂栫爜鐨勬暟鎹�
+        Map<String, Object> businessDataMap = ruleDTO.getOwnbizDataMap();
+        //姣忎竴涓厓绱犱骇鐢熺殑鍐呭
+        List<String> tempCode = new ArrayList<String>();
+
+        //鐢ㄦ潵瀛樺偍娴佹按鍙风殑鍏冪礌
+        Map<Integer/**娴佹按鍙锋墍鍦ㄧ殑浣嶇疆**/, OsCodeRuleElementDO> serialItemMap = new HashMap<Integer, OsCodeRuleElementDO>();
+        //鐢ㄦ潵瀛樺偍娴佹按渚濇嵁鐨勫厓绱�
+        Map<Integer/**娴佹按渚濇嵁鍦ㄧ殑浣嶇疆**/, String> serialAccordingMap = new HashMap<Integer, String>();
+
+        wrapperRuleElement(ruleItemDOs,ruleDTO,tempCode,businessDataMap,serialItemMap,serialAccordingMap);
+
+        String serialAccordingString = "";
+        for (String value : serialAccordingMap.values()) {
+            serialAccordingString += value;
+        }
+        if (StringUtils.isBlank(serialAccordingString)) {
+            serialAccordingString = EMPTY_SERIAL_ACCORDING;
+        }
+        return serialAccordingString;
+    }
+
+    /**
+     * 娴佹按鍙风敓鎴�
+     *
+     * @param serialItemMap      闇�瑕佺敓鎴愭祦姘村彿鐨勫厓绱�
+     * @param serialAccordingMap 娴佹按渚濇嵁鐨勫厓绱犳槧灏�
+     * @param breakReUseFlag     鏄惁琛ョ爜
+     * @param needAddQuantity    鐢熸垚缂栫爜鏉℃暟
+     * @throws VciBaseException 鎵ц鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    private synchronized Map<Integer/**娴佹按鍙峰湪鐨勪綅缃�**/, OsCodeSerialBuildBO>  batchWrapperSerial(Map<Integer/**娴佹按鍙峰湪鐨勪綅缃�**/, OsCodeRuleElementDO> serialItemMap, Map<Integer, String> serialAccordingMap, String breakReUseFlag, Integer needAddQuantity) {
+        String serialAccordingString = "";
+        Map<Integer,OsCodeSerialBuildBO> returnMap = new HashMap<Integer, OsCodeSerialBuildBO>();
+        for (String value : serialAccordingMap.values()) {
+            serialAccordingString += value;
+        }
+        if (StringUtils.isBlank(serialAccordingString)) {
+            serialAccordingString = EMPTY_SERIAL_ACCORDING;
+        }
+        String finalSerialAccordingString = serialAccordingString;
+        //閬嶅巻鐢熸垚瀵瑰簲浣嶇疆鐨勬祦姘村彿鍏冪礌
+        Set<Integer> keySet = serialItemMap.keySet();
+        for (Integer tempIndex : keySet) {
+            OsCodeRuleElementDO item = serialItemMap.get(tempIndex);
+            String serialValue = "";
+            if (BooleanEnum.TRUE.getValue().equalsIgnoreCase(breakReUseFlag)) {
+                //璇存槑鏄敮鎸佹柇鐮佹潵琛ョ殑
+                OsCodeBreakCodeDO codeBreakCodeDO = breakCodeDao.selectByAccordingAndRuleOid(item.getPkCodeRule(), finalSerialAccordingString);
+                if (codeBreakCodeDO != null || StringUtils.isBlank(codeBreakCodeDO.getOid())) {
+                    serialValue = codeBreakCodeDO.getBreakSerial() + "";
+                }
+            }
+            boolean persistence = WebUtil.isPersistence();
+            WebUtil.setPersistence(true);
+            if (StringUtils.isBlank(serialValue)) {
+                //鎵捐繖涓鍒欙紝褰撳墠娴佹按鍙蜂笅鐨勫唴瀹�
+                OsCodeSerialNumberDO serialNumberDO = serialNumberDao.selectByAccordingAndRuleOid(item.getPkCodeRule(), finalSerialAccordingString);
+                if (serialNumberDO == null || StringUtils.isBlank(serialNumberDO.getOid())) {
+                    //璇存槑鏄涓�涓紝闇�瑕佹坊鍔�
+                    serialNumberDO = new OsCodeSerialNumberDO();
+                    serialNumberDO.setPkCodeRule(item.getPkCodeRule());
+                    serialNumberDO.setSerialUnit(finalSerialAccordingString);
+                    serialNumberDO.setMaxSerial(VciBaseUtil.getInt(item.getSerialStart()) + item.getSerialStep() * needAddQuantity);
+                    serialNumberDao.insert(serialNumberDO);
+                    serialValue = item.getSerialStart();
+                } else {
+                    //涓嶆槸绗竴涓紝鍒欓噸鏂拌绠楄捣濮嬪�煎拰鏈�澶у��
+                    serialValue = String.valueOf(serialNumberDO.getMaxSerial());
+                    serialNumberDO.setMaxSerial(serialNumberDO.getMaxSerial() + item.getSerialStep() * needAddQuantity);
+                    serialNumberDao.updateByPrimaryKey(serialNumberDO);
+                }
+            }
+            WebUtil.setPersistence(persistence);
+            OsCodeSerialBuildBO serialBuildBO = new OsCodeSerialBuildBO();
+            serialBuildBO.setSerialUnit(serialAccordingString);
+            serialBuildBO.setSerialNoList(new ArrayList<String>());
+            serialBuildBO.setSerialCodeList(new ArrayList<String>());
+            for (Integer i = 0; i < needAddQuantity; i++) {
+                String serialNo = String.valueOf(Integer.parseInt(serialValue) + i * item.getSerialStep());
+                serialBuildBO.getSerialNoList().add(serialNo);
+                serialBuildBO.getSerialCodeList().add(fillCode(item,serialNo));
+            }
+            /* TODO 鏆傛椂鍙栨秷,杩欎釜鍦版柟鑰佸嚭闂锛岄渶瑕佸啀鐮旂┒閫昏緫銆�
+            if (serialAccordingMap.containsKey(tempIndex) || serialAccordingMap.size() == 0) {
+                returnMap.put(tempIndex,serialBuildBO);
+            }*/
+            returnMap.put(tempIndex,serialBuildBO);
+        }
+        return returnMap;
+    }
+
+    /**
+     * 鍒楄〃鏌ヨ
+     *
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param pageHelper   鍒嗛〉鐨勫璞�
+     * @return 鏁版嵁鏄剧ず瀵硅薄
+     */
+    @Override
+    public DataGrid<OsCodeRuleVO> dataGrid(Map<String, String> conditionMap, PageHelper pageHelper) {
+        if (pageHelper == null) {
+            pageHelper = new PageHelper(-1);
+        }
+        List<OsCodeRuleDO> ruleDOS = codeRuleDao.selectByWrapper(conditionMap, pageHelper);
+        DataGrid<OsCodeRuleVO> dataGrid = new DataGrid<OsCodeRuleVO>();
+        if (!CollectionUtils.isEmpty(ruleDOS)) {
+            dataGrid.setData(codeRuleDO2VOs(ruleDOS));
+            dataGrid.setTotal(VciBaseUtil.getInt(codeRuleDao.countByWrapper(conditionMap)));
+        }
+        return dataGrid;
+    }
+
+    /**
+     * 鏁版嵁瀵硅薄鎵归噺杞崲涓烘樉绀哄璞�
+     *
+     * @param ruleDOCollection 瑙勫垯鐨勬暟鎹璞�
+     * @return 瑙勫垯鐨勬樉绀哄璞�
+     */
+    @Override
+    public List<OsCodeRuleVO> codeRuleDO2VOs(Collection<OsCodeRuleDO> ruleDOCollection) {
+        List<OsCodeRuleVO> ruleVOS = new ArrayList<OsCodeRuleVO>();
+        if (ruleDOCollection != null) {
+            for (OsCodeRuleDO ruleDO : ruleDOCollection) {
+                OsCodeRuleVO vo = codeRuleDO2VO(ruleDO);
+                if (vo != null) {
+                    ruleVOS.add(vo);
+                }
+            }
+        }
+        return ruleVOS;
+    }
+
+    /**
+     * 瑙勫垯鐨勫厓绱犵殑鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+     *
+     * @param elementDOCollection 鍏冪礌鐨勬暟鎹璞�
+     * @return 鍏冪礌鐨勬樉绀哄璞�
+     */
+    @Override
+    public List<OsCodeRuleElementVO> codeRuleElementDO2VOs(Collection<OsCodeRuleElementDO> elementDOCollection) {
+        List<OsCodeRuleElementVO> ruleElementVOS = new ArrayList<OsCodeRuleElementVO>();
+        if (elementDOCollection != null) {
+            List<String> oidList = new ArrayList<String>();
+            for (OsCodeRuleElementDO elementDO : elementDOCollection) {
+                OsCodeRuleElementVO vo = codeRuleElementDO2VO(elementDO);
+                if (vo != null) {
+                    ruleElementVOS.add(vo);
+                    oidList.add(vo.getOid());
+                }
+            }
+            List<OsCodeEnumDO> existEnumDOs = codeEnumDao.selectByElementOidCollection(oidList);
+            Map<String,List<OsCodeEnumVO>> enumVOMap = new HashMap<String, List<OsCodeEnumVO>>();
+            for(OsCodeEnumDO enumDO : existEnumDOs){
+                OsCodeEnumVO enumVO = new OsCodeEnumVO();
+                BeanUtil.convert(enumDO,enumVO);
+                String pkCodeRuleElement = enumVO.getPkCodeRuleElement();
+                List<OsCodeEnumVO> enumVOS = enumVOMap.containsKey(pkCodeRuleElement) ? enumVOMap.get(pkCodeRuleElement) : new ArrayList<OsCodeEnumVO>();
+                enumVOS.add(enumVO);
+                enumVOMap.put(pkCodeRuleElement, enumVOS);
+            }
+            for(OsCodeRuleElementVO elementVO : ruleElementVOS){
+                elementVO.setEnumMapList(enumVOMap.get(elementVO.getOid()));
+            }
+        }
+        return ruleElementVOS;
+    }
+
+    /**
+     * 鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+     *
+     * @param ruleDO 瑙勫垯鐨勬暟鎹璞�
+     * @return 瑙勫垯鐨勬樉绀哄璞�
+     */
+    @Override
+    public OsCodeRuleVO codeRuleDO2VO(OsCodeRuleDO ruleDO) {
+        OsCodeRuleVO ruleVO = new OsCodeRuleVO();
+        if (ruleDO != null) {
+            BeanUtil.convert(ruleDO, ruleVO);
+            ruleVO.setLcStatusText(FrameworkDataLCStatus.getTextByValue(ruleVO.getLcStatus()));
+            ruleVO.setCodeProductTypeText(OsCodeProductTypeEnum.getTextByValue(ruleVO.getCodeProductType()));
+        }
+        return ruleVO;
+    }
+
+
+    /**
+     * 鏄庣粏鐨勬暟鎹璞¤浆鎹负鏄剧ず瀵硅薄
+     *
+     * @param elementDO 鏄庣粏鐨勬暟鎹璞�
+     * @return 鏄剧ず瀵硅薄
+     */
+    @Override
+    public OsCodeRuleElementVO codeRuleElementDO2VO(OsCodeRuleElementDO elementDO) {
+        OsCodeRuleElementVO elementVO = new OsCodeRuleElementVO();
+        if (elementDO != null) {
+            BeanUtil.convert(elementDO, elementVO);
+            elementVO.setCodeElementTypeText(OsCodeElementTypeEnum.getTextByValue(elementVO.getCodeElementType()));
+            elementVO.setCodeFillTypeText(OsCodeFillTypeEnum.getTextByValue(elementVO.getCodeFillType()));
+            elementVO.setCodeDateValueTypeText(OsCodeDateValueTypeEnum.getTextByValue(elementVO.getCodeDateValueType()));
+
+        }
+        return elementVO;
+    }
+
+    /**
+     * 鍒楄〃鐨勬槑缁嗘煡璇�
+     *
+     * @param pkRule       瑙勫垯鐨勪富閿�
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param pageHelper   鍒嗛〉鐨勫璞�
+     * @return 鏁版嵁鏄剧ず瀵硅薄
+     */
+    @Override
+    public DataGrid<OsCodeRuleElementVO> dataGridElement(String pkRule, Map<String, String> conditionMap, PageHelper pageHelper) {
+        if (pageHelper == null) {
+            pageHelper = new PageHelper(-1);
+        }
+        if (conditionMap == null) {
+            conditionMap = new HashMap<String, String>();
+        }
+        if (StringUtils.isBlank(pkRule)) {
+            return new DataGrid<OsCodeRuleElementVO>();
+        }
+        conditionMap.put("pkCodeRule", pkRule);
+        List<OsCodeRuleElementDO> ruleDOS = codeRuleElementDao.selectByWrapper(conditionMap, pageHelper);
+        DataGrid<OsCodeRuleElementVO> dataGrid = new DataGrid<OsCodeRuleElementVO>();
+        if (!CollectionUtils.isEmpty(ruleDOS)) {
+            dataGrid.setData(codeRuleElementDO2VOs(ruleDOS));
+            dataGrid.setTotal(VciBaseUtil.getInt(codeRuleElementDao.countByWrapper(conditionMap)));
+        }
+        return dataGrid;
+    }
+
+    /**
+     * 娣诲姞瑙勫垯
+     *
+     * @param ruleDTO 瑙勫垯鐨勬暟鎹紶杈撳璞★紝闇�瑕佸皢鏄庣粏涔熶紶閫�
+     * @return 鏄剧ず瀵硅薄
+     */
+    @Override
+    public OsCodeRuleVO addRule(OsCodeRuleDTO ruleDTO) {
+        VciBaseUtil.alertNotNull(ruleDTO, "鏁版嵁浼犺緭瀵硅薄", ruleDTO.getElements(), "瑙勫垯鐨勫厓绱�");
+        OsCodeRuleDO ruleDO = new OsCodeRuleDO();
+        BeanUtil.convert(ruleDTO, ruleDO);
+        ruleDO.setOid(VciBaseUtil.getPk());
+        List<OsCodeRuleElementDO> elementDOS = new ArrayList<OsCodeRuleElementDO>();
+        List<OsCodeEnumDO> enumMapDOs = new ArrayList<OsCodeEnumDO>();
+        wrapperElementDOs(ruleDO.getOid(), ruleDTO.getElements(),elementDOS,enumMapDOs);
+
+        //杩欎釜涓嶅彲鑳借秴杩�1000涓�
+        codeRuleElementDao.batchInsert(elementDOS);
+        if(!CollectionUtils.isEmpty(enumMapDOs)){
+            codeEnumDao.batchInsert(enumMapDOs);
+        }
+        codeRuleDao.insert(ruleDO);
+        return codeRuleDO2VO(ruleDO);
+    }
+
+    /**
+     * 灏佽鍏冪礌鐨勫璞�
+     *
+     * @param pkRule      瑙勫垯鐨勪富閿�
+     * @param elementDTOS 鍏冪礌鐨勬暟鎹紶杈撳璞�
+     * @return 鍏冪礌鐨勬暟鎹璞�
+     */
+    private List<OsCodeRuleElementDO> wrapperElementDOs(String pkRule, List<OsCodeRuleElementDTO> elementDTOS, List<OsCodeRuleElementDO> elementDOS, List<OsCodeEnumDO> enumMapDOs) {
+        if (elementDTOS != null) {
+            for (OsCodeRuleElementDTO elementDTO : elementDTOS) {
+                OsCodeRuleElementDO elementDO = new OsCodeRuleElementDO();
+                BeanUtil.convert(elementDTO, elementDO);
+                elementDO.setPkCodeRule(pkRule);
+                elementDO.setOid(VciBaseUtil.getPk());
+                //闇�瑕佹瘡涓被鍨嬪仛澶勭悊
+                VciBaseUtil.alertNotNull(elementDO.getCodeElementType(), "鍏冪礌绫诲瀷");
+                OsCodeElementTypeEnum elementEn = OsCodeElementTypeEnum.forValue(elementDO.getCodeElementType());
+                if (elementEn == null) {
+                    throw new VciBaseException("鍏冪礌鐨勭被鍨嬩笉绗﹀悎瑕佹眰");
+                }
+                switch (elementEn) {
+                    case INPUT:
+                        //娌℃湁浠�涔堥渶瑕佹帶鍒�
+                        break;
+                    case STATIC:
+                        VciBaseUtil.alertNotNull(elementDO.getStaticCode(), "甯搁噺鍊�");
+                        elementDO.setMaxLength(elementDO.getStaticCode().trim().length());
+                        elementDO.setMinLength(elementDO.getStaticCode().trim().length());
+                        elementDO.setCodeFillType(OsCodeFillTypeEnum.NONE.getValue());
+                        elementDO.setCodeFillSeparator("");
+                        break;
+                    case DATE:
+                        VciBaseUtil.alertNotNull(elementDO.getCodeDateFormat(), "鏃ユ湡鏍煎紡", elementDO.getCodeDateValueType(), "鏃ユ湡鐨勫彇鍊肩被鍨� ");
+                        if (OsCodeDateValueTypeEnum.BUSINESS.getValue().endsWith(elementDO.getCodeDateValueType())) {
+                            VciBaseUtil.alertNotNull(elementDO.getCodeDateUseField(), "鏃ユ湡鍊煎搴旂殑灞炴�у悕绉�");
+                        }
+                        break;
+                    case FIELD:
+                    case ENUM:
+                        VciBaseUtil.alertNotNull(elementDO.getCodeUseField(), "鎵�闇�灞炴�у悕绉�",elementDO.getEnumId(),"鏋氫妇鐨勭紪鍙�",elementDTO.getEnumMapList(),"鏋氫妇鐨勬槧灏勫唴瀹�");
+                        //澶勭悊鏋氫妇鐨勫唴瀹�
+                        List<OsCodeEnumDTO> enumMaps = elementDTO.getEnumMapList();
+                        for(OsCodeEnumDTO enumDTO : enumMaps){
+                            VciBaseUtil.alertNotNull(enumDTO.getEnumItemKey(),"鏋氫妇鏄犲皠涓灇涓剧殑鍊�",enumDTO.getCodeMapValue(),"鏋氫妇鏄犲皠鐨勬灇涓惧搴旂殑鏄犲皠鍊�");
+                            OsCodeEnumDO enumDO = new OsCodeEnumDO();
+                            BeanUtil.convert(enumDTO,enumDO);
+                            enumDO.setPkCodeRuleElement(elementDO.getOid());
+                            enumMapDOs.add(enumDO);
+                        }
+                        break;
+                    case EXPRESSION:
+                        VciBaseUtil.alertNotNull(elementDO.getCodeExpression(), "鍏紡琛ㄨ揪寮�");
+                        break;
+                    case SERIAL:
+                        VciBaseUtil.alertNotNull(elementDO.getSerialStart(), "娴佹按璧峰鍊�", elementDO.getSerialStep(), "娴佹按姝ラ暱", elementDO.getSerialPriority(), "娴佹按浼樺厛绾�");
+                        break;
+                }
+                elementDOS.add(elementDO);
+            }
+        }
+        return elementDOS;
+    }
+
+    /**
+     * 淇敼瑙勫垯
+     *
+     * @param ruleDTO 瑙勫垯鐨勬暟鎹紶杈撳璞★紝闇�瑕佸皢鏄庣粏涔熶紶閫�
+     * @return 鏄剧ず瀵硅薄
+     */
+    @Override
+    public OsCodeRuleVO editRule(OsCodeRuleDTO ruleDTO) {
+        VciBaseUtil.alertNotNull(ruleDTO, "鏁版嵁浼犺緭瀵硅薄", ruleDTO.getElements(), "瑙勫垯鐨勫厓绱�", ruleDTO.getOid(), "瑙勫垯鐨勪富閿�");
+        OsCodeRuleDO ruleDO = selectByOid(ruleDTO.getOid());
+        BeanUtil.convert(ruleDTO,ruleDO);
+        List<OsCodeRuleElementDO> existElementDOs = codeRuleElementDao.selectByRuleOid(ruleDO.getOid());
+        //鎵緀num鐨勬槑缁嗗唴瀹癸紝涔熸槸瑕佸垹闄ょ殑
+        List<OsCodeEnumDO> existEnumDOs = codeEnumDao.selectByRuleOid(ruleDO.getOid());
+
+        List<OsCodeRuleElementDO> elementDOS = new ArrayList<OsCodeRuleElementDO>();
+        List<OsCodeEnumDO> enumMapDOs = new ArrayList<OsCodeEnumDO>();
+
+        wrapperElementDOs(ruleDO.getOid(), ruleDTO.getElements(),elementDOS,enumMapDOs);
+
+        if(!CollectionUtils.isEmpty(existElementDOs)) {
+            List<String> existElementOidList = new ArrayList<String>();
+            for(OsCodeRuleElementDO elementDO : existElementDOs){
+                existElementOidList.add(elementDO.getOid());
+            }
+            codeRuleElementDao.batchDeleteByOids(existElementOidList);
+        }
+        if(!CollectionUtils.isEmpty(existEnumDOs)){
+            List<String> existEnumOidList = new ArrayList<String>();
+            for(OsCodeEnumDO enumDO : existEnumDOs){
+                existEnumOidList.add(enumDO.getOid());
+            }
+            codeEnumDao.batchDeleteByOids(existEnumOidList);
+        }
+        //杩欎釜涓嶅彲鑳借秴杩�1000涓�
+        codeRuleElementDao.batchInsert(elementDOS);
+        if(!CollectionUtils.isEmpty(enumMapDOs)){
+            codeEnumDao.batchInsert(enumMapDOs);
+        }
+        codeRuleDao.updateByPrimaryKey(ruleDO);
+        return codeRuleDO2VO(ruleDO);
+    }
+
+    /**
+     * 鍒犻櫎瑙勫垯锛屾湁娴佹按鍙风殑鏃跺�欎笉鑳藉垹闄�
+     *
+     * @param ruleDTO 瑙勫垯鐨勬暟鎹紶杈撳璞★紝蹇呴』鏈塼s鍜宱id
+     */
+    @Override
+    public void deleteRule(OsCodeRuleDTO ruleDTO) {
+        VciBaseUtil.alertNotNull(ruleDTO, "鏁版嵁浼犺緭瀵硅薄");
+        OsCodeRuleDO ruleDO = selectByOid(ruleDTO.getOid());
+        String ruleOid = ruleDO.getOid();
+        if (serialNumberDao.countByRuleOid(ruleOid) > 0) {
+            throw new VciBaseException("缂栫爜瑙勫垯宸茬粡浜х敓浜嗘祦姘村彿锛屼笉鑳藉垹闄�");
+        }
+        codeRuleDao.deleteByPrimaryKey(ruleOid);
+        List<OsCodeRuleElementDO> existElementDOs = codeRuleElementDao.selectByRuleOid(ruleOid);
+        List<OsCodeEnumDO> existEnumDOs = codeEnumDao.selectByRuleOid(ruleDO.getOid());
+        if(!CollectionUtils.isEmpty(existElementDOs)) {
+            List<String> existElementOidList = new ArrayList<String>();
+            for(OsCodeRuleElementDO elementDO : existElementDOs){
+                existElementOidList.add(elementDO.getOid());
+            }
+            codeRuleElementDao.batchDeleteByOids(existElementOidList);
+        }
+        if(!CollectionUtils.isEmpty(existEnumDOs)){
+            List<String> existEnumOidList = new ArrayList<String>();
+            for(OsCodeEnumDO enumDO : existEnumDOs){
+                existEnumOidList.add(enumDO.getOid());
+            }
+            codeEnumDao.batchDeleteByOids(existEnumOidList);
+        }
+    }
+
+    /**
+     * 鍋滅敤瑙勫垯
+     *
+     * @param ruleDTO 瑙勫垯鐨勬暟鎹紶杈撳璞★紝蹇呴』鏈塼s鍜宱id
+     */
+    @Override
+    public void disableRule(OsCodeRuleDTO ruleDTO) {
+        VciBaseUtil.alertNotNull(ruleDTO, "鏁版嵁浼犺緭瀵硅薄");
+        OsCodeRuleDO ruleDO = selectByOid(ruleDTO.getOid());
+        ruleDO.setLcStatus(FrameWorkDefaultValueConstant.FRAMEWORK_DATA_DISABLED);
+        codeRuleDao.updateByPrimaryKey(ruleDO);
+    }
+
+    /**
+     * 鍚敤瑙勫垯
+     *
+     * @param ruleDTO 瑙勫垯鐨勬暟鎹紶杈撳璞★紝蹇呴』鏈塼s鍜宱id
+     */
+    @Override
+    public void enableRule(OsCodeRuleDTO ruleDTO) {
+        VciBaseUtil.alertNotNull(ruleDTO, "鏁版嵁浼犺緭瀵硅薄");
+        OsCodeRuleDO ruleDO = selectByOid(ruleDTO.getOid());
+        ruleDO.setLcStatus(FrameWorkDefaultValueConstant.FRAMEWORK_DATA_ENABLED);
+        codeRuleDao.updateByPrimaryKey(ruleDO);
+    }
+
+    /**
+     * 浣跨敤瑙勫垯鏍囪瘑鏌ヨ
+     *
+     * @param ownbizBtm   涓氬姟绫诲瀷
+     * @param useRuleFlag 瑙勫垯鏍囪瘑
+     * @return 瑙勫垯鐨勫璞�
+     * @throws VciBaseException 鍙傛暟涓虹┖锛岃鍒欎笉瀛樺湪鐨勪細鎶涘嚭寮傚父
+     */
+    private OsCodeRuleDO selectByRuleFlag(String ownbizBtm, String useRuleFlag) throws VciBaseException {
+        VciBaseUtil.alertNotNull(ownbizBtm, "涓氬姟绫诲瀷", useRuleFlag, "浣跨敤鏍囪瘑");
+        OsCodeRuleDO ruleDO = codeRuleDao.selectByRuleFlag(ownbizBtm, useRuleFlag);
+        if (ruleDO == null || StringUtils.isBlank(ruleDO.getOid())) {
+            throw new VciBaseException("{0}涓氬姟绫诲瀷涓笉瀛樺湪{1}鏍囪瘑鐨勭紪鐮佽鍒�", new String[]{ownbizBtm, useRuleFlag});
+        }
+        return ruleDO;
+    }
+
+    /**
+     * 娴佹按鍙风敓鎴�
+     *
+     * @param serialItemMap      闇�瑕佺敓鎴愭祦姘村彿鐨勫厓绱�
+     * @param serialAccordingMap 娴佹按渚濇嵁鐨勫厓绱犳槧灏�
+     * @param tempCode           宸茬粡鐢熸垚鐨勭紪鐮佺殑鍐呭
+     * @param breakReUseFlag     鏄惁琛ョ爜
+     * @throws VciBaseException 鎵ц鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    private synchronized void wrapperSerial(Map<Integer, OsCodeRuleElementDO> serialItemMap, Map<Integer, String> serialAccordingMap, List<String> tempCode, String breakReUseFlag) throws VciBaseException {
+        Map<Integer, OsCodeSerialBuildBO> buildBOMap = batchWrapperSerial(serialItemMap, serialAccordingMap, breakReUseFlag, 1);
+        for(Integer serialIndex : buildBOMap.keySet()){
+            OsCodeSerialBuildBO buildBO = buildBOMap.get(serialIndex);
+            tempCode.set(serialIndex,buildBO.getSerialCodeList().get(0));
+        }
+        //鎵归噺鍜屽崟涓篃寰楃粺涓�锛寃eidy
+    }
+
+    /**
+     * 琛ヤ綅
+     *
+     * @param item     鍏冪礌瀵硅薄
+     * @param tempCode 鐢熸垚鐨勪复鏃剁紪鐮�
+     * @return 琛ヤ綅鍚庣殑瀛楃涓�
+     */
+    private String fillCode(OsCodeRuleElementDO item, String tempCode) {
+        if (tempCode == null) {
+            tempCode = "";
+        }
+        if (tempCode.trim().length() < item.getMaxLength()) {
+            int needFillLength = item.getMaxLength() - tempCode.length();
+            for (int i = 0; i < needFillLength; i++) {
+                String fillSepartor = item.getCodeFillSeparator();
+                if (VciBaseUtil.isNull(fillSepartor)) {
+                    fillSepartor = "0";
+                }
+                OsCodeFillTypeEnum fillTypeEnum = OsCodeFillTypeEnum.forValue(item.getCodeFillType());
+                switch (fillTypeEnum) {
+                    case LEFT:
+                        tempCode = fillSepartor + tempCode;
+                        break;
+                    case RIGHT:
+                        tempCode = tempCode + fillSepartor;
+                        break;
+                    default:
+                        break;
+                }
+            }
+            return tempCode;
+        } else if (tempCode.length() > item.getMaxLength()) {//闀垮害瓒呴暱浜嗚鍑忓幓鎺�
+            tempCode = tempCode.substring(0, item.getMaxLength());
+            return tempCode;
+        } else {
+            return tempCode;
+        }
+    }
+
+    /**
+     * 瑙勫垯鐨勬槑缁�
+     *
+     * @param ruleOid 瑙勫垯鐨勪富閿�
+     * @return 瑙勫垯鐨勬槑缁嗗唴瀹�
+     * @throws VciBaseException 鍙傛暟閿欒浼氭姏鍑哄紓甯�
+     */
+    private List<OsCodeRuleElementDO> listItemsByRuleOid(String ruleOid) throws VciBaseException {
+        VciBaseUtil.alertNotNull(ruleOid, "瑙勫垯鐨勪富閿�");
+        List<OsCodeRuleElementDO> codeRuleElementDOS = codeRuleElementDao.selectByRuleOid(ruleOid.trim());
+        return codeRuleElementDOS;
+    }
+
+    /**
+     * 浣跨敤涓婚敭鑾峰彇缂栫爜瑙勫垯瀵硅薄
+     *
+     * @param oid 涓婚敭
+     * @return 缂栫爜瑙勫垯瀵硅薄
+     * @throws VciBaseException 鍙傛暟閿欒锛岃鍒欎笉瀛樺湪鏃朵細鎶涘嚭寮傚父
+     */
+    private OsCodeRuleDO selectByOid(String oid) throws VciBaseException {
+        VciBaseUtil.alertNotNull(oid, "缂栫爜瑙勫垯涓婚敭");
+        OsCodeRuleDO codeRuleDO = codeRuleDao.selectByPrimaryKey(oid.trim());
+        if (codeRuleDO == null || StringUtils.isBlank(codeRuleDO.getOid())) {
+            throw new VciBaseException(DATA_OID_NOT_EXIST);
+        }
+        return codeRuleDO;
+    }
+
+    /**
+     * 浣跨敤缂栧彿鑾峰彇缂栫爜瑙勫垯瀵硅薄
+     *
+     * @param id 缂栧彿
+     * @return 缂栫爜瑙勫垯瀵硅薄
+     * @throws VciBaseException 鍙傛暟閿欒锛岃鍒欎笉瀛樺湪鏃朵細鎶涘嚭寮傚父
+     */
+    @Override
+    public OsCodeRuleDO selectById(String id) throws VciBaseException {
+        VciBaseUtil.alertNotNull(id, "缂栫爜瑙勫垯缂栧彿");
+        OsCodeRuleDO codeRuleDO = codeRuleDao.selectById(id.trim());
+        if (codeRuleDO == null || StringUtils.isBlank(codeRuleDO.getId())) {
+            throw new VciBaseException(DATA_ID_NOT_EXIST);
+        }
+        return codeRuleDO;
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/OsEnumServiceImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/OsEnumServiceImpl.java
new file mode 100644
index 0000000..093d3de
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/OsEnumServiceImpl.java
@@ -0,0 +1,471 @@
+package com.vci.web.service.impl;
+
+import com.vci.corba.common.VCIError;
+import com.vci.starter.web.annotation.log.VciUnLog;
+import com.vci.starter.web.enumpck.DataSecretEnum;
+import com.vci.starter.web.enumpck.UserSecretEnum;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.starter.web.util.VciDateUtil;
+import com.vci.web.constant.CacheKeyConstant;
+import com.vci.web.constant.EnumIdConstant;
+import com.vci.web.pageModel.*;
+import com.vci.web.service.*;
+import com.vci.web.util.PlatformClientUtil;
+import com.vci.web.util.WebUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.cache.annotation.CachePut;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.util.HtmlUtils;
+import plm.bs.bom.clientobject.ClientBusinessObject;
+import plm.corba.enumManager.EnumChild;
+import plm.corba.enumManager.EnumItem;
+import plm.corba.enumManager.EnumItemFilter;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static com.vci.web.constant.CacheNameConstant.VCI_OBJECT_SERVICE;
+import static com.vci.web.constant.EnumIdConstant.LC_STATUS_SUBFIX;
+
+/**
+ * 鏋氫妇鏈嶅姟--宸茬粡璋冪敤骞冲彴搴曞眰浜嗭紝涓嶅啀鎻愪緵dao灞�
+ * @author weidy@2018-03-06
+ *
+ */
+@Service
+public class OsEnumServiceImpl implements OsEnumServiceI {
+
+	/**
+	 * 骞冲彴璋冪敤瀹㈡埛绔�
+	 */
+	@Autowired
+	private PlatformClientUtil platformClientUtil;
+
+	/**
+	 * 鐢熷懡鍛ㄦ湡
+	 */
+	@Autowired
+	private OsLifeCycleServiceI lifeCycleService;
+
+	/**
+	 * 鐢ㄦ埛鏂板鏁版嵁鐨勬椂鍊欏彲浠ユ煡鐪嬬殑瀵嗙骇
+	 */
+	public static final String MY_DATA_SECRET = "myDataSecret";
+
+	/**
+	 * 涓氬姟鏁版嵁
+	 */
+	@Autowired
+	private WebBoServiceI boService;
+
+	/**
+	 * 鏃ュ織
+	 */
+	private Logger logger = LoggerFactory.getLogger(getClass());
+
+
+	/**
+	 * 鍔犺浇鑷韩
+	 */
+	@Autowired(required = false)
+	@Lazy
+	private OsEnumServiceI self;
+
+
+	/**
+	 * 浣跨敤缂栧彿鑾峰彇鏋氫妇鏄庣粏
+	 * @param enumCode 缂栧彿
+	 * @return 鏄庣粏
+	 * @throws VciBaseException 璋冪敤鏈嶅姟绔嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+	 */
+	private List<OsEnumItemVO> getEnumItemById(String enumCode)  throws VciBaseException{
+		if(StringUtils.isBlank(enumCode)){
+			return  null;
+		}
+		Map<String, OsEnumVO> enumVOMap = self.selectAllEnumMap();
+		if(MY_DATA_SECRET.equalsIgnoreCase(enumCode)){
+			//褰撳墠鐢ㄦ埛
+			OsEnumVO enumVO = enumVOMap.getOrDefault(EnumIdConstant.DATASECRET_ENUMNAME, null);
+			int userSecret = WebUtil.getInt(WebUtil.getCurrentUserSessionInfoNotException().getUserSecret());
+			List<OsEnumItemVO> itemVOS = new ArrayList<>();
+			if(enumVO!=null && !CollectionUtils.isEmpty(enumVO.getItems())){
+				itemVOS = enumVO.getItems().stream().filter(item->WebUtil.getInt(item.getId()) <= userSecret).collect(Collectors.toList());
+			}
+			return itemVOS;
+		}else{
+			return enumVOMap.getOrDefault(enumCode.toLowerCase(),new OsEnumVO()).getItems();
+		}
+	}
+	/**
+	 * 鑾峰彇鏋氫妇鐨勫唴瀹�
+	 * @param enumCode 鏋氫妇鐨勭紪鍙凤紙鑻辨枃鍚嶇О锛�
+	 * @return key鏄嫳鏂囧�硷紝value鏄腑鏂囨枃鏈�
+	 */
+	@Override
+	public List<KeyValue> getEnum(String enumCode) throws VciBaseException {
+		if(StringUtils.isEmpty(enumCode)){
+			return null;
+		}
+		enumCode = HtmlUtils.htmlUnescape(enumCode);
+		if(enumCode.endsWith(LC_STATUS_SUBFIX)){
+			List<OsStatusVO> statusVOS = lifeCycleService.listStatusById(enumCode.replace(LC_STATUS_SUBFIX, ""));
+			if(CollectionUtils.isEmpty(statusVOS)){
+				return new ArrayList<>();
+			}
+			List<KeyValue> keyValueList = new ArrayList<>();
+			statusVOS.stream().forEach(statusVO->{
+				KeyValue kv = new KeyValue();
+				kv.setKey(statusVO.getId());
+				kv.setValue(statusVO.getName());
+				kv.setAttributes(VciBaseUtil.objectToMap(statusVO));
+				keyValueList.add(kv);
+			});
+			return keyValueList;
+		}
+		return enumItem2KV(getEnumItemById(enumCode));
+	}
+
+	/**
+	 * 鑾峰彇鏋氫妇鐨勪腑鏂囨枃鏈�
+	 * @param enumCode 鏋氫妇鐨勭紪鍙凤紙鑻辨枃鍚嶇О锛�
+	 * @param enumKey 鏋氫妇鐨勮嫳鏂囧�硷紝鍖哄垎澶у皬鍐�
+	 */
+	@Override
+	public String getValue(String enumCode, String enumKey) throws VciBaseException {
+		List<KeyValue> allKV = getEnum(enumCode);
+		if(allKV.size()>0){
+			for(KeyValue kv : allKV){
+				if(kv.getKey().equalsIgnoreCase(enumKey)){
+					return kv.getValue();
+				}
+			}
+		}
+		return "";
+	}
+
+
+	/**
+	 * 鑾峰彇鏋氫妇鐨勮嫳鏂囧��
+	 * @param enumCode 鏋氫妇鐨勭紪鍙凤紙鑻辨枃鍚嶇О锛�
+	 * @param enumValue 鏋氫妇鐨勪腑鏂囨枃鏈紝鍖哄垎澶у皬鍐� 
+	 */
+	@Override
+	public String getKey(String enumCode, String enumValue) throws VciBaseException {
+		List<KeyValue> allKV = getEnum(enumCode);
+		if(allKV.size()>0){
+			for(KeyValue kv : allKV){
+				if(kv.getValue().equalsIgnoreCase(enumValue)){
+					return kv.getKey();
+				}
+			}
+		}
+		return "";
+	}
+
+	/**
+	 * 鑾峰彇鏋氫妇鐨勬槧灏�
+	 *
+	 * @param enumCode 鏋氫妇鐨�=缂栧彿
+	 * @return 鏋氫妇鐨勫�兼槧灏�
+	 */
+	@Override
+	public Map<String, String> getEnumValueMap(String enumCode) throws VciBaseException {
+		if(StringUtils.isBlank(enumCode)){
+			return  null;
+		}
+		Map<String, OsEnumVO> enumVOMap = self.selectAllEnumMap();
+		if(MY_DATA_SECRET.equalsIgnoreCase(enumCode)){
+			//褰撳墠鐢ㄦ埛
+			OsEnumVO enumVO = enumVOMap.getOrDefault(EnumIdConstant.DATASECRET_ENUMNAME, null);
+			int userSecret = WebUtil.getInt(WebUtil.getCurrentUserSessionInfoNotException().getUserSecret());
+			Map<String,String> itemVOMap = new HashMap<>();
+			if(enumVO!=null && !CollectionUtils.isEmpty(enumVO.getItemMaps())){
+				enumVO.getItemMaps().forEach((key,value)->{
+					if(WebUtil.getInt(key) <= userSecret){
+						itemVOMap.put(key,value);
+					}
+				});
+			}
+			return itemVOMap;
+		}else{
+			return enumVOMap.getOrDefault(enumCode.toLowerCase(),new OsEnumVO()).getItemMaps();
+		}
+	}
+
+	/**
+	 * 鏌ヨ鎵�鏈夌殑鏋氫妇
+	 *
+	 * @return 鏋氫妇鐨勬樉绀哄璞�
+	 */
+	@Override
+	@VciUnLog
+	public List<OsEnumVO> selectAllEnum() {
+		EnumItemFilter filter = new EnumItemFilter("");
+		//鍚庨潰涓や釜鍙傛暟灞呯劧瀹屽叏娌℃湁浣滅敤
+		try {
+			return enumDO2VOs(Arrays.stream(platformClientUtil.getEnumService().getEmItems(filter,1,1)).collect(Collectors.toList()));
+		} catch (VCIError vciError) {
+			throw WebUtil.getVciBaseException(vciError);
+		}
+	}
+
+	/**
+	 * 鏌ヨ鎵�鏈夌殑鏋氫妇鏄犲皠
+	 *
+	 * @return key鏄灇涓剧殑鑻辨枃鍚嶇О
+	 */
+	@Override
+	@VciUnLog
+	@Cacheable(value = VCI_OBJECT_SERVICE,key = CacheKeyConstant.ALL_ENUM,unless = "#result ==null")
+	public Map<String, OsEnumVO> selectAllEnumMap() {
+		return Optional.ofNullable(self.selectAllEnum()).orElseGet(()->new ArrayList<>()).stream().collect(Collectors.toMap(s->s.getId().toLowerCase(),t->t,(o1,o2)->o1));
+	}
+
+	/**
+	 * 鏋氫妇鐨勬暟鎹璞¤浆鎹负鏄剧ず瀵硅薄
+	 *
+	 * @param enumItems 鏋氫妇鐨勫璞�
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	@Override
+	public List<OsEnumVO> enumDO2VOs(Collection<EnumItem> enumItems) {
+		List<OsEnumVO> enumVOS = new ArrayList<>();
+		Optional.ofNullable(enumItems).orElseGet(()->new ArrayList<>()).stream().forEach(enumItem -> {
+			OsEnumVO enumVO = enumDO2VO(enumItem);
+			enumVOS.add(enumVO);
+		});
+		return enumVOS;
+	}
+
+	/**
+	 * 鏋氫妇鐨勬暟鎹璞¤浆鎹负鏄剧ず瀵硅薄
+	 *
+	 * @param enumItem 鏁版嵁瀵硅薄
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	@Override
+	public OsEnumVO enumDO2VO(EnumItem enumItem) {
+		OsEnumVO enumVO = new OsEnumVO();
+		if(enumItem!=null){
+			enumVO.setOid(enumItem.oid);
+			enumVO.setCreator(enumItem.creator);
+			enumVO.setLastModifier(enumItem.modifier);
+			enumVO.setId(enumItem.name);
+			enumVO.setName(enumItem.label);
+			enumVO.setEnumValueDataType(enumItem.type);
+			enumVO.setLength(enumItem.length);
+
+			try {
+				enumVO.setLastModifyTime(VciDateUtil.str2Date(enumItem.createTime,VciDateUtil.DateTimeFormat));
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+			try {
+				enumVO.setCreateTime(VciDateUtil.str2Date(enumItem.createTime,VciDateUtil.DateTimeFormat));
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+			try {
+				enumVO.setTs(VciDateUtil.str2Date(enumItem.ts,VciDateUtil.DateTimeMillFormat));
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+			List<OsEnumItemVO> itemVOS = new ArrayList<>();
+			Map<String,String> itemVOMap = new HashMap<>();
+			if(enumItem.children!=null && enumItem.children.length > 0){
+				for(int i = 0 ; i < enumItem.children.length ; i ++){
+					OsEnumItemVO enumItemVO = new OsEnumItemVO();
+					EnumChild enumChild = enumItem.children[i];
+					enumItemVO.setId(enumChild.value);
+					enumItemVO.setName(enumChild.name);
+					enumItemVO.setDescription(enumChild.description);
+					itemVOS.add(enumItemVO);
+					itemVOMap.put(enumChild.value,enumChild.name);
+				}
+			}
+			enumVO.setItems(itemVOS);
+			enumVO.setItemMaps(itemVOMap);
+		}
+		return enumVO;
+	}
+
+	/**
+	 * 鏋氫妇鏄庣粏杞崲涓篕V
+	 *
+	 * @param enumItemVO 鏋氫妇鏄庣粏鏄剧ず瀵硅薄
+	 * @return KV
+	 */
+	@Override
+	public List<KeyValue> enumItem2KV(Collection<OsEnumItemVO> enumItemVO) {
+		List<KeyValue> keyValueList = new ArrayList<>();
+		if(!CollectionUtils.isEmpty(enumItemVO)){
+			enumItemVO.forEach(itemVO->{
+				KeyValue keyValue = new KeyValue();
+				keyValue.setKey(itemVO.getId());
+				keyValue.setValue(itemVO.getName());
+				keyValueList.add(keyValue);
+			});
+		}
+		return keyValueList;
+	}
+
+	/**
+	 * 鑾峰彇鏁版嵁鐨勫瘑绾э紝骞朵笖浼氱敤褰撳墠鐢ㄦ埛鐨勫瘑绾у啀鏍¢獙涓�涓�
+	 *
+	 * @param oid     涓婚敭
+	 * @param btmname 涓氬姟绫诲瀷
+	 * @return 鏁版嵁鐨勫瘑绾�
+	 */
+	@Override
+	public List<KeyValue> getDataEnum(String oid, String btmname) {
+		VciBaseUtil.alertNotNull(oid,"涓氬姟鏁版嵁鐨勪富閿�",btmname,"涓氬姟绫诲瀷");
+		ClientBusinessObject cbo = boService.selectCBOByOid(oid, btmname);
+		String secret = cbo.getAttributeValue("secretGrade");
+		//secret = DataSecretEnum.SECRET.getValue() + "";
+		if(StringUtils.isBlank(secret)){
+			return new ArrayList<>();
+		}else{
+			int dataSecret = VciBaseUtil.getInt(secret);
+			List<KeyValue> values = getEnum(EnumIdConstant.DATASECRET_ENUMNAME);
+			Integer userSecret = VciBaseUtil.getCurrentUserSecret();
+			if(userSecret == null || userSecret < UserSecretEnum.NONE.getValue()){
+				userSecret = UserSecretEnum.NONE.getValue();
+			}
+			if(CollectionUtils.isEmpty(values)){
+				return new ArrayList<>();
+			}
+			Integer finalUserSecret = userSecret;
+			return values.stream().filter(s-> {
+				int thisDataSecret = VciBaseUtil.getInt(s.getKey());
+				if(dataSecret >= thisDataSecret && finalUserSecret >=thisDataSecret){
+					return true;
+				}
+				return false;
+			}).collect(Collectors.toList());
+		}
+	}
+
+	/**
+	 * 鎵归噺娣诲姞鍐呭
+	 *
+	 * @param enumItemList 鏋氫妇鐨勫唴瀹�
+	 */
+	@Override
+	public void batchAddEnum(List<EnumItem> enumItemList) {
+		if(!CollectionUtils.isEmpty(enumItemList)){
+			enumItemList.stream().forEach(enumItem -> {
+				try {
+					platformClientUtil.getEnumService().addEmItem(enumItem);
+				} catch (VCIError e) {
+					throw WebUtil.getVciBaseException(e);
+				}
+			});
+		}
+	}
+
+	/**
+	 * 鎵归噺淇敼鍐呭
+	 *
+	 * @param enumItemList 鏋氫妇鐨勫唴瀹�
+	 */
+	@Override
+	public void batchEditEnum(List<EnumItem> enumItemList) {
+		if(!CollectionUtils.isEmpty(enumItemList)){
+			enumItemList.stream().forEach(enumItem -> {
+				try {
+					platformClientUtil.getEnumService().modifyEmItem(enumItem);
+				} catch (VCIError e) {
+					throw WebUtil.getVciBaseException(e);
+				}
+			});
+		}
+	}
+
+	/**
+	 * 浣跨敤缂栧彿鑾峰彇鏋氫妇鐨勫悕绉�
+	 *
+	 * @param id 缂栧彿
+	 * @return 鏋氫妇鐨勪腑鏂囧悕绉�
+	 */
+	@Override
+	public String getNameById(String id) {
+		VciBaseUtil.alertNotNull(id,"鏋氫妇鐨勮嫳鏂囩紪鍙�");
+		Map<String, OsEnumVO> enumVOMap = self.selectAllEnumMap();
+		if(!enumVOMap.containsKey(id.toLowerCase())){
+			throw new VciBaseException("鏋氫妇[{0}]鍦ㄧ郴缁熶腑涓嶅瓨鍦�",new String[]{id});
+		}
+		return enumVOMap.get(id.toLowerCase()).getName();
+	}
+
+	/**
+	 * 浣跨敤鏋氫妇鐨勮嫳鏂囧悕绉伴泦鍚堣幏鍙栧璞�
+	 *
+	 * @param enumIdCollection 鑻辨枃鍚嶇О闆嗗悎锛屼笉鍖哄垎澶у皬鍐�
+	 * @return 鏋氫妇鐨勫璞�
+	 */
+	@Override
+	public List<OsEnumVO> listEnumByIdCollection(Collection<String> enumIdCollection) {
+		Map<String, OsEnumVO> enumVOMap = self.selectAllEnumMap();
+		List<OsEnumVO> enumVOList = new ArrayList<>();
+		enumIdCollection.stream().forEach(enumId->{
+			if(enumVOMap.containsKey(enumId.toLowerCase())){
+				enumVOList.add(enumVOMap.get(enumId.toLowerCase()));
+			}
+		});
+		return enumVOList;
+	}
+
+	/**
+	 * 鍙傜収鏋氫妇鐨勪俊鎭�
+	 *
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @param pageHelper   鍒嗛〉
+	 * @return 鏋氫妇鐨勪俊鎭�
+	 */
+	@Override
+	public DataGrid<OsEnumVO> referDataGrid(Map<String, String> conditionMap, PageHelper pageHelper) {
+		DataGrid<OsEnumVO> dataGrid = queryObjectServiceInfoBySql(conditionMap, pageHelper, "plenum",OsEnumVO.class,null);
+		return dataGrid;
+	}
+
+	/**
+	 * 鏋氫妇閫夐」鍒楄〃
+	 *
+	 * @param pkEnum 鏋氫妇鐨勪富閿�
+	 * @return 鏋氫妇閫夐」
+	 */
+	@Override
+	public DataGrid<OsEnumItemVO> gridEnumItemByOid(String pkEnum) {
+		if(StringUtils.isBlank(pkEnum)){
+			return new DataGrid<>("娌℃湁閫夋嫨鏋氫妇");
+		}
+		//鍏堟煡璇㈠嚭鏉�
+		OsEnumVO enumVO = self.selectAllEnumMap().values().stream().filter(s -> s.getOid().equalsIgnoreCase(pkEnum)).findFirst().orElseGet(() -> new OsEnumVO());
+		DataGrid<OsEnumItemVO> dataGrid = new DataGrid<>();
+		if(enumVO!=null && enumVO.getItems()!=null){
+			dataGrid.setData(enumVO.getItems());
+			dataGrid.setTotal(enumVO.getItems().size());
+		}
+		return dataGrid;
+	}
+
+
+	/**
+	 * 娓呴櫎缂撳瓨
+	 */
+	@Override
+	@CacheEvict(value = VCI_OBJECT_SERVICE,key = CacheKeyConstant.ALL_ENUM)
+	public void clearCache() {
+
+	}
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/OsLifeCycleServiceImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/OsLifeCycleServiceImpl.java
new file mode 100644
index 0000000..c26bb62
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/OsLifeCycleServiceImpl.java
@@ -0,0 +1,637 @@
+package com.vci.web.service.impl;
+
+import com.vci.corba.common.VCIError;
+import com.vci.starter.web.annotation.log.VciUnLog;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.BaseQueryObject;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.starter.web.util.VciDateUtil;
+import com.vci.starter.web.wrapper.VciQueryWrapperForDO;
+import com.vci.web.constant.CacheKeyConstant;
+import com.vci.web.model.OsLifeCycleDO;
+import com.vci.web.model.OsStatusDO;
+import com.vci.web.pageModel.*;
+import com.vci.web.service.OsLifeCycleServiceI;
+import com.vci.web.service.OsLinkTypeServiceI;
+import com.vci.web.service.OsStatusServiceI;
+import com.vci.web.service.WebBoServiceI;
+import com.vci.web.util.PlatformClientUtil;
+import com.vci.web.util.WebUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.tools.ant.taskdefs.condition.Os;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.cache.annotation.CachePut;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import plm.bs.bom.clientobject.ClientBusinessObject;
+import plm.bs.bom.common.BusinessObject;
+import plm.bs.bom.common.BusinessObjectHolder;
+import plm.corba.lifecycle.Bound;
+import plm.corba.lifecycle.LifeCyle;
+import plm.corba.lifecycle.TransitionVO;
+import plm.corba.lifecycle.TransitionVOEvent;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static com.vci.frameworkcore.constant.FrameWorkBusLangCodeConstant.DATA_ID_NOT_EXIST;
+import static com.vci.web.constant.CacheNameConstant.VCI_OBJECT_SERVICE;
+import static com.vci.web.constant.WebLangCodeConstant.LIFE_CYCLE_ROUTER_NULL;
+import static com.vci.web.constant.WebLangCodeConstant.LIFE_CYCLE_TRANS_ERROR;
+
+/**
+ * 鐢熷懡鍛ㄦ湡鏈嶅姟
+ * @author weidy
+ * @date 2021-2-14
+ */
+@Service
+public class OsLifeCycleServiceImpl implements OsLifeCycleServiceI {
+
+	/**
+	 * 骞冲彴瀹㈡埛绔�
+	 */
+	@Autowired
+	private PlatformClientUtil platformClientUtil;
+
+	/**
+	 * 鐘舵�佺殑鏈嶅姟
+	 */
+	@Autowired
+	private OsStatusServiceI statusService;
+
+	/**
+	 * 鍔犺浇鑷韩
+	 */
+	@Autowired(required = false)
+	@Lazy
+	private OsLifeCycleServiceI self;
+
+	/**
+	 * 涓氬姟瀵硅薄鏈嶅姟
+	 */
+	@Autowired
+	private WebBoServiceI boService;
+
+	/**
+	 * 鏃ュ織
+	 */
+	private Logger logger = LoggerFactory.getLogger(getClass());
+
+	/***
+	 * 鑾峰彇鐢熷懡鍛ㄦ湡鐨勭姸鎬佸搴旂殑涓枃鍊�
+	 * @param status 鐘舵��
+	 * @return 鐘舵�佺殑鏄剧ず鍚嶇О
+	 * @throws VciBaseException 涓嶅瓨鍦ㄧ敓鍛藉懆鏈�
+	 */
+	@Override
+	public String getStatusText(String status) throws VciBaseException {
+		return statusService.selectAllStatusMap().getOrDefault(status,new OsStatusVO()).getName();
+	}
+
+	/**
+	 * 璺冭縼鐢熷懡鍛ㄦ湡鐘舵�侊紝娉ㄦ剰璋冪敤姝ゆ柟娉曞氨浼氳鎸佷箙鍖栵紝涓嶅彈浜嬪姟鎺у埗
+	 * @param bo 涓氬姟绫诲瀷鐨勬暟鎹璞�
+	 * @param targetStatus 鐩爣鐨勭敓鍛藉懆鏈熺姸鎬侊紝涓嶅尯鍒嗗ぇ灏�
+	 * @throws VciBaseException 濡傛灉鐩爣鐢熷懡鍛ㄦ湡鍜屽綋鍓嶇敓鍛藉懆鏈熺姸鎬佹病鏈夎繛鎺ョ嚎鏃舵姏鍑哄紓甯�
+	 */
+	@Override
+	public void transStatus(BusinessObject bo, String targetStatus)
+			throws VciBaseException {
+		WebUtil.alertNotNull(bo,"涓氬姟鏁版嵁瀵硅薄",bo.lctId,"鐢熷懡鍛ㄦ湡缂栫爜",bo.lcStatus,"褰撳墠鐢熷懡鍛ㄦ湡鐘舵��",targetStatus,"鐩爣鐢熷懡鍛ㄦ湡鐘舵��");
+		OsLifeCycleLineVO transVO = getTransVO(bo.lctId, bo.lcStatus, targetStatus);
+		if(transVO!=null) {
+			doTransVO(bo, transVO);
+		}else{
+			if(!targetStatus.equalsIgnoreCase(bo.lcStatus)){
+				//鐘舵�佺浉鍚岀殑鏃跺�欍�傦紝涓嶆姏鍑哄紓甯�
+				throw new VciBaseException(LIFE_CYCLE_ROUTER_NULL,new String[]{bo.lcStatus,targetStatus});
+			}
+		}
+	}
+
+	/**
+	 * 鎵归噺璺冭縼鐢熷懡鍛ㄦ湡鐘舵�侊紝杩欎簺鏁版嵁涓殑褰撳墠鐘舵�佸繀椤婚兘鏄竴鏍枫�傛垨鑰呮槸褰撳墠鐘舵�侀兘鍙互杩炴帴鍒扮洰鏍囩姸鎬�
+	 * @param boList 涓氬姟绫诲瀷瀵硅薄鏁版嵁
+	 * @param targetStatus 鐩爣鐘舵�侊紝涓嶅尯鍒嗗ぇ灏忓啓
+	 * @throws VciBaseException 杞崲鐢熷懡鍛ㄦ湡鍑洪敊鐨勬椂鍊欐姏鍑哄紓甯�
+	 */
+	@Override
+	public void transStatus(List<BusinessObject> boList, String targetStatus)
+			throws VciBaseException {
+		WebUtil.alertNotNull(boList,"涓氬姟鏁版嵁瀵硅薄",targetStatus,"鐩爣瀵硅薄");
+		transStatus(boList.toArray(new BusinessObject[0]), targetStatus);
+	}
+
+	/**
+	 * 鎵归噺璺冭縼鐢熷懡鍛ㄦ湡鐘舵�侊紝杩欎簺鏁版嵁涓殑褰撳墠鐘舵�佸繀椤婚兘鏄竴鏍凤紝鎴栬�呮槸褰撳墠鐘舵�侀兘鍙互杩炴帴鍒扮洰鏍囩姸鎬�
+	 * @param bos 涓氬姟绫诲瀷瀵硅薄鏁版嵁
+	 * @param targetStatus  鐩爣鐘舵�侊紝涓嶅尯鍒嗗ぇ灏忓啓
+	 * @throws VciBaseException 杞崲鐢熷懡鍛ㄦ湡鍑洪敊鐨勬椂鍊欐姏鍑哄紓甯�
+	 */
+	@Override
+	public void transStatus(BusinessObject[] bos, String targetStatus)
+			throws VciBaseException {
+		WebUtil.alertNotNull(bos,"涓氬姟鏁版嵁瀵硅薄",targetStatus,"鐩爣瀵硅薄");
+		List<OsLifeCycleLineVO> transVOList = new ArrayList<>();
+		List<BusinessObject> transBOs = new ArrayList<>();
+		for(int i = 0 ; i < bos.length ; i ++){
+			BusinessObject bo = bos[i];
+			WebUtil.alertNotNull(bo,"涓氬姟鏁版嵁瀵硅薄",bo.lctId,"鐢熷懡鍛ㄦ湡缂栫爜",bo.lcStatus,"褰撳墠鐢熷懡鍛ㄦ湡鐘舵��");
+			OsLifeCycleLineVO transVO = getTransVO(bo.lctId, bo.lcStatus, targetStatus);
+			if(transVO!=null){
+				transVOList.add(transVO);
+				transBOs.add(bo);
+			}else{
+				if(!targetStatus.equalsIgnoreCase(bo.lcStatus)){
+					throw new VciBaseException("涓嶅瓨鍦ㄤ粠銆恵0}銆戠姸鎬佸埌銆恵1}銆戠姸鎬佺殑鐢熷懡鍛ㄦ湡杩炴帴绾匡紝璇疯仈绯荤鐞嗗憳杩涜閰嶇疆",new String[]{bo.lcStatus, targetStatus} );
+				}
+			}
+		}
+		if(!CollectionUtils.isEmpty(transBOs)) {
+			batchTransVo(transBOs.toArray(new BusinessObject[0]), transVOList.toArray(new OsLifeCycleLineVO[0]));
+		}
+	}
+
+	/**
+	 * 鎵归噺璺冭縼鐢熷懡鍛ㄦ湡鐘舵�侊紝杩欎簺鏁版嵁涓殑褰撳墠鐘舵�佸繀椤婚兘鏄竴鏍凤紝鎴栬�呮槸褰撳墠鐘舵�侀兘鍙互杩炴帴鍒扮洰鏍囩姸鎬�
+	 * @param cboList 涓氬姟绫诲瀷瀵硅薄鏁版嵁
+	 * @param targetStatus  鐩爣鐘舵�侊紝涓嶅尯鍒嗗ぇ灏忓啓
+	 * @throws VciBaseException 杞崲鐢熷懡鍛ㄦ湡鍑洪敊鐨勬椂鍊欐姏鍑哄紓甯�
+	 */
+	@Override
+	public void transCboStatus(List<ClientBusinessObject> cboList,
+			String targetStatus) throws VciBaseException {
+		WebUtil.alertNotNull(cboList,"涓氬姟鏁版嵁瀵硅薄",targetStatus,"鐩爣瀵硅薄");
+		BusinessObject[] bos = new BusinessObject[cboList.size()];
+		for(int i = 0 ; i < cboList.size() ; i ++){
+			bos[i] = cboList.get(i).getBusinessObject();
+		}
+		transStatus(bos, targetStatus);
+	}
+
+	/**
+	 * 閫氳繃缂栧彿鑾峰彇鐢熷懡鍛ㄦ湡鐘舵�佸璞★紝
+	 *
+	 * @param lctId 鐢熷懡鍛ㄦ湡缂栧彿
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	@Override
+	public OsLifeCycleVO getLifeCycleById(String lctId)  {
+		WebUtil.alertNotNull(lctId,"涓氬姟绫诲瀷缂栧彿");
+		return self.selectAllLifeCycleMap().getOrDefault(lctId,null);
+	}
+
+	/**
+	 * 鐢熷懡鍛ㄦ湡鐨勬暟鎹璞¤浆鎹负鏄剧ず瀵硅薄
+	 * @param lifeCycles 鏁版嵁瀵硅薄
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	@Override
+	public List<OsLifeCycleVO> lifeCycleDO2VOs(Collection<LifeCyle> lifeCycles){
+		List<OsLifeCycleVO> lifeCycleVOS = new ArrayList<>();
+		Optional.ofNullable(lifeCycles).orElseGet(()->new ArrayList<>()).stream().forEach(lifeCyle -> {
+			OsLifeCycleVO lifeCycleVO = lifeCycleDO2VO(lifeCyle);
+			lifeCycleVOS.add(lifeCycleVO);
+		});
+		return lifeCycleVOS;
+	}
+
+	/**
+	 * 鐢熷懡鍛ㄦ湡鐨勬暟鎹璞¤浆鎹负鏄剧ず瀵硅薄
+	 * @param lifeCycle 鏁版嵁瀵硅薄
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	@Override
+	public OsLifeCycleVO lifeCycleDO2VO(LifeCyle lifeCycle){
+		OsLifeCycleVO life = new OsLifeCycleVO();
+		Map<String, OsStatusVO> statusVOMap = statusService.selectAllStatusMap();
+		if(lifeCycle !=null) {
+			try {
+				life.setCreateTime(VciDateUtil.str2Date(lifeCycle.createTime,VciDateUtil.DateTimeFormat));
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+			life.setCreator(lifeCycle.creator);
+			life.setDescription(lifeCycle.description);
+			life.setId(lifeCycle.name);
+			life.setLastModifier(lifeCycle.modifier);
+			try {
+				life.setLastModifyTime(VciDateUtil.str2Date(lifeCycle.modifyTime,VciDateUtil.DateTimeFormat));
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+			life.setOid(lifeCycle.oid);
+			List<OsLifeCycleLineVO> lineVOS = new ArrayList<>();
+			if(lifeCycle.routes!=null&& lifeCycle.routes.length>0){
+				Arrays.stream(lifeCycle.routes).forEach(route->{
+					OsLifeCycleLineVO lineVO = new OsLifeCycleLineVO();
+					lineVO.setSourceLifeStatus(route.source);
+					lineVO.setSourceLifeStatusName(statusVOMap.getOrDefault(route.source,new OsStatusVO()).getName());
+					lineVO.setTargetLifeStatus(route.destination);
+					lineVO.setTargetLifeStatusName(statusVOMap.getOrDefault(route.destination,new OsStatusVO()).getName());
+					lineVO.setOid(route.id);
+					lineVO.setName(route.connect);
+					if(route.transitionVOEvents ==null || route.transitionVOEvents.length == 0){
+						lineVO.setEvents(new OsLifeCycleLineEventVO[0]);
+					}else {
+						OsLifeCycleLineEventVO[] eventVOs = new OsLifeCycleLineEventVO[route.transitionVOEvents.length];
+						for (int i = 0; i < route.transitionVOEvents.length; i++) {
+							TransitionVOEvent event = route.transitionVOEvents[i];
+							OsLifeCycleLineEventVO eventVO = new OsLifeCycleLineEventVO();
+							eventVO.setOid(event.id);
+							eventVO.setEventFullName(event.name);
+							eventVOs[i] = eventVO;
+						}
+						lineVO.setEvents(eventVOs);
+					}
+					lineVOS.add(lineVO);
+				});
+			}
+			life.setLines(lineVOS);
+			life.setStartStatus(lifeCycle.startState);
+			life.setStartStatusName(statusVOMap.getOrDefault(lifeCycle.startState,new OsStatusVO()).getName());
+			life.setName(lifeCycle.tag);
+			try {
+				life.setTs(VciDateUtil.str2Date(lifeCycle.ts,VciDateUtil.DateTimeMillFormat));
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		}
+		return life;
+	}
+
+	/**
+	 * 鐢熷懡鍛ㄦ湡鏄剧ず瀵硅薄杞崲涓烘暟鎹璞�
+	 * @param lifeCycleVO 鏄剧ず瀵硅薄
+	 * @return 鏁版嵁瀵硅薄
+	 */
+	@Override
+	public LifeCyle lifeCycleVO2DO(OsLifeCycleVO lifeCycleVO){
+		LifeCyle lifeCyle = new LifeCyle();
+		lifeCyle.name = lifeCycleVO.getId();
+		lifeCyle.tag = lifeCycleVO.getName();
+		lifeCyle.oid = lifeCycleVO.getOid();
+		lifeCyle.creator = lifeCycleVO.getCreator();
+		lifeCyle.description = lifeCycleVO.getDescription();
+		lifeCyle.modifier = lifeCycleVO.getLastModifier();
+		lifeCyle.modifyTime = VciDateUtil.date2Str(lifeCycleVO.getLastModifyTime(),VciDateUtil.DateTimeFormat);
+		lifeCyle.createTime = VciDateUtil.date2Str(lifeCycleVO.getCreateTime(),VciDateUtil.DateTimeFormat);
+		lifeCyle.startState =lifeCycleVO.getStartStatus();
+		lifeCyle.ts = VciDateUtil.date2Str(lifeCycleVO.getTs(),VciDateUtil.DateTimeMillFormat);
+		if(lifeCycleVO.getBounds() !=null && lifeCycleVO.getBounds().length>0) {
+			Bound[] bounds = new Bound[lifeCycleVO.getBounds().length];
+			for (int i = 0; i < lifeCycleVO.getBounds().length; i++) {
+				OsLifeCycleLineBoundVO boundVO = lifeCycleVO.getBounds()[i];
+				Bound bound = new Bound();
+				bound.id = StringUtils.isBlank(boundVO.getId()) ? "" : boundVO.getId();
+				bound.name = boundVO.getName();
+				bound.cellx = boundVO.getCellx();
+				bound.celly = boundVO.getCelly();
+				bound.cellh = boundVO.getCellh();
+				bound.cellw = boundVO.getCellw();
+				bound.cellicon = StringUtils.isBlank(boundVO.getCellicon()) ? "" : boundVO.getCellicon();
+				bounds[i] = bound;
+			}
+			lifeCyle.bounds = bounds;
+		}else{
+			lifeCyle.bounds = new Bound[0];
+		}
+		//鍔犻摼鎺ョ嚎
+		List<TransitionVO> lines = new ArrayList<>();
+		for (int i = 0; i < lifeCycleVO.getLines().size(); i++) {
+			OsLifeCycleLineVO lineVO = lifeCycleVO.getLines().get(i);
+			lines.add(lifeCycleLineVO2DO(lineVO));
+		}
+		lifeCyle.routes = lines.toArray(new TransitionVO[0]);
+		return lifeCyle;
+	}
+
+	/**
+	 * 鏌ヨ鎵�鏈夌敓鍛藉懆鏈熺姸鎬�
+	 *
+	 * @return 鐢熷懡鍛ㄦ湡鐘舵�佺殑瀵硅薄
+	 * @throws VciBaseException 鏌ヨ鐨勬椂鍊欏嚭閿欑殑鏃跺��
+	 */
+	@Override
+	@VciUnLog
+	public List<OsLifeCycleVO> selectAllLifeCycle() throws VciBaseException {
+		try {
+			LifeCyle[] lifeCyles = platformClientUtil.getLifeCycleService().getLifeCyles();
+			return lifeCycleDO2VOs(Arrays.stream(lifeCyles).collect(Collectors.toList()));
+		} catch (VCIError vciError) {
+			 if(logger.isErrorEnabled()){
+//			 	logger.error(vciError.error_code,vciError);
+			 }
+			 throw WebUtil.getVciBaseException(vciError);
+		}
+	}
+
+	/**
+	 * 鏌ヨ鐢熷懡鍛ㄦ湡鐨勬槧灏�
+	 * @return key鏄敓鍛藉懆鏈熺殑缂栧彿锛� value鏄敓鍛藉懆鏈熺殑瀵硅薄
+	 * @throws VciBaseException 鏌ヨ鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+	 */
+	@Override
+	@VciUnLog
+	@Cacheable(value = VCI_OBJECT_SERVICE,key = CacheKeyConstant.ALL_LIFE_CYCLE,unless="#result == null")
+	public Map<String,OsLifeCycleVO> selectAllLifeCycleMap() throws VciBaseException{
+		return Optional.ofNullable(self.selectAllLifeCycle()).orElseGet(()->new ArrayList<>()).stream().collect(Collectors.toMap(s->s.getId(),t->t,(o1,o2)->o1));
+	}
+
+	/**
+	 * 娓呴櫎缂撳瓨
+	 */
+	@Override
+	@CacheEvict(value = VCI_OBJECT_SERVICE,key = CacheKeyConstant.ALL_LIFE_CYCLE)
+	public void clearCache() {
+
+	}
+
+	/**
+	 * 鑾峰彇杩炴帴绾�
+	 * @param lcid 鐢熷懡鍛ㄦ湡鐨勭紪鍙�
+	 * @param currentStatus 褰撳墠鐨勭姸鎬�
+	 * @param targetStatus 鐩爣鐨勭姸鎬�
+	 * @return 杩炴帴绾�
+	 * @throws VciBaseException 璇诲彇鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+	 */
+	@Override
+	public OsLifeCycleLineVO getTransVO(String lcid, String currentStatus,
+								   String targetStatus) throws VciBaseException {
+		WebUtil.alertNotNull(lcid,"鐢熷懡鍛ㄦ湡缂栫爜",currentStatus,"褰撳墠鐘舵��",targetStatus,"鐩爣鐘舵��");
+		OsLifeCycleVO life = getLifeCycleById(lcid);
+		if(life == null ){
+			throw new VciBaseException(DATA_ID_NOT_EXIST,new String[]{lcid});
+		}
+		if(CollectionUtils.isEmpty(life.getLines())){
+			throw new VciBaseException(LIFE_CYCLE_ROUTER_NULL,new String[]{lcid});
+		}
+		return Optional.ofNullable(life.getLines()).orElseGet(()->new ArrayList<>()).stream().filter(s->s.getSourceLifeStatus().equalsIgnoreCase(currentStatus) && s.getTargetLifeStatus().equalsIgnoreCase(targetStatus)).findFirst().orElseGet(()->null);
+	}
+
+
+	/**
+	 * 璺冭縼涓氬姟绫诲瀷鐨勭敓鍛藉懆鏈熺姸鎬�
+	 * @param obj 涓氬姟绫诲瀷鏁版嵁瀵硅薄
+	 * @param lineVO 璺冭縼璺敱
+	 * @throws VciBaseException 璺冭縼鍑洪敊鐨勬槸浼氭姏鍑哄紓甯�
+	 */
+	@Override
+	public void doTransVO(BusinessObject obj,OsLifeCycleLineVO lineVO) throws VciBaseException {
+		if(lineVO!=null){
+			try {
+				TransitionVO transitionVO = lifeCycleLineVO2DO(lineVO);
+				platformClientUtil.getBOFactoryService().transferBusinessObject(new BusinessObjectHolder(obj), transitionVO);
+			} catch (VCIError e) {
+				throw WebUtil.getVciBaseException(e);
+			}
+		}else{
+			throw new VciBaseException(LIFE_CYCLE_ROUTER_NULL);
+		}
+	}
+
+	/**
+	 * 杩炴帴绾胯浆鎹负骞冲彴鐨勫璞�
+	 * @param lineVO 杩炴帴绾垮璞�
+	 * @return 骞冲彴鐨勮繛鎺ョ嚎瀵硅薄
+	 */
+	private TransitionVO lifeCycleLineVO2DO(OsLifeCycleLineVO lineVO){
+		TransitionVO transitionVO = new TransitionVO();
+		transitionVO.id = lineVO.getOid();
+		transitionVO.source = lineVO.getSourceLifeStatus();
+		transitionVO.destination = lineVO.getTargetLifeStatus();
+		transitionVO.connect = lineVO.getName() == null?"":lineVO.getName();
+			//鍔犱簨浠�
+		TransitionVOEvent[] events;
+		if(lineVO.getEvents() == null || lineVO.getEvents().length == 0){
+			events = new TransitionVOEvent[0];
+		}else{
+			events = new TransitionVOEvent[lineVO.getEvents().length];
+			for (int j = 0; j < lineVO.getEvents().length; j++) {
+				OsLifeCycleLineEventVO eventVO = lineVO.getEvents()[j];
+				TransitionVOEvent event = new TransitionVOEvent();
+				event.id = eventVO.getOid();
+				event.name = eventVO.getEventFullName();
+				events[j] = event;
+			}
+		}
+		transitionVO.transitionVOEvents = events;
+		return transitionVO;
+	}
+
+	/**
+	 * 鎵归噺鎵ц璺冭縼鎿嶄綔
+	 * @param bos 涓氬姟绫诲瀷鏁版嵁
+	 * @param vos 璺冭縼瀵硅薄
+	 * @throws VciBaseException 璺冭縼鍑洪敊鐨勬槸浼氭姏鍑哄紓甯�
+	 */
+	@Override
+	public void batchTransVo(BusinessObject[] bos,OsLifeCycleLineVO[] vos) throws VciBaseException{
+		batchTransVo(bos,vos,null);
+	}
+
+	/**
+	 * 浣跨敤鐢熷懡鍛ㄦ湡鐨勭紪鍙峰洖鍘诲寘鍚殑鐘舵�佹樉绀哄璞�
+	 *
+	 * @param lifeCycleId 鐢熷懡鍛ㄦ湡鐨勭紪鍙�
+	 * @return 鐘舵�佺殑鏄剧ず瀵硅薄
+	 */
+	@Override
+	public List<OsStatusVO> listStatusById(String lifeCycleId) {
+		OsLifeCycleVO lifeCycleVO = getLifeCycleById(lifeCycleId);
+		if(lifeCycleVO == null || StringUtils.isBlank(lifeCycleVO.getOid())){
+			return new ArrayList<>();
+		}
+		Set<String> hasStatusIdSet = new HashSet<>();
+		lifeCycleVO.getLines().stream().forEach(lineVO->{
+			hasStatusIdSet.add(lineVO.getSourceLifeStatus());
+			hasStatusIdSet.add(lineVO.getTargetLifeStatus());
+		});
+		Map<String, OsStatusVO> statusVOMap = statusService.selectAllStatusMap();
+		List<OsStatusVO> statusVOList = new ArrayList<>();
+		hasStatusIdSet.stream().forEach(statusId->{
+			statusVOList.add(statusVOMap.getOrDefault(statusId,new OsStatusVO()));
+		});
+		return statusVOList;
+	}
+
+	/**
+	 * 鎵归噺娣诲姞鐢熷懡鍛ㄦ湡
+	 *
+	 * @param lifeCyleList 鐢熷懡鍛ㄦ湡鐨勫唴瀹�
+	 */
+	@Override
+	public void batchAddLifeCycle(List<LifeCyle> lifeCyleList) {
+		if(!CollectionUtils.isEmpty(lifeCyleList)){
+			lifeCyleList.stream().forEach(lifeCyle -> {
+				try {
+					platformClientUtil.getLifeCycleService().addLifeCyle(lifeCyle);
+				} catch (VCIError e) {
+					throw WebUtil.getVciBaseException(e);
+				}
+			});
+		}
+	}
+
+	/**
+	 * 鎵归噺淇敼鐢熷懡鍛ㄦ湡
+	 *
+	 * @param lifeCycleList 鐢熷懡鍛ㄦ湡鐨勫唴瀹�
+	 */
+	@Override
+	public void batchEditLifeCycle(List<LifeCyle> lifeCycleList) {
+		if(!CollectionUtils.isEmpty(lifeCycleList)){
+			lifeCycleList.stream().forEach(lifeCyle -> {
+				try {
+					platformClientUtil.getLifeCycleService().modifyLifeCyle(lifeCyle);
+				} catch (VCIError e) {
+					throw WebUtil.getVciBaseException(e);
+				}
+			});
+		}
+	}
+
+	/**
+	 * 鐘舵�佸湪鐢熷懡鍛ㄦ湡涓娇鐢ㄧ殑鍕ゅ揩
+	 *
+	 * @param statusOid 鐘舵�佺殑涓婚敭
+	 * @return 鐢熷懡鍛ㄦ湡鐨勪俊鎭�
+	 */
+	@Override
+	public DataGrid<OsLifeCycleVO> listStatusUsed(String statusOid) {
+		if(StringUtils.isBlank(statusOid)){
+			return new DataGrid<>("娌℃湁鐘舵�佺殑淇℃伅");
+		}
+		OsStatusVO statusVO = statusService.getObjectByOid(statusOid);
+		List<OsLifeCycleVO> lifeCycleVOS = self.selectAllLifeCycleMap().values().stream().collect(Collectors.toList());
+		List<OsLifeCycleVO> exitLifeVOList = new ArrayList<>();
+		Optional.ofNullable(lifeCycleVOS).orElseGet(()->new ArrayList<>()).stream().forEach(
+				lifeCycleVO -> {
+					if(Optional.ofNullable(lifeCycleVO.getLines()).orElseGet(()->new ArrayList<>()).stream().anyMatch(
+							lineVO->statusVO.getId().equalsIgnoreCase(lineVO.getSourceLifeStatus())|| statusVO.getId().equalsIgnoreCase(lineVO.getTargetLifeStatus()))){
+						exitLifeVOList.add(lifeCycleVO);
+					}
+				});
+		DataGrid<OsLifeCycleVO> dataGrid = new DataGrid<>();
+		dataGrid.setData(exitLifeVOList);
+		dataGrid.setTotal(exitLifeVOList.size());
+		return dataGrid;
+	}
+
+	/**
+	 * 鍒ゆ柇鐘舵�佹槸鍚﹁寮曠敤
+	 *
+	 * @param statusVO 鐘舵�佺殑鏄剧ず瀵硅薄
+	 * @return true琛ㄧず琚紩鐢�
+	 */
+	@Override
+	public boolean checkStatusUsed(OsStatusVO statusVO) {
+		List<OsLifeCycleVO> lifeCycleVOS = self.selectAllLifeCycleMap().values().stream().collect(Collectors.toList());
+		return Optional.ofNullable(lifeCycleVOS).orElseGet(()->new ArrayList<>()).stream().anyMatch(
+				lifeCycleVO ->
+					 Optional.ofNullable(lifeCycleVO.getLines()).orElseGet(()->new ArrayList<>()).stream().anyMatch(
+							lineVO->statusVO.getId().equalsIgnoreCase(lineVO.getSourceLifeStatus())|| statusVO.getId().equalsIgnoreCase(lineVO.getTargetLifeStatus()))
+				);
+	}
+
+	/**
+	 * 鐢熷懡鍛ㄦ湡鍒楄〃
+	 *
+	 * @param baseQueryObject 鏌ヨ瀵硅薄锛屽垎椤靛璞�
+	 * @return 鐢熷懡鍛ㄦ湡鏄剧ず瀵硅薄
+	 */
+	@Override
+	public DataGrid<OsLifeCycleVO> gridLifeCycle(BaseQueryObject baseQueryObject) {
+		return gridObject(baseQueryObject,OsLifeCycleDO.class,self.selectAllLifeCycleMap(),OsLifeCycleVO.class);
+	}
+
+	/**
+	 * 鐢熷懡鍛ㄦ湡鐨勯摼鎺ョ嚎
+	 *
+	 * @param id 缂栧彿
+	 * @return ER鍥惧唴瀹�
+	 */
+	@Override
+	public OsERVO listLinesPic(String id) {
+		if(StringUtils.isBlank(id)){
+			return null;
+		}
+		OsLifeCycleVO lifeCycleVO = self.selectAllLifeCycleMap().getOrDefault(id,null);
+		if(lifeCycleVO == null){
+			return null;
+		}
+		List<OsLifeCycleLineVO> voLines = lifeCycleVO.getLines();
+		List<OsStatusVO> statusVOS = listStatusById(lifeCycleVO.getId());
+		List<OsERNodeVO> nodeVOList = new ArrayList<>();
+		List<OsERRelationVO> relationVOList = new ArrayList<>();
+		Map<String, OsStatusVO> statusVOMap = Optional.ofNullable(statusVOS).orElseGet(() -> new ArrayList<>()).stream().collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
+		if(!CollectionUtils.isEmpty(statusVOS)){
+			statusVOS.stream().forEach(statusVO -> {
+				OsERNodeVO nodeVO = new OsERNodeVO();
+				nodeVO.setKey(statusVO.getId() + " " + statusVO.getName());
+				nodeVOList.add(nodeVO);
+			});
+		}
+		if(!CollectionUtils.isEmpty(voLines)){
+			voLines.stream().forEach(line->{
+				OsERRelationVO relationVO = new OsERRelationVO();
+				OsStatusVO statusVO = statusVOMap.get(line.getSourceLifeStatus().toLowerCase(Locale.ROOT));
+				OsStatusVO targetStatusVO = statusVOMap.get(line.getTargetLifeStatus().toLowerCase(Locale.ROOT));
+				relationVO.setFrom(statusVO.getId() + " " + statusVO.getName());
+				relationVO.setTo(targetStatusVO.getId() + " " + targetStatusVO.getName());
+				relationVO.setToText(line.getName());
+				relationVOList.add(relationVO);
+			});
+		}
+		OsERVO ervo = new OsERVO();
+		ervo.setTabViewList(nodeVOList);
+		ervo.setTabRelViewList(relationVOList);
+		return ervo;
+	}
+
+
+	/**
+	 * 鎵归噺鎵ц璺冭縼鎿嶄綔锛岃姹傚繀椤绘槸鍚屼竴涓笟鍔$被鍨嬩笅鐨�
+	 * @param bos 涓氬姟绫诲瀷鏁版嵁瀵硅薄
+	 * @param lineVOs 璺冭縼瀵硅薄
+	 * @param releaseStatus 鍙戝竷鐘舵�侊紝濡傛灉鐩爣鐘舵�佹槸鍙戝竷鐘舵�佹椂浼犻�掕繖涓��
+	 * @throws VciBaseException  璺冭縼鍑洪敊鐨勬槸浼氭姏鍑哄紓甯�
+	 */
+	@Override
+	public void batchTransVo(BusinessObject[] bos,OsLifeCycleLineVO[] lineVOs,String[] releaseStatus) throws VciBaseException{
+		if(bos!=null && lineVOs != null && lineVOs.length == bos.length){
+			try {
+				if(releaseStatus == null){
+					releaseStatus = new String[lineVOs.length];
+					for(int i = 0 ; i < lineVOs.length ; i ++ ){
+						releaseStatus[i] = "";
+					}
+				}
+				TransitionVO[] vos = new TransitionVO[lineVOs.length];
+				for(int i = 0 ; i < lineVOs.length; i ++){
+					vos[i] = lifeCycleLineVO2DO(lineVOs[i]);
+				}
+				platformClientUtil.getBOFactoryService().batchTransferBusinessObjectAndRelease(
+						bos, vos, releaseStatus);
+			} catch (VCIError e) {
+				throw WebUtil.getVciBaseException(e);
+			}
+		}else{
+			if(bos == null){
+				throw new VciBaseException(LIFE_CYCLE_TRANS_ERROR,new String[]{"涓氬姟绫诲瀷鏁版嵁涓虹┖"});
+			}else if(lineVOs ==null){
+				throw new VciBaseException(LIFE_CYCLE_TRANS_ERROR,new String[]{"璺冭縼璺敱涓虹┖"});
+			}else{
+				throw new VciBaseException(LIFE_CYCLE_TRANS_ERROR,new String[]{"璺冭縼璺敱鍜屼笟鍔$被鍨嬫暟鎹暱搴︿笉鐩稿悓"});
+			}
+		}
+	}
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/OsLinkTypeServiceImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/OsLinkTypeServiceImpl.java
new file mode 100644
index 0000000..84e6368
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/OsLinkTypeServiceImpl.java
@@ -0,0 +1,337 @@
+package com.vci.web.service.impl;
+
+import com.vci.corba.common.VCIError;
+import com.vci.starter.web.annotation.log.VciUnLog;
+import com.vci.starter.web.enumpck.VciFieldTypeEnum;
+import com.vci.starter.web.pagemodel.BaseQueryObject;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.starter.web.util.BeanUtil;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.starter.web.util.VciDateUtil;
+import com.vci.web.constant.CacheKeyConstant;
+import com.vci.web.model.OsLinkTypeDO;
+import com.vci.web.pageModel.*;
+import com.vci.web.service.*;
+import com.vci.web.util.PlatformClientUtil;
+import com.vci.web.util.WebUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.cache.annotation.CachePut;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import plm.bs.bom.clientobject.ClientBusinessObject;
+import plm.corba.linkTypeManager.LinkType;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static com.vci.web.constant.CacheNameConstant.VCI_OBJECT_SERVICE;
+
+/**
+ * 閾炬帴绫诲瀷鏈嶅姟
+ * @author weidy
+ * @date 2021-2-15
+ */
+@Service
+public class OsLinkTypeServiceImpl implements OsLinkTypeServiceI {
+
+    /**
+     * 鏃ュ織
+     */
+    private Logger logger = LoggerFactory.getLogger(getClass());
+
+
+    /**
+     * 骞冲彴鐨勮皟鐢ㄥ伐鍏风被
+     */
+    @Autowired
+    private PlatformClientUtil platformClientUtil;
+
+    /**
+     * 灞炴�х殑鏈嶅姟
+     */
+    @Autowired
+    private OsAttributeServiceI attributeService;
+
+    /**
+     * 鏋氫妇鐨勬湇鍔�
+     */
+    @Autowired
+    private OsEnumServiceI enumService;
+
+    /**
+     * 涓氬姟绫诲瀷鏈嶅姟
+     */
+    @Autowired
+    private OsBtmServiceI btmService;
+
+    /**
+     * 涓氬姟鏁版嵁鏌ヨ鏈嶅姟
+     */
+    @Autowired
+    private WebBoServiceI boService;
+
+    /**
+     * 鍔犺浇鑷韩
+     */
+    @Autowired(required = false)
+    @Lazy
+    private OsLinkTypeServiceI self;
+
+    /**
+     * 鏌ヨ鎵�鏈夌殑閾炬帴绫诲瀷
+     *
+     * @return 閾炬帴绫诲瀷瀵硅薄
+     */
+    @Override
+    @VciUnLog
+    public List<OsLinkTypeVO> selectAllLink() {
+        try {
+            return linkTypeDO2VOs(Arrays.stream(platformClientUtil.getLinkTypeService().getLinkTypes()).collect(Collectors.toList()));
+        } catch (VCIError vciError) {
+           throw WebUtil.getVciBaseException(vciError);
+        }
+    }
+
+    /**
+     * 鏌ヨ鎵�鏈夌殑涓氬姟绫诲瀷鏄犲皠
+     *
+     * @return key 鏄笟鍔$殑鑻辨枃鍚嶇О鐨勫皬鍐�
+     */
+    @Override
+    @VciUnLog
+    @Cacheable(value = VCI_OBJECT_SERVICE,key = CacheKeyConstant.ALL_Link,unless = "#result == null")
+    public Map<String, OsLinkTypeVO> selectAllLinkMap() {
+        return Optional.ofNullable(self.selectAllLink()).orElseGet(()->new ArrayList<>()).stream().collect(Collectors.toMap(s->s.getId().toLowerCase(),t->t,(o1,o2)->o1));
+    }
+
+    /**
+     * 鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+     *
+     * @param linkTypes 鏁版嵁瀵硅薄
+     * @return 鏄剧ず瀵硅薄
+     */
+    @Override
+    public List<OsLinkTypeVO> linkTypeDO2VOs(Collection<LinkType> linkTypes) {
+        List<OsLinkTypeVO> VOS = new ArrayList<>();
+        Optional.ofNullable(linkTypes).orElseGet(()->new ArrayList<>()).stream().forEach(linkType -> {
+            OsLinkTypeVO vo = linkTypeDO2VO(linkType);
+            VOS.add(vo);
+        });
+        return VOS;
+    }
+
+    /**
+     * 鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+     *
+     * @param linkType 鏁版嵁瀵硅薄
+     * @return 鏄剧ず瀵硅薄
+     */
+    @Override
+    public OsLinkTypeVO linkTypeDO2VO(LinkType linkType) {
+        OsLinkTypeVO vo = new OsLinkTypeVO();
+        if(linkType !=null){
+            vo.setOid(linkType.oid);
+            vo.setCreator(linkType.creator);
+            vo.setLastModifier(linkType.modifier);
+            try {
+                vo.setCreateTime(VciDateUtil.str2Date(linkType.createTime,VciDateUtil.DateTimeFormat));
+                vo.setLastModifyTime(VciDateUtil.str2Date(linkType.modifyTime,VciDateUtil.DateTimeFormat));
+                vo.setTs(VciDateUtil.str2Date(linkType.ts,VciDateUtil.DateTimeMillFormat));
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            vo.setDescription(linkType.description);
+            vo.setId(linkType.name);
+            vo.setName(linkType.tag);
+            vo.setFromBtmTypeVOS(btmService.listBtmByIds(Arrays.stream(linkType.btmItemsFrom).collect(Collectors.toSet())));
+            if(!CollectionUtils.isEmpty(vo.getFromBtmTypeVOS())){
+                vo.setFromBtmType(Arrays.stream(linkType.btmItemsFrom).collect(Collectors.joining(",")));
+                vo.setFromBtmTypeName(vo.getFromBtmTypeVOS().stream().map(OsBtmTypeVO::getName).collect(Collectors.joining(",")));
+            }
+            vo.setToBtmTypeVOS(btmService.listBtmByIds(Arrays.stream(linkType.btmItemsTo).collect(Collectors.toSet())));
+            if(!CollectionUtils.isEmpty(vo.getToBtmTypeVOS())){
+                vo.setToBtmType(Arrays.stream(linkType.btmItemsTo).collect(Collectors.joining(",")));
+                vo.setToBtmTypeName(vo.getToBtmTypeVOS().stream().map(OsBtmTypeVO::getName).collect(Collectors.joining(",")));
+            }
+            vo.setImplClass(linkType.implClass);
+            vo.setShape(linkType.shape);
+            List<OsAttributeVO> attributeVOS = attributeService.listAttrByIds(Arrays.stream(linkType.attributes).collect(Collectors.toList()));
+            List<OsLinkTypeAttributeVO> linkTypeAttributeVOS = new ArrayList<>();
+            Optional.ofNullable(attributeVOS).orElseGet(()->new ArrayList<>()).stream().forEach(attributeVO->{
+                OsLinkTypeAttributeVO linkTypeAttributeVO = new OsLinkTypeAttributeVO();
+                BeanUtil.convert(attributeVO,linkTypeAttributeVO);
+                linkTypeAttributeVO.setPkLinkType(vo.getOid());
+                if(StringUtils.isNotBlank(attributeVO.getBtmTypeId())){
+                    linkTypeAttributeVO.setReferFlag(true);
+                    linkTypeAttributeVO.setReferBtmTypeId(attributeVO.getBtmTypeId());
+                }
+                if(StringUtils.isNotBlank(attributeVO.getEnumId())){
+                    linkTypeAttributeVO.setEnumFlag(true);
+                    linkTypeAttributeVO.setEnumItemMap(enumService.getEnumValueMap(linkTypeAttributeVO.getEnumId()));
+                }
+                linkTypeAttributeVOS.add(linkTypeAttributeVO);
+            });
+            vo.setAttributes(linkTypeAttributeVOS);
+        }
+        return vo;
+    }
+
+    /**
+     * 浣跨敤缂栧彿鑾峰彇閾炬帴绫诲瀷
+     *
+     * @param linkIds 缂栧彿
+     * @return 閾炬帴绫诲瀷
+     */
+    @Override
+    public List<OsLinkTypeVO> listLinkTypeIds(Collection<String> linkIds) {
+        if(CollectionUtils.isEmpty(linkIds)){
+            return null;
+        }
+        Map<String, OsLinkTypeVO> linkTypeVOMap = self.selectAllLinkMap();
+        List<OsLinkTypeVO> linkTypeVOS = new ArrayList<>();
+        linkIds.stream().forEach(id->{
+            if(linkTypeVOMap.containsKey(id.toLowerCase())){
+                linkTypeVOS.add(linkTypeVOMap.get(id.toLowerCase()));
+            }
+        });
+        return linkTypeVOS;
+    }
+
+    /**
+     * 浣跨敤缂栧彿鑾峰彇閾炬帴绫诲瀷
+     *
+     * @param id 缂栧彿
+     * @return 閾炬帴绫诲瀷
+     */
+    @Override
+    public OsLinkTypeVO getLinkTypeById(String id) {
+        if(StringUtils.isBlank(id)){
+            return null;
+        }
+        return self.selectAllLinkMap().getOrDefault(id.toLowerCase(),null);
+    }
+
+    /**
+     * 鑾峰彇閾炬帴绫诲瀷鐨勫睘鎬�
+     *
+     * @param linkTypeId 閾炬帴绫诲瀷鐨勭紪鍙�
+     * @return 閾炬帴绫诲瀷鐨勫睘鎬�
+     */
+    @Override
+    public List<OsLinkTypeAttributeVO> listAttributeByLinkId(String linkTypeId) {
+        OsLinkTypeVO linkTypeVO = getLinkTypeById(linkTypeId);
+        return linkTypeVO.getAttributes();
+    }
+
+    /**
+     * 閾炬帴绫诲瀷鐨勫垪琛�
+     *
+     * @param baseQueryObject 鏌ヨ瀵硅薄
+     * @return 閾炬帴绫诲瀷鐨勬樉绀哄璞�
+     */
+    @Override
+    public DataGrid<OsLinkTypeVO> gridLinkType(BaseQueryObject baseQueryObject) {
+        return gridObject(baseQueryObject, OsLinkTypeDO.class,self.selectAllLinkMap(),OsLinkTypeVO.class);
+    }
+
+    /**
+     * 浣跨敤涓婚敭鑾峰彇鏄剧ず瀵硅薄
+     *
+     * @param linkTypeOid 閾炬帴绫诲瀷鐨勪富閿�
+     * @return 閾炬帴绫诲瀷鐨勬樉绀哄璞�
+     */
+    @Override
+    public OsLinkTypeVO selectByOid(String linkTypeOid) {
+        List<OsLinkTypeVO> linkTypeVOS = self.selectAllLinkMap().values().stream().collect(Collectors.toList());
+        return Optional.ofNullable(linkTypeVOS).orElseGet(()->new ArrayList<>()).stream().filter(s->s.getOid().equalsIgnoreCase(linkTypeOid)).findFirst().orElseGet(()->null);
+
+    }
+
+    /**
+     * 鑾峰彇閾炬帴绫诲瀷鍏宠仈鐨勬墍鏈変笟鍔$被鍨嬩腑灞炴�х被鍨嬪樊寮傜殑淇℃伅
+     *
+     * @param linkTypeOid 閾炬帴绫诲瀷鐨勪富閿�
+     * @return 鏈夐敊璇殑灞炴��
+     */
+    @Override
+    public List<OsBtmTypeAttributeVO> checkAttributeTypeDifferent(String linkTypeOid) {
+        if(StringUtils.isBlank(linkTypeOid)){
+            return new ArrayList<>();
+        }
+        OsLinkTypeVO linkTypeVO = selectByOid(linkTypeOid);
+        List<OsBtmTypeVO> fromBtmTypeVOS = linkTypeVO.getFromBtmTypeVOS();
+        List<OsBtmTypeVO> toBtmTypeVOS = linkTypeVO.getToBtmTypeVOS();
+        List<OsBtmTypeVO> btmTypeVOS = new ArrayList<>();
+        btmTypeVOS.addAll(fromBtmTypeVOS);
+        btmTypeVOS.addAll(toBtmTypeVOS);
+
+        List<OsBtmTypeAttributeVO> diffList = new ArrayList<>();
+        btmTypeVOS.stream().forEach(btmTypeVO -> {
+            //鏌ヨ杩欎釜琛ㄧ殑淇℃伅
+            String sql = "select t.column_name,t.data_type,t.data_length,t.nullable,t.data_precision,t.data_scale,c.comments from user_tab_columns t " +
+                    "inner JOIN user_col_comments c on t.TABLE_NAME  = c.table_name and t.COLUMN_NAME = c.column_name where " +
+                    "t.table_name = '" + VciBaseUtil.getTableName(btmTypeVO.getId()).toUpperCase(Locale.ROOT) + "' order by t.column_name asc";
+            Map<String, OsBtmTypeAttributeVO> attributeVOMap = btmTypeVO.getAttributes().stream().collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
+            List<ClientBusinessObject> cbosList = boService.queryBySql(sql, new HashMap<>());
+            if(!CollectionUtils.isEmpty(cbosList)){
+                cbosList.stream().forEach(cbo->{
+                    String attrId = cbo.getAttributeValue("column_name");
+                    String dataType = cbo.getAttributeValue("data_type");
+                    if(StringUtils.isNotBlank(dataType) && dataType.contains("(")){
+                        dataType = dataType.substring(0,dataType.indexOf("("));
+                    }
+                    OsBtmTypeAttributeVO attributeVO = attributeVOMap.getOrDefault(attrId.toLowerCase(Locale.ROOT), null);
+                    if(attributeVO!=null){
+                        String vtType = attributeVO.getAttrDataType();
+                        String attrType = "";
+                        VciFieldTypeEnum fieldTypeEnum = VciFieldTypeEnum.forValue(vtType);
+                        if(fieldTypeEnum == null) {
+                            attrType = "VARCHAR2";
+                        }else {
+                            switch (fieldTypeEnum) {
+                                case VTString:
+                                case VTBoolean:
+                                    attrType = "VARCHAR2";
+                                    break;
+                                case VTInteger:
+                                case VTLong:
+                                case VTDouble:
+                                    attrType = "NUMBER";
+                                    break;
+                                case VTDate:
+                                    attrType = "DATE";
+                                    break;
+                                case VTDateTime:
+                                case VTTime:
+                                    attrType = "TIMESTAMP";
+                                    break;
+                                default:
+                                    attrType = "VARCHAR2";
+                                    break;
+                            }
+                        }
+                        if(!attrType.equalsIgnoreCase(dataType)) {
+                            diffList.add(attributeVO);
+                        }
+                    }
+                });
+            }
+        });
+        return diffList;
+    }
+
+    /**
+     * 娓呴櫎缂撳瓨
+     */
+    @Override
+    @CacheEvict(value = VCI_OBJECT_SERVICE,key = CacheKeyConstant.ALL_Link)
+    public void clearCache() {
+
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/OsRevisionRuleServiceImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/OsRevisionRuleServiceImpl.java
new file mode 100644
index 0000000..89fefe7
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/OsRevisionRuleServiceImpl.java
@@ -0,0 +1,140 @@
+package com.vci.web.service.impl;
+
+import com.vci.corba.common.VCIError;
+import com.vci.starter.web.annotation.log.VciUnLog;
+import com.vci.starter.web.util.VciDateUtil;
+import com.vci.web.constant.CacheKeyConstant;
+import com.vci.web.pageModel.OsRevisionRuleVO;
+import com.vci.web.service.OsRevisionRuleServiceI;
+import com.vci.web.util.PlatformClientUtil;
+import com.vci.web.util.WebUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.CachePut;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+import plm.corba.versionRuleManager.VersionRule;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static com.vci.web.constant.CacheNameConstant.VCI_OBJECT_SERVICE;
+
+/**
+ * 鐗堟湰瑙勫垯鐨勬湇鍔�
+ * @author weidy
+ * @date 2021-2-15
+ */
+@Service
+public class OsRevisionRuleServiceImpl implements OsRevisionRuleServiceI {
+
+    /**
+     * 骞冲彴璋冪敤瀹㈡埛绔�
+     */
+    @Autowired
+    private PlatformClientUtil platformClientUtil;
+
+    /**
+     * 鍔犺浇鑷韩
+     */
+    @Autowired(required = false)
+    @Lazy
+    private OsRevisionRuleServiceI self;
+    /**
+     * 鏌ヨ鎵�鏈夌殑鐗堟湰瑙勫垯
+     *
+     * @return 鐗堟湰瀵硅薄
+     */
+    @Override
+    public List<OsRevisionRuleVO> selectAllRevision() {
+        try {
+            return revisionRuleDO2VOs(Arrays.stream(platformClientUtil.getVersionService().getVersionRules()).collect(Collectors.toList()));
+        } catch (VCIError vciError) {
+            throw WebUtil.getVciBaseException(vciError);
+        }
+    }
+
+    /**
+     * 鏌ヨ鎵�鏈夌殑鐗堟湰瑙勫垯鏄犲皠
+     *
+     * @return key 鏄増鏈殑鑻辨枃鍚嶇О
+     */
+    @Override
+    @CachePut(value = VCI_OBJECT_SERVICE,key = CacheKeyConstant.ALL_REVISION,unless = "#result ==null ")
+    @VciUnLog
+    public Map<String, OsRevisionRuleVO> selectAllRevisionMap() {
+        return Optional.ofNullable(self.selectAllRevision()).orElseGet(()->new ArrayList<>()).stream().collect(Collectors.toMap(s->s.getId().toLowerCase(),t->t,(o1,o2)->o1));
+    }
+
+    /**
+     * 鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+     *
+     * @param versionRules 鏁版嵁瀵硅薄
+     * @return 鏄剧ず瀵硅薄
+     */
+    @Override
+    public List<OsRevisionRuleVO> revisionRuleDO2VOs(Collection<VersionRule> versionRules) {
+        List<OsRevisionRuleVO> ruleVOS = new ArrayList<>();
+        Optional.ofNullable(versionRules).orElseGet(()->new ArrayList<>()).stream().forEach(versionRule -> {
+            OsRevisionRuleVO ruleVO = revisionRuleDO2VO(versionRule);
+            ruleVOS.add(ruleVO);
+        });
+        return ruleVOS;
+    }
+
+    /**
+     * 鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+     *
+     * @param versionRule 鏁版嵁瀵硅薄
+     * @return 鏄剧ず瀵硅薄
+     */
+    @Override
+    public OsRevisionRuleVO revisionRuleDO2VO(VersionRule versionRule) {
+        OsRevisionRuleVO ruleVO = new OsRevisionRuleVO();
+        if(versionRule !=null){
+            ruleVO.setOid(versionRule.oid);
+            ruleVO.setCreator(versionRule.creator);
+            ruleVO.setLastModifier(versionRule.modifier);
+            try {
+                ruleVO.setCreateTime(VciDateUtil.str2Date(versionRule.createTime,VciDateUtil.DateTimeFormat));
+                ruleVO.setLastModifyTime(VciDateUtil.str2Date(versionRule.modifyTime,VciDateUtil.DateTimeFormat));
+                ruleVO.setTs(VciDateUtil.str2Date(versionRule.ts,VciDateUtil.DateTimeFormat));
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            ruleVO.setDescription(versionRule.description);
+            ruleVO.setId(versionRule.name);
+            ruleVO.setName(versionRule.tag);
+            ruleVO.setSerialStep(WebUtil.getInt(versionRule.stepLength));
+            ruleVO.setSkipCode(versionRule.jumpCharacter);
+            ruleVO.setPrefixCode(versionRule.prefixion);
+            ruleVO.setSuffixCode(versionRule.suffix);
+            ruleVO.setStartCode(versionRule.initialValue);
+            //associated鏆傛椂娌℃湁浣跨敤
+        }
+        return ruleVO;
+    }
+
+    /**
+     * 浣跨敤缂栧彿鑾峰彇瑙勫垯鐨勫��
+     *
+     * @param id 缂栧彿
+     * @return 鏄剧ず瀵硅薄
+     */
+    @Override
+    public OsRevisionRuleVO getRevisionRuleById(String id) {
+        if(StringUtils.isNotBlank(id)){
+            return self.selectAllRevisionMap().getOrDefault(id.toLowerCase().trim(),null);
+        }
+        return null;
+    }
+
+    /**
+     * 娓呴櫎缂撳瓨
+     */
+    @Override
+    @CachePut(value = VCI_OBJECT_SERVICE,key = CacheKeyConstant.ALL_REVISION)
+    public void clearCache() {
+
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/OsStatusServiceImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/OsStatusServiceImpl.java
new file mode 100644
index 0000000..29dd8a2
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/OsStatusServiceImpl.java
@@ -0,0 +1,367 @@
+package com.vci.web.service.impl;
+
+import com.vci.corba.common.VCIError;
+import com.vci.starter.web.annotation.log.VciUnLog;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.BaseQueryObject;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.starter.web.util.BeanUtil;
+import com.vci.starter.web.util.LangBaseUtil;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.starter.web.util.VciDateUtil;
+import com.vci.starter.web.wrapper.VciQueryWrapperForDO;
+import com.vci.web.dto.OsStatusDTO;
+import com.vci.web.model.OsLifeCycleDO;
+import com.vci.web.model.OsStatusDO;
+import com.vci.web.pageModel.OsLifeCycleVO;
+import com.vci.web.pageModel.OsStatusVO;
+import com.vci.web.service.OsLifeCycleServiceI;
+import com.vci.web.service.OsStatusServiceI;
+import com.vci.web.service.WebBoServiceI;
+import com.vci.web.util.PlatformClientUtil;
+import com.vci.web.util.WebUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import plm.corba.statePoolManager.StatePool;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static com.vci.frameworkcore.constant.FrameWorkBusLangCodeConstant.DATA_OID_NOT_EXIST;
+import static com.vci.web.constant.CacheKeyConstant.ALL_STATUS;
+import static com.vci.web.constant.CacheNameConstant.VCI_OBJECT_SERVICE;
+
+/**
+ * 鐘舵�佺殑鏈嶅姟
+ * @author weidy
+ * @date 2021-2-14
+ */
+@Service
+public class OsStatusServiceImpl implements OsStatusServiceI {
+
+    /**
+     * 鏃ュ織
+     */
+    private Logger logger = LoggerFactory.getLogger(getClass());
+
+    /**
+     * 骞冲彴鐨勫鎴风
+     */
+    @Autowired
+    private PlatformClientUtil platformClientUtil;
+
+    /**
+     * 涓氬姟
+     */
+    @Autowired
+    private WebBoServiceI boService;
+
+    /**
+     * 鐢熷懡鍛ㄦ湡鐨勬湇鍔�
+     */
+    @Autowired(required = false)
+    @Lazy
+    private OsLifeCycleServiceI lifeCycleService;
+
+    /**
+     * 鍔犺浇鑷韩
+     */
+    @Autowired(required = false)
+    @Lazy
+    private OsStatusServiceI self;
+
+    /**
+     * 鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+     *
+     * @param statePool 鐘舵�佹睜鐨勬暟鎹璞�
+     * @return 鏄剧ず瀵硅薄
+     */
+    @Override
+    public OsStatusVO statusDO2VO(StatePool statePool) {
+        OsStatusVO statusVO = new OsStatusVO();
+        if(statePool!=null){
+            statusVO.setOid(statePool.oid);
+            statusVO.setCreator(statePool.creator);
+            statusVO.setLastModifier(statePool.modifier);
+            try {
+                statusVO.setCreateTime(VciDateUtil.str2Date(statePool.createTime,VciDateUtil.DateTimeFormat));
+                statusVO.setLastModifyTime(VciDateUtil.str2Date(statePool.modifyTime,VciDateUtil.DateTimeFormat));
+                statusVO.setTs(VciDateUtil.str2Date(statePool.ts,VciDateUtil.DateTimeMillFormat));
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            statusVO.setDescription(statePool.description);
+            statusVO.setId(statePool.name);
+            statusVO.setName(statePool.tag);
+        }
+        return statusVO;
+    }
+
+    /**
+     * 鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+     *
+     * @param statePools 鐘舵�佹睜鐨勬暟鎹璞� 闆嗗悎
+     * @return 鏄剧ず瀵硅薄
+     */
+    @Override
+    public List<OsStatusVO> statusDO2VOs(Collection<StatePool> statePools) {
+        List<OsStatusVO> statusVOS = new ArrayList<>();
+        if(!CollectionUtils.isEmpty(statePools)){
+            statePools.stream().forEach(statePool -> {
+                OsStatusVO statusVO = statusDO2VO(statePool);
+                statusVOS.add(statusVO);
+            });
+        }
+        return statusVOS;
+    }
+
+    /**
+     * 鏌ヨ鎵�鏈夌殑鐘舵��
+     *
+     * @return 鐘舵�佺殑鏄剧ず瀵硅薄
+     */
+    @Override
+    @VciUnLog
+    public List<OsStatusVO> selectAllStatus() {
+        try {
+            return statusDO2VOs(Arrays.stream(platformClientUtil.getStatePoolService().getStatePools()).collect(Collectors.toList()));
+        } catch (VCIError vciError) {
+            throw WebUtil.getVciBaseException(vciError);
+        }
+    }
+
+    /**
+     * 娓呴櫎缂撳瓨
+     */
+    @CacheEvict(value = VCI_OBJECT_SERVICE,key = ALL_STATUS)
+    @Override
+    public void clearCache(){
+        //
+    }
+
+    /**
+     * 鏌ヨ鍏ㄩ儴鐨勭姸鎬佹槧灏�
+     * @return key鏄姸鎬佺殑鑻辨枃鍚嶇О
+     */
+    @Override
+    @VciUnLog
+    @Cacheable(value = VCI_OBJECT_SERVICE,key = ALL_STATUS,unless = "#result == null")
+    public Map<String,OsStatusVO> selectAllStatusMap(){
+        return Optional.ofNullable(self.selectAllStatus()).orElseGet(()->new ArrayList<>()).stream().collect(Collectors.toMap(s->s.getId(),t->t,(o1,o2)->o1));
+    }
+
+    /**
+     * 鐘舵�佽浆鎹负鏄剧ず鏂囨湰
+     *
+     * @param status 鐘舵��
+     * @return 鏄剧ず鏂囨湰
+     */
+    @Override
+    public String getStatusTextByValue(String status) {
+        if(StringUtils.isBlank(status)){
+            return "";
+        }
+        return self.selectAllStatusMap().getOrDefault(status,new OsStatusVO()).getName();
+    }
+
+    /**
+     * 鎵归噺娣诲姞鐘舵��
+     *
+     * @param statePoolList 鐘舵�佸唴瀹�
+     */
+    @Override
+    public void batchAddStatus(List<StatePool> statePoolList) {
+        if(!CollectionUtils.isEmpty(statePoolList)){
+            for(StatePool statePool : statePoolList) {
+                try {
+                    platformClientUtil.getStatePoolService().addStatePool(statePool);
+                } catch (VCIError vciError) {
+                    throw WebUtil.getVciBaseException(vciError);
+                }
+            }
+        }
+    }
+
+    /**
+     * 鎵归噺淇敼鐘舵��
+     * @param statePoolList 鐘舵�佸唴瀹�
+     */
+    @Override
+    public void batchEditSave(List<StatePool> statePoolList) {
+        if(!CollectionUtils.isEmpty(statePoolList)){
+            for(StatePool statePool : statePoolList) {
+                try {
+                    platformClientUtil.getStatePoolService().modifyStatePool(statePool);
+                } catch (VCIError vciError) {
+                    throw WebUtil.getVciBaseException(vciError);
+                }
+            }
+        }
+    }
+
+    /**
+     * 鐘舵�佸垪琛�
+     *
+     * @param conditionMap 鏌ヨ瀵硅薄
+     * @param pageHelper   鍒嗛〉鍒楄〃
+     * @return 鏄剧ず瀵硅薄
+     */
+    @Override
+    public DataGrid<OsStatusVO> gridStatus(Map<String, String> conditionMap, PageHelper pageHelper) {
+        BaseQueryObject baseQueryObject = new BaseQueryObject();
+        baseQueryObject.setConditionMap(conditionMap);
+        if (pageHelper == null) {
+            pageHelper = new PageHelper(-1);
+        }
+        baseQueryObject.setPage(pageHelper.getPage());
+        baseQueryObject.setLimit(pageHelper.getLimit());
+        baseQueryObject.setOrder(pageHelper.getOrder());
+        baseQueryObject.setSort(pageHelper.getSort());
+
+        return gridObject(baseQueryObject, OsStatusDO.class,self.selectAllStatusMap(),OsStatusVO.class);
+    }
+
+    /**
+     * 浣跨敤涓婚敭鑾峰彇鏄剧ず瀵硅薄
+     *
+     * @param oid 涓婚敭
+     * @return 鐘舵�佺殑鏄剧ず瀵硅薄
+     */
+    @Override
+    public OsStatusVO getObjectByOid(String oid) {
+        List<OsStatusVO> statusVOList = self.selectAllStatusMap().values().stream().filter(status -> status.getOid().equalsIgnoreCase(oid)).collect(Collectors.toList());
+        if(CollectionUtils.isEmpty(statusVOList)){
+            throw new VciBaseException(DATA_OID_NOT_EXIST);
+        }
+        return statusVOList.get(0);
+    }
+
+    /**
+     * 浣跨敤涓婚敭闆嗗悎鏌ヨ
+     * @param oidCollection 涓婚敭闆嗗悎
+     * @return 鐘舵�佺殑鍐呭
+     */
+    @Override
+    public List<OsStatusVO> selectByOidCollection(Collection<String> oidCollection){
+        List<OsStatusVO> statusVOList = self.selectAllStatus().stream().filter(status -> oidCollection.contains(status.getOid())).collect(Collectors.toList());
+        if(CollectionUtils.isEmpty(statusVOList)){
+            throw new VciBaseException(DATA_OID_NOT_EXIST);
+        }
+        return statusVOList;
+    }
+
+    /**
+     * 娣诲姞鐘舵��
+     *
+     * @param statusDTO 鐘舵�佺殑鏁版嵁浼犺緭瀵硅薄
+     */
+    @Override
+    public void addSave(OsStatusDTO statusDTO) {
+        VciBaseUtil.alertNotNull(statusDTO,"鐘舵�佺殑淇℃伅",statusDTO.getId(),"鐘舵�佺殑鑻辨枃鍚嶇О",statusDTO.getName(),"鐘舵�佺殑涓枃鍚嶇О");
+        statusDTO.setOid(VciBaseUtil.getPk());
+        StatePool pool = statusDTO2DO(statusDTO);
+        List<StatePool> poolList = new ArrayList<>();
+        poolList.add(pool);
+        batchAddStatus(poolList);
+        clearCache();
+        self.selectAllStatusMap();
+    }
+
+
+    /**
+     * 缂栬緫鐘舵��
+     * @param statusDTO 鐘舵�佺殑鏁版嵁浼犺緭瀵硅薄
+     */
+    @Override
+    public void editSave(OsStatusDTO statusDTO){
+        VciBaseUtil.alertNotNull(statusDTO,"鐘舵�佺殑淇℃伅",statusDTO.getId(),"鐘舵�佺殑鑻辨枃鍚嶇О",statusDTO.getName(),"鐘舵�佺殑涓枃鍚嶇О",statusDTO.getOid(),"涓婚敭");
+        OsStatusVO statusVO = getObjectByOid(statusDTO.getOid());
+        StatePool pool = statusDTO2DO(statusDTO);
+        pool.creator = statusVO.getCreator();
+        pool.createTime = VciDateUtil.date2Str(statusVO.getCreateTime(),VciDateUtil.DateTimeMillFormat);
+        List<StatePool> poolList = new ArrayList<>();
+        poolList.add(pool);
+        batchEditSave(poolList);
+        clearCache();
+        self.selectAllStatusMap();
+    }
+
+    /**
+     * 鍒犻櫎鐘舵��
+     * @param oids 涓婚敭
+     */
+    @Override
+    public void delete(String oids){
+        VciBaseUtil.alertNotNull(oids,"涓婚敭");
+        //鍒ゆ柇鏄惁琚紩鐢�
+        List<OsStatusVO> statusVOList1 = selectByOidCollection(VciBaseUtil.str2List(oids));
+        if(statusVOList1.stream().anyMatch(statusVO -> lifeCycleService.checkStatusUsed(statusVO))){
+            throw new VciBaseException("鐘舵�佸湪鐢熷懡鍛ㄦ湡涓浣跨敤锛屼笉鑳藉垹闄�");
+        }
+        statusVOList1.stream().forEach(statusVO -> {
+            try {
+                platformClientUtil.getStatePoolService().deleteStatePool(statusVO2DO(statusVO));
+            }catch (Throwable e){
+                throw new VciBaseException(LangBaseUtil.getErrorMsg(e),new String[]{},e);
+            }
+        });
+        clearCache();
+        self.selectAllStatusMap();
+    }
+
+    /**
+     * 鐘舵�佺殑鏁版嵁浼犺緭瀵硅薄杞崲涓烘暟鎹璞�
+     * @param statusDTO 鏁版嵁浼犺緭瀵硅薄
+     * @return 骞冲彴鐨勬暟鎹璞�
+     */
+    @Override
+    public StatePool statusDTO2DO(OsStatusDTO statusDTO){
+        StatePool statePool = new StatePool();
+        statePool.oid = statusDTO.getOid();
+        statePool.id = "";
+        statePool.name = statusDTO.getId();
+        statePool.description = statusDTO.getDescription()==null?"":statusDTO.getDescription();
+        String userId = VciBaseUtil.getCurrentUserId();
+        String now = VciDateUtil.getNowString(VciDateUtil.DateTimeMillFormat);
+        statePool.creator = userId;
+        statePool.createTime = now;
+        statePool.modifier = userId;
+        statePool.modifyTime = now;
+        statePool.ts = statusDTO.getTs()==null?now:VciDateUtil.date2Str(statusDTO.getTs(),VciDateUtil.DateTimeMillFormat);
+        statePool.tag = statusDTO.getName();
+        return statePool;
+    }
+
+    /**
+     * 鐘舵�佺殑鏄剧ず瀵硅薄杞崲涓篋O瀵硅薄
+     * @param statusVO 鏄剧ず瀵硅薄
+     * @return 鏁版嵁瀵硅薄
+     */
+    public StatePool statusVO2DO(OsStatusVO statusVO){
+        StatePool statePool = new StatePool();
+        statePool.oid = statusVO.getOid();
+        statePool.id = "";
+        statePool.name = statusVO.getId();
+        statePool.description = statusVO.getDescription()==null?"":statusVO.getDescription();
+        String userId = VciBaseUtil.getCurrentUserId();
+        String now = VciDateUtil.getNowString(VciDateUtil.DateTimeMillFormat);
+        statePool.creator = statusVO.getCreator();
+        statePool.createTime = VciDateUtil.date2Str(statusVO.getCreateTime(),VciDateUtil.DateTimeMillFormat);
+        statePool.modifier = statusVO.getLastModifier();
+        statePool.modifyTime = VciDateUtil.date2Str(statusVO.getLastModifyTime(),VciDateUtil.DateTimeMillFormat);;
+        statePool.ts = statusVO.getTs()==null?now:VciDateUtil.date2Str(statusVO.getTs(),VciDateUtil.DateTimeMillFormat);
+        statePool.tag = statusVO.getName();
+        return statePool;
+    }
+
+
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/SmFavFunctionServiceImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/SmFavFunctionServiceImpl.java
new file mode 100644
index 0000000..fa7d1e4
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/SmFavFunctionServiceImpl.java
@@ -0,0 +1,110 @@
+package com.vci.web.service.impl;
+
+import com.vci.frameworkcore.compatibility.ISmFunctionQueryService;
+import com.vci.frameworkcore.constant.FrameWorkBtmTypeConstant;
+import com.vci.frameworkcore.pagemodel.SmFunctionVO;
+import com.vci.starter.revision.service.RevisionModelUtil;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.web.model.SmFavFunctionDO;
+import com.vci.web.service.SmFavFunctionServiceI;
+import com.vci.web.service.WebBoServiceI;
+import com.vci.web.util.WebUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 鏀惰棌鍔熻兘鏈嶅姟
+ * @author weidy
+ * @date 2020/7/12
+ */
+@Service
+public class SmFavFunctionServiceImpl implements SmFavFunctionServiceI {
+
+    /**
+     * 涓氬姟绫诲瀷鐨勬湇鍔�
+     */
+    @Autowired
+    private WebBoServiceI boService;
+
+
+    /**
+     * 鑿滃崟鍔熻兘鐨勬暟鎹搷浣�
+     */
+    @Autowired
+    private ISmFunctionQueryService functionQueryService;
+
+    /**
+     * 鐗堟湰鍜屽璞℃搷浣滅被
+     */
+    @Autowired(required = false)
+    private RevisionModelUtil revisionModelUtil;
+
+    /**
+     * 娣诲姞鏀惰棌
+     *
+     * @param functionId 鍔熻兘缂栧彿
+     * @throws VciBaseException 鍙傛暟涓虹┖浼氭姏鍑哄紓甯�
+     */
+    @Override
+    public void addFav(String functionId) throws VciBaseException {
+        VciBaseUtil.alertNotNull(functionId,"鍔熻兘鑿滃崟缂栧彿");
+        Map<String,String> conditionMap = new HashMap<>();
+        conditionMap.put("functionId",functionId.trim());
+        conditionMap.put("userOid", WebUtil.getCurrentUserOid());
+        if(boService.queryCount(FrameWorkBtmTypeConstant.SM_FAV_FUNCTION,conditionMap)<1){
+            SmFavFunctionDO favFunctionDO = new SmFavFunctionDO();
+            favFunctionDO.setFunctionId(functionId);
+            favFunctionDO.setUserOid(VciBaseUtil.getCurrentUserOid());
+            revisionModelUtil.wrapperForAdd(favFunctionDO);
+            boService.editSave(favFunctionDO);
+        }
+    }
+
+    /**
+     * 绉婚櫎鏀惰棌
+     *
+     * @param functionId 鍔熻兘缂栧彿
+     * @throws VciBaseException 鍙傛暟涓虹┖浼氭姏鍑哄紓甯�
+     */
+    @Override
+    public void removeFav(String functionId) throws VciBaseException {
+        VciBaseUtil.alertNotNull(functionId,"鍔熻兘鑿滃崟缂栧彿");
+        SmFavFunctionDO favFunctionDO = boService.selectByOid(functionId.trim(), SmFavFunctionDO.class);
+        if(favFunctionDO!=null && StringUtils.isNotBlank(favFunctionDO.getOid())){
+            boService.delete(favFunctionDO);
+        }
+    }
+
+    /**
+     * 鑾峰彇褰撳墠鐢ㄦ埛鐨勬敹钘忓姛鑳�
+     *
+     * @return 鍔熻兘鐨勬樉绀哄璞�
+     * @throws VciBaseException 鏌ヨ鍑洪敊浼氭姏鍑哄紓甯�
+     */
+    @Override
+    public List<SmFunctionVO> listFavFunction() throws VciBaseException {
+        Map<String,String> conditionMap = new HashMap<>();
+        conditionMap.put("userOid", WebUtil.getCurrentUserOid());
+        List<SmFavFunctionDO> favFunctionDOS = boService.queryObject(SmFavFunctionDO.class, conditionMap);
+        if(CollectionUtils.isEmpty(favFunctionDOS)){
+            return new ArrayList<>();
+        }else{
+            Map<String, SmFunctionVO> functionMap = functionQueryService.selectAllFunctionMap();
+            List<SmFunctionVO> functionVOS = new ArrayList<>();
+            favFunctionDOS.stream().map(SmFavFunctionDO::getFunctionId).forEach(functionOid->{
+                if(functionMap.containsKey(functionOid)){
+                    functionVOS.add(functionMap.get(functionOid));
+                }
+            });
+            return functionVOS;
+        }
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/SmOperationServiceImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/SmOperationServiceImpl.java
new file mode 100644
index 0000000..e958126
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/SmOperationServiceImpl.java
@@ -0,0 +1,116 @@
+package com.vci.web.service.impl;
+
+import com.vci.frameworkcore.compatibility.SmFunctionQueryServiceI;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.web.pageModel.SmOperationVO;
+import com.vci.web.service.SmOperationServiceI;
+import com.vci.web.service.WebBoServiceI;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import plm.bs.bom.clientobject.ClientBusinessObject;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 鎿嶄綔鐨勬湇鍔�
+ * @author weidy
+ * @date 2022-2-23
+ */
+@Service
+public class SmOperationServiceImpl implements SmOperationServiceI {
+
+    /**
+     * 涓氬姟鏁版嵁鐨勬湇鍔�
+     */
+    @Autowired
+    private WebBoServiceI boService;
+    /**
+     * 浣跨敤鑿滃崟鐨勭紪鍙疯幏鍙栨寜閽殑鍐呭
+     *
+     * @param functionId 鍔熻兘鐨勭紪鍙�
+     * @return 鎿嶄綔鐨勪俊鎭�
+     */
+    @Override
+    public List<SmOperationVO> listButtonByFunctionId(String functionId) {
+        VciBaseUtil.alertNotNull(functionId,"鍔熻兘鑿滃崟");
+        //鎴戜滑闇�瑕佸厛鑾峰彇鍒版巿鏉冪殑鍊�
+        String sql = "select f.ploid from plfunction f where  lower(f.plmoduleno) = :functionId";
+        Map<String,String> conditionMap = new HashMap<>();
+        conditionMap.put("functionId",functionId.toLowerCase(Locale.ROOT).trim());
+        List<ClientBusinessObject> functionCbos = boService.queryBySql(sql, conditionMap);
+        if(CollectionUtils.isEmpty(functionCbos)){
+            //閮芥病鏈夎繖涓姛鑳�
+            return new ArrayList<>();
+        }
+        String functionOid = functionCbos.get(0).getAttributeValue("ploid");
+        conditionMap.clear();
+        conditionMap.put("functionOid",functionOid);
+        sql = "select rf.plrightvalue from PLROLERIGHT rf left join pluserrole ur on rf.plroleoid = ur.plroleuid " +
+                " where ur.pluseruid =:useroid and rf.plfuncoid = :functionOid";
+        conditionMap.put("useroid",VciBaseUtil.getCurrentUserOid());
+        List<ClientBusinessObject> cbos = boService.queryBySql(sql, conditionMap);
+        if(CollectionUtils.isEmpty(cbos)){
+            //娌℃湁鎺堟潈
+            return new ArrayList<>();
+        }
+        long rightValue = VciBaseUtil.getLong(cbos.get(0).getAttributeValue("plrightvalue"));
+        //鑾峰彇鍏蜂綋鍖呭惈鍝簺鎸夐挳
+        sql = "select o.ploperoid,o.plno from PLFUNCOPERATION o where o.plfuncoid = :functionOid ";
+        conditionMap.remove("useroid");
+        List<ClientBusinessObject> operationLinkCbos = boService.queryBySql(sql, conditionMap);
+        if(CollectionUtils.isEmpty(operationLinkCbos)){
+            //鏍规湰娌℃湁鎸夐挳
+            return new ArrayList<>();
+        }
+        //闇�瑕佸垽鏂湁鏉冮檺鐨勫唴瀹�
+        List<String> hasRightOids = new ArrayList<>();
+        Map<String,Integer> oidOrderMap = new HashMap<>();
+        operationLinkCbos.stream().forEach(cbo->{
+            String operationOid = cbo.getAttributeValue("ploperoid");
+            int orderNo = VciBaseUtil.getInt(cbo.getAttributeValue("plno"));
+            if(hasRight(rightValue,orderNo)){
+                hasRightOids.add(operationOid);
+                oidOrderMap.put(operationOid,orderNo);
+            }
+        });
+        if(CollectionUtils.isEmpty(hasRightOids)){
+            //娌℃湁鏉冮檺
+            return new ArrayList<>();
+        }
+        sql = "select ploid as oid,plname,pluniqueflag,pldesc,plalias,plsequence from ploperation where ploid in (" + VciBaseUtil.toInSql(hasRightOids.toArray(new String[0])) + ")";
+        List<ClientBusinessObject> opertionCBOs = boService.queryBySql(sql, new HashMap<>());
+        List<SmOperationVO> operationVOS = new ArrayList<>();
+        Optional.ofNullable(opertionCBOs).orElseGet(()->new ArrayList<>()).stream().forEach(cbo->{
+            SmOperationVO operationVO = new SmOperationVO();
+            operationVO.setFunctionOid(functionOid);
+            operationVO.setOid(cbo.getOid());
+            operationVO.setUniqueFlag(cbo.getAttributeValue("pluniqueflag"));
+            operationVO.setName(cbo.getAttributeValue("plname"));
+            operationVO.setAlias(cbo.getAttributeValue("plalias"));
+            operationVO.setOrderNo(String.valueOf(oidOrderMap.get(operationVO.getOid())));
+            operationVO.setDescription(cbo.getAttributeValue("pldesc"));
+            operationVO.setModuleNo(functionId);
+            operationVOS.add(operationVO);
+        });
+        List<SmOperationVO> operationVOList = operationVOS.stream().sorted(((o1, o2) -> o1.getOrderNo().compareTo(o2.getOrderNo()))).collect(Collectors.toList());
+        return operationVOList;
+    }
+
+    /**
+     * 鏄惁鏈夋潈闄�
+     * @param rightValue 鏉冮檺鐨勫��
+     * @param operNum 鎿嶄綔鐨勪綅缃彿
+     * @return true琛ㄧず鏈夋潈闄愶紝false琛ㄧず娌℃湁
+     */
+    private boolean hasRight(long rightValue, int operNum) {
+        boolean res = false;
+        long preValue = (long) Math.pow(2, operNum);
+        if (preValue == (rightValue & preValue)) {
+            res = true;
+        }
+        return res;
+    }
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/UIDataServiceImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/UIDataServiceImpl.java
new file mode 100644
index 0000000..7c79482
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/UIDataServiceImpl.java
@@ -0,0 +1,2468 @@
+package com.vci.web.service.impl;
+
+import com.vci.corba.common.VCIError;
+import com.vci.file.pagemodel.VciFileObjectVO;
+import com.vci.frameworkcore.lcstatuspck.FrameworkDataLCStatus;
+import com.vci.frameworkcore.lcstatuspck.ReleaseDataLCStatus;
+import com.vci.starter.revision.bo.TreeWrapperOptions;
+import com.vci.starter.revision.service.RevisionModelUtil;
+import com.vci.starter.web.annotation.bus.VciChangeDataAfter;
+import com.vci.starter.web.annotation.bus.VciChangeDataBefore;
+import com.vci.starter.web.annotation.bus.VciChangeDataPlugin;
+import com.vci.starter.web.constant.FrameWorkLcStatusConstant;
+import com.vci.starter.web.constant.QueryOptionConstant;
+import com.vci.starter.web.enumpck.VciChangeDocumentTypeEnum;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.model.BaseModel;
+import com.vci.starter.web.pagemodel.*;
+import com.vci.starter.web.util.*;
+import com.vci.starter.web.wrapper.VciQueryWrapperForDO;
+import com.vci.web.dto.*;
+import com.vci.web.enumpck.UIComponentTypeEnum;
+import com.vci.web.enumpck.UIFieldTypeEnum;
+import com.vci.web.enumpck.UITreeLoadTypeEnum;
+import com.vci.web.model.BaseLinkModel;
+import com.vci.web.pageModel.*;
+import com.vci.web.query.UIDataGridQuery;
+import com.vci.web.query.UIFormQuery;
+import com.vci.web.query.UILinkTypeDataQuery;
+import com.vci.web.query.UITreeQuery;
+import com.vci.web.service.*;
+import com.vci.web.util.PlatformClientUtil;
+import com.vci.web.util.WebUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import plm.bs.bom.clientobject.*;
+import plm.bs.bom.common.*;
+import plm.corba.qt.BOAndLO;
+
+import java.lang.reflect.Method;
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static com.vci.frameworkcore.constant.FrameWorkBusLangCodeConstant.DATA_OID_NOT_EXIST;
+
+/**
+ * UI涓婄殑鏁版嵁鏌ヨ
+ * @author weidy
+ * @date 2021/3/3
+ */
+@Service
+public class UIDataServiceImpl implements UIDataServiceI {
+
+    /**
+     * 骞冲彴鐨勮皟鐢ㄥ鎴风
+     */
+    @Autowired
+    private PlatformClientUtil platformClientUtil;
+
+    /**
+     * UI鐨勬湇鍔�
+     */
+    @Autowired
+    private UIEngineServiceI uiEngineService;
+
+    /**
+     * 涓氬姟绫诲瀷
+     */
+    @Autowired
+    private OsBtmServiceI btmService;
+
+    /**
+     * 閾炬帴绫诲瀷
+     */
+    @Autowired
+    private OsLinkTypeServiceI linkTypeService;
+
+    /**
+     * 涓氬姟绫诲瀷鎿嶄綔
+     */
+    @Autowired
+    private WebBoServiceI boService;
+
+    /**
+     * 閾炬帴绫诲瀷鎿嶄綔
+     */
+    @Autowired
+    private WebLoServiceI loService;
+
+    /**
+     * 鐢熷懡鍛ㄦ湡鐨勬湇鍔�
+     */
+    @Autowired
+    private OsLifeCycleServiceI lifeCycleService;
+
+    /**
+     * 鐗堟湰瑙勫垯鐨勬湇鍔�
+     */
+    @Autowired
+    private OsRevisionRuleServiceI revisionRuleServiceI;
+
+    /**
+     * 鏂囦欢鐨勬湇鍔�
+     */
+    @Autowired
+    private VciFileObjectServiceI fileObjectService;
+
+    /**
+     * 灞炴�х殑鏈嶅姟
+     */
+    @Autowired
+    private OsAttributeServiceI attributeService;
+
+    /**
+     * from绔殑鍓嶇紑
+     */
+    public static final String LO_FROM_PREFIX="f_oid.";
+
+    /**
+     * to绔殑鍓嶇紑
+     */
+    public static final String LO_TO_PREFIX = "t_oid.";
+
+    /**
+     * 鑾峰彇琛ㄦ牸鐨勬暟鎹�
+     *
+     * @param dataGridQuery 琛ㄦ牸鏌ヨ锛屽繀椤绘湁涓氬姟绫诲瀷鍚嶇О鍜� 琛ㄦ牸鐨勭紪鍙�
+     * @return DataGrid涓璬ata涓篗ap<String, String>鏍煎紡
+     * @throws VciBaseException 鏌ヨ鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public DataGrid getDataForGrid(UIDataGridQuery dataGridQuery) throws VciBaseException {
+        VciBaseUtil.alertNotNull(dataGridQuery,"鏌ヨ瀵硅薄",dataGridQuery.getBtmname(),"涓氬姟绫诲瀷",dataGridQuery.getTableDefineId());
+        //鍏堝垽鏂煡璇㈡ā鏉�
+        UITableDefineVO tableDefineVO = uiEngineService.getComponentByOid(dataGridQuery.getComponentOid()).getTableDefineVO();
+        String queryTemplate = !CollectionUtils.isEmpty(dataGridQuery.getSourceData())?dataGridQuery.getSourceData().getOrDefault("querytemplate",tableDefineVO.getQueryTemplateName()):tableDefineVO.getQueryTemplateName();
+        if(StringUtils.isBlank(queryTemplate)){
+            //璇存槑娌℃湁璁剧疆鏌ヨ妯℃澘锛岄渶瑕佺湅鐪嬪湪杩欎釜琛ㄦ牸鎵�鍦ㄧ殑缁勪欢鏈夋病鏈夎缃�
+            tableDefineVO = uiEngineService.getTableById(dataGridQuery.getBtmname(), dataGridQuery.getTableDefineId());
+            queryTemplate = tableDefineVO.getQueryTemplateName();
+        }
+        //鐪嬬湅鏈夋病鏈夎嚜瀹氫箟鐨凷QL
+        Set<String> queryFieldList = new HashSet<>();
+        tableDefineVO.getCols().forEach(cols->{
+            //鑾峰彇鍙傜収
+            List<UITableFieldVO> referFieldList = cols.stream().filter(s -> UIFieldTypeEnum.REFER.getValue().equalsIgnoreCase(s.getFieldType())).collect(Collectors.toList());
+            if(!CollectionUtils.isEmpty(referFieldList)){
+                referFieldList.stream().forEach(field->{
+                    queryFieldList.add(field.getField());
+                    if(StringUtils.isNotBlank(field.getShowField())) {
+                        queryFieldList.add(field.getShowField());
+                    }
+                });
+            }
+            Map<String, String> comboxMap = cols.stream().filter(s -> UIFieldTypeEnum.COMBOX.getValue().equalsIgnoreCase(s.getFieldType()) && StringUtils.isNotBlank(s.getComboxKey())).collect(Collectors.toList()).stream().collect(Collectors.toMap(s -> s.getField(), t -> t.getComboxKey()));
+            if(!CollectionUtils.isEmpty(comboxMap)) {
+                comboxMap.forEach((field,comboxKey)->{
+                    queryFieldList.add(comboxKey+"_" + field.substring(0,field.length()-4) + "#" + field);
+                });
+            }
+            queryFieldList.addAll(cols.stream().filter(s -> !UIFieldTypeEnum.REFER.getValue().equalsIgnoreCase(s.getFieldType()) && !UIFieldTypeEnum.COMBOX.getValue().equalsIgnoreCase(s.getFieldType())).map(s -> s.getField()).collect(Collectors.toList()));
+        });
+
+        //閽堝鍙傜収鐨勶紝鎴戜滑闇�瑕佹坊鍔犲搴旂殑
+        //杩欎釜涓氬姟绫诲瀷鍖呭惈鐨勫睘鎬�
+        OsBtmTypeVO btmTypeVO = null;
+        OsLinkTypeVO linkTypeVO = null;
+        if(dataGridQuery.isLinkTypeFlag()){
+            linkTypeVO = linkTypeService.getLinkTypeById(dataGridQuery.getBtmname());
+            queryFieldList.addAll(linkTypeVO.getAttributes().stream().map(OsLinkTypeAttributeVO::getId).collect(Collectors.toList()));
+            queryFieldList.addAll(WebLoServiceImpl.LO_BASE_FIELD_MAP.values());
+        }else{
+            btmTypeVO = btmService.getBtmById(dataGridQuery.getBtmname());
+            queryFieldList.addAll(btmTypeVO.getAttributes().stream().map(OsBtmTypeAttributeVO::getId).collect(Collectors.toList()));
+            queryFieldList.addAll(WebBoServiceImpl.BO_BASE_FIELD_MAP.values());
+        }
+        queryFieldList.add("creator_name");
+        queryFieldList.add("lastmodifier_name");
+        //鎴戜滑鍦ㄥ悗鍙版煡璇笟鍔℃暟鎹�
+        Map<String, String> replaceMap = wrapperReplaceMap( dataGridQuery.getSourceData());
+
+        if(dataGridQuery.isLinkTypeFlag()){
+            UILinkTypeDataQuery linkTypeDataQuery = new UILinkTypeDataQuery();
+            linkTypeDataQuery.setQueryTemplateName(queryTemplate);
+            linkTypeDataQuery.setReplaceMap(replaceMap);
+            linkTypeDataQuery.setConditionMap(dataGridQuery.getConditionMap());
+            linkTypeDataQuery.setClauseList(queryFieldList);
+            linkTypeDataQuery.setLinkType(dataGridQuery.getBtmname());
+            if(dataGridQuery.isTreeTableFlag()){
+                linkTypeDataQuery.setLevel(-1);
+            }
+            return loService.queryGridByScheme(linkTypeDataQuery);
+        }else {
+            return boService.queryGridByScheme(queryTemplate,
+                    dataGridQuery.getConditionMap(), replaceMap, dataGridQuery.getPageHelper(), queryFieldList.stream().collect(Collectors.toList()));
+        }
+        //鐢熷懡鍛ㄦ湡鍦ㄥ叾涓煡璇㈠悗灏变細澶勭悊
+        //鏋氫妇涔熶細琚鐞嗕簡
+    }
+
+    /**
+     * 鑾峰彇琛ㄥ崟鐨勬暟鎹�
+     *
+     * @param formQuery 琛ㄥ崟鐨勬煡璇㈡潯浠�
+     * @return 琛ㄥ崟鐨勬暟鎹�
+     * @throws VciBaseException 鏌ヨ鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public UIFormDataVO getDataForForm(UIFormQuery formQuery) throws VciBaseException {
+        VciBaseUtil.alertNotNull(formQuery,"琛ㄥ崟鐨勬煡璇㈠璞�",formQuery.getBtmname(),"涓氬姟绫诲瀷鐨勪俊鎭�",formQuery.getOid(),"涓氬姟鏁版嵁鐨勪富閿�",formQuery.getFormDefineId(),"琛ㄥ崟鐨勫畾涔夌紪鍙�");
+        UIFormDefineVO formDefineVO = uiEngineService.getFormById(formQuery.getBtmname(),formQuery.getFormDefineId());
+        String queryTemplate = !CollectionUtils.isEmpty(formQuery.getSourceData())?formQuery.getSourceData().getOrDefault("querytemplate",formDefineVO.getQueryTemplateName()):formDefineVO.getQueryTemplateName();
+        Set<String> queryFieldList = formDefineVO.getItems().stream().filter(s->!UIFieldTypeEnum.CUSTOM.getValue().equalsIgnoreCase(s.getType())).map(UIFormItemVO::getField).collect(Collectors.toSet());
+        //鑾峰彇鍙傜収
+        List<UIFormItemVO> referFieldList = formDefineVO.getItems().stream().filter(s -> UIFieldTypeEnum.REFER.getValue().equalsIgnoreCase(s.getType())).collect(Collectors.toList());
+        if(!CollectionUtils.isEmpty(referFieldList)){
+            referFieldList.stream().forEach(field->{
+                queryFieldList.add(field.getField());
+                if(StringUtils.isNotBlank(field.getShowField())) {
+                    queryFieldList.add(field.getShowField());
+                }
+            });
+        }
+        Map<String, String> comboxMap = formDefineVO.getItems().stream().filter(s -> UIFieldTypeEnum.COMBOX.getValue().equalsIgnoreCase(s.getType()) && StringUtils.isNotBlank(s.getComboxKey())).collect(Collectors.toList()).stream().collect(Collectors.toMap(s -> s.getField(), t -> t.getComboxKey()));
+        if(!CollectionUtils.isEmpty(comboxMap)) {
+            comboxMap.forEach((field,comboxKey)->{
+                //瑕佹妸鏋氫妇鐨勫睘鎬ф煡璇㈠嚭鏉ワ紝鍜岃〃鏍奸鍦版柟涓嶄竴鏍凤紝鍥犱负閭h竟浼氭妸field鐩存帴鍔犱簡text
+                queryFieldList.add(comboxKey+"_" + field + "#" + field +"text");
+            });
+        }
+        //杩欎釜涓氬姟绫诲瀷鍖呭惈鐨勫睘鎬�
+        OsBtmTypeVO btmTypeVO = null;
+        OsLinkTypeVO linkTypeVO = null;
+        if(formDefineVO.isLinkTypeFlag()){
+            linkTypeVO = linkTypeService.getLinkTypeById(formQuery.getBtmname());
+            queryFieldList.addAll(linkTypeVO.getAttributes().stream().map(OsLinkTypeAttributeVO::getId).collect(Collectors.toList()));
+            queryFieldList.addAll(WebLoServiceImpl.LO_BASE_FIELD_MAP.values());
+        }else{
+            btmTypeVO = btmService.getBtmById(formQuery.getBtmname());
+            queryFieldList.addAll(btmTypeVO.getAttributes().stream().map(OsBtmTypeAttributeVO::getId).collect(Collectors.toList()));
+        }
+        queryFieldList.add("creator_name");
+        queryFieldList.add("lastmodifier_name");
+        Map<String,String> conditionMap = WebUtil.getOidQuery(formQuery.getOid());
+        Map<String, String> replaceMap = wrapperReplaceMap(formQuery.getSourceData());
+        UIFormDataVO formDataVO = new UIFormDataVO();
+        replaceMap.put("oid", formQuery.getOid().trim());
+        if(!formDefineVO.isLinkTypeFlag()) {
+            List<ClientBusinessObject> cbos = null;
+            if (StringUtils.isNotBlank(queryTemplate)) {
+                replaceMap.put("oid", formQuery.getOid().trim());
+                cbos = boService.queryCBOByScheme(queryTemplate, conditionMap, replaceMap, null, queryFieldList.stream().collect(Collectors.toList()));
+            } else {
+                //娌℃湁鏌ヨ妯℃澘锛岄偅鎴戜滑灏辩洿鎺ヤ富閿拰涓氬姟绫诲瀷鍘绘煡璇�
+                cbos = boService.queryCBO(formQuery.getBtmname(), conditionMap, null, queryFieldList.stream().collect(Collectors.toList()));
+            }
+            if (!CollectionUtils.isEmpty(cbos)) {
+                ClientBusinessObject cbo = cbos.get(0);
+                formDataVO.setData(boService.cbo2Map(cbo));
+            } else {
+                throw new VciBaseException(DATA_OID_NOT_EXIST);
+            }
+        }else{
+            UILinkTypeDataQuery linkTypeDataQuery = new UILinkTypeDataQuery();
+            linkTypeDataQuery.setQueryTemplateName(queryTemplate);
+            linkTypeDataQuery.setReplaceMap(replaceMap);
+            linkTypeDataQuery.setConditionMap(conditionMap);
+            linkTypeDataQuery.setClauseList(queryFieldList);
+            linkTypeDataQuery.setLinkType(formQuery.getBtmname());
+            //linkTypeDataQuery.setDirection(formQuery.isOrientation());
+            //linkTypeDataQuery.setToBtmType(treeDefineVO.getBtmType());
+            DataGrid dataGrid = loService.queryGridByScheme(linkTypeDataQuery);
+            if (dataGrid != null && !CollectionUtils.isEmpty(dataGrid.getData())) {
+                formDataVO.setData((Map<String, Object>) dataGrid.getData().get(0));
+            }
+        }
+        //鏌ヨ闄勪欢
+        formDataVO.setAttachmentFileVOs(fileObjectService.listFilesByOwnbiz(formQuery.getOid(), formQuery.getBtmname(), "attachment"));
+        List<UIFormItemVO> fileItems = formDefineVO.getItems().stream().filter(s -> UIFieldTypeEnum.FILE.getValue().equalsIgnoreCase(s.getType())).collect(Collectors.toList());
+        if(!CollectionUtils.isEmpty(fileItems)){
+            //瀛楁鐨勫睘鎬ц偗瀹氫笉浼氳秴杩�1000涓�
+            //鏌ヨ杩欎簺鐨勫��
+            List<String> filePathList = new ArrayList<>();
+            fileItems.stream().forEach(field->{
+                Object value = formDataVO.getData().getOrDefault(field.getField(),null);
+                if(value!=null && StringUtils.isNotBlank(value.toString())){
+                    filePathList.add(value.toString());
+                }
+            });
+            List<VciFileObjectVO> fileObjectVOS = fileObjectService.listFileObjectByPath(filePathList, "filePathField");
+            if(!CollectionUtils.isEmpty(fileObjectVOS)){
+                Map<String,VciFileObjectVO> fileObjectVOMap = fileObjectVOS.stream().collect(Collectors.toMap(s->s.getFilePath(),t->t,(o1,o2)->o2));
+                Map<String,VciFileObjectVO> fieldFileVOMap = new HashMap<>();
+                fileItems.stream().forEach(field->{
+                    Object value = formDataVO.getData().getOrDefault(field.getField(),null);
+                    if(value!=null){
+                        VciFileObjectVO fileObjectVO = fileObjectVOMap.getOrDefault(value.toString(),null);
+                        if(fileObjectVO!=null){
+                            fieldFileVOMap.put(field.getField(),fileObjectVO);
+                        }
+                    }
+                });
+                formDataVO.setFilePathFieldMap(fieldFileVOMap);
+            }
+        }
+        return formDataVO;
+    }
+
+    /**
+     * 灏佽replaceMap
+
+     * @param sourceDataMap 鏉ユ簮鏁版嵁
+     * @return 鏇挎崲鍚庣殑鍊�
+     */
+    private Map<String,String> wrapperReplaceMap(Map<String,String> sourceDataMap){
+        Map<String,String> replaceMap =!CollectionUtils.isEmpty(sourceDataMap)? sourceDataMap:new HashMap<>();
+        if(!replaceMap.containsKey("f_oid")){
+            replaceMap.put("f_oid",replaceMap.getOrDefault("oid",""));
+        }
+        if(replaceMap.get("f_oid").contains(TREE_NODE_ID_SEP)){
+            replaceMap.put("f_oid",replaceMap.get("f_oid").split(TREE_NODE_ID_SEP)[1]);
+        }
+        return replaceMap;
+    }
+
+    /**
+     * 鏍戣妭鐐圭殑鍒嗛殧绗︿笉涓�鏍�
+     */
+    private static final String TREE_NODE_ID_SEP = "@vcitreesep@";
+    /**
+     * 鑾峰彇鏍戝舰鏁版嵁
+     *
+     * @param treeQuery 鏍戝舰鏌ヨ鏉′欢
+     * @return 鏍戝舰鏁版嵁
+     * @throws VciBaseException 鏌ヨ鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public List<Tree> getDataForTree(UITreeQuery treeQuery) throws VciBaseException {
+        VciBaseUtil.alertNotNull(treeQuery,"琛ㄥ崟鐨勬煡璇㈠璞�",treeQuery.getBtmname(),"涓氬姟绫诲瀷鐨勪俊鎭�",treeQuery.getComponentOid(),"鏍戞墍鍦ㄧ殑缁勪欢鐨勪富閿�");
+        UIComponentVO componentVO = uiEngineService.getComponentByOid(treeQuery.getComponentOid());
+        if(componentVO == null || StringUtils.isBlank(componentVO.getOid())){
+            throw new VciBaseException("鏍戠殑閰嶇疆淇℃伅娌℃湁鑾峰彇鍒�");
+        }
+        //鏍戝舰鏈変袱绉嶏紝涓�绉嶆槸涓氬姟绫诲瀷閲岃嚜鍙傜収锛屼竴绉嶆槸閾炬帴绫诲瀷
+        UITreeDefineVO treeDefineVO = componentVO.getTreeDefineVO();
+        if(treeDefineVO == null){
+            throw new VciBaseException("杩欎釜缁勪欢涓嶆槸鏍�");
+        }
+        if(!treeQuery.isLinkTypeFlag() && StringUtils.isBlank(treeQuery.getParentBtmName())){
+            treeQuery.setParentBtmName(treeQuery.getBtmname());
+        }
+
+        if(treeQuery.getConditionMap() == null){
+            treeQuery.setConditionMap(new HashMap<>());
+        }
+        if(treeQuery.getExtandParamsMap() != null){
+            treeQuery.getConditionMap().putAll(treeQuery.getExtandParamsMap());
+        }
+        String parentFieldName = treeQuery.getParentFieldName();
+        if(parentFieldName.contains(",")){
+            parentFieldName = parentFieldName.split(",")[0];
+        }
+        if(StringUtils.isNotBlank(parentFieldName)){
+            if(StringUtils.isNotBlank(treeQuery.getParentOid())){
+                treeQuery.getConditionMap().put(parentFieldName,treeQuery.getParentOid());
+            }
+        }
+        if(StringUtils.isNotBlank(treeQuery.getParentOid()) && treeQuery.getParentOid().contains(TREE_NODE_ID_SEP)){
+            treeQuery.setParentOid(treeQuery.getParentOid().split(TREE_NODE_ID_SEP)[1]);
+        }
+        String queryTemplate = StringUtils.isNotBlank(treeQuery.getQueryTemplate())?treeQuery.getQueryTemplate():(!CollectionUtils.isEmpty(treeQuery.getSourceData())?treeQuery.getSourceData().getOrDefault("querytemplate",treeDefineVO.getQueryTemplateName()):treeDefineVO.getQueryTemplateName());
+        String valueField = treeQuery.isLinkTypeFlag()?(!treeDefineVO.isOrientation()?"${oid}" + TREE_NODE_ID_SEP + "${t_oid}":"${oid}" + TREE_NODE_ID_SEP + "${f_oid}"):(StringUtils.isNotBlank(treeQuery.getValueField())?treeQuery.getValueField():"oid");
+        String textField = StringUtils.isNotBlank(treeDefineVO.getTreeNodeExpression())?treeDefineVO.getTreeNodeExpression():(StringUtils.isNotBlank(treeQuery.getTextField())?treeQuery.getTextField():"name");
+        List<Tree> rootTreeList = new ArrayList<>();
+        List<String> queryFieldList = new ArrayList<>();
+        queryFieldList.add("creator_name");
+        queryFieldList.add("lastmodifier_name");
+        String rootExpress = StringUtils.isNotBlank(treeQuery.getRootExpress())?treeQuery.getRootExpress():treeDefineVO.getRootContent();
+        Map<String, String> replaceMap = wrapperReplaceMap(treeQuery.getSourceData());
+        if(StringUtils.isBlank(treeDefineVO.getLinkType())){
+            //杩欎釜鏄笟鍔$被鍨嬬殑鑷弬鐓�
+            //浠ュ墠鐨勫钩鍙版病鏈夊鑷弬鐓ц繖绉嶆湁鍏ㄩ儴鏌ヨ鐨�
+            OsBtmTypeVO btmTypeVO = btmService.getBtmById(treeDefineVO.getBtmType());
+            queryFieldList.addAll(btmTypeVO.getAttributes().stream().map(OsBtmTypeAttributeVO::getId).collect(Collectors.toList()));
+            queryFieldList.addAll(WebBoServiceImpl.BO_BASE_FIELD_MAP.values());
+
+            addQueryField(queryFieldList,valueField);
+            addQueryField(queryFieldList,textField);
+
+            if(treeQuery.isQueryRoot()){
+                //鏄煡璇㈡牴鑺傜偣
+                List<ClientBusinessObject> rootCbos = null;
+                if(StringUtils.isNotBlank(queryTemplate)){
+                    //璇存槑鏄彍鍗曢噷瀹氫箟浜嗘煡璇㈡ā鏉跨殑
+                    rootCbos = boService.queryCBOByScheme(queryTemplate, null, replaceMap);
+                }else{
+                    //璇存槑娌℃湁浼犻�掞紝杩欓渶瑕佸吋瀹逛互鍓嶇殑鏂瑰紡锛屽氨鏄湪showLinkAps閲岃缃�
+                    String parentFieldNameAndValue = treeDefineVO.getShowLinkAbs();
+                    if(StringUtils.isBlank(parentFieldNameAndValue) || !parentFieldNameAndValue.contains(",")){
+                        throw new VciBaseException("閰嶇疆鐨勪俊鎭湁璇�傚湪娌℃湁鍦ㄨ彍鍗曟垨鑰呮潵婧愭暟鎹缃牴鑺傜偣鐨勬煡璇㈡ā鏉挎椂锛岃鍦ㄦ爲鐨勩�愬弬鐓ф爲銆戜笂璁剧疆涓婄骇瀛楁鐨勫悕绉板拰鏍硅妭鐐圭殑鏌ヨ鐨勫�笺�傛瘮濡倄xxx,yyy銆傚叾涓瓁xxx鏄笂绾у瓧娈佃嫳鏂囧悕绉�");
+                    }
+                    parentFieldName= parentFieldNameAndValue.split(",")[0];
+                    String rootQueryValue = parentFieldNameAndValue.split(",")[1];
+                    treeQuery.getConditionMap().put(parentFieldName,rootQueryValue);
+                    replaceMap.put(parentFieldName,rootQueryValue);
+                    replaceMap.put("f_oid",rootQueryValue);
+                    if(StringUtils.isNotBlank(queryTemplate)){
+                        rootCbos = boService.queryCBOByScheme(queryTemplate,treeQuery.getConditionMap(),replaceMap,null,queryFieldList);
+                    }else{
+                        rootCbos = boService.queryCBO(treeDefineVO.getBtmType(),treeQuery.getConditionMap(),null,queryFieldList);
+                    }
+                }
+                if(!CollectionUtils.isEmpty(rootCbos)){
+                    rootTreeList = cbo2Trees(rootCbos,valueField,StringUtils.isBlank(rootExpress)?textField:rootExpress,parentFieldName,treeQuery.isShowCheckBox(),null);
+                    TreeQueryObject treeQueryObject = new TreeQueryObject();
+                    treeQueryObject.setValueField(valueField);
+                    treeQueryObject.setTextField(textField);
+                    treeQueryObject.setParentFieldName(parentFieldName);
+                    treeQueryObject.setShowCheckBox(treeQuery.isShowCheckBox());
+                    if(UITreeLoadTypeEnum.ALL.getValue().equalsIgnoreCase(treeDefineVO.getLoadType())){
+                        treeQueryObject.setQueryAllLevel(true);
+                    }
+                    queryTreeForBO(rootTreeList,treeDefineVO.getQueryTemplateName(),queryFieldList,treeQueryObject);
+                }
+                return rootTreeList;
+            }else{
+                //杩欎釜涓嶆槸璺熻妭鐐癸紝浣嗘槸涓�鑸彧鏄鍔犱竴涓�愮骇鏌ヨ锛屽洜涓哄叏閮ㄦ煡璇㈢殑鏃跺�欙紝鍦ㄦ牴鑺傜偣宸茬粡鍏ㄩ儴鏌ヨ瀹屼簡
+                List<ClientBusinessObject> thisChildren = null;
+                if (StringUtils.isNotBlank(queryTemplate)) {
+                    thisChildren = boService.queryCBOByScheme(queryTemplate, treeQuery.getConditionMap(), replaceMap, null, queryFieldList);
+                } else {
+
+                    thisChildren = boService.queryCBO(treeQuery.getParentBtmName(), treeQuery.getConditionMap(), null, queryFieldList);
+                }
+                return cbo2Trees(thisChildren, valueField, textField, parentFieldName, treeQuery.isShowCheckBox(), null);
+            }
+        }else{
+            OsLinkTypeVO linkTypeVO = linkTypeService.getLinkTypeById(treeDefineVO.getLinkType());
+            queryFieldList.addAll(linkTypeVO.getAttributes().stream().map(OsLinkTypeAttributeVO::getId).collect(Collectors.toList()));
+            queryFieldList.addAll(WebLoServiceImpl.LO_BASE_FIELD_MAP.values());
+
+            addQueryField(queryFieldList,valueField);
+            addQueryField(queryFieldList,textField);
+            UILinkTypeDataQuery linkTypeDataQuery = new UILinkTypeDataQuery();
+            linkTypeDataQuery.setQueryTemplateName(queryTemplate);
+            linkTypeDataQuery.setReplaceMap(replaceMap);
+            linkTypeDataQuery.setConditionMap(treeQuery.getConditionMap());
+            linkTypeDataQuery.setParentOid(treeQuery.getParentOid());
+            linkTypeDataQuery.setClauseList(queryFieldList);
+            linkTypeDataQuery.setDirection(treeDefineVO.isOrientation());
+            linkTypeDataQuery.setToBtmType(treeDefineVO.getBtmType());
+            linkTypeDataQuery.setLinkType(treeDefineVO.getLinkType());
+            if(UITreeLoadTypeEnum.ALL.getValue().equalsIgnoreCase(treeDefineVO.getLoadType())){
+                linkTypeDataQuery.setQueryAllLevel(true);
+            }
+            if(treeQuery.isQueryRoot()){
+                //鏌ヨ鏍硅妭鐐�.鎴戜滑闇�瑕佸垽鏂槸鍚﹁缃簡鏍硅妭鐐圭殑鏌ヨ鏉′欢
+                List<BOAndLO> rootCbos = null;
+                String parentFieldNameAndValue = treeDefineVO.getShowLinkAbs();
+                if(StringUtils.isNotBlank(parentFieldNameAndValue)){
+                    if(StringUtils.isNotBlank(queryTemplate)){
+                        linkTypeDataQuery.setQueryAllLevel(false);
+                        //鏍硅妭鐐瑰彧鏌ヨ涓�娆�
+                        //浣跨敤鏌ヨ妯℃澘鏈韩璁剧疆鐨勫唴瀹�
+                        linkTypeDataQuery.setToBtmType(null);
+                        linkTypeDataQuery.setQueryTemplateName(queryTemplate);
+                        rootCbos = loService.queryCLOAndBOBySchema(linkTypeDataQuery);
+                    }else{
+                        String rootQueryValue = "";
+                        parentFieldName = parentFieldNameAndValue.split(",")[0];
+                        rootQueryValue = parentFieldNameAndValue.split(",")[1];
+                        treeQuery.getConditionMap().put(parentFieldName,rootQueryValue);
+                        linkTypeDataQuery.setQueryAllLevel(false);
+                        linkTypeDataQuery.setLinkType(treeDefineVO.getLinkType());
+                        linkTypeDataQuery.setParentOid(rootQueryValue);
+                        rootCbos = loService.queryCLOAndBoByLinkType(linkTypeDataQuery);
+                    }
+                    if(!CollectionUtils.isEmpty(rootCbos)){
+                        if(StringUtils.isBlank(parentFieldName)){
+                            if(treeDefineVO.isOrientation()){
+                                parentFieldName = "t_oid";
+                            }else{
+                                parentFieldName = "f_oid";
+                            }
+                        }
+                        rootTreeList = cloAndCbo2Trees(rootCbos,valueField,rootExpress,parentFieldName,treeQuery.isShowCheckBox(),null);
+                        linkTypeDataQuery.setLinkType(treeDefineVO.getLinkType());
+                        linkTypeDataQuery.setQueryTemplateName(queryTemplate);
+                        if(UITreeLoadTypeEnum.ALL.getValue().equalsIgnoreCase(treeDefineVO.getLoadType())){
+                            linkTypeDataQuery.setQueryAllLevel(true);
+                        }
+                        queryTreeForLO(rootTreeList,linkTypeDataQuery,parentFieldName,valueField,textField,treeQuery.isShowCheckBox());
+                    }
+                    return rootTreeList;
+                }else{
+                    //娌℃湁璁剧疆鏌ヨ鏉′欢銆傞偅灏辨槸鎶婃潵婧愭暟鎹綔涓烘牴鑺傜偣
+                    if(CollectionUtils.isEmpty(replaceMap)){
+                        throw new VciBaseException("鏍硅妭鐐规病鏈夐厤缃煡璇㈡潯浠讹紝涔熸病鏈夋潵婧愭暟鎹�");
+                    }
+                    Tree root = new Tree();
+                    root.setOid(replaceMap.getOrDefault("oid",replaceMap.getOrDefault("t_oid","")));
+                    root.setText(getValueByExpressForBOAndLO(new HashMap<>(),replaceMap,rootExpress));
+                    root.setAttributes(replaceMap);
+                    root.setIndex("0");
+                    rootTreeList.add(root);
+
+                    if(StringUtils.isBlank(parentFieldName)){
+                        if(treeDefineVO.isOrientation()){
+                            parentFieldName = "t_oid";
+                        }else{
+                            parentFieldName = "f_oid";
+                        }
+                    }
+                    linkTypeDataQuery.setLinkType(treeDefineVO.getLinkType());
+                    linkTypeDataQuery.setQueryTemplateName(queryTemplate);
+                    if(UITreeLoadTypeEnum.ALL.getValue().equalsIgnoreCase(treeDefineVO.getLoadType())){
+                        linkTypeDataQuery.setQueryAllLevel(true);
+                    }
+                    queryTreeForLO(rootTreeList,linkTypeDataQuery,parentFieldName,valueField,textField,treeQuery.isShowCheckBox());
+                    return rootTreeList;
+                }
+            }else{
+                if(StringUtils.isNotBlank(treeQuery.getParentOid())){
+                    //鏈変笂绾т簡銆傞偅replace鐨刦_oid灏卞簲璇ヨ缃负涓婄骇
+                    if(linkTypeDataQuery.getReplaceMap() == null){
+                        linkTypeDataQuery.setReplaceMap(new HashMap<>());
+                    }
+                    linkTypeDataQuery.getReplaceMap().put(treeDefineVO.isOrientation()?"t_oid":"f_oid",treeQuery.getParentOid());
+                }
+                return cloAndCbo2Trees(loService.queryCLOAndBoByLinkType(linkTypeDataQuery),valueField,textField,parentFieldName,treeQuery.isShowCheckBox(),treeQuery.getParentOid());
+            }
+        }
+    }
+
+    /**
+     * 涓氬姟绫诲瀷鐨勫睘鎬ф煡璇�
+     * @param rootTreeList 鏍硅妭鐐圭殑鍐呭
+     * @param queryTemplate 鏌ヨ妯℃澘
+     * @param queryFieldList 鏌ヨ鐨勫瓧娈�
+     * @param treeQueryObject 鏍戝舰鏌ヨ瀵硅薄锛岄渶瑕乿alueField鍜宼extField锛岃繕鏈塸arentFieldName,鍜宑heckBox
+     */
+    private void queryTreeForBO(List<Tree> rootTreeList, String queryTemplate,List<String> queryFieldList,TreeQueryObject treeQueryObject) {
+        for (Tree rootTree : rootTreeList) {
+            List<ClientBusinessObject> thisChildren = null;
+            Map<String,String> sourceDataMap = rootTree.getAttributes();
+            sourceDataMap.put("f_oid",rootTree.getOid());
+            Map<String,String> conditionMap = new HashMap<>();
+            conditionMap.put(treeQueryObject.getParentFieldName(),rootTree.getOid());
+            if (StringUtils.isNotBlank(queryTemplate)) {
+                thisChildren = boService.queryCBOByScheme(queryTemplate, conditionMap, sourceDataMap, null, queryFieldList);
+            } else {
+                thisChildren = boService.queryCBO(sourceDataMap.getOrDefault("btmname",sourceDataMap.getOrDefault("btmName",treeQueryObject.getParentBtmName())), conditionMap, null, queryFieldList);
+            }
+            List<Tree> childrenTree = cbo2Trees(thisChildren, treeQueryObject.getValueField(), treeQueryObject.getTextField(), treeQueryObject.getParentFieldName(), treeQueryObject.isShowCheckBox(), null);
+            rootTree.setChildren(childrenTree);
+            if(treeQueryObject.isQueryAllLevel() && !CollectionUtils.isEmpty(childrenTree) ) {
+                queryTreeForBO(childrenTree,queryTemplate,queryFieldList,treeQueryObject);
+            }
+        }
+    }
+
+    /**
+     * 鏌ヨ閾炬帴绫诲瀷鐨勬爲褰俊鎭�
+     * @param rootTreeList 鏍硅妭鐐�
+     * @param linkTypeDataQuery 閾炬帴绫诲瀷鏌ヨ瀵硅薄
+     * @param parentFieldName 涓婄骇鐨勪富閿殑灞炴��
+     * @param valueField 鍊艰〃杈惧紡
+     * @param textField 鏄剧ず琛ㄨ揪寮�
+     * @param showCheckBox 鏄惁鏄剧ず澶嶉�夋
+     */
+    private void queryTreeForLO(List<Tree> rootTreeList, UILinkTypeDataQuery linkTypeDataQuery,String parentFieldName,String valueField,String textField,boolean showCheckBox) {
+        for (Tree rootTree : rootTreeList) {
+            Map<String,String> conditionMap = new HashMap<>();
+            conditionMap.put(linkTypeDataQuery.isDirection()?"t_oid":"f_oid",rootTree.getOid());
+            linkTypeDataQuery.setConditionMap(conditionMap);
+            linkTypeDataQuery.setParentOid(rootTree.getOid());
+            rootTree.setChildren(cloAndCbo2Trees(loService.queryCLOAndBoByLinkType(linkTypeDataQuery),valueField,textField,parentFieldName,showCheckBox,rootTree.getOid()));
+        }
+    }
+
+    /**
+     * 涓氬姟绫诲瀷鏁版嵁杞崲涓烘爲
+     * @param cbos 涓氬姟鏁版嵁
+     * @param valueField 鍊肩殑琛ㄨ揪寮�
+     * @param textField 鏄剧ず琛ㄨ揪寮�
+     * @param parentFieldName 涓婄骇瀛楁灞炴��
+     * @param showCheckBox 鏄剧ず澶嶉�夋
+     * @param parentOid 涓婄骇鐨勪富閿�
+     * @return 鏍�
+     */
+    private List<Tree> cbo2Trees(Collection<ClientBusinessObject> cbos,String valueField,String textField,String parentFieldName,boolean showCheckBox,String parentOid){
+        final int[] i = {0};
+        List<Tree> rootList = new ArrayList<>();
+        List<Tree> children = new ArrayList<>();
+        cbos.stream().forEach(cbo->{
+            Tree tree = new Tree();
+            tree.setOid(getValueByExpress(cbo,valueField));
+            tree.setText(getValueByExpress(cbo,textField));
+            if(StringUtils.isNotBlank(parentFieldName)){
+                tree.setParentId(cbo.getAttributeValue(parentFieldName));
+            }
+            tree.setAttributes(boService.cbo2Map(cbo));
+            tree.setIndex(i[0] + "");
+            i[0]++;
+            tree.setChecked(showCheckBox);
+            //鏆傛椂涓嶅鐞嗗浘鏍�
+            if(StringUtils.isBlank(tree.getParentId() ) || tree.getParentId().equalsIgnoreCase(parentOid)){
+                rootList.add(tree);
+            }else{
+                children.add(tree);
+            }
+        });
+
+        return Tree.getChildList(rootList,children);
+    }
+
+    /**
+     * 閾炬帴绫诲瀷杞崲涓烘爲
+     * @param boAndLOS 涓氬姟绫诲瀷鍜岄摼鎺ョ被鍨�
+     * @param valueField 鍊艰〃杈惧紡
+     * @param textField 鏄剧ず鏂囨湰琛ㄨ揪寮�
+     * @param parentFieldName 涓婄骇瀛楁锛岄粯璁ゆ槸f_oid,鍙嶅悜鐨勬椂鍊欒鑷璁剧疆
+     * @param showCheckBox 鏄惁鏄剧ず澶嶉�夋
+     * @param parentOid 涓婄骇鐨勫��
+     * @return 鏍戝舰鏁版嵁
+     */
+    public List<Tree> cloAndCbo2Trees(Collection<BOAndLO> boAndLOS,String valueField,String textField,String parentFieldName,boolean showCheckBox,String parentOid){
+        final int[] i = {0};
+        List<Tree> rootList = new ArrayList<>();
+        List<Tree> children = new ArrayList<>();
+        boAndLOS.stream().forEach(boAndLO->{
+            Tree tree = new Tree();
+            ClientBusinessObject cbo = new ClientBusinessObject();
+            cbo.setBusinessObject(boAndLO.bo);
+            ClientLinkObject clo = new ClientLinkObject();
+            clo.setLinkObject(boAndLO.lo);
+            Map<String,String> cloMap = loService.clo2Map(clo);
+            Map<String,String> cbo2Map = boService.cbo2Map(cbo);
+            if(!CollectionUtils.isEmpty(cbo2Map)){
+                cbo2Map.forEach((key,value)->{
+                    cloMap.put(parentFieldName + "." + key,value);
+                });
+            }
+            tree.setOid(getValueByExpressForBOAndLO(cloMap,cbo2Map,valueField));
+            tree.setText(getValueByExpressForBOAndLO(cloMap,cbo2Map,textField));
+            if(StringUtils.isBlank(parentFieldName)){
+                tree.setParentId(boAndLO.lo.oid + TREE_NODE_ID_SEP + boAndLO.lo.fromOid);
+            }else {
+                if (parentFieldName.contains(".")) {
+                    tree.setParentId(cbo.getAttributeValue(parentFieldName));
+                } else {
+                    tree.setParentId(clo.getAttributeValue(parentFieldName));
+                }
+            }
+
+            tree.setAttributes(cbo2Map);
+            tree.setIndex(i[0] + "");
+            i[0]++;
+            tree.setChecked(showCheckBox);
+            //鏆傛椂涓嶅鐞嗗浘鏍�
+            if(StringUtils.isBlank(tree.getParentId() ) || tree.getParentId().equalsIgnoreCase(parentOid)){
+                rootList.add(tree);
+            }else{
+                children.add(tree);
+            }
+        });
+
+        return Tree.getChildList(rootList,children);
+    }
+
+    /**
+     * 鑾峰彇鍊硷紝 鍚湁${xxx}鐨勬椂鍊欙紝琛ㄧず涓烘浛鎹㈢殑鏂瑰紡锛屾病鏈夊垯鐢ㄧ┖鏍煎垎闅�
+     * @param cbo 涓氬姟鏁版嵁
+     * @param fieldExpress 琛ㄨ揪寮忕殑鍊�
+     * @return 杞崲鍚庣殑鍊�
+     */
+    private String getValueByExpress(ClientBusinessObject cbo,String fieldExpress){
+        if(StringUtils.isBlank(fieldExpress)){
+            return "";
+        }
+        if(fieldExpress.contains("${")){
+            //浣跨敤freemarker澶勭悊
+            return VciBaseUtil.replaceByFreeMarker(fieldExpress,boService.cbo2Map(cbo));
+        }else {
+            List<String> fieldList = VciBaseUtil.str2List(fieldExpress);
+            StringBuilder sb = new StringBuilder();
+            fieldList.stream().forEach(field->{
+                sb.append(cbo.getAttributeValue(field)).append(" ");
+            });
+            return sb.toString().trim();
+        }
+    }
+
+    /**
+     * 鑾峰彇杩炴帴绫诲瀷
+     * @param valueMap 閾炬帴绫诲瀷鍜屼笟鍔$被鍨嬬殑鏁版嵁
+     * @param fieldExpress 琛ㄨ揪寮�
+     * @return 鏇挎崲鍚庣殑鍊�
+     */
+    private String getValueByExpressForBOAndLO(Map<String,String> valueMap,Map<String,String> boValueMap,String fieldExpress){
+        if(fieldExpress.contains("${")){
+            //浣跨敤freemarker澶勭悊
+            return VciBaseUtil.replaceByFreeMarker(fieldExpress,valueMap);
+        }else {
+            List<String> fieldList = VciBaseUtil.str2List(fieldExpress);
+            Map<String,String> valueLowMap = new HashMap<>();
+            valueMap.forEach((key,value)->{
+                valueLowMap.put(key.toLowerCase(),value);
+            });
+            Map<String,String> boLowValueMap = new HashMap<>();
+            if(!CollectionUtils.isEmpty(boValueMap)){
+                boValueMap.forEach((key,value)->{
+                    boLowValueMap.put(key.toLowerCase(),value);
+                });
+            }
+            StringBuilder sb = new StringBuilder();
+            fieldList.stream().forEach(field->{
+                sb.append(valueLowMap.getOrDefault(field,boLowValueMap.getOrDefault(field,""))).append(" ");
+            });
+            return sb.toString().trim();
+        }
+    }
+
+    /**
+     * 澶勭悊瑕佹煡璇㈢殑瀛楁
+     * @param queryFieldList 鏌ヨ鐨勫瓧娈靛垪琛�
+     * @param fieldExpress 瀛楁琛ㄨ揪寮�
+     */
+    private void addQueryField(List<String> queryFieldList,String fieldExpress){
+        if(fieldExpress.contains("${")){
+            String temp = fieldExpress;
+            //姣斿 ${id}  ${name} / ${rev}
+            while(temp.contains("${")){
+                int dollar = temp.indexOf("${");
+                int brackets = temp.indexOf("}");
+                String tempField = temp.substring(dollar+2,brackets);
+                if (!queryFieldList.contains(tempField.trim().toLowerCase())){
+                    queryFieldList.add(tempField.trim().toLowerCase());
+                }
+                temp = temp.substring(brackets+1);
+            }
+        }else {
+            List<String> fieldList = VciBaseUtil.str2List(fieldExpress);
+            fieldList.stream().forEach(field->{
+                if (!queryFieldList.contains(field.toLowerCase())) {
+                    queryFieldList.add(field.toLowerCase());
+                }
+            });
+        }
+    }
+
+    /**
+     * 璋冪敤鍓嶇疆浜嬩欢
+     * @param baseModelDTOList 涓氬姟鏁版嵁鐨勪俊鎭�
+     * @param baseLinkModelDTOList 閾炬帴绫诲瀷鐨勬暟鎹俊鎭�
+     * @param preEvent 鍓嶇疆浜嬩欢鐨勫悕绉�
+     * @param businessType 璋冪敤鐨勭被鍨�
+     * @return 鎵ц缁撴灉锛岃鍒ゆ柇success灞炴�ф槸鍚︿负true
+     * @throws VciBaseException 閰嶇疆鎴栬�呮槸璋冪敤涓嶆垚鍔熺殑鏃跺�欙紝浼氭姏鍑哄紓甯�
+     */
+    @Override
+    public BaseResult callPreEvent(BaseModelDTOList baseModelDTOList,BaseLinkModelDTOList baseLinkModelDTOList, String preEvent, VciChangeDocumentTypeEnum businessType) throws VciBaseException{
+        if((baseModelDTOList == null || CollectionUtils.isEmpty(baseModelDTOList.getDataList())) && (baseLinkModelDTOList == null || CollectionUtils.isEmpty(baseLinkModelDTOList.getDataList()))){
+            return BaseResult.success();
+        }
+        String btmType = (baseModelDTOList !=null && !CollectionUtils.isEmpty(baseModelDTOList.getDataList()))? baseModelDTOList.getDataList().get(0).getBtmname():null;
+        String linkType = (baseLinkModelDTOList !=null && !CollectionUtils.isEmpty(baseLinkModelDTOList.getDataList()))?baseLinkModelDTOList.getDataList().get(0).getLinkType():null;
+        if(StringUtils.isNotBlank(preEvent)){
+            //鍓嶇疆浜嬩欢
+            //bean鐨勫悕瀛�#鏂规硶; 鎴栬�呭叏璺緞銆傛渶鍚庝竴涓槸鏂规硶鐨勫悕瀛�
+            Method method = null;
+            Object bean = null;
+            String beanName = null;
+            String methodName = null;
+            if(preEvent.contains("#")){
+                //璇存槑鏄痓ean鐨勫悕瀛�#鐨勬柟娉�
+                beanName = preEvent.split("#")[0];
+                methodName = preEvent.split("#")[1];
+                String configMsg = "閰嶇疆鐨勫墠缃簨浠舵湁璇紝闇�瑕� bean鐨勫悕瀛�#鏂规硶鍚嶅瓧  杩欑褰㈠紡锛屽叾涓繖涓猙ean闇�瑕佸姞@Component鎴栬�匑Service鐨勬敞瑙�.濡傛灉娉ㄨВ閲屾病鏈夋寚瀹氬悕绉帮紝榛樿涓鸿繖涓猚lass鐨勫悕绉�(涓旂涓�涓瓧姣嶅彉灏忓啓)";
+                if(StringUtils.isBlank(beanName) || StringUtils.isBlank(methodName)){
+                    throw new VciBaseException(configMsg);
+                }
+                bean = ApplicationContextProvider.getBean(beanName);
+                if(bean == null){
+                    throw new VciBaseException(configMsg);
+                }
+                method = VciBaseUtil.getMethodByName(bean.getClass(),methodName);
+                if(method == null){
+                    throw new VciBaseException("{0}杩欎釜缁勪欢涓病鏈夋壘鍒皗1}鐨勬柟娉曪紝璇峰紑鍙戣�呯‘璁�",new String[]{beanName,methodName});
+                }
+            }else{
+                if(!preEvent.contains(".")){
+                    throw new VciBaseException("鍓嶇疆浜嬩欢鐨勫叏璺緞閰嶇疆閿欒锛岄渶瑕乧lass鐨勫叏璺緞+鏂规硶鍚嶅瓧锛岀洰鍓嶇殑閰嶇疆鏄瘂0}锛岃寮�鍙戣�呯‘璁�",new String[]{preEvent});
+                }
+                //鍏ㄨ矾寰�
+                beanName = preEvent.substring(0,preEvent.lastIndexOf("."));
+                methodName = preEvent.substring(preEvent.lastIndexOf(".") + 1);
+                Class classInstance = null;
+                try {
+                    classInstance = Class.forName(beanName);
+                } catch (ClassNotFoundException e) {
+                    throw new VciBaseException(LangBaseUtil.getErrorMsg(e),new String[]{beanName,methodName},e);
+                }
+                try {
+                    bean = classInstance.newInstance();
+                } catch (Throwable e) {
+                    throw new VciBaseException(LangBaseUtil.getErrorMsg(e),new String[]{beanName,methodName},e);
+                }
+                method = VciBaseUtil.getMethodByName(classInstance,methodName);
+                if(method == null){
+                    throw new VciBaseException("{0}杩欎釜缁勪欢涓病鏈夋壘鍒皗1}鐨勬柟娉曪紝璇峰紑鍙戣�呯‘璁�",new String[]{beanName,methodName});
+                }
+            }
+            try {
+                return (BaseResult)method.invoke(bean,baseModelDTOList);
+            } catch (Throwable e) {
+                throw new VciBaseException(LangBaseUtil.getErrorMsg(e),new String[]{beanName,methodName},e);
+            }
+        }else{
+            //鐩存帴鑾峰彇娉ㄨВ
+            Map<String, Object> beanMap = ApplicationContextProvider.getApplicationContext().getBeansWithAnnotation(VciChangeDataPlugin.class);
+            if(!CollectionUtils.isEmpty(beanMap)){
+                beanMap.forEach((beanName,bean)->{
+                    Method[] methods = bean.getClass().getMethods();
+                    List<Method> hasBeforeMethods = Arrays.stream(methods).filter(m -> m.isAnnotationPresent(VciChangeDataBefore.class)).collect(Collectors.toList());
+                    if(!CollectionUtils.isEmpty(hasBeforeMethods)){
+                        hasBeforeMethods.stream().forEach(method -> {
+                            VciChangeDataBefore before = method.getAnnotation(VciChangeDataBefore.class);
+                            if(before == null){
+                                before = method.getDeclaredAnnotation(VciChangeDataBefore.class);
+                            }
+                            if(StringUtils.isNotBlank(btmType) && before.btmType().equals(btmType) && before.changeType().equals(businessType)){
+                                try {
+                                    BaseResult result = (BaseResult) method.invoke(bean, baseModelDTOList);
+                                    if(!result.isSuccess()){
+                                        throw new VciBaseException(result.getMsg(),result.getMsgObjs());
+                                    }
+                                }catch (Throwable e){
+                                    throw new VciBaseException(LangBaseUtil.getErrorMsg(e),new String[]{beanName,method.getName()},e);
+                                }
+                            }
+                            if(StringUtils.isNotBlank(linkType) && before.btmType().equals(linkType) && before.changeType().equals(businessType)){
+                                try {
+                                    BaseResult result = (BaseResult) method.invoke(bean, baseLinkModelDTOList);
+                                    if(!result.isSuccess()){
+                                        throw new VciBaseException(result.getMsg(),result.getMsgObjs());
+                                    }
+                                }catch (Throwable e){
+                                    throw new VciBaseException(LangBaseUtil.getErrorMsg(e),new String[]{beanName,method.getName()},e);
+                                }
+                            }
+                        });
+                    }
+                });
+            }
+        }
+        return BaseResult.success();
+    }
+
+    /**
+     * 鍚庣疆浜嬩欢
+     * @param cbos 娣诲姞瀹屾垚鍚庡唴瀹�
+     * @param postEvent 鍚庣疆浜嬩欢鐨勫悕绉帮紝濡傛灉涓虹┖浼氳嚜鍔ㄦ壂鎻忔槸鍚︽湁娉ㄨВ
+     * @param businessType 涓氬姟鎿嶄綔鐨勭被鍨�
+     * @return 鎵ц鐨勭粨鏋�
+     * @throws VciBaseException 鎵ц鍑洪敊鐨勪細鎶涘嚭寮傚父锛屾垨鑰呬簨浠剁洿鎺ヨ繑鍥炰簡寮傚父
+     */
+    @Override
+    public BaseResult callPostEvent(Collection<ClientBusinessObject> cbos, Collection<ClientLinkObject> clos, String postEvent, VciChangeDocumentTypeEnum businessType) throws VciBaseException{
+        if(CollectionUtils.isEmpty(cbos)){
+            return BaseResult.success();
+        }
+        String btmType = !CollectionUtils.isEmpty(cbos)?cbos.stream().findFirst().get().getBtmName():null;
+        String linkType = !CollectionUtils.isEmpty(clos)?clos.stream().findFirst().get().getLinkObject().linkTypeName:null;
+        if(StringUtils.isNotBlank(postEvent)){
+            //鍓嶇疆浜嬩欢
+            //bean鐨勫悕瀛�#鏂规硶; 鎴栬�呭叏璺緞銆傛渶鍚庝竴涓槸鏂规硶鐨勫悕瀛�
+            Method method = null;
+            Object bean = null;
+            String beanName = null;
+            String methodName = null;
+            if(postEvent.contains("#")){
+                //璇存槑鏄痓ean鐨勫悕瀛�#鐨勬柟娉�
+                beanName = postEvent.split("#")[0];
+                methodName = postEvent.split("#")[1];
+                String configMsg = "閰嶇疆鐨勫悗缃簨浠舵湁璇紝闇�瑕� bean鐨勫悕瀛�#鏂规硶鍚嶅瓧  杩欑褰㈠紡锛屽叾涓繖涓猙ean闇�瑕佸姞@Component鎴栬�匑Service鐨勬敞瑙�.濡傛灉娉ㄨВ閲屾病鏈夋寚瀹氬悕绉帮紝榛樿涓鸿繖涓猚lass鐨勫悕绉�(涓旂涓�涓瓧姣嶅彉灏忓啓)";
+                if(StringUtils.isBlank(beanName) || StringUtils.isBlank(methodName)){
+                    throw new VciBaseException(configMsg);
+                }
+                bean = ApplicationContextProvider.getBean(beanName);
+                if(bean == null){
+                    throw new VciBaseException(configMsg);
+                }
+                method = VciBaseUtil.getMethodByName(bean.getClass(),methodName);
+                if(method == null){
+                    throw new VciBaseException("{0}杩欎釜缁勪欢涓病鏈夋壘鍒皗1}鐨勬柟娉曪紝璇峰紑鍙戣�呯‘璁�",new String[]{beanName,methodName});
+                }
+            }else{
+                if(!postEvent.contains(".")){
+                    throw new VciBaseException("鍚庣疆浜嬩欢鐨勫叏璺緞閰嶇疆閿欒锛岄渶瑕乧lass鐨勫叏璺緞+鏂规硶鍚嶅瓧锛岀洰鍓嶇殑閰嶇疆鏄瘂0}锛岃寮�鍙戣�呯‘璁�",new String[]{postEvent});
+                }
+                //鍏ㄨ矾寰�
+                beanName = postEvent.substring(0,postEvent.lastIndexOf("."));
+                methodName = postEvent.substring(postEvent.lastIndexOf(".") + 1);
+                Class classInstance = null;
+                try {
+                    classInstance = Class.forName(beanName);
+                } catch (ClassNotFoundException e) {
+                    throw new VciBaseException(LangBaseUtil.getErrorMsg(e),new String[]{beanName,methodName},e);
+                }
+                try {
+                    bean = classInstance.newInstance();
+                } catch (Throwable e) {
+                    throw new VciBaseException(LangBaseUtil.getErrorMsg(e),new String[]{beanName,methodName},e);
+                }
+                method = VciBaseUtil.getMethodByName(classInstance,methodName);
+                if(method == null){
+                    throw new VciBaseException("{0}杩欎釜缁勪欢涓病鏈夋壘鍒皗1}鐨勬柟娉曪紝璇峰紑鍙戣�呯‘璁�",new String[]{beanName,methodName});
+                }
+            }
+            try {
+                return (BaseResult)method.invoke(bean,cbos);
+            } catch (Throwable e) {
+                throw new VciBaseException(LangBaseUtil.getErrorMsg(e),new String[]{beanName,methodName},e);
+            }
+        }else{
+            //鐩存帴鑾峰彇娉ㄨВ
+            Map<String, Object> beanMap = ApplicationContextProvider.getApplicationContext().getBeansWithAnnotation(VciChangeDataPlugin.class);
+            if(!CollectionUtils.isEmpty(beanMap)){
+                beanMap.forEach((beanName,bean)->{
+                    Method[] methods = bean.getClass().getMethods();
+                    List<Method> hasBeforeMethods = Arrays.stream(methods).filter(m -> m.isAnnotationPresent(VciChangeDataAfter.class)).collect(Collectors.toList());
+                    if(!CollectionUtils.isEmpty(hasBeforeMethods)){
+                        hasBeforeMethods.stream().forEach(method -> {
+                            VciChangeDataAfter after = method.getAnnotation(VciChangeDataAfter.class);
+                            if(after == null){
+                                after = method.getDeclaredAnnotation(VciChangeDataAfter.class);
+                            }
+                            if(StringUtils.isNotBlank(btmType) && after.btmType().equals(btmType) && after.changeType().equals(businessType)){
+                                try {
+                                    BaseResult result = (BaseResult) method.invoke(bean, cbos);
+                                    if(!result.isSuccess()){
+                                        throw new VciBaseException(result.getMsg(),result.getMsgObjs());
+                                    }
+                                }catch (Throwable e){
+                                    throw new VciBaseException(LangBaseUtil.getErrorMsg(e),new String[]{beanName,method.getName()},e);
+                                }
+                            }
+                            if(StringUtils.isNotBlank(linkType) && after.btmType().equals(linkType) && after.changeType().equals(businessType)){
+                                try {
+                                    BaseResult result = (BaseResult) method.invoke(bean, clos);
+                                    if(!result.isSuccess()){
+                                        throw new VciBaseException(result.getMsg(),result.getMsgObjs());
+                                    }
+                                }catch (Throwable e){
+                                    throw new VciBaseException(LangBaseUtil.getErrorMsg(e),new String[]{beanName,method.getName()},e);
+                                }
+                            }
+                        });
+                    }
+                });
+            }
+        }
+        return BaseResult.success();
+    }
+
+    /**
+     * 琛ㄥ崟鏁版嵁杞崲涓哄熀纭�瀵硅薄
+     * @param formDataDTO 琛ㄥ崟鏁版嵁
+     * @return 鍩虹瀵硅薄鍒楄〃
+     */
+    @Override
+    public BaseModelDTOList formData2DTOList(FormDataDTO formDataDTO){
+        BaseModelDTOList modelDTOList = new BaseModelDTOList();
+        BaseModelDTO modelDTO = new BaseModelDTO();
+        BeanUtil.convert((BaseModelDTO)formDataDTO,modelDTO);
+        modelDTO.setData(formDataDTO.getData());
+        List<BaseModelDTO> modelDTOS = new ArrayList<>();
+        modelDTOS.add(modelDTO);
+        modelDTOList.setDataList(modelDTOS);
+        return modelDTOList;
+    }
+
+    /**
+     * 閾炬帴鏁版嵁 杞崲涓哄熀纭�瀵硅薄
+     * @param formLinkDataDTO 琛ㄥ崟鏁版嵁
+     * @return 鍩虹鏁版嵁鍒楄〃
+     */
+    @Override
+    public BaseLinkModelDTOList formLinkData2DTOList(FormLinkDataDTO formLinkDataDTO){
+        BaseLinkModelDTOList modelDTOList = new BaseLinkModelDTOList();
+        BaseLinkModelDTO modelDTO = new BaseLinkModelDTO();
+        modelDTO.setData(formLinkDataDTO.getData());
+        BeanUtil.convert((BaseLinkModelDTO)formLinkDataDTO,modelDTO);
+        List<BaseLinkModelDTO> linkModelDTOS = new ArrayList<>();
+        linkModelDTOS.add(modelDTO);
+        modelDTOList.setDataList(linkModelDTOS);
+        return modelDTOList;
+    }
+
+    /**
+     * 琛ㄥ崟鐨勬暟鎹浆鎹负
+     * @param formDataDTOList 琛ㄥ崟鏁版嵁
+     * @return 鍩虹瀵硅薄鍒楄〃
+     */
+    @Override
+    public BaseModelDTOList formDataList2DTOList(FormDataDTOList formDataDTOList){
+        BaseModelDTOList modelDTOList = new BaseModelDTOList();
+        List<BaseModelDTO> modelDTOS = new ArrayList<>();
+        modelDTOS.stream().findAny().orElseGet(()->null);
+        formDataDTOList.getFormDataDTOS().forEach(formDataDTO -> {
+            BaseModelDTO modelDTO = new BaseModelDTO();
+            BeanUtil.convert((BaseModelDTO)formDataDTO,modelDTO);
+            modelDTO.setData(formDataDTO.getData());
+            modelDTOS.add(modelDTO);
+        });
+        modelDTOList.setDataList(modelDTOS);
+        return modelDTOList;
+    }
+
+    /**
+     * 閾炬帴绫诲瀷鎵归噺杞崲
+     * @param formLinkDataDTOList 琛ㄥ崟鐨勬暟鎹�
+     * @return 鍩虹瀵硅薄鍒楄〃
+     */
+    @Override
+    public BaseLinkModelDTOList formLinkDataList2DTOList(FormLinkDataDTOList formLinkDataDTOList){
+        BaseLinkModelDTOList modelDTOList = new BaseLinkModelDTOList();
+        List<BaseLinkModelDTO> modelDTOS = new ArrayList<>();
+        formLinkDataDTOList.getDataDTOList().forEach(formDataDTO -> {
+            BaseLinkModelDTO modelDTO = new BaseLinkModelDTO();
+            BeanUtil.convert((BaseLinkModelDTO)formDataDTO,modelDTO);
+            modelDTO.setData(formDataDTO.getData());
+            modelDTOS.add(modelDTO);
+        });
+        modelDTOList.setDataList(modelDTOS);
+        return modelDTOList;
+    }
+
+    /**
+     * 娣诲姞鏁版嵁
+     *
+     * @param formDataDTO 鏁版嵁鐨勪紶杈撳璞�
+     * @return 鎵ц缁撴灉鍜屾樉绀哄悗鐨勫��
+     * @throws VciBaseException 淇濆瓨鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public BaseResult<Map<String, Object>> addSave(FormDataDTO formDataDTO) throws VciBaseException {
+        //棣栧厛鍒ゆ柇瀵硅薄鏄惁涓虹┖
+        VciBaseUtil.alertNotNull(formDataDTO,"娣诲姞鐨勬暟鎹璞�",formDataDTO.getBtmname(),"涓氬姟绫诲瀷鐨勫悕绉�",formDataDTO.getFormDefineId(),"琛ㄥ崟瀹氫箟鐨勭紪鍙�");
+        UIFormDefineVO formDefineVO = uiEngineService.getFormById(formDataDTO.getBtmname(), formDataDTO.getFormDefineId());
+        String preEvent = formDataDTO.getPreEvent();
+        BaseModelDTOList modelDTOList = formData2DTOList(formDataDTO);
+        BaseResult beforeResult = callPreEvent(modelDTOList, null,preEvent, VciChangeDocumentTypeEnum.ADD);
+        if(!beforeResult.isSuccess()){
+            //璇存槑鍓嶇疆浜嬩欢娌℃湁鎵ц鎴愬姛
+            return beforeResult;
+        }
+        //灏佽鏁版嵁
+        BaseResult<ClientBusinessObject> resultCbo = wrapperCbo(formDataDTO,formDefineVO,false,false,false);
+        if(!resultCbo.isSuccess()){
+            return BaseResult.fail(resultCbo.getMsg(),resultCbo.getMsgObjs());
+        }
+        //鎵ц淇濆瓨
+        BaseResult<Map<String,Object>> result = BaseResult.success();
+        ClientBusinessObject afterCBO = null;
+        try {
+            BusinessObject resultBO = platformClientUtil.getBOFactoryService().createBusinessObject(resultCbo.getObj().getBusinessObject(),false,false);
+            afterCBO = new ClientBusinessObject();
+            afterCBO.setBusinessObject(resultBO);
+            result.setObj(boService.cbo2Map(afterCBO));
+        } catch (VCIError vciError) {
+            throw WebUtil.getVciBaseException(vciError);
+        }
+        if(!CollectionUtils.isEmpty(formDataDTO.getReleaseFileOids())){
+            fileObjectService.releasedFile(afterCBO.getBtmName(),afterCBO.getOid(),formDataDTO.getReleaseFileOids());
+        }
+        //鍚庣疆浜嬩欢
+        String afterEvent = formDataDTO.getPostEvent();
+        try {
+            callPostEvent(Arrays.stream(new ClientBusinessObject[]{afterCBO}).collect(Collectors.toList()),null, afterEvent, VciChangeDocumentTypeEnum.ADD);
+        }catch (Throwable e){
+            //璇存槑鍚庣疆浜嬩欢鍑虹幇浜嗛敊璇紝閭d箞灏遍渶瑕佸垹闄や互鍓嶇殑杩欐潯鏁版嵁
+            try {
+                platformClientUtil.getBOFactoryService().deleteBusinessObject(afterCBO.getBusinessObject(),1);
+            } catch (VCIError vciError) {
+                throw WebUtil.getVciBaseException(vciError);
+            }
+            throw new VciBaseException(LangBaseUtil.getErrorMsg(e),new String[]{},e);
+        }
+        return result;
+    }
+
+
+    /**
+     * 灏佽cbo瀵硅薄
+     * @param formDataDTO 琛ㄥ崟鏁版嵁
+     * @param formDefineVO 琛ㄥ崟鐨勫畾涔�
+     * @param editFlag 鏄惁涓虹紪杈�
+     * @param newRevision 鏂扮増鏈�
+     * @param newVersion 鏂扮増娆�
+     * @return  鎵ц鐨勭粨鏋�
+     */
+    private BaseResult<ClientBusinessObject> wrapperCbo(FormDataDTO formDataDTO,UIFormDefineVO formDefineVO,boolean editFlag,boolean newRevision,boolean newVersion){
+        //鎵╁睍灞炴�х殑鍊�
+        Map<String, String> data = formDataDTO.getData();
+        Map<String,String> dataLow = new HashMap<>();
+        data.forEach((key,value)->{
+            dataLow.put(key.toLowerCase(),value);
+        });
+        String oid = formDataDTO.getOid();
+        Date ts = formDataDTO.getTs();
+        if(editFlag && StringUtils.isBlank(oid)){
+            //淇敼鐨勬椂鍊欎富閿笉鑳戒负绌�
+            throw new VciBaseException("淇敼鐨勬椂鍊欙紝鏁版嵁鐨勪富閿笉鑳戒负绌�");
+        }
+        if((newRevision || newRevision) && StringUtils.isBlank(formDataDTO.getCopyFromVersion())){
+            throw new VciBaseException("鍗囩増鐨勬椂鍊欙紝鑰佺増鏈暟鎹殑涓婚敭涓嶈兘涓虹┖");
+        }
+        if(editFlag &&ts !=null){
+            Map<String,String> conditionMap = WebUtil.getOidQuery(oid);
+            conditionMap.put("ts", VciDateUtil.date2Str(ts,VciDateUtil.DateTimeMillFormat));
+            conditionMap.put("oid",oid);
+            if(boService.queryCount(formDefineVO.getBtmType(),conditionMap) ==0){
+                throw new VciBaseException("鏁版嵁涓嶆槸鏈�鏂扮殑锛屽缓璁偍鍒锋柊鍚庨噸鏂版搷浣�");
+            }
+        }
+        //榛樿灞炴�х殑鍊�
+        Map<String,String> baseDataMap = formDataDTO2MapLow(formDataDTO);
+        Map<String,String> allDataMapLow = new HashMap<>();
+        allDataMapLow.putAll(dataLow);
+        allDataMapLow.putAll(baseDataMap);
+        //鍒ゆ柇蹇呰緭椤�
+        BaseResult result = checkRequired(formDefineVO,null,allDataMapLow);
+        if(!result.isSuccess()){
+            return result;
+        }
+
+
+        //鍒ゆ柇鍞竴椤�
+        result = checkUnique(formDefineVO,null,allDataMapLow,editFlag);
+        if(!result.isSuccess()){
+            return result;
+        }
+        ClientBusinessObject cbo = createOrGetCbo(dataLow,baseDataMap,editFlag,newRevision,newVersion);
+        return BaseResult.success(cbo);
+    }
+
+    /**
+     * 涓氬姟绫诲瀷
+     * @param cbo 涓氬姟鏁版嵁瀵硅薄
+     * @return 鍩虹瀵硅薄
+     */
+    @Override
+    public BaseModel cbo2BaseModel(ClientBusinessObject cbo){
+        BaseModel baseModel = new BaseModel();
+        baseModel.setOid(cbo.getOid());
+        baseModel.setNameOid(cbo.getNameoid());
+        baseModel.setRevisionOid(cbo.getRevisionid());
+        baseModel.setBtmname(cbo.getBtmName());
+        baseModel.setLastR(String.valueOf(cbo.getIsLastR()));
+        baseModel.setLastV(String.valueOf(cbo.getIsLastV()));
+        baseModel.setFirstR(String.valueOf(cbo.getIsFirstR()));
+        baseModel.setFirstV(String.valueOf(cbo.getIsFirstV()));
+        baseModel.setCreator(cbo.getCreator());
+        try {
+            baseModel.setCreateTime(VciDateUtil.str2Date(cbo.getCreateTime(), VciDateUtil.DateTimeFormat));
+            baseModel.setLastModifyTime(VciDateUtil.str2Date(cbo.getLastModifyTime(), VciDateUtil.DateTimeFormat));
+            baseModel.setTs(VciDateUtil.str2Date(cbo.getTs(), VciDateUtil.DateTimeFormat));
+            baseModel.setCheckInTime(VciDateUtil.str2Date(cbo.getCheckinTime(), VciDateUtil.DateTimeFormat));
+            baseModel.setCheckOutTime(VciDateUtil.str2Date(cbo.getCheckoutTime(), VciDateUtil.DateTimeFormat));
+        }catch (Throwable e){
+
+        }
+        baseModel.setLastModifier(cbo.getLastModifier());
+        baseModel.setRevisionRule(cbo.getRevisionRule());
+        baseModel.setVersionRule(cbo.getVersionRule());
+        baseModel.setRevisionSeq(cbo.getRevisionSeq());
+        baseModel.setRevisionValue(cbo.getRevisionValue());
+        baseModel.setVersionSeq(cbo.getVersionSeq());
+        baseModel.setVersionValue(cbo.getVersionValue());
+        baseModel.setLcStatus(cbo.getLcStatus());
+        baseModel.setId(cbo.getId());
+        baseModel.setName(cbo.getName());
+        baseModel.setDescription(cbo.getDescription());
+        baseModel.setOwner(cbo.getOwner());
+        baseModel.setCheckInBy(cbo.getCheckinBy());
+        baseModel.setCheckOutBy(cbo.getCheckoutBy());
+        baseModel.setCopyFromVersion(cbo.getCopyFromVersion());
+        return baseModel;
+    }
+
+    /**
+     * 涓氬姟鏁版嵁琛ㄥ崟瀵硅薄杞崲涓哄熀纭�鐨勫睘鎬�
+     * @param formDataDTO 琛ㄧ殑鏁版嵁浼犺緭瀵硅薄
+     * @return 鏁版嵁鐨勬槧灏勫唴瀹�
+     */
+    @Override
+    public Map<String,String> formDataDTO2MapLow(FormDataDTO formDataDTO){
+        Map<String,String> data = new HashMap<>();
+        BaseModel baseModel = (BaseModel)formDataDTO;
+        Map<String, String> map = WebUtil.objectToMapString(baseModel);
+        if(!CollectionUtils.isEmpty(map)){
+            map.forEach((key,value)->{
+                data.put(key.toLowerCase(),value);
+            });
+        }
+        return data;
+    }
+
+
+    /**
+     * 閾炬帴鏁版嵁琛ㄥ崟瀵硅薄杞崲涓哄熀纭�鐨勫睘鎬�
+     * @param formLinkDataDTO 琛ㄧ殑鏁版嵁浼犺緭瀵硅薄
+     * @return 鏁版嵁鐨勬槧灏勫唴瀹�
+     */
+    @Override
+    public Map<String,String> formLinkDataDTO2MapLow(FormLinkDataDTO formLinkDataDTO){
+        Map<String,String> data = new HashMap<>();
+        BaseLinkModelDTO baseModel = (BaseLinkModelDTO)formLinkDataDTO;
+        Map<String, String> map = WebUtil.objectToMapString(baseModel);
+        if(!CollectionUtils.isEmpty(map)){
+            map.forEach((key,value)->{
+                data.put(WebLoServiceImpl.LO_BASE_FIELD_MAP.getOrDefault(key.toLowerCase(),key.toLowerCase()),value);
+            });
+        }
+        return data;
+    }
+
+    /**
+     * 鑾峰彇涓嬩竴涓増鏈彿
+     * @param btmTypeVO 涓氬姟绫诲瀷鐨勬樉绀哄璞�
+     * @param baseModel 鍩虹瀵硅薄
+     * @return 鐗堟湰鐨勫璞�
+     */
+    @Override
+    public RevisionValueObject getNextRevision(OsBtmTypeVO btmTypeVO, BaseModel baseModel){
+        try {
+            if(baseModel.getRevisionValue() == null){
+                baseModel.setRevisionValue("");
+            }
+            return  changeRevisionValueInfoToObject(platformClientUtil.getBOFactoryService().getNextRevisionValueObject(WebUtil.getTableName(btmTypeVO.getId()),baseModel.getNameOid(),btmTypeVO.getRevisionRuleId(),btmTypeVO.isInputRevisionFlag(),baseModel.getRevisionValue()));
+        } catch (VCIError vciError) {
+            throw WebUtil.getVciBaseException(vciError);
+        }
+    }
+
+    /**
+     * 鐗堟湰鍊肩殑corba瀵硅薄杞崲涓簀ava
+     * @param info corba瀵硅薄
+     * @return java瀵硅薄
+     */
+    private RevisionValueObject changeRevisionValueInfoToObject(RevisionDataInfo info) {
+        RevisionValueObject object = new RevisionValueObject();
+        object.setRevisionVal(info.revisionVal);
+        object.setRevisionSeq(info.revisionSeq);
+        return object;
+    }
+
+    /**
+     * 鑾峰彇涓嬩竴涓増娆$殑鍙�
+     * @param btmTypeVO 涓氬姟绫诲瀷鐨勬樉绀哄璞�
+     * @param baseModel 鍩虹瀵硅薄
+     * @return 鐗堟湰鐨勫�煎璞�
+     */
+    @Override
+    public VersionValueObject getNextVersion(OsBtmTypeVO btmTypeVO,BaseModel baseModel){
+        try{
+            return changeRevisionValueInfoToObject(platformClientUtil.getBOFactoryService().getNextVersionValue(WebUtil.getTableName(btmTypeVO.getId()),baseModel.getRevisionOid(),baseModel.getNameOid(),WebUtil.getInt(btmTypeVO.getVersionRule())));
+        }catch (VCIError vciError){
+            throw WebUtil.getVciBaseException(vciError);
+        }
+    }
+
+    /**
+     * 杞崲鐗堟鐨勫�肩殑瀵硅薄
+     * @param info 鐗堟鐨勫��
+     * @return java瀵硅薄
+     */
+    private VersionValueObject changeRevisionValueInfoToObject(VersionDataInfo info) {
+        VersionValueObject object = new VersionValueObject();
+        object.setVersionVal(info.versionVal);
+        object.setVersionSeq(info.versionSeq);
+        return object;
+    }
+    /**
+     * 鑾峰彇绗竴涓増娆�
+     * @param versionRule 鐗堟鐨勮鍒�
+     * @return 绗竴涓増娆�
+     */
+    @Override
+    public String getFirstVersion(String versionRule){
+        if("0".equalsIgnoreCase(versionRule)){
+            return "1";
+        }else if("1".equalsIgnoreCase(versionRule)){
+            return "a";
+        }else if("2".equalsIgnoreCase(versionRule)){
+           return "0";
+        }else{
+            //娌℃湁鐗堟
+            return "";
+        }
+    }
+
+    /**
+     * 鎵归噺娣诲姞鏁版嵁
+     *
+     * @param formDataDTOList 鏁版嵁鐨勪紶杈撳璞�
+     * @return 鎵ц缁撴灉鍜屼富閿�
+     * @throws VciBaseException 淇濆瓨鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public BaseResult<String> batchAddSave(FormDataDTOList formDataDTOList) throws VciBaseException {
+        VciBaseUtil.alertNotNull(formDataDTOList,"瑕佹坊鍔犵殑鏁版嵁",formDataDTOList.getFormDataDTOS(),"瑕佹坊鍔犵殑鏁版嵁");
+        //棣栧厛鍒ゆ柇瀵硅薄鏄惁涓虹┖
+        FormDataDTO firstFormDataDTO = formDataDTOList.getFormDataDTOS().stream().findFirst().get();
+        UIFormDefineVO formDefineVO = uiEngineService.getFormById(firstFormDataDTO.getBtmname(), firstFormDataDTO.getId());
+        String preEvent = firstFormDataDTO.getPreEvent();
+        BaseModelDTOList modelDTOList = formDataList2DTOList(formDataDTOList);
+        BaseResult beforeResult = callPreEvent(modelDTOList, null, preEvent, VciChangeDocumentTypeEnum.ADD);
+        if(!beforeResult.isSuccess()){
+            //璇存槑鍓嶇疆浜嬩欢娌℃湁鎵ц鎴愬姛
+            return beforeResult;
+        }
+        //灏佽鏁版嵁
+        List<BusinessObject> addBos = new ArrayList<>();
+        List<BusinessObject> afterBOs = new ArrayList<>();
+        List<ClientBusinessObject> afterCBOs = new ArrayList<>();
+        Map<String,List<String>> releasedFileOids = new HashMap<>();
+        for(FormDataDTO formDataDTO:formDataDTOList.getFormDataDTOS()) {
+            BaseResult<ClientBusinessObject> resultCbo = wrapperCbo(formDataDTO, formDefineVO, false, false, false);
+            if (!resultCbo.isSuccess()) {
+                return BaseResult.fail(resultCbo.getMsg(), resultCbo.getMsgObjs());
+            }
+            addBos.add(resultCbo.getObj().getBusinessObject());
+            //鎵ц淇濆瓨
+            if (!CollectionUtils.isEmpty(formDataDTO.getReleaseFileOids())) {
+                releasedFileOids.put(resultCbo.getObj().getOid(),formDataDTO.getReleaseFileOids());
+            }
+        }
+        try {
+            BusinessObject[] resultBOs = platformClientUtil.getBOFactoryService().batchCreateBusinessObject(addBos.toArray(new BusinessObject[0]), false, false);
+            afterBOs = Arrays.stream(resultBOs).collect(Collectors.toList());
+            Arrays.stream(resultBOs).forEach(bo->{
+                ClientBusinessObject cbo = new ClientBusinessObject();
+                cbo.setBusinessObject(bo);
+                afterCBOs.add(cbo);
+            });
+        } catch (VCIError vciError) {
+            throw WebUtil.getVciBaseException(vciError);
+        }
+        if(!CollectionUtils.isEmpty(releasedFileOids)){
+            releasedFileOids.forEach((oid,fileOids)->{
+                fileObjectService.releasedFile(firstFormDataDTO.getBtmname(),oid,fileOids);
+            });
+        }
+        //鍚庣疆浜嬩欢
+        String afterEvent = firstFormDataDTO.getPostEvent();
+        try {
+            callPostEvent(afterCBOs, null,afterEvent, VciChangeDocumentTypeEnum.ADD);
+        }catch (Throwable e){
+            //璇存槑鍚庣疆浜嬩欢鍑虹幇浜嗛敊璇紝閭d箞灏遍渶瑕佸垹闄や互鍓嶇殑杩欐潯鏁版嵁
+            try {
+                platformClientUtil.getBOFactoryService().batchDeleteBusinessObject(afterBOs.toArray(new BusinessObject[0]),1);
+            } catch (VCIError vciError) {
+                throw WebUtil.getVciBaseException(vciError);
+            }
+            throw new VciBaseException(LangBaseUtil.getErrorMsg(e),new String[]{},e);
+        }
+        BaseResult result = BaseResult.success();
+        result.setData(afterBOs.stream().map(s->s.oid).collect(Collectors.toList()));
+        return result;
+    }
+
+    /**
+     * 淇敼鏁版嵁銆傛敞鎰忚〃鍗曞畾涔夌殑瀛楁鎵嶄細琚慨鏀癸紝ts杩欑榛樿瀛楁闄ゅ
+     *
+     * @param formDataDTO 鏁版嵁鐨勪紶杈撳璞�
+     * @return 鎵ц缁撴灉鍜屾樉绀哄悗鐨勫��
+     * @throws VciBaseException 淇濆瓨鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public BaseResult<Map<String, Object>> editSave(FormDataDTO formDataDTO) throws VciBaseException {
+        //棣栧厛鍒ゆ柇瀵硅薄鏄惁涓虹┖
+        VciBaseUtil.alertNotNull(formDataDTO,"淇敼鐨勬暟鎹璞�",formDataDTO.getBtmname(),"涓氬姟绫诲瀷鐨勫悕绉�",formDataDTO.getFormDefineId(),"琛ㄥ崟瀹氫箟鐨勭紪鍙�");
+        UIFormDefineVO formDefineVO = uiEngineService.getFormById(formDataDTO.getBtmname(), formDataDTO.getFormDefineId());
+        String preEvent = formDataDTO.getPreEvent();
+        BaseModelDTOList modelDTOList = formData2DTOList(formDataDTO);
+        BaseResult beforeResult = callPreEvent(modelDTOList,null, preEvent, VciChangeDocumentTypeEnum.EDIT);
+        if(!beforeResult.isSuccess()){
+            //璇存槑鍓嶇疆浜嬩欢娌℃湁鎵ц鎴愬姛
+            return beforeResult;
+        }
+        //灏佽鏁版嵁
+        BaseResult<ClientBusinessObject> resultCbo = wrapperCbo(formDataDTO,formDefineVO,true,false,false);
+        if(!resultCbo.isSuccess()){
+            return BaseResult.fail(resultCbo.getMsg(),resultCbo.getMsgObjs());
+        }
+        //鎵ц淇濆瓨
+         BaseResult<Map<String,Object>> result = BaseResult.success();
+        try {
+            platformClientUtil.getBOFactoryService().updateBusinessObject(new BusinessObjectHolder(resultCbo.getObj().getBusinessObject()));
+            result.setObj(boService.cbo2Map(resultCbo.getObj()));
+        } catch (VCIError vciError) {
+            throw WebUtil.getVciBaseException(vciError);
+        }
+        if(!CollectionUtils.isEmpty(formDataDTO.getReleaseFileOids())){
+            fileObjectService.releasedFile(resultCbo.getObj().getBtmName(),resultCbo.getObj().getOid(),formDataDTO.getReleaseFileOids());
+        }
+        //鍚庣疆浜嬩欢
+        String afterEvent = formDataDTO.getPostEvent();
+        try {
+            callPostEvent(Arrays.stream(new ClientBusinessObject[]{resultCbo.getObj()}).collect(Collectors.toList()), null,afterEvent, VciChangeDocumentTypeEnum.EDIT);
+        }catch (Throwable e){
+            throw new VciBaseException(LangBaseUtil.getErrorMsg(e),new String[]{},e);
+        }
+        return result;
+    }
+
+    /**
+     * 鏁版嵁鍗囩増
+     *
+     * @param formDataDTO 鏁版嵁鐨勪紶杈撳璞�
+     * @return 鎵ц缁撴灉鍜屾樉绀哄悗鐨勫��
+     * @throws VciBaseException 淇濆瓨鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public BaseResult<Map<String, Object>> upRevision(FormDataDTO formDataDTO) throws VciBaseException {
+        //棣栧厛鍒ゆ柇瀵硅薄鏄惁涓虹┖
+        VciBaseUtil.alertNotNull(formDataDTO,"淇敼鐨勬暟鎹璞�",formDataDTO.getBtmname(),"涓氬姟绫诲瀷鐨勫悕绉�",formDataDTO.getFormDefineId(),"琛ㄥ崟瀹氫箟鐨勭紪鍙�",formDataDTO.getCopyFromVersion(),"鑰佺増鏈殑涓婚敭");
+        UIFormDefineVO formDefineVO = uiEngineService.getFormById(formDataDTO.getBtmname(), formDataDTO.getFormDefineId());
+        String preEvent = formDataDTO.getPreEvent();
+        BaseModelDTOList modelDTOList = formData2DTOList(formDataDTO);
+        BaseResult beforeResult = callPreEvent(modelDTOList, null,preEvent, VciChangeDocumentTypeEnum.UPREVISION);
+        if(!beforeResult.isSuccess()){
+            //璇存槑鍓嶇疆浜嬩欢娌℃湁鎵ц鎴愬姛
+            return beforeResult;
+        }
+        //灏佽鏁版嵁
+        BaseResult<ClientBusinessObject> resultCbo = wrapperCbo(formDataDTO,formDefineVO,false,formDataDTO.isUpVersion()?false:true,formDataDTO.isUpVersion());
+        if(!resultCbo.isSuccess()){
+            return BaseResult.fail(resultCbo.getMsg(),resultCbo.getMsgObjs());
+        }
+        //鎵ц淇濆瓨
+        BaseResult<Map<String,Object>> result = BaseResult.success();
+        try {
+            BusinessObject bo = platformClientUtil.getBOFactoryService().createBusinessObject(resultCbo.getObj().getBusinessObject(),formDataDTO.isUpVersion()?false:true,formDataDTO.isUpVersion());
+            ClientBusinessObject afterCbo = new ClientBusinessObject();
+            afterCbo.setBusinessObject(bo);
+            result.setObj(boService.cbo2Map(afterCbo));
+        } catch (VCIError vciError) {
+            throw WebUtil.getVciBaseException(vciError);
+        }
+        if(!CollectionUtils.isEmpty(formDataDTO.getReleaseFileOids())){
+            fileObjectService.releasedFile(resultCbo.getObj().getBtmName(),resultCbo.getObj().getOid(),formDataDTO.getReleaseFileOids());
+        }
+        //鍚庣疆浜嬩欢
+        String afterEvent = formDataDTO.getPostEvent();
+        try {
+            callPostEvent(Arrays.stream(new ClientBusinessObject[]{resultCbo.getObj()}).collect(Collectors.toList()), null,afterEvent, VciChangeDocumentTypeEnum.EDIT);
+        }catch (Throwable e){
+            throw new VciBaseException(LangBaseUtil.getErrorMsg(e),new String[]{},e);
+        }
+        return result;
+    }
+
+    /**
+     * 鎵归噺淇敼锛屾敞鎰忚〃鍗曞畾涔夌殑瀛楁鎵嶄細琚慨鏀癸紝ts杩欑榛樿瀛楁闄ゅ
+     *
+     * @param formDataDTOList 鏁版嵁鐨勪紶杈撳璞�
+     * @return 鎵ц缁撴灉鍜屾樉绀哄悗鐨勫��
+     * @throws VciBaseException 淇濆瓨鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public BaseResult<String> batchEditSave(FormDataDTOList formDataDTOList) throws VciBaseException {
+        VciBaseUtil.alertNotNull(formDataDTOList,"瑕佷慨鏀圭殑鏁版嵁",formDataDTOList.getFormDataDTOS(),"瑕佷慨鏀圭殑鏁版嵁");
+        //棣栧厛鍒ゆ柇瀵硅薄鏄惁涓虹┖
+        FormDataDTO firstFormDataDTO = formDataDTOList.getFormDataDTOS().stream().findFirst().get();
+        UIFormDefineVO formDefineVO = uiEngineService.getFormById(firstFormDataDTO.getBtmname(), firstFormDataDTO.getId());
+        String preEvent = firstFormDataDTO.getPreEvent();
+        BaseModelDTOList modelDTOList = formDataList2DTOList(formDataDTOList);
+        BaseResult beforeResult = callPreEvent(modelDTOList,null, preEvent, VciChangeDocumentTypeEnum.EDIT);
+        if(!beforeResult.isSuccess()){
+            //璇存槑鍓嶇疆浜嬩欢娌℃湁鎵ц鎴愬姛
+            return beforeResult;
+        }
+        //灏佽鏁版嵁
+        List<BusinessObject> updateCBOS = new ArrayList<>();
+        Map<String,List<String>> releasedFileOids = new HashMap<>();
+        List<ClientBusinessObject> afterCBOs = new ArrayList<>();
+        for(FormDataDTO formDataDTO:formDataDTOList.getFormDataDTOS()) {
+            BaseResult<ClientBusinessObject> resultCbo = wrapperCbo(formDataDTO, formDefineVO, true, false, false);
+            if (!resultCbo.isSuccess()) {
+                return BaseResult.fail(resultCbo.getMsg(), resultCbo.getMsgObjs());
+            }
+            updateCBOS.add(resultCbo.getObj().getBusinessObject());
+            //鎵ц淇濆瓨
+            if (!CollectionUtils.isEmpty(formDataDTO.getReleaseFileOids())) {
+                releasedFileOids.put(resultCbo.getObj().getOid(),formDataDTO.getReleaseFileOids());
+            }
+        }
+        try {
+            platformClientUtil.getBOFactoryService().batchUpdateBusinessObject(new BusinessObjectListHolder(updateCBOS.toArray(new BusinessObject[0])));
+        } catch (VCIError vciError) {
+            throw WebUtil.getVciBaseException(vciError);
+        }
+        if(!CollectionUtils.isEmpty(releasedFileOids)){
+            releasedFileOids.forEach((oid,fileOids)->{
+                fileObjectService.releasedFile(firstFormDataDTO.getBtmname(),oid,fileOids);
+            });
+        }
+        //鍚庣疆浜嬩欢
+        String afterEvent = firstFormDataDTO.getPostEvent();
+        try {
+            callPostEvent(afterCBOs,null, afterEvent, VciChangeDocumentTypeEnum.ADD);
+        }catch (Throwable e){
+            throw new VciBaseException(LangBaseUtil.getErrorMsg(e),new String[]{},e);
+        }
+        BaseResult result = BaseResult.success();
+        result.setData(updateCBOS.stream().map(s->s.oid).collect(Collectors.toList()));
+        return result;
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎
+     *
+     * @param deleteDataDTO 鏁版嵁鐨勪紶杈撳璞�
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 鏁版嵁琚紩鐢ㄧ殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public BaseResult batchDelete(DeleteDataDTO deleteDataDTO) throws VciBaseException {
+        VciBaseUtil.alertNotNull(deleteDataDTO,"鏁版嵁浼犺緭瀵硅薄",deleteDataDTO.getDataList(),"鏁版嵁浼犺緭瀵硅薄");
+        String btmName = deleteDataDTO.getDataList().get(0).getBtmname();
+        List<String> oidList = deleteDataDTO.getDataList().stream().map(BaseModelDTO::getOid).collect(Collectors.toList());
+        //鐪嬬湅绾ц仈鍒犻櫎銆傚彧鏈夎嚜宸卞紩鐢ㄨ嚜宸辩殑鏃跺�欏彲浠ョ骇鑱斿垹闄�
+        List<ClientBusinessObject> cbo = null;
+        if(deleteDataDTO.isCascade()){
+            //绾ц仈鍒犻櫎
+            OsBtmTypeVO btmTypeVO = btmService.getBtmById(btmName);
+            OsBtmTypeAttributeVO parentAttributeVO = btmTypeVO.getAttributes().stream().filter(s -> s.getReferBtmTypeId().equalsIgnoreCase(btmName)).findFirst().orElseGet(null);
+            if(parentAttributeVO != null){
+                //椤甸潰鍒嗛〉涓嶈兘鏄剧ず瓒呰繃1000
+                String sql = "select oid from " + VciBaseUtil.getTableName(btmName) + " where start with oid in ( " + VciBaseUtil.toInSql(oidList.toArray(new String[0])) +")  connect by  prior " + parentAttributeVO.getId() + " = oid";
+                cbo  = boService.queryBySql(sql, new HashMap<>());
+            }else{
+                cbo  = boService.selectCBOByOidCollection(oidList, btmName);
+            }
+        }else {
+            cbo = boService.selectCBOByOidCollection(oidList, btmName);
+        }
+        //鍒ゆ柇闇�瑕佹牎楠屽叧鑱�
+        if(CollectionUtils.isEmpty(cbo)){
+            return BaseResult.fail("娌℃湁鍦ㄧ郴缁熶腑鎵惧埌杩欎簺鏁版嵁锛屾湭鎵ц鍒犻櫎鎿嶄綔");
+        }
+        List<ClientBusinessObject> finalCbo = cbo;
+        Collection<Collection<String>> oidCollections = WebUtil.switchCollectionForOracleIn(finalCbo.stream().map(ClientBusinessObject::getOid).collect(Collectors.toList()));
+        List<OsUsedAttributeVO> usedAttributeVOS = null;
+        boolean adminCascade = false;
+        if("admin".equalsIgnoreCase(VciBaseUtil.getCurrentUserId()) && deleteDataDTO.isAdminCascade()){
+            adminCascade = true;
+        }
+        if(deleteDataDTO.isCheckLinkedFlag() && !adminCascade){
+            //璇存槑瑕佹牎楠屽叧鑱旂殑淇℃伅
+            usedAttributeVOS = btmService.listBtmUsedInfo(btmName);
+            if(!CollectionUtils.isEmpty(usedAttributeVOS)){
+                usedAttributeVOS.stream().forEach(usedAttributeVO->{
+                    oidCollections.stream().forEach(oids->{
+                        Map<String,String> conditionMap = new HashMap<>();
+                        conditionMap.put(usedAttributeVO.getId(),QueryOptionConstant.IN + "(" + VciBaseUtil.toInSql(oids.toArray(new String[0])) + ")");
+                        if(StringUtils.isNotBlank(usedAttributeVO.getPkBtmType())) {
+                            if (boService.queryCount(usedAttributeVO.getPkBtmType(), conditionMap) > 0) {
+                                OsBtmTypeVO btmTypeVO = btmService.getBtmById(usedAttributeVO.getPkBtmType());
+                                throw new VciBaseException("鏁版嵁鍦ㄣ��" + btmTypeVO.getName() + "銆戜腑鐨勫瓧娈礫" + usedAttributeVO.getName() + "]閲岃寮曠敤.涓嶈兘鍒犻櫎");
+                            }
+                        }else{
+                            //閾炬帴绫诲瀷
+                        }
+                    });
+                });
+            }
+        }
+        if(adminCascade){
+            //鏌ヨ鍏宠仈鐨勬暟鎹�
+            usedAttributeVOS = btmService.listBtmUsedInfo(btmName);
+            if(!CollectionUtils.isEmpty(usedAttributeVOS)){
+                usedAttributeVOS.stream().forEach(usedAttributeVO->{
+                    oidCollections.stream().forEach(oids->{
+                        Map<String,String> conditionMap = new HashMap<>();
+                        conditionMap.put(usedAttributeVO.getId(),QueryOptionConstant.IN + "(" + VciBaseUtil.toInSql(oids.toArray(new String[0])) + ")");
+                        if(StringUtils.isNotBlank(usedAttributeVO.getPkBtmType())) {
+                            List<ClientBusinessObject> tempCbos = boService.queryCBO(usedAttributeVO.getPkBtmType(), conditionMap);
+                            if(!CollectionUtils.isEmpty(tempCbos)){
+                                finalCbo.addAll(tempCbos);
+                            }
+                        }else{
+                            //閾炬帴绫诲瀷
+                        }
+                    });
+                });
+            }
+        }
+        VciBaseUtil.switchCollectionForOracleIn(finalCbo).stream().forEach(cbos->{
+            try {
+                platformClientUtil.getBOFactoryService().batchDeleteBusinessObject(cbos.stream().map(s->s.getBusinessObject()).collect(Collectors.toList()).toArray(new BusinessObject[0]),1);
+            } catch (VCIError vciError) {
+                throw WebUtil.getVciBaseException(vciError);
+            }
+        });
+        return BaseResult.success();
+    }
+
+    /**
+     * 閾炬帴绫诲瀷娣诲姞
+     *
+     * @param formLinkDataDTO 閾炬帴绫诲瀷鐨勮〃鍗曟暟鎹�
+     * @return 閾炬帴绫诲瀷鐨勪富閿�
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屽繀杈撻」缂哄け
+     */
+    @Override
+    public BaseResult<String> linkAddSave(FormLinkDataDTO formLinkDataDTO) throws VciBaseException {
+        //棣栧厛鍒ゆ柇瀵硅薄鏄惁涓虹┖
+        VciBaseUtil.alertNotNull(formLinkDataDTO,"娣诲姞鐨勬暟鎹璞�",formLinkDataDTO.getLinkType(),"閾炬帴绫诲瀷鐨勫悕绉�",formLinkDataDTO.getFormDefineId(),"琛ㄥ崟瀹氫箟鐨勭紪鍙�");
+        if(formLinkDataDTO.getData() ==null){
+            formLinkDataDTO.setData(new HashMap<>());
+        }
+        //鏀寔鐨勫満鏅�
+        /**
+         * 鏀寔鐨勫満鏅�
+         * 1. to绔暟鎹凡缁忓瓨鍦紝鍒欎繚瀛橀摼鎺ユ暟鎹紝涓嶅鐞唗o绔殑鏁版嵁
+         * 2. to绔暟鎹笉瀛樺湪锛屽垯淇濆瓨閾炬帴鏁版嵁锛屽苟涓旀坊鍔爐o绔殑鏁版嵁
+         * 3. to绔暟鎹凡缁忓瓨鍦紝浣嗘槸闇�瑕佸崌鐗�
+         * 4. to绔暟鎹凡缁忓瓨鍦紝浣嗘槸闇�瑕佸崌鐗堟
+         */
+        UIFormDefineVO formDefineVO = uiEngineService.getFormById(formLinkDataDTO.getLinkType(), formLinkDataDTO.getFormDefineId());
+
+        //鍓嶇疆浜嬩欢
+        String preEvent = formLinkDataDTO.getPreEvent();
+        BaseLinkModelDTOList modelDTOList = formLinkData2DTOList(formLinkDataDTO);
+        BaseResult beforeResult = callPreEvent(null,modelDTOList, preEvent, VciChangeDocumentTypeEnum.ADD);
+        if(!beforeResult.isSuccess()){
+            //璇存槑鍓嶇疆浜嬩欢娌℃湁鎵ц鎴愬姛
+            return beforeResult;
+        }
+        ClientLinkObject clo = null;
+        String prefix = "";
+        if(formLinkDataDTO.isDirection()){
+            prefix = LO_FROM_PREFIX;
+            VciBaseUtil.alertNotNull(formLinkDataDTO.getToid(),"to绔殑鏁版嵁涓婚敭");
+        }else{
+            VciBaseUtil.alertNotNull(formLinkDataDTO.getFoid(),"from绔殑鏁版嵁涓婚敭");
+            prefix = LO_TO_PREFIX;
+        }
+
+        //鍒ゆ柇鏁版嵁
+        String toOid = formLinkDataDTO.isDirection()?formLinkDataDTO.getFoid():formLinkDataDTO.getToid();
+        String toBtmName =  formLinkDataDTO.isDirection()?formLinkDataDTO.getFbtmname():formLinkDataDTO.getTbtmname();
+        String fromOid = formLinkDataDTO.isDirection()?formLinkDataDTO.getToid():formLinkDataDTO.getFoid();
+        String fromBtmName = formLinkDataDTO.isDirection()?formLinkDataDTO.getTbtmname():formLinkDataDTO.getFbtmname();
+        VciBaseUtil.alertNotNull(toBtmName,formLinkDataDTO.isDirection()?"from绔�":"to绔�" + "鐨勪笟鍔$被鍨�",
+                fromBtmName,formLinkDataDTO.isDirection()?"to绔�":"from绔�" + "鐨勪笟鍔$被鍨�",
+                fromOid,formLinkDataDTO.isDirection()?"to绔�":"from绔�" + "鐨勪富閿�");
+        Map<String,String> boData = new HashMap<>();
+        Map<String,String> loData = new HashMap<>();
+        if(CollectionUtils.isEmpty(formLinkDataDTO.getData()) && StringUtils.isBlank(toOid)){
+            throw new VciBaseException(formLinkDataDTO.isDirection()?"from绔�":"to绔�" + "娌℃湁浠讳綍鐨勫睘鎬ц淇濆瓨");
+        }
+        if(CollectionUtils.isEmpty(formLinkDataDTO.getData()) && StringUtils.isBlank(toBtmName)){
+            throw new VciBaseException(formLinkDataDTO.isDirection()?"from绔�":"to绔�" + "鐨勪笟鍔$被鍨嬩负绌�");
+        }
+
+        //鏌ヨfrom绔殑
+        ClientBusinessObject fromCbo = new ClientBusinessObject();
+        try {
+            fromCbo.setBusinessObject(platformClientUtil.getBOFactoryService().readBusinessObject(fromOid,fromBtmName));
+        } catch (VCIError vciError) {
+            throw WebUtil.getVciBaseException(vciError);
+        }
+        String finalPrefix = prefix;
+        formLinkDataDTO.getData().forEach((key, value)->{
+            if(key.toLowerCase().startsWith(finalPrefix)){
+                boData.put(key.substring(finalPrefix.length()).toLowerCase(),value);
+            }else{
+                loData.put(key.toLowerCase(),value);
+            }
+        });
+        //灏佽to绔殑
+        BaseResult<ClientBusinessObject> result = wrapperToCbo(formLinkDataDTO,formDefineVO,toOid,toBtmName,boData);
+        if(!result.isSuccess()){
+            return BaseResult.fail(result.getMsg(),result.getMsgObjs());
+        }
+        ClientBusinessObject toCbo = result.getObj();
+        //鍒濆鍖栭摼鎺ョ被鍨嬬殑鍊�
+        BaseResult<ClientLinkObject> resultClo = wrapperOnlyCLO(formLinkDataDTO, loData, formDefineVO, false);
+        if(!resultClo.isSuccess()){
+            return BaseResult.fail(resultClo.getMsg(),resultClo.getMsgObjs());
+        }
+        clo = resultClo.getObj();
+        if(formLinkDataDTO.isDirection()){
+            clo.setFromBO(toCbo);
+            clo.setToBO(fromCbo);
+        } else {
+            clo.setFromBO(fromCbo);
+            clo.setToBO(toCbo);
+        }
+        //鎵ц淇濆瓨
+        BusinessObject[] bos = new BusinessObject[1];
+        toCbo.dealBusinessObjectNullValue();
+        clo.dealLinkObjectNullValue();
+        bos[0] = toCbo.getBusinessObject();
+        BusinessObjectListHolder bosHolder = new BusinessObjectListHolder();
+        bosHolder.value = bos;
+        LinkObjectHolder loHolder = new LinkObjectHolder();
+        loHolder.value = clo.getLinkObject();
+        try {
+            platformClientUtil.getBOFactoryService().createBusinessObjectWithLink(bosHolder,loHolder);
+        } catch (VCIError vciError) {
+            throw WebUtil.getVciBaseException(vciError);
+        }
+        if(!CollectionUtils.isEmpty(formLinkDataDTO.getReleaseFileOids())){
+            fileObjectService.releasedFile(formLinkDataDTO.getLinkType(),clo.getOid(),formLinkDataDTO.getReleaseFileOids());
+        }
+        //鍚庣疆浜嬩欢
+        String afterEvent = formLinkDataDTO.getPostEvent();
+        try {
+            callPostEvent(null,Arrays.stream(new ClientLinkObject[]{clo}).collect(Collectors.toList()), afterEvent, VciChangeDocumentTypeEnum.ADD);
+        }catch (Throwable e){
+            //璇存槑鍚庣疆浜嬩欢鍑虹幇浜嗛敊璇紝閭d箞灏遍渶瑕佸垹闄や互鍓嶇殑杩欐潯鏁版嵁
+            try {
+                platformClientUtil.getBOFactoryService().deleteBusinessObject(toCbo.getBusinessObject(),1);
+                platformClientUtil.getBOFactoryService().deleteLinkObject(clo.getLinkObject());
+            } catch (VCIError vciError) {
+                throw WebUtil.getVciBaseException(vciError);
+            }
+            throw new VciBaseException(LangBaseUtil.getErrorMsg(e),new String[]{},e);
+        }
+        return BaseResult.success(clo.getOid());
+    }
+
+    /**
+     * 灏佽浠呬粎鍖呭惈閾炬帴绫诲瀷鐨�
+     * @param formLinkDataDTO 閾炬帴绫诲瀷鐨勬暟鎹紶杈撳璞�
+     * @param loData 閾炬帴绫诲瀷鐨勬暟鎹�
+     * @param formDefineVO 琛ㄥ崟鐨勫畾涔�
+     * @param editFlag 鏄惁涓虹紪杈�
+     * @return 閾炬帴绫诲瀷鐨勫唴瀹�
+     */
+    private BaseResult<ClientLinkObject> wrapperOnlyCLO(FormLinkDataDTO formLinkDataDTO,Map<String,String> loData,UIFormDefineVO formDefineVO,boolean editFlag){
+        Map<String,String> baseDataMap = formLinkDataDTO2MapLow(formLinkDataDTO);
+        Map<String,String> allDataMap = new HashMap<>();
+        allDataMap.putAll(loData);
+        allDataMap.putAll(baseDataMap);
+        //鏍¢獙蹇呰緭椤�
+        BaseResult result = checkRequired(formDefineVO,null,allDataMap);
+        if(!result.isSuccess()){
+            return result;
+        }
+        //鏍¢獙鍞竴椤�
+        result = checkUnique(formDefineVO,null,allDataMap,editFlag);
+        if(!result.isSuccess()){
+            return result;
+        }
+        //澶勭悊涓氬姟绫诲瀷寰楀埌鏁版嵁
+        ClientLinkObject clo ;
+        if(editFlag){
+            try {
+                LinkObject linkObject = platformClientUtil.getBOFactoryService().readLinkObjectById(formLinkDataDTO.getOid(), formLinkDataDTO.getLinkType());
+                clo = new ClientLinkObject();
+                clo.setLinkObject(linkObject);
+            } catch (VCIError vciError) {
+                throw WebUtil.getVciBaseException(vciError);
+            }
+        }else{
+            clo = new ClientLinkObject();
+            //澶勭悊鍒濆鍖栫殑鏁版嵁
+            clo.setOid(VciBaseUtil.getPk());
+            clo.setCreator(VciBaseUtil.getCurrentUserId());
+            clo.setCreateTime(VciDateUtil.getNowString());
+            clo.setTs(VciDateUtil.getNowString());
+            clo.setLoName(formLinkDataDTO.getLinkType());
+        }
+        //
+        allDataMap.forEach((key,value)->{
+            if(editFlag&&("lastmodifier".equalsIgnoreCase(key) || "lastmodifytime".equalsIgnoreCase(key)
+                    || "ts".equalsIgnoreCase(key)  || "creator".equalsIgnoreCase(key)
+                    || "createtime".equalsIgnoreCase(key))){
+                //骞冲彴涓嶈兘浼犻�掕繖涓�
+            }else{
+                loService.setAttribute(clo,key,value);
+            }
+        });
+        return BaseResult.success(clo);
+    }
+
+
+    /**
+     * 灏佽to绔殑鏁版嵁
+     * @param formLinkDataDTO 閾炬帴绫诲瀷鐨勮〃鍗曟暟鎹�
+     * @param formDefineVO 琛ㄥ崟鐨勫畾涔�
+     * @param toOid to绔殑涓婚敭
+     * @param toBtmName to鐨勪笟鍔$被鍨�
+     * @param boData to鐨勬暟鎹�
+     * @return 鍖呭惈鐨勫璞�
+     */
+    private BaseResult<ClientBusinessObject> wrapperToCbo(FormLinkDataDTO formLinkDataDTO,UIFormDefineVO formDefineVO,String toOid,String toBtmName,Map<String,String> boData){
+        Map<String,String> dataLow = new HashMap<>();
+        boData.forEach((key,value)->{
+            dataLow.put(key.toLowerCase(),value);
+        });
+        boolean editFlag = StringUtils.isNotBlank(toOid) && !formLinkDataDTO.isToUpRevision() && !formLinkDataDTO.isToUpVersion() && !CollectionUtils.isEmpty(dataLow);
+        if((formLinkDataDTO.isToUpRevision() || formLinkDataDTO.isToUpVersion()) && StringUtils.isBlank(toOid)){
+            throw new VciBaseException("鍗囩増鐨勬椂鍊欙紝鑰佺増鏈暟鎹殑涓婚敭涓嶈兘涓虹┖");
+        }
+        String prefix = formLinkDataDTO.isDirection()?LO_FROM_PREFIX:LO_TO_PREFIX;
+        //鍒ゆ柇蹇呰緭椤�
+        BaseResult result = checkRequired(formDefineVO,prefix,dataLow);
+        if(!result.isSuccess()){
+            return result;
+        }
+        Map<String,String> baseDataMap = new HashMap<>();
+        WebUtil.copyValueForMap(dataLow,baseDataMap,dataLow.keySet().toArray(new String[0]));
+        baseDataMap.put("btmname",toBtmName);
+        baseDataMap.put("oid",toOid);
+        if(formLinkDataDTO.isToUpRevision() || formLinkDataDTO.isToUpVersion()){
+            baseDataMap.put("copyfromversion",toOid);
+        }
+        //鍒ゆ柇鍞竴椤�
+        result = checkUnique(formDefineVO,prefix,baseDataMap,editFlag);
+        if(!result.isSuccess()){
+            return result;
+        }
+        ClientBusinessObject cbo = createOrGetCbo(dataLow,baseDataMap,editFlag,formLinkDataDTO.isToUpRevision(),formLinkDataDTO.isToUpVersion());
+        return BaseResult.success(cbo);
+
+    }
+
+    /**
+     * 鏍¢獙蹇呰緭椤�
+     * @param formDefineVO 琛ㄥ崟鐨勫畾涔�
+     * @param prefix 鍓嶇紑锛堥摼鎺ョ被鍨嬬殑琛ㄥ崟浣跨敤锛�
+     * @param dataLow 鏁版嵁鐨勫皬鍐�
+     * @return 鎵ц缁撴灉
+     */
+    private BaseResult checkRequired(UIFormDefineVO formDefineVO,String prefix,Map<String,String> dataLow){
+        final BaseResult[] result = {BaseResult.success()};
+        if(prefix == null){
+            prefix = "";
+        }
+        List<UIFormItemVO> items = formDefineVO.getItems();
+        List<UIFormItemVO> requiredItems = items.stream().filter(item -> item.isRequired()).collect(Collectors.toList());
+        if(!CollectionUtils.isEmpty(requiredItems)){
+            String finalPrefix = prefix;
+            if(requiredItems.stream().anyMatch(item->{
+                Object value = dataLow.getOrDefault(item.getField().toLowerCase(),dataLow.getOrDefault(item.getField().toLowerCase().substring(finalPrefix.length()),null));
+                if(value == null || ( (value instanceof String) && StringUtils.isBlank((String)value))){
+                    result[0] = BaseResult.fail(item.getText() + "鐨勫�间笉鑳戒负绌�");
+                    return true;
+                }
+                return  false;
+            })){
+                return result[0];
+            }
+        }
+        return result[0];
+    }
+
+    /**
+     * 鏍¢獙鏄惁閲嶅
+     * @param formDefineVO 琛ㄥ崟鐨勯厤缃�
+     * @param prefix 鍓嶇紑
+     * @param dataLow 鏁版嵁鐨勫皬鍐�
+     * @param editFlag 鏄惁缂栬緫
+     * @return 鏍¢獙缁撴灉
+     */
+    public BaseResult checkUnique(UIFormDefineVO formDefineVO, String prefix,Map<String,String> dataLow,boolean editFlag){
+        final BaseResult[] result = {BaseResult.success()};
+        List<UIFormItemVO> uniqueItems = formDefineVO.getItems().stream().filter(item -> item.isUnique()).collect(Collectors.toList());
+        if(!CollectionUtils.isEmpty(uniqueItems)){
+            if(uniqueItems.stream().anyMatch(item->{
+                String field = item.getField().toLowerCase();
+                if(StringUtils.isNotBlank(prefix) && field.startsWith(prefix)){
+                    field = field.substring(prefix.length());
+                }
+                Object value = dataLow.getOrDefault(field,null);
+                if(value == null || ( (value instanceof String) && StringUtils.isBlank((String)value))){
+                    result[0] = BaseResult.fail(item.getText() + "鐨勫�间笉鑳戒负绌�");
+                    return true;
+                }
+                //鎴戜滑鏌ヨ鍐呭
+                Map<String,String> conditionMap = new HashMap<>();
+                conditionMap.put(item.getField().toLowerCase(),WebUtil.getStringValueFromObject(value));
+                if(editFlag){
+                    String oid = dataLow.get("oid");
+                    VciBaseUtil.alertNotNull(oid,"涓婚敭");
+                    conditionMap.put("oid",QueryOptionConstant.NOTEQUAL + oid);
+                }
+                if(formDefineVO.isLinkTypeFlag()){
+                    if (loService.queryCount(formDefineVO.getBtmType(), conditionMap) > 0) {
+                        result[0] = BaseResult.fail("[" + item.getText() + "]鐨勫�煎彂鐢熶簡閲嶅");
+                        return true;
+                    }
+                }else {
+                    if (boService.queryCount(formDefineVO.getBtmType(), conditionMap) > 0) {
+                        result[0] = BaseResult.fail("[" + item.getText() + "]鐨勫�煎彂鐢熶簡閲嶅");
+                        return true;
+                    }
+                }
+                return false;
+            })){
+                return result[0];
+            }
+        }
+         return result[0];
+    }
+
+    /**
+     * 鍒涘缓鎴栬�呰鍙朿bo瀵硅薄
+     * @param dataLowMap 鏁版嵁锛堝皬鍐欙級
+     * @param baseDataMap 鍩虹鏁版嵁
+     * @param editFlag 鏄惁缂栬緫
+     * @param newRevision 鏄惁鍗囩増
+     * @param newVersion 鏄惁鍗囩増娆�
+     * @return cbo瀵硅薄
+     */
+    public ClientBusinessObject createOrGetCbo(Map<String,String> dataLowMap,Map<String,String> baseDataMap,boolean editFlag,boolean newRevision,boolean newVersion){
+        String btmName = baseDataMap.get("btmname");
+        String oid = baseDataMap.get("oid");
+        ClientBusinessObject cbo = new ClientBusinessObject();
+        String copyfromversion = baseDataMap.get("copyfromversion");
+        OsBtmTypeVO btmTypeVO = btmService.getBtmById(btmName);
+        if(editFlag || newRevision || newVersion){
+            try {
+                cbo.setBusinessObject(platformClientUtil.getBOFactoryService().readBusinessObject(editFlag?oid:copyfromversion,btmName));
+            } catch (VCIError vciError) {
+                throw new VciBaseException("浣跨敤涓婚敭鍦ㄧ郴缁熶腑娌℃湁鏌ヨ鍒版暟鎹�",new String[]{oid},vciError);
+            }
+            if(btmTypeVO.isRevisionFlag() && newRevision){
+                cbo.setOid(VciBaseUtil.getPk());
+                cbo.setCopyFromVersion(copyfromversion);
+                if(btmTypeVO.isInputRevisionFlag() && StringUtils.isNotBlank(baseDataMap.getOrDefault("revisionvalue",""))){
+                    //鎵嬪姩鐨勶紝鎵�浠ヤ笉澶勭悊鐗堟湰瑙勫垯浜�
+                    cbo.setRevisionValue(baseDataMap.get("revisionvalue"));
+                }else{
+                    //璇存槑鏄崌鐗�
+                    BaseModel baseModel = cbo2BaseModel(cbo);
+                    RevisionValueObject revisionValueObject = getNextRevision(btmTypeVO,baseModel);
+                    cbo.setRevisionid(VciBaseUtil.getPk());
+                    cbo.setRevisionSeq(revisionValueObject.getRevisionSeq());
+                    cbo.setRevisionValue(revisionValueObject.getRevisionVal());
+                    cbo.setIsLastR(1);
+                    cbo.setIsFirstR(0);
+                    //澶勭悊鐗堟
+                    cbo.setVersionValue(getFirstVersion(btmTypeVO.getVersionRule()));
+                    cbo.setVersionRule(btmTypeVO.getVersionRule());
+                    cbo.setVersionSeq(0);
+                    cbo.setIsLastV(1);
+                    cbo.setIsFirstV(1);
+                }
+                //鍗囩増鐨勬椂鍊欙紝鐢熷懡鍛ㄦ湡鐨勭姸鎬侀渶瑕佹敼鍔ㄥ埌榛樿鐘舵��
+                if(StringUtils.isNotBlank(btmTypeVO.getLifeCycleId())){
+                    //鏌ヨ鐢熷懡鍛ㄦ湡
+                    OsLifeCycleVO lifeCycleVO = lifeCycleService.getLifeCycleById(btmTypeVO.getLifeCycleId());
+                    if(lifeCycleVO == null || StringUtils.isBlank(lifeCycleVO.getOid())){
+                        throw new VciBaseException("{0}閲岀殑鐢熷懡鍛ㄦ湡璁剧疆寰椾笉姝g‘锛屽湪绯荤粺涓病鏈夋壘鍒皗1}杩欎釜鐢熷懡鍛ㄦ湡",new String[]{btmTypeVO.getName(),btmTypeVO.getLifeCycleId()});
+                    }
+                    cbo.setLcStatus(lifeCycleVO.getStartStatus());
+                }
+            }
+            if(btmTypeVO.isRevisionFlag() && newVersion){
+                cbo.setCopyFromVersion(copyfromversion);
+                cbo.setOid(VciBaseUtil.getPk());
+                //杩欐槸鍗囩増娆★紝涓嶅瓨鍦ㄥ嵆鍗囩増鏈紝鍙堝崌鐗堟鐨勬儏鍐�
+                BaseModel baseModel = cbo2BaseModel(cbo);
+                VersionValueObject versionValueObject = getNextVersion(btmTypeVO,baseModel);
+                cbo.setVersionValue(versionValueObject.getVersionVal());
+                cbo.setVersionSeq(versionValueObject.getVersionSeq());
+                cbo.setIsLastV(1);
+                cbo.setIsFirstV(0);
+                //鍗囩増鐨勬椂鍊欙紝鐢熷懡鍛ㄦ湡鐨勭姸鎬侀渶瑕佹敼鍔ㄥ埌榛樿鐘舵��
+                if(StringUtils.isNotBlank(btmTypeVO.getLifeCycleId())){
+                    //鏌ヨ鐢熷懡鍛ㄦ湡
+                    OsLifeCycleVO lifeCycleVO = lifeCycleService.getLifeCycleById(btmTypeVO.getLifeCycleId());
+                    if(lifeCycleVO == null || StringUtils.isBlank(lifeCycleVO.getOid())){
+                        throw new VciBaseException("{0}閲岀殑鐢熷懡鍛ㄦ湡璁剧疆寰椾笉姝g‘锛屽湪绯荤粺涓病鏈夋壘鍒皗1}杩欎釜鐢熷懡鍛ㄦ湡",new String[]{btmTypeVO.getName(),btmTypeVO.getLifeCycleId()});
+                    }
+                    cbo.setLcStatus(lifeCycleVO.getStartStatus());
+                }
+            }
+        }else{
+            //鎴戜滑闇�瑕佸皢灞炴�у垵濮嬪寲
+            if(StringUtils.isBlank(cbo.getOid()) || (newRevision || newVersion)){
+                cbo.setOid(VciBaseUtil.getPk());
+            }
+            if(StringUtils.isBlank(cbo.getCreator())){
+                cbo.setCreator(VciBaseUtil.getCurrentUserId());
+            }
+            if(StringUtils.isBlank(cbo.getCreateTime())){
+                cbo.setCreateTime(VciDateUtil.getNowString());
+            }
+            if(StringUtils.isBlank(cbo.getOwner())){
+                cbo.setOwner(cbo.getCreator());
+            }
+            cbo.setTs(VciDateUtil.getNowString());
+            if(StringUtils.isNotBlank(btmTypeVO.getLifeCycleId()) && (StringUtils.isBlank(cbo.getLcStatus()) || newRevision || newVersion)){
+                //鏌ヨ鐢熷懡鍛ㄦ湡
+                OsLifeCycleVO lifeCycleVO = lifeCycleService.getLifeCycleById(btmTypeVO.getLifeCycleId());
+                if(lifeCycleVO == null || StringUtils.isBlank(lifeCycleVO.getOid())){
+                    throw new VciBaseException("{0}閲岀殑鐢熷懡鍛ㄦ湡璁剧疆寰椾笉姝g‘锛屽湪绯荤粺涓病鏈夋壘鍒皗1}杩欎釜鐢熷懡鍛ㄦ湡",new String[]{btmTypeVO.getName(),btmTypeVO.getLifeCycleId()});
+                }
+                cbo.setLcStatus(lifeCycleVO.getStartStatus());
+                cbo.setLctId(btmTypeVO.getLifeCycleId());
+            }
+            if(StringUtils.isBlank(cbo.getBtmName())){
+                cbo.setBtmName(btmTypeVO.getId());
+            }
+            if(btmTypeVO.isRevisionFlag()){
+                //瑕佺鐞嗙増鏈�
+                if(btmTypeVO.isInputRevisionFlag() && StringUtils.isNotBlank(baseDataMap.getOrDefault("revisionvalue",""))){
+                    //鎵嬪姩鐨勶紝鎵�浠ヤ笉澶勭悊鐗堟湰瑙勫垯浜�
+                    cbo.setRevisionValue(baseDataMap.get("revisionvalue"));
+                }else {
+                    OsRevisionRuleVO ruleVO = revisionRuleServiceI.getRevisionRuleById(btmTypeVO.getRevisionRuleId());
+                    if (ruleVO == null || StringUtils.isBlank(ruleVO.getOid())) {
+                        throw new VciBaseException("{0}閲岀殑鐗堟湰瑙勫垯璁剧疆寰椾笉姝g‘锛屽湪绯荤粺涓病鏈夋壘鍒皗1}杩欎釜鐗堟湰瑙勫垯", new String[]{btmTypeVO.getName(), btmTypeVO.getRevisionRuleId()});
+                    }
+                    cbo.setRevisionValue(ruleVO.getStartCode());
+                }
+                if (StringUtils.isBlank(cbo.getNameoid())) {
+                    cbo.setNameoid(VciBaseUtil.getPk());
+                }
+                if (StringUtils.isBlank(cbo.getRevisionid())) {
+                    cbo.setRevisionid(VciBaseUtil.getPk());
+                }
+                cbo.setIsFirstR(1);
+                cbo.setIsLastR(1);
+                cbo.setRevisionRule(btmTypeVO.getRevisionRuleId());
+                cbo.setRevisionSeq(0);
+                //鐪嬬湅鏄惁闇�瑕佸鐞嗙増娆�
+
+                cbo.setVersionValue(getFirstVersion(btmTypeVO.getVersionRule()));
+                cbo.setVersionRule(btmTypeVO.getVersionRule());
+                cbo.setVersionSeq(0);
+                cbo.setIsLastV(1);
+                cbo.setIsFirstV(1);
+            }
+        }
+        setValueToCbo(dataLowMap,baseDataMap,cbo,editFlag);
+        return cbo;
+    }
+
+    /**
+     * 鍩虹鐨勫睘鎬�
+     */
+    public static final List<String> basicFields = new ArrayList<String>(){{
+        add("id");
+        add("name");
+        add("description");
+        add("secretgrade");
+    }};
+
+    /**
+     * 缂栬緫鏃朵笉澶勭悊鐨勪功搴�
+     * @param key 灞炴��
+     * @return true
+     */
+    private boolean notSendOnEdit(String key){
+        return "lastmodifier".equalsIgnoreCase(key) || "lastmodifytime".equalsIgnoreCase(key) || "ts".equalsIgnoreCase(key) || "creator".equalsIgnoreCase(key) || "createTime".equalsIgnoreCase(key);
+    }
+
+    /**
+     * 璁剧疆鍊煎埌涓氬姟绫诲瀷鐨勫璞′笂
+     * @param dataLow 鏁版嵁锛坘ey灏忓啓锛�
+     * @param baseDataLow 鍩虹灞炴�х殑鏁版嵁锛坘ey灏忓啓)
+     * @param cbo 涓氬姟绫诲瀷鐨勫璞�
+     * @param editFlag 鏄惁涓虹紪杈�
+     */
+    @Override
+    public void setValueToCbo(Map<String, String> dataLow, Map<String, String> baseDataLow, ClientBusinessObject cbo, boolean editFlag){
+        dataLow.forEach((key,value)->{
+            if(editFlag&&notSendOnEdit(key)){
+                //骞冲彴涓嶈兘浼犻�掕繖涓�
+            }else{
+                try {
+                    cbo.setAttributeValueWithNoCheck(key, value, !editFlag);
+                } catch (VCIError vciError) {
+                    throw new VciBaseException("{0}鐨勫�间笉绗﹀悎瑕佹眰锛屽綋鍓嶆槸{1}", new String[]{key, value}, vciError);
+                }
+            }
+        });
+        baseDataLow.forEach((key,value)->{
+            if(editFlag&&notSendOnEdit(key)){
+                //骞冲彴涓嶈兘浼犻�掕繖涓�
+            }else{
+                if(editFlag) {
+                    //缂栬緫鐨勬椂鍊欏彲浠ラ兘璁剧疆
+                    try {
+                        cbo.setAttributeValueWithNoCheck(key, value, !editFlag);
+                    } catch (VCIError vciError) {
+                        throw new VciBaseException("{0}鐨勫�间笉绗﹀悎瑕佹眰锛屽綋鍓嶆槸{1}", new String[]{key, value}, vciError);
+                    }
+                }else{
+                    //鍙渶瑕佸鐞唅d,name,description锛屽瘑绾у嵆鍙紝鍏朵綑鐨勯兘宸茬粡琚缃簡
+                    if(basicFields.contains(key) &&StringUtils.isNotBlank(value)){
+                        try {
+                            cbo.setAttributeValueWithNoCheck(key, value, true);
+                        } catch (VCIError vciError) {
+                            throw new VciBaseException("{0}鐨勫�间笉绗﹀悎瑕佹眰锛屽綋鍓嶆槸{1}", new String[]{key, value}, vciError);
+                        }
+                    }
+                }
+            }
+        });
+    }
+
+    /**
+     * 閾炬帴绫诲瀷鐨勭紪杈戞暟鎹�
+     *
+     * @param formLinkDataDTO 鏁版嵁鐨勪紶杈撳璞�
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屽繀杈撻」缂哄け
+     */
+    @Override
+    public BaseResult linkEditSave(FormLinkDataDTO formLinkDataDTO) throws VciBaseException {
+        VciBaseUtil.alertNotNull(formLinkDataDTO,"淇敼鐨勬暟鎹璞�",formLinkDataDTO.getLinkType(),"閾炬帴绫诲瀷鐨勫悕绉�",
+                formLinkDataDTO.getFormDefineId(),"琛ㄥ崟瀹氫箟鐨勭紪鍙�",formLinkDataDTO.getOid(),"涓婚敭",
+                formLinkDataDTO.getFoid(),"from绔富閿�",formLinkDataDTO.getToid(),"to绔富閿�");
+        if(formLinkDataDTO.getData() ==null){
+            formLinkDataDTO.setData(new HashMap<>());
+        }
+        /**
+         * 鏀寔鐨勫満鏅�
+         * 1. 濡傛灉鏈塼o绔殑鍏朵粬灞炴�х殑鍊煎氨鏇存柊
+         * 2. 娌℃湁鍏朵粬灞炴�х殑鍊硷紝鍙洿鏂伴摼鎺ョ被鍨�
+         */
+        UIFormDefineVO formDefineVO = uiEngineService.getFormById(formLinkDataDTO.getLinkType(), formLinkDataDTO.getFormDefineId());
+        //鍓嶇疆浜嬩欢
+        String preEvent = formLinkDataDTO.getPreEvent();
+        BaseLinkModelDTOList modelDTOList = formLinkData2DTOList(formLinkDataDTO);
+        BaseResult beforeResult = callPreEvent(null,modelDTOList, preEvent, VciChangeDocumentTypeEnum.ADD);
+        if(!beforeResult.isSuccess()){
+            //璇存槑鍓嶇疆浜嬩欢娌℃湁鎵ц鎴愬姛
+            return beforeResult;
+        }
+        ClientLinkObject clo = null;
+        String prefix = formLinkDataDTO.isDirection()?LO_FROM_PREFIX:LO_TO_PREFIX;
+        String toOid = formLinkDataDTO.isDirection()?formLinkDataDTO.getFoid():formLinkDataDTO.getToid();
+        String toBtmName =  formLinkDataDTO.isDirection()?formLinkDataDTO.getFbtmname():formLinkDataDTO.getTbtmname();
+        String fromOid = formLinkDataDTO.isDirection()?formLinkDataDTO.getToid():formLinkDataDTO.getFoid();
+        String fromBtmName = formLinkDataDTO.isDirection()?formLinkDataDTO.getTbtmname():formLinkDataDTO.getFbtmname();
+
+        Map<String,String> boData = new HashMap<>();
+        Map<String,String> loData = new HashMap<>();
+        if(!CollectionUtils.isEmpty(formLinkDataDTO.getData())){
+            formLinkDataDTO.getData().forEach((key, value)->{
+                if(key.toLowerCase().startsWith(prefix)){
+                    boData.put(key.substring(prefix.length()).toLowerCase(),value);
+                }else{
+                    loData.put(key.toLowerCase(),value);
+                }
+            });
+        }
+        ClientBusinessObject toCbo =null;
+        if(!CollectionUtils.isEmpty(boData)) {
+            //灏佽to绔殑
+            BaseResult<ClientBusinessObject> result = wrapperToCbo(formLinkDataDTO, formDefineVO, toOid, toBtmName, boData);
+            if (!result.isSuccess()) {
+                return BaseResult.fail(result.getMsg(), result.getMsgObjs());
+            }
+            toCbo= result.getObj();
+        }
+
+        //鍒濆鍖栭摼鎺ョ被鍨嬬殑鍊�
+        BaseResult<ClientLinkObject> resultClo = wrapperOnlyCLO(formLinkDataDTO, loData, formDefineVO, true);
+        if(!resultClo.isSuccess()){
+            return BaseResult.fail(resultClo.getMsg(),resultClo.getMsgObjs());
+        }
+        clo = resultClo.getObj();
+        if(toCbo!=null) {
+            if (formLinkDataDTO.isDirection()) {
+                clo.setFromBO(toCbo);
+            } else {
+                clo.setToBO(toCbo);
+            }
+        }
+        LinkObjectHolder loHolder = new LinkObjectHolder();
+        loHolder.value = clo.getLinkObject();
+        try {
+            platformClientUtil.getBOFactoryService().updateLinkObject(loHolder);
+        } catch (VCIError vciError) {
+            throw WebUtil.getVciBaseException(vciError);
+        }
+        //淇濆瓨to绔垨鑰協rom绔�
+        BusinessObjectHolder boHolder = new BusinessObjectHolder();
+        toCbo.dealBusinessObjectNullValue();
+        boHolder.value = toCbo.getBusinessObject();
+        try{
+            platformClientUtil.getBOFactoryService().updateBusinessObject(boHolder);
+        } catch (VCIError vciError) {
+            throw WebUtil.getVciBaseException(vciError);
+        }
+        if(!CollectionUtils.isEmpty(formLinkDataDTO.getReleaseFileOids())){
+            fileObjectService.releasedFile(formLinkDataDTO.getLinkType(),clo.getOid(),formLinkDataDTO.getReleaseFileOids());
+        }
+        //鍚庣疆浜嬩欢
+        String afterEvent = formLinkDataDTO.getPostEvent();
+        try {
+            callPostEvent(null,Arrays.stream(new ClientLinkObject[]{clo}).collect(Collectors.toList()), afterEvent, VciChangeDocumentTypeEnum.ADD);
+        }catch (Throwable e){
+            //鍚庣疆浜嬩欢鏈夐棶棰樹簡灏卞彧鑳芥槸杩欐牱浜嗭紝娌″姙娉曟仮澶�
+            throw new VciBaseException(LangBaseUtil.getErrorMsg(e),new String[]{},e);
+        }
+        return BaseResult.success(clo.getOid());
+    }
+
+    /**
+     * 鍒犻櫎閾炬帴绫诲瀷
+     *
+     * @param deleteLinkDataDTO 鏁版嵁鐨勪紶杈撳璞�
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屽繀杈撻」缂哄け
+     */
+    @Override
+    public BaseResult batchLinkDelete(DeleteLinkDataDTO deleteLinkDataDTO) throws VciBaseException {
+        VciBaseUtil.alertNotNull(deleteLinkDataDTO,"鍒犻櫎鏁版嵁",deleteLinkDataDTO.getDataList(),"瑕佸垹闄ょ殑淇℃伅");
+        if(deleteLinkDataDTO.getDataList().stream().anyMatch(s->StringUtils.isBlank(s.getOid()) || StringUtils.isBlank(s.getLinkType()))){
+            throw new VciBaseException("鏈夋暟鎹殑涓婚敭(鎴栭摼鎺ョ被鍨嬶級娌℃湁鍊硷紝鏃犳硶鍒犻櫎");
+        }
+        List<ClientLinkObject> clos = new ArrayList<>();
+        VciBaseUtil.switchListForOracleIn(deleteLinkDataDTO.getDataList()).stream().forEach(linkModelDTOs->{
+            Map<String,String> conditionMap = new HashMap<>();
+            conditionMap.put("oid",QueryOptionConstant.IN +"(" + VciBaseUtil.toInSql(linkModelDTOs.stream().map(BaseLinkModelDTO::getOid).toArray(String[]::new)) +")");
+            List<ClientLinkObject> clientLinkObjects = loService.queryCLO(linkModelDTOs.get(0).getLinkType(), conditionMap);
+            if(!CollectionUtils.isEmpty(clientLinkObjects)){
+                clos.addAll(clientLinkObjects);
+            }
+        });
+        if(CollectionUtils.isEmpty(clos)){
+            throw new VciBaseException("浣跨敤涓婚敭娌℃湁鍦ㄧ郴缁熶腑鎵惧埌閾炬帴绫诲瀷鐨勬暟鎹�");
+        }
+        Map<String,List<ClientLinkObject>> fromBtmGroups = clos.stream().collect(Collectors.groupingBy(s->s.getFromBTMName()));
+        Map<String,List<ClientLinkObject>> toBtmGroups = clos.stream().collect(Collectors.groupingBy(s->s.getToBTMName()));
+        Map<String,List<ClientBusinessObject>> fromBtmDataGroups = new HashMap<>();
+        Map<String,List<ClientBusinessObject>> toBtmDataGroups = new HashMap<>();
+        if(!CollectionUtils.isEmpty(fromBtmGroups)){
+            fromBtmGroups.forEach((btmType,cloList)->{
+                List<ClientBusinessObject> cbos = boService.selectCBOByOidCollection(cloList.stream().map(ClientLinkObject::getFromOid).collect(Collectors.toList()), btmType);
+                fromBtmDataGroups.put(btmType,cbos);
+            });
+        }
+        if(!CollectionUtils.isEmpty(toBtmGroups)){
+            toBtmGroups.forEach((btmType,cloList)->{
+                List<ClientBusinessObject> cbos = boService.selectCBOByOidCollection(cloList.stream().map(ClientLinkObject::getToOid).collect(Collectors.toList()), btmType);
+                toBtmDataGroups.put(btmType,cbos);
+            });
+        }
+
+        if(StringUtils.isNotBlank(deleteLinkDataDTO.getCheckNotDelete())){
+            //闇�瑕佹牎楠屽唴瀹�
+            Map<String, String> checkNotDeleteMap = VciBaseUtil.getParamsByUrl(deleteLinkDataDTO.getCheckNotDelete());
+            checkNotDeleteMap.forEach((attr,attrValue)->{
+                if(StringUtils.isBlank(attr) || StringUtils.isBlank(attrValue)){
+                    throw new VciBaseException("鏍¢獙鏄惁鑳藉垹闄ょ殑閰嶇疆閿欒锛屾病鏈夊睘鎬х殑鍊笺�傛牸寮忛渶瑕亁xx=yyy&zzz=aaa");
+                }
+                if(attr.toLowerCase().startsWith(LO_FROM_PREFIX)){
+                    fromBtmDataGroups.forEach((btm,cbos)->{
+                        String attrNotPrefix = attr.substring(LO_FROM_PREFIX.length());
+                        if(!CollectionUtils.isEmpty(cbos) && cbos.stream().anyMatch(s->!attrValue.equalsIgnoreCase(s.getAttributeValue(attrNotPrefix)))){
+                            throw new VciBaseException("鏁版嵁鐨勫唴瀹逛笉鍏佽鍒犻櫎,{0}", new String[]{deleteLinkDataDTO.getCheckNotDeleteMsg()});
+                        }
+                    });
+                }else if(attr.toLowerCase().startsWith(LO_TO_PREFIX)){
+                    toBtmDataGroups.forEach((btm,cbos)->{
+                        String attrNotPrefix = attr.substring(LO_TO_PREFIX.length());
+                        if(!CollectionUtils.isEmpty(cbos) && cbos.stream().anyMatch(s->!attrValue.equalsIgnoreCase(s.getAttributeValue(attrNotPrefix)))){
+                            throw new VciBaseException("鏁版嵁鐨勫唴瀹逛笉鍏佽鍒犻櫎,{0}", new String[]{deleteLinkDataDTO.getCheckNotDeleteMsg()});
+                        }
+                    });
+                }else {
+                    if (clos.stream().anyMatch(s -> attrValue.equalsIgnoreCase(s.getAttributeValue(attr)))) {
+                        throw new VciBaseException("鏁版嵁鐨勫唴瀹逛笉鍏佽鍒犻櫎,{0}", new String[]{deleteLinkDataDTO.getCheckNotDeleteMsg()});
+                    }
+                }
+            });
+        }
+        //閾炬帴绫诲瀷鏈韩涓�鑸笉浼氭湁鍏宠仈
+        List<LinkObject> los = new ArrayList<>();
+        clos.stream().forEach(clo->{
+            los.add(clo.getLinkObject());
+        });
+        try {
+            platformClientUtil.getBOFactoryService().batchDeleteLinkObject(los.toArray(new LinkObject[0]));
+        } catch (VCIError vciError) {
+            throw WebUtil.getVciBaseException(vciError);
+        }
+        if(deleteLinkDataDTO.isDeleteFromData()){
+            fromBtmDataGroups.forEach((btm,cbos)->{
+                try{
+                    platformClientUtil.getBOFactoryService().batchDeleteBusinessObject(cbos.stream().map(ClientBusinessObject::getBusinessObject).toArray(BusinessObject[] :: new),1);
+                }catch (VCIError vciError) {
+                    throw WebUtil.getVciBaseException(vciError);
+                }
+            });
+        }
+        if(deleteLinkDataDTO.isDeleteToData()){
+            toBtmDataGroups.forEach((btm,cbos)->{
+                try{
+                    platformClientUtil.getBOFactoryService().batchDeleteBusinessObject(cbos.stream().map(ClientBusinessObject::getBusinessObject).toArray(BusinessObject[] :: new),1);
+                }catch (VCIError vciError) {
+                    throw WebUtil.getVciBaseException(vciError);
+                }
+            });
+        }
+        return BaseResult.success();
+    }
+
+    /**
+     * 鑾峰彇鍙傜収鐨勪俊鎭�
+     *
+     * @param referConfigVO 鍙傜収鐨勯厤缃�
+     * @param pageHelper    鍒嗛〉鐨勫伐鍏�
+     * @return 鍒楄〃鏁版嵁
+     */
+    @Override
+    public DataGrid referDataGrid(ReferConfigVO referConfigVO, PageHelper pageHelper) {
+        checkReferConfig(referConfigVO);
+        //浣跨敤涓氬姟绫诲瀷鏌ヨ
+        OsBtmTypeVO btmById = btmService.getBtmById(referConfigVO.getReferBo());
+        if(referConfigVO.getConditionMap() == null){
+            referConfigVO.setConditionMap(new HashMap<>());
+        }
+        if(VciBaseUtil.containsKeyUnCaseForMap(referConfigVO.getConditionMap(), VciQueryWrapperForDO.LC_STATUS_FIELD) &&
+                FrameWorkLcStatusConstant.FRAME_WORK_LIFE_CYCLE_NAME.equalsIgnoreCase(btmById.getLifeCycleId())){
+            referConfigVO.getConditionMap().put(VciQueryWrapperForDO.LC_STATUS_FIELD,FrameworkDataLCStatus.ENABLED.getValue());
+        }
+        if(VciBaseUtil.containsKeyUnCaseForMap(referConfigVO.getConditionMap(), VciQueryWrapperForDO.LC_STATUS_FIELD) &&
+                FrameWorkLcStatusConstant.RELEASE_LIFE_CYCLE.equalsIgnoreCase(btmById.getLifeCycleId())){
+            referConfigVO.getConditionMap().put(VciQueryWrapperForDO.LC_STATUS_FIELD, ReleaseDataLCStatus.RELEASED.getValue());
+        }
+        if(StringUtils.isNotBlank(referConfigVO.getQueryScheme())){
+            return boService.queryGridByScheme(referConfigVO.getQueryScheme(),referConfigVO.getConditionMap(),referConfigVO.getReplaceMap(),pageHelper);
+        }else{
+            return boService.queryGridByBo(referConfigVO.getReferBo(),referConfigVO.getConditionMap(),pageHelper);
+        }
+    }
+
+    /**
+     * 妫�鏌ュ弬鐓х殑淇℃伅
+     * @param referConfigVO 鍙傜収鐨勪俊鎭�
+     */
+    private void checkReferConfig(ReferConfigVO referConfigVO){
+        VciBaseUtil.alertNotNull(referConfigVO,"鍙傜収鐨勪俊鎭�");
+        if(StringUtils.isBlank(referConfigVO.getReferField()) && StringUtils.isBlank(referConfigVO.getReferBo())){
+            throw new VciBaseException("娌℃湁鍙傜収鐨勯厤缃俊鎭�");
+        }
+        if(StringUtils.isBlank(referConfigVO.getReferBo()) && StringUtils.isNotBlank(referConfigVO.getReferField())){
+            //鏍规嵁瀛楁鑾峰彇鍙傜収鐨勭被鍨�
+            OsAttributeVO attributeVO = attributeService.getAttr(referConfigVO.getReferField());
+            if(attributeVO == null || StringUtils.isBlank(attributeVO.getOid())){
+                throw new VciBaseException("杩欎釜灞炴�0}鍦ㄧ郴缁熶腑涓嶅瓨鍦�",new String[]{referConfigVO.getReferField()});
+            }
+            referConfigVO.setReferBo(attributeVO.getBtmTypeId());
+            if(StringUtils.isBlank(attributeVO.getBtmTypeId())){
+                throw new VciBaseException("杩欎釜灞炴�0}鍦ㄤ笉鏄弬鐓у睘鎬�",new String[]{referConfigVO.getReferField()});
+            }
+        }
+    }
+
+    /**
+     * 鑾峰彇鏍戝舰鐨勫弬鐓�
+     *
+     * @param referConfigVO 鍙傜収鐨勯厤缃�
+     * @return 鏍戝舰鐨勬暟鎹�
+     */
+    @Override
+    public List<Tree> referTree(ReferConfigVO referConfigVO) {
+        checkReferConfig(referConfigVO);
+        if(referConfigVO.getConditionMap() == null){
+            referConfigVO.setConditionMap(new HashMap<>());
+        }
+
+        List<ClientBusinessObject> cbos = null;
+        String oidFieldName = StringUtils.isNotBlank(referConfigVO.getParentUsedField())?referConfigVO.getParentUsedField():referConfigVO.getValueField();
+        if(referConfigVO.isSelectAllLevel()) {
+            String parentOidSql = "";
+            if(StringUtils.isNotBlank(referConfigVO.getParentOid())){
+                String temp = referConfigVO.getParentOid();
+                if(temp.startsWith(QueryOptionConstant.IN)){
+                    temp = temp.substring((QueryOptionConstant.IN).length()).trim();
+                    parentOidSql = " in " + ((temp.startsWith("(")  && temp.endsWith(")"))?temp:"(" + temp + ")");
+                }else if(temp.startsWith(QueryOptionConstant.NOTIN)){
+                    parentOidSql = " not in " + ((temp.startsWith("(")  && temp.endsWith(")"))?temp:"(" + temp + ")");
+                }else if(temp.startsWith(QueryOptionConstant.NOTEQUAL)){
+                    temp = temp.substring((QueryOptionConstant.NOTEQUAL).length()).trim();
+                    parentOidSql = QueryOptionConstant.NOTEQUAL +  " " + ((temp.startsWith("'")  && temp.endsWith("'"))?temp:"'" + temp + "'");
+                }else if(temp.startsWith(QueryOptionConstant.MORETHAN)){
+                    temp = temp.substring((QueryOptionConstant.MORETHAN).length()).trim();
+                    parentOidSql = QueryOptionConstant.MORETHAN + " " +  ((temp.startsWith("'")  && temp.endsWith("'"))?temp:"'" + temp + "'");
+                }else if(temp.startsWith(QueryOptionConstant.MORE)){
+                    temp = temp.substring((QueryOptionConstant.MORE).length()).trim();
+                    parentOidSql = QueryOptionConstant.MORE + " " +  ((temp.startsWith("'")  && temp.endsWith("'"))?temp:"'" + temp + "'");
+                }else if(temp.startsWith(QueryOptionConstant.LESSTHAN)){
+                    temp = temp.substring((QueryOptionConstant.LESSTHAN).length()).trim();
+                    parentOidSql = QueryOptionConstant.LESSTHAN + " " +  ((temp.startsWith("'")  && temp.endsWith("'"))?temp:"'" + temp + "'");
+                }else if(temp.startsWith(QueryOptionConstant.LESS)){
+                    temp = temp.substring((QueryOptionConstant.LESS).length()).trim();
+                    parentOidSql = QueryOptionConstant.LESS +  " " + ((temp.startsWith("'")  && temp.endsWith("'"))?temp:"'" + temp + "'");
+                }else if (temp.startsWith(QueryOptionConstant.ISNOTNULL)) {
+                    parentOidSql = " is not null";
+                } else if (temp.startsWith(QueryOptionConstant.ISNULL)) {
+                    parentOidSql = " is  null";
+                } else if(temp.contains("*")){
+                    parentOidSql = " like " + ((temp.startsWith("'")  && temp.endsWith("'"))?temp:"'" + temp + "'").replace("*","%");
+                }else {
+                    parentOidSql = " = " + ((temp.startsWith("'")  && temp.endsWith("'"))?temp:"'" + temp + "'");
+                }
+
+            }
+            //鏌ヨ鍏ㄩ儴鐨勪俊鎭�
+            referConfigVO.getConditionMap().put("oid",QueryOptionConstant.IN + "(select oid from " +
+                    VciBaseUtil.getTableName(referConfigVO.getReferBo()) +
+                    " START WITH " + referConfigVO.getParentFieldName() + " "+
+                        parentOidSql +
+                    " CONNECT BY PRIOR " + oidFieldName + " = " + referConfigVO.getParentFieldName() + ")");
+        }else{
+            if(StringUtils.isNotBlank(referConfigVO.getParentFieldName()) && StringUtils.isNotBlank(referConfigVO.getParentOid())){
+                referConfigVO.getConditionMap().put(referConfigVO.getParentFieldName(),referConfigVO.getParentOid());
+            }
+        }
+        PageHelper pageHelper = new PageHelper(-1);
+        if(StringUtils.isNotBlank(referConfigVO.getSort())){
+            pageHelper.setSort(referConfigVO.getSort());
+            pageHelper.setOrder(referConfigVO.getOrder());
+        }
+        if (StringUtils.isNotBlank(referConfigVO.getQueryScheme())) {
+            cbos = boService.queryCBOByScheme(referConfigVO.getQueryScheme(), referConfigVO.getConditionMap(), referConfigVO.getReplaceMap(),pageHelper);
+        } else {
+            cbos = boService.queryCBO(referConfigVO.getReferBo(), referConfigVO.getConditionMap(),pageHelper);
+        }
+        TreeWrapperOptions treeWrapperOptions = new TreeWrapperOptions(referConfigVO.getParentFieldName());
+        treeWrapperOptions.setOidFieldName(oidFieldName);
+        treeWrapperOptions.setTextFieldName(referConfigVO.getTextField());
+        treeWrapperOptions.setMultipleSelect(referConfigVO.isMuti());
+        treeWrapperOptions.setParentOid(referConfigVO.getParentOid());
+        return WebUtil.cboList2Trees(cbos,treeWrapperOptions,null);
+    }
+
+    /**
+     * 琛ㄥ崟鐨勬暟鎹煡璇�
+     * @param btmname 涓氬姟绫诲瀷鐨勪俊鎭�
+     * @param oid 涓氬姟鏁版嵁鐨勪富閿�
+     * @return 涓氬姟鏁版嵁鐨勫睘鎬т俊鎭�
+     */
+    @Override
+    public List<Map<String,String>> getDataAttr(String btmname, String oid) {
+        VciBaseUtil.alertNotNull(btmname,"涓氬姟绫诲瀷鐨勪俊鎭�",oid,"涓氬姟鏁版嵁鐨勪富閿�");
+        List<ClientBusinessObject> cbos = boService.queryCBO(btmname,WebUtil.getOidQuery(oid));
+        List<Map<String,String>> dataMap = new ArrayList<>();
+        if(!CollectionUtils.isEmpty(cbos)){
+            cbos.stream().forEach(cbo->{
+                Map<String,String> data = new HashMap<>();
+                WebUtil.copyValueToMapFromCbos(cbo,data);
+                dataMap.add(data);
+            });
+        }
+        return dataMap;
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/UIEngineServiceImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/UIEngineServiceImpl.java
new file mode 100644
index 0000000..7543aad
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/UIEngineServiceImpl.java
@@ -0,0 +1,1567 @@
+package com.vci.web.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.thoughtworks.xstream.XStream;
+import com.thoughtworks.xstream.io.xml.XmlFriendlyNameCoder;
+import com.thoughtworks.xstream.io.xml.XppDriver;
+import com.vci.client.common.providers.ServiceProvider;
+import com.vci.corba.common.VCIError;
+import com.vci.corba.portal.data.PLUILayout;
+import com.vci.starter.web.annotation.log.VciUnLog;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.util.BeanUtil;
+import com.vci.starter.web.util.LangBaseUtil;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.starter.web.util.VciDateUtil;
+import com.vci.starter.web.wrapper.VciQueryWrapperForDO;
+import com.vci.web.constant.CacheKeyConstant;
+import com.vci.web.enumpck.UIComponentDisplayTypeEnum;
+import com.vci.web.enumpck.UIComponentTypeEnum;
+import com.vci.web.enumpck.UIFieldTypeEnum;
+import com.vci.web.enumpck.UILayoutAreaTypeEnum;
+import com.vci.web.pageModel.*;
+import com.vci.web.service.OsAttributeServiceI;
+import com.vci.web.service.OsBtmServiceI;
+import com.vci.web.service.UIEngineServiceI;
+import com.vci.web.service.WebBoServiceI;
+import com.vci.web.util.PlatformClientUtil;
+import com.vci.web.util.WebUtil;
+import com.vci.web.xmlmodel.UIComponentDefineXO;
+import com.vci.web.xmlmodel.UIComponentDetailXO;
+import com.vci.web.xmlmodel.UIComponentItemXO;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.cache.annotation.Caching;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import plm.corba.portal.*;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static com.vci.web.constant.CacheNameConstant.VCI_OBJECT_SERVICE;
+import static com.vci.web.constant.EnumIdConstant.LC_STATUS_SUBFIX;
+
+/**
+ * UI寮曟搸鏈嶅姟锛屼互鍓嶅钩鍙板皝瑁呭埌action閲岀殑锛�
+ * @author weidy
+ *
+ */
+@Service
+public class UIEngineServiceImpl  implements UIEngineServiceI {
+
+	/**
+	 * 鏄惁浠庣紦瀛樹腑鏌ヨ
+	 */
+	public static boolean QUERY_BY_CACHE = true;
+
+	/**
+	 * 骞冲彴璋冪敤宸ュ叿绫�
+	 */
+	@Autowired
+	private PlatformClientUtil platformClientUtil;
+
+	/**
+	 * 鏃ュ織瀵硅薄
+	 */
+	private Logger logger = LoggerFactory.getLogger(getClass());
+
+	/**
+	 * 鍔犺浇鑷韩
+	 */
+	@Lazy
+	@Autowired(required = false)
+	private UIEngineServiceI self;
+
+	/**
+	 * 灞炴�х殑鏈嶅姟
+	 */
+	@Autowired
+	private OsAttributeServiceI attributeService;
+
+	/**
+	 * 涓氬姟绫诲瀷鐨勬湇鍔�
+	 */
+	@Autowired
+	private OsBtmServiceI btmService;
+
+	/**
+	 * 涓氬姟绫诲瀷鐨勬湇鍔�
+	 */
+	@Autowired
+	private WebBoServiceI boService;
+
+	/**
+	 * 琛ㄥ崟鐨勫瓧娈电被鍨嬫槧灏�
+	 */
+	private static Map<String,String> formFieldTypeMap = new HashMap(){
+		{
+			put("text","text");
+			put("textarea","textarea");
+			put("number","text");
+			put("password","password");
+			put("radio","radio");
+			put("checkbox","checkbox");
+			put("select","combox");
+			put("webeditor","webeditor");
+			put("date","date");
+			put("time","time");
+			put("datetime","datetime");
+			put("hidden","hidden");
+			put("file","file");
+			put("multiFile","multiFile");
+			put("custom","custom");
+		}
+	};
+
+	/**
+	 * 榛樿鐨勬椂闂存牸寮�
+	 */
+	private static Map<String,String> dateDefaultFormatMap = new HashMap(){
+		{
+			put("date",VciDateUtil.DateFormat);
+			put("time",VciDateUtil.TimeFormat);
+			put("datetime",VciDateUtil.DateTimeFormat);
+		}
+	};
+
+	/**
+	 * 妫�鏌ユ棤鏁堢殑xml
+	 */
+	@Override
+	public void checkInvalidXmlVI() {
+		PortalVI[] portalVIS = null;
+		try {
+			portalVIS = platformClientUtil.getPortalService().getAllPortalVI();
+		} catch (VCIError vciError) {
+			throw WebUtil.getVciBaseException(vciError);
+		}
+		for(int i = 0 ; i < portalVIS.length ; i++){
+			PortalVI portalVI = portalVIS[i];
+			try {
+				UIComponentDetailXO detailXO = readInfoFromXML(portalVI.prm, UIComponentDetailXO.class);
+			}catch (Throwable e){
+				logger.error(portalVI.typeName + " ----" + portalVI.viName);
+			}
+		}
+	}
+
+	/**
+	 * 鏌ヨ鎵�鏈夌殑琛ㄥ崟瀹氫箟
+	 *
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	@Override
+	@VciUnLog
+	public List<UIFormDefineVO> selectAllForm() {
+		com.vci.corba.portal.data.PortalVI[] portalVIS = null;
+		try {
+			portalVIS = ServiceProvider.getUIService().getAllPortalVI();
+		} catch (VCIError vciError) {
+			throw WebUtil.getVciBaseException(vciError);
+		}
+		List<com.vci.corba.portal.data.PortalVI> portalVIList = Arrays.stream(portalVIS).filter(portal -> 1 == portal.viType).collect(Collectors.toList());
+		return formDO2VOs(portalVIList);
+	}
+
+	/**
+	 * 鏌ヨ鎵�鏈夌殑琛ㄥ崟瀹氫箟鐨勬槧灏�
+	 *
+	 * @return key鏄〃鍗曡嫳鏂囧悕绉�
+	 */
+	@Override
+	@Cacheable(value = VCI_OBJECT_SERVICE,key = CacheKeyConstant.ALL_FORM,unless = "#result == null")
+	public Map<String, UIFormDefineVO> selectAllFormMap() {
+		return Optional.ofNullable(self.selectAllForm()).orElseGet(()->new ArrayList<>()).stream().collect(Collectors.toMap(s->s.getBtmType().toLowerCase() + SEP + s.getId().toLowerCase(),t->t,(o1,o2)->o1));
+	}
+
+	/**
+	 * 琛ㄥ崟鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+	 *
+	 * @param portalVIS 鏁版嵁瀵硅薄
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	@Override
+	public List<UIFormDefineVO> formDO2VOs(Collection<com.vci.corba.portal.data.PortalVI> portalVIS) {
+		List<UIFormDefineVO> formDefineVOList = new ArrayList<>();
+		Optional.ofNullable(portalVIS).orElseGet(()->new ArrayList<com.vci.corba.portal.data.PortalVI>()).stream().forEach(portal->{
+			try {
+				UIFormDefineVO defineVO = formDO2VO(portal);
+				formDefineVOList.add(defineVO);
+			}catch (Throwable e){
+				if(logger.isErrorEnabled()){
+					logger.error("琛ㄥ崟鐨勫唴瀹规湁閿欒锛岃繖涓〃鍗曟病鏈夋垚鍔熻鏌ヨ");
+				}
+			}
+		});
+		return formDefineVOList;
+	}
+
+	/**
+	 * 琛ㄥ崟鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+	 *
+	 * @param portal 鏁版嵁瀵硅薄
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	@Override
+	@VciUnLog
+	public UIFormDefineVO formDO2VO(com.vci.corba.portal.data.PortalVI portal) {
+		if(portal == null ||StringUtils.isBlank(portal.prm)){
+			throw new VciBaseException("琛ㄥ崟鍙兘涓嶅瓨鍦紝鍥犱负鏈兘鑾峰彇鍒板畠鐨勪俊鎭�");
+		}
+		UIFormDefineVO formDefineVO = new UIFormDefineVO();
+		formDefineVO.setOid(portal.id);
+		formDefineVO.setId(portal.viName);
+		formDefineVO.setBtmType(portal.typeName);
+		formDefineVO.setLinkTypeFlag(1 == portal.typeFlag);
+		UIComponentDetailXO detailXO = readInfoFromXML(portal.prm,UIComponentDetailXO.class);
+		if(detailXO == null){
+			throw new VciBaseException("璇诲彇{0}閲寋1}琛ㄥ崟鐨勪俊鎭敊璇紝鍐呭涓嶆槸瀹屾暣鐨剎ml鏍煎紡",new String[]{formDefineVO.getBtmType(),formDefineVO.getOid()});
+		}
+		formDefineVO.setQueryTemplateName(detailXO.getFormQueryTemplateName());
+		formDefineVO.setColumnOneRow(WebUtil.getInt(detailXO.getShowColsCount()));
+		List<UIFormItemVO> items = new ArrayList<>();
+		Optional.ofNullable(detailXO.getItems()).orElseGet(()->new ArrayList<>()).stream().forEach(itemXO->{
+			UIFormItemVO itemVO = new UIFormItemVO();
+			itemVO.setField(itemXO.getField());
+			itemVO.setText(itemXO.getName());
+			itemVO.setReadOnly("1".equalsIgnoreCase(itemXO.getEditable()));
+			itemVO.setRequired("1".equalsIgnoreCase(itemXO.getRequired()));
+			itemVO.setDefaultValue(itemXO.getDefaultValue());
+			itemVO.setType(formFieldTypeMap.getOrDefault(itemXO.getDisplayType(),"text"));
+			itemVO.setHidden(!"1".equalsIgnoreCase(itemXO.getHidden()));
+			itemVO.setVerify(itemXO.getScriptValid());
+			if("number".equalsIgnoreCase(itemXO.getDisplayType())){
+				List<String> verifys = VciBaseUtil.str2List(itemVO.getVerify());
+				if(verifys == null){
+					verifys = new ArrayList<>();
+				}
+				verifys.add("number");
+				itemVO.setVerify(verifys.stream().collect(Collectors.joining(",")));
+			}
+			if("hidden".equalsIgnoreCase(itemXO.getDisplayType())){
+				itemVO.setType(UIFieldTypeEnum.TEXT.getValue());
+				itemVO.setHidden(true);
+			}
+			if (VciQueryWrapperForDO.LIFECYCLE_MANAGE_FIELD_MAP.containsKey(itemVO.getField().toLowerCase())) {
+				//鐢熷懡鍛ㄦ湡鐨勫姞涓嬫媺鑿滃崟鐨刱ey
+				itemVO.setComboxKey(formDefineVO.getBtmType() + LC_STATUS_SUBFIX);
+			}
+
+			itemVO.setDisplayExtension(itemXO.getDisplayExpression());
+			itemVO.setDateFormate(itemXO.getDateFormat());
+			if(StringUtils.isBlank(itemVO.getDateFormate())){
+				itemVO.setDateFormate(dateDefaultFormatMap.get(itemXO.getDisplayType().toLowerCase()));
+				if("createtime".equalsIgnoreCase(itemVO.getField()) || "lastmodifytime".equalsIgnoreCase(itemVO.getField()) ){
+					itemVO.setDateFormate(VciDateUtil.DateTimeFormat);
+				}
+			}
+			itemVO.setTooltips(itemVO.getTooltips());
+			if("custom".equalsIgnoreCase(itemXO.getDisplayType())){
+				itemVO.setType(UIFieldTypeEnum.TEXT.getValue());
+				itemVO.setCustomClass(itemVO.getCustomClass());
+			}
+
+			if(StringUtils.isNotBlank(itemXO.getRefer())){
+				itemVO.setType("refer");
+				UIFormReferVO referVO = new UIFormReferVO();
+				if(StringUtils.isNotBlank(itemXO.getReferFieldName())){
+					referVO.setTextField(itemXO.getReferFieldName());
+				}
+				if("layuirefer".equalsIgnoreCase(itemXO.getRefer())){
+					//璇存槑鏄柊鐨勫弬鐓х殑鏂瑰紡
+					referVO.setType(itemXO.getSecondRefer());
+					if(StringUtils.isNotBlank(itemXO.getExtendAttr())) {
+						if(itemXO.getExtendAttr().startsWith("{") && itemXO.getExtendAttr().endsWith("}")) {
+							//瑕乯son鐨勫舰寮�
+							JSONObject jsonObject = null;
+							try {
+								jsonObject = JSONObject.parseObject(itemXO.getExtendAttr());
+							} catch (Throwable e) {
+								if (logger.isErrorEnabled()) {
+									logger.error("杞崲Json鐨勬牸寮忓嚭閿�", e);
+								}
+							}
+							if (jsonObject != null) {
+								referVO.setType(jsonObject.containsKey("type")?jsonObject.getString("type"):"");
+								referVO.setMuti(jsonObject.containsKey("muti")?VciBaseUtil.getBoolean(jsonObject.getString("muti")):false);
+								referVO.setUrl(jsonObject.containsKey("url")?jsonObject.getString("url"):"");
+								referVO.setBackPath(jsonObject.containsKey("backPath")?jsonObject.getString("backPath"):"");
+								referVO.setMethod(jsonObject.containsKey("method")?jsonObject.getString("method"):"");
+								referVO.setHeight(jsonObject.containsKey("height") ? WebUtil.getInt(jsonObject.getString("height")) : null);
+								referVO.setReferType(jsonObject.containsKey("referType")?jsonObject.getString("referType"):null);
+								referVO.setReferContent(jsonObject.containsKey("referContent")?jsonObject.getString("referContent"):null);
+								referVO.setParentFieldName(jsonObject.containsKey("parentFieldName")?jsonObject.getString("parentFieldName"):null);
+								referVO.setParentValue(jsonObject.containsKey("parentValue")?jsonObject.getString("parentValue"):null);
+								referVO.setLoadType(jsonObject.containsKey("loadType")?jsonObject.getString("loadType"):null);
+								referVO.setOnlyLeaf(jsonObject.containsKey("onlyLeaf")?Boolean.valueOf(jsonObject.getString("onlyLeaf")):true);
+								referVO.setDisplayTable(jsonObject.containsKey("displayTable")?jsonObject.getString("displayTable"):null);
+								referVO.setTextField(jsonObject.containsKey("textField")?jsonObject.getString("textField"):null);
+								referVO.setValueField(jsonObject.containsKey("valueField")?jsonObject.getString("valueField"):null);
+								if (jsonObject.containsKey("tableConfig")) {
+									referVO.setTableConfig(JSONObject.parseObject(jsonObject.getString("tableConfig"), UITableCustomDefineVO.class));
+								}
+							}
+						}else{
+							referVO.setType(itemXO.getExtendAttr());
+						}
+					}
+				}else{
+					referVO.setType("stand");
+					referVO.setReferType(itemXO.getRefer());
+					referVO.setReferContent(itemXO.getExtendAttr());
+				}
+				itemVO.setReferConfig(referVO);
+				itemVO.setShowField(itemVO.getField() +"." + referVO.getTextField());
+			}else{
+				String field = itemVO.getField();
+				if(itemVO.getField().toLowerCase().startsWith("t_oid.")
+						||itemVO.getField().toLowerCase().startsWith("f_oid.")){
+					//璇存槑鏄摼鎺ョ被鍨�
+					field = field.substring("t_oid.".length());
+				}
+				OsAttributeVO attributeVO = attributeService.getAttr(field);
+				UIFormReferVO referVO = new UIFormReferVO();
+				if(attributeVO !=null && StringUtils.isNotBlank(attributeVO.getBtmTypeId())
+						&& StringUtils.isBlank(itemXO.getRefer())
+						&&"combox".equalsIgnoreCase(itemVO.getType())){
+					//璧伴粯璁ょ殑鍙傜収
+					itemVO.setType("refer");
+					referVO.setType("default");
+					referVO.setTextField("name");
+					referVO.setReferContent(itemXO.getExtendAttr());
+					referVO.setReferType(attributeVO.getBtmTypeId());
+					itemVO.setReferConfig(referVO);
+					itemVO.setShowField(itemVO.getField() +"." + referVO.getTextField());
+				}
+				if(StringUtils.isNotBlank(itemXO.getExtendAttr())){
+					if(itemXO.getExtendAttr().startsWith("{") && itemXO.getExtendAttr().endsWith("}")){
+						//鏄痡son
+						Map<String,String> attrMap = new HashMap<>();
+						Map<String, Object> innerMap = JSONObject.parseObject(itemXO.getExtendAttr()).getInnerMap();
+						innerMap.forEach((key,value)->{
+							attrMap.put(key,WebUtil.getStringValueFromObject(value));
+						});
+						itemVO.setExtendAttrMap(attrMap);
+					}else{
+						Map<String,String> extendAttrMap = new HashMap<>();
+						Arrays.stream(itemXO.getExtendAttr().split("&")).forEach(attr->{
+							if(StringUtils.isNotBlank(attr) && attr.contains("=")) {
+								extendAttrMap.put(attr.split("=")[0], attr.split("=")[1]);
+							}else{
+								itemVO.setExtendAttrString(attr);
+							}
+						});
+						itemVO.setExtendAttrMap(extendAttrMap);
+					}
+				}
+			}
+			if("radio".equalsIgnoreCase(itemVO.getType()) || "checkbox".equalsIgnoreCase(itemVO.getType())
+					|| "combox".equalsIgnoreCase(itemVO.getType())){
+				//鐪嬬湅鏈夋病鏈夊崟鐙缃�
+				if(StringUtils.isNotBlank(itemXO.getComboxKey())){
+					itemVO.setComboxKey(itemXO.getComboxKey());
+					if(StringUtils.isNotBlank(itemXO.getComboxItems())){
+						List<KeyValue> keyValues = new ArrayList<>();
+						VciBaseUtil.str2List(itemXO.getComboxItems()).stream().forEach(temmpKeyValue->{
+							KeyValue kv = new KeyValue();
+							kv.setKey(temmpKeyValue.split("=")[0]);
+							kv.setValue(temmpKeyValue.split("=")[1]);
+							keyValues.add(kv);
+						});
+						itemVO.setData(keyValues);
+					}
+				}else{
+					String attr = itemVO.getField();
+					if(itemVO.getField().toLowerCase().startsWith("t_oid.")
+							||itemVO.getField().toLowerCase().startsWith("f_oid.")){
+						//璇存槑鏄摼鎺ョ被鍨�
+						attr = attr.substring("t_oid.".length());
+					}
+					OsAttributeVO attributeVO = attributeService.getAttr(attr);
+					if (attributeVO != null) {
+						itemVO.setComboxKey(attributeVO.getEnumId());
+					}
+				}
+			}
+
+			items.add(itemVO);
+		});
+		formDefineVO.setItems(items);
+		return formDefineVO;
+	}
+
+	/**
+	 * 浣跨敤琛ㄥ崟鐨勮嫳鏂囧悕绉拌幏鍙栬〃鍗�
+	 *
+	 * @param btmId 涓氬姟绫诲瀷
+	 * @param id    琛ㄥ崟鐨勮嫳鏂囧悕绉�
+	 * @return 琛ㄥ崟鐨勫畾涔�
+	 */
+	@Override
+	@Cacheable(value = VCI_OBJECT_SERVICE,key = "#p0.concat('${formcache}').concat(#p1)",unless = "#result == null || #p0 == null || #p1 == null")
+	public UIFormDefineVO getFormById(String btmId, String id) {
+		if(StringUtils.isBlank(btmId) || StringUtils.isBlank(id)){
+			return null;
+		}
+		if(!QUERY_BY_CACHE){
+			com.vci.corba.portal.data.PortalVI portalVI = null;
+			try {
+				portalVI = ServiceProvider.getUIService().getPortalVIByTypeNameAndVIName(btmId, id);
+			} catch (VCIError vciError) {
+				throw WebUtil.getVciBaseException(vciError);
+			}
+			return formDO2VO(portalVI);
+		}
+		return self.selectAllFormMap().getOrDefault(btmId.toLowerCase()+SEP+id.toLowerCase(),null);
+	}
+
+	/**
+	 * 浣跨敤琛ㄥ崟鐨勮嫳鏂囧悕绉拌幏鍙栬〃鍗�
+	 *
+	 * @param btmId 涓氬姟绫诲瀷缂栧彿
+	 * @param ids   琛ㄥ崟鐨勮嫳鏂囧悕绉�
+	 * @return 琛ㄥ崟鐨勫畾涔�
+	 */
+	@Override
+	public List<UIFormDefineVO> listFormByIds(String btmId, Collection<String> ids) {
+		if(StringUtils.isBlank(btmId) || CollectionUtils.isEmpty(ids)){
+			return null;
+		}
+		Map<String, UIFormDefineVO> formDefineVOMap = self.selectAllFormMap();
+		List<UIFormDefineVO> defineVOS = new ArrayList<>();
+		ids.stream().forEach(id->{
+			String key = btmId.toLowerCase()+SEP + id.toLowerCase();
+			if(formDefineVOMap.containsKey(key)){
+				defineVOS.add(formDefineVOMap.get(key));
+			}
+		});
+		return defineVOS;
+	}
+
+	/**
+	 * 鏌ヨ鎵�鏈夌殑琛ㄦ牸
+	 *
+	 * @return 琛ㄦ牸鐨勫畾涔�
+	 */
+	@Override
+	@Cacheable(value = VCI_OBJECT_SERVICE,key = CacheKeyConstant.ALL_TABLE,unless = "#result == null")
+	@VciUnLog
+	public List<UITableDefineVO> selectAllTable() {
+		com.vci.corba.portal.data.PortalVI[] portalVIS = null;
+		try {
+			portalVIS = ServiceProvider.getUIService().getAllPortalVI();
+		} catch (VCIError vciError) {
+			throw WebUtil.getVciBaseException(vciError);
+		}
+		List<com.vci.corba.portal.data.PortalVI> portalVIList = Arrays.stream(portalVIS).filter(portal -> 0 == portal.viType).collect(Collectors.toList());
+		return tableDO2VOs(portalVIList,false);
+	}
+
+	/**
+	 * 鏌ヨ鎵�鏈夌殑琛ㄦ牸
+	 *
+	 * @return 琛ㄦ牸鐨勫畾涔夛紝key鏄〃鏍肩殑鑻辨枃鍚嶇О
+	 */
+	@Override
+	public Map<String,UITableDefineVO> selectAllTableMap() {
+		return Optional.ofNullable(self.selectAllTable()).orElseGet(()->new ArrayList<>()).stream().collect(Collectors.toMap(s->s.getBtmType().toLowerCase() + SEP + s.getId().toLowerCase(),t->t,(o1,o2)->o1));
+	}
+
+	/**
+	 * 琛ㄦ牸鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+	 *
+	 * @param prms 鏁版嵁瀵硅薄
+	 * @param queryDetail 鏌ヨ鏄庣粏
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	@Override
+	@VciUnLog
+	public List<UITableDefineVO> tableDO2VOs(Collection<com.vci.corba.portal.data.PortalVI> prms, boolean queryDetail) {
+		List<UITableDefineVO> tableDefineVOList = new ArrayList<>();
+		Optional.ofNullable(prms).orElseGet(()->new ArrayList<com.vci.corba.portal.data.PortalVI>()).stream().forEach(portal->{
+			UITableDefineVO defineVO = tableDO2VO(portal,queryDetail);
+			tableDefineVOList.add(defineVO);
+		});
+		return tableDefineVOList;
+	}
+
+	/**
+	 * 琛ㄦ牸鐨勬暟鎹璞¤浆鎹负鏄剧ず瀵硅薄
+	 *
+	 * @param portal 鏁版嵁瀵硅薄
+	 * @param queryDetail 鏌ヨ鏄庣粏
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	@Override
+	@VciUnLog
+	public UITableDefineVO tableDO2VO(com.vci.corba.portal.data.PortalVI portal, boolean queryDetail) {
+		UITableDefineVO tableDefineVO = new UITableDefineVO();
+		tableDefineVO.setOid(portal.id);
+		tableDefineVO.setId(portal.viName);
+		tableDefineVO.setBtmType(portal.typeName);
+		tableDefineVO.setLinkTypeFlag(1 == portal.typeFlag);
+		UIComponentDetailXO detailXO = null;
+		try {
+			detailXO = readInfoFromXML(portal.prm, UIComponentDetailXO.class);
+		}catch (Throwable e){
+			logger.error("{}閲岀殑琛ㄦ牸{}璇诲彇xml澶辫触",new String[]{tableDefineVO.getBtmType(),tableDefineVO.getId()});
+			throw e;
+		}
+		if(detailXO == null){
+			throw new VciBaseException("璇诲彇{0}閲寋1}琛ㄦ牸鐨勪俊鎭敊璇紝鍐呭涓嶆槸瀹屾暣鐨剎ml鏍煎紡",new String[]{tableDefineVO.getBtmType(),tableDefineVO.getOid()});
+		}
+		tableDefineVO.setQueryTemplateName(detailXO.getFormQueryTemplateName());
+
+		//琛ㄦ牸鐨勮繖涓猧tem鍙湁涓�涓�
+		UIComponentItemXO itemXO = detailXO.getItems().get(0);
+		if(StringUtils.isNotBlank(itemXO.getQueryTemplateName())){
+			//杩欎釜鏄〃鏍肩殑鏌ヨ妯℃澘锛屽闈㈣繕鏈変竴涓猆I鐨勬煡璇㈡ā鏉�
+			tableDefineVO.setQueryTemplateName(itemXO.getQueryTemplateName());
+		}
+		String formOid = itemXO.getBindFormOid();
+		//鑾峰彇琛ㄥ崟鐨勪俊鎭紝鐢ㄦ潵鑾峰彇瀛楁鐨勪俊鎭�
+		UIFormDefineVO formDefineVO = null;
+		if(!queryDetail){
+			self.selectAllForm().stream().filter(s -> formOid.equalsIgnoreCase(s.getOid())).findAny().orElseGet(() -> null);
+		}else{
+			try {
+				formDefineVO = formDO2VO(ServiceProvider.getUIService().getPortalVIById(formOid));
+			} catch (VCIError vciError) {
+				throw WebUtil.getVciBaseException(vciError);
+			}
+		}
+		if(formDefineVO == null){
+			logger.error("{}閲岀殑琛ㄦ牸{}鎵�闇�鐨勮〃鍗晎}涓嶅瓨鍦�",new String[]{tableDefineVO.getBtmType(),tableDefineVO.getId(),formOid});
+			//throw new VciBaseException("{0}閲岀殑琛ㄦ牸{1}鎵�闇�鐨勮〃鍗晎2}涓嶅瓨鍦�",new String[]{tableDefineVO.getBtmType(),tableDefineVO.getId(),formOid});
+		}else {
+			if (StringUtils.isNotBlank(itemXO.getPageSize())) {
+				//xxx,yy,zz#aa鐨勬牸寮�
+				List<String> limitList = null;
+				int pageSize = 0;
+				if (!itemXO.getPageSize().contains("#")) {
+					pageSize = WebUtil.getInt(itemXO.getPageSize());
+					limitList = new ArrayList<>();
+					limitList.add("15");
+					limitList.add("50");
+					limitList.add("100");
+					limitList.add("500");
+					limitList.add("1000");
+				}else{
+					pageSize = WebUtil.getInt(itemXO.getPageSize().split("#")[1]);
+					limitList = WebUtil.str2List(itemXO.getPageSize().split("#")[0]);
+				}
+				List<Integer> limitIntList = new ArrayList<>();
+				limitList.stream().forEach(limit -> {
+					int limitInt = WebUtil.getInt(limit);
+					if(limitInt<=1000) {
+						limitIntList.add(limitInt);
+					}
+				});
+				if (pageSize > 0) {
+					UITablePageVO pageVO = new UITablePageVO();
+					pageVO.setLimit(pageSize);
+					pageVO.setPage(1);
+					tableDefineVO.setPageVO(pageVO);
+				}
+				tableDefineVO.setLimits(limitIntList.stream().sorted().collect(Collectors.toList()).toArray(new Integer[0]));
+			}
+			tableDefineVO.setWhereSql(itemXO.getWhereSql());
+			tableDefineVO.setDisplayQueryArea(Boolean.valueOf(itemXO.getDisplayQueryArea()));
+			tableDefineVO.setDisplayFolder(Boolean.valueOf(itemXO.getDisplayFolder()));
+			tableDefineVO.setFolderParentField(itemXO.getParentFolderName());
+
+			//澶勭悊鍒椼�傚钩鍙颁笉鏀寔澶氳鐨勬儏鍐�
+			List<UITableFieldVO> tableFieldVOList = new ArrayList<>();
+			if (StringUtils.isBlank(itemXO.getDisplayFields())) {
+				logger.error("{},{}鍒楄〃娌℃湁鏄剧ず鐨勫垪.鎴栬�呮病鏈夎缃搴�",new String[]{tableDefineVO.getBtmType(),tableDefineVO.getId()});
+			}else {
+				//涓ユ牸鎸夌収鏁扮粍鐨勯『搴忥紝鍥犱负瀹藉害鏄寜鐓ц繖涓潵鐨�
+				String[] fields = itemXO.getDisplayFields().split(",");
+				String[] fieldWidths = StringUtils.isBlank(itemXO.getFieldWidths()) ? new String[0] : itemXO.getFieldWidths().split(",");
+				Map<String, UIFormItemVO> formFieldMap = formDefineVO.getItems().stream().collect(Collectors.toMap(s -> s.getField().toLowerCase(), t -> t, (o1, o2) -> o1));
+				for (int i = 0; i < fields.length; i++) {
+					String fieldName = fields[i];
+					if (formFieldMap.containsKey(fieldName.toLowerCase())) {
+						//throw new VciBaseException("{0}閲寋1}琛ㄦ牸鐨勫瓧娈祘2}鍦ㄥ搴旂殑琛ㄥ崟涓病鏈夋壘鍒�",new String[]{tableDefineVO.getBtmType(),tableDefineVO.getId(),fieldName});
+						UIFormItemVO itemVO = formFieldMap.get(fieldName.toLowerCase());
+						UITableFieldVO fieldVO = new UITableFieldVO();
+						if ("combox".equalsIgnoreCase(itemVO.getType())) {
+							fieldVO.setField(fieldName + "text");
+							fieldVO.setComboxKey(itemVO.getComboxKey());
+							fieldVO.setSortField(fieldName);
+							fieldVO.setEdit("combox");
+						} else if ("refer".equalsIgnoreCase(itemVO.getType())) {
+							fieldVO.setField(fieldName + "." + itemVO.getShowField());
+							fieldVO.setSortField(fieldName);
+							fieldVO.setEdit("refer");
+						} else if (VciQueryWrapperForDO.LIFECYCLE_MANAGE_FIELD_MAP.containsKey(fieldName.toLowerCase())) {
+							fieldVO.setField(VciQueryWrapperForDO.LC_STATUS_FIELD_TEXT.toLowerCase());
+							fieldVO.setSortField(fieldName);
+							fieldVO.setEdit("combox");
+							//鑲畾鏄笟鍔$被鍨嬶紝鍥犱负閾炬帴绫诲瀷娌℃湁杩欎釜瀛楁
+							OsBtmTypeVO btmTypeVO = btmService.getBtmById(tableDefineVO.getBtmType());
+							if(btmTypeVO!=null && StringUtils.isNotBlank(btmTypeVO.getLifeCycleId())){
+								fieldVO.setComboxKey(btmTypeVO.getLifeCycleId() + LC_STATUS_SUBFIX);
+							}
+
+						}else if("creator".equalsIgnoreCase(fieldName)){
+							fieldVO.setField("creator_name,(,creator,)");
+							fieldVO.setSortField(fieldName);
+						} else if("lastmodifier".equalsIgnoreCase(fieldName)){
+							fieldVO.setField("lastmodifier_name,(,lastmodifier,)");
+							fieldVO.setSortField(fieldName);
+						} else  {
+							fieldVO.setField(fieldName);
+						}
+						if("text".equalsIgnoreCase(itemVO.getType())){
+							fieldVO.setDateFormate(itemVO.getDateFormate());
+						}
+						if("number".equalsIgnoreCase(itemVO.getType())){
+							fieldVO.setEdit("number");
+						}
+						fieldVO.setTitle(itemVO.getText());
+						if (fieldWidths.length > i) {
+							fieldVO.setWidth(WebUtil.getInt(fieldWidths[i]));
+						}
+						if ("date".equalsIgnoreCase(itemVO.getType()) || "time".equalsIgnoreCase(itemVO.getType()) || "datetime".equalsIgnoreCase(itemVO.getType())) {
+							fieldVO.setDateFormate(itemVO.getDateFormate());
+							fieldVO.setEdit("date");
+							if(StringUtils.isBlank(itemVO.getDateFormate())){
+								fieldVO.setDateFormate(dateDefaultFormatMap.get(itemVO.getType().toLowerCase()));
+							}
+						}
+						if(StringUtils.countMatches(fieldVO.getField(),".")>1 ){
+							fieldVO.setShowField(StringUtils.isBlank(fieldVO.getShowField())?fieldVO.getField().replace(".","--"):fieldVO.getShowField().replace(".","--"));
+						}
+						fieldVO.setFieldType(itemVO.getType());
+						tableFieldVOList.add(fieldVO);
+					} else {
+						logger.error("{}閲寋}琛ㄦ牸鐨勫瓧娈祘}鍦ㄥ搴旂殑琛ㄥ崟涓病鏈夋壘鍒�", new String[]{tableDefineVO.getBtmType(), tableDefineVO.getId(), fieldName});
+					}
+				}
+				List<List<UITableFieldVO>> cols = new ArrayList<>();
+				cols.add(tableFieldVOList);
+				tableDefineVO.setCols(cols);
+				List<UITableFieldVO> canQueryFields = new ArrayList<>();
+				tableFieldVOList.stream().filter(s -> !UIFieldTypeEnum.FILE.getValue().equalsIgnoreCase(s.getFieldType())
+						&& !UIFieldTypeEnum.MULTI_FILE.getValue().equalsIgnoreCase(s.getFieldType())
+						&& !UIFieldTypeEnum.CUSTOM.getValue().equalsIgnoreCase(s.getFieldType())).forEach(fieldVO->{
+					//鍒楄〃閲岄潰涓嶆斁edit锛岃�屾煡璇㈤噷闈㈤渶瑕佹斁edit
+					UITableFieldVO queryFieldVO = new UITableFieldVO();
+					BeanUtil.convert(fieldVO,queryFieldVO);
+					canQueryFields.add(queryFieldVO);
+				});
+				tableDefineVO.setSeniorQueryColumns(canQueryFields);
+				//瑕佹妸鍒椾笂鐨別dit鍘绘帀锛屽洜涓烘殏鏃朵笉鏀寔鍒楄〃鐩存帴缂栬緫
+				tableFieldVOList.stream().forEach(fieldVO->{
+					fieldVO.setEdit("");
+				});
+				//鏌ヨ鐨勫垪
+				if (StringUtils.isNotBlank(itemXO.getQueryFields())) {
+					String[] queryFields = itemXO.getQueryFields().split(",");
+					List<UITableFieldVO> queryFieldVOs = new ArrayList<>();
+					for (int i = 0; i < queryFields.length; i++) {
+						String fieldName = fields[i];
+						if (!formFieldMap.containsKey(fieldName.toLowerCase())) {
+							logger.error("{}閲寋}琛ㄦ牸鐨勫瓧娈祘}鍦ㄥ搴旂殑琛ㄥ崟涓病鏈夋壘鍒�", new String[]{tableDefineVO.getBtmType(), tableDefineVO.getOid(), fieldName});
+						} else {
+							UIFormItemVO itemVO = formFieldMap.get(fieldName.toLowerCase());
+							UITableFieldVO fieldVO = new UITableFieldVO();
+							if ("combox".equalsIgnoreCase(itemVO.getType())) {
+								fieldVO.setField(fieldName + "text");
+								fieldVO.setSortField(fieldName);
+								fieldVO.setComboxKey(itemVO.getComboxKey());
+								fieldVO.setData(itemVO.getData());
+								fieldVO.setEdit("combox");
+							} else if ("refer".equalsIgnoreCase(itemVO.getType())) {
+								fieldVO.setField(fieldName + "." + itemVO.getShowField());
+								fieldVO.setSortField(fieldName);
+								fieldVO.setShowField(itemVO.getShowField());
+								fieldVO.setReferConfig(itemVO.getReferConfig());
+								fieldVO.setEdit("refer");
+							} else if (VciQueryWrapperForDO.LIFECYCLE_MANAGE_FIELD_MAP.containsKey(fieldName.toLowerCase())) {
+								fieldVO.setField(VciQueryWrapperForDO.LC_STATUS_FIELD_TEXT.toLowerCase());
+								fieldVO.setSortField(fieldName);
+								//鑲畾鏄笟鍔$被鍨嬶紝鍥犱负閾炬帴绫诲瀷娌℃湁杩欎釜瀛楁
+								OsBtmTypeVO btmTypeVO = btmService.getBtmById(tableDefineVO.getBtmType());
+								if(btmTypeVO!=null && StringUtils.isNotBlank(btmTypeVO.getLifeCycleId())){
+									fieldVO.setComboxKey(btmTypeVO.getLifeCycleId() + LC_STATUS_SUBFIX);
+								}
+								fieldVO.setEdit("combox");
+							} else {
+								fieldVO.setField(fieldName);
+							}
+							if("number".equalsIgnoreCase(itemVO.getType())){
+								fieldVO.setEdit("number");
+							}
+							fieldVO.setQueryField(fieldName);
+							fieldVO.setTitle(itemVO.getText());
+							if ("date".equalsIgnoreCase(itemVO.getType()) || "time".equalsIgnoreCase(itemVO.getType()) || "datetime".equalsIgnoreCase(itemVO.getType())) {
+								fieldVO.setDateFormate(itemVO.getDateFormate());
+								fieldVO.setEdit("date");
+							}
+							queryFieldVOs.add(fieldVO);
+						}
+					}
+					tableDefineVO.setQueryColumns(queryFieldVOs);
+				}
+			}
+		}
+		return tableDefineVO;
+	}
+
+	/**
+	 * 浣跨敤琛ㄦ牸鐨勮嫳鏂囧悕绉拌幏鍙栬〃鍗�
+	 *
+	 * @param btmId 涓氬姟绫诲瀷
+	 * @param id    琛ㄦ牸鐨勮嫳鏂囧悕绉�
+	 * @return 琛ㄥ崟鐨勫畾涔�
+	 */
+	@Override
+	@Cacheable(value = VCI_OBJECT_SERVICE,key = "#p0.concat('${tablecache}').concat(#p1)",unless = "#result == null || #p0 == null || #p1 == null")
+	public UITableDefineVO getTableById(String btmId, String id) {
+		if(StringUtils.isBlank(btmId) || StringUtils.isBlank(id)){
+			return null;
+		}
+		if(!QUERY_BY_CACHE){
+			com.vci.corba.portal.data.PortalVI portalVI = null;
+			try {
+				portalVI = ServiceProvider.getUIService().getPortalVIByTypeNameAndVIName(btmId, id);
+			} catch (VCIError vciError) {
+				throw WebUtil.getVciBaseException(vciError);
+			}
+			return tableDO2VO(portalVI,true);
+		}
+		return self.selectAllTableMap().getOrDefault(btmId.toLowerCase()+SEP+id.toLowerCase(),null);
+	}
+
+	/**
+	 * 浣跨敤琛ㄦ牸鐨勮嫳鏂囧悕绉拌幏鍙栬〃鍗�
+	 *
+	 * @param btmId 涓氬姟绫诲瀷缂栧彿
+	 * @param ids   琛ㄦ牸鐨勮嫳鏂囧悕绉�
+	 * @return 琛ㄥ崟鐨勫畾涔�
+	 */
+	@Override
+	public List<UITableDefineVO> listTableByIds(String btmId, Collection<String> ids) {
+		if(StringUtils.isBlank(btmId) || CollectionUtils.isEmpty(ids)){
+			return null;
+		}
+		Map<String, UITableDefineVO> tableDefineVOMap = self.selectAllTableMap();
+		List<UITableDefineVO> defineVOS = new ArrayList<>();
+		ids.stream().forEach(id->{
+			String key = btmId.toLowerCase()+SEP + id.toLowerCase();
+			if(tableDefineVOMap.containsKey(key)){
+				defineVOS.add(tableDefineVOMap.get(key));
+			}
+		});
+		return defineVOS;
+	}
+
+	/**
+	 * 鏌ヨ鎵�鏈夌殑action
+	 *
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	@Override
+	@VciUnLog
+	public List<UIActionVO> selectAllAction() {
+		try {
+//			return actionDO2VOs(Arrays.stream(platformClientUtil.getPortalService().getAllPLAction()).collect(Collectors.toList()));
+			return actionDO2VOs(Arrays.stream(ServiceProvider.getUIService().getAllPLAction()).collect(Collectors.toList()));
+		} catch (VCIError vciError) {
+			throw WebUtil.getVciBaseException(vciError);
+		}
+	}
+
+	/**
+	 * 鏌ヨ鎵�鏈夌殑action
+	 *
+	 * @return 鏄剧ず瀵硅薄锛宬ey鏄痑ction鐨勪富閿�
+	 */
+	@Override
+	@Cacheable(value = VCI_OBJECT_SERVICE,key=CacheKeyConstant.ALL_ACTION,unless = "#result == null")
+	public Map<String, UIActionVO> selectAllActionMap() {
+		return Optional.ofNullable(self.selectAllAction()).orElseGet(()->new ArrayList<>()).stream().collect(Collectors.toMap(s->s.getOid(),t->t));
+	}
+
+	/**
+	 * action鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+	 *
+	 * @param actions 鏁版嵁瀵硅薄
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	@Override
+	@VciUnLog
+	public List<UIActionVO> actionDO2VOs(Collection<com.vci.corba.portal.data.PLAction> actions) {
+		List<UIActionVO> actionVOS = new ArrayList<>();
+		Optional.ofNullable(actions).orElseGet(()->new ArrayList<>()).stream().forEach(action->{
+			UIActionVO actionVO = actionDO2VO(action);
+			actionVOS.add(actionVO);
+		});
+		return actionVOS;
+	}
+
+	/**
+	 * action鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+	 *
+	 * @param action 鏁版嵁瀵硅薄
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	@Override
+	@VciUnLog
+	public UIActionVO actionDO2VO(com.vci.corba.portal.data.PLAction action) {
+		UIActionVO actionVO = new UIActionVO();
+		if(action!=null){
+			actionVO.setOid(action.plOId);
+			actionVO.setId(action.plCode);
+			actionVO.setName(action.plName);
+			actionVO.setBsUrl(StringUtils.isBlank(action.plBSUrl)?"":action.plBSUrl);
+			actionVO.setCsClass(StringUtils.isBlank(action.plCSClass)?"":action.plCSClass);
+			actionVO.setDescription(action.plDesc);
+			actionVO.setActionUsedType(action.plTypeType);
+			actionVO.setCreator(action.plCreateUser);
+			actionVO.setLastModifier(action.plModifyUser);
+			try {
+				actionVO.setCreateTime(VciDateUtil.str2Date(String.valueOf(action.plCreateTime), VciDateUtil.DateTimeFormat));
+				actionVO.setLastModifyTime(VciDateUtil.str2Date(String.valueOf(action.plCreateTime), VciDateUtil.DateTimeFormat));
+			}catch (Throwable e){
+				logger.error("杞崲鏃堕棿",e);
+			}
+			actionVO.setActionCls(action.plActionCls);
+		}
+		return actionVO;
+	}
+
+	/**
+	 * 娓呴櫎缂撳瓨
+	 */
+	@Override
+	@Caching(evict = {
+			@CacheEvict(value = VCI_OBJECT_SERVICE,key = CacheKeyConstant.ALL_UI),
+			@CacheEvict(value = VCI_OBJECT_SERVICE,key = CacheKeyConstant.ALL_ACTION),
+			@CacheEvict(value = VCI_OBJECT_SERVICE,key = CacheKeyConstant.ALL_FORM),
+			@CacheEvict(value = VCI_OBJECT_SERVICE,key = CacheKeyConstant.ALL_TABLE),
+			@CacheEvict(value = VCI_OBJECT_SERVICE,key = CacheKeyConstant.ALL_FORM_AND_TABLE)
+	})
+	public void clearCache()  {
+
+	}
+
+	/**
+	 * 鏌ヨ鎵�鏈夌殑UI涓婁笅鏂�
+	 *
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	@Override
+	@VciUnLog
+	@Cacheable(value = VCI_OBJECT_SERVICE,key = CacheKeyConstant.ALL_UI,unless = "#result == null")
+	public List<UIContentVO> selectAllUIContent() {
+		try {
+			return UIContentDO2VOs(Arrays.stream(platformClientUtil.getPortalService().getAllPLPageLayoutDefinations()).collect(Collectors.toList()));
+		} catch (VCIError vciError) {
+			throw WebUtil.getVciBaseException(vciError);
+		}
+	}
+
+	/**
+	 * ui涓婁笅鏂� 鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+	 * @param pageLayoutDefinations 涓婁笅鏂嘦I瀵硅薄
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	private List<UIContentVO> UIContentDO2VOs(Collection<PLPageLayoutDefination> pageLayoutDefinations){
+		List<UIContentVO> contentVOS = new ArrayList<>();
+		Optional.ofNullable(pageLayoutDefinations).orElseGet(()->new ArrayList<PLPageLayoutDefination>()).stream().forEach(pageLayout->{
+//			contentVOS.add(UIContentDO2VO(pageLayout,false));
+		});
+		if(!CollectionUtils.isEmpty(contentVOS)) {
+			Map<String, List<UILayoutVO>> layoutMap = batchListLayoutByContent(contentVOS.stream().map(UIContentVO::getOid).collect(Collectors.toSet()));
+			contentVOS.stream().forEach(contentVO-> {
+				List<UILayoutVO> layoutVOS = layoutMap.getOrDefault(contentVO.getOid(), new ArrayList<>());
+				if(!CollectionUtils.isEmpty(layoutVOS)){
+					Map<String,List<UILayoutVO>> layoutAreaMap = layoutVOS.stream().collect(Collectors.groupingBy(UILayoutVO::getLayoutAreaType));
+					contentVO.setWestAreas(layoutAreaMap.getOrDefault(UILayoutAreaTypeEnum.WEST.getValue(),new ArrayList<>()));
+					contentVO.setNorthAreas(layoutAreaMap.getOrDefault(UILayoutAreaTypeEnum.NORTH.getValue(),new ArrayList<>()));
+					contentVO.setCenterAreas(layoutAreaMap.getOrDefault(UILayoutAreaTypeEnum.CENTER.getValue(),new ArrayList<>()));
+					contentVO.setSouthAreas(layoutAreaMap.getOrDefault(UILayoutAreaTypeEnum.SOUTH.getValue(),new ArrayList<>()));
+				}
+			});
+		}
+		return contentVOS;
+	}
+
+	/**
+	 * ui涓婁笅鏂� 鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+	 * @param pageLayoutDefination  涓婁笅鏂嘦I瀵硅薄
+	 * @param queryDetail 鏄惁鏌ヨ鍖哄煙
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	@VciUnLog
+	@Override
+	public UIContentVO UIContentDO2VO(PLUILayout pageLayoutDefination, boolean queryDetail){
+		UIContentVO contentVO = new UIContentVO();
+		if(pageLayoutDefination !=null){
+			contentVO.setOid(pageLayoutDefination.plOId);
+			contentVO.setId(pageLayoutDefination.plCode);
+			contentVO.setName(pageLayoutDefination.plName);
+			contentVO.setBtmTypeId(pageLayoutDefination.plRelatedType);
+			contentVO.setDescription(pageLayoutDefination.plDesc);
+			contentVO.setCreator(pageLayoutDefination.plCreateUser);
+			try {
+				contentVO.setCreateTime(VciDateUtil.str2Date(String.valueOf(pageLayoutDefination.plCreateTime),VciDateUtil.DateTimeFormat));
+				contentVO.setLastModifyTime(VciDateUtil.str2Date(String.valueOf(pageLayoutDefination.plModifyTime),VciDateUtil.DateTimeFormat));
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+			contentVO.setLastModifier(pageLayoutDefination.plModifyUser);
+			if(queryDetail){
+				//鏌ヨ鍖呭惈鐨勫唴瀹�
+				List<UILayoutVO> layoutVOS = listLayoutByContent(contentVO.getOid());
+				if(!CollectionUtils.isEmpty(layoutVOS)){
+					if(layoutVOS.size() == 1){
+						//鍙湁涓�涓尯鍩�
+						UILayoutVO layoutVO = layoutVOS.get(0);
+						List<UIComponentVO> componentVOs = layoutVO.getComponentVOs();
+						//绗竴涓綔涓篶enter
+						UIComponentVO firstCompVO = componentVOs.stream().min((o1, o2) -> o1.getOrderNum().compareTo(o2.getOrderNum())).get();
+						List<UIComponentVO> southCompVO = componentVOs.stream().filter(s->!s.getOid().equals(firstCompVO.getOid())).collect(Collectors.toList());
+
+						UILayoutVO centerVO = new UILayoutVO();
+						BeanUtil.convert(layoutVO,centerVO);
+						centerVO.setOid(centerVO.getOid() + "_center");
+						centerVO.setLayoutAreaType(UILayoutAreaTypeEnum.CENTER.getValue());
+						centerVO.setOrderNum(0);
+						List<UIComponentVO> centerCompVOS = new ArrayList<>();
+						centerCompVOS.add(firstCompVO);
+						centerVO.setComponentVOs(centerCompVOS);
+						centerVO.setTitle(firstCompVO.getName());
+						List<UILayoutVO> centerLayoutVOs = new ArrayList<>();
+						centerLayoutVOs.add(centerVO);
+						contentVO.setCenterAreas(centerLayoutVOs);
+
+						contentVO.setWestAreas(null);
+						contentVO.setNorthAreas(null);
+						contentVO.setSouthAreas(null);
+						//鍏朵綑鐨勪綔涓簊outh
+						if(!CollectionUtils.isEmpty(southCompVO)) {
+							UILayoutVO southVO = new UILayoutVO();
+							BeanUtil.convert(layoutVO, southVO);
+							southVO.setOid(centerVO.getOid() + "_south");
+							southVO.setLayoutAreaType(UILayoutAreaTypeEnum.SOUTH.getValue());
+							southVO.setOrderNum(0);
+							southVO.setComponentVOs(southCompVO);
+
+							List<UILayoutVO> southLayoutVOs = new ArrayList<>();
+							southLayoutVOs.add(southVO);
+							contentVO.setSouthAreas(southLayoutVOs);
+						}
+					}else {
+						//鎴戜滑闇�瑕佽繃婊や竴閬嶆槸鍚︽瘡涓尯鍩熼兘鍖呭惈
+						Map<String, List<UILayoutVO>> layoutAreaMap = layoutVOS.stream().collect(Collectors.groupingBy(UILayoutVO::getLayoutAreaType));
+						if(pageLayoutDefination.plIsShowNavigator ==1) {
+							contentVO.setWestAreas(layoutAreaMap.getOrDefault(UILayoutAreaTypeEnum.WEST.getValue(), new ArrayList<>()));
+						}
+						contentVO.setNorthAreas(layoutAreaMap.getOrDefault(UILayoutAreaTypeEnum.NORTH.getValue(), new ArrayList<>()));
+						if(pageLayoutDefination.plIsShowForm == 1) {
+							contentVO.setCenterAreas(layoutAreaMap.getOrDefault(UILayoutAreaTypeEnum.CENTER.getValue(), new ArrayList<>()));
+						}
+						if(pageLayoutDefination.plIsShowTab == 1) {
+							contentVO.setSouthAreas(layoutAreaMap.getOrDefault(UILayoutAreaTypeEnum.SOUTH.getValue(), new ArrayList<>()));
+						}
+						if(CollectionUtils.isEmpty(contentVO.getCenterAreas()) && !CollectionUtils.isEmpty(contentVO.getSouthAreas())){
+							//鏈夋搷浣滃尯浣嗘槸娌℃湁鎺у埗鍣ㄧ殑鎯呭喌
+							contentVO.getSouthAreas().stream().forEach(layoutVO->{
+								layoutVO.setLayoutAreaType(UILayoutAreaTypeEnum.CENTER.getValue());
+							});
+							contentVO.setCenterAreas(contentVO.getSouthAreas());
+							contentVO.setSouthAreas(null);
+						}
+						if(CollectionUtils.isEmpty(contentVO.getCenterAreas()) && !CollectionUtils.isEmpty(contentVO.getWestAreas())){
+							//鍙湁瀵艰埅鍖�
+							contentVO.getWestAreas().stream().forEach(layoutVO->{
+								layoutVO.setLayoutAreaType(UILayoutAreaTypeEnum.CENTER.getValue());
+							});
+							contentVO.setCenterAreas(contentVO.getWestAreas());
+							contentVO.setWestAreas(null);
+						}
+					}
+				}
+				//contentVO.setLayouts(listLayoutByContent(contentVO.getOid()));
+			}
+		}
+		return contentVO;
+	}
+
+//	private List<UILayoutVO> swapLayArea(List<UILayoutVO> layoutVOS){
+//		List<UILayoutVO> layoutVOList = new ArrayList<>();
+//		//1 瀵艰埅鍖�
+//		//2 涓诲唴瀹瑰尯
+//		//3 椤电鍖�
+//		if(!CollectionUtils.isEmpty(layoutVOS)){
+//			//鍙湁涓�涓尯鍩熺殑鏃跺�欙紝閮芥斁鍦╟enter閲岋紝鍝�曟湰韬槸瀵艰埅鍖�
+//			if(layoutVOS.size() == 1){
+//				layoutVOS.get(0).setLayoutAreaType(UILayoutAreaTypeEnum.CENTER.getValue());
+//				layoutVOList.add(layoutVOS.get(0));
+//			}else{
+//				Map<String,List<UILayoutVO>> layoutAreaMap = layoutVOS.stream().collect(Collectors.groupingBy(UILayoutVO::getLayoutAreaType));
+//				if(layoutAreaMap.containsKey("1")){
+//					//
+//				}
+//			}
+//		}
+//	}
+
+	/**
+	 * 鑾峰彇鏌愪釜UI涓婁笅鏂囩殑鍖哄煙
+	 * @param pkContent UI涓婁笅鏂囩殑涓婚敭
+	 * @return 涓婁笅鏂�
+	 */
+	private List<UILayoutVO> listLayoutByContent(String pkContent){
+		try {
+			return UILayoutDO2VOs(Arrays.stream(ServiceProvider.getUIService().getPLTabPagesByPageDefinationOId(pkContent)).collect(Collectors.toList()),true);
+		} catch (VCIError vciError) {
+			throw WebUtil.getVciBaseException(vciError);
+		}
+	}
+
+	/**
+	 * 鎵归噺鑾峰彇UI涓婁笅鏂囩殑鍖哄煙
+	 * @param pkContents ui涓婁笅鏂囦富閿�
+	 * @return key鏄痷i涓婁笅鏂囩殑涓婚敭
+	 */
+	private Map<String,List<UILayoutVO>> batchListLayoutByContent(Collection<String> pkContents){
+		Map<String, List<UILayoutVO>> layoutMap = self.selectAllUILayoutMap();
+		List<UILayoutVO> layoutVOS = new ArrayList<>();
+		pkContents.stream().forEach(pkContent->{
+			if(layoutMap.containsKey(pkContent)){
+				layoutVOS.addAll(layoutMap.get(pkContent));
+			}
+		});
+		return layoutVOS.stream().collect(Collectors.groupingBy(UILayoutVO::getPkContent));
+	}
+
+	/**
+	 * 鍒嗛殧绗�
+	 */
+	public static final String SEP = "${uiContent}";
+
+	/**
+	 * 鏌ヨ鎵�鏈夌殑UI涓婁笅鏂囩殑鏄犲皠
+	 *
+	 * @return 鏄剧ず瀵硅薄锛宬ey涓氬姟绫诲瀷+${uiContent}+涓婁笅鏂囩殑Id
+	 */
+	@Override
+	public Map<String, UIContentVO> selectAllUIContentMap() {
+		return Optional.ofNullable(self.selectAllUIContent()).orElseGet(()->new ArrayList<UIContentVO>()).stream().collect(Collectors.toMap(s->s.getBtmTypeId() + SEP + s.getId(),t->t));
+	}
+
+	/**
+	 * 鏌ヨ鎵�鏈夌殑涓婁笅鏂囩殑鍖哄煙
+	 *
+	 * @return 鍖哄煙鐨勬樉绀哄璞�
+	 */
+	@Override
+	@Cacheable(value = VCI_OBJECT_SERVICE,key = CacheKeyConstant.ALL_LAYOUT,unless = "#result == null")
+	public List<UILayoutVO> selectAllUILayout() {
+//		try {
+//			return UILayoutDO2VOs(Arrays.stream(platformClientUtil.getPortalService().getAllPLTabPages()).collect(Collectors.toList()),true);
+//		} catch (VCIError vciError) {
+//			throw WebUtil.getVciBaseException(vciError);
+//		}
+		return null;
+	}
+
+	/**
+	 * UI鍖哄煙鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+	 * @param pages 鍖哄煙鐨勬暟鎹璞�
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	private List<UILayoutVO> UILayoutDO2VOs(Collection<com.vci.corba.portal.data.PLTabPage> pages, boolean queryDetail){
+		List<UILayoutVO> contentVOS = new ArrayList<>();
+		Optional.ofNullable(pages).orElseGet(()->new ArrayList<com.vci.corba.portal.data.PLTabPage>()).stream().forEach(page->{
+			UILayoutVO layoutVO = UILayoutDO2VO(page, queryDetail);
+			if(layoutVO.isEnableStatus()) {
+				contentVOS.add(layoutVO);
+			}
+		});
+		if(!queryDetail) {
+			Map<String, List<UIComponentVO>> uiComponentMap = self.selectAllUIComponentMap();
+			contentVOS.stream().forEach(layout -> {
+				if (uiComponentMap.containsKey(layout.getOid())) {
+					layout.setComponentVOs(uiComponentMap.get(layout.getOid()));
+				}
+			});
+		}
+		return contentVOS;
+	}
+
+	/**
+	 * UI涓婁笅鏂囩殑鍖哄煙
+	 * @param page 甯冨眬鍖哄煙
+	 * @param queryDetail 鏄惁鏌ヨ缁勪欢鐨勪俊鎭�
+	 * @return 鍖哄煙鐨勬樉绀哄璞�
+	 */
+	@VciUnLog
+	private UILayoutVO UILayoutDO2VO(com.vci.corba.portal.data.PLTabPage page, boolean queryDetail){
+		UILayoutVO layoutVO = new UILayoutVO();
+		if(page !=null ){
+			layoutVO.setOid(page.plOId);
+			layoutVO.setId(page.plCode);
+			layoutVO.setName(page.plName);
+			layoutVO.setEnableStatus(1 == page.plIsOpen?true:false);
+			if(!layoutVO.isEnableStatus()){
+				//娌℃湁鍚姩鐩存帴杩斿洖浜嗭紝鍒煡涓嬮潰浜�
+				return layoutVO;
+			}
+			layoutVO.setTitle(page.plLabel);
+			if(StringUtils.isBlank(layoutVO.getTitle())){
+				layoutVO.setTitle(layoutVO.getName());
+			}
+			layoutVO.setDescription(page.plDesc);
+			layoutVO.setOrderNum(page.plSeq);
+			layoutVO.setPkContent(page.plOId);
+			layoutVO.setLayoutAreaType(page.plAreaType+"");
+			if(1 == page.plAreaType) {
+				layoutVO.setLayoutAreaType(UILayoutAreaTypeEnum.WEST.getValue());
+			}else if(2 == page.plAreaType){
+				layoutVO.setLayoutAreaType(UILayoutAreaTypeEnum.CENTER.getValue());
+			}else{
+				layoutVO.setLayoutAreaType(UILayoutAreaTypeEnum.SOUTH.getValue());
+			}
+			layoutVO.setCreator(page.plCreateUser);
+			try {
+				layoutVO.setCreateTime(VciDateUtil.str2Date(String.valueOf(page.plCreateTime),VciDateUtil.DateTimeFormat));
+				layoutVO.setLastModifyTime(VciDateUtil.str2Date(String.valueOf(page.plModifyTime),VciDateUtil.DateTimeFormat));
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+			layoutVO.setLastModifier(page.plModifyUser);
+			layoutVO.setDisplayExpression(page.plOpenExpression);
+			layoutVO.setUiParseClass(page.plUIParser);
+			layoutVO.setExtendAttr(page.plExtAttr);
+			if(queryDetail){
+				//鍗曚釜鐨勶紝鐩存帴鑾峰彇
+				try {
+					layoutVO.setComponentVOs(uiComponentDO2VOs(Arrays.stream(ServiceProvider.getUIService().getPLPageDefinationsByPageContextOId(layoutVO.getOid())).collect(Collectors.toList()),true));
+//					layoutVO.setComponentVOs(uiComponentDO2VOs(Arrays.stream(platformClientUtil.getPortalService().getPLPageDefinationsByPageContextOId(layoutVO.getOid())).collect(Collectors.toList()),true));
+				} catch (VCIError vciError) {
+					throw WebUtil.getVciBaseException(vciError);
+				}
+			}
+		}
+		return layoutVO;
+	}
+	/**
+	 * 鏌ヨ鎵�鏈夌殑涓婁笅鏂囩殑鍖哄煙鐨勬槧灏�
+	 *
+	 * @return 鍖哄煙鐨勬樉绀哄璞� ,key鏄墍灞濽I涓婁笅鏂囩殑涓婚敭
+	 */
+	@Override
+	public Map<String, List<UILayoutVO>> selectAllUILayoutMap() {
+		return Optional.ofNullable(self.selectAllUILayout()).orElseGet(()->new ArrayList<>()).stream().collect(Collectors.groupingBy(s->s.getPkContent()));
+	}
+
+	/**
+	 * 鏌ヨ鎵�鏈夌殑缁勪欢
+	 *
+	 * @return UI缁勪欢
+	 */
+	@Override
+	@Cacheable(value = VCI_OBJECT_SERVICE,key = CacheKeyConstant.ALL_COMP ,unless = "#result ==null")
+	public List<UIComponentVO> selectAllUIComponent() {
+//		try {
+//			return uiComponentDO2VOs(Arrays.stream(platformClientUtil.getPortalService().getAllPLPageDefinations()).collect(Collectors.toList()),false);
+//		} catch (VCIError vciError) {
+//			throw WebUtil.getVciBaseException(vciError);
+//		}
+		return null;
+	}
+
+	/**
+	 * 浣跨敤涓婚敭鑾峰彇
+	 *
+	 * @param componentOid 缁勪欢鐨勪富閿�
+	 * @return 涓婚敭鐨勬樉绀哄璞�
+	 */
+	@Override
+	public UIComponentVO getComponentByOid(String componentOid) {
+		if(StringUtils.isBlank(componentOid)){
+			return null;
+		}
+//		if(!QUERY_BY_CACHE){
+//			try {
+//				return uiComponentDO2VO(platformClientUtil.getPortalService().getPLPageDefinationById(componentOid),true);
+//			} catch (VCIError vciError) {
+//				throw WebUtil.getVciBaseException(vciError);
+//			}
+//		}else{
+//			List<UIComponentVO> componentVOS = self.selectAllUIComponent();
+//			List<UIComponentVO> componentVOList = Optional.ofNullable(componentVOS).orElseGet(() -> new ArrayList<>()).stream().filter(s -> s.getOid().equalsIgnoreCase(componentOid)).collect(Collectors.toList());
+//			if(!CollectionUtils.isEmpty(componentVOList)){
+//				return componentVOList.get(0);
+//			}
+//		}
+		return null;
+	}
+
+	/**
+	 * 缁勪欢鐨勬暟鎹璞¤浆鎹负鏄剧ず瀵硅薄
+	 * @param pages 鏁版嵁瀵硅薄
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	private List<UIComponentVO> uiComponentDO2VOs(Collection<com.vci.corba.portal.data.PLPageDefination> pages, boolean queryDetail){
+		List<UIComponentVO> componentVOS = new ArrayList<>();
+		pages.stream().forEach(page->{
+			componentVOS.add(uiComponentDO2VO(page,queryDetail));
+		});
+		return componentVOS;
+	}
+
+	/**
+	 * 缁勪欢鐨勬暟鎹璞¤浆鎹负鏄剧ず瀵硅薄
+	 * @param page 鏁版嵁瀵硅薄
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	@VciUnLog
+	private UIComponentVO uiComponentDO2VO(com.vci.corba.portal.data.PLPageDefination page, boolean queryDetail){
+		UIComponentVO componentVO = new UIComponentVO();
+		if(page !=null){
+			componentVO.setOid(page.plOId);
+			componentVO.setPkLayout(page.plTabPageOId);
+			componentVO.setName(page.name);
+			componentVO.setDescription(page.desc);
+			componentVO.setOrderNum((int) page.seq);
+			UIComponentDefineXO componentDefineXO = null;
+			try {
+				componentDefineXO = readInfoFromXML(page.plDefination, UIComponentDefineXO.class);
+			}catch (Throwable e){
+				logger.error("璇诲彇xml鍑洪敊",e);
+				return  null;
+			}
+			//涔嬪墠鐨勭被鍨嬬殑鍊兼槸1锛�2锛�3绛夌湅鐫�涓嶇洿瑙�
+			UIComponentTypeEnum componentTypeEnum = null;
+			if("1".equals(componentDefineXO.getTemplateType())){
+				//璇存槑杩欎釜琛ㄦ牸鐨勭被鍨�
+				componentTypeEnum = UIComponentTypeEnum.TABLE;
+				//鏌ヨ琛ㄦ牸鐩稿叧鐨勯厤缃�
+				String btmType ;
+				if("1".equals(componentDefineXO.getSearchTarger())){
+					//鏈璞★紝灏辨槸涓氬姟绫诲瀷
+					btmType = componentDefineXO.getShowType();
+				}else{
+					//閾炬帴绫诲瀷
+					btmType = componentDefineXO.getLinkType();
+				}
+				if(!queryDetail) {
+					//浠庣紦瀛橀噷鑾峰彇
+					Map<String, UITableDefineVO> tableDefineVOMap = self.selectAllTableMap();
+					String key = btmType.toLowerCase() + SEP + componentDefineXO.getTemplateId().toLowerCase();
+					if (!tableDefineVOMap.containsKey(key)) {
+						throw new VciBaseException("{0}閲岀殑琛ㄦ牸{1}涓嶅瓨鍦�", new String[]{btmType, componentDefineXO.getTemplateId()});
+					}
+					componentVO.setTableDefineVO(tableDefineVOMap.get(key));
+				}else{
+					try {
+						componentVO.setTableDefineVO(tableDO2VO(ServiceProvider.getUIService().getPortalVIByTypeNameAndVIName(btmType,componentDefineXO.getTemplateId()),true));
+//						componentVO.setTableDefineVO(tableDO2VO(platformClientUtil.getPortalService().getPortalVIByTypeNameAndVIName(btmType,componentDefineXO.getTemplateId()),true));
+					} catch (VCIError vciError) {
+						throw WebUtil.getVciBaseException(vciError);
+					}
+				}
+				if(StringUtils.isNotBlank(componentDefineXO.getQueryTemplateName())){
+					componentVO.getTableDefineVO().setQueryTemplateName(componentDefineXO.getQueryTemplateName());
+				}
+			}else if("2".equals(componentDefineXO.getTemplateType())){
+				//鑷畾涔�
+				componentTypeEnum = UIComponentTypeEnum.CUSTOMER;
+				componentVO.setCustomClass(componentDefineXO.getControlPath());
+			}else if("3".equals(componentDefineXO.getTemplateType())){
+				//鏍戣〃
+				componentTypeEnum = UIComponentTypeEnum.TREE_GRID;
+				//鏌ヨ琛ㄦ牸鐩稿叧鐨勯厤缃�
+				String btmType ;
+				boolean isLink = false;
+				if("1".equals(componentDefineXO.getSearchTarger())){
+					//鏈璞★紝灏辨槸涓氬姟绫诲瀷
+					btmType = componentDefineXO.getShowType();
+				}else{
+					//閾炬帴绫诲瀷
+					btmType = componentDefineXO.getLinkType();
+					isLink = true;
+				}
+				UITableDefineVO tableDefineVO = null;
+				if(!queryDetail) {
+					Map<String, UITableDefineVO> tableDefineVOMap = self.selectAllTableMap();
+					String key = btmType.toLowerCase() + SEP + componentDefineXO.getTemplateId().toLowerCase();
+					if (!tableDefineVOMap.containsKey(key)) {
+						throw new VciBaseException("{0}閲岀殑琛ㄦ牸{1}涓嶅瓨鍦�", new String[]{btmType, componentDefineXO.getTemplateId()});
+					}
+					tableDefineVO= tableDefineVOMap.get(key);
+				}else{
+					try {
+						tableDefineVO = tableDO2VO(ServiceProvider.getUIService().getPortalVIByTypeNameAndVIName(btmType,componentDefineXO.getTemplateId()),true);
+					} catch (VCIError vciError) {
+						throw WebUtil.getVciBaseException(vciError);
+					}
+				}
+				if(tableDefineVO != null) {
+
+					UITreeTableDefineVO treeTableDefineVO = new UITreeTableDefineVO();
+					BeanUtil.convert(tableDefineVO, treeTableDefineVO);
+					if(isLink){
+						treeTableDefineVO.setTreeCurrentField("t_oid");
+						treeTableDefineVO.setTreeParentField("f_oid");
+						treeTableDefineVO.setTreeFieldName(componentDefineXO.getExpandCols());
+					}else{
+						if(componentDefineXO.getExpandCols().contains(",")){
+							treeTableDefineVO.setTreeParentField(componentDefineXO.getExpandCols().split(",")[0]);
+							treeTableDefineVO.setTreeFieldName(componentDefineXO.getExpandCols().split(",")[1]);
+						}else{
+							treeTableDefineVO.setTreeParentField("parentOid");
+							treeTableDefineVO.setTreeFieldName(componentDefineXO.getExpandCols());
+						}
+					}
+					//鐜板湪鏍戣〃鍙敮鎸佸叏閮ㄥ睍寮�
+					componentVO.setTreeTableDefineVO(treeTableDefineVO);
+				}else{
+					logger.error("{},{}閲岀殑淇℃伅涓嶆纭�",new String[]{btmType,});
+				}
+				if(StringUtils.isNotBlank(componentDefineXO.getQueryTemplateName())){
+					componentVO.getTreeTableDefineVO().setQueryTemplateName(componentDefineXO.getQueryTemplateName());
+				}
+			}else if ("4".equals(componentDefineXO.getTemplateType())){
+				//琛ㄥ崟
+				componentTypeEnum = UIComponentTypeEnum.FORM;
+				//鏌ヨ琛ㄥ崟鐩稿叧鐨勯厤缃�
+				String btmType ;
+				if("1".equals(componentDefineXO.getSearchTarger())){
+					//鏈璞★紝灏辨槸涓氬姟绫诲瀷
+					btmType = componentDefineXO.getShowType();
+				}else{
+					//閾炬帴绫诲瀷
+					btmType = componentDefineXO.getLinkType();
+				}
+				if(!queryDetail) {
+					Map<String, UIFormDefineVO> formDefineVOMap = self.selectAllFormMap();
+					String key = btmType.toLowerCase() + SEP + componentDefineXO.getTemplateId().toLowerCase();
+					if (!formDefineVOMap.containsKey(key)) {
+						throw new VciBaseException("{0}閲岀殑琛ㄦ牸{1}涓嶅瓨鍦�", new String[]{btmType, componentDefineXO.getTemplateId()});
+					}
+					componentVO.setFormDefineVO(formDefineVOMap.get(key));
+				}else{
+					try {
+						componentVO.setFormDefineVO(formDO2VO(ServiceProvider.getUIService().getPortalVIByTypeNameAndVIName(btmType,componentDefineXO.getTemplateId())));
+					} catch (VCIError vciError) {
+						throw WebUtil.getVciBaseException(vciError);
+					}
+				}
+			}else if("5".equals(componentDefineXO.getTemplateType())){
+				//鏍�
+				componentTypeEnum = UIComponentTypeEnum.TREE;
+				UITreeDefineVO treeDefineVO = new UITreeDefineVO();
+				treeDefineVO.setBtmType(componentDefineXO.getShowType());
+				treeDefineVO.setLinkType(componentDefineXO.getLinkType());
+				treeDefineVO.setLoadType("1".equalsIgnoreCase(componentDefineXO.getExpandMode())?"node":"all");
+				treeDefineVO.setOrientation("positive".equalsIgnoreCase(componentDefineXO.getOrientation())?false:true);
+				treeDefineVO.setShowImage("1".equalsIgnoreCase(componentDefineXO.getIsShowImage())?true:false);
+				treeDefineVO.setRootContent(componentDefineXO.getRootContent());
+				treeDefineVO.setFieldSep(StringUtils.isBlank(componentDefineXO.getSeparator())?",":componentDefineXO.getSeparator());
+				treeDefineVO.setQueryTemplateName(componentDefineXO.getTemplateId());
+				treeDefineVO.setTreeNodeExpression(componentDefineXO.getShowAbs());
+				treeDefineVO.setShowLinkAbs(componentDefineXO.getShowLinkAbs());
+				componentVO.setTreeDefineVO(treeDefineVO);
+			}else{
+				throw new VciBaseException("UI缁勪欢鐨勭被鍨嬩笉鏀寔锛寋0}",new String[]{componentDefineXO.getTemplateType()});
+			}
+			componentVO.setUiComponentType(componentTypeEnum.getValue());
+			componentVO.setUiComponentTypeText(componentTypeEnum.getText());
+
+			//鏄剧ず绫诲瀷鐜板湪鐢ㄦ潵鍋氬暐鐨勫憿
+			UIComponentDisplayTypeEnum displayTypeEnum = null;
+			if("1".equals(componentDefineXO.getNavigatorType())){
+				displayTypeEnum = UIComponentDisplayTypeEnum.NONE;
+			}else if("2".equals(componentDefineXO.getNavigatorType())){
+				displayTypeEnum = UIComponentDisplayTypeEnum.ROLE;
+			}else if("3".equals(componentDefineXO.getNavigatorType())){
+				displayTypeEnum = UIComponentDisplayTypeEnum.FOLDER;
+			}
+			componentVO.setUiParseClass(componentDefineXO.getUIParser());
+			componentVO.setExtendAttr(componentDefineXO.getExtAttr());
+			componentVO.setButtons(listButtonByComponent(componentVO.getOid()));
+		}
+		return componentVO;
+	}
+
+	/**
+	 * 鑾峰彇鏌愪釜缁勪欢鐨勬寜閽�
+	 * @param pkComponent 缁勪欢鐨勪富閿�
+	 * @return 鎸夐挳鐨勪俊鎭�
+	 */
+	@Override
+	public List<UIButtonDefineVO> listButtonByComponent(String pkComponent){
+		try {
+			List<UIButtonDefineVO> buttonDefineVOS = buttonDO2VOs(Arrays.stream(ServiceProvider.getUIService().getPLTabButtonsByTableOId(pkComponent)).collect(Collectors.toSet())).stream().sorted(((o1, o2) -> o1.getOrderNum().compareTo(o2.getOrderNum()))).collect(Collectors.toList());
+			if(CollectionUtils.isEmpty(buttonDefineVOS)){
+				return buttonDefineVOS;
+			}
+			List<UIButtonDefineVO> childrens = buttonDefineVOS.stream().filter(s -> StringUtils.isNotBlank(s.getPkParentOid())).collect(Collectors.toList());
+			if(!CollectionUtils.isEmpty(childrens)){
+				buttonDefineVOS = buttonDefineVOS.stream().filter( s->StringUtils.isBlank(s.getPkParentOid())).collect(Collectors.toList());
+				//鍙敮鎸佷竴绾�.澶氫簡涔熶笉濂界湅
+				buttonDefineVOS.stream().forEach(buttonVO->{
+					buttonVO.setChildren(childrens.stream().filter(s->buttonVO.getOid().equals(s.getPkParentOid())).collect(Collectors.toList()));
+				});
+				return buttonDefineVOS;
+			}else{
+				return buttonDefineVOS;
+			}
+		} catch (VCIError vciError) {
+			throw WebUtil.getVciBaseException(vciError);
+		}
+	}
+
+
+
+	/**
+	 * 鎸夐挳鐨勬暟鎹璞¤浆鎹负鏄剧ず瀵硅薄
+	 * @param buttons 鎸夐挳鐨勬暟鎹璞�
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	@Override
+	public List<UIButtonDefineVO> buttonDO2VOs(Collection<com.vci.corba.portal.data.PLTabButton> buttons){
+		List<UIButtonDefineVO> buttonDefineVOS = new ArrayList<>();
+		Optional.ofNullable(buttons).orElseGet(()->new ArrayList<>()).stream().forEach(button->{
+			buttonDefineVOS.add(buttonDO2VO(button));
+		});
+		return buttonDefineVOS;
+	}
+
+	/**
+	 * 鎸夐挳鐨勬暟鎹璞¤浆鎹负鏄剧ず瀵硅薄
+	 * @param button 鎸夐挳鐨勬暟鎹璞�
+	 * @return 鏄剧ず瀵硅薄
+	 */
+	@Override
+	public UIButtonDefineVO buttonDO2VO(com.vci.corba.portal.data.PLTabButton button)  {
+		UIButtonDefineVO buttonVO = new UIButtonDefineVO();
+		Map<String, UIActionVO> actionVOMap = self.selectAllActionMap();
+//		Map<String, UIActionVO> actionVOMap = ServiceProvider.getUIService().getAllPLAction();
+		if(button !=null){
+			buttonVO.setOid(button.plOId);
+			buttonVO.setPkComponent(button.plTableOId);
+			buttonVO.setName(button.plLabel);
+			buttonVO.setDescription(button.plDesc);
+			buttonVO.setOrderNum((int) button.plSeq);
+			buttonVO.setCreator(button.plCreateUser);
+			buttonVO.setLastModifier(button.plModifyUser);
+			try{
+				buttonVO.setCreateTime(VciDateUtil.str2Date(String.valueOf(button.plCreateTime),VciDateUtil.DateTimeFormat));
+				buttonVO.setLastModifyTime(VciDateUtil.str2Date(String.valueOf(button.plModifyTime),VciDateUtil.DateTimeFormat));
+			}catch (Throwable e){
+
+			}
+			buttonVO.setPkParentOid(button.plParentOid);
+			buttonVO.setDisplayMode(button.displayMode);
+			buttonVO.setIconPath(button.iconPath);
+			buttonVO.setAuthorization("0".equalsIgnoreCase(button.authorization));
+			buttonVO.setHidden(!"0".equalsIgnoreCase(button.show));
+			//鏌ヨaction
+			buttonVO.setAreaType(button.plAreaType);
+			if(StringUtils.isNotBlank(button.plActionOId) && actionVOMap.containsKey(button.plActionOId)){
+				UIActionVO actionVO = actionVOMap.get(button.plActionOId);
+				buttonVO.setActionVO(actionVO);
+				buttonVO.setId(actionVO.getId());
+				buttonVO.setUrl(actionVO.getBsUrl());
+				buttonVO.setCsUrl(actionVO.getCsClass());
+				//鏌ユ壘鍙傛暟
+				Map<String,String> params = new HashMap<>();
+				try {
+//					PLCommandParameter[] parameters = platformClientUtil.getPortalService().getPLCommandParametersByCommandOId(buttonVO.getOid());
+					com.vci.corba.portal.data.PLCommandParameter[] parameters = ServiceProvider.getUIService().getPLCommandParametersByCommandOId(buttonVO.getOid());
+					if(parameters!=null && parameters.length > 0){
+						for(com.vci.corba.portal.data.PLCommandParameter parameter: parameters){
+							params.put(parameter.plKey,parameter.plValue);
+						}
+					}
+				} catch (VCIError vciError) {
+					throw WebUtil.getVciBaseException(vciError);
+				}
+				buttonVO.setParamVOS(params);
+				if(StringUtils.isBlank(buttonVO.getIconPath()) && (params.containsKey("icon") || params.containsKey("iconPath") || params.containsKey("iconCls"))){
+					buttonVO.setIconPath(params.getOrDefault("icon",params.getOrDefault("iconPath",params.getOrDefault("iconCls",""))));
+				}
+			}
+		}
+		return buttonVO;
+	}
+
+	/**
+	 * 浠巟ml鐨勪俊鎭腑璇诲彇瀵硅薄
+	 * @param xmlInfo xml鐨勪俊鎭�
+	 * @param xoClass 瀵硅薄鐨刢lass
+	 * @param <T> 瀵硅薄鐨�
+	 * @return 瀵硅薄
+	 * @throws VciBaseException 杞崲鍑洪敊浼氭姏鍑哄紓甯�
+	 */
+	private <T> T readInfoFromXML(String xmlInfo,Class<T> xoClass) throws VciBaseException{
+		XStream xStream = new XStream(new XppDriver(new XmlFriendlyNameCoder("_-","_")));
+		xStream.setClassLoader(getClass().getClassLoader());
+		xStream.processAnnotations(xoClass);
+		xStream.ignoreUnknownElements();
+		try{
+			return (T)xStream.fromXML(xmlInfo);
+		}catch (Throwable e){
+			String error = LangBaseUtil.getErrorMsg(e);
+			if(logger.isErrorEnabled()){
+				logger.error(error,e);
+				logger.error(xmlInfo);
+			}
+			throw new VciBaseException(error,new String[0],e);
+		}
+	}
+
+	/**
+	 * 鏌ヨ鎵�鏈夌殑缁勪欢
+	 *
+	 * @return key鏄墍灞炵殑鍖哄煙锛�
+	 */
+	@Override
+	public Map<String, List<UIComponentVO>> selectAllUIComponentMap() {
+		return Optional.ofNullable(self.selectAllUIComponent()).orElseGet(()->new ArrayList<>()).stream().collect(Collectors.groupingBy(UIComponentVO::getPkLayout));
+	}
+
+	/**
+	 * 浣跨敤涓氬姟绫诲瀷鎴栬�呴摼鎺ョ被鍨嬶紝浠ュ強UI涓婁笅鏂囩殑缂栧彿锛岃幏鍙栫浉搴旂殑淇℃伅
+	 *
+	 * @param btmType 涓氬姟绫诲瀷
+	 * @param id      涓婚敭
+	 * @return UI涓婁笅鏂囩殑淇℃伅
+	 */
+	@Override
+	@Cacheable(value = VCI_OBJECT_SERVICE,key = "#p0.concat('${uicache}').concat(#p1)",unless = "#result == null || #p0 == null || #p1 ==null")
+	public UIContentVO getUIContentByBtmTypeAndId(String btmType, String id) {
+		WebUtil.alertNotNull(btmType,"涓氬姟绫诲瀷鎴栬�呴摼鎺ョ被鍨�",id,"UI涓婁笅鏂囩殑缂栧彿");
+		PLPageLayoutDefination[] obj = null;
+		try {
+			obj = platformClientUtil.getPortalService().getPLPageLayoutDefinationsByRelatedType(btmType);
+		} catch (VCIError vciError) {
+			throw WebUtil.getVciBaseException(vciError);
+		}
+		PLPageLayoutDefination context = null;
+		for (int i = 0; i < obj.length; i++) {
+			if (obj[i].plCode.equals(id)) {
+				context = obj[i];
+				break;
+			}
+		}
+//		return UIContentDO2VO(context,true);
+		return UIContentDO2VO(null,true);
+	}
+}
+
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/VciFileDocClassifyServiceImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/VciFileDocClassifyServiceImpl.java
new file mode 100644
index 0000000..5177b4d
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/VciFileDocClassifyServiceImpl.java
@@ -0,0 +1,415 @@
+package com.vci.web.service.impl;
+
+import com.vci.file.dto.VciFileDocClassifyDTO;
+import com.vci.file.dto.VciFileDocClassifyDTOList;
+import com.vci.file.pagemodel.VciFileDocClassifyVO;
+import com.vci.starter.revision.service.RevisionModelUtil;
+import com.vci.starter.web.annotation.bus.VciChangeDocument;
+import com.vci.starter.web.enumpck.VciChangeDocumentTypeEnum;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.BaseResult;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.starter.web.pagemodel.KeyValue;
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.starter.web.util.BeanUtil;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.starter.web.wrapper.VciQueryWrapperForDO;
+import com.vci.web.dao.VciFileDocClassifyDaoI;
+import com.vci.web.model.VciFileDocClassifyDO;
+import com.vci.web.service.VciFileDocClassifyServiceI;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static com.vci.frameworkcore.constant.FrameWorkLangCodeConstant.*;
+
+/**
+ * 鏂囨。鐨勭被鍨嬫湇鍔�
+ *
+ * @author weidy
+ * @date 2020-08-04
+ */
+@Service
+@VciChangeDocument(btmType = "fileDocClassify")
+public class VciFileDocClassifyServiceImpl implements VciFileDocClassifyServiceI {
+
+    /**
+    * 鏃ュ織
+    */
+    private Logger logger = LoggerFactory.getLogger(getClass());
+
+    /**
+    * 鏁版嵁鎿嶄綔灞�
+    */
+    @Resource
+    private VciFileDocClassifyDaoI vciFileDocClassifyMapper;
+
+    /**
+    * 鐗堟湰鍜屾暟鎹璞″伐鍏风被
+    */
+    @Autowired
+    private RevisionModelUtil revisionModelUtil;
+
+    /**
+     * 鏌ヨ鎵�鏈夌殑鏂囨。鐨勭被鍨�
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉鍜屾帓搴�
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 鏌ヨ鏉′欢鍜屽垎椤靛嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public DataGrid<VciFileDocClassifyVO> gridVciFileDocClassify(Map<String, String> conditionMap, PageHelper pageHelper) throws VciBaseException {
+        if (pageHelper == null) {
+            pageHelper = new PageHelper(-1);
+        }
+        VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(conditionMap,VciFileDocClassifyDO.class,pageHelper);
+        List<VciFileDocClassifyDO> doList = vciFileDocClassifyMapper.selectByWrapper(queryWrapper);
+        DataGrid<VciFileDocClassifyVO> dataGrid=new DataGrid<>();
+        if (!CollectionUtils.isEmpty(doList)) {
+            dataGrid.setData(vciFileDocClassifyDO2VOs(doList));
+            queryWrapper.clearPage();
+            dataGrid.setTotal(vciFileDocClassifyMapper.countByWrapper(queryWrapper));
+        }
+        return dataGrid;
+    }
+
+    /**
+     * 鎵归噺鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+     * @param vciFileDocClassifyDOs 鏁版嵁瀵硅薄鍒楄〃
+     * @return 鏄剧ず瀵硅薄
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呬笉瀛樺湪鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public List<VciFileDocClassifyVO> vciFileDocClassifyDO2VOs(Collection<VciFileDocClassifyDO>  vciFileDocClassifyDOs) throws VciBaseException {
+        List<VciFileDocClassifyVO> voList = new ArrayList<>();
+        if(!CollectionUtils.isEmpty(vciFileDocClassifyDOs)){
+            vciFileDocClassifyDOs.stream().forEach(s ->{
+                    VciFileDocClassifyVO vo =  vciFileDocClassifyDO2VO(s);
+                if(vo != null){
+                    voList.add(vo);
+                }
+            });
+        }
+        return voList;
+    }
+
+    /**
+     * 鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+     * @param  vciFileDocClassifyDO 鏁版嵁瀵硅薄
+     * @return 鏄剧ず瀵硅薄
+     * @throws VciBaseException 鎷疯礉灞炴�у嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public VciFileDocClassifyVO vciFileDocClassifyDO2VO(VciFileDocClassifyDO vciFileDocClassifyDO) throws VciBaseException {
+              VciFileDocClassifyVO vo = new VciFileDocClassifyVO();
+        if(vciFileDocClassifyDO != null){
+          BeanUtil.convert(vciFileDocClassifyDO,vo);
+          //杩橀渶瑕佸鐞嗘灇涓剧瓑鍏朵粬鐨勫唴瀹�
+        }
+        return vo;
+    }
+
+    /**
+     * 澧炲姞鏂囨。鐨勭被鍨�
+     * @param vciFileDocClassifyDTO 鏂囨。鐨勭被鍨嬫暟鎹紶杈撳璞�
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屽敮涓�椤癸紝蹇呰緭椤逛笉閫氳繃鏃朵細鎶涘嚭寮傚父
+     */
+    @Override
+    @VciChangeDocument(changeType = VciChangeDocumentTypeEnum.ADD)
+    public VciFileDocClassifyVO addSave(VciFileDocClassifyDTO vciFileDocClassifyDTO) throws VciBaseException {
+        VciBaseUtil.alertNotNull(vciFileDocClassifyDTO,"闇�瑕佹坊鍔犵殑鏁版嵁瀵硅薄");
+        //灏咲TO杞崲涓篋O
+        VciFileDocClassifyDO vciFileDocClassifyDO = new VciFileDocClassifyDO();
+        BeanUtil.convert(vciFileDocClassifyDTO,vciFileDocClassifyDO);
+
+        revisionModelUtil.wrapperForAdd(vciFileDocClassifyDO);
+        int insert = vciFileDocClassifyMapper.insert(vciFileDocClassifyDO);
+        if(insert>0){
+            return vciFileDocClassifyDO2VO(vciFileDocClassifyDO);
+        }else{
+            throw new VciBaseException(ADD_FAIL);
+        }
+    }
+
+    /**
+     * 淇敼鏂囨。鐨勭被鍨�
+     * @param vciFileDocClassifyDTO 鏂囨。鐨勭被鍨嬫暟鎹紶杈撳璞�
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屽敮涓�椤癸紝蹇呰緭椤逛笉閫氳繃鏃朵細鎶涘嚭寮傚父
+     */
+     @Override
+     @VciChangeDocument(changeType = VciChangeDocumentTypeEnum.EDIT)
+     public VciFileDocClassifyVO editSave(VciFileDocClassifyDTO vciFileDocClassifyDTO) throws VciBaseException {
+         VciBaseUtil.alertNotNull(vciFileDocClassifyDTO,"鏁版嵁瀵硅薄",vciFileDocClassifyDTO.getOid(),"鏂囨。鐨勭被鍨嬩富閿�");
+         //灏咲TO杞崲涓篋O
+         VciFileDocClassifyDO vciFileDocClassifyDO = selectByOid(vciFileDocClassifyDTO.getOid());
+         revisionModelUtil.copyFromDTO(vciFileDocClassifyDTO,vciFileDocClassifyDO);
+         revisionModelUtil.wrapperForEdit(vciFileDocClassifyDO);
+         int update = vciFileDocClassifyMapper.updateByPrimaryKey(vciFileDocClassifyDO);
+         if(update>0){
+             return vciFileDocClassifyDO2VO(vciFileDocClassifyDO);
+         }else{
+             throw new VciBaseException(EDIT_FAIL);
+         }
+     }
+
+
+    /**
+     * 鏍¢獙鏄惁鍙互鍒犻櫎锛屽鏋滃瓨鍦ㄤ笅绾э紝骞朵笖涓嬬骇鏈夋暟鎹紩鐢ㄥ垯涓嶈兘鍒犻櫎
+     * @param vciFileDocClassifyDTO 鏁版嵁浼犺緭瀵硅薄
+     * @param vciFileDocClassifyDO 鏁版嵁搴撲腑鐨勬暟鎹璞�
+     * @return success涓簍rue涓哄彲浠ュ垹闄わ紝false琛ㄧず鏈夋暟鎹紩鐢紝obj涓簍rue琛ㄧず鏈変笅绾�
+     */
+    private BaseResult checkIsCanDeleteForDO(VciFileDocClassifyDTO vciFileDocClassifyDTO, VciFileDocClassifyDO vciFileDocClassifyDO) {
+        revisionModelUtil.checkTs(vciFileDocClassifyDTO.getTs(),vciFileDocClassifyDO.getTs());
+        if(!checkIsLinked(vciFileDocClassifyDO.getOid())) {
+            return BaseResult.success();
+        }else{
+            return BaseResult.fail(DATA_LINKED_NOT_DELETE,new String[]{""});
+        }
+    }
+
+    /**
+    * 鏍¢獙鏄惁琚紩鐢�
+    * @param oid 涓婚敭
+    * @throws VciBaseException 琚紩鐢ㄧ殑鏃跺�欎細鎶涘嚭寮傚父
+    */
+    private boolean checkIsLinked(String oid) throws VciBaseException {
+        //TODO 娣诲姞闇�瑕佹牎楠屽紩鐢ㄧ殑鍦版柟
+        return false;
+    }
+
+    /**
+     * 鍒犻櫎鏂囨。鐨勭被鍨�
+     * @param vciFileDocClassifyDTO 鏂囨。鐨勭被鍨嬫暟鎹紶杈撳璞★紝oid鍜宼s闇�瑕佷紶杈�
+     * @return 鍒犻櫎缁撴灉鍙嶉锛氾細success锛氭垚鍔燂紝fail锛氬け璐�
+     * @throws VciBaseException 鍙傛暟涓虹┖锛岃寮曠敤鏃舵姏鍑哄紓甯�
+     */
+    @Override
+    @VciChangeDocument(changeType = VciChangeDocumentTypeEnum.DELETE)
+    public BaseResult deleteVciFileDocClassify(VciFileDocClassifyDTO vciFileDocClassifyDTO) throws VciBaseException {
+        VciBaseUtil.alertNotNull(vciFileDocClassifyDTO,"鏂囨。鐨勭被鍨嬫暟鎹璞�",vciFileDocClassifyDTO.getOid(),"鏂囨。鐨勭被鍨嬬殑涓婚敭");
+        VciFileDocClassifyDO vciFileDocClassifyDO = selectByOid(vciFileDocClassifyDTO.getOid());
+        BaseResult baseResult = checkIsCanDeleteForDO(vciFileDocClassifyDTO,vciFileDocClassifyDO);
+        if(baseResult.isSuccess()) {
+                    }else{
+            return baseResult;
+        }
+        //鎵ц鍒犻櫎鎿嶄綔
+        return (vciFileDocClassifyMapper.deleteByPrimaryKey(vciFileDocClassifyDO.getOid()) > 0)? BaseResult.successMsg(DELETE_SUCCESS): BaseResult.fail(DELETE_FAIL);
+    }
+
+    /**
+    * 涓婚敭鑾峰彇鏂囨。鐨勭被鍨�
+    * @param oid 涓婚敭
+    * @return 鏂囨。鐨勭被鍨嬫樉绀哄璞�
+    * @throws VciBaseException 鍙傛暟涓虹┖锛屾暟鎹笉瀛樺湪鏃朵細鎶涘嚭寮傚父
+    */
+    @Override
+    public VciFileDocClassifyVO getObjectByOid(String oid) throws VciBaseException {
+        return vciFileDocClassifyDO2VO(selectByOid(oid));
+    }
+
+    /**
+    * 涓婚敭鏌ヨ鏁版嵁瀵硅薄
+    * @param oid 涓婚敭
+    * @return  鏁版嵁瀵硅薄
+    * @throws VciBaseException 鍙傛暟涓虹┖锛屽苟涓旀暟鎹笉瀛樺湪鐨勬椂鍊欎細鎶涘嚭寮傚父
+    */
+    private VciFileDocClassifyDO selectByOid(String oid) throws VciBaseException {
+        VciBaseUtil.alertNotNull(oid,"涓婚敭");
+        VciFileDocClassifyDO vciFileDocClassifyDO = vciFileDocClassifyMapper.selectByPrimaryKey(oid.trim());
+        if(vciFileDocClassifyDO == null || StringUtils.isBlank(vciFileDocClassifyDO.getOid())){
+            throw new VciBaseException(DATA_OID_NOT_EXIST);
+        }
+        return vciFileDocClassifyDO;
+    }
+
+    /**
+     * 涓婚敭鎵归噺鑾峰彇鏂囨。鐨勭被鍨�
+     * @param oidCollections 涓婚敭闆嗗悎锛屼絾鏄彈鎬ц兘褰卞搷锛屽缓璁竴娆℃煡璇笉瓒呰繃10000涓�
+     * @return 鏂囨。鐨勭被鍨嬫樉绀哄璞�
+     * @throws VciBaseException 鏌ヨ鍑虹幇寮傚父鏃朵細鎶涘嚭
+     */
+    @Override
+    public Collection<VciFileDocClassifyVO> listVciFileDocClassifyByOids(Collection<String> oidCollections) throws VciBaseException {
+        VciBaseUtil.alertCollectionNotNull("鏁版嵁瀵硅薄涓婚敭闆嗗悎",oidCollections);
+        List<VciFileDocClassifyDO> vciFileDocClassifyDOList = listVciFileDocClassifyDOByOidCollections(oidCollections);
+        return vciFileDocClassifyDO2VOs(vciFileDocClassifyDOList);
+    }
+
+    /**
+    * 浣跨敤涓婚敭闆嗗悎鏌ヨ鏁版嵁瀵硅薄
+    * @param oidCollections 涓婚敭鐨勯泦鍚�
+    * @return 鏁版嵁瀵硅薄鍒楄〃
+    */
+    private List<VciFileDocClassifyDO> listVciFileDocClassifyDOByOidCollections(Collection<String> oidCollections){
+        List<VciFileDocClassifyDO> vciFileDocClassifyDOList = new ArrayList<>();
+        if(!CollectionUtils.isEmpty(oidCollections)){
+            Collection<Collection<String>> oidCollectionsList = VciBaseUtil.switchCollectionForOracleIn(oidCollections);
+            oidCollectionsList.stream().forEach(oids ->{
+                List<VciFileDocClassifyDO> tempDOList =  vciFileDocClassifyMapper.selectByPrimaryKeyCollection(oids);
+                if(!CollectionUtils.isEmpty(tempDOList)){
+                    vciFileDocClassifyDOList.addAll(tempDOList);
+                }
+            });
+        }
+        return  vciFileDocClassifyDOList;
+    }
+
+    /**
+     * 鍙傜収鏂囨。鐨勭被鍨嬪垪琛�
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉鍜屾帓搴�
+     * @return 鏂囨。鐨勭被鍨嬫樉绀哄璞″垪琛紝鐢熸晥鐨勫唴瀹�
+     * @throws VciBaseException 鏌ヨ鏉′欢鍜屽垎椤靛嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public DataGrid<VciFileDocClassifyVO> refDataGridVciFileDocClassify(Map<String, String> conditionMap, PageHelper pageHelper) throws VciBaseException {
+        if(conditionMap == null){
+            conditionMap = new HashMap<>();
+        }
+        return gridVciFileDocClassify(conditionMap,pageHelper);
+    }
+
+    /**
+     * 鏍¢獙缂栧彿鏄惁瀛樺湪
+     *
+     * @param idCollections 缂栧彿鐨勯泦鍚�
+     * @return success涓簍rue琛ㄧず瀛樺湪,鍚﹀垯鍦╠ata涓幏鍙栦笉瀛樺湪鐨勫唴瀹�
+     */
+    @Override
+    public BaseResult checkClassifyIdsExist(Collection<String> idCollections) {
+        VciBaseUtil.alertCollectionNotNull("鏂囨。绫诲瀷缂栧彿",idCollections);
+        Collection<Collection<String>> idCollectionss = VciBaseUtil.switchCollectionForOracleIn(idCollections);
+        Set<String> existIdsSet = new HashSet<>();
+        idCollectionss.stream().forEach(ids-> {
+            List<VciFileDocClassifyDO> fileDocClassifyDOS = vciFileDocClassifyMapper.selectByIdCollection(ids);
+            if(!CollectionUtils.isEmpty(fileDocClassifyDOS)){
+                existIdsSet.addAll(fileDocClassifyDOS.stream().map(VciFileDocClassifyDO::getId).collect(Collectors.toSet()));
+            }
+        });
+        if(existIdsSet.size() ==0){
+            BaseResult baseResult = BaseResult.fail(DATA_ID_NOT_EXIST);
+            baseResult.setData(idCollections);
+            return baseResult;
+        }
+        Set<String> unExistIdSet = new HashSet<>();
+        idCollections.stream().forEach(id ->{
+            if(!existIdsSet.contains(id)){
+                unExistIdSet.add(id);
+            }
+        });
+        if(!CollectionUtils.isEmpty(unExistIdSet)){
+            BaseResult baseResult = BaseResult.fail(DATA_ID_NOT_EXIST);
+            baseResult.setData(unExistIdSet);
+            return baseResult;
+        }
+        return BaseResult.success();
+    }
+
+    /**
+     * 鎵归噺娣诲姞鍒嗙被
+     *
+     * @param fileDocClassifyDTOList 鍒嗙被鐨勬暟鎹紶杈撳璞�
+     * @return success涓簍rue琛ㄧず鎵ц鎴愬姛
+     */
+    @Override
+    public BaseResult batchAddSave(VciFileDocClassifyDTOList fileDocClassifyDTOList) {
+        VciBaseUtil.alertNotNull(fileDocClassifyDTOList,"鏂囦欢绫诲瀷鐨勬暟鎹紶杈撳璞�");
+        List<VciFileDocClassifyDO> doList = new ArrayList<>();
+        List<VciFileDocClassifyDTO> dtoList = fileDocClassifyDTOList.getDocClassifyDTOList();
+        VciBaseUtil.alertCollectionNotNull("鏂囦欢绫诲瀷鐨勬暟鎹紶杈撳璞�",dtoList);
+        //寰幆澶勭悊
+        dtoList.stream().forEach(dto->{
+            VciFileDocClassifyDO classifyDO = new VciFileDocClassifyDO();
+            BeanUtil.convert(dto,classifyDO);
+            VciBaseUtil.alertNotNull(classifyDO.getId(),"鏂囦欢绫诲瀷缂栧彿",classifyDO.getName(),"鏂囦欢绫诲瀷鍚嶇О");
+            doList.add(classifyDO);
+        });
+        revisionModelUtil.wrapperForBatchAdd(doList);
+        doList.stream().forEach(classifyDO->{
+            vciFileDocClassifyMapper.insert(classifyDO);
+        });
+        return BaseResult.success(ADD_SUCCESS);
+    }
+
+    /**
+     * 浣跨敤缂栧彿鏌ヨ瀵硅薄
+     * @param id 缂栧彿
+     * @return 鏂囨。绫诲瀷瀵硅薄
+     * @throws VciBaseException 鍙傛暟涓虹┖鍜屼笉瀛樺湪鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    private VciFileDocClassifyDO selectById(String id) throws VciBaseException {
+        VciBaseUtil.alertNotNull(id,"鏂囨。绫诲瀷缂栧彿");
+        VciFileDocClassifyDO classifyDO = vciFileDocClassifyMapper.selectById(id.trim());
+        if(classifyDO == null || StringUtils.isBlank(classifyDO.getOid())){
+            throw new VciBaseException(DATA_ID_NOT_EXIST,new String[]{id});
+        }
+        return classifyDO;
+    }
+
+    /**
+     * 浣跨敤缂栧彿鑾峰彇瀵硅薄
+     *
+     * @param id 缂栧彿
+     * @return 鏄剧ず瀵硅薄
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮墽琛屽嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public VciFileDocClassifyVO getObjectById(String id) throws VciBaseException {
+        return vciFileDocClassifyDO2VO(selectById(id));
+    }
+
+    /**
+     * 浣跨敤缂栧彿鎵归噺鑾峰彇绫诲瀷瀵硅薄
+     *
+     * @param idCollection 缂栧彿闆嗗悎
+     * @return 鏄剧ず瀵硅薄
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮墽琛屽嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public List<VciFileDocClassifyVO> listVciFileDocClassifyByIds(Collection<String> idCollection) throws VciBaseException {
+        List<VciFileDocClassifyDO> classifyDOList = new ArrayList<>();
+        VciBaseUtil.alertCollectionNotNull("缂栧彿闆嗗悎",idCollection);
+        Collection<Collection<String>> idCollections = VciBaseUtil.switchCollectionForOracleIn(idCollection);
+        idCollections.stream().forEach(ids->{
+            List<VciFileDocClassifyDO> classifyDOs = vciFileDocClassifyMapper.selectByIdCollection(ids);
+            if(!CollectionUtils.isEmpty(classifyDOs)){
+                classifyDOList.addAll(classifyDOs);
+            }
+        });
+        return vciFileDocClassifyDO2VOs(classifyDOList);
+    }
+
+    /**
+     * 鏂囦欢绫诲瀷鐨勪笅鎷夎彍鍗�
+     *
+     * @return 涓嬫媺鑿滃崟鐨勫��
+     */
+    @Override
+    public List<KeyValue> comboFileDocClassify() {
+        VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(new HashMap<>(),VciFileDocClassifyDO.class);
+        queryWrapper.neq("creator","sysAdmin");
+        List<VciFileDocClassifyDO> doList = vciFileDocClassifyMapper.selectByWrapper(queryWrapper);
+        List<KeyValue> keyValues = new ArrayList<>();
+        if(!CollectionUtils.isEmpty(doList)){
+            doList.stream().forEach(doc->{
+                KeyValue keyValue = new KeyValue();
+                keyValue.setKey(doc.getId());
+                keyValue.setValue(doc.getName());
+                keyValues.add(keyValue);
+            });
+        }
+        return keyValues;
+    }
+}
+
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/VciFileDownloadServiceImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/VciFileDownloadServiceImpl.java
new file mode 100644
index 0000000..ce5b3fe
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/VciFileDownloadServiceImpl.java
@@ -0,0 +1,543 @@
+package com.vci.web.service.impl;
+
+import com.vci.corba.common.VCIError;
+import com.vci.corba.volumn.method.VolumnManagement;
+import com.vci.file.clientutil.VciFileServerClientUtil;
+import com.vci.file.enumpck.VciFileTransProtocolEnum;
+import com.vci.file.pagemodel.VciFileObjectVO;
+import com.vci.file.pagemodel.VciFileVolumeVO;
+import com.vci.file.util.VciZipUtil;
+import com.vci.starter.web.annotation.bus.VciChangeDocument;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.BaseResult;
+import com.vci.starter.web.util.LocalFileUtil;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.starter.web.wrapper.VciQueryWrapperForDO;
+import com.vci.web.dao.VciFileObjectDaoI;
+import com.vci.web.model.VciFileObjectDO;
+import com.vci.web.properties.WebProperties;
+import com.vci.web.service.VciFileDownloadServiceI;
+import com.vci.web.service.VciFileObjectServiceI;
+import com.vci.web.service.VciFileVolumeServiceI;
+import com.vci.web.util.PlatformClientUtil;
+import net.lingala.zip4j.core.ZipFile;
+import net.lingala.zip4j.io.ZipOutputStream;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.io.*;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+import static com.vci.file.constant.VciFileLangCodeConstant.*;
+import static com.vci.frameworkcore.constant.FrameWorkLangCodeConstant.*;
+
+/**
+ * 鏂囦欢鐨勪笅杞芥湇鍔�
+ * @author weidy
+ * @date 2021-3-11
+ */
+@Service
+@VciChangeDocument(btmType = "fileDownload")
+public class VciFileDownloadServiceImpl implements VciFileDownloadServiceI {
+
+    /**
+     * 鏂囦欢鐨勫璞℃湇鍔�
+     */
+    @Autowired
+    private VciFileObjectServiceI vciFileObjectServiceI;
+
+    /**
+     * 鏂囦欢鐨勫嵎鏈嶅姟
+     */
+    @Autowired
+    private VciFileVolumeServiceI vciFileVolumeServiceI;
+
+    /**
+     * 鏂囦欢瀵硅薄鐨勬搷浣�
+     */
+    @Autowired
+    private VciFileObjectDaoI vciFileObjectMapper;
+
+    /**
+     * zip鎿嶄綔绫�
+     */
+    @Autowired
+    private VciZipUtil zipUtil;
+
+    /**
+     * 骞冲彴鐨勫鎴风
+     */
+    @Autowired
+    private PlatformClientUtil platformClientUtil;
+
+    /**
+     * 閰嶇疆瀵硅薄
+     */
+    @Autowired
+    private WebProperties webProperties;
+
+    /**
+     * 鏍规嵁涓婚敭涓嬭浇鏂囦欢锛屼細涓嬭浇鍒伴粯璁ょ殑涓存椂鏂囦欢澶逛笅
+     * @param fileOids 鏂囦欢鐨勪富閿�
+     * @return 鏂囦欢鍦ㄦ湰鍦扮殑鍏ㄨ矾寰�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮枃浠跺嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public String downloadFileByOid(String fileOids) throws VciBaseException {
+        VciBaseUtil.alertNotNull(fileOids,"鏂囦欢涓婚敭");
+        List<String> fileOidList =  VciBaseUtil.str2List(fileOids);
+        String tempFilePath = null;
+        if(fileOidList.size() == 1){
+            String fileOid = fileOidList.get(0);
+
+            VciFileObjectVO vciFileObjectVO = vciFileObjectServiceI.getObjectByOid(fileOid);
+
+            VciFileVolumeVO vciFileVolumeVO = null;
+            if(StringUtils.isNotBlank(vciFileObjectVO.getPkFileVolume())){
+                vciFileVolumeVO = vciFileVolumeServiceI.getObjectByOid(vciFileObjectVO.getPkFileVolume());
+            }else{
+                vciFileVolumeVO =  vciFileVolumeServiceI.getObjectById(vciFileObjectVO.getFilePath().split(":")[0]);
+            }
+            tempFilePath = downloadFile(vciFileObjectVO,vciFileVolumeVO,LocalFileUtil.getDefaultTempFolder());
+            //鍏朵粬鐨勫崗璁殑鍚庣画琛ュ厖
+        }
+        if(fileOidList.size()>1){
+            tempFilePath = downloadFileByOids(fileOidList);
+        }
+
+        return tempFilePath;
+    }
+
+    /**
+     * 鎵ц涓嬭浇
+     * @param vciFileObjectVO 鏂囦欢鐨勫璞�
+     * @param vciFileVolumeVO 鍗风殑瀵硅薄
+     * @return 涓嬭浇鍚庣殑鍦板潃
+     */
+    private String downloadFile(VciFileObjectVO vciFileObjectVO,VciFileVolumeVO vciFileVolumeVO,String tempFolder){
+        String fileName = vciFileObjectVO.getName()+"."+vciFileObjectVO.getFileExtension();
+        String tempDir = StringUtils.isNotBlank(tempFolder)?tempFolder:LocalFileUtil.getDefaultTempFolder();
+        String tempFilePath = tempDir+File.separator+vciFileObjectVO.getName()+"."+vciFileObjectVO.getFileExtension();
+        //鏈湴鍗忚
+        File tempFile = new File(tempFilePath);
+        File tempDirFile = tempFile.getParentFile();
+        if(!tempDirFile.exists()){
+            tempDirFile.mkdirs();
+        }
+        if(!tempFile.exists()){
+            try {
+                tempFile.createNewFile();
+            } catch (IOException e) {
+                throw new VciBaseException("鍦ㄤ复鏃舵枃浠跺す涓嬪垱寤轰复鏃舵枃浠跺嚭閿�",new String[0],e);
+            }
+        }
+        if(vciFileVolumeVO.getTransProtocol().equals(VciFileTransProtocolEnum.LOCAL.getValue())){
+            try{
+                String filePath = vciFileVolumeVO.getVolumePath()+File.separator+vciFileObjectVO.getFilePath();
+                File file = new File(filePath);
+                if(!file.exists()){
+                    throw new VciBaseException(FILE_NOT_FOUND,new String[]{""});
+                }
+                LocalFileUtil.copyFile(file,tempFile);
+            }catch (Exception e){
+                throw new VciBaseException(DOWNLOAD_FAIL, new String[]{e.getMessage()});
+            }
+        }else if(VciFileTransProtocolEnum.CORBA.getValue().equalsIgnoreCase(vciFileVolumeVO.getTransProtocol())){
+            String volumeName = vciFileVolumeVO.getName();
+            VolumnManagement volumnCorbaService = null;
+            try {
+                volumnCorbaService = platformClientUtil.getVolumeService(vciFileVolumeVO.getServiceUrl(),volumeName).getVolumnService();
+            } catch (VCIError vciError) {
+                throw new VciBaseException("娌℃湁鑾峰彇鍒皗}鐨勫嵎鏈嶅姟",new String[]{volumeName},vciError);
+            }
+            //骞冲彴2020鐗堟湰姝ゅ淇敼浜嗭紝鍗风殑鏂囦欢澶规槸鐢卞嵎鏈嶅姟鏉ユ帶鍒�
+            String serverPath =  vciFileObjectVO.getFilePath();
+            long fileSize = 0;
+            try {
+                fileSize = volumnCorbaService.getFileSize(serverPath);
+            } catch (VCIError vciError) {
+                throw new VciBaseException("娌℃湁鍦ㄥ嵎鏈嶅姟{}閲岃幏鍙栧埌鏂囦欢{}鐨勫ぇ灏�",new String[]{volumeName,fileName},vciError);
+            }
+            try {
+                FileOutputStream destFileOs = new FileOutputStream(tempFilePath);
+                long blockSize = webProperties.getBlockLength()*1024;
+                if(blockSize> Integer.MAX_VALUE){
+                    blockSize = Integer.MAX_VALUE;
+                }
+                long temp = 0;
+                while (fileSize - temp > blockSize) {
+                    destFileOs.write(volumnCorbaService.sendFile(serverPath, temp));
+                    temp += blockSize;
+                }
+                destFileOs.write(volumnCorbaService.sendFile(serverPath, temp));
+                destFileOs.flush();
+                destFileOs.close();
+            } catch (FileNotFoundException e) {
+                throw new VciBaseException("瑕佸啓鍏ョ殑鏂囦欢娌℃湁鎵惧埌",new String[]{tempFilePath},e);
+            } catch (IOException e) {
+                throw new VciBaseException("鍐欏叆鏂囦欢鍑洪敊" + e.getMessage(),new String[]{tempFilePath},e);
+            } catch (VCIError e){
+//                throw new VciBaseException("鍗锋湇鍔′紶杈撴枃浠舵椂鍑虹幇浜嗛敊璇�" + e.error_code,e.error_message,e);
+            }catch (Exception e){
+                throw new VciBaseException("鍗锋湇鍔′紶杈撴枃浠舵椂鍑虹幇浜嗛敊璇�" + e.getMessage(),new String[0],e);
+            }
+        }
+        return tempFilePath;
+    }
+
+    /**
+     * 鏍规嵁涓婚敭鎵归噺涓嬭浇鏂囦欢锛屼細涓嬭浇鍒伴粯璁ょ殑涓存椂鏂囦欢涓�
+     * @param fileOids 鏂囦欢鐨勪富閿泦鍚�
+     * @return 鏂囦欢鎵�鍦ㄦ湰鍦扮殑鍘嬬缉鍖呯殑鍏ㄨ矾寰�
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呮枃浠跺嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    public String downloadFileByOids(Collection<String> fileOids) throws VciBaseException {
+        List<VciFileObjectDO> vciFileObjectDOS = vciFileObjectMapper.selectByPrimaryKeyCollection(fileOids);
+
+        String localFolder = LocalFileUtil.getDefaultTempFolder();
+        String zipFileName = vciFileObjectDOS.iterator().next().getId()+"绛夊鏂囦欢.zip";
+
+        String zipFile =localFolder + File.separator+zipFileName;
+
+        File[] tempFiles = new File[vciFileObjectDOS.size()];
+        int i = 0;
+
+        for(VciFileObjectDO vciFileObjectDO : vciFileObjectDOS){
+            VciFileVolumeVO vciFileVolumeVO = null;
+            if(StringUtils.isBlank(vciFileObjectDO.getPkFileVolume()) && StringUtils.isNotBlank(vciFileObjectDO.getFilePath())){
+                vciFileVolumeVO = vciFileVolumeServiceI.getObjectById(vciFileObjectDO.getFilePath().split(":")[0]);
+            }else {
+                vciFileVolumeVO = vciFileVolumeServiceI.getObjectByOid(vciFileObjectDO.getPkFileVolume());
+            }
+            String tempFilePath = downloadFile(vciFileObjectServiceI.vciFileObjectDO2VO(vciFileObjectDO),vciFileVolumeVO,localFolder);
+            tempFiles[i] = new File(tempFilePath);
+            i++;
+        }
+
+        zipUtil.addFileToZip(tempFiles, zipFile);
+
+        //鏂囦欢娣诲姞鍒板帇缂╁寘鍚庯紝灏嗕复鏃舵枃浠跺垹闄ゃ��
+        for(File file : tempFiles){
+            file.delete();
+            file.getParentFile().delete();
+        }
+
+        return zipFile;
+    }
+
+    @Override
+    public String downloadFileByOid(String clientPath, String fileOid) throws VciBaseException {
+        return null;
+    }
+
+    @Override
+    public Map<String, String> batchDownloadFileByOids(Collection<String> fileOidCollection) throws VciBaseException {
+        return null;
+    }
+
+    @Override
+    public Map<String, String> batchDownloadFileByOids(String clientPath, Collection<String> fileOidCollection) throws VciBaseException {
+        return null;
+    }
+
+    @Override
+    public Map<String, String> batchDownloadFileByOids(String clientPath, Collection<String> fileOidCollection, boolean sameFileUseOidFolder) throws VciBaseException {
+        return null;
+    }
+
+    @Override
+    public String downloadFileByFileObject(VciFileObjectVO fileObjectVO) throws VciBaseException {
+        return null;
+    }
+
+    @Override
+    public String downloadFileByFileObject(String clientPath, VciFileObjectVO fileObjectVO) throws VciBaseException {
+        return null;
+    }
+
+    @Override
+    public Map<String, String> batchDownloadFileByFileObject(Collection<VciFileObjectVO> fileObjectVOCollection) throws VciBaseException {
+        return null;
+    }
+
+    @Override
+    public Map<String, String> batchDownloadFileByFileObject(String clientPath, Collection<VciFileObjectVO> fileObjectVOCollection) throws VciBaseException {
+        return null;
+    }
+
+    @Override
+    public void downloadZipFileByOids(String zipFileName, String fileOid) throws VciBaseException {
+
+    }
+
+    @Override
+    public void downloadZipFileByOids(ZipFile zipFile, String fileOid) throws VciBaseException {
+
+    }
+
+    @Override
+    public void downloadZipStreamByOids(ZipOutputStream zipOutputStream, String fileOid) throws VciBaseException {
+
+    }
+
+    @Override
+    public void downloadZipFileByOids(String zipFileName, Collection<String> fileOidCollection) throws VciBaseException {
+
+    }
+
+    @Override
+    public void downloadZipFileByOids(ZipFile zipFile, Collection<String> fileOidCollection) throws VciBaseException {
+
+    }
+
+    @Override
+    public void downloadZipStreamByOids(ZipOutputStream zipOutputStream, Collection<String> fileOidCollection) throws VciBaseException {
+
+    }
+
+    @Override
+    public void downloadZipFileByOids(ZipFile zipFile, Collection<String> fileOidCollection, boolean sameFileUseOidFolder) throws VciBaseException {
+
+    }
+
+    @Override
+    public void downloadZipStreamByOids(ZipOutputStream zipOutputStream, Collection<String> fileOidCollection, boolean sameFileUseOidFolder) throws VciBaseException {
+
+    }
+
+    /**
+     * 鍒嗙墖涓嬭浇
+     * @param fileOid 鏂囦欢涓婚敭
+     * @param offSet 鍋忕Щ閲�
+     * @return 鏁版嵁
+     * @throws VciBaseException 涓嬭浇鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public BaseResult<byte[]> sectionDownloadByFileOid(String fileOid, long offSet) throws VciBaseException {
+        BaseResult<byte[]> baseResult = new BaseResult();
+        VciFileObjectVO vciFileObjectVO = vciFileObjectServiceI.getObjectByOid(fileOid);
+
+        VciFileVolumeVO vciFileVolumeVO = null;
+        if(StringUtils.isBlank(vciFileObjectVO.getPkFileVolume()) && StringUtils.isNotBlank(vciFileObjectVO.getFilePath())){
+            vciFileVolumeVO = vciFileVolumeServiceI.getObjectById(vciFileObjectVO.getFilePath().split(":")[0]);
+        }else {
+            vciFileVolumeVO = vciFileVolumeServiceI.getObjectByOid(vciFileObjectVO.getPkFileVolume());
+        }
+        String fileName = vciFileObjectVO.getName()+"."+vciFileObjectVO.getFileExtension();
+        //鏈湴鍗忚
+        if(vciFileVolumeVO.getTransProtocol().equals(VciFileTransProtocolEnum.LOCAL.getValue())){
+            String sourceFilePath = vciFileVolumeVO.getVolumePath()+File.separator+vciFileObjectVO.getFilePath();
+            File sourceFile = new File(sourceFilePath);
+            if(!sourceFile.exists()){
+                throw new VciBaseException(FILE_NOT_FOUND,new String[]{""});
+            }
+
+            long fileSize = sourceFile.length();
+            RandomAccessFile destfile = null;
+            try{
+                byte[] buffer ;
+                if(offSet<(fileSize-VciFileServerClientUtil.BLOCKSIZE)){
+                    buffer = new byte[VciFileServerClientUtil.BLOCKSIZE];
+                }else{
+                    buffer = new byte[(int) (fileSize-offSet)];
+                }
+                destfile = new RandomAccessFile(sourceFile, "rw");
+                destfile.seek(offSet);
+                destfile.read(buffer);
+
+                baseResult.setSuccess(true);
+                baseResult.setMsg(DOWNLOAD_SUCCESS);
+                baseResult.setObj(buffer);
+            } catch (Exception e){
+                throw new VciBaseException(FILE_READ_FAIL,new String[]{vciFileObjectVO.getName()});
+            }finally {
+                if(destfile != null){
+                    try {
+                        destfile.close();
+                    } catch (IOException e) {
+                        e.printStackTrace();
+                    }
+                }
+            }
+        }else if(VciFileTransProtocolEnum.CORBA.getValue().equalsIgnoreCase(vciFileVolumeVO.getTransProtocol())){
+            String volumeName = vciFileVolumeVO.getName();
+            VolumnManagement volumnCorbaService = null;
+            try {
+                volumnCorbaService = platformClientUtil.getVolumeService(vciFileVolumeVO.getServiceUrl(),volumeName).getVolumnService();
+            } catch (VCIError vciError) {
+                throw new VciBaseException("娌℃湁鑾峰彇鍒皗}鐨勫嵎鏈嶅姟",new String[]{volumeName},vciError);
+            }
+            String serverPath = vciFileVolumeVO.getVolumePath() + File.separator + vciFileObjectVO.getFilePath().replace(volumeName+":","");
+            long fileSize = 0;
+            try {
+                fileSize = volumnCorbaService.getFileSize(serverPath);
+            } catch (VCIError vciError) {
+                throw new VciBaseException("娌℃湁鍦ㄥ嵎鏈嶅姟{}閲岃幏鍙栧埌鏂囦欢{}鐨勫ぇ灏�",new String[]{volumeName,fileName},vciError);
+            }
+            try {
+                baseResult.setSuccess(true);
+                baseResult.setMsg(DOWNLOAD_SUCCESS);
+                baseResult.setObj( volumnCorbaService.sendFile(serverPath, fileSize-offSet));
+            } catch (Exception e){
+                throw new VciBaseException(FILE_READ_FAIL,new String[]{vciFileObjectVO.getName()});
+            }
+        }
+        //鍏朵粬鍗忚鐨勪笅杞斤紝鍚庣画瀹屽杽
+
+        return baseResult;
+    }
+
+    /**
+     * 鍒犻櫎鏂囦欢
+     * @param fileOidCollection 鏂囦欢涓婚敭闆嗗悎
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 鍒犻櫎鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public BaseResult deleteFile(Collection<String> fileOidCollection) throws VciBaseException {
+        List<VciFileObjectDO> fileObjectDOList = vciFileObjectMapper.selectByPrimaryKeyCollection(fileOidCollection);
+        for(VciFileObjectDO fileObjectDO : fileObjectDOList){
+            VciFileVolumeVO fileVolumeVO = vciFileVolumeServiceI.getObjectByOid(fileObjectDO.getPkFileVolume());
+            //鏈湴鍗忚
+            if(fileVolumeVO.getTransProtocol().equals(VciFileTransProtocolEnum.LOCAL.getValue())){
+                String volumePath = fileVolumeVO.getVolumePath();
+
+                String filePath = volumePath+File.separator+fileObjectDO.getFilePath();
+
+                File file = new File(filePath);
+                if(file.exists()){
+                    file.delete();
+                }
+
+                File dirFile = file.getParentFile();
+                if(dirFile.listFiles().length>0){
+                    //璇存槑姝ょ洰褰曚笅杩樻湁鍏朵粬鏂囦欢锛屾鐩綍涓嶈兘鍒犻櫎
+                }else{
+                    dirFile.delete();
+                }
+
+                vciFileObjectMapper.deleteByPrimaryKey(fileObjectDO.getOid());
+            }else if(VciFileTransProtocolEnum.CORBA.getValue().equalsIgnoreCase(fileVolumeVO.getTransProtocol())){
+                //鏆傛椂涓嶅垹闄ゆ枃浠�
+                vciFileObjectMapper.deleteByPrimaryKey(fileObjectDO.getOid());
+            }
+
+            //鍏朵粬鍗忚锛屽悗缁畬鍠�
+
+        }
+
+        return BaseResult.success(DELETE_SUCCESS);
+    }
+
+    /**
+     * 浣跨敤鍗锋湇鍔′笂鐨勬枃浠惰矾寰勬潵涓嬭浇
+     *
+     * @param filePath   鏂囦欢鐨勮矾寰�
+     * @return 涓嬭浇鍚庣殑鍦板潃
+     * @throws VciBaseException 涓嬭浇鍑洪敊浼氭姏鍑哄紓甯�
+     */
+    @Override
+    public String downloadFileByPath( String filePath) throws VciBaseException {
+        VciBaseUtil.alertNotNull(filePath,"鏂囦欢璺緞");
+        String volumeId = "";
+        if (filePath.contains(":")) {
+            volumeId = filePath.split(":")[0];
+            filePath = filePath.split(":")[1];
+        } else {
+            throw new VciBaseException("鏂囦欢鐨勮矾寰勬牸寮忎笉姝g‘锛岄渶瑕亁xx:yyyy");
+        }
+        VciFileVolumeVO vciFileVolumeVO = vciFileVolumeServiceI.getObjectById(volumeId);
+
+        if(filePath.contains(".")){
+            //鐩存帴浼犻�掔殑瀹屾暣鐨勮矾寰�
+            String tempFilePath = LocalFileUtil.getDefaultTempFolder() + File.separator ;
+            String fileName = "";
+            if(filePath.contains(File.separator)){
+                fileName = filePath.substring(filePath.lastIndexOf(File.separator)+1);
+            }else{
+                if(filePath.contains("/")){
+                    fileName= filePath.substring(filePath.lastIndexOf("/")+1);
+                }else{
+                    fileName = filePath.replace(volumeId+":","");
+                }
+            }
+            tempFilePath = tempFilePath+fileName;
+            File tempFile = new File(tempFilePath);
+            File tempDirFile = tempFile.getParentFile();
+            if(!tempDirFile.exists()){
+                tempDirFile.mkdirs();
+            }
+            if(!tempFile.exists()){
+                try {
+                    tempFile.createNewFile();
+                } catch (IOException e) {
+                    throw new VciBaseException("鍦ㄤ复鏃舵枃浠跺す涓垱寤轰复鏃舵枃浠跺嚭閿�",new String[0],e);
+                }
+            }
+            if(vciFileVolumeVO.getTransProtocol().equals(VciFileTransProtocolEnum.LOCAL.getValue())){
+                try{
+                    File file = new File(filePath.replace(volumeId + ":",vciFileVolumeVO.getVolumePath()));
+                    if(!file.exists()){
+                        throw new VciBaseException(FILE_NOT_FOUND,new String[]{""});
+                    }
+
+                    LocalFileUtil.copyFile(file,tempFile);
+                }catch (Exception e){
+                    throw new VciBaseException(DOWNLOAD_FAIL, new String[]{e.getMessage()});
+                }
+            }else if(VciFileTransProtocolEnum.CORBA.getValue().equalsIgnoreCase(vciFileVolumeVO.getTransProtocol())){
+                String volumeName = vciFileVolumeVO.getName();
+                VolumnManagement volumnCorbaService = null;
+                try {
+                    volumnCorbaService = platformClientUtil.getVolumeService(vciFileVolumeVO.getServiceUrl(),volumeName).getVolumnService();
+                } catch (VCIError vciError) {
+                    throw new VciBaseException("娌℃湁鑾峰彇鍒皗}鐨勫嵎鏈嶅姟",new String[]{volumeName},vciError);
+                }
+                //骞冲彴2020鐗堟湰姝ゅ淇敼浜嗭紝鍗风殑鏂囦欢澶规槸鐢卞嵎鏈嶅姟鏉ユ帶鍒�
+                String serverPath =  volumeId+":" + filePath;
+                long fileSize = 0;
+                try {
+                    fileSize = volumnCorbaService.getFileSize(serverPath);
+                } catch (VCIError vciError) {
+                    throw new VciBaseException("娌℃湁鍦ㄥ嵎鏈嶅姟{}閲岃幏鍙栧埌鏂囦欢{}鐨勫ぇ灏�",new String[]{volumeName,fileName},vciError);
+                }
+                try {
+                    FileOutputStream destFileOs = new FileOutputStream(tempFilePath);
+                    long blockSize = webProperties.getBlockLength()*1024;
+                    if(blockSize> Integer.MAX_VALUE){
+                        blockSize = Integer.MAX_VALUE;
+                    }
+                    long temp = 0;
+                    while (fileSize - temp > blockSize) {
+                        destFileOs.write(volumnCorbaService.sendFile(serverPath, temp));
+                        temp += blockSize;
+                    }
+                    destFileOs.write(volumnCorbaService.sendFile(serverPath, temp));
+                    destFileOs.flush();
+                    destFileOs.close();
+                } catch (FileNotFoundException e) {
+                    throw new VciBaseException("瑕佸啓鍏ョ殑鏂囦欢娌℃湁鎵惧埌",new String[]{tempFilePath},e);
+                } catch (IOException e) {
+                    throw new VciBaseException("鍐欏叆鏂囦欢鍑洪敊" + e.getMessage(),new String[]{tempFilePath},e);
+                } catch (VCIError e){
+//                    throw new VciBaseException("鍗锋湇鍔′紶杈撴枃浠舵椂鍑虹幇浜嗛敊璇�" + e.error_code,e.error_message,e);
+                }catch (Exception e){
+                    throw new VciBaseException("鍗锋湇鍔′紶杈撴枃浠舵椂鍑虹幇浜嗛敊璇�" + e.getMessage(),new String[0],e);
+                }
+            }
+            return tempFilePath;
+        }else {
+            VciQueryWrapperForDO queryWrapperForDO = new VciQueryWrapperForDO(null, VciFileObjectDO.class);
+            queryWrapperForDO.eq("filepath", volumeId + ":" + filePath);
+            List<VciFileObjectDO> fileObjectDOS = vciFileObjectMapper.selectByWrapper(queryWrapperForDO);
+            if (CollectionUtils.isEmpty(fileObjectDOS)) {
+                throw new VciBaseException("娌℃湁鎵惧埌杩欎釜璺緞涓嬬殑鏂囦欢淇℃伅");
+            }
+            return downloadFile(vciFileObjectServiceI.vciFileObjectDO2VO(fileObjectDOS.get(0)), vciFileVolumeVO,null);
+        }
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/VciFileObjectServiceImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/VciFileObjectServiceImpl.java
new file mode 100644
index 0000000..7e39e59
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/VciFileObjectServiceImpl.java
@@ -0,0 +1,539 @@
+package com.vci.web.service.impl;
+
+import com.vci.file.dto.VciFileObjectDTO;
+import com.vci.file.lcstatuspck.FileLCStatus;
+import com.vci.file.pagemodel.VciFileObjectVO;
+import com.vci.starter.revision.service.RevisionModelUtil;
+import com.vci.starter.web.annotation.bus.VciChangeDocument;
+import com.vci.starter.web.enumpck.VciChangeDocumentTypeEnum;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.BaseResult;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.starter.web.util.BeanUtil;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.starter.web.wrapper.VciQueryWrapperForDO;
+import com.vci.web.dao.VciFileObjectDaoI;
+import com.vci.web.model.VciFileObjectDO;
+import com.vci.web.service.VciFileObjectServiceI;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import org.springframework.util.CollectionUtils;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Collectors;
+
+import static com.vci.file.constant.VciFileLangCodeConstant.FILE_RELEASED;
+import static com.vci.frameworkcore.constant.FrameWorkLangCodeConstant.*;
+
+/**
+ * 鏂囦欢瀵硅薄鏈嶅姟
+ *
+ * @author weidy
+ * @date 2020-08-04
+ */
+@Service
+@VciChangeDocument(btmType = "fileObject")
+public class VciFileObjectServiceImpl implements VciFileObjectServiceI {
+
+    /**
+    * 鏃ュ織
+    */
+    private Logger logger = LoggerFactory.getLogger(getClass());
+
+    /**
+     * 鏂囦欢淇℃伅鍏变韩闆嗗悎
+     */
+    private volatile Map<String, VciFileObjectDO> threadFileObjectMap = new ConcurrentHashMap<String, VciFileObjectDO>();
+
+    /**
+    * 鏁版嵁鎿嶄綔灞�
+    */
+    @Resource
+    private VciFileObjectDaoI vciFileObjectMapper;
+
+    /**
+    * 鐗堟湰鍜屾暟鎹璞″伐鍏风被
+    */
+    @Autowired
+    private RevisionModelUtil revisionModelUtil;
+
+    /**
+     * 鏌ヨ鎵�鏈夌殑鏂囦欢瀵硅薄
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉鍜屾帓搴�
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 鏌ヨ鏉′欢鍜屽垎椤靛嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public DataGrid<VciFileObjectVO> gridVciFileObject(Map<String, String> conditionMap, PageHelper pageHelper) throws VciBaseException {
+        if (pageHelper == null) {
+            pageHelper = new PageHelper(-1);
+        }
+        VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(conditionMap,VciFileObjectDO.class,pageHelper);
+        List<VciFileObjectDO> doList = vciFileObjectMapper.selectByWrapper(queryWrapper);
+        DataGrid<VciFileObjectVO> dataGrid=new DataGrid<>();
+        if (!CollectionUtils.isEmpty(doList)) {
+            dataGrid.setData(vciFileObjectDO2VOs(doList));
+            queryWrapper.clearPage();
+            dataGrid.setTotal(vciFileObjectMapper.countByWrapper(queryWrapper));
+        }
+        return dataGrid;
+    }
+
+    /**
+     * 鎵归噺鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+     * @param vciFileObjectDOs 鏁版嵁瀵硅薄鍒楄〃
+     * @return 鏄剧ず瀵硅薄
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呬笉瀛樺湪鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public List<VciFileObjectVO> vciFileObjectDO2VOs(Collection<VciFileObjectDO>  vciFileObjectDOs) throws VciBaseException {
+        List<VciFileObjectVO> voList = new ArrayList<>();
+        if(!CollectionUtils.isEmpty(vciFileObjectDOs)){
+            vciFileObjectDOs.stream().forEach(s ->{
+                    VciFileObjectVO vo =  vciFileObjectDO2VO(s);
+                if(vo != null){
+                    voList.add(vo);
+                }
+            });
+        }
+        return voList;
+    }
+
+    /**
+     * 鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+     * @param  vciFileObjectDO 鏁版嵁瀵硅薄
+     * @return 鏄剧ず瀵硅薄
+     * @throws VciBaseException 鎷疯礉灞炴�у嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public  VciFileObjectVO vciFileObjectDO2VO(VciFileObjectDO vciFileObjectDO) throws VciBaseException {
+              VciFileObjectVO vo = new VciFileObjectVO();
+        if(vciFileObjectDO != null){
+          BeanUtil.convert(vciFileObjectDO,vo);
+          //杩橀渶瑕佸鐞嗘灇涓剧瓑鍏朵粬鐨勫唴瀹�
+        }
+        return vo;
+    }
+
+    /**
+     * 澧炲姞鏂囦欢瀵硅薄
+     * @param vciFileObjectDTO 鏂囦欢瀵硅薄鏁版嵁浼犺緭瀵硅薄
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屽敮涓�椤癸紝蹇呰緭椤逛笉閫氳繃鏃朵細鎶涘嚭寮傚父
+     */
+    @Override
+    @VciChangeDocument(changeType = VciChangeDocumentTypeEnum.ADD)
+    public VciFileObjectVO addSave(VciFileObjectDTO vciFileObjectDTO) throws VciBaseException {
+        VciBaseUtil.alertNotNull(vciFileObjectDTO,"闇�瑕佹坊鍔犵殑鏁版嵁瀵硅薄");
+        //灏咲TO杞崲涓篋O
+        VciFileObjectDO vciFileObjectDO = new VciFileObjectDO();
+        BeanUtil.convert(vciFileObjectDTO,vciFileObjectDO);
+
+        revisionModelUtil.wrapperForAdd(vciFileObjectDO);
+        int insert = vciFileObjectMapper.insert(vciFileObjectDO);
+        if(insert>0){
+            return vciFileObjectDO2VO(vciFileObjectDO);
+        }else{
+            throw new VciBaseException(ADD_FAIL);
+        }
+    }
+
+    /**
+     * 淇敼鏂囦欢瀵硅薄
+     * @param vciFileObjectDTO 鏂囦欢瀵硅薄鏁版嵁浼犺緭瀵硅薄
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屽敮涓�椤癸紝蹇呰緭椤逛笉閫氳繃鏃朵細鎶涘嚭寮傚父
+     */
+     @Override
+     @VciChangeDocument(changeType = VciChangeDocumentTypeEnum.EDIT)
+     public VciFileObjectVO editSave(VciFileObjectDTO vciFileObjectDTO) throws VciBaseException {
+         VciBaseUtil.alertNotNull(vciFileObjectDTO,"鏁版嵁瀵硅薄",vciFileObjectDTO.getOid(),"鏂囦欢瀵硅薄涓婚敭");
+         //灏咲TO杞崲涓篋O
+         VciFileObjectDO vciFileObjectDO = selectByOid(vciFileObjectDTO.getOid());
+         revisionModelUtil.copyFromDTO(vciFileObjectDTO,vciFileObjectDO);
+         revisionModelUtil.wrapperForEdit(vciFileObjectDO);
+         int update = vciFileObjectMapper.updateByPrimaryKey(vciFileObjectDO);
+         if(update>0){
+             return vciFileObjectDO2VO(vciFileObjectDO);
+         }else{
+             throw new VciBaseException(EDIT_FAIL);
+         }
+     }
+
+
+    /**
+     * 鏍¢獙鏄惁鍙互鍒犻櫎锛屽鏋滃瓨鍦ㄤ笅绾э紝骞朵笖涓嬬骇鏈夋暟鎹紩鐢ㄥ垯涓嶈兘鍒犻櫎
+     * @param vciFileObjectDTO 鏁版嵁浼犺緭瀵硅薄
+     * @param vciFileObjectDO 鏁版嵁搴撲腑鐨勬暟鎹璞�
+     * @return success涓簍rue涓哄彲浠ュ垹闄わ紝false琛ㄧず鏈夋暟鎹紩鐢紝obj涓簍rue琛ㄧず鏈変笅绾�
+     */
+    private BaseResult checkIsCanDeleteForDO(VciFileObjectDTO vciFileObjectDTO, VciFileObjectDO vciFileObjectDO) {
+        revisionModelUtil.checkTs(vciFileObjectDTO.getTs(),vciFileObjectDO.getTs());
+        if(!checkIsLinked(vciFileObjectDO.getOid())) {
+            return BaseResult.success();
+        }else{
+            return BaseResult.fail(DATA_LINKED_NOT_DELETE,new String[]{""});
+        }
+    }
+
+    /**
+    * 鏍¢獙鏄惁琚紩鐢�
+    * @param oid 涓婚敭
+    * @throws VciBaseException 琚紩鐢ㄧ殑鏃跺�欎細鎶涘嚭寮傚父
+    */
+    private boolean checkIsLinked(String oid) throws VciBaseException {
+        //TODO 娣诲姞闇�瑕佹牎楠屽紩鐢ㄧ殑鍦版柟
+        return false;
+    }
+
+    /**
+     * 鍒犻櫎鏂囦欢瀵硅薄
+     * @param vciFileObjectDTO 鏂囦欢瀵硅薄鏁版嵁浼犺緭瀵硅薄锛宱id鍜宼s闇�瑕佷紶杈�
+     * @return 鍒犻櫎缁撴灉鍙嶉锛氾細success锛氭垚鍔燂紝fail锛氬け璐�
+     * @throws VciBaseException 鍙傛暟涓虹┖锛岃寮曠敤鏃舵姏鍑哄紓甯�
+     */
+    @Override
+    @VciChangeDocument(changeType = VciChangeDocumentTypeEnum.DELETE)
+    public BaseResult deleteVciFileObject(VciFileObjectDTO vciFileObjectDTO) throws VciBaseException {
+        VciBaseUtil.alertNotNull(vciFileObjectDTO,"鏂囦欢瀵硅薄鏁版嵁瀵硅薄",vciFileObjectDTO.getOid(),"鏂囦欢瀵硅薄鐨勪富閿�");
+        VciFileObjectDO vciFileObjectDO = selectByOid(vciFileObjectDTO.getOid());
+        BaseResult baseResult = checkIsCanDeleteForDO(vciFileObjectDTO,vciFileObjectDO);
+        if(baseResult.isSuccess()) {
+                    }else{
+            return baseResult;
+        }
+        //鎵ц鍒犻櫎鎿嶄綔
+        return (vciFileObjectMapper.deleteByPrimaryKey(vciFileObjectDO.getOid()) > 0)? BaseResult.successMsg(DELETE_SUCCESS): BaseResult.fail(DELETE_FAIL);
+    }
+
+    /**
+    * 涓婚敭鑾峰彇鏂囦欢瀵硅薄
+    * @param oid 涓婚敭
+    * @return 鏂囦欢瀵硅薄鏄剧ず瀵硅薄
+    * @throws VciBaseException 鍙傛暟涓虹┖锛屾暟鎹笉瀛樺湪鏃朵細鎶涘嚭寮傚父
+    */
+    @Override
+    public  VciFileObjectVO getObjectByOid(String oid) throws VciBaseException {
+        return vciFileObjectDO2VO(selectByOid(oid));
+    }
+
+    /**
+    * 涓婚敭鏌ヨ鏁版嵁瀵硅薄
+    * @param oid 涓婚敭
+    * @return  鏁版嵁瀵硅薄
+    * @throws VciBaseException 鍙傛暟涓虹┖锛屽苟涓旀暟鎹笉瀛樺湪鐨勬椂鍊欎細鎶涘嚭寮傚父
+    */
+    private VciFileObjectDO selectByOid(String oid) throws VciBaseException {
+        VciBaseUtil.alertNotNull(oid,"涓婚敭");
+        VciFileObjectDO vciFileObjectDO = vciFileObjectMapper.selectByPrimaryKey(oid.trim());
+        if(vciFileObjectDO == null || StringUtils.isBlank(vciFileObjectDO.getOid())){
+            throw new VciBaseException(DATA_OID_NOT_EXIST);
+        }
+        return vciFileObjectDO;
+    }
+
+    /**
+     * 涓婚敭鎵归噺鑾峰彇鏂囦欢瀵硅薄
+     * @param oidCollections 涓婚敭闆嗗悎锛屼絾鏄彈鎬ц兘褰卞搷锛屽缓璁竴娆℃煡璇笉瓒呰繃10000涓�
+     * @return 鏂囦欢瀵硅薄鏄剧ず瀵硅薄
+     * @throws VciBaseException 鏌ヨ鍑虹幇寮傚父鏃朵細鎶涘嚭
+     */
+    @Override
+    public Collection<VciFileObjectVO> listVciFileObjectByOids(Collection<String> oidCollections) throws VciBaseException {
+        VciBaseUtil.alertCollectionNotNull("鏁版嵁瀵硅薄涓婚敭闆嗗悎",oidCollections);
+        List<VciFileObjectDO> vciFileObjectDOList = listVciFileObjectDOByOidCollections(oidCollections);
+        return vciFileObjectDO2VOs(vciFileObjectDOList);
+    }
+
+    /**
+    * 浣跨敤涓婚敭闆嗗悎鏌ヨ鏁版嵁瀵硅薄
+    * @param oidCollections 涓婚敭鐨勯泦鍚�
+    * @return 鏁版嵁瀵硅薄鍒楄〃
+    */
+    private List<VciFileObjectDO> listVciFileObjectDOByOidCollections(Collection<String> oidCollections){
+        List<VciFileObjectDO> vciFileObjectDOList = new ArrayList<>();
+        if(!CollectionUtils.isEmpty(oidCollections)){
+            Collection<Collection<String>> oidCollectionsList = VciBaseUtil.switchCollectionForOracleIn(oidCollections);
+            oidCollectionsList.stream().forEach(oids ->{
+                List<VciFileObjectDO> tempDOList =  vciFileObjectMapper.selectByPrimaryKeyCollection(oids);
+                if(!CollectionUtils.isEmpty(tempDOList)){
+                    vciFileObjectDOList.addAll(tempDOList);
+                }
+            });
+        }
+        return  vciFileObjectDOList;
+    }
+
+    /**
+     * 鍙傜収鏂囦欢瀵硅薄鍒楄〃
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉鍜屾帓搴�
+     * @return 鏂囦欢瀵硅薄鏄剧ず瀵硅薄鍒楄〃锛岀敓鏁堢殑鍐呭
+     * @throws VciBaseException 鏌ヨ鏉′欢鍜屽垎椤靛嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public DataGrid<VciFileObjectVO> refDataGridVciFileObject(Map<String, String> conditionMap, PageHelper pageHelper) throws VciBaseException {
+        if(conditionMap == null){
+            conditionMap = new HashMap<>();
+        }
+        return gridVciFileObject(conditionMap,pageHelper);
+    }
+
+    /**
+     * 鏂囦欢鐢熸晥
+     * @param fileOidCollection 鏂囦欢涓婚敭闆嗗悎
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 淇濆瓨鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public BaseResult releasedFile(Collection<String> fileOidCollection) throws VciBaseException {
+        List<VciFileObjectDO> updateList =listVciFileObjectDOByOidCollections(fileOidCollection);
+        if(!CollectionUtils.isEmpty(updateList)){
+            updateList.stream().forEach(fileDO->{
+                fileDO.setLcStatus(FileLCStatus.FILE_RELEASE.getValue());
+                vciFileObjectMapper.updateByPrimaryKey(fileDO);
+            });
+        }
+        BaseResult baseResult = new BaseResult();
+        baseResult.setSuccess(true);
+        baseResult.setData(vciFileObjectDO2VOs(updateList));
+        baseResult.setMsg(FILE_RELEASED);
+        return baseResult;
+    }
+
+    /**
+     * 鏂囦欢鐢熸晥
+     *
+     * @param btmName           涓氬姟绫诲瀷鐨勫悕瀛�
+     * @param businessOid       涓氬姟鏁版嵁鐨勪富閿�
+     * @param fileOidCollection 鏂囦欢鐨勪富閿�
+     * @return 鎵ц鐨勭粨鏋�
+     * @throws VciBaseException 鍙戝竷鐨勬椂鍊欏嚭鐜伴敊璇細鎶涘嚭寮傚父
+     */
+    @Override
+    public BaseResult releasedFile(String btmName, String businessOid, Collection<String> fileOidCollection) throws VciBaseException {
+        List<VciFileObjectDO> updateList =listVciFileObjectDOByOidCollections(fileOidCollection);
+        if(!CollectionUtils.isEmpty(updateList)){
+            updateList.stream().forEach(fileDO->{
+                fileDO.setLcStatus(FileLCStatus.FILE_RELEASE.getValue());
+                fileDO.setOwnBtmname(btmName);
+                fileDO.setOwnbizOid(businessOid);
+            });
+            vciFileObjectMapper.batchUpdateByPrimaryKey(updateList);
+        }
+        BaseResult baseResult = new BaseResult();
+        baseResult.setSuccess(true);
+        baseResult.setData(vciFileObjectDO2VOs(updateList));
+        baseResult.setMsg(FILE_RELEASED);
+        return baseResult;
+    }
+
+    /**
+     * 鏌ヨ涓氬姟绫诲瀷鐨勬枃浠�
+     *
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param pageHelper   鍒嗛〉鍜屾帓搴忓璞�
+     * @param ownbizOid    涓氬姟绫诲瀷鐨勪富閿�
+     * @param ownbizBtm    涓氬姟绫诲瀷鍚嶇О
+     * @return 鏂囦欢鏄剧ず瀵硅薄鐨勫垪琛�
+     * @throws VciBaseException 鍙傛暟涓虹┖鍜屾煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public DataGrid<VciFileObjectVO> gridFilesByOwnbiz(Map<String, String> conditionMap, PageHelper pageHelper, String ownbizOid, String ownbizBtm) throws VciBaseException {
+       return gridFilesByOwnbiz(conditionMap,pageHelper,ownbizOid,ownbizBtm,null);
+    }
+
+    /**
+     * 鏌ヨ涓氬姟绫诲瀷鐨勬枃浠�
+     *
+     * @param conditionMap  鏌ヨ鏉′欢
+     * @param pageHelper    鍒嗛〉鍜屾帓搴忓璞�
+     * @param ownbizOid     涓氬姟绫诲瀷鐨勪富閿�
+     * @param ownbizBtm     涓氬姟绫诲瀷鍚嶇О
+     * @param docClassifyId 鏂囨。鐨勭被鍨�
+     * @return 鏂囦欢鏄剧ず瀵硅薄鐨勫垪琛�
+     * @throws VciBaseException 鍙傛暟涓虹┖鍜屾煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public DataGrid<VciFileObjectVO> gridFilesByOwnbiz(Map<String, String> conditionMap, PageHelper pageHelper, String ownbizOid, String ownbizBtm, String docClassifyId) throws VciBaseException {
+        if(StringUtils.isBlank(ownbizBtm) || StringUtils.isBlank(ownbizOid)){
+            return new DataGrid<>("涓氬姟绫诲瀷涓婚敭鎴栬�呭悕绉颁笉鑳戒负绌�");
+        }
+        if(conditionMap == null){
+            conditionMap = new HashMap<>();
+        }
+        conditionMap.put("ownbizOid",ownbizOid.trim());
+        conditionMap.put("ownBtmname",ownbizBtm.trim());
+        if(StringUtils.isNotBlank(docClassifyId)){
+            conditionMap.put("filetype",docClassifyId);
+        }
+        return gridVciFileObject(conditionMap,pageHelper);
+    }
+
+    /**
+     * 璇诲彇涓氬姟鏁版嵁鐨勬枃浠�
+     *
+     * @param ownbizOid     涓氬姟绫诲瀷涓婚敭
+     * @param ownbizBtm     涓氬姟绫诲瀷鍚嶇О
+     * @param docClassifyId 鏂囨。绫诲瀷缂栧彿
+     * @return 鏂囦欢鏄剧ず瀵硅薄鐨勫垪琛�
+     * @throws VciBaseException 鍙傛暟涓虹┖鍜屾煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public List<VciFileObjectVO> listFilesByOwnbiz(String ownbizOid, String ownbizBtm, String docClassifyId) throws VciBaseException {
+        VciBaseUtil.alertNotNull(ownbizOid,"涓氬姟鏁版嵁鐨勪富閿�",ownbizBtm,"涓氬姟绫诲瀷鍚嶇О");
+        VciQueryWrapperForDO queryWrapperForDO = new VciQueryWrapperForDO(null,VciFileObjectDO.class);
+        queryWrapperForDO.eq("ownbizOid",ownbizOid.trim());
+        queryWrapperForDO.eq("ownBtmname",ownbizBtm.trim());
+        if(StringUtils.isNotBlank(docClassifyId)){
+            queryWrapperForDO.eq("filetype",docClassifyId.trim());
+        }
+        return vciFileObjectDO2VOs(vciFileObjectMapper.selectByWrapper(queryWrapperForDO));
+    }
+
+    /**
+     * 鎵归噺璇诲彇涓氬姟绫绘暟鎹殑鏂囦欢
+     * @param ownbizOidCollection 涓氬姟绫诲瀷涓婚敭闆嗗悎
+     * @param ownbizBtm 涓氬姟绫诲瀷鍚嶇О
+     * @param docClassifyId 鏂囨。绫诲瀷缂栧彿
+     * @return 鏂囦欢鏄剧ず瀵硅薄鐨勫垪琛�
+     * @throws VciBaseException 鍙傛暟涓虹┖鍜屾煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public List<VciFileObjectVO> batchListFilesByOwnbizs(Collection<String> ownbizOidCollection,String ownbizBtm,String docClassifyId) throws VciBaseException {
+        VciBaseUtil.alertNotNull(ownbizBtm,"涓氬姟绫诲瀷鍚嶇О");
+        VciBaseUtil.alertCollectionNotNull("涓氬姟鏁版嵁鐨勪富閿�",ownbizOidCollection);
+        List<VciFileObjectDO> fileObjectDOList = new ArrayList<>();
+        Collection<Collection<String>> ownbizOidCollections = VciBaseUtil.switchCollectionForOracleIn(ownbizOidCollection);
+        ownbizOidCollections.stream().forEach(ownbizOids-> {
+            VciQueryWrapperForDO queryWrapperForDO = new VciQueryWrapperForDO(null,VciFileObjectDO.class);
+            queryWrapperForDO.in("ownbizOid", VciBaseUtil.toInSql(ownbizOids.toArray(new String[0])));
+            queryWrapperForDO.eq("ownBtmname",ownbizBtm.trim());
+            if(StringUtils.isNotBlank(docClassifyId)){
+                queryWrapperForDO.eq("filetype",docClassifyId.trim());
+            }
+            List<VciFileObjectDO> tempFileObjectDOs = vciFileObjectMapper.selectByWrapper(queryWrapperForDO);
+            if(!CollectionUtils.isEmpty(tempFileObjectDOs)){
+                fileObjectDOList.addAll(tempFileObjectDOs);
+            }
+        });
+        return vciFileObjectDO2VOs(fileObjectDOList);
+    }
+
+    /**
+     * 鏍规嵁鍏抽敭淇℃伅鑾峰彇鏂囦欢淇℃伅
+     * @param keyInfoCollection 鍏抽敭淇℃伅
+     * @param docClassifyId 鏂囦欢鍒嗙被鐨勭紪鍙�
+     * @return 鏂囦欢鏄剧ず瀵硅薄锛屽彇data灞炴��
+     * @throws VciBaseException 鍙傛暟涓虹┖鍜屾煡璇㈠嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public BaseResult<VciFileObjectVO> listFileObjectByKeyInfo(Collection<String> keyInfoCollection, String docClassifyId)  throws VciBaseException {
+        VciBaseUtil.alertCollectionNotNull("鍏抽敭淇℃伅",keyInfoCollection);
+        BaseResult baseResult = new BaseResult();
+        Collection<Collection<String>> keyInfoCollections = VciBaseUtil.switchCollectionForOracleIn(keyInfoCollection);
+        List<VciFileObjectDO> fileObjectDOList = new ArrayList<>();
+        VciQueryWrapperForDO queryWrapperForDO = new VciQueryWrapperForDO(VciFileObjectDO.class);
+        keyInfoCollections.stream().forEach(keyInfos->{
+            queryWrapperForDO.setWhereSql("");
+            queryWrapperForDO.in("keyInfos", VciBaseUtil.toInSql(keyInfos.toArray(new String[0])));
+            if(StringUtils.isNotBlank(docClassifyId)){
+                queryWrapperForDO.eq("filetype",docClassifyId);
+            }
+            List<VciFileObjectDO> tempFileDOList = vciFileObjectMapper.selectByWrapper(queryWrapperForDO);
+            if(!CollectionUtils.isEmpty(tempFileDOList)){
+                fileObjectDOList.addAll(tempFileDOList);
+            }
+        });
+        baseResult.setData(vciFileObjectDO2VOs(fileObjectDOList));
+        baseResult.setSuccess(true);
+        return baseResult;
+    }
+
+    /**
+     * 浣跨敤鍏抽敭淇℃伅缁熻涓暟
+     *
+     * @param keyInfoCollection       鍏抽敭淇℃伅锛屽涓互閫楀彿鍒嗛殧锛�
+     * @param docClassifyId 鏂囨。鍒嗙被缂栧彿
+     * @return 涓暟
+     */
+    @Override
+    public Long countByKeyInfo(Collection<String> keyInfoCollection, String docClassifyId) throws VciBaseException {
+        if(CollectionUtils.isEmpty(keyInfoCollection)){
+            return 0L;
+        }
+        Collection<Collection<String>> keyInfoCollections = VciBaseUtil.switchCollectionForOracleIn(keyInfoCollection);
+        VciQueryWrapperForDO queryWrapperForDO = new VciQueryWrapperForDO(VciFileObjectDO.class);
+        final Long[] total = {0L};
+        keyInfoCollections.stream().forEach(keyInfos->{
+            queryWrapperForDO.setWhereSql("");
+            queryWrapperForDO.in("keyInfos", VciBaseUtil.toInSql(keyInfos.toArray(new String[0])));
+            if(StringUtils.isNotBlank(docClassifyId)){
+                queryWrapperForDO.eq("filetype",docClassifyId);
+            }
+            Long thisTotal = vciFileObjectMapper.countByWrapper(queryWrapperForDO);
+            if(thisTotal!=null){
+                total[0] += thisTotal;
+            }
+        });
+        return total[0];
+    }
+
+    /**
+     * 鍒犻櫎鏂囦欢
+     *
+     * @param fileOids 鏂囦欢鐨勪富閿�
+     * @return 鎵ц缁撴灉
+     */
+    @Override
+    public BaseResult deleteFiles(Collection<String> fileOids) throws VciBaseException {
+        Collection<VciFileObjectVO> fileObjectVOS = listVciFileObjectByOids(fileOids);
+        if(!CollectionUtils.isEmpty(fileObjectVOS)){
+            //鎴戜滑鏆傛椂涓嶅垹闄ゆ枃浠讹紝闃叉鍒犻櫎閿欎簡
+            VciBaseUtil.switchCollectionForOracleIn(fileObjectVOS).stream().forEach(fileObjectVOList->{
+                vciFileObjectMapper.batchDeleteByOids(fileObjectVOList.stream().map(VciFileObjectVO::getOid).collect(Collectors.toList()));
+            });
+        }
+        return BaseResult.success();
+    }
+
+    /**
+     * 浣跨敤鏂囦欢鐨勮矾寰勮幏鍙栧璞�
+     *
+     * @param filePathList  鏂囦欢璺緞
+     * @param docClassifyId 鏂囨。鐨勭被鍨嬬紪鍙�
+     * @return 鏂囦欢鐨勬樉绀哄璞�
+     */
+    @Override
+    public List<VciFileObjectVO> listFileObjectByPath(Collection<String> filePathList, String docClassifyId) {
+        if(CollectionUtils.isEmpty(filePathList)){
+            return new ArrayList<>();
+        }
+        Collection<Collection<String>> filePathCollections = VciBaseUtil.switchCollectionForOracleIn(filePathList);
+        VciQueryWrapperForDO queryWrapperForDO = new VciQueryWrapperForDO(VciFileObjectDO.class);
+
+        List<VciFileObjectDO> fileObjectDOList = new ArrayList<>();
+        filePathCollections.stream().forEach(filePath->{
+            queryWrapperForDO.setWhereSql("");
+            queryWrapperForDO.in("filePath", VciBaseUtil.toInSql(filePath.toArray(new String[0])));
+            if(StringUtils.isNotBlank(docClassifyId)){
+                queryWrapperForDO.eq("filetype",docClassifyId);
+            }
+            List<VciFileObjectDO> fileObjectDOS = vciFileObjectMapper.selectByWrapper(queryWrapperForDO);
+            if(!CollectionUtils.isEmpty(fileObjectDOS)){
+                fileObjectDOList.addAll(fileObjectDOS);
+            }
+        });
+        return vciFileObjectDO2VOs(fileObjectDOList);
+    }
+
+}
+
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/VciFileUploadServiceImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/VciFileUploadServiceImpl.java
new file mode 100644
index 0000000..a5de749
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/VciFileUploadServiceImpl.java
@@ -0,0 +1,759 @@
+package com.vci.web.service.impl;
+
+import com.vci.corba.common.VCIError;
+import com.vci.corba.framework.data.PvolumeInfo;
+import com.vci.corba.volumn.method.VolumnManagement;
+import com.vci.file.constant.VciFileDefaultValueConstant;
+import com.vci.file.constant.VciFileLangCodeConstant;
+import com.vci.file.dto.VciFileObjectDTO;
+import com.vci.file.enumpck.VciFileTransProtocolEnum;
+import com.vci.file.lcstatuspck.FileLCStatus;
+import com.vci.file.pagemodel.VciFileObjectVO;
+import com.vci.frameworkcore.constant.FrameWorkLangCodeConstant;
+import com.vci.starter.revision.service.RevisionModelUtil;
+import com.vci.starter.web.annotation.bus.VciChangeDocument;
+import com.vci.starter.web.enumpck.DataSecretEnum;
+import com.vci.starter.web.enumpck.UserSecretEnum;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.BaseResult;
+import com.vci.starter.web.util.BeanUtil;
+import com.vci.starter.web.util.LocalFileUtil;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.starter.web.wrapper.VciQueryWrapperForDO;
+import com.vci.web.constant.WebLangCodeConstant;
+import com.vci.web.dao.VciFileDocClassifyDaoI;
+import com.vci.web.dao.VciFileObjectDaoI;
+import com.vci.web.dao.VciFileVolumeDaoI;
+import com.vci.web.model.VciFileDocClassifyDO;
+import com.vci.web.model.VciFileObjectDO;
+import com.vci.web.model.VciFileVolumeDO;
+import com.vci.web.properties.WebProperties;
+import com.vci.web.service.VciFileUploadServiceI;
+import com.vci.web.service.VciFileVolumeServiceI;
+import com.vci.web.service.WebBoServiceI;
+import com.vci.web.service.WebSecretServiceI;
+import com.vci.web.util.PlatformClientUtil;
+import com.vci.web.util.WebUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+import plm.bs.bom.clientobject.ClientBusinessObject;
+
+import javax.annotation.Resource;
+import java.io.*;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+
+import static com.vci.file.constant.VciFileLangCodeConstant.*;
+import static com.vci.frameworkcore.constant.FrameWorkLangCodeConstant.UPLOAD_FAIL;
+import static com.vci.frameworkcore.constant.FrameWorkLangCodeConstant.UPLOAD_SUCCESS;
+
+@Service
+@VciChangeDocument(btmType = "fileUpload")
+public class VciFileUploadServiceImpl implements VciFileUploadServiceI {
+
+    /**
+     * 鏂囦欢淇℃伅鏁版嵁灞�
+     */
+    @Resource
+    private VciFileObjectDaoI vciFileObjectMapper;
+
+    /**
+     * 鏂囦欢绫诲瀷
+     */
+    @Resource
+    private VciFileDocClassifyDaoI fileDocClassifyMapper;
+
+    /**
+     * 鏂囦欢浠撴暟鎹眰
+     */
+    @Resource
+    private VciFileVolumeDaoI vciFileVolumeMapper;
+
+    /**
+     * 鐗堟湰鍜屾暟鎹璞″伐鍏风被
+     */
+    @Resource
+    private RevisionModelUtil revisionModelUtil;
+
+    /**
+     * 骞冲彴鐨勫鎴风
+     */
+    @Autowired
+    private PlatformClientUtil platformClientUtil;
+
+    /**
+     * 閰嶇疆瀵硅薄
+     */
+    @Autowired
+    private WebProperties webProperties;
+
+    /**
+     * 瀵嗙骇鐨勬湇鍔�
+     */
+    @Autowired
+    private WebSecretServiceI secretService;
+
+    /**
+     * 涓氬姟瀵硅薄鐨勬湇鍔�
+     */
+    @Autowired
+    private WebBoServiceI boService;
+
+    /**
+     * 鏂囦欢淇℃伅鍏变韩闆嗗悎
+     */
+    private volatile Map<String, VciFileObjectDTO> threadFileObjectMap = new ConcurrentHashMap<String, VciFileObjectDTO>();
+
+
+    /**
+     * 鏂囦欢鐨勫嵎鏈嶅姟
+     */
+    @Autowired
+    private VciFileVolumeServiceI vciFileVolumeServiceI;
+    /**
+     * 鑾峰彇鏂囦欢鐨勬墿灞曞悕(涓嶅甫灏忔暟鐐�)
+     * @param fileName 鏂囦欢鍚嶇О銆傚XXX.doc
+     * @return
+     */
+    public String getFileExtension(String fileName){
+        String fileExtension = "";
+        if(fileName.indexOf(".") > -1){//澶勭悊鍚庣紑鍚�
+            fileExtension = fileName.substring(fileName.lastIndexOf(".") + 1);
+        }
+        return fileExtension;
+    };
+
+    /**
+     * 鑾峰彇鏂囦欢鐨勫悕绉�(涓嶅甫鎵╁睍鍚�)
+     * @param fileName 鏂囦欢鍚嶇О銆傚XXX.doc
+     * @return
+     */
+    public String getFileNameNoExtension(String fileName){
+        String fileNameNoExtension = fileName.substring(0,fileName.lastIndexOf("."));
+        return fileNameNoExtension;
+    }
+
+
+
+    /**
+     * 涓婁紶鍗曚釜鏂囦欢銆�
+     * @param multipartFile 涓婁紶鐨勫獟浣撴枃浠�
+     * @param fileObjectDTO 鏂囦欢鐨勬暟鎹紶杈撳璞★紝鍏朵腑鏂囦欢鏀寔鏂囦欢瀵硅薄鎴栬�呬簩杩涘埗鏁扮粍锛岃皑鎱庝娇鐢ㄤ簩杩涘埗鏁扮粍锛屽洜涓哄崰鐢ㄥ唴瀛樺お澶�
+     * @return 鏂囦欢鐨勬樉绀哄璞�
+     * @throws VciBaseException 涓婁紶鏂囦欢鍑洪敊鐨勬椂鍊�
+     */
+    @Override
+    public BaseResult uploadFile(MultipartFile multipartFile, VciFileObjectDTO fileObjectDTO) throws VciBaseException {
+        VciBaseUtil.alertNotNull(fileObjectDTO.getFileDocClassify(), "鏂囨。绫诲瀷缂栧彿");
+
+        String sourceFileName = multipartFile.getOriginalFilename();
+        String fileExtension = getFileExtension(sourceFileName);
+        String fileNameNoExtension = getFileNameNoExtension(sourceFileName);
+        VciBaseUtil.alertNotNull(sourceFileName,"鏂囦欢鐨勫悕绉�");
+        VciFileObjectDO vciFileObjectDO = new VciFileObjectDO();
+        //鏍¢獙鍚嶇О鏄惁鏈夐噸澶�
+        if(fileObjectDTO.isCheckSameFile() && StringUtils.isNotBlank(fileObjectDTO.getOwnbizOid()) ){
+            if(vciFileObjectMapper.countSameName(fileNameNoExtension,fileExtension,fileObjectDTO.getOwnbizOid(),fileObjectDTO.isUpdateFileFlag(),fileObjectDTO.getOid())>0){
+                throw new VciBaseException(WebLangCodeConstant.FILE_NAME_REPEAT,new String[0]);
+            }
+        }
+        //濡傛灉鏄湁瀵嗙骇鐨勮瘽锛岄渶瑕佹牎楠屾枃浠剁殑瀵嗙骇
+        if(webProperties.isSecretRight()){
+            Integer fileSecret = fileObjectDTO.getSecretGrade();
+            String fileSecretText = "";
+            if(fileSecret ==null || fileSecret == -1){
+                fileSecret = DataSecretEnum.NONE.getValue();
+            }
+            fileSecretText = DataSecretEnum.getSecretText(fileSecret);
+            if(!secretService.checkDataSecret(fileSecret)){
+                throw new VciBaseException(WebLangCodeConstant.FILE_UPLOAD_SECRET_ERROR,new String[]{UserSecretEnum.getSecretText(VciBaseUtil.getCurrentUserSecret()) ,fileSecretText});
+            }
+            String dataSecret = vciFileObjectMapper.selectSecret(fileObjectDTO.getOwnbizOid(),fileObjectDTO.getOwnBtmname());
+            if(StringUtils.isNotBlank(dataSecret) && VciBaseUtil.getInt(dataSecret)<fileSecret){
+                throw new VciBaseException(WebLangCodeConstant.FILE_UPLOAD_DATA_SECRET_ERROR,new String[]{DataSecretEnum.getSecretText(VciBaseUtil.getInt(dataSecret)) ,fileSecretText});
+            }
+            vciFileObjectDO.setSecretGrade(fileSecret);
+            vciFileObjectDO.setSecretGradeText(fileSecretText);
+        }
+
+        //鑾峰彇鏂囦欢浠撲綅缃�
+
+        VciFileVolumeDO vciFileVolumeDO = vciFileVolumeServiceI.getUploadVolume();
+
+        //瀛樺偍涓氬姟鏁版嵁涓庢枃浠朵俊鎭�
+        vciFileObjectDO.setId(fileNameNoExtension);
+        vciFileObjectDO.setName(fileNameNoExtension);
+        vciFileObjectDO.setFileSize(multipartFile.getSize());
+        vciFileObjectDO.setFileDocClassify(fileObjectDTO.getFileDocClassify());
+        if(StringUtils.isNotBlank(fileObjectDTO.getFileDocClassify()) && StringUtils.isBlank(fileObjectDTO.getFileDocClassifyName())) {
+            VciFileDocClassifyDO classifyDO = fileDocClassifyMapper.selectById(fileObjectDTO.getFileDocClassify());
+            if(classifyDO!=null && StringUtils.isNotBlank(classifyDO.getId())){
+                vciFileObjectDO.setFileDocClassifyName(classifyDO.getName());
+            }
+        }else{
+            vciFileObjectDO.setFileDocClassifyName(fileObjectDTO.getFileDocClassifyName());
+        }
+        vciFileObjectDO.setFileExtension(fileExtension);
+        vciFileObjectDO.setPkFileVolume(vciFileVolumeDO.getOid());
+        vciFileObjectDO.setOwnbizOid(fileObjectDTO.getOwnbizOid());
+        vciFileObjectDO.setOwnBtmname(fileObjectDTO.getOwnBtmname());
+        if(fileObjectDTO.isEffect()){
+            vciFileObjectDO.setLcStatus(FileLCStatus.FILE_RELEASE.getValue());
+        }else{
+            vciFileObjectDO.setLcStatus(FileLCStatus.TRANS_FINISH.getValue());
+        }
+        if(vciFileObjectDO.getSecretGrade() == null) {
+            vciFileObjectDO.setSecretGrade(DataSecretEnum.NONE.getValue());
+        }
+        revisionModelUtil.wrapperForAdd(vciFileObjectDO);
+        //闅忔満璺緞
+        String randomPath = VciBaseUtil.getPk();
+        //鐩爣鏂囦欢
+        String targetFileName = vciFileObjectDO.getOid();
+
+        String filePath = randomPath+File.separator+targetFileName;
+
+        vciFileObjectDO.setFilePath(filePath);
+        //鍏堜紶鏂囦欢
+
+        //鏂囦欢浠�
+        String volumePath = vciFileVolumeDO.getVolumePath();
+
+        //鍒ゆ柇鐩爣鏂囦欢鎵�鍦ㄧ洰褰曟槸鍚﹀瓨鍦�
+        String targetFileDir = volumePath+File.separator+randomPath;
+
+        //鍒ゆ柇鐩爣鏂囦欢鏄惁瀛樺湪
+        String targetFilePath = targetFileDir+File.separator+targetFileName;
+
+        if(VciFileTransProtocolEnum.LOCAL.getValue().equalsIgnoreCase(vciFileVolumeDO.getTransProtocol())) {
+            //涓婁紶鏂囦欢
+            try {
+                File targetFile = new File(targetFilePath);
+
+                File targetDir = targetFile.getParentFile();
+                if (!targetDir.exists()) {
+                    targetDir.mkdirs();
+                }
+
+                if (targetFile.exists()) {
+                    targetFile.delete();
+                } else {
+                    targetFile.createNewFile();
+                }
+
+                multipartFile.transferTo(targetFile);
+            } catch (IOException e) {
+                throw new VciBaseException(UPLOAD_FAIL);
+            }
+        }else if(VciFileTransProtocolEnum.CORBA.getValue().equalsIgnoreCase(vciFileVolumeDO.getTransProtocol())){
+            String volumeName = vciFileVolumeDO.getName();
+            VolumnManagement volumnCorbaService = null;
+            try {
+                volumnCorbaService = platformClientUtil.getVolumeService(vciFileVolumeDO.getServiceUrl(),volumeName).getVolumnService();
+            } catch (VCIError vciError) {
+                throw new VciBaseException("娌℃湁鑾峰彇鍒皗}鐨勫嵎鏈嶅姟",new String[]{volumeName},vciError);
+            }
+            InputStream in = null;
+            if("filePathField".equalsIgnoreCase(vciFileObjectDO.getFileDocClassify())){
+                vciFileObjectDO.setFilePath(volumeName + ":/" + vciFileObjectDO.getFilePath() + "." + vciFileObjectDO.getFileExtension());
+            }else {
+                vciFileObjectDO.setFilePath(volumeName + ":/" + vciFileObjectDO.getFilePath());
+            }
+            try{
+                long currentTime = volumnCorbaService.getCurrrentTimeMillions();
+                in = multipartFile.getInputStream();
+                long fileSize = multipartFile.getSize();
+                int blockSize = (int)webProperties.getBlockLength()*1024;
+                byte[] buffer = new byte[blockSize];
+                long temp =0L;
+                for(temp = 0L; temp < fileSize - (long)blockSize; temp += (long)blockSize) {
+                    in.read(buffer, 0, blockSize);
+                    volumnCorbaService.receiveFile(vciFileObjectDO.getFilePath(), buffer, temp, currentTime, fileSize);
+                }
+                int remainSize = (int)(fileSize - temp);
+                buffer = new byte[remainSize];
+                in.read(buffer, 0, remainSize);
+                volumnCorbaService.receiveFile(vciFileObjectDO.getFilePath(), buffer, temp, currentTime, fileSize);
+            }catch(IOException e){
+                throw new VciBaseException("璇诲彇鏂囦欢[" + vciFileObjectDO.getName() + "]鍑虹幇浜嗛敊璇紝" + e.getMessage() ,new String[0],e);
+            }catch (VCIError e){
+                throw new VciBaseException("浼犺緭鏂囦欢[" +  vciFileObjectDO.getName() + "]鍑虹幇浜嗛敊璇紝" + e.getMessage() ,new String[0],e);
+            }catch(Exception e){
+                throw new VciBaseException("澶勭悊涓婁紶鏂囦欢[" + vciFileObjectDO.getName() + "]鍑虹幇浜嗛敊璇紝" + e.getMessage() ,new String[0],e);
+            }finally {
+                if(in!=null){
+                    try {
+                        in.close();
+                    } catch (IOException e) {
+                    }
+                }
+            }
+        }
+
+        //璇存槑鏄枃浠朵慨鏀癸紝闇�淇敼鍘熸枃浠朵俊鎭�佸垹闄ゆ柊鍒濆鍖栫殑鏂囦欢淇℃伅鍙婃枃浠撲腑鐨勬枃浠�
+        if(fileObjectDTO.isUpdateFileFlag() && StringUtils.isNotBlank(fileObjectDTO.getFileOid())){
+            VciFileObjectDO sourceFileObject = vciFileObjectMapper.selectByPrimaryKey(fileObjectDTO.getFileOid());
+
+            sourceFileObject.setId(vciFileObjectDO.getId());
+            sourceFileObject.setName(vciFileObjectDO.getName());
+            sourceFileObject.setFilePath(vciFileObjectDO.getFilePath());
+            sourceFileObject.setFileDocClassifyName(vciFileObjectDO.getFileDocClassifyName());
+            sourceFileObject.setFileDocClassify(vciFileObjectDO.getFileDocClassify());
+            sourceFileObject.setOwnBtmname(vciFileObjectDO.getOwnBtmname());
+            sourceFileObject.setOwnbizOid(vciFileObjectDO.getOwnbizOid());
+            sourceFileObject.setPkFileVolume(vciFileObjectDO.getPkFileVolume());
+            sourceFileObject.setFileExtension(vciFileObjectDO.getFileExtension());
+            sourceFileObject.setFileSize(vciFileObjectDO.getFileSize());
+            vciFileObjectMapper.updateByPrimaryKey(sourceFileObject);
+            //娌″姙娉曞垹闄や箣鍓嶇殑鏂囦欢锛�
+        }else {
+            vciFileObjectMapper.insert(vciFileObjectDO);
+        }
+
+        BaseResult baseResult = BaseResult.success();
+        baseResult.setMsg(FrameWorkLangCodeConstant.UPLOAD_SUCCESS);
+
+        VciFileObjectVO vciFileObjectVO = new VciFileObjectVO();
+        BeanUtil.convert(vciFileObjectDO, vciFileObjectVO);
+        vciFileObjectVO.setFileDocClassifyName("22222");
+        baseResult.setObj(vciFileObjectVO);
+
+        return baseResult;
+    }
+
+    /**
+     * 灏嗗師涓氬姟鏁版嵁涓嬬殑鎵�鏈夋枃浠跺叡浜埌鍏朵粬鐨勪笟鍔$被鍨嬩笅
+     * @param sourceBtmName 鍘熶笟鍔$被鍨�
+     * @param sourceBusinessOid 鍘熶笟鍔℃暟鎹富閿�
+     * @param btmName 涓氬姟绫诲瀷
+     * @param businessOid 涓氬姟鏁版嵁涓婚敭
+     * @return 鏂囦欢淇℃伅鏄剧ず瀵硅薄
+     * @throws VciBaseException
+     */
+    @Override
+    public BaseResult<VciFileObjectVO> shareFilesToBO(String sourceBtmName, String sourceBusinessOid, String btmName, String businessOid) throws VciBaseException {
+        VciBaseUtil.alertNotNull(sourceBtmName,"鍘熶笟鍔$被鍨�",sourceBusinessOid,"鍘熶笟鍔℃暟鎹富閿�",btmName,"涓氬姟绫诲瀷",businessOid,"涓氬姟鏁版嵁涓婚敭");
+        Map<String, String> conditionMap = new HashMap<String, String>();
+
+        //鑾峰彇鏂囦欢浠撲綅缃�
+        conditionMap.put("ownbizoid", sourceBusinessOid);
+        conditionMap.put("ownbtmname", sourceBtmName);
+        VciQueryWrapperForDO fileWrapper = new VciQueryWrapperForDO(conditionMap, VciFileObjectDO.class);
+        List<VciFileObjectDO> vciFileObjectDOList = vciFileObjectMapper.selectByWrapper(fileWrapper);
+        if(vciFileObjectDOList.size()>0){
+            return shareFile(vciFileObjectDOList, businessOid, btmName);
+        }
+
+        return BaseResult.successMsg(UPLOAD_SUCCESS);
+    }
+
+    /**
+     * 灏嗗師涓氬姟鏁版嵁涓嬬殑闈炶〃鍗曠浉鍏虫枃浠跺叡浜埌鍏朵粬鐨勪笟鍔$被鍨嬩笅
+     * @param sourceBtmName 鍘熶笟鍔$被鍨�
+     * @param sourceBusinessOid 鍘熶笟鍔℃暟鎹富閿�
+     * @param btmName 涓氬姟绫诲瀷
+     * @param businessOid 涓氬姟鏁版嵁涓婚敭
+     * @return 鍏变韩鍚庣殑鏂囦欢鏄剧ず瀵硅薄
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呬繚瀛樺嚭閿欑殑鏃跺�欐姏鍑哄紓甯�
+     */
+    @Override
+    public BaseResult<VciFileObjectVO> shareAnnexFilesToBO(String sourceBtmName, String sourceBusinessOid, String btmName, String businessOid) throws VciBaseException {
+        VciBaseUtil.alertNotNull(sourceBtmName,"鍘熶笟鍔$被鍨�",sourceBusinessOid,"鍘熶笟鍔℃暟鎹富閿�",btmName,"涓氬姟绫诲瀷",businessOid,"涓氬姟鏁版嵁涓婚敭");
+        Map<String, String> conditionMap = new HashMap<String, String>();
+
+        //鑾峰彇鏂囦欢浠撲綅缃�
+        conditionMap.put("ownbizoid", sourceBusinessOid);
+        conditionMap.put("ownbtmname", sourceBtmName);
+        List<String> classifyList = new ArrayList<>();
+        classifyList.add(VciFileDefaultValueConstant.TABLE_FILE_CLASSIFY_DVF);
+        classifyList.add(VciFileDefaultValueConstant.TABLE_FILE_CLASSIFY_PDF);
+        classifyList.add(VciFileDefaultValueConstant.TABLE_FILE_CLASSIFY_XML);
+        VciQueryWrapperForDO fileWrapper = new VciQueryWrapperForDO(conditionMap, VciFileObjectDO.class);
+        fileWrapper.notIn("fileDocClassify", VciBaseUtil.toInSql(VciBaseUtil.list2String(classifyList)));
+        List<VciFileObjectDO> vciFileObjectDOList = vciFileObjectMapper.selectByWrapper(fileWrapper);
+        if(vciFileObjectDOList.size()>0){
+            return shareFile(vciFileObjectDOList, businessOid, btmName);
+        }
+
+        return BaseResult.successMsg(UPLOAD_SUCCESS);
+    }
+
+    /**
+     * 鍏变韩鏂囦欢
+     * @param sourceFileObjectList 鍘熸枃浠禗O瀵硅薄闆嗗悎
+     * @param businessOid 涓氬姟涓婚敭
+     * @param btmName 涓氬姟绫诲瀷
+     * @return 鏂囦欢淇℃伅鏄剧ず瀵硅薄
+     */
+    private BaseResult shareFile(List<VciFileObjectDO> sourceFileObjectList, String businessOid, String btmName) throws VciBaseException {
+        List<VciFileObjectDO> resultList = new ArrayList<VciFileObjectDO>();
+        //鍒涘缓鍏变韩鏂囦欢鐨勪俊鎭�
+        Map<String, VciFileObjectDO> sourceDOMap = sharedFileObject(sourceFileObjectList,businessOid,btmName,resultList);
+
+        //鍏变韩鏂囦欢
+        sharedFile(resultList, sourceDOMap);
+
+        List<VciFileObjectVO> voList = new ArrayList<VciFileObjectVO>();
+        for(VciFileObjectDO vciFileObjectDO : resultList){
+            VciFileObjectVO vciFileObjectVO = new VciFileObjectVO();
+            BeanUtil.convert(vciFileObjectDO,vciFileObjectVO);
+            voList.add(vciFileObjectVO);
+        }
+
+        BaseResult baseResult = new BaseResult();
+        baseResult.setMsg(UPLOAD_SUCCESS);
+        baseResult.setSuccess(true);
+        baseResult.setData(voList);
+
+        return baseResult;
+    }
+
+    /**
+     * 鍏变韩鏂囦欢淇℃伅
+     * @param sourceFileObjectList 鍏变韩鏂囦欢淇℃伅DO闆嗗悎
+     * @param businessOid 涓氬姟涓婚敭
+     * @param btmName 涓氬姟涓婚敭
+     * @param resultList 鍏变韩鍚庢枃浠朵俊鎭疍O闆嗗悎
+     * @return 鏂囦欢淇℃伅鏄剧ず瀵硅薄闆嗗悎锛宬ey鐩爣鏂囦欢涓婚敭锛寁alue鐩爣鏂囦欢鐨勫師鏂囦欢DO瀵硅薄
+     */
+    private Map<String, VciFileObjectDO> sharedFileObject(List<VciFileObjectDO> sourceFileObjectList, String businessOid, String btmName,List<VciFileObjectDO> resultList){
+        Map<String, VciFileObjectDO> sourceDOMap = new HashMap<String, VciFileObjectDO>();
+
+        Date currentDate = new Date();
+        String currentUserId = VciBaseUtil.getCurrentUserId();
+
+        for(VciFileObjectDO sourceDO : sourceFileObjectList){
+            VciFileObjectDO targetDO = new VciFileObjectDO();
+            BeanUtil.convert(sourceDO, targetDO);
+            targetDO.setOid(VciBaseUtil.getPk());
+            targetDO.setCreator(currentUserId);
+            targetDO.setCreateTime(currentDate);
+            targetDO.setTs(currentDate);
+            targetDO.setLastModifier(currentUserId);
+            targetDO.setLastModifyTime(currentDate);
+            targetDO.setOwner(currentUserId);
+            targetDO.setOwnbizOid(businessOid);
+            targetDO.setOwnBtmname(btmName);
+
+            String randomPath = VciBaseUtil.getPk();
+
+            //鏂囦欢璺緞
+            String filePath = randomPath+File.separator+targetDO.getOid();
+            targetDO.setFilePath(filePath);
+
+            resultList.add(targetDO);
+
+            sourceDOMap.put(targetDO.getOid(), sourceDO);
+        }
+
+        //淇濆瓨
+        if(resultList.size()>0){
+            int batchInsert = vciFileObjectMapper.batchInsert(resultList);
+            if(batchInsert<=0){
+                throw new VciBaseException(FILE_SHARED_FAIL);
+            }
+        }
+
+        return sourceDOMap;
+    }
+
+    /**
+     * 鏂囦欢鍏变韩
+     * @param resultList 鍏变韩鏂囦欢淇℃伅
+     * @param sourceDOMap 鍏变韩鏂囦欢鐨勫師鏂囦欢闆嗗悎
+     */
+    private void sharedFile(List<VciFileObjectDO> resultList, Map<String, VciFileObjectDO> sourceDOMap){
+        Set<String> volumeOidSet = new HashSet<String>();
+        for(VciFileObjectDO targetDO : resultList){
+            volumeOidSet.add(targetDO.getPkFileVolume());
+        }
+        Map<String, VciFileVolumeDO> volumeDOMap = new HashMap<>();
+        List<VciFileVolumeDO> volumeList = vciFileVolumeMapper.selectByPrimaryKeyCollection(volumeOidSet);
+        for(VciFileVolumeDO volumeDO : volumeList){
+            volumeDOMap.put(volumeDO.getOid(), volumeDO);
+        }
+
+        for(VciFileObjectDO targetDO : resultList){
+            //鏂囦粨
+            VciFileVolumeDO vciFileVolumeDO = volumeDOMap.get(targetDO.getPkFileVolume());
+
+            //鍘熸枃浠惰矾寰�
+            VciFileObjectDO sourceDO = sourceDOMap.get(targetDO.getOid());
+            String sourceFilePath = vciFileVolumeDO.getVolumePath()+File.separator+sourceDO.getFilePath();
+
+
+            if(vciFileVolumeDO == null){
+                throw new VciBaseException(FILE_VOLUME_NOT_EXIST);
+            }
+
+            //鏈湴鍗忚
+            if(vciFileVolumeDO.getTransProtocol().equals(VciFileTransProtocolEnum.LOCAL.getValue())){
+                String targetFilePath = vciFileVolumeDO.getVolumePath()+File.separator+targetDO.getFilePath();
+
+                try {
+                    File targetFile = new File(targetFilePath);
+
+                    File targetDirFile = targetFile.getParentFile();
+                    if(!targetDirFile.exists()){
+                        targetDirFile.mkdirs();
+                    }
+                    if(!targetFile.exists()){
+                        targetFile.createNewFile();
+                    }
+                    File sourceFile = new File(sourceFilePath);
+
+                    LocalFileUtil.copyFile(sourceFile, targetFile);
+                }catch (Exception e){
+                    throw new VciBaseException(UPLOAD_FAIL);
+                }
+            }
+        }
+    }
+
+    /**
+     * 灏嗘枃浠跺叡浜埌鍏朵粬鐨勪笟鍔$被鍨嬩笅
+     * @param fileOid 鏂囦欢涓婚敭
+     * @param btmName 涓氬姟绫诲瀷
+     * @param businessOid 涓氬姟鏁版嵁涓婚敭
+     * @return 鏂囦欢淇℃伅鏄剧ず瀵硅薄
+     * @throws VciBaseException
+     */
+    @Override
+    public BaseResult<VciFileObjectVO> shareFilesToBO(String fileOid, String btmName, String businessOid) throws VciBaseException {
+        VciBaseUtil.alertNotNull(fileOid,"鏂囦欢涓婚敭", btmName,"涓氬姟绫诲瀷", businessOid,"涓氬姟鏁版嵁涓婚敭");
+        Map<String, String> conditionMap = new HashMap<String, String>();
+
+        //鑾峰彇鏂囦欢浠撲綅缃�
+        conditionMap.put("oid", fileOid);
+        VciQueryWrapperForDO fileWrapper = new VciQueryWrapperForDO(conditionMap, VciFileObjectDO.class);
+        List<VciFileObjectDO> vciFileObjectDOList = vciFileObjectMapper.selectByWrapper(fileWrapper);
+        if(vciFileObjectDOList.size()>0){
+            return shareFile(vciFileObjectDOList, businessOid, btmName);
+        }
+
+        return BaseResult.successMsg(UPLOAD_SUCCESS);
+    }
+
+    /**
+     * 鎵归噺灏嗘枃浠跺叡浜埌鍏朵粬鐨勪笟鍔$被鍨嬩笅
+     * @param fileOidCollection 鏂囦欢涓婚敭闆嗗悎
+     * @param btmName 涓氬姟绫诲瀷
+     * @param businessOid 涓氬姟鏁版嵁涓婚敭
+     * @return 鏂囦欢淇℃伅鏄剧ず瀵硅薄
+     * @throws VciBaseException 淇濆瓨鏁版嵁浼氭姏鍑哄紓甯�
+     */
+    @Override
+    public BaseResult<VciFileObjectVO> shareFilesToBO(Collection<String> fileOidCollection, String btmName, String businessOid) throws VciBaseException {
+        VciBaseUtil.alertNotNull(btmName,"涓氬姟绫诲瀷", businessOid,"涓氬姟鏁版嵁涓婚敭");
+        if(fileOidCollection.size()<=0){
+            throw new VciBaseException(FILE_NOT_EXIST_CANNOT_SHARED);
+        }
+
+        List<VciFileObjectDO> vciFileObjectDOS = vciFileObjectMapper.selectByPrimaryKeyCollection(fileOidCollection);
+        if(vciFileObjectDOS.size()>0){
+            return shareFile(vciFileObjectDOS, businessOid, btmName);
+        }
+
+        return BaseResult.successMsg(UPLOAD_SUCCESS);
+    }
+
+    /**
+     * 杞崲璺緞涓殑\銆�
+     * @param strFileName 璺緞
+     * @return
+     */
+    private String hanlderOS(String strFileName) {
+        String strNewFileName = strFileName;
+        String osStr = System.getProperty("os.name");
+        if ( !osStr.startsWith("Win") )
+        {
+            //Unix
+            strNewFileName = strNewFileName.replace('\\','/');
+        }
+        return strNewFileName;
+    }
+
+    /**
+     * 鍒嗙墖涓婁紶
+     * @param multipartFile 鐗囨枃浠�
+     * @param offSet 鏂囦欢鍋忕Щ閲�
+     * @param fileOid 鏂囦欢涓婚敭
+     * @return 鏂囦欢淇℃伅鏄剧ず瀵硅薄
+     * @throws VciBaseException 淇濆瓨鏁版嵁浼氭姏鍑哄紓甯�
+     */
+    @Override
+    public BaseResult<VciFileObjectVO> uploadFileForOtherService(MultipartFile multipartFile, long offSet, String fileOid) throws VciBaseException {
+        BaseResult baseResult = new BaseResult();
+        //鑾峰彇鏂囦欢涓婁紶鏃剁殑鍒濆鍖栦俊鎭�
+        VciFileObjectDTO vciFileObjectDTO = null;
+        if(threadFileObjectMap.keySet().contains(fileOid)){
+            vciFileObjectDTO = threadFileObjectMap.get(fileOid);
+        }
+        if(vciFileObjectDTO == null){
+            throw new VciBaseException(FILE_INFO_NOT_EXIST);
+        }
+
+        VciFileObjectDO vciFileObjectDO = vciFileObjectMapper.selectByPrimaryKey(fileOid);
+        if(vciFileObjectDO == null){
+            throw new VciBaseException(FILE_INFO_NOT_EXIST);
+        }
+
+        VciFileVolumeDO vciFileVolumeDO = vciFileVolumeMapper.selectByPrimaryKey(vciFileObjectDO.getPkFileVolume());
+        if(vciFileVolumeDO == null){
+            throw new VciBaseException(FILE_VOLUME_NOT_EXIST);
+        }
+
+        //鑾峰彇瀛樺偍璺緞锛屽強鏂囦欢澶у皬
+        String targetPath = vciFileVolumeDO.getVolumePath()+File.separator+vciFileObjectDO.getFilePath();
+        long fileSize = vciFileObjectDO.getFileSize();
+
+        //涓婁紶鏂囦欢
+        targetPath = hanlderOS(targetPath);
+        RandomAccessFile destfile = null;
+        try {
+            File targetFile = new File(targetPath);
+            File targetDir = targetFile.getParentFile();
+            if(!targetDir.exists()){
+                targetDir.mkdirs();
+            }
+            if(!targetFile.exists()){
+                targetFile.createNewFile();
+            }
+            destfile = new RandomAccessFile(targetFile, "rw");
+            destfile.seek(offSet);
+            destfile.write(multipartFile.getBytes(), 0, multipartFile.getBytes().length);
+
+            //璇存槑鏂囦欢涓婁紶瀹屾垚
+            if((fileSize-(offSet+multipartFile.getBytes().length))<=0){
+                if(vciFileObjectDTO.isEffect()){
+                    vciFileObjectDO.setLcStatus(FileLCStatus.FILE_RELEASE.getValue());
+                    vciFileObjectMapper.updateByPrimaryKey(vciFileObjectDO);
+                }
+
+                //璇存槑鏄枃浠朵慨鏀癸紝闇�淇敼鍘熸枃浠朵俊鎭�佸垹闄ゆ柊鍒濆鍖栫殑鏂囦欢淇℃伅鍙婃枃浠撲腑鐨勬枃浠�
+                if(vciFileObjectDTO.isUpdateFileFlag() && StringUtils.isNotBlank(vciFileObjectDTO.getFileOid())){
+                    VciFileObjectDO sourceFileObject = vciFileObjectMapper.selectByPrimaryKey(vciFileObjectDTO.getFileOid());
+
+                    String oldFilePath = sourceFileObject.getFilePath();
+                    sourceFileObject.setId(vciFileObjectDO.getId());
+                    sourceFileObject.setName(vciFileObjectDO.getName());
+                    sourceFileObject.setFilePath(vciFileObjectDO.getFilePath());
+                    sourceFileObject.setFileDocClassifyName(vciFileObjectDO.getFileDocClassifyName());
+                    sourceFileObject.setFileDocClassify(vciFileObjectDO.getFileDocClassify());
+                    sourceFileObject.setOwnBtmname(vciFileObjectDO.getOwnBtmname());
+                    sourceFileObject.setOwnbizOid(vciFileObjectDO.getOwnbizOid());
+                    sourceFileObject.setPkFileVolume(vciFileObjectDO.getPkFileVolume());
+                    sourceFileObject.setFileExtension(vciFileObjectDO.getFileExtension());
+                    sourceFileObject.setFileSize(vciFileObjectDO.getFileSize());
+
+                    VciFileVolumeDO sourceVolume = vciFileVolumeMapper.selectByPrimaryKey(sourceFileObject.getPkFileVolume());
+
+                    //鍒犻櫎鏂囦粨涓殑鏂囦欢
+                    String sourceFilePath = sourceVolume.getVolumePath()+File.separator+oldFilePath;
+                    File sourceFile = new File(sourceFilePath);
+                    if(sourceFile.exists()){
+                        sourceFile.delete();
+                    }
+                    File sourceDir = new File(sourceFile.getParentFile().getAbsolutePath());
+                    File[] files = sourceDir.listFiles();
+                    if(sourceDir.exists() && (files == null|| files.length == 0)){
+                        sourceDir.delete();
+                    }
+
+                    //鍒犻櫎鏂囦欢淇℃伅
+                    vciFileObjectMapper.deleteByPrimaryKey(fileOid);
+                    vciFileObjectMapper.updateByPrimaryKey(sourceFileObject);
+                }
+
+                VciFileObjectVO vciFileObjectVO = new VciFileObjectVO();
+                BeanUtil.convert(vciFileObjectDO,vciFileObjectVO);
+                baseResult.setObj(vciFileObjectVO);
+
+                threadFileObjectMap.remove(fileOid);
+            }
+            baseResult.setMsg(UPLOAD_SUCCESS);
+            baseResult.setSuccess(true);
+
+        } catch (Exception e) {
+            throw new VciBaseException(UPLOAD_FAIL);
+        } finally {
+            if(destfile!=null){
+                try {
+                    destfile.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+
+        return baseResult;
+    }
+
+    /**
+     * 鍏朵粬鏈嶅姟涓婁紶鏂囦欢涔嬪墠鍒濆鍖栨枃浠朵俊鎭�
+     * @param vciFileObjectDTOS 鏂囦欢淇℃伅浼犺緭瀵硅薄
+     * @return 鏂囦欢淇℃伅鏄剧ず瀵硅薄
+     * @throws VciBaseException 淇濆瓨鏁版嵁浼氭姏鍑哄紓甯�
+     */
+    @Override
+    public BaseResult initUploadFileInfo(Collection<VciFileObjectDTO> vciFileObjectDTOS) throws VciBaseException {
+        for(VciFileObjectDTO vciFileObjectDTO : vciFileObjectDTOS){
+            VciBaseUtil.alertNotNull(vciFileObjectDTO,"鏂囦欢淇℃伅浼犺緭瀵硅薄",
+                    vciFileObjectDTO.getOwnbizOid(),"涓氬姟鏁版嵁涓婚敭",
+                    vciFileObjectDTO.getOwnBtmname(),"涓氬姟鏁版嵁涓氬姟绫诲瀷",
+                    vciFileObjectDTO.getId(),"鏂囦欢鏄剧ず鍚嶇О",
+                    vciFileObjectDTO.getName(),"鏂囦欢瀹為檯鍚嶇О",
+                    vciFileObjectDTO.getFileSize(),"鏂囦欢澶у皬",
+                    vciFileObjectDTO.getFileExtension(),"鏂囦欢鎵╁睍鍚�");
+        }
+
+        List<VciFileVolumeDO> vciFileVolumeDOList = vciFileVolumeMapper.selectAll();
+        if(vciFileVolumeDOList.size()<=0){
+            throw new VciBaseException(VciFileLangCodeConstant.FILE_VOLUME_NOT_EXIST);
+        }
+        VciFileVolumeDO vciFileVolumeDO = vciFileVolumeDOList.get(0);
+
+        List<VciFileObjectDO> vciFileObjectDOS = new ArrayList<>();
+        List<VciFileObjectVO> vciFileObjectVOS = new ArrayList<VciFileObjectVO>();
+        for(VciFileObjectDTO vciFileObjectDTO : vciFileObjectDTOS){
+            VciFileObjectDO vciFileObjectDO = new VciFileObjectDO();
+            BeanUtil.convert(vciFileObjectDTO, vciFileObjectDO);
+            vciFileObjectDO.setPkFileVolume(vciFileVolumeDO.getOid());
+            if(StringUtils.isBlank(vciFileObjectDO.getId())){
+                vciFileObjectDO.setName(vciFileObjectDO.getId());
+            }
+            if(vciFileObjectDO.getSecretGrade() == null || vciFileObjectDO.getSecretGrade() == 0){
+                vciFileObjectDO.setSecretGrade(DataSecretEnum.NONE.getValue());
+            }
+            revisionModelUtil.wrapperForAdd(vciFileObjectDO);
+
+            String targetFilePath = VciBaseUtil.getPk()+File.separator+vciFileObjectDO.getOid();
+            vciFileObjectDO.setFilePath(targetFilePath);
+            vciFileObjectDO.setLcStatus(FileLCStatus.TRANSING.getValue());
+
+            vciFileObjectDOS.add(vciFileObjectDO);
+
+            VciFileObjectVO vciFileObjectVO = new VciFileObjectVO();
+            BeanUtil.convert(vciFileObjectDO, vciFileObjectVO);
+            vciFileObjectVOS.add(vciFileObjectVO);
+
+            threadFileObjectMap.put(vciFileObjectDO.getOid(),vciFileObjectDTO);
+        }
+
+        if(vciFileObjectDOS.size()>0){
+            int insert = vciFileObjectMapper.batchInsert(vciFileObjectDOS);
+            if(insert<=0){
+                throw new VciBaseException(FILE_INFO_INIT_FAIL);
+            }
+        }
+
+        BaseResult baseResult = new BaseResult();
+        baseResult.setData(vciFileObjectVOS);
+        baseResult.setMsg(FILE_INFO_INIT_SUCCESS);
+        baseResult.setSuccess(true);
+
+        return baseResult;
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/VciFileVolumeServiceImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/VciFileVolumeServiceImpl.java
new file mode 100644
index 0000000..1f312ea
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/VciFileVolumeServiceImpl.java
@@ -0,0 +1,406 @@
+package com.vci.web.service.impl;
+
+import com.vci.corba.common.VCIError;
+import com.vci.corba.framework.data.PvolumeInfo;
+import com.vci.file.dto.VciFileVolumeDTO;
+import com.vci.file.enumpck.VciFileServiceOsTypeEnum;
+import com.vci.file.enumpck.VciFileTransProtocolEnum;
+import com.vci.file.pagemodel.VciFileVolumeVO;
+import com.vci.frameworkcore.constant.FrameWorkLangCodeConstant;
+import com.vci.frameworkcore.lcstatuspck.FrameworkDataLCStatus;
+import com.vci.starter.revision.service.RevisionModelUtil;
+import com.vci.starter.web.annotation.bus.VciChangeDocument;
+import com.vci.starter.web.enumpck.VciChangeDocumentTypeEnum;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.BaseResult;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.starter.web.util.BeanUtil;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.starter.web.wrapper.VciQueryWrapperForDO;
+import com.vci.web.dao.VciFileVolumeDaoI;
+import com.vci.web.model.VciFileVolumeDO;
+import com.vci.web.service.VciFileVolumeServiceI;
+import com.vci.web.util.PlatformClientUtil;
+import com.vci.web.util.WebUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import javax.annotation.Resource;
+import java.util.*;
+
+import static com.vci.frameworkcore.constant.FrameWorkDefaultValueConstant.FRAMEWORK_DATA_ENABLED;
+import static com.vci.frameworkcore.constant.FrameWorkLangCodeConstant.*;
+
+/**
+ * 鏂囦粨绠$悊鏈嶅姟
+ *
+ * @author weidy
+ * @date 2020-08-04
+ */
+@Service
+@VciChangeDocument(btmType = "fileVolume")
+public class VciFileVolumeServiceImpl implements VciFileVolumeServiceI {
+
+    /**
+    * 鏃ュ織
+    */
+    private Logger logger = LoggerFactory.getLogger(getClass());
+
+    /**
+    * 鏁版嵁鎿嶄綔灞�
+    */
+    @Resource
+    private VciFileVolumeDaoI vciFileVolumeMapper;
+
+    /**
+     * 骞冲彴璋冪敤鐨�
+     */
+    @Autowired
+    private PlatformClientUtil platformClientUtil;
+
+    /**
+     * 鏌ヨ鎵�鏈夌殑鏂囦粨绠$悊
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉鍜屾帓搴�
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 鏌ヨ鏉′欢鍜屽垎椤靛嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public DataGrid<VciFileVolumeVO> gridVciFileVolume(Map<String, String> conditionMap, PageHelper pageHelper) throws VciBaseException {
+        if (pageHelper == null) {
+            pageHelper = new PageHelper(-1);
+        }
+        VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(conditionMap,VciFileVolumeDO.class,pageHelper);
+        List<VciFileVolumeDO> doList = vciFileVolumeMapper.selectByWrapper(queryWrapper);
+        DataGrid<VciFileVolumeVO> dataGrid=new DataGrid<>();
+        if (!CollectionUtils.isEmpty(doList)) {
+            dataGrid.setData(vciFileVolumeDO2VOs(doList));
+            queryWrapper.clearPage();
+            dataGrid.setTotal(vciFileVolumeMapper.countByWrapper(queryWrapper));
+        }
+        return dataGrid;
+    }
+
+    /**
+     * 鎵归噺鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+     * @param vciFileVolumeDOs 鏁版嵁瀵硅薄鍒楄〃
+     * @return 鏄剧ず瀵硅薄
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呬笉瀛樺湪鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public List<VciFileVolumeVO> vciFileVolumeDO2VOs(Collection<VciFileVolumeDO>  vciFileVolumeDOs) throws VciBaseException {
+        List<VciFileVolumeVO> voList = new ArrayList<>();
+        if(!CollectionUtils.isEmpty(vciFileVolumeDOs)){
+            vciFileVolumeDOs.stream().forEach(s ->{
+                    VciFileVolumeVO vo =  vciFileVolumeDO2VO(s);
+                if(vo != null){
+                    voList.add(vo);
+                }
+            });
+        }
+        return voList;
+    }
+
+    /**
+     * 鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+     * @param  vciFileVolumeDO 鏁版嵁瀵硅薄
+     * @return 鏄剧ず瀵硅薄
+     * @throws VciBaseException 鎷疯礉灞炴�у嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public VciFileVolumeVO vciFileVolumeDO2VO(VciFileVolumeDO vciFileVolumeDO) throws VciBaseException {
+              VciFileVolumeVO vo = new VciFileVolumeVO();
+        if(vciFileVolumeDO != null){
+            BeanUtil.convert(vciFileVolumeDO,vo);
+
+            //杩橀渶瑕佸鐞嗘灇涓剧瓑鍏朵粬鐨勫唴瀹�
+            vo.setServiceOsTypeText(VciFileServiceOsTypeEnum.getTextByValue(vo.getServiceOsType()));
+            vo.setTransProtocolText(VciFileTransProtocolEnum.getTextByValue(vo.getTransProtocol()));
+        }
+        return vo;
+    }
+
+    /**
+     * 澧炲姞鏂囦粨绠$悊
+     * @param vciFileVolumeDTO 鏂囦粨绠$悊鏁版嵁浼犺緭瀵硅薄
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屽敮涓�椤癸紝蹇呰緭椤逛笉閫氳繃鏃朵細鎶涘嚭寮傚父
+     */
+    @Override
+    @VciChangeDocument(changeType = VciChangeDocumentTypeEnum.ADD)
+    public VciFileVolumeVO addSave(VciFileVolumeDTO vciFileVolumeDTO) throws VciBaseException {
+        VciBaseUtil.alertNotNull(vciFileVolumeDTO,"闇�瑕佹坊鍔犵殑鏁版嵁瀵硅薄");
+        //灏咲TO杞崲涓篋O
+        VciFileVolumeDO vciFileVolumeDO = new VciFileVolumeDO();
+        BeanUtil.convert(vciFileVolumeDTO,vciFileVolumeDO);
+        vciFileVolumeDO.setCurrentVolume("0");
+        int insert = vciFileVolumeMapper.insert(vciFileVolumeDO);
+        if(insert>0){
+            return vciFileVolumeDO2VO(vciFileVolumeDO);
+        }else{
+            throw new VciBaseException(FrameWorkLangCodeConstant.ADD_FAIL);
+        }
+    }
+
+    /**
+     * 淇敼鏂囦粨绠$悊
+     * @param vciFileVolumeDTO 鏂囦粨绠$悊鏁版嵁浼犺緭瀵硅薄
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屽敮涓�椤癸紝蹇呰緭椤逛笉閫氳繃鏃朵細鎶涘嚭寮傚父
+     */
+     @Override
+     @VciChangeDocument(changeType = VciChangeDocumentTypeEnum.EDIT)
+     public VciFileVolumeVO editSave(VciFileVolumeDTO vciFileVolumeDTO) throws VciBaseException {
+         VciBaseUtil.alertNotNull(vciFileVolumeDTO,"鏁版嵁瀵硅薄",vciFileVolumeDTO.getOid(),"鏂囦粨绠$悊涓婚敭");
+         //灏咲TO杞崲涓篋O
+         VciFileVolumeDO vciFileVolumeDO = selectByOid(vciFileVolumeDTO.getOid());
+         BeanUtil.convert(vciFileVolumeDTO,vciFileVolumeDO);
+         int update = vciFileVolumeMapper.updateByPrimaryKey(vciFileVolumeDO);
+         if(update>0){
+             return vciFileVolumeDO2VO(vciFileVolumeDO);
+         }else{
+             throw new VciBaseException(EDIT_FAIL);
+         }
+     }
+
+
+    /**
+     * 鏍¢獙鏄惁鍙互鍒犻櫎锛屽鏋滃瓨鍦ㄤ笅绾э紝骞朵笖涓嬬骇鏈夋暟鎹紩鐢ㄥ垯涓嶈兘鍒犻櫎
+     * @param vciFileVolumeDTO 鏁版嵁浼犺緭瀵硅薄
+     * @param vciFileVolumeDO 鏁版嵁搴撲腑鐨勬暟鎹璞�
+     * @return success涓簍rue涓哄彲浠ュ垹闄わ紝false琛ㄧず鏈夋暟鎹紩鐢紝obj涓簍rue琛ㄧず鏈変笅绾�
+     */
+    private BaseResult checkIsCanDeleteForDO(VciFileVolumeDTO vciFileVolumeDTO, VciFileVolumeDO vciFileVolumeDO) {
+        if(!checkIsLinked(vciFileVolumeDO.getOid())) {
+            return BaseResult.success();
+        }else{
+            return BaseResult.fail(DATA_LINKED_NOT_DELETE,new String[]{""});
+        }
+    }
+
+    /**
+    * 鏍¢獙鏄惁琚紩鐢�
+    * @param oid 涓婚敭
+    * @throws VciBaseException 琚紩鐢ㄧ殑鏃跺�欎細鎶涘嚭寮傚父
+    */
+    private boolean checkIsLinked(String oid) throws VciBaseException {
+        //TODO 娣诲姞闇�瑕佹牎楠屽紩鐢ㄧ殑鍦版柟
+        return false;
+    }
+
+    /**
+     * 鍒犻櫎鏂囦粨绠$悊
+     * @param vciFileVolumeDTO 鏂囦粨绠$悊鏁版嵁浼犺緭瀵硅薄锛宱id鍜宼s闇�瑕佷紶杈�
+     * @return 鍒犻櫎缁撴灉鍙嶉锛氾細success锛氭垚鍔燂紝fail锛氬け璐�
+     * @throws VciBaseException 鍙傛暟涓虹┖锛岃寮曠敤鏃舵姏鍑哄紓甯�
+     */
+    @Override
+    @VciChangeDocument(changeType = VciChangeDocumentTypeEnum.DELETE)
+    public BaseResult deleteVciFileVolume(VciFileVolumeDTO vciFileVolumeDTO) throws VciBaseException {
+        VciBaseUtil.alertNotNull(vciFileVolumeDTO,"鏂囦粨绠$悊鏁版嵁瀵硅薄",vciFileVolumeDTO.getOid(),"鏂囦粨绠$悊鐨勪富閿�");
+        VciFileVolumeDO vciFileVolumeDO = selectByOid(vciFileVolumeDTO.getOid());
+        BaseResult baseResult = checkIsCanDeleteForDO(vciFileVolumeDTO,vciFileVolumeDO);
+        if(baseResult.isSuccess()) {
+
+        }else{
+            return baseResult;
+        }
+        //鎵ц鍒犻櫎鎿嶄綔
+        return (vciFileVolumeMapper.deleteByPrimaryKey(vciFileVolumeDO.getOid()) > 0)? BaseResult.successMsg(DELETE_SUCCESS): BaseResult.fail(DELETE_FAIL);
+    }
+
+    /**
+    * 涓婚敭鑾峰彇鏂囦粨绠$悊
+    * @param oid 涓婚敭
+    * @return 鏂囦粨绠$悊鏄剧ず瀵硅薄
+    * @throws VciBaseException 鍙傛暟涓虹┖锛屾暟鎹笉瀛樺湪鏃朵細鎶涘嚭寮傚父
+    */
+    @Override
+    public VciFileVolumeVO getObjectByOid(String oid) throws VciBaseException {
+        return vciFileVolumeDO2VO(selectByOid(oid));
+    }
+
+    /**
+     * 缂栧彿鑾峰彇鏂囦粨绠$悊
+     *
+     * @param id 缂栧彿
+     * @return 鏂囦粨绠$悊鏄剧ず瀵硅薄
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屾暟鎹笉瀛樺湪鏃朵細鎶涘嚭寮傚父
+     */
+    @Override
+    public VciFileVolumeVO getObjectById(String id) throws VciBaseException {
+        return vciFileVolumeDO2VO(selectById(id));
+    }
+
+    /**
+     * 缂栧彿鏌ヨ鏁版嵁瀵硅薄
+     * @param id 缂栧彿
+     * @return  鏁版嵁瀵硅薄
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屽苟涓旀暟鎹笉瀛樺湪鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    private VciFileVolumeDO selectById(String id) throws VciBaseException {
+        VciBaseUtil.alertNotNull(id,"涓婚敭");
+        VciQueryWrapperForDO queryWrapperForDO = new VciQueryWrapperForDO(null,VciFileVolumeDO.class);
+        queryWrapperForDO.eq("plname",id);
+        List<VciFileVolumeDO> vciFileVolumeDOs = vciFileVolumeMapper.selectByWrapper(queryWrapperForDO);
+        if(CollectionUtils.isEmpty(vciFileVolumeDOs)){
+            throw new VciBaseException(DATA_ID_NOT_EXIST);
+        }
+        return vciFileVolumeDOs.get(0);
+    }
+
+    /**
+    * 涓婚敭鏌ヨ鏁版嵁瀵硅薄
+    * @param oid 涓婚敭
+    * @return  鏁版嵁瀵硅薄
+    * @throws VciBaseException 鍙傛暟涓虹┖锛屽苟涓旀暟鎹笉瀛樺湪鐨勬椂鍊欎細鎶涘嚭寮傚父
+    */
+    private VciFileVolumeDO selectByOid(String oid) throws VciBaseException {
+        VciBaseUtil.alertNotNull(oid,"涓婚敭");
+        VciFileVolumeDO vciFileVolumeDO = vciFileVolumeMapper.selectByPrimaryKey(oid.trim());
+        if(vciFileVolumeDO == null || StringUtils.isBlank(vciFileVolumeDO.getOid())){
+            throw new VciBaseException(DATA_OID_NOT_EXIST);
+        }
+        return vciFileVolumeDO;
+    }
+
+    /**
+     * 涓婚敭鎵归噺鑾峰彇鏂囦粨绠$悊
+     * @param oidCollections 涓婚敭闆嗗悎锛屼絾鏄彈鎬ц兘褰卞搷锛屽缓璁竴娆℃煡璇笉瓒呰繃10000涓�
+     * @return 鏂囦粨绠$悊鏄剧ず瀵硅薄
+     * @throws VciBaseException 鏌ヨ鍑虹幇寮傚父鏃朵細鎶涘嚭
+     */
+    @Override
+    public Collection<VciFileVolumeVO> listVciFileVolumeByOids(Collection<String> oidCollections) throws VciBaseException {
+        VciBaseUtil.alertCollectionNotNull("鏁版嵁瀵硅薄涓婚敭闆嗗悎",oidCollections);
+        List<VciFileVolumeDO> vciFileVolumeDOList = listVciFileVolumeDOByOidCollections(oidCollections);
+        return vciFileVolumeDO2VOs(vciFileVolumeDOList);
+    }
+
+    /**
+    * 浣跨敤涓婚敭闆嗗悎鏌ヨ鏁版嵁瀵硅薄
+    * @param oidCollections 涓婚敭鐨勯泦鍚�
+    * @return 鏁版嵁瀵硅薄鍒楄〃
+    */
+    private List<VciFileVolumeDO> listVciFileVolumeDOByOidCollections(Collection<String> oidCollections){
+        List<VciFileVolumeDO> vciFileVolumeDOList = new ArrayList<>();
+        if(!CollectionUtils.isEmpty(oidCollections)){
+            Collection<Collection<String>> oidCollectionsList = VciBaseUtil.switchCollectionForOracleIn(oidCollections);
+            oidCollectionsList.stream().forEach(oids ->{
+                List<VciFileVolumeDO> tempDOList =  vciFileVolumeMapper.selectByPrimaryKeyCollection(oids);
+                if(!CollectionUtils.isEmpty(tempDOList)){
+                    vciFileVolumeDOList.addAll(tempDOList);
+                }
+            });
+        }
+        return  vciFileVolumeDOList;
+    }
+
+    /**
+     * 鍚敤鏂囦粨绠$悊
+     * @param vciFileVolumeDTO 鏂囦粨绠$悊鏁版嵁浼犺緭瀵硅薄锛宱id鍜宼s闇�瑕佷紶杈�
+     * @return 鍚敤缁撴灉鍙嶉锛氾細success锛氭垚鍔燂紝fail锛氬け璐�
+     * @throws VciBaseException 鎵ц鍑虹幇寮傚父鏃朵細鎶涘嚭
+     */
+    @Override
+    @VciChangeDocument(changeType = VciChangeDocumentTypeEnum.LCSTATUS)
+    public BaseResult enableVciFileVolume(VciFileVolumeDTO vciFileVolumeDTO) throws VciBaseException {
+        return changeLcStatus(vciFileVolumeDTO,false);
+    }
+
+    /**
+     * 鍋滅敤{comments}
+     * @param vciFileVolumeDTO 鏂囦粨绠$悊鏁版嵁浼犺緭瀵硅薄锛宱id鍜宼s闇�瑕佷紶杈�
+     * @return 鍋滅敤缁撴灉鍙嶉锛氾細success锛氭垚鍔燂紝fail锛氬け璐�
+     * @throws VciBaseException 鎵ц鍑虹幇寮傚父鏃朵細鎶涘嚭
+     */
+    @Override
+    @VciChangeDocument(changeType = VciChangeDocumentTypeEnum.LCSTATUS)
+    public BaseResult disableVciFileVolume(VciFileVolumeDTO vciFileVolumeDTO) throws VciBaseException {
+        return changeLcStatus(vciFileVolumeDTO,true);
+    }
+
+    /**
+     * 淇敼鐢熷懡鍛ㄦ湡鐨勭姸鎬侊紝濡傚仠鐢ㄥ拰鍚敤
+     * @param vciFileVolumeDTO 鏂囦粨绠$悊鏁版嵁浼犺緭瀵硅薄锛屽繀椤昏鏈塷id鍜宼s
+     * @param disable 鏄惁涓哄仠鐢�
+     * @return 鎵ц鐨勭粨鏋�
+     */
+    private BaseResult changeLcStatus(VciFileVolumeDTO vciFileVolumeDTO, boolean disable){
+        VciBaseUtil.alertNotNull(vciFileVolumeDTO,"鏁版嵁瀵硅薄",vciFileVolumeDTO.getOid(),"涓婚敭");
+        VciFileVolumeDO vciFileVolumeDO = selectByOid(vciFileVolumeDTO.getOid());
+        //鑰佺殑椤圭洰鐨勭姸鎬佸�间笉涓�鏍�
+        return BaseResult.success();
+    }
+
+
+    /**
+     * 鍙傜収鏂囦粨绠$悊鍒楄〃
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉鍜屾帓搴�
+     * @return 鏂囦粨绠$悊鏄剧ず瀵硅薄鍒楄〃锛岀敓鏁堢殑鍐呭
+     * @throws VciBaseException 鏌ヨ鏉′欢鍜屽垎椤靛嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public DataGrid<VciFileVolumeVO> refDataGridVciFileVolume(Map<String, String> conditionMap, PageHelper pageHelper) throws VciBaseException {
+        if(conditionMap == null){
+            conditionMap = new HashMap<>();
+        }
+        conditionMap.put("lcStatus", FRAMEWORK_DATA_ENABLED);
+        return gridVciFileVolume(conditionMap,pageHelper);
+    }
+
+    /**
+     * 鏌ヨ鍏ㄩ儴
+     *
+     * @return 鏂囦粨
+     * @throws VciBaseException 鏌ヨ浼氭姏鍑哄紓甯�
+     */
+    @Override
+    public List<VciFileVolumeDO> selectAll() throws VciBaseException {
+        return vciFileVolumeMapper.selectAll();
+    }
+
+    /**
+     * 鏇存柊鍗风殑浣跨敤瀹归噺
+     *
+     * @param oid        涓婚敭
+     * @param usedVolume 浣跨敤瀹归噺
+     * @return 鍙楀奖鍝嶇殑琛屾暟
+     */
+    @Override
+    public synchronized int updateUsedVolume(String oid, long usedVolume) {
+        VciBaseUtil.alertNotNull(oid,"涓婚敭");
+        return vciFileVolumeMapper.updateUsedVolume(oid,String.valueOf(usedVolume));
+    }
+
+    /**
+     * 鑾峰彇涓婁紶鐨勯粯璁ゅ嵎
+     * @return 鍗峰璞�
+     */
+    @Override
+    public VciFileVolumeDO getUploadVolume(){
+//        try {
+//            PvolumeInfo volumeInfo = platformClientUtil.getLogonFactoryService().getFrameworkService().getIsvalidVolumeName();
+//            VciFileVolumeDO fileVolumeDO = new VciFileVolumeDO();
+//            fileVolumeDO.setOid(volumeInfo.id);
+//            fileVolumeDO.setId(volumeInfo.name);
+//            fileVolumeDO.setName(volumeInfo.service);
+//            fileVolumeDO.setServiceUrl(volumeInfo.host);
+//            fileVolumeDO.setVolumePath(volumeInfo.path);
+//            fileVolumeDO.setServiceOsType(volumeInfo.type+"");
+//            return fileVolumeDO;
+            return null;
+//        } catch (VCIError vciError) {
+//            throw WebUtil.getVciBaseException(vciError);
+//        }
+    }
+
+
+}
+
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/VciMdServiceImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/VciMdServiceImpl.java
new file mode 100644
index 0000000..adeb77c
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/VciMdServiceImpl.java
@@ -0,0 +1,136 @@
+package com.vci.web.service.impl;
+
+import com.vci.starter.web.pagemodel.Tree;
+import com.vci.starter.web.util.LocalFileUtil;
+import com.vci.web.service.VciMdServiceI;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.ResourceUtils;
+
+import java.io.*;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * markdown鐨勬湇鍔�
+ * @author weidy
+ * @date 2021/3/16
+ */
+@Service
+public class VciMdServiceImpl implements VciMdServiceI {
+
+    /**
+     * 鏃ュ織
+     */
+    private Logger logger = LoggerFactory.getLogger(getClass());
+
+    /**
+     * 鏂囨。鏂囦欢璺緞鍜屾爣棰樼殑鏄犲皠
+     */
+    private static Map<String,String> markDownFileMap = new ConcurrentHashMap<>();
+    /**
+     * 鎵弿鎵�鏈夌殑md鏂囦欢
+     */
+    @Override
+    public void scanAllMdFile() {
+        String jarFilePath = null;
+        //杩欎釜鏄湪杩愯鐜
+        jarFilePath = LocalFileUtil.getProjectFolder(getClass()) + File.separator + "md";
+        if(StringUtils.isNotBlank(jarFilePath)){
+            File folder = new File(jarFilePath);
+            if(folder.exists()){
+                File[] files = folder.listFiles();
+                for(File file : files){
+                    readFromFile(file);
+                }
+            }
+        }
+        if(CollectionUtils.isEmpty(markDownFileMap)){
+            URL resource = null;
+            try {//杩欎釜鏄湪寮�鍙戠幆澧�
+                resource = ResourceUtils.getURL("classpath:md");
+            } catch (FileNotFoundException e) {
+            }
+            if(resource!=null){
+                File folder = new File(resource.getPath() );
+                if(folder.exists()){
+                    File[] files = folder.listFiles();
+                    for(File file : files){
+                        readFromFile(file);
+                    }
+                }
+            }
+        }
+//        //鐪嬬湅澶栫疆鐨勬枃浠跺す
+//        File folder = new File(LocalFileUtil.getProjectFolder() +File.separator + "md");
+//        if(folder.exists()){
+//            File[] files = folder.listFiles();
+//            for(File file : files){
+//                readFromFile(file);
+//            }
+//        }
+    }
+
+    /**
+     * 浠庢枃浠朵腑璇诲彇
+     * @param file 鏂囦欢
+     */
+    private void readFromFile(File file){
+        String fileName = file.getName();
+        RandomAccessFile  raf = null;
+        String title = "";
+        try{
+            raf = new RandomAccessFile(file,"r");
+            title = raf.readLine();
+        } catch (IOException e  ) {
+            if(logger.isErrorEnabled()){
+                logger.error("璇诲彇鏂囦欢",e);
+            }
+        } finally {
+            if(raf!=null){
+                try {
+                    raf.close();
+                } catch (IOException e) {
+                    if(logger.isErrorEnabled()){
+                        logger.error("鍏抽棴鏂囦欢",e);
+                    }
+                }
+            }
+        }
+        try {
+            title = title==null?"":new String(title.getBytes("ISO-8859-1"),"utf-8").replace("#","");
+        } catch (UnsupportedEncodingException e) {
+            if(logger.isErrorEnabled()){
+                logger.error("杞崲鏍囬",e);
+            }
+        }
+        markDownFileMap.put(fileName,title);
+    }
+
+    /**
+     * 鑾峰彇md鏂囦欢鐨勫悕瀛�
+     *
+     * @return 鍚嶇О鐨勬爲褰㈠睍绀�
+     */
+    @Override
+    public List<Tree> treeAllMD() {
+        List<Tree> treeList = new ArrayList<>();
+        markDownFileMap.forEach((fileName,title)->{
+            Tree tree = new Tree();
+            tree.setOid(fileName);
+            if(StringUtils.isNotBlank(title)){
+                tree.setText(title);
+            }else{
+                tree.setText(fileName);
+            }
+            treeList.add(tree);
+        });
+        return treeList;
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WFWorkflowNodeFavItemServiceImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WFWorkflowNodeFavItemServiceImpl.java
new file mode 100644
index 0000000..7778641
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WFWorkflowNodeFavItemServiceImpl.java
@@ -0,0 +1,289 @@
+package com.vci.web.service.impl;
+
+import com.vci.starter.revision.service.RevisionModelUtil;
+import com.vci.starter.web.annotation.bus.VciChangeDocument;
+import com.vci.starter.web.enumpck.VciChangeDocumentTypeEnum;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.BaseResult;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.starter.web.util.BeanUtil;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.starter.web.wrapper.VciQueryWrapperForDO;
+import com.vci.web.dao.WFWorkflowNodeFavItemDaoI;
+import com.vci.web.dto.WFWorkflowNodeFavItemDTO;
+import com.vci.web.model.WFWorkflowNodeFavItemDO;
+import com.vci.web.pageModel.BatchCBO;
+import com.vci.web.pageModel.WFWorkflowNodeFavItemVO;
+import com.vci.web.service.WFWorkflowNodeFavItemServiceI;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import javax.annotation.Resource;
+import java.util.*;
+
+import static com.vci.frameworkcore.constant.FrameWorkLangCodeConstant.*;
+
+/**
+ * 娴佺▼鏀惰棌鑺傜偣鏄庣粏鏈嶅姟
+ *
+ * @author weidy
+ * @date 2021-06-08
+ */
+@Service
+@VciChangeDocument(btmType = "wfWorkflowNodeItem")
+public class WFWorkflowNodeFavItemServiceImpl implements WFWorkflowNodeFavItemServiceI {
+    /**
+     * 鏃ュ織
+     */
+    private Logger logger = LoggerFactory.getLogger(getClass());
+
+    /**
+     * 鏁版嵁鎿嶄綔灞�
+     */
+    @Resource
+    private WFWorkflowNodeFavItemDaoI wFWorkflowNodeFavItemMapper;
+
+    /**
+     * 鐗堟湰鍜屾暟鎹璞″伐鍏风被
+     */
+    @Autowired
+    private RevisionModelUtil revisionModelUtil;
+
+    /**
+     * 鏌ヨ鎵�鏈夌殑娴佺▼鏀惰棌鑺傜偣鏄庣粏
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉鍜屾帓搴�
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 鏌ヨ鏉′欢鍜屽垎椤靛嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public DataGrid<WFWorkflowNodeFavItemVO> gridWFWorkflowNodeFavItem(Map<String, String> conditionMap, PageHelper pageHelper) throws VciBaseException{
+        if (pageHelper == null) {
+            pageHelper = new PageHelper(-1);
+        }
+        pageHelper.addDefaultDesc("createTime");
+        VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(conditionMap,WFWorkflowNodeFavItemDO.class,pageHelper);
+        List<WFWorkflowNodeFavItemDO> doList = wFWorkflowNodeFavItemMapper.selectByWrapper(queryWrapper);
+        DataGrid<WFWorkflowNodeFavItemVO> dataGrid=new DataGrid<>();
+        if (!CollectionUtils.isEmpty(doList)) {
+            dataGrid.setData(wFWorkflowNodeFavItemDO2VOs(doList));
+            queryWrapper.clearPage();
+            dataGrid.setTotal(wFWorkflowNodeFavItemMapper.countByWrapper(queryWrapper));
+        }
+        return dataGrid;
+    }
+
+    /**
+     * 鎵归噺鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+     * @param wFWorkflowNodeFavItemDOs 鏁版嵁瀵硅薄鍒楄〃
+     * @return 鏄剧ず瀵硅薄
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呬笉瀛樺湪鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public List<WFWorkflowNodeFavItemVO> wFWorkflowNodeFavItemDO2VOs(Collection<WFWorkflowNodeFavItemDO> wFWorkflowNodeFavItemDOs) throws VciBaseException{
+        List<WFWorkflowNodeFavItemVO> voList = new ArrayList<>();
+        if(!CollectionUtils.isEmpty(wFWorkflowNodeFavItemDOs)){
+            wFWorkflowNodeFavItemDOs.stream().forEach(s ->{
+                WFWorkflowNodeFavItemVO vo =  wFWorkflowNodeFavItemDO2VO(s);
+                if(vo != null){
+                    voList.add(vo);
+                }
+            });
+        }
+        return voList;
+    }
+
+    /**
+     * 鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+     * @param  wFWorkflowNodeFavItemDO 鏁版嵁瀵硅薄
+     * @return 鏄剧ず瀵硅薄
+     * @throws VciBaseException 鎷疯礉灞炴�у嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public  WFWorkflowNodeFavItemVO wFWorkflowNodeFavItemDO2VO(WFWorkflowNodeFavItemDO wFWorkflowNodeFavItemDO) throws VciBaseException{
+        WFWorkflowNodeFavItemVO vo = new WFWorkflowNodeFavItemVO();
+        if(wFWorkflowNodeFavItemDO != null){
+            BeanUtil.convert(wFWorkflowNodeFavItemDO,vo);
+            //杩橀渶瑕佸鐞嗘灇涓剧瓑鍏朵粬鐨勫唴瀹�
+        }
+        return vo;
+    }
+
+    /**
+     * 澧炲姞娴佺▼鏀惰棌鑺傜偣鏄庣粏
+     * @param wFWorkflowNodeFavItemDTO 娴佺▼鏀惰棌鑺傜偣鏄庣粏鏁版嵁浼犺緭瀵硅薄
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屽敮涓�椤癸紝蹇呰緭椤逛笉閫氳繃鏃朵細鎶涘嚭寮傚父
+     */
+    @Override
+    @Transactional
+    @VciChangeDocument(changeType = VciChangeDocumentTypeEnum.ADD)
+    public WFWorkflowNodeFavItemVO addSave(WFWorkflowNodeFavItemDTO wFWorkflowNodeFavItemDTO) throws VciBaseException{
+        VciBaseUtil.alertNotNull(wFWorkflowNodeFavItemDTO,"闇�瑕佹坊鍔犵殑鏁版嵁瀵硅薄");
+        //灏咲TO杞崲涓篋O
+        WFWorkflowNodeFavItemDO wFWorkflowNodeFavItemDO = new WFWorkflowNodeFavItemDO();
+        BeanUtil.convert(wFWorkflowNodeFavItemDTO,wFWorkflowNodeFavItemDO);
+
+        revisionModelUtil.wrapperForAdd(wFWorkflowNodeFavItemDO);
+        BatchCBO batchCBO = wFWorkflowNodeFavItemMapper.insert(wFWorkflowNodeFavItemDO);
+        if(batchCBO.getCreateCbos().size() > 0){
+            return wFWorkflowNodeFavItemDO2VO(wFWorkflowNodeFavItemDO);
+        }else{
+            throw new VciBaseException(ADD_FAIL);
+        }
+    }
+
+    /**
+     * 淇敼娴佺▼鏀惰棌鑺傜偣鏄庣粏
+     * @param wFWorkflowNodeFavItemDTO 娴佺▼鏀惰棌鑺傜偣鏄庣粏鏁版嵁浼犺緭瀵硅薄
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屽敮涓�椤癸紝蹇呰緭椤逛笉閫氳繃鏃朵細鎶涘嚭寮傚父
+     */
+    @Override
+    @VciChangeDocument(changeType = VciChangeDocumentTypeEnum.EDIT)
+    @Transactional
+    public WFWorkflowNodeFavItemVO editSave(WFWorkflowNodeFavItemDTO wFWorkflowNodeFavItemDTO) throws VciBaseException{
+        VciBaseUtil.alertNotNull(wFWorkflowNodeFavItemDTO,"鏁版嵁瀵硅薄",wFWorkflowNodeFavItemDTO.getOid(),"娴佺▼鏀惰棌鑺傜偣鏄庣粏涓婚敭");
+        //灏咲TO杞崲涓篋O
+        WFWorkflowNodeFavItemDO wFWorkflowNodeFavItemDO = selectByOid(wFWorkflowNodeFavItemDTO.getOid());
+        revisionModelUtil.copyFromDTO(wFWorkflowNodeFavItemDTO,wFWorkflowNodeFavItemDO);
+        revisionModelUtil.wrapperForEdit(wFWorkflowNodeFavItemDO);
+        BatchCBO batchCBO = wFWorkflowNodeFavItemMapper.updateByPrimaryKey(wFWorkflowNodeFavItemDO);
+        int update = batchCBO.getUpdateCbos().size();
+        if(update>0){
+            return wFWorkflowNodeFavItemDO2VO(wFWorkflowNodeFavItemDO);
+        }else{
+            throw new VciBaseException(EDIT_FAIL);
+        }
+    }
+
+
+    /**
+     * 鏍¢獙鏄惁鍙互鍒犻櫎锛屽鏋滃瓨鍦ㄤ笅绾э紝骞朵笖涓嬬骇鏈夋暟鎹紩鐢ㄥ垯涓嶈兘鍒犻櫎
+     * @param wFWorkflowNodeFavItemDTO 鏁版嵁浼犺緭瀵硅薄
+     * @param wFWorkflowNodeFavItemDO 鏁版嵁搴撲腑鐨勬暟鎹璞�
+     * @return success涓簍rue涓哄彲浠ュ垹闄わ紝false琛ㄧず鏈夋暟鎹紩鐢紝obj涓簍rue琛ㄧず鏈変笅绾�
+     */
+    private BaseResult checkIsCanDeleteForDO(WFWorkflowNodeFavItemDTO wFWorkflowNodeFavItemDTO, WFWorkflowNodeFavItemDO wFWorkflowNodeFavItemDO) {
+        revisionModelUtil.checkTs(wFWorkflowNodeFavItemDTO.getTs(),wFWorkflowNodeFavItemDO.getTs());
+        if(!checkIsLinked(wFWorkflowNodeFavItemDO.getOid())) {
+            return BaseResult.success();
+        }else{
+            return BaseResult.fail(DATA_LINKED_NOT_DELETE,new String[]{""});
+        }
+    }
+
+    /**
+     * 鏍¢獙鏄惁琚紩鐢�
+     * @param oid 涓婚敭
+     * @throws VciBaseException 琚紩鐢ㄧ殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    private boolean checkIsLinked(String oid) throws VciBaseException{
+        //TODO 娣诲姞闇�瑕佹牎楠屽紩鐢ㄧ殑鍦版柟
+        return false;
+    }
+
+    /**
+     * 鍒犻櫎娴佺▼鏀惰棌鑺傜偣鏄庣粏
+     * @param wFWorkflowNodeFavItemDTO 娴佺▼鏀惰棌鑺傜偣鏄庣粏鏁版嵁浼犺緭瀵硅薄锛宱id鍜宼s闇�瑕佷紶杈�
+     * @return 鍒犻櫎缁撴灉鍙嶉锛氾細success锛氭垚鍔燂紝fail锛氬け璐�
+     * @throws VciBaseException 鍙傛暟涓虹┖锛岃寮曠敤鏃舵姏鍑哄紓甯�
+     */
+    @Override
+    @VciChangeDocument(changeType = VciChangeDocumentTypeEnum.DELETE)
+    @Transactional
+    public BaseResult deleteWFWorkflowNodeFavItem(WFWorkflowNodeFavItemDTO wFWorkflowNodeFavItemDTO) throws VciBaseException{
+        VciBaseUtil.alertNotNull(wFWorkflowNodeFavItemDTO,"娴佺▼鏀惰棌鑺傜偣鏄庣粏鏁版嵁瀵硅薄",wFWorkflowNodeFavItemDTO.getOid(),"娴佺▼鏀惰棌鑺傜偣鏄庣粏鐨勪富閿�");
+        WFWorkflowNodeFavItemDO wFWorkflowNodeFavItemDO = selectByOid(wFWorkflowNodeFavItemDTO.getOid());
+        BaseResult baseResult = checkIsCanDeleteForDO(wFWorkflowNodeFavItemDTO,wFWorkflowNodeFavItemDO);
+        if(baseResult.isSuccess()) {
+        }else{
+            return baseResult;
+        }
+        //鎵ц鍒犻櫎鎿嶄綔
+        BatchCBO batchCBO = wFWorkflowNodeFavItemMapper.deleteByPrimaryKey(wFWorkflowNodeFavItemDO.getOid());
+        int delete = batchCBO.getDeleteCbos().size();
+        return (delete > 0)?BaseResult.successMsg(DELETE_SUCCESS):BaseResult.fail(DELETE_FAIL);
+    }
+
+    /**
+     * 涓婚敭鑾峰彇娴佺▼鏀惰棌鑺傜偣鏄庣粏
+     * @param oid 涓婚敭
+     * @return 娴佺▼鏀惰棌鑺傜偣鏄庣粏鏄剧ず瀵硅薄
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屾暟鎹笉瀛樺湪鏃朵細鎶涘嚭寮傚父
+     */
+    @Override
+    public  WFWorkflowNodeFavItemVO getObjectByOid(String oid) throws VciBaseException{
+        return wFWorkflowNodeFavItemDO2VO(selectByOid(oid));
+    }
+
+    /**
+     * 涓婚敭鏌ヨ鏁版嵁瀵硅薄
+     * @param oid 涓婚敭
+     * @return  鏁版嵁瀵硅薄
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屽苟涓旀暟鎹笉瀛樺湪鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    private WFWorkflowNodeFavItemDO selectByOid(String oid) throws VciBaseException{
+        VciBaseUtil.alertNotNull(oid,"涓婚敭");
+        WFWorkflowNodeFavItemDO wFWorkflowNodeFavItemDO = wFWorkflowNodeFavItemMapper.selectByPrimaryKey(oid.trim());
+        if(wFWorkflowNodeFavItemDO == null || StringUtils.isBlank(wFWorkflowNodeFavItemDO.getOid())){
+            throw new VciBaseException(DATA_OID_NOT_EXIST);
+        }
+        return wFWorkflowNodeFavItemDO;
+    }
+
+    /**
+     * 涓婚敭鎵归噺鑾峰彇娴佺▼鏀惰棌鑺傜偣鏄庣粏
+     * @param oidCollections 涓婚敭闆嗗悎锛屼絾鏄彈鎬ц兘褰卞搷锛屽缓璁竴娆℃煡璇笉瓒呰繃10000涓�
+     * @return 娴佺▼鏀惰棌鑺傜偣鏄庣粏鏄剧ず瀵硅薄
+     * @throws VciBaseException 鏌ヨ鍑虹幇寮傚父鏃朵細鎶涘嚭
+     */
+    @Override
+    public Collection<WFWorkflowNodeFavItemVO> listWFWorkflowNodeFavItemByOids(Collection<String> oidCollections) throws VciBaseException{
+        VciBaseUtil.alertNotNull(oidCollections,"鏁版嵁瀵硅薄涓婚敭闆嗗悎");
+        List<WFWorkflowNodeFavItemDO> wFWorkflowNodeFavItemDOList = listWFWorkflowNodeFavItemDOByOidCollections(oidCollections);
+        return wFWorkflowNodeFavItemDO2VOs(wFWorkflowNodeFavItemDOList);
+    }
+
+    /**
+     * 浣跨敤涓婚敭闆嗗悎鏌ヨ鏁版嵁瀵硅薄
+     * @param oidCollections 涓婚敭鐨勯泦鍚�
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+    private List<WFWorkflowNodeFavItemDO> listWFWorkflowNodeFavItemDOByOidCollections(Collection<String> oidCollections){
+        List<WFWorkflowNodeFavItemDO> wFWorkflowNodeFavItemDOList = new ArrayList<>();
+        if(!CollectionUtils.isEmpty(oidCollections)){
+            Collection<Collection<String>> oidCollectionsList = VciBaseUtil.switchCollectionForOracleIn(oidCollections);
+            oidCollectionsList.stream().forEach(oids ->{
+                List<WFWorkflowNodeFavItemDO> tempDOList =  wFWorkflowNodeFavItemMapper.selectByPrimaryKeyCollection(oids);
+                if(!CollectionUtils.isEmpty(tempDOList)){
+                    wFWorkflowNodeFavItemDOList.addAll(tempDOList);
+                }
+            });
+        }
+        return  wFWorkflowNodeFavItemDOList;
+    }
+
+
+
+    /**
+     * 鍙傜収娴佺▼鏀惰棌鑺傜偣鏄庣粏鍒楄〃
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉鍜屾帓搴�
+     * @return 娴佺▼鏀惰棌鑺傜偣鏄庣粏鏄剧ず瀵硅薄鍒楄〃锛岀敓鏁堢殑鍐呭
+     * @throws VciBaseException 鏌ヨ鏉′欢鍜屽垎椤靛嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public DataGrid<WFWorkflowNodeFavItemVO> refDataGridWFWorkflowNodeFavItem(Map<String, String> conditionMap, PageHelper pageHelper) throws VciBaseException{
+        if(conditionMap == null){
+            conditionMap = new HashMap<>();
+        }
+        return gridWFWorkflowNodeFavItem(conditionMap,pageHelper);
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WFWorkflowNodeFavServiceImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WFWorkflowNodeFavServiceImpl.java
new file mode 100644
index 0000000..e9375d0
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WFWorkflowNodeFavServiceImpl.java
@@ -0,0 +1,373 @@
+package com.vci.web.service.impl;
+
+import com.vci.starter.revision.service.RevisionModelUtil;
+import com.vci.starter.web.annotation.bus.VciChangeDocument;
+import com.vci.starter.web.enumpck.VciChangeDocumentTypeEnum;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.BaseResult;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.starter.web.util.BeanUtil;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.starter.web.wrapper.VciQueryWrapperForDO;
+import com.vci.web.dao.WFWorkflowNodeFavDaoI;
+import com.vci.web.dao.WFWorkflowNodeFavItemDaoI;
+import com.vci.web.dto.WFWorkflowNodeFavDTO;
+import com.vci.web.model.WFWorkflowNodeFavDO;
+import com.vci.web.model.WFWorkflowNodeFavItemDO;
+import com.vci.web.pageModel.BatchCBO;
+import com.vci.web.pageModel.WFWorkflowNodeFavItemVO;
+import com.vci.web.pageModel.WFWorkflowNodeFavVO;
+import com.vci.web.service.WFWorkflowNodeFavItemServiceI;
+import com.vci.web.service.WFWorkflowNodeFavServiceI;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static com.vci.frameworkcore.constant.FrameWorkLangCodeConstant.*;
+
+/**
+ * 娴佺▼璐熻矗浜烘敹钘忔湇鍔�
+ *
+ * @author weidy
+ * @date 2021-06-08
+ */
+@Service
+@VciChangeDocument(btmType = "wfWorkflowNodeFav")
+public class WFWorkflowNodeFavServiceImpl implements WFWorkflowNodeFavServiceI {
+
+    /**
+     * 鏃ュ織
+     */
+    private Logger logger = LoggerFactory.getLogger(getClass());
+
+    /**
+     * 鏁版嵁鎿嶄綔灞�
+     */
+    @Resource
+    private WFWorkflowNodeFavDaoI wFWorkflowNodeFavMapper;
+
+    /**
+     * 鑺傜偣鏀惰棌鐨勬槑缁�
+     */
+    @Resource
+    private WFWorkflowNodeFavItemDaoI nodeFavItemMapper;
+
+    /**
+     * 鐗堟湰鍜屾暟鎹璞″伐鍏风被
+     */
+    @Autowired
+    private RevisionModelUtil revisionModelUtil;
+
+    /**
+     * 鏄庣粏鍐呭鐨勬湇鍔�
+     */
+    @Autowired
+    private WFWorkflowNodeFavItemServiceI nodeFavItemService;
+
+    /**
+     * 鏌ヨ鎵�鏈夌殑娴佺▼璐熻矗浜烘敹钘�
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉鍜屾帓搴�
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 鏌ヨ鏉′欢鍜屽垎椤靛嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public DataGrid<WFWorkflowNodeFavVO> gridWFWorkflowNodeFav(Map<String, String> conditionMap, PageHelper pageHelper) throws VciBaseException{
+        if (pageHelper == null) {
+            pageHelper = new PageHelper(-1);
+        }
+        pageHelper.addDefaultDesc("createTime");
+        VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(conditionMap, WFWorkflowNodeFavDO.class,pageHelper);
+        List<WFWorkflowNodeFavDO> doList = wFWorkflowNodeFavMapper.selectByWrapper(queryWrapper);
+        DataGrid<WFWorkflowNodeFavVO> dataGrid=new DataGrid<>();
+        if (!CollectionUtils.isEmpty(doList)) {
+            dataGrid.setData(wFWorkflowNodeFavDO2VOs(doList));
+            queryWrapper.clearPage();
+            dataGrid.setTotal(wFWorkflowNodeFavMapper.countByWrapper(queryWrapper));
+        }
+        return dataGrid;
+    }
+
+    /**
+     * 鎵归噺鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+     * @param wFWorkflowNodeFavDOs 鏁版嵁瀵硅薄鍒楄〃
+     * @return 鏄剧ず瀵硅薄
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呬笉瀛樺湪鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public List<WFWorkflowNodeFavVO> wFWorkflowNodeFavDO2VOs(Collection<WFWorkflowNodeFavDO> wFWorkflowNodeFavDOs) throws VciBaseException{
+        List<WFWorkflowNodeFavVO> voList = new ArrayList<>();
+        if(!CollectionUtils.isEmpty(wFWorkflowNodeFavDOs)){
+            wFWorkflowNodeFavDOs.stream().forEach(s ->{
+                WFWorkflowNodeFavVO vo =  wFWorkflowNodeFavDO2VO(s);
+                if(vo != null){
+                    voList.add(vo);
+                }
+            });
+        }
+        return voList;
+    }
+
+    /**
+     * 鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+     * @param  wFWorkflowNodeFavDO 鏁版嵁瀵硅薄
+     * @return 鏄剧ず瀵硅薄
+     * @throws VciBaseException 鎷疯礉灞炴�у嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public  WFWorkflowNodeFavVO wFWorkflowNodeFavDO2VO(WFWorkflowNodeFavDO wFWorkflowNodeFavDO) throws VciBaseException{
+        WFWorkflowNodeFavVO vo = new WFWorkflowNodeFavVO();
+        if(wFWorkflowNodeFavDO != null){
+            BeanUtil.convert(wFWorkflowNodeFavDO,vo);
+            //杩橀渶瑕佸鐞嗘灇涓剧瓑鍏朵粬鐨勫唴瀹�
+        }
+        return vo;
+    }
+
+    /**
+     * 澧炲姞娴佺▼璐熻矗浜烘敹钘�
+     * @param wFWorkflowNodeFavDTO 娴佺▼璐熻矗浜烘敹钘忔暟鎹紶杈撳璞�
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屽敮涓�椤癸紝蹇呰緭椤逛笉閫氳繃鏃朵細鎶涘嚭寮傚父
+     */
+    @Override
+    @Transactional
+    @VciChangeDocument(changeType = VciChangeDocumentTypeEnum.ADD)
+    public WFWorkflowNodeFavVO addSave(WFWorkflowNodeFavDTO wFWorkflowNodeFavDTO) throws VciBaseException{
+        VciBaseUtil.alertNotNull(wFWorkflowNodeFavDTO,"闇�瑕佹坊鍔犵殑鏁版嵁瀵硅薄",wFWorkflowNodeFavDTO.getName(),"鏂规鐨勫悕绉�",
+                wFWorkflowNodeFavDTO.getItems(),"鏂规鐨勫唴瀹�",wFWorkflowNodeFavDTO.getId(),"娴佺▼妯℃澘鐨勪富閿�",wFWorkflowNodeFavDTO.getWfTemplateRev(),"娴佺▼妯℃澘鐨勭増鏈�");
+        //鍒ゆ柇鍚嶇О鏄惁瀛樺湪
+        String userId = VciBaseUtil.getCurrentUserId();
+        WFWorkflowNodeFavDO favDO = wFWorkflowNodeFavMapper.selectByName(wFWorkflowNodeFavDTO.getName(), userId,wFWorkflowNodeFavDTO.getId(),wFWorkflowNodeFavDTO.getWfTemplateRev());
+        List<WFWorkflowNodeFavItemDO> newItems = new ArrayList<>();
+        List<WFWorkflowNodeFavItemDO> itemDOS = null;
+
+        if(favDO!=null && StringUtils.isNotBlank(favDO.getOid())){
+            //璇存槑宸茬粡瀛樺湪锛岄渶瑕佷慨鏀�
+            //鏂规鏈韩鍏跺疄娌℃湁浠讳綍闇�瑕佷慨鏀圭殑锛�
+            revisionModelUtil.wrapperForEdit(favDO);
+            //闇�瑕侀噸鏂板鐞嗘槑缁�
+            itemDOS = nodeFavItemMapper.selectBySchemaOid(favDO.getOid());
+            wFWorkflowNodeFavMapper.updateByPrimaryKey(favDO);
+        }else{
+            //灏咲TO杞崲涓篋O
+            WFWorkflowNodeFavDO wFWorkflowNodeFavDO = new WFWorkflowNodeFavDO();
+            BeanUtil.convert(wFWorkflowNodeFavDTO,wFWorkflowNodeFavDO);
+            wFWorkflowNodeFavDO.setUserId(userId);
+            revisionModelUtil.wrapperForAdd(wFWorkflowNodeFavDO);
+            wFWorkflowNodeFavMapper.insert(wFWorkflowNodeFavDO);
+            favDO = wFWorkflowNodeFavDO;
+        }
+        String schemaOid = favDO.getOid();
+        wFWorkflowNodeFavDTO.getItems().stream().forEach(item->{
+            WFWorkflowNodeFavItemDO itemDO = new WFWorkflowNodeFavItemDO();
+            BeanUtil.convert(item,itemDO);
+            itemDO.setWorkflowNodeFavOid(schemaOid);
+            newItems.add(itemDO);
+        });
+        revisionModelUtil.wrapperForBatchAdd(newItems);
+        nodeFavItemMapper.batchInsert(newItems);
+        if(!CollectionUtils.isEmpty(itemDOS)){
+            nodeFavItemMapper.batchDeleteByOids(itemDOS.stream().map(WFWorkflowNodeFavItemDO::getOid).collect(Collectors.toList()));
+        }
+        return wFWorkflowNodeFavDO2VO(favDO);
+    }
+
+    /**
+     * 淇敼娴佺▼璐熻矗浜烘敹钘�
+     * @param wFWorkflowNodeFavDTO 娴佺▼璐熻矗浜烘敹钘忔暟鎹紶杈撳璞�
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屽敮涓�椤癸紝蹇呰緭椤逛笉閫氳繃鏃朵細鎶涘嚭寮傚父
+     */
+    @Override
+    @VciChangeDocument(changeType = VciChangeDocumentTypeEnum.EDIT)
+    @Transactional
+    public WFWorkflowNodeFavVO editSave(WFWorkflowNodeFavDTO wFWorkflowNodeFavDTO) throws VciBaseException{
+        VciBaseUtil.alertNotNull(wFWorkflowNodeFavDTO,"鏁版嵁瀵硅薄",wFWorkflowNodeFavDTO.getOid(),"娴佺▼璐熻矗浜烘敹钘忎富閿�");
+        //灏咲TO杞崲涓篋O
+        WFWorkflowNodeFavDO wFWorkflowNodeFavDO = selectByOid(wFWorkflowNodeFavDTO.getOid());
+        wFWorkflowNodeFavDO.setName(wFWorkflowNodeFavDTO.getName());
+        revisionModelUtil.wrapperForEdit(wFWorkflowNodeFavDO);
+        String userId = VciBaseUtil.getCurrentUserId();
+        //鍒ゆ柇鍚嶇О鏄惁鏈夐噸澶�
+        WFWorkflowNodeFavDO favDO = wFWorkflowNodeFavMapper.selectByName(wFWorkflowNodeFavDTO.getName(), userId,wFWorkflowNodeFavDTO.getId(),wFWorkflowNodeFavDTO.getWfTemplateRev());
+        if(favDO !=null && !wFWorkflowNodeFavDO.getOid().equalsIgnoreCase(favDO.getOid())){
+            throw new VciBaseException("鏀惰棌鏂规鐨勫悕绉颁笌鍏朵粬鐨勬柟妗堥噸澶�");
+        }
+        BatchCBO batchCBO = wFWorkflowNodeFavMapper.updateByPrimaryKey(wFWorkflowNodeFavDO);
+        int update = batchCBO.getUpdateCbos().size();
+        if(update>0){
+            if(!CollectionUtils.isEmpty(wFWorkflowNodeFavDTO.getItems())) {
+                List<WFWorkflowNodeFavItemDO> itemDOS = nodeFavItemMapper.selectBySchemaOid(wFWorkflowNodeFavDO.getOid());
+                List<WFWorkflowNodeFavItemDO> newItems = new ArrayList<>();
+                wFWorkflowNodeFavDTO.getItems().stream().forEach(item -> {
+                    WFWorkflowNodeFavItemDO itemDO = new WFWorkflowNodeFavItemDO();
+                    BeanUtil.convert(item, itemDO);
+                    itemDO.setWorkflowNodeFavOid(wFWorkflowNodeFavDO.getOid());
+                    newItems.add(itemDO);
+                });
+                revisionModelUtil.wrapperForBatchAdd(newItems);
+                nodeFavItemMapper.batchInsert(newItems);
+                if (!CollectionUtils.isEmpty(itemDOS)) {
+                    nodeFavItemMapper.batchDeleteByOids(itemDOS.stream().map(WFWorkflowNodeFavItemDO::getOid).collect(Collectors.toList()));
+                }
+            }
+            return wFWorkflowNodeFavDO2VO(wFWorkflowNodeFavDO);
+        }else{
+            throw new VciBaseException(EDIT_FAIL);
+        }
+    }
+
+    /**
+     * 鏍¢獙鏄惁鍙互鍒犻櫎锛屽鏋滃瓨鍦ㄤ笅绾э紝骞朵笖涓嬬骇鏈夋暟鎹紩鐢ㄥ垯涓嶈兘鍒犻櫎
+     * @param wFWorkflowNodeFavDTO 鏁版嵁浼犺緭瀵硅薄
+     * @param wFWorkflowNodeFavDO 鏁版嵁搴撲腑鐨勬暟鎹璞�
+     * @return success涓簍rue涓哄彲浠ュ垹闄わ紝false琛ㄧず鏈夋暟鎹紩鐢紝obj涓簍rue琛ㄧず鏈変笅绾�
+     */
+    private BaseResult checkIsCanDeleteForDO(WFWorkflowNodeFavDTO wFWorkflowNodeFavDTO, WFWorkflowNodeFavDO wFWorkflowNodeFavDO) {
+        revisionModelUtil.checkTs(wFWorkflowNodeFavDTO.getTs(),wFWorkflowNodeFavDO.getTs());
+        if(!checkIsLinked(wFWorkflowNodeFavDO.getOid())) {
+            return BaseResult.success();
+        }else{
+            return BaseResult.fail(DATA_LINKED_NOT_DELETE,new String[]{""});
+        }
+    }
+
+    /**
+     * 鏍¢獙鏄惁琚紩鐢�
+     * @param oid 涓婚敭
+     * @throws VciBaseException 琚紩鐢ㄧ殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    private boolean checkIsLinked(String oid) throws VciBaseException{
+        //TODO 娣诲姞闇�瑕佹牎楠屽紩鐢ㄧ殑鍦版柟
+        return false;
+    }
+
+    /**
+     * 鍒犻櫎娴佺▼璐熻矗浜烘敹钘�
+     * @param wFWorkflowNodeFavDTO 娴佺▼璐熻矗浜烘敹钘忔暟鎹紶杈撳璞★紝oid鍜宼s闇�瑕佷紶杈�
+     * @return 鍒犻櫎缁撴灉鍙嶉锛氾細success锛氭垚鍔燂紝fail锛氬け璐�
+     * @throws VciBaseException 鍙傛暟涓虹┖锛岃寮曠敤鏃舵姏鍑哄紓甯�
+     */
+    @Override
+    @VciChangeDocument(changeType = VciChangeDocumentTypeEnum.DELETE)
+    @Transactional
+    public BaseResult deleteWFWorkflowNodeFav(WFWorkflowNodeFavDTO wFWorkflowNodeFavDTO) throws VciBaseException{
+        VciBaseUtil.alertNotNull(wFWorkflowNodeFavDTO,"娴佺▼璐熻矗浜烘敹钘忔暟鎹璞�",wFWorkflowNodeFavDTO.getOid(),"娴佺▼璐熻矗浜烘敹钘忕殑涓婚敭");
+        WFWorkflowNodeFavDO wFWorkflowNodeFavDO = selectByOid(wFWorkflowNodeFavDTO.getOid());
+        BaseResult baseResult = checkIsCanDeleteForDO(wFWorkflowNodeFavDTO,wFWorkflowNodeFavDO);
+        if(baseResult.isSuccess()) {
+            wFWorkflowNodeFavMapper.deleteByPrimaryKey(wFWorkflowNodeFavDO.getOid());
+            //鍒犻櫎鏄庣粏鐨勫唴瀹�
+            List<WFWorkflowNodeFavItemDO> itemDOS = nodeFavItemMapper.selectBySchemaOid(wFWorkflowNodeFavDO.getOid());
+            if(!CollectionUtils.isEmpty(itemDOS)){
+                nodeFavItemMapper.batchDeleteByOids(itemDOS.stream().map(WFWorkflowNodeFavItemDO::getOid).collect(Collectors.toList()));
+            }
+        }else{
+            return baseResult;
+        }
+        //鎵ц鍒犻櫎鎿嶄綔
+        return BaseResult.successMsg(DELETE_SUCCESS);
+    }
+
+    /**
+     * 涓婚敭鑾峰彇娴佺▼璐熻矗浜烘敹钘�
+     * @param oid 涓婚敭
+     * @return 娴佺▼璐熻矗浜烘敹钘忔樉绀哄璞�
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屾暟鎹笉瀛樺湪鏃朵細鎶涘嚭寮傚父
+     */
+    @Override
+    public  WFWorkflowNodeFavVO getObjectByOid(String oid) throws VciBaseException{
+        return wFWorkflowNodeFavDO2VO(selectByOid(oid));
+    }
+
+    /**
+     * 涓婚敭鏌ヨ鏁版嵁瀵硅薄
+     * @param oid 涓婚敭
+     * @return  鏁版嵁瀵硅薄
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屽苟涓旀暟鎹笉瀛樺湪鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    private WFWorkflowNodeFavDO selectByOid(String oid) throws VciBaseException{
+        VciBaseUtil.alertNotNull(oid,"涓婚敭");
+        WFWorkflowNodeFavDO wFWorkflowNodeFavDO = wFWorkflowNodeFavMapper.selectByPrimaryKey(oid.trim());
+        if(wFWorkflowNodeFavDO == null || StringUtils.isBlank(wFWorkflowNodeFavDO.getOid())){
+            throw new VciBaseException(DATA_OID_NOT_EXIST);
+        }
+        return wFWorkflowNodeFavDO;
+    }
+
+    /**
+     * 涓婚敭鎵归噺鑾峰彇娴佺▼璐熻矗浜烘敹钘�
+     * @param oidCollections 涓婚敭闆嗗悎锛屼絾鏄彈鎬ц兘褰卞搷锛屽缓璁竴娆℃煡璇笉瓒呰繃10000涓�
+     * @return 娴佺▼璐熻矗浜烘敹钘忔樉绀哄璞�
+     * @throws VciBaseException 鏌ヨ鍑虹幇寮傚父鏃朵細鎶涘嚭
+     */
+    @Override
+    public Collection<WFWorkflowNodeFavVO> listWFWorkflowNodeFavByOids(Collection<String> oidCollections) throws VciBaseException{
+        VciBaseUtil.alertNotNull(oidCollections,"鏁版嵁瀵硅薄涓婚敭闆嗗悎");
+        List<WFWorkflowNodeFavDO> wFWorkflowNodeFavDOList = listWFWorkflowNodeFavDOByOidCollections(oidCollections);
+        return wFWorkflowNodeFavDO2VOs(wFWorkflowNodeFavDOList);
+    }
+
+
+    /**
+     * 浣跨敤涓婚敭闆嗗悎鏌ヨ鏁版嵁瀵硅薄
+     * @param oidCollections 涓婚敭鐨勯泦鍚�
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+    private List<WFWorkflowNodeFavDO> listWFWorkflowNodeFavDOByOidCollections(Collection<String> oidCollections){
+        List<WFWorkflowNodeFavDO> wFWorkflowNodeFavDOList = new ArrayList<>();
+        if(!CollectionUtils.isEmpty(oidCollections)){
+            Collection<Collection<String>> oidCollectionsList = VciBaseUtil.switchCollectionForOracleIn(oidCollections);
+            oidCollectionsList.stream().forEach(oids ->{
+                List<WFWorkflowNodeFavDO> tempDOList =  wFWorkflowNodeFavMapper.selectByPrimaryKeyCollection(oids);
+                if(!CollectionUtils.isEmpty(tempDOList)){
+                    wFWorkflowNodeFavDOList.addAll(tempDOList);
+                }
+            });
+        }
+        return  wFWorkflowNodeFavDOList;
+    }
+
+
+
+    /**
+     * 鍙傜収娴佺▼璐熻矗浜烘敹钘忓垪琛�
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉鍜屾帓搴�
+     * @return 娴佺▼璐熻矗浜烘敹钘忔樉绀哄璞″垪琛紝鐢熸晥鐨勫唴瀹�
+     * @throws VciBaseException 鏌ヨ鏉′欢鍜屽垎椤靛嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public DataGrid<WFWorkflowNodeFavVO> refDataGridWFWorkflowNodeFav(Map<String, String> conditionMap, PageHelper pageHelper) throws VciBaseException{
+        if(conditionMap == null){
+            conditionMap = new HashMap<>();
+        }
+        return gridWFWorkflowNodeFav(conditionMap,pageHelper);
+    }
+
+    /**
+     * 浣跨敤鏂规涓婚敭鏉ヨ幏鍙栨槑缁�
+     *
+     * @param schemaOid 鏂规鐨勪富閿�
+     * @return 鏄庣粏鐨勫唴瀹�
+     * @throws VciBaseException 鏌ヨ鏉′欢鍜屽垎椤靛嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public List<WFWorkflowNodeFavItemVO> listNodeFavItemVOBySchema(String schemaOid) throws VciBaseException {
+        if(StringUtils.isBlank(schemaOid)){
+            return new ArrayList<>();
+        }
+        List<WFWorkflowNodeFavItemDO> itemDOS = nodeFavItemMapper.selectBySchemaOid(schemaOid);
+        return nodeFavItemService.wFWorkflowNodeFavItemDO2VOs(itemDOS);
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WebActionServiceImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WebActionServiceImpl.java
new file mode 100644
index 0000000..f87dec9
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WebActionServiceImpl.java
@@ -0,0 +1,60 @@
+package com.vci.web.service.impl;
+
+import com.vci.corba.common.VCIError;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.web.pageModel.UIActionVO;
+import com.vci.web.service.WebActionServiceI;
+import com.vci.web.util.WebUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+import plm.corba.portal.PLAction;
+import plm.portal.utility.Tool;
+
+/**
+ * Action鏈嶅姟
+ * @author weidy
+ * @date 2019/9/9 13:40
+ */
+@Service
+public class WebActionServiceImpl implements WebActionServiceI {
+
+
+    /**
+     * action瀵硅薄
+     *
+     * @param oid 涓婚敭
+     * @return
+     */
+    @Override
+    public UIActionVO getActionByOid(String oid) throws VciBaseException {
+        WebUtil.alertNotNull(oid,"action鐨勪富閿�");
+        try {
+            PLAction action = Tool.getService()
+                    .getPLActionById(oid);
+            if(action == null || StringUtils.isBlank(action.plOId)){
+                throw new VciBaseException("杩欎釜action鍦ㄧ郴缁熶腑涓嶅瓨鍦�");
+            }
+            return convertWebAction(action);
+        } catch (VCIError vciError) {
+           throw WebUtil.getVciBaseException(vciError);
+        }
+    }
+
+    private UIActionVO convertWebAction(PLAction action){
+       UIActionVO UIActionVO = new UIActionVO();
+//        UIActionVO.setPlActionCls(action.plActionCls);
+//        UIActionVO.setPlBSUrl(action.plBSUrl);
+//        UIActionVO.setPlCode(action.plCode);
+//        UIActionVO.setPlCreateTime(action.plCreateTime);
+//        UIActionVO.setPlCreateUser(action.plCreateUser);
+//        UIActionVO.setPlCSClass(action.plCSClass);
+//        UIActionVO.setPlDesc(action.plDesc);
+//        UIActionVO.setPlLicensOrs(action.plLicensOrs);
+//        UIActionVO.setPlModifyTime(action.plModifyTime);
+//        UIActionVO.setPlModifyUser(action.plModifyUser);
+//        UIActionVO.setPlName(action.plName);
+//        UIActionVO.setPlOId(action.plOId);
+//        UIActionVO.setPlTypeType(action.plTypeType);
+        return UIActionVO;
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WebBoServiceImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WebBoServiceImpl.java
new file mode 100644
index 0000000..55b4ed4
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WebBoServiceImpl.java
@@ -0,0 +1,2519 @@
+package com.vci.web.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.vci.base.common.utility.ObjectUtility;
+import com.vci.corba.common.VCIError;
+import com.vci.frameworkcore.compatibility.SmUserQueryServiceI;
+import com.vci.mw.client.InvocationUtility;
+import com.vci.starter.web.annotation.Column;
+import com.vci.starter.web.constant.QueryOptionConstant;
+import com.vci.starter.web.constant.VciSystemVarConstants;
+import com.vci.starter.web.enumpck.BooleanEnum;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.starter.web.util.BeanUtil;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.starter.web.util.VciDateUtil;
+import com.vci.starter.web.wrapper.VciQueryWrapperForDO;
+import com.vci.web.pageModel.*;
+import com.vci.web.properties.WebProperties;
+import com.vci.web.service.*;
+import com.vci.web.util.PlatformClientUtil;
+import com.vci.web.util.WebUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.tools.ant.taskdefs.condition.Os;
+import org.dom4j.DocumentException;
+import org.dom4j.DocumentHelper;
+import org.omg.CORBA.IntHolder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import plm.bs.bom.clientobject.ClientBusinessObject;
+import plm.bs.bom.clientobject.ClientLinkObject;
+import plm.bs.bom.common.*;
+import plm.corba.qt.BtmRefQueryOption;
+import plm.corba.qt.KV;
+import plm.corba.qt.QTServiceOperations;
+import plm.corba.qt.QTWrapper;
+import plm.oq.objectQuery.common.*;
+
+import java.lang.reflect.Field;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 涓氬姟绫诲瀷鎿嶄綔鏈嶅姟---鍙兘鍦╠ao灞傝皟鐢紝鍏朵粬鐨勬湇鍔′笉鍏佽浣跨敤
+ * 鑷姩灏佽浜嗗钩鍙扮浉鍏崇殑鎿嶄綔
+ * @author weidy
+ */
+@Service
+public class WebBoServiceImpl implements WebBoServiceI{
+	
+	/**
+	 * 鏋氫妇鏈嶅姟
+	 */
+	@Autowired
+	private OsEnumServiceI enumService;//鏋氫妇鏈嶅姟
+	
+	/**
+	 * 灞炴�ф湇鍔�
+	 */
+	@Autowired
+	private OsAttributeServiceI attrService;//灞炴�ф湇鍔�
+
+	/**
+	 * 鐢熷懡鍛ㄦ湡鐨勬湇鍔�
+	 */
+	@Autowired
+	private OsLifeCycleServiceI lifeService;//鐢熷懡鍛ㄦ湡鏈嶅姟
+
+	/**
+	 * 鐘舵�佺殑鏈嶅姟
+	 */
+	@Autowired
+	private OsStatusServiceI statusService;
+
+	/**
+	 * 鐢ㄦ埛鏌ヨ鏈嶅姟
+	 */
+	@Autowired
+	private SmUserQueryServiceI userQueryService;
+
+	/**
+	 * 閾炬帴绫诲瀷鏈嶅姟
+	 */
+	@Autowired
+	private WebLoServiceI loService;
+
+	/**
+	 * 閰嶇疆淇℃伅
+	 */
+	@Autowired
+	private WebProperties webProperties;
+	
+	/**
+	 * 澶氳瑷�鍓嶇紑
+	 */
+	private final String msgCodePrefix = "com.vci.web.boService.";
+	
+	/**
+	 * 鏃ュ織瀵硅薄
+	 */
+	private Logger logger = LoggerFactory.getLogger(getClass());
+
+	/**
+	 * 涓氬姟绫诲瀷鐨勬湇鍔�
+	 */
+	@Autowired
+	private OsBtmServiceI btmService;
+
+	/**
+	 * 鐗堟湰瑙勫垯鐨勬湇鍔�
+	 */
+	@Autowired
+	private OsRevisionRuleServiceI revisionRuleService;
+
+	/**
+	 * 骞冲彴璋冪敤瀹㈡埛绔�
+	 */
+	@Autowired
+	private PlatformClientUtil platformClientUtil;
+
+	/**
+	 * 宸茬粡鍒涘缓杩囩殑涓氬姟瀵硅薄
+	 */
+	private static Map<String, ClientBusinessObject> hasCreatedCbos = new HashMap<String, ClientBusinessObject>();
+
+	/**
+	 * 涓氬姟瀵硅薄榛樿灞炴��
+	 */
+	public static final Map<String,String> BO_BASE_FIELD_MAP = new HashMap<>();
+
+	public WebBoServiceImpl(){
+		List<Field> fields = WebUtil.getAllFieldForObj(BusinessObject.class);
+		if(!CollectionUtils.isEmpty(fields)) {
+			fields.stream().forEach(field -> {
+				BO_BASE_FIELD_MAP.put(field.getName(),WebUtil.getCboAttrNameFromField(field,BusinessObject.class));
+			});
+		}
+	}
+
+
+	/**
+	 * 鍒濆鍖栦笟鍔$被鍨�
+	 * --绗竴娆¤皟鐢ㄧ殑鏃跺�欎細鐩稿鎱竴涓嬶紝鍚庣画鑾峰彇灏卞緢蹇殑
+	 * --娉ㄦ剰鍦ㄦ湇鍔″惎鍔ㄦ椂鎵嶄細娓呴櫎缂撳瓨
+	 * --鍒涘缓浜洪粯璁や负褰撳墠鐢ㄦ埛锛屽鏋滈渶瑕佷慨鏀癸紝鍙互鍦ㄨ幏鍙栧悗鑷澶勭悊
+	 * @param btmName 涓氬姟绫诲瀷鐨勫悕绉帮紝浼氳嚜鍔ㄥ彉鎴愬皬鍐�
+	 * @return 涓氬姟鏁版嵁鐨勫璞�
+	 * @throws VciBaseException 鍒濆鍖栧嚭閿欑殑鏄細鎶涘嚭寮傚父
+	 */
+	@Override
+	public ClientBusinessObject createCBOByBtmName(String btmName)
+			throws VciBaseException {
+		if(btmName!=null){
+			btmName = btmName.trim().toLowerCase();
+		}
+		String userid = WebUtil.getCurrentUserId();
+		if(!hasCreatedCbos.containsKey(btmName)){
+			if(StringUtils.isEmpty(userid)){
+				throw new VciBaseException(msgCodePrefix +"noHasUserid");
+			}
+			try {
+				hasCreatedCbos.put(btmName, createBusinessObject(btmName));
+			} catch (Exception e) {
+				logger.error("鍒涘缓涓氬姟绫诲瀷瀵硅薄",e);
+				throw new VciBaseException(msgCodePrefix + "initBoError",new String[]{btmName});
+			}
+		}
+		ClientBusinessObject cbo = cloneClientBusinessObject(hasCreatedCbos.get(btmName));
+		return cbo;
+	}
+
+	/**
+	 * 鏍规嵁涓氬姟绫诲瀷鍚嶇О鍒涘缓涓氬姟鏁版嵁婧愬璞�
+	 * @param boName 涓氬姟绫诲瀷鍚嶇О
+	 * @return 涓氬姟鏁版嵁瀵硅薄
+	 */
+	public ClientBusinessObject createBusinessObject(String boName)  {
+		OsBtmTypeVO btmTypeVO = btmService.getBtmById(boName);
+		String userName = WebUtil.getCurrentUserId();
+		ClientBusinessObject bo = new ClientBusinessObject();
+		bo.setOid((new ObjectUtility()).getNewObjectID36());
+		bo.setRevisionid((new ObjectUtility()).getNewObjectID36());
+		bo.setNameoid((new ObjectUtility()).getNewObjectID36());
+		bo.setBtmName(boName);
+		bo.setIsLastR(1);
+		bo.setIsFirstR(1);
+		bo.setIsFirstV(1);
+		bo.setIsLastV(1);
+		bo.setCreator(userName);
+		bo.setCreateTime(String.valueOf(System.currentTimeMillis()));
+		bo.setLastModifier(userName);
+		bo.setLastModifyTime(String.valueOf(System.currentTimeMillis()));
+		bo.setRevisionRule(btmTypeVO.getRevisionRuleId());
+		bo.setVersionRule(String.valueOf(btmTypeVO.getVersionRule()));
+		if(StringUtils.isNotBlank(btmTypeVO.getRevisionRuleId())){
+			OsRevisionRuleVO revisionRuleVO = revisionRuleService.getRevisionRuleById(btmTypeVO.getRevisionRuleId());
+			bo.setRevisionValue(revisionRuleVO.getStartCode());
+		}
+
+		bo.setRevisionSeq(1);
+		bo.setVersionSeq(1);
+		bo.setVersionValue(getVersionValue(WebUtil.getInt(btmTypeVO.getVersionRule())));
+		bo.setLctId(btmTypeVO.getLifeCycleId());
+		if(StringUtils.isNotBlank(btmTypeVO.getLifeCycleId())){
+			OsLifeCycleVO lifeCycleVO = lifeService.getLifeCycleById(btmTypeVO.getLifeCycleId());
+			bo.setLcStatus(lifeCycleVO.getStartStatus());
+		}
+		bo.setId("");
+		bo.setName("");
+		bo.setDescription("");
+		bo.setOwner(userName);
+		bo.setCheckinBy(userName);
+		bo.setCopyFromVersion("");
+		this.initTypeAttributeValue(bo,btmTypeVO);
+		return bo;
+	}
+
+	/**
+	 * 鍒濆鍖栦笟鍔$被鍨嬬殑榛樿鍊�
+	 * @param cbo 涓氬姟鏁版嵁瀵硅薄
+	 * @param btmTypeVO 涓氬姟绫诲瀷鐨勬樉绀哄璞�
+	 */
+	private void initTypeAttributeValue(ClientBusinessObject cbo,OsBtmTypeVO btmTypeVO) {
+		Optional.ofNullable(btmTypeVO.getAttributes()).orElseGet(()->new ArrayList<>()).stream().forEach(attribute->{
+			try {
+				cbo.setAttributeValueWithNoCheck(attribute.getId(),attribute.getDefaultValue());
+			} catch (VCIError vciError) {
+				if(logger.isErrorEnabled()){
+					logger.error("璁剧疆灞炴�х殑鍊肩殑鏃跺�欏嚭鐜颁簡閿欒",vciError);
+				}
+			}
+		});
+	}
+
+	/**
+	 * 鑾峰彇鐗堟鐨勫��
+	 * @param verRuleName 鐗堟鐨勮鍒�
+	 * @return 鐗堟鐨勫�硷紝娌℃湁瑙勫垯鍒欎负绌�
+	 */
+	private String getVersionValue(int verRuleName) {
+		if (verRuleName == 0) {
+			return "1";
+		} else if (verRuleName == 1) {
+			return "a";
+		} else if (verRuleName == 2) {
+			return "0";
+		}
+		return "";
+	}
+
+	/**
+	 * 鎷疯礉浠ュ墠鐨勪笟鍔℃暟鎹�
+	 * @param cbo 浠ュ墠鐨勪笟鍔℃暟鎹璞�
+	 * @return 鎷疯礉鍚庣殑瀵硅薄
+	 */
+	private  ClientBusinessObject cloneClientBusinessObject(ClientBusinessObject cbo){
+    	if(cbo !=null){
+			BusinessObject businessObject = new BusinessObject();
+			BusinessObject bo = cbo.getBusinessObject();
+			businessObject.oid = new ObjectUtility().getNewObjectID36();
+			businessObject.revisionid = new ObjectUtility().getNewObjectID36();
+			businessObject.nameoid = new ObjectUtility().getNewObjectID36();
+			businessObject.btmName = bo.btmName;
+			businessObject.isLastR = bo.isLastR;
+			businessObject.isFirstR = bo.isFirstR;
+			businessObject.isLastV = bo.isLastV;
+			businessObject.isFirstV = bo.isFirstV;
+			businessObject.creator = WebUtil.getCurrentUserId();
+			businessObject.createTime = String.valueOf(System.currentTimeMillis());
+			businessObject.lastModifier = bo.lastModifier;
+			businessObject.lastModifyTime = String.valueOf(bo.lastModifyTime);
+			businessObject.revisionRule = bo.revisionRule;
+			businessObject.versionRule = bo.versionRule;
+			businessObject.revisionSeq = bo.revisionSeq;
+			businessObject.revisionValue = bo.revisionValue;
+			businessObject.versionSeq = bo.versionSeq;
+			businessObject.versionValue = bo.versionValue;
+			businessObject.lctId = bo.lctId;
+			businessObject.lcStatus = bo.lcStatus;
+			businessObject.ts = VciDateUtil.getNowString();
+			businessObject.id = bo.id;
+			businessObject.name = bo.name;
+			businessObject.description = bo.description;
+			businessObject.owner = businessObject.creator;
+			businessObject.checkinBy = bo.checkinBy;
+			businessObject.checkinTime = bo.checkinTime;
+			businessObject.checkoutBy = bo.checkoutBy;
+			businessObject.checkoutTime = bo.checkoutTime;
+			businessObject.copyFromVersion = bo.copyFromVersion;
+			if(bo.newAttrValList !=null){
+				businessObject.newAttrValList = clone(bo.newAttrValList);
+			}
+			if(bo.hisAttrValList !=null){
+				businessObject.hisAttrValList = clone(bo.hisAttrValList);
+			}
+			ClientBusinessObject cbo2 = new ClientBusinessObject();
+			cbo2.setBusinessObject(businessObject);
+			return cbo2;
+    	}else {
+			return null;
+		}
+    }
+
+	/**
+	 * 鎷疯礉灞炴�х殑鍊�
+	 * @param newAttrValList 灞炴�у�煎璞℃暟缁�
+	 * @return 鎷疯礉鍚庣殑鏂板睘鎬ф暟缁�
+	 */
+	private  AttributeValue[] clone(AttributeValue[] newAttrValList) {
+		AttributeValue[] n = new AttributeValue[newAttrValList.length];
+		for (int i = 0; i < newAttrValList.length; i++) {
+			n[i] = new AttributeValue(newAttrValList[i].attrName,newAttrValList[i].attrVal);
+		}
+		return n;
+	}
+
+	/**
+	 * 鍓嶇鐨勬煡璇㈡潯浠惰浆鎹负骞冲彴闇�瑕佺殑鏌ヨ瀵硅薄
+	 * @param conditionMap 鏌ヨ鏉℃
+	 * @return 鏌ヨ瀵硅薄
+	 */
+	@Override
+	public Condition getConditionByMap(Map<String, String> conditionMap){
+		Condition mergeCondition = null;//缁勫悎鍚庣殑鏌ヨ鏉′欢
+		if(conditionMap!=null && conditionMap.size() > 0){
+			//鍏堟妸鎵�鏈夌殑鏌ヨ鏉′欢閮借浆鎹负灏忓啓
+			//鐒跺悗寮�濮嬮�愪釜閬嶅巻锛屼富瑕佹槸瀵筥start鍜宊end杩欐牱鐨�
+			Iterator<String> itor = conditionMap.keySet().iterator();
+			while(itor.hasNext()){
+				String key = itor.next();
+				String value = conditionMap.get(key);
+				Condition condition = null;//鏈鐨勬潯浠�
+				Map<String,String> thisConditionMap = new HashMap<String, String>();
+				boolean isOr = false;
+				if(WebUtil.isNotNull(value) && value.startsWith(QueryOptionConstant.OR)){
+					isOr = true;
+					value = value.substring(4);
+				}
+				if(key.indexOf("_start")>-1 || key.indexOf("_end")>-1){//浠嬩簬....涔嬮棿
+					if(key.indexOf("_start")>-1){
+						String attr = key.replace("_start", "");
+						thisConditionMap.put(attr, value);
+						condition = Tool.getCondition(thisConditionMap);
+						if(conditionMap.containsKey(attr + "_end")){//濡傛灉娌℃湁缁撴潫锛屽叾瀹炰篃鏄厑璁哥殑锛�
+							Map<String,String> endConditonMap = new HashMap<String, String>();
+							endConditonMap.put(attr, conditionMap.get(attr + "_end"));
+							condition = Tool.mergeCondition(condition, Tool.getCondition(endConditonMap), Connector.AND);
+						}
+					}
+				}else{
+					if(("creator".equalsIgnoreCase(key) || "lastmodifier".equalsIgnoreCase(key)) && StringUtils.isNotBlank(value)  ){
+						//璇存槑鏄煡璇㈠垱寤轰汉鍜屾渶鍚庝慨鏀逛汉
+						//妯$硦锛岀瓑浜庯紝涓嶇瓑浜庯紝鍏朵綑鐨勪笉澶勭悊濮撳悕
+						if(value.contains("*")) {
+							//璇存槑鏄痩ike
+							String userValue = value.replace("*", "%");
+							thisConditionMap.put(key, QueryOptionConstant.IN + "(select plusername from pluser where plusername like '" + userValue + "' or pltruename like '" + userValue + "')");
+						}else if(value.startsWith(QueryOptionConstant.NOTEQUAL)){
+							thisConditionMap.put(key, QueryOptionConstant.NOTIN + "(select plusername from pluser where plusername = '" + value + "' or pltruename = '" + value + "')");
+						}else if(value.startsWith(QueryOptionConstant.EQUAL)){
+							thisConditionMap.put(key, QueryOptionConstant.IN + "(select plusername from pluser where plusername = '" + value + "' or pltruename = '" + value + "')");
+						}else{
+							thisConditionMap.put(key, value);
+						}
+					}else {
+						thisConditionMap.put(key, value);
+					}
+					condition = Tool.getCondition(thisConditionMap);
+				}
+				if(mergeCondition == null){
+					mergeCondition = condition;
+				}else{
+					mergeCondition = Tool.mergeCondition(mergeCondition, condition, isOr?Connector.OR:Connector.AND);
+				}
+			}
+		}
+		return mergeCondition;
+	}
+
+	/**
+	 * 鏍规嵁灞炴�ф潵鏌ヨ涓婚敭
+	 *
+	 * @param referInfo 涓氬姟绫诲瀷.灞炴�у悕
+	 * @param value     灞炴�х殑鍊�
+	 * @return 鏌ヨ鍚庣殑鍊�
+	 * @throws VciBaseException 鏌ヨ鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+	 */
+	@Override
+	public Map<String, String> queryOidByPropertie(String referInfo, List<String> value) throws VciBaseException {
+		WebUtil.alertNotNull(referInfo,"鍙傜収淇℃伅",value,"鍙傜収鐨勫唴瀹�");
+		if(referInfo.indexOf(".") < 0){
+			throw  new VciBaseException("鍙傜収鐨勪俊鎭繀椤绘槸銆愪笟鍔$被鍨�.灞炴�с�戣繖鏍风殑鏍煎紡");
+		}
+		String btmName = referInfo.split("\\.")[0].trim().toLowerCase();
+		String fieldName = referInfo.split("\\.")[1].trim().toLowerCase();
+		Map<String,String> conditionMap = new HashMap<String, String>();
+		conditionMap.put(fieldName,QueryOptionConstant.IN + "(" + WebUtil.toInSql(value.toArray(new String[0])) + ")");
+		List<ClientBusinessObject> cbos = queryCBO(btmName,conditionMap,null, Arrays.asList(new String[]{"oid",fieldName}));
+
+		Map<String,String> data = new HashMap<String, String>();
+		if(cbos!=null && cbos.size() > 0){
+			for(ClientBusinessObject cbo : cbos){
+				data.put(cbo.getAttributeValue(fieldName),cbo.getOid());
+			}
+		}
+		return data;
+	}
+
+	/**
+	 * 鏍¢獙鐗瑰畾灞炴�х殑鍊兼槸鍚﹀瓨鍦�
+	 *
+	 * @param btmName      涓氬姟绫诲瀷
+	 * @param columnName   鍒楀悕绉�
+	 * @param columnValues 鍒楃殑鍊�
+	 * @return true琛ㄧず瀛樺湪杩欎釜鍊�
+	 * @throws VciBaseException 鏌ヨ鍑洪敊浼氭姏鍑哄紓甯�
+	 */
+	@Override
+	public boolean checkDataExsitByColumn(String btmName, String columnName, Collection<String> columnValues) throws VciBaseException {
+		WebUtil.alertNotNull(btmName,"涓氬姟绫诲瀷",columnName,"灞炴�у悕绉�",columnValues,"灞炴��" + columnName + "鐨勫��");
+		Map<String,String> conditionMap = new HashMap<String, String>();
+		Set<String> oidSet = new HashSet<String>();
+		for(String oid : columnValues){
+			if(StringUtils.isNotBlank(oid)){
+				oidSet.add(oid);
+			}
+		}
+		if(oidSet.size() == 0){
+			throw new VciBaseException("灞炴��" + columnName + "鐨勫�间负绌�");
+		}
+		conditionMap.put(columnName,QueryOptionConstant.IN + "(" + VciBaseUtil.toInSql(oidSet.toArray(new String[0])) + ")");
+		List<ClientBusinessObject> cbos = queryCBO(btmName,conditionMap,null,Arrays.asList(new String[]{columnName}));
+		if(cbos !=null && cbos.size() >0){
+			for(ClientBusinessObject cbo : cbos){
+				String oid = cbo.getAttributeValue(columnName);
+				if(oidSet.contains(oid)){
+					oidSet.remove(oid);
+				}
+			}
+			if(oidSet.size()>0){
+				throw new VciBaseException("灞炴��" + columnName + "鐨勫�兼湁" + oidSet.size() + "涓笉瀛樺湪");
+			}
+			return true;
+		}else{
+			throw new VciBaseException("灞炴��" + columnName + "鐨勫�煎叏閮ㄤ笉瀛樺湪");
+		}
+	}
+
+	/**
+	 * 鏍¢獙鐗瑰畾灞炴�х殑鍊兼槸鍚﹀瓨鍦�
+	 *
+	 * @param btmName      涓氬姟绫诲瀷
+	 * @param columnName   鍒楀悕绉�
+	 * @param columnValues 鍒楃殑鍊�
+	 * @return
+	 * @throws VciBaseException
+	 */
+	@Override
+	public boolean checkDataExsitByColumn(String btmName, String columnName, String columnValues) throws VciBaseException {
+		WebUtil.alertNotNull(columnValues,"灞炴��" + columnName + "鐨勫��");
+		return checkDataExsitByColumn(btmName,columnName,Arrays.asList(columnValues.split(",")));
+	}
+
+
+	/**
+	 * 鏍规嵁鏌ヨ鏉′欢鏉ユ煡璇笟鍔$被鍨嬩笅鐨勬暟鎹�
+	 * @param btmType 涓氬姟绫诲瀷鐨勫悕绉帮紝浼氳嚜鍔ㄥ彉鎴愬皬鍐�
+	 * @param conditionMap 鏌ヨ鏉′欢锛屾敞鎰忎粙浜�...涔嬮棿浣跨敤xxx_start鍜寈xx_end
+	 * @return 涓氬姟鏁版嵁鍒楄〃
+	 * @throws VciBaseException 鏌ヨ鍑洪敊鐨勬槸鎶涘嚭寮傚父
+	 */
+	@Override
+	public List<ClientBusinessObject> queryCBO(String btmType,
+			Map<String, String> conditionMap) throws VciBaseException {
+		List<String> clauseList = new ArrayList<String>();
+		clauseList.add("*");
+		PageHelper ph = new PageHelper(-1);
+		return queryCBO(btmType,conditionMap,ph,clauseList);
+	}
+
+	/**
+	 * 鏀寔鎺掑簭鍜屽垎椤电殑鏌ヨ涓氬姟绫诲瀷涓嬬殑鏁版嵁
+	 * @param btmType 涓氬姟绫诲瀷鐨勫悕绉�
+	 * @param conditionMap 鏌ヨ鏉′欢锛屾敞鎰忎粙浜�...涔嬮棿浣跨敤xxx_start鍜寈xx_end
+	 * @param ph 鎺掑簭鍜屽垎椤�
+	 * @return  涓氬姟鏁版嵁鍒楄〃
+	 * @throws VciBaseException 鏌ヨ鍑洪敊鐨勬槸鎶涘嚭寮傚父
+	 */
+	@Override
+	public List<ClientBusinessObject> queryCBO(String btmType,
+			Map<String, String> conditionMap, PageHelper ph)
+			throws VciBaseException {
+		List<String> clauseList = new ArrayList<String>();
+		clauseList.add("*");
+		return queryCBO(btmType,conditionMap,ph,clauseList);
+	}
+
+	/**
+	 * 浣跨敤鏌ヨ鏂规鏉ユ煡璇㈡暟鎹紝杩斿洖CBO
+	 * @param btmType 涓氬姟绫诲瀷鍚嶇О
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @param ph 鍒嗛〉瀵硅薄
+	 * @param  clauseList 鏌ヨ瀛楁
+	 * @return 涓氬姟鏁版嵁鍒楄〃
+	 * @throws VciBaseException 鏌ヨ鍑洪敊鐨勬槸鎶涘嚭寮傚父
+	 */
+	@Override
+	public List<ClientBusinessObject> queryCBO(String btmType,
+			Map<String, String> conditionMap, PageHelper ph,
+			List<String> clauseList) throws VciBaseException {
+		QueryTemplate qt = new QueryTemplate();
+		//鍩虹璁剧疆
+		qt.setId("queryBOHasPage");
+		qt.setType(QTConstants.TYPE_BTM);
+		qt.setBtmType(btmType.toLowerCase());
+		return baseQueryCBO(qt, conditionMap, ph, clauseList);
+	}
+
+	/**
+	 * 璁剧疆鏄惁杩囨护鏁版嵁鏉冮檺
+	 * @param qt 鏌ヨ妯℃澘
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 */
+	private void setRightValueToQueryTemplate(QueryTemplate qt,Map<String,String> conditionMap){
+		boolean filterDataRight = webProperties.isDataRight();
+		if(conditionMap == null){
+			conditionMap = new HashMap<String, String>();
+		}
+		if(conditionMap.containsKey(QUERY_FILTER_DATARIGHT)){
+			if(BooleanEnum.TRUE.getValue().equals(conditionMap.get(QUERY_FILTER_DATARIGHT).toLowerCase())){
+				filterDataRight = true;
+			}else{
+				filterDataRight = false;
+			}
+			conditionMap.remove(QUERY_FILTER_DATARIGHT);
+		}
+		boolean filterSecret = webProperties.isSecretRight();
+		if(conditionMap.containsKey(QUERY_FILTER_SECRET)){
+			if(BooleanEnum.TRUE.getValue().equals(conditionMap.get(QUERY_FILTER_SECRET).toLowerCase())){
+				filterSecret = true;
+			}else{
+				filterDataRight = false;
+			}
+			conditionMap.remove(QUERY_FILTER_SECRET);
+		}
+		qt.setRightFlag(filterDataRight);
+		qt.setSecretFlag(filterSecret);
+	}
+
+	/**
+	 * 鍩虹鐨勬煡璇㈡柟娉�
+	 * @param qt 鏌ヨ妯℃澘
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @param ph 鍒嗛〉
+	 * @param clauseList 鏌ヨ瀛楁
+	 * @return 鏌ヨ鍑烘潵鐨勫��
+	 * @throws VciBaseException 鏌ヨ鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+	 */
+	private List<ClientBusinessObject> baseQueryCBO(QueryTemplate qt,Map<String,String> conditionMap,PageHelper ph,List<String> clauseList) throws VciBaseException{
+		List<ClientBusinessObject> allCbos = new ArrayList<ClientBusinessObject>();
+		if(clauseList == null){
+			clauseList = new ArrayList<String>();
+			clauseList.add("*");
+		}
+		setRightValueToQueryTemplate(qt,conditionMap);//璁剧疆瀵嗙骇鏌ヨ锛屽拰鏁版嵁鏉冮檺鎺у埗
+		List<BtmRefQueryOption> refOpts = new ArrayList<BtmRefQueryOption>();
+		List<String> enumAttrName = new ArrayList<String>();
+		List<String> thisQueryAttr = new ArrayList<String>();
+		if(clauseList!=null && clauseList.size()>0){
+			for(String attrName : clauseList){
+				if(attrName.indexOf(".")>-1){
+					String[] kvs = attrName.split("\\.");
+					int len = kvs.length;
+					if(len == 2){
+						// 涓�灞傚弬鐓� a.b
+						// 绗簩涓弬鏁扮粰绌猴紝鏄涓嶅浠庡睘鎬т腑鏌ュ叾鍙傛暟鐨勪笟鍔$被鍨嬶紝鐢变笅涓嬩笓鐢ㄦ帄涓繘琛屽鐞�
+						BtmRefQueryOption refOpt = new BtmRefQueryOption(
+						kvs[0], "", new String[]{kvs[1]}
+						);
+						refOpts.add(refOpt);
+					} else if(len == 3){
+						// 浜屽眰鍙傜収 a.b.c
+						// TODO 闇�瑕佹敮鎸佷袱灞傚弬鐓�
+					} else {
+						// 涓夊眰浠ョ殑鍙傜収 a.b.c.d a.b.c.d.e
+						// TODO 闇�瑕佹敮鎸佷笁灞備互鍙婁互涓婄殑鍙傜収
+					}
+				}else if(attrName.indexOf("_")>-1 
+						&& !"lcStatus_text".toLowerCase().equalsIgnoreCase(attrName.toLowerCase())){
+					enumAttrName.add(attrName);
+				}else{
+					thisQueryAttr.add(attrName);
+				}
+			}
+		}
+		if(thisQueryAttr.isEmpty()){
+			thisQueryAttr.add("*");
+		}
+		//璁剧疆鏌ヨ瀛楁,杩欎釜蹇呴』鏄綋鍓嶄笟鍔$被鍨嬩腑鐨勬煡璇㈠瓧娈�
+		qt.setClauseList(thisQueryAttr);
+		conditionMap = WebUtil.getNotNullMap(conditionMap);
+		Condition condition = getConditionByMap(conditionMap);
+		if(qt.getCondition() !=null) {
+			qt.setCondition(Tool.mergeCondition(qt.getCondition(), condition, Connector.AND));
+		}else {
+			qt.setCondition(condition);
+		}
+		qt.setLevel(-1);//瀵逛簬涓氬姟绫诲瀷鏉ヨ娌℃湁浣滅敤
+
+		//璁剧疆鍒嗛〉淇℃伅鍜屾帓搴�
+		setPageAndOrderToQT(qt,ph);
+		try {
+			QTServiceOperations qtService = platformClientUtil.getQueryService();
+			if(qtService == null){
+				logger.error("娌℃湁鎵惧埌鏌ヨ鏈嶅姟");
+				throw new VciBaseException(msgCodePrefix+"qtServerNull", new String[]{});
+			}
+			IntHolder count = new IntHolder();
+			BusinessObject[] bos = null;
+			String invo = JSONObject.toJSONString(InvocationUtility.getInvocation());
+			try{
+				bos = qtService.findBTMObjectsV4(invo,qt.getId(), Tool.qtTOXMl(qt).asXML(),count,refOpts.toArray(new BtmRefQueryOption[0]));
+			}catch (VCIError e){
+				bos = qtService.findBTMObjectsV4(invo,qt.getId(), Tool.qtTOXMl(qt).asXML(),count,refOpts.toArray(new BtmRefQueryOption[0]));
+			}
+
+			if (bos != null && bos.length > 0) {
+				for (BusinessObject bo : bos) {
+					ClientBusinessObject cbo = new ClientBusinessObject();
+					cbo.setBusinessObject(bo);
+					queryEnumText(cbo,enumAttrName);
+					allCbos.add(cbo);
+				}
+				//鍥犱负淇敼浜嗘煡璇㈢殑鏂瑰紡锛屾墍浠ュ氨涓嶉渶瑕佸崟鐙煡璇㈠弬鐓�
+			}
+			queryLcStatus(allCbos);
+		} catch (VCIError e) {
+//			logger.error(e.error_code,e);
+//			throw WebUtil.getVciBaseException(e);
+		}
+		return allCbos;
+	}
+
+	/**
+	 * 鎷疯礉鍒嗛〉鍜屾帓搴忕殑璁剧疆鍒版煡璇㈡ā鏉�
+	 * @param qt 鏌ヨ锛屾ā鏉�
+	 * @param pageHelper 鍒嗛〉瀵硅薄
+	 */
+	@Override
+	public void setPageAndOrderToQT(QueryTemplate qt,PageHelper pageHelper){
+		if(pageHelper!=null){
+			if(pageHelper.getLimit()>0){
+				PageInfo pageInfo = new PageInfo();
+				pageInfo.setPageNO(pageHelper.getPage());
+				pageInfo.setRowCount(pageHelper.getLimit());
+				qt.setPageInfo(pageInfo);
+			}
+			if(WebUtil.isNotNull(pageHelper.getSort()) && WebUtil.isNotNull(pageHelper.getOrder())){
+				//璁剧疆浜嗘帓搴�
+				String[] sort = pageHelper.getSort().split(",");
+				String[] order = pageHelper.getOrder().split(",");
+				if(sort.length != order.length){
+					throw new VciBaseException(msgCodePrefix + "sortlengtherror",new Object[]{sort.length,order.length});
+				}
+				List<OrderInfo> orderInfoList = new ArrayList<OrderInfo>();
+				for(int i = 0 ; i < sort.length ;i++){
+					OrderInfo oi =  new OrderInfo();
+					oi.setOrderField(sort[i]);
+					oi.setOrderMode(order[i]);
+					oi.setLevel(sort.length -i);//鍊艰秺澶т紭鍏堢骇瓒婂ぇ锛岃�屾帓鍦ㄦ暟缁勭殑鍓嶉潰鐨勪紭鍏堢骇瓒婂ぇ
+					orderInfoList.add(oi);
+				}
+				qt.setOrderInfoList(orderInfoList);
+			}
+		}
+	}
+	
+	/**
+	 * 鑾峰彇鎵�鏈夌殑鏋氫妇灞炴��
+	 * @param allAttrMap 鎵�鏈夌殑灞炴��
+	 * @return 鑾峰彇灞炴�т腑鐨勬灇涓惧睘鎬�
+	 */
+	private List<String> getEnumAttrName(Map<String,String> allAttrMap){
+		List<String> enumAttrName = new ArrayList<String>();
+		if(allAttrMap!=null && allAttrMap.size() > 0){
+			for(String attr : allAttrMap.keySet()){
+				if(attr.indexOf("_")>-1 
+						&& !"lcStatus_text".toLowerCase().equalsIgnoreCase(attr)){
+					enumAttrName.add(attr);
+				}
+			}
+		}
+		return enumAttrName;
+	}
+	
+	/**
+	 * 鑾峰彇寮曠敤鐨勫睘鎬�---鍙敮鎸佷竴绾у弬鐓�
+	 * @param allAttrMap 鎵�鏈夌殑灞炴��
+	 * @return 鏋氫妇灞炴��
+	 */
+	private Map<String,String> getReferAttrName(Map<String,String> allAttrMap){
+		Map<String,String> referAttrName = new HashMap<String,String>();
+		if(allAttrMap!=null && allAttrMap.size() > 0){
+			for(String attr : allAttrMap.keySet()){
+				if(attr.indexOf(".")>-1){
+					referAttrName.put(attr,allAttrMap.get(attr));
+				}
+			}
+		}
+		return referAttrName;
+	}
+	
+	/**
+	 * 鏌ヨ鐢熷懡鍛ㄦ湡鐨勫��
+	 * @param cbos 涓氬姟瀵硅薄
+	 */
+	private void queryLcStatus(List<ClientBusinessObject> cbos){
+		if(!CollectionUtils.isEmpty(cbos)){
+
+			Map<String, OsStatusVO> statusVOMap = statusService.selectAllStatusMap();
+			cbos.stream().forEach(cbo->{
+				try{
+					cbo.setAttributeValueWithNoCheck("lcStatus_text", statusVOMap.getOrDefault(cbo.getLcStatus(),new OsStatusVO()).getName());
+				}catch(Exception e){
+					logger.error("鑾峰彇鐢熷懡鍛ㄦ湡涓姸鎬佺殑鏄剧ず鏂囨湰鍑洪敊",e);
+				}
+			});
+		}
+	}
+	
+	/**
+	 * 鏌ヨ涓氬姟瀵硅薄涓婄殑鏋氫妇鍊�
+	 * @param cbo 涓氬姟瀵硅薄
+	 * @param enumAttrName 鏋氫妇灞炴�х殑鍊�
+	 * @throws VciBaseException
+	 */
+	private void queryEnumText(ClientBusinessObject cbo,List<String> enumAttrName) throws VciBaseException{
+		queryEnumText(cbo,null,enumAttrName);
+	}
+
+	/**
+	 * 鏌ヨ鏋氫妇鐨勪俊鎭�
+	 * @param cbo 涓氬姟鏁版嵁
+	 * @param clo 閾炬帴灞炴��
+	 * @param enumAttrName 鏋氫妇鐨勫悕绉�
+	 * @throws VciBaseException 鏌ヨ鏋氫妇鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+	 */
+	@Override
+	public void queryEnumText(ClientBusinessObject cbo, ClientLinkObject clo, List<String> enumAttrName) throws VciBaseException{
+		if(enumAttrName.size()>0){//鏌ヨ鏋氫妇
+			for(String enumAttr:enumAttrName){//鏍煎紡涓�   code_field  code鏄灇涓剧殑缂栫爜锛宖ield鏄綋鍓嶄笟鍔$被鍨嬪瓨鍌ㄦ灇涓惧�肩殑瀛楁
+				if(enumAttr.toLowerCase().equals("creator_name")){
+					//鍒涘缓浜虹殑鍚嶇О
+					String creator = "";
+					if(cbo!=null){
+						creator = cbo.getCreator();
+					}else{
+						creator = clo.getCreator();
+					}
+					if(StringUtils.isNotBlank(creator)){
+						String userTrueName = userQueryService.getUserNameByUserId(creator);
+						setValueToCboOrClo(cbo,clo,"creator_name",userTrueName);
+					}
+				}else if(enumAttr.toLowerCase().equals("lastmodifier_name")){
+					//鏈�鍚庝慨鏀逛汉鍚嶇О
+					String modifier = "";
+					if(cbo!=null){
+						modifier = cbo.getLastModifier();
+					}else{
+						modifier = clo.getLastModifier();
+					}
+					if(StringUtils.isNotBlank(modifier)){
+						String userTrueName = userQueryService.getUserNameByUserId(modifier);
+						setValueToCboOrClo(cbo,clo,"lastmodifier_name",userTrueName);
+					}
+				}else if(enumAttr.toLowerCase().endsWith("${user_name}")){
+					String usernameField = enumAttr.toLowerCase();
+					String fields= usernameField.replace("${user_name}","");
+					if(fields.contains("_")){
+						String valueField = "";
+						valueField = fields.split("_")[0];
+						String value = cbo.getAttributeValue(valueField);
+						if(StringUtils.isNotBlank(value)){
+							String userTrueName = userQueryService.getUserNameByUserId(value);
+							setValueToCboOrClo(cbo,clo,enumAttr,userTrueName);
+						}
+					}
+				}else {
+					String[] tempArray = enumAttr.split("_");
+					String enumCode = tempArray[0];//鏋氫妇缂栫爜
+					if (tempArray.length > 1) {
+						//浠庢灇涓句腑鑾峰彇鍊�
+						String valueFieldName = tempArray[1];
+						String comboxField = "";
+						if(valueFieldName.contains("#")){
+							valueFieldName = tempArray[1].split("#")[0];
+							comboxField = tempArray[1].split("#")[1];
+						}
+						String enumKey = "";
+						if (cbo != null) {
+							enumKey = cbo.getAttributeValue(valueFieldName);
+						} else if (clo != null) {
+							enumKey = clo.getAttributeValue(valueFieldName);
+						}
+						String enumText = "";
+						if (WebUtil.isNotNull(enumKey)) {
+							enumText = enumService.getValue(enumCode, enumKey);
+						}
+						if(StringUtils.isNotBlank(comboxField)){
+							setValueToCboOrClo(cbo, clo, comboxField, enumText);
+						}else {
+							setValueToCboOrClo(cbo, clo, enumAttr.toLowerCase(), enumText);
+						}
+					}
+				}
+			}
+		}
+	}
+
+	/**
+	 * 涓轰笟鍔$被鍨嬭缃��
+	 * @param cbo 涓氬姟绫诲瀷
+	 * @param clo 閾炬帴绫诲瀷
+	 * @param attr 灞炴�у悕
+	 * @param value 鍊�
+	 */
+	private void setValueToCboOrClo(ClientBusinessObject cbo,ClientLinkObject clo,String attr,String value){
+		try {
+			if (cbo != null) {
+				cbo.setAttributeValueWithNoCheck(attr, value);
+			}else{
+				setAttributeValueForClo(clo,attr, value);
+			}
+		} catch (Exception e) {
+			logger.error("setValueToCboOrClo",e);
+		}
+	}
+
+	/**
+	 * 缁欓摼鎺ョ被鍨嬭缃睘鎬�
+	 * @param clo 閾炬帴绫诲瀷
+	 * @param attributeName 灞炴�х殑鍚嶇О
+	 * @param attributeValue 灞炴�х殑鍊�
+	 */
+	@Override
+	public void setAttributeValueForClo(ClientLinkObject clo, String attributeName, String attributeValue) {
+		AttributeValue[] attrValues = clo.getLinkObject().newAttrValList;
+		ArrayList<AttributeValue> attrValList = new ArrayList();
+		AttributeValue attrVal;
+		int i;
+		if (attrValues != null && attrValues.length > 0) {
+			AttributeValue[] var9 = attrValues;
+			i = attrValues.length;
+
+			for (int var7 = 0; var7 < i; ++var7) {
+				attrVal = var9[var7];
+				attrValList.add(attrVal);
+			}
+		}
+
+		attrVal = null;
+		boolean isExist = false;
+
+		for (i = 0; i < attrValList.size(); ++i) {
+			attrVal = (AttributeValue) attrValList.get(i);
+			if (attrVal.attrName.toUpperCase().equals(attributeName.toUpperCase())) {
+				attrVal.attrVal = attributeValue;
+				isExist = true;
+				break;
+			}
+		}
+
+		if (!isExist) {
+			attrVal = new AttributeValue();
+			attrVal.attrName = attributeName.toUpperCase();
+			attrVal.attrVal = attributeValue;
+			attrValList.add(attrVal);
+		}
+
+		clo.getLinkObject().newAttrValList = (AttributeValue[]) attrValList.toArray(new AttributeValue[attrValList.size()]);
+	}
+
+
+	/**
+	 * 鏌ヨ閾炬帴绫诲瀷涓殑鏋氫妇灞炴�х殑瀵瑰簲鍊�
+	 * @param clo 閾炬帴绫诲瀷
+	 * @param enumAttrName 鏋氫妇灞炴��
+	 * @throws VciBaseException 鏌ヨ鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+	 */
+	private void queryEnumTextClo(ClientLinkObject clo,List<String> enumAttrName) throws VciBaseException{
+		queryEnumText(null,clo,enumAttrName);
+	}
+
+	/**
+	 * 浣跨敤鏌ヨ鏂规鏉ユ煡璇㈡暟鎹紝杩斿洖CBO锛屾敮鎸佸垎椤�
+	 * @param queryScheme 鏌ヨ鏂规
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @param replaceMap 鏇挎崲鏌ヨ鏂规閲岀殑鍙橀噺鍊�
+	 * @return 涓氬姟绫诲瀷
+	 * @throws VciBaseException 鏌ヨ鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+	 */
+	@Override
+	public List<ClientBusinessObject> queryCBOByScheme(String queryScheme,
+			Map<String, String> conditionMap, Map<String, String> replaceMap)
+			throws VciBaseException {
+		PageHelper ph = new PageHelper(-1);
+		return queryCBOByScheme(queryScheme,conditionMap,replaceMap,ph);
+	}
+
+
+	/**
+	 *  浣跨敤鏌ヨ鏂规鏉ユ煡璇㈡暟鎹紝杩斿洖CBO锛屾敮鎸佽嚜瀹氫箟鏌ヨ瀛楁锛屽寘鎷弬鐓у拰鏋氫妇;鍙傜収瀛楁浣跨敤xxx.yy;鏋氫妇瀛楁浣跨敤xxx_enumCode
+	 * @param queryScheme 鏌ヨ鏂规
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @param replaceMap 鏇挎崲鏌ヨ鏂规閲岀殑鍙橀噺鍊�
+	 * @param ph 鍒嗛〉鍜屾帓搴�
+	 * @return 涓氬姟鏁版嵁
+	 * @throws VciBaseException 鏌ヨ鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+	 */
+	@Override
+	public List<ClientBusinessObject> queryCBOByScheme(String queryScheme,
+			Map<String, String> conditionMap, Map<String, String> replaceMap,
+			PageHelper ph) throws VciBaseException {
+		List<String> clauseList = new ArrayList<String>();
+		clauseList.add("*");
+		return queryCBOByScheme(queryScheme,conditionMap,replaceMap,ph,clauseList);
+	}
+
+	/**
+	 * 浣跨敤鍚嶅瓧鑾峰彇鏌ヨ妯℃澘
+	 * @param name 鍚嶇О
+	 * @param replaceMap 婧愭暟鎹�
+	 * @return 鏌ヨ妯℃澘
+	 * @throws VciBaseException 鏌ヨ鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+	 */
+	@Override
+	public QueryTemplate getQtByName(String name, Map<String, String> replaceMap) throws VciBaseException{
+		QueryTemplate qt = null;
+		try{
+			VciBaseUtil.alertNotNull(name,"鏌ヨ妯℃澘鐨勫悕绉�");
+			QTWrapper wrapper = platformClientUtil.getQueryService().getQT(name);
+			qt = Tool.getQTByDoc(DocumentHelper.parseText(wrapper.qtText), name);
+			//鍥犱负涔嬪墠骞冲彴鐨凾ool.replaceQTValues 娌℃湁澶勭悊 ${xxx}銆傦紝 涓轰簡蹇界暐澶у皬鍐欙紝鎴戜滑杩欓噷鍗曠嫭澶勭悊 weidy@2021-3-10
+			//鎴戜滑杞崲涓哄皬鍐�
+			Condition condition = qt.getCondition();
+			Map<String,String> replaceLowMap = new HashMap<>();
+			if(condition !=null && condition.getCIMap()!=null){
+				Map<String, String> systemVarValueMap = VciSystemVarConstants.getSystemVarValueMap();
+				if(!CollectionUtils.isEmpty(replaceMap)){
+					replaceMap.forEach((key,value)->{
+						replaceLowMap.put(key.toLowerCase(),value);
+					});
+				}
+				Map<String, ConditionItem> ciMap = condition.getCIMap();
+				ciMap.forEach((ciId,ci)->{
+					if(ci.isLeaf()) {
+						LeafInfo lInfo = ci.getLeafInfo();
+						String value = lInfo.getValue().getOrdinaryValue();
+						if(StringUtils.isNotBlank(value)){
+							if(value.contains("#")){
+								//绯荤粺鍙橀噺.鏀寔涓�涓�
+								lInfo.getValue().setOrdinaryValue(systemVarValueMap.getOrDefault(value.toUpperCase(),""));
+							}else if(value.contains("${")){
+								//鏈�${xxxx}鐨勬柟寮�
+								if(!CollectionUtils.isEmpty(replaceLowMap)) {
+									try {
+										lInfo.getValue().setOrdinaryValue(VciBaseUtil.replaceByFreeMarker(value, replaceLowMap));
+									}catch (Throwable e){
+										logger.error("鍙兘閰嶇疆鏈夐棶棰橈紝鍦ㄨ浆鎹reemarker琛ㄨ揪寮忕殑鏃跺�欙紝娌℃湁鎵惧埌瀵瑰簲鐨勫�硷紝鐩墠琛ㄨ揪寮忎负{}",new String[]{value},e);
+									}
+								}
+							}else if(replaceLowMap.containsKey(value.toLowerCase())){
+								lInfo.getValue().setOrdinaryValue(replaceLowMap.get(value.toLowerCase()));
+							}
+						}
+					}
+				});
+			}
+		}catch(VCIError e){
+//			logger.error(e.error_code,e);
+//			throw WebUtil.getVciBaseException(e);
+		} catch (DocumentException e) {
+			logger.error("鏌ヨ妯℃澘杞崲",e);
+			throw new VciBaseException(this.msgCodePrefix + "qtError", new Object[]{name});
+		}
+		return qt;
+	}
+
+	/**
+	 * 鏍规嵁鏌ヨ妯℃澘鏉ユ煡璇㈡暟鎹�
+	 * @param queryScheme 鏌ヨ鏂规
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @param replaceMap 鏇挎崲鏌ヨ鏂规閲岀殑鍙橀噺鍊�
+	 * @param ph 鍒嗛〉鍜屾帓搴�
+	 * @param clauseList 鏌ヨ瀛楁
+	 * @return 涓氬姟鏁版嵁鍒楄〃
+	 * @throws VciBaseException 鏌ヨ鍑洪敊浼氭姏鍑哄紓甯�
+	 */
+	@Override
+	public List<ClientBusinessObject> queryCBOByScheme(String queryScheme,
+			Map<String, String> conditionMap, Map<String, String> replaceMap,
+			PageHelper ph, List<String> clauseList) throws VciBaseException {
+		QueryTemplate qt = getQtByName(queryScheme,replaceMap);
+		return baseQueryCBO(qt,conditionMap,ph,clauseList);
+	}
+
+	/**
+	 * 鏌ヨ涓暟
+	 * @param qt 鏌ヨ妯℃澘
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @return 涓暟
+	 * @throws VciBaseException 鏌ヨ鍑洪敊浼氭姏鍑哄紓甯�
+	 */
+	private int baseQueryCount(QueryTemplate qt,Map<String, String> conditionMap) throws VciBaseException{
+		List<String> clauseList = new ArrayList<String>();
+		clauseList.add("*");
+		qt.setClauseList(clauseList);
+		setRightValueToQueryTemplate(qt,conditionMap);//璁剧疆瀵嗙骇鏌ヨ锛屽拰鏁版嵁鏉冮檺鎺у埗
+		conditionMap = WebUtil.getNotNullMap(conditionMap);
+		Condition condition = getConditionByMap(conditionMap);
+		if(qt.getCondition() !=null) {
+			qt.setCondition(Tool.mergeCondition(qt.getCondition(), condition, Connector.AND));
+		}else {
+			qt.setCondition(condition);
+		}
+		int count = 0;
+		try{
+			count = platformClientUtil.getQueryService().findTotalCount(qt.getId(), Tool.qtTOXMl(qt).asXML());
+		}catch (VCIError e) {
+			try {
+				count = platformClientUtil.getQueryService().findTotalCount(qt.getId(), Tool.qtTOXMl(qt).asXML());
+			}catch (VCIError ee) {
+//				logger.error(ee.error_code,ee);
+//				throw WebUtil.getVciBaseException(ee);
+			}
+		} 
+		return count;
+	}
+
+	/**
+	 * 鏌ヨ涓暟
+	 * @param btmType 涓氬姟绫诲瀷鍚嶇О
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @return 涓暟
+	 * @throws VciBaseException 鏌ヨ鍑洪敊浼氭姏鍑哄紓甯�
+	 */
+	@Override
+	public int queryCount(String btmType, Map<String, String> conditionMap)
+			throws VciBaseException {
+		QueryTemplate qt = new QueryTemplate();
+		qt.setId("queryBOCount");
+		if(btmType.endsWith("_link")){
+			qt.setType(QTConstants.TYPE_LINK);
+		}else{
+			qt.setType(QTConstants.TYPE_BTM);
+		}
+		qt.setBtmType(btmType.toLowerCase());
+		return baseQueryCount(qt,conditionMap);
+	}
+	/**
+	 * 浣跨敤sql鏌ヨ涓暟锛屾渶缁堢殑瀛楁蹇呴』鏄痗ount
+	 * @param sql 鏌ヨ鐨剆ql
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @return 涓暟锛�
+	 * @throws VciBaseException 鏌ヨ鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+	 */
+	@Override
+	public int queryCountBySql(String sql,Map<String,String> conditionMap) throws VciBaseException{
+		WebUtil.alertNotNull(sql,"sql璇彞");
+		AttributeValue[] ava = null;
+		if(conditionMap!=null&&!conditionMap.isEmpty()){
+			ava = new AttributeValue[conditionMap.size()];
+			Iterator<String> it = conditionMap.keySet().iterator();
+			int i = 0 ;
+			while(it.hasNext()){
+				String key = it.next();
+				String value = conditionMap.get(key);
+				if(value == null){
+					value = "";
+				}
+				AttributeValue av = new AttributeValue(key, value);
+				ava[i] = av;
+				i++;
+			}
+		}else{
+			ava = new AttributeValue[0];
+		}
+		try {
+			String[][] results = platformClientUtil.getBOFactoryService().getSqlQueryResult(sql, ava);
+			if(results!=null && results.length>0 && results[0] != null && results[0].length>0){
+				return WebUtil.getInt(results[0][0]);
+			}
+		}catch (VCIError e){
+			throw WebUtil.getVciBaseException(e);
+		}
+		return 0;
+	}
+
+	/**
+	 * 鏍规嵁鏂规鏌ヨ涓暟
+	 * @param queryScheme 鏌ヨ鏂规
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @param replaceMap 鏇挎崲鏌ヨ鏂规閲岀殑鍙橀噺鍊�
+	 * @return 涓暟
+	 * @throws VciBaseException 鏌ヨ鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+	 */
+	@Override
+	public int queryCountByScheme(String queryScheme,
+			Map<String, String> conditionMap, Map<String, String> replaceMap)
+			throws VciBaseException {
+		QueryTemplate qt = getQtByName(queryScheme,replaceMap);
+		return baseQueryCount(qt,conditionMap);
+	}
+
+	 /**
+     * 浣跨敤瀵硅薄閲岀殑鏌ヨ鏂规鏉ユ煡璇㈡暟閲�
+     * @param c 瀵硅薄鎵�灞炵被
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @return 鏁伴噺
+     * @throws VciBaseException 鏌ヨ鍑洪敊浼氭姏鍑哄紓甯�
+     */
+	@Override
+	public int queryCount(Class c, Map<String, String> conditionMap)
+			throws VciBaseException {
+		return queryCount(WebUtil.getBtmTypeByObject(c), conditionMap);
+	}
+
+	/**
+     * 鏍规嵁sql璇彞鏉ユ煡璇㈠唴瀹� --sql涓嶈兘鏄痵elect * 鎴栬�� select t.* 
+     * @param sql 涓轰簡闃叉SQL娉ㄥ叆锛屽�煎繀椤诲湪sql璇彞閲屼互:xxx鏍煎紡锛屽 id =:idvalue锛岀劧鍚庡湪conditionMap涓坊鍔犲缓涓篿dvalue鐨勬牸寮�
+     * @param conditionMap 鏌ヨ鏉′欢锛屽繀椤讳笌sql閲屽搴�
+     * @return CBO
+     * @throws VciBaseException 鏌ヨ鍑洪敊浼氭姏鍑哄紓甯�
+     */
+	@Override
+	public List<ClientBusinessObject> queryBySql(String sql,
+			Map<String, String> conditionMap) throws VciBaseException {
+		List<Map> allData = queryBySqlForMap(sql,conditionMap);
+		if(allData == null || allData.size() == 0){
+			return new ArrayList<ClientBusinessObject>();
+		}else{
+			return map2Cbos(allData);
+		}
+	}
+
+	/**
+	 * 鍙敤sql璇彞鏌ヨ锛岃繖涓拰queryBySql鍖哄埆鏄紝鐗规畩鐨剆ql(濡傚寘鍚湁鍑芥暟鐨�)鍙互鐢ㄨ繖涓柟娉曪紝浣嗘槸鏈塻ql娉ㄥ叆椋庨櫓
+	 * @param sql sql璇彞锛屾煡璇㈡潯浠跺繀椤昏嚜琛屽湪鍏朵腑澶勭悊瀹屾垚
+	 * @return CBO
+	 * @throws VciBaseException 鏌ヨ鍑洪敊娲绘姏鍑哄紓甯�
+	 */
+	@Override
+	public List<ClientBusinessObject> queryByOnlySql(String sql) throws VciBaseException{
+		List<Map> allData = queryByOnlySqlForMap(sql);
+		if(allData == null || allData.size() == 0){
+			return new ArrayList<ClientBusinessObject>();
+		}else{
+			return map2Cbos(allData);
+		}
+	}
+
+	/**
+	 * 鍙敤sql璇彞鏌ヨ锛岃繖涓拰queryBySqlForMap鍖哄埆鏄紝鐗规畩鐨剆ql(濡傚寘鍚湁鍑芥暟鐨�)鍙互鐢ㄨ繖涓柟娉曪紝浣嗘槸鏈塻ql娉ㄥ叆椋庨櫓
+	 * @param sql sql璇彞锛屾煡璇㈡潯浠跺繀椤昏嚜琛屽湪鍏朵腑澶勭悊瀹屾垚
+	 * @return 鏁版嵁鏄犲皠
+	 * @throws VciBaseException 鏌ヨ鍑洪敊娲绘姏鍑哄紓甯�
+	 */
+	@Override
+	public List<Map> queryByOnlySqlForMap(String sql) throws VciBaseException{
+		if(StringUtils.isBlank(sql)){
+			return new ArrayList<>();
+		}
+		List<Map> dataList = new ArrayList<>();
+		try {
+			KV[][] kvs = platformClientUtil.getQueryService().queryBySql(sql);
+			if(kvs!=null && kvs.length>0){
+				for (int i = 0; i < kvs.length; i++) {
+					Map<String,String> data = new HashMap<>();
+					KV[] kv = kvs[i];
+					if(kv!=null && kv.length >0){
+						for (int j = 0; j < kv.length; j++) {
+							KV kv1 = kv[j];
+							data.put(kv1.key,kv1.value);
+						}
+					}
+					dataList.add(data);
+				}
+			}
+		} catch (VCIError e) {
+			throw WebUtil.getVciBaseException(e);
+		}
+		return dataList;
+	}
+
+	/**
+	 * 浣跨敤sql璇彞鏌ヨ鍚庤浆鎹负瀵硅薄
+	 * @param sql sql璇彞
+	 * @param tClass 瀵硅薄鐨勭被
+	 * @param <T> 娉涘瀷
+	 * @return 鏁版嵁鐨勫垪琛�
+	 * @throws VciBaseException 鏌ヨ鍜岃浆鎹㈠嚭閿欎細鎶涘嚭寮傚父
+	 */
+	@Override
+	public <T> List<T> queryByOnlySqlForObj(String sql, Class<T> tClass) throws VciBaseException{
+		List<Map> allData = queryByOnlySqlForMap(sql);
+		//闇�瑕佽浆鎹竴涓媍bo鐨勯偅涓睘鎬�
+		Map<String/**涓氬姟绫诲瀷涓殑瀛楁*/, String/**灞炴�ч噷鐨勫瓧娈�**/> fieldNameMap = WebUtil.getFieldNameMap(tClass);
+		List<T> dataList = new ArrayList<>();
+		if(!CollectionUtils.isEmpty(allData)){
+			allData.stream().forEach(data->{
+				Map thisData = new HashMap();
+				if(!CollectionUtils.isEmpty(data)){
+					data.forEach((key,value)->{
+						thisData.put(fieldNameMap.getOrDefault(((String)key).toLowerCase(Locale.ROOT), (String) key),value);
+					});
+				}
+				try {
+					Object o = VciBaseUtil.mapToBean(thisData, tClass);
+					dataList.add((T)o);
+				} catch (Exception e) {
+					if(logger.isErrorEnabled()){
+						logger.error("杞崲閿欒",e);
+					}
+				}
+			});
+		}
+		return dataList;
+	}
+
+	 /**
+     * 鏍规嵁sql璇彞鏉ユ煡璇㈠唴瀹癸紝杩斿洖Map----sql涓嶈兘鏄痵elect * 鎴栬�� select t.* 
+     * @param sql 涓轰簡闃叉SQL娉ㄥ叆锛屽�煎繀椤诲湪sql璇彞閲屼互:xxx鏍煎紡锛屽 id =:idvalue锛岀劧鍚庡湪conditionMap涓坊鍔犲缓涓篿dvalue鐨勬牸寮�
+     * @param conditionMap  鏌ヨ鏉′欢锛屽繀椤讳笌sql閲屽搴�
+     * @return 涓氬姟鏁版嵁鐨勬槧灏�
+     * @throws VciBaseException 鏌ヨ鍑洪敊浼氭姏鍑哄紓甯�
+     */
+	@Override
+	public List<Map> queryBySqlForMap(String sql,
+			Map<String, String> conditionMap) throws VciBaseException {
+		return queryBySqlForMap(sql,conditionMap,null);
+	}
+
+	/**
+	 * 鍜屼笂涓柟娉曚竴鏍凤紝澶氫紶浜嗘煡璇㈠瓧娈� selectKeys
+	 * @param sql sql璇彞
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @param selectKeys 鏌ヨ鐨勫瓧娈�
+	 * @return 鏁版嵁
+	 * @throws VciBaseException 鏌ヨ鍑洪敊浼氭姏鍑哄紓甯�
+	 */
+	@Override
+	public List<Map> queryBySqlForMap(String sql,Map<String, String> conditionMap, String[] selectKeys) throws VciBaseException {
+
+		if(WebUtil.isNull(sql) || sql.toLowerCase(Locale.ROOT).indexOf("select") <0 || sql.toLowerCase(Locale.ROOT).indexOf("from") < 0){
+			throw new VciBaseException(msgCodePrefix + "sqlError",new String[]{sql});
+		}
+
+		//澶勭悊澶у啓FROM,骞冲彴鏌ヨ浼氭姤閿�
+		if(sql.contains(" FROM ")){
+			sql = sql.replaceAll(" FROM "," from ");
+		}
+
+		AttributeValue[] ava = null;
+		if(conditionMap!=null&&!conditionMap.isEmpty()){
+			ava = new AttributeValue[conditionMap.size()];
+			Iterator<String> it = conditionMap.keySet().iterator();
+			int i = 0 ;
+			while(it.hasNext()){
+				String key = it.next();
+				String value = conditionMap.get(key);
+				if(value == null){
+					value = "";
+				}
+				AttributeValue av = new AttributeValue(key, value);
+				ava[i] = av;
+				i++;
+			}
+		}else{
+			ava = new AttributeValue[0];
+		}
+		try {
+			String[][] results =platformClientUtil.getBOFactoryService().getSqlQueryResult(sql, ava);
+			if(results.length>0){
+				if(selectKeys==null) {
+					String selectSql = sql.substring(sql.toLowerCase(Locale.ROOT).indexOf("select") + 6, sql.toLowerCase(Locale.ROOT).indexOf(" from")).trim();
+					selectKeys = selectSql.split(",");
+				}
+				List<Map> allData = new ArrayList<Map>();
+				for(int i = 0 ; i < results.length ;i ++){
+					String[] values = results[i];
+					Map<String,String> map = new HashMap<String, String>();
+					for(int j = 0 ; j < selectKeys.length; j ++){
+						String field = selectKeys[j];
+						if(WebUtil.isNotNull(field)){
+							//field = field.toLowerCase().trim();
+							//鏈夊彲鑳芥湁as鐨勬儏鍐�  鎴栬�呯┖鏍� 鎴栬�呮湁.鐨勬儏鍐�
+							//蹇呴』浼樺厛澶勭悊as鍜岀┖鏍肩殑鎯呭喌锛屾渶鍚庡鐞�.
+							if(field.indexOf(" as ")>-1){
+								field = field.substring(field.lastIndexOf(" as ") + 4);
+							}else if(field.indexOf(" ")>-1){
+								field =field.substring(field.lastIndexOf(" ") + 1);
+							}else if(field.indexOf(".")>-1){
+								field = field.substring(field.lastIndexOf(".") + 1);
+							}
+							//鑾峰彇鍊�
+							String value = "";
+							if(values.length>j){
+								value = values[j] == null?"":values[j];
+							}
+							map.put(field, value);
+						}
+					}
+					allData.add(map);
+				}
+				return allData;
+			}else{
+				return new ArrayList<Map>();
+			}
+		} catch (VCIError e) {
+//			logger.error(e.error_code,e);
+			throw WebUtil.getVciBaseException(e);
+		}
+	}
+
+
+	 /**
+     * 鏌ヨ鏁版嵁锛岃繑鍥炲璞★紝瀵硅薄鐨勫瓧娈典笂鍙互璁剧疆鍙傜収鍜屾灇涓�
+     * @param c 瀵硅薄鎵�灞炵被
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @return 涓氬姟鏁版嵁瀵硅薄
+     * @throws VciBaseException 鏌ヨ鍑洪敊浼氭姏鍑哄紓甯�
+     */
+	@Override
+	public <T> List<T> queryObject(Class<T> c, Map<String, String> conditionMap)
+			throws VciBaseException {
+		return queryObject(c,conditionMap,new PageHelper(-1));
+	}
+
+	 /**
+     * 鏌ヨ鏁版嵁锛岃繑鍥炲璞★紝鏀寔鍒嗛〉
+     * @param c 瀵硅薄鎵�灞炵被
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param ph 鍒嗛〉缁勪欢
+     * @return 涓氬姟鏁版嵁瀵硅薄
+     * @throws VciBaseException 鏌ヨ鍑洪敊浼氭姏鍑哄紓甯�
+     */
+	@Override
+	public <T> List<T> queryObject(Class<T> c,
+			Map<String, String> conditionMap, PageHelper ph)
+			throws VciBaseException {
+		//鐩存帴浠庡璞¢噷鍘绘煡璇笟鍔$被鍨嬬殑鍚嶇О
+		swapConditionMap(c,conditionMap);
+		//鑾峰彇瑕佹煡璇㈢殑鎵�鏈夌殑鍒�
+		Map<String,String> allFieldAttrMap = WebUtil.getFieldNameMap(c);
+		if(!allFieldAttrMap.containsKey("lctid")){
+			allFieldAttrMap.put("lctid","lctid");
+		}
+	    List<String> queryAttr = new ArrayList<String>();
+	    Iterator<String> it = allFieldAttrMap.keySet().iterator();
+	    while(it.hasNext()){
+	    	queryAttr.add(it.next());
+	    }
+	    for(String columnName:queryAttr){
+	    	String fieldName = allFieldAttrMap.get(columnName);
+	    	allFieldAttrMap.remove(columnName);
+			allFieldAttrMap.put(columnName.toLowerCase(),fieldName);
+		}
+		List<T> allObject = new ArrayList<T>();
+		List<ClientBusinessObject> allCbos = queryCBO(WebUtil.getBtmTypeByObject(c), conditionMap, ph, allFieldAttrMap.keySet().stream().collect(Collectors.toList()));//鎵ц鏌ヨ
+		List<String> oids = new ArrayList<String>();
+		
+		if(allCbos!=null&&allCbos.size()>0){
+			for(ClientBusinessObject cbo : allCbos){
+				T obj  = null;
+				try {
+					obj = c.newInstance();
+					WebUtil.copyValueToObjectFromCbos(cbo, obj,allFieldAttrMap);//涓轰簡灏戝幓鏌ヨ涓�娆″瓧娈�
+				} catch (InstantiationException e) {
+					
+				} catch (IllegalAccessException e) {
+				}
+				if(obj !=null){
+					oids.add(cbo.getOid());
+					allObject.add(obj);
+				}
+			}
+		}
+		return allObject;
+	}
+
+	/**
+	 * 杞崲鏌ヨ鏉′欢
+	 * @param c 瀵硅薄绫�
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @throws VciBaseException 杞崲鍑洪敊
+	 */
+	private void swapConditionMap(Class c ,Map<String,String> conditionMap) throws VciBaseException{
+		WebUtil.alertNotNull(c,"瀵硅薄鎵�灞炵被");
+		if(conditionMap == null){
+			conditionMap = new HashMap<String, String>();
+		}
+		conditionMap = WebUtil.getNotNullMap(conditionMap);
+		//瀵逛簬鏄弬鐓у瓧娈电殑锛屼篃瑕佹鏌onditionMap閲岄潰鏄惁鏈夛紝鏈夌殑璇濋渶瑕佹浛鎹㈡垚xxx.yy杩欑鏍煎紡
+		try{
+			if(conditionMap.size()>0){
+				Map<String,String> fieldMap = WebUtil.getFieldNameMap(c);
+				Iterator<String> it = fieldMap.keySet().iterator();
+				while(it.hasNext()){
+					String attrName = it.next();
+					if(attrName.indexOf(".")>-1){
+						//璇存槑鏄弬鐓х殑
+						String fieldName = fieldMap.get(attrName).toLowerCase();
+						if(conditionMap.containsKey(fieldName)){
+							String value = conditionMap.get(fieldName);
+							conditionMap.remove(fieldName);
+							conditionMap.put(attrName, value);
+						}
+					}
+				}
+			}
+		}catch(Throwable e){
+			if(logger.isErrorEnabled()){
+				logger.error("杞崲鏉′欢鍑洪敊",e);
+			}
+		}
+	}
+
+	 /**
+     * 浣跨敤鏌ヨ鏂规鏉ユ煡璇㈡暟鎹紝杩斿洖瀵硅薄锛屾敮鎸佸垎椤�
+     * @param queryScheme 鏌ヨ鏂规
+     * @param c 瀵硅薄鎵�灞炵被
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param ph 鍒嗛〉缁勪欢
+     * @return 涓氬姟瀵硅薄
+     * @throws VciBaseException  鏌ヨ鍑洪敊浼氭姏鍑哄紓甯�
+     */
+	@Override
+	public <T> List<T> queryObjectByScheme(String queryScheme, Class<T> c,
+			Map<String, String> conditionMap, PageHelper ph)
+			throws VciBaseException {
+		return queryObjectByScheme(queryScheme,c,conditionMap,ph,null);
+	}
+
+	 /**
+     * 浣跨敤鏌ヨ鏂规鏉ユ煡璇㈡暟鎹紝杩斿洖瀵硅薄锛屾敮鎸佸垎椤�
+     * @param queryScheme 鏌ヨ鏂规
+     * @param c 瀵硅薄鎵�灞炵被
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param ph 鍒嗛〉缁勪欢
+     * @param replaceMap 鏇挎崲鏌ヨ鏂规涓殑鍙橀噺鍊�
+     * @return 鏁版嵁瀵硅薄
+     * @throws VciBaseException 鏌ヨ鍑洪敊浼氭姏鍑哄紓甯�
+     */
+	@Override
+	public <T> List<T> queryObjectByScheme(String queryScheme, Class<T> c,
+			Map<String, String> conditionMap, PageHelper ph,
+			Map<String, String> replaceMap) throws VciBaseException {
+		WebUtil.alertNotNull(queryScheme,"鏌ヨ鏂规");
+		//鐩存帴浠庡璞¢噷鍘绘煡璇笟鍔$被鍨嬬殑鍚嶇О
+		swapConditionMap(c,conditionMap);
+		//鑾峰彇瑕佹煡璇㈢殑鎵�鏈夌殑鍒�
+		Map<String,String> allFieldAttrMap = WebUtil.getFieldNameMap(c);
+	    List<String> queryAttr = new ArrayList<String>();
+	    Iterator<String> it = allFieldAttrMap.keySet().iterator();
+	    while(it.hasNext()){
+	    	queryAttr.add(it.next());
+	    }
+		for(String columnName:queryAttr){
+			String fieldName = allFieldAttrMap.get(columnName);
+			allFieldAttrMap.remove(columnName);
+			allFieldAttrMap.put(columnName.toLowerCase(),fieldName);
+		}
+		List<T> allObject = new ArrayList<T>();
+		List<ClientBusinessObject> allCbos = queryCBOByScheme(queryScheme, conditionMap, replaceMap,ph, allFieldAttrMap.keySet().stream().collect(Collectors.toList()));
+		List<String> oids = new ArrayList<String>();
+		if(allCbos!=null&&allCbos.size()>0){
+			for(ClientBusinessObject cbo : allCbos){
+				T obj  = null;
+				try {
+					obj = c.newInstance();
+					WebUtil.copyValueToObjectFromCbos(cbo, obj,allFieldAttrMap);//涓轰簡灏戝幓鏌ヨ涓�娆″瓧娈�
+				} catch (InstantiationException e) {
+					
+				} catch (IllegalAccessException e) {
+				}
+				if(obj !=null){
+					oids.add(cbo.getOid());
+					allObject.add(obj);
+				}
+			}
+		}
+		return allObject;
+	}
+
+	/**
+	 * 淇濆瓨鏁版嵁锛屽彲浠ュ湪request涓缃槸鍚︽寔涔呭寲
+	 *
+	 * @param obj 瑕佷繚瀛樼殑瀵硅薄
+	 * @return 淇濆瓨鍚庡寘鍚殑鏁版嵁瀵硅薄
+	 * @throws VciBaseException 娣诲姞鍑洪敊浼氭姏鍑哄紓甯�
+	 */
+	@Override
+	public <T> BatchCBO addSave(T obj) throws VciBaseException {
+		List<T> list = new ArrayList<T>();
+		list.add(obj);
+		return batchAddSave(list);
+	}
+
+	/**
+	 * 鍊煎姞鍒版煡璇㈡潯浠剁殑map閲�
+	 * @param field 灞炴�у悕瀛�
+	 * @param value 灞炴�у��
+	 * @return 鏌ヨ鏉′欢鐨刴ap
+	 */
+	public Map<String, String> getOneQuery(String field, String value) {
+		return this.getOneQuery(field, value, "");
+	}
+
+	/**
+	 *  鍊煎姞鍒版煡璇㈡潯浠剁殑map閲�
+	 * @param field 灞炴�у悕瀛�
+	 * @param value 灞炴�у��
+	 * @param options 鎿嶄綔绗�
+	 * @return 鏌ヨ鏉′欢鐨刴ap
+	 */
+	public Map<String, String> getOneQuery(String field, String value, String options) {
+		Map<String, String> conditionMap = new HashMap();
+		options = WebUtil.isNull(options) ? "" : (options.indexOf("\\") > -1 ? options.toUpperCase() : "\\" + options.toUpperCase());
+		conditionMap.put(field, options + value);
+		return conditionMap;
+	}
+
+	/**
+	 * 璁剧疆鍊煎埌涓氬姟鏁版嵁瀵硅薄涓�
+	 * @param obj 瀵硅薄鐨勫��
+	 * @param btmType 涓氬姟绫诲瀷鐨勫悕绉�
+	 * @param cbo 涓氬姟鏁版嵁瀵硅薄
+	 * @param isEdit 鏄惁涓虹紪杈�
+	 * @throws VciBaseException 璁剧疆鍑洪敊浼氭姏鍑哄紓甯�
+	 */
+	private void setValueToCbo(Object obj,String btmType,ClientBusinessObject cbo ,boolean isEdit) throws VciBaseException{
+		Field pkField = WebUtil.getPkFieldForObj(obj.getClass());
+		if(pkField == null){
+			throw new VciBaseException("{0}绫讳腑娌℃湁瀹氫箟涓婚敭灞炴��",new Object[]{obj.getClass()});
+		}
+		//涓婚敭
+		Object pkValue = WebUtil.getValueFromField(pkField.getName(), obj);
+		if(pkValue == null || (pkValue instanceof String && WebUtil.isNull(pkValue.toString()))){
+			WebUtil.setValueToField(pkField.getName(), obj, cbo.getOid());
+			pkValue = cbo.getOid();
+		}else{
+			cbo.setOid(pkValue.toString());
+		}
+		//杩涜闈炵┖锛岄暱搴︼紝閲嶅鐨勬牎楠屻�傘�傛牎楠岄�氳繃鐨勮祴鍊�
+		Map<String,String> fieldMap = WebUtil.getFieldNameMap(obj.getClass());
+		Iterator<String> it = fieldMap.keySet().iterator();
+    	while(it.hasNext()){
+    		String attrName = it.next();
+    		String fieldName = fieldMap.get(attrName);
+    		attrName = attrName.toLowerCase();
+    		if(attrName.indexOf(".")<0 && attrName.indexOf("_")<0 && !attrName.toLowerCase().equalsIgnoreCase("lcstatus_text") && !attrName.toLowerCase().equals("lcstatustext")){//涓嶆槸鍙傜収鐨勫睘鎬ф墠鑳借祴鍊�
+    			Field thisField = WebUtil.getFieldForObject(fieldName, obj);
+    			String value = WebUtil.getValueFromFieldForCbo(thisField, obj);
+
+    			if(thisField.isAnnotationPresent(Column.class)){
+    				//闇�瑕佹牎楠岄噸澶嶅拰涓虹┖.鑰屼笖閰嶇疆浜咰olumn鐨�
+    				Column column = (Column)thisField.getAnnotation(Column.class);
+					String columnText = column.columnDefinition();
+					columnText = StringUtils.isNotBlank(columnText)?columnText:fieldName;
+    				//鍥涗釜榛樿灞炴�т笉鍒ゆ柇闈炵┖
+					boolean is4 = false;//鏄笉鏄�4涓睘鎬�
+					String[] defaultFieldName_notChecks = {"creator","lastModifier","ts","oid","createTime"};
+					//鍒ゆ柇fieldName涓嶆槸
+					for (String defaultFieldName_notCheck:defaultFieldName_notChecks){
+						if(defaultFieldName_notCheck.equals(fieldName)){
+							is4 = true;
+						}
+					}
+					if(!is4) {//涓嶆槸4涓睘鎬ф墠鍒ゆ柇闈炵┖
+						//鍒ゆ柇闈炵┖
+						if (!column.nullable() && WebUtil.isNull(value)) {
+							throw new VciBaseException("{0}瀛楁涓嶈兘涓虹┖", new Object[]{columnText});
+						}
+					}
+
+					value = value==null?"":value;
+    				if(column.length()>0 && value.length()> column.length()){//闀垮害
+    					throw new VciBaseException("{0}瀛楁鐨勯暱搴﹀お闀匡紝瑕佹眰{1},瀹為檯{2}", new Object[]{columnText,column.length(),value.length()});
+    				}
+    				if(!thisField.equals(pkField) && column.unique()){
+    					//璇存槑涓嶈兘閲嶅锛岄偅涔堝氨闇�瑕佹煡璇竴涓�
+    					Map<String,String> queryRepeatMap = getOneQuery(attrName, value);
+    					if(isEdit){
+    						queryRepeatMap.put("oid", QueryOptionConstant.NOTEQUAL + cbo.getOid());
+    					}
+    					if(queryCount(btmType, queryRepeatMap)>0){
+    						throw new VciBaseException("{0}瀛楁鐨勫�納1}鍦ㄧ郴缁熶腑宸茬粡瀛樺湪", new Object[]{columnText,value});
+    					}
+    				}
+    			}
+				if(value==null){
+					continue;
+				}
+    			if(isEdit && checkUnAttrUnEdit(attrName)){
+    				//缂栬緫鐨勬椂鍊欙紝TS鍜孫ID涓嶈兘璁剧疆.鍥犱负骞冲彴閭f帴鍙h缃簡灏变細鎶ラ敊
+				}else {
+					try {
+						//闇�瑕佸垽鏂槸鍚﹂粯璁ょ殑灞炴�э紝濡傛灉鏄粯璁ゅ睘鎬э紝鍒欎娇鐢ㄥ璞$殑璧嬪�肩殑鏂瑰紡
+						if (WebUtil.isDefaultField(fieldName) && WebUtil.inArray(new String[]{"id", "name", "description","lcstatus","revisionvalue","versionvalue"}, fieldName.toLowerCase())) {
+							WebUtil.setValueToField(fieldName, cbo, value);
+							cbo.setAttributeValueWithNoCheck(attrName.toLowerCase(), value);
+						} else {
+							cbo.setAttributeValueWithNoCheck(attrName.toLowerCase(), value);
+						}
+					} catch (VCIError e) {
+						throw WebUtil.getVciBaseException(e);
+					}
+				}
+    		}
+    	}
+	}
+
+	/**
+     * 鎵归噺淇濆瓨鏁版嵁锛屽彲浠ュ湪request閲岃缃笉鎸佷箙鍖�
+     * @param list 瑕佷繚瀛樼殑鏁版嵁瀵硅薄鍒楄〃
+     * @return 闇�瑕佸垱寤虹殑CBO,CLO;闇�瑕佷慨鏀圭殑CBO,CLO;闇�瑕佸垹闄ょ殑CBO,CLO
+     * @throws VciBaseException 鎶ラ敊鍑洪敊浼氭姏鍑哄紓甯�
+     */
+	@Override
+	public <T> BatchCBO batchAddSave(List<T> list)
+			throws VciBaseException {
+		if(list==null){
+			throw new VciBaseException(VciBaseException.paramNull);
+		}
+		Set<ClientBusinessObject> allCbos = new HashSet<ClientBusinessObject>();
+		for(T obj : list){
+			//闇�瑕佸鐞嗛粯璁ゅ��
+			Field pkField = WebUtil.getPkFieldForObj(obj.getClass());
+			if(pkField == null){
+				throw new VciBaseException("{0}瀵硅薄涓病鏈夎缃富閿殑灞炴��",new Object[]{obj.getClass()});
+			}
+			String btmType = WebUtil.getBtmTypeByObject(obj.getClass());
+			ClientBusinessObject cbo = createCBOByBtmName(btmType);
+			setValueToCbo(obj,btmType,cbo,false);
+	    	allCbos.add(cbo);
+		}
+		//鍥犱负浣跨敤浜嗗钩鍙帮紝浜嬪姟娌″姙娉曠粺涓�锛屾墍浠ュ彧鑳芥槸鍦ㄦ湇鍔¤皟鐢ㄦ湇鍔′箣闂寸殑鏃跺�欙紝杩斿洖瑕佷繚瀛樼殑鏁版嵁锛�
+		BatchCBO batchCbo = new BatchCBO();
+		batchCbo.setCreateCbos(allCbos);
+		if(allCbos.size()>0 && WebUtil.isPersistence()){
+			if(logger.isInfoEnabled()) {
+				logger.info("鎵ц浜嗘寔涔呭寲");
+			}
+			persistenceBatch(batchCbo);
+		}
+		return batchCbo;
+	}
+
+	/**
+	 * 淇敼鏁版嵁锛屽彲浠ュ湪request閲岃缃笉鎸佷箙鍖�
+	 *
+	 * @param obj 淇敼鏁版嵁瀵硅薄
+	 * @return 闇�瑕佸垱寤虹殑CBO, CLO;闇�瑕佷慨鏀圭殑CBO,CLO;闇�瑕佸垹闄ょ殑CBO,CLO
+	 * @throws VciBaseException 淇敼鍑洪敊浼氭姏鍑哄紓甯�
+	 */
+	@Override
+	public <T> BatchCBO editSave(T obj) throws VciBaseException {
+		List<Object> list = new ArrayList<Object>();
+		list.add(obj);
+		return batchEditSave(list);
+	}
+
+
+	/**
+     * 鎵归噺淇敼鏁版嵁锛屽彲浠ュ湪request閲岃缃笉鎸佷箙鍖�
+     * @param list 瑕佷繚瀛樼殑鏁版嵁瀵硅薄鍒楄〃
+     * @return 闇�瑕佸垱寤虹殑CBO,CLO;闇�瑕佷慨鏀圭殑CBO,CLO;闇�瑕佸垹闄ょ殑CBO,CLO
+     * @throws VciBaseException 淇敼鍑洪敊浼氭姏鍑哄紓甯�
+     */
+	@Override
+	public <T> BatchCBO batchEditSave(List<T> list)
+			throws VciBaseException {
+		if(list==null){
+			throw new VciBaseException(VciBaseException.paramNull);
+		}
+		Set<ClientBusinessObject> allUpdateCbos = new HashSet<ClientBusinessObject>();
+		Set<ClientBusinessObject> allDeleteCbos = new HashSet<ClientBusinessObject>();
+		Set<ClientBusinessObject> allAddCbos = new HashSet<ClientBusinessObject>();
+		Map<String,String> btmOidsMap = new HashMap<String, String>();
+		for(T obj : list){
+			String btmType = WebUtil.getBtmTypeByObject(obj.getClass());
+			String tempOids = "";
+			if(btmOidsMap.containsKey(btmType)){
+				tempOids = btmOidsMap.get(btmType);
+			}
+			
+			Field pkField = WebUtil.getPkFieldForObj(obj.getClass());
+			if(pkField == null){
+				throw new VciBaseException("{0}瀵硅薄涓病鏈夎缃富閿殑灞炴��",new Object[]{obj.getClass()});
+			}
+			//涓婚敭
+			Object pkValue = WebUtil.getValueFromField(pkField.getName(), obj);
+			if(pkValue == null || (pkValue instanceof String && WebUtil.isNull(pkValue.toString()))){
+			}else{
+				tempOids += "'" + pkValue.toString() + "',";
+			}
+			btmOidsMap.put(btmType, tempOids);
+		}
+		List<ClientBusinessObject> needUpdateCbos = new ArrayList<ClientBusinessObject>();
+		Iterator<String> it = btmOidsMap.keySet().iterator();
+		while(it.hasNext()){
+			String btmType = it.next();
+			String oids = WebUtil.removeComma(btmOidsMap.get(btmType));
+			Map<String,String> conditionMap = new HashMap<String, String>();
+			conditionMap.put("oid", QueryOptionConstant.IN +"(" + oids + ")");
+			needUpdateCbos.addAll(queryCBO(btmType, conditionMap));
+		}
+		//闇�瑕佸厛浠庡悗鍙版煡璇�
+		for(T obj : list){
+			//闇�瑕佸鐞嗛粯璁ゅ��
+			Field pkField = WebUtil.getPkFieldForObj(obj.getClass());
+			if(pkField == null){
+				throw new VciBaseException("{0}瀵硅薄涓病鏈夎缃富閿殑灞炴��",new Object[]{obj.getClass()});
+			}
+			//涓婚敭
+			Object pkValue = WebUtil.getValueFromField(pkField.getName(), obj);
+			ClientBusinessObject cbo = null;
+			if(pkValue == null || (pkValue instanceof String && WebUtil.isNull(pkValue.toString()))){
+				continue;
+			}else{
+				for(ClientBusinessObject tempCbo : needUpdateCbos){
+					if(tempCbo.getOid().equalsIgnoreCase(pkValue.toString().trim())){
+						cbo = tempCbo;
+						break;
+					}
+				}
+			}
+			String btmType = WebUtil.getBtmTypeByObject(obj.getClass());
+			//鎷疯礉涔嬪墠鍏堟竻闄ゅ凡缁忔湁鐨勫��
+			cbo.getBusinessObject().newAttrValList = new AttributeValue[0];
+			setValueToCbo(obj,btmType,cbo,true);
+			allUpdateCbos.add(cbo);
+		}
+		BatchCBO batchCbo = new BatchCBO();
+		batchCbo.setCreateCbos(allAddCbos);
+		batchCbo.setUpdateCbos(allUpdateCbos);
+		batchCbo.setDeleteCbos(allDeleteCbos);
+		//鍥犱负浣跨敤浜嗗钩鍙帮紝浜嬪姟娌″姙娉曠粺涓�锛屾墍浠ュ彧鑳芥槸鍦ㄦ湇鍔¤皟鐢ㄦ湇鍔′箣闂寸殑鏃跺�欙紝杩斿洖瑕佷繚瀛樼殑鏁版嵁锛�
+		if(WebUtil.isPersistence()){
+			persistenceBatch(batchCbo);
+		}
+		return batchCbo;
+	}
+
+	/**
+	 * 鍒犻櫎鏁版嵁锛屽彲浠ュ湪request閲岃缃笉鎸佷箙鍖�
+	 *
+	 * @param obj 鍒犻櫎鏁版嵁瀵硅薄
+	 * @return 闇�瑕佸垱寤虹殑CBO, CLO;闇�瑕佷慨鏀圭殑CBO,CLO;闇�瑕佸垹闄ょ殑CBO,CLO
+	 * @throws VciBaseException 鍒犻櫎鍑洪敊浼氭姏鍑哄紓甯�
+	 */
+	@Override
+	public <T> BatchCBO delete(T obj) throws VciBaseException {
+		return delete(obj,true);
+	}
+	@Override
+	public <T> BatchCBO delete(T obj,boolean checkRefered) throws VciBaseException{
+		List<T> list = new ArrayList<T>();
+		list.add(obj);
+		return batchDelete(list,checkRefered);
+	}
+
+
+	/**
+     * 鎵归噺鍒犻櫎鏁版嵁锛屽彲浠ュ湪request閲岃缃笉鎸佷箙鍖�
+     * @param list 闇�瑕佸垹闄ゆ暟鎹璞″垪琛�
+     * @return 闇�瑕佸垱寤虹殑CBO,CLO;闇�瑕佷慨鏀圭殑CBO,CLO;闇�瑕佸垹闄ょ殑CBO,CLO
+     * @throws VciBaseException  鍒犻櫎鍑洪敊浼氭姏鍑哄紓甯�
+     */
+	@Override
+	public <T> BatchCBO batchDelete(List<T> list)
+			throws VciBaseException {
+		return batchDelete(list,true);
+	}
+
+	/**
+	 * 鎵归噺鍒犻櫎
+	 * @param list 闇�瑕佸垹闄ゆ暟鎹璞″垪琛�
+	 * @param checkRefered 鏄惁鍒犻櫎寮曠敤鐨勬暟鎹�
+	 * @param <T> 绫诲瀷
+	 * @return 鍙楀奖鍝嶇殑琛屾暟
+	 * @throws VciBaseException 鎵ц鍑洪敊浼氭姏鍑哄紓甯�
+	 */
+	@Override
+	public <T> BatchCBO batchDelete(List<T> list,boolean checkRefered) throws VciBaseException{
+		if(list==null){
+			throw new VciBaseException(VciBaseException.paramNull);
+		}
+		Set<ClientBusinessObject> allDeleteCbos = new HashSet<ClientBusinessObject>();
+		Map<String,List<ClientBusinessObject>> btmBos = new HashMap<String, List<ClientBusinessObject>>();
+		for(Object obj : list){
+			//鏈夊彲鑳戒笉灞炰簬鍚屼竴涓笟鍔$被鍨嬩笅
+			Field pkField = WebUtil.getPkFieldForObj(obj.getClass());
+			if(pkField == null){
+				throw new VciBaseException("{0}瀵硅薄涓病鏈夎缃富閿殑灞炴��",new Object[]{obj.getClass()});
+			}
+			String btmType = WebUtil.getBtmTypeByObject(obj.getClass());
+			String pkValue = WebUtil.getValueFromFieldForCbo(pkField, obj);
+			//鎵�浠ヨ繖閲屼篃鏄洿鎺ユ煡璇㈢殑鍗曚釜'
+			List<ClientBusinessObject> deleteCbos = queryCBO(btmType, getOneQuery(
+					WebUtil.getCboAttrNameFromField(pkField, obj.getClass()), pkValue));
+			if(deleteCbos!=null){
+				allDeleteCbos.addAll(deleteCbos);
+				if(!btmBos.containsKey(btmType)){
+					btmBos.put(btmType, deleteCbos);
+				}else{
+					btmBos.get(btmType).addAll(deleteCbos);
+				}
+			}
+		}
+
+		//涓嶆墽琛岄獙璇侊紝鏄痶rue鎵嶆鏌ワ紝榛樿涓嶆鏌�
+		if(checkRefered) {
+			checkCanDelete(btmBos);
+		}
+
+		BatchCBO batchCbo = new BatchCBO();
+		batchCbo.setDeleteCbos(allDeleteCbos);
+		if(allDeleteCbos.size()>0 && WebUtil.isPersistence()){
+			persistenceBatch(batchCbo);
+		}
+		return batchCbo;
+	}
+
+	/**
+	 * 鏍¢獙鏄惁鍙互鍒犻櫎
+	 * @param btmBos 涓氬姟鏁版嵁
+	 * @throws VciBaseException 琚紩鐢ㄧ殑鏃跺�欎細鎶涘嚭寮傚父
+	 */
+	private void checkCanDelete(Map<String,List<ClientBusinessObject>> btmBos) throws VciBaseException{
+		//鏌ユ壘琛ㄦ槸鍚﹁鍏朵粬鐨勫睘鎬у紩鐢�
+		if(!btmBos.isEmpty()){
+			Iterator<String> it = btmBos.keySet().iterator();
+			while(it.hasNext()){
+				//姣忎竴涓笟鍔$被鍨嬫壘涓�娆″紩鐢ㄥ瓧娈�
+				String btmType = it.next();
+				List<OsUsedAttributeVO> usedAttrVOs = btmService.listBtmUsedInfo(btmType);
+
+				Map<String, List<OsUsedAttributeVO>> allReferAttr = Optional.ofNullable(usedAttrVOs).orElseGet(()->new ArrayList<>()).stream().collect(Collectors.groupingBy(s -> s.getPkBtmType()));
+				List<ClientBusinessObject> thisBtmTypeBo = btmBos.get(btmType);
+				if(thisBtmTypeBo.size()== 0){
+					return;
+				}
+				String oids = "";
+				for(ClientBusinessObject cbo : thisBtmTypeBo){
+					oids += "'" + cbo.getOid() + "',";
+				}
+				oids = WebUtil.removeComma(oids);
+				if(!allReferAttr.isEmpty()){
+					Iterator<String> atIt = allReferAttr.keySet().iterator();
+					while(atIt.hasNext()){
+						String referBtmType = atIt.next();//鎷ユ湁鍙傜収褰撳墠涓氬姟绫诲瀷鐨勫睘鎬ф墍鍦ㄤ笟鍔$被鍨�
+						List<OsUsedAttributeVO> allAttr = allReferAttr.get(referBtmType);//璇ヤ笟鍔$被鍨嬩腑鎵�鏈夌殑寮曠敤褰撳墠涓氬姟绫诲瀷鐨�
+						Map<String,String> conditionMap = new HashMap<String, String>();
+						for(OsUsedAttributeVO attr : allAttr){
+							conditionMap.put(attr.getId(),QueryOptionConstant.IN +"(" + oids + ")");//骞冲彴鎵�鏈夌殑寮曠敤閮芥槸oid
+						}
+						if(queryCount(referBtmType, conditionMap)>0){
+							throw new VciBaseException(msgCodePrefix + "refered", new String[]{referBtmType});
+						}
+					}
+				}
+			}
+		}
+	}
+
+	/**
+     * 鏍规嵁鏌ヨ鏉′欢鏉ュ垹闄ゆ暟鎹�
+     * @param c 鍒犻櫎鏁版嵁瀵硅薄鎵�灞炵被
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @return 闇�瑕佸垱寤虹殑CBO,CLO;闇�瑕佷慨鏀圭殑CBO,CLO;闇�瑕佸垹闄ょ殑CBO,CLO
+     * @throws VciBaseException 鍒犻櫎鍑洪敊浼氭姏鍑哄紓甯�
+     */
+	@Override
+	public <T> BatchCBO deleteByCondition(Class<T> c,
+			Map<String, String> conditionMap) throws VciBaseException {
+		swapConditionMap(c,conditionMap);
+		String btmType = WebUtil.getBtmTypeByObject(c);
+		return deleteByCondition(btmType,conditionMap);
+	}
+
+	 /**
+     * 鏍规嵁鏌ヨ鏉′欢鏉ュ垹闄ゆ暟鎹�
+     * @param btmType 涓氬姟绫诲瀷鍚嶇О
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @return 闇�瑕佸垱寤虹殑CBO,CLO;闇�瑕佷慨鏀圭殑CBO,CLO;闇�瑕佸垹闄ょ殑CBO,CLO
+     * @throws VciBaseException 鍒犻櫎鍑洪敊浼氭姏鍑哄紓甯�
+     */
+	@Override
+	public <T> BatchCBO deleteByCondition(String btmType,
+			Map<String, String> conditionMap) throws VciBaseException {
+		if(conditionMap == null){
+			conditionMap = new HashMap<String, String>();
+		}
+		conditionMap.put(QUERY_FILTER_SECRET,BooleanEnum.FASLE.getValue());//鏌ヨ鐨勬椂鍊欎笉鑳芥煡璇㈠瘑绾�
+		List<ClientBusinessObject> allCbos = queryCBO(btmType, conditionMap);
+		BatchCBO batchCbo = new BatchCBO();
+		if(allCbos.size()>0){
+			Map<String,List<ClientBusinessObject>> btmBos = new HashMap<String, List<ClientBusinessObject>>();
+			btmBos.put(btmType, allCbos);
+			checkCanDelete(btmBos);
+			Set<ClientBusinessObject> allDeleteCbos = new HashSet<ClientBusinessObject>();
+			allDeleteCbos.addAll(allCbos);
+			batchCbo.setDeleteCbos(allDeleteCbos);
+		}
+		if(allCbos.size()>0 && WebUtil.isPersistence()){
+			persistenceBatch(batchCbo);
+		}
+		return batchCbo;
+	}
+
+	 /**
+     * 閫氳繃sql璇彞鏉ュ垹闄�---涓嶅埌涓囦笉寰楀凡涓嶇敤浣跨敤杩欎釜鏂规硶
+     * @param sql 闃叉SQL娉ㄥ叆锛屽�煎繀椤讳娇鐢�:xxx鏂瑰紡锛屽id=:idvalue锛屽苟鍦╟onditionMap閲屾斁缃甶dvalue涓簁ey鐨勬暟鎹�
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @return 鍒犻櫎鐨勬暟鎹噺
+     * @throws VciBaseException 鍒犻櫎鍑洪敊浼氭姏鍑哄紓甯�
+     */
+	@Override
+	public BatchCBO deleteBySql(String sql, Map<String, String> conditionMap)
+			throws VciBaseException {
+	    //寰堥仐鎲撅紝骞冲彴涓嶆敮鎸佷娇鐢╯ql鏉ュ垹闄�
+		//鎵�鏈夋垜浠渶瑕佸厛鏌ヨ鍑烘潵锛岀劧鍚庢牎楠屾槸鍚﹀彲浠ュ垹闄�
+		sql = sql.replace("delete", "select oid,btmname ");
+		if(sql.toLowerCase().indexOf(" from ") < 0){
+			throw new VciBaseException(msgCodePrefix + "sqlError",new String[]{sql});
+		}
+		BatchCBO batchCbo = new BatchCBO();
+		String selectSql = sql.substring(0,sql.toLowerCase().indexOf(" from "));
+		String fromSql = sql.substring(sql.toLowerCase().indexOf(" from "));
+		if(selectSql.toLowerCase().indexOf("btmname")<0){
+			selectSql += ",btmname ";
+		}
+		sql = selectSql + fromSql;
+		List<ClientBusinessObject> allDelete =queryBySql(sql, conditionMap);
+		if(allDelete.size() == 0){
+			return batchCbo;//娌℃湁鍒犻櫎浠讳綍鏁版嵁
+		}
+		//鎵綽tmType;
+		String btmType = allDelete.get(0).getAttributeValue("btmName");
+		Map<String,List<ClientBusinessObject>> btmBos = new HashMap<String, List<ClientBusinessObject>>();
+		btmBos.put(btmType, allDelete);
+		checkCanDelete(btmBos);
+		Set<ClientBusinessObject> allDeleteCbos = new HashSet<ClientBusinessObject>();
+		//鎴戜滑闇�瑕佷粠鍚庡彴鏌ヨ鏁翠釜鐨勫唴瀹规墠鍙互鎵ц鍒犻櫎锛�
+		String oids = "";
+		for(ClientBusinessObject cbo : allDelete){
+			oids  += "'" + cbo.getOid() + "',";
+		}
+		conditionMap.clear();
+		conditionMap.put("oid", QueryOptionConstant.IN + "(" + WebUtil.removeComma(oids) + ")");
+		List<ClientBusinessObject> inDbCbos = queryCBO(btmType, conditionMap);
+		
+		allDeleteCbos.addAll(inDbCbos);
+		batchCbo.setDeleteCbos(allDeleteCbos);
+		if(allDeleteCbos.size()>0 && WebUtil.isPersistence()){
+			persistenceBatch(batchCbo);
+		}
+		return batchCbo;
+	}
+
+    /**
+     * 妫�楠屾槸鍚︿负鏈�鏂扮殑-
+     * @param obj 鏁版嵁瀵硅薄锛岄噷闈㈠繀椤诲寘鎷富閿拰ts瀛楁
+     * @return 鐩哥瓑鏃朵负true
+     * @throws VciBaseException 涓嶇鍚堣姹備細鎶涘嚭寮傚父
+     */
+	@Override
+	public boolean checkTs(Object obj) throws VciBaseException {
+		Field pkField = WebUtil.getPkFieldForObj(obj.getClass());
+		if(pkField == null){
+			throw new VciBaseException("{0}瀵硅薄涓病鏈夎缃富閿殑灞炴��",new Object[]{obj.getClass()});
+		}
+		String pkValue = WebUtil.getValueFromFieldForCbo(pkField, obj);
+		Field tsField = WebUtil.getTsField(obj.getClass());
+		if(tsField == null){
+			throw new VciBaseException("{0}瀵硅薄涓病鏈塗S瀛楁",new Object[]{obj.getClass()});
+		}
+		String ts = WebUtil.getValueFromFieldForCbo(tsField, obj);
+		Map<String,String> conditionMap = getOneQuery("oid", pkValue);
+		List<String> causeList = new ArrayList<>();
+		causeList.add("ts");
+		List<ClientBusinessObject> cbos = queryCBO(WebUtil.getBtmTypeByObject(obj.getClass()), conditionMap,new PageHelper(-1),causeList);
+		if(CollectionUtils.isEmpty(cbos)){
+			return false;
+		}
+		if(ts.contains(".")){
+			ts = ts.substring(0,ts.lastIndexOf("."));
+		}
+		return cbos.get(0).getTs().contains(ts);
+	}
+
+	/**
+     * 鏍规嵁涓氬姟绫诲瀷鏉ユ煡璇㈠垪琛ㄦ暟鎹紱
+     * @param btmType 涓氬姟绫诲瀷鍚嶇О
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @return 鍒楄〃鏁版嵁锛屾暟鎹槸Map褰㈠紡鐨勶紝鍖呭惈鍒嗛〉淇℃伅
+     * @throws VciBaseException 鏌ヨ鍑洪敊浼氭姏鍑哄紓甯�
+     */
+	@Override
+	public DataGrid queryGridByBo(String btmType,
+								  Map<String, String> conditionMap) throws VciBaseException {
+		return queryGridByBo(btmType,conditionMap,new PageHelper(-1,true));
+	}
+
+	  
+	 /**
+     * 鏍规嵁涓氬姟绫诲瀷鏉ユ煡璇㈠垪琛ㄦ暟鎹紱鍙互鍦╬ageHelper涓缃槸鍚︽煡璇㈡�绘暟
+     * @param btmType 涓氬姟绫诲瀷鍚嶇О
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param ph 鍒嗛〉鍜屾帓搴忕粍浠�
+     * @return 鍒楄〃鏁版嵁锛屾暟鎹槸Map褰㈠紡鐨勶紝鍖呭惈鍒嗛〉淇℃伅
+     * @throws VciBaseException 鏌ヨ鍑洪敊浼氭姏鍑哄紓甯�
+     */
+	@Override
+	public DataGrid queryGridByBo(String btmType,
+			Map<String, String> conditionMap, PageHelper ph)
+			throws VciBaseException {
+		return queryGridByBo(btmType,conditionMap,ph,null);
+	}
+
+    /**
+     * 鏍规嵁涓氬姟绫诲瀷鏉ユ煡璇㈠垪琛ㄦ暟鎹紱鍙互璁剧疆瑕佹煡璇㈢殑瀛楁锛屽寘鎷弬鐓у拰鏋氫妇瀛楁锛涘彲浠ュ湪pageHelper涓缃槸鍚︽煡璇㈡�绘暟
+     * @param btmType 涓氬姟绫诲瀷鍚嶇О
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param ph 鍒嗛〉鍜屾帓搴忕粍浠�
+     * @param clauseList 鍒楄〃鏁版嵁锛屾暟鎹槸Map褰㈠紡鐨勶紝
+     * @return 鍒楄〃鏁版嵁锛屾暟鎹槸Map褰㈠紡鐨勶紝鍖呭惈鍒嗛〉淇℃伅
+     * @throws VciBaseException 鏌ヨ鍑洪敊浼氭姏鍑哄紓甯�
+     */
+	@Override
+	public DataGrid queryGridByBo(String btmType,
+			Map<String, String> conditionMap, PageHelper ph,
+			List<String> clauseList) throws VciBaseException {
+		if(ph == null){
+			ph = new PageHelper(-1);
+			ph.setQueryTotal(true);
+		}
+		List<ClientBusinessObject> allCbos = queryCBO(btmType, conditionMap, ph, clauseList);
+		DataGrid dg = new DataGrid();
+		if(allCbos.size()>0){
+			List<Map> mapList = cbos2Map(allCbos);
+			dg.setData(mapList);
+			//鑲畾鏄綋鍓嶅垎椤垫湁鍊硷紝鎵嶄細鏈夋�绘暟
+			if(ph.isQueryTotal()){
+				dg.setTotal(queryCount(btmType, conditionMap));
+			}
+		}
+		dg.setLimit(ph.getLimit());
+		dg.setPage(ph.getPage());
+		return dg;
+	}
+
+	/**
+     * 鏍规嵁鏌ヨ鏂规鏉ユ煡璇㈠垪琛ㄦ暟鎹紱
+     * @param queryScheme 鏌ヨ鏂规
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @return 鍒楄〃鏁版嵁锛屾暟鎹槸Map褰㈠紡鐨勶紝鍖呭惈鍒嗛〉淇℃伅
+     * @throws VciBaseException 鏌ヨ鍑洪敊浼氭姏鍑哄紓甯�
+     */
+	@Override
+	public DataGrid queryGridByScheme(String queryScheme,
+			Map<String, String> conditionMap) throws VciBaseException {
+		return queryGridByScheme(queryScheme,conditionMap,null);
+	}
+
+	/**
+     * 鏍规嵁鏌ヨ鏂规鏉ユ煡璇㈠垪琛ㄦ暟鎹紱
+     * @param queryScheme 鏌ヨ鏂规
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param replaceMap 鏇挎崲鏌ヨ鏂规鐨勫彉閲忓��
+     * @return 鍒楄〃鏁版嵁锛屾暟鎹槸Map褰㈠紡鐨勶紝鍖呭惈鍒嗛〉淇℃伅
+     * @throws VciBaseException 鏌ヨ鍑洪敊浼氭姏鍑哄紓甯�
+     */
+	@Override
+	public DataGrid queryGridByScheme(String queryScheme,
+			Map<String, String> conditionMap, Map<String, String> replaceMap)
+			throws VciBaseException {
+		return queryGridByScheme(queryScheme,conditionMap,replaceMap,new PageHelper(-1,true),null);
+	}
+
+
+	 /**
+     * 鏍规嵁鏌ヨ鏂规鏉ユ煡璇㈠垪琛ㄦ暟鎹紱鍙互鍦╬ageHelper涓缃槸鍚︽煡璇㈡�绘暟锛宲ageHelper鐨勪紭鍏堢骇鏈�澶э紱
+     * @param queryScheme 鏌ヨ鏂规
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param replaceMap 鏇挎崲鏌ヨ鏂规鐨勫彉閲忓��
+     * @return 鍒楄〃鏁版嵁锛屾暟鎹槸Map褰㈠紡鐨勶紝鍖呭惈鍒嗛〉淇℃伅
+     * @throws VciBaseException 鏌ヨ鍑洪敊浼氭姏鍑哄紓甯�
+     */
+	@Override
+	public DataGrid queryGridByScheme(String queryScheme,
+			Map<String, String> conditionMap, Map<String, String> replaceMap,
+			PageHelper ph) throws VciBaseException {
+		return queryGridByScheme(queryScheme,conditionMap,replaceMap,ph,null);
+	}
+
+	/**
+     * 鏍规嵁鏌ヨ鏂规鏉ユ煡璇㈠垪琛ㄦ暟鎹紝鍙互鑷畾涔夋煡璇㈢殑鍒楋紝鍖呮嫭鍙傜収鍜屾灇涓�
+     * @param queryScheme 鏌ヨ鏂规
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param replaceMap 鏇挎崲鏌ヨ鏂规鐨勫彉閲忓��
+     * @param ph 鍒嗛〉鍜屾帓搴忓瓧娈�
+     * @param clauseList 鏌ヨ鐨勫垪锛屽弬鐓т娇鐢▁x.yy锛涙灇涓句娇鐢▁x_enumCode;
+     * @return 鍒楄〃鏁版嵁锛屾暟鎹槸Map褰㈠紡鐨勶紝鍖呭惈鍒嗛〉淇℃伅
+     * @throws VciBaseException 鏌ヨ鍑洪敊浼氭姏鍑哄紓甯�
+     */
+	@Override
+	public DataGrid queryGridByScheme(String queryScheme,
+			Map<String, String> conditionMap, Map<String, String> replaceMap,
+			PageHelper ph, List<String> clauseList) throws VciBaseException {
+		if(ph == null){
+			ph = new PageHelper(-1,true);
+		}
+		List<ClientBusinessObject> allCbos = queryCBOByScheme(queryScheme, conditionMap,replaceMap, ph, clauseList);
+		DataGrid dg = new DataGrid();
+		if(allCbos.size()>0){
+			List<Map> mapList = cbos2Map(allCbos);
+			dg.setData(mapList);
+			//鑲畾鏄綋鍓嶅垎椤垫湁鍊硷紝鎵嶄細鏈夋�绘暟
+			if(ph.isQueryTotal()){
+				dg.setTotal(queryCountByScheme(queryScheme, conditionMap, replaceMap));
+			}
+		}
+		dg.setLimit(ph.getLimit());
+		dg.setPage(ph.getPage());
+		return dg;
+	}
+
+	/**
+     * 鏌ヨ瀵硅薄鐨勫垪琛ㄦ暟鎹� 
+     * @param c 鏌ヨ瀵硅薄鎵�灞炵被
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @return 鍒楄〃鏁版嵁锛屾暟鎹槸瀵硅薄褰㈠紡鐨勶紝鍖呭惈鍒嗛〉淇℃伅
+     * @throws VciBaseException 鏌ヨ鍑洪敊浼氭姏鍑哄紓甯�
+     */
+	@Override
+	public DataGrid queryGridClass(Class c, Map<String, String> conditionMap)
+			throws VciBaseException {
+		return queryGridClass(c,conditionMap,new PageHelper(-1,true));
+	}
+	
+	/**
+     * 鏌ヨ瀵硅薄鐨勫垪琛ㄦ暟鎹�
+     * @param c 鏌ヨ瀵硅薄鎵�灞炵被
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param ph 鍒嗛〉鍜屾帓搴忓瓧娈碉紝鍙互璁剧疆鏄惁鏌ヨ鎬绘暟
+     * @return 鍒楄〃鏁版嵁锛屾暟鎹槸瀵硅薄褰㈠紡鐨勶紝鍖呭惈鍒嗛〉淇℃伅
+     * @throws VciBaseException 鏌ヨ鍑洪敊浼氭姏鍑哄紓甯�
+     */
+	@Override
+	public DataGrid queryGridClass(Class c, Map<String, String> conditionMap,
+			PageHelper ph) throws VciBaseException {
+		if(ph == null){
+			ph = new PageHelper(-1,true);
+		}
+		List allObjs = queryObject(c, conditionMap, ph);
+		DataGrid dg = new DataGrid();
+		if(allObjs.size()>0){
+			dg.setData(allObjs);
+			//鑲畾鏄綋鍓嶅垎椤垫湁鍊硷紝鎵嶄細鏈夋�绘暟
+			if(ph.isQueryTotal()){
+				dg.setTotal(queryCount(c, conditionMap));
+			}
+		}
+		dg.setLimit(ph.getLimit());
+		dg.setPage(ph.getPage());
+		return dg;
+	}
+
+	/**
+     * 閫氳繃鏌ヨ鏂规鏌ヨ瀵硅薄鐨勫垪琛ㄦ暟鎹�
+     * @param queryScheme 鏌ヨ鏂规
+     * @param c 鏌ヨ瀵硅薄鎵�灞炵被
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @return 鍒楄〃鏁版嵁锛屾暟鎹槸瀵硅薄褰㈠紡鐨勶紝鍖呭惈鍒嗛〉淇℃伅
+     * @throws VciBaseException 鏌ヨ鍑洪敊浼氭姏鍑哄紓甯�
+     */
+	@Override
+	public DataGrid queryGridClassByScheme(String queryScheme, Class c,
+			Map<String, String> conditionMap,Map<String,String> replaceMap) throws VciBaseException {
+		return queryGridClassByScheme(queryScheme,c,conditionMap,replaceMap,new PageHelper(-1,true));
+	}
+	
+	/**
+     * 閫氳繃鏌ヨ鏂规鏌ヨ瀵硅薄鐨勫垪琛ㄦ暟鎹�
+     * @param queryScheme 鏌ヨ鏂规
+     * @param c 鏌ヨ瀵硅薄鎵�灞炵被
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param ph 鍒嗛〉鍜屾帓搴忓瓧娈碉紝鍙互璁剧疆鏄惁鏌ヨ鎬绘暟
+     * @return 鍒楄〃鏁版嵁锛屾暟鎹槸瀵硅薄褰㈠紡鐨勶紝鍖呭惈鍒嗛〉淇℃伅
+     * @throws VciBaseException 鏌ヨ鍑洪敊浼氭姏鍑哄紓甯�
+     */
+	@Override
+	public DataGrid queryGridClassByScheme(String queryScheme, Class c,
+			Map<String, String> conditionMap, Map<String,String> replaceMap,PageHelper ph)
+			throws VciBaseException {
+		if(ph == null){
+			ph = new PageHelper(-1,true);
+		}
+		List allObjs = queryObjectByScheme(queryScheme, c, conditionMap, ph, replaceMap);
+		DataGrid dg = new DataGrid();
+		if(allObjs.size()>0){
+			dg.setData(allObjs);
+			//鑲畾鏄綋鍓嶅垎椤垫湁鍊硷紝鎵嶄細鏈夋�绘暟
+			if(ph.isQueryTotal()){
+				dg.setTotal(queryCountByScheme(queryScheme, conditionMap, replaceMap));
+			}
+		}
+		dg.setLimit(ph.getLimit());
+		dg.setPage(ph.getPage());
+		return dg;
+	}
+
+	/**
+     * ClientBusinessObject 杞负HashMap
+     * @param cbos CBOS
+     * @return map
+     * @throws VciBaseException 杞崲鍑洪敊浼氭姏鍑哄紓甯�
+     */
+	@Override
+	public List<Map> cbos2Map(List<ClientBusinessObject> cbos)
+			throws VciBaseException {
+		List<Map> mapList = new ArrayList<Map>();
+		for(ClientBusinessObject cbo : cbos){
+			mapList.add(cbo2Map(cbo));
+		}
+		return mapList;
+	}
+
+	/**
+     * ClientBusinessObject 杞负HashMap
+     * @param cbo 涓氬姟鏁版嵁瀵硅薄
+     * @return map
+     * @throws VciBaseException 杞崲鍑洪敊浼氭姏鍑哄紓甯�
+     */
+	@Override
+	public Map cbo2Map(ClientBusinessObject cbo) throws VciBaseException {
+		Map<String,String> map = new HashMap<String, String>();
+		WebUtil.copyValueToMapFromCbos(cbo, map);
+		return map;
+	}
+
+
+    /**
+     * map杞负clientBusinessObject
+     * @param mapList  map鍒楄〃
+     * @return 涓氬姟鏁版嵁鍒楄〃
+     * @throws VciBaseException 杞崲鍑洪敊浼氭姏鍑哄紓甯�
+     */
+	@Override
+	public List<ClientBusinessObject> map2Cbos(List<Map> mapList)
+			throws VciBaseException {
+		List<ClientBusinessObject> cboList = new ArrayList<ClientBusinessObject>();
+		for(Map map : mapList){
+			cboList.add(map2Cbo(map));
+		}
+		return cboList;
+	}
+
+	 
+    /**
+     * map杞负clientBusinessObject
+     * @param map map
+     * @return 涓氬姟鏁版嵁
+     * @throws VciBaseException 杞崲鍑洪敊浼氭姏鍑哄紓甯�
+     */
+	@Override
+	public ClientBusinessObject map2Cbo(Map map) throws VciBaseException {
+		ClientBusinessObject cbo = new ClientBusinessObject();
+		WebUtil.copyValueToCboFromMap(cbo, map);
+		return cbo;
+	}
+
+	/**
+     * 鎵归噺淇濆瓨涓氬姟绫诲瀷鍜岄摼鎺ョ被鍨嬬殑淇℃伅
+     * @param batchCbos 鎵归噺鏁版嵁瀹瑰櫒
+     * @throws VciBaseException 淇濆瓨鍑洪敊
+     */
+	@Override
+	public void persistenceBatch(BatchCBO batchCbos) throws VciBaseException {
+		persistenceBatch(batchCbos,false);
+	}
+
+	/**
+     * 鎵归噺淇濆瓨涓氬姟绫诲瀷鍜岄摼鎺ョ被鍨嬬殑淇℃伅---鍙湁纭繚鏁版嵁瀹瑰櫒閲屾湁鍙傜収瀛楁锛屾灇涓惧瓧娈电瓑鍐呭鐨勬椂鍊欙紝鎵嶈皟鐢ㄨ繖涓柟娉曪紝鍥犱负杩欎釜鏂规硶鎬ц兘浣庝笅
+     * @param batchCbos 鎵归噺鏁版嵁瀹瑰櫒
+     * @param isCheckReferColumn 鏄惁鏍¢獙鏄惁鍚湁鍙傜収瀛楁
+     * @throws VciBaseException 淇濆瓨鍑洪敊
+     */
+	@Override
+	public void persistenceBatch(BatchCBO batchCbos, boolean isCheckReferColumn)
+			throws VciBaseException {
+		if(batchCbos == null ){
+			return;
+		}
+		if(isCheckReferColumn){
+			deleteReferAttrInCbo(batchCbos.getCreateCbos());
+			deleteReferAttrInCbo(batchCbos.getUpdateCbos());
+			deleteReferAttrInCbo(batchCbos.getDeleteCbos());
+		}
+		try {
+			platformClientUtil.getBOFactoryService().batchCUDBOLO(new BusinessObjectListHolder(cboArray2Bo(batchCbos.getCreateCboArray())),
+					new LinkObjectListHolder(cloArray2Lo(batchCbos.getCreateCloArray())),
+					new BusinessObjectListHolder(cboArray2Bo(batchCbos.getUpdateCboArray())),
+					new LinkObjectListHolder(cloArray2Lo(batchCbos.getUpdateCloArray())),
+					cboArray2Bo(batchCbos.getDeleteCboArray()), cloArray2Lo(batchCbos.getDeleteCloArray()));
+		} catch (VCIError e) {
+			throw WebUtil.getVciBaseException(e);
+		}
+	}
+
+	/**
+	 * 杞崲涓篶bo
+	 * @param cbos 瀹㈡埛绔璞�
+	 * @return 涓氬姟瀵硅薄
+	 */
+	private BusinessObject[] cboArray2Bo(ClientBusinessObject[] cbos){
+		if(cbos == null ||cbos.length == 0){
+			return new BusinessObject[0];
+		}
+		BusinessObject[] bos = new BusinessObject[cbos.length];
+		for(int i = 0; i < cbos.length; i++){
+			bos[i] = cbos[i].getBusinessObject();
+		}
+		return bos;
+	}
+
+	/**
+	 * 杞崲clob
+	 * @param clos 瀹㈡埛绔璞�
+	 * @return 涓氬姟瀵硅薄
+	 */
+	private LinkObject[] cloArray2Lo(ClientLinkObject[] clos){
+		if(clos == null ||clos.length == 0){
+			return new LinkObject[0];
+		}
+		LinkObject[] bos = new LinkObject[clos.length];
+		for(int i = 0; i < clos.length; i++){
+			bos[i] = clos[i].getLinkObject();
+		}
+		return bos;
+	}
+
+	/**
+	 * 鍒犻櫎鏋氫妇鍜屽弬鐓х殑灞炴��
+	 * @param cbos 涓氬姟鏁版嵁
+	 */
+	private void deleteReferAttrInCbo(Set<ClientBusinessObject> cbos){
+		if(cbos !=null){
+			for(ClientBusinessObject cbo : cbos){
+				BusinessObject bo = cbo.getBusinessObject();
+				List<AttributeValue> newAttr = new ArrayList<AttributeValue>();
+				if (bo.newAttrValList != null) {
+					for (int i = 0; i < bo.newAttrValList.length; ++i) {
+						AttributeValue av = bo.newAttrValList[i];
+						if (WebUtil.isNormalAttr(av.attrName)) {
+							if(av.attrVal == null){
+								av.attrVal = "";
+							}
+							newAttr.add(av);
+						}
+					}
+				}
+				bo.newAttrValList = newAttr.toArray(new AttributeValue[0]);
+				cbo.setBusinessObject(bo);
+			}
+		}
+	}
+
+    /**
+     * 浣跨敤涓婚敭鑾峰彇瀵硅薄
+     * @param oid 涓婚敭
+     * @param doClass 鏁版嵁瀵硅薄
+     * @return 鏁版嵁瀵硅薄
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屾暟鎹璞′笉瀛樺湪浼氭姏鍑哄紓甯�
+     */
+	@Override
+	public <T> T selectByOid(String oid, Class<T> doClass)
+			throws VciBaseException {
+		VciBaseUtil.alertNotNull(oid,"涓婚敭");
+		Map<String,String> conditionMap = new HashMap<String, String>();
+		conditionMap.put("oid", oid.trim());
+		conditionMap.put(QUERY_FILTER_SECRET,BooleanEnum.FASLE.getValue());
+		conditionMap.put(QUERY_FILTER_DATARIGHT,BooleanEnum.FASLE.getValue());
+		List<T> list = queryObject(doClass, conditionMap);
+		if(CollectionUtils.isEmpty(list)){
+			throw new VciBaseException("鏁版嵁鍦ㄧ郴缁熶腑涓嶅瓨鍦▄0}",new String[]{oid});
+		}
+		return list.get(0);
+	}
+
+	/**
+	 * 浣跨敤涓婚敭鑾峰彇瀵硅薄
+	 *
+	 * @param oid     涓婚敭
+	 * @param btmName 涓氬姟绫诲瀷鐨勫悕绉�
+	 * @return cbo
+	 * @throws VciBaseException 鍙傛暟涓虹┖锛屾暟鎹笉瀛樺湪浼氭姏鍑哄紓甯�
+	 */
+	@Override
+	public ClientBusinessObject selectCBOByOid(String oid, String btmName) throws VciBaseException {
+		VciBaseUtil.alertNotNull(oid,"涓婚敭",btmName,"涓氬姟绫诲瀷");
+		Map<String,String> conditionMap = new HashMap<String, String>();
+		conditionMap.put("oid", oid.trim());
+		List<ClientBusinessObject> cbos = queryCBO(btmName, conditionMap);
+		if(CollectionUtils.isEmpty(cbos)){
+			throw new VciBaseException("鏁版嵁鍦ㄧ郴缁熶腑涓嶅瓨鍦▄0}",new String[]{oid});
+		}
+		return cbos.get(0);
+	}
+
+	/**
+     * 浣跨敤涓婚敭闆嗗悎鑾峰彇瀵硅薄
+     * @param oidCollection 涓婚敭闆嗗悎
+     * @param doClass 鏁版嵁瀵硅薄鐨勭被
+     * @return 鏁版嵁瀵硅薄锛� 涓虹┖鐨勬椂鍊欏垪琛ㄤ负绌猴紝涓嶆槸Null
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屾煡璇㈠嚭閿欎細鎶涘嚭寮傚父
+     */
+	@Override
+	public <T> List<T> selectByOidCollection(Collection<String> oidCollection,
+			Class<T> doClass) throws VciBaseException {
+		VciBaseUtil.alertNotNull(oidCollection,"涓婚敭闆嗗悎");
+		Collection<Collection<String>> oidCollections = WebUtil.switchCollectionForOracleIn(oidCollection);
+		List<T> doList = new ArrayList<T>();
+
+		for(Collection<String> oids: oidCollections){
+			Map<String,String> conditionMap = new HashMap<String, String>();
+			conditionMap.put("oid",QueryOptionConstant.IN + "(" + WebUtil.toInSql(oids.toArray(new String[0])) + ")");
+			List<T> list = queryObject(doClass, conditionMap);
+			if(CollectionUtils.isEmpty(list)){
+				throw new VciBaseException("{0}鏉℃暟鎹湪绯荤粺涓笉瀛樺湪",new String[]{String.valueOf(oids.size())});
+			}
+			doList.addAll(list);
+		}
+		return doList;
+	}
+
+	/**
+	 * 浣跨敤涓婚敭闆嗗悎鑾峰彇瀵硅薄
+	 *
+	 * @param oidCollection 涓婚敭闆嗗悎
+	 * @param btmName       涓氬姟绫诲瀷鐨勫悕绉�
+	 * @return 涓氬姟鏁版嵁鐨勯泦鍚�
+	 * @throws VciBaseException 鍙傛暟涓虹┖锛屾煡璇㈠嚭閿欎細鎶涘嚭寮傚父
+	 */
+	@Override
+	public List<ClientBusinessObject> selectCBOByOidCollection(Collection<String> oidCollection, String btmName) throws VciBaseException {
+		VciBaseUtil.alertNotNull(oidCollection,"涓婚敭闆嗗悎",btmName,"涓氬姟绫诲瀷");
+		Collection<Collection<String>> oidCollections = WebUtil.switchCollectionForOracleIn(oidCollection);
+		List<ClientBusinessObject> doList = new ArrayList<ClientBusinessObject>();
+
+		for(Collection<String> oids: oidCollections){
+			Map<String,String> conditionMap = new HashMap<String, String>();
+			conditionMap.put("oid",QueryOptionConstant.IN + "(" + WebUtil.toInSql(oids.toArray(new String[0])) + ")");
+			List<ClientBusinessObject> list = queryCBO(btmName, conditionMap);
+			if(CollectionUtils.isEmpty(list)){
+				throw new VciBaseException("{0}鏉℃暟鎹湪绯荤粺涓笉瀛樺湪",new String[]{String.valueOf(oids.size())});
+			}
+			doList.addAll(list);
+		}
+		return doList;
+	}
+
+	/**
+	 * 浣跨敤鏂扮殑鏌ヨ灏佽鍣ㄦ潵鏌ヨ
+	 *
+	 * @param queryWrapper 鏌ヨ灏佽鍣�
+	 * @param doClass           瀵硅薄鐨勬墍灞炵被
+	 * @return 鏁版嵁
+	 * @throws VciBaseException 鏌ヨ鍑洪敊鐨勪細鎶涘嚭寮傚父
+	 */
+	@Override
+	public <T> List<T> selectByQueryWrapper(VciQueryWrapperForDO queryWrapper, Class<T> doClass) throws VciBaseException {
+		String sql= queryWrapper.getSelectFieldSql() + " from " + queryWrapper.getTableName() + " " + queryWrapper.getTableNick() + queryWrapper.getLinkTableSql() ;
+		String whereSql = queryWrapper.getWhereSql();
+		if(StringUtils.isNotBlank(whereSql)){
+			sql += " where " + whereSql;
+		}
+		return queryByOnlySqlForObj(sql,doClass);
+	}
+
+	/**
+	 * 浣跨敤鏂扮殑鏌ヨ灏佽鍣ㄦ潵鏌ヨ鎬绘暟
+	 *
+	 * @param queryWrapper 鏌ヨ灏佽鍣�
+	 * @param doClass           瀵硅薄鐨勬墍灞炵被
+	 * @return 鏁版嵁
+	 * @throws VciBaseException 鏌ヨ鍑洪敊鐨勪細鎶涘嚭寮傚父
+	 */
+	@Override
+	public <T> int countByQueryWrapper(VciQueryWrapperForDO queryWrapper, Class<T> doClass) throws VciBaseException {
+		VciQueryWrapperForDO queryWrapperForDO = new VciQueryWrapperForDO(null,doClass);
+		BeanUtil.convert(queryWrapper,queryWrapperForDO);
+		queryWrapperForDO.clearPage();
+		queryWrapperForDO.wrapperSql();
+		String sql= queryWrapperForDO.getSelectFieldSql() + " from " + queryWrapperForDO.getTableName() + " " + queryWrapperForDO.getTableNick() + queryWrapperForDO.getLinkTableSql() ;
+		String whereSql = queryWrapperForDO.getWhereSql();
+		if(StringUtils.isNotBlank(whereSql)){
+			sql += " where " + whereSql;
+		}
+		return queryCountBySql("select count(*) from (" +sql + ")",null);
+	}
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WebBtmIOServiceImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WebBtmIOServiceImpl.java
new file mode 100644
index 0000000..c9a6f4a
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WebBtmIOServiceImpl.java
@@ -0,0 +1,1335 @@
+package com.vci.web.service.impl;
+
+import com.vci.corba.common.VCIError;
+import com.vci.starter.poi.bo.WriteExcelData;
+import com.vci.starter.poi.bo.WriteExcelOption;
+import com.vci.starter.poi.util.ExcelUtil;
+import com.vci.starter.web.annotation.VciBtmType;
+import com.vci.starter.web.constant.FrameWorkLcStatusConstant;
+import com.vci.starter.web.enumpck.VciFieldTypeEnum;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.starter.web.util.BeanUtil;
+import com.vci.starter.web.util.LocalFileUtil;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.starter.web.util.VciDateUtil;
+import com.vci.starter.word.bo.WordMergeStartTableDataBO;
+import com.vci.starter.word.util.WordUtil;
+import com.vci.web.dto.*;
+import com.vci.web.pageModel.*;
+import com.vci.web.properties.OsDDLExportWordFieldProperties;
+import com.vci.web.service.*;
+import com.vci.web.util.PlatformClientUtil;
+import com.vci.web.util.WebUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.tomcat.jni.Local;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import plm.bs.omd.linktype.common.LinkTypeProvider;
+import plm.corba.attribpool.AttribItem;
+import plm.corba.btm.BTMServiceOperations;
+import plm.corba.btm.BtmItem;
+import plm.corba.enumManager.EnumChild;
+import plm.corba.enumManager.EnumItem;
+import plm.corba.lifecycle.Bound;
+import plm.corba.lifecycle.LifeCyle;
+import plm.corba.lifecycle.TransitionVO;
+import plm.corba.lifecycle.TransitionVOEvent;
+import plm.corba.linkTypeManager.LinkType;
+import plm.corba.statePoolManager.StatePool;
+import plm.ddlTool.client.DDLToolClient;
+import plm.vo.omd.btm.common.BtmProvider;
+import plm.vo.omd.btm.resource.Tool;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Collectors;
+
+import static plm.vo.omd.attribpool.ui.VTDataTypePanel.*;
+
+
+/**
+ * 瀵硅薄寤烘ā绛夌浉鍏崇殑鍐呭瀵煎叆
+ * @author weidy
+ * @date 2021/8/13
+ */
+@Service
+public class WebBtmIOServiceImpl implements WebBtmIOServiceI {
+
+    /**
+     * 骞冲彴鐨勮皟鐢ㄥ鎴风
+     */
+    @Autowired
+    private PlatformClientUtil platformClientUtil;
+
+    /**
+     * 鐢熷懡鍛ㄦ湡鐨勬湇鍔�
+     */
+    @Autowired
+    private OsLifeCycleServiceI lifeCycleService;
+
+    /**
+     * 鐘舵�佺殑鏈嶅姟
+     */
+    @Autowired
+    private OsStatusServiceI statusService;
+
+    /**
+     * 灞炴�х殑鏈嶅姟
+     */
+    @Autowired
+    private OsAttributeServiceI attrService;
+
+    /**
+     * 鏋氫妇鐨勬湇鍔�
+     */
+    @Autowired
+    private OsEnumServiceI enumService;
+
+    /**
+     * 涓氬姟绫诲瀷鐨勬湇鍔�
+     */
+    @Autowired
+    private OsBtmServiceI btmService;
+
+    /**
+     * 閾炬帴鏈嶅姟
+     */
+    @Autowired
+    private OsLinkTypeServiceI linkTypeService;
+
+    /**
+     * 鏃ュ織
+     */
+    private Logger logger = LoggerFactory.getLogger(getClass());
+
+    /**
+     * 鑾峰彇娑堟伅鐨勫墠缂�
+     * @return 娑堟伅鍓嶇紑
+     */
+    private String getMsgPrefix(){
+        return getClass().getPackage().getName();
+    }
+
+
+    /**
+     * 涓氬姟绫诲瀷
+     */
+    private Map<String, LinkType> allLink = new ConcurrentHashMap<String, LinkType>();
+
+    /**
+     * word閲岀殑瀛楁鍩熼厤缃�
+     */
+    @Autowired
+    private OsDDLExportWordFieldProperties wordFieldProperties;
+
+
+    /**
+     * 瀵煎叆涓氬姟绫诲瀷鍜岄摼鎺ョ被鍨嬶紝鍖呭惈灞炴�э紝鏋氫妇锛岀姸鎬侊紝鐢熷懡鍛ㄦ湡锛岀増鏈鍒欑瓑鍏ㄥ鍐呭
+     *
+     * @param importBtmTypeDTO 闇�瑕佸鍏ョ殑涓氬姟绫诲瀷锛岄摼鎺ョ被鍨嬬瓑鍐呭
+     * @throws VciBaseException
+     */
+    @Override
+    public void importBtmTypes(OsBtmTypeExportDTO importBtmTypeDTO) throws VciBaseException {
+        VciBaseUtil.alertNotNull(importBtmTypeDTO, "瑕佸鍏ョ殑涓氬姟绫诲瀷绛夌浉鍏虫暟鎹�");
+        String msgPrefix = getMsgPrefix();
+        if(logger.isInfoEnabled()){
+            logger.info("{}鍦▄}璋冪敤浜�" + msgPrefix + ".importBtmTypes", WebUtil.getCurrentUserId(), VciDateUtil.getNow());
+        }
+        if(logger.isDebugEnabled()){
+            logger.debug(importBtmTypeDTO.toString());
+        }
+        //鍥犱负ORACLE鍦―DL鐨勬椂鍊欏氨浼氭彁浜や竴娆′簨鍔★紝濡傛灉浜ょ粰spring鎵ц鐨勮瘽銆傚彲鑳芥姏鍑轰簨鍔″洖婊氬紓甯�
+
+        //瑕佽皟鏁寸殑鏁版嵁搴撹〃鐨勫唴瀹�
+        try {
+            if (CollectionUtils.isEmpty(importBtmTypeDTO.getAttributeDTOList())
+                    && CollectionUtils.isEmpty(importBtmTypeDTO.getStatusDTOList())
+                    && CollectionUtils.isEmpty(importBtmTypeDTO.getEnumDTOList())
+                    && CollectionUtils.isEmpty(importBtmTypeDTO.getLifeCycleDTOList())
+                    && CollectionUtils.isEmpty(importBtmTypeDTO.getRevisionRuleDTOList())
+                    && CollectionUtils.isEmpty(importBtmTypeDTO.getBtmTypeDTOList())
+                    && CollectionUtils.isEmpty(importBtmTypeDTO.getLinkTypeDTOList())) {
+               logger.info("瑕佸鍏ョ殑涓氬姟绫诲瀷绛夌浉鍏虫暟鎹负绌�");
+               return ;
+            }
+            //鍏堝鐞嗗熀纭�鐨勶紝姣斿锛岀姸鎬侊紝鐗堟湰瑙勫垯锛屾灇涓撅紝鏋氫妇椤�
+            //鐒跺悗澶勭悊鐢熷懡鍛ㄦ湡锛屼笟鍔$被鍨嬶紝閾炬帴绫诲瀷
+            Collection<OsStatusDTO> statusDTOList = importBtmTypeDTO.getStatusDTOList();
+            if (!CollectionUtils.isEmpty(statusDTOList)) {
+                //璇存槑鏈夋柊鐨勭姸鎬�
+                //鎴戜滑闇�瑕佸厛鍘绘煡璇㈠凡缁忓瓨鍦ㄧ殑鐘舵��
+                importStatus(statusDTOList);
+            }
+            //瑙勫垯浣跨敤瀵硅薄娌″姙娉曞0鏄庡嚭鏉�
+            Collection<OsLifeCycleDTO> lifeCycleDTOList = importBtmTypeDTO.getLifeCycleDTOList();
+            if (!CollectionUtils.isEmpty(lifeCycleDTOList)) {
+                //璇存槑鏈夌敓鍛藉懆鏈熺姸鎬�
+                importLifeCycles(lifeCycleDTOList);
+            }
+            Collection<OsAttributeDTO> attributeDTOList = importBtmTypeDTO.getAttributeDTOList();
+            if (!CollectionUtils.isEmpty(attributeDTOList)) {
+                //璇存槑鏈夊睘鎬ч渶瑕佸鍏�
+                importAttributes(attributeDTOList);
+            }
+            //鍥犱负鑰佸钩鍙扮殑鍦版柟鐨勪笟鍔$被鍨嬩笂闈笉闇�瑕佹灇涓剧殑涓婚敭锛屾墍浠ュ厛澶勭悊鏋氫妇
+            Collection<OsEnumDTO> enumDTOList = importBtmTypeDTO.getEnumDTOList();
+            if (!CollectionUtils.isEmpty(enumDTOList)) {
+                //璇存槑鏈夋灇涓鹃渶瑕佸鍏�
+                importEnums(enumDTOList);
+            }
+            Collection<OsBtmTypeDTO> btmTypeDTOList = importBtmTypeDTO.getBtmTypeDTOList();
+            if (!CollectionUtils.isEmpty(btmTypeDTOList)) {
+                //璇存槑鏈変笟鍔$被鍨嬮渶瑕佸鍏�
+
+                importBtmType(btmTypeDTOList);
+            }
+            Collection<OsLinkTypeDTO> linkTypeDTOList = importBtmTypeDTO.getLinkTypeDTOList();
+            if(!CollectionUtils.isEmpty(linkTypeDTOList)){
+                importLinkType(linkTypeDTOList);
+            }
+        }catch (Throwable e){
+            if(logger.isErrorEnabled()){
+                logger.error("瀵煎叆涓氬姟绫诲瀷鐩稿叧鏁版嵁閿欒",e);
+            }
+            throw new VciBaseException(e.getMessage(),new String[0],e);
+        }
+    }
+
+    /**
+     * 瀵煎叆鐘舵��
+     * @param statusDTOList 瑕佸鍏ョ殑鐘舵�佺殑鏁版嵁浼犺緭瀵硅薄鍒楄〃
+     * @throws VciBaseException 鏌ヨ鎴栬�呮墽琛屽嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    private void importStatus( Collection<OsStatusDTO> statusDTOList) throws VciBaseException{
+        //瑕佸鍏ョ殑鐘舵�佺殑鎵�鏈夎嫳鏂囧悕绉�
+        List<String> statusIdList = new ArrayList<String>();
+        Iterator<OsStatusDTO> iterator = statusDTOList.iterator();
+        while(iterator.hasNext()){
+            statusIdList.add(iterator.next().getId().toLowerCase());
+        }
+        Set<String> existStatusIdList = statusService.selectAllStatusMap().keySet();
+        Set<String> statusNameSet = statusService.selectAllStatusMap().values().stream().map(OsStatusVO::getName).collect(Collectors.toSet());
+        //杩欎釜鍦版柟鐨勭姸鎬佷笉鏄皬鍐欑殑锛屼絾鏄钩鍙板張鍖哄垎灏忓啓
+        List<String> existStatusLowIdList = existStatusIdList.stream().map(s->s.toLowerCase(Locale.ROOT).trim()).collect(Collectors.toList());
+        //涓嶅瓨鍦ㄧ姸鎬佸璞★紙鎰忔�濋渶瑕佹坊鍔狅級
+        List<StatePool> unExistStatusDTOList = new ArrayList<StatePool>();
+        for(OsStatusDTO statusDTO: statusDTOList){
+            String statusId = statusDTO.getId().toLowerCase().trim();
+            StatePool statePool = null;
+            if(!existStatusLowIdList.contains(statusId)){
+                statusDTO.setOid(VciBaseUtil.getPk());
+                statePool = statusService.statusDTO2DO(statusDTO);
+                unExistStatusDTOList.add(statePool);
+               logger.info("瑕佹坊鍔犵殑鐘舵�亄}",statusId);
+               //瑕佺湅鍚嶅瓧鏄笉鏄篃閲嶅浜�
+                if(statusNameSet.contains(statusDTO.getName())){
+                    throw new VciBaseException("骞冲彴瑕佹眰鐘舵�佹睜鐨勪腑鏂囨爣绛句笉鑳介噸澶嶏紝骞冲彴涓凡缁忓瓨鍦ㄤ簡涓枃鏍囩涓簕0}鐨勭姸鎬侊紝浣嗘槸鑻辨枃鍚嶇О纭笉鏄瘂1}",new String[]{statusDTO.getName(),statusDTO.getId()});
+                }
+            }else{
+               //鍚嶇О閮戒笉鏀�
+            }
+        }
+        //鎵ц娣诲姞
+        if(!CollectionUtils.isEmpty(unExistStatusDTOList)){
+            statusService.batchAddStatus(unExistStatusDTOList);
+        }
+        statusService.clearCache();;
+        statusService.selectAllStatus();
+    }
+
+    /**
+     * 瀵煎叆鐢熷懡鍛ㄦ湡
+     * @param lifeCycleDTOList 瑕佸鍏ョ殑鐢熷懡鍛ㄦ湡鏁版嵁浼犺緭瀵硅薄鍒楄〃
+     * @throws VciBaseException 鏌ヨ鎴栬�呬繚瀛樺嚭閿欑殑鏃跺�欙紝浼氭姏鍑哄紓甯�
+     */
+    private void importLifeCycles(Collection<OsLifeCycleDTO> lifeCycleDTOList) throws VciBaseException{
+        Set<String> existLifeCycleIds = lifeCycleService.selectAllLifeCycleMap().keySet();
+        //鐢熷懡鍛ㄦ湡鐨勫悕绉版病鏈夎浆涓哄皬鍐欙紝浣嗘槸骞冲彴鍙堝尯鍒嗗ぇ灏忓啓
+        List<String> existLifeCycleLowIds = existLifeCycleIds.stream().map(s->s.toLowerCase(Locale.ROOT)).collect(Collectors.toList());
+        Map<String, OsLifeCycleVO> allLifeCycleMap = lifeCycleService.selectAllLifeCycleMap();
+        Map<String,OsLifeCycleVO> allLifeCycleLowMap = new HashMap<>();
+        allLifeCycleMap.forEach((id,lifeCycleVO)->{
+            allLifeCycleLowMap.put(id.toLowerCase(Locale.ROOT),lifeCycleVO);
+        });
+        //涓嶅瓨鍦ㄧ殑鐢熷懡鍛ㄦ湡瀵硅薄
+        List<LifeCyle> unExistLifeCycleList = new ArrayList<LifeCyle>();
+        List<LifeCyle> editLifeCycleList = new ArrayList<LifeCyle>();
+        String userId = WebUtil.getCurrentUserId();
+        String now = VciDateUtil.getNowString(VciDateUtil.DateTimeFormat);
+        //寰幆鍒嗘瀽闇�瑕佹坊鍔犺繕鏄慨鏀�
+        for(OsLifeCycleDTO lifeCycleDTO : lifeCycleDTOList){
+            String lifeCycleId = lifeCycleDTO.getId().toLowerCase().trim();
+            LifeCyle lifeCyle = null;
+            boolean edit = false;
+            if(!existLifeCycleLowIds.contains(lifeCycleId)) {
+                lifeCyle = new LifeCyle();
+                lifeCyle.oid = "";
+                lifeCyle.id = "";
+                lifeCyle.creator = userId;
+                lifeCyle.createTime = now;
+                lifeCyle.ts = now;
+                lifeCyle.name = lifeCycleDTO.getId();
+            }else {
+                lifeCyle = lifeCycleService.lifeCycleVO2DO( allLifeCycleLowMap.get(lifeCycleId));
+                edit = true;
+            }
+            lifeCyle.tag = lifeCycleDTO.getName();
+            lifeCyle.description = lifeCycleDTO.getDescription() == null?"":lifeCycleDTO.getDescription();
+            lifeCyle.startState = lifeCycleDTO.getStartStatus() == null?"":lifeCycleDTO.getStartStatus();
+            lifeCyle.modifier = userId;
+            lifeCyle.modifyTime = now;
+            //鎵惧尯鍩�
+            List<OsLifeCycleLineDTO> lineDTOList = lifeCycleDTO.getLineDTOList();
+            if(CollectionUtils.isEmpty(lineDTOList)){
+                //濡傛灉鏄彧鏈夌┖鐨勬椂鍊欙紝璇存槑鍙兘鍙湁涓�涓姸鎬�
+                lifeCyle.bounds = new Bound[0];
+                lifeCyle.routes = new TransitionVO[0];
+            }else{
+                //鍏堟煡璇㈡墍鏈夌殑鐘舵��
+                List<String> hasStatusList = new ArrayList<String>();
+                for(int i = 0 ; i < lineDTOList.size() ; i++){
+                    OsLifeCycleLineDTO lineDTO = lineDTOList.get(i);
+                    if(!hasStatusList.contains(lineDTO.getSourceLifeStatus())){
+                        hasStatusList.add(lineDTO.getSourceLifeStatus());
+                    }
+                    if(!hasStatusList.contains(lineDTO.getTargetLifeStatus())){
+                        hasStatusList.add(lineDTO.getTargetLifeStatus());
+                    }
+                }
+                //鎴戜滑姣忎釜鐘舵�佺殑瀹藉害100锛岄珮搴�50锛岀劧鍚庢槸杩炴帴鐨勯棿璺�100.
+                //璧峰鐘舵�佺殑宸﹁竟闂磋窛涓�20锛岄《閮ㄩ棿璺濅负100
+                List<Bound> boundList = new ArrayList<Bound>();
+
+                int w = 1 ;
+                for(int i = 0 ; i < hasStatusList.size() ; i++){
+                    String status = hasStatusList.get(i);
+                    Bound bound = new Bound();
+                    bound.id="";
+                    bound.name = status;
+                    bound.cellw = "75.0";
+                    bound.cellh = "50.0";
+                    bound.cellx = String.valueOf(80+100*w);
+                    bound.celly = String.valueOf(100 + 80*w);
+                    w++;
+                    boundList.add(bound);
+                }
+                lifeCyle.bounds = boundList.toArray(new Bound[0]);
+                //鎵惧叧绯�
+                List<TransitionVO> lineList = new ArrayList<TransitionVO>();
+                for(int i = 0 ; i < lineDTOList.size() ; i++) {
+                    OsLifeCycleLineDTO lineDTO = lineDTOList.get(i);
+                    TransitionVO line = new TransitionVO();
+                    line.id = "";
+                    line.source = lineDTO.getSourceLifeStatus();
+                    line.destination = lineDTO.getTargetLifeStatus();
+                    if(StringUtils.isNotBlank(lineDTO.getName())) {
+                        line.connect = lineDTO.getName();
+                    }else{
+                        line.connect = "line" + i;
+                    }
+                    List<String> eventDTOList = lineDTO.getEventDTOList();
+                    if(!CollectionUtils.isEmpty(eventDTOList)){
+                        List<TransitionVOEvent> eventList = new ArrayList<TransitionVOEvent>();
+                        for(String event:eventDTOList){
+                            if(StringUtils.isNotBlank(event)) {
+                                String id = event.contains(".") ? event.substring(event.lastIndexOf(".") + 1) : event;
+                                TransitionVOEvent eventVO = new TransitionVOEvent();
+                                eventVO.id = id;
+                                eventVO.name = event;
+                                eventList.add(eventVO);
+                            }
+                        }
+                        line.transitionVOEvents = eventList.toArray(new TransitionVOEvent[0]);
+                    }else{
+                        line.transitionVOEvents = new TransitionVOEvent[0];
+                    }
+                    lineList.add(line);
+                }
+                lifeCyle.routes = lineList.toArray(new TransitionVO[0]);
+            }
+            if(edit){
+                editLifeCycleList.add(lifeCyle);
+            }else{
+                unExistLifeCycleList.add(lifeCyle);
+            }
+        }
+        //鎵ц娣诲姞
+        if(!CollectionUtils.isEmpty(unExistLifeCycleList)){
+            lifeCycleService.batchAddLifeCycle(unExistLifeCycleList);
+        }
+        if(!CollectionUtils.isEmpty(editLifeCycleList)){
+            lifeCycleService.batchEditLifeCycle(editLifeCycleList);
+        }
+        lifeCycleService.clearCache();
+        lifeCycleService.selectAllLifeCycle();
+    }
+
+    /**
+     * 瀵煎叆灞炴��
+     * @param attributeDTOList 瑕佸鍏ョ殑灞炴�х殑鏁版嵁鏄剧ず瀵硅薄
+     */
+    private void importAttributes(Collection<OsAttributeDTO> attributeDTOList) throws VciBaseException {
+        Set<String> existAttributeList = attrService.selectAllAttributeMap().keySet();
+        Map<String, OsAttributeVO> allAttributeMap = attrService.selectAllAttributeMap();
+        List<AttribItem> unExistAttrList = new ArrayList<AttribItem>();
+        List<AttribItem> editAttrList = new ArrayList<AttribItem>();
+        String userId = WebUtil.getCurrentUserId();
+        String now = VciDateUtil.getNowString(VciDateUtil.DateTimeFormat);
+        //寰幆鍒嗘瀽闇�瑕佹坊鍔犺繕鏄慨鏀�
+        for (OsAttributeDTO attributeDTO : attributeDTOList) {
+            String attrId = attributeDTO.getId().toLowerCase().trim();
+            AttribItem attribItem = null;
+            boolean edit = false;
+            if (!existAttributeList.contains(attrId)) {
+                attribItem = new AttribItem();
+                attribItem.oid = "";
+                attribItem.ts = now;
+                attribItem.creator = userId;
+                attribItem.createTime = now;
+            }else {
+                OsAttributeVO attributeVO = allAttributeMap.get(attrId);
+                attribItem =new AttribItem();
+                attribItem.oid = attributeVO.getOid();
+                attribItem.ts = VciDateUtil.date2Str(attributeVO.getTs(),VciDateUtil.DateTimeMillFormat);
+                attribItem.creator = attributeVO.getCreator();
+                attribItem.createTime = VciDateUtil.date2Str(attributeVO.getCreateTime(),VciDateUtil.DateTimeFormat);
+                edit = true;
+            }
+            attribItem.modifier = userId;
+            attribItem.modifyTime = now;
+            attribItem.name = attributeDTO.getId().toLowerCase();
+            attribItem.label = attributeDTO.getName();
+            attribItem.description = attributeDTO.getDescription() == null ? "" : attributeDTO.getDescription();
+            attribItem.vtDataType = attributeDTO.getAttributeDataType() == null ? VciFieldTypeEnum.VTString.name() : attributeDTO.getAttributeDataType();
+            attribItem.defValue = attributeDTO.getDefaultValue() == null?"":attributeDTO.getDefaultValue();
+            attribItem.rage = attributeDTO.getRange() == null ? "" : attributeDTO.getRange();
+            //other闇�瑕佽嚜琛屽鐞�
+            StringBuffer sb = new StringBuffer();
+            sb.append(ALLOWNULL).append(" = ").append(attributeDTO.isNullableFlag() ? "yes" : "no").append(";");
+            VciFieldTypeEnum fieldTypeEnum = VciFieldTypeEnum.valueOf(attributeDTO.getAttributeDataType());
+            String[] otherInfos = attribItem.other.split(";");
+            int length = 0;
+            if(otherInfos!=null&& otherInfos.length > 0){
+                for(String s : otherInfos){
+                    if(s.contains(LENGTH+" =") || s.contains(LENGTH+"=")){
+                        length = VciBaseUtil.getInt(s.split("=")[1]);
+                        break;
+                    }
+                }
+            }
+            switch (fieldTypeEnum) {
+                case VTDouble:
+                    sb.append(ACCURACY).append(" = ").append(attributeDTO.getPrecisionLength()).append(";");
+                    if(edit){
+                        sb.append(LENGTH).append(" = ").append(length > attributeDTO.getAttrLength()?length:attributeDTO.getAttrLength()).append(";");
+                    }else {
+                        sb.append(LENGTH).append(" = ").append(attributeDTO.getAttrLength()).append(";");
+                    }
+                    break;
+                case VTInteger:
+                    if (StringUtils.isNotBlank(attributeDTO.getEnumId())) {
+                        sb.append(ENUMNAME).append(" = ").append(attributeDTO.getEnumId()).append(";");
+                    }
+                    break;
+                case VTString:
+                    if (StringUtils.isNotBlank(attributeDTO.getBtmTypeId())) {
+                        //鍙傜収
+                        sb.append(BTM).append(" = ").append(attributeDTO.getBtmTypeId()).append(";");
+                        //閾炬帴绫诲瀷鏆傛椂涓嶆敮鎸�
+                    }
+                    if(edit){
+                        sb.append(LENGTH).append(" = ").append(length > attributeDTO.getAttrLength()?length:attributeDTO.getAttrLength()).append(";");
+                    }else {
+                        sb.append(LENGTH).append(" = ").append(attributeDTO.getAttrLength()).append(";");
+                    }
+                    if (StringUtils.isNotBlank(attributeDTO.getEnumId())) {
+                        sb.append(ENUMNAME).append(" = ").append(attributeDTO.getEnumId()).append(";");
+                    }
+                    break;
+                default:
+                    //涓嶉渶瑕佸鐞�
+                    break;
+            }
+            attribItem.other = sb.toString();
+            if (attribItem.other.endsWith(";")) {
+                attribItem.other = attribItem.other.substring(0, attribItem.other.length() - 1);
+            }
+            if(edit){
+                editAttrList.add(attribItem);
+            }else {
+                unExistAttrList.add(attribItem);
+            }
+        }
+        if (!CollectionUtils.isEmpty(unExistAttrList)) {
+            attrService.batchAddAttribute(unExistAttrList);
+        }
+        if(!CollectionUtils.isEmpty(editAttrList)){
+            attrService.batchEditAttribute(editAttrList);
+        }
+        //鍒锋柊灞炴�э紝鍥犱负鍚庨潰闇�瑕�
+        attrService.clearCache();
+        attrService.selectAllAttribute();
+    }
+
+    /**
+     * 瀵煎叆鏋氫妇
+     * @param enumDTOList 瑕佸鍏ョ殑鏋氫妇鐨勬暟鎹紶杈撳璞″垪琛�
+     * @throws VciBaseException 鏌ヨ鎴栨墽琛屽嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    private void importEnums(Collection<OsEnumDTO> enumDTOList) throws VciBaseException{
+        Set<String> existEnumIdList = enumService.selectAllEnumMap().keySet();
+        Map<String, OsEnumVO> allEnumMap = enumService.selectAllEnumMap();
+        List< EnumItem> unExistEnumList = new ArrayList<EnumItem>();
+        List<EnumItem> editEnumList = new ArrayList<EnumItem>();
+
+        String userId = WebUtil.getCurrentUserId();
+        String now = VciDateUtil.getNowString(VciDateUtil.DateTimeFormat);
+        for(OsEnumDTO enumDTO : enumDTOList){
+            String enumId = enumDTO.getId().toLowerCase().trim();
+            if(!existEnumIdList.contains(enumId)){
+                EnumItem enumItem = new EnumItem();
+                enumItem.oid = "";
+                enumItem.ts = now;
+                enumItem.creator = userId;
+                enumItem.createTime = now;
+                enumItem.modifier = userId;
+                enumItem.modifyTime = now;
+                enumItem.name = enumDTO.getId();
+                enumItem.label = enumDTO.getName();
+                enumItem.type = "int".equalsIgnoreCase(enumDTO.getEnumValueDataType())?"Integer":"String";
+                enumItem.length = enumDTO.getLength();
+
+                List<EnumChild> childList = new ArrayList<EnumChild>();
+                Map<String, String> itemMaps = enumDTO.getItemMaps();
+                if(CollectionUtils.isEmpty(itemMaps)){
+                    throw new VciBaseException("鏋氫妇{0}娌℃湁閫夐」",new String[]{enumItem.name});
+                }
+                for(String key : itemMaps.keySet()){
+                    String value = itemMaps.get(key);
+                    EnumChild enumChild = new EnumChild();
+                    enumChild.name = value;
+                    enumChild.value = key;
+                    enumChild.description = "";
+                    childList.add(enumChild);
+                }
+                enumItem.children = childList.toArray(new EnumChild[0]);
+                unExistEnumList.add(enumItem);
+            }else{
+                //淇敼鍐呭
+                EnumItem enumItem = new EnumItem();
+                OsEnumVO enumVO = allEnumMap.get(enumId);
+                enumItem.oid = enumVO.getOid();
+                enumItem.createTime = VciDateUtil.date2Str(enumVO.getCreateTime(),VciDateUtil.DateTimeFormat);
+                enumItem.creator = enumVO.getCreator();
+                enumItem.modifier = userId;
+                enumItem.modifyTime = now;
+                enumItem.name = enumVO.getId();
+                enumItem.ts =  VciDateUtil.date2Str(enumVO.getTs(),VciDateUtil.DateTimeMillFormat);
+                enumItem.label = enumDTO.getName();
+                enumItem.type = "int".equalsIgnoreCase(enumDTO.getEnumValueDataType())?"Integer":"String";
+                enumItem.length = enumDTO.getLength();
+
+                List<EnumChild> childList = new ArrayList<EnumChild>();
+                Map<String, String> itemMaps = enumDTO.getItemMaps();
+                if(CollectionUtils.isEmpty(itemMaps)){
+                    throw new VciBaseException("鏋氫妇{0}娌℃湁閫夐」",new String[]{enumItem.name});
+                }
+                for(String key : itemMaps.keySet()){
+                    String value = itemMaps.get(key);
+                    EnumChild enumChild = new EnumChild();
+                    enumChild.name = value;
+                    enumChild.value = key;
+                    enumChild.description = "";
+                    childList.add(enumChild);
+                }
+                enumItem.children = childList.toArray(new EnumChild[0]);
+                editEnumList.add(enumItem);
+            }
+        }
+        //鎵ц娣诲姞
+        if(!CollectionUtils.isEmpty(unExistEnumList)){
+            enumService.batchAddEnum(unExistEnumList);
+        }
+        //鎵ц淇敼
+        if(!CollectionUtils.isEmpty(editEnumList)){
+            enumService.batchEditEnum(editEnumList);
+        }
+        enumService.clearCache();
+        enumService.selectAllEnum();
+    }
+
+    /**
+     * 鎵ц瀵煎叆涓氬姟绫诲瀷
+     * @param btmTypeDTOList 闇�瑕佸鍏ョ殑涓氬姟绫诲瀷鐨勬暟鎹紶杈撳璞″垪琛�
+     */
+    private void importBtmType(Collection<OsBtmTypeDTO> btmTypeDTOList) {
+        //鏌ヨ宸茬粡瀛樺湪鐨勪笟鍔$被鍨�
+        Map<String, OsBtmTypeVO> allBtmMap = btmService.selectAllBtmMap();
+        Set<String> exitBtmList = allBtmMap.keySet();
+        List<BtmItem> unExistBtmList = new ArrayList<BtmItem>();
+        List<BtmItem> editBtmList = new ArrayList<BtmItem>();
+        String userId = WebUtil.getCurrentUserId();
+        String now = VciDateUtil.getNowString(VciDateUtil.DateTimeFormat);
+
+        for (OsBtmTypeDTO btmTypeDTO : btmTypeDTOList) {
+            String btmId = btmTypeDTO.getId().toLowerCase().trim();
+            if (!exitBtmList.contains(btmId)) {
+                //鑰佸钩鍙扮殑鍐呭涓紝瀹為檯涓嶅叧蹇冨叧鑱旂殑鏁版嵁鏄惁鐪熷疄瀛樺湪锛屾墍浠ョ洿鎺ユ坊鍔犲氨琛�
+                BtmItem btmItem = new BtmItem();
+                btmItem.oid = "";
+                btmItem.ts = now;
+                btmItem.creator = userId;
+                btmItem.createTime = now;
+                btmItem.modifier = userId;
+                btmItem.modifyTime = now;
+                btmItem.name = btmTypeDTO.getId().toLowerCase();
+                wrapperBtmItem(btmItem,btmTypeDTO);
+                unExistBtmList.add(btmItem);
+            } else {
+                BtmItem btmItem = new BtmItem();
+                OsBtmTypeVO btmTypeVO = allBtmMap.get(btmId);
+                btmItem.name = btmTypeDTO.getId().toLowerCase();
+                btmItem.oid = btmTypeVO.getOid();
+                btmItem.creator = btmTypeVO.getCreator();
+                btmItem.createTime = VciDateUtil.date2Str(btmTypeVO.getCreateTime(),VciDateUtil.DateTimeFormat);
+                //淇敼
+                btmItem.modifier = userId;
+                btmItem.modifyTime = now;
+                btmItem.ts = VciDateUtil.date2Str(btmTypeVO.getTs(),VciDateUtil.DateTimeMillFormat);
+                wrapperBtmItem(btmItem,btmTypeDTO);
+                editBtmList.add(btmItem);
+            }
+            if(logger.isInfoEnabled()){
+                logger.info("涓氬姟绫诲瀷[{}],瀵瑰簲鐨勭被璺緞鏄瘂}",btmId,btmTypeDTO.getClassFullName());
+            }
+        }
+        batchAddBtm(unExistBtmList);
+        batchEditBtm(editBtmList);
+    }
+
+    /**
+     * 鎵归噺娣诲姞涓氬姟绫诲瀷
+     * @param btmItems 涓氬姟绫诲瀷鐨勫璞�
+     */
+    @Override
+    public void batchAddBtm(Collection<BtmItem> btmItems){
+        if(!CollectionUtils.isEmpty(btmItems)){
+            Map<String, OsAttributeVO> attributeMap = attrService.selectAllAttributeMap();
+            for(BtmItem btmItem : btmItems){
+                BTMServiceOperations btmService = platformClientUtil.getBtmService();
+                try{
+                    btmService.addBtmItem(btmItem);
+                    //鎵ц瀹屾垚浜嗛渶瑕佸垱寤鸿〃
+                    //鑾峰彇鐨勬椂鍊欎笉涓�瀹氬埛鏂颁簡缂撳瓨锛岃繖鏍峰氨鑾峰彇涓嶅埌淇℃伅
+                    String btmTableName = BtmProvider.getInstance().getBTMTableName(btmItem.name);
+                    String sql = "create Table " + btmTableName + "(" + "\n\tOID VARCHAR2(36) not null,\n\tREVISIONOID VARCHAR2(36),\n\tNAMEOID VARCHAR2(36),\n\tBtmName VARCHAR2(36),\n\tISLastR CHAR(1),\n\tISFirstR CHAR(1),\n\tISLastV CHAR(1),\n\tISFirstV CHAR(1),\n\tCreator VARCHAR2(36),\n\tCreateTime TIMESTAMP,\n\tLastModifier VARCHAR2(36),\n\tLastModifyTime TIMESTAMP,\n\tRevisionRule VARCHAR2(36),\n\tVersionRule VARCHAR2(36),\n\tRevisionSeq NUMBER,\n\tRevisionValue VARCHAR2(10),\n\tVersionSeq NUMBER,\n\tVersionValue VARCHAR2(10),\n\tLCTID VARCHAR2(36),\n\tLCStatus VARCHAR2(36),\n\tTS TIMESTAMP,\n\tID VARCHAR2(36),\n\tNAME VARCHAR2(128),\n\tDESCRIPTION VARCHAR2(255),\n\tOWNER VARCHAR2(36),\n\tCHECKINBY VARCHAR2(36),\n\tCHECKINTIME TIMESTAMP,\n\tCHECKOUTBY VARCHAR2(36),\n\tCHECKOUTTIME TIMESTAMP,\n\tCOPYFROMVERSION VARCHAR2(36),\n\t";
+                    String[] apNameArray = btmItem.apNameArray;
+                    if(apNameArray!=null && apNameArray.length>0){
+                        for(String attrId : apNameArray){
+                            OsAttributeVO attrVO = attributeMap.get(attrId.toLowerCase().trim());
+                            if(attrVO!=null) {
+                                String abSql = Tool.getInstance().getAbSql(attrService.attributeVO2DO(attrVO));
+                                sql = sql + abSql;
+                            }else{
+                                logger.info("涓氬姟绫诲瀷{}閲岀殑灞炴�}娌℃壘鍒�",btmTableName,attrId.toLowerCase().trim());
+                            }
+                        }
+                    }
+                    String alterSql = BtmProvider.getInstance().getAddPKSql(btmItem.name);
+                    sql = sql.substring(0, sql.lastIndexOf(","));
+                    sql = sql + "\n)";
+                    DDLToolClient.getService().executeUpdateOracle(sql);
+                    DDLToolClient.getService().executeUpdateOracle(alterSql);
+                }catch (VCIError vciError){
+                    throw WebUtil.getVciBaseException(vciError);
+                }
+            }
+        }
+    }
+
+    /**
+     * 鎵归噺娣诲姞涓氬姟绫诲瀷
+     * @param btmItems 涓氬姟绫诲瀷鐨勫璞�
+     */
+    @Override
+    public void batchEditBtm(Collection<BtmItem> btmItems){
+        Map<String, OsBtmTypeVO> btmTypeVOMap = btmService.selectAllBtmMap();
+        if(!CollectionUtils.isEmpty(btmItems)){
+            for(BtmItem btmItem : btmItems){
+                String btmId = btmItem.name;
+                List<String> addAttrList = new ArrayList<String>();
+                //淇敼杩欓噷鍒ゆ柇涓嶄簡锛屾槸闈犲睘鎬ф暣浣撹皟鏁寸殑
+                List<String> deleteAttrList = new ArrayList<String>();
+
+                Set<String> newAttrSet = new HashSet<String>();
+                Collections.addAll(newAttrSet,btmItem.apNameArray);
+                //鎷垮埌浠ュ墠鐨�
+                OsBtmTypeVO oldItem = btmTypeVOMap.get(btmId);
+                Set<String> oldAttrSet = new HashSet<String>();
+                Collections.addAll(oldAttrSet,oldItem.getAttributes().stream().map(OsBtmTypeAttributeVO::getId).collect(Collectors.toList()).toArray(new String[0]));
+                for(String attr:newAttrSet){
+                    if(!oldAttrSet.contains(attr)){
+                        addAttrList.add(attr);
+                    }
+                }
+                for(String attr:oldAttrSet){
+                    if(!newAttrSet.contains(attr)){
+                        deleteAttrList.add(attr);
+                    }
+                }
+                try{
+                    platformClientUtil.getBtmService().updateBtmItem(btmItem);
+                }catch (VCIError vciError){
+                    throw WebUtil.getVciBaseException(vciError);
+                }
+                addAttrToDB(addAttrList,btmId,false);
+                removeAttrToDB(deleteAttrList,btmId,false);
+
+            }
+        }
+    }
+
+    /**
+     * 瀵煎嚭涓氬姟绫诲瀷鐨勪俊鎭埌Word涓�
+     *
+     * @param btmTypeIdCollection 涓氬姟绫诲瀷鐨勭紪鍙烽泦鍚�
+     * @return word鐨勫叏璺緞
+     */
+    @Override
+    public String exportBtmTypesToWord(Collection<String> btmTypeIdCollection) {
+        if(CollectionUtils.isEmpty(btmTypeIdCollection)){
+            btmTypeIdCollection = btmService.selectAllBtmMap().keySet();
+        }
+        List<OsBtmTypeVO> btmTypeVOList = btmService.listBtmByIds(btmTypeIdCollection);
+        List<OsLinkTypeVO> linkTypeVOList = linkTypeService.listLinkTypeIds(btmTypeIdCollection);
+        if(CollectionUtils.isEmpty(btmTypeVOList) && CollectionUtils.isEmpty(linkTypeVOList)){
+            throw new VciBaseException("瑕佸鍑虹殑涓氬姟绫诲瀷鎴栬�呴摼鎺ョ被鍨嬮兘涓嶅瓨鍦�");
+        }
+        WordMergeStartTableDataBO tableDataBO = new WordMergeStartTableDataBO();
+        tableDataBO.setTableName(wordFieldProperties.getTableName());
+        List<Map<String,Object>> dataList = new ArrayList<>();
+        if(!CollectionUtils.isEmpty(btmTypeVOList)){
+            btmTypeVOList.stream().forEach( s -> {
+                //淇濇寔椤哄簭
+                Map<String,Object> tableData = new HashMap<>();
+                tableData.put(wordFieldProperties.getTitle(),(s.getName()==null?"":s.getName()) + " " + s.getId());
+                //瀛楁
+                List<Map<String,Object>> columnDataList = new ArrayList<>();
+                List<OsBtmTypeAttributeVO> attributes = s.getAttributes();
+                String tableAreaDesc = "";
+                if(CollectionUtils.isEmpty(attributes)){
+                    attributes = new ArrayList<>();
+                }
+                //鍔犱笁涓粯璁ょ殑灞炴��
+                OsBtmTypeAttributeVO idAttrVO = new OsBtmTypeAttributeVO();
+                idAttrVO.setId("id");
+                idAttrVO.setName("缂栧彿");
+                idAttrVO.setAttrDataType(VciFieldTypeEnum.VTString.name());
+                idAttrVO.setAttributeLength(50);
+                idAttrVO.setNullableFlag(true);
+                attributes.add(idAttrVO);
+
+                OsBtmTypeAttributeVO nameAttrVO = new OsBtmTypeAttributeVO();
+                nameAttrVO.setId("name");
+                nameAttrVO.setName("鍚嶇О");
+                nameAttrVO.setAttrDataType(VciFieldTypeEnum.VTString.name());
+                nameAttrVO.setAttributeLength(50);
+                nameAttrVO.setNullableFlag(true);
+                attributes.add(nameAttrVO);
+
+                OsBtmTypeAttributeVO descAttrVO = new OsBtmTypeAttributeVO();
+                descAttrVO.setId("description");
+                descAttrVO.setName("鎻忚堪");
+                descAttrVO.setAttrDataType(VciFieldTypeEnum.VTString.name());
+                descAttrVO.setAttributeLength(150);
+                descAttrVO.setNullableFlag(true);
+                attributes.add(descAttrVO);
+                if(!CollectionUtils.isEmpty(attributes)){
+                    Map<String,Integer> indexMap = new HashMap<>();
+                    indexMap.put("index",1);
+
+
+                    attributes.stream().forEach( t -> {
+                        int index = indexMap.get("index");
+                        Map<String,Object> columnData = attributeToWordMap(t,index);
+                        indexMap.put("index",index+1);
+                        columnDataList.add(columnData);
+                    });
+                    //鐪嬫槸鍚︽湁鏋氫妇
+                    String enumString = joinEnumInfoFromAttribute(attributes);
+                    if(StringUtils.isNotBlank(enumString)) {
+                        tableAreaDesc += enumString;
+                    }
+                }
+                tableData.put(wordFieldProperties.getColumnTableName(),columnDataList);
+                if(StringUtils.isNotBlank(s.getLifeCycleId()) && !FrameWorkLcStatusConstant.EMTYPE_LIFE_CYCLE.equalsIgnoreCase(s.getLifeCycleId())){
+                    List<OsStatusVO> statusVOList = lifeCycleService.listStatusById(s.getLifeCycleId());
+                    if(!CollectionUtils.isEmpty(statusVOList)){
+                        tableAreaDesc += "鐢熷懡鍛ㄦ湡:[" + statusVOList.stream().map(OsStatusVO::getName).collect(Collectors.joining(",")) + "]";
+                    }
+                }
+                tableData.put(wordFieldProperties.getAreaDesc(),tableAreaDesc);
+                dataList.add(tableData);
+            });
+        }
+        if(!CollectionUtils.isEmpty(linkTypeVOList)){
+            linkTypeVOList.stream().forEach( s -> {
+                //淇濇寔椤哄簭
+                Map<String,Object> tableData = new HashMap<>();
+                tableData.put(wordFieldProperties.getTitle(),(s.getName()==null?"":s.getName()) + " " + s.getId());
+                //瀛楁
+                List<Map<String,Object>> columnDataList = new ArrayList<>();
+                List<OsLinkTypeAttributeVO> linkAttributes = s.getAttributes();
+                List<OsBtmTypeAttributeVO> attributes = new ArrayList<>();
+                linkAttributes.stream().forEach(t -> {
+                    OsBtmTypeAttributeVO attributeVO = new OsBtmTypeAttributeVO();
+                    BeanUtil.convert(t,attributeVO);
+                    attributeVO.setPkBtmType(t.getPkLinkType());
+                    attributes.add(attributeVO);
+                });
+                String tableAreaDesc = "";
+                if(!CollectionUtils.isEmpty(attributes)){
+                    Map<String,Integer> indexMap = new HashMap<>();
+                    indexMap.put("index",1);
+                    attributes.stream().forEach( t -> {
+                        int index = indexMap.get("index");
+                        Map<String,Object> columnData = attributeToWordMap(t,index);
+                        indexMap.put("index",index+1);
+                        columnDataList.add(columnData);
+                    });
+                    //鐪嬫槸鍚︽湁鏋氫妇
+                    String enumString = joinEnumInfoFromAttribute(attributes);
+                    if(StringUtils.isNotBlank(enumString)) {
+                        tableAreaDesc += enumString ;
+                    }
+                }
+                if(StringUtils.isNotBlank(s.getFromBtmTypeName()) ){
+                    tableAreaDesc += "From绔笟鍔$被鍨�:" + s.getFromBtmTypeName() + "\n";
+                }
+                if(StringUtils.isNotBlank(s.getToBtmTypeName()) ){
+                    tableAreaDesc += "To绔笟鍔$被鍨�:" + s.getToBtmTypeName() + "\n";
+                }
+                tableData.put(wordFieldProperties.getColumnTableName(),columnDataList);
+                tableData.put(wordFieldProperties.getAreaDesc(),tableAreaDesc);
+                dataList.add(tableData);
+            });
+        }
+        tableDataBO.setTableDataList(dataList);
+        //鍐欏叆鍒版枃浠�
+        return writeDataToWord(tableDataBO);
+    }
+
+    /**
+     * 瀵煎嚭涓氬姟绫诲瀷鐨勪俊鎭埌Excel涓�
+     *
+     * @param btmTypeIdCollection 涓氬姟绫诲瀷鐨勭紪鍙烽泦鍚�
+     * @return excel鐨勫叏璺緞
+     */
+    @Override
+    public String exportBtmTypesToExcel(Collection<String> btmTypeIdCollection) {
+        if(CollectionUtils.isEmpty(btmTypeIdCollection)){
+            btmTypeIdCollection = btmService.selectAllBtmMap().keySet();
+        }
+        List<OsBtmTypeVO> btmTypeVOList = btmService.listBtmByIds(btmTypeIdCollection);
+        List<OsLinkTypeVO> linkTypeVOList = linkTypeService.listLinkTypeIds(btmTypeIdCollection);
+        if(CollectionUtils.isEmpty(btmTypeVOList) && CollectionUtils.isEmpty(linkTypeVOList)){
+            throw new VciBaseException("瑕佸鍑虹殑涓氬姟绫诲瀷鎴栬�呴摼鎺ョ被鍨嬮兘涓嶅瓨鍦�");
+        }
+        List<WriteExcelData> rowDataList = new ArrayList<>();
+        final int[] index = {0};
+        if(!CollectionUtils.isEmpty(btmTypeVOList)) {
+            btmTypeVOList.stream().forEach(btmTypeVO -> {
+                String btmId = btmTypeVO.getId();
+                List<OsBtmTypeAttributeVO> attributeVOS = btmService.listAttributeByBtmId(btmId);
+                //鍏堟槸鍚嶇О
+                int rowIndex = index[0];
+                WriteExcelData idED = new WriteExcelData(rowIndex, 0, btmId);
+                idED.setMerged(true);
+                if (attributeVOS.size() > 0) {
+                    idED.setRowTo(rowIndex + attributeVOS.size() - 1 + 3);
+                }
+                rowDataList.add(idED);
+
+                WriteExcelData nameED = new WriteExcelData(rowIndex, 1, btmTypeVO.getName());
+                nameED.setMerged(true);
+                if (attributeVOS.size() > 0) {
+                    nameED.setRowTo(rowIndex + attributeVOS.size() - 1 + 3);
+                }
+                rowDataList.add(nameED);
+
+                rowDataList.add(new WriteExcelData(rowIndex, 2, "id"));
+                rowDataList.add(new WriteExcelData(rowIndex, 3, "缂栧彿"));
+                rowDataList.add(new WriteExcelData(rowIndex, 4, "瀛楃涓�"));
+                rowDataList.add(new WriteExcelData(rowIndex, 5, "鏄�"));
+                rowDataList.add(new WriteExcelData(rowIndex, 6, "50"));
+                rowIndex++;
+                rowDataList.add(new WriteExcelData(rowIndex, 2, "name"));
+                rowDataList.add(new WriteExcelData(rowIndex, 3, "鍚嶇О"));
+                rowDataList.add(new WriteExcelData(rowIndex, 4, "瀛楃涓�"));
+                rowDataList.add(new WriteExcelData(rowIndex, 5, "鏄�"));
+                rowDataList.add(new WriteExcelData(rowIndex, 6, "50"));
+                rowIndex++;
+                rowDataList.add(new WriteExcelData(rowIndex, 2, "description"));
+                rowDataList.add(new WriteExcelData(rowIndex, 3, "鎻忚堪"));
+                rowDataList.add(new WriteExcelData(rowIndex, 4, "瀛楃涓�"));
+                rowDataList.add(new WriteExcelData(rowIndex, 5, "鏄�"));
+                rowDataList.add(new WriteExcelData(rowIndex, 6, "150"));
+                //澶勭悊灞炴��
+                rowIndex++;
+                for (int i = 0; i < attributeVOS.size(); i++) {
+                    OsBtmTypeAttributeVO attributeVO = attributeVOS.get(i);
+                    //鍏堟槸灞炴�х殑鑻辨枃鍚嶇О
+                    rowDataList.add(new WriteExcelData(rowIndex, 2, attributeVO.getId()));
+                    //鐒跺悗灞炴�х殑涓枃鍚嶇О
+                    rowDataList.add(new WriteExcelData(rowIndex, 3, attributeVO.getName()));
+                    //灞炴�х殑绫诲瀷
+                    rowDataList.add(new WriteExcelData(rowIndex, 4, VciFieldTypeEnum.getTextByValue(attributeVO.getAttrDataType())));
+                    //鏄惁鍙互涓虹┖
+                    rowDataList.add(new WriteExcelData(rowIndex, 5, attributeVO.isNullableFlag() ? "鏄�" : "鍚�"));
+                    //灞炴�ч暱搴�
+                    String length = attributeVO.getAttributeLength()==null?"":attributeVO.getAttributeLength() + "" ;
+                    if (attributeVO.getPrecisionLength() != null) {
+                        length = length + "(" + attributeVO.getPrecisionLength() + "," + attributeVO.getScaleLength() == null ? "2" : (attributeVO.getScaleLength() + "") + ")" ;
+                    }
+                    rowDataList.add(new WriteExcelData(rowIndex, 6, length));
+                    //澶囨敞
+                    rowDataList.add(new WriteExcelData(rowIndex, 7, attributeVO.getDescription() == null ? "" : attributeVO.getDescription()));
+                    rowIndex++;
+                }
+
+                index[0] = rowIndex;
+            });
+        }
+        if(!CollectionUtils.isEmpty(linkTypeVOList)){
+            linkTypeVOList.stream().forEach(linkTypeVO->{
+                String linkTypeId = linkTypeVO.getId();
+                List<OsLinkTypeAttributeVO> attributeVOS = linkTypeService.listAttributeByLinkId(linkTypeId);
+                //鍏堟槸鍚嶇О
+                int rowIndex = index[0];
+                WriteExcelData idED = new WriteExcelData(rowIndex, 0, linkTypeId);
+                idED.setMerged(true);
+                if (attributeVOS.size() > 0) {
+                    idED.setRowTo(rowIndex + attributeVOS.size() - 1);
+                }
+                rowDataList.add(idED);
+
+                WriteExcelData nameED = new WriteExcelData(rowIndex, 1, linkTypeVO.getName());
+                nameED.setMerged(true);
+                if (attributeVOS.size() > 0) {
+                    nameED.setRowTo(rowIndex + attributeVOS.size() - 1);
+                }
+                rowDataList.add(nameED);
+
+                //澶勭悊灞炴��
+                for (int i = 0; i < attributeVOS.size(); i++) {
+                    OsLinkTypeAttributeVO attributeVO = attributeVOS.get(i);
+                    //鍏堟槸灞炴�х殑鑻辨枃鍚嶇О
+                    rowDataList.add(new WriteExcelData(rowIndex, 2, attributeVO.getId()));
+                    //鐒跺悗灞炴�х殑涓枃鍚嶇О
+                    rowDataList.add(new WriteExcelData(rowIndex, 3, attributeVO.getName()));
+                    //灞炴�х殑绫诲瀷
+                    rowDataList.add(new WriteExcelData(rowIndex, 4, VciFieldTypeEnum.getTextByValue(attributeVO.getAttrDataType())));
+                    //鏄惁鍙互涓虹┖
+                    rowDataList.add(new WriteExcelData(rowIndex, 5, attributeVO.isNullableFlag() ? "鏄�" : "鍚�"));
+                    //灞炴�ч暱搴�
+                    String length = attributeVO.getAttributeLength() + "" ;
+                    if (attributeVO.getPrecisionLength() != null) {
+                        length = length + "(" + attributeVO.getPrecisionLength() + "," + attributeVO.getScaleLength() == null ? "2" : (attributeVO.getScaleLength() + "") + ")" ;
+                    }
+                    rowDataList.add(new WriteExcelData(rowIndex, 6, length));
+                    //澶囨敞
+                    rowDataList.add(new WriteExcelData(rowIndex, 7, attributeVO.getDescription() == null ? "" : attributeVO.getDescription()));
+                    rowIndex++;
+                }
+                if(attributeVOS.size()==0){
+                    rowIndex ++;
+                }
+                index[0] = rowIndex ;
+            });
+        }
+
+        String excelFileName = LocalFileUtil.getDefaultTempFolder() + File.separator + "鏁版嵁搴撹〃淇℃伅.xls";
+        File excelFile = new File(excelFileName);
+        try {
+            excelFile.createNewFile();
+        }catch (Throwable e){
+            String msg = "鍦ㄥ垱寤篹xcel鏂囦欢鐨勬椂鍊欏嚭鐜颁簡閿欒";
+            if(logger.isErrorEnabled()){
+                logger.error(msg,e);
+            }
+            throw new VciBaseException(msg+",{0}",new String[]{excelFileName},e);
+        }
+        String excelTemplateFileName = "/excelTemplate/dataBaseExport.xls";
+        if(this.getClass().getResource(excelTemplateFileName) == null){
+            throw new VciBaseException("璇疯仈绯荤鐞嗗憳锛岀郴缁熶腑缂哄皯{0}杩欎釜妯℃澘鏂囦欢",new String[]{excelTemplateFileName});
+        }
+        try {
+            ExcelUtil.copyFileFromJar(excelTemplateFileName,excelFile);
+            //杩欎釜鏂规硶浼氬叧闂枃浠舵祦
+        }catch (Throwable e){
+            String msg = "浠庢ā鏉挎枃浠舵嫹璐濆埌鐩爣鏂囦欢鍑虹幇浜嗛敊璇�";
+            if(logger.isErrorEnabled()){
+                logger.error(msg,e);
+            }
+            throw new VciBaseException(msg+",{0}",new String[]{excelFileName},e);
+        }
+        try{
+            WriteExcelOption excelOption = new WriteExcelOption();
+            excelOption.addSheetDataList("鏁版嵁搴撹〃",rowDataList);
+            ExcelUtil.writeDataToFile(excelFile,excelOption);
+        }catch (Throwable e){
+            String msg = "鎶婃暟鎹啓鍏ュ埌excel鏂囦欢涓嚭鐜伴敊璇�";
+            if(logger.isErrorEnabled()){
+                logger.error(msg,e);
+            }
+            throw new VciBaseException(msg+",{0}",new String[]{excelFileName},e);
+        }
+        //鏈�鍚庤繑鍥瀍xcel鏂囦欢鍚嶇О
+        return excelFileName;
+    }
+
+    /**
+     * 鎷疯礉鏁版嵁鍒皐ord妯℃澘涓�
+     * @param tableDataBO 瑕佸啓鍏ョ殑鏁版嵁
+     * @return word 鏂囦欢璺緞
+     */
+    public String writeDataToWord(WordMergeStartTableDataBO tableDataBO){
+        String tempFolder = LocalFileUtil.getDefaultTempFolder();
+        //鎷疯礉鏂囦欢
+        String wordFileName = tempFolder + File.separator + "鏁版嵁搴撻�昏緫璁捐.doc";
+        File wordFile = new File(wordFileName);
+        try {
+            wordFile.createNewFile();
+        }catch (Throwable e){
+            String msg = "鍦ㄥ垱寤簑ord鏂囦欢鐨勬椂鍊欏嚭鐜颁簡閿欒";
+            if(logger.isErrorEnabled()){
+                logger.error(msg,e);
+            }
+            throw new VciBaseException(msg+",{0}",new String[]{wordFileName},e);
+        }
+        String wordTemplateFileName = "/wordTemplate/dataBaseExport.doc";
+        if(this.getClass().getResource(wordTemplateFileName) == null){
+            throw new VciBaseException("璇疯仈绯荤鐞嗗憳锛岀郴缁熶腑缂哄皯{0}杩欎釜妯℃澘鏂囦欢",new String[]{wordTemplateFileName});
+        }
+        try {
+            LocalFileUtil.copyFileInJar(wordTemplateFileName,wordFileName);
+            //杩欎釜鏂规硶浼氬叧闂枃浠舵祦
+        }catch (Throwable e){
+            String msg = "浠庢ā鏉挎枃浠舵嫹璐濆埌鐩爣鏂囦欢鍑虹幇浜嗛敊璇�";
+            if(logger.isErrorEnabled()){
+                logger.error(msg,e);
+            }
+            throw new VciBaseException(msg+",{0}",new String[]{wordFileName},e);
+        }
+        //鍐欏叆word鏂囦欢
+        List<WordMergeStartTableDataBO> tableDataBOList = new ArrayList<>();
+        tableDataBOList.add(tableDataBO);
+        try {
+            WordUtil.setTableDataToWord(wordFile, tableDataBOList);
+        }catch (FileNotFoundException e){
+            String msg = "璇诲彇word鏂囦欢鐨勬椂鍊欏嚭鐜颁簡閿欒";
+            if(logger.isErrorEnabled()){
+                logger.error(msg,e);
+            }
+            throw new VciBaseException(msg + ",{0}",new String[]{wordFileName},e);
+        }catch (VciBaseException e){
+            throw e;
+        }catch (Throwable e){
+            throw new VciBaseException("鍐欏叆鏁版嵁鍒皐ord涓嚭鐜�",new String[0],e);
+        }
+        return wordFileName;
+    }
+
+    /**
+     * 灏嗗睘鎬у璞℃嫹璐濆埌word鏁版嵁瀵硅薄涓�
+     * @param btmTypeAttributeVO 灞炴�у璞�
+     * @param index 绱㈠紩
+     * @return 鏁版嵁鏄犲皠,key 鏄痺ord閲岀殑鍩熷瓧娈碉紝value鏄搴旂殑鍊�
+     */
+    private  Map<String,Object> attributeToWordMap(OsBtmTypeAttributeVO btmTypeAttributeVO,int index){
+        Map<String,Object> columnData = new HashMap<>();
+        if(StringUtils.isNotBlank(wordFieldProperties.getColumnIndex())) {
+            columnData.put(wordFieldProperties.getColumnIndex(), index);
+        }
+        columnData.put(wordFieldProperties.getColumnId(),btmTypeAttributeVO.getId().toLowerCase());
+        columnData.put(wordFieldProperties.getColumnName(),btmTypeAttributeVO.getName());
+        String attrDataType = btmTypeAttributeVO.getAttrDataType();
+        String columnType = VciFieldTypeEnum.getTextByValue(attrDataType);
+        if(StringUtils.isBlank(columnType)){
+            columnType = "瀛楃涓�";
+        }
+        columnData.put(wordFieldProperties.getColumnType(),columnType);
+        String area = "闀垮害" + (btmTypeAttributeVO.getAttributeLength() ==null?" ":btmTypeAttributeVO.getAttributeLength())
+                + ((VciFieldTypeEnum.VTDouble.name().equalsIgnoreCase(attrDataType)
+                && btmTypeAttributeVO.getPrecisionLength() != null
+                && btmTypeAttributeVO.getScaleLength() !=null)?("(" + btmTypeAttributeVO.getPrecisionLength()
+                + "," + btmTypeAttributeVO.getScaleLength() + ")"):"");
+        if(VciFieldTypeEnum.VTDate.name().equalsIgnoreCase(attrDataType)
+                || VciFieldTypeEnum.VTDateTime.name().equalsIgnoreCase(attrDataType)
+                || VciFieldTypeEnum.VTTime.name().equalsIgnoreCase(attrDataType)
+                || VciFieldTypeEnum.VTClob.name().equalsIgnoreCase(attrDataType)){
+            area = "";
+        }
+        if(btmTypeAttributeVO.isEnumFlag()){
+            area = "鏋氫妇:" + enumService.getNameById(btmTypeAttributeVO.getEnumId());
+        }
+        if(btmTypeAttributeVO.isReferFlag()){
+            area = "鍙傜収:" + btmService.getNameById(btmTypeAttributeVO.getReferBtmTypeId()) + "(" + btmTypeAttributeVO.getReferBtmTypeId() + ")";
+        }
+        if(!btmTypeAttributeVO.isNullableFlag()){
+            if(StringUtils.isNotBlank(area)){
+                area += ",";
+            }
+            area += "闈炵┖";
+        }
+        columnData.put(wordFieldProperties.getColumnArea(),area);
+        columnData.put(wordFieldProperties.getColumnDesc(),"");
+        return columnData;
+    }
+
+    /**
+     * 浠庡睘鎬т腑鑾峰彇鏋氫妇鐨勪俊鎭�
+     * @param attributes 灞炴�у璞�
+     * @return 涓嶅瓨鍦ㄦ灇涓剧殑灞炴�х殑鏃跺�欎細杩斿洖绌�
+     */
+    private String joinEnumInfoFromAttribute(List<OsBtmTypeAttributeVO> attributes){
+        List<OsBtmTypeAttributeVO> hasEnumAttributeVOList = attributes.stream().filter( t -> t.isEnumFlag() ).collect(Collectors.toList());
+        if(!CollectionUtils.isEmpty(hasEnumAttributeVOList)){
+            List<String> enumIdList = hasEnumAttributeVOList.stream().map(OsBtmTypeAttributeVO::getEnumId).collect(Collectors.toList());
+            List<OsEnumVO> enumVOList = enumService.listEnumByIdCollection(enumIdList);
+            return enumVOList.stream().map(t->{
+                return t.getName() + "(" + t.getId() + "):[" + t.getItemMaps().values().stream().collect(Collectors.joining(",")) + "]";
+            }).collect(Collectors.joining("\n")) + "\n";
+        }
+        return "";
+    }
+
+
+    /**
+     * 娣诲姞灞炴�у埌oracle
+     * @param addedAbList 娣诲姞鐨勫睘鎬�
+     * @param btmType 涓氬姟绫诲瀷
+     */
+    private void addAttrToDB(Collection<String> addedAbList,String btmType,boolean linkType){
+        if (!CollectionUtils.isEmpty(addedAbList)) {
+            String tableName = linkType?LinkTypeProvider.getInstance().getLTTableName(btmType):BtmProvider.getInstance().getBTMTableName(btmType);
+            String addSql = "alter table " + tableName + " add(";
+            Map<String, OsAttributeVO> attributeMap = attrService.selectAllAttributeMap();
+            for (String abName : addedAbList) {
+                AttribItem abItem = attrService.attributeVO2DO(attributeMap.get(abName));
+                addSql = addSql + Tool.getInstance().getAbSql(abItem);
+            }
+            addSql = VciBaseUtil.removeComma(addSql.replace("\n\t",""));
+            addSql = addSql + ")";
+            DDLToolClient.getService().batchExecuteUpdateOracle(new String[]{addSql});
+        }
+    }
+
+    /**
+     * 绉婚櫎灞炴��
+     * @param removeAbList 瑕佺Щ闄ょ殑灞炴�у垪琛�
+     * @param btmType 涓氬姟绫诲瀷鐨勫唴瀹�
+     */
+    private void removeAttrToDB(Collection<String> removeAbList,String btmType,boolean linkType){
+        if (!CollectionUtils.isEmpty(removeAbList)) {
+            String tableName = linkType?LinkTypeProvider.getInstance().getLTTableName(btmType):BtmProvider.getInstance().getBTMTableName(btmType);
+            String removeSql = "alter table " + tableName + " drop(";
+            for (String abName : removeAbList) {
+                removeSql = removeSql + abName + ",";
+            }
+            removeSql = VciBaseUtil.removeComma(removeSql.replace("\n\t",""));
+            removeSql = removeSql + ")";
+            DDLToolClient.getService().batchExecuteUpdateOracle(new String[]{removeSql});
+        }
+    }
+
+
+
+
+
+    /**
+     * 灏佽涓氬姟绫诲瀷
+     * @param btmItem 涓氬姟绫诲瀷鐨勫璞�
+     * @param btmTypeDTO 涓氬姟绫诲瀷鐨勬暟鎹紶杈撳璞�
+     */
+    private void wrapperBtmItem(BtmItem btmItem ,OsBtmTypeDTO btmTypeDTO){
+        btmItem.label = btmTypeDTO.getName();
+        btmItem.description = btmTypeDTO.getDescription() == null ? "" : btmTypeDTO.getDescription();
+        btmItem.isAbstract = false;
+        btmItem.fName = "";
+        btmItem.implClass = "";
+        btmItem.shape = "";
+        btmItem.lifeCycle = btmTypeDTO.getLifeCycleId() == null ? "" : btmTypeDTO.getLifeCycleId();
+        btmItem.lifeCycles = new String[0];
+        btmItem.imageName = "";
+        if (StringUtils.isBlank(btmTypeDTO.getRevisionRuleId())) {
+            btmItem.revLevel = 0;
+        } else {
+            btmItem.revLevel = (StringUtils.isNotBlank(btmTypeDTO.getVersionRule()) && VciBtmType.VciBtmTypeVersionRule.NONE.getValue().equalsIgnoreCase(btmTypeDTO.getVersionRule())) ? 1 : 2;
+        }
+        btmItem.revInput = btmTypeDTO.isInputRevisionFlag();
+        btmItem.revRuleName = btmTypeDTO.getRevisionRuleId()==null?"":btmTypeDTO.getRevisionRuleId();
+        btmItem.delimiter = "";
+        if (VciBtmType.VciBtmTypeVersionRule.INTSTART0.getValue().equalsIgnoreCase(btmTypeDTO.getVersionRule())) {
+            btmItem.verRuleName = 2;
+        } else if (VciBtmType.VciBtmTypeVersionRule.LETTER.getValue().equalsIgnoreCase(btmTypeDTO.getVersionRule())) {
+            btmItem.verRuleName = 1;
+        } else {
+            btmItem.verRuleName = 0;
+        }
+        //鍖呭惈鐨勫睘鎬х殑鏁扮粍
+        List<OsBtmTypeLinkAttributesDTO> attributesDTOList = btmTypeDTO.getAttributesDTOList();
+        List<String> attrIdList = new ArrayList<String>();
+        if (!CollectionUtils.isEmpty(attributesDTOList)) {
+            for (OsBtmTypeLinkAttributesDTO attr : attributesDTOList) {
+                attrIdList.add(attr.getId().toLowerCase());
+            }
+        }
+        btmItem.apNameArray = attrIdList.toArray(new String[0]);
+    }
+
+    /**
+     * 瀵煎叆閾炬帴绫诲瀷
+     * @param linkTypeDTOS 閾炬帴绫诲瀷鐨勬暟鎹紶杈撳璞�
+     */
+    private void importLinkType(Collection<OsLinkTypeDTO> linkTypeDTOS){
+        Map<String, OsLinkTypeVO> allLinkMap = linkTypeService.selectAllLinkMap();
+        Set<String> existLinkIdList = allLinkMap.keySet();
+        List<LinkType> addLinkTypeList = new ArrayList<LinkType>();
+        List<LinkType> editLinkTypeList = new ArrayList<LinkType>();
+        String userId = WebUtil.getCurrentUserId();
+        String now = VciDateUtil.getNowString(VciDateUtil.DateTimeFormat);
+        for(OsLinkTypeDTO linkTypeDTO : linkTypeDTOS){
+            String linkId = linkTypeDTO.getId().toLowerCase().trim();
+            LinkType linkType = null;
+            boolean editFlag = false;
+            if(!existLinkIdList.contains(linkId)) {
+                linkType = new LinkType();
+                linkType.oid = "";
+                linkType.creator = userId;
+                linkType.createTime = now;
+                linkType.ts = now;
+            }else {
+                linkType = new LinkType();
+                OsLinkTypeVO linkTypeVO = allLinkMap.get(linkId);
+                linkType.oid = linkTypeVO.getOid();
+                linkType.creator = linkTypeVO.getCreator();
+                linkType.createTime = VciDateUtil.date2Str(linkTypeVO.getCreateTime(),VciDateUtil.DateTimeFormat);
+                linkType.ts = VciDateUtil.date2Str(linkTypeVO.getTs(),VciDateUtil.DateTimeMillFormat);
+                editFlag = true;
+            }
+            linkType.modifier = userId;
+            linkType.modifyTime = now;
+            linkType.id = "";
+            linkType.name = linkId;
+            linkType.tag = linkTypeDTO.getName();
+            linkType.description = linkTypeDTO.getDescription() == null ?"":linkTypeDTO.getDescription();
+            linkType.implClass = "";
+            linkType.shape = "";
+            linkType.btmItemsFrom = linkTypeDTO.getFromBtmType().split(",");
+            linkType.btmItemsTo = linkTypeDTO.getToBtmType().split(",");
+            linkType.primitivesFrom = linkType.btmItemsFrom[0];
+            linkType.primitivesTo = linkType.btmItemsTo[0];
+            linkType.relationFrom = "N:N";
+            linkType.relationTo = "N:N";
+            linkType.relation = "N:N";
+            List<String> attrList = new ArrayList<String>();
+            List<OsBtmTypeLinkAttributesDTO> attributesDTOList = linkTypeDTO.getAttributesDTOList();
+            if(!CollectionUtils.isEmpty(attributesDTOList)){
+                for(OsBtmTypeLinkAttributesDTO attr:attributesDTOList){
+                    attrList.add(attr.getId().toLowerCase());
+                }
+            }
+            linkType.attributes = attrList.toArray(new String[0]);
+            if(editFlag){
+                editLinkTypeList.add(linkType);
+            }else{
+                addLinkTypeList.add(linkType);
+            }
+        }
+        batchAddLink(addLinkTypeList);
+        batchEditLink(editLinkTypeList);
+        linkTypeService.clearCache();
+        linkTypeService.selectAllLink();
+    }
+
+    /**
+     * 鎵归噺娣诲姞閾炬帴绫诲瀷
+     * @param linkTypes 閾炬帴绫诲瀷鐨勫璞�
+     */
+    public void batchAddLink(Collection<LinkType> linkTypes){
+        if(!CollectionUtils.isEmpty(linkTypes)){
+            Map<String, OsAttributeVO> attributeMap = attrService.selectAllAttributeMap();
+            for(LinkType linkType : linkTypes){
+                try{
+                    platformClientUtil.getLinkTypeService().addLinkType(linkType);
+                    String tableName = LinkTypeProvider.getInstance().getLTTableName(linkType.name);
+                    String sql = "create table " + tableName + "(" + "\n\tOID VARCHAR2(36) not null,\n\tCreator VARCHAR2(36),\n\tCreateTime TIMESTAMP,\n\tLastModifier VARCHAR2(36),\n\tLastModifyTime TIMESTAMP,\n\tTS TIMESTAMP,\n\t";
+                    String[] apNameArray = linkType.attributes;
+                    if(apNameArray!=null && apNameArray.length>0){
+                        for(String attrId : apNameArray){
+                            OsAttributeVO attrVO = attributeMap.get(attrId.toLowerCase().trim());
+                            String abSql = Tool.getInstance().getAbSql(attrService.attributeVO2DO(attrVO));
+                            sql = sql + abSql;
+                        }
+                    }
+                    sql = sql.substring(0, sql.lastIndexOf(","));
+                    sql = sql + "\n)";
+                    DDLToolClient.getService().executeUpdateOracle(sql);
+                    DDLToolClient.getService().executeUpdateOracle(LinkTypeProvider.getInstance().getAddPKSql(linkType.name));
+                }catch (VCIError vciError){
+                    throw WebUtil.getVciBaseException(vciError);
+                }
+            }
+        }
+    }
+
+    /**
+     * 鎵归噺淇敼閾炬帴绫诲瀷
+     * @param linkTypes 閾炬帴绫诲瀷鐨勫璞�
+     */
+    public void batchEditLink(Collection<LinkType> linkTypes){
+        Map<String, OsLinkTypeVO> linkTypeVOMap = linkTypeService.selectAllLinkMap();
+        if(!CollectionUtils.isEmpty(linkTypes)){
+            for(LinkType linkType : linkTypes){
+                try{
+                    platformClientUtil.getLinkTypeService().modifyLinkType(linkType);
+                    String linkTypeId = linkType.name.toLowerCase(Locale.ROOT);
+                    List<String> addAttrList = new ArrayList<String>();
+                    //淇敼杩欓噷鍒ゆ柇涓嶄簡锛屾槸闈犲睘鎬ф暣浣撹皟鏁寸殑
+                    List<String> deleteAttrList = new ArrayList<String>();
+
+                    Set<String> newAttrSet = new HashSet<String>();
+                    Collections.addAll(newAttrSet,linkType.attributes);
+
+                    OsLinkTypeVO oldItem = linkTypeVOMap.get(linkType.name.toLowerCase(Locale.ROOT));
+                    Set<String> oldAttrSet = new HashSet<String>();
+                    Collections.addAll(oldAttrSet,oldItem.getAttributes().stream().map(OsLinkTypeAttributeVO::getId).collect(Collectors.toList()).toArray(new String[0]));
+                    for(String attr:newAttrSet){
+                        if(!oldAttrSet.contains(attr)){
+                            addAttrList.add(attr);
+                        }
+                    }
+                    for(String attr:oldAttrSet){
+                        if(!newAttrSet.contains(attr)){
+                            deleteAttrList.add(attr);
+                        }
+                    }
+                    addAttrToDB(addAttrList,linkTypeId,true);
+                    removeAttrToDB(deleteAttrList,linkTypeId,true);
+
+                }catch (VCIError vciError){
+                    throw WebUtil.getVciBaseException(vciError);
+                }
+            }
+        }
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WebContextInfoFetcher.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WebContextInfoFetcher.java
new file mode 100644
index 0000000..555abd0
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WebContextInfoFetcher.java
@@ -0,0 +1,84 @@
+package com.vci.web.service.impl;
+
+import com.vci.corba.common.data.VCIInvocationInfo;
+import com.vci.mw.client.ClientContextVariable;
+import com.vci.mw.client.IInvocationContext;
+import com.vci.starter.corba.constant.CorbaKeyConstant;
+import com.vci.starter.corba.initializer.JacorbSessionContext;
+import com.vci.starter.web.annotation.log.VciUnLog;
+import com.vci.starter.web.enumpck.DataSecretEnum;
+import com.vci.starter.web.pagemodel.SessionInfo;
+import com.vci.starter.web.util.WebThreadLocalUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 鑾峰彇浼氳瘽鐨勪俊鎭�
+ * @author weidy
+ * @date 2021-2-2
+ */
+@Component
+public class WebContextInfoFetcher implements IInvocationContext, JacorbSessionContext {
+
+	/**
+	 * 鑾峰彇corba鎵�闇�鐨勪細璇濈殑淇℃伅
+	 * @return 涓嶅瓨鍦ㄤ細鍒濆鍖�
+	 */
+	@Override
+	@VciUnLog
+	public VCIInvocationInfo getInvocationInfo() {
+		SessionInfo sessionInfo = WebThreadLocalUtil.getCurrentUserSessionInfoInThread().get();
+		if(sessionInfo == null){
+			return ClientContextVariable.getInvocationInfo();
+		}else {
+			VCIInvocationInfo vcii = new VCIInvocationInfo();
+			if (sessionInfo != null) {
+				vcii.clientIPInfo = sessionInfo.getIp()==null?"127.0.0.1":sessionInfo.getIp();
+				vcii.clientMachine = sessionInfo.getMachine()== null?"PC":sessionInfo.getMachine();
+				vcii.clientOS = sessionInfo.getOs()==null?"windows":sessionInfo.getOs();
+				vcii.clientOSUser = sessionInfo.getOsUser() == null?"unknow":sessionInfo.getOsUser();
+				vcii.email=sessionInfo.getEmail() ==null?"":sessionInfo.getEmail();
+				vcii.groupIDs = sessionInfo.getDeptOid()==null?new String[0]:sessionInfo.getDeptOid().split(",");
+				vcii.groupNames =sessionInfo.getDeptName() ==null?new String[0]:sessionInfo.getDeptName().split(",");
+				vcii.language = sessionInfo.getLanguage()==null?"ZH_CN":sessionInfo.getLanguage();
+				vcii.secretGrade = sessionInfo.getUserSecret()==null?"10": sessionInfo.getUserSecret();
+				vcii.trueName = sessionInfo.getUserName() ==null?"":sessionInfo.getUserName();
+				vcii.userID = sessionInfo.getUserOid()==null?"":sessionInfo.getUserOid();
+				vcii.userName = sessionInfo.getUserId() == null?"":sessionInfo.getUserId();
+				vcii.roleIDs = sessionInfo.getRolesName() == null ? new String[0]:sessionInfo.getRolesName().keySet().toArray(new String[0]);
+				vcii.roleNames = sessionInfo.getRolesName() == null ? new String[0]:sessionInfo.getRolesName().values().toArray(new String[0]);
+				Map<String,String> globalAttributeMap = sessionInfo.getGlobalAttributeMap();
+				if(globalAttributeMap==null){
+					globalAttributeMap = new HashMap<>();
+				}
+				String[] globalAttributeString = new String[11];
+				globalAttributeString[0]= CorbaKeyConstant.CURRENT_USER_ID + "=" + globalAttributeMap.getOrDefault(CorbaKeyConstant.CURRENT_USER_ID,sessionInfo.getUserId());
+				globalAttributeString[1]=CorbaKeyConstant.CURRENT_USER_NAME + "=" + globalAttributeMap.getOrDefault(CorbaKeyConstant.CURRENT_USER_NAME,sessionInfo.getUserName());
+				globalAttributeString[2]=CorbaKeyConstant.CURRENT_USER_SECRET +"=" + globalAttributeMap.getOrDefault(CorbaKeyConstant.CURRENT_USER_SECRET,sessionInfo.getUserSecret());
+				globalAttributeString[3]=CorbaKeyConstant.CURRENT_USER_EMAIL +"=" + globalAttributeMap.getOrDefault(CorbaKeyConstant.CURRENT_USER_EMAIL,sessionInfo.getEmail());
+				globalAttributeString[4]=CorbaKeyConstant.CURRENT_USER_GROUPNUM +"=" + globalAttributeMap.getOrDefault(CorbaKeyConstant.CURRENT_USER_GROUPNUM,"");
+				globalAttributeString[5]=CorbaKeyConstant.CURRENT_MACHINE_SECRET + "=" + globalAttributeMap.getOrDefault(CorbaKeyConstant.CURRENT_MACHINE_SECRET, DataSecretEnum.NONE.getValue()+"");
+				String ipSec = globalAttributeMap.getOrDefault(CorbaKeyConstant.IP_SECRET_SWITCH,"off");
+				globalAttributeString[6]=CorbaKeyConstant.IP_SECRET_SWITCH + "=" + ipSec;
+				globalAttributeString[7]=CorbaKeyConstant.CURRENT_USER_GROUPNAME +"=" + globalAttributeMap.getOrDefault(CorbaKeyConstant.CURRENT_USER_GROUPNAME,sessionInfo.getDeptName());
+				globalAttributeString[8]=CorbaKeyConstant.USER_SECRET_SWITCH+ "=" + globalAttributeMap.getOrDefault(CorbaKeyConstant.USER_SECRET_SWITCH,"off");
+				globalAttributeString[9]=String.valueOf(System.currentTimeMillis());
+				globalAttributeString[10]=sessionInfo.getToken();
+				//鐜板湪涓嶇‘瀹氳�佺殑鏄惁鍙互鎺ュ彈鏁扮粍澶氫釜鐨勬儏鍐�
+				vcii.extAttribs = globalAttributeString;
+			}
+			return vcii;
+		}
+	}
+
+	/**
+	 * 鑾峰彇褰撳墠浼氳瘽
+	 * @return 浼氳瘽鐨勫璞�
+	 */
+	@Override
+	public SessionInfo getSessionInfo() {
+		return WebThreadLocalUtil.getCurrentUserSessionInfoInThread().get();
+	}
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WebHomeTaskServiceImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WebHomeTaskServiceImpl.java
new file mode 100644
index 0000000..6a9d61a
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WebHomeTaskServiceImpl.java
@@ -0,0 +1,150 @@
+package com.vci.web.service.impl;
+
+
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.starter.web.pagemodel.SessionInfo;
+import com.vci.starter.web.util.ApplicationContextProvider;
+import com.vci.starter.web.util.BeanUtil;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.web.dto.WebHomeTaskActionDTO;
+import com.vci.web.model.WebHomeTaskActionDO;
+import com.vci.web.pageModel.WebHomeTaskActionVO;
+import com.vci.web.service.WebBoServiceI;
+import com.vci.web.service.WebHomeTaskServiceI;
+import com.vci.web.util.WebUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static com.vci.web.constant.CacheNameConstant.VCI_USER;
+
+/**
+ * 棣栭〉寰呭姙浠诲姟鐨勬湇鍔�
+ * @author weidy
+ */
+@Service
+public class WebHomeTaskServiceImpl implements WebHomeTaskServiceI {
+
+    /**
+     * 鏃ュ織
+     */
+    private Logger logger = LoggerFactory.getLogger(getClass());
+
+    /**
+     * 涓氬姟鏁版嵁鐨勬湇鍔�
+     */
+    @Autowired
+    private WebBoServiceI boService;
+
+    /**
+     * 鑾峰彇褰撳墠鐢ㄦ埛鐨勯椤靛緟鍔炰换鍔�
+     *
+     * @return 浠诲姟姹囨�荤殑鏁伴噺
+     */
+    @Override
+    @Cacheable(value = VCI_USER,key = "'userHomeTask'.concat(#root.target.getCurrentUserOid())", unless = "#result == null")
+    public List<WebHomeTaskActionVO> listMyHomeTask()  {
+        List<WebHomeTaskActionVO> actionVOS = new ArrayList<>();
+        List<WebHomeTaskActionDO> allActions = boService.queryObject(WebHomeTaskActionDO.class,null);
+        if (!CollectionUtils.isEmpty(allActions)) {
+            SessionInfo sessionInfo = WebUtil.getCurrentUserSessionInfo();
+            if(sessionInfo ==null){
+                throw new VciBaseException("娌℃湁鐧诲綍");
+            }
+            List<String> myFunctionOids = sessionInfo.getFunctionOids();
+            allActions = allActions.stream().filter(s -> !CollectionUtils.isEmpty(myFunctionOids) && myFunctionOids.contains(s.getId())).collect(Collectors.toList());
+        }
+        if(!CollectionUtils.isEmpty(allActions)){
+            allActions.stream().forEach(action->{
+                WebHomeTaskActionVO taskActionVO = new WebHomeTaskActionVO();
+                BeanUtil.convert(action,taskActionVO);
+                actionVOS.add(taskActionVO);
+            });
+        }
+        return actionVOS;
+    }
+    /**
+     * 鑾峰彇褰撳墠鐢ㄦ埛锛岀敤浜庣紦瀛樹腑 銆傘�傘�傚埆鐨勫湴鏂逛笉瑕佽皟鐢�
+     * @return 褰撳墠鐢ㄦ埛鐨勪富閿�
+     */
+    @Override
+    public String getCurrentUserOid(){
+        return WebUtil.getCurrentUserOid();
+    }
+
+    /**
+     * 娣诲姞棣栭〉寰呭姙浠诲姟鐨刟ction
+     *
+     * @param action 鏁版嵁瀵硅薄
+     */
+    @Override
+    public void addAction(WebHomeTaskActionDTO action){
+        WebUtil.alertNotNull(action,"瑕佹坊鍔犵殑淇℃伅涓虹┖",action.getId(),"鑿滃崟鐨勪富閿�",action.getName(),"鑿滃崟鐨勫悕绉�",action.getCountUrl(),"璋冪敤鐨勫湴鍧�");
+        WebHomeTaskActionDO actionDO = new WebHomeTaskActionDO();
+        BeanUtil.convert(action,actionDO);
+        actionDO.setOid(VciBaseUtil.getPk());
+        boService.addSave(actionDO);
+    }
+
+    /**
+     * 淇敼寰呭姙浠诲姟鐨刟ction淇℃伅
+     *
+     * @param action 鏁版嵁瀵硅薄
+     */
+    @Override
+    public void editAction(WebHomeTaskActionDTO action)  {
+        WebUtil.alertNotNull(action,"瑕佷慨鏀圭殑淇℃伅涓虹┖",action.getOid(),"涓婚敭",action.getTs(),"鏃堕棿鎴�");
+        WebHomeTaskActionDO actionDO = boService.selectByOid(action.getOid(),WebHomeTaskActionDO.class);
+        BeanUtil.convert(action,actionDO);
+        boService.editSave(actionDO);
+    }
+
+    /**
+     * 鍒犻櫎寰呭姙浠诲姟鐨刟ction淇℃伅
+     *
+     * @param action 鏁版嵁瀵硅薄
+     */
+    @Override
+    public void deleteAction(WebHomeTaskActionDTO action) throws VciBaseException {
+        WebUtil.alertNotNull(action,"瑕佸垹闄ょ殑淇℃伅涓虹┖",action.getOid(),"涓婚敭",action.getTs(),"鏃堕棿鎴�");
+        if(boService.checkTs(action)) {
+            WebHomeTaskActionDO actionDO = boService.selectByOid(action.getOid(), WebHomeTaskActionDO.class);
+            boService.delete(actionDO);
+        }
+    }
+
+    /**
+     * 鏌ヨ鎵�鏈夌殑寰呭姙浠诲姟鍔ㄤ綔瀹氫箟
+     *
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param pageHelper   鍒嗛〉淇℃伅
+     * @return 鏁版嵁瀵硅薄
+     */
+    @Override
+    public DataGrid dataGrid(Map<String, String> conditionMap, PageHelper pageHelper) throws VciBaseException{
+        if(pageHelper == null){
+            pageHelper = new PageHelper(-1);
+        }
+        pageHelper.addDefaultDesc("createTime");
+        DataGrid dataGrid = boService.queryGridClass(WebHomeTaskActionDO.class,conditionMap,pageHelper);
+        if(!CollectionUtils.isEmpty(dataGrid.getData())){
+            List<WebHomeTaskActionVO> taskActionVOS = new ArrayList<>();
+            dataGrid.getData().forEach(action->{
+                WebHomeTaskActionVO taskActionVO = new WebHomeTaskActionVO();
+                BeanUtil.convert((WebHomeTaskActionDO)action,taskActionVO);
+                taskActionVOS.add(taskActionVO);
+            });
+            dataGrid.setData(taskActionVOS);
+        }
+        return dataGrid;
+    }
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WebInitServiceImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WebInitServiceImpl.java
new file mode 100644
index 0000000..a0e84d5
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WebInitServiceImpl.java
@@ -0,0 +1,180 @@
+package com.vci.web.service.impl;
+
+import com.vci.frameworkcore.compatibility.ISmFunctionQueryService;
+import com.vci.starter.web.enumpck.DataSecretEnum;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.properties.VciSessionProperties;
+import com.vci.starter.web.util.ApplicationContextProvider;
+import com.vci.web.properties.WebProperties;
+import com.vci.web.service.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 鍒濆鍖栧悗鐨勫鐞嗙紦瀛樼殑鏈嶅姟
+ * @author weidy
+ * @date 2022-1-12
+ */
+@Component
+public class WebInitServiceImpl {
+
+    /**
+     * 涓氬姟绫诲瀷
+     */
+    @Autowired
+    private OsBtmServiceI btmService;
+
+    /**
+     * 閾炬帴绫诲瀷
+     */
+    @Autowired
+    private OsLinkTypeServiceI linkTypeService;
+
+    /**
+     * UI
+     */
+    @Autowired
+    private UIEngineServiceI uiEngineService;
+
+    /**
+     * 鑿滃崟
+     */
+    @Autowired
+    private ISmFunctionQueryService functionQueryService;
+    /**
+     * 瀵嗙骇鏈嶅姟
+     */
+    @Autowired
+    private WebSecretServiceI webSecretService;
+
+    /**
+     * 鐘舵�佺殑鏈嶅姟
+     */
+    @Autowired
+    private OsStatusServiceI statusService;
+
+    /**
+     * 鐢熷懡鍛ㄦ湡鐨勬湇鍔�
+     */
+    @Autowired
+    private OsLifeCycleServiceI lifeCycleService;
+
+    /**
+     * 鏋氫妇鐨勬湇鍔�
+     */
+    @Autowired
+    private OsEnumServiceI enumService;
+
+    /**
+     * 瑙勫垯鐨勬湇鍔�
+     */
+    @Autowired
+    private OsRevisionRuleServiceI revisionRuleService;
+
+    /**
+     * 灞炴�х殑鏈嶅姟
+     */
+    @Autowired
+    private OsAttributeServiceI attributeService;
+
+    /**
+     * 浼氳瘽鐨勪俊鎭�
+     */
+    @Autowired(required = false)
+    private VciSessionProperties sessionProperties;
+
+    /**
+     * web鐩稿叧閰嶇疆
+     */
+    @Autowired
+    private WebProperties webProperties;
+
+    /**
+     * 涓氬姟绫诲瀷鐨勬湇鍔�
+     */
+    @Autowired
+    private WebBoServiceI boService;
+
+    /**
+     * 涓绘湇鍔℃槸鍚﹀湪鎵ц缂撳瓨
+     * @return true琛ㄧず娌℃湁鎵ц锛屾墽琛屼腑浼氭姏鍑哄紓甯�
+     */
+    public boolean checkMainServerUnCache(){
+        //鐪嬬湅涓绘湇鍔″湪鎵ц鍒锋柊缂撳瓨娌℃湁
+        boolean finishInitCache = false;
+        for(int i = 0 ; i < 10 ; i++){
+            if(boService.queryCountBySql("select count(*) from plcachetemp",new HashMap<>()) ==0){
+                finishInitCache = true;
+                break;
+            }else{
+                //璇存槑涓绘湇鍔″湪鎵ц
+                try {
+                    Thread.sleep(1000);
+                } catch (InterruptedException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        if(!finishInitCache){
+            throw new VciBaseException("鏆傛椂涓嶈兘鍒锋柊锛屽洜涓轰富鏈嶅姟杩樻鍦ㄦ墽琛屽垵濮嬪寲缂撳瓨");
+        }
+        return finishInitCache;
+    }
+
+    /**
+     * 娓呴櫎鎵�鏈夌殑缂撳瓨
+     */
+    public void clearAllCache(){
+        Map<String, OsBaseServiceI> beans = ApplicationContextProvider.getApplicationContext().getBeansOfType(OsBaseServiceI.class);
+        if(!CollectionUtils.isEmpty(beans)){
+            beans.forEach((name,bean)->{
+                bean.clearCache();
+            });
+        }
+    }
+
+    /**
+     *  鍒濆鍖栨湇鍔$鐨勭紦瀛�
+     * @throws Exception 鏌ヨ鐨勬椂鍊欏嚭鐜伴敊璇殑鏃跺��
+     */
+    public void initServerCache(){
+        long currentTime = System.currentTimeMillis();
+        System.out.println("寮�濮嬪惎鍔ㄧ姸鎬佹睜鐨勭紦瀛橈紝鏃堕棿鏈夌偣闀匡紝璇疯�愬績绛夊緟");
+        statusService.selectAllStatusMap();
+        System.out.println("鐘舵�佹睜鐨勫埛鏂板畬鎴�,鑰楁椂" + (System.currentTimeMillis()-currentTime) + ",寮�濮嬪埛鏂扮敓鍛藉懆鏈�");
+        currentTime = System.currentTimeMillis();
+        lifeCycleService.selectAllLifeCycleMap();
+        System.out.println("鐢熷懡鍛ㄦ湡鍒锋柊瀹屾垚,鑰楁椂" + (System.currentTimeMillis()-currentTime) + ",寮�濮嬪埛鏂版灇涓�");
+        currentTime = System.currentTimeMillis();
+        enumService.selectAllEnumMap();
+
+        System.out.println(DataSecretEnum.NONE.getValue());
+        System.out.println("鏋氫妇鍒锋柊瀹屾垚,鑰楁椂" + (System.currentTimeMillis()-currentTime) + ",寮�濮嬪埛鏂扮増鏈鍒�");
+        currentTime = System.currentTimeMillis();
+        revisionRuleService.selectAllRevisionMap();
+        System.out.println("鐗堟湰瑙勫垯鍒锋柊瀹屾垚,鑰楁椂" + (System.currentTimeMillis()-currentTime) + ",寮�濮嬪埛鏂板睘鎬�");
+        currentTime = System.currentTimeMillis();
+        attributeService.selectAllAttributeMap();
+        System.out.println("灞炴�у埛鏂板畬鎴�,鑰楁椂" + (System.currentTimeMillis()-currentTime) + ",寮�濮嬪埛鏂颁笟鍔$被鍨�");
+        currentTime = System.currentTimeMillis();
+        btmService.selectAllBtmMap();
+        System.out.println("涓氬姟绫诲瀷鍒锋柊瀹屾垚,鑰楁椂" + (System.currentTimeMillis()-currentTime) + ",寮�濮嬪埛鏂伴摼鎺ョ被鍨�");
+        currentTime = System.currentTimeMillis();
+        linkTypeService.selectAllLinkMap();
+        System.out.println("閾炬帴绫诲瀷鍒锋柊瀹屾垚,鑰楁椂" + (System.currentTimeMillis()-currentTime) + ",寮�濮嬪埛鏂癠I涓婁笅鏂�");
+        currentTime = System.currentTimeMillis();
+        if(webProperties.isCacheUIOnInit()) {
+            uiEngineService.selectAllFormMap();
+        }
+        uiEngineService.selectAllActionMap();
+        System.out.println("UI涓婁笅鏂囧埛鏂板畬鎴�,鑰楁椂" + (System.currentTimeMillis()-currentTime) );
+        currentTime = System.currentTimeMillis();
+        functionQueryService.selectAllFunctionMap();
+        System.out.println("鑿滃崟鍒锋柊,鑰楁椂" + (System.currentTimeMillis()-currentTime) );
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WebLoServiceImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WebLoServiceImpl.java
new file mode 100644
index 0000000..0356542
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WebLoServiceImpl.java
@@ -0,0 +1,834 @@
+package com.vci.web.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.vci.base.common.utility.ObjectUtility;
+import com.vci.corba.common.VCIError;
+import com.vci.starter.web.constant.QueryOptionConstant;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.starter.web.util.VciDateUtil;
+import com.vci.web.properties.WebProperties;
+import com.vci.web.query.UILinkTypeDataQuery;
+import com.vci.web.service.WebBoServiceI;
+import com.vci.web.service.WebLoServiceI;
+import com.vci.web.util.PlatformClientUtil;
+import com.vci.web.util.WebUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.omg.CORBA.IntHolder;
+import org.omg.CORBA.PRIVATE_MEMBER;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import plm.bs.bom.clientobject.BOFactoryClient;
+import plm.bs.bom.clientobject.ClientBusinessObject;
+import plm.bs.bom.clientobject.ClientLinkObject;
+import plm.bs.bom.clientobject.ClientLinkObjectOperation;
+import plm.bs.bom.common.AttributeValue;
+import plm.bs.bom.common.BusinessObject;
+import plm.bs.bom.common.LinkObject;
+import plm.corba.qt.BOAndLO;
+import plm.oq.objectQuery.common.*;
+
+import java.lang.reflect.Field;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/***
+ * 閾炬帴绫诲瀷鏌ヨ
+ * @author weidy
+ *
+ */
+@Service
+public class WebLoServiceImpl implements WebLoServiceI {
+
+	/**
+	 * 澶氳瑷�鍓嶇紑
+	 */
+	private final String msgCodePrefix = "com.vci.web.loService.";
+	
+	/**
+	 * 鏃ュ織瀵硅薄
+	 */
+	private Logger logger = LoggerFactory.getLogger(getClass());
+	
+	/**
+	 * LO鎿嶄綔绫�
+	 */
+	private ClientLinkObjectOperation loOperation = new ClientLinkObjectOperation();
+	
+	@Autowired
+	private WebBoServiceI boService;
+
+	@Autowired
+	private WebProperties webProperties;
+
+	/**
+	 * 骞冲彴璋冪敤瀹㈡埛绔�
+	 */
+	@Autowired
+	private PlatformClientUtil platformClientUtil;
+
+	/**
+	 * 閾炬帴瀵硅薄榛樿灞炴��
+	 */
+	public static final Map<String,String> LO_BASE_FIELD_MAP = new HashMap<>();
+
+	public WebLoServiceImpl(){
+		LO_BASE_FIELD_MAP.put("oid","oid");
+		LO_BASE_FIELD_MAP.put("creator","creator");
+		LO_BASE_FIELD_MAP.put("createTime","createTime");
+		LO_BASE_FIELD_MAP.put("lastModifier","lastModifier");
+		LO_BASE_FIELD_MAP.put("lastModifyTime","lastModifyTime");
+		LO_BASE_FIELD_MAP.put("fromOid","f_oid");
+		LO_BASE_FIELD_MAP.put("fromRevisionOid","f_revisionoid");
+		LO_BASE_FIELD_MAP.put("fromNameOid","f_nameoid");
+		LO_BASE_FIELD_MAP.put("fromBTMName","f_btwname");
+		LO_BASE_FIELD_MAP.put("toRevisionOid","t_revisionoid");
+		LO_BASE_FIELD_MAP.put("toNameOid","t_nameoid");
+		LO_BASE_FIELD_MAP.put("toBTMName","t_btwname");
+		LO_BASE_FIELD_MAP.put("toOid","t_oid");
+		LO_BASE_FIELD_MAP.put("ts","ts");
+		LO_BASE_FIELD_MAP.put("linkTypeName","linkTypeName");
+	}
+	
+	@Override
+	public ClientLinkObjectOperation getLoOption() throws VciBaseException {
+		return loOperation;
+	}
+
+	@Override
+	public List<ClientLinkObject> queryCLO(String linkType,
+			Map<String, String> conditionMap) throws VciBaseException {
+		return queryCLO(linkType, "", 1, conditionMap);
+	}
+
+	@Override
+	public List<ClientBusinessObject> queryLinkCbo(String linkType,
+			String toBtmname, Map<String, String> conditionMap)
+			throws VciBaseException {
+		return queryLinkCbo(linkType, toBtmname, 1, conditionMap);
+	}
+
+	@Override
+	public List<ClientLinkObject> queryCLO(String linkType, String toBtmName,
+			int level, Map<String, String> conditionMap) throws VciBaseException {
+		return queryCLO(linkType, toBtmName, level, false, conditionMap);
+	}
+	
+	@Override
+	public List<ClientLinkObject> queryCLO(String linkType, String toBtmName,
+			int level, boolean isDirection,Map<String, String> conditionMap) throws VciBaseException {
+		return queryCLO(linkType,toBtmName,level,isDirection,conditionMap,new PageHelper(-1));
+	}
+	
+	/***
+	 * 閾炬帴鏌ヨ锛屾敮鎸侀檺瀹氭煇绔殑涓氬姟绫诲瀷锛岄檺瀹氬眰绾э紝鎺掑簭锛屽弽鍚戯紝鏌ヨ鏉′欢锛屼絾鏄笉鏀寔鏋氫妇鍜屽弬鐓у瓧娈电殑鏄剧ず
+	 * @param linkType 閾炬帴绫诲瀷鍚嶇О
+	 * @param toBtmName 鍙︿竴绔殑涓氬姟绫诲瀷
+	 * @param level 鏌ヨ灞傜骇
+	 * @param isDirection 鏄惁鍙嶅悜
+	 * @param conditionMap 鏌ヨ鏉′欢锛屾敞鎰廸_oid闇�瑕佸湪鍏朵腑锛屾垨鑰協rom绔殑鍏朵粬灞炴��
+	 * @param ph 鎺掑簭鍜屽垎椤碉紝閾炬帴涓�鑸笉寤鸿鍒嗛〉
+	 */
+	@Override
+	public List<ClientLinkObject> queryCLO(String linkType, String toBtmName,
+			int level, boolean isDirection,Map<String, String> conditionMap,PageHelper ph) throws VciBaseException {
+		List<ClientLinkObject> rtnOBJs = new ArrayList<ClientLinkObject>();
+		QueryTemplate qt = new QueryTemplate();
+		qt.setId("queryLO");
+		qt.setType(QTConstants.TYPE_LINK);
+		qt.setLinkType(linkType.toLowerCase());
+		List<String> clauseList = new ArrayList<String>();
+		clauseList.add("*");
+		qt.setClauseList(clauseList);
+		qt.setDirection(isDirection?"opposite":"positive");
+		qt.setLevel(level);
+		conditionMap = WebUtil.getNotNullMap(conditionMap);
+		if(WebUtil.isNotNull(toBtmName)){
+			toBtmName = toBtmName.toLowerCase().trim();
+			if(toBtmName.indexOf(",")>-1){
+				toBtmName = QueryOptionConstant.IN + "(" + WebUtil.getInt(toBtmName) + ")";
+			}
+		}
+		if(isDirection && WebUtil.isNotNull(toBtmName)){
+			conditionMap.put("f_btwname", toBtmName.toLowerCase().trim());
+		}else if(!isDirection && WebUtil.isNotNull(toBtmName)){
+			conditionMap.put("t_btwname", toBtmName.toLowerCase().trim());
+		}
+		qt.setRightFlag(webProperties.isDataRight());
+		//璁剧疆鍒嗛〉淇℃伅鍜屾帓搴�
+		if(ph!=null){
+			if(ph.getLimit()>0){
+				PageInfo pageInfo = new PageInfo();
+				pageInfo.setPageNO(ph.getPage());
+				pageInfo.setRowCount(ph.getLimit());
+				qt.setPageInfo(pageInfo);
+			}
+			if(WebUtil.isNotNull(ph.getSort()) && WebUtil.isNotNull(ph.getOrder())){
+				//璁剧疆浜嗘帓搴�
+				String[] sort = ph.getSort().split(",");
+				String[] order = ph.getOrder().split(",");
+				if(sort.length != order.length){
+					throw new VciBaseException(msgCodePrefix + ".sortlengtherror",new Object[]{sort.length,order.length});
+				}
+				List<OrderInfo> orderInfoList = new ArrayList<OrderInfo>();
+				for(int i = 0 ; i < sort.length ;i++){
+					OrderInfo oi =  new OrderInfo();
+					oi.setOrderField(sort[i]);
+					oi.setOrderMode(order[i]);
+					oi.setLevel(sort.length -i);//鍊艰秺澶т紭鍏堢骇瓒婂ぇ锛岃�屾帓鍦ㄦ暟缁勭殑鍓嶉潰鐨勪紭鍏堢骇瓒婂ぇ
+					orderInfoList.add(oi);
+				}
+				qt.setOrderInfoList(orderInfoList);
+			}
+		}
+		Condition condition = boService.getConditionByMap(conditionMap);
+		qt.setCondition(condition);
+		try {
+			LinkObject[] bos = platformClientUtil.getQueryService().findLTObjects(qt.getId(), Tool.qtTOXMl(qt).asXML());
+			if (bos != null && bos.length > 0) {
+				for (LinkObject bo : bos) {
+					ClientLinkObject clo = new ClientLinkObject();
+					clo.setLinkObject(bo);
+					
+					rtnOBJs.add(clo);
+				}
+				return rtnOBJs;
+			}
+		} catch (VCIError e) {
+//			logger.error(e.error_code,e);
+//			throw WebUtil.getVciBaseException(e);
+		}
+		return rtnOBJs;
+	}
+
+
+	@Override
+	public List<ClientBusinessObject> queryLinkCbo(String linkType,
+			String toBtmname, int level, Map<String, String> conditionMap)
+			throws VciBaseException {
+		return queryLinkCbo(linkType, toBtmname, level, false, conditionMap);
+	}
+	
+	@Override
+	public List<ClientBusinessObject> queryLinkCbo(String linkType,
+			String toBtmName, int level,boolean isDirection, Map<String, String> conditionMap)
+			throws VciBaseException {
+		List<ClientBusinessObject> rtnOBJs = new ArrayList<ClientBusinessObject>();
+		QueryTemplate qt = new QueryTemplate();
+		qt.setId("queryLO");
+		qt.setType(QTConstants.TYPE_LINK);
+		qt.setBtmType(linkType.toLowerCase());
+		List<String> clauseList = new ArrayList<String>();
+		clauseList.add("*");
+		qt.setClauseList(clauseList);
+		qt.setDirection(isDirection?"opposite":"positive");
+		qt.setLevel(level);
+		conditionMap = WebUtil.getNotNullMap(conditionMap);
+		if(isDirection && WebUtil.isNotNull(toBtmName)){
+			conditionMap.put("f_btmname", toBtmName.toLowerCase().trim());
+		}else if(!isDirection && WebUtil.isNotNull(toBtmName)){
+			conditionMap.put("t_btmname", toBtmName.toLowerCase().trim());
+		}
+		Condition condition = boService.getConditionByMap(conditionMap);
+		qt.setCondition(condition);
+		try {
+			String btmOid = "";
+			if(isDirection && conditionMap.containsKey("t_oid")){
+				btmOid = conditionMap.get("t_oid");
+			}else if(!isDirection && conditionMap.containsKey("f_oid")){
+				btmOid = conditionMap.get("f_oid");
+			}
+			BOAndLO[] bos = platformClientUtil.getQueryService().getBOAndLOS(qt.getId(), Tool.qtTOXMl(qt).asXML(),btmOid);
+			if (bos != null && bos.length > 0) {
+				for (BOAndLO blo : bos) {
+					ClientBusinessObject cbo = new ClientBusinessObject();
+					cbo.setBusinessObject(blo.bo);
+					rtnOBJs.add(cbo);
+				}
+				return rtnOBJs;
+			}
+		} catch (VCIError e) {
+//			logger.error(e.error_code,e);
+//			throw WebUtil.getVciBaseException(e);
+		}
+		return rtnOBJs;
+	}
+
+	@Override
+	public Map<String, ClientBusinessObject> queryLinkedCbo(LinkObject[] lo,
+			boolean isDirection) throws VciBaseException {
+        ClientLinkObject[] clos = new ClientLinkObject[lo.length];
+        for(int i =0 ; i < lo.length; i ++){
+        	ClientLinkObject clo = new ClientLinkObject();
+        	clo.setLinkObject(lo[i]);
+        	clos[i] = clo;
+        }
+        return queryLinkedCbo(clos,isDirection);
+	}
+
+	@Override
+	public Map<String, ClientBusinessObject> queryLinkedCbo(List los,
+			boolean isDirection) throws VciBaseException {
+		return queryLinkedCbo(los,isDirection,new ArrayList<String>());
+	}
+	
+	@Override
+	public Map<String, ClientBusinessObject> queryLinkedCbo(List los,
+			boolean isDirection,List<String> queryColumn) throws VciBaseException {
+		ClientLinkObject[] clos = new ClientLinkObject[los.size()];
+		for(int i = 0 ; i < los.size(); i ++){
+			Object o = los.get(i);
+			ClientLinkObject clo = new ClientLinkObject();
+			if(o instanceof LinkObject){
+				clo.setLinkObject((LinkObject)o);
+			}else if(o instanceof ClientLinkObject){
+				clo = (ClientLinkObject)o;
+			}
+			clos[i] = clo;
+		}
+		return queryLinkedCbo(clos,isDirection,queryColumn);
+	}
+
+	@Override
+	public Map<String, ClientBusinessObject> queryLinkedCbo(
+			ClientLinkObject[] clol, boolean isDirection) throws VciBaseException {
+		return queryLinkedCbo(clol,isDirection,new ArrayList<String>());
+	}
+	/*****
+	 * 
+	 */
+	@Override
+	public Map<String, ClientBusinessObject> queryLinkedCbo(
+			ClientLinkObject[] clol, boolean isDirection,List<String> queryColumn) throws VciBaseException{
+		Map<String/*t_oid鎴栬�協_oid*/,String/*oid*/> linkBoOidMap = new HashMap<String, String>();
+		Map<String,String> btmTypeOidMap = new HashMap<String, String>();
+		for(int i = 0 ; i < clol.length; i ++){
+			ClientLinkObject clo = clol[i];
+			if(clo!=null){
+				String btmType = "";
+				String btmOid = "";
+				if(isDirection){
+					linkBoOidMap.put(clo.getToOid(),clo.getOid());
+					btmType = clo.getToBTMName().toLowerCase().trim();
+					btmOid = clo.getToOid();
+				}else{
+					linkBoOidMap.put(clo.getFromOid(),clo.getOid());
+					btmType = clo.getFromBTMName().toLowerCase().trim();
+					btmOid = clo.getFromOid();
+				}
+				String oids = "";
+				if(btmTypeOidMap.containsKey(btmType)){
+					oids = btmTypeOidMap.get(btmType);
+				}
+				oids += "'" + btmOid + "',";
+				btmTypeOidMap.put(btmType, oids);
+			}
+		}
+		Map<String,ClientBusinessObject> linkedCboMap = new HashMap<String, ClientBusinessObject>();
+		Iterator<String> it = btmTypeOidMap.keySet().iterator();
+		while(it.hasNext()){
+			String btmType = it.next();
+			String oids = btmTypeOidMap.get(btmType);
+			List<String> clauseList = new ArrayList<String>();
+			if(queryColumn!=null && queryColumn.size()>0){
+				for(String s : queryColumn){
+					if(s.toLowerCase().indexOf("${" + btmType + "}")>-1 || s.toLowerCase().indexOf("${")<0){
+						clauseList.add(s);
+					}
+				}
+			}else{
+				clauseList.add("*");
+			}
+			Map<String,String> conditionMap = new HashMap<>();
+			conditionMap.put("oid",oids);
+			List<ClientBusinessObject> allCbo = boService.queryCBO(btmType, conditionMap,new PageHelper(-1),clauseList);
+			if(allCbo.size()>0){
+				for(ClientBusinessObject cbo : allCbo){
+					String linkOid = linkBoOidMap.get(cbo.getOid());
+					linkedCboMap.put(linkOid, cbo);
+				}
+			}
+		}
+		return linkedCboMap;
+	}
+
+	@Override
+	public List<Map> clos2Map(List<ClientLinkObject> clos) throws VciBaseException {
+		List<Map> allMap = new ArrayList<Map>();
+		for(ClientLinkObject clo : clos){
+			allMap.add(clo2Map(clo));
+		}
+		return allMap;
+	}
+
+	@Override
+	public Map clo2Map(ClientLinkObject clo) throws VciBaseException {
+		Map<String,String> map = new HashMap<String, String>();
+		WebUtil.copyValueToMapFromClos(clo, map);
+		return map;
+	}
+
+	@Override
+	public List<ClientLinkObject> map2Clos(List<Map> map) throws VciBaseException {
+		List<ClientLinkObject> allClo = new ArrayList<ClientLinkObject>();
+		for(Map m : map){
+			allClo.add(map2Clo(m));
+		}
+		return allClo;
+	}
+
+	@Override
+	public ClientLinkObject map2Clo(Map map) throws VciBaseException {
+		ClientLinkObject clo = new ClientLinkObject();
+		WebUtil.copyValueToCloFromMap(clo, map);
+		return clo;
+	}
+
+	/**
+	 * 淇濆瓨閾炬帴绫诲瀷瀵硅薄
+	 *
+	 * @param clos 淇濆瓨鐨勪笟鍔$被鍨嬪璞�
+	 * @return
+	 * @throws VciBaseException
+	 */
+	@Override
+	public List<ClientLinkObject> saveClientLinkObjects(List<ClientLinkObject> clos) throws VciBaseException {
+		if(clos == null || clos.size()  == 0){
+			throw new VciBaseException("娌℃湁瑕佷繚瀛樼殑涓氬姟绫诲瀷鏁版嵁");
+		}
+		List<LinkObject> linkObjects = new ArrayList<LinkObject>();
+		for(ClientLinkObject clo : clos){
+			//闇�瑕佺湅鐪嬪熀鏈殑淇℃伅鏄惁鏈�
+			if(StringUtils.isBlank(clo.getLoName())){
+				throw new VciBaseException("閾炬帴绫诲瀷鐨勫悕绉颁负绌�");
+			}
+			if(StringUtils.isBlank(clo.getOid())){
+				clo.setOid((new ObjectUtility()).getNewObjectID36());
+			}
+			if(StringUtils.isBlank(clo.getCreator())){
+				clo.setCreator(WebUtil.getCurrentUserId());
+			}
+			if(StringUtils.isBlank(clo.getCreateTime())){
+				clo.setCreateTime(VciDateUtil.getNowString(VciDateUtil.DateTimeMillFormat));
+			}
+			if(StringUtils.isBlank(clo.getLastModifier())){
+				clo.setLastModifier(clo.getCreator());
+			}
+			if(StringUtils.isBlank(clo.getLastModifyTime())){
+				clo.setLastModifyTime(clo.getCreateTime());
+			}
+			if(StringUtils.isBlank(clo.getTs())){
+				clo.setTs(clo.getCreateTime());
+			}
+			linkObjects.add(clo.getLinkObject());
+		}
+		try {
+			LinkObject[] savedLinkObject = BOFactoryClient.getBOFactoryService().batchCreateLinkObject(linkObjects.toArray(new LinkObject[0]));
+			List<ClientLinkObject> savedClientLinkObject = new ArrayList<ClientLinkObject>();
+			if(savedLinkObject != null && savedLinkObject.length > 0){
+				for(LinkObject linkObject : savedLinkObject){
+					ClientLinkObject clo = new ClientLinkObject();
+					clo.setLinkObject(linkObject);
+					savedClientLinkObject.add(clo);
+				}
+			}
+			return savedClientLinkObject;
+		} catch (VCIError vciError) {
+			throw WebUtil.getVciBaseException(vciError);
+		}
+	}
+
+	/**
+	 * 鍒涘缓杩炴帴绫诲瀷
+	 *
+	 * @param loName
+	 * @return
+	 * @throws VciBaseException
+	 */
+	@Override
+	public ClientLinkObject createClientLinkObject(String loName) throws VciBaseException {
+		WebUtil.alertNotNull(loName,"閾炬帴");
+		try {
+			return loOperation.createLinkObject(loName,WebUtil.getCurrentUserId());
+		} catch (VCIError vciError) {
+			throw WebUtil.getVciBaseException(vciError);
+		}
+	}
+
+	/**
+	 * 鎷疯礉閾炬帴绫诲瀷
+	 *
+	 * @param clo 閾炬帴绫诲瀷瀵硅薄
+	 * @return
+	 * @throws VciBaseException
+	 */
+	@Override
+	public ClientLinkObject cloneClientLinkObject(ClientLinkObject clo) throws VciBaseException {
+		ClientLinkObject newClo = new ClientLinkObject();
+		String JSONString = JSONObject.toJSONStringWithDateFormat(clo.getLinkObject(),VciDateUtil.DateTimeMillFormat,SerializerFeature.WriteDateUseDateFormat);
+		LinkObject lo = JSONObject.parseObject(JSONString,LinkObject.class);
+		if(lo.newAttrValList == null) {
+			lo.newAttrValList = new AttributeValue[0];
+		}
+		if(lo.hisAttrValList == null) {
+			lo.hisAttrValList =  new AttributeValue[0];
+		}
+		newClo.setLinkObject(lo);
+		newClo.setOid((new ObjectUtility()).getNewObjectID36());
+		newClo.setCreator(WebUtil.getCurrentUserId());
+		newClo.setCreateTime(VciDateUtil.getNowString(VciDateUtil.DateTimeMillFormat));
+		newClo.setLastModifier(newClo.getCreator());
+		newClo.setLastModifyTime(newClo.getCreateTime());
+		newClo.setTs(newClo.getCreateTime());
+		return  newClo;
+	}
+
+	/**
+	 * 鍒犻櫎閾炬帴绫诲瀷
+	 *
+	 * @param clos 閾炬帴绫诲瀷鐨勫唴瀹�
+	 * @throws VciBaseException
+	 */
+	@Override
+	public void deleteClientLinkObjects(List<ClientLinkObject> clos) throws VciBaseException {
+		if(clos!=null){
+			try {
+				loOperation.batchdDeleteLinkObject(clos.toArray(new ClientLinkObject[0]));
+			} catch (VCIError vciError) {
+				throw  WebUtil.getVciBaseException(vciError);
+			}
+		}
+	}
+
+	/**
+	 * @param clos
+	 * @return
+	 * @throws VciBaseException
+	 */
+	@Override
+	public void updateClientLinkObject(List<ClientLinkObject> clos) throws VciBaseException {
+		if(clos!=null){
+			try {
+				loOperation.batchUpdateLinkObject(clos.toArray(new ClientLinkObject[0]));
+			} catch (VCIError vciError) {
+				throw  WebUtil.getVciBaseException(vciError);
+			}
+		}
+	}
+
+	/**
+	 * 鏌ヨ閾炬帴绫诲瀷鍜屼笟鍔$被鍨�
+	 *
+	 * @param linkTypeDataQuery 鏌ヨ瀵硅薄
+	 * @return 閾炬帴绫诲瀷鍜屽叧鑱旂殑to绔�
+	 */
+	@Override
+	public List<BOAndLO> queryCLOAndBOBySchema(UILinkTypeDataQuery linkTypeDataQuery) {
+		VciBaseUtil.alertNotNull(linkTypeDataQuery,"閾炬帴绫诲瀷鏌ヨ瀵硅薄",linkTypeDataQuery.getQueryTemplateName(),"鏌ヨ妯℃澘鐨勫悕绉�");
+		QueryTemplate qt =boService.getQtByName(linkTypeDataQuery.getQueryTemplateName(),linkTypeDataQuery.getReplaceMap());
+		return queryCLOAndBOByQueryTemplate(qt,linkTypeDataQuery);
+	}
+
+	/**
+	 * 浣跨敤鏌ヨ妯℃澘鏌ヨ
+	 * @param qt 鏌ヨ妯℃澘
+	 * @param linkTypeDataQuery 閾炬帴绫诲瀷鐨勬煡璇㈠璞�
+	 * @return 閾炬帴绫诲瀷鍜屼笟鍔$被鍨�
+	 */
+	private List<BOAndLO> queryCLOAndBOByQueryTemplate(QueryTemplate qt,UILinkTypeDataQuery linkTypeDataQuery){
+		if(StringUtils.isNotBlank(linkTypeDataQuery.getToBtmType()) && StringUtils.isBlank(qt.getBtmType())) {
+			qt.setBtmType(linkTypeDataQuery.getToBtmType());
+		}
+		if(linkTypeDataQuery.getClauseList()!=null){
+			qt.setClauseList(linkTypeDataQuery.getClauseList().stream().collect(Collectors.toList()));
+		}else {
+			List<String> clauseList = new ArrayList<String>();
+			clauseList.add("*");
+			qt.setClauseList(clauseList);
+		}
+		if(!"opposite".equals(qt.getDirection())) {
+			qt.setDirection(linkTypeDataQuery.isDirection() ? "opposite" : "positive");
+		}
+		if(linkTypeDataQuery.getLevel()>0){
+			qt.setLevel(linkTypeDataQuery.getLevel());
+		}else{
+			if(linkTypeDataQuery.isQueryAllLevel()){
+				qt.setLevel(-1);
+			}else{
+				qt.setLevel(1);
+			}
+		}
+
+		Map<String,String> conditionMap = WebUtil.getNotNullMap(linkTypeDataQuery.getConditionMap());
+		if(StringUtils.isBlank(linkTypeDataQuery.getQueryTemplateName())) {
+			if (linkTypeDataQuery.isDirection() && StringUtils.isNotBlank(linkTypeDataQuery.getToBtmType())) {
+				if (linkTypeDataQuery.getToBtmType().contains(",")) {
+					conditionMap.put("f_btwname", QueryOptionConstant.IN + "(" + VciBaseUtil.str2List(linkTypeDataQuery.getToBtmType()) + ")");
+				} else {
+					conditionMap.put("f_btwname", linkTypeDataQuery.getToBtmType().trim());
+				}
+			} else if (!linkTypeDataQuery.isDirection() && StringUtils.isNotBlank(linkTypeDataQuery.getToBtmType())) {
+				if (linkTypeDataQuery.getToBtmType().contains(",")) {
+					conditionMap.put("t_btwname", QueryOptionConstant.IN + "(" + VciBaseUtil.str2List(linkTypeDataQuery.getToBtmType()) + ")");
+				} else {
+					conditionMap.put("t_btwname", linkTypeDataQuery.getToBtmType().trim());
+				}
+			}
+		}
+		Condition condition = boService.getConditionByMap(conditionMap);
+		if(qt.getCondition() !=null) {
+			qt.setCondition(Tool.mergeCondition(qt.getCondition(), condition, Connector.AND));
+		}else {
+			qt.setCondition(condition);
+		}
+		boService.setPageAndOrderToQT(qt,linkTypeDataQuery.getPageHelper());
+		try {
+			BOAndLO[] bos = platformClientUtil.getQueryService().getBOAndLOS(qt.getId(), Tool.qtTOXMl(qt).asXML(),linkTypeDataQuery.getParentOid()==null?"":linkTypeDataQuery.getParentOid());
+			return Arrays.stream(bos).collect(Collectors.toList());
+		} catch (VCIError e) {
+//			logger.error(e.error_code,e);
+			throw WebUtil.getVciBaseException(e);
+		}
+	}
+
+	/**
+	 * 浣跨敤閾炬帴绫诲瀷鐨勫悕绉版煡璇� 閾炬帴绫诲瀷鐨則o绔殑涓氬姟绫诲瀷
+	 * @param linkTypeDataQuery 鏌ヨ鐨勫璞�
+	 * @return 閾炬帴瀵硅薄鍜宼o绔笟鍔″璞�
+	 */
+	@Override
+	public List<BOAndLO> queryCLOAndBoByLinkType(UILinkTypeDataQuery linkTypeDataQuery){
+		VciBaseUtil.alertNotNull(linkTypeDataQuery,"閾炬帴绫诲瀷鏌ヨ瀵硅薄",linkTypeDataQuery.getLinkType(),"閾炬帴绫诲瀷鐨勫悕绉�");
+		QueryTemplate qt = null;
+		if(StringUtils.isBlank(linkTypeDataQuery.getQueryTemplateName())){
+			qt = new QueryTemplate();
+			//鍩虹璁剧疆
+			qt.setId("queryLinkAndBo");
+			qt.setType(QTConstants.TYPE_LINK);
+			qt.setLinkType(linkTypeDataQuery.getLinkType());
+		}else{
+			qt = boService.getQtByName(linkTypeDataQuery.getQueryTemplateName(),linkTypeDataQuery.getReplaceMap());
+		}
+
+		return queryCLOAndBOByQueryTemplate(qt,linkTypeDataQuery);
+	}
+
+	private boolean isEnumAttr(String s){
+		return s.indexOf("_")>-1
+				&& !"lcStatus_text".toLowerCase().equalsIgnoreCase(s.toLowerCase()) && !s.toLowerCase().startsWith("t_") && !s.toLowerCase().startsWith("f_");
+	}
+
+	/**
+	 * 鏌ヨ鍒楄〃
+	 *
+	 * @param linkTypeDataQuery 鏌ヨ鐨勫璞�
+	 * @return 鍒楄〃鐨勬暟鎹�
+	 */
+	@Override
+	public DataGrid queryGridByScheme(UILinkTypeDataQuery linkTypeDataQuery) {
+		VciBaseUtil.alertNotNull(linkTypeDataQuery,"閾炬帴绫诲瀷鏌ヨ瀵硅薄");
+		QueryTemplate qt =null;
+		if(StringUtils.isBlank(linkTypeDataQuery.getQueryTemplateName())){
+			qt = new QueryTemplate();
+			//鍩虹璁剧疆
+			qt.setId("queryLinkAndBos");
+			qt.setType(QTConstants.TYPE_LINK);
+			qt.setLinkType(linkTypeDataQuery.getLinkType());
+		}else{
+			qt = boService.getQtByName(linkTypeDataQuery.getQueryTemplateName(),linkTypeDataQuery.getReplaceMap());
+			linkTypeDataQuery.setLinkType(qt.getLinkType());
+		}
+		if(!"opposite".equals(qt.getDirection())) {
+			qt.setDirection(linkTypeDataQuery.isDirection() ? "opposite" : "positive");
+		}
+		if(linkTypeDataQuery.getLevel()>0){
+			qt.setLevel(linkTypeDataQuery.getLevel());
+		}else{
+			if(linkTypeDataQuery.isQueryAllLevel()){
+				qt.setLevel(-1);
+			}else{
+				qt.setLevel(1);
+			}
+		}
+		List<String> referFields = new ArrayList<>();
+		List<String> enumFields = new ArrayList<>();
+		if(!CollectionUtils.isEmpty(linkTypeDataQuery.getClauseList())){
+			referFields = linkTypeDataQuery.getClauseList().stream().filter(s->s.toLowerCase().startsWith("f_oid.") || s.toLowerCase().startsWith("t_oid.")).collect(Collectors.toList());
+			enumFields = linkTypeDataQuery.getClauseList().stream().filter(s->isEnumAttr(s)).collect(Collectors.toList());
+			List<String> finalReferFields = referFields;
+			List<String> finalEnumFields1 = enumFields;
+			qt.setClauseList(linkTypeDataQuery.getClauseList().stream().filter(s->!finalReferFields.contains(s) && !finalEnumFields1.contains(s)).collect(Collectors.toList()));
+		}else {
+			List<String> clauseList = new ArrayList<String>();
+			clauseList.add("*");
+			qt.setClauseList(clauseList);
+		}
+		if(!CollectionUtils.isEmpty(qt.getClauseList())){
+			List<String> clauseUpList = new ArrayList<>();
+			qt.getClauseList().stream().forEach(field->{
+				clauseUpList.add(field.toUpperCase());
+			});
+			qt.setClauseList(clauseUpList);
+		}
+
+		Map<String,String> conditionMap = WebUtil.getNotNullMap(linkTypeDataQuery.getConditionMap());
+		if(linkTypeDataQuery.isDirection() && StringUtils.isNotBlank(linkTypeDataQuery.getToBtmType())){
+			if(linkTypeDataQuery.getToBtmType().contains(",")){
+				conditionMap.put("f_btwname", QueryOptionConstant.IN + "(" + VciBaseUtil.str2List(linkTypeDataQuery.getToBtmType()) + ")");
+			}else{
+				conditionMap.put("f_btwname", linkTypeDataQuery.getToBtmType().trim());
+			}
+		}else if(!linkTypeDataQuery.isDirection() && StringUtils.isNotBlank(linkTypeDataQuery.getToBtmType())){
+			if(linkTypeDataQuery.getToBtmType().contains(",")){
+				conditionMap.put("t_btwname", QueryOptionConstant.IN + "(" + VciBaseUtil.str2List(linkTypeDataQuery.getToBtmType()) + ")");
+			}else{
+				conditionMap.put("t_btwname", linkTypeDataQuery.getToBtmType().trim());
+			}
+		}
+		Condition condition = boService.getConditionByMap(conditionMap);
+		if(qt.getCondition() !=null) {
+			qt.setCondition(Tool.mergeCondition(qt.getCondition(), condition, Connector.AND));
+		}else {
+			qt.setCondition(condition);
+		}
+		boService.setPageAndOrderToQT(qt,linkTypeDataQuery.getPageHelper());
+		DataGrid dataGrid = new DataGrid();
+		Map<String,List<String>> fromBtmOidsMap = new HashMap<>();
+		Map<String,List<String>> toBtmOidsMap = new HashMap<>();
+		try {
+			IntHolder totalHolder = new IntHolder();
+			LinkObject[] linkObjects = platformClientUtil.getQueryService().findLTObjectsV2(qt.getId(), Tool.qtTOXMl(qt).asXML(),totalHolder);
+
+			List<Map<String,String>> data = new ArrayList<>();
+			List<String> finalEnumFields = enumFields;
+			final Integer[] total = {totalHolder.value};
+			Arrays.stream(linkObjects).forEach(lo->{
+				ClientLinkObject clo = new ClientLinkObject();
+				clo.setLinkObject(lo);
+				Map<String, String> map = new HashMap<>();
+				boService.queryEnumText(null,clo, finalEnumFields);
+				WebUtil.copyValueToMapFromClos(clo,map);
+				List<String> fromOids = fromBtmOidsMap.getOrDefault(lo.fromBTMName, new ArrayList<>());
+				fromOids.add(lo.fromOid);
+				fromBtmOidsMap.put(lo.fromBTMName,fromOids);
+
+				List<String> toOids = toBtmOidsMap.getOrDefault(lo.toBTMName, new ArrayList<>());
+				toOids.add(lo.toOid);
+				toBtmOidsMap.put(lo.toBTMName,toOids);
+				data.add(map);
+				if(total[0] == 0){
+					total[0] = VciBaseUtil.getInt(map.getOrDefault(QTConstants.COUNT_OVER_ALIAS.toLowerCase(),"0"));
+				}
+			});
+			dataGrid.setData(data);
+			dataGrid.setTotal(total[0]);
+		} catch (VCIError e) {
+//			logger.error(e.error_code,e);
+			throw WebUtil.getVciBaseException(e);
+		}
+		if(!CollectionUtils.isEmpty(referFields) && dataGrid.getTotal()>0){
+			List<String> fromFields = referFields.stream().filter(s -> s.toLowerCase().startsWith("f_oid.")).collect(Collectors.toList());
+			List<String> toFields = referFields.stream().filter(s -> s.toLowerCase().startsWith("t_oid.")).collect(Collectors.toList());
+			if(!CollectionUtils.isEmpty(fromBtmOidsMap) && !CollectionUtils.isEmpty(fromFields)){
+				List<String> fromFieldsFix = new ArrayList<>();
+				fromFields.stream().forEach(field->{
+					fromFieldsFix.add(field.substring("f_oid.".length()));
+				});
+				fromBtmOidsMap.forEach((btm,oids)->{
+					//鍒嗛〉涓嶈瓒呰繃1000
+					Map<String,String> boConditionMap =new HashMap<>();
+					boConditionMap.put("oid",QueryOptionConstant.IN + "(" + WebUtil.toInSql(oids.toArray(new String[0])) + ")");
+					List<ClientBusinessObject> cbos = boService.queryCBO(btm, boConditionMap, null, fromFieldsFix);
+					if(!CollectionUtils.isEmpty(cbos)){
+						cbos.stream().forEach(cbo->{
+							dataGrid.getData().forEach(data->{
+								Map<String, String> map = (Map<String, String>) data;
+								if(map.getOrDefault("f_oid","").equals(cbo.getOid())){
+									fromFieldsFix.stream().forEach(fromField->{
+										map.put("f_oid." + fromField,cbo.getAttributeValue(fromField));
+									});
+								}
+							});
+						});
+					}
+				});
+			}
+			if(!CollectionUtils.isEmpty(toBtmOidsMap) && !CollectionUtils.isEmpty(toFields)){
+				List<String> toFieldsFix = new ArrayList<>();
+				toFields.stream().forEach(field->{
+					toFieldsFix.add(field.substring("t_oid.".length()));
+				});
+				toBtmOidsMap.forEach((btm,oids)->{
+					//鍒嗛〉涓嶈瓒呰繃1000
+					Map<String,String> boConditionMap =new HashMap<>();
+					boConditionMap.put("oid",QueryOptionConstant.IN + "(" + WebUtil.toInSql(oids.toArray(new String[0])) + ")");
+					List<ClientBusinessObject> cbos = boService.queryCBO(btm, boConditionMap, null, toFieldsFix);
+					if(!CollectionUtils.isEmpty(cbos)){
+						cbos.stream().forEach(cbo->{
+							dataGrid.getData().forEach(data->{
+								Map<String, String> map = (Map<String, String>) data;
+								if(map.getOrDefault("t_oid","").equals(cbo.getOid())){
+									toFieldsFix.stream().forEach(toField->{
+										map.put("t_oid." + toField,cbo.getAttributeValue(toField));
+									});
+								}
+							});
+						});
+					}
+				});
+			}
+		}
+		return dataGrid;
+	}
+
+	/**
+	 * 閾炬帴绫诲瀷鏌ヨ鏁伴噺
+	 *
+	 * @param linkType     閾炬帴绫诲瀷
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @return 涓暟
+	 */
+	@Override
+	public Integer queryCount(String linkType, Map<String, String> conditionMap) {
+		return queryCount(linkType,conditionMap,false,1);
+	}
+
+	/**
+	 * 閾炬帴绫诲瀷鏌ヨ鏁伴噺
+	 *
+	 * @param linkType     閾炬帴绫诲瀷
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @param isDirection 鏄惁鍙嶅悜
+	 * @param level 灞傜骇
+	 * @return 涓暟
+	 */
+	@Override
+	public Integer queryCount(String linkType,Map<String,String> conditionMap,boolean isDirection,Integer level){
+		QueryTemplate qt = new QueryTemplate();
+		qt.setId("queryLO");
+		qt.setType(QTConstants.TYPE_LINK);
+		qt.setLinkType(linkType.toLowerCase());
+		List<String> clauseList = new ArrayList<String>();
+		clauseList.add("*");
+		qt.setClauseList(clauseList);
+		qt.setDirection(isDirection?"opposite":"positive");
+		qt.setLevel(level);
+		conditionMap = WebUtil.getNotNullMap(conditionMap);
+		qt.setRightFlag(webProperties.isDataRight());
+		//璁剧疆鍒嗛〉淇℃伅鍜屾帓搴�
+		Condition condition = boService.getConditionByMap(conditionMap);
+		qt.setCondition(condition);
+		try {
+			return  platformClientUtil.getQueryService().findTotalCount(qt.getId(), Tool.qtTOXMl(qt).asXML());
+		} catch (VCIError vciError) {
+			throw WebUtil.getVciBaseException(vciError);
+		}
+	}
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WebLogServiceImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WebLogServiceImpl.java
new file mode 100644
index 0000000..68bc63b
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WebLogServiceImpl.java
@@ -0,0 +1,119 @@
+package com.vci.web.service.impl;
+
+import com.vci.corba.common.VCIError;
+import com.vci.corba.common.data.VCIInvocationInfo;
+import com.vci.corba.framework.data.UserEntityInfo;
+import com.vci.rmip.ClientSession;
+import com.vci.starter.web.pagemodel.SessionInfo;
+import com.vci.starter.web.util.WebThreadLocalUtil;
+import com.vci.web.bo.VciLogObjectBO;
+import com.vci.web.service.WebLogServiceI;
+import com.vci.web.util.PlatformClientUtil;
+import com.vci.web.util.WebUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * 鏃ュ織鏈嶅姟
+ * @author weidy
+ * 
+ */
+@Service
+public class WebLogServiceImpl implements WebLogServiceI {
+	
+	/**
+	 * 鏃ュ織
+	 */
+	private Logger logger = LoggerFactory.getLogger(getClass());
+	
+	private LogThread logThread = null;
+
+	/**
+	 * 骞冲彴瀹㈡埛绔唬鐞嗙被
+	 */
+	@Autowired
+	private PlatformClientUtil platformClientUtil;
+
+	@Override
+	public void addOperateLog(VciLogObjectBO logObject) {
+		//VCIInvocationInfo vcii = WebThreadLocalUtil.getCurrentUserInvocationInfoInThread().get();
+		SessionInfo si = WebThreadLocalUtil.getCurrentUserSessionInfoInThread().get();
+		if(si!=null){
+			logObject.setUserId(si.getUserId());
+			logObject.setUserName(si.getUserName());
+			logObject.setUserOid(si.getUserOid());
+			logObject.setIp(si.getIp());
+			initThread(logObject,si);
+		}else{
+			//璇存槑杩樻病鐧诲綍锛屼笉璁板綍
+		}
+	}
+	
+	private void initThread(VciLogObjectBO logObject,SessionInfo si){
+		if(logThread == null){
+			logThread = new LogThread(platformClientUtil);
+			logThread.isOnService=true;
+			logThread.add(logObject,si);
+			logThread.start();
+		}else{
+			logThread.add(logObject,si);
+		}
+	}
+}
+
+class LogThread extends Thread{
+	public boolean isOnService = false;
+	private PlatformClientUtil platformClientUtil = null;
+	public LogThread(PlatformClientUtil platformClientUtil){
+		this.platformClientUtil = platformClientUtil;
+	}
+
+	public List<VciLogObjectBO> allLogs = new ArrayList<VciLogObjectBO>();
+
+	public Map<String,SessionInfo> log_userMap = new ConcurrentHashMap<String, SessionInfo>();
+
+	
+	public void add(VciLogObjectBO log,SessionInfo si){
+		log.setOid(WebUtil.getPk());
+		allLogs.add(log);
+		log_userMap.put(log.getOid(),si);
+	}
+	@Override
+	public void run() {
+		while(isOnService){
+			while(allLogs.size() >0){
+				VciLogObjectBO log = allLogs.get(0);
+				SessionInfo si = log_userMap.get(log.getOid());
+				UserEntityInfo ue = new UserEntityInfo();
+				ue.ip = log.getIp();
+				ue.modules = log.getModelName();
+				ue.userName = log.getUserId();
+				WebThreadLocalUtil.getCurrentUserSessionInfoInThread().set(si);
+				if(log.isDebug()){
+					log.setDescription(log.getDescription() + "," + log.getController() + "/" + log.getMethod());
+				}
+//				try {
+//					platformClientUtil.getLogonFactoryService().getFrameworkService().savelogGeneralOperation("鎿嶄綔瀹屾垚",log.getDescription(), ue, "00000000000000000000000000000000000",log.getOperateName());
+//				} catch (VCIError e) {
+//					System.out.println(e.error_code);
+//				}
+				allLogs.remove(log);
+			}
+			try {
+				Thread.sleep(1000);
+			} catch (InterruptedException e) {
+				e.printStackTrace();
+			}
+		}
+		System.out.println("鍏抽棴绾跨▼浜�");
+	}
+}
+
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WebProcessCommandServiceImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WebProcessCommandServiceImpl.java
new file mode 100644
index 0000000..37866ae
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WebProcessCommandServiceImpl.java
@@ -0,0 +1,792 @@
+package com.vci.web.service.impl;
+
+import com.vci.corba.common.VCIError;
+import com.vci.corba.framework.data.UserEntityInfo;
+import com.vci.corba.workflow.data.FlowInstanceInfo;
+import com.vci.corba.workflow.data.MapTransfersInfo;
+import com.vci.file.dto.VciFileObjectDTO;
+import com.vci.rmip.workflow.server.template.TasksAssigned;
+import com.vci.starter.web.constant.QueryOptionConstant;
+import com.vci.starter.web.enumpck.DataSecretEnum;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.starter.web.pagemodel.PageHelper;
+import com.vci.starter.web.pagemodel.SessionInfo;
+import com.vci.starter.web.util.LangBaseUtil;
+import com.vci.starter.web.util.VciDateUtil;
+import com.vci.web.annotation.FlowNotifyAfter;
+import com.vci.web.annotation.FlowNotifyBefore;
+import com.vci.web.annotation.FlowNotifyWeb;
+import com.vci.web.bo.FlowNoticeInfo;
+import com.vci.web.constant.WFVariablesKeyConstant;
+import com.vci.web.dao.WebProcessDaoI;
+import com.vci.web.dto.ProcessStartConfigDTO;
+import com.vci.web.pageModel.*;
+import com.vci.web.properties.WebProperties;
+import com.vci.web.service.*;
+import com.vci.web.util.BusAnnotationUtil;
+import com.vci.web.util.PlatformClientUtil;
+import com.vci.web.util.WebUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.multipart.MultipartFile;
+import plm.bs.bom.clientobject.ClientBusinessObject;
+import plm.bs.bom.clientobject.ClientLinkObject;
+
+import java.util.*;
+import java.util.Map.Entry;
+
+/**
+ * 娴佺▼鎵ц鏈嶅姟
+ *
+ * @author weidy
+ */
+@Service
+public class WebProcessCommandServiceImpl implements WebProcessCommandServiceI {
+
+    private Logger logger = LoggerFactory.getLogger(getClass());
+
+    private final String reject = "涓嶅悓鎰�";
+
+    @Autowired
+    private WebProcessDefineServiceI processDefineService;
+
+    @Autowired
+    private WebLoServiceI loService;
+
+    @Autowired
+    private WebBoServiceI boService;
+
+    @Autowired
+    private WebProcessDaoI processDao;
+
+    @Autowired
+    private OsLifeCycleServiceI lifeCycleService;
+
+
+    @Autowired
+    private WebProperties webProperties;
+
+    /**
+     * 鏂囦欢涓婁紶鏈嶅姟
+     */
+    @Autowired
+    private VciFileUploadServiceI fileService;
+
+    /**
+     * 澶氳瑷�鐨勫墠缂�
+     */
+    private final String msgCodePrefix = "com.vci.web.flow.";
+
+    /**
+     * 骞冲彴鐨勫鎴风
+     */
+    @Autowired
+    private PlatformClientUtil platformClientUtil;
+
+    @Override
+    public boolean deploy(String name, String type, String key,
+                          String xmlContext) throws VciBaseException {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    @Override
+    public void startProcess(ProcessStartConfigDTO config,
+                             Map<String, List<ProcessUserVO>> processNodeUsers,
+                             Map<String, String> variablesInfo) throws VciBaseException {
+        //1. 鏍¢獙娴佺▼鏄惁瀛樺湪
+        //2. 鏁寸悊涓氬姟鏁版嵁
+        //3. 鏁寸悊姣忎釜鑺傜偣鐨勭敤鎴�
+        //4. 鏁寸悊鍙橀噺锛屽寘鎷皢鏄剧ず琛ㄦ牸鐨勬柟寮忔坊鍔犲埌鍙橀噺鐨勬柟娉�
+        //5. 鍙戣捣娴佺▼
+        WebUtil.alertNotNull(config, "鍙戣捣娴佺▼閰嶇疆淇℃伅");
+        WebUtil.alertNotNull(config.getDeployId(), "娴佺▼閮ㄧ讲涓婚敭", config.getBtmType(), "鏁版嵁鎵�灞炰笟鍔$被鍨�", config.getOids(), "鏁版嵁鎵�灞炰富閿�", config.getTitle(), "娴佺▼鍚嶇О");
+        if (config.getTitle().length() > 127) {
+            config.setTitle(config.getTitle().substring(0, 127));
+        }
+        //SessionInfo si = WebUtil.getSessionInfo(request);
+        //weidy淇敼鑾峰彇褰撳墠鐢ㄦ埛鐨勬柟娉�
+        SessionInfo si = WebUtil.getCurrentUserSessionInfo();
+
+        //鏍¢獙娴佺▼鐨勪俊鎭紝鍜岃缃瘡涓换鍔$殑浜哄憳淇℃伅
+        ProcessTemplateVO template = processDao.getTemplateByDeployId(config.getDeployId().trim());
+        List<ProcessNodeVO> allNodes = processDao.getAllProcessNode(template.getOid());
+        String firstNodeName = processDao.getFirstNodeName(config.getDeployId().trim());
+        WebUtil.alertNotNull(firstNodeName, "娌℃湁鑾峰彇娴佺▼鐨勭涓�涓换鍔¤妭鐐�");
+        String[] firstNodeUserNames = null;
+        if (processNodeUsers == null || !processNodeUsers.containsKey(firstNodeName)) {
+            firstNodeUserNames = new String[]{"user:" + si.getUserId()};
+        } else {
+            List<ProcessUserVO> firstNodeUsers = processNodeUsers.get(firstNodeName);
+            firstNodeUserNames = getProcessUserInfo(firstNodeUsers);
+        }
+        //鍏ㄩ儴鐨勪换鍔�
+        String[] allTaskName = new String[allNodes.size()];
+        //浠诲姟鐨勫鐞嗕汉
+        String[][] allTaskNameUsers = new String[allNodes.size()][];
+        for (int i = 0; i < allNodes.size(); i++) {
+            ProcessNodeVO node = allNodes.get(i);
+            if (node.getName().equals(firstNodeName)) {
+                allTaskNameUsers[i] = firstNodeUserNames;
+            } else {
+                String[] thisTaskUser = new String[]{""};
+                if (processNodeUsers != null && processNodeUsers.containsKey(node.getName())) {
+                    String[] userInfos = getProcessUserInfo(processNodeUsers.get(node.getName()));
+                    if (userInfos != null && userInfos.length > 0) {
+                        thisTaskUser = userInfos;
+                    }
+                }
+                allTaskNameUsers[i] = thisTaskUser;
+            }
+            allTaskName[i] = node.getName();
+        }
+
+        Map<String, String> conditionMap = WebUtil.getOidQuery(config.getOids());
+        conditionMap.put(WebBoServiceI.QUERY_FILTER_SECRET, "false");
+        conditionMap.put(WebBoServiceI.QUERY_FILTER_DATARIGHT, "false");
+        List<ClientBusinessObject> allCbo = boService.queryCBO(config.getBtmType().toLowerCase().trim(), conditionMap);
+        if (allCbo == null || allCbo.size() == 0) {
+            throw new VciBaseException(msgCodePrefix + "dataNotNull", new String[]{});
+        }
+
+        //鏌ヨ鏁版嵁鏄惁宸茬粡鍙戣捣浜嗘祦绋�
+        //鏌ヨinput杩炴帴閲屾槸涓嶆槸鏈夋祦绋嬪疄渚嬶紝骞朵笖娴佺▼瀹炰緥涓嶇瓑浜庣粓姝�
+        conditionMap.put("oid", " in (select f_oid from platformlt_" + processDao.getTaskDataLink() + " where oid " + conditionMap.get("oid").replace("\\IN", " in ") + ")");
+        List<ClientBusinessObject> workInstanceCbos = boService.queryCBO(processDao.getWorkIntanceBtmType(), conditionMap);
+        if (workInstanceCbos != null && workInstanceCbos.size() > 0) {
+            for (ClientBusinessObject workInstance : workInstanceCbos) {
+                if (!workInstance.getLcStatus().equalsIgnoreCase("Obsoleted")) {
+                    throw new VciBaseException(msgCodePrefix + "dataSubmitedToProcess", new String[]{workInstance.getName(), workInstance.getCreator()});
+                }
+            }
+        }
+
+        String[] objectPropertyKeys = new String[]{"Oid", "RevisionOid", "NameOid", "BTMName"};//涓氬姟鏁版嵁鐨勪俊鎭�
+        String[][] objectPropertyValues = new String[allCbo.size()][4];
+        String[] objIds = new String[allCbo.size()];//涓氬姟鏁版嵁鐨勭粍浠�
+        for (int i = 0; i < allCbo.size(); i++) {
+            ClientBusinessObject cbo = allCbo.get(i);
+            String[] values = new String[4];
+            values[0] = cbo.getOid();
+            values[1] = cbo.getRevisionid();
+            values[2] = cbo.getNameoid();
+            values[3] = cbo.getBtmName();
+            objectPropertyValues[i] = values;
+            objIds[i] = cbo.getOid();
+        }
+
+        FlowInstanceInfo flowInstanceInfo = new FlowInstanceInfo();
+        flowInstanceInfo.creator = si.getUserId();
+        flowInstanceInfo.templatePuid = template.getOid();
+        flowInstanceInfo.tableName = config.getBtmType().toLowerCase().trim();
+        flowInstanceInfo.applicant = si.getUserId();
+        flowInstanceInfo.desc = config.getDescription() == null ? "" : config.getDescription();
+        flowInstanceInfo.processType = config.getBtmType().toLowerCase().trim();
+        flowInstanceInfo.templateName = template.getName();
+        flowInstanceInfo.clsfOid = "";
+        flowInstanceInfo.partList = "";
+        flowInstanceInfo.processName = config.getTitle();
+        MapTransfersInfo[] allVariables = swapVariable(config, variablesInfo);
+
+        long currentTime =0L;
+        try{
+//            currentTime = platformClientUtil.getLogonFactoryService().getFrameworkService().getSystemTime();
+        }catch (Throwable e){
+           throw  new VciBaseException(LangBaseUtil.getErrorMsg(e),new String[0],e);
+        }
+        FlowNoticeInfo noticeInfo = new FlowNoticeInfo();
+        noticeInfo.setServerTime(currentTime);
+        noticeInfo.setStartConfigDTO(config);
+        noticeInfo.setVariablesInfo(variablesInfo);
+        noticeInfo.setProcessTemplateVO(template);
+        BusAnnotationUtil.callForAnnotation(FlowNotifyWeb.class, FlowNotifyBefore.class,noticeInfo);
+        String processInstanceId = "";
+//        try {
+//            if (config.isAutoSubmitFirst()) {
+//                processInstanceId =  processDao.getWorkService().startProcessAndExecuteFirstNode(template.getOid(),
+//                        flowInstanceInfo,
+//                        objIds,
+//                        getUserEntityInfo(),
+//                        firstNodeUserNames,
+//                        "",
+//                        allTaskName,
+//                        allTaskNameUsers,
+//                        allVariables,
+//                        objectPropertyKeys,
+//                        objectPropertyValues);
+//            }else{
+//                processInstanceId = processDao.getWorkService().startPocessByPLM_v1(
+//                        /**
+//                         * String processDefinitionKey, 娴佺▼妯℃澘涓婚敭
+//                         * FlowInstanceInfo flowInstanceInfo, 娴佺▼瀹炰緥
+//                         * String[] objId, 鏁版嵁瀵硅薄id
+//                         * UserEntityInfo userEntityInfo, 鐢ㄦ埛Info
+//                         * String[] userName, 鐢ㄦ埛鍚�
+//                         * String outcome, 鎸囧悜
+//                         * String[] tasknames, 涓氬姟鍚嶇О
+//                         * String[][] taskUserNames, 鎵�灞炵敤鎴峰悕
+//                         * MapTransfersInfo[] mapTransfersInfos,  绉讳氦Info
+//                         * String[] objectProperty, 涓氬姟灞炴��
+//                         * String[][] objectPropertyValues 涓氬姟灞炴�у��
+//                         */
+//                        template.getOid(),
+//                        flowInstanceInfo,
+//                        objIds,
+//                        getUserEntityInfo(),
+//                        firstNodeUserNames,
+//                        "",
+//                        allTaskName,
+//                        allTaskNameUsers,
+//                        allVariables,
+//                        objectPropertyKeys,
+//                        objectPropertyValues
+//                );
+//            }
+//        } catch (VCIError e) {
+//            throw WebUtil.getVciBaseException(e);
+//        }
+        if (StringUtils.isNotBlank(config.getStartStatus())) {
+            lifeCycleService.transCboStatus(allCbo, config.getStartStatus());
+        }
+        callAfter(processInstanceId,null,null,currentTime);
+    }
+
+    /**
+     * 鎵ц娴佺▼涔嬪墠璋冪敤
+     * @param preWorkitemList 浠诲姟鐨勪俊鎭�
+     */
+    private void callBefore(List<Map> preWorkitemList,String outcome,String note,long currentTime){
+        if(currentTime == 0L) {
+            try {
+//                currentTime = platformClientUtil.getLogonFactoryService().getFrameworkService().getSystemTime();
+            } catch (Throwable e) {
+                throw new VciBaseException(LangBaseUtil.getErrorMsg(e), new String[0], e);
+            }
+        }
+        FlowNoticeInfo noticeInfo = new FlowNoticeInfo();
+        noticeInfo.setFinishItemList(preWorkitemList);
+        noticeInfo.setServerTime(currentTime);
+        noticeInfo.setOutcome(outcome);
+        noticeInfo.setNote(note);
+        if(!CollectionUtils.isEmpty(preWorkitemList)){
+            //濡傛灉涓嶅厑璁告墽琛屽悗缁紝璇风洿鎺ユ姏鍑哄紓甯�
+            BusAnnotationUtil.callForAnnotation(FlowNotifyWeb.class, FlowNotifyBefore.class,noticeInfo);
+        }
+    }
+
+
+    /**
+     * 鎵ц娴佺▼涔嬪悗
+     * @param processInstanceId 娴佺▼鐨勪富閿�
+     * @param finishWorkItemList 瀹屾垚鐨勪换鍔$殑淇℃伅
+     * @param mill 鏈嶅姟鍣ㄦ椂闂�
+     */
+    private void callAfter(String processInstanceId,List<Map> newWorkItemList,List<Map> finishWorkItemList,long mill){
+        if(newWorkItemList == null){
+            newWorkItemList = new ArrayList<>();
+        }
+        if(StringUtils.isNotBlank(processInstanceId)){
+            //璇存槑鏄彂璧锋祦绋�
+            //鑾峰彇鐜板湪鎵�鏈夌殑浠诲姟淇℃伅
+            DataGrid undoTaskGrid = processDao.getUndoTaskByInstanceId(processInstanceId,mill);
+            if(!CollectionUtils.isEmpty(undoTaskGrid.getData())){
+                newWorkItemList.addAll((List<Map>)undoTaskGrid.getData());
+            }
+        }
+        FlowNoticeInfo noticeInfo = new FlowNoticeInfo();
+        noticeInfo.setNewItemList(newWorkItemList);
+        noticeInfo.setFinishItemList(finishWorkItemList);
+        noticeInfo.setServerTime(mill);
+        BusAnnotationUtil.callForAnnotation(FlowNotifyWeb.class, FlowNotifyAfter.class,noticeInfo);
+    }
+
+    /**
+     * 杞崲鍙橀噺
+     *
+     * @param config 鍚姩鐨勯厤缃�
+     * @param varMap 鍙橀噺鐨刴ap
+     * @return 灏佽濂界殑鍙橀噺瀵硅薄
+     */
+    private MapTransfersInfo[] swapVariable(ProcessStartConfigDTO config, Map<String, String> varMap) {
+        List<MapTransfersInfo> mapTransfersInfos = new ArrayList<MapTransfersInfo>();
+        mapTransfersInfos.add(new MapTransfersInfo(WFVariablesKeyConstant.BTMTYPE_OLD, config.getBtmType()));
+        mapTransfersInfos.add(new MapTransfersInfo(WFVariablesKeyConstant.OIDS_OLD, config.getOids()));
+        if (StringUtils.isNotEmpty(config.getTableDefineCode())) {
+            mapTransfersInfos.add(new MapTransfersInfo(WFVariablesKeyConstant.UI_TABLE_CODE, config.getTableDefineCode()));
+        }
+        if (StringUtils.isNotEmpty(config.getDetailInfoUrl())) {
+            mapTransfersInfos.add(new MapTransfersInfo(WFVariablesKeyConstant.UI_DETAIL_URL, config.getDetailInfoUrl()));
+        }
+        if (StringUtils.isNotBlank(config.getContent())) {
+            mapTransfersInfos.add(new MapTransfersInfo(WFVariablesKeyConstant.UI_CONTENT_CODE, config.getContent()));
+        }
+        mapTransfersInfos.add(new MapTransfersInfo(WFVariablesKeyConstant.DATA_MAX_SECRET, String.valueOf(config.getMaxSecret())));
+        if (StringUtils.isNotBlank(config.getResetStatus())) {
+            mapTransfersInfos.add(new MapTransfersInfo(WFVariablesKeyConstant.RESET_STATUS, config.getResetStatus()));
+        }
+        if (StringUtils.isNotBlank(config.getStartStatus())) {
+            mapTransfersInfos.add(new MapTransfersInfo(WFVariablesKeyConstant.START_STATUS, config.getStartStatus()));
+        }
+        if (StringUtils.isNotBlank(config.getReleaseStatus())) {
+            mapTransfersInfos.add(new MapTransfersInfo(WFVariablesKeyConstant.RELEASE_STATUS, config.getReleaseStatus()));
+        }
+        if (StringUtils.isNotBlank(config.getUiType())) {
+            mapTransfersInfos.add(new MapTransfersInfo(WFVariablesKeyConstant.UI_TYPE, config.getUiType()));
+        }
+        if (varMap != null && !varMap.isEmpty()) {
+            for (String key : varMap.keySet()) {
+                Object value = varMap.get(key);
+                String strValue = "";
+                if (value instanceof Date) {
+                    strValue = VciDateUtil.date2Str((Date) value, VciDateUtil.DateTimeMillFormat);
+                } else if (value instanceof Long || value instanceof Integer || value instanceof Double) {
+                    strValue = String.valueOf(value);
+                } else {
+                    strValue = value.toString();
+                }
+                mapTransfersInfos.add(new MapTransfersInfo(key, strValue));
+            }
+        }
+        return mapTransfersInfos.toArray(new MapTransfersInfo[0]);
+    }
+
+
+    /**
+     * 杞寲涓哄钩鍙板彲浠ヨ瘑鍒殑鐢ㄦ埛淇℃伅
+     *
+     * @param users 璐熻矗浜�
+     * @return
+     */
+    private String[] getProcessUserInfo(List<ProcessUserVO> users) {
+        String[] ss = new String[0];
+        if (users != null && users.size() > 0) {
+            ss = new String[users.size()];
+            for (int i = 0; i < users.size(); i++) {
+                ProcessUserVO user = users.get(i);
+                if ("user".equals(user.getType())) {
+                    ss[i] = "user:" + user.getId();
+                } else if ("role".equals(user.getType())) {
+                    ss[i] = "role:" + user.getOid();
+                } else if ("dept".equals(user.getType())) {
+                    ss[i] = "dept:" + user.getOid();
+                }
+            }
+        }
+        return ss;
+    }
+
+    /**
+     * 鎵归噺鎵ц浠诲姟锛屼絾鏄墠鎻愭潯浠舵槸杩欎簺浠诲姟閮芥嫢鏈夌浉鍚岀殑outCome
+     */
+    @Override
+    public void completeTasks(String taskIds, String outCome,
+                              String note, List<ProcessUserVO> nextTaskUser)
+            throws VciBaseException {
+        logger.info("鎵ц娴佺▼:" + taskIds);
+        //棣栧厛鍒ゆ柇绌哄��
+        WebUtil.alertNotNull(outCome, "鎵ц鎿嶄綔", taskIds, "鎵ц娴佺▼");
+        if (reject.equalsIgnoreCase(outCome) && StringUtils.isEmpty(note)) {
+            //涓嶅悓鎰忕殑鏃跺�欙紝瀹℃壒鎰忚涓嶈兘涓虹┖
+            throw new VciBaseException("褰撴墽琛屾搷浣滀负" + reject + "鏃讹紝蹇呴』瑕佹湁瀹℃壒鎰忚");
+        }
+        if (note == null) {
+            note = "";
+        }
+        List<ProcessTaskVO> allTask = processDefineService.getTaskByOid(taskIds);
+        String[] jbpmTaskIds = null;
+        String nextTaskName = "";
+        if (allTask == null) {
+            throw new VciBaseException("娌℃湁鎵惧埌娴佺▼浠诲姟", new String[]{});
+        } else {
+            //璇存槑鏄壒閲忓湪鎵ц锛岃繖涓椂鍊欐垜浠渶瑕佸垽鏂繖浜涗换鍔℃槸鍚︿娇鐢ㄧ浉鍚岀殑娴佺▼妯℃澘锛屼笖褰撳墠浠诲姟鐨勫悕绉伴兘鐩稿悓.鑰屼笖涓嬩竴姝ヤ换鍔¢兘璁剧疆浜嗚礋璐d汉
+            String deployId = "";
+            String taskName = "";
+            jbpmTaskIds = new String[allTask.size()];
+            for (int i = 0; i < allTask.size(); i++) {
+                ProcessTaskVO task = allTask.get(i);
+                jbpmTaskIds[i] = task.getTaskOid();
+                boolean isMuti = false;
+                if (allTask != null && allTask.size() > 1) {
+                    isMuti = true;
+                }
+                if (isMuti) {
+                    //骞冲彴涓嶆敮鎸佹壒閲忚幏鍙栭儴缃蹭富閿紝鎵�浠ュ彧鑳戒竴涓换鍔′竴涓换鍔″湴鑾峰彇
+                    String thisDeployId = processDefineService.getDeployIdByExecutionId(task.getExecutionId());
+                    String thisTaskName = task.getName();
+                    if (thisTaskName.indexOf("-") > -1) {
+                        thisTaskName = thisTaskName.substring(thisTaskName.lastIndexOf("-") + 1);
+                    }
+                    if (StringUtils.isEmpty(thisDeployId)) {
+                        deployId = thisDeployId;
+                        taskName = thisTaskName;
+                    } else {
+                        if (!thisDeployId.equals(deployId) || !thisTaskName.equals(taskName)) {
+                            throw new VciBaseException("鎵归噺鎵ц娴佺▼鏃讹紝瑕佹眰浣跨敤鐨勫悓涓�涓祦绋嬫ā鏉夸腑鍚屼竴涓换鍔¤妭鐐�,{0},{1}", new String[]{thisDeployId + ":" + deployId, thisTaskName + ":" + taskName});
+                        }
+                    }
+                }
+                List<ProcessOutcomeVO> allOutcome = processDefineService.getOutCome(task.getOid(), true);
+                if (allOutcome != null && allOutcome.size() > 0) {
+                    boolean isFinedOc = false;
+                    for (ProcessOutcomeVO oc : allOutcome) {
+                        if (oc.getName().equals(outCome)) {
+                            if (oc.isHasSubTask()) {
+                                nextTaskName = oc.getNextTaskNames()[0];
+                                for (Entry<String, List<ProcessUserVO>> allUser : oc.getProcessUsers().entrySet()) {
+                                    if (allUser.getValue() == null || allUser.getValue().size() == 0) {
+                                        if (isMuti) {
+                                            throw new VciBaseException("鎵归噺鎵ц娴佺▼鏃讹紝瑕佹眰姣忎釜浠诲姟鐨勪笅涓�姝ラ浠诲姟閮藉凡缁忚缃簡璐熻矗浜�,{0},{1}", new String[]{outCome, allUser.getKey()});
+                                        } else if (!isMuti && (nextTaskUser == null || nextTaskUser.size() == 0)) {
+                                            throw new VciBaseException("涓嬩竴姝ラ浠诲姟{0}娌℃湁璁剧疆璐熻矗浜猴紝璇峰厛璁剧疆璐熻矗浜�", new String[]{allUser.getKey()});
+                                        }
+                                    }
+                                }
+                            } else {
+                                nextTaskName = oc.getNextTaskName();
+                                if (!"缁撴潫".equals(oc.getNextTaskName()) && (oc.getProcessUserVO() == null || oc.getProcessUserVO().size() == 0)) {
+                                    if (isMuti) {
+                                        throw new VciBaseException("鎵归噺鎵ц娴佺▼鏃讹紝瑕佹眰姣忎釜浠诲姟鐨勪笅涓�姝ラ浠诲姟閮藉凡缁忚缃簡璐熻矗浜�,{0},{1}", new String[]{outCome, oc.getName()});
+                                    } else if (!isMuti && (nextTaskUser == null || nextTaskUser.size() == 0)) {
+                                        throw new VciBaseException("涓嬩竴姝ラ浠诲姟{0}娌℃湁璁剧疆璐熻矗浜猴紝璇峰厛璁剧疆璐熻矗浜�", new String[]{oc.getNextTaskName()});
+                                    }
+                                }
+                            }
+                            isFinedOc = true;
+
+                            break;
+                        }
+                    }
+                    if (!isFinedOc) {
+                        throw new VciBaseException("浠诲姟" + task.getName() + "娌℃湁璺敱" + outCome, new String[]{});
+                    }
+                }
+            }
+        }
+        //鏍¢獙瀹屾垚浜�
+        String[] nextTaskUsers = getProcessUserInfo(nextTaskUser);
+
+        String[] objectPropertyKeys = new String[]{"Oid", "RevisionOid", "NameOid", "BTMName"};
+        Map<String, String> conditionMap = new HashMap<String, String>();
+        conditionMap.put("f_btwname", processDao.getWorkitemBtmType());
+        conditionMap.put("f_oid", QueryOptionConstant.IN + "(" + WebUtil.toInSql(taskIds) + ")");
+        List<ClientLinkObject> allLinkData = loService.queryCLO(processDao.getTaskDataLink(), conditionMap);
+        String[][] objectPropertyValues = new String[allLinkData.size()][4];
+        for (int i = 0; i < allLinkData.size(); i++) {
+            ClientLinkObject clo = allLinkData.get(i);
+            String[] values = new String[4];
+            values[0] = clo.getToOid();
+            values[1] = clo.getToRevisionOid();
+            values[2] = clo.getToNameOid();
+            values[3] = clo.getToBTMName();
+            objectPropertyValues[i] = values;
+        }
+        if ("鏈懡鍚嶈矾鐢�".equalsIgnoreCase(outCome)) {
+            outCome = "";
+        }
+        List<Map> workitemList = processDao.getTaskCBOByOid(taskIds);
+        long currentTime = 0L;
+        try {
+//            currentTime = platformClientUtil.getLogonFactoryService().getFrameworkService().getSystemTime();
+        } catch (Throwable e) {
+            throw new VciBaseException(LangBaseUtil.getErrorMsg(e), new String[0], e);
+        }
+        callBefore(workitemList,outCome,note,currentTime);
+//        try {
+//            if (jbpmTaskIds.length == 1) {
+//                processDao.getWorkService().completeTaskByPlatform_v1(jbpmTaskIds[0], outCome, nextTaskName, note, getUserEntityInfo(), nextTaskUsers, objectPropertyKeys, objectPropertyValues);
+//            } else {
+//                processDao.getWorkService().completeTasksByPlatform_v1(jbpmTaskIds, outCome, nextTaskName, note, getUserEntityInfo(), nextTaskUsers, objectPropertyKeys, objectPropertyValues);
+//            }
+//        } catch (VCIError e) {
+//            throw WebUtil.getVciBaseException(e);
+//        }
+        callAfter((String)workitemList.get(0).get("executionid"),null,workitemList,currentTime);
+    }
+
+
+    private UserEntityInfo getUserEntityInfo() {
+        return WebUtil.getUserEntityInfo("娴佺▼");
+    }
+
+
+    /**
+     * 杞Щ璐熻矗浜�
+     *
+     * @param taskOids 浠诲姟涓婚敭
+     * @param userIds  鏂扮殑鐢ㄦ埛,鍙兘鏄竴涓敤鎴�
+     * @throws VciBaseException
+     */
+    @Override
+    public void setPrincipal(String taskOids, String userIds)
+            throws VciBaseException {
+        WebUtil.alertNotNull(taskOids, "娴佺▼浠诲姟鐨勪富閿�", userIds, "鐢ㄦ埛鍚�");
+        if (userIds.contains(",")) {
+            throw new VciBaseException(msgCodePrefix + "onlyTransOneUser");
+        }
+        String[] taskOidArray = taskOids.split(",");
+        for (String taskOid : taskOidArray) {
+            if (StringUtils.isNotBlank(taskOid)) {
+//                try {
+//                    processDao.getWorkService().transmitTask(taskOid, "user:" + userIds, getUserEntityInfo());
+//                } catch (VCIError vciError) {
+//                    throw WebUtil.getVciBaseException(vciError);
+//                }
+            }
+        }
+    }
+
+    @Override
+    public void beginProxy(String userId, Date startDate, Date endDate, boolean isNowEnable) throws VciBaseException {
+        processDao.beginProxy(userId, startDate, endDate, isNowEnable);
+    }
+
+    @Override
+    public void endProxy() throws VciBaseException {
+        processDao.endProxy();
+    }
+
+    @Override
+    public TasksAssigned getProxy() throws VciBaseException {
+        return processDao.getProxy();
+    }
+
+    /**
+     * 缁堟娴佺▼
+     *
+     * @param executionId 娴佺▼鎵ц涓婚敭
+     * @param note
+     * @throws VciBaseException
+     */
+    @Override
+    public void endProcess(String executionId, String note) throws VciBaseException {
+        WebUtil.alertNotNull(executionId, "娴佺▼鎵ц瀹炰緥鐨勪富閿�");
+        long currentTime = 0L;
+        try {
+//            currentTime = platformClientUtil.getLogonFactoryService().getFrameworkService().getSystemTime();
+        } catch (Throwable e) {
+            throw new VciBaseException(LangBaseUtil.getErrorMsg(e), new String[0], e);
+        }
+        DataGrid taskGrid = processDao.getUndoTaskByInstanceId(executionId, 0L);
+        List<Map> workitemList =(List<Map>) taskGrid.getData();
+
+        callBefore(workitemList,"end",note,currentTime);
+        //鏈嶅姟绔兘澶勭悊浜嗭紝杩欓噷鐩存帴璋冪敤
+        processDao.endProcess(executionId);
+        callAfter(null,null,workitemList,currentTime);
+    }
+
+    /**
+     * 鎸傝捣娴佺▼
+     *
+     * @param executionId 娴佺▼鎵ц鐨勪富閿�
+     * @param note
+     * @throws VciBaseException
+     */
+    @Override
+    public void suspendProcess(String executionId, String note)
+            throws VciBaseException {
+        WebUtil.alertNotNull(executionId, "娴佺▼鎵ц瀹炰緥鐨勪富閿�");
+        //灏嗘祦绋嬫墽琛屽疄渚嬪拰褰撳墠寰呭姙浠诲姟閮戒慨鏀逛负鎸傝捣鐘舵��
+        //鏌ヨ娴佺▼瀹炰緥
+        Map<String, String> conditionMap = new HashMap<String, String>();
+        conditionMap.put("executionid", executionId.trim() + "*");//浼氭湁瀛愭祦绋�
+        List<ClientBusinessObject> workInstanceCbos = boService.queryCBO(processDao.getWorkIntanceBtmType(), conditionMap);
+        if (workInstanceCbos == null || workInstanceCbos.size() == 0) {
+            throw new VciBaseException(msgCodePrefix + "executionNotExist");
+        }
+        //鍒ゆ柇鏄惁閮芥槸鎵ц鐘舵�侊紝鍓嶇鐨勫垽鏂兘琚烦杩�
+        List<ClientBusinessObject> needUpdateCbos = new ArrayList<ClientBusinessObject>();
+        List<String> workInstanceOids = new ArrayList<String>();
+        for (ClientBusinessObject cbo : workInstanceCbos) {
+            if (!cbo.getLcStatus().equalsIgnoreCase("Executing")) {
+                throw new VciBaseException(msgCodePrefix + "processNotExecutionStatus");
+            }
+            needUpdateCbos.add(cbo);
+            workInstanceOids.add(cbo.getAttributeValue("executionid"));
+        }
+        //鎵剧浉鍏崇殑娴佺▼浠诲姟瀵硅薄锛屽苟涓旀槸姝e湪鎵ц涓殑
+        conditionMap.put("executionid", QueryOptionConstant.IN + "(" + WebUtil.toInSql(workInstanceOids.toArray(new String[0])) + ")");
+        conditionMap.put("lcstatus", "Executing");
+        List<ClientBusinessObject> workItemCbos = boService.queryCBO(processDao.getWorkitemBtmType(), conditionMap);
+        if (workItemCbos != null && workItemCbos.size() > 0) {
+            needUpdateCbos.addAll(workItemCbos);
+        }
+        long currentTime = 0L;
+        try {
+//            currentTime = platformClientUtil.getLogonFactoryService().getFrameworkService().getSystemTime();
+        } catch (Throwable e) {
+            throw new VciBaseException(LangBaseUtil.getErrorMsg(e), new String[0], e);
+        }
+        List<Map> mapList = boService.cbos2Map(workItemCbos);
+        callBefore(mapList,"suspend",note,currentTime);
+        lifeCycleService.transCboStatus(needUpdateCbos, "Suspended");
+        callAfter(null,null,mapList,currentTime);
+    }
+
+    @Override
+    public void resumeProcess(String executionId) throws VciBaseException {
+        WebUtil.alertNotNull(executionId, "娴佺▼鎵ц瀹炰緥鐨勪富閿�");
+        //灏嗘祦绋嬫墽琛屽疄渚嬪拰褰撳墠寰呭姙浠诲姟閮戒慨鏀逛负鎸傝捣鐘舵��
+        //鏌ヨ娴佺▼瀹炰緥
+        Map<String, String> conditionMap = new HashMap<String, String>();
+        conditionMap.put("executionid", executionId.trim() + "*");//浼氭湁瀛愭祦绋�
+        List<ClientBusinessObject> workInstanceCbos = boService.queryCBO(processDao.getWorkIntanceBtmType(), conditionMap);
+        if (workInstanceCbos == null || workInstanceCbos.size() == 0) {
+            throw new VciBaseException(msgCodePrefix + "executionNotExist");
+        }
+        //鍒ゆ柇鏄惁閮芥槸鎵ц鐘舵�侊紝鍓嶇鐨勫垽鏂兘琚烦杩�
+        List<ClientBusinessObject> needUpdateCbos = new ArrayList<ClientBusinessObject>();
+        List<String> workInstanceOids = new ArrayList<String>();
+        for (ClientBusinessObject cbo : workInstanceCbos) {
+            if (!cbo.getLcStatus().equalsIgnoreCase("Suspended")) {
+                throw new VciBaseException(msgCodePrefix + "processNotSuspendedStatus");
+            }
+            needUpdateCbos.add(cbo);
+            workInstanceOids.add(cbo.getOid());
+        }
+        //鎵剧浉鍏崇殑娴佺▼浠诲姟瀵硅薄锛屽苟涓旀槸姝e湪鎵ц涓殑
+        conditionMap.put("executionid", QueryOptionConstant.IN + "(" + WebUtil.toInSql(workInstanceOids.toArray(new String[0])) + ")");
+        conditionMap.put("lcstatus", "Suspended");
+        List<ClientBusinessObject> workItemCbos = boService.queryCBO(processDao.getWorkitemBtmType(), conditionMap);
+        if (workItemCbos != null && workItemCbos.size() > 0) {
+            needUpdateCbos.addAll(workItemCbos);
+        }
+        long currentTime = 0L;
+        try {
+//            currentTime = platformClientUtil.getLogonFactoryService().getFrameworkService().getSystemTime();
+        } catch (Throwable e) {
+            throw new VciBaseException(LangBaseUtil.getErrorMsg(e), new String[0], e);
+        }
+
+        callBefore(null,"resume","",currentTime);
+        lifeCycleService.transCboStatus(needUpdateCbos, "Executing");
+        callAfter(null,boService.cbos2Map(workItemCbos),null,currentTime);
+    }
+
+    /**
+     * 鍙戣捣娴佺▼鏃舵牎楠屽睘鎬ф槸鍚︾鍚堣姹�
+     *
+     * @param oids            涓婚敭
+     * @param btmType         涓氬姟绫诲瀷
+     * @param attributes      灞炴�у悕锛岄�楀彿鍒嗛殧
+     * @param attributeValues 灞炴�х殑鍊�
+     * @param primaryKeyName  涓婚敭鐨勫瓧娈靛悕
+     * @throws VciBaseException
+     */
+    @Override
+    public void checkAttributesOnStartProcess(String oids, String btmType, String attributes, String attributeValues, String primaryKeyName) throws VciBaseException {
+        WebUtil.alertNotNull(oids, "鏍¢獙鏁版嵁鐨勪富閿�", btmType, "涓氬姟绫诲瀷", attributeValues, "瑕佹牎楠岀殑灞炴�у��");
+        if (StringUtils.isBlank(primaryKeyName)) {
+            primaryKeyName = "oid";
+        }
+        if (StringUtils.isBlank(attributes)) {
+            attributes = "lcstatus";
+        }
+        oids = WebUtil.removeComma(oids);
+        attributes = WebUtil.removeComma(attributes);
+        attributeValues = WebUtil.removeComma(attributeValues);
+        if (attributes.indexOf(",") > -1) {
+            if (StringUtils.countMatches(attributes, ",") != StringUtils.countMatches(attributeValues, ",")) {
+                throw new VciBaseException("瑕佹牎楠岀殑鏁版嵁鐨勫睘鎬у悕鍜屽睘鎬х殑鍊奸暱搴︿笉鐩哥瓑");
+            }
+        }
+        Map<String, String> conditionMap = new HashMap<String, String>();
+        conditionMap.put(primaryKeyName, QueryOptionConstant.IN + "(" + WebUtil.toInSql(oids) + ")");
+        String[] attributeArray = attributes.split(",");
+        String[] attributeValueArray = attributeValues.split(",");
+        for (int i = 0; i < attributeArray.length; i++) {
+            String attr = attributeArray[i];
+            String attrValue = attributeValueArray[i].trim();
+            if (attrValue.indexOf("#") > -1) {
+                conditionMap.put(attr, QueryOptionConstant.IN + "(" + WebUtil.toInSql(attrValue.replace("#", ",")));
+            } else {
+                conditionMap.put(attr, attributeValueArray[i].trim());
+            }
+        }
+        List<String> causeList = Arrays.asList(new String[]{primaryKeyName});
+        List<ClientBusinessObject> cbos = boService.queryCBO(btmType, conditionMap, null, causeList);
+        if (cbos == null || cbos.size() == 0) {
+            throw new VciBaseException("鍙戣捣娴佺▼鐨勪笟鍔℃暟鎹叏閮ㄤ笉绗﹀悎瑕佹眰");
+        }
+        Set<String> oidSet = new HashSet<String>();
+        String[] oidArray = oids.split(",");
+        for (String oid : oidArray) {
+            oidSet.add(oid);
+        }
+        for (ClientBusinessObject cbo : cbos) {
+            if (oidSet.contains(cbo.getAttributeValue(primaryKeyName))) {
+                oidSet.remove(cbo.getAttributeValue(primaryKeyName));
+            }
+        }
+        if (oidSet.size() > 0) {
+            throw new VciBaseException("鍙戣捣娴佺▼鐨勪笟鍔℃暟鎹湁" + oidSet.size() + "涓嶇鍚堣姹�");
+        }
+    }
+
+    /**
+     * 鎵归噺缁堟娴佺▼
+     *
+     * @param executionIds 娴佺▼鐨勬墽琛屼富閿�
+     * @param note         缁堟鍘熷洜
+     * @throws VciBaseException
+     */
+    @Override
+    public void batchEndProcess(Collection<String> executionIds, String note) throws VciBaseException {
+        WebUtil.alertNotNull(executionIds,"娴佺▼鎵ц涓婚敭淇℃伅");
+        for(String executionId: executionIds){
+            endProcess(executionId,note);
+        }
+    }
+
+    /**
+     * 娣诲姞娴佺▼瀹℃壒鎰忚鏂囦欢
+     *
+     * @param taskOids         娴佺▼浠诲姟鐨勪富閿�
+     * @param file             鏂囦欢鐨勬暟鎹�
+     * @param originalFilename 鏂囦欢鐨勫悕绉�
+     * @throws VciBaseException 鍦ㄦ煡璇㈡祦绋嬩换鍔$殑淇℃伅鎴栬�呬笂浼犳枃浠堕敊璇椂浼氭姏鍑哄紓甯�
+     */
+    @Override
+    public void uploadAuditSuggestFile(String taskOids, MultipartFile file, String originalFilename) throws VciBaseException {
+        WebUtil.alertNotNull(taskOids, "娴佺▼浠诲姟涓婚敭", originalFilename, "鏂囦欢鍚嶇О");
+        if (file == null || file.getSize() == 0) {
+            throw new VciBaseException("娴佺▼瀹℃壒鎰忚鐨勬枃浠跺唴瀹逛负绌�");
+        }
+        DataGrid dataGrid = processDefineService.getDataInProcess(taskOids, null, "");
+        if (dataGrid == null || CollectionUtils.isEmpty(dataGrid.getData())) {
+            throw new VciBaseException("娴佺▼鐨勪笟鍔℃暟鎹槸绌虹殑锛屾暟鎹敊璇�");
+        }
+        String btwName = "";
+        List<String> businessDataOidList = new ArrayList<String>();
+        List<Map> businessDataList = (List<Map>) dataGrid.getData();
+        for (Map businessData : businessDataList) {
+            if (StringUtils.isBlank(btwName)) {
+                btwName = (String) businessData.get("btmname");
+            }
+            businessDataOidList.add((String) businessData.get("oid"));
+        }
+        String fileExtension = "";
+        if (originalFilename.contains(".")) {
+            String temp = originalFilename.substring(0, originalFilename.lastIndexOf("."));
+            fileExtension = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
+            originalFilename = temp;
+        }
+        for (String oid : businessDataOidList) {
+            VciFileObjectDTO fileObjectDTO = new VciFileObjectDTO();
+            fileObjectDTO.setName(originalFilename);
+            fileObjectDTO.setFileExtension(fileExtension);
+            fileObjectDTO.setFileDocClassify("processAuditSuggest");
+            fileObjectDTO.setFileDocClassifyName("娴佺▼瀹℃壒鎰忚");
+            fileObjectDTO.setOwnBtmname(btwName);
+            fileObjectDTO.setOwnbizOid(oid);
+            fileObjectDTO.setSecretGrade(DataSecretEnum.NONE.getValue());
+            fileService.uploadFile(file, fileObjectDTO);
+        }
+    }
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WebProcessDefineServiceImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WebProcessDefineServiceImpl.java
new file mode 100644
index 0000000..8386f3e
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WebProcessDefineServiceImpl.java
@@ -0,0 +1,881 @@
+package com.vci.web.service.impl;
+
+import com.vci.file.pagemodel.VciFileObjectVO;
+import com.vci.frameworkcore.compatibility.OrgDeptQueryServiceI;
+import com.vci.frameworkcore.compatibility.SmRoleQueryServiceI;
+import com.vci.frameworkcore.compatibility.SmUserQueryServiceI;
+import com.vci.frameworkcore.pagemodel.OrgDepartmentVO;
+import com.vci.frameworkcore.pagemodel.SmRoleVO;
+import com.vci.frameworkcore.pagemodel.SmUserVO;
+import com.vci.rmip.workflow.client.editor.FlowConstants;
+import com.vci.starter.web.enumpck.DataSecretEnum;
+import com.vci.starter.web.enumpck.UserSecretEnum;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.*;
+import com.vci.starter.web.util.BeanUtil;
+import com.vci.starter.web.util.Md5;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.starter.web.wrapper.VciQueryWrapperForDO;
+import com.vci.web.constant.FileTypeConstants;
+import com.vci.web.constant.WFVariablesKeyConstant;
+import com.vci.web.dao.WebProcessDaoI;
+import com.vci.web.model.OsStatusDO;
+import com.vci.web.model.WFProcessClassifyDO;
+import com.vci.web.pageModel.*;
+import com.vci.web.properties.WebProperties;
+import com.vci.web.service.*;
+import com.vci.web.util.WebUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.dom4j.Document;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import plm.bs.bom.clientobject.ClientLinkObject;
+
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 娴佺▼鐩稿叧鏌ヨ鏈嶅姟
+ * @author weidy@2018-04-24
+ *
+ */
+@Service
+public class WebProcessDefineServiceImpl implements WebProcessDefineServiceI{
+	
+	@Autowired
+	private WebProcessDaoI processDao;
+	
+
+
+	@Autowired
+	private WebProperties webProperties;
+	
+	@Autowired
+	private WebProcessCommandServiceI proCmdService;
+
+	/**
+	 * 涓氬姟鏁版嵁鏈嶅姟
+	 */
+	@Autowired
+	private WebBoServiceI boService;
+
+
+	/**
+	 * 瑙掕壊鏈嶅姟
+	 */
+	@Autowired
+	private SmRoleQueryServiceI roleQueryService;
+	@Autowired
+	private OrgDeptQueryServiceI deptQueryServiceI;
+	@Autowired
+	private SmUserQueryServiceI userQueryServiceI;
+	@Autowired
+	private WebSecretServiceI secretService;
+
+	/**
+	 * 鏂囦欢鐨勫璞℃湇鍔�
+	 */
+	@Autowired
+	private VciFileObjectServiceI fileObjectService;
+
+
+	@Autowired
+	private OsEnumServiceI enumService;
+
+	
+	private final String msgCodePrefix = "com.vci.web.flow.";
+
+	private Logger logger = LoggerFactory.getLogger(getClass());
+
+
+	/**
+	 * 鏌ヨ褰撳墠鐢ㄦ埛鍙互浣跨敤鐨則ype鍒嗙被涓嬬殑娴佺▼妯℃澘--鐩墠鏆傛椂涓嶆牴鎹敤鎴疯繃婊ゆ祦绋嬫ā鏉�
+	 * @param type 娴佺▼鍒嗙被
+	 * @param filterTemplate 鎸囧畾妯℃澘
+	 * @param showAll 鏄惁鏄剧ず鎵�鏈夌殑鐗堟湰
+	 */
+	@Override
+	public List<ProcessTemplateVO> getMyTemplates(String type,String filterTemplate,
+												  boolean showAll) throws VciBaseException {
+		//鐜板湪娌℃湁娣诲姞鐢ㄦ埛鐨勮繃婊�
+		return processDao.getTemplatesByType(type,filterTemplate,showAll);
+	}
+
+	/**
+	 * 鑾峰彇鏌愪釜娴佺▼鍒嗙被涓嬬殑鎵�鏈夋祦绋嬫ā鏉�
+	 * @param type 娴佺▼妯℃澘
+	 */
+	@Override
+	public List<ProcessTemplateVO> getAllTemplates(String type)
+			throws VciBaseException {
+		return processDao.getTemplatesByType(type,null,true);
+	}
+
+	/**
+	 * 鑾峰彇娴佺▼妯℃澘涓墍鏈夌殑浠诲姟鑺傜偣
+	 * @param processOid 娴佺▼妯℃澘鐨勪富閿�
+	 * @param isQueryUser 鏄惁鏌ヨ鑺傜偣鐨勭敤鎴�
+	 * @param maxSecret 鏁版嵁涓殑鏈�澶у瘑绾у��
+	 */
+	@Override
+	public List<ProcessNodeVO> getAllProcessNode(String processOid, boolean isQueryUser, int maxSecret)
+			throws VciBaseException {
+		List<ProcessNodeVO> allProcessNodeVO = processDao.getAllProcessNode(processOid);
+		if(allProcessNodeVO !=null&& allProcessNodeVO.size()>0 && isQueryUser){
+			for(ProcessNodeVO pn : allProcessNodeVO){
+				pn.setProcessUserVO(getProcessUsersByNode(pn,maxSecret));
+			}
+		}
+		return allProcessNodeVO;
+	}
+    
+	/**
+	 * 鑾峰彇娴佺▼妯℃澘涓墍鏈夌殑浠诲姟鑺傜偣鍚嶇О
+	 * @param processOid 娴佺▼妯℃澘鐨勪富閿�
+	 */
+	@Override
+	public List<String> getAllProcessNodeName(String processOid)
+			throws VciBaseException {
+		String[] allTaskName = processDao.getAllProcessNodeName(processOid);
+		if(allTaskName !=null){
+			return Arrays.asList(allTaskName);
+		}else{
+			return new ArrayList<String>();
+		}
+	}
+
+	/**
+	 * 鑾峰彇娴佺▼鑺傜偣涓彲浠ラ�夋嫨鐨勭敤鎴�
+	 * @param  node 娴佺▼妯$増鐨勪富閿�
+	 * @param maxSecret 鏁版嵁涓殑鏈�澶у瘑绾у��
+	 * @return
+	 * @throws VciBaseException
+	 */
+	@Override
+	public List<ProcessUserVO> getProcessUsersByNode(ProcessNodeVO node, int maxSecret) throws VciBaseException{
+		if(!webProperties.isCheckSecretOnProcessStart()){
+			maxSecret = -1;//涓嶆牎楠岀殑鏃跺�欏氨涓嶉渶瑕佸姣斿瘑绾т簡
+		}
+		List<ProcessUserVO> allUsers = new ArrayList<ProcessUserVO>();
+		if(node!=null){
+			//鍏堝鐞嗚鑹插拰閮ㄩ棬
+			boolean isHasRoleOrDept = false;
+			if(StringUtils.isNotEmpty(node.getRoles())){
+				isHasRoleOrDept = true;
+				List<String> roleOids = VciBaseUtil.str2List(node.getRoles().replace("role:", ""));
+				List<SmRoleVO> roles = roleQueryService.listRoleByRoleOids(roleOids);
+				Map<String,List<SmUserVO>> userRoleMap = userQueryServiceI.batchListUserByRoleOids(roleOids);
+				if(roles!=null && roles.size() > 0){
+					for(SmRoleVO role : roles){
+						ProcessUserVO pu = new ProcessUserVO();
+						BeanUtils.copyProperties(role, pu);
+						pu.setType("role");
+						//鎵捐鑹蹭笅鐨勭敤鎴�
+						List<SmUserVO> users = userRoleMap.getOrDefault(role.getOid(),new ArrayList<>());
+						if(users!=null&& users.size()>0){
+							List<ProcessUserVO> pul = copyUsersToProcessNode(users,maxSecret);
+							if(pul.size()>0) {
+								pu.setChildren(pul);
+							}
+						}
+						allUsers.add(pu);
+					}
+				}
+			}
+			if(StringUtils.isNotEmpty(node.getDepts())){
+				isHasRoleOrDept = true;
+				List<String> deptOids = VciBaseUtil.str2List(node.getDepts().replace("dept:", ""));
+				List<OrgDepartmentVO> depts = deptQueryServiceI.listDeptByDeptOids(deptOids);
+				Map<String, List<SmUserVO>> userDeptMap = userQueryServiceI.batchListUserByDeptOids(deptOids);
+				if(depts!=null && depts.size() > 0){
+					for(OrgDepartmentVO dept : depts){
+						ProcessUserVO pu = new ProcessUserVO();
+						BeanUtils.copyProperties(dept, pu);
+						pu.setType("dept");
+						//鎵捐鑹蹭笅鐨勭敤鎴�
+						List<SmUserVO> users = userDeptMap.getOrDefault(dept.getOid(),new ArrayList<>());
+						if(users!=null&& users.size()>0){
+							List<ProcessUserVO> pul = copyUsersToProcessNode(users,maxSecret);
+							if(pul.size()>0) {
+								pu.setChildren(pul);
+							}
+						}
+						allUsers.add(pu);
+					}
+				}
+			}
+			if(StringUtils.isNotEmpty(node.getUsers())){
+				//澶勭悊鐢ㄦ埛锛岀敤鎴锋槸瀛樺偍鐨勭敤鎴峰悕
+				String userids = node.getUsers().replace("user:", "");
+				boolean isHasCurrentUser = false;
+				String[] useridsArr = userids.split(",");//鍥犱负瑕佹壘#CURRENTUSER#,鎵�浠ョ洿鎺ュ垎闅斿悗锛屽悗闈㈢洿鎺ュ姞涓婅鏌ヨ鐨勫崟寮曞彿
+				if(useridsArr!=null&& useridsArr.length>0){
+					userids = "";
+					for(String userid : useridsArr){
+						if("#CURRENTUSER#".equalsIgnoreCase(userid)){
+							isHasCurrentUser = true;
+						}else if(StringUtils.isNotEmpty(userid)){
+							userids += userid + ",";
+						}
+					}
+				}
+				userids = WebUtil.removeComma(userids);
+				List<SmUserVO> users = null;
+				if(StringUtils.isNotBlank(userids)){
+					users = userQueryServiceI.listUserByUserIds(VciBaseUtil.str2List(userids));
+				}
+				List<ProcessUserVO> pul = copyUsersToProcessNode(users,maxSecret);
+				if(isHasCurrentUser){//褰撳墠鐢ㄦ埛鏀惧湪鍓嶉潰
+					ProcessUserVO pu = new ProcessUserVO();
+					//SessionInfo si = WebUtil.getSessionInfo(request);
+					SessionInfo si = WebUtil.getCurrentUserSessionInfo();
+					pu.setOid(si.getUserOid());
+					pu.setId(si.getUserId());
+					pu.setName(si.getUserName());
+					pu.setType("user");
+					pu.setLeaf(true);
+					int userSecret = WebUtil.getInt(si.getUserSecret());
+					if(maxSecret == -1 || secretService.checkDataSecret(maxSecret,userSecret)) {
+						if(maxSecret>-1){
+							pu.setSecret(userSecret);
+							pu.setSecretText(UserSecretEnum.getSecretText(userSecret));
+						}
+						pul.add(pu);
+					}
+				}
+
+				if(isHasRoleOrDept){//宸茬粡鏈夎鑹叉垨鑰呴儴闂ㄤ簡锛岄偅涔堝氨鍔犱竴涓敤鎴风殑鑺傜偣
+					ProcessUserVO pu = new ProcessUserVO();
+					pu.setOid("userfolder");
+					pu.setId("");
+					pu.setName("鐢ㄦ埛");
+					pu.setType("userfolder");
+					pu.setChildren(pul);
+					allUsers.add(pu);
+				}else{
+					allUsers.addAll(pul);
+				}
+			}
+		}
+		return allUsers;
+	}
+
+	private List<ProcessUserVO> copyUsersToProcessNode(List<SmUserVO> users, int maxSecret) throws VciBaseException{
+		List<ProcessUserVO> pul = new ArrayList<ProcessUserVO>();
+		if(users!=null&& users.size()>0){
+			for(SmUserVO user : users){
+				ProcessUserVO puc = new ProcessUserVO();
+				BeanUtils.copyProperties(user, puc);
+				puc.setType("user");
+				puc.setLeaf(true);
+				if(maxSecret == -1 || secretService.checkDataSecret(maxSecret,user.getSecretGrade())) {
+					if(maxSecret>-1){
+						puc.setSecret(user.getSecretGrade());
+						puc.setSecretText(UserSecretEnum.getSecretText(user.getSecretGrade()));
+					}
+					pul.add(puc);
+				}
+			}
+		}
+		return pul;
+	}
+
+	/**
+	 * 鑾峰彇娴佺▼妯℃澘涓煇涓妭鐐圭殑鎵�鏈夌殑澶勭悊鐢ㄦ埛
+	 * @param processTemplateOid 娴佺▼妯℃澘
+	 * @param nodeName 鑺傜偣鍚嶇О
+	 * @return
+	 * @throws VciBaseException
+	 */
+	@Override
+	public List<ProcessUserVO> getAllProcessUsersInProcess(String processTemplateOid,
+														   String nodeName) throws VciBaseException {
+		//鍏堣幏鍙栨祦绋嬭妭鐐�
+		ProcessNodeVO pn = processDao.getNodePresideUsers(processTemplateOid, nodeName);
+		return getProcessUsersByNode(pn,-1);
+	}
+	
+	@Override
+	public String getDeployIdByExecutionId(String executionId) throws VciBaseException {
+		return processDao.getJbpmDeploymentIdByExecutionId(executionId);
+	}
+	
+	@Override
+	public List<ProcessUserVO> getProcessUserByTask(String taskOid) throws VciBaseException{
+		List<ProcessTaskVO> task = processDao.getTaskByOid(taskOid);
+		if(task!=null && task.size()>0){
+			return processDao.getNodePresideUsersByTask(task.get(0).getExecutionId(),task.get(0).getName());
+		}else{
+			throw new VciBaseException(msgCodePrefix + "taskNotFound",new String[]{taskOid}) ;
+		}
+	}
+
+	@Override
+	public DataGrid getMyUndoProcessTask(
+			Map<String, String> conditionMap, PageHelper ph) throws VciBaseException {
+		if(conditionMap == null ) {
+			conditionMap = new HashMap<String, String>();
+		}
+		return processDao.getUndoTask(conditionMap,ph,WebUtil.getCurrentUserId());
+	}
+
+	@Override
+	public DataGrid getMyDoneProcessTask(Map<String, String> conditionMap,
+			PageHelper ph) throws VciBaseException {
+		if(conditionMap == null) {
+			conditionMap = new HashMap<String, String>();
+		}
+		return processDao.getDoneProcess(conditionMap,ph,WebUtil.getCurrentUserId());
+	}
+
+	@Override
+	public DataGrid getMyCompletedProcess(Map<String, String> conditionMap,
+			PageHelper ph) throws VciBaseException{
+		return processDao.getCompletedProcess(conditionMap,ph,WebUtil.getCurrentUserId());
+	}
+	
+	@Override
+	public DataGrid getAllCompletedProcess(Map<String, String> conditionMap,
+			PageHelper ph) throws VciBaseException {
+		return processDao.getCompletedProcess(conditionMap,ph,"");
+	}
+
+	@Override
+	public DataGrid getMyObsoledtedProcess(Map<String, String> conditionMap,
+			PageHelper ph) throws VciBaseException {
+		return processDao.getObsoledtedProcess(conditionMap,ph,WebUtil.getCurrentUserId());
+	}
+	
+	@Override
+	public DataGrid getAllObsoledtedProcess(Map<String, String> conditionMap,
+			PageHelper ph) throws VciBaseException {
+		return processDao.getObsoledtedProcess(conditionMap,ph,"");
+	}
+
+	@Override
+	public DataGrid getMySuspendedProcess(Map<String, String> conditionMap,
+			PageHelper ph) throws VciBaseException {
+		return processDao.getSuspendedProcess(conditionMap,ph,WebUtil.getCurrentUserId());
+	}
+	
+	@Override
+	public DataGrid getAllSuspendedProcess(Map<String, String> conditionMap,
+			PageHelper ph) throws VciBaseException {
+		return processDao.getSuspendedProcess(conditionMap,ph,"");
+	}
+
+	@Override
+	public DataGrid getMyExecutingProcess(Map<String, String> conditionMap,
+			PageHelper ph) throws VciBaseException{
+		return processDao.getExecutingProcess(conditionMap,ph,WebUtil.getCurrentUserId());
+	}
+	
+	@Override
+	public DataGrid getAllExecutingProcess(Map<String, String> conditionMap,
+			PageHelper ph) throws VciBaseException {
+		return processDao.getExecutingProcess(conditionMap,ph,"");
+	}
+
+	@Override
+	public DataGrid getMyCreateProcess(Map<String, String> conditionMap,
+			PageHelper ph) throws VciBaseException {
+		return processDao.getCreateProcess(conditionMap,ph,WebUtil.getCurrentUserId());
+	}
+
+
+	/**
+	 * 鏌ヨ娴佺▼瀵逛簬琛ㄦ牸鐩稿叧鐨勫畾涔�
+	 * @param executionid 鎵ц瀹炰緥鐨勪富閿�
+	 * @param taskOid 浠诲姟鐨勪富閿�
+	 * @return
+	 * @throws VciBaseException
+	 */
+	@Override
+	public Map<String,Object> getDataTableDefine(String executionid,String taskOid)
+			throws VciBaseException{
+		//鑾峰彇鍏蜂綋鐨勪换鍔�
+		WebUtil.alertNotNull(executionid,msgCodePrefix + "executionidIsNotFound");
+		if(StringUtils.isBlank(executionid) ){
+			throw new VciBaseException(msgCodePrefix + "executionidIsNotFound",new String[]{executionid});
+		}
+		List<ProcessTaskVO> tasks = null;
+		if(StringUtils.isNotBlank(taskOid)) {
+			tasks =processDao.getTaskByOid(taskOid);
+			WebUtil.alertNotNull(tasks,"娴佺▼浠诲姟");
+		}
+		//鎵句竴涓嬪彉閲忛噷鏈夋病鏈夎缃樉绀虹殑鍐呭
+		while (StringUtils.countMatches(executionid,".") >1){
+			//璇存槑鏈変袱涓互涓婄殑鐐癸紝璇存槑杩欎釜鏄瓙娴佺▼锛屾垜浠渶瑕佷娇鐢ㄧ埗娴佺▼鏉ユ煡璇�
+			executionid = executionid.substring(0,executionid.lastIndexOf("."));
+		}
+		//鏃犻渶鑾峰彇鑾峰彇娴佺▼鐨勫璞★紝鍥犱负涔熷彧鑳芥嬁鍒癳xecutionId
+		//鎵句竴涓嬪彉閲忛噷鏈夋病鏈夎缃樉绀虹殑鍐呭
+		String btmType = processDao.getVariablesInProcess(executionid, WFVariablesKeyConstant.BTMTYPE_OLD);
+		String displayTable = processDao.getVariablesInProcess(executionid, WFVariablesKeyConstant.UI_TABLE_CODE);
+		String detailUrl =  processDao.getVariablesInProcess(executionid, WFVariablesKeyConstant.UI_DETAIL_URL);
+		String UIContent = processDao.getVariablesInProcess(executionid,WFVariablesKeyConstant.UI_CONTENT_CODE);
+		String UIType = processDao.getVariablesInProcess(executionid,WFVariablesKeyConstant.UI_TYPE);
+
+		if(StringUtils.isBlank(detailUrl) && StringUtils.isBlank(UIContent) && StringUtils.isBlank(displayTable)){
+			//璇存槑鍙栭粯璁ょ殑
+			UIType = btmType;
+			UIContent = "processTaskUI";
+		}else{
+			if(StringUtils.isBlank(UIType)){
+				UIType = btmType;
+			}
+		}
+		Map<String, Object> map = new HashMap<String,Object>();
+		map.put("btmType", btmType);
+		map.put("UIType", UIType);
+		map.put("tableCode", displayTable);
+		map.put("detailUrl",detailUrl== null?"":detailUrl);
+		map.put("UIContentCode",UIContent);
+		//澧炲姞鏌ヨ鍏宠仈鐨勪笟鍔℃暟鎹�
+		List<ClientLinkObject> linkObjects = processDao.getDataCloInTask("",executionid);
+		StringBuilder sb = new StringBuilder();
+		String thisBusinessOid = "";
+		if(linkObjects!=null && linkObjects.size()>0){
+			Set<String> oidSet = new HashSet<String>();
+			//鍘婚櫎閲嶅
+			for(ClientLinkObject clo : linkObjects){
+				oidSet.add(clo.getToOid());
+			}
+			for(String oidString : oidSet) {
+				sb.append(oidString).append(",");
+			}
+			thisBusinessOid = sb.substring(0,sb.length() -1 );
+			map.put("businessOids", sb.substring(0,sb.length() -1 ));
+		}
+		String executionidOnlyNumber = "";
+		if(executionid.indexOf(".")>-1){
+			executionidOnlyNumber = executionid.substring(executionid.indexOf(".") + 1);
+		}
+		String viewProcessLinkBusinessToken = Md5.md5(executionidOnlyNumber + "${executionsplit}" + thisBusinessOid);
+		map.put("viewProcessLinkBusinessToken",viewProcessLinkBusinessToken);
+		map.put("executionidno",executionidOnlyNumber);
+		//闇�瑕佸幓鏌ヨ杩欎釜娴佺▼浠诲姟鑺傜偣涓婃湁浠�涔堣嚜瀹氫箟鐨勬寜閽�
+		if(tasks != null) {
+
+			String jbpmDeploymentId = processDao.getJbpmDeploymentIdByExecutionId(executionid);
+			if(StringUtils.isNotBlank(jbpmDeploymentId)) {
+				try {
+					byte[] processXml = processDao.getProcessXmlContent(jbpmDeploymentId);
+					InputStream in = new ByteArrayInputStream(processXml);
+					BufferedReader reader = new BufferedReader(new InputStreamReader(in, "utf-8"));
+					SAXReader saxr = new SAXReader();
+					Document doc = saxr.read(reader);
+					Element root = doc.getRootElement();
+					String name = tasks.get(0).getName();
+					if(name.contains("-")){
+						name = name.substring(name.lastIndexOf("-") + 1);
+					}
+					for (Iterator<?> a = root.elementIterator(); a.hasNext();) {
+						Element next = (Element) a.next();
+						String cellName = next.attributeValue(FlowConstants.XMLNAME);
+						if(cellName != null && cellName.equals(name)) {
+							map.put("customerbuttoninfo",next.attributeValue(FlowConstants.URL_PATH));
+							break;
+						}
+					}
+				}catch (Exception e) {
+					throw new VciBaseException("璇诲彇娴佺▼鐨剎ml鍐呭鍑虹幇浜嗛敊璇�");
+				}
+			}
+		}
+		return map;
+	}
+
+	/**
+	 * 鑾峰彇娴佺▼浠诲姟鍏宠仈鐨勪笟鍔℃暟鎹�
+	 * @param taskOid 浠诲姟涓婚敭
+	 * @param processOid 娴佺▼涓婚敭
+	 * @param referColumns 瑕佹樉绀虹殑鍙傜収鐨勫垪
+	 * @return
+	 * @throws VciBaseException
+	 */
+	@Override
+	public DataGrid getDataInProcess(String taskOid,String processOid,String referColumns)
+			throws VciBaseException {
+		if(StringUtils.isBlank(taskOid) && StringUtils.isBlank(processOid)){
+			throw new VciBaseException(msgCodePrefix + "taskOidOrProcessOidNotNull");
+		}
+		return processDao.getDataByTask(taskOid,processOid,referColumns);
+	}
+
+	@Override
+	public DataGrid getHistory(String executionId,
+			boolean showCurrentNode) throws VciBaseException {
+		List<ProcessHistoryVO> allHisTask = processDao.getHistory(executionId);
+		List<ProcessHistoryVO> data = null;
+		if(!showCurrentNode){
+			data = new ArrayList<ProcessHistoryVO>();
+			for(ProcessHistoryVO his : allHisTask){
+				if(StringUtils.isNotEmpty(his.getEndTime())){
+					data.add(his);
+				}
+			}
+		}else{
+			data = allHisTask;
+		}
+		DataGrid dg = new DataGrid();
+		dg.setData(data);
+		dg.setTotal(data.size());
+		dg.setLimit(-1);
+		dg.setPage(1);
+		//涓嶆敮鎸佸垎椤�
+		return dg;
+	}
+
+	@Override
+	public byte[] getProcessPicture(String executionId, String taskOid)
+			throws VciBaseException{
+		List<ProcessTaskVO> task = null;
+		if(StringUtils.isNotBlank(taskOid)){
+			task = processDao.getTaskByOid(taskOid);
+		}
+		if(task!=null && task.size()>0){
+			return processDao.getProcessPicture(task.get(0).getExecutionId(),task.get(0).getName().substring(task.get(0).getName().lastIndexOf("-") + 1));
+		}else{
+			return getProcessTemplatePicture(executionId);
+		}
+	}
+
+	@Override
+	public byte[] getProcessTemplatePicture(String executionId)
+			throws VciBaseException{
+		return processDao.getProcessTemplatePicture(executionId);
+	}
+	
+	@Override
+	public List<ProcessTaskVO> getTaskByOid(String taskOid) throws VciBaseException {
+		return processDao.getTaskByOid(taskOid);
+	}
+
+	@Override
+	public List<ProcessOutcomeVO> getOutCome(String taskOid,
+											 boolean isQueryNextNode) throws VciBaseException{
+		List<ProcessTaskVO> taskList = processDao.getTaskByOid(taskOid);
+		List<ProcessOutcomeVO> allComes = new ArrayList<ProcessOutcomeVO>();
+		if(taskList!=null && taskList.size()>0){
+			ProcessTaskVO task = taskList.get(0);
+			String[] allOutComes = processDao.getAllOutComes(task.getTaskOid());
+			String tureTaskName = task.getName().substring(task.getName().lastIndexOf("-") + 1);//////////////骞冲彴浣跨敤杩欑鏂瑰紡瀛樺偍澶笉绋冲畾浜嗭紝鏁版嵁瀹规槗琚紕涔�
+			for(String oc : allOutComes){
+				ProcessOutcomeVO po = new ProcessOutcomeVO();
+				po.setName(oc);
+				String nextTaskName = processDao.getNextTaskName(task.getExecutionId(),tureTaskName,oc);
+				if(StringUtils.isEmpty(oc)){
+					po.setName("鏈懡鍚嶈矾鐢�");
+				}
+				if(StringUtils.isNotEmpty(nextTaskName)){
+					po.setNextTaskName(nextTaskName);
+					if(isQueryNextNode && !"缁撴潫".equalsIgnoreCase(po.getNextTaskName())){
+						po.setProcessUserVO(processDao.getNodePresideUsersByTask(task.getExecutionId(), po.getNextTaskName()));
+						if(po.getProcessUserVO() == null || po.getProcessUserVO().size()==0){
+							//璇存槑娌℃湁璁剧疆鍊欓�変汉
+							ProcessNodeVO processNodeVO = processDao.getNodePresideUsersByDeploy(processDao.getJbpmDeploymentIdByExecutionId(task.getExecutionId()), po.getNextTaskName());
+							if(processNodeVO !=null){
+								String maxSecretString = processDao.getVariablesInProcess(task.getExecutionId(),WFVariablesKeyConstant.DATA_MAX_SECRET);
+								int maxSecret = WebUtil.getInt(maxSecretString);
+								if(maxSecret ==0){
+									maxSecret = -1;
+								}
+								//闇�瑕佹煡鐪嬩笟鍔℃暟鎹腑鏄惁鏈夊瘑绾э紝鍦ㄥ彂璧锋祦绋嬬殑鏃跺�欏凡缁忔坊鍔�
+								po.setNextNodeUser(getProcessUsersByNode(processNodeVO,maxSecret));
+							}
+						}
+					}
+				}
+				allComes.add(po);
+			}
+		}
+		return allComes;
+	}
+
+	@Override
+	public String getNameFromRule(String btmtype, Map<String, String> data)
+			throws VciBaseException {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	/**
+	 * 鏍¢獙浠诲姟鏄惁鐩稿悓鐨勬祦绋嬫ā鏉垮拰鍚屼竴涓换鍔�
+	 */
+	@Override
+	public boolean checkUseSameTemplate(String taskOids) throws VciBaseException {
+		List<ProcessTaskVO> allTask = getTaskByOid(taskOids);
+		String depolyId = "";
+		String taskName = "";
+		if(allTask!=null){
+			for(ProcessTaskVO task : allTask){
+				String tureTaskName = task.getName().substring(task.getName().lastIndexOf("-") + 1).trim();//////////////骞冲彴浣跨敤杩欑鏂瑰紡瀛樺偍澶笉绋冲畾浜嗭紝鏁版嵁瀹规槗琚紕涔�
+				String thisDepolyId = processDao.getJbpmDeploymentIdByExecutionId(task.getExecutionId()).trim();
+				if(StringUtils.isEmpty(taskName)){
+					taskName = tureTaskName;
+					depolyId = thisDepolyId;
+				}else if(!tureTaskName.equals(taskName) || !thisDepolyId.equals(depolyId)){
+					throw new VciBaseException("[{0}]涓庡叾浠栦换鍔′笉鏄娇鐢ㄧ浉鍚岀殑娴佺▼妯℃澘鎴栬�呬笉鏄悓涓�涓换鍔¤妭鐐�,{1}",new String[]{task.getName(),depolyId});
+				}else if(StringUtils.isEmpty(task.getPrincipal())){
+					throw new VciBaseException("[{0}娌℃湁璁剧疆璐熻矗浜�,涓嶈兘琚壒閲忔墽琛�",new String[]{task.getName()});
+				}
+			}
+		}
+		return true;
+	}
+
+	/**
+	 * 鑾峰彇娴佺▼涓叧鑱旂殑鏁版嵁鍏宠仈鐨勬枃浠�
+	 *
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @param taskOid      浠诲姟涓婚敭
+	 * @param executionId 娴佺▼鎵ц涓婚敭
+	 * @param pageHelper   鍒嗛〉淇℃伅
+	 * @return
+	 */
+	@Override
+	public DataGrid getFilesInProcess(Map<String, String> conditionMap, String taskOid, String executionId,PageHelper pageHelper) throws VciBaseException{
+		List<ClientLinkObject> cloByTask = processDao.getDataCloInTask(taskOid,executionId);
+		if(cloByTask == null || cloByTask.size() == 0){
+			throw new VciBaseException("娌℃湁鍏宠仈鐨勪笟鍔℃暟鎹�");
+		}
+		Map<String,List<String>> busOid_btmMap = new HashMap<String, List<String>>();
+		Set<String> fileOidSet = new HashSet();
+		for(ClientLinkObject clo:cloByTask){
+			if(FileTypeConstants.FILE_DATA_TABLE.equals(clo.getToBTMName())){
+				fileOidSet.add(clo.getToOid());
+			}else {
+				List<String> thisBtmOids = busOid_btmMap.getOrDefault(clo.getToBTMName(),new ArrayList<>());
+				thisBtmOids.add(clo.getToOid());
+				busOid_btmMap.put(clo.getToBTMName(), thisBtmOids);
+			}
+		}
+		DataGrid dg = new DataGrid();
+		List<VciFileObjectVO> fileVOS = new ArrayList<VciFileObjectVO>();
+
+		if(busOid_btmMap.size()>0){
+			List<VciFileObjectVO> finalFileVOS = fileVOS;
+			busOid_btmMap.forEach((btm, oids)->{
+				finalFileVOS.addAll(fileObjectService.batchListFilesByOwnbizs(oids,btm,null));
+			});
+			fileVOS = finalFileVOS;
+		}
+		if(fileOidSet.size()>0){
+			fileVOS.addAll(fileObjectService.listVciFileObjectByOids(fileOidSet));
+		}
+		if(!CollectionUtils.isEmpty(fileVOS)) {
+			Integer userSecret = VciBaseUtil.getCurrentUserSecret();
+			if(userSecret == null){
+				userSecret = UserSecretEnum.NONE.getValue();
+			}
+			if(webProperties.isSecretRight()){
+				Integer finalUserSecret = userSecret;
+				fileVOS = fileVOS.stream().filter(s->{
+					Integer secretGrade = s.getSecretGrade();
+					if(secretGrade == null){
+						secretGrade = DataSecretEnum.NONE.getValue();
+					}
+					return secretGrade >= finalUserSecret;
+				}).collect(Collectors.toList());
+			}
+
+			dg.setData(fileVOS);
+			dg.setTotal(fileVOS.size());
+		}
+		return dg;
+	}
+
+	/**
+	 * 鎵归噺鑾峰彇娴佺▼涓殑鍙橀噺淇℃伅
+	 *
+	 * @param executionId 娴佺▼鏍囪瘑
+	 * @param keys        娴佺▼鍙橀噺
+	 * @return
+	 * @throws VciBaseException
+	 */
+	@Override
+	public Map<String, String> getVariablesInProcess(String executionId, String keys) throws VciBaseException {
+		WebUtil.alertNotNull(executionId,"娴佺▼鏍囪瘑",keys,"瑕佹煡璇㈢殑鍙橀噺鍚嶇О");
+		String[] keyArray = keys.split(",");
+		Map<String,String> variableInfoMap = new HashMap<String, String>();
+		for(String key : keyArray){//骞冲彴涓嶈兘鎵归噺鑾峰彇锛�
+			String value = processDao.getVariablesInProcess(executionId,key);
+			if(value == null){
+				value = "";
+			}
+			variableInfoMap.put(key,value);
+		}
+		return variableInfoMap;
+	}
+
+	/**
+	 * 鏍规嵁涓氬姟鏁版嵁锛岃幏鍙栨鍦ㄦ墽琛岀殑娴佺▼
+	 *
+	 * @param bussinessOid 涓氬姟绫诲瀷鏁版嵁
+	 * @param btmName      涓氬姟绫诲瀷鍚�
+	 * @return 娴佺▼鐨勬墽琛宱id
+	 * @throws VciBaseException
+	 */
+	@Override
+	public List<String> listExecutingProcessByBussinessOid(String bussinessOid, String btmName) throws VciBaseException {
+		WebUtil.alertNotNull(bussinessOid,"涓氬姟绫诲瀷鏁版嵁",btmName,"涓氬姟绫诲瀷鍚嶇О");
+		List<ProcessInstanceVO> processInstanceList = processDao.listExecutingProcessByBussinessOid(bussinessOid,btmName);
+		List<String> processExecutionIdList = new ArrayList<String>();
+		if(processInstanceList!=null && processInstanceList.size()>0){
+			for(ProcessInstanceVO instance : processInstanceList){
+				processExecutionIdList.add(instance.getExecutionId());
+			}
+		}
+		return processExecutionIdList;
+	}
+
+	/**
+	 * 鑾峰彇瀹℃壒鎰忚鏂囦欢
+	 *
+	 * @param taskOids 浠诲姟鐨勪富閿�
+	 * @return 鏂囦欢鐨勪俊鎭�
+	 */
+	@Override
+	public DataGrid<VciFileObjectVO> listAuditSuggestFile(String taskOids) {
+		WebUtil.alertNotNull(taskOids,"娴佺▼浠诲姟涓婚敭");
+		DataGrid dataGrid = getDataInProcess(taskOids,null,"");
+		if(dataGrid == null || CollectionUtils.isEmpty(dataGrid.getData())){
+			throw new VciBaseException("娴佺▼鐨勪笟鍔℃暟鎹槸绌虹殑锛屾暟鎹敊璇�");
+		}
+		String btwName = "";
+		List<String> businessDataOidList = new ArrayList<String>();
+		List<Map> businessDataList = (List<Map>)dataGrid.getData();
+		for(Map businessData : businessDataList){
+			if(StringUtils.isBlank(btwName)){
+				btwName = (String)businessData.get("btmname");
+			}
+			businessDataOidList.add((String)businessData.get("oid"));
+		}
+		List<VciFileObjectVO> fileObjectVOS = new ArrayList<>();
+		for(String oid : businessDataOidList){
+			List<VciFileObjectVO> tempFileVOS = fileObjectService.listFilesByOwnbiz(oid, btwName, "processAuditSuggest");
+			if(!CollectionUtils.isEmpty(tempFileVOS)){
+				fileObjectVOS.addAll(tempFileVOS);
+			}
+		}
+		dataGrid = new DataGrid();
+		dataGrid.setData(fileObjectVOS);
+		dataGrid.setTotal(fileObjectVOS.size());
+		return dataGrid;
+	}
+
+	/**
+	 * 鍙傜収娴佺▼鍒嗙被
+	 *
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @param pageHelper   鍒嗛〉瀵硅薄
+	 * @return 鍒嗙被鐨勪俊鎭�
+	 */
+	@Override
+	public DataGrid<ProcessClassifyVO> referGridProcessClassify(Map<String, String> conditionMap, PageHelper pageHelper) {
+		if (pageHelper == null) {
+			pageHelper = new PageHelper(-1);
+		}
+		//鏈夐渶瑕佽浆鎹㈢殑灞炴��
+		pageHelper.addDefaultAsc("plname");
+		VciQueryWrapperForDO queryWrapperForDO = new VciQueryWrapperForDO(conditionMap, WFProcessClassifyDO.class,pageHelper);
+		queryWrapperForDO.setConditionMap(queryWrapperForDO.switchConditionMap());
+		queryWrapperForDO.wrapperSql();
+		List<WFProcessClassifyDO> doList = boService.selectByQueryWrapper(queryWrapperForDO,WFProcessClassifyDO.class);
+		DataGrid<ProcessClassifyVO> dataGrid=new DataGrid<ProcessClassifyVO>();
+		if (!CollectionUtils.isEmpty(doList)) {
+			dataGrid.setData(processDao.processClassifyDO2VOs(doList));
+			dataGrid.setTotal(VciBaseUtil.getInt(String.valueOf(boService.countByQueryWrapper(queryWrapperForDO,WFProcessClassifyDO.class))));
+		}
+		return dataGrid;
+	}
+
+	/**
+	 * 鍙傜収娴佺▼鐨勬ā鏉�
+	 * @param processClassifyId 娴佺▼鍒嗙被鐨勫悕绉�
+	 * @param name 妯℃澘鐨勫悕绉�
+	 * @return 妯℃澘鐨勬樉绀哄璞�
+	 */
+	@Override
+	public DataGrid<ProcessTemplateVO> referGridProcessTemplate(String processClassifyId, String name){
+		if(StringUtils.isBlank(processClassifyId)){
+			return new DataGrid<>();
+		}
+		List<ProcessTemplateVO> templateVOS = processDao.getTemplatesByType(processClassifyId, name, false);
+		DataGrid<ProcessTemplateVO> dataGrid = new DataGrid<>();
+		dataGrid.setData(templateVOS);
+		dataGrid.setTotal(templateVOS ==null?0:templateVOS.size());
+		return dataGrid;
+	}
+
+	/**
+	 * 鍙傜収娴佺▼鍒嗙被鏍�
+	 *
+	 * @param queryObject 鏌ヨ瀵硅薄
+	 * @return 鏍戠殑淇℃伅
+	 */
+	@Override
+	public List<Tree> referTreeProcessClassify(TreeQueryObject queryObject) {
+		PageHelper pageHelper = new PageHelper(-1);
+		//鏈夐渶瑕佽浆鎹㈢殑灞炴��
+		pageHelper.addDefaultAsc("plname");
+		VciQueryWrapperForDO queryWrapperForDO = new VciQueryWrapperForDO(queryObject.getConditionMap(), WFProcessClassifyDO.class,pageHelper);
+		queryWrapperForDO.setConditionMap(queryWrapperForDO.switchConditionMap());
+		queryWrapperForDO.wrapperSql();
+		List<WFProcessClassifyDO> doList = boService.selectByQueryWrapper(queryWrapperForDO,WFProcessClassifyDO.class);
+		List<Tree> treeList = new ArrayList<>();
+		if(!CollectionUtils.isEmpty(doList)){
+			doList.stream().forEach(classifyDO->{
+				Tree tree = new Tree();
+				tree.setOid(classifyDO.getOid());
+				tree.setText(classifyDO.getName());
+				Map<String,String> attributeMap = WebUtil.objectToMapString(classifyDO);
+				tree.setAttributes(attributeMap);
+				tree.setLeaf(true);
+				treeList.add(tree);
+			});
+		}
+		return treeList;
+	}
+
+	/**
+	 * 浣跨敤妯℃澘鐨勪富閿幏鍙�
+	 *
+	 * @param id 妯℃澘鐨刱ey
+	 * @param revisionValue 鐗堟湰鐨勫��
+	 * @return 妯℃澘鐨勬樉绀哄璞�
+	 */
+	@Override
+	public ProcessTemplateVO getTemplateById(String id,String revisionValue) {
+		VciBaseUtil.alertNotNull(id,"妯℃澘鐨刱ey",revisionValue,"鐗堟湰鐨勫��");
+		String deploymentId = processDao.getJbpmDeploymentId(id + "-" + revisionValue);
+		if(StringUtils.isBlank(deploymentId)){
+			throw new VciBaseException("娴佺▼妯℃澘鍦ㄧ郴缁熼噷涓嶅瓨鍦�,{0}-{1}",new String[]{id,revisionValue});
+		}
+		return processDao.getTemplateByDeployId(deploymentId);
+	}
+
+	/**
+	 * 鑾峰彇鏌愪釜鐢ㄦ埛鐨勫緟鍔炰换鍔′釜鏁�
+	 *
+	 * @param username 鐢ㄦ埛鐨勭紪鍙�
+	 * @return 鎬绘暟
+	 */
+	@Override
+	public int getUndoTaskCount(String username) {
+		return processDao.countUndoTaskByUsername(username);
+	}
+
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WebSecretServiceImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WebSecretServiceImpl.java
new file mode 100644
index 0000000..459f4ca
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/WebSecretServiceImpl.java
@@ -0,0 +1,379 @@
+package com.vci.web.service.impl;
+import com.vci.frameworkcore.compatibility.SmUserQueryServiceI;
+import com.vci.frameworkcore.pagemodel.SmUserVO;
+import com.vci.starter.web.enumpck.DataSecretEnum;
+import com.vci.starter.web.enumpck.UserSecretEnum;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.web.constant.EnumIdConstant;
+import com.vci.web.pageModel.KeyValue;
+import com.vci.web.properties.WebProperties;
+import com.vci.web.service.WebBoServiceI;
+import com.vci.web.service.OsEnumServiceI;
+import com.vci.web.service.WebSecretServiceI;
+import com.vci.web.util.WebUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import plm.bs.bom.clientobject.ClientBusinessObject;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import static com.vci.frameworkcore.constant.FrameWorkBusLangCodeConstant.DATA_ID_NOT_EXIST;
+
+/**
+ * 瀵嗙骇鐨勬湇鍔�
+ * @author weidy
+ * @date 2021-2-16
+ */
+@Service
+public class WebSecretServiceImpl implements WebSecretServiceI {
+
+    /**
+     * 鏋氫妇鐨勬湇鍔�
+     */
+    @Autowired(required = false)
+    @Lazy
+    private OsEnumServiceI enumService;
+
+    /**
+     * 鐢ㄦ埛鏌ヨ鏈嶅姟
+     */
+    @Autowired
+    private SmUserQueryServiceI userQueryService;
+
+    /**
+     * 涓氬姟绫诲瀷鏈嶅姟
+     */
+    @Autowired
+    private WebBoServiceI boService;
+
+    /**
+     * 灞炴�х殑瀵硅薄
+     */
+    @Autowired
+    private WebProperties properties;
+
+    /**
+     * 鑾峰彇鐢ㄦ埛瀵嗙骇鐨勬渶灏忓��
+     *
+     * @return 瀵嗙骇鐨勫��
+     * @throws VciBaseException 鏌ヨ鍑洪敊浼氭姏鍑哄紓甯�
+     */
+    @Override
+    public int getMinUserSecret() throws VciBaseException {
+        List<KeyValue> enumKeyValueList = enumService.getEnum(EnumIdConstant.USERSECRET_ENUMNAME);
+        //閲嶆柊璁剧疆鏋氫妇鐨勫��
+        if(!CollectionUtils.isEmpty(enumKeyValueList)){
+            List<KeyValue> keyValues = enumKeyValueList.stream().sorted((a, b) -> ((Integer) VciBaseUtil.getInt(a.getKey())).compareTo((Integer) VciBaseUtil.getInt(b.getKey()))).collect(Collectors.toList());
+            for(int i = 0 ; i < keyValues.size() ; i++){
+                KeyValue keyValue = keyValues.get(i);
+                if(i ==0){
+                    UserSecretEnum.NONE.setValue(VciBaseUtil.getInt(keyValue.getKey()));
+                    UserSecretEnum.NONE.setText(keyValue.getValue());
+                }else if(i ==1){
+                    UserSecretEnum.SECRET.setValue(VciBaseUtil.getInt(keyValue.getKey()));
+                    UserSecretEnum.SECRET.setText(keyValue.getValue());
+                }else{
+                    UserSecretEnum.PRIVACY.setValue(VciBaseUtil.getInt(keyValue.getKey()));
+                    UserSecretEnum.PRIVACY.setText(keyValue.getValue());
+                }
+            }
+        }
+        return getMinValueInKeyValueList(enumKeyValueList,UserSecretEnum.NONE.getValue());
+    }
+
+    /**
+     * 鑾峰彇鏋氫妇涓殑鏈�灏忓��
+     * @param enumKeyValueList 鏋氫妇K-V鍒楄〃
+     * @param minValue 鏈�灏忓��
+     * @return 鏈�灏忓��
+     */
+    private int getMinValueInKeyValueList(  List<KeyValue> enumKeyValueList,int minValue){
+        for(KeyValue ec : enumKeyValueList){
+            int value = VciBaseUtil.getInt(ec.getKey());
+            if(minValue> value){
+                minValue = value;
+            }
+        }
+        return minValue;
+    }
+
+    /**
+     * 鑾峰彇鏁版嵁瀵嗙骇鐨勯粯璁ゅ��
+     *
+     * @return 鏈�灏忓瘑绾х殑鍊�
+     * @throws VciBaseException  鏌ヨ鍑洪敊浼氭姏鍑哄紓甯�
+     */
+    @Override
+    public int getMinDataSecret() throws VciBaseException {
+        List<KeyValue> enumKeyValueList = enumService.getEnum(EnumIdConstant.DATASECRET_ENUMNAME);
+        //閲嶆柊璁剧疆鏋氫妇鐨勫��
+        if(!CollectionUtils.isEmpty(enumKeyValueList)){
+            List<KeyValue> keyValues = enumKeyValueList.stream().sorted((a, b) -> ((Integer) VciBaseUtil.getInt(a.getKey())).compareTo((Integer) VciBaseUtil.getInt(b.getKey()))).collect(Collectors.toList());
+            for(int i = 0 ; i < keyValues.size() ; i++){
+                 KeyValue keyValue = keyValues.get(i);
+                 if(i ==0){
+                     DataSecretEnum.NONE.setValue(VciBaseUtil.getInt(keyValue.getKey()));
+                     DataSecretEnum.NONE.setText(keyValue.getValue());
+                 }else if(i ==1){
+                     DataSecretEnum.INNER.setValue(VciBaseUtil.getInt(keyValue.getKey()));
+                     DataSecretEnum.INNER.setText(keyValue.getValue());
+                 }else if(i ==2){
+                     DataSecretEnum.SECRET.setValue(VciBaseUtil.getInt(keyValue.getKey()));
+                     DataSecretEnum.SECRET.setText(keyValue.getValue());
+                 }else{
+                     DataSecretEnum.PRIVACY.setValue(VciBaseUtil.getInt(keyValue.getKey()));
+                     DataSecretEnum.PRIVACY.setText(keyValue.getValue());
+                 }
+            }
+        }
+        return getMinValueInKeyValueList(enumKeyValueList,DataSecretEnum.NONE.getValue());
+    }
+
+    /**
+     * 鑾峰彇IP瀵嗙骇鐨勯粯璁ゅ��
+     *
+     * @return 鏈�灏忓瘑绾х殑鍊�
+     * @throws VciBaseException 鏌ヨ鍑洪敊浼氭姏鍑哄紓甯�
+     */
+    @Override
+    public int getMinIpSecret() throws VciBaseException {
+        List<KeyValue> enumKeyValueList = enumService.getEnum(EnumIdConstant.IPSECRET_ENUMNAME);
+        return getMinValueInKeyValueList(enumKeyValueList,10);
+    }
+
+    /**
+     * 鑾峰彇鐢ㄦ埛瀵嗙骇
+     *
+     * @param userId 鐢ㄦ埛鍚�
+     * @return 鐢ㄦ埛瀵嗙骇鐨勫�硷紝濡傛灉娌℃湁瀵嗙骇锛岄粯璁や负鏈�灏忓瘑绾�
+     * @throws VciBaseException 鏌ヨ鍑洪敊浼氭姏鍑哄紓甯�
+     */
+    @Override
+    public int getUserSecret(String userId) throws VciBaseException {
+        WebUtil.alertNotNull(userId,"鐢ㄦ埛鍚�");
+        SmUserVO userVO = userQueryService.getUserByUserId(userId);
+        if(userVO == null || StringUtils.isBlank(userVO.getOid())){
+            throw new VciBaseException(DATA_ID_NOT_EXIST,new String[]{userId});
+        }
+        return userVO.getSecretGrade()==null?getMinUserSecret():userVO.getSecretGrade();
+    }
+
+    /**
+     * 鑾峰彇鐢ㄦ埛瀵嗙骇
+     *
+     * @param userVO 鐢ㄦ埛鐨勫璞�
+     * @return 瀵嗙骇锛屼笉瀛樺湪鐨勬椂鍊欎负鏈�浣庡瘑绾�
+     * @throws VciBaseException 鏌ヨ鍑洪敊浼氭姏鍑哄紓甯�
+     */
+    @Override
+    public int getUserSecret(SmUserVO userVO) throws VciBaseException {
+        if(userVO == null || StringUtils.isBlank(userVO.getOid())){
+            throw new VciBaseException(DATA_ID_NOT_EXIST,new String[0]);
+        }
+        return userVO.getSecretGrade()==null?getMinUserSecret():userVO.getSecretGrade();
+    }
+
+
+    /**
+     * 鏍¢獙褰撳墠鐢ㄦ埛鏄惁鏈夋潈闄愯闂暟鎹�
+     *
+     * @param secret 鏁版嵁鐨勫瘑绾�
+     * @return true琛ㄧず鍙互璁块棶
+     */
+    @Override
+    public boolean checkDataSecret(int secret) {
+        return checkDataSecret(secret,WebUtil.getCurrentUserSecret()==null?getMinUserSecret():WebUtil.getCurrentUserSecret());
+    }
+
+    /**
+     * 鑾峰彇鏁版嵁鏉冮檺
+     * @param secret 鏁版嵁鐨勫瘑绾х殑鍊�
+     * @return 鏁版嵁瀵嗙骇
+     */
+    private DataSecretEnum dataSecretForValue(int secret){
+        for(DataSecretEnum de : DataSecretEnum.values()){
+            if(de.getValue() == secret){
+                return de;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 鐢ㄦ埛鐨勫瘑绾�
+     * @param userSecret 鐢ㄦ埛鐨勫瘑绾�
+     * @return 瀵嗙骇鐨勫璞�
+     */
+    private UserSecretEnum userSecretForValue(int userSecret){
+        for(UserSecretEnum ue : UserSecretEnum.values()){
+            if(ue.getValue() == userSecret){
+                return  ue;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 鏍¢獙鐢ㄦ埛鐨勫瘑绾ф槸鍚︽槸鍚︽湁鏉冮檺璁块棶鏁版嵁
+     *
+     * @param secret     鏁版嵁鐨勫瘑绾�
+     * @param userSecret 鐢ㄦ埛瀵嗙骇
+     * @return true琛ㄧず鍙互璁块棶
+     */
+    @Override
+    public boolean checkDataSecret(int secret, int userSecret){
+        //鍙兘琚浆鎹簡涓�
+        DataSecretEnum de = dataSecretForValue(secret);
+        if(de == null){
+            de = DataSecretEnum.NONE;
+        }
+        UserSecretEnum ue = userSecretForValue(userSecret);
+        if(ue == null){
+            ue = UserSecretEnum.NONE;
+        }
+        int reaySecret = 0;
+        switch (de){
+            case NONE:
+                reaySecret=1;
+                break;
+            case INNER:
+                reaySecret = 2;
+                break;
+            case SECRET:
+                reaySecret = 3;
+                break;
+            default:
+                reaySecret = 4;
+                break;
+        }
+
+        int userReaySecret = 0;
+        switch (ue){
+            case NONE:
+                userReaySecret = 1;
+                break;
+            case SECRET:
+                userReaySecret = 3;
+                break;
+            default:
+                userReaySecret = 4;
+                break;
+        }
+        if(reaySecret> userReaySecret){
+            return false;
+        }else{
+            return true;
+        }
+    }
+
+    /**
+     * 鏍规嵁鐢ㄦ埛鍚嶆潵鏍¢獙鏁版嵁瀵嗙骇
+     *
+     * @param secret 鏁版嵁鐨勫瘑绾�
+     * @param userId 鐢ㄦ埛鍚�
+     * @return true琛ㄧず鍙互璁块棶
+     * @throws VciBaseException 鏌ヨ鍑洪敊浼氭姏鍑哄紓甯�
+     */
+    @Override
+    public boolean checkDataSecret(int secret, String userId) throws VciBaseException {
+        return checkDataSecret(secret,getUserSecret(userId));
+    }
+
+    /**
+     * 鏍规嵁鐢ㄦ埛瀵硅薄鏉ユ牎楠屾暟鎹瘑绾�
+     *
+     * @param secret 鏁版嵁瀵嗙骇
+     * @param userVO 鐢ㄦ埛鐨勫璞�
+     * @return true琛ㄧず鍙互璁块棶
+     */
+    @Override
+    public boolean checkDataSecret(int secret, SmUserVO userVO)  {
+        return checkDataSecret(secret,getUserSecret(userVO));
+    }
+
+    /**
+     * 鑾峰彇IP鍦板潃鐨勫瘑绾�
+     *
+     * @param ip ip鍦板潃
+     * @return 瀵嗙骇鐨勫��
+     * @throws VciBaseException 鏌ヨ鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public int getIpSecret(String ip) throws VciBaseException {
+        if(StringUtils.isBlank(ip)){
+            return getMinIpSecret();
+        }
+        Map<String,String> conditionMap = new HashMap<String, String>();
+        conditionMap.put("startip",ip.trim());
+
+        List<ClientBusinessObject> ipCbos = boService.queryCBO(EnumIdConstant.IPSECRET_BTMNAME,conditionMap,null, Arrays.asList(new String[]{"ipsecret"}));
+        int ipSecret = 0;
+        if(ipCbos!=null&& ipCbos.size()>0){
+            ipSecret = WebUtil.getInt(ipCbos.get(0).getAttributeValue("ipsecret"));
+        }
+        if(ipSecret == 0){
+            ipSecret = getMinIpSecret();
+        }
+        return ipSecret;
+    }
+
+    /**
+     * 妫�鏌ユ満鍣ㄥ瘑绾�
+     *
+     * @param ipSecret   鏈哄櫒瀵嗙骇
+     * @param userSecret 鐢ㄦ埛鐨勫瘑绾�
+     * @return true琛ㄧず璁稿彲
+     */
+    @Override
+    public boolean checkIpSecret(int ipSecret, int userSecret)  {
+        if(ipSecret> userSecret){
+            return false;
+        }else{
+            return true;
+        }
+    }
+
+    /**
+     * 妫�鏌ュ綋鍓嶇敤鎴锋槸鍚︾鍚堟満鍣ㄥ瘑绾�
+     *
+     * @param ipSecret 鏈哄櫒瀵嗙骇
+     * @return true琛ㄧず璁稿彲
+     */
+    @Override
+    public boolean checkIpSecret(int ipSecret) {
+        return checkIpSecret(ipSecret,WebUtil.getCurrentUserSecret()==null?getMinUserSecret():WebUtil.getCurrentUserSecret());
+    }
+
+    /**
+     * 鏍¢獙鎸囧畾ip鍜岀敤鎴锋槸鍚︾鍚堟満鍣ㄥ瘑绾�
+     *
+     * @param ip     ip鍦板潃
+     * @param userId 鐢ㄦ埛鍚�
+     * @return true琛ㄧず璁稿彲
+     * @throws VciBaseException 鏌ヨ鍑洪敊浼氭姏鍑哄紓甯�
+     */
+    @Override
+    public boolean checkIpSecret(String ip, String userId) throws VciBaseException {
+        return checkIpSecret(getIpSecret(ip),getUserSecret(userId));
+    }
+
+    /**
+     * 鏍¢獙鎸囧畾IP鍜岀敤鎴峰璞$鍚堟満鍣ㄥ瘑绾�
+     *
+     * @param ip         ip鍦板潃
+     * @param userVO 鐢ㄦ埛瀵硅薄
+     * @return true琛ㄧず璁稿彲
+     */
+    @Override
+    public boolean checkIpSecret(String ip, SmUserVO userVO) {
+        return checkIpSecret(getIpSecret(ip),getUserSecret(userVO));
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/BusAnnotationUtil.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/BusAnnotationUtil.java
new file mode 100644
index 0000000..af60ece
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/BusAnnotationUtil.java
@@ -0,0 +1,55 @@
+package com.vci.web.util;
+
+import com.vci.starter.web.annotation.bus.VciLoginBefore;
+import com.vci.starter.web.annotation.bus.VciLoginPlugin;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.util.ApplicationContextProvider;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.util.CollectionUtils;
+
+import java.lang.reflect.Method;
+import java.util.Map;
+
+/**
+ * 涓氬姟鐨勬敞瑙e伐鍏风被
+ * @author weidy
+ * @date 2022-04-12
+ */
+public class BusAnnotationUtil {
+
+    /**
+     * 鏃ュ織
+     */
+    private static Logger logger = LoggerFactory.getLogger(BusAnnotationUtil.class);
+
+    /**
+     * 閫氳繃娉ㄨВ鍘昏皟鐢ㄥ搴旂殑鏂规硶
+     * @param classAnnotation 绫荤殑娉ㄨВ
+     * @param methodAnnotation 鏂规硶鐨勬敞瑙�
+     * @param args 鍙傛暟
+     */
+    public static void callForAnnotation(Class classAnnotation,Class methodAnnotation,Object ... args){
+        //鍦ㄧ櫥褰曚箣鍓嶏紝鐪嬬湅鏄惁鏈夋彃浠�
+        Map<String, Object> beanMap = ApplicationContextProvider.getApplicationContext().getBeansWithAnnotation(classAnnotation);
+        if (!CollectionUtils.isEmpty(beanMap)) {
+            beanMap.forEach((k, v) -> {
+                Method[] methods = v.getClass().getSuperclass().getDeclaredMethods();
+                if (methods != null && methods.length > 0) {
+                    for (Method method : methods) {
+                        if (method.isAnnotationPresent(methodAnnotation)) {
+                            try {
+                                method.invoke(v, args);
+                            } catch (Throwable e) {
+                                if (logger.isErrorEnabled()) {
+                                    logger.error("璋冪敤鎻掍欢鍑洪敊", e);
+                                }
+                                throw new VciBaseException("璋冪敤鎻掍欢鍑洪敊,{0},{1}", new String[]{v.getClass().getName(), method.getName()}, e);
+                            }
+                        }
+                    }
+                }
+            });
+        }
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/OsScanAnnotationTool.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/OsScanAnnotationTool.java
new file mode 100644
index 0000000..446f3b2
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/OsScanAnnotationTool.java
@@ -0,0 +1,777 @@
+package com.vci.web.util;
+
+import com.vci.starter.web.annotation.*;
+import com.vci.starter.web.enumpck.BaseEnum;
+import com.vci.starter.web.enumpck.BaseEnumInt;
+import com.vci.starter.web.enumpck.VciFieldTypeEnum;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.util.ApplicationContextProvider;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.starter.web.wrapper.VciQueryWrapperForDO;
+import com.vci.web.bo.BtmOrLinkProcessAttributeInfo;
+import com.vci.web.constant.FieldConstant;
+import com.vci.web.dto.*;
+import com.vci.web.service.WebBtmIOServiceI;
+import org.apache.commons.lang3.StringUtils;
+import org.reflections.Reflections;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+
+import java.lang.reflect.Field;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.security.Timestamp;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 鎵弿娉ㄨВ宸ュ叿--鎴戜滑鍙傝�冪殑鏄钩鍙�2021鐗堟湰涓殑鎵弿宸ュ叿锛�
+ * 灏嗘壂鎻忓寘鍚簡鐢熷懡鍛ㄦ湡锛屾灇涓撅紝涓氬姟绫诲瀷锛岄摼鎺ョ被鍨嬬殑瀵硅薄銆傚苟淇濆瓨鍒板璞℃湇鍔′腑
+ * @author weidy
+ * @date 2019/10/31 8:49 AM
+ */
+@Component
+public class OsScanAnnotationTool {
+
+
+    /**
+     * 瀵煎叆鐨勬湇鍔�
+     */
+    @Autowired
+    private WebBtmIOServiceI btmIOService;
+
+    /**
+     * 鏃ュ織
+     */
+    private Logger logger = LoggerFactory.getLogger(getClass());
+
+    /**
+     * 鏄惁妫�鏌ユ暟鎹簱琛ㄧ殑鍙傛暟鍚嶅瓧
+     */
+    public static final String CHECK_TABLE_EXIST = "check-table-exist";
+
+
+    /**
+     * 鎵弿瀵硅薄娉ㄨВ鍚庡埌瀵硅薄鏈嶅姟涓�
+     * @param packageName 鍖呭悕锛屽鏋滀负绌哄垯鑷姩鎵綱ciPlatformScan娉ㄨВ閲岀殑鍐呭锛屽鏋滄病鏈夊垯鎶涘嚭寮傚父
+     * @throws VciBaseException 娉ㄨВ鐨勫唴瀹规垨鑰呭弬鏁版湁閿欒鐨勬椂鍊欐姏鍑哄紓甯�
+     */
+    public void scanAnnotation2OSServer(String packageName) throws VciBaseException {
+        doScanAnnotation2OSServer(VciBaseUtil.str2List(packageName),null,null);
+    }
+
+    /**
+     * 鎵弿瀵硅薄娉ㄨВ鍚庡埌瀵硅薄鏈嶅姟涓�
+     * @param packageName 鍖呭悕锛屽鏋滀负绌哄垯鑷姩鎵綱ciPlatformScan娉ㄨВ閲岀殑鍐呭锛屽鏋滄病鏈夊垯鎶涘嚭寮傚父
+     * @param entityNames 鎸囧畾瀹炰綋绫诲悕,蹇呴』鍏ㄨ矾寰�
+     * @throws VciBaseException 娉ㄨВ鐨勫唴瀹规垨鑰呭弬鏁版湁閿欒鐨勬椂鍊欐姏鍑哄紓甯�
+     */
+    public void scanAnnotation2OSServer(String packageName, String entityNames) throws VciBaseException{
+        doScanAnnotation2OSServer(VciBaseUtil.str2List(packageName),VciBaseUtil.str2List(entityNames),null);
+    }
+
+    /**
+     * 鎵弿瀵硅薄娉ㄨВ鍚庡埌瀵硅薄鏈嶅姟涓�
+     * @param packageName 鍖呭悕锛屽鏋滀负绌哄垯鑷姩鎵綱ciPlatformScan娉ㄨВ閲岀殑鍐呭锛屽鏋滄病鏈夊垯鎶涘嚭寮傚父
+     * @param entityNames 鎸囧畾瀹炰綋绫诲悕,蹇呴』鍏ㄨ矾寰�
+     * @param unScanEntityNames 涓嶆壂鎻忕殑瀹炰綋绫诲悕锛屽繀椤绘槸鍏ㄨ矾寰�
+     * @throws VciBaseException 娉ㄨВ鐨勫唴瀹规垨鑰呭弬鏁版湁閿欒鐨勬椂鍊欐姏鍑哄紓甯�
+     */
+    public void scanAnnotation2OSServer(String packageName, String entityNames, String unScanEntityNames) throws VciBaseException{
+        doScanAnnotation2OSServer(VciBaseUtil.str2List(packageName),VciBaseUtil.str2List(entityNames),VciBaseUtil.str2List(unScanEntityNames));
+    }
+
+    /**
+     * 鏍规嵁鍖呭悕鑾峰彇鍏朵腑鎵�鏈夌殑瀵硅薄
+     * @param lifeCycleClassList 鐢熷懡鍛ㄦ湡绫诲垪琛�
+     * @param enumClassList 鏋氫妇绫诲垪琛�
+     * @param btmTypeClassList 涓氬姟绫诲瀷绫诲垪琛�
+     * @param linkTypeClassList 閾炬帴绫诲瀷绫� 鍒楄〃
+     * @param packageNameList 鍖呭叏璺緞,濡傛灉娌℃湁璁剧疆鏃惰嚜鍔ㄨ幏鍙朧ciPlatformScan娉ㄨВ
+     */
+    private void scanClassForPackage(List<Class<?>> lifeCycleClassList, List<Class<?>> enumClassList, List<Class<?>> btmTypeClassList, List<Class<?>> linkTypeClassList, Collection<String> packageNameList){
+        //涓轰簡涓嶉噸澶嶉�犺疆瀛愶紝閲囩敤浜唎rg.reflections:reflections
+        if(CollectionUtils.isEmpty(packageNameList)){
+            List<String> tempPackageList = new ArrayList<String>();
+            //浠巗pring閲岃幏鍙栧寘鍚簡VciPlatformScan鐨刡ean
+            Map<String, Object> withBeanMap = ApplicationContextProvider.getApplicationContext().getBeansWithAnnotation(VciPlatformScan.class);
+            if(!CollectionUtils.isEmpty(withBeanMap)){
+                for(String beanName : withBeanMap.keySet()){
+                    Object bean = withBeanMap.get(beanName);
+                    if(bean.getClass().isAnnotationPresent(VciPlatformScan.class)){
+                        VciPlatformScan vciPlatformScan = bean.getClass().getAnnotation(VciPlatformScan.class);
+                        String[] values = vciPlatformScan.value();
+                        if(values !=null && values.length>0){
+                            for(String p : values){
+                                tempPackageList.add(p);
+                            }
+                        }
+                    }
+                }
+            }
+            packageNameList = tempPackageList;
+        }
+        for(String packName:packageNameList){
+            Reflections reflections=new Reflections(packName);
+            //鐢熷懡鍛ㄦ湡鐩稿叧
+            Set<Class<?>> vciLifeCycleSet = reflections.getTypesAnnotatedWith(VciLifeCycle.class);
+            if(!CollectionUtils.isEmpty(vciLifeCycleSet)){
+                vciLifeCycleSet.stream().forEach(classObj->{
+                    if(!classObj.isAnnotationPresent(Transient.class)){
+                        lifeCycleClassList.add(classObj);
+                    }
+                });
+            }
+            //鏋氫妇鐩稿叧
+            Set<Class<?>> vciEnumSet = reflections.getTypesAnnotatedWith(VciEnum.class);
+            if(!CollectionUtils.isEmpty(vciEnumSet)){
+                vciEnumSet.stream().forEach(classObj->{
+                    if(!classObj.isAnnotationPresent(Transient.class)){
+                        enumClassList.add(classObj);
+                    }
+                });
+            }
+            //涓氬姟绫诲瀷鐩稿叧
+            Set<Class<?>> vciBtmTypeSet = reflections.getTypesAnnotatedWith(VciBtmType.class);
+            if(!CollectionUtils.isEmpty(vciBtmTypeSet)){
+                //闇�瑕佺湅鐪嬭繖浜涗笟鍔$被鍨嬫槸鍚︽坊鍔犱簡@Transient娉ㄨВ锛屽洜涓鸿繖绉嶈鏄庢槸骞冲彴鐨勫師鏈殑涓氬姟绫诲瀷
+                vciBtmTypeSet.stream().forEach(classObj ->{
+                    if(!classObj.isAnnotationPresent(Transient.class)){
+                        btmTypeClassList.add(classObj);
+                    }
+                });
+            }
+            //閾炬帴绫诲瀷鐩稿叧
+            Set<Class<?>> vciLinkTypeSet = reflections.getTypesAnnotatedWith(VciLinkType.class);
+            if(!CollectionUtils.isEmpty(vciLinkTypeSet)){
+                vciLinkTypeSet.stream().forEach(classObj->{
+                    if(!classObj.isAnnotationPresent(Transient.class)){
+                        linkTypeClassList.add(classObj);
+                    }
+                });
+            }
+        }
+    }
+
+    /**
+     * 鏍规嵁瀹炰綋绫荤殑鍚嶇О鑾峰彇瀵瑰簲鐨刢lass銆傛敞鎰忓疄浣撶被鍚嶇О蹇呴』鏄叏璺緞
+     * @param lifeCycleClassList 鐢熷懡鍛ㄦ湡绫诲垪琛�
+     * @param enumClassList 鏋氫妇绫诲垪琛�
+     * @param btmTypeClassList 涓氬姟绫诲瀷绫诲垪琛�
+     * @param linkTypeClassList 閾炬帴绫诲瀷绫� 鍒楄〃
+     * @param entityNameList 瀹炰綋绫诲叏璺緞
+     */
+    private void scanClassForEntity(List<Class<?>> lifeCycleClassList, List<Class<?>> enumClassList, List<Class<?>> btmTypeClassList, List<Class<?>> linkTypeClassList, Collection<String> entityNameList) throws VciBaseException{
+        if(!CollectionUtils.isEmpty(entityNameList)){
+            for(String entityName:entityNameList){
+                try {
+                    Class entityClass = Class.forName(entityName);
+                    if(entityClass.isAnnotationPresent(VciBtmType.class) && !entityClass.isAnnotationPresent(Transient.class)){
+                        btmTypeClassList.add(entityClass);
+                    }
+                    if(entityClass.isAnnotationPresent(VciLifeCycle.class)){
+                        lifeCycleClassList.add(entityClass);
+                    }
+                    if(entityClass.isAnnotationPresent(VciEnum.class)){
+                        enumClassList.add(entityClass);
+                    }
+                    if(entityClass.isAnnotationPresent(VciLinkType.class)){
+                        linkTypeClassList.add(entityClass);
+                    }
+                } catch (ClassNotFoundException e) {
+                    if(logger.isErrorEnabled()){
+                        logger.error("鎵弿涓氬姟绫诲瀷鐩稿叧鍐呭鍑虹幇浜嗛敊璇�",e);
+                    }
+                    throw new VciBaseException("鎵弿涓氬姟绫诲瀷鐩稿叧鍐呭鐨勬椂鍊欏彂鐜板疄浣撶被{0}涓嶅瓨鍦�",new String[]{entityName},e);
+                }
+            }
+        }
+    }
+
+    /**
+     * 鎵ц鎵弿涓氬姟绫诲瀷鐩稿叧鍐呭
+     * @param packageNameCollection 鍖呭悕闆嗗悎
+     * @param entityCollection 瀹炰綋绫婚泦鍚�
+     * @throws VciBaseException 鎵弿绫讳笉瀛樺湪锛屾垨鑰呮敞瑙d笉瑙勮寖閮戒細鍑虹幇寮傚父
+     */
+    public void doScanAnnotation2OSServer(Collection<String> packageNameCollection, Collection<String> entityCollection) throws VciBaseException {
+        doScanAnnotation2OSServer(packageNameCollection,entityCollection,null);
+    }
+
+    /**
+     * 鎵ц鎵弿涓氬姟绫诲瀷鐩稿叧鍐呭
+     * @param packageNameCollection 鍖呭悕闆嗗悎
+     * @param entityCollection 瀹炰綋绫婚泦鍚�
+     * @param unScanEntityCollection 涓嶆壂鎻忕殑瀹炰綋绫婚泦鍚�
+     * @throws VciBaseException 鎵弿绫讳笉瀛樺湪锛屾垨鑰呮敞瑙d笉瑙勮寖閮戒細鍑虹幇寮傚父
+     */
+    public void doScanAnnotation2OSServer(Collection<String> packageNameCollection, Collection<String> entityCollection, Collection<String> unScanEntityCollection) throws VciBaseException{
+        logger.info("鎵ц鎵弿骞冲彴涓殑鐩稿叧瀵硅薄");
+        Map<String, OsStatusDTO> statusDTOMap = new HashMap<String, OsStatusDTO>();
+        Map<String, OsLifeCycleDTO> lifeCycleDTOMap = new HashMap<String, OsLifeCycleDTO>();
+        Map<String, OsEnumDTO> enumDTOMap = new HashMap<String, OsEnumDTO>();
+        Map<String, OsAttributeDTO> attributeDTOMap = new HashMap<String, OsAttributeDTO>();
+        Map<String,OsBtmTypeDTO> btmTypeDTOMap = new HashMap<String,OsBtmTypeDTO>();
+        Map<String,OsLinkTypeDTO> linkTypeDTOMap = new HashMap<String,OsLinkTypeDTO>();
+
+        List<Class<?>> lifeCycleClassList = new ArrayList<Class<?>>();
+        List<Class<?>> enumClassList = new ArrayList<Class<?>>();
+        List<Class<?>> btmTypeClassList = new ArrayList<Class<?>>();
+        List<Class<?>> linkTypeClassList = new ArrayList<Class<?>>();
+        //鍏堢湅鍖呬笅闈�
+        scanClassForPackage(lifeCycleClassList,enumClassList,btmTypeClassList,linkTypeClassList,packageNameCollection);
+        //鍐嶇湅鎸囧畾鐨勶紝姣斿鏂囦欢涓嶆槸褰撳墠椤圭洰涓嬬殑
+        scanClassForEntity(lifeCycleClassList,enumClassList,btmTypeClassList,linkTypeClassList,entityCollection);
+
+        if(!CollectionUtils.isEmpty(unScanEntityCollection)){
+            lifeCycleClassList = removeUnScanClass(lifeCycleClassList,unScanEntityCollection);
+            enumClassList = removeUnScanClass(enumClassList,unScanEntityCollection);
+            btmTypeClassList = removeUnScanClass(btmTypeClassList,unScanEntityCollection);
+            linkTypeClassList = removeUnScanClass(linkTypeClassList,unScanEntityCollection);
+        }
+
+        if(!CollectionUtils.isEmpty(lifeCycleClassList)){
+            List<Class<?>> scanedClassList = new ArrayList<Class<?>>();
+            for(int i = 0 ; i < lifeCycleClassList.size(); i ++){
+                Class<?> lifeClass = lifeCycleClassList.get(i);
+                if(!scanedClassList.contains(lifeClass)){
+                    scanStatusAndLifeCycle(lifeClass,statusDTOMap,lifeCycleDTOMap);
+                    scanedClassList.add(lifeClass);
+                }
+            }
+        }
+
+        if(!CollectionUtils.isEmpty(enumClassList)){
+            List<Class<?>> scanedClassList = new ArrayList<Class<?>>();
+            for(int i = 0 ; i < enumClassList.size(); i ++){
+                Class<?> enumClass = enumClassList.get(i);
+                if(!scanedClassList.contains(enumClass)){
+                    scanEnum(enumClass,enumDTOMap);
+                    scanedClassList.add(enumClass);
+                }
+            }
+        }
+
+        if(!CollectionUtils.isEmpty(btmTypeClassList)){
+            List<Class<?>> scanedClassList = new ArrayList<Class<?>>();
+            for(int i = 0 ; i < btmTypeClassList.size(); i ++){
+                Class<?> btmTypeClass = btmTypeClassList.get(i);
+                if(!scanedClassList.contains(btmTypeClass)){
+                    scanAttributeAndBtmType(btmTypeClass,attributeDTOMap,btmTypeDTOMap);
+                    scanedClassList.add(btmTypeClass);
+                }
+            }
+        }
+
+        if(!CollectionUtils.isEmpty(linkTypeClassList)){
+            List<Class<?>> scanedClassList = new ArrayList<Class<?>>();
+            for(int i = 0 ; i < linkTypeClassList.size(); i ++){
+                Class<?> linkTypeClass = linkTypeClassList.get(i);
+                if(!scanedClassList.contains(linkTypeClass)){
+                    scanAttributeAndLinkType(linkTypeClass,attributeDTOMap,linkTypeDTOMap);
+                    scanedClassList.add(linkTypeClass);
+                }
+            }
+        }
+
+        //ok.鍑嗗浼犻�掓暟鎹�
+
+        OsBtmTypeExportDTO btmTypeExportDTO = new OsBtmTypeExportDTO();
+        //灞炴�х殑鏁版嵁浼犺緭瀵硅薄
+        btmTypeExportDTO.setAttributeDTOList(attributeDTOMap.values());
+        //鐢熷懡鍛ㄦ湡鐨勬暟鎹紶杈撳璞�
+        btmTypeExportDTO.setLifeCycleDTOList(lifeCycleDTOMap.values());
+        //鐘舵��
+        btmTypeExportDTO.setStatusDTOList(statusDTOMap.values());
+        //鏋氫妇
+        btmTypeExportDTO.setEnumDTOList(enumDTOMap.values());
+        //涓氬姟绫诲瀷
+        btmTypeExportDTO.setBtmTypeDTOList(btmTypeDTOMap.values());
+        //閾炬帴绫诲瀷
+        btmTypeExportDTO.setLinkTypeDTOList(linkTypeDTOMap.values());
+        //鎵ц瀵煎叆鐨�
+        btmIOService.importBtmTypes(btmTypeExportDTO);
+    }
+
+    /**
+     * 鍘婚櫎閲嶅鐨勭被
+     * @param beanList 绫诲垪琛�
+     * @param unScanEntityCollection 涓嶆壂鎻忕殑绫诲悕
+     */
+    private List<Class<?>> removeUnScanClass(Collection<Class<?>> beanList,Collection<String> unScanEntityCollection){
+        List<Class<?>> needScanClassList = new ArrayList<Class<?>>();
+        if(!CollectionUtils.isEmpty(beanList)) {
+            for(Class<?> cl:beanList){
+                if(!unScanEntityCollection.contains(cl.getName())){
+                    needScanClassList.add(cl);
+                }
+            }
+        }
+        return needScanClassList;
+    }
+
+    /**
+     * 鎵弿閾炬帴绫诲瀷鐨勫璞�
+     * @param linkTypeClass 閾炬帴绫诲瀷绫荤殑瀵硅薄
+     * @param attributeDTOMap 灞炴�х殑鏄犲皠
+     * @param linkTypeDTOMap 閾炬帴绫诲瀷鐨勬槧灏�
+     */
+    private void scanAttributeAndLinkType(Class<?> linkTypeClass, Map<String,OsAttributeDTO> attributeDTOMap, Map<String,OsLinkTypeDTO> linkTypeDTOMap) {
+        String className = linkTypeClass.getName();
+        logger.info("閾炬帴绫诲瀷鐨勭被==" + className);
+        OsLinkTypeDTO linkTypeDTO = new OsLinkTypeDTO();
+        if(linkTypeClass.isAnnotationPresent(VciLinkType.class)){
+            VciLinkType linkType = linkTypeClass.getAnnotation(VciLinkType.class);
+            linkTypeDTO.setId(linkType.name());
+            linkTypeDTO.setName(linkType.text());
+            linkTypeDTO.setFromBtmType(arrays2String(linkType.fromBtmTypes()));
+            linkTypeDTO.setToBtmType(arrays2String(linkType.toBtmTypes()));
+        }else{
+            throw new VciBaseException("閾炬帴绫诲瀷绫诲繀椤昏娣诲姞VciLinkType",
+                    new Object[]{className});
+        }
+        if(StringUtils.isBlank(linkTypeDTO.getId())){
+            linkTypeDTO.setId(VciBaseUtil.toLowForFirst(linkTypeClass.getSimpleName()));
+            if(linkTypeDTO.getId().endsWith("DO")){
+                linkTypeDTO.setId(linkTypeDTO.getId().substring(0,linkTypeDTO.getId().length()-2));
+            }
+        }
+
+        //鎵炬槸鍚﹀凡缁忓瓨鍦�
+        if(linkTypeDTOMap.containsKey(linkTypeDTO.getId().toLowerCase())){
+            throw new VciBaseException("閾炬帴绫诲瀷{0}[{1}]鍦ㄧ郴缁熶腑宸茬粡瀛樺湪锛岃涓嶈閲嶅娣诲姞锛涗笌涔嬬浉鍚屽悕绉扮殑閾炬帴绫诲瀷绫昏矾寰勪负{2}",
+                    new Object[]{linkTypeDTO.getId(),linkTypeDTO.getName(),linkTypeDTOMap.get(linkTypeDTO.getId().toLowerCase().trim()).getClassFullName()});
+        }
+
+        //鎵惧睘鎬�
+        List<Field> fields = new ArrayList<Field>();
+        Collections.addAll(fields,linkTypeClass.getDeclaredFields());
+        List<OsBtmTypeLinkAttributesDTO> linkTypeAttributeVOList = new ArrayList<OsBtmTypeLinkAttributesDTO>();
+        BtmOrLinkProcessAttributeInfo processAttributeInfo = new BtmOrLinkProcessAttributeInfo();
+        processAttributeInfo.setId(linkTypeClass.getName());
+        processAttributeInfo.setName(linkTypeDTO.getName());
+        processAttributeInfo.setLinkType(true);
+        scanAttributes(fields,attributeDTOMap,linkTypeAttributeVOList,processAttributeInfo);
+        linkTypeDTO.setAttributesDTOList(linkTypeAttributeVOList);
+        linkTypeDTOMap.put(linkTypeDTO.getId().toLowerCase().trim(),linkTypeDTO);
+    }
+
+    /**
+     * 鏁扮粍杞崲涓洪�楀彿鍒嗛殧鐨勫瓧绗︿覆
+     * @param arrays 鏁扮粍
+     * @return 閫楀彿鍒嗛殧鐨勫瓧绗︿覆
+     */
+    private String arrays2String(String[] arrays){
+         return VciBaseUtil.array2String(arrays);
+    }
+
+    /**
+     * 搴忓垪鍖栫殑灞炴�у悕绉�
+     */
+    private static final String SERIALVERSION_FIELD_NAME = "serialVersionUID";
+
+    /**
+     * 鎵弿灞炴��
+     * @param fields 灞炴�у瓧娈垫暟缁�
+     * @param attributeDTOMap 灞炴�х殑浼犺緭鏄犲皠
+     * @param useAttributeVOList 浣跨敤鐨勫睘鎬�
+     * @param processAttributeInfo 涓氬姟绫诲瀷鎴栬�呴摼鎺ョ被鍨�
+     */
+    private void scanAttributes(List<Field> fields, Map<String,OsAttributeDTO> attributeDTOMap, List<OsBtmTypeLinkAttributesDTO> useAttributeVOList, BtmOrLinkProcessAttributeInfo processAttributeInfo){
+        for(Field field: fields){
+            field.setAccessible(true);
+            OsAttributeDTO attributeDTO = new OsAttributeDTO();
+            scanField2Attribute(field,attributeDTO,attributeDTOMap,processAttributeInfo);
+            if(StringUtils.isNotBlank(attributeDTO.getAttributeDataType())) {
+                OsBtmTypeLinkAttributesDTO linkAttributesDTO = new OsBtmTypeLinkAttributesDTO();
+                copyAttribute2BtmTypeLink(linkAttributesDTO, attributeDTO);
+                useAttributeVOList.add(linkAttributesDTO);
+            }
+        }
+    }
+
+    /**
+     * 鎵弿灞炴�у拰涓氬姟绫诲瀷
+     * @param btmTypeClass 涓氬姟绫诲瀷鐨勭被
+     * @param attributeDTOMap 灞炴�х殑鏁版嵁浼犺緭瀵硅薄鏄犲皠锛宬ey鏄睘鎬х殑鑻辨枃鍚嶇О灏忓啓
+     * @param btmTypeDTOMap 涓氬姟绫诲瀷鐨勬暟鎹紶杈撳璞℃槧灏勶紝key鏄笟鍔$被鍨嬬殑鑻辨枃鍚嶇О灏忓啓
+     */
+    private void scanAttributeAndBtmType(Class<?> btmTypeClass, Map<String,OsAttributeDTO> attributeDTOMap, Map<String,OsBtmTypeDTO> btmTypeDTOMap) {
+        String className = btmTypeClass.getName();
+        logger.info("涓氬姟绫诲瀷鐨勭被==" + className);
+        OsBtmTypeDTO btmTypeDTO = new OsBtmTypeDTO();
+        if(btmTypeClass.isAnnotationPresent(VciBtmType.class)){
+            VciBtmType vciBtmType = btmTypeClass.getAnnotation(VciBtmType.class);
+            btmTypeDTO.setId(vciBtmType.name());
+            btmTypeDTO.setName(vciBtmType.text());
+           // btmTypeDTO.setTableName(StringUtils.isBlank(vciBtmType.tableName())?VciBaseUtil.getTableName(btmTypeDTO.getName()):vciBtmType.tableName());
+            //btmTypeDTO.setSecretFlag(vciBtmType.secretAble());
+            btmTypeDTO.setDescription(vciBtmType.description());
+            btmTypeDTO.setLifeCycleId(vciBtmType.lifeCycle());
+            String[] subLifeCycles = vciBtmType.subLifeCycle();
+            if(subLifeCycles!=null&& subLifeCycles.length > 0){
+                btmTypeDTO.setSubLifeCycleId(arrays2String(subLifeCycles));
+            }
+            btmTypeDTO.setInputRevisionFlag(vciBtmType.revisionRuleInput());
+            btmTypeDTO.setRevisionRuleId(vciBtmType.revisionRule());
+            btmTypeDTO.setVersionRule(vciBtmType.versionRule().getValue());
+        }else{
+            btmTypeDTO.setSecretFlag(false);
+            btmTypeDTO.setLifeCycleId("");
+            btmTypeDTO.setInputRevisionFlag(false);
+        }
+        if(StringUtils.isBlank(btmTypeDTO.getId())){
+            btmTypeDTO.setId(VciBaseUtil.toLowForFirst(btmTypeClass.getSimpleName()));
+            if(btmTypeDTO.getId().endsWith("DO")){
+                btmTypeDTO.setId(btmTypeDTO.getId().substring(0,btmTypeDTO.getId().length()-2));
+            }
+        }
+        if(btmTypeDTO.getId().length()>18){
+            throw new VciBaseException("涓氬姟绫诲瀷[{0}]鍚嶇О鐨勯暱搴︿笉鑳借秴杩�18浣嶏紝褰撳墠涓簕1}",new String[]{btmTypeDTO.getName(),btmTypeDTO.getId()});
+        }
+        if(StringUtils.isBlank(btmTypeDTO.getLifeCycleId())){
+            btmTypeDTO.setLifeCycleFlag(false);
+        }else{
+            btmTypeDTO.setLifeCycleFlag(true);
+        }
+
+        btmTypeDTO.setClassFullName(className);
+        btmTypeDTO.setImplClass(className);
+        if(StringUtils.isNotBlank(btmTypeDTO.getRevisionRuleId()) || btmTypeDTO.isInputRevisionFlag()){
+            btmTypeDTO.setRevisionFlag(true);
+        }else{
+            btmTypeDTO.setRevisionFlag(false);
+        }
+        //浠庢敞閲婇噷鑾峰彇鍚嶇О
+
+        //鎵炬槸鍚﹀凡缁忓瓨鍦�
+        if(btmTypeDTOMap.containsKey(btmTypeDTO.getId().toLowerCase())){
+            throw new VciBaseException("涓氬姟绫诲瀷{0}[{1}]鍦ㄧ郴缁熶腑宸茬粡瀛樺湪锛岃涓嶈閲嶅娣诲姞锛涗笌涔嬬浉鍚屽悕绉扮殑涓氬姟绫诲瀷绫昏矾寰勪负{2}",
+                    new Object[]{btmTypeDTO.getId(),btmTypeDTO.getName(),btmTypeDTOMap.get(btmTypeDTO.getId().toLowerCase().trim()).getClassFullName()});
+        }
+
+        BtmOrLinkProcessAttributeInfo processAttributeInfo = new BtmOrLinkProcessAttributeInfo();
+        processAttributeInfo.setId(className);
+        processAttributeInfo.setName(btmTypeDTO.getName());
+        processAttributeInfo.setSecret(btmTypeDTO.isSecretFlag());
+        processAttributeInfo.setRevision(btmTypeDTO.isRevisionFlag());
+        processAttributeInfo.setLinkType(false);
+        processAttributeInfo.setLifeCycle(btmTypeDTO.isLifeCycleFlag());
+
+        //澶勭悊灞炴��
+        List<Field> fields =new ArrayList<Field>();
+        Collections.addAll(fields,btmTypeClass.getDeclaredFields());
+        List<OsBtmTypeLinkAttributesDTO> btmTypeLinkAttributesDTOList = new ArrayList<OsBtmTypeLinkAttributesDTO>();
+        scanAttributes(fields,attributeDTOMap,btmTypeLinkAttributesDTOList,processAttributeInfo);
+        btmTypeDTO.setAttributesDTOList(btmTypeLinkAttributesDTOList);
+        btmTypeDTOMap.put(btmTypeDTO.getId().toLowerCase().trim(),btmTypeDTO);
+    }
+
+    /**
+     * 浠庣被鐨勫睘鎬у瓧娈典笂鑾峰彇娉ㄨВ骞舵嫹璐濆埌灞炴�у璞′腑
+     * @param field 灞炴�у瓧娈�
+     * @param attributeDTO 灞炴�у璞�
+     * @param attributeDTOMap 灞炴�х殑鏄犲皠锛宬ey鏄睘鎬х殑鑻辨枃鍚嶇О澶у啓
+     * @param processAttributeInfo 涓氬姟绫诲瀷鎴栬�呴摼鎺ョ被鍨嬬殑鍩烘湰淇℃伅
+     */
+    private void scanField2Attribute(Field field, OsAttributeDTO attributeDTO, Map<String,OsAttributeDTO> attributeDTOMap, BtmOrLinkProcessAttributeInfo processAttributeInfo){
+        //鎵惧熀鏈殑淇℃伅
+        if(field.isAnnotationPresent(Transient.class) || "serialversionuid".equalsIgnoreCase(field.getName())){
+            //鍔犱簡杩欎釜娉ㄨВ鐨勫睘鎬т篃鏄笉鎸佷箙鍖栫殑
+            return;
+        }
+        if(field.isAnnotationPresent(Column.class)){
+            Column column = field.getAnnotation(Column.class);
+            attributeDTO.setId(column.name());
+            if(StringUtils.isBlank(attributeDTO.getId())){
+                attributeDTO.setId(field.getName());
+            }
+            attributeDTO.setName(column.columnDefinition());
+            attributeDTO.setNullableFlag(column.nullable());
+            attributeDTO.setDefaultValue(column.defaultValue());
+            attributeDTO.setEnumId(column.useEnum());
+            attributeDTO.setBtmTypeId(column.useRefer());
+            attributeDTO.setAttrLength(column.length());
+            attributeDTO.setPrecisionLength(column.precision());
+            attributeDTO.setScaleLength(column.scale());
+            String[] ranges = column.range();
+            if(ranges!=null&& ranges.length > 0){
+                attributeDTO.setRange(VciBaseUtil.array2String(ranges));
+            }
+        }else{
+            attributeDTO.setNullableFlag(true);
+            attributeDTO.setId(field.getName());
+        }
+        String attrLowId = attributeDTO.getId().toLowerCase(Locale.ROOT);
+        if(FieldConstant.REVISION_MANAGE_FIELD_MAP.containsKey(attrLowId)
+                ||FieldConstant.BASIC_FIELD_MAP.containsKey(attrLowId)
+                ||FieldConstant.BASE_MODEL_COMPATIBILITY_MAP.containsKey(attrLowId)
+                ||FieldConstant.LIFECYCLE_MANAGE_FIELD_MAP.containsKey(attrLowId)
+                ||FieldConstant.LINK_TYPE_FIELD_MAP.containsKey(attrLowId)){
+            //鍩虹鐨勫睘鎬�
+            return;
+        }
+        if(StringUtils.isBlank(attributeDTO.getId())){
+            attributeDTO.setId(field.getName());
+        }
+        if(StringUtils.isBlank(attributeDTO.getName())){
+            attributeDTO.setName(attributeDTO.getId());
+        }
+        String attributeLowerId = attributeDTO.getId().toLowerCase();
+        //鎵剧被鍨嬮厤缃殑淇℃伅
+        Class<?> fieldType = field.getType();
+        if (field.isAnnotationPresent(VciFieldType.class)) {
+            VciFieldType vciFieldType = field.getAnnotation(VciFieldType.class);
+            VciFieldTypeEnum fieldTypeEnum = vciFieldType.value();
+            if(fieldTypeEnum == null){
+                attributeDTO.setAttributeDataType(VciFieldTypeEnum.VTString.name());
+            }else {
+                if (fieldTypeEnum.equals(VciFieldTypeEnum.VTBoolean)) {
+                    attributeDTO.setAttrLength(5);
+                }
+                if (fieldTypeEnum.equals(VciFieldTypeEnum.VTFilePath)) {
+                    attributeDTO.setAttrLength(50);
+                }
+                attributeDTO.setAttributeDataType(fieldTypeEnum.name());
+            }
+        } else {
+            if (fieldType.equals(Integer.class) || fieldType.equals(int.class)
+                    || fieldType.equals(Short.class)
+                    || fieldType.equals(short.class)) {
+                attributeDTO.setAttributeDataType(VciFieldTypeEnum.VTInteger.name());
+            } else if (fieldType.equals(Long.class) || fieldType.equals(long.class)) {
+                attributeDTO.setAttributeDataType(VciFieldTypeEnum.VTLong.name());
+            } else if (fieldType.equals(Double.class) || fieldType.equals(double.class)
+                    || fieldType.equals(Float.class) || fieldType.equals(float.class)
+                    || fieldType.equals(BigDecimal.class) || fieldType.equals(BigInteger.class)) {
+                attributeDTO.setAttributeDataType(VciFieldTypeEnum.VTDouble.name());
+            } else if (fieldType.equals(Date.class) || fieldType.equals(Timestamp.class)) {
+                attributeDTO.setAttributeDataType(VciFieldTypeEnum.VTDateTime.name());
+            } else {
+                attributeDTO.setAttributeDataType(VciFieldTypeEnum.VTString.name());
+            }
+        }
+        if (attributeDTO.getAttrLength() == null) {
+            attributeDTO.setAttrLength(0);
+        }
+        if (attributeDTO.getAttrLength() == 0 &&
+                (VciFieldTypeEnum.VTDouble.name().equals(attributeDTO.getAttributeDataType()) || fieldType.equals(Double.class) || fieldType.equals(double.class)
+                        || fieldType.equals(Float.class) || fieldType.equals(float.class)
+                        || fieldType.equals(BigDecimal.class) || fieldType.equals(BigInteger.class))) {
+            attributeDTO.setAttrLength(8);
+        }
+        if (StringUtils.isBlank(attributeDTO.getBtmTypeId())
+                && field.isAnnotationPresent(VciUseRefer.class)) {
+            VciUseRefer refer = field.getAnnotation(VciUseRefer.class);
+            attributeDTO.setBtmTypeId(refer.value());
+        }
+        if (StringUtils.isBlank(attributeDTO.getEnumId())
+                && field.isAnnotationPresent(VciUseEnum.class)) {
+            VciUseEnum useEnum = field.getAnnotation(VciUseEnum.class);
+            attributeDTO.setEnumId(useEnum.value());
+        }
+        if (attributeDTO.getAttrLength() == 0 &&
+                VciFieldTypeEnum.VTString.name().equals(attributeDTO.getAttributeDataType())){
+            if(StringUtils.isNotBlank(attributeDTO.getBtmTypeId())
+                    || StringUtils.isNotBlank(attributeDTO.getEnumId())){
+                attributeDTO.setAttrLength(50);
+            }else {
+                attributeDTO.setAttrLength(150);
+            }
+        }
+        if (attributeDTOMap.containsKey(attributeLowerId)) {
+            OsAttributeDTO existAttributeDTO = attributeDTOMap.get(attributeLowerId);
+            if (existAttributeDTO.getAttrLength() < attributeDTO.getAttrLength()) {
+                existAttributeDTO.setAttrLength(attributeDTO.getAttrLength());
+            }
+        } else {
+            attributeDTOMap.put(attributeDTO.getId().trim().toLowerCase(), attributeDTO);
+        }
+    }
+
+
+    /**
+     * 鎷疯礉灞炴�х殑鍐呭鍒颁笟鍔$被鍨嬪叧鑱斿睘鎬�
+     * @param linkAttributesDTO 涓氬姟绫诲瀷鍏宠仈灞炴�х殑瀵硅薄
+     * @param attributeDTO 灞炴�у璞�
+     */
+    private void copyAttribute2BtmTypeLink(OsBtmTypeLinkAttributesDTO linkAttributesDTO,OsAttributeDTO attributeDTO){
+        linkAttributesDTO.setName(attributeDTO.getName());
+        linkAttributesDTO.setAttrDataType(attributeDTO.getAttributeDataType());
+        linkAttributesDTO.setId(attributeDTO.getId());
+        linkAttributesDTO.setAttributeLength(attributeDTO.getAttrLength());
+        linkAttributesDTO.setDefaultValue(attributeDTO.getDefaultValue());
+        linkAttributesDTO.setNullableFlag(attributeDTO.isNullableFlag());
+        linkAttributesDTO.setPrecisionLength(attributeDTO.getPrecisionLength());
+        linkAttributesDTO.setEnumId(attributeDTO.getEnumId());
+        linkAttributesDTO.setReferBtmTypeId(attributeDTO.getBtmTypeId());
+        linkAttributesDTO.setDescription(attributeDTO.getDescription());
+    }
+
+    /**
+     * 鎵弿鏋氫妇
+     * @param enumClass 鏋氫妇绫�
+     * @param enumDTOMap 鏋氫妇鐨勬槧灏勶紝key鏄灇涓剧殑鑻辨枃鍚嶇О灏忓啓锛寁alue鏄灇涓剧殑鏄剧ず瀵硅薄
+     */
+    private void scanEnum(Class<?> enumClass, Map<String,OsEnumDTO> enumDTOMap) {
+        String className = enumClass.getName();
+        logger.info("鏋氫妇鐨勭被==" + className);
+        if(!enumClass.isEnum()){
+            throw new VciBaseException("绫粄0}涓嶆槸鏋氫妇绫�",
+                    new Object[]{className});
+        }
+        Object[] enumObjs = enumClass.getEnumConstants();
+        OsEnumDTO enumDTO = new OsEnumDTO();
+        if(enumClass.isAnnotationPresent(VciEnum.class)){
+            VciEnum vciEnum = enumClass.getAnnotation(VciEnum.class);
+            enumDTO.setId(vciEnum.name());
+            enumDTO.setName(vciEnum.text());
+            enumDTO.setLength(50);
+            enumDTO.setDescription(vciEnum.description());
+        }
+        //濡傛灉娌℃湁娣诲姞VciEnum娉ㄨВ锛屽垯鍙栫被鐨勫悕绉板皬鍐�
+        if(StringUtils.isBlank(enumDTO.getId())){
+            enumDTO.setId(VciBaseUtil.toLowForFirst(enumClass.getSimpleName()));
+        }
+        if(StringUtils.isBlank(enumDTO.getName())){
+            enumDTO.setName(enumDTO.getId());
+        }
+        if(enumDTOMap.containsKey(enumDTO.getId().trim().toLowerCase())){
+            throw new VciBaseException("鏋氫妇{0}[{1}]鍦ㄧ郴缁熶腑宸茬粡瀛樺湪锛岃涓嶈閲嶅娣诲姞锛涗笌涔嬬浉鍚屽悕绉扮殑鏋氫妇绫昏矾寰勪负{2}",
+                    new Object[]{enumDTO.getId(),enumDTO.getName(),enumDTOMap.get(enumDTO.getId().toLowerCase().trim()).getClassFullName()});
+        }
+
+        Map<String,String> itemMap = new HashMap<String,String>();
+        for(Object obj : enumObjs){
+            Class<?>[] objInterfaces = obj.getClass().getInterfaces();
+            if(VciBaseUtil.inArray(objInterfaces, BaseEnum.class)){
+                BaseEnum baseEnum = (BaseEnum)obj;
+                enumDTO.setEnumValueDataType("string");
+                itemMap.put(baseEnum.getValue(),baseEnum.getText());
+            }else if(VciBaseUtil.inArray(objInterfaces, BaseEnumInt.class)){
+                BaseEnumInt baseEnum = (BaseEnumInt)obj;
+                enumDTO.setEnumValueDataType("int");
+                itemMap.put(baseEnum.getValue() + "",baseEnum.getText());
+            }else{
+                throw new VciBaseException("鏋氫妇鎵�灞炵殑绫粄0}娌℃湁瀹炵幇BaseEnum鎴栬�匓aseEnumInt鐨勬帴鍙o紝璇峰紑鍙戜汉鍛樻敼姝�",new Object[]{className});
+            }
+        }
+        enumDTO.setClassFullName(className);
+        enumDTO.setItemMaps(itemMap);
+        enumDTOMap.put(enumDTO.getId().trim().toLowerCase(),enumDTO);
+    }
+
+    /**
+     * 鎵弿鐘舵�佸拰鐢熷懡鍛ㄦ湡
+     * @param lifeCycleClass 鐢熷懡鍛ㄦ湡鐨勭被
+     * @param statusDTOMap 鐘舵�佺殑浼犺緭瀵硅薄鏄犲皠
+     * @param lifeCycleDTOMap 鐢熷懡鍛ㄦ湡鐨勫璞℃槧灏�
+     * @throws VciBaseException 娉ㄨВ鐨勫唴瀹规湁閿欒鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    private void scanStatusAndLifeCycle(Class<?> lifeCycleClass, Map<String, OsStatusDTO> statusDTOMap, Map<String, OsLifeCycleDTO> lifeCycleDTOMap) throws VciBaseException{
+        logger.info("鐢熷懡鍛ㄦ湡鐨勭被==" + lifeCycleClass.getName());
+        if(!lifeCycleClass.isEnum()){
+            throw new VciBaseException("@VciLifeCycle杩欎釜娉ㄨВ鍙兘浣跨敤鍦ㄦ灇涓剧被涓�,{0}",new Object[]{lifeCycleClass.getSimpleName()});
+        }
+        if(lifeCycleClass.isAnnotationPresent(VciLifeCycle.class)){
+            VciLifeCycle vciLifeCycle = lifeCycleClass.getAnnotation(VciLifeCycle.class);
+            String id = vciLifeCycle.name();
+            if(StringUtils.isBlank(id)){
+                //鍙兘娉ㄨВ娌℃湁鍐欏��
+                id=VciBaseUtil.toLowForFirst(lifeCycleClass.getSimpleName());
+            }
+            String name = vciLifeCycle.text();
+            if(StringUtils.isBlank(name)){
+                name = id;
+            }
+            if(lifeCycleDTOMap.containsKey(id.toLowerCase().trim())){
+                throw new VciBaseException("鐢熷懡鍛ㄦ湡{0}[{1}]鍦ㄧ郴缁熶腑宸茬粡瀛樺湪锛岃涓嶈閲嶅娣诲姞锛涗笌涔嬬浉鍚岀殑鐢熷懡鍛ㄦ湡鐨勭被璺緞涓簕2}",new Object[]{id,name,lifeCycleDTOMap.get(id.toLowerCase().trim()).getClassFullName()});
+            }
+            String className = lifeCycleClass.getName();
+            OsLifeCycleDTO lifeCycleDTO = new OsLifeCycleDTO();
+            lifeCycleDTO.setId(id);
+            lifeCycleDTO.setName(name);
+            lifeCycleDTO.setStartStatus(vciLifeCycle.startStatus());
+            //鎵鹃噷闈㈡墍鏈夌殑鐘舵��
+            Object[] enumObjs = lifeCycleClass.getEnumConstants();
+            Map<String,String> statusMapInThisLifeCycle = new HashMap<String,String>();
+            for(int i = 0 ; i < enumObjs.length; i ++ ){
+                Object obj =enumObjs[i];
+                Class<?>[] objInterfaces = obj.getClass().getInterfaces();
+                if(VciBaseUtil.inArray(objInterfaces, BaseEnum.class)){
+                    BaseEnum baseEnum = (BaseEnum)obj;
+                    statusMapInThisLifeCycle.put(baseEnum.getValue(),baseEnum.getText());
+                }else if(VciBaseUtil.inArray(objInterfaces,BaseEnumInt.class)){
+                    BaseEnumInt baseEnum = (BaseEnumInt)obj;
+                    statusMapInThisLifeCycle.put(String.valueOf(baseEnum.getValue()),baseEnum.getText());
+                }else{
+                    throw new VciBaseException("鐢熷懡鍛ㄦ湡鎵�灞炵殑绫粄0}娌℃湁瀹炵幇BaseEnum鎴栬�匓aseEnumInt鐨勬帴鍙o紝璇峰紑鍙戜汉鍛樻敼姝�",new Object[]{className});
+                }
+            }
+            Map<String,String> statusMapInThisLifeCycleLower = new HashMap<String,String>();
+            if(CollectionUtils.isEmpty(statusMapInThisLifeCycle)){
+                throw new VciBaseException("鐢熷懡鍛ㄦ湡{0}娌℃湁鍖呭惈浠讳綍鐨勭姸鎬�",new Object[]{className});
+            }
+            for(String statusId : statusMapInThisLifeCycle.keySet()){
+                String statusIdLower = statusId.toLowerCase().trim();
+                String statusText = statusMapInThisLifeCycle.get(statusId);
+                if(!statusDTOMap.containsKey(statusIdLower)){
+                    OsStatusDTO statusDTO = new OsStatusDTO();
+                    statusDTO.setId(statusId);
+                    statusDTO.setName(statusText);
+                    statusDTOMap.put(statusIdLower,statusDTO);
+                }
+                statusMapInThisLifeCycleLower.put(statusIdLower,statusText);
+            }
+            if(StringUtils.isBlank(lifeCycleDTO.getStartStatus())){
+                logger.info("鍥犱负娌℃湁璁剧疆鐢熷懡鍛ㄦ湡鐨勮捣濮嬬姸鎬侊紝榛樿绗竴涓姸鎬乕{0}]涓鸿捣濮嬬姸鎬�,鍦ㄧ被{1}涓�");
+                throw new VciBaseException("娌℃湁璁剧疆璧峰鐘舵��",new Object[]{});
+            }
+            if(!statusMapInThisLifeCycleLower.containsKey(lifeCycleDTO.getStartStatus().toLowerCase().trim())){
+                throw new VciBaseException("鐢熷懡鍛ㄦ湡涓殑璧峰鐘舵�亄0}锛屽湪绫粄1}涓笉瀛樺湪",new Object[]{lifeCycleDTO.getStartStatus(),className});
+            }
+            lifeCycleDTO.setStartStatusName(statusMapInThisLifeCycleLower.get(lifeCycleDTO.getStartStatus().toLowerCase().trim()));
+            List<OsLifeCycleLineDTO> lineDTOList = new ArrayList<OsLifeCycleLineDTO>();
+            VciLifeCycleTrans[] translations = vciLifeCycle.translations();
+            if(translations != null && translations.length > 0){
+                int lineCount = 1;
+                for(VciLifeCycleTrans line: translations){
+                    if(StringUtils.isNotBlank(line.source()) && StringUtils.isNotBlank(line.target())) {
+                        VciLifeCycleTranEvent[] listeners = line.listeners();
+                        OsLifeCycleLineDTO lineDTO = new OsLifeCycleLineDTO();
+                        lineDTO.setSourceLifeStatus(line.source());
+                        if(!statusMapInThisLifeCycleLower.containsKey(lineDTO.getSourceLifeStatus().trim().toLowerCase())){
+                            throw new VciBaseException("鐢熷懡鍛ㄦ湡涓繛鎺ョ嚎鐨勭姸鎬亄0}锛屽湪绫粄1}涓笉瀛樺湪",new Object[]{lineDTO.getSourceLifeStatus(),className});
+                        }
+                        lineDTO.setSourceLifeStatusName(statusMapInThisLifeCycleLower.get(lineDTO.getSourceLifeStatus().trim().toLowerCase()));
+
+                        lineDTO.setTargetLifeStatus(line.target());
+                        if(!statusMapInThisLifeCycleLower.containsKey(lineDTO.getTargetLifeStatus().trim().toLowerCase())){
+                            throw new VciBaseException("鐢熷懡鍛ㄦ湡涓繛鎺ョ嚎鐨勭姸鎬亄0}锛屽湪绫粄1}涓笉瀛樺湪",new Object[]{lineDTO.getTargetLifeStatus(),className});
+                        }
+                        lineDTO.setTargetLifeStatusName(statusMapInThisLifeCycleLower.get(lineDTO.getTargetLifeStatus().trim().toLowerCase()));
+                        lineDTO.setName(line.name());
+                        if(StringUtils.isBlank(lineDTO.getName())){
+                            lineDTO.setName("杩炴帴绾�" + lineCount);
+                        }
+                        if(listeners!=null) {
+                            lineDTO.setEventDTOList(Arrays.asList(listeners).stream().map(VciLifeCycleTranEvent::classFullName).collect(Collectors.toList()));
+                        }else{
+                            lineDTO.setEventDTOList(new ArrayList<String>());
+                        }
+                        lineCount ++;
+                        lineDTOList.add(lineDTO);
+                    }
+                }
+            }
+            lifeCycleDTO.setLineDTOList(lineDTOList);
+            lifeCycleDTO.setClassFullName(className);
+            lifeCycleDTOMap.put(lifeCycleDTO.getId().toLowerCase().trim(),lifeCycleDTO);
+        }
+    }
+
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/PlatformClientUtil.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/PlatformClientUtil.java
new file mode 100644
index 0000000..3abe20b
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/PlatformClientUtil.java
@@ -0,0 +1,206 @@
+package com.vci.web.util;
+
+import com.vci.corba.logon.method.LogonFactory;
+import com.vci.corba.logon.method.LogonFactoryHelper;
+import com.vci.corba.volumn.method.VolumnFactory;
+import com.vci.corba.volumn.method.VolumnFactoryHelper;
+import com.vci.starter.corba.connector.JacorbClientConnector;
+import com.vci.starter.web.exception.VciBaseException;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import plm.bs.bom.common.BOFactoryService;
+import plm.bs.bom.common.BOFactoryServiceHelper;
+import plm.corba.attribpool.AttPoolServiceHelper;
+import plm.corba.attribpool.AttPoolServiceOperations;
+import plm.corba.btm.BTMServiceHelper;
+import plm.corba.btm.BTMServiceOperations;
+import plm.corba.enumManager.EnumServiceHelper;
+import plm.corba.enumManager.EnumServiceOperations;
+import plm.corba.lifecycle.LifeCyleServiceHelper;
+import plm.corba.lifecycle.LifeCyleServiceOperations;
+import plm.corba.linkTypeManager.LinkTypeServiceHelper;
+import plm.corba.linkTypeManager.LinkTypeServiceOperations;
+import plm.corba.portal.PortalServiceHelper;
+import plm.corba.portal.PortalServiceOperations;
+import plm.corba.qt.QTServiceHelper;
+import plm.corba.qt.QTServiceOperations;
+import plm.corba.statePoolManager.StatePoolServiceHelper;
+import plm.corba.statePoolManager.StatePoolServiceOperations;
+import plm.corba.versionRuleManager.VersionRuleServiceHelper;
+import plm.corba.versionRuleManager.VersionRuleServiceOperations;
+
+/**
+ * 骞冲彴鐨勫鎴风璋冪敤宸ュ叿绫�
+ * @author weidy
+ * @date 2021-2-14
+ */
+@Component
+public class PlatformClientUtil {
+
+    /**
+     * 涓氬姟绫诲瀷宸ュ巶鐨勬湇鍔�
+     */
+    private static final String BO_FACTORY_SERVICE_NAME = "bofFactoryService";
+
+    /**
+     * 鐧诲綍鏈嶅姟
+     */
+    public static final String LOGON_FACTORY_SERVICE_NAME = "LogonFactoryService";
+
+    /**
+     * 鐘舵�佹睜鏈嶅姟鍚嶅瓧
+     */
+    public static final String STATE_POOL_SERVICE_NAME = "statePoolService";
+
+    /**
+     * 鐢熷懡鍛ㄦ湡鏈嶅姟
+     */
+    public static final String LIFE_CYCLE_SERVICE_NAME = "lifeCycleService";
+
+    /**
+     * 鏋氫妇鐨勬湇鍔�
+     */
+    public static final String ENUM_SERVICE_NAME = "enumService";
+
+    /**
+     * 鐗堟湰瑙勫垯鐨勬湇鍔�
+     */
+    private static final String VERSION_SERVICE_NAME = "versionRuleService";
+
+    /**
+     * 灞炴�х殑鏈嶅姟
+     */
+    private static final String ATTRIBUTE_SERVICE_NAME = "apService";
+
+    /**
+     * 涓氬姟绫诲瀷鐨勬湇鍔�
+     */
+    private static final String BTM_SERVICE_NAME = "btmService";
+
+    /**
+     * 閾炬帴绫诲瀷鐨勬湇鍔�
+     */
+    public static final String LINK_SERVICE_NAME = "linkTypeService";
+    /**
+     * UI涓婁笅鏂囨湇鍔�
+     */
+    private static final String PORTAL_SERVICE_NAME = "portalService";
+    /**
+     * 鏌ヨ鏈嶅姟
+     */
+    private static final String QUERY_SERVICE_NAME = "qtService";
+
+    /**
+    * corba鐨勫鎴风璋冪敤
+    */
+    @Autowired
+    private JacorbClientConnector jacorbClientConnector;
+
+    /**
+     * 鑾峰彇涓氬姟绫诲瀷宸ュ巶鐨勬湇鍔�
+     * @return 鏈嶅姟鐨勫璞�
+     */
+    public BOFactoryService getBOFactoryService(){
+       return BOFactoryServiceHelper.narrow(jacorbClientConnector.getCorbaServiceObjectByServiceName(BO_FACTORY_SERVICE_NAME));
+    }
+
+
+    /**
+     * 鑾峰彇鐧诲綍涓绘湇鍔�
+     * @return 鏈嶅姟鐨勫璞�
+     */
+    public LogonFactory getLogonFactoryService(){
+        return LogonFactoryHelper.narrow(jacorbClientConnector.getCorbaServiceObjectByServiceName(LOGON_FACTORY_SERVICE_NAME));
+    }
+
+    /**
+     * 鑾峰彇鐘舵�佹睜鐨勬湇鍔�
+     * @return 鏈嶅姟鐨勫璞�
+     */
+    public StatePoolServiceOperations getStatePoolService(){
+        return StatePoolServiceHelper.narrow(jacorbClientConnector.getCorbaServiceObjectByServiceName(STATE_POOL_SERVICE_NAME));
+    }
+
+    /**
+     * 鑾峰彇鐢熷懡鍛ㄦ湡鐨勬湇鍔�
+     * @return 鐢熷懡鍛ㄦ湡鐨勬湇鍔″璞�
+     */
+    public LifeCyleServiceOperations getLifeCycleService(){
+        return LifeCyleServiceHelper.narrow(jacorbClientConnector.getCorbaServiceObjectByServiceName(LIFE_CYCLE_SERVICE_NAME));
+    }
+
+    /**
+     * 鑾峰彇鏋氫妇鐨勬湇鍔�
+     * @return 鏋氫妇鐨勬湇鍔″璞�
+     */
+    public EnumServiceOperations getEnumService(){
+        return EnumServiceHelper.narrow(jacorbClientConnector.getCorbaServiceObjectByServiceName(ENUM_SERVICE_NAME));
+    }
+
+    /**
+     * 鑾峰彇鐗堟湰瑙勫垯鐨勬湇鍔�
+     * @return 鐗堟湰瑙勫垯鐨勬湇鍔�
+     */
+    public VersionRuleServiceOperations getVersionService(){
+        return VersionRuleServiceHelper.narrow(jacorbClientConnector.getCorbaServiceObjectByServiceName(VERSION_SERVICE_NAME));
+    }
+
+    /**
+     * 灞炴�ф湇鍔�
+     * @return 鏈嶅姟鐨勫璞�
+     */
+    public AttPoolServiceOperations getAttributeService(){
+        return AttPoolServiceHelper.narrow(jacorbClientConnector.getCorbaServiceObjectByServiceName(ATTRIBUTE_SERVICE_NAME));
+    }
+
+    /**
+     * 鑾峰彇涓氬姟绫诲瀷
+     * @return 鏈嶅姟鐨勫璞�
+     */
+    public BTMServiceOperations getBtmService(){
+        return BTMServiceHelper.narrow(jacorbClientConnector.getCorbaServiceObjectByServiceName(BTM_SERVICE_NAME));
+    }
+
+    /**
+     * 鑾峰彇閾炬帴绫诲瀷
+     * @return 鏈嶅姟鐨勫璞�
+     */
+    public LinkTypeServiceOperations getLinkTypeService(){
+        return LinkTypeServiceHelper.narrow(jacorbClientConnector.getCorbaServiceObjectByServiceName(LINK_SERVICE_NAME));
+    }
+
+    /**
+     * 鑾峰彇UI涓婁笅鏂囨湇鍔�
+     * @return 鏈嶅姟鐨勫璞�
+     */
+    public PortalServiceOperations getPortalService(){
+        return PortalServiceHelper.narrow(jacorbClientConnector.getCorbaServiceObjectByServiceName(PORTAL_SERVICE_NAME));
+    }
+
+    /**
+     * 鑾峰彇鏌ヨ鏈嶅姟
+     * @return 鏈嶅姟鐨勫璞�
+     */
+    public QTServiceOperations getQueryService(){
+        return QTServiceHelper.narrow(jacorbClientConnector.getCorbaServiceObjectByServiceName(QUERY_SERVICE_NAME));
+    }
+
+    /**
+     * 鍗锋湇鍔�
+     * @param serverUrl 鍛藉悕鏈嶅姟
+     * @param volumeName 鍗风殑鍚嶇О
+     * @return 鍗锋湇鍔$殑鐨勫璞�
+     */
+    public VolumnFactory getVolumeService(String serverUrl,String volumeName){
+        if(StringUtils.isNotBlank(serverUrl)){
+            if(StringUtils.countMatches(serverUrl,":") < 2){
+                throw new VciBaseException("鍗锋湇鍔$殑閰嶇疆閿欒锛岄渶瑕佷富鏈哄悕:绔彛:鏈嶅姟鍓嶇紑杩欑褰㈠紡");
+            }
+            String[] split = serverUrl.split(":");
+            serverUrl = "corbaloc::" + split[0] + ":" +split[1] + "/NameService:" +split[2];
+        }
+        return VolumnFactoryHelper.narrow(jacorbClientConnector.getCorbaServiceObjectByUrlAndServiceName(serverUrl,volumeName));
+    }
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/WebUtil.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/WebUtil.java
new file mode 100644
index 0000000..2dc6fe5
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/WebUtil.java
@@ -0,0 +1,1726 @@
+package com.vci.web.util;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.vci.base.ui.exception.VCIException;
+import com.vci.corba.common.VCIError;
+import com.vci.corba.framework.data.UserEntityInfo;
+import com.vci.rmip.framework.client.systemConfig.object.UserEntityObject;
+import com.vci.starter.revision.bo.TreeWrapperOptions;
+import com.vci.starter.web.annotation.*;
+import com.vci.starter.web.constant.QueryOptionConstant;
+import com.vci.starter.web.enumpck.BooleanEnum;
+import com.vci.starter.web.enumpck.VciFieldTypeEnum;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.SessionInfo;
+import com.vci.starter.web.pagemodel.Tree;
+import com.vci.starter.web.toolmodel.DateConverter;
+import com.vci.starter.web.util.*;
+import com.vci.starter.web.wrapper.VciQueryWrapperForDO;
+import com.vci.web.pageModel.*;
+import com.vci.web.properties.WebProperties;
+import com.vci.web.service.impl.WebLoServiceImpl;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+import plm.bs.bom.clientobject.ClientBusinessObject;
+import plm.bs.bom.clientobject.ClientLinkObject;
+import plm.bs.bom.common.AttributeValue;
+import plm.bs.bom.common.BusinessObject;
+import plm.bs.bom.common.LinkObject;
+
+import javax.servlet.http.HttpServletRequest;
+import java.beans.IntrospectionException;
+import java.beans.PropertyDescriptor;
+import java.lang.reflect.*;
+import java.math.BigDecimal;
+import java.net.InetAddress;
+import java.net.NetworkInterface;
+import java.sql.Timestamp;
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * 閫氱敤宸ュ叿绫�
+ * @author weidy
+ * @date 2021-2-13
+ */
+@Component
+public  class WebUtil extends VciBaseUtil {
+
+	/**
+	 * 鍏ㄩ儴鏍囪锛屽父鐢ㄨ鏍戝舰灞曠ず鏃�
+	 */
+	public static final String ALL = "${all}";
+
+	/**
+	 * 鏄惁鎸佷箙鍖�
+	 */
+	private static ThreadLocal<String> needPersistenceInThread = new ThreadLocal<>();
+	/**
+	 * 鏃ュ織瀵硅薄
+	 */
+	private static Logger logger = LoggerFactory.getLogger(WebUtil.class);
+
+    /**
+     * 鑾峰彇閿欒淇℃伅
+     * @param e 寮傚父瀵硅薄
+     * @return 閿欒淇℃伅
+     */
+	public static String getErrorMsg(Throwable e){
+		String errContent = "";
+		try {
+			if (e == null) {
+				return errContent;
+			}
+			if (e instanceof VCIError ) {
+//				String error_code = ((VCIError) e).error_code;
+//				String[] error_message = ((VCIError) e).error_message;
+//				return MessageUtils.get(error_code, error_message);
+				return null;
+			} else if(e instanceof VciBaseException || e.getClass().getSuperclass().equals(VciBaseException.class)){
+				return LangBaseUtil.getErrorMsg(e);
+			}else if (e instanceof VCIException){
+				String error_code = ((VCIException) e).getException_code();
+				Object[] error_message = ((VCIException) e).getException_objArray();
+				return MessageUtils.get(error_code, error_message);
+			}else if (e.getCause() != null
+					&& !e.getCause().toString().equals("")) {
+				errContent = e.getCause().toString();
+			} else if (e.getLocalizedMessage() != null
+					&& !e.getLocalizedMessage().equals("")) {
+				errContent = e.getLocalizedMessage();
+			} else if (e.getMessage() != null && !e.getMessage().equals("")) {
+				errContent = e.getMessage();
+			} else {
+				errContent = e.toString();
+			}
+		} catch (Exception e1) {
+			return LangBaseUtil.getErrorMsg(e1);
+		}
+		return errContent;
+	}
+
+	/**
+	 * 鑾峰彇褰撳墠鐢ㄦ埛鐨勭敤鎴峰悕
+	 * @return 鐢ㄦ埛鍚�
+	 */
+	public  static  String getCurrentUserId( ){
+		SessionInfo s = getCurrentUserSessionInfoNotException();
+		if(s !=null){
+			return s.getUserId();
+		}else{
+			return  "";
+		}
+	}
+	
+
+	/**
+	 * 鑾峰彇褰撳墠鐢ㄦ埛鐨勪富閿�
+	 * @return 涓婚敭
+	 */
+	public  static  String getCurrentUserOid( ){
+		SessionInfo s = getCurrentUserSessionInfoNotException();
+		if(s !=null){
+			return s.getUserId();
+		}else{
+			return  "";
+		}
+	}
+		
+	/**
+	 * json瀛楃涓茶浆涓哄璞�
+	 * @param jsonString json鐨勫瓧绗︿覆
+	 * @param beanClass bean鐨勭被
+	 * @return bean
+	 */
+	public static <T> T jsonString2JavaBean(String jsonString,Class<T> beanClass){
+		return (T)JSONObject.parseObject(jsonString,  beanClass);
+	}
+
+	/**
+	 * 浠巎son瀛楃涓蹭腑鑾峰彇绗竴涓璞�
+	 * @param jsonString json鐨勫瓧绗︿覆
+	 * @param beanClass Bean鐨勭被
+	 * @return 浠庡垪琛ㄩ噷鑾峰彇绗竴涓璞�
+	 */
+	public static <T> T getFirstObjectFromJson(String jsonString,Class<T> beanClass){
+		if(!isNull(jsonString)) {
+			return JSONObject.parseArray(jsonString, beanClass).get(0);
+		} else {
+			return null;
+		}
+	}
+	
+	/**
+	 * 鑾峰彇sessionInfo瀵硅薄
+	 * @return 鑾峰彇褰撳墠鐢ㄦ埛鐨勪俊鎭�
+	 */
+	public static SessionInfo getSessionInfo(){
+		try{
+			return getCurrentUserSessionInfoNotException();
+		}catch(Exception e){
+			return null;
+		}
+	}
+
+	/**
+	 * 鑾峰彇褰撳墠绾跨▼涓殑鐢ㄦ埛瀵硅薄
+	 * @return 褰撳墠鐢ㄦ埛淇℃伅
+	 * @throws VciBaseException 娌℃湁鐧诲綍浼氭姏鍑哄紓甯�
+	 */
+	public static SessionInfo getCurrentUserSessionInfo() throws VciBaseException{
+		SessionInfo si= getCurrentUserSessionInfoNotException();
+		if(si==null){
+			throw new VciBaseException("noLogin",new String[]{"娌℃湁褰撳墠鐢ㄦ埛淇℃伅"});
+		}
+		return si;
+	}
+
+	/**
+	 * 鑾峰彇褰撳墠绾跨▼涓殑鐢ㄦ埛瀵硅薄
+	 * @return 鐢ㄦ埛瀵硅薄锛屼絾鏄笉鎶涘嚭寮傚父
+	 */
+	public static SessionInfo getCurrentUserSessionInfoNotException() {
+		return WebThreadLocalUtil.getCurrentUserSessionInfoInThread().get();
+	}
+
+	/**
+	 * 璁剧疆鐢ㄦ埛鐨勪細璇濅俊鎭璞�
+	 * @param sessionInfo 浼氳瘽淇℃伅
+	 */
+	public static synchronized void setSessionInfo(SessionInfo sessionInfo){
+		 WebThreadLocalUtil.getCurrentUserSessionInfoInThread().set(sessionInfo);
+	}
+
+	/**
+	 * 鏄惁璁剧疆浜哻orba闇�瑕佷娇鐢ㄧ殑涓婁笅鏂囦俊鎭紝鍙拡瀵箇ebService鐨�
+	 */
+	private static volatile boolean isSetContext = false;
+
+	/**
+	 * 鑾峰彇IP鍦板潃锛岄�氳繃request
+	 * @param request 璇锋眰鐨勫璞�
+	 * @return ip鍦板潃
+	 */
+	public static String getClientInfo(HttpServletRequest request){
+		String ip = request.getHeader("X-Forwarded-For");
+		if (StringUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) {
+			ip = request.getHeader("Proxy-Client-IP");
+		}
+		if (StringUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) {
+			ip = request.getHeader("WL-Proxy-Client-IP");
+		}
+		if (StringUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) {
+			ip = request.getHeader("HTTP_CLIENT_IP");
+		}
+		if (StringUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) {
+			ip = request.getHeader("HTTP_X_FORWARDED_FOR");
+		}
+		if (StringUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) {
+			ip = request.getRemoteAddr();
+		}
+		if (StringUtils.isBlank(ip) || ip.indexOf("0:0:0:0:0:0:0:1") >-1) {//0:0:0:0:0:0:0:1鏄湰鏈哄湪璁块棶
+			ip = "127.0.0.1";
+		}
+		return ip;
+	}
+
+	/**
+	 * 鑾峰彇corba瑕佺殑鐢ㄦ埛瀵硅薄
+	 * @param model 褰撳墠妯″潡
+	 * @return 鐢ㄦ埛瀵硅薄
+	 */
+	public static UserEntityInfo getUserEntityInfo(String model){
+		SessionInfo si = WebUtil.getCurrentUserSessionInfo();
+		UserEntityInfo ueo = new UserEntityInfo();
+		ueo.ip = si.getIp();
+		ueo.modules = model;
+		ueo.userName = si.getUserId();
+		return ueo;
+	}
+	
+	/**
+	 * 鑾峰彇corba瑕佺殑鐢ㄦ埛瀵硅薄
+	 * @param model 妯″潡
+	 * @return 鐢ㄦ埛瀵硅薄
+	 */
+	public static UserEntityObject getUserEntityObject(String model) {
+		UserEntityObject entityObject = new UserEntityObject();
+		SessionInfo si = WebUtil.getCurrentUserSessionInfo();
+		entityObject.setIp(si.getIp());
+		entityObject.setModules(model);
+		entityObject.setUserName(si.getUserId());
+		return entityObject;
+	}
+
+
+	/**
+	 * 鏄惁鎸佷箙鍖�
+	 * @return 榛樿涓簍rue
+	 */
+	public static boolean isPersistence(){
+		String persistence =needPersistenceInThread.get();
+		if(StringUtils.isNotBlank(persistence) && BooleanEnum.FASLE.getValue().equalsIgnoreCase(persistence)){
+			return false;
+		}else{
+			return true;
+		}
+	}
+
+	/**
+	 * 璁剧疆鏄惁鎸佷箙鍖�
+	 * @param isPersistence 鏄惁鎸佷箙鍖�
+	 */
+	public static void setPersistence(boolean isPersistence){
+		if(!isPersistence){
+			needPersistenceInThread.set("false");
+		}else{
+			needPersistenceInThread.set("");
+		}
+	}
+
+
+	/**
+	 * 灏嗗璞¤浆鎹负瀛楃涓插嚭鏉�
+	 * @return json瀛楃涓�
+	 */
+	public static String getJSONStringWithDateFormat(Object obj){
+		return JSONObject.toJSONStringWithDateFormat(obj, VciDateUtil.DateTimeMillFormat, SerializerFeature.WriteDateUseDateFormat);
+	}
+
+	/**
+	 * 鏈�鏂拌浆鎹负map
+	 * @param o 瀵硅薄
+	 * @return map
+	 */
+	public static Map<String,Object> objectToMap(Object o){
+		Map<String,Object> map = new HashMap<String,Object>();
+		if(o!=null) {
+			String jsonString = JSONObject.toJSONStringWithDateFormat(o, VciDateUtil.DateTimeMillFormat, SerializerFeature.WriteDateUseDateFormat);
+			if(StringUtils.isNotBlank(jsonString)) {
+				JSONObject jsonObject = JSONObject.parseObject(jsonString);
+				if(jsonObject!=null){
+					for(String key : jsonObject.keySet()){
+						map.put(key,jsonObject.get(key));
+					}
+				}
+			}
+		}
+		return map;
+	}
+
+	/**
+	 * 瀵硅薄杞崲涓簃ap
+	 * @param o 瀵硅薄
+	 * @return map
+	 */
+	public static Map<String,String> objectToMapString(Object o){
+		Map<String,String> map = new HashMap<String,String>();
+		if(o!=null) {
+			String jsonString = JSONObject.toJSONStringWithDateFormat(o, VciDateUtil.DateTimeMillFormat, SerializerFeature.WriteDateUseDateFormat);
+			if(StringUtils.isNotBlank(jsonString)) {
+				JSONObject jsonObject = JSONObject.parseObject(jsonString);
+				if(jsonObject!=null){
+					for(String key : jsonObject.keySet()){
+						map.put(key,jsonObject.getString(key));
+					}
+				}
+			}
+		}
+		return map;
+	}
+
+	/**
+	 * 鍒ゆ柇鏌愪釜灞炴�ф槸鍚︿负绌�
+	 * @param obj 瀵硅薄
+	 * @param f 瀛楁
+	 * @return true鏄笉绌�
+	 */
+	public static boolean isNotNullForField(Object obj,Field f){
+		if(!"serialVersionUID".equalsIgnoreCase(f.getName()) &&!"DEFAULT_INITIAL_CAPACITY".equalsIgnoreCase(f.getName())&&null!=obj && !WebUtil.isNullOrNullString(obj.toString())) {
+			return true;
+		} else {
+			return false;
+		}
+	}
+
+	/**
+	 * 鏁扮粍杞崲涓哄瓧绗︿覆
+	 * @param array 鏁扮粍
+	 * @return 瀛楃涓�
+	 */
+	public static String array2String(String[] array) {
+		if(null == array || array.length == 0) {
+			return "";
+		}else{
+			return Arrays.stream(array).collect(Collectors.joining(","));
+		}
+	}
+
+	/**
+	 * 瀵硅薄杞崲涓哄瓧绗︿覆
+	 * @param obj 瀵硅薄
+	 * @return 瀛楃涓�
+	 */
+	public static String getString(Object obj){
+		if(obj == null) {
+			return "";
+		}
+		if(obj instanceof Date) {
+			return VciDateUtil.date2Str((Date) obj, VciDateUtil.DateTimeFormat);
+		}
+		return String.valueOf(obj);
+	}
+
+	/**
+	 * 鎷疯礉map閲岀殑鍊�
+	 * @param source 婧�
+	 * @param target 鐩爣
+	 * @param copyField 鎷疯礉鐨勫睘鎬�
+	 */
+	public static void copyValueForMap(Map source,Map target,String[] copyField){
+		Map<String,String> copyFieldMap = new HashMap<String,String>();
+		for(String field : copyField) {
+			copyFieldMap.put(field, field);
+		}
+		copyValueForMap(source,target,copyFieldMap);
+	}
+	/**
+	 * 涓簃ap鎷疯礉鍊�
+	 * @param source 婧�
+	 * @param target 鐩爣
+	 * @param copyField key涓虹洰鏍囧璞¢噷鐨勫瓧娈碉紝
+	 */
+	public static void copyValueForMap(Map source,Map target,Map<String,String> copyField){
+		try{
+			Iterator<String> it = copyField.keySet().iterator();
+			while(it.hasNext()){
+				String field = it.next();
+				target.put(field, source.get(copyField.get(field)));
+			}
+		}catch(Exception e){
+			if(logger.isErrorEnabled()){
+				logger.error("鎷疯礉鍊煎埌map",e);
+			}
+		}
+	}
+
+	/**
+	* 灏嗗瓧绗︿覆杞崲涓烘椂闂村璞�
+	* @param text 瀛楃涓�
+	* @return 鏃堕棿瀵硅薄
+	*/
+	public static Date readText2Date(String text){
+		DateConverter dateConverter = new DateConverter();
+		dateConverter.setAsText(text);
+		return dateConverter.getValue();
+	}
+
+	/**
+	 * 浠嶮ap閲岃幏鍙杁ouble绫诲瀷
+	 * @param field 瀛楁鍚嶇О
+	 * @param record map
+	 * @return 灞炴��
+	 */
+	public static Double getDoubleFromMap(String field,
+			Map<String, Object> record) {
+		if(WebUtil.isNullOrNullString(field) || record == null || !record.containsKey(field)) {
+			return null;
+		}else{
+			Object v = record.get(field);
+			if(v instanceof BigDecimal){
+				return ((BigDecimal)v).doubleValue();
+			}else if(v instanceof Double){
+				return ((Double)v).doubleValue();
+			}else{
+				return WebUtil.getDouble((String)v);
+			}
+		}
+	}
+
+    /**
+     * 鑾峰彇涓嶆槸绌哄�肩殑鏄犲皠锛屼笖key鏄皬鍐�
+     * @param map 鏄犲皠
+     * @return 鍘婚櫎绌哄�肩殑
+     */
+    public static Map getNotNullMap(Map map){
+    	if(map == null){
+    		return new HashMap();
+    	}
+    	Iterator it = map.keySet().iterator();
+		Map unNullMap = new HashMap();
+		while(it.hasNext()){
+			Object key = it.next();
+			String newKey = key.toString().toLowerCase();
+			Object value = map.get(key);
+			if(value !=null){
+				if(value instanceof String && WebUtil.isNotNull(value.toString())){
+					unNullMap.put(newKey, value);
+				}else if(!(value instanceof String)){
+					unNullMap.put(newKey, value);
+				}
+			}
+		}
+		return unNullMap;
+    }
+    
+    /**
+     * 鑾峰彇鍙傜収鐨勫睘鎬�
+     * @param c 瀵硅薄
+     * @return 鍙傜収灞炴��
+     */
+    public static Map<String,String> getReferAttrName(Class c){
+    	Map<String,String> fieldMap = new HashMap<String, String>();
+    	List<Field> allField = getAllFieldForObj(c);
+    	if(allField!=null&&allField.size()>0){
+    		for(Field field : allField){
+    			if (field.isAnnotationPresent(Transient.class)){
+    				//鏈夊弬鐓ф垨鑰呮灇涓�
+    				String referColumn = ((Transient)field.getAnnotation(Transient.class)).referColumn();
+    				if(isNotNull(referColumn)){
+    					fieldMap.put(referColumn.toLowerCase(), field.getName());
+    				}
+    			}
+    		}
+    	}
+    	return fieldMap;
+    }
+
+	/**
+	 * 鑾峰彇鍙傜収鐨勪笟鍔$被鍨�
+	 * @param c 瀵硅薄
+	 * @return 鍙傜収鐨勪笟鍔$被鍨�
+	 */
+	public static List<String> getReferBoAttrName(Class c){
+    	return getReferBoAttrName(c,false);
+    }
+
+	/**
+	 * 鑾峰彇鍙傜収鐨勪笟鍔$被鍨�
+	 * @param c 瀵硅薄
+	 * @param isNotHasEnum 鏄惁鍖呭惈鏋氫妇
+	 * @return 鍙傜収鐨勪笟鍔$被鍨�
+	 */
+	public static List<String> getReferBoAttrName(Class c,boolean isNotHasEnum){
+    	List<String> fieldMap = new ArrayList<String>();
+    	List<Field> allField = getAllFieldForObj(c);
+    	if(allField!=null&&allField.size()>0){
+    		for(Field field : allField){
+    			if (field.isAnnotationPresent(Transient.class)){
+    				//鏈夊弬鐓ф垨鑰呮灇涓�
+    				String referColumn = ((Transient)field.getAnnotation(Transient.class)).referColumn();
+    				if(isNotNull(referColumn) && 
+    						(!isNotHasEnum || (isNotHasEnum && referColumn.indexOf(".")>-1))){
+    					fieldMap.add(referColumn.toLowerCase());
+    				}
+    			}
+    		}
+    	}
+    	return fieldMap;
+    }
+    
+    /**
+     * 鑾峰彇瀵硅薄涓庝笟鍔$被鍨嬮噷鐨勫睘鎬ф槧灏�
+     * @param c 瀵硅薄鎵�灞炵被
+     * @return Map<String,String> 涓氬姟绫诲瀷鐨勫瓧娈碉細瀵硅薄涓婄殑灞炴��
+     */
+    public static Map<String/*涓氬姟绫诲瀷涓殑瀛楁*/,String/*瀵硅薄涓婄殑灞炴��*/> getFieldNameMap(Class c){
+    	Map<String,String> fieldMap = new HashMap<String, String>();
+    	List<Field> allField = getAllFieldForObj(c);
+    	if(allField!=null&&allField.size()>0){
+    		for(Field field : allField){
+    			if(!field.getName().equals("serialVersionUID")){
+	    			if(!field.isAnnotationPresent(Transient.class) ){
+	    				String clientBoAttrName = getCboAttrNameFromField(field,c);
+	    				fieldMap.put(clientBoAttrName, field.getName());
+	    				if(field.isAnnotationPresent(VciUseEnum.class)){
+	    					//杩欎釜鏄灇涓撅紝闇�瑕�
+							VciUseEnum vciUseEnum = field.getAnnotation(VciUseEnum.class);
+							fieldMap.put(vciUseEnum.value() + "_" + clientBoAttrName,vciUseEnum.showTextField());
+						}
+	    			}else if (field.isAnnotationPresent(Transient.class)){
+	    				//璇存槑涓嶆槸鎸佷箙鍖栫殑灞炴�э紝浣嗘槸浠庡钩鍙颁腑鏌ヨ鍑烘潵鍚庡彲鑳藉緱闇�瑕佹樉绀�
+	    				String referColumn = ((Transient)field.getAnnotation(Transient.class)).referColumn();
+	    				if(isNotNull(referColumn)){
+	    					fieldMap.put(referColumn, field.getName());
+	    				}
+	    			}else{
+	    				//瀛愯〃鐨勪笉鑳借繖鏍峰彇 				
+	    			}
+    			}
+    		}
+    	}
+		if(!CollectionUtils.isEmpty(fieldMap)){
+			//鐪嬬湅鏈夋病鏈塶ull
+			Map<String,String> fieldMapNotNull = new HashMap<>();
+			fieldMap.forEach((key,value)->{
+				if(value!=null){
+					fieldMapNotNull.put(key,value);
+				}
+			});
+			return fieldMapNotNull;
+		}
+    	return fieldMap;
+    }
+
+	/**
+	 * 鑾峰彇闆嗗悎鐨勫厓绱犵被鍨�
+	 * @param field 灞炴��
+	 * @return 鍏冪礌绫诲瀷, 涓嶆槸闆嗗悎鐨勬椂鍊欒繑鍥濶ull
+	 */
+	public static Class getCollectionElementClass(Field field) throws VciBaseException{
+    	Class fieldClass = null;
+    	if(field == null){
+    		return null;
+    	}
+		if(field.getType().isAssignableFrom(List.class) || 
+				field.getType().isAssignableFrom(Set.class) ||
+				field.getType().isAssignableFrom(Vector.class)){
+			Type fc = field.getGenericType();
+			if(fc instanceof ParameterizedType){
+				ParameterizedType pt = (ParameterizedType)fc;
+				fieldClass= (Class)pt.getActualTypeArguments()[0];
+			}
+		}
+		return fieldClass;
+    }
+
+	/**
+	 * 鑾峰彇瀛楁鍦ㄤ笟鍔$被鍨嬩腑鐨勫悕绉�
+	 * @param field 瀛楁
+	 * @param c 涓氬姟绫诲瀷
+	 * @return 涓氬姟绫诲瀷涓殑鍚嶇О
+	 */
+	public static String getCboAttrNameFromField(Field field,Class c){
+    	String clientBoAttrName = field.getName().toLowerCase();
+		boolean isFindColumn = false;
+		if(field.isAnnotationPresent(Column.class)){
+			String name = ((Column)field.getAnnotation(Column.class)).name();
+			if(isNotNull(name)){
+				clientBoAttrName = name.toLowerCase();
+			}
+			isFindColumn = true;
+		}
+		if(!isFindColumn){
+			//鎵句竴涓婫et鏂规硶涓�..set鏂规硶涓婅偗瀹氭槸涓嶆敮鎸佺殑锛�
+			Method getMethod = getGetmethod(c, field);
+			if(getMethod!=null && !getMethod.isAnnotationPresent(Transient.class)){
+				if(getMethod.isAnnotationPresent(Column.class)){
+					String name = ((Column)getMethod.getAnnotation(Column.class)).name();
+					if(isNotNull(name)){
+						clientBoAttrName = name.toLowerCase();
+					}
+				}
+			}else if(getMethod!=null && getMethod.isAnnotationPresent(Transient.class)){
+				//璇存槑涓嶆槸鎸佷箙鍖栫殑灞炴�э紝浣嗘槸浠庡钩鍙颁腑鏌ヨ鍑烘潵鍚庡彲鑳藉緱闇�瑕佹樉绀�
+				String referColumn = ((Transient)field.getAnnotation(Transient.class)).referColumn();
+				if(isNotNull(referColumn)){
+					clientBoAttrName = referColumn;
+				}
+			}
+		}
+		return VciQueryWrapperForDO.BASE_MODEL_COMPATIBILITY_MAP.getOrDefault(clientBoAttrName.toLowerCase(Locale.ROOT),clientBoAttrName);
+    }
+    
+    /**
+     * 鑾峰彇瀵硅薄涓殑鎵�鏈夊睘鎬э紝鍖呮嫭鍏剁户鎵跨殑灞炴��
+     * @param c 瀵硅薄
+     * @return 鎵�鏈夌殑灞炴��
+     */
+    public static List<Field> getAllFieldForObj(Class c){
+    	List<Field> allField = new ArrayList<Field>();
+    	for(Class<?> classz = c ; classz != Object.class ; classz = classz.getSuperclass() ){
+    		Field[] thisClassField = classz.getDeclaredFields();
+    		for(Field field : thisClassField){
+    			if(!field.getName().equals("serialVersionUID")){
+	    			if(!allField.contains(field)){
+	    				allField.add(field);
+	    			}
+    			}
+    		}
+    	}
+    	return allField;
+    }
+    
+    /**
+     * 鑾峰彇瀵硅薄鐨勪富閿瓧娈�
+     * @param c 瀵硅薄鎵�灞炵殑绫�
+     * @return 涓婚敭鐨勫璞�
+     */
+    public static Field getPkFieldForObj(Class c){
+    	List<Field> allField = getAllFieldForObj(c);
+    	if(allField!=null&&allField.size()>0){
+    		for(Field field : allField){
+    			if(field.isAnnotationPresent(Id.class)){
+    				return  field;
+    			}
+    		}
+    		//濡傛灉娌℃壘鍒帮紝閭e氨鎵緊id
+    		for(Field field : allField){
+    			if(field.getName().toLowerCase().equalsIgnoreCase("oid")){
+    				return  field;
+    			}
+    		}
+    	}
+    	return null;
+    }
+
+	/**
+	 * 鑾峰彇ts鐨勫瓧娈�
+	 * @param c 瀵硅薄鎵�灞炵殑绫�
+	 * @return 鏃堕棿鎴崇殑瀵硅薄
+	 */
+	public static Field getTsField(Class c){
+    	List<Field> allField = getAllFieldForObj(c);
+    	if(allField!=null&&allField.size()>0){
+    		for(Field field : allField){
+    			if(field.getName().equals("ts")){
+    				return  field;
+    			}
+    		}
+    	}
+    	return null;
+    }
+    
+    /**
+     * 鏍规嵁鍚嶇О鑾峰彇瀛楁
+     * @param field 瀛楁鐨勫悕绉�
+     * @param obj 瀵硅薄
+     * @return 瀛楁瀵硅薄
+     */
+    public static Field getFieldForObject(String field,Object obj){
+    	if(obj == null){
+    		return null;
+    	}
+    	return getFieldForObject(field,obj.getClass());
+    }
+
+	/**
+	 * 鏍规嵁鍚嶇О鑾峰彇瀛楁
+	 * @param fieldName 瀛楁鐨勫悕绉�
+	 * @param c 瀵硅薄绫诲瀷
+	 * @return 瀛楁瀵硅薄
+	 */
+	public static Field getFieldForObject(String fieldName,Class c){
+    	List<Field> allField = getAllFieldForObj(c);
+    	if(allField!=null&&allField.size()>0){
+    		for(Field field : allField){
+    			if(field.getName().toLowerCase().equalsIgnoreCase(fieldName.toLowerCase())){
+    				return  field;
+    			}
+    		}
+    	}
+    	return null;
+    }
+
+	/**
+	 * 鑾峰彇杩炴帴绫诲瀷鐨勪富閿俊鎭�
+	 * @param s 瀛楃涓�
+	 * @return 杩炴帴绫诲瀷
+	 */
+	public static LinkTypeInfoVO getLinkTypeAnnotation(String s){
+    	if(s.indexOf("\"") > -1 
+				&& s.indexOf(":") > -1 
+				&& s.indexOf("}") > -1){
+			return JSONObject.parseObject(s, LinkTypeInfoVO.class);
+    	}
+    	return null;
+    }
+    
+    /**
+     * 鑾峰彇瀛楁鐨剆etter
+     * @param c 瀵硅薄绫�
+     * @param field 瀛楁
+     * @return 鏂规硶
+     */
+    public static Method getSetmethod(Class c,Field field){
+    	return getSetmethod(c,field.getName());
+    }
+    
+    /**
+     * 鑾峰彇瀛楁鐨剆etter
+     * @param c 瀵硅薄绫诲瀷
+     * @param fieldName 瀛楁鍚嶇О
+     * @return 鏂规硶
+     */
+    public static Method getSetmethod(Class c,String fieldName){
+    	if(c!=null&&isNotNull(fieldName)){
+    		try {
+    			PropertyDescriptor pd = new PropertyDescriptor(fieldName, c);
+				return pd.getWriteMethod();
+			} catch (SecurityException e) {
+			} catch (IntrospectionException e) {
+			}
+    	}
+    	return null;
+    }
+    
+    /**
+     * 鑾峰彇瀛楁鐨刧etter
+	 * @param c 瀵硅薄绫诲瀷
+	 * @param fieldName 瀛楁鍚嶇О
+	 * @return 鏂规硶
+     */
+    public static Method getGetmethod(Class c,String fieldName){
+    	if(c!=null&&isNotNull(fieldName)){
+    		try {
+    			PropertyDescriptor pd = new PropertyDescriptor(fieldName, c);
+				return pd.getReadMethod();
+			} catch (SecurityException e) {
+			} catch (IntrospectionException e) {
+			}
+    	}
+    	return null;
+    }
+    
+    /**
+     * 鑾峰彇瀛楁鐨刧etter
+	 * @param c 瀵硅薄绫诲瀷
+	 * @param field 瀛楁
+	 * @return 鏂规硶
+     */
+    public static Method getGetmethod(Class c,Field field){
+    	return getGetmethod(c,field.getName());
+    }
+
+	/**
+	 * 鑾峰彇瀵硅薄杞崲瀛楃涓�
+	 * @param obj 瀵硅薄
+	 * @return 瀛楃涓�
+	 */
+	public static String getStringValueFromObject(Object obj){
+    	if(obj == null){
+    		return "";
+    	}else{
+    		if(obj instanceof Integer || obj instanceof Float || obj instanceof Long || obj instanceof Double){
+				return String.valueOf(obj);
+			}else if(obj instanceof Date){
+				return VciDateUtil.date2Str((Date)obj, VciDateUtil.DateTimeMillFormat);
+			}else{
+				return obj.toString();
+			}
+    	}
+    }
+    
+    /**
+     * 灏嗗钩鍙拌繑鍥炵殑灞炴�у�艰祴鍊煎埌瀵硅薄涓�
+     * @param fieldName 灞炴�у悕
+     * @param obj 瀵硅薄
+     * @param value 灞炴�у��
+     */
+    public static void setValueForFieldFromCbo(String fieldName,Object obj,String value){
+		try{
+			Field field = getFieldForObject(fieldName,obj);
+			if(field!=null){
+				 field.setAccessible(true);
+	                Method setMethod = getSetmethod(field.getDeclaringClass(), fieldName);
+	                if(setMethod ==null) {
+	                		logger.error(obj.getClass().getName() + "涓睘鎬�" + fieldName + "娌℃湁setter鏂规硶");
+	                }
+	                Class type = field.getType();
+	                //浠庡钩鍙拌鍙栧埌鐨勫�间笉浼氫负null锛屼负绌烘椂涓�""锛涙墍浠ヤ笉澶勭悊绌哄��
+	                if(type.equals(int.class) || type.equals(Integer.class)){
+	                    int valueObj = getInt(value);
+	                    if(setMethod !=null) {
+	                        setMethod.invoke(obj,valueObj);
+	                    }else{
+	                        field.set(obj,valueObj);
+	                    }
+	                }else if(type.equals(float.class) || type.equals(Float.class)){
+	                    float valueObj = getFloat(value);
+	                    if(setMethod !=null) {
+	                        setMethod.invoke(obj, valueObj);
+	                    }else{
+	                        field.set(obj,valueObj);
+	                    }
+	                }else if(type.equals(long.class) || type.equals(Long.class)){
+	                    long valueObj = getLong(value);
+	                    if(setMethod !=null) {
+	                        setMethod.invoke(obj, valueObj);
+	                    }else{
+	                        field.set(obj,valueObj);
+	                    }
+	                }else if(type.equals(Double.class) || type.equals(double.class)){
+	                    double valueObj = getDouble(value);
+	                    if(setMethod !=null) {
+	                        setMethod.invoke(obj, valueObj);
+	                    }else{
+	                        field.set(obj,valueObj);
+	                    }
+	                    //浠庡钩鍙颁腑鏌ヨ鍑烘潵灏变笉鐢ㄥ鐞嗙簿搴︿簡锛屽洜涓哄钩鍙颁細鑷澶勭悊
+	                }else if(type.equals(Short.class) || type.equals(short.class)){
+	                	short valueObject = getShort(value);
+						if(setMethod !=null) {
+							setMethod.invoke(obj, valueObject);
+						}else{
+							field.set(obj,valueObject);
+						}
+					}else if(type.equals(Date.class)){
+	                    //骞冲彴瀹為檯瀛樺偍鐨勯兘鏄疶imestamp,涓嶈鏄棩鏈燂紝鏃ユ湡鏃堕棿锛岄兘鏄�傚鏋滀粎鏄椂闂达紝闇�瑕佺敤瀛楃涓叉潵瀛樺偍銆�
+	                    Date d = null;
+	                    if(StringUtils.isNotBlank(value)){
+	                    		try {
+								if (value.indexOf("-") > -1 && value.indexOf(".") > -1 && value.indexOf(" ") > -1 && value.substring(value.lastIndexOf(".") + 1).length() == 9) {
+									//2013-4-19.14.5. 45. 734000000  杩欑鏍煎紡锛岃繖涓湪浣跨敤SQL璇彞鐩存帴鏌ヨ鍑烘椂闂村瓧娈电殑鏃跺�欏氨浼氭樉绀烘垚杩欐牱
+									String ymd = value.substring(0, value.indexOf("."));
+									value = value.substring(value.indexOf(".") + 1);
+									if (value.indexOf(".") > -1) {
+										String hms = value.substring(0, value.lastIndexOf("."));
+										String nano = value.substring(value.lastIndexOf(".") + 1).trim();
+										hms = hms.replace(".", ":").replace(" ", "");
+										Date tempDate = VciDateUtil.str2Date(ymd + " " + hms, "yyyy-M-d h:m:s");
+										if (tempDate != null) {
+											Timestamp ts = Timestamp.valueOf(VciDateUtil.date2Str(tempDate, VciDateUtil.DateTimeFormat) + "." + nano);
+											d = ts;
+										}
+									}
+								} else if (value.matches("\\d+\\.?\\d*")) {
+									//杩樻湁鍧戠埞鐨勬槸缁欑殑long鍨嬬殑瀛楃涓�
+									d = new Date();
+									d.setTime(getLong(value));
+								} else {
+									if(field.isAnnotationPresent(VciFieldType.class)) {
+										VciFieldType vciFieldType = field.getAnnotation(VciFieldType.class);
+										if(VciFieldTypeEnum.VTDate.equals(vciFieldType.value())) {
+											d = VciDateUtil.str2Date(value, VciDateUtil.DateFormat);
+										}else if(VciFieldTypeEnum.VTDateTime.equals(vciFieldType.value())){
+											d = VciDateUtil.str2Date(value, VciDateUtil.DateTimeFormat);
+										}else {
+											if(value.indexOf("-") > -1 &&value.length() == 10 ) {
+												d = VciDateUtil.str2Date(value, VciDateUtil.DateFormat);
+											}else {
+												d = VciDateUtil.str2Date(value, VciDateUtil.DateTimeMillFormat);
+											}
+										}
+									}else {
+										if(value.indexOf("-") > -1 &&value.length() == 10 ) {
+											d = VciDateUtil.str2Date(value, VciDateUtil.DateFormat);
+										}else {
+											d = VciDateUtil.str2Date(value, VciDateUtil.DateTimeMillFormat);
+										}
+									}
+								}
+							} catch (Exception e) {
+								try {
+									d = VciDateUtil.str2Date(value, VciDateUtil.DateTimeMillFormat);
+								} catch (Exception e1) {
+
+								}
+							}
+	                    }
+	                    try {
+	                        if(d != null ){
+	                            if(setMethod !=null) {
+	                                setMethod.invoke(obj, d);
+	                            }else{
+	                                field.set(obj,d);
+	                            }
+	                        }
+	                    } catch (Exception e) {
+	                    }
+	                }else if(type.equals(String.class)){
+	                    if(setMethod != null) {
+	                        setMethod.invoke(obj, value);
+	                    }else{
+	                        field.set(obj,value);
+	                    }
+	                }else{
+	                    logger.info("WebUtil.setValueForFieldForCbo:涓嶆敮鎸佺殑绫诲瀷" + type.toString());
+	                }
+			}
+		}catch (Exception e) {
+			if(logger.isErrorEnabled()){
+				logger.error("杞崲瀛楃涓插嚭閿�",e);
+			}
+		}
+    }
+
+    /**
+     * 浠庡璞′笂鑾峰彇鍊硷紝骞惰浆鎹负骞冲彴鍙互瀛樺偍鐨勫唴瀹癸紝闇�瑕佹彁鍓嶅垽鏂瓧娈垫槸鍚﹀睘浜庡钩鍙扮殑瀛楁
+     * @param field 灞炴�у璞�
+     * @param obj 瑕佽缃�肩殑瀵硅薄
+     * @return 鍊�
+     */
+    public static String getValueFromFieldForCbo(Field field ,Object obj){
+    	Object value = getValueFromField(field.getName(),obj);
+    	if(value!=null){
+    		try {
+    			Class type = field.getType();
+				if(type.equals(int.class) || type.equals(Integer.class)){
+					return String.valueOf(((Integer)value).intValue());
+				}else if(type.equals(long.class) || type.equals(Long.class)){
+					return String.valueOf(((Long)value).longValue());
+				}else if(type.equals(float.class) || type.equals(Float.class)){
+					return String.valueOf(((Float)value).floatValue());
+				}else if(type.equals(short.class) || type.equals(Short.class)){
+					return String.valueOf(((Short)value).shortValue());
+				}else if(type.equals(Double.class) || type.equals(double.class)){
+					return String.valueOf(((Double)value).doubleValue());
+					//绮惧害鐢卞钩鍙板簳灞傚鐞�
+				}else if(type.equals(Date.class)){
+					//骞冲彴瀹為檯瀛樺偍鐨勯兘鏄疶imestamp,涓嶈鏄棩鏈燂紝鏃ユ湡鏃堕棿锛岄兘鏄�傚鏋滀粎鏄椂闂达紝闇�瑕佺敤瀛楃涓叉潵瀛樺偍銆俲ava淇濈暀鍒版绉掞紝鑰宱racle鏄繚鐣欏埌寰鐨�
+					String dataFormat = "";
+					if(field.isAnnotationPresent(VciFieldType.class)){
+						if(VciFieldTypeEnum.VTDate.name().equals((field.getAnnotation(VciFieldType.class).value()).name().toLowerCase())){
+							dataFormat = VciDateUtil.DateFormat;
+						}
+					}
+					if(StringUtils.isBlank(dataFormat)){
+						dataFormat = VciDateUtil.DateTimeMillFormat;
+					}
+					return VciDateUtil.date2Str((Date)value, dataFormat);
+				}else if(type.equals(Timestamp.class)){
+					return VciDateUtil.date2Str((Timestamp)value, VciDateUtil.DateTimeMillFormat);
+				}else if(type.equals(String.class)){
+					return value.toString();
+				}else{
+					logger.info("WebUtil.setValueForFieldForCbo:涓嶆敮鎸佺殑绫诲瀷" + type.toString());
+				}
+    		} catch (SecurityException e) {
+    			if(logger.isErrorEnabled()){
+    				logger.error("WebUtil.setValueForFieldForCbo",e);
+				}
+    		} catch (IllegalArgumentException e) {
+				if(logger.isErrorEnabled()){
+					logger.error("WebUtil.setValueForFieldForCbo",e);
+				}
+    		} 
+    		return null;
+    	}else{
+    		return null;//杩斿洖缁欏钩鍙扮殑璇濓紝涓嶈兘鏈塶ull瀵硅薄
+    	}
+    }
+    
+    /**
+     * 涓哄璞¤祴鍊硷紝涓嶅垽鏂被鍨嬶紝灞炴�ф槸浠�涔堢被鍨嬬殑锛寁alue灏卞繀椤绘槸浠�涔堢被鍨�
+     * @param fieldName 灞炴�у悕绉�
+     * @param targetObject 瀵硅薄
+     * @param value 灞炴�у��
+     */
+    public static void setValueToField(String fieldName,Object targetObject,Object value){
+		if(isNotNull(fieldName)){
+			Method setMethod = getSetmethod(targetObject.getClass(), fieldName);
+			try {
+				if(setMethod != null){
+					setMethod.invoke(targetObject, value);
+				}else{
+					Field field = getFieldForObject(fieldName, targetObject);
+					if(field !=null){
+						field.setAccessible(true);
+						field.set(targetObject, value);
+					}
+				}
+			} catch (IllegalArgumentException e) {
+				if(logger.isErrorEnabled()){
+					logger.error("WebUtil.setValueToField",e);
+				}
+			} catch (IllegalAccessException e) {
+				if(logger.isErrorEnabled()){
+					logger.error("WebUtil.setValueToField",e);
+				}
+			} catch (InvocationTargetException e) {
+				if(logger.isErrorEnabled()){
+					logger.error("WebUtil.setValueToField",e);
+				}
+			}
+		}
+	}
+	
+    /**
+     * 浠庡璞′笂鑾峰彇灞炴�х殑鍊�
+     * @param fieldName 灞炴�у悕
+     * @param sourceObject 瀵硅薄
+     * @return 鍊�
+     */
+	public static Object getValueFromField(String fieldName,Object sourceObject){
+		if(isNotNull(fieldName)){
+			try {
+				Method getMethod = getGetmethod(sourceObject.getClass(), fieldName);
+				if(getMethod !=null){
+					return getMethod.invoke(sourceObject);
+				}else{
+					//璇存槑娌℃湁璁剧疆getter锛屾瘮濡侭O鍜孡O瀵硅薄杩欑
+					Field field = getFieldForObject(fieldName, sourceObject);
+					if(field !=null){
+						field.setAccessible(true);
+						return field.get(sourceObject);
+					}
+				}
+			} catch (SecurityException e) {
+				if(logger.isErrorEnabled()){
+					logger.error("WebUtil.getValueFromField",e);
+				}
+			} catch (IllegalAccessException e) {
+				if(logger.isErrorEnabled()){
+					logger.error("WebUtil.getValueFromField",e);
+				}
+			} catch (IllegalArgumentException e) {
+				if(logger.isErrorEnabled()){
+					logger.error("WebUtil.getValueFromField",e);
+				}
+			} catch (InvocationTargetException e) {
+				if(logger.isErrorEnabled()){
+					logger.error("WebUtil.getValueFromField",e);
+				}
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * 鎷疯礉涓氬姟鏁版嵁 鍒� 瀵硅薄鐨勫睘鎬�
+	 * @param cbo 涓氬姟鏁版嵁
+	 * @param obj 瀵硅薄
+	 */
+	public static void copyValueToObjectFromCbos(ClientBusinessObject cbo,Object obj){
+		if(cbo!=null){
+			copyValueToObjectFromBos(cbo.getBusinessObject(),obj);
+		}
+	}
+
+	/**
+	 * 鎷疯礉涓氬姟鏁版嵁 鍒� 瀵硅薄鐨勫睘鎬�
+	 * @param cbo 涓氬姟鏁版嵁
+	 * @param obj 瀵硅薄
+	 * @param fieldAttrMap 灞炴�ф槧灏�
+	 */
+	public static void copyValueToObjectFromCbos(ClientBusinessObject cbo,Object obj,Map<String,String> fieldAttrMap){
+		if(cbo!=null){
+			copyValueToObjectFromBos(cbo.getBusinessObject(),obj,fieldAttrMap);
+		}
+	}
+
+	/**
+	 * 鏍规嵁瀵硅薄鑾峰彇鍏朵笟鍔$被鍨嬬殑鍚嶇О
+	 * @param c 鏁版嵁瀵硅薄鎵�灞炵殑绫�
+	 * @return 涓氬姟绫诲瀷
+	 */
+	public static String getBtmTypeByObject(Class c){
+		String btmType = c.getSimpleName().toLowerCase();
+		if(btmType.endsWith("DO")) {
+			btmType = btmType.substring(0,btmType.length()-2);
+		}
+		if(c.isAnnotationPresent(VciBtmType.class)) {
+			VciBtmType tableAnnotation = (VciBtmType) c.getAnnotation(VciBtmType.class);
+			String tempBtmType = tableAnnotation.name();
+			if (WebUtil.isNotNull(tempBtmType)) {
+				btmType = tempBtmType.toLowerCase();
+			}
+		}
+		return btmType;
+	}
+
+	/**
+	 * 鑾峰彇杩炴帴绫诲瀷鐨勫悕绉�
+	 * @param c 杩炴帴绫诲瀷鎵�灞炵殑绫�
+	 * @return 涓氬姟绫诲瀷
+	 */
+	public static String getLinkTypeByObject(Class c){
+		String btmType = c.getSimpleName().toLowerCase();
+		if(btmType.endsWith("DO")) {
+			btmType = btmType.substring(0,btmType.length()-2);
+		}
+		if(c.isAnnotationPresent(VciLinkType.class)){
+			VciLinkType tableAnnotation = (VciLinkType) c.getAnnotation(VciLinkType.class);
+			String tempBtmType = tableAnnotation.name();
+			if (WebUtil.isNotNull(tempBtmType)) {
+				btmType = tempBtmType.toLowerCase();
+			}
+		}
+		return btmType;
+	}
+
+
+	/**
+	 * 鎷疯礉涓氬姟鏁版嵁 鍒� 瀵硅薄鐨勫睘鎬�
+	 * @param bo 涓氬姟鏁版嵁
+	 * @param obj 瀵硅薄
+	 */
+	public static void copyValueToObjectFromBos(BusinessObject bo ,Object obj){
+		copyValueToObjectFromBos(bo,obj,null);
+	}
+
+	/**
+	 * 鎷疯礉涓氬姟鏁版嵁 鍒� 瀵硅薄鐨勫睘鎬�
+	 * @param bo 涓氬姟鏁版嵁
+	 * @param obj 瀵硅薄
+	 * @param fieldAttrMap 灞炴�ф槧灏�
+	 */
+    public static void copyValueToObjectFromBos(BusinessObject bo ,Object obj,Map<String,String> fieldAttrMap){
+    	if(bo!=null && obj != null){
+    		//鍏堟妸鎵�鏈夌殑瀛楁鏄犲皠鎵惧埌
+    		if(fieldAttrMap == null){
+    			fieldAttrMap = getFieldNameMap(obj.getClass());
+    		}
+			AttributeValue[] newAList = bo.newAttrValList;
+			AttributeValue[] hisAList = bo.hisAttrValList;
+			//瑕佸厛鎶夿O瀵硅薄涓婄殑鍊兼嫹璐濊繃鍘�
+			List<Field> boFields = getAllFieldForObj(bo.getClass());
+	
+			if(boFields!=null){
+				for(Field field :boFields){
+					if(fieldAttrMap.containsKey(field.getName().toLowerCase())){
+						//璇存槑杩欎釜灏辨槸鍦˙O瀵硅薄涓婄殑
+						Object value = getValueFromField(field.getName(), bo);
+						if(value !=null){
+							setValueForFieldFromCbo(fieldAttrMap.get(field.getName().toLowerCase()), obj, getStringValueFromObject(value));
+						}
+					}
+				}
+			}
+			if(newAList!=null&&newAList.length>0){
+				for(int i = 0 ; i < newAList.length;i++){
+					AttributeValue av = newAList[i];
+					String attrName = av.attrName.toLowerCase();
+					if(fieldAttrMap.containsKey(attrName)) {
+						String fieldName = fieldAttrMap.get(attrName);
+						setValueForFieldFromCbo(fieldName, obj, av.attrVal);
+					}else{
+						fieldAttrMap.forEach((cboField,fieldName)->{
+							if(fieldName!=null && fieldName.equalsIgnoreCase(attrName) && cboField.contains(".")){
+								//鍙傜収鐨勬椂鍊�
+								setValueForFieldFromCbo(fieldName, obj, av.attrVal);
+								return;
+							}
+						});
+					}
+				}
+			}
+			if(hisAList!=null&&hisAList.length>0){
+				for(int i = 0 ; i < hisAList.length;i++){
+					AttributeValue av = hisAList[i];
+					String attrName = av.attrName.toLowerCase();
+					String fieldName = fieldAttrMap.get(attrName);
+					if(fieldName!=null){
+						setValueForFieldFromCbo(fieldName, obj, av.attrVal);
+					}else{
+						fieldAttrMap.forEach((cboField,field)->{
+							if(field!=null && field.equalsIgnoreCase(attrName) && cboField.contains(".")){
+								//鍙傜収鐨勬椂鍊�
+								setValueForFieldFromCbo(field, obj, av.attrVal);
+								return;
+							}
+						});
+					}
+				}
+			}
+		}
+    }
+
+	/**
+	 * 鎷疯礉涓氬姟绫诲瀷鍒癿ap
+	 * @param cbo 涓氬姟鏁版嵁
+	 * @param map map
+	 */
+	public static void copyValueToMapFromCbos(ClientBusinessObject cbo,Map<String,String> map){
+    	if(cbo!=null){
+    		copyValueToMapFromBos(cbo.getBusinessObject(),map);
+		}
+    }
+
+	/**
+	 * 鎷疯礉涓氬姟绫诲瀷鍒癿ap
+	 * @param bo 涓氬姟鏁版嵁
+	 * @param map map
+	 */
+    public static void copyValueToMapFromBos(BusinessObject bo,Map<String,String> map){
+    	if(bo!=null ){
+    		//鍏堟妸鎵�鏈夌殑瀛楁鏄犲皠鎵惧埌
+			AttributeValue[] newAList = bo.newAttrValList;
+			AttributeValue[] hisAList = bo.hisAttrValList;
+			if(hisAList!=null&&hisAList.length>0){//
+				for(int i = 0 ; i < hisAList.length;i++){
+					AttributeValue av = hisAList[i];
+					String attrName = av.attrName.toLowerCase();
+					map.put(attrName, av.attrVal);
+				}
+			}
+			if(newAList!=null&&newAList.length>0){//NEW鐨勪紭鍏堢骇楂樹簺
+				for(int i = 0 ; i < newAList.length;i++){
+					AttributeValue av = newAList[i];
+					String attrName = av.attrName.toLowerCase();
+					map.put(attrName, av.attrVal);
+				}
+			}
+		}
+    }
+
+	/**
+	 * 鎷疯礉閾炬帴绫诲瀷鐨勫�煎埌map
+	 * @param clo 閾炬帴绫诲瀷
+	 * @param map map
+	 */
+	public static void copyValueToMapFromClos(ClientLinkObject clo,Map<String,String> map){
+    	if(clo!=null){
+    		copyValueToMapFromLos(clo.getLinkObject(),map);
+    	}
+    }
+
+	/**
+	 * 鎷疯礉閾炬帴绫诲瀷鐨勫�煎埌map
+	 * @param lo 閾炬帴绫诲瀷
+	 * @param map map
+	 */
+	public static void copyValueToMapFromLos(LinkObject lo,Map<String,String> map){
+    	if(lo!=null){
+			WebLoServiceImpl.LO_BASE_FIELD_MAP.forEach((field,attr)->{
+				map.put(attr.toLowerCase(),getValueFromFieldForCbo(getFieldForObject(field,lo),lo));
+			});
+    		//鍏堟妸鎵�鏈夌殑瀛楁鏄犲皠鎵惧埌
+			AttributeValue[] newAList = lo.newAttrValList;
+			AttributeValue[] hisAList = lo.hisAttrValList;
+			if(hisAList!=null&&hisAList.length>0){
+				for(int i = 0 ; i < hisAList.length;i++){
+					AttributeValue av = hisAList[i];
+					String attrName = av.attrName.toLowerCase();
+					map.put(attrName, av.attrVal);
+				}
+			}
+			if(newAList!=null&&newAList.length>0){
+				for(int i = 0 ; i < newAList.length;i++){
+					AttributeValue av = newAList[i];
+					String attrName = av.attrName.toLowerCase();
+					map.put(attrName, av.attrVal);
+				}
+			}
+    	}
+    }
+	/**
+	 * 鎷疯礉閾炬帴绫诲瀷鐨勫�煎埌瀵硅薄
+	 * @param clo 閾炬帴绫诲瀷
+	 * @param obj 瀵硅薄
+	 * @param fieldAttrMap 灞炴�ap
+	 */
+    public static void copyValueToObjectFromClos(ClientLinkObject clo,Object obj,Map<String,String> fieldAttrMap){
+		if(clo!=null){
+			copyValueToObjectFromLos(clo.getLinkObject(),obj,fieldAttrMap);
+		}
+	}
+
+	/**
+	 * 鎷疯礉閾炬帴绫诲瀷鐨勫�煎埌瀵硅薄
+	 * @param lo 閾炬帴绫诲瀷
+	 * @param obj 瀵硅薄
+	 */
+	public static void copyValueToObjectFromLos(LinkObject lo ,Object obj){
+		copyValueToObjectFromLos(lo,obj,null);
+	}
+
+	/**
+	 * 鎷疯礉閾炬帴绫诲瀷鐨勫�煎埌瀵硅薄
+	 * @param lo 閾炬帴绫诲瀷
+	 * @param obj 瀵硅薄
+	 * @param fieldAttrMap 灞炴�ap
+	 */
+    public static void copyValueToObjectFromLos(LinkObject lo ,Object obj,Map<String,String> fieldAttrMap){
+    	if(lo!=null && obj != null){
+    		//鍏堟妸鎵�鏈夌殑瀛楁鏄犲皠鎵惧埌
+    		if(fieldAttrMap == null){
+    			fieldAttrMap = getFieldNameMap(obj.getClass());
+    		}
+			AttributeValue[] newAList = lo.newAttrValList;
+			AttributeValue[] hisAList = lo.hisAttrValList;
+			if(newAList!=null&&newAList.length>0){
+				for(int i = 0 ; i < newAList.length;i++){
+					AttributeValue av = newAList[i];
+					String attrName = av.attrName.toLowerCase();
+					String fieldName = fieldAttrMap.get(attrName);
+					setValueForFieldFromCbo(fieldName, obj, av.attrVal);//渚濈劧浣跨敤CBO鐨勫鐞嗘柟寮�
+				}
+			}
+			if(hisAList!=null&&hisAList.length>0){
+				for(int i = 0 ; i < hisAList.length;i++){
+					AttributeValue av = hisAList[i];
+					String attrName = av.attrName.toLowerCase();
+					String fieldName = fieldAttrMap.get(attrName);
+					if(fieldName!=null){
+						setValueForFieldFromCbo(fieldName, obj, av.attrVal);
+					}
+				}
+			}
+		}
+    }
+	/**
+	 * 鎷疯礉閾炬帴绫诲瀷鐨勫�煎埌map
+	 * @param cbo 閾炬帴绫诲瀷
+	 * @param map 瀵硅薄
+	 */
+    public static void copyValueToCboFromMap(ClientBusinessObject cbo,Map<String,String> map) throws VciBaseException{
+    	if(map!=null){
+    		Iterator<String> it = map.keySet().iterator();
+    		while(it.hasNext()){
+    			String key = it.next();
+    			String value = map.get(key);
+    			if(value == null){
+    				value = "";
+    			}
+    			try {
+    				if(isDefaultField(key)){
+    					setValueToField(key, cbo, value);
+    				}
+    				cbo.setAttributeValueWithNoCheck(key.toLowerCase(), value);
+    			} catch (VCIError e) {
+    				throw WebUtil.getVciBaseException(e);
+    			}
+    		}
+    	}
+    }
+
+	/**
+	 * 鎷疯礉閾炬帴绫诲瀷鐨勫�煎埌map
+	 * @param clo 閾炬帴绫诲瀷
+	 * @param map 瀵硅薄
+	 */
+    public static void copyValueToCloFromMap(ClientLinkObject clo,Map<String,String> map) throws VciBaseException{
+    	if(map!=null){
+    		Iterator<String> it = map.keySet().iterator();
+    		while(it.hasNext()){
+    			String key = it.next();
+    			String value = map.get(key);
+    			if(value == null){
+    				value = "";
+    			}
+    			try {
+    				if(isDefaultField(key)){
+    					setValueToField(key, clo, value);
+    				}else {
+						clo.setAttributeValue(key.toLowerCase(), value);
+					}
+    			} catch (VCIError e) {
+    				throw WebUtil.getVciBaseException(e);
+    			}
+    		}
+    	}
+    }
+
+	/**
+	 * 鎷疯礉涓氬姟瀵硅薄
+	 * @param bo 涓氬姟瀵硅薄
+	 * @param obj 鏁版嵁瀵硅薄
+	 * @throws VciBaseException 鎷疯礉鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+	 */
+	public static void copyValueToBoFromObj(BusinessObject bo,Object obj) throws VciBaseException{
+    	ClientBusinessObject cbo = new ClientBusinessObject();
+    	cbo.setBusinessObject(bo);
+    	copyValueToCboFromObj(cbo,obj);
+    	bo = cbo.getBusinessObject();
+    }
+
+	/**
+	 * 鎷疯礉涓氬姟瀵硅薄
+	 * @param cbo 涓氬姟瀵硅薄
+	 * @param obj 鏁版嵁瀵硅薄
+	 * @throws VciBaseException 鎷疯礉鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+	 */
+	public static void copyValueToCboFromObj(ClientBusinessObject cbo ,Object obj) throws VciBaseException{
+    	Map<String,String> fieldMap = getFieldNameMap(obj.getClass());//鍏堟煡鎵炬墍鏈夐渶瑕佹寔涔呭寲鍒板钩鍙扮殑灞炴�э紝涓嶉渶瑕佹寔涔呭寲鐨勫氨涓嶇敤璧嬪�间簡
+    	Iterator<String> it = fieldMap.keySet().iterator();
+    	while(it.hasNext()){
+    		String attrName = it.next();
+    		String fieldName = fieldMap.get(attrName);
+    		if(isNormalAttr(attrName)){//涓嶆槸鍙傜収鐨勫睘鎬ф墠鑳借祴鍊�
+    			Field thisField = getFieldForObject(fieldName, obj);
+    			String value = getValueFromFieldForCbo(thisField, obj);
+    			if(value==null){
+    				value = "";
+    			}
+    			try {
+    				if(isDefaultField(fieldName)){
+    					setValueToField(fieldName, cbo, value);
+    				}
+    				cbo.setAttributeValue(attrName.toLowerCase(), value);
+    			} catch (VCIError e) {
+    				throw WebUtil.getVciBaseException(e);
+    			}
+    		}
+    	}
+    }
+
+	/**
+	 * 鏄惁榛樿鐨勫睘鎬�
+	 * @param fieldNames 灞炴�х殑鍚嶅瓧
+	 * @return true涓洪粯璁�
+	 */
+	public static boolean isDefaultField(String fieldNames){
+		if(VciQueryWrapperForDO.BASIC_FIELD_MAP.containsKey(fieldNames) || VciQueryWrapperForDO.LIFECYCLE_MANAGE_FIELD_MAP.containsKey(fieldNames)
+		|| VciQueryWrapperForDO.REVISION_MANAGE_FIELD_MAP.containsKey(fieldNames) ) {
+    		return true;
+    	}
+    	return false;
+    }
+
+	/**
+	 * 鏄惁榛樿鐨勫睘鎬�
+	 * @param fieldNames 灞炴�х殑鍚嶅瓧
+	 * @return true涓洪粯璁�
+	 */
+    public static boolean isDefaultLinkField(String fieldNames){
+		if(VciQueryWrapperForDO.LINK_TYPE_FIELD_MAP.containsKey(fieldNames) ) {
+			return true;
+		}
+    	return false;
+    }
+
+	/**
+	 * 鏄惁涓烘櫘閫氱殑灞炴��
+	 * @param attrName 灞炴�х殑鍚嶅瓧
+	 * @return true
+	 */
+	public static boolean isNormalAttr(String attrName){
+    	attrName = attrName.toLowerCase();
+    	if(attrName.indexOf(".")<0 && attrName.indexOf("_")<0 && !attrName.equalsIgnoreCase("lcstatustext")){
+    		return true;
+    	}else{
+    		return false;
+    	}
+    }
+
+
+    /**
+     * 灏唚hereSql閲岀殑鍐呭杞寲鍒版煡璇ap閲�
+     * @param whereSql sql杞崲涓簃ap
+     * @return map
+     */
+	public static Map<String,String>  whereSql2Map(
+			String whereSql) {
+		Map<String,String> map = new HashMap<String, String>();
+		if(isNotNull(whereSql)){
+			String[] selects = whereSql.split("and");
+			if(selects!=null&&selects.length>0){
+				for(String s : selects){
+					s = s.trim();
+					map.put(s.substring(0,s.indexOf(" ")).trim(), s.substring(s.indexOf(" ") +1).trim());
+				}
+			}
+		}
+		return map;
+	}
+
+	/**
+	 * 杞崲寮傚父
+	 * @param e 寮傚父瀵硅薄
+	 * @return base寮傚父瀵硅薄
+	 */
+	public static VciBaseException getVciBaseException(VCIError e){
+//		return new VciBaseException(e.error_code, e.error_message);
+		return null;
+	}
+
+	/**
+	 * 杞崲寮傚父
+	 * @param e 寮傚父瀵硅薄
+	 * @return base寮傚父瀵硅薄
+	 */
+	public static VciBaseException getVciBaseException(VCIException e){
+		String[] errorMsgs = new String[0];
+		if(e != null && e.getException_objArray() !=null ){
+			errorMsgs = new String[e.getException_objArray().length];
+			for(int i = 0 ; i < errorMsgs.length ; i ++){
+				errorMsgs[i] = e.getException_objArray()[i].toString();
+			}
+		}
+		return new VciBaseException(e == null ?"com.vci.web.base.unknowerror":e.getException_code(), errorMsgs);
+	}
+
+	/**
+	 * 鏈満鐨刬p
+	 */
+	private static String localIp = null;
+
+	/**
+	 * 鑾峰彇鏈満鍦板潃锛屼笉鏄鎴风鐢佃剳鐨刬p,鏄綋鍓嶆湇鍔℃墍鍦ㄧ殑ip
+	 * @return
+	 */
+	public static String getLocalIp(){
+		if(localIp == null){
+			try {
+				InetAddress inetAddress = getLocalHostLANAddress();
+				if (inetAddress == null) {
+					localIp = "127.0.0.1";
+				} else {
+					localIp = inetAddress.getHostAddress();
+				}
+			}catch (Exception e){
+				localIp = "127.0.0.1";
+			}
+		}
+		return localIp;
+	}
+
+	/**
+	 * 浠庣綉缁滄帴鍙d笂鑾峰彇ip鍦板潃
+	 * @return ip鍦板潃
+	 */
+	private static InetAddress getLocalHostLANAddress(){
+		try {
+			InetAddress candidateAddress = null;
+			// 閬嶅巻鎵�鏈夌殑缃戠粶鎺ュ彛
+			for (Enumeration ifaces = NetworkInterface.getNetworkInterfaces(); ifaces.hasMoreElements(); ) {
+				NetworkInterface iface = (NetworkInterface) ifaces.nextElement();
+				// 鍦ㄦ墍鏈夌殑鎺ュ彛涓嬪啀閬嶅巻IP
+				for (Enumeration inetAddrs = iface.getInetAddresses(); inetAddrs.hasMoreElements(); ) {
+					InetAddress inetAddr = (InetAddress) inetAddrs.nextElement();
+					if (!inetAddr.isLoopbackAddress()) {// 鎺掗櫎loopback绫诲瀷鍦板潃
+						if (inetAddr.isSiteLocalAddress()) {
+							// 濡傛灉鏄痵ite-local鍦板潃锛屽氨鏄畠浜�
+							return inetAddr;
+						} else if (candidateAddress == null) {
+							// site-local绫诲瀷鐨勫湴鍧�鏈鍙戠幇锛屽厛璁板綍鍊欓�夊湴鍧�
+							candidateAddress = inetAddr;
+						}
+					}
+				}
+			}
+			if (candidateAddress != null) {
+				return candidateAddress;
+			}
+			// 濡傛灉娌℃湁鍙戠幇 non-loopback鍦板潃.鍙兘鐢ㄦ渶娆¢�夌殑鏂规
+			InetAddress jdkSuppliedAddress = InetAddress.getLocalHost();
+			return jdkSuppliedAddress;
+		} catch (Exception e) {
+			if(logger.isErrorEnabled()){
+				logger.error("鑾峰彇鏈満ip",e);
+			}
+		}
+		return null;
+	}
+
+	/**
+     * oracle in 鏌ヨ涓嶈兘瓒呰繃1000锛岃浆鎹竴涓嬮泦鍚�
+     * 鐢变簬SQL璇彞1000涓彲鑳藉緢闀匡紝瓒呰繃oracle10g锛屾墍浠ョ壓鐗叉�ц兘鍒嗛厤涓�500涓暟缁�
+     * @param list 闇�瑕佽浆鎹㈢殑鍒楄〃鍐呭
+     * @return 鍒嗙粍鍚庣殑list
+     */
+    public static <T> Collection<Collection<T>> switchCollectionForOracleIn(Collection<T> list) {
+       return switchCollectionForOracleIn(list,500);
+    }
+
+    /**
+     * 杞崲闆嗗悎鐨勫ぇ灏忥紝杩欎釜鐢ㄥ湪feign璋冪敤鐨勬椂鍊欙紝涓嶈鍦╯ql鏌ヨ鐨勬椂鍊欎娇鐢�
+     * @param collection 闇�瑕佽浆鎹㈢殑鍒楄〃鍐呭
+     * @param preSize 姣忎釜鍒嗙粍鐨勫ぇ灏�
+     * @return 鍒嗙粍鍚庣殑list
+     */
+    public static <T> Collection<Collection<T>> switchCollectionForOracleIn(Collection<T> collection,int preSize) {
+        Collection<Collection<T>> listHasList = new ArrayList<Collection<T>>();
+        if(collection == null){
+            return listHasList;
+        }
+        List<T> newList = new ArrayList<T>();
+        for(Object obj : collection){
+            //涓轰簡璁﹍ist杩樺彲浠ユ坊鍔犲唴瀹癸紝鍥犱负浣跨敤sublist鍚庯紝list涓嶈兘鍐岮dd浜�
+            newList.add((T)obj);
+        }
+        int muti = 1;
+        if(newList.size() >preSize){
+            int balance = newList.size()%preSize;
+            muti = (newList.size() - balance)/preSize + (balance == 0?0:1);
+        }
+        for(int i = 0 ; i < muti; i ++){
+            int start = i*preSize;
+            int end = start + preSize;
+            if(i == muti-1 || end >newList.size() ){
+                end = newList.size();
+            }
+            List subList = newList.subList(start,end);
+            listHasList.add(subList);
+        }
+        return listHasList;
+    }
+
+	/**
+	 * 鏋勫缓涓婚敭鐨勬煡璇㈡潯浠�
+	 * @param oid 涓婚敭
+	 * @return 鏌ヨ鏉′欢
+	 */
+	public static Map<String,String> getOidQuery(String oid) {
+    	Map<String,String> conditionMap = new HashMap<>();
+		if(oid.contains(",")){
+			conditionMap.put("oid",QueryOptionConstant.IN + "(" + VciBaseUtil.toInSql(VciBaseUtil.str2List(oid).toArray(new String[0])) + ")");
+		}else {
+			conditionMap.put("oid", oid.trim());
+		}
+    	return conditionMap;
+	}
+
+	/**
+	 * 灏嗘暟鎹璞¤浆鎹负鏍戝舰
+	 * @param doList 鏁版嵁瀵硅薄
+	 * @param wrapperOptions 灏佽鐨勪俊鎭�
+	 * @return 鏍戝垪琛�
+	 */
+	public static <T,R> List<Tree> cboList2Trees(List<? extends ClientBusinessObject> doList, TreeWrapperOptions wrapperOptions, Function<T,R> f){
+		if(CollectionUtils.isEmpty(doList)){
+			return new ArrayList<>();
+		}
+		List<Tree> allTree = new ArrayList<Tree>();
+		List<Tree> children = new ArrayList<Tree>();
+		for (int i = 0 ; i < doList.size();i++) {
+			ClientBusinessObject cbo =  doList.get(i);
+			Tree tree =new Tree();
+			List<String> oidFieldNames = VciBaseUtil.str2List(wrapperOptions.getOidFieldName());
+			List<String> oidValues = new LinkedList<>();
+			oidFieldNames.stream().forEach( s->{
+				oidValues.add(cbo.getAttributeValue(s));
+			});
+			tree.setOid(oidValues.stream().collect(Collectors.joining(wrapperOptions.getOidValueSep())));
+			if(f !=null){
+				tree.setText((String)f.apply((T) cbo));
+			}else{
+				List<String> textFieldNames = VciBaseUtil.str2List(wrapperOptions.getTextFieldName());
+				List<String> textValues = new LinkedList<>();
+				textFieldNames.stream().forEach( s->{
+					textValues.add(cbo.getAttributeValue(s));
+				});
+				tree.setText(textValues.stream().collect(Collectors.joining(wrapperOptions.getTextValueSep())));
+			}
+			if(StringUtils.isNotBlank(wrapperOptions.getParentFieldName())){
+				tree.setParentId(cbo.getAttributeValue(wrapperOptions.getParentFieldName()));
+			}
+			if(wrapperOptions.isAllAttributes()) {
+				try {
+					Map<String,String> map = new HashMap<>();
+					copyValueToMapFromCbos(cbo,map);
+					tree.setAttributes(map);
+				} catch (Exception e) {
+					//杩欓噷涓嶅仛澶勭悊
+					if (logger.isErrorEnabled()) {
+						logger.error("鎶婂璞¤浆鎹负map鏃跺嚭鐜颁簡閿欒锛屼絾鏄笉褰卞搷鏍戠殑灞曠ず锛屽涓氬姟鍙兘鏈夊奖鍝�");
+					}
+				}
+			}
+			if(wrapperOptions.isMultipleSelect() || wrapperOptions.isShowCheckBox()){
+				tree.setShowCheckbox(true);
+			}
+			if(wrapperOptions.getParentOid() == null){
+				wrapperOptions.setParentOid("");
+			}
+			tree.setIndex(String.valueOf(i));
+			if(StringUtils.isBlank(tree.getParentId())
+					|| (StringUtils.isNotBlank(wrapperOptions.getParentOid()) && wrapperOptions.getParentOid().equalsIgnoreCase(tree.getParentId()))){
+				allTree.add(tree);
+			}else {
+				children.add(tree);
+			}
+		}
+
+		if(allTree.size()<=0){
+			//璇存槑鍏ㄦ槸瀛愶紝鎴戜滑闇�瑕佷粠瀛愰噷鑾峰彇
+			if(!CollectionUtils.isEmpty(children)){
+				Map<String, String> oidParentMap = children.stream().collect(Collectors.toMap(s -> s.getOid(), t -> t.getParentId() == null?"":t.getParentId(), (o1, o2) -> o1));
+				List<String> rootOids = oidParentMap.entrySet().stream().filter(s -> !oidParentMap.containsKey(s.getValue())).map(s -> s.getKey()).collect(Collectors.toList());
+				List<Tree> newChildren = new ArrayList<>();
+				allTree = children.stream().filter(s->rootOids.contains(s.getOid())).collect(Collectors.toList());
+				newChildren = children.stream().filter(s->!rootOids.contains(s.getOid())).collect(Collectors.toList());
+				children = newChildren;
+			}
+		}
+		new Tree().findChild(allTree,children);
+		return allTree;
+	}
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/xmlmodel/UIComponentDefineXO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/xmlmodel/UIComponentDefineXO.java
new file mode 100644
index 0000000..39f84f6
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/xmlmodel/UIComponentDefineXO.java
@@ -0,0 +1,431 @@
+package com.vci.web.xmlmodel;
+
+import com.thoughtworks.xstream.annotations.XStreamAlias;
+
+/**
+ * 骞冲彴鐨勭粍浠跺畾涔夌殑xml瀵硅薄
+ * @author weidy
+ * @date 2021/2/23
+ */
+@XStreamAlias("plDefination")
+public class UIComponentDefineXO implements java.io.Serializable{
+
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = 7581466665781799314L;
+    /**
+     * 缁勪欢绫诲瀷,1:瀵艰埅鏍�; 2:涓诲唴瀹瑰尯; 3:椤电鍖�
+     */
+    private String type;
+
+    /**
+     * 鏄剧ず灞炴��
+     */
+    private String showAbs;
+
+    /**
+     * 鍒嗛殧绗�
+     */
+    private String separator;
+
+    /**
+     * 鏄剧ずlink灞炴��
+     */
+    private String showLinkAbs;
+
+    /**
+     * 鎼滅储鐩爣
+     */
+    private String searchTarger;
+
+    /**
+     * 妯℃澘绫诲瀷
+     */
+    private String templateType;
+
+    /**
+     * 鏄剧ず绫诲瀷
+     */
+    private String showType;
+
+    /**
+     * 妯℃澘ID
+     */
+    private String templateId;
+
+    /**
+     * 閫夋嫨鏂瑰悜
+     */
+    private String orientation;
+
+    /**
+     * 鏈夋晥鎬�
+     */
+    private String validity;
+
+    /**
+     * 鎺掑簭瀛楁
+     */
+    private String orderField;
+
+    /**
+     * 鎺掑簭鏂瑰悜
+     */
+    private String orderMode;
+
+    /**
+     * 杩斿洖鏁版嵁鏉$洰
+     */
+    private String returnRows;
+
+    /**
+     * 鎺у埗璺緞
+     */
+    private String controlPath;
+
+    /**
+     * 灞曞紑褰㈠紡
+     */
+    private String expandMode;
+
+    /**
+     * 閾炬帴绫诲瀷
+     */
+    private String linkType;
+
+    /**
+     * 鏄惁鏄剧ず鍥炬爣
+     */
+    private String isShowImage;
+
+    /**
+     * 鏍戝睍绀哄垪
+     */
+    private String expandCols;
+
+    /**
+     * 鏄剧ず鍐呭
+     */
+    private String showContent;
+
+    /**
+     * 绫诲瀷
+     */
+    private String showContentType;
+
+    /**
+     * 鍏崇郴
+     */
+    private String showContentRelation;
+
+    /**
+     * 鏄剧ず鍐呭鐨勮〃鏍�
+     */
+    private String showContentTable;
+
+    /**
+     * 瀵艰埅鏍戠被鍨� 1浠h〃folder 2浠h〃瑙掕壊 3浠h〃涓嶆樉绀�
+     */
+    private String navigatorType;
+
+    /**
+     * 浜嬩欢key
+     */
+    private String eventKey;
+
+    /**
+     * 浜嬩欢鑷畾涔夌被鍏ㄨ矾寰�
+     */
+    private String eventValue;
+
+    /**
+     * 鏍硅妭鐐规樉绀哄唴瀹�
+     */
+    private String rootContent;
+
+    /**
+     * <p>UI瑙f瀽鍣紝鐢ㄥ垎鍙�;鍒嗛殧鍚勭粍鍊硷紝鍗�:java_cs銆乯ava_bs銆乶et_cs銆乶et_bs銆乵obile_cs銆乵obile_bs</p>
+     * <p>鍊兼牸寮忕ず渚嬶細java_cs:xxx;java_bs:xxx;net_cs:xxx;net_bs:xxx;mobile_cs:xx;mobile_bs:xxx; </p>
+     */
+    private String UIParser;
+
+    /**
+     * <p>鎵╁睍灞炴�э紝鐢ㄥ垎鍙�;鍒嗛殧鍚勭粍鍊硷紝姣忕粍鐢ㄥ啋鍙�:鍒嗛殧鎵╁睍灞炴�у悕绉颁笌鎵╁睍灞炴�у�硷紝鍙互瀹氫箟浠绘剰缁�</p>
+     * <p>鍊兼牸寮忕ず渚嬶細ext1:xx;ext2;ext3:xx;ext4:xxx;extn:xxx;</p>
+     */
+    @XStreamAlias("ExtAttr")
+    private String extAttr;
+
+    /**
+     * 缁勪欢涓婅缃殑鏌ヨ妯℃澘鍚嶇О
+     */
+    private String queryTemplateName;
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getShowAbs() {
+        return showAbs;
+    }
+
+    public void setShowAbs(String showAbs) {
+        this.showAbs = showAbs;
+    }
+
+    public String getSeparator() {
+        return separator;
+    }
+
+    public void setSeparator(String separator) {
+        this.separator = separator;
+    }
+
+    public String getShowLinkAbs() {
+        return showLinkAbs;
+    }
+
+    public void setShowLinkAbs(String showLinkAbs) {
+        this.showLinkAbs = showLinkAbs;
+    }
+
+    public String getSearchTarger() {
+        return searchTarger;
+    }
+
+    public void setSearchTarger(String searchTarger) {
+        this.searchTarger = searchTarger;
+    }
+
+    public String getTemplateType() {
+        return templateType;
+    }
+
+    public void setTemplateType(String templateType) {
+        this.templateType = templateType;
+    }
+
+    public String getShowType() {
+        return showType;
+    }
+
+    public void setShowType(String showType) {
+        this.showType = showType;
+    }
+
+    public String getTemplateId() {
+        return templateId;
+    }
+
+    public void setTemplateId(String templateId) {
+        this.templateId = templateId;
+    }
+
+    public String getOrientation() {
+        return orientation;
+    }
+
+    public void setOrientation(String orientation) {
+        this.orientation = orientation;
+    }
+
+    public String getValidity() {
+        return validity;
+    }
+
+    public void setValidity(String validity) {
+        this.validity = validity;
+    }
+
+    public String getOrderField() {
+        return orderField;
+    }
+
+    public void setOrderField(String orderField) {
+        this.orderField = orderField;
+    }
+
+    public String getOrderMode() {
+        return orderMode;
+    }
+
+    public void setOrderMode(String orderMode) {
+        this.orderMode = orderMode;
+    }
+
+    public String getReturnRows() {
+        return returnRows;
+    }
+
+    public void setReturnRows(String returnRows) {
+        this.returnRows = returnRows;
+    }
+
+    public String getControlPath() {
+        return controlPath;
+    }
+
+    public void setControlPath(String controlPath) {
+        this.controlPath = controlPath;
+    }
+
+    public String getExpandMode() {
+        return expandMode;
+    }
+
+    public void setExpandMode(String expandMode) {
+        this.expandMode = expandMode;
+    }
+
+    public String getLinkType() {
+        return linkType;
+    }
+
+    public void setLinkType(String linkType) {
+        this.linkType = linkType;
+    }
+
+    public String getIsShowImage() {
+        return isShowImage;
+    }
+
+    public void setIsShowImage(String isShowImage) {
+        this.isShowImage = isShowImage;
+    }
+
+    public String getExpandCols() {
+        return expandCols;
+    }
+
+    public void setExpandCols(String expandCols) {
+        this.expandCols = expandCols;
+    }
+
+    public String getShowContent() {
+        return showContent;
+    }
+
+    public void setShowContent(String showContent) {
+        this.showContent = showContent;
+    }
+
+    public String getShowContentType() {
+        return showContentType;
+    }
+
+    public void setShowContentType(String showContentType) {
+        this.showContentType = showContentType;
+    }
+
+    public String getShowContentRelation() {
+        return showContentRelation;
+    }
+
+    public void setShowContentRelation(String showContentRelation) {
+        this.showContentRelation = showContentRelation;
+    }
+
+    public String getShowContentTable() {
+        return showContentTable;
+    }
+
+    public void setShowContentTable(String showContentTable) {
+        this.showContentTable = showContentTable;
+    }
+
+    public String getNavigatorType() {
+        return navigatorType;
+    }
+
+    public void setNavigatorType(String navigatorType) {
+        this.navigatorType = navigatorType;
+    }
+
+    public String getEventKey() {
+        return eventKey;
+    }
+
+    public void setEventKey(String eventKey) {
+        this.eventKey = eventKey;
+    }
+
+    public String getEventValue() {
+        return eventValue;
+    }
+
+    public void setEventValue(String eventValue) {
+        this.eventValue = eventValue;
+    }
+
+    public String getRootContent() {
+        return rootContent;
+    }
+
+    public void setRootContent(String rootContent) {
+        this.rootContent = rootContent;
+    }
+
+    public String getUIParser() {
+        return UIParser;
+    }
+
+    public void setUIParser(String UIParser) {
+        this.UIParser = UIParser;
+    }
+
+    public String getExtAttr() {
+        return extAttr;
+    }
+
+    public void setExtAttr(String extAttr) {
+        this.extAttr = extAttr;
+    }
+
+    public String getQueryTemplateName() {
+        return queryTemplateName;
+    }
+
+    public void setQueryTemplateName(String queryTemplateName) {
+        this.queryTemplateName = queryTemplateName;
+    }
+
+    @Override
+    public String toString() {
+        return "UIComponentDefineXO{" +
+                "type='" + type + '\'' +
+                ", showAbs='" + showAbs + '\'' +
+                ", separator='" + separator + '\'' +
+                ", showLinkAbs='" + showLinkAbs + '\'' +
+                ", searchTarger='" + searchTarger + '\'' +
+                ", templateType='" + templateType + '\'' +
+                ", showType='" + showType + '\'' +
+                ", templateId='" + templateId + '\'' +
+                ", orientation='" + orientation + '\'' +
+                ", validity='" + validity + '\'' +
+                ", orderField='" + orderField + '\'' +
+                ", orderMode='" + orderMode + '\'' +
+                ", returnRows='" + returnRows + '\'' +
+                ", controlPath='" + controlPath + '\'' +
+                ", expandMode='" + expandMode + '\'' +
+                ", linkType='" + linkType + '\'' +
+                ", isShowImage='" + isShowImage + '\'' +
+                ", expandCols='" + expandCols + '\'' +
+                ", showContent='" + showContent + '\'' +
+                ", showContentType='" + showContentType + '\'' +
+                ", showContentRelation='" + showContentRelation + '\'' +
+                ", showContentTable='" + showContentTable + '\'' +
+                ", navigatorType='" + navigatorType + '\'' +
+                ", eventKey='" + eventKey + '\'' +
+                ", eventValue='" + eventValue + '\'' +
+                ", rootContent='" + rootContent + '\'' +
+                ", UIParser='" + UIParser + '\'' +
+                ", extAttr='" + extAttr + '\'' +
+                ", queryTemplateName='" + queryTemplateName + '\'' +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/xmlmodel/UIComponentDetailXO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/xmlmodel/UIComponentDetailXO.java
new file mode 100644
index 0000000..14245b5
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/xmlmodel/UIComponentDetailXO.java
@@ -0,0 +1,71 @@
+package com.vci.web.xmlmodel;
+
+import com.thoughtworks.xstream.annotations.XStreamAlias;
+import com.thoughtworks.xstream.annotations.XStreamImplicit;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 缁勪欢鐨勮缁嗛厤缃俊鎭�
+ * @author weidy
+ * @date 2021/2/24
+ */
+@XStreamAlias("JD_DATASET")
+public class UIComponentDetailXO implements java.io.Serializable{
+
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = 755576513136805971L;
+    /**
+     * 鏄剧ず鐨勫垪鏁�
+     */
+    @XStreamAlias("JD_SHOWCOLS")
+    private String showColsCount;
+
+    /**
+     * 鏌ヨ妯℃澘
+     */
+    @XStreamAlias("JD_FORMQTNAME")
+    private String formQueryTemplateName;
+
+    /**
+     * 鍖呭惈鐨勬槑缁�
+     */
+    @XStreamImplicit
+    private List<UIComponentItemXO> items = new ArrayList();
+
+    public String getShowColsCount() {
+        return showColsCount;
+    }
+
+    public void setShowColsCount(String showColsCount) {
+        this.showColsCount = showColsCount;
+    }
+
+    public String getFormQueryTemplateName() {
+        return formQueryTemplateName;
+    }
+
+    public void setFormQueryTemplateName(String formQueryTemplateName) {
+        this.formQueryTemplateName = formQueryTemplateName;
+    }
+
+    public List<UIComponentItemXO> getItems() {
+        return items;
+    }
+
+    public void setItems(List<UIComponentItemXO> items) {
+        this.items = items;
+    }
+
+    @Override
+    public String toString() {
+        return "UIComponentDetailXO{" +
+                "showColsCount='" + showColsCount + '\'' +
+                ", formQueryTemplateName='" + formQueryTemplateName + '\'' +
+                ", items=" + items +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/xmlmodel/UIComponentItemXO.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/xmlmodel/UIComponentItemXO.java
new file mode 100644
index 0000000..2e2d14f
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/xmlmodel/UIComponentItemXO.java
@@ -0,0 +1,806 @@
+package com.vci.web.xmlmodel;
+
+import com.thoughtworks.xstream.annotations.XStreamAlias;
+
+/**
+ * 缁勪欢鐨勬槑缁�
+ * @author weidy
+ * @date 2021/2/24
+ */
+@XStreamAlias("JD_ITEM")
+public class UIComponentItemXO implements java.io.Serializable{
+
+    /**
+     * 搴忓垪鍖�
+     */
+    private static final long serialVersionUID = 3248490909313342563L;
+    /**
+     * 瀛楁
+     */
+    @XStreamAlias("JD_field")
+    private String field;
+
+    //杩欎簺鏄垪琛ㄧ殑灞炴��
+
+    /**
+     * 鎴栨煡璇�
+     */
+    @XStreamAlias("JD_or")
+    private String or;
+
+    /**
+     * 绛夋煡璇�
+     */
+    @XStreamAlias("JD_eq")
+    private String eq;
+
+    /**
+     * 鍘婚櫎绌烘牸
+     */
+    @XStreamAlias("JD_trim")
+    private String trim;
+
+    /**
+     * 鍙屽嚮
+     */
+    @XStreamAlias("JD_dbl")
+    private String dbClick;
+
+    /**
+     * 瀛楃涓叉埅鍙�
+     */
+    @XStreamAlias("JD_cut")
+    private String stringCut;
+
+    /**
+     * 缁戝畾鐨勮〃鍗曠殑涓婚敭
+     */
+    @XStreamAlias("JD_inObj")
+    private String bindFormOid;
+
+    /**
+     * where鏌ヨ鐨剆ql璇彞
+     */
+    @XStreamAlias("JD_addFilter")
+    private String whereSql;
+
+    /**
+     * 鍒楀
+     */
+    @XStreamAlias("JD_filterColWidth")
+    private String fieldWidths;
+
+    /**
+     * 椤甸潰澶у皬
+     */
+    @XStreamAlias("JD_pageSize")
+    private String pageSize;
+
+    /**
+     * 鏌ヨsql
+     */
+    @XStreamAlias("JD_QuerySql")
+    private String querySql;
+
+    /**
+     * 鍥剧墖鐨勫楂樺害,鏍煎紡鏄� 瀹藉害,楂樺害
+     */
+    @XStreamAlias("JD_imgWH")
+    private String imageWidthHeight;
+
+    /**
+     * 鍒楄〃鏄剧ず鐨勫垪
+     */
+    @XStreamAlias("JD_outFields")
+    private String displayFields;
+
+    /**
+     * 鏌ヨ鐨勫垪
+     */
+    @XStreamAlias("JD_keyFields")
+    private String queryFields;
+
+    /**
+     * 鎵归噺鎿嶄綔
+     */
+    @XStreamAlias("JD_bat")
+    private String batch;
+
+    /**
+     * 瓒呴摼鎺�
+     */
+    @XStreamAlias("JD_hrefFields")
+    private String hrefField;
+
+    /**
+     * 瓒呴摼鎺ョ殑閰嶇疆
+     */
+    @XStreamAlias("JD_hrefConf")
+    private String hrefConf;
+
+    /**
+     * 鑷畾涔夌被璺緞
+     */
+    @XStreamAlias("JD_customClass")
+    private String customClass;
+
+    /**
+     * 鎺у埗鍒�
+     */
+    @XStreamAlias("JD_ctrlDisplyCol")
+    private String controlDisplayField;
+
+    /**
+     * 绗﹀悎鏉′欢鐨勬墠鍙互鏄剧ず锛岀洰鍓嶅彧鏀寔鍊肩被鍨嬶紝閫氳繃鑻辨枃閫楀彿(,)鍒嗛殧
+     */
+    @XStreamAlias("JD_ctrlDisplyCondition")
+    private String controlDisplayCondition;
+
+    /**
+     * 鏄惁鏄剧ず鏌ヨ鍖哄煙
+     */
+    @XStreamAlias("JD_isNavigatorExpand")
+    private String displayQueryArea;
+
+    /**
+     * 鏄剧ず鏂囦欢澶�
+     */
+    @XStreamAlias("JD_isShowFolder")
+    private String displayFolder;
+
+    /**
+     * 琛ㄦ牸涓瓨鍌╢older鐨勫垪锛岄粯璁ゅ垪affiliatedfolder
+     */
+    @XStreamAlias("JD_folderColName")
+    private String folderFieldName;
+
+    /**
+     * 鐖舵枃浠跺す鍚嶇О
+     */
+    @XStreamAlias("JD_parentFolderName")
+    private String parentFolderName;
+
+    //杩欎簺鏄〃鍗曠殑灞炴��
+
+    /**
+     * 浜岀骇鍙傜収
+     */
+    @XStreamAlias("JD_txf")
+    private String secondRefer;
+
+    /**
+     * 涓�绾у弬鐓�
+     */
+    @XStreamAlias("JD_listTable")
+    private String refer;
+
+    /**
+     * 鏄剧ず鍚嶇О
+     */
+    @XStreamAlias("JD_name")
+    private String name;
+
+    /**
+     * 鏄剧ず绫诲瀷
+     */
+    @XStreamAlias("JD_type")
+    private String displayType;
+
+    /**
+     * 榛樿鐨勫��
+     */
+    @XStreamAlias("JD_value")
+    private String defaultValue;
+
+    /**
+     * 鏄惁闅愯棌锛�1鏄剧ず锛�0锛屼笉鏄剧ず锛�
+     */
+    @XStreamAlias("JD_cols")
+    private String hidden;
+
+    /**
+     * 琛屾樉绀虹被鍨嬶紝
+     */
+    @XStreamAlias("JD_rows")
+    private String rowDisplay;
+
+    /**
+     * 鏄剧ず鐨勬牱寮�
+     */
+    @XStreamAlias("JD_style")
+    private String extendAttr;
+
+    /**
+     * 鑴氭湰楠岃瘉
+     */
+    @XStreamAlias("JD_script")
+    private String scriptValid;
+
+    /**
+     * 鎻愮ず鏂囧瓧
+     */
+    @XStreamAlias("JD_tips")
+    private String tips;
+
+    /**
+     * 涓嬫媺鑿滃崟鐨勯�夐」
+     */
+    @XStreamAlias("JD_valuelist")
+    private String comboxItems;
+
+    /**
+     * 涓嬫媺鑿滃崟鐨刱ey
+     */
+    @XStreamAlias("JD_listTxt")
+    private String comboxKey;
+
+    /**
+     * 涓嬫媺鑿滃崟鐨勫悕绉�
+     */
+    @XStreamAlias("JD_listTxt")
+    private String comboxText;
+
+    /**
+     * 鍙傜収鐨勫瓧娈�
+     */
+    @XStreamAlias("JD_listVal")
+    private String referFieldName;
+
+    /**
+     * 鏄剧ず琛ㄨ揪寮�
+     */
+    @XStreamAlias("JD_showExpression")
+    private String displayExpression;
+
+    /**
+     * 鏃堕棿鏍煎紡
+     */
+    @XStreamAlias("JD_dateFormat")
+    private String dateFormat;
+
+    /**
+     * 鍙閫夋嫨鏉′欢
+     */
+    @XStreamAlias("JD_editCondition")
+    private String editCondition;
+
+    /**
+     * 灞炴�х殑鏉冮檺鎺у埗
+     */
+    @XStreamAlias("JD_right")
+    private String fieldRight;
+
+    /**
+     * 鏄惁鍙紪杈戯紝(0:涓嶅彲缂栫級; 1:鍙紪缂�)--鍙
+     */
+    @XStreamAlias("JD_isEditable")
+    private String editable;
+
+    /**
+     * 鍒楀彲浠ョ紪杈戠殑琛ㄨ揪寮忥紝褰揓D_isEditable鍊间负1鏃舵湁鏁�
+     */
+    @XStreamAlias("JD_EditableProgram")
+    private String editableProgram;
+
+    /**
+     * 蹇呰緭
+     */
+    @XStreamAlias("JD_isRequired")
+    private String required;
+
+    /**
+     * 鏌ヨ妯℃澘鐨勫悕绉�
+     */
+    @XStreamAlias("JD_qtName")
+    private String queryTemplateName;
+
+    /**
+     * 楂樼骇鏌ヨ鐨勫垪
+     */
+    @XStreamAlias("JD_seniorQueryCols")
+    private String seniorQueryField;
+
+    /**
+     * 楂樼骇鏌ヨ鍚勫垪鍑虹幇娆℃暟,灏辨槸鏌ヨ鏉′欢涓�琛屾樉绀哄嚑鍒�
+     */
+    @XStreamAlias("JD_seniorQueryColsCounts")
+    private String seniorQueryFieldCounts;
+
+    /**
+     * http瀛樺偍
+     */
+    @XStreamAlias("JD_isHttpSave")
+    private String httpSave;
+
+    /**
+     * http鏂囦欢瀛樺偍璺緞
+     */
+    @XStreamAlias("JD_httpVolumnPath")
+    private String httpVolumnPath;
+
+    /**
+     * 瀛樺偍璺緞鐨勫瓧娈�
+     */
+    @XStreamAlias("JD_httpPathField")
+    private String httpPathField;
+
+    /**
+     * 鏌ヨ鍏宠仈鍒�
+     */
+    @XStreamAlias("JD_queryRefFields")
+    private String queryReferField;
+
+    public String getField() {
+        return field;
+    }
+
+    public void setField(String field) {
+        this.field = field;
+    }
+
+    public String getOr() {
+        return or;
+    }
+
+    public void setOr(String or) {
+        this.or = or;
+    }
+
+    public String getEq() {
+        return eq;
+    }
+
+    public void setEq(String eq) {
+        this.eq = eq;
+    }
+
+    public String getTrim() {
+        return trim;
+    }
+
+    public void setTrim(String trim) {
+        this.trim = trim;
+    }
+
+    public String getDbClick() {
+        return dbClick;
+    }
+
+    public void setDbClick(String dbClick) {
+        this.dbClick = dbClick;
+    }
+
+    public String getStringCut() {
+        return stringCut;
+    }
+
+    public void setStringCut(String stringCut) {
+        this.stringCut = stringCut;
+    }
+
+    public String getBindFormOid() {
+        return bindFormOid;
+    }
+
+    public void setBindFormOid(String bindFormOid) {
+        this.bindFormOid = bindFormOid;
+    }
+
+    public String getWhereSql() {
+        return whereSql;
+    }
+
+    public void setWhereSql(String whereSql) {
+        this.whereSql = whereSql;
+    }
+
+    public String getFieldWidths() {
+        return fieldWidths;
+    }
+
+    public void setFieldWidths(String fieldWidths) {
+        this.fieldWidths = fieldWidths;
+    }
+
+    public String getPageSize() {
+        return pageSize;
+    }
+
+    public void setPageSize(String pageSize) {
+        this.pageSize = pageSize;
+    }
+
+    public String getQuerySql() {
+        return querySql;
+    }
+
+    public void setQuerySql(String querySql) {
+        this.querySql = querySql;
+    }
+
+    public String getImageWidthHeight() {
+        return imageWidthHeight;
+    }
+
+    public void setImageWidthHeight(String imageWidthHeight) {
+        this.imageWidthHeight = imageWidthHeight;
+    }
+
+    public String getDisplayFields() {
+        return displayFields;
+    }
+
+    public void setDisplayFields(String displayFields) {
+        this.displayFields = displayFields;
+    }
+
+    public String getQueryFields() {
+        return queryFields;
+    }
+
+    public void setQueryFields(String queryFields) {
+        this.queryFields = queryFields;
+    }
+
+    public String getBatch() {
+        return batch;
+    }
+
+    public void setBatch(String batch) {
+        this.batch = batch;
+    }
+
+    public String getHrefField() {
+        return hrefField;
+    }
+
+    public void setHrefField(String hrefField) {
+        this.hrefField = hrefField;
+    }
+
+    public String getHrefConf() {
+        return hrefConf;
+    }
+
+    public void setHrefConf(String hrefConf) {
+        this.hrefConf = hrefConf;
+    }
+
+    public String getCustomClass() {
+        return customClass;
+    }
+
+    public void setCustomClass(String customClass) {
+        this.customClass = customClass;
+    }
+
+    public String getControlDisplayField() {
+        return controlDisplayField;
+    }
+
+    public void setControlDisplayField(String controlDisplayField) {
+        this.controlDisplayField = controlDisplayField;
+    }
+
+    public String getControlDisplayCondition() {
+        return controlDisplayCondition;
+    }
+
+    public void setControlDisplayCondition(String controlDisplayCondition) {
+        this.controlDisplayCondition = controlDisplayCondition;
+    }
+
+    public String getDisplayQueryArea() {
+        return displayQueryArea;
+    }
+
+    public void setDisplayQueryArea(String displayQueryArea) {
+        this.displayQueryArea = displayQueryArea;
+    }
+
+    public String getDisplayFolder() {
+        return displayFolder;
+    }
+
+    public void setDisplayFolder(String displayFolder) {
+        this.displayFolder = displayFolder;
+    }
+
+    public String getFolderFieldName() {
+        return folderFieldName;
+    }
+
+    public void setFolderFieldName(String folderFieldName) {
+        this.folderFieldName = folderFieldName;
+    }
+
+    public String getParentFolderName() {
+        return parentFolderName;
+    }
+
+    public void setParentFolderName(String parentFolderName) {
+        this.parentFolderName = parentFolderName;
+    }
+
+    public String getSecondRefer() {
+        return secondRefer;
+    }
+
+    public void setSecondRefer(String secondRefer) {
+        this.secondRefer = secondRefer;
+    }
+
+    public String getRefer() {
+        return refer;
+    }
+
+    public void setRefer(String refer) {
+        this.refer = refer;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDisplayType() {
+        return displayType;
+    }
+
+    public void setDisplayType(String displayType) {
+        this.displayType = displayType;
+    }
+
+    public String getDefaultValue() {
+        return defaultValue;
+    }
+
+    public void setDefaultValue(String defaultValue) {
+        this.defaultValue = defaultValue;
+    }
+
+    public String getHidden() {
+        return hidden;
+    }
+
+    public void setHidden(String hidden) {
+        this.hidden = hidden;
+    }
+
+    public String getRowDisplay() {
+        return rowDisplay;
+    }
+
+    public void setRowDisplay(String rowDisplay) {
+        this.rowDisplay = rowDisplay;
+    }
+
+    public String getExtendAttr() {
+        return extendAttr;
+    }
+
+    public void setExtendAttr(String extendAttr) {
+        this.extendAttr = extendAttr;
+    }
+
+    public String getScriptValid() {
+        return scriptValid;
+    }
+
+    public void setScriptValid(String scriptValid) {
+        this.scriptValid = scriptValid;
+    }
+
+    public String getTips() {
+        return tips;
+    }
+
+    public void setTips(String tips) {
+        this.tips = tips;
+    }
+
+    public String getComboxItems() {
+        return comboxItems;
+    }
+
+    public void setComboxItems(String comboxItems) {
+        this.comboxItems = comboxItems;
+    }
+
+    public String getComboxKey() {
+        return comboxKey;
+    }
+
+    public void setComboxKey(String comboxKey) {
+        this.comboxKey = comboxKey;
+    }
+
+    public String getComboxText() {
+        return comboxText;
+    }
+
+    public void setComboxText(String comboxText) {
+        this.comboxText = comboxText;
+    }
+
+    public String getReferFieldName() {
+        return referFieldName;
+    }
+
+    public void setReferFieldName(String referFieldName) {
+        this.referFieldName = referFieldName;
+    }
+
+    public String getDisplayExpression() {
+        return displayExpression;
+    }
+
+    public void setDisplayExpression(String displayExpression) {
+        this.displayExpression = displayExpression;
+    }
+
+    public String getDateFormat() {
+        return dateFormat;
+    }
+
+    public void setDateFormat(String dateFormat) {
+        this.dateFormat = dateFormat;
+    }
+
+    public String getEditCondition() {
+        return editCondition;
+    }
+
+    public void setEditCondition(String editCondition) {
+        this.editCondition = editCondition;
+    }
+
+    public String getFieldRight() {
+        return fieldRight;
+    }
+
+    public void setFieldRight(String fieldRight) {
+        this.fieldRight = fieldRight;
+    }
+
+    public String getEditable() {
+        return editable;
+    }
+
+    public void setEditable(String editable) {
+        this.editable = editable;
+    }
+
+    public String getEditableProgram() {
+        return editableProgram;
+    }
+
+    public void setEditableProgram(String editableProgram) {
+        this.editableProgram = editableProgram;
+    }
+
+    public String getRequired() {
+        return required;
+    }
+
+    public void setRequired(String required) {
+        this.required = required;
+    }
+
+    public String getQueryTemplateName() {
+        return queryTemplateName;
+    }
+
+    public void setQueryTemplateName(String queryTemplateName) {
+        this.queryTemplateName = queryTemplateName;
+    }
+
+    public String getSeniorQueryField() {
+        return seniorQueryField;
+    }
+
+    public void setSeniorQueryField(String seniorQueryField) {
+        this.seniorQueryField = seniorQueryField;
+    }
+
+    public String getSeniorQueryFieldCounts() {
+        return seniorQueryFieldCounts;
+    }
+
+    public void setSeniorQueryFieldCounts(String seniorQueryFieldCounts) {
+        this.seniorQueryFieldCounts = seniorQueryFieldCounts;
+    }
+
+    public String getHttpSave() {
+        return httpSave;
+    }
+
+    public void setHttpSave(String httpSave) {
+        this.httpSave = httpSave;
+    }
+
+    public String getHttpVolumnPath() {
+        return httpVolumnPath;
+    }
+
+    public void setHttpVolumnPath(String httpVolumnPath) {
+        this.httpVolumnPath = httpVolumnPath;
+    }
+
+    public String getHttpPathField() {
+        return httpPathField;
+    }
+
+    public void setHttpPathField(String httpPathField) {
+        this.httpPathField = httpPathField;
+    }
+
+    public String getQueryReferField() {
+        return queryReferField;
+    }
+
+    public void setQueryReferField(String queryReferField) {
+        this.queryReferField = queryReferField;
+    }
+
+    @Override
+    public String toString() {
+        return "UIComponentItemXO{" +
+                "field='" + field + '\'' +
+                ", or='" + or + '\'' +
+                ", eq='" + eq + '\'' +
+                ", trim='" + trim + '\'' +
+                ", dbClick='" + dbClick + '\'' +
+                ", stringCut='" + stringCut + '\'' +
+                ", bindFormOid='" + bindFormOid + '\'' +
+                ", whereSql='" + whereSql + '\'' +
+                ", fieldWidths='" + fieldWidths + '\'' +
+                ", pageSize='" + pageSize + '\'' +
+                ", querySql='" + querySql + '\'' +
+                ", imageWidthHeight='" + imageWidthHeight + '\'' +
+                ", displayFields='" + displayFields + '\'' +
+                ", queryFields='" + queryFields + '\'' +
+                ", batch='" + batch + '\'' +
+                ", hrefField='" + hrefField + '\'' +
+                ", hrefConf='" + hrefConf + '\'' +
+                ", customClass='" + customClass + '\'' +
+                ", controlDisplayField='" + controlDisplayField + '\'' +
+                ", controlDisplayCondition='" + controlDisplayCondition + '\'' +
+                ", displayQueryArea='" + displayQueryArea + '\'' +
+                ", displayFolder='" + displayFolder + '\'' +
+                ", folderFieldName='" + folderFieldName + '\'' +
+                ", parentFolderName='" + parentFolderName + '\'' +
+                ", secondRefer='" + secondRefer + '\'' +
+                ", refer='" + refer + '\'' +
+                ", name='" + name + '\'' +
+                ", displayType='" + displayType + '\'' +
+                ", defaultValue='" + defaultValue + '\'' +
+                ", hidden='" + hidden + '\'' +
+                ", rowDisplay='" + rowDisplay + '\'' +
+                ", extendAttr='" + extendAttr + '\'' +
+                ", scriptValid='" + scriptValid + '\'' +
+                ", tips='" + tips + '\'' +
+                ", comboxItems='" + comboxItems + '\'' +
+                ", comboxKey='" + comboxKey + '\'' +
+                ", comboxText='" + comboxText + '\'' +
+                ", referFieldName='" + referFieldName + '\'' +
+                ", displayExpression='" + displayExpression + '\'' +
+                ", dateFormat='" + dateFormat + '\'' +
+                ", editCondition='" + editCondition + '\'' +
+                ", fieldRight='" + fieldRight + '\'' +
+                ", editable='" + editable + '\'' +
+                ", editableProgram='" + editableProgram + '\'' +
+                ", required='" + required + '\'' +
+                ", queryTemplateName='" + queryTemplateName + '\'' +
+                ", seniorQueryField='" + seniorQueryField + '\'' +
+                ", seniorQueryFieldCounts='" + seniorQueryFieldCounts + '\'' +
+                ", httpSave='" + httpSave + '\'' +
+                ", httpVolumnPath='" + httpVolumnPath + '\'' +
+                ", httpPathField='" + httpPathField + '\'' +
+                ", queryReferField='" + queryReferField + '\'' +
+                '}';
+    }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/resources/DefaultAttribute.json b/Source/platformProject/vci-platform-web/src/main/resources/DefaultAttribute.json
new file mode 100644
index 0000000..be5ffaf
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/resources/DefaultAttribute.json
@@ -0,0 +1,34 @@
+[{"OID":"8c2377a9-2dea-4516-92e9-351d60c8c989", "ID":"createtime", "NAME":"鍒涘缓鏃堕棿", "DESCRIPTION":null, "ATTRIBUTEDATATYPE":"VTDateTime", "ATTRIBUTEDATATYPETEXT":"鏃ユ湡鏃堕棿", "NULLABLEFLAG":"false", "DEFAULTVALUE":null, "ENUMID":null, "ENUMNAME":null, "BTMTYPEID":null, "BTMTYPENAME":null, "ATTRLENGTH":0, "PRECISIONLENGTH":0, "SCALELENGTH":2, "RANGE":null, "BTMNAME":"attribute", "OWNER":"developer", "CREATOR":"developer", "CREATETIME":"2020-06-29 10:33:47", "LASTMODIFIER":"sysAdmin", "LASTMODIFYTIME":"2022-03-30 19:04:08", "TS":"2022-03-30 19:04:08"},
+  {"OID":"306f202e-86f1-40ab-b79d-cddf2db7b830", "ID":"lastmodifytime", "NAME":"鏈�鍚庝慨鏀规椂闂�", "DESCRIPTION":null, "ATTRIBUTEDATATYPE":"VTDateTime", "ATTRIBUTEDATATYPETEXT":"鏃ユ湡鏃堕棿", "NULLABLEFLAG":"true", "DEFAULTVALUE":null, "ENUMID":null, "ENUMNAME":null, "BTMTYPEID":null, "BTMTYPENAME":null, "ATTRLENGTH":0, "PRECISIONLENGTH":null, "SCALELENGTH":null, "RANGE":null, "BTMNAME":"attribute", "OWNER":"developer", "CREATOR":"developer", "CREATETIME":"2020-06-29 10:33:47", "LASTMODIFIER":"sysAdmin", "LASTMODIFYTIME":"2022-03-30 19:04:08", "TS":"2022-03-30 19:04:08"},
+  {"OID":"00037025-c07e-4794-9e00-fec3d2560603", "ID":"ts", "NAME":"鏃堕棿鎴�", "DESCRIPTION":null, "ATTRIBUTEDATATYPE":"VTDateTime", "ATTRIBUTEDATATYPETEXT":"鏃ユ湡鏃堕棿", "NULLABLEFLAG":"true", "DEFAULTVALUE":null, "ENUMID":null, "ENUMNAME":null, "BTMTYPEID":null, "BTMTYPENAME":null, "ATTRLENGTH":0, "PRECISIONLENGTH":null, "SCALELENGTH":null, "RANGE":null, "BTMNAME":"attribute", "OWNER":"developer", "CREATOR":"developer", "CREATETIME":"2020-06-29 10:33:47", "LASTMODIFIER":"sysAdmin", "LASTMODIFYTIME":"2022-03-30 19:04:08", "TS":"2022-03-30 19:04:08"},
+  {"OID":"90e70653-fada-44d6-8e8e-a2875f5fdef7", "ID":"islastr", "NAME":"鏈�鏂扮増鏈�", "DESCRIPTION":null, "ATTRIBUTEDATATYPE":"VTString", "ATTRIBUTEDATATYPETEXT":"瀛楃涓�", "NULLABLEFLAG":"true", "DEFAULTVALUE":null, "ENUMID":null, "ENUMNAME":null, "BTMTYPEID":null, "BTMTYPENAME":null, "ATTRLENGTH":1, "PRECISIONLENGTH":0, "SCALELENGTH":2, "RANGE":null, "BTMNAME":"attribute", "OWNER":"developer", "CREATOR":"developer", "CREATETIME":"2020-06-29 10:33:47", "LASTMODIFIER":"sysAdmin", "LASTMODIFYTIME":"2022-03-30 19:04:08", "TS":"2022-03-30 19:04:08"},
+  {"OID":"1741118b-f31b-4733-9942-9770c0d6eb14", "ID":"versionvalue", "NAME":"鐗堟", "DESCRIPTION":null, "ATTRIBUTEDATATYPE":"VTString", "ATTRIBUTEDATATYPETEXT":"瀛楃涓�", "NULLABLEFLAG":"true", "DEFAULTVALUE":null, "ENUMID":null, "ENUMNAME":null, "BTMTYPEID":null, "BTMTYPENAME":null, "ATTRLENGTH":50, "PRECISIONLENGTH":0, "SCALELENGTH":2, "RANGE":null, "BTMNAME":"attribute", "OWNER":"developer", "CREATOR":"developer", "CREATETIME":"2020-06-29 10:33:47", "LASTMODIFIER":"sysAdmin", "LASTMODIFYTIME":"2022-03-30 19:04:08", "TS":"2022-03-30 19:04:08"},
+  {"OID":"32a6a4f9-f826-47ad-b649-aa2aed0cb54a", "ID":"versionseq", "NAME":"鐗堟鎺掑簭鍙�", "DESCRIPTION":null, "ATTRIBUTEDATATYPE":"VTInteger", "ATTRIBUTEDATATYPETEXT":"鏁板瓧", "NULLABLEFLAG":"true", "DEFAULTVALUE":null, "ENUMID":null, "ENUMNAME":null, "BTMTYPEID":null, "BTMTYPENAME":null, "ATTRLENGTH":0, "PRECISIONLENGTH":null, "SCALELENGTH":null, "RANGE":null, "BTMNAME":"attribute", "OWNER":"developer", "CREATOR":"developer", "CREATETIME":"2020-06-29 10:33:47", "LASTMODIFIER":"sysAdmin", "LASTMODIFYTIME":"2022-03-30 19:04:08", "TS":"2022-03-30 19:04:08"},
+  {"OID":"49e7b640-aac9-451c-93ea-ff7c7d23773e", "ID":"checkinby", "NAME":"绛惧叆浜�", "DESCRIPTION":null, "ATTRIBUTEDATATYPE":"VTString", "ATTRIBUTEDATATYPETEXT":"瀛楃涓�", "NULLABLEFLAG":"true", "DEFAULTVALUE":null, "ENUMID":null, "ENUMNAME":null, "BTMTYPEID":null, "BTMTYPENAME":null, "ATTRLENGTH":50, "PRECISIONLENGTH":0, "SCALELENGTH":2, "RANGE":null, "BTMNAME":"attribute", "OWNER":"developer", "CREATOR":"developer", "CREATETIME":"2020-06-29 10:33:47", "LASTMODIFIER":"sysAdmin", "LASTMODIFYTIME":"2022-03-30 19:04:08", "TS":"2022-03-30 19:04:08"},
+  {"OID":"37b6f67f-8a0b-4a0c-85e8-c356984a376b", "ID":"revisionoid", "NAME":"鐗堟湰瀵硅薄涓婚敭", "DESCRIPTION":null, "ATTRIBUTEDATATYPE":"VTString", "ATTRIBUTEDATATYPETEXT":"瀛楃涓�", "NULLABLEFLAG":"true", "DEFAULTVALUE":null, "ENUMID":null, "ENUMNAME":null, "BTMTYPEID":null, "BTMTYPENAME":null, "ATTRLENGTH":50, "PRECISIONLENGTH":0, "SCALELENGTH":2, "RANGE":null, "BTMNAME":"attribute", "OWNER":"developer", "CREATOR":"developer", "CREATETIME":"2020-06-29 10:33:47", "LASTMODIFIER":"sysAdmin", "LASTMODIFYTIME":"2022-03-30 19:04:08", "TS":"2022-03-30 19:04:08"},
+  {"OID":"500f5d60-1da9-4187-b061-1e21d6174934", "ID":"name", "NAME":"鍚嶇О", "DESCRIPTION":null, "ATTRIBUTEDATATYPE":"VTString", "ATTRIBUTEDATATYPETEXT":"瀛楃涓�", "NULLABLEFLAG":"true", "DEFAULTVALUE":null, "ENUMID":null, "ENUMNAME":null, "BTMTYPEID":null, "BTMTYPENAME":null, "ATTRLENGTH":4000, "PRECISIONLENGTH":0, "SCALELENGTH":2, "RANGE":null, "BTMNAME":"attribute", "OWNER":"developer", "CREATOR":"developer", "CREATETIME":"2020-06-29 10:33:47", "LASTMODIFIER":"sysAdmin", "LASTMODIFYTIME":"2022-03-30 19:04:08", "TS":"2022-03-30 19:04:08"},
+  {"OID":"0dc3247c-d632-41f2-9e2f-2318200ca30e", "ID":"checkintime", "NAME":"绛惧叆鏃堕棿", "DESCRIPTION":null, "ATTRIBUTEDATATYPE":"VTDateTime", "ATTRIBUTEDATATYPETEXT":"鏃ユ湡鏃堕棿", "NULLABLEFLAG":"true", "DEFAULTVALUE":null, "ENUMID":null, "ENUMNAME":null, "BTMTYPEID":null, "BTMTYPENAME":null, "ATTRLENGTH":0, "PRECISIONLENGTH":null, "SCALELENGTH":null, "RANGE":null, "BTMNAME":"attribute", "OWNER":"developer", "CREATOR":"developer", "CREATETIME":"2020-06-29 10:33:47", "LASTMODIFIER":"sysAdmin", "LASTMODIFYTIME":"2022-03-30 19:04:08", "TS":"2022-03-30 19:04:08"},
+  {"OID":"46a6fdee-0cf3-4cb0-bcd3-3a6099155508", "ID":"lastmodifier", "NAME":"鏈�鍚庝慨鏀逛汉", "DESCRIPTION":null, "ATTRIBUTEDATATYPE":"VTString", "ATTRIBUTEDATATYPETEXT":"瀛楃涓�", "NULLABLEFLAG":"false", "DEFAULTVALUE":null, "ENUMID":null, "ENUMNAME":null, "BTMTYPEID":null, "BTMTYPENAME":null, "ATTRLENGTH":50, "PRECISIONLENGTH":0, "SCALELENGTH":2, "RANGE":null, "BTMNAME":"attribute", "OWNER":"developer", "CREATOR":"developer", "CREATETIME":"2020-06-29 10:33:47", "LASTMODIFIER":"sysAdmin", "LASTMODIFYTIME":"2022-03-30 19:04:08", "TS":"2022-03-30 19:04:08"},
+  {"OID":"b93da256-f190-47eb-9281-ec014d7eae12", "ID":"islastv", "NAME":"鏈�鏂扮増娆�", "DESCRIPTION":null, "ATTRIBUTEDATATYPE":"VTString", "ATTRIBUTEDATATYPETEXT":"瀛楃涓�", "NULLABLEFLAG":"true", "DEFAULTVALUE":null, "ENUMID":null, "ENUMNAME":null, "BTMTYPEID":null, "BTMTYPENAME":null, "ATTRLENGTH":1, "PRECISIONLENGTH":0, "SCALELENGTH":2, "RANGE":null, "BTMNAME":"attribute", "OWNER":"developer", "CREATOR":"developer", "CREATETIME":"2020-06-29 10:33:47", "LASTMODIFIER":"sysAdmin", "LASTMODIFYTIME":"2022-03-30 19:04:08", "TS":"2022-03-30 19:04:08"},
+  {"OID":"666df0a2-25e5-4266-83d9-b12455dcdd73", "ID":"description", "NAME":"鎻忚堪", "DESCRIPTION":null, "ATTRIBUTEDATATYPE":"VTString", "ATTRIBUTEDATATYPETEXT":"瀛楃涓�", "NULLABLEFLAG":"true", "DEFAULTVALUE":null, "ENUMID":null, "ENUMNAME":null, "BTMTYPEID":null, "BTMTYPENAME":null, "ATTRLENGTH":4000, "PRECISIONLENGTH":0, "SCALELENGTH":2, "RANGE":null, "BTMNAME":"attribute", "OWNER":"developer", "CREATOR":"developer", "CREATETIME":"2020-06-29 10:33:47", "LASTMODIFIER":"sysAdmin", "LASTMODIFYTIME":"2022-03-30 19:04:08", "TS":"2022-03-30 19:04:08"},
+  {"OID":"e8d80ccc-30a3-4bc3-8549-ae4c6059a65e", "ID":"revisionrule", "NAME":"鐗堟湰瑙勫垯", "DESCRIPTION":null, "ATTRIBUTEDATATYPE":"VTString", "ATTRIBUTEDATATYPETEXT":"瀛楃涓�", "NULLABLEFLAG":"true", "DEFAULTVALUE":null, "ENUMID":null, "ENUMNAME":null, "BTMTYPEID":null, "BTMTYPENAME":null, "ATTRLENGTH":50, "PRECISIONLENGTH":0, "SCALELENGTH":2, "RANGE":null, "BTMNAME":"attribute", "OWNER":"developer", "CREATOR":"developer", "CREATETIME":"2020-06-29 10:33:47", "LASTMODIFIER":"sysAdmin", "LASTMODIFYTIME":"2022-03-30 19:04:08", "TS":"2022-03-30 19:04:08"},
+  {"OID":"f4cc1ff1-9bb7-4268-91de-e61735c01bec", "ID":"owner", "NAME":"鎷ユ湁鑰�", "DESCRIPTION":null, "ATTRIBUTEDATATYPE":"VTString", "ATTRIBUTEDATATYPETEXT":"瀛楃涓�", "NULLABLEFLAG":"true", "DEFAULTVALUE":null, "ENUMID":null, "ENUMNAME":null, "BTMTYPEID":null, "BTMTYPENAME":null, "ATTRLENGTH":50, "PRECISIONLENGTH":0, "SCALELENGTH":2, "RANGE":null, "BTMNAME":"attribute", "OWNER":"developer", "CREATOR":"developer", "CREATETIME":"2020-06-29 10:33:47", "LASTMODIFIER":"sysAdmin", "LASTMODIFYTIME":"2022-03-30 19:04:08", "TS":"2022-03-30 19:04:08"},
+  {"OID":"a49e923b-b08c-4d58-9283-50bc88be31f7", "ID":"versionrule", "NAME":"鐗堟瑙勫垯", "DESCRIPTION":null, "ATTRIBUTEDATATYPE":"VTString", "ATTRIBUTEDATATYPETEXT":"瀛楃涓�", "NULLABLEFLAG":"true", "DEFAULTVALUE":null, "ENUMID":null, "ENUMNAME":null, "BTMTYPEID":null, "BTMTYPENAME":null, "ATTRLENGTH":50, "PRECISIONLENGTH":0, "SCALELENGTH":2, "RANGE":null, "BTMNAME":"attribute", "OWNER":"developer", "CREATOR":"developer", "CREATETIME":"2020-06-29 10:33:47", "LASTMODIFIER":"sysAdmin", "LASTMODIFYTIME":"2022-03-30 19:04:08", "TS":"2022-03-30 19:04:08"},
+  {"OID":"8331d5cc-6d8d-411f-8503-51dc3e9bb1b2", "ID":"id", "NAME":"缂栧彿", "DESCRIPTION":null, "ATTRIBUTEDATATYPE":"VTString", "ATTRIBUTEDATATYPETEXT":"瀛楃涓�", "NULLABLEFLAG":"false", "DEFAULTVALUE":null, "ENUMID":null, "ENUMNAME":null, "BTMTYPEID":null, "BTMTYPENAME":null, "ATTRLENGTH":200, "PRECISIONLENGTH":0, "SCALELENGTH":2, "RANGE":null, "BTMNAME":"attribute", "OWNER":"developer", "CREATOR":"developer", "CREATETIME":"2020-06-29 10:33:47", "LASTMODIFIER":"sysAdmin", "LASTMODIFYTIME":"2022-03-30 19:04:08", "TS":"2022-03-30 19:04:08"},
+  {"OID":"b0571913-f408-45a0-9254-04e3db14e2a8", "ID":"btmname", "NAME":"涓氬姟绫诲瀷", "DESCRIPTION":null, "ATTRIBUTEDATATYPE":"VTString", "ATTRIBUTEDATATYPETEXT":"瀛楃涓�", "NULLABLEFLAG":"true", "DEFAULTVALUE":null, "ENUMID":null, "ENUMNAME":null, "BTMTYPEID":null, "BTMTYPENAME":null, "ATTRLENGTH":30, "PRECISIONLENGTH":0, "SCALELENGTH":2, "RANGE":null, "BTMNAME":"attribute", "OWNER":"developer", "CREATOR":"developer", "CREATETIME":"2020-06-29 10:33:47", "LASTMODIFIER":"sysAdmin", "LASTMODIFYTIME":"2022-03-30 19:04:08", "TS":"2022-03-30 19:04:08"},
+  {"OID":"01d364fc-1c32-4921-a79a-54952b63cc50", "ID":"revisionvalue", "NAME":"鐗堟湰", "DESCRIPTION":null, "ATTRIBUTEDATATYPE":"VTString", "ATTRIBUTEDATATYPETEXT":"瀛楃涓�", "NULLABLEFLAG":"true", "DEFAULTVALUE":null, "ENUMID":null, "ENUMNAME":null, "BTMTYPEID":null, "BTMTYPENAME":null, "ATTRLENGTH":50, "PRECISIONLENGTH":0, "SCALELENGTH":null, "RANGE":null, "BTMNAME":"attribute", "OWNER":"developer", "CREATOR":"developer", "CREATETIME":"2020-06-29 10:33:47", "LASTMODIFIER":"sysAdmin", "LASTMODIFYTIME":"2022-03-30 19:04:08", "TS":"2022-03-30 19:04:08"},
+  {"OID":"5f4e6bfe-58ed-44dd-87f7-2db3bde1084d", "ID":"creator", "NAME":"鍒涘缓浜�", "DESCRIPTION":null, "ATTRIBUTEDATATYPE":"VTString", "ATTRIBUTEDATATYPETEXT":"瀛楃涓�", "NULLABLEFLAG":"false", "DEFAULTVALUE":null, "ENUMID":null, "ENUMNAME":null, "BTMTYPEID":null, "BTMTYPENAME":null, "ATTRLENGTH":50, "PRECISIONLENGTH":0, "SCALELENGTH":2, "RANGE":null, "BTMNAME":"attribute", "OWNER":"developer", "CREATOR":"developer", "CREATETIME":"2020-06-29 10:33:47", "LASTMODIFIER":"sysAdmin", "LASTMODIFYTIME":"2022-03-30 19:04:08", "TS":"2022-03-30 19:04:08"},
+  {"OID":"b019d1ed-eb6c-4778-9688-d0bdefc424c4", "ID":"revisionseq", "NAME":"鐗堟湰鐨勯『搴�", "DESCRIPTION":null, "ATTRIBUTEDATATYPE":"VTInteger", "ATTRIBUTEDATATYPETEXT":"鏁板瓧", "NULLABLEFLAG":"true", "DEFAULTVALUE":null, "ENUMID":null, "ENUMNAME":null, "BTMTYPEID":null, "BTMTYPENAME":null, "ATTRLENGTH":0, "PRECISIONLENGTH":null, "SCALELENGTH":null, "RANGE":null, "BTMNAME":"attribute", "OWNER":"developer", "CREATOR":"developer", "CREATETIME":"2020-06-29 10:33:47", "LASTMODIFIER":"sysAdmin", "LASTMODIFYTIME":"2022-03-30 19:04:08", "TS":"2022-03-30 19:04:08"},
+  {"OID":"6f875594-7bc0-4619-ac41-03e05b62ee76", "ID":"checkouttime", "NAME":"绛惧嚭鏃堕棿", "DESCRIPTION":null, "ATTRIBUTEDATATYPE":"VTDateTime", "ATTRIBUTEDATATYPETEXT":"鏃ユ湡鏃堕棿", "NULLABLEFLAG":"true", "DEFAULTVALUE":null, "ENUMID":null, "ENUMNAME":null, "BTMTYPEID":null, "BTMTYPENAME":null, "ATTRLENGTH":0, "PRECISIONLENGTH":null, "SCALELENGTH":null, "RANGE":null, "BTMNAME":"attribute", "OWNER":"developer", "CREATOR":"developer", "CREATETIME":"2020-06-29 10:33:47", "LASTMODIFIER":"sysAdmin", "LASTMODIFYTIME":"2022-03-30 19:04:08", "TS":"2022-03-30 19:04:08"},
+  {"OID":"4c3cb386-2b2e-44dc-8abe-f7cea714dae1", "ID":"secretgrade", "NAME":"瀵嗙骇", "DESCRIPTION":null, "ATTRIBUTEDATATYPE":"VTInteger", "ATTRIBUTEDATATYPETEXT":"鏁板瓧", "NULLABLEFLAG":"true", "DEFAULTVALUE":null, "ENUMID":"Enumsecretgrade", "ENUMNAME":null, "BTMTYPEID":null, "BTMTYPENAME":null, "ATTRLENGTH":0, "PRECISIONLENGTH":null, "SCALELENGTH":null, "RANGE":null, "BTMNAME":"attribute", "OWNER":"developer", "CREATOR":"developer", "CREATETIME":"2020-06-29 10:33:47", "LASTMODIFIER":"sysAdmin", "LASTMODIFYTIME":"2022-03-30 19:04:08", "TS":"2022-03-30 19:04:08"},
+  {"OID":"fc77bab5-8d18-47ff-8f60-6b13124b0b2e", "ID":"oid", "NAME":"涓婚敭", "DESCRIPTION":null, "ATTRIBUTEDATATYPE":"VTString", "ATTRIBUTEDATATYPETEXT":"瀛楃涓�", "NULLABLEFLAG":"false", "DEFAULTVALUE":null, "ENUMID":null, "ENUMNAME":null, "BTMTYPEID":null, "BTMTYPENAME":null, "ATTRLENGTH":150, "PRECISIONLENGTH":0, "SCALELENGTH":2, "RANGE":null, "BTMNAME":"attribute", "OWNER":"developer", "CREATOR":"developer", "CREATETIME":"2020-06-29 10:33:47", "LASTMODIFIER":"sysAdmin", "LASTMODIFYTIME":"2022-03-30 19:04:08", "TS":"2022-03-30 19:04:08"},
+  {"OID":"4f0dcea2-c10f-4979-b1c2-ce8db3bfa478", "ID":"checkoutby", "NAME":"绛惧嚭浜�", "DESCRIPTION":null, "ATTRIBUTEDATATYPE":"VTString", "ATTRIBUTEDATATYPETEXT":"瀛楃涓�", "NULLABLEFLAG":"true", "DEFAULTVALUE":null, "ENUMID":null, "ENUMNAME":null, "BTMTYPEID":null, "BTMTYPENAME":null, "ATTRLENGTH":50, "PRECISIONLENGTH":0, "SCALELENGTH":2, "RANGE":null, "BTMNAME":"attribute", "OWNER":"developer", "CREATOR":"developer", "CREATETIME":"2020-06-29 10:33:47", "LASTMODIFIER":"sysAdmin", "LASTMODIFYTIME":"2022-03-30 19:04:08", "TS":"2022-03-30 19:04:08"},
+  {"OID":"fb1242e7-aebc-49f1-8ef7-a40f87cbc5be", "ID":"nameoid", "NAME":"瀵硅薄涓婚敭", "DESCRIPTION":null, "ATTRIBUTEDATATYPE":"VTString", "ATTRIBUTEDATATYPETEXT":"瀛楃涓�", "NULLABLEFLAG":"true", "DEFAULTVALUE":null, "ENUMID":null, "ENUMNAME":null, "BTMTYPEID":null, "BTMTYPENAME":null, "ATTRLENGTH":50, "PRECISIONLENGTH":0, "SCALELENGTH":2, "RANGE":null, "BTMNAME":"attribute", "OWNER":"developer", "CREATOR":"developer", "CREATETIME":"2020-06-29 10:33:47", "LASTMODIFIER":"sysAdmin", "LASTMODIFYTIME":"2022-03-30 19:04:08", "TS":"2022-03-30 19:04:08"},
+  {"OID":"dd949ab2-f13c-4eb6-a394-8c953e5c7ba1", "ID":"isfirstr", "NAME":"鏈�鏃╃増鏈�", "DESCRIPTION":null, "ATTRIBUTEDATATYPE":"VTString", "ATTRIBUTEDATATYPETEXT":"瀛楃涓�", "NULLABLEFLAG":"true", "DEFAULTVALUE":null, "ENUMID":null, "ENUMNAME":null, "BTMTYPEID":null, "BTMTYPENAME":null, "ATTRLENGTH":1, "PRECISIONLENGTH":0, "SCALELENGTH":2, "RANGE":null, "BTMNAME":"attribute", "OWNER":"developer", "CREATOR":"developer", "CREATETIME":"2020-06-29 10:33:47", "LASTMODIFIER":"sysAdmin", "LASTMODIFYTIME":"2022-03-30 19:04:08", "TS":"2022-03-30 19:04:08"},
+  {"OID":"58c50c62-9733-4d73-a3dc-6796eeddeb87", "ID":"isfirstv", "NAME":"鏈�鏃╃増娆�", "DESCRIPTION":null, "ATTRIBUTEDATATYPE":"VTString", "ATTRIBUTEDATATYPETEXT":"瀛楃涓�", "NULLABLEFLAG":"true", "DEFAULTVALUE":null, "ENUMID":null, "ENUMNAME":null, "BTMTYPEID":null, "BTMTYPENAME":null, "ATTRLENGTH":1, "PRECISIONLENGTH":0, "SCALELENGTH":2, "RANGE":null, "BTMNAME":"attribute", "OWNER":"developer", "CREATOR":"developer", "CREATETIME":"2020-06-29 10:33:47", "LASTMODIFIER":"sysAdmin", "LASTMODIFYTIME":"2022-03-30 19:04:08", "TS":"2022-03-30 19:04:08"},
+  {"OID":"e590c699-687c-4a3b-b3c7-b1504ed9e5fe", "ID":"lcstatus", "NAME":"鐘舵��", "DESCRIPTION":null, "ATTRIBUTEDATATYPE":"VTString", "ATTRIBUTEDATATYPETEXT":"瀛楃涓�", "NULLABLEFLAG":"true", "DEFAULTVALUE":null, "ENUMID":null, "ENUMNAME":null, "BTMTYPEID":null, "BTMTYPENAME":null, "ATTRLENGTH":50, "PRECISIONLENGTH":0, "SCALELENGTH":2, "RANGE":null, "BTMNAME":"attribute", "OWNER":"developer", "CREATOR":"developer", "CREATETIME":"2020-06-29 10:33:47", "LASTMODIFIER":"sysAdmin", "LASTMODIFYTIME":"2022-03-30 19:04:08", "TS":"2022-03-30 19:04:08"},
+  {"OID":"e590c699-687c-4a3b-b3c7-b1504ed9e5ff", "ID":"lctid", "NAME":"鐢熷懡鍛ㄦ湡瑙勫垯", "DESCRIPTION":null, "ATTRIBUTEDATATYPE":"VTString", "ATTRIBUTEDATATYPETEXT":"瀛楃涓�", "NULLABLEFLAG":"true", "DEFAULTVALUE":null, "ENUMID":null, "ENUMNAME":null, "BTMTYPEID":null, "BTMTYPENAME":null, "ATTRLENGTH":50, "PRECISIONLENGTH":0, "SCALELENGTH":2, "RANGE":null, "BTMNAME":"attribute", "OWNER":"developer", "CREATOR":"developer", "CREATETIME":"2020-06-29 10:33:47", "LASTMODIFIER":"sysAdmin", "LASTMODIFYTIME":"2022-03-30 19:04:08", "TS":"2022-03-30 19:04:08"},
+  {"OID":"e590c699-687c-4a3b-b3c7-b1504ed9e5fg", "ID":"copyfromversion", "NAME":"淇鏉ユ簮鐗堟湰", "DESCRIPTION":null, "ATTRIBUTEDATATYPE":"VTString", "ATTRIBUTEDATATYPETEXT":"瀛楃涓�", "NULLABLEFLAG":"true", "DEFAULTVALUE":null, "ENUMID":null, "ENUMNAME":null, "BTMTYPEID":null, "BTMTYPENAME":null, "ATTRLENGTH":50, "PRECISIONLENGTH":0, "SCALELENGTH":2, "RANGE":null, "BTMNAME":"attribute", "OWNER":"developer", "CREATOR":"developer", "CREATETIME":"2020-06-29 10:33:47", "LASTMODIFIER":"sysAdmin", "LASTMODIFYTIME":"2022-03-30 19:04:08", "TS":"2022-03-30 19:04:08"}
+]
+
+
diff --git a/Source/platformProject/vci-platform-web/src/main/resources/application-dev.yml b/Source/platformProject/vci-platform-web/src/main/resources/application-dev.yml
new file mode 100644
index 0000000..a0b685b
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/resources/application-dev.yml
@@ -0,0 +1,81 @@
+#####搴旂敤鍩烘湰閰嶇疆
+app:
+  name: web
+  group: 鍖椾含瀹忓崥杩滆揪绉戞妧鏈夐檺鍏徃
+  description: 骞冲彴B/S瀹㈡埛绔�
+  private-token-key: vciweb20210212
+###tomcat鐩稿叧鐨勯厤缃�
+server:
+  port: 12000
+  servlet:
+    context-path: /web
+  tomcat:
+    uri-encoding: UTF-8
+###log4j2鐨勯厤缃紝闇�瑕佸摢涓寘涓嬬殑鏂囦欢寮�鍚煇涓瓑绾э紝灏辩洿鎺xxxx: yy杩欐牱鏂瑰紡
+logging:
+  config: "classpath:log4j2-spring-dev.xml"
+  level:
+    com.vci: debug
+  root: info
+###鏈」鐩殑閰嶇疆锛屾敞鎰弒pring瀹舵棌璇诲彇閰嶇疆鏃讹紝澶у啓瀛楁瘝闇�瑕佽浆鎹负-鐨勬柟寮忥紝鑰宖eign闇�瑕佸ぇ灏忓啓瀹屽叏鐩稿悓
+session:
+     session-info-storage-type: "database"
+     database-platform: oracle
+     clear-session-on-start: false
+     ###鏄惁寮�鍚敤鎴峰湪绾挎鏌�
+     checkSessionTimeout: false
+     ###瀹㈡埛绔垽鏂秴鏃惰疆璇㈡椂闂达紝鍗曚綅涓虹
+     sessionInterval: 10
+     ###瀹㈡埛绔渶澶у瓨鍦ㄦ椂闂达紝鍗曚綅涓哄垎閽�
+     sessionIdlTime: 30
+     ###瓒呮椂鎻愰啋鏃堕棿锛屽崟浣嶄负鍒嗛挓
+     sessionRemind: 3
+user-table-compatibility: "platform1"
+#鍙�2021鐗堟湰鐨勯儴鍒嗘帴鍙g殑褰卞搷锛屼笅闈㈢殑鍐呭闇�瑕侀厤缃紝
+vciPlatform:
+  objectServiceUrl: ""
+#缂撳瓨
+spring:
+  # redis閰嶇疆
+  redis:  ###### redis 閰嶇疆
+    enabled: false  #true锛屽惎鐢╮edi锛宖alse涓嶅惎鐢紝榛樿false,閰嶇疆鏂囦欢娌℃湁杩欎簺榛樿涓嶅惎鐢╮edis
+    host: vciserver  # ip鍦板潃
+    database: 0  # redis鏁版嵁搴�  0-15
+    port: 6379  # 绔彛鍙�
+    password: vcitest # 鏃犲瘑鐮佷笉濉�
+    timeout: 30000s   # 杩炴帴瓒呮椂鏃堕棿 锛堥粯璁�1澶╋級
+    lettuce:
+      shutdown-timeout: 100ms # 鍏抽棴瓒呮椂鏃堕棿 榛樿 100ms
+      pool: # lettuce 杩炴帴姹�
+        max-active: 8 # 杩炴帴姹犳渶澶ц繛鎺ユ暟 榛樿 8锛�-1 锛氳〃绀烘病鏈夐檺鍒讹級
+        max-wait: 60000ms # 杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂� 榛樿-1ms 锛�-1 :琛ㄧず娌℃湁闄愬埗锛� 杩欓噷璁剧疆1鍒嗛挓
+        max-idle: 8 # 鏈�澶х┖闂茶繛鎺�  榛樿 8
+        min-idle: 0 # 鏈�灏忕┖闂茶繛鎺�  榛樿 0
+  resources:
+    chain:
+      cache: false
+      strategy:
+        content:
+          enabled: true
+          paths: /**
+  cache:
+    type: ehcache
+  servlet:
+    multipart:
+      enabled: true
+      ###鍗曚釜鏂囦欢澶у皬锛�50M
+      max-file-size: 52428800
+      ###鎬讳笂浼犵殑鏂囦欢澶у皬锛�50M
+      max-request-size: 52428800
+  mvc:
+    view:
+      suffix: .html
+##web閰嶇疆
+vciweb:
+    debug: true
+file-preview:
+  enabled: true
+  preview-service-url: "http://dev.yunkeruida.top:28090/vciFilePreview/ajaxPreview.html"
+  preview-system-key: plt2020
+
+
diff --git a/Source/platformProject/vci-platform-web/src/main/resources/application-prod.yml b/Source/platformProject/vci-platform-web/src/main/resources/application-prod.yml
new file mode 100644
index 0000000..6f287af
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/resources/application-prod.yml
@@ -0,0 +1,71 @@
+#####搴旂敤鍩烘湰閰嶇疆
+app:
+  name: web
+  group: 鍖椾含瀹忓崥杩滆揪绉戞妧鏈夐檺鍏徃
+  description: 骞冲彴B/S瀹㈡埛绔�
+  private-token-key: vciweb20210212
+###tomcat鐩稿叧鐨勯厤缃�
+server:
+  port: 12000
+  servlet:
+    context-path: /web
+###log4j2鐨勯厤缃紝闇�瑕佸摢涓寘涓嬬殑鏂囦欢寮�鍚煇涓瓑绾э紝灏辩洿鎺xxxx: yy杩欐牱鏂瑰紡
+logging:
+  config: "classpath:log4j2-spring-prod.xml"
+  level:
+    com.vci: debug
+  root: info
+###鏈」鐩殑閰嶇疆锛屾敞鎰弒pring瀹舵棌璇诲彇閰嶇疆鏃讹紝澶у啓瀛楁瘝闇�瑕佽浆鎹负-鐨勬柟寮忥紝鑰宖eign闇�瑕佸ぇ灏忓啓瀹屽叏鐩稿悓
+session:
+  session-info-storage-type: "database"
+  database-platform: oracle
+  clear-session-on-start: false
+  ###鏄惁寮�鍚敤鎴峰湪绾挎鏌�
+  checkSessionTimeout: false
+  ###瀹㈡埛绔垽鏂秴鏃惰疆璇㈡椂闂达紝鍗曚綅涓虹
+  sessionInterval: 10
+  ###瀹㈡埛绔渶澶у瓨鍦ㄦ椂闂达紝鍗曚綅涓哄垎閽�
+  sessionIdlTime: 30
+  ###瓒呮椂鎻愰啋鏃堕棿锛屽崟浣嶄负鍒嗛挓
+  sessionRemind: 3
+###鍏煎鎬э紝蹇呴』璁剧疆涓鸿繖涓�
+user-table-compatibility: "platform1"
+#缂撳瓨閰嶇疆
+###corba鐨勯厤缃�
+jacorb:
+  client:
+    enabled: true
+    url: "corbaloc::localhost:30000/NameService"
+    instanceIdentity: "platform-sf"
+#鍙�2021鐗堟湰鐨勯儴鍒嗘帴鍙g殑褰卞搷锛屼笅闈㈢殑鍐呭闇�瑕侀厤缃紝
+vciPlatform:
+  objectServiceUrl: "2"
+#缂撳瓨
+spring:
+  # redis閰嶇疆
+  redis: ###### redis 閰嶇疆
+    enabled: false  #true锛屽惎鐢╮edi锛宖alse涓嶅惎鐢紝榛樿false,閰嶇疆鏂囦欢娌℃湁杩欎簺榛樿涓嶅惎鐢╮edis
+    host: vciserver  # ip鍦板潃
+    database: 0  # redis鏁版嵁搴�  0-15
+    port: 6379  # 绔彛鍙�
+    password: vcitest # 鏃犲瘑鐮佷笉濉�
+    timeout: 30000s   # 杩炴帴瓒呮椂鏃堕棿 锛堥粯璁�1澶╋級
+    lettuce:
+      shutdown-timeout: 100ms # 鍏抽棴瓒呮椂鏃堕棿 榛樿 100ms
+      pool: # lettuce 杩炴帴姹�
+        max-active: 8 # 杩炴帴姹犳渶澶ц繛鎺ユ暟 榛樿 8锛�-1 锛氳〃绀烘病鏈夐檺鍒讹級
+        max-wait: 60000ms # 杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂� 榛樿-1ms 锛�-1 :琛ㄧず娌℃湁闄愬埗锛� 杩欓噷璁剧疆1鍒嗛挓
+        max-idle: 8 # 鏈�澶х┖闂茶繛鎺�  榛樿 8
+        min-idle: 0 # 鏈�灏忕┖闂茶繛鎺�  榛樿 0
+  cache:
+    type: ehcache
+  config:
+    location:
+  mvc:
+    view:
+      suffix: ".html"
+##web閰嶇疆
+vciweb:
+  debug: true
+cors:
+  enabled: true
diff --git a/Source/platformProject/vci-platform-web/src/main/resources/application.yml b/Source/platformProject/vci-platform-web/src/main/resources/application.yml
new file mode 100644
index 0000000..2b40fa6
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/resources/application.yml
@@ -0,0 +1,7 @@
+spring:
+  profiles:
+    active: dev
+    include: web
+  messages:
+    encoding: UTF-8
+    basename: i18n/messages
\ No newline at end of file
diff --git a/Source/platformProject/vci-platform-web/src/main/resources/codeTemplate/Controller.java.vm b/Source/platformProject/vci-platform-web/src/main/resources/codeTemplate/Controller.java.vm
new file mode 100644
index 0000000..2ba6a5d
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/resources/codeTemplate/Controller.java.vm
@@ -0,0 +1,318 @@
+package ${controllerPackage};
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.List;
+import com.vci.starter.web.exception.VciBaseException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import com.vci.starter.web.pagemodel.*;
+import com.vci.starter.web.annotation.*;
+import ${voPackage}.${className}VO;
+import ${dtoPackage}.${className}DTO;
+import ${servicePackage}.${className}ServiceI;
+import org.springframework.stereotype.Controller;
+import com.vci.starter.web.util.*;
+#if(${hasExcel})
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.web.multipart.MultipartFile;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import org.apache.commons.io.IOUtils;
+#end
+
+
+/**
+ * ${comments}鎺у埗鍣�
+ *
+ * @author ${author}
+ * @date ${datetime}
+ */
+@RestController
+@RequestMapping("${controllerRequestMap}")
+#if(${hasPermisssion})
+@VciPermission(modelKey = "${classNameFristLowwer}")
+#end
+public class ${className}Controller {
+    /**
+    * ${comments} 鏈嶅姟
+    */
+    @Autowired
+    private ${className}ServiceI ${classNameFristLowwer}Service;
+
+#if(!${hasParentField})
+    /**
+     * ${comments}鍒楄〃
+     * @param baseQueryObject 鍩虹鏌ヨ瀵硅薄锛屽寘鍚煡璇㈡潯浠讹紝鍒嗛〉锛屾帓搴忕瓑
+     * @return ${comments}鏄剧ず瀵硅薄鍒楄〃
+     */
+    @GetMapping("/grid${className}")
+#if(${hasPermisssion})
+    @VciPermission(methodKey = {"VIEW","QUERY","ADVQUERY"},methodAlias = {"鏌ョ湅","鏌ヨ","楂樼骇鏌ヨ"},modelKey = {1,2,3})
+#end
+    public DataGrid<${className}VO> grid${className}(BaseQueryObject baseQueryObject){
+        if(baseQueryObject == null){
+            baseQueryObject = new BaseQueryObject();
+        }
+        return ${classNameFristLowwer}Service.grid${className}(baseQueryObject.getConditionMap(),baseQueryObject.getPageHelper());
+    }
+#else
+    /**
+     * ${comments}鏍�
+     * @param treeQueryObject 鏍戝舰鏌ヨ瀵硅薄
+     * @return ${comments}鏄剧ず鏍�
+     */
+    @GetMapping("/tree${className}")
+    public List<Tree> tree${className}(TreeQueryObject treeQueryObject)  {
+        return  ${classNameFristLowwer}Service.tree${className}(treeQueryObject);
+    }
+
+#end
+    /**
+     * 澧炲姞 ${comments}
+     * @param ${classNameFristLowwer}DTO ${comments}鏁版嵁浼犺緭瀵硅薄
+     * @return 鎵ц缁撴灉锛宻uccess涓簍rue琛ㄧず鎴愬姛锛宮sg鏄け璐ョ殑鎻愮ず淇℃伅锛宱bj鏄坊鍔犲畬鎴愬悗鐨勬樉绀哄璞�
+     */
+    @PostMapping( "/addSave")
+#if(${hasPermisssion})
+    @VciPermission(methodKey = {"ADD"},methodAlias = {"娣诲姞"},modelKey = {4})
+#end
+    public BaseResult<${className}VO> addSave(@RequestBody ${className}DTO ${classNameFristLowwer}DTO){
+         ${className}VO ${classNameFristLowwer}VO = ${classNameFristLowwer}Service.addSave(${classNameFristLowwer}DTO);
+         return BaseResult.success(${classNameFristLowwer}VO);
+    }
+
+    /**
+     * 淇敼 ${comments}
+     * @param ${classNameFristLowwer}DTO ${comments}鏁版嵁浼犺緭瀵硅薄
+     * @return 鎵ц缁撴灉锛宻uccess涓簍rue琛ㄧず鎴愬姛锛宮sg鏄け璐ョ殑鎻愮ず淇℃伅锛宱bj鏄坊鍔犲畬鎴愬悗鐨勬樉绀哄璞�
+     */
+    @PutMapping("/editSave")
+#if(${hasPermisssion})
+    @VciPermission(methodKey = {"EDIT"},methodAlias = {"淇敼"},modelKey = {5})
+#end
+    public BaseResult<${className}VO> editSave(@RequestBody ${className}DTO ${classNameFristLowwer}DTO){
+        ${className}VO ${classNameFristLowwer}VO = ${classNameFristLowwer}Service.editSave(${classNameFristLowwer}DTO);
+        return BaseResult.success(${classNameFristLowwer}VO);
+    }
+
+#if(${hasParentField})
+    /**
+    * 妫�鏌� ${comments}鏄惁鍒犻櫎
+    * @param ${classNameFristLowwer}DTO ${comments}鏁版嵁浼犺緭瀵硅薄锛屽繀椤昏鏈塷id鍜宼s灞炴��
+    * @return 鎵ц缁撴灉 success涓簍rue涓哄彲浠ュ垹闄わ紝false琛ㄧず鏈夋暟鎹紩鐢紝obj涓簍rue琛ㄧず鏈変笅绾�
+    */
+    @PostMapping( "/checkIsCanDelete")
+#if(${hasPermisssion})
+    @VciPermission(methodKey = {"DELETE"},methodAlias = {"鍒犻櫎"},modelKey = {6})
+#end
+    public BaseResult checkIsCanDelete( ${className}DTO ${classNameFristLowwer}DTO)  {
+        return ${classNameFristLowwer}Service.checkIsCanDelete(${classNameFristLowwer}DTO);
+    }
+#end
+
+    /**
+     * 鍒犻櫎${comments}
+     * @param ${classNameFristLowwer}DTO ${comments}鏁版嵁浼犺緭瀵硅薄锛宱id鍜宼s闇�瑕佷紶杈�
+     * @return 鍒犻櫎缁撴灉鍙嶉锛氾細success锛氭垚鍔燂紝fail锛氬け璐�
+     */
+    @DeleteMapping( "/deleteData")
+#if(${hasPermisssion})
+    @VciPermission(methodKey = {"DELETE"},methodAlias = {"鍒犻櫎"},modelKey = {6})
+#end
+    public BaseResult del${className}( ${className}DTO ${classNameFristLowwer}DTO) {
+        return ${classNameFristLowwer}Service.delete${className}(${classNameFristLowwer}DTO);
+    }
+
+    /**
+    * 涓婚敭鑾峰彇${comments}
+    * @param oid 涓婚敭
+    * @return ${comments}鏄剧ず瀵硅薄
+    */
+    @GetMapping("/getObjectByOid")
+#if(${hasPermisssion})
+    @VciPermission(methodKey = {"VIEW"},methodAlias = {"鏌ョ湅"},modelKey = {1})
+#end
+    public BaseResult<${className}VO> getObjectByOid(String oid){
+        ${className}VO ${classNameFristLowwer}VO = ${classNameFristLowwer}Service.getObjectByOid(oid);
+        return BaseResult.success(${classNameFristLowwer}VO);
+    }
+
+    /**
+     * 涓婚敭鎵归噺鑾峰彇${comments}
+     * @param oids 涓婚敭锛屽涓互閫楀彿鍒嗛殧锛屼絾鏄彈鎬ц兘褰卞搷锛屽缓璁竴娆℃煡璇笉瓒呰繃10000涓�
+     * @return ${comments}鏄剧ず瀵硅薄
+     */
+    @GetMapping("/listDataByOids")
+#if(${hasPermisssion})
+    @VciPermission(methodKey = {"VIEW"},methodAlias = {"鏌ョ湅"},modelKey = {1})
+#end
+    public BaseResult<${className}VO> list${className}ByOids(String oids){
+        Collection<${className}VO> voCollection =  ${classNameFristLowwer}Service.list${className}ByOids(VciBaseUtil.str2List(oids));
+        BaseResult baseResult = BaseResult.success();
+        baseResult.setData(voCollection);
+        return  baseResult;
+    }
+
+#if(${hasEnable})
+    /**
+    * 鍚敤${comments}
+    * @param ${classNameFristLowwer}DTO ${comments}鏁版嵁浼犺緭瀵硅薄锛宱id鍜宼s闇�瑕佷紶杈�
+#if(${hasParentField})
+     * @param cascade 绾ц仈鍚敤
+#end
+    * @return 鍚敤缁撴灉鍙嶉锛氾細success锛氭垚鍔燂紝fail锛氬け璐�
+    */
+    @PostMapping( "/enableData")
+#if(${hasPermisssion})
+    @VciPermission(methodKey = {"ENABLE"},methodAlias = {"鍚敤"},modelKey = {7})
+#end
+    public BaseResult enable${className}( ${className}DTO ${classNameFristLowwer}DTO#if(${hasParentField}),boolean cascade #end) {
+        return ${classNameFristLowwer}Service.enable${className}(${classNameFristLowwer}DTO#if(${hasParentField}), cascade #end);
+    }
+
+    /**
+     * 鍋滅敤${comments}
+     * @param ${classNameFristLowwer}DTO ${comments}鏁版嵁浼犺緭瀵硅薄锛宱id鍜宼s闇�瑕佷紶杈�
+#if(${hasParentField})
+     * @param cascade 绾ц仈鍋滅敤
+#end
+     * @return 鍋滅敤缁撴灉鍙嶉锛氾細success锛氭垚鍔燂紝fail锛氬け璐�
+     */
+    @PostMapping(value = "/disableData")
+#if(${hasPermisssion})
+    @VciPermission(methodKey = {"DISABLE"},methodAlias = {"鍋滅敤"},modelKey = {8})
+#end
+    public BaseResult disable${className}( ${className}DTO ${classNameFristLowwer}DTO#if(${hasParentField}),boolean cascade #end) {
+        return ${classNameFristLowwer}Service.disable${className}(${classNameFristLowwer}DTO#if(${hasParentField}), cascade #end);
+    }
+#end
+
+#if(${hasExcel})
+
+    /**
+    * 瀵煎嚭鐨別xcel鏂囦欢鐨勫悕绉�
+    */
+    public static final String EXPORT_TEMPLATE_SHOW_NAME = "${comments}.xls";
+
+    /**
+    * excel妯℃澘鐨勬枃浠�
+    */
+    public static final String EXPORT_TEMPLATE_FILE_NAME = "excelTemplate/${className}.xls";
+
+    /**
+    * 涓嬭浇瀵煎叆妯℃澘
+    * @param response 鍝嶅簲瀵硅薄
+    * @param downloadUUID 涓嬭浇闇�姹傦紝鍙互涓嶄紶閫�
+    * @return 鎵ц鐨勭粨鏋�
+    */
+    @GetMapping("/downloadImportTemplate")
+#if(${hasPermisssion})
+    @VciPermission(methodKey = {"IMPORT"},methodAlias = {"瀵煎叆"},modelKey = {9})
+#end
+    public BaseResult downloadImportTemplate(HttpServletResponse response,String downloadUUID){
+        //涓嬭浇妯℃澘杩欎釜鍙互涓嶆牎楠宒ownloadUUID
+        //1.鎷疯礉鏂囦欢鍒颁复鏃舵枃浠跺す涓�
+        //2.鍙互鏍规嵁瀹為檯鎯呭喌锛屾槸鍚﹀湪涓嬭浇瀵煎叆妯℃澘鏃跺啓鍏ラ粯璁ょ殑鍊�
+        //3.涓嬭浇excel
+        String excelFileName = LocalFileUtil.getDefaultTempFolder() + File.separator + EXPORT_TEMPLATE_SHOW_NAME;
+        LocalFileUtil.copyFileInJar(EXPORT_TEMPLATE_FILE_NAME,excelFileName);
+        try {
+            ControllerUtil.writeFileToResponse(response,new File(excelFileName),EXPORT_TEMPLATE_SHOW_NAME,true);
+        } catch (FileNotFoundException e) {
+            return BaseResult.fail(FrameWorkLangCodeConstant.IMPORT_TEMPLATE_FILE_NOT_FOUND);
+        } catch (IOException e) {
+            return BaseResult.fail(FrameWorkLangCodeConstant.DOWNLOAD_FAIL,new String[]{LangBaseUtil.getErrorMsg(e)},e);
+        }
+        return BaseResult.successMsg(FrameWorkLangCodeConstant.DOWNLOAD_SUCCESS);
+    }
+
+    /**
+    * 瀵煎叆 ${comments}
+    * @param file excel鏂囦欢
+    * @param ${classNameFristLowwer}DTO 鏁版嵁浼犺緭瀵硅薄锛屼綔涓哄鍏ョ殑闄勫姞鏉′欢鍒ゆ柇
+    * @return 鎵ц鐨勭粨鏋滐紝success涓簍rue琛ㄧず鎵ц鎴愬姛路
+    */
+    @PostMapping( "/importData")
+#if(${hasPermisssion})
+    @VciPermission(methodKey = {"IMPORT"},methodAlias = {"瀵煎叆"},modelKey = {9})
+#end
+    public BaseResult import${className}(MultipartFile  file,${className}DTO ${classNameFristLowwer}DTO)  {
+        BaseResult<?> baseResult = null;
+        InputStream ins = null;
+        try {
+            if (file != null && !file.isEmpty()) {
+                ins = file.getInputStream();
+                baseResult = ${classNameFristLowwer}Service.import${className}(ins,${classNameFristLowwer}DTO);
+            } else {
+                return BaseResult.fail(FrameWorkLangCodeConstant.IMPORT_FAIL);
+            }
+        }catch (IOException e){
+            throw new VciBaseException(e.getMessage(),new String[0],e);
+        }catch (Throwable e) {
+            throw e;
+        }finally {
+            IOUtils.closeQuietly(ins);
+        }
+        return baseResult;
+    }
+
+    /**
+    * 瀵煎嚭${comments}
+    * @param baseQueryObject 鍩虹鏌ヨ瀵硅薄锛屽寘鍚煡璇㈡潯浠讹紝鍒嗛〉鍜屾帓搴�
+    * @param response 鐩稿簲瀵硅薄
+    * @return 鍙湁鎵ц澶辫触鐨勬椂鍊欒繑鍥炵粨鏋滄墠鏈夋晥锛宮sg鏄敊璇俊鎭�
+    */
+    @PostMapping(value = "/exportData")
+#if(${hasPermisssion})
+    @VciPermission(methodKey = {"EXPORT"},methodAlias = {"瀵煎嚭"},modelKey = {10})
+#end
+    public void export${className}(BaseQueryObject baseQueryObject, HttpServletResponse response){
+        if(baseQueryObject == null){
+            baseQueryObject = new BaseQueryObject();
+        }
+        String excelFileName = ${classNameFristLowwer}Service.export${className}(baseQueryObject.getConditionMap(),baseQueryObject.getPageHelper());
+        try {
+            ControllerUtil.writeFileToResponse(response, excelFileName);
+        }catch (IOException e){
+            throw new VciBaseException(e.getMessage(),new String[0],e);
+        }catch (Throwable e){
+            throw e;
+        }
+    }
+#end
+
+#if(!${hasParentField})
+    /**
+     * 鍙傜収${comments}鍒楄〃
+     * @param baseQueryObject 鍩虹鏌ヨ瀵硅薄锛屽寘鍚煡璇㈡潯浠讹紝鍒嗛〉锛屾帓搴忕瓑
+     * @return ${comments}鏄剧ず瀵硅薄鍒楄〃锛岀敓鏁堢殑鍐呭
+     */
+    @GetMapping("/refDataGrid")
+#if(${hasPermisssion})
+    @VciReferPermission(referedKey = "${className}Refer")
+#end
+    public DataGrid<${className}VO> refDataGrid${className}(BaseQueryObject baseQueryObject){
+        if(baseQueryObject == null){
+            baseQueryObject = new BaseQueryObject();
+        }
+        return ${classNameFristLowwer}Service.refDataGrid${className}(baseQueryObject.getConditionMap(),baseQueryObject.getPageHelper());
+    }
+#else
+    /**
+    * 鍙傜収鏍� ${comments}
+    * @param treeQueryObject 鏍戝舰鏌ヨ瀵硅薄
+    * @return ${comments}鏄剧ず鏍�
+    */
+    @GetMapping("/referTree")
+    #if(${hasPermisssion})
+    @VciReferPermission(referedKey = "${className}ReferTree")
+    #end
+    public List<Tree> referTree(TreeQueryObject treeQueryObject)  {
+        return ${classNameFristLowwer}Service.referTree(treeQueryObject);
+    }
+#end
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/resources/codeTemplate/DO.java.vm b/Source/platformProject/vci-platform-web/src/main/resources/codeTemplate/DO.java.vm
new file mode 100644
index 0000000..d5b5dbf
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/resources/codeTemplate/DO.java.vm
@@ -0,0 +1,155 @@
+package ${doPackage};
+
+import java.lang.*;
+import java.util.Date;
+
+import com.vci.starter.web.annotation.*;
+import com.vci.starter.web.model.BaseModel;
+
+/**
+ * ${comments}鏁版嵁瀵硅薄
+ * 
+ * @author ${author}
+ * @date ${datetime}
+ */
+public class ${doClassName} extends BaseModel {
+
+	/**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+	private static final long serialVersionUID = ${doSerialVersionUID};
+
+#foreach ($attr in $uiAttributes)
+	/**
+	* $attr.name
+	*/
+	@Column(columnDefinition = "$attr.name" #if(!$attr.nullable) ,nullable = false #end #if($attr.defaultValue && $attr.defaultValue !='') ,defaultValue = "$attr.defaultValue" #end #if($attr.referFlag) ,showTextField = "$attr.referBtmTypeShowField" #end #if($attr.enumFlag) ,showTextField = "$attr.enumShowField" #end)
+#if($attr.referFlag)
+    @VciUseRefer(value = "$attr.referBtmTypeId",showTextField = "$attr.referBtmTypeShowField" )
+#end
+#if($attr.enumFlag)
+    @VciUseEnum(value = "$attr.enumId",showTextField = "$attr.enumShowField")
+#end
+#if($attr.vciAttrDataType == "vtboolean")
+    @VciFieldType(VciFieldType.VciFieldTypeEnum.VTBoolean)
+#end
+#if($attr.vciAttrDataType == "vtinteger")
+    @VciFieldType(VciFieldType.VciFieldTypeEnum.VTInteger)
+#end
+#if($attr.vciAttrDataType == "vtlong")
+   @VciFieldType(VciFieldType.VciFieldTypeEnum.VTLong)
+#end
+#if($attr.vciAttrDataType == "vtdouble")
+   @VciFieldType(VciFieldType.VciFieldTypeEnum.VTDouble)
+#end
+#if($attr.vciAttrDataType == "vtboolean")
+   @VciFieldType(VciFieldType.VciFieldTypeEnum.VTBoolean)
+#end
+#if($attr.vciAttrDataType == "vtchar")
+   @VciFieldType(VciFieldType.VciFieldTypeEnum.VTChar)
+#end
+#if($attr.vciAttrDataType == "vtdate")
+   @VciFieldType(VciFieldType.VciFieldTypeEnum.VTDate)
+#end
+#if($attr.vciAttrDataType == "vtdatetime")
+   @VciFieldType(VciFieldType.VciFieldTypeEnum.VTDateTime)
+#end
+#if($attr.vciAttrDataType == "vttime")
+   @VciFieldType(VciFieldType.VciFieldTypeEnum.VTTime)
+#end
+#if($attr.vciAttrDataType == "vtnote")
+   @VciFieldType(VciFieldType.VciFieldTypeEnum.VTNote)
+#end
+#if($attr.vciAttrDataType == "vtfilepath")
+   @VciFieldType(VciFieldType.VciFieldTypeEnum.VTFilePath)
+#end
+#if($attr.vciAttrDataType == "vtclob")
+   @VciFieldType(VciFieldType.VciFieldTypeEnum.VTClob)
+#end
+    private $attr.attrDataType $attr.id;
+
+#if($attr.referFlag)
+	/**
+	* $attr.name鏄剧ず鏂囨湰
+	*/
+	@Transient(referColumn = "$attr.referDBField")
+	private String $attr.referBtmTypeShowField;
+#end
+
+#if($attr.enumFlag)
+	/**
+	* $attr.name鏄剧ず鏂囨湰
+	*/
+	@Transient(referColumn = "$attr.enumDBField")
+	private String $attr.enumShowField;
+#end
+
+#end
+
+#foreach ($attr in $uiAttributes)
+	/**
+	 * 鑾峰彇 $attr.name
+	 */
+#if($attr.id == "id" || $attr.id == "name" || $attr.id =="description")
+	@Override
+#end
+	public $attr.voJavaDataType $attr.voGetter (){
+		return $attr.id;
+	}
+
+	/**
+	* 璁剧疆 $attr.name
+	*/
+#if($attr.id == "id" || $attr.id == "name" || $attr.id =="description")
+	@Override
+#end
+	public void $attr.voSetter ($attr.voJavaDataType $attr.id){
+		this.$attr.id = $attr.id;
+	}
+#if($attr.referFlag)
+	/**
+	 * 鑾峰彇$attr.name鏄剧ず鏂囨湰
+	 */
+	public String $attr.referBtmTypeShowFieldGetter (){
+		return $attr.referBtmTypeShowField;
+	}
+
+	/**
+	* 璁剧疆$attr.name鏄剧ず鏂囨湰
+	*/
+	public void $attr.referBtmTypeShowFieldSetter (String $attr.referBtmTypeShowField){
+		this.$attr.referBtmTypeShowField = $attr.referBtmTypeShowField;
+	}
+#end
+#if($attr.enumFlag)
+	/**
+	 * 鑾峰彇$attr.name鏄剧ず鏂囨湰
+	 */
+	public String $attr.enumShowFieldGetter (){
+		return $attr.enumShowField;
+	}
+
+	/**
+	 * 璁剧疆 $attr.name鏄剧ず鏂囨湰
+	 */
+	public void $attr.enumShowFieldSetter (String $attr.enumShowField){
+		this.$attr.enumShowField = $attr.enumShowField;
+	}
+#end
+#end
+
+	@Override
+	public String toString() {
+		return "${className}VO{" +
+#foreach ($attr in $uiAttributes)
+		"$attr.id='" + $attr.id +"'," +
+#if($attr.referFlag)
+		"$attr.referBtmTypeShowField='" + $attr.referBtmTypeShowField +"'," +
+#end
+#if($attr.enumFlag)
+		"$attr.enumShowField='" + $attr.enumShowField +"'," +
+#end
+#end
+		"}" + super.toString();
+	}
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/resources/codeTemplate/DTO.java.vm b/Source/platformProject/vci-platform-web/src/main/resources/codeTemplate/DTO.java.vm
new file mode 100644
index 0000000..b1f4ef1
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/resources/codeTemplate/DTO.java.vm
@@ -0,0 +1,109 @@
+package ${dtoPackage};
+
+
+import java.util.Date;
+import java.lang.*;
+
+import com.vci.starter.web.pagemodel.BaseModelVO;
+
+/**
+ * ${comments}鏁版嵁浼犺緭瀵硅薄
+ * 
+ * @author ${author}
+ * @date ${datetime}
+ */
+public class ${className}DTO extends BaseModelVO {
+
+	/**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+	private static final long serialVersionUID = ${dtoSerialVersionUID};
+
+#foreach ($attr in $uiAttributes)
+	/**
+	 * $attr.name
+	 */
+	private $attr.voJavaDataType $attr.id;
+
+#if(${attr.referFlag} && !${attr.referNameExist})
+	/**
+	 * $attr.name鏄剧ず鏂囨湰
+	 */
+	private String $attr.referBtmTypeShowField;
+#end
+#if($attr.enumFlag)
+	/**
+	 * $attr.name鏄剧ず鏂囨湰
+	 */
+	private String $attr.enumShowField;
+#end
+#end
+
+#foreach ($attr in $uiAttributes)
+	/**
+	 * 鑾峰彇 $attr.name
+	 */
+#if($attr.id == "id" || $attr.id == "name" || $attr.id =="description")
+	@Override
+#end
+	public $attr.voJavaDataType $attr.voGetter (){
+		return $attr.id;
+	}
+
+	/**
+	 * 璁剧疆 $attr.name
+	 */
+#if($attr.id == "id" || $attr.id == "name" || $attr.id =="description")
+	@Override
+#end
+	public void $attr.voSetter ($attr.voJavaDataType $attr.id){
+		this.$attr.id = $attr.id;
+	}
+
+#if($attr.referFlag)
+	/**
+	 * 鑾峰彇$attr.name鏄剧ず鏂囨湰
+	 */
+	public String $attr.referBtmTypeShowFieldGetter (){
+		return $attr.referBtmTypeShowField;
+	}
+
+	/**
+	 * 璁剧疆$attr.name鏄剧ず鏂囨湰
+	 */
+	public void $attr.referBtmTypeShowFieldSetter (String $attr.referBtmTypeShowField){
+		this.$attr.referBtmTypeShowField = $attr.referBtmTypeShowField;
+	}
+#end
+#if($attr.enumFlag)
+	/**
+	 * 鑾峰彇$attr.name鏄剧ず鏂囨湰
+	 */
+	public String $attr.enumShowFieldGetter (){
+		return $attr.enumShowField;
+	}
+
+	/**
+	 * 璁剧疆$attr.name鏄剧ず鏂囨湰
+	 */
+	public void $attr.enumShowFieldSetter (String $attr.enumShowField){
+		this.$attr.enumShowField = $attr.enumShowField;
+	}
+#end
+#end
+
+	@Override
+	public String toString() {
+		return "${className}DTO{" +
+#foreach ($attr in $uiAttributes)
+		"$attr.id='" + $attr.id +"',"+
+#if($attr.referFlag)
+		"$attr.referBtmTypeShowField='" + $attr.referBtmTypeShowField +"'," +
+#end
+#if($attr.enumFlag)
+		"$attr.enumShowField='" + $attr.enumShowField + "',"  +
+#end
+#end
+		"}" + super.toString();
+	}
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/resources/codeTemplate/Mapper.impl.java.vm b/Source/platformProject/vci-platform-web/src/main/resources/codeTemplate/Mapper.impl.java.vm
new file mode 100644
index 0000000..d805ae2
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/resources/codeTemplate/Mapper.impl.java.vm
@@ -0,0 +1,294 @@
+package ${mapperImplPackage};
+
+import ${doPackage}.${doClassName};
+
+import com.vci.starter.web.wrapper.VciQueryWrapperForDO;
+import org.apache.commons.lang3.StringUtils;
+import com.vci.starter.web.util.*;
+import ${mapperPackage}.${className}DaoI;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.*;
+import com.vci.web.service.WebBoServiceI;
+import com.vci.web.service.OsLifeCycleServiceI;
+import com.vci.web.pageModel.BatchCBO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+import org.springframework.util.CollectionUtils;
+import plm.bs.bom.clientobject.ClientBusinessObject;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.ArrayList;
+
+import static com.vci.frameworkcore.constant.FrameWorkBusLangCodeConstant.DATA_OID_NOT_EXIST;
+
+
+/**
+ * ${comments}鏁版嵁鎿嶄綔灞傚疄鐜扮被
+ * 
+ * @author ${author}
+ * @date ${datetime}
+ */
+@Repository
+public class  ${className}DaoImpl implements ${className}DaoI{
+
+	/**
+	* 涓氬姟绫诲瀷鎿嶄綔鐨勬湇鍔�
+	*/
+	@Autowired
+	private WebBoServiceI boService;
+
+	/**
+	* 鐢熷懡鍛ㄦ湡鐨勬湇鍔�
+	*/
+	@Autowired
+	private OsLifeCycleServiceI lifeCycleService;
+
+	/**
+     * 浣跨敤涓婚敭鍒犻櫎
+     * @param oid 鏁版嵁涓婚敭
+     * @return 鎵ц缁撴灉
+     */
+	@Override
+	public BatchCBO deleteByPrimaryKey(String oid){
+		VciBaseUtil.alertNotNull(oid,"涓婚敭");
+        ${className}DO ${classNameFristLowwer}DO = selectByPrimaryKey(oid);
+		return boService.delete(${classNameFristLowwer}DO);
+	}
+
+	/**
+     * 娣诲姞鏁版嵁
+     * @param record ${comments}鏁版嵁瀵硅薄
+     * @return 鎵ц缁撴灉
+     */
+	@Override
+	public BatchCBO insert(${className}DO record){
+		VciBaseUtil.alertNotNull(record,"瑕佹坊鍔犵殑鏁版嵁");
+		return boService.addSave(record);
+	}
+
+	/**
+	* 鎵归噺娣诲姞鏁版嵁
+	* @param records ${comments}鏁版嵁瀵硅薄闆嗗悎
+	* @return 鎵ц缁撴灉鏁�
+	*/
+	@Override
+	public BatchCBO batchInsert(List<${className}DO> records){
+		VciBaseUtil.alertNotNull(records,"瑕佹坊鍔犵殑鏁版嵁");
+		BatchCBO batchCBO = boService.batchAddSave(records);
+		return batchCBO;
+	}
+
+	/**
+     * 鏍规嵁涓婚敭鏌ヨ
+     * @param oid 鏁版嵁涓婚敭
+     * @return 鏁版嵁瀵硅薄
+     */
+	@Override
+	public ${className}DO selectByPrimaryKey(String oid){
+		VciBaseUtil.alertNotNull(oid,"涓婚敭");
+		${className}DO record = boService.selectByOid(oid, ${className}DO.class);
+		if(record == null || StringUtils.isBlank(record.getOid())){
+			throw new VciBaseException(DATA_OID_NOT_EXIST);
+		}
+		return record;
+	}
+
+	/**
+     * 鏍规嵁涓婚敭鎵归噺鑾峰彇瀵硅薄
+     * @param oids 涓婚敭锛屽寘鍚崟寮曞彿,浣嗘槸涓嶈兘瓒呰繃1000
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+	@Override
+	public List<${className}DO> selectByPrimaryKeys(String oids){
+		VciBaseUtil.alertNotNull(oids,"涓婚敭闆嗗悎");
+		return boService.selectByOidCollection(VciBaseUtil.str2List(oids), ${className}DO.class);
+	}
+
+	/**
+     * 鏍规嵁涓婚敭鎵归噺鏌ヨ瀵硅薄
+     * @param oids 瀵硅薄涓婚敭,浣跨敤閫楀彿鍒嗛殧锛屼絾鏄笉鑳借秴杩�1000
+     * @return 涓氬姟瀵硅薄
+     */
+	@Override
+	public List<${className}DO> selectByPrimaryKeyCollection(Collection<String> oids){
+		VciBaseUtil.alertNotNull(oids,"涓婚敭闆嗗悎");
+		return boService.selectByOidCollection(oids, ${className}DO.class);
+	}
+
+	/**
+     * 鏌ヨ鎵�鏈夊垎绫�
+     * @return 鏌ヨ缁撴灉
+     */
+	@Override
+	public List<${className}DO> selectAll(){
+		return boService.queryObject(${className}DO.class,null);
+	}
+
+	/**
+     * 鏇存柊瀵硅薄
+     * @param record ${comments}鏁版嵁瀵硅薄
+     * @return 鎵ц缁撴灉
+     */
+	@Override
+	public BatchCBO updateByPrimaryKey(${className}DO record){
+		VciBaseUtil.alertNotNull(record,"瑕佷慨鏀圭殑瀵硅薄",record.getOid(),"涓婚敭");
+		return boService.editSave(record);
+    }
+	/**
+	* 鎵归噺鏇存柊
+	* @param records ${comments}鏁版嵁瀵硅薄闆嗗悎
+	* @return 鎵ц缁撴灉琛屾暟
+	*/
+	@Override
+	public BatchCBO batchUpdate(List<${className}DO> records){
+		VciBaseUtil.alertNotNull(records,"瑕佷慨鏀圭殑瀵硅薄");
+		BatchCBO batchCBO = boService.batchEditSave(records);
+		return batchCBO;
+	}
+
+	/**
+     * 鏍规嵁鏌ヨ鏉′欢鏌ヨ鏁版嵁
+     * @param conditionMap 鏌ヨ鏉′欢锛�
+     * @param pageHelper 鍖呮嫭鍒嗛〉锛屾帓搴�
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+	@Override
+	public List<${className}DO> selectByCondition(Map< String,String> conditionMap, PageHelper pageHelper){
+		return boService.queryObject(${className}DO.class,conditionMap,pageHelper);
+	}
+
+	/**
+     * 鏍规嵁鏌ヨ鏉′欢鏉ユ煡璇㈡�绘暟
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @return 鎬绘暟
+     */
+	@Override
+	public Long countByCondition(Map< String,String> conditionMap){
+		return VciBaseUtil.getLong(String.valueOf(boService.queryCount(${className}DO.class,conditionMap)));
+	}
+
+	/**
+	 * 鏍规嵁鏌ヨ灏佽鍣ㄦ潵鏌ヨ鏁版嵁
+	 * @param queryWrapper 鏌ヨ灏佽鍣�
+	 * @return 鏁版嵁瀵硅薄鍒楄〃
+	 */
+	@Override
+	public List<${className}DO> selectByWrapper(VciQueryWrapperForDO queryWrapper){
+		return boService.selectByQueryWrapper(queryWrapper,${className}DO.class);
+	}
+
+	/**
+     * 鏍规嵁鏌ヨ灏佽鍣ㄦ潵鏌ヨ鎬绘暟
+     * @param queryWrapper 鏌ヨ灏佽鍣�
+     * @return 鎬绘暟
+     */
+	@Override
+	public Long countByWrapper(VciQueryWrapperForDO queryWrapper){
+		return VciBaseUtil.getLong(String.valueOf(boService.countByQueryWrapper(queryWrapper,${className}DO.class)));
+	}
+
+	/**
+     * 鏍规嵁涓婚敭鑾峰彇鍚嶇О
+     * @param oid 涓婚敭
+     * @return 涓枃鍚嶇О
+     */
+	@Override
+	public String selectNameByOid(String oid){
+		return selectByPrimaryKey(oid).getName();
+	}
+
+#if(${hasParentField})
+	/**
+	* 鑾峰彇鎵�鏈夊眰绾т笅绾х殑涓婚敭
+	* @param oid 鏁版嵁涓婚敭
+	* @return 鏌ヨ缁撴灉
+	*/
+	@Override
+	public List<String> selectAllLevelChildOid(String oid){
+		String sql = "select oid from ${tableName} START WITH ${parentFieldName} = :oid CONNECT BY PRIOR OID= ${parentFieldName}";
+	    Map< String,String> conditionMap = new HashMap< String,String>();
+	    conditionMap.put("oid",oid);
+	    List<Map> dataList = boService.queryBySqlForMap(sql,conditionMap);
+		List<String> oidList = new ArrayList<String>();
+		if(!CollectionUtils.isEmpty(dataList)){
+			for(Map data:dataList){
+				oidList.add(VciBaseUtil.getStringValueFromObject(data.get("oid")));
+			}
+		}
+		return oidList;
+	}
+
+	/**
+	 * 鑾峰彇鎵�鏈変笅绾ф暟鎹�
+	 * @param oid 鏁版嵁涓婚敭
+	 * @return 鏌ヨ缁撴灉
+	 */
+	@Override
+	public List<${className}DO> selectAllLevelChild(String oid){
+		return boService.selectByOidCollection(selectAllLevelChildOid(oid),${className}DO.class);
+	}
+
+	/**
+	* 鏌ヨ鏌愪釜鑺傜偣鐨勬墍鏈夊眰绾т笅绾х殑涓暟
+	* @param oid 涓婚敭
+	* @return 鎬绘暟
+	*/
+	@Override
+	public long countAllLevelChildOid(String oid){
+		String sql = "select count(OID) as countsize from ${tableName} START WITH ${parentFieldName} = :oid CONNECT BY PRIOR OID = ${parentFieldName}";
+		Map< String,String> conditionMap = new HashMap< String,String>();
+		conditionMap.put("oid",oid);
+		List<Map> dataList = boService.queryBySqlForMap(sql,conditionMap);
+		return !CollectionUtils.isEmpty(dataList)?VciBaseUtil.getInt(VciBaseUtil.getStringValueFromObject(dataList.get(0).get("countsize"))):0;
+	}
+#end
+
+#if(${hasStatus})
+	/**
+	 * 鎵归噺淇敼鐢熷懡鍛ㄦ湡鐨勭姸鎬�
+	 * @param oids 涓婚敭闆嗗悎锛屼笉鑳藉ぇ浜�1000
+	 * @param lcStatus 鐢熷懡鍛ㄦ湡鐨勫��
+	 * @return 鎵ц鐨勭粨鏋�
+	 */
+	@Override
+	public long batchUpdateLcStatus(Collection<String> oids,  String lcStatus){
+		List<ClientBusinessObject> cbos = boService.selectCBOByOidCollection(oids, "${btmTypeId}");
+		if(CollectionUtils.isEmpty(cbos)){
+			return 0;
+		}
+		lifeCycleService.transCboStatus(cbos,lcStatus);
+		return cbos.size();
+	}
+	/**
+	 * 鏍规嵁涓婚敭鏇存柊鐘舵��
+	 * @param oid 涓婚敭
+	 * @param lcStatus 鐢熷懡鍛ㄦ湡鐘舵��
+	 * @return 鍙楀奖鍝嶇殑琛屾暟
+	 */
+	@Override
+	public int updateLcStatus( String oid, String lcStatus){
+		ClientBusinessObject cbo = boService.selectCBOByOid(oid, "${btmTypeId}");
+		if(cbo == null || StringUtils.isBlank(cbo.getOid())){
+			return 0;
+		}
+		lifeCycleService.transStatus(cbo.getBusinessObject(),lcStatus);
+		return 1;
+	}
+#end
+
+	/**
+     * 鎵归噺鍒犻櫎瀵硅薄
+     * @param oids 瀵硅薄鐨勪富閿泦鍚�
+     * @return 鍙楀奖鍝嶇殑琛屾暟
+     */
+	@Override
+	public BatchCBO batchDeleteByOids(Collection<String> oids){
+		List<${className}DO> dos = boService.selectByOidCollection(oids, ${className}DO.class);
+		BatchCBO batchCBO = boService.batchDelete(dos);
+		return batchCBO;
+	}
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/resources/codeTemplate/Mapper.java.vm b/Source/platformProject/vci-platform-web/src/main/resources/codeTemplate/Mapper.java.vm
new file mode 100644
index 0000000..9683970
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/resources/codeTemplate/Mapper.java.vm
@@ -0,0 +1,165 @@
+package ${mapperPackage};
+
+import ${doPackage}.${doClassName};
+
+import com.vci.starter.web.pagemodel.*;
+import com.vci.starter.web.wrapper.VciQueryWrapperForDO;
+import com.vci.web.pageModel.BatchCBO;
+
+import java.util.Collection;
+import java.util.*;
+
+/**
+ * ${comments}鏁版嵁鎿嶄綔灞�
+ * 
+ * @author ${author}
+ * @date ${datetime}
+ */
+public interface  ${className}DaoI {
+
+	/**
+     * 浣跨敤涓婚敭鍒犻櫎
+     * @param oid 鏁版嵁涓婚敭
+     * @return 鎵ц缁撴灉
+     */
+	BatchCBO deleteByPrimaryKey(String oid);
+
+	/**
+     * 娣诲姞鏁版嵁
+     * @param record ${comments}鏁版嵁瀵硅薄
+     * @return 鎵ц缁撴灉
+     */
+	BatchCBO insert(${className}DO record);
+
+	/**
+	* 鎵归噺娣诲姞鏁版嵁
+	* @param records ${comments}鏁版嵁瀵硅薄闆嗗悎
+	* @return 鎵ц缁撴灉鏁�
+	*/
+	BatchCBO batchInsert(List<${className}DO> records);
+
+	/**
+     * 鏍规嵁涓婚敭鏌ヨ
+     * @param oid 鏁版嵁涓婚敭
+     * @return 鏁版嵁瀵硅薄
+     */
+	${className}DO selectByPrimaryKey(String oid);
+
+	/**
+     * 鏍规嵁涓婚敭鎵归噺鑾峰彇瀵硅薄
+     * @param oids 涓婚敭锛屽寘鍚崟寮曞彿,浣嗘槸涓嶈兘瓒呰繃1000
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+	List<${className}DO> selectByPrimaryKeys(String oids);
+
+	/**
+     * 鏍规嵁涓婚敭鎵归噺鏌ヨ瀵硅薄
+     * @param oids 瀵硅薄涓婚敭,浣跨敤閫楀彿鍒嗛殧锛屼絾鏄笉鑳借秴杩�1000
+     * @return 涓氬姟瀵硅薄
+     */
+	List<${className}DO> selectByPrimaryKeyCollection(Collection<String> oids);
+
+	/**
+     * 鏌ヨ鎵�鏈夊垎绫�
+     * @return 鏌ヨ缁撴灉
+     */
+	List<${className}DO> selectAll();
+
+	/**
+     * 鏇存柊瀵硅薄
+     * @param record ${comments}鏁版嵁瀵硅薄
+     * @return 鎵ц缁撴灉
+     */
+	BatchCBO updateByPrimaryKey(${className}DO record);
+
+	/**
+	* 鎵归噺鏇存柊
+	* @param records ${comments}鏁版嵁瀵硅薄闆嗗悎
+	* @return 鎵ц缁撴灉琛屾暟
+	*/
+	BatchCBO batchUpdate(List<${className}DO> records);
+
+	/**
+     * 鏍规嵁鏌ヨ鏉′欢鏌ヨ鏁版嵁
+     * @param conditionMap 鏌ヨ鏉′欢锛�
+     * @param pageHelper 鍖呮嫭鍒嗛〉锛屾帓搴�
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+	List<${className}DO> selectByCondition(Map<String,String> conditionMap, PageHelper pageHelper);
+
+	/**
+     * 鏍规嵁鏌ヨ鏉′欢鏉ユ煡璇㈡�绘暟
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @return 鎬绘暟
+     */
+	Long countByCondition(Map<String,String> conditionMap);
+
+	/**
+     * 浣跨敤鏌ヨ灏佽鍣ㄦ潵鏌ヨ
+     * @param queryWrapper 鏌ヨ灏佽鍣�
+     * @return 鏁版嵁瀵硅薄鍒楄〃
+     */
+	List<${className}DO> selectByWrapper(VciQueryWrapperForDO queryWrapper);
+
+	/**
+     * 鏍规嵁鏌ヨ灏佽鍣ㄦ潵鏌ヨ鎬绘暟
+     * @param queryWrapper 鏌ヨ灏佽鍣�
+     * @return 鎬绘暟
+     */
+	Long countByWrapper(VciQueryWrapperForDO queryWrapper);
+
+	/**
+     * 鏍规嵁涓婚敭鑾峰彇鍚嶇О
+     * @param oid 涓婚敭
+     * @return 涓枃鍚嶇О
+     */
+	String selectNameByOid(String oid);
+
+#if(${hasParentField})
+	/**
+	* 鑾峰彇鎵�鏈夊眰绾т笅绾х殑涓婚敭
+	* @param oid 鏁版嵁涓婚敭
+	* @return 鏌ヨ缁撴灉
+	*/
+	List<String> selectAllLevelChildOid(String oid);
+
+	/**
+	 * 鑾峰彇鎵�鏈変笅绾ф暟鎹�
+	 * @param oid 鏁版嵁涓婚敭
+	 * @return 鏌ヨ缁撴灉
+	 */
+	List<${className}DO> selectAllLevelChild(String oid);
+
+	/**
+	* 鏌ヨ鏌愪釜鑺傜偣鐨勬墍鏈夊眰绾т笅绾х殑涓暟
+	* @param oid 涓婚敭
+	* @return 鎬绘暟
+	*/
+	long countAllLevelChildOid(String oid);
+#end
+
+#if(${hasStatus})
+	/**
+	 * 鎵归噺淇敼鐢熷懡鍛ㄦ湡鐨勭姸鎬�
+	 * @param oids 涓婚敭闆嗗悎锛屼笉鑳藉ぇ浜�1000
+	 * @param lcStatus 鐢熷懡鍛ㄦ湡鐨勫��
+	 * @return 鎵ц鐨勭粨鏋�
+	 */
+	long batchUpdateLcStatus(Collection<String> oids,  String lcStatus);
+	/**
+	 * 鏍规嵁涓婚敭鏇存柊鐘舵��
+	 * @param oid 涓婚敭
+	 * @param lcStatus 鐢熷懡鍛ㄦ湡鐘舵��
+	 * @return 鍙楀奖鍝嶇殑琛屾暟
+	 */
+	int updateLcStatus( String oid, String lcStatus);
+#end
+
+	/**
+     * 鎵归噺鍒犻櫎瀵硅薄
+     * @param oids 瀵硅薄鐨勪富閿泦鍚�
+     * @return 鍙楀奖鍝嶇殑琛屾暟
+     */
+	BatchCBO batchDeleteByOids(Collection<String> oids);
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/resources/codeTemplate/Mapper.xml.vm b/Source/platformProject/vci-platform-web/src/main/resources/codeTemplate/Mapper.xml.vm
new file mode 100644
index 0000000..949975a
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/resources/codeTemplate/Mapper.xml.vm
@@ -0,0 +1,160 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="${mapperPackage}.${className}Mapper">
+    #set($jin="#{")
+    #set($dao ="${")
+    #set($newline="
+")
+    <resultMap id="BaseResultMap" type="${doPackage}.${className}DO">
+        <id column="OID" jdbcType="VARCHAR" property="oid" />
+#foreach($attr in $attributes)
+#if($attr.id != "oid")
+        <result column="$attr.idUpper" property="$attr.id"  jdbcType="$attr.jdbcType"/>
+#end
+#end
+    </resultMap>
+    <resultMap id="BaseResultMapHasRefer" type="${doPackage}.${className}DO" extends="BaseResultMap">
+#foreach($attr in $referAttributes)
+        <result column="$attr.idUpper" property="$attr.id"  jdbcType="$attr.jdbcType"/>
+#end
+    </resultMap>
+    <sql id="base_query_column">
+#foreach($attr in $attributes)
+        $attr.idUpper #if($foreach.hasNext),#end #if($velocityCount%5==0) $newline #end
+#end
+    </sql>
+    <sql id="tableName">
+        ${tableName}
+    </sql>
+    <delete id="deleteByPrimaryKey" parameterType="java.lang.String" >
+        delete from <include refid="tableName"/>
+        where OID = $jin oid,jdbcType=VARCHAR}
+    </delete>
+    <insert id="insert" parameterType="${doPackage}.${className}DO" >
+        insert into <include refid="tableName"/> (
+#foreach($attr in $attributes) $attr.idUpper #if($foreach.hasNext),#end #if($velocityCount%5==0) $newline #end
+#end    )
+        values (
+#foreach($attr in $attributes)
+        $jin $attr.id,jdbcType=$attr.jdbcType}#if($foreach.hasNext),#end #if($velocityCount%5==0) $newline #end
+#end )
+    </insert>
+    <insert id="batchInsert" useGeneratedKeys="false" >
+        insert into <include refid="tableName"/> (
+        #foreach($attr in $attributes) $attr.idUpper #if($foreach.hasNext),#end #if($velocityCount%5==0) $newline #end
+        #end    )
+        <foreach collection="records" item="item" separator="union all" >
+        (select
+        #foreach($attr in $attributes)
+            $jin item.$attr.id,jdbcType=$attr.jdbcType}#if($foreach.hasNext),#end #if($velocityCount%5==0) $newline #end
+        #end
+        FROM DUAL)
+        </foreach>
+    </insert>
+    <update id="updateByPrimaryKey" parameterType="${doPackage}.${className}DO" >
+    update  <include refid="tableName"/> set
+#foreach($attr in $attributes)
+#if($attr.id !="oid")
+    $attr.idUpper = $jin $attr.id,jdbcType=$attr.jdbcType}#if($foreach.hasNext),#end #if($velocityCount%5==0) $newline #end
+#end
+#end
+    where OID = $jin oid,jdbcType=VARCHAR}
+    </update>
+    <update id="batchUpdate" parameterType="java.util.Collection">
+        <foreach collection="records" item="item" index="index" open="begin" close=";end;" separator=";">
+        update  <include refid="tableName"/> set
+        #foreach($attr in $attributes)
+            #if($attr.id !="oid")
+                $attr.idUpper = $jin item.$attr.id,jdbcType=$attr.jdbcType}#if($foreach.hasNext),#end #if($velocityCount%5==0) $newline #end
+            #end
+        #end
+        where OID = $jin item.oid,jdbcType=VARCHAR}
+        </foreach>
+    </update>
+    <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.String" >
+        select <include refid="base_query_column"/>
+        from <include refid="tableName"/>
+        where OID = $jin oid,jdbcType=VARCHAR}
+    </select>
+    <select id="selectByPrimaryKeys" resultMap="BaseResultMap">
+        select <include refid="base_query_column" />
+        from <include refid="tableName" />
+        where OID in ( $dao oids,jdbcType=VARCHAR})
+    </select>
+    <select id="selectByPrimaryKeyCollection" resultMap="BaseResultMap">
+        select <include refid="base_query_column" />
+        from <include refid="tableName" />
+        <where>
+            <foreach collection="oids" item="item" index="arrayindex" open=" OID in ( " close=")" >
+                $jin item,jdbcType=VARCHAR}
+                <if test="(arrayindex != oids.size() -1)">
+                    ,
+                </if>
+            </foreach>
+        </where>
+    </select>
+    <select id="selectAll" resultMap="BaseResultMap" >
+        select <include refid="base_query_column"/>
+        from <include refid="tableName"/>
+    </select>
+    <select id="selectByWrapper" resultMap="BaseResultMap">
+        $dao wrapper.selectFieldSql} from <include refid="tableName"/> $dao wrapper.tableNick} $dao wrapper.linkTableSql}
+        <where>
+            $dao wrapper.whereSql}
+        </where>
+    </select>
+    <select id="countByWrapper" resultType="java.lang.Long">
+        select count(*) from ( $dao wrapper.selectFieldSql} from <include refid="tableName"/> $dao wrapper.tableNick} $dao wrapper.linkTableSql}
+        <where>
+            $dao wrapper.whereSql}
+        </where> )
+    </select>
+    <select id="selectNameByOid" resultType="java.lang.String">
+        select NAME from <include refid="tableName" />
+        where OID = $jin oid,jdbcType=VARCHAR}
+    </select>
+    <delete id="batchDeleteByOids" >
+        delete from <include refid="tableName" />
+        <where>
+            <foreach collection="oids" item="item" index="arrayindex" open=" oid in ( " close=")" >
+                $jin item,jdbcType=VARCHAR}
+                <if test="(arrayindex != oids.size() -1)">
+                    ,
+                </if>
+            </foreach>
+        </where>
+    </delete>
+#if(${hasEnable})
+    <update id="batchUpdateLcStatus" >
+        update <include refid="tableName"/>
+        set lcstatus = $jin lcStatus,jdbcType=VARCHAR}, ts=sysdate
+        where
+        <foreach collection="oids" item="item" index="arrayindex" open=" oid in ( " close=")" >
+            $jin item,jdbcType=VARCHAR}
+            <if test="(arrayindex != oids.size() -1)">
+                ,
+            </if>
+        </foreach>
+    </update>
+    <update id="updateLcStatus">
+        update <include refid="tableName"/>
+        set lcstatus = $jin lcStatus,jdbcType=VARCHAR}, ts=sysdate
+        where oid =$jin oid,jdbcType=VARCHAR}
+    </update>
+#end
+#if(${hasParentField})
+    <select id="selectAllLevelChild" parameterType="java.lang.String" resultMap="BaseResultMap">
+        select <include refid="base_query_column"/> FROM <include refid="tableName"/>
+        START WITH ${parentFieldName} = $jin oid,jdbcType=VARCHAR} CONNECT BY PRIOR OID=${parentFieldName}
+    </select>
+    <select id="selectAllLevelChildOid" parameterType="java.lang.String" resultType="java.lang.String">
+        select OID FROM <include refid="tableName"/>
+        START WITH ${parentFieldName} = $jin oid,jdbcType=VARCHAR} CONNECT BY PRIOR OID=${parentFieldName}
+    </select>
+    <select id="countAllLevelChildOid" resultType="java.lang.Long">
+        select count(OID) FROM <include refid="tableName"/>
+        START WITH ${parentFieldName} = $jin oid,jdbcType=VARCHAR} CONNECT BY PRIOR OID=${parentFieldName}
+    </select>
+#end
+</mapper>
\ No newline at end of file
diff --git a/Source/platformProject/vci-platform-web/src/main/resources/codeTemplate/PO.java.vm b/Source/platformProject/vci-platform-web/src/main/resources/codeTemplate/PO.java.vm
new file mode 100644
index 0000000..dae2484
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/resources/codeTemplate/PO.java.vm
@@ -0,0 +1,112 @@
+package ${poPackage};
+
+import java.util.Date;
+import java.lang.*;
+import com.vci.starter.poi.annotation.*;
+
+/**
+ * ${comments}瀵煎叆瀵煎嚭瀵硅薄
+ * 
+ * @author ${author}
+ * @date ${datetime}
+ */
+public class ${className}PO  {
+
+	/**
+    * 鎵�鍦ㄦ暟鎹
+    */
+	@ExcelColumn(rowIndexColumn = true,value = "")
+	private String rowIndex;
+
+#foreach ($attr in $uiAttributes)
+	/**
+	 * $attr.name
+	 */
+	@ExcelColumn(value="$attr.name",nullable = $attr.nullable)
+#if($attr.referFlag && !$attr.referNameExist)
+	private String $attr.referBtmTypeShowField;
+#elseif($attr.enumFlag)
+	private String $attr.enumShowField;
+#else
+	private $attr.attrDataType $attr.id;
+#end
+ #end
+
+#foreach ($attr in $uiAttributes)
+#if($attr.referFlag)
+	/**
+	 * 鑾峰彇$attr.name鏄剧ず鏂囨湰
+	 */
+	public String $attr.referBtmTypeShowFieldGetter (){
+		return $attr.referBtmTypeShowField;
+	}
+
+	/**
+	 * 璁剧疆$attr.name鏄剧ず鏂囨湰
+	 */
+	public void $attr.referBtmTypeShowFieldSetter (String $attr.referBtmTypeShowField){
+		this.$attr.referBtmTypeShowField = $attr.referBtmTypeShowField;
+	}
+#elseif($attr.enumFlag)
+	/**
+	 * 鑾峰彇$attr.name鏄剧ず鏂囨湰
+	 */
+	public String $attr.enumShowFieldGetter (){
+		return $attr.enumShowField;
+	}
+
+	/**
+	 * 璁剧疆$attr.name鏄剧ず鏂囨湰
+	 */
+	public void $attr.enumShowFieldSetter (String $attr.enumShowField){
+		this.$attr.enumShowField = $attr.enumShowField;
+	}
+#else
+	/**
+	 * 鑾峰彇 $attr.name
+	 */
+	public $attr.attrDataType $attr.getter (){
+		return $attr.id;
+	}
+
+	/**
+	 * 璁剧疆 $attr.name
+	 */
+	public void $attr.setter ($attr.attrDataType $attr.id){
+		this.$attr.id = $attr.id;
+	}
+#end
+#end
+
+	/**
+	* 鑾峰彇琛屽彿
+    * @return 琛屽彿
+    */
+	public String getRowIndex() {
+		return rowIndex;
+	}
+
+	/**
+	* 璁剧疆琛屽彿
+	* @param rowIndex 琛屽彿
+	*/
+	public void setRowIndex(String rowIndex) {
+		this.rowIndex = rowIndex;
+	}
+
+	@Override
+	public String toString() {
+		return "${className}PO{" +
+				"rowIndex='" + rowIndex + "'," +
+#foreach ($attr in $uiAttributes)
+#if($attr.referFlag)
+		"$attr.referBtmTypeShowField='" + $attr.referBtmTypeShowField +"',"+
+#elseif($attr.enumFlag)
+		"$attr.enumShowField='" + $attr.enumShowField +"'," +
+#else
+		"$attr.id='" + $attr.id + "',"+
+#end
+#end
+		"}" ;
+	}
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/resources/codeTemplate/Service.impl.java.vm b/Source/platformProject/vci-platform-web/src/main/resources/codeTemplate/Service.impl.java.vm
new file mode 100644
index 0000000..063f446
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/resources/codeTemplate/Service.impl.java.vm
@@ -0,0 +1,485 @@
+package ${servicePackage}.impl;
+
+import ${voPackage}.${className}VO;
+import ${dtoPackage}.${className}DTO;
+import ${doPackage}.${doClassName};
+import ${mapperPackage}.${className}DaoI;
+import ${servicePackage}.${className}ServiceI;
+#if(${lcStatusFullClassName} !="")
+import ${lcStatusFullClassName};
+#end
+import com.vci.frameworkcore.constant.FrameWorkDefaultValueConstant;
+import com.vci.starter.revision.service.RevisionModelUtil;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.*;
+import com.vci.starter.web.util.*;
+import com.vci.starter.web.wrapper.*;
+import com.vci.starter.revision.bo.TreeWrapperOptions;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.beans.factory.annotation.Autowired;
+import javax.annotation.Resource;
+import org.springframework.util.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import java.lang.reflect.Field;
+import java.util.*;
+import com.vci.web.service.WebBoServiceI;
+import com.vci.frameworkcore.lcstatuspck.*;
+import com.vci.web.pageModel.BatchCBO;
+import static com.vci.frameworkcore.constant.FrameWorkLangCodeConstant.*;
+import static com.vci.frameworkcore.constant.FrameWorkDefaultValueConstant.*;
+/**
+ * ${comments}鏈嶅姟
+ * @author ${author}
+ * @date ${datetime}
+ */
+@Service
+public class ${className}ServiceImpl implements ${className}ServiceI{
+
+    /**
+    * 鏃ュ織
+    */
+    private Logger logger = LoggerFactory.getLogger(getClass());
+
+    /**
+    * 鏁版嵁鎿嶄綔灞�
+    */
+    @Resource
+    private ${className}DaoI ${classNameFristLowwer}Mapper;
+
+    /**
+    * 涓氬姟绫诲瀷鎿嶄綔鐨勬湇鍔�
+    */
+    @Autowired
+    private WebBoServiceI boService;
+
+    /**
+    * 瀵硅薄鐨勬搷浣�
+    */
+    @Autowired
+    private RevisionModelUtil revisionModelUtil;
+
+
+#if(!${hasParentField})
+    /**
+     * 鏌ヨ鎵�鏈夌殑${comments}
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉鍜屾帓搴�
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 鏌ヨ鏉′欢鍜屽垎椤靛嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public DataGrid<${className}VO> grid${className}(Map<String, String> conditionMap, PageHelper pageHelper) throws VciBaseException{
+        if (pageHelper == null) {
+            pageHelper = new PageHelper(-1);
+        }
+        pageHelper.addDefaultDesc("createTime");
+        List<${className}DO> doList = ${classNameFristLowwer}Mapper.selectByCondition(conditionMap,pageHelper);
+        DataGrid<${className}VO> dataGrid=new DataGrid<${className}VO>();
+        if (!CollectionUtils.isEmpty(doList)) {
+            dataGrid.setData(${classNameFristLowwer}DO2VOs(doList));
+            dataGrid.setTotal(VciBaseUtil.getInt(String.valueOf(${classNameFristLowwer}Mapper.countByCondition(conditionMap))));
+        }
+        return dataGrid;
+    }
+#else
+    /**
+    * 涓婄骇鑺傜偣鐨勫睘鎬у悕绉�
+    */
+    private static  final String PARENT_FIELD_NAME = "${parentFieldName}";
+    /**
+     * 鏌ヨ${comments} 鏍�
+     * @param treeQueryObject 鏍戞煡璇㈠璞�
+     * @return ${comments} 鏄剧ず鏍�
+     * @throws VciBaseException 鏌ヨ鏉′欢涓嶇鍚堣姹傜殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public List<Tree> tree${className}(TreeQueryObject treeQueryObject) throws VciBaseException{
+        List<${className}DO> doList =select${className}DOByTree(treeQueryObject);
+        List<${className}VO> voList = ${classNameFristLowwer}DO2VOs(doList);
+        TreeWrapperOptions treeWrapperOptions = new TreeWrapperOptions(PARENT_FIELD_NAME);
+        treeWrapperOptions.copyFromTreeQuery(treeQueryObject);
+        return revisionModelUtil.doList2Trees(voList,treeWrapperOptions,(${className}VO s) ->{
+            //鍙互鍦ㄨ繖閲屽鐞嗘爲鑺傜偣鐨勬樉绀�
+            return s.getId() + " " + s.getName() + (FrameworkDataLCStatus.DISABLED.getValue().equalsIgnoreCase(s
+                    .getLcStatus()) ? (" 銆愬仠鐢ㄣ�� ") : "");
+        });
+    }
+    /**
+      * 鏍规嵁鏍戝舰鏌ヨ瀵硅薄鏉ユ煡璇㈡暟鎹璞�
+      *
+      * @param treeQueryObject 鏍戝舰鏌ヨ瀵硅薄
+      * @return 鏌ヨ缁撴灉,鏁版嵁瀵硅薄
+      */
+    @Override
+    public List<${className}DO> select${className}DOByTree(TreeQueryObject treeQueryObject) {
+        VciQueryWrapperForDO queryWrapperForDO = new VciQueryWrapperForDO(null,${className}DO.class);
+        VciParentQueryOption parentQueryOption = new VciParentQueryOption();
+        parentQueryOption.setParentFieldName(PARENT_FIELD_NAME);
+        queryWrapperForDO.parentQueryChild(treeQueryObject,parentQueryOption);
+        return ${classNameFristLowwer}Mapper.selectByWrapper(queryWrapperForDO);
+    }
+#end
+
+    /**
+     * 鎵归噺鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+     * @param ${classNameFristLowwer}DOs 鏁版嵁瀵硅薄鍒楄〃
+     * @return 鏄剧ず瀵硅薄
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呬笉瀛樺湪鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public List<${className}VO> ${classNameFristLowwer}DO2VOs(Collection<${className}DO>  ${classNameFristLowwer}DOs) throws VciBaseException{
+        List<${className}VO> voList = new ArrayList<${className}VO>();
+        if(!CollectionUtils.isEmpty(${classNameFristLowwer}DOs)){
+           for(${className}DO s: ${classNameFristLowwer}DOs){
+                ${className}VO vo =  ${classNameFristLowwer}DO2VO(s);
+                if(vo != null){
+                    voList.add(vo);
+                }
+            }
+        }
+        return voList;
+    }
+
+    /**
+     * 鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+     * @param  ${classNameFristLowwer}DO 鏁版嵁瀵硅薄
+     * @return 鏄剧ず瀵硅薄
+     * @throws VciBaseException 鎷疯礉灞炴�у嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public  ${className}VO ${classNameFristLowwer}DO2VO(${className}DO ${classNameFristLowwer}DO) throws VciBaseException{
+              ${className}VO vo = new ${className}VO();
+        if(${classNameFristLowwer}DO != null){
+            BeanUtilForVCI.copyPropertiesIgnoreCase(${classNameFristLowwer}DO,vo);
+            //濡傛灉鏈塴cstatus鐨勭被鐨勮瘽
+            #if(${hasStatus})
+             vo.setLcStatusText(${lcStatusFullClassName}.getTextByValue(vo.getLcStatus()));
+             #end
+
+        }
+        return vo;
+    }
+
+    /**
+     * 澧炲姞${comments}
+     * @param ${classNameFristLowwer}DTO ${comments}鏁版嵁浼犺緭瀵硅薄
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屽敮涓�椤癸紝蹇呰緭椤逛笉閫氳繃鏃朵細鎶涘嚭寮傚父
+     */
+    @Override
+    public ${className}VO addSave(${className}DTO ${classNameFristLowwer}DTO) throws VciBaseException{
+        VciBaseUtil.alertNotNull(${classNameFristLowwer}DTO,"闇�瑕佹坊鍔犵殑鏁版嵁瀵硅薄");
+        //灏咲TO杞崲涓篋O
+        ${className}DO ${classNameFristLowwer}DO = new ${className}DO();
+        BeanUtilForVCI.copyPropertiesIgnoreCase(${classNameFristLowwer}DTO,${classNameFristLowwer}DO);
+        ${classNameFristLowwer}Mapper.insert(${classNameFristLowwer}DO);
+        return ${classNameFristLowwer}DO2VO(${classNameFristLowwer}DO);
+    }
+
+    /**
+     * 淇敼${comments}
+     * @param ${classNameFristLowwer}DTO ${comments}鏁版嵁浼犺緭瀵硅薄
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屽敮涓�椤癸紝蹇呰緭椤逛笉閫氳繃鏃朵細鎶涘嚭寮傚父
+     */
+     @Override
+     public ${className}VO editSave(${className}DTO ${classNameFristLowwer}DTO) throws VciBaseException{
+         VciBaseUtil.alertNotNull(${classNameFristLowwer}DTO,"鏁版嵁瀵硅薄",${classNameFristLowwer}DTO.getOid(),"${comments}涓婚敭");
+         //灏咲TO杞崲涓篋O
+         ${className}DO ${classNameFristLowwer}DO = selectByOid(${classNameFristLowwer}DTO.getOid());
+         revisionModelUtil.copyFromDTOIgnore(${classNameFristLowwer}DTO,${classNameFristLowwer}DO);
+         ${classNameFristLowwer}Mapper.updateByPrimaryKey(${classNameFristLowwer}DO);
+         return ${classNameFristLowwer}DO2VO(${classNameFristLowwer}DO);
+     }
+
+#if(${hasParentField})
+/**
+ * 妫�鏌� ${comments}鏄惁鍒犻櫎
+ * @param ${classNameFristLowwer}DTO ${comments}鏁版嵁浼犺緭瀵硅薄锛屽繀椤昏鏈塷id鍜宼s灞炴��
+ * @return 鎵ц缁撴灉 success涓簍rue涓哄彲浠ュ垹闄わ紝false琛ㄧず鏈夋暟鎹紩鐢紝obj涓簍rue琛ㄧず鏈変笅绾�
+ * @throws VciBaseException 鍙傛暟涓虹┖锛岃寮曠敤鏃舵姏鍑哄紓甯�
+ */
+@Override
+public BaseResult checkIsCanDelete(${className}DTO ${classNameFristLowwer}DTO) throws VciBaseException{
+    VciBaseUtil.alertNotNull(${classNameFristLowwer}DTO,"鏁版嵁浼犺緭瀵硅薄",${classNameFristLowwer}DTO.getOid(),"涓婚敭");
+    ${className}DO ${classNameFristLowwer}DO = selectByOid(${classNameFristLowwer}DTO.getOid());
+    return checkIsCanDeleteForDO(${classNameFristLowwer}DTO,${classNameFristLowwer}DO);
+}
+#end
+
+    /**
+     * 鏍¢獙鏄惁鍙互鍒犻櫎锛屽鏋滃瓨鍦ㄤ笅绾э紝骞朵笖涓嬬骇鏈夋暟鎹紩鐢ㄥ垯涓嶈兘鍒犻櫎
+     * @param ${classNameFristLowwer}DTO 鏁版嵁浼犺緭瀵硅薄
+     * @param ${classNameFristLowwer}DO 鏁版嵁搴撲腑鐨勬暟鎹璞�
+     * @return success涓簍rue涓哄彲浠ュ垹闄わ紝false琛ㄧず鏈夋暟鎹紩鐢紝obj涓簍rue琛ㄧず鏈変笅绾�
+     */
+    private BaseResult checkIsCanDeleteForDO(${className}DTO ${classNameFristLowwer}DTO, ${className}DO ${classNameFristLowwer}DO) {
+            ${className}DO tsDO = new ${className}DO();
+            BeanUtilForVCI.copyPropertiesIgnoreCase(${classNameFristLowwer}DTO,tsDO);
+        boService.checkTs(tsDO);
+#if(${hasParentField})
+        //鏍¢獙涓嬬骇鏄惁鏈夊紩鐢�
+        if(checkChildIsLinked(${classNameFristLowwer}DO.getOid())){
+            return BaseResult.fail(DATA_CASCADE_LINKED_NOT_DELETE,new String[]{""});
+        }
+        return BaseResult.success(checkHasChild(${classNameFristLowwer}DO.getOid()));
+#end
+#if(!${hasParentField})
+        if(!checkIsLinked(${classNameFristLowwer}DO.getOid())) {
+            return BaseResult.success();
+        }else{
+            return BaseResult.fail(DATA_LINKED_NOT_DELETE,new String[]{""});
+        }
+#end
+    }
+#if(${hasParentField})
+    /**
+      * 妫�鏌ユ槸鍚︽湁涓嬬骇鏄惁鍏宠仈浜嗘暟鎹�
+      *
+      * @param oid 涓婚敭
+      * @return true 琛ㄧず鏈夊紩鐢紝false琛ㄧず娌℃湁寮曠敤
+      * @throws VciBaseException 鍙傛暟涓虹┖鍜屾湁寮曠敤鐨勬椂鍊欎細鎶涘嚭寮傚父
+      */
+    @Override
+    public boolean checkChildIsLinked(String oid) throws VciBaseException {
+        VciBaseUtil.alertNotNull(oid,"涓婚敭");
+        List<String> childOids = ${classNameFristLowwer}Mapper.selectAllLevelChildOid(oid.trim());
+        if(!CollectionUtils.isEmpty(childOids)){
+             for(String childOid: childOids){
+                 if(!checkIsLinked(childOid)){
+                     return false;
+                 }
+             }
+            return true;
+        }
+        return false;
+    }
+
+    /**
+    * 鏍¢獙鏄惁鏈変笅绾ц妭鐐癸紝涓嶆牎楠屾槸鍚﹀叧鑱斾簡鏁版嵁
+    *
+    * @param oid 涓婚敭
+    * @return true琛ㄧず鏈変笅绾э紝false琛ㄧず娌℃湁涓嬬骇
+    * @throws VciBaseException 鍙傛暟閿欒锛屾垨鑰呮暟鎹笉瀛樺湪鐨勬椂鍊欎細鎶涘嚭寮傚父
+    */
+    @Override
+    public boolean checkHasChild(String oid) throws VciBaseException {
+        VciBaseUtil.alertNotNull(oid,"涓婚敭");
+        return ${classNameFristLowwer}Mapper.countAllLevelChildOid(oid.trim()) > 0;
+    }
+#end
+
+    /**
+    * 鏍¢獙鏄惁琚紩鐢�
+    * @param oid 涓婚敭
+    * @throws VciBaseException 琚紩鐢ㄧ殑鏃跺�欎細鎶涘嚭寮傚父
+    */
+    private boolean checkIsLinked(String oid) throws VciBaseException{
+        //TODO 娣诲姞闇�瑕佹牎楠屽紩鐢ㄧ殑鍦版柟
+        return false;
+    }
+
+    /**
+     * 鍒犻櫎${comments}
+     * @param ${classNameFristLowwer}DTO ${comments}鏁版嵁浼犺緭瀵硅薄锛宱id鍜宼s闇�瑕佷紶杈�
+     * @return 鍒犻櫎缁撴灉鍙嶉锛氾細success锛氭垚鍔燂紝fail锛氬け璐�
+     * @throws VciBaseException 鍙傛暟涓虹┖锛岃寮曠敤鏃舵姏鍑哄紓甯�
+     */
+    @Override
+    public BaseResult delete${className}(${className}DTO ${classNameFristLowwer}DTO) throws VciBaseException{
+        VciBaseUtil.alertNotNull(${classNameFristLowwer}DTO,"${comments}鏁版嵁瀵硅薄",${classNameFristLowwer}DTO.getOid(),"${comments}鐨勪富閿�");
+        ${className}DO ${classNameFristLowwer}DO = selectByOid(${classNameFristLowwer}DTO.getOid());
+        BaseResult baseResult = checkIsCanDeleteForDO(${classNameFristLowwer}DTO,${classNameFristLowwer}DO);
+        if(baseResult.isSuccess()) {
+            #if(${hasParentField})
+            //鎵句笅绾х殑锛岃繖涓槸鍙互鍒犻櫎鐨勬椂鍊�
+            List<String> childrenOids = ${classNameFristLowwer}Mapper.selectAllLevelChildOid(${classNameFristLowwer}DO.getOid().trim());
+            if (!CollectionUtils.isEmpty(childrenOids)) {
+                Collection<Collection<String>> childrenCollections = VciBaseUtil.switchCollectionForOracleIn(childrenOids);
+                for(Collection<String> s : childrenCollections){
+                    ${classNameFristLowwer}Mapper.batchDeleteByOids(s);
+                }
+            }
+            #end
+        }else{
+            return baseResult;
+        }
+        //鎵ц鍒犻櫎鎿嶄綔
+        BatchCBO batchCBO = ${classNameFristLowwer}Mapper.deleteByPrimaryKey(${classNameFristLowwer}DO.getOid());
+        return (batchCBO!=null && batchCBO.getDeleteCbos() !=null &&batchCBO.getDeleteCbos().size() > 0)?BaseResult.successMsg(DELETE_SUCCESS):BaseResult.fail(DELETE_FAIL);
+    }
+
+    /**
+    * 涓婚敭鑾峰彇${comments}
+    * @param oid 涓婚敭
+    * @return ${comments}鏄剧ず瀵硅薄
+    * @throws VciBaseException 鍙傛暟涓虹┖锛屾暟鎹笉瀛樺湪鏃朵細鎶涘嚭寮傚父
+    */
+    @Override
+    public  ${className}VO getObjectByOid(String oid) throws VciBaseException{
+        return ${classNameFristLowwer}DO2VO(selectByOid(oid));
+    }
+
+    /**
+    * 涓婚敭鏌ヨ鏁版嵁瀵硅薄
+    * @param oid 涓婚敭
+    * @return  鏁版嵁瀵硅薄
+    * @throws VciBaseException 鍙傛暟涓虹┖锛屽苟涓旀暟鎹笉瀛樺湪鐨勬椂鍊欎細鎶涘嚭寮傚父
+    */
+    private ${className}DO selectByOid(String oid) throws VciBaseException{
+        VciBaseUtil.alertNotNull(oid,"涓婚敭");
+        ${className}DO ${classNameFristLowwer}DO = ${classNameFristLowwer}Mapper.selectByPrimaryKey(oid.trim());
+        if(${classNameFristLowwer}DO == null || StringUtils.isBlank(${classNameFristLowwer}DO.getOid())){
+            throw new VciBaseException(DATA_OID_NOT_EXIST);
+        }
+        return ${classNameFristLowwer}DO;
+    }
+
+    /**
+     * 涓婚敭鎵归噺鑾峰彇${comments}
+     * @param oidCollections 涓婚敭闆嗗悎锛屼絾鏄彈鎬ц兘褰卞搷锛屽缓璁竴娆℃煡璇笉瓒呰繃10000涓�
+     * @return ${comments}鏄剧ず瀵硅薄
+     * @throws VciBaseException 鏌ヨ鍑虹幇寮傚父鏃朵細鎶涘嚭
+     */
+    @Override
+    public Collection<${className}VO> list${className}ByOids(Collection<String> oidCollections) throws VciBaseException{
+        VciBaseUtil.alertNotNull(oidCollections,"鏁版嵁瀵硅薄涓婚敭闆嗗悎");
+        List<${className}DO> ${classNameFristLowwer}DOList = list${className}DOByOidCollections(oidCollections);
+        return ${classNameFristLowwer}DO2VOs(${classNameFristLowwer}DOList);
+    }
+
+    /**
+    * 浣跨敤涓婚敭闆嗗悎鏌ヨ鏁版嵁瀵硅薄
+    * @param oidCollections 涓婚敭鐨勯泦鍚�
+    * @return 鏁版嵁瀵硅薄鍒楄〃
+    */
+    private List<${className}DO> list${className}DOByOidCollections(Collection<String> oidCollections){
+        List<${className}DO> ${classNameFristLowwer}DOList = new ArrayList<${className}DO>();
+        if(!CollectionUtils.isEmpty(oidCollections)){
+            Collection<Collection<String>> oidCollectionsList = VciBaseUtil.switchCollectionForOracleIn(oidCollections);
+            for(Collection<String> oids: oidCollectionsList){
+                List<${className}DO> tempDOList =  ${classNameFristLowwer}Mapper.selectByPrimaryKeyCollection(oids);
+                if(!CollectionUtils.isEmpty(tempDOList)){
+                        ${classNameFristLowwer}DOList.addAll(tempDOList);
+                }
+            }
+        }
+        return  ${classNameFristLowwer}DOList;
+    }
+
+#if(${hasEnable})
+    /**
+     * 鍚敤${comments}
+     * @param ${classNameFristLowwer}DTO ${comments}鏁版嵁浼犺緭瀵硅薄锛宱id鍜宼s闇�瑕佷紶杈�
+#if(${hasParentField})
+     * @param cascade 绾ц仈鍚敤
+#end
+     * @return 鍚敤缁撴灉鍙嶉锛氾細success锛氭垚鍔燂紝fail锛氬け璐�
+     * @throws VciBaseException 鎵ц鍑虹幇寮傚父鏃朵細鎶涘嚭
+     */
+    @Override
+    public BaseResult enable${className}(${className}DTO ${classNameFristLowwer}DTO#if(${hasParentField}),boolean cascade #end) throws VciBaseException{
+        return changeLcStatus(${classNameFristLowwer}DTO,false#if(${hasParentField}),cascade#end);
+    }
+
+    /**
+     * 鍋滅敤{comments}
+     * @param ${classNameFristLowwer}DTO ${comments}鏁版嵁浼犺緭瀵硅薄锛宱id鍜宼s闇�瑕佷紶杈�
+#if(${hasParentField})
+     * @param cascade 绾ц仈鍋滅敤
+#end
+     * @return 鍋滅敤缁撴灉鍙嶉锛氾細success锛氭垚鍔燂紝fail锛氬け璐�
+     * @throws VciBaseException 鎵ц鍑虹幇寮傚父鏃朵細鎶涘嚭
+     */
+    @Override
+    public BaseResult disable${className}(${className}DTO ${classNameFristLowwer}DTO#if(${hasParentField}),boolean cascade #end) throws VciBaseException{
+        return changeLcStatus(${classNameFristLowwer}DTO,true#if(${hasParentField}),cascade#end);
+    }
+
+    /**
+     * 淇敼鐢熷懡鍛ㄦ湡鐨勭姸鎬侊紝濡傚仠鐢ㄥ拰鍚敤
+     * @param ${classNameFristLowwer}DTO ${comments}鏁版嵁浼犺緭瀵硅薄锛屽繀椤昏鏈塷id鍜宼s
+     * @param disable 鏄惁涓哄仠鐢�
+#if(${hasParentField})
+     * @param cascade 鏄惁绾ц仈鎿嶄綔涓嬬骇鑺傜偣
+#end
+     * @return 鎵ц鐨勭粨鏋�
+     */
+    private BaseResult changeLcStatus(${className}DTO ${classNameFristLowwer}DTO,boolean disable#if(${hasParentField}),boolean cascade#end){
+        VciBaseUtil.alertNotNull(${classNameFristLowwer}DTO,"鏁版嵁瀵硅薄",${classNameFristLowwer}DTO.getOid(),"涓婚敭");
+        ${className}DO ${classNameFristLowwer}DO = selectByOid(${classNameFristLowwer}DTO.getOid());
+        boService.checkTs(${classNameFristLowwer}DTO.getTs());
+        if(disable){
+            ${classNameFristLowwer}DO.setLcStatus(FrameworkDataLCStatus.DISABLED.getValue());
+        }else{
+            ${classNameFristLowwer}DO.setLcStatus(FrameworkDataLCStatus.ENABLED.getValue());
+        }
+#if(${hasParentField})
+        //鎴戜滑瑕佸彇鎵�鏈夌殑涓嬬骇锛岀劧鍚庡幓鍒ゆ柇鏄惁琚紩鐢�
+        if(cascade) {
+            List<String> childrenOids = ${classNameFristLowwer}Mapper.selectAllLevelChildOid(${classNameFristLowwer}DO.getOid().trim());
+            if (!CollectionUtils.isEmpty(childrenOids)) {
+                Collection<Collection<String>> oidCollectionsList = WebUtil.switchCollectionForOracleIn(childrenOids);
+                for(Collection<String> oids: oidCollectionsList){
+                    ${classNameFristLowwer}Mapper.batchUpdateLcStatus(oids,${classNameFristLowwer}DO.getLcStatus());
+                }
+            }
+        }
+#end
+        return (${classNameFristLowwer}Mapper.updateLcStatus(${classNameFristLowwer}DO.getOid(),${classNameFristLowwer}DO.getLcStatus()) >0 )?(BaseResult.successMsg((disable?DISABLE_SUCCESS:ENABLE_SUCCESS))):(BaseResult.fail((disable?DISABLE_FAIL:ENABLE_FAIL)));
+    }
+#end
+
+
+#if(!${hasParentField})
+    /**
+     * 鍙傜収${comments}鍒楄〃
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉鍜屾帓搴�
+     * @return ${comments}鏄剧ず瀵硅薄鍒楄〃锛岀敓鏁堢殑鍐呭
+     * @throws VciBaseException 鏌ヨ鏉′欢鍜屽垎椤靛嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public DataGrid<${className}VO> refDataGrid${className}(Map<String, String> conditionMap, PageHelper pageHelper) throws VciBaseException{
+        if(conditionMap == null){
+            conditionMap = new HashMap<String, String>();
+        }
+#if(${hasEnable})
+        if(conditionMap.containsKey(LC_STATUS)) {
+            conditionMap.remove(LC_STATUS);
+        }
+        conditionMap.put(LC_STATUS, FRAMEWORK_DATA_ENABLED);
+#end
+        return grid${className}(conditionMap,pageHelper);
+    }
+#else
+    /**
+     * 鍙傜収鏍� ${comments}
+     * @param treeQueryObject 鏍戝舰鏌ヨ瀵硅薄
+     * @return ${comments}鏄剧ず鏍�
+     * @throws VciBaseException 鏌ヨ鏉′欢鍜屽垎椤靛嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    @Override
+    public List<Tree> referTree(TreeQueryObject treeQueryObject)  throws VciBaseException{
+        if(treeQueryObject == null){
+            treeQueryObject = new TreeQueryObject();
+        }
+        if(treeQueryObject.getConditionMap() == null){
+            treeQueryObject.setConditionMap(new HashMap<>());
+        }
+        if(treeQueryObject.getConditionMap().containsKey(LC_STATUS)) {
+            treeQueryObject.getConditionMap().remove(LC_STATUS);
+        }
+        #if(${hasEnable})
+        if(treeQueryObject.getExtandParamsMap() ==null || !treeQueryObject.getExtandParamsMap().containsKey(REFER_SHOW_DISABLED_QUERY_KEY)) {
+             treeQueryObject.getConditionMap().put(LC_STATUS, FRAMEWORK_DATA_ENABLED);
+        }
+        #end
+        return tree${className}(treeQueryObject);
+    }
+#end
+}
+
diff --git a/Source/platformProject/vci-platform-web/src/main/resources/codeTemplate/Service.java.vm b/Source/platformProject/vci-platform-web/src/main/resources/codeTemplate/Service.java.vm
new file mode 100644
index 0000000..a8d9ce3
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/resources/codeTemplate/Service.java.vm
@@ -0,0 +1,183 @@
+package ${servicePackage};
+
+
+import ${voPackage}.${className}VO;
+import ${dtoPackage}.${className}DTO;
+import ${doPackage}.${doClassName};
+import ${mapperPackage}.${className}DaoI;
+import ${servicePackage}.${className}ServiceI;
+    #if(${lcStatusFullClassName} !="")
+    import ${lcStatusFullClassName};
+    #end
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.*;
+import com.vci.starter.web.util.*;
+import com.vci.starter.web.wrapper.*;
+
+
+import java.util.*;
+
+import static com.vci.frameworkcore.constant.FrameWorkLangCodeConstant.*;
+/**
+ * ${comments}鏈嶅姟鎺ュ彛
+ *
+ * @author ${author}
+ * @date ${datetime}
+ */
+public interface ${className}ServiceI {
+#if(!${hasParentField})
+    /**
+     * 鏌ヨ鎵�鏈夌殑${comments}
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉鍜屾帓搴�
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 鏌ヨ鏉′欢鍜屽垎椤靛嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    DataGrid<${className}VO> grid${className}(Map<String, String> conditionMap, PageHelper pageHelper) throws VciBaseException;
+
+#else
+    /**
+     * 鏌ヨ${comments} 鏍�
+     * @param treeQueryObject 鏍戞煡璇㈠璞�
+     * @return ${comments} 鏄剧ず鏍�
+     * @throws VciBaseException 鏌ヨ鏉′欢涓嶇鍚堣姹傜殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    List<Tree> tree${className}(TreeQueryObject treeQueryObject) throws VciBaseException;
+    /**
+      * 鏍规嵁鏍戝舰鏌ヨ瀵硅薄鏉ユ煡璇㈡暟鎹璞�
+      *
+      * @param treeQueryObject 鏍戝舰鏌ヨ瀵硅薄
+      * @return 鏌ヨ缁撴灉,鏁版嵁瀵硅薄
+      */
+    List<${className}DO> select${className}DOByTree(TreeQueryObject treeQueryObject);
+#end
+
+    /**
+     * 鎵归噺鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+     * @param ${classNameFristLowwer}DOs 鏁版嵁瀵硅薄鍒楄〃
+     * @return 鏄剧ず瀵硅薄
+     * @throws VciBaseException 鍙傛暟涓虹┖鎴栬�呬笉瀛樺湪鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+    List<${className}VO> ${classNameFristLowwer}DO2VOs(Collection<${className}DO>  ${classNameFristLowwer}DOs) throws VciBaseException;
+
+    /**
+     * 鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
+     * @param  ${classNameFristLowwer}DO 鏁版嵁瀵硅薄
+     * @return 鏄剧ず瀵硅薄
+     * @throws VciBaseException 鎷疯礉灞炴�у嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+    ${className}VO ${classNameFristLowwer}DO2VO(${className}DO ${classNameFristLowwer}DO) throws VciBaseException;
+
+    /**
+     * 澧炲姞${comments}
+     * @param ${classNameFristLowwer}DTO ${comments}鏁版嵁浼犺緭瀵硅薄
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屽敮涓�椤癸紝蹇呰緭椤逛笉閫氳繃鏃朵細鎶涘嚭寮傚父
+     */
+    ${className}VO addSave(${className}DTO ${classNameFristLowwer}DTO) throws VciBaseException;
+
+    /**
+     * 淇敼${comments}
+     * @param ${classNameFristLowwer}DTO ${comments}鏁版嵁浼犺緭瀵硅薄
+     * @return 鎵ц缁撴灉
+     * @throws VciBaseException 鍙傛暟涓虹┖锛屽敮涓�椤癸紝蹇呰緭椤逛笉閫氳繃鏃朵細鎶涘嚭寮傚父
+     */
+    ${className}VO editSave(${className}DTO ${classNameFristLowwer}DTO) throws VciBaseException;
+
+#if(${hasParentField})
+    /**
+     * 妫�鏌� ${comments}鏄惁鍒犻櫎
+     * @param ${classNameFristLowwer}DTO ${comments}鏁版嵁浼犺緭瀵硅薄锛屽繀椤昏鏈塷id鍜宼s灞炴��
+     * @return 鎵ц缁撴灉 success涓簍rue涓哄彲浠ュ垹闄わ紝false琛ㄧず鏈夋暟鎹紩鐢紝obj涓簍rue琛ㄧず鏈変笅绾�
+     * @throws VciBaseException 鍙傛暟涓虹┖锛岃寮曠敤鏃舵姏鍑哄紓甯�
+     */
+    BaseResult checkIsCanDelete(${className}DTO ${classNameFristLowwer}DTO) throws VciBaseException;
+
+    /**
+     * 妫�鏌ユ槸鍚︽湁涓嬬骇鏄惁鍏宠仈浜嗘暟鎹�
+     *
+     * @param oid 涓婚敭
+     * @return true 琛ㄧず鏈夊紩鐢紝false琛ㄧず娌℃湁寮曠敤
+     * @throws VciBaseException 鍙傛暟涓虹┖鍜屾湁寮曠敤鐨勬椂鍊欎細鎶涘嚭寮傚父
+     */
+     boolean checkChildIsLinked(String oid) throws VciBaseException;
+
+    /**
+      * 鏍¢獙鏄惁鏈変笅绾ц妭鐐癸紝涓嶆牎楠屾槸鍚﹀叧鑱斾簡鏁版嵁
+      *
+      * @param oid 涓婚敭
+      * @return true琛ㄧず鏈変笅绾э紝false琛ㄧず娌℃湁涓嬬骇
+      * @throws VciBaseException 鍙傛暟閿欒锛屾垨鑰呮暟鎹笉瀛樺湪鐨勬椂鍊欎細鎶涘嚭寮傚父
+      */
+    boolean checkHasChild(String oid) throws VciBaseException;
+#end
+
+    /**
+     * 鍒犻櫎${comments}
+     * @param ${classNameFristLowwer}DTO ${comments}鏁版嵁浼犺緭瀵硅薄锛宱id鍜宼s闇�瑕佷紶杈�
+     * @return 鍒犻櫎缁撴灉鍙嶉锛氾細success锛氭垚鍔燂紝fail锛氬け璐�
+     * @throws VciBaseException 鍙傛暟涓虹┖锛岃寮曠敤鏃舵姏鍑哄紓甯�
+     */
+    BaseResult delete${className}(${className}DTO ${classNameFristLowwer}DTO) throws VciBaseException;
+
+    /**
+    * 涓婚敭鑾峰彇${comments}
+    * @param oid 涓婚敭
+    * @return ${comments}鏄剧ず瀵硅薄
+    * @throws VciBaseException 鍙傛暟涓虹┖锛屾暟鎹笉瀛樺湪鏃朵細鎶涘嚭寮傚父
+    */
+    ${className}VO getObjectByOid(String oid) throws VciBaseException;
+
+    /**
+     * 涓婚敭鎵归噺鑾峰彇${comments}
+     * @param oidCollections 涓婚敭闆嗗悎锛屼絾鏄彈鎬ц兘褰卞搷锛屽缓璁竴娆℃煡璇笉瓒呰繃10000涓�
+     * @return ${comments}鏄剧ず瀵硅薄
+     * @throws VciBaseException 鏌ヨ鍑虹幇寮傚父鏃朵細鎶涘嚭
+     */
+    Collection<${className}VO> list${className}ByOids(Collection<String> oidCollections) throws VciBaseException;
+
+#if(${hasEnable})
+    /**
+     * 鍚敤${comments}
+     * @param ${classNameFristLowwer}DTO ${comments}鏁版嵁浼犺緭瀵硅薄锛宱id鍜宼s闇�瑕佷紶杈�
+#if(${hasParentField})
+     * @param cascade 绾ц仈鍚敤
+#end
+     * @return 鍚敤缁撴灉鍙嶉锛氾細success锛氭垚鍔燂紝fail锛氬け璐�
+     * @throws VciBaseException 鎵ц鍑虹幇寮傚父鏃朵細鎶涘嚭
+     */
+    BaseResult enable${className}(${className}DTO ${classNameFristLowwer}DTO#if(${hasParentField}),boolean cascade #end) throws VciBaseException;
+
+    /**
+     * 鍋滅敤{comments}
+     * @param ${classNameFristLowwer}DTO ${comments}鏁版嵁浼犺緭瀵硅薄锛宱id鍜宼s闇�瑕佷紶杈�
+#if(${hasParentField})
+     * @param cascade 绾ц仈鍋滅敤
+#end
+     * @return 鍋滅敤缁撴灉鍙嶉锛氾細success锛氭垚鍔燂紝fail锛氬け璐�
+     * @throws VciBaseException 鎵ц鍑虹幇寮傚父鏃朵細鎶涘嚭
+     */
+    BaseResult disable${className}(${className}DTO ${classNameFristLowwer}DTO#if(${hasParentField}),boolean cascade #end) throws VciBaseException;
+#end
+
+
+#if(!${hasParentField})
+    /**
+     * 鍙傜収${comments}鍒楄〃
+     * @param conditionMap 鏌ヨ鏉′欢
+     * @param pageHelper 鍒嗛〉鍜屾帓搴�
+     * @return ${comments}鏄剧ず瀵硅薄鍒楄〃锛岀敓鏁堢殑鍐呭
+     * @throws VciBaseException 鏌ヨ鏉′欢鍜屽垎椤靛嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+     DataGrid<${className}VO> refDataGrid${className}(Map<String, String> conditionMap, PageHelper pageHelper) throws VciBaseException;
+#else
+    /**
+     * 鍙傜収鏍� ${comments}
+     * @param treeQueryObject 鏍戝舰鏌ヨ瀵硅薄
+     * @return ${comments}鏄剧ず鏍�
+     * @throws VciBaseException 鏌ヨ鏉′欢鍜屽垎椤靛嚭閿欑殑鏃跺�欎細鎶涘嚭寮傚父
+     */
+     List<Tree> referTree(TreeQueryObject treeQueryObject)  throws VciBaseException;
+#end
+}
+
diff --git a/Source/platformProject/vci-platform-web/src/main/resources/codeTemplate/VO.java.vm b/Source/platformProject/vci-platform-web/src/main/resources/codeTemplate/VO.java.vm
new file mode 100644
index 0000000..92388a2
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/resources/codeTemplate/VO.java.vm
@@ -0,0 +1,108 @@
+package ${voPackage};
+
+import java.lang.*;
+import java.util.Date;
+
+import com.vci.starter.web.pagemodel.BaseModelVO;
+
+/**
+ * ${comments}鏄剧ず瀵硅薄
+ * 
+ * @author ${author}
+ * @date ${datetime}
+ */
+public class ${className}VO extends BaseModelVO {
+
+	/**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+	private static final long serialVersionUID = ${voSerialVersionUID};
+
+#foreach ($attr in $uiAttributes)
+	/**
+	* $attr.name
+	*/
+	private $attr.voJavaDataType $attr.id;
+
+#if($attr.referFlag && !$attr.referNameExist)
+	/**
+	* $attr.name鏄剧ず鏂囨湰
+	*/
+	private String $attr.referBtmTypeShowField;
+#end
+
+#if($attr.enumFlag)
+	/**
+	* $attr.name鏄剧ず鏂囨湰
+	*/
+	private String $attr.enumShowField;
+#end
+#end
+
+#foreach ($attr in $uiAttributes)
+	/**
+	 * 鑾峰彇 $attr.name
+	 */
+#if($attr.id == "id" || $attr.id == "name" || $attr.id =="description")
+	@Override
+#end
+	public $attr.voJavaDataType $attr.voGetter (){
+		return $attr.id;
+	}
+
+	/**
+	* 璁剧疆 $attr.name
+	*/
+#if($attr.id == "id" || $attr.id == "name" || $attr.id =="description")
+	@Override
+#end
+	public void $attr.voSetter ($attr.voJavaDataType $attr.id){
+		this.$attr.id = $attr.id;
+	}
+#if($attr.referFlag)
+	/**
+	 * 鑾峰彇$attr.name鏄剧ず鏂囨湰
+	 */
+	public String $attr.referBtmTypeShowFieldGetter (){
+		return $attr.referBtmTypeShowField;
+	}
+
+	/**
+	* 璁剧疆$attr.name鏄剧ず鏂囨湰
+	*/
+	public void $attr.referBtmTypeShowFieldSetter (String $attr.referBtmTypeShowField){
+		this.$attr.referBtmTypeShowField = $attr.referBtmTypeShowField;
+	}
+#end
+#if($attr.enumFlag)
+	/**
+	 * 鑾峰彇$attr.name鏄剧ず鏂囨湰
+	 */
+	public String $attr.enumShowFieldGetter (){
+		return $attr.enumShowField;
+	}
+
+	/**
+	 * 璁剧疆 $attr.name鏄剧ず鏂囨湰
+	 */
+	public void $attr.enumShowFieldSetter (String $attr.enumShowField){
+		this.$attr.enumShowField = $attr.enumShowField;
+	}
+#end
+#end
+
+	@Override
+	public String toString() {
+		return "${className}VO{" +
+#foreach ($attr in $uiAttributes)
+		"$attr.id='" + $attr.id +"'," +
+#if($attr.referFlag)
+		"$attr.referBtmTypeShowField='" + $attr.referBtmTypeShowField +"'," +
+#end
+#if($attr.enumFlag)
+		"$attr.enumShowField='" + $attr.enumShowField +"'," +
+#end
+#end
+		"}" + super.toString();
+	}
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/resources/codeTemplate/ui.js.vm b/Source/platformProject/vci-platform-web/src/main/resources/codeTemplate/ui.js.vm
new file mode 100644
index 0000000..166ca10
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/resources/codeTemplate/ui.js.vm
@@ -0,0 +1,608 @@
+/**
+ * ${comments}椤甸潰
+ * @author ${author}
+ * @date ${datetime}
+ */
+layui.define(['layer','element','form','table','dynamicCondition'#if(${hasExcel}),'upload'#end #if(${hasParentField}),'tree'#end],function(exports){
+    #set($util = "$webUtil")
+    #set($cookie = "$.cookie")
+    #set($status = "${lcstatus}")
+    var webUtil = $util;
+    var Class = function(){
+        this.MODELNAME = "${jsPackage}";
+        this.moduleKey = "${className}";
+        this.backPath =  ${backPath};
+        this.url = {
+            controller:'${controllerUrl}',
+#if(!${hasParentField})
+            dataGrid:'grid${className}',
+#else
+            tree:'tree${className}',
+#end
+            addSave:'addSave',
+            editSave:'editSave',
+#if(${hasParentField})
+            checkIsCanDelete:'checkIsCanDelete',
+            referTree:'referTree' ,
+ #end
+            deleteUrl:'deleteData',
+#if(${hasEnable})
+            enableData: 'enableData',
+            disableData: 'disableData',
+#end
+            getObjectByOid:'getObjectByOid'
+        };
+        this.getContent=function(){
+            var that = this;
+            return '<div id="UIContent_' + that.id + '" style="overflow: auto;padding:0 5px"></div>';
+        };
+        this.showContent=function (){
+            var that = this;
+            var html = "";
+            html = [
+                        '<div class="layui-layout easyui-layout UIContentLayout"  id="easyuiLayout_',that.id,'" data-options="fit:true" style="display:block;overflow-y: hidden;margin:0 5px">',
+#if(${useWest})
+                            '<div data-options="region:\'west\',split:true" style="width:260px;padding: 5px;">',
+                                that.getWestToolbarHtml(),
+#if(${westLayoutPanelType} == "tree")
+                                '<div class="layui-vci-tree" style="overflow: auto">',
+                                    '<label class="layui-icon layui-icon-tree" style="line-height: 20px;color:red;font-size:20px;">${comments}</label>',
+                                    '<ul layui-filter="tree_',that.id,'"><ul>',
+                                '</div>',
+#end
+                            '</div>',
+#end
+                            '<div data-options="region:\'center\'" style="padding-left: 10px;padding-right: 10px;" id="border_',that.id,'">',
+                                '<div class="layui-center" style="overflow-y:auto;">',
+                                    that.getToolbarHtml(),
+#if(${centerLayoutPanelType} == "table")
+                                    '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+#end
+#if(${centerLayoutPanelType} == "table_tree")
+                                    '<table id="table_', that.id , '" lay-filter="',that.id , '" style="overflow-x:auto;"></table>',
+#end
+#if(${centerLayoutPanelType} == "form")
+                                    '<form class="layui-form" lay-filter="form_info_',that.id,'"></form>',
+#end
+                                '</div>',
+                            '</div>',
+                        '</div>'
+            ].join("");
+            $("#UIContent_"+that.id).html(html);
+        };
+#if(${useWest})
+        this.getWestToolbarHtml = function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_west_',that.id,'" class="layui-btn-container layui-buttons">',
+#if($westButtons.size()>0)
+#foreach($button in $westButtons)
+                '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_west_',that.id,'_$button.id"><i class="layui-icon $button.iconCls"></i>$button.text</button>',
+#end
+#end
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createWestSearchHtml = function () {
+            var that = this;
+#if($westQuerys != "")
+            webUtil.createSearchHtml($westQuerys,$("[layui-filter='toolbar_west_" + that.id + "']"),'west_' + that.id);
+            webUtil.bindDefultButtonLisenter(that,"west_" + that.id);
+#end
+        };
+#end
+        this.getToolbarHtml =function(){
+            var that = this;
+            var html = [
+                '<div layui-filter="toolbar_',that.id,'" class="layui-btn-container layui-buttons">',
+#if($centerButtons.size()>0)
+#foreach($button in $centerButtons)
+                    '<button class="layui-btn layui-btn-sm" layui-filter="toolbar_',that.id,'_$button.id"><i class="layui-icon $button.iconCls"></i>$button.text</button>',
+#end
+#end
+                '</div>'
+            ].join("");
+            return html;
+        };
+        this.createSearchHtml = function () {
+            var that = this;
+            webUtil.bindDefultButtonLisenter(that, that.id);
+#if($centerQuerys !="")
+            webUtil.createSearchHtml($centerQuerys ,$("[layui-filter='toolbar_" + that.id + "']"), "table_" + that.id);
+#end
+        };
+        this.defaultAttrList = [
+#foreach($attr in $uiAttributes)
+        '$attr.id',
+#end
+            ''
+        ];
+        this.init = function(){
+            var that = this;
+            webUtil.copyConfig(that,that.moduleKey);
+            //闇�瑕佸姞鍦ㄥ畾鏃朵腑锛屽惁鍒欐牱寮忎笉鑳芥纭睍绀猴紝涓嶇煡閬撳師鍥� wangting
+            setTimeout(function (){
+                that.showContent();
+                var easyuiLayout= $('#easyuiLayout_'+that.id)
+                easyuiLayout.css({height:$('#portal_body').height()-43,width:$('#portal_body').width()-15})
+                easyuiLayout.layout();
+
+#if(${useWest})
+#if(${westLayoutPanelType} == "tree")
+                that.initTree();
+                that.createWestSearchHtml();
+#end
+#end
+#if(${centerLayoutPanelType} == "table")
+                that.initMainTable();
+#end
+#if(${centerLayoutPanelType} == "table_tree")
+                that.initMainTable(${parentFieldName});
+#end
+#if(${centerLayoutPanelType} == "form")
+                that.initForm();
+#end
+                that.createSearchHtml();
+
+            },1)
+        };
+        this.initMainTable = function (parentFieldName) {
+            var that = this;
+            var table = layui.table;
+            that.checkColumns();
+            var tableWidth = $("#border_" + that.id).width();
+            var options = {
+                elem: '#table_' + that.id,
+                id: 'table_' + that.id,
+                backPath:that.backPath,
+                url: that.url.controller + that.url.dataGrid,
+                page: {
+                    limit: 20,
+                    page: 1
+                },
+                width:tableWidth,
+                selectMode:table.selectMode.muti,
+                cols: [that.columns],
+                method:'get',
+                done:function(res,cur,total){
+                    if(!that.fristMainLoad ){
+                        table.on('tool(' + that.id + ')',function(obj){
+                            var data = obj.data;//褰撳墠閫夋嫨琛岀殑鏁版嵁
+                            var layEvent = obj.event;//鐐圭殑鏄粈涔堟寜閽�
+                            if(layEvent == 'EDIT'){
+                                that.addOrEdit(false,data.oid);
+                            }
+                        });
+                    }else{
+                        if(total>0) {
+                            table.selectRecord('table_' + that.id, {index:0});
+                        }
+                    }
+                    that.fristMainLoad = true;
+                }
+            };
+            if(parentFieldName){
+                options.treeConfig = {
+                    treepid:parentFieldName,
+                    treeid:'id',
+                    showField:'name'
+                };
+            }
+            table.render(options);
+        };
+        this.checkColumns = function(){
+            var that = this;
+            var table = layui.table;
+            if(that.columns==null || that.columns.length==0){
+                that.columns = [table.getIndexColumn(),table.getCheckColumn(),
+#foreach($attr in $uiAttributes)
+                    {
+                        title: '$attr.name',
+#if($attr.vciAttrDataType == "VTString")
+#if($attr.referFlag)
+                        field: '$attr.referBtmTypeShowField',
+                        sort:true,
+                        sortField:'$attr.id',
+                        type:'refer',
+                        referConfig: {
+                            type:'default',
+                            referBo:'$attr.referBtmTypeId'
+                        },
+                        width: 150
+#else
+#if($attr.enumFlag)
+                        field: '$attr.enumShowField',
+                        sort:true,
+                        sortField:'$attr.id',
+                        type:'combox',
+                        comboxKey:"$attr.enumId",
+                        width: 150
+#else
+#if($attr.id == "lcstatus")
+                        field: 'lcStatusText',
+                        sortField:'lcStatus',
+                        type:'combox',
+                        comboxKey:"${btmTypeIdLow}_$status",
+                        width:150
+#elseif($attr.id == 'secretgrade')
+                        field: 'secretGradeText',
+                        width:60,
+                        type:'combox',
+                        comboxKey:"myDataSecret",
+                        hidden:configData.controllerSecret
+#else
+                        field: '$attr.id',
+                        sort:true,
+                        width: 150
+#end
+#end
+#end
+#elseif($attr.vciAttrDataType == "VTLong")
+                        field: '$attr.id',
+                        type:'number',
+                        width: 100
+#elseif($attr.vciAttrDataType == "VTInteger")
+                        field: '$attr.id',
+                        type:'number',
+                        width: 100
+#elseif($attr.vciAttrDataType == "VTDouble")
+                        field: '$attr.id',
+                        type:'number',
+                        width: 100
+#elseif($attr.vciAttrDataType == "VTDate")
+                        field: '$attr.id',
+                        width: 110,
+                        type:'date',
+                        templet: function (d) {
+                            return webUtil.formateDate(d.$attr.id);
+                        }
+#elseif($attr.vciAttrDataType == "VTDateTime")
+                        field: '$attr.id',
+                        width: 130,
+                        type:'datetime',
+                        templet: function (d) {
+                            return webUtil.formateDateTimeNoSecond(d.$attr.id);
+                        }
+#elseif($attr.vciAttrDataType == "VTBoolean")
+                        field: '$attr.id',
+                        width: 60,
+                        type:'combox',
+                        data:[{key:"true",value:"鏄�"},{key:"false",value:"鍚�"}],
+                        templet: function (d) {
+                            return webUtil.formateBoolean(d.$attr.id);
+                        }
+#end
+                    },
+#end
+                    {
+                        field:'options',
+                        title:'鎿嶄綔',
+                        width:150,
+                        templet:function(d){
+                            return '<a class="layui-btn layui-btn-intable" lay-event="EDIT">缂栬緫</a>';
+                        }
+                    }];
+            }
+        };
+
+#if(${useWest})
+#if(${westLayoutPanelType} == "tree")
+        this.initTree = function () {
+            var that = this;
+            var tree = layui.tree;
+            var treeUL = $('[layui-filter="tree_' + that.id + '"]');
+            var scrollHeight =  treeUL.closest('.panel-body').height();
+            var treeHeight = scrollHeight - 100;
+            treeUL.parent().height(treeHeight);
+            tree.init("tree_" + that.id, treeUL, {
+                url: that.url.controller + that.url.tree,
+                backPath: that.backPath,
+                extraParams: {
+                    isMuti: false,
+                    isQueryAllColumn: true
+                },
+                showSearch:true,
+                click: function (item, elem, options) {
+                    that.currentItemOid = item.oid;
+                    that.currentItemAttributes = item.attributes;
+#if(${centerLayoutPanelType} == "table")
+                    layui.table.reload('table_' + that.id,{
+                        extraParams:{
+                            "${westNextRegionParam}":that.currentItemAttributes.oid
+                        }
+                    });
+#elseif(${centerLayoutPanelType} == "table_tree")
+                    layui.table.reload('table_' + that.id,{
+                        extraParams: {
+                            "${westNextRegionParam}": that.currentItemAttributes.oid
+                        }
+                    });
+#elseif(${centerLayoutPanelType} == "form")
+                    that.setFormValues();
+#end
+                }
+            });
+        };
+        this.setFormValues = function () {
+            var that = this;
+            layui.form.load("form_info_" + that.id,{"oid":that.currentItemAttributes.oid});
+        };
+#end
+#end
+        this.getFormItems = function(onlyShow) {
+            var that = this;
+            var table = layui.table;
+            return [
+#foreach($attr in $uiAttributes)
+                {
+                    field: '$attr.id',
+                    title: '$attr.name',
+#if($attr.nullable == "false")
+                    required: true,
+#end
+#if($attr.vciAttrDataType == "VTString")
+#if($attr.referFlag)
+                    type: 'refer',
+                    showField: '$attr.referBtmTypeShowField',
+                    referConfig: {
+                        type:'default',
+                        referBo:'$attr.referBtmTypeId'
+                    },
+#else
+#if($attr.enumFlag)
+                    type: 'combox',
+                    comboxKey: '$attr.enumId',
+#else
+                    type: 'text',
+#end
+#end
+#end
+#if($attr.vciAttrDataType == "VTLong" || $attr.vciAttrDataType == "VTInteger" || $attr.vciAttrDataType == "VTDouble")
+                    verify: 'number',
+#elseif($attr.vciAttrDataType == "VTDate")
+                    type: 'date',
+#elseif($attr.vciAttrDataType == "VTDateTime")
+                    type: 'datetime',
+#elseif($attr.vciAttrDataType == "VTBoolean")
+                    type: 'truefalse',
+#end
+#if($attr.defaultValue)
+                    defaultValue:"$attr.defaultValue",
+#end
+                    readOnly:onlyShow
+                } #if($foreach.hasNext),#end
+#end
+            ];
+        };
+#if(${centerLayoutPanelType} == "form")
+        this.initForm = function () {
+            var that = this;
+            var form = layui.form;
+            form.addItems("form_info_" + that.id, that.getFormItems(true), function () {
+            }, {}, {
+                defaultColumnOneRow: 2,
+                labelWidth: 200
+            });
+        };
+#end
+        this.ADD = function () {
+            var that = this;
+            that.addOrEdit(true);
+        };
+        this.EDIT = function(){
+            var that = this;
+#if(${hasParentField})
+            if(webUtil.isNull(that.currentItemOid)){
+                webUtil.showErrorMsg("璇峰厛浠庢爲涓婇�夋嫨涓�鏉℃暟鎹�");
+                return false;
+            }
+            that.addOrEdit(false,that.currentItemOid);
+#else
+            var oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            that.addOrEdit(false,oid);
+#end
+        };
+        this.addOrEdit = function(add,oid) {
+            var that = this;
+            var form = layui.form;
+            var filter ="form_" + that.id;
+            var addSaveIndex =webUtil.dialog({
+                title:add?'娣诲姞${comments}':'淇敼${comments}',
+                btn:['淇濆瓨','鍙栨秷'],
+                content:'<form id="form_' + filter + '" lay-filter="' + filter + '" class="layui-form" style="margin-top:5px" ></form>',
+                resizing:function(layero){
+                    form.doResize(filter);
+                },
+                success:function(layero) {
+                    form.addItems(filter,that.getFormItems(false),
+                        function () {
+                            if(!add){
+                                form.load(filter,{
+                                    backPath:that.backPath,
+                                    url:that.url.controller + that.url.getObjectByOid,
+                                    method:'get',
+                                    params:{
+                                        oid:oid
+                                    }
+                                });
+                            }else{
+                                var defaultValues = {};
+#if(${hasParentField})
+                                if(that.currentItemAttributes) {
+                                    defaultValues["${parentFieldNameLow}"] = that.currentItemOid;
+                                    defaultValues["${parentFieldNameLow}" + "name"] = that.currentItemAttributes.name;
+                                }
+#end
+                                //鍙互鎵嬪姩鍦ㄦ澶勬坊鍔犻粯璁ゅ��
+                                form.setValues(defaultValues,filter);
+                            }
+                        }, {}, {defaultColumnOneRow: 2});
+                },
+                yes:function(layero){
+                    if(form.validata(filter)){
+                        var values = form.getValues(filter,true);
+                        var url = that.url.controller + (add?that.url.addSave:that.url.editSave);
+                        webUtil.manualAjax(add?'post':'put',url,JSON.stringify(values),function(result){
+                            if(result.success){
+                                webUtil.showMsgFromResult(result,(add ? "娣诲姞鎴愬姛" : "淇敼鎴愬姛"));
+                                layer.close(addSaveIndex);
+                                that.refresh();
+                            }else{
+                                webUtil.showErrorMsg(result.msg);
+                            }
+                        },function(xhr,err){
+                            webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                        },that.backPath);
+                    }
+                },
+                btn2:function(layero){
+                    layer.close(addSaveIndex);
+                }
+            });
+        };
+        this.DEL = function(){
+            var that = this;
+#if(${hasParentField})
+            if(webUtil.isNull(that.currentItemOid)){
+                webUtil.showErrorMsg("璇峰厛浠庢爲涓婄殑鑺傜偣");
+                return false;
+            }
+            var ts =  that.currentItemAttributes.ts;
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                var submitValue = {oid:that.currentItemOid,ts:ts};
+                webUtil.post(that.url.controller + that.url.checkIsDelete,submitValue,function(result){
+                    if(result.success) {
+                        if ('true' == result.obj || true == result.obj) {
+                        webUtil.showConfirmMsg("褰撳墠鏁版嵁鍖呭惈鏈変笅绾ф暟鎹紝瑕佸垹闄ょ殑璇濅細鍜屼笅绾ф暟鎹竴璧峰垹闄わ紝浣犵‘璁ょ户缁�?", function () {
+                                that.doDelete(submitValue);
+                            });
+                        } else {
+                            //璇存槑鍙互鍒犻櫎
+                            that.doDelete(submitValue);
+                        }
+                    }else {
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function (xhr,error) {
+                    webUtil.showErrorMsg("鏍¢獙鍒犻櫎鍑虹幇浜嗛敊璇紝鍙兘鏄湇鍔″櫒鏈惎鍔�")
+                },that.backPath);
+            });
+#else
+            var oid = webUtil.getOidFromGrid("table_" +that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            var ts= webUtil.getOidFromGrid("table_" +that.id,false,false,"ts");
+            webUtil.showConfirmMsg("鏄惁鍒犻櫎杩欐潯鏁版嵁锛熷鏋滆寮曠敤灏嗕笉鑳借鍒犻櫎!",function () {
+                webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,{oid:oid,ts:ts},function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+            });
+#end
+        };
+#if(${hasParentField})
+        this.doDelete = function (submitValue) {
+            var that = this;
+            webUtil.deleteRequest(that.url.controller + that.url.deleteUrl,submitValue,function(result){
+                if(result.success){
+                    webUtil.showMsgFromResult(result,"鍒犻櫎鎴愬姛");
+                    that.refresh();
+                }else{
+                    webUtil.showErrorMsg(result.msg);
+                }
+            },function (xhr,err) {
+                webUtil.showErrorMsg("鎵ц鍒犻櫎鐨勬椂鍊欏嚭閿欎簡閿欒锛屽彲鑳芥槸鏈嶅姟鍣ㄦ殏鏃舵棤娉曡闂�");
+            },that.backPath);
+        };
+#end
+        this.refresh = function (#if(${hasParentField})buttonid,parentNodeOid#end) {
+            var that = this;
+#if(${hasParentField})
+            var tree = layui.tree;
+            if(webUtil.isNotNull(parentNodeOid)){
+                tree.reloadNode("tree_" + that.id,parentNodeOid);
+            }else {
+                tree.reload("tree_" + that.id);
+            }
+#else
+            layui.table.reload("table_" + that.id);
+#end
+        };
+#if(${hasEnable})
+        this.DISABLE = function () {
+            var that = this;
+            that.disableOrEnable(false);
+        };
+        this.ENABLE = function () {
+            var that = this;
+            that.disableOrEnable(true);
+        };
+        this.disableOrEnable = function (enable) {
+            var that = this;
+            var oid ;
+            var ts ;
+#if(${hasParentField})
+            if(webUtil.isNull(that.currentItemOid)){
+                webUtil.showErrorMsg("璇峰厛浠庢爲涓婇�夋嫨涓�鏉℃暟鎹�");
+            return false;
+            }
+            oid = that.currentItemOid;
+            ts = that.currentItemAttributes.ts;
+#else
+            oid = webUtil.getOidFromGrid("table_" + that.id,true,true);
+            if(!oid){
+                return false;
+            }
+            ts = webUtil.getOidFromGrid("table_" + that.id,false,false,'ts');
+#end
+            webUtil.post(that.url.controller + (enable?that.url.enableData:that.url.disableData),{
+                oid:oid,
+                ts:ts
+                },function(result){
+                    if(result.success){
+                        webUtil.showMsgFromResult(result,(enable?'鍚敤鎴愬姛':'鍋滅敤鎴愬姛'));
+                        that.refresh();
+                    }else{
+                        webUtil.showErrorMsg(result.msg);
+                    }
+                },function(xhr,err){
+                    webUtil.showErrorMsg("璇锋眰鏈嶅姟鍑虹幇浜嗛敊璇紝鍙兘鏈嶅姟鍣ㄦ湭寮�鍚�");
+                },that.backPath);
+        };
+#end
+        this.ADVQUERY = function () {
+            var that = this;
+            if(!that.serinorQueryInstance) {
+                var dynamicCondition = layui.dynamicCondition;
+                $('[layui-filter="toolbar_' + that.id + '"]').append('<div  id="toolbar' + that.id + '" class="layui-inline"></div>');
+                that.checkColumns();
+                var dataFields = [];
+                for(var i = 0 ; i < that.columns.length ; i ++){
+                    dataFields[i] = that.columns[i];
+                }
+                that.serinorQueryInstance = dynamicCondition.create({
+                    fields: dataFields//鏌ヨ瀛楁
+                    , tableId: "table_" + that.id//闇�瑕佹煡璇㈢殑琛ㄦ牸
+                    , type: "complex"  //type:"simple"/"complex"  鏌ヨ鐨勬柟娉�  鏆傛椂鍐欐涓� complex
+                    , queryCallBack: function (requestData) {//鏌ヨ涔嬪悗鐨刢allback
+
+                    }
+                });
+            }
+            that.serinorQueryInstance.open();
+        };
+    };
+    var cs = new Class();
+    exports(cs.MODELNAME,cs);
+});
diff --git a/Source/platformProject/vci-platform-web/src/main/resources/compatibility_field_map.yml b/Source/platformProject/vci-platform-web/src/main/resources/compatibility_field_map.yml
new file mode 100644
index 0000000..b967070
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/resources/compatibility_field_map.yml
@@ -0,0 +1,5 @@
+compatibility:
+    user-table-field-map: {"oid":"pluid","id":"plusername","name":"pltruename","password":"plpassword","usertype":"plusertype","email":"plemail","description":"pldesc","creator":"plcreateuser","createtime":"plcreatetime","lastmodifier":"plupdateuser","lastmodifytime":"plupdatetime",secretgrade":"plsecretgrade"}
+    role-table-field-map: {"oid:":"pluid","name":"plname","description":"pldesc","creator":"plcreateuser","createtime":"plcreatetime","lastmodifier":"plupdateuser","lastmodifytime":"plupdatetime"}
+    dept-table-field-map: {"oid":"pluid","id":"plnum","name":"plname","pkfatherdepartment":"plparentuid","description":"pldesc","creator":"plcreateuser","createtime":"plcreatetime","lastmodifier":"plupdateuser","lastmodifytime":"plupdatetime"}
+    function-table-field-map: {"oid":"ploid","id":"plmoduleno","name":"plname","logname":"plaliasname","parentfunctionid":"plparentid"}
\ No newline at end of file
diff --git a/Source/platformProject/vci-platform-web/src/main/resources/ehcache.xml b/Source/platformProject/vci-platform-web/src/main/resources/ehcache.xml
new file mode 100644
index 0000000..1c993e2
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/resources/ehcache.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ehcache name="es">
+    <diskStore path="java.io.tmpdir"/>
+    <defaultCache
+            maxElementsInMemory="10000"
+            eternal="false"
+            timeToIdleSeconds="30"
+            timeToLiveSeconds="30"
+            overflowToDisk="true">
+    </defaultCache>
+    <!-- 閰嶇疆鑷畾涔夌紦瀛�
+    maxElementsInMemory锛氱紦瀛樹腑鍏佽鍒涘缓鐨勬渶澶у璞℃暟
+    eternal锛氱紦瀛樹腑瀵硅薄鏄惁涓烘案涔呯殑锛屽鏋滄槸锛岃秴鏃惰缃皢琚拷鐣ワ紝瀵硅薄浠庝笉杩囨湡銆�
+    timeToIdleSeconds锛氱紦瀛樻暟鎹殑閽濆寲鏃堕棿锛屼篃灏辨槸鍦ㄤ竴涓厓绱犳秷浜′箣鍓嶏紝 涓ゆ璁块棶鏃堕棿鐨勬渶澶ф椂闂撮棿闅斿�硷紝杩欏彧鑳藉湪鍏冪礌涓嶆槸姘镐箙椹荤暀鏃舵湁鏁堬紝
+    濡傛灉璇ュ�兼槸 0 灏辨剰鍛崇潃鍏冪礌鍙互鍋滈】鏃犵┓闀跨殑鏃堕棿銆�
+    timeToLiveSeconds锛氱紦瀛樻暟鎹殑鐢熷瓨鏃堕棿锛屼篃灏辨槸涓�涓厓绱犱粠鏋勫缓鍒版秷浜$殑鏈�澶ф椂闂撮棿闅斿�硷紝
+    杩欏彧鑳藉湪鍏冪礌涓嶆槸姘镐箙椹荤暀鏃舵湁鏁堬紝濡傛灉璇ュ�兼槸0灏辨剰鍛崇潃鍏冪礌鍙互鍋滈】鏃犵┓闀跨殑鏃堕棿銆�
+    overflowToDisk锛氬唴瀛樹笉瓒虫椂锛屾槸鍚﹀惎鐢ㄧ鐩樼紦瀛樸��
+    memoryStoreEvictionPolicy锛氱紦瀛樻弧浜嗕箣鍚庣殑娣樻卑绠楁硶銆� -->
+    <cache name="vci_session_cache"
+           maxElementsInMemory="1000"
+           eternal="false"
+           overflowToDisk="true"
+           timeToIdleSeconds="900"
+           timeToLiveSeconds="1800"
+           diskPersistent="false"
+           memoryStoreEvictionPolicy="LFU" />
+    <cache name="vci_object_service"
+           maxElementsInMemory="100000"
+           eternal="false"
+           overflowToDisk="true"
+           timeToIdleSeconds="900"
+           timeToLiveSeconds="1800"
+           diskPersistent="false"
+           memoryStoreEvictionPolicy="LFU" />
+    <cache name="VCI_USER"
+           maxElementsInMemory="1000"
+           eternal="false"
+           overflowToDisk="true"
+           timeToIdleSeconds="900"
+           timeToLiveSeconds="1800"
+           diskPersistent="false"
+           memoryStoreEvictionPolicy="LFU" />
+</ehcache>
\ No newline at end of file
diff --git a/Source/platformProject/vci-platform-web/src/main/resources/excelTemplate/dataBaseExport.xls b/Source/platformProject/vci-platform-web/src/main/resources/excelTemplate/dataBaseExport.xls
new file mode 100644
index 0000000..d894c91
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/resources/excelTemplate/dataBaseExport.xls
Binary files differ
diff --git a/Source/platformProject/vci-platform-web/src/main/resources/i18n/messages.properties b/Source/platformProject/vci-platform-web/src/main/resources/i18n/messages.properties
new file mode 100644
index 0000000..c9c85b1
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/resources/i18n/messages.properties
@@ -0,0 +1,106 @@
+#####\u901A\u7528\u90E8\u5206
+addSuccess=\u6DFB\u52A0\u6210\u529F
+addFailInDB=\u6DFB\u52A0\u6570\u636E\u5230\u6570\u636E\u5E93\u5931\u8D25
+editSuccess=\u4FEE\u6539\u6210\u529F
+editFail=\u4FEE\u6539\u5931\u8D25
+deleteSuccessCascade =\u5220\u9664\u6210\u529F\uFF0C\u5E76\u4E14\u7EA7\u8054\u5220\u9664\u4E0B\u7EA7\u8282\u70B9
+deleteSuccess=\u5220\u9664\u6210\u529F
+deleteFail=\u5220\u9664\u5931\u8D25
+enableSuccess=\u542F\u7528\u6210\u529F
+enableSuccessCascade=\u542F\u7528\u6210\u529F\uFF0C\u5E76\u4E14\u7EA7\u8054\u542F\u7528\u4E0B\u7EA7\u8282\u70B9\u6210\u529F
+lockSuccess=\u9501\u5B9A\u6210\u529F
+lockFail=\u9501\u5B9A\u5931\u8D25
+unlockSuccess=\u89E3\u9501\u6210\u529F
+unlockFail=\u89E3\u9501\u5931\u8D25
+enableFail=\u542F\u7528\u5931\u8D25
+disableSuccess=\u505C\u7528\u6210\u529F
+disableSuccessCascade=\u505C\u7528\u6210\u529F\uFF0C\u5E76\u4E14\u7EA7\u8054\u505C\u7528\u4E0B\u7EA7\u8282\u70B9\u6210\u529F
+disableFail=\u505C\u7528\u5931\u8D25
+dataUpRevisionSuccess=\u6570\u636E\u5347\u7248\u6210\u529F
+dataUpRevisionFail=\u6570\u636E\u5347\u7248\u5931\u8D25
+dataUpVersionSuccess=\u6570\u636E\u5347\u7248\u6B21\u6210\u529F
+dataUpVersionFail=\u6570\u636E\u5347\u7248\u6B21\u5931\u8D25
+submitSuccess=\u63D0\u4EA4\u6210\u529F
+submitFail=\u63D0\u4EA4\u5931\u8D25
+releaseSuccess=\u53D1\u5E03\u6210\u529F
+releaseFail=\u53D1\u5E03\u5931\u8D25
+versionRepeat=\u7F16\u53F7{0},\u7248\u672C\u53F7{1},\u7248\u6B21{2}\u7684\u6570\u636E\u91CD\u590D
+revisionRepeat=\u7F16\u53F7{0},\u7248\u672C\u53F7{1}\u7684\u6570\u636E\u91CD\u590D
+dataRepeat=\u5C5E\u6027[{0}]\u4E3A[{1}]\u7684\u6570\u636E\u5DF2\u7ECF\u5B58\u5728
+dataOidNotExist=\u6839\u636E\u6570\u636E\u7684\u4E3B\u952E\u67E5\u8BE2\u540E\u53D1\u73B0\u6570\u636E\u5728\u7CFB\u7EDF\u4E2D\u5E76\u4E0D\u5B58\u5728,{0}
+dataIdNotExist=\u6839\u636E\u7F16\u53F7\u67E5\u8BE2\u540E\u53D1\u73B0\u6570\u636E\u5728\u7CFB\u7EDF\u4E2D\u4E0D\u5B58\u5728,{0}
+dataNameNotExist=\u6839\u636E\u540D\u79F0\u67E5\u8BE2\u540E\u53D1\u73B0\u6570\u636E\u5728\u7CFB\u7EDF\u4E2D\u4E0D\u5B58\u5728,{0}
+oldRevsionDataNotExist=\u8001\u7248\u672C\u7684\u6570\u636E\u4E0D\u5B58\u5728
+parentIsChild=\u60A8\u9009\u62E9\u7684\u4E0A\u7EA7\u8282\u70B9\u5B9E\u9645\u662F\u5F53\u524D\u8282\u70B9\u7684\u4E0B\u7EA7\u8282\u70B9\uFF0C\u8FD9\u6837\u4F1A\u5F15\u8D77\u6B7B\u5FAA\u73AF
+dataLinkedNotDelete=\u6570\u636E\u88AB\u5176\u4ED6\u6863\u6848\u5F15\u7528\uFF0C\u4E0D\u5141\u8BB8\u5220\u9664,{0}
+dataCascadeLinkedNotDelete=\u6570\u636E\u7684\u5B50\u8282\u70B9\u88AB\u5176\u4ED6\u6863\u6848\u5F15\u7528\uFF0C\u4E0D\u5141\u8BB8\u5220\u9664,{0}
+dataLinkedNotEdit=\u6570\u636E\u88AB\u5F15\u7528\uFF0C\u4E0D\u5141\u8BB8\u4FEE\u6539
+dataLinkedNotEditAttr=\u6570\u636E\u88AB\u5F15\u7528\uFF0C\u4E0D\u5141\u8BB8\u4FEE\u6539\u5C5E\u6027{0}\u7684\u503C
+parentNotExist=\u4E0A\u7EA7\u6863\u6848\u4E0D\u5B58\u5728
+classifyNotExist=\u5206\u7C7B\u7684\u6863\u6848\u4E0D\u5B58\u5728,{0}
+tsNotEqual=\u65F6\u95F4\u6233\u4E0D\u76F8\u7B49\uFF0C\u53EF\u80FD\u4E0D\u67E5\u770B\u5230\u7684\u6570\u636E\u4E0D\u662F\u6700\u65B0\u7684\uFF0C\u5EFA\u8BAE\u60A8\u5237\u65B0\u9875\u9762\u540E\u91CD\u8BD5\u8FD9\u4E2A\u529F\u80FD
+lcStatusCannotEditData=\u5F53\u524D\u72B6\u6001\u4E0B\u4E0D\u5141\u8BB8\u4FEE\u6539
+lcStatusCannotDeleteData=\u5F53\u524D\u72B6\u6001\u4E0B\u4E0D\u5141\u8BB8\u5220\u9664
+importSuccess=\u5BFC\u5165\u6210\u529F,{0}
+importFail=\u5BFC\u5165\u5931\u8D25,{0}
+exportSuccess=\u5BFC\u51FA\u6210\u529F,{0}
+exportFail=\u5BFC\u51FA\u5931\u8D25\uFF0C{0}
+uploadSuccess=\u4E0A\u4F20\u6210\u529F\uFF0C{0}
+uploadFail=\u4E0A\u4F20\u5931\u8D25,{1}
+downloadSuccess=\u4E0B\u8F7D\u6210\u529F\uFF0C{0}
+downloadFail=\u4E0B\u8F7D\u5931\u8D25\uFF0C{0}
+fileNotExist=\u6587\u4EF6\u4E0D\u5B58\u5728,{0}
+
+######\u7528\u6237\u76F8\u5173######
+userPwdNotEqual=\u5BC6\u7801\u8F93\u5165\u9519\u8BEF\uFF0C\u60A8\u8FD8\u53EF\u4EE5\u5C1D\u8BD5{0}\u6B21
+userIsLogined=\u7528\u6237\u5DF2\u7ECF\u767B\u5F55\u4E86\uFF0C\u53EF\u4EE5\u5728\u767B\u5F55\u65F6\u52FE\u9009\u5F3A\u5236\u767B\u5F55\uFF0C\u5176\u4ED6\u5730\u65B9\u767B\u5F55\u7684\u8BE5\u7528\u6237\u4F1A\u88AB\u8E22\u4E0B\u7EBF
+userNotFound=\u7528\u6237\u6CA1\u6709\u5728\u7CFB\u7EDF\u4E2D\u627E\u5230\uFF0C\u8BF7\u67E5\u8BC1
+userIsDisabled=\u7528\u6237\u5DF2\u7ECF\u505C\u7528
+userIsLocked=\u7528\u6237\u5DF2\u7ECF\u88AB\u9501\u5B9A\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u89E3\u9501
+moreDisableDate=\u7528\u6237\u5DF2\u7ECF\u5931\u6548
+userPwdErrorLock=\u7528\u6237\u5BC6\u7801\u8F93\u5165\u6B21\u6570\u592A\u591A\uFF0C\u5DF2\u7ECF\u88AB\u9501\u5B9A\uFF0C\u8BF7\u7B49\u5F85{0}\u5206\u949F\u89E3\u9501\uFF0C\u6216\u8005\u8054\u7CFB\u7BA1\u7406\u5458\u89E3\u9501
+changePwdNotEqual=\u786E\u8BA4\u5BC6\u7801\u4E0D\u76F8\u540C
+hasNotPasswordStrategy=\u7528\u6237\u6CA1\u6709\u5BC6\u7801\u5B89\u5168\u7B56\u7565
+passwordStrategyNotFound=\u5BC6\u7801\u5B89\u5168\u7B56\u7565\u6CA1\u6709\u627E\u5230
+requireCharTypeNull=\u5BC6\u7801\u5B89\u5168\u7B56\u7565\u4E2D\uFF0C\u6240\u9700\u5B57\u7B26\u7684\u7C7B\u578B\u6CA1\u6709\u914D\u7F6E
+requireCharTypeNotExist=\u5BC6\u7801\u7684\u5B57\u7B26\u7C7B\u578B\u4E0D\u7B26\u5408\u8981\u6C42
+lessCharType=\u5BC6\u7801\u7684\u590D\u6742\u5EA6\u4E0D\u7B26\u5408\u8981\u6C42
+notHasLowLetter=\u5BC6\u7801\u6CA1\u6709\u5305\u542B\u5C0F\u5199\u5B57\u6BCD
+notHasNumber=\u5BC6\u7801\u6CA1\u6709\u5305\u542B\u6570\u5B57
+notHasSpecial=\u5BC6\u7801\u6CA1\u6709\u7279\u6B8A\u5B57\u6BCD
+lessMinLength=\u5BC6\u7801\u4E0D\u6EE1\u8DB3\u6700\u4F4E\u957F\u5EA6\u8981\u6C42\uFF0C\u9700\u8981{0}\u957F\u5EA6
+moreMaxLength=\u5BC6\u7801\u4E0D\u6EE1\u8DB3\u6700\u5927\u957F\u5EA6\u8981\u6C42\uFF0C\u4EC5\u80FD\u8F93\u5165{0}\u957F\u5EA6
+passwordRemainDay=\u5BC6\u7801\u5373\u5C06\u8FC7\u671F\uFF0C\u8BF7\u5C3D\u5FEB\u4FEE\u6539
+
+#########\u7CFB\u7EDF\u8D44\u6E90\u76F8\u5173######
+com.vci.web.menu.noHasFunction= {0}\u6CA1\u6709\u4EFB\u4F55\u7684\u6743\u9650
+
+###\u751F\u547D\u5468\u671F\u76F8\u5173
+com.vci.base.lifecycle.noexistlife=\u751F\u547D\u5468\u671F\u4E0D\u5B58\u5728
+com.vci.base.lifecycle.noroute=\u751F\u547D\u5468\u671F\u6CA1\u6709\u4EFB\u4F55\u72B6\u6001
+lifeCycleTransError=\u751F\u547D\u5468\u671F\u8DC3\u8FC1\u5931\u8D25,{0}
+
+
+#####\u6D41\u7A0B\u76F8\u5173
+com.vci.web.flow.taskOidOrProcessOidNotNull=\u6D41\u7A0B\u4EFB\u52A1\u6216\u8005\u6D41\u7A0B\u6267\u884C\u5B9E\u4F8B\u4E0D\u5B58\u5728
+
+###\u6587\u4EF6\u76F8\u5173
+fileUploadSecretError=\u6587\u4EF6\u6807\u5BC6\u8D85\u8FC7\u4E86\u7528\u6237\u7684\u5BC6\u7EA7\uFF0C\u7528\u6237\u5BC6\u7EA7{0}\uFF0C\u6587\u4EF6\u6807\u5BC6{1}
+fileUploadDataSecretError=\u6587\u4EF6\u6807\u5BC6\u8D85\u8FC7\u4E86\u6570\u636E\u7684\u5BC6\u7EA7\uFF0C\u6570\u636E\u5BC6\u7EA7{0},\u6587\u4EF6\u6807\u5BC6{1}
+fileNameRepeat=\u6587\u4EF6\u7684\u540D\u79F0\u5728\u540C\u4E00\u6761\u4E1A\u52A1\u6570\u636E\u4E0B\u53D1\u751F\u4E86\u91CD\u590D
+
+###excel\u64CD\u4F5C\u76F8\u5173
+readImportFileFail=\u8BFB\u53D6\u5BFC\u5165\u7684\u6587\u4EF6\u51FA\u9519
+importContentNull=\u5BFC\u5165\u7684\u6587\u4EF6\u662F\u7A7A
+fileNotFound=\u6587\u4EF6\u4E0D\u5B58\u5728,{0}
+fileIoException=\u6587\u4EF6\u5199\u5165\u9519\u8BEF,{0}
+fileCreateException=\u6587\u4EF6\u521B\u5EFA\u5F02\u5E38,{0}
+inputStreamIsNull=\u8F93\u5165\u6D41\u662F\u7A7A
+outputStreamIsNull=\u8F93\u51FA\u6D41\u662F\u7A7A\u7684
+workBookInitFail=\u5DE5\u4F5C\u7C3F\u521D\u59CB\u5316\u5931\u8D25
+cellValueCanNotNull=\u5355\u5143\u683C\u7684\u5185\u5BB9\u4E0D\u80FD\u4E3A\u7A7A,\u5217\u540D{0},\u884C\u6570{1}
+cellValueCanNotNullForReg=\u5355\u5143\u683C\u7684\u5185\u5BB9\u4E0D\u7B26\u5408\u6B63\u5219\u8868\u8FBE\u5F0F\u8981\u6C42\uFF0C\u5217\u540D{0},\u884C\u6570{1}
+cellNotDateFormate=\u5355\u5143\u683C\u4E0D\u662F\u6709\u6548\u7684\u4E8B\u4EF6\u683C\u5F0F,\u5217\u540D{0},\u884C\u6570{1}
+
+###\u4E1A\u52A1####
+com.vci.web.flow.processTemplateNotExist=\u6D41\u7A0B\u6A21\u677F\u4E0D\u5B58\u5728\uFF0C\u8BF7\u67E5\u8BC1
\ No newline at end of file
diff --git a/Source/platformProject/vci-platform-web/src/main/resources/i18n/messages_zh_CN.properties b/Source/platformProject/vci-platform-web/src/main/resources/i18n/messages_zh_CN.properties
new file mode 100644
index 0000000..9272b11
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/resources/i18n/messages_zh_CN.properties
@@ -0,0 +1,105 @@
+#####\u901A\u7528\u90E8\u5206
+addSuccess=\u6DFB\u52A0\u6210\u529F
+addFailInDB=\u6DFB\u52A0\u6570\u636E\u5230\u6570\u636E\u5E93\u5931\u8D25
+editSuccess=\u4FEE\u6539\u6210\u529F
+editFail=\u4FEE\u6539\u5931\u8D25
+deleteSuccessCascade =\u5220\u9664\u6210\u529F\uFF0C\u5E76\u4E14\u7EA7\u8054\u5220\u9664\u4E0B\u7EA7\u8282\u70B9
+deleteSuccess=\u5220\u9664\u6210\u529F
+deleteFail=\u5220\u9664\u5931\u8D25
+enableSuccess=\u542F\u7528\u6210\u529F
+enableSuccessCascade=\u542F\u7528\u6210\u529F\uFF0C\u5E76\u4E14\u7EA7\u8054\u542F\u7528\u4E0B\u7EA7\u8282\u70B9\u6210\u529F
+lockSuccess=\u9501\u5B9A\u6210\u529F
+lockFail=\u9501\u5B9A\u5931\u8D25
+unlockSuccess=\u89E3\u9501\u6210\u529F
+unlockFail=\u89E3\u9501\u5931\u8D25
+enableFail=\u542F\u7528\u5931\u8D25
+disableSuccess=\u505C\u7528\u6210\u529F
+disableSuccessCascade=\u505C\u7528\u6210\u529F\uFF0C\u5E76\u4E14\u7EA7\u8054\u505C\u7528\u4E0B\u7EA7\u8282\u70B9\u6210\u529F
+disableFail=\u505C\u7528\u5931\u8D25
+dataUpRevisionSuccess=\u6570\u636E\u5347\u7248\u6210\u529F
+dataUpRevisionFail=\u6570\u636E\u5347\u7248\u5931\u8D25
+dataUpVersionSuccess=\u6570\u636E\u5347\u7248\u6B21\u6210\u529F
+dataUpVersionFail=\u6570\u636E\u5347\u7248\u6B21\u5931\u8D25
+submitSuccess=\u63D0\u4EA4\u6210\u529F
+submitFail=\u63D0\u4EA4\u5931\u8D25
+releaseSuccess=\u53D1\u5E03\u6210\u529F
+releaseFail=\u53D1\u5E03\u5931\u8D25
+versionRepeat=\u7F16\u53F7{0},\u7248\u672C\u53F7{1},\u7248\u6B21{2}\u7684\u6570\u636E\u91CD\u590D
+revisionRepeat=\u7F16\u53F7{0},\u7248\u672C\u53F7{1}\u7684\u6570\u636E\u91CD\u590D
+dataRepeat=\u5C5E\u6027[{0}]\u4E3A[{1}]\u7684\u6570\u636E\u5DF2\u7ECF\u5B58\u5728
+dataOidNotExist=\u6839\u636E\u6570\u636E\u7684\u4E3B\u952E\u67E5\u8BE2\u540E\u53D1\u73B0\u6570\u636E\u5728\u7CFB\u7EDF\u4E2D\u5E76\u4E0D\u5B58\u5728,{0}
+dataIdNotExist=\u6839\u636E\u7F16\u53F7\u67E5\u8BE2\u540E\u53D1\u73B0\u6570\u636E\u5728\u7CFB\u7EDF\u4E2D\u4E0D\u5B58\u5728,{0}
+dataNameNotExist=\u6839\u636E\u540D\u79F0\u67E5\u8BE2\u540E\u53D1\u73B0\u6570\u636E\u5728\u7CFB\u7EDF\u4E2D\u4E0D\u5B58\u5728,{0}
+oldRevsionDataNotExist=\u8001\u7248\u672C\u7684\u6570\u636E\u4E0D\u5B58\u5728
+parentIsChild=\u60A8\u9009\u62E9\u7684\u4E0A\u7EA7\u8282\u70B9\u5B9E\u9645\u662F\u5F53\u524D\u8282\u70B9\u7684\u4E0B\u7EA7\u8282\u70B9\uFF0C\u8FD9\u6837\u4F1A\u5F15\u8D77\u6B7B\u5FAA\u73AF
+dataLinkedNotDelete=\u6570\u636E\u88AB\u5176\u4ED6\u6863\u6848\u5F15\u7528\uFF0C\u4E0D\u5141\u8BB8\u5220\u9664,{0}
+dataCascadeLinkedNotDelete=\u6570\u636E\u7684\u5B50\u8282\u70B9\u88AB\u5176\u4ED6\u6863\u6848\u5F15\u7528\uFF0C\u4E0D\u5141\u8BB8\u5220\u9664,{0}
+dataLinkedNotEdit=\u6570\u636E\u88AB\u5F15\u7528\uFF0C\u4E0D\u5141\u8BB8\u4FEE\u6539
+dataLinkedNotEditAttr=\u6570\u636E\u88AB\u5F15\u7528\uFF0C\u4E0D\u5141\u8BB8\u4FEE\u6539\u5C5E\u6027{0}\u7684\u503C
+parentNotExist=\u4E0A\u7EA7\u6863\u6848\u4E0D\u5B58\u5728
+classifyNotExist=\u5206\u7C7B\u7684\u6863\u6848\u4E0D\u5B58\u5728,{0}
+tsNotEqual=\u65F6\u95F4\u6233\u4E0D\u76F8\u7B49\uFF0C\u53EF\u80FD\u4E0D\u67E5\u770B\u5230\u7684\u6570\u636E\u4E0D\u662F\u6700\u65B0\u7684\uFF0C\u5EFA\u8BAE\u60A8\u5237\u65B0\u9875\u9762\u540E\u91CD\u8BD5\u8FD9\u4E2A\u529F\u80FD
+lcStatusCannotEditData=\u5F53\u524D\u72B6\u6001\u4E0B\u4E0D\u5141\u8BB8\u4FEE\u6539
+lcStatusCannotDeleteData=\u5F53\u524D\u72B6\u6001\u4E0B\u4E0D\u5141\u8BB8\u5220\u9664
+importSuccess=\u5BFC\u5165\u6210\u529F,{0}
+importFail=\u5BFC\u5165\u5931\u8D25,{0}
+exportSuccess=\u5BFC\u51FA\u6210\u529F,{0}
+exportFail=\u5BFC\u51FA\u5931\u8D25\uFF0C{0}
+uploadSuccess=\u4E0A\u4F20\u6210\u529F\uFF0C{0}
+uploadFail=\u4E0A\u4F20\u5931\u8D25,{1}
+downloadSuccess=\u4E0B\u8F7D\u6210\u529F\uFF0C{0}
+downloadFail=\u4E0B\u8F7D\u5931\u8D25\uFF0C{0}
+fileNotExist=\u6587\u4EF6\u4E0D\u5B58\u5728,{0}
+
+######\u7528\u6237\u76F8\u5173######
+userPwdNotEqual=\u5BC6\u7801\u8F93\u5165\u9519\u8BEF\uFF0C\u60A8\u8FD8\u53EF\u4EE5\u5C1D\u8BD5{0}\u6B21
+userIsLogined=\u7528\u6237\u5DF2\u7ECF\u767B\u5F55\u4E86\uFF0C\u53EF\u4EE5\u5728\u767B\u5F55\u65F6\u52FE\u9009\u5F3A\u5236\u767B\u5F55\uFF0C\u5176\u4ED6\u5730\u65B9\u767B\u5F55\u7684\u8BE5\u7528\u6237\u4F1A\u88AB\u8E22\u4E0B\u7EBF
+userNotFound=\u7528\u6237\u6CA1\u6709\u5728\u7CFB\u7EDF\u4E2D\u627E\u5230\uFF0C\u8BF7\u67E5\u8BC1
+userIsDisabled=\u7528\u6237\u5DF2\u7ECF\u505C\u7528
+userIsLocked=\u7528\u6237\u5DF2\u7ECF\u88AB\u9501\u5B9A\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u89E3\u9501
+moreDisableDate=\u7528\u6237\u5DF2\u7ECF\u5931\u6548
+userPwdErrorLock=\u7528\u6237\u5BC6\u7801\u8F93\u5165\u6B21\u6570\u592A\u591A\uFF0C\u5DF2\u7ECF\u88AB\u9501\u5B9A\uFF0C\u8BF7\u7B49\u5F85{0}\u5206\u949F\u89E3\u9501\uFF0C\u6216\u8005\u8054\u7CFB\u7BA1\u7406\u5458\u89E3\u9501
+changePwdNotEqual=\u786E\u8BA4\u5BC6\u7801\u4E0D\u76F8\u540C
+hasNotPasswordStrategy=\u7528\u6237\u6CA1\u6709\u5BC6\u7801\u5B89\u5168\u7B56\u7565
+passwordStrategyNotFound=\u5BC6\u7801\u5B89\u5168\u7B56\u7565\u6CA1\u6709\u627E\u5230
+requireCharTypeNull=\u5BC6\u7801\u5B89\u5168\u7B56\u7565\u4E2D\uFF0C\u6240\u9700\u5B57\u7B26\u7684\u7C7B\u578B\u6CA1\u6709\u914D\u7F6E
+requireCharTypeNotExist=\u5BC6\u7801\u7684\u5B57\u7B26\u7C7B\u578B\u4E0D\u7B26\u5408\u8981\u6C42
+lessCharType=\u5BC6\u7801\u7684\u590D\u6742\u5EA6\u4E0D\u7B26\u5408\u8981\u6C42
+notHasLowLetter=\u5BC6\u7801\u6CA1\u6709\u5305\u542B\u5C0F\u5199\u5B57\u6BCD
+notHasNumber=\u5BC6\u7801\u6CA1\u6709\u5305\u542B\u6570\u5B57
+notHasSpecial=\u5BC6\u7801\u6CA1\u6709\u7279\u6B8A\u5B57\u6BCD
+lessMinLength=\u5BC6\u7801\u4E0D\u6EE1\u8DB3\u6700\u4F4E\u957F\u5EA6\u8981\u6C42\uFF0C\u9700\u8981{0}\u957F\u5EA6
+moreMaxLength=\u5BC6\u7801\u4E0D\u6EE1\u8DB3\u6700\u5927\u957F\u5EA6\u8981\u6C42\uFF0C\u4EC5\u80FD\u8F93\u5165{0}\u957F\u5EA6
+passwordRemainDay=\u5BC6\u7801\u5373\u5C06\u8FC7\u671F\uFF0C\u8BF7\u5C3D\u5FEB\u4FEE\u6539
+
+#########\u7CFB\u7EDF\u8D44\u6E90\u76F8\u5173######
+com.vci.web.menu.noHasFunction= {0}\u6CA1\u6709\u4EFB\u4F55\u7684\u6743\u9650
+
+###\u751F\u547D\u5468\u671F\u76F8\u5173
+com.vci.base.lifecycle.noexistlife=\u751F\u547D\u5468\u671F\u4E0D\u5B58\u5728
+com.vci.base.lifecycle.noroute=\u751F\u547D\u5468\u671F\u6CA1\u6709\u4EFB\u4F55\u72B6\u6001
+
+
+#####\u6D41\u7A0B\u76F8\u5173
+com.vci.web.flow.taskOidOrProcessOidNotNull=\u6D41\u7A0B\u4EFB\u52A1\u6216\u8005\u6D41\u7A0B\u6267\u884C\u5B9E\u4F8B\u4E0D\u5B58\u5728
+
+###\u6587\u4EF6\u76F8\u5173
+fileUploadSecretError=\u6587\u4EF6\u6807\u5BC6\u8D85\u8FC7\u4E86\u7528\u6237\u7684\u5BC6\u7EA7\uFF0C\u7528\u6237\u5BC6\u7EA7{0}\uFF0C\u6587\u4EF6\u6807\u5BC6{1}
+fileUploadDataSecretError=\u6587\u4EF6\u6807\u5BC6\u8D85\u8FC7\u4E86\u6570\u636E\u7684\u5BC6\u7EA7\uFF0C\u6570\u636E\u5BC6\u7EA7{0},\u6587\u4EF6\u6807\u5BC6{1}
+fileNameRepeat=\u6587\u4EF6\u7684\u540D\u79F0\u5728\u540C\u4E00\u6761\u4E1A\u52A1\u6570\u636E\u4E0B\u53D1\u751F\u4E86\u91CD\u590D
+
+###excel\u64CD\u4F5C\u76F8\u5173
+readImportFileFail=\u8BFB\u53D6\u5BFC\u5165\u7684\u6587\u4EF6\u51FA\u9519
+importContentNull=\u5BFC\u5165\u7684\u6587\u4EF6\u662F\u7A7A
+fileNotFound=\u6587\u4EF6\u4E0D\u5B58\u5728,{0}
+fileIoException=\u6587\u4EF6\u5199\u5165\u9519\u8BEF,{0}
+fileCreateException=\u6587\u4EF6\u521B\u5EFA\u5F02\u5E38,{0}
+inputStreamIsNull=\u8F93\u5165\u6D41\u662F\u7A7A
+outputStreamIsNull=\u8F93\u51FA\u6D41\u662F\u7A7A\u7684
+workBookInitFail=\u5DE5\u4F5C\u7C3F\u521D\u59CB\u5316\u5931\u8D25
+cellValueCanNotNull=\u5355\u5143\u683C\u7684\u5185\u5BB9\u4E0D\u80FD\u4E3A\u7A7A,\u5217\u540D{0},\u884C\u6570{1}
+cellValueCanNotNullForReg=\u5355\u5143\u683C\u7684\u5185\u5BB9\u4E0D\u7B26\u5408\u6B63\u5219\u8868\u8FBE\u5F0F\u8981\u6C42\uFF0C\u5217\u540D{0},\u884C\u6570{1}
+cellNotDateFormate=\u5355\u5143\u683C\u4E0D\u662F\u6709\u6548\u7684\u4E8B\u4EF6\u683C\u5F0F,\u5217\u540D{0},\u884C\u6570{1}
+
+###\u4E1A\u52A1####
+com.vci.web.flow.processTemplateNotExist=\u6D41\u7A0B\u6A21\u677F\u4E0D\u5B58\u5728\uFF0C\u8BF7\u67E5\u8BC1
\ No newline at end of file
diff --git a/Source/platformProject/vci-platform-web/src/main/resources/i18n/messages_zh_TW.properties b/Source/platformProject/vci-platform-web/src/main/resources/i18n/messages_zh_TW.properties
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/resources/i18n/messages_zh_TW.properties
diff --git a/Source/platformProject/vci-platform-web/src/main/resources/log4j2-spring-dev.xml b/Source/platformProject/vci-platform-web/src/main/resources/log4j2-spring-dev.xml
new file mode 100644
index 0000000..2972952
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/resources/log4j2-spring-dev.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--Configuration鍚庨潰鐨剆tatus锛岃繖涓敤浜庤缃甽og4j2鑷韩鍐呴儴鐨勪俊鎭緭鍑猴紝鍙互涓嶈缃紝褰撹缃垚trace鏃讹紝浣犱細鐪嬪埌log4j2鍐呴儴鍚勭璇︾粏杈撳嚭-->
+<!--monitorInterval锛歀og4j2 鑷姩妫�娴嬩慨鏀归厤缃枃浠跺拰閲嶆柊閰嶇疆鏈韩锛岃缃棿闅旂鏁�-->
+<configuration monitorInterval="5" status="debug">
+    <!--鏃ュ織绾у埆浠ュ強浼樺厛绾ф帓搴�: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
+    <!--鍙橀噺閰嶇疆-->
+    <Properties>
+        <!-- 鏍煎紡鍖栬緭鍑猴細%date琛ㄧず鏃ユ湡锛�%thread琛ㄧず绾跨▼鍚嶏紝%-5level锛氱骇鍒粠宸︽樉绀�5涓瓧绗﹀搴� %msg锛氭棩蹇楁秷鎭紝%n鏄崲琛岀-->
+        <!-- %logger{36} 琛ㄧず Logger 鍚嶅瓧鏈�闀�36涓瓧绗� -->
+<!--        <property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />-->
+        <property name="LOG_PATTERN" value="[TRACEID:%X{logTraceId}] %d{HH:mm:ss.SSS} %-5level %logger{-1} - %msg%xEx%n"/>
+        <!-- 瀹氫箟鏃ュ織瀛樺偍鐨勮矾寰勶紝涓嶈閰嶇疆鐩稿璺緞 -->
+        <property name="FILE_PATH" value="./logs/web" />
+        <property name="FILE_NAME" value="web" />
+    </Properties>
+
+    <appenders>
+        <console name="Console" target="SYSTEM_OUT">
+            <!--杈撳嚭鏃ュ織鐨勬牸寮�-->
+            <PatternLayout pattern="${LOG_PATTERN}"/>
+            <!--鎺у埗鍙板彧杈撳嚭level鍙婂叾浠ヤ笂绾у埆鐨勪俊鎭紙onMatch锛夛紝鍏朵粬鐨勭洿鎺ユ嫆缁濓紙onMismatch锛�-->
+            <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
+        </console>
+
+        <!--鏂囦欢浼氭墦鍗板嚭鎵�鏈変俊鎭紝杩欎釜log姣忔杩愯绋嬪簭浼氳嚜鍔ㄦ竻绌猴紝鐢盿ppend灞炴�у喅瀹氾紝閫傚悎涓存椂娴嬭瘯鐢�-->
+        <File name="Filelog" fileName="${FILE_PATH}/web.log" append="false">
+            <PatternLayout pattern="${LOG_PATTERN}"/>
+        </File>
+
+        <!-- 杩欎釜浼氭墦鍗板嚭鎵�鏈夌殑info鍙婁互涓嬬骇鍒殑淇℃伅锛屾瘡娆″ぇ灏忚秴杩噑ize锛屽垯杩檚ize澶у皬鐨勬棩蹇椾細鑷姩瀛樺叆鎸夊勾浠�-鏈堜唤寤虹珛鐨勬枃浠跺す涓嬮潰骞惰繘琛屽帇缂╋紝浣滀负瀛樻。-->
+        <RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/info.log" filePattern="${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd HH-mm}_%i.log.gz">
+            <!--鎺у埗鍙板彧杈撳嚭level鍙婁互涓婄骇鍒殑淇℃伅锛坥nMatch锛夛紝鍏朵粬鐨勭洿鎺ユ嫆缁濓紙onMismatch锛�-->
+            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
+            <PatternLayout pattern="${LOG_PATTERN}"/>
+            <Policies>
+                <!--interval灞炴�х敤鏉ユ寚瀹氬涔呮粴鍔ㄤ竴娆★紝榛樿鏄�1 hour-->
+                <TimeBasedTriggeringPolicy interval="1"/>
+                <SizeBasedTriggeringPolicy size="10MB"/>
+            </Policies>
+            <!-- DefaultRolloverStrategy鍚屼竴鏂囦欢澶逛笅15涓枃浠跺紑濮嬭鐩� 涓嶈缃紝鍒欓粯璁や负鏈�澶氬悓涓�鏂囦欢澶逛笅7涓枃浠跺紑濮嬭鐩�-->
+            <DefaultRolloverStrategy max="15"/>
+        </RollingFile>
+
+        <!-- 杩欎釜浼氭墦鍗板嚭鎵�鏈夌殑warn鍙婁互涓嬬骇鍒殑淇℃伅锛屾瘡娆″ぇ灏忚秴杩噑ize锛屽垯杩檚ize澶у皬鐨勬棩蹇椾細鑷姩瀛樺叆鎸夊勾浠�-鏈堜唤寤虹珛鐨勬枃浠跺す涓嬮潰骞惰繘琛屽帇缂╋紝浣滀负瀛樻。-->
+        <RollingFile name="RollingFileWarn" fileName="${FILE_PATH}/warn.log" filePattern="${FILE_PATH}/${FILE_NAME}-WARN-%d{yyyy-MM-dd HH-mm}_%i.log.gz">
+            <!--鎺у埗鍙板彧杈撳嚭level鍙婁互涓婄骇鍒殑淇℃伅锛坥nMatch锛夛紝鍏朵粬鐨勭洿鎺ユ嫆缁濓紙onMismatch锛�-->
+            <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
+            <PatternLayout pattern="${LOG_PATTERN}"/>
+            <Policies>
+                <!--interval灞炴�х敤鏉ユ寚瀹氬涔呮粴鍔ㄤ竴娆★紝榛樿鏄�1 hour-->
+                <TimeBasedTriggeringPolicy interval="1"/>
+                <SizeBasedTriggeringPolicy size="10MB"/>
+            </Policies>
+            <!-- DefaultRolloverStrategy鍚屼竴鏂囦欢澶逛笅15涓枃浠跺紑濮嬭鐩� 涓嶈缃紝鍒欓粯璁や负鏈�澶氬悓涓�鏂囦欢澶逛笅7涓枃浠跺紑濮嬭鐩�-->
+            <DefaultRolloverStrategy max="15"/>
+        </RollingFile>
+
+        <!-- 杩欎釜浼氭墦鍗板嚭鎵�鏈夌殑error鍙婁互涓嬬骇鍒殑淇℃伅锛屾瘡娆″ぇ灏忚秴杩噑ize锛屽垯杩檚ize澶у皬鐨勬棩蹇椾細鑷姩瀛樺叆鎸夊勾浠�-鏈堜唤寤虹珛鐨勬枃浠跺す涓嬮潰骞惰繘琛屽帇缂╋紝浣滀负瀛樻。-->
+        <RollingFile name="RollingFileError" fileName="${FILE_PATH}/error.log" filePattern="${FILE_PATH}/${FILE_NAME}-ERROR-%d{yyyy-MM-dd HH-mm}_%i.log.gz">
+            <!--鎺у埗鍙板彧杈撳嚭level鍙婁互涓婄骇鍒殑淇℃伅锛坥nMatch锛夛紝鍏朵粬鐨勭洿鎺ユ嫆缁濓紙onMismatch锛�-->
+            <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
+            <PatternLayout pattern="${LOG_PATTERN}"/>
+            <Policies>
+                <!--interval灞炴�х敤鏉ユ寚瀹氬涔呮粴鍔ㄤ竴娆★紝榛樿鏄�1 hour-->
+                <TimeBasedTriggeringPolicy interval="1"/>
+                <SizeBasedTriggeringPolicy size="10MB"/>
+            </Policies>
+            <!-- DefaultRolloverStrategy鍚屼竴鏂囦欢澶逛笅15涓枃浠跺紑濮嬭鐩� 涓嶈缃紝鍒欓粯璁や负鏈�澶氬悓涓�鏂囦欢澶逛笅7涓枃浠跺紑濮嬭鐩�-->
+            <DefaultRolloverStrategy max="15"/>
+        </RollingFile>
+    </appenders>
+
+    <!--Logger鑺傜偣鐢ㄦ潵鍗曠嫭鎸囧畾鏃ュ織鐨勫舰寮忥紝姣斿瑕佷负鎸囧畾鍖呬笅鐨刢lass鎸囧畾涓嶅悓鐨勬棩蹇楃骇鍒瓑銆�-->
+    <!--鐒跺悗瀹氫箟loggers锛屽彧鏈夊畾涔変簡logger骞跺紩鍏ョ殑appender锛宎ppender鎵嶄細鐢熸晥-->
+    <loggers>
+        <!--鐩戞帶绯荤粺淇℃伅-->
+        <!--鑻ユ槸additivity璁句负false锛屽垯 瀛怢ogger 鍙細鍦ㄨ嚜宸辩殑appender閲岃緭鍑猴紝鑰屼笉浼氬湪 鐖禠ogger 鐨刟ppender閲岃緭鍑恒��-->
+        <Logger name="org.springframework" level="debug" additivity="false">
+            <AppenderRef ref="Console"/>
+        </Logger>
+        <!--鏃ュ織绾у埆-->
+        <root level="info">
+            <appender-ref ref="Console"/>
+            <appender-ref ref="Filelog"/>
+            <appender-ref ref="RollingFileInfo"/>
+            <appender-ref ref="RollingFileWarn"/>
+            <appender-ref ref="RollingFileError"/>
+        </root>
+    </loggers>
+
+</configuration>
\ No newline at end of file
diff --git a/Source/platformProject/vci-platform-web/src/main/resources/log4j2-spring-prod.xml b/Source/platformProject/vci-platform-web/src/main/resources/log4j2-spring-prod.xml
new file mode 100644
index 0000000..3cb9718
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/resources/log4j2-spring-prod.xml
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--Configuration鍚庨潰鐨剆tatus锛岃繖涓敤浜庤缃甽og4j2鑷韩鍐呴儴鐨勪俊鎭緭鍑猴紝鍙互涓嶈缃紝褰撹缃垚trace鏃讹紝浣犱細鐪嬪埌log4j2鍐呴儴鍚勭璇︾粏杈撳嚭-->
+<!--monitorInterval锛歀og4j2 鑷姩妫�娴嬩慨鏀归厤缃枃浠跺拰閲嶆柊閰嶇疆鏈韩锛岃缃棿闅旂鏁�-->
+<configuration monitorInterval="5" status="debug">
+    <!--鏃ュ織绾у埆浠ュ強浼樺厛绾ф帓搴�: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
+    <!--鍙橀噺閰嶇疆-->
+    <Properties>
+        <!-- 鏍煎紡鍖栬緭鍑猴細%date琛ㄧず鏃ユ湡锛�%thread琛ㄧず绾跨▼鍚嶏紝%-5level锛氱骇鍒粠宸︽樉绀�5涓瓧绗﹀搴� %msg锛氭棩蹇楁秷鎭紝%n鏄崲琛岀-->
+        <!-- %logger{36} 琛ㄧず Logger 鍚嶅瓧鏈�闀�36涓瓧绗� -->
+<!--        <property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />-->
+        <property name="LOG_PATTERN" value="[TRACEID:%X{logTraceId}] %d{HH:mm:ss.SSS} %-5level %class{-1}.%M()/%L - %msg%xEx%n"/>
+        <!-- 瀹氫箟鏃ュ織瀛樺偍鐨勮矾寰勶紝涓嶈閰嶇疆鐩稿璺緞 -->
+        <property name="FILE_PATH" value="./../logs/web" />
+        <property name="FILE_NAME" value="web" />
+    </Properties>
+
+    <appenders>
+        <console name="Console" target="SYSTEM_OUT">
+            <!--杈撳嚭鏃ュ織鐨勬牸寮�-->
+            <PatternLayout pattern="${LOG_PATTERN}"/>
+            <!--鎺у埗鍙板彧杈撳嚭level鍙婂叾浠ヤ笂绾у埆鐨勪俊鎭紙onMatch锛夛紝鍏朵粬鐨勭洿鎺ユ嫆缁濓紙onMismatch锛�-->
+            <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
+        </console>
+
+        <!--鏂囦欢浼氭墦鍗板嚭鎵�鏈変俊鎭紝杩欎釜log姣忔杩愯绋嬪簭浼氳嚜鍔ㄦ竻绌猴紝鐢盿ppend灞炴�у喅瀹氾紝閫傚悎涓存椂娴嬭瘯鐢�-->
+        <File name="Filelog" fileName="${FILE_PATH}/web.log" append="false">
+            <PatternLayout pattern="${LOG_PATTERN}"/>
+        </File>
+
+        <!-- 杩欎釜浼氭墦鍗板嚭鎵�鏈夌殑info鍙婁互涓嬬骇鍒殑淇℃伅锛屾瘡娆″ぇ灏忚秴杩噑ize锛屽垯杩檚ize澶у皬鐨勬棩蹇椾細鑷姩瀛樺叆鎸夊勾浠�-鏈堜唤寤虹珛鐨勬枃浠跺す涓嬮潰骞惰繘琛屽帇缂╋紝浣滀负瀛樻。-->
+        <RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/info.log" filePattern="${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_%i.log.gz">
+            <!--鎺у埗鍙板彧杈撳嚭level鍙婁互涓婄骇鍒殑淇℃伅锛坥nMatch锛夛紝鍏朵粬鐨勭洿鎺ユ嫆缁濓紙onMismatch锛�-->
+            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
+            <PatternLayout pattern="${LOG_PATTERN}"/>
+            <Policies>
+                <!--interval灞炴�х敤鏉ユ寚瀹氬涔呮粴鍔ㄤ竴娆★紝榛樿鏄�1 hour-->
+                <TimeBasedTriggeringPolicy interval="1"/>
+                <SizeBasedTriggeringPolicy size="10MB"/>
+            </Policies>
+            <!-- DefaultRolloverStrategy鍚屼竴鏂囦欢澶逛笅15涓枃浠跺紑濮嬭鐩� 涓嶈缃紝鍒欓粯璁や负鏈�澶氬悓涓�鏂囦欢澶逛笅7涓枃浠跺紑濮嬭鐩�-->
+            <DefaultRolloverStrategy max="15"/>
+        </RollingFile>
+
+        <!-- 杩欎釜浼氭墦鍗板嚭鎵�鏈夌殑warn鍙婁互涓嬬骇鍒殑淇℃伅锛屾瘡娆″ぇ灏忚秴杩噑ize锛屽垯杩檚ize澶у皬鐨勬棩蹇椾細鑷姩瀛樺叆鎸夊勾浠�-鏈堜唤寤虹珛鐨勬枃浠跺す涓嬮潰骞惰繘琛屽帇缂╋紝浣滀负瀛樻。-->
+        <RollingFile name="RollingFileWarn" fileName="${FILE_PATH}/warn.log" filePattern="${FILE_PATH}/${FILE_NAME}-WARN-%d{yyyy-MM-dd}_%i.log.gz">
+            <!--鎺у埗鍙板彧杈撳嚭level鍙婁互涓婄骇鍒殑淇℃伅锛坥nMatch锛夛紝鍏朵粬鐨勭洿鎺ユ嫆缁濓紙onMismatch锛�-->
+            <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
+            <PatternLayout pattern="${LOG_PATTERN}"/>
+            <Policies>
+                <!--interval灞炴�х敤鏉ユ寚瀹氬涔呮粴鍔ㄤ竴娆★紝榛樿鏄�1 hour-->
+                <TimeBasedTriggeringPolicy interval="1"/>
+                <SizeBasedTriggeringPolicy size="10MB"/>
+            </Policies>
+            <!-- DefaultRolloverStrategy鍚屼竴鏂囦欢澶逛笅15涓枃浠跺紑濮嬭鐩� 涓嶈缃紝鍒欓粯璁や负鏈�澶氬悓涓�鏂囦欢澶逛笅7涓枃浠跺紑濮嬭鐩�-->
+            <DefaultRolloverStrategy max="15"/>
+        </RollingFile>
+
+        <!-- 杩欎釜浼氭墦鍗板嚭鎵�鏈夌殑error鍙婁互涓嬬骇鍒殑淇℃伅锛屾瘡娆″ぇ灏忚秴杩噑ize锛屽垯杩檚ize澶у皬鐨勬棩蹇椾細鑷姩瀛樺叆鎸夊勾浠�-鏈堜唤寤虹珛鐨勬枃浠跺す涓嬮潰骞惰繘琛屽帇缂╋紝浣滀负瀛樻。-->
+        <RollingFile name="RollingFileError" fileName="${FILE_PATH}/error.log" filePattern="${FILE_PATH}/${FILE_NAME}-ERROR-%d{yyyy-MM-dd}_%i.log.gz">
+            <!--鎺у埗鍙板彧杈撳嚭level鍙婁互涓婄骇鍒殑淇℃伅锛坥nMatch锛夛紝鍏朵粬鐨勭洿鎺ユ嫆缁濓紙onMismatch锛�-->
+            <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
+            <PatternLayout pattern="${LOG_PATTERN}"/>
+            <Policies>
+                <!--interval灞炴�х敤鏉ユ寚瀹氬涔呮粴鍔ㄤ竴娆★紝榛樿鏄�1 hour-->
+                <TimeBasedTriggeringPolicy interval="1"/>
+                <SizeBasedTriggeringPolicy size="10MB"/>
+            </Policies>
+            <!-- DefaultRolloverStrategy鍚屼竴鏂囦欢澶逛笅15涓枃浠跺紑濮嬭鐩� 涓嶈缃紝鍒欓粯璁や负鏈�澶氬悓涓�鏂囦欢澶逛笅7涓枃浠跺紑濮嬭鐩�-->
+            <DefaultRolloverStrategy max="15"/>
+        </RollingFile>
+    </appenders>
+
+    <!--Logger鑺傜偣鐢ㄦ潵鍗曠嫭鎸囧畾鏃ュ織鐨勫舰寮忥紝姣斿瑕佷负鎸囧畾鍖呬笅鐨刢lass鎸囧畾涓嶅悓鐨勬棩蹇楃骇鍒瓑銆�-->
+    <!--鐒跺悗瀹氫箟loggers锛屽彧鏈夊畾涔変簡logger骞跺紩鍏ョ殑appender锛宎ppender鎵嶄細鐢熸晥-->
+    <loggers>
+        <!--杩囨护鎺塻pring鍜宮ybatis鐨勪竴浜涙棤鐢ㄧ殑DEBUG淇℃伅-->
+        <logger name="org.mybatis" level="info" additivity="false">
+            <AppenderRef ref="Console"/>
+        </logger>
+        <!--鐩戞帶绯荤粺淇℃伅-->
+        <!--鑻ユ槸additivity璁句负false锛屽垯 瀛怢ogger 鍙細鍦ㄨ嚜宸辩殑appender閲岃緭鍑猴紝鑰屼笉浼氬湪 鐖禠ogger 鐨刟ppender閲岃緭鍑恒��-->
+        <Logger name="org.springframework" level="info" additivity="false">
+            <AppenderRef ref="Console"/>
+        </Logger>
+        <!--鏃ュ織绾у埆-->
+        <root level="info">
+            <appender-ref ref="Console"/>
+            <appender-ref ref="Filelog"/>
+            <appender-ref ref="RollingFileInfo"/>
+            <appender-ref ref="RollingFileWarn"/>
+            <appender-ref ref="RollingFileError"/>
+        </root>
+    </loggers>
+
+</configuration>
\ No newline at end of file
diff --git a/Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_ADD.md b/Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_ADD.md
new file mode 100644
index 0000000..14405cc
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_ADD.md
@@ -0,0 +1,150 @@
+#閫氱敤鐨勫鍔犲姛鑳�
+鎵�鏈夐�氱敤鐨勬寜閽殑js閮藉瓨鏀惧湪platform/actions涓�
+1. js鍚嶇О锛欱aseAddAction
+2. 鍔熻兘浣滅敤銆�
+   - 鏀寔瀹氫箟UI涓婁笅鏂囨潵灞曠ず椤甸潰锛屼篃鏀寔鐩存帴瀹氫箟琛ㄥ崟鏉ュ睍绀洪〉闈�
+   - 榛樿涓轰繚瀛樺拰鍙栨秷鎸夐挳锛屼繚瀛樼殑璺緞涓洪粯璁わ紝浣嗘槸鍙互閫氳繃鍙傛暟閰嶇疆鏉ユ浛鎹�
+3. 鍙傛暟鐨勪娇鐢�
+    |鍙傛暟鍚嶅瓧|鍙傛暟璇存槑|鍙傛暟绀轰緥|
+    |:--:|:--:|:--:|
+    |type|涓氬姟绫诲瀷|濡傛灉鍙傛暟娌℃湁閰嶇疆杩欎釜灞炴�э紝榛樿灏辩瓑浜庤繖涓寜閽墍鍦ㄧ殑缁勪欢鎵�灞炵殑涓氬姟绫诲瀷|
+    |form|琛ㄥ崟鐨勮嫳鏂囧悕瀛梶濡傛灉璁剧疆浜唂orm灏变笉鏄剧ずUI涓婁笅鏂囥�傝幏鍙栬〃鍗曠殑璺緞涓簑ebUIController/getFormDefineById銆俠tmType: 涓氬姟绫诲瀷锛屽�兼槸鎸夐挳鐨勫弬鏁颁腑鐨則ype锛沬d: 琛ㄥ崟鐨勮嫳鏂囧悕绉帮紝鍊兼槸鎸夐挳鐨勫弬鏁颁腑鐨刦orm|
+    |content|UI涓婁笅鏂囩殑鍚嶅瓧锛屼紭鍏堢骇灏忎簬form|
+    |initValue|鍒濆鍖栫殑鍊硷紝鍗抽〉闈㈠垵濮嬪寲鐨勬椂鍊欒缃殑鍊�.濡傛灉璁剧疆鍒欎笂涓�涓尯鍩熷繀椤婚�夋嫨鏁版嵁|娉ㄦ剰鍙兘瀛樺湪${xxx}鐨勫舰寮忥紝闇�瑕佸湪鍓嶇鏍规嵁鎸夐挳涓殑鍙傛暟dataStore鏉ュ鐞�.鍏朵腑root.${xxx}鍜宻ourceData.${xxx}鏄潵婧愭暟鎹潵鏇挎崲|
+    |url|鍚庡彴淇濆瓨鐨剈rl|榛樿涓簎iDataController/addSave|
+    |method|璇锋眰鍚庡彴鐨勬柟娉晐榛樿涓簆ost|
+    |backPath|鍚庡彴鐨勬湇鍔″悕瀛梶榛樿涓哄吋瀹规�т负true鏃剁瓑浜巔ath,鍚﹀垯涓簅bjectServicePath銆傚嵆configData.compatibility?path:configData.objectServicePath|
+    |postSourceData|淇濆瓨鐨勬椂鍊欐槸鍚﹀彂閫佹潵婧愭暟鎹畖榛樿涓篺alse|
+    |postSelectData|淇濆瓨鐨勬椂鍊欐槸鍚﹀彂閫侀�夋嫨鏁版嵁|榛樿涓篺alse|
+    |title|绐楀彛鐨勬爣棰榺form涓嶄负绌哄垯浣跨敤form鐨勬爣棰橈紱鍚﹀垯浣跨敤UI涓婁笅鏂囩殑鏃跺繀椤昏閰嶇疆.鏀寔${xxx}鍜宻ourceData.${xxx}琛ㄨ揪寮弢
+    |width|绐楀彛鐨勫搴榛樿鏄敱layer鑷�傚簲鐨剕
+    |height|绐楀彛鐨勯珮搴榛樿鏄敱layer鑷�傚簲鐨剕
+    |hiddenButton|鏄惁闅愯棌淇濆瓨鍜屽彇娑堟寜閽紝boolean绫诲瀷锛寍鍦ㄩ厤缃甤ontent鐨勬椂鍊欙紝鍦║I瀹氫箟涓婂凡缁忓寘鍚簡淇濆瓨鍜屽彇娑堟寜閽殑鏃跺�欙紝闇�瑕侀殣钘忛粯璁ょ殑鎸夐挳|
+    |   |鏂囦欢涓婁紶| |
+    |uploadFileUrl| 鏂囦欢涓婁紶鐨勮矾寰剕榛樿涓簐ciFileUploadController/uploadFile|
+    |uploadFileBackPath|鏂囦欢涓婁紶鐨勬湇鍔″悕绉皘 榛樿涓哄吋瀹规�т负true鏃剁瓑浜巔ath锛屽惁鍒欎负fileServicePath|
+    |uploadAttachment|鍊间负true鍜宖alse鏄剧ず涓婁紶闄勪欢|闄勪欢鍙互娣诲姞澶氫釜|
+    |uploadAttachmentTitle|闄勪欢鏄剧ず鐨勫悕绉皘榛樿鏄剧ず涓�"闄勪欢"|
+    |   |鍓嶅悗缃簨浠秥|
+    |saveBeforeEvent|淇濆瓨鐨勫墠缃簨浠秥娉ㄦ剰涓庢寜閽湰韬殑鍓嶇疆浜嬩欢鍖哄垎|
+    |saveAfterEvent|淇濆瓨鐨勫悗缃簨浠秥涓嶈鏄惁鏈夊悗缃簨浠讹紝淇濆瓨鎴愬姛鍚庨兘闇�瑕佸埛鏂伴潰鏉縷
+    |beforeBSEvent|淇濆瓨鐨凚/S鐨勫墠缃簨浠秥鍗冲悗鍙板鐞嗙殑鏃跺�欑殑鍓嶇疆浜嬩欢|
+    |afterBSEvent|淇濆瓨鐨凚/S鐨勫悗缃簨浠秥鍗冲悗鍙板鐞嗙殑鏃跺�欑殑鍚庣疆浜嬩欢|
+    |beforeServerEvent|鏈嶅姟绔殑鍓嶇疆浜嬩欢|鍦ㄤ富鏈嶅姟閲屽鐞嗙殑浜嬩欢锛屾湁浜嬪姟鎺у埗锛屽彲浠ラ殢鎰忔搷浣滄暟鎹�.server绔殑鍓嶇疆浜嬩欢闇�瑕佸姞鍒颁富鏈嶅姟鐨勮繍琛岀幆澧冧腑锛屼竴鑸笉浣跨敤|
+    |afterServerEvent|鏈嶅姟绔殑鍚庣疆浜嬩欢|鍦ㄤ富鏈嶅姟閲屽鐞嗙殑浜嬩欢锛屼竴鑸槸澶氫釜涓氬姟鍔熻兘鏈夊叕鍏辩殑澶勭悊閮ㄥ垎鏄娇鐢▅
+    |   |鍓嶅悗缃簨浠剁殑鍊间娇鐢ㄦ爣鍑嗙殑閰嶇疆|jsPath#methodName?param=aaa&param1=bbb|
+
+4. 鏂囦欢瀛楁鐨勫鐞�.鏂囦欢涓婁紶缁勪欢閮戒笉鏄剧ず鏂囨。绫诲瀷鐨勪笅鎷夋銆�
+   - 琛ㄥ崟鏄剧ず闄勪欢涓婁紶銆傞渶瑕侀厤缃畊ploadAttachment涓簍rue锛岄〉闈細鏄剧ず鏂囦欢涓婁紶鐨勭粍浠讹紝浠庝笂浼犵殑杩斿洖缁撴灉涓幏鍙栧埌oid鐨勫睘鎬э紝鐒跺悗淇濆瓨鐨勬椂鍊欐妸杩欎釜oid鏀惧埌releaseFileOids
+   - 鏈夋枃浠惰矾寰勭殑瀛楁銆傝瀛楁鏄剧ず涓烘枃浠朵笂浼狅紝鍙兘涓�涓�備笂浼犲悗锛屼粠杩斿洖缁撴灉涓幏鍙杅ilePath锛屽瓨鍌ㄥ埌杩欎釜瀛楁涓娿��
+5. 淇濆瓨鏃堕渶瑕佹彁浜ょ殑鍙傛暟銆傞渶瑕佽浆鎹负json瀛楃涓茬殑鏂瑰紡鎻愪氦
+   - 闅愯棌灞炴�ц〃绀轰笉闇�瑕佸崟鐙鐞嗭紝瀹冩槸鍦ㄨ〃鍗曞姞杞芥垨鑰呮槸浠庢潵婧愭暟鎹噷鑾峰彇鐨勶紝涓嶄細鏄剧ず
+     |鍙傛暟鍚嶅瓧|鍙傛暟璇存槑|鍙傛暟绀轰緥鍜屽彇鍊紎
+     |:--:|:--:|:--:|
+     | |涓嬫柟鏄窡閰嶇疆鍜屾枃浠剁浉鍏崇殑||
+     |formDefineId|琛ㄥ崟鐨勫畾涔塈d锛屽繀杈搢绛変簬鎸夐挳鐨勫弬鏁颁腑鐨刦orm灞炴�э紱鎴栬�呮槸UI涓婁笅鏂囦腑鐨刦ormDefineVO|
+     |preEvent|鍓嶇疆浜嬩欢|鎸夐挳鍙傛暟涓婄殑beforeBSEvent|
+     |afterEvent|鍚庣疆浜嬩欢|鎸夐挳鍙傛暟涓婄殑afterBSEvent|
+     |beforeServerEvent|鏈嶅姟绔殑鍓嶇疆浜嬩欢|鏉ユ簮浜庢寜閽殑鍙傛暟|
+     |afterServerEvent|鏈嶅姟绔殑鍚庣疆鏃堕棿|鏉ユ簮浜庢寜閽殑鍙傛暟|
+     |releaseFileOids|闄勪欢鐨勬枃浠跺璞′富閿畖鏁扮粍鐨勫舰寮忋�傛瘮濡� releaseFileOids=["111","222"]|
+     | |涓嬫柟鍏ㄩ儴鏄暟鎹殑灞炴�|
+     |oid|涓婚敭|淇敼鐨勬椂鍊欙紝杩欎釜鍊煎繀杈搢
+     |id|缂栧彿|鏈塱d灞炴�х殑鏃跺�欐墠浼犻�抾
+     |name|鍚嶇О||
+     |description|鎻忚堪||
+     |revisionOid|鐗堟湰瀵硅薄鐨勪富閿畖涓�鑸慨鏀圭殑鏃跺�欐墠浼犻�掞紝灞炰簬榛樿鐨勯殣钘忓睘鎬
+     |nameOid|瀵硅薄鐨勪富閿畖涓�鑸慨鏀圭殑鏃跺�欐墠浼犻�掞紝灞炰簬榛樿鐨勯殣钘忓睘鎬
+     |btmname|涓氬姟绫诲瀷|蹇呰緭銆傛寜閽殑type鍙傛暟|
+     |lastR|鏄惁鏈�鍚庣増鏈瑋涓�鑸慨鏀圭殑鏃跺�欐墠浼犻�掞紝灞炰簬榛樿鐨勯殣钘忓睘鎬
+     |firstR|鏄惁棣栦釜鐗堟湰|涓�鑸慨鏀圭殑鏃跺�欐墠浼犻�掞紝灞炰簬榛樿鐨勯殣钘忓睘鎬
+     |lastV|鏄惁鏈�鍚庣増娆涓�鑸慨鏀圭殑鏃跺�欐墠浼犻�掞紝灞炰簬榛樿鐨勯殣钘忓睘鎬
+     |firstV|鏄惁棣栦釜鐗堟|涓�鑸慨鏀圭殑鏃跺�欐墠浼犻�掞紝灞炰簬榛樿鐨勯殣钘忓睘鎬
+     |creator|鍒涘缓浜簗鐢ㄦ埛鐨勮处鍙穦
+     |createTime|鍒涘缓鏃堕棿|鏃堕棿绫诲瀷锛岄渶瑕亂yyy-MM-dd HH:mm:ss|
+     |lastModifier|鏈�鍚庢椂闂磡鐢ㄦ埛鐨勮处鍙穦
+     |lastModifyTime|鏈�鍚庝慨鏀规椂闂磡鏃堕棿绫诲瀷锛岄渶瑕亂yyy-MM-dd HH:mm:ss|
+     |revisionRule|鐗堟湰鍙风殑瑙勫垯|淇敼鐨勬椂鍊欐墠浼犻�掞紝灞炰簬榛樿鐨勯殣钘忓睘鎬
+     |revisionSeq|鐗堟湰鐨勫簭鍙穦淇敼鐨勬椂鍊欐墠浼犻�掞紝灞炰簬榛樿鐨勯殣钘忓睘鎬
+     |revisionValue|鐗堟湰鐨勫�紎淇敼鐨勬椂鍊欐墠浼犻�掞紝灞炰簬榛樿鐨勯殣钘忓睘鎬
+     |versionRule|鐗堟鐨勮鍒檤淇敼鐨勬椂鍊欐墠浼犻�掞紝灞炰簬榛樿鐨勯殣钘忓睘鎬
+     |versionSeq|鐗堟鐨勫簭鍙穦淇敼鐨勬椂鍊欐墠浼犻�掞紝灞炰簬榛樿鐨勯殣钘忓睘鎬
+     |versionValue|鐗堟鐨勫�紎淇敼鐨勬椂鍊欐墠浼犻�掞紝灞炰簬榛樿鐨勯殣钘忓睘鎬
+     |lcStatus|鐘舵�佺殑鍊紎鐢熷懡鍛ㄦ湡鐨勭姸鎬侊紝涓�鑸笉浼犻�掞紝閮芥槸鍚庡彴澶勭悊銆備絾鏄紶閫掑悗浼樺厛绾ч珮浜庡悗鍙扮殑澶勭悊|
+     |ts|鏃堕棿鎴硘涓嶈鏀硅繖涓�硷紝琛ㄥ崟璇诲彇鍒扮殑鏄灏戯紝灏辫繑鍥炲灏戯紝yyyy-MM-dd HH:mm:ss.SSS|]
+     |owner|鎷ユ湁鑰厊涓�鑸瓑浜巆reator|
+     |checkInBy|绛惧叆鐨勭敤鎴穦鐢ㄦ埛鐨勮处鍙穦
+     |checkInTime|绛惧叆鐨勬椂闂磡鏃堕棿绫诲瀷锛岄渶瑕亂yyy-MM-dd HH:mm:ss|
+     |checkOutBy|绛惧嚭鐨勭敤鎴穦鐢ㄦ埛鐨勮处鍙穦
+     |checkOutTime|绛惧嚭鐨勬椂闂磡鏃堕棿绫诲瀷锛岄渶瑕亂yyy-MM-dd HH:mm:ss|
+     |copyFromVersion|浠庡摢涓増鏈嫹璐濊繃鏉ョ殑|鍗囩増鐨勬椂鍊欏繀杈搢
+     |secretGrade|瀵嗙骇|鏁板瓧鏍煎紡|
+     |data|鍏朵粬鐨勫睘鎬э紝灏辨槸闄や簡涓婇潰鐨勫睘鎬т互澶栵紝閮戒紶閫掑埌杩欎釜灞炴�ч噷|杩欎釜鏄痬ap鐨勫舰寮忥紝杞崲涓簀son瀛楃涓蹭箣鍓嶏紝鏄瘂xxxx:yyyy,zzz:aaa}杩欐牱鐨勫舰寮弢
+   - 绀轰緥
+    ```
+        //娣诲姞
+        {
+            "formDefineId":"11111",
+            "oid":"",
+            "name":"杩欎釜鏄悕绉帮紝鏍囬",
+            "btmname":"test",
+            "data":{
+                "attr1":"绗竴涓睘鎬х殑鍊�",
+                "attr2":"绗簩涓睘鎬х殑鍊�",
+                "attr3":3,
+                "attr4":"2021-01-01 12:12:12"
+            },
+            "releaseFileOids":["222","333","444"]
+         } 
+        //淇敼
+         {
+             "formDefineId":"11111",
+             "oid":"11111111111",
+             "ts":"021-01-01 12:12:12.345",
+             "name":"杩欎釜鏄悕绉帮紝鏍囬",
+             "btmname":"test",
+             "data":{
+                 "attr1":"绗竴涓睘鎬х殑鍊�",
+                 "attr2":"绗簩涓睘鎬х殑鍊�",
+                 "attr3":3,
+                 "attr4":"2021-01-01 12:12:12"
+             },
+             "releaseFileOids":["222","333","444"]
+          } 
+   ```  
+6. 鏂囦欢涓婁紶鐨勫弬鏁板鐞�
+  - 璺緞 vciFileUploadController/uploadFile
+  - 鍙傛暟
+     |鍙傛暟鍚嶅瓧|鍙傛暟璇存槑|鍙傛暟绀轰緥鍜屽彇鍊紎
+     |:--:|:--:|:--:|
+     |file|鏂囦欢缁勪欢閲�<input type="file" name="file"/>鐨勫悕绉皘涓嶈兘淇敼锛屽摢鎬曡〃鍗曢噷鏈夊涓枃浠剁被鍨嬬殑瀛楁|
+     |id|鏂囦欢鐨勬樉绀哄悕绉皘涓�鑸笉杈撳叆锛岄粯璁ょ殑鏄�夋嫨鐨勬枃浠剁殑鍚嶇О|
+     |fileDocClassify|鏂囨。鐨勪娇鐢ㄧ被鍨媩闄勪欢鐨勬椂鍊欙紝浣跨敤attachment;鏂囦欢璺緞鐨勭被鍨嬬殑瀛楁鏃讹紝浣跨敤filePathField;|
+     |fileDocClassifyName|鏂囨。鐨勪娇鐢ㄧ被鍨嬪悕绉皘闄勪欢鐨勬椂鍊欙紝浣跨敤"闄勪欢";鏂囦欢璺緞鐨勭被鍨嬬殑瀛楁鏃讹紝浣跨敤"鏂囦欢璺緞瀛楁";|
+     |secretGrade|瀵嗙骇|濡傛灉琛ㄥ崟涓婃湁瀵嗙骇瀛楁鏄剧ず鐨勬椂鍊欙紝鏂囦欢涓婁紶鐨勭粍浠剁殑鎵嶆樉绀哄瘑绾э紝涓旀枃浠剁殑瀵嗙骇<=鏁版嵁鐨勫瘑绾
+     |updateFileFlag|鏄惁涓轰慨鏀癸紝true琛ㄧず涓轰慨鏀箌闇�瑕佸拰oid閰嶅悎浣跨敤|
+     |fileOid|鏂囦欢鐨勪富閿畖鍙湪鏇存柊鐨勬椂鍊欐墠浼犻�掋�傚鏋滄槸鏂囦欢涓婚敭绫诲瀷鐨勫瓧娈垫椂锛屽氨鏄繖涓瓧娈电殑鍊硷紝鍚﹀垯浼氬湪琛ㄥ崟鐨勫姞杞芥暟鎹腑鑾峰彇鍒皘
+7. 浣跨敤content鐨勬柟寮忔樉绀虹殑椤甸潰鐨勪繚瀛樺鐞嗛�昏緫
+  - 鏀寔鐨勫満鏅�
+     |鍦烘櫙|鍦烘櫙璇存槑|
+     |:--:|:--:|
+     |鍗曚釜琛ㄥ崟锛屾棤鐗规畩鐨勫睍绀哄唴瀹箌寮虹儓涓嶆帹鑽愪娇鐢ㄨ繖绉嶆柟寮忥紝鍗曚釜琛ㄥ崟璇蜂娇鐢╢orm灞炴�ч厤缃殑鏂瑰紡|
+     |琛ㄥ崟鍔犵壒娈婅〃杈剧殑椤甸潰|姣斿澧炲姞琛ㄥ崟鐨勬煇涓瓧娈电殑棰勮绛夛紝杩欎簺鏁堟灉鍏ㄩ儴鏄窡琛ㄥ崟鐩稿叧鐨勩�備笉鏄富瀛愯〃鐨勫舰寮忋�傝繖绉嶅彲浠ュ皢鐗规畩鐨勯〉闈娇鐢ㄨ嚜瀹氫箟缁勪欢瀹屾垚|
+     |涓诲瓙琛▅鍗充富琛ㄦ樉绀轰负琛ㄥ崟锛屽瓙琛ㄦ樉绀轰负琛ㄦ牸銆備竴鑸瓙琛ㄦ彁渚涘琛岋紝鍒犺鐨勯粯璁ゆ搷浣滄寜閽�;杩欑甯哥敤鍦▁xx鐢宠鍗曠瓑鍗曟嵁涓妡
+     |涓�涓伙紝澶氫釜瀛愯〃|鍗充富琛ㄤ负琛ㄥ崟锛屽瓙琛ㄦ槸澶氫釜閫夐」鍗★紝閫夐」鍗′腑涓�鑸负琛ㄦ牸銆倈
+     |鍗曚釜琛ㄦ牸|甯哥敤鏄摼鎺ョ被鍨嬬殑鏌愪竴绔暟鎹殑娣诲姞|
+     |鑷畾涔夐〉闈鑷畾涔夐〉闈篃鏄负浜嗘暟鎹殑娣诲姞銆備絾鏄瘡涓〉闈㈠彧鑳芥槸鍗曠鏁版嵁鐨勬坊鍔爘
+  - 鏀寔鍦ㄩ〉闈笂鑾峰彇琛ㄥ崟锛岃〃鏍硷紝鏍戣〃锛岃嚜瀹氫箟鐨勬暟鎹紝涓嶆敮鎸佹爲鐨勬暟鎹紪杈戙��
+  - 椤甸潰涓婄殑缁勪欢锛岄渶瑕佸湪闄勫姞灞炴�т笂閰嶇疆涓庝笂涓�涓粍浠剁殑鏁版嵁鍏宠仈銆傞厤缃殑鏍煎紡绗﹀悎缁熶竴鐨勯檮鍔犲睘鎬х殑鏂瑰紡锛屽嵆xxx=yyy&zzz=aa銆傞厤缃殑闄勫姞灞炴�у涓�
+     |灞炴�у悕瀛梶灞炴�ц鏄巪绀轰緥鍜屽彇鍊紎
+     |:--:|:--:|:--:|
+     |onlyView|鍙槸鍋氭暟鎹睍绀簗鍗宠繖涓粍浠朵笉缂栬緫锛屽彧鏄仛灞曠ず锛涙垨鑰呮槸璇ョ粍浠剁嫭鑷繚瀛橈紝鍒欓渶瑕侀厤缃崟鐙殑淇濆瓨鎸夐挳|
+     |linkCompId|鍏宠仈鐨勭粍浠剁殑缂栧彿|榛樿鏄綋鍓嶇粍浠剁殑涓婁竴涓粍浠讹紙鏍规嵁缁勪欢鐨勬帓搴忓彿锛夛紱姣斿鍙互閰嶇疆涓哄涓瓙琛ㄧ殑鏂瑰紡|
+     |linkFieldName|蹇呰緭锛屽綋鍓嶄笟鍔$被鍨嬩腑涓庝笂涓�涓粍浠剁殑鍏宠仈鐨勫瓧娈祙濡傛灉鏄摼鎺ョ被鍨嬬殑鏃跺�欙紝榛樿涓篺_oid銆備篃鏀寔initValue${xxx}鍜宻ourceData.${xxx}鐨勬柟娉曪紙xxx鏄睘鎬х殑鍚嶇О锛墊
+     |directionFlag|鏄惁鍙嶅悜|褰撳墠缁勪欢鏄摼鎺ョ被鍨嬬殑鏃跺�欎娇鐢▅directionFlag涓簍rue鏃讹紝濡傛灉linkFieldName娌℃湁璁剧疆鍒欓粯璁や负t_oid|
+     |sourceFieldName|涓婁竴涓粍浠舵槸閾炬帴绫诲瀷鏃讹紝瀛樺湪鍏宠仈鐨勫睘鎬х殑鍚嶇О|涓氬姟绫诲瀷榛樿涓簅id锛岄摼鎺ョ被鍨嬩篃榛樿oid|
+  - 椤甸潰涓婄殑鎸夐挳鎺у埗
+    
+     
+   
+     
diff --git a/Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_DEL.md b/Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_DEL.md
new file mode 100644
index 0000000..02b107d
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_DEL.md
@@ -0,0 +1,48 @@
+#鍒犻櫎鏁版嵁鐨勯�氱敤澶勭悊
+鎵�鏈夐�氱敤鐨勬寜閽殑js閮藉瓨鏀惧湪platform/actions涓�
+1. js鍚嶇О锛欱aseDeleteAction
+2. 鍔熻兘浣滅敤銆�
+  - 鏀寔鎵归噺鍜屽崟鏉″垹闄�
+3. 鍙傛暟璇存槑
+  |鍙傛暟鍚嶅瓧|鍙傛暟璇存槑|鍙傛暟绀轰緥|
+  |:--:|:--:|:--:|  
+  |multi|鏄惁澶氭潯鏁版嵁|true琛ㄧず鍙互澶氶�夊垹闄ゃ�俧alse琛ㄧず涓嶅閫夈�傞粯璁や负false|
+  |checkLinkedFlag|鏄惁鏍¢獙鏁版嵁鏄惁寮曠敤|true琛ㄧず鏍¢獙锛岄粯璁や负false|
+  |cascade|鏄惁绾ц仈鍒犻櫎|true琛ㄧず绾ц仈鍒犻櫎锛岃繖绉嶅彧鏄湪鑷弬鐓х殑鐨勬椂鍊欎娇鐢▅
+  |adminCascade|楂樼骇绾ц仈鍒犻櫎|true琛ㄧず楂樼骇绾ц仈鍒犻櫎锛屽彧鏈塧dmin鐢ㄦ埛鍙互鍒犻櫎.瀹冧細鍒犻櫎杩欎釜鏁版嵁鍏宠仈鐨勬墍鏈夌殑鏁版嵁鍜屾枃浠跺叏閮ㄥ垹闄
+  |confirmMsg|鍒犻櫎鍓嶇殑鎻愮ず璇彞|榛樿涓烘槸鍚﹀垹闄よ繖鏉★紙杩欎簺锛夋暟鎹畖
+  |checkNotDelete|灞炴�х殑鍊肩鍚堟潯浠舵椂涓嶈兘鍒犻櫎|xxx=yyy&zzz=aaa鐨勬柟寮忋�備娇鐢ㄥ垎鍙峰垎鍓诧紝=鍓嶆槸灞炴�э紝=鍚庢槸灞炴�х殑鍊紎
+  |checkNotDeleteMsg|涓嶈兘鍒犻櫎鏃剁殑鎻愮ず璇彞|榛樿鈥滃綋鍓嶆暟鎹笉鍏佽鍒犻櫎".鏀寔${xxx}鏂瑰紡鐢ㄥ睘鎬ф潵浠f浛|
+  |checkOnBack|鏄惁鍦ㄥ悗鍙版牎楠寍true,false銆傞粯璁や负false,鍗充负鍓嶇鏍¢獙|
+  |successMsg|鎴愬姛鍚庣殑鎻愮ず璇彞|"鍒犻櫎鎴愬姛"銆傝繖涓紭鍏堢骇灏忎簬鍚庡彴杩斿洖鐨勬彁绀鸿鍙
+  |url|鍚庡彴淇濆瓨鐨剈rl|榛樿涓簎iDataController/deleteData|
+  |method|璇锋眰鍚庡彴鐨勬柟娉晐榛樿涓篸elete|
+  |backPath|鍚庡彴鐨勬湇鍔″悕瀛梶榛樿涓哄吋瀹规�т负true鏃剁瓑浜巔ath,鍚﹀垯涓簅bjectServicePath銆傚嵆configData.compatibility?path:configData.objectServicePath|
+  |postSourceData|淇濆瓨鐨勬椂鍊欐槸鍚﹀彂閫佹潵婧愭暟鎹畖榛樿涓篺alse|
+  |postSelectData|淇濆瓨鐨勬椂鍊欐槸鍚﹀彂閫侀�夋嫨鏁版嵁|榛樿涓篺alse|
+  |   |鍓嶅悗缃簨浠秥|
+  |beforeEvent|鍒犻櫎鐨勫墠缃簨浠秥|
+  |afterEvent|鍒犻櫎鐨勫悗缃簨浠秥涓嶈鏄惁鏈夊悗缃簨浠讹紝鍒犻櫎鎴愬姛鍚庨兘闇�瑕佸埛鏂伴潰鏉縷
+  |beforeBSEvent|淇濆瓨鐨凚/S鐨勫墠缃簨浠秥鍗冲悗鍙板鐞嗙殑鏃跺�欑殑鍓嶇疆浜嬩欢|
+  |afterBSEvent|淇濆瓨鐨凚/S鐨勫悗缃簨浠秥鍗冲悗鍙板鐞嗙殑鏃跺�欑殑鍚庣疆浜嬩欢|
+  |beforeServerEvent|鏈嶅姟绔殑鍓嶇疆浜嬩欢|鍦ㄤ富鏈嶅姟閲屽鐞嗙殑浜嬩欢锛屾湁浜嬪姟鎺у埗锛屽彲浠ラ殢鎰忔搷浣滄暟鎹�.server绔殑鍓嶇疆浜嬩欢闇�瑕佸姞鍒颁富鏈嶅姟鐨勮繍琛岀幆澧冧腑锛屼竴鑸笉浣跨敤|
+  |afterServerEvent|鏈嶅姟绔殑鍚庣疆浜嬩欢|鍦ㄤ富鏈嶅姟閲屽鐞嗙殑浜嬩欢锛屼竴鑸槸澶氫釜涓氬姟鍔熻兘鏈夊叕鍏辩殑澶勭悊閮ㄥ垎鏄娇鐢▅
+  |   |鍓嶅悗缃簨浠剁殑鍊间娇鐢ㄦ爣鍑嗙殑閰嶇疆|jsPath#methodName?param=aaa&param1=bbb|    
+4. 璋冪敤鍚庡彴鎺ュ彛瀹炵幇鍒犻櫎
+  - 鍙戦�佸弬鏁�
+  
+  ```
+    {
+        "checkLinkedFlag":false,//鏄惁鏍¢獙琚紩鐢�,true,false銆傛潵婧愪簬鍙傛暟checkLinkedFlag
+        "cascade":false,//鏄惁绾ц仈鍒犻櫎.鏉ユ簮浜庡弬鏁癱ascade
+        "adminCascade":false,//楂樼骇绾ц仈鍒犻櫎锛屾潵婧愪簬鍙傛暟cascade
+        "checkNotDelete":"涓嶈兘鍒犻櫎鐨勫睘鎬�,褰揷heckOnBack鍙傛暟涓簍rue鏃朵紶閫�",
+        "checkNotDeleteMsg":"涓嶈兘鍒犻櫎鐨勬彁绀鸿鍙ワ紝褰揷heckOnBack鍙傛暟涓簍rue鏃朵紶閫�",
+        "dataList":[{
+            "oid":"涓婚敭",
+            "ts":"鏃堕棿鎴�",
+            "btmname":"涓氬姟绫诲瀷"
+        }]
+    }
+  ```
+    
\ No newline at end of file
diff --git a/Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_EDIT.md b/Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_EDIT.md
new file mode 100644
index 0000000..7c64436
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_EDIT.md
@@ -0,0 +1,173 @@
+#閫氱敤鐨勪慨鏀瑰姛鑳�
+鎵�鏈夐�氱敤鐨勬寜閽殑js閮藉瓨鏀惧湪platform/actions涓�
+1. js鍚嶇О锛欱aseEditAction
+2. 鍔熻兘浣滅敤銆�
+   - 鏀寔瀹氫箟UI涓婁笅鏂囨潵灞曠ず椤甸潰锛屼篃鏀寔鐩存帴瀹氫箟琛ㄥ崟鏉ュ睍绀洪〉闈�
+   - 榛樿涓轰繚瀛樺拰鍙栨秷鎸夐挳锛屼繚瀛樼殑璺緞涓洪粯璁わ紝浣嗘槸鍙互閫氳繃鍙傛暟閰嶇疆鏉ユ浛鎹�
+3. 鍙傛暟鐨勪娇鐢�
+    |鍙傛暟鍚嶅瓧|鍙傛暟璇存槑|鍙傛暟绀轰緥|
+    |:--:|:--:|:--:|
+    |type|涓氬姟绫诲瀷|濡傛灉鍙傛暟娌℃湁閰嶇疆杩欎釜灞炴�э紝榛樿灏辩瓑浜庤繖涓寜閽墍鍦ㄧ殑缁勪欢鎵�灞炵殑涓氬姟绫诲瀷|
+    |form|琛ㄥ崟鐨勮嫳鏂囧悕瀛梶濡傛灉璁剧疆浜唂orm灏变笉鏄剧ずUI涓婁笅鏂囥�傝幏鍙栬〃鍗曠殑璺緞涓簑ebUIController/getFormDefineById銆俠tmType: 涓氬姟绫诲瀷锛屽�兼槸鎸夐挳鐨勫弬鏁颁腑鐨則ype锛沬d: 琛ㄥ崟鐨勮嫳鏂囧悕绉帮紝鍊兼槸鎸夐挳鐨勫弬鏁颁腑鐨刦orm|
+    |content|UI涓婁笅鏂囩殑鍚嶅瓧锛屼紭鍏堢骇灏忎簬form|
+    |getDataUrl|鑾峰彇鏁版嵁鐨勮矾寰剕榛樿涓簎iDataController/dataFormQuery|
+    |getDataBackPath|鑾峰彇鏁版嵁鐨勬湇鍔榛樿涓哄吋瀹规�т负true鏃剁瓑浜巔ath,鍚﹀垯涓簅bjectServicePath銆傚嵆configData.compatibility?path:configData.objectServicePath|
+    |getDataMethod|鑾峰彇鏁版嵁鐨勬柟娉曠被鍨媩榛樿涓篻et|
+    |url|鍚庡彴淇濆瓨鐨剈rl|榛樿涓簎iDataController/editSave|
+    |method|璇锋眰鍚庡彴鐨勬柟娉晐榛樿涓簆ut|
+    |backPath|鍚庡彴鐨勬湇鍔″悕瀛梶榛樿涓哄吋瀹规�т负true鏃剁瓑浜巔ath,鍚﹀垯涓簅bjectServicePath銆傚嵆configData.compatibility?path:configData.objectServicePath|
+    |title|绐楀彛鐨勬爣棰榺form涓嶄负绌哄垯浣跨敤form鐨勬爣棰橈紱鍚﹀垯浣跨敤UI涓婁笅鏂囩殑鏃跺繀椤昏閰嶇疆銆傛敮鎸�${xxx}鍜宻ourceData.${xxx}琛ㄨ揪寮弢
+    |width|绐楀彛鐨勫搴榛樿鏄敱layer鑷�傚簲鐨剕
+    |height|绐楀彛鐨勯珮搴榛樿鏄敱layer鑷�傚簲鐨剕
+    |checkNotEdit|灞炴�х殑鍊肩鍚堟潯浠舵椂涓嶈兘淇敼|xxx=yyy&zzz=aaa鐨勬柟寮忋�備娇鐢�&鍒嗗壊锛�=鍓嶆槸灞炴�э紝=鍚庢槸灞炴�х殑鍊笺�傚彧瑕佷竴涓潯浠舵弧瓒冲悗灏变笉鑳界紪杈憒
+    |checkNotEditMsg|涓嶈兘淇敼鏃剁殑鎻愮ず璇彞|榛樿鈥滃綋鍓嶆暟鎹笉鍏佽淇敼"|
+    |successMsg|鎴愬姛鍚庣殑鎻愮ず璇彞|榛樿title+"鎴愬姛"銆傝繖涓紭鍏堢骇灏忎簬鍚庡彴杩斿洖鐨勬彁绀鸿鍙
+    |postSourceData|淇濆瓨鐨勬椂鍊欐槸鍚﹀彂閫佹潵婧愭暟鎹畖榛樿涓篺alse|
+    |postSelectData|淇濆瓨鐨勬椂鍊欐槸鍚﹀彂閫侀�夋嫨鏁版嵁|榛樿涓篺alse|
+    |   |鏂囦欢涓婁紶| |
+    |uploadFileUrl| 鏂囦欢涓婁紶鐨勮矾寰剕榛樿涓簐ciFileUploadController/uploadFile|
+    |uploadFileBackPath|鏂囦欢涓婁紶鐨勬湇鍔″悕绉皘 榛樿涓哄吋瀹规�т负true鏃剁瓑浜巔ath锛屽惁鍒欎负fileServicePath|
+    |uploadAttachment|鍊间负true鍜宖alse鏄剧ず涓婁紶闄勪欢|闄勪欢鍙互娣诲姞澶氫釜|
+    |uploadAttachmentTitle|闄勪欢鏄剧ず鐨勫悕绉皘榛樿鏄剧ず涓�"闄勪欢"|
+    |   |鍓嶅悗缃簨浠秥|
+    |saveBeforeEvent|淇濆瓨鐨勫墠缃簨浠秥娉ㄦ剰涓庢寜閽湰韬殑鍓嶇疆浜嬩欢鍖哄垎|
+    |saveAfterEvent|淇濆瓨鐨勫悗缃椂闂磡涓嶈鏄惁鏈夊悗缃簨浠讹紝淇濆瓨鎴愬姛鍚庨兘闇�瑕佸埛鏂伴潰鏉縷
+    |beforeBSEvent|淇濆瓨鐨凚/S鐨勫墠缃簨浠秥鍗冲悗鍙板鐞嗙殑鏃跺�欑殑鍓嶇疆浜嬩欢|
+    |afterBSEvent|淇濆瓨鐨凚/S鐨勫悗缃簨浠秥鍗冲悗鍙板鐞嗙殑鏃跺�欑殑鍚庣疆浜嬩欢|
+    |beforeServerEvent|鏈嶅姟绔殑鍓嶇疆浜嬩欢|鍦ㄤ富鏈嶅姟閲屽鐞嗙殑浜嬩欢锛屾湁浜嬪姟鎺у埗锛屽彲浠ラ殢鎰忔搷浣滄暟鎹�.server绔殑鍓嶇疆浜嬩欢闇�瑕佸姞鍒颁富鏈嶅姟鐨勮繍琛岀幆澧冧腑锛屼竴鑸笉浣跨敤|
+    |afterServerEvent|鏈嶅姟绔殑鍚庣疆鏃堕棿|鍦ㄤ富鏈嶅姟閲屽鐞嗙殑浜嬩欢锛屼竴鑸槸澶氫釜涓氬姟鍔熻兘鏈夊叕鍏辩殑澶勭悊閮ㄥ垎鏄娇鐢▅
+    |   |鍓嶅悗缃簨浠剁殑鍊间娇鐢ㄦ爣鍑嗙殑閰嶇疆|jsPath#methodName?param=aaa&param1=bbb|
+4. 鑾峰彇鏁版嵁
+   - 鏍规嵁getDataUrl鍙傛暟鏉ヨ皟鐢ㄥ悗鍙�.
+   - 鍙傛暟
+       |鍙傛暟鍚嶅瓧|鍙傛暟璇存槑|鍙傛暟绀轰緥|
+       |:--:|:--:|:--:|
+       |btmname|涓氬姟绫诲瀷|鍙互浠庢暟鎹噷鑾峰彇,涔熷彲浠ユ槸鎸夐挳涓婂畾涔夌殑type鍙傛暟|
+       |oid|涓婚敭|浠庨�夋嫨鐨勬暟鎹腑鑾峰彇|
+       |formDefineId|琛ㄥ崟鐨勫畾涔夌紪鍙穦form鍙傛暟|
+       |sourceDataMap|鏉ユ簮鏁版嵁|鎸夐挳鎵�灞炵殑鍖哄煙鐨勬潵婧愭暟鎹畖
+   -杩斿洖鍊�
+       ```
+         "data":{
+               ... 杩欓噷鏄璞$殑鍊肩殑淇℃伅
+          },
+         "attachmentFileVOs":[{
+                "oid:"鏂囦欢鐨勪富閿�",
+                "id":"鏂囦欢鐨勬樉绀哄悕绉帮紝涓嶅惈鍚庣紑",
+                "name":"鏂囦欢鐨勭湡瀹炲悕绉帮紝涓嶅惈鍚庣紑",
+                "fileExtension":"鏂囦欢鐨勫悗缂�鍚�",
+                "fileDocClassify":"鏂囨。绫诲瀷",
+                "fileDocClassifyName":"鏂囨。绫诲瀷鐨勫悕绉�",
+                "fileSize":"鏂囦欢鐨勫ぇ灏�",
+                "downloadCount":"涓嬭浇娆℃暟",
+                "filePath":"鏂囦欢鍦ㄥ嵎鏂囦欢澶归噷瀛樻斁鐨勮矾寰�"
+            }] ,
+         "filePathFieldMap":{
+               "field杩欎釜鏄瓧娈电殑鍚嶇О":{
+                    "oid:"鏂囦欢鐨勪富閿�",
+                     "id":"鏂囦欢鐨勬樉绀哄悕绉帮紝涓嶅惈鍚庣紑",
+                     "name":"鏂囦欢鐨勭湡瀹炲悕绉帮紝涓嶅惈鍚庣紑",
+                     "fileExtension":"鏂囦欢鐨勫悗缂�鍚�",
+                     "fileDocClassify":"鏂囨。绫诲瀷",
+                     "fileDocClassifyName":"鏂囨。绫诲瀷鐨勫悕绉�",
+                     "fileSize":"鏂囦欢鐨勫ぇ灏�",
+                     "downloadCount":"涓嬭浇娆℃暟",
+                     "filePath":"鏂囦欢鍦ㄥ嵎鏂囦欢澶归噷瀛樻斁鐨勮矾寰�"
+               }
+         }   
+       ```     
+   
+5. 鏂囦欢瀛楁鐨勫鐞�.鏂囦欢涓婁紶缁勪欢閮戒笉鏄剧ず鏂囨。绫诲瀷鐨勪笅鎷夋銆�
+   - 琛ㄥ崟鏄剧ず闄勪欢涓婁紶銆傞渶瑕侀厤缃畊ploadAttachment涓簍rue锛岄〉闈細鏄剧ず鏂囦欢涓婁紶鐨勭粍浠讹紝浠庝笂浼犵殑杩斿洖缁撴灉涓幏鍙栧埌oid鐨勫睘鎬э紝鐒跺悗淇濆瓨鐨勬椂鍊欐妸杩欎釜oid鏀惧埌releaseFileOids
+   - 鏈夋枃浠惰矾寰勭殑瀛楁銆傝瀛楁鏄剧ず涓烘枃浠朵笂浼狅紝鍙兘涓�涓�備笂浼犲悗锛屼粠杩斿洖缁撴灉涓幏鍙杅ilePath锛屽瓨鍌ㄥ埌杩欎釜瀛楁涓娿��
+6. 淇濆瓨鏃堕渶瑕佹彁浜ょ殑鍙傛暟銆傞渶瑕佽浆鎹负json瀛楃涓茬殑鏂瑰紡鎻愪氦
+   - 闅愯棌灞炴�ц〃绀轰笉闇�瑕佸崟鐙鐞嗭紝瀹冩槸鍦ㄨ〃鍗曞姞杞芥垨鑰呮槸浠庢潵婧愭暟鎹噷鑾峰彇鐨勶紝涓嶄細鏄剧ず
+     |鍙傛暟鍚嶅瓧|鍙傛暟璇存槑|鍙傛暟绀轰緥鍜屽彇鍊紎
+     |:--:|:--:|:--:|
+     | |涓嬫柟鏄窡閰嶇疆鍜屾枃浠剁浉鍏崇殑||
+     |formDefineId|琛ㄥ崟鐨勫畾涔塈d锛屽繀杈搢绛変簬鎸夐挳鐨勫弬鏁颁腑鐨刦orm灞炴�э紱鎴栬�呮槸UI涓婁笅鏂囦腑鐨刦ormDefineVO|
+     |preEvent|鍓嶇疆浜嬩欢|鎸夐挳鍙傛暟涓婄殑beforeBSEvent|
+     |afterEvent|鍚庣疆浜嬩欢|鎸夐挳鍙傛暟涓婄殑afterBSEvent|
+     |beforeServerEvent|鏈嶅姟绔殑鍓嶇疆浜嬩欢|鏉ユ簮浜庢寜閽殑鍙傛暟|
+     |afterServerEvent|鏈嶅姟绔殑鍚庣疆鏃堕棿|鏉ユ簮浜庢寜閽殑鍙傛暟|
+     |releaseFileOids|闄勪欢鐨勬枃浠跺璞′富閿畖鏁扮粍鐨勫舰寮忋�傛瘮濡� releaseFileOids=["111","222"]|
+     | |涓嬫柟鍏ㄩ儴鏄暟鎹殑灞炴�|
+     |oid|涓婚敭|淇敼鐨勬椂鍊欙紝杩欎釜鍊煎繀杈搢
+     |id|缂栧彿|鏈塱d灞炴�х殑鏃跺�欐墠浼犻�抾
+     |name|鍚嶇О||
+     |description|鎻忚堪||
+     |revisionOid|鐗堟湰瀵硅薄鐨勪富閿畖涓�鑸慨鏀圭殑鏃跺�欐墠浼犻�掞紝灞炰簬榛樿鐨勯殣钘忓睘鎬
+     |nameOid|瀵硅薄鐨勪富閿畖涓�鑸慨鏀圭殑鏃跺�欐墠浼犻�掞紝灞炰簬榛樿鐨勯殣钘忓睘鎬
+     |btmname|涓氬姟绫诲瀷|蹇呰緭銆傛寜閽殑type鍙傛暟|
+     |lastR|鏄惁鏈�鍚庣増鏈瑋涓�鑸慨鏀圭殑鏃跺�欐墠浼犻�掞紝灞炰簬榛樿鐨勯殣钘忓睘鎬
+     |firstR|鏄惁棣栦釜鐗堟湰|涓�鑸慨鏀圭殑鏃跺�欐墠浼犻�掞紝灞炰簬榛樿鐨勯殣钘忓睘鎬
+     |lastV|鏄惁鏈�鍚庣増娆涓�鑸慨鏀圭殑鏃跺�欐墠浼犻�掞紝灞炰簬榛樿鐨勯殣钘忓睘鎬
+     |firstV|鏄惁棣栦釜鐗堟|涓�鑸慨鏀圭殑鏃跺�欐墠浼犻�掞紝灞炰簬榛樿鐨勯殣钘忓睘鎬
+     |creator|鍒涘缓浜簗鐢ㄦ埛鐨勮处鍙穦
+     |createTime|鍒涘缓鏃堕棿|鏃堕棿绫诲瀷锛岄渶瑕亂yyy-MM-dd HH:mm:ss|
+     |lastModifier|鏈�鍚庢椂闂磡鐢ㄦ埛鐨勮处鍙穦
+     |lastModifyTime|鏈�鍚庝慨鏀规椂闂磡鏃堕棿绫诲瀷锛岄渶瑕亂yyy-MM-dd HH:mm:ss|
+     |revisionRule|鐗堟湰鍙风殑瑙勫垯|淇敼鐨勬椂鍊欐墠浼犻�掞紝灞炰簬榛樿鐨勯殣钘忓睘鎬
+     |revisionSeq|鐗堟湰鐨勫簭鍙穦淇敼鐨勬椂鍊欐墠浼犻�掞紝灞炰簬榛樿鐨勯殣钘忓睘鎬
+     |revisionValue|鐗堟湰鐨勫�紎淇敼鐨勬椂鍊欐墠浼犻�掞紝灞炰簬榛樿鐨勯殣钘忓睘鎬
+     |versionRule|鐗堟鐨勮鍒檤淇敼鐨勬椂鍊欐墠浼犻�掞紝灞炰簬榛樿鐨勯殣钘忓睘鎬
+     |versionSeq|鐗堟鐨勫簭鍙穦淇敼鐨勬椂鍊欐墠浼犻�掞紝灞炰簬榛樿鐨勯殣钘忓睘鎬
+     |versionValue|鐗堟鐨勫�紎淇敼鐨勬椂鍊欐墠浼犻�掞紝灞炰簬榛樿鐨勯殣钘忓睘鎬
+     |lcStatus|鐘舵�佺殑鍊紎鐢熷懡鍛ㄦ湡鐨勭姸鎬侊紝涓�鑸笉浼犻�掞紝閮芥槸鍚庡彴澶勭悊銆備絾鏄紶閫掑悗浼樺厛绾ч珮浜庡悗鍙扮殑澶勭悊|
+     |ts|鏃堕棿鎴硘涓嶈鏀硅繖涓�硷紝琛ㄥ崟璇诲彇鍒扮殑鏄灏戯紝灏辫繑鍥炲灏戯紝yyyy-MM-dd HH:mm:ss.SSS|]
+     |owner|鎷ユ湁鑰厊涓�鑸瓑浜巆reator|
+     |checkInBy|绛惧叆鐨勭敤鎴穦鐢ㄦ埛鐨勮处鍙穦
+     |checkInTime|绛惧叆鐨勬椂闂磡鏃堕棿绫诲瀷锛岄渶瑕亂yyy-MM-dd HH:mm:ss|
+     |checkOutBy|绛惧嚭鐨勭敤鎴穦鐢ㄦ埛鐨勮处鍙穦
+     |checkOutTime|绛惧嚭鐨勬椂闂磡鏃堕棿绫诲瀷锛岄渶瑕亂yyy-MM-dd HH:mm:ss|
+     |copyFromVersion|浠庡摢涓増鏈嫹璐濊繃鏉ョ殑|鍗囩増鐨勬椂鍊欏繀杈搢
+     |secretGrade|瀵嗙骇|鏁板瓧鏍煎紡|
+     |data|鍏朵粬鐨勫睘鎬э紝灏辨槸闄や簡涓婇潰鐨勫睘鎬т互澶栵紝閮戒紶閫掑埌杩欎釜灞炴�ч噷|杩欎釜鏄痬ap鐨勫舰寮忥紝杞崲涓簀son瀛楃涓蹭箣鍓嶏紝鏄瘂xxxx:yyyy,zzz:aaa}杩欐牱鐨勫舰寮弢
+   - 绀轰緥
+    ```
+        //娣诲姞
+        {
+            "formDefineId":"11111",
+            "oid":"",
+            "name":"杩欎釜鏄悕绉帮紝鏍囬",
+            "btmname":"test",
+            "data":{
+                "attr1":"绗竴涓睘鎬х殑鍊�",
+                "attr2":"绗簩涓睘鎬х殑鍊�",
+                "attr3":3,
+                "attr4":"2021-01-01 12:12:12"
+            },
+            "releaseFileOids":["222","333","444"]
+         } 
+        //淇敼
+         {
+             "formDefineId":"11111",
+             "oid":"11111111111",
+             "ts":"021-01-01 12:12:12.345",
+             "name":"杩欎釜鏄悕绉帮紝鏍囬",
+             "btmname":"test",
+             "data":{
+                 "attr1":"绗竴涓睘鎬х殑鍊�",
+                 "attr2":"绗簩涓睘鎬х殑鍊�",
+                 "attr3":3,
+                 "attr4":"2021-01-01 12:12:12"
+             },
+             "releaseFileOids":["222","333","444"]
+          } 
+   ```  
+7. 鏂囦欢涓婁紶鐨勫弬鏁板鐞�
+  - 璺緞 vciFileUploadController/uploadFile
+  - 鍙傛暟
+     |鍙傛暟鍚嶅瓧|鍙傛暟璇存槑|鍙傛暟绀轰緥鍜屽彇鍊紎
+     |:--:|:--:|:--:|
+     |file|鏂囦欢缁勪欢閲�<input type="file" name="file"/>鐨勫悕绉皘涓嶈兘淇敼锛屽摢鎬曡〃鍗曢噷鏈夊涓枃浠剁被鍨嬬殑瀛楁|
+     |id|鏂囦欢鐨勬樉绀哄悕绉皘涓�鑸笉杈撳叆锛岄粯璁ょ殑鏄�夋嫨鐨勬枃浠剁殑鍚嶇О|
+     |fileDocClassify|鏂囨。鐨勪娇鐢ㄧ被鍨媩闄勪欢鐨勬椂鍊欙紝浣跨敤attachment;鏂囦欢璺緞鐨勭被鍨嬬殑瀛楁鏃讹紝浣跨敤filePathField;|
+     |fileDocClassifyName|鏂囨。鐨勪娇鐢ㄧ被鍨嬪悕绉皘闄勪欢鐨勬椂鍊欙紝浣跨敤"闄勪欢";鏂囦欢璺緞鐨勭被鍨嬬殑瀛楁鏃讹紝浣跨敤"鏂囦欢璺緞瀛楁";|
+     |secretGrade|瀵嗙骇|濡傛灉琛ㄥ崟涓婃湁瀵嗙骇瀛楁鏄剧ず鐨勬椂鍊欙紝鏂囦欢涓婁紶鐨勭粍浠剁殑鎵嶆樉绀哄瘑绾э紝涓旀枃浠剁殑瀵嗙骇<=鏁版嵁鐨勫瘑绾
+     |updateFileFlag|鏄惁涓轰慨鏀癸紝true琛ㄧず涓轰慨鏀箌闇�瑕佸拰fileOid閰嶅悎浣跨敤|
+     |fileOid|鏂囦欢鐨勪富閿畖鍙湪鏇存柊鐨勬椂鍊欐墠浼犻�掋�傚鏋滄槸鏂囦欢涓婚敭绫诲瀷鐨勫瓧娈垫椂锛屽氨鏄繖涓瓧娈电殑鍊硷紝鍚﹀垯浼氬湪琛ㄥ崟鐨勫姞杞芥暟鎹腑鑾峰彇鍒皘
+
+     
+   
+     
diff --git a/Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_FILEDOWNLOAD.md b/Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_FILEDOWNLOAD.md
new file mode 100644
index 0000000..172c043
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_FILEDOWNLOAD.md
@@ -0,0 +1,23 @@
+#鏂囦欢涓嬭浇
+鎵�鏈夐�氱敤鐨勬寜閽殑js閮藉瓨鏀惧湪platform/actions涓�
+1. js鍚嶇О锛欱aseFileDownloadAction
+2. 鍔熻兘浣滅敤銆�
+   - 浠庢枃浠跺垪琛ㄤ腑閫夋嫨鐨勬枃浠�
+   - 澶氫釜鏂囦欢鏃讹紝浼氭墦鎴恴ip鍖呬笅杞�
+   - 娉ㄦ剰鍥犱负鏁版ā鏂囦欢涓嶈兘閲嶅懡鍚嶏紝鎵�浠ュ鏋滃涓枃浠跺す鐨勫師濮嬪悕绉扮浉鍚屾椂锛屼細琚鐩栨帀鍐呭銆�
+3. 鍙傛暟鐨勪娇鐢�
+    |鍙傛暟鍚嶅瓧|鍙傛暟璇存槑|鍙傛暟绀轰緥|
+    |:--:|:--:|:--:|
+    |url|涓嬭浇鐨勫悗鍙版帴鍙vciFileDownloadController/downloadByFileOid|
+    |   |鍓嶅悗缃簨浠秥|
+    |beforeEvent|鏄剧ず鐨勫墠缃簨浠秥|
+    |afterEvent|绐楀彛鍏抽棴鐨勫悗缃簨浠秥|
+    |   |鍓嶅悗缃簨浠剁殑鍊间娇鐢ㄦ爣鍑嗙殑閰嶇疆|jsPath#methodName?param=aaa&param1=bbb|
+    |   |鍏朵粬鐨勮嚜瀹氫箟鍙傛暟||
+    |   |闄や簡浠ヤ笂鐨勫弬鏁帮紝鍏朵綑鑷鎵╁睍鐨勫弬鏁帮紝鍦╟ontent鏈夊�肩殑鎯呭喌涓嬶紝浣滀负sourceData浼犻�掑埌椤甸潰涓瓅
+4. 鏂囦欢涓嬭浇鐨勫鐞�
+  - 濡傛灉鏂囦欢鐨勬椂鍊欙紝灏嗘枃浠跺垪琛ㄤ腑閫夋嫨鏁版嵁(澶氭潯锛夌殑oid缁勫悎鎴愬瓧绗︿覆鍙戦�佺粰鍚庡彴锛堜娇鐢ㄩ�楀彿鍒嗗壊锛夛紝鍚庡彴鍙傛暟涓篺ileOid
+  
+     
+   
+     
diff --git a/Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_FILEUPLOAD.md b/Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_FILEUPLOAD.md
new file mode 100644
index 0000000..a088c9a
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_FILEUPLOAD.md
@@ -0,0 +1,38 @@
+#鏂囦欢涓婁紶鍜屼慨鏀�
+鎵�鏈夐�氱敤鐨勬寜閽殑js閮藉瓨鏀惧湪platform/actions涓�
+1. js鍚嶇О锛欱aseFileUploadAction
+2. 鍔熻兘浣滅敤銆�
+   - 涓婁紶鏂囦欢鍒版湇鍔″櫒涓�
+   - 濡傛灉绯荤粺鏀寔瀵嗙骇绠℃帶鏃讹紝鏂囦欢闇�瑕佹爣瀵嗐�傚悗鍙颁細鏍¢獙瀵嗙骇鐨勫唴瀹广��
+   - 鍙互鎵归噺娣诲姞鏂囦欢鍚庯紝鍐嶄笂浼�
+3. 鍙傛暟鐨勪娇鐢�
+    |鍙傛暟鍚嶅瓧|鍙傛暟璇存槑|鍙傛暟绀轰緥|
+    |:--:|:--:|:--:|
+    |fileDocClassify|鏂囦欢鐨勭敤閫旂紪鍙穦鑻辨枃鏍囪瘑锛屽彲浠ヤ负绌簗
+    |fileDocClassifyName|鏂囦欢鐨勭敤閫旇鏄巪涓枃鎻忚堪锛屽彲浠ヤ负绌猴紝濡傞檮浠讹紝涓绘枃妗o紝浣跨敤璇存槑绛墊
+    |ownbizOid|鏁版嵁鐨勪富閿畖涓嶅彲浠ヤ负绌猴紝榛樿涓虹偣鍑绘寜閽墍鍦ㄥ尯鍩熸潵婧愭暟鎹紙涓嶆槸閫夋嫨鏁版嵁锛夌殑oid灞炴�э紝鏀寔${xxx}琛ㄨ揪寮弢
+    |ownBtmname|鏁版嵁鐨勪笟鍔$被鍨媩涓嶅彲浠ヤ负绌猴紝榛樿涓虹偣鍑绘寜閽墍鍦ㄥ尯鍩熸潵婧愭暟鎹紙涓嶆槸閫夋嫨鏁版嵁锛夌殑btmname灞炴�с�傚鏋滄病鏈夎繖涓睘鎬э紝鍒欏垽鏂綋鍓嶆寜閽墍鍦ㄧ殑鍖哄煙鏄惁涓洪摼鎺ョ被鍨嬶紝鑾峰彇杩炴帴绫诲瀷鐨勫悕绉般�傛敮鎸�${xxx}琛ㄨ揪寮弢
+    |updateFileFlag|鏄惁涓轰慨鏀规枃浠秥榛樿涓篺alse,涓簍rue鐨勬椂鍊欒〃绀轰慨鏀癸紝閭h繖涓寜閽彧鑳介厤缃湪鏂囦欢鍒楄〃涓妡
+    |effect|鏄惁涓婁紶灏辩敓鏁坾榛樿涓簍rue銆傚鏋滀负false鏃讹紝鏂囦欢涓婁紶瀹屾垚鍚庣殑鐘舵�佹槸"浼犺緭瀹屾垚"銆傚惁鍒欎负"宸茬敓鏁�"|
+    |id|鏂囦欢鏄剧ず鐨勫悕绉皘鍚庡彴浼氶粯璁や负鏍规嵁鏂囦欢鏈韩鐨勫悕绉皘
+    |title|绐楀彛鐨勬爣棰榺榛樿涓衡�滀笂浼犳枃浠垛�濄�傛敮鎸�${xxx}琛ㄨ揪寮弢
+    |width|绐楀彛鐨勫搴榛樿鏄敱layer鑷�傚簲鐨剕
+    |height|绐楀彛鐨勯珮搴榛樿鏄敱layer鑷�傚簲鐨剕
+    |url|涓婁紶鐨勫悗鍙版帴鍙榛樿涓簐ciFileUploadController/uploadFile|
+    |checkSameFile|鏍¢獙鐩稿悓鍚嶇О鐨勬枃浠秥true,false銆傞粯璁や负true|
+    |   |鍓嶅悗缃簨浠秥|
+    |beforeEvent|鏄剧ず鐨勫墠缃簨浠秥|
+    |afterEvent|绐楀彛鍏抽棴鐨勫悗缃簨浠秥|
+    |   |鍓嶅悗缃簨浠剁殑鍊间娇鐢ㄦ爣鍑嗙殑閰嶇疆|jsPath#methodName?param=aaa&param1=bbb|
+4. 鏂囦欢涓婁紶鐨勫鐞�
+  - 涓婁紶鐨勬椂鍊欙紝閰嶇疆涓殑fileDocClassify,fileDocClassifyName,ownbizOid,ownBtmname,updateFileFlag,effect杩欎簺灞炴�ч渶瑕佷紶閫掔粰鍚庡彴
+  - 鏂囦欢鐨勬爣绛剧殑name蹇呴』鏄痜ile
+  - 濡傛灉updateFileFlag涓簍rue鏃讹紝蹇呴』瑕佸湪鏂囦欢鍒楄〃閲岄�夋嫨涓�鏉℃暟鎹紝蹇呴』鍒ゆ柇鏄枃浠跺璞★紙閫夋嫨鏁版嵁涓璪tmname灞炴�т负fileobject锛夈�傜劧鍚庝紶閫掔粰鍚庡彴鐨勫弬鏁板鍔爁ileOid,瀹冪殑鍊肩瓑浜庨�夋嫨鏁版嵁鐨刼id灞炴��
+5. 瀵嗙骇澶勭悊
+  - 鍦ㄩ渶瑕佹帶鍒跺瘑绾э紝鍗砪onfigData.controlSecret涓簍rue鏃讹紝闇�瑕佹樉绀烘枃浠跺瘑绾х殑涓嬫媺妗嗐�傝繖涓笅鎷夋鐨勫�煎皬浜庣瓑浜庨�夋嫨鐨勬暟鎹殑瀵嗙骇鍐呭  
+  - 鑾峰彇瀵嗙骇鐨勪笅鎷夋鐨勫悗鍙版帴鍙d负webEnumController/getDataEnum銆傚弬鏁颁负oid锛堟暟鎹殑涓婚敭锛屽嵆涓婃柟鐨刼wnbizOid鐨勫�硷級锛宐tmname(鏁版嵁鐨勪笟鍔$被鍨嬶紝鍗充笂鏂圭殑ownBtmname鐨勫��)
+  - 鏂囦欢涓婁紶鏃讹紝瀵嗙骇鐨勫睘鎬т负secretGrade锛屽鏋滀笉鎺у埗瀵嗙骇锛屽垯浼犻�掍负-1鍗冲彲
+  
+     
+   
+     
diff --git a/Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_LINKADD.md b/Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_LINKADD.md
new file mode 100644
index 0000000..e56cad9
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_LINKADD.md
@@ -0,0 +1,127 @@
+#閾炬帴绫诲瀷鐨勬坊鍔�
+鎵�鏈夐�氱敤鐨勬寜閽殑js閮藉瓨鏀惧湪platform/actions涓�
+1. js鍚嶇О锛欱aseLinkAddAction
+2. 鍔熻兘浣滅敤銆�
+   - 鏀寔瀹氫箟UI涓婁笅鏂囨潵灞曠ず椤甸潰锛屼篃鏀寔鐩存帴瀹氫箟琛ㄥ崟鏉ュ睍绀洪〉闈�
+   - 榛樿涓轰繚瀛樺拰鍙栨秷鎸夐挳锛屼繚瀛樼殑璺緞涓洪粯璁わ紝浣嗘槸鍙互閫氳繃鍙傛暟閰嶇疆鏉ユ浛鎹�
+3. 鍙傛暟鐨勪娇鐢�
+    |鍙傛暟鍚嶅瓧|鍙傛暟璇存槑|鍙傛暟绀轰緥|
+    |:--:|:--:|:--:|
+    |type|to绔殑涓氬姟绫诲瀷||
+    |linkType|閾炬帴绫诲瀷||
+    |form|琛ㄥ崟鐨勮嫳鏂囧悕瀛梶濡傛灉璁剧疆浜唂orm灏变笉鏄剧ずUI涓婁笅鏂囥�傝幏鍙栬〃鍗曠殑璺緞涓簑ebUIController/getFormDefineById銆俠tmType: 閾炬帴绫诲瀷锛屽�兼槸鎸夐挳鐨勫弬鏁颁腑鐨刲inkType锛沬d: 琛ㄥ崟鐨勮嫳鏂囧悕绉帮紝鍊兼槸鎸夐挳鐨勫弬鏁颁腑鐨刦orm|
+    |content|UI涓婁笅鏂囩殑鍚嶅瓧锛屼紭鍏堢骇灏忎簬form|
+    |direction|鏄惁鍙嶅悜|positive,p,false涓変釜鍊奸兘琛ㄧずfalse;true琛ㄧず鏄�夋嫨鐨則o绔殑鏁版嵁锛岀劧鍚庢坊鍔爁rom绔殑鏁版嵁|
+    |initValue|鍒濆鍖栫殑鍊硷紝鍗抽〉闈㈠垵濮嬪寲鐨勬椂鍊欒缃殑鍊�.蹇呴』璁剧疆|娉ㄦ剰鍙兘瀛樺湪${xxx}鐨勫舰寮忥紝闇�瑕佸湪鍓嶇鏍规嵁鎸夐挳涓殑鍙傛暟dataStore鏉ュ鐞�.鍏朵腑root.${xxx}鍜宻ourceData.${xxx}鏄潵婧愭暟鎹潵鏇挎崲|
+    |foid|from绔暟鎹殑琛ㄨ揪寮弢榛樿涓洪�夋嫨鐨勬暟鎹腑鑾峰彇oid灞炴�э紝direction涓簍rue鏃讹紝涓攆oid鏈夊�兼椂琛ㄧず涓ょ鐨勬暟鎹兘鏄鍒跺ソ鐨剕
+    |tooid|to绔暟鎹殑琛ㄨ揪寮弢direction涓簍rue鏃讹紝涓旇繖涓�间负绌烘椂浼氫粠閫夋嫨鏁版嵁涓幏鍙杘id灞炴�с�俤irection涓嶆槸true鏃讹紝tooid鏈夊�艰〃绀轰袱绔殑鏁版嵁閮芥槸棰勫埗濂界殑|
+    |url|鍚庡彴淇濆瓨鐨剈rl|榛樿涓簎iDataController/linkAddSave|
+    |method|璇锋眰鍚庡彴鐨勬柟娉晐榛樿涓簆ost|
+    |backPath|鍚庡彴鐨勬湇鍔″悕瀛梶榛樿涓哄吋瀹规�т负true鏃剁瓑浜巔ath,鍚﹀垯涓簅bjectServicePath銆傚嵆configData.compatibility?path:configData.objectServicePath|
+    |postSourceData|淇濆瓨鐨勬椂鍊欐槸鍚﹀彂閫佹潵婧愭暟鎹畖榛樿涓篺alse|
+    |postSelectData|淇濆瓨鐨勬椂鍊欐槸鍚﹀彂閫侀�夋嫨鏁版嵁|榛樿涓篺alse|
+    |title|绐楀彛鐨勬爣棰榺form涓嶄负绌哄垯浣跨敤form鐨勬爣棰橈紱鍚﹀垯浣跨敤UI涓婁笅鏂囩殑鏃跺繀椤昏閰嶇疆.鏀寔${xxx}鍜宻ourceData.${xxx}琛ㄨ揪寮弢
+    |width|绐楀彛鐨勫搴榛樿鏄敱layer鑷�傚簲鐨剕
+    |height|绐楀彛鐨勯珮搴榛樿鏄敱layer鑷�傚簲鐨剕
+    |hiddenButton|鏄惁闅愯棌淇濆瓨鍜屽彇娑堟寜閽紝boolean绫诲瀷锛寍鍦ㄩ厤缃甤ontent鐨勬椂鍊欙紝鍦║I瀹氫箟涓婂凡缁忓寘鍚簡淇濆瓨鍜屽彇娑堟寜閽殑鏃跺�欙紝闇�瑕侀殣钘忛粯璁ょ殑鎸夐挳|
+    |   |鏂囦欢涓婁紶| |
+    |uploadFileUrl| 鏂囦欢涓婁紶鐨勮矾寰剕榛樿涓簐ciFileUploadController/uploadFile|
+    |uploadFileBackPath|鏂囦欢涓婁紶鐨勬湇鍔″悕绉皘 榛樿涓哄吋瀹规�т负true鏃剁瓑浜巔ath锛屽惁鍒欎负fileServicePath|
+    |uploadAttachment|鍊间负true鍜宖alse鏄剧ず涓婁紶闄勪欢|闄勪欢鍙互娣诲姞澶氫釜|
+    |uploadAttachmentTitle|闄勪欢鏄剧ず鐨勫悕绉皘榛樿鏄剧ず涓�"闄勪欢"|
+    |   |鍓嶅悗缃簨浠秥|
+    |saveBeforeEvent|淇濆瓨鐨勫墠缃簨浠秥娉ㄦ剰涓庢寜閽湰韬殑鍓嶇疆浜嬩欢鍖哄垎|
+    |saveAfterEvent|淇濆瓨鐨勫悗缃簨浠秥涓嶈鏄惁鏈夊悗缃簨浠讹紝淇濆瓨鎴愬姛鍚庨兘闇�瑕佸埛鏂伴潰鏉縷
+    |beforeBSEvent|淇濆瓨鐨凚/S鐨勫墠缃簨浠秥鍗冲悗鍙板鐞嗙殑鏃跺�欑殑鍓嶇疆浜嬩欢|
+    |afterBSEvent|淇濆瓨鐨凚/S鐨勫悗缃簨浠秥鍗冲悗鍙板鐞嗙殑鏃跺�欑殑鍚庣疆浜嬩欢|
+    |beforeServerEvent|鏈嶅姟绔殑鍓嶇疆浜嬩欢|鍦ㄤ富鏈嶅姟閲屽鐞嗙殑浜嬩欢锛屾湁浜嬪姟鎺у埗锛屽彲浠ラ殢鎰忔搷浣滄暟鎹�.server绔殑鍓嶇疆浜嬩欢闇�瑕佸姞鍒颁富鏈嶅姟鐨勮繍琛岀幆澧冧腑锛屼竴鑸笉浣跨敤|
+    |afterServerEvent|鏈嶅姟绔殑鍚庣疆浜嬩欢|鍦ㄤ富鏈嶅姟閲屽鐞嗙殑浜嬩欢锛屼竴鑸槸澶氫釜涓氬姟鍔熻兘鏈夊叕鍏辩殑澶勭悊閮ㄥ垎鏄娇鐢▅
+    |   |鍓嶅悗缃簨浠剁殑鍊间娇鐢ㄦ爣鍑嗙殑閰嶇疆|jsPath#methodName?param=aaa&param1=bbb|
+
+4. 鏂囦欢瀛楁鐨勫鐞�.涓嶆樉绀烘枃妗g被鍨嬬殑涓嬫媺妗嗐��
+   - 琛ㄥ崟鏄剧ず闄勪欢涓婁紶銆傞渶瑕侀厤缃畊ploadAttachment涓簍rue锛岄〉闈細鏄剧ず鏂囦欢涓婁紶鐨勭粍浠讹紝浠庝笂浼犵殑杩斿洖缁撴灉涓幏鍙栧埌oid鐨勫睘鎬э紝鐒跺悗淇濆瓨鐨勬椂鍊欐妸杩欎釜oid鏀惧埌releaseFileOids
+   - 鏈夋枃浠惰矾寰勭殑瀛楁銆傝瀛楁鏄剧ず涓烘枃浠朵笂浼狅紝鍙兘涓�涓�備笂浼犲悗锛屼粠杩斿洖缁撴灉涓幏鍙杅ilePath锛屽瓨鍌ㄥ埌杩欎釜瀛楁涓娿��
+5. 淇濆瓨鏃堕渶瑕佹彁浜ょ殑鍙傛暟銆傞渶瑕佽浆鎹负json瀛楃涓茬殑鏂瑰紡鎻愪氦
+   - 闅愯棌灞炴�ц〃绀轰笉闇�瑕佸崟鐙鐞嗭紝瀹冩槸鍦ㄨ〃鍗曞姞杞芥垨鑰呮槸浠庢潵婧愭暟鎹噷鑾峰彇鐨勶紝涓嶄細鏄剧ず
+     |鍙傛暟鍚嶅瓧|鍙傛暟璇存槑|鍙傛暟绀轰緥鍜屽彇鍊紎
+     |:--:|:--:|:--:|
+     | |涓嬫柟鏄窡閰嶇疆鍜屾枃浠剁浉鍏崇殑||
+     |formDefineId|琛ㄥ崟鐨勫畾涔塈d锛屽繀杈搢绛変簬鎸夐挳鐨勫弬鏁颁腑鐨刦orm灞炴�э紱鎴栬�呮槸UI涓婁笅鏂囦腑鐨刦ormDefineVO|
+     |preEvent|鍓嶇疆浜嬩欢|鎸夐挳鍙傛暟涓婄殑beforeBSEvent|
+     |afterEvent|鍚庣疆浜嬩欢|鎸夐挳鍙傛暟涓婄殑afterBSEvent|
+     |beforeServerEvent|鏈嶅姟绔殑鍓嶇疆浜嬩欢|鏉ユ簮浜庢寜閽殑鍙傛暟|
+     |afterServerEvent|鏈嶅姟绔殑鍚庣疆鏃堕棿|鏉ユ簮浜庢寜閽殑鍙傛暟|
+     |releaseFileOids|闄勪欢鐨勬枃浠跺璞′富閿畖鏁扮粍鐨勫舰寮忋�傛瘮濡� releaseFileOids=["111","222"]|
+     | |涓嬫柟鍏ㄩ儴鏄暟鎹殑灞炴�|
+     |oid|涓婚敭|淇敼鐨勬椂鍊欙紝杩欎釜鍊煎繀杈搢
+     |creator|鍒涘缓浜簗鐢ㄦ埛鐨勮处鍙穦
+     |createTime|鍒涘缓鏃堕棿|鏃堕棿绫诲瀷锛岄渶瑕亂yyy-MM-dd HH:mm:ss|
+     |lastModifier|鏈�鍚庢椂闂磡鐢ㄦ埛鐨勮处鍙穦
+     |lastModifyTime|鏈�鍚庝慨鏀规椂闂磡鏃堕棿绫诲瀷锛岄渶瑕亂yyy-MM-dd HH:mm:ss|
+     |f_oid|from绔殑涓婚敭|鍗虫槸from绔暟鎹殑oid銆俤irection涓嶆槸true鏃讹紝蹇呰緭|
+     |f_revisionoid|from鐨勭増鏈富閿畖鍗虫槸from绔暟鎹噷鐨剅evisionOid|
+     |f_nameoid|from绔殑瀵硅薄涓婚敭|鍗虫槸from绔暟鎹噷鐨刵ameoid|
+     |f_btwname|from绔殑涓氬姟绫诲瀷|鍗虫槸from绔暟鎹噷鐨刡tmname|
+     |t_oid|to绔殑涓婚敭|鍗虫槸to绔暟鎹殑oid銆俤irection涓簍rue鏃讹紝蹇呰緭|
+     |t_revisionoid|to鐨勭増鏈富閿畖鍗虫槸to绔暟鎹噷鐨剅evisionOid|
+     |t_nameoid|to绔殑瀵硅薄涓婚敭|鍗虫槸to绔暟鎹噷鐨刵ameoid|
+     |t_btwname|to绔殑涓氬姟绫诲瀷|鍗虫槸to绔暟鎹噷鐨刡tmname|
+     |ts|鏃堕棿鎴硘涓嶈鏀硅繖涓�硷紝琛ㄥ崟璇诲彇鍒扮殑鏄灏戯紝灏辫繑鍥炲灏戯紝yyyy-MM-dd HH:mm:ss.SSS|]
+     |data|鍏朵粬鐨勫睘鎬э紝灏辨槸闄や簡涓婇潰鐨勫睘鎬т互澶栵紝閮戒紶閫掑埌杩欎釜灞炴�ч噷|杩欎釜鏄痬ap鐨勫舰寮忥紝杞崲涓簀son瀛楃涓蹭箣鍓嶏紝鏄瘂xxxx:yyyy,zzz:aaa}杩欐牱鐨勫舰寮弢
+   - 绀轰緥
+    ```
+        //娣诲姞
+        {
+            "formDefineId":"11111",
+            "oid":"",
+            "f_oid":"22222",
+            "f_btwname":"test",
+            "data":{
+                "attr1":"绗竴涓睘鎬х殑鍊�",
+                "attr2":"绗簩涓睘鎬х殑鍊�",
+                "attr3":3,
+                "attr4":"2021-01-01 12:12:12"
+            },
+            "releaseFileOids":["222","333","444"]
+         } 
+        //淇敼
+         {
+             "formDefineId":"11111",
+             "oid":"11111111111",
+             "f_oid":"22222",
+             "f_btwname":"test",
+             "data":{
+                 "attr1":"绗竴涓睘鎬х殑鍊�",
+                 "attr2":"绗簩涓睘鎬х殑鍊�",
+                 "attr3":3,
+                 "attr4":"2021-01-01 12:12:12"
+             },
+             "releaseFileOids":["222","333","444"]
+          } 
+   ```  
+6. 鏂囦欢涓婁紶鐨勫弬鏁板鐞�
+  - 璺緞 vciFileUploadController/uploadFile
+  - 鍙傛暟
+     |鍙傛暟鍚嶅瓧|鍙傛暟璇存槑|鍙傛暟绀轰緥鍜屽彇鍊紎
+     |:--:|:--:|:--:|
+     |file|鏂囦欢缁勪欢閲�<input type="file" name="file"/>鐨勫悕绉皘涓嶈兘淇敼锛屽摢鎬曡〃鍗曢噷鏈夊涓枃浠剁被鍨嬬殑瀛楁|
+     |id|鏂囦欢鐨勬樉绀哄悕绉皘涓�鑸笉杈撳叆锛岄粯璁ょ殑鏄�夋嫨鐨勬枃浠剁殑鍚嶇О|
+     |fileDocClassify|鏂囨。鐨勪娇鐢ㄧ被鍨媩闄勪欢鐨勬椂鍊欙紝浣跨敤attachment;鏂囦欢璺緞鐨勭被鍨嬬殑瀛楁鏃讹紝浣跨敤filePathField;|
+     |fileDocClassifyName|鏂囨。鐨勪娇鐢ㄧ被鍨嬪悕绉皘闄勪欢鐨勬椂鍊欙紝浣跨敤"闄勪欢";鏂囦欢璺緞鐨勭被鍨嬬殑瀛楁鏃讹紝浣跨敤"鏂囦欢璺緞瀛楁";|
+     |secretGrade|瀵嗙骇|濡傛灉琛ㄥ崟涓婃湁瀵嗙骇瀛楁鏄剧ず鐨勬椂鍊欙紝鏂囦欢涓婁紶鐨勭粍浠剁殑鎵嶆樉绀哄瘑绾э紝涓旀枃浠剁殑瀵嗙骇<=鏁版嵁鐨勫瘑绾
+     |updateFileFlag|鏄惁涓轰慨鏀癸紝true琛ㄧず涓轰慨鏀箌闇�瑕佸拰oid閰嶅悎浣跨敤|
+     |fileOid|鏂囦欢鐨勪富閿畖鍙湪鏇存柊鐨勬椂鍊欐墠浼犻�掋�傚鏋滄槸鏂囦欢涓婚敭绫诲瀷鐨勫瓧娈垫椂锛屽氨鏄繖涓瓧娈电殑鍊硷紝鍚﹀垯浼氬湪琛ㄥ崟鐨勫姞杞芥暟鎹腑鑾峰彇鍒皘
+7. 浣跨敤content鐨勬柟寮忔樉绀虹殑椤甸潰鐨勪繚瀛樺鐞嗛�昏緫
+  - 鏀寔鐨勫満鏅�
+     |鍦烘櫙|鍦烘櫙璇存槑|
+     |:--:|:--:|
+     |琛ㄥ崟鍔犵壒娈婅〃杈剧殑椤甸潰|姣斿澧炲姞琛ㄥ崟鐨勬煇涓瓧娈电殑棰勮绛夛紝杩欎簺鏁堟灉鍏ㄩ儴鏄窡琛ㄥ崟鐩稿叧鐨勩�傝繖绉嶅彲浠ュ皢鐗规畩鐨勯〉闈娇鐢ㄨ嚜瀹氫箟缁勪欢瀹屾垚|
+8. 鏀寔鐨勫満鏅�
+  - 鍗曠嫭娣诲姞閾炬帴绫诲瀷锛屾病鏈塼o绔殑浠讳綍鏁版嵁銆� 杩欑闇�瑕侀�夋嫨鍒皌o绔殑涓婚敭
+  - 娣诲姞閾炬帴绫诲瀷锛屽苟涓旀湁to绔殑灞炴�э紝to绔殑鏁版嵁鍦ㄧ郴缁熶腑杩樹笉瀛樺湪
+  - 娣诲姞閾炬帴绫诲瀷锛屽苟涓旀湁to绔殑灞炴�э紝涓攖o绔殑鏁版嵁鍦ㄧ郴缁熶腑宸茬粡瀛樺湪
+  - 娣诲姞閾炬帴绫诲瀷锛宼o绔殑鍗囩増鏈�
+  - 娣诲姞閾炬帴绫诲瀷锛宼o绔殑鍗囩増娆�   
+     
+   
+     
diff --git a/Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_LINKDEL.md b/Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_LINKDEL.md
new file mode 100644
index 0000000..d898c1e
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_LINKDEL.md
@@ -0,0 +1,51 @@
+#閾炬帴绫诲瀷鐨勯�氱敤鍒犻櫎
+鎵�鏈夐�氱敤鐨勬寜閽殑js閮藉瓨鏀惧湪platform/actions涓�
+1. js鍚嶇О锛欱aseLinkDeleteAction
+2. 鍔熻兘浣滅敤銆�
+  - 鏀寔鎵归噺鍜屽崟鏉″垹闄�
+3. 鍙傛暟璇存槑
+  |鍙傛暟鍚嶅瓧|鍙傛暟璇存槑|鍙傛暟绀轰緥|
+  |:--:|:--:|:--:|  
+  |multi|鏄惁澶氭潯鏁版嵁|true琛ㄧず鍙互澶氶�夊垹闄ゃ�俧alse琛ㄧず涓嶅閫夈�傞粯璁や负false|
+  |
+  |checkLinkedFlag|鏄惁鏍¢獙鏁版嵁鏄惁寮曠敤|true琛ㄧず鏍¢獙锛岄粯璁や负false|
+  |cascade|鏄惁绾ц仈鍒犻櫎|true琛ㄧず绾ц仈鍒犻櫎锛岃繖绉嶅彧鏄湪鑷弬鐓х殑鐨勬椂鍊欎娇鐢▅
+  |adminCascade|楂樼骇绾ц仈鍒犻櫎|true琛ㄧず楂樼骇绾ц仈鍒犻櫎锛屽彧鏈塧dmin鐢ㄦ埛鍙互鍒犻櫎.瀹冧細鍒犻櫎杩欎釜鏁版嵁鍏宠仈鐨勬墍鏈夌殑鏁版嵁鍜屾枃浠跺叏閮ㄥ垹闄
+  |deleteToData|鍒犻櫎to绔暟鎹畖榛樿涓簍rue|
+  |deleteFromDate|鍒犻櫎from绔暟鎹畖榛樿涓篺alse|
+  |confirmMsg|鍒犻櫎鍓嶇殑鎻愮ず璇彞|榛樿涓烘槸鍚﹀垹闄よ繖鏉★紙杩欎簺锛夋暟鎹畖
+  |checkNotDelete|灞炴�х殑鍊肩鍚堟潯浠舵椂涓嶈兘鍒犻櫎|xxx=yyy&zzz=aaa鐨勬柟寮忋�備娇鐢ㄥ垎鍙峰垎鍓诧紝=鍓嶆槸灞炴�э紝=鍚庢槸灞炴�х殑鍊紎
+  |checkNotDeleteMsg|涓嶈兘鍒犻櫎鏃剁殑鎻愮ず璇彞|榛樿鈥滃綋鍓嶆暟鎹笉鍏佽鍒犻櫎".鏀寔${xxx}鏂瑰紡鐢ㄥ睘鎬ф潵浠f浛|
+  |checkOnBack|鏄惁鍦ㄥ悗鍙版牎楠寍true,false銆傞粯璁や负false,鍗充负鍓嶇鏍¢獙|
+  |successMsg|鎴愬姛鍚庣殑鎻愮ず璇彞|"鍒犻櫎鎴愬姛"銆傝繖涓紭鍏堢骇灏忎簬鍚庡彴杩斿洖鐨勬彁绀鸿鍙
+  |url|鍚庡彴淇濆瓨鐨剈rl|榛樿涓簎iDataController/linkDeleteData|
+  |method|璇锋眰鍚庡彴鐨勬柟娉晐榛樿涓篸elete|
+  |backPath|鍚庡彴鐨勬湇鍔″悕瀛梶榛樿涓哄吋瀹规�т负true鏃剁瓑浜巔ath,鍚﹀垯涓簅bjectServicePath銆傚嵆configData.compatibility?path:configData.objectServicePath|
+  |postSourceData|淇濆瓨鐨勬椂鍊欐槸鍚﹀彂閫佹潵婧愭暟鎹畖榛樿涓篺alse|
+  |postSelectData|淇濆瓨鐨勬椂鍊欐槸鍚﹀彂閫侀�夋嫨鏁版嵁|榛樿涓篺alse|
+  |   |鍓嶅悗缃簨浠秥|
+  |beforeEvent|鍒犻櫎鐨勫墠缃簨浠秥|
+  |afterEvent|鍒犻櫎鐨勫悗缃簨浠秥涓嶈鏄惁鏈夊悗缃簨浠讹紝鍒犻櫎鎴愬姛鍚庨兘闇�瑕佸埛鏂伴潰鏉縷
+  |beforeBSEvent|淇濆瓨鐨凚/S鐨勫墠缃簨浠秥鍗冲悗鍙板鐞嗙殑鏃跺�欑殑鍓嶇疆浜嬩欢|
+  |afterBSEvent|淇濆瓨鐨凚/S鐨勫悗缃簨浠秥鍗冲悗鍙板鐞嗙殑鏃跺�欑殑鍚庣疆浜嬩欢|
+  |beforeServerEvent|鏈嶅姟绔殑鍓嶇疆浜嬩欢|鍦ㄤ富鏈嶅姟閲屽鐞嗙殑浜嬩欢锛屾湁浜嬪姟鎺у埗锛屽彲浠ラ殢鎰忔搷浣滄暟鎹�.server绔殑鍓嶇疆浜嬩欢闇�瑕佸姞鍒颁富鏈嶅姟鐨勮繍琛岀幆澧冧腑锛屼竴鑸笉浣跨敤|
+  |afterServerEvent|鏈嶅姟绔殑鍚庣疆浜嬩欢|鍦ㄤ富鏈嶅姟閲屽鐞嗙殑浜嬩欢锛屼竴鑸槸澶氫釜涓氬姟鍔熻兘鏈夊叕鍏辩殑澶勭悊閮ㄥ垎鏄娇鐢▅
+  |   |鍓嶅悗缃簨浠剁殑鍊间娇鐢ㄦ爣鍑嗙殑閰嶇疆|jsPath#methodName?param=aaa&param1=bbb|    
+4. 璋冪敤鍚庡彴鎺ュ彛瀹炵幇鍒犻櫎
+  - 鍙戦�佸弬鏁�
+  
+  ```
+    {
+        "checkLinkedFlag":false,//鏄惁鏍¢獙琚紩鐢�,true,false銆傛潵婧愪簬鍙傛暟checkLinkedFlag
+        "cascade":false,//鏄惁绾ц仈鍒犻櫎.鏉ユ簮浜庡弬鏁癱ascade
+        "adminCascade":false,//楂樼骇绾ц仈鍒犻櫎锛屾潵婧愪簬鍙傛暟cascade
+        "checkNotDelete":"涓嶈兘鍒犻櫎鐨勫睘鎬�,褰揷heckOnBack鍙傛暟涓簍rue鏃朵紶閫�",
+        "checkNotDeleteMsg":"涓嶈兘鍒犻櫎鐨勬彁绀鸿鍙ワ紝褰揷heckOnBack鍙傛暟涓簍rue鏃朵紶閫�",
+        "dataList":[{
+            "oid":"涓婚敭",
+            "ts":"鏃堕棿鎴�",
+            "linkType":"閾炬帴绫诲瀷"
+        }]
+    }
+  ```
+    
\ No newline at end of file
diff --git a/Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_LINKEDIT.md b/Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_LINKEDIT.md
new file mode 100644
index 0000000..de7f4f1
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_LINKEDIT.md
@@ -0,0 +1,120 @@
+#閾炬帴绫诲瀷鐨勪慨鏀�
+鎵�鏈夐�氱敤鐨勬寜閽殑js閮藉瓨鏀惧湪platform/actions涓�
+1. js鍚嶇О锛欱aseLinkEditAction
+2. 鍔熻兘浣滅敤銆�
+   - 鏀寔瀹氫箟UI涓婁笅鏂囨潵灞曠ず椤甸潰锛屼篃鏀寔鐩存帴瀹氫箟琛ㄥ崟鏉ュ睍绀洪〉闈�
+   - 榛樿涓轰繚瀛樺拰鍙栨秷鎸夐挳锛屼繚瀛樼殑璺緞涓洪粯璁わ紝浣嗘槸鍙互閫氳繃鍙傛暟閰嶇疆鏉ユ浛鎹�
+3. 鍙傛暟鐨勪娇鐢�
+    |鍙傛暟鍚嶅瓧|鍙傛暟璇存槑|鍙傛暟绀轰緥|
+    |:--:|:--:|:--:|
+    |type|to绔殑涓氬姟绫诲瀷||
+    |linkType|閾炬帴绫诲瀷||
+    |form|琛ㄥ崟鐨勮嫳鏂囧悕瀛梶濡傛灉璁剧疆浜唂orm灏变笉鏄剧ずUI涓婁笅鏂囥�傝幏鍙栬〃鍗曠殑璺緞涓簑ebUIController/getFormDefineById銆俠tmType: 閾炬帴绫诲瀷锛屽�兼槸鎸夐挳鐨勫弬鏁颁腑鐨刲inkType锛沬d: 琛ㄥ崟鐨勮嫳鏂囧悕绉帮紝鍊兼槸鎸夐挳鐨勫弬鏁颁腑鐨刦orm|
+    |content|UI涓婁笅鏂囩殑鍚嶅瓧锛屼紭鍏堢骇灏忎簬form|
+    |direction|鏄惁鍙嶅悜|positive,p,false涓変釜鍊奸兘琛ㄧずfalse;true琛ㄧず鏄�夋嫨鐨則o绔殑鏁版嵁锛岀劧鍚庢坊鍔爁rom绔殑鏁版嵁|
+    |url|鍚庡彴淇濆瓨鐨剈rl|榛樿涓簎iDataController/linkEditSave|
+    |method|璇锋眰鍚庡彴鐨勬柟娉晐榛樿涓簆ost|
+    |backPath|鍚庡彴鐨勬湇鍔″悕瀛梶榛樿涓哄吋瀹规�т负true鏃剁瓑浜巔ath,鍚﹀垯涓簅bjectServicePath銆傚嵆configData.compatibility?path:configData.objectServicePath|
+    |postSourceData|淇濆瓨鐨勬椂鍊欐槸鍚﹀彂閫佹潵婧愭暟鎹畖榛樿涓篺alse|
+    |postSelectData|淇濆瓨鐨勬椂鍊欐槸鍚﹀彂閫侀�夋嫨鏁版嵁|榛樿涓篺alse|
+    |title|绐楀彛鐨勬爣棰榺form涓嶄负绌哄垯浣跨敤form鐨勬爣棰橈紱鍚﹀垯浣跨敤UI涓婁笅鏂囩殑鏃跺繀椤昏閰嶇疆.鏀寔${xxx}鍜宻ourceData.${xxx}琛ㄨ揪寮弢
+    |width|绐楀彛鐨勫搴榛樿鏄敱layer鑷�傚簲鐨剕
+    |height|绐楀彛鐨勯珮搴榛樿鏄敱layer鑷�傚簲鐨剕
+    |hiddenButton|鏄惁闅愯棌淇濆瓨鍜屽彇娑堟寜閽紝boolean绫诲瀷锛寍鍦ㄩ厤缃甤ontent鐨勬椂鍊欙紝鍦║I瀹氫箟涓婂凡缁忓寘鍚簡淇濆瓨鍜屽彇娑堟寜閽殑鏃跺�欙紝闇�瑕侀殣钘忛粯璁ょ殑鎸夐挳|
+    |   |鏂囦欢涓婁紶| |
+    |uploadFileUrl| 鏂囦欢涓婁紶鐨勮矾寰剕榛樿涓簐ciFileUploadController/uploadFile|
+    |uploadFileBackPath|鏂囦欢涓婁紶鐨勬湇鍔″悕绉皘 榛樿涓哄吋瀹规�т负true鏃剁瓑浜巔ath锛屽惁鍒欎负fileServicePath|
+    |uploadAttachment|鍊间负true鍜宖alse鏄剧ず涓婁紶闄勪欢|闄勪欢鍙互娣诲姞澶氫釜|
+    |uploadAttachmentTitle|闄勪欢鏄剧ず鐨勫悕绉皘榛樿鏄剧ず涓�"闄勪欢"|
+    |   |鍓嶅悗缃簨浠秥|
+    |saveBeforeEvent|淇濆瓨鐨勫墠缃簨浠秥娉ㄦ剰涓庢寜閽湰韬殑鍓嶇疆浜嬩欢鍖哄垎|
+    |saveAfterEvent|淇濆瓨鐨勫悗缃簨浠秥涓嶈鏄惁鏈夊悗缃簨浠讹紝淇濆瓨鎴愬姛鍚庨兘闇�瑕佸埛鏂伴潰鏉縷
+    |beforeBSEvent|淇濆瓨鐨凚/S鐨勫墠缃簨浠秥鍗冲悗鍙板鐞嗙殑鏃跺�欑殑鍓嶇疆浜嬩欢|
+    |afterBSEvent|淇濆瓨鐨凚/S鐨勫悗缃簨浠秥鍗冲悗鍙板鐞嗙殑鏃跺�欑殑鍚庣疆浜嬩欢|
+    |beforeServerEvent|鏈嶅姟绔殑鍓嶇疆浜嬩欢|鍦ㄤ富鏈嶅姟閲屽鐞嗙殑浜嬩欢锛屾湁浜嬪姟鎺у埗锛屽彲浠ラ殢鎰忔搷浣滄暟鎹�.server绔殑鍓嶇疆浜嬩欢闇�瑕佸姞鍒颁富鏈嶅姟鐨勮繍琛岀幆澧冧腑锛屼竴鑸笉浣跨敤|
+    |afterServerEvent|鏈嶅姟绔殑鍚庣疆浜嬩欢|鍦ㄤ富鏈嶅姟閲屽鐞嗙殑浜嬩欢锛屼竴鑸槸澶氫釜涓氬姟鍔熻兘鏈夊叕鍏辩殑澶勭悊閮ㄥ垎鏄娇鐢▅
+    |   |鍓嶅悗缃簨浠剁殑鍊间娇鐢ㄦ爣鍑嗙殑閰嶇疆|jsPath#methodName?param=aaa&param1=bbb|
+
+4. 鏂囦欢瀛楁鐨勫鐞�.涓嶆樉绀烘枃妗g被鍨嬬殑涓嬫媺妗嗐��
+   - 琛ㄥ崟鏄剧ず闄勪欢涓婁紶銆傞渶瑕侀厤缃畊ploadAttachment涓簍rue锛岄〉闈細鏄剧ず鏂囦欢涓婁紶鐨勭粍浠讹紝浠庝笂浼犵殑杩斿洖缁撴灉涓幏鍙栧埌oid鐨勫睘鎬э紝鐒跺悗淇濆瓨鐨勬椂鍊欐妸杩欎釜oid鏀惧埌releaseFileOids
+   - 鏈夋枃浠惰矾寰勭殑瀛楁銆傝瀛楁鏄剧ず涓烘枃浠朵笂浼狅紝鍙兘涓�涓�備笂浼犲悗锛屼粠杩斿洖缁撴灉涓幏鍙杅ilePath锛屽瓨鍌ㄥ埌杩欎釜瀛楁涓娿��
+5. 淇濆瓨鏃堕渶瑕佹彁浜ょ殑鍙傛暟銆傞渶瑕佽浆鎹负json瀛楃涓茬殑鏂瑰紡鎻愪氦
+   - 闅愯棌灞炴�ц〃绀轰笉闇�瑕佸崟鐙鐞嗭紝瀹冩槸鍦ㄨ〃鍗曞姞杞芥垨鑰呮槸浠庢潵婧愭暟鎹噷鑾峰彇鐨勶紝涓嶄細鏄剧ず
+     |鍙傛暟鍚嶅瓧|鍙傛暟璇存槑|鍙傛暟绀轰緥鍜屽彇鍊紎
+     |:--:|:--:|:--:|
+     | |涓嬫柟鏄窡閰嶇疆鍜屾枃浠剁浉鍏崇殑||
+     |formDefineId|琛ㄥ崟鐨勫畾涔塈d锛屽繀杈搢绛変簬鎸夐挳鐨勫弬鏁颁腑鐨刦orm灞炴�э紱鎴栬�呮槸UI涓婁笅鏂囦腑鐨刦ormDefineVO|
+     |preEvent|鍓嶇疆浜嬩欢|鎸夐挳鍙傛暟涓婄殑beforeBSEvent|
+     |afterEvent|鍚庣疆浜嬩欢|鎸夐挳鍙傛暟涓婄殑afterBSEvent|
+     |beforeServerEvent|鏈嶅姟绔殑鍓嶇疆浜嬩欢|鏉ユ簮浜庢寜閽殑鍙傛暟|
+     |afterServerEvent|鏈嶅姟绔殑鍚庣疆鏃堕棿|鏉ユ簮浜庢寜閽殑鍙傛暟|
+     |releaseFileOids|闄勪欢鐨勬枃浠跺璞′富閿畖鏁扮粍鐨勫舰寮忋�傛瘮濡� releaseFileOids=["111","222"]|
+     | |涓嬫柟鍏ㄩ儴鏄暟鎹殑灞炴�|
+     |oid|涓婚敭|淇敼鐨勬椂鍊欙紝杩欎釜鍊煎繀杈搢
+     |creator|鍒涘缓浜簗鐢ㄦ埛鐨勮处鍙穦
+     |createTime|鍒涘缓鏃堕棿|鏃堕棿绫诲瀷锛岄渶瑕亂yyy-MM-dd HH:mm:ss|
+     |lastModifier|鏈�鍚庢椂闂磡鐢ㄦ埛鐨勮处鍙穦
+     |lastModifyTime|鏈�鍚庝慨鏀规椂闂磡鏃堕棿绫诲瀷锛岄渶瑕亂yyy-MM-dd HH:mm:ss|
+     |f_oid|from绔殑涓婚敭|鍗虫槸from绔暟鎹殑oid銆俤irection涓嶆槸true鏃讹紝蹇呰緭|
+     |f_revisionoid|from鐨勭増鏈富閿畖鍗虫槸from绔暟鎹噷鐨剅evisionOid|
+     |f_nameoid|from绔殑瀵硅薄涓婚敭|鍗虫槸from绔暟鎹噷鐨刵ameoid|
+     |f_btwname|from绔殑涓氬姟绫诲瀷|鍗虫槸from绔暟鎹噷鐨刡tmname|
+     |t_oid|to绔殑涓婚敭|鍗虫槸to绔暟鎹殑oid銆俤irection涓簍rue鏃讹紝蹇呰緭|
+     |t_revisionoid|to鐨勭増鏈富閿畖鍗虫槸to绔暟鎹噷鐨剅evisionOid|
+     |t_nameoid|to绔殑瀵硅薄涓婚敭|鍗虫槸to绔暟鎹噷鐨刵ameoid|
+     |t_btwname|to绔殑涓氬姟绫诲瀷|鍗虫槸to绔暟鎹噷鐨刡tmname|
+     |ts|鏃堕棿鎴硘涓嶈鏀硅繖涓�硷紝琛ㄥ崟璇诲彇鍒扮殑鏄灏戯紝灏辫繑鍥炲灏戯紝yyyy-MM-dd HH:mm:ss.SSS|]
+     |data|鍏朵粬鐨勫睘鎬э紝灏辨槸闄や簡涓婇潰鐨勫睘鎬т互澶栵紝閮戒紶閫掑埌杩欎釜灞炴�ч噷|杩欎釜鏄痬ap鐨勫舰寮忥紝杞崲涓簀son瀛楃涓蹭箣鍓嶏紝鏄瘂xxxx:yyyy,zzz:aaa}杩欐牱鐨勫舰寮弢
+   - 绀轰緥
+    ```
+        //娣诲姞
+        {
+            "formDefineId":"11111",
+            "oid":"",
+            "f_oid":"22222",
+            "f_btwname":"test",
+            "data":{
+                "attr1":"绗竴涓睘鎬х殑鍊�",
+                "attr2":"绗簩涓睘鎬х殑鍊�",
+                "attr3":3,
+                "attr4":"2021-01-01 12:12:12"
+            },
+            "releaseFileOids":["222","333","444"]
+         } 
+        //淇敼
+         {
+             "formDefineId":"11111",
+             "oid":"11111111111",
+             "f_oid":"22222",
+             "f_btwname":"test",
+             "data":{
+                 "attr1":"绗竴涓睘鎬х殑鍊�",
+                 "attr2":"绗簩涓睘鎬х殑鍊�",
+                 "attr3":3,
+                 "attr4":"2021-01-01 12:12:12"
+             },
+             "releaseFileOids":["222","333","444"]
+          } 
+   ```  
+6. 鏂囦欢涓婁紶鐨勫弬鏁板鐞�
+  - 璺緞 vciFileUploadController/uploadFile
+  - 鍙傛暟
+     |鍙傛暟鍚嶅瓧|鍙傛暟璇存槑|鍙傛暟绀轰緥鍜屽彇鍊紎
+     |:--:|:--:|:--:|
+     |file|鏂囦欢缁勪欢閲�<input type="file" name="file"/>鐨勫悕绉皘涓嶈兘淇敼锛屽摢鎬曡〃鍗曢噷鏈夊涓枃浠剁被鍨嬬殑瀛楁|
+     |id|鏂囦欢鐨勬樉绀哄悕绉皘涓�鑸笉杈撳叆锛岄粯璁ょ殑鏄�夋嫨鐨勬枃浠剁殑鍚嶇О|
+     |fileDocClassify|鏂囨。鐨勪娇鐢ㄧ被鍨媩闄勪欢鐨勬椂鍊欙紝浣跨敤attachment;鏂囦欢璺緞鐨勭被鍨嬬殑瀛楁鏃讹紝浣跨敤filePathField;|
+     |fileDocClassifyName|鏂囨。鐨勪娇鐢ㄧ被鍨嬪悕绉皘闄勪欢鐨勬椂鍊欙紝浣跨敤"闄勪欢";鏂囦欢璺緞鐨勭被鍨嬬殑瀛楁鏃讹紝浣跨敤"鏂囦欢璺緞瀛楁";|
+     |secretGrade|瀵嗙骇|濡傛灉琛ㄥ崟涓婃湁瀵嗙骇瀛楁鏄剧ず鐨勬椂鍊欙紝鏂囦欢涓婁紶鐨勭粍浠剁殑鎵嶆樉绀哄瘑绾э紝涓旀枃浠剁殑瀵嗙骇<=鏁版嵁鐨勫瘑绾
+     |updateFileFlag|鏄惁涓轰慨鏀癸紝true琛ㄧず涓轰慨鏀箌闇�瑕佸拰oid閰嶅悎浣跨敤|
+     |fileOid|鏂囦欢鐨勪富閿畖鍙湪鏇存柊鐨勬椂鍊欐墠浼犻�掋�傚鏋滄槸鏂囦欢涓婚敭绫诲瀷鐨勫瓧娈垫椂锛屽氨鏄繖涓瓧娈电殑鍊硷紝鍚﹀垯浼氬湪琛ㄥ崟鐨勫姞杞芥暟鎹腑鑾峰彇鍒皘
+7. 浣跨敤content鐨勬柟寮忔樉绀虹殑椤甸潰鐨勪繚瀛樺鐞嗛�昏緫
+  - 鏀寔鐨勫満鏅�
+     |鍦烘櫙|鍦烘櫙璇存槑|
+     |:--:|:--:|
+     |琛ㄥ崟鍔犵壒娈婅〃杈剧殑椤甸潰|姣斿澧炲姞琛ㄥ崟鐨勬煇涓瓧娈电殑棰勮绛夛紝杩欎簺鏁堟灉鍏ㄩ儴鏄窡琛ㄥ崟鐩稿叧鐨勩�傝繖绉嶅彲浠ュ皢鐗规畩鐨勯〉闈娇鐢ㄨ嚜瀹氫箟缁勪欢瀹屾垚|
+8. 鏀寔鐨勫満鏅�
+  - 淇敼鐨勬椂鍊欙紝閾炬帴绫诲瀷鍜宼o绔殑鏁版嵁涔熶竴鏍蜂慨鏀�
+     
+   
+     
diff --git a/Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_REFRESH.md b/Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_REFRESH.md
new file mode 100644
index 0000000..fc4a9ba
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_REFRESH.md
@@ -0,0 +1,10 @@
+#鍒锋柊
+鎵�鏈夐�氱敤鐨勬寜閽殑js閮藉瓨鏀惧湪platform/actions涓�
+1. js鍚嶇О锛歊efreshAction
+2. 鍔熻兘浣滅敤銆�
+  - 鍒锋柊褰撳墠鍒楄〃鎴栬�呭綋鍓嶆爲銆�
+3. 鍙傛暟璇存槑  
+        |鍙傛暟鍚嶅瓧|鍙傛暟璇存槑|浣跨敤鍦烘櫙|
+        |:--:|:--:|:--:|
+        |beforeEvent|js鐨勫墠缃簨浠秥|
+        |afterEvent|js鐨勫悗缃簨浠秥|
diff --git a/Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_TAB.md b/Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_TAB.md
new file mode 100644
index 0000000..8182103
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_TAB.md
@@ -0,0 +1,25 @@
+#鎵撳紑閫夐」鍗�
+鎵�鏈夐�氱敤鐨勬寜閽殑js閮藉瓨鏀惧湪platform/actions涓�
+1. js鍚嶇О锛欱aseTabViewAction
+2. 鍔熻兘浣滅敤銆�
+   - 鏂版墦寮�涓�涓�夐」鍗★紝鍏朵腑鏄剧ず鍐呭
+   - 鏀寔鑷畾涔夐〉闈㈡垨鑰匲I涓婁笅鏂囬厤缃袱绉嶆柟寮�
+3. 鍙傛暟鐨勪娇鐢�
+    |鍙傛暟鍚嶅瓧|鍙傛暟璇存槑|鍙傛暟绀轰緥|
+    |:--:|:--:|:--:|
+    |type|涓氬姟绫诲瀷|濡傛灉鍙傛暟娌℃湁閰嶇疆杩欎釜灞炴�э紝榛樿灏辩瓑浜庤繖涓寜閽墍鍦ㄧ殑缁勪欢鎵�灞炵殑涓氬姟绫诲瀷|
+    |content|UI涓婁笅鏂囩殑鍚嶅瓧锛屼紭鍏堢骇灏忎簬form|
+    |customUrl|鑷畾涔夐〉闈鏀寔js,http涓ょ鏂瑰紡|
+    |title|绐楀彛鐨勬爣棰榺form涓嶄负绌哄垯浣跨敤form鐨勬爣棰橈紱鍚﹀垯浣跨敤UI涓婁笅鏂囩殑鏃跺繀椤昏閰嶇疆銆傛敮鎸�${xxx}鍜宻ourceData.${xxx}琛ㄨ揪寮弢
+    |width|绐楀彛鐨勫搴榛樿鏄敱layer鑷�傚簲鐨剕
+    |height|绐楀彛鐨勯珮搴榛樿鏄敱layer鑷�傚簲鐨剕
+    |   |鍓嶅悗缃簨浠秥|
+    |beforeEvent|鏄剧ず鐨勫墠缃簨浠秥|
+    |afterEvent|绐楀彛鍏抽棴鐨勫悗缃簨浠秥|
+    |   |鍓嶅悗缃簨浠剁殑鍊间娇鐢ㄦ爣鍑嗙殑閰嶇疆|jsPath#methodName?param=aaa&param1=bbb|
+    |   |鍏朵粬鐨勮嚜瀹氫箟鍙傛暟||
+    |   |闄や簡浠ヤ笂鐨勫弬鏁帮紝鍏朵綑鑷鎵╁睍鐨勫弬鏁帮紝鍦╟ontent鏈夊�肩殑鎯呭喌涓嬶紝浣滀负sourceData浼犻�掑埌椤甸潰涓瓅
+
+     
+   
+     
diff --git a/Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_UI.md b/Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_UI.md
new file mode 100644
index 0000000..4056609
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_UI.md
@@ -0,0 +1,58 @@
+#鎸夐挳鐨凧s澶勭悊
+1. 鎸夐挳鐨勫浘鏍囦娇鐢ㄨ繑鍥炵殑淇℃伅鐨刬conPath鏉ュ鐞嗭紝鎺掑簭渚濋潬orderNum
+2. url鏄寜閽殑璺緞銆備緷鐒堕渶瑕佸垽鏂�?鍚庣殑鍙傛暟锛堝己鐑堜笉鎺ㄨ崘锛夈�傜劧鍚庡拰paramVOS锛堟寜閽殑瀹氫箟涓殑paramVOS灞炴�э級缁勫悎鍒颁竴璧蜂綔涓烘寜閽殑鍙傛暟锛坲rl鐨勪紭鍏堢骇澶т簬paramVOS)銆傛牸寮忓jsPath#methodName?param=aaa&param1=bbb銆� 
+   - url鐨勮鏄�
+        |鍙傛暟鍚嶅瓧|鍙傛暟璇存槑|浣跨敤鍦烘櫙|
+        |:--:|:--:|:--:| 
+        |jsPath|鎸夐挳鎵�灞炵殑Js鐨勮矾寰剕濡傛灉鍦╨ayui.js鎴栬�呭啀vciAlias.js瀹氫箟浜嗘槧灏勶紝鍒欎娇鐢ㄧ畝绉帮紝鍚﹀垯浣跨敤鍏ㄨ矾寰剕
+        |methodName|缁勪欢閲岀殑鏂规硶鍚嶅瓧|濡傛灉鍦ㄦ病鏈夎缃紝鍒欓粯璁や负doAction锛屽嵆鍙兘浼氶厤缃负jsPath?param=aaa|
+        |param鍜宲aram1|鍙傛暟|鎸夌収http鐨剈rl鏍煎紡瀹氫箟锛屽弬鏁板彲鑳戒负绌簗        
+3. 鍓嶇疆鍜屽悗缃簨浠躲�傚垎涓簀s浜嬩欢锛宐/s浜嬩欢锛屾湇鍔$浜嬩欢涓夌銆�
+    - 鍓嶅悗缃簨浠剁殑鍙傛暟璇存槑
+        |鍙傛暟鍚嶅瓧|鍙傛暟璇存槑|浣跨敤鍦烘櫙|
+        |:--:|:--:|:--:|
+        |beforeEvent|js鐨勫墠缃簨浠秥缁忓父鐢ㄦ潵鍋氬垽鏂紝姣斿鑳藉惁鍙戣捣娴佺▼锛岃兘鍚﹀垹闄ょ瓑绛夛紱瀹冨彲鑳介渶瑕佸悗鍙版帴鍙e仛閰嶅悎锛涙渶濂藉彧鏄湪js涓垽鏂椂浣跨敤杩欎釜鍙傛暟锛侊紒锛佸垏璁颁笉鑳藉湪鍓嶇疆浜嬩欢閲屼笉鑳借〃鍔ㄦ暟鎹簱涓暟鎹紝浠呬粎鏄煡璇㈠拰鍒ゆ柇|
+        |afterEvent|js鐨勫悗缃簨浠秥涓�鑸彧鏄埛鏂扮粍浠躲�傛渶濂戒笉瑕佸鐞嗘暟鎹紝鍥犱负鍙兘浼氶�犳垚鏁版嵁鐨勪笉瀹屾暣鎬с�倈
+        |beforeBSEvent|b/s鐨勫墠缃簨浠秥浣滅敤涓巎s鐨勫墠缃簨浠剁浉鍚岋紝浣嗘槸鍙互涓嶅啓js锛涗竴鑸浜庡鏉備竴浜涚殑鍒ゆ柇锛屽氨寤鸿浣跨敤杩欎釜銆傦紒锛侊紒濡傛灉鏄嚜瀹氫箟鐨勫悗鍙版帴鍙i渶瑕佽皟鐢║IDataServiceI閲岀殑callPreEvent|
+        |afterBSEvent|b/s鐨勫悗缃簨浠秥浣滅敤涓巎s鐨勫悗缃簨浠剁浉鍚岋紝浣嗘槸鍙互涓嶅啓js锛涘彲浠ュ鐞嗘柊鐨勬暟鎹紝浣嗘槸闇�瑕佷繚璇佹暟鎹畬鏁存��.锛侊紒锛佸鏋滄槸鑷畾涔夌殑鍚庡彴鎺ュ彛闇�瑕佽皟鐢║IDataServiceI閲岀殑callPostEvent|
+        |beforeServerEvent|鏈嶅姟绔殑鍓嶇疆浜嬩欢|鍦ㄤ富鏈嶅姟閲屽鐞嗙殑浜嬩欢锛屾湁浜嬪姟鎺у埗锛屽彲浠ラ殢鎰忔搷浣滄暟鎹�.server绔殑鍓嶇疆浜嬩欢闇�瑕佸姞鍒颁富鏈嶅姟鐨勮繍琛岀幆澧冧腑锛屼竴鑸笉浣跨敤|
+        |afterServerEvent|鏈嶅姟绔殑鍚庣疆鏃堕棿|鍦ㄤ富鏈嶅姟閲屽鐞嗙殑浜嬩欢锛屼竴鑸槸澶氫釜涓氬姟鍔熻兘鏈夊叕鍏辩殑澶勭悊閮ㄥ垎鏄娇鐢▅
+        |VciChangeDataBefore|b/s椤圭洰閲岀殑鍓嶇疆浜嬩欢鐨勬敞瑙o紝鍜宐eforeBSEvent鐨勪綔鐢ㄤ竴鏍穦涓嶉渶瑕佸仛閰嶇疆锛屽湪杩欎釜娉ㄨВ鎵�鍦ㄧ殑绫讳笂鍔燰ciChangeDataPlugin娉ㄨВ锛岃繖涓柟娉曠殑鍙傛暟璁剧疆(BaseModelDTOList baseModelDTOList)鍗冲彲|
+        |VciChangeDataAfter|b/s椤圭洰閲岀殑鍚庣疆浜嬩欢鐨勬敞瑙o紝afterBSEvent|涓嶉渶瑕佸仛閰嶇疆锛屽湪杩欎釜娉ㄨВ鎵�鍦ㄧ殑绫讳笂鍔燰ciChangeDataPlugin娉ㄨВ锛岃繖涓柟娉曠殑鍙傛暟璁剧疆(Collection<ClientBusinessObject> cbos)鍗冲彲| 
+4. js閲屾湁鍓嶇疆浜嬩欢鍜屽悗缃椂闂寸殑鎯呭喌涓嬬殑澶勭悊
+    - 閰嶇疆琛ㄨ揪寮忋�備緷鐒舵槸閬靛惊jsPath#methodName?param=aaa&param1=bbb銆傚鏋滄槸鍜屾寜閽殑js鏄竴涓紝鍒檍sPath鍙互璁剧疆涓虹┖锛屾鏃�#鍜宮ethodName涓嶈兘涓虹┖.鍓嶇疆浜嬩欢鐨勯粯璁ゆ柟娉曚负doBefore锛屽悗缃簨浠剁殑榛樿鏂规硶涓篸oAfter
+    - 璋冪敤鐨勬柟寮忋�傚墠缃簨浠惰皟鐢ㄦ椂锛屽皢鎸夐挳鐨勬墽琛屾柟娉曚綔涓篶allback鍙傛暟浼犻�掕繘鍘伙紝鍓嶇疆浜嬩欢閲岄渶瑕佸鐞嗗畬鎴愬悗锛屽垽鏂璫allback鏄惁瀛樺湪锛屽瓨鍦ㄥ垯璋冪敤銆傚悗缃椂闂翠篃鏄綔涓烘寜閽墽琛屾柟娉曠殑callback鍙傛暟浼犻�掕繘鍘汇�傚嵆杩欎笁涓兘鏄寜鐓у紓姝ユ柟寮忓鐞�
+    - 鍙傛暟鐨勮鏄�
+        |鍙傛暟鍚嶅瓧|鍙傛暟璇存槑|浣跨敤鍦烘櫙|
+        |:--:|:--:|:--:| 
+        |params|閰嶇疆鐨勫弬鏁皘灏辨槸閰嶇疆閲岀殑paramVOS瀵硅薄鍔犱笂璺緞閲�?鍚庣殑鍐呭|
+        |dataStore|閫夋嫨鐨勬暟鎹畖褰撳墠缁勪欢涓�夋嫨鐨勬暟鎹紝閮戒竴鏁扮粍鐨勫舰寮忎紶閫抾
+        |componentVO|缁勪欢鐨勯厤缃俊鎭瘄鎸夐挳鎵�鍦ㄧ殑缁勪欢鐨勯厤缃俊鎭瘄   
+        |thisUI|UI闈㈡澘鐨勫璞灏辨槸鏁翠釜鎸夐挳鎵�鍦ㄧ殑js鐨則his鎸囦唬瀵硅薄|
+        |sourceData|缁勪欢鐨勬潵婧愭暟鎹畖灏辨槸鎸夐挳鎵�鍦ㄧ粍浠剁殑鏉ユ簮鏁版嵁锛屾瘮濡傜幇鍦ㄦ槸涓績鍖猴紝杩欎釜灏辨槸瑗垮尯鐨勯�夋嫨鏁版嵁|
+        |thisButton|鎸夐挳鐨刯query鐢ㄦ硶鐨勬寚浠e璞鍦ㄦ寜閽殑浜嬩欢涓幏鍙栫殑$(this)|
+        |callback|鍥炶皟鏂规硶|鍥炶皟鏂规硶涓紝闇�瑕佹妸闄や簡callback鐨勫弬鏁伴兘鏀惧叆鍏朵腑|
+5. js璋冪敤鎸夐挳鐨勬柟寮忋�備紶閫掔殑鍙傛暟涓簅ptions銆傚叾涓寘鍚互涓嬬殑灞炴��
+   |灞炴�у悕瀛梶灞炴�ц鏄巪鏁版嵁鍙栧�紎
+   |:--:|:--:|:--:| 
+   |params|閰嶇疆鐨勫弬鏁皘灏辨槸閰嶇疆閲岀殑paramVOS瀵硅薄鍔犱笂璺緞閲�?鍚庣殑鍐呭|
+   |dataStore|閫夋嫨鐨勬暟鎹畖褰撳墠缁勪欢涓�夋嫨鐨勬暟鎹紝閮戒竴鏁扮粍鐨勫舰寮忎紶閫抾
+   |componentVO|缁勪欢鐨勯厤缃俊鎭瘄鎸夐挳鎵�鍦ㄧ殑缁勪欢鐨勯厤缃俊鎭瘄   
+   |thisUI|UI闈㈡澘鐨勫璞灏辨槸鏁翠釜鎸夐挳鎵�鍦ㄧ殑js鐨則his鎸囦唬瀵硅薄|
+   |sourceData|缁勪欢鐨勬潵婧愭暟鎹畖灏辨槸鎸夐挳鎵�鍦ㄧ粍浠剁殑鏉ユ簮鏁版嵁锛屾瘮濡傜幇鍦ㄦ槸涓績鍖猴紝杩欎釜灏辨槸瑗垮尯鐨勯�夋嫨鏁版嵁|
+   |thisButton|鎸夐挳鐨刯query鐢ㄦ硶鐨勬寚浠e璞鍦ㄦ寜閽殑浜嬩欢涓幏鍙栫殑$(this)|
+6. 鎸夐挳缂栧啓绀轰緥
+  ```
+ this.doAction = function (options) {
+     if(!options){
+         $webUtil.showErrorMsg("鎸夐挳鐨勪紶閫掍俊鎭笉姝g‘锛岃寮�鍙戜汉鍛樻鏌�");
+         return false;
+     }
+     var that = this;
+     webUtil.copyConfig(that, that.moduleKey);
+     var params = $webUtil.paramLow(options.paramVOS);
+     // options
+ }
+
+  ```        
+        
\ No newline at end of file
diff --git a/Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_UPREVISION.md b/Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_UPREVISION.md
new file mode 100644
index 0000000..6fea650
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_UPREVISION.md
@@ -0,0 +1,178 @@
+#閫氱敤鐨勫崌鐗堬紙鍗囩増娆★級鐨勫姛鑳�
+鎵�鏈夐�氱敤鐨勬寜閽殑js閮藉瓨鏀惧湪platform/actions涓�
+1. js鍚嶇О锛欱aseRevisionAction
+2. 鍔熻兘浣滅敤銆�
+   - 鏀寔瀹氫箟UI涓婁笅鏂囨潵灞曠ず椤甸潰锛屼篃鏀寔鐩存帴瀹氫箟琛ㄥ崟鏉ュ睍绀洪〉闈�
+   - 榛樿涓轰繚瀛樺拰鍙栨秷鎸夐挳锛屼繚瀛樼殑璺緞涓洪粯璁わ紝浣嗘槸鍙互閫氳繃鍙傛暟閰嶇疆鏉ユ浛鎹�
+   - 蹇呴』瑕侀�夋嫨鑰佺増鏈殑鏁版嵁銆傚鏋滅増鏈彿鎴栬�呯増娆″彿鏄墜鍔ㄨ緭鍏ユ椂锛岄渶瑕佸湪琛ㄥ崟鎴栬�匲I涓婁笅鏂囪嚜琛岄厤缃瀛楁涓烘樉绀轰笖鍙緭鍏ャ�備絾鏄鏋滀笟鍔$被鍨嬩笉鏀寔鎵嬪姩杈撳叆鐗堟湰锛屽垯鍗充娇琛ㄥ崟鎴栬�匲I涓婁笅鏂囪缃簡鍙緭鍏ヤ篃涓嶄細琚繚瀛�
+   - 鍗囩増鏈垨鑰呭崌鐗堟鍚庯紝鐢熷懡鍛ㄦ湡鐨勭姸鎬佷細鑷姩鍙樻洿涓哄垵濮嬬姸鎬�
+   - 榛樿涓哄崌鐗堟湰锛屽鏋滄槸鍗囩増娆�(浜岀骇鐗堟湰)闇�瑕侀厤缃弬鏁�
+   - 浼氬厛鏄剧ず鍑鸿�佺増鏈殑鏁版嵁锛岀敤鎴锋墜鍔ㄤ慨鏀瑰睘鎬у悗杩涜淇濆瓨
+3. 鍙傛暟鐨勪娇鐢�
+    |鍙傛暟鍚嶅瓧|鍙傛暟璇存槑|鍙傛暟绀轰緥|
+    |:--:|:--:|:--:|
+    |type|涓氬姟绫诲瀷|濡傛灉鍙傛暟娌℃湁閰嶇疆杩欎釜灞炴�э紝榛樿灏辩瓑浜庤繖涓寜閽墍鍦ㄧ殑缁勪欢鎵�灞炵殑涓氬姟绫诲瀷|
+    |form|琛ㄥ崟鐨勮嫳鏂囧悕瀛梶濡傛灉璁剧疆浜唂orm灏变笉鏄剧ずUI涓婁笅鏂囥�傝幏鍙栬〃鍗曠殑璺緞涓簑ebUIController/getFormDefineById銆俠tmType: 涓氬姟绫诲瀷锛屽�兼槸鎸夐挳鐨勫弬鏁颁腑鐨則ype锛沬d: 琛ㄥ崟鐨勮嫳鏂囧悕绉帮紝鍊兼槸鎸夐挳鐨勫弬鏁颁腑鐨刦orm|
+    |content|UI涓婁笅鏂囩殑鍚嶅瓧锛屼紭鍏堢骇灏忎簬form|
+    |upVersion|鏄惁涓哄崌鐗堟|true琛ㄧず涓哄崌鐗堟|
+    |getDataUrl|鑾峰彇鏁版嵁鐨勮矾寰剕榛樿涓簎iDataController/dataFormQuery|
+    |getDataBackPath|鑾峰彇鏁版嵁鐨勬湇鍔涓�鑸笉闇�瑕佹敼鍔ㄣ�傞粯璁や负鍏煎鎬т负true鏃剁瓑浜巔ath,鍚﹀垯涓簅bjectServicePath銆傚嵆configData.compatibility?path:configData.objectServicePath|
+    |getDataMethod|鑾峰彇鏁版嵁鐨勬柟娉曠被鍨媩榛樿涓篻et|
+    |url|鍚庡彴淇濆瓨鐨剈rl|榛樿涓簎iDataController/upRevision|
+    |method|璇锋眰鍚庡彴鐨勬柟娉晐榛樿涓簆ut|
+    |backPath|鍚庡彴鐨勬湇鍔″悕瀛梶涓�鑸笉闇�瑕佹敼鍔ㄣ�傞粯璁や负鍏煎鎬т负true鏃剁瓑浜巔ath,鍚﹀垯涓簅bjectServicePath銆傚嵆configData.compatibility?path:configData.objectServicePath|
+    |title|绐楀彛鐨勬爣棰榺form涓嶄负绌哄垯浣跨敤form鐨勬爣棰橈紱鍚﹀垯浣跨敤UI涓婁笅鏂囩殑鏃跺繀椤昏閰嶇疆銆傛敮鎸�${xxx}鍜宻ourceData.${xxx}琛ㄨ揪寮弢
+    |width|绐楀彛鐨勫搴榛樿鏄敱layer鑷�傚簲鐨剕
+    |height|绐楀彛鐨勯珮搴榛樿鏄敱layer鑷�傚簲鐨剕
+    |checkNotEdit|灞炴�х殑鍊肩鍚堟潯浠舵椂涓嶈兘鍗囩増|xxx=yyy&zzz=aaa鐨勬柟寮忋�備娇鐢�&鍒嗗壊锛�=鍓嶆槸灞炴�э紝=鍚庢槸灞炴�х殑鍊笺�傚彧瑕佷竴涓潯浠舵弧瓒冲悗灏变笉鑳界紪杈憒
+    |checkNotEditMsg|涓嶈兘淇敼鏃剁殑鎻愮ず璇彞|榛樿鈥滃綋鍓嶆暟鎹笉鍏佽鍗囩増"|
+    |successMsg|鎴愬姛鍚庣殑鎻愮ず璇彞|榛樿title+"鎴愬姛"銆傝繖涓紭鍏堢骇灏忎簬鍚庡彴杩斿洖鐨勬彁绀鸿鍙
+    |postSourceData|淇濆瓨鐨勬椂鍊欐槸鍚﹀彂閫佹潵婧愭暟鎹畖榛樿涓篺alse|
+    |postSelectData|淇濆瓨鐨勬椂鍊欐槸鍚﹀彂閫侀�夋嫨鏁版嵁|榛樿涓篺alse|
+    |   |鏂囦欢涓婁紶| |
+    |uploadFileUrl| 鏂囦欢涓婁紶鐨勮矾寰剕榛樿涓簐ciFileUploadController/uploadFile|
+    |uploadFileBackPath|鏂囦欢涓婁紶鐨勬湇鍔″悕绉皘涓�鑸笉淇敼銆傞粯璁や负鍏煎鎬т负true鏃剁瓑浜巔ath锛屽惁鍒欎负fileServicePath|
+    |uploadAttachment|鍊间负true鍜宖alse鏄剧ず涓婁紶闄勪欢|闄勪欢鍙互娣诲姞澶氫釜|
+    |uploadAttachmentTitle|闄勪欢鏄剧ず鐨勫悕绉皘榛樿鏄剧ず涓�"闄勪欢"|
+    |   |鍓嶅悗缃簨浠秥|
+    |saveBeforeEvent|淇濆瓨鐨勫墠缃簨浠秥娉ㄦ剰涓庢寜閽湰韬殑鍓嶇疆浜嬩欢鍖哄垎|
+    |saveAfterEvent|淇濆瓨鐨勫悗缃椂闂磡涓嶈鏄惁鏈夊悗缃簨浠讹紝淇濆瓨鎴愬姛鍚庨兘闇�瑕佸埛鏂伴潰鏉縷
+    |beforeBSEvent|淇濆瓨鐨凚/S鐨勫墠缃簨浠秥鍗冲悗鍙板鐞嗙殑鏃跺�欑殑鍓嶇疆浜嬩欢|
+    |afterBSEvent|淇濆瓨鐨凚/S鐨勫悗缃簨浠秥鍗冲悗鍙板鐞嗙殑鏃跺�欑殑鍚庣疆浜嬩欢|
+    |beforeServerEvent|鏈嶅姟绔殑鍓嶇疆浜嬩欢|鍦ㄤ富鏈嶅姟閲屽鐞嗙殑浜嬩欢锛屾湁浜嬪姟鎺у埗锛屽彲浠ラ殢鎰忔搷浣滄暟鎹�.server绔殑鍓嶇疆浜嬩欢闇�瑕佸姞鍒颁富鏈嶅姟鐨勮繍琛岀幆澧冧腑锛屼竴鑸笉浣跨敤|
+    |afterServerEvent|鏈嶅姟绔殑鍚庣疆鏃堕棿|鍦ㄤ富鏈嶅姟閲屽鐞嗙殑浜嬩欢锛屼竴鑸槸澶氫釜涓氬姟鍔熻兘鏈夊叕鍏辩殑澶勭悊閮ㄥ垎鏄娇鐢▅
+    |   |鍓嶅悗缃簨浠剁殑鍊间娇鐢ㄦ爣鍑嗙殑閰嶇疆|jsPath#methodName?param=aaa&param1=bbb|
+4. 鑾峰彇鏁版嵁
+   - 鏍规嵁getDataUrl鍙傛暟鏉ヨ皟鐢ㄥ悗鍙�.
+   - 鍙傛暟
+       |鍙傛暟鍚嶅瓧|鍙傛暟璇存槑|鍙傛暟绀轰緥|
+       |:--:|:--:|:--:|
+       |btmname|涓氬姟绫诲瀷|鍙互浠庢暟鎹噷鑾峰彇,涔熷彲浠ユ槸鎸夐挳涓婂畾涔夌殑type鍙傛暟|
+       |oid|涓婚敭|浠庨�夋嫨鐨勬暟鎹腑鑾峰彇|
+       |formDefineId|琛ㄥ崟鐨勫畾涔夌紪鍙穦form鍙傛暟|
+       |sourceDataMap|鏉ユ簮鏁版嵁|鎸夐挳鎵�灞炵殑鍖哄煙鐨勬潵婧愭暟鎹畖
+   -杩斿洖鍊�
+       ```
+         "data":{
+               ... 杩欓噷鏄璞$殑鍊肩殑淇℃伅
+          },
+         "attachmentFileVOs":[{
+                "oid:"鏂囦欢鐨勪富閿�",
+                "id":"鏂囦欢鐨勬樉绀哄悕绉帮紝涓嶅惈鍚庣紑",
+                "name":"鏂囦欢鐨勭湡瀹炲悕绉帮紝涓嶅惈鍚庣紑",
+                "fileExtension":"鏂囦欢鐨勫悗缂�鍚�",
+                "fileDocClassify":"鏂囨。绫诲瀷",
+                "fileDocClassifyName":"鏂囨。绫诲瀷鐨勫悕绉�",
+                "fileSize":"鏂囦欢鐨勫ぇ灏�",
+                "downloadCount":"涓嬭浇娆℃暟",
+                "filePath":"鏂囦欢鍦ㄥ嵎鏂囦欢澶归噷瀛樻斁鐨勮矾寰�"
+            }] ,
+         "filePathFieldMap":{
+               "field杩欎釜鏄瓧娈电殑鍚嶇О":{
+                    "oid:"鏂囦欢鐨勪富閿�",
+                     "id":"鏂囦欢鐨勬樉绀哄悕绉帮紝涓嶅惈鍚庣紑",
+                     "name":"鏂囦欢鐨勭湡瀹炲悕绉帮紝涓嶅惈鍚庣紑",
+                     "fileExtension":"鏂囦欢鐨勫悗缂�鍚�",
+                     "fileDocClassify":"鏂囨。绫诲瀷",
+                     "fileDocClassifyName":"鏂囨。绫诲瀷鐨勫悕绉�",
+                     "fileSize":"鏂囦欢鐨勫ぇ灏�",
+                     "downloadCount":"涓嬭浇娆℃暟",
+                     "filePath":"鏂囦欢鍦ㄥ嵎鏂囦欢澶归噷瀛樻斁鐨勮矾寰�"
+               }
+         }   
+       ```     
+   
+5. 鏂囦欢瀛楁鐨勫鐞�.鏂囦欢涓婁紶缁勪欢閮戒笉鏄剧ず鏂囨。绫诲瀷鐨勪笅鎷夋銆�
+   - 琛ㄥ崟鏄剧ず闄勪欢涓婁紶銆傞渶瑕侀厤缃畊ploadAttachment涓簍rue锛岄〉闈細鏄剧ず鏂囦欢涓婁紶鐨勭粍浠讹紝浠庝笂浼犵殑杩斿洖缁撴灉涓幏鍙栧埌oid鐨勫睘鎬э紝鐒跺悗淇濆瓨鐨勬椂鍊欐妸杩欎釜oid鏀惧埌releaseFileOids
+   - 鏈夋枃浠惰矾寰勭殑瀛楁銆傝瀛楁鏄剧ず涓烘枃浠朵笂浼狅紝鍙兘涓�涓�備笂浼犲悗锛屼粠杩斿洖缁撴灉涓幏鍙杅ilePath锛屽瓨鍌ㄥ埌杩欎釜瀛楁涓娿��
+6. 淇濆瓨鏃堕渶瑕佹彁浜ょ殑鍙傛暟銆傞渶瑕佽浆鎹负json瀛楃涓茬殑鏂瑰紡鎻愪氦
+   - 闅愯棌灞炴�ц〃绀轰笉闇�瑕佸崟鐙鐞嗭紝瀹冩槸鍦ㄨ〃鍗曞姞杞芥垨鑰呮槸浠庢潵婧愭暟鎹噷鑾峰彇鐨勶紝涓嶄細鏄剧ず
+     |鍙傛暟鍚嶅瓧|鍙傛暟璇存槑|鍙傛暟绀轰緥鍜屽彇鍊紎
+     |:--:|:--:|:--:|
+     | |涓嬫柟鏄窡閰嶇疆鍜屾枃浠剁浉鍏崇殑||
+     |formDefineId|琛ㄥ崟鐨勫畾涔塈d锛屽繀杈搢绛変簬鎸夐挳鐨勫弬鏁颁腑鐨刦orm灞炴�э紱鎴栬�呮槸UI涓婁笅鏂囦腑鐨刦ormDefineVO|
+     |upVersion|鏄惁涓哄崌鐗堟|true琛ㄧず涓哄崌鐗堟|
+     |preEvent|鍓嶇疆浜嬩欢|鎸夐挳鍙傛暟涓婄殑beforeBSEvent|
+     |afterEvent|鍚庣疆浜嬩欢|鎸夐挳鍙傛暟涓婄殑afterBSEvent|
+     |beforeServerEvent|鏈嶅姟绔殑鍓嶇疆浜嬩欢|鏉ユ簮浜庢寜閽殑鍙傛暟|
+     |afterServerEvent|鏈嶅姟绔殑鍚庣疆鏃堕棿|鏉ユ簮浜庢寜閽殑鍙傛暟|
+     |releaseFileOids|闄勪欢鐨勬枃浠跺璞′富閿畖鏁扮粍鐨勫舰寮忋�傛瘮濡� releaseFileOids=["111","222"]|
+     | |涓嬫柟鍏ㄩ儴鏄暟鎹殑灞炴�|
+     |id|缂栧彿|鏈塱d灞炴�х殑鏃跺�欐墠浼犻�抾
+     |name|鍚嶇О||
+     |description|鎻忚堪||
+     |revisionOid|鐗堟湰瀵硅薄鐨勪富閿畖涓�鑸慨鏀圭殑鏃跺�欐墠浼犻�掞紝灞炰簬榛樿鐨勯殣钘忓睘鎬
+     |nameOid|瀵硅薄鐨勪富閿畖涓�鑸慨鏀圭殑鏃跺�欐墠浼犻�掞紝灞炰簬榛樿鐨勯殣钘忓睘鎬
+     |btmname|涓氬姟绫诲瀷|蹇呰緭銆傛寜閽殑type鍙傛暟|
+     |lastR|鏄惁鏈�鍚庣増鏈瑋涓�鑸慨鏀圭殑鏃跺�欐墠浼犻�掞紝灞炰簬榛樿鐨勯殣钘忓睘鎬
+     |firstR|鏄惁棣栦釜鐗堟湰|涓�鑸慨鏀圭殑鏃跺�欐墠浼犻�掞紝灞炰簬榛樿鐨勯殣钘忓睘鎬
+     |lastV|鏄惁鏈�鍚庣増娆涓�鑸慨鏀圭殑鏃跺�欐墠浼犻�掞紝灞炰簬榛樿鐨勯殣钘忓睘鎬
+     |firstV|鏄惁棣栦釜鐗堟|涓�鑸慨鏀圭殑鏃跺�欐墠浼犻�掞紝灞炰簬榛樿鐨勯殣钘忓睘鎬
+     |creator|鍒涘缓浜簗鐢ㄦ埛鐨勮处鍙穦
+     |createTime|鍒涘缓鏃堕棿|鏃堕棿绫诲瀷锛岄渶瑕亂yyy-MM-dd HH:mm:ss|
+     |lastModifier|鏈�鍚庢椂闂磡鐢ㄦ埛鐨勮处鍙穦
+     |lastModifyTime|鏈�鍚庝慨鏀规椂闂磡鏃堕棿绫诲瀷锛岄渶瑕亂yyy-MM-dd HH:mm:ss|
+     |revisionRule|鐗堟湰鍙风殑瑙勫垯|锛屽睘浜庨粯璁ょ殑闅愯棌灞炴�
+     |revisionSeq|鐗堟湰鐨勫簭鍙穦灞炰簬榛樿鐨勯殣钘忓睘鎬
+     |revisionValue|鐗堟湰鐨勫�紎灞炰簬榛樿鐨勯殣钘忓睘鎬
+     |versionRule|鐗堟鐨勮鍒檤灞炰簬榛樿鐨勯殣钘忓睘鎬
+     |versionSeq|鐗堟鐨勫簭鍙穦灞炰簬榛樿鐨勯殣钘忓睘鎬
+     |versionValue|鐗堟鐨勫�紎锛屽睘浜庨粯璁ょ殑闅愯棌灞炴�
+     |lcStatus|鐘舵�佺殑鍊紎鐢熷懡鍛ㄦ湡鐨勭姸鎬侊紝涓�鑸笉浼犻�掞紝閮芥槸鍚庡彴澶勭悊銆備絾鏄紶閫掑悗浼樺厛绾ч珮浜庡悗鍙扮殑澶勭悊|
+     |ts|鏃堕棿鎴硘涓嶈鏀硅繖涓�硷紝琛ㄥ崟璇诲彇鍒扮殑鏄灏戯紝灏辫繑鍥炲灏戯紝yyyy-MM-dd HH:mm:ss.SSS|]
+     |owner|鎷ユ湁鑰厊涓�鑸瓑浜巆reator|
+     |checkInBy|绛惧叆鐨勭敤鎴穦鐢ㄦ埛鐨勮处鍙穦
+     |checkInTime|绛惧叆鐨勬椂闂磡鏃堕棿绫诲瀷锛岄渶瑕亂yyy-MM-dd HH:mm:ss|
+     |checkOutBy|绛惧嚭鐨勭敤鎴穦鐢ㄦ埛鐨勮处鍙穦
+     |checkOutTime|绛惧嚭鐨勬椂闂磡鏃堕棿绫诲瀷锛岄渶瑕亂yyy-MM-dd HH:mm:ss|
+     |copyFromVersion|浠庡摢涓増鏈嫹璐濊繃鏉ョ殑|蹇呰緭锛屼负寮瑰嚭椤甸潰涔嬪墠閫夋嫨鐨勬暟鎹殑oid|
+     |secretGrade|瀵嗙骇|鏁板瓧鏍煎紡|
+     |data|鍏朵粬鐨勫睘鎬э紝灏辨槸闄や簡涓婇潰鐨勫睘鎬т互澶栵紝閮戒紶閫掑埌杩欎釜灞炴�ч噷|杩欎釜鏄痬ap鐨勫舰寮忥紝杞崲涓簀son瀛楃涓蹭箣鍓嶏紝鏄瘂xxxx:yyyy,zzz:aaa}杩欐牱鐨勫舰寮弢
+   - 绀轰緥
+    ```
+        //娣诲姞
+        {
+            "formDefineId":"11111",
+            "oid":"",
+            "name":"杩欎釜鏄悕绉帮紝鏍囬",
+            "btmname":"test",
+            "data":{
+                "attr1":"绗竴涓睘鎬х殑鍊�",
+                "attr2":"绗簩涓睘鎬х殑鍊�",
+                "attr3":3,
+                "attr4":"2021-01-01 12:12:12"
+            },
+            "releaseFileOids":["222","333","444"]
+         } 
+        //淇敼
+         {
+             "formDefineId":"11111",
+             "oid":"11111111111",
+             "ts":"021-01-01 12:12:12.345",
+             "name":"杩欎釜鏄悕绉帮紝鏍囬",
+             "btmname":"test",
+             "data":{
+                 "attr1":"绗竴涓睘鎬х殑鍊�",
+                 "attr2":"绗簩涓睘鎬х殑鍊�",
+                 "attr3":3,
+                 "attr4":"2021-01-01 12:12:12"
+             },
+             "releaseFileOids":["222","333","444"]
+          } 
+   ```  
+7. 鏂囦欢涓婁紶鐨勫弬鏁板鐞�
+  - 璺緞 vciFileUploadController/uploadFile
+  - 鍙傛暟
+     |鍙傛暟鍚嶅瓧|鍙傛暟璇存槑|鍙傛暟绀轰緥鍜屽彇鍊紎
+     |:--:|:--:|:--:|
+     |file|鏂囦欢缁勪欢閲�<input type="file" name="file"/>鐨勫悕绉皘涓嶈兘淇敼锛屽摢鎬曡〃鍗曢噷鏈夊涓枃浠剁被鍨嬬殑瀛楁|
+     |id|鏂囦欢鐨勬樉绀哄悕绉皘涓�鑸笉杈撳叆锛岄粯璁ょ殑鏄�夋嫨鐨勬枃浠剁殑鍚嶇О|
+     |fileDocClassify|鏂囨。鐨勪娇鐢ㄧ被鍨媩闄勪欢鐨勬椂鍊欙紝浣跨敤attachment;鏂囦欢璺緞鐨勭被鍨嬬殑瀛楁鏃讹紝浣跨敤filePathField;|
+     |fileDocClassifyName|鏂囨。鐨勪娇鐢ㄧ被鍨嬪悕绉皘闄勪欢鐨勬椂鍊欙紝浣跨敤"闄勪欢";鏂囦欢璺緞鐨勭被鍨嬬殑瀛楁鏃讹紝浣跨敤"鏂囦欢璺緞瀛楁";|
+     |secretGrade|瀵嗙骇|濡傛灉琛ㄥ崟涓婃湁瀵嗙骇瀛楁鏄剧ず鐨勬椂鍊欙紝鏂囦欢涓婁紶鐨勭粍浠剁殑鎵嶆樉绀哄瘑绾э紝涓旀枃浠剁殑瀵嗙骇<=鏁版嵁鐨勫瘑绾
+     |updateFileFlag|鏄惁涓轰慨鏀癸紝true琛ㄧず涓轰慨鏀箌闇�瑕佸拰fileOid閰嶅悎浣跨敤|
+     |fileOid|鏂囦欢鐨勪富閿畖鍙湪鏇存柊鐨勬椂鍊欐墠浼犻�掋�傚鏋滄槸鏂囦欢涓婚敭绫诲瀷鐨勫瓧娈垫椂锛屽氨鏄繖涓瓧娈电殑鍊硷紝鍚﹀垯浼氬湪琛ㄥ崟鐨勫姞杞芥暟鎹腑鑾峰彇鍒皘
+
+     
+   
+     
diff --git a/Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_VIEW.md b/Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_VIEW.md
new file mode 100644
index 0000000..f5317ad
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_VIEW.md
@@ -0,0 +1,75 @@
+#寮瑰嚭绐楀彛鏌ョ湅璇︽儏
+鎵�鏈夐�氱敤鐨勬寜閽殑js閮藉瓨鏀惧湪platform/actions涓�
+1. js鍚嶇О锛欱aseViewAction
+2. 鍔熻兘浣滅敤銆�
+   - 寮瑰嚭绐楀彛鏄剧ず鏁版嵁鐨勪俊鎭紝鍏ㄩ儴閮芥槸鍙鐨�
+   - 鏀寔UI涓婁笅鏂囧拰form涓ょ鏂瑰紡
+3. 鍙傛暟鐨勪娇鐢�
+    |鍙傛暟鍚嶅瓧|鍙傛暟璇存槑|鍙傛暟绀轰緥|
+    |:--:|:--:|:--:|
+    |type|涓氬姟绫诲瀷|濡傛灉鍙傛暟娌℃湁閰嶇疆杩欎釜灞炴�э紝榛樿灏辩瓑浜庤繖涓寜閽墍鍦ㄧ殑缁勪欢鎵�灞炵殑涓氬姟绫诲瀷|
+    |form|琛ㄥ崟鐨勮嫳鏂囧悕瀛梶濡傛灉璁剧疆浜唂orm灏变笉鏄剧ずUI涓婁笅鏂囥�傝幏鍙栬〃鍗曠殑璺緞涓簑ebUIController/getFormDefineById銆俠tmType: 涓氬姟绫诲瀷锛屽�兼槸鎸夐挳鐨勫弬鏁颁腑鐨則ype锛沬d: 琛ㄥ崟鐨勮嫳鏂囧悕绉帮紝鍊兼槸鎸夐挳鐨勫弬鏁颁腑鐨刦orm|
+    |content|UI涓婁笅鏂囩殑鍚嶅瓧锛屼紭鍏堢骇灏忎簬form|
+    |customPanel|鑷畾涔夌殑椤甸潰锛屼紭鍏堢骇灏忎簬content|鍗崇洿鎺ユ樉绀鸿嚜瀹氫箟鐨刯s鐨勫唴瀹箌
+    |customIsMultiPanel|鑷畾涔夐〉闈㈡槸鍚︿负澶氱敤閫旂粍浠秥榛樿涓篺alse|
+    |getDataUrl|鑾峰彇鏁版嵁鐨勮矾寰剕榛樿涓簎iDataController/dataFormQuery|
+    |getDataBackPath|鑾峰彇鏁版嵁鐨勬湇鍔榛樿涓哄吋瀹规�т负true鏃剁瓑浜巔ath,鍚﹀垯涓簅bjectServicePath銆傚嵆configData.compatibility?path:configData.objectServicePath|
+    |getDataMethod|鑾峰彇鏁版嵁鐨勬柟娉曠被鍨媩榛樿涓篻et|
+    |title|绐楀彛鐨勬爣棰榺form涓嶄负绌哄垯浣跨敤form鐨勬爣棰橈紱鍚﹀垯浣跨敤UI涓婁笅鏂囩殑鏃跺繀椤昏閰嶇疆銆傛敮鎸�${xxx}鍜宻ourceData.${xxx}琛ㄨ揪寮弢
+    |width|绐楀彛鐨勫搴榛樿鏄敱layer鑷�傚簲鐨剕
+    |height|绐楀彛鐨勯珮搴榛樿鏄敱layer鑷�傚簲鐨剕
+    |displayButton|鏄惁鏄剧ず鎸夐挳锛屽彧鏈夊湪content鏈夊�硷紝鑰宖orm娌℃湁鍊肩殑鏃跺�欐墠浣跨敤|榛樿涓篺alse|
+    |onlyField|瀛楁鏄剧ず涓哄瓧娈碉紝鍦╟ontent鍜宖orm鏃堕兘鐢熸晥|榛樿涓簍rue|
+    |   |闄勪欢鏌ョ湅| |
+    |uploadFileUrl| 鏂囦欢涓婁紶鐨勮矾寰剕榛樿涓簐ciFileUploadController/uploadFile|
+    |uploadFileBackPath|鏂囦欢涓婁紶鐨勬湇鍔″悕绉皘 榛樿涓哄吋瀹规�т负true鏃剁瓑浜巔ath锛屽惁鍒欎负fileServicePath|
+    |displayAttachment|鍊间负true鍜宖alse鏄剧ず闄勪欢|闄勪欢鍙互娣诲姞澶氫釜,鍙兘涓嬭浇锛屼笉鑳戒笂浼爘
+    |displayAttachmentTitle|闄勪欢鏄剧ず鐨勫悕绉皘榛樿鏄剧ず涓�"闄勪欢"|
+    |   |鍓嶅悗缃簨浠秥|
+    |beforeEvent|鏄剧ず鐨勫墠缃簨浠秥|
+    |afterEvent|绐楀彛鍏抽棴鐨勫悗缃簨浠秥|
+    |   |鍓嶅悗缃簨浠剁殑鍊间娇鐢ㄦ爣鍑嗙殑閰嶇疆|jsPath#methodName?param=aaa&param1=bbb|
+    |   |鍏朵粬鐨勮嚜瀹氫箟鍙傛暟||
+    |   |闄や簡浠ヤ笂鐨勫弬鏁帮紝鍏朵綑鑷鎵╁睍鐨勫弬鏁帮紝鍦╟ontent鏈夊�肩殑鎯呭喌涓嬶紝浣滀负sourceData浼犻�掑埌椤甸潰涓瓅
+4. 鑾峰彇鏁版嵁
+   - 鏍规嵁getDataUrl鍙傛暟鏉ヨ皟鐢ㄥ悗鍙�.
+   - 鍙傛暟
+       |鍙傛暟鍚嶅瓧|鍙傛暟璇存槑|鍙傛暟绀轰緥|
+       |:--:|:--:|:--:|
+       |btmname|涓氬姟绫诲瀷|鍙互浠庢暟鎹噷鑾峰彇,涔熷彲浠ユ槸鎸夐挳涓婂畾涔夌殑type鍙傛暟|
+       |oid|涓婚敭|浠庨�夋嫨鐨勬暟鎹腑鑾峰彇|
+       |formDefineId|琛ㄥ崟鐨勫畾涔夌紪鍙穦form鍙傛暟|
+       |sourceDataMap|鏉ユ簮鏁版嵁|鎸夐挳鎵�灞炵殑鍖哄煙鐨勬潵婧愭暟鎹畖
+   -杩斿洖鍊�
+       ```
+         "data":{
+               ... 杩欓噷鏄璞$殑鍊肩殑淇℃伅
+          },
+         "attachmentFileVOs":[{
+                "oid:"鏂囦欢鐨勪富閿�",
+                "id":"鏂囦欢鐨勬樉绀哄悕绉帮紝涓嶅惈鍚庣紑",
+                "name":"鏂囦欢鐨勭湡瀹炲悕绉帮紝涓嶅惈鍚庣紑",
+                "fileExtension":"鏂囦欢鐨勫悗缂�鍚�",
+                "fileDocClassify":"鏂囨。绫诲瀷",
+                "fileDocClassifyName":"鏂囨。绫诲瀷鐨勫悕绉�",
+                "fileSize":"鏂囦欢鐨勫ぇ灏�",
+                "downloadCount":"涓嬭浇娆℃暟",
+                "filePath":"鏂囦欢鍦ㄥ嵎鏂囦欢澶归噷瀛樻斁鐨勮矾寰�"
+            }] ,
+         "filePathFieldMap":{
+               "field杩欎釜鏄瓧娈电殑鍚嶇О":{
+                    "oid:"鏂囦欢鐨勪富閿�",
+                     "id":"鏂囦欢鐨勬樉绀哄悕绉帮紝涓嶅惈鍚庣紑",
+                     "name":"鏂囦欢鐨勭湡瀹炲悕绉帮紝涓嶅惈鍚庣紑",
+                     "fileExtension":"鏂囦欢鐨勫悗缂�鍚�",
+                     "fileDocClassify":"鏂囨。绫诲瀷",
+                     "fileDocClassifyName":"鏂囨。绫诲瀷鐨勫悕绉�",
+                     "fileSize":"鏂囦欢鐨勫ぇ灏�",
+                     "downloadCount":"涓嬭浇娆℃暟",
+                     "filePath":"鏂囦欢鍦ㄥ嵎鏂囦欢澶归噷瀛樻斁鐨勮矾寰�"
+               }
+         }   
+       ```     
+     
+   
+     
diff --git a/Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_WORKFLOW.md b/Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_WORKFLOW.md
new file mode 100644
index 0000000..f38ac14
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/resources/md/BUTTON_WORKFLOW.md
@@ -0,0 +1,37 @@
+#鍙戣捣宸ヤ綔娴佺▼
+鎵�鏈夐�氱敤鐨勬寜閽殑js閮藉瓨鏀惧湪platform/actions涓�
+1. js鍚嶇О锛欱aseStartWorkflowAction銆傛祦绋嬪惎鍔ㄧ殑绐楀彛js鏄痯rocess/vciWebStartProcess
+2. 鍔熻兘浣滅敤銆�
+   - 鏂板垱寤哄伐浣滄祦绋�
+   - 鏀寔鍙戣捣鍗曟潯鏁版嵁鍙戣捣鍜屽鏉″彂璧锋祦绋�
+   - 娴佺▼鎵ц鏃剁殑鏁版嵁椤甸潰鎵ц鑷畾涔夌紪鍐欏拰UI閰嶇疆鐨勬柟寮�
+3. 鍙傛暟鐨勪娇鐢�
+    |鍙傛暟鍚嶅瓧|鍙傛暟璇存槑|鍙傛暟绀轰緥|
+    |:--:|:--:|:--:|
+    |processClassify|娴佺▼鍒嗙被|瀹冧笌骞冲彴鐨勬祦绋嬫ā鏉垮垎绫诲搴攟
+    |multiProcess|鍙戣捣澶氭潯娴佺▼|鍦ㄩ�夋嫨澶氭潯涓氬姟鏁版嵁鍚庯紝鍙戣捣澶氭潯娴佺▼锛屾瘡涓�鏉′笟鍔℃暟鎹竴涓祦绋嬪疄渚媩
+    |checkNotProcess|灞炴�х殑鍊肩鍚堟潯浠舵椂涓嶈兘鍙戣捣|xxx=yyy&zzz=aaa鐨勬柟寮忋�備娇鐢�&鍒嗗壊锛�=鍓嶆槸灞炴�э紝=鍚庢槸灞炴�х殑鍊笺�傚彧瑕佷竴涓潯浠舵弧瓒冲悗灏变笉鑳藉彂璧锋祦绋媩
+    |checkNotProcessMsg|涓嶈兘鍙戣捣鏃剁殑鎻愮ず璇彞|榛樿"褰撳墠鏁版嵁涓嶅厑璁稿彂璧锋祦绋�",鏀寔${xxx}鍜宻ourceData.${xxx}琛ㄨ揪寮弢
+    |title|绐楀彛鐨勬爣棰榺榛樿涓哄惎鍔ㄦ祦绋嬨�傛敮鎸�${xxx}鍜宻ourceData.${xxx}琛ㄨ揪寮弢
+    |width|绐楀彛鐨勫搴榛樿鏄敱layer鑷�傚簲鐨剕
+    |height|绐楀彛鐨勯珮搴榛樿鏄敱layer鑷�傚簲鐨剕
+    |canUseTemplate|鍙互浣跨敤鐨勬祦绋嬫ā鏉匡紝鐢ㄨ嫳鏂囬�楀彿鍒嗗壊|涓�鑸笉閰嶇疆锛屼笉閰嶇疆鏃惰〃绀烘祦绋嬫ā鏉垮垎绫讳笅鐨勬ā鏉块兘鍙互浣跨敤|
+    |variablesInfo|鎵╁睍鍙傛暟鐨勪俊鎭紝鍦ㄦ祦绋嬩簨浠舵垨鑰呮槸椤甸潰灞曠ず鏃朵娇鐢▅xxx=yyy&zzz=aaa鐨勬柟寮忋�備娇鐢�&鍒嗗壊锛�=鍓嶆槸灞炴�э紝=鍚庢槸灞炴�х殑鍊笺�倈
+    |uiType|鐣岄潰灞曠ず鏃舵墍闇�鐨勪笟鍔$被鍨媩娌℃湁璁剧疆鐨勬椂鍊欙紝榛樿涓哄綋鍓嶅彂璧风殑鏁版嵁鐨勪笟鍔$被鍨媩
+    |content|娴佺▼鎵ц鐨勬椂鍊欙紝鏄剧ず鐨刄I涓婁笅鏂噟瀵瑰簲骞冲彴閲岄厤缃殑UI涓婁笅鏂噟
+    |table|娴佺▼鎵ц鐨勬椂鍊欙紝鏄剧ず鐨勫垪琛▅瀵瑰簲骞冲彴涓厤缃殑琛ㄦ牸鐨勮嫳鏂囧悕绉般�備紭鍏堢骇楂樹簬content|
+    |detailUrl|娴佺▼鎵ц鐨勬椂鍊欙紝鏄剧ず鐨勮嚜瀹氫箟椤甸潰|浼樺厛绾уぇ浜巘able銆傛牸寮忎负USEJS://XXXXX?xx=yy&zz=a銆傝嚜宸辩紪鍐欑殑椤甸潰闇�瑕侀厤缃�.content,table,detailUrl閮芥病鏈夐厤缃椂锛屾樉绀烘暟鎹殑涓氬姟绫诲瀷閲岀殑榛樿鐨刾rocessTaskUI杩欎釜UI涓婁笅鏂噟
+    |autoProcessName|鑷姩灏佽娴佺▼瀹炰緥鐨勫悕绉皘榛樿涓虹┖锛屾敮鎸�${xxx}鍜宻ourceData.${xxx}琛ㄨ揪寮忋�傛槸鏇挎崲鐨勬柟寮弢
+    |alwaysDisplayNext|濮嬬粓鏄剧ず涓嬩竴璐熻矗浜簗true鏃惰〃绀烘祦绋嬪湪鎵ц鐨勬椂鍊欏缁堟樉绀轰笅涓�璐熻矗浜簗
+    |resetStatus|缁堟鐨勬椂鍊欓噸缃姸鎬亅璁剧疆鐢熷懡鍛ㄦ湡鐨勭姸鎬亅
+    |startStatus|鍚姩娴佺▼鎴愬姛鍚庯紝杞崲鐘舵�亅|
+    |   |鍓嶅悗缃簨浠秥|
+    |beforeEvent|鍙戣捣娴佺▼鐨勭獥鍙f樉绀轰箣鍓嶆墽琛岀殑浜嬩欢|checkNotProcess閰嶇疆涓嶈兘婊¤冻瑕佹眰鐨勬椂鍊欏彲浠ヤ娇鐢ㄨ繖涓墠缃簨浠舵潵鍋氬鐞唡
+    |afterEvent|绐楀彛鍏抽棴鐨勫悗缃簨浠秥|
+    |   |鍓嶅悗缃簨浠剁殑鍊间娇鐢ㄦ爣鍑嗙殑閰嶇疆|jsPath#methodName?param=aaa&param1=bbb|
+4. 娴佺▼寰呭姙浠诲姟鐨勫鐞�
+  - 棣栭〉鐨勬祦绋嬪緟鍔炰换鍔★紝鐐瑰嚮浠诲姟鐨勫悕绉板彲浠ョ洿鎺ュ脊鍑烘祦绋嬩换鍔$殑鎵ц椤甸潰銆�
+  - 棣栭〉鍙充晶鐨勫ご鍍忕殑涓嬫媺鑿滃崟涓紝閫夋嫨
+     
+   
+     
diff --git a/Source/platformProject/vci-platform-web/src/main/resources/md/CUSTOMER_UI.md b/Source/platformProject/vci-platform-web/src/main/resources/md/CUSTOMER_UI.md
new file mode 100644
index 0000000..f8b9e38
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/resources/md/CUSTOMER_UI.md
@@ -0,0 +1,37 @@
+#鑷畾涔夐〉闈㈢殑js澶勭悊
+閲囩敤Layui鐨勫缁勪欢鐨勬柟寮忔瀯寤鸿嚜瀹氫箟椤甸潰銆�
+1. js璺緞瑙勮寖
+   - 骞冲彴閫氱敤鐨勭粍浠讹紝閮芥斁鍒發ay/platform/plugins杩欎釜鏂囦欢澶�
+   - 涓�у寲涓氬姟鐨勭粍浠讹紝閮藉湪vciweb涓嬮潰
+2. 鍚嶇О閰嶇疆璇存槑
+   - 濡傛灉鍚嶇О闇�瑕佺畝鍐欙紝闇�瑕佸湪layui.js鐨刴odules鎴栬�卾ciAlias.js閲岄厤缃� 
+   - 寤鸿骞冲彴閫氱敤鐨勭粍浠堕兘绠�鍐欙紝闈炲钩鍙伴�氱敤鐨勫鏋滀篃闇�瑕佺畝鍐欙紝鍒欏湪vciAlias.js閲岄厤缃�
+3. 姣忎釜缁勪欢鐨刬d闇�瑕佽嚜琛岀紪鍐欙紝涓斾笉鑳介噸澶�
+4. 鏂规硶璇存槑
+   - getContent(id,options) 鑾峰彇杩欎釜缁勪欢鐨刪tml鍐呭锛岃繖涓猦tml鍐呭浼氳鍔犲埌鑷畾涔夌粍浠舵墍鍦ㄧ殑div閲屻�傞渶瑕佽嚜琛屽瓨鍌╫ptions.鍖呭惈鐨勫弬鏁板涓�
+      
+      |鍙傛暟鍚嶅瓧|鍙傛暟璇存槑|鍙傛暟绀轰緥|
+      |:--:|:--:|:--:|
+      |id|缁勪欢鐨勫敮涓�鏍囪瘑绗涓�鑸槸鑷畾涔夌粍浠剁殑閰嶇疆淇℃伅涓殑oid|
+      |options|鑷畾涔夌粍浠剁殑閰嶇疆灞炴�浠巆ustomerClass閲�?鍚庣殑鍙傛暟鑾峰彇寰楁潵锛屽啀鍔犱笂缁勪欢鐨勯厤缃甤omponentVO;鏉ユ簮鏁版嵁sourceData;褰撳墠闈㈡澘thisUI| 
+       
+   - init(id,options) 鍒濆鍖栨柟娉曪紝姣斿闈㈡澘鐨勫垵濮嬪寲锛屼絾鏄笉浼氳嚜鍔ㄥ姞杞芥暟鎹紝鍙傛暟鐨勫唴瀹逛笌getContent涓�鏍�
+   - loadByUI(id,options,selectData) 鍔犺浇鏁版嵁鐨勬柟娉�
+   
+        |鍙傛暟鍚嶅瓧|鍙傛暟璇存槑|鍙傛暟绀轰緥|
+        |:--:|:--:|:--:|
+        |selectData|涓婁竴涓尯鍩熼�夋嫨鐨勬暟鎹畖闇�瑕佸皝瑁呬负鏁扮粍锛屽鏋滀笂涓�涓尯鍩熶负tree,鍒欒幏鍙栬妭鐐逛笂鐨刟ttributes|
+        |options|鍙互閲嶈浇涔嬪墠鐨勯厤缃畖闇�瑕佸畬鍏ㄥ搴斿埌灞炴�у悕绉皘  
+        
+   - refresh(id,thisButton) 鍒锋柊褰撳墠缁勪欢鐨勬柟娉�
+   
+     |鍙傛暟鍚嶅瓧|鍙傛暟璇存槑|鍙傛暟绀轰緥|
+     |:--:|:--:|:--:|
+     |thisButton|鍒锋柊鎸夐挳鐨勫璞鐩存帴鑾峰彇鎸夐挳鐨勪綔鐢ㄥ煙鐨則his瀵硅薄锛屾瘮濡�$(this)|   
+         
+   - destroy(id) 閿�姣佹柟娉曪紝鍦ㄨ閿�姣佺殑鏃跺�欒皟鐢紝闇�瑕佸幓闄よ繖涓猧d瀵瑰簲鐨刼ptions鍜岀浉搴旂殑html绛変俊鎭�
+   - getSelectDatas(id) 鑾峰彇褰撳墠缁勪欢閲岃閫変腑鐨勪俊鎭�
+   - selectData(id,datas) 璁剧疆閫変腑鐨勬暟鎹�傚叾涓璬atas鏄渶瑕侀�変腑鐨勬暟鎹紝蹇呴』鏄暟缁勭殑褰㈠紡
+ ```   
+   //鑷畾涔夌粍浠剁ず渚�
+ ```    
\ No newline at end of file
diff --git a/Source/platformProject/vci-platform-web/src/main/resources/md/VOLUME.md b/Source/platformProject/vci-platform-web/src/main/resources/md/VOLUME.md
new file mode 100644
index 0000000..3649ce4
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/resources/md/VOLUME.md
@@ -0,0 +1,20 @@
+#鍗锋湇鍔$殑璁捐鎬濊矾
+1. 鎬讳綋鎬濊矾
+   - 璁捐鎬濇兂 鍗锋湇鍔″彲浠ョ嫭绔嬩簬涓绘湇鍔¢儴缃诧紝鍑忓皯corba鐨勫帇鍔涖�傚彲浠ヤ娇鐢ㄥ涓嵎鏈嶅姟銆傚嵎鏈嶅姟閲屽彲浠ユ湁澶氫釜鍗枫�傚叾涓璫orba鐨勫懡鍚嶆湇鍔$浉褰撲簬璁$畻鏈猴紝鍗锋湇鍔$浉褰撲簬鏂囦欢绯荤粺锛屽嵎鐩稿綋浜庣鐩樻垨鏂囦欢澶�
+   - 涓嬭浇澶勭悊 鏍规嵁鍗峰悕绉拌幏鍙栧嵎瀵硅薄閲岀殑瀹氫箟銆傝幏鍙栧叾涓殑鏈嶅姟鍦板潃鍜屾湇鍔″悕绉帮紝鐒跺悗璋冪敤corba鏈嶅姟銆傚鏋滄湇鍔″湴鍧�涓虹┖锛屽垯琛ㄧず鍜屼富鏈嶅姟鍏辩敤鍛藉悕鏈嶅姟
+   - 涓婁紶澶勭悊 涓�鑸郴缁熸牴鎹笟鍔℃潵澶勭悊锛涙垨鑰呮槸鍦ㄥ墠绔〉闈㈡樉绀哄嵎锛岃鐢ㄦ埛鍙互閫夋嫨锛涙垨鑰呰幏鍙栭閫夎矾寰勭殑鍗�
+2. 璋冪敤鎺ュ彛
+   - 鑾峰彇鍗峰璞°�備娇鐢ㄥ嵎鐨勫悕绉拌繘琛屾煡璇€��
+   - 浣跨敤鍗峰璞$殑鏈嶅姟鍦板潃鍜屾湇鍔″悕绉版潵鑾峰彇
+3. 浠g爜绀轰緥
+    ```
+    VciFileVolumeVO vciFileVolumeVO = vciFileVolumeServiceI.getObjectById(volumeId);
+    String volumeName = vciFileVolumeVO.getName();
+    VolumnManagement volumnCorbaService = null;
+    try {
+        volumnCorbaService = platformClientUtil.getVolumeService(vciFileVolumeVO.getServiceUrl(),volumeName).getVolumnService();
+    } catch (VCIError vciError) {
+        throw new VciBaseException("娌℃湁鑾峰彇鍒皗}鐨勫嵎鏈嶅姟",new String[]{volumeName},vciError);
+    }
+    ```
+      
\ No newline at end of file
diff --git a/Source/platformProject/vci-platform-web/src/main/resources/properties/corba.properties b/Source/platformProject/vci-platform-web/src/main/resources/properties/corba.properties
new file mode 100644
index 0000000..d887383
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/resources/properties/corba.properties
@@ -0,0 +1,171 @@
+锘�#conf.properties version by Eclipse
+#Sat Oct 19 14:06:56 CST 2013
+NameService=corbaloc\:\:localhost\:30000/NameService
+InstanceIdentity=platform-
+
+## 茅聹聙猫娄聛氓聤聽猫陆陆莽職聞.jar忙聣聙氓聹篓猫路炉氓戮聞(盲录職茅聙聮氓陆聮氓颅聬忙聳聡盲禄露氓陇鹿茅聡聦莽職聞.jar茂录聣茂录聦氓娄聜 D:/xx/xx/xx
+jarPath=./libs
+
+jacorb.net.socket_factory.port.min=29990
+jacorb.net.socket_factory.port.max=29999
+jacorb.net.server_socket_factory=org.jacorb.orb.factory.PortRangeServerSocketFactory
+jacorb.net.server_socket_factory.port.min=30001
+jacorb.net.server_socket_factory.port.max=30110
+jacorb.retries=0
+jacorb.connection.client.idle_timeout=5000
+jacorb.connection.client.connect_timeout=15000
+jacorb.log.default.verbosity=
+
+
+#忙聳聡盲禄露盲录聽猫戮聯氓聺聴氓陇搂氓掳聫
+blockLength=32
+
+########################################### 氓鹿鲁氓聫掳UIF 茅聹聙猫娄聛莽職聞茅聟聧莽陆庐  BEGIN ###########################################
+#盲潞潞氓聭聵盲驴隆忙聛炉氓聟楼忙聴露,忙聵炉氓聬娄茅聹聙猫娄聛氓炉聠莽潞搂氓颅聴忙庐碌
+exportSecretGrade=false
+
+# 氓聤聽氓炉聠氓炉聠茅聮楼
+encrypt.key=www.liming.portal.comwww.liming.portal.com
+# 莽聶禄氓陆聲莽陋聴氓聫拢茂录聦忙聵炉氓聬娄忙聵戮莽陇潞芒聙聵盲驴聺氓颅聵芒聙聶氓陇聧茅聙聣忙隆聠
+logon.saveBut=false
+# 莽鲁禄莽禄聼莽聰篓忙聢路莽聶禄氓陆聲猫露聟忙聴露忙聴露茅聴麓(氓聧聲盲陆聧氓聢聠氓聢聠茅聮聼茂录聣
+logon.loginovertime=1000
+# 盲赂禄忙隆聠忙聻露盲赂聤茂录聦忙聵炉氓聬娄忙聵戮莽陇潞茅隆露茅聝篓氓聸戮莽聣聡
+top.logon.image.show=false
+# 盲赂禄忙隆聠忙聻露盲赂聤茂录聦茅隆露茅聝篓氓聸戮莽聣聡氓聬聧莽搂掳茂录聢猫炉楼氓聸戮莽聣聡盲陆聧盲潞聨 com.vci.rmip.logon.client 氓聦聟盲赂聥茂录聣
+top.logon.image.name=title.jpg
+# 盲赂禄忙隆聠忙聻露盲赂聤茂录聦忙聵炉氓聬娄忙聵戮莽陇潞猫聫聹氓聧聲 true:忙聵戮莽陇潞 false:盲赂聧忙聵戮莽陇潞
+top.menuBar.show=true
+# 盲赂禄猫聫聹氓聧聲盲赂聥茂录聦忙聵炉氓聬娄忙聵戮莽陇潞芒聙聵茅聡聧忙聳掳莽聶禄氓陆聲芒聙聶  true:忙聵戮莽陇潞 false:盲赂聧忙聵戮莽陇潞
+top.menuBar.menuItem.relogin=true
+# 盲赂禄猫聫聹氓聧聲盲赂聥茂录聦忙聵炉氓聬娄忙聵戮莽陇潞芒聙聵盲驴庐忙聰鹿氓炉聠莽聽聛芒聙聶  true:忙聵戮莽陇潞 false:盲赂聧忙聵戮莽陇潞
+top.menuBar.menuItem.changePassword=true
+
+# 莽鲁禄莽禄聼氓聟鲁盲潞聨茅聟聧莽陆庐,盲驴庐忙聰鹿茅聟聧莽陆庐忙聵炉猫娄聛忙鲁篓忙聞聫盲赂颅忙聳聡氓颅聴莽卢娄莽職聞莽录聳莽聽聛盲陆驴莽聰篓utf-8
+system.about.title = 氓聟鲁盲潞聨
+# 忙聹聙盲陆鲁氓聸戮莽聣聡氓掳潞氓炉赂400*90茂录聦茅禄聵猫庐陇氓聙录盲赂潞about.png
+system.about.imageName=about.png
+# 盲潞搂氓聯聛氓聬聧莽搂掳
+system.about.softNameProduct= VCI Innovation 2017
+# 莽聣聢忙聺聝_盲赂颅忙聳聡
+system.about.softNameCopyrightC = 氓庐聫氓聧職猫驴聹猫戮戮氓聟卢氓聫赂  莽聣聢忙聺聝忙聣聙忙聹聣
+# 莽聣聢忙聺聝_猫聥卤忙聳聡
+system.about.softNameCopyrightE = Copyright(C) 2011-2017 Contributors. All rights reserved.
+# 茅隆鹿莽聸庐氓聬聧莽搂掳 
+system.about.softName = 氓聦聴盲潞卢氓庐聫氓聧職猫驴聹猫戮戮莽搂聭忙聤聙忙聹聣茅聶聬氓聟卢氓聫赂 - 莽鲁禄莽禄聼氓录聙氓聫聭氓鹿鲁氓聫掳
+# 氓鹿鲁氓聫掳莽聣聢忙聹卢 
+system.about.version = v2017.06.14
+# 氓聟卢氓聫赂莽陆聭氓聺聙 
+system.about.visit = http://www.vci-tech.com
+
+
+# 莽庐隆莽聬聠氓聭聵莽聰篓忙聢路氓聬聧
+user.admin=admin
+# 猫露聟莽潞搂莽庐隆莽聬聠氓聭聵莽聰篓忙聢路氓聬聧
+user.developer=developer
+# 氓庐聣氓聟篓莽庐隆莽聬聠氓聭聵猫搂聮猫聣虏氓聬聧莽搂掳
+user.Sysadmin=\u5b89\u5168\u7ba1\u7406\u5458
+user.rooter=root
+
+# 忙聴楼氓驴聴忙篓隆氓聺聴茂录聦忙聵炉氓聬娄氓聬炉莽聰篓忙聼楼猫炉垄 on:氓聬炉莽聰篓 off:莽娄聛莽聰篓
+log.query.switch=off
+period=1
+# 忙聴楼氓驴聴忙篓隆氓聺聴茂录聦氓庐職忙聹聼氓聢聽茅聶陇忙聴楼氓驴聴忙聴露茂录聦忙聰炉忙聦聛莽職聞氓聫炉茅聙聣氓聙录茂录聢
+log.save.periods=\ufeff1\#\u4e00\u4e2a\u6708\:\:2\#\u4e24\u4e2a\u6708\:\:3\#\u4e09\u4e2a\u6708\:\:6\#\u534a\u5e74\:\:12\#\u4e00\u5e74\:\:18\#\u4e00\u5e74\u534a\:\:24\#\u4e24\u5e74
+# 忙聴楼氓驴聴忙篓隆氓聺聴茂录聦氓聢聠茅隆碌忙聼楼猫炉垄忙聴露茂录聦茅隆碌忙聲掳忙聧庐氓陇搂氓掳聫
+log.query.pagesize=30
+# 忙聴楼氓驴聴忙篓隆氓聺聴茂录聦忙聵炉氓聬娄氓聬炉莽聰篓氓庐職忙聴露氓聢聽茅聶陇忙聴楼氓驴聴 Y:氓聬炉莽聰篓 N:莽娄聛莽聰篓
+log.delete.auto=N
+# 忙聴楼氓驴聴忙篓隆氓聺聴茂录聦氓庐職忙聴露氓聢聽茅聶陇忙聴楼氓驴聴忙聴露茂录聦猫娄聛盲驴聺莽聲聶忙聹聙猫驴聭莽職聞氓陇漏忙聲掳
+log.autoDelete.rate=7
+# 忙聴楼氓驴聴氓聢聽茅聶陇忙聴露茅聴麓
+log.autoDelete.time=0\:\:0\:\:0
+
+########################################### 氓鹿鲁氓聫掳UIF 茅聹聙猫娄聛莽職聞茅聟聧莽陆庐  BEGIN ###########################################
+#忙聲掳忙聧庐忙聺聝茅聶聬忙聵炉氓聬娄莽聰聼忙聲聢 on:氓录聙氓聬炉 off茂录職氓聟鲁茅聴颅
+right.switch=off
+#氓聤聼猫聝陆忙篓隆氓聺聴忙聨聢忙聺聝茅陋聦猫炉聛忙聵炉氓聬娄猫庐掳 on茂录職氓录聙氓聬炉  off茂录職氓聟鲁茅聴颅
+function.right.swith=on
+#UI忙聨聢忙聺聝忙聵炉氓聬娄莽聰聼忙聲聢 on:氓录聙忙聢路 off茂录職氓聟鲁茅聴颅
+ui.right.swith=false
+# tablePanel 茅禄聵猫庐陇忙聰炉忙聦聛莽職聞pageSize氓聢聴猫隆篓
+tablePanel.pageSizeList=100,200,300,500,800,1000
+#氓聫聜莽聟搂忙聨搂盲禄露茂录聦氓聹篓茅聸聠忙聢聬忙聴露茂录聦氓聫炉猫聡陋氓庐職盲鹿聣氓聫聜莽聟搂忙聳鹿氓录聫茂录聦氓聙录盲赂潞莽卤禄
+engin.refObjectChoose = 
+# 莽鲁禄莽禄聼盲驴隆忙聛炉忙聫聬莽陇潞忙隆聠忙聵戮莽陇潞忙聳鹿氓录聫 popup:氓录鹿氓聡潞忙隆聠 ;lowerRight:氓聫鲁盲赂聥猫搂聮茫聙聜 茅禄聵猫庐陇盲赂潞氓聫鲁盲赂聥猫搂聮
+PromptMessage.DisplayModes=popup
+# 氓娄聜忙聻聹氓聹篓氓聫鲁盲赂聥猫搂聮忙聵戮莽陇潞莽鲁禄莽禄聼忙露聢忙聛炉忙聴露茂录聦猫庐戮莽陆庐忙露聢忙聛炉莽陋聴氓聫拢莽職聞忙聵戮莽陇潞忙聴露茅聴麓茂录聦忙炉芦莽搂聮茫聙聜茅禄聵猫庐陇盲赂潞3000忙炉芦莽搂聮
+PromptMessage.DisplayTime=3000
+#氓聢聠莽卤禄忙聽聭氓炉录猫聢陋忙聴露茂录聦忙聰炉忙聦聛莽職聞盲潞聥盲禄露氓聬聧莽搂掳
+uidesign.eventKey=SelectionEvent,DBClickEvent,ClickEvent
+# 茅娄聳茅隆碌猫聡陋氓庐職盲鹿聣莽卤禄茂录聦氓聫炉盲禄楼忙聹聣氓陇職莽禄聞茂录聦忙炉聫莽禄聞盲鹿聥茅聴麓莽聰篓氓聢聠氓聫路;氓聢聠茅職聰茂录聦猫聡陋氓庐職盲鹿聣莽卤禄盲赂聨忙聽聡茅垄聵盲鹿聥茅聴麓莽聰篓茅聙聴氓聫路,氓聢聠茅職聰
+# 忙聽录氓录聫茂录職猫聡陋氓庐職盲鹿聣莽卤禄氓庐聦忙聲麓猫路炉氓戮聞1,忙聽聡茅垄聵1茂录聢UNOCIDE忙聽录氓录聫茂录聣,氓聸戮忙聽聡忙聳聡盲禄露氓庐聦忙聲麓猫路炉氓戮聞.;猫聡陋氓庐職盲鹿聣莽卤禄氓庐聦忙聲麓猫路炉氓戮聞2,忙聽聡茅垄聵2茂录聢UNOCIDE忙聽录氓录聫茂录聣,氓聸戮忙聽聡忙聳聡盲禄露氓庐聦忙聲麓猫路炉氓戮聞;
+# 莽陇潞盲戮聥茂录職plm617.engine.HomePageForTaskMessagePanel,\u6211\u7684\u6d88\u606f\u0096\u0087,
+#HomePageClasses=plm.uif.engine.client.UILayoutPanel?type=workitem&context=workItemHomePage,\u6211\u7684\u6d88\u606f\u0096\u0087,/com/vci/base/ui/image/email.png
+########################################### 氓鹿鲁氓聫掳UIF 茅聹聙猫娄聛莽職聞茅聟聧莽陆庐  END ###########################################
+
+
+###########################################  莽录聳莽聽聛氓聤聽茅聙聼莽職聞盲赂聯莽聰篓茅聟聧莽陆庐 BEGIN ###########################################
+Code.Accelerator.Rule.Keys=name;changeorder;btmName
+Code.Accelerator.Section.Keys=id;name;btmName
+Code.Accelerator.AttrMap=id=\u540d\u79f0;name=\u63cf\u8ff0;btmName=莽卤禄氓聻聥氓聬聧莽搂掳
+###########################################  莽录聳莽聽聛氓聤聽茅聙聼莽職聞盲赂聯莽聰篓茅聟聧莽陆庐 END ###########################################
+
+
+########################################### 氓路楼盲陆聹忙碌聛&忙碌聛莽篓聥氓录聲忙聯聨莽聸赂氓聟鲁茅聟聧莽陆庐  BEGIN ###########################################
+#氓路楼盲陆聹忙碌聛忙聫聮盲禄露茂录聦氓聟鲁猫聛聰氓鹿鲁氓聫掳workitem氓炉鹿猫卤隆莽職聞忙聯聧盲陆聹
+workflow.plmworkitem = com.vci.platform.workflow.plugins.PLMWorkItem
+workflow.AssignTask = com.vci.rmip.workflow.server.event.AssignTask
+#氓路楼盲陆聹忙碌聛猫庐戮莽陆庐盲禄禄氓聤隆氓聙聶茅聙聣盲潞潞
+jbpm4.engin.checkTaskUser = com.vci.rmip.workflow.server.ExImp.ExAssginImp
+#忙颅陇莽卤禄莽聰篓盲潞聨猫搂拢忙聻聬猫搂聮猫聣虏氓聮聦茅聝篓茅聴篓盲赂聥莽職聞莽聰篓忙聢路
+workflow.userService = com.vci.rmip.workflow.server.customInterfaceImpl.WorkFlowUserParserImpl
+#氓路楼盲陆聹忙碌聛忙聫聮盲禄露茂录聦氓聟鲁猫聛聰氓鹿鲁氓聫掳workitem氓炉鹿猫卤隆莽職聞忙聯聧盲陆聹
+workflow.plmworkitem = com.vci.platform.workflow.plugins.PLMWorkItem
+#忙聵炉氓聬娄氓聟路忙聹聣workflowinstance氓炉鹿猫卤隆 Y盲禄拢猫隆篓氓颅聵氓聹篓茂录聦N盲禄拢猫隆篓盲赂聧氓颅聵氓聹篓
+workflow.plmworkflowInstance.isExist=Y
+# 忙碌聛莽篓聥忙篓隆忙聺驴盲赂颅莽職聞盲禄禄氓聤隆猫聤聜莽聜鹿忙聰炉忙聦聛猫聡陋氓庐職盲鹿聣盲赂職氓聤隆氓聤聼猫聝陆忙聦聣茅聮庐莽職聞茅聟聧莽陆庐茅聙聣茅隆鹿
+workflow.business.function.class=plm.portal.NewNewUI.buttonmng.TaskBusinessFunctionButtonDialog
+
+#忙聵炉氓聬娄忙聵戮莽陇潞氓聢聠忙聺隆氓聫聭猫碌路忙碌聛莽篓聥忙聦聣茅聮庐茂录聦true:忙聵戮莽陇潞茂录聦false:盲赂聧忙聵戮莽陇潞
+workflow.workitem.launchFlag=false
+#忙聽鹿忙聧庐盲赂聥茅聺垄莽職聞氓卤聻忙聙搂氓聙录氓聢陇忙聳颅忙聵炉氓聬娄忙聵戮莽陇潞盲驴聺氓颅聵忙碌聛莽篓聥忙篓隆忙聺驴茅聙聣忙聥漏忙隆聠茂录聦true猫隆篓莽陇潞忙聵戮莽陇潞
+workflow.workitem.saveTempFlag=false
+#氓聫聭猫碌路忙碌聛莽篓聥忙碌聛莽篓聥盲禄禄氓聤隆氓聬聧莽搂掳忙聵炉氓聬娄氓驴聟氓隆芦氓聫聤氓聭陆氓聬聧氓陇聞莽聬聠猫搂聞氓聢聶
+workflow.workitem.workflowName=true
+#氓娄聜忙聻聹盲赂聧忙聵戮莽陇潞氓聢聠忙聺隆氓聫聭猫碌路忙聴露茂录聦忙聵炉氓聬娄氓掳聠茅聙聣氓庐職忙聲掳忙聧庐盲陆聹盲赂潞盲赂聙盲赂陋忙碌聛莽篓聥猫驴聸猫隆聦氓庐隆忙聣鹿		忙颅陇茅聟聧莽陆庐盲录聵氓聟聢莽潞搂氓聹篓忙聵戮莽陇潞氓聢聠忙聺隆氓聫聭猫碌路茅聙聣忙聥漏忙隆聠氓鹿露茅聙聣盲赂颅氓聢聠忙聺隆氓聫聭猫碌路忙碌聛莽篓聥盲鹿聥氓聬聨茂录聢氓聧鲁氓娄聜忙聻聹茅聙聣忙聥漏氓聢聠忙聺隆氓聫聭猫碌路茂录聦忙颅陇茅聟聧莽陆庐盲赂聧猫碌路盲陆聹莽聰篓茂录聣
+#茂录聢true茂录職氓掳聠茅聙聣氓庐職莽職聞忙聲掳忙聧庐氓聹篓盲赂聙盲赂陋忙碌聛莽篓聥盲赂颅猫驴聸猫隆聦氓庐隆忙聣鹿茂录聦false茂录職盲赂潞忙炉聫忙聺隆忙聲掳忙聧庐氓聬炉氓聤篓盲赂聙盲赂陋氓庐隆忙聣鹿忙碌聛莽篓聥茂录聣
+workflow.workitem.launchOneWorkflowFlag=true
+#忙聵炉氓聬娄猫聝陆忙聣鹿茅聡聫忙聣搂猫隆聦氓戮聟氓聤聻盲禄禄氓聤隆茂录聦茅聙聣盲赂颅氓陇職忙聺隆茅聙職莽聰篓氓戮聟氓聤聻盲禄禄氓聤隆忙聲掳忙聧庐茂录聦氓聢陇忙聳颅猫驴聶盲潞聸忙聲掳忙聧庐氓聹篓氓聬聦盲赂聙盲禄禄氓聤隆猫聤聜莽聜鹿茂录聦氓鹿露氓卤聻盲潞聨氓聬聦盲赂聙忙碌聛莽篓聥茂录聦氓掳卤氓聫炉盲禄楼忙聣鹿茅聡聫忙聣搂猫隆聦盲赂聥氓聨禄
+workflow.workitem.batchExeworkflowFlag=true
+
+##忙聽鹿忙聧庐盲赂聥茅聺垄莽職聞氓卤聻忙聙搂氓聙录氓聢陇忙聳颅忙聵炉氓聬娄盲赂聥盲赂聙忙颅楼猫麓拢盲禄禄盲潞潞忙聽聡猫炉聠茂录聢氓聫陋氓聢陇忙聳颅忙聵炉true茂录聦盲禄禄盲陆聲氓颅聴莽卢娄忙聢聳忙虏隆忙聹聣忙颅陇茅聟聧莽陆庐茂录聦氓聧鲁忙聦聣false氓陇聞莽聬聠茂录聣 
+## 氓娄聜忙聻聹忙颅陇氓聙录盲赂潞茂录職true茂录職忙聣搂猫隆聦忙碌聛莽篓聥盲禄禄氓聤隆忙聴露茂录聦盲赂聧莽庐隆氓聫聭猫碌路忙聴露忙聵炉氓聬娄氓炉鹿忙炉聫盲赂陋猫聤聜莽聜鹿茅聝陆猫庐戮莽陆庐盲潞聠猫麓拢盲禄禄盲潞潞茂录聦氓陆聯氓聣聧忙聣搂猫隆聦莽陋聴氓聫拢氓搂聥莽禄聢茅聝陆忙聵戮莽陇潞氓聹篓茅聙聣忙聥漏盲赂聥盲赂聙猫聤聜莽聜鹿猫麓拢盲禄禄盲潞潞茂录聢盲禄聟忙聵炉猫路炉莽聰卤茅聙聣忙聥漏氓聬聦忙聞聫茂录聣
+##		氓聬娄氓聢聶茂录職false茂录職忙聣搂猫隆聦忙碌聛莽篓聥盲禄禄氓聤隆忙聴露茂录聦氓娄聜忙聻聹盲赂聥盲赂聙猫聤聜莽聜鹿莽職聞猫麓拢盲禄禄盲潞潞氓聹篓氓聫聭猫碌路忙聴露氓路虏莽禄聫忙聦聡氓庐職茂录聦氓聢聶盲赂聧忙聵戮莽陇潞盲赂聥盲赂聙猫聤聜莽聜鹿猫麓拢盲禄禄盲潞潞茂录聦氓聬娄氓聢聶忙聵戮莽陇潞盲赂聥盲赂聙忙颅楼猫麓拢盲禄禄盲潞潞茂录聦盲赂聰忙聹聣氓聤聽莽潞垄猫聣虏*忙聽聡猫炉聠茂录聦忙颅陇忙聴露盲赂潞氓驴聟茅隆禄氓隆芦氓聠聶茂录聢茅聙聣忙聥漏茂录聣
+workflow.workitem.showNextUserFlag=false
+########################################### 氓路楼盲陆聹忙碌聛&忙碌聛莽篓聥氓录聲忙聯聨莽聸赂氓聟鲁茅聟聧莽陆庐  END ########################################### 
+
+
+########################################### CS莽鲁禄莽禄聼盲赂禄忙聻聞忙聻露忙聰炉忙聦聛莽職聞忙聣漏氓卤聲忙聹聧氓聤隆 BEGIN ########################################### 
+# 莽聶禄氓陆聲忙聢聬氓聤聼氓聬聨盲陆驴莽聰篓氓聫聧氓掳聞忙聹潞氓聢露茂录聦猫聡陋氓聤篓忙聣搂猫隆聦猫炉楼莽卤禄盲赂颅莽職聞氓聟卢氓聟卤忙聨楼氓聫拢 showMessage() 茂录聢忙聴聽氓聫聜忙聲掳盲录聽茅聙聮茂录聣
+# 盲禄楼忙聰炉忙聦聛莽聶禄氓陆聲忙聢聬氓聤聼氓聬聨莽芦聥氓聧鲁忙聣搂猫隆聦莽聸赂氓聟鲁猫聡陋氓庐職盲鹿聣忙聣漏氓卤聲茅聙禄猫戮聭# 
+#e.g:extendservice.0=xxx.xx.xx
+extendservicecount=0
+#extendservice.0=
+#extendservice.1=
+#extendservice.1=
+########################################### CS莽鲁禄莽禄聼盲赂禄忙聻聞忙聻露忙聰炉忙聦聛莽職聞忙聣漏氓卤聲忙聹聧氓聤隆 END ###########################################
+
+
+########################################### UI&氓聟聝忙聲掳忙聧庐茂录聢忙篓隆氓聻聥茂录聣莽录聯氓颅聵莽聸赂氓聟鲁莽職聞茅聟聧莽陆庐 BEGIN ###########################################
+#氓聬炉莽聰篓UI莽录聯氓颅聵氓聫聤莽录聯氓颅聵氓庐職忙聴露氓聢路忙聳掳忙聹聧氓聤隆
+UI.cache.enable=true
+#忙聵炉氓聬娄忙炉聫忙卢隆猫庐驴茅聴庐茅聝陆氓聢路忙聳掳忙聲掳忙聧庐氓潞聯茂录聦true盲禄拢莽聽聛氓聢路忙聳掳茂录聦氓聬娄氓聢聶盲赂聧氓聢路忙聳掳
+UI.cache.refreshEveryTime=true
+#氓庐職忙聴露氓聶篓茂录聦氓聹篓忙聹聧氓聤隆氓聬炉氓聤篓忙聴露氓录聙氓聬炉
+time_schedule_count=2
+#氓聤聽猫陆陆忙聲掳忙聧庐忙篓隆氓聻聥氓聢掳莽录聯氓颅聵
+time_schedule_0=com.vci.cache.server.util.DataModelCacheTimer
+#氓聤聽猫陆陆UI茅聟聧莽陆庐氓聢掳莽录聯氓颅聵
+time_schedule_1=plm.portal.tools.UICacheTimer
+########################################### UI&氓聟聝忙聲掳忙聧庐茂录聢忙篓隆氓聻聥茂录聣莽录聯氓颅聵莽聸赂氓聟鲁莽職聞茅聟聧莽陆庐 END ###########################################
diff --git a/Source/platformProject/vci-platform-web/src/main/resources/properties/iceClient.properties b/Source/platformProject/vci-platform-web/src/main/resources/properties/iceClient.properties
new file mode 100644
index 0000000..c175daa
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/resources/properties/iceClient.properties
@@ -0,0 +1 @@
+Endpoints=default -h localhost -p 4601
\ No newline at end of file
diff --git a/Source/platformProject/vci-platform-web/src/main/resources/wordTemplate/dataBaseExport.doc b/Source/platformProject/vci-platform-web/src/main/resources/wordTemplate/dataBaseExport.doc
new file mode 100644
index 0000000..5a188d8
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/resources/wordTemplate/dataBaseExport.doc
Binary files differ

--
Gitblit v1.9.3